summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--COPYING188
-rw-r--r--CREDITS25
-rw-r--r--HISTORY1036
-rw-r--r--INSTALL37
-rw-r--r--README54
-rw-r--r--RELEASE-NOTES1873
-rw-r--r--UPGRADE143
-rw-r--r--api.php21
-rw-r--r--config/Installer.php2353
-rw-r--r--config/OBSOLETE2
-rw-r--r--config/index.php44
-rw-r--r--config/index.php55
-rw-r--r--docs/code-coverage/README2
-rw-r--r--docs/database.txt26
-rw-r--r--docs/databases/ibm_db2.txt (renamed from maintenance/ibm_db2/README)0
-rw-r--r--docs/databases/postgres.txt100
-rw-r--r--docs/databases/sqlite.txt (renamed from maintenance/sqlite/README)0
-rw-r--r--docs/distributors.txt43
-rw-r--r--docs/export-0.5.xsd213
-rw-r--r--docs/hooks.txt192
-rw-r--r--docs/maintenance.txt2
-rw-r--r--docs/memcached.txt16
-rw-r--r--docs/scripts.txt5
-rw-r--r--docs/skin.txt13
-rw-r--r--extensions/README13
-rw-r--r--img_auth.php28
-rw-r--r--includes/AjaxDispatcher.php60
-rw-r--r--includes/AjaxFunctions.php85
-rw-r--r--includes/AjaxResponse.php19
-rw-r--r--includes/Article.php1138
-rw-r--r--includes/AuthPlugin.php60
-rw-r--r--includes/AutoLoader.php283
-rw-r--r--includes/Autopromote.php69
-rw-r--r--includes/BacklinkCache.php24
-rw-r--r--includes/BagOStuff.php239
-rw-r--r--includes/Block.php66
-rw-r--r--includes/CacheDependency.php17
-rw-r--r--includes/Category.php38
-rw-r--r--includes/CategoryPage.php358
-rw-r--r--includes/Categoryfinder.php50
-rw-r--r--includes/Cdb.php9
-rw-r--r--includes/Cdb_PHP.php9
-rw-r--r--includes/ChangeTags.php14
-rw-r--r--includes/ChangesFeed.php19
-rw-r--r--includes/ChangesList.php114
-rw-r--r--includes/Collation.php307
-rw-r--r--includes/ConfEditor.php26
-rw-r--r--includes/Credits.php134
-rw-r--r--includes/DatabaseFunctions.php412
-rw-r--r--includes/DefaultSettings.php5328
-rw-r--r--includes/Defines.php135
-rw-r--r--includes/DjVuImage.php37
-rw-r--r--includes/EditPage.php468
-rw-r--r--includes/Exception.php109
-rw-r--r--includes/Exif.php16
-rw-r--r--includes/Export.php108
-rw-r--r--includes/ExternalEdit.php9
-rw-r--r--includes/ExternalStore.php13
-rw-r--r--includes/ExternalStoreDB.php35
-rw-r--r--includes/ExternalUser.php37
-rw-r--r--includes/Feed.php52
-rw-r--r--includes/FeedUtils.php16
-rw-r--r--includes/FileDeleteForm.php38
-rw-r--r--includes/FileRevertForm.php4
-rw-r--r--includes/ForkController.php2
-rw-r--r--includes/FormOptions.php40
-rw-r--r--includes/GlobalFunctions.php1271
-rw-r--r--includes/HTMLCacheUpdate.php1
-rw-r--r--includes/HTMLFileCache.php41
-rw-r--r--includes/HTMLForm.php745
-rw-r--r--includes/HistoryBlob.php41
-rw-r--r--includes/HistoryPage.php238
-rw-r--r--includes/Hooks.php60
-rw-r--r--includes/Html.php188
-rw-r--r--includes/HttpFunctions.old.php12
-rw-r--r--includes/HttpFunctions.php519
-rw-r--r--includes/IP.php676
-rw-r--r--includes/ImageFunctions.php105
-rw-r--r--includes/ImageGallery.php115
-rw-r--r--includes/ImagePage.php435
-rw-r--r--includes/Import.php1431
-rw-r--r--includes/Interwiki.php48
-rw-r--r--includes/JSMin.php290
-rw-r--r--includes/Licenses.php14
-rw-r--r--includes/LinkBatch.php87
-rw-r--r--includes/LinkCache.php46
-rw-r--r--includes/Linker.php797
-rw-r--r--includes/LinksUpdate.php164
-rw-r--r--includes/LocalisationCache.php33
-rw-r--r--includes/LogEventsList.php343
-rw-r--r--includes/LogPage.php251
-rw-r--r--includes/MacBinary.php25
-rw-r--r--includes/MagicWord.php37
-rw-r--r--includes/Math.php27
-rw-r--r--includes/MemcachedSessions.php43
-rw-r--r--includes/Message.php360
-rw-r--r--includes/MessageBlobStore.php370
-rw-r--r--includes/MessageCache.php219
-rw-r--r--includes/Metadata.php30
-rw-r--r--includes/MimeMagic.php238
-rw-r--r--includes/Namespace.php56
-rw-r--r--includes/NamespaceCompat.php9
-rw-r--r--includes/ObjectCache.php4
-rw-r--r--includes/OutputHandler.php5
-rw-r--r--includes/OutputPage.php883
-rw-r--r--includes/PageQueryPage.php7
-rw-r--r--includes/Pager.php150
-rw-r--r--includes/PoolCounter.php203
-rw-r--r--includes/Preferences.php1430
-rw-r--r--includes/PrefixSearch.php27
-rw-r--r--includes/Profiler.php43
-rw-r--r--includes/ProfilerSimple.php6
-rw-r--r--includes/ProfilerSimpleText.php24
-rw-r--r--includes/ProfilerSimpleTrace.php30
-rw-r--r--includes/ProfilerStub.php10
-rw-r--r--includes/ProtectionForm.php65
-rw-r--r--includes/ProxyTools.php16
-rw-r--r--includes/QueryPage.php43
-rw-r--r--includes/RawPage.php96
-rw-r--r--includes/RecentChange.php25
-rw-r--r--includes/Revision.php12
-rw-r--r--includes/Sanitizer.php96
-rw-r--r--includes/SeleniumWebSettings.php72
-rw-r--r--includes/Setup.php83
-rw-r--r--includes/SiteConfiguration.php10
-rw-r--r--includes/SiteStats.php116
-rw-r--r--includes/Skin.php878
-rw-r--r--includes/SkinTemplate.php223
-rw-r--r--includes/SpecialPage.php237
-rw-r--r--includes/SquidPurgeClient.php6
-rw-r--r--includes/SquidUpdate.php7
-rw-r--r--includes/Status.php154
-rw-r--r--includes/StreamFile.php14
-rw-r--r--includes/StringUtils.php29
-rw-r--r--includes/StubObject.php65
-rw-r--r--includes/Title.php1904
-rw-r--r--includes/User.php532
-rw-r--r--includes/UserMailer.php249
-rw-r--r--includes/UserRightsProxy.php56
-rw-r--r--includes/WatchedItem.php7
-rw-r--r--includes/WatchlistEditor.php63
-rw-r--r--includes/WebRequest.php525
-rw-r--r--includes/WebResponse.php6
-rw-r--r--includes/WebStart.php64
-rw-r--r--includes/Wiki.php157
-rw-r--r--includes/WikiError.php16
-rw-r--r--includes/WikiMap.php11
-rw-r--r--includes/Xml.php181
-rw-r--r--includes/XmlFunctions.php86
-rw-r--r--includes/ZhClient.php20
-rw-r--r--includes/ZhConversion.php1311
-rw-r--r--includes/api/ApiBase.php275
-rw-r--r--includes/api/ApiBlock.php38
-rw-r--r--includes/api/ApiDelete.php81
-rw-r--r--includes/api/ApiDisabled.php14
-rw-r--r--includes/api/ApiEditPage.php293
-rw-r--r--includes/api/ApiEmailUser.php111
-rw-r--r--includes/api/ApiExpandTemplates.php39
-rw-r--r--includes/api/ApiFeedWatchlist.php104
-rw-r--r--includes/api/ApiFormatBase.php85
-rw-r--r--includes/api/ApiFormatDbg.php22
-rw-r--r--includes/api/ApiFormatDump.php64
-rw-r--r--includes/api/ApiFormatJson.php44
-rw-r--r--includes/api/ApiFormatPhp.php22
-rw-r--r--includes/api/ApiFormatRaw.php39
-rw-r--r--includes/api/ApiFormatTxt.php22
-rw-r--r--includes/api/ApiFormatWddx.php47
-rw-r--r--includes/api/ApiFormatXml.php115
-rw-r--r--includes/api/ApiFormatYaml.php24
-rw-r--r--includes/api/ApiHelp.php115
-rw-r--r--includes/api/ApiImport.php115
-rw-r--r--includes/api/ApiLogin.php24
-rw-r--r--includes/api/ApiLogout.php29
-rw-r--r--includes/api/ApiMain.php422
-rw-r--r--includes/api/ApiMove.php158
-rw-r--r--includes/api/ApiOpenSearch.php74
-rw-r--r--includes/api/ApiPageSet.php239
-rw-r--r--includes/api/ApiParamInfo.php148
-rw-r--r--includes/api/ApiParse.php445
-rw-r--r--includes/api/ApiPatrol.php58
-rw-r--r--includes/api/ApiProtect.php141
-rw-r--r--includes/api/ApiPurge.php57
-rw-r--r--includes/api/ApiQuery.php329
-rw-r--r--includes/api/ApiQueryAllCategories.php91
-rw-r--r--includes/api/ApiQueryAllLinks.php148
-rw-r--r--includes/api/ApiQueryAllUsers.php141
-rw-r--r--includes/api/ApiQueryAllimages.php107
-rw-r--r--includes/api/ApiQueryAllmessages.php81
-rw-r--r--includes/api/ApiQueryAllpages.php158
-rw-r--r--includes/api/ApiQueryBacklinks.php268
-rw-r--r--includes/api/ApiQueryBase.php185
-rw-r--r--includes/api/ApiQueryBlocks.php221
-rw-r--r--includes/api/ApiQueryCategories.php139
-rw-r--r--includes/api/ApiQueryCategoryInfo.php42
-rw-r--r--includes/api/ApiQueryCategoryMembers.php312
-rw-r--r--includes/api/ApiQueryDeletedrevs.php210
-rw-r--r--includes/api/ApiQueryDisabled.php27
-rw-r--r--includes/api/ApiQueryDuplicateFiles.php83
-rw-r--r--includes/api/ApiQueryExtLinksUsage.php117
-rw-r--r--includes/api/ApiQueryExternalLinks.php65
-rw-r--r--includes/api/ApiQueryFilearchive.php264
-rw-r--r--includes/api/ApiQueryIWBacklinks.php217
-rw-r--r--includes/api/ApiQueryIWLinks.php158
-rw-r--r--includes/api/ApiQueryImageInfo.php379
-rw-r--r--includes/api/ApiQueryImages.php92
-rw-r--r--includes/api/ApiQueryInfo.php355
-rw-r--r--includes/api/ApiQueryLangLinks.php89
-rw-r--r--includes/api/ApiQueryLinks.php159
-rw-r--r--includes/api/ApiQueryLogEvents.php221
-rw-r--r--includes/api/ApiQueryPageProps.php150
-rw-r--r--includes/api/ApiQueryProtectedTitles.php123
-rw-r--r--includes/api/ApiQueryRandom.php77
-rw-r--r--includes/api/ApiQueryRecentChanges.php382
-rw-r--r--includes/api/ApiQueryRevisions.php376
-rw-r--r--includes/api/ApiQuerySearch.php166
-rw-r--r--includes/api/ApiQuerySiteinfo.php191
-rw-r--r--includes/api/ApiQueryStashImageInfo.php152
-rw-r--r--includes/api/ApiQueryTags.php141
-rw-r--r--includes/api/ApiQueryUserContributions.php260
-rw-r--r--includes/api/ApiQueryUserInfo.php113
-rw-r--r--includes/api/ApiQueryUsers.php190
-rw-r--r--includes/api/ApiQueryWatchlist.php269
-rw-r--r--includes/api/ApiQueryWatchlistRaw.php135
-rw-r--r--includes/api/ApiResult.php171
-rw-r--r--includes/api/ApiRollback.php146
-rw-r--r--includes/api/ApiRsd.php180
-rw-r--r--includes/api/ApiUnblock.php67
-rw-r--r--includes/api/ApiUndelete.php86
-rw-r--r--includes/api/ApiUpload.php455
-rw-r--r--includes/api/ApiUserrights.php92
-rw-r--r--includes/api/ApiWatch.php55
-rw-r--r--includes/db/Database.php1654
-rw-r--r--includes/db/DatabaseIbm_db2.php1341
-rw-r--r--includes/db/DatabaseMssql.php1684
-rw-r--r--includes/db/DatabaseMysql.php240
-rw-r--r--includes/db/DatabaseOracle.php664
-rw-r--r--includes/db/DatabasePostgres.php922
-rw-r--r--includes/db/DatabaseSqlite.php247
-rw-r--r--includes/db/LBFactory.php76
-rw-r--r--includes/db/LBFactory_Multi.php6
-rw-r--r--includes/db/LBFactory_Single.php57
-rw-r--r--includes/db/LoadBalancer.php123
-rw-r--r--includes/db/LoadMonitor.php22
-rw-r--r--includes/diff/DifferenceEngine.php2002
-rw-r--r--includes/diff/DifferenceInterface.php1024
-rw-r--r--includes/diff/WikiDiff.php1241
-rw-r--r--includes/diff/WikiDiff3.php (renamed from includes/diff/Diff.php)322
-rw-r--r--includes/extauth/Hardcoded.php39
-rw-r--r--includes/extauth/MediaWiki.php56
-rw-r--r--includes/extauth/vB.php47
-rw-r--r--includes/filerepo/ArchivedFile.php18
-rw-r--r--includes/filerepo/FSRepo.php30
-rw-r--r--includes/filerepo/File.php128
-rw-r--r--includes/filerepo/FileRepo.php173
-rw-r--r--includes/filerepo/FileRepoStatus.php6
-rw-r--r--includes/filerepo/ForeignAPIFile.php83
-rw-r--r--includes/filerepo/ForeignAPIRepo.php258
-rw-r--r--includes/filerepo/ForeignDBFile.php8
-rw-r--r--includes/filerepo/ForeignDBRepo.php23
-rw-r--r--includes/filerepo/ForeignDBViaLBRepo.php7
-rw-r--r--includes/filerepo/Image.php16
-rw-r--r--includes/filerepo/LocalFile.php409
-rw-r--r--includes/filerepo/LocalRepo.php20
-rw-r--r--includes/filerepo/NullRepo.php6
-rw-r--r--includes/filerepo/OldLocalFile.php29
-rw-r--r--includes/filerepo/RepoGroup.php31
-rw-r--r--includes/filerepo/UnregisteredLocalFile.php8
-rw-r--r--includes/installer/CliInstaller.php171
-rw-r--r--includes/installer/DatabaseInstaller.php580
-rw-r--r--includes/installer/DatabaseUpdater.php574
-rw-r--r--includes/installer/Installer.i18n.php12267
-rw-r--r--includes/installer/Installer.php1511
-rw-r--r--includes/installer/LocalSettingsGenerator.php349
-rw-r--r--includes/installer/MysqlInstaller.php589
-rw-r--r--includes/installer/MysqlUpdater.php832
-rw-r--r--includes/installer/OracleInstaller.php279
-rw-r--r--includes/installer/OracleUpdater.php114
-rw-r--r--includes/installer/PhpBugTests.php72
-rw-r--r--includes/installer/PostgresInstaller.php601
-rw-r--r--includes/installer/PostgresUpdater.php628
-rw-r--r--includes/installer/SqliteInstaller.php190
-rw-r--r--includes/installer/SqliteUpdater.php84
-rw-r--r--includes/installer/WebInstaller.php1034
-rw-r--r--includes/installer/WebInstallerOutput.php269
-rw-r--r--includes/installer/WebInstallerPage.php1238
-rw-r--r--includes/job/DoubleRedirectJob.php (renamed from includes/DoubleRedirectJob.php)6
-rw-r--r--includes/job/EmaillingJob.php (renamed from includes/EmaillingJob.php)9
-rw-r--r--includes/job/EnotifNotifyJob.php (renamed from includes/EnotifNotifyJob.php)6
-rw-r--r--includes/job/JobQueue.php (renamed from includes/JobQueue.php)52
-rw-r--r--includes/job/RefreshLinksJob.php (renamed from includes/RefreshLinksJob.php)8
-rw-r--r--includes/job/UploadFromUrlJob.php153
-rw-r--r--includes/json/FormatJson.php54
-rw-r--r--includes/json/Services_JSON.php48
-rw-r--r--includes/libs/CSSJanus.php323
-rw-r--r--includes/libs/CSSMin.php214
-rw-r--r--includes/libs/IEContentAnalyzer.php (renamed from includes/IEContentAnalyzer.php)16
-rw-r--r--includes/libs/IEUrlExtension.php247
-rw-r--r--includes/libs/JavaScriptMinifier.php579
-rw-r--r--includes/libs/README4
-rw-r--r--includes/libs/spyc.php (renamed from includes/api/ApiFormatYaml_spyc.php)64
-rw-r--r--includes/media/BMP.php4
-rw-r--r--includes/media/Bitmap.php533
-rw-r--r--includes/media/Bitmap_ClientOnly.php14
-rw-r--r--includes/media/DjVu.php7
-rw-r--r--includes/media/GIF.php43
-rw-r--r--includes/media/GIFMetadataExtractor.php21
-rw-r--r--includes/media/Generic.php51
-rw-r--r--includes/media/MediaTransformOutput.php (renamed from includes/MediaTransformOutput.php)36
-rw-r--r--includes/media/PNG.php82
-rw-r--r--includes/media/PNGMetadataExtractor.php104
-rw-r--r--includes/media/SVG.php121
-rw-r--r--includes/media/SVGMetadataExtractor.php313
-rw-r--r--includes/media/Tiff.php6
-rw-r--r--includes/memcached-client.php277
-rw-r--r--includes/mime.info30
-rw-r--r--includes/mime.types46
-rw-r--r--includes/normal/CleanUpTest.php53
-rw-r--r--includes/normal/RandomTest.php38
-rw-r--r--includes/normal/Utf8Case.php11
-rw-r--r--includes/normal/Utf8CaseGenerate.php53
-rw-r--r--includes/normal/Utf8Test.php53
-rw-r--r--includes/normal/UtfNormal.php162
-rw-r--r--includes/normal/UtfNormalBench.php42
-rw-r--r--includes/normal/UtfNormalData.inc13
-rw-r--r--includes/normal/UtfNormalDataK.inc7
-rw-r--r--includes/normal/UtfNormalDefines.php6
-rw-r--r--includes/normal/UtfNormalGenerate.php60
-rw-r--r--includes/normal/UtfNormalTest.php54
-rw-r--r--includes/normal/UtfNormalTest2.php239
-rw-r--r--includes/normal/UtfNormalUtil.php39
-rw-r--r--includes/parser/CoreLinkFunctions.php5
-rw-r--r--includes/parser/CoreParserFunctions.php64
-rw-r--r--includes/parser/CoreTagHooks.php11
-rw-r--r--includes/parser/DateFormatter.php10
-rw-r--r--includes/parser/LinkHolderArray.php108
-rw-r--r--includes/parser/Parser.php2105
-rw-r--r--includes/parser/ParserCache.php172
-rw-r--r--includes/parser/ParserOptions.php185
-rw-r--r--includes/parser/ParserOutput.php178
-rw-r--r--includes/parser/Parser_DiffTest.php16
-rw-r--r--includes/parser/Parser_LinkHooks.php26
-rw-r--r--includes/parser/Preprocessor.php8
-rw-r--r--includes/parser/Preprocessor_DOM.php90
-rw-r--r--includes/parser/Preprocessor_Hash.php72
-rw-r--r--includes/parser/Tidy.php28
-rw-r--r--includes/proxy_check.php2
-rw-r--r--includes/resourceloader/ResourceLoader.php740
-rw-r--r--includes/resourceloader/ResourceLoaderContext.php176
-rw-r--r--includes/resourceloader/ResourceLoaderFileModule.php509
-rw-r--r--includes/resourceloader/ResourceLoaderModule.php239
-rw-r--r--includes/resourceloader/ResourceLoaderSiteModule.php63
-rw-r--r--includes/resourceloader/ResourceLoaderStartUpModule.php225
-rw-r--r--includes/resourceloader/ResourceLoaderUserModule.php50
-rw-r--r--includes/resourceloader/ResourceLoaderUserOptionsModule.php121
-rw-r--r--includes/resourceloader/ResourceLoaderWikiModule.php171
-rw-r--r--includes/revisiondelete/RevisionDelete.php690
-rw-r--r--includes/revisiondelete/RevisionDeleteAbstracts.php454
-rw-r--r--includes/revisiondelete/RevisionDeleter.php270
-rw-r--r--includes/search/SearchEngine.php761
-rw-r--r--includes/search/SearchIBM_DB2.php53
-rw-r--r--includes/search/SearchMssql.php254
-rw-r--r--includes/search/SearchMySQL.php52
-rw-r--r--includes/search/SearchMySQL4.php34
-rw-r--r--includes/search/SearchOracle.php62
-rw-r--r--includes/search/SearchPostgres.php64
-rw-r--r--includes/search/SearchSqlite.php82
-rw-r--r--includes/search/SearchUpdate.php31
-rw-r--r--includes/specials/SpecialActiveusers.php90
-rw-r--r--includes/specials/SpecialAllmessages.php84
-rw-r--r--includes/specials/SpecialAllpages.php66
-rw-r--r--includes/specials/SpecialAncientpages.php38
-rw-r--r--includes/specials/SpecialBlankpage.php22
-rw-r--r--includes/specials/SpecialBlockip.php195
-rw-r--r--includes/specials/SpecialBlockme.php66
-rw-r--r--includes/specials/SpecialBooksources.php31
-rw-r--r--includes/specials/SpecialBrokenRedirects.php22
-rw-r--r--includes/specials/SpecialCategories.php68
-rw-r--r--includes/specials/SpecialComparePages.php170
-rw-r--r--includes/specials/SpecialConfirmemail.php46
-rw-r--r--includes/specials/SpecialContributions.php231
-rw-r--r--includes/specials/SpecialDeadendpages.php19
-rw-r--r--includes/specials/SpecialDeletedContributions.php32
-rw-r--r--includes/specials/SpecialDisambiguations.php33
-rw-r--r--includes/specials/SpecialDoubleRedirects.php21
-rw-r--r--includes/specials/SpecialEmailuser.php514
-rw-r--r--includes/specials/SpecialExport.php267
-rw-r--r--includes/specials/SpecialFewestrevisions.php17
-rw-r--r--includes/specials/SpecialFileDuplicateSearch.php28
-rw-r--r--includes/specials/SpecialFilepath.php94
-rw-r--r--includes/specials/SpecialImport.php89
-rw-r--r--includes/specials/SpecialIpblocklist.php275
-rw-r--r--includes/specials/SpecialLinkSearch.php41
-rw-r--r--includes/specials/SpecialListfiles.php123
-rw-r--r--includes/specials/SpecialListgrouprights.php62
-rw-r--r--includes/specials/SpecialListredirects.php26
-rw-r--r--includes/specials/SpecialListusers.php69
-rw-r--r--includes/specials/SpecialLockdb.php140
-rw-r--r--includes/specials/SpecialLog.php185
-rw-r--r--includes/specials/SpecialLonelypages.php18
-rw-r--r--includes/specials/SpecialLongpages.php17
-rw-r--r--includes/specials/SpecialMIMEsearch.php24
-rw-r--r--includes/specials/SpecialMergeHistory.php90
-rw-r--r--includes/specials/SpecialMostcategories.php25
-rw-r--r--includes/specials/SpecialMostimages.php27
-rw-r--r--includes/specials/SpecialMostlinked.php31
-rw-r--r--includes/specials/SpecialMostlinkedcategories.php27
-rw-r--r--includes/specials/SpecialMostlinkedtemplates.php25
-rw-r--r--includes/specials/SpecialMostrevisions.php25
-rw-r--r--includes/specials/SpecialMovepage.php181
-rw-r--r--includes/specials/SpecialNewimages.php42
-rw-r--r--includes/specials/SpecialNewpages.php100
-rw-r--r--includes/specials/SpecialPopularpages.php20
-rw-r--r--includes/specials/SpecialPreferences.php37
-rw-r--r--includes/specials/SpecialPrefixindex.php54
-rw-r--r--includes/specials/SpecialProtectedpages.php94
-rw-r--r--includes/specials/SpecialProtectedtitles.php71
-rw-r--r--includes/specials/SpecialRandompage.php30
-rw-r--r--includes/specials/SpecialRandomredirect.php24
-rw-r--r--includes/specials/SpecialRecentchanges.php113
-rw-r--r--includes/specials/SpecialRecentchangeslinked.php43
-rw-r--r--includes/specials/SpecialRemoveRestrictions.php60
-rw-r--r--includes/specials/SpecialResetpass.php39
-rw-r--r--includes/specials/SpecialRevisiondelete.php1283
-rw-r--r--includes/specials/SpecialSearch.php185
-rw-r--r--includes/specials/SpecialShortpages.php28
-rw-r--r--includes/specials/SpecialSpecialpages.php166
-rw-r--r--includes/specials/SpecialStatistics.php92
-rw-r--r--includes/specials/SpecialTags.php38
-rw-r--r--includes/specials/SpecialUncategorizedcategories.php22
-rw-r--r--includes/specials/SpecialUncategorizedimages.php19
-rw-r--r--includes/specials/SpecialUncategorizedpages.php18
-rw-r--r--includes/specials/SpecialUncategorizedtemplates.php19
-rw-r--r--includes/specials/SpecialUndelete.php253
-rw-r--r--includes/specials/SpecialUnlockdb.php127
-rw-r--r--includes/specials/SpecialUnusedcategories.php17
-rw-r--r--includes/specials/SpecialUnusedimages.php37
-rw-r--r--includes/specials/SpecialUnusedtemplates.php26
-rw-r--r--includes/specials/SpecialUnwatchedpages.php24
-rw-r--r--includes/specials/SpecialUpload.php422
-rw-r--r--includes/specials/SpecialUploadStash.php394
-rw-r--r--includes/specials/SpecialUserlogin.php256
-rw-r--r--includes/specials/SpecialUserlogout.php72
-rw-r--r--includes/specials/SpecialUserrights.php107
-rw-r--r--includes/specials/SpecialVersion.php353
-rw-r--r--includes/specials/SpecialWantedcategories.php23
-rw-r--r--includes/specials/SpecialWantedfiles.php44
-rw-r--r--includes/specials/SpecialWantedpages.php22
-rw-r--r--includes/specials/SpecialWantedtemplates.php30
-rw-r--r--includes/specials/SpecialWatchlist.php108
-rw-r--r--includes/specials/SpecialWhatlinkshere.php48
-rw-r--r--includes/specials/SpecialWithoutinterwiki.php23
-rw-r--r--includes/templates/NoLocalSettings.php48
-rw-r--r--includes/templates/PHP4.php6
-rw-r--r--includes/templates/Userlogin.php81
-rw-r--r--includes/upload/UploadBase.php372
-rw-r--r--includes/upload/UploadFromFile.php61
-rw-r--r--includes/upload/UploadFromStash.php17
-rw-r--r--includes/upload/UploadFromUrl.php221
-rw-r--r--includes/upload/UploadStash.php397
-rw-r--r--includes/zhtable/Makefile.py596
-rw-r--r--includes/zhtable/simp2trad.manual7
-rw-r--r--includes/zhtable/simpphrases.manual11
-rw-r--r--includes/zhtable/simpphrases_exclude.manual3
-rw-r--r--includes/zhtable/toCN.manual3
-rw-r--r--includes/zhtable/toHK.manual1
-rw-r--r--includes/zhtable/toSimp.manual20
-rw-r--r--includes/zhtable/toTW.manual4
-rw-r--r--includes/zhtable/toTrad.manual42
-rw-r--r--includes/zhtable/trad2simp.manual3
-rw-r--r--includes/zhtable/tradphrases.manual376
-rw-r--r--includes/zhtable/tradphrases_exclude.manual9
-rw-r--r--index.php12
-rw-r--r--languages/Language.php1031
-rw-r--r--languages/LanguageConverter.php540
-rw-r--r--languages/Names.php83
-rw-r--r--languages/classes/LanguageAm.php5
-rw-r--r--languages/classes/LanguageAr.php14
-rw-r--r--languages/classes/LanguageBat_smg.php8
-rw-r--r--languages/classes/LanguageBe.php6
-rw-r--r--languages/classes/LanguageBe_tarask.php45
-rw-r--r--languages/classes/LanguageBg.php6
-rw-r--r--languages/classes/LanguageBh.php5
-rw-r--r--languages/classes/LanguageBs.php8
-rw-r--r--languages/classes/LanguageCs.php2
-rw-r--r--languages/classes/LanguageCu.php24
-rw-r--r--languages/classes/LanguageCy.php2
-rw-r--r--languages/classes/LanguageDsb.php2
-rw-r--r--languages/classes/LanguageEo.php114
-rw-r--r--languages/classes/LanguageEt.php6
-rw-r--r--languages/classes/LanguageFi.php22
-rw-r--r--languages/classes/LanguageFr.php4
-rw-r--r--languages/classes/LanguageGa.php8
-rw-r--r--languages/classes/LanguageGan.php38
-rw-r--r--languages/classes/LanguageGd.php2
-rw-r--r--languages/classes/LanguageGv.php6
-rw-r--r--languages/classes/LanguageHe.php36
-rw-r--r--languages/classes/LanguageHi.php5
-rw-r--r--languages/classes/LanguageHr.php6
-rw-r--r--languages/classes/LanguageHsb.php2
-rw-r--r--languages/classes/LanguageHu.php2
-rw-r--r--languages/classes/LanguageHy.php44
-rw-r--r--languages/classes/LanguageJa.php10
-rw-r--r--languages/classes/LanguageKaa.php2
-rw-r--r--languages/classes/LanguageKk.deps.php4
-rw-r--r--languages/classes/LanguageKk.php153
-rw-r--r--languages/classes/LanguageKk_cyrl.php153
-rw-r--r--languages/classes/LanguageKm.php2
-rw-r--r--languages/classes/LanguageKsh.php162
-rw-r--r--languages/classes/LanguageKu.deps.php4
-rw-r--r--languages/classes/LanguageKu.php48
-rw-r--r--languages/classes/LanguageKu_ku.php2
-rw-r--r--languages/classes/LanguageLa.php2
-rw-r--r--languages/classes/LanguageLn.php5
-rw-r--r--languages/classes/LanguageLt.php10
-rw-r--r--languages/classes/LanguageLv.php10
-rw-r--r--languages/classes/LanguageMg.php5
-rw-r--r--languages/classes/LanguageMk.php3
-rw-r--r--languages/classes/LanguageMl.php15
-rw-r--r--languages/classes/LanguageMo.php3
-rw-r--r--languages/classes/LanguageMt.php6
-rw-r--r--languages/classes/LanguageMy.php5
-rw-r--r--languages/classes/LanguageNso.php5
-rw-r--r--languages/classes/LanguagePl.php8
-rw-r--r--languages/classes/LanguagePt_br.php17
-rw-r--r--languages/classes/LanguageRo.php3
-rw-r--r--languages/classes/LanguageRu.php68
-rw-r--r--languages/classes/LanguageSe.php5
-rw-r--r--languages/classes/LanguageSh.php11
-rw-r--r--languages/classes/LanguageSk.php2
-rw-r--r--languages/classes/LanguageSl.php4
-rw-r--r--languages/classes/LanguageSma.php5
-rw-r--r--languages/classes/LanguageSr.deps.php4
-rw-r--r--languages/classes/LanguageSr.php82
-rw-r--r--languages/classes/LanguageSr_ec.php8
-rw-r--r--languages/classes/LanguageSr_el.deps.php2
-rw-r--r--languages/classes/LanguageSr_el.php8
-rw-r--r--languages/classes/LanguageTg.php4
-rw-r--r--languages/classes/LanguageTi.php5
-rw-r--r--languages/classes/LanguageTl.php5
-rw-r--r--languages/classes/LanguageTr.php2
-rw-r--r--languages/classes/LanguageTyv.php244
-rw-r--r--languages/classes/LanguageUk.php75
-rw-r--r--languages/classes/LanguageWa.php31
-rw-r--r--languages/classes/LanguageYue.php6
-rw-r--r--languages/classes/LanguageZh.deps.php4
-rw-r--r--languages/classes/LanguageZh.php64
-rw-r--r--languages/classes/LanguageZh_hans.php12
-rw-r--r--languages/messages/MessagesAb.php87
-rw-r--r--languages/messages/MessagesAce.php183
-rw-r--r--languages/messages/MessagesAf.php383
-rw-r--r--languages/messages/MessagesAln.php69
-rw-r--r--languages/messages/MessagesAm.php56
-rw-r--r--languages/messages/MessagesAn.php407
-rw-r--r--languages/messages/MessagesAng.php58
-rw-r--r--languages/messages/MessagesAr.php394
-rw-r--r--languages/messages/MessagesArc.php199
-rw-r--r--languages/messages/MessagesArn.php17
-rw-r--r--languages/messages/MessagesAry.php2099
-rw-r--r--languages/messages/MessagesArz.php238
-rw-r--r--languages/messages/MessagesAs.php221
-rw-r--r--languages/messages/MessagesAst.php433
-rw-r--r--languages/messages/MessagesAvk.php16
-rw-r--r--languages/messages/MessagesAy.php3
-rw-r--r--languages/messages/MessagesAz.php1373
-rw-r--r--languages/messages/MessagesBa.php400
-rw-r--r--languages/messages/MessagesBar.php90
-rw-r--r--languages/messages/MessagesBat_smg.php1943
-rw-r--r--languages/messages/MessagesBcc.php72
-rw-r--r--languages/messages/MessagesBcl.php34
-rw-r--r--languages/messages/MessagesBe.php237
-rw-r--r--languages/messages/MessagesBe_tarask.php348
-rw-r--r--languages/messages/MessagesBg.php323
-rw-r--r--languages/messages/MessagesBh.php29
-rw-r--r--languages/messages/MessagesBjn.php2432
-rw-r--r--languages/messages/MessagesBn.php415
-rw-r--r--languages/messages/MessagesBo.php50
-rw-r--r--languages/messages/MessagesBpy.php60
-rw-r--r--languages/messages/MessagesBqi.php13
-rw-r--r--languages/messages/MessagesBr.php422
-rw-r--r--languages/messages/MessagesBs.php356
-rw-r--r--languages/messages/MessagesCa.php321
-rw-r--r--languages/messages/MessagesCdo.php57
-rw-r--r--languages/messages/MessagesCe.php254
-rw-r--r--languages/messages/MessagesCeb.php49
-rw-r--r--languages/messages/MessagesCh.php12
-rw-r--r--languages/messages/MessagesCkb.php310
-rw-r--r--languages/messages/MessagesCkb_arab.php2997
-rw-r--r--languages/messages/MessagesCo.php11
-rw-r--r--languages/messages/MessagesCps.php49
-rw-r--r--languages/messages/MessagesCrh_cyrl.php81
-rw-r--r--languages/messages/MessagesCrh_latn.php81
-rw-r--r--languages/messages/MessagesCs.php513
-rw-r--r--languages/messages/MessagesCsb.php153
-rw-r--r--languages/messages/MessagesCu.php891
-rw-r--r--languages/messages/MessagesCv.php137
-rw-r--r--languages/messages/MessagesCy.php347
-rw-r--r--languages/messages/MessagesDa.php449
-rw-r--r--languages/messages/MessagesDe.php464
-rw-r--r--languages/messages/MessagesDe_at.php3
-rw-r--r--languages/messages/MessagesDe_ch.php30
-rw-r--r--languages/messages/MessagesDe_formal.php72
-rw-r--r--languages/messages/MessagesDiq.php259
-rw-r--r--languages/messages/MessagesDk.php12
-rw-r--r--languages/messages/MessagesDsb.php449
-rw-r--r--languages/messages/MessagesDz.php9
-rw-r--r--languages/messages/MessagesEe.php3
-rw-r--r--languages/messages/MessagesEl.php355
-rw-r--r--languages/messages/MessagesEn.php444
-rw-r--r--languages/messages/MessagesEn_gb.php7
-rw-r--r--languages/messages/MessagesEo.php615
-rw-r--r--languages/messages/MessagesEs.php572
-rw-r--r--languages/messages/MessagesEt.php341
-rw-r--r--languages/messages/MessagesEu.php218
-rw-r--r--languages/messages/MessagesExt.php65
-rw-r--r--languages/messages/MessagesFa.php1226
-rw-r--r--languages/messages/MessagesFf.php2
-rw-r--r--languages/messages/MessagesFi.php314
-rw-r--r--languages/messages/MessagesFj.php2
-rw-r--r--languages/messages/MessagesFo.php53
-rw-r--r--languages/messages/MessagesFr.php479
-rw-r--r--languages/messages/MessagesFrc.php8
-rw-r--r--languages/messages/MessagesFrp.php523
-rw-r--r--languages/messages/MessagesFrr.php122
-rw-r--r--languages/messages/MessagesFur.php206
-rw-r--r--languages/messages/MessagesFy.php63
-rw-r--r--languages/messages/MessagesGa.php64
-rw-r--r--languages/messages/MessagesGag.php39
-rw-r--r--languages/messages/MessagesGan_hans.php63
-rw-r--r--languages/messages/MessagesGan_hant.php64
-rw-r--r--languages/messages/MessagesGd.php51
-rw-r--r--languages/messages/MessagesGl.php493
-rw-r--r--languages/messages/MessagesGlk.php5
-rw-r--r--languages/messages/MessagesGn.php8
-rw-r--r--languages/messages/MessagesGot.php1
-rw-r--r--languages/messages/MessagesGrc.php80
-rw-r--r--languages/messages/MessagesGsw.php322
-rw-r--r--languages/messages/MessagesGu.php415
-rw-r--r--languages/messages/MessagesGv.php47
-rw-r--r--languages/messages/MessagesHa.php21
-rw-r--r--languages/messages/MessagesHak.php46
-rw-r--r--languages/messages/MessagesHaw.php8
-rw-r--r--languages/messages/MessagesHe.php343
-rw-r--r--languages/messages/MessagesHi.php301
-rw-r--r--languages/messages/MessagesHif_deva.php20
-rw-r--r--languages/messages/MessagesHif_latn.php274
-rw-r--r--languages/messages/MessagesHil.php308
-rw-r--r--languages/messages/MessagesHr.php326
-rw-r--r--languages/messages/MessagesHsb.php435
-rw-r--r--languages/messages/MessagesHt.php191
-rw-r--r--languages/messages/MessagesHu.php462
-rw-r--r--languages/messages/MessagesHy.php106
-rw-r--r--languages/messages/MessagesIa.php485
-rw-r--r--languages/messages/MessagesId.php510
-rw-r--r--languages/messages/MessagesIe.php48
-rw-r--r--languages/messages/MessagesIg.php116
-rw-r--r--languages/messages/MessagesIke_cans.php4
-rw-r--r--languages/messages/MessagesIke_latn.php4
-rw-r--r--languages/messages/MessagesIlo.php17
-rw-r--r--languages/messages/MessagesInh.php620
-rw-r--r--languages/messages/MessagesIo.php244
-rw-r--r--languages/messages/MessagesIs.php66
-rw-r--r--languages/messages/MessagesIt.php372
-rw-r--r--languages/messages/MessagesJa.php517
-rw-r--r--languages/messages/MessagesJut.php12
-rw-r--r--languages/messages/MessagesJv.php98
-rw-r--r--languages/messages/MessagesKa.php341
-rw-r--r--languages/messages/MessagesKaa.php133
-rw-r--r--languages/messages/MessagesKab.php24
-rw-r--r--languages/messages/MessagesKbd.php (renamed from languages/messages/MessagesCkb_latn.php)6
-rw-r--r--languages/messages/MessagesKbd_cyrl.php1332
-rw-r--r--languages/messages/MessagesKiu.php162
-rw-r--r--languages/messages/MessagesKk_arab.php32
-rw-r--r--languages/messages/MessagesKk_cyrl.php69
-rw-r--r--languages/messages/MessagesKk_latn.php28
-rw-r--r--languages/messages/MessagesKl.php64
-rw-r--r--languages/messages/MessagesKm.php234
-rw-r--r--languages/messages/MessagesKn.php66
-rw-r--r--languages/messages/MessagesKo.php378
-rw-r--r--languages/messages/MessagesKoi.php19
-rw-r--r--languages/messages/MessagesKrc.php312
-rw-r--r--languages/messages/MessagesKri.php1
-rw-r--r--languages/messages/MessagesKrj.php4
-rw-r--r--languages/messages/MessagesKs.php2
-rw-r--r--languages/messages/MessagesKsh.php478
-rw-r--r--languages/messages/MessagesKu_arab.php2
-rw-r--r--languages/messages/MessagesKu_latn.php171
-rw-r--r--languages/messages/MessagesKw.php109
-rw-r--r--languages/messages/MessagesKy.php1
-rw-r--r--languages/messages/MessagesLa.php71
-rw-r--r--languages/messages/MessagesLad.php592
-rw-r--r--languages/messages/MessagesLb.php503
-rw-r--r--languages/messages/MessagesLbe.php35
-rw-r--r--languages/messages/MessagesLez.php717
-rw-r--r--languages/messages/MessagesLfn.php12
-rw-r--r--languages/messages/MessagesLg.php57
-rw-r--r--languages/messages/MessagesLi.php416
-rw-r--r--languages/messages/MessagesLij.php12
-rw-r--r--languages/messages/MessagesLmo.php115
-rw-r--r--languages/messages/MessagesLn.php72
-rw-r--r--languages/messages/MessagesLo.php8
-rw-r--r--languages/messages/MessagesLoz.php12
-rw-r--r--languages/messages/MessagesLt.php478
-rw-r--r--languages/messages/MessagesLtg.php55
-rw-r--r--languages/messages/MessagesLv.php225
-rw-r--r--languages/messages/MessagesLzh.php282
-rw-r--r--languages/messages/MessagesLzz.php19
-rw-r--r--languages/messages/MessagesMai.php2661
-rw-r--r--languages/messages/MessagesMdf.php64
-rw-r--r--languages/messages/MessagesMg.php313
-rw-r--r--languages/messages/MessagesMhr.php139
-rw-r--r--languages/messages/MessagesMin.php700
-rw-r--r--languages/messages/MessagesMk.php483
-rw-r--r--languages/messages/MessagesMl.php518
-rw-r--r--languages/messages/MessagesMn.php275
-rw-r--r--languages/messages/MessagesMo.php2
-rw-r--r--languages/messages/MessagesMr.php1197
-rw-r--r--languages/messages/MessagesMrj.php34
-rw-r--r--languages/messages/MessagesMs.php483
-rw-r--r--languages/messages/MessagesMt.php167
-rw-r--r--languages/messages/MessagesMwl.php15
-rw-r--r--languages/messages/MessagesMy.php286
-rw-r--r--languages/messages/MessagesMyv.php165
-rw-r--r--languages/messages/MessagesMzn.php72
-rw-r--r--languages/messages/MessagesNah.php37
-rw-r--r--languages/messages/MessagesNan.php73
-rw-r--r--languages/messages/MessagesNap.php5
-rw-r--r--languages/messages/MessagesNds.php161
-rw-r--r--languages/messages/MessagesNds_nl.php320
-rw-r--r--languages/messages/MessagesNe.php319
-rw-r--r--languages/messages/MessagesNew.php3
-rw-r--r--languages/messages/MessagesNiu.php2
-rw-r--r--languages/messages/MessagesNl.php344
-rw-r--r--languages/messages/MessagesNl_informal.php658
-rw-r--r--languages/messages/MessagesNn.php367
-rw-r--r--languages/messages/MessagesNo.php457
-rw-r--r--languages/messages/MessagesNov.php2
-rw-r--r--languages/messages/MessagesNso.php18
-rw-r--r--languages/messages/MessagesNv.php3
-rw-r--r--languages/messages/MessagesOc.php386
-rw-r--r--languages/messages/MessagesOr.php534
-rw-r--r--languages/messages/MessagesOs.php502
-rw-r--r--languages/messages/MessagesPa.php85
-rw-r--r--languages/messages/MessagesPam.php38
-rw-r--r--languages/messages/MessagesPap.php2
-rw-r--r--languages/messages/MessagesPcd.php56
-rw-r--r--languages/messages/MessagesPdc.php73
-rw-r--r--languages/messages/MessagesPdt.php1
-rw-r--r--languages/messages/MessagesPfl.php12
-rw-r--r--languages/messages/MessagesPl.php459
-rw-r--r--languages/messages/MessagesPms.php337
-rw-r--r--languages/messages/MessagesPnb.php78
-rw-r--r--languages/messages/MessagesPnt.php46
-rw-r--r--languages/messages/MessagesPrg.php64
-rw-r--r--languages/messages/MessagesPs.php266
-rw-r--r--languages/messages/MessagesPt.php540
-rw-r--r--languages/messages/MessagesPt_br.php490
-rw-r--r--languages/messages/MessagesQqq.php443
-rw-r--r--languages/messages/MessagesQu.php545
-rw-r--r--languages/messages/MessagesRgn.php9
-rw-r--r--languages/messages/MessagesRif.php14
-rw-r--r--languages/messages/MessagesRm.php229
-rw-r--r--languages/messages/MessagesRo.php488
-rw-r--r--languages/messages/MessagesRoa_rup.php2
-rw-r--r--languages/messages/MessagesRoa_tara.php325
-rw-r--r--languages/messages/MessagesRu.php343
-rw-r--r--languages/messages/MessagesRue.php454
-rw-r--r--languages/messages/MessagesRuq_cyrl.php9
-rw-r--r--languages/messages/MessagesRuq_latn.php9
-rw-r--r--languages/messages/MessagesSa.php351
-rw-r--r--languages/messages/MessagesSah.php326
-rw-r--r--languages/messages/MessagesSc.php64
-rw-r--r--languages/messages/MessagesScn.php80
-rw-r--r--languages/messages/MessagesSco.php35
-rw-r--r--languages/messages/MessagesSd.php33
-rw-r--r--languages/messages/MessagesSdc.php34
-rw-r--r--languages/messages/MessagesSe.php71
-rw-r--r--languages/messages/MessagesSei.php10
-rw-r--r--languages/messages/MessagesSgs.php1935
-rw-r--r--languages/messages/MessagesSh.php330
-rw-r--r--languages/messages/MessagesShi.php103
-rw-r--r--languages/messages/MessagesSi.php639
-rw-r--r--languages/messages/MessagesSimple.php12
-rw-r--r--languages/messages/MessagesSk.php334
-rw-r--r--languages/messages/MessagesSl.php385
-rw-r--r--languages/messages/MessagesSli.php931
-rw-r--r--languages/messages/MessagesSma.php12
-rw-r--r--languages/messages/MessagesSn.php2
-rw-r--r--languages/messages/MessagesSo.php746
-rw-r--r--languages/messages/MessagesSq.php334
-rw-r--r--languages/messages/MessagesSr.php2
-rw-r--r--languages/messages/MessagesSr_ec.php426
-rw-r--r--languages/messages/MessagesSr_el.php197
-rw-r--r--languages/messages/MessagesSrn.php13
-rw-r--r--languages/messages/MessagesSs.php20
-rw-r--r--languages/messages/MessagesSt.php2
-rw-r--r--languages/messages/MessagesStq.php322
-rw-r--r--languages/messages/MessagesSu.php106
-rw-r--r--languages/messages/MessagesSv.php450
-rw-r--r--languages/messages/MessagesSw.php336
-rw-r--r--languages/messages/MessagesSzl.php186
-rw-r--r--languages/messages/MessagesTa.php207
-rw-r--r--languages/messages/MessagesTcy.php8
-rw-r--r--languages/messages/MessagesTe.php392
-rw-r--r--languages/messages/MessagesTet.php167
-rw-r--r--languages/messages/MessagesTg_cyrl.php64
-rw-r--r--languages/messages/MessagesTg_latn.php62
-rw-r--r--languages/messages/MessagesTh.php355
-rw-r--r--languages/messages/MessagesTi.php3
-rw-r--r--languages/messages/MessagesTk.php281
-rw-r--r--languages/messages/MessagesTl.php337
-rw-r--r--languages/messages/MessagesTn.php2
-rw-r--r--languages/messages/MessagesTo.php7
-rw-r--r--languages/messages/MessagesTpi.php53
-rw-r--r--languages/messages/MessagesTr.php679
-rw-r--r--languages/messages/MessagesTs.php2
-rw-r--r--languages/messages/MessagesTt_cyrl.php230
-rw-r--r--languages/messages/MessagesTt_latn.php69
-rw-r--r--languages/messages/MessagesTyv.php23
-rw-r--r--languages/messages/MessagesUdm.php2
-rw-r--r--languages/messages/MessagesUg.php4
-rw-r--r--languages/messages/MessagesUg_arab.php267
-rw-r--r--languages/messages/MessagesUk.php341
-rw-r--r--languages/messages/MessagesUr.php48
-rw-r--r--languages/messages/MessagesUz.php11
-rw-r--r--languages/messages/MessagesVec.php364
-rw-r--r--languages/messages/MessagesVep.php244
-rw-r--r--languages/messages/MessagesVi.php571
-rw-r--r--languages/messages/MessagesVls.php16
-rw-r--r--languages/messages/MessagesVmf.php63
-rw-r--r--languages/messages/MessagesVo.php85
-rw-r--r--languages/messages/MessagesVot.php7
-rw-r--r--languages/messages/MessagesVro.php59
-rw-r--r--languages/messages/MessagesWa.php20
-rw-r--r--languages/messages/MessagesWar.php46
-rw-r--r--languages/messages/MessagesWo.php68
-rw-r--r--languages/messages/MessagesWuu.php105
-rw-r--r--languages/messages/MessagesXal.php83
-rw-r--r--languages/messages/MessagesXh.php2
-rw-r--r--languages/messages/MessagesXmf.php267
-rw-r--r--languages/messages/MessagesYi.php453
-rw-r--r--languages/messages/MessagesYo.php123
-rw-r--r--languages/messages/MessagesYue.php321
-rw-r--r--languages/messages/MessagesZa.php19
-rw-r--r--languages/messages/MessagesZea.php9
-rw-r--r--languages/messages/MessagesZh.php13
-rw-r--r--languages/messages/MessagesZh_hans.php353
-rw-r--r--languages/messages/MessagesZh_hant.php345
-rw-r--r--languages/messages/MessagesZh_hk.php29
-rw-r--r--languages/messages/MessagesZh_tw.php11
-rw-r--r--languages/messages/MessagesZu.php12
-rw-r--r--load.php42
-rw-r--r--load.php51
-rw-r--r--maintenance/7zip.inc41
-rw-r--r--maintenance/Doxyfile18
-rw-r--r--maintenance/FiveUpgrade.inc1190
-rw-r--r--maintenance/Maintenance.php634
-rw-r--r--maintenance/Makefile2
-rw-r--r--maintenance/addwiki.php46
-rw-r--r--maintenance/archives/patch-archive_ar_revid.sql4
-rw-r--r--maintenance/archives/patch-archive_kill_ar_page_revid.sql4
-rw-r--r--maintenance/archives/patch-categorylinks-better-collation.sql19
-rw-r--r--maintenance/archives/patch-categorylinks-better-collation2.sql12
-rw-r--r--maintenance/archives/patch-iw_api_and_wikiid.sql9
-rw-r--r--maintenance/archives/patch-iwlinks.sql16
-rw-r--r--maintenance/archives/patch-kill-iwl_pft.sql7
-rw-r--r--maintenance/archives/patch-kill-iwl_prefix.sql7
-rw-r--r--maintenance/archives/patch-langlinks-ll_lang-20.sql3
-rw-r--r--maintenance/archives/patch-mime_minor_length.sql2
-rw-r--r--maintenance/archives/patch-module_deps.sql12
-rw-r--r--maintenance/archives/patch-msg_resource.sql20
-rw-r--r--maintenance/archives/patch-profiling.sql7
-rw-r--r--maintenance/archives/patch-rename-iwl_prefix.sql4
-rw-r--r--maintenance/archives/patch-tc-timestamp.sql2
-rw-r--r--maintenance/archives/patch-testrun.sql (renamed from maintenance/testRunner.sql)0
-rw-r--r--maintenance/archives/patch-ul_value.sql4
-rw-r--r--maintenance/archives/upgradeLogging.php4
-rw-r--r--maintenance/attachLatest.php30
-rw-r--r--maintenance/backup.inc97
-rw-r--r--maintenance/backupPrefetch.inc106
-rw-r--r--maintenance/benchmarkPurge.php47
-rw-r--r--maintenance/benchmarks/Benchmarker.php72
-rw-r--r--maintenance/benchmarks/bench_HTTP_HTTPS.php38
-rw-r--r--maintenance/benchmarks/bench_wfIsWindows.php42
-rw-r--r--maintenance/changePassword.php21
-rw-r--r--maintenance/checkAutoLoader.php11
-rw-r--r--maintenance/checkBadRedirects.php19
-rw-r--r--maintenance/checkImages.php23
-rw-r--r--maintenance/checkSyntax.php53
-rw-r--r--maintenance/checkUsernames.php7
-rw-r--r--maintenance/cleanupCaps.php25
-rw-r--r--maintenance/cleanupDupes.inc128
-rw-r--r--maintenance/cleanupImages.php61
-rw-r--r--maintenance/cleanupRemovedModules.php89
-rw-r--r--maintenance/cleanupSpam.php27
-rw-r--r--maintenance/cleanupTable.inc15
-rw-r--r--maintenance/cleanupTitles.php47
-rw-r--r--maintenance/cleanupWatchlist.php11
-rw-r--r--maintenance/clear_interwiki_cache.php7
-rw-r--r--maintenance/clear_stats.php33
-rw-r--r--maintenance/commandLine.inc7
-rw-r--r--maintenance/convertLinks.inc218
-rw-r--r--maintenance/convertLinks.php199
-rw-r--r--maintenance/convertUserOptions.php25
-rw-r--r--maintenance/createAndPromote.php28
-rw-r--r--maintenance/cssjanus/COPYING (renamed from skins/vector/cssjanus/COPYING)0
-rw-r--r--maintenance/cssjanus/LICENSE (renamed from skins/vector/cssjanus/LICENSE)0
-rw-r--r--maintenance/cssjanus/README (renamed from skins/vector/cssjanus/README)0
-rw-r--r--maintenance/cssjanus/cssjanus.py (renamed from skins/vector/cssjanus/cssjanus.py)0
-rw-r--r--maintenance/cssjanus/csslex.py (renamed from skins/vector/cssjanus/csslex.py)0
-rw-r--r--maintenance/deleteArchivedFiles.inc62
-rw-r--r--maintenance/deleteArchivedFiles.php48
-rw-r--r--maintenance/deleteArchivedRevisions.inc57
-rw-r--r--maintenance/deleteArchivedRevisions.php33
-rw-r--r--maintenance/deleteBatch.php31
-rw-r--r--maintenance/deleteDefaultMessages.php32
-rw-r--r--maintenance/deleteImageMemcached.php14
-rw-r--r--maintenance/deleteOldRevisions.php32
-rw-r--r--maintenance/deleteOrphanedRevisions.php27
-rw-r--r--maintenance/deleteRevision.php14
-rw-r--r--maintenance/deleteSelfExternals.php18
-rw-r--r--maintenance/doMaintenance.php40
-rw-r--r--maintenance/dumpBackup.php31
-rw-r--r--maintenance/dumpInterwiki.inc209
-rw-r--r--maintenance/dumpInterwiki.php238
-rw-r--r--maintenance/dumpLinks.php14
-rw-r--r--maintenance/dumpSisterSites.php9
-rw-r--r--maintenance/dumpTextPass.php448
-rw-r--r--maintenance/dumpUploads.php50
-rw-r--r--maintenance/edit.php22
-rw-r--r--maintenance/eval.php15
-rw-r--r--maintenance/fetchText.php39
-rw-r--r--maintenance/findhooks.php103
-rw-r--r--maintenance/fixSlaveDesync.php52
-rw-r--r--maintenance/fixTimestamps.php51
-rw-r--r--maintenance/fixUserRegistration.php4
-rw-r--r--maintenance/fuzz-tester.php3881
-rw-r--r--maintenance/gearman/gearman.inc2
-rw-r--r--maintenance/gearman/gearmanRefreshLinks.php12
-rw-r--r--maintenance/gearman/gearmanWorker.php6
-rw-r--r--maintenance/generateSitemap.php116
-rw-r--r--maintenance/getLagTimes.php12
-rw-r--r--maintenance/getSlaveServer.php12
-rw-r--r--maintenance/getText.php6
-rw-r--r--maintenance/httpSessionDownload.php12
-rw-r--r--maintenance/ibm_db2/foreignkeys.sql107
-rw-r--r--maintenance/ibm_db2/tables.sql103
-rw-r--r--maintenance/importDump.php76
-rw-r--r--maintenance/importImages.inc45
-rw-r--r--maintenance/importImages.php184
-rw-r--r--maintenance/importTextFile.php12
-rw-r--r--maintenance/importUseModWiki.php90
-rw-r--r--maintenance/initEditCount.php30
-rw-r--r--maintenance/initStats.php13
-rw-r--r--maintenance/install-utils.inc208
-rw-r--r--maintenance/install.php95
-rw-r--r--maintenance/installExtension.php683
-rw-r--r--maintenance/interwiki.list97
-rw-r--r--maintenance/interwiki.sql2
-rw-r--r--maintenance/lag.php12
-rw-r--r--maintenance/language/StatOutputs.php23
-rw-r--r--maintenance/language/alltrans.php8
-rw-r--r--maintenance/language/checkDupeMessages.php82
-rw-r--r--maintenance/language/checkExtensions.php6
-rw-r--r--maintenance/language/checkLanguage.inc44
-rw-r--r--maintenance/language/checkLanguage.php4
-rw-r--r--maintenance/language/countMessages.php10
-rw-r--r--maintenance/language/date-formats.php6
-rw-r--r--maintenance/language/diffLanguage.php159
-rw-r--r--maintenance/language/digit2html.php20
-rw-r--r--maintenance/language/dumpMessages.php6
-rw-r--r--maintenance/language/function-list.php6
-rw-r--r--maintenance/language/generateCollationData.php381
-rw-r--r--maintenance/language/generateNormalizerData.php6
-rw-r--r--maintenance/language/lang2po.php75
-rw-r--r--maintenance/language/langmemusage.php10
-rw-r--r--maintenance/language/languages.inc4
-rw-r--r--maintenance/language/messageTypes.inc16
-rw-r--r--maintenance/language/messages.inc144
-rw-r--r--maintenance/language/rebuildLanguage.php37
-rw-r--r--maintenance/language/transstat.php8
-rw-r--r--maintenance/language/validate.php2
-rw-r--r--maintenance/language/writeMessagesArray.inc31
-rw-r--r--maintenance/mcc.php35
-rw-r--r--maintenance/mctest.php26
-rw-r--r--maintenance/mergeMessageFileList.php18
-rw-r--r--maintenance/migrateUserGroup.php16
-rw-r--r--maintenance/minify.php37
-rw-r--r--maintenance/moveBatch.php20
-rw-r--r--maintenance/mssql/README78
-rw-r--r--maintenance/mssql/tables.sql983
-rw-r--r--maintenance/mwdocgen.php69
-rw-r--r--maintenance/namespaceDupes.php136
-rw-r--r--maintenance/nextJobDB.php14
-rw-r--r--maintenance/nukeNS.php30
-rw-r--r--maintenance/nukePage.php14
-rw-r--r--maintenance/oracle/archives/patch-testrun.sql (renamed from maintenance/testRunner.ora.sql)0
-rw-r--r--maintenance/oracle/archives/patch_16_17_schema_changes.sql98
-rw-r--r--maintenance/oracle/archives/patch_create_17_functions.sql125
-rw-r--r--maintenance/oracle/archives/patch_fk_rename_deferred.sql41
-rw-r--r--maintenance/oracle/archives/patch_namespace_defaults.sql17
-rw-r--r--maintenance/oracle/patch_seq_names_pre1.16.sql (renamed from maintenance/ora/patch_seq_names_pre1.16.sql)0
-rw-r--r--maintenance/oracle/tables.sql (renamed from maintenance/ora/tables.sql)236
-rw-r--r--maintenance/oracle/user.sql (renamed from maintenance/ora/user.sql)4
-rw-r--r--maintenance/orphans.php83
-rw-r--r--maintenance/ourusers.php4
-rw-r--r--maintenance/parserTests.inc1719
-rw-r--r--maintenance/parserTestsParserHook.php34
-rw-r--r--maintenance/parserTestsParserTime.php26
-rw-r--r--maintenance/parserTestsStaticParserHook.php47
-rw-r--r--maintenance/patchSql.php14
-rw-r--r--maintenance/populateCategory.inc85
-rw-r--r--maintenance/populateCategory.php58
-rw-r--r--maintenance/populateLogSearch.inc80
-rw-r--r--maintenance/populateLogSearch.php81
-rw-r--r--maintenance/populateLogUsertext.php22
-rw-r--r--maintenance/populateParentId.inc83
-rw-r--r--maintenance/populateParentId.php41
-rw-r--r--maintenance/populateRevisionLength.php98
-rw-r--r--maintenance/populateSha1.php22
-rw-r--r--maintenance/postgres/archives/patch-categorylinks-better-collation.sql8
-rw-r--r--maintenance/postgres/archives/patch-change_tag.sql27
-rw-r--r--maintenance/postgres/archives/patch-iwlinks.sql8
-rw-r--r--maintenance/postgres/archives/patch-kill-iwl_pft.sql7
-rw-r--r--maintenance/postgres/archives/patch-kill-iwl_prefix.sql7
-rw-r--r--maintenance/postgres/archives/patch-mediawiki_version.sql18
-rw-r--r--maintenance/postgres/archives/patch-module_deps.sql7
-rw-r--r--maintenance/postgres/archives/patch-msg_resource.sql8
-rw-r--r--maintenance/postgres/archives/patch-msg_resource_links.sql6
-rw-r--r--maintenance/postgres/archives/patch-mwuser.sql1
-rw-r--r--maintenance/postgres/archives/patch-page.sql24
-rw-r--r--maintenance/postgres/archives/patch-pagecontent.sql1
-rw-r--r--maintenance/postgres/archives/patch-rename-iwl_prefix.sql2
-rw-r--r--maintenance/postgres/archives/patch-tag_summary.sql9
-rw-r--r--maintenance/postgres/archives/patch-testrun.sql (renamed from maintenance/testRunner.postgres.sql)0
-rw-r--r--maintenance/postgres/archives/patch-update_sequences.sql14
-rw-r--r--maintenance/postgres/archives/patch-valid_tag.sql3
-rw-r--r--maintenance/postgres/compare_schemas.pl63
-rw-r--r--maintenance/postgres/mediawiki_mysql2postgres.pl11
-rw-r--r--maintenance/postgres/tables.sql134
-rw-r--r--maintenance/preprocessorFuzzTest.php26
-rw-r--r--maintenance/protect.php19
-rw-r--r--maintenance/purgeList.php13
-rw-r--r--maintenance/purgeOldText.inc26
-rw-r--r--maintenance/purgeOldText.php8
-rw-r--r--maintenance/reassignEdits.php60
-rw-r--r--maintenance/rebuildFileCache.php51
-rw-r--r--maintenance/rebuildImages.php106
-rw-r--r--maintenance/rebuildInterwiki.inc259
-rw-r--r--maintenance/rebuildInterwiki.php278
-rw-r--r--maintenance/rebuildLocalisationCache.php28
-rw-r--r--maintenance/rebuildall.php6
-rw-r--r--maintenance/rebuildmessages.php12
-rw-r--r--maintenance/rebuildrecentchanges.php139
-rw-r--r--maintenance/rebuildtextindex.php40
-rw-r--r--maintenance/refreshImageCount.php8
-rw-r--r--maintenance/refreshLinks.php88
-rw-r--r--maintenance/removeUnusedAccounts.php32
-rw-r--r--maintenance/renameDbPrefix.php34
-rw-r--r--maintenance/renamewiki.php16
-rw-r--r--maintenance/renderDump.php41
-rw-r--r--maintenance/rollbackEdits.php20
-rw-r--r--maintenance/runBatchedQuery.php8
-rw-r--r--maintenance/runJobs.php28
-rw-r--r--maintenance/showJobs.php8
-rw-r--r--maintenance/showStats.php19
-rw-r--r--maintenance/sql.php8
-rw-r--r--maintenance/sqlite.inc67
-rw-r--r--maintenance/sqlite.php30
-rw-r--r--maintenance/sqlite/archives/initial-indexes.sql2
-rw-r--r--maintenance/sqlite/archives/patch-categorylinks-better-collation.sql7
-rw-r--r--maintenance/sqlite/archives/patch-iw_api_and_wikiid.sql19
-rw-r--r--maintenance/sqlite/archives/patch-kill-iwl_pft.sql7
-rw-r--r--maintenance/sqlite/archives/patch-kill-iwl_prefix.sql7
-rw-r--r--maintenance/sqlite/archives/patch-log_search-rename-index.sql1
-rw-r--r--maintenance/sqlite/archives/patch-rename-iwl_prefix.sql5
-rw-r--r--maintenance/sqlite/archives/patch-tc-timestamp.sql2
-rw-r--r--maintenance/sqlite/archives/searchindex-fts3.sql2
-rw-r--r--maintenance/stats.php81
-rw-r--r--maintenance/storage/checkStorage.php74
-rw-r--r--maintenance/storage/compressOld.inc21
-rw-r--r--maintenance/storage/compressOld.php20
-rw-r--r--maintenance/storage/dumpRev.php16
-rw-r--r--maintenance/storage/fixBug20757.php43
-rw-r--r--maintenance/storage/moveToExternal.php30
-rw-r--r--maintenance/storage/orphanStats.php13
-rw-r--r--maintenance/storage/recompressTracked.php70
-rw-r--r--maintenance/storage/resolveStubs.php21
-rw-r--r--maintenance/storage/storageTypeStats.php7
-rw-r--r--maintenance/storage/testCompression.php12
-rw-r--r--maintenance/storage/trackBlobs.php56
-rw-r--r--maintenance/tables.sql375
-rw-r--r--maintenance/tests/ApiSetup.php39
-rw-r--r--maintenance/tests/ApiTest.php164
-rw-r--r--maintenance/tests/CdbTest.php79
-rw-r--r--maintenance/tests/DatabaseSqliteTest.php57
-rw-r--r--maintenance/tests/DatabaseTest.php92
-rw-r--r--maintenance/tests/GlobalTest.php212
-rw-r--r--maintenance/tests/HttpTest.php567
-rw-r--r--maintenance/tests/IPTest.php52
-rw-r--r--maintenance/tests/ImageFunctionsTest.php48
-rw-r--r--maintenance/tests/LanguageConverterTest.php148
-rw-r--r--maintenance/tests/LicensesTest.php17
-rw-r--r--maintenance/tests/LocalFileTest.php97
-rw-r--r--maintenance/tests/Makefile23
-rw-r--r--maintenance/tests/MediaWikiParserTest.php283
-rw-r--r--maintenance/tests/MediaWiki_Setup.php28
-rw-r--r--maintenance/tests/README24
-rw-r--r--maintenance/tests/RevisionTest.php114
-rw-r--r--maintenance/tests/RunSeleniumTests.php220
-rw-r--r--maintenance/tests/SanitizerTest.php73
-rw-r--r--maintenance/tests/SearchEngineTest.php138
-rw-r--r--maintenance/tests/SearchMySQLTest.php26
-rw-r--r--maintenance/tests/SearchUpdateTest.php103
-rw-r--r--maintenance/tests/SiteConfigurationTest.php311
-rw-r--r--maintenance/tests/TimeAdjustTest.php40
-rw-r--r--maintenance/tests/TitleTest.php17
-rw-r--r--maintenance/tests/XmlTest.php115
-rw-r--r--maintenance/tests/bootstrap.php15
-rw-r--r--maintenance/tests/parser/ExtraParserTests.txtbin0 -> 1261 bytes
-rw-r--r--maintenance/tests/parser/parserTest.inc1305
-rw-r--r--maintenance/tests/parser/parserTests.txt (renamed from maintenance/parserTests.txt)798
-rw-r--r--maintenance/tests/parser/parserTestsParserHook.php46
-rw-r--r--maintenance/tests/parser/parserTestsStaticParserHook.php58
-rw-r--r--maintenance/tests/parserTests.php (renamed from maintenance/parserTests.php)60
-rw-r--r--maintenance/tests/phpunit.xml17
-rw-r--r--maintenance/tests/selenium/Selenium.php190
-rw-r--r--maintenance/tests/selenium/SeleniumConfig.php88
-rw-r--r--maintenance/tests/selenium/SeleniumLoader.php9
-rw-r--r--maintenance/tests/selenium/SeleniumServerManager.php239
-rw-r--r--maintenance/tests/selenium/SeleniumTestCase.php103
-rw-r--r--maintenance/tests/selenium/SeleniumTestConsoleLogger.php25
-rw-r--r--maintenance/tests/selenium/SeleniumTestHTMLLogger.php36
-rw-r--r--maintenance/tests/selenium/SeleniumTestListener.php68
-rw-r--r--maintenance/tests/selenium/SeleniumTestSuite.php46
-rw-r--r--maintenance/tests/selenium/data/Wikipedia-logo-v2-de.pngbin0 -> 21479 bytes
-rw-r--r--maintenance/tests/selenium/selenium_settings.ini.php52.sample23
-rw-r--r--maintenance/tests/selenium/selenium_settings.ini.sample32
-rw-r--r--maintenance/tests/selenium/selenium_settings_grid.ini.sample14
-rw-r--r--maintenance/tests/selenium/suites/AddContentToNewPageTestCase.php182
-rw-r--r--maintenance/tests/selenium/suites/AddNewPageTestCase.php65
-rw-r--r--maintenance/tests/selenium/suites/CreateAccountTestCase.php114
-rw-r--r--maintenance/tests/selenium/suites/DeletePageAdminTestCase.php89
-rw-r--r--maintenance/tests/selenium/suites/EmailPasswordTestCase.php81
-rw-r--r--maintenance/tests/selenium/suites/MediaWikExtraTestSuite.php20
-rw-r--r--maintenance/tests/selenium/suites/MediaWikiEditorConfig.php47
-rw-r--r--maintenance/tests/selenium/suites/MediaWikiEditorTestSuite.php18
-rw-r--r--maintenance/tests/selenium/suites/MediawikiCoreSmokeTestCase.php69
-rw-r--r--maintenance/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php19
-rw-r--r--maintenance/tests/selenium/suites/MovePageTestCase.php117
-rw-r--r--maintenance/tests/selenium/suites/MyContributionsTestCase.php76
-rw-r--r--maintenance/tests/selenium/suites/MyWatchListTestCase.php73
-rw-r--r--maintenance/tests/selenium/suites/PageDeleteTestSuite.php16
-rw-r--r--maintenance/tests/selenium/suites/PageSearchTestCase.php105
-rw-r--r--maintenance/tests/selenium/suites/PreviewPageTestCase.php53
-rw-r--r--maintenance/tests/selenium/suites/SavePageTestCase.php58
-rw-r--r--maintenance/tests/selenium/suites/SimpleSeleniumConfig.php15
-rw-r--r--maintenance/tests/selenium/suites/SimpleSeleniumTestCase.php30
-rw-r--r--maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php26
-rw-r--r--maintenance/tests/selenium/suites/UserPreferencesTestCase.php179
-rw-r--r--maintenance/tests/test-prefetch-current.xml75
-rw-r--r--maintenance/tests/test-prefetch-previous.xml57
-rw-r--r--maintenance/tests/test-prefetch-stub.xml75
-rw-r--r--maintenance/tests/testHelpers.inc652
-rw-r--r--maintenance/undelete.php4
-rw-r--r--maintenance/update.php135
-rw-r--r--maintenance/updateArticleCount.php14
-rw-r--r--maintenance/updateCollation.php145
-rw-r--r--maintenance/updateDoubleWidthSearch.php71
-rw-r--r--maintenance/updateRestrictions.php35
-rw-r--r--maintenance/updateSearchIndex.php115
-rw-r--r--maintenance/updateSpecialPages.php25
-rw-r--r--maintenance/updaters.inc1979
-rw-r--r--maintenance/upgrade1_5.php1302
-rw-r--r--maintenance/userDupes.inc127
-rw-r--r--maintenance/userOptions.inc90
-rw-r--r--maintenance/userOptions.php2
-rw-r--r--maintenance/waitForSlave.php5
-rw-r--r--math/Makefile47
-rw-r--r--math/README2
-rw-r--r--math/lexer.mll1
-rw-r--r--math/render.ml54
-rw-r--r--math/texutil.ml30
-rw-r--r--math/texvc.ml26
-rw-r--r--math/util.ml15
-rw-r--r--mw-config/index.php50
-rw-r--r--mw-config/index.php54
-rw-r--r--php5.php52
-rw-r--r--profileinfo.php112
-rw-r--r--resources/Resources.php587
-rw-r--r--resources/jquery.effects/jquery.effects.blind.js49
-rw-r--r--resources/jquery.effects/jquery.effects.bounce.js78
-rw-r--r--resources/jquery.effects/jquery.effects.clip.js54
-rw-r--r--resources/jquery.effects/jquery.effects.core.js714
-rw-r--r--resources/jquery.effects/jquery.effects.drop.js50
-rw-r--r--resources/jquery.effects/jquery.effects.explode.js79
-rw-r--r--resources/jquery.effects/jquery.effects.fold.js56
-rw-r--r--resources/jquery.effects/jquery.effects.highlight.js50
-rw-r--r--resources/jquery.effects/jquery.effects.pulsate.js51
-rw-r--r--resources/jquery.effects/jquery.effects.scale.js178
-rw-r--r--resources/jquery.effects/jquery.effects.shake.js57
-rw-r--r--resources/jquery.effects/jquery.effects.slide.js50
-rw-r--r--resources/jquery.effects/jquery.effects.transfer.js45
-rw-r--r--resources/jquery.tipsy/images/tipsy.pngbin0 -> 179 bytes
-rw-r--r--resources/jquery.tipsy/jquery.tipsy.css75
-rw-r--r--resources/jquery.tipsy/jquery.tipsy.js207
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-af.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js24
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-az.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js24
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-da.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-de.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-el.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-es.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-et.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-he.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-id.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-is.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-it.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-no.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js26
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js24
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-th.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js23
-rw-r--r--resources/jquery.ui/jquery.ui.accordion.js504
-rw-r--r--resources/jquery.ui/jquery.ui.autocomplete.js511
-rw-r--r--resources/jquery.ui/jquery.ui.button.js365
-rw-r--r--resources/jquery.ui/jquery.ui.core.js216
-rw-r--r--resources/jquery.ui/jquery.ui.datepicker.js1730
-rw-r--r--resources/jquery.ui/jquery.ui.dialog.js823
-rw-r--r--resources/jquery.ui/jquery.ui.draggable.js797
-rw-r--r--resources/jquery.ui/jquery.ui.droppable.js285
-rw-r--r--resources/jquery.ui/jquery.ui.mouse.js151
-rw-r--r--resources/jquery.ui/jquery.ui.position.js233
-rw-r--r--resources/jquery.ui/jquery.ui.progressbar.js107
-rw-r--r--resources/jquery.ui/jquery.ui.resizable.js799
-rw-r--r--resources/jquery.ui/jquery.ui.selectable.js269
-rw-r--r--resources/jquery.ui/jquery.ui.slider.js682
-rw-r--r--resources/jquery.ui/jquery.ui.sortable.js1067
-rw-r--r--resources/jquery.ui/jquery.ui.tabs.js729
-rw-r--r--resources/jquery.ui/jquery.ui.widget.js236
-rw-r--r--resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gifbin0 -> 1553 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.pngbin0 -> 180 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.pngbin0 -> 182 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.pngbin0 -> 178 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.pngbin0 -> 180 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.pngbin0 -> 180 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.pngbin0 -> 180 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.pngbin0 -> 178 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.pngbin0 -> 182 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.pngbin0 -> 5355 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.accordion.css12
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.autocomplete.css39
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.button.css35
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.core.css37
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.datepicker.css61
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.dialog.css13
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.progressbar.css4
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.resizable.css13
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.selectable.css3
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.slider.css17
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.tabs.css11
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.theme.css248
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-blue.pngbin0 -> 126 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-green.pngbin0 -> 126 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-red.pngbin0 -> 126 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled.pngbin0 -> 126 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-blue.pngbin0 -> 170 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-green.pngbin0 -> 170 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-red.pngbin0 -> 170 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down.pngbin0 -> 170 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-blue.pngbin0 -> 216 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-green.pngbin0 -> 216 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-red.pngbin0 -> 216 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off.pngbin0 -> 190 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-blue.pngbin0 -> 216 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-green.pngbin0 -> 216 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-red.pngbin0 -> 216 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over.pngbin0 -> 191 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/close.pngbin0 -> 164 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/titlebar-fade.pngbin0 -> 231 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gifbin0 -> 1553 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.pngbin0 -> 181 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.pngbin0 -> 178 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.pngbin0 -> 103 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.pngbin0 -> 111 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.pngbin0 -> 112 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.pngbin0 -> 86 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.pngbin0 -> 153 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.pngbin0 -> 91 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.pngbin0 -> 5355 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.pngbin0 -> 5355 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.pngbin0 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.accordion.css12
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css39
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.button.css143
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.core.css37
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.datepicker.css61
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.dialog.css37
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.progressbar.css4
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.resizable.css13
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.selectable.css3
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.slider.css17
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.tabs.css11
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.theme.css248
-rw-r--r--resources/jquery/jquery.async.js78
-rw-r--r--resources/jquery/jquery.autoEllipsis.js131
-rw-r--r--resources/jquery/jquery.checkboxShiftClick.js28
-rw-r--r--resources/jquery/jquery.client.js206
-rw-r--r--resources/jquery/jquery.collapsibleTabs.js117
-rw-r--r--resources/jquery/jquery.color.js123
-rw-r--r--resources/jquery/jquery.cookie.js89
-rw-r--r--resources/jquery/jquery.delayedBind.js68
-rw-r--r--resources/jquery/jquery.expandableField.js129
-rw-r--r--resources/jquery/jquery.highlightText.js62
-rw-r--r--resources/jquery/jquery.js6240
-rw-r--r--resources/jquery/jquery.localize.js64
-rw-r--r--resources/jquery/jquery.placeholder.js85
-rw-r--r--resources/jquery/jquery.suggestions.css75
-rw-r--r--resources/jquery/jquery.suggestions.js521
-rw-r--r--resources/jquery/jquery.tabIndex.js35
-rw-r--r--resources/jquery/jquery.textSelection.js404
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.js30
-rw-r--r--resources/mediawiki.action/mediawiki.action.history.js7
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js24
-rw-r--r--resources/mediawiki.language/languages/am.js8
-rw-r--r--resources/mediawiki.language/languages/ar.js38
-rw-r--r--resources/mediawiki.language/languages/bat-smg.js18
-rw-r--r--resources/mediawiki.language/languages/be-tarask.js23
-rw-r--r--resources/mediawiki.language/languages/be.js20
-rw-r--r--resources/mediawiki.language/languages/bh.js8
-rw-r--r--resources/mediawiki.language/languages/bs.js20
-rw-r--r--resources/mediawiki.language/languages/cs.js19
-rw-r--r--resources/mediawiki.language/languages/cu.js18
-rw-r--r--resources/mediawiki.language/languages/cy.js15
-rw-r--r--resources/mediawiki.language/languages/dsb.js18
-rw-r--r--resources/mediawiki.language/languages/fr.js8
-rw-r--r--resources/mediawiki.language/languages/ga.js14
-rw-r--r--resources/mediawiki.language/languages/gd.js18
-rw-r--r--resources/mediawiki.language/languages/gv.js18
-rw-r--r--resources/mediawiki.language/languages/he.js14
-rw-r--r--resources/mediawiki.language/languages/hi.js8
-rw-r--r--resources/mediawiki.language/languages/hr.js20
-rw-r--r--resources/mediawiki.language/languages/hsb.js18
-rw-r--r--resources/mediawiki.language/languages/hy.js8
-rw-r--r--resources/mediawiki.language/languages/ksh.js14
-rw-r--r--resources/mediawiki.language/languages/ln.js8
-rw-r--r--resources/mediawiki.language/languages/lt.js17
-rw-r--r--resources/mediawiki.language/languages/lv.js8
-rw-r--r--resources/mediawiki.language/languages/mg.js8
-rw-r--r--resources/mediawiki.language/languages/mk.js8
-rw-r--r--resources/mediawiki.language/languages/mo.js14
-rw-r--r--resources/mediawiki.language/languages/mt.js17
-rw-r--r--resources/mediawiki.language/languages/nso.js8
-rw-r--r--resources/mediawiki.language/languages/pl.js21
-rw-r--r--resources/mediawiki.language/languages/pt-br.js8
-rw-r--r--resources/mediawiki.language/languages/ro.js14
-rw-r--r--resources/mediawiki.language/languages/ru.js23
-rw-r--r--resources/mediawiki.language/languages/se.js17
-rw-r--r--resources/mediawiki.language/languages/sh.js23
-rw-r--r--resources/mediawiki.language/languages/sk.js14
-rw-r--r--resources/mediawiki.language/languages/sl.js20
-rw-r--r--resources/mediawiki.language/languages/sma.js14
-rw-r--r--resources/mediawiki.language/languages/sr-ec.js20
-rw-r--r--resources/mediawiki.language/languages/sr-el.js20
-rw-r--r--resources/mediawiki.language/languages/sr.js23
-rw-r--r--resources/mediawiki.language/languages/ti.js8
-rw-r--r--resources/mediawiki.language/languages/tl.js7
-rw-r--r--resources/mediawiki.language/languages/uk.js23
-rw-r--r--resources/mediawiki.language/languages/wa.js8
-rw-r--r--resources/mediawiki.language/mediawiki.language.js102
-rw-r--r--resources/mediawiki.special/mediawiki.special.preferences.css21
-rw-r--r--resources/mediawiki.special/mediawiki.special.preferences.js77
-rw-r--r--resources/mediawiki.special/mediawiki.special.search.js11
-rw-r--r--resources/mediawiki.util/mediawiki.util.js399
-rw-r--r--resources/mediawiki.util/mediawiki.util.test.js172
-rw-r--r--resources/mediawiki/mediawiki.js1154
-rw-r--r--resources/mediawiki/mediawiki.log.js64
-rw-r--r--resources/startup.js34
-rw-r--r--serialized/first-letters-root.ser1
-rw-r--r--skins/ArchLinux.php57
-rw-r--r--skins/CologneBlue.php62
-rw-r--r--skins/Modern.php175
-rw-r--r--skins/MonoBook.php59
-rw-r--r--skins/Nostalgia.php18
-rw-r--r--skins/Simple.php61
-rw-r--r--skins/Standard.php59
-rw-r--r--skins/Vector.php234
-rw-r--r--skins/archlinux/IE50Fixes.css10
-rw-r--r--skins/archlinux/IE55Fixes.css10
-rw-r--r--skins/archlinux/IE60Fixes.css12
-rw-r--r--skins/archlinux/IE70Fixes.css8
-rw-r--r--skins/archlinux/Opera6Fixes.css2
-rw-r--r--skins/archlinux/audio.pngbin312 -> 239 bytes
-rw-r--r--skins/archlinux/document.pngbin270 -> 213 bytes
-rw-r--r--skins/archlinux/external-rtl.pngbin198 -> 157 bytes
-rw-r--r--skins/archlinux/external.pngbin165 -> 143 bytes
-rw-r--r--skins/archlinux/main.css115
-rw-r--r--skins/archlinux/news_icon.pngbin297 -> 294 bytes
-rw-r--r--skins/archlinux/rtl.css22
-rw-r--r--skins/archlinux/wiki-indexed.pngbin8205 -> 8013 bytes
-rw-r--r--skins/archlinux/wiki.pngbin22987 -> 22736 bytes
-rw-r--r--skins/chick/main.css13
-rw-r--r--skins/common/IEFixes.js41
-rw-r--r--skins/common/ajax.js196
-rw-r--r--skins/common/ajaxwatch.js262
-rw-r--r--skins/common/block.js48
-rw-r--r--skins/common/changepassword.js16
-rw-r--r--skins/common/cologneblue.css247
-rw-r--r--skins/common/commonPrint.css316
-rw-r--r--skins/common/common_rtl.css12
-rw-r--r--skins/common/config-cc.css56
-rw-r--r--skins/common/config.css164
-rw-r--r--skins/common/config.js102
-rw-r--r--skins/common/diff.css84
-rw-r--r--skins/common/edit.js44
-rw-r--r--skins/common/enhancedchanges.js4
-rw-r--r--skins/common/history.js25
-rw-r--r--skins/common/htmlform.js4
-rw-r--r--skins/common/images/Arr_d.pngbin215 -> 205 bytes
-rw-r--r--skins/common/images/Arr_l.pngbin263 -> 257 bytes
-rw-r--r--skins/common/images/Arr_r.pngbin210 -> 206 bytes
-rw-r--r--skins/common/images/Arr_u.pngbin425 -> 423 bytes
-rw-r--r--skins/common/images/add.pngbin3329 -> 3222 bytes
-rw-r--r--skins/common/images/ar/button_bold.pngbin741 -> 626 bytes
-rw-r--r--skins/common/images/ar/button_headline.pngbin629 -> 560 bytes
-rw-r--r--skins/common/images/ar/button_italic.pngbin692 -> 605 bytes
-rw-r--r--skins/common/images/ar/button_link.pngbin741 -> 643 bytes
-rw-r--r--skins/common/images/ar/button_nowiki.pngbin1185 -> 963 bytes
-rw-r--r--skins/common/images/arrow_disabled_first_25.pngbin481 -> 369 bytes
-rw-r--r--skins/common/images/arrow_disabled_last_25.pngbin480 -> 374 bytes
-rw-r--r--skins/common/images/arrow_disabled_left_25.pngbin460 -> 352 bytes
-rw-r--r--skins/common/images/arrow_disabled_right_25.pngbin447 -> 358 bytes
-rw-r--r--skins/common/images/arrow_first_25.pngbin482 -> 405 bytes
-rw-r--r--skins/common/images/arrow_last_25.pngbin484 -> 395 bytes
-rw-r--r--skins/common/images/arrow_left_25.pngbin462 -> 383 bytes
-rw-r--r--skins/common/images/arrow_right_25.pngbin449 -> 394 bytes
-rw-r--r--skins/common/images/be-tarask/button_italic.pngbin592 -> 580 bytes
-rw-r--r--skins/common/images/be-tarask/button_link.pngbin466 -> 459 bytes
-rw-r--r--skins/common/images/button_bold.pngbin288 -> 271 bytes
-rw-r--r--skins/common/images/button_extlink.pngbin494 -> 456 bytes
-rw-r--r--skins/common/images/button_headline.pngbin465 -> 461 bytes
-rw-r--r--skins/common/images/button_hr.pngbin251 -> 247 bytes
-rw-r--r--skins/common/images/button_image.pngbin584 -> 504 bytes
-rw-r--r--skins/common/images/button_italic.pngbin292 -> 271 bytes
-rw-r--r--skins/common/images/button_link.pngbin337 -> 301 bytes
-rw-r--r--skins/common/images/button_media.pngbin780 -> 749 bytes
-rw-r--r--skins/common/images/button_nowiki.pngbin352 -> 342 bytes
-rw-r--r--skins/common/images/button_sig.pngbin953 -> 949 bytes
-rw-r--r--skins/common/images/button_template.pngbin233 -> 210 bytes
-rw-r--r--skins/common/images/cc-by-nc-sa.pngbin0 -> 4263 bytes
-rw-r--r--skins/common/images/cc-by-sa.pngbin0 -> 4109 bytes
-rw-r--r--skins/common/images/closewindow.pngbin0 -> 148 bytes
-rw-r--r--skins/common/images/critical-32.pngbin0 -> 2395 bytes
-rw-r--r--skins/common/images/cyrl/button_italic.pngbin460 -> 457 bytes
-rw-r--r--skins/common/images/de/button_bold.pngbin328 -> 308 bytes
-rw-r--r--skins/common/images/de/button_italic.pngbin351 -> 313 bytes
-rw-r--r--skins/common/images/download-32.pngbin0 -> 2057 bytes
-rw-r--r--skins/common/images/fa/button_bold.pngbin500 -> 496 bytes
-rw-r--r--skins/common/images/fa/button_headline.pngbin434 -> 429 bytes
-rw-r--r--skins/common/images/fa/button_italic.pngbin573 -> 563 bytes
-rw-r--r--skins/common/images/fa/button_link.pngbin535 -> 522 bytes
-rw-r--r--skins/common/images/fa/button_nowiki.pngbin1185 -> 963 bytes
-rw-r--r--skins/common/images/gnu-fdl.pngbin1730 -> 1655 bytes
-rw-r--r--skins/common/images/help-question-hover.gifbin0 -> 1246 bytes
-rw-r--r--skins/common/images/help-question.gifbin0 -> 126 bytes
-rw-r--r--skins/common/images/icons/fileicon-c.pngbin2211 -> 1948 bytes
-rw-r--r--skins/common/images/icons/fileicon-cpp.pngbin1882 -> 1577 bytes
-rw-r--r--skins/common/images/icons/fileicon-deb.pngbin4801 -> 4726 bytes
-rw-r--r--skins/common/images/icons/fileicon-djvu.pngbin10752 -> 10615 bytes
-rw-r--r--skins/common/images/icons/fileicon-dvi.pngbin12778 -> 12628 bytes
-rw-r--r--skins/common/images/icons/fileicon-exe.pngbin5680 -> 5627 bytes
-rw-r--r--skins/common/images/icons/fileicon-h.pngbin1191 -> 998 bytes
-rw-r--r--skins/common/images/icons/fileicon-html.pngbin7422 -> 7376 bytes
-rw-r--r--skins/common/images/icons/fileicon-iso.pngbin6450 -> 6304 bytes
-rw-r--r--skins/common/images/icons/fileicon-java.pngbin5989 -> 5901 bytes
-rw-r--r--skins/common/images/icons/fileicon-mid.pngbin6657 -> 6515 bytes
-rw-r--r--skins/common/images/icons/fileicon-o.pngbin2204 -> 1937 bytes
-rw-r--r--skins/common/images/icons/fileicon-ogg.pngbin3750 -> 3346 bytes
-rw-r--r--skins/common/images/icons/fileicon-pdf.pngbin4976 -> 4909 bytes
-rw-r--r--skins/common/images/icons/fileicon-ps.pngbin3012 -> 2985 bytes
-rw-r--r--skins/common/images/icons/fileicon-rm.pngbin2851 -> 2714 bytes
-rw-r--r--skins/common/images/icons/fileicon-rpm.pngbin4103 -> 4000 bytes
-rw-r--r--skins/common/images/icons/fileicon-svg.pngbin5094 -> 4978 bytes
-rw-r--r--skins/common/images/icons/fileicon-tar.pngbin6347 -> 6224 bytes
-rw-r--r--skins/common/images/icons/fileicon-tex.pngbin3997 -> 3937 bytes
-rw-r--r--skins/common/images/icons/fileicon-ttf.pngbin3469 -> 3392 bytes
-rw-r--r--skins/common/images/icons/fileicon-txt.pngbin3638 -> 3582 bytes
-rw-r--r--skins/common/images/icons/fileicon.pngbin1121 -> 884 bytes
-rw-r--r--skins/common/images/info-32.pngbin0 -> 2159 bytes
-rw-r--r--skins/common/images/ksh/button_S_italic.pngbin3206 -> 3201 bytes
-rw-r--r--skins/common/images/mediawiki.pngbin22987 -> 22736 bytes
-rw-r--r--skins/common/images/poweredby_mediawiki_88x31.pngbin1927 -> 3605 bytes
-rw-r--r--skins/common/images/public-domain.pngbin2251 -> 2248 bytes
-rw-r--r--skins/common/images/redirectltr.pngbin381 -> 355 bytes
-rw-r--r--skins/common/images/redirectrtl.pngbin381 -> 359 bytes
-rw-r--r--skins/common/images/remove.pngbin3346 -> 3271 bytes
-rw-r--r--skins/common/images/tick-32.pngbin0 -> 1457 bytes
-rw-r--r--skins/common/images/tipsy-arrow.gifbin0 -> 205 bytes
-rw-r--r--skins/common/images/tooltip_icon.pngbin430 -> 391 bytes
-rw-r--r--skins/common/images/warning-32.pngbin0 -> 1895 bytes
-rw-r--r--skins/common/images/wiki.pngbin24801 -> 24482 bytes
-rw-r--r--skins/common/jquery.js4384
-rw-r--r--skins/common/jquery.min.js433
-rw-r--r--skins/common/metadata.js8
-rw-r--r--skins/common/mwsuggest.js351
-rw-r--r--skins/common/nostalgia.css49
-rw-r--r--skins/common/oldshared.css232
-rw-r--r--skins/common/prefs.js111
-rw-r--r--skins/common/preview.js155
-rw-r--r--skins/common/protect.js26
-rw-r--r--skins/common/quickbar-right.css1
-rw-r--r--skins/common/quickbar.css1
-rw-r--r--skins/common/rightclickedit.js48
-rw-r--r--skins/common/search.css14
-rw-r--r--skins/common/search.js10
-rw-r--r--skins/common/shared.css329
-rw-r--r--skins/common/upload.js50
-rw-r--r--skins/common/wikibits.js414
-rw-r--r--skins/common/wikiprintable.css4
-rw-r--r--skins/common/wikistandard.css212
-rw-r--r--skins/modern/audio.pngbin312 -> 239 bytes
-rw-r--r--skins/modern/document.pngbin270 -> 213 bytes
-rw-r--r--skins/modern/external.pngbin165 -> 143 bytes
-rw-r--r--skins/modern/footer-grad.pngbin149 -> 141 bytes
-rw-r--r--skins/modern/main.css168
-rw-r--r--skins/modern/news_icon.pngbin297 -> 294 bytes
-rw-r--r--skins/modern/print.css3
-rw-r--r--skins/modern/rtl.css9
-rw-r--r--skins/modern/video.pngbin215 -> 178 bytes
-rw-r--r--skins/monobook/IE50Fixes.css10
-rw-r--r--skins/monobook/IE55Fixes.css10
-rw-r--r--skins/monobook/IE60Fixes.css12
-rw-r--r--skins/monobook/IE70Fixes.css8
-rw-r--r--skins/monobook/Opera6Fixes.css2
-rw-r--r--skins/monobook/audio.pngbin312 -> 239 bytes
-rw-r--r--skins/monobook/document.pngbin270 -> 213 bytes
-rw-r--r--skins/monobook/external-rtl.pngbin198 -> 157 bytes
-rw-r--r--skins/monobook/external.pngbin165 -> 143 bytes
-rw-r--r--skins/monobook/main.css115
-rw-r--r--skins/monobook/news_icon.pngbin297 -> 294 bytes
-rw-r--r--skins/monobook/rtl.css22
-rw-r--r--skins/monobook/wiki-indexed.pngbin8205 -> 8013 bytes
-rw-r--r--skins/monobook/wiki.pngbin22987 -> 22736 bytes
-rw-r--r--skins/simple/external.pngbin165 -> 143 bytes
-rw-r--r--skins/simple/main.css11
-rw-r--r--skins/simple/rtl.css185
-rw-r--r--skins/vector/Makefile18
-rw-r--r--skins/vector/csshover.htc144
-rw-r--r--skins/vector/csshover.min.htc12
-rw-r--r--skins/vector/experiments/babaco-colors-a.css109
-rw-r--r--skins/vector/experiments/babaco-colors-b.css67
-rw-r--r--skins/vector/experiments/babaco-colors-c.css91
-rw-r--r--skins/vector/experiments/images/new-border.pngbin124 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/new-portal-break-ltr.pngbin891 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/new-portal-break-rtl.pngbin891 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/page-base-fade.pngbin306 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/page-base-updated.pngbin124 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/tab-active-first.pngbin981 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/tab-active-last.pngbin980 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/tab-fade.pngbin226 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/tab-first.pngbin1057 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/tab-last.pngbin1057 -> 0 bytes
-rw-r--r--skins/vector/experiments/images/tab-new-fade.pngbin216 -> 0 bytes
-rw-r--r--skins/vector/experiments/new-tabs.css322
-rw-r--r--skins/vector/images/arrow-down-icon.pngbin181 -> 188 bytes
-rw-r--r--skins/vector/images/audio-icon.pngbin345 -> 240 bytes
-rw-r--r--skins/vector/images/border.pngbin119 -> 118 bytes
-rw-r--r--skins/vector/images/bullet-icon.pngbin152 -> 137 bytes
-rw-r--r--skins/vector/images/document-icon.pngbin345 -> 172 bytes
-rw-r--r--skins/vector/images/edit-icon.pngbin358 -> 314 bytes
-rw-r--r--skins/vector/images/external-link-ltr-icon.pngbin279 -> 180 bytes
-rw-r--r--skins/vector/images/external-link-rtl-icon.pngbin277 -> 178 bytes
-rw-r--r--skins/vector/images/file-icon.pngbin402 -> 170 bytes
-rw-r--r--skins/vector/images/link-icon.pngbin429 -> 406 bytes
-rw-r--r--skins/vector/images/lock-icon.pngbin370 -> 227 bytes
-rw-r--r--skins/vector/images/mail-icon.pngbin375 -> 245 bytes
-rw-r--r--skins/vector/images/news-icon.pngbin359 -> 217 bytes
-rw-r--r--skins/vector/images/page-base.pngbin119 -> 114 bytes
-rw-r--r--skins/vector/images/page-fade.pngbin253 -> 152 bytes
-rw-r--r--skins/vector/images/portal-break-ltr.pngbin287 -> 206 bytes
-rw-r--r--skins/vector/images/portal-break-rtl.pngbin280 -> 198 bytes
-rw-r--r--skins/vector/images/portal-break.pngbin242 -> 135 bytes
-rw-r--r--skins/vector/images/preferences-base.pngbin119 -> 114 bytes
-rw-r--r--skins/vector/images/preferences-edge.pngbin119 -> 114 bytes
-rw-r--r--skins/vector/images/preferences-fade.pngbin248 -> 126 bytes
-rw-r--r--skins/vector/images/search-fade.pngbin185 -> 132 bytes
-rw-r--r--skins/vector/images/tab-break.pngbin263 -> 162 bytes
-rw-r--r--skins/vector/images/tab-current-fade.pngbin121 -> 115 bytes
-rw-r--r--skins/vector/images/tab-normal-fade.pngbin254 -> 154 bytes
-rw-r--r--skins/vector/images/talk-icon.pngbin377 -> 210 bytes
-rw-r--r--skins/vector/images/user-icon.pngbin345 -> 308 bytes
-rw-r--r--skins/vector/images/video-icon.pngbin395 -> 200 bytes
-rw-r--r--skins/vector/images/watch-icons.pngbin1745 -> 1745 bytes
-rw-r--r--skins/vector/main-rtl.css1128
-rw-r--r--skins/vector/screen.css (renamed from skins/vector/main-ltr.css)425
-rw-r--r--skins/vector/wiki-indexed.pngbin8205 -> 0 bytes
-rw-r--r--skins/vector/wiki.pngbin22987 -> 0 bytes
-rw-r--r--thumb.php13
-rw-r--r--trackback.php102
1641 files changed, 168345 insertions, 86823 deletions
diff --git a/.gitignore b/.gitignore
index a94ae0af..954c371e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
/images/
/cache/
*~
-/LocalSettings.php
-/AdminSettings.php
+/LocalSettings.php*
+/AdminSettings.php*
diff --git a/COPYING b/COPYING
index d7c31ed3..019694a9 100644
--- a/COPYING
+++ b/COPYING
@@ -1,14 +1,15 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
+== GNU GENERAL PUBLIC LICENSE ==
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
+Version 2, June 1991
- Preamble
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
- The licenses for most software are designed to take away your
+=== Preamble ===
+
+The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
@@ -18,48 +19,47 @@ using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
- When we speak of free software, we are referring to freedom, not
+When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
- To protect your rights, we need to make restrictions that forbid
+To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
- For example, if you distribute copies of such a program, whether
+For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
- We protect your rights with two steps: (1) copyright the software, and
+We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
- Also, for each author's protection and ours, we want to make certain
+Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
- Finally, any free program is threatened constantly by software
+Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
- The precise terms and conditions for copying, distribution and
+The precise terms and conditions for copying, distribution and
modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- 0. This License applies to any program or other work which contains
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
@@ -76,7 +76,7 @@ is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
- 1. You may copy and distribute verbatim copies of the Program's
+'''1.''' You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
@@ -87,30 +87,30 @@ along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
- 2. You may modify your copy or copies of the Program or any portion
+'''2.''' You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
+ '''a)''' You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ '''b)''' You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ '''c)''' If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -131,26 +131,26 @@ with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
- 3. You may copy and distribute the Program (or a work based on it,
+'''3.''' You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
+ '''a)''' Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
+ '''b)''' Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
+ '''c)''' Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
@@ -168,8 +168,8 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
@@ -177,7 +177,7 @@ However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
- 5. You are not required to accept this License, since you have not
+'''5.''' You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
@@ -186,7 +186,7 @@ Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
- 6. Each time you redistribute the Program (or any work based on the
+'''6.''' Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
@@ -194,7 +194,7 @@ restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
- 7. If, as a consequence of a court judgment or allegation of patent
+'''7.''' If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
@@ -225,8 +225,8 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
+
+'''8.''' If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
@@ -234,7 +234,7 @@ those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
- 9. The Free Software Foundation may publish revised and/or new versions
+'''9.''' The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
@@ -247,7 +247,7 @@ Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
- 10. If you wish to incorporate parts of the Program into other free
+'''10.''' If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
@@ -255,9 +255,9 @@ make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
- NO WARRANTY
+=== NO WARRANTY ===
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
@@ -267,7 +267,7 @@ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
@@ -277,35 +277,36 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
+ '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
- If you develop a new program, and you want it to be of the greatest
+If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
- To do so, attach the following notices to the program. It is safest
+To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
+ <one line to give the program's name and a brief idea of what it does.>
- 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.
+ Copyright (C) <year> <name of author>
- 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.
+ 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.
- 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
+ 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
Also add information on how to contact you by electronic and paper mail.
@@ -313,10 +314,10 @@ Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
@@ -327,11 +328,12 @@ You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
+ Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
diff --git a/CREDITS b/CREDITS
index 7abe12f0..2842b0c0 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.16 is a collaborative project released under the
+MediaWiki 1.17 is a collaborative project released under the
GNU General Public License v2. We would like to recognize the
following names for their contribution to the product.
@@ -44,6 +44,7 @@ following names for their contribution to the product.
* Nathaniel Herman
* Nicolas Dumazet
* Niklas Laxström
+* Philip Tzou
* Platonides
* Purodha Blissenbach
* Raimond Spekking
@@ -61,39 +62,52 @@ following names for their contribution to the product.
* Thomas Bleher
* Tim Starling
* Tom Gries
+* Trevor Parscal
* Victor Vasiliev
* Yuri Astrakhan
== Patch Contributors ==
* Agbad
* Ahmad Sherif
+* Alejandro Mery
+* Amalthea
* Antonio Ospite
* Azliq7
+* Bawolff
* Borislav Manolov
* Brad Jorsch
* Brent G
* Brianna Laugher
* Carlin
+* Carsten Nielsen
* Conrad Irwin
+* Dan Barrett
* Dan Nessett
* Daniel Arnold
* Denny Vrandecic
* Derk-Jan Hartman
+* DieBuche
* FunPika
* Ireas
+* Jaska Zedlik
* Jeremy Baron
* Jidanni
* Jimmy Xu
+* John Du Hart
+* Jonathan Wiltshire
* Karun Dambietz
* Kim Hyun-Joon
+* Lee Worden
+* Lejonel
* liangent
-* Lucas Garczewski
* Louperivois
+* Lucas Garczewski
* Luigi Corsaro
* Manuel Menal
* Marcin Cieślak
* Marcus Buck
* Marooned
+* Mathias Ertl
* Matthew Britton
* mati
* Max Sikström
@@ -108,16 +122,23 @@ following names for their contribution to the product.
* Nikolaos S. Karastathis
* Olaf Lenz
* Paul Copperman
+* Paul Oranje
* PieRRoMaN
+* quietust
* René Kijewski
* Robert Treat
* RockMFR
* ST47
* Scott Colcord
* Simon Walker
+* Solitarius
* Stefano Codari
* Str4nd
* svip
+* Tisane
+* Umherirrender
+* Ville Stadista
+* Zachary Hauri
== Translators ==
* Anders Wegge Jakobsen
diff --git a/HISTORY b/HISTORY
index 05ad1b29..2cc94aad 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,43 +1,1009 @@
Change notes from older releases. For current info see RELEASE-NOTES.
-== MediaWiki 1.15 ==
-
-=== Changes since 1.15.1 ===
-
-* The installer now includes a check for a data corruption issue with certain
- versions of libxml2 2.7 and PHP earlier than 5.2.9, and also for a PHP bug
- present in the official release of PHP 5.3.1.
-* (bug 20239) MediaWiki:Imagemaxsize does not contain anymore a <br /> tag which
- was displayed to the user
-* (bug 21150) SQLite no longer raise an error when deleting files
-* (bug 20880) Fixed updater failure on SQLite backend
+== MediaWiki 1.16 ==
+
+== Changes since 1.16.4 ==
+
+* (bug 28534) Fixed XSS vulnerability for IE 6 clients. This is the third
+ attempt at fixing bug 28235.
+* (bug 28639) Fixed potential privilege escalation when $wgBlockDisablesLogin
+ is enabled.
+
+== Changes since 1.16.3 ==
+
+* (bug 28507) The change we made in 1.16.3 to fix bug 28235 (XSS for IE 6
+ clients) was not actually sufficient to fix that bug. This release contains
+ a second attempt, hopefully we have fixed it this time.
+
+== Changes since 1.16.2 ==
+
+* (bug 28449) Fixed permissions checks in Special:Import which allowed users
+ without the 'import' permission to import pages from the configured import
+ sources.
+* (bug 28235) Fixed XSS affecting IE 6 and earlier clients only, due to those
+ browsers looking for a file extension in the query string of the URL, and
+ ignoring the Content-Type header if one is found.
+* (bug 28450) Fixed a CSS validation issue involving escaped comments, which
+ led to XSS for Internet Explorer clients and privacy loss for other clients.
+
+== Changes since 1.16.1 ==
+
+* (bug 26642) Fixed incorrect translated namespace due to a regression in the
+ language converter.
+* The interface translations were updated.
+* (bug 27093, CVE-2011-0047): Fixed CSS injection vulnerability.
+* (bug 27094) Fixed server-side arbitrary script inclusion vulnerability.
+ Affects Windows servers only. A malicious file with extension ".php" must
+ exist on the server for the exploit to be effective.
+
+== Changes since 1.16.0 ==
+
+* (bug 24981) Allow extensions to access SpecialUpload variables again
+* (bug 24724) list=allusers was out by 1 (shows total users - 1)
+* (bug 24166) Fixed API error when using rvprop=tags
+* For wikis using French as a content language, Special:Téléchargement works
+ again as an alias for Special:Upload.
+* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16.0)
+* (bug 25248) Fixed paraminfo errors in certain API modules.
+* The installer now has improved handling for situations where safe_mode is
+ active or exec() and similar functions are disabled.
+* (bug 19593) Specifying --server in now works for all maintenance scripts.
+* Fixed $wgLicenseTerms register globals.
+* (bug 26561) Fixed clickjacking vulnerabilities by introducing support for
+ X-Frame-Options. The header value can be configured using $wgBreakFrames and
+ $wgEditPageFrameOptions.
+
+== Changes since 1.16 beta 3 ==
+
+* (bug 23769) Disabled HTML 5 client-side form validation. Was introduced in
+ 1.16 beta 1, but is currently poorly supported by browsers.
+* (bug 23175) Re-added window.ta variable for backwards compatibility.
+* (bug 23264) Fixed breakage of various command line scripts due to extra line
+ endings being inserted by Maintenance::output().
+* Fixed HTTP client functionality with safe_mode=On.
+* Fixed parser tests broken in 1.16 beta 3.
+* For Oracle DB backend: fixed parser tests and table prefix feature.
+* (bug 23767) Fixed PHP warning when REQUEST_URI is blank (IIS issue).
+* Fixed plural function for Northern Sami (se)
+* (bug 23597) Fixed conflicts between ID attributes in the Vector skin and
+ parser-generated heading IDs. Renamed head, panel, head-base and page-base.
+* Disabled $wgHitcounterUpdateFreq>1 feature on SQLite, does not work yet.
+* (bug 23465) Don't ignore the predefined destination filename on
+ Special:Upload after following a red link to a file.
+* In SQLite full-text search feature: fixed "move page" feature, was non-
+ functional.
+* (bug 24565) Fixed Cache-Control headers sent from API modules, to protect
+ user privacy in the case where an attacker can access the wiki through the
+ same HTTP proxy as a logged-in user.
+* Fixed an XSS vulnerability in profileinfo.php for installations with
+ $wgEnableProfileInfo = true (false by default)
+* Fixed a case where an X-Vary-Options header was sent despite $wgUseXVO being
+ false. Fixed a minor header parsing issue when $wgUseXVO = true.
+* Fixed a register_globals arbitrary inclusion vulnerability in
+ MediaWikiParserTest.php, introduced in 1.16 beta 1.
+
+== Changes since 1.16 beta 2 ==
+
+* Fixed bugs in the [[Special:Userlogin]] and [[Special:Emailuser]] handling of
+ invalid usernames.
+* Fixed sorting in [[Special:Allmessages]]
+* (bug 23113) Fixed title in the show/hide links on diff pages
+* (bug 23117) Fixed API rollback, was returning "badtoken" for valid requests
+* (bug 23127) Re-added missing $1 parameter to the uploadtext message
+* Fixed a bug in the Vector skin where personal tools display behind the logo
+* (bug 23139) Fixed a bug in edit conflict resolution, where both textboxes
+ showed the same text.
+* (bug 23115, bug 23124) Fixed various problems with <title> and <h1> elements
+ in page views and previews when the language converter is enabled.
+* (bug 23148) Fixed a local path disclosure vulnerability in ImageMagick image
+ scaling, which was introduced in 1.16 beta 1.
+* Improved error checking on installer.
+* (bug 22970) Fixed a JavaScript error in the upload destination conflict
+ check.
+* (bug 23167) Check the watch checkbox by default if the watchcreations
+ preference is set.
+* (bug 23171) Improve IE6 version check to avoid false positives.
+* (bug 23176) Fixed upload warning override feature "upload new version",
+ broken in 1.16 beta 1.
+* Fixed regression in unwatch links sent out in notification emails. When the
+ mailing job was deferred via the job queue, the title was incorrect.
+* (bug 23534) Fixed SQL query error in API list=allusers.
+* Fixed a bug in uploads for non-JavaScript clients. An empty string was used
+ as the default destination filename, instead of the source filename as
+ expected.
+* (bug 23371) Fixed CSRF vulnerability in "e-mail me my password", "create
+ account" and "create by e-mail" features of [[Special:Userlogin]]
+* (bug 23687) Fixed XSS vulnerability affecting IE clients only, due to a CSS
+ validation issue.
+* Fixed a DoS vulnerability in ImageMagick image scaling. ImageMagick
+ expanded wildcard characters "?" and "*" in image filenames, potentially
+ causing large numbers of images to be scaled in response to a single request.
+ The fix for this involves breaking the scaling of such image filenames until
+ ImageMagick 6.6.1-5 or later is deployed, see bug 23361 for more details.
+* (bug 23608) Fixed invalid HTML in diff pages.
+
+=== Changes since 1.16 beta 1 ===
+
+* Fixed errors in maintenance/patchSql.php
+* (bug 19627) Fix regression from r57867 where HTMLForm would output
+ <element classes="foo bar"> rather than <element class="foo bar">
+* Fixed broken "-r" option to maintenance/lag.php
+* (bug 23076) Fixed login CSRF vulnerability. Logins now require a token to
+ be submitted along with the user name and password.
+
+=== Configuration changes in 1.16 ===
+
+* (bug 18222) $wgMinimalPasswordLength default is now 1
+* $wgSessionHandler can be used to configure session.save_handler
+* $wgLocalFileRepo/$wgForeignFileRepos now have a 'fileMode' parameter to
+ be used when uploading/moving files
+* (bug 18761) $wgHiddenPrefs is a new array for specifying preferences not
+ to be shown to users
+* $wgAllowRealName and $wgAllowUserSkin were deprecated in favor of
+ $wgHiddenPrefs[] = 'realname', but the former are still retained
+ for backwards-compatibility
+* (bug 9257) $wgRCMaxAge now defaults to three months
+* $wgDevelopmentWarnings can be set to true to show warnings about deprecated
+ functions and other potential errors when developing.
+* Subpages are now enabled in the MediaWiki namespace by default. This is
+ mainly a cosmetic change, and does not in any way affect the MessageCache,
+ which was already effectively treating the namespace as if it had subpages.
+* Oracle: maintenance/ora/user.sql script for creating DB user on oracle with
+ appropriate privileges. Creating this user with web-install page requires
+ oci8.privileged_connect set to On in php.ini.
+* Removed UserrightsChangeableGroups hook introduced in 1.14
+* Added $wgCacheDirectory, to replace $wgFileCacheDirectory,
+ $wgLocalMessageCache, and any other local caches which need a place to put
+ files.
+* $wgFileCacheDirectory is no longer set to anything by default, and so either
+ needs to be set explicitly, or $wgCacheDirectory needs to be set instead.
+* $wgLocalMessageCache has been removed. Instead, set $wgUseLocalMessageCache
+ to true
+* Removed $wgEnableSerializedMessages and $wgCheckSerialized. Similar
+ functionality is now available via $wgLocalisationCacheConf.
+* $wgMessageCache->addMessages() is deprecated. Messages added via this
+ interface will not appear in Special:AllMessages.
+* $wgRegisterInternalExternals can be used to record external links pointing
+ to same server
+* (bug 19907) $wgCrossSiteAJAXdomains and $wgCrossSiteAJAXdomainExceptions added
+ to control which external domains may access the API via cross-site AJAX.
+* $wgMaintenanceScripts for extensions to add their scripts to the default list
+* $wgMemoryLimit has been added, default value '50M'
+* $wgExtraRandompageSQL is deprecated, the SpecialRandomGetRandomTitle hook
+ should be used instead
+* (bug 20489) $wgIllegalFileChars added to override the default list of illegal
+ characters in file names.
+* (bug 19646) $wgImgAuthDetails added to display reason access to uploaded file
+ was denied to users(img_auth only)
+* (bug 19646) $wgImgAuthPublicTest added to test to see if img_auth set up
+ correctly (img_auth only)
+* $wgUploadMaintenance added to disable file deletions and restorations during
+ maintenance
+* $wgCapitalLinkOverrides added to configure per-namespace capitalization
+* (bug 21172) $wgSorbsUrl can now be an array with multiple DNSBL and renamed
+ to $wgDnsBlacklistUrls (backward compatibility kept)
+* $wgEnableHtmlDiff has been removed
+* (bug 3340) $wgBlockCIDRLimit added (default: 16) to configure the low end of
+ CIDR ranges for blocking
+* $wgUseInstantCommons added for quick and easy enabling of Commons as a remote
+ file repository
+* $wgDBAhandler added to choose a DBA handler when using CACHE_DBA
+* $wgPreviewOnOpenNamespaces for extensions that create namespaces that behave
+ similarly to the category namespace.
+* $wgEnableSorbs renamed to $wgDnsBlacklistUrls ($wgEnableSorbs kept for
+ backward compatibility)
+* $wgUploadNavigationUrl now also affects images inline images that do not
+ exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
+ it as appropriate.
+* If $wgLocaltimezone is null, use the server's timezone as the default for
+ signatures. This was always the behaviour documented in DefaultSettings.php
+ but has not been the actual behaviour for some time: instead, UTC was used
+ by default.
+* Added $wgExtensionAssetsPath, to decouple assets serving from $wgScriptPath.
+ If not specified it will default to $wgScriptPath/extensions
+* Added $wgCountTotalSearchHits to make search UI display total number of hits
+ with some search engines.
+* Added $wgAdvertisedFeedTypes to decide what feed types (RSS, Atom, both, or
+ neither) MediaWiki advertises. Default is array( 'atom' ), so RSS is no
+ longer advertised by default (but it still works).
+* Added $wgMemCachedTimeout, controls how long to wait for data from the
+ memcached servers.
+* New configuration variables $wgDebugTimestamps and $wgDebugPrintHttpHeaders
+ for controlling debug output.
+* New $wgBlockDisablesLogin when set to true disallows blocked users from
+ logging in.
+* (bug 8790) Metadata edition ($wgUseMetadataEdit) has been moved to a separate
+ extension "MetadataEdit".
+
+=== New features in 1.16 ===
+
+* Add CSS defintion of the 'wikitable' class to shared.css
+* (bug 17163) Added MediaWiki:Talkpageheader which will be displayed when
+ viewing talk pages
+* Superfluous border="0" removed from images
+* Added new hook 'MessageCacheReplace' into MessageCache.php. For instance
+ to allow extensions to update caches in similar way as MediaWiki invalidates
+ a cached MonoBook sidebar
+* Special:AllPages: Move hardcoded styles from code to CSS
+* (bug 18529) New hook: SoftwareInfo for adding information about the software
+ to Special:Version
+* Added $wgExtPGAlteredFields to allow extensions to easily alter the data
+ type of columns when using the Postgres backend.
+* (bug 16950) Show move log when viewing/creating a deleted page
+* (bug 18242) Show the Subversion revision number per extensions in
+ Special:Version
+* (bug 18420) Missing file revisions are handled gracefully now
+* (bug 9219) Auth plugins can control editing RealName/Email/Nick preferences
+* (bug 18466) Add note or warning when overruling a move (semi-)protection
+* (bug 18342) insertTags works in edit summary box
+* (bug 18411) The upload form also checks post_max_size
+* Watchlist now has a specialized <div> tag that contains a unique class for
+ each page
+* Added Minguo calendar support for the Taiwan Chinese language
+* Database: unionQueries function to be used for UNION sql construction, so
+ it can be overloaded on DB abstraction level for DB specific functionality
+* (bug 18849) Implement Japanese and North Korean calendars
+* (bug 5755) Introduce {{CURRENTMONTH1}} and {{LOCALMONTH1}} to display the
+ month number without the leading zero
+* (bug 13456) categoriespagetext supports PLURAL
+* (bug 18860) Blocks of IPs affecting registered users can now block email
+* (bug 17093) Date and time are separate parameters in Special:BlockList
+* (bug 11484) Added ISO speed rating to default collapsed EXIF metadata view
+* (bug 14866) Messages 'recentchangeslinked-toolbox' and
+ 'recentchangeslinked-toolbox' were added to allow more fine grained
+ customisation of the user interface
+* DISPLAYTITLE now accepts a limited amount of wiki markup (the single-quote
+ items)
+* Special:Search now could search terms in all variant-forms. ONLY apply on
+ wikis enabled LanguageConverter.
+* Add autopromote condition APCOND_BLOCKED to autopromote blocked users to
+ various user groups.
+* Add $wgRevokePermissions as a means of restricting a group's rights. The
+ syntax is identical to $wgGroupPermissions, but users in these groups will
+ have these rights stripped from them.
+* Added a PHP port of CDB (constant database), for improved local caching when
+ the DBA extension is not available.
+* Introduced a new system for localisation caching. The system is based around
+ fast fetches of individual messages, minimising memory overhead and startup
+ time in the typical case. The database backend will be used by default, but
+ set $wgCacheDirectory to get a faster CDB-based implementation.
+* Expanded the number of variables which can be set in the extension messages
+ files.
+* Added a feature to allow per-article process pool size control for the parsing
+ task, to limit resource usage when the cache for a heavily-viewed article is
+ invalidated. Requires an external daemon.
+* (bug 19576) Moved the id attribues from the anchors accompanying section
+ headers to the <span class="mw-headline"> elements within the section headers,
+ removing the redundant anchor elements.
+* Parser::setFunctionTagHook now can be used to add a new tag which is parsed at
+ preprocesor level.
+* Added $wgShowArchiveThumbnails, allowing sysadmins to disable thumbnail
+ display for old versions of images.
+* In watchlists and Special:RecentChanges, the difference in page size now
+ appears in dark green if bytes were added and dark red if bytes were removed.
+* Added FSRepo configuration properties thumbUrl and thumbDir, to allow the
+ thumbnails to be stored in a separate location to the source images.
+* If config/ directory is not executable, the command to make it executable
+ now asks the user to cd to the correct directory
+* Add experimental new external authentication framework, ExternalAuth
+* (bug 18768) Remove AdminSettings requirements. Maintenance environment
+ will still load it if it exists, but it's not required for anything
+* (bug 19900) The "listgrouprights-key" message is now wrapped in a div with
+ class "mw-listgrouprights-key"
+* (bug 471) Allow RSS feeds for watchlist, using an opt-in security token
+* (bug 10812) Interwiki links can have names and descriptions, fetched from
+ message 'interwiki-desc-PREFIX', not really used anywhere yet though
+* (bug 9691) Add type (signup or login) parameter to
+ AuthPlugin::ModifyUITemplate()
+* (bug 14454) "Member of group(s)" in Special:Preferences causes language
+ difficulties
+* (bug 16697) Unicode combining characters are difficult to edit in some
+ browsers
+* Parser test supports uploading results to remote CodeReview instance
+* (bug 20013) Added CSS class "mw-version-ext-version" is wrapped on the
+ extension version in Special:Version
+* (bug 20014) Added CSS class "mw-listgrouprights-right-name" is wrapped on the
+ right name in Special:ListGroupRights
+* (bug 12920) New CoreParserFunction {{nse:...}} as an url-friendly equivalent
+ to {{ns:...}}
+* (bug 16322) Allow maintenance scripts to accept DB user/pass over input or
+ params
+* (bug 18566) Maintenance script to un/protect pages
+* (bug 671) The HTML <abbr> tag is now permitted.
+* RecentChanges now has a legend to explain what the Nmb! flags mean, and the
+ flags have tooltips.
+* (bug 15209) New hook BeforeInitialize called after everything has been setup
+ but before Mediawiki::performRequestForTitle()
+* wgMainPageTitle variable now available to JavaScript code to identify the main
+ page link, so it doesn't have to be extracted from the link URLs.
+* (bug 16836) Display preview of signature in user preferences and describe its
+ use
+* The default output format is now HTML 5 instead of XHTML 1.0 Transitional.
+ This can be disabled by setting $wgHtml5 = false;. Specific features enabled
+ if HTML 5 is used:
+** Some extra inputs will be autofocused, in supporting browsers.
+** The summary attribute has been removed from tables of contents. summary is
+ obsolete in HTML 5 and wasn't useful here anyway.
+** Unnecessary type="" attribute removed for CSS and JS.
+** If $wgWellFormedXml is set to false, some bytes will be shaved off of HTML
+ output by omitting some things like quotation marks where HTML 5 allows.
+** (bug 16921) maxlength enabled for page move comments
+* The description message in $wgExtensionCredits can be an array with parameters
+* New hook SpecialRandomGetRandomTitle allows extensions to modify the selection
+ criteria used by Special:Random and subclasses, or substitute a custom result,
+ deprecating the $wgExtraRandompageSQL config variable
+* (bug 20318) Distinct CSS classes for ISBN/RFC/PMID special links added
+* (bug 20404) Custom fields in the user creation form template can now have
+ detail labels in prefsectiontip divs.
+* MakeSysop and MakeBot are now aliases for Special:UserRights
+* IndexPager->mLimitsShown can now be an associative array of limit => text-to-
+ display-in-limit-form.
+* (bug 18880) LogEventsList::showLogExtract() can now take a string-by-reference
+ and add its HTML to it, rather than having to go straight to $wgOut.
+* Added $wgShowDBErrorBacktrace, to allow users to easily gather backtraces for
+ database connection and query errors.
+* Show change block / unblock link on Special:Contributions if user is blocked
+* Display note on Special:Contributions if the user is blocked, and provide an
+ excerpt from the block log.
+* (bug 19646) New hook: ImgAuthBeforeStream for tests and functionality before
+ file is streamed to user, but only when using img_auth
+* Note on non-existing user and user talk pages if user does not exist
+* New hook ShowMissingArticle so extensions can modify the output for
+ non-existent pages.
+* Admins could disable some variants using $wgDisabledVariants now. ONLY apply
+ on wikis enabled LanguageConverter.
+* (bug 16310) Credits page now lists IP addresses rather than saying the number
+ of anonymous users that edited the page
+* New permission 'sendemail' added. Default right for all registered users. Can
+ for example be used to prevent new accounts from sending spam.
+* (bug 16979) Tracking categories for __INDEX__ and __NOINDEX__
+* Two new hooks, ConfirmEmailComplete and InvalidateEmailComplete, which are
+ called after a user's email has been successfully confirmed or invalidated.
+* (bug 19741) Moved the XCF files out of the main MediaWiki distribution, for
+ a smaller subversion checkout.
+* (bug 13750) First letter capitalization can now be a per-namespace setting
+* (bug 21073) "User does not exist" message no longer displayed on sub-sub-pages
+ of existing users
+* (bug 21095) Tracking categories produced by the parser (expensive parser
+ function limit exceeded, __NOINDEX__ tracking, etc) can now be disabled by
+ setting the system message ([[MediaWiki:expensive-parserfunction-category]]
+ etc) to "-".
+* Added maintenance script sqlite.php for SQLite-specific maintenance tasks.
+* Rewrote Special:Upload to allow easier extension.
+* Upload errors that can be solved by changing the filename now do not require
+ reuploading.
+* Added $wgRateLimitsExcludedIPs, to allow specific IPs to be whitelisted from
+ rate limits.
+* (bug 21222) When $wgUseTeX is not enabled, <math> is no longer registered with
+ the parser so extensions are free to implement their own <math> tag
+* (bug 21047) Wrap 'cannotdelete' into a div with the generic 'error' class and
+ an own 'mw-error-cannotdelete' class
+* New hook AbortNewAccountAuto, called before account creation from AuthPlugin-
+ or ExtUser-driven requests.
+* (bug 3480) The warning saying that the page has a history when deleting it now
+ contains the number of revisions in the history
+* $wgStylePath and $wgLogo are now set in the default LocalSettings.php file.
+* (bug 20186) Allow filtering history for revision deletion.
+* New hook OtherBlockLogLink, called in Special:IPBlockList and Special:Block
+ to show links to block logs of other blocking extensions, i.e. GlobalBlocking
+* Added search capabilities to SQLite backend
+* rebuildtextindex.php maintenance script now supports databases other than
+ MySQL
* upgrade1_5.php now requires to be run --update option to prevent confusion
-* Fixed a CSS validation issue which allowed external images to be included
- into wikis where that is disallowed by configuration.
-* Fixed a data leakage vulnerability for private wikis using img_auth.php or
- similar image access authentication schemes. Check user permissions before
- streaming out scaled images from thumb.php.
-
-=== Changes since 1.15.0 ===
+* (bug 17662) Customizable default preload/editintro for new sections in the
+ respective addsection-preload and addsection-editintro messages
+* Added maintenance script checkSyntax.php that checks for PHP syntax errors
+ and common coding mistakes
+* Updated Unicode normalization tables
+* (bug 21604) Spellcheck attribute for editsummary
+* New wgCategories JavaScript global variable for userscripts.
+* (bug 20717) Added checkboxes to hide users with bot and/or sysop group
+ membership in SpecialActiveusers
+* Allow \pagecolor and \definecolor in texvc
+* $wgTexvcBackgroundColor contains background color for texvc call
+* (bug 21574) Redirects can now have "303 See Other" HTTP status
+* EditPage refactored to allow extensions to derive new edit modes much easier.
+* (bug 21826) Subsections of Special:Version now also have anchors
+* (bug 19791) Add URL of file source as comment to thumbs (for ImageMagick)
+* (bug 21946) Sorted wikitables do not properly handle minus signs
+* (bug 18885) Red links for media files do not support shared repositories
+* Added $wgFixArabicUnicode, to convert deprecated presentation forms in
+ Arabic text to their modern equivalents, and $wgFixMalayalamUnicode, to
+ convert ZWJ-based chillu sequences in Malayalam text to their Unicode 5.1
+ equivalents.
+* (bug 22051) Returing false in SpecialContributionsBeforeMainOutput hook now
+ stops normal output
+* Send new password e-mail in users preference language
+* LanguageConverter now support nested using of manual convert syntax like
+ "-{-{}-}-"
+* Upload license preview now uses the API instead of action=ajax
+* (bug 7346) Add <guid> to RSS to avoid duplicates
+* (bug 19996) Added new hooks for Special:Search, which allow to further
+ restrict/expand it.
+* (bug 21936) When a revision has been patrolled, there's now a link back to the
+ article
+* (bug 22315) SpecialRecentChangesQuery hook now pass $query_options and checks
+ the return value
+* Separate unit test suites under t/ and tests/ were merged and moved to
+ maintenance/tests/.
+* importImages.php maintenance script can now use the original uploader and
+comment from another wiki.
+* Support for Turck MMCache was removed
+* (bug 14592) Warn users when they try to move their user page that their
+ account will not be renamed
+* Show block log on non-existing user (talk) pages of currently blocked users
+
+=== Bug fixes in 1.16 ===
+
+* (bug 18031) Make namespace selector on Special:Export remember the previous
+ selection
+* The svn-version version numbers on Special:Version have been removed
+* (bug 17374) Special:Export no longer exports two copies of the same page
+* (bug 18190) Proper parsing in MediaWiki:Sharedupload message
+* (bug 17617) HTML cleanup for ImagePage
+* (bug 17964) namespaceDupes.php no longer fails on an empty interwiki table
+* Improved error handling for image moving
+* (bug 17974) On Special:SpecialPages, restricted special pages are now marked
+ with <strong> tags, helps with text-based browsers
+* (bug 18259) Special:DeletedContributions now also uses
+ MediaWiki:Sp-contributions-logs for the link to Special:Log
+* Don't add empty title="" attributes to links to anchors on the current page
+* (bug 18291) rebuildrecentchanges.php failed to add deletion log entries
+* (bug 18304) rebuildrecentchanges.php got size changes wrong
+* (bug 18170) Fixed a PHP warning in Parser::preSaveTransform() in PHP 5.3
+* (bug 18289) Database connection error page now returns correct HTML
+* "successbox", "errorbox" and related CSS classes are now available in all
+ skins
+* (bug 18316) Removed superfluous name="fulltext" from Special:Search
+* (bug 18331) MediaWiki:Undelete-revision can now have wikitext
+* The "noautoblock" flag is no longer displayed in the block log when blocking
+ an IP address
+* (bug 18009) $wgHooks and $wgExtensionFunctions now support closures
+* (bug 17948) Maintenance scripts now exit(0) or exit(1) as appropriate
+* (bug 18377) Time in Enhanced ChangesList lacking localisation
+* (bug 12998) Allow <sup>, <sub>, etc. in DISPLAYTITLE
+* (bug 1553) Lowercase navigation headings in German
+* (bug 7830) Pending transactions failed to commit on loginToUse() error
+* (bug 11613) session.save_handler being over-ridden
+* (bug 11381) session.save_handler being set twice (causes error)
+* (bug 17835) ForeignAPIRepo throwing error on first page load for file
+* (bug 18115) ForeignAPIRepo cache isn't working
+* Fixed a bug caused by LanguageConverter.php, which brings an abnormal '}-'
+ after some parsed math syntax.
+* (bug 18441) rebuildrecentchanges.inc no longer ignores $wgLogRestrictions
+* (bug 18317) Bolded selections in 1 | 3 | etc days on RecentChanges now use
+ <strong> instead of hardcoded styles
+* (bug 18449) Fixed items number per column on category pages when the total is
+ divisible by 3
+* (bug 18121) maintenance/deleteArchivedRevisions.php no longer deletes
+ revisions when --delete is not passed
+* (bug 13172) GPS coordinates in image Exif data are now actually displayed
+* Overhaul of preferences system, includes the following bug fixes:
+** (bug 5363) Changes to default preferences now impact registered users.
+** (bug 14806) Hook to enable putting preferences in existing tabs.
+** (bug 17191) Registration date now listed on preferences page.
+** The user_properties table (now used for storing preferences) has been added
+ to $wgSharedTables.
+** Note that this change will break some extensions which have not been adapted
+ for it.
+* (bug 17020) Adding fallback encodings for Traditional and Simplified Chinese
+ languages while the the text is typed as URLs.
+* (bug 17614) Prev / Next links are not shown if all results are shown
+* (bug 18207) Strange spacing before [[irc:...]] links
+* Removed float from the user login form in RTL interface - caused display
+ problems in FF2
+* (bug 15008) Redirect images are now subject to Bad image list rules
+* (bug 6802) profileinfo.php now also work on other database servers than MySQL
+* (bug 16925) Diffs no longer fail when $wgExternalDiffEngine is set to
+ 'wikidiff' or 'wikidiff2' but extension is not installed
+* (bug 18326) Chmod errors in file repos have been hidden
+* (bug 18718) Comma after a } create a error in IE
+* (bug 18716) Removed redundant class in Modern skin CSS for category links and
+ tweaked spacing.
+* (bug 18656) Use proper directory separators in wfMkdirParents()
+* (bug 18549) Make Special:Blockip respect $wgEnableUserEmail and
+ $wgSysopEmailBans
+* (bug 16912) Tooltips on images with link= disappear
+* (bug 18389) Localise numbers in EXIF data
+* (bug 18522) Wrap MediaWiki:Protect-cascadeon in a div for identification
+* (bug 18438) Tweak HTML for preview bar for consistency and accessibility
+* (bug 18432) Updated documentation for dumpBackup.php
+* Fix array logic in Sanitizer::removeHTMLtags so that it doesn't strip good
+ tags that were redundantly defined.
+* (bug 14118) SpecialPage::getTitleFor does not return a localised name
+* (bug 18698) Renaming non entry point maintenance scripts from .inc.php to
+ .inc
+* Deprecated methods Title::getInterwikiLink, Title::userCanCreate(),
+ Title::userCanEdit() and Title::userCanMove() have been removed
+* Only show upload links on file description if $wgEnableUploads = true
+ and user can upload
+* Don't say "You need to log in to upload/move", because it's possible that
+ uploading/moving is disabled for registered users as well (e.g. only sysops)
+* (bug 18943) Handle invalid titles gracefully at Special:Mostlinked
+* (bug 8873) Enable variant conversion in text on 'alt' and 'title' attributes
+* (bug 10837) Introducing the StubUserVariant class to determine the variant
+ variable instead of using this to overrules the user language preference.
+* (bug 19014) If user had deletedhistory right, but not undeleted right, then
+ show "view" instead of "view/restore" on logs.
+* (bug 19017) TOC level calculation error in an odd case
+* (bug 18999) CSS update for RTL interwiki links
+* (bug 18925) history.js removes class names of list elements on initialization
+* Multiple whitespace in TOC anchors is now stripped, for consistency with the
+ link from the edit comment
+* (bug 19112) Preferences now respects $wgUseExternalEditor
+* (bug 18173) MediaWiki now fails when unable to determine a client IP
+* (bug 19170) Special:Version should follow the content language direction
+* (bug 19160) maintenance/purgeOldText.inc is now compatible with PostgreSQL
+* Fixed performance regression in "bad image list" feature
+* Show user preference 'Use live preview' if $wgLivePreview is enabled only
+* (bug 17014) Blocked users can no longer use Special:UserRights unless they
+ can add/remove *all* groups (have 'userrights' permission).
+* (bug 19294) Always show Sp-contributions-footer(-anon)
+* Attempts to restrict reading of pages while anonymous viewing is allowed
+ via extensions not using the userCan hook and via $wgRevokePermissions now
+ work.
+* (bug 8445) Multiple-character search terms are now handled properly for
+ Chinese
+* (bug 19450) Use formatNum for "Number of edits" in Special:Preferences
+* (bug 11242) Check for MySQL storage engines during installation now checks
+ whether the engines are actually available
+* (bug 19390) Omit the "printable version" link on the printable version
+* (bug 18394) img_auth.php now respects userCan
+* (bug 19509) Uploading to a file named '0' previously treated it as null input
+ and attempted to upload with the source name. Now warns about not having an
+ extension (since 0.ext is perfectly valid)
+* (bug 19468) Enotif preferences are now only displayed when they are turned on
+* (bug 19442) Show/hide options on watchlist only work once
+* (bug 19602) PubMed Magic links now use updated NIH url
+* (bug 19637) externallinks have links to self
+* Don't load Opera 9.5 RTL fixes for Opera 9.6
+* Remove five-year-old KHTMLFixes.css, which is unlikely to be relevant anymore
+ and was causing problems.
+* Removed repetition of URIs in the title attributes of external links.
+* (bug 19693) User name is now escaped in "Contributions for ..." link on
+ Special:BlockIP
+* (bug 19571) Override buildConcat for SQLite.
+* Log in and log out links no longer return to page view when clicked from
+ history view, edit page, or something similar
+* (bug 19513) RTL fixes for new Search UI
+* (bug 16497) Special:Allmessages is paginated
+* (bug 18708) CSS plainlinks class now available to all skins
+* (bug 19590) Database error messages no longer have "MySQL" hardcoded as the
+ database type
+* (bug 19759) successbox on Special:Preferences now correctly aligned on
+ standard, nostalgia and cologneblue skin
+* (bug 19814) interwiki links from file links ([[File:Foo.jpg|link=de:Test]])
+ are no longer recorded in the pagelinks table
+* (bug 19784) date option "ISO 8601" produced illegal id
+* (bug 19761) Removed autogenerated <meta keywords> tag with link data.
+ Keyword set was not useful, and is ignored by modern search engines anway.
+* (bug 19827) Special:SpecialPages title is "Upload file
+* (bug 19355) Added .xhtml, .xht to upload file extension blacklist
+* (bug 19287) Workaround for lag on history page in Firefox 3.5
+* (bug 19564) Updated docs/hooks.txt
+* (bug 18751) Fix for buggage in profiling setup for some extensions on PHP 5.1
+* (bug 17139) ts_resortTable inconsistent trimming makes date sorting fragile
+* (bug 19445) Change oldimage table to use ON UPDATE CASCADE for FK to image
+ table.
+* (bug 14080) Short notation links to subpages didn't work in edit summaries
+* (bug 17374) Special:Export no longer exports multiple copies of pages
+* (bug 19818) Edits to user CSS/JS subpages can now be marked as patrolled by
+ users who can't edit them
+* (bug 19839) Comments in log items are no more double escaped
+* (bug 18161) Fix inconsistent separators in watchlist link toolbars with
+ "enhanced recent changes"
+* (bug 16877) Moving a page over a redirect no longer leaves an orphan entry in
+ the recentchanges table
+* (bug 16009) Limit selection forms based on Pager now links to the correct page
+ when using long urls
+* The display of the language list on the preferences is more comply with the
+ BCP 47 standards.
+* (bug 19849) Custom X-Vary-Options header now disabled unless $wgUseXVO is set
+* (bug 19301) Duplicates entries in $wgAddGroups, $wgRemoveGroups,
+ $wgGroupsAddToSelf and $wgGroupsRemoveFromSelf are no more displayed on
+ Special:ListGroupRights
+* (bug 18799) Special:Userlogin now handles correctly the returnto parameter
+ to not link back to Special:Userlogout when user's language isn't the same as
+ content's language
+* (bug 19479) Show proper error message when unable to connect to PostgreSQL
+ database with username/password in MediaWiki's setup
+* (bugs 18407, 18409) Special:Upload is now listed on Special:Specialpages only
+ if uploads are enabled and the user can access it
+* (bug 17988) Spaces before [[Category:]] links are no longer ignored
+* (bug 19957) All known-failing tests now marked disabled; added --run-disabled
+ option to parser test suite to run disabled tests if desired.
+* (bug 16311) Make recent change flags (n/m/b) <abbr>s instead of <span>s
+* (bug 15680) Split the edit tip message of user CSS/JS subpage into
+ "usercssyoucanpreview" and "userjsyoucanpreview" respectively.
+* (bug 12110) Split the rights for editing users' CSS/JS subpage from
+ "editusercssjs" into "editusercss" and edituserjs" respectively.
+* (bug 19394) RecentChanges feed URLs for log items with no revisions
+ (eg Newuser, Userrights) are no longer broken
+* (bug 17395) Remote file descriptions use user language ($wgLang), not wiki
+ language ($wgContLang)
+* (bug 11867) Lock error on redirect table when running orphans.php
+* (bug 18930) initStats.php now refreshes active users count
+* (bug 18699) Using the nosummary URL option no longer triggers the "You have
+ not provided a summary" warning for those who activated it in their
+ preferences
+* (bug 18855) commandLine.inc and Maintenance.php are now properly included
+ using the full path
+* (bug 18497) Fixed broken style sheets in Opera fullscreen mode
+* (bug 16084) Default memory limit has be increased to 50M, see $wgMemoryLimit
+* (bug 17864/19519) Added proper input normalization in Special:UserRights
+* (bug 20086) Add Hook to add extra statistics at the end of Special:Statistics
+* (bug 19289) importDump.php can now handle bzip2 and 7zip
+* (bug 20131) Fixed a PHP notice for users having the "rollback" right on
+ Special:RecentChangesLinked
+* Do not transform EXIF fields with pure text to avoid results like
+ foo,bar@example,com
+* (bug 20176) Fix login/logout links in skin CologneBlue
+* (bug 20203) "Powered by Mediawiki" now has height/width on image tag
+* (bug 20273) Fix broken output when no pages are found in the content
+ namespaces
+* (bug 20265) Make AncientPages and UnusedFiles work on SQLite
+* Fixed XSS vulnerability for Internet Explorer clients (only pre-release
+ versions of MediaWiki were affected).
+* (bug 14817) Moving a page to a subpage of itself moves it twice
+* (bug 20289) $wgMaximumMovedPages should only count pages actually moved
+* (bug 15248) Non-breaking spaces and certain other Unicode space characters
+ are now normalized to ordinary spaces in titles; if your wiki has existing
+ titles with such characters, run cleanupTitles.php and/or cleanupImages.php
+* (bug 11143) Links containing invalid UTF-8 percent-code sequences are now
+ cleanly disabled instead of breaking parsing entirely on PHP 5.2.
+* (bug 20296) Fixed an PHP warning in Language::getMagic() in PHP 5.3
+* (bug 20358) Unprotect tab was missing accesskey; now same as protect tab.
+* (bug 20317) Cleaned up default main page link accesskey settings
+* (bug 20362) Special:Statistics now produces valid HTML when view counters are
+ enabled
+* (bug 19857) maintenance/deleteRevision.php on last revision no longer breaks
+ target page
+* (bug 20365) Page name with with c/g/h/j/s/u + x are now correctly handled in
+ Special:MovePage with Esperanto as content language
+* (bug 20364) Fixed regression in GIF metadata loading
+* (bug 20299) MediaWiki:Move-subpages and MediaWiki:Move-talk-subpages can now
+ use wikitext
+* (bug 15475) DatabaseBase::setFlag(), DatabaseBase::clearFlag() and
+ DatabaseBase::getFlag() now have documentation
+* (bug 19966) MediaWiki:License-header is now used for the licensing header in
+ the file description page instead of MediaWiki:License
+* (bug 20380) Links to history/deleted edits at the top of
+ Special:RevisionDelete are no more displayed when when doing log suppression
+* (bug 8143) Localised parser function names are now correctly case insensitive
+ if they contain non-ASCII characters
+* (bug 19055) maintenance/rebuildrecentchanges.php now purges
+ Special:Recentchanges's RSS and Atom feed cache
+* The installer will now try to bypass PHP's max_execution_time
+* (bug 20260) SQLite no longer tries to automatically create the database at
+ execution time, this now happens only at install time; if it is not available
+ at script execution, it now throws an exception
+* Fixed EditFilterMerged hook so the hookError parameter serves a purpose
+ (analogous to EditFilter hook)
+* (bug 2257) Tag extensions can expand template parameters provided to the tag,
+ by using a new parameter added to the recursiveTagParse function
+* (bug 14900) __INDEX__ and __NOINDEX__ no longer override site config set in
+ $wgArticleRobotPolicies.
+* (bug 20466) Hidden categories are no more displayed when printing
+* (bug 20446) When changing user rights with User@remotewiki and remotewiki is
+ the local wiki, the user is now treated as the local user
+* (bug 20494) OutputPage::getArticleBodyOnly() no longer requires an useless
+ argument
+* (bug 20136) Protection form JavaScript now synchronizes the expiry boxes on
+ any change, in addition to onkeyup.
+* Don't link to "edit this page" on MediaWiki:Noarticletext if user is not
+ allowed to create page. Done via new message
+ MediaWiki:Noarticletext-nopermission
+* Improved compatibility between the Vector skin and addPortletLink() from
+ wikibits.js: empty portlets are now present but hidden, adding an element to a
+ portlet unhides it
+* (bug 19531) addPortletLink() now wraps inserted labels in a <span> element to
+ be compatible with the CSS for the Vector skin
+* (bug 20578) Wrong localized image metadata - duplicated string?
+* (bug 20556) Stub threshold's "other" <input> in Special:Preferences now has a
+ correct type="text" parameter
+* (bug 482) Don't include TOC in the printable version if it has been hidden
+* Adjust the time according to the user configuration on Special:Revisiondelete
+* (bug 20624) Installation no longer allows "qqq" as the chosen language
+* (bug 20634) The installer-created database user will now have all rights on
+ the database so that upgrades will go more smoothly.
+* (bug 18180) Special:Export ignores limit, dir, offset parameters
+* User::getBlockedStatus() works for all kinds of user objects and doesn't
+ assume the user object is equal to the current-user object ($wgUser)
+* (bug 20517) Cancel link from edit page now returns to the old version when
+ editing an old version
+* (bug 16902) Installer no longer shows warnings when exec() has been disabled
+ by disable_functions
+* (bug 20726) Title::getLatestRevID's documentation now says that the function
+ returns false if the page doesn't exist
+* (bug 20751) ForeignApiRepo now urldecodes filenames when saving to local cache
+* (bug 20730) Fix to Special:Version ViewVC link for branch checkouts
+* (bug 20353) wfShellExec() was adding extra quotes on Windows Vista, causing
+ command line scripts to fail
+* (bug 20702) Parser functions can now be used correctly in
+ MediaWiki:Missing-article
+* (bug 14117) "redirected from" is now also shown on foreign file redirects
+* (bug 17747) Only display thumbnail column in file history if the image can
+ be rendered.
+* (bug 3421) Live preview no longer breaks user CSS/JS previews
+* (bug 11264) The file logo on a file description page for documents (PDF, ...)
+ now links to the file rather than the file description page
+* Password fields built with HTMLForm now still have the type="password"
+ attribute if $wgHtml5=false.
+* (bug 20836) Preload now works for MediaWiki namespace
+* (bug 20885) Search box no longer suggests unavailable special pages
+* (bug 20948) "Create this page" on Special:Search is no longer displayed when
+ searching for special pages
+* (bug 20524) Hideuser: Show nice error when trying to block hidden user without
+ hideuser right
+* (bug 21026) Fixed file redirects on shared repos on non-English client wikis
+* (bug 21030) Fixed schema choices from being overwritten by defining unique
+ field names per driver.
+* (bug 21115) wgCanonicalSpecialPageName javascript variable is now always
+ false on non-special pages
+* (bug 21113) "Other statistics" header on Special:Statistics is no more
+ displayed when there isn't any entry in it
+* (bug 21114) Special:Contributions no longer shows diff links for new
+ revisions
+* (bug 21116) MediaWiki:Templatesused, MediaWiki:Templatesusedpreview and
+ MediaWiki:Templatesusedsection now support plural
+* (bug 21079) There is no more line wrapping between label and field in
+ Special:Log
+* (bug 20256) Fixed SQL errors on Special:Recentchanges and
+ Special:Recentchangeslinked on SQLite backend
+* (bug 20880) Fixed updater failure on SQLite backend
+* (bug 21182) Fixed invalid HTML in Special:Listgrouprights
+* (bug 20242) Installer no longer promts for user credentials for SQLite
+ databases
+* (bug 20911) Installer failed to create a SQLite database
+* (bug 20847) Deprecated deprecated akeytt() removed in wikibits.js leaving
+ dummy
+* (bug 21161) Changing $wgCacheEpoch now always invalidates file cache
+* (bug 20268) Fixed row count estimation on SQLite backend
+* (bug 20275) Fixed LIKE queries on SQLite backend
+* (bug 21234) Moving subpages of titles containing \\ now works properly
+* (bug 21006) maintenance/updateArticleCount.php now works again on PostgreSQL
+* (bug 19319) Add activeusers-intro message at top of SpecialActiveUsers page
+* (bug 21255) Fixed hostname construction for DNSBL checking
+* (bug 18019) Users are now warned when moving a file to a name in use on a
+ shared repository and only users with the 'reupload-shared' permission can
+ complete the move.
+* (bug 18909) Add missing Postgres INSERT SELECT wrapper
+* User::isValidPassword now only returns boolean results,
+ User::getPasswordValidity can be used to get an error message string
+* The error message shown in Special:ChangePassword now parses wiki markup
+* (bug 19859) Removed experimental HTMLDiff feature
+* Removed section edit links in edit conflict form
+* Allow SpecialActiveusers to work on non-MySQL databases
+* (bug 6579) Fixed protecting images from uploading only
+* (bug 18609) Search index was empty for some pages
+* (bug 13453) rebuildrecentchanges maintenance script works on PG again
+* (bug 16583) Reduce false positives when checking for PHP (on upload, etc.)
+* (bug 20112) Bitrotted tests in the t/ directory were failing.
+* (bug 21470) MediaWiki:Sp-contributions-explain is now wrapped in a <p> with
+ id "mw-sp-contributions-explain"
+* (bug 19159) Fixed \overleftrightarrow in texvc
+* (bug 19391) Fix caching for Recent ChangesFeed.
+* (bug 21455) Fixed "Watch this page" checkbox appearing on some special pages
+ even to non-logged in users
+* (bug 21551) Rewrote the Squid purge HTTP client to provide a more robust and
+ general implementation of HTTP, allowing it to purge non-Squid caches such as
+ Varnish.
+* Fixed corruption of long UDP debug log messages by using socket_sendto()
+ instead of fsockopen() with fwrite().
+* (bug 16884) Fixed feed links in sidebar not complying with URL parameters
+ of the displayed page
+* (bug 21403) memcached class renamed to MWMemecached to avoid conflict with
+ PHP's memcached extension
+* (bug 21650) Both calls to SkinTemplateTabs hook are now compatible
+* (bug 21672) Add missing Accept-Language to both Vary and XVO headers
+* (bug 21679) "Edit block reasons" link at the bottom of Special:Blockip is now
+ only displayed to the users that have "editinterface" right
+* (bug 21740) Attempting to protect a page that doesn't exist (salting) returns
+ "unknown error"
+* (bug 18762) both redirects and links get fixed one after another if
+ redirects-only switch is not present
+* (bug 20159) thumbnails rerendered if older that $wgThumbnailEpoch
+* Fixed a bug which in some situations causes the job queue to grow forever,
+ due to an infinite loop of job requeues.
+* (bug 21523) File that can have multiple pages (djvu, pdf, ...) no longer have
+ the page selector when they have only one page
+* (bug 21559) "logempty" message is now wrapped in a div with class
+ "mw-warning-logempty" when used in log extract
+* (bug 20549) Parser tests were broken on SQLite backend
+* (bug 21776) Interwiki urls like http://en.wikibooks.org/wiki/cs: should give
+ a redirect instead of a baderror.
+* (bug 21803) Special:MyContributions now keeps the query string parameters
+* Redirecting special pages now keep query string paramters set to "0" (e.g.
+ for namespace)
+* (bug 20765) Special:ListGroupRights no longer misses addables and removables
+ groups if there are duplicate entries
+* (bug 21814) Message shown when rolling back an edit with a deleted username
+ now shows '(username deleted)' instead of broken user tool links
+* (bug 21536) Fixed JavaScript error on Special:Search caused by an incorrect ID
+* (bug 21535) RecentChanges RSS feed now always recognises the namespace filter,
+ previously it sometimes didn't due to caching.
+* (bug 20388) ProfilerSimpleText no longer outputs comment on action=raw
+* refreshLinks.php now purges orphaned redirect table rows
+* (bug 2971) Swap links of hist & diff location on Special:Contributions for
+ consistency with RC/WL
+* (bug 21986) Special page names were are now capitalized by content language
+* If two log type have the same description, they're now both displayed in the
+ type selector on Special:Log
+* (bug 20115) Special:Userlogin title says "Log in / create account" even if the
+ user can't create an account
+* (bug 2658) Don't attempt to set the TZ environment variable.
+* (bug 9794) User rights log entries for foreign user now links to the foreign
+ user's page if possible
+* (bug 14717) Don't load nonexistent CSS fix files for non-Monobook skins
+* (bug 22034) Use wfClientAcceptsGzip() in wfGzipHandler instead of
+ reimplementing it.
+* (bug 19226) First line renders differently on many UI messages.
+* (bug 21303) Comments are no longer stripped from MediaWiki:Common.js and
+ skin-specific JS pages
+* (bug 5061) Use the more precise thumbcaption thumbimage and thumbinner classes
+ for image divs.
+* (bug 22096) IE50Fixes.css and IE55Fixes.css have been dropped from the Monobook
+ and Chick skins
+* Fixed bug involving unclosed "-{" markup in the language converter
+* (bug 21870) No longer include Google logo from an external server on wiki error.
+* (bug 22181) Do not truncate if the ellipsis actually make the string longer
+* (bug 16039) Text disappearing after a bad image
+* (bug 18784) Internal links like [[File:Foo|caption]] should read 'caption',
+ not 'File:Foo' when Foo is not an image
+* (bug 21518) Special:UserRights no longer displays the user name box for users
+ that can only change their rights
+* (bug 21593) Special:UserRights now lists automatic groups membership
+* (bug 22364) Setting $wgUseExternalEditor to false no longer hides the reupload
+ link from file pages
+* Fix bug introduced in MediaWiki 1.12: The author field in
+ $wgExtensionCredits is no longer sorted with sort() but rather used
+ as it appears in extensions as was the case before r30117 where it
+ was unintentionally sorted along with other fields.
+* (bug 19334) Textarea no longer jumps when editing longer articles in IE8
+* Truncate summary of page moves in revision comment field to avoid broken
+ multibyte characters
+* (bug 22540) ForeignApiRepos no longer try to store thumbnails that don't exist
+* (bug 22551) Special:Resetpass now has a "Cancel" button that sends the user to
+ the page set in the &returnto parameter.
+* (bug 19194) Search box in Modern skin doesn't focus with Safari/Chrome
+* (bug 17790) Users instantly logged off on HughesNet
+* (bug 21549) Make foreign key constraints DEFERRABLE INITIALLY DEFERRED
+ when using Postgres as the database backend.
+
+== API changes in 1.16 ==
+
+* Added uiprop=changeablegroups to meta=userinfo
+* Added usprop=gender to list=users
+* (bug 18311) action=purge now works for images too
+* Add parentid to prop=revisions output
+* (bug 17832) action=delete returns 'unknownerror' instead of 'permissiondenied'
+ when the user is blocked
+* (bug 18546) Added timestamp of new revision to action=edit output
+* (bug 18554) Also list hidden revisions in list=usercontribs for privileged
+ users
+* (bug 13049) "API must be accessed from the primary script entry point" error
+* (bug 16422) Don't display help for format=jsonfm unless specifically requested
+* Added PHP and database version to meta=siteinfo output
+* (bug 18533) Add readonly message to meta=siteinfo output
+* (bug 18518) Add clprop=hidden to prop=categories
+* (bug 18710) Fixed internal error with empty parameter in action=paraminfo
+* (bug 18709) Missing descriptions for some parameters in action=paraminfo
+ output
+* (bug 18731) Show correct SVN links for extension modules in api.php?version
+* (bug 18730) Add version information to action=paraminfo output
+* (bug 18743) Add ucprop=size to list=usercontribs
+* (bug 18749) Add generator flag to action=paraminfo output
+* Make action=block respect $wgEnableUserEmail and $wgSysopEmailBans
+* Made deleting file description pages without files possible
+* (bug 18773) Add content flag to siprop=namespaces output
+* (bug 18785) Add siprop=languages to meta=siteinfo
+* (bug 14200) Added user and excludeuser parameters to list=watchlist and
+ list=recentchanges
+* Added index, fromtitle and byteoffset fields to action=parse&prop=sections
+ output
+* (bug 19313) action=rollback returns wrong revid on master/slave setups
+* (bug 19323) action=parse doesn't return section tree on pages with Cite
+ warnings
+* (bug 18720) Add anchor field to action=parse&prop=sections output
+* (bug 19423) The initial file description page used caption in user lang
+ rather than UI lang
+* (bug 17809) Add number of users in user groups to meta=siteinfo
+* (bug 18533) Add readonly reason to readonly exception
+* (bug 19528) Added XSLT parameter to API queries in format=xml
+* (bug 19040) Fix prependtext and appendtext in combination with section
+ parameter in action=edit
+* (bug 19090) Added watchlist parameter, deprecated watch and unwatch
+ parameter in action=edit
+* Added fields to list=search output: size, wordcount, timestamp, snippet
+* Where supported by backend, list=search adds a 'searchinfo' element with
+ optional info: 'totalhits' count and 'suggestion' alternate query term
+* (bug 19907) $wgCrossSiteAJAXdomains added to allow specified (or all)
+ external domains to access api.php via AJAX, if the browser supports the
+ Access-Control-Allow-Origin HTTP header
+* (bug 19999) Made metadata and properties of search results optional. Added
+ srprop and srinfo.
+* (bug 20700) Add amprop=default to meta=allmessages to list default value for
+ customized messages
+* Don't parse magic words in meta=allmessages, output messages unparsed
+* (bug 21105) list=usercontribs can now list contribs for User:0
+* (bug 21085) list=deletedrevs no longer returns only one revision when
+ drcontinue param is passed
+* (bug 21106) Deprecated parameters now tagged in action=paraminfo
+* (bug 19004) Added support for tags
+* (bug 21083) list=allusers no longer returns current timestamp for users
+ without registration date
+* (bug 20967) action=edit allows creation of invalid titles
+* (bug 19523) Add inprop=watched to prop=info
+* (bug 21589) API: Separate summary and initial page text for uploads
+* (bug 21817) list=usercontribs returns empty result for empty ucuser
+* (bug 21441) meta=userinfo&uiprop=options no longer returns default options
+ for logged-in users under certain circumstances
+* (bug 21945) Add chomp control in YAML
+* Expand the thumburl to an absolute url to make it consistent with url and
+ descriptionurl
+* (bug 20233) ApiLogin::execute() doesn't handle LoginForm :: RESET_PASS
+* (bug 22061) API: add prop=headitems to action=parse
+* (bug 22240) API: include time in siteinfo
+* (bug 22241) Quick edit is still using the deprecated watch parameter (API: Setting default for watch/unwatch wrongly set)
+* (bug 22245) blfilterredirect=nonredirects in blredirect mode wrongly filtering
+* (bug 22248) Output extension URLs in meta=siteinfo&siprop=extensions
+* Support key-params arrays in 'descriptionmsg' in meta=siteinfo&siprop=extensions
+* (bug 21922) YAML output should quote asterisk when used as key
+* (bug 22297) safesubst: to allow substitution without breaking transclusion
+* (bug 18758) API read of watchlist's wl_notificationtimestamp
+* (bug 20809) Expose EditFormPreloadText via the API
+* (bug 18427) Comment (edit summary) parser option for API
+* (bug 18608) API should provide list of CSS styles to apply to rendered output
+* (bug 18771) List possible errors in action=paraminfo
+
+=== Languages updated in 1.16 ===
-* Fixed fatal errors for unusual file repository configurations, such as
- ForeignAPIRepo.
-* Fixed the "change password" link on Special:Preferences to have the correct
- returnto parameter.
-* (bug 19693) Fixed cross-site scripting vulnerability in Special:Block
+MediaWiki supports over 300 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Capiznon (cps) (new)
+* North Frisian (frr) (new)
+* Kirmanjki (kiu) (new)
+* Komi-Permyak (koi) (new)
+* Karachay-Balkar (krc) (new)
+* Hill Mari (mrj) (new)
+* Prussian (prg) (new)
+* Romagnol (rgn) (new)
+* Lower Silesian (sli) (new)
+* Picard (pcd) (new)
+* Uyghur (Arabic script) (ug-arab) (new)
+* Upper Franconian (vmf) (new)
+* Votic (vot) (new)
+* Eastern Yiddish (ydd) (removed)
+* Iriga Bicolano (bto) (removed)
+* Ladin (lld) (removed)
+* Laz (lzz) (removed)
+* Palembang (plm) (removed)
+* Megleno-Romanian (Greek script) (ruq-grek) (removed)
+* Tamazight (tzm) (removed)
+* Laz (lzz) (new)
-=== Changes since 1.15.0rc1 ===
+* (bug 18474) Sorani (ckb - Central Kurdish) (renamed from ku-arab)
+* Add PLURAL function for Scots Gaelic (gd)
+* Add Estonian letters äöõšüž to linktrail (et)
+* (bug 18776) Native name of Burmese language (my)
+* (bug 18806) Use correct unicode characters in spelling of native Chuvash
+ (Чӑвашла)
+* (bug 18864) Updated autonym for Zhuang language
+* (bug 18308) Updated date formatting in Occitan (oc)
+* (bug 19080) Added ăâîşţșțĂÂÎŞŢȘȚ to Romanion (ro) linktrail
+* (bug 19286) Correct commafying function in Polish (pl)
+* (bug 19441) Updated date formatting for Lithuanian
+* (bug 19630) Added ÄäÇçĞğŇňÖöŞşÜüÃýŽž to Turkmen (tk) linktrail
+* (bug 19949) New linktrail for Greek (el)
+* (bug 19809) Korean (North Korea) (ko-kp) (new)
+* (bug 19968) Fixed "Project talk" namespace name for Maltese (mt)
+* (bug 21168) Added áâãàéêçíóôõúü to Portuguese (pt) linktrail
+* (bug 21596) Change interwiki link for Kurdish (ku)
+* (bug 23767) PHP warning/error when REQUEST_URI returns blank (IIS issue).
-* Removed category redirect feature, implementation was incomplete.
-* (bug 18846) Remove update_password_format(), unnecessary, destroys all
- passwords if a wiki with $wgPasswordSalt=false is upgraded with the web
- installer.
-* (bug 19127) Documentation warning for PostgreSQL users who run update.php:
- use the same user in AdminSettings.php as in LocalSettings.php.
-* Fixed possible web invocation of some maintenance scripts, due to the use of
- include() instead of require(). A full exploit would require a very strange
- web server configuration.
-* Localisation updates.
+== MediaWiki 1.15 ==
=== Configuration changes in 1.15 ===
@@ -380,7 +1346,7 @@ Change notes from older releases. For current info see RELEASE-NOTES.
MediaWiki supports over 300 languages. Many localisations are updated
regularly. Below only new and removed languages are listed, as well as
-changes to languages because of MediaZilla reports.
+changes to languages because of Bugzilla reports.
* Austrian German (de-at) (new)
* Swiss Standard German (de-ch) (new)
diff --git a/INSTALL b/INSTALL
index ec790205..2a35216d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,8 +6,11 @@ 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.1 or higher (this will be the last release to support 5.1.x)
-* A MySQL server, 4.0.14 or higher OR a Postgres server, 8.1 or higher
+* Web server with PHP 5.2.3 or higher (1.16 was the last release to support 5.1.x)
+* A SQL server, the following types are supported
+** MySQL 4.0.14 or higher
+** PostgreSQL 8.3 or higher
+** SQLite
MediaWiki is developed and tested mainly on Unix/Linux platforms, but should
work on Windows as well.
@@ -51,36 +54,19 @@ something nice, like "wiki", since it'll be in your URL.
| See: http://www.mediawiki.org/wiki/Manual:Short_URL |
+--------------------------------------------------------------------------+
-To run the install script, you'll need to temporarily make the 'config'
-subdirectory writable by the web server. The simplest way to do this on a
-Unix/Linux system is to make it world-writable:
-
- chmod a+w config
-
Hop into your browser and surf into the wiki directory. It'll direct you into
the config script. Fill out the form... remember you're probably not on an
encrypted connection.
Gaaah! :)
If all goes well, you should soon be told that it's set up your wiki database
-and written a configuration file. There should now be a 'LocalSettings.php' in
-the config directory; move it back up to the main wiki directory, and the wiki
-should now be working.
-
- +-------------------------------------------------------------------------+
- | Security hint: if you have limited access on your server and cannot |
- | change ownership of files, you might want to *copy* instead of *move* |
- | LocalSettings.php. |
- | |
- | This will make the file owned by your user account instead of by |
- | the web server, which is safer in case another user's account is |
- | compromised. |
- +-------------------------------------------------------------------------+
-
-Once the wiki is set up, you should remove the config directory, or at least
-make it not world-writable (though it will refuse to config again if the wiki
-is set up).
+and generated a configuration file. There is now a copy of "LocalSettings.php"
+available to download from the installer. Download this now, there is not a
+way (yet) to get it after you exit the installer. Place it in the main wiki
+directory, and the wiki should now be working.
+Once the wiki is set up, you should remove the mw-config directory (though it will
+refuse to config again if the wiki is set up).
----
@@ -96,4 +82,3 @@ http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce (low traffic)
http://lists.wikimedia.org/mailman/listinfo/mediawiki-l (site admin support)
http://lists.wikimedia.org/mailman/listinfo/wikitech-l (development)
-
diff --git a/README b/README
index 7c3651e0..e95b1e76 100644
--- a/README
+++ b/README
@@ -36,10 +36,19 @@ The MediaWiki software was written by:
* Yuri Astrakhan
* Aryeh Gregor
* Aaron Schulz
+* Andrew Garrett
+* Raimond Spekking
+* Alexandre Emsenhuber
+* Siebrand Mazeland
+* Chad Horohoe
+* Roan Kattouw
+* Trevor Pascal
+* Bryan Tong Minh
+* Sam Reed
* Several others (view CREDITS for a more complete list)
The contributors hold the copyright to this work, and it is licensed under the
-terms of the GNU General Public License, version 2 or later[1] (see
+terms of the GNU General Public License, version 2 or later (see
http://www.fsf.org/licensing/licenses/gpl.html). Derivative works and later
versions of the code must be free software licensed under the same or a
compatible license. This includes "extensions" that use MediaWiki functions or
@@ -48,58 +57,65 @@ details.
The Wikimedia Foundation currently has no legal rights to the software.
-[1] Sections of code written exclusively by Lee Crocker or Erik Moeller are also
+Sections of code written exclusively by Lee Crocker or Erik Moeller are also
released into the public domain, which does not impair the obligations of users
under the GPL for use of the whole code or other sections thereof.
-[2] MediaWiki makes use of the Sajax Toolkit by modernmethod,
- http://www.modernmethod.com/sajax/
- which has the following license:
+MediaWiki makes use of the Sajax Toolkit by modernmethod,
+http://www.modernmethod.com/sajax/ which has the following license:
- 'This work is licensed under the Creative Commons Attribution
- License. To view a copy of this license, visit
- http://creativecommons.org/licenses/by/2.0/ or send a letter
- to Creative Commons, 559 Nathan Abbott Way,
- Stanford, California 94305, USA.'
+ 'This work is licensed under the Creative Commons Attribution
+ License. To view a copy of this license, visit
+ http://creativecommons.org/licenses/by/2.0/ or send a letter
+ to Creative Commons, 559 Nathan Abbott Way,
+ Stanford, California 94305, USA.'
+
+MediaWiki use Creative Commons license marks to points to their online
+licenses. This content is trademarked and used under a specific license
+available at http://creativecommons.org/policies#trademark
+The restricted content is:
+
+* skins/common/images/cc-by-nc-sa.png
+* skins/common/images/cc-by-sa.png
Many thanks to the Wikimedia regulars for testing and suggestions.
The official website for MediaWiki is located at:
- http://www.mediawiki.org/
+ http://www.mediawiki.org/
The code is currently maintained in a Subversion repository at
svn.wikimedia.org. See http://www.mediawiki.org/wiki/Subversion for details.
Please report bugs and make feature requests in our Bugzilla system:
- https://bugzilla.wikimedia.org/
+* https://bugzilla.wikimedia.org/
Documentation and discussion on new features may be found at:
- http://www.mediawiki.org/wiki/Manual:FAQ
- http://www.mediawiki.org/wiki/Documentation
- http://www.mediawiki.org/wiki/Development
+* http://www.mediawiki.org/wiki/Manual:FAQ
+* http://www.mediawiki.org/wiki/Documentation
+* http://www.mediawiki.org/wiki/Development
Extensions are listed at:
- http://www.mediawiki.org/wiki/Category:Extensions
+* http://www.mediawiki.org/wiki/Category:Extensions
If you are setting up your own wiki based on this software, it is highly
recommended that you subscribe to mediawiki-announce:
- https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+* https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
The mailing list is very low volume, and is intended primarily for announcements
of new versions, bug fixes, and security issues.
A higher volume support mailing list can be found at:
- https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+* https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
Developer discussion takes place at:
- https://lists.wikimedia.org/mailman/listinfo/wikitech-l
+* https://lists.wikimedia.org/mailman/listinfo/wikitech-l
There is also a development and support channel #mediawiki on irc.freenode.net,
and an unoffical support forum at www.mwusers.com.
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index ecfb4e2d..6d288307 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,1060 +1,813 @@
= MediaWiki release notes =
-== MediaWiki 1.16.5 ==
-
-2011-05-05
-
-This is a security release of the MediaWiki 1.16 branch.
-
-=== Summary of selected changes in 1.16 ===
-
-Selected changes since MediaWiki 1.15 that may be of interest:
-
-* A new skin called Vector was added
-
-* Watchlists now have RSS/Atom feeds. RSS feeds generally are now hidden,
- since Atom is a better protocol and is supported by virtually all clients.
-
-* It's now possible to block users from sending email via Special:Emailuser.
-
-* The maintenance script system was overhauled. Most maintenance scripts now
- have a useful help page when you run them with --help.
-
-* AdminSettings.php is no longer required in order to run maintenance scripts.
- You can just set $wgDBadminuser and $wgDBadminpassword in your
- LocalSettings.php instead.
-
-* The preferences system was overhauled. Preferences are stored in a more
- compact format. Changes to site default preferences will automatically
- affect all users who have not chosen a different preference.
-
-* Support for SQLite was improved. Some broken features were fixed, and it
- now has an efficient full-text search.
-
-* The user groups ACL system was improved by allowing rights to be revoked,
- instead of just granted.
-
-* A new localisation caching system was introduced, which will make MediaWiki
- faster for almost everyone, especially when lots of extensions are enabled.
-
-By default, this new system makes a lot of database queries. If your database
-is particularly slow, or if your system administrator limits your query count,
-or if you want to squeeze as much performance as possible out of Mediawiki,
-set $wgCacheDirectory to a writable path on the local filesystem. Make sure
-you have the DBA extension for PHP installed, this will improve performance
-further.
-
-== Changes since 1.16.4
-
-* (bug 28534) Fixed XSS vulnerability for IE 6 clients. This is the third
- attempt at fixing bug 28235.
-* (bug 28639) Fixed potential privilege escalation when $wgBlockDisablesLogin
- is enabled.
-
-== Changes since 1.16.3 ==
-
-* (bug 28507) The change we made in 1.16.3 to fix bug 28235 (XSS for IE 6
- clients) was not actually sufficient to fix that bug. This release contains
- a second attempt, hopefully we have fixed it this time.
-
-== Changes since 1.16.2 ==
-
-* (bug 28449) Fixed permissions checks in Special:Import which allowed users
- without the 'import' permission to import pages from the configured import
- sources.
-* (bug 28235) Fixed XSS affecting IE 6 and earlier clients only, due to those
- browsers looking for a file extension in the query string of the URL, and
- ignoring the Content-Type header if one is found.
-* (bug 28450) Fixed a CSS validation issue involving escaped comments, which
- led to XSS for Internet Explorer clients and privacy loss for other clients.
-
-== Changes since 1.16.1 ==
-
-* (bug 26642) Fixed incorrect translated namespace due to a regression in the
- language converter.
-* The interface translations were updated.
-* (bug 27093, CVE-2011-0047): Fixed CSS injection vulnerability.
-* (bug 27094) Fixed server-side arbitrary script inclusion vulnerability.
- Affects Windows servers only. A malicious file with extension ".php" must
- exist on the server for the exploit to be effective.
-
-== Changes since 1.16.0 ==
-
-* (bug 24981) Allow extensions to access SpecialUpload variables again
-* (bug 24724) list=allusers was out by 1 (shows total users - 1)
-* (bug 24166) Fixed API error when using rvprop=tags
-* For wikis using French as a content language, Special:Téléchargement works
- again as an alias for Special:Upload.
-* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16.0)
-* (bug 25248) Fixed paraminfo errors in certain API modules.
-* The installer now has improved handling for situations where safe_mode is
- active or exec() and similar functions are disabled.
+Security reminder: MediaWiki does not require PHP's register_globals
+setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.17.0 ==
+
+2011-06-22
+
+This is the first stable release of the MediaWiki 1.17 branch.
+
+=== Summary of selected changes in 1.17 ===
+
+Selected changes since MediaWiki 1.16 that may be of interest:
+
+* A new installer has been introduced. It has a wizard-style interface which is
+ translated into many languages. Many shortcomings in the old installer were
+ addressed with this rewrite. Note that it is no longer required for the config
+ directory to be made writable by the webserver. Instead the generated
+ LocalSettings.php file is offered as a download, which you must then upload
+ to the wiki's base directory.
+
+* ResourceLoader, a new framework for delivering client-side resources such as
+ JavaScript and CSS, has been introduced. These resources are now delivered
+ through the new entry point script "load.php", instead of as static files
+ served directly by the web server. This allows minification, compression and
+ client-side caching to be used more effectively, which should provide a net
+ performance improvement for most users.
+
+* Category sorting has been improved.
+** Sorting is now case insensitive.
+** Sub-categories, pages and files can now be paged separately.
+** When several pages are given the same sort key, they sort by their
+ names instead of randomly.
+
+* The lowest supported version of PHP is now 5.2.3. If necessary, please
+ upgrade PHP prior to upgrading MediaWiki.
+
+=== Changes since 1.17.0rc1 ===
+
+* Fixed syntax error in generated LocalSettings.php when a non-default user
+ rights profile is chosen.
+* (bug 29399) Fixed PostgreSQL installation when the DB user for installation
+ is the same as the one for web access.
+* (bug 29233) Fixed failover for DB slave servers. When a DB slave went down,
+ an error was immediately shown to the user, instead of trying another slave.
+ Was broken since 1.17 beta 1.
+* (bug 29278) Fixed PHP fatal error when attempting to add text to a page via a
+ redirect.
+* (bug 29408) Fixed uploads of files with MIME types that aren't detected by
+ MediaWiki.
+
+=== Changes since 1.17 beta 1 ===
+
+* Fixed warning about missing file "password.js".
+* When installing on MySQL, don't attempt to create a new database user if the
+ same user is used for installation and web access.
+* Fixed SQL query errors in queries with table aliases.
+* (bug 27891) Fixed the "chronology protector", broken since 1.17beta1, which
+ ensures that when database replication is used, the new version is seen by
+ the user immediately after they create or edit an article.
+* (bug 28845) Allow PostgreSQL installation using a non-root user account which
+ has role creation abilities.
+* When installing on PostgreSQL and the install account is the same as the web
+ account, check to make sure that the account has suitable privileges in the
+ mediawiki schema.
+* (bug 28172) Fixed error in PostgreSQL installation when creating the wiki
+ sysop account.
+* Fixed an issue with the Oracle installer in cases where the user is different
+ to the database name.
+* Added "unblockself" to the list of available rights.
+* In the installer, fixed the "user rights profile" option, it never worked.
+* (bug 29117) Fixed Hebrew localisation of the installer.
+* (bug 28840) Reduce the collateral damage caused by the fix for bug 28235 (XSS
+ on Internet Explorer 6 due to a file extension in the query string) by
+ reducing the number of URLs that are blocked, and by redirecting the request
+ to a safer URL where possible instead of blocking it.
+* (bug 28812) Fixed documentation of API action=parse.
+* (bug 28979) Fixed styling of <abbr> and <acronym>.
+* Fixed the error message displayed when you try to create an account by email,
+ but an email address is not given.
+* Fixed JS error due to missing dependency for jquery.suggestions.
+* Exposed $wgExtensionAssetsPath in JavaScript.
+* (bug 28738) Made ResourceLoader support environments with small URL length
+ limits. The length limit can be configured via $wgResourceLoaderMaxQueryLength,
+ and this is set automatically in the generated LocalSettings.php when the
+ php.ini variable "suhosin.get.max_value_length" is set. When a URL exceeds
+ this limit, the request is split up. Also, reduced the average length of
+ load.php URLs by using a more compact parameter format.
+* (bug 25262) Fix for minification of hardcoded data: URIs in CSS.
+* (bug 25124) Respect $wgStyleDirectory in ResourceLoader.
+* Allow installation when no HTTP client is available, don't throw an exception.
+* (bug 27465) Fix metadata extraction for SVG files using unusual namespace
+ names.
+* (bug 29174) Fix regression in upload-by-URL: uploading files larger than the
+ PHP memory limit should work again.
+* Fixed the display of comments in the new user log.
+* (bug 28237) When installing extensions using the web-based installer, create
+ any necessary database tables.
+* (bug 28983) Fixed automated installation of extensions that overwrite $path.
+* Fixed error caused by missing magic words.
+* Fixed breakage of article editing in PostgreSQL due to text search
+ configuration errors.
+* Fixed the HTTPS client used when Curl is not available. This avoids an error
+ during install about failure of the mediawiki-announce subscription.
+* (bug 28162) When installing to PostgreSQL, respect the "database port" input,
+ it was ignored.
+
+=== Configuration changes in 1.17 ===
+
+* $wgLogAutocreatedAccounts controls whether autocreation of accounts is logged
+ to new users log.
+* (bug 22858) $wgLocalStylePath is by default set to the same value as
+ $wgStylePath but should never point to a different domain than the site is
+ on, allowing skins to use .htc files which are not cross-domain friendly.
+* $wgFileStore has been deprecated. The only usage $wgFileStore['deleted'] has
+ been turned into $wgDeletedDirectory.
+* $wgDeletedDirectory has been added to specify what directory to place deleted
+ uploads in.
+* IBM DB2 database no longer uses the db specific $wgDBport_db2 variable but the
+ normal $wgDBport.
+* $wgCategoryPrefixedDefaultSortkey was removed and is now always false. This
+ provides more sensible sorting behavior for categories.
+* Removed unused globals: $wgEnableSerializedMessages, $wgCheckSerialized,
+ $wgUseMemCached, $wgDisableSearchContext, $wgColorErrors, $wgUseZhdaemon,
+ $wgZhdaemonHost and $wgZhdaemonPort.
+* (bug 24408) The include_path is not modified in the default LocalSettings.php
+* $wgVectorExtraStyles was removed, and is no longer in use.
+* Removed $wgUpdates for database updates; extensions should use
+ DatabaseUpdater::addExtensionUpdate() via the LoadExtensionSchemaUpdates hook.
+* Removed $wgServerName. It doesn't need to be set anymore and is no longer
+ available as input for other configuration items, either.
+* It's no longer necessary for LocalSettings.php to include DefaultSettings.php.
+* It's no longer necessary to set $wgCacheEpoch to the file modification time
+ of LocalSettings.php, in LocalSettings.php itself. Instead, this is done
+ automatically if $wgInvalidateCacheOnLocalSettingsChange is true (which is
+ the default).
+* $wgCopyrightIcon is deprecated and $wgFooterIcons['copyright']['copyright']
+ should be used instead.
+* $wgSysopUserBans is deprecated, and will be made permanently true in 1.18.
+ If you need this functionality, you should use the BlockIp hook to filter and
+ reject such blocks.
+* $wgSysopRangeBans is deprecated, you should set $wgBlockCIDRLimit to maximum
+ (32 for IPv4, 128 for IPv6), equivalent to allowing rangeblocks of only 1
+ address at a time.
+
+=== New features in 1.17 ===
+
+* (bug 10183) Users can now add personal styles and scripts to all skins via
+ User:<name>/common.css and /common.js (if user css/js is enabled).
+* (bug 22748) Add anchors on Special:ListGroupRights.
+* (bug 21981) Add parameter 'showfilename' to <gallery> to automatically
+ apply the names of the individual files within the gallery.
+* Future-proof redirection to fragments in Gecko, so things work a little nicer
+ if they fix <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+* Support git:// and mms:// protocols by default for external links.
+* (bug 15810) Blocked admins can no longer unblock themselves without the
+ 'unblockself' permission (which they have by default).
+* (bug 18499) Added "enhanced" URL parameter to switch between old and enhanced
+ changes list.
+* (bug 22925) "sp-contributions-blocked-notice-anon" message now displayed when
+ viewing contributions of a blocked IP address.
+* (bug 22474) {{urlencode:}} now takes an optional second parameter for type of
+ escaping.
+* Special:Listfiles now supports a username parameter.
+* Special:Random carries over query string parameters.
+* (bug 23206) Add Special::Search hook for detecting successful "Go".
+* When visiting a "red link" of a deleted file, a deletion and move log excerpt
+ is provided on the Upload form.
+* (bug 22647) Add category details in search results.
+* (bug 23276) Add hook to Special:NewPages to modify query.
+* Add accesskey 's' and tooltip to 'Save' button at Special:Preferences.
+* Add accesskey 'b' and tooltip to the summary field of edit mode.
+* (bug 20186) Allow filtering Special:Contributions for RevisionDeleted edits.
+* ajaxwatch now uses the API and JQuery, and can be used to animate arbitrary
+ watch links, not just to watch the page the link is on.
+* (bug 20976) "searchmenu-new-nocreate" message now displayed when when there
+ is no title match in search and the user has no rights to create pages.
+* (bug 23429) Added new hook WatchlistEditorBuildRemoveLine.
+* (bug 22844) Added support for WinCache object caching (for IIS).
+* (bug 23580) Add two new events to LivePreview so that scripts can be notified
+ about the beginning and finishing of LivePreview actions.
+* (bug 21278) Now the sidebar allows inclusion of wiki markup.
+* (bug 23733) Add IDs to messages used on CSS/JS pages.
+* Show validity period of the login cookie in Special:UserLogin and
+ Special:Preferences.
+* Interlanguage links display the page title in their tooltip.
+* (bug 23621) New Special:ComparePages to compare (diff) two articles.
+* (bug 4597) Provide support in Special:Contributions to show only "current"
+ contributions
+* (bug 17857) {{anchorencode}} acts more like how the parser creates section ids
+* (bug 21477) \& can now be used in <math>
+* (bug 11641) \dotsc \dotsm \dotsi \dotso can now be used in <math>
+* (bug 21475) \mathtt and \textsf can now be used in <math>
+* texvc is now run via ulimit4.sh, to limit execution time.
+* SQLite now supports $wgSharedDB.
+* (bug 8507) Group file links by namespace:title on image pages.
+* Stop emitting named entities, so we can use <!DOCTYPE html> while still being
+ well-formed XML.
+* texvc now supports \bcancel and \xcancel in addition to \cancel and \cancelto
+* Added scriptExtension setting to $wgForeignFileRepos.
+* ForeignApiRepo uses scriptDirUrl if apiBase not set.
+* (bug 24212) Added MediaWiki:Filepage.css which is also included on foreign
+ client wikis.
+* (bug 14685) Double underscore magic word usage is now tracked in the
+ page_props table, as well as the behavioral magic words {{DEFAULTSORT}} and
+ {{DISPLAYTITLE}}
+* (bug 24045) MediaWiki:Ipb-needreblock is now wrapped in a div with class
+ "mw-ipb-needreblock"
+* Non-file pages can no longer be moved to the file namespace, nor vice versa.
+* (bug 671) The <dfn>, <kbd> and <samp> elements have been whitelisted in user
+ input.
+* (bug 21503) There's now a "reason" field when creating account for other users.
+* (bug 24418) action=markpatrolled now requires a token.
+* A variety of category sort-related fixes, including:
+** (bug 164) In English, lowercase and uppercase letters now sort the same.
+** (bug 1211) Subcategories, ordinary pages, and files now page separately.
+** When several pages are given the same sort key, they sort by their names
+ instead of randomly.
+* (bug 23848) Add {{ARTICLEPATH}} Magic Word.
+* (bug 8140) Add dedicated CSS classes to Special:Newpages elements.
+* (bug 11005) Add CSS class to empty pages in Special:Newpages.
+* The parser cache is now shared amongst users whose different settings aren't
+ used in the page.
+* Any attribute beginning with "data-" can now be used in wikitext, per HTML5.
+* (bug 24007) Diff pages now mention the number of users having edited
+ intermediate revisions.
+* Added new hook GetIP.
+* Special:Version now displays whether a SQLite database supports full-text
+ search.
+* TS_ISO_8691_BASIC was added as a time format, which is used by ResourceLoader
+ for versioning.
+* Maintenance scripts get a --memory-limit option to override defaults (which
+ is usually to set it to -1 to disable the limit).
+* (bug 25397) Allow uploading (not displaying) of WebP images, disabled
+ by default.
+* (bug 23194) Special:ListFiles now has thumbnails.
+* Use hreflang to specify canonical and alternate links, search engine friendly
+ when a wiki has multiple variant languages.
* (bug 19593) Specifying --server in now works for all maintenance scripts.
-* Fixed $wgLicenseTerms register globals.
-* (bug 26561) Fixed clickjacking vulnerabilities by introducing support for
- X-Frame-Options. The header value can be configured using $wgBreakFrames and
- $wgEditPageFrameOptions.
-
-== Changes since 1.16 beta 3 ==
-
-* (bug 23769) Disabled HTML 5 client-side form validation. Was introduced in
- 1.16 beta 1, but is currently poorly supported by browsers.
-* (bug 23175) Re-added window.ta variable for backwards compatibility.
-* (bug 23264) Fixed breakage of various command line scripts due to extra line
- endings being inserted by Maintenance::output().
-* Fixed HTTP client functionality with safe_mode=On.
-* Fixed parser tests broken in 1.16 beta 3.
-* For Oracle DB backend: fixed parser tests and table prefix feature.
-* (bug 23767) Fixed PHP warning when REQUEST_URI is blank (IIS issue).
-* Fixed plural function for Northern Sami (se)
-* (bug 23597) Fixed conflicts between ID attributes in the Vector skin and
- parser-generated heading IDs. Renamed head, panel, head-base and page-base.
-* Disabled $wgHitcounterUpdateFreq>1 feature on SQLite, does not work yet.
-* (bug 23465) Don't ignore the predefined destination filename on
- Special:Upload after following a red link to a file.
-* In SQLite full-text search feature: fixed "move page" feature, was non-
- functional.
-* (bug 24565) Fixed Cache-Control headers sent from API modules, to protect
- user privacy in the case where an attacker can access the wiki through the
- same HTTP proxy as a logged-in user.
-* Fixed an XSS vulnerability in profileinfo.php for installations with
- $wgEnableProfileInfo = true (false by default)
-* Fixed a case where an X-Vary-Options header was sent despite $wgUseXVO being
- false. Fixed a minor header parsing issue when $wgUseXVO = true.
-* Fixed a register_globals arbitrary inclusion vulnerability in
- MediaWikiParserTest.php, introduced in 1.16 beta 1.
-
-== Changes since 1.16 beta 2 ==
-
-* Fixed bugs in the [[Special:Userlogin]] and [[Special:Emailuser]] handling of
- invalid usernames.
-* Fixed sorting in [[Special:Allmessages]]
-* (bug 23113) Fixed title in the show/hide links on diff pages
-* (bug 23117) Fixed API rollback, was returning "badtoken" for valid requests
-* (bug 23127) Re-added missing $1 parameter to the uploadtext message
-* Fixed a bug in the Vector skin where personal tools display behind the logo
-* (bug 23139) Fixed a bug in edit conflict resolution, where both textboxes
- showed the same text.
-* (bug 23115, bug 23124) Fixed various problems with <title> and <h1> elements
- in page views and previews when the language converter is enabled.
-* (bug 23148) Fixed a local path disclosure vulnerability in ImageMagick image
- scaling, which was introduced in 1.16 beta 1.
-* Improved error checking on installer.
-* (bug 22970) Fixed a JavaScript error in the upload destination conflict
- check.
-* (bug 23167) Check the watch checkbox by default if the watchcreations
+* Now rebuildtextindex.php warns if SQLite doesn't support full-text search.
+* (bug 10541) Front/backend separation of installation/upgrade code.
+* (bug 10596) Allow installer to enable extensions already in extensions folder.
+* (bug 20627) Installer should be in languages other than English.
+* Support for metadata in SVG files (title, description).
+* Special:Search: Add CSS classes to 'none found' and 'create link' messages.
+* Add CSS classes (including namespace and pagename) to the enhanced recent
+ changes/watchlist entries.
+* (bug 22463) Add hook 'SkinGetPoweredBy' to make 'powered by' icon/text
+ customizable.
+* Added CSS print pagination to the print stylesheets.
+* (bug 25960) Add <link rel=canonical"> for File pages of shared/foreign
+ file repositories.
+* When viewing a redirect, the redirect arrow and redirection target are both
+ wrapped in a div that has the class "redirectMsg" so that the redirection
+ arrow can be customized with CSS.
+* (bug 21911) Hard coded limit for long page warning removed. New message
+ [[MediaWiki:Longpage-hint]] (empty per default) can be used instead.
+ Parameters: $1 shows the formatted textsize in Byte/KB/MB, $2 is the raw
+ number of the textsize in Byte.
+* (bug 3276) Give image <gallery>s fluid width.
+* Added uploads link to page subtitle in Special:Contributions.
+* Added Special:Myuploads special page that redirects to Special:Listfiles.
+* The footerlinks used in Monobook/Vector/Modern are now part of common skin
+ code, SkinTemplateOutputPageBeforeExec can be used to customize the list.
+* Special wrapping setups can now define MW_CONFIG_FILE to load a config file
+ other than LocalSettings.php. This is like MW_CONFIG_CALLBACK but works in
+ some cases where MW_CONFIG_CALLBACK will not work.
+* (bug 26574) Added 'upload' to $wgRestrictionTypes, allowing upload protected
+ pages to be queried via the API and Special:ProtectedPages, and allowing
+ disabling upload protection by removing it from $wgRestrictionTypes.
+* The name attribute of HTMLForm fields can now be overridden by passing a
+ 'name' key in the descriptor array. Hidden field names are now treated
+ consistently with other fields and, by default, prefixed with 'wp'.
+* (bug 27402) Add support for disabling MWSuggest.
+* (bug 26563) Add bytes changed per revision for stub and full article dumps.
+* (bug 27508) Add $wgSVGMetadataCutoff to limit the maximum amount of an svg we
+ look at when finding metadata to prevent excessive resource usage.
+* (bug 198) $wgUpgradeKey allows unlocking the web installer for upgrades
+ without having to move LocalSettings.php
+* Added $wgAllowImageTag, which can be set to true to whitelist the <img> tag
+ in wikitext.
+* (bug 12797) Add $wgGalleryOptions for adjusting of default gallery display
+ options.
+* Added the $wgAllowUserCssPrefs option which allows disabling CSS-based
+ preferences; which can improve page loading speed.
+* Added $wgSQLMode for setting database SQL modes - either performance (null)
+ or other reasons (such as enabling stricter checks).
+* (bug 20193) Added $wgVectorShowVariantName global configuration variable
+ which causes Vector to render the variants drop-down menu with a label
+ showing the current variant name. This is off by default, pending further
+ research into its user experience implications.
+* The upload link for missing files can now be set separately from the
+ navigation link with $wgUploadMissingFileUrl.
+* $wgAdditionalMailParams added to allow setting extra options to mail() calls.
+* Added $wgSecureLogin to optionally login using HTTPS.
+* (bug 25728) Added $wgPasswordSenderName to make the name associated
+ with $wgPasswordSender configurable.
+* (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
+ the footers of skins.
+* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy.
+ used for the file cache. Default value is 2, which matches former behavior.
+
+=== Bug fixes in 1.17 ===
+
+* (bug 17560) Half-broken deletion moved image files to deletion archive
+ without updating database.
+* (bug 22666) Submitting user block form with an invalid user name no longer
+ throws an error.
+* (bug 22665, bug 22667) User '0' can now be unblocked and have its block
+ settings changed.
+* (bug 22606) The body of e-mail address confirmation message is now different
+ when the address changed.
+* (bug 22664) Special:Userrights now accepts '0' as a valid user name.
+* (bug 5210) Preload parser now parses <noinclude>, <includeonly> and
+ redirects.
+* (bug 22709) IIS7 mishandles redirects generated by OutputPage::output() when
+ the URL contains a colon.
+* (bug 22353) Categorised recent changes now works again.
+* (bug 22747) "Reveal my e-mail address in notification e-mails" preference is
+ now only displayed when relevant.
+* (bug 22772) {{#special:}} parser function now works with subpages.
+* (bug 18664) Relative URIs in interwiki links cause failed redirects.
+* (bug 19270) Relative URIs in interwiki links break interwiki transclusion.
+* (bug 22903) Revdelete log entries now show in the user preferred language.
+* (bug 22905) Correctly handle <abbr> followed by ISBN.
+* (bug 22940) Namespace aliases pointing to main namespace don't work.
+* (bug 15810) Blocked admins can no longer block/unblock other users.
+* (bug 22876) Avoid possible PHP Notice if $wgDefaultUserOptions is not
+ correctly set.
+* (bug 14952) Page titles are renormalized after html entities are removed so
+ that links with non-NFC character references work correctly.
+* (bug 22991) wgUserGroups JavaScript variable now reports * group for
+ anonymous users instead of null.
+* (bug 22627) Remove PHP notice when deleting a page only hidden users edited.
+* (bug 21520) Anonymous previews now also gives a warning about not being
+ logged in (anonpreviewwarning).
+* (bug 22935) image/x-ms-bmp mime type added for BMP files.
+* (bug 23024) Special:ListFiles now escapes file names correctly.
+* (bug 22867) "View source" tab is now only displayed if there's source text.
+* (bug 19393) Feeds now format dates in user language rather than content
+ language.
+* (bug 22852) "Served in" comment is now the time used to cache a single page
+ when using rebuildFileCache.php
+* (bug 22496) Viewing diff of a redirect page without specifying "oldid".
+ parameter no longer makes the page displayed as being the redirect target.
+* (bug 22918) Feed cache keys now use $wgRenderHashAppend.
+* (bug 21916) Last-Modified header is now correct when outputting cached feed.
+* (bug 20049) Fixed PHP notice in search highlighter that occurs in some cases.
+* (bug 23017) Special:Disambiguations now list pages in content namespaces
+ rather than only main namespace.
+* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all.
+ frames, and $wgMaxImageArea against the size of the first frame, rather than
+ the other way around. Both now default to 12.5 megapixels. Also, images
+ exceeding $wgMaxImageArea can still be embedded at original size.
+* (bug 23078) "All public logs" option on Special:Log is now always the first
+ item.
+* (bug 16817) Group names in user rights log are now singular and in lowercase.
+* Special:Preferences no longer crashes if the wiki default date formatting
+ style is not valid for the user's interface language.
+* (bug 23167) Check the watch checkbox by default if the watchcreations
preference is set.
-* (bug 23171) Improve IE6 version check to avoid false positives.
-* (bug 23176) Fixed upload warning override feature "upload new version",
- broken in 1.16 beta 1.
-* Fixed regression in unwatch links sent out in notification emails. When the
- mailing job was deferred via the job queue, the title was incorrect.
-* (bug 23534) Fixed SQL query error in API list=allusers.
-* Fixed a bug in uploads for non-JavaScript clients. An empty string was used
- as the default destination filename, instead of the source filename as
- expected.
-* (bug 23371) Fixed CSRF vulnerability in "e-mail me my password", "create
- account" and "create by e-mail" features of [[Special:Userlogin]]
-* (bug 23687) Fixed XSS vulnerability affecting IE clients only, due to a CSS
- validation issue.
-* Fixed a DoS vulnerability in ImageMagick image scaling. ImageMagick
- expanded wildcard characters "?" and "*" in image filenames, potentially
- causing large numbers of images to be scaled in response to a single request.
- The fix for this involves breaking the scaling of such image filenames until
- ImageMagick 6.6.1-5 or later is deployed, see bug 23361 for more details.
-* (bug 23608) Fixed invalid HTML in diff pages.
-
-=== Changes since 1.16 beta 1 ===
-
-* Fixed errors in maintenance/patchSql.php
-* (bug 19627) Fix regression from r57867 where HTMLForm would output
- <element classes="foo bar"> rather than <element class="foo bar">
-* Fixed broken "-r" option to maintenance/lag.php
-* (bug 23076) Fixed login CSRF vulnerability. Logins now require a token to
- be submitted along with the user name and password.
-
-=== Configuration changes in 1.16 ===
-
-* (bug 18222) $wgMinimalPasswordLength default is now 1
-* $wgSessionHandler can be used to configure session.save_handler
-* $wgLocalFileRepo/$wgForeignFileRepos now have a 'fileMode' parameter to
- be used when uploading/moving files
-* (bug 18761) $wgHiddenPrefs is a new array for specifying preferences not
- to be shown to users
-* $wgAllowRealName and $wgAllowUserSkin were deprecated in favor of
- $wgHiddenPrefs[] = 'realname', but the former are still retained
- for backwards-compatibility
-* (bug 9257) $wgRCMaxAge now defaults to three months
-* $wgDevelopmentWarnings can be set to true to show warnings about deprecated
- functions and other potential errors when developing.
-* Subpages are now enabled in the MediaWiki namespace by default. This is
- mainly a cosmetic change, and does not in any way affect the MessageCache,
- which was already effectively treating the namespace as if it had subpages.
-* Oracle: maintenance/ora/user.sql script for creating DB user on oracle with
- appropriate privileges. Creating this user with web-install page requires
- oci8.privileged_connect set to On in php.ini.
-* Removed UserrightsChangeableGroups hook introduced in 1.14
-* Added $wgCacheDirectory, to replace $wgFileCacheDirectory,
- $wgLocalMessageCache, and any other local caches which need a place to put
- files.
-* $wgFileCacheDirectory is no longer set to anything by default, and so either
- needs to be set explicitly, or $wgCacheDirectory needs to be set instead.
-* $wgLocalMessageCache has been removed. Instead, set $wgUseLocalMessageCache
- to true
-* Removed $wgEnableSerializedMessages and $wgCheckSerialized. Similar
- functionality is now available via $wgLocalisationCacheConf.
-* $wgMessageCache->addMessages() is deprecated. Messages added via this
- interface will not appear in Special:AllMessages.
-* $wgRegisterInternalExternals can be used to record external links pointing
- to same server
-* (bug 19907) $wgCrossSiteAJAXdomains and $wgCrossSiteAJAXdomainExceptions added
- to control which external domains may access the API via cross-site AJAX.
-* $wgMaintenanceScripts for extensions to add their scripts to the default list
-* $wgMemoryLimit has been added, default value '50M'
-* $wgExtraRandompageSQL is deprecated, the SpecialRandomGetRandomTitle hook
- should be used instead
-* (bug 20489) $wgIllegalFileChars added to override the default list of illegal
- characters in file names.
-* (bug 19646) $wgImgAuthDetails added to display reason access to uploaded file
- was denied to users(img_auth only)
-* (bug 19646) $wgImgAuthPublicTest added to test to see if img_auth set up
- correctly (img_auth only)
-* $wgUploadMaintenance added to disable file deletions and restorations during
- maintenance
-* $wgCapitalLinkOverrides added to configure per-namespace capitalization
-* (bug 21172) $wgSorbsUrl can now be an array with multiple DNSBL and renamed
- to $wgDnsBlacklistUrls (backward compatibility kept)
-* $wgEnableHtmlDiff has been removed
-* (bug 3340) $wgBlockCIDRLimit added (default: 16) to configure the low end of
- CIDR ranges for blocking
-* $wgUseInstantCommons added for quick and easy enabling of Commons as a remote
- file repository
-* $wgDBAhandler added to choose a DBA handler when using CACHE_DBA
-* $wgPreviewOnOpenNamespaces for extensions that create namespaces that behave
- similarly to the category namespace.
-* $wgEnableSorbs renamed to $wgDnsBlacklistUrls ($wgEnableSorbs kept for
- backward compatibility)
-* $wgUploadNavigationUrl now also affects images inline images that do not
- exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
- it as appropriate.
-* If $wgLocaltimezone is null, use the server's timezone as the default for
- signatures. This was always the behaviour documented in DefaultSettings.php
- but has not been the actual behaviour for some time: instead, UTC was used
- by default.
-* Added $wgExtensionAssetsPath, to decouple assets serving from $wgScriptPath.
- If not specified it will default to $wgScriptPath/extensions
-* Added $wgCountTotalSearchHits to make search UI display total number of hits
- with some search engines.
-* Added $wgAdvertisedFeedTypes to decide what feed types (RSS, Atom, both, or
- neither) MediaWiki advertises. Default is array( 'atom' ), so RSS is no
- longer advertised by default (but it still works).
-* Added $wgMemCachedTimeout, controls how long to wait for data from the
- memcached servers.
-* New configuration variables $wgDebugTimestamps and $wgDebugPrintHttpHeaders
- for controlling debug output.
-* New $wgBlockDisablesLogin when set to true disallows blocked users from
- logging in.
-* (bug 8790) Metadata edition ($wgUseMetadataEdit) has been moved to a separate
- extension "MetadataEdit".
-
-=== New features in 1.16 ===
-
-* A new skin called Vector was added
-* Add CSS defintion of the 'wikitable' class to shared.css
-* (bug 17163) Added MediaWiki:Talkpageheader which will be displayed when
- viewing talk pages
-* Superfluous border="0" removed from images
-* Added new hook 'MessageCacheReplace' into MessageCache.php. For instance
- to allow extensions to update caches in similar way as MediaWiki invalidates
- a cached MonoBook sidebar
-* Special:AllPages: Move hardcoded styles from code to CSS
-* (bug 18529) New hook: SoftwareInfo for adding information about the software
- to Special:Version
-* Added $wgExtPGAlteredFields to allow extensions to easily alter the data
- type of columns when using the Postgres backend.
-* (bug 16950) Show move log when viewing/creating a deleted page
-* (bug 18242) Show the Subversion revision number per extensions in
- Special:Version
-* (bug 18420) Missing file revisions are handled gracefully now
-* (bug 9219) Auth plugins can control editing RealName/Email/Nick preferences
-* (bug 18466) Add note or warning when overruling a move (semi-)protection
-* (bug 18342) insertTags works in edit summary box
-* (bug 18411) The upload form also checks post_max_size
-* Watchlist now has a specialized <div> tag that contains a unique class for
- each page
-* Added Minguo calendar support for the Taiwan Chinese language
-* Database: unionQueries function to be used for UNION sql construction, so
- it can be overloaded on DB abstraction level for DB specific functionality
-* (bug 18849) Implement Japanese and North Korean calendars
-* (bug 5755) Introduce {{CURRENTMONTH1}} and {{LOCALMONTH1}} to display the
- month number without the leading zero
-* (bug 13456) categoriespagetext supports PLURAL
-* (bug 18860) Blocks of IPs affecting registered users can now block email
-* (bug 17093) Date and time are separate parameters in Special:BlockList
-* (bug 11484) Added ISO speed rating to default collapsed EXIF metadata view
-* (bug 14866) Messages 'recentchangeslinked-toolbox' and
- 'recentchangeslinked-toolbox' were added to allow more fine grained
- customisation of the user interface
-* DISPLAYTITLE now accepts a limited amount of wiki markup (the single-quote
- items)
-* Special:Search now could search terms in all variant-forms. ONLY apply on
- wikis enabled LanguageConverter.
-* Add autopromote condition APCOND_BLOCKED to autopromote blocked users to
- various user groups.
-* Add $wgRevokePermissions as a means of restricting a group's rights. The
- syntax is identical to $wgGroupPermissions, but users in these groups will
- have these rights stripped from them.
-* Added a PHP port of CDB (constant database), for improved local caching when
- the DBA extension is not available.
-* Introduced a new system for localisation caching. The system is based around
- fast fetches of individual messages, minimising memory overhead and startup
- time in the typical case. The database backend will be used by default, but
- set $wgCacheDirectory to get a faster CDB-based implementation.
-* Expanded the number of variables which can be set in the extension messages
- files.
-* Added a feature to allow per-article process pool size control for the parsing
- task, to limit resource usage when the cache for a heavily-viewed article is
- invalidated. Requires an external daemon.
-* (bug 19576) Moved the id attribues from the anchors accompanying section
- headers to the <span class="mw-headline"> elements within the section headers,
- removing the redundant anchor elements.
-* Parser::setFunctionTagHook now can be used to add a new tag which is parsed at
- preprocesor level.
-* Added $wgShowArchiveThumbnails, allowing sysadmins to disable thumbnail
- display for old versions of images.
-* In watchlists and Special:RecentChanges, the difference in page size now
- appears in dark green if bytes were added and dark red if bytes were removed.
-* Added FSRepo configuration properties thumbUrl and thumbDir, to allow the
- thumbnails to be stored in a separate location to the source images.
-* If config/ directory is not executable, the command to make it executable
- now asks the user to cd to the correct directory
-* Add experimental new external authentication framework, ExternalAuth
-* (bug 18768) Remove AdminSettings requirements. Maintenance environment
- will still load it if it exists, but it's not required for anything
-* (bug 19900) The "listgrouprights-key" message is now wrapped in a div with
- class "mw-listgrouprights-key"
-* (bug 471) Allow RSS feeds for watchlist, using an opt-in security token
-* (bug 10812) Interwiki links can have names and descriptions, fetched from
- message 'interwiki-desc-PREFIX', not really used anywhere yet though
-* (bug 9691) Add type (signup or login) parameter to
- AuthPlugin::ModifyUITemplate()
-* (bug 14454) "Member of group(s)" in Special:Preferences causes language
- difficulties
-* (bug 16697) Unicode combining characters are difficult to edit in some
- browsers
-* Parser test supports uploading results to remote CodeReview instance
-* (bug 20013) Added CSS class "mw-version-ext-version" is wrapped on the
- extension version in Special:Version
-* (bug 20014) Added CSS class "mw-listgrouprights-right-name" is wrapped on the
- right name in Special:ListGroupRights
-* (bug 12920) New CoreParserFunction {{nse:...}} as an url-friendly equivalent
- to {{ns:...}}
-* (bug 16322) Allow maintenance scripts to accept DB user/pass over input or
- params
-* (bug 18566) Maintenance script to un/protect pages
-* (bug 671) The HTML <abbr> tag is now permitted.
-* RecentChanges now has a legend to explain what the Nmb! flags mean, and the
- flags have tooltips.
-* (bug 15209) New hook BeforeInitialize called after everything has been setup
- but before Mediawiki::performRequestForTitle()
-* wgMainPageTitle variable now available to JavaScript code to identify the main
- page link, so it doesn't have to be extracted from the link URLs.
-* (bug 16836) Display preview of signature in user preferences and describe its
- use
-* The default output format is now HTML 5 instead of XHTML 1.0 Transitional.
- This can be disabled by setting $wgHtml5 = false;. Specific features enabled
- if HTML 5 is used:
-** Some extra inputs will be autofocused, in supporting browsers.
-** The summary attribute has been removed from tables of contents. summary is
- obsolete in HTML 5 and wasn't useful here anyway.
-** Unnecessary type="" attribute removed for CSS and JS.
-** If $wgWellFormedXml is set to false, some bytes will be shaved off of HTML
- output by omitting some things like quotation marks where HTML 5 allows.
-** (bug 16921) maxlength enabled for page move comments
-* The description message in $wgExtensionCredits can be an array with parameters
-* New hook SpecialRandomGetRandomTitle allows extensions to modify the selection
- criteria used by Special:Random and subclasses, or substitute a custom result,
- deprecating the $wgExtraRandompageSQL config variable
-* (bug 20318) Distinct CSS classes for ISBN/RFC/PMID special links added
-* (bug 20404) Custom fields in the user creation form template can now have
- detail labels in prefsectiontip divs.
-* MakeSysop and MakeBot are now aliases for Special:UserRights
-* IndexPager->mLimitsShown can now be an associative array of limit => text-to-
- display-in-limit-form.
-* (bug 18880) LogEventsList::showLogExtract() can now take a string-by-reference
- and add its HTML to it, rather than having to go straight to $wgOut.
-* Added $wgShowDBErrorBacktrace, to allow users to easily gather backtraces for
- database connection and query errors.
-* Show change block / unblock link on Special:Contributions if user is blocked
-* Display note on Special:Contributions if the user is blocked, and provide an
- excerpt from the block log.
-* (bug 19646) New hook: ImgAuthBeforeStream for tests and functionality before
- file is streamed to user, but only when using img_auth
-* Note on non-existing user and user talk pages if user does not exist
-* New hook ShowMissingArticle so extensions can modify the output for
- non-existent pages.
-* Admins could disable some variants using $wgDisabledVariants now. ONLY apply
- on wikis enabled LanguageConverter.
-* (bug 16310) Credits page now lists IP addresses rather than saying the number
- of anonymous users that edited the page
-* New permission 'sendemail' added. Default right for all registered users. Can
- for example be used to prevent new accounts from sending spam.
-* (bug 16979) Tracking categories for __INDEX__ and __NOINDEX__
-* Two new hooks, ConfirmEmailComplete and InvalidateEmailComplete, which are
- called after a user's email has been successfully confirmed or invalidated.
-* (bug 19741) Moved the XCF files out of the main MediaWiki distribution, for
- a smaller subversion checkout.
-* (bug 13750) First letter capitalization can now be a per-namespace setting
-* (bug 21073) "User does not exist" message no longer displayed on sub-sub-pages
- of existing users
-* (bug 21095) Tracking categories produced by the parser (expensive parser
- function limit exceeded, __NOINDEX__ tracking, etc) can now be disabled by
- setting the system message ([[MediaWiki:expensive-parserfunction-category]]
- etc) to "-".
-* Added maintenance script sqlite.php for SQLite-specific maintenance tasks.
-* Rewrote Special:Upload to allow easier extension.
-* Upload errors that can be solved by changing the filename now do not require
- reuploading.
-* Added $wgRateLimitsExcludedIPs, to allow specific IPs to be whitelisted from
- rate limits.
-* (bug 21222) When $wgUseTeX is not enabled, <math> is no longer registered with
- the parser so extensions are free to implement their own <math> tag
-* (bug 21047) Wrap 'cannotdelete' into a div with the generic 'error' class and
- an own 'mw-error-cannotdelete' class
-* New hook AbortNewAccountAuto, called before account creation from AuthPlugin-
- or ExtUser-driven requests.
-* (bug 3480) The warning saying that the page has a history when deleting it now
- contains the number of revisions in the history
-* $wgStylePath and $wgLogo are now set in the default LocalSettings.php file.
-* (bug 20186) Allow filtering history for revision deletion.
-* New hook OtherBlockLogLink, called in Special:IPBlockList and Special:Block
- to show links to block logs of other blocking extensions, i.e. GlobalBlocking
-* Added search capabilities to SQLite backend
-* rebuildtextindex.php maintenance script now supports databases other than
- MySQL
-* upgrade1_5.php now requires to be run --update option to prevent confusion
-* (bug 17662) Customizable default preload/editintro for new sections in the
- respective addsection-preload and addsection-editintro messages
-* Added maintenance script checkSyntax.php that checks for PHP syntax errors
- and common coding mistakes
-* Updated Unicode normalization tables
-* (bug 21604) Spellcheck attribute for editsummary
-* New wgCategories JavaScript global variable for userscripts.
-* (bug 20717) Added checkboxes to hide users with bot and/or sysop group
- membership in SpecialActiveusers
-* Allow \pagecolor and \definecolor in texvc
-* $wgTexvcBackgroundColor contains background color for texvc call
-* (bug 21574) Redirects can now have "303 See Other" HTTP status
-* EditPage refactored to allow extensions to derive new edit modes much easier.
-* (bug 21826) Subsections of Special:Version now also have anchors
-* (bug 19791) Add URL of file source as comment to thumbs (for ImageMagick)
-* (bug 21946) Sorted wikitables do not properly handle minus signs
-* (bug 18885) Red links for media files do not support shared repositories
-* Added $wgFixArabicUnicode, to convert deprecated presentation forms in
- Arabic text to their modern equivalents, and $wgFixMalayalamUnicode, to
- convert ZWJ-based chillu sequences in Malayalam text to their Unicode 5.1
- equivalents.
-* (bug 22051) Returing false in SpecialContributionsBeforeMainOutput hook now
- stops normal output
-* Send new password e-mail in users preference language
-* LanguageConverter now support nested using of manual convert syntax like
- "-{-{}-}-"
-* Upload license preview now uses the API instead of action=ajax
-* (bug 7346) Add <guid> to RSS to avoid duplicates
-* (bug 19996) Added new hooks for Special:Search, which allow to further
- restrict/expand it.
-* (bug 21936) When a revision has been patrolled, there's now a link back to the
- article
-* (bug 22315) SpecialRecentChangesQuery hook now pass $query_options and checks
- the return value
-* Separate unit test suites under t/ and tests/ were merged and moved to
- maintenance/tests/.
-* importImages.php maintenance script can now use the original uploader and
-comment from another wiki.
-* Support for Turck MMCache was removed
-* (bug 14592) Warn users when they try to move their user page that their
- account will not be renamed
-* Show block log on non-existing user (talk) pages of currently blocked users
-
-=== Bug fixes in 1.16 ===
-
-* (bug 18031) Make namespace selector on Special:Export remember the previous
- selection
-* The svn-version version numbers on Special:Version have been removed
-* (bug 17374) Special:Export no longer exports two copies of the same page
-* (bug 18190) Proper parsing in MediaWiki:Sharedupload message
-* (bug 17617) HTML cleanup for ImagePage
-* (bug 17964) namespaceDupes.php no longer fails on an empty interwiki table
-* Improved error handling for image moving
-* (bug 17974) On Special:SpecialPages, restricted special pages are now marked
- with <strong> tags, helps with text-based browsers
-* (bug 18259) Special:DeletedContributions now also uses
- MediaWiki:Sp-contributions-logs for the link to Special:Log
-* Don't add empty title="" attributes to links to anchors on the current page
-* (bug 18291) rebuildrecentchanges.php failed to add deletion log entries
-* (bug 18304) rebuildrecentchanges.php got size changes wrong
-* (bug 18170) Fixed a PHP warning in Parser::preSaveTransform() in PHP 5.3
-* (bug 18289) Database connection error page now returns correct HTML
-* "successbox", "errorbox" and related CSS classes are now available in all
- skins
-* (bug 18316) Removed superfluous name="fulltext" from Special:Search
-* (bug 18331) MediaWiki:Undelete-revision can now have wikitext
-* The "noautoblock" flag is no longer displayed in the block log when blocking
- an IP address
-* (bug 18009) $wgHooks and $wgExtensionFunctions now support closures
-* (bug 17948) Maintenance scripts now exit(0) or exit(1) as appropriate
-* (bug 18377) Time in Enhanced ChangesList lacking localisation
-* (bug 12998) Allow <sup>, <sub>, etc. in DISPLAYTITLE
-* (bug 1553) Lowercase navigation headings in German
-* (bug 7830) Pending transactions failed to commit on loginToUse() error
-* (bug 11613) session.save_handler being over-ridden
-* (bug 11381) session.save_handler being set twice (causes error)
-* (bug 17835) ForeignAPIRepo throwing error on first page load for file
-* (bug 18115) ForeignAPIRepo cache isn't working
-* Fixed a bug caused by LanguageConverter.php, which brings an abnormal '}-'
- after some parsed math syntax.
-* (bug 18441) rebuildrecentchanges.inc no longer ignores $wgLogRestrictions
-* (bug 18317) Bolded selections in 1 | 3 | etc days on RecentChanges now use
- <strong> instead of hardcoded styles
-* (bug 18449) Fixed items number per column on category pages when the total is
- divisible by 3
-* (bug 18121) maintenance/deleteArchivedRevisions.php no longer deletes
- revisions when --delete is not passed
-* (bug 13172) GPS coordinates in image Exif data are now actually displayed
-* Overhaul of preferences system, includes the following bug fixes:
-** (bug 5363) Changes to default preferences now impact registered users.
-** (bug 14806) Hook to enable putting preferences in existing tabs.
-** (bug 17191) Registration date now listed on preferences page.
-** The user_properties table (now used for storing preferences) has been added
- to $wgSharedTables.
-** Note that this change will break some extensions which have not been adapted
- for it.
-* (bug 17020) Adding fallback encodings for Traditional and Simplified Chinese
- languages while the the text is typed as URLs.
-* (bug 17614) Prev / Next links are not shown if all results are shown
-* (bug 18207) Strange spacing before [[irc:...]] links
-* Removed float from the user login form in RTL interface - caused display
- problems in FF2
-* (bug 15008) Redirect images are now subject to Bad image list rules
-* (bug 6802) profileinfo.php now also work on other database servers than MySQL
-* (bug 16925) Diffs no longer fail when $wgExternalDiffEngine is set to
- 'wikidiff' or 'wikidiff2' but extension is not installed
-* (bug 18326) Chmod errors in file repos have been hidden
-* (bug 18718) Comma after a } create a error in IE
-* (bug 18716) Removed redundant class in Modern skin CSS for category links and
- tweaked spacing.
-* (bug 18656) Use proper directory separators in wfMkdirParents()
-* (bug 18549) Make Special:Blockip respect $wgEnableUserEmail and
- $wgSysopEmailBans
-* (bug 16912) Tooltips on images with link= disappear
-* (bug 18389) Localise numbers in EXIF data
-* (bug 18522) Wrap MediaWiki:Protect-cascadeon in a div for identification
-* (bug 18438) Tweak HTML for preview bar for consistency and accessibility
-* (bug 18432) Updated documentation for dumpBackup.php
-* Fix array logic in Sanitizer::removeHTMLtags so that it doesn't strip good
- tags that were redundantly defined.
-* (bug 14118) SpecialPage::getTitleFor does not return a localised name
-* (bug 18698) Renaming non entry point maintenance scripts from .inc.php to
- .inc
-* Deprecated methods Title::getInterwikiLink, Title::userCanCreate(),
- Title::userCanEdit() and Title::userCanMove() have been removed
-* Only show upload links on file description if $wgEnableUploads = true
- and user can upload
-* Don't say "You need to log in to upload/move", because it's possible that
- uploading/moving is disabled for registered users as well (e.g. only sysops)
-* (bug 18943) Handle invalid titles gracefully at Special:Mostlinked
-* (bug 8873) Enable variant conversion in text on 'alt' and 'title' attributes
-* (bug 10837) Introducing the StubUserVariant class to determine the variant
- variable instead of using this to overrules the user language preference.
-* (bug 19014) If user had deletedhistory right, but not undeleted right, then
- show "view" instead of "view/restore" on logs.
-* (bug 19017) TOC level calculation error in an odd case
-* (bug 18999) CSS update for RTL interwiki links
-* (bug 18925) history.js removes class names of list elements on initialization
-* Multiple whitespace in TOC anchors is now stripped, for consistency with the
- link from the edit comment
-* (bug 19112) Preferences now respects $wgUseExternalEditor
-* (bug 18173) MediaWiki now fails when unable to determine a client IP
-* (bug 19170) Special:Version should follow the content language direction
-* (bug 19160) maintenance/purgeOldText.inc is now compatible with PostgreSQL
-* Fixed performance regression in "bad image list" feature
-* Show user preference 'Use live preview' if $wgLivePreview is enabled only
-* (bug 17014) Blocked users can no longer use Special:UserRights unless they
- can add/remove *all* groups (have 'userrights' permission).
-* (bug 19294) Always show Sp-contributions-footer(-anon)
-* Attempts to restrict reading of pages while anonymous viewing is allowed
- via extensions not using the userCan hook and via $wgRevokePermissions now
+* Maintenance script cleanupTitles is now able to fix titles stored
+ in a negative namespace (which is invalid).
+* (bug 19858) Removed obsolete <big> in interface messages.
+* (bug 21456) "Bad title" error when showing non-local interwiki pages no longer
+ displays incorrect tabs.
+* (bug 23190) Improved math representation for text browsers.
+* (bug 22015) Improved upload-by-url error handling and error display.
+* (bug 17941) $wgMaxUploadSize is now honored by all upload sources.
+* (bug 23080) New usernames now limited to 235 bytes so that custom skin files
work.
-* (bug 8445) Multiple-character search terms are now handled properly for
- Chinese
-* (bug 19450) Use formatNum for "Number of edits" in Special:Preferences
-* (bug 11242) Check for MySQL storage engines during installation now checks
- whether the engines are actually available
-* (bug 19390) Omit the "printable version" link on the printable version
-* (bug 18394) img_auth.php now respects userCan
-* (bug 19509) Uploading to a file named '0' previously treated it as null input
- and attempted to upload with the source name. Now warns about not having an
- extension (since 0.ext is perfectly valid)
-* (bug 19468) Enotif preferences are now only displayed when they are turned on
-* (bug 19442) Show/hide options on watchlist only work once
-* (bug 19602) PubMed Magic links now use updated NIH url
-* (bug 19637) externallinks have links to self
-* Don't load Opera 9.5 RTL fixes for Opera 9.6
-* Remove five-year-old KHTMLFixes.css, which is unlikely to be relevant anymore
- and was causing problems.
-* Removed repetition of URIs in the title attributes of external links.
-* (bug 19693) User name is now escaped in "Contributions for ..." link on
- Special:BlockIP
-* (bug 19571) Override buildConcat for SQLite.
-* Log in and log out links no longer return to page view when clicked from
- history view, edit page, or something similar
-* (bug 19513) RTL fixes for new Search UI
-* (bug 16497) Special:Allmessages is paginated
-* (bug 18708) CSS plainlinks class now available to all skins
-* (bug 19590) Database error messages no longer have "MySQL" hardcoded as the
- database type
-* (bug 19759) successbox on Special:Preferences now correctly aligned on
- standard, nostalgia and cologneblue skin
-* (bug 19814) interwiki links from file links ([[File:Foo.jpg|link=de:Test]])
- are no longer recorded in the pagelinks table
-* (bug 19784) date option "ISO 8601" produced illegal id
-* (bug 19761) Removed autogenerated <meta keywords> tag with link data.
- Keyword set was not useful, and is ignored by modern search engines anway.
-* (bug 19827) Special:SpecialPages title is "Upload file
-* (bug 19355) Added .xhtml, .xht to upload file extension blacklist
-* (bug 19287) Workaround for lag on history page in Firefox 3.5
-* (bug 19564) Updated docs/hooks.txt
-* (bug 18751) Fix for buggage in profiling setup for some extensions on PHP 5.1
-* (bug 17139) ts_resortTable inconsistent trimming makes date sorting fragile
-* (bug 19445) Change oldimage table to use ON UPDATE CASCADE for FK to image
- table.
-* (bug 14080) Short notation links to subpages didn't work in edit summaries
-* (bug 17374) Special:Export no longer exports multiple copies of pages
-* (bug 19818) Edits to user CSS/JS subpages can now be marked as patrolled by
- users who can't edit them
-* (bug 19839) Comments in log items are no more double escaped
-* (bug 18161) Fix inconsistent separators in watchlist link toolbars with
- "enhanced recent changes"
-* (bug 16877) Moving a page over a redirect no longer leaves an orphan entry in
- the recentchanges table
-* (bug 16009) Limit selection forms based on Pager now links to the correct page
- when using long urls
-* The display of the language list on the preferences is more comply with the
- BCP 47 standards.
-* (bug 19849) Custom X-Vary-Options header now disabled unless $wgUseXVO is set
-* (bug 19301) Duplicates entries in $wgAddGroups, $wgRemoveGroups,
- $wgGroupsAddToSelf and $wgGroupsRemoveFromSelf are no more displayed on
- Special:ListGroupRights
-* (bug 18799) Special:Userlogin now handles correctly the returnto parameter
- to not link back to Special:Userlogout when user's language isn't the same as
- content's language
-* (bug 19479) Show proper error message when unable to connect to PostgreSQL
- database with username/password in MediaWiki's setup
-* (bugs 18407, 18409) Special:Upload is now listed on Special:Specialpages only
- if uploads are enabled and the user can access it
-* (bug 17988) Spaces before [[Category:]] links are no longer ignored
-* (bug 19957) All known-failing tests now marked disabled; added --run-disabled
- option to parser test suite to run disabled tests if desired.
-* (bug 16311) Make recent change flags (n/m/b) <abbr>s instead of <span>s
-* (bug 15680) Split the edit tip message of user CSS/JS subpage into
- "usercssyoucanpreview" and "userjsyoucanpreview" respectively.
-* (bug 12110) Split the rights for editing users' CSS/JS subpage from
- "editusercssjs" into "editusercss" and edituserjs" respectively.
-* (bug 19394) RecentChanges feed URLs for log items with no revisions
- (eg Newuser, Userrights) are no longer broken
-* (bug 17395) Remote file descriptions use user language ($wgLang), not wiki
- language ($wgContLang)
-* (bug 11867) Lock error on redirect table when running orphans.php
-* (bug 18930) initStats.php now refreshes active users count
-* (bug 18699) Using the nosummary URL option no longer triggers the "You have
- not provided a summary" warning for those who activated it in their
- preferences
-* (bug 18855) commandLine.inc and Maintenance.php are now properly included
- using the full path
-* (bug 18497) Fixed broken style sheets in Opera fullscreen mode
-* (bug 16084) Default memory limit has be increased to 50M, see $wgMemoryLimit
-* (bug 17864/19519) Added proper input normalization in Special:UserRights
-* (bug 20086) Add Hook to add extra statistics at the end of Special:Statistics
-* (bug 19289) importDump.php can now handle bzip2 and 7zip
-* (bug 20131) Fixed a PHP notice for users having the "rollback" right on
- Special:RecentChangesLinked
-* Do not transform EXIF fields with pure text to avoid results like
- foo,bar@example,com
-* (bug 20176) Fix login/logout links in skin CologneBlue
-* (bug 20203) "Powered by Mediawiki" now has height/width on image tag
-* (bug 20273) Fix broken output when no pages are found in the content
- namespaces
-* (bug 20265) Make AncientPages and UnusedFiles work on SQLite
-* Fixed XSS vulnerability for Internet Explorer clients (only pre-release
- versions of MediaWiki were affected).
-* (bug 14817) Moving a page to a subpage of itself moves it twice
-* (bug 20289) $wgMaximumMovedPages should only count pages actually moved
-* (bug 15248) Non-breaking spaces and certain other Unicode space characters
- are now normalized to ordinary spaces in titles; if your wiki has existing
- titles with such characters, run cleanupTitles.php and/or cleanupImages.php
-* (bug 11143) Links containing invalid UTF-8 percent-code sequences are now
- cleanly disabled instead of breaking parsing entirely on PHP 5.2.
-* (bug 20296) Fixed an PHP warning in Language::getMagic() in PHP 5.3
-* (bug 20358) Unprotect tab was missing accesskey; now same as protect tab.
-* (bug 20317) Cleaned up default main page link accesskey settings
-* (bug 20362) Special:Statistics now produces valid HTML when view counters are
- enabled
-* (bug 19857) maintenance/deleteRevision.php on last revision no longer breaks
- target page
-* (bug 20365) Page name with with c/g/h/j/s/u + x are now correctly handled in
- Special:MovePage with Esperanto as content language
-* (bug 20364) Fixed regression in GIF metadata loading
-* (bug 20299) MediaWiki:Move-subpages and MediaWiki:Move-talk-subpages can now
- use wikitext
-* (bug 15475) DatabaseBase::setFlag(), DatabaseBase::clearFlag() and
- DatabaseBase::getFlag() now have documentation
-* (bug 19966) MediaWiki:License-header is now used for the licensing header in
- the file description page instead of MediaWiki:License
-* (bug 20380) Links to history/deleted edits at the top of
- Special:RevisionDelete are no more displayed when when doing log suppression
-* (bug 8143) Localised parser function names are now correctly case insensitive
- if they contain non-ASCII characters
-* (bug 19055) maintenance/rebuildrecentchanges.php now purges
- Special:Recentchanges's RSS and Atom feed cache
-* The installer will now try to bypass PHP's max_execution_time
-* (bug 20260) SQLite no longer tries to automatically create the database at
- execution time, this now happens only at install time; if it is not available
- at script execution, it now throws an exception
-* Fixed EditFilterMerged hook so the hookError parameter serves a purpose
- (analogous to EditFilter hook)
-* (bug 2257) Tag extensions can expand template parameters provided to the tag,
- by using a new parameter added to the recursiveTagParse function
-* (bug 14900) __INDEX__ and __NOINDEX__ no longer override site config set in
- $wgArticleRobotPolicies.
-* (bug 20466) Hidden categories are no more displayed when printing
-* (bug 20446) When changing user rights with User@remotewiki and remotewiki is
- the local wiki, the user is now treated as the local user
-* (bug 20494) OutputPage::getArticleBodyOnly() no longer requires an useless
- argument
-* (bug 20136) Protection form JavaScript now synchronizes the expiry boxes on
- any change, in addition to onkeyup.
-* Don't link to "edit this page" on MediaWiki:Noarticletext if user is not
- allowed to create page. Done via new message
- MediaWiki:Noarticletext-nopermission
-* Improved compatibility between the Vector skin and addPortletLink() from
- wikibits.js: empty portlets are now present but hidden, adding an element to a
- portlet unhides it
-* (bug 19531) addPortletLink() now wraps inserted labels in a <span> element to
- be compatible with the CSS for the Vector skin
-* (bug 20578) Wrong localized image metadata - duplicated string?
-* (bug 20556) Stub threshold's "other" <input> in Special:Preferences now has a
- correct type="text" parameter
-* (bug 482) Don't include TOC in the printable version if it has been hidden
-* Adjust the time according to the user configuration on Special:Revisiondelete
-* (bug 20624) Installation no longer allows "qqq" as the chosen language
-* (bug 20634) The installer-created database user will now have all rights on
- the database so that upgrades will go more smoothly.
-* (bug 18180) Special:Export ignores limit, dir, offset parameters
-* User::getBlockedStatus() works for all kinds of user objects and doesn't
- assume the user object is equal to the current-user object ($wgUser)
-* (bug 20517) Cancel link from edit page now returns to the old version when
- editing an old version
-* (bug 16902) Installer no longer shows warnings when exec() has been disabled
- by disable_functions
-* (bug 20726) Title::getLatestRevID's documentation now says that the function
- returns false if the page doesn't exist
-* (bug 20751) ForeignApiRepo now urldecodes filenames when saving to local cache
-* (bug 20730) Fix to Special:Version ViewVC link for branch checkouts
-* (bug 20353) wfShellExec() was adding extra quotes on Windows Vista, causing
- command line scripts to fail
-* (bug 20702) Parser functions can now be used correctly in
- MediaWiki:Missing-article
-* (bug 14117) "redirected from" is now also shown on foreign file redirects
-* (bug 17747) Only display thumbnail column in file history if the image can
- be rendered.
-* (bug 3421) Live preview no longer breaks user CSS/JS previews
-* (bug 11264) The file logo on a file description page for documents (PDF, ...)
- now links to the file rather than the file description page
-* Password fields built with HTMLForm now still have the type="password"
- attribute if $wgHtml5=false.
-* (bug 20836) Preload now works for MediaWiki namespace
-* (bug 20885) Search box no longer suggests unavailable special pages
-* (bug 20948) "Create this page" on Special:Search is no longer displayed when
- searching for special pages
-* (bug 20524) Hideuser: Show nice error when trying to block hidden user without
- hideuser right
-* (bug 21026) Fixed file redirects on shared repos on non-English client wikis
-* (bug 21030) Fixed schema choices from being overwritten by defining unique
- field names per driver.
-* (bug 21115) wgCanonicalSpecialPageName javascript variable is now always
- false on non-special pages
-* (bug 21113) "Other statistics" header on Special:Statistics is no more
- displayed when there isn't any entry in it
-* (bug 21114) Special:Contributions no longer shows diff links for new
- revisions
-* (bug 21116) MediaWiki:Templatesused, MediaWiki:Templatesusedpreview and
- MediaWiki:Templatesusedsection now support plural
-* (bug 21079) There is no more line wrapping between label and field in
- Special:Log
-* (bug 20256) Fixed SQL errors on Special:Recentchanges and
- Special:Recentchangeslinked on SQLite backend
-* (bug 20880) Fixed updater failure on SQLite backend
-* (bug 21182) Fixed invalid HTML in Special:Listgrouprights
-* (bug 20242) Installer no longer promts for user credentials for SQLite
- databases
-* (bug 20911) Installer failed to create a SQLite database
-* (bug 20847) Deprecated deprecated akeytt() removed in wikibits.js leaving
- dummy
-* (bug 21161) Changing $wgCacheEpoch now always invalidates file cache
-* (bug 20268) Fixed row count estimation on SQLite backend
-* (bug 20275) Fixed LIKE queries on SQLite backend
-* (bug 21234) Moving subpages of titles containing \\ now works properly
-* (bug 21006) maintenance/updateArticleCount.php now works again on PostgreSQL
-* (bug 19319) Add activeusers-intro message at top of SpecialActiveUsers page
-* (bug 21255) Fixed hostname construction for DNSBL checking
-* (bug 18019) Users are now warned when moving a file to a name in use on a
- shared repository and only users with the 'reupload-shared' permission can
- complete the move.
-* (bug 18909) Add missing Postgres INSERT SELECT wrapper
-* User::isValidPassword now only returns boolean results,
- User::getPasswordValidity can be used to get an error message string
-* The error message shown in Special:ChangePassword now parses wiki markup
-* (bug 19859) Removed experimental HTMLDiff feature
-* Removed section edit links in edit conflict form
-* Allow SpecialActiveusers to work on non-MySQL databases
-* (bug 6579) Fixed protecting images from uploading only
-* (bug 18609) Search index was empty for some pages
-* (bug 13453) rebuildrecentchanges maintenance script works on PG again
-* (bug 16583) Reduce false positives when checking for PHP (on upload, etc.)
-* (bug 20112) Bitrotted tests in the t/ directory were failing.
-* (bug 21470) MediaWiki:Sp-contributions-explain is now wrapped in a <p> with
- id "mw-sp-contributions-explain"
-* (bug 19159) Fixed \overleftrightarrow in texvc
-* (bug 19391) Fix caching for Recent ChangesFeed.
-* (bug 21455) Fixed "Watch this page" checkbox appearing on some special pages
- even to non-logged in users
-* (bug 21551) Rewrote the Squid purge HTTP client to provide a more robust and
- general implementation of HTTP, allowing it to purge non-Squid caches such as
- Varnish.
-* Fixed corruption of long UDP debug log messages by using socket_sendto()
- instead of fsockopen() with fwrite().
-* (bug 16884) Fixed feed links in sidebar not complying with URL parameters
- of the displayed page
-* (bug 21403) memcached class renamed to MWMemecached to avoid conflict with
- PHP's memcached extension
-* (bug 21650) Both calls to SkinTemplateTabs hook are now compatible
-* (bug 21672) Add missing Accept-Language to both Vary and XVO headers
-* (bug 21679) "Edit block reasons" link at the bottom of Special:Blockip is now
- only displayed to the users that have "editinterface" right
-* (bug 21740) Attempting to protect a page that doesn't exist (salting) returns
- "unknown error"
-* (bug 18762) both redirects and links get fixed one after another if
- redirects-only switch is not present
-* (bug 20159) thumbnails rerendered if older that $wgThumbnailEpoch
-* Fixed a bug which in some situations causes the job queue to grow forever,
- due to an infinite loop of job requeues.
-* (bug 21523) File that can have multiple pages (djvu, pdf, ...) no longer have
- the page selector when they have only one page
-* (bug 21559) "logempty" message is now wrapped in a div with class
- "mw-warning-logempty" when used in log extract
-* (bug 20549) Parser tests were broken on SQLite backend
-* (bug 21776) Interwiki urls like http://en.wikibooks.org/wiki/cs: should give
- a redirect instead of a baderror.
-* (bug 21803) Special:MyContributions now keeps the query string parameters
-* Redirecting special pages now keep query string paramters set to "0" (e.g.
- for namespace)
-* (bug 20765) Special:ListGroupRights no longer misses addables and removables
- groups if there are duplicate entries
-* (bug 21814) Message shown when rolling back an edit with a deleted username
- now shows '(username deleted)' instead of broken user tool links
-* (bug 21536) Fixed JavaScript error on Special:Search caused by an incorrect ID
-* (bug 21535) RecentChanges RSS feed now always recognises the namespace filter,
- previously it sometimes didn't due to caching.
-* (bug 20388) ProfilerSimpleText no longer outputs comment on action=raw
-* refreshLinks.php now purges orphaned redirect table rows
-* (bug 2971) Swap links of hist & diff location on Special:Contributions for
- consistency with RC/WL
-* (bug 21986) Special page names were are now capitalized by content language
-* If two log type have the same description, they're now both displayed in the
- type selector on Special:Log
-* (bug 20115) Special:Userlogin title says "Log in / create account" even if the
- user can't create an account
-* (bug 2658) Don't attempt to set the TZ environment variable.
-* (bug 9794) User rights log entries for foreign user now links to the foreign
- user's page if possible
-* (bug 14717) Don't load nonexistent CSS fix files for non-Monobook skins
-* (bug 22034) Use wfClientAcceptsGzip() in wfGzipHandler instead of
- reimplementing it.
-* (bug 19226) First line renders differently on many UI messages.
-* (bug 21303) Comments are no longer stripped from MediaWiki:Common.js and
- skin-specific JS pages
-* (bug 5061) Use the more precise thumbcaption thumbimage and thumbinner classes
- for image divs.
-* Fixed bug involving unclosed "-{" markup in the language converter
-* (bug 21870) No longer include Google logo from an external server on wiki error.
-* (bug 22181) Do not truncate if the ellipsis actually make the string longer
-* (bug 16039) Text disappearing after a bad image
-* (bug 18784) Internal links like [[File:Foo|caption]] should read 'caption',
- not 'File:Foo' when Foo is not an image
-* (bug 21518) Special:UserRights no longer displays the user name box for users
- that can only change their rights
-* (bug 21593) Special:UserRights now lists automatic groups membership
-* (bug 22364) Setting $wgUseExternalEditor to false no longer hides the reupload
- link from file pages
-* Fix bug introduced in MediaWiki 1.12: The author field in
- $wgExtensionCredits is no longer sorted with sort() but rather used
- as it appears in extensions as was the case before r30117 where it
- was unintentionally sorted along with other fields.
-* (bug 19334) Textarea no longer jumps when editing longer articles in IE8
-* Truncate summary of page moves in revision comment field to avoid broken
- multibyte characters
-* (bug 22540) ForeignApiRepos no longer try to store thumbnails that don't exist
-* (bug 22551) Special:Resetpass now has a "Cancel" button that sends the user to
- the page set in the &returnto parameter.
-* (bug 19194) Search box in Modern skin doesn't focus with Safari/Chrome
-* (bug 17790) Users instantly logged off on HughesNet
-
-== API changes in 1.16 ==
-* Added uiprop=changeablegroups to meta=userinfo
-* Added usprop=gender to list=users
-* (bug 18311) action=purge now works for images too
-* Add parentid to prop=revisions output
-* (bug 17832) action=delete returns 'unknownerror' instead of 'permissiondenied'
- when the user is blocked
-* (bug 18546) Added timestamp of new revision to action=edit output
-* (bug 18554) Also list hidden revisions in list=usercontribs for privileged
- users
-* (bug 13049) "API must be accessed from the primary script entry point" error
-* (bug 16422) Don't display help for format=jsonfm unless specifically requested
-* Added PHP and database version to meta=siteinfo output
-* (bug 18533) Add readonly message to meta=siteinfo output
-* (bug 18518) Add clprop=hidden to prop=categories
-* (bug 18710) Fixed internal error with empty parameter in action=paraminfo
-* (bug 18709) Missing descriptions for some parameters in action=paraminfo
- output
-* (bug 18731) Show correct SVN links for extension modules in api.php?version
-* (bug 18730) Add version information to action=paraminfo output
-* (bug 18743) Add ucprop=size to list=usercontribs
-* (bug 18749) Add generator flag to action=paraminfo output
-* Make action=block respect $wgEnableUserEmail and $wgSysopEmailBans
-* Made deleting file description pages without files possible
-* (bug 18773) Add content flag to siprop=namespaces output
-* (bug 18785) Add siprop=languages to meta=siteinfo
-* (bug 14200) Added user and excludeuser parameters to list=watchlist and
- list=recentchanges
-* Added index, fromtitle and byteoffset fields to action=parse&prop=sections
- output
-* (bug 19313) action=rollback returns wrong revid on master/slave setups
-* (bug 19323) action=parse doesn't return section tree on pages with Cite
- warnings
-* (bug 18720) Add anchor field to action=parse&prop=sections output
-* (bug 19423) The initial file description page used caption in user lang
- rather than UI lang
-* (bug 17809) Add number of users in user groups to meta=siteinfo
-* (bug 18533) Add readonly reason to readonly exception
-* (bug 19528) Added XSLT parameter to API queries in format=xml
-* (bug 19040) Fix prependtext and appendtext in combination with section
- parameter in action=edit
-* (bug 19090) Added watchlist parameter, deprecated watch and unwatch
- parameter in action=edit
-* Added fields to list=search output: size, wordcount, timestamp, snippet
-* Where supported by backend, list=search adds a 'searchinfo' element with
- optional info: 'totalhits' count and 'suggestion' alternate query term
-* (bug 19907) $wgCrossSiteAJAXdomains added to allow specified (or all)
- external domains to access api.php via AJAX, if the browser supports the
- Access-Control-Allow-Origin HTTP header
-* (bug 19999) Made metadata and properties of search results optional. Added
- srprop and srinfo.
-* (bug 20700) Add amprop=default to meta=allmessages to list default value for
- customized messages
-* Don't parse magic words in meta=allmessages, output messages unparsed
-* (bug 21105) list=usercontribs can now list contribs for User:0
-* (bug 21085) list=deletedrevs no longer returns only one revision when
- drcontinue param is passed
-* (bug 21106) Deprecated parameters now tagged in action=paraminfo
-* (bug 19004) Added support for tags
-* (bug 21083) list=allusers no longer returns current timestamp for users
- without registration date
-* (bug 20967) action=edit allows creation of invalid titles
-* (bug 19523) Add inprop=watched to prop=info
-* (bug 21589) API: Separate summary and initial page text for uploads
-* (bug 21817) list=usercontribs returns empty result for empty ucuser
-* (bug 21441) meta=userinfo&uiprop=options no longer returns default options
- for logged-in users under certain circumstances
-* (bug 21945) Add chomp control in YAML
-* Expand the thumburl to an absolute url to make it consistent with url and
- descriptionurl
-* (bug 20233) ApiLogin::execute() doesn't handle LoginForm :: RESET_PASS
-* (bug 22061) API: add prop=headitems to action=parse
-* (bug 22240) API: include time in siteinfo
-* (bug 22241) Quick edit is still using the deprecated watch parameter (API: Setting default for watch/unwatch wrongly set)
-* (bug 22245) blfilterredirect=nonredirects in blredirect mode wrongly filtering
-* (bug 22248) Output extension URLs in meta=siteinfo&siprop=extensions
-* Support key-params arrays in 'descriptionmsg' in meta=siteinfo&siprop=extensions
-* (bug 21922) YAML output should quote asterisk when used as key
-* (bug 22297) safesubst: to allow substitution without breaking transclusion
-* (bug 18758) API read of watchlist's wl_notificationtimestamp
-* (bug 20809) Expose EditFormPreloadText via the API
-* (bug 18427) Comment (edit summary) parser option for API
-* (bug 18608) API should provide list of CSS styles to apply to rendered output
-* (bug 18771) List possible errors in action=paraminfo
-
-=== Languages updated in 1.16 ===
-
-MediaWiki supports over 330 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of MediaZilla reports.
-
-* Capiznon (cps) (new)
-* North Frisian (frr) (new)
-* Kirmanjki (kiu) (new)
-* Komi-Permyak (koi) (new)
-* Karachay-Balkar (krc) (new)
-* Latgalian (ltg) (new)
-* Hill Mari (mrj) (new)
-* Prussian (prg) (new)
-* Romagnol (rgn) (new)
-* Rusyn (rue) (new)
-* Lower Silesian (sli) (new)
-* Picard (pcd) (new)
-* Uyghur (Arabic script) (ug-arab) (new)
-* Upper Franconian (vmf) (new)
-* Votic (vot) (new)
-* Eastern Yiddish (ydd) (removed)
-* Iriga Bicolano (bto) (removed)
-* Ladin (lld) (removed)
-* Palembang (plm) (removed)
-* Megleno-Romanian (Greek script) (ruq-grek) (removed)
-* Tamazight (tzm) (removed)
-
-* (bug 18474) Sorani (ckb - Central Kurdish) (renamed from ku-arab)
-* Add PLURAL function for Scots Gaelic (gd)
-* Add Estonian letters äöõšüž to linktrail (et)
-* (bug 18776) Native name of Burmese language (my)
-* (bug 18806) Use correct unicode characters in spelling of native Chuvash
- (Чӑвашла)
-* (bug 18864) Updated autonym for Zhuang language
-* (bug 18308) Updated date formatting in Occitan (oc)
-* (bug 19080) Added ăâîşţșțĂÂÎŞŢȘȚ to Romanion (ro) linktrail
-* (bug 19286) Correct commafying function in Polish (pl)
-* (bug 19441) Updated date formatting for Lithuanian
-* (bug 19630) Added ÄäÇçĞğŇňÖöŞşÜüÃýŽž to Turkmen (tk) linktrail
-* (bug 19949) New linktrail for Greek (el)
-* (bug 19809) Korean (North Korea) (ko-kp) (new)
-* (bug 19968) Fixed "Project talk" namespace name for Maltese (mt)
-* (bug 21168) Added áâãàéêçíóôõúü to Portuguese (pt) linktrail
-* (bug 21596) Change interwiki link for Kurdish (ku)
+* (bug 23075) Correct MediaTransformError default width in gallery.
+* (bug 16487) The Anonymous user account used on Postgres is no longer
+ displayed on Special:Listusers.
+* (bug 23313) Move watchlisthidepatrolled above token in watchlist preferences
+ to enhance preference grouping.
+* (bug 23298) Interwiki links with prefix only in log summaries now link to the
+ correct link.
+* (bug 23284) Times are now rounded correctly.
+* (bug 23375) Added ogv, oga, spx as extensions for ogg files.
+* (bug 18408) All required permissions for uploading (upload, edit, create).
+ are now checked when loading Special:Upload. Toolbar link for Special:Upload
+ is no longer shown if the user does not have the required permissions.
+* (bug 23397) texvc in html mode renders \sim as &tilde; not &sim;
+* (bug 23241) License selector should be disabled during upload of a new
+ version.
+* (bug 23240) Add ID to namespace selector form on Special:Watchlist.
+* The pipe | character in urls is now escaped.
+* (bug 23422) mp3 files can now be moved.
+* (bug 23448) MediaWiki:Summary-preview is now displayed instead of
+ MediaWiki:Subject-preview when previewing summary.
+* (bug 23426) The {{REVISIONMONTH}} variable is now zero-padded and added
+ new variable {{REVISIONMONTH1}} when unpadded version is needed.
+* Special:Userrights didn't recognize user as changing his/her own rights if
+ user did not capitalize first letter of username.
+* (bug 23507) Add styles for printing wikitables.
+* (bug 19586) Avoid JS errors in mwsuggest when using old browsers such
+ as Opera 8.
+* (bug 23563) Old skins now support $wgUploadNavigationUrl and take into
+ account upload rights.
+* (bug 1347) Render \phi in math using images, in order to create consistent
+ and correct render results.
+* (bug 16573) Render \epsilon in math using images, in order to create
+ consistent and correct render results.
+* (bug 22541) Support image redirects when using ForeignAPIRepo.
+* (bug 22967) Make edit summary length cut-off behave correctly for multibyte
+ characters.
+* (bug 8689) Long numeric lines no longer kill the parser.
+* (bug 23740) Article::doRedirect() now use $extraQuery parameter correctly if
+ the $noRedir parameter is set to true.
+* (bug 23688) Correct mime types for Office 2007 OpenXML documents.
+* (bug 23787) Corrected $wgDefaultSkin's comment in DefaultSettings.php.
+* (bug 23797) Xml::input() now allows '0' for the value parameter.
+* (bug 23747) Make sure that on History pages, the RevDel button is not
+ accidentally activated when hitting enter.
+* (bug 23845) Special:ListFiles now uses correct file names without underscores.
+* Ask for permanent login in Special:Preferences only if $wgCookieExpiration > 0.
+* (bug 16356) Repair dumpInterwiki.inc to use proper normalization.
+* (bug 24006) deleteArchivedRevisions.php maintenance script now longer throws
+ a fatal error.
+* (bug 23465) Don't ignore the predefined destination filename on
+ Special:Upload after following a red link.
+* (bug 23642) Recognize mime types of MS OpenXML documents.
+* (bug 22784) Normalise underscores and spaces in autocomments.
+* (bug 19910) Headings of the form ===+\s+ are now displayed as valid headings.
+* (bug 24022) Only check file extensions on the uploadpage when needed.
+* (bug 24076) Recognize Office 2003 files with OpenXML trailers.
+* (bug 24244) Updated comments in DefaultSettings.php to reflect.
+ Image: --> File: namespace rename.
+* Make wfTimestamp recognize negative unix timestamp values.
+* (bug 24401) SimpleSearch: No button/text indicating 'Search' if image is
+ disabled.
+* (bug 23293) Do not show change tags when Special:RecentChanges(linked) or
+ Special:Newpages is transcluded into another page as it messes up the page.
+* (bug 24517) LocalFile::newFromKey() and OldLocalFile::newFromKey() no longer
+ throw fatal errors.
+* (bug 23380) Uploaded files that are larger than allowed by PHP now show a
+ useful error message.
+* Uploading to a protected title will allow the user to choose a new name
+ instead of showing an error page.
+* (bug 24425) Use Database::replace instead of delete/insert in
+ SqlBagOStuff::set to avoid query errors about duplicate keynames.
+* (bug 15470) First letters of filenames are always capitalized by upload JS.
+* (bug 21215) NoLocalSettings.php doesn't tolerate rewrite rules.
+* (bug 21052) Fix link color for stubs in NewPages.
+* (bug 24714) Usage of {{#dateformat: }} in wikis without $wgUseDynamicDates no
+ longer pollutes the parser cache.
+* (bug 17031) Correct which characters the parser allows in tag attributes (a
+ letter, colon or underscore followed by 0 or more letters, numbers, colons,
+ underscores, hyphens, and/or periods).
+* Save 200 useless queries on each category page view.
+* Shell commands will now work on Linux in filesystems mounted noexec.
+* (bug 24804) Corrected commafying in Polish and Ukrainian.
+* "Difference between pages" is now displayed instead of "Difference between
+ revisions" on diffs when appropriate.
+* (bug 23703) ForeignAPIRepo fails on findBySha1() when using a 1.14 install as
+ a repository due to missing 'name' attribute from the API list=allimages.
+* (bug 24898) MediaWiki uses /tmp even if a vHost-specific tempdir is set, also
+ make wfTempDir() return a sane value for Windows on worst-case.
+* (bug 24824) Support ImageMagick 6.5.6-2+ JPEG decoder size hint, to reduce
+ memory usage when such an ImageMagick is used for scaling.
+* Disable multithreaded behaviour in recent ImageMagick, to avoid a deadlock
+ when a resource limit such as $wgMaxShellMemory is hit.
+* (bug 24981) Allow extensions to access SpecialUpload variables again.
+* (bug 20744) Wiki forgets about an uploaded file.
+* (bug 17913) Don't show "older edit" when no older edit available.
+* (bug 6204) TOC not properly rendered when using $wgMaxTocLevel.
+* (bug 24977) The accesskey in history page now lead directly to the diff.
+ instead of alternating focus between the two buttons.
+* (bug 24987) Special:ListUsers does not take external groups into account.
+* (bug 20633) update.php has mixed language output.
+* SQLite system table names are now never prefixed.
+* (bug 25292) SkinSubPageSubtitle hook now passes the Skin object as second
+ parameter.
+* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16).
+* (bug 25367) wfShellExec() is more explicit when failing due to disabled
+ passthru().
+* (bug 25462) Fix double-escaping for section edit link tooltips.
+* action=raw was removed for Special:Statistics. This information is still
+ available via the API.
+* (bug 23934) Groups defined in $wgRevokePermissions but not in
+ $wgGroupPermissions now appear on Special:ListGroupRights.
+* (bug 23923) Special:Prefixindex no longer shows results if nothing was
+ requested.
+* (bug 22308) Search now finds text in default main page immediately after setup.
+* (bug 25697) Make sure empty lines render in diff view.
+* Use an actual minus sign in diff views, instead of a hyphen.
+* (bug 23732) Clarified "n links" message on Special:MostLinkedFiles.
+* (bug 23731) Clarified "n links" message on Special:MostLinkedTemplates.
+* (bug 25642) A exception is now thrown instead of a fatal error when using
+ $wgSMTP without PEAR mail package.
+* (bug 19633) When possible, Upscale small SVGs when creating thumbnails.
+* (bug 11013) Database driver detection needs rewriting for robustness.
+* (bug 13409) Installer prompts could use clarification--now has help boxes.
+* (bug 16902) Installer spews warnings when exec() and dl() are not available.
+* (bug 19129) Only show MyISAM/InnoDB when supported.
+* (bug 17762) Only show other e-mail options when e-mail is globally enabled.
+* Cache multiple sizes of InstantCommons thumbnails.
+* (bug 25488) Disallowing anonymous users to read pages no longer throws error
+ on discussion pages with vector as default skin.
+* (bug 24833) Files name in includes/diff/ are now less confusing.
+* (bug 25713) SpecialPage::resolveAlias() now normalise spaces to underscores.
+* (bug 25829) Special:Mypage and Special:Mytalk now forward oldid, diff and dir
+ parameters.
+* (bug 25175) HTML file cache now honor $wgCacheDirectory if
+ $wgFileCacheDirectory is not set.
+* (bug 13353) Diff3 version checks were too strict, did not detect working diff3.
+* (bug 25843) Links to special pages using link= attribute on images are now.
+ normalised like normal links to special pages.
+* (bug 21364) External links using link= attribute on images now respect
+ $wgExternalLinkTarget.
+* (bug 17789) Added a note to the total views on Special:Statistics saying that
+ is doesn't count non-existing pages and special pages.
+* (bug 17996) HTTP redirects are now combined when requesting a special page.
+* (bug 19944) Link on image thumbnails no longer link to "Media:" namespace in
+ some cases.
+* (bug 25670) wfFindFile() now checks the namespace of the given title, only
+ "File" and "Media" are allowed now.
+* (bug 25872) Rename the HttpRequest class to MWHttpRequest to avoid conflict
+ with php extension that defines same class.
+* (bug 20591) There's now a different message on Special:MovePage when
+ $wgFixDoubleRedirects is set to false.
+* Fixed PHP warnings when updating a broken MySQL database.
+* (bug 26023) Corrected deleteBacth.php's documentation.
+* (bug 25451) Improved datetime representation in 32 bit php >= 5.2.
+* Show "skin does not exist error" only when the skin is inputted in the wrong
+ case.
+* (bug 26164) Potential html injection when the database server isn't available.
+* (bug 26160) Upload description set by extensions are not propagated.
+* (bug 9675) generateSitemap.php now takes an --urlpath parameter to allow
+ absolute URLs in the sitemap index (as required e.g. by Google).
+* Partial workaround for bug 6220: at least make files on shared repositories
+ show up as (struck-out) bluelinks instead of redlinks on Special:WantedFiles.
+* rebuildFileCache.php no longer creates inappropriate cache files for redirects.
+* (bug 25512) Subcategory list should not include category prefix for members.
+* (bug 10871) Javascript and CSS pages in MediaWiki namespace are no longer
+ treated as wikitext on preview.
+* Page existence is now not revealed (in the colour of the tabs) to users who
+ cannot read the page in question.
+* (bug 22753) Output from update.php is more clear when things changed, entries
+ indicating nothing changed are now all prefixed by "..."
+* (bug 16019) $wgArticlePath = "/$1" no longer breaks API edit/watch actions.
+* (bug 18372) File types blacklisted by $wgFileBlacklist will no longer be shown as
+ "Permitted file types" on the upload form.
+* (bug 26540) Fixed wrong call to applyPatch in MysqlUpdater.
+* (bug 26034) Make the "View / Read" tab in content_navigation style tabs remain
+ selected when the action is "purge".
+* (bug 26733) Wrap initial table creation in transaction.
+* (bug 26208) Mark directionality of some interlanguage links.
+* (bug 26716) Provide link to instructions for external editor related preferences.
+* (bug 26961) Hide anon edits in watchlist preference now actually works.
+* (bug 1379) Installer directory conflicts with some hosts' configuration panel.
+* (bug 27781) Installer does not warn about 5.1.x. Added a compatibility function
+ for array_key_exists().
+* Fix XML well-formedness on a few pages when $wgHtml5 is true (the default).
+* (bug 28069) MediaWiki fails streaming files when mod_deflate and ob_gzhandler
+ are also set.
+* (bug 26223) Concurrently moving an article to different titles leaks a
+ redirect revision with no page.
+* (bug 15641) Fixed permissions checks in Special:Import which allowed users
+ without the 'import' permission to import pages from configured import sources.
+* (bug 26449) Keep underlines from headings outside of tables and thumbs by
+ adding overflow:hidden to h1,h2,h3,h4,h5,h6 (also fixes editsection bunching).
+* (bug 26708) Remove background-color:white from tables in Monobook and Vector.
+* (bug 26781) {{PAGENAME}} and related parser functions escape their output better.
+* (bug 26716) Provide link to instructions for external editor related preferences
+ and add a comment to the ini control file explaining what is going on.
+* (bug 28422) Remove color:black from tables in Monobook and Vector. And add it
+ to table.wikitable instead.
+* (bug 27560) Search queries no longer fail in walloon language.
+* (bug 27700) The upload protection can now also be set for files that do not
+ exist.
+* (bug 28034) uploading file to local wiki when file exists on shared repository
+ (commons) gives spurious info in the warning message.
+* Usernames get lost when selecting different sorts on Special:listfiles.
+* (bug 28166) UploadBase assumes that 'edit' and 'upload' rights are not per
+ page restrictions.
+* (bug 28242) Make redirects generated by urls containing a local interwiki
+ prefix be a 301 instead of a 302.
+* (bug 28568) Entries in the iwlinks table are now removed on page deletion.
+* (bug 28306) Fix exposure of suppressed usernames in ForeignDBRepo.
+* (bug 28444) Fix regression: edit-on-doubleclick retains revision id again.
+* UtfNormal::cleanUp on an invalid utf-8 sequence no longer returns false if
+ intl installed.
+* (bug 26729) Category pages should return 404 if they do not exist and have no
+ members.
+* (bug 28214) When page not found, sends malformed HTTP/1.x instead of HTTP/1.1
+ in header of response.
+* (bug 27634) TOC title appears in wrong language.
+* (bug 27761) Fix regression: pages with Esperanto titles containing convertible
+ character sequences became unreachable.
+* (bug 27508) SVGMetadataExtractor takes too much resources on huge svgs.
+* (bug 27465) SVG thumbnail generation.
+* (bug 27467) preload can leave UNIQ.
+* (bug 27539) Allow attributes beginning with a digit in wiktext tag parameters.
+* (bug 27328) using relative paths in CSS imports in MediaWiki:Common.css broken
+ in 1.17.
+* (bug 27333) Fix repetitive last-seen time queries on page history.
+* (bug 26250, bug 23817) Fix wfObjectToArray() to descend into arrays; fixes
+ processing of JSON return values for ForeignAPIRepo when native json module
+ not present.
+* (bug 25675) Fix search suggestions for Special: pages with spaces.
+* (bug 25571) Xml::encodeJsVar now passes floats natively instead of converting
+ to strings.
+* (bug 27338) Gallery in 1.17 breaks for audio/video + ogghandler.
+* (bug 27302) Don't append the current timestamp for user/site modules when no
+ user/site JS/CSS is present.
+* (bug 27016) dumpTextPass.php now consider the "output" parameter.
+* (bug 22606) don't send the "someone registred an account" message when setting
+ email address (i.e. old one empty) in user preferences.
+* (bug 26458) Section edit links appear on pages that user does not have right
+ to edit.
+* (bug 28611) Don't die in SqlBagOStuff::incr() if there's a race condition.
+* (bug 16886) Sister projects box moves down the extract of the first result
+ in IE 7.
+* (bug 17398) Fixed "link" parameter in image links with "thumb" or "frame"
+ parameter.
+
+=== API changes in 1.17 ===
+
+* BREAKING CHANGE: action=patrol now requires POST.
+* BREAKING CHANGE: patrol token is no longer the same as edit token.
+* BREAKING CHANGE: Session keys returned by ApiUpload are now strings instead
+ of integers.
+* BREAKING CHANGE: (bug 25303) Fix API parameter integer validation to actually
+ enforce validation on the input values in addition to giving a warning.
+ Also add flag to enforce (die) if integer out of range.
+* (bug 24650) Fix API to work with categorylinks changes.
+* action=parse now correctly returns an error for nonexistent pages.
+* (bug 27201) Special:WhatLinksHere output no longer contains duplicate IDs.
+* (bug 26560) On allusers if limit < total number of users, last user gets
+ duplicated.
+* (bug 27715) imageinfo didn't respect revdelete.
+* (bug 27479) API error when using both prop=pageprops and
+ prop=info&inprop=displaytitle.
+* (bug 27862) Useremail module didn't properly return success on success.
+* (bug 27590) prop=imageinfo now allows querying the media type.
+* (bug 27587) list=filearchive now outputs full title info.
+* (bug 27897) list=allusers and list=users list hidden users.
+* (bug 22738) Allow filtering by action type on query=logevent.
+* (bug 22764) uselang parameter for action=parse.
+* (bug 22944) API: watchlist options are inconsistent.
+* (bug 22868) don't list infinite block expiry date as "now" in API logevents.
+* (bug 22290) prop=revisions now outputs "comment" field even when comment.
+ is empty, for consistency with list=recentchanges.
+* (bug 19721) API action=help should have a way to just list for a specific
+ module.
+* (bug 23458) Add support for pageid parameter to action=parse requests.
+* (bug 23460) Parse action should have a section option.
+* (bug 21346) Make deleted images searchable by hash.
+* (bug 23461) Normalise usage of parameter names in parameter descriptions.
+* (bug 23548) Allow access of another users watchlist through watchlistraw
+ using token and username.
+* (bug 23524) Api Modules as followup to bug 14473 (Add iwlinks table to
+ track inline interwiki link usage).
+* Add pltitles and tltemplates to prop=links and prop=templates respectively,
+ similar to prop=categories's clcategorie.
+* (bug 23834) Invalid "thumbwidth" and "thumbheight" in "imageinfo" query when
+ thumbnailing larger than original image.
+* (bug 23835) Need "thumbmime" result in "imageinfo" query.
+* (bug 23851) Repair diff for file redirect pages.
+* (bug 24009) Include implicit groups in action=query&list=users&usprop=groups.
+* (bug 24016) API: Handle parameters specified in simple string syntax
+ ( 'paramname' => 'defaultval' ) correctly when outputting help.
+* (bug 24089) Logevents causes PHP Notice if leprop=title isn't supplied.
+* (bug 23473) Give description of properties on all modules.
+* (bug 24136) unknownerror when adding new section without summary, but
+ forceditsummary.
+* (bug 22339) Added srwhat=nearmatch to list=search to get a "go" result.
+* (bug 24303) Added new &servedby parameter to all actions which adds the
+ hostname that served the request to the result. It is also added
+ unconditionally on error.
+* (bug 24185) Titles in the Media and Special namespace are now supported for
+ title normalization in action=query. Special pages have their name resolved
+ to the local alias.
+* (bug 24296) Added converttitles parameter to convert titles to their
+ canonical language variant.
+* (bug 23936) Add "displaytitle" to query/info API.
+* (bug 24485) Make iwbacklinks a generator, optionally display iwprefix and
+ iwtitle.
+* (bug 24564) Fix fatal errors when using list=deletedrevs, prop=revisions or
+ one of the backlinks generators with limit=max.
+* (bug 24656) API's parse module needs option to disable PP report.
+* PARAM_REQUIRED parameter flag added. If this flag is set, and the end user
+ does not set the parameter, the API will automatically throw an error.
+* (bug 24665) When starttimestamp is not specified, fake it by setting it to
+ NOW, not to the timestamp of the last edit.
+* (bug 24677) axto= parameters added to allcategories, allimages, alllinks,
+ allmessages, allpages, and allusers.
+* (bug 24236) Add add, remove, add-self, remove-self tags to
+ meta=siteinfo&siprop=usergroups.
+* (bug 24484) Add prop=pageprops module.
+* (bug 24330) Add &redirect parameter to ?action=edit.
+* (bug 24722) For list=allusers&auprop=blockinfo, only show blockedby and
+ blockreason if the user is actually blocked.
+* Add format=dump and format=dumpfm, outputs results in PHP's var_dump() format.
+* For required string parameters, if '' is provided, this is now classed as
+ missing.
+* (bug 24724) list=allusers is out by 1 (shows total users - 1).
+* (bug 24166) API error when using rvprop=tags.
+* Introduced "asynchronous download" mode for upload-by-url. Requires
+ $wgAllowAsyncCopyUploads to be true.
+* sinumberingroup correctly gives size of 'user' group, and omits size of
+ implicit groups rather than showing 0.
+* (bug 25248) API: paraminfo errors with certain modules.
+* (bug 24792) API help for action=purge sometimes wrongly stated whether a
+ POST request was needed due to cache pollution.
+* Added iiprop=parsedcomment to prop=imageinfo, similar to prop=revisions.
+* Added rvparse to parse revisions. For performance reasons if this option is
+ used, rvlimit is enforced to 1.
+* (bug 25748) If a action=parse request provides an oldid that is actually the
+ current revision id, try the parser cache, and save it to it if necessary.
+* (bug 25463) Export header should not be shown if no pages were requested, to
+ reduce confusion.
+* (bug 25648) API discovery information has been added as RSD link in page.
+ <head> and by providing an API module action=rsd. Added hook
+ ApiRsdServiceApis for extensions to add their own service to the services
+ list.
+* The HTML of diff output markers has changed. Hyphens are now minus signs,
+ empty markers are now filled with non-breaking-space characters.
+* (bug 25741) Add more data to list=search's srprop.
+* (bug 25760) counter property still reported by the API when
+ $wgDisableCounters enabled.
+* (bug 25987) prop=info&inprop=watched now also works for missing pages.
+* (bug 26006) prop=langlinks now allows obtaining full URL.
+* (bug 26075) ApiDelete.php now calls correctly ArticleDelete hook.
+* (bug 26089) add block expiration to blockinfo.
+* (bug 26125) prop=imageinfo&iiprop=size now returns the page count if the
+ file is a multi-page file.
+* (bug 10268) Added linktodiffs parameter on action=feedwatchlist.
+* (bug 26219) Show API limits for multi values in description.
+* (bug 28070) Fix watchlist RSS for databases that store timestamps in a
+ real timestamp field.
+* (bug 27722) list=filearchive now supports revdel.
+
+=== Language support changes in 1.17 ===
+
+MediaWiki supports over 330 languages. Many localizations are updated regularly.
+
+The following languages were added:
+
+* Moroccan Spoken Arabic (ary)
+* Banjar (bjn)
+* Kabardian (kdb)
+* Kabardian (Cyrillic) (kbd-cyrl)
+* Latgalian (ltg)
+* Minangkabau (min)
+* Dutch (informal) (nl-informal)
+* Rusyn (rue)
+
+Other significant changes to MediaWiki's language support:
+
+* Fiji Hindi (Devangari script) was removed.
+* Removed deprecated language code "dk" (Danish), use "da" instead.
+* Link trail added for sl and sh.
+* (bug 27633) Add characters to linkTrail for Portuguese (pt and pt-br).
+* (bug 23156) Commafy and search normalization updated for Belarusian
+ (Taraškievica).
+* (bug 23283) Native name for Old English -> Ænglisc.
+* (bug 23364) Native name for Azerbaijani -> Azərbaycanca.
+* (bug 24593) Native name for Sorani now uses only Arabic script.
+* (bug 24628) Generic translations for NS_USER/NS_USER_TALK for Esperanto.
+* (bug 24917) Polish as fallback for Kashubia.
+* (bug 24794) Tatar link trail updated.
+* Esperanto date format corrected.
+* (bug 28159) Change interwiki name of language kbd to КъÑбÑÑ€Ð´ÐµÐ¸Ð±Ð·Ñ /
+ Qabardjajəbza.
+* (bug 28184) Namespaces for the Latgalian Wikipedia.
+* (bug 25010) Bashkir-language interwikis: linktext change from Башҡорт
+ to БашҡортÑа.
+* (bug 26395) Change name of Cornish language to Kernowek.
+
+=== Other changes in 1.17 ===
+
+* DatabaseFunctions.php that was needed for compatibility with pre-1.3
+ extensions has been removed.
+* XmlFunctions.php has been removed. Use the Xml or Html classes as appropriate.
+* The FailFunction "error handling" method has now been removed
+* Sysops now have the "suppressredirect" right by default
+* Removed $wgRemoteUploads. It was not well supported and superseded by
+ $wgUploadNavigationUrl.
+* (bug 26253) $wgPostCommitUpdateList has been removed
+* The PHPUnit test suite has been removed from this release due to serious issues
+ which should be resolved by the 1.18 release.
+* Oracle DB now uses the __destruct fuction to commit/close connection as it
+ doesn't commit on close if transation is triggered in OCI.
== Compatibility ==
-MediaWiki 1.16 requires PHP 5.1 (5.2 recommended). PHP 4 is no longer supported.
+MediaWiki 1.17 requires PHP 5.2.3 or later.
+
+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
+DB2 and Microsoft SQL Server.
-MySQL 3.23.x is no longer supported; some older hosts may need to upgrade.
-At this time we still recommend 4.0, but 4.1/5.0 will work fine in most cases.
+The supported versions are:
+* MySQL 4.0 or later
+* PostgreSQL 8.3 or later
+* SQLite 3
+* Oracle 9.0.1 or later
== Upgrading ==
-1.16 has several database changes since 1.15, and will not work without schema
+1.17 has several database changes since 1.16, and will not work without schema
updates.
-If upgrading from before 1.11, and you are using a wiki as a commons reposito-
-ry, make sure that it is updated as well. Otherwise, errors may arise due to
+If upgrading from before 1.11, and you are using a wiki as a commons repository,
+make sure that it is updated as well. Otherwise, errors may arise due to
database schema changes.
If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
@@ -1066,43 +819,29 @@ break. Don't forget to always back up your database before upgrading!
See the file UPGRADE for more detailed upgrade instructions.
+For notes on 1.16.x and older releases, see HISTORY.
-=== Caveats ===
+== Online documentation ==
-Some output, particularly involving user-supplied inline HTML, may not
-produce 100% valid or well-formed XHTML output. Testers are welcome to
-set $wgMimeType = "application/xhtml+xml"; to test for remaining problem
-cases, but this is not recommended on live sites. (This must be set for
-MathML to display properly in Mozilla.)
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
-For notes on 1.15.x and older releases, see HISTORY.
+ http://www.mediawiki.org/wiki/Documentation
+== Mailing list ==
-=== Online documentation ===
+A mailing list is available for MediaWiki user support and discussion:
-Documentation for both end-users and site administrators is currently being
-built up on MediaWiki.org, and is covered under the GNU Free Documentation
-License (except for pages that explicitly state that their contents are in
-the public domain) :
-
- http://www.mediawiki.org/wiki/Documentation
-
-
-=== Mailing list ===
-
-A MediaWiki-l mailing list has been set up distinct from the Wikipedia
-wikitech-l list:
-
- http://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+ http://lists.wikimedia.org/mailman/listinfo/mediawiki-l
A low-traffic announcements-only list is also available:
- http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+ http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
It's highly recommended that you sign up for one of these lists if you're
going to run a public MediaWiki, so you can be notified of security fixes.
-
-=== IRC help ===
+== IRC help ==
There's usually someone online in #mediawiki on irc.freenode.net
diff --git a/UPGRADE b/UPGRADE
index 7cd302e9..9e7d0353 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -1,3 +1,4 @@
+
This file provides an overview of the MediaWiki upgrade process. For help with
specific problems, check
@@ -28,7 +29,7 @@ the upgrade scripts are somewhat robust, there is no guarantee that things will
not fail, leaving the database in an inconsistent state.
http://www.mediawiki.org/wiki/Manual:Backing_up_a_wiki provides an overview of
-the upgrade process. You should also refer to the documentation for your
+the backup process. You should also refer to the documentation for your
database management system for information on backing up a database, and to
your operating system documentation for information on making copies of files.
@@ -50,10 +51,15 @@ deleted file archives, and any custom skins.
=== Perform the database upgrade ===
-You will need to have $wgDBadminuser and $wgDBadminpassword set in your
-LocalSettings.php, see there for more info.
+==== From the web ====
+
+If you browse to the web-based installation script (usually at
+/mw-config/index.php) from your wiki installation you can follow the script and
+upgrade your database in place.
+
+==== From the command line ====
-From the command line, browse to the "maintenance" directory and run the
+From the command line, browse to the "maintenance" directory and run the
update.php script to check and update the schema. This will insert missing
tables, update existing tables, and move data around as needed. In most cases,
this is successful and nothing further needs to be done.
@@ -67,6 +73,9 @@ notes to check for configuration changes which would alter the expected
behaviour of MediaWiki.
=== Check installed extensions ===
+
+Extensions usually need to be upgraded at the same time as the MediaWiki core.
+
In MediaWiki 1.14 some extensions are migrated into the core. Please see the
HISTORY section "Migrated extensions" and disable these extensions in your
LocalSettings.php
@@ -80,7 +89,17 @@ and quirks which reveal themselves.
You should also test any extensions, and upgrade these if necessary.
-== Upgrading from 1.8 wikis ==
+== Upgrading from 1.16 or earlier ==
+
+If you have a Chinese or Japanese wiki ($wgLanguageCode is set to one
+of "zh", "ja", or "yue") and you are using MySQL fulltext search, you
+will probably want to update the search index.
+
+In the "maintenance" directory, run the updateDoubleWidthSearch.php
+script. This will update the searchindex table for those pages that
+contain double-byte latin characters.
+
+== Upgrading from 1.8 or earlier ==
MediaWiki 1.9 and later no longer keep default localized message text
in the database; 'MediaWiki:'-namespace pages that do not exist in the
@@ -94,24 +113,19 @@ Note that the large number of deletions may cause older edits to expire
from the list on Special:Recentchanges, although the deletions themselves
will be hidden by default. (Click "show bot edits" to list them.)
-
See RELEASE-NOTES for more details about new and changed options.
-
-== Upgrading from 1.7 wikis ==
+== Upgrading from 1.7 or earlier ==
$wgDefaultUserOptions now contains all the defaults, not only overrides.
If you're setting this as a complete array(), you may need to change it
to set only specific items as recommended in DefaultSettings.php.
-== Upgrading from 1.6 wikis ==
+== Upgrading from 1.6 or earlier ==
$wgLocalTZoffset was in hours, it is now using minutes.
-Link autonumbering got fixed (#5918) for protocols other than http.
- - 'irc://irc.server.tld/' render as a link with a chat icon
- - '[irc://irc.server.tld]' render as an autonumbered link: [1]
-== Upgrading from pre-1.5 wikis ==
+== Upgrading from 1.5 or earlier ==
Major changes have been made to the schema from 1.4.x. The updater
has not been fully tested for all conditions, and might well break.
@@ -167,69 +181,7 @@ If using Memcached, you must enabled it differently now:
should be replaced with:
$wgMainCacheType = CACHE_MEMCACHED;
-
-=== Web installer ===
-
-You can use the web-based installer wizard if you first remove the
-LocalSettings.php file; be sure to give the installer the same
-information as you did on the original install (language/encoding,
-database name, password, etc). This will also generate a fresh
-LocalSettings.php, which you may need to customize.
-
-You may change some settings during the install, but be very careful!
-Changing the encoding in particular will generally leave you with a
-lot of corrupt pages, particularly if your wiki is not in English.
-
-=== Command-line upgrade ===
-
-Additionally, as of 1.4.0 you can run an in-place upgrade script from
-the command line, keeping your existing LocalSettings.php. This requires
-that you set $wgDBadminuser and $wgDBadminpassword with an appropriate
-database user and password with privileges to modify the database structure.
-
-Once the new files are in place, go into the maintenance subdirectory and
-run the script:
-
- php update.php
-
-See caveats below on upgrading from 1.3.x or earlier.
-
-
-== Backups! ==
-
-To upgrade an existing MediaWiki installation, first BACK UP YOUR WIKI!
-If something goes wrong, you want to be able to start again.
-
-Your image files, configuration, etc can simply be copied or archived as
-you would any other files. (Make sure that the contents of your
-LocalSettings.php are not accidentally made public, as this contains
-a database password.)
-
-To back up the database, use the tools provided by your service provider
-(if applicable) or the standard mysqldump or pg_dump programs.
-
-For general help on mysqldump:
-http://dev.mysql.com/doc/mysql/en/mysqldump.html
-
-WARNING: If using MySQL 4.1.x, mysqldump's charset conversion may in
-some cases damage data in your wiki. If necessary, set the charset
-option to 'latin1' to avoid the conversion.
-
-For general help on pg_dump:
-http://www.postgresql.org/docs/current/static/app-pgdump.html
-
-
-== Caveats ==
-
-=== Postgres ===
-
-Postgres support is new, and much of the upgrade instructions may
-not apply. The schema was changed significantly from 1.7 to 1.8,
-so you will need to at least use the update.php or web installer,
-as described above.
-
-
-=== Upgrading from 1.4.2 or earlier ===
+== Upgrading from 1.4.2 or earlier ==
1.4.3 has added new fields to the sitestats table. These fields are
optional and help to speed Special:Statistics on large sites. If you
@@ -241,7 +193,7 @@ manually run the SQL commands from this file:
maintenance/archives/patch-ss_total_articles.sql
-=== Upgrading from 1.4rc1 or earlier betas ===
+== Upgrading from 1.4rc1 or earlier betas ==
The logging table has been altered from 1.4beta4 to 1.4beta5
and again in 1.4.0 final. Copy in the new files and use the web
@@ -254,7 +206,7 @@ files:
maintenance/archives/patch-logging-title.sql
-=== Upgrading from 1.3.x ===
+== Upgrading from 1.3 or earlier ==
This should generally go smoothly.
@@ -272,19 +224,20 @@ to this:
As well as new messages, the processing of some messages has changed.
If you have customized them, please compare the new format using
Special:Allmessages or the relevant LanguageXX.php files:
- copyrightwarning
- dberrortext
- editingcomment (was named commentedit)
- editingsection (was named sectionedit)
- numauthors
- numedits
- numtalkauthors
- numtalkedits
- numwatchers
- protectedarticle
- searchresulttext
- showhideminor
- unprotectedarticle
+
+* copyrightwarning
+* dberrortext
+* editingcomment (was named commentedit)
+* editingsection (was named sectionedit)
+* numauthors
+* numedits
+* numtalkauthors
+* numtalkedits
+* numwatchers
+* protectedarticle
+* searchresulttext
+* showhideminor
+* unprotectedarticle
Note that the 1.3 beta releases included a potential vulnerability if PHP
is configured with register_globals on and the includes directory is
@@ -296,7 +249,7 @@ send them a kind note explaining that it can expose their servers and their
customers to attacks.
-=== Upgrading from 1.2.x ===
+== Upgrading from 1.2 or earlier ==
If you've been using the MediaWiki: namespace for custom page templates,
note that things are a little different. The Template: namespace has been
@@ -316,7 +269,7 @@ to dump the database to SQL, run it through iconv or another conversion tool,
and restore it. Sorry.
-=== Upgrading from 1.1.x or earlier ===
+== Upgrading from 1.1 or earlier ==
This is less thoroughly tested, but should work.
@@ -330,7 +283,7 @@ scripts in maintenance/archives before the installer is able to pick up
with remaining updates.
-=== Upgrading from UseModWiki or old "phase 2" Wikipedia code ===
+== Upgrading from UseModWiki or old "phase 2" Wikipedia code ==
There is a semi-maintained UseModWiki to MediaWiki conversion script at
maintenance/importUseModWiki.php; it may require tweaking and customization
@@ -341,3 +294,5 @@ output SQL statements; direct these to a file and then run that into your
database.
You will have to rebuild the links tables etc after importing.
+
+
diff --git a/api.php b/api.php
index 7c80f734..5c675b06 100644
--- a/api.php
+++ b/api.php
@@ -17,7 +17,7 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
@@ -34,6 +34,9 @@
* in the URL.
*/
+// So extensions (and other code) can check whether they're running in API mode
+define( 'MW_API', true );
+
// Initialise common code
require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
@@ -41,18 +44,7 @@ wfProfileIn( 'api.php' );
$starttime = microtime( true );
// URL safety checks
-//
-// See RawPage.php for details; summary is that MSIE can override the
-// Content-Type if it sees a recognized extension on the URL, such as
-// might be appended via PATH_INFO after 'api.php'.
-//
-// Some data formats can end up containing unfiltered user-provided data
-// which will end up triggering HTML detection and execution, hence
-// XSS injection and all that entails.
-//
-if ( $wgRequest->isPathInfoBad() ) {
- wfHttpError( 403, 'Forbidden',
- 'Invalid file extension found in PATH_INFO or QUERY_STRING.' );
+if ( !$wgRequest->checkUrlExtension() ) {
return;
}
@@ -98,9 +90,6 @@ if ( $wgCrossSiteAJAXdomains && isset( $_SERVER['HTTP_ORIGIN'] ) ) {
}
}
-// So extensions can check whether they're running in API mode
-define( 'MW_API', true );
-
// Set a dummy $wgTitle, because $wgTitle == null breaks various things
// In a perfect world this wouldn't be necessary
$wgTitle = Title::makeTitle( NS_MAIN, 'API' );
diff --git a/config/Installer.php b/config/Installer.php
deleted file mode 100644
index f00a850d..00000000
--- a/config/Installer.php
+++ /dev/null
@@ -1,2353 +0,0 @@
-<?php
-
-# MediaWiki web-based config/installation
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>, 2006 Rob Church <robchur@gmail.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-if( !defined( 'MEDIAWIKI_INSTALL' ) ) {
- die( 'Not an entry point.' );
-}
-
-error_reporting( E_ALL | E_STRICT );
-header( "Content-type: text/html; charset=utf-8" );
-header( 'X-Frame-Options: DENY' );
-@ini_set( "display_errors", true );
-
-# In case of errors, let output be clean.
-$wgRequestTime = microtime( true );
-
-// Run version checks before including other files
-// so people don't see a scary parse error.
-require_once( "$IP/maintenance/install-utils.inc" );
-install_version_checks();
-
-require_once( "$IP/includes/Defines.php" );
-require_once( "$IP/includes/DefaultSettings.php" );
-require_once( "$IP/includes/AutoLoader.php" );
-require_once( "$IP/includes/MagicWord.php" );
-require_once( "$IP/includes/Namespace.php" );
-require_once( "$IP/includes/ProfilerStub.php" );
-require_once( "$IP/includes/GlobalFunctions.php" );
-require_once( "$IP/includes/Hooks.php" );
-require_once( "$IP/includes/Exception.php" );
-require_once( "$IP/includes/json/Services_JSON.php" );
-require_once( "$IP/includes/json/FormatJson.php" );
-
-$wgMaxShellMemory = 0;
-
-# If we get an exception, the user needs to know
-# all the details
-$wgShowExceptionDetails = true;
-$wgShowSQLErrors = true;
-wfInstallExceptionHandler();
-## Databases we support:
-
-$ourdb = array();
-
-$ourdb['mysql'] = array(
- 'fullname' => 'MySQL',
- 'havedriver' => 0,
- 'compile' => 'mysql',
- 'bgcolor' => '#ffe5a7',
- 'rootuser' => 'root',
- 'serverless' => false
-);
-
-$ourdb['postgres'] = array(
- 'fullname' => 'PostgreSQL',
- 'havedriver' => 0,
- 'compile' => 'pgsql',
- 'bgcolor' => '#aaccff',
- 'rootuser' => 'postgres',
- 'serverless' => false
-);
-
-$ourdb['sqlite'] = array(
- 'fullname' => 'SQLite',
- 'havedriver' => 0,
- 'compile' => 'pdo_sqlite',
- 'bgcolor' => '#b1ebb1',
- 'rootuser' => '',
- 'serverless' => true
-);
-
-$ourdb['mssql'] = array(
- 'fullname' => 'MSSQL',
- 'havedriver' => 0,
- 'compile' => 'mssql_not_ready', # Change to 'mssql' after includes/DatabaseMssql.php added;
- 'bgcolor' => '#ffc0cb',
- 'rootuser' => 'administrator',
- 'serverless' => false
-);
-
-$ourdb['ibm_db2'] = array(
- 'fullname' => 'DB2',
- 'havedriver' => 0,
- 'compile' => 'ibm_db2',
- 'bgcolor' => '#ffeba1',
- 'rootuser' => 'db2admin',
- 'serverless' => false
-);
-
-$ourdb['oracle'] = array(
- 'fullname' => 'Oracle',
- 'havedriver' => 0,
- 'compile' => 'oci8',
- 'bgcolor' => '#ffeba1',
- 'rootuser' => 'sys',
- 'serverless' => false
-);
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
-<head>
- <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
- <meta name="robots" content="noindex,nofollow"/>
- <title>MediaWiki <?php echo htmlspecialchars( $wgVersion ); ?> Installation</title>
- <style type="text/css">
-
- @import "../skins/monobook/main.css";
-
- .env-check {
- font-size: 90%;
- margin: 1em 0 1em 2.5em;
- }
-
- .config-section {
- margin-top: 2em;
- }
-
- .config-section label.column {
- clear: left;
- font-weight: bold;
- width: 13em;
- float: left;
- text-align: right;
- padding-right: 1em;
- padding-top: .2em;
- }
-
- .config-input {
- clear: left;
- zoom: 100%; /* IE hack */
- }
-
- .config-section .config-desc {
- clear: left;
- margin: 0 0 2em 18em;
- padding-top: 1em;
- font-size: 85%;
- }
-
- .iput-text, .iput-password {
- width: 14em;
- margin-right: 1em;
- }
-
- .error {
- color: red;
- background-color: #fff;
- font-weight: bold;
- left: 1em;
- font-size: 100%;
- }
-
- .error-top {
- color: red;
- background-color: #FFF0F0;
- border: 2px solid red;
- font-size: 130%;
- font-weight: bold;
- padding: 1em 1.5em;
- margin: 2em 0 1em;
- }
-
- ul.plain {
- list-style-type: none;
- list-style-image: none;
- float: left;
- margin: 0;
- padding: 0;
- }
-
- .btn-install {
- font-weight: bold;
- font-size: 110%;
- padding: .2em .3em;
- }
-
- .license {
- font-size: 85%;
- padding-top: 3em;
- }
-
- span.success-message {
- font-weight: bold;
- font-size: 110%;
- color: green;
- }
-
- .success-box {
- font-size: 130%;
- }
-
- </style>
- <script type="text/javascript">
- <!--
- <?php echo 'var databases = ' . FormatJson::encode( $ourdb ) . ';'; ?>
-
- function show(id, showOrHide) {
- var i = document.getElementById(id);
- if (i) i.style.display = showOrHide ? 'block' : 'none';
- }
- function hideall() {
- for (db in databases) {
- show(db, false);
- }
- }
- function toggleDBarea(id, defaultroot) {
- hideall();
- var dbarea = document.getElementById(id);
- if (dbarea) dbarea.style.display = (dbarea.style.display == 'none') ? 'block' : 'none';
- var db = document.getElementById('RootUser');
- db.value = databases[id].rootuser;
- show('db-server-settings1', !databases[id].serverless);
- show('db-server-settings2', !databases[id].serverless);
- }
- // -->
- </script>
-</head>
-
-<body>
-<div id="globalWrapper">
-<div id="column-content">
-<div id="content">
-<div id="bodyContent">
-
-<h1>MediaWiki <?php print htmlspecialchars( $wgVersion ) ?> Installation</h1>
-
-<?php
-$mainListOpened = false; # Is the main list (environement checking) opend ? Used by dieout
-
-/* Check for existing configurations and bug out! */
-
-if( file_exists( "../LocalSettings.php" ) ) {
- $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
- dieout( "<p><strong>Setup has completed, <a href='../$script'>your wiki</a> is configured.</strong></p>
- <p>Please delete the /config directory for extra security.</p>" );
-}
-
-if( file_exists( "./LocalSettings.php" ) ) {
- writeSuccessMessage();
- dieout( '' );
-}
-
-if( !is_writable( "." ) ) {
- dieout( "<h2>Can't write config file, aborting</h2>
-
- <p>In order to configure the wiki you have to make the <tt>config</tt> subdirectory
- writable by the web server. Once configuration is done you'll move the created
- <tt>LocalSettings.php</tt> to the parent directory, and for added safety you can
- then remove the <tt>config</tt> subdirectory entirely.</p>
-
- <p>To make the directory writable on a Unix/Linux system:</p>
-
- <pre>
- cd <i>" . htmlspecialchars( dirname( dirname( __FILE__ ) ) ) . "</i>
- chmod a+w config
- </pre>
-
- <p>Afterwards retry to start the <a href=\"\">setup</a>.</p>" );
-}
-
-
-require_once( "$IP/maintenance/updaters.inc" );
-
-class ConfigData {
- function getEncoded( $data ) {
- # removing latin1 support, no need...
- return $data;
- }
- function getSitename() { return $this->getEncoded( $this->Sitename ); }
- function getSysopName() { return $this->getEncoded( $this->SysopName ); }
- function getSysopPass() { return $this->getEncoded( $this->SysopPass ); }
-
- function setSchema( $schema, $engine ) {
- $this->DBschema = $schema;
- if ( !preg_match( '/^\w*$/', $engine ) ){
- $engine = 'InnoDB';
- }
- switch ( $this->DBschema ) {
- case 'mysql5':
- $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=utf8";
- $this->DBmysql5 = 'true';
- break;
- case 'mysql5-binary':
- $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=binary";
- $this->DBmysql5 = 'true';
- break;
- default:
- $this->DBTableOptions = "TYPE=$engine";
- $this->DBmysql5 = 'false';
- }
- $this->DBengine = $engine;
-
- # Set the global for use during install
- global $wgDBTableOptions;
- $wgDBTableOptions = $this->DBTableOptions;
- }
-}
-
-?>
-
-<ul>
- <li>
- <b>Don't forget security updates!</b> Keep an eye on the
- <a href="http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
- release announcements mailing list</a>.
- </li>
-</ul>
-
-
-<h2>Checking environment...</h2>
-<p><em>Please include all of the lines below when reporting installation problems.</em></p>
-<ul class="env-check">
-<?php
-$mainListOpened = true;
-
-$endl = "
-";
-define( 'MW_NO_OUTPUT_BUFFER', 1 );
-$conf = new ConfigData;
-
-install_version_checks();
-$self = 'Installer'; # Maintenance script name, to please Setup.php
-
-print "<li>PHP " . htmlspecialchars( phpversion() ) . " installed</li>\n";
-
-error_reporting( 0 );
-$phpdatabases = array();
-foreach (array_keys($ourdb) as $db) {
- $compname = $ourdb[$db]['compile'];
- if( extension_loaded( $compname ) || ( mw_have_dl() && dl( "{$compname}." . PHP_SHLIB_SUFFIX ) ) ) {
- array_push($phpdatabases, $db);
- $ourdb[$db]['havedriver'] = 1;
- }
-}
-error_reporting( E_ALL | E_STRICT );
-
-if (!$phpdatabases) {
- print "Could not find a suitable database driver!<ul>";
- foreach (array_keys($ourdb) AS $db) {
- $comp = $ourdb[$db]['compile'];
- $full = $ourdb[$db]['fullname'];
- print "<li>For <b>$full</b>, compile PHP using <b>--with-$comp</b>, "
- ."or install the $comp.so module</li>\n";
- }
- echo '</ul>';
- dieout( '' );
-}
-
-print "<li>Found database drivers for:";
-$DefaultDBtype = '';
-foreach (array_keys($ourdb) AS $db) {
- if ($ourdb[$db]['havedriver']) {
- if ( $DefaultDBtype == '' ) {
- $DefaultDBtype = $db;
- }
- print " ".$ourdb[$db]['fullname'];
- }
-}
-print "</li>\n";
-
-if( wfIniGetBool( "register_globals" ) ) {
- ?>
- <li>
- <div style="font-size:110%">
- <strong class="error">Warning:</strong>
- <strong>PHP's <tt><a href="http://php.net/register_globals">register_globals</a></tt> option is enabled. Disable it if you can.</strong>
- </div>
- MediaWiki will work, but your server is more exposed to PHP-based security vulnerabilities.
- </li>
- <?php
-}
-
-$fatal = false;
-
-if( wfIniGetBool( "magic_quotes_runtime" ) ) {
- $fatal = true;
- ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime'>magic_quotes_runtime</a> is active!</strong>
- This option corrupts data input unpredictably; you cannot install or use
- MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( wfIniGetBool( "magic_quotes_sybase" ) ) {
- $fatal = true;
- ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.sybase.php#ini.magic-quotes-sybase'>magic_quotes_sybase</a> is active!</strong>
- This option corrupts data input unpredictably; you cannot install or use
- MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( wfIniGetBool( "mbstring.func_overload" ) ) {
- $fatal = true;
- ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload'>mbstring.func_overload</a> is active!</strong>
- This option causes errors and may corrupt data unpredictably;
- you cannot install or use MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( wfIniGetBool( "zend.ze1_compatibility_mode" ) ) {
- $fatal = true;
- ?><li class="error"><strong>Fatal: <a href="http://www.php.net/manual/en/ini.core.php">zend.ze1_compatibility_mode</a> is active!</strong>
- This option causes horrible bugs with MediaWiki; you cannot install or use
- MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( $fatal ) {
- dieout( "Cannot install MediaWiki." );
-}
-
-if( wfIniGetBool( "safe_mode" ) ) {
- $conf->safeMode = true;
- ?>
- <li><b class='error'>Warning:</b> <strong>PHP's
- <a href='http://www.php.net/features.safe-mode'>safe mode</a> is active.</strong>
- You may have problems caused by this, particularly if using image uploads.
- </li>
- <?php
-} else {
- $conf->safeMode = false;
-}
-
-$sapi = htmlspecialchars( php_sapi_name() );
-print "<li>PHP server API is $sapi; ";
-$script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
-if( $wgUsePathInfo ) {
- print "ok, using pretty URLs (<tt>$script/Page_Title</tt>)";
-} else {
- print "using ugly URLs (<tt>$script?title=Page_Title</tt>)";
-}
-print "</li>\n";
-
-$conf->xml = function_exists( "utf8_encode" );
-if( $conf->xml ) {
- print "<li>Have XML / Latin1-UTF-8 conversion support.</li>\n";
-} else {
- dieout( "PHP's XML module is missing; the wiki requires functions in
- this module and won't work in this configuration.
- If you're running Mandrake, install the php-xml package." );
-}
-
-# Check for session support
-if( !function_exists( 'session_name' ) )
- dieout( "PHP's session module is missing. MediaWiki requires session support in order to function." );
-
-# session.save_path doesn't *have* to be set, but if it is, and it's
-# not valid/writable/etc. then it can cause problems
-$sessionSavePath = mw_get_session_save_path();
-$ssp = htmlspecialchars( $sessionSavePath );
-# Warn the user if it's not set, but let them proceed
-if( !$sessionSavePath ) {
- print "<li><strong>Warning:</strong> A value for <tt>session.save_path</tt>
- has not been set in PHP.ini. If the default value causes problems with
- saving session data, set it to a valid path which is read/write/execute
- for the user your web server is running under.</li>";
-} elseif ( is_dir( $sessionSavePath ) && is_writable( $sessionSavePath ) ) {
- # All good? Let the user know
- print "<li>Session save path (<tt>{$ssp}</tt>) appears to be valid.</li>";
-} else {
- # Something not right? Warn the user, but let them proceed
- print "<li><strong>Warning:</strong> Your <tt>session.save_path</tt> value (<tt>{$ssp}</tt>)
- appears to be invalid or is not writable. PHP needs to be able to save data to
- this location for correct session operation.</li>";
-}
-
-# Check for PCRE support
-if( !function_exists( 'preg_match' ) )
- dieout( "The PCRE support module appears to be missing. MediaWiki requires the
- Perl-compatible regular expression functions." );
-
-# The installer can take a while, and we really don't want it to time out
-wfSuppressWarnings();
-set_time_limit( 0 );
-wfRestoreWarnings();
-
-$memlimit = ini_get( "memory_limit" );
-if( $memlimit == -1 ) {
- print "<li>PHP is configured with no <tt>memory_limit</tt>.</li>\n";
-} else {
- print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ). " bytes. ";
- $newlimit = wfMemoryLimit();
- $memlimit = wfShorthandToInteger( $memlimit );
- if( $newlimit < $memlimit ) {
- print "<b>Failed raising limit, installation may fail.</b>";
- } elseif ( $newlimit > $memlimit ) {
- print "Raised <tt>memory_limit</tt> to " . htmlspecialchars( $newlimit ) . " bytes. ";
- }
- print "</li>\n";
-}
-
-$conf->xcache = function_exists( 'xcache_get' );
-if( $conf->xcache )
- print "<li><a href=\"http://trac.lighttpd.net/xcache/\">XCache</a> installed</li>\n";
-
-$conf->apc = function_exists('apc_fetch');
-if ($conf->apc ) {
- print "<li><a href=\"http://www.php.net/apc\">APC</a> installed</li>\n";
-}
-
-$conf->eaccel = function_exists( 'eaccelerator_get' );
-if ( $conf->eaccel ) {
- print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
-}
-
-$conf->dba = function_exists( 'dba_open' );
-
-if( !( $conf->eaccel || $conf->apc || $conf->xcache ) ) {
- echo( '<li>Couldn\'t find <a href="http://eaccelerator.sourceforge.net">eAccelerator</a>,
- <a href="http://www.php.net/apc">APC</a> or <a href="http://trac.lighttpd.net/xcache/">XCache</a>;
- cannot use these for object caching.</li>' );
-}
-
-$conf->diff3 = false;
-$diff3locations = array_merge(
- array(
- "/usr/bin",
- "/usr/local/bin",
- "/opt/csw/bin",
- "/usr/gnu/bin",
- "/usr/sfw/bin" ),
- explode( PATH_SEPARATOR, getenv( "PATH" ) ) );
-$diff3names = array( "gdiff3", "diff3", "diff3.exe" );
-
-$diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
-foreach ($diff3locations as $loc) {
- $exe = locate_executable($loc, $diff3names, $diff3versioninfo);
- if ($exe !== false) {
- $conf->diff3 = $exe;
- break;
- }
-}
-
-if ($conf->diff3)
- print "<li>Found GNU diff3: <tt>$conf->diff3</tt>.</li>";
-else
- print "<li>GNU diff3 not found.</li>";
-
-$conf->ImageMagick = false;
-$imcheck = array( "/usr/bin", "/opt/csw/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
-foreach( $imcheck as $dir ) {
- $im = "$dir/convert";
- if( @file_exists( $im ) ) {
- print "<li>Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads.</li>\n";
- $conf->ImageMagick = $im;
- break;
- }
-}
-
-$conf->HaveGD = function_exists( "imagejpeg" );
-if( $conf->HaveGD ) {
- print "<li>Found GD graphics library built-in";
- if( !$conf->ImageMagick ) {
- print ", image thumbnailing will be enabled if you enable uploads";
- }
- print ".</li>\n";
-} else {
- if( !$conf->ImageMagick ) {
- print "<li>Couldn't find GD library or ImageMagick; image thumbnailing disabled.</li>\n";
- }
-}
-
-$conf->IP = dirname( dirname( __FILE__ ) );
-print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
-
-
-// PHP_SELF isn't available sometimes, such as when PHP is CGI but
-// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
-// to get the path to the current script... hopefully it's reliable. SIGH
-$path = ($_SERVER["PHP_SELF"] === '')
- ? $_SERVER["SCRIPT_NAME"]
- : $_SERVER["PHP_SELF"];
-
-$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $path );
-print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
-
-
-
-// We may be installing from *.php5 extension file, if so, print message
-$conf->ScriptExtension = '.php';
-if (defined('MW_INSTALL_PHP5_EXT')) {
- $conf->ScriptExtension = '.php5';
- print "<li>Installing MediaWiki with <tt>php5</tt> file extensions</li>\n";
-} else {
- print "<li>Installing MediaWiki with <tt>php</tt> file extensions</li>\n";
-}
-
-
-print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
- $conf->posted = ($_SERVER["REQUEST_METHOD"] == "POST");
-
- $conf->Sitename = ucfirst( importPost( "Sitename", "" ) );
- $defaultEmail = empty( $_SERVER["SERVER_ADMIN"] )
- ? 'root@localhost'
- : $_SERVER["SERVER_ADMIN"];
- $conf->EmergencyContact = importPost( "EmergencyContact", $defaultEmail );
- $conf->DBtype = importPost( "DBtype", $DefaultDBtype );
- if ( !isset( $ourdb[$conf->DBtype] ) ) {
- $conf->DBtype = $DefaultDBtype;
- }
-
- $conf->DBserver = importPost( "DBserver", "localhost" );
- $conf->DBname = importPost( "DBname", "wikidb" );
- $conf->DBuser = importPost( "DBuser", "wikiuser" );
- $conf->DBpassword = importPost( "DBpassword" );
- $conf->DBpassword2 = importPost( "DBpassword2" );
- $conf->SysopName = importPost( "SysopName", "WikiSysop" );
- $conf->SysopPass = importPost( "SysopPass" );
- $conf->SysopPass2 = importPost( "SysopPass2" );
- $conf->RootUser = importPost( "RootUser" );
- $conf->RootPW = importPost( "RootPW", "" );
- $useRoot = importCheck( 'useroot', false );
- $conf->LanguageCode = importPost( "LanguageCode", "en" );
- ## MySQL specific:
- $conf->DBprefix = importPost( "DBprefix" );
- $conf->setSchema(
- importPost( "DBschema", "mysql5-binary" ),
- importPost( "DBengine", "InnoDB" ) );
-
- ## Postgres specific:
- $conf->DBport = importPost( "DBport", "5432" );
- $conf->DBts2schema = importPost( "DBts2schema", "public" );
- $conf->DBpgschema = importPost( "DBpgschema", "mediawiki" );
-
- ## SQLite specific
- $conf->SQLiteDataDir = importPost( "SQLiteDataDir", "$IP/../data" );
-
- ## MSSQL specific
- // We need a second field so it doesn't overwrite the MySQL one
- $conf->DBprefix2 = importPost( "DBprefix2" );
-
- ## DB2 specific:
- // New variable in order to have a different default port number
- $conf->DBport_db2 = importPost( "DBport_db2", "50000" );
- $conf->DBcataloged = importPost( "DBcataloged", "cataloged" );
- $conf->DBdb2schema = importPost( "DBdb2schema", "mediawiki" );
-
- // Oracle specific
- $conf->DBprefix_ora = importPost( "DBprefix_ora" );
- $conf->DBdefTS_ora = importPost( "DBdefTS_ora", "USERS" );
- $conf->DBtempTS_ora = importPost( "DBtempTS_ora", "TEMP" );
-
- $conf->ShellLocale = getShellLocale( $conf->LanguageCode );
-
-/* Check for validity */
-$errs = array();
-
-if( preg_match( '/^$|^mediawiki$|#/i', $conf->Sitename ) ) {
- $errs["Sitename"] = "Must not be blank or \"MediaWiki\" and may not contain \"#\"";
-}
-if( !$ourdb[$conf->DBtype]['serverless'] ) {
- if( $conf->DBuser == "" ) {
- $errs["DBuser"] = "Must not be blank";
- }
- if( ($conf->DBtype == 'mysql') && (strlen($conf->DBuser) > 16) ) {
- $errs["DBuser"] = "Username too long";
- }
- if( $conf->DBpassword == "" && $conf->DBtype != "postgres" ) {
- $errs["DBpassword"] = "Must not be blank";
- }
- if( $conf->DBpassword != $conf->DBpassword2 ) {
- $errs["DBpassword2"] = "Passwords don't match!";
- }
-}
-if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
- $errs["DBprefix"] = "Invalid table prefix";
-} else {
- untaint( $conf->DBprefix, TC_MYSQL );
-}
-if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix_ora ) ) {
- $errs["DBprefix_ora"] = "Invalid table prefix";
-}
-
-error_reporting( E_ALL | E_STRICT );
-
-/**
- * Initialise $wgLang and $wgContLang to something so we can
- * call case-folding methods. Per Brion, this is English for
- * now, although we could be clever and initialise to the
- * user-selected language.
- */
-$wgContLang = Language::factory( 'en' );
-$wgLang = $wgContLang;
-
-/**
- * We're messing about with users, so we need a stub
- * authentication plugin...
- */
-$wgAuth = new AuthPlugin();
-
-/**
- * Validate the initial administrator account; username,
- * password checks, etc.
- */
-if( $conf->SysopName ) {
- # Check that the user can be created
- $u = User::newFromName( $conf->SysopName );
- if( $u instanceof User ) {
- # Various password checks
- if( $conf->SysopPass != '' ) {
- if( $conf->SysopPass == $conf->SysopPass2 ) {
- if( !$u->isValidPassword( $conf->SysopPass ) ) {
- $errs['SysopPass'] = "Bad password";
- }
- } else {
- $errs['SysopPass2'] = "Passwords don't match";
- }
- } else {
- $errs['SysopPass'] = "Cannot be blank";
- }
- unset( $u );
- } else {
- $errs['SysopName'] = "Bad username";
- }
-}
-
-$conf->License = importRequest( "License", "none" );
-if( $conf->License == "gfdl1_2" ) {
- $conf->RightsUrl = "http://www.gnu.org/licenses/old-licenses/fdl-1.2.txt";
- $conf->RightsText = "GNU Free Documentation License 1.2";
- $conf->RightsCode = "gfdl1_2";
- $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
-} elseif( $conf->License == "gfdl1_3" ) {
- $conf->RightsUrl = "http://www.gnu.org/copyleft/fdl.html";
- $conf->RightsText = "GNU Free Documentation License 1.3";
- $conf->RightsCode = "gfdl1_3";
- $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
-} elseif( $conf->License == "none" ) {
- $conf->RightsUrl = $conf->RightsText = $conf->RightsCode = $conf->RightsIcon = "";
-} elseif( $conf->License == "pd" ) {
- $conf->RightsUrl = "http://creativecommons.org/licenses/publicdomain/";
- $conf->RightsText = "Public Domain";
- $conf->RightsCode = "pd";
- $conf->RightsIcon = '${wgScriptPath}/skins/common/images/public-domain.png';
-} else {
- $conf->RightsUrl = importRequest( "RightsUrl", "" );
- $conf->RightsText = importRequest( "RightsText", "" );
- $conf->RightsCode = importRequest( "RightsCode", "" );
- $conf->RightsIcon = importRequest( "RightsIcon", "" );
-}
-
-$conf->Shm = importRequest( "Shm", "none" );
-$conf->MCServers = importRequest( "MCServers" );
-
-/* Test memcached servers */
-
-if ( $conf->Shm == 'memcached' && $conf->MCServers ) {
- $conf->MCServerArray = wfArrayMap( 'trim', explode( ',', $conf->MCServers ) );
- foreach ( $conf->MCServerArray as $server ) {
- $error = testMemcachedServer( $server );
- if ( $error ) {
- $errs["MCServers"] = $error;
- break;
- }
- }
-} else if ( $conf->Shm == 'memcached' ) {
- $errs["MCServers"] = "Please specify at least one server if you wish to use memcached";
-}
-
-/* default values for installation */
-$conf->Email = importRequest("Email", "email_enabled");
-$conf->Emailuser = importRequest("Emailuser", "emailuser_enabled");
-$conf->Enotif = importRequest("Enotif", "enotif_allpages");
-$conf->Eauthent = importRequest("Eauthent", "eauthent_enabled");
-
-if( $conf->posted && ( 0 == count( $errs ) ) ) {
- do { /* So we can 'continue' to end prematurely */
- $conf->Root = ($conf->RootPW != "");
-
- /* Load up the settings and get installin' */
- $local = writeLocalSettings( $conf );
- echo "<li style=\"list-style: none\">\n";
- echo "<p><b>Generating configuration file...</b></p>\n";
- echo "</li>\n";
-
- $wgCommandLineMode = false;
- chdir( ".." );
- $ok = eval( $local );
- if( $ok === false ) {
- dieout( "<p>Errors in generated configuration; " .
- "most likely due to a bug in the installer... " .
- "Config file was: </p>" .
- "<pre>" .
- htmlspecialchars( $local ) .
- "</pre>" );
- }
- $conf->DBtypename = '';
- foreach (array_keys($ourdb) as $db) {
- if ($conf->DBtype === $db)
- $conf->DBtypename = $ourdb[$db]['fullname'];
- }
- if ( ! strlen($conf->DBtype)) {
- $errs["DBpicktype"] = "Please choose a database type";
- continue;
- }
-
- if (! $conf->DBtypename) {
- $errs["DBtype"] = "Unknown database type '$conf->DBtype'";
- continue;
- }
- print "<li>Database type: " . htmlspecialchars( $conf->DBtypename ) . "</li>\n";
- $dbclass = 'Database'.ucfirst($conf->DBtype);
- $wgDBtype = $conf->DBtype;
- $wgDBadminuser = "root";
- $wgDBadminpassword = $conf->RootPW;
-
- ## Mysql specific:
- $wgDBprefix = $conf->DBprefix;
-
- ## Postgres specific:
- $wgDBport = $conf->DBport;
- $wgDBts2schema = $conf->DBts2schema;
-
- if( $wgDBtype == 'postgres' ) {
- $wgDBmwschema = $conf->DBpgschema;
- } elseif ( $wgDBtype == 'ibm_db2' ) {
- $wgDBmwschema = $conf->DBdb2schema;
- }
-
- if( $conf->DBprefix2 != '' ) {
- // For MSSQL
- $wgDBprefix = $conf->DBprefix2;
- } elseif( $conf->DBprefix_ora != '' ) {
- // For Oracle
- $wgDBprefix = $conf->DBprefix_ora;
- }
-
- ## DB2 specific:
- $wgDBcataloged = $conf->DBcataloged;
-
- $wgCommandLineMode = true;
- if (! defined ( 'STDERR' ) )
- define( 'STDERR', fopen("php://stderr", "wb"));
- $wgUseDatabaseMessages = false; /* FIXME: For database failure */
- require_once( "$IP/includes/Setup.php" );
- Language::getLocalisationCache()->disableBackend();
-
- chdir( "config" );
-
- $wgTitle = Title::newFromText( "Installation script" );
- error_reporting( E_ALL | E_STRICT );
- print "<li>Loading class: " . htmlspecialchars( $dbclass ) . "</li>\n";
- if ( $conf->DBtype != 'sqlite' ) {
- $dbc = new $dbclass;
- }
-
- if( $conf->DBtype == 'mysql' ) {
- $mysqlOldClient = version_compare( mysql_get_client_info(), "4.1.0", "lt" );
- if( $mysqlOldClient ) {
- print "<li><b>PHP is linked with old MySQL client libraries. If you are
- using a MySQL 4.1 server and have problems connecting to the database,
- see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
- >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b></li>\n";
- }
- $ok = true; # Let's be optimistic
-
- # Decide if we're going to use the superuser or the regular database user
- $conf->Root = $useRoot;
- if( $conf->Root ) {
- $db_user = $conf->RootUser;
- $db_pass = $conf->RootPW;
- } else {
- $db_user = $wgDBuser;
- $db_pass = $wgDBpassword;
- }
-
- # Attempt to connect
- echo( "<li>Attempting to connect to database server as " . htmlspecialchars( $db_user ) . "..." );
- $wgDatabase = Database::newFromParams( $wgDBserver, $db_user, $db_pass, '', 1 );
-
- # Check the connection and respond to errors
- if( $wgDatabase->isOpen() ) {
- # Seems OK
- $ok = true;
- $wgDBadminuser = $db_user;
- $wgDBadminpassword = $db_pass;
- echo( "success.</li>\n" );
- $wgDatabase->ignoreErrors( true );
- $myver = $wgDatabase->getServerVersion();
- } else {
- # There were errors, report them and back out
- $ok = false;
- $errno = mysql_errno();
- $errtx = htmlspecialchars( mysql_error() );
- switch( $errno ) {
- case 1045:
- case 2000:
- echo( "failed due to authentication errors. Check passwords.</li>" );
- if( $conf->Root ) {
- # The superuser details are wrong
- $errs["RootUser"] = "Check username";
- $errs["RootPW"] = "and password";
- } else {
- # The regular user details are wrong
- $errs["DBuser"] = "Check username";
- $errs["DBpassword"] = "and password";
- }
- break;
- case 2002:
- case 2003:
- default:
- # General connection problem
- echo( htmlspecialchars( "failed with error [$errno] $errtx." ) . "</li>\n" );
- $errs["DBserver"] = "Connection failed";
- break;
- } # switch
- } #conn. att.
-
- if( !$ok ) { continue; }
- }
- else if( $conf->DBtype == 'ibm_db2' ) {
- if( $useRoot ) {
- $db_user = $conf->RootUser;
- $db_pass = $conf->RootPW;
- } else {
- $db_user = $wgDBuser;
- $db_pass = $wgDBpassword;
- }
-
- echo( "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) .
- "\" as \"" . htmlspecialchars( $db_user ) . "\"..." );
- $wgDatabase = $dbc->newFromParams($wgDBserver, $db_user, $db_pass, $wgDBname, 1);
- // enable extra debug messages
- $dbc->setMode(DatabaseIbm_db2::INSTALL_MODE);
- $wgDatabase->setMode(DatabaseIbm_db2::INSTALL_MODE);
-
- if (!$wgDatabase->isOpen()) {
- print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- } else {
- $myver = $wgDatabase->getServerVersion();
- }
- if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
-
- } elseif ( $conf->DBtype == 'sqlite' ) {
- $wgSQLiteDataDir = $conf->SQLiteDataDir;
- echo '<li>Attempting to connect to SQLite database at "' .
- htmlspecialchars( $wgSQLiteDataDir ) . '": ';
- if ( !is_dir( $wgSQLiteDataDir ) ) {
- if ( is_writable( dirname( $wgSQLiteDataDir ) ) ) {
- $ok = wfMkdirParents( $wgSQLiteDataDir, $wgSQLiteDataDirMode );
- } else {
- $ok = false;
- }
- if ( !$ok ) {
- echo "cannot create data directory</li>";
- $errs['SQLiteDataDir'] = 'Enter a valid data directory';
- continue;
- }
- }
- if ( !is_writable( $wgSQLiteDataDir ) ) {
- echo "data directory not writable</li>";
- $errs['SQLiteDataDir'] = 'Enter a writable data directory';
- continue;
- }
- $dataFile = DatabaseSqlite::generateFileName( $wgSQLiteDataDir, $wgDBname );
- if ( file_exists( $dataFile ) ) {
- if ( !is_writable( $dataFile ) ) {
- echo "data file not writable</li>";
- $errs['SQLiteDataDir'] = basename( $dataFile ) . " is not writable";
- continue;
- }
- } else {
- if ( file_put_contents( $dataFile, '' ) === false ) {
- echo 'could not create database file "' . htmlspecialchars( basename( $dataFile ) ) . "\"</li>\n";
- $errs['SQLiteDataDir'] = "couldn't create " . basename( $dataFile );
- continue;
- }
- }
- try {
- $wgDatabase = new DatabaseSqlite( false, false, false, $wgDBname, 1 );
- }
- catch( MWException $ex ) {
- echo 'error: ' . htmlspecialchars( $ex->getMessage() ) . "</li>\n";
- continue;
- }
-
- if (!$wgDatabase->isOpen()) {
- print "error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- $errs['SQLiteDataDir'] = 'Could not connect to database';
- continue;
- } else {
- $myver = $wgDatabase->getServerVersion();
- }
- if ( is_callable( array( $wgDatabase, 'initial_setup' ) ) ) {
- $wgDatabase->initial_setup('', $wgDBname);
- }
- echo "ok</li>\n";
- } elseif ( $conf->DBtype == 'oracle' ) {
- echo "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) ."\"</li>";
- $old_error_level = error_reporting();
- wfSuppressWarnings();
- $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBuser, $wgDBpassword, $wgDBname, 1);
- wfRestoreWarnings();
- if (!$wgDatabase->isOpen()) {
- $ok = true;
- echo "<li>Connect failed.</li>";
- if ($useRoot) {
- if (ini_get('oci8.privileged_connect') === false) {
- echo "<li>Privileged connect disabled, please set oci8.privileged_connect or run maintenance/ora/user.sql script manually prior to continuing.</li>";
- $ok = false;
- } else {
- $wgDBadminuser = $conf->RootUser;
- $wgDBadminpassword = $conf->RootPW;
- echo "<li>Attempting to create DB user.</li>";
- $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBadminuser, $wgDBadminpassword, $wgDBname, 1, 64);
- if ($wgDatabase->isOpen()) {
- $wgDBOracleDefTS = $conf->DBdefTS_ora;
- $wgDBOracleTempTS = $conf->DBtempTS_ora;
- $res = $wgDatabase->sourceFile( "../maintenance/ora/user.sql" );
- if ($res !== true) dieout($res);
- } else {
- echo "<li>Invalid database superuser, please supply a valid superuser account.</li>";
- echo "<li>ERR: ".print_r(oci_error(), true)."</li>";
- $ok = false;
- }
- }
- } else {
- echo "<li>Database superuser missing, please supply a valid superuser account.</li>";
- $ok = false;
- }
- if (!$ok) {
- $errs["RootUser"] = "Check username";
- $errs["RootPW"] = "and password";
- } else {
- echo "<li>Attempting to connect to database with new user \"" . htmlspecialchars( $wgDBname ) ."\"</li>";
- $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBuser, $wgDBpassword, $wgDBname, 1);
- }
- }
- if ($ok) {
- $myver = $wgDatabase->getServerVersion();
- }
- } else { # not mysql
- error_reporting( E_ALL | E_STRICT );
- $wgSuperUser = '';
- ## Possible connect as a superuser
- // Changed !mysql to postgres check since it seems to only apply to postgres
- if( $useRoot && $conf->DBtype == 'postgres' ) {
- $wgDBsuperuser = $conf->RootUser;
- echo( "<li>Attempting to connect to database \"postgres\" as superuser \"" .
- htmlspecialchars( $wgDBsuperuser ) . "\"..." );
- $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
- if (!$wgDatabase->isOpen()) {
- print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- $errs["DBserver"] = "Could not connect to database as superuser";
- $errs["RootUser"] = "Check username";
- $errs["RootPW"] = "and password";
- continue;
- }
- $wgDatabase->initial_setup($conf->RootPW, 'postgres');
- }
- echo( "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) .
- "\" as \"" . htmlspecialchars( $wgDBuser ) . "\"..." );
- $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1);
- if (!$wgDatabase->isOpen()) {
- print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- $errs["DBserver"] = "Could not connect to database as user";
- $errs["DBuser"] = "Check username";
- $errs["DBpassword"] = "and password";
- continue;
- } else {
- $myver = $wgDatabase->getServerVersion();
- }
- if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
- }
-
- if ( !$wgDatabase->isOpen() ) {
- $errs["DBserver"] = "Couldn't connect to database";
- continue;
- }
-
- print "<li>Connected to " . htmlspecialchars( "{$conf->DBtype} $myver" );
- if ($conf->DBtype == 'mysql') {
- if( version_compare( $myver, "4.0.14" ) < 0 ) {
- print "</li>\n";
- dieout( "-- mysql 4.0.14 or later required. Aborting." );
- }
- $mysqlNewAuth = version_compare( $myver, "4.1.0", "ge" );
- if( $mysqlNewAuth && $mysqlOldClient ) {
- print "; <b class='error'>You are using MySQL 4.1 server, but PHP is linked
- to old client libraries; if you have trouble with authentication, see
- <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
- >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
- }
- if( $wgDBmysql5 ) {
- if( $mysqlNewAuth ) {
- print "; enabling MySQL 4.1/5.0 charset mode";
- } else {
- print "; <b class='error'>MySQL 4.1/5.0 charset mode enabled,
- but older version detected; will likely fail.</b>";
- }
- }
- print "</li>\n";
-
- @$sel = $wgDatabase->selectDB( $wgDBname );
- if( $sel ) {
- print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
- } else {
- $err = mysql_errno();
- $databaseSafe = htmlspecialchars( $wgDBname );
- if( $err == 1102 /* Invalid database name */ ) {
- print "<ul><li><strong>{$databaseSafe}</strong> is not a valid database name.</li></ul>";
- continue;
- } elseif( $err != 1049 /* Database doesn't exist */ ) {
- print "<ul><li>Error selecting database <strong>{$databaseSafe}</strong>: {$err} ";
- print htmlspecialchars( mysql_error() ) . "</li></ul>";
- continue;
- }
- print "<li>Attempting to create database...</li>";
- $res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
- if( !$res ) {
- print "<li>Couldn't create database <tt>" .
- htmlspecialchars( $wgDBname ) .
- "</tt>; try with root access or check your username/pass.</li>\n";
- $errs["RootPW"] = "<- Enter";
- continue;
- }
- print "<li>Created database <tt>" . htmlspecialchars( $wgDBname ) . "</tt></li>\n";
- }
- $wgDatabase->selectDB( $wgDBname );
- }
- else if ($conf->DBtype == 'postgres') {
- if( version_compare( $myver, "8.0" ) < 0 ) {
- dieout( "<b>Postgres 8.0 or later is required</b>. Aborting." );
- }
- }
-
- if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) {
- print "<li>There are already MediaWiki tables in this database. Checking if updates are needed...</li>\n";
-
- if ( $conf->DBtype == 'mysql') {
- # Determine existing default character set
- if ( $wgDatabase->tableExists( "revision" ) ) {
- $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' );
- $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" );
- $row = $wgDatabase->fetchObject( $res );
- if ( !$row ) {
- echo "<li>SHOW TABLE STATUS query failed!</li>\n";
- $existingSchema = false;
- $existingEngine = false;
- } else {
- if ( preg_match( '/^latin1/', $row->Collation ) ) {
- $existingSchema = 'mysql4';
- } elseif ( preg_match( '/^utf8/', $row->Collation ) ) {
- $existingSchema = 'mysql5';
- } elseif ( preg_match( '/^binary/', $row->Collation ) ) {
- $existingSchema = 'mysql5-binary';
- } else {
- $existingSchema = false;
- echo "<li><strong>Warning:</strong> Unrecognised existing collation</li>\n";
- }
- if ( isset( $row->Engine ) ) {
- $existingEngine = $row->Engine;
- } else {
- $existingEngine = $row->Type;
- }
- }
- if ( $existingSchema && $existingSchema != $conf->DBschema ) {
- $encExisting = htmlspecialchars( $existingSchema );
- $encRequested = htmlspecialchars( $conf->DBschema );
- print "<li><strong>Warning:</strong> you requested the $encRequested schema, " .
- "but the existing database has the $encExisting schema. This upgrade script ".
- "can't convert it, so it will remain $encExisting.</li>\n";
- $conf->setSchema( $existingSchema, $conf->DBengine );
- }
- if ( $existingEngine && $existingEngine != $conf->DBengine ) {
- $encExisting = htmlspecialchars( $existingEngine );
- $encRequested = htmlspecialchars( $conf->DBengine );
- print "<li><strong>Warning:</strong> you requested the $encRequested storage " .
- "engine, but the existing database uses the $encExisting engine. This upgrade " .
- "script can't convert it, so it will remain $encExisting.</li>\n";
- $conf->setSchema( $conf->DBschema, $existingEngine );
- }
- }
-
- # Create user if required
- if ( $conf->Root ) {
- $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
- if ( $conn->isOpen() ) {
- print "<li>DB user account ok</li>\n";
- $conn->close();
- } else {
- print "<li>Granting user permissions...";
- if( $mysqlOldClient && $mysqlNewAuth ) {
- print " <b class='error'>If the next step fails, see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'>http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
- }
- print "</li>\n";
- $res = $wgDatabase->sourceFile( "../maintenance/users.sql" );
- if ($res !== true) dieout($res);
- }
- }
- }
- print "</ul><pre>\n";
- chdir( ".." );
- flush();
- do_all_updates();
- chdir( "config" );
- print "</pre>\n";
- print "<ul><li>Finished update checks.</li>\n";
- // if tables don't yet exist
- } else {
- # Determine available storage engines if possible
- if ( $conf->DBtype == 'mysql' && version_compare( $myver, "4.1.2", "ge" ) ) {
- $res = $wgDatabase->query( 'SHOW ENGINES' );
- $found = false;
- while ( $row = $wgDatabase->fetchObject( $res ) ) {
- if ( $row->Engine == $conf->DBengine && ( $row->Support == 'YES' || $row->Support == 'DEFAULT' ) ) {
- $found = true;
- break;
- }
- }
- $wgDatabase->freeResult( $res );
- if ( !$found && $conf->DBengine != 'MyISAM' ) {
- echo "<li><strong>Warning:</strong> " . htmlspecialchars( $conf->DBengine ) .
- " storage engine not available, " .
- "using MyISAM instead</li>\n";
- $conf->setSchema( $conf->DBschema, 'MyISAM' );
- }
- }
-
- # FIXME: Check for errors
- print "<li>Creating tables...";
- if ($conf->DBtype == 'mysql') {
- $res = $wgDatabase->sourceFile( "../maintenance/tables.sql" );
- if ($res === true) {
- print " done.</li>\n<li>Populating interwiki table... \n";
- $res = $wgDatabase->sourceFile( "../maintenance/interwiki.sql" );
- }
- if ($res === true) {
- print " done.</li>\n";
- } else {
- print " <b>FAILED</b></li>\n";
- dieout( htmlspecialchars( $res ) );
- }
- } elseif (is_callable(array($wgDatabase, 'setup_database'))) {
- $wgDatabase->setup_database();
- }
- else {
- $errs["DBtype"] = "Do not know how to handle database type '$conf->DBtype'";
- continue;
- }
-
-
- if ( $conf->DBtype == 'ibm_db2' ) {
- // Now that table creation is done, make sure everything is committed
- // Do this before doing inserts through API
- if ($wgDatabase->lastError()) {
- print "<li>Errors encountered during table creation -- rolled back</li>\n";
- $wgDatabase->rollback();
- }
- else {
- print "<li>MediaWiki tables successfully created</li>\n";
- $wgDatabase->commit();
- }
- } elseif ( $conf->DBtype == 'sqlite' ) {
- // Ensure proper searchindex format. We have to do that separately because
- // if SQLite is compiled without the FTS3 module, table creation syntax will be invalid.
- sqlite_setup_searchindex();
- }
-
- print "<li>Initializing statistics...</li>\n";
- $wgDatabase->insert( 'site_stats',
- array ( 'ss_row_id' => 1,
- 'ss_total_views' => 0,
- 'ss_total_edits' => 1, # Main page first edit
- 'ss_good_articles' => 0, # Main page is not a good article - no internal link
- 'ss_total_pages' => 1, # Main page
- 'ss_users' => $conf->SysopName ? 1 : 0, # Sysop account, if created
- 'ss_admins' => $conf->SysopName ? 1 : 0, # Sysop account, if created
- 'ss_images' => 0 ) );
-
- # Set up the "regular user" account *if we can, and if we need to*
- if( $conf->Root and $conf->DBtype == 'mysql') {
- # See if we need to
- $wgDatabase2 = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
- if( $wgDatabase2->isOpen() ) {
- # Nope, just close the test connection and continue
- $wgDatabase2->close();
- echo( "<li>User " . htmlspecialchars( $wgDBuser ) . " exists. Skipping grants.</li>\n" );
- } else {
- # Yes, so run the grants
- echo( "<li>" . htmlspecialchars( "Granting user permissions to $wgDBuser on $wgDBname..." ) );
- $res = $wgDatabase->sourceFile( "../maintenance/users.sql" );
- if ( $res === true ) {
- echo( " success.</li>\n" );
- } else {
- echo( " <b>FAILED</b>.</li>\n" );
- dieout( $res );
- }
- }
- }
-
- if( $conf->SysopName ) {
- $u = User::newFromName( $conf->getSysopName() );
- if ( !$u ) {
- print "<li><strong class=\"error\">Warning:</strong> Skipped sysop account creation - invalid username!</li>\n";
- }
- else if ( 0 == $u->idForName() ) {
- $u->addToDatabase();
- $u->setPassword( $conf->getSysopPass() );
- $u->saveSettings();
-
- $u->addGroup( "sysop" );
- $u->addGroup( "bureaucrat" );
-
- print "<li>Created sysop account <tt>" .
- htmlspecialchars( $conf->SysopName ) . "</tt>.</li>\n";
- } else {
- print "<li>Could not create user - already exists!</li>\n";
- }
- } else {
- print "<li>Skipped sysop account creation, no name given.</li>\n";
- }
-
- $titleobj = Title::newFromText( wfMsgNoDB( "mainpage" ) );
- $article = new Article( $titleobj );
- $newid = $article->insertOn( $wgDatabase );
- $revision = new Revision( array(
- 'page' => $newid,
- 'text' => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsgNoTrans( 'mainpagedocfooter' ),
- 'comment' => '',
- 'user' => 0,
- 'user_text' => 'MediaWiki default',
- ) );
- $revid = $revision->insertOn( $wgDatabase );
- $article->updateRevisionOn( $wgDatabase, $revision );
- }
-
- /* Write out the config file now that all is well */
- print "<li style=\"list-style: none\">\n";
- print "<p>Creating LocalSettings.php...</p>\n\n";
- $localSettings = "<" . "?php$endl$local";
- // Fix up a common line-ending problem (due to CVS on Windows)
- $localSettings = str_replace( "\r\n", "\n", $localSettings );
- $f = fopen( "LocalSettings.php", 'xt' );
-
- if( $f == false ) {
- print( "</li>\n" );
- dieout( "<p>Couldn't write out LocalSettings.php. Check that the directory permissions are correct and that there isn't already a file of that name here...</p>\n" .
- "<p>Here's the file that would have been written, try to paste it into place manually:</p>\n" .
- "<pre>\n" . htmlspecialchars( $localSettings ) . "</pre>\n" );
- }
- if(fwrite( $f, $localSettings ) ) {
- fclose( $f );
- print "<hr/>\n";
- writeSuccessMessage();
- print "</li>\n";
- } else {
- fclose( $f );
- dieout( "<p class='error'>An error occured while writing the config/LocalSettings.php file. Check user rights and disk space then try again.</p></li>\n" );
- }
-
- } while( false );
-}
-
-print "</ul>\n";
-$mainListOpened = false;
-
-if( count( $errs ) ) {
- /* Display options form */
-
- if( $conf->posted ) {
- echo "<p class='error-top'>Something's not quite right yet; make sure everything below is filled out correctly.</p>\n";
- }
-?>
-
-<form action="<?php echo defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php'; ?>" name="config" method="post">
-
-<h2>Site config</h2>
-
-<div class="config-section">
- <div class="config-input">
- <?php aField( $conf, "Sitename", "Wiki name:" ); ?>
- </div>
- <p class="config-desc">
- Preferably a short word without punctuation, i.e. "Wikipedia".<br />
- Will appear as the namespace name for "meta" pages, and throughout the interface.
- </p>
- <div class="config-input"><?php aField( $conf, "EmergencyContact", "Contact e-mail:" ); ?></div>
- <p class="config-desc">
- Displayed to users in some error messages, used as the return address for password reminders, and used as the default sender address of e-mail notifications.
- </p>
-
- <div class="config-input">
- <label class='column' for="LanguageCode">Language:</label>
- <select id="LanguageCode" name="LanguageCode"><?php
- $list = getLanguageList();
- foreach( $list as $code => $name ) {
- $sel = ($code == $conf->LanguageCode) ? 'selected="selected"' : '';
- $encCode = htmlspecialchars( $code );
- $encName = htmlspecialchars( $name );
- echo "\n\t\t<option value=\"$encCode\" $sel>$encName</option>";
- }
- echo "\n";
- ?>
- </select>
- </div>
- <p class="config-desc">
- Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) is used for all localizations.
- </p>
-
- <div class="config-input">
- <label class='column'>Copyright/license:</label>
-
- <ul class="plain">
- <li><?php aField( $conf, "License", "No license metadata", "radio", "none" ); ?></li>
- <li><?php aField( $conf, "License", "Public Domain", "radio", "pd" ); ?></li>
- <li><?php aField( $conf, "License", "GNU Free Documentation License 1.2", "radio", "gfdl1_2" ); ?></li>
- <li><?php aField( $conf, "License", "GNU Free Documentation License 1.3", "radio", "gfdl1_3" ); ?></li>
- <li><?php
- aField( $conf, "License", "A Creative Commons license - ", "radio", "cc" );
- $partner = "MediaWiki";
- $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
- $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/$script?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
- $icon = urlencode( "$wgServer$wgUploadPath/wiki.png" );
- $ccApp = htmlspecialchars( "http://creativecommons.org/license/?partner=$partner&exit_url=$exit&partner_icon_url=$icon" );
- print "<a href=\"$ccApp\" target='_blank'>choose</a>";
- if( $conf->License == "cc" ) { ?>
- <ul>
- <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='(Creative Commons icon)' />", "hidden" ); ?></li>
- <li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
- <li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
- <li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
- </ul>
- <?php } ?>
- </li>
- </ul>
- </div>
- <p class="config-desc">
- A notice, icon, and machine-readable copyright metadata will be displayed for the license you pick.
- </p>
-
-
- <div class="config-input">
- <?php aField( $conf, "SysopName", "Admin username:" ) ?>
- </div>
- <div class="config-input">
- <?php aField( $conf, "SysopPass", "Password:", "password" ) ?>
- </div>
- <div class="config-input">
- <?php aField( $conf, "SysopPass2", "Password confirm:", "password" ) ?>
- </div>
- <p class="config-desc">
- An admin can lock/delete pages, block users from editing, and do other maintenance tasks.<br />
- A new account will be added only when creating a new wiki database.
- <br /><br />
- The password cannot be the same as the username.
- </p>
-
- <div class="config-input">
- <label class='column'>Object caching:</label>
-
- <ul class="plain">
- <li><?php aField( $conf, "Shm", "No caching", "radio", "none" ); ?></li>
- <?php
- if( $conf->xcache ) {
- echo "<li>";
- aField( $conf, 'Shm', 'XCache', 'radio', 'xcache' );
- echo "</li>\n";
- }
- if ( $conf->apc ) {
- echo "<li>";
- aField( $conf, "Shm", "APC", "radio", "apc" );
- echo "</li>\n";
- }
- if ( $conf->eaccel ) {
- echo "<li>";
- aField( $conf, "Shm", "eAccelerator", "radio", "eaccel" );
- echo "</li>\n";
- }
- if ( $conf->dba ) {
- echo "<li>";
- aField( $conf, "Shm", "DBA (not recommended)", "radio", "dba" );
- echo "</li>";
- }
- ?>
- <li><?php aField( $conf, "Shm", "Memcached", "radio", "memcached" ); ?></li>
- </ul>
- <div style="clear:left"><?php aField( $conf, "MCServers", "Memcached servers:", "text" ) ?></div>
- </div>
- <p class="config-desc">
- An object caching system such as memcached will provide a significant performance boost,
- but needs to be installed. Provide the server addresses and ports in a comma-separated list.
- <br /><br />
- MediaWiki can also detect and support eAccelerator, APC, and XCache, but
- these should not be used if the wiki will be running on multiple application servers.
- <br /><br />
- DBA (Berkeley-style DB) is generally slower than using no cache at all, and is only
- recommended for testing.
- </p>
-</div>
-
-<h2>E-mail, e-mail notification and authentication setup</h2>
-
-<div class="config-section">
- <div class="config-input">
- <label class='column'>E-mail features (global):</label>
- <ul class="plain">
- <li><?php aField( $conf, "Email", "Enabled", "radio", "email_enabled" ); ?></li>
- <li><?php aField( $conf, "Email", "Disabled", "radio", "email_disabled" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- Use this to disable all e-mail functions (password reminders, user-to-user e-mail, and e-mail notifications)
- if sending mail doesn't work on your server.
- </p>
-
- <div class="config-input">
- <label class='column'>User-to-user e-mail:</label>
- <ul class="plain">
- <li><?php aField( $conf, "Emailuser", "Enabled", "radio", "emailuser_enabled" ); ?></li>
- <li><?php aField( $conf, "Emailuser", "Disabled", "radio", "emailuser_disabled" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- The user-to-user e-mail feature (Special:Emailuser) lets the wiki act as a relay to allow users to exchange e-mail without publicly advertising their e-mail address.
- </p>
- <div class="config-input">
- <label class='column'>E-mail notification about changes:</label>
- <ul class="plain">
- <li><?php aField( $conf, "Enotif", "Disabled", "radio", "enotif_disabled" ); ?></li>
- <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages only", "radio", "enotif_usertalk" ); ?></li>
- <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages, and to pages on watchlists (not recommended for large wikis)", "radio", "enotif_allpages" ); ?></li>
- </ul>
- </div>
- <div class="config-desc">
- <p>
- For this feature to work, an e-mail address must be present for the user account, and the notification
- options in the user's preferences must be enabled. Also note the
- authentication option below. When testing the feature, keep in mind that your own changes will never trigger notifications to be sent to yourself.</p>
-
- <p>There are additional options for fine tuning in /includes/DefaultSettings.php; copy these to your LocalSettings.php and edit them there to change them.</p>
- </div>
-
- <div class="config-input">
- <label class='column'>E-mail address authentication:</label>
- <ul class="plain">
- <li><?php aField( $conf, "Eauthent", "Disabled", "radio", "eauthent_disabled" ); ?></li>
- <li><?php aField( $conf, "Eauthent", "Enabled", "radio", "eauthent_enabled" ); ?></li>
- </ul>
- </div>
- <div class="config-desc">
- <p>If this option is enabled, users have to confirm their e-mail address using a magic link sent to them whenever they set or change it, and only authenticated e-mail addresses can receive mails from other users and/or
- change notification mails. Setting this option is <b>recommended</b> for public wikis because of potential abuse of the e-mail features above.</p>
- </div>
-
-</div>
-
-<h2>Database config</h2>
-
-<div class="config-section">
-<div class="config-input">
- <label class='column'>Database type:</label>
-<?php
- if (isset($errs['DBpicktype'])) {
- print "\t<span class='error'>" . htmlspecialchars( $errs['DBpicktype'] ) . "</span>\n";
- }
-?>
- <ul class='plain'><?php
- database_picker($conf);
- ?></ul>
- </div>
-
- <div id="db-server-settings1">
- <div class="config-input" style="clear:left">
- <?php aField( $conf, "DBserver", "Database host:" ); ?>
- </div>
- <p class="config-desc">
- If your database server isn't on your web server, enter the name or IP address here.
- </p>
- </div>
-
- <div class="config-input"><?php aField( $conf, "DBname", "Database name:" ); ?></div>
- <div id="db-server-settings2">
- <div class="config-input"><?php aField( $conf, "DBuser", "DB username:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBpassword", "DB password:", "password" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBpassword2", "DB password confirm:", "password" ); ?></div>
- <p class="config-desc">
- If you only have a single user account and database available,
- enter those here. If you have database root access (see below)
- you can specify new accounts/databases to be created. This account
- will not be created if it pre-exists. If this is the case, ensure that it
- has SELECT, INSERT, UPDATE, and DELETE permissions on the MediaWiki database.
- </p>
-
- <div class="config-input">
- <label class="column">Superuser account:</label>
- <input type="checkbox" name="useroot" id="useroot" <?php if( $useRoot ) { ?>checked="checked" <?php } ?> />
- &nbsp;<label for="useroot">Use superuser account</label>
- </div>
- <div class="config-input"><?php aField( $conf, "RootUser", "Superuser name:", "text" ); ?></div>
- <div class="config-input"><?php aField( $conf, "RootPW", "Superuser password:", "password" ); ?></div>
-
- <p class="config-desc">
- If the database user specified above does not exist, or does not have access to create
- the database (if needed) or tables within it, please check the box and provide details
- of a superuser account, such as <strong>root</strong>, which does.
- </p>
- </div>
-
- <?php database_switcher('mysql'); ?>
- <div class="config-input"><?php aField( $conf, "DBprefix", "Database table prefix:" ); ?></div>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may choose to
- add a prefix to all the table names to avoid conflicts.</p>
-
- <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
- </div>
-
- <div class="config-input"><label class="column">Storage Engine</label>
- <div>Select one:</div>
- <ul class="plain">
- <li><?php aField( $conf, "DBengine", "InnoDB", "radio", "InnoDB" ); ?></li>
- <li><?php aField( $conf, "DBengine", "MyISAM", "radio", "MyISAM" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- InnoDB is best for public web installations, since it has good concurrency
- support. MyISAM may be faster in single-user installations. MyISAM databases
- tend to get corrupted more often than InnoDB databases.
- </p>
- <div class="config-input"><label class="column">Database character set</label>
- <div>Select one:</div>
- <ul class="plain">
- <li><?php aField( $conf, "DBschema", "MySQL 4.1/5.0 binary", "radio", "mysql5-binary" ); ?></li>
- <li><?php aField( $conf, "DBschema", "MySQL 4.1/5.0 UTF-8", "radio", "mysql5" ); ?></li>
- <li><?php aField( $conf, "DBschema", "MySQL 4.0 backwards-compatible UTF-8", "radio", "mysql4" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- This option is ignored on upgrade, the same character set will be kept.
- <br /><br />
- <b>WARNING:</b> If you use <b>backwards-compatible UTF-8</b> on MySQL 4.1+, and subsequently back up the database with <tt>mysqldump</tt>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!.
- <br /><br />
- In <b>binary mode</b>, MediaWiki stores UTF-8 text to the database in binary fields. This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters. In <b>UTF-8 mode</b>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it won't let you store characters above the <a target="_blank" href="http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes">Basic Multilingual Plane</a>.
- </p>
- </fieldset>
-
- <?php database_switcher('postgres'); ?>
- <div class="config-input"><?php aField( $conf, "DBport", "Database port:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBpgschema", "Schema for mediawiki:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBts2schema", "Schema for tsearch2:" ); ?></div>
- <div class="config-desc">
- <p>The username specified above (at "DB username") will have its search path set to the above schemas,
- so it is recommended that you create a new user. The above schemas are generally correct:
- only change them if you are sure you need to.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('sqlite'); ?>
- <div class="config-input"><?php
- aField( $conf, "SQLiteDataDir", "SQLite data directory:" );
- ?></div>
- <div class="config-desc">
- <p>SQLite stores table data into files in the
- filesystem.</p>
-
- <p>This directory must exist and be writable by the web server.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('mssql'); ?>
- <div class="config-input"><?php
- aField( $conf, "DBprefix2", "Database table prefix:" );
- ?></div>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may choose to
- add a prefix to all the table names to avoid conflicts.</p>
-
- <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('ibm_db2'); ?>
- <div class="config-input"><?php
- aField( $conf, "DBport_db2", "Database port:" );
- ?></div>
- <div class="config-input"><?php
- aField( $conf, "DBdb2schema", "Schema for mediawiki:" );
- ?></div>
- <div>Select one:</div>
- <ul class="plain">
- <li><?php aField( $conf, "DBcataloged", "Cataloged (DB2 installed locally)", "radio", "cataloged" ); ?></li>
- <li><?php aField( $conf, "DBcataloged", "Uncataloged (remote DB2 through ODBC)", "radio", "uncataloged" ); ?></li>
- </ul>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may specify
- a different schema to avoid conflicts.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('oracle'); ?>
- <div class="config-input"><?php aField( $conf, "DBprefix_ora", "Database table prefix:" ); ?></div>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may choose to
- add a prefix to all the table names to avoid conflicts.</p>
-
- <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
- </div>
- <div class="config-input"><?php aField( $conf, "DBdefTS_ora", "Default tablespace:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBtempTS_ora", "Temporary tablespace:" ); ?></div>
- </fieldset>
-
- <div class="config-input" style="padding:2em 0 3em">
- <label class='column'>&nbsp;</label>
- <input type="submit" value="Install MediaWiki!" class="btn-install" />
- </div>
-</div>
-</form>
-<script type="text/javascript">
-window.onload = toggleDBarea( <?php echo Xml::encodeJsVar( $conf->DBtype ); ?>,
-<?php
- ## If they passed in a root user name, don't populate it on page load
- echo strlen(importPost('RootUser', '')) ? 0 : 1;
-?>);
-</script>
-<?php
-}
-
-/* -------------------------------------------------------------------------------------- */
-function writeSuccessMessage() {
- $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
- if ( wfIniGetBool( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
- echo <<<HTML
-<div class="success-box">
-<p>Installation successful!</p>
-<p>To complete the installation, please do the following:
-<ol>
- <li>Download config/LocalSettings.php with your FTP client or file manager</li>
- <li>Upload it to the parent directory</li>
- <li>Delete config/LocalSettings.php</li>
- <li>Start using <a href='../$script'>your wiki</a>!
-</ol>
-<p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
-remotely. LocalSettings.php is currently owned by the user your webserver is running under,
-which means that anyone on the same server can read your database password! Downloading
-it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
-</div>
-HTML;
- } else {
- echo <<<HTML
-<div class="success-box">
-<p>
-<span class="success-message">Installation successful!</span>
-Move the <tt>config/LocalSettings.php</tt> file to the parent directory, then follow
-<a href="../$script"> this link</a> to your wiki.</p>
-<p>You should change file permissions for <tt>LocalSettings.php</tt> as required to
-prevent other users on the server reading passwords and altering configuration data.</p>
-</div>
-HTML;
- }
-}
-
-
-function escapePhpString( $string ) {
- if ( is_array( $string ) || is_object( $string ) ) {
- return false;
- }
- return strtr( $string,
- array(
- "\n" => "\\n",
- "\r" => "\\r",
- "\t" => "\\t",
- "\\" => "\\\\",
- "\$" => "\\\$",
- "\"" => "\\\""
- ));
-}
-
-function writeLocalSettings( $conf ) {
- $conf->PasswordSender = $conf->EmergencyContact;
- $magic = ($conf->ImageMagick ? "" : "# ");
- $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
- $rights = ($conf->RightsUrl) ? "" : "# ";
- $hashedUploads = $conf->safeMode ? '' : '# ';
- $dir = realpath( $conf->SQLiteDataDir );
- if ( !$dir ) {
- $dir = $conf->SQLiteDataDir; // dumb realpath sometimes fails
- }
- $sqliteDataDir = escapePhpString( $dir );
-
- if ( $conf->ShellLocale ) {
- $locale = '';
- } else {
- $locale = '# ';
- $conf->ShellLocale = 'en_US.UTF-8';
- }
-
- switch ( $conf->Shm ) {
- case 'memcached':
- $cacheType = 'CACHE_MEMCACHED';
- $mcservers = var_export( $conf->MCServerArray, true );
- break;
- case 'xcache':
- case 'apc':
- case 'eaccel':
- $cacheType = 'CACHE_ACCEL';
- $mcservers = 'array()';
- break;
- case 'dba':
- $cacheType = 'CACHE_DBA';
- $mcservers = 'array()';
- break;
- default:
- $cacheType = 'CACHE_NONE';
- $mcservers = 'array()';
- }
-
- if ( $conf->Email == 'email_enabled' ) {
- $enableemail = 'true';
- $enableuseremail = ( $conf->Emailuser == 'emailuser_enabled' ) ? 'true' : 'false' ;
- $eauthent = ( $conf->Eauthent == 'eauthent_enabled' ) ? 'true' : 'false' ;
- switch ( $conf->Enotif ) {
- case 'enotif_usertalk':
- $enotifusertalk = 'true';
- $enotifwatchlist = 'false';
- break;
- case 'enotif_allpages':
- $enotifusertalk = 'true';
- $enotifwatchlist = 'true';
- break;
- default:
- $enotifusertalk = 'false';
- $enotifwatchlist = 'false';
- }
- } else {
- $enableuseremail = 'false';
- $enableemail = 'false';
- $eauthent = 'false';
- $enotifusertalk = 'false';
- $enotifwatchlist = 'false';
- }
-
- $file = @fopen( "/dev/urandom", "r" );
- if ( $file ) {
- $secretKey = bin2hex( fread( $file, 32 ) );
- fclose( $file );
- } else {
- $secretKey = "";
- for ( $i=0; $i<8; $i++ ) {
- $secretKey .= dechex(mt_rand(0, 0x7fffffff));
- }
- print "<li>Warning: \$wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.</li>\n";
- }
-
- # Add slashes to strings for double quoting
- $slconf = wfArrayMap( "escapePhpString", get_object_vars( $conf ) );
- if( $conf->License == 'gfdl1_2' || $conf->License == 'pd' || $conf->License == 'gfdl1_3' ) {
- # Needs literal string interpolation for the current style path
- $slconf['RightsIcon'] = $conf->RightsIcon;
- }
-
- if( $conf->DBtype == 'mysql' ) {
- $dbsettings =
-"# MySQL specific settings
-\$wgDBprefix = \"{$slconf['DBprefix']}\";
-
-# MySQL table options to use during installation or update
-\$wgDBTableOptions = \"{$slconf['DBTableOptions']}\";
-
-# Experimental charset support for MySQL 4.1/5.0.
-\$wgDBmysql5 = {$conf->DBmysql5};";
- } elseif( $conf->DBtype == 'postgres' ) {
- $dbsettings =
-"# Postgres specific settings
-\$wgDBport = \"{$slconf['DBport']}\";
-\$wgDBmwschema = \"{$slconf['DBpgschema']}\";
-\$wgDBts2schema = \"{$slconf['DBts2schema']}\";";
- } elseif( $conf->DBtype == 'sqlite' ) {
- $dbsettings =
-"# SQLite-specific settings
-\$wgSQLiteDataDir = \"{$sqliteDataDir}\";";
- } elseif( $conf->DBtype == 'mssql' ) {
- $dbsettings =
-"# MSSQL specific settings
-\$wgDBprefix = \"{$slconf['DBprefix2']}\";";
- } elseif( $conf->DBtype == 'ibm_db2' ) {
- $dbsettings =
-"# DB2 specific settings
-\$wgDBport_db2 = \"{$slconf['DBport_db2']}\";
-\$wgDBmwschema = \"{$slconf['DBdb2schema']}\";
-\$wgDBcataloged = \"{$slconf['DBcataloged']}\";";
- } elseif( $conf->DBtype == 'oracle' ) {
- $dbsettings =
-"# Oracle specific settings
-\$wgDBprefix = \"{$slconf['DBprefix_ora']}\";";
- } else {
- // ummm... :D
- $dbsettings = '';
- }
-
-
- $localsettings = "
-# This file was automatically generated by the MediaWiki installer.
-# If you make manual changes, please keep track in case you need to
-# recreate them later.
-#
-# See includes/DefaultSettings.php for all configurable settings
-# and their default values, but don't forget to make changes in _this_
-# file, not there.
-#
-# Further documentation for configuration settings may be found at:
-# http://www.mediawiki.org/wiki/Manual:Configuration_settings
-
-# If you customize your file layout, set \$IP to the directory that contains
-# the other MediaWiki files. It will be used as a base to locate files.
-if( defined( 'MW_INSTALL_PATH' ) ) {
- \$IP = MW_INSTALL_PATH;
-} else {
- \$IP = dirname( __FILE__ );
-}
-
-\$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
-set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
-
-require_once( \"\$IP/includes/DefaultSettings.php\" );
-
-if ( \$wgCommandLineMode ) {
- if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
- die( \"This script must be run from the command line\\n\" );
- }
-}
-## Uncomment this to disable output compression
-# \$wgDisableOutputCompression = true;
-
-\$wgSitename = \"{$slconf['Sitename']}\";
-
-## 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:
-## http://www.mediawiki.org/wiki/Manual:Short_URL
-\$wgScriptPath = \"{$slconf['ScriptPath']}\";
-\$wgScriptExtension = \"{$slconf['ScriptExtension']}\";
-
-## The relative URL path to the skins directory
-\$wgStylePath = \"\$wgScriptPath/skins\";
-
-## The relative URL path to the logo. Make sure you change this from the default,
-## or else you'll overwrite your logo when you upgrade!
-\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
-
-## UPO means: this is also a user preference option
-
-\$wgEnableEmail = $enableemail;
-\$wgEnableUserEmail = $enableuseremail; # UPO
-
-\$wgEmergencyContact = \"{$slconf['EmergencyContact']}\";
-\$wgPasswordSender = \"{$slconf['PasswordSender']}\";
-
-\$wgEnotifUserTalk = $enotifusertalk; # UPO
-\$wgEnotifWatchlist = $enotifwatchlist; # UPO
-\$wgEmailAuthentication = $eauthent;
-
-## Database settings
-\$wgDBtype = \"{$slconf['DBtype']}\";
-\$wgDBserver = \"{$slconf['DBserver']}\";
-\$wgDBname = \"{$slconf['DBname']}\";
-\$wgDBuser = \"{$slconf['DBuser']}\";
-\$wgDBpassword = \"{$slconf['DBpassword']}\";
-
-{$dbsettings}
-
-## Shared memory settings
-\$wgMainCacheType = $cacheType;
-\$wgMemCachedServers = $mcservers;
-
-## To enable image uploads, make sure the 'images' directory
-## is writable, then set this to true:
-\$wgEnableUploads = false;
-{$magic}\$wgUseImageMagick = true;
-{$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
-
-## If you use ImageMagick (or any other shell command) on a
-## Linux server, this will need to be set to the name of an
-## available UTF-8 locale
-{$locale}\$wgShellLocale = \"{$slconf['ShellLocale']}\";
-
-## If you want to use image uploads under safe mode,
-## create the directories images/archive, images/thumb and
-## images/temp, and make them all writable. Then uncomment
-## this, if it's not already uncommented:
-{$hashedUploads}\$wgHashedUploadDirectory = false;
-
-## If you have the appropriate support software installed
-## you can enable inline LaTeX equations:
-\$wgUseTeX = false;
-
-## Set \$wgCacheDirectory to a writable directory on the web server
-## to make your wiki go slightly faster. The directory should not
-## be publically accessible from the web.
-#\$wgCacheDirectory = \"\$IP/cache\";
-
-\$wgLocalInterwiki = strtolower( \$wgSitename );
-
-\$wgLanguageCode = \"{$slconf['LanguageCode']}\";
-
-\$wgSecretKey = \"$secretKey\";
-
-## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'vector', 'monobook':
-\$wgDefaultSkin = 'monobook';
-
-## For attaching licensing metadata to pages, and displaying an
-## appropriate copyright notice / icon. GNU Free Documentation
-## License and Creative Commons licenses are supported so far.
-{$rights}\$wgEnableCreativeCommonsRdf = true;
-\$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
-\$wgRightsUrl = \"{$slconf['RightsUrl']}\";
-\$wgRightsText = \"{$slconf['RightsText']}\";
-\$wgRightsIcon = \"{$slconf['RightsIcon']}\";
-# \$wgRightsCode = \"{$slconf['RightsCode']}\"; # Not yet used
-
-\$wgDiff3 = \"{$slconf['diff3']}\";
-
-# When you make changes to this configuration file, this will make
-# sure that cached pages are cleared.
-\$wgCacheEpoch = max( \$wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
-"; ## End of setting the $localsettings string
-
- // Keep things in Unix line endings internally;
- // the system will write out as local text type.
- return str_replace( "\r\n", "\n", $localsettings );
-}
-
-function dieout( $text ) {
- global $mainListOpened;
- if( $mainListOpened ) echo( "</ul>" );
- if( $text != '' && substr( $text, 0, 2 ) != '<p' && substr( $text, 0, 2 ) != '<h' ){
- echo "<p>$text</p>\n";
- } else {
- echo $text;
- }
- die( "\n\n</div>\n</div>\n</div>\n</div>\n</body>\n</html>" );
-}
-
-function importVar( &$var, $name, $default = "" ) {
- if( isset( $var[$name] ) ) {
- $retval = $var[$name];
- if ( get_magic_quotes_gpc() ) {
- $retval = stripslashes( $retval );
- }
- } else {
- $retval = $default;
- }
- taint( $retval );
- return $retval;
-}
-
-function importPost( $name, $default = "" ) {
- return importVar( $_POST, $name, $default );
-}
-
-function importCheck( $name ) {
- return isset( $_POST[$name] );
-}
-
-function importRequest( $name, $default = "" ) {
- return importVar( $_REQUEST, $name, $default );
-}
-
-function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick = '' ) {
- static $radioCount = 0;
- if( $type != "" ) {
- $xtype = "type=\"$type\"";
- } else {
- $xtype = "";
- }
-
- $id = $field;
- $nolabel = ($type == "radio") || ($type == "hidden");
-
- if ($type == 'radio')
- $id .= $radioCount++;
-
- if( !$nolabel ) {
- echo "<label class='column' for=\"$id\">$text</label>";
- }
-
- if( $type == "radio" && $value == $conf->$field ) {
- $checked = "checked='checked'";
- } else {
- $checked = "";
- }
- echo "<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked ";
- if ($onclick) {
- echo " onclick='toggleDBarea(\"$value\",1)' " ;
- }
- echo "value=\"";
- if( $type == "radio" ) {
- echo htmlspecialchars( $value );
- } else {
- echo htmlspecialchars( $conf->$field );
- }
-
-
- echo "\" />";
- if( $nolabel ) {
- echo "<label for=\"$id\">$text</label>";
- }
-
- global $errs;
- if(isset($errs[$field])) {
- echo "<span class='error'>" . htmlspecialchars( $errs[$field] ) . "</span>\n";
- }
-}
-
-function getLanguageList() {
- global $wgDummyLanguageCodes;
-
- $codes = array();
- foreach ( Language::getLanguageNames() as $code => $name ) {
- if( in_array( $code, $wgDummyLanguageCodes ) ) continue;
- $codes[$code] = $code . ' - ' . $name;
- }
- ksort( $codes );
- return $codes;
-}
-
-#Check for location of an executable
-# @param string $loc single location to check
-# @param array $names filenames to check for.
-# @param mixed $versioninfo array of details to use when checking version, use false for no version checking
-function locate_executable($loc, $names, $versioninfo = false) {
- if (!is_array($names))
- $names = array($names);
-
- foreach ($names as $name) {
- $command = "$loc".DIRECTORY_SEPARATOR."$name";
- if (@file_exists($command)) {
- if (!$versioninfo)
- return $command;
-
- $file = str_replace('$1', $command, $versioninfo[0]);
- if ( strstr( wfShellExec( $file ), $versioninfo[1]) !== false )
- return $command;
- }
- }
- return false;
-}
-
-# Test a memcached server
-function testMemcachedServer( $server ) {
- $hostport = explode(":", $server);
- $errstr = false;
- $fp = false;
- if ( !function_exists( 'fsockopen' ) ) {
- $errstr = "Can't connect to memcached, fsockopen() not present";
- }
- if ( !$errstr && count( $hostport ) != 2 ) {
- $errstr = 'Please specify host and port';
- }
- if ( !$errstr ) {
- list( $host, $port ) = $hostport;
- $errno = 0;
- $fsockerr = '';
-
- $fp = @fsockopen( $host, $port, $errno, $fsockerr, 1.0 );
- if ( $fp === false ) {
- $errstr = "Cannot connect to memcached on $host:$port : $fsockerr";
- }
- }
- if ( !$errstr ) {
- $command = "version\r\n";
- $bytes = fwrite( $fp, $command );
- if ( $bytes != strlen( $command ) ) {
- $errstr = "Cannot write to memcached socket on $host:$port";
- }
- }
- if ( !$errstr ) {
- $expected = "VERSION ";
- $response = fread( $fp, strlen( $expected ) );
- if ( $response != $expected ) {
- $errstr = "Didn't get correct memcached response from $host:$port";
- }
- }
- if ( $fp ) {
- fclose( $fp );
- }
- if ( !$errstr ) {
- echo "<li>Connected to memcached on " . htmlspecialchars( "$host:$port" ) ." successfully</li>";
- }
- return $errstr;
-}
-
-function database_picker($conf) {
- global $ourdb;
- print "\n";
- foreach(array_keys($ourdb) as $db) {
- if ($ourdb[$db]['havedriver']) {
- print "\t<li>";
- aField( $conf, "DBtype", $ourdb[$db]['fullname'], 'radio', $db, 'onclick');
- print "</li>\n";
- }
- }
- print "\n\t";
-}
-
-function database_switcher($db) {
- global $ourdb;
- $color = $ourdb[$db]['bgcolor'];
- $full = $ourdb[$db]['fullname'];
- print "<fieldset id='$db' style='clear:both'><legend>$full-specific options</legend>\n";
-}
-
-function printListItem( $item ) {
- print "<li>$item</li>";
-}
-
-# Determine a suitable value for $wgShellLocale
-function getShellLocale( $wikiLang ) {
- # Give up now if we're in safe mode or open_basedir
- # It's theoretically possible but tricky to work with
- if ( wfIniGetBool( "safe_mode" ) || ini_get( 'open_basedir' ) || !function_exists('exec') ) {
- return false;
- }
-
- $os = php_uname( 's' );
- $supported = array( 'Linux', 'SunOS', 'HP-UX' ); # Tested these
- if ( !in_array( $os, $supported ) ) {
- return false;
- }
-
- # Get a list of available locales
- $lines = $ret = false;
- $lines = wfShellExec( '/usr/bin/locale -a', $ret, true );
- if ( $ret ) {
- return false;
- }
-
- $lines = wfArrayMap( 'trim', explode( "\n", $lines ) );
- $candidatesByLocale = array();
- $candidatesByLang = array();
- foreach ( $lines as $line ) {
- if ( $line === '' ) {
- continue;
- }
- if ( !preg_match( '/^([a-zA-Z]+)(_[a-zA-Z]+|)\.(utf8|UTF-8)(@[a-zA-Z_]*|)$/i', $line, $m ) ) {
- continue;
- }
- list( $all, $lang, $territory, $charset, $modifier ) = $m;
- $candidatesByLocale[$m[0]] = $m;
- $candidatesByLang[$lang][] = $m;
- }
-
- # Try the current value of LANG
- if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
- return getenv( 'LANG' );
- }
-
- # Try the most common ones
- $commonLocales = array( 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' );
- foreach ( $commonLocales as $commonLocale ) {
- if ( isset( $candidatesByLocale[$commonLocale] ) ) {
- return $commonLocale;
- }
- }
-
- # Is there an available locale in the Wiki's language?
- if ( isset( $candidatesByLang[$wikiLang] ) ) {
- $m = reset( $candidatesByLang[$wikiLang] );
- return $m[0];
- }
-
- # Are there any at all?
- if ( count( $candidatesByLocale ) ) {
- $m = reset( $candidatesByLocale );
- return $m[0];
- }
-
- # Give up
- return false;
-}
-
-function wfArrayMap( $function, $input ) {
- $ret = array_map( $function, $input );
- foreach ( $ret as $key => $value ) {
- $taint = istainted( $input[$key] );
- if ( $taint ) {
- taint( $ret[$key], $taint );
- }
- }
- return $ret;
-}
-
-?>
-
- <div class="license">
- <hr/>
- <p>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.</p>
-
- <p>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.</p>
-
- <p>You should have received <a href="../COPYING">a copy of the GNU General Public License</a>
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- or <a href="http://www.gnu.org/copyleft/gpl.html">read it online</a></p>
- </div>
-
-</div></div></div>
-
-
-<div id="column-one">
- <div class="portlet" id="p-logo">
- <a style="background-image: url(../skins/common/images/mediawiki.png);"
- href="../"
- title="Main Page"></a>
- </div>
- <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
- <div class='portlet'><div class='pBody'>
- <ul>
- <li><a href="../README">Readme</a></li>
- <li><a href="../RELEASE-NOTES">Release notes</a></li>
- <li><a href="../docs/">Documentation</a></li>
- <li><a href="http://www.mediawiki.org/wiki/Help:Contents">User's Guide</a></li>
- <li><a href="http://www.mediawiki.org/wiki/Manual:Contents">Administrator's Guide</a></li>
- <li><a href="http://www.mediawiki.org/wiki/Manual:FAQ">FAQ</a></li>
- </ul>
- <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright © 2001-2009 by Magnus Manske, Brion Vibber,
- Lee Daniel Crocker, Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason, Niklas Laxström,
- Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor, Aaron Schulz and others.</p>
- </div></div>
-</div>
-
-</div>
-
-</body>
-</html>
diff --git a/config/OBSOLETE b/config/OBSOLETE
new file mode 100644
index 00000000..108c1675
--- /dev/null
+++ b/config/OBSOLETE
@@ -0,0 +1,2 @@
+This is a back-compat directory for installer, which resides in mw-config/ now.
+It will probably be remved in 1.19. \ No newline at end of file
diff --git a/config/index.php b/config/index.php
index d913bbb1..948fe69f 100644
--- a/config/index.php
+++ b/config/index.php
@@ -1,43 +1 @@
-<?php
-
-# MediaWiki web-based config/installation
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>, 2006 Rob Church <robchur@gmail.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-# Attempt to set up the include path, to fix problems with relative includes
-$IP = dirname( dirname( __FILE__ ) );
-define( 'MW_INSTALL_PATH', $IP );
-
-# Define an entry point and include some files
-define( "MEDIAWIKI", true );
-define( "MEDIAWIKI_INSTALL", true );
-
-# Check for PHP 5
-if ( !function_exists( 'version_compare' )
- || version_compare( phpversion(), '5.0.0' ) < 0
-) {
- define( 'MW_PHP4', '1' );
- require( "$IP/includes/DefaultSettings.php" );
- require( "$IP/includes/templates/PHP4.php" );
- exit;
-}
-
-// Isolate the rest of the code so this file can die out cleanly
-// if we find we're running under PHP 4.x... We use PHP 5 syntax
-// which doesn't parse under 4.
-require( dirname( __FILE__ ) . "/Installer.php" );
+<?php require( dirname( dirname( __FILE__ ) ) . '/mw-config/index.php' ); \ No newline at end of file
diff --git a/config/index.php5 b/config/index.php5
index 8e6ceda9..f9ce630c 100644
--- a/config/index.php5
+++ b/config/index.php5
@@ -1,4 +1 @@
-<?php
-
-define('MW_INSTALL_PHP5_EXT', 1);
-require './index.php';
+<?php require( dirname( dirname( __FILE__ ) ) . '/mw-config/index.php5' ); \ No newline at end of file
diff --git a/docs/code-coverage/README b/docs/code-coverage/README
new file mode 100644
index 00000000..7bc55ce2
--- /dev/null
+++ b/docs/code-coverage/README
@@ -0,0 +1,2 @@
+This directory is for the auto-generated phpunit code coverage.
+Run 'make coverage' in the maintenance/tests/phpunit subdirectory to build.
diff --git a/docs/database.txt b/docs/database.txt
index e80a4940..b9fa6ff7 100644
--- a/docs/database.txt
+++ b/docs/database.txt
@@ -19,12 +19,9 @@ To make a read query, something like this usually suffices:
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( /* ...see docs... */ );
-while ( $row = $dbr->fetchObject( $res ) ) {
+foreach ( $res as $row ) {
...
}
-$dbr->freeResult( $res );
-
-Note the assignment operator in the while condition.
For a write query, use something like:
@@ -149,9 +146,7 @@ to avoid long-lasting locks. By default, MediaWiki opens a transaction
at the first query, and commits it before the output is sent. Locks will
be held from the time when the query is done until the commit. So you
can reduce lock time by doing as much processing as possible before you
-do your write queries. Update operations which do not require database
-access can be delayed until after the commit by adding an object to
-$wgPostCommitUpdateList.
+do your write queries.
Often this approach is not good enough, and it becomes necessary to
enclose small groups of queries in their own transaction. Use the
@@ -174,3 +169,20 @@ queries, by using an appropriate condition in the WHERE clause of an
UPDATE, or by using unique indexes in combination with INSERT IGNORE.
Then use the affected row count to see if the query succeeded.
+------------------------------------------------------------------------
+ Supported DBMSs
+------------------------------------------------------------------------
+
+MediaWiki is written primarily for use with MySQL. Queries are optimized
+for it and its schema is considered the canonical version. However,
+MediaWiki does support the following other DBMSs to varying degrees.
+
+* PostgreSQL
+* SQLite
+* Oracle
+* IBM DB2
+* MSSQL
+
+More information can be found about each of these databases (known issues,
+level of support, extra configuration) in the "databases" subdirectory in
+this folder.
diff --git a/maintenance/ibm_db2/README b/docs/databases/ibm_db2.txt
index 3c3f381c..3c3f381c 100644
--- a/maintenance/ibm_db2/README
+++ b/docs/databases/ibm_db2.txt
diff --git a/docs/databases/postgres.txt b/docs/databases/postgres.txt
new file mode 100644
index 00000000..cec51861
--- /dev/null
+++ b/docs/databases/postgres.txt
@@ -0,0 +1,100 @@
+This document describes the state of Postgres support in MediaWiki.
+
+
+== Overview ==
+
+Support for PostgreSQL has been available since version 1.7
+of MediaWiki, and is fairly well maintained. The main code
+is very well integrated, while extensions are very hit and miss.
+Still, it is probably the most supported database after MySQL.
+Much of the work in making MediaWiki database-agnostic came
+about through the work of creating Postgres support.
+
+
+== Required versions ==
+
+The current minimum version of PostgreSQL for MediaWiki is 8.1.
+It is expected that this will be raised to 8.3 at some point,
+as 8.1 and 8.2 are nearing end of life.
+
+
+
+== Database schema ==
+
+Postgres has its own schema file at maintenance/postgres/tables.sql.
+
+The goal is to keep this file as close as possible to the canonical
+schema at maintenance/tables.sql, but without copying over
+all the usage comments. General notes on the conversion:
+
+* The use of a true TIMESTAMP rather than the text string that
+MySQL uses is highly encouraged. There are still places in the
+code (especially extensions) which make assumptions about the
+textual nature of timestamp fields, but these can almost always
+be programmed around.
+
+* Although Postgres has a true BOOLEAN type, boolean columns
+are always mapped to SMALLINT, as the code does not always treat
+the column as a boolean (which is limited to accepting true,
+false, 0, 1, t, or f)
+
+* The default data type for all VARCHAR, CHAR, and VARBINARY
+columns should simply be TEXT. The only exception is
+when VARBINARY is used to store true binary data, such as
+the math_inputhash column, in which case BYTEA should be used.
+
+* All integer variants should generally be mapped to INTEGER.
+There is small-to-no advantage in using SMALLINT versus
+INTEGER in Postgres, and the possibility of running out of
+room outweighs such concerns. The columns that are BIGINT
+in other schemas should be INTEGER as well, as none of them
+so far are even remotely likely to reach the 32 billion
+limit of an INTEGER.
+
+* Blobs (blob, tinyblog, mediumblob) should be mapped to TEXT
+whenever possible, and to BYTEA if they are known to contain
+binary data.
+
+* All length modifiers on data types should be removed. If
+they are on an INTEGER, it's probably an error, and if on
+any text-based field, simply using TEXT is preferred.
+
+* Sequences should be explicitly named rather than using
+SERIAL, as the code can depend on having a specific name.
+
+* Foreign keys should be used when possible. This makes things
+both easier and harder in the code, but most of the major
+problems have now been overcome. Always add an explicit ON DELETE
+clause, and consider carefully what choice to use (all things
+considered, prefer CASCADE).
+
+* The use of CIDR should be done very carefully, because the code
+will sometimes want to store things such as an empty string or
+other non-IP value in the column. When in doubt, use TEXT.
+
+* Indexes should be created using the original MySQL tables.sql
+as a guide, but keeping in mind the ability of Postgres to use
+partial indexes, functional indexes, and bitmaps. The index names
+should be logical but are not too important, as they are never
+referenced directly by the code (unlike sequence names). Most of
+the indexes in the file as of this writing are there due to production
+testing of expensive queries on a busy wiki.
+
+
+== Keeping in sync with tables.sql ==
+
+The script maintenance/postgres/compare_schemas.pl should be
+periodically run. It will parse both "tables.sql" files and
+produce any differences found. Such differences should be fixed
+or exceptions specifically carved out by editing the script
+itself. This script has also been very useful in finding problems
+in maintenance/tables.sql itself, as it is very strict in the
+format it expects things to be in. :)
+
+
+== Getting help ==
+
+In addition to the normal venues (MediaWiki mailing lists
+and IRC channels), the #postgresql channel on irc.freenode.net
+is a friendly and expert resource if you should encounter a
+problem with your Postgres-enabled MediaWiki.
diff --git a/maintenance/sqlite/README b/docs/databases/sqlite.txt
index b8a45553..b8a45553 100644
--- a/maintenance/sqlite/README
+++ b/docs/databases/sqlite.txt
diff --git a/docs/distributors.txt b/docs/distributors.txt
index 5586df12..e9f151cf 100644
--- a/docs/distributors.txt
+++ b/docs/distributors.txt
@@ -58,13 +58,11 @@ If you really must mess around with the directory structure, note that the
following files *must* all be web-accessible for MediaWiki to function
correctly:
- * api.php, img_auth.php, index.php, mwScriptLoader.php, opensearch_desc.php,
- profileinfo.php, redirect.php, thumb.php, trackback.php. These are the entry
- points for normal usage. This list may be incomplete and is subject to
- change.
- * config/index.php: Used for web-based installation (sets up the database,
- prompts for the name of the wiki, etc.). No command-line installation is
- currently available.
+ * api.php, img_auth.php, index.php, load.php, opensearch_desc.php, thumb.php,
+ profileinfo.php, redirect.php, trackback.php. These are the entry points for
+ normal usage. This list may be incomplete and is subject to change.
+ * mw-config/index.php: Used for web-based installation (sets up the database,
+ prompts for the name of the wiki, etc.).
* images/: Used for uploaded files. This could be somewhere else if
$wgUploadDirectory and $wgUploadPath are changed appropriately.
* skins/*/: Subdirectories of skins/ contain CSS and JavaScript files that
@@ -84,25 +82,42 @@ something. You have been warned.
== Configuration ==
MediaWiki is configured using LocalSettings.php. This is a PHP file that's
-generated when the user visits config/index.php to install the software, and
+generated when the user visits mw-config/index.php to install the software, and
which the user can edit by hand thereafter. It's just a plain old PHP file,
and can contain any PHP statements. It usually sets global variables that are
used for configuration, and includes files used by any extensions.
Distributors cannot easily add extra statements to the autogenerated
-LocalSettings.php at the present time -- although hacking config/index.php
+LocalSettings.php at the present time -- although hacking mw-config/index.php
would work. It would be nice if this situation could be improved.
+There's a new maintenance/install.php script which could be used for performing
+an install through the command line.
+
Some configuration options that distributors might be in a position to set
intelligently:
* $wgEmergencyContact: An e-mail address that can be used to contact the wiki
- administrator. By default, "wikiadmin@$wgServerName".
+ administrator. By default, "wikiadmin@ServerName".
* $wgPasswordSender: The e-mail address to use when sending password e-mails.
- By default, "MediaWiki Mail <apache@$wgServerName>".
+ By default, "MediaWiki Mail <apache@ServerName>".
+ (with ServerName guessed from the http request)
* $wgSMTP: Can be configured to use SMTP for mail sending instead of PHP
mail().
+== Updates ==
+The correct way for updating a wiki is to update the files and then run from
+command line the maintenance/update.php script (with appropriate parameters if
+files were moved). It will perform all the needed steps to update the database
+schema and contents to the version from whatever old one it has.
+Any package manager which replaces the files but doesn't update the db is leaving
+an inconsistent wiki that may produce blank pages (php errors) when new features
+using the changed schema would be used.
+
+Since MediaWiki 1.17 it is possible to upgrade using the installer by providing
+an arbitrary secret value stored as $wgUpgradeKey in LocalSettings (older versions
+needed to rename LocalSettings.php in order to upgrade using the installer).
+
== Documentation ==
MediaWiki's official documentation is split between two places: the source
@@ -156,8 +171,8 @@ perhaps configure it to use them (see Configuration section of this document):
"$wgAntivirus = 'clamav';".
* DjVuLibre: Allows processing of DjVu files. To enable this, set
"$wgDjvuDump = 'djvudump'; $wgDjvuRenderer = 'ddjvu'; $wgDjvuTxt = 'djvutxt';".
- * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with "$wgUseTidy
- = true;".
+ * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with
+ "$wgUseTidy = true;".
* ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
it. PHP's GD can also be used, but ImageMagick is preferable.
* Squid: Can provide a drastic speedup and a major cut in resource
@@ -172,7 +187,7 @@ perhaps configure it to use them (see Configuration section of this document):
MediaWiki uses some standard GNU utilities as well, such as diff and diff3. If
these are present in /usr/bin or some other reasonable location, they will be
-used automatically.
+configured automatically on install.
MediaWiki also has a "job queue" that handles background processing. Because
shared hosts often don't provide access to cron, the job queue is run on every
diff --git a/docs/export-0.5.xsd b/docs/export-0.5.xsd
new file mode 100644
index 00000000..a0884958
--- /dev/null
+++ b/docs/export-0.5.xsd
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.5.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.5/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.5/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.5/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have two titles differing only by case. -->
+ <!-- Not yet implemented as of MediaWiki 1.5 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ <element name="logitem" type="mw:LogItemType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ <attribute name="bytes" use="optional" type="nonNegativeInteger"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/docs/hooks.txt b/docs/hooks.txt
index 174fb7d9..8a0003a3 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -263,6 +263,23 @@ $message: out parameter: error message to display on abort
$user: the User object that was created. (Parameter added in 1.7)
$byEmail: true when account was created "by email" (added in 1.12)
+'AfterImportPage': When a page import is completed
+$title: Title under which the revisions were imported
+$origTitle: Title provided by the XML file
+$revCount: Number of revisions in the XML file
+$sRevCount: Number of sucessfully imported revisions
+$pageInfo: associative array of page information
+
+'AfterUserMessage': After a user message has been left, this hook is
+called to take care of any cleanup.
+$user: The user who we left the message for.
+$article: The article the message was left on.
+$subject: The subject of the message
+$text: The text of the message.
+$signature: The signature we used.
+$summary: The edit summary.
+$editor: The editor that performed the edit.
+
'AjaxAddScript': Called in output page just before the initialisation
of the javascript ajax engine. The hook is only called when ajax
is enabled ( $wgUseAjax = true; ).
@@ -345,6 +362,13 @@ is the User object. In the hook, just add your callback to the
$tokenFunctions array and return true (returning false makes no sense)
$tokenFunctions: array(action => callback)
+'ApiRsdServiceApis': Add or remove APIs from the RSD services list.
+Each service should have its own entry in the $apis array and have a
+unique name, passed as key for the array that represents the service data.
+In this data array, the key-value-pair identified by the apiLink key is
+required.
+&$apis: array of services
+
'ArticleAfterFetchContent': after fetching content of an article from
the database
$article: the article (object) being loaded from the database
@@ -356,6 +380,10 @@ $article: the article (object) being deleted
$output: the OutputPage object ($wgOut)
&$reason: the reason (string) the article is being deleted
+'ArticleContentOnDiff': before showing the article below a diff
+ $diffEngine: the DifferenceEngine
+ $output: the OutputPage object ($wgOut)
+
'ArticleDelete': before an article is deleted
$article: the article (object) being deleted
$user: the user (object) deleting the article
@@ -429,7 +457,7 @@ $moveonly: boolean whether it was for move only or not
'ArticlePurge': before executing "&action=purge"
$article: article (object) to purge
-'ArticleRevisionVisiblitySet': called when changing visibility of one or more
+'ArticleRevisionVisibilitySet': called when changing visibility of one or more
revision of an article
&$title: title object of the article
@@ -552,6 +580,9 @@ $user: the user who did the block (not the one being blocked)
'BookInformation': Before information output on Special:Booksources
$isbn: ISBN to show information for
$output: OutputPage object in use
+
+'CanonicalNamespaces': For extensions adding their own namespaces or altering the defaults
+&$namespaces: Array of namespace numbers with corresponding canonical names
'CategoryPageView': before viewing a categorypage in CategoryPage::view
$catpage: CategoryPage instance
@@ -617,8 +648,9 @@ $section: The designation of the section being pointed to, to be included in
the link, like "&section=$section"
$tooltip: The default tooltip. Escape with htmlspecialchars() before using.
By default, this is wrapped in the 'editsectionhint' message.
-$result: The HTML to return, prefilled with the default plus whatever other
+&$result: The HTML to return, prefilled with the default plus whatever other
changes earlier hooks have made
+$lang: The language code to use for the link in the wfMsg* functions
'EditFilter': Perform checks on an edit
$editor: Edit form (see includes/EditPage.php)
@@ -717,7 +749,8 @@ $skin: Skin rendering the UI
$title: Title being linked to
$section: Section to link to
$link: Default link
-$result: Result (alter this to override the generated links)
+&$result: Result (alter this to override the generated links)
+$lang: The language code to use for the link in the wfMsg* functions
'EmailConfirmed': When checking that the user's email address is "confirmed"
$user: User being checked
@@ -731,17 +764,29 @@ $from: address of sending user
$subject: subject of the mail
$text: text of the mail
+'EmailUserCC': before sending the copy of the email to the author
+$to: address of receiving user
+$from: address of sending user
+$subject: subject of the mail
+$text: text of the mail
+
'EmailUserComplete': after sending email from one user to another
$to: address of receiving user
$from: address of sending user
$subject: subject of the mail
$text: text of the mail
+'EmailUserForm': after building the email user form object
+$form: HTMLForm object
+
'EmailUserPermissionsErrors': to retrieve permissions errors for emailing a user.
$user: The user who is trying to email another user.
$editToken: The user's edit token.
&$hookErr: Out-param for the error. Passed as the parameters to OutputPage::showErrorPage.
+'ExtensionTypes': called when generating the extensions credits, use this to change the tables headers
+&$extTypes: associative array of extensions types
+
'FetchChangesList': When fetching the ChangesList derivative for
a particular user
&$user: User the list is being fetched for
@@ -759,6 +804,8 @@ $reason: reason
'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)
+$hasDescription : Boolean indicating that there was already a description page and a new one from the comment wasn't created (since 1.17)
'FileUndeleteComplete': When a file is undeleted
$title: title object to the file
@@ -766,6 +813,12 @@ $fileVersions: array of undeleted versions. Empty if all versions were restored
$user: user who performed the undeletion
$reason: reason
+'FormatUserMessage': Hook to format a message if you want to override
+the internal formatter.
+$subject: Title of the message.
+&$text: Text of the message.
+$signature: Signature that they would like to leave.
+
'GetAutoPromoteGroups': When determining which autopromote groups a user
is entitled to be in.
&$user: user to promote.
@@ -789,6 +842,9 @@ $title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getInternalURL()
+'GetIP': modify the ip of the current user (called only once)
+&$ip: string holding the ip as determined so far
+
'GetLinkColours': modify the CSS class of an array of page links
$linkcolour_ids: array of prefixed DB keys of the pages linked to,
indexed by page_id.
@@ -818,10 +874,6 @@ $result: User permissions error to add. If none, return true.
'getUserPermissionsErrorsExpensive': Absolutely the same, but is called only
if expensive checks are enabled.
-'HTMLCacheUpdate::doUpdate': After cache invalidation updates are inserted
-into the job queue.
-$title: Title object, pages linked to this title are purged.
-
'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.
@@ -873,6 +925,29 @@ $page: ImagePage object
$result[2 through n]=Parameters passed to body text message. Please note the
header message cannot receive/use parameters.
+'ImportHandleLogItemXMLTag': When parsing a XML tag in a log item
+$reader: XMLReader object
+$logInfo: Array of information
+Return false to stop further processing of the tag
+
+'ImportHandlePageXMLTag': When parsing a XML tag in a page
+$reader: XMLReader object
+$pageInfo: Array of information
+Return false to stop further processing of the tag
+
+'ImportHandleRevisionXMLTag': When parsing a XML tag in a page revision
+$reader: XMLReader object
+$revInfo: Array of information
+Return false to stop further processing of the tag
+
+'ImportHandleToplevelXMLTag': When parsing a top level XML tag
+$reader: XMLReader object
+Return false to stop further processing of the tag
+
+'ImportHandleUploadXMLTag': When parsing a XML tag in a file upload
+$reader: XMLReader object
+$revisionInfo: Array of information
+Return false to stop further processing of the tag
'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect
$title: Title object ($wgTitle)
@@ -964,20 +1039,20 @@ $linkType: The external link type
'LinksUpdate': At the beginning of LinksUpdate::doUpdate() just before the
actual update
-&$linksUpdate: the LinkUpdate object
+&$linksUpdate: the LinksUpdate object
'LinksUpdateComplete': At the end of LinksUpdate::doUpdate() when updating has
completed
-&$linksUpdate: the LinkUpdate object
+&$linksUpdate: the LinksUpdate object
'LinksUpdateConstructed': At the end of LinksUpdate() is contruction.
-&$linksUpdate: the LinkUpdate object
+&$linksUpdate: the LinksUpdate object
'ListDefinedTags': When trying to find all defined tags.
&$tags: The list of tags.
-'LoadExtensionSchemaUpdates': called by maintenance/updaters.inc when upgrading
-database schema
+'LoadExtensionSchemaUpdates': called during database installation and updates
+&updater: A DatabaseUpdater subclass
'LocalFile::getHistory': called before file history query performed
$file: the file
@@ -1038,7 +1113,9 @@ $magicWords: array of strings
$variableIDs: array of strings
'MakeGlobalVariablesScript': called right before Skin::makeVariablesScript
-is executed
+is executed. Ideally, this hook should only be used to add variables that
+depend on the current page/request; static configuration should be added
+through ResourceLoaderGetConfigVars instead.
&$vars: variable (or multiple variables) to be added into the output
of Skin::makeVariablesScript
@@ -1090,7 +1167,7 @@ been rendered (useful for adding more)
Note: this is only run for the Monobook skin. This hook is deprecated and
may be removed in the future. To add items to the toolbox you should use
the SkinTemplateToolboxEnd hook instead, which works for all
-'SkinTemplate'-type skins.
+"SkinTemplate"-type skins.
$tools: array of tools
'NewRevisionFromEditComplete': called when a revision was inserted
@@ -1130,6 +1207,14 @@ the resulting HTML is about to be displayed.
$parserOutput: the parserOutput (object) that corresponds to the page
$text: the text that will be displayed, in HTML (string)
+'OutputPageBodyAttributes': called when OutputPage::headElement is creating the body
+tag to allow for extensions to add attributes to the body of the page they might
+need. Or to allow building extensions to add body classes that aren't of high
+enough demand to be included in core.
+$out: The OutputPage which called the hook, can be used to get the real title
+$sk: The Skin that called OutputPage::headElement
+&$bodyAttrs: An array of attributes for the body tag passed to Html::openElement
+
'OutputPageCheckLastModified': when checking if the page has been modified
since the last visit
&$modifiedTimes: array of timestamps.
@@ -1274,13 +1359,23 @@ $errorMsg: an html message string of an error
$article: the page the form is shown for
$out: OutputPage object
+'ResourceLoaderRegisterModules': Right before modules information is required, such as when responding to a resource
+loader request or generating HTML output.
+&$resourceLoader: ResourceLoader object
+
'RawPageViewBeforeOutput': Right before the text is blown out in action=raw
&$obj: RawPage object
&$text: The text that's going to be the output
-'RecentChange_save': called at the end of RecenChange::save()
+'RecentChange_save': called at the end of RecentChange::save()
$recentChange: RecentChange object
+'ResourceLoaderGetConfigVars': called at the end of
+ResourceLoaderStartUpModule::getConfig(). Use this to export static
+configuration variables to JavaScript. Things that depend on the current
+page/request state must be added through MakeGlobalVariablesScript instead.
+&$vars: array( variable name => value )
+
'RevisionInsertComplete': called after a revision is inserted into the DB
&$revision: the Revision
$data: the data stored in old_text. The meaning depends on $flags: if external
@@ -1319,6 +1414,16 @@ $query : Original query.
'SetupAfterCache': Called in Setup.php, after cache objects are set
+'SetupUserMessageArticle': Called in User::leaveUserMessage() before
+anything has been posted to the article.
+$user: The user who we left the message for.
+&$article: The article that will be posted to.
+$subject: The subject of the message
+$text: The text of the message.
+$signature: The signature we used.
+$summary: The edit summary.
+$editor: The editor that performed the edit.
+
'ShowMissingArticle': Called when generating the output for a non-existent page
$article: The article object corresponding to the page
@@ -1351,6 +1456,7 @@ Append to $text to add additional text/scripts after the stock bottom scripts.
'SkinAfterContent': Allows extensions to add text after the page content and
article metadata.
&$data: (string) Text to be printed out directly (without parsing)
+$skin: Skin object
This hook should work in all skins. Just set the &$data variable to the text
you're going to add.
@@ -1364,10 +1470,16 @@ $title: displayed page title
$type: 'normal' or 'history' for old/diff views
&$msg: overridable message; usually 'copyright' or 'history_copyright'. This message must be in HTML format, not wikitext!
&$link: overridable HTML link to be passed into the message as $1
+&$forContent: overridable flag if copyright footer is shown in content language.
-'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle()
+'SkinGetPoweredBy'
+&$text: additional 'powered by' icons in HTML.
+Note: Modern skin does not use the MediaWiki icon but plain text instead
$skin: Skin object
+
+'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle()
&$subpages: Subpage links HTML
+$skin: Skin object
If false is returned $subpages will be used instead of the HTML
subPageSubtitle() generates.
If true is returned, $subpages will be ignored and the rest of
@@ -1388,7 +1500,10 @@ $nav_urls: array of tabs
[See http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/examples/Content_action.php
for an example]
-'SkinTemplateNavigation': Alter the structured navigation links in SkinTemplates
+Alter the structured navigation links in SkinTemplates, there are three of these hooks called in different spots.
+'SkinTemplateNavigation': Called on content pages before variants have been added
+'SkinTemplateNavigation::SpecialPage': Called on special pages before variands have been added
+'SkinTemplateNavigation::Universal': Called on both content and special pages after variants have been added
&$sktemplate: SkinTemplate object
&$links: Structured navigation links
This is used to alter the navigation for skins which use buildNavigationUrls such as Vector.
@@ -1464,6 +1579,11 @@ $movePage: MovePageForm object
$oldTitle: old title (object)
$newTitle: new title (object)
+'SpecialNewpagesConditions': called when building sql query for Special:NewPages
+&$special: NewPagesPager object (subclass of ReverseChronologicalPager)
+$opts: FormOptions object containing special page options
+&$conds: array of WHERE conditionals for query
+
'SpecialPage_initList': called when setting up SpecialPage::$mList, use this
hook to remove a core special page
$list: list (array) of core special pages
@@ -1483,16 +1603,21 @@ SpecialRecentChanges
$opts: FormOptions for this request
'SpecialRecentChangesQuery': called when building sql query for
-SpecialRecentChanges
+SpecialRecentChanges and SpecialRecentChangesLinked
&$conds: array of WHERE conditionals for query
&$tables: array of tables to be queried
&$join_conds: join conditions for the tables
$opts: FormOptions for this request
&$query_options: array of options for the database request
+&$select: String '*' or array of columns to select
+
+'SpecialSearchGo': called when user clicked the "Go"
+&$title: title object generated from the text entered by the user
+&$term: the search term entered by the user
'SpecialSearchNogomatch': called when user clicked the "Go" button but the
target doesn't exist
-$title: title object generated from the text entred by the user
+&$title: title object generated from the text entered by the user
'SpecialSearchProfiles': allows modification of search profiles
&$profiles: profiles, which can be modified.
@@ -1569,10 +1694,13 @@ You might set the member-variables $uploadFormTextTop and
$uploadFormTextAfterSummary to inject text (HTML) either before
or after the editform.
-'UploadForm:BeforeProcessing': DEPRECATED! at the beginning of processUpload()
+'UploadForm:BeforeProcessing': at the beginning of processUpload()
$form: UploadForm object
Lets you poke at member variables like $mUploadDescription before the
file is saved.
+Do not use this hook to break upload processing. This will return the user to
+a blank form with no error message; use UploadVerification and
+UploadVerifyFile instead
'UploadCreateFromRequest': when UploadBase::createFromRequest has been called
$type: (string) the requested upload type
@@ -1589,7 +1717,8 @@ $descriptor: (array) the HTMLForm descriptor
added to the descriptor
$descriptor: (array) the HTMLForm descriptor
-'UploadVerification': additional chances to reject an uploaded file
+'UploadVerification': additional chances to reject an uploaded file. Consider
+ using UploadVerifyFile instead.
string $saveName: destination file name
string $tempName: filesystem path to the temporary file for checks
string &$error: output: message key for message to show if upload canceled
@@ -1597,6 +1726,16 @@ string &$error: output: message key for message to show if upload canceled
is the message key and the remaining elements are used as parameters to
the message.
+'UploadVerifyFile': extra file verification, based on mime type, etc. Preferred
+ in most cases over UploadVerification.
+object $upload: an instance of UploadBase, with all info about the upload
+string $mime: the uploaded file's mime type, as detected by MediaWiki. Handlers
+ will typically only apply for specific mime types.
+object &$error: output: true if the file is valid. Otherwise, an indexed array
+ representing the problem with the file, where the first element
+ is the message key and the remaining elements are used as parameters to
+ the message.
+
'UploadComplete': Upon completion of a file upload
$uploadBase: UploadBase (or subclass) object. File can be accessed by
$uploadBase->getLocalFile().
@@ -1762,10 +1901,6 @@ $user: User object
&$timestamp: new timestamp, change this to override local email
authentification timestamp
-'UserToggles': called when initialising User::$mToggles, use this to add
-new toggles
-$toggles: array of toggles to add
-
'WantedPages::getSQL': called in WantedPagesPage::getSQL(), can be used to
alter the SQL query which gets the list of wanted pages
&$wantedPages: WantedPagesPage object
@@ -1779,6 +1914,13 @@ $article: article object to be watched
$user: user that watched
$article: article object watched
+'WatchlistEditorBuildRemoveLine': when building remove lines in
+ Special:Watchlist/edit
+&$tools: array of extra links
+$title: Title object
+$redirect: whether the page is a redirect
+$skin: Skin object
+
'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
dumps
One, and only one hook should set this, and return false.
diff --git a/docs/maintenance.txt b/docs/maintenance.txt
index 039c71c5..988ff280 100644
--- a/docs/maintenance.txt
+++ b/docs/maintenance.txt
@@ -47,7 +47,7 @@ class DemoMaint extends Maintenance {
}
$maintClass = "DemoMaint";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
==END==
diff --git a/docs/memcached.txt b/docs/memcached.txt
index da6add66..d8863c91 100644
--- a/docs/memcached.txt
+++ b/docs/memcached.txt
@@ -153,16 +153,20 @@ Newtalk:
Parser Cache:
stored in: $parserMemc
controlled by: $wgEnableParserCache
- key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash$edit
+ key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
$pageid: id of the page
$renderkey: 1 if action=render, 0 otherwise
- $hash: hash of user options, see User::getPageRenderingHash()
- $edit: '!edit=0' if the user can't edit the page, '' otherwise
+ $hash: hash of user options applied to the page, see ParserOptions::optionsHash()
ex: wikidb:pcache:idhash:1-0!1!0!!en!2
stores: ParserOutput object
- modified by: Article::editUpdates()
- expriy: $wgParserCacheExpireTime or one hour if it contains specific magic
- words
+ modified by: Article::editUpdates() or Article::getOutputFromWikitext()
+ expiry: $wgParserCacheExpireTime or less if it contains short lived functions
+
+ key: $wgDBname:pcache:idoptions:$pageid
+ stores: CacheTime object with an additional list of used options for the hash,
+ serves as ParserCache pointer.
+ modified by: ParserCache::save()
+ expiry: The same as the ParserCache entry it points to.
Ping limiter:
controlled by: $wgRateLimits
diff --git a/docs/scripts.txt b/docs/scripts.txt
index 2027d176..4af2a2b4 100644
--- a/docs/scripts.txt
+++ b/docs/scripts.txt
@@ -20,6 +20,9 @@ Primary scripts:
Script that only serve images to logged in users. To configure the wiki
to use that script, see http://www.mediawiki.org/wiki/Manual:Image_Authorisation.
+ load.php
+ Used by ResourceLoader to serve minified, concatenated and gzipped CSS and JS.
+
opensearch_desc.php
Returns a OpenSearch description document (see http://www.opensearch.org/)
that points to the search engines of the wiki.
@@ -58,5 +61,5 @@ There is also a file with a .php5 extension for each script. They can be used if
the web server needs a .php5 to run the file with the PHP 5 engine and runs .php
scripts with PHP 4. To use these files, you have to modify $wgScriptExtension to
'.php5' is LocalSettings.php but it is already done by the config script if you
-used the config/index.php5 script.
+used mw-config/index.php5 for installation.
diff --git a/docs/skin.txt b/docs/skin.txt
index a42369ce..bbe6fec5 100644
--- a/docs/skin.txt
+++ b/docs/skin.txt
@@ -1,8 +1,9 @@
skin.txt
-MediaWiki's default skin is called Monobook, after the black-and-white photo of
-a book, in the page background. This skin has been the default since MediaWiki
-1.3 (2004). It is used on Wikipedia, and is popular on other sites.
+MediaWiki's default skin is called Vector. This has been the case since
+the 1.17 release (2011). This replaces the popular skin, Monobook which
+had been been the default since MediaWiki 1.3 (2004). It is now the
+default skin on Wikimedia Projects.
There are three legacy skins which were introduced before MediaWiki 1.3:
@@ -15,6 +16,11 @@ http://nostalgia.wikipedia.org/
* Cologne Blue: A nicer-looking alternative to Standard.
+The other skin that is widely used (and is the MediaWiki default before 1.17)
+is Monobook.
+
+* Monobook: Named after the black-and-white photo of a book, in the page background.
+This was introduced in the 2004 release of 1.3
And there are four Monobook-derived skins which have been introduced since 1.3:
@@ -29,7 +35,6 @@ top bar.
* Modern: An attractive blue/grey theme with sidebar and top bar.
-
== Custom CSS/JS ==
It is possible to customise the site CSS and JavaScript without editing any
diff --git a/extensions/README b/extensions/README
index 85f4943b..0437af69 100644
--- a/extensions/README
+++ b/extensions/README
@@ -12,3 +12,16 @@ The extensions are available through svn at:
You can find documentation and additional extensions on MediaWiki website:
http://www.mediawiki.org/wiki/Category:Extensions
+
+
+Please note that under POSIX systems (Linux...), parent of a symbolic path
+refers to the link source, NOT to the target! You should check the env
+variable MW_INSTALL_PATH in case the extension is not in the default location.
+
+The following code snippet let you override the default path:
+
+ $IP = getenv( 'MW_INSTALL_PATH' );
+ if( $IP === false ) {
+ $IP = dirname( __FILE__ ) . '/../..';
+ }
+ require( "$IP/maintenance/Maintenance.php" ); // a MediaWiki core file
diff --git a/img_auth.php b/img_auth.php
index 0fe239ba..1daba85f 100644
--- a/img_auth.php
+++ b/img_auth.php
@@ -37,19 +37,29 @@ if ( $wgImgAuthPublicTest
wfForbidden('img-auth-accessdenied','img-auth-public');
}
+// Extract path and image information
+if( !isset( $_SERVER['PATH_INFO'] ) ) {
+ $path = $wgRequest->getText( 'path' );
+ if( !$path ) {
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-nopathinfo' );
+ }
+ $path = "/$path";
+} else {
+ $path = $_SERVER['PATH_INFO'];
+}
+
// Check for bug 28235: QUERY_STRING overriding the correct extension
-if ( isset( $_SERVER['QUERY_STRING'] )
- && preg_match( '/\.[^\\/:*?"<>|%]+(#|\?|$)/i', $_SERVER['QUERY_STRING'] ) )
+$dotPos = strpos( $path, '.' );
+$whitelist = array();
+if ( $dotPos !== false ) {
+ $whitelist[] = substr( $path, $dotPos + 1 );
+}
+if ( !$wgRequest->checkUrlExtension( $whitelist ) )
{
- wfForbidden( 'img-auth-accessdenied', 'img-auth-bad-query-string' );
+ return;
}
-// Extract path and image information
-if( !isset( $_SERVER['PATH_INFO'] ) )
- wfForbidden('img-auth-accessdenied','img-auth-nopathinfo');
-
-$path = $_SERVER['PATH_INFO'];
-$filename = realpath( $wgUploadDirectory . $_SERVER['PATH_INFO'] );
+$filename = realpath( $wgUploadDirectory . $path );
$realUpload = realpath( $wgUploadDirectory );
// Basic directory traversal check
diff --git a/includes/AjaxDispatcher.php b/includes/AjaxDispatcher.php
index 5bd7cfa4..e36787fd 100644
--- a/includes/AjaxDispatcher.php
+++ b/includes/AjaxDispatcher.php
@@ -42,31 +42,27 @@ class AjaxDispatcher {
}
switch( $this->mode ) {
-
- case 'get':
- $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
- if ( ! empty( $_GET["rsargs"] ) ) {
- $this->args = $_GET["rsargs"];
- } else {
- $this->args = array();
- }
- break;
-
- case 'post':
- $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
- if ( ! empty( $_POST["rsargs"] ) ) {
- $this->args = $_POST["rsargs"];
- } else {
- $this->args = array();
- }
- break;
-
- default:
- wfProfileOut( __METHOD__ );
- return;
- # Or we could throw an exception:
- # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
-
+ case 'get':
+ $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
+ if ( ! empty( $_GET["rsargs"] ) ) {
+ $this->args = $_GET["rsargs"];
+ } else {
+ $this->args = array();
+ }
+ break;
+ case 'post':
+ $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
+ if ( ! empty( $_POST["rsargs"] ) ) {
+ $this->args = $_POST["rsargs"];
+ } else {
+ $this->args = array();
+ }
+ break;
+ default:
+ wfProfileOut( __METHOD__ );
+ return;
+ # Or we could throw an exception:
+ # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
}
wfProfileOut( __METHOD__ );
@@ -89,8 +85,11 @@ class AjaxDispatcher {
if ( ! in_array( $this->func_name, $wgAjaxExportList ) ) {
wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
- wfHttpError( 400, 'Bad Request',
- "unknown function " . (string) $this->func_name );
+ wfHttpError(
+ 400,
+ 'Bad Request',
+ "unknown function " . (string) $this->func_name
+ );
} else {
wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
@@ -99,6 +98,7 @@ class AjaxDispatcher {
} else {
$func = $this->func_name;
}
+
try {
$result = call_user_func_array( $func, $this->args );
@@ -109,8 +109,7 @@ class AjaxDispatcher {
wfHttpError( 500, 'Internal Error',
"{$this->func_name} returned no data" );
- }
- else {
+ } else {
if ( is_string( $result ) ) {
$result = new AjaxResponse( $result );
}
@@ -120,7 +119,6 @@ class AjaxDispatcher {
wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name . "\n" );
}
-
} catch ( Exception $e ) {
wfDebug( __METHOD__ . ' ERROR while dispatching '
. $this->func_name . "(" . var_export( $this->args, true ) . "): "
@@ -135,7 +133,7 @@ class AjaxDispatcher {
}
}
- wfProfileOut( __METHOD__ );
$wgOut = null;
+ wfProfileOut( __METHOD__ );
}
}
diff --git a/includes/AjaxFunctions.php b/includes/AjaxFunctions.php
index e3180e0a..8e5de31b 100644
--- a/includes/AjaxFunctions.php
+++ b/includes/AjaxFunctions.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Handler functions for Ajax requests
+ *
* @file
* @ingroup Ajax
*/
@@ -28,6 +30,7 @@ function js_unescape( $source, $iconv_to = 'UTF-8' ) {
if ( $charAt == '%' ) {
$pos++;
$charAt = substr ( $source, $pos, 1 );
+
if ( $charAt == 'u' ) {
// we got a unicode character
$pos++;
@@ -48,7 +51,7 @@ function js_unescape( $source, $iconv_to = 'UTF-8' ) {
}
if ( $iconv_to != "UTF-8" ) {
- $decodedStr = iconv( "UTF-8", $iconv_to, $decodedStr );
+ $decodedStr = iconv( "utf-8", $iconv_to, $decodedStr );
}
return $decodedStr;
@@ -62,84 +65,23 @@ function js_unescape( $source, $iconv_to = 'UTF-8' ) {
* @return utf8char
*/
function code2utf( $num ) {
- if ( $num < 128 )
+ if ( $num < 128 ) {
return chr( $num );
- if ( $num < 2048 )
- return chr( ( $num >> 6 ) + 192 ) . chr( ( $num&63 ) + 128 );
- if ( $num < 65536 )
- return chr( ( $num >> 12 ) + 224 ) . chr( ( ( $num >> 6 )&63 ) + 128 ) . chr( ( $num&63 ) + 128 );
- if ( $num < 2097152 )
- return chr( ( $num >> 18 ) + 240 ) . chr( ( ( $num >> 12 )&63 ) + 128 ) . chr( ( ( $num >> 6 )&63 ) + 128 ) . chr( ( $num&63 ) + 128 );
- return '';
-}
-
-/**
- * Called for AJAX watch/unwatch requests.
- * @param $pagename Prefixed title string for page to watch/unwatch
- * @param $watch String 'w' to watch, 'u' to unwatch
- * @return String '<w#>' or '<u#>' on successful watch or unwatch,
- * respectively, followed by an HTML message to display in the alert box; or
- * '<err#>' on error
- */
-function wfAjaxWatch( $pagename = "", $watch = "" ) {
- if ( wfReadOnly() ) {
- // redirect to action=(un)watch, which will display the database lock
- // message
- return '<err#>';
}
- if ( 'w' !== $watch && 'u' !== $watch ) {
- return '<err#>';
+ if ( $num < 2048 ) {
+ return chr( ( $num >> 6 ) + 192 ) . chr( ( $num&63 ) + 128 );
}
- $watch = 'w' === $watch;
- $title = Title::newFromDBkey( $pagename );
- if ( !$title ) {
- // Invalid title
- return '<err#>';
+ if ( $num < 65536 ) {
+ return chr( ( $num >> 12 ) + 224 ) . chr( ( ( $num >> 6 )&63 ) + 128 ) . chr( ( $num&63 ) + 128 );
}
- $article = new Article( $title );
- $watching = $title->userIsWatching();
- if ( $watch ) {
- if ( !$watching ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
- $ok = $article->doWatch();
- $dbw->commit();
- }
- } else {
- if ( $watching ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
- $ok = $article->doUnwatch();
- $dbw->commit();
- }
- }
- // Something stopped the change
- if ( isset( $ok ) && !$ok ) {
- return '<err#>';
- }
- if ( $watch ) {
- return '<w#>' . wfMsgExt( 'addedwatchtext', array( 'parse' ), $title->getPrefixedText() );
- } else {
- return '<u#>' . wfMsgExt( 'removedwatchtext', array( 'parse' ), $title->getPrefixedText() );
+ if ( $num < 2097152 ) {
+ return chr( ( $num >> 18 ) + 240 ) . chr( ( ( $num >> 12 )&63 ) + 128 ) . chr( ( ( $num >> 6 )&63 ) + 128 ) . chr( ( $num&63 ) + 128 );
}
-}
-
-/**
- * Called in some places (currently just extensions)
- * to get the thumbnail URL for a given file at a given resolution.
- */
-function wfAjaxGetThumbnailUrl( $file, $width, $height ) {
- $file = wfFindFile( $file );
-
- if ( !$file || !$file->exists() )
- return null;
-
- $url = $file->getThumbnail( $width, $height )->url;
- return $url;
+ return '';
}
/**
@@ -149,8 +91,9 @@ function wfAjaxGetThumbnailUrl( $file, $width, $height ) {
function wfAjaxGetFileUrl( $file ) {
$file = wfFindFile( $file );
- if ( !$file || !$file->exists() )
+ if ( !$file || !$file->exists() ) {
return null;
+ }
$url = $file->getUrl();
diff --git a/includes/AjaxResponse.php b/includes/AjaxResponse.php
index f7495666..014798f8 100644
--- a/includes/AjaxResponse.php
+++ b/includes/AjaxResponse.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Response handler for Ajax requests
+ *
* @file
* @ingroup Ajax
*/
@@ -15,7 +17,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
* @ingroup Ajax
*/
class AjaxResponse {
-
/** Number of seconds to get the response cached by a proxy */
private $mCacheDuration;
@@ -99,19 +100,16 @@ class AjaxResponse {
if ( $this->mLastModified ) {
header ( "Last-Modified: " . $this->mLastModified );
- }
- else {
+ } else {
header ( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
}
if ( $this->mCacheDuration ) {
-
# If squid caches are configured, tell them to cache the response,
# and tell the client to always check with the squid. Otherwise,
# tell the client to use a cached copy, without a way to purge it.
if ( $wgUseSquid ) {
-
# Expect explicite purge of the proxy cache, but require end user agents
# to revalidate against the proxy on each visit.
# Surrogate-Control controls our Squid, Cache-Control downstream caches
@@ -127,7 +125,7 @@ class AjaxResponse {
# Let the client do the caching. Cache is not purged.
header ( "Expires: " . gmdate( "D, d M Y H:i:s", time() + $this->mCacheDuration ) . " GMT" );
- header ( "Cache-Control: s-max-age={$this->mCacheDuration},public,max-age={$this->mCacheDuration}" );
+ header ( "Cache-Control: s-maxage={$this->mCacheDuration},public,max-age={$this->mCacheDuration}" );
}
} else {
@@ -156,10 +154,12 @@ class AjaxResponse {
wfDebug( "$fname: CACHE DISABLED, NO TIMESTAMP\n" );
return;
}
+
if ( !$wgCachePages ) {
wfDebug( "$fname: CACHE DISABLED\n", false );
return;
}
+
if ( $wgUser->getOption( 'nocache' ) ) {
wfDebug( "$fname: USER DISABLED CACHE\n", false );
return;
@@ -177,6 +177,7 @@ class AjaxResponse {
$ismodsince = wfTimestamp( TS_MW, $modsinceTime ? $modsinceTime : 1 );
wfDebug( "$fname: -- client send If-Modified-Since: " . $modsince . "\n", false );
wfDebug( "$fname: -- we might send Last-Modified : $lastmod\n", false );
+
if ( ( $ismodsince >= $timestamp ) && $wgUser->validateCache( $ismodsince ) && $ismodsince >= $wgCacheEpoch ) {
ini_set( 'zlib.output_compression', 0 );
$this->setResponseCode( "304 Not Modified" );
@@ -198,7 +199,10 @@ class AjaxResponse {
function loadFromMemcached( $mckey, $touched ) {
global $wgMemc;
- if ( !$touched ) return false;
+
+ if ( !$touched ) {
+ return false;
+ }
$mcvalue = $wgMemc->get( $mckey );
if ( $mcvalue ) {
@@ -206,6 +210,7 @@ class AjaxResponse {
if ( $touched <= $mcvalue['timestamp'] ) {
wfDebug( "Got $mckey from cache\n" );
$this->mText = $mcvalue['value'];
+
return true;
} else {
wfDebug( "$mckey has expired\n" );
diff --git a/includes/Article.php b/includes/Article.php
index 5edfc10d..3e8cfd5e 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -11,6 +11,7 @@
* Note: edit user interface and cache support functions have been
* moved to separate EditPage and HTMLFileCache classes.
*
+ * @internal documentation reviewed 15 Mar 2010
*/
class Article {
/**@{{
@@ -33,15 +34,15 @@ class Article {
var $mRedirectTarget = null; // !< Title object if set
var $mRedirectUrl = false; // !<
var $mRevIdFetched = 0; // !<
- var $mRevision; // !<
+ var $mRevision; // !< Revision object if set
var $mTimestamp = ''; // !<
- var $mTitle; // !<
+ var $mTitle; // !< Title object
var $mTotalAdjustment = 0; // !<
var $mTouched = '19700101000000'; // !<
var $mUser = -1; // !< Not loaded
- var $mUserText = ''; // !<
- var $mParserOptions; // !<
- var $mParserOutput; // !<
+ var $mUserText = ''; // !< username from Revision if set
+ var $mParserOptions; // !< ParserOptions object
+ var $mParserOutput; // !< ParserCache object if set
/**@}}*/
/**
@@ -50,12 +51,13 @@ class Article {
* @param $oldId Integer revision ID, null to fetch from request, zero for current
*/
public function __construct( Title $title, $oldId = null ) {
+ // FIXME: does the reference play any role here?
$this->mTitle =& $title;
$this->mOldId = $oldId;
}
/**
- * Constructor from an article article
+ * Constructor from an page id
* @param $id The article ID to load
*/
public static function newFromID( $id ) {
@@ -70,7 +72,7 @@ class Article {
* from another page on the wiki.
* @param $from Title object.
*/
- public function setRedirectedFrom( $from ) {
+ public function setRedirectedFrom( Title $from ) {
$this->mRedirectedFrom = $from;
}
@@ -82,20 +84,29 @@ class Article {
* @return mixed Title object, or null if this page is not a redirect
*/
public function getRedirectTarget() {
- if ( !$this->mTitle || !$this->mTitle->isRedirect() )
+ if ( !$this->mTitle->isRedirect() ) {
return null;
- if ( !is_null( $this->mRedirectTarget ) )
+ }
+
+ if ( $this->mRedirectTarget !== null ) {
return $this->mRedirectTarget;
+ }
+
# Query the redirect table
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'redirect',
- array( 'rd_namespace', 'rd_title' ),
+ array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
array( 'rd_from' => $this->getID() ),
__METHOD__
);
- if ( $row ) {
- return $this->mRedirectTarget = Title::makeTitle( $row->rd_namespace, $row->rd_title );
+
+ // rd_fragment and rd_interwiki were added later, populate them if empty
+ if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
+ return $this->mRedirectTarget = Title::makeTitle(
+ $row->rd_namespace, $row->rd_title,
+ $row->rd_fragment, $row->rd_interwiki );
}
+
# This page doesn't have an entry in the redirect table
return $this->mRedirectTarget = $this->insertRedirect();
}
@@ -104,43 +115,66 @@ class Article {
* Insert an entry for this page into the redirect table.
*
* Don't call this function directly unless you know what you're doing.
- * @return Title object
+ * @return Title object or null if not a redirect
*/
public function insertRedirect() {
- $retval = Title::newFromRedirect( $this->getContent() );
+ // recurse through to only get the final target
+ $retval = Title::newFromRedirectRecurse( $this->getContent() );
if ( !$retval ) {
return null;
}
+ $this->insertRedirectEntry( $retval );
+ return $retval;
+ }
+
+ /**
+ * Insert or update the redirect table entry for this page to indicate
+ * it redirects to $rt .
+ * @param $rt Title redirect target
+ */
+ public function insertRedirectEntry( $rt ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->replace( 'redirect', array( 'rd_from' ),
array(
'rd_from' => $this->getID(),
- 'rd_namespace' => $retval->getNamespace(),
- 'rd_title' => $retval->getDBkey()
+ 'rd_namespace' => $rt->getNamespace(),
+ 'rd_title' => $rt->getDBkey(),
+ 'rd_fragment' => $rt->getFragment(),
+ 'rd_interwiki' => $rt->getInterwiki(),
),
__METHOD__
);
- return $retval;
}
/**
- * Get the Title object this page redirects to
+ * Get the Title object or URL this page redirects to
*
* @return mixed false, Title of in-wiki target, or string with URL
*/
public function followRedirect() {
- $text = $this->getContent();
- return $this->followRedirectText( $text );
+ return $this->getRedirectURL( $this->getRedirectTarget() );
}
/**
* Get the Title object this text redirects to
*
+ * @param $text string article content containing redirect info
* @return mixed false, Title of in-wiki target, or string with URL
+ * @deprecated
*/
public function followRedirectText( $text ) {
- $rt = Title::newFromRedirectRecurse( $text ); // recurse through to only get the final target
- # process if title object is valid and not special:userlogout
+ // recurse through to only get the final target
+ return $this->getRedirectURL( Title::newFromRedirectRecurse( $text ) );
+ }
+
+ /**
+ * Get the Title object or URL to use for a redirect. We use Title
+ * objects for same-wiki, non-special redirects and URLs for everything
+ * else.
+ * @param $rt Title Redirect target
+ * @return mixed false, Title object of local target, or string with URL
+ */
+ public function getRedirectURL( $rt ) {
if ( $rt ) {
if ( $rt->getInterwiki() != '' ) {
if ( $rt->isLocal() ) {
@@ -164,15 +198,18 @@ class Article {
return $rt->getFullURL();
}
}
+
return $rt;
}
}
+
// No or invalid redirect
return false;
}
/**
- * get the title object of the article
+ * Get the title object of the article
+ * @return Title object of this page
*/
public function getTitle() {
return $this->mTitle;
@@ -180,6 +217,7 @@ class Article {
/**
* Clear the object
+ * FIXME: shouldn't this be public?
* @private
*/
public function clear() {
@@ -204,31 +242,38 @@ class Article {
/**
* Note that getContent/loadContent do not follow redirects anymore.
* If you need to fetch redirectable content easily, try
- * the shortcut in Article::followContent()
+ * the shortcut in Article::followRedirect()
+ *
+ * This function has side effects! Do not use this function if you
+ * only want the real revision text if any.
*
* @return Return the text of this revision
*/
public function getContent() {
- global $wgUser, $wgContLang, $wgOut, $wgMessageCache;
+ global $wgUser, $wgContLang, $wgMessageCache;
+
wfProfileIn( __METHOD__ );
+
if ( $this->getID() === 0 ) {
# If this is a MediaWiki:x message, then load the messages
# and return the message value for x.
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
# If this is a system message, get the default text.
list( $message, $lang ) = $wgMessageCache->figureMessage( $wgContLang->lcfirst( $this->mTitle->getText() ) );
- $wgMessageCache->loadAllMessages( $lang );
$text = wfMsgGetKey( $message, false, $lang, false );
+
if ( wfEmptyMsg( $message, $text ) )
$text = '';
} else {
$text = wfMsgExt( $wgUser->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
}
wfProfileOut( __METHOD__ );
+
return $text;
} else {
$this->loadContent();
wfProfileOut( __METHOD__ );
+
return $this->mContent;
}
}
@@ -243,8 +288,10 @@ class Article {
if ( $this->mContentLoaded && $this->mOldId == 0 ) {
return $this->mContent;
}
+
$rev = Revision::newFromTitle( $this->mTitle );
$text = $rev ? $rev->getRawText() : false;
+
return $text;
}
@@ -274,16 +321,25 @@ class Article {
* @return mixed string on success, false on failure
*/
public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+ $currentRev = Revision::newFromTitle( $this->mTitle );
+ if ( !$currentRev ) {
+ return false; // no page
+ }
$undo_text = $undo->getText();
$undoafter_text = $undoafter->getText();
- $cur_text = $this->getContent();
+ $cur_text = $currentRev->getText();
+
if ( $cur_text == $undo_text ) {
# No use doing a merge if it's just a straight revert.
return $undoafter_text;
}
+
$undone_text = '';
- if ( !wfMerge( $undo_text, $undoafter_text, $cur_text, $undone_text ) )
+
+ if ( !wfMerge( $undo_text, $undoafter_text, $cur_text, $undone_text ) ) {
return false;
+ }
+
return $undone_text;
}
@@ -295,6 +351,7 @@ class Article {
if ( is_null( $this->mOldId ) ) {
$this->mOldId = $this->getOldIDFromRequest();
}
+
return $this->mOldId;
}
@@ -305,13 +362,16 @@ class Article {
*/
public function getOldIDFromRequest() {
global $wgRequest;
+
$this->mRedirectUrl = false;
+
$oldid = $wgRequest->getVal( 'oldid' );
+
if ( isset( $oldid ) ) {
$oldid = intval( $oldid );
if ( $wgRequest->getVal( 'direction' ) == 'next' ) {
$nextid = $this->mTitle->getNextRevisionID( $oldid );
- if ( $nextid ) {
+ if ( $nextid ) {
$oldid = $nextid;
} else {
$this->mRedirectUrl = $this->mTitle->getFullURL( 'redirect=no' );
@@ -323,9 +383,11 @@ class Article {
}
}
}
+
if ( !$oldid ) {
$oldid = 0;
}
+
return $oldid;
}
@@ -333,22 +395,24 @@ class Article {
* Load the revision (including text) into this object
*/
function loadContent() {
- if ( $this->mContentLoaded ) return;
+ if ( $this->mContentLoaded ) {
+ return;
+ }
+
wfProfileIn( __METHOD__ );
- # Query variables :P
+
$oldid = $this->getOldID();
- # Pre-fill content with error message so that if something
- # fails we'll have something telling us what we intended.
$this->mOldId = $oldid;
$this->fetchContent( $oldid );
+
wfProfileOut( __METHOD__ );
}
-
/**
* Fetch a page record with the given conditions
* @param $dbr Database object
* @param $conditions Array
+ * @return mixed Database result resource, or false on failure
*/
protected function pageData( $dbr, $conditions ) {
$fields = array(
@@ -364,20 +428,23 @@ class Article {
'page_latest',
'page_len',
);
+
wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
- $row = $dbr->selectRow(
- 'page',
- $fields,
- $conditions,
- __METHOD__
- );
+
+ $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__ );
+
wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
- return $row ;
+
+ return $row;
}
/**
+ * Fetch a page record matching the Title object's namespace and title
+ * using a sanitized title string
+ *
* @param $dbr Database object
* @param $title Title object
+ * @return mixed Database result resource, or false on failure
*/
public function pageDataFromTitle( $dbr, $title ) {
return $this->pageData( $dbr, array(
@@ -386,6 +453,8 @@ class Article {
}
/**
+ * Fetch a page record matching the requested ID
+ *
* @param $dbr Database
* @param $id Integer
*/
@@ -406,8 +475,9 @@ class Article {
}
$lc = LinkCache::singleton();
+
if ( $data ) {
- $lc->addGoodLinkObj( $data->page_id, $this->mTitle, $data->page_len, $data->page_is_redirect );
+ $lc->addGoodLinkObj( $data->page_id, $this->mTitle, $data->page_len, $data->page_is_redirect, $data->page_latest );
$this->mTitle->mArticleID = intval( $data->page_id );
@@ -419,20 +489,19 @@ class Article {
$this->mIsRedirect = intval( $data->page_is_redirect );
$this->mLatest = intval( $data->page_latest );
} else {
- if ( is_object( $this->mTitle ) ) {
- $lc->addBadLinkObj( $this->mTitle );
- }
+ $lc->addBadLinkObj( $this->mTitle );
$this->mTitle->mArticleID = 0;
}
- $this->mDataLoaded = true;
+ $this->mDataLoaded = true;
}
/**
* Get text of an article from database
* Does *NOT* follow redirects.
+ *
* @param $oldid Int: 0 for whatever the latest revision is
- * @return string
+ * @return mixed string containing article contents, or false if null
*/
function fetchContent( $oldid = 0 ) {
if ( $this->mContentLoaded ) {
@@ -449,28 +518,33 @@ class Article {
if ( $oldid ) {
$revision = Revision::newFromId( $oldid );
- if ( is_null( $revision ) ) {
+ if ( $revision === null ) {
wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
return false;
}
+
$data = $this->pageDataFromId( $dbr, $revision->getPage() );
+
if ( !$data ) {
wfDebug( __METHOD__ . " failed to get page data linked to revision id $oldid\n" );
return false;
}
+
$this->mTitle = Title::makeTitle( $data->page_namespace, $data->page_title );
$this->loadPageData( $data );
} else {
if ( !$this->mDataLoaded ) {
$data = $this->pageDataFromTitle( $dbr, $this->mTitle );
+
if ( !$data ) {
wfDebug( __METHOD__ . " failed to find page data for title " . $this->mTitle->getPrefixedText() . "\n" );
return false;
}
+
$this->loadPageData( $data );
}
$revision = Revision::newFromId( $this->mLatest );
- if ( is_null( $revision ) ) {
+ if ( $revision === null ) {
wfDebug( __METHOD__ . " failed to retrieve current page, rev_id {$this->mLatest}\n" );
return false;
}
@@ -489,7 +563,7 @@ class Article {
$this->mContentLoaded = true;
$this->mRevision =& $revision;
- wfRunHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) ) ;
+ wfRunHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
return $this->mContent;
}
@@ -498,23 +572,13 @@ class Article {
* Read/write accessor to select FOR UPDATE
*
* @param $x Mixed: FIXME
+ * @return mixed value of $x, or value stored in Article::mForUpdate
*/
public function forUpdate( $x = null ) {
return wfSetVar( $this->mForUpdate, $x );
}
/**
- * Get the database which should be used for reads
- *
- * @return Database
- * @deprecated - just call wfGetDB( DB_MASTER ) instead
- */
- function getDB() {
- wfDeprecated( __METHOD__ );
- return wfGetDB( DB_MASTER );
- }
-
- /**
* Get options for all SELECT statements
*
* @param $options Array: an optional options array which'll be appended to
@@ -529,6 +593,7 @@ class Article {
$options = 'FOR UPDATE';
}
}
+
return $options;
}
@@ -536,11 +601,7 @@ class Article {
* @return int Page ID
*/
public function getID() {
- if ( $this->mTitle ) {
- return $this->mTitle->getArticleID();
- } else {
- return 0;
- }
+ return $this->mTitle->getArticleID();
}
/**
@@ -568,6 +629,7 @@ class Article {
public function getCount() {
if ( -1 == $this->mCounter ) {
$id = $this->getID();
+
if ( $id == 0 ) {
$this->mCounter = 0;
} else {
@@ -580,11 +642,12 @@ class Article {
);
}
}
+
return $this->mCounter;
}
/**
- * Determine whether a page would be suitable for being counted as an
+ * Determine whether a page would be suitable for being counted as an
* article in the site_stats table based on the title & its content
*
* @param $text String: text to analyze
@@ -594,13 +657,14 @@ class Article {
global $wgUseCommaCount;
$token = $wgUseCommaCount ? ',' : '[[';
+
return $this->mTitle->isContentPage() && !$this->isRedirect( $text ) && in_string( $token, $text );
}
/**
* Tests if the article text represents a redirect
*
- * @param $text String: FIXME
+ * @param $text mixed string containing article contents, or boolean
* @return bool
*/
public function isRedirect( $text = false ) {
@@ -608,12 +672,14 @@ class Article {
if ( $this->mDataLoaded ) {
return $this->mIsRedirect;
}
+
// Apparently loadPageData was never called
$this->loadContent();
$titleObj = Title::newFromRedirectRecurse( $this->fetchContent() );
} else {
$titleObj = Title::newFromRedirect( $text );
}
+
return $titleObj !== null;
}
@@ -627,6 +693,7 @@ class Article {
if ( $this->getOldID() == 0 ) {
return true;
}
+
return $this->exists() && isset( $this->mRevision ) && $this->mRevision->isCurrent();
}
@@ -635,12 +702,15 @@ class Article {
* This isn't necessary for all uses, so it's only done if needed.
*/
protected function loadLastEdit() {
- if ( -1 != $this->mUser )
+ if ( -1 != $this->mUser ) {
return;
+ }
# New or non-existent articles have no user information
$id = $this->getID();
- if ( 0 == $id ) return;
+ if ( 0 == $id ) {
+ return;
+ }
$this->mLastRevision = Revision::loadFromPageId( wfGetDB( DB_MASTER ), $id );
if ( !is_null( $this->mLastRevision ) ) {
@@ -653,46 +723,71 @@ class Article {
}
}
+ /**
+ * @return string GMT timestamp of last article revision
+ **/
+
public function getTimestamp() {
// Check if the field has been filled by ParserCache::get()
if ( !$this->mTimestamp ) {
$this->loadLastEdit();
}
+
return wfTimestamp( TS_MW, $this->mTimestamp );
}
+ /**
+ * @return int user ID for the user that made the last article revision
+ */
public function getUser() {
$this->loadLastEdit();
return $this->mUser;
}
+ /**
+ * @return string username of the user that made the last article revision
+ */
public function getUserText() {
$this->loadLastEdit();
return $this->mUserText;
}
+ /**
+ * @return string Comment stored for the last article revision
+ */
public function getComment() {
$this->loadLastEdit();
return $this->mComment;
}
+ /**
+ * Returns true if last revision was marked as "minor edit"
+ *
+ * @return boolean Minor edit indicator for the last article revision.
+ */
public function getMinorEdit() {
$this->loadLastEdit();
return $this->mMinorEdit;
}
- /* Use this to fetch the rev ID used on page views */
+ /**
+ * Use this to fetch the rev ID used on page views
+ *
+ * @return int revision ID of last article revision
+ */
public function getRevIdFetched() {
$this->loadLastEdit();
return $this->mRevIdFetched;
}
/**
+ * FIXME: this does what?
* @param $limit Integer: default 0.
* @param $offset Integer: default 0.
+ * @return UserArrayFromResult object with User objects of article contributors for requested range
*/
public function getContributors( $limit = 0, $offset = 0 ) {
- # XXX: this is expensive; cache this info somewhere.
+ # FIXME: this is expensive; cache this info somewhere.
$dbr = wfGetDB( DB_SLAVE );
$revTable = $dbr->tableName( 'revision' );
@@ -701,6 +796,7 @@ class Article {
$pageId = $this->getId();
$user = $this->getUser();
+
if ( $user ) {
$excludeCond = "AND rev_user != $user";
} else {
@@ -718,8 +814,9 @@ class Article {
GROUP BY rev_user, rev_user_text
ORDER BY timestamp DESC";
- if ( $limit > 0 )
+ if ( $limit > 0 ) {
$sql = $dbr->limitResult( $sql, $limit, $offset );
+ }
$sql .= ' ' . $this->getSelectOptions();
$res = $dbr->query( $sql, __METHOD__ );
@@ -732,9 +829,8 @@ class Article {
* page of the given title.
*/
public function view() {
- global $wgUser, $wgOut, $wgRequest, $wgContLang;
- global $wgEnableParserCache, $wgStylePath, $wgParser;
- global $wgUseTrackbacks, $wgUseFileCache;
+ global $wgUser, $wgOut, $wgRequest, $wgParser;
+ global $wgUseFileCache, $wgUseETag;
wfProfileIn( __METHOD__ );
@@ -742,22 +838,26 @@ class Article {
$oldid = $this->getOldID();
$parserCache = ParserCache::singleton();
- $parserOptions = clone $this->getParserOptions();
+ $parserOptions = $this->getParserOptions();
# Render printable version, use printable version cache
if ( $wgOut->isPrintable() ) {
$parserOptions->setIsPrintable( true );
+ $parserOptions->setEditSection( false );
+ } else if ( $wgUseETag && !$this->mTitle->quickUserCan( 'edit' ) ) {
+ $parserOptions->setEditSection( false );
}
# Try client and file cache
if ( $oldid === 0 && $this->checkTouched() ) {
- global $wgUseETag;
if ( $wgUseETag ) {
$wgOut->setETag( $parserCache->getETag( $this, $parserOptions ) );
}
- # Is is client cached?
+
+ # Is it client cached?
if ( $wgOut->checkLastModified( $this->getTouched() ) ) {
wfDebug( __METHOD__ . ": done 304\n" );
wfProfileOut( __METHOD__ );
+
return;
# Try file cache
} else if ( $wgUseFileCache && $this->tryFileCache() ) {
@@ -766,17 +866,17 @@ class Article {
$wgOut->disable();
$this->viewUpdates();
wfProfileOut( __METHOD__ );
+
return;
}
}
- $sk = $wgUser->getSkin();
-
# getOldID may want us to redirect somewhere else
if ( $this->mRedirectUrl ) {
$wgOut->redirect( $this->mRedirectUrl );
wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
wfProfileOut( __METHOD__ );
+
return;
}
@@ -785,20 +885,25 @@ class Article {
$wgOut->setPageTitle( $this->mTitle->getPrefixedText() );
# If we got diff in the query, we want to see a diff page instead of the article.
- if ( !is_null( $wgRequest->getVal( 'diff' ) ) ) {
+ if ( $wgRequest->getCheck( 'diff' ) ) {
wfDebug( __METHOD__ . ": showing diff page\n" );
$this->showDiffPage();
wfProfileOut( __METHOD__ );
+
return;
}
# Allow frames by default
$wgOut->allowClickjacking();
+ if ( !$wgUseETag && !$this->mTitle->quickUserCan( 'edit' ) ) {
+ $parserOptions->setEditSection( false );
+ }
+
# Should the parser cache be used?
$useParserCache = $this->useParserCache( $oldid );
wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
- if ( $wgUser->getOption( 'stubthreshold' ) ) {
+ if ( $wgUser->getStubThreshold() ) {
wfIncrStats( 'pcache_miss_stub' );
}
@@ -810,16 +915,17 @@ class Article {
$pass = 0;
$outputDone = false;
$this->mParserOutput = false;
+
while ( !$outputDone && ++$pass ) {
switch( $pass ) {
case 1:
wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
break;
-
case 2:
# Try the parser cache
if ( $useParserCache ) {
$this->mParserOutput = $parserCache->get( $this, $parserOptions );
+
if ( $this->mParserOutput !== false ) {
wfDebug( __METHOD__ . ": showing parser cache contents\n" );
$wgOut->addParserOutput( $this->mParserOutput );
@@ -830,7 +936,6 @@ class Article {
}
}
break;
-
case 3:
$text = $this->getContent();
if ( $text === false || $this->getID() == 0 ) {
@@ -853,22 +958,22 @@ class Article {
# Are we looking at an old revision
if ( $oldid && !is_null( $this->mRevision ) ) {
$this->setOldSubtitle( $oldid );
+
if ( !$this->showDeletedRevisionHeader() ) {
wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
wfProfileOut( __METHOD__ );
return;
}
+
# If this "old" version is the current, then try the parser cache...
if ( $oldid === $this->getLatest() && $this->useParserCache( false ) ) {
$this->mParserOutput = $parserCache->get( $this, $parserOptions );
if ( $this->mParserOutput ) {
- wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );
+ wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );
$wgOut->addParserOutput( $this->mParserOutput );
$wgOut->setRevisionId( $this->mLatest );
- $this->showViewFooter();
- $this->viewUpdates();
- wfProfileOut( __METHOD__ );
- return;
+ $outputDone = true;
+ break;
}
}
}
@@ -882,36 +987,35 @@ class Article {
wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
$this->showCssOrJsPage();
$outputDone = true;
- } else if ( $rt = Title::newFromRedirectArray( $text ) ) {
- wfDebug( __METHOD__ . ": showing redirect=no page\n" );
- # Viewing a redirect page (e.g. with parameter redirect=no)
- # Don't append the subtitle if this was an old revision
- $wgOut->addHTML( $this->viewRedirect( $rt, !$wasRedirected && $this->isCurrent() ) );
- # Parse just to get categories, displaytitle, etc.
- $this->mParserOutput = $wgParser->parse( $text, $this->mTitle, $parserOptions );
- $wgOut->addParserOutputNoText( $this->mParserOutput );
- $outputDone = true;
+ } else {
+ $rt = Title::newFromRedirectArray( $text );
+ if ( $rt ) {
+ wfDebug( __METHOD__ . ": showing redirect=no page\n" );
+ # Viewing a redirect page (e.g. with parameter redirect=no)
+ # Don't append the subtitle if this was an old revision
+ $wgOut->addHTML( $this->viewRedirect( $rt, !$wasRedirected && $this->isCurrent() ) );
+ # Parse just to get categories, displaytitle, etc.
+ $this->mParserOutput = $wgParser->parse( $text, $this->mTitle, $parserOptions );
+ $wgOut->addParserOutputNoText( $this->mParserOutput );
+ $outputDone = true;
+ }
}
break;
-
case 4:
# Run the parse, protected by a pool counter
wfDebug( __METHOD__ . ": doing uncached parse\n" );
- $key = $parserCache->getKey( $this, $parserOptions );
- $poolCounter = PoolCounter::factory( 'Article::view', $key );
- $dirtyCallback = $useParserCache ? array( $this, 'tryDirtyCache' ) : false;
- $status = $poolCounter->executeProtected( array( $this, 'doViewParse' ), $dirtyCallback );
- if ( !$status->isOK() ) {
+ $key = $parserCache->getKey( $this, $parserOptions );
+ $poolArticleView = new PoolWorkArticleView( $this, $key, $useParserCache, $parserOptions );
+
+ if ( !$poolArticleView->execute() ) {
# Connection or timeout error
- $this->showPoolError( $status );
wfProfileOut( __METHOD__ );
return;
} else {
$outputDone = true;
}
break;
-
# Should be unreachable, but just in case...
default:
break 2;
@@ -921,6 +1025,7 @@ class Article {
# Adjust the title if it was set by displaytitle, -{T|}- or language conversion
if ( $this->mParserOutput ) {
$titleText = $this->mParserOutput->getTitleText();
+
if ( strval( $titleText ) !== '' ) {
$wgOut->setPageTitle( $titleText );
}
@@ -929,6 +1034,7 @@ class Article {
# For the main page, overwrite the <title> element with the con-
# tents of 'pagetitle-view-mainpage' instead of the default (if
# that's not empty).
+ # This message always exists because it is in the i18n files
if ( $this->mTitle->equals( Title::newMainPage() )
&& ( $m = wfMsgForContent( 'pagetitle-view-mainpage' ) ) !== '' )
{
@@ -951,7 +1057,7 @@ class Article {
* Article::view() only, other callers should use the DifferenceEngine class.
*/
public function showDiffPage() {
- global $wgOut, $wgRequest, $wgUser;
+ global $wgRequest, $wgUser;
$diff = $wgRequest->getVal( 'diff' );
$rcid = $wgRequest->getVal( 'rcid' );
@@ -980,9 +1086,11 @@ class Article {
* This is hooked by SyntaxHighlight_GeSHi to do syntax highlighting of these
* page views.
*/
- public function showCssOrJsPage() {
+ protected function showCssOrJsPage() {
global $wgOut;
- $wgOut->addHTML( wfMsgExt( 'clearyourcache', 'parse' ) );
+
+ $wgOut->wrapWikiMsg( "<div id='mw-clearyourcache'>\n$1\n</div>", 'clearyourcache' );
+
// Give hooks a chance to customise the output
if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->mTitle, $wgOut ) ) ) {
// Wrap the whole lot in a <pre> and don't parse
@@ -995,52 +1103,48 @@ class Article {
}
/**
- * Get the robot policy to be used for the current action=view request.
- * @return String the policy that should be set
- * @deprecated use getRobotPolicy() instead, which returns an associative
- * array
- */
- public function getRobotPolicyForView() {
- wfDeprecated( __FUNC__ );
- $policy = $this->getRobotPolicy( 'view' );
- return $policy['index'] . ',' . $policy['follow'];
- }
-
- /**
* Get the robot policy to be used for the current view
* @param $action String the action= GET parameter
* @return Array the policy that should be set
* TODO: actions other than 'view'
*/
public function getRobotPolicy( $action ) {
-
global $wgOut, $wgArticleRobotPolicies, $wgNamespaceRobotPolicies;
global $wgDefaultRobotPolicy, $wgRequest;
$ns = $this->mTitle->getNamespace();
+
if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
# Don't index user and user talk pages for blocked users (bug 11443)
if ( !$this->mTitle->isSubpage() ) {
$block = new Block();
if ( $block->load( $this->mTitle->getText() ) ) {
- return array( 'index' => 'noindex',
- 'follow' => 'nofollow' );
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'nofollow'
+ );
}
}
}
if ( $this->getID() === 0 || $this->getOldID() ) {
# Non-articles (special pages etc), and old revisions
- return array( 'index' => 'noindex',
- 'follow' => 'nofollow' );
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'nofollow'
+ );
} elseif ( $wgOut->isPrintable() ) {
# Discourage indexing of printable versions, but encourage following
- return array( 'index' => 'noindex',
- 'follow' => 'follow' );
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'follow'
+ );
} elseif ( $wgRequest->getInt( 'curid' ) ) {
# For ?curid=x urls, disallow indexing
- return array( 'index' => 'noindex',
- 'follow' => 'follow' );
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'follow'
+ );
}
# Otherwise, construct the policy based on the various config variables.
@@ -1048,24 +1152,29 @@ class Article {
if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
# Honour customised robot policies for this namespace
- $policy = array_merge( $policy,
- self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] ) );
+ $policy = array_merge(
+ $policy,
+ self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
+ );
}
if ( $this->mTitle->canUseNoindex() && is_object( $this->mParserOutput ) && $this->mParserOutput->getIndexPolicy() ) {
# __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
# a final sanity check that we have really got the parser output.
- $policy = array_merge( $policy,
- array( 'index' => $this->mParserOutput->getIndexPolicy() ) );
+ $policy = array_merge(
+ $policy,
+ array( 'index' => $this->mParserOutput->getIndexPolicy() )
+ );
}
if ( isset( $wgArticleRobotPolicies[$this->mTitle->getPrefixedText()] ) ) {
# (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
- $policy = array_merge( $policy,
- self::formatRobotPolicy( $wgArticleRobotPolicies[$this->mTitle->getPrefixedText()] ) );
+ $policy = array_merge(
+ $policy,
+ self::formatRobotPolicy( $wgArticleRobotPolicies[$this->mTitle->getPrefixedText()] )
+ );
}
return $policy;
-
}
/**
@@ -1093,6 +1202,7 @@ class Article {
$arr['follow'] = $var;
}
}
+
return $arr;
}
@@ -1100,12 +1210,15 @@ class Article {
* 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.
+ *
+ * @return boolean
*/
public function showRedirectedFromHeader() {
global $wgOut, $wgUser, $wgRequest, $wgRedirectSources;
$rdfrom = $wgRequest->getVal( 'rdfrom' );
$sk = $wgUser->getSkin();
+
if ( isset( $this->mRedirectedFrom ) ) {
// This is an internally redirected page view.
// We'll need a backlink to the source page for navigation.
@@ -1117,6 +1230,7 @@ class Article {
array( 'redirect' => 'no' ),
array( 'known', 'noclasses' )
);
+
$s = wfMsgExt( 'redirectedfrom', array( 'parseinline', 'replaceafter' ), $redir );
$wgOut->setSubtitle( $s );
@@ -1130,6 +1244,7 @@ class Article {
$wgOut->addLink( array( 'rel' => 'canonical',
'href' => $this->mTitle->getLocalURL() )
);
+
return true;
}
} elseif ( $rdfrom ) {
@@ -1139,9 +1254,11 @@ class Article {
$redir = $sk->makeExternalLink( $rdfrom, $rdfrom );
$s = wfMsgExt( 'redirectedfrom', array( 'parseinline', 'replaceafter' ), $redir );
$wgOut->setSubtitle( $s );
+
return true;
}
}
+
return false;
}
@@ -1151,10 +1268,11 @@ class Article {
*/
public function showNamespaceHeader() {
global $wgOut;
+
if ( $this->mTitle->isTalkPage() ) {
$msg = wfMsgNoTrans( 'talkpageheader' );
if ( $msg !== '-' && !wfEmptyMsg( 'talkpageheader', $msg ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1</div>", array( 'talkpageheader' ) );
+ $wgOut->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
}
}
}
@@ -1163,7 +1281,8 @@ class Article {
* Show the footer section of an ordinary page view
*/
public function showViewFooter() {
- global $wgOut, $wgUseTrackbacks, $wgRequest;
+ global $wgOut, $wgUseTrackbacks;
+
# check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
if ( $this->mTitle->getNamespace() == NS_USER_TALK && IP::isValid( $this->mTitle->getText() ) ) {
$wgOut->addWikiMsg( 'anontalkpagetext' );
@@ -1186,13 +1305,16 @@ class Article {
*/
public function showPatrolFooter() {
global $wgOut, $wgRequest, $wgUser;
+
$rcid = $wgRequest->getVal( 'rcid' );
- if ( !$rcid || !$this->mTitle->exists() || !$this->mTitle->quickUserCan( 'patrol' ) ) {
+ if ( !$rcid || !$this->mTitle->quickUserCan( 'patrol' ) ) {
return;
}
$sk = $wgUser->getSkin();
+ $token = $wgUser->editToken( $rcid );
+ $wgOut->preventClickjacking();
$wgOut->addHTML(
"<div class='patrollink'>" .
@@ -1204,7 +1326,8 @@ class Article {
array(),
array(
'action' => 'markpatrolled',
- 'rcid' => $rcid
+ 'rcid' => $rcid,
+ 'token' => $token,
),
array( 'known', 'noclasses' )
)
@@ -1226,8 +1349,9 @@ class Article {
$rootPart = $parts[0];
$user = User::newFromName( $rootPart, false /* allow IP users*/ );
$ip = User::isIP( $rootPart );
+
if ( !$user->isLoggedIn() && !$ip ) { # User does not exist
- $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1</div>",
+ $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
array( 'userpage-userdoesnotexist-view', $rootPart ) );
} else if ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
LogEventsList::showLogExtract(
@@ -1246,7 +1370,9 @@ class Article {
);
}
}
+
wfRunHooks( 'ShowMissingArticle', array( $this ) );
+
# Show delete and move logs
LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle->getPrefixedText(), '',
array( 'lim' => 10,
@@ -1269,35 +1395,42 @@ class Article {
$editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $wgUser );
$errors = array_merge( $createErrors, $editErrors );
- if ( !count( $errors ) )
+ if ( !count( $errors ) ) {
$text = wfMsgNoTrans( 'noarticletext' );
- else
+ } else {
$text = wfMsgNoTrans( 'noarticletext-nopermission' );
+ }
}
$text = "<div class='noarticletext'>\n$text\n</div>";
+
if ( !$this->hasViewableContent() ) {
// If there's no backing content, send a 404 Not Found
// for better machine handling of broken links.
- $wgRequest->response()->header( "HTTP/1.x 404 Not Found" );
+ $wgRequest->response()->header( "HTTP/1.1 404 Not Found" );
}
+
$wgOut->addWikiText( $text );
}
/**
* If the revision requested for view is deleted, check permissions.
* Send either an error message or a warning header to $wgOut.
- * Returns true if the view is allowed, false if not.
+ *
+ * @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;
}
+
// 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</div>\n",
+ $wgOut->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...
} else if ( $wgRequest->getInt( 'unhide' ) != 1 ) {
@@ -1306,26 +1439,30 @@ class Article {
$link = $this->mTitle->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</div>\n",
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
array( $msg, $link ) );
+
return false;
// We are allowed to see...
} 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</div>\n", $msg );
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+
return true;
}
}
- /*
- * Should the parser cache be used?
- */
+ /**
+ * Should the parser cache be used?
+ *
+ * @return boolean
+ */
public function useParserCache( $oldid ) {
global $wgUser, $wgEnableParserCache;
return $wgEnableParserCache
- && intval( $wgUser->getOption( 'stubthreshold' ) ) == 0
+ && $wgUser->getStubThreshold() == 0
&& $this->exists()
&& empty( $oldid )
&& !$this->mTitle->isCssOrJsPage()
@@ -1337,15 +1474,22 @@ class Article {
*/
public function doViewParse() {
global $wgOut;
+
$oldid = $this->getOldID();
- $useParserCache = $this->useParserCache( $oldid );
- $parserOptions = clone $this->getParserOptions();
+ $parserOptions = $this->getParserOptions();
+
# Render printable version, use printable version cache
$parserOptions->setIsPrintable( $wgOut->isPrintable() );
+
# Don't show section-edit links on old revisions... this way lies madness.
- $parserOptions->setEditSection( $this->isCurrent() );
+ if ( !$this->isCurrent() || $wgOut->isPrintable() || !$this->mTitle->quickUserCan( 'edit' ) ) {
+ $parserOptions->setEditSection( false );
+ }
+
$useParserCache = $this->useParserCache( $oldid );
$this->outputWikiText( $this->getContent(), $useParserCache, $parserOptions );
+
+ return true;
}
/**
@@ -1353,13 +1497,21 @@ class Article {
* output it and return true. If it is not present, output nothing and
* return false. This is used as a callback function for
* PoolCounter::executeProtected().
+ *
+ * @return boolean
*/
public function tryDirtyCache() {
global $wgOut;
$parserCache = ParserCache::singleton();
$options = $this->getParserOptions();
- $options->setIsPrintable( $wgOut->isPrintable() );
+
+ if ( $wgOut->isPrintable() ) {
+ $options->setIsPrintable( true );
+ $options->setEditSection( false );
+ }
+
$output = $parserCache->getDirty( $this, $options );
+
if ( $output ) {
wfDebug( __METHOD__ . ": sending dirty output\n" );
wfDebugLog( 'dirty', "dirty output " . $parserCache->getKey( $this, $options ) . "\n" );
@@ -1367,126 +1519,123 @@ class Article {
$this->mParserOutput = $output;
$wgOut->addParserOutput( $output );
$wgOut->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
+
return true;
} else {
wfDebugLog( 'dirty', "dirty missing\n" );
wfDebug( __METHOD__ . ": no dirty cache\n" );
+
return false;
}
}
/**
- * Show an error page for an error from the pool counter.
- * @param $status Status
- */
- public function showPoolError( $status ) {
- global $wgOut;
- $wgOut->clearHTML(); // for release() errors
- $wgOut->enableClientCache( false );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->addWikiText(
- '<div class="errorbox">' .
- $status->getWikiText( false, 'view-pool-error' ) .
- '</div>'
- );
- }
-
- /**
* View redirect
+ *
* @param $target Title object or Array of destination(s) to redirect
* @param $appendSubtitle Boolean [optional]
* @param $forceKnown Boolean: should the image be shown as a bluelink regardless of existence?
+ * @return string containing HMTL with redirect link
*/
public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
global $wgOut, $wgContLang, $wgStylePath, $wgUser;
- # Display redirect
+
if ( !is_array( $target ) ) {
$target = array( $target );
}
+
$imageDir = $wgContLang->getDir();
- $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
- $imageUrl2 = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
- $alt2 = $wgContLang->isRTL() ? '&larr;' : '&rarr;'; // should -> and <- be used instead of entities?
if ( $appendSubtitle ) {
$wgOut->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
}
+
$sk = $wgUser->getSkin();
// the loop prepends the arrow image before the link, so the first case needs to be outside
$title = array_shift( $target );
+
if ( $forceKnown ) {
- $link = $sk->link(
- $title,
- htmlspecialchars( $title->getFullText() ),
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
+ $link = $sk->linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
} else {
$link = $sk->link( $title, htmlspecialchars( $title->getFullText() ) );
}
- // automatically append redirect=no to each link, since most of them are redirect pages themselves
+
+ $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
+ $alt = $wgContLang->isRTL() ? 'â†' : '→';
+ // Automatically append redirect=no to each link, since most of them are redirect pages themselves.
+ // FIXME: where this happens?
foreach ( $target as $rt ) {
+ $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
if ( $forceKnown ) {
- $link .= '<img src="' . $imageUrl2 . '" alt="' . $alt2 . ' " />'
- . $sk->link(
- $rt,
- htmlspecialchars( $rt->getFullText() ),
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
+ $link .= $sk->linkKnown( $rt, htmlspecialchars( $rt->getFullText() ) );
} else {
- $link .= '<img src="' . $imageUrl2 . '" alt="' . $alt2 . ' " />'
- . $sk->link( $rt, htmlspecialchars( $rt->getFullText() ) );
+ $link .= $sk->link( $rt, htmlspecialchars( $rt->getFullText() ) );
}
}
- return '<img src="' . $imageUrl . '" alt="#REDIRECT " />' .
- '<span class="redirectText">' . $link . '</span>';
+ $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
+ return '<div class="redirectMsg">' .
+ Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
+ '<span class="redirectText">' . $link . '</span></div>';
}
+ /**
+ * Builds trackback links for article display if $wgUseTrackbacks is set to true
+ */
public function addTrackbacks() {
global $wgOut, $wgUser;
+
$dbr = wfGetDB( DB_SLAVE );
$tbs = $dbr->select( 'trackbacks',
array( 'tb_id', 'tb_title', 'tb_url', 'tb_ex', 'tb_name' ),
array( 'tb_page' => $this->getID() )
);
- if ( !$dbr->numRows( $tbs ) ) return;
+
+ if ( !$dbr->numRows( $tbs ) ) {
+ return;
+ }
$wgOut->preventClickjacking();
$tbtext = "";
- while ( $o = $dbr->fetchObject( $tbs ) ) {
+ foreach ( $tbs as $o ) {
$rmvtxt = "";
+
if ( $wgUser->isAllowed( 'trackback' ) ) {
$delurl = $this->mTitle->getFullURL( "action=deletetrackback&tbid=" .
$o->tb_id . "&token=" . urlencode( $wgUser->editToken() ) );
$rmvtxt = wfMsg( 'trackbackremove', htmlspecialchars( $delurl ) );
}
+
$tbtext .= "\n";
- $tbtext .= wfMsg( strlen( $o->tb_ex ) ? 'trackbackexcerpt' : 'trackback',
+ $tbtext .= wfMsgNoTrans( strlen( $o->tb_ex ) ? 'trackbackexcerpt' : 'trackback',
$o->tb_title,
$o->tb_url,
$o->tb_ex,
$o->tb_name,
$rmvtxt );
}
- $wgOut->wrapWikiMsg( "<div id='mw_trackbacks'>$1</div>\n", array( 'trackbackbox', $tbtext ) );
- $this->mTitle->invalidateCache();
+
+ $wgOut->wrapWikiMsg( "<div id='mw_trackbacks'>\n$1\n</div>\n", array( 'trackbackbox', $tbtext ) );
}
+ /**
+ * Removes trackback record for current article from trackbacks table
+ */
public function deletetrackback() {
global $wgUser, $wgRequest, $wgOut;
+
if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'token' ) ) ) {
$wgOut->addWikiMsg( 'sessionfailure' );
+
return;
}
$permission_errors = $this->mTitle->getUserPermissionsErrors( 'delete', $wgUser );
+
if ( count( $permission_errors ) ) {
$wgOut->showPermissionsErrorPage( $permission_errors );
+
return;
}
@@ -1497,8 +1646,13 @@ class Article {
$this->mTitle->invalidateCache();
}
+ /**
+ * Handle action=render
+ */
+
public function render() {
global $wgOut;
+
$wgOut->setArticleBodyOnly( true );
$this->view();
}
@@ -1508,22 +1662,30 @@ class Article {
*/
public function purge() {
global $wgUser, $wgRequest, $wgOut;
+
if ( $wgUser->isAllowed( 'purge' ) || $wgRequest->wasPosted() ) {
+ //FIXME: shouldn't this be in doPurge()?
if ( wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
$this->doPurge();
$this->view();
}
} else {
- $action = htmlspecialchars( $wgRequest->getRequestURL() );
- $button = wfMsgExt( 'confirm_purge_button', array( 'escapenoentities' ) );
- $form = "<form method=\"post\" action=\"$action\">\n" .
- "<input type=\"submit\" name=\"submit\" value=\"$button\" />\n" .
- "</form>\n";
- $top = wfMsgExt( 'confirm-purge-top', array( 'parse' ) );
- $bottom = wfMsgExt( 'confirm-purge-bottom', array( 'parse' ) );
+ $formParams = array(
+ 'method' => 'post',
+ 'action' => $wgRequest->getRequestURL(),
+ );
+
+ $wgOut->addWikiMsg( 'confirm-purge-top' );
+
+ $form = Html::openElement( 'form', $formParams );
+ $form .= Xml::submitButton( wfMsg( 'confirm_purge_button' ) );
+ $form .= Html::closeElement( 'form' );
+
+ $wgOut->addHTML( $form );
+ $wgOut->addWikiMsg( 'confirm-purge-bottom' );
+
$wgOut->setPageTitle( $this->mTitle->getPrefixedText() );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->addHTML( $top . $form . $bottom );
}
}
@@ -1532,6 +1694,7 @@ class Article {
*/
public function doPurge() {
global $wgUseSquid;
+
// Invalidate the cache
$this->mTitle->invalidateCache();
@@ -1544,13 +1707,16 @@ class Article {
$update = SquidUpdate::newSimplePurge( $this->mTitle );
$update->doUpdate();
}
+
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
global $wgMessageCache;
+
if ( $this->getID() == 0 ) {
$text = false;
} else {
$text = $this->getRawText();
}
+
$wgMessageCache->replace( $this->mTitle->getDBkey(), $text );
}
}
@@ -1558,7 +1724,7 @@ class Article {
/**
* Insert a new empty page record for this article.
* This *must* be followed up by creating a revision
- * and running $this->updateToLatest( $rev_id );
+ * and running $this->updateRevisionOn( ... );
* or else the record will be left in a funky state.
* Best if all done inside a transaction.
*
@@ -1585,18 +1751,20 @@ class Article {
), __METHOD__, 'IGNORE' );
$affected = $dbw->affectedRows();
+
if ( $affected ) {
$newid = $dbw->insertId();
$this->mTitle->resetArticleId( $newid );
}
wfProfileOut( __METHOD__ );
+
return $affected ? $newid : false;
}
/**
* Update the page record to point to a newly saved revision.
*
- * @param $dbw Database object
+ * @param $dbw DatabaseBase: object
* @param $revision Revision: For ID number, and text used to set
length and redirect status fields
* @param $lastRevision Integer: if given, will not overwrite the page field
@@ -1612,9 +1780,10 @@ class Article {
wfProfileIn( __METHOD__ );
$text = $revision->getText();
- $rt = Title::newFromRedirect( $text );
+ $rt = Title::newFromRedirectRecurse( $text );
$conditions = array( 'page_id' => $this->getId() );
+
if ( !is_null( $lastRevision ) ) {
# An extra check against threads stepping on each other
$conditions['page_latest'] = $lastRevision;
@@ -1656,27 +1825,25 @@ class Article {
// Update/Insert if we don't know if the last revision was a redirect or not
// Delete if changing from redirect to non-redirect
$isRedirect = !is_null( $redirectTitle );
+
if ( $isRedirect || is_null( $lastRevIsRedirect ) || $lastRevIsRedirect !== $isRedirect ) {
wfProfileIn( __METHOD__ );
if ( $isRedirect ) {
- // This title is a redirect, Add/Update row in the redirect table
- $set = array( /* SET */
- 'rd_namespace' => $redirectTitle->getNamespace(),
- 'rd_title' => $redirectTitle->getDBkey(),
- 'rd_from' => $this->getId(),
- );
- $dbw->replace( 'redirect', array( 'rd_from' ), $set, __METHOD__ );
+ $this->insertRedirectEntry( $redirectTitle );
} else {
// This is not a redirect, remove row from redirect table
$where = array( 'rd_from' => $this->getId() );
$dbw->delete( 'redirect', $where, __METHOD__ );
}
+
if ( $this->getTitle()->getNamespace() == NS_FILE ) {
RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
}
wfProfileOut( __METHOD__ );
+
return ( $dbw->affectedRows() != 0 );
}
+
return true;
}
@@ -1686,9 +1853,11 @@ class Article {
*
* @param $dbw Database object
* @param $revision Revision object
+ * @return mixed
*/
public function updateIfNewerOn( &$dbw, $revision ) {
wfProfileIn( __METHOD__ );
+
$row = $dbw->selectRow(
array( 'revision', 'page' ),
array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
@@ -1696,6 +1865,7 @@ class Article {
'page_id' => $this->getId(),
'page_latest=rev_id' ),
__METHOD__ );
+
if ( $row ) {
if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
wfProfileOut( __METHOD__ );
@@ -1708,17 +1878,23 @@ class Article {
$prev = 0;
$lastRevIsRedirect = null;
}
+
$ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
+
wfProfileOut( __METHOD__ );
return $ret;
}
/**
* @param $section empty/null/false or a section number (0, 1, 2, T1, T2...)
+ * @param $text String: new text of the section
+ * @param $summary String: new section's subject, only if $section is 'new'
+ * @param $edittime String: revision timestamp or null to use the current revision
* @return string Complete article text, or null if error
*/
public function replaceSection( $section, $text, $summary = '', $edittime = null ) {
wfProfileIn( __METHOD__ );
+
if ( strval( $section ) == '' ) {
// Whole-page edit; let the whole text through
} else {
@@ -1728,11 +1904,14 @@ class Article {
$dbw = wfGetDB( DB_MASTER );
$rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
}
+
if ( !$rev ) {
wfDebug( "Article::replaceSection asked for bogus section (page: " .
$this->getId() . "; section: $section; edittime: $edittime)\n" );
+ wfProfileOut( __METHOD__ );
return null;
}
+
$oldtext = $rev->getText();
if ( $section == 'new' ) {
@@ -1744,9 +1923,11 @@ class Article {
} else {
# Replacing an existing section; roll out the big guns
global $wgParser;
+
$text = $wgParser->replaceSection( $oldtext, $section, $text );
}
}
+
wfProfileOut( __METHOD__ );
return $text;
}
@@ -1765,7 +1946,6 @@ class Article {
if ( $comment && $summary != "" ) {
$text = wfMsgForContent( 'newsectionheaderdefaultlevel', $summary ) . "\n\n" . $text;
}
-
$this->doEdit( $text, $summary, $flags );
$dbw = wfGetDB( DB_MASTER );
@@ -1794,6 +1974,7 @@ class Article {
( $forceBot ? EDIT_FORCE_BOT : 0 );
$status = $this->doEdit( $text, $summary, $flags );
+
if ( !$status->isOK() ) {
return false;
}
@@ -1821,6 +2002,23 @@ class Article {
}
/**
+ * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
+ * @param $flags Int
+ * @return Int updated $flags
+ */
+ function checkFlags( $flags ) {
+ if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
+ if ( $this->mTitle->getArticleID() ) {
+ $flags |= EDIT_UPDATE;
+ } else {
+ $flags |= EDIT_NEW;
+ }
+ }
+
+ return $flags;
+ }
+
+ /**
* Article::doEdit()
*
* Change an existing article or create a new article. Updates RC and all necessary caches,
@@ -1874,7 +2072,7 @@ class Article {
global $wgUser, $wgDBtransactions, $wgUseAutomaticEditSummaries;
# Low-level sanity check
- if ( $this->mTitle->getText() == '' ) {
+ if ( $this->mTitle->getText() === '' ) {
throw new MWException( 'Something is trying to edit an article with an empty title' );
}
@@ -1886,23 +2084,18 @@ class Article {
# Load $this->mTitle->getArticleID() and $this->mLatest if it's not already
$this->loadPageData();
- if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
- $aid = $this->mTitle->getArticleID();
- if ( $aid ) {
- $flags |= EDIT_UPDATE;
- } else {
- $flags |= EDIT_NEW;
- }
- }
+ $flags = $this->checkFlags( $flags );
if ( !wfRunHooks( 'ArticleSave', array( &$this, &$user, &$text, &$summary,
$flags & EDIT_MINOR, null, null, &$flags, &$status ) ) )
{
wfDebug( __METHOD__ . ": ArticleSave hook aborted save!\n" );
- wfProfileOut( __METHOD__ );
+
if ( $status->isOK() ) {
$status->fatal( 'edit-hook-aborted' );
}
+
+ wfProfileOut( __METHOD__ );
return $status;
}
@@ -1929,13 +2122,12 @@ class Article {
if ( $flags & EDIT_UPDATE ) {
# Update article, but only if changed.
$status->value['new'] = false;
+
# Make sure the revision is either completely inserted or not inserted at all
if ( !$wgDBtransactions ) {
$userAbort = ignore_user_abort( true );
}
- $revisionId = 0;
-
$changed = ( strcmp( $text, $oldtext ) != 0 );
if ( $changed ) {
@@ -1947,6 +2139,7 @@ class Article {
# Article gone missing
wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
$status->fatal( 'edit-gone-missing' );
+
wfProfileOut( __METHOD__ );
return $status;
}
@@ -1959,7 +2152,7 @@ class Article {
'parent_id' => $this->mLatest,
'user' => $user->getId(),
'user_text' => $user->getName(),
- ) );
+ ) );
$dbw->begin();
$revisionId = $revision->insertOn( $dbw );
@@ -1976,10 +2169,12 @@ class Article {
if ( !$ok ) {
/* Belated edit conflict! Run away!! */
$status->fatal( 'edit-conflict' );
+
# Delete the invalid revision if the DB is not transactional
if ( !$wgDBtransactions ) {
$dbw->delete( 'revision', array( 'rev_id' => $revisionId ), __METHOD__ );
}
+
$revisionId = 0;
$dbw->rollback();
} else {
@@ -1994,6 +2189,7 @@ class Article {
$this->mLatest, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
$revisionId, $patrolled
);
+
# Log auto-patrolled edits
if ( $patrolled ) {
PatrolLog::record( $rc, true );
@@ -2015,6 +2211,7 @@ class Article {
if ( !$wgDBtransactions ) {
ignore_user_abort( $userAbort );
}
+
// Now that ignore_user_abort is restored, we can respond to fatal errors
if ( !$status->isOK() ) {
wfProfileOut( __METHOD__ );
@@ -2045,6 +2242,7 @@ class Article {
if ( $newid === false ) {
$dbw->rollback();
$status->fatal( 'edit-already-exists' );
+
wfProfileOut( __METHOD__ );
return $status;
}
@@ -2066,14 +2264,17 @@ class Article {
$this->updateRevisionOn( $dbw, $revision, 0 );
wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
# Update recentchanges
if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
global $wgUseRCPatrol, $wgUseNPPatrol;
+
# Mark as patrolled if the user can do so
$patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && $this->mTitle->userCan( 'autopatrol' );
# Add RC row to the DB
$rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
'', strlen( $text ), $revisionId, $patrolled );
+
# Log auto-patrolled edits
if ( $patrolled ) {
PatrolLog::record( $rc, true );
@@ -2125,13 +2326,15 @@ class Article {
*/
public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
global $wgOut;
+
if ( $noRedir ) {
$query = 'redirect=no';
if ( $extraQuery )
- $query .= "&$query";
+ $query .= "&$extraQuery";
} else {
$query = $extraQuery;
}
+
$wgOut->redirect( $this->mTitle->getFullURL( $query ) . $sectionAnchor );
}
@@ -2139,12 +2342,20 @@ class Article {
* Mark this particular edit/page as patrolled
*/
public function markpatrolled() {
- global $wgOut, $wgRequest, $wgUseRCPatrol, $wgUseNPPatrol, $wgUser;
+ global $wgOut, $wgUser, $wgRequest;
+
$wgOut->setRobotPolicy( 'noindex,nofollow' );
# If we haven't been given an rc_id value, we can't do anything
$rcid = (int) $wgRequest->getVal( 'rcid' );
+
+ if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'token' ), $rcid ) ) {
+ $wgOut->showErrorPage( 'sessionfailure-title', 'sessionfailure' );
+ return;
+ }
+
$rc = RecentChange::newFromId( $rcid );
+
if ( is_null( $rc ) ) {
$wgOut->showErrorPage( 'markedaspatrollederror', 'markedaspatrollederrortext' );
return;
@@ -2154,11 +2365,11 @@ class Article {
$returnto = $rc->getAttribute( 'rc_type' ) == RC_NEW ? 'Newpages' : 'Recentchanges';
$return = SpecialPage::getTitleFor( $returnto );
- $dbw = wfGetDB( DB_MASTER );
$errors = $rc->doMarkPatrolled();
if ( in_array( array( 'rcpatroldisabled' ), $errors ) ) {
$wgOut->showErrorPage( 'rcpatroldisabled', 'rcpatroldisabledtext' );
+
return;
}
@@ -2171,11 +2382,13 @@ class Article {
$wgOut->setPageTitle( wfMsg( 'markedaspatrollederror' ) );
$wgOut->addWikiMsg( 'markedaspatrollederror-noautopatrol' );
$wgOut->returnToMain( false, $return );
+
return;
}
if ( !empty( $errors ) ) {
$wgOut->showPermissionsErrorPage( $errors );
+
return;
}
@@ -2190,35 +2403,45 @@ class Article {
*/
public function watch() {
global $wgUser, $wgOut;
+
if ( $wgUser->isAnon() ) {
$wgOut->showErrorPage( 'watchnologin', 'watchnologintext' );
return;
}
+
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
+
if ( $this->doWatch() ) {
$wgOut->setPagetitle( wfMsg( 'addedwatch' ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->addWikiMsg( 'addedwatchtext', $this->mTitle->getPrefixedText() );
}
+
$wgOut->returnToMain( true, $this->mTitle->getPrefixedText() );
}
/**
* Add this page to $wgUser's watchlist
+ *
+ * This is safe to be called multiple times
+ *
* @return bool true on successful watch operation
*/
public function doWatch() {
global $wgUser;
+
if ( $wgUser->isAnon() ) {
return false;
}
+
if ( wfRunHooks( 'WatchArticle', array( &$wgUser, &$this ) ) ) {
$wgUser->addWatch( $this->mTitle );
return wfRunHooks( 'WatchArticleComplete', array( &$wgUser, &$this ) );
}
+
return false;
}
@@ -2227,19 +2450,23 @@ class Article {
*/
public function unwatch() {
global $wgUser, $wgOut;
+
if ( $wgUser->isAnon() ) {
$wgOut->showErrorPage( 'watchnologin', 'watchnologintext' );
return;
}
+
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
+
if ( $this->doUnwatch() ) {
$wgOut->setPagetitle( wfMsg( 'removedwatch' ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->addWikiMsg( 'removedwatchtext', $this->mTitle->getPrefixedText() );
}
+
$wgOut->returnToMain( true, $this->mTitle->getPrefixedText() );
}
@@ -2249,13 +2476,16 @@ class Article {
*/
public function doUnwatch() {
global $wgUser;
+
if ( $wgUser->isAnon() ) {
return false;
}
+
if ( wfRunHooks( 'UnwatchArticle', array( &$wgUser, &$this ) ) ) {
$wgUser->removeWatch( $this->mTitle );
return wfRunHooks( 'UnwatchArticleComplete', array( &$wgUser, &$this ) );
}
+
return false;
}
@@ -2289,8 +2519,9 @@ class Article {
$restrictionTypes = $this->mTitle->getRestrictionTypes();
$id = $this->mTitle->getArticleID();
+
if ( $id <= 0 ) {
- wfDebug( "updateRestrictions failed: $id <= 0\n" );
+ wfDebug( "updateRestrictions failed: article id $id <= 0\n" );
return false;
}
@@ -2316,6 +2547,7 @@ class Article {
$current = array();
$updated = Article::flattenRestrictions( $limit );
$changed = false;
+
foreach ( $restrictionTypes as $action ) {
if ( isset( $expiry[$action] ) ) {
# Get current restrictions on $action
@@ -2323,6 +2555,7 @@ class Article {
$current[$action] = implode( '', $aLimits );
# Are any actual restrictions being dealt with here?
$aRChanged = count( $aLimits ) || !empty( $limit[$action] );
+
# If something changed, we need to log it. Checking $aRChanged
# assures that "unprotecting" a page that is not protected does
# not log just because the expiry was "changed".
@@ -2341,38 +2574,44 @@ class Article {
# If nothing's changed, do nothing
if ( $changed ) {
if ( wfRunHooks( 'ArticleProtect', array( &$this, &$wgUser, $limit, $reason ) ) ) {
-
$dbw = wfGetDB( DB_MASTER );
# Prepare a null revision to be added to the history
$modified = $current != '' && $protect;
+
if ( $protect ) {
$comment_type = $modified ? 'modifiedarticleprotection' : 'protectedarticle';
} else {
$comment_type = 'unprotectedarticle';
}
+
$comment = $wgContLang->ucfirst( wfMsgForContent( $comment_type, $this->mTitle->getPrefixedText() ) );
# Only restrictions with the 'protect' right can cascade...
# Otherwise, people who cannot normally protect can "protect" pages via transclusion
$editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
+
# The schema allows multiple restrictions
- if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) )
+ if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
$cascade = false;
+ }
+
$cascade_description = '';
+
if ( $cascade ) {
$cascade_description = ' [' . wfMsgForContent( 'protect-summary-cascade' ) . ']';
}
- if ( $reason )
+ if ( $reason ) {
$comment .= ": $reason";
+ }
$editComment = $comment;
$encodedExpiry = array();
$protect_description = '';
- foreach ( $limit as $action => $restrictions ) {
+ foreach ( $limit as $action => $restrictions ) {
if ( !isset( $expiry[$action] ) )
- $expiry[$action] = 'infinite';
+ $expiry[$action] = Block::infinity();
$encodedExpiry[$action] = Block::encodeExpiry( $expiry[$action], $dbw );
if ( $restrictions != '' ) {
@@ -2385,15 +2624,20 @@ class Article {
} else {
$protect_description .= wfMsgForContent( 'protect-expiry-indefinite' );
}
+
$protect_description .= ') ';
}
}
$protect_description = trim( $protect_description );
- if ( $protect_description && $protect )
+ if ( $protect_description && $protect ) {
$editComment .= " ($protect_description)";
- if ( $cascade )
+ }
+
+ if ( $cascade ) {
$editComment .= "$cascade_description";
+ }
+
# Update restrictions table
foreach ( $limit as $action => $restrictions ) {
if ( $restrictions != '' ) {
@@ -2402,7 +2646,10 @@ class Article {
'pr_type' => $action,
'pr_level' => $restrictions,
'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
- 'pr_expiry' => $encodedExpiry[$action] ), __METHOD__ );
+ 'pr_expiry' => $encodedExpiry[$action]
+ ),
+ __METHOD__
+ );
} else {
$dbw->delete( 'page_restrictions', array( 'pr_page' => $id,
'pr_type' => $action ), __METHOD__ );
@@ -2436,7 +2683,6 @@ class Article {
} else {
$log->addEntry( 'unprotect', $this->mTitle, $reason );
}
-
} # End hook
} # End "changed" check
@@ -2453,35 +2699,46 @@ class Article {
if ( !is_array( $limit ) ) {
throw new MWException( 'Article::flattenRestrictions given non-array restriction set' );
}
+
$bits = array();
ksort( $limit );
+
foreach ( $limit as $action => $restrictions ) {
if ( $restrictions != '' ) {
$bits[] = "$action=$restrictions";
}
}
+
return implode( ':', $bits );
}
/**
* Auto-generates a deletion reason
+ *
* @param &$hasHistory Boolean: whether the page has a history
+ * @return mixed String containing deletion reason or empty string, or boolean false
+ * if no revision occurred
*/
public function generateReason( &$hasHistory ) {
global $wgContLang;
+
$dbw = wfGetDB( DB_MASTER );
// Get the last revision
$rev = Revision::newFromTitle( $this->mTitle );
- if ( is_null( $rev ) )
+
+ if ( is_null( $rev ) ) {
return false;
+ }
// Get the article's contents
$contents = $rev->getText();
$blank = false;
+
// If the page is blank, use the text from the previous revision,
// which can only be blank if there's a move/import/protect dummy revision involved
if ( $contents == '' ) {
$prev = $rev->getPrevious();
+
if ( $prev ) {
$contents = $prev->getText();
$blank = true;
@@ -2495,21 +2752,27 @@ class Article {
__METHOD__,
array( 'LIMIT' => 20 )
);
- if ( $res === false )
+
+ if ( $res === false ) {
// This page has no revisions, which is very weird
return false;
+ }
$hasHistory = ( $res->numRows() > 1 );
$row = $dbw->fetchObject( $res );
- $onlyAuthor = $row->rev_user_text;
- // Try to find a second contributor
- foreach ( $res as $row ) {
- if ( $row->rev_user_text != $onlyAuthor ) {
- $onlyAuthor = false;
- break;
+
+ if ( $row ) { // $row is false if the only contributor is hidden
+ $onlyAuthor = $row->rev_user_text;
+ // Try to find a second contributor
+ foreach ( $res as $row ) {
+ if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+ $onlyAuthor = false;
+ break;
+ }
}
+ } else {
+ $onlyAuthor = false;
}
- $dbw->freeResult( $res );
// Generate the summary with a '$1' placeholder
if ( $blank ) {
@@ -2517,10 +2780,11 @@ class Article {
// blank. It's just not our lucky day
$reason = wfMsgForContent( 'exbeforeblank', '$1' );
} else {
- if ( $onlyAuthor )
+ if ( $onlyAuthor ) {
$reason = wfMsgForContent( 'excontentauthor', '$1', $onlyAuthor );
- else
+ } else {
$reason = wfMsgForContent( 'excontent', '$1' );
+ }
}
if ( $reason == '-' ) {
@@ -2538,6 +2802,7 @@ class Article {
$contents = preg_replace( '/\[\[([^\]]*)\]?$/', '$1', $contents );
// Now replace the '$1' placeholder
$reason = str_replace( '$1', $contents, $reason );
+
return $reason;
}
@@ -2562,6 +2827,7 @@ class Article {
} elseif ( $reason == 'other' ) {
$reason = $this->DeleteReason;
}
+
# Flag to hide all contents of the archived revisions
$suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
@@ -2570,6 +2836,7 @@ class Article {
# Read-only check...
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
+
return;
}
@@ -2578,6 +2845,7 @@ class Article {
if ( count( $permission_errors ) > 0 ) {
$wgOut->showPermissionsErrorPage( $permission_errors );
+
return;
}
@@ -2601,6 +2869,7 @@ class Article {
'delete',
$this->mTitle->getPrefixedText()
);
+
return;
}
@@ -2608,38 +2877,47 @@ class Article {
$bigHistory = $this->isBigDeletion();
if ( $bigHistory && !$this->mTitle->userCan( 'bigdelete' ) ) {
global $wgLang, $wgDeleteRevisionsLimit;
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1</div>\n",
+
+ $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
array( 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
+
return;
}
if ( $confirm ) {
$this->doDelete( $reason, $suppress );
+
if ( $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn() ) {
$this->doWatch();
} elseif ( $this->mTitle->userIsWatching() ) {
$this->doUnwatch();
}
+
return;
}
// Generate deletion reason
$hasHistory = false;
- if ( !$reason ) $reason = $this->generateReason( $hasHistory );
+ if ( !$reason ) {
+ $reason = $this->generateReason( $hasHistory );
+ }
// If the page has a history, insert a warning
if ( $hasHistory && !$confirm ) {
global $wgLang;
+
$skin = $wgUser->getSkin();
$revisions = $this->estimateRevisionCount();
+ //FIXME: lego
$wgOut->addHTML( '<strong class="mw-delete-warning-revisions">' .
wfMsgExt( 'historywarning', array( 'parseinline' ), $wgLang->formatNum( $revisions ) ) .
wfMsgHtml( 'word-separator' ) . $skin->historyLink() .
'</strong>'
);
+
if ( $bigHistory ) {
global $wgDeleteRevisionsLimit;
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1</div>\n",
+ $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
array( 'delete-warning-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
}
}
@@ -2652,10 +2930,13 @@ class Article {
*/
public function isBigDeletion() {
global $wgDeleteRevisionsLimit;
+
if ( $wgDeleteRevisionsLimit ) {
$revCount = $this->estimateRevisionCount();
+
return $revCount > $wgDeleteRevisionsLimit;
}
+
return false;
}
@@ -2664,6 +2945,7 @@ class Article {
*/
public function estimateRevisionCount() {
$dbr = wfGetDB( DB_SLAVE );
+
// For an exact count...
// return $dbr->selectField( 'revision', 'COUNT(*)',
// array( 'rev_page' => $this->getId() ), __METHOD__ );
@@ -2683,6 +2965,7 @@ class Article {
// If that doesn't have the latest revision, try the master
$continue = 2;
$db = wfGetDB( DB_SLAVE );
+
do {
$res = $db->select( array( 'page', 'revision' ),
array( 'rev_id', 'rev_user_text' ),
@@ -2695,11 +2978,14 @@ class Article {
'LIMIT' => $num
) )
);
+
if ( !$res ) {
wfProfileOut( __METHOD__ );
return array();
}
+
$row = $db->fetchObject( $res );
+
if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
$db = wfGetDB( DB_MASTER );
$continue--;
@@ -2709,15 +2995,18 @@ class Article {
} while ( $continue );
$authors = array( $row->rev_user_text );
- while ( $row = $db->fetchObject( $res ) ) {
+
+ foreach ( $res as $row ) {
$authors[] = $row->rev_user_text;
}
+
wfProfileOut( __METHOD__ );
return $authors;
}
/**
* Output deletion confirmation dialog
+ * FIXME: Move to another file?
* @param $reason String: prefilled reason
*/
public function confirmDelete( $reason ) {
@@ -2725,13 +3014,7 @@ class Article {
wfDebug( "Article::confirmDelete\n" );
- $deleteBackLink = $wgUser->getSkin()->link(
- $this->mTitle,
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
+ $deleteBackLink = $wgUser->getSkin()->linkKnown( $this->mTitle );
$wgOut->setSubtitle( wfMsgHtml( 'delete-backlink', $deleteBackLink ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->addWikiMsg( 'confirmdeletetext' );
@@ -2780,7 +3063,8 @@ class Article {
) ) .
"</td>
</tr>";
- # Dissalow watching is user is not logged in
+
+ # Disallow watching if user is not logged in
if ( $wgUser->isLoggedIn() ) {
$form .= "
<tr>
@@ -2791,6 +3075,7 @@ class Article {
"</td>
</tr>";
}
+
$form .= "
$suppress
<tr>
@@ -2802,7 +3087,7 @@ class Article {
</tr>" .
Xml::closeElement( 'table' ) .
Xml::closeElement( 'fieldset' ) .
- Xml::hidden( 'wpEditToken', $wgUser->editToken() ) .
+ Html::hidden( 'wpEditToken', $wgUser->editToken() ) .
Xml::closeElement( 'form' );
if ( $wgUser->isAllowed( 'editinterface' ) ) {
@@ -2819,9 +3104,7 @@ class Article {
$wgOut->addHTML( $form );
$wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
- LogEventsList::showLogExtract(
- $wgOut,
- 'delete',
+ LogEventsList::showLogExtract( $wgOut, 'delete',
$this->mTitle->getPrefixedText()
);
}
@@ -2831,7 +3114,8 @@ class Article {
*/
public function doDelete( $reason, $suppress = false ) {
global $wgOut, $wgUser;
- $id = $this->mTitle->getArticleID( GAID_FOR_UPDATE );
+
+ $id = $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
$error = '';
if ( wfRunHooks( 'ArticleDelete', array( &$this, &$wgUser, &$reason, &$error ) ) ) {
@@ -2856,7 +3140,9 @@ class Article {
wfMsgExt( 'cannotdelete', array( 'parse' ), $this->mTitle->getPrefixedText() )
)
);
+
$wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+
LogEventsList::showLogExtract(
$wgOut,
'delete',
@@ -2871,20 +3157,27 @@ class Article {
/**
* Back-end article deletion
* Deletes the article with database consistency, writes logs, purges caches
- * Returns success
+ *
+ * @param $reason string delete reason for deletion log
+ * @param suppress bitfield
+ * Revision::DELETED_TEXT
+ * Revision::DELETED_COMMENT
+ * Revision::DELETED_USER
+ * Revision::DELETED_RESTRICTED
+ * @param $id int article ID
+ * @param $commit boolean defaults to true, triggers transaction end
+ * @return boolean true if successful
*/
- public function doDeleteArticle( $reason, $suppress = false, $id = 0 ) {
- global $wgUseSquid, $wgDeferredUpdateList;
- global $wgUseTrackbacks;
+ public function doDeleteArticle( $reason, $suppress = false, $id = 0, $commit = true ) {
+ global $wgDeferredUpdateList, $wgUseTrackbacks;
wfDebug( __METHOD__ . "\n" );
$dbw = wfGetDB( DB_MASTER );
- $ns = $this->mTitle->getNamespace();
$t = $this->mTitle->getDBkey();
- $id = $id ? $id : $this->mTitle->getArticleID( GAID_FOR_UPDATE );
+ $id = $id ? $id : $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
- if ( $t == '' || $id == 0 ) {
+ if ( $t === '' || $id == 0 ) {
return false;
}
@@ -2942,6 +3235,7 @@ class Article {
# Now that it's safely backed up, delete it
$dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
$ok = ( $dbw->affectedRows() > 0 ); // getArticleId() uses slave, could be laggy
+
if ( !$ok ) {
$dbw->rollback();
return false;
@@ -2950,9 +3244,11 @@ class Article {
# Fix category table counts
$cats = array();
$res = $dbw->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
+
foreach ( $res as $row ) {
$cats [] = $row->cl_to;
}
+
$this->updateCategoryCounts( array(), $cats );
# If using cascading deletes, we can skip some explicit deletes
@@ -2969,6 +3265,7 @@ class Article {
$dbw->delete( 'templatelinks', array( 'tl_from' => $id ) );
$dbw->delete( 'externallinks', array( 'el_from' => $id ) );
$dbw->delete( 'langlinks', array( 'll_from' => $id ) );
+ $dbw->delete( 'iwlinks', array( 'iwl_from' => $id ) );
$dbw->delete( 'redirect', array( 'rd_from' => $id ) );
}
@@ -2998,7 +3295,9 @@ class Article {
# Make sure logging got through
$log->addEntry( 'delete', $this->mTitle, $reason, array() );
- $dbw->commit();
+ if ( $commit ) {
+ $dbw->commit();
+ }
return true;
}
@@ -3026,6 +3325,7 @@ class Article {
*/
public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails ) {
global $wgUser;
+
$resultDetails = null;
# Check permissions
@@ -3033,15 +3333,18 @@ class Article {
$rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $wgUser );
$errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
- if ( !$wgUser->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) )
+ if ( !$wgUser->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
$errors[] = array( 'sessionfailure' );
+ }
if ( $wgUser->pingLimiter( 'rollback' ) || $wgUser->pingLimiter() ) {
$errors[] = array( 'actionthrottledtext' );
}
+
# If there were errors, bail out now
- if ( !empty( $errors ) )
+ if ( !empty( $errors ) ) {
return $errors;
+ }
return $this->commitRollback( $fromP, $summary, $bot, $resultDetails );
}
@@ -3057,6 +3360,7 @@ class Article {
*/
public function commitRollback( $fromP, $summary, $bot, &$resultDetails ) {
global $wgUseRCPatrol, $wgUser, $wgLang;
+
$dbw = wfGetDB( DB_MASTER );
if ( wfReadOnly() ) {
@@ -3092,12 +3396,12 @@ class Article {
"rev_user != {$user} OR rev_user_text != {$user_text}"
), __METHOD__,
array( 'USE INDEX' => 'page_timestamp',
- 'ORDER BY' => 'rev_timestamp DESC' )
+ 'ORDER BY' => 'rev_timestamp DESC' )
);
if ( $s === false ) {
# No one else ever edited this page
return array( array( 'cantrollback' ) );
- } else if ( $s->rev_deleted & REVISION::DELETED_TEXT || $s->rev_deleted & REVISION::DELETED_USER ) {
+ } else if ( $s->rev_deleted & Revision::DELETED_TEXT || $s->rev_deleted & Revision::DELETED_USER ) {
# Only admins can see this text
return array( array( 'notvisiblerev' ) );
}
@@ -3107,6 +3411,7 @@ class Article {
# Mark all reverted edits as bot
$set['rc_bot'] = 1;
}
+
if ( $wgUseRCPatrol ) {
# Mark all reverted edits as patrolled
$set['rc_patrolled'] = 1;
@@ -3143,11 +3448,14 @@ class Article {
# Save
$flags = EDIT_UPDATE;
- if ( $wgUser->isAllowed( 'minoredit' ) )
+ if ( $wgUser->isAllowed( 'minoredit' ) ) {
$flags |= EDIT_MINOR;
+ }
- if ( $bot && ( $wgUser->isAllowed( 'markbotedits' ) || $wgUser->isAllowed( 'bot' ) ) )
+ if ( $bot && ( $wgUser->isAllowed( 'markbotedits' ) || $wgUser->isAllowed( 'bot' ) ) ) {
$flags |= EDIT_FORCE_BOT;
+ }
+
# Actually store the edit
$status = $this->doEdit( $target->getText(), $summary, $flags, $target->getId() );
if ( !empty( $status->value['revision'] ) ) {
@@ -3164,6 +3472,7 @@ class Article {
'target' => $target,
'newid' => $revId
);
+
return array();
}
@@ -3171,7 +3480,8 @@ class Article {
* User interface for rollback operations
*/
public function rollback() {
- global $wgUser, $wgOut, $wgRequest, $wgUseRCPatrol;
+ global $wgUser, $wgOut, $wgRequest;
+
$details = null;
$result = $this->doRollback(
@@ -3186,26 +3496,31 @@ class Article {
$wgOut->rateLimited();
return;
}
+
if ( isset( $result[0][0] ) && ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' ) ) {
$wgOut->setPageTitle( wfMsg( 'rollbackfailed' ) );
$errArray = $result[0];
$errMsg = array_shift( $errArray );
$wgOut->addWikiMsgArray( $errMsg, $errArray );
+
if ( isset( $details['current'] ) ) {
$current = $details['current'];
+
if ( $current->getComment() != '' ) {
$wgOut->addWikiMsgArray( 'editcomment', array(
$wgUser->getSkin()->formatComment( $current->getComment() ) ), array( 'replaceafter' ) );
}
}
+
return;
}
+
# Display permissions errors before read-only message -- there's no
# point in misleading the user into thinking the inability to rollback
# is only temporary.
if ( !empty( $result ) && $result !== array( array( 'readonlytext' ) ) ) {
- # array_diff is completely broken for arrays of arrays, sigh. Re-
- # move any 'readonlytext' error manually.
+ # array_diff is completely broken for arrays of arrays, sigh.
+ # Remove any 'readonlytext' error manually.
$out = array();
foreach ( $result as $error ) {
if ( $error != array( 'readonlytext' ) ) {
@@ -3213,10 +3528,13 @@ class Article {
}
}
$wgOut->showPermissionsErrorPage( $out );
+
return;
}
+
if ( $result == array( array( 'readonlytext' ) ) ) {
$wgOut->readOnlyPage();
+
return;
}
@@ -3225,12 +3543,14 @@ class Article {
$newId = $details['newid'];
$wgOut->setPageTitle( wfMsg( 'actioncomplete' ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
+
if ( $current->getUserText() === '' ) {
$old = wfMsg( 'rev-deleted-user' );
} else {
$old = $wgUser->getSkin()->userLink( $current->getUser(), $current->getUserText() )
. $wgUser->getSkin()->userToolLinks( $current->getUser(), $current->getUserText() );
}
+
$new = $wgUser->getSkin()->userLink( $target->getUser(), $target->getUserText() )
. $wgUser->getSkin()->userToolLinks( $target->getUser(), $target->getUserText() );
$wgOut->addHTML( wfMsgExt( 'rollback-success', array( 'parse', 'replaceafter' ), $old, $new ) );
@@ -3242,7 +3562,6 @@ class Article {
}
}
-
/**
* Do standard deferred updates after page view
*/
@@ -3251,12 +3570,14 @@ class Article {
if ( wfReadOnly() ) {
return;
}
+
# Don't update page view counters on views from bot users (bug 14044)
if ( !$wgDisableCounters && !$wgUser->isAllowed( 'bot' ) && $this->getID() ) {
Article::incViewCount( $this->getID() );
$u = new SiteStatsUpdate( 1, 0, 0 );
array_push( $wgDeferredUpdateList, $u );
}
+
# Update newtalk / watchlist notification status
$wgUser->clearNotification( $this->mTitle );
}
@@ -3270,15 +3591,19 @@ class Article {
// Already prepared
return $this->mPreparedEdit;
}
+
global $wgParser;
+
$edit = (object)array();
$edit->revid = $revid;
$edit->newText = $text;
$edit->pst = $this->preSaveTransform( $text );
- $options = $this->getParserOptions();
- $edit->output = $wgParser->parse( $edit->pst, $this->mTitle, $options, true, true, $revid );
+ $edit->popts = $this->getParserOptions();
+ $edit->output = $wgParser->parse( $edit->pst, $this->mTitle, $edit->popts, true, true, $revid );
$edit->oldText = $this->getContent();
+
$this->mPreparedEdit = $edit;
+
return $edit;
}
@@ -3289,12 +3614,12 @@ class Article {
* Every 100th edit, prune the recent changes table.
*
* @private
- * @param $text New text of the article
- * @param $summary Edit summary
- * @param $minoredit Minor edit
+ * @param $text String: New text of the article
+ * @param $summary String: Edit summary
+ * @param $minoredit Boolean: Minor edit
* @param $timestamp_of_pagechange Timestamp associated with the page change
- * @param $newid rev_id value of the new revision
- * @param $changed Whether or not the content actually changed
+ * @param $newid Integer: rev_id value of the new revision
+ * @param $changed Boolean: Whether or not the content actually changed
*/
public function editUpdates( $text, $summary, $minoredit, $timestamp_of_pagechange, $newid, $changed = true ) {
global $wgDeferredUpdateList, $wgMessageCache, $wgUser, $wgEnableParserCache;
@@ -3313,9 +3638,8 @@ class Article {
# Save it to the parser cache
if ( $wgEnableParserCache ) {
- $popts = $this->getParserOptions();
$parserCache = ParserCache::singleton();
- $parserCache->save( $editInfo->output, $this, $popts );
+ $parserCache->save( $editInfo->output, $this, $editInfo->popts );
}
# Update the links tables
@@ -3329,10 +3653,12 @@ class Article {
// Flush old entries from the `recentchanges` table; we do this on
// random requests so as to avoid an increase in writes for no good reason
global $wgRCMaxAge;
+
$dbw = wfGetDB( DB_MASTER );
$cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
$recentchanges = $dbw->tableName( 'recentchanges' );
$sql = "DELETE FROM $recentchanges WHERE rc_timestamp < '{$cutoff}'";
+
$dbw->query( $sql );
}
}
@@ -3356,7 +3682,8 @@ class Article {
# load of user talk pages and piss people off, nor if it's a minor edit
# by a properly-flagged bot.
if ( $this->mTitle->getNamespace() == NS_USER_TALK && $shortTitle != $wgUser->getTitleKey() && $changed
- && !( $minoredit && $wgUser->isAllowed( 'nominornewtalk' ) ) ) {
+ && !( $minoredit && $wgUser->isAllowed( 'nominornewtalk' ) )
+ ) {
if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this ) ) ) {
$other = User::newFromName( $shortTitle, false );
if ( !$other ) {
@@ -3410,13 +3737,14 @@ class Article {
return;
}
- $unhide = $wgRequest->getInt( 'unhide' ) == 1 &&
- $wgUser->matchEditToken( $wgRequest->getVal( 'token' ), $oldid );
+ $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+
# Cascade unhide param in links for easy deletion browsing
$extraParams = array();
if ( $wgRequest->getVal( 'unhide' ) ) {
$extraParams['unhide'] = 1;
}
+
$revision = Revision::newFromId( $oldid );
$current = ( $oldid == $this->mLatest );
@@ -3496,6 +3824,7 @@ class Article {
);
$cdel = '';
+
// User can delete revisions or view deleted revisions...
$canHide = $wgUser->isAllowed( 'deleterevision' );
if ( $canHide || ( $revision->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) ) {
@@ -3534,6 +3863,7 @@ class Article {
"</div>\n" .
"\n\t\t\t\t<div id=\"mw-revision-nav\">" . $cdel . wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
$prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>\n\t\t\t";
+
$wgOut->setSubtitle( $r );
}
@@ -3541,10 +3871,13 @@ class Article {
* This function is called right before saving the wikitext,
* so we can do things like signatures and links-in-context.
*
- * @param $text String
+ * @param $text String article contents
+ * @return string article contents with altered wikitext markup (signatures
+ * converted, {{subst:}}, templates, etc.)
*/
public function preSaveTransform( $text ) {
global $wgParser, $wgUser;
+
return $wgParser->preSaveTransform( $text, $this->mTitle, $wgUser, ParserOptions::newFromUser( $wgUser ) );
}
@@ -3554,13 +3887,17 @@ class Article {
* checkLastModified returns true if it has taken care of all
* output to the client that is necessary for this request.
* (that is, it has sent a cached version of the page)
+ *
+ * @return boolean true if cached version send, false otherwise
*/
protected function tryFileCache() {
static $called = false;
+
if ( $called ) {
wfDebug( "Article::tryFileCache(): called twice!?\n" );
return false;
}
+
$called = true;
if ( $this->isFileCacheable() ) {
$cache = new HTMLFileCache( $this->mTitle );
@@ -3575,6 +3912,7 @@ class Article {
} else {
wfDebug( "Article::tryFileCache(): not cacheable\n" );
}
+
return false;
}
@@ -3584,45 +3922,51 @@ class Article {
*/
public function isFileCacheable() {
$cacheable = false;
+
if ( HTMLFileCache::useFileCache() ) {
- $cacheable = $this->getID() && !$this->mRedirectedFrom;
+ $cacheable = $this->getID() && !$this->mRedirectedFrom && !$this->mTitle->isRedirect();
// Extension may have reason to disable file caching on some pages.
if ( $cacheable ) {
$cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
}
}
+
return $cacheable;
}
/**
* Loads page_touched and returns a value indicating if it should be used
- *
+ * @return boolean true if not a redirect
*/
public function checkTouched() {
if ( !$this->mDataLoaded ) {
$this->loadPageData();
}
+
return !$this->mIsRedirect;
}
/**
* Get the page_touched field
+ * @return string containing GMT timestamp
*/
public function getTouched() {
- # Ensure that page data has been loaded
if ( !$this->mDataLoaded ) {
$this->loadPageData();
}
+
return $this->mTouched;
}
/**
* Get the page_latest field
+ * @return integer rev_id of current revision
*/
public function getLatest() {
if ( !$this->mDataLoaded ) {
$this->loadPageData();
}
+
return (int)$this->mLatest;
}
@@ -3648,6 +3992,7 @@ class Article {
$revision->insertOn( $dbw );
$this->updateRevisionOn( $dbw, $revision );
+ global $wgUser;
wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $wgUser ) );
wfProfileOut( __METHOD__ );
@@ -3660,6 +4005,7 @@ class Article {
*/
public static function incViewCount( $id ) {
$id = intval( $id );
+
global $wgHitcounterUpdateFreq;
$dbw = wfGetDB( DB_MASTER );
@@ -3670,6 +4016,7 @@ class Article {
if ( $wgHitcounterUpdateFreq <= 1 || $dbType == 'sqlite' ) {
$dbw->query( "UPDATE $pageTable SET page_counter = page_counter + 1 WHERE page_id = $id" );
+
return;
}
@@ -3682,12 +4029,14 @@ class Article {
if ( ( rand() % $checkfreq != 0 ) or ( $dbw->lastErrno() != 0 ) ) {
# Most of the time (or on SQL errors), skip row count check
$dbw->ignoreErrors( $oldignore );
+
return;
}
$res = $dbw->query( "SELECT COUNT(*) as n FROM $hitcounterTable" );
$row = $dbw->fetchObject( $res );
$rown = intval( $row->n );
+
if ( $rown >= $wgHitcounterUpdateFreq ) {
wfProfileIn( 'Article::incViewCount-collect' );
$old_user_abort = ignore_user_abort( true );
@@ -3699,11 +4048,11 @@ class Article {
'GROUP BY hc_id', __METHOD__ );
$dbw->delete( 'hitcounter', '*', __METHOD__ );
$dbw->unlockTables( __METHOD__ );
+
if ( $dbType == 'mysql' ) {
$dbw->query( "UPDATE $pageTable,$acchitsTable SET page_counter=page_counter + hc_n " .
'WHERE page_id = hc_id', __METHOD__ );
- }
- else {
+ } else {
$dbw->query( "UPDATE $pageTable SET page_counter=page_counter + hc_n " .
"FROM $acchitsTable WHERE page_id = hc_id", __METHOD__ );
}
@@ -3712,6 +4061,7 @@ class Article {
ignore_user_abort( $old_user_abort );
wfProfileOut( 'Article::incViewCount-collect' );
}
+
$dbw->ignoreErrors( $oldignore );
}
@@ -3733,6 +4083,7 @@ class Article {
} else {
$other = $title->getTalkPage();
}
+
$other->invalidateCache();
$other->purgeSquid();
@@ -3741,14 +4092,19 @@ class Article {
$title->deleteTitleProtection();
}
+ /**
+ * Clears caches when article is deleted
+ */
public static function onArticleDelete( $title ) {
global $wgMessageCache;
+
# Update existence markers on article/talk tabs...
if ( $title->isTalkPage() ) {
$other = $title->getSubjectPage();
} else {
$other = $title->getTalkPage();
}
+
$other->invalidateCache();
$other->purgeSquid();
@@ -3762,24 +4118,30 @@ class Article {
if ( $title->getNamespace() == NS_MEDIAWIKI ) {
$wgMessageCache->replace( $title->getDBkey(), false );
}
+
# Images
if ( $title->getNamespace() == NS_FILE ) {
$update = new HTMLCacheUpdate( $title, 'imagelinks' );
$update->doUpdate();
}
+
# User talk pages
if ( $title->getNamespace() == NS_USER_TALK ) {
$user = User::newFromName( $title->getText(), false );
$user->setNewtalk( false );
}
+
# Image redirects
RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
}
/**
* Purge caches on page update etc
+ *
+ * @param $title Title object
+ * @todo: verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
*/
- public static function onArticleEdit( $title, $flags = '' ) {
+ public static function onArticleEdit( $title ) {
global $wgDeferredUpdateList;
// Invalidate caches of articles which include this page
@@ -3836,6 +4198,7 @@ class Article {
: 'noarticletextanon';
$wgOut->addHTML( wfMsgExt( $msg, 'parse' ) );
}
+
$wgOut->addHTML( '</div>' );
} else {
$dbr = wfGetDB( DB_SLAVE );
@@ -3852,15 +4215,21 @@ class Article {
$pageInfo = $this->pageCountInfo( $page );
$talkInfo = $this->pageCountInfo( $page->getTalkPage() );
+
+ //FIXME: unescaped messages
$wgOut->addHTML( "<ul><li>" . wfMsg( "numwatchers", $wgLang->formatNum( $numwatchers ) ) . '</li>' );
$wgOut->addHTML( "<li>" . wfMsg( 'numedits', $wgLang->formatNum( $pageInfo['edits'] ) ) . '</li>' );
+
if ( $talkInfo ) {
$wgOut->addHTML( '<li>' . wfMsg( "numtalkedits", $wgLang->formatNum( $talkInfo['edits'] ) ) . '</li>' );
}
+
$wgOut->addHTML( '<li>' . wfMsg( "numauthors", $wgLang->formatNum( $pageInfo['authors'] ) ) . '</li>' );
+
if ( $talkInfo ) {
$wgOut->addHTML( '<li>' . wfMsg( 'numtalkauthors', $wgLang->formatNum( $talkInfo['authors'] ) ) . '</li>' );
}
+
$wgOut->addHTML( '</ul>' );
}
}
@@ -3870,13 +4239,15 @@ class Article {
* on a given page. If page does not exist, returns false.
*
* @param $title Title object
- * @return array
+ * @return mixed array or boolean false
*/
public function pageCountInfo( $title ) {
$id = $title->getArticleId();
+
if ( $id == 0 ) {
return false;
}
+
$dbr = wfGetDB( DB_SLAVE );
$rev_clause = array( 'rev_page' => $id );
$edits = $dbr->selectField(
@@ -3893,6 +4264,7 @@ class Article {
__METHOD__,
$this->getSelectOptions()
);
+
return array( 'edits' => $edits, 'authors' => $authors );
}
@@ -3905,20 +4277,23 @@ class Article {
public function getUsedTemplates() {
$result = array();
$id = $this->mTitle->getArticleID();
+
if ( $id == 0 ) {
return array();
}
+
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( array( 'templatelinks' ),
array( 'tl_namespace', 'tl_title' ),
array( 'tl_from' => $id ),
__METHOD__ );
+
if ( $res !== false ) {
foreach ( $res as $row ) {
$result[] = Title::makeTitle( $row->tl_namespace, $row->tl_title );
}
}
- $dbr->freeResult( $res );
+
return $result;
}
@@ -3931,21 +4306,24 @@ class Article {
public function getHiddenCategories() {
$result = array();
$id = $this->mTitle->getArticleID();
+
if ( $id == 0 ) {
return array();
}
+
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
array( 'cl_to' ),
array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
__METHOD__ );
+
if ( $res !== false ) {
foreach ( $res as $row ) {
$result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
}
}
- $dbr->freeResult( $res );
+
return $result;
}
@@ -3957,11 +4335,14 @@ class Article {
* @return string An appropriate autosummary, or an empty string.
*/
public static function getAutosummary( $oldtext, $newtext, $flags ) {
+ global $wgContLang;
+
# Decide what kind of autosummary is needed.
# Redirect autosummaries
$ot = Title::newFromRedirect( $oldtext );
$rt = Title::newFromRedirect( $newtext );
+
if ( is_object( $rt ) && ( !is_object( $ot ) || !$rt->equals( $ot ) || $ot->getFragment() != $rt->getFragment() ) ) {
return wfMsgForContent( 'autoredircomment', $rt->getFullText() );
}
@@ -3969,10 +4350,11 @@ class Article {
# New page autosummaries
if ( $flags & EDIT_NEW && strlen( $newtext ) ) {
# If they're making a new article, give its text, truncated, in the summary.
- global $wgContLang;
+
$truncatedtext = $wgContLang->truncate(
str_replace( "\n", ' ', $newtext ),
max( 0, 200 - strlen( wfMsgForContent( 'autosumm-new' ) ) ) );
+
return wfMsgForContent( 'autosumm-new', $truncatedtext );
}
@@ -3981,10 +4363,11 @@ class Article {
return wfMsgForContent( 'autosumm-blank' );
} elseif ( strlen( $oldtext ) > 10 * strlen( $newtext ) && strlen( $newtext ) < 500 ) {
# Removing more than 90% of the article
- global $wgContLang;
+
$truncatedtext = $wgContLang->truncate(
$newtext,
max( 0, 200 - strlen( wfMsgForContent( 'autosumm-replace' ) ) ) );
+
return wfMsgForContent( 'autosumm-replace', $truncatedtext );
}
@@ -4000,6 +4383,7 @@ class Article {
*
* @param $text String
* @param $cache Boolean
+ * @param $parserOptions mixed ParserOptions object, or boolean false
*/
public function outputWikiText( $text, $cache = true, $parserOptions = false ) {
global $wgOut;
@@ -4012,9 +4396,14 @@ class Article {
* This does all the heavy lifting for outputWikitext, except it returns the parser
* output instead of sending it straight to $wgOut. Makes things nice and simple for,
* say, embedding thread pages within a discussion system (LiquidThreads)
+ *
+ * @param $text string
+ * @param $cache boolean
+ * @param $parserOptions parsing options, defaults to false
+ * @return string containing parsed output
*/
public function getOutputFromWikitext( $text, $cache = true, $parserOptions = false ) {
- global $wgParser, $wgOut, $wgEnableParserCache, $wgUseFileCache;
+ global $wgParser, $wgEnableParserCache, $wgUseFileCache;
if ( !$parserOptions ) {
$parserOptions = $this->getParserOptions();
@@ -4031,33 +4420,46 @@ class Article {
$this->mTitle->getPrefixedDBkey() ) );
}
- if ( $wgEnableParserCache && $cache && $this && $this->mParserOutput->getCacheTime() != -1 ) {
+ if ( $wgEnableParserCache && $cache && $this->mParserOutput->isCacheable() ) {
$parserCache = ParserCache::singleton();
$parserCache->save( $this->mParserOutput, $this, $parserOptions );
}
+
// Make sure file cache is not used on uncacheable content.
// Output that has magic words in it can still use the parser cache
// (if enabled), though it will generally expire sooner.
- if ( $this->mParserOutput->getCacheTime() == -1 || $this->mParserOutput->containsOldMagic() ) {
+ if ( !$this->mParserOutput->isCacheable() || $this->mParserOutput->containsOldMagic() ) {
$wgUseFileCache = false;
}
+
$this->doCascadeProtectionUpdates( $this->mParserOutput );
+
return $this->mParserOutput;
}
/**
* Get parser options suitable for rendering the primary article wikitext
+ * @return mixed ParserOptions object or boolean false
*/
public function getParserOptions() {
global $wgUser;
+
if ( !$this->mParserOptions ) {
$this->mParserOptions = new ParserOptions( $wgUser );
$this->mParserOptions->setTidy( true );
$this->mParserOptions->enableLimitReport();
}
- return $this->mParserOptions;
+
+ // Clone to allow modifications of the return value without affecting
+ // the cache
+ return clone $this->mParserOptions;
}
+ /**
+ * Updates cascading protections
+ *
+ * @param $parserOutput mixed ParserOptions object, or boolean false
+ **/
protected function doCascadeProtectionUpdates( $parserOutput ) {
if ( !$this->isCurrent() || wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
return;
@@ -4079,9 +4481,9 @@ class Article {
$res = $dbr->select( array( 'templatelinks' ),
array( 'tl_namespace', 'tl_title' ),
array( 'tl_from' => $id ),
- __METHOD__ );
+ __METHOD__
+ );
- global $wgContLang;
foreach ( $res as $row ) {
$tlTemplates["{$row->tl_namespace}:{$row->tl_title}"] = true;
}
@@ -4095,7 +4497,6 @@ class Article {
}
# Get the diff
- # Note that we simulate array_diff_key in PHP <5.0.x
$templates_diff = array_diff_key( $poTemplates, $tlTemplates );
if ( count( $templates_diff ) > 0 ) {
@@ -4111,7 +4512,6 @@ class Article {
*
* @param $added array The names of categories that were added
* @param $deleted array The names of categories that were deleted
- * @return null
*/
public function updateCategoryCounts( $added, $deleted ) {
$ns = $this->mTitle->getNamespace();
@@ -4128,7 +4528,9 @@ class Article {
# Okay, nothing to do
return;
}
+
$insertRows = array();
+
foreach ( $insertCats as $cat ) {
$insertRows[] = array(
'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
@@ -4139,6 +4541,7 @@ class Article {
$addFields = array( 'cat_pages = cat_pages + 1' );
$removeFields = array( 'cat_pages = cat_pages - 1' );
+
if ( $ns == NS_CATEGORY ) {
$addFields[] = 'cat_subcats = cat_subcats + 1';
$removeFields[] = 'cat_subcats = cat_subcats - 1';
@@ -4155,6 +4558,7 @@ class Article {
__METHOD__
);
}
+
if ( $deleted ) {
$dbw->update(
'category',
@@ -4165,21 +4569,27 @@ class Article {
}
}
- /** Lightweight method to get the parser output for a page, checking the parser cache
+ /**
+ * Lightweight method to get the parser output for a page, checking the parser cache
* and so on. Doesn't consider most of the stuff that Article::view is forced to
* consider, so it's not appropriate to use there.
+ *
+ * @since 1.16 (r52326) for LiquidThreads
+ *
+ * @param $oldid mixed integer Revision ID or null
*/
- function getParserOutput( $oldid = null ) {
- global $wgEnableParserCache, $wgUser, $wgOut;
+ public function getParserOutput( $oldid = null ) {
+ global $wgEnableParserCache, $wgUser;
// Should the parser cache be used?
$useParserCache = $wgEnableParserCache &&
- intval( $wgUser->getOption( 'stubthreshold' ) ) == 0 &&
- $this->exists() &&
- $oldid === null;
+ $wgUser->getStubThreshold() == 0 &&
+ $this->exists() &&
+ $oldid === null;
wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
- if ( $wgUser->getOption( 'stubthreshold' ) ) {
+
+ if ( $wgUser->getStubThreshold() ) {
wfIncrStats( 'pcache_miss_stub' );
}
@@ -4197,4 +4607,66 @@ class Article {
return $parserOutput;
}
}
+
+ // Deprecated methods
+ /**
+ * Get the database which should be used for reads
+ *
+ * @return Database
+ * @deprecated - just call wfGetDB( DB_MASTER ) instead
+ */
+ function getDB() {
+ wfDeprecated( __METHOD__ );
+ return wfGetDB( DB_MASTER );
+ }
+
+}
+
+class PoolWorkArticleView extends PoolCounterWork {
+ private $mArticle;
+
+ function __construct( $article, $key, $useParserCache, $parserOptions ) {
+ parent::__construct( 'ArticleView', $key );
+ $this->mArticle = $article;
+ $this->cacheable = $useParserCache;
+ $this->parserOptions = $parserOptions;
+ }
+
+ function doWork() {
+ return $this->mArticle->doViewParse();
+ }
+
+ function getCachedWork() {
+ global $wgOut;
+
+ $parserCache = ParserCache::singleton();
+ $this->mArticle->mParserOutput = $parserCache->get( $this->mArticle, $this->parserOptions );
+
+ if ( $this->mArticle->mParserOutput !== false ) {
+ wfDebug( __METHOD__ . ": showing contents parsed by someone else\n" );
+ $wgOut->addParserOutput( $this->mArticle->mParserOutput );
+ # Ensure that UI elements requiring revision ID have
+ # the correct version information.
+ $wgOut->setRevisionId( $this->mArticle->getLatest() );
+ return true;
+ }
+ return false;
+ }
+
+ function fallback() {
+ return $this->mArticle->tryDirtyCache();
+ }
+
+ function error( $status ) {
+ global $wgOut;
+
+ $wgOut->clearHTML(); // for release() errors
+ $wgOut->enableClientCache( false );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
+
+ $errortext = $status->getWikiText( false, 'view-pool-error' );
+ $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+
+ return false;
+ }
}
diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php
index 87ac8adb..7dc99259 100644
--- a/includes/AuthPlugin.php
+++ b/includes/AuthPlugin.php
@@ -1,23 +1,27 @@
<?php
/**
+ * Authentication plugin interface
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
/**
* Authentication plugin interface. Instantiate a subclass of AuthPlugin
@@ -105,7 +109,6 @@ class AuthPlugin {
return true;
}
-
/**
* Return true if the wiki should create a new local account automatically
* when asked to login a user who doesn't exist locally but does in the
@@ -131,11 +134,11 @@ class AuthPlugin {
* @return Boolean
*/
public function allowPropChange( $prop = '' ) {
- if( $prop == 'realname' && is_callable( array( $this, 'allowRealNameChange' ) ) ) {
+ if ( $prop == 'realname' && is_callable( array( $this, 'allowRealNameChange' ) ) ) {
return $this->allowRealNameChange();
- } elseif( $prop == 'emailaddress' && is_callable( array( $this, 'allowEmailChange' ) ) ) {
+ } elseif ( $prop == 'emailaddress' && is_callable( array( $this, 'allowEmailChange' ) ) ) {
return $this->allowEmailChange();
- } elseif( $prop == 'nickname' && is_callable( array( $this, 'allowNickChange' ) ) ) {
+ } elseif ( $prop == 'nickname' && is_callable( array( $this, 'allowNickChange' ) ) ) {
return $this->allowNickChange();
} else {
return true;
@@ -197,11 +200,10 @@ class AuthPlugin {
* @param $realname String
* @return Boolean
*/
- public function addUser( $user, $password, $email='', $realname='' ) {
+ public function addUser( $user, $password, $email = '', $realname = '' ) {
return true;
}
-
/**
* Return true to prevent logins that don't authenticate here from being
* checked against the local database's password fields.
@@ -236,7 +238,7 @@ class AuthPlugin {
* @param $user User object.
* @param $autocreate Boolean: True if user is being autocreated on login
*/
- public function initUser( &$user, $autocreate=false ) {
+ public function initUser( &$user, $autocreate = false ) {
# Override this to do something.
}
@@ -247,7 +249,7 @@ class AuthPlugin {
public function getCanonicalName( $username ) {
return $username;
}
-
+
/**
* Get an instance of a User object
*
@@ -262,22 +264,22 @@ class AuthPluginUser {
function __construct( $user ) {
# Override this!
}
-
+
public function getId() {
# Override this!
return -1;
}
-
+
public function isLocked() {
# Override this!
return false;
}
-
+
public function isHidden() {
# Override this!
return false;
}
-
+
public function resetAuthToken() {
# Override this!
return true;
diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php
index cecb53f9..f1605a56 100644
--- a/includes/AutoLoader.php
+++ b/includes/AutoLoader.php
@@ -1,10 +1,17 @@
<?php
-/* This defines autoloading handler for whole MediaWiki framework */
+/**
+ * This defines autoloading handler for whole MediaWiki framework
+ *
+ * @file
+ */
-# Locations of core classes
-# Extension classes are specified with $wgAutoloadClasses
-# This array is a global instead of a static member of AutoLoader to work around a bug in APC
+/**
+ * Locations of core classes
+ * Extension classes are specified with $wgAutoloadClasses
+ * This array is a global instead of a static member of AutoLoader to work around a bug in APC
+ */
global $wgAutoloadLocalClasses;
+
$wgAutoloadLocalClasses = array(
# Includes
'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
@@ -20,6 +27,7 @@ $wgAutoloadLocalClasses = array(
'BagOStuff' => 'includes/BagOStuff.php',
'Block' => 'includes/Block.php',
'CacheDependency' => 'includes/CacheDependency.php',
+ 'CacheTime' => 'includes/parser/ParserOutput.php',
'Category' => 'includes/Category.php',
'Categoryfinder' => 'includes/Categoryfinder.php',
'CategoryPage' => 'includes/CategoryPage.php',
@@ -35,6 +43,7 @@ $wgAutoloadLocalClasses = array(
'ChangesFeed' => 'includes/ChangesFeed.php',
'ChangeTags' => 'includes/ChangeTags.php',
'ChannelFeed' => 'includes/Feed.php',
+ 'Collation' => 'includes/Collation.php',
'Cookie' => 'includes/HttpFunctions.php',
'CookieJar' => 'includes/HttpFunctions.php',
'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
@@ -44,12 +53,13 @@ $wgAutoloadLocalClasses = array(
'ConstantDependency' => 'includes/CacheDependency.php',
'CreativeCommonsRdf' => 'includes/Metadata.php',
'Credits' => 'includes/Credits.php',
+ 'CSSJanus' => 'includes/libs/CSSJanus.php',
+ 'CSSMin' => 'includes/libs/CSSMin.php',
'DBABagOStuff' => 'includes/BagOStuff.php',
'DependencyWrapper' => 'includes/CacheDependency.php',
'DiffHistoryBlob' => 'includes/HistoryBlob.php',
'DjVuImage' => 'includes/DjVuImage.php',
'DoubleReplacer' => 'includes/StringUtils.php',
- 'DoubleRedirectJob' => 'includes/DoubleRedirectJob.php',
'DublinCoreRdf' => 'includes/Metadata.php',
'Dump7ZipOutput' => 'includes/Export.php',
'DumpBZip2Output' => 'includes/Export.php',
@@ -64,10 +74,8 @@ $wgAutoloadLocalClasses = array(
'DumpPipeOutput' => 'includes/Export.php',
'eAccelBagOStuff' => 'includes/BagOStuff.php',
'EditPage' => 'includes/EditPage.php',
- 'EmaillingJob' => 'includes/EmaillingJob.php',
'EmailNotification' => 'includes/UserMailer.php',
'EnhancedChangesList' => 'includes/ChangesList.php',
- 'EnotifNotifyJob' => 'includes/EnotifNotifyJob.php',
'ErrorPageError' => 'includes/Exception.php',
'Exif' => 'includes/Exif.php',
'ExplodeIterator' => 'includes/StringUtils.php',
@@ -76,9 +84,6 @@ $wgAutoloadLocalClasses = array(
'ExternalStoreHttp' => 'includes/ExternalStoreHttp.php',
'ExternalStore' => 'includes/ExternalStore.php',
'ExternalUser' => 'includes/ExternalUser.php',
- 'ExternalUser_Hardcoded' => 'includes/extauth/Hardcoded.php',
- 'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
- 'ExternalUser_vB' => 'includes/extauth/vB.php',
'FatalError' => 'includes/Exception.php',
'FakeTitle' => 'includes/FakeTitle.php',
'FakeMemCachedClient' => 'includes/ObjectCache.php',
@@ -92,8 +97,6 @@ $wgAutoloadLocalClasses = array(
'ForkController' => 'includes/ForkController.php',
'FormatExif' => 'includes/Exif.php',
'FormOptions' => 'includes/FormOptions.php',
- 'GIFMetadataExtractor' => 'includes/media/GIFMetadataExtractor.php',
- 'GIFHandler' => 'includes/media/GIF.php',
'GlobalDependency' => 'includes/CacheDependency.php',
'HashBagOStuff' => 'includes/BagOStuff.php',
'HashtableReplacer' => 'includes/StringUtils.php',
@@ -122,8 +125,8 @@ $wgAutoloadLocalClasses = array(
'HTMLRadioField' => 'includes/HTMLForm.php',
'HTMLInfoField' => 'includes/HTMLForm.php',
'Http' => 'includes/HttpFunctions.php',
- 'HttpRequest' => 'includes/HttpFunctions.php',
- 'IEContentAnalyzer' => 'includes/IEContentAnalyzer.php',
+ 'HttpRequest' => 'includes/HttpFunctions.old.php',
+ 'IcuCollation' => 'includes/Collation.php',
'ImageGallery' => 'includes/ImageGallery.php',
'ImageHistoryList' => 'includes/ImagePage.php',
'ImageHistoryPseudoPager' => 'includes/ImagePage.php',
@@ -133,8 +136,7 @@ $wgAutoloadLocalClasses = array(
'IndexPager' => 'includes/Pager.php',
'Interwiki' => 'includes/Interwiki.php',
'IP' => 'includes/IP.php',
- 'Job' => 'includes/JobQueue.php',
- 'JSMin' => 'includes/JSMin.php',
+ 'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
'LCStore_DB' => 'includes/LocalisationCache.php',
'LCStore_CDB' => 'includes/LocalisationCache.php',
'LCStore_Null' => 'includes/LocalisationCache.php',
@@ -157,18 +159,18 @@ $wgAutoloadLocalClasses = array(
'MagicWord' => 'includes/MagicWord.php',
'MailAddress' => 'includes/UserMailer.php',
'MathRenderer' => 'includes/Math.php',
- 'MediaTransformError' => 'includes/MediaTransformOutput.php',
- 'MediaTransformOutput' => 'includes/MediaTransformOutput.php',
'MediaWikiBagOStuff' => 'includes/BagOStuff.php',
'MediaWiki_I18N' => 'includes/SkinTemplate.php',
'MediaWiki' => 'includes/Wiki.php',
'MemCachedClientforWiki' => 'includes/memcached-client.php',
+ 'Message' => 'includes/Message.php',
+ 'MessageBlobStore' => 'includes/MessageBlobStore.php',
'MessageCache' => 'includes/MessageCache.php',
'MimeMagic' => 'includes/MimeMagic.php',
'MWException' => 'includes/Exception.php',
+ 'MWHttpRequest' => 'includes/HttpFunctions.php',
'MWMemcached' => 'includes/memcached-client.php',
'MWNamespace' => 'includes/Namespace.php',
- 'Namespace' => 'includes/NamespaceCompat.php', // Compat
'OldChangesList' => 'includes/ChangesList.php',
'OutputPage' => 'includes/OutputPage.php',
'PageQueryPage' => 'includes/PageQueryPage.php',
@@ -177,8 +179,10 @@ $wgAutoloadLocalClasses = array(
'Pager' => 'includes/Pager.php',
'PasswordError' => 'includes/User.php',
'PatrolLog' => 'includes/PatrolLog.php',
+ 'PhpHttpRequest' => 'includes/HttpFunctions.php',
'PoolCounter' => 'includes/PoolCounter.php',
'PoolCounter_Stub' => 'includes/PoolCounter.php',
+ 'PoolCounterWork' => 'includes/PoolCounter.php',
'Preferences' => 'includes/Preferences.php',
'PrefixSearch' => 'includes/PrefixSearch.php',
'Profiler' => 'includes/Profiler.php',
@@ -192,13 +196,21 @@ $wgAutoloadLocalClasses = array(
'RCCacheEntry' => 'includes/ChangesList.php',
'RdfMetaData' => 'includes/Metadata.php',
'RecentChange' => 'includes/RecentChange.php',
- 'RefreshLinksJob' => 'includes/RefreshLinksJob.php',
- 'RefreshLinksJob2' => 'includes/RefreshLinksJob.php',
'RegexlikeReplacer' => 'includes/StringUtils.php',
'ReplacementArray' => 'includes/StringUtils.php',
'Replacer' => 'includes/StringUtils.php',
+ 'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
+ 'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
+ 'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
+ 'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
+ 'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
+ 'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
+ 'ResourceLoaderUserModule' => 'includes/resourceloader/ResourceLoaderUserModule.php',
+ 'ResourceLoaderUserOptionsModule' => 'includes/resourceloader/ResourceLoaderUserOptionsModule.php',
+ 'ResourceLoaderStartUpModule' => 'includes/resourceloader/ResourceLoaderStartUpModule.php',
'ReverseChronologicalPager' => 'includes/Pager.php',
'Revision' => 'includes/Revision.php',
+ 'RevisionDelete' => 'includes/revisiondelete/RevisionDelete.php',
'RSSFeed' => 'includes/Feed.php',
'Sanitizer' => 'includes/Sanitizer.php',
'SiteConfiguration' => 'includes/SiteConfiguration.php',
@@ -218,24 +230,17 @@ $wgAutoloadLocalClasses = array(
'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
'Status' => 'includes/Status.php',
'StubContLang' => 'includes/StubObject.php',
- 'StubUser' => 'includes/StubObject.php',
'StubUserLang' => 'includes/StubObject.php',
'StubObject' => 'includes/StubObject.php',
'StringUtils' => 'includes/StringUtils.php',
'TablePager' => 'includes/Pager.php',
- 'ThumbnailImage' => 'includes/MediaTransformOutput.php',
- 'TiffHandler' => 'includes/media/Tiff.php',
'TitleDependency' => 'includes/CacheDependency.php',
'Title' => 'includes/Title.php',
'TitleArray' => 'includes/TitleArray.php',
'TitleArrayFromResult' => 'includes/TitleArray.php',
'TitleListDependency' => 'includes/CacheDependency.php',
- 'TransformParameterError' => 'includes/MediaTransformOutput.php',
'UnlistedSpecialPage' => 'includes/SpecialPage.php',
- 'UploadBase' => 'includes/upload/UploadBase.php',
- 'UploadFromStash' => 'includes/upload/UploadFromStash.php',
- 'UploadFromFile' => 'includes/upload/UploadFromFile.php',
- 'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
+ 'UppercaseCollation' => 'includes/Collation.php',
'User' => 'includes/User.php',
'UserArray' => 'includes/UserArray.php',
'UserArrayFromResult' => 'includes/UserArray.php',
@@ -245,6 +250,7 @@ $wgAutoloadLocalClasses = array(
'WatchedItem' => 'includes/WatchedItem.php',
'WatchlistEditor' => 'includes/WatchlistEditor.php',
'WebRequest' => 'includes/WebRequest.php',
+ 'WebRequestUpload' => 'includes/WebRequest.php',
'WebResponse' => 'includes/WebResponse.php',
'WikiError' => 'includes/WikiError.php',
'WikiErrorMsg' => 'includes/WikiError.php',
@@ -252,9 +258,11 @@ $wgAutoloadLocalClasses = array(
'WikiMap' => 'includes/WikiMap.php',
'WikiReference' => 'includes/WikiMap.php',
'WikiXmlError' => 'includes/WikiError.php',
+ 'WinCacheBagOStuff' => 'includes/BagOStuff.php',
'XCacheBagOStuff' => 'includes/BagOStuff.php',
'XmlDumpWriter' => 'includes/Export.php',
'Xml' => 'includes/Xml.php',
+ 'XmlJsCode' => 'includes/Xml.php',
'XmlSelect' => 'includes/Xml.php',
'XmlTypeCheck' => 'includes/XmlTypeCheck.php',
'ZhClient' => 'includes/ZhClient.php',
@@ -270,6 +278,7 @@ $wgAutoloadLocalClasses = array(
'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
'ApiFormatDbg' => 'includes/api/ApiFormatDbg.php',
+ 'ApiFormatDump' => 'includes/api/ApiFormatDump.php',
'ApiFormatFeedWrapper' => 'includes/api/ApiFormatBase.php',
'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
@@ -292,6 +301,7 @@ $wgAutoloadLocalClasses = array(
'ApiPatrol' => 'includes/api/ApiPatrol.php',
'ApiProtect' => 'includes/api/ApiProtect.php',
'ApiPurge' => 'includes/api/ApiPurge.php',
+ 'ApiRsd' => 'includes/api/ApiRsd.php',
'ApiQuery' => 'includes/api/ApiQuery.php',
'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
'ApiQueryAllimages' => 'includes/api/ApiQueryAllimages.php',
@@ -310,20 +320,25 @@ $wgAutoloadLocalClasses = array(
'ApiQueryDisabled' => 'includes/api/ApiQueryDisabled.php',
'ApiQueryDuplicateFiles' => 'includes/api/ApiQueryDuplicateFiles.php',
'ApiQueryExtLinksUsage' => 'includes/api/ApiQueryExtLinksUsage.php',
+ 'ApiQueryFilearchive' => 'includes/api/ApiQueryFilearchive.php',
'ApiQueryExternalLinks' => 'includes/api/ApiQueryExternalLinks.php',
'ApiQueryGeneratorBase' => 'includes/api/ApiQueryBase.php',
'ApiQueryImageInfo' => 'includes/api/ApiQueryImageInfo.php',
'ApiQueryImages' => 'includes/api/ApiQueryImages.php',
'ApiQueryInfo' => 'includes/api/ApiQueryInfo.php',
+ 'ApiQueryIWLinks' => 'includes/api/ApiQueryIWLinks.php',
+ 'ApiQueryIWBacklinks' => 'includes/api/ApiQueryIWBacklinks.php',
'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+ 'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
- 'ApiQueryRecentChanges'=> 'includes/api/ApiQueryRecentChanges.php',
+ 'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php',
'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
+ 'ApiQueryStashImageInfo' => 'includes/api/ApiQueryStashImageInfo.php',
'ApiQueryTags' => 'includes/api/ApiQueryTags.php',
'ApiQueryUserInfo' => 'includes/api/ApiQueryUserInfo.php',
'ApiQueryUsers' => 'includes/api/ApiQueryUsers.php',
@@ -337,9 +352,13 @@ $wgAutoloadLocalClasses = array(
'ApiUpload' => 'includes/api/ApiUpload.php',
'ApiWatch' => 'includes/api/ApiWatch.php',
- 'Spyc' => 'includes/api/ApiFormatYaml_spyc.php',
'UsageException' => 'includes/api/ApiMain.php',
+ # includes/extauth
+ 'ExternalUser_Hardcoded' => 'includes/extauth/Hardcoded.php',
+ 'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
+ 'ExternalUser_vB' => 'includes/extauth/vB.php',
+
# includes/json
'Services_JSON' => 'includes/json/Services_JSON.php',
'Services_JSON_Error' => 'includes/json/Services_JSON.php',
@@ -356,23 +375,26 @@ $wgAutoloadLocalClasses = array(
'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
'DatabaseSqliteStandalone' => 'includes/db/DatabaseSqlite.php',
+ 'DatabaseType' => 'includes/db/Database.php',
'DBConnectionError' => 'includes/db/Database.php',
'DBError' => 'includes/db/Database.php',
'DBObject' => 'includes/db/Database.php',
'DBQueryError' => 'includes/db/Database.php',
'DBUnexpectedError' => 'includes/db/Database.php',
+ 'FakeResultWrapper' => 'includes/db/Database.php',
+ 'Field' => 'includes/db/Database.php',
'IBM_DB2Blob' => 'includes/db/DatabaseIbm_db2.php',
'LBFactory' => 'includes/db/LBFactory.php',
'LBFactory_Multi' => 'includes/db/LBFactory_Multi.php',
'LBFactory_Simple' => 'includes/db/LBFactory.php',
+ 'LBFactory_Single' => 'includes/db/LBFactory_Single.php',
'LikeMatch' => 'includes/db/Database.php',
'LoadBalancer' => 'includes/db/LoadBalancer.php',
+ 'LoadBalancer_Single' => 'includes/db/LBFactory_Single.php',
'LoadMonitor' => 'includes/db/LoadMonitor.php',
'LoadMonitor_MySQL' => 'includes/db/LoadMonitor.php',
- 'MSSQLField' => 'includes/db/DatabaseMssql.php',
- 'MySQLField' => 'includes/db/Database.php',
+ 'MySQLField' => 'includes/db/DatabaseMysql.php',
'MySQLMasterPos' => 'includes/db/DatabaseMysql.php',
- 'ORABlob' => 'includes/db/DatabaseOracle.php',
'ORAField' => 'includes/db/DatabaseOracle.php',
'ORAResult' => 'includes/db/DatabaseOracle.php',
'PostgresField' => 'includes/db/DatabasePostgres.php',
@@ -382,23 +404,23 @@ $wgAutoloadLocalClasses = array(
'IBM_DB2Field' => 'includes/db/DatabaseIbm_db2.php',
# includes/diff
- 'ArrayDiffFormatter' => 'includes/diff/DifferenceEngine.php',
- '_DiffEngine' => 'includes/diff/DifferenceEngine.php',
- 'DifferenceEngine' => 'includes/diff/DifferenceInterface.php',
- 'DiffFormatter' => 'includes/diff/DifferenceEngine.php',
- 'Diff' => 'includes/diff/DifferenceEngine.php',
- '_DiffOp_Add' => 'includes/diff/DifferenceEngine.php',
- '_DiffOp_Change' => 'includes/diff/DifferenceEngine.php',
- '_DiffOp_Copy' => 'includes/diff/DifferenceEngine.php',
- '_DiffOp_Delete' => 'includes/diff/DifferenceEngine.php',
- '_DiffOp' => 'includes/diff/DifferenceEngine.php',
- '_HWLDF_WordAccumulator' => 'includes/diff/DifferenceEngine.php',
- 'MappedDiff' => 'includes/diff/DifferenceEngine.php',
- 'RangeDifference' => 'includes/diff/Diff.php',
- 'TableDiffFormatter' => 'includes/diff/DifferenceEngine.php',
- 'UnifiedDiffFormatter' => 'includes/diff/DifferenceEngine.php',
- 'WikiDiff3' => 'includes/diff/Diff.php',
- 'WordLevelDiff' => 'includes/diff/DifferenceEngine.php',
+ 'ArrayDiffFormatter' => 'includes/diff/WikiDiff.php',
+ '_DiffEngine' => 'includes/diff/WikiDiff.php',
+ 'DifferenceEngine' => 'includes/diff/DifferenceEngine.php',
+ 'DiffFormatter' => 'includes/diff/WikiDiff.php',
+ 'Diff' => 'includes/diff/WikiDiff.php',
+ '_DiffOp_Add' => 'includes/diff/WikiDiff.php',
+ '_DiffOp_Change' => 'includes/diff/WikiDiff.php',
+ '_DiffOp_Copy' => 'includes/diff/WikiDiff.php',
+ '_DiffOp_Delete' => 'includes/diff/WikiDiff.php',
+ '_DiffOp' => 'includes/diff/WikiDiff.php',
+ '_HWLDF_WordAccumulator' => 'includes/diff/WikiDiff.php',
+ 'MappedDiff' => 'includes/diff/WikiDiff.php',
+ 'RangeDifference' => 'includes/diff/WikiDiff3.php',
+ 'TableDiffFormatter' => 'includes/diff/WikiDiff.php',
+ 'UnifiedDiffFormatter' => 'includes/diff/WikiDiff.php',
+ 'WikiDiff3' => 'includes/diff/WikiDiff3.php',
+ 'WordLevelDiff' => 'includes/diff/WikiDiff.php',
# includes/filerepo
'ArchivedFile' => 'includes/filerepo/ArchivedFile.php',
@@ -421,14 +443,59 @@ $wgAutoloadLocalClasses = array(
'RepoGroup' => 'includes/filerepo/RepoGroup.php',
'UnregisteredLocalFile' => 'includes/filerepo/UnregisteredLocalFile.php',
+ # includes/installer
+ 'CliInstaller' => 'includes/installer/CliInstaller.php',
+ 'Installer' => 'includes/installer/Installer.php',
+ 'DatabaseInstaller' => 'includes/installer/DatabaseInstaller.php',
+ 'DatabaseUpdater' => 'includes/installer/DatabaseUpdater.php',
+ 'LBFactory_InstallerFake' => 'includes/installer/Installer.php',
+ 'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
+ 'WebInstaller' => 'includes/installer/WebInstaller.php',
+ 'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
+ 'WebInstallerOutput' => 'includes/installer/WebInstallerOutput.php',
+ 'MysqlInstaller' => 'includes/installer/MysqlInstaller.php',
+ 'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
+ 'PhpXmlBugTester' => 'includes/installer/PhpBugTests.php',
+ 'PhpRefCallBugTester' => 'includes/installer/PhpBugTests.php',
+ 'PostgresInstaller' => 'includes/installer/PostgresInstaller.php',
+ 'PostgresUpdater' => 'includes/installer/PostgresUpdater.php',
+ 'SqliteInstaller' => 'includes/installer/SqliteInstaller.php',
+ 'SqliteUpdater' => 'includes/installer/SqliteUpdater.php',
+ 'OracleInstaller' => 'includes/installer/OracleInstaller.php',
+ 'OracleUpdater' => 'includes/installer/OracleUpdater.php',
+
+ # includes/job
+ 'DoubleRedirectJob' => 'includes/job/DoubleRedirectJob.php',
+ 'EmaillingJob' => 'includes/job/EmaillingJob.php',
+ 'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
+ 'Job' => 'includes/job/JobQueue.php',
+ 'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
+ 'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
+ 'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
+
+ # includes/libs
+ 'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
+ 'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
+ 'Spyc' => 'includes/libs/spyc.php',
+
# includes/media
'BitmapHandler' => 'includes/media/Bitmap.php',
'BitmapHandler_ClientOnly' => 'includes/media/Bitmap_ClientOnly.php',
'BmpHandler' => 'includes/media/BMP.php',
'DjVuHandler' => 'includes/media/DjVu.php',
+ 'GIFHandler' => 'includes/media/GIF.php',
+ 'GIFMetadataExtractor' => 'includes/media/GIFMetadataExtractor.php',
'ImageHandler' => 'includes/media/Generic.php',
'MediaHandler' => 'includes/media/Generic.php',
+ 'MediaTransformError' => 'includes/media/MediaTransformOutput.php',
+ 'MediaTransformOutput' => 'includes/media/MediaTransformOutput.php',
+ 'PNGHandler' => 'includes/media/PNG.php',
+ 'PNGMetadataExtractor' => 'includes/media/PNGMetadataExtractor.php',
'SvgHandler' => 'includes/media/SVG.php',
+ 'SVGMetadataExtractor' => 'includes/media/SVGMetadataExtractor.php',
+ 'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
+ 'TiffHandler' => 'includes/media/Tiff.php',
+ 'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
# includes/normal
'UtfNormal' => 'includes/normal/UtfNormal.php',
@@ -481,7 +548,7 @@ $wgAutoloadLocalClasses = array(
'SearchEngine' => 'includes/search/SearchEngine.php',
'SearchHighlighter' => 'includes/search/SearchEngine.php',
'SearchIBM_DB2' => 'includes/search/SearchIBM_DB2.php',
- 'SearchMySQL4' => 'includes/search/SearchMySQL4.php',
+ 'SearchMssql' => 'includes/search/SearchMssql.php',
'SearchMySQL' => 'includes/search/SearchMySQL.php',
'SearchOracle' => 'includes/search/SearchOracle.php',
'SearchPostgres' => 'includes/search/SearchPostgres.php',
@@ -510,8 +577,7 @@ $wgAutoloadLocalClasses = array(
'DoubleRedirectsPage' => 'includes/specials/SpecialDoubleRedirects.php',
'EmailConfirmation' => 'includes/specials/SpecialConfirmemail.php',
'EmailInvalidation' => 'includes/specials/SpecialConfirmemail.php',
- 'EmailUserForm' => 'includes/specials/SpecialEmailuser.php',
- 'FakeResultWrapper' => 'includes/specials/SpecialAllmessages.php',
+ 'SpecialEmailUser' => 'includes/specials/SpecialEmailuser.php',
'FewestrevisionsPage' => 'includes/specials/SpecialFewestrevisions.php',
'FileDuplicateSearchPage' => 'includes/specials/SpecialFileDuplicateSearch.php',
'IPBlockForm' => 'includes/specials/SpecialBlockip.php',
@@ -541,35 +607,50 @@ $wgAutoloadLocalClasses = array(
'PreferencesForm' => 'includes/Preferences.php',
'RandomPage' => 'includes/specials/SpecialRandompage.php',
'SpecialRevisionDelete' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevisionDeleter' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_RevisionList' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_RevisionItem' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_ArchiveList' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_ArchiveItem' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_FileList' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_FileItem' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_ArchivedFileList' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_ArchivedFileItem' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_LogList' => 'includes/specials/SpecialRevisiondelete.php',
- 'RevDel_LogItem' => 'includes/specials/SpecialRevisiondelete.php',
+ 'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
+ 'RevDel_List' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+ 'RevDel_Item' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+ 'RevDel_RevisionList' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_RevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_ArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_ArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_FileList' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_FileItem' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_ArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_ArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_LogList' => 'includes/revisiondelete/RevisionDelete.php',
+ 'RevDel_LogItem' => 'includes/revisiondelete/RevisionDelete.php',
'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
+ 'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
+ 'SpecialCategories' => 'includes/specials/SpecialCategories.php',
+ 'SpecialComparePages' => 'includes/specials/SpecialComparePages.php',
'SpecialExport' => 'includes/specials/SpecialExport.php',
+ 'SpecialFilepath' => 'includes/specials/SpecialFilepath.php',
'SpecialImport' => 'includes/specials/SpecialImport.php',
'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
+ 'SpecialLockdb' => 'includes/specials/SpecialLockdb.php',
+ 'SpecialLog' => 'includes/specials/SpecialLog.php',
+ 'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
'SpecialMostlinkedtemplates' => 'includes/specials/SpecialMostlinkedtemplates.php',
'SpecialPreferences' => 'includes/specials/SpecialPreferences.php',
'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
+ 'SpecialProtectedpages' => 'includes/specials/SpecialProtectedpages.php',
+ 'SpecialProtectedtitles' => 'includes/specials/SpecialProtectedtitles.php',
'SpecialRandomredirect' => 'includes/specials/SpecialRandomredirect.php',
'SpecialRecentChanges' => 'includes/specials/SpecialRecentchanges.php',
'SpecialRecentchangeslinked' => 'includes/specials/SpecialRecentchangeslinked.php',
'SpecialSearch' => 'includes/specials/SpecialSearch.php',
+ 'SpecialUploadStash' => 'includes/specials/SpecialUploadStash.php',
+ 'SpecialSpecialpages' => 'includes/specials/SpecialSpecialpages.php',
'SpecialStatistics' => 'includes/specials/SpecialStatistics.php',
'SpecialTags' => 'includes/specials/SpecialTags.php',
+ 'SpecialUnlockdb' => 'includes/specials/SpecialUnlockdb.php',
'SpecialUpload' => 'includes/specials/SpecialUpload.php',
+ 'SpecialUserlogout' => 'includes/specials/SpecialUserlogout.php',
'SpecialVersion' => 'includes/specials/SpecialVersion.php',
'SpecialWhatlinkshere' => 'includes/specials/SpecialWhatlinkshere.php',
'SpecialWhatLinksHere' => 'includes/specials/SpecialWhatlinkshere.php',
@@ -598,18 +679,66 @@ $wgAutoloadLocalClasses = array(
'UsercreateTemplate' => 'includes/templates/Userlogin.php',
'UserloginTemplate' => 'includes/templates/Userlogin.php',
+ # includes/upload
+ 'UploadBase' => 'includes/upload/UploadBase.php',
+ 'UploadFromStash' => 'includes/upload/UploadFromStash.php',
+ 'UploadFromFile' => 'includes/upload/UploadFromFile.php',
+ 'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
+ 'UploadStash' => 'includes/upload/UploadStash.php',
+ 'UploadStashFile' => 'includes/upload/UploadStash.php',
+ 'UploadStashNotAvailableException' => 'includes/upload/UploadStash.php',
+ 'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
+ 'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
+ 'UploadStashBadVersionException' => 'includes/upload/UploadStash.php',
+ 'UploadStashFileException' => 'includes/upload/UploadStash.php',
+ 'UploadStashZeroLengthFileException' => 'includes/upload/UploadStash.php',
+
# languages
'Language' => 'languages/Language.php',
'FakeConverter' => 'languages/Language.php',
'LanguageConverter' => 'languages/LanguageConverter.php',
+ # maintenance
+ 'AnsiTermColorer' => 'maintenance/tests/testHelpers.inc',
+ 'ConvertLinks' => 'maintenance/convertLinks.php',
+ 'DbTestPreviewer' => 'maintenance/tests/testHelpers.inc',
+ 'DbTestRecorder' => 'maintenance/tests/testHelpers.inc',
+ 'DeleteArchivedFilesImplementation' => 'maintenance/deleteArchivedFiles.inc',
+ 'DeleteArchivedRevisionsImplementation' => 'maintenance/deleteArchivedRevisions.inc',
+ 'DeleteDefaultMessages' => 'maintenance/deleteDefaultMessages.php',
+ 'DummyTermColorer' => 'maintenance/tests/testHelpers.inc',
+ 'ParserTest' => 'maintenance/tests/parser/parserTest.inc',
+ 'ParserTestParserHook' => 'maintenance/tests/parser/parserTestsParserHook.php',
+ 'ParserTestStaticParserHook' => 'maintenance/tests/parser/parserTestsStaticParserHook.php',
+ 'PopulateCategory' => 'maintenance/populateCategory.php',
+ 'PopulateLogSearch' => 'maintenance/populateLogSearch.php',
+ 'PopulateLogUsertext' => 'maintenance/populateLogUsertext.php',
+ 'PopulateParentId' => 'maintenance/populateParentId.php',
+ 'PopulateRevisionLength' => 'maintenance/populateRevisionLength.php',
+ 'RemoteTestRecorder' => 'maintenance/tests/testHelpers.inc',
+ 'SevenZipStream' => 'maintenance/7zip.inc',
+ 'Sqlite' => 'maintenance/sqlite.inc',
+ 'TestFileIterator' => 'maintenance/tests/testHelpers.inc',
+ 'TestRecorder' => 'maintenance/tests/testHelpers.inc',
+ 'UpdateCollation' => 'maintenance/updateCollation.php',
+ 'UpdateRestrictions' => 'maintenance/updateRestrictions.php',
+ 'UserDupes' => 'maintenance/userDupes.inc',
+
+ # maintenance/tests/selenium
+ 'Selenium' => 'maintenance/tests/selenium/Selenium.php',
+ 'SeleniumLoader' => 'maintenance/tests/selenium/SeleniumLoader.php',
+ 'SeleniumTestCase' => 'maintenance/tests/selenium/SeleniumTestCase.php',
+ 'SeleniumTestConsoleLogger' => 'maintenance/tests/selenium/SeleniumTestConsoleLogger.php',
+ 'SeleniumTestHTMLLogger' => 'maintenance/tests/selenium/SeleniumTestHTMLLogger.php',
+ 'SeleniumTestListener' => 'maintenance/tests/selenium/SeleniumTestListener.php',
+ 'SeleniumTestSuite' => 'maintenance/tests/selenium/SeleniumTestSuite.php',
+ 'SeleniumConfig' => 'maintenance/tests/selenium/SeleniumConfig.php',
+
# maintenance/language
+ 'csvStatsOutput' => 'maintenance/language/StatOutputs.php',
'statsOutput' => 'maintenance/language/StatOutputs.php',
- 'wikiStatsOutput' => 'maintenance/language/StatOutputs.php',
'textStatsOutput' => 'maintenance/language/StatOutputs.php',
- 'csvStatsOutput' => 'maintenance/language/StatOutputs.php',
- 'SevenZipStream' => 'maintenance/7zip.inc',
-
+ 'wikiStatsOutput' => 'maintenance/language/StatOutputs.php',
);
class AutoLoader {
@@ -633,14 +762,18 @@ class AutoLoader {
# The case can sometimes be wrong when unserializing PHP 4 objects
$filename = false;
$lowerClass = strtolower( $className );
+
foreach ( $wgAutoloadLocalClasses as $class2 => $file2 ) {
if ( strtolower( $class2 ) == $lowerClass ) {
$filename = $file2;
}
}
+
if ( !$filename ) {
- if( function_exists( 'wfDebug' ) )
+ if ( function_exists( 'wfDebug' ) ) {
wfDebug( "Class {$className} not found; skipped loading\n" );
+ }
+
# Give up
return false;
}
@@ -651,15 +784,17 @@ class AutoLoader {
global $IP;
$filename = "$IP/$filename";
}
+
require( $filename );
+
return true;
}
static function loadAllExtensions() {
global $wgAutoloadClasses;
- foreach( $wgAutoloadClasses as $class => $file ) {
- if( !( class_exists( $class, false ) || interface_exists( $class, false ) ) ) {
+ foreach ( $wgAutoloadClasses as $class => $file ) {
+ if ( !( class_exists( $class, false ) || interface_exists( $class, false ) ) ) {
require( $file );
}
}
@@ -677,10 +812,6 @@ class AutoLoader {
}
}
-function wfLoadAllExtensions() {
- AutoLoader::loadAllExtensions();
-}
-
if ( function_exists( 'spl_autoload_register' ) ) {
spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
} else {
diff --git a/includes/Autopromote.php b/includes/Autopromote.php
index c0adff43..b4d89b24 100644
--- a/includes/Autopromote.php
+++ b/includes/Autopromote.php
@@ -3,6 +3,7 @@
* This class checks if user can get extra rights
* because of conditions specified in $wgAutopromote
*/
+
class Autopromote {
/**
* Get the groups for the given user based on $wgAutopromote.
@@ -12,10 +13,13 @@ class Autopromote {
*/
public static function getAutopromoteGroups( User $user ) {
global $wgAutopromote;
+
$promote = array();
- foreach( $wgAutopromote as $group => $cond ) {
- if( self::recCheckCondition( $cond, $user ) )
+
+ foreach ( $wgAutopromote as $group => $cond ) {
+ if ( self::recCheckCondition( $cond, $user ) ) {
$promote[] = $group;
+ }
}
wfRunHooks( 'GetAutoPromoteGroups', array( $user, &$promote ) );
@@ -41,38 +45,52 @@ class Autopromote {
*/
private static function recCheckCondition( $cond, User $user ) {
$validOps = array( '&', '|', '^', '!' );
- if( is_array( $cond ) && count( $cond ) >= 2 && in_array( $cond[0], $validOps ) ) {
+
+ if ( is_array( $cond ) && count( $cond ) >= 2 && in_array( $cond[0], $validOps ) ) {
# Recursive condition
- if( $cond[0] == '&' ) {
- foreach( array_slice( $cond, 1 ) as $subcond )
- if( !self::recCheckCondition( $subcond, $user ) )
+ if ( $cond[0] == '&' ) {
+ foreach ( array_slice( $cond, 1 ) as $subcond ) {
+ if ( !self::recCheckCondition( $subcond, $user ) ) {
return false;
+ }
+ }
+
return true;
- } elseif( $cond[0] == '|' ) {
- foreach( array_slice( $cond, 1 ) as $subcond )
- if( self::recCheckCondition( $subcond, $user ) )
+ } elseif ( $cond[0] == '|' ) {
+ foreach ( array_slice( $cond, 1 ) as $subcond ) {
+ if ( self::recCheckCondition( $subcond, $user ) ) {
return true;
+ }
+ }
+
return false;
- } elseif( $cond[0] == '^' ) {
+ } elseif ( $cond[0] == '^' ) {
$res = null;
- foreach( array_slice( $cond, 1 ) as $subcond ) {
- if( is_null( $res ) )
+ foreach ( array_slice( $cond, 1 ) as $subcond ) {
+ if ( is_null( $res ) ) {
$res = self::recCheckCondition( $subcond, $user );
- else
- $res = ($res xor self::recCheckCondition( $subcond, $user ));
+ } else {
+ $res = ( $res xor self::recCheckCondition( $subcond, $user ) );
+ }
}
+
return $res;
- } elseif ( $cond[0] = '!' ) {
- foreach( array_slice( $cond, 1 ) as $subcond )
- if( self::recCheckCondition( $subcond, $user ) )
+ } elseif ( $cond[0] == '!' ) {
+ foreach ( array_slice( $cond, 1 ) as $subcond ) {
+ if ( self::recCheckCondition( $subcond, $user ) ) {
return false;
+ }
+ }
+
return true;
}
}
# If we got here, the array presumably does not contain other condi-
# tions; it's not recursive. Pass it off to self::checkCondition.
- if( !is_array( $cond ) )
+ if ( !is_array( $cond ) ) {
$cond = array( $cond );
+ }
+
return self::checkCondition( $cond, $user );
}
@@ -87,13 +105,15 @@ class Autopromote {
* @return bool Whether the condition is true for the user
*/
private static function checkCondition( $cond, User $user ) {
- if( count( $cond ) < 1 )
+ global $wgEmailAuthentication;
+ if ( count( $cond ) < 1 ) {
return false;
+ }
+
switch( $cond[0] ) {
case APCOND_EMAILCONFIRMED:
- if( User::isValidEmailAddr( $user->getEmail() ) ) {
- global $wgEmailAuthentication;
- if( $wgEmailAuthentication ) {
+ if ( User::isValidEmailAddr( $user->getEmail() ) ) {
+ if ( $wgEmailAuthentication ) {
return (bool)$user->getEmailAuthenticationTimestamp();
} else {
return true;
@@ -120,10 +140,11 @@ class Autopromote {
default:
$result = null;
wfRunHooks( 'AutopromoteCondition', array( $cond[0], array_slice( $cond, 1 ), $user, &$result ) );
- if( $result === null ) {
+ if ( $result === null ) {
throw new MWException( "Unrecognized condition {$cond[0]} for autopromotion!" );
}
- return $result ? true : false;
+
+ return (bool)$result;
}
}
}
diff --git a/includes/BacklinkCache.php b/includes/BacklinkCache.php
index 53f92dd9..02b0f170 100644
--- a/includes/BacklinkCache.php
+++ b/includes/BacklinkCache.php
@@ -22,6 +22,14 @@ class BacklinkCache {
}
/**
+ * Serialization handler, diasallows to serialize the database to prevent
+ * failures after this class is deserialized from cache with dead DB connection.
+ */
+ function __sleep() {
+ return array( 'partitionCache', 'fullResultCache', 'title' );
+ }
+
+ /**
* Clear locally stored data
*/
function clear() {
@@ -41,6 +49,7 @@ class BacklinkCache {
if ( !isset( $this->db ) ) {
$this->db = wfGetDB( DB_SLAVE );
}
+
return $this->db;
}
@@ -60,14 +69,17 @@ class BacklinkCache {
// Partial range, not cached
wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
$conds = $this->getConditions( $table );
+
// Use the from field in the condition rather than the joined page_id,
// because databases are stupid and don't necessarily propagate indexes.
if ( $startId ) {
$conds[] = "$fromField >= " . intval( $startId );
}
+
if ( $endId ) {
$conds[] = "$fromField <= " . intval( $endId );
}
+
$res = $this->getDB()->select(
array( $table, 'page' ),
array( 'page_namespace', 'page_title', 'page_id' ),
@@ -78,6 +90,7 @@ class BacklinkCache {
'ORDER BY' => $fromField
) );
$ta = TitleArray::newFromResult( $res );
+
wfProfileOut( __METHOD__ );
return $ta;
}
@@ -95,7 +108,9 @@ class BacklinkCache {
) );
$this->fullResultCache[$table] = $res;
}
+
$ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
+
wfProfileOut( __METHOD__ );
return $ta;
}
@@ -150,6 +165,7 @@ class BacklinkCache {
default:
throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
}
+
return $conds;
}
@@ -167,6 +183,7 @@ class BacklinkCache {
}
$titleArray = $this->getLinks( $table );
+
return $titleArray->count();
}
@@ -193,29 +210,35 @@ class BacklinkCache {
if ( isset( $this->fullResultCache[$table] ) ) {
$cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
wfDebug( __METHOD__ . ": got from full result cache\n" );
+
return $cacheEntry['batches'];
}
// Try memcached
global $wgMemc;
+
$memcKey = wfMemcKey(
'backlinks',
md5( $this->title->getPrefixedDBkey() ),
$table,
$batchSize
);
+
$memcValue = $wgMemc->get( $memcKey );
if ( is_array( $memcValue ) ) {
$cacheEntry = $memcValue;
wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
+
return $cacheEntry['batches'];
}
+
// Fetch from database
$this->getLinks( $table );
$cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
// Save to memcached
$wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
+
wfDebug( __METHOD__ . ": got from database\n" );
return $cacheEntry['batches'];
}
@@ -254,6 +277,7 @@ class BacklinkCache {
$batches[] = array( $start, $end );
}
+
return array( 'numRows' => $numRows, 'batches' => $batches );
}
}
diff --git a/includes/BagOStuff.php b/includes/BagOStuff.php
index ac0263d8..63c96de7 100644
--- a/includes/BagOStuff.php
+++ b/includes/BagOStuff.php
@@ -1,31 +1,34 @@
<?php
-#
-# Copyright (C) 2003-2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
- * @defgroup Cache Cache
+ * Classes to cache objects in PHP accelerators, SQL database or DBA files
+ *
+ * Copyright © 2003-2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Cache
*/
/**
+ * @defgroup Cache Cache
+ */
+
+/**
* interface is intended to be more or less compatible with
* the PHP memcached client.
*
@@ -102,8 +105,9 @@ abstract class BagOStuff {
}
public function add( $key, $value, $exptime = 0 ) {
- if ( $this->get( $key ) == false ) {
+ if ( !$this->get( $key ) ) {
$this->set( $key, $value, $exptime );
+
return true;
}
}
@@ -126,18 +130,24 @@ abstract class BagOStuff {
}
}
+ /**
+ * @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
+ */
public function incr( $key, $value = 1 ) {
if ( !$this->lock( $key ) ) {
- return false;
+ return null;
}
+
$value = intval( $value );
- $n = false;
if ( ( $n = $this->get( $key ) ) !== false ) {
$n += $value;
$this->set( $key, $n ); // exptime?
}
$this->unlock( $key );
+
return $n;
}
@@ -146,15 +156,16 @@ abstract class BagOStuff {
}
public function debug( $text ) {
- if ( $this->debugMode )
+ if ( $this->debugMode ) {
wfDebug( "BagOStuff debug: $text\n" );
+ }
}
/**
* Convert an optionally relative time to an absolute time
*/
protected function convertExpiry( $exptime ) {
- if ( ( $exptime != 0 ) && ( $exptime < 3600 * 24 * 30 ) ) {
+ if ( ( $exptime != 0 ) && ( $exptime < 86400 * 3650 /* 10 years */ ) ) {
return time() + $exptime;
} else {
return $exptime;
@@ -178,10 +189,13 @@ class HashBagOStuff extends BagOStuff {
protected function expire( $key ) {
$et = $this->bag[$key][1];
+
if ( ( $et == 0 ) || ( $et > time() ) ) {
return false;
}
+
$this->delete( $key );
+
return true;
}
@@ -189,9 +203,11 @@ class HashBagOStuff extends BagOStuff {
if ( !isset( $this->bag[$key] ) ) {
return false;
}
+
if ( $this->expire( $key ) ) {
return false;
}
+
return $this->bag[$key][0];
}
@@ -203,7 +219,9 @@ class HashBagOStuff extends BagOStuff {
if ( !isset( $this->bag[$key] ) ) {
return false;
}
+
unset( $this->bag[$key] );
+
return true;
}
@@ -223,6 +241,7 @@ class SqlBagOStuff extends BagOStuff {
protected function getDB() {
global $wgDBtype;
+
if ( !isset( $this->db ) ) {
/* We must keep a separate connection to MySQL in order to avoid deadlocks
* However, SQLite has an opposite behaviour.
@@ -236,6 +255,7 @@ class SqlBagOStuff extends BagOStuff {
$this->db->clearFlag( DBO_TRX );
}
}
+
return $this->db;
}
@@ -245,12 +265,14 @@ class SqlBagOStuff extends BagOStuff {
$db = $this->getDB();
$row = $db->selectRow( 'objectcache', array( 'value', 'exptime' ),
array( 'keyname' => $key ), __METHOD__ );
+
if ( !$row ) {
$this->debug( 'get: no matching rows' );
return false;
}
$this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+
if ( $this->isExpired( $row->exptime ) ) {
$this->debug( "get: key has expired, deleting" );
try {
@@ -266,26 +288,35 @@ class SqlBagOStuff extends BagOStuff {
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
}
+
return false;
}
+
return $this->unserialize( $db->decodeBlob( $row->value ) );
}
public function set( $key, $value, $exptime = 0 ) {
$db = $this->getDB();
$exptime = intval( $exptime );
- if ( $exptime < 0 ) $exptime = 0;
+
+ if ( $exptime < 0 ) {
+ $exptime = 0;
+ }
+
if ( $exptime == 0 ) {
$encExpiry = $this->getMaxDateTime();
} else {
- if ( $exptime < 3.16e8 ) # ~10 years
+ if ( $exptime < 3.16e8 ) { # ~10 years
$exptime += time();
+ }
+
$encExpiry = $db->timestamp( $exptime );
}
try {
$db->begin();
- $db->delete( 'objectcache', array( 'keyname' => $key ), __METHOD__ );
- $db->insert( 'objectcache',
+ // (bug 24425) use a replace if the db supports it instead of
+ // delete/insert to avoid clashes with conflicting keynames
+ $db->replace( 'objectcache', array( 'keyname' ),
array(
'keyname' => $key,
'value' => $db->encodeBlob( $this->serialize( $value ) ),
@@ -294,21 +325,26 @@ class SqlBagOStuff extends BagOStuff {
$db->commit();
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
+
return false;
}
+
return true;
}
public function delete( $key, $time = 0 ) {
$db = $this->getDB();
+
try {
$db->begin();
$db->delete( 'objectcache', array( 'keyname' => $key ), __METHOD__ );
$db->commit();
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
+
return false;
}
+
return true;
}
@@ -323,13 +359,15 @@ class SqlBagOStuff extends BagOStuff {
if ( $row === false ) {
// Missing
$db->commit();
- return false;
+
+ return null;
}
$db->delete( 'objectcache', array( 'keyname' => $key ), __METHOD__ );
if ( $this->isExpired( $row->exptime ) ) {
// Expired, do not reinsert
$db->commit();
- return false;
+
+ return null;
}
$oldValue = intval( $this->unserialize( $db->decodeBlob( $row->value ) ) );
@@ -339,12 +377,19 @@ class SqlBagOStuff extends BagOStuff {
'keyname' => $key,
'value' => $db->encodeBlob( $this->serialize( $newValue ) ),
'exptime' => $row->exptime
- ), __METHOD__ );
+ ), __METHOD__, 'IGNORE' );
+
+ if ( $db->affectedRows() == 0 ) {
+ // Race condition. See bug 28611
+ $newValue = null;
+ }
$db->commit();
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
- return false;
+
+ return null;
}
+
return $newValue;
}
@@ -352,9 +397,11 @@ class SqlBagOStuff extends BagOStuff {
$db = $this->getDB();
$res = $db->select( 'objectcache', array( 'keyname' ), false, __METHOD__ );
$result = array();
+
foreach ( $res as $row ) {
$result[] = $row->keyname;
}
+
return $result;
}
@@ -385,6 +432,7 @@ class SqlBagOStuff extends BagOStuff {
public function expireAll() {
$db = $this->getDB();
$now = $db->timestamp();
+
try {
$db->begin();
$db->delete( 'objectcache', array( 'exptime < ' . $db->addQuotes( $now ) ), __METHOD__ );
@@ -396,6 +444,7 @@ class SqlBagOStuff extends BagOStuff {
public function deleteAll() {
$db = $this->getDB();
+
try {
$db->begin();
$db->delete( 'objectcache', '*', __METHOD__ );
@@ -415,6 +464,7 @@ class SqlBagOStuff extends BagOStuff {
*/
protected function serialize( &$data ) {
$serial = serialize( $data );
+
if ( function_exists( 'gzdeflate' ) ) {
return gzdeflate( $serial );
} else {
@@ -430,11 +480,14 @@ class SqlBagOStuff extends BagOStuff {
protected function unserialize( $serial ) {
if ( function_exists( 'gzinflate' ) ) {
$decomp = @gzinflate( $serial );
+
if ( false !== $decomp ) {
$serial = $decomp;
}
}
+
$ret = unserialize( $serial );
+
return $ret;
}
@@ -444,13 +497,16 @@ class SqlBagOStuff extends BagOStuff {
*/
protected function handleWriteError( $exception ) {
$db = $this->getDB();
+
if ( !$db->wasReadOnlyError() ) {
throw $exception;
}
+
try {
$db->rollback();
} catch ( DBQueryError $e ) {
}
+
wfDebug( __METHOD__ . ": ignoring query error\n" );
$db->ignoreErrors( false );
}
@@ -469,19 +525,23 @@ class MediaWikiBagOStuff extends SqlBagOStuff { }
class APCBagOStuff extends BagOStuff {
public function get( $key ) {
$val = apc_fetch( $key );
+
if ( is_string( $val ) ) {
$val = unserialize( $val );
}
+
return $val;
}
public function set( $key, $value, $exptime = 0 ) {
apc_store( $key, serialize( $value ), $exptime );
+
return true;
}
public function delete( $key, $time = 0 ) {
apc_delete( $key );
+
return true;
}
@@ -489,9 +549,11 @@ class APCBagOStuff extends BagOStuff {
$info = apc_cache_info( 'user' );
$list = $info['cache_list'];
$keys = array();
+
foreach ( $list as $entry ) {
$keys[] = $entry['info'];
}
+
return $keys;
}
}
@@ -507,29 +569,35 @@ class APCBagOStuff extends BagOStuff {
class eAccelBagOStuff extends BagOStuff {
public function get( $key ) {
$val = eaccelerator_get( $key );
+
if ( is_string( $val ) ) {
$val = unserialize( $val );
}
+
return $val;
}
public function set( $key, $value, $exptime = 0 ) {
eaccelerator_put( $key, serialize( $value ), $exptime );
+
return true;
}
public function delete( $key, $time = 0 ) {
eaccelerator_rm( $key );
+
return true;
}
public function lock( $key, $waitTimeout = 0 ) {
eaccelerator_lock( $key );
+
return true;
}
public function unlock( $key ) {
eaccelerator_unlock( $key );
+
return true;
}
}
@@ -541,7 +609,6 @@ class eAccelBagOStuff extends BagOStuff {
* @ingroup Cache
*/
class XCacheBagOStuff extends BagOStuff {
-
/**
* Get a value from the XCache object cache
*
@@ -550,8 +617,11 @@ class XCacheBagOStuff extends BagOStuff {
*/
public function get( $key ) {
$val = xcache_get( $key );
- if ( is_string( $val ) )
+
+ if ( is_string( $val ) ) {
$val = unserialize( $val );
+ }
+
return $val;
}
@@ -565,6 +635,7 @@ class XCacheBagOStuff extends BagOStuff {
*/
public function set( $key, $value, $expire = 0 ) {
xcache_set( $key, serialize( $value ), $expire );
+
return true;
}
@@ -577,6 +648,7 @@ class XCacheBagOStuff extends BagOStuff {
*/
public function delete( $key, $time = 0 ) {
xcache_unset( $key );
+
return true;
}
}
@@ -594,10 +666,12 @@ class DBABagOStuff extends BagOStuff {
public function __construct( $dir = false ) {
global $wgDBAhandler;
+
if ( $dir === false ) {
global $wgTmpDirectory;
$dir = $wgTmpDirectory;
}
+
$this->mFile = "$dir/mw-cache-" . wfWikiID();
$this->mFile .= '.db';
wfDebug( __CLASS__ . ": using cache file {$this->mFile}\n" );
@@ -610,6 +684,7 @@ class DBABagOStuff extends BagOStuff {
function encode( $value, $expiry ) {
# Convert to absolute time
$expiry = $this->convertExpiry( $expiry );
+
return sprintf( '%010u', intval( $expiry ) ) . ' ' . serialize( $value );
}
@@ -633,29 +708,37 @@ class DBABagOStuff extends BagOStuff {
} else {
$handle = $this->getWriter();
}
+
if ( !$handle ) {
wfDebug( "Unable to open DBA cache file {$this->mFile}\n" );
}
+
return $handle;
}
function getWriter() {
$handle = dba_open( $this->mFile, 'cl', $this->mHandler );
+
if ( !$handle ) {
wfDebug( "Unable to open DBA cache file {$this->mFile}\n" );
}
+
return $handle;
}
function get( $key ) {
wfProfileIn( __METHOD__ );
wfDebug( __METHOD__ . "($key)\n" );
+
$handle = $this->getReader();
if ( !$handle ) {
+ wfProfileOut( __METHOD__ );
return null;
}
+
$val = dba_fetch( $key, $handle );
list( $val, $expiry ) = $this->decode( $val );
+
# Must close ASAP because locks are held
dba_close( $handle );
@@ -667,6 +750,7 @@ class DBABagOStuff extends BagOStuff {
wfDebug( __METHOD__ . ": $key expired\n" );
$val = null;
}
+
wfProfileOut( __METHOD__ );
return $val;
}
@@ -674,13 +758,18 @@ class DBABagOStuff extends BagOStuff {
function set( $key, $value, $exptime = 0 ) {
wfProfileIn( __METHOD__ );
wfDebug( __METHOD__ . "($key)\n" );
+
$blob = $this->encode( $value, $exptime );
+
$handle = $this->getWriter();
if ( !$handle ) {
+ wfProfileOut( __METHOD__ );
return false;
}
+
$ret = dba_replace( $key, $blob, $handle );
dba_close( $handle );
+
wfProfileOut( __METHOD__ );
return $ret;
}
@@ -688,27 +777,38 @@ class DBABagOStuff extends BagOStuff {
function delete( $key, $time = 0 ) {
wfProfileIn( __METHOD__ );
wfDebug( __METHOD__ . "($key)\n" );
+
$handle = $this->getWriter();
if ( !$handle ) {
+ wfProfileOut( __METHOD__ );
return false;
}
+
$ret = dba_delete( $key, $handle );
dba_close( $handle );
+
wfProfileOut( __METHOD__ );
return $ret;
}
function add( $key, $value, $exptime = 0 ) {
wfProfileIn( __METHOD__ );
+
$blob = $this->encode( $value, $exptime );
+
$handle = $this->getWriter();
+
if ( !$handle ) {
+ wfProfileOut( __METHOD__ );
return false;
}
+
$ret = dba_insert( $key, $blob, $handle );
+
# Insert failed, check to see if it failed due to an expired key
if ( !$ret ) {
list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
+
if ( $expiry < time() ) {
# Yes expired, delete and try again
dba_delete( $key, $handle );
@@ -718,6 +818,7 @@ class DBABagOStuff extends BagOStuff {
}
dba_close( $handle );
+
wfProfileOut( __METHOD__ );
return $ret;
}
@@ -725,13 +826,81 @@ class DBABagOStuff extends BagOStuff {
function keys() {
$reader = $this->getReader();
$k1 = dba_firstkey( $reader );
+
if ( !$k1 ) {
return array();
}
+
$result[] = $k1;
+
while ( $key = dba_nextkey( $reader ) ) {
$result[] = $key;
}
+
return $result;
}
}
+
+/**
+ * Wrapper for WinCache object caching functions; identical interface
+ * to the APC wrapper
+ *
+ * @ingroup Cache
+ */
+class WinCacheBagOStuff extends BagOStuff {
+
+ /**
+ * Get a value from the WinCache object cache
+ *
+ * @param $key String: cache key
+ * @return mixed
+ */
+ public function get( $key ) {
+ $val = wincache_ucache_get( $key );
+
+ if ( is_string( $val ) ) {
+ $val = unserialize( $val );
+ }
+
+ return $val;
+ }
+
+ /**
+ * Store a value in the WinCache object cache
+ *
+ * @param $key String: cache key
+ * @param $value Mixed: object to store
+ * @param $expire Int: expiration time
+ * @return bool
+ */
+ public function set( $key, $value, $expire = 0 ) {
+ wincache_ucache_set( $key, serialize( $value ), $expire );
+
+ return true;
+ }
+
+ /**
+ * Remove a value from the WinCache object cache
+ *
+ * @param $key String: cache key
+ * @param $time Int: not used in this implementation
+ * @return bool
+ */
+ public function delete( $key, $time = 0 ) {
+ wincache_ucache_delete( $key );
+
+ return true;
+ }
+
+ public function keys() {
+ $info = wincache_ucache_info();
+ $list = $info['ucache_entries'];
+ $keys = array();
+
+ foreach ( $list as $entry ) {
+ $keys[] = $entry['key_name'];
+ }
+
+ return $keys;
+ }
+}
diff --git a/includes/Block.php b/includes/Block.php
index 187ff2db..7c5f0ddd 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -24,8 +24,8 @@ class Block {
const EB_RANGE_ONLY = 4;
function __construct( $address = '', $user = 0, $by = 0, $reason = '',
- $timestamp = '' , $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
- $hideName = 0, $blockEmail = 0, $allowUsertalk = 0 )
+ $timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
+ $hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byName = false )
{
$this->mId = 0;
# Expand valid IPv6 addresses
@@ -45,7 +45,7 @@ class Block {
$this->mAllowUsertalk = $allowUsertalk;
$this->mForUpdate = false;
$this->mFromMaster = false;
- $this->mByName = false;
+ $this->mByName = $byName;
$this->mAngryAutoblock = false;
$this->initialiseRange();
}
@@ -63,6 +63,7 @@ class Block {
public static function newFromDB( $address, $user = 0, $killExpired = true ) {
$block = new Block;
$block->load( $address, $user, $killExpired );
+
if ( $block->isValid() ) {
return $block;
} else {
@@ -81,6 +82,7 @@ class Block {
$res = $dbr->resultObject( $dbr->select( 'ipblocks', '*',
array( 'ipb_id' => $id ), __METHOD__ ) );
$block = new Block;
+
if ( $block->loadFromResult( $res ) ) {
return $block;
} else {
@@ -142,6 +144,7 @@ class Block {
$db = wfGetDB( DB_SLAVE );
$options = array();
}
+
return $db;
}
@@ -158,11 +161,12 @@ class Block {
wfDebug( "Block::load: '$address', '$user', $killExpired\n" );
$options = array();
- $db =& $this->getDBOptions( $options );
+ $db = $this->getDBOptions( $options );
- if ( 0 == $user && $address == '' ) {
+ if ( 0 == $user && $address === '' ) {
# Invalid user specification, not blocked
$this->clear();
+
return false;
}
@@ -170,6 +174,7 @@ class Block {
if ( $user ) {
$res = $db->resultObject( $db->select( 'ipblocks', '*', array( 'ipb_user' => $user ),
__METHOD__, $options ) );
+
if ( $this->loadFromResult( $res, $killExpired ) ) {
return true;
}
@@ -178,7 +183,7 @@ class Block {
# Try IP block
# TODO: improve performance by merging this query with the autoblock one
# Slightly tricky while handling killExpired as well
- if ( $address ) {
+ if ( $address !== '' ) {
$conds = array( 'ipb_address' => $address, 'ipb_auto' => 0 );
$res = $db->resultObject( $db->select( 'ipblocks', '*', $conds, __METHOD__, $options ) );
@@ -190,6 +195,7 @@ class Block {
if ( !$this->mCreateAccount ) {
$this->clear();
}
+
return false;
} else {
return true;
@@ -204,6 +210,7 @@ class Block {
if ( !$this->mCreateAccount ) {
$this->clear();
}
+
return false;
} else {
return true;
@@ -266,6 +273,7 @@ class Block {
}
}
$res->free();
+
return $ret;
}
@@ -275,7 +283,7 @@ class Block {
*
* @param $address String: IP address range
* @param $killExpired Boolean: whether to delete expired rows while loading
- * @param $userid Integer: if not 0, then sets ipb_anon_only
+ * @param $user Integer: if not 0, then sets ipb_anon_only
* @return Boolean
*/
public function loadRange( $address, $killExpired = true, $user = 0 ) {
@@ -291,7 +299,7 @@ class Block {
$range = substr( $iaddr, 0, 4 );
$options = array();
- $db =& $this->getDBOptions( $options );
+ $db = $this->getDBOptions( $options );
$conds = array(
'ipb_range_start' . $db->buildLike( $range, $db->anyString() ),
"ipb_range_start <= '$iaddr'",
@@ -304,6 +312,7 @@ class Block {
$res = $db->resultObject( $db->select( 'ipblocks', '*', $conds, __METHOD__, $options ) );
$success = $this->loadFromResult( $res, $killExpired );
+
return $success;
}
@@ -368,6 +377,7 @@ class Block {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'ipblocks', array( 'ipb_id' => $this->mId ), __METHOD__ );
+
return $dbw->affectedRows() > 0;
}
@@ -377,9 +387,11 @@ class Block {
*
* @return Boolean: whether or not the insertion was successful.
*/
- public function insert() {
+ public function insert( $dbw = null ) {
wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" );
- $dbw = wfGetDB( DB_MASTER );
+
+ if ( $dbw === null )
+ $dbw = wfGetDB( DB_MASTER );
$this->validateBlockParams();
$this->initialiseRange();
@@ -475,6 +487,7 @@ class Block {
if ( !$this->mUser && $this->mAnonOnly ) {
$this->mBlockEmail = 0;
}
+
if ( !$this->mByName ) {
if ( $this->mBy ) {
$this->mByName = User::whoIs( $this->mBy );
@@ -518,9 +531,10 @@ class Block {
# No results, don't autoblock anything
wfDebug( "No IP found to retroactively autoblock\n" );
} else {
- while ( $row = $dbr->fetchObject( $res ) ) {
- if ( $row->rc_ip )
+ foreach ( $res as $row ) {
+ if ( $row->rc_ip ) {
$this->doAutoblock( $row->rc_ip );
+ }
}
}
}
@@ -601,13 +615,16 @@ class Block {
# exceed the user block. If it would exceed, then do nothing, else
# prolong block time
if ( $this->mExpiry &&
- ( $this->mExpiry < Block::getAutoblockExpiry( $ipblock->mTimestamp ) ) ) {
+ ( $this->mExpiry < Block::getAutoblockExpiry( $ipblock->mTimestamp ) )
+ ) {
return;
}
+
# Just update the timestamp
if ( !$justInserted ) {
$ipblock->updateTimestamp();
}
+
return;
} else {
$ipblock = new Block;
@@ -626,6 +643,7 @@ class Block {
# Continue suppressing the name if needed
$ipblock->mHideName = $this->mHideName;
$ipblock->mAllowUsertalk = $this->mAllowUsertalk;
+
# If the user is already blocked with an expiry date, we don't
# want to pile on top of that!
if ( $this->mExpiry ) {
@@ -633,6 +651,7 @@ class Block {
} else {
$ipblock->mExpiry = Block::getAutoblockExpiry( $this->mTimestamp );
}
+
# Insert it
return $ipblock->insert();
}
@@ -643,6 +662,7 @@ class Block {
*/
public function deleteIfExpired() {
wfProfileIn( __METHOD__ );
+
if ( $this->isExpired() ) {
wfDebug( "Block::deleteIfExpired() -- deleting\n" );
$this->delete();
@@ -651,6 +671,7 @@ class Block {
wfDebug( "Block::deleteIfExpired() -- not expired\n" );
$retVal = false;
}
+
wfProfileOut( __METHOD__ );
return $retVal;
}
@@ -661,6 +682,7 @@ class Block {
*/
public function isExpired() {
wfDebug( "Block::isExpired() checking current " . wfTimestampNow() . " vs $this->mExpiry\n" );
+
if ( !$this->mExpiry ) {
return false;
} else {
@@ -777,6 +799,7 @@ class Block {
*/
public static function getAutoblockExpiry( $timestamp ) {
global $wgAutoblockExpiry;
+
return wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $timestamp ) + $wgAutoblockExpiry );
}
@@ -792,7 +815,7 @@ class Block {
// IPv6
if ( IP::isIPv6( $range ) && $parts[1] >= 64 && $parts[1] <= 128 ) {
$bits = $parts[1];
- $ipint = IP::toUnsigned6( $parts[0] );
+ $ipint = IP::toUnsigned( $parts[0] );
# Native 32 bit functions WON'T work here!!!
# Convert to a padded binary number
$network = wfBaseConvert( $ipint, 10, 2, 128 );
@@ -812,6 +835,7 @@ class Block {
$range = "$newip/{$parts[1]}";
}
}
+
return $range;
}
@@ -833,6 +857,16 @@ class Block {
public static function infinity() {
# This is a special keyword for timestamps in PostgreSQL, and
# works with CHAR(14) as well because "i" sorts after all numbers.
+
+ # BEGIN DatabaseMssql hack
+ # Since MSSQL doesn't recognize the infinity keyword, set date manually.
+ # TO-DO: Refactor for better DB portability and remove magic date
+ $dbr = wfGetDB( DB_SLAVE );
+ if ( $dbr->getType() == 'mssql' ) {
+ return '3000-01-31 00:00:00.000';
+ }
+ # End DatabaseMssql hack
+
return 'infinity';
}
@@ -848,6 +882,7 @@ class Block {
if ( is_null( $msg ) ) {
$msg = array();
$keys = array( 'infiniteblock', 'expiringblock' );
+
foreach ( $keys as $key ) {
$msg[$key] = wfMsgHtml( $key );
}
@@ -862,6 +897,7 @@ class Block {
$expiretimestr = htmlspecialchars( $wgLang->time( $expiry, true ) );
$expirystr = wfMsgReplaceArgs( $msg['expiringblock'], array( $expiredatestr, $expiretimestr ) );
}
+
return $expirystr;
}
@@ -880,7 +916,7 @@ class Block {
return false;
}
}
+
return $expiry;
}
-
}
diff --git a/includes/CacheDependency.php b/includes/CacheDependency.php
index 11e70738..74ca2864 100644
--- a/includes/CacheDependency.php
+++ b/includes/CacheDependency.php
@@ -1,10 +1,11 @@
<?php
/**
* This class stores an arbitrary value along with its dependencies.
- * Users should typically only use DependencyWrapper::getFromCache(), rather
- * than instantiating one of these objects directly.
+ * Users should typically only use DependencyWrapper::getValueFromCache(),
+ * rather than instantiating one of these objects directly.
* @ingroup Cache
*/
+
class DependencyWrapper {
var $value;
var $deps;
@@ -17,9 +18,11 @@ class DependencyWrapper {
*/
function __construct( $value = false, $deps = array() ) {
$this->value = $value;
+
if ( !is_array( $deps ) ) {
$deps = array( $deps );
}
+
$this->deps = $deps;
}
@@ -32,6 +35,7 @@ class DependencyWrapper {
return true;
}
}
+
return false;
}
@@ -81,6 +85,7 @@ class DependencyWrapper {
$callbackParams = array(), $deps = array() )
{
$obj = $cache->get( $key );
+
if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) {
$value = $obj->value;
} elseif ( $callback ) {
@@ -91,6 +96,7 @@ class DependencyWrapper {
} else {
$value = null;
}
+
return $value;
}
}
@@ -207,6 +213,7 @@ class TitleDependency extends CacheDependency {
if ( !isset( $this->titleObj ) ) {
$this->titleObj = Title::makeTitle( $this->ns, $this->dbk );
}
+
return $this->titleObj;
}
@@ -255,6 +262,7 @@ class TitleListDependency extends CacheDependency {
foreach ( $this->getLinkBatch()->data as $ns => $dbks ) {
if ( count( $dbks ) > 0 ) {
$timestamps[$ns] = array();
+
foreach ( $dbks as $dbk => $value ) {
$timestamps[$ns][$dbk] = false;
}
@@ -272,10 +280,11 @@ class TitleListDependency extends CacheDependency {
__METHOD__
);
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$timestamps[$row->page_namespace][$row->page_title] = $row->page_touched;
}
}
+
return $timestamps;
}
@@ -297,6 +306,7 @@ class TitleListDependency extends CacheDependency {
function isExpired() {
$newTimestamps = $this->calculateTimestamps();
+
foreach ( $this->timestamps as $ns => $dbks ) {
foreach ( $dbks as $dbk => $oldTimestamp ) {
$newTimestamp = $newTimestamps[$ns][$dbk];
@@ -319,6 +329,7 @@ class TitleListDependency extends CacheDependency {
}
}
}
+
return false;
}
}
diff --git a/includes/Category.php b/includes/Category.php
index e9ffaecf..614933ff 100644
--- a/includes/Category.php
+++ b/includes/Category.php
@@ -25,9 +25,6 @@ class Category {
* @return bool True on success, false on failure.
*/
protected function initialize() {
- if ( $this->mName === null && $this->mTitle )
- $this->mName = $title->getDBkey();
-
if ( $this->mName === null && $this->mID === null ) {
throw new MWException( __METHOD__ . ' has both names and IDs null' );
} elseif ( $this->mID === null ) {
@@ -248,28 +245,33 @@ class Category {
if ( wfReadOnly() ) {
return false;
}
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
+
# Note, we must use names for this, since categorylinks does.
if ( $this->mName === null ) {
if ( !$this->initialize() ) {
return false;
}
- } else {
- # Let's be sure that the row exists in the table. We don't need to
- # do this if we got the row from the table in initialization!
- $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' );
- $dbw->insert(
- 'category',
- array(
- 'cat_id' => $seqVal,
- 'cat_title' => $this->mName
- ),
- __METHOD__,
- 'IGNORE'
- );
}
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+
+ # Insert the row if it doesn't exist yet (e.g., this is being run via
+ # update.php from a pre-1.16 schema). TODO: This will cause lots and
+ # lots of gaps on some non-MySQL DBMSes if you run populateCategory.php
+ # repeatedly. Plus it's an extra query that's unneeded almost all the
+ # time. This should be rewritten somehow, probably.
+ $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' );
+ $dbw->insert(
+ 'category',
+ array(
+ 'cat_id' => $seqVal,
+ 'cat_title' => $this->mName
+ ),
+ __METHOD__,
+ 'IGNORE'
+ );
+
$cond1 = $dbw->conditional( 'page_namespace=' . NS_CATEGORY, 1, 'NULL' );
$cond2 = $dbw->conditional( 'page_namespace=' . NS_FILE, 1, 'NULL' );
$result = $dbw->selectRow(
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index 56f85faa..f990b79b 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -1,33 +1,41 @@
<?php
/**
- * Special handling for category description pages
- * Modelled after ImagePage.php
+ * Special handling for category description pages.
+ * Modelled after ImagePage.php.
*
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) )
die( 1 );
/**
+ * Special handling for category description pages, showing pages,
+ * subcategories and file that belong to the category
*/
class CategoryPage extends Article {
+ # Subclasses can change this to override the viewer class.
+ protected $mCategoryViewerClass = 'CategoryViewer';
+
function view() {
global $wgRequest, $wgUser;
$diff = $wgRequest->getVal( 'diff' );
$diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
- if ( isset( $diff ) && $diffOnly )
- return Article::view();
+ if ( isset( $diff ) && $diffOnly ) {
+ return parent::view();
+ }
- if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) )
+ if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
return;
+ }
if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
$this->openShowCategory();
}
- Article::view();
+ parent::view();
if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
$this->closeShowCategory();
@@ -36,14 +44,23 @@ class CategoryPage extends Article {
/**
* Don't return a 404 for categories in use.
+ * In use defined as: either the actual page exists
+ * or the category currently has members.
*/
function hasViewableContent() {
if ( parent::hasViewableContent() ) {
return true;
} else {
$cat = Category::newFromTitle( $this->mTitle );
- return $cat->getId() != 0;
+ // If any of these are not 0, then has members
+ if ( $cat->getPageCount()
+ || $cat->getSubcatCount()
+ || $cat->getFileCount()
+ ) {
+ return true;
+ }
}
+ return false;
}
function openShowCategory() {
@@ -52,10 +69,14 @@ class CategoryPage extends Article {
function closeShowCategory() {
global $wgOut, $wgRequest;
- $from = $wgRequest->getVal( 'from' );
- $until = $wgRequest->getVal( 'until' );
- $viewer = new CategoryViewer( $this->mTitle, $from, $until );
+ $from = $until = array();
+ foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
+ $from[$type] = $wgRequest->getVal( "{$type}from" );
+ $until[$type] = $wgRequest->getVal( "{$type}until" );
+ }
+
+ $viewer = new $this->mCategoryViewerClass( $this->mTitle, $from, $until, $wgRequest->getValues() );
$wgOut->addHTML( $viewer->getHTML() );
}
}
@@ -65,27 +86,32 @@ class CategoryViewer {
$articles, $articles_start_char,
$children, $children_start_char,
$showGallery, $gallery,
- $skin;
- /** Category object for this page */
+ $imgsNoGalley, $imgsNoGallery_start_char,
+ $skin, $collation;
+ # Category object for this page
private $cat;
+ # The original query array, to be used in generating paging links.
+ private $query;
- function __construct( $title, $from = '', $until = '' ) {
+ function __construct( $title, $from = '', $until = '', $query = array() ) {
global $wgCategoryPagingLimit;
$this->title = $title;
$this->from = $from;
$this->until = $until;
$this->limit = $wgCategoryPagingLimit;
$this->cat = Category::newFromTitle( $title );
+ $this->query = $query;
+ $this->collation = Collation::singleton();
+ unset( $this->query['title'] );
}
/**
* Format the category data list.
*
* @return string HTML output
- * @private
*/
- function getHTML() {
- global $wgOut, $wgCategoryMagicGallery, $wgCategoryPagingLimit, $wgContLang;
+ public function getHTML() {
+ global $wgOut, $wgCategoryMagicGallery, $wgContLang;
wfProfileIn( __METHOD__ );
$this->showGallery = $wgCategoryMagicGallery && !$wgOut->mNoGallery;
@@ -128,6 +154,9 @@ class CategoryViewer {
if ( $this->showGallery ) {
$this->gallery = new ImageGallery();
$this->gallery->setHideBadImages();
+ } else {
+ $this->imgsNoGallery = array();
+ $this->imgsNoGallery_start_char = array();
}
}
@@ -142,26 +171,29 @@ class CategoryViewer {
/**
* Add a subcategory to the internal lists, using a Category object
*/
- function addSubcategoryObject( $cat, $sortkey, $pageLength ) {
+ function addSubcategoryObject( Category $cat, $sortkey, $pageLength ) {
+ // Subcategory; strip the 'Category' namespace from the link text.
$title = $cat->getTitle();
- $this->addSubcategory( $title, $sortkey, $pageLength );
+
+ $link = $this->getSkin()->link( $title, $title->getText() );
+ if ( $title->isRedirect() ) {
+ // This didn't used to add redirect-in-category, but might
+ // as well be consistent with the rest of the sections
+ // on a category page.
+ $link = '<span class="redirect-in-category">' . $link . '</span>';
+ }
+ $this->children[] = $link;
+
+ $this->children_start_char[] =
+ $this->getSubcategorySortChar( $cat->getTitle(), $sortkey );
}
/**
* Add a subcategory to the internal lists, using a title object
* @deprecated kept for compatibility, please use addSubcategoryObject instead
*/
- function addSubcategory( $title, $sortkey, $pageLength ) {
- // Subcategory; strip the 'Category' namespace from the link text.
- $this->children[] = $this->getSkin()->link(
- $title,
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
-
- $this->children_start_char[] = $this->getSubcategorySortChar( $title, $sortkey );
+ function addSubcategory( Title $title, $sortkey, $pageLength ) {
+ $this->addSubcategoryObject( Category::newFromTitle( $title ), $sortkey, $pageLength );
}
/**
@@ -170,16 +202,21 @@ class CategoryViewer {
* entry in the categorylinks table is Category:A, not A, which it SHOULD be.
* Workaround: If sortkey == "Category:".$title, than use $title for sorting,
* else use sortkey...
+ *
+ * @param Title $title
+ * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
*/
function getSubcategorySortChar( $title, $sortkey ) {
global $wgContLang;
if ( $title->getPrefixedText() == $sortkey ) {
- $firstChar = $wgContLang->firstChar( $title->getDBkey() );
+ $word = $title->getDBkey();
} else {
- $firstChar = $wgContLang->firstChar( $sortkey );
+ $word = $sortkey;
}
+ $firstChar = $this->collation->getFirstLetter( $word );
+
return $wgContLang->convert( $firstChar );
}
@@ -187,14 +224,25 @@ class CategoryViewer {
* Add a page in the image namespace
*/
function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) {
+ global $wgContLang;
if ( $this->showGallery ) {
- if ( $this->flip ) {
+ $flip = $this->flip['file'];
+ if ( $flip ) {
$this->gallery->insert( $title );
} else {
$this->gallery->add( $title );
}
} else {
- $this->addPage( $title, $sortkey, $pageLength, $isRedirect );
+ $link = $this->getSkin()->link( $title );
+ if ( $isRedirect ) {
+ // This seems kind of pointless given 'mw-redirect' class,
+ // but keeping for back-compatibility with user css.
+ $link = '<span class="redirect-in-category">' . $link . '</span>';
+ }
+ $this->imgsNoGallery[] = $link;
+
+ $this->imgsNoGallery_start_char[] = $wgContLang->convert(
+ $this->collation->getFirstLetter( $sortkey ) );
}
}
@@ -203,74 +251,104 @@ class CategoryViewer {
*/
function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
global $wgContLang;
- $this->articles[] = $isRedirect
- ? '<span class="redirect-in-category">' .
- $this->getSkin()->link(
- $title,
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- ) . '</span>'
- : $this->getSkin()->makeSizeLinkObj( $pageLength, $title );
- $this->articles_start_char[] = $wgContLang->convert( $wgContLang->firstChar( $sortkey ) );
+
+ $link = $this->getSkin()->link( $title );
+ if ( $isRedirect ) {
+ // This seems kind of pointless given 'mw-redirect' class,
+ // but keeping for back-compatiability with user css.
+ $link = '<span class="redirect-in-category">' . $link . '</span>';
+ }
+ $this->articles[] = $link;
+
+ $this->articles_start_char[] = $wgContLang->convert(
+ $this->collation->getFirstLetter( $sortkey ) );
}
function finaliseCategoryState() {
- if ( $this->flip ) {
+ if ( $this->flip['subcat'] ) {
$this->children = array_reverse( $this->children );
$this->children_start_char = array_reverse( $this->children_start_char );
+ }
+ if ( $this->flip['page'] ) {
$this->articles = array_reverse( $this->articles );
$this->articles_start_char = array_reverse( $this->articles_start_char );
}
+ if ( !$this->showGallery && $this->flip['file'] ) {
+ $this->imgsNoGallery = array_reverse( $this->imgsNoGallery );
+ $this->imgsNoGallery_start_char = array_reverse( $this->imgsNoGallery_start_char );
+ }
}
function doCategoryQuery() {
$dbr = wfGetDB( DB_SLAVE, 'category' );
- if ( $this->from != '' ) {
- $pageCondition = 'cl_sortkey >= ' . $dbr->addQuotes( $this->from );
- $this->flip = false;
- } elseif ( $this->until != '' ) {
- $pageCondition = 'cl_sortkey < ' . $dbr->addQuotes( $this->until );
- $this->flip = true;
- } else {
- $pageCondition = '1 = 1';
- $this->flip = false;
- }
- $res = $dbr->select(
- array( 'page', 'categorylinks', 'category' ),
- array( 'page_title', 'page_namespace', 'page_len', 'page_is_redirect', 'cl_sortkey',
- 'cat_id', 'cat_title', 'cat_subcats', 'cat_pages', 'cat_files' ),
- array( $pageCondition, 'cl_to' => $this->title->getDBkey() ),
- __METHOD__,
- array( 'ORDER BY' => $this->flip ? 'cl_sortkey DESC' : 'cl_sortkey',
- 'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
- 'LIMIT' => $this->limit + 1 ),
- array( 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
- 'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY ) )
+ $this->nextPage = array(
+ 'page' => null,
+ 'subcat' => null,
+ 'file' => null,
);
+ $this->flip = array( 'page' => false, 'subcat' => false, 'file' => false );
+
+ foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
+ # Get the sortkeys for start/end, if applicable. Note that if
+ # the collation in the database differs from the one
+ # set in $wgCategoryCollation, pagination might go totally haywire.
+ $extraConds = array( 'cl_type' => $type );
+ if ( $this->from[$type] !== null ) {
+ $extraConds[] = 'cl_sortkey >= '
+ . $dbr->addQuotes( $this->collation->getSortKey( $this->from[$type] ) );
+ } elseif ( $this->until[$type] !== null ) {
+ $extraConds[] = 'cl_sortkey < '
+ . $dbr->addQuotes( $this->collation->getSortKey( $this->until[$type] ) );
+ $this->flip[$type] = true;
+ }
- $count = 0;
- $this->nextPage = null;
+ $res = $dbr->select(
+ array( 'page', 'categorylinks', 'category' ),
+ array( 'page_id', 'page_title', 'page_namespace', 'page_len',
+ 'page_is_redirect', 'cl_sortkey', 'cat_id', 'cat_title',
+ 'cat_subcats', 'cat_pages', 'cat_files',
+ 'cl_sortkey_prefix', 'cl_collation' ),
+ array( 'cl_to' => $this->title->getDBkey() ) + $extraConds,
+ __METHOD__,
+ array(
+ 'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
+ 'LIMIT' => $this->limit + 1,
+ 'ORDER BY' => $this->flip[$type] ? 'cl_sortkey DESC' : 'cl_sortkey',
+ ),
+ array(
+ 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
+ 'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY )
+ )
+ );
- while ( $x = $dbr->fetchObject ( $res ) ) {
- if ( ++$count > $this->limit ) {
- // We've reached the one extra which shows that there are
- // additional pages to be had. Stop here...
- $this->nextPage = $x->cl_sortkey;
- break;
- }
+ $count = 0;
+ foreach ( $res as $row ) {
+ $title = Title::newFromRow( $row );
+ if ( $row->cl_collation === '' ) {
+ // Hack to make sure that while updating from 1.16 schema
+ // and db is inconsistent, that the sky doesn't fall.
+ // See r83544. Could perhaps be removed in a couple decades...
+ $humanSortkey = $row->cl_sortkey;
+ } else {
+ $humanSortkey = $title->getCategorySortkey( $row->cl_sortkey_prefix );
+ }
- $title = Title::makeTitle( $x->page_namespace, $x->page_title );
+ if ( ++$count > $this->limit ) {
+ # We've reached the one extra which shows that there
+ # are additional pages to be had. Stop here...
+ $this->nextPage[$type] = $humanSortkey;
+ break;
+ }
- if ( $title->getNamespace() == NS_CATEGORY ) {
- $cat = Category::newFromRow( $x, $title );
- $this->addSubcategoryObject( $cat, $x->cl_sortkey, $x->page_len );
- } elseif ( $this->showGallery && $title->getNamespace() == NS_FILE ) {
- $this->addImage( $title, $x->cl_sortkey, $x->page_len, $x->page_is_redirect );
- } else {
- $this->addPage( $title, $x->cl_sortkey, $x->page_len, $x->page_is_redirect );
+ if ( $title->getNamespace() == NS_CATEGORY ) {
+ $cat = Category::newFromRow( $row, $title );
+ $this->addSubcategoryObject( $cat, $humanSortkey, $row->page_len );
+ } elseif ( $title->getNamespace() == NS_FILE ) {
+ $this->addImage( $title, $humanSortkey, $row->page_len, $row->page_is_redirect );
+ } else {
+ $this->addPage( $title, $humanSortkey, $row->page_len, $row->page_is_redirect );
+ }
}
}
}
@@ -294,7 +372,9 @@ class CategoryViewer {
$r .= "<div id=\"mw-subcategories\">\n";
$r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
$r .= $countmsg;
+ $r .= $this->getSectionPagingLinks( 'subcat' );
$r .= $this->formatList( $this->children, $this->children_start_char );
+ $r .= $this->getSectionPagingLinks( 'subcat' );
$r .= "\n</div>";
}
return $r;
@@ -318,36 +398,57 @@ class CategoryViewer {
$r = "<div id=\"mw-pages\">\n";
$r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
$r .= $countmsg;
+ $r .= $this->getSectionPagingLinks( 'page' );
$r .= $this->formatList( $this->articles, $this->articles_start_char );
+ $r .= $this->getSectionPagingLinks( 'page' );
$r .= "\n</div>";
}
return $r;
}
function getImageSection() {
- if ( $this->showGallery && ! $this->gallery->isEmpty() ) {
+ $r = '';
+ $rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery );
+ if ( $rescnt > 0 ) {
$dbcnt = $this->cat->getFileCount();
- $rescnt = $this->gallery->count();
$countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'file' );
- return "<div id=\"mw-category-media\">\n" .
- '<h2>' . wfMsg( 'category-media-header', htmlspecialchars( $this->title->getText() ) ) . "</h2>\n" .
- $countmsg . $this->gallery->toHTML() . "\n</div>";
- } else {
- return '';
+ $r .= "<div id=\"mw-category-media\">\n";
+ $r .= '<h2>' . wfMsg( 'category-media-header', htmlspecialchars( $this->title->getText() ) ) . "</h2>\n";
+ $r .= $countmsg;
+ $r .= $this->getSectionPagingLinks( 'file' );
+ if ( $this->showGallery ) {
+ $r .= $this->gallery->toHTML();
+ } else {
+ $r .= $this->formatList( $this->imgsNoGallery, $this->imgsNoGallery_start_char );
+ }
+ $r .= $this->getSectionPagingLinks( 'file' );
+ $r .= "\n</div>";
}
+ return $r;
}
- function getCategoryBottom() {
- if ( $this->until != '' ) {
- return $this->pagingLinks( $this->title, $this->nextPage, $this->until, $this->limit );
- } elseif ( $this->nextPage != '' || $this->from != '' ) {
- return $this->pagingLinks( $this->title, $this->from, $this->nextPage, $this->limit );
+ /**
+ * Get the paging links for a section (subcats/pages/files), to go at the top and bottom
+ * of the output.
+ *
+ * @param $type String: 'page', 'subcat', or 'file'
+ * @return String: HTML output, possibly empty if there are no other pages
+ */
+ private function getSectionPagingLinks( $type ) {
+ if ( $this->until[$type] !== null ) {
+ return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
+ } elseif ( $this->nextPage[$type] !== null || $this->from[$type] !== null ) {
+ return $this->pagingLinks( $this->from[$type], $this->nextPage[$type], $type );
} else {
return '';
}
}
+ function getCategoryBottom() {
+ return '';
+ }
+
/**
* Format a list of articles chunked by letter, either as a
* bullet list or a columnar format, depending on the length.
@@ -360,10 +461,10 @@ class CategoryViewer {
*/
function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
if ( count ( $articles ) > $cutoff ) {
- return $this->columnList( $articles, $articles_start_char );
+ return self::columnList( $articles, $articles_start_char );
} elseif ( count( $articles ) > 0 ) {
// for short lists of articles in categories.
- return $this->shortList( $articles, $articles_start_char );
+ return self::shortList( $articles, $articles_start_char );
}
return '';
}
@@ -383,7 +484,7 @@ class CategoryViewer {
* @return String
* @private
*/
- function columnList( $articles, $articles_start_char ) {
+ static function columnList( $articles, $articles_start_char ) {
$columns = array_combine( $articles, $articles_start_char );
# Split into three columns
$columns = array_chunk( $columns, ceil( count( $columns ) / 3 ), true /* preserve keys */ );
@@ -435,7 +536,7 @@ class CategoryViewer {
* @return String
* @private
*/
- function shortList( $articles, $articles_start_char ) {
+ static function shortList( $articles, $articles_start_char ) {
$r = '<h3>' . htmlspecialchars( $articles_start_char[0] ) . "</h3>\n";
$r .= '<ul><li>' . $articles[0] . '</li>';
for ( $index = 1; $index < count( $articles ); $index++ )
@@ -452,26 +553,27 @@ class CategoryViewer {
}
/**
- * @param $title Title object
- * @param $first String
- * @param $last String
- * @param $limit Int
- * @param $query Array: additional query options to pass
- * @return String
- * @private
+ * Create paging links, as a helper method to getSectionPagingLinks().
+ *
+ * @param $first String The 'until' parameter for the generated URL
+ * @param $last String The 'from' parameter for the genererated URL
+ * @param $type String A prefix for parameters, 'page' or 'subcat' or
+ * 'file'
+ * @return String HTML
*/
- function pagingLinks( $title, $first, $last, $limit, $query = array() ) {
+ private function pagingLinks( $first, $last, $type = '' ) {
global $wgLang;
$sk = $this->getSkin();
- $limitText = $wgLang->formatNum( $limit );
+ $limitText = $wgLang->formatNum( $this->limit );
$prevLink = wfMsgExt( 'prevn', array( 'escape', 'parsemag' ), $limitText );
if ( $first != '' ) {
- $prevQuery = $query;
- $prevQuery['until'] = $first;
+ $prevQuery = $this->query;
+ $prevQuery["{$type}until"] = $first;
+ unset( $prevQuery["{$type}from"] );
$prevLink = $sk->linkKnown(
- $title,
+ $this->title,
$prevLink,
array(),
$prevQuery
@@ -481,10 +583,11 @@ class CategoryViewer {
$nextLink = wfMsgExt( 'nextn', array( 'escape', 'parsemag' ), $limitText );
if ( $last != '' ) {
- $lastQuery = $query;
- $lastQuery['from'] = $last;
+ $lastQuery = $this->query;
+ $lastQuery["{$type}from"] = $last;
+ unset( $lastQuery["{$type}until"] );
$nextLink = $sk->linkKnown(
- $title,
+ $this->title,
$nextLink,
array(),
$lastQuery
@@ -496,8 +599,8 @@ class CategoryViewer {
/**
* What to do if the category table conflicts with the number of results
- * returned? This function says what. It works the same whether the
- * things being counted are articles, subcategories, or files.
+ * returned? This function says what. Each type is considered independantly
+ * of the other types.
*
* Note for grepping: uses the messages category-article-count,
* category-article-count-limited, category-subcat-count,
@@ -520,15 +623,28 @@ class CategoryViewer {
# than $this->limit and there's no offset. In this case we still
# know the right figure.
# 3) We have no idea.
- $totalrescnt = count( $this->articles ) + count( $this->children ) +
- ( $this->showGallery ? $this->gallery->count() : 0 );
- if ( $dbcnt == $rescnt || ( ( $totalrescnt == $this->limit || $this->from
- || $this->until ) && $dbcnt > $rescnt ) )
+ # Check if there's a "from" or "until" for anything
+
+ // This is a little ugly, but we seem to use different names
+ // for the paging types then for the messages.
+ if ( $type === 'article' ) {
+ $pagingType = 'page';
+ } else {
+ $pagingType = $type;
+ }
+
+ $fromOrUntil = false;
+ if ( $this->from[$pagingType] !== null || $this->until[$pagingType] !== null ) {
+ $fromOrUntil = true;
+ }
+
+ if ( $dbcnt == $rescnt || ( ( $rescnt == $this->limit || $fromOrUntil )
+ && $dbcnt > $rescnt ) )
{
# Case 1: seems sane.
$totalcnt = $dbcnt;
- } elseif ( $totalrescnt < $this->limit && !$this->from && !$this->until ) {
+ } elseif ( $rescnt < $this->limit && !$fromOrUntil ) {
# Case 2: not sane, but salvageable. Use the number of results.
# Since there are fewer than 200, we can also take this opportunity
# to refresh the incorrect category table entry -- which should be
diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php
index 5ac8a9be..1f08b7f8 100644
--- a/includes/Categoryfinder.php
+++ b/includes/Categoryfinder.php
@@ -10,14 +10,14 @@
* # Determines whether the article with the page_id 12345 is in both
* # "Category 1" and "Category 2" or their subcategories, respectively
*
- * $cf = new Categoryfinder ;
- * $cf->seed (
- * array ( 12345 ) ,
- * array ( "Category 1","Category 2" ) ,
- * "AND"
- * ) ;
- * $a = $cf->run() ;
- * print implode ( "," , $a ) ;
+ * $cf = new Categoryfinder;
+ * $cf->seed(
+ * array( 12345 ),
+ * array( 'Category 1', 'Category 2' ),
+ * 'AND'
+ * );
+ * $a = $cf->run();
+ * print implode( ',' , $a );
* </code>
*
*/
@@ -43,7 +43,7 @@ class Categoryfinder {
* @param $categories FIXME
* @param $mode String: FIXME, default 'AND'.
*/
- function seed( $article_ids, $categories, $mode = "AND" ) {
+ function seed( $article_ids, $categories, $mode = 'AND' ) {
$this->articles = $article_ids;
$this->next = $article_ids;
$this->mode = $mode;
@@ -64,9 +64,9 @@ class Categoryfinder {
* then checks the articles if they match the conditions
* @return array of page_ids (those given to seed() that match the conditions)
*/
- function run () {
+ function run() {
$this->dbr = wfGetDB( DB_SLAVE );
- while ( count ( $this->next ) > 0 ) {
+ while ( count( $this->next ) > 0 ) {
$this->scan_next_layer();
}
@@ -90,7 +90,7 @@ class Categoryfinder {
* @param $path used to check for recursion loops
* @return bool Does this match the conditions?
*/
- function check( $id , &$conds, $path = array() ) {
+ function check( $id, &$conds, $path = array() ) {
// Check for loops and stop!
if ( in_array( $id, $path ) ) {
return false;
@@ -114,13 +114,13 @@ class Categoryfinder {
# Is this a condition?
if ( isset( $conds[$pname] ) ) {
# This key is in the category list!
- if ( $this->mode == "OR" ) {
+ if ( $this->mode == 'OR' ) {
# One found, that's enough!
$conds = array();
return true;
} else {
# Assuming "AND" as default
- unset( $conds[$pname] ) ;
+ unset( $conds[$pname] );
if ( count( $conds ) == 0 ) {
# All conditions met, done
return true;
@@ -131,7 +131,7 @@ class Categoryfinder {
# Not done yet, try sub-parents
if ( !isset( $this->name2id[$pname] ) ) {
# No sub-parent
- continue ;
+ continue;
}
$done = $this->check( $this->name2id[$pname], $conds, $path );
if ( $done || count( $conds ) == 0 ) {
@@ -152,10 +152,10 @@ class Categoryfinder {
/* FROM */ 'categorylinks',
/* SELECT */ '*',
/* WHERE */ array( 'cl_from' => $this->next ),
- __METHOD__ . "-1"
+ __METHOD__ . '-1'
);
- while ( $o = $this->dbr->fetchObject( $res ) ) {
- $k = $o->cl_to ;
+ foreach ( $res as $o ) {
+ $k = $o->cl_to;
# Update parent tree
if ( !isset( $this->parents[$o->cl_from] ) ) {
@@ -164,9 +164,13 @@ class Categoryfinder {
$this->parents[$o->cl_from][$k] = $o;
# Ignore those we already have
- if ( in_array ( $k , $this->deadend ) ) continue;
+ if ( in_array( $k, $this->deadend ) ) {
+ continue;
+ }
- if ( isset ( $this->name2id[$k] ) ) continue;
+ if ( isset( $this->name2id[$k] ) ) {
+ continue;
+ }
# Hey, new category!
$layer[$k] = $k;
@@ -175,14 +179,14 @@ class Categoryfinder {
$this->next = array();
# Find the IDs of all category pages in $layer, if they exist
- if ( count ( $layer ) > 0 ) {
+ if ( count( $layer ) > 0 ) {
$res = $this->dbr->select(
/* FROM */ 'page',
/* SELECT */ array( 'page_id', 'page_title' ),
/* WHERE */ array( 'page_namespace' => NS_CATEGORY , 'page_title' => $layer ),
- __METHOD__ . "-2"
+ __METHOD__ . '-2'
);
- while ( $o = $this->dbr->fetchObject( $res ) ) {
+ foreach ( $res as $o ) {
$id = $o->page_id;
$name = $o->page_title;
$this->name2id[$name] = $id;
diff --git a/includes/Cdb.php b/includes/Cdb.php
index ab429872..60477485 100644
--- a/includes/Cdb.php
+++ b/includes/Cdb.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Native CDB file reader and writer
+ *
+ * @file
+ */
/**
* Read from a CDB file.
@@ -93,7 +98,7 @@ class CdbReader_DBA {
function __construct( $fileName ) {
$this->handle = dba_open( $fileName, 'r-', 'cdb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open DB file "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file "' . $fileName . '"' );
}
}
@@ -120,7 +125,7 @@ class CdbWriter_DBA {
$this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
$this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open DB file for write "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file for write "' . $fileName . '"' );
}
}
diff --git a/includes/Cdb_PHP.php b/includes/Cdb_PHP.php
index 49294f71..1485cc66 100644
--- a/includes/Cdb_PHP.php
+++ b/includes/Cdb_PHP.php
@@ -1,11 +1,12 @@
<?php
-
/**
* This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
* appears in PHP 5.3. Changes are:
* * Error returns replaced with exceptions
* * Exception thrown if sizes or offsets are between 2GB and 4GB
* * Some variables renamed
+ *
+ * @file
*/
/**
@@ -96,7 +97,7 @@ class CdbReader_PHP extends CdbReader {
function __construct( $fileName ) {
$this->handle = fopen( $fileName, 'rb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open DB file "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file "' . $fileName . '"' );
}
$this->findStart();
}
@@ -137,7 +138,7 @@ class CdbReader_PHP extends CdbReader {
$buf = fread( $this->handle, $length );
if ( $buf === false || strlen( $buf ) !== $length ) {
- throw new MWException( __METHOD__.': read from cdb file failed, file may be corrupted' );
+ throw new MWException( __METHOD__.': read from CDB file failed, file may be corrupted' );
}
return $buf;
}
@@ -223,7 +224,7 @@ class CdbWriter_PHP extends CdbWriter {
$this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
$this->handle = fopen( $this->tmpFileName, 'wb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open DB file for write "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file for write "' . $fileName . '"' );
}
$this->hplist = array();
$this->numentries = 0;
diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php
index 8dce679b..7f0fee21 100644
--- a/includes/ChangeTags.php
+++ b/includes/ChangeTags.php
@@ -119,7 +119,6 @@ class ChangeTags {
}
// Figure out which conditions can be done.
- $join_field = '';
if ( in_array( 'recentchanges', $tables ) ) {
$join_cond = 'rc_id';
} elseif( in_array( 'logging', $tables ) ) {
@@ -168,10 +167,10 @@ class ChangeTags {
return $data;
}
- $html = implode( '&nbsp;', $data );
+ $html = implode( '&#160;', $data );
$html .= "\n" . Xml::element( 'input', array( 'type' => 'submit', 'value' => wfMsg( 'tag-filter-submit' ) ) );
- $html .= "\n" . Xml::hidden( 'title', $wgTitle-> getPrefixedText() );
- $html = Xml::tags( 'form', array( 'action' => $wgTitle->getLocalURL(), 'method' => 'get' ), $html );
+ $html .= "\n" . Html::hidden( 'title', $title->getPrefixedText() );
+ $html = Xml::tags( 'form', array( 'action' => $title->getLocalURL(), 'method' => 'get' ), $html );
return $html;
}
@@ -181,16 +180,17 @@ class ChangeTags {
// Caching...
global $wgMemc;
$key = wfMemcKey( 'valid-tags' );
-
- if ( $tags = $wgMemc->get( $key ) )
+ $tags = $wgMemc->get( $key );
+ if ( $tags ) {
return $tags;
+ }
$emptyTags = array();
// Some DB stuff
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'valid_tag', 'vt_tag', array(), __METHOD__ );
- while( $row = $res->fetchObject() ) {
+ foreach ( $res as $row ) {
$emptyTags[] = $row->vt_tag;
}
diff --git a/includes/ChangesFeed.php b/includes/ChangesFeed.php
index bc50fe02..f07b6505 100644
--- a/includes/ChangesFeed.php
+++ b/includes/ChangesFeed.php
@@ -27,8 +27,8 @@ class ChangesFeed {
* @return ChannelFeed subclass or false on failure
*/
public function getFeedObject( $title, $description ) {
- global $wgSitename, $wgContLanguageCode, $wgFeedClasses, $wgTitle;
- $feedTitle = "$wgSitename - {$title} [$wgContLanguageCode]";
+ global $wgSitename, $wgLanguageCode, $wgFeedClasses, $wgTitle;
+ $feedTitle = "$wgSitename - {$title} [$wgLanguageCode]";
if( !isset($wgFeedClasses[$this->format] ) )
return false;
return new $wgFeedClasses[$this->format](
@@ -45,18 +45,17 @@ class ChangesFeed {
* @return null or true
*/
public function execute( $feed, $rows, $lastmod, $opts ) {
- global $messageMemc, $wgFeedCacheTimeout;
- global $wgSitename, $wgLang;
+ global $wgLang, $wgRenderHashAppend;
if ( !FeedUtils::checkFeedOutput( $this->format ) ) {
return;
}
- $timekey = wfMemcKey( $this->type, $this->format, 'timestamp' );
- $optionsHash = md5( serialize( $opts->getAllValues() ) );
+ $optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
+ $timekey = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp' );
$key = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash );
- FeedUtils::checkPurge($timekey, $key);
+ FeedUtils::checkPurge( $timekey, $key );
/*
* Bumping around loading up diffs can be pretty slow, so where
@@ -102,7 +101,8 @@ class ChangesFeed {
* @return feed's content on cache hit or false on cache miss
*/
public function loadFromCache( $lastmod, $timekey, $key ) {
- global $wgFeedCacheTimeout, $messageMemc;
+ global $wgFeedCacheTimeout, $wgOut, $messageMemc;
+
$feedLastmod = $messageMemc->get( $timekey );
if( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
@@ -119,6 +119,9 @@ class ChangesFeed {
if( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix) {
wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
+ if ( $feedLastmodUnix < $lastmodUnix ) {
+ $wgOut->setLastModified( $feedLastmod ); // bug 21916
+ }
return $messageMemc->get( $key );
} else {
wfDebug( "RC: cached feed timestamp check failed ($feedLastmod; $lastmod)\n" );
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
index 9f092991..b8bc4f55 100644
--- a/includes/ChangesList.php
+++ b/includes/ChangesList.php
@@ -1,4 +1,12 @@
<?php
+/**
+ * Classes to show various lists of changes:
+ * - watchlist
+ * - related changes
+ * - recent changes
+ *
+ * @file
+ */
/**
* @todo document
@@ -17,13 +25,9 @@ class RCCacheEntry extends RecentChange {
}
/**
- * Class to show various lists of changes:
- * - what links here
- * - related changes
- * - recent changes
+ * Base class for all changes lists
*/
class ChangesList {
- # Called by history lists and recent changes
public $skin;
protected $watchlist = false;
@@ -44,11 +48,13 @@ class ChangesList {
* @return ChangesList derivative
*/
public static function newFromUser( &$user ) {
+ global $wgRequest;
+
$sk = $user->getSkin();
$list = null;
if( wfRunHooks( 'FetchChangesList', array( &$user, &$sk, &$list ) ) ) {
- return $user->getOption( 'usenewrc' ) ?
- new EnhancedChangesList( $sk ) : new OldChangesList( $sk );
+ $new = $wgRequest->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
+ return $new ? new EnhancedChangesList( $sk ) : new OldChangesList( $sk );
} else {
return $list;
}
@@ -85,7 +91,7 @@ class ChangesList {
* @param $bot Boolean
* @return String
*/
- protected function recentChangesFlags( $new, $minor, $patrolled, $nothing = '&nbsp;', $bot = false ) {
+ protected function recentChangesFlags( $new, $minor, $patrolled, $nothing = '&#160;', $bot = false ) {
$f = $new ? self::flag( 'newpage' ) : $nothing;
$f .= $minor ? self::flag( 'minor' ) : $nothing;
$f .= $bot ? self::flag( 'bot' ) : $nothing;
@@ -124,47 +130,6 @@ class ChangesList {
}
/**
- * Some explanatory wrapper text for the given flag, to be used in a legend
- * explaining what the flags mean. For instance, "N - new page". See
- * also flag().
- *
- * @param $key String: 'newpage', 'unpatrolled', 'minor', or 'bot'
- * @return String: Raw HTML
- */
- private static function flagLine( $key ) {
- return wfMsgExt( "recentchanges-legend-$key", array( 'escapenoentities',
- 'replaceafter' ), self::flag( $key ) );
- }
-
- /**
- * A handy legend to tell users what the little "m", "b", and so on mean.
- *
- * @return String: Raw HTML
- */
- public static function flagLegend() {
- global $wgGroupPermissions, $wgLang;
-
- $flags = array( self::flagLine( 'newpage' ),
- self::flagLine( 'minor' ) );
-
- # Don't show info on bot edits unless there's a bot group of some kind
- foreach ( $wgGroupPermissions as $rights ) {
- if ( isset( $rights['bot'] ) && $rights['bot'] ) {
- $flags[] = self::flagLine( 'bot' );
- break;
- }
- }
-
- if ( self::usePatrol() ) {
- $flags[] = self::flagLine( 'unpatrolled' );
- }
-
- return '<div class="mw-rc-label-legend">' .
- wfMsgExt( 'recentchanges-label-legend', 'parseinline',
- $wgLang->commaList( $flags ) ) . '</div>';
- }
-
- /**
* Returns text for the start of the tabular part of RC
* @return String
*/
@@ -595,14 +560,14 @@ class EnhancedChangesList extends ChangesList {
* @return String
*/
public function beginRecentChangesList() {
- global $wgStylePath, $wgStyleVersion;
+ global $wgOut;
$this->rc_cache = array();
$this->rcMoveIndex = 0;
$this->rcCacheIndex = 0;
$this->lastdate = '';
$this->rclistOpen = false;
- $script = Html::linkedScript( $wgStylePath . "/common/enhancedchanges.js?$wgStyleVersion" );
- return $script;
+ $wgOut->addModules( 'mediawiki.legacy.enhancedchanges' );
+ return '';
}
/**
* Format a line for enhanced recentchange (aka with javascript and block of lines).
@@ -628,7 +593,7 @@ class EnhancedChangesList extends ChangesList {
# Process current cache
$ret = $this->recentChangesBlock();
$this->rc_cache = array();
- $ret .= Xml::element( 'h4', null, $date );
+ $ret .= Xml::element( 'h4', null, $date ) . "\n";
$this->lastdate = $date;
}
@@ -771,7 +736,15 @@ class EnhancedChangesList extends ChangesList {
wfProfileIn( __METHOD__ );
- $r = '<table class="mw-enhanced-rc"><tr>';
+ # Add the namespace and title of the block as part of the class
+ if ( $block[0]->mAttribs['rc_log_type'] ) {
+ # Log entry
+ $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-' . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+ } else {
+ $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
+ }
+ $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+ Html::openElement( 'tr' );
# Collate list of users
$userlinks = array();
@@ -841,13 +814,13 @@ class EnhancedChangesList extends ChangesList {
$tl = "<span id='mw-rc-openarrow-$jsid' class='mw-changeslist-expanded' style='visibility:hidden'><a href='#' $toggleLink title='$expandTitle'>" . $this->sideArrow() . "</a></span>";
$tl .= "<span id='mw-rc-closearrow-$jsid' class='mw-changeslist-hidden' style='display:none'><a href='#' $toggleLink title='$closeTitle'>" . $this->downArrow() . "</a></span>";
- $r .= '<td class="mw-enhanced-rc">'.$tl.'&nbsp;';
+ $r .= '<td class="mw-enhanced-rc">'.$tl.'&#160;';
# Main line
- $r .= $this->recentChangesFlags( $isnew, false, $unpatrolled, '&nbsp;', $bot );
+ $r .= $this->recentChangesFlags( $isnew, false, $unpatrolled, '&#160;', $bot );
# Timestamp
- $r .= '&nbsp;'.$block[0]->timestamp.'&nbsp;</td><td style="padding:0px;">';
+ $r .= '&#160;'.$block[0]->timestamp.'&#160;</td><td style="padding:0px;">';
# Article link
if( $namehidden ) {
@@ -951,8 +924,8 @@ class EnhancedChangesList extends ChangesList {
#$r .= '<tr><td valign="top">'.$this->spacerArrow();
$r .= '<tr><td style="vertical-align:top;font-family:monospace; padding:0px;">';
$r .= $this->spacerIndent() . $this->spacerIndent();
- $r .= $this->recentChangesFlags( $rc_new, $rc_minor, $rcObj->unpatrolled, '&nbsp;', $rc_bot );
- $r .= '&nbsp;</td><td style="vertical-align:top; padding:0px;"><span style="font-family:monospace">';
+ $r .= $this->recentChangesFlags( $rc_new, $rc_minor, $rcObj->unpatrolled, '&#160;', $rc_bot );
+ $r .= '&#160;</td><td style="vertical-align:top; padding:0px;"><span style="font-family:monospace">';
$params = $queryParams;
@@ -1067,7 +1040,7 @@ class EnhancedChangesList extends ChangesList {
* @return String: HTML <td> tag
*/
protected function spacerIndent() {
- return '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
+ return '&#160;&#160;&#160;&#160;&#160;';
}
/**
@@ -1082,19 +1055,27 @@ class EnhancedChangesList extends ChangesList {
# Extract fields from DB into the function scope (rc_xxxx variables)
// FIXME: Would be good to replace this extract() call with something
// that explicitly initializes variables.
- $classes = array(); // TODO implement
+ // TODO implement
extract( $rcObj->mAttribs );
$query['curid'] = $rc_cur_id;
- $r = '<table class="mw-enhanced-rc"><tr>';
- $r .= '<td class="mw-enhanced-rc">' . $this->spacerArrow() . '&nbsp;';
+ if( $rc_log_type ) {
+ # Log entry
+ $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-' . $rc_log_type . '-' . $rcObj->mAttribs['rc_title'] );
+ } else {
+ $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' . $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
+ }
+ $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+ Html::openElement( 'tr' );
+
+ $r .= '<td class="mw-enhanced-rc">' . $this->spacerArrow() . '&#160;';
# Flag and Timestamp
if( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) {
- $r .= '&nbsp;&nbsp;&nbsp;&nbsp;'; // 4 flags -> 4 spaces
+ $r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
} else {
- $r .= $this->recentChangesFlags( $rc_type == RC_NEW, $rc_minor, $rcObj->unpatrolled, '&nbsp;', $rc_bot );
+ $r .= $this->recentChangesFlags( $rc_type == RC_NEW, $rc_minor, $rcObj->unpatrolled, '&#160;', $rc_bot );
}
- $r .= '&nbsp;'.$rcObj->timestamp.'&nbsp;</td><td style="padding:0px;">';
+ $r .= '&#160;'.$rcObj->timestamp.'&#160;</td><td style="padding:0px;">';
# Article or log link
if( $rc_log_type ) {
$logtitle = Title::newFromText( "Log/$rc_log_type", NS_SPECIAL );
@@ -1140,6 +1121,7 @@ class EnhancedChangesList extends ChangesList {
$this->insertComment( $r, $rcObj );
$this->insertRollback( $r, $rcObj );
# Tags
+ $classes = explode( ' ', $classes );
$this->insertTags( $r, $rcObj, $classes );
# Show how many people are watching this if enabled
$r .= $this->numberofWatchingusers($rcObj->numberofWatchingusers);
diff --git a/includes/Collation.php b/includes/Collation.php
new file mode 100644
index 00000000..f00b568f
--- /dev/null
+++ b/includes/Collation.php
@@ -0,0 +1,307 @@
+<?php
+
+abstract class Collation {
+ static $instance;
+
+ static function singleton() {
+ if ( !self::$instance ) {
+ global $wgCategoryCollation;
+ self::$instance = self::factory( $wgCategoryCollation );
+ }
+ return self::$instance;
+ }
+
+ static function factory( $collationName ) {
+ switch( $collationName ) {
+ case 'uppercase':
+ return new UppercaseCollation;
+ case 'uca-default':
+ return new IcuCollation( 'root' );
+ default:
+ throw new MWException( __METHOD__.": unknown collation type \"$collationName\"" );
+ }
+ }
+
+ /**
+ * Given a string, convert it to a (hopefully short) key that can be used
+ * for efficient sorting. A binary sort according to the sortkeys
+ * corresponds to a logical sort of the corresponding strings. Current
+ * code expects that a line feed character should sort before all others, but
+ * has no other particular expectations (and that one can be changed if
+ * necessary).
+ *
+ * @param string $string UTF-8 string
+ * @return string Binary sortkey
+ */
+ abstract function getSortKey( $string );
+
+ /**
+ * Given a string, return the logical "first letter" to be used for
+ * grouping on category pages and so on. This has to be coordinated
+ * carefully with convertToSortkey(), or else the sorted list might jump
+ * back and forth between the same "initial letters" or other pathological
+ * behavior. For instance, if you just return the first character, but "a"
+ * sorts the same as "A" based on getSortKey(), then you might get a
+ * list like
+ *
+ * == A ==
+ * * [[Aardvark]]
+ *
+ * == a ==
+ * * [[antelope]]
+ *
+ * == A ==
+ * * [[Ape]]
+ *
+ * etc., assuming for the sake of argument that $wgCapitalLinks is false.
+ *
+ * @param string $string UTF-8 string
+ * @return string UTF-8 string corresponding to the first letter of input
+ */
+ abstract function getFirstLetter( $string );
+}
+
+class UppercaseCollation extends Collation {
+ var $lang;
+ function __construct() {
+ // Get a language object so that we can use the generic UTF-8 uppercase
+ // function there
+ $this->lang = Language::factory( 'en' );
+ }
+
+ function getSortKey( $string ) {
+ return $this->lang->uc( $string );
+ }
+
+ function getFirstLetter( $string ) {
+ if ( $string[0] == "\0" ) {
+ $string = substr( $string, 1 );
+ }
+ return $this->lang->ucfirst( $this->lang->firstChar( $string ) );
+ }
+}
+
+class IcuCollation extends Collation {
+ var $primaryCollator, $mainCollator, $locale;
+ var $firstLetterData;
+
+ /**
+ * Unified CJK blocks.
+ *
+ * The same definition of a CJK block must be used for both Collation and
+ * generateCollationData.php. These blocks are omitted from the first
+ * letter data, as an optimisation measure and because the default UCA table
+ * is pretty useless for sorting Chinese text anyway. Japanese and Korean
+ * blocks are not included here, because they are smaller and more useful.
+ */
+ static $cjkBlocks = array(
+ array( 0x2E80, 0x2EFF ), // CJK Radicals Supplement
+ array( 0x2F00, 0x2FDF ), // Kangxi Radicals
+ array( 0x2FF0, 0x2FFF ), // Ideographic Description Characters
+ array( 0x3000, 0x303F ), // CJK Symbols and Punctuation
+ array( 0x31C0, 0x31EF ), // CJK Strokes
+ array( 0x3200, 0x32FF ), // Enclosed CJK Letters and Months
+ array( 0x3300, 0x33FF ), // CJK Compatibility
+ array( 0x3400, 0x4DBF ), // CJK Unified Ideographs Extension A
+ array( 0x4E00, 0x9FFF ), // CJK Unified Ideographs
+ array( 0xF900, 0xFAFF ), // CJK Compatibility Ideographs
+ array( 0xFE30, 0xFE4F ), // CJK Compatibility Forms
+ array( 0x20000, 0x2A6DF ), // CJK Unified Ideographs Extension B
+ array( 0x2A700, 0x2B73F ), // CJK Unified Ideographs Extension C
+ array( 0x2B740, 0x2B81F ), // CJK Unified Ideographs Extension D
+ array( 0x2F800, 0x2FA1F ), // CJK Compatibility Ideographs Supplement
+ );
+
+ const RECORD_LENGTH = 14;
+
+ function __construct( $locale ) {
+ if ( !extension_loaded( 'intl' ) ) {
+ throw new MWException( 'An ICU collation was requested, ' .
+ 'but the intl extension is not available.' );
+ }
+ $this->locale = $locale;
+ $this->mainCollator = Collator::create( $locale );
+ if ( !$this->mainCollator ) {
+ throw new MWException( "Invalid ICU locale specified for collation: $locale" );
+ }
+
+ $this->primaryCollator = Collator::create( $locale );
+ $this->primaryCollator->setStrength( Collator::PRIMARY );
+ }
+
+ function getSortKey( $string ) {
+ // intl extension produces non null-terminated
+ // strings. Appending '' fixes it so that it doesn't generate
+ // a warning on each access in debug php.
+ wfSuppressWarnings();
+ $key = $this->mainCollator->getSortKey( $string ) . '';
+ wfRestoreWarnings();
+ return $key;
+ }
+
+ function getPrimarySortKey( $string ) {
+ wfSuppressWarnings();
+ $key = $this->primaryCollator->getSortKey( $string ) . '';
+ wfRestoreWarnings();
+ return $key;
+ }
+
+ function getFirstLetter( $string ) {
+ $string = strval( $string );
+ if ( $string === '' ) {
+ return '';
+ }
+
+ // Check for CJK
+ $firstChar = mb_substr( $string, 0, 1, 'UTF-8' );
+ if ( ord( $firstChar ) > 0x7f
+ && self::isCjk( utf8ToCodepoint( $firstChar ) ) )
+ {
+ return $firstChar;
+ }
+
+ $sortKey = $this->getPrimarySortKey( $string );
+
+ // Do a binary search to find the correct letter to sort under
+ $min = $this->findLowerBound(
+ array( $this, 'getSortKeyByLetterIndex' ),
+ $this->getFirstLetterCount(),
+ 'strcmp',
+ $sortKey );
+
+ if ( $min === false ) {
+ // Before the first letter
+ return '';
+ }
+ return $this->getLetterByIndex( $min );
+ }
+
+ function getFirstLetterData() {
+ if ( $this->firstLetterData !== null ) {
+ return $this->firstLetterData;
+ }
+
+ $cache = wfGetCache( CACHE_ANYTHING );
+ $cacheKey = wfMemcKey( 'first-letters', $this->locale );
+ $cacheEntry = $cache->get( $cacheKey );
+
+ if ( $cacheEntry ) {
+ $this->firstLetterData = $cacheEntry;
+ return $this->firstLetterData;
+ }
+
+ // Generate data from serialized data file
+
+ $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
+ if ( $letters === false ) {
+ throw new MWException( "MediaWiki does not support ICU locale " .
+ "\"{$this->locale}\"" );
+ }
+
+ // Sort the letters.
+ //
+ // It's impossible to have the precompiled data file properly sorted,
+ // because the sort order changes depending on ICU version. If the
+ // array is not properly sorted, the binary search will return random
+ // results.
+ //
+ // We also take this opportunity to remove primary collisions.
+ $letterMap = array();
+ foreach ( $letters as $letter ) {
+ $key = $this->getPrimarySortKey( $letter );
+ if ( isset( $letterMap[$key] ) ) {
+ // Primary collision
+ // Keep whichever one sorts first in the main collator
+ if ( $this->mainCollator->compare( $letter, $letterMap[$key] ) < 0 ) {
+ $letterMap[$key] = $letter;
+ }
+ } else {
+ $letterMap[$key] = $letter;
+ }
+ }
+ ksort( $letterMap, SORT_STRING );
+ $data = array(
+ 'chars' => array_values( $letterMap ),
+ 'keys' => array_keys( $letterMap )
+ );
+
+ // Reduce memory usage before caching
+ unset( $letterMap );
+
+ // Save to cache
+ $this->firstLetterData = $data;
+ $cache->set( $cacheKey, $data, 86400 * 7 /* 1 week */ );
+ return $data;
+ }
+
+ function getLetterByIndex( $index ) {
+ if ( $this->firstLetterData === null ) {
+ $this->getFirstLetterData();
+ }
+ return $this->firstLetterData['chars'][$index];
+ }
+
+ function getSortKeyByLetterIndex( $index ) {
+ if ( $this->firstLetterData === null ) {
+ $this->getFirstLetterData();
+ }
+ return $this->firstLetterData['keys'][$index];
+ }
+
+ function getFirstLetterCount() {
+ if ( $this->firstLetterData === null ) {
+ $this->getFirstLetterData();
+ }
+ return count( $this->firstLetterData['chars'] );
+ }
+
+ /**
+ * Do a binary search, and return the index of the largest item that sorts
+ * less than or equal to the target value.
+ *
+ * @param $valueCallback A function to call to get the value with
+ * a given array index.
+ * @param $valueCount The number of items accessible via $valueCallback,
+ * indexed from 0 to $valueCount - 1
+ * @param $comparisonCallback A callback to compare two values, returning
+ * -1, 0 or 1 in the style of strcmp().
+ * @param $target The target value to find.
+ *
+ * @return The item index of the lower bound, or false if the target value
+ * sorts before all items.
+ */
+ function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+ $min = 0;
+ $max = $valueCount - 1;
+ do {
+ $mid = $min + ( ( $max - $min ) >> 1 );
+ $item = call_user_func( $valueCallback, $mid );
+ $comparison = call_user_func( $comparisonCallback, $target, $item );
+ if ( $comparison > 0 ) {
+ $min = $mid;
+ } elseif ( $comparison == 0 ) {
+ $min = $mid;
+ break;
+ } else {
+ $max = $mid;
+ }
+ } while ( $min < $max - 1 );
+
+ if ( $min == 0 && $max == 0 && $comparison > 0 ) {
+ // Before the first item
+ return false;
+ } else {
+ return $min;
+ }
+ }
+
+ static function isCjk( $codepoint ) {
+ foreach ( self::$cjkBlocks as $block ) {
+ if ( $codepoint >= $block[0] && $codepoint <= $block[1] ) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
diff --git a/includes/ConfEditor.php b/includes/ConfEditor.php
index f862ebb7..b08b77df 100644
--- a/includes/ConfEditor.php
+++ b/includes/ConfEditor.php
@@ -72,7 +72,7 @@ class ConfEditor {
var $pathInfo;
/**
- * Next serial number for whitespace placeholder paths (@extra-N)
+ * Next serial number for whitespace placeholder paths (\@extra-N)
*/
var $serial;
@@ -104,7 +104,7 @@ class ConfEditor {
/**
* Edit the text. Returns the edited text.
- * @param array $ops Array of operations.
+ * @param $ops Array of operations.
*
* Operations are given as an associative array, with members:
* type: One of delete, set, append or insert (required)
@@ -176,7 +176,7 @@ class ConfEditor {
// Has it got a comma already?
if ( strpos( $lastEltPath, '@extra' ) === false && !$lastEltInfo['hasComma'] ) {
// No comma, insert one after the value region
- list( $start, $end ) = $this->findValueRegion( $lastEltPath );
+ list( , $end ) = $this->findValueRegion( $lastEltPath );
$this->replaceSourceRegion( $end - 1, $end - 1, ',' );
}
@@ -184,7 +184,7 @@ class ConfEditor {
list( $start, $end ) = $this->findDeletionRegion( $lastEltPath );
if ( $key === null ) {
- list( $indent, $arrowIndent ) = $this->getIndent( $start );
+ list( $indent, ) = $this->getIndent( $start );
$textToInsert = "$indent$value,";
} else {
list( $indent, $arrowIndent ) =
@@ -202,12 +202,12 @@ class ConfEditor {
if ( $firstEltPath === false ) {
throw new MWException( "Can't find array element of \"$path\"" );
}
- list( $start, $end ) = $this->findDeletionRegion( $firstEltPath );
+ list( $start, ) = $this->findDeletionRegion( $firstEltPath );
$info = $this->pathInfo[$firstEltPath];
// Make the text to insert
if ( $key === null ) {
- list( $indent, $arrowIndent ) = $this->getIndent( $start );
+ list( $indent, ) = $this->getIndent( $start );
$textToInsert = "$indent$value,";
} else {
list( $indent, $arrowIndent ) =
@@ -336,7 +336,7 @@ class ConfEditor {
// Split all copy operations with a source corresponding to the region
// in question.
$newEdits = array();
- foreach ( $this->edits as $i => $edit ) {
+ foreach ( $this->edits as $edit ) {
if ( $edit[0] !== 'copy' ) {
$newEdits[] = $edit;
continue;
@@ -427,7 +427,7 @@ class ConfEditor {
*/
function findValueRegion( $pathName ) {
if ( !isset( $this->pathInfo[$pathName] ) ) {
- throw new MWEXception( "Can't find path \"$pathName\"" );
+ throw new MWException( "Can't find path \"$pathName\"" );
}
$path = $this->pathInfo[$pathName];
if ( $path['valueStartByte'] === false || $path['valueEndByte'] === false ) {
@@ -438,7 +438,7 @@ class ConfEditor {
/**
* Find the path name of the last element in the array.
- * If the array is empty, this will return the @extra interstitial element.
+ * If the array is empty, this will return the \@extra interstitial element.
* If the specified path is not found or is not an array, it will return false.
*/
function findLastArrayElement( $path ) {
@@ -474,7 +474,7 @@ class ConfEditor {
/*
* Find the path name of first element in the array.
- * If the array is empty, this will return the @extra interstitial element.
+ * If the array is empty, this will return the \@extra interstitial element.
* If the specified path is not found or is not an array, it will return false.
*/
function findFirstArrayElement( $path ) {
@@ -510,7 +510,6 @@ class ConfEditor {
$indent = false;
}
if ( $indent !== false && $arrowPos !== false ) {
- $textToInsert = "$indent$key ";
$arrowIndentLength = $arrowPos - $pos - $indentLength - strlen( $key );
if ( $arrowIndentLength > 0 ) {
$arrowIndent = str_repeat( ' ', $arrowIndentLength );
@@ -537,7 +536,7 @@ class ConfEditor {
switch ( $state ) {
case 'file':
- $token = $this->expect( T_OPEN_TAG );
+ $this->expect( T_OPEN_TAG );
$token = $this->skipSpace();
if ( $token->isEnd() ) {
break 2;
@@ -836,7 +835,6 @@ class ConfEditor {
* not call except from popPath() or nextPath().
*/
function endPath() {
- $i = count( $this->pathStack ) - 1;
$key = '';
foreach ( $this->pathStack as $pathInfo ) {
if ( $key !== '' ) {
@@ -878,7 +876,7 @@ class ConfEditor {
/**
* Go to the next path on the same level. This ends the current path and
- * starts a new one. If $path is @next, the new path is set to the next
+ * starts a new one. If $path is \@next, the new path is set to the next
* numeric array element.
*/
function nextPath( $path ) {
diff --git a/includes/Credits.php b/includes/Credits.php
index 91ba3f16..e4c8be54 100644
--- a/includes/Credits.php
+++ b/includes/Credits.php
@@ -1,50 +1,51 @@
<?php
/**
- * Credits.php -- formats credits for articles
+ * Formats credits for articles
+ *
* Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This program is 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.
+ * 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
+ * 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
*
+ * @file
* @author <evan@wikitravel.org>
*/
class Credits {
-
/**
* This is largely cadged from PageHistory::history
* @param $article Article object
*/
public static function showPage( Article $article ) {
global $wgOut;
-
+
wfProfileIn( __METHOD__ );
-
+
$wgOut->setPageTitle( $article->mTitle->getPrefixedText() );
$wgOut->setSubtitle( wfMsg( 'creditspage' ) );
$wgOut->setArticleFlag( false );
$wgOut->setArticleRelated( true );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
-
- if( $article->mTitle->getArticleID() == 0 ) {
+
+ if ( $article->mTitle->getArticleID() == 0 ) {
$s = wfMsg( 'nocredits' );
} else {
- $s = self::getCredits($article, -1 );
+ $s = self::getCredits( $article, -1 );
}
-
+
$wgOut->addHTML( $s );
-
+
wfProfileOut( __METHOD__ );
}
@@ -59,7 +60,7 @@ class Credits {
wfProfileIn( __METHOD__ );
$s = '';
- if( isset( $cnt ) && $cnt != 0 ){
+ if ( isset( $cnt ) && $cnt != 0 ) {
$s = self::getAuthor( $article );
if ( $cnt > 1 || $cnt < 0 ) {
$s .= ' ' . self::getContributors( $article, $cnt - 1, $showIfMax );
@@ -74,13 +75,13 @@ class Credits {
* Get the last author with the last modification time
* @param $article Article object
*/
- protected static function getAuthor( Article $article ){
+ protected static function getAuthor( Article $article ) {
global $wgLang;
$user = User::newFromId( $article->getUser() );
$timestamp = $article->getTimestamp();
- if( $timestamp ){
+ if ( $timestamp ) {
$d = $wgLang->date( $article->getTimestamp(), true );
$t = $wgLang->time( $article->getTimestamp(), true );
} else {
@@ -99,62 +100,72 @@ class Credits {
*/
protected static function getContributors( Article $article, $cnt, $showIfMax ) {
global $wgLang, $wgHiddenPrefs;
-
+
$contributors = $article->getContributors();
-
+
$others_link = false;
-
+
# Hmm... too many to fit!
- if( $cnt > 0 && $contributors->count() > $cnt ){
+ if ( $cnt > 0 && $contributors->count() > $cnt ) {
$others_link = self::othersLink( $article );
- if( !$showIfMax )
- return wfMsg( 'othercontribs', $others_link );
+ if ( !$showIfMax )
+ return wfMsgExt( 'othercontribs', 'parsemag', $others_link, $contributors->count() );
}
-
+
$real_names = array();
$user_names = array();
$anon_ips = array();
-
+
# Sift for real versus user names
- foreach( $contributors as $user ) {
+ foreach ( $contributors as $user ) {
$cnt--;
- if( $user->isLoggedIn() ){
+ if ( $user->isLoggedIn() ) {
$link = self::link( $user );
- if( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() )
+ if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
$real_names[] = $link;
- else
+ } else {
$user_names[] = $link;
+ }
} else {
$anon_ips[] = self::link( $user );
}
- if( $cnt == 0 ) break;
+
+ if ( $cnt == 0 ) {
+ break;
+ }
}
-
+
if ( count( $real_names ) ) {
$real = $wgLang->listToText( $real_names );
} else {
$real = false;
}
-
+
# "ThisSite user(s) A, B and C"
- if( count( $user_names ) ){
- $user = wfMsgExt( 'siteusers', array( 'parsemag' ),
- $wgLang->listToText( $user_names ), count( $user_names ) );
+ if ( count( $user_names ) ) {
+ $user = wfMsgExt(
+ 'siteusers',
+ 'parsemag',
+ $wgLang->listToText( $user_names ), count( $user_names )
+ );
} else {
$user = false;
}
- if( count( $anon_ips ) ){
- $anon = wfMsgExt( 'anonusers', array( 'parsemag' ),
- $wgLang->listToText( $anon_ips ), count( $anon_ips ) );
+ if ( count( $anon_ips ) ) {
+ $anon = wfMsgExt(
+ 'anonusers',
+ 'parsemag',
+ $wgLang->listToText( $anon_ips ), count( $anon_ips )
+ );
} else {
$anon = false;
}
-
+
# This is the big list, all mooshed together. We sift for blank strings
$fulllist = array();
- foreach( array( $real, $user, $anon, $others_link ) as $s ){
- if( $s ){
+ foreach ( array( $real, $user, $anon, $others_link ) as $s ) {
+ if ( $s ) {
array_push( $fulllist, $s );
}
}
@@ -163,7 +174,9 @@ class Credits {
$creds = $wgLang->listToText( $fulllist );
# "Based on work by ..."
- return strlen( $creds ) ? wfMsg( 'othercontribs', $creds ) : '';
+ return strlen( $creds )
+ ? wfMsgExt( 'othercontribs', 'parsemag', $creds, count( $fulllist ) )
+ : '';
}
/**
@@ -173,10 +186,11 @@ class Credits {
*/
protected static function link( User $user ) {
global $wgUser, $wgHiddenPrefs;
- if( !in_array( 'realname', $wgHiddenPrefs ) && !$user->isAnon() )
+ if ( !in_array( 'realname', $wgHiddenPrefs ) && !$user->isAnon() ) {
$real = $user->getRealName();
- else
+ } else {
$real = false;
+ }
$skin = $wgUser->getSkin();
$page = $user->isAnon() ?
@@ -188,20 +202,20 @@ class Credits {
/**
* Get a link to $user's user page
- * @param $user_name String: user name
- * @param $linkText String: optional display
+ * @param $user User object
* @return String: html
*/
protected static function userLink( User $user ) {
$link = self::link( $user );
- if( $user->isAnon() ){
+ if ( $user->isAnon() ) {
return wfMsgExt( 'anonuser', array( 'parseinline', 'replaceafter' ), $link );
} else {
global $wgHiddenPrefs;
- if( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() )
+ if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
return $link;
- else
- return wfMsgExt( 'siteuser', array( 'parseinline', 'replaceafter' ), $link );
+ } else {
+ return wfMsgExt( 'siteuser', 'parsemag', $link, $user->getName() );
+ }
}
}
@@ -213,6 +227,12 @@ class Credits {
protected static function othersLink( Article $article ) {
global $wgUser;
$skin = $wgUser->getSkin();
- return $skin->link( $article->getTitle(), wfMsgHtml( 'others' ), array(), array( 'action' => 'credits' ), array( 'known' ) );
+ return $skin->link(
+ $article->getTitle(),
+ wfMsgHtml( 'others' ),
+ array(),
+ array( 'action' => 'credits' ),
+ array( 'known' )
+ );
}
}
diff --git a/includes/DatabaseFunctions.php b/includes/DatabaseFunctions.php
deleted file mode 100644
index 2df56115..00000000
--- a/includes/DatabaseFunctions.php
+++ /dev/null
@@ -1,412 +0,0 @@
-<?php
-/**
- * Legacy database functions, for compatibility with pre-1.3 code
- * NOTE: this file is no longer loaded by default.
- * @file
- * @ingroup Database
- */
-
-/**
- * Usually aborts on failure
- * If errors are explicitly ignored, returns success
- * @param $sql String: SQL query
- * @param $db Mixed: database handler
- * @param $fname String: name of the php function calling
- */
-function wfQuery( $sql, $db, $fname = '' ) {
- if ( !is_numeric( $db ) ) {
- # Someone has tried to call this the old way
- throw new FatalError( wfMsgNoDB( 'wrong_wfQuery_params', $db, $sql ) );
- }
- $c = wfGetDB( $db );
- if ( $c !== false ) {
- return $c->query( $sql, $fname );
- } else {
- return false;
- }
-}
-
-/**
- *
- * @param $sql String: SQL query
- * @param $dbi
- * @param $fname String: name of the php function calling
- * @return Array: first row from the database
- */
-function wfSingleQuery( $sql, $dbi, $fname = '' ) {
- $db = wfGetDB( $dbi );
- $res = $db->query($sql, $fname );
- $row = $db->fetchRow( $res );
- $ret = $row[0];
- $db->freeResult( $res );
- return $ret;
-}
-
-/**
- * Turns on (false) or off (true) the automatic generation and sending
- * of a "we're sorry, but there has been a database error" page on
- * database errors. Default is on (false). When turned off, the
- * code should use wfLastErrno() and wfLastError() to handle the
- * situation as appropriate.
- *
- * @param $newstate
- * @param $dbi
- * @return Returns the previous state.
- */
-function wfIgnoreSQLErrors( $newstate, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->ignoreErrors( $newstate );
- } else {
- return null;
- }
-}
-
-/**#@+
- * @param $res Database result handler
- * @param $dbi
-*/
-
-/**
- * Free a database result
- * @return Bool: whether result is sucessful or not.
- */
-function wfFreeResult( $res, $dbi = DB_LAST )
-{
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- $db->freeResult( $res );
- return true;
- } else {
- return false;
- }
-}
-
-/**
- * Get an object from a database result
- * @return object|false object we requested
- */
-function wfFetchObject( $res, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->fetchObject( $res, $dbi = DB_LAST );
- } else {
- return false;
- }
-}
-
-/**
- * Get a row from a database result
- * @return object|false row we requested
- */
-function wfFetchRow( $res, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->fetchRow ( $res, $dbi = DB_LAST );
- } else {
- return false;
- }
-}
-
-/**
- * Get a number of rows from a database result
- * @return integer|false number of rows
- */
-function wfNumRows( $res, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->numRows( $res, $dbi = DB_LAST );
- } else {
- return false;
- }
-}
-
-/**
- * Get the number of fields from a database result
- * @return integer|false number of fields
- */
-function wfNumFields( $res, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->numFields( $res );
- } else {
- return false;
- }
-}
-
-/**
- * Return name of a field in a result
- * @param $res Mixed: Ressource link see Database::fieldName()
- * @param $n Integer: id of the field
- * @param $dbi Default DB_LAST
- * @return string|false name of field
- */
-function wfFieldName( $res, $n, $dbi = DB_LAST )
-{
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->fieldName( $res, $n, $dbi = DB_LAST );
- } else {
- return false;
- }
-}
-/**#@-*/
-
-/**
- * @todo document function
- * @see Database::insertId()
- */
-function wfInsertId( $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->insertId();
- } else {
- return false;
- }
-}
-
-/**
- * @todo document function
- * @see Database::dataSeek()
- */
-function wfDataSeek( $res, $row, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->dataSeek( $res, $row );
- } else {
- return false;
- }
-}
-
-/**
- * Get the last error number
- * @see Database::lastErrno()
- */
-function wfLastErrno( $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->lastErrno();
- } else {
- return false;
- }
-}
-
-/**
- * Get the last error
- * @see Database::lastError()
- */
-function wfLastError( $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->lastError();
- } else {
- return false;
- }
-}
-
-/**
- * Get the number of affected rows
- * @see Database::affectedRows()
- */
-function wfAffectedRows( $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->affectedRows();
- } else {
- return false;
- }
-}
-
-/**
- * Get the last query ran
- * @see Database::lastQuery
- */
-function wfLastDBquery( $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->lastQuery();
- } else {
- return false;
- }
-}
-
-/**
- * @see Database::Set()
- * @todo document function
- * @param $table
- * @param $var
- * @param $value
- * @param $cond
- * @param $dbi Default DB_MASTER
- */
-function wfSetSQL( $table, $var, $value, $cond, $dbi = DB_MASTER )
-{
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->set( $table, $var, $value, $cond );
- } else {
- return false;
- }
-}
-
-
-/**
- * Simple select wrapper, return one field
- * @see Database::selectField()
- * @param $table
- * @param $var
- * @param $cond Default ''
- * @param $dbi Default DB_LAST
- */
-function wfGetSQL( $table, $var, $cond='', $dbi = DB_LAST )
-{
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->selectField( $table, $var, $cond );
- } else {
- return false;
- }
-}
-
-/**
- * Does a given field exist on the specified table?
- * @see Database::fieldExists()
- * @param $table
- * @param $field
- * @param $dbi Default DB_LAST
- * @return Result of Database::fieldExists() or false.
- */
-function wfFieldExists( $table, $field, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->fieldExists( $table, $field );
- } else {
- return false;
- }
-}
-
-/**
- * Does the requested index exist on the specified table?
- * @see Database::indexExists()
- * @param $table String
- * @param $index
- * @param $dbi Default DB_LAST
- * @return Result of Database::indexExists() or false.
- */
-function wfIndexExists( $table, $index, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->indexExists( $table, $index );
- } else {
- return false;
- }
-}
-
-/**
- * @see Database::insert()
- * @todo document function
- * @param $table String
- * @param $array Array
- * @param $fname String, default 'wfInsertArray'.
- * @param $dbi Default DB_MASTER
- * @return result of Database::insert() or false.
- */
-function wfInsertArray( $table, $array, $fname = 'wfInsertArray', $dbi = DB_MASTER ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->insert( $table, $array, $fname );
- } else {
- return false;
- }
-}
-
-/**
- * @see Database::getArray()
- * @todo document function
- * @param $table String
- * @param $vars
- * @param $conds
- * @param $fname String, default 'wfGetArray'.
- * @param $dbi Default DB_LAST
- * @return result of Database::getArray() or false.
- */
-function wfGetArray( $table, $vars, $conds, $fname = 'wfGetArray', $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->getArray( $table, $vars, $conds, $fname );
- } else {
- return false;
- }
-}
-
-/**
- * @see Database::update()
- * @param $table String
- * @param $values
- * @param $conds
- * @param $fname String, default 'wfUpdateArray'
- * @param $dbi Default DB_MASTER
- * @return Result of Database::update()) or false;
- * @todo document function
- */
-function wfUpdateArray( $table, $values, $conds, $fname = 'wfUpdateArray', $dbi = DB_MASTER ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- $db->update( $table, $values, $conds, $fname );
- return true;
- } else {
- return false;
- }
-}
-
-/**
- * Get fully usable table name
- * @see Database::tableName()
- */
-function wfTableName( $name, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->tableName( $name );
- } else {
- return false;
- }
-}
-
-/**
- * @todo document function
- * @see Database::strencode()
- */
-function wfStrencode( $s, $dbi = DB_LAST ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->strencode( $s );
- } else {
- return false;
- }
-}
-
-/**
- * @todo document function
- * @see Database::nextSequenceValue()
- */
-function wfNextSequenceValue( $seqName, $dbi = DB_MASTER ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->nextSequenceValue( $seqName );
- } else {
- return false;
- }
-}
-
-/**
- * @todo document function
- * @see Database::useIndexClause()
- */
-function wfUseIndexClause( $index, $dbi = DB_SLAVE ) {
- $db = wfGetDB( $dbi );
- if ( $db !== false ) {
- return $db->useIndexClause( $index );
- } else {
- return false;
- }
-}
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index 54a96d44..ae6fc1b7 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -1,5 +1,6 @@
<?php
/**
+ * @file
*
* NEVER EDIT THIS FILE
*
@@ -14,80 +15,78 @@
*
* Documentation is in the source and on:
* http://www.mediawiki.org/wiki/Manual:Configuration_settings
- *
*/
-# This is not a valid entry point, perform no further processing unless MEDIAWIKI is defined
+/**
+ * @cond file_level_code
+ * This is not a valid entry point, perform no further processing unless MEDIAWIKI is defined
+ */
if( !defined( 'MEDIAWIKI' ) ) {
echo "This file is part of MediaWiki and is not a valid entry point\n";
die( 1 );
}
-/**
- * Create a site configuration object
- * Not used for much in a default install
- */
+# Create a site configuration object. Not used for much in a default install
if ( !defined( 'MW_PHP4' ) ) {
require_once( "$IP/includes/SiteConfiguration.php" );
$wgConf = new SiteConfiguration;
}
+/** @endcond */
/** MediaWiki version number */
-$wgVersion = '1.16.5';
+$wgVersion = '1.17.0';
/** Name of the site. It must be changed in LocalSettings.php */
$wgSitename = 'MediaWiki';
/**
- * Name of the project namespace. If left set to false, $wgSitename will be
- * used instead.
- */
-$wgMetaNamespace = false;
-
-/**
- * Name of the project talk namespace.
+ * URL of the server. It will be automatically built including https mode.
*
- * Normally you can ignore this and it will be something like
- * $wgMetaNamespace . "_talk". In some languages, you may want to set this
- * manually for grammatical reasons. It is currently only respected by those
- * languages where it might be relevant and where no automatic grammar converter
- * exists.
+ * Example:
+ * <code>
+ * $wgServer = http://example.com
+ * </code>
+ *
+ * This is usually detected correctly by MediaWiki. If MediaWiki detects the
+ * wrong server, it will redirect incorrectly after you save a page. In that
+ * case, set this variable to fix it.
*/
-$wgMetaNamespaceTalk = false;
-
-
-/** URL of the server. It will be automatically built including https mode */
$wgServer = '';
+/** @cond file_level_code */
if( isset( $_SERVER['SERVER_NAME'] ) ) {
- $wgServerName = $_SERVER['SERVER_NAME'];
+ $serverName = $_SERVER['SERVER_NAME'];
} elseif( isset( $_SERVER['HOSTNAME'] ) ) {
- $wgServerName = $_SERVER['HOSTNAME'];
+ $serverName = $_SERVER['HOSTNAME'];
} elseif( isset( $_SERVER['HTTP_HOST'] ) ) {
- $wgServerName = $_SERVER['HTTP_HOST'];
+ $serverName = $_SERVER['HTTP_HOST'];
} elseif( isset( $_SERVER['SERVER_ADDR'] ) ) {
- $wgServerName = $_SERVER['SERVER_ADDR'];
+ $serverName = $_SERVER['SERVER_ADDR'];
} else {
- $wgServerName = 'localhost';
+ $serverName = 'localhost';
}
-# check if server use https:
$wgProto = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
-$wgServer = $wgProto.'://' . $wgServerName;
+$wgServer = $wgProto.'://' . $serverName;
# If the port is a non-standard one, add it to the URL
if( isset( $_SERVER['SERVER_PORT'] )
- && !strpos( $wgServerName, ':' )
- && ( ( $wgProto == 'http' && $_SERVER['SERVER_PORT'] != 80 )
+ && !strpos( $serverName, ':' )
+ && ( ( $wgProto == 'http' && $_SERVER['SERVER_PORT'] != 80 )
|| ( $wgProto == 'https' && $_SERVER['SERVER_PORT'] != 443 ) ) ) {
$wgServer .= ":" . $_SERVER['SERVER_PORT'];
}
+/** @endcond */
+/************************************************************************//**
+ * @name Script path settings
+ * @{
+ */
/**
* The path we should point to.
- * It might be a virtual path in case with use apache mod_rewrite for example
+ * It might be a virtual path in case with use apache mod_rewrite for example.
*
* This *needs* to be set correctly.
*
@@ -117,85 +116,207 @@ $wgUsePathInfo =
( strpos( php_sapi_name(), 'apache2filter' ) === false ) &&
( strpos( php_sapi_name(), 'isapi' ) === false );
+/**
+ * The extension to append to script names by default. This can either be .php
+ * or .php5.
+ *
+ * Some hosting providers use PHP 4 for *.php files, and PHP 5 for *.php5. This
+ * variable is provided to support those providers.
+ */
+$wgScriptExtension = '.php';
-/**@{
- * Script users will request to get articles
- * ATTN: Old installations used wiki.phtml and redirect.phtml - make sure that
- * LocalSettings.php is correctly set!
+/**
+ * The URL path to index.php.
*
- * Will be set based on $wgScriptPath in Setup.php if not overridden in
- * LocalSettings.php. Generally you should not need to change this unless you
- * don't like seeing "index.php".
+ * Defaults to "{$wgScriptPath}/index{$wgScriptExtension}".
*/
-$wgScriptExtension = '.php'; ///< extension to append to script names by default
-$wgScript = false; ///< defaults to "{$wgScriptPath}/index{$wgScriptExtension}"
-$wgRedirectScript = false; ///< defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}"
-/**@}*/
+$wgScript = false;
+/**
+ * The URL path to redirect.php. This is a script that is used by the Nostalgia
+ * skin.
+ *
+ * Defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}".
+ */
+$wgRedirectScript = false; ///< defaults to
-/**@{
+/**
+ * The URL path to load.php.
+ *
+ * Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
+ */
+$wgLoadScript = false;
+
+/**@}*/
+
+/************************************************************************//**
+ * @name URLs and file paths
+ *
* These various web and file path variables are set to their defaults
* in Setup.php if they are not explicitly set from LocalSettings.php.
* If you do override them, be sure to set them all!
*
* These will relatively rarely need to be set manually, unless you are
* splitting style sheets or images outside the main document root.
+ *
+ * In this section, a "path" is usually a host-relative URL, i.e. a URL without
+ * the host part, that starts with a slash. In most cases a full URL is also
+ * acceptable. A "directory" is a local file path.
+ *
+ * In both paths and directories, trailing slashes should not be included.
+ *
+ * @{
*/
+
/**
- * asset paths as seen by users
+ * The URL path of the skins directory. Defaults to "{$wgScriptPath}/skins"
*/
-$wgStylePath = false; ///< defaults to "{$wgScriptPath}/skins"
-$wgExtensionAssetsPath = false; ///< defaults to "{$wgScriptPath}/extensions"
+$wgStylePath = false;
+$wgStyleSheetPath = &$wgStylePath;
/**
- * filesystem stylesheets directory
+ * The URL path of the skins directory. Should not point to an external domain.
+ * Defaults to "{$wgScriptPath}/skins".
+ */
+$wgLocalStylePath = false;
+
+/**
+ * The URL path of the extensions directory.
+ * Defaults to "{$wgScriptPath}/extensions".
+ */
+$wgExtensionAssetsPath = false;
+
+/**
+ * Filesystem stylesheets directory. Defaults to "{$IP}/skins"
+ */
+$wgStyleDirectory = false;
+
+/**
+ * The URL path for primary article page views. This path should contain $1,
+ * which is replaced by the article title.
+ *
+ * Defaults to "{$wgScript}/$1" or "{$wgScript}?title=$1", depending on
+ * $wgUsePathInfo.
+ */
+$wgArticlePath = false;
+
+/**
+ * The URL path for the images directory. Defaults to "{$wgScriptPath}/images"
+ */
+$wgUploadPath = false;
+
+/**
+ * The filesystem path of the images directory. Defaults to "{$IP}/images".
+ */
+$wgUploadDirectory = false;
+
+/**
+ * The URL path of the wiki logo. The logo size should be 135x135 pixels.
+ * Defaults to "{$wgStylePath}/common/images/wiki.png".
+ */
+$wgLogo = false;
+
+/**
+ * The URL path of the shortcut icon.
*/
-$wgStyleDirectory = false; ///< defaults to "{$IP}/skins"
-$wgStyleSheetPath = &$wgStylePath;
-$wgArticlePath = false; ///< default to "{$wgScript}/$1" or "{$wgScript}?title=$1", depending on $wgUsePathInfo
-$wgUploadPath = false; ///< defaults to "{$wgScriptPath}/images"
-$wgUploadDirectory = false; ///< defaults to "{$IP}/images"
-$wgHashedUploadDirectory = true;
-$wgLogo = false; ///< defaults to "{$wgStylePath}/common/images/wiki.png"
$wgFavicon = '/favicon.ico';
-$wgAppleTouchIcon = false; ///< This one'll actually default to off. For iPhone and iPod Touch web app bookmarks
-$wgMathPath = false; ///< defaults to "{$wgUploadPath}/math"
-$wgMathDirectory = false; ///< defaults to "{$wgUploadDirectory}/math"
-$wgTmpDirectory = false; ///< defaults to "{$wgUploadDirectory}/tmp"
-$wgUploadBaseUrl = "";
-/**@}*/
/**
- * Directory for caching data in the local filesystem. Should not be accessible
- * from the web. Set this to false to not use any local caches.
+ * The URL path of the icon for iPhone and iPod Touch web app bookmarks.
+ * Defaults to no icon.
+ */
+$wgAppleTouchIcon = false;
+
+/**
+ * The URL path of the math directory. Defaults to "{$wgUploadPath}/math".
*
- * Note: if multiple wikis share the same localisation cache directory, they
- * must all have the same set of extensions. You can set a directory just for
- * the localisation cache using $wgLocalisationCacheConf['storeDirectory'].
+ * See http://www.mediawiki.org/wiki/Manual:Enable_TeX for details about how to
+ * set up mathematical formula display.
*/
-$wgCacheDirectory = false;
+$wgMathPath = false;
/**
- * Default value for chmoding of new directories.
+ * The filesystem path of the math directory.
+ * Defaults to "{$wgUploadDirectory}/math".
+ *
+ * See http://www.mediawiki.org/wiki/Manual:Enable_TeX for details about how to
+ * set up mathematical formula display.
*/
-$wgDirectoryMode = 0777;
+$wgMathDirectory = false;
/**
- * New file storage paths; currently used only for deleted files.
- * Set it like this:
+ * The local filesystem path to a temporary directory. This is not required to
+ * be web accessible.
*
- * $wgFileStore['deleted']['directory'] = '/var/wiki/private/deleted';
+ * Defaults to "{$wgUploadDirectory}/tmp".
+ */
+$wgTmpDirectory = false;
+
+/**
+ * If set, this URL is added to the start of $wgUploadPath to form a complete
+ * upload URL.
+ */
+$wgUploadBaseUrl = "";
+
+/**
+ * To enable remote on-demand scaling, set this to the thumbnail base URL.
+ * Full thumbnail URL will be like $wgUploadStashScalerBaseUrl/e/e6/Foo.jpg/123px-Foo.jpg
+ * where 'e6' are the first two characters of the MD5 hash of the file name.
+ * If $wgUploadStashScalerBaseUrl is set to false, thumbs are rendered locally as needed.
+ */
+$wgUploadStashScalerBaseUrl = false;
+
+/**
+ * To set 'pretty' URL paths for actions other than
+ * plain page views, add to this array. For instance:
+ * 'edit' => "$wgScriptPath/edit/$1"
*
+ * There must be an appropriate script or rewrite rule
+ * in place to handle these URLs.
+ */
+$wgActionPaths = array();
+
+/**@}*/
+
+/************************************************************************//**
+ * @name Files and file uploads
+ * @{
+ */
+
+/** Uploads have to be specially set up to be secure */
+$wgEnableUploads = false;
+
+/** Allows to move images and other media files */
+$wgAllowImageMoving = true;
+
+/**
+ * These are additional characters that should be replaced with '-' in file names
+ */
+$wgIllegalFileChars = ":";
+
+/**
+ * @deprecated use $wgDeletedDirectory
*/
$wgFileStore = array();
-$wgFileStore['deleted']['directory'] = false;///< Defaults to $wgUploadDirectory/deleted
-$wgFileStore['deleted']['url'] = null; ///< Private
-$wgFileStore['deleted']['hash'] = 3; ///< 3-level subdirectory split
-$wgImgAuthDetails = false; ///< defaults to false - only set to true if you use img_auth and want the user to see details on why access failed
-$wgImgAuthPublicTest = true; ///< defaults to true - if public read is turned on, no need for img_auth, config error unless other access is used
+/**
+ * What directory to place deleted uploads in
+ */
+$wgDeletedDirectory = false; // Defaults to $wgUploadDirectory/deleted
+
+/**
+ * Set this to true if you use img_auth and want the user to see details on why access failed.
+ */
+$wgImgAuthDetails = false;
-/**@{
+/**
+ * If this is enabled, img_auth.php will not allow image access unless the wiki
+ * is private. This improves security when image uploads are hosted on a
+ * separate domain.
+ */
+$wgImgAuthPublicTest = true;
+
+/**
* File repository structures
*
* $wgLocalFileRepo is a single repository structure, and $wgForeignFileRepos is
@@ -203,59 +324,62 @@ $wgImgAuthPublicTest = true; ///< defaults to true - if public read is turned on
* array of properties configuring the repository.
*
* Properties required for all repos:
- * class The class name for the repository. May come from the core or an extension.
+ * - class The class name for the repository. May come from the core or an extension.
* The core repository classes are LocalRepo, ForeignDBRepo, FSRepo.
*
- * name A unique name for the repository.
+ * - name A unique name for the repository.
*
* For most core repos:
- * url Base public URL
- * hashLevels The number of directory levels for hash-based division of files
- * thumbScriptUrl The URL for thumb.php (optional, not recommended)
- * transformVia404 Whether to skip media file transformation on parse and rely on a 404
+ * - url Base public URL
+ * - hashLevels The number of directory levels for hash-based division of files
+ * - thumbScriptUrl The URL for thumb.php (optional, not recommended)
+ * - transformVia404 Whether to skip media file transformation on parse and rely on a 404
* handler instead.
- * initialCapital Equivalent to $wgCapitalLinks (or $wgCapitalLinkOverrides[NS_FILE],
+ * - initialCapital Equivalent to $wgCapitalLinks (or $wgCapitalLinkOverrides[NS_FILE],
* determines whether filenames implicitly start with a capital letter.
* The current implementation may give incorrect description page links
* when the local $wgCapitalLinks and initialCapital are mismatched.
- * pathDisclosureProtection
+ * - pathDisclosureProtection
* May be 'paranoid' to remove all parameters from error messages, 'none' to
* leave the paths in unchanged, or 'simple' to replace paths with
* placeholders. Default for LocalRepo is 'simple'.
- * fileMode This allows wikis to set the file mode when uploading/moving files. Default
+ * - fileMode This allows wikis to set the file mode when uploading/moving files. Default
* is 0644.
- * directory The local filesystem directory where public files are stored. Not used for
+ * - directory The local filesystem directory where public files are stored. Not used for
* some remote repos.
- * thumbDir The base thumbnail directory. Defaults to <directory>/thumb.
- * thumbUrl The base thumbnail URL. Defaults to <url>/thumb.
+ * - thumbDir The base thumbnail directory. Defaults to <directory>/thumb.
+ * - thumbUrl The base thumbnail URL. Defaults to <url>/thumb.
*
*
* These settings describe a foreign MediaWiki installation. They are optional, and will be ignored
* for local repositories:
- * descBaseUrl URL of image description pages, e.g. http://en.wikipedia.org/wiki/Image:
- * scriptDirUrl URL of the MediaWiki installation, equivalent to $wgScriptPath, e.g.
- * http://en.wikipedia.org/w
- *
- * articleUrl Equivalent to $wgArticlePath, e.g. http://en.wikipedia.org/wiki/$1
- * fetchDescription Fetch the text of the remote file description page. Equivalent to
+ * - descBaseUrl URL of image description pages, e.g. http://en.wikipedia.org/wiki/File:
+ * - scriptDirUrl URL of the MediaWiki installation, equivalent to $wgScriptPath, e.g.
+ * http://en.wikipedia.org/w
+ * - scriptExtension Script extension of the MediaWiki installation, equivalent to
+ * $wgScriptExtension, e.g. .php5 defaults to .php
+ *
+ * - articleUrl Equivalent to $wgArticlePath, e.g. http://en.wikipedia.org/wiki/$1
+ * - fetchDescription Fetch the text of the remote file description page. Equivalent to
* $wgFetchCommonsDescriptions.
*
* ForeignDBRepo:
- * dbType, dbServer, dbUser, dbPassword, dbName, dbFlags
+ * - dbType, dbServer, dbUser, dbPassword, dbName, dbFlags
* equivalent to the corresponding member of $wgDBservers
- * tablePrefix Table prefix, the foreign wiki's $wgDBprefix
- * hasSharedCache True if the wiki's shared cache is accessible via the local $wgMemc
+ * - tablePrefix Table prefix, the foreign wiki's $wgDBprefix
+ * - hasSharedCache True if the wiki's shared cache is accessible via the local $wgMemc
*
* ForeignAPIRepo:
- * apibase Use for the foreign API's URL
- * apiThumbCacheExpiry How long to locally cache thumbs for
+ * - apibase Use for the foreign API's URL
+ * - apiThumbCacheExpiry How long to locally cache thumbs for
*
* The default is to initialise these arrays from the MW<1.11 backwards compatible settings:
* $wgUploadPath, $wgThumbnailScriptPath, $wgSharedUploadDirectory, etc.
*/
$wgLocalFileRepo = false;
+
+/** @see $wgLocalFileRepo */
$wgForeignFileRepos = array();
-/**@}*/
/**
* Use Commons as a remote file repository. Essentially a wrapper, when this
@@ -265,76 +389,398 @@ $wgForeignFileRepos = array();
$wgUseInstantCommons = false;
/**
- * Allowed title characters -- regex character class
- * Don't change this unless you know what you're doing
+ * Show EXIF data, on by default if available.
+ * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
*
- * Problematic punctuation:
- * []{}|# Are needed for link syntax, never enable these
- * <> Causes problems with HTML escaping, don't use
- * % Enabled by default, minor problems with path to query rewrite rules, see below
- * + Enabled by default, but doesn't work with path to query rewrite rules, corrupted by apache
- * ? Enabled by default, but doesn't work with path to PATH_INFO rewrites
+ * NOTE FOR WINDOWS USERS:
+ * To enable EXIF functions, add the folloing lines to the
+ * "Windows extensions" section of php.ini:
*
- * All three of these punctuation problems can be avoided by using an alias, instead of a
- * rewrite rule of either variety.
+ * extension=extensions/php_mbstring.dll
+ * extension=extensions/php_exif.dll
+ */
+$wgShowEXIF = function_exists( 'exif_read_data' );
+
+/**
+ * If you operate multiple wikis, you can define a shared upload path here.
+ * Uploads to this wiki will NOT be put there - they will be put into
+ * $wgUploadDirectory.
+ * If $wgUseSharedUploads is set, the wiki will look in the shared repository if
+ * no file of the given name is found in the local repository (for [[File:..]],
+ * [[Media:..]] links). Thumbnails will also be looked for and generated in this
+ * directory.
*
- * The problem with % is that when using a path to query rewrite rule, URLs are
- * double-unescaped: once by Apache's path conversion code, and again by PHP. So
- * %253F, for example, becomes "?". Our code does not double-escape to compensate
- * for this, indeed double escaping would break if the double-escaped title was
- * passed in the query string rather than the path. This is a minor security issue
- * because articles can be created such that they are hard to view or edit.
+ * Note that these configuration settings can now be defined on a per-
+ * repository basis for an arbitrary number of file repositories, using the
+ * $wgForeignFileRepos variable.
+ */
+$wgUseSharedUploads = false;
+/** Full path on the web server where shared uploads can be found */
+$wgSharedUploadPath = "http://commons.wikimedia.org/shared/images";
+/** Fetch commons image description pages and display them on the local wiki? */
+$wgFetchCommonsDescriptions = false;
+/** Path on the file system where shared uploads can be found. */
+$wgSharedUploadDirectory = "/var/www/wiki3/images";
+/** DB name with metadata about shared directory. Set this to false if the uploads do not come from a wiki. */
+$wgSharedUploadDBname = false;
+/** Optional table prefix used in database. */
+$wgSharedUploadDBprefix = '';
+/** Cache shared metadata in memcached. Don't do this if the commons wiki is in a different memcached domain */
+$wgCacheSharedUploads = true;
+/**
+* Allow for upload to be copied from an URL. Requires Special:Upload?source=web
+* The timeout for copy uploads is set by $wgHTTPTimeout.
+*/
+$wgAllowCopyUploads = false;
+/**
+ * Allow asynchronous copy uploads.
+ * This feature is experimental.
+ */
+$wgAllowAsyncCopyUploads = false;
+
+/**
+ * Max size for uploads, in bytes. Applies to all uploads.
+ */
+$wgMaxUploadSize = 1024*1024*100; # 100MB
+
+/**
+ * Point the upload navigation link to an external URL
+ * Useful if you want to use a shared repository by default
+ * without disabling local uploads (use $wgEnableUploads = false for that)
+ * e.g. $wgUploadNavigationUrl = 'http://commons.wikimedia.org/wiki/Special:Upload';
+ */
+$wgUploadNavigationUrl = false;
+
+/**
+ * Point the upload link for missing files to an external URL, as with
+ * $wgUploadNavigationUrl. The URL will get (?|&)wpDestFile=<filename>
+ * appended to it as appropriate.
+ */
+$wgUploadMissingFileUrl = false;
+
+/**
+ * Give a path here to use thumb.php for thumbnail generation on client request, instead of
+ * generating them on render and outputting a static URL. This is necessary if some of your
+ * apache servers don't have read/write access to the thumbnail path.
*
- * In some rare cases you may wish to remove + for compatibility with old links.
+ * Example:
+ * $wgThumbnailScriptPath = "{$wgScriptPath}/thumb{$wgScriptExtension}";
+ */
+$wgThumbnailScriptPath = false;
+$wgSharedThumbnailScriptPath = false;
+
+/**
+ * Set this to false if you do not want MediaWiki to divide your images
+ * directory into many subdirectories, for improved performance.
*
- * Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but
- * this breaks interlanguage links
+ * It's almost always good to leave this enabled. In previous versions of
+ * MediaWiki, some users set this to false to allow images to be added to the
+ * wiki by simply copying them into $wgUploadDirectory and then running
+ * maintenance/rebuildImages.php to register them in the database. This is no
+ * longer recommended, use maintenance/importImages.php instead.
+ *
+ * Note that this variable may be ignored if $wgLocalFileRepo is set.
*/
-$wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
-$wgIllegalFileChars = ":"; // These are additional characters that should be replaced with '-' in file names
+$wgHashedUploadDirectory = true;
+/**
+ * Set the following to false especially if you have a set of files that need to
+ * be accessible by all wikis, and you do not want to use the hash (path/a/aa/)
+ * directory layout.
+ */
+$wgHashedSharedUploadDirectory = true;
+
+/**
+ * Base URL for a repository wiki. Leave this blank if uploads are just stored
+ * in a shared directory and not meant to be accessible through a separate wiki.
+ * Otherwise the image description pages on the local wiki will link to the
+ * image description page on this wiki.
+ *
+ * Please specify the namespace, as in the example below.
+ */
+$wgRepositoryBaseUrl = "http://commons.wikimedia.org/wiki/File:";
/**
- * The external URL protocols
+ * This is the list of preferred extensions for uploading files. Uploading files
+ * with extensions not in this list will trigger a warning.
+ *
+ * WARNING: If you add any OpenOffice or Microsoft Office file formats here,
+ * such as odt or doc, and untrusted users are allowed to upload files, then
+ * your wiki will be vulnerable to cross-site request forgery (CSRF).
*/
-$wgUrlProtocols = array(
- 'http://',
- 'https://',
- 'ftp://',
- 'irc://',
- 'gopher://',
- 'telnet://', // Well if we're going to support the above.. -ævar
- 'nntp://', // @bug 3808 RFC 1738
- 'worldwind://',
- 'mailto:',
- 'news:',
- 'svn://',
+$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
+
+/** Files with these extensions will never be allowed as uploads. */
+$wgFileBlacklist = array(
+ # HTML may contain cookie-stealing JavaScript and web bugs
+ 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
+ # PHP scripts may execute arbitrary code on the server
+ 'php', 'phtml', 'php3', 'php4', 'php5', 'phps',
+ # Other types that may be interpreted by some servers
+ 'shtml', 'jhtml', 'pl', 'py', 'cgi',
+ # May contain harmful executables for Windows victims
+ 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' );
+
+/**
+ * Files with these mime types will never be allowed as uploads
+ * if $wgVerifyMimeType is enabled.
+ */
+$wgMimeTypeBlacklist = array(
+ # HTML may contain cookie-stealing JavaScript and web bugs
+ 'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
+ # PHP scripts may execute arbitrary code on the server
+ 'application/x-php', 'text/x-php',
+ # Other types that may be interpreted by some servers
+ 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
+ # Client-side hazards on Internet Explorer
+ 'text/scriptlet', 'application/x-msdownload',
+ # Windows metafile, client-side vulnerability on some systems
+ 'application/x-msmetafile',
+ # A ZIP file may be a valid Java archive containing an applet which exploits the
+ # same-origin policy to steal cookies
+ 'application/zip',
+
+ # MS Office OpenXML and other Open Package Conventions files are zip files
+ # and thus blacklisted just as other zip files. If you remove these entries
+ # from the blacklist in your local configuration, a malicious file upload
+ # will be able to compromise the wiki's user accounts, and the user
+ # accounts of any other website in the same cookie domain.
+ 'application/x-opc+zip',
+ 'application/msword',
+ 'application/vnd.ms-powerpoint',
+ 'application/vnd.msexcel',
);
-/** internal name of virus scanner. This servers as a key to the $wgAntivirusSetup array.
- * Set this to NULL to disable virus scanning. If not null, every file uploaded will be scanned for viruses.
+/**
+ * This is a flag to determine whether or not to check file extensions on upload.
+ *
+ * WARNING: setting this to false is insecure for public wikis.
*/
-$wgAntivirus= null;
+$wgCheckFileExtensions = true;
-/** Configuration for different virus scanners. This an associative array of associative arrays:
- * it contains on setup array per known scanner type. The entry is selected by $wgAntivirus, i.e.
- * valid values for $wgAntivirus are the keys defined in this array.
+/**
+ * If this is turned off, users may override the warning for files not covered
+ * by $wgFileExtensions.
+ *
+ * WARNING: setting this to false is insecure for public wikis.
+ */
+$wgStrictFileExtensions = true;
+
+/** Warn if uploaded files are larger than this (in bytes), or false to disable*/
+$wgUploadSizeWarning = false;
+
+/**
+ * list of trusted media-types and mime types.
+ * Use the MEDIATYPE_xxx constants to represent media types.
+ * This list is used by File::isSafeFile
+ *
+ * Types not listed here will have a warning about unsafe content
+ * displayed on the images description page. It would also be possible
+ * to use this for further restrictions, like disabling direct
+ * [[media:...]] links for non-trusted formats.
+ */
+$wgTrustedMediaFormats = array(
+ MEDIATYPE_BITMAP, //all bitmap formats
+ MEDIATYPE_AUDIO, //all audio formats
+ MEDIATYPE_VIDEO, //all plain video formats
+ "image/svg+xml", //svg (only needed if inline rendering of svg is not supported)
+ "application/pdf", //PDF files
+ #"application/x-shockwave-flash", //flash/shockwave movie
+);
+
+/**
+ * Plugins for media file type handling.
+ * Each entry in the array maps a MIME type to a class name
+ */
+$wgMediaHandlers = array(
+ 'image/jpeg' => 'BitmapHandler',
+ 'image/png' => 'PNGHandler',
+ 'image/gif' => 'GIFHandler',
+ 'image/tiff' => 'TiffHandler',
+ 'image/x-ms-bmp' => 'BmpHandler',
+ 'image/x-bmp' => 'BmpHandler',
+ 'image/svg+xml' => 'SvgHandler', // official
+ 'image/svg' => 'SvgHandler', // compat
+ 'image/vnd.djvu' => 'DjVuHandler', // official
+ 'image/x.djvu' => 'DjVuHandler', // compat
+ 'image/x-djvu' => 'DjVuHandler', // compat
+);
+
+/**
+ * Resizing can be done using PHP's internal image libraries or using
+ * ImageMagick or another third-party converter, e.g. GraphicMagick.
+ * These support more file formats than PHP, which only supports PNG,
+ * GIF, JPG, XBM and WBMP.
+ *
+ * Use Image Magick instead of PHP builtin functions.
+ */
+$wgUseImageMagick = false;
+/** The convert command shipped with ImageMagick */
+$wgImageMagickConvertCommand = '/usr/bin/convert';
+
+/** Sharpening parameter to ImageMagick */
+$wgSharpenParameter = '0x0.4';
+
+/** Reduction in linear dimensions below which sharpening will be enabled */
+$wgSharpenReductionThreshold = 0.85;
+
+/**
+ * Temporary directory used for ImageMagick. The directory must exist. Leave
+ * this set to false to let ImageMagick decide for itself.
+ */
+$wgImageMagickTempDir = false;
+
+/**
+ * Use another resizing converter, e.g. GraphicMagick
+ * %s will be replaced with the source path, %d with the destination
+ * %w and %h will be replaced with the width and height.
+ *
+ * Example for GraphicMagick:
+ * <code>
+ * $wgCustomConvertCommand = "gm convert %s -resize %wx%h %d"
+ * </code>
+ *
+ * Leave as false to skip this.
+ */
+$wgCustomConvertCommand = false;
+
+/**
+ * Scalable Vector Graphics (SVG) may be uploaded as images.
+ * Since SVG support is not yet standard in browsers, it is
+ * necessary to rasterize SVGs to PNG as a fallback format.
+ *
+ * An external program is required to perform this conversion.
+ */
+$wgSVGConverters = array(
+ 'ImageMagick' => '$path/convert -background white -thumbnail $widthx$height\! $input PNG:$output',
+ 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
+ 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
+ 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
+ 'rsvg' => '$path/rsvg -w$width -h$height $input $output',
+ 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
+ );
+/** Pick a converter defined in $wgSVGConverters */
+$wgSVGConverter = 'ImageMagick';
+/** If not in the executable PATH, specify the SVG converter path. */
+$wgSVGConverterPath = '';
+/** Don't scale a SVG larger than this */
+$wgSVGMaxSize = 2048;
+/** Don't read SVG metadata beyond this point.
+ * Default is 1024*256 bytes */
+$wgSVGMetadataCutoff = 262144;
+
+/**
+ * MediaWiki will reject HTMLesque tags in uploaded files due to idiotic browsers which can't
+ * perform basic stuff like MIME detection and which are vulnerable to further idiots uploading
+ * crap files as images. When this directive is on, <title> will be allowed in files with
+ * an "image/svg+xml" MIME type. You should leave this disabled if your web server is misconfigured
+ * and doesn't send appropriate MIME types for SVG images.
+ */
+$wgAllowTitlesInSVG = false;
+
+/**
+ * Don't thumbnail an image if it will use too much working memory.
+ * Default is 50 MB if decompressed to RGBA form, which corresponds to
+ * 12.5 million pixels or 3500x3500
+ */
+$wgMaxImageArea = 1.25e7;
+/**
+ * Force thumbnailing of animated GIFs above this size to a single
+ * frame instead of an animated thumbnail. As of MW 1.17 this limit
+ * is checked against the total size of all frames in the animation.
+ * It probably makes sense to keep this equal to $wgMaxImageArea.
+ */
+$wgMaxAnimatedGifArea = 1.25e7;
+/**
+ * Browsers don't support TIFF inline generally...
+ * For inline display, we need to convert to PNG or JPEG.
+ * Note scaling should work with ImageMagick, but may not with GD scaling.
*
- * The configuration array for each scanner contains the following keys: "command", "codemap", "messagepattern";
+ * Example:
+ * <code>
+ * // PNG is lossless, but inefficient for photos
+ * $wgTiffThumbnailType = array( 'png', 'image/png' );
+ * // JPEG is good for photos, but has no transparency support. Bad for diagrams.
+ * $wgTiffThumbnailType = array( 'jpg', 'image/jpeg' );
+ * </code>
+ */
+ $wgTiffThumbnailType = false;
+
+/**
+ * If rendered thumbnail files are older than this timestamp, they
+ * will be rerendered on demand as if the file didn't already exist.
+ * Update if there is some need to force thumbs and SVG rasterizations
+ * to rerender, such as fixes to rendering bugs.
+ */
+$wgThumbnailEpoch = '20030516000000';
+
+/**
+ * If set, inline scaled images will still produce <img> tags ready for
+ * output instead of showing an error message.
*
- * "command" is the full command to call the virus scanner - %f will be replaced with the name of the
- * file to scan. If not present, the filename will be appended to the command. Note that this must be
- * overwritten if the scanner is not in the system path; in that case, plase set
- * $wgAntivirusSetup[$wgAntivirus]['command'] to the desired command with full path.
+ * This may be useful if errors are transitory, especially if the site
+ * is configured to automatically render thumbnails on request.
*
- * "codemap" is a mapping of exit code to return codes of the detectVirus function in SpecialUpload.
- * An exit code mapped to AV_SCAN_FAILED causes the function to consider the scan to be failed. This will pass
- * the file if $wgAntivirusRequired is not set.
- * An exit code mapped to AV_SCAN_ABORTED causes the function to consider the file to have an usupported format,
- * which is probably imune to virusses. This causes the file to pass.
- * An exit code mapped to AV_NO_VIRUS will cause the file to pass, meaning no virus was found.
- * All other codes (like AV_VIRUS_FOUND) will cause the function to report a virus.
- * You may use "*" as a key in the array to catch all exit codes not mapped otherwise.
+ * On the other hand, it may obscure error conditions from debugging.
+ * Enable the debug log or the 'thumbnail' log group to make sure errors
+ * are logged to a file for review.
+ */
+$wgIgnoreImageErrors = false;
+
+/**
+ * Allow thumbnail rendering on page view. If this is false, a valid
+ * thumbnail URL is still output, but no file will be created at
+ * the target location. This may save some time if you have a
+ * thumb.php or 404 handler set up which is faster than the regular
+ * webserver(s).
+ */
+$wgGenerateThumbnailOnParse = true;
+
+/**
+* Show thumbnails for old images on the image description page
+*/
+$wgShowArchiveThumbnails = true;
+
+/** Obsolete, always true, kept for compatibility with extensions */
+$wgUseImageResize = true;
+
+
+/**
+ * Internal name of virus scanner. This servers as a key to the
+ * $wgAntivirusSetup array. Set this to NULL to disable virus scanning. If not
+ * null, every file uploaded will be scanned for viruses.
+ */
+$wgAntivirus= null;
+
+/**
+ * Configuration for different virus scanners. This an associative array of
+ * associative arrays. It contains one setup array per known scanner type.
+ * The entry is selected by $wgAntivirus, i.e.
+ * valid values for $wgAntivirus are the keys defined in this array.
+ *
+ * The configuration array for each scanner contains the following keys:
+ * "command", "codemap", "messagepattern":
+ *
+ * "command" is the full command to call the virus scanner - %f will be
+ * replaced with the name of the file to scan. If not present, the filename
+ * will be appended to the command. Note that this must be overwritten if the
+ * scanner is not in the system path; in that case, plase set
+ * $wgAntivirusSetup[$wgAntivirus]['command'] to the desired command with full
+ * path.
+ *
+ * "codemap" is a mapping of exit code to return codes of the detectVirus
+ * function in SpecialUpload.
+ * - An exit code mapped to AV_SCAN_FAILED causes the function to consider
+ * the scan to be failed. This will pass the file if $wgAntivirusRequired
+ * is not set.
+ * - An exit code mapped to AV_SCAN_ABORTED causes the function to consider
+ * the file to have an usupported format, which is probably imune to
+ * virusses. This causes the file to pass.
+ * - An exit code mapped to AV_NO_VIRUS will cause the file to pass, meaning
+ * no virus was found.
+ * - All other codes (like AV_VIRUS_FOUND) will cause the function to report
+ * a virus.
+ * - You may use "*" as a key in the array to catch all exit codes not mapped otherwise.
*
* "messagepattern" is a perl regular expression to extract the meaningful part of the scanners
* output. The relevant part should be matched as group one (\1).
@@ -373,13 +819,13 @@ $wgAntivirusSetup = array(
/** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. */
-$wgAntivirusRequired= true;
+$wgAntivirusRequired = true;
/** Determines if the mime type of uploaded files should be checked */
-$wgVerifyMimeType= true;
+$wgVerifyMimeType = true;
/** Sets the mime type definition file to use by MimeMagic.php. */
-$wgMimeTypeFile= "includes/mime.types";
+$wgMimeTypeFile = "includes/mime.types";
#$wgMimeTypeFile= "/etc/mime.types";
#$wgMimeTypeFile= null; #use built-in defaults only.
@@ -387,25 +833,30 @@ $wgMimeTypeFile= "includes/mime.types";
$wgMimeInfoFile= "includes/mime.info";
#$wgMimeInfoFile= null; #use built-in defaults only.
-/** Switch for loading the FileInfo extension by PECL at runtime.
+/**
+ * Switch for loading the FileInfo extension by PECL at runtime.
* This should be used only if fileinfo is installed as a shared object
- * or a dynamic libary
+ * or a dynamic library.
*/
-$wgLoadFileinfoExtension= false;
+$wgLoadFileinfoExtension = false;
/** Sets an external mime detector program. The command must print only
* the mime type to standard output.
* The name of the file to process will be appended to the command given here.
* If not set or NULL, mime_content_type will be used if available.
+ * Example:
+ * <code>
+ * #$wgMimeDetectorCommand = "file -bi"; # use external mime detector (Linux)
+ * </code>
*/
-$wgMimeDetectorCommand= null; # use internal mime_content_type function, available since php 4.3.0
-#$wgMimeDetectorCommand= "file -bi"; #use external mime detector (Linux)
+$wgMimeDetectorCommand = null;
-/** Switch for trivial mime detection. Used by thumb.php to disable all fance
+/**
+ * Switch for trivial mime detection. Used by thumb.php to disable all fancy
* things, because only a few types of images are needed and file extensions
* can be trusted.
*/
-$wgTrivialMimeDetection= false;
+$wgTrivialMimeDetection = false;
/**
* Additional XML types we can allow via mime-detection.
@@ -420,117 +871,136 @@ $wgXMLMimeTypes = array(
);
/**
- * To set 'pretty' URL paths for actions other than
- * plain page views, add to this array. For instance:
- * 'edit' => "$wgScriptPath/edit/$1"
- *
- * There must be an appropriate script or rewrite rule
- * in place to handle these URLs.
+ * Limit images on image description pages to a user-selectable limit. In order
+ * to reduce disk usage, limits can only be selected from a list.
+ * The user preference is saved as an array offset in the database, by default
+ * the offset is set with $wgDefaultUserOptions['imagesize']. Make sure you
+ * change it if you alter the array (see bug 8858).
+ * This is the list of settings the user can choose from:
*/
-$wgActionPaths = array();
+$wgImageLimits = array (
+ array(320,240),
+ array(640,480),
+ array(800,600),
+ array(1024,768),
+ array(1280,1024),
+ array(10000,10000) );
/**
- * If you operate multiple wikis, you can define a shared upload path here.
- * Uploads to this wiki will NOT be put there - they will be put into
- * $wgUploadDirectory.
- * If $wgUseSharedUploads is set, the wiki will look in the shared repository if
- * no file of the given name is found in the local repository (for [[Image:..]],
- * [[Media:..]] links). Thumbnails will also be looked for and generated in this
- * directory.
- *
- * Note that these configuration settings can now be defined on a per-
- * repository basis for an arbitrary number of file repositories, using the
- * $wgForeignFileRepos variable.
+ * Adjust thumbnails on image pages according to a user setting. In order to
+ * reduce disk usage, the values can only be selected from a list. This is the
+ * list of settings the user can choose from:
*/
-$wgUseSharedUploads = false;
-/** Full path on the web server where shared uploads can be found */
-$wgSharedUploadPath = "http://commons.wikimedia.org/shared/images";
-/** Fetch commons image description pages and display them on the local wiki? */
-$wgFetchCommonsDescriptions = false;
-/** Path on the file system where shared uploads can be found. */
-$wgSharedUploadDirectory = "/var/www/wiki3/images";
-/** DB name with metadata about shared directory. Set this to false if the uploads do not come from a wiki. */
-$wgSharedUploadDBname = false;
-/** Optional table prefix used in database. */
-$wgSharedUploadDBprefix = '';
-/** Cache shared metadata in memcached. Don't do this if the commons wiki is in a different memcached domain */
-$wgCacheSharedUploads = true;
+$wgThumbLimits = array(
+ 120,
+ 150,
+ 180,
+ 200,
+ 250,
+ 300
+);
+
/**
-* Allow for upload to be copied from an URL. Requires Special:Upload?source=web
-* The timeout for copy uploads is set by $wgHTTPTimeout.
-*/
-$wgAllowCopyUploads = false;
+ * Default parameters for the <gallery> tag
+ */
+$wgGalleryOptions = array (
+ 'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
+ 'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
+ 'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
+ 'captionLength' => 20, // Length of caption to truncate (in characters)
+ 'showBytes' => true, // Show the filesize in bytes in categories
+);
/**
- * Max size for uploads, in bytes. Currently only works for uploads from URL
- * via CURL (see $wgAllowCopyUploads). The only way to impose limits on
- * normal uploads is currently to edit php.ini.
+ * Adjust width of upright images when parameter 'upright' is used
+ * This allows a nicer look for upright images without the need to fix the width
+ * by hardcoded px in wiki sourcecode.
*/
-$wgMaxUploadSize = 1024*1024*100; # 100MB
+$wgThumbUpright = 0.75;
/**
- * Point the upload navigation link to an external URL
- * Useful if you want to use a shared repository by default
- * without disabling local uploads (use $wgEnableUploads = false for that)
- * e.g. $wgUploadNavigationUrl = 'http://commons.wikimedia.org/wiki/Special:Upload';
- *
- * This also affects images inline images that do not exist. In that case the URL will get
- * (?|&)wpDestFile=<filename> appended to it as appropriate.
+ * Default value for chmoding of new directories.
*/
-$wgUploadNavigationUrl = false;
+$wgDirectoryMode = 0777;
/**
- * Give a path here to use thumb.php for thumbnail generation on client request, instead of
- * generating them on render and outputting a static URL. This is necessary if some of your
- * apache servers don't have read/write access to the thumbnail path.
- *
- * Example:
- * $wgThumbnailScriptPath = "{$wgScriptPath}/thumb{$wgScriptExtension}";
+ * DJVU settings
+ * Path of the djvudump executable
+ * Enable this and $wgDjvuRenderer to enable djvu rendering
*/
-$wgThumbnailScriptPath = false;
-$wgSharedThumbnailScriptPath = false;
+# $wgDjvuDump = 'djvudump';
+$wgDjvuDump = null;
/**
- * Set the following to false especially if you have a set of files that need to
- * be accessible by all wikis, and you do not want to use the hash (path/a/aa/)
- * directory layout.
+ * Path of the ddjvu DJVU renderer
+ * Enable this and $wgDjvuDump to enable djvu rendering
*/
-$wgHashedSharedUploadDirectory = true;
+# $wgDjvuRenderer = 'ddjvu';
+$wgDjvuRenderer = null;
/**
- * Base URL for a repository wiki. Leave this blank if uploads are just stored
- * in a shared directory and not meant to be accessible through a separate wiki.
- * Otherwise the image description pages on the local wiki will link to the
- * image description page on this wiki.
+ * Path of the djvutxt DJVU text extraction utility
+ * Enable this and $wgDjvuDump to enable text layer extraction from djvu files
+ */
+# $wgDjvuTxt = 'djvutxt';
+$wgDjvuTxt = null;
+
+/**
+ * Path of the djvutoxml executable
+ * This works like djvudump except much, much slower as of version 3.5.
*
- * Please specify the namespace, as in the example below.
+ * For now I recommend you use djvudump instead. The djvuxml output is
+ * probably more stable, so we'll switch back to it as soon as they fix
+ * the efficiency problem.
+ * http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
*/
-$wgRepositoryBaseUrl = "http://commons.wikimedia.org/wiki/Image:";
+# $wgDjvuToXML = 'djvutoxml';
+$wgDjvuToXML = null;
-#
-# Email settings
-#
/**
- * Site admin email address
- * Default to wikiadmin@SERVER_NAME
+ * Shell command for the DJVU post processor
+ * Default: pnmtopng, since ddjvu generates ppm output
+ * Set this to false to output the ppm file directly.
+ */
+$wgDjvuPostProcessor = 'pnmtojpeg';
+/**
+ * File extension for the DJVU post processor output
+ */
+$wgDjvuOutputExtension = 'jpg';
+
+/** @} */ # end of file uploads }
+
+/************************************************************************//**
+ * @name Email settings
+ * @{
+ */
+
+/**
+ * Site admin email address.
*/
-$wgEmergencyContact = 'wikiadmin@' . $wgServerName;
+$wgEmergencyContact = 'wikiadmin@' . $serverName;
/**
- * Password reminder email address
- * The address we should use as sender when a user is requesting his password
- * Default to apache@SERVER_NAME
+ * Password reminder email address.
+ *
+ * The address we should use as sender when a user is requesting his password.
*/
-$wgPasswordSender = 'MediaWiki Mail <apache@' . $wgServerName . '>';
+$wgPasswordSender = 'apache@' . $serverName;
+
+unset( $serverName ); # Don't leak local variables to global scope
/**
- * dummy address which should be accepted during mail send action
- * It might be necessay to adapt the address or to set it equal
- * to the $wgEmergencyContact address
+ * Password reminder name
*/
-#$wgNoReplyAddress = $wgEmergencyContact;
-$wgNoReplyAddress = 'reply@not.possible';
+$wgPasswordSenderName = 'MediaWiki Mail';
+
+/**
+ * Dummy address which should be accepted during mail send action.
+ * It might be necessary to adapt the address or to set it equal
+ * to the $wgEmergencyContact address.
+ */
+$wgNoReplyAddress = 'reply@not.possible';
/**
* Set to true to enable the e-mail basic features:
@@ -581,18 +1051,97 @@ $wgNewPasswordExpiry = 3600 * 24 * 7;
*/
$wgSMTP = false;
+/**
+ * Additional email parameters, will be passed as the last argument to mail() call.
+ */
+$wgAdditionalMailParams = null;
+
+/**
+ * True: from page editor if s/he opted-in. False: Enotif mails appear to come
+ * from $wgEmergencyContact
+ */
+$wgEnotifFromEditor = false;
+
+// TODO move UPO to preferences probably ?
+# If set to true, users get a corresponding option in their preferences and can choose to enable or disable at their discretion
+# If set to false, the corresponding input form on the user preference page is suppressed
+# It call this to be a "user-preferences-option (UPO)"
+
+/**
+ * Require email authentication before sending mail to an email addres. This is
+ * highly recommended. It prevents MediaWiki from being used as an open spam
+ * relay.
+ */
+$wgEmailAuthentication = true;
+
+/**
+ * Allow users to enable email notification ("enotif") on watchlist changes.
+ */
+$wgEnotifWatchlist = false;
+
+/**
+ * Allow users to enable email notification ("enotif") when someone edits their
+ * user talk page.
+ */
+$wgEnotifUserTalk = false;
+
+/**
+ * Set the Reply-to address in notifications to the editor's address, if user
+ * allowed this in the preferences.
+ */
+$wgEnotifRevealEditorAddress = false;
+
+/**
+ * Send notification mails on minor edits to watchlist pages. This is enabled
+ * by default. Does not affect user talk notifications.
+ */
+$wgEnotifMinorEdits = true;
+
+/**
+ * Send a generic mail instead of a personalised mail for each user. This
+ * always uses UTC as the time zone, and doesn't include the username.
+ *
+ * For pages with many users watching, this can significantly reduce mail load.
+ * Has no effect when using sendmail rather than SMTP.
+ */
+$wgEnotifImpersonal = false;
+
+/**
+ * Maximum number of users to mail at once when using impersonal mail. Should
+ * match the limit on your mail server.
+ */
+$wgEnotifMaxRecips = 500;
+
+/**
+ * Send mails via the job queue. This can be useful to reduce the time it
+ * takes to save a page that a lot of people are watching.
+ */
+$wgEnotifUseJobQ = false;
+
+/**
+ * Use real name instead of username in e-mail "from" field.
+ */
+$wgEnotifUseRealName = false;
+
+/**
+ * Array of usernames who will be sent a notification email for every change
+ * which occurs on a wiki.
+ */
+$wgUsersNotifiedOnAllChanges = array();
+
-/**@{
- * Database settings
+/** @} */ # end of email settings
+
+/************************************************************************//**
+ * @name Database settings
+ * @{
*/
-/** database host name or ip address */
+/** Database host name or IP address */
$wgDBserver = 'localhost';
-/** database port number (for PostgreSQL) */
+/** Database port number (for PostgreSQL) */
$wgDBport = 5432;
-/** name of the database */
+/** Name of the database */
$wgDBname = 'my_wiki';
-/** */
-$wgDBconnection = '';
/** Database username */
$wgDBuser = 'wikiuser';
/** Database user's password */
@@ -600,11 +1149,13 @@ $wgDBpassword = '';
/** Database type */
$wgDBtype = 'mysql';
-/** Separate username and password for maintenance tasks. Leave as null to use the default */
+/** Separate username for maintenance tasks. Leave as null to use the default. */
$wgDBadminuser = null;
+/** Separate password for maintenance tasks. Leave as null to use the default. */
$wgDBadminpassword = null;
-/** Search type
+/**
+ * Search type.
* Leave as null to select the default search engine for the
* selected database type (eg SearchMySQL), or set to a class
* name to override to a custom search engine.
@@ -616,6 +1167,14 @@ $wgDBprefix = '';
/** MySQL table options to use during installation or update */
$wgDBTableOptions = 'ENGINE=InnoDB';
+/**
+ * SQL Mode - default is turning off all modes, including strict, if set.
+ * null can be used to skip the setting for performance reasons and assume
+ * DBA has done his best job.
+ * String override can be used for some additional fun :-)
+ */
+$wgSQLMode = '';
+
/** Mediawiki schema */
$wgDBmwschema = 'mediawiki';
/** Tsearch2 schema */
@@ -624,12 +1183,6 @@ $wgDBts2schema = 'public';
/** To override default SQLite data directory ($docroot/../data) */
$wgSQLiteDataDir = '';
-/** Default directory mode for SQLite data directory on creation.
- * Note that this is different from the default directory mode used
- * elsewhere.
- */
-$wgSQLiteDataDirMode = 0700;
-
/**
* Make all database connections secretly go to localhost. Fool the load balancer
* thinking there is an arbitrarily large cluster of servers to connect to.
@@ -637,17 +1190,11 @@ $wgSQLiteDataDirMode = 0700;
*/
$wgAllDBsAreLocalhost = false;
-/**@}*/
-
-
-/** Live high performance sites should disable this - some checks acquire giant mysql locks */
-$wgCheckDBSchema = true;
-
-
/**
* Shared database for multiple wikis. Commonly used for storing a user table
* for single sign-on. The server for this database must be the same as for the
* main database.
+ *
* For backwards compatibility the shared prefix is set to the same as the local
* prefix, and the user table is listed in the default list of shared tables.
* The user_properties table is also added so that users will continue to have their
@@ -657,33 +1204,39 @@ $wgCheckDBSchema = true;
* datbase. However it is advised to limit what tables you do share as many of
* MediaWiki's tables may have side effects if you try to share them.
* EXPERIMENTAL
+ *
+ * $wgSharedPrefix is the table prefix for the shared database. It defaults to
+ * $wgDBprefix.
*/
$wgSharedDB = null;
-$wgSharedPrefix = false; # Defaults to $wgDBprefix
+
+/** @see $wgSharedDB */
+$wgSharedPrefix = false;
+/** @see $wgSharedDB */
$wgSharedTables = array( 'user', 'user_properties' );
/**
* Database load balancer
* This is a two-dimensional array, an array of server info structures
* Fields are:
- * host: Host name
- * dbname: Default database name
- * user: DB user
- * password: DB password
- * type: "mysql" or "postgres"
- * load: ratio of DB_SLAVE load, must be >=0, the sum of all loads must be >0
- * groupLoads: array of load ratios, the key is the query group name. A query may belong
- * to several groups, the most specific group defined here is used.
- *
- * flags: bit field
- * DBO_DEFAULT -- turns on DBO_TRX only if !$wgCommandLineMode (recommended)
- * DBO_DEBUG -- equivalent of $wgDebugDumpSql
- * DBO_TRX -- wrap entire request in a transaction
- * DBO_IGNORE -- ignore errors (not useful in LocalSettings.php)
- * DBO_NOBUFFER -- turn off buffering (not useful in LocalSettings.php)
- *
- * max lag: (optional) Maximum replication lag before a slave will taken out of rotation
- * max threads: (optional) Maximum number of running threads
+ * - host: Host name
+ * - dbname: Default database name
+ * - user: DB user
+ * - password: DB password
+ * - type: "mysql" or "postgres"
+ * - load: ratio of DB_SLAVE load, must be >=0, the sum of all loads must be >0
+ * - groupLoads: array of load ratios, the key is the query group name. A query may belong
+ * to several groups, the most specific group defined here is used.
+ *
+ * - flags: bit field
+ * - DBO_DEFAULT -- turns on DBO_TRX only if !$wgCommandLineMode (recommended)
+ * - DBO_DEBUG -- equivalent of $wgDebugDumpSql
+ * - DBO_TRX -- wrap entire request in a transaction
+ * - DBO_IGNORE -- ignore errors (not useful in LocalSettings.php)
+ * - DBO_NOBUFFER -- turn off buffering (not useful in LocalSettings.php)
+ *
+ * - max lag: (optional) Maximum replication lag before a slave will taken out of rotation
+ * - max threads: (optional) Maximum number of running threads
*
* These and any other user-defined properties will be assigned to the mLBInfo member
* variable of the Database object.
@@ -697,7 +1250,9 @@ $wgSharedTables = array( 'user', 'user_properties' );
* accidental misconfiguration or MediaWiki bugs, set read_only=1 on all your
* slaves in my.cnf. You can set read_only mode at runtime using:
*
+ * <code>
* SET @@read_only=1;
+ * </code>
*
* Since the effect of writing to a slave is so damaging and difficult to clean
* up, we at Wikimedia set read_only=1 in my.cnf on all our DB servers, even
@@ -763,38 +1318,218 @@ $wgDBmysql5 = false;
*/
$wgLocalDatabases = array();
-/** @{
- * Object cache settings
- * See Defines.php for types
+/**
+ * If lag is higher than $wgSlaveLagWarning, show a warning in some special
+ * pages (like watchlist). If the lag is higher than $wgSlaveLagCritical,
+ * show a more obvious warning.
+ */
+$wgSlaveLagWarning = 10;
+/** @see $wgSlaveLagWarning */
+$wgSlaveLagCritical = 30;
+
+/**
+ * Use old names for change_tags indices.
+ */
+$wgOldChangeTagsIndex = false;
+
+/**@}*/ # End of DB settings }
+
+
+/************************************************************************//**
+ * @name Text storage
+ * @{
+ */
+
+/**
+ * We can also compress text stored in the 'text' table. If this is set on, new
+ * revisions will be compressed on page save if zlib support is available. Any
+ * compressed revisions will be decompressed on load regardless of this setting
+ * *but will not be readable at all* if zlib support is not available.
+ */
+$wgCompressRevisions = false;
+
+/**
+ * External stores allow including content
+ * from non database sources following URL links
+ *
+ * Short names of ExternalStore classes may be specified in an array here:
+ * $wgExternalStores = array("http","file","custom")...
+ *
+ * CAUTION: Access to database might lead to code execution
+ */
+$wgExternalStores = false;
+
+/**
+ * An array of external mysql servers, e.g.
+ * $wgExternalServers = array( 'cluster1' => array( 'srv28', 'srv29', 'srv30' ) );
+ * Used by LBFactory_Simple, may be ignored if $wgLBFactoryConf is set to another class.
+ */
+$wgExternalServers = array();
+
+/**
+ * The place to put new revisions, false to put them in the local text table.
+ * Part of a URL, e.g. DB://cluster1
+ *
+ * Can be an array instead of a single string, to enable data distribution. Keys
+ * must be consecutive integers, starting at zero. Example:
+ *
+ * $wgDefaultExternalStore = array( 'DB://cluster1', 'DB://cluster2' );
+ *
+ */
+$wgDefaultExternalStore = false;
+
+/**
+ * Revision text may be cached in $wgMemc to reduce load on external storage
+ * servers and object extraction overhead for frequently-loaded revisions.
+ *
+ * Set to 0 to disable, or number of seconds before cache expiry.
+ */
+$wgRevisionCacheExpiry = 0;
+
+/** @} */ # end text storage }
+
+/************************************************************************//**
+ * @name Performance hacks and limits
+ * @{
+ */
+/** Disable database-intensive features */
+$wgMiserMode = false;
+/** Disable all query pages if miser mode is on, not just some */
+$wgDisableQueryPages = false;
+/** Number of rows to cache in 'querycache' table when miser mode is on */
+$wgQueryCacheLimit = 1000;
+/** Number of links to a page required before it is deemed "wanted" */
+$wgWantedPagesThreshold = 1;
+/** Enable slow parser functions */
+$wgAllowSlowParserFunctions = false;
+
+/**
+ * Do DELETE/INSERT for link updates instead of incremental
+ */
+$wgUseDumbLinkUpdate = false;
+
+/**
+ * Anti-lock flags - bitfield
+ * - ALF_PRELOAD_LINKS:
+ * Preload links during link update for save
+ * - ALF_PRELOAD_EXISTENCE:
+ * Preload cur_id during replaceLinkHolders
+ * - ALF_NO_LINK_LOCK:
+ * Don't use locking reads when updating the link table. This is
+ * necessary for wikis with a high edit rate for performance
+ * reasons, but may cause link table inconsistency
+ * - ALF_NO_BLOCK_LOCK:
+ * As for ALF_LINK_LOCK, this flag is a necessity for high-traffic
+ * wikis.
+ */
+$wgAntiLockFlags = 0;
+
+/**
+ * Maximum article size in kilobytes
+ */
+$wgMaxArticleSize = 2048;
+
+/**
+ * The minimum amount of memory that MediaWiki "needs"; MediaWiki will try to
+ * raise PHP's memory limit if it's below this amount.
+ */
+$wgMemoryLimit = "50M";
+
+/** @} */ # end performance hacks }
+
+/************************************************************************//**
+ * @name Cache settings
+ * @{
+ */
+
+/**
+ * Directory for caching data in the local filesystem. Should not be accessible
+ * from the web. Set this to false to not use any local caches.
+ *
+ * Note: if multiple wikis share the same localisation cache directory, they
+ * must all have the same set of extensions. You can set a directory just for
+ * the localisation cache using $wgLocalisationCacheConf['storeDirectory'].
+ */
+$wgCacheDirectory = false;
+
+/**
+ * Main cache type. This should be a cache with fast access, but it may have
+ * limited space. By default, it is disabled, since the database is not fast
+ * enough to make it worthwhile.
+ *
+ * The options are:
+ *
+ * - CACHE_ANYTHING: Use anything, as long as it works
+ * - CACHE_NONE: Do not cache
+ * - CACHE_DB: Store cache objects in the DB
+ * - CACHE_MEMCACHED: MemCached, must specify servers in $wgMemCachedServers
+ * - CACHE_ACCEL: eAccelerator, APC, XCache or WinCache
+ * - CACHE_DBA: Use PHP's DBA extension to store in a DBM-style
+ * database. This is slow, and is not recommended for
+ * anything other than debugging.
+ *
+ * @see $wgMessageCacheType, $wgParserCacheType
*/
$wgMainCacheType = CACHE_NONE;
+
+/**
+ * The cache type for storing the contents of the MediaWiki namespace. This
+ * cache is used for a small amount of data which is expensive to regenerate.
+ *
+ * For available types see $wgMainCacheType.
+ */
$wgMessageCacheType = CACHE_ANYTHING;
+
+/**
+ * The cache type for storing article HTML. This is used to store data which
+ * is expensive to regenerate, and benefits from having plenty of storage space.
+ *
+ * For available types see $wgMainCacheType.
+ */
$wgParserCacheType = CACHE_ANYTHING;
-/**@}*/
+/**
+ * The expiry time for the parser cache, in seconds. The default is 86.4k
+ * seconds, otherwise known as a day.
+ */
$wgParserCacheExpireTime = 86400;
-// Select which DBA handler <http://www.php.net/manual/en/dba.requirements.php> to use as CACHE_DBA backend
+/**
+ * Select which DBA handler <http://www.php.net/manual/en/dba.requirements.php> to use as CACHE_DBA backend
+ */
$wgDBAhandler = 'db3';
+/**
+ * Store sessions in MemCached. This can be useful to improve performance, or to
+ * avoid the locking behaviour of PHP's default session handler, which tends to
+ * prevent multiple requests for the same user from acting concurrently.
+ */
$wgSessionsInMemcached = false;
-/** This is used for setting php's session.save_handler. In practice, you will
+/**
+ * This is used for setting php's session.save_handler. In practice, you will
* almost never need to change this ever. Other options might be 'user' or
* 'session_mysql.' Setting to null skips setting this entirely (which might be
- * useful if you're doing cross-application sessions, see bug 11381) */
+ * useful if you're doing cross-application sessions, see bug 11381)
+ */
$wgSessionHandler = 'files';
-/**@{
- * Memcached-specific settings
- * See docs/memcached.txt
- */
-$wgUseMemCached = false;
-$wgMemCachedDebug = false; ///< Will be set to false in Setup.php, if the server isn't working
+/** If enabled, will send MemCached debugging information to $wgDebugLogFile */
+$wgMemCachedDebug = false;
+
+/** The list of MemCached servers and port numbers */
$wgMemCachedServers = array( '127.0.0.1:11000' );
+
+/**
+ * Use persistent connections to MemCached, which are shared across multiple
+ * requests.
+ */
$wgMemCachedPersistent = false;
-$wgMemCachedTimeout = 100000; //Data timeout in microseconds
-/**@}*/
+
+/**
+ * Read/write timeout for MemCached server communication, in microseconds.
+ */
+$wgMemCachedTimeout = 100000;
/**
* Set this to true to make a local copy of the message cache, for use in
@@ -837,17 +1572,222 @@ $wgLocalisationCacheConf = array(
'manualRecache' => false,
);
-# Language settings
-#
+/** Allow client-side caching of pages */
+$wgCachePages = true;
+
+/**
+ * Set this to current time to invalidate all prior cached pages. Affects both
+ * client- and server-side caching.
+ * You can get the current date on your server by using the command:
+ * date +%Y%m%d%H%M%S
+ */
+$wgCacheEpoch = '20030516000000';
+
+/**
+ * Bump this number when changing the global style sheets and JavaScript.
+ * It should be appended in the query string of static CSS and JS includes,
+ * to ensure that client-side caches do not keep obsolete copies of global
+ * styles.
+ */
+$wgStyleVersion = '301';
+
+/**
+ * This will cache static pages for non-logged-in users to reduce
+ * database traffic on public sites.
+ * Must set $wgShowIPinHeader = false
+ */
+$wgUseFileCache = false;
+
+/**
+ * Directory where the cached page will be saved.
+ * Defaults to "$wgCacheDirectory/html".
+ */
+$wgFileCacheDirectory = false;
+
+/**
+ * Depth of the subdirectory hierarchy to be created under
+ * $wgFileCacheDirectory. The subdirectories will be named based on
+ * the MD5 hash of the title. A value of 0 means all cache files will
+ * be put directly into the main file cache directory.
+ */
+$wgFileCacheDepth = 2;
+
+/**
+ * Keep parsed pages in a cache (objectcache table or memcached)
+ * to speed up output of the same page viewed by another user with the
+ * same options.
+ *
+ * This can provide a significant speedup for medium to large pages,
+ * so you probably want to keep it on. Extensions that conflict with the
+ * parser cache should disable the cache on a per-page basis instead.
+ */
+$wgEnableParserCache = true;
+
+/**
+ * Append a configured value to the parser cache and the sitenotice key so
+ * that they can be kept separate for some class of activity.
+ */
+$wgRenderHashAppend = '';
+
+/**
+ * If on, the sidebar navigation links are cached for users with the
+ * current language set. This can save a touch of load on a busy site
+ * by shaving off extra message lookups.
+ *
+ * However it is also fragile: changing the site configuration, or
+ * having a variable $wgArticlePath, can produce broken links that
+ * don't update as expected.
+ */
+$wgEnableSidebarCache = false;
+
+/**
+ * Expiry time for the sidebar cache, in seconds
+ */
+$wgSidebarCacheExpiry = 86400;
+
+/**
+ * When using the file cache, we can store the cached HTML gzipped to save disk
+ * space. Pages will then also be served compressed to clients that support it.
+ * THIS IS NOT COMPATIBLE with ob_gzhandler which is now enabled if supported in
+ * the default LocalSettings.php! If you enable this, remove that setting first.
+ *
+ * Requires zlib support enabled in PHP.
+ */
+$wgUseGzip = false;
+
+/**
+ * Whether MediaWiki should send an ETag header. Seems to cause
+ * broken behavior with Squid 2.6, see bug 7098.
+ */
+$wgUseETag = false;
+
+/** Clock skew or the one-second resolution of time() can occasionally cause cache
+ * problems when the user requests two pages within a short period of time. This
+ * variable adds a given number of seconds to vulnerable timestamps, thereby giving
+ * a grace period.
+ */
+$wgClockSkewFudge = 5;
+
+/**
+ * Invalidate various caches when LocalSettings.php changes. This is equivalent
+ * to setting $wgCacheEpoch to the modification time of LocalSettings.php, as
+ * was previously done in the default LocalSettings.php file.
+ *
+ * On high-traffic wikis, this should be set to false, to avoid the need to
+ * check the file modification time, and to avoid the performance impact of
+ * unnecessary cache invalidations.
+ */
+$wgInvalidateCacheOnLocalSettingsChange = true;
+
+/** @} */ # end of cache settings
+
+/************************************************************************//**
+ * @name HTTP proxy (Squid) settings
+ *
+ * Many of these settings apply to any HTTP proxy used in front of MediaWiki,
+ * although they are referred to as Squid settings for historical reasons.
+ *
+ * Achieving a high hit ratio with an HTTP proxy requires special
+ * configuration. See http://www.mediawiki.org/wiki/Manual:Squid_caching for
+ * more details.
+ *
+ * @{
+ */
+
+/**
+ * Enable/disable Squid.
+ * See http://www.mediawiki.org/wiki/Manual:Squid_caching
+ */
+$wgUseSquid = false;
+
+/** If you run Squid3 with ESI support, enable this (default:false): */
+$wgUseESI = false;
+
+/** Send X-Vary-Options header for better caching (requires patched Squid) */
+$wgUseXVO = false;
+
+/**
+ * Internal server name as known to Squid, if different. Example:
+ * <code>
+ * $wgInternalServer = 'http://yourinternal.tld:8000';
+ * </code>
+ */
+$wgInternalServer = $wgServer;
+
+/**
+ * Cache timeout for the squid, will be sent as s-maxage (without ESI) or
+ * Surrogate-Control (with ESI). Without ESI, you should strip out s-maxage in
+ * the Squid config. 18000 seconds = 5 hours, more cache hits with 2678400 = 31
+ * days
+ */
+$wgSquidMaxage = 18000;
+
+/**
+ * Default maximum age for raw CSS/JS accesses
+ */
+$wgForcedRawSMaxage = 300;
+
+/**
+ * List of proxy servers to purge on changes; default port is 80. Use IP addresses.
+ *
+ * When MediaWiki is running behind a proxy, it will trust X-Forwarded-For
+ * headers sent/modified from these proxies when obtaining the remote IP address
+ *
+ * For a list of trusted servers which *aren't* purged, see $wgSquidServersNoPurge.
+ */
+$wgSquidServers = array();
+
+/**
+ * As above, except these servers aren't purged on page changes; use to set a
+ * list of trusted proxies, etc.
+ */
+$wgSquidServersNoPurge = array();
+
+/** Maximum number of titles to purge in any one client operation */
+$wgMaxSquidPurgeTitles = 400;
+
+/**
+ * HTCP multicast address. Set this to a multicast IP address to enable HTCP.
+ *
+ * Note that MediaWiki uses the old non-RFC compliant HTCP format, which was
+ * present in the earliest Squid implementations of the protocol.
+ */
+$wgHTCPMulticastAddress = false;
+
+/**
+ * HTCP multicast port.
+ * @see $wgHTCPMulticastAddress
+ */
+$wgHTCPPort = 4827;
+
+/**
+ * HTCP multicast TTL.
+ * @see $wgHTCPMulticastAddress
+ */
+$wgHTCPMulticastTTL = 1;
+
+/** Should forwarded Private IPs be accepted? */
+$wgUsePrivateIPs = false;
+
+/** @} */ # end of HTTP proxy settings
+
+/************************************************************************//**
+ * @name Language, regional and character encoding settings
+ * @{
+ */
+
/** Site language code, should be one of ./languages/Language(.*).php */
$wgLanguageCode = 'en';
/**
* Some languages need different word forms, usually for different cases.
- * Used in Language::convertGrammar().
+ * Used in Language::convertGrammar(). Example:
+ *
+ * <code>
+ * $wgGrammarForms['en']['genitive']['car'] = 'car\'s';
+ * </code>
*/
$wgGrammarForms = array();
-#$wgGrammarForms['en']['genitive']['car'] = 'car\'s';
/** Treat language links as magic connectors, not inline links */
$wgInterwikiMagic = true;
@@ -863,28 +1803,48 @@ $wgExtraLanguageNames = array();
* These codes are leftoffs from renames, or other legacy things.
* Also, qqq is a dummy "language" for documenting messages.
*/
-$wgDummyLanguageCodes = array( 'qqq', 'als', 'be-x-old', 'dk', 'fiu-vro', 'iu', 'nb', 'simple', 'tp' );
+$wgDummyLanguageCodes = array(
+ 'als',
+ 'bat-smg',
+ 'be-x-old',
+ 'dk',
+ 'fiu-vro',
+ 'iu',
+ 'nb',
+ 'qqq',
+ 'simple',
+ 'tp',
+);
-/** We speak UTF-8 all the time now, unless some oddities happen */
+/** @deprecated Since MediaWiki 1.5, this must always be set to UTF-8. */
$wgInputEncoding = 'UTF-8';
+/** @deprecated Since MediaWiki 1.5, this must always be set to UTF-8. */
$wgOutputEncoding = 'UTF-8';
+
+/**
+ * Character set for use in the article edit box. Language-specific encodings
+ * may be defined.
+ *
+ * This historic feature is one of the first that was added by former MediaWiki
+ * team leader Brion Vibber, and is used to support the Esperanto x-system.
+ */
$wgEditEncoding = '';
/**
- * Set this to true to replace Arabic presentation forms with their standard
+ * Set this to true to replace Arabic presentation forms with their standard
* forms in the U+0600-U+06FF block. This only works if $wgLanguageCode is
* set to "ar".
*
- * Note that pages with titles containing presentation forms will become
+ * Note that pages with titles containing presentation forms will become
* inaccessible, run maintenance/cleanupTitles.php to fix this.
*/
$wgFixArabicUnicode = true;
/**
* Set this to true to replace ZWJ-based chillu sequences in Malayalam text
- * with their Unicode 5.1 equivalents. This only works if $wgLanguageCode is
- * set to "ml". Note that some clients (even new clients as of 2010) do not
- * support these characters.
+ * with their Unicode 5.1 equivalents. This only works if $wgLanguageCode is
+ * set to "ml". Note that some clients (even new clients as of 2010) do not
+ * support these characters.
*
* If you enable this on an existing wiki, run maintenance/cleanupTitles.php to
* fix any ZWJ sequences in existing page titles.
@@ -892,25 +1852,71 @@ $wgFixArabicUnicode = true;
$wgFixMalayalamUnicode = true;
/**
- * Locale for LC_CTYPE, to work around http://bugs.php.net/bug.php?id=45132
- * For Unix-like operating systems, set this to to a locale that has a UTF-8
- * character set. Only the character set is relevant.
+ * Set this to always convert certain Unicode sequences to modern ones
+ * regardless of the content language. This has a small performance
+ * impact.
+ *
+ * See $wgFixArabicUnicode and $wgFixMalayalamUnicode for conversion
+ * details.
+ *
+ * @since 1.17
*/
-$wgShellLocale = 'en_US.utf8';
+$wgAllUnicodeFixes = false;
/**
- * Set this to eg 'ISO-8859-1' to perform character set
- * conversion when loading old revisions not marked with
- * "utf-8" flag. Use this when converting wiki to UTF-8
- * without the burdensome mass conversion of old text data.
+ * Set this to eg 'ISO-8859-1' to perform character set conversion when
+ * loading old revisions not marked with "utf-8" flag. Use this when
+ * converting a wiki from MediaWiki 1.4 or earlier to UTF-8 without the
+ * burdensome mass conversion of old text data.
*
- * NOTE! This DOES NOT touch any fields other than old_text.
- * Titles, comments, user names, etc still must be converted
- * en masse in the database before continuing as a UTF-8 wiki.
+ * NOTE! This DOES NOT touch any fields other than old_text.Titles, comments,
+ * user names, etc still must be converted en masse in the database before
+ * continuing as a UTF-8 wiki.
*/
$wgLegacyEncoding = false;
/**
+ * Browser Blacklist for unicode non compliant browsers. Contains a list of
+ * regexps : "/regexp/" matching problematic browsers. These browsers will
+ * be served encoded unicode in the edit box instead of real unicode.
+ */
+$wgBrowserBlackList = array(
+ /**
+ * Netscape 2-4 detection
+ * The minor version may contain strings such as "Gold" or "SGoldC-SGI"
+ * Lots of non-netscape user agents have "compatible", so it's useful to check for that
+ * with a negative assertion. The [UIN] identifier specifies the level of security
+ * in a Netscape/Mozilla browser, checking for it rules out a number of fakers.
+ * The language string is unreliable, it is missing on NS4 Mac.
+ *
+ * Reference: http://www.psychedelix.com/agents/index.shtml
+ */
+ '/^Mozilla\/2\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
+ '/^Mozilla\/3\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
+ '/^Mozilla\/4\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
+
+ /**
+ * MSIE on Mac OS 9 is teh sux0r, converts þ to <thorn>, ð to <eth>, Þ to <THORN> and à to <ETH>
+ *
+ * Known useragents:
+ * - Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
+ * - Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC)
+ * - Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)
+ * - [...]
+ *
+ * @link http://en.wikipedia.org/w/index.php?title=User%3A%C6var_Arnfj%F6r%F0_Bjarmason%2Ftestme&diff=12356041&oldid=12355864
+ * @link http://en.wikipedia.org/wiki/Template%3AOS9
+ */
+ '/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
+
+ /**
+ * Google wireless transcoder, seems to eat a lot of chars alive
+ * http://it.wikipedia.org/w/index.php?title=Luciano_Ligabue&diff=prev&oldid=8857361
+ */
+ '/^Mozilla\/4\.0 \(compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;\)/'
+);
+
+/**
* If set to true, the MediaWiki 1.4 to 1.5 schema conversion will
* create stub reference rows in the text table instead of copying
* the full text of all current entries from 'cur' to 'text'.
@@ -927,17 +1933,173 @@ $wgLegacyEncoding = false;
*/
$wgLegacySchemaConversion = false;
+/**
+ * Enable to allow rewriting dates in page text.
+ * DOES NOT FORMAT CORRECTLY FOR MOST LANGUAGES.
+ */
+$wgUseDynamicDates = false;
+/**
+ * Enable dates like 'May 12' instead of '12 May', this only takes effect if
+ * the interface is set to English.
+ */
+$wgAmericanDates = false;
+/**
+ * For Hindi and Arabic use local numerals instead of Western style (0-9)
+ * numerals in interface.
+ */
+$wgTranslateNumerals = true;
+
+/**
+ * Translation using MediaWiki: namespace.
+ * Interface messages will be loaded from the database.
+ */
+$wgUseDatabaseMessages = true;
+
+/**
+ * Expiry time for the message cache key
+ */
+$wgMsgCacheExpiry = 86400;
+
+/**
+ * Maximum entry size in the message cache, in bytes
+ */
+$wgMaxMsgCacheEntrySize = 10000;
+
+/** Whether to enable language variant conversion. */
+$wgDisableLangConversion = false;
+
+/** Whether to enable language variant conversion for links. */
+$wgDisableTitleConversion = false;
+
+/** Whether to enable cononical language links in meta data. */
+$wgCanonicalLanguageLinks = true;
+
+/** Default variant code, if false, the default will be the language code */
+$wgDefaultLanguageVariant = false;
+
+/**
+ * Disabled variants array of language variant conversion. Example:
+ * <code>
+ * $wgDisabledVariants[] = 'zh-mo';
+ * $wgDisabledVariants[] = 'zh-my';
+ * </code>
+ *
+ * or:
+ *
+ * <code>
+ * $wgDisabledVariants = array('zh-mo', 'zh-my');
+ * </code>
+ */
+$wgDisabledVariants = array();
+
+/**
+ * Like $wgArticlePath, but on multi-variant wikis, this provides a
+ * path format that describes which parts of the URL contain the
+ * language variant. For Example:
+ *
+ * $wgLanguageCode = 'sr';
+ * $wgVariantArticlePath = '/$2/$1';
+ * $wgArticlePath = '/wiki/$1';
+ *
+ * A link to /wiki/ would be redirected to /sr/Главна_Ñтрана
+ *
+ * It is important that $wgArticlePath not overlap with possible values
+ * of $wgVariantArticlePath.
+ */
+$wgVariantArticlePath = false;
+
+/**
+ * Show a bar of language selection links in the user login and user
+ * registration forms; edit the "loginlanguagelinks" message to
+ * customise these.
+ */
+$wgLoginLanguageSelector = false;
+
+/**
+ * When translating messages with wfMsg(), it is not always clear what should
+ * be considered UI messages and what should be content messages.
+ *
+ * For example, for the English Wikipedia, there should be only one 'mainpage',
+ * so when getting the link for 'mainpage', we should treat it as site content
+ * and call wfMsgForContent(), but for rendering the text of the link, we call
+ * wfMsg(). The code behaves this way by default. However, sites like the
+ * Wikimedia Commons do offer different versions of 'mainpage' and the like for
+ * different languages. This array provides a way to override the default
+ * behavior. For example, to allow language-specific main page and community
+ * portal, set
+ *
+ * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
+ */
+$wgForceUIMsgAsContentMsg = array();
+
+/**
+ * Fake out the timezone that the server thinks it's in. This will be used for
+ * date display and not for what's stored in the DB. Leave to null to retain
+ * your server's OS-based timezone value.
+ *
+ * This variable is currently used only for signature formatting and for local
+ * time/date parser variables ({{LOCALTIME}} etc.)
+ *
+ * Timezones can be translated by editing MediaWiki messages of type
+ * timezone-nameinlowercase like timezone-utc.
+ *
+ * Examples:
+ * <code>
+ * $wgLocaltimezone = 'GMT';
+ * $wgLocaltimezone = 'PST8PDT';
+ * $wgLocaltimezone = 'Europe/Sweden';
+ * $wgLocaltimezone = 'CET';
+ * </code>
+ */
+$wgLocaltimezone = null;
+
+/**
+ * Set an offset from UTC in minutes to use for the default timezone setting
+ * for anonymous users and new user accounts.
+ *
+ * This setting is used for most date/time displays in the software, and is
+ * overrideable in user preferences. It is *not* used for signature timestamps.
+ *
+ * You can set it to match the configured server timezone like this:
+ * $wgLocalTZoffset = date("Z") / 60;
+ *
+ * If your server is not configured for the timezone you want, you can set
+ * this in conjunction with the signature timezone and override the PHP default
+ * timezone like so:
+ * $wgLocaltimezone="Europe/Berlin";
+ * date_default_timezone_set( $wgLocaltimezone );
+ * $wgLocalTZoffset = date("Z") / 60;
+ *
+ * Leave at NULL to show times in universal time (UTC/GMT).
+ */
+$wgLocalTZoffset = null;
+
+/** @} */ # End of language/charset settings
+
+/*************************************************************************//**
+ * @name Output format and skin settings
+ * @{
+ */
+
+/** The default Content-Type header. */
$wgMimeType = 'text/html';
+
+/** The content type used in script tags. */
$wgJsMimeType = 'text/javascript';
+
+/** The HTML document type. */
$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
+
+/** The URL of the document type declaration. */
$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
+
+/** The default xmlns attribute. */
$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
/**
- * Should we output an HTML5 doctype? This mode is still experimental, but
- * all indications are that it should be usable, so it's enabled by default.
- * If all goes well, it will be removed and become always true before the 1.16
- * release.
+ * Should we output an HTML5 doctype? If false, use XHTML 1.0 Transitional
+ * instead, and disable HTML5 features. This may eventually be removed and set
+ * to always true.
*/
$wgHtml5 = true;
@@ -986,106 +2148,421 @@ $wgWellFormedXml = true;
*/
$wgXhtmlNamespaces = array();
-/** Enable to allow rewriting dates in page text.
- * DOES NOT FORMAT CORRECTLY FOR MOST LANGUAGES */
-$wgUseDynamicDates = false;
-/** Enable dates like 'May 12' instead of '12 May', this only takes effect if
- * the interface is set to English
+/**
+ * Show IP address, for non-logged in users. It's necessary to switch this off
+ * for some forms of caching.
*/
-$wgAmericanDates = false;
+$wgShowIPinHeader = true;
+
/**
- * For Hindi and Arabic use local numerals instead of Western style (0-9)
- * numerals in interface.
+ * Site notice shown at the top of each page
+ *
+ * MediaWiki:Sitenotice page, which will override this. You can also
+ * provide a separate message for logged-out users using the
+ * MediaWiki:Anonnotice page.
*/
-$wgTranslateNumerals = true;
+$wgSiteNotice = '';
/**
- * Translation using MediaWiki: namespace.
- * Interface messages will be loaded from the database.
+ * A subtitle to add to the tagline, for skins that have it/
*/
-$wgUseDatabaseMessages = true;
+$wgExtraSubtitle = '';
/**
- * Expiry time for the message cache key
+ * If this is set, a "donate" link will appear in the sidebar. Set it to a URL.
*/
-$wgMsgCacheExpiry = 86400;
+$wgSiteSupportPage = '';
/**
- * Maximum entry size in the message cache, in bytes
+ * Validate the overall output using tidy and refuse
+ * to display the page if it's not valid.
*/
-$wgMaxMsgCacheEntrySize = 10000;
+$wgValidateAllHtml = false;
/**
- * If true, serialized versions of the messages arrays will be
- * read from the 'serialized' subdirectory if they are present.
- * Set to false to always use the Messages files, regardless of
- * whether they are up to date or not.
+ * Default skin, for new users and anonymous visitors. Registered users may
+ * change this to any one of the other available skins in their preferences.
+ * This has to be completely lowercase; see the "skins" directory for the list
+ * of available skins.
*/
-$wgEnableSerializedMessages = true;
+$wgDefaultSkin = 'vector';
+
+/**
+* Should we allow the user's to select their own skin that will override the default?
+* @deprecated in 1.16, use $wgHiddenPrefs[] = 'skin' to disable it
+*/
+$wgAllowUserSkin = true;
/**
- * Set to false if you are thorough system admin who always remembers to keep
- * serialized files up to date to save few mtime calls.
+ * Specify the name of a skin that should not be presented in the list of
+ * available skins. Use for blacklisting a skin which you do not want to
+ * remove from the .../skins/ directory
*/
-$wgCheckSerialized = true;
+$wgSkipSkin = '';
+/** Array for more like $wgSkipSkin. */
+$wgSkipSkins = array();
-/** Whether to enable language variant conversion. */
-$wgDisableLangConversion = false;
+/**
+ * Optionally, we can specify a stylesheet to use for media="handheld".
+ * This is recognized by some, but not all, handheld/mobile/PDA browsers.
+ * If left empty, compliant handheld browsers won't pick up the skin
+ * stylesheet, which is specified for 'screen' media.
+ *
+ * Can be a complete URL, base-relative path, or $wgStylePath-relative path.
+ * Try 'chick/main.css' to apply the Chick styles to the MonoBook HTML.
+ *
+ * Will also be switched in when 'handheld=yes' is added to the URL, like
+ * the 'printable=yes' mode for print media.
+ */
+$wgHandheldStyle = false;
-/** Whether to enable language variant conversion for links. */
-$wgDisableTitleConversion = false;
+/**
+ * If set, 'screen' and 'handheld' media specifiers for stylesheets are
+ * transformed such that they apply to the iPhone/iPod Touch Mobile Safari,
+ * which doesn't recognize 'handheld' but does support media queries on its
+ * screen size.
+ *
+ * Consider only using this if you have a *really good* handheld stylesheet,
+ * as iPhone users won't have any way to disable it and use the "grown-up"
+ * styles instead.
+ */
+$wgHandheldForIPhone = false;
-/** Default variant code, if false, the default will be the language code */
-$wgDefaultLanguageVariant = false;
+/**
+ * Allow user Javascript page?
+ * This enables a lot of neat customizations, but may
+ * increase security risk to users and server load.
+ */
+$wgAllowUserJs = false;
-/** Disabled variants array of language variant conversion.
- * example:
- * $wgDisabledVariants[] = 'zh-mo';
- * $wgDisabledVariants[] = 'zh-my';
+/**
+ * Allow user Cascading Style Sheets (CSS)?
+ * This enables a lot of neat customizations, but may
+ * increase security risk to users and server load.
+ */
+$wgAllowUserCss = false;
+
+/**
+ * Allow user-preferences implemented in CSS?
+ * This allows users to customise the site appearance to a greater
+ * degree; disabling it will improve page load times.
+ */
+$wgAllowUserCssPrefs = true;
+
+/** Use the site's Javascript page? */
+$wgUseSiteJs = true;
+
+/** Use the site's Cascading Style Sheets (CSS)? */
+$wgUseSiteCss = true;
+
+/**
+ * Set to false to disable application of access keys and tooltips,
+ * eg to avoid keyboard conflicts with system keys or as a low-level
+ * optimization.
+ */
+$wgEnableTooltipsAndAccesskeys = true;
+
+/**
+ * Break out of framesets. This can be used to prevent clickjacking attacks,
+ * or to prevent external sites from framing your site with ads.
+ */
+$wgBreakFrames = false;
+
+/**
+ * The X-Frame-Options header to send on pages sensitive to clickjacking
+ * attacks, such as edit pages. This prevents those pages from being displayed
+ * in a frame or iframe. The options are:
*
- * or:
- * $wgDisabledVariants = array('zh-mo', 'zh-my');
+ * - 'DENY': Do not allow framing. This is recommended for most wikis.
+ *
+ * - 'SAMEORIGIN': Allow framing by pages on the same domain. This can be used
+ * to allow framing within a trusted domain. This is insecure if there
+ * is a page on the same domain which allows framing of arbitrary URLs.
+ *
+ * - false: Allow all framing. This opens up the wiki to XSS attacks and thus
+ * full compromise of local user accounts. Private wikis behind a
+ * corporate firewall are especially vulnerable. This is not
+ * recommended.
+ *
+ * For extra safety, set $wgBreakFrames = true, to prevent framing on all pages,
+ * not just edit pages.
*/
-$wgDisabledVariants = array();
+$wgEditPageFrameOptions = 'DENY';
/**
- * Like $wgArticlePath, but on multi-variant wikis, this provides a
- * path format that describes which parts of the URL contain the
- * language variant. For Example:
+ * Disable output compression (enabled by default if zlib is available)
+ */
+$wgDisableOutputCompression = false;
+
+/**
+ * Should we allow a broader set of characters in id attributes, per HTML5? If
+ * not, use only HTML 4-compatible IDs. This option is for testing -- when the
+ * functionality is ready, it will be on by default with no option.
*
- * $wgLanguageCode = 'sr';
- * $wgVariantArticlePath = '/$2/$1';
- * $wgArticlePath = '/wiki/$1';
+ * Currently this appears to work fine in all browsers, but it's disabled by
+ * default because it normalizes id's a bit too aggressively, breaking preexisting
+ * content (particularly Cite). See bug 27733, bug 27694, bug 27474.
+ */
+$wgExperimentalHtmlIds = false;
+
+/**
+ * Abstract list of footer icons for skins in place of old copyrightico and poweredbyico code
+ * You can add new icons to the built in copyright or poweredby, or you can create
+ * a new block. Though note that you may need to add some custom css to get good styling
+ * of new blocks in monobook. vector and modern should work without any special css.
+ *
+ * $wgFooterIcons itself is a key/value array.
+ * The key is the name of a block that the icons will be wrapped in. The final id varies
+ * by skin; Monobook and Vector will turn poweredby into f-poweredbyico while Modern
+ * turns it into mw_poweredby.
+ * The value is either key/value array of icons or a string.
+ * In the key/value array the key may or may not be used by the skin but it can
+ * be used to find the icon and unset it or change the icon if needed.
+ * This is useful for disabling icons that are set by extensions.
+ * The value should be either a string or an array. If it is a string it will be output
+ * directly as html, however some skins may choose to ignore it. An array is the preferred format
+ * for the icon, the following keys are used:
+ * src: An absolute url to the image to use for the icon, this is recommended
+ * but not required, however some skins will ignore icons without an image
+ * url: The url to use in the <a> arround the text or icon, if not set an <a> will not be outputted
+ * alt: This is the text form of the icon, it will be displayed without an image in
+ * skins like Modern or if src is not set, and will otherwise be used as
+ * the alt="" for the image. This key is required.
+ * width and height: If the icon specified by src is not of the standard size
+ * you can specify the size of image to use with these keys.
+ * Otherwise they will default to the standard 88x31.
+ */
+$wgFooterIcons = array(
+ "copyright" => array(
+ "copyright" => array(), // placeholder for the built in copyright icon
+ ),
+ "poweredby" => array(
+ "mediawiki" => array(
+ "src" => null, // Defaults to "$wgStylePath/common/images/poweredby_mediawiki_88x31.png"
+ "url" => "http://www.mediawiki.org/",
+ "alt" => "Powered by MediaWiki",
+ )
+ ),
+);
+
+/**
+ * Search form behavior for Vector skin only
+ * true = use an icon search button
+ * false = use Go & Search buttons
+ */
+$wgVectorUseSimpleSearch = false;
+
+/**
+ * Watch and unwatch as an icon rather than a link for Vector skin only
+ * true = use an icon watch/unwatch button
+ * false = use watch/unwatch text link
+ */
+$wgVectorUseIconWatch = false;
+
+/**
+ * Show the name of the current variant as a label in the variants drop-down menu
+ */
+$wgVectorShowVariantName = false;
+
+/**
+ * Display user edit counts in various prominent places.
+ */
+$wgEdititis = false;
+
+/**
+ * Experimental better directionality support.
+ */
+$wgBetterDirectionality = false;
+
+
+/** @} */ # End of output format settings }
+
+/*************************************************************************//**
+ * @name Resource loader settings
+ * @{
+ */
+
+/**
+ * Client-side resource modules. Extensions should add their module definitions
+ * here.
*
- * A link to /wiki/ would be redirected to /sr/Главна_Ñтрана
+ * Example:
+ * $wgResourceModules['ext.myExtension'] = array(
+ * 'scripts' => 'myExtension.js',
+ * 'styles' => 'myExtension.css',
+ * 'dependencies' => array( 'jquery.cookie', 'jquery.tabIndex' ),
+ * 'localBasePath' => dirname( __FILE__ ),
+ * 'remoteExtPath' => 'MyExtension',
+ * );
+ */
+$wgResourceModules = array();
+
+/**
+ * Maximum time in seconds to cache resources served by the resource loader
+ */
+$wgResourceLoaderMaxage = array(
+ 'versioned' => array(
+ // Squid/Varnish but also any other public proxy cache between the client and MediaWiki
+ 'server' => 30 * 24 * 60 * 60, // 30 days
+ // On the client side (e.g. in the browser cache).
+ 'client' => 30 * 24 * 60 * 60, // 30 days
+ ),
+ 'unversioned' => array(
+ 'server' => 5 * 60, // 5 minutes
+ 'client' => 5 * 60, // 5 minutes
+ ),
+);
+
+/**
+ * Whether to embed private modules inline with HTML output or to bypass
+ * caching and check the user parameter against $wgUser to prevent
+ * unauthorized access to private modules.
+ */
+$wgResourceLoaderInlinePrivateModules = true;
+
+/**
+ * The default debug mode (on/off) for of ResourceLoader requests. This will still
+ * be overridden when the debug URL parameter is used.
+ */
+$wgResourceLoaderDebug = false;
+
+/**
+ * Enable embedding of certain resources using Edge Side Includes. This will
+ * improve performance but only works if there is something in front of the
+ * web server (e..g a Squid or Varnish server) configured to process the ESI.
+ */
+$wgResourceLoaderUseESI = false;
+
+/**
+ * Put each statement on its own line when minifying JavaScript. This makes
+ * debugging in non-debug mode a bit easier.
+ */
+$wgResourceLoaderMinifierStatementsOnOwnLine = false;
+
+/**
+ * Maximum line length when minifying JavaScript. This is not a hard maximum:
+ * the minifier will try not to produce lines longer than this, but may be
+ * forced to do so in certain cases.
+ */
+$wgResourceLoaderMinifierMaxLineLength = 1000;
+
+/**
+ * Whether to include the mediawiki.legacy JS library (old wikibits.js), and its
+ * dependencies
+ */
+$wgIncludeLegacyJavaScript = true;
+
+/**
+ * If set to a positive number, ResourceLoader will not generate URLs whose
+ * query string is more than this many characters long, and will instead use
+ * multiple requests with shorter query strings. This degrades performance,
+ * but may be needed if your web server has a low (less than, say 1024)
+ * query string length limit or a low value for suhosin.get.max_value_length
+ * that you can't increase.
*
- * It is important that $wgArticlePath not overlap with possible values
- * of $wgVariantArticlePath.
+ * If set to a negative number, ResourceLoader will assume there is no query
+ * string length limit.
+ */
+$wgResourceLoaderMaxQueryLength = -1;
+
+/** @} */ # End of resource loader settings }
+
+
+/*************************************************************************//**
+ * @name Page title and interwiki link settings
+ * @{
*/
-$wgVariantArticlePath = false;///< defaults to false
/**
- * Show a bar of language selection links in the user login and user
- * registration forms; edit the "loginlanguagelinks" message to
- * customise these
+ * Name of the project namespace. If left set to false, $wgSitename will be
+ * used instead.
*/
-$wgLoginLanguageSelector = false;
+$wgMetaNamespace = false;
+
+/**
+ * Name of the project talk namespace.
+ *
+ * Normally you can ignore this and it will be something like
+ * $wgMetaNamespace . "_talk". In some languages, you may want to set this
+ * manually for grammatical reasons.
+ */
+$wgMetaNamespaceTalk = false;
+
+/**
+ * Additional namespaces. If the namespaces defined in Language.php and
+ * Namespace.php are insufficient, you can create new ones here, for example,
+ * to import Help files in other languages. You can also override the namespace
+ * names of existing namespaces. Extensions developers should use
+ * $wgCanonicalNamespaceNames.
+ *
+ * PLEASE NOTE: Once you delete a namespace, the pages in that namespace will
+ * no longer be accessible. If you rename it, then you can access them through
+ * the new namespace name.
+ *
+ * Custom namespaces should start at 100 to avoid conflicting with standard
+ * namespaces, and should always follow the even/odd main/talk pattern.
+ */
+#$wgExtraNamespaces =
+# array(100 => "Hilfe",
+# 101 => "Hilfe_Diskussion",
+# 102 => "Aide",
+# 103 => "Discussion_Aide"
+# );
+$wgExtraNamespaces = array();
/**
- * Whether to use zhdaemon to perform Chinese text processing
- * zhdaemon is under developement, so normally you don't want to
- * use it unless for testing
+ * Namespace aliases
+ * These are alternate names for the primary localised namespace names, which
+ * are defined by $wgExtraNamespaces and the language file. If a page is
+ * requested with such a prefix, the request will be redirected to the primary
+ * name.
+ *
+ * Set this to a map from namespace names to IDs.
+ * Example:
+ * $wgNamespaceAliases = array(
+ * 'Wikipedian' => NS_USER,
+ * 'Help' => 100,
+ * );
*/
-$wgUseZhdaemon = false;
-$wgZhdaemonHost="localhost";
-$wgZhdaemonPort=2004;
+$wgNamespaceAliases = array();
+/**
+ * Allowed title characters -- regex character class
+ * Don't change this unless you know what you're doing
+ *
+ * Problematic punctuation:
+ * - []{}|# Are needed for link syntax, never enable these
+ * - <> Causes problems with HTML escaping, don't use
+ * - % Enabled by default, minor problems with path to query rewrite rules, see below
+ * - + Enabled by default, but doesn't work with path to query rewrite rules, corrupted by apache
+ * - ? Enabled by default, but doesn't work with path to PATH_INFO rewrites
+ *
+ * All three of these punctuation problems can be avoided by using an alias, instead of a
+ * rewrite rule of either variety.
+ *
+ * The problem with % is that when using a path to query rewrite rule, URLs are
+ * double-unescaped: once by Apache's path conversion code, and again by PHP. So
+ * %253F, for example, becomes "?". Our code does not double-escape to compensate
+ * for this, indeed double escaping would break if the double-escaped title was
+ * passed in the query string rather than the path. This is a minor security issue
+ * because articles can be created such that they are hard to view or edit.
+ *
+ * In some rare cases you may wish to remove + for compatibility with old links.
+ *
+ * Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but
+ * this breaks interlanguage links
+ */
+$wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
-# Miscellaneous configuration settings
-#
+/**
+ * The interwiki prefix of the current wiki, or false if it doesn't have one.
+ */
+$wgLocalInterwiki = false;
-$wgLocalInterwiki = 'w';
-$wgInterwikiExpiry = 10800; # Expiry time for cache of interwiki table
+/**
+ * Expiry time for cache of interwiki table
+ */
+$wgInterwikiExpiry = 10800;
/** Interwiki caching settings.
$wgInterwikiCache specifies path to constant database file
@@ -1121,15 +2598,110 @@ $wgInterwikiFallbackSite = 'wiki';
*/
$wgRedirectSources = false;
+/**
+ * Set this to false to avoid forcing the first letter of links to capitals.
+ * WARNING: may break links! This makes links COMPLETELY case-sensitive. Links
+ * appearing with a capital at the beginning of a sentence will *not* go to the
+ * same place as links in the middle of a sentence using a lowercase initial.
+ */
+$wgCapitalLinks = true;
-$wgShowIPinHeader = true; # For non-logged in users
-$wgMaxSigChars = 255; # Maximum number of Unicode characters in signature
-$wgMaxArticleSize = 2048; # Maximum article size in kilobytes
-# Maximum number of bytes in username. You want to run the maintenance
-# script ./maintenancecheckUsernames.php once you have changed this value
-$wgMaxNameChars = 255;
+/**
+ * @since 1.16 - This can now be set per-namespace. Some special namespaces (such
+ * as Special, see MWNamespace::$alwaysCapitalizedNamespaces for the full list) must be
+ * true by default (and setting them has no effect), due to various things that
+ * require them to be so. Also, since Talk namespaces need to directly mirror their
+ * associated content namespaces, the values for those are ignored in favor of the
+ * subject namespace's setting. Setting for NS_MEDIA is taken automatically from
+ * NS_FILE.
+ * EX: $wgCapitalLinkOverrides[ NS_FILE ] = false;
+ */
+$wgCapitalLinkOverrides = array();
+
+/** Which namespaces should support subpages?
+ * See Language.php for a list of namespaces.
+ */
+$wgNamespacesWithSubpages = array(
+ NS_TALK => true,
+ NS_USER => true,
+ NS_USER_TALK => true,
+ NS_PROJECT_TALK => true,
+ NS_FILE_TALK => true,
+ NS_MEDIAWIKI => true,
+ NS_MEDIAWIKI_TALK => true,
+ NS_TEMPLATE_TALK => true,
+ NS_HELP_TALK => true,
+ NS_CATEGORY_TALK => true
+);
+
+/**
+ * Array of namespaces which can be deemed to contain valid "content", as far
+ * as the site statistics are concerned. Useful if additional namespaces also
+ * contain "content" which should be considered when generating a count of the
+ * number of articles in the wiki.
+ */
+$wgContentNamespaces = array( NS_MAIN );
+
+/**
+ * Max number of redirects to follow when resolving redirects.
+ * 1 means only the first redirect is followed (default behavior).
+ * 0 or less means no redirects are followed.
+ */
+$wgMaxRedirects = 1;
+
+/**
+ * Array of invalid page redirect targets.
+ * Attempting to create a redirect to any of the pages in this array
+ * will make the redirect fail.
+ * Userlogout is hard-coded, so it does not need to be listed here.
+ * (bug 10569) Disallow Mypage and Mytalk as well.
+ *
+ * As of now, this only checks special pages. Redirects to pages in
+ * other namespaces cannot be invalidated by this variable.
+ */
+$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk' );
+
+/** @} */ # End of title and interwiki settings }
+
+/************************************************************************//**
+ * @name Parser settings
+ * These settings configure the transformation from wikitext to HTML.
+ * @{
+ */
+
+/**
+ * Parser configuration. Associative array with the following members:
+ *
+ * class The class name
+ *
+ * preprocessorClass The preprocessor class. Two classes are currently available:
+ * Preprocessor_Hash, which uses plain PHP arrays for tempoarary
+ * storage, and Preprocessor_DOM, which uses the DOM module for
+ * temporary storage. Preprocessor_DOM generally uses less memory;
+ * the speed of the two is roughly the same.
+ *
+ * If this parameter is not given, it uses Preprocessor_DOM if the
+ * DOM module is available, otherwise it uses Preprocessor_Hash.
+ *
+ * The entire associative array will be passed through to the constructor as
+ * the first parameter. Note that only Setup.php can use this variable --
+ * the configuration will change at runtime via $wgParser member functions, so
+ * the contents of this variable will be out-of-date. The variable can only be
+ * changed during LocalSettings.php, in particular, it can't be changed during
+ * an extension setup function.
+ */
+$wgParserConf = array(
+ 'class' => 'Parser',
+ #'preprocessorClass' => 'Preprocessor_Hash',
+);
+
+/** Maximum indent level of toc. */
+$wgMaxTocLevel = 999;
-$wgMaxPPNodeCount = 1000000; # A complexity limit on template expansion
+/**
+ * A complexity limit on template expansion
+ */
+$wgMaxPPNodeCount = 1000000;
/**
* Maximum recursion depth for templates within templates.
@@ -1138,207 +2710,460 @@ $wgMaxPPNodeCount = 1000000; # A complexity limit on template expansion
* stop the parser before it hits the xdebug limit.
*/
$wgMaxTemplateDepth = 40;
+
+/** @see $wgMaxTemplateDepth */
$wgMaxPPExpandDepth = 40;
+/** The external URL protocols */
+$wgUrlProtocols = array(
+ 'http://',
+ 'https://',
+ 'ftp://',
+ 'irc://',
+ 'gopher://',
+ 'telnet://', // Well if we're going to support the above.. -ævar
+ 'nntp://', // @bug 3808 RFC 1738
+ 'worldwind://',
+ 'mailto:',
+ 'news:',
+ 'svn://',
+ 'git://',
+ 'mms://',
+);
+
/**
* If true, removes (substitutes) templates in "~~~~" signatures.
*/
$wgCleanSignatures = true;
-$wgExtraSubtitle = '';
-$wgSiteSupportPage = ''; # A page where you users can receive donations
+/** Whether to allow inline image pointing to other websites */
+$wgAllowExternalImages = false;
/**
- * Set this to a string to put the wiki into read-only mode. The text will be
- * used as an explanation to users.
+ * If the above is false, you can specify an exception here. Image URLs
+ * that start with this string are then rendered, while all others are not.
+ * You can use this to set up a trusted, simple repository of images.
+ * You may also specify an array of strings to allow multiple sites
*
- * This prevents most write operations via the web interface. Cache updates may
- * still be possible. To prevent database writes completely, use the read_only
- * option in MySQL.
+ * Examples:
+ * <code>
+ * $wgAllowExternalImagesFrom = 'http://127.0.0.1/';
+ * $wgAllowExternalImagesFrom = array( 'http://127.0.0.1/', 'http://example.com' );
+ * </code>
*/
-$wgReadOnly = null;
+$wgAllowExternalImagesFrom = '';
-/***
- * If this lock file exists (size > 0), the wiki will be forced into read-only mode.
- * Its contents will be shown to users as part of the read-only warning
- * message.
+/** If $wgAllowExternalImages is false, you can allow an on-wiki
+ * whitelist of regular expression fragments to match the image URL
+ * against. If the image matches one of the regular expression fragments,
+ * The image will be displayed.
+ *
+ * Set this to true to enable the on-wiki whitelist (MediaWiki:External image whitelist)
+ * Or false to disable it
*/
-$wgReadOnlyFile = false; ///< defaults to "{$wgUploadDirectory}/lock_yBgMBwiR";
+$wgEnableImageWhitelist = true;
/**
- * Filename for debug logging. See http://www.mediawiki.org/wiki/How_to_debug
- * The debug log file should be not be publicly accessible if it is used, as it
- * may contain private data.
+ * A different approach to the above: simply allow the <img> tag to be used.
+ * This allows you to specify alt text and other attributes, copy-paste HTML to
+ * your wiki more easily, etc. However, allowing external images in any manner
+ * will allow anyone with editing rights to snoop on your visitors' IP
+ * addresses and so forth, if they wanted to, by inserting links to images on
+ * sites they control.
*/
-$wgDebugLogFile = '';
+$wgAllowImageTag = false;
/**
- * Prefix for debug log lines
+ * $wgUseTidy: use tidy to make sure HTML output is sane.
+ * Tidy is a free tool that fixes broken HTML.
+ * See http://www.w3.org/People/Raggett/tidy/
+ *
+ * - $wgTidyBin should be set to the path of the binary and
+ * - $wgTidyConf to the path of the configuration file.
+ * - $wgTidyOpts can include any number of parameters.
+ * - $wgTidyInternal controls the use of the PECL extension to use an in-
+ * process tidy library instead of spawning a separate program.
+ * Normally you shouldn't need to override the setting except for
+ * debugging. To install, use 'pear install tidy' and add a line
+ * 'extension=tidy.so' to php.ini.
*/
-$wgDebugLogPrefix = '';
+$wgUseTidy = false;
+/** @see $wgUseTidy */
+$wgAlwaysUseTidy = false;
+/** @see $wgUseTidy */
+$wgTidyBin = 'tidy';
+/** @see $wgUseTidy */
+$wgTidyConf = $IP.'/includes/tidy.conf';
+/** @see $wgUseTidy */
+$wgTidyOpts = '';
+/** @see $wgUseTidy */
+$wgTidyInternal = extension_loaded( 'tidy' );
/**
- * If true, instead of redirecting, show a page with a link to the redirect
- * destination. This allows for the inspection of PHP error messages, and easy
- * resubmission of form data. For developer use only.
+ * Put tidy warnings in HTML comments
+ * Only works for internal tidy.
*/
-$wgDebugRedirects = false;
+$wgDebugTidy = false;
+
+/** Allow raw, unchecked HTML in <html>...</html> sections.
+ * THIS IS VERY DANGEROUS on a publically editable site, so USE wgGroupPermissions
+ * TO RESTRICT EDITING to only those that you trust
+ */
+$wgRawHtml = false;
/**
- * If true, log debugging data from action=raw.
- * This is normally false to avoid overlapping debug entries due to gen=css and
- * gen=js requests.
+ * Set a default target for external links, e.g. _blank to pop up a new window
*/
-$wgDebugRawPage = false;
+$wgExternalLinkTarget = false;
/**
- * Send debug data to an HTML comment in the output.
+ * If true, external URL links in wiki text will be given the
+ * rel="nofollow" attribute as a hint to search engines that
+ * they should not be followed for ranking purposes as they
+ * are user-supplied and thus subject to spamming.
+ */
+$wgNoFollowLinks = true;
+
+/**
+ * Namespaces in which $wgNoFollowLinks doesn't apply.
+ * See Language.php for a list of namespaces.
+ */
+$wgNoFollowNsExceptions = array();
+
+/**
+ * If this is set to an array of domains, external links to these domain names
+ * (or any subdomains) will not be set to rel="nofollow" regardless of the
+ * value of $wgNoFollowLinks. For instance:
*
- * This may occasionally be useful when supporting a non-technical end-user. It's
- * more secure than exposing the debug log file to the web, since the output only
- * contains private data for the current user. But it's not ideal for development
- * use since data is lost on fatal errors and redirects.
+ * $wgNoFollowDomainExceptions = array( 'en.wikipedia.org', 'wiktionary.org' );
+ *
+ * This would add rel="nofollow" to links to de.wikipedia.org, but not
+ * en.wikipedia.org, wiktionary.org, en.wiktionary.org, us.en.wikipedia.org,
+ * etc.
*/
-$wgDebugComments = false;
+$wgNoFollowDomainExceptions = array();
/**
- * Write SQL queries to the debug log
+ * Allow DISPLAYTITLE to change title display
*/
-$wgDebugDumpSql = false;
+$wgAllowDisplayTitle = true;
/**
- * Set to an array of log group keys to filenames.
- * If set, wfDebugLog() output for that group will go to that file instead
- * of the regular $wgDebugLogFile. Useful for enabling selective logging
- * in production.
+ * For consistency, restrict DISPLAYTITLE to titles that normalize to the same
+ * canonical DB key.
*/
-$wgDebugLogGroups = array();
+$wgRestrictDisplayTitle = true;
/**
- * Display debug data at the bottom of the main content area.
- *
- * Useful for developers and technical users trying to working on a closed wiki.
+ * Maximum number of calls per parse to expensive parser functions such as
+ * PAGESINCATEGORY.
*/
-$wgShowDebug = false;
+$wgExpensiveParserFunctionLimit = 100;
/**
- * Prefix debug messages with relative timestamp. Very-poor man's profiler.
+ * Preprocessor caching threshold
*/
-$wgDebugTimestamps = false;
+$wgPreprocessorCacheThreshold = 1000;
/**
- * Print HTTP headers for every request in the debug information.
+ * Enable interwiki transcluding. Only when iw_trans=1.
*/
-$wgDebugPrintHttpHeaders = true;
+$wgEnableScaryTranscluding = false;
/**
- * Show the contents of $wgHooks in Special:Version
+ * Expiry time for interwiki transclusion
+ */
+$wgTranscludeCacheExpiry = 3600;
+
+/** @} */ # end of parser settings }
+
+/************************************************************************//**
+ * @name Statistics
+ * @{
*/
-$wgSpecialVersionShowHooks = false;
/**
- * Whether to show "we're sorry, but there has been a database error" pages.
- * Displaying errors aids in debugging, but may display information useful
- * to an attacker.
+ * Under which condition should a page in the main namespace be counted
+ * as a valid article? If $wgUseCommaCount is set to true, it will be
+ * counted if it contains at least one comma. If it is set to false
+ * (default), it will only be counted if it contains at least one [[wiki
+ * link]]. See http://www.mediawiki.org/wiki/Manual:Article_count
+ *
+ * Retroactively changing this variable will not affect
+ * the existing count (cf. maintenance/recount.sql).
*/
-$wgShowSQLErrors = false;
+$wgUseCommaCount = false;
/**
- * If true, some error messages will be colorized when running scripts on the
- * command line; this can aid picking important things out when debugging.
- * Ignored when running on Windows or when output is redirected to a file.
+ * wgHitcounterUpdateFreq sets how often page counters should be updated, higher
+ * values are easier on the database. A value of 1 causes the counters to be
+ * updated on every hit, any higher value n cause them to update *on average*
+ * every n hits. Should be set to either 1 or something largish, eg 1000, for
+ * maximum efficiency.
*/
-$wgColorErrors = true;
+$wgHitcounterUpdateFreq = 1;
/**
- * If set to true, uncaught exceptions will print a complete stack trace
- * to output. This should only be used for debugging, as it may reveal
- * private information in function parameters due to PHP's backtrace
- * formatting.
+ * How many days user must be idle before he is considered inactive. Will affect
+ * the number shown on Special:Statistics and Special:ActiveUsers special page.
+ * You might want to leave this as the default value, to provide comparable
+ * numbers between different wikis.
*/
-$wgShowExceptionDetails = false;
+$wgActiveUserDays = 30;
+
+/** @} */ # End of statistics }
+
+/************************************************************************//**
+ * @name User accounts, authentication
+ * @{
+ */
+
+/** For compatibility with old installations set to false */
+$wgPasswordSalt = true;
/**
- * If true, show a backtrace for database errors
+ * Specifies the minimal length of a user password. If set to 0, empty pass-
+ * words are allowed.
*/
-$wgShowDBErrorBacktrace = false;
+$wgMinimalPasswordLength = 1;
/**
- * Expose backend server host names through the API and various HTML comments
+ * Enabes or disables JavaScript-based suggestions of password strength
*/
-$wgShowHostnames = false;
+$wgLivePasswordStrengthChecks = false;
/**
- * If set to true MediaWiki will throw notices for some possible error
- * conditions and for deprecated functions.
+ * Maximum number of Unicode characters in signature
*/
-$wgDevelopmentWarnings = false;
+$wgMaxSigChars = 255;
/**
- * Use experimental, DMOZ-like category browser
+ * Maximum number of bytes in username. You want to run the maintenance
+ * script ./maintenance/checkUsernames.php once you have changed this value.
*/
-$wgUseCategoryBrowser = false;
+$wgMaxNameChars = 255;
/**
- * Keep parsed pages in a cache (objectcache table or memcached)
- * to speed up output of the same page viewed by another user with the
- * same options.
+ * Array of usernames which may not be registered or logged in from
+ * Maintenance scripts can still use these
+ */
+$wgReservedUsernames = array(
+ 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
+ 'Conversion script', // Used for the old Wikipedia software upgrade
+ 'Maintenance script', // Maintenance scripts which perform editing, image import script
+ 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
+ 'msg:double-redirect-fixer', // Automatic double redirect fix
+ 'msg:usermessage-editor', // Default user for leaving user messages
+ 'msg:proxyblocker', // For Special:Blockme
+);
+
+/**
+ * Settings added to this array will override the default globals for the user
+ * preferences used by anonymous visitors and newly created accounts.
+ * For instance, to disable section editing links:
+ * $wgDefaultUserOptions ['editsection'] = 0;
*
- * This can provide a significant speedup for medium to large pages,
- * so you probably want to keep it on. Extensions that conflict with the
- * parser cache should disable the cache on a per-page basis instead.
*/
-$wgEnableParserCache = true;
+$wgDefaultUserOptions = array(
+ 'ccmeonemails' => 0,
+ 'cols' => 80,
+ 'contextchars' => 50,
+ 'contextlines' => 5,
+ 'date' => 'default',
+ 'diffonly' => 0,
+ 'disablemail' => 0,
+ 'disablesuggest' => 0,
+ 'editfont' => 'default',
+ 'editondblclick' => 0,
+ 'editsection' => 1,
+ 'editsectiononrightclick' => 0,
+ 'enotifminoredits' => 0,
+ 'enotifrevealaddr' => 0,
+ 'enotifusertalkpages' => 1,
+ 'enotifwatchlistpages' => 0,
+ 'extendwatchlist' => 0,
+ 'externaldiff' => 0,
+ 'externaleditor' => 0,
+ 'fancysig' => 0,
+ 'forceeditsummary' => 0,
+ 'gender' => 'unknown',
+ 'hideminor' => 0,
+ 'hidepatrolled' => 0,
+ 'highlightbroken' => 1,
+ 'imagesize' => 2,
+ 'justify' => 0,
+ 'math' => 1,
+ 'minordefault' => 0,
+ 'newpageshidepatrolled' => 0,
+ 'nocache' => 0,
+ 'noconvertlink' => 0,
+ 'norollbackdiff' => 0,
+ 'numberheadings' => 0,
+ 'previewonfirst' => 0,
+ 'previewontop' => 1,
+ 'quickbar' => 1,
+ 'rcdays' => 7,
+ 'rclimit' => 50,
+ 'rememberpassword' => 0,
+ 'rows' => 25,
+ 'searchlimit' => 20,
+ 'showhiddencats' => 0,
+ 'showjumplinks' => 1,
+ 'shownumberswatching' => 1,
+ 'showtoc' => 1,
+ 'showtoolbar' => 1,
+ 'skin' => false,
+ 'stubthreshold' => 0,
+ 'thumbsize' => 2,
+ 'underline' => 2,
+ 'uselivepreview' => 0,
+ 'usenewrc' => 0,
+ 'watchcreations' => 0,
+ 'watchdefault' => 0,
+ 'watchdeletion' => 0,
+ 'watchlistdays' => 3.0,
+ 'watchlisthideanons' => 0,
+ 'watchlisthidebots' => 0,
+ 'watchlisthideliu' => 0,
+ 'watchlisthideminor' => 0,
+ 'watchlisthideown' => 0,
+ 'watchlisthidepatrolled' => 0,
+ 'watchmoves' => 0,
+ 'wllimit' => 250,
+);
/**
- * Append a configured value to the parser cache and the sitenotice key so
- * that they can be kept separate for some class of activity.
+ * Whether or not to allow and use real name fields.
+ * @deprecated in 1.16, use $wgHiddenPrefs[] = 'realname' below to disable real
+ * names
*/
-$wgRenderHashAppend = '';
+$wgAllowRealName = true;
+
+/** An array of preferences to not show for the user */
+$wgHiddenPrefs = array();
/**
- * If on, the sidebar navigation links are cached for users with the
- * current language set. This can save a touch of load on a busy site
- * by shaving off extra message lookups.
+ * Characters to prevent during new account creations.
+ * This is used in a regular expression character class during
+ * registration (regex metacharacters like / are escaped).
+ */
+$wgInvalidUsernameCharacters = '@';
+
+/**
+ * Character used as a delimiter when testing for interwiki userrights
+ * (In Special:UserRights, it is possible to modify users on different
+ * databases if the delimiter is used, e.g. Someuser@enwiki).
*
- * However it is also fragile: changing the site configuration, or
- * having a variable $wgArticlePath, can produce broken links that
- * don't update as expected.
+ * It is recommended that you have this delimiter in
+ * $wgInvalidUsernameCharacters above, or you will not be able to
+ * modify the user rights of those users via Special:UserRights
*/
-$wgEnableSidebarCache = false;
+$wgUserrightsInterwikiDelimiter = '@';
/**
- * Expiry time for the sidebar cache, in seconds
+ * Use some particular type of external authentication. The specific
+ * authentication module you use will normally require some extra settings to
+ * be specified.
+ *
+ * null indicates no external authentication is to be used. Otherwise,
+ * $wgExternalAuthType must be the name of a non-abstract class that extends
+ * ExternalUser.
+ *
+ * Core authentication modules can be found in includes/extauth/.
*/
-$wgSidebarCacheExpiry = 86400;
+$wgExternalAuthType = null;
/**
- * Under which condition should a page in the main namespace be counted
- * as a valid article? If $wgUseCommaCount is set to true, it will be
- * counted if it contains at least one comma. If it is set to false
- * (default), it will only be counted if it contains at least one [[wiki
- * link]]. See http://www.mediawiki.org/wiki/Manual:Article_count
+ * Configuration for the external authentication. This may include arbitrary
+ * keys that depend on the authentication mechanism. For instance,
+ * authentication against another web app might require that the database login
+ * info be provided. Check the file where your auth mechanism is defined for
+ * info on what to put here.
+ */
+$wgExternalAuthConf = array();
+
+/**
+ * When should we automatically create local accounts when external accounts
+ * already exist, if using ExternalAuth? Can have three values: 'never',
+ * 'login', 'view'. 'view' requires the external database to support cookies,
+ * and implies 'login'.
*
- * Retroactively changing this variable will not affect
- * the existing count (cf. maintenance/recount.sql).
+ * TODO: Implement 'view' (currently behaves like 'login').
*/
-$wgUseCommaCount = false;
+$wgAutocreatePolicy = 'login';
/**
- * wgHitcounterUpdateFreq sets how often page counters should be updated, higher
- * values are easier on the database. A value of 1 causes the counters to be
- * updated on every hit, any higher value n cause them to update *on average*
- * every n hits. Should be set to either 1 or something largish, eg 1000, for
- * maximum efficiency.
+ * Policies for how each preference is allowed to be changed, in the presence
+ * of external authentication. The keys are preference keys, e.g., 'password'
+ * or 'emailaddress' (see Preferences.php et al.). The value can be one of the
+ * following:
+ *
+ * - local: Allow changes to this pref through the wiki interface but only
+ * apply them locally (default).
+ * - semiglobal: Allow changes through the wiki interface and try to apply them
+ * to the foreign database, but continue on anyway if that fails.
+ * - global: Allow changes through the wiki interface, but only let them go
+ * through if they successfully update the foreign database.
+ * - message: Allow no local changes for linked accounts; replace the change
+ * form with a message provided by the auth plugin, telling the user how to
+ * change the setting externally (maybe providing a link, etc.). If the auth
+ * plugin provides no message for this preference, hide it entirely.
+ *
+ * Accounts that are not linked to an external account are never affected by
+ * this setting. You may want to look at $wgHiddenPrefs instead.
+ * $wgHiddenPrefs supersedes this option.
+ *
+ * TODO: Implement message, global.
*/
-$wgHitcounterUpdateFreq = 1;
+$wgAllowPrefChange = array();
-# Basic user rights and block settings
-$wgSysopUserBans = true; # Allow sysops to ban logged-in users
-$wgSysopRangeBans = true; # Allow sysops to ban IP ranges
-$wgAutoblockExpiry = 86400; # Number of seconds before autoblock entries expire
-$wgBlockAllowsUTEdit = false; # Default setting for option on block form to allow self talkpage editing whilst blocked
-$wgSysopEmailBans = true; # Allow sysops to ban users from accessing Emailuser
+/**
+ * This is to let user authenticate using https when they come from http.
+ * Based on an idea by George Herbert on wikitech-l:
+ * http://lists.wikimedia.org/pipermail/wikitech-l/2010-October/050065.html
+ * @since 1.17
+ */
+$wgSecureLogin = false;
+
+/** @} */ # end user accounts }
+
+/************************************************************************//**
+ * @name User rights, access control and monitoring
+ * @{
+ */
+
+/**
+ * Allow sysops to ban logged-in users
+ * @deprecated since 1.17, will be made permanently true in 1.18
+ */
+$wgSysopUserBans = true;
+
+/**
+ * Allow sysops to ban IP ranges
+ * @deprecated since 1.17; set $wgBlockCIDRLimit to array( 'IPv4' => 32, 'IPv6 => 128 ) instead.
+ */
+$wgSysopRangeBans = true;
+
+/**
+ * Number of seconds before autoblock entries expire. Default 86400 = 1 day.
+ */
+$wgAutoblockExpiry = 86400;
+
+/**
+ * Set this to true to allow blocked users to edit their own user talk page.
+ */
+$wgBlockAllowsUTEdit = false;
+
+/** Allow sysops to ban users from accessing Emailuser */
+$wgSysopEmailBans = true;
+
+/**
+ * Limits on the possible sizes of range blocks.
+ *
+ * CIDR notation is hard to understand, it's easy to mistakenly assume that a
+ * /1 is a small range and a /31 is a large range. Setting this to half the
+ * number of bits avoids such errors.
+ */
$wgBlockCIDRLimit = array(
'IPv4' => 16, # Blocks larger than a /16 (64k addresses) will not be allowed
'IPv6' => 64, # 2^64 = ~1.8x10^19 addresses
@@ -1351,24 +3176,31 @@ $wgBlockCIDRLimit = array(
* logging the user out will again allow reading and editing, just as for
* anonymous visitors.
*/
-$wgBlockDisablesLogin = false; #
-
-# Pages anonymous user may see as an array, e.g.:
-# array ( "Main Page", "Wikipedia:Help");
-# Special:Userlogin and Special:Resetpass are always whitelisted.
-# NOTE: This will only work if $wgGroupPermissions['*']['read']
-# is false -- see below. Otherwise, ALL pages are accessible,
-# regardless of this setting.
-# Also note that this will only protect _pages in the wiki_.
-# Uploaded files will remain readable. Make your upload
-# directory name unguessable, or use .htaccess to protect it.
+$wgBlockDisablesLogin = false;
+
+/**
+ * Pages anonymous user may see as an array, e.g.
+ *
+ * <code>
+ * $wgWhitelistRead = array ( "Main Page", "Wikipedia:Help");
+ * </code>
+ *
+ * Special:Userlogin and Special:Resetpass are always whitelisted.
+ *
+ * NOTE: This will only work if $wgGroupPermissions['*']['read'] is false --
+ * see below. Otherwise, ALL pages are accessible, regardless of this setting.
+ *
+ * Also note that this will only protect _pages in the wiki_. Uploaded files
+ * will remain readable. You can use img_auth.php to protect uploaded files,
+ * see http://www.mediawiki.org/wiki/Manual:Image_Authorization
+ */
$wgWhitelistRead = false;
/**
* Should editors be required to have a validated e-mail
* address before being allowed to edit?
*/
-$wgEmailConfirmToEdit=false;
+$wgEmailConfirmToEdit = false;
/**
* Permission keys given to users in each group.
@@ -1389,6 +3221,7 @@ $wgEmailConfirmToEdit=false;
*/
$wgGroupPermissions = array();
+/** @cond file_level_code */
// Implicit group for all visitors
$wgGroupPermissions['*']['createaccount'] = true;
$wgGroupPermissions['*']['read'] = true;
@@ -1463,8 +3296,9 @@ $wgGroupPermissions['sysop']['markbotedits'] = true;
$wgGroupPermissions['sysop']['apihighlimits'] = true;
$wgGroupPermissions['sysop']['browsearchive'] = true;
$wgGroupPermissions['sysop']['noratelimit'] = true;
-$wgGroupPermissions['sysop']['versiondetail'] = true;
$wgGroupPermissions['sysop']['movefile'] = true;
+$wgGroupPermissions['sysop']['unblockself'] = true;
+$wgGroupPermissions['sysop']['suppressredirect'] = true;
#$wgGroupPermissions['sysop']['mergehistory'] = true;
// Permission to change users' group assignments
@@ -1491,6 +3325,8 @@ $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
*/
# $wgGroupPermissions['developer']['siteadmin'] = true;
+/** @endcond */
+
/**
* Permission keys revoked from users in each group.
* This acts the same way as wgGroupPermissions above, except that
@@ -1525,14 +3361,18 @@ $wgImplicitGroups = array( '*', 'user', 'autoconfirmed' );
*
*/
$wgGroupsAddToSelf = array();
+
+/** @see $wgGroupsAddToSelf */
$wgGroupsRemoveFromSelf = array();
/**
* Set of available actions that can be restricted via action=protect
* You probably shouldn't change this.
* Translated through restriction-* messages.
+ * Title::getRestrictionTypes() will remove restrictions that are not
+ * applicable to a specific title (create and upload)
*/
-$wgRestrictionTypes = array( 'edit', 'move' );
+$wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' );
/**
* Rights which can be required for each protection level (via action=protect)
@@ -1541,8 +3381,8 @@ $wgRestrictionTypes = array( 'edit', 'move' );
* permission by manipulating this array. The ordering of elements
* dictates the order on the protection form's lists.
*
- * '' will be ignored (i.e. unprotected)
- * 'sysop' is quietly rewritten to 'protect' for backwards compatibility
+ * - '' will be ignored (i.e. unprotected)
+ * - 'sysop' is quietly rewritten to 'protect' for backwards compatibility
*/
$wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
@@ -1564,24 +3404,32 @@ $wgNamespaceProtection = array();
$wgNonincludableNamespaces = array();
/**
- * Number of seconds an account is required to age before
- * it's given the implicit 'autoconfirm' group membership.
- * This can be used to limit privileges of new accounts.
+ * Number of seconds an account is required to age before it's given the
+ * implicit 'autoconfirm' group membership. This can be used to limit
+ * privileges of new accounts.
*
- * Accounts created by earlier versions of the software
- * may not have a recorded creation date, and will always
- * be considered to pass the age test.
+ * Accounts created by earlier versions of the software may not have a
+ * recorded creation date, and will always be considered to pass the age test.
*
* When left at 0, all registered accounts will pass.
+ *
+ * Example:
+ * <code>
+ * $wgAutoConfirmAge = 600; // ten minutes
+ * $wgAutoConfirmAge = 3600*24; // one day
+ * </code>
*/
$wgAutoConfirmAge = 0;
-//$wgAutoConfirmAge = 600; // ten minutes
-//$wgAutoConfirmAge = 3600*24; // one day
-# Number of edits an account requires before it is autoconfirmed
-# Passing both this AND the time requirement is needed
+/**
+ * Number of edits an account requires before it is autoconfirmed.
+ * Passing both this AND the time requirement is needed. Example:
+ *
+ * <code>
+ * $wgAutoConfirmCount = 50;
+ * </code>
+ */
$wgAutoConfirmCount = 0;
-//$wgAutoConfirmCount = 50;
/**
* Automatically add a usergroup to any user who matches certain conditions.
@@ -1610,9 +3458,10 @@ $wgAutopromote = array(
);
/**
- * These settings can be used to give finer control over who can assign which
- * groups at Special:Userrights. Example configuration:
+ * $wgAddGroups and $wgRemoveGroups can be used to give finer control over who
+ * can assign which groups at Special:Userrights. Example configuration:
*
+ * @code
* // Bureaucrat can add any group
* $wgAddGroups['bureaucrat'] = true;
* // Bureaucrats can only remove bots and sysops
@@ -1621,8 +3470,10 @@ $wgAutopromote = array(
* $wgAddGroups['sysop'] = array( 'bot' );
* // Sysops can disable other sysops in an emergency, and disable bots
* $wgRemoveGroups['sysop'] = array( 'sysop', 'bot' );
+ * @endcode
*/
$wgAddGroups = array();
+/** @see $wgAddGroups */
$wgRemoveGroups = array();
/**
@@ -1637,219 +3488,178 @@ $wgAvailableRights = array();
*/
$wgDeleteRevisionsLimit = 0;
-# Proxy scanner settings
-#
+/** Number of accounts each IP address may create, 0 to disable.
+ * Requires memcached */
+$wgAccountCreationThrottle = 0;
/**
- * If you enable this, every editor's IP address will be scanned for open HTTP
- * proxies.
+ * Edits matching these regular expressions in body text
+ * will be recognised as spam and rejected automatically.
*
- * Don't enable this. Many sysops will report "hostile TCP port scans" to your
- * ISP and ask for your server to be shut down.
+ * There's no administrator override on-wiki, so be careful what you set. :)
+ * May be an array of regexes or a single string for backwards compatibility.
*
- * You have been warned.
+ * See http://en.wikipedia.org/wiki/Regular_expression
+ * Note that each regex needs a beginning/end delimiter, eg: # or /
*/
-$wgBlockOpenProxies = false;
-/** Port we want to scan for a proxy */
-$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
-/** Script used to scan */
-$wgProxyScriptPath = "$IP/includes/proxy_check.php";
-/** */
-$wgProxyMemcExpiry = 86400;
-/** This should always be customised in LocalSettings.php */
-$wgSecretKey = false;
-/** big list of banned IP addresses, in the keys not the values */
-$wgProxyList = array();
-/** deprecated */
-$wgProxyKey = false;
-
-/** Number of accounts each IP address may create, 0 to disable.
- * Requires memcached */
-$wgAccountCreationThrottle = 0;
-
-# Client-side caching:
+$wgSpamRegex = array();
-/** Allow client-side caching of pages */
-$wgCachePages = true;
+/** Same as the above except for edit summaries */
+$wgSummarySpamRegex = array();
/**
- * Set this to current time to invalidate all prior cached pages. Affects both
- * client- and server-side caching.
- * You can get the current date on your server by using the command:
- * date +%Y%m%d%H%M%S
+ * 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 Use hooks. See SpamBlacklist extension.
*/
-$wgCacheEpoch = '20030516000000';
+$wgFilterCallback = false;
/**
- * Bump this number when changing the global style sheets and JavaScript.
- * It should be appended in the query string of static CSS and JS includes,
- * to ensure that client-side caches do not keep obsolete copies of global
- * styles.
+ * Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open proxies
+ * @since 1.16
*/
-$wgStyleVersion = '270';
-
-
-# Server-side caching:
+$wgEnableDnsBlacklist = false;
/**
- * This will cache static pages for non-logged-in users to reduce
- * database traffic on public sites.
- * Must set $wgShowIPinHeader = false
+ * @deprecated Use $wgEnableDnsBlacklist instead, only kept for backward
+ * compatibility
*/
-$wgUseFileCache = false;
-
-/** Directory where the cached page will be saved */
-$wgFileCacheDirectory = false; ///< defaults to "$wgCacheDirectory/html";
+$wgEnableSorbs = false;
/**
- * When using the file cache, we can store the cached HTML gzipped to save disk
- * space. Pages will then also be served compressed to clients that support it.
- * THIS IS NOT COMPATIBLE with ob_gzhandler which is now enabled if supported in
- * the default LocalSettings.php! If you enable this, remove that setting first.
- *
- * Requires zlib support enabled in PHP.
+ * List of DNS blacklists to use, if $wgEnableDnsBlacklist is true
+ * @since 1.16
*/
-$wgUseGzip = false;
-
-/** Whether MediaWiki should send an ETag header */
-$wgUseETag = false;
-
-# Email notification settings
-#
-
-/** For email notification on page changes */
-$wgPasswordSender = $wgEmergencyContact;
-
-# true: from page editor if s/he opted-in
-# false: Enotif mails appear to come from $wgEmergencyContact
-$wgEnotifFromEditor = false;
-
-// TODO move UPO to preferences probably ?
-# If set to true, users get a corresponding option in their preferences and can choose to enable or disable at their discretion
-# If set to false, the corresponding input form on the user preference page is suppressed
-# It call this to be a "user-preferences-option (UPO)"
-$wgEmailAuthentication = true; # UPO (if this is set to false, texts referring to authentication are suppressed)
-$wgEnotifWatchlist = false; # UPO
-$wgEnotifUserTalk = false; # UPO
-$wgEnotifRevealEditorAddress = false; # UPO; reply-to address may be filled with page editor's address (if user allowed this in the preferences)
-$wgEnotifMinorEdits = true; # UPO; false: "minor edits" on pages do not trigger notification mails.
-# # Attention: _every_ change on a user_talk page trigger a notification mail (if the user is not yet notified)
-
-# Send a generic mail instead of a personalised mail for each user. This
-# always uses UTC as the time zone, and doesn't include the username.
-#
-# For pages with many users watching, this can significantly reduce mail load.
-# Has no effect when using sendmail rather than SMTP;
-
-$wgEnotifImpersonal = false;
-
-# Maximum number of users to mail at once when using impersonal mail. Should
-# match the limit on your mail server.
-$wgEnotifMaxRecips = 500;
-
-# Send mails via the job queue.
-$wgEnotifUseJobQ = false;
-
-# Use real name instead of username in e-mail "from" field
-$wgEnotifUseRealName = false;
+$wgDnsBlacklistUrls = array( 'http.dnsbl.sorbs.net.' );
/**
- * Array of usernames who will be sent a notification email for every change which occurs on a wiki
+ * @deprecated Use $wgDnsBlacklistUrls instead, only kept for backward
+ * compatibility
*/
-$wgUsersNotifiedOnAllChanges = array();
-
-/** Show watching users in recent changes, watchlist and page history views */
-$wgRCShowWatchingUsers = false; # UPO
-/** Show watching users in Page views */
-$wgPageShowWatchingUsers = false;
-/** Show the amount of changed characters in recent changes */
-$wgRCShowChangedSize = true;
+$wgSorbsUrl = array();
/**
- * If the difference between the character counts of the text
- * before and after the edit is below that value, the value will be
- * highlighted on the RC page.
+ * Proxy whitelist, list of addresses that are assumed to be non-proxy despite
+ * what the other methods might say.
*/
-$wgRCChangedSizeThreshold = 500;
+$wgProxyWhitelist = array();
/**
- * Show "Updated (since my last visit)" marker in RC view, watchlist and history
- * view for watched pages with new changes */
-$wgShowUpdatedMarker = true;
+ * Simple rate limiter options to brake edit floods. Maximum number actions
+ * allowed in the given number of seconds; after that the violating client re-
+ * ceives HTTP 500 error pages until the period elapses.
+ *
+ * array( 4, 60 ) for a maximum of 4 hits in 60 seconds.
+ *
+ * This option set is experimental and likely to change. Requires memcached.
+ */
+$wgRateLimits = array(
+ 'edit' => array(
+ 'anon' => null, // for any and all anonymous edits (aggregate)
+ 'user' => null, // for each logged-in user
+ 'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
+ 'ip' => null, // for each anon and recent account
+ 'subnet' => null, // ... with final octet removed
+ ),
+ 'move' => array(
+ 'user' => null,
+ 'newbie' => null,
+ 'ip' => null,
+ 'subnet' => null,
+ ),
+ 'mailpassword' => array(
+ 'anon' => null,
+ ),
+ 'emailuser' => array(
+ 'user' => null,
+ ),
+ );
/**
- * Default cookie expiration time. Setting to 0 makes all cookies session-only.
+ * Set to a filename to log rate limiter hits.
*/
-$wgCookieExpiration = 30*86400;
+$wgRateLimitLog = null;
-/** Clock skew or the one-second resolution of time() can occasionally cause cache
- * problems when the user requests two pages within a short period of time. This
- * variable adds a given number of seconds to vulnerable timestamps, thereby giving
- * a grace period.
+/**
+ * Array of groups which should never trigger the rate limiter
+ *
+ * @deprecated as of 1.13.0, the preferred method is using
+ * $wgGroupPermissions[]['noratelimit']. However, this will still
+ * work if desired.
+ *
+ * $wgRateLimitsExcludedGroups = array( 'sysop', 'bureaucrat' );
*/
-$wgClockSkewFudge = 5;
-
-# Squid-related settings
-#
-
-/** Enable/disable Squid */
-$wgUseSquid = false;
-
-/** If you run Squid3 with ESI support, enable this (default:false): */
-$wgUseESI = false;
-
-/** Send X-Vary-Options header for better caching (requires patched Squid) */
-$wgUseXVO = false;
-
-/** Internal server name as known to Squid, if different */
-# $wgInternalServer = 'http://yourinternal.tld:8000';
-$wgInternalServer = $wgServer;
+$wgRateLimitsExcludedGroups = array();
/**
- * Cache timeout for the squid, will be sent as s-maxage (without ESI) or
- * Surrogate-Control (with ESI). Without ESI, you should strip out s-maxage in
- * the Squid config. 18000 seconds = 5 hours, more cache hits with 2678400 = 31
- * days
+ * Array of IPs which should be excluded from rate limits.
+ * This may be useful for whitelisting NAT gateways for conferences, etc.
*/
-$wgSquidMaxage = 18000;
+$wgRateLimitsExcludedIPs = array();
/**
- * Default maximum age for raw CSS/JS accesses
+ * Log IP addresses in the recentchanges table; can be accessed only by
+ * extensions (e.g. CheckUser) or a DB admin
*/
-$wgForcedRawSMaxage = 300;
+$wgPutIPinRC = true;
/**
- * List of proxy servers to purge on changes; default port is 80. Use IP addresses.
- *
- * When MediaWiki is running behind a proxy, it will trust X-Forwarded-For
- * headers sent/modified from these proxies when obtaining the remote IP address
- *
- * For a list of trusted servers which *aren't* purged, see $wgSquidServersNoPurge.
+ * Limit password attempts to X attempts per Y seconds per IP per account.
+ * Requires memcached.
+ */
+$wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
+
+/** @} */ # end of user rights settings
+
+/************************************************************************//**
+ * @name Proxy scanner settings
+ * @{
*/
-$wgSquidServers = array();
/**
- * As above, except these servers aren't purged on page changes; use to set a
- * list of trusted proxies, etc.
+ * If you enable this, every editor's IP address will be scanned for open HTTP
+ * proxies.
+ *
+ * Don't enable this. Many sysops will report "hostile TCP port scans" to your
+ * ISP and ask for your server to be shut down.
+ *
+ * You have been warned.
*/
-$wgSquidServersNoPurge = array();
+$wgBlockOpenProxies = false;
+/** Port we want to scan for a proxy */
+$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
+/** Script used to scan */
+$wgProxyScriptPath = "$IP/includes/proxy_check.php";
+/** */
+$wgProxyMemcExpiry = 86400;
+/** This should always be customised in LocalSettings.php */
+$wgSecretKey = false;
+/** big list of banned IP addresses, in the keys not the values */
+$wgProxyList = array();
+/** deprecated */
+$wgProxyKey = false;
-/** Maximum number of titles to purge in any one client operation */
-$wgMaxSquidPurgeTitles = 400;
+/** @} */ # end of proxy scanner settings
-/** HTCP multicast purging */
-$wgHTCPPort = 4827;
-$wgHTCPMulticastTTL = 1;
-# $wgHTCPMulticastAddress = "224.0.0.85";
-$wgHTCPMulticastAddress = false;
+/************************************************************************//**
+ * @name Cookie settings
+ * @{
+ */
-/** Should forwarded Private IPs be accepted? */
-$wgUsePrivateIPs = false;
+/**
+ * Default cookie expiration time. Setting to 0 makes all cookies session-only.
+ */
+$wgCookieExpiration = 30*86400;
-# Cookie settings:
-#
/**
- * Set to set an explicit domain on the login cookies eg, "justthis.domain. org"
+ * Set to set an explicit domain on the login cookies eg, "justthis.domain.org"
* or ".any.subdomain.net"
*/
$wgCookieDomain = '';
@@ -1889,65 +3699,12 @@ $wgCacheVaryCookies = array();
/** Override to customise the session name */
$wgSessionName = false;
-/** Whether to allow inline image pointing to other websites */
-$wgAllowExternalImages = false;
-
-/** If the above is false, you can specify an exception here. Image URLs
- * that start with this string are then rendered, while all others are not.
- * You can use this to set up a trusted, simple repository of images.
- * You may also specify an array of strings to allow multiple sites
- *
- * Examples:
- * $wgAllowExternalImagesFrom = 'http://127.0.0.1/';
- * $wgAllowExternalImagesFrom = array( 'http://127.0.0.1/', 'http://example.com' );
- */
-$wgAllowExternalImagesFrom = '';
+/** @} */ # end of cookie settings }
-/** If $wgAllowExternalImages is false, you can allow an on-wiki
- * whitelist of regular expression fragments to match the image URL
- * against. If the image matches one of the regular expression fragments,
- * The image will be displayed.
- *
- * Set this to true to enable the on-wiki whitelist (MediaWiki:External image whitelist)
- * Or false to disable it
+/************************************************************************//**
+ * @name LaTeX (mathematical formulas)
+ * @{
*/
-$wgEnableImageWhitelist = true;
-
-/** Allows to move images and other media files */
-$wgAllowImageMoving = true;
-
-/** Disable database-intensive features */
-$wgMiserMode = false;
-/** Disable all query pages if miser mode is on, not just some */
-$wgDisableQueryPages = false;
-/** Number of rows to cache in 'querycache' table when miser mode is on */
-$wgQueryCacheLimit = 1000;
-/** Number of links to a page required before it is deemed "wanted" */
-$wgWantedPagesThreshold = 1;
-/** Enable slow parser functions */
-$wgAllowSlowParserFunctions = false;
-
-/**
- * Maps jobs to their handling classes; extensions
- * can add to this to provide custom jobs
- */
-$wgJobClasses = array(
- 'refreshLinks' => 'RefreshLinksJob',
- 'refreshLinks2' => 'RefreshLinksJob2',
- 'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
- 'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
- 'sendMail' => 'EmaillingJob',
- 'enotifNotify' => 'EnotifNotifyJob',
- 'fixDoubleRedirect' => 'DoubleRedirectJob',
-);
-
-/**
- * Additional functions to be performed with updateSpecialPages.
- * Expensive Querypages are already updated.
- */
-$wgSpecialPageCacheUpdates = array(
- 'Statistics' => array('SiteStatsUpdate','cacheUpdate')
-);
/**
* To use inline TeX, you need to compile 'texvc' (in the 'math' subdirectory of
@@ -1957,7 +3714,7 @@ $wgSpecialPageCacheUpdates = array(
*/
$wgUseTeX = false;
/** Location of the texvc binary */
-$wgTexvc = './math/texvc';
+$wgTexvc = $IP . '/math/texvc';
/**
* Texvc background color
* use LaTeX color format as used in \special function
@@ -1979,31 +3736,157 @@ $wgTexvcBackgroundColor = 'transparent';
*/
$wgMathCheckFiles = true;
-#
-# Profiling / debugging
-#
-# You have to create a 'profiling' table in your database before using
-# profiling see maintenance/archives/patch-profiling.sql .
-#
-# To enable profiling, edit StartProfiler.php
+/* @} */ # end LaTeX }
+
+/************************************************************************//**
+ * @name Profiling, testing and debugging
+ *
+ * To enable profiling, edit StartProfiler.php
+ *
+ * @{
+ */
+
+/**
+ * Filename for debug logging. See http://www.mediawiki.org/wiki/How_to_debug
+ * The debug log file should be not be publicly accessible if it is used, as it
+ * may contain private data.
+ */
+$wgDebugLogFile = '';
+
+/**
+ * Prefix for debug log lines
+ */
+$wgDebugLogPrefix = '';
+
+/**
+ * If true, instead of redirecting, show a page with a link to the redirect
+ * destination. This allows for the inspection of PHP error messages, and easy
+ * resubmission of form data. For developer use only.
+ */
+$wgDebugRedirects = false;
+
+/**
+ * If true, log debugging data from action=raw.
+ * This is normally false to avoid overlapping debug entries due to gen=css and
+ * gen=js requests.
+ */
+$wgDebugRawPage = false;
+
+/**
+ * Send debug data to an HTML comment in the output.
+ *
+ * This may occasionally be useful when supporting a non-technical end-user. It's
+ * more secure than exposing the debug log file to the web, since the output only
+ * contains private data for the current user. But it's not ideal for development
+ * use since data is lost on fatal errors and redirects.
+ */
+$wgDebugComments = false;
+
+/**
+ * Write SQL queries to the debug log
+ */
+$wgDebugDumpSql = false;
+
+/**
+ * Set to an array of log group keys to filenames.
+ * If set, wfDebugLog() output for that group will go to that file instead
+ * of the regular $wgDebugLogFile. Useful for enabling selective logging
+ * in production.
+ */
+$wgDebugLogGroups = array();
+
+/**
+ * Display debug data at the bottom of the main content area.
+ *
+ * Useful for developers and technical users trying to working on a closed wiki.
+ */
+$wgShowDebug = false;
+
+/**
+ * Prefix debug messages with relative timestamp. Very-poor man's profiler.
+ */
+$wgDebugTimestamps = false;
+
+/**
+ * Print HTTP headers for every request in the debug information.
+ */
+$wgDebugPrintHttpHeaders = true;
+
+/**
+ * Show the contents of $wgHooks in Special:Version
+ */
+$wgSpecialVersionShowHooks = false;
+
+/**
+ * Whether to show "we're sorry, but there has been a database error" pages.
+ * Displaying errors aids in debugging, but may display information useful
+ * to an attacker.
+ */
+$wgShowSQLErrors = false;
+
+/**
+ * If set to true, uncaught exceptions will print a complete stack trace
+ * to output. This should only be used for debugging, as it may reveal
+ * private information in function parameters due to PHP's backtrace
+ * formatting.
+ */
+$wgShowExceptionDetails = false;
+
+/**
+ * If true, show a backtrace for database errors
+ */
+$wgShowDBErrorBacktrace = false;
+
+/**
+ * Expose backend server host names through the API and various HTML comments
+ */
+$wgShowHostnames = false;
+
+/**
+ * If set to true MediaWiki will throw notices for some possible error
+ * conditions and for deprecated functions.
+ */
+$wgDevelopmentWarnings = false;
/** Only record profiling info for pages that took longer than this */
$wgProfileLimit = 0.0;
+
/** Don't put non-profiling info into log file */
$wgProfileOnly = false;
-/** Log sums from profiling into "profiling" table in db. */
+
+/**
+ * Log sums from profiling into "profiling" table in db.
+ *
+ * You have to create a 'profiling' table in your database before using
+ * this feature, see maintenance/archives/patch-profiling.sql
+ *
+ * To enable profiling, edit StartProfiler.php
+ */
$wgProfileToDatabase = false;
+
/** If true, print a raw call tree instead of per-function report */
$wgProfileCallTree = false;
+
/** Should application server host be put into profiling table */
$wgProfilePerHost = false;
-/** Settings for UDP profiler */
+/**
+ * Host for UDP profiler.
+ *
+ * The host should be running a daemon which can be obtained from MediaWiki
+ * Subversion at: http://svn.wikimedia.org/svnroot/mediawiki/trunk/udpprofile
+ */
$wgUDPProfilerHost = '127.0.0.1';
+
+/**
+ * Port for UDP profiler.
+ * @see $wgUDPProfilerHost
+ */
$wgUDPProfilerPort = '3811';
/** Detects non-matching wfProfileIn/wfProfileOut calls */
$wgDebugProfiling = false;
+
/** Output debug message on every wfProfileIn/wfProfileOut */
$wgDebugFunctionEntry = 0;
@@ -2020,9 +3903,52 @@ $wgStatsMethod = 'cache';
*/
$wgDisableCounters = false;
-$wgDisableTextSearch = false;
-$wgDisableSearchContext = false;
+/**
+ * Support blog-style "trackbacks" for articles. See
+ * http://www.sixapart.com/pronet/docs/trackback_spec for details.
+ */
+$wgUseTrackbacks = false;
+
+/**
+ * Parser test suite files to be run by parserTests.php when no specific
+ * filename is passed to it.
+ *
+ * Extensions may add their own tests to this array, or site-local tests
+ * may be added via LocalSettings.php
+ *
+ * Use full paths.
+ */
+$wgParserTestFiles = array(
+ "$IP/maintenance/tests/parser/parserTests.txt",
+ "$IP/maintenance/tests/parser/ExtraParserTests.txt"
+);
+
+/**
+ * If configured, specifies target CodeReview installation to send test
+ * result data from 'parserTests.php --upload'
+ *
+ * Something like this:
+ * $wgParserTestRemote = array(
+ * 'api-url' => 'http://www.mediawiki.org/w/api.php',
+ * 'repo' => 'MediaWiki',
+ * 'suite' => 'ParserTests',
+ * 'path' => '/trunk/phase3', // not used client-side; for reference
+ * 'secret' => 'qmoicj3mc4mcklmqw', // Shared secret used in HMAC validation
+ * );
+ */
+$wgParserTestRemote = false;
+
+/** @} */ # end of profiling, testing and debugging }
+/************************************************************************//**
+ * @name Search
+ * @{
+ */
+
+/**
+ * Set this to true to disable the full text search feature.
+ */
+$wgDisableTextSearch = false;
/**
* Set to true to have nicer highligted text in search results,
@@ -2033,6 +3959,8 @@ $wgAdvancedSearchHighlighting = false;
/**
* Regexp to match word boundaries, defaults for non-CJK languages
* should be empty for CJK since the words are not separate
+ *
+ * @todo FIXME: checks for lower than required PHP version (5.1.x).
*/
$wgSearchHighlightBoundaries = version_compare("5.1", PHP_VERSION, "<")? '[\p{Z}\p{P}\p{C}]'
: '[ ,.;:!?~!@#$%\^&*\(\)+=\-\\|\[\]"\'<>\n\r\/{}]'; // PHP 5.0 workaround
@@ -2092,149 +4020,15 @@ $wgMWSuggestTemplate = false;
* table. If you ever re-enable, be sure to rebuild the search table.
*/
$wgDisableSearchUpdate = false;
-/** Uploads have to be specially set up to be secure */
-$wgEnableUploads = false;
-/**
- * Show EXIF data, on by default if available.
- * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
- *
- * NOTE FOR WINDOWS USERS:
- * To enable EXIF functions, add the folloing lines to the
- * "Windows extensions" section of php.ini:
- *
- * extension=extensions/php_mbstring.dll
- * extension=extensions/php_exif.dll
- */
-$wgShowEXIF = function_exists( 'exif_read_data' );
-
-/**
- * Set to true to enable the upload _link_ while local uploads are disabled.
- * Assumes that the special page link will be bounced to another server where
- * uploads do work.
- */
-$wgRemoteUploads = false;
-
-/**
- * Disable links to talk pages of anonymous users (IPs) in listings on special
- * pages like page history, Special:Recentchanges, etc.
- */
-$wgDisableAnonTalk = false;
-/**
- * Do DELETE/INSERT for link updates instead of incremental
- */
-$wgUseDumbLinkUpdate = false;
-
-/**
- * Anti-lock flags - bitfield
- * ALF_PRELOAD_LINKS
- * Preload links during link update for save
- * ALF_PRELOAD_EXISTENCE
- * Preload cur_id during replaceLinkHolders
- * ALF_NO_LINK_LOCK
- * Don't use locking reads when updating the link table. This is
- * necessary for wikis with a high edit rate for performance
- * reasons, but may cause link table inconsistency
- * ALF_NO_BLOCK_LOCK
- * As for ALF_LINK_LOCK, this flag is a necessity for high-traffic
- * wikis.
- */
-$wgAntiLockFlags = 0;
-
-/**
- * Path to the GNU diff3 utility. If the file doesn't exist, edit conflicts will
- * fall back to the old behaviour (no merging).
- */
-$wgDiff3 = '/usr/bin/diff3';
/**
- * Path to the GNU diff utility.
- */
-$wgDiff = '/usr/bin/diff';
-
-/**
- * We can also compress text stored in the 'text' table. If this is set on, new
- * revisions will be compressed on page save if zlib support is available. Any
- * compressed revisions will be decompressed on load regardless of this setting
- * *but will not be readable at all* if zlib support is not available.
- */
-$wgCompressRevisions = false;
-
-/**
- * This is the list of preferred extensions for uploading files. Uploading files
- * with extensions not in this list will trigger a warning.
- */
-$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
-
-/** Files with these extensions will never be allowed as uploads. */
-$wgFileBlacklist = array(
- # HTML may contain cookie-stealing JavaScript and web bugs
- 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
- # PHP scripts may execute arbitrary code on the server
- 'php', 'phtml', 'php3', 'php4', 'php5', 'phps',
- # Other types that may be interpreted by some servers
- 'shtml', 'jhtml', 'pl', 'py', 'cgi',
- # May contain harmful executables for Windows victims
- 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' );
-
-/** Files with these mime types will never be allowed as uploads
- * if $wgVerifyMimeType is enabled.
- */
-$wgMimeTypeBlacklist= array(
- # HTML may contain cookie-stealing JavaScript and web bugs
- 'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
- # PHP scripts may execute arbitrary code on the server
- 'application/x-php', 'text/x-php',
- # Other types that may be interpreted by some servers
- 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
- # Client-side hazards on Internet Explorer
- 'text/scriptlet', 'application/x-msdownload',
- # Windows metafile, client-side vulnerability on some systems
- 'application/x-msmetafile',
- # A ZIP file may be a valid Java archive containing an applet which exploits the
- # same-origin policy to steal cookies
- 'application/zip',
-);
-
-/** This is a flag to determine whether or not to check file extensions on upload. */
-$wgCheckFileExtensions = true;
-
-/**
- * If this is turned off, users may override the warning for files not covered
- * by $wgFileExtensions.
- */
-$wgStrictFileExtensions = true;
-
-/** Warn if uploaded files are larger than this (in bytes), or false to disable*/
-$wgUploadSizeWarning = false;
-
-/** For compatibility with old installations set to false */
-$wgPasswordSalt = true;
-
-/** Which namespaces should support subpages?
- * See Language.php for a list of namespaces.
- */
-$wgNamespacesWithSubpages = array(
- NS_TALK => true,
- NS_USER => true,
- NS_USER_TALK => true,
- NS_PROJECT_TALK => true,
- NS_FILE_TALK => true,
- NS_MEDIAWIKI => true,
- NS_MEDIAWIKI_TALK => true,
- NS_TEMPLATE_TALK => true,
- NS_HELP_TALK => true,
- NS_CATEGORY_TALK => true
-);
-
-/**
- * Which namespaces have special treatment where they should be preview-on-open
- * Internaly only Category: pages apply, but using this extensions (e.g. Semantic MediaWiki)
- * can specify namespaces of pages they have special treatment for
+ * List of namespaces which are searched by default. Example:
+ *
+ * <code>
+ * $wgNamespacesToBeSearchedDefault[NS_MAIN] = true;
+ * $wgNamespacesToBeSearchedDefault[NS_PROJECT] = true;
+ * </code>
*/
-$wgPreviewOnOpenNamespaces = array(
- NS_CATEGORY => true
-);
-
$wgNamespacesToBeSearchedDefault = array(
NS_MAIN => true,
);
@@ -2258,158 +4052,104 @@ $wgNamespacesToBeSearchedHelp = array(
$wgSearchEverythingOnlyLoggedIn = false;
/**
- * Site notice shown at the top of each page
- *
- * MediaWiki:Sitenotice page, which will override this. You can also
- * provide a separate message for logged-out users using the
- * MediaWiki:Anonnotice page.
- */
-$wgSiteNotice = '';
-
-#
-# Images settings
-#
-
-/**
- * Plugins for media file type handling.
- * Each entry in the array maps a MIME type to a class name
+ * Disable the internal MySQL-based search, to allow it to be
+ * implemented by an extension instead.
*/
-$wgMediaHandlers = array(
- 'image/jpeg' => 'BitmapHandler',
- 'image/png' => 'BitmapHandler',
- 'image/gif' => 'GIFHandler',
- 'image/tiff' => 'TiffHandler',
- 'image/x-ms-bmp' => 'BmpHandler',
- 'image/x-bmp' => 'BmpHandler',
- 'image/svg+xml' => 'SvgHandler', // official
- 'image/svg' => 'SvgHandler', // compat
- 'image/vnd.djvu' => 'DjVuHandler', // official
- 'image/x.djvu' => 'DjVuHandler', // compat
- 'image/x-djvu' => 'DjVuHandler', // compat
-);
-
+$wgDisableInternalSearch = false;
/**
- * Resizing can be done using PHP's internal image libraries or using
- * ImageMagick or another third-party converter, e.g. GraphicMagick.
- * These support more file formats than PHP, which only supports PNG,
- * GIF, JPG, XBM and WBMP.
+ * Set this to a URL to forward search requests to some external location.
+ * If the URL includes '$1', this will be replaced with the URL-encoded
+ * search term.
*
- * Use Image Magick instead of PHP builtin functions.
+ * For example, to forward to Google you'd have something like:
+ * $wgSearchForwardUrl = 'http://www.google.com/search?q=$1' .
+ * '&domains=http://example.com' .
+ * '&sitesearch=http://example.com' .
+ * '&ie=utf-8&oe=utf-8';
*/
-$wgUseImageMagick = false;
-/** The convert command shipped with ImageMagick */
-$wgImageMagickConvertCommand = '/usr/bin/convert';
-
-/** Sharpening parameter to ImageMagick */
-$wgSharpenParameter = '0x0.4';
-
-/** Reduction in linear dimensions below which sharpening will be enabled */
-$wgSharpenReductionThreshold = 0.85;
+$wgSearchForwardUrl = null;
/**
- * Temporary directory used for ImageMagick. The directory must exist. Leave
- * this set to false to let ImageMagick decide for itself.
+ * Search form behavior
+ * true = use Go & Search buttons
+ * false = use Go button & Advanced search link
*/
-$wgImageMagickTempDir = false;
+$wgUseTwoButtonsSearchForm = true;
/**
- * Use another resizing converter, e.g. GraphicMagick
- * %s will be replaced with the source path, %d with the destination
- * %w and %h will be replaced with the width and height
- *
- * An example is provided for GraphicMagick
- * Leave as false to skip this
+ * Array of namespaces to generate a Google sitemap for when the
+ * maintenance/generateSitemap.php script is run, or false if one is to be ge-
+ * nerated for all namespaces.
*/
-#$wgCustomConvertCommand = "gm convert %s -resize %wx%h %d"
-$wgCustomConvertCommand = false;
+$wgSitemapNamespaces = false;
-# Scalable Vector Graphics (SVG) may be uploaded as images.
-# Since SVG support is not yet standard in browsers, it is
-# necessary to rasterize SVGs to PNG as a fallback format.
-#
-# An external program is required to perform this conversion:
-$wgSVGConverters = array(
- 'ImageMagick' => '$path/convert -background white -thumbnail $widthx$height\! $input PNG:$output',
- 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
- 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
- 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
- 'rsvg' => '$path/rsvg -w$width -h$height $input $output',
- 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
- );
-/** Pick one of the above */
-$wgSVGConverter = 'ImageMagick';
-/** If not in the executable PATH, specify */
-$wgSVGConverterPath = '';
-/** Don't scale a SVG larger than this */
-$wgSVGMaxSize = 2048;
-/**
- * Don't thumbnail an image if it will use too much working memory
- * Default is 50 MB if decompressed to RGBA form, which corresponds to
- * 12.5 million pixels or 3500x3500
+/** @} */ # end of search settings
+
+/************************************************************************//**
+ * @name Edit user interface
+ * @{
*/
-$wgMaxImageArea = 1.25e7;
+
/**
- * Force thumbnailing of animated GIFs above this size to a single
- * frame instead of an animated thumbnail. ImageMagick seems to
- * get real unhappy and doesn't play well with resource limits. :P
- * Defaulting to 1 megapixel (1000x1000)
+ * Path to the GNU diff3 utility. If the file doesn't exist, edit conflicts will
+ * fall back to the old behaviour (no merging).
*/
-$wgMaxAnimatedGifArea = 1.0e6;
+$wgDiff3 = '/usr/bin/diff3';
+
/**
- * Browsers don't support TIFF inline generally...
- * For inline display, we need to convert to PNG or JPEG.
- * Note scaling should work with ImageMagick, but may not with GD scaling.
- * // PNG is lossless, but inefficient for photos
- * $wgTiffThumbnailType = array( 'png', 'image/png' );
- * // JPEG is good for photos, but has no transparency support. Bad for diagrams.
- * $wgTiffThumbnailType = array( 'jpg', 'image/jpeg' );
+ * Path to the GNU diff utility.
*/
- $wgTiffThumbnailType = false;
+$wgDiff = '/usr/bin/diff';
/**
- * If rendered thumbnail files are older than this timestamp, they
- * will be rerendered on demand as if the file didn't already exist.
- * Update if there is some need to force thumbs and SVG rasterizations
- * to rerender, such as fixes to rendering bugs.
+ * Which namespaces have special treatment where they should be preview-on-open
+ * Internaly only Category: pages apply, but using this extensions (e.g. Semantic MediaWiki)
+ * can specify namespaces of pages they have special treatment for
*/
-$wgThumbnailEpoch = '20030516000000';
+$wgPreviewOnOpenNamespaces = array(
+ NS_CATEGORY => true
+);
/**
- * If set, inline scaled images will still produce <img> tags ready for
- * output instead of showing an error message.
- *
- * This may be useful if errors are transitory, especially if the site
- * is configured to automatically render thumbnails on request.
- *
- * On the other hand, it may obscure error conditions from debugging.
- * Enable the debug log or the 'thumbnail' log group to make sure errors
- * are logged to a file for review.
+ * Activate external editor interface for files and pages
+ * See http://www.mediawiki.org/wiki/Manual:External_editors
*/
-$wgIgnoreImageErrors = false;
+$wgUseExternalEditor = true;
+
+/** Go button goes straight to the edit screen if the article doesn't exist. */
+$wgGoToEdit = false;
/**
- * Allow thumbnail rendering on page view. If this is false, a valid
- * thumbnail URL is still output, but no file will be created at
- * the target location. This may save some time if you have a
- * thumb.php or 404 handler set up which is faster than the regular
- * webserver(s).
+ * Enable the UniversalEditButton for browsers that support it
+ * (currently only Firefox with an extension)
+ * See http://universaleditbutton.org for more background information
*/
-$wgGenerateThumbnailOnParse = true;
+$wgUniversalEditButton = true;
/**
-* Show thumbnails for old images on the image description page
-*/
-$wgShowArchiveThumbnails = true;
+ * If user doesn't specify any edit summary when making a an edit, MediaWiki
+ * will try to automatically create one. This feature can be disabled by set-
+ * ting this variable false.
+ */
+$wgUseAutomaticEditSummaries = true;
-/** Obsolete, always true, kept for compatibility with extensions */
-$wgUseImageResize = true;
+/** @} */ # end edit UI }
+/************************************************************************//**
+ * @name Maintenance
+ * See also $wgSiteNotice
+ * @{
+ */
-/** Set $wgCommandLineMode if it's not set already, to avoid notices */
+/**
+ * @cond file_level_code
+ * Set $wgCommandLineMode if it's not set already, to avoid notices
+ */
if( !isset( $wgCommandLineMode ) ) {
$wgCommandLineMode = false;
}
+/** @endcond */
/** For colorized maintenance script output, is your terminal background dark ? */
$wgCommandLineDarkBg = false;
@@ -2421,12 +4161,42 @@ $wgCommandLineDarkBg = false;
*/
$wgMaintenanceScripts = array();
-#
-# Recent changes settings
-#
+/**
+ * Set this to a string to put the wiki into read-only mode. The text will be
+ * used as an explanation to users.
+ *
+ * This prevents most write operations via the web interface. Cache updates may
+ * still be possible. To prevent database writes completely, use the read_only
+ * option in MySQL.
+ */
+$wgReadOnly = null;
-/** Log IP addresses in the recentchanges table; can be accessed only by extensions (e.g. CheckUser) or a DB admin */
-$wgPutIPinRC = true;
+/**
+ * If this lock file exists (size > 0), the wiki will be forced into read-only mode.
+ * Its contents will be shown to users as part of the read-only warning
+ * message.
+ *
+ * Defaults to "{$wgUploadDirectory}/lock_yBgMBwiR".
+ */
+$wgReadOnlyFile = false;
+
+/**
+ * When you run the web-based upgrade utility, it will tell you what to set
+ * this to in order to authorize the upgrade process. It will subsequently be
+ * used as a password, to authorize further upgrades.
+ *
+ * For security, do not set this to a guessable string. Use the value supplied
+ * by the install/upgrade process. To cause the upgrader to generate a new key,
+ * delete the old key from LocalSettings.php.
+ */
+$wgUpgradeKey = false;
+
+/** @} */ # End of maintenance }
+
+/************************************************************************//**
+ * @name Recent changes, new pages, watchlist and history
+ * @{
+ */
/**
* Recentchanges items are periodically purged; entries older than this many
@@ -2436,14 +4206,17 @@ $wgPutIPinRC = true;
$wgRCMaxAge = 13 * 7 * 24 * 3600;
/**
- * Filter $wgRCLinkDays by $wgRCMaxAge to avoid showing links for numbers higher than what will be stored.
- * Note that this is disabled by default because we sometimes do have RC data which is beyond the limit
- * for some reason, and some users may use the high numbers to display that data which is still there.
+ * Filter $wgRCLinkDays by $wgRCMaxAge to avoid showing links for numbers
+ * higher than what will be stored. Note that this is disabled by default
+ * because we sometimes do have RC data which is beyond the limit for some
+ * reason, and some users may use the high numbers to display that data which
+ * is still there.
*/
$wgRCFilterByAge = false;
/**
- * List of Days and Limits options to list in the Special:Recentchanges and Special:Recentchangeslinked pages.
+ * List of Days and Limits options to list in the Special:Recentchanges and
+ * Special:Recentchangeslinked pages.
*/
$wgRCLinkLimits = array( 50, 100, 250, 500 );
$wgRCLinkDays = array( 1, 3, 7, 14, 30 );
@@ -2486,9 +4259,88 @@ $wgRC2UDPOmitBots = false;
*/
$wgEnableNewpagesUserFilter = true;
-#
-# Copyright and credits settings
-#
+/** Use RC Patrolling to check for vandalism */
+$wgUseRCPatrol = true;
+
+/** Use new page patrolling to check new pages on Special:Newpages */
+$wgUseNPPatrol = true;
+
+/** Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages */
+$wgFeed = true;
+
+/** Set maximum number of results to return in syndication feeds (RSS, Atom) for
+ * eg Recentchanges, Newpages. */
+$wgFeedLimit = 50;
+
+/** _Minimum_ timeout for cached Recentchanges feed, in seconds.
+ * A cached version will continue to be served out even if changes
+ * are made, until this many seconds runs out since the last render.
+ *
+ * If set to 0, feed caching is disabled. Use this for debugging only;
+ * feed generation can be pretty slow with diffs.
+ */
+$wgFeedCacheTimeout = 60;
+
+/** When generating Recentchanges RSS/Atom feed, diffs will not be generated for
+ * pages larger than this size. */
+$wgFeedDiffCutoff = 32768;
+
+/** Override the site's default RSS/ATOM feed for recentchanges that appears on
+ * every page. Some sites might have a different feed they'd like to promote
+ * instead of the RC feed (maybe like a "Recent New Articles" or "Breaking news" one).
+ * Ex: $wgSiteFeed['format'] = "http://example.com/somefeed.xml"; Format can be one
+ * of either 'rss' or 'atom'.
+ */
+$wgOverrideSiteFeed = array();
+
+/**
+ * Which feed types should we provide by default? This can include 'rss',
+ * 'atom', neither, or both.
+ */
+$wgAdvertisedFeedTypes = array( 'atom' );
+
+/** Show watching users in recent changes, watchlist and page history views */
+$wgRCShowWatchingUsers = false; # UPO
+/** Show watching users in Page views */
+$wgPageShowWatchingUsers = false;
+/** Show the amount of changed characters in recent changes */
+$wgRCShowChangedSize = true;
+
+/**
+ * If the difference between the character counts of the text
+ * before and after the edit is below that value, the value will be
+ * highlighted on the RC page.
+ */
+$wgRCChangedSizeThreshold = 500;
+
+/**
+ * Show "Updated (since my last visit)" marker in RC view, watchlist and history
+ * view for watched pages with new changes */
+$wgShowUpdatedMarker = true;
+
+/**
+ * Disable links to talk pages of anonymous users (IPs) in listings on special
+ * pages like page history, Special:Recentchanges, etc.
+ */
+$wgDisableAnonTalk = false;
+
+/**
+ * Enable filtering of categories in Recentchanges
+ */
+$wgAllowCategorizedRecentChanges = false;
+
+/**
+ * Allow filtering by change tag in recentchanges, history, etc
+ * Has no effect if no tags are defined in valid_tag.
+ */
+$wgUseTagFilter = true;
+
+/** @} */ # end RC/watchlist }
+
+/************************************************************************//**
+ * @name Copyright and credits settings
+ * @{
+ */
/** RDF metadata toggles */
$wgEnableDublinCoreRdf = false;
@@ -2507,7 +4359,10 @@ $wgRightsIcon = null;
*/
$wgLicenseTerms = false;
-/** Set this to some HTML to override the rights icon with an arbitrary logo */
+/**
+ * Set this to some HTML to override the rights icon with an arbitrary logo
+ * @deprecated Use $wgFooterIcons['copyright']['copyright']
+ */
$wgCopyrightIcon = null;
/** Set this to true if you want detailed copyright information forms on Upload. */
@@ -2530,27 +4385,12 @@ $wgMaxCredits = 0;
* Otherwise, link to a separate credits page. */
$wgShowCreditsIfMax = true;
+/** @} */ # end of copyright and credits settings }
-
-/**
- * Set this to false to avoid forcing the first letter of links to capitals.
- * WARNING: may break links! This makes links COMPLETELY case-sensitive. Links
- * appearing with a capital at the beginning of a sentence will *not* go to the
- * same place as links in the middle of a sentence using a lowercase initial.
- */
-$wgCapitalLinks = true;
-
-/**
- * @since 1.16 - This can now be set per-namespace. Some special namespaces (such
- * as Special, see MWNamespace::$alwaysCapitalizedNamespaces for the full list) must be
- * true by default (and setting them has no effect), due to various things that
- * require them to be so. Also, since Talk namespaces need to directly mirror their
- * associated content namespaces, the values for those are ignored in favor of the
- * subject namespace's setting. Setting for NS_MEDIA is taken automatically from
- * NS_FILE.
- * EX: $wgCapitalLinkOverrides[ NS_FILE ] = false;
+/************************************************************************//**
+ * @name Import / Export
+ * @{
*/
-$wgCapitalLinkOverrides = array();
/**
* List of interwiki prefixes for wikis we'll accept as sources for
@@ -2608,199 +4448,11 @@ $wgExportMaxLinkDepth = 0;
*/
$wgExportFromNamespaces = false;
-/**
- * Edits matching these regular expressions in body text
- * will be recognised as spam and rejected automatically.
- *
- * There's no administrator override on-wiki, so be careful what you set. :)
- * May be an array of regexes or a single string for backwards compatibility.
- *
- * See http://en.wikipedia.org/wiki/Regular_expression
- * Note that each regex needs a beginning/end delimiter, eg: # or /
- */
-$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
- *
- * For a complete example, have a look at the SpamBlacklist extension.
- */
-$wgFilterCallback = false;
-
-/** Go button goes straight to the edit screen if the article doesn't exist. */
-$wgGoToEdit = false;
-
-/** Allow raw, unchecked HTML in <html>...</html> sections.
- * THIS IS VERY DANGEROUS on a publically editable site, so USE wgGroupPermissions
- * TO RESTRICT EDITING to only those that you trust
- */
-$wgRawHtml = false;
-
-/**
- * $wgUseTidy: use tidy to make sure HTML output is sane.
- * Tidy is a free tool that fixes broken HTML.
- * See http://www.w3.org/People/Raggett/tidy/
- * $wgTidyBin should be set to the path of the binary and
- * $wgTidyConf to the path of the configuration file.
- * $wgTidyOpts can include any number of parameters.
- *
- * $wgTidyInternal controls the use of the PECL extension to use an in-
- * process tidy library instead of spawning a separate program.
- * Normally you shouldn't need to override the setting except for
- * debugging. To install, use 'pear install tidy' and add a line
- * 'extension=tidy.so' to php.ini.
- */
-$wgUseTidy = false;
-$wgAlwaysUseTidy = false;
-$wgTidyBin = 'tidy';
-$wgTidyConf = $IP.'/includes/tidy.conf';
-$wgTidyOpts = '';
-$wgTidyInternal = extension_loaded( 'tidy' );
-
-/**
- * Put tidy warnings in HTML comments
- * Only works for internal tidy.
- */
-$wgDebugTidy = false;
-
-/**
- * Validate the overall output using tidy and refuse
- * to display the page if it's not valid.
- */
-$wgValidateAllHtml = false;
-
-/** See list of skins and their symbolic names in languages/Language.php */
-$wgDefaultSkin = 'monobook';
-
-/**
-* Should we allow the user's to select their own skin that will override the default?
-* @deprecated in 1.16, use $wgHiddenPrefs[] = 'skin' to disable it
-*/
-$wgAllowUserSkin = true;
-
-/**
- * Optionally, we can specify a stylesheet to use for media="handheld".
- * This is recognized by some, but not all, handheld/mobile/PDA browsers.
- * If left empty, compliant handheld browsers won't pick up the skin
- * stylesheet, which is specified for 'screen' media.
- *
- * Can be a complete URL, base-relative path, or $wgStylePath-relative path.
- * Try 'chick/main.css' to apply the Chick styles to the MonoBook HTML.
- *
- * Will also be switched in when 'handheld=yes' is added to the URL, like
- * the 'printable=yes' mode for print media.
- */
-$wgHandheldStyle = false;
-
-/**
- * If set, 'screen' and 'handheld' media specifiers for stylesheets are
- * transformed such that they apply to the iPhone/iPod Touch Mobile Safari,
- * which doesn't recognize 'handheld' but does support media queries on its
- * screen size.
- *
- * Consider only using this if you have a *really good* handheld stylesheet,
- * as iPhone users won't have any way to disable it and use the "grown-up"
- * styles instead.
- */
-$wgHandheldForIPhone = false;
-
-/**
- * Settings added to this array will override the default globals for the user
- * preferences used by anonymous visitors and newly created accounts.
- * For instance, to disable section editing links:
- * $wgDefaultUserOptions ['editsection'] = 0;
- *
- */
-$wgDefaultUserOptions = array(
- 'quickbar' => 1,
- 'underline' => 2,
- 'cols' => 80,
- 'rows' => 25,
- 'searchlimit' => 20,
- 'contextlines' => 5,
- 'contextchars' => 50,
- 'disablesuggest' => 0,
- 'skin' => false,
- 'math' => 1,
- 'usenewrc' => 0,
- 'rcdays' => 7,
- 'rclimit' => 50,
- 'wllimit' => 250,
- 'hideminor' => 0,
- 'hidepatrolled' => 0,
- 'newpageshidepatrolled' => 0,
- 'highlightbroken' => 1,
- 'stubthreshold' => 0,
- 'previewontop' => 1,
- 'previewonfirst' => 0,
- 'editsection' => 1,
- 'editsectiononrightclick' => 0,
- 'editondblclick' => 0,
- 'editwidth' => 0,
- 'showtoc' => 1,
- 'showtoolbar' => 1,
- 'minordefault' => 0,
- 'date' => 'default',
- 'imagesize' => 2,
- 'thumbsize' => 2,
- 'rememberpassword' => 0,
- 'nocache' => 0,
- 'diffonly' => 0,
- 'showhiddencats' => 0,
- 'norollbackdiff' => 0,
- 'enotifwatchlistpages' => 0,
- 'enotifusertalkpages' => 1,
- 'enotifminoredits' => 0,
- 'enotifrevealaddr' => 0,
- 'shownumberswatching' => 1,
- 'fancysig' => 0,
- 'externaleditor' => 0,
- 'externaldiff' => 0,
- 'forceeditsummary' => 0,
- 'showjumplinks' => 1,
- 'justify' => 0,
- 'numberheadings' => 0,
- 'uselivepreview' => 0,
- 'watchlistdays' => 3.0,
- 'extendwatchlist' => 0,
- 'watchlisthideminor' => 0,
- 'watchlisthidebots' => 0,
- 'watchlisthideown' => 0,
- 'watchlisthideanons' => 0,
- 'watchlisthideliu' => 0,
- 'watchlisthidepatrolled' => 0,
- 'watchcreations' => 0,
- 'watchdefault' => 0,
- 'watchmoves' => 0,
- 'watchdeletion' => 0,
- 'noconvertlink' => 0,
- 'gender' => 'unknown',
- 'ccmeonemails' => 0,
- 'disablemail' => 0,
- 'editfont' => 'default',
-);
-
-/**
- * Whether or not to allow and use real name fields.
- * @deprecated in 1.16, use $wgHiddenPrefs[] = 'realname' below to disable real
- * names
- */
-$wgAllowRealName = true;
-
-/** An array of preferences to not show for the user */
-$wgHiddenPrefs = array();
+/** @} */ # end of import/export }
-/*****************************************************************************
- * Extensions
+/*************************************************************************//**
+ * @name Extensions
+ * @{
*/
/**
@@ -2892,157 +4544,78 @@ $wgAutoloadClasses = array();
* 'descriptionmsg' => array( 'exampleextension-desc', param1, param2, ... ),
*/
$wgExtensionCredits = array();
-/*
- * end extensions
- ******************************************************************************/
/**
- * Allow user Javascript page?
- * This enables a lot of neat customizations, but may
- * increase security risk to users and server load.
+ * Authentication plugin.
*/
-$wgAllowUserJs = false;
+$wgAuth = null;
/**
- * Allow user Cascading Style Sheets (CSS)?
- * This enables a lot of neat customizations, but may
- * increase security risk to users and server load.
+ * Global list of hooks.
+ * Add a hook by doing:
+ * $wgHooks['event_name'][] = $function;
+ * or:
+ * $wgHooks['event_name'][] = array($function, $data);
+ * or:
+ * $wgHooks['event_name'][] = array($object, 'method');
*/
-$wgAllowUserCss = false;
-
-/** Use the site's Javascript page? */
-$wgUseSiteJs = true;
-
-/** Use the site's Cascading Style Sheets (CSS)? */
-$wgUseSiteCss = true;
+$wgHooks = array();
/**
- * Filter for Special:Randompage. Part of a WHERE clause
- * @deprecated as of 1.16, use the SpecialRandomGetRandomTitle hook
-*/
-
-$wgExtraRandompageSQL = false;
-
-/** Allow the "info" action, very inefficient at the moment */
-$wgAllowPageInfo = false;
-
-/** Maximum indent level of toc. */
-$wgMaxTocLevel = 999;
-
-/** Name of the external diff engine to use */
-$wgExternalDiffEngine = false;
-
-/** Use RC Patrolling to check for vandalism */
-$wgUseRCPatrol = true;
-
-/** Use new page patrolling to check new pages on Special:Newpages */
-$wgUseNPPatrol = true;
-
-/** Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages */
-$wgFeed = true;
-
-/** Set maximum number of results to return in syndication feeds (RSS, Atom) for
- * eg Recentchanges, Newpages. */
-$wgFeedLimit = 50;
-
-/** _Minimum_ timeout for cached Recentchanges feed, in seconds.
- * A cached version will continue to be served out even if changes
- * are made, until this many seconds runs out since the last render.
- *
- * If set to 0, feed caching is disabled. Use this for debugging only;
- * feed generation can be pretty slow with diffs.
- */
-$wgFeedCacheTimeout = 60;
-
-/** When generating Recentchanges RSS/Atom feed, diffs will not be generated for
- * pages larger than this size. */
-$wgFeedDiffCutoff = 32768;
-
-/** Override the site's default RSS/ATOM feed for recentchanges that appears on
- * every page. Some sites might have a different feed they'd like to promote
- * instead of the RC feed (maybe like a "Recent New Articles" or "Breaking news" one).
- * Ex: $wgSiteFeed['format'] = "http://example.com/somefeed.xml"; Format can be one
- * of either 'rss' or 'atom'.
+ * Maps jobs to their handling classes; extensions
+ * can add to this to provide custom jobs
*/
-$wgOverrideSiteFeed = array();
+$wgJobClasses = array(
+ 'refreshLinks' => 'RefreshLinksJob',
+ 'refreshLinks2' => 'RefreshLinksJob2',
+ 'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
+ 'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
+ 'sendMail' => 'EmaillingJob',
+ 'enotifNotify' => 'EnotifNotifyJob',
+ 'fixDoubleRedirect' => 'DoubleRedirectJob',
+ 'uploadFromUrl' => 'UploadFromUrlJob',
+);
/**
- * Which feed types should we provide by default? This can include 'rss',
- * 'atom', neither, or both.
+ * Additional functions to be performed with updateSpecialPages.
+ * Expensive Querypages are already updated.
*/
-$wgAdvertisedFeedTypes = array( 'atom' );
+$wgSpecialPageCacheUpdates = array(
+ 'Statistics' => array('SiteStatsUpdate','cacheUpdate')
+);
/**
- * Additional namespaces. If the namespaces defined in Language.php and
- * Namespace.php are insufficient, you can create new ones here, for example,
- * to import Help files in other languages.
- * PLEASE NOTE: Once you delete a namespace, the pages in that namespace will
- * no longer be accessible. If you rename it, then you can access them through
- * the new namespace name.
- *
- * Custom namespaces should start at 100 to avoid conflicting with standard
- * namespaces, and should always follow the even/odd main/talk pattern.
+ * Hooks that are used for outputting exceptions. Format is:
+ * $wgExceptionHooks[] = $funcname
+ * or:
+ * $wgExceptionHooks[] = array( $class, $funcname )
+ * Hooks should return strings or false
*/
-#$wgExtraNamespaces =
-# array(100 => "Hilfe",
-# 101 => "Hilfe_Diskussion",
-# 102 => "Aide",
-# 103 => "Discussion_Aide"
-# );
-$wgExtraNamespaces = null;
+$wgExceptionHooks = array();
-/**
- * Namespace aliases
- * These are alternate names for the primary localised namespace names, which
- * are defined by $wgExtraNamespaces and the language file. If a page is
- * requested with such a prefix, the request will be redirected to the primary
- * name.
- *
- * Set this to a map from namespace names to IDs.
- * Example:
- * $wgNamespaceAliases = array(
- * 'Wikipedian' => NS_USER,
- * 'Help' => 100,
- * );
- */
-$wgNamespaceAliases = array();
/**
- * Limit images on image description pages to a user-selectable limit. In order
- * to reduce disk usage, limits can only be selected from a list.
- * The user preference is saved as an array offset in the database, by default
- * the offset is set with $wgDefaultUserOptions['imagesize']. Make sure you
- * change it if you alter the array (see bug 8858).
- * This is the list of settings the user can choose from:
+ * Page property link table invalidation lists. When a page property
+ * changes, this may require other link tables to be updated (eg
+ * adding __HIDDENCAT__ means the hiddencat tracking category will
+ * have been added, so the categorylinks table needs to be rebuilt).
+ * This array can be added to by extensions.
*/
-$wgImageLimits = array (
- array(320,240),
- array(640,480),
- array(800,600),
- array(1024,768),
- array(1280,1024),
- array(10000,10000) );
+$wgPagePropLinkInvalidations = array(
+ 'hiddencat' => 'categorylinks',
+);
-/**
- * Adjust thumbnails on image pages according to a user setting. In order to
- * reduce disk usage, the values can only be selected from a list. This is the
- * list of settings the user can choose from:
+/** @} */ # End extensions }
+
+/*************************************************************************//**
+ * @name Categories
+ * @{
*/
-$wgThumbLimits = array(
- 120,
- 150,
- 180,
- 200,
- 250,
- 300
-);
/**
- * Adjust width of upright images when parameter 'upright' is used
- * This allows a nicer look for upright images without the need to fix the width
- * by hardcoded px in wiki sourcecode.
+ * Use experimental, DMOZ-like category browser
*/
-$wgThumbUpright = 0.75;
+$wgUseCategoryBrowser = false;
/**
* On category pages, show thumbnail gallery for images belonging to that
@@ -3056,123 +4629,33 @@ $wgCategoryMagicGallery = true;
$wgCategoryPagingLimit = 200;
/**
- * Should the default category sortkey be the prefixed title?
- * Run maintenance/refreshLinks.php after changing this.
- */
-$wgCategoryPrefixedDefaultSortkey = true;
-
-/**
- * Browser Blacklist for unicode non compliant browsers
- * Contains a list of regexps : "/regexp/" matching problematic browsers
- */
-$wgBrowserBlackList = array(
- /**
- * Netscape 2-4 detection
- * The minor version may contain strings such as "Gold" or "SGoldC-SGI"
- * Lots of non-netscape user agents have "compatible", so it's useful to check for that
- * with a negative assertion. The [UIN] identifier specifies the level of security
- * in a Netscape/Mozilla browser, checking for it rules out a number of fakers.
- * The language string is unreliable, it is missing on NS4 Mac.
- *
- * Reference: http://www.psychedelix.com/agents/index.shtml
- */
- '/^Mozilla\/2\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
- '/^Mozilla\/3\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
- '/^Mozilla\/4\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
-
- /**
- * MSIE on Mac OS 9 is teh sux0r, converts þ to <thorn>, ð to <eth>, Þ to <THORN> and à to <ETH>
- *
- * Known useragents:
- * - Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
- * - Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC)
- * - Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)
- * - [...]
- *
- * @link http://en.wikipedia.org/w/index.php?title=User%3A%C6var_Arnfj%F6r%F0_Bjarmason%2Ftestme&diff=12356041&oldid=12355864
- * @link http://en.wikipedia.org/wiki/Template%3AOS9
- */
- '/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
-
- /**
- * Google wireless transcoder, seems to eat a lot of chars alive
- * http://it.wikipedia.org/w/index.php?title=Luciano_Ligabue&diff=prev&oldid=8857361
- */
- '/^Mozilla\/4\.0 \(compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;\)/'
-);
-
-/**
- * Fake out the timezone that the server thinks it's in. This will be used for
- * date display and not for what's stored in the DB. Leave to null to retain
- * your server's OS-based timezone value.
+ * Specify how category names should be sorted, when listed on a category page.
+ * A sorting scheme is also known as a collation.
*
- * This variable is currently used only for signature formatting and for local
- * time/date parser variables ({{LOCALTIME}} etc.)
+ * Available values are:
*
- * Timezones can be translated by editing MediaWiki messages of type
- * timezone-nameinlowercase like timezone-utc.
- */
-# $wgLocaltimezone = 'GMT';
-# $wgLocaltimezone = 'PST8PDT';
-# $wgLocaltimezone = 'Europe/Sweden';
-# $wgLocaltimezone = 'CET';
-$wgLocaltimezone = null;
-
-/**
- * Set an offset from UTC in minutes to use for the default timezone setting
- * for anonymous users and new user accounts.
- *
- * This setting is used for most date/time displays in the software, and is
- * overrideable in user preferences. It is *not* used for signature timestamps.
+ * - uppercase: Converts the category name to upper case, and sorts by that.
*
- * You can set it to match the configured server timezone like this:
- * $wgLocalTZoffset = date("Z") / 60;
+ * - uca-default: Provides access to the Unicode Collation Algorithm with
+ * the default element table. This is a compromise collation which sorts
+ * all languages in a mediocre way. However, it is better than "uppercase".
*
- * If your server is not configured for the timezone you want, you can set
- * this in conjunction with the signature timezone and override the PHP default
- * timezone like so:
- * $wgLocaltimezone="Europe/Berlin";
- * date_default_timezone_set( $wgLocaltimezone );
- * $wgLocalTZoffset = date("Z") / 60;
- *
- * Leave at NULL to show times in universal time (UTC/GMT).
- */
-$wgLocalTZoffset = null;
-
-
-/**
- * When translating messages with wfMsg(), it is not always clear what should
- * be considered UI messages and what should be content messages.
- *
- * For example, for the English Wikipedia, there should be only one 'mainpage',
- * so when getting the link for 'mainpage', we should treat it as site content
- * and call wfMsgForContent(), but for rendering the text of the link, we call
- * wfMsg(). The code behaves this way by default. However, sites like the
- * Wikimedia Commons do offer different versions of 'mainpage' and the like for
- * different languages. This array provides a way to override the default
- * behavior. For example, to allow language-specific main page and community
- * portal, set
+ * To use the uca-default collation, you must have PHP's intl extension
+ * installed. See http://php.net/manual/en/intl.setup.php . The details of the
+ * resulting collation will depend on the version of ICU installed on the
+ * server.
*
- * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
+ * After you change this, you must run maintenance/updateCollation.php to fix
+ * the sort keys in the database.
*/
-$wgForceUIMsgAsContentMsg = array();
+$wgCategoryCollation = 'uppercase';
+/** @} */ # End categories }
-/**
- * Authentication plugin.
+/*************************************************************************//**
+ * @name Logging
+ * @{
*/
-$wgAuth = null;
-
-/**
- * Global list of hooks.
- * Add a hook by doing:
- * $wgHooks['event_name'][] = $function;
- * or:
- * $wgHooks['event_name'][] = array($function, $data);
- * or:
- * $wgHooks['event_name'][] = array($object, 'method');
- */
-$wgHooks = array();
/**
* The logging system has two levels: an event type, which describes the
@@ -3283,6 +4766,7 @@ $wgLogActions = array(
'protect/unprotect' => 'unprotectedarticle',
'protect/move_prot' => 'movedarticleprotection',
'rights/rights' => 'rightslogentry',
+ 'rights/disable' => 'disableaccount-logentry',
'delete/delete' => 'deletedarticle',
'delete/restore' => 'undeletedarticle',
'delete/revision' => 'revdelete-logentry',
@@ -3299,13 +4783,15 @@ $wgLogActions = array(
'suppress/file' => 'revdelete-logentry',
'suppress/event' => 'logdelete-logentry',
'suppress/delete' => 'suppressedarticle',
- 'suppress/block' => 'blocklogentry',
+ 'suppress/block' => 'blocklogentry',
'suppress/reblock' => 'reblock-logentry',
+ 'patrol/patrol' => 'patrol-log-line',
);
/**
* The same as above, but here values are names of functions,
- * not messages
+ * not messages.
+ * @see LogPage::actionText
*/
$wgLogActionsHandlers = array();
@@ -3315,6 +4801,29 @@ $wgLogActionsHandlers = array();
$wgNewUserLog = true;
/**
+ * Log the automatic creations of new users accounts?
+ */
+$wgLogAutocreatedAccounts = false;
+
+/** @} */ # end logging }
+
+/*************************************************************************//**
+ * @name Special pages (general and miscellaneous)
+ * @{
+ */
+
+/**
+ * Allow special page inclusions such as {{Special:Allpages}}
+ */
+$wgAllowSpecialInclusion = true;
+
+/**
+ * Set this to an array of special page names to prevent
+ * maintenance/updateSpecialPages.php from updating those pages.
+ */
+$wgDisableQueryPageUpdate = false;
+
+/**
* List of special pages, followed by what subtitle they should go under
* at Special:SpecialPages
*/
@@ -3396,6 +4905,7 @@ $wgSpecialPageGroups = array(
'Search' => 'redirects',
'LinkSearch' => 'redirects',
+ 'ComparePages' => 'pagetools',
'Movepage' => 'pagetools',
'MergeHistory' => 'pagetools',
'Revisiondelete' => 'pagetools',
@@ -3416,56 +4926,35 @@ $wgSpecialPageGroups = array(
'Booksources' => 'other',
);
-/**
- * Disable the internal MySQL-based search, to allow it to be
- * implemented by an extension instead.
- */
-$wgDisableInternalSearch = false;
+/** Whether or not to sort special pages in Special:Specialpages */
-/**
- * Set this to a URL to forward search requests to some external location.
- * If the URL includes '$1', this will be replaced with the URL-encoded
- * search term.
- *
- * For example, to forward to Google you'd have something like:
- * $wgSearchForwardUrl = 'http://www.google.com/search?q=$1' .
- * '&domains=http://example.com' .
- * '&sitesearch=http://example.com' .
- * '&ie=utf-8&oe=utf-8';
- */
-$wgSearchForwardUrl = null;
+$wgSortSpecialPages = true;
/**
- * Set a default target for external links, e.g. _blank to pop up a new window
+ * Filter for Special:Randompage. Part of a WHERE clause
+ * @deprecated as of 1.16, use the SpecialRandomGetRandomTitle hook
*/
-$wgExternalLinkTarget = false;
+$wgExtraRandompageSQL = false;
/**
- * If true, external URL links in wiki text will be given the
- * rel="nofollow" attribute as a hint to search engines that
- * they should not be followed for ranking purposes as they
- * are user-supplied and thus subject to spamming.
+ * On Special:Unusedimages, consider images "used", if they are put
+ * into a category. Default (false) is not to count those as used.
*/
-$wgNoFollowLinks = true;
+$wgCountCategorizedImagesAsUsed = false;
/**
- * Namespaces in which $wgNoFollowLinks doesn't apply.
- * See Language.php for a list of namespaces.
+ * Maximum number of links to a redirect page listed on
+ * Special:Whatlinkshere/RedirectDestination
*/
-$wgNoFollowNsExceptions = array();
+$wgMaxRedirectLinksRetrieved = 500;
-/**
- * If this is set to an array of domains, external links to these domain names
- * (or any subdomains) will not be set to rel="nofollow" regardless of the
- * value of $wgNoFollowLinks. For instance:
- *
- * $wgNoFollowDomainExceptions = array( 'en.wikipedia.org', 'wiktionary.org' );
- *
- * This would add rel="nofollow" to links to de.wikipedia.org, but not
- * en.wikipedia.org, wiktionary.org, en.wiktionary.org, us.en.wikipedia.org,
- * etc.
+/** @} */ # end special pages }
+
+/*************************************************************************//**
+ * @name Robot (search engine crawler) policy
+ * See also $wgNoFollowLinks.
+ * @{
*/
-$wgNoFollowDomainExceptions = array();
/**
* Default robot policy. The default policy is to encourage indexing and fol-
@@ -3516,251 +5005,76 @@ $wgArticleRobotPolicies = array();
*/
$wgExemptFromUserRobotsControl = null;
-/**
- * Specifies the minimal length of a user password. If set to 0, empty pass-
- * words are allowed.
- */
-$wgMinimalPasswordLength = 1;
-
-/**
- * Activate external editor interface for files and pages
- * See http://www.mediawiki.org/wiki/Manual:External_editors
- */
-$wgUseExternalEditor = true;
-
-/** Whether or not to sort special pages in Special:Specialpages */
-
-$wgSortSpecialPages = true;
-
-/**
- * Specify the name of a skin that should not be presented in the list of a-
- * vailable skins. Use for blacklisting a skin which you do not want to remove
- * from the .../skins/ directory
- */
-$wgSkipSkin = '';
-$wgSkipSkins = array(); # More of the same
-
-/**
- * Array of disabled article actions, e.g. view, edit, dublincore, delete, etc.
- */
-$wgDisabledActions = array();
-
-/**
- * Disable redirects to special pages and interwiki redirects, which use a 302
- * and have no "redirected from" link.
- */
-$wgDisableHardRedirects = false;
-
-/**
- * Set to false to disable application of access keys and tooltips,
- * eg to avoid keyboard conflicts with system keys or as a low-level
- * optimization.
- */
-$wgEnableTooltipsAndAccesskeys = true;
-
-/**
- * Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open proxies
- * @since 1.16
- */
-$wgEnableDnsBlacklist = false;
-
-/**
- * @deprecated Use $wgEnableDnsBlacklist instead, only kept for backward
- * compatibility
- */
-$wgEnableSorbs = false;
-
-/**
- * List of DNS blacklists to use, if $wgEnableDnsBlacklist is true
- * @since 1.16
- */
-$wgDnsBlacklistUrls = array( 'http.dnsbl.sorbs.net.' );
-
-/**
- * @deprecated Use $wgDnsBlacklistUrls instead, only kept for backward
- * compatibility
- */
-$wgSorbsUrl = array();
-
-/**
- * Proxy whitelist, list of addresses that are assumed to be non-proxy despite
- * what the other methods might say.
- */
-$wgProxyWhitelist = array();
-
-/**
- * Simple rate limiter options to brake edit floods. Maximum number actions
- * allowed in the given number of seconds; after that the violating client re-
- * ceives HTTP 500 error pages until the period elapses.
- *
- * array( 4, 60 ) for a maximum of 4 hits in 60 seconds.
- *
- * This option set is experimental and likely to change. Requires memcached.
- */
-$wgRateLimits = array(
- 'edit' => array(
- 'anon' => null, // for any and all anonymous edits (aggregate)
- 'user' => null, // for each logged-in user
- 'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
- 'ip' => null, // for each anon and recent account
- 'subnet' => null, // ... with final octet removed
- ),
- 'move' => array(
- 'user' => null,
- 'newbie' => null,
- 'ip' => null,
- 'subnet' => null,
- ),
- 'mailpassword' => array(
- 'anon' => null,
- ),
- 'emailuser' => array(
- 'user' => null,
- ),
- );
-
-/**
- * Set to a filename to log rate limiter hits.
- */
-$wgRateLimitLog = null;
-
-/**
- * Array of groups which should never trigger the rate limiter
- *
- * @deprecated as of 1.13.0, the preferred method is using
- * $wgGroupPermissions[]['noratelimit']. However, this will still
- * work if desired.
- *
- * $wgRateLimitsExcludedGroups = array( 'sysop', 'bureaucrat' );
- */
-$wgRateLimitsExcludedGroups = array();
-
-/**
- * Array of IPs which should be excluded from rate limits.
- * This may be useful for whitelisting NAT gateways for conferences, etc.
- */
-$wgRateLimitsExcludedIPs = array();
+/** @} */ # End robot policy }
-/**
- * On Special:Unusedimages, consider images "used", if they are put
- * into a category. Default (false) is not to count those as used.
+/************************************************************************//**
+ * @name AJAX and API
+ * Note: The AJAX entry point which this section refers to is gradually being
+ * replaced by the API entry point, api.php. They are essentially equivalent.
+ * Both of them are used for dynamic client-side features, via XHR.
+ * @{
*/
-$wgCountCategorizedImagesAsUsed = false;
-
-/**
- * External stores allow including content
- * from non database sources following URL links
- *
- * Short names of ExternalStore classes may be specified in an array here:
- * $wgExternalStores = array("http","file","custom")...
- *
- * CAUTION: Access to database might lead to code execution
- */
-$wgExternalStores = false;
-
-/**
- * An array of external mysql servers, e.g.
- * $wgExternalServers = array( 'cluster1' => array( 'srv28', 'srv29', 'srv30' ) );
- * Used by LBFactory_Simple, may be ignored if $wgLBFactoryConf is set to another class.
- */
-$wgExternalServers = array();
-
-/**
- * The place to put new revisions, false to put them in the local text table.
- * Part of a URL, e.g. DB://cluster1
- *
- * Can be an array instead of a single string, to enable data distribution. Keys
- * must be consecutive integers, starting at zero. Example:
- *
- * $wgDefaultExternalStore = array( 'DB://cluster1', 'DB://cluster2' );
- *
- */
-$wgDefaultExternalStore = false;
-
-/**
- * Revision text may be cached in $wgMemc to reduce load on external storage
- * servers and object extraction overhead for frequently-loaded revisions.
- *
- * Set to 0 to disable, or number of seconds before cache expiry.
- */
-$wgRevisionCacheExpiry = 0;
/**
- * list of trusted media-types and mime types.
- * Use the MEDIATYPE_xxx constants to represent media types.
- * This list is used by Image::isSafeFile
+ * Enable the MediaWiki API for convenient access to
+ * machine-readable data via api.php
*
- * Types not listed here will have a warning about unsafe content
- * displayed on the images description page. It would also be possible
- * to use this for further restrictions, like disabling direct
- * [[media:...]] links for non-trusted formats.
- */
-$wgTrustedMediaFormats= array(
- MEDIATYPE_BITMAP, //all bitmap formats
- MEDIATYPE_AUDIO, //all audio formats
- MEDIATYPE_VIDEO, //all plain video formats
- "image/svg+xml", //svg (only needed if inline rendering of svg is not supported)
- "application/pdf", //PDF files
- #"application/x-shockwave-flash", //flash/shockwave movie
-);
-
-/**
- * Allow special page inclusions such as {{Special:Allpages}}
- */
-$wgAllowSpecialInclusion = true;
-
-/**
- * Timeout for HTTP requests done internally
+ * See http://www.mediawiki.org/wiki/API
*/
-$wgHTTPTimeout = 25;
+$wgEnableAPI = true;
/**
- * Timeout for Asynchronous (background) HTTP requests
+ * Allow the API to be used to perform write operations
+ * (page edits, rollback, etc.) when an authorised user
+ * accesses it
*/
-$wgAsyncHTTPTimeout = 25;
+$wgEnableWriteAPI = true;
/**
- * Proxy to use for CURL requests.
+ * API module extensions
+ * Associative array mapping module name to class name.
+ * Extension modules may override the core modules.
*/
-$wgHTTPProxy = false;
+$wgAPIModules = array();
+$wgAPIMetaModules = array();
+$wgAPIPropModules = array();
+$wgAPIListModules = array();
/**
- * Enable interwiki transcluding. Only when iw_trans=1.
- */
-$wgEnableScaryTranscluding = false;
-/**
- * Expiry time for interwiki transclusion
+ * Maximum amount of rows to scan in a DB query in the API
+ * The default value is generally fine
*/
-$wgTranscludeCacheExpiry = 3600;
+$wgAPIMaxDBRows = 5000;
/**
- * Support blog-style "trackbacks" for articles. See
- * http://www.sixapart.com/pronet/docs/trackback_spec for details.
+ * The maximum size (in bytes) of an API result.
+ * Don't set this lower than $wgMaxArticleSize*1024
*/
-$wgUseTrackbacks = false;
+$wgAPIMaxResultSize = 8388608;
/**
- * Enable filtering of categories in Recentchanges
+ * The maximum number of uncached diffs that can be retrieved in one API
+ * request. Set this to 0 to disable API diffs altogether
*/
-$wgAllowCategorizedRecentChanges = false ;
+$wgAPIMaxUncachedDiffs = 1;
/**
- * Number of jobs to perform per request. May be less than one in which case
- * jobs are performed probabalistically. If this is zero, jobs will not be done
- * during ordinary apache requests. In this case, maintenance/runJobs.php should
- * be run periodically.
+ * Log file or URL (TCP or UDP) to log API requests to, or false to disable
+ * API request logging
*/
-$wgJobRunRate = 1;
+$wgAPIRequestLog = false;
/**
- * Number of rows to update per job
+ * Cache the API help text for up to an hour. Disable this during API
+ * debugging and development
*/
-$wgUpdateRowsPerJob = 500;
+$wgAPICacheHelp = true;
/**
- * Number of rows to update per query
+ * Set the timeout for the API help text cache. Ignored if $wgAPICacheHelp
+ * is false.
*/
-$wgUpdateRowsPerQuery = 100;
+$wgAPICacheHelpTimeout = 60*60;
/**
* Enable AJAX framework
@@ -3771,7 +5085,7 @@ $wgUseAjax = true;
* List of Ajax-callable functions.
* Extensions acting as Ajax callbacks must register here
*/
-$wgAjaxExportList = array( 'wfAjaxGetThumbnailUrl', 'wfAjaxGetFileUrl' );
+$wgAjaxExportList = array( 'wfAjaxGetFileUrl' );
/**
* Enable watching/unwatching pages using AJAX.
@@ -3791,43 +5105,40 @@ $wgAjaxUploadDestCheck = true;
$wgAjaxLicensePreview = true;
/**
- * Allow DISPLAYTITLE to change title display
+ * Settings for incoming cross-site AJAX requests:
+ * Newer browsers support cross-site AJAX when the target resource allows requests
+ * from the origin domain by the Access-Control-Allow-Origin header.
+ * This is currently only used by the API (requests to api.php)
+ * $wgCrossSiteAJAXdomains can be set using a wildcard syntax:
+ *
+ * '*' matches any number of characters
+ * '?' matches any 1 character
+ *
+ * Example:
+ $wgCrossSiteAJAXdomains = array(
+ 'www.mediawiki.org',
+ '*.wikipedia.org',
+ '*.wikimedia.org',
+ '*.wiktionary.org',
+ );
+ *
*/
-$wgAllowDisplayTitle = true;
+$wgCrossSiteAJAXdomains = array();
/**
- * for consistency, restrict DISPLAYTITLE to titles that normalize to the same canonical DB key
+ * Domains that should not be allowed to make AJAX requests,
+ * even if they match one of the domains allowed by $wgCrossSiteAJAXdomains
+ * Uses the same syntax as $wgCrossSiteAJAXdomains
*/
-$wgRestrictDisplayTitle = true;
-/**
- * Array of usernames which may not be registered or logged in from
- * Maintenance scripts can still use these
- */
-$wgReservedUsernames = array(
- 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
- 'Conversion script', // Used for the old Wikipedia software upgrade
- 'Maintenance script', // Maintenance scripts which perform editing, image import script
- 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
- 'msg:double-redirect-fixer', // Automatic double redirect fix
-);
+$wgCrossSiteAJAXdomainExceptions = array();
-/**
- * MediaWiki will reject HTMLesque tags in uploaded files due to idiotic browsers which can't
- * perform basic stuff like MIME detection and which are vulnerable to further idiots uploading
- * crap files as images. When this directive is on, <title> will be allowed in files with
- * an "image/svg+xml" MIME type. You should leave this disabled if your web server is misconfigured
- * and doesn't send appropriate MIME types for SVG images.
- */
-$wgAllowTitlesInSVG = false;
+/** @} */ # End AJAX and API }
-/**
- * Array of namespaces which can be deemed to contain valid "content", as far
- * as the site statistics are concerned. Useful if additional namespaces also
- * contain "content" which should be considered when generating a count of the
- * number of articles in the wiki.
+/************************************************************************//**
+ * @name Shell and process control
+ * @{
*/
-$wgContentNamespaces = array( NS_MAIN );
/**
* Maximum amount of virtual memory available to shell processes under linux, in KB.
@@ -3851,211 +5162,85 @@ $wgMaxShellTime = 180;
$wgPhpCli = '/usr/bin/php';
/**
- * DJVU settings
- * Path of the djvudump executable
- * Enable this and $wgDjvuRenderer to enable djvu rendering
- */
-# $wgDjvuDump = 'djvudump';
-$wgDjvuDump = null;
-
-/**
- * Path of the ddjvu DJVU renderer
- * Enable this and $wgDjvuDump to enable djvu rendering
- */
-# $wgDjvuRenderer = 'ddjvu';
-$wgDjvuRenderer = null;
-
-/**
- * Path of the djvutxt DJVU text extraction utility
- * Enable this and $wgDjvuDump to enable text layer extraction from djvu files
- */
-# $wgDjvuTxt = 'djvutxt';
-$wgDjvuTxt = null;
-
-/**
- * Path of the djvutoxml executable
- * This works like djvudump except much, much slower as of version 3.5.
- *
- * For now I recommend you use djvudump instead. The djvuxml output is
- * probably more stable, so we'll switch back to it as soon as they fix
- * the efficiency problem.
- * http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
- */
-# $wgDjvuToXML = 'djvutoxml';
-$wgDjvuToXML = null;
-
-
-/**
- * Shell command for the DJVU post processor
- * Default: pnmtopng, since ddjvu generates ppm output
- * Set this to false to output the ppm file directly.
- */
-$wgDjvuPostProcessor = 'pnmtojpeg';
-/**
- * File extension for the DJVU post processor output
- */
-$wgDjvuOutputExtension = 'jpg';
-
-/**
- * Enable the MediaWiki API for convenient access to
- * machine-readable data via api.php
- *
- * See http://www.mediawiki.org/wiki/API
+ * Locale for LC_CTYPE, to work around http://bugs.php.net/bug.php?id=45132
+ * For Unix-like operating systems, set this to to a locale that has a UTF-8
+ * character set. Only the character set is relevant.
*/
-$wgEnableAPI = true;
+$wgShellLocale = 'en_US.utf8';
-/**
- * Allow the API to be used to perform write operations
- * (page edits, rollback, etc.) when an authorised user
- * accesses it
- */
-$wgEnableWriteAPI = true;
+/** @} */ # End shell }
-/**
- * API module extensions
- * Associative array mapping module name to class name.
- * Extension modules may override the core modules.
+/************************************************************************//**
+ * @name HTTP client
+ * @{
*/
-$wgAPIModules = array();
-$wgAPIMetaModules = array();
-$wgAPIPropModules = array();
-$wgAPIListModules = array();
/**
- * Maximum amount of rows to scan in a DB query in the API
- * The default value is generally fine
+ * Timeout for HTTP requests done internally
*/
-$wgAPIMaxDBRows = 5000;
+$wgHTTPTimeout = 25;
/**
- * The maximum size (in bytes) of an API result.
- * Don't set this lower than $wgMaxArticleSize*1024
+ * Timeout for Asynchronous (background) HTTP requests
*/
-$wgAPIMaxResultSize = 8388608;
+$wgAsyncHTTPTimeout = 25;
/**
- * The maximum number of uncached diffs that can be retrieved in one API
- * request. Set this to 0 to disable API diffs altogether
+ * Proxy to use for CURL requests.
*/
-$wgAPIMaxUncachedDiffs = 1;
+$wgHTTPProxy = false;
-/**
- * Log file or URL (TCP or UDP) to log API requests to, or false to disable
- * API request logging
- */
-$wgAPIRequestLog = false;
+/** @} */ # End HTTP client }
-/**
- * Cache the API help text for up to an hour. Disable this during API
- * debugging and development
+/************************************************************************//**
+ * @name Job queue
+ * See also $wgEnotifUseJobQ.
+ * @{
*/
-$wgAPICacheHelp = true;
/**
- * Set the timeout for the API help text cache. Ignored if $wgAPICacheHelp
- * is false.
+ * Number of jobs to perform per request. May be less than one in which case
+ * jobs are performed probabalistically. If this is zero, jobs will not be done
+ * during ordinary apache requests. In this case, maintenance/runJobs.php should
+ * be run periodically.
*/
-$wgAPICacheHelpTimeout = 60*60;
+$wgJobRunRate = 1;
/**
- * Parser test suite files to be run by parserTests.php when no specific
- * filename is passed to it.
- *
- * Extensions may add their own tests to this array, or site-local tests
- * may be added via LocalSettings.php
- *
- * Use full paths.
+ * Number of rows to update per job
*/
-$wgParserTestFiles = array(
- "$IP/maintenance/parserTests.txt",
-);
+$wgUpdateRowsPerJob = 500;
/**
- * If configured, specifies target CodeReview installation to send test
- * result data from 'parserTests.php --upload'
- *
- * Something like this:
- * $wgParserTestRemote = array(
- * 'api-url' => 'http://www.mediawiki.org/w/api.php',
- * 'repo' => 'MediaWiki',
- * 'suite' => 'ParserTests',
- * 'path' => '/trunk/phase3', // not used client-side; for reference
- * 'secret' => 'qmoicj3mc4mcklmqw', // Shared secret used in HMAC validation
- * );
+ * Number of rows to update per query
*/
-$wgParserTestRemote = false;
+$wgUpdateRowsPerQuery = 100;
-/**
- * Break out of framesets. This can be used to prevent clickjacking attacks,
- * or to prevent external sites from framing your site with ads.
- */
-$wgBreakFrames = false;
+/** @} */ # End job queue }
-/**
- * The X-Frame-Options header to send on pages sensitive to clickjacking
- * attacks, such as edit pages. This prevents those pages from being displayed
- * in a frame or iframe. The options are:
- *
- * - 'DENY': Do not allow framing. This is recommended for most wikis.
- *
- * - 'SAMEORIGIN': Allow framing by pages on the same domain. This can be used
- * to allow framing within a trusted domain. This is insecure if there
- * is a page on the same domain which allows framing of arbitrary URLs.
- *
- * - false: Allow all framing. This opens up the wiki to XSS attacks and thus
- * full compromise of local user accounts. Private wikis behind a
- * corporate firewall are especially vulnerable. This is not
- * recommended.
- *
- * For extra safety, set $wgBreakFrames = true, to prevent framing on all pages,
- * not just edit pages.
+/************************************************************************//**
+ * @name Miscellaneous
+ * @{
*/
-$wgEditPageFrameOptions = 'DENY';
-/**
- * Set this to an array of special page names to prevent
- * maintenance/updateSpecialPages.php from updating those pages.
- */
-$wgDisableQueryPageUpdate = false;
+/** Allow the "info" action, very inefficient at the moment */
+$wgAllowPageInfo = false;
-/**
- * Disable output compression (enabled by default if zlib is available)
- */
-$wgDisableOutputCompression = false;
+/** Name of the external diff engine to use */
+$wgExternalDiffEngine = false;
/**
- * If lag is higher than $wgSlaveLagWarning, show a warning in some special
- * pages (like watchlist). If the lag is higher than $wgSlaveLagCritical,
- * show a more obvious warning.
+ * Array of disabled article actions, e.g. view, edit, dublincore, delete, etc.
*/
-$wgSlaveLagWarning = 10;
-$wgSlaveLagCritical = 30;
+$wgDisabledActions = array();
/**
- * Parser configuration. Associative array with the following members:
- *
- * class The class name
- *
- * preprocessorClass The preprocessor class. Two classes are currently available:
- * Preprocessor_Hash, which uses plain PHP arrays for tempoarary
- * storage, and Preprocessor_DOM, which uses the DOM module for
- * temporary storage. Preprocessor_DOM generally uses less memory;
- * the speed of the two is roughly the same.
- *
- * If this parameter is not given, it uses Preprocessor_DOM if the
- * DOM module is available, otherwise it uses Preprocessor_Hash.
- *
- * The entire associative array will be passed through to the constructor as
- * the first parameter. Note that only Setup.php can use this variable --
- * the configuration will change at runtime via $wgParser member functions, so
- * the contents of this variable will be out-of-date. The variable can only be
- * changed during LocalSettings.php, in particular, it can't be changed during
- * an extension setup function.
+ * Disable redirects to special pages and interwiki redirects, which use a 302
+ * and have no "redirected from" link. Note this is only for articles with #Redirect
+ * in them. URL's containing a local interwiki prefix (or a non-canonical special
+ * page name) are still hard redirected regardless of this setting.
*/
-$wgParserConf = array(
- 'class' => 'Parser',
- #'preprocessorClass' => 'Preprocessor_Hash',
-);
+$wgDisableHardRedirects = false;
/**
* LinkHolderArray batch size
@@ -4070,38 +5255,6 @@ $wgLinkHolderBatchSize = 1000;
$wgRegisterInternalExternals = false;
/**
- * Hooks that are used for outputting exceptions. Format is:
- * $wgExceptionHooks[] = $funcname
- * or:
- * $wgExceptionHooks[] = array( $class, $funcname )
- * Hooks should return strings or false
- */
-$wgExceptionHooks = array();
-
-/**
- * Page property link table invalidation lists. When a page property
- * changes, this may require other link tables to be updated (eg
- * adding __HIDDENCAT__ means the hiddencat tracking category will
- * have been added, so the categorylinks table needs to be rebuilt).
- * This array can be added to by extensions.
- */
-$wgPagePropLinkInvalidations = array(
- 'hiddencat' => 'categorylinks',
-);
-
-/**
- * Maximum number of links to a redirect page listed on
- * Special:Whatlinkshere/RedirectDestination
- */
-$wgMaxRedirectLinksRetrieved = 500;
-
-/**
- * Maximum number of calls per parse to expensive parser functions such as
- * PAGESINCATEGORY.
- */
-$wgExpensiveParserFunctionLimit = 100;
-
-/**
* Maximum number of pages to move at once when moving subpages with a page.
*/
$wgMaximumMovedPages = 100;
@@ -4113,133 +5266,12 @@ $wgMaximumMovedPages = 100;
$wgFixDoubleRedirects = false;
/**
- * Max number of redirects to follow when resolving redirects.
- * 1 means only the first redirect is followed (default behavior).
- * 0 or less means no redirects are followed.
- */
-$wgMaxRedirects = 1;
-
-/**
- * Array of invalid page redirect targets.
- * Attempting to create a redirect to any of the pages in this array
- * will make the redirect fail.
- * Userlogout is hard-coded, so it does not need to be listed here.
- * (bug 10569) Disallow Mypage and Mytalk as well.
- *
- * As of now, this only checks special pages. Redirects to pages in
- * other namespaces cannot be invalidated by this variable.
- */
-$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk' );
-
-/**
- * Array of namespaces to generate a sitemap for when the
- * maintenance/generateSitemap.php script is run, or false if one is to be ge-
- * nerated for all namespaces.
- */
-$wgSitemapNamespaces = false;
-
-
-/**
- * If user doesn't specify any edit summary when making a an edit, MediaWiki
- * will try to automatically create one. This feature can be disabled by set-
- * ting this variable false.
- */
-$wgUseAutomaticEditSummaries = true;
-
-/**
- * Limit password attempts to X attempts per Y seconds per IP per account.
- * Requires memcached.
- */
-$wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
-
-/**
- * Display user edit counts in various prominent places.
- */
-$wgEdititis = false;
-
-/**
- * Enable the UniversalEditButton for browsers that support it
- * (currently only Firefox with an extension)
- * See http://universaleditbutton.org for more background information
- */
-$wgUniversalEditButton = true;
-
-/**
- * Should we allow a broader set of characters in id attributes, per HTML5? If
- * not, use only HTML 4-compatible IDs. This option is for testing -- when the
- * functionality is ready, it will be on by default with no option.
- *
- * Currently this appears to work fine in Chrome 4 and 5, Firefox 3.5 and 3.6, IE6
- * and 8, and Opera 10.50, but it fails in Opera 10.10: Unicode IDs don't seem
- * to work as anchors. So not quite ready for general use yet.
- */
-$wgExperimentalHtmlIds = false;
-
-/**
- * Search form behavior
- * true = use Go & Search buttons
- * false = use Go button & Advanced search link
- */
-$wgUseTwoButtonsSearchForm = true;
-
-/**
- * Search form behavior for Vector skin only
- * true = use an icon search button
- * false = use Go & Search buttons
- */
-$wgVectorUseSimpleSearch = false;
-
-/**
- * Watch and unwatch as an icon rather than a link for Vector skin only
- * true = use an icon watch/unwatch button
- * false = use watch/unwatch text link
- */
-$wgVectorUseIconWatch = false;
-
-/**
- * Add extra stylesheets for Vector - This is only being used so that we can play around with different options while
- * keeping our CSS code in the SVN and not having to change the main Vector styles. This will probably go away later on.
- * null = add no extra styles
- * array = list of style paths relative to skins/vector/
- */
-$wgVectorExtraStyles = null;
-
-/**
- * Preprocessor caching threshold
- */
-$wgPreprocessorCacheThreshold = 1000;
-
-/**
- * Allow filtering by change tag in recentchanges, history, etc
- * Has no effect if no tags are defined in valid_tag.
- */
-$wgUseTagFilter = true;
-
-/**
* Allow redirection to another page when a user logs in.
* To enable, set to a string like 'Main Page'
*/
$wgRedirectOnLogin = null;
/**
- * Characters to prevent during new account creations.
- * This is used in a regular expression character class during
- * registration (regex metacharacters like / are escaped).
- */
-$wgInvalidUsernameCharacters = '@';
-
-/**
- * Character used as a delimiter when testing for interwiki userrights
- * (In Special:UserRights, it is possible to modify users on different
- * databases if the delimiter is used, e.g. Someuser@enwiki).
- *
- * It is recommended that you have this delimiter in
- * $wgInvalidUsernameCharacters above, or you will not be able to
- * modify the user rights of those users via Special:UserRights
- */
-$wgUserrightsInterwikiDelimiter = '@';
-
-/**
* Configuration for processing pool control, for use in high-traffic wikis.
* An implementation is provided in the PoolCounter extension.
*
@@ -4248,112 +5280,30 @@ $wgUserrightsInterwikiDelimiter = '@';
* The remaining elements are passed through to the class as constructor
* parameters. Example:
*
- * $wgPoolCounterConf = array( 'Article::view' => array(
+ * $wgPoolCounterConf = array( 'ArticleView' => array(
* 'class' => 'PoolCounter_Client',
+ * 'timeout' => 15, // wait timeout in seconds
+ * 'workers' => 5, // maximum number of active threads in each pool
+ * 'maxqueue' => 50, // maximum number of total threads in each pool
* ... any extension-specific options...
* );
*/
$wgPoolCounterConf = null;
/**
- * Use some particular type of external authentication. The specific
- * authentication module you use will normally require some extra settings to
- * be specified.
- *
- * null indicates no external authentication is to be used. Otherwise,
- * $wgExternalAuthType must be the name of a non-abstract class that extends
- * ExternalUser.
- *
- * Core authentication modules can be found in includes/extauth/.
- */
-$wgExternalAuthType = null;
-
-/**
- * Configuration for the external authentication. This may include arbitrary
- * keys that depend on the authentication mechanism. For instance,
- * authentication against another web app might require that the database login
- * info be provided. Check the file where your auth mechanism is defined for
- * info on what to put here.
- */
-$wgExternalAuthConfig = array();
-
-/**
- * When should we automatically create local accounts when external accounts
- * already exist, if using ExternalAuth? Can have three values: 'never',
- * 'login', 'view'. 'view' requires the external database to support cookies,
- * and implies 'login'.
- *
- * TODO: Implement 'view' (currently behaves like 'login').
- */
-$wgAutocreatePolicy = 'login';
-
-/**
- * Policies for how each preference is allowed to be changed, in the presence
- * of external authentication. The keys are preference keys, e.g., 'password'
- * or 'emailaddress' (see Preferences.php et al.). The value can be one of the
- * following:
- *
- * - local: Allow changes to this pref through the wiki interface but only
- * apply them locally (default).
- * - semiglobal: Allow changes through the wiki interface and try to apply them
- * to the foreign database, but continue on anyway if that fails.
- * - global: Allow changes through the wiki interface, but only let them go
- * through if they successfully update the foreign database.
- * - message: Allow no local changes for linked accounts; replace the change
- * form with a message provided by the auth plugin, telling the user how to
- * change the setting externally (maybe providing a link, etc.). If the auth
- * plugin provides no message for this preference, hide it entirely.
- *
- * Accounts that are not linked to an external account are never affected by
- * this setting. You may want to look at $wgHiddenPrefs instead.
- * $wgHiddenPrefs supersedes this option.
- *
- * TODO: Implement message, global.
- */
-$wgAllowPrefChange = array();
-
-
-/**
- * Settings for incoming cross-site AJAX requests:
- * Newer browsers support cross-site AJAX when the target resource allows requests
- * from the origin domain by the Access-Control-Allow-Origin header.
- * This is currently only used by the API (requests to api.php)
- * $wgCrossSiteAJAXdomains can be set using a wildcard syntax:
- *
- * '*' matches any number of characters
- * '?' matches any 1 character
- *
- * Example:
- $wgCrossSiteAJAXdomains = array(
- 'www.mediawiki.org',
- '*.wikipedia.org',
- '*.wikimedia.org',
- '*.wiktionary.org',
- );
- *
- */
-$wgCrossSiteAJAXdomains = array();
-
-/**
- * Domains that should not be allowed to make AJAX requests,
- * even if they match one of the domains allowed by $wgCrossSiteAJAXdomains
- * Uses the same syntax as $wgCrossSiteAJAXdomains
- */
-
-$wgCrossSiteAJAXdomainExceptions = array();
-
-/**
- * The minimum amount of memory that MediaWiki "needs"; MediaWiki will try to raise PHP's memory limit if it's below this amount.
- */
-$wgMemoryLimit = "50M";
-
-/**
* To disable file delete/restore temporarily
*/
$wgUploadMaintenance = false;
/**
- * Use old names for change_tags indices.
+ * Allows running of selenium tests via maintenance/tests/RunSeleniumTests.php
*/
-$wgOldChangeTagsIndex = false;
+$wgEnableSelenium = false;
+$wgSeleniumTestConfigs = array();
+$wgSeleniumConfigFile = null;
+/**
+ * For really cool vim folding this needs to be at the end:
+ * vim: foldmarker=@{,@} foldmethod=marker
+ * @}
+ */
diff --git a/includes/Defines.php b/includes/Defines.php
index 7be569af..64197d9c 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -9,7 +9,7 @@
*/
define( 'MW_SPECIALPAGE_VERSION', 2 );
-/**#@+
+/**@{
* Database related constants
*/
define( 'DBO_DEBUG', 1 );
@@ -19,27 +19,31 @@ define( 'DBO_TRX', 8 );
define( 'DBO_DEFAULT', 16 );
define( 'DBO_PERSISTENT', 32 );
define( 'DBO_SYSDBA', 64 ); //for oracle maintenance
-/**#@-*/
+define( 'DBO_DDLMODE', 128 ); // when using schema files: mostly for Oracle
+/**@}*/
-# Valid database indexes
-# Operation-based indexes
+/**@{
+ * Valid database indexes
+ * Operation-based indexes
+ */
define( 'DB_SLAVE', -1 ); # Read from the slave (or only server)
define( 'DB_MASTER', -2 ); # Write to master (or only server)
define( 'DB_LAST', -3 ); # Whatever database was used last
+/**@}*/
# Obsolete aliases
define( 'DB_READ', -1 );
define( 'DB_WRITE', -2 );
-/**#@+
+/**@{
* Virtual namespaces; don't appear in the page database
*/
-define('NS_MEDIA', -2);
-define('NS_SPECIAL', -1);
-/**#@-*/
+define( 'NS_MEDIA', -2 );
+define( 'NS_SPECIAL', -1 );
+/**@}*/
-/**#@+
+/**@{
* Real namespaces
*
* Number 100 and beyond are reserved for custom namespaces;
@@ -47,22 +51,23 @@ define('NS_SPECIAL', -1);
* DO NOT Change integer values as they are most probably hardcoded everywhere
* see bug #696 which talked about that.
*/
-define('NS_MAIN', 0);
-define('NS_TALK', 1);
-define('NS_USER', 2);
-define('NS_USER_TALK', 3);
-define('NS_PROJECT', 4);
-define('NS_PROJECT_TALK', 5);
-define('NS_FILE', 6);
-define('NS_FILE_TALK', 7);
-define('NS_MEDIAWIKI', 8);
-define('NS_MEDIAWIKI_TALK', 9);
-define('NS_TEMPLATE', 10);
-define('NS_TEMPLATE_TALK', 11);
-define('NS_HELP', 12);
-define('NS_HELP_TALK', 13);
-define('NS_CATEGORY', 14);
-define('NS_CATEGORY_TALK', 15);
+define( 'NS_MAIN', 0 );
+define( 'NS_TALK', 1 );
+define( 'NS_USER', 2 );
+define( 'NS_USER_TALK', 3 );
+define( 'NS_PROJECT', 4 );
+define( 'NS_PROJECT_TALK', 5 );
+define( 'NS_FILE', 6 );
+define( 'NS_FILE_TALK', 7 );
+define( 'NS_MEDIAWIKI', 8 );
+define( 'NS_MEDIAWIKI_TALK', 9 );
+define( 'NS_TEMPLATE', 10 );
+define( 'NS_TEMPLATE_TALK', 11 );
+define( 'NS_HELP', 12 );
+define( 'NS_HELP_TALK', 13 );
+define( 'NS_CATEGORY', 14 );
+define( 'NS_CATEGORY_TALK', 15 );
+
/**
* NS_IMAGE and NS_IMAGE_TALK are the pre-v1.14 names for NS_FILE and
* NS_FILE_TALK respectively, and are kept for compatibility.
@@ -71,9 +76,9 @@ define('NS_CATEGORY_TALK', 15);
* versions, either stick to the old names or define the new constants
* yourself, if they're not defined already.
*/
-define('NS_IMAGE', NS_FILE);
-define('NS_IMAGE_TALK', NS_FILE_TALK);
-/**#@-*/
+define( 'NS_IMAGE', NS_FILE );
+define( 'NS_IMAGE_TALK', NS_FILE_TALK );
+/**@}*/
/**
* Available feeds objects
@@ -85,7 +90,7 @@ $wgFeedClasses = array(
'atom' => 'AtomFeed',
);
-/**#@+
+/**@{
* Maths constants
*/
define( 'MW_MATH_PNG', 0 );
@@ -94,9 +99,9 @@ define( 'MW_MATH_HTML', 2 );
define( 'MW_MATH_SOURCE', 3 );
define( 'MW_MATH_MODERN', 4 );
define( 'MW_MATH_MATHML', 5 );
-/**#@-*/
+/**@}*/
-/**#@+
+/**@{
* Cache type
*/
define( 'CACHE_ANYTHING', -1 ); // Use anything, as long as it works
@@ -105,11 +110,9 @@ define( 'CACHE_DB', 1 ); // Store cache objects in the DB
define( 'CACHE_MEMCACHED', 2 ); // MemCached, must specify servers in $wgMemCacheServers
define( 'CACHE_ACCEL', 3 ); // eAccelerator
define( 'CACHE_DBA', 4 ); // Use PHP's DBA extension to store in a DBM-style database
-/**#@-*/
-
-
+/**@}*/
-/**#@+
+/**@{
* Media types.
* This defines constants for the value returned by Image::getMediaType()
*/
@@ -123,18 +126,18 @@ define( 'MEDIATYPE_OFFICE', 'OFFICE' ); // Office Documents, Spreadshee
define( 'MEDIATYPE_TEXT', 'TEXT' ); // Plain text (possibly containing program code or scripts)
define( 'MEDIATYPE_EXECUTABLE', 'EXECUTABLE' ); // binary executable
define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' ); // archive file (zip, tar, etc)
-/**#@-*/
+/**@}*/
-/**#@+
+/**@{
* Antivirus result codes, for use in $wgAntivirusSetup.
*/
define( 'AV_NO_VIRUS', 0 ); #scan ok, no virus found
define( 'AV_VIRUS_FOUND', 1 ); #virus found!
define( 'AV_SCAN_ABORTED', -1 ); #scan aborted, the file is probably imune
define( 'AV_SCAN_FAILED', false ); #scan failed (scanner not found or error in scanner)
-/**#@-*/
+/**@}*/
-/**#@+
+/**@{
* Anti-lock flags
* See DefaultSettings.php for a description
*/
@@ -142,9 +145,9 @@ define( 'ALF_PRELOAD_LINKS', 1 );
define( 'ALF_PRELOAD_EXISTENCE', 2 );
define( 'ALF_NO_LINK_LOCK', 4 );
define( 'ALF_NO_BLOCK_LOCK', 8 );
-/**#@-*/
+/**@}*/
-/**#@+
+/**@{
* Date format selectors; used in user preference storage and by
* Language::date() and co.
*/
@@ -158,9 +161,9 @@ define( 'MW_DATE_MDY', 'mdy' );
define( 'MW_DATE_DMY', 'dmy' );
define( 'MW_DATE_YMD', 'ymd' );
define( 'MW_DATE_ISO', 'ISO 8601' );
-/**#@-*/
+/**@}*/
-/**#@+
+/**@{
* RecentChange type identifiers
* This may be obsolete; log items are now used for moves?
*/
@@ -169,9 +172,9 @@ define( 'RC_NEW', 1);
define( 'RC_MOVE', 2);
define( 'RC_LOG', 3);
define( 'RC_MOVE_OVER_REDIRECT', 4);
-/**#@-*/
+/**@}*/
-/**#@+
+/**@{
* Article edit flags
*/
define( 'EDIT_NEW', 1 );
@@ -181,9 +184,9 @@ define( 'EDIT_SUPPRESS_RC', 8 );
define( 'EDIT_FORCE_BOT', 16 );
define( 'EDIT_DEFER_UPDATES', 32 );
define( 'EDIT_AUTOSUMMARY', 64 );
-/**#@-*/
+/**@}*/
-/**
+/**@{
* Flags for Database::makeList()
* These are also available as Database class constants
*/
@@ -192,36 +195,57 @@ define( 'LIST_AND', 1 );
define( 'LIST_SET', 2 );
define( 'LIST_NAMES', 3);
define( 'LIST_OR', 4);
+define( 'LIST_SET_PREPARED', 8); // List of (?, ?, ?) for DatabaseIbm_db2
+/**@}*/
/**
* Unicode and normalisation related
*/
require_once dirname(__FILE__).'/normal/UtfNormalDefines.php';
-# Hook support constants
+/**@{
+ * Hook support constants
+ */
define( 'MW_SUPPORTS_EDITFILTERMERGED', 1 );
define( 'MW_SUPPORTS_PARSERFIRSTCALLINIT', 1 );
define( 'MW_SUPPORTS_LOCALISATIONCACHE', 1 );
+/**@}*/
+
+/** Support for $wgResourceModules */
+define( 'MW_SUPPORTS_RESOURCE_MODULES', 1 );
-# Allowed values for Parser::$mOutputType
-# Parameter to Parser::startExternalParse().
+/**@{
+ * Allowed values for Parser::$mOutputType
+ * Parameter to Parser::startExternalParse().
+ */
define( 'OT_HTML', 1 );
define( 'OT_WIKI', 2 );
define( 'OT_PREPROCESS', 3 );
define( 'OT_MSG' , 3 ); // b/c alias for OT_PREPROCESS
+define( 'OT_PLAIN', 4 );
+/**@}*/
-# Flags for Parser::setFunctionHook
+/**@{
+ * Flags for Parser::setFunctionHook
+ */
define( 'SFH_NO_HASH', 1 );
define( 'SFH_OBJECT_ARGS', 2 );
+/**@}*/
-# Flags for Parser::setLinkHook
+/**
+ * Flags for Parser::setLinkHook
+ */
define( 'SLH_PATTERN', 1 );
-# Flags for Parser::replaceLinkHolders
+/**
+ * Flags for Parser::replaceLinkHolders
+ */
define( 'RLH_FOR_UPDATE', 1 );
-# Autopromote conditions (must be here and not in Autopromote.php, so that
-# they're loaded for DefaultSettings.php before AutoLoader.php)
+/**@{
+ * Autopromote conditions (must be here and not in Autopromote.php, so that
+ * they're loaded for DefaultSettings.php before AutoLoader.php)
+ */
define( 'APCOND_EDITCOUNT', 1 );
define( 'APCOND_AGE', 2 );
define( 'APCOND_EMAILCONFIRMED', 3 );
@@ -230,3 +254,4 @@ define( 'APCOND_ISIP', 5 );
define( 'APCOND_IPINRANGE', 6 );
define( 'APCOND_AGE_FROM_EDIT', 7 );
define( 'APCOND_BLOCKED', 8 );
+/**@}*/
diff --git a/includes/DjVuImage.php b/includes/DjVuImage.php
index 75df0fd5..cccb070a 100644
--- a/includes/DjVuImage.php
+++ b/includes/DjVuImage.php
@@ -1,8 +1,8 @@
<?php
-
/**
+ * DjVu image handler
*
- * Copyright (C) 2006 Brion Vibber <brion@pobox.com>
+ * Copyright © 2006 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -20,6 +20,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
*/
/**
@@ -225,6 +226,8 @@ class DjVuImage {
*/
function retrieveMetaData() {
global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
+ wfProfileIn( __METHOD__ );
+
if ( isset( $wgDjvuDump ) ) {
# djvudump is faster as of version 3.5
# http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
@@ -247,28 +250,38 @@ class DjVuImage {
wfProfileIn( 'djvutxt' );
$cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename ) ;
wfDebug( __METHOD__.": $cmd\n" );
+ $retval = '';
$txt = wfShellExec( $cmd, $retval );
wfProfileOut( 'djvutxt' );
if( $retval == 0) {
- # Get rid of invalid UTF-8, strip control characters
- if( is_callable( 'iconv' ) ) {
- wfSuppressWarnings();
- $txt = iconv( "UTF-8","UTF-8//IGNORE", $txt );
- wfRestoreWarnings();
- } else {
- $txt = UtfNormal::cleanUp( $txt );
- }
+ # Strip some control characters
$txt = preg_replace( "/[\013\035\037]/", "", $txt );
- $txt = htmlspecialchars($txt);
- $txt = preg_replace( "/\((page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*\&quot;([^<]*?)\&quot;\s*|)\)/s", "<PAGE value=\"$2\" />", $txt );
+ $reg = <<<EOR
+ /\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
+ ((?> # Text to match is composed of atoms of either:
+ \\\\. # - any escaped character
+ | # - any character different from " and \
+ [^"\\\\]+
+ )*?)
+ "\s*\)
+ | # Or page can be empty ; in this case, djvutxt dumps ()
+ \(\s*()\)/sx
+EOR;
+ $txt = preg_replace_callback( $reg, array( $this, 'pageTextCallback' ), $txt );
$txt = "<DjVuTxt>\n<HEAD></HEAD>\n<BODY>\n" . $txt . "</BODY>\n</DjVuTxt>\n";
$xml = preg_replace( "/<DjVuXML>/", "<mw-djvu><DjVuXML>", $xml );
$xml = $xml . $txt. '</mw-djvu>' ;
}
}
+ wfProfileOut( __METHOD__ );
return $xml;
}
+ function pageTextCallback( $matches ) {
+ # Get rid of invalid UTF-8, strip control characters
+ return '<PAGE value="' . htmlspecialchars( UtfNormal::cleanUp( $matches[1] ) ) . '" />';
+ }
+
/**
* Hack to temporarily work around djvutoxml bug
*/
diff --git a/includes/EditPage.php b/includes/EditPage.php
index b4cbf0de..3e85ad10 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -96,7 +96,7 @@ class EditPage {
* @todo document
* @param $article
*/
- function EditPage( $article ) {
+ function __construct( $article ) {
$this->mArticle =& $article;
$this->mTitle = $article->getTitle();
$this->action = 'submit';
@@ -129,21 +129,19 @@ class EditPage {
wfProfileIn( __METHOD__ );
# Get variables from query string :P
$section = $wgRequest->getVal( 'section' );
-
- $preload = $wgRequest->getVal( 'preload',
+
+ $preload = $wgRequest->getVal( 'preload',
// Custom preload text for new sections
$section === 'new' ? 'MediaWiki:addsection-preload' : '' );
$undoafter = $wgRequest->getVal( 'undoafter' );
$undo = $wgRequest->getVal( 'undo' );
- $text = '';
// For message page not locally set, use the i18n message.
// For other non-existent articles, use preload text if any.
if ( !$this->mTitle->exists() ) {
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
# If this is a system message, get the default text.
list( $message, $lang ) = $wgMessageCache->figureMessage( $wgContLang->lcfirst( $this->mTitle->getText() ) );
- $wgMessageCache->loadAllMessages( $lang );
$text = wfMsgGetKey( $message, false, $lang, false );
if( wfEmptyMsg( $message, $text ) )
$text = $this->getPreloadedText( $preload );
@@ -220,30 +218,39 @@ class EditPage {
}
/**
- * Get the contents of a page from its title and remove includeonly tags
+ * Get the contents to be preloaded into the box, either set by
+ * an earlier setPreloadText() or by loading the given page.
*
- * @param $preload String: the title of the page.
- * @return string The contents of the page.
+ * @param $preload String: representing the title to preload from.
+ * @return String
*/
protected function getPreloadedText( $preload ) {
+ global $wgUser, $wgParser;
if ( !empty( $this->mPreloadText ) ) {
return $this->mPreloadText;
- } elseif ( $preload === '' ) {
- return '';
- } else {
- $preloadTitle = Title::newFromText( $preload );
- if ( isset( $preloadTitle ) && $preloadTitle->userCanRead() ) {
- $rev = Revision::newFromTitle( $preloadTitle );
- if ( is_object( $rev ) ) {
- $text = $rev->getText();
- // TODO FIXME: AAAAAAAAAAA, this shouldn't be implementing
- // its own mini-parser! -ævar
- $text = preg_replace( '~</?includeonly>~', '', $text );
- return $text;
- } else
- return '';
+ } elseif ( $preload !== '' ) {
+ $title = Title::newFromText( $preload );
+ # Check for existence to avoid getting MediaWiki:Noarticletext
+ if ( isset( $title ) && $title->exists() && $title->userCanRead() ) {
+ $article = new Article( $title );
+
+ if ( $article->isRedirect() ) {
+ $title = Title::newFromRedirectRecurse( $article->getContent() );
+ # Redirects to missing titles are displayed, to hidden pages are followed
+ # Copying observed behaviour from ?action=view
+ if ( $title->exists() ) {
+ if ($title->userCanRead() ) {
+ $article = new Article( $title );
+ } else {
+ return "";
+ }
+ }
+ }
+ $parserOptions = ParserOptions::newFromUser( $wgUser );
+ return $wgParser->getPreloadText( $article->getContent(), $title, $parserOptions );
}
}
+ return '';
}
/*
@@ -267,6 +274,24 @@ class EditPage {
return $this->deletedSinceEdit;
}
+ /**
+ * Checks whether the user entered a skin name in uppercase,
+ * e.g. "User:Example/Monobook.css" instead of "monobook.css"
+ */
+ protected function isWrongCaseCssJsPage() {
+ if( $this->mTitle->isCssJsSubpage() ) {
+ $name = $this->mTitle->getSkinFromCssJsSubpage();
+ $skins = array_merge(
+ array_keys( Skin::getSkinNames() ),
+ array( 'common' )
+ );
+ return !in_array( $name, $skins )
+ && in_array( strtolower( $name ), $skins );
+ } else {
+ return false;
+ }
+ }
+
function submit() {
$this->edit();
}
@@ -310,11 +335,10 @@ class EditPage {
$this->preview = true;
}
- $wgOut->addScriptFile( 'edit.js' );
-
+ $wgOut->addModules( array( 'mediawiki.legacy.edit', 'mediawiki.action.edit' ) );
+
if ( $wgUser->getOption( 'uselivepreview', false ) ) {
- $wgOut->includeJQuery();
- $wgOut->addScriptFile( 'preview.js' );
+ $wgOut->addModules( 'mediawiki.legacy.preview' );
}
// Bug #19334: textarea jumps when editing articles in IE8
$wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
@@ -322,7 +346,9 @@ class EditPage {
$permErrors = $this->getEditPermissionErrors();
if ( $permErrors ) {
wfDebug( __METHOD__ . ": User can't edit\n" );
- $this->readOnlyPage( $this->getContent( false ), true, $permErrors, 'edit' );
+ $content = $this->getContent( null );
+ $content = $content === '' ? null : $content;
+ $this->readOnlyPage( $content, true, $permErrors, 'edit' );
wfProfileOut( __METHOD__ );
return;
} else {
@@ -354,7 +380,7 @@ class EditPage {
$this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
$this->isCssSubpage = $this->mTitle->isCssSubpage();
$this->isJsSubpage = $this->mTitle->isJsSubpage();
- $this->isValidCssJsSubpage = $this->mTitle->isValidCssJsSubpage();
+ $this->isWrongCaseCssJsPage = $this->isWrongCaseCssJsPage();
# Show applicable editing introductions
if ( $this->formtype == 'initial' || $this->firsttime )
@@ -484,7 +510,7 @@ class EditPage {
/**
* Does this EditPage class support section editing?
* This is used by EditPage subclasses to indicate their ui cannot handle section edits
- *
+ *
* @return bool
*/
protected function isSectionEditSupported() {
@@ -496,8 +522,8 @@ class EditPage {
* This is used by EditPage subclasses when simply customizing the action
* variable in the constructor is not enough. This can be used when the
* EditPage lives inside of a Special page rather than a custom page action.
- *
- * @param Title $title The title for which is being edited (where we go to for &action= links)
+ *
+ * @param $title Title object for which is being edited (where we go to for &action= links)
* @return string
*/
protected function getActionURL( Title $title ) {
@@ -635,10 +661,10 @@ class EditPage {
// Custom edit intro for new sections
$this->section === 'new' ? 'MediaWiki:addsection-editintro' : '' );
- wfProfileOut( __METHOD__ );
-
// Allow extensions to modify form data
wfRunHooks( 'EditPage::importFormData', array( $this, $request ) );
+
+ wfProfileOut( __METHOD__ );
}
/**
@@ -646,8 +672,8 @@ class EditPage {
* posted form to be placed in $this->textbox1, if using customized input
* this method should be overrided and return the page text that will be used
* for saving, preview parsing and so on...
- *
- * @praram WebRequest $request
+ *
+ * @param $request WebRequest
*/
protected function importContentFormData( &$request ) {
return; // Don't do anything, EditPage already extracted wpTextbox1
@@ -681,7 +707,7 @@ class EditPage {
if ( $namespace == NS_MEDIAWIKI ) {
# Show a warning if editing an interface message
- $wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1</div>", 'editinginterface' );
+ $wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
}
# Show a warning message when someone creates/edits a user (talk) page but the user does not exist
@@ -692,7 +718,7 @@ class EditPage {
$user = User::newFromName( $username, false /* allow IP users*/ );
$ip = User::isIP( $username );
if ( !$user->isLoggedIn() && !$ip ) { # User does not exist
- $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n$1</div>",
+ $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
array( 'userpage-userdoesnotexist', $username ) );
} else if ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
LogEventsList::showLogExtract(
@@ -714,9 +740,9 @@ class EditPage {
# Try to add a custom edit intro, or use the standard one if this is not possible.
if ( !$this->showCustomIntro() && !$this->mTitle->exists() ) {
if ( $wgUser->isLoggedIn() ) {
- $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletext\">\n$1</div>", 'newarticletext' );
+ $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletext\">\n$1\n</div>", 'newarticletext' );
} else {
- $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletextanon\">\n$1</div>", 'newarticletextanon' );
+ $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletextanon\">\n$1\n</div>", 'newarticletextanon' );
}
}
# Give a notice if the user is editing a deleted/moved page...
@@ -756,7 +782,7 @@ class EditPage {
* @return one of the constants describing the result
*/
function internalAttemptSave( &$result, $bot = false ) {
- global $wgFilterCallback, $wgUser, $wgOut, $wgParser;
+ global $wgFilterCallback, $wgUser, $wgParser;
global $wgMaxArticleSize;
wfProfileIn( __METHOD__ );
@@ -764,6 +790,8 @@ class EditPage {
if ( !wfRunHooks( 'EditPage::attemptSave', array( $this ) ) ) {
wfDebug( "Hook 'EditPage::attemptSave' aborted article saving\n" );
+ wfProfileOut( __METHOD__ . '-checks' );
+ wfProfileOut( __METHOD__ );
return self::AS_HOOK_ERROR;
}
@@ -771,11 +799,12 @@ class EditPage {
if ( $this->mTitle->getNamespace() == NS_FILE &&
Title::newFromRedirect( $this->textbox1 ) instanceof Title &&
!$wgUser->isAllowed( 'upload' ) ) {
- if ( $wgUser->isAnon() ) {
- return self::AS_IMAGE_REDIRECT_ANON;
- } else {
- return self::AS_IMAGE_REDIRECT_LOGGED;
- }
+ $isAnon = $wgUser->isAnon();
+
+ wfProfileOut( __METHOD__ . '-checks' );
+ wfProfileOut( __METHOD__ );
+
+ return $isAnon ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
}
# Check for spam
@@ -859,7 +888,7 @@ class EditPage {
wfProfileOut( __METHOD__ . '-checks' );
# If article is new, insert it.
- $aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE );
+ $aid = $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
if ( 0 == $aid ) {
// Late check for create permission, just in case *PARANOIA*
if ( !$this->mTitle->userCan( 'create' ) ) {
@@ -1008,7 +1037,7 @@ class EditPage {
return self::AS_TEXTBOX_EMPTY;
}
if ( $this->summary != '' ) {
- $sectionanchor = $wgParser->guessSectionNameFromWikiText( $this->summary );
+ $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
# This is a new section, so create a link to the new section
# in the revision summary.
$cleanSummary = $wgParser->stripSectionName( $this->summary );
@@ -1022,7 +1051,7 @@ class EditPage {
# we can't deal with anchors, includes, html etc in the header for now,
# headline would need to be parsed to improve this
if ( $hasmatch and strlen( $matches[2] ) > 0 ) {
- $sectionanchor = $wgParser->guessSectionNameFromWikiText( $matches[2] );
+ $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $matches[2] );
}
}
wfProfileOut( __METHOD__ . '-sectionanchor' );
@@ -1071,7 +1100,7 @@ class EditPage {
),
__METHOD__,
array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 50 ) );
- while( $row = $res->fetchObject() ) {
+ foreach ( $res as $row ) {
if( $row->rev_user != $id ) {
return false;
}
@@ -1166,7 +1195,7 @@ class EditPage {
* parameter; will be called during form output
* near the top, for captchas and the like.
*/
- function showEditForm( $formCallback=null ) {
+ function showEditForm( $formCallback = null ) {
global $wgOut, $wgUser, $wgTitle;
# If $wgTitle is null, that means we're in API mode.
@@ -1196,10 +1225,12 @@ class EditPage {
# Enabled article-related sidebar, toplinks, etc.
$wgOut->setArticleRelated( true );
- if ( $this->showHeader() === false )
+ if ( $this->showHeader() === false ) {
+ wfProfileOut( __METHOD__ );
return;
+ }
- $action = htmlspecialchars($this->getActionURL($wgTitle));
+ $action = htmlspecialchars( $this->getActionURL( $wgTitle ) );
if ( $wgUser->getOption( 'showtoolbar' ) and !$this->isCssJsSubpage ) {
# prepare toolbar for edit buttons
@@ -1225,7 +1256,7 @@ class EditPage {
if ( $this->wasDeletedSinceLastEdit() && 'save' != $this->formtype ) {
$wgOut->wrapWikiMsg(
- "<div class='error mw-deleted-while-editing'>\n$1</div>",
+ "<div class='error mw-deleted-while-editing'>\n$1\n</div>",
'deletedwhileediting' );
} elseif ( $this->wasDeletedSinceLastEdit() ) {
// Hide the toolbar and edit area, user can click preview to get it back
@@ -1268,11 +1299,11 @@ HTML
# automatic one and pass that in the hidden field wpAutoSummary.
if ( $this->missingSummary ||
( $this->section == 'new' && $this->nosummary ) )
- $wgOut->addHTML( Xml::hidden( 'wpIgnoreBlankSummary', true ) );
+ $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) );
$autosumm = $this->autoSumm ? $this->autoSumm : md5( $this->summary );
- $wgOut->addHTML( Xml::hidden( 'wpAutoSummary', $autosumm ) );
+ $wgOut->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) );
- $wgOut->addHTML( Xml::hidden( 'oldid', $this->mArticle->getOldID() ) );
+ $wgOut->addHTML( Html::hidden( 'oldid', $this->mArticle->getOldID() ) );
if ( $this->section == 'new' ) {
$this->showSummaryInput( true, $this->summary );
@@ -1280,7 +1311,7 @@ HTML
}
$wgOut->addHTML( $this->editFormTextBeforeContent );
-
+
if ( $this->isConflict ) {
// In an edit conflict bypass the overrideable content form method
// and fallback to the raw wpTextbox1 since editconflicts can't be
@@ -1317,7 +1348,7 @@ HTML
if ( $this->isConflict )
$this->showConflict();
-
+
$wgOut->addHTML( $this->editFormTextBottom );
$wgOut->addHTML( "</form>\n" );
if ( !$wgUser->getOption( 'previewontop' ) ) {
@@ -1326,11 +1357,11 @@ HTML
wfProfileOut( __METHOD__ );
}
-
+
protected function showHeader() {
global $wgOut, $wgUser, $wgTitle, $wgMaxArticleSize, $wgLang;
if ( $this->isConflict ) {
- $wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1</div>", 'explainconflict' );
+ $wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
$this->edittime = $this->mArticle->getTimestamp();
} else {
if ( $this->section != '' && !$this->isSectionEditSupported() ) {
@@ -1355,15 +1386,15 @@ HTML
}
if ( $this->missingComment ) {
- $wgOut->wrapWikiMsg( "<div id='mw-missingcommenttext'>\n$1</div>", 'missingcommenttext' );
+ $wgOut->wrapWikiMsg( "<div id='mw-missingcommenttext'>\n$1\n</div>", 'missingcommenttext' );
}
if ( $this->missingSummary && $this->section != 'new' ) {
- $wgOut->wrapWikiMsg( "<div id='mw-missingsummary'>\n$1</div>", 'missingsummary' );
+ $wgOut->wrapWikiMsg( "<div id='mw-missingsummary'>\n$1\n</div>", 'missingsummary' );
}
if ( $this->missingSummary && $this->section == 'new' ) {
- $wgOut->wrapWikiMsg( "<div id='mw-missingcommentheader'>\n$1</div>", 'missingcommentheader' );
+ $wgOut->wrapWikiMsg( "<div id='mw-missingcommentheader'>\n$1\n</div>", 'missingcommentheader' );
}
if ( $this->hookError !== '' ) {
@@ -1378,9 +1409,9 @@ HTML
// Let sysop know that this will make private content public if saved
if ( !$this->mArticle->mRevision->userCan( Revision::DELETED_TEXT ) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", 'rev-deleted-text-permission' );
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
} else if ( $this->mArticle->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", 'rev-deleted-text-view' );
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
}
if ( !$this->mArticle->mRevision->isCurrent() ) {
@@ -1392,19 +1423,23 @@ HTML
if ( wfReadOnly() ) {
$wgOut->wrapWikiMsg( "<div id=\"mw-read-only-warning\">\n$1\n</div>", array( 'readonlywarning', wfReadOnlyReason() ) );
- } elseif ( $wgUser->isAnon() && $this->formtype != 'preview' ) {
- $wgOut->wrapWikiMsg( "<div id=\"mw-anon-edit-warning\">\n$1</div>", 'anoneditwarning' );
+ } elseif ( $wgUser->isAnon() ) {
+ if ( $this->formtype != 'preview' ) {
+ $wgOut->wrapWikiMsg( "<div id=\"mw-anon-edit-warning\">\n$1</div>", 'anoneditwarning' );
+ } else {
+ $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>", 'anonpreviewwarning' );
+ }
} else {
if ( $this->isCssJsSubpage ) {
# Check the skin exists
- if ( !$this->isValidCssJsSubpage ) {
- $wgOut->addWikiMsg( 'userinvalidcssjstitle', $wgTitle->getSkinFromCssJsSubpage() );
+ if ( $this->isWrongCaseCssJsPage ) {
+ $wgOut->wrapWikiMsg( "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>", array( 'userinvalidcssjstitle', $wgTitle->getSkinFromCssJsSubpage() ) );
}
if ( $this->formtype !== 'preview' ) {
if ( $this->isCssSubpage )
- $wgOut->addWikiMsg( 'usercssyoucanpreview' );
+ $wgOut->wrapWikiMsg( "<div id='mw-usercssyoucanpreview'>\n$1\n</div>", array( 'usercssyoucanpreview' ) );
if ( $this->isJsSubpage )
- $wgOut->addWikiMsg( 'userjsyoucanpreview' );
+ $wgOut->wrapWikiMsg( "<div id='mw-userjsyoucanpreview'>\n$1\n</div>", array( 'userjsyoucanpreview' ) );
}
}
}
@@ -1447,13 +1482,16 @@ HTML
}
if ( $this->tooBig || $this->kblength > $wgMaxArticleSize ) {
- $wgOut->addHTML( "<div class='error' id='mw-edit-longpageerror'>\n" );
- $wgOut->addWikiMsg( 'longpageerror', $wgLang->formatNum( $this->kblength ), $wgLang->formatNum( $wgMaxArticleSize ) );
- $wgOut->addHTML( "</div>\n" );
- } elseif ( $this->kblength > 29 ) {
- $wgOut->addHTML( "<div id='mw-edit-longpagewarning'>\n" );
- $wgOut->addWikiMsg( 'longpagewarning', $wgLang->formatNum( $this->kblength ) );
- $wgOut->addHTML( "</div>\n" );
+ $wgOut->wrapWikiMsg( "<div class='error' id='mw-edit-longpageerror'>\n$1\n</div>",
+ array( 'longpageerror', $wgLang->formatNum( $this->kblength ), $wgLang->formatNum( $wgMaxArticleSize ) ) );
+ } else {
+ $msg = 'longpage-hint';
+ $text = wfMsg( $msg );
+ if( !wfEmptyMsg( $msg, $text ) && $text !== '-' ) {
+ $wgOut->wrapWikiMsg( "<div id='mw-edit-longpage-hint'>\n$1\n</div>",
+ array( 'longpage-hint', $wgLang->formatSize( strlen( $this->textbox1 ) ), strlen( $this->textbox1 ) )
+ );
+ }
}
}
@@ -1463,23 +1501,25 @@ HTML
* Note that you do not need to worry about the label's for=, it will be
* inferred by the id given to the input. You can remove them both by
* passing array( 'id' => false ) to $userInputAttrs.
- *
+ *
* @param $summary The value of the summary input
* @param $labelText The html to place inside the label
- * @param $userInputAttrs An array of attrs to use on the input
- * @param $userSpanAttrs An array of attrs to use on the span inside the label
- *
+ * @param $inputAttrs An array of attrs to use on the input
+ * @param $spanLabelAttrs An array of attrs to use on the span inside the label
+ *
* @return array An array in the format array( $label, $input )
*/
function getSummaryInput($summary = "", $labelText = null, $inputAttrs = null, $spanLabelAttrs = null) {
+ global $wgUser;
+ //Note: the maxlength is overriden in JS to 250 and to make it use UTF-8 bytes, not characters.
$inputAttrs = ( is_array($inputAttrs) ? $inputAttrs : array() ) + array(
'id' => 'wpSummary',
'maxlength' => '200',
'tabindex' => '1',
'size' => 60,
'spellcheck' => 'true',
- );
-
+ ) + $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'summary' );
+
$spanLabelAttrs = ( is_array($spanLabelAttrs) ? $spanLabelAttrs : array() ) + array(
'class' => $this->missingSummary ? 'mw-summarymissed' : 'mw-summary',
'id' => "wpSummaryLabel"
@@ -1497,11 +1537,11 @@ HTML
}
/**
- * @param bool $isSubjectPreview true if this is the section subject/title
- * up top, or false if this is the comment
- * summary down below the textarea
- * @param string $summary The text of the summary to display
- * @return string
+ * @param $isSubjectPreview Boolean: true if this is the section subject/title
+ * up top, or false if this is the comment summary
+ * down below the textarea
+ * @param $summary String: The text of the summary to display
+ * @return String
*/
protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
global $wgOut, $wgContLang;
@@ -1521,41 +1561,43 @@ HTML
}
/**
- * @param bool $isSubjectPreview true if this is the section subject/title
- * up top, or false if this is the comment
- * summary down below the textarea
- * @param string $summary The text of the summary to display
- * @return string
+ * @param $isSubjectPreview Boolean: true if this is the section subject/title
+ * up top, or false if this is the comment summary
+ * down below the textarea
+ * @param $summary String: the text of the summary to display
+ * @return String
*/
protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
if ( !$summary || ( !$this->preview && !$this->diff ) )
return "";
-
+
global $wgParser, $wgUser;
$sk = $wgUser->getSkin();
-
+
if ( $isSubjectPreview )
$summary = wfMsgForContent( 'newsectionsummary', $wgParser->stripSectionName( $summary ) );
- $summary = wfMsgExt( 'subject-preview', 'parseinline' ) . $sk->commentBlock( $summary, $this->mTitle, !!$isSubjectPreview );
+ $message = $isSubjectPreview ? 'subject-preview' : 'summary-preview';
+
+ $summary = wfMsgExt( $message, 'parseinline' ) . $sk->commentBlock( $summary, $this->mTitle, $isSubjectPreview );
return Xml::tags( 'div', array( 'class' => 'mw-summary-preview' ), $summary );
}
protected function showFormBeforeText() {
global $wgOut;
$section = htmlspecialchars( $this->section );
- $wgOut->addHTML( <<<INPUTS
+ $wgOut->addHTML( <<<HTML
<input type='hidden' value="{$section}" name="wpSection" />
<input type='hidden' value="{$this->starttime}" name="wpStarttime" />
<input type='hidden' value="{$this->edittime}" name="wpEdittime" />
<input type='hidden' value="{$this->scrolltop}" name="wpScrolltop" id="wpScrolltop" />
-INPUTS
+HTML
);
if ( !$this->checkUnicodeCompliantBrowser() )
- $wgOut->addHTML(Xml::hidden( 'safemode', '1' ));
+ $wgOut->addHTML(Html::hidden( 'safemode', '1' ));
}
-
+
protected function showFormAfterText() {
global $wgOut, $wgUser;
/**
@@ -1570,7 +1612,7 @@ INPUTS
* include the constant suffix to prevent editing from
* broken text-mangling proxies.
*/
- $wgOut->addHTML( "\n" . Xml::hidden( "wpEditToken", $wgUser->editToken() ) . "\n" );
+ $wgOut->addHTML( "\n" . Html::hidden( "wpEditToken", $wgUser->editToken() ) . "\n" );
}
/**
@@ -1580,8 +1622,6 @@ INPUTS
* be it a form, or simply wpTextbox1 with a modified content that will be
* reverse modified when extracted from the post data.
* Note that this is basically the inverse for importContentFormData
- *
- * @praram WebRequest $request
*/
protected function showContentForm() {
$this->showTextbox1();
@@ -1591,9 +1631,9 @@ INPUTS
* Method to output wpTextbox1
* The $textoverride method can be used by subclasses overriding showContentForm
* to pass back to this method.
- *
- * @param array $customAttribs An array of html attributes to use in the textarea
- * @param string $textoverride Optional text to override $this->textarea1 with
+ *
+ * @param $customAttribs An array of html attributes to use in the textarea
+ * @param $textoverride String: optional text to override $this->textarea1 with
*/
protected function showTextbox1($customAttribs = null, $textoverride = null) {
$classes = array(); // Textarea CSS
@@ -1617,7 +1657,7 @@ INPUTS
$classes[] = $attribs['class'];
$attribs['class'] = implode( ' ', $classes );
}
-
+
$this->showTextbox( isset($textoverride) ? $textoverride : $this->textbox1, 'wpTextbox1', $attribs );
}
@@ -1640,14 +1680,11 @@ INPUTS
$attribs = $customAttribs + array(
'accesskey' => ',',
'id' => $name,
- 'cols' => $wgUser->getIntOption( 'cols' ),
+ 'cols' => $wgUser->getIntOption( 'cols' ),
'rows' => $wgUser->getIntOption( 'rows' ),
- 'style' => '' // avoid php notices when appending for editwidth preference (appending allows customAttribs['style'] to still work
+ 'style' => '' // avoid php notices when appending preferences (appending allows customAttribs['style'] to still work
);
- if ( $wgUser->getOption( 'editwidth' ) )
- $attribs['style'] .= 'width: 100%';
-
$wgOut->addHTML( Html::textarea( $name, $wikitext, $attribs ) );
}
@@ -1679,7 +1716,7 @@ INPUTS
* Append preview output to $wgOut.
* Includes category rendering if this is a category page.
*
- * @param string $text The HTML to be output for the preview.
+ * @param $text String: the HTML to be output for the preview.
*/
protected function showPreview( $text ) {
global $wgOut;
@@ -1695,14 +1732,16 @@ INPUTS
}
}
+ /**
+ * Give a chance for site and per-namespace customizations of
+ * terms of service summary link that might exist separately
+ * from the copyright notice.
+ *
+ * This will display between the save button and the edit tools,
+ * so should remain short!
+ */
protected function showTosSummary() {
$msg = 'editpage-tos-summary';
- // Give a chance for site and per-namespace customizations of
- // terms of service summary link that might exist separately
- // from the copyright notice.
- //
- // This will display between the save button and the edit tools,
- // so should remain short!
wfRunHooks( 'EditPageTosSummary', array( $this->mTitle, &$msg ) );
$text = wfMsg( $msg );
if( !wfEmptyMsg( $msg, $text ) && $text !== '-' ) {
@@ -1719,7 +1758,7 @@ INPUTS
$wgOut->addWikiMsgArray( 'edittools', array(), array( 'content' ) );
$wgOut->addHTML( '</div>' );
}
-
+
protected function getCopywarn() {
global $wgRightsText;
if ( $wgRightsText ) {
@@ -1732,10 +1771,10 @@ INPUTS
}
// Allow for site and per-namespace customization of contribution/copyright notice.
wfRunHooks( 'EditPageCopyrightWarning', array( $this->mTitle, &$copywarnMsg ) );
-
+
return "<div id=\"editpage-copywarn\">\n" . call_user_func_array("wfMsgNoTrans", $copywarnMsg) . "\n</div>";
}
-
+
protected function showStandardInputs( &$tabindex = 2 ) {
global $wgOut, $wgUser;
$wgOut->addHTML( "<div class='editOptions'>\n" );
@@ -1818,7 +1857,7 @@ INPUTS
* @return string
*/
function getPreviewText() {
- global $wgOut, $wgUser, $wgTitle, $wgParser, $wgLang, $wgContLang, $wgMessageCache;
+ global $wgOut, $wgUser, $wgParser, $wgMessageCache;
wfProfileIn( __METHOD__ );
@@ -1841,54 +1880,71 @@ INPUTS
if ( $wgRawHtml && !$this->mTokenOk ) {
// Could be an offsite preview attempt. This is very unsafe if
// HTML is enabled, as it could be an attack.
- return $wgOut->parse( "<div class='previewnote'>" .
+ $parsedNote = $wgOut->parse( "<div class='previewnote'>" .
wfMsg( 'session_fail_preview_html' ) . "</div>" );
+ wfProfileOut( __METHOD__ );
+ return $parsedNote;
}
# don't parse user css/js, show message about preview
- # XXX: stupid php bug won't let us use $wgTitle->isCssJsSubpage() here
+ # XXX: stupid php bug won't let us use $wgTitle->isCssJsSubpage() here -- This note has been there since r3530. Sure the bug was fixed time ago?
+
+ if ( $this->isCssJsSubpage || $this->mTitle->isCssOrJsPage() ) {
+ $level = 'user';
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ $level = 'site';
+ }
- if ( $this->isCssJsSubpage ) {
+ # Used messages to make sure grep find them:
+ # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
if (preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
- $previewtext = wfMsg( 'usercsspreview' );
- } else if (preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
- $previewtext = wfMsg( 'userjspreview' );
+ $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
+ $class = "mw-code 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";
+ } else {
+ throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
}
+
$parserOptions->setTidy( true );
$parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
$previewHTML = $parserOutput->mText;
- } elseif ( $rt = Title::newFromRedirectArray( $this->textbox1 ) ) {
- $previewHTML = $this->mArticle->viewRedirect( $rt, false );
+ $previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
} else {
- $toparse = $this->textbox1;
+ $rt = Title::newFromRedirectArray( $this->textbox1 );
+ if ( $rt ) {
+ $previewHTML = $this->mArticle->viewRedirect( $rt, false );
+ } else {
+ $toparse = $this->textbox1;
- # If we're adding a comment, we need to show the
- # summary as the headline
- if ( $this->section == "new" && $this->summary != "" ) {
- $toparse = "== {$this->summary} ==\n\n" . $toparse;
- }
+ # If we're adding a comment, we need to show the
+ # summary as the headline
+ if ( $this->section == "new" && $this->summary != "" ) {
+ $toparse = "== {$this->summary} ==\n\n" . $toparse;
+ }
- wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
-
- // Parse mediawiki messages with correct target language
- if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- list( /* $unused */, $lang ) = $wgMessageCache->figureMessage( $this->mTitle->getText() );
- $obj = wfGetLangObj( $lang );
- $parserOptions->setTargetLanguage( $obj );
- }
+ wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
+ // Parse mediawiki messages with correct target language
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ list( /* $unused */, $lang ) = $wgMessageCache->figureMessage( $this->mTitle->getText() );
+ $obj = wfGetLangObj( $lang );
+ $parserOptions->setTargetLanguage( $obj );
+ }
- $parserOptions->setTidy( true );
- $parserOptions->enableLimitReport();
- $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ),
+ $parserOptions->setTidy( true );
+ $parserOptions->enableLimitReport();
+ $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ),
$this->mTitle, $parserOptions );
- $previewHTML = $parserOutput->getText();
- $this->mParserOutput = $parserOutput;
- $wgOut->addParserOutputNoText( $parserOutput );
+ $previewHTML = $parserOutput->getText();
+ $this->mParserOutput = $parserOutput;
+ $wgOut->addParserOutputNoText( $parserOutput );
- if ( count( $parserOutput->getWarnings() ) ) {
- $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+ if ( count( $parserOutput->getWarnings() ) ) {
+ $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+ }
}
}
@@ -1991,8 +2047,9 @@ INPUTS
* Produce the stock "your edit contains spam" page
*
* @param $match Text which triggered one or more filters
+ * @deprecated Use method spamPageWithContent() instead
*/
- function spamPage( $match = false ) {
+ static function spamPage( $match = false ) {
global $wgOut, $wgTitle;
$wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );
@@ -2001,14 +2058,47 @@ INPUTS
$wgOut->addHTML( '<div id="spamprotected">' );
$wgOut->addWikiMsg( 'spamprotectiontext' );
- if ( $match )
+ if ( $match ) {
$wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) );
+ }
$wgOut->addHTML( '</div>' );
$wgOut->returnToMain( false, $wgTitle );
}
/**
+ * Show "your edit contains spam" page with your diff and text
+ *
+ * @param $match Text which triggered one or more filters
+ */
+ public function spamPageWithContent( $match = false ) {
+ global $wgOut, $wgTitle;
+ $this->textbox2 = $this->textbox1;
+
+ $wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
+ $wgOut->setArticleRelated( false );
+
+ $wgOut->addHTML( '<div id="spamprotected">' );
+ $wgOut->addWikiMsg( 'spamprotectiontext' );
+ if ( $match ) {
+ $wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) );
+ }
+ $wgOut->addHTML( '</div>' );
+
+ $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
+ $de = new DifferenceEngine( $this->mTitle );
+ $de->setText( $this->getContent(), $this->textbox2 );
+ $de->showDiff( wfMsg( "storedversion" ), wfMsg( "yourtext" ) );
+
+ $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
+ $this->showTextbox2();
+
+ $wgOut->addReturnTo( $wgTitle, array( 'action' => 'edit' ) );
+ }
+
+
+ /**
* @private
* @todo document
*/
@@ -2076,8 +2166,8 @@ INPUTS
/**
* Format an anchor fragment as it would appear for a given section name
- * @param string $text
- * @return string
+ * @param $text String
+ * @return String
* @private
*/
function sectionAnchor( $text ) {
@@ -2093,7 +2183,10 @@ INPUTS
* @return string
*/
static function getEditToolbar() {
- global $wgStylePath, $wgContLang, $wgLang;
+ global $wgStylePath, $wgContLang, $wgLang, $wgOut;
+ global $wgUseTeX, $wgEnableUploads, $wgForeignFileRepos;
+
+ $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
/**
@@ -2153,7 +2246,7 @@ INPUTS
'tip' => wfMsg( 'headline_tip' ),
'key' => 'H'
),
- array(
+ $imagesAvailable ? array(
'image' => $wgLang->getImageFile( 'button-image' ),
'id' => 'mw-editbutton-image',
'open' => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
@@ -2161,8 +2254,8 @@ INPUTS
'sample' => wfMsg( 'image_sample' ),
'tip' => wfMsg( 'image_tip' ),
'key' => 'D'
- ),
- array(
+ ) : false,
+ $imagesAvailable ? array(
'image' => $wgLang->getImageFile( 'button-media' ),
'id' => 'mw-editbutton-media',
'open' => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
@@ -2170,8 +2263,8 @@ INPUTS
'sample' => wfMsg( 'media_sample' ),
'tip' => wfMsg( 'media_tip' ),
'key' => 'M'
- ),
- array(
+ ) : false,
+ $wgUseTeX ? array(
'image' => $wgLang->getImageFile( 'button-math' ),
'id' => 'mw-editbutton-math',
'open' => "<math>",
@@ -2179,7 +2272,7 @@ INPUTS
'sample' => wfMsg( 'math_sample' ),
'tip' => wfMsg( 'math_tip' ),
'key' => 'C'
- ),
+ ) : false,
array(
'image' => $wgLang->getImageFile( 'button-nowiki' ),
'id' => 'mw-editbutton-nowiki',
@@ -2212,6 +2305,10 @@ INPUTS
$script = '';
foreach ( $toolarray as $tool ) {
+ if ( !$tool ) {
+ continue;
+ }
+
$params = array(
$image = $wgStylePath . '/common/images/' . $tool['image'],
// Note that we use the tip both for the ALT tag and the TITLE tag of the image.
@@ -2229,8 +2326,11 @@ INPUTS
array_map( array( 'Xml', 'encodeJsVar' ), $params ) );
$script .= "addButton($paramList);\n";
}
- $toolbar .= Html::inlineScript( "\n$script\n" );
-
+
+ $wgOut->addScript( Html::inlineScript(
+ "if ( window.mediaWiki ) { $script }"
+ ) );
+
$toolbar .= "\n</div>";
wfRunHooks( 'EditPageBeforeEditToolbar', array( &$toolbar ) );
@@ -2264,7 +2364,9 @@ INPUTS
);
$checkboxes['minor'] =
Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
- "&nbsp;<label for='wpMinoredit'" . $skin->tooltip( 'minoredit', 'withaccess' ) . ">{$minorLabel}</label>";
+ "&#160;<label for='wpMinoredit' id='mw-editpage-minoredit'" .
+ Xml::expandAttributes( array( 'title' => $skin->titleAttrib( 'minoredit', 'withaccess' ) ) ) .
+ ">{$minorLabel}</label>";
}
$watchLabel = wfMsgExt( 'watchthis', array( 'parseinline' ) );
@@ -2277,7 +2379,9 @@ INPUTS
);
$checkboxes['watch'] =
Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
- "&nbsp;<label for='wpWatchthis'" . $skin->tooltip( 'watch', 'withaccess' ) . ">{$watchLabel}</label>";
+ "&#160;<label for='wpWatchthis' id='mw-editpage-watch'" .
+ Xml::expandAttributes( array( 'title' => $skin->titleAttrib( 'watch', 'withaccess' ) ) ) .
+ ">{$watchLabel}</label>";
}
wfRunHooks( 'EditPageBeforeEditChecks', array( &$this, &$checkboxes, &$tabindex ) );
return $checkboxes;
@@ -2291,7 +2395,7 @@ INPUTS
*
* @return array
*/
- public function getEditButtons(&$tabindex) {
+ public function getEditButtons( &$tabindex ) {
$buttons = array();
$temp = array(
@@ -2415,9 +2519,9 @@ INPUTS
* Filter an input field through a Unicode de-armoring process if it
* came from an old browser with known broken Unicode editing issues.
*
- * @param WebRequest $request
- * @param string $field
- * @return string
+ * @param $request WebRequest
+ * @param $field String
+ * @return String
* @private
*/
function safeUnicodeInput( $request, $field ) {
@@ -2438,8 +2542,8 @@ INPUTS
* Filter an output field through a Unicode armoring process if it is
* going to an old browser with known broken Unicode editing issues.
*
- * @param string $text
- * @return string
+ * @param $text String
+ * @return String
* @private
*/
function safeUnicodeOutput( $text ) {
@@ -2459,8 +2563,8 @@ INPUTS
* Preexisting such character references will have a 0 added to them
* to ensure that round-trips do not alter the original data.
*
- * @param string $invalue
- * @return string
+ * @param $invalue String
+ * @return String
* @private
*/
function makesafe( $invalue ) {
@@ -2501,8 +2605,8 @@ INPUTS
* back to UTF-8. Used to protect data from corruption by broken web browsers
* as listed in $wgBrowserBlackList.
*
- * @param string $invalue
- * @return string
+ * @param $invalue String
+ * @return String
* @private
*/
function unmakesafe( $invalue ) {
@@ -2573,7 +2677,7 @@ INPUTS
return false;
case self::AS_SPAM_ERROR:
- $this->spamPage( $resultDetails['spam'] );
+ $this->spamPageWithContent( $resultDetails['spam'] );
return false;
case self::AS_BLOCKED_PAGE_FOR_USER:
@@ -2612,7 +2716,7 @@ INPUTS
}
function getBaseRevision() {
- if ( $this->mBaseRevision == false ) {
+ if ( !$this->mBaseRevision ) {
$db = wfGetDB( DB_MASTER );
$baseRevision = Revision::loadFromTimestamp(
$db, $this->mTitle, $this->edittime );
@@ -2620,5 +2724,5 @@ INPUTS
} else {
return $this->mBaseRevision;
}
- }
+ }
}
diff --git a/includes/Exception.php b/includes/Exception.php
index f6bc6f87..ff5d4b19 100644
--- a/includes/Exception.php
+++ b/includes/Exception.php
@@ -1,10 +1,17 @@
<?php
/**
+ * Exception class and handler
+ *
+ * @file
+ */
+
+/**
* @defgroup Exception Exception
*/
/**
* MediaWiki exception
+ *
* @ingroup Exception
*/
class MWException extends Exception {
@@ -25,37 +32,45 @@ class MWException extends Exception {
*/
function useMessageCache() {
global $wgLang;
+
foreach ( $this->getTrace() as $frame ) {
if ( isset( $frame['class'] ) && $frame['class'] === 'LocalisationCache' ) {
return false;
}
}
+
return is_object( $wgLang );
}
/**
* Run hook to allow extensions to modify the text of the exception
*
- * @param String $name class name of the exception
- * @param Array $args arguments to pass to the callback functions
- * @return mixed string to output or null if any hook has been called
+ * @param $name String: class name of the exception
+ * @param $args Array: arguments to pass to the callback functions
+ * @return Mixed: string to output or null if any hook has been called
*/
function runHooks( $name, $args = array() ) {
global $wgExceptionHooks;
- if( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) )
+
+ if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) {
return; // Just silently ignore
- if( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) )
+ }
+
+ if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
return;
+ }
+
$hooks = $wgExceptionHooks[ $name ];
$callargs = array_merge( array( $this ), $args );
- foreach( $hooks as $hook ) {
- if( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { //'function' or array( 'class', hook' )
+ foreach ( $hooks as $hook ) {
+ if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { // 'function' or array( 'class', hook' )
$result = call_user_func_array( $hook, $callargs );
} else {
$result = null;
}
- if( is_string( $result ) )
+
+ if ( is_string( $result ) )
return $result;
}
}
@@ -63,14 +78,15 @@ class MWException extends Exception {
/**
* Get a message from i18n
*
- * @param String $key message name
- * @param String $fallback default message if the message cache can't be
- * called by the exception
+ * @param $key String: message name
+ * @param $fallback String: default message if the message cache can't be
+ * called by the exception
* The function also has other parameters that are arguments for the message
* @return String message with arguments replaced
*/
function msg( $key, $fallback /*[, params...] */ ) {
$args = array_slice( func_get_args(), 2 );
+
if ( $this->useMessageCache() ) {
return wfMsgReal( $key, $args );
} else {
@@ -87,7 +103,8 @@ class MWException extends Exception {
*/
function getHTML() {
global $wgShowExceptionDetails;
- if( $wgShowExceptionDetails ) {
+
+ if ( $wgShowExceptionDetails ) {
return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) .
'</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
"</p>\n";
@@ -104,7 +121,8 @@ class MWException extends Exception {
*/
function getText() {
global $wgShowExceptionDetails;
- if( $wgShowExceptionDetails ) {
+
+ if ( $wgShowExceptionDetails ) {
return $this->getMessage() .
"\nBacktrace:\n" . $this->getTraceAsString() . "\n";
} else {
@@ -119,6 +137,7 @@ class MWException extends Exception {
return wfMsg( 'internalerror' );
} else {
global $wgSitename;
+
return "$wgSitename error";
}
}
@@ -127,13 +146,15 @@ class MWException extends Exception {
* Return the requested URL and point to file and line number from which the
* exception occured
*
- * @return string
+ * @return String
*/
function getLogMessage() {
global $wgRequest;
+
$file = $this->getFile();
$line = $this->getLine();
$message = $this->getMessage();
+
if ( isset( $wgRequest ) ) {
$url = $wgRequest->getRequestURL();
if ( !$url ) {
@@ -149,6 +170,7 @@ class MWException extends Exception {
/** Output the exception report using HTML */
function reportHTML() {
global $wgOut;
+
if ( $this->useOutputPage() ) {
$wgOut->setPageTitle( $this->getPageTitle() );
$wgOut->setRobotPolicy( "noindex,nofollow" );
@@ -156,16 +178,21 @@ class MWException extends Exception {
$wgOut->enableClientCache( false );
$wgOut->redirect( '' );
$wgOut->clearHTML();
- if( $hookResult = $this->runHooks( get_class( $this ) ) ) {
+
+ $hookResult = $this->runHooks( get_class( $this ) );
+ if ( $hookResult ) {
$wgOut->addHTML( $hookResult );
} else {
$wgOut->addHTML( $this->getHTML() );
}
+
$wgOut->output();
} else {
- if( $hookResult = $this->runHooks( get_class( $this ) . "Raw" ) ) {
+ $hookResult = $this->runHooks( get_class( $this ) . "Raw" );
+ if ( $hookResult ) {
die( $hookResult );
}
+
if ( defined( 'MEDIAWIKI_INSTALL' ) || $this->htmlBodyOnly() ) {
echo $this->getHTML();
} else {
@@ -182,9 +209,11 @@ class MWException extends Exception {
*/
function report() {
$log = $this->getLogMessage();
+
if ( $log ) {
wfDebugLog( 'exception', $log );
}
+
if ( self::isCommandLine() ) {
wfPrintError( $this->getText() );
} else {
@@ -197,22 +226,25 @@ class MWException extends Exception {
* $wgOut to output the exception.
*/
function htmlHeader() {
- global $wgLogo, $wgSitename, $wgOutputEncoding;
+ global $wgLogo, $wgOutputEncoding;
if ( !headers_sent() ) {
header( 'HTTP/1.0 500 Internal Server Error' );
- header( 'Content-type: text/html; charset='.$wgOutputEncoding );
+ header( 'Content-type: text/html; charset=' . $wgOutputEncoding );
/* Don't cache error pages! They cause no end of trouble... */
header( 'Cache-control: none' );
header( 'Pragma: nocache' );
}
- $title = $this->getPageTitle();
+
+ $logo = htmlspecialchars( $wgLogo, ENT_QUOTES );
+ $title = htmlspecialchars( $this->getPageTitle() );
+
return "<html>
<head>
<title>$title</title>
</head>
<body>
- <h1><img src='$wgLogo' style='float:left;margin-right:1em' alt=''/>$title</h1>
+ <h1><img src='$logo' style='float:left;margin-right:1em' alt=''/>$title</h1>
";
}
@@ -222,7 +254,7 @@ class MWException extends Exception {
function htmlFooter() {
return "</body></html>";
}
-
+
/**
* headers handled by subclass?
*/
@@ -267,6 +299,7 @@ class ErrorPageError extends MWException {
function report() {
global $wgOut;
+
$wgOut->showErrorPage( $this->title, $this->msg );
$wgOut->output();
}
@@ -283,7 +316,10 @@ function wfInstallExceptionHandler() {
* Report an exception to the user
*/
function wfReportException( Exception $e ) {
+ global $wgShowExceptionDetails;
+
$cmdLine = MWException::isCommandLine();
+
if ( $e instanceof MWException ) {
try {
$e->report();
@@ -292,28 +328,36 @@ function wfReportException( Exception $e ) {
// Show a simpler error message for the original exception,
// don't try to invoke report()
$message = "MediaWiki internal error.\n\n";
- if ( $GLOBALS['wgShowExceptionDetails'] )
- $message .= "Original exception: " . $e->__toString();
- $message .= "\n\nException caught inside exception handler";
- if ( $GLOBALS['wgShowExceptionDetails'] )
- $message .= ": " . $e2->__toString();
+
+ if ( $wgShowExceptionDetails ) {
+ $message .= 'Original exception: ' . $e->__toString() . "\n\n" .
+ 'Exception caught inside exception handler: ' . $e2->__toString();
+ } else {
+ $message .= "Exception caught inside exception handler.\n\n" .
+ "Set \$wgShowExceptionDetails = true; at the bottom of LocalSettings.php " .
+ "to show detailed debugging information.";
+ }
+
$message .= "\n";
+
if ( $cmdLine ) {
wfPrintError( $message );
} else {
- echo nl2br( htmlspecialchars( $message ) ). "\n";
+ echo nl2br( htmlspecialchars( $message ) ) . "\n";
}
}
} else {
$message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"\n" .
$e->__toString() . "\n";
- if ( $GLOBALS['wgShowExceptionDetails'] ) {
- $message .= "\n" . $e->getTraceAsString() ."\n";
+
+ if ( $wgShowExceptionDetails ) {
+ $message .= "\n" . $e->getTraceAsString() . "\n";
}
+
if ( $cmdLine ) {
wfPrintError( $message );
} else {
- echo nl2br( htmlspecialchars( $message ) ). "\n";
+ echo nl2br( htmlspecialchars( $message ) ) . "\n";
}
}
}
@@ -323,7 +367,7 @@ function wfReportException( Exception $e ) {
* Use this in command line mode only (see isCommandLine)
*/
function wfPrintError( $message ) {
- #NOTE: STDERR may not be available, especially if php-cgi is used from the command line (bug #15602).
+ # NOTE: STDERR may not be available, especially if php-cgi is used from the command line (bug #15602).
# Try to produce meaningful output anyway. Using echo may corrupt output to STDOUT though.
if ( defined( 'STDERR' ) ) {
fwrite( STDERR, $message );
@@ -345,9 +389,10 @@ function wfPrintError( $message ) {
*/
function wfExceptionHandler( $e ) {
global $wgFullyInitialised;
+
wfReportException( $e );
- // Final cleanup, similar to wfErrorExit()
+ // Final cleanup
if ( $wgFullyInitialised ) {
try {
wfLogProfilingData(); // uses $wgRequest, hence the $wgFullyInitialised condition
diff --git a/includes/Exif.php b/includes/Exif.php
index 594e633a..630821c3 100644
--- a/includes/Exif.php
+++ b/includes/Exif.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Exif metadata reader
+ *
* 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
@@ -618,7 +620,7 @@ class FormatExif {
* @param $exif Array: the Exif data to format ( as returned by
* Exif::getFilteredData() )
*/
- function FormatExif( $exif ) {
+ function __construct( $exif ) {
$this->mExif = $exif;
}
@@ -1146,15 +1148,3 @@ class FormatExif {
return $a;
}
}
-
-/**
- * MW 1.6 compatibility
- */
-define( 'MW_EXIF_BYTE', Exif::BYTE );
-define( 'MW_EXIF_ASCII', Exif::ASCII );
-define( 'MW_EXIF_SHORT', Exif::SHORT );
-define( 'MW_EXIF_LONG', Exif::LONG );
-define( 'MW_EXIF_RATIONAL', Exif::RATIONAL );
-define( 'MW_EXIF_UNDEFINED', Exif::UNDEFINED );
-define( 'MW_EXIF_SLONG', Exif::SLONG );
-define( 'MW_EXIF_SRATIONAL', Exif::SRATIONAL );
diff --git a/includes/Export.php b/includes/Export.php
index e8e74289..e7cd4d3f 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -1,21 +1,27 @@
<?php
-# Copyright (C) 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
+/**
+ * Base classes for dumps and export
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
/**
* @defgroup Dump Dump
@@ -124,7 +130,7 @@ class WikiExporter {
public function pageByName( $name ) {
$title = Title::newFromText( $name );
if( is_null( $title ) ) {
- return new WikiError( "Can't export invalid title" );
+ throw new MWException( "Can't export invalid title" );
} else {
return $this->pageByTitle( $title );
}
@@ -152,17 +158,16 @@ class WikiExporter {
# Not called by default (depends on $this->list_authors)
# Can be set by Special:Export when not exporting whole history
protected function do_list_authors( $page , $revision , $cond ) {
- $fname = "do_list_authors" ;
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
$this->author_list = "<contributors>";
//rev_deleted
$nothidden = '('.$this->db->bitAnd('rev_deleted', Revision::DELETED_USER) . ') = 0';
$sql = "SELECT DISTINCT rev_user_text,rev_user FROM {$page},{$revision}
WHERE page_id=rev_page AND $nothidden AND " . $cond ;
- $result = $this->db->query( $sql, $fname );
+ $result = $this->db->query( $sql, __METHOD__ );
$resultset = $this->db->resultObject( $result );
- while( $row = $resultset->fetchObject() ) {
+ foreach ( $resultset as $row ) {
$this->author_list .= "<contributor>" .
"<username>" .
htmlentities( $row->rev_user_text ) .
@@ -172,8 +177,8 @@ class WikiExporter {
"</id>" .
"</contributor>";
}
- wfProfileOut( $fname );
$this->author_list .= "</contributors>";
+ wfProfileOut( __METHOD__ );
}
protected function dumpFrom( $cond = '' ) {
@@ -246,12 +251,12 @@ class WikiExporter {
# One, and only one hook should set this, and return false
if( wfRunHooks( 'WikiExporter::dumpStableQuery', array(&$tables,&$opts,&$join) ) ) {
wfProfileOut( __METHOD__ );
- return new WikiError( __METHOD__." given invalid history dump type." );
+ throw new MWException( __METHOD__." given invalid history dump type." );
}
} else {
# Uknown history specification parameter?
wfProfileOut( __METHOD__ );
- return new WikiError( __METHOD__." given invalid history dump type." );
+ throw new MWException( __METHOD__." given invalid history dump type." );
}
# Query optimization hacks
if( $cond == '' ) {
@@ -301,7 +306,7 @@ class WikiExporter {
*/
protected function outputPageStream( $resultset ) {
$last = null;
- while( $row = $resultset->fetchObject() ) {
+ foreach ( $resultset as $row ) {
if( is_null( $last ) ||
$last->page_namespace != $row->page_namespace ||
$last->page_title != $row->page_title ) {
@@ -332,7 +337,7 @@ class WikiExporter {
}
protected function outputLogStream( $resultset ) {
- while( $row = $resultset->fetchObject() ) {
+ foreach ( $resultset as $row ) {
$output = $this->writer->writeLogItem( $row );
$this->sink->writeLogItem( $row, $output );
}
@@ -349,7 +354,7 @@ class XmlDumpWriter {
* @return string
*/
function schemaVersion() {
- return "0.4";
+ return "0.5";
}
/**
@@ -363,7 +368,7 @@ class XmlDumpWriter {
* @return string
*/
function openStream() {
- global $wgContLanguageCode;
+ global $wgLanguageCode;
$ver = $this->schemaVersion();
return Xml::element( 'mediawiki', array(
'xmlns' => "http://www.mediawiki.org/xml/export-$ver/",
@@ -371,7 +376,7 @@ class XmlDumpWriter {
'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
"http://www.mediawiki.org/xml/export-$ver.xsd",
'version' => $ver,
- 'xml:lang' => $wgContLanguageCode ),
+ 'xml:lang' => $wgLanguageCode ),
null ) .
"\n" .
$this->siteInfo();
@@ -477,8 +482,7 @@ class XmlDumpWriter {
* @access private
*/
function writeRevision( $row ) {
- $fname = 'WikiExporter::dumpRev';
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
$out = " <revision>\n";
$out .= " " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
@@ -507,12 +511,12 @@ class XmlDumpWriter {
// Raw text from the database may have invalid chars
$text = strval( Revision::getRevisionText( $row ) );
$out .= " " . Xml::elementClean( 'text',
- array( 'xml:space' => 'preserve' ),
+ array( 'xml:space' => 'preserve', 'bytes' => $row->rev_len ),
strval( $text ) ) . "\n";
} else {
// Stub output
$out .= " " . Xml::element( 'text',
- array( 'id' => $row->rev_text_id ),
+ array( 'id' => $row->rev_text_id, 'bytes' => $row->rev_len ),
"" ) . "\n";
}
@@ -520,7 +524,7 @@ class XmlDumpWriter {
$out .= " </revision>\n";
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $out;
}
@@ -533,8 +537,7 @@ class XmlDumpWriter {
* @access private
*/
function writeLogItem( $row ) {
- $fname = 'WikiExporter::writeLogItem';
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
$out = " <logitem>\n";
$out .= " " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
@@ -568,7 +571,7 @@ class XmlDumpWriter {
$out .= " </logitem>\n";
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $out;
}
@@ -666,7 +669,7 @@ class DumpOutput {
class DumpFileOutput extends DumpOutput {
var $handle;
- function DumpFileOutput( $file ) {
+ function __construct( $file ) {
$this->handle = fopen( $file, "wt" );
}
@@ -682,7 +685,7 @@ class DumpFileOutput extends DumpOutput {
* @ingroup Dump
*/
class DumpPipeOutput extends DumpFileOutput {
- function DumpPipeOutput( $command, $file = null ) {
+ function __construct( $command, $file = null ) {
if( !is_null( $file ) ) {
$command .= " > " . wfEscapeShellArg( $file );
}
@@ -695,8 +698,8 @@ class DumpPipeOutput extends DumpFileOutput {
* @ingroup Dump
*/
class DumpGZipOutput extends DumpPipeOutput {
- function DumpGZipOutput( $file ) {
- parent::DumpPipeOutput( "gzip", $file );
+ function __construct( $file ) {
+ parent::__construct( "gzip", $file );
}
}
@@ -705,8 +708,8 @@ class DumpGZipOutput extends DumpPipeOutput {
* @ingroup Dump
*/
class DumpBZip2Output extends DumpPipeOutput {
- function DumpBZip2Output( $file ) {
- parent::DumpPipeOutput( "bzip2", $file );
+ function __construct( $file ) {
+ parent::__construct( "bzip2", $file );
}
}
@@ -715,12 +718,12 @@ class DumpBZip2Output extends DumpPipeOutput {
* @ingroup Dump
*/
class Dump7ZipOutput extends DumpPipeOutput {
- function Dump7ZipOutput( $file ) {
+ function __construct( $file ) {
$command = "7za a -bd -si " . wfEscapeShellArg( $file );
// Suppress annoying useless crap from p7zip
// Unfortunately this could suppress real error messages too
$command .= ' >' . wfGetNull() . ' 2>&1';
- parent::DumpPipeOutput( $command );
+ parent::__construct( $command );
}
}
@@ -733,7 +736,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
* @ingroup Dump
*/
class DumpFilter {
- function DumpFilter( &$sink ) {
+ function __construct( &$sink ) {
$this->sink =& $sink;
}
@@ -796,8 +799,8 @@ class DumpNamespaceFilter extends DumpFilter {
var $invert = false;
var $namespaces = array();
- function DumpNamespaceFilter( &$sink, $param ) {
- parent::DumpFilter( $sink );
+ function __construct( &$sink, $param ) {
+ parent::__construct( $sink );
$constants = array(
"NS_MAIN" => NS_MAIN,
@@ -882,7 +885,7 @@ class DumpLatestFilter extends DumpFilter {
* @ingroup Dump
*/
class DumpMultiWriter {
- function DumpMultiWriter( $sinks ) {
+ function __construct( $sinks ) {
$this->sinks = $sinks;
$this->count = count( $sinks );
}
@@ -919,8 +922,7 @@ class DumpMultiWriter {
}
function xmlsafe( $string ) {
- $fname = 'xmlsafe';
- wfProfileIn( $fname );
+ wfProfileIn( __FUNCTION__ );
/**
* The page may contain old data which has not been properly normalized.
@@ -930,6 +932,6 @@ function xmlsafe( $string ) {
$string = UtfNormal::cleanUp( $string );
$string = htmlspecialchars( $string );
- wfProfileOut( $fname );
+ wfProfileOut( __FUNCTION__ );
return $string;
}
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
index 1c58f442..7109c1ac 100644
--- a/includes/ExternalEdit.php
+++ b/includes/ExternalEdit.php
@@ -1,7 +1,10 @@
<?php
/**
+ * External editors support
+ *
* License: Public domain
*
+ * @file
* @author Erik Moeller <moeller@scireview.de>
*/
@@ -15,7 +18,6 @@
* and save the modified data back to the server.
*
*/
-
class ExternalEdit {
function __construct( $article, $mode ) {
@@ -51,6 +53,11 @@ class ExternalEdit {
}
$special=$wgLang->getNsText(NS_SPECIAL);
$control = <<<CONTROL
+; You're seeing this file because you're using Mediawiki's External Editor
+; feature. This is probably because you selected use external editor
+; in your preferences. To edit normally, either disable that preference
+; or go to the URL $url .
+; See http://www.mediawiki.org/wiki/Manual:External_editors for details.
[Process]
Type=$type
Engine=MediaWiki
diff --git a/includes/ExternalStore.php b/includes/ExternalStore.php
index 6a779079..ddb40c32 100644
--- a/includes/ExternalStore.php
+++ b/includes/ExternalStore.php
@@ -32,10 +32,17 @@ class ExternalStore {
if( !$wgExternalStores )
return false;
- @list( $proto, $path ) = explode( '://', $url, 2 );
- /* Bad URL */
- if( $path == '' )
+ $parts = explode( '://', $url, 2 );
+
+ if ( count( $parts ) != 2 ) {
+ return false;
+ }
+
+ list( $proto, $path ) = $parts;
+
+ if ( $path == '' ) { // Bad URL
return false;
+ }
$store = self::getStoreObject( $proto, $params );
if ( $store === false )
diff --git a/includes/ExternalStoreDB.php b/includes/ExternalStoreDB.php
index 769c64da..877277a2 100644
--- a/includes/ExternalStoreDB.php
+++ b/includes/ExternalStoreDB.php
@@ -1,26 +1,6 @@
<?php
/**
- * External database storage will use one (or more) separate connection pools
- * from what the main wiki uses. If we load many revisions, such as when doing
- * bulk backups or maintenance, we want to keep them around over the lifetime
- * of the script.
- *
- * Associative array of LoadBalancer objects, indexed by cluster name.
- */
-global $wgExternalLoadBalancers;
-$wgExternalLoadBalancers = array();
-
-/**
- * One-step cache variable to hold base blobs; operations that
- * pull multiple revisions may often pull multiple times from
- * the same blob. By keeping the last-used one open, we avoid
- * redundant unserialization and decompression overhead.
- */
-global $wgExternalBlobCache;
-$wgExternalBlobCache = array();
-
-/**
* DB accessable external objects
* @ingroup ExternalStorage
*/
@@ -113,11 +93,18 @@ class ExternalStoreDB {
* @private
*/
function &fetchBlob( $cluster, $id, $itemID ) {
- global $wgExternalBlobCache;
+ /**
+ * One-step cache variable to hold base blobs; operations that
+ * pull multiple revisions may often pull multiple times from
+ * the same blob. By keeping the last-used one open, we avoid
+ * redundant unserialization and decompression overhead.
+ */
+ static $externalBlobCache = array();
+
$cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
- if( isset( $wgExternalBlobCache[$cacheID] ) ) {
+ if( isset( $externalBlobCache[$cacheID] ) ) {
wfDebug( "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
- return $wgExternalBlobCache[$cacheID];
+ return $externalBlobCache[$cacheID];
}
wfDebug( "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
@@ -138,7 +125,7 @@ class ExternalStoreDB {
$ret = unserialize( $ret );
}
- $wgExternalBlobCache = array( $cacheID => &$ret );
+ $externalBlobCache = array( $cacheID => &$ret );
return $ret;
}
diff --git a/includes/ExternalUser.php b/includes/ExternalUser.php
index 65dae617..d1eff916 100644
--- a/includes/ExternalUser.php
+++ b/includes/ExternalUser.php
@@ -1,21 +1,24 @@
<?php
-
-# Copyright (C) 2009 Aryeh Gregor
-#
-# 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
+/**
+ * Authentication with a foreign database
+ *
+ * Copyright © 2009 Aryeh Gregor
+ *
+ * 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
+ */
/**
* @defgroup ExternalUser ExternalUser
diff --git a/includes/Feed.php b/includes/Feed.php
index 782b6428..bc20a9dc 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -1,34 +1,36 @@
<?php
-
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
- * @defgroup Feed Feed
- *
* Basic support for outputting syndication feeds in RSS, other formats.
+ *
* Contain a feed class as well as classes to build rss / atom ... feeds
* Available feeds are defined in Defines.php
*
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
*/
/**
+ * @defgroup Feed Feed
+ */
+
+/**
* A base class for basic support for outputting syndication feeds in RSS and other formats.
*
* @ingroup Feed
@@ -99,7 +101,7 @@ class FeedItem {
*/
public function setUniqueId($uniqueId, $RSSisPermalink = False) {
$this->UniqueId = $uniqueId;
- $this->RSSIsPermalink = $isPermalink;
+ $this->RSSIsPermalink = $RSSisPermalink;
}
/**
@@ -135,8 +137,8 @@ class FeedItem {
* @return String
*/
public function getLanguage() {
- global $wgContLanguageCode;
- return $wgContLanguageCode;
+ global $wgLanguageCode;
+ return $wgLanguageCode;
}
/**
@@ -303,7 +305,7 @@ class RSSFeed extends ChannelFeed {
<item>
<title><?php print $item->getTitle() ?></title>
<link><?php print $item->getUrl() ?></link>
- <guid<?php if( $item->RSSIsPermalink ) print ' isPermaLink="true"' ?>><?php print $item->getUniqueId() ?></guid>
+ <guid<?php if( !$item->RSSIsPermalink ) print ' isPermaLink="false"' ?>><?php print $item->getUniqueId() ?></guid>
<description><?php print $item->getDescription() ?></description>
<?php if( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ) ?></pubDate><?php } ?>
<?php if( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor() ?></dc:creator><?php }?>
diff --git a/includes/FeedUtils.php b/includes/FeedUtils.php
index 7e841f32..9daffc12 100644
--- a/includes/FeedUtils.php
+++ b/includes/FeedUtils.php
@@ -86,7 +86,7 @@ class FeedUtils {
* @return String
*/
public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext='' ) {
- global $wgFeedDiffCutoff, $wgContLang, $wgUser;
+ global $wgFeedDiffCutoff, $wgLang, $wgUser;
wfProfileIn( __METHOD__ );
$skin = $wgUser->getSkin();
@@ -108,9 +108,9 @@ class FeedUtils {
wfProfileIn( __METHOD__."-dodiff" );
#$diffText = $de->getDiff( wfMsg( 'revisionasof',
- # $wgContLang->timeanddate( $timestamp ),
- # $wgContLang->date( $timestamp ),
- # $wgContLang->time( $timestamp ) ),
+ # $wgLang->timeanddate( $timestamp ),
+ # $wgLang->date( $timestamp ),
+ # $wgLang->time( $timestamp ) ),
# wfMsg( 'currentrev' ) );
// Don't bother generating the diff if we won't be able to show it
@@ -119,12 +119,12 @@ class FeedUtils {
$diffText = $de->getDiff(
wfMsg( 'previousrevision' ), // hack
wfMsg( 'revisionasof',
- $wgContLang->timeanddate( $timestamp ),
- $wgContLang->date( $timestamp ),
- $wgContLang->time( $timestamp ) ) );
+ $wgLang->timeanddate( $timestamp ),
+ $wgLang->date( $timestamp ),
+ $wgLang->time( $timestamp ) ) );
}
- if ( ( strlen( $diffText ) > $wgFeedDiffCutoff ) || ( $wgFeedDiffCutoff <= 0 ) ) {
+ if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
// Omit large diffs
$diffLink = $title->escapeFullUrl(
'diff=' . $newid .
diff --git a/includes/FileDeleteForm.php b/includes/FileDeleteForm.php
index dad19524..030330bb 100644
--- a/includes/FileDeleteForm.php
+++ b/includes/FileDeleteForm.php
@@ -102,34 +102,47 @@ class FileDeleteForm {
public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress ) {
global $wgUser;
$article = null;
+ $status = Status::newFatal( 'error' );
+
if( $oldimage ) {
$status = $file->deleteOld( $oldimage, $reason, $suppress );
if( $status->ok ) {
// Need to do a log item
$log = new LogPage( 'delete' );
$logComment = wfMsgForContent( 'deletedrevision', $oldimage );
- if( trim( $reason ) != '' )
+ if( trim( $reason ) != '' ) {
$logComment .= wfMsgForContent( 'colon-separator' ) . $reason;
- $log->addEntry( 'delete', $title, $logComment );
+ }
+ $log->addEntry( 'delete', $title, $logComment );
}
} else {
- $status = $file->delete( $reason, $suppress );
- if( $status->ok ) {
- $id = $title->getArticleID( GAID_FOR_UPDATE );
- // Need to delete the associated article
- $article = new Article( $title );
- $error = '';
- if( wfRunHooks('ArticleDelete', array(&$article, &$wgUser, &$reason, &$error)) ) {
- if( $article->doDeleteArticle( $reason, $suppress, $id ) ) {
+ $id = $title->getArticleID( Title::GAID_FOR_UPDATE );
+ $article = new Article( $title );
+ $error = '';
+ $dbw = wfGetDB( DB_MASTER );
+ try {
+ if( wfRunHooks( 'ArticleDelete', array( &$article, &$wgUser, &$reason, &$error ) ) ) {
+ // delete the associated article first
+ if( $article->doDeleteArticle( $reason, $suppress, $id, false ) ) {
global $wgRequest;
if( $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn() ) {
$article->doWatch();
} elseif( $title->userIsWatching() ) {
$article->doUnwatch();
}
- wfRunHooks('ArticleDeleteComplete', array(&$article, &$wgUser, $reason, $id));
+ $status = $file->delete( $reason, $suppress );
+ if( $status->ok ) {
+ $dbw->commit();
+ wfRunHooks( 'ArticleDeleteComplete', array( &$article, &$wgUser, $reason, $id ) );
+ } else {
+ $dbw->rollback();
+ }
}
}
+ } catch ( MWException $e ) {
+ // rollback before returning to prevent UI from displaying incorrect "View or restore N deleted edits?"
+ $dbw->rollback();
+ throw $e;
}
}
if( $status->isGood() )
@@ -161,7 +174,7 @@ class FileDeleteForm {
'id' => 'mw-img-deleteconfirm' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'filedelete-legend' ) ) .
- Xml::hidden( 'wpEditToken', $wgUser->editToken( $this->oldimage ) ) .
+ Html::hidden( 'wpEditToken', $wgUser->editToken( $this->oldimage ) ) .
$this->prepareMessage( 'filedelete-intro' ) .
Xml::openElement( 'table', array( 'id' => 'mw-img-deleteconfirm-table' ) ) .
"<tr>
@@ -241,7 +254,6 @@ class FileDeleteForm {
private function prepareMessage( $message ) {
global $wgLang;
if( $this->oldimage ) {
- $url = $this->file->getArchiveUrl( $this->oldimage );
return wfMsgExt(
"{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
'parse',
diff --git a/includes/FileRevertForm.php b/includes/FileRevertForm.php
index eb16693a..47084aad 100644
--- a/includes/FileRevertForm.php
+++ b/includes/FileRevertForm.php
@@ -88,11 +88,11 @@ class FileRevertForm {
* Show the confirmation form
*/
protected function showForm() {
- global $wgOut, $wgUser, $wgRequest, $wgLang, $wgContLang;
+ global $wgOut, $wgUser, $wgLang, $wgContLang;
$timestamp = $this->getTimestamp();
$form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getAction() ) );
- $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken( $this->archiveName ) );
+ $form .= Html::hidden( 'wpEditToken', $wgUser->editToken( $this->archiveName ) );
$form .= '<fieldset><legend>' . wfMsgHtml( 'filerevert-legend' ) . '</legend>';
$form .= wfMsgExt( 'filerevert-intro', 'parse', $this->title->getText(),
$wgLang->date( $timestamp, true ), $wgLang->time( $timestamp, true ),
diff --git a/includes/ForkController.php b/includes/ForkController.php
index 7b889228..e5b44c2b 100644
--- a/includes/ForkController.php
+++ b/includes/ForkController.php
@@ -126,8 +126,6 @@ class ForkController {
* Fork a number of worker processes.
*/
protected function forkWorkers( $numProcs ) {
- global $wgMemc, $wgCaches, $wgMainCacheType;
-
$this->prepareEnvironment();
// Create the child processes
diff --git a/includes/FormOptions.php b/includes/FormOptions.php
index 262c8c7f..2442a330 100644
--- a/includes/FormOptions.php
+++ b/includes/FormOptions.php
@@ -2,16 +2,17 @@
/**
* Helper class to keep track of options when mixing links and form elements.
*
+ * Copyright © 2008, Niklas Laxström
+ *
* @author Niklas Laxström
- * @copyright Copyright © 2008, Niklas Laxström
*/
class FormOptions implements ArrayAccess {
- const AUTO = -1; //! Automatically detects simple data types
+ const AUTO = -1; // ! Automatically detects simple data types
const STRING = 0;
const INT = 1;
const BOOL = 2;
- const INTNULL = 3; //! Useful for namespace selector
+ const INTNULL = 3; // ! Useful for namespace selector
protected $options = array();
@@ -34,15 +35,15 @@ class FormOptions implements ArrayAccess {
public function delete( $name ) {
$this->validateName( $name, true );
- unset($this->options[$name]);
+ unset( $this->options[$name] );
}
public static function guessType( $data ) {
- if ( is_bool($data) ) {
+ if ( is_bool( $data ) ) {
return self::BOOL;
- } elseif( is_int($data) ) {
+ } elseif ( is_int( $data ) ) {
return self::INT;
- } elseif( is_string($data) ) {
+ } elseif ( is_string( $data ) ) {
return self::STRING;
} else {
throw new MWException( 'Unsupported datatype' );
@@ -52,7 +53,7 @@ class FormOptions implements ArrayAccess {
# Handling values
public function validateName( $name, $strict = false ) {
- if ( !isset($this->options[$name]) ) {
+ if ( !isset( $this->options[$name] ) ) {
if ( $strict ) {
throw new MWException( "Invalid option $name" );
} else {
@@ -64,6 +65,7 @@ class FormOptions implements ArrayAccess {
public function setValue( $name, $value, $force = false ) {
$this->validateName( $name, true );
+
if ( !$force && $value === $this->options[$name]['default'] ) {
// null default values as unchanged
$this->options[$name]['value'] = null;
@@ -74,6 +76,7 @@ class FormOptions implements ArrayAccess {
public function getValue( $name ) {
$this->validateName( $name, true );
+
return $this->getValueReal( $this->options[$name] );
}
@@ -93,16 +96,19 @@ class FormOptions implements ArrayAccess {
public function consumeValue( $name ) {
$this->validateName( $name, true );
$this->options[$name]['consumed'] = true;
+
return $this->getValueReal( $this->options[$name] );
}
public function consumeValues( /*Array*/ $names ) {
$out = array();
+
foreach ( $names as $name ) {
$this->validateName( $name, true );
$this->options[$name]['consumed'] = true;
$out[] = $this->getValueReal( $this->options[$name] );
}
+
return $out;
}
@@ -111,8 +117,9 @@ class FormOptions implements ArrayAccess {
public function validateIntBounds( $name, $min, $max ) {
$this->validateName( $name, true );
- if ( $this->options[$name]['type'] !== self::INT )
+ if ( $this->options[$name]['type'] !== self::INT ) {
throw new MWException( "Option $name is not of type int" );
+ }
$value = $this->getValueReal( $this->options[$name] );
$value = max( $min, min( $max, $value ) );
@@ -124,6 +131,7 @@ class FormOptions implements ArrayAccess {
public function getUnconsumedValues( $all = false ) {
$values = array();
+
foreach ( $this->options as $name => $data ) {
if ( !$data['consumed'] ) {
if ( $all || $data['value'] !== null ) {
@@ -131,24 +139,29 @@ class FormOptions implements ArrayAccess {
}
}
}
+
return $values;
}
public function getChangedValues() {
$values = array();
+
foreach ( $this->options as $name => $data ) {
if ( $data['value'] !== null ) {
$values[$name] = $data['value'];
}
}
+
return $values;
}
public function getAllValues() {
$values = array();
+
foreach ( $this->options as $name => $data ) {
$values[$name] = $this->getValueReal( $data );
}
+
return $values;
}
@@ -156,7 +169,7 @@ class FormOptions implements ArrayAccess {
public function fetchValuesFromRequest( WebRequest $r, $values = false ) {
if ( !$values ) {
- $values = array_keys($this->options);
+ $values = array_keys( $this->options );
}
foreach ( $values as $name ) {
@@ -184,7 +197,7 @@ class FormOptions implements ArrayAccess {
/* ArrayAccess methods */
public function offsetExists( $name ) {
- return isset($this->options[$name]);
+ return isset( $this->options[$name] );
}
public function offsetGet( $name ) {
@@ -192,11 +205,10 @@ class FormOptions implements ArrayAccess {
}
public function offsetSet( $name, $value ) {
- return $this->setValue( $name, $value );
+ $this->setValue( $name, $value );
}
public function offsetUnset( $name ) {
- return $this->delete( $name );
+ $this->delete( $name );
}
-
}
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index d6e0f5b4..b21779c1 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -1,15 +1,14 @@
<?php
+/**
+ * Global functions used everywhere
+ * @file
+ */
if ( !defined( 'MEDIAWIKI' ) ) {
die( "This file is part of MediaWiki, it is not a valid entry point" );
}
-/**
- * Global functions used everywhere
- */
-
-require_once dirname(__FILE__) . '/normal/UtfNormalUtil.php';
-require_once dirname(__FILE__) . '/XmlFunctions.php';
+require_once dirname( __FILE__ ) . '/normal/UtfNormalUtil.php';
// Hide compatibility functions from Doxygen
/// @cond
@@ -17,18 +16,27 @@ require_once dirname(__FILE__) . '/XmlFunctions.php';
/**
* Compatibility functions
*
- * We more or less support PHP 5.0.x and up.
+ * We support PHP 5.1.x and up.
* Re-implementations of newer functions or functions in non-standard
* PHP extensions may be included here.
*/
-if( !function_exists('iconv') ) {
+if( !function_exists( 'iconv' ) ) {
# iconv support is not in the default configuration and so may not be present.
# Assume will only ever use utf-8 and iso-8859-1.
# This will *not* work in all circumstances.
function iconv( $from, $to, $string ) {
- if(strcasecmp( $from, $to ) == 0) return $string;
- if(strcasecmp( $from, 'utf-8' ) == 0) return utf8_decode( $string );
- if(strcasecmp( $to, 'utf-8' ) == 0) return utf8_encode( $string );
+ if ( substr( $to, -8 ) == '//IGNORE' ) {
+ $to = substr( $to, 0, strlen( $to ) - 8 );
+ }
+ if( strcasecmp( $from, $to ) == 0 ) {
+ return $string;
+ }
+ if( strcasecmp( $from, 'utf-8' ) == 0 ) {
+ return utf8_decode( $string );
+ }
+ if( strcasecmp( $to, 'utf-8' ) == 0 ) {
+ return utf8_encode( $string );
+ }
return $string;
}
}
@@ -49,41 +57,43 @@ if ( !function_exists( 'mb_substr' ) ) {
$split = mb_substr_split_unicode( $str, intval( $start ) );
$str = substr( $str, $split );
}
-
+
if( $count !== 'end' ) {
$split = mb_substr_split_unicode( $str, intval( $count ) );
$str = substr( $str, 0, $split );
}
-
+
return $str;
}
-
+
function mb_substr_split_unicode( $str, $splitPos ) {
if( $splitPos == 0 ) {
return 0;
}
-
+
$byteLen = strlen( $str );
-
+
if( $splitPos > 0 ) {
if( $splitPos > 256 ) {
// Optimize large string offsets by skipping ahead N bytes.
// This will cut out most of our slow time on Latin-based text,
// and 1/2 to 1/3 on East European and Asian scripts.
$bytePos = $splitPos;
- while ($bytePos < $byteLen && $str{$bytePos} >= "\x80" && $str{$bytePos} < "\xc0")
+ while ( $bytePos < $byteLen && $str{$bytePos} >= "\x80" && $str{$bytePos} < "\xc0" ) {
++$bytePos;
+ }
$charPos = mb_strlen( substr( $str, 0, $bytePos ) );
} else {
$charPos = 0;
$bytePos = 0;
}
-
+
while( $charPos++ < $splitPos ) {
++$bytePos;
// Move past any tail bytes
- while ($bytePos < $byteLen && $str{$bytePos} >= "\x80" && $str{$bytePos} < "\xc0")
+ while ( $bytePos < $byteLen && $str{$bytePos} >= "\x80" && $str{$bytePos} < "\xc0" ) {
++$bytePos;
+ }
}
} else {
$splitPosX = $splitPos + 1;
@@ -92,11 +102,12 @@ if ( !function_exists( 'mb_substr' ) ) {
while( $bytePos > 0 && $charPos-- >= $splitPosX ) {
--$bytePos;
// Move past any tail bytes
- while ($bytePos > 0 && $str{$bytePos} >= "\x80" && $str{$bytePos} < "\xc0")
+ while ( $bytePos > 0 && $str{$bytePos} >= "\x80" && $str{$bytePos} < "\xc0" ) {
--$bytePos;
+ }
}
}
-
+
return $bytePos;
}
}
@@ -108,7 +119,7 @@ if ( !function_exists( 'mb_strlen' ) ) {
* @param string $enc optional encoding; ignored
* @return int
*/
- function mb_strlen( $str, $enc="" ) {
+ function mb_strlen( $str, $enc = '' ) {
$counts = count_chars( $str );
$total = 0;
@@ -135,11 +146,11 @@ if( !function_exists( 'mb_strpos' ) ) {
* @param $encoding String: optional encoding; ignored
* @return int
*/
- function mb_strpos( $haystack, $needle, $offset = 0, $encoding="" ) {
+ function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
$needle = preg_quote( $needle, '/' );
$ar = array();
- preg_match( '/'.$needle.'/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
+ preg_match( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
if( isset( $ar[0][1] ) ) {
return $ar[0][1];
@@ -158,65 +169,17 @@ if( !function_exists( 'mb_strrpos' ) ) {
* @param $encoding String: optional encoding; ignored
* @return int
*/
- function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = "" ) {
+ function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
$needle = preg_quote( $needle, '/' );
$ar = array();
- preg_match_all( '/'.$needle.'/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
+ preg_match_all( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
- if( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
- isset( $ar[0][count($ar[0])-1][1] ) ) {
- return $ar[0][count($ar[0])-1][1];
+ if( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
+ isset( $ar[0][count( $ar[0] ) - 1][1] ) ) {
+ return $ar[0][count( $ar[0] ) - 1][1];
} else {
return false;
- }
- }
-}
-
-if ( !function_exists( 'array_diff_key' ) ) {
- /**
- * Exists in PHP 5.1.0+
- * Not quite compatible, two-argument version only
- * Null values will cause problems due to this use of isset()
- */
- function array_diff_key( $left, $right ) {
- $result = $left;
- foreach ( $left as $key => $unused ) {
- if ( isset( $right[$key] ) ) {
- unset( $result[$key] );
- }
- }
- return $result;
- }
-}
-
-if ( !function_exists( 'array_intersect_key' ) ) {
- /**
- * Exists in 5.1.0+
- * Define our own array_intersect_key function
- */
- function array_intersect_key( $isec, $keys ) {
- $argc = func_num_args();
-
- if ( $argc > 2 ) {
- for ( $i = 1; $isec && $i < $argc; $i++ ) {
- $arr = func_get_arg( $i );
-
- foreach ( array_keys( $isec ) as $key ) {
- if ( !isset( $arr[$key] ) )
- unset( $isec[$key] );
- }
- }
-
- return $isec;
- } else {
- $res = array();
- foreach ( array_keys( $isec ) as $key ) {
- if ( isset( $keys[$key] ) )
- $res[$key] = $isec[$key];
- }
-
- return $res;
}
}
}
@@ -234,6 +197,16 @@ if ( !function_exists( 'istainted' ) ) {
define( 'TC_PCRE', 1 );
define( 'TC_SELF', 1 );
}
+
+// array_fill_keys() was only added in 5.2, but people use it anyway
+// add a back-compat layer for 5.1. See bug 27781
+if( !function_exists( 'array_fill_keys' ) ) {
+ function array_fill_keys( $keys, $value ) {
+ return array_combine( $keys, array_fill( 0, count( $keys ), $value ) );
+ }
+}
+
+
/// @endcond
@@ -251,7 +224,7 @@ function wfArrayDiff2_cmp( $a, $b ) {
} else {
reset( $a );
reset( $b );
- while( ( list( $keyA, $valueA ) = each( $a ) ) && ( list( $keyB, $valueB ) = each( $b ) ) ) {
+ while( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
$cmp = strcmp( $valueA, $valueB );
if ( $cmp !== 0 ) {
return $cmp;
@@ -264,9 +237,10 @@ function wfArrayDiff2_cmp( $a, $b ) {
/**
* Seed Mersenne Twister
* No-op for compatibility; only necessary in PHP < 4.2.0
+ * @deprecated. Remove in 1.18
*/
function wfSeedRandom() {
- /* No-op */
+ wfDeprecated(__FUNCTION__);
}
/**
@@ -280,7 +254,7 @@ function wfRandom() {
# The maximum random value is "only" 2^31-1, so get two random
# values to reduce the chance of dupes
$max = mt_getrandmax() + 1;
- $rand = number_format( (mt_rand() * $max + mt_rand())
+ $rand = number_format( ( mt_rand() * $max + mt_rand() )
/ $max / $max, 12, '.', '' );
return $rand;
}
@@ -299,16 +273,27 @@ function wfRandom() {
*
* ;:@$!*(),/
*
+ * However, IIS7 redirects fail when the url contains a colon (Bug 22709),
+ * so no fancy : for IIS7.
+ *
* %2F in the page titles seems to fatally break for some reason.
*
* @param $s String:
* @return string
*/
function wfUrlencode( $s ) {
+ static $needle;
+ if ( is_null( $needle ) ) {
+ $needle = array( '%3B', '%40', '%24', '%21', '%2A', '%28', '%29', '%2C', '%2F' );
+ if ( !isset( $_SERVER['SERVER_SOFTWARE'] ) || ( strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/7' ) === false ) ) {
+ $needle[] = '%3A';
+ }
+ }
+
$s = urlencode( $s );
$s = str_ireplace(
- array( '%3B','%3A','%40','%24','%21','%2A','%28','%29','%2C','%2F' ),
- array( ';', ':', '@', '$', '!', '*', '(', ')', ',', '/' ),
+ $needle,
+ array( ';', '@', '$', '!', '*', '(', ')', ',', '/', ':' ),
$s
);
@@ -371,7 +356,9 @@ function wfDebug( $text, $logonly = false ) {
function wfDebugTimer() {
global $wgDebugTimestamps;
- if ( !$wgDebugTimestamps ) return '';
+ if ( !$wgDebugTimestamps ) {
+ return '';
+ }
static $start = null;
if ( $start === null ) {
@@ -409,7 +396,7 @@ function wfDebugMem( $exact = false ) {
*/
function wfDebugLog( $logGroup, $text, $public = true ) {
global $wgDebugLogGroups, $wgShowHostnames;
- $text = trim($text)."\n";
+ $text = trim( $text ) . "\n";
if( isset( $wgDebugLogGroups[$logGroup] ) ) {
$time = wfTimestamp( TS_DB );
$wiki = wfWikiID();
@@ -419,7 +406,7 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
$host = '';
}
wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
- } else if ( $public === true ) {
+ } elseif ( $public === true ) {
wfDebug( $text, true );
}
}
@@ -432,28 +419,27 @@ function wfLogDBError( $text ) {
global $wgDBerrorLog, $wgDBname;
if ( $wgDBerrorLog ) {
$host = trim(`hostname`);
- $text = date('D M j G:i:s T Y') . "\t$host\t$wgDBname\t$text";
+ $text = date( 'D M j G:i:s T Y' ) . "\t$host\t$wgDBname\t$text";
wfErrorLog( $text, $wgDBerrorLog );
}
}
/**
* Log to a file without getting "file size exceeded" signals.
- *
- * Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
+ *
+ * Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
* send lines to the specified port, prefixed by the specified prefix and a space.
*/
function wfErrorLog( $text, $file ) {
if ( substr( $file, 0, 4 ) == 'udp:' ) {
+ # Needs the sockets extension
if ( preg_match( '!^(tcp|udp):(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $file, $m ) ) {
// IPv6 bracketed host
- $protocol = $m[1];
$host = $m[2];
$port = intval( $m[3] );
$prefix = isset( $m[4] ) ? $m[4] : false;
$domain = AF_INET6;
} elseif ( preg_match( '!^(tcp|udp):(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) {
- $protocol = $m[1];
$host = $m[2];
if ( !IP::isIPv4( $host ) ) {
$host = gethostbyname( $host );
@@ -462,7 +448,7 @@ function wfErrorLog( $text, $file ) {
$prefix = isset( $m[4] ) ? $m[4] : false;
$domain = AF_INET;
} else {
- throw new MWException( __METHOD__.": Invalid UDP specification" );
+ throw new MWException( __METHOD__ . ': Invalid UDP specification' );
}
// Clean it up for the multiplexer
if ( strval( $prefix ) !== '' ) {
@@ -496,29 +482,39 @@ function wfLogProfilingData() {
global $wgRequestTime, $wgDebugLogFile, $wgDebugRawPage, $wgRequest;
global $wgProfiler, $wgProfileLimit, $wgUser;
# Profiling must actually be enabled...
- if( !isset( $wgProfiler ) ) return;
+ if( is_null( $wgProfiler ) ) {
+ return;
+ }
# Get total page request time
$now = wfTime();
$elapsed = $now - $wgRequestTime;
# Only show pages that longer than $wgProfileLimit time (default is 0)
- if( $elapsed <= $wgProfileLimit ) return;
+ if( $elapsed <= $wgProfileLimit ) {
+ return;
+ }
$prof = wfGetProfilingOutput( $wgRequestTime, $elapsed );
$forward = '';
- if( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) )
+ if( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
$forward = ' forwarded for ' . $_SERVER['HTTP_X_FORWARDED_FOR'];
- if( !empty( $_SERVER['HTTP_CLIENT_IP'] ) )
+ }
+ if( !empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
$forward .= ' client IP ' . $_SERVER['HTTP_CLIENT_IP'];
- if( !empty( $_SERVER['HTTP_FROM'] ) )
+ }
+ if( !empty( $_SERVER['HTTP_FROM'] ) ) {
$forward .= ' from ' . $_SERVER['HTTP_FROM'];
- if( $forward )
+ }
+ if( $forward ) {
$forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})";
+ }
// Don't unstub $wgUser at this late stage just for statistics purposes
- if( StubObject::isRealObject($wgUser) && $wgUser->isAnon() )
+ // FIXME: We can detect some anons even if it is not loaded. See User::getId()
+ if( $wgUser->mDataLoaded && $wgUser->isAnon() ) {
$forward .= ' anon';
+ }
$log = sprintf( "%s\t%04.3f\t%s\n",
- gmdate( 'YmdHis' ), $elapsed,
- urldecode( $wgRequest->getRequestURL() . $forward ) );
- if ( $wgDebugLogFile != '' && ( $wgRequest->getVal('action') != 'raw' || $wgDebugRawPage ) ) {
+ gmdate( 'YmdHis' ), $elapsed,
+ urldecode( $wgRequest->getRequestURL() . $forward ) );
+ if ( $wgDebugLogFile != '' && ( $wgRequest->getVal( 'action' ) != 'raw' || $wgDebugRawPage ) ) {
wfErrorLog( $log . $prof, $wgDebugLogFile );
}
}
@@ -566,28 +562,33 @@ function wfReadOnlyReason() {
* functionality), or if it is true then use the wikis
* @return Language object
*/
-function wfGetLangObj( $langcode = false ){
+function wfGetLangObj( $langcode = false ) {
# Identify which language to get or create a language object for.
- if( $langcode instanceof Language )
- # Great, we already have the object!
+ # Using is_object here due to Stub objects.
+ if( is_object( $langcode ) ) {
+ # Great, we already have the object (hopefully)!
return $langcode;
-
- global $wgContLang;
- if( $langcode === $wgContLang->getCode() || $langcode === true )
+ }
+
+ global $wgContLang, $wgLanguageCode;
+ if( $langcode === true || $langcode === $wgLanguageCode ) {
# $langcode is the language code of the wikis content language object.
# or it is a boolean and value is true
return $wgContLang;
-
+ }
+
global $wgLang;
- if( $langcode === $wgLang->getCode() || $langcode === false )
+ if( $langcode === false || $langcode === $wgLang->getCode() ) {
# $langcode is the language code of user language object.
# or it was a boolean and value is false
return $wgLang;
+ }
$validCodes = array_keys( Language::getLanguageNames() );
- if( in_array( $langcode, $validCodes ) )
+ if( in_array( $langcode, $validCodes ) ) {
# $langcode corresponds to a valid language.
return Language::factory( $langcode );
+ }
# $langcode is a string, but not a valid language code; use content language.
wfDebug( "Invalid language code passed to wfGetLangObj, falling back to content language.\n" );
@@ -595,6 +596,36 @@ function wfGetLangObj( $langcode = false ){
}
/**
+ * Use this instead of $wgContLang, when working with user interface.
+ * User interface is currently hard coded according to wiki content language
+ * in many ways, especially regarding to text direction. There is lots stuff
+ * to fix, hence this function to keep the old behaviour unless the global
+ * $wgBetterDirectionality is enabled (or removed when everything works).
+ */
+function wfUILang() {
+ global $wgBetterDirectionality;
+ return wfGetLangObj( !$wgBetterDirectionality );
+}
+
+/**
+ * This is the new function for getting translated interface messages.
+ * See the Message class for documentation how to use them.
+ * The intention is that this function replaces all old wfMsg* functions.
+ * @param $key \string Message key.
+ * Varargs: normal message parameters.
+ * @return \type{Message}
+ * @since 1.17
+ */
+function wfMessage( $key /*...*/) {
+ $params = func_get_args();
+ array_shift( $params );
+ if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+ $params = $params[0];
+ }
+ return new Message( $key, $params );
+}
+
+/**
* Get a message from anywhere, for the current user language.
*
* Use wfMsgForContent() instead if the message should NOT
@@ -604,7 +635,7 @@ function wfGetLangObj( $langcode = false ){
* defined in languages/Language.php
*
* This function also takes extra optional parameters (not
- * shown in the function definition), which can by used to
+ * shown in the function definition), which can be used to
* insert variable text into the predefined message.
*/
function wfMsg( $key ) {
@@ -626,7 +657,7 @@ function wfMsgNoTrans( $key ) {
* Get a message from anywhere, for the current global language
* set with $wgLanguageCode.
*
- * Use this if the message should NOT change dependent on the
+ * Use this if the message should NOT change dependent on the
* language set in the user's preferences. This is the case for
* most text written into logs, as well as link targets (such as
* the name of the copyright policy page). Link titles, on the
@@ -638,8 +669,8 @@ function wfMsgNoTrans( $key ) {
*
* Be wary of this distinction: If you use wfMsg() where you should
* use wfMsgForContent(), a user of the software may have to
- * customize over 70 messages in order to, e.g., fix a link in every
- * possible language.
+ * customize potentially hundreds of messages in
+ * order to, e.g., fix a link in every possible language.
*
* @param $key String: lookup key for the message, usually
* defined in languages/Language.php
@@ -651,7 +682,9 @@ function wfMsgForContent( $key ) {
$forcontent = true;
if( is_array( $wgForceUIMsgAsContentMsg ) &&
in_array( $key, $wgForceUIMsgAsContentMsg ) )
+ {
$forcontent = false;
+ }
return wfMsgReal( $key, $args, true, $forcontent );
}
@@ -665,7 +698,9 @@ function wfMsgForContentNoTrans( $key ) {
$forcontent = true;
if( is_array( $wgForceUIMsgAsContentMsg ) &&
in_array( $key, $wgForceUIMsgAsContentMsg ) )
+ {
$forcontent = false;
+ }
return wfMsgReal( $key, $args, true, $forcontent, false );
}
@@ -688,7 +723,9 @@ function wfMsgNoDBForContent( $key ) {
$forcontent = true;
if( is_array( $wgForceUIMsgAsContentMsg ) &&
in_array( $key, $wgForceUIMsgAsContentMsg ) )
+ {
$forcontent = false;
+ }
return wfMsgReal( $key, $args, false, $forcontent );
}
@@ -698,8 +735,8 @@ function wfMsgNoDBForContent( $key ) {
* @param $key String: key to get.
* @param $args
* @param $useDB Boolean
- * @param $transform Boolean: Whether or not to transform the message.
* @param $forContent Mixed: Language code, or false for user lang, true for content lang.
+ * @param $transform Boolean: Whether or not to transform the message.
* @return String: the requested message.
*/
function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) {
@@ -716,10 +753,11 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
*/
function wfMsgWeirdKey( $key ) {
$source = wfMsgGetKey( $key, false, true, false );
- if ( wfEmptyMsg( $key, $source ) )
- return "";
- else
+ if ( wfEmptyMsg( $key, $source ) ) {
+ return '';
+ } else {
return $source;
+ }
}
/**
@@ -730,33 +768,22 @@ function wfMsgWeirdKey( $key ) {
* behaves as a content language switch if it is a boolean.
* @param $transform Boolean: whether to parse magic words, etc.
* @return string
- * @private
*/
function wfMsgGetKey( $key, $useDB, $langCode = false, $transform = true ) {
- global $wgContLang, $wgMessageCache;
+ global $wgMessageCache;
- wfRunHooks('NormalizeMessageKey', array(&$key, &$useDB, &$langCode, &$transform));
-
- # If $wgMessageCache isn't initialised yet, try to return something sensible.
- if( is_object( $wgMessageCache ) ) {
- $message = $wgMessageCache->get( $key, $useDB, $langCode );
- if ( $transform ) {
- $message = $wgMessageCache->transform( $message );
- }
- } else {
- $lang = wfGetLangObj( $langCode );
+ wfRunHooks( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) );
- # MessageCache::get() does this already, Language::getMessage() doesn't
- # ISSUE: Should we try to handle "message/lang" here too?
- $key = str_replace( ' ' , '_' , $wgContLang->lcfirst( $key ) );
-
- if( is_object( $lang ) ) {
- $message = $lang->getMessage( $key );
- } else {
- $message = false;
- }
+ if ( !is_object( $wgMessageCache ) ) {
+ throw new MWException( 'Trying to get message before message cache is initialised' );
}
+ $message = $wgMessageCache->get( $key, $useDB, $langCode );
+ if( $message === false ) {
+ $message = '&lt;' . htmlspecialchars( $key ) . '&gt;';
+ } elseif ( $transform ) {
+ $message = $wgMessageCache->transform( $message );
+ }
return $message;
}
@@ -780,7 +807,7 @@ function wfMsgReplaceArgs( $message, $args ) {
}
$replacementKeys = array();
foreach( $args as $n => $param ) {
- $replacementKeys['$' . ($n + 1)] = $param;
+ $replacementKeys['$' . ( $n + 1 )] = $param;
}
$message = strtr( $message, $replacementKeys );
}
@@ -827,17 +854,17 @@ function wfMsgWikiHtml( $key ) {
* Returns message in the requested format
* @param $key String: key of the message
* @param $options Array: processing rules. Can take the following options:
- * <i>parse</i>: parses wikitext to html
- * <i>parseinline</i>: parses wikitext to html and removes the surrounding
+ * <i>parse</i>: parses wikitext to HTML
+ * <i>parseinline</i>: parses wikitext to HTML and removes the surrounding
* p's added by parser or tidy
* <i>escape</i>: filters message through htmlspecialchars
- * <i>escapenoentities</i>: same, but allows entity references like &nbsp; through
+ * <i>escapenoentities</i>: same, but allows entity references like &#160; through
* <i>replaceafter</i>: parameters are substituted after parsing or escaping
* <i>parsemag</i>: transform the message using magic phrases
* <i>content</i>: fetch message for content language instead of interface
* Also can accept a single associative argument, of the form 'language' => 'xx':
* <i>language</i>: Language object or language code to fetch message for
- * (overriden by <i>content</i>), its behaviour with parser, parseinline
+ * (overriden by <i>content</i>), its behaviour with parse, parseinline
* and parsemag is undefined.
* Behavior for conflicting options (e.g., parse+parseinline) is undefined.
*/
@@ -861,10 +888,10 @@ function wfMsgExt( $key, $options ) {
}
}
- if( in_array('content', $options, true ) ) {
+ if( in_array( 'content', $options, true ) ) {
$forContent = true;
$langCode = true;
- } elseif( array_key_exists('language', $options) ) {
+ } elseif( array_key_exists( 'language', $options ) ) {
$forContent = false;
$langCode = wfGetLangObj( $options['language'] );
} else {
@@ -874,19 +901,19 @@ function wfMsgExt( $key, $options ) {
$string = wfMsgGetKey( $key, /*DB*/true, $langCode, /*Transform*/false );
- if( !in_array('replaceafter', $options, true ) ) {
+ if( !in_array( 'replaceafter', $options, true ) ) {
$string = wfMsgReplaceArgs( $string, $args );
}
- if( in_array('parse', $options, true ) ) {
+ if( in_array( 'parse', $options, true ) ) {
$string = $wgOut->parse( $string, true, !$forContent );
- } elseif ( in_array('parseinline', $options, true ) ) {
+ } elseif ( in_array( 'parseinline', $options, true ) ) {
$string = $wgOut->parse( $string, true, !$forContent );
$m = array();
if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
$string = $m[1];
}
- } elseif ( in_array('parsemag', $options, true ) ) {
+ } elseif ( in_array( 'parsemag', $options, true ) ) {
global $wgMessageCache;
if ( isset( $wgMessageCache ) ) {
$string = $wgMessageCache->transform( $string,
@@ -895,13 +922,13 @@ function wfMsgExt( $key, $options ) {
}
}
- if ( in_array('escape', $options, true ) ) {
+ if ( in_array( 'escape', $options, true ) ) {
$string = htmlspecialchars ( $string );
- } elseif ( in_array( 'escapenoentities', $options, true ) ) {
+ } elseif ( in_array( 'escapenoentities', $options, true ) ) {
$string = Sanitizer::escapeHtmlAllowEntities( $string );
}
- if( in_array('replaceafter', $options, true ) ) {
+ if( in_array( 'replaceafter', $options, true ) ) {
$string = wfMsgReplaceArgs( $string, $args );
}
@@ -913,24 +940,26 @@ function wfMsgExt( $key, $options ) {
* Just like exit() but makes a note of it.
* Commits open transactions except if the error parameter is set
*
- * @deprecated Please return control to the caller or throw an exception
+ * @deprecated Please return control to the caller or throw an exception. Will
+ * be removed in 1.19.
*/
-function wfAbruptExit( $error = false ){
+function wfAbruptExit( $error = false ) {
static $called = false;
- if ( $called ){
+ if ( $called ) {
exit( -1 );
}
$called = true;
+ wfDeprecated( __FUNCTION__ );
$bt = wfDebugBacktrace();
if( $bt ) {
- for($i = 0; $i < count($bt) ; $i++){
- $file = isset($bt[$i]['file']) ? $bt[$i]['file'] : "unknown";
- $line = isset($bt[$i]['line']) ? $bt[$i]['line'] : "unknown";
- wfDebug("WARNING: Abrupt exit in $file at line $line\n");
+ for( $i = 0; $i < count( $bt ); $i++ ) {
+ $file = isset( $bt[$i]['file'] ) ? $bt[$i]['file'] : 'unknown';
+ $line = isset( $bt[$i]['line'] ) ? $bt[$i]['line'] : 'unknown';
+ wfDebug( "WARNING: Abrupt exit in $file at line $line\n");
}
} else {
- wfDebug("WARNING: Abrupt exit\n");
+ wfDebug( "WARNING: Abrupt exit\n" );
}
wfLogProfilingData();
@@ -942,9 +971,11 @@ function wfAbruptExit( $error = false ){
}
/**
- * @deprecated Please return control the caller or throw an exception
+ * @deprecated Please return control the caller or throw an exception. Will
+ * be removed in 1.19.
*/
function wfErrorExit() {
+ wfDeprecated( __FUNCTION__ );
wfAbruptExit( true );
}
@@ -953,7 +984,7 @@ function wfErrorExit() {
* Plain die() fails to return nonzero to the shell if you pass a string.
* @param $msg String
*/
-function wfDie( $msg='' ) {
+function wfDie( $msg = '' ) {
echo $msg;
die( 1 );
}
@@ -1008,8 +1039,8 @@ function wfReportTime() {
$elapsed = $now - $wgRequestTime;
return $wgShowHostnames
- ? sprintf( "<!-- Served by %s in %01.3f secs. -->", wfHostname(), $elapsed )
- : sprintf( "<!-- Served in %01.3f secs. -->", $elapsed );
+ ? sprintf( '<!-- Served by %s in %01.3f secs. -->', wfHostname(), $elapsed )
+ : sprintf( '<!-- Served in %01.3f secs. -->', $elapsed );
}
/**
@@ -1062,7 +1093,7 @@ function wfBacktrace() {
foreach( $backtrace as $call ) {
if( isset( $call['file'] ) ) {
$f = explode( DIRECTORY_SEPARATOR, $call['file'] );
- $file = $f[count($f)-1];
+ $file = $f[count( $f ) - 1];
} else {
$file = '-';
}
@@ -1076,7 +1107,9 @@ function wfBacktrace() {
} else {
$msg .= '<li>' . $file . ' line ' . $line . ' calls ';
}
- if( !empty( $call['class'] ) ) $msg .= $call['class'] . '::';
+ if( !empty( $call['class'] ) ) {
+ $msg .= $call['class'] . '::';
+ }
$msg .= $call['function'] . '()';
if ( $wgCommandLineMode ) {
@@ -1103,8 +1136,12 @@ function wfBacktrace() {
*/
function wfShowingResults( $offset, $limit ) {
global $wgLang;
- return wfMsgExt( 'showingresults', array( 'parseinline' ), $wgLang->formatNum( $limit ),
- $wgLang->formatNum( $offset+1 ) );
+ return wfMsgExt(
+ 'showingresults',
+ array( 'parseinline' ),
+ $wgLang->formatNum( $limit ),
+ $wgLang->formatNum( $offset + 1 )
+ );
}
/**
@@ -1112,8 +1149,13 @@ function wfShowingResults( $offset, $limit ) {
*/
function wfShowingResultsNum( $offset, $limit, $num ) {
global $wgLang;
- return wfMsgExt( 'showingresultsnum', array( 'parseinline' ), $wgLang->formatNum( $limit ),
- $wgLang->formatNum( $offset+1 ), $wgLang->formatNum( $num ) );
+ return wfMsgExt(
+ 'showingresultsnum',
+ array( 'parseinline' ),
+ $wgLang->formatNum( $limit ),
+ $wgLang->formatNum( $offset + 1 ),
+ $wgLang->formatNum( $num )
+ );
}
/**
@@ -1129,11 +1171,11 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
$fmtLimit = $wgLang->formatNum( $limit );
// FIXME: Why on earth this needs one message for the text and another one for tooltip??
# Get prev/next link display text
- $prev = wfMsgExt( 'prevn', array('parsemag','escape'), $fmtLimit );
- $next = wfMsgExt( 'nextn', array('parsemag','escape'), $fmtLimit );
+ $prev = wfMsgExt( 'prevn', array( 'parsemag', 'escape' ), $fmtLimit );
+ $next = wfMsgExt( 'nextn', array( 'parsemag', 'escape' ), $fmtLimit );
# Get prev/next link title text
- $pTitle = wfMsgExt( 'prevn-title', array('parsemag','escape'), $fmtLimit );
- $nTitle = wfMsgExt( 'nextn-title', array('parsemag','escape'), $fmtLimit );
+ $pTitle = wfMsgExt( 'prevn-title', array( 'parsemag', 'escape' ), $fmtLimit );
+ $nTitle = wfMsgExt( 'nextn-title', array( 'parsemag', 'escape' ), $fmtLimit );
# Fetch the title object
if( is_object( $link ) ) {
$title =& $link;
@@ -1146,28 +1188,28 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
# Make 'previous' link
if( 0 != $offset ) {
$po = $offset - $limit;
- $po = max($po,0);
+ $po = max( $po, 0 );
$q = "limit={$limit}&offset={$po}";
if( $query != '' ) {
- $q .= '&'.$query;
+ $q .= '&' . $query;
}
- $plink = '<a href="' . $title->escapeLocalUrl( $q ) . "\" title=\"{$pTitle}\" class=\"mw-prevlink\">{$prev}</a>";
- } else {
+ $plink = '<a href="' . $title->escapeLocalURL( $q ) . "\" title=\"{$pTitle}\" class=\"mw-prevlink\">{$prev}</a>";
+ } else {
$plink = $prev;
}
# Make 'next' link
$no = $offset + $limit;
$q = "limit={$limit}&offset={$no}";
if( $query != '' ) {
- $q .= '&'.$query;
+ $q .= '&' . $query;
}
if( $atend ) {
$nlink = $next;
} else {
- $nlink = '<a href="' . $title->escapeLocalUrl( $q ) . "\" title=\"{$nTitle}\" class=\"mw-nextlink\">{$next}</a>";
+ $nlink = '<a href="' . $title->escapeLocalURL( $q ) . "\" title=\"{$nTitle}\" class=\"mw-nextlink\">{$next}</a>";
}
# Make links to set number of items per page
- $nums = $wgLang->pipeList( array(
+ $nums = $wgLang->pipeList( array(
wfNumLink( $offset, 20, $title, $query ),
wfNumLink( $offset, 50, $title, $query ),
wfNumLink( $offset, 100, $title, $query ),
@@ -1186,15 +1228,15 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
*/
function wfNumLink( $offset, $limit, $title, $query = '' ) {
global $wgLang;
- if( $query == '' ) {
+ if( $query == '' ) {
$q = '';
- } else {
+ } else {
$q = $query.'&';
}
$q .= "limit={$limit}&offset={$offset}";
$fmtLimit = $wgLang->formatNum( $limit );
- $lTitle = wfMsgExt('shown-title',array('parsemag','escape'),$limit);
- $s = '<a href="' . $title->escapeLocalUrl( $q ) . "\" title=\"{$lTitle}\" class=\"mw-numlink\">{$fmtLimit}</a>";
+ $lTitle = wfMsgExt( 'shown-title', array( 'parsemag', 'escape' ), $limit );
+ $s = '<a href="' . $title->escapeLocalURL( $q ) . "\" title=\"{$lTitle}\" class=\"mw-numlink\">{$fmtLimit}</a>";
return $s;
}
@@ -1205,19 +1247,28 @@ function wfNumLink( $offset, $limit, $title, $query = '' ) {
* @return bool Whereas client accept gzip compression
*/
function wfClientAcceptsGzip() {
- if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
- # FIXME: we may want to blacklist some broken browsers
- $m = array();
- if( preg_match(
- '/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
- $_SERVER['HTTP_ACCEPT_ENCODING'],
- $m ) ) {
- if( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) return false;
- wfDebug( " accepts gzip\n" );
- return true;
+ static $result = null;
+ if ( $result === null ) {
+ $result = false;
+ if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
+ # FIXME: we may want to blacklist some broken browsers
+ $m = array();
+ if( preg_match(
+ '/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
+ $_SERVER['HTTP_ACCEPT_ENCODING'],
+ $m )
+ )
+ {
+ if( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) {
+ $result = false;
+ return $result;
+ }
+ wfDebug( " accepts gzip\n" );
+ $result = true;
+ }
}
}
- return false;
+ return $result;
}
/**
@@ -1246,9 +1297,12 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
*/
function wfEscapeWikiText( $text ) {
$text = str_replace(
- array( '[', '|', ']', '\'', 'ISBN ', 'RFC ', '://', "\n=", '{{' ), # }}
- array( '&#91;', '&#124;', '&#93;', '&#39;', 'ISBN&#32;', 'RFC&#32;', '&#58;//', "\n&#61;", '&#123;&#123;' ),
- htmlspecialchars($text) );
+ array( '[', '|', ']', '\'', 'ISBN ',
+ 'RFC ', '://', "\n=", '{{', '}}' ),
+ array( '&#91;', '&#124;', '&#93;', '&#39;', 'ISBN&#32;',
+ 'RFC&#32;', '&#58;//', "\n&#61;", '&#123;&#123;', '&#125;&#125;' ),
+ htmlspecialchars( $text )
+ );
return $text;
}
@@ -1266,7 +1320,9 @@ function wfQuotedPrintable( $string, $charset = '' ) {
$illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
$replace = $illegal . '\t ?_';
- if( !preg_match( "/[$illegal]/", $string ) ) return $string;
+ if( !preg_match( "/[$illegal]/", $string ) ) {
+ return $string;
+ }
$out = "=?$charset?Q?";
$out .= preg_replace( "/([$replace])/e", 'sprintf("=%02X",ord("$1"))', $string );
$out .= '?=';
@@ -1279,7 +1335,7 @@ function wfQuotedPrintable( $string, $charset = '' ) {
* @return float
*/
function wfTime() {
- return microtime(true);
+ return microtime( true );
}
/**
@@ -1298,7 +1354,7 @@ function wfSetVar( &$dest, $source ) {
* As for wfSetVar except setting a bit
*/
function wfSetBit( &$dest, $bit, $state = true ) {
- $temp = (bool)($dest & $bit );
+ $temp = (bool)( $dest & $bit );
if ( !is_null( $state ) ) {
if ( $state ) {
$dest |= $bit;
@@ -1314,8 +1370,7 @@ function wfSetBit( &$dest, $bit, $state = true ) {
* "days=7&limit=100". Options in the first array override options in the second.
* Options set to "" will not be output.
*/
-function wfArrayToCGI( $array1, $array2 = null )
-{
+function wfArrayToCGI( $array1, $array2 = null ) {
if ( !is_null( $array2 ) ) {
$array1 = $array1 + $array2;
}
@@ -1357,7 +1412,7 @@ function wfArrayToCGI( $array1, $array2 = null )
* @return array Array version of input
*/
function wfCgiToArray( $query ) {
- if( isset( $query[0] ) and $query[0] == '?' ) {
+ if( isset( $query[0] ) && $query[0] == '?' ) {
$query = substr( $query, 1 );
}
$bits = explode( '&', $query );
@@ -1399,16 +1454,19 @@ function wfAppendQuery( $url, $query ) {
/**
* Expand a potentially local URL to a fully-qualified URL. Assumes $wgServer
- * is correct. Also doesn't handle any type of relative URL except one
- * starting with a single "/": this won't work with current-path-relative URLs
- * like "subdir/foo.html", protocol-relative URLs like
- * "//en.wikipedia.org/wiki/", etc. TODO: improve this!
+ * and $wgProto are correct.
+ *
+ * @todo this won't work with current-path-relative URLs
+ * like "subdir/foo.html", etc.
*
* @param $url String: either fully-qualified or a local path + query
* @return string Fully-qualified URL
*/
function wfExpandUrl( $url ) {
- if( substr( $url, 0, 1 ) == '/' ) {
+ if( substr( $url, 0, 2 ) == '//' ) {
+ global $wgProto;
+ return $wgProto . ':' . $url;
+ } elseif( substr( $url, 0, 1 ) == '/' ) {
global $wgServer;
return $wgServer . $url;
} else {
@@ -1417,19 +1475,11 @@ function wfExpandUrl( $url ) {
}
/**
- * This is obsolete, use SquidUpdate::purge()
- * @deprecated
- */
-function wfPurgeSquidServers ($urlArr) {
- SquidUpdate::purge( $urlArr );
-}
-
-/**
* Windows-compatible version of escapeshellarg()
* Windows doesn't recognise single-quotes in the shell, but the escapeshellarg()
* function puts single quotes in regardless of OS.
*
- * Also fixes the locale problems on Linux in PHP 5.2.6+ (bug backported to
+ * Also fixes the locale problems on Linux in PHP 5.2.6+ (bug backported to
* earlier distro releases of PHP)
*/
function wfEscapeShellArg( ) {
@@ -1451,14 +1501,19 @@ function wfEscapeShellArg( ) {
// Double the backslashes before any double quotes. Escape the double quotes.
$tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
$arg = '';
- $delim = false;
+ $iteration = 0;
foreach ( $tokens as $token ) {
- if ( $delim ) {
+ if ( $iteration % 2 == 1 ) {
+ // Delimiter, a double quote preceded by zero or more slashes
$arg .= str_replace( '\\', '\\\\', substr( $token, 0, -1 ) ) . '\\"';
- } else {
+ } elseif ( $iteration % 4 == 2 ) {
+ // ^ in $token will be outside quotes, need to be escaped
+ $arg .= str_replace( '^', '^^', $token );
+ } else { // $iteration % 4 == 0
+ // ^ in $token will appear inside double quotes, so leave as is
$arg .= $token;
}
- $delim = !$delim;
+ $iteration++;
}
// Double the backslashes before the end of the string, because
// we will soon add a quote
@@ -1480,12 +1535,16 @@ function wfEscapeShellArg( ) {
* wfMerge attempts to merge differences between three texts.
* Returns true for a clean merge and false for failure or a conflict.
*/
-function wfMerge( $old, $mine, $yours, &$result ){
+function wfMerge( $old, $mine, $yours, &$result ) {
global $wgDiff3;
# This check may also protect against code injection in
# case of broken installations.
- if( !$wgDiff3 || !file_exists( $wgDiff3 ) ) {
+ wfSuppressWarnings();
+ $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
+ wfRestoreWarnings();
+
+ if( !$haveDiff3 ) {
wfDebug( "diff3 not found\n" );
return false;
}
@@ -1496,18 +1555,21 @@ function wfMerge( $old, $mine, $yours, &$result ){
$mytextFile = fopen( $mytextName = tempnam( $td, 'merge-mine-' ), 'w' );
$yourtextFile = fopen( $yourtextName = tempnam( $td, 'merge-your-' ), 'w' );
- fwrite( $oldtextFile, $old ); fclose( $oldtextFile );
- fwrite( $mytextFile, $mine ); fclose( $mytextFile );
- fwrite( $yourtextFile, $yours ); fclose( $yourtextFile );
+ fwrite( $oldtextFile, $old );
+ fclose( $oldtextFile );
+ fwrite( $mytextFile, $mine );
+ fclose( $mytextFile );
+ fwrite( $yourtextFile, $yours );
+ fclose( $yourtextFile );
# Check for a conflict
$cmd = $wgDiff3 . ' -a --overlap-only ' .
- wfEscapeShellArg( $mytextName ) . ' ' .
- wfEscapeShellArg( $oldtextName ) . ' ' .
- wfEscapeShellArg( $yourtextName );
+ wfEscapeShellArg( $mytextName ) . ' ' .
+ wfEscapeShellArg( $oldtextName ) . ' ' .
+ wfEscapeShellArg( $yourtextName );
$handle = popen( $cmd, 'r' );
- if( fgets( $handle, 1024 ) ){
+ if( fgets( $handle, 1024 ) ) {
$conflict = true;
} else {
$conflict = false;
@@ -1516,7 +1578,7 @@ function wfMerge( $old, $mine, $yours, &$result ){
# Merge differences
$cmd = $wgDiff3 . ' -a -e --merge ' .
- wfEscapeShellArg( $mytextName, $oldtextName, $yourtextName );
+ wfEscapeShellArg( $mytextName, $oldtextName, $yourtextName );
$handle = popen( $cmd, 'r' );
$result = '';
do {
@@ -1527,13 +1589,15 @@ function wfMerge( $old, $mine, $yours, &$result ){
$result .= $data;
} while ( true );
pclose( $handle );
- unlink( $mytextName ); unlink( $oldtextName ); unlink( $yourtextName );
+ unlink( $mytextName );
+ unlink( $oldtextName );
+ unlink( $yourtextName );
- if ( $result === '' && $old !== '' && $conflict == false ) {
+ if ( $result === '' && $old !== '' && !$conflict ) {
wfDebug( "Unexpected null result from diff3. Command: $cmd\n" );
$conflict = true;
}
- return ! $conflict;
+ return !$conflict;
}
/**
@@ -1545,15 +1609,18 @@ function wfMerge( $old, $mine, $yours, &$result ){
* @return String: unified diff of $before and $after
*/
function wfDiff( $before, $after, $params = '-u' ) {
- if ($before == $after) {
+ if ( $before == $after ) {
return '';
}
-
+
global $wgDiff;
+ wfSuppressWarnings();
+ $haveDiff = $wgDiff && file_exists( $wgDiff );
+ wfRestoreWarnings();
# This check may also protect against code injection in
# case of broken installations.
- if( !file_exists( $wgDiff ) ){
+ if( !$haveDiff ) {
wfDebug( "diff executable not found\n" );
$diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) );
$format = new UnifiedDiffFormatter();
@@ -1565,16 +1632,18 @@ function wfDiff( $before, $after, $params = '-u' ) {
$oldtextFile = fopen( $oldtextName = tempnam( $td, 'merge-old-' ), 'w' );
$newtextFile = fopen( $newtextName = tempnam( $td, 'merge-your-' ), 'w' );
- fwrite( $oldtextFile, $before ); fclose( $oldtextFile );
- fwrite( $newtextFile, $after ); fclose( $newtextFile );
-
+ fwrite( $oldtextFile, $before );
+ fclose( $oldtextFile );
+ fwrite( $newtextFile, $after );
+ fclose( $newtextFile );
+
// Get the diff of the two files
- $cmd = "$wgDiff " . $params . ' ' .wfEscapeShellArg( $oldtextName, $newtextName );
-
+ $cmd = "$wgDiff " . $params . ' ' . wfEscapeShellArg( $oldtextName, $newtextName );
+
$h = popen( $cmd, 'r' );
-
+
$diff = '';
-
+
do {
$data = fread( $h, 8192 );
if ( strlen( $data ) == 0 ) {
@@ -1582,23 +1651,23 @@ function wfDiff( $before, $after, $params = '-u' ) {
}
$diff .= $data;
} while ( true );
-
+
// Clean up
pclose( $h );
unlink( $oldtextName );
unlink( $newtextName );
-
+
// Kill the --- and +++ lines. They're not useful.
$diff_lines = explode( "\n", $diff );
- if (strpos( $diff_lines[0], '---' ) === 0) {
- unset($diff_lines[0]);
+ if ( strpos( $diff_lines[0], '---' ) === 0 ) {
+ unset( $diff_lines[0] );
}
- if (strpos( $diff_lines[1], '+++' ) === 0) {
- unset($diff_lines[1]);
+ if ( strpos( $diff_lines[1], '+++' ) === 0 ) {
+ unset( $diff_lines[1] );
}
-
+
$diff = implode( "\n", $diff_lines );
-
+
return $diff;
}
@@ -1610,7 +1679,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
*/
function wfVarDump( $var ) {
global $wgOut;
- $s = str_replace("\n","<br />\n", var_export( $var, true ) . "\n");
+ $s = str_replace( "\n", "<br />\n", var_export( $var, true ) . "\n" );
if ( headers_sent() || !@is_object( $wgOut ) ) {
print $s;
} else {
@@ -1630,11 +1699,11 @@ function wfHttpError( $code, $label, $desc ) {
header( 'Content-type: text/html; charset=utf-8' );
print "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">".
- "<html><head><title>" .
+ '<html><head><title>' .
htmlspecialchars( $label ) .
- "</title></head><body><h1>" .
+ '</title></head><body><h1>' .
htmlspecialchars( $label ) .
- "</h1><p>" .
+ '</h1><p>' .
nl2br( htmlspecialchars( $desc ) ) .
"</p></body></html>\n";
}
@@ -1656,7 +1725,7 @@ function wfHttpError( $code, $label, $desc ) {
*
* @param $resetGzipEncoding Bool
*/
-function wfResetOutputBuffers( $resetGzipEncoding=true ) {
+function wfResetOutputBuffers( $resetGzipEncoding = true ) {
if( $resetGzipEncoding ) {
// Suppress Content-Encoding and Content-Length
// headers from 1.10+s wfOutputHandler
@@ -1681,7 +1750,13 @@ function wfResetOutputBuffers( $resetGzipEncoding=true ) {
if( $status['name'] == 'ob_gzhandler' ) {
// Reset the 'Content-Encoding' field set by this handler
// so we can start fresh.
- header( 'Content-Encoding:' );
+ if ( function_exists( 'header_remove' ) ) {
+ // Available since PHP 5.3.0
+ header_remove( 'Content-Encoding' );
+ } else {
+ // We need to provide a valid content-coding. See bug 28069
+ header( 'Content-Encoding: identity' );
+ }
break;
}
}
@@ -1725,7 +1800,7 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
if( !isset( $qpart ) ) {
$prefs[$value] = 1.0;
} elseif( preg_match( '/q\s*=\s*(\d*\.\d+)/', $qpart, $match ) ) {
- $prefs[$value] = floatval($match[1]);
+ $prefs[$value] = floatval( $match[1] );
}
}
@@ -1745,7 +1820,7 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
* @private
*/
function mimeTypeMatch( $type, $avail ) {
- if( array_key_exists($type, $avail) ) {
+ if( array_key_exists( $type, $avail ) ) {
return $type;
} else {
$parts = explode( '/', $type );
@@ -1844,7 +1919,7 @@ function wfSuppressWarnings( $end = false ) {
}
} else {
if ( !$suppressCount ) {
- $originalLevel = error_reporting( E_ALL & ~( E_WARNING | E_NOTICE ) );
+ $originalLevel = error_reporting( E_ALL & ~( E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE ) );
}
++$suppressCount;
}
@@ -1862,29 +1937,29 @@ function wfRestoreWarnings() {
/**
* Unix time - the number of seconds since 1970-01-01 00:00:00 UTC
*/
-define('TS_UNIX', 0);
+define( 'TS_UNIX', 0 );
/**
* MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
*/
-define('TS_MW', 1);
+define( 'TS_MW', 1 );
/**
* MySQL DATETIME (YYYY-MM-DD HH:MM:SS)
*/
-define('TS_DB', 2);
+define( 'TS_DB', 2 );
/**
* RFC 2822 format, for E-mail and HTTP headers
*/
-define('TS_RFC2822', 3);
+define( 'TS_RFC2822', 3 );
/**
* ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
*
* This is used by Special:Export
*/
-define('TS_ISO_8601', 4);
+define( 'TS_ISO_8601', 4 );
/**
* An Exif timestamp (YYYY:MM:DD HH:MM:SS)
@@ -1893,91 +1968,152 @@ define('TS_ISO_8601', 4);
* DateTime tag and page 36 for the DateTimeOriginal and
* DateTimeDigitized tags.
*/
-define('TS_EXIF', 5);
+define( 'TS_EXIF', 5 );
/**
* Oracle format time.
*/
-define('TS_ORACLE', 6);
+define( 'TS_ORACLE', 6 );
/**
* Postgres format time.
*/
-define('TS_POSTGRES', 7);
+define( 'TS_POSTGRES', 7 );
/**
* DB2 format time
*/
-define('TS_DB2', 8);
+define( 'TS_DB2', 8 );
+
+/**
+ * ISO 8601 basic format with no timezone: 19860209T200000Z
+ *
+ * This is used by ResourceLoader
+ */
+define( 'TS_ISO_8601_BASIC', 9 );
/**
* @param $outputtype Mixed: A timestamp in one of the supported formats, the
* function will autodetect which format is supplied and act
* accordingly.
* @param $ts Mixed: the timestamp to convert or 0 for the current timestamp
- * @return String: in the format specified in $outputtype
+ * @return Mixed: String / false The same date in the format specified in $outputtype or false
*/
function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
$uts = 0;
$da = array();
- if ($ts==0) {
- $uts=time();
- } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D',$ts,$da)) {
+ $strtime = '';
+
+ if ( !$ts ) { // We want to catch 0, '', null... but not date strings starting with a letter.
+ $uts = time();
+ $strtime = "@$uts";
+ } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
# TS_DB
- } elseif (preg_match('/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D',$ts,$da)) {
+ } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
# TS_EXIF
- } elseif (preg_match('/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D',$ts,$da)) {
+ } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
# TS_MW
- } elseif (preg_match('/^\d{1,13}$/D',$ts)) {
+ } elseif ( preg_match( '/^-?\d{1,13}$/D', $ts ) ) {
# TS_UNIX
$uts = $ts;
- } elseif (preg_match('/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts)) {
+ $strtime = "@$ts"; // Undocumented?
+ } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
# TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
- $uts = strtotime(preg_replace('/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
- str_replace("+00:00", "UTC", $ts)));
- } elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z$/', $ts, $da)) {
+ $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
+ str_replace( '+00:00', 'UTC', $ts ) );
+ } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z$/', $ts, $da ) ) {
# TS_ISO_8601
- } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',$ts,$da)) {
+ } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z$/', $ts, $da ) ) {
+ #TS_ISO_8601_BASIC
+ } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) {
# TS_POSTGRES
- } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',$ts,$da)) {
+ } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
# TS_POSTGRES
+ } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/',$ts,$da)) {
+ # TS_DB2
+ } elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
+ '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' . # dd Mon yyyy
+ '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
+ # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
+ # The regex is a superset of rfc2822 for readability
+ $strtime = strtok( $ts, ';' );
+ } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
+ # TS_RFC850
+ $strtime = $ts;
+ } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
+ # asctime
+ $strtime = $ts;
} else {
- # Bogus value; fall back to the epoch...
+ # Bogus value...
wfDebug("wfTimestamp() fed bogus time value: $outputtype; $ts\n");
- $uts = 0;
+
+ return false;
}
- if (count( $da ) ) {
- // Warning! gmmktime() acts oddly if the month or day is set to 0
- // We may want to handle that explicitly at some point
- $uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
- (int)$da[2],(int)$da[3],(int)$da[1]);
+
+
+ static $formats = array(
+ TS_UNIX => 'U',
+ TS_MW => 'YmdHis',
+ TS_DB => 'Y-m-d H:i:s',
+ TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
+ TS_ISO_8601_BASIC => 'Ymd\THis\Z',
+ TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
+ TS_RFC2822 => 'D, d M Y H:i:s',
+ TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
+ TS_POSTGRES => 'Y-m-d H:i:s',
+ TS_DB2 => 'Y-m-d H:i:s',
+ );
+
+ if ( !isset( $formats[$outputtype] ) ) {
+ throw new MWException( 'wfTimestamp() called with illegal output type.' );
}
- switch($outputtype) {
- case TS_UNIX:
+ if ( function_exists( "date_create" ) ) {
+ if ( count( $da ) ) {
+ $ds = sprintf("%04d-%02d-%02dT%02d:%02d:%02d.00+00:00",
+ (int)$da[1], (int)$da[2], (int)$da[3],
+ (int)$da[4], (int)$da[5], (int)$da[6]);
+
+ $d = date_create( $ds, new DateTimeZone( 'GMT' ) );
+ } elseif ( $strtime ) {
+ $d = date_create( $strtime, new DateTimeZone( 'GMT' ) );
+ } else {
+ return false;
+ }
+
+ if ( !$d ) {
+ wfDebug("wfTimestamp() fed bogus time value: $outputtype; $ts\n");
+ return false;
+ }
+
+ $output = $d->format( $formats[$outputtype] );
+ } else {
+ if ( count( $da ) ) {
+ // Warning! gmmktime() acts oddly if the month or day is set to 0
+ // We may want to handle that explicitly at some point
+ $uts = gmmktime( (int)$da[4], (int)$da[5], (int)$da[6],
+ (int)$da[2], (int)$da[3], (int)$da[1] );
+ } elseif ( $strtime ) {
+ $uts = strtotime( $strtime );
+ }
+
+ if ( $uts === false ) {
+ wfDebug("wfTimestamp() can't parse the timestamp (non 32-bit time? Update php): $outputtype; $ts\n");
+ return false;
+ }
+
+ if ( TS_UNIX == $outputtype ) {
return $uts;
- case TS_MW:
- return gmdate( 'YmdHis', $uts );
- case TS_DB:
- return gmdate( 'Y-m-d H:i:s', $uts );
- case TS_ISO_8601:
- return gmdate( 'Y-m-d\TH:i:s\Z', $uts );
- // This shouldn't ever be used, but is included for completeness
- case TS_EXIF:
- return gmdate( 'Y:m:d H:i:s', $uts );
- case TS_RFC2822:
- return gmdate( 'D, d M Y H:i:s', $uts ) . ' GMT';
- case TS_ORACLE:
- return gmdate( 'd-m-Y H:i:s.000000', $uts);
- //return gmdate( 'd-M-y h.i.s A', $uts) . ' +00:00';
- case TS_POSTGRES:
- return gmdate( 'Y-m-d H:i:s', $uts) . ' GMT';
- case TS_DB2:
- return gmdate( 'Y-m-d H:i:s', $uts);
- default:
- throw new MWException( 'wfTimestamp() called with illegal output type.');
+ }
+ $output = gmdate( $formats[$outputtype], $uts );
}
+
+ if ( ( $outputtype == TS_RFC2822 ) || ( $outputtype == TS_POSTGRES ) ) {
+ $output .= ' GMT';
+ }
+
+ return $output;
}
/**
@@ -2001,11 +2137,11 @@ function wfTimestampOrNull( $outputtype = TS_UNIX, $ts = null ) {
* @return Bool: true if it's Windows, False otherwise.
*/
function wfIsWindows() {
- if (substr(php_uname(), 0, 7) == 'Windows') {
- return true;
- } else {
- return false;
+ static $isWindows = null;
+ if ( $isWindows === null ) {
+ $isWindows = substr( php_uname(), 0, 7 ) == 'Windows';
}
+ return $isWindows;
}
/**
@@ -2059,11 +2195,11 @@ function wfGetCachedNotice( $name ) {
$parserMemc->set( $key, array( 'html' => $parsed, 'hash' => md5( $notice ) ), 600 );
$notice = $parsed;
} else {
- wfDebug( 'wfGetCachedNotice called for ' . $name . ' with no $wgOut available'."\n" );
+ wfDebug( 'wfGetCachedNotice called for ' . $name . ' with no $wgOut available' . "\n" );
$notice = '';
}
}
-
+ $notice = '<div id="localNotice">' .$notice . '</div>';
wfProfileOut( $fname );
return $notice;
}
@@ -2072,18 +2208,19 @@ function wfGetNamespaceNotice() {
global $wgTitle;
# Paranoia
- if ( !isset( $wgTitle ) || !is_object( $wgTitle ) )
- return "";
+ if ( !isset( $wgTitle ) || !is_object( $wgTitle ) ) {
+ return '';
+ }
$fname = 'wfGetNamespaceNotice';
wfProfileIn( $fname );
- $key = "namespacenotice-" . $wgTitle->getNsText();
+ $key = 'namespacenotice-' . $wgTitle->getNsText();
$namespaceNotice = wfGetCachedNotice( $key );
- if ( $namespaceNotice && substr ( $namespaceNotice , 0 ,7 ) != "<p>&lt;" ) {
- $namespaceNotice = '<div id="namespacebanner">' . $namespaceNotice . "</div>";
+ if ( $namespaceNotice && substr( $namespaceNotice, 0, 7 ) != '<p>&lt;' ) {
+ $namespaceNotice = '<div id="namespacebanner">' . $namespaceNotice . '</div>';
} else {
- $namespaceNotice = "";
+ $namespaceNotice = '';
}
wfProfileOut( $fname );
@@ -2091,7 +2228,7 @@ function wfGetNamespaceNotice() {
}
function wfGetSiteNotice() {
- global $wgUser, $wgSiteNotice;
+ global $wgUser;
$fname = 'wfGetSiteNotice';
wfProfileIn( $fname );
$siteNotice = '';
@@ -2119,40 +2256,42 @@ function wfGetSiteNotice() {
/**
* BC wrapper for MimeMagic::singleton()
- * @deprecated
+ * @deprecated No longer needed as of 1.17 (r68836).
*/
function &wfGetMimeMagic() {
+ wfDeprecated( __FUNCTION__ );
return MimeMagic::singleton();
}
/**
- * Tries to get the system directory for temporary files. For PHP >= 5.2.1,
- * we'll use sys_get_temp_dir(). The TMPDIR, TMP, and TEMP environment
- * variables are then checked in sequence, and if none are set /tmp is
- * returned as the generic Unix default.
+ * Tries to get the system directory for temporary files. The TMPDIR, TMP, and
+ * TEMP environment variables are then checked in sequence, and if none are set
+ * try sys_get_temp_dir() for PHP >= 5.2.1. All else fails, return /tmp for Unix
+ * or C:\Windows\Temp for Windows and hope for the best.
+ * It is common to call it with tempnam().
*
- * NOTE: When possible, use the tempfile() function to create temporary
- * files to avoid race conditions on file creation, etc.
+ * NOTE: When possible, use instead the tmpfile() function to create
+ * temporary files to avoid race conditions on file creation, etc.
*
* @return String
*/
function wfTempDir() {
- if( function_exists( 'sys_get_temp_dir' ) ) {
- return sys_get_temp_dir();
- }
foreach( array( 'TMPDIR', 'TMP', 'TEMP' ) as $var ) {
$tmp = getenv( $var );
if( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
return $tmp;
}
}
- # Hope this is Unix of some kind!
- return '/tmp';
+ if( function_exists( 'sys_get_temp_dir' ) ) {
+ return sys_get_temp_dir();
+ }
+ # Usual defaults
+ return wfIsWindows() ? 'C:\Windows\Temp' : '/tmp';
}
/**
* Make directory, and make all parent directories if they don't exist
- *
+ *
* @param $dir String: full path to directory to create
* @param $mode Integer: chmod value to use, default is $wgDirectoryMode
* @param $caller String: optional caller param for debugging.
@@ -2165,15 +2304,21 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
wfDebug( "$caller: called wfMkdirParents($dir)" );
}
- if( strval( $dir ) === '' || file_exists( $dir ) )
+ if( strval( $dir ) === '' || file_exists( $dir ) ) {
return true;
+ }
$dir = str_replace( array( '\\', '/' ), DIRECTORY_SEPARATOR, $dir );
- if ( is_null( $mode ) )
+ if ( is_null( $mode ) ) {
$mode = $wgDirectoryMode;
+ }
+
+ // Turn off the normal warning, we're doing our own below
+ wfSuppressWarnings();
+ $ok = mkdir( $dir, $mode, true ); // PHP5 <3
+ wfRestoreWarnings();
- $ok = mkdir( $dir, $mode, true ); // PHP5 <3
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 );
@@ -2190,13 +2335,29 @@ function wfIncrStats( $key ) {
if( $wgStatsMethod == 'udp' ) {
global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgDBname;
static $socket;
- if (!$socket) {
- $socket=socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
- $statline="stats/{$wgDBname} - 1 1 1 1 1 -total\n";
- socket_sendto($socket,$statline,strlen($statline),0,$wgUDPProfilerHost,$wgUDPProfilerPort);
+ if ( !$socket ) {
+ $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+ $statline = "stats/{$wgDBname} - 1 1 1 1 1 -total\n";
+ socket_sendto(
+ $socket,
+ $statline,
+ strlen( $statline ),
+ 0,
+ $wgUDPProfilerHost,
+ $wgUDPProfilerPort
+ );
}
- $statline="stats/{$wgDBname} - 1 1 1 1 1 {$key}\n";
- @socket_sendto($socket,$statline,strlen($statline),0,$wgUDPProfilerHost,$wgUDPProfilerPort);
+ $statline = "stats/{$wgDBname} - 1 1 1 1 1 {$key}\n";
+ wfSuppressWarnings();
+ socket_sendto(
+ $socket,
+ $statline,
+ strlen( $statline ),
+ 0,
+ $wgUDPProfilerHost,
+ $wgUDPProfilerPort
+ );
+ wfRestoreWarnings();
} elseif( $wgStatsMethod == 'cache' ) {
global $wgMemc;
$key = wfMemcKey( 'stats', $key );
@@ -2230,7 +2391,7 @@ function wfPercent( $nr, $acc = 2, $round = true ) {
function wfEncryptPassword( $userid, $password ) {
wfDeprecated(__FUNCTION__);
# Just wrap around User::oldCrypt()
- return User::oldCrypt($password, $userid);
+ return User::oldCrypt( $password, $userid );
}
/**
@@ -2238,7 +2399,7 @@ function wfEncryptPassword( $userid, $password ) {
*/
function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
if ( is_null( $changed ) ) {
- throw new MWException('GlobalFunctions::wfAppendToArrayIfNotDefault got null');
+ throw new MWException( 'GlobalFunctions::wfAppendToArrayIfNotDefault got null' );
}
if ( $default[$key] !== $value ) {
$changed[$key] = $value;
@@ -2250,12 +2411,12 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
* looked up didn't exist but a XHTML string, this function checks for the
* nonexistance of messages by looking at wfMsg() output
*
- * @param $msg String: the message key looked up
- * @param $wfMsgOut String: the output of wfMsg*()
- * @return Boolean
+ * @param $key String: the message key looked up
+ * @return Boolean True if the message *doesn't* exist.
*/
-function wfEmptyMsg( $msg, $wfMsgOut ) {
- return $wfMsgOut === htmlspecialchars( "<$msg>" );
+function wfEmptyMsg( $key ) {
+ global $wgMessageCache;
+ return $wgMessageCache->get( $key, /*useDB*/true, /*content*/false ) === false;
}
/**
@@ -2271,7 +2432,7 @@ function in_string( $needle, $str ) {
function wfSpecialList( $page, $details ) {
global $wgContLang;
- $details = $details ? ' ' . $wgContLang->getDirMark() . "($details)" : "";
+ $details = $details ? ' ' . $wgContLang->getDirMark() . "($details)" : '';
return $page . $details;
}
@@ -2284,15 +2445,17 @@ function wfUrlProtocols() {
global $wgUrlProtocols;
static $retval = null;
- if ( !is_null( $retval ) )
+ if ( !is_null( $retval ) ) {
return $retval;
+ }
// Support old-style $wgUrlProtocols strings, for backwards compatibility
// with LocalSettings files from 1.5
if ( is_array( $wgUrlProtocols ) ) {
$protocols = array();
- foreach ($wgUrlProtocols as $protocol)
+ foreach ( $wgUrlProtocols as $protocol ) {
$protocols[] = preg_quote( $protocol, '/' );
+ }
$retval = implode( '|', $protocols );
} else {
@@ -2334,14 +2497,40 @@ function wfIniGetBool( $setting ) {
}
/**
+ * Wrapper function for PHP's dl(). This doesn't work in most situations from
+ * PHP 5.3 onward, and is usually disabled in shared environments anyway.
+ *
+ * @param $extension String A PHP extension. The file suffix (.so or .dll)
+ * should be omitted
+ * @return Bool - Whether or not the extension is loaded
+ */
+function wfDl( $extension ) {
+ if( extension_loaded( $extension ) ) {
+ return true;
+ }
+
+ $canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
+ && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
+
+ if( $canDl ) {
+ wfSuppressWarnings();
+ dl( $extension . '.' . PHP_SHLIB_SUFFIX );
+ wfRestoreWarnings();
+ }
+ return extension_loaded( $extension );
+}
+
+/**
* Execute a shell command, with time and memory limits mirrored from the PHP
* configuration if supported.
- * @param $cmd Command line, properly escaped for shell.
+ * @param $cmd String Command line, properly escaped for shell.
* @param &$retval optional, will receive the program's exit code.
* (non-zero is usually failure)
+ * @param $environ Array optional environment variables which should be
+ * added to the executed command environment.
* @return collected stdout as a string (trailing newlines stripped)
*/
-function wfShellExec( $cmd, &$retval=null ) {
+function wfShellExec( $cmd, &$retval = null, $environ = array() ) {
global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime;
static $disabled;
@@ -2349,24 +2538,55 @@ function wfShellExec( $cmd, &$retval=null ) {
$disabled = false;
if( wfIniGetBool( 'safe_mode' ) ) {
wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" );
- $disabled = true;
- }
- $functions = explode( ',', ini_get( 'disable_functions' ) );
- $functions = array_map( 'trim', $functions );
- $functions = array_map( 'strtolower', $functions );
- if ( in_array( 'passthru', $functions ) ) {
- wfDebug( "passthru is in disabled_functions\n" );
- $disabled = true;
+ $disabled = 'safemode';
+ } else {
+ $functions = explode( ',', ini_get( 'disable_functions' ) );
+ $functions = array_map( 'trim', $functions );
+ $functions = array_map( 'strtolower', $functions );
+ if ( in_array( 'passthru', $functions ) ) {
+ wfDebug( "passthru is in disabled_functions\n" );
+ $disabled = 'passthru';
+ }
}
}
if ( $disabled ) {
$retval = 1;
- return "Unable to run external programs in safe mode.";
+ return $disabled == 'safemode' ?
+ 'Unable to run external programs in safe mode.' :
+ 'Unable to run external programs, passthru() is disabled.';
}
wfInitShellLocale();
- if ( php_uname( 's' ) == 'Linux' ) {
+ $envcmd = '';
+ foreach( $environ as $k => $v ) {
+ if ( wfIsWindows() ) {
+ /* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves
+ * appear in the environment variable, so we must use carat escaping as documented in
+ * http://technet.microsoft.com/en-us/library/cc723564.aspx
+ * Note however that the quote isn't listed there, but is needed, and the parentheses
+ * are listed there but doesn't appear to need it.
+ */
+ $envcmd .= "set $k=" . preg_replace( '/([&|()<>^"])/', '^\\1', $v ) . '&& ';
+ } else {
+ /* Assume this is a POSIX shell, thus required to accept variable assignments before the command
+ * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_01
+ */
+ $envcmd .= "$k=" . escapeshellarg( $v ) . ' ';
+ }
+ }
+ $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' ) {
$time = intval( $wgMaxShellTime );
$mem = intval( $wgMaxShellMemory );
$filesize = intval( $wgMaxShellFileSize );
@@ -2374,16 +2594,9 @@ function wfShellExec( $cmd, &$retval=null ) {
if ( $time > 0 && $mem > 0 ) {
$script = "$IP/bin/ulimit4.sh";
if ( is_executable( $script ) ) {
- $cmd = escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd );
+ $cmd = '/bin/bash ' . escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd );
}
}
- } elseif ( php_uname( 's' ) == 'Windows NT' &&
- version_compare( PHP_VERSION, '5.3.0', '<' ) )
- {
- # This is a hack to work around PHP's flawed invocation of cmd.exe
- # http://news.php.net/php.internals/21796
- # Which is fixed in 5.3.0 :)
- $cmd = '"' . $cmd . '"';
}
wfDebug( "wfShellExec: $cmd\n" );
@@ -2405,7 +2618,9 @@ function wfShellExec( $cmd, &$retval=null ) {
*/
function wfInitShellLocale() {
static $done = false;
- if ( $done ) return;
+ if ( $done ) {
+ return;
+ }
$done = true;
global $wgShellLocale;
if ( !wfIniGetBool( 'safe_mode' ) ) {
@@ -2432,8 +2647,9 @@ function wfInitShellLocale() {
function wfUsePHP( $req_ver ) {
$php_ver = PHP_VERSION;
- if ( version_compare( $php_ver, (string)$req_ver, '<' ) )
- throw new MWException( "PHP $req_ver required--this is only $php_ver" );
+ if ( version_compare( $php_ver, (string)$req_ver, '<' ) ) {
+ throw new MWException( "PHP $req_ver required--this is only $php_ver" );
+ }
}
/**
@@ -2452,15 +2668,9 @@ function wfUsePHP( $req_ver ) {
function wfUseMW( $req_ver ) {
global $wgVersion;
- if ( version_compare( $wgVersion, (string)$req_ver, '<' ) )
+ if ( version_compare( $wgVersion, (string)$req_ver, '<' ) ) {
throw new MWException( "MediaWiki $req_ver required--this is only $wgVersion" );
-}
-
-/**
- * @deprecated use StringUtils::escapeRegexReplacement
- */
-function wfRegexReplacement( $string ) {
- return StringUtils::escapeRegexReplacement( $string );
+ }
}
/**
@@ -2475,8 +2685,8 @@ function wfRegexReplacement( $string ) {
* @param $suffix String: to remove if present
* @return String
*/
-function wfBaseName( $path, $suffix='' ) {
- $encSuffix = ($suffix == '')
+function wfBaseName( $path, $suffix = '' ) {
+ $encSuffix = ( $suffix == '' )
? ''
: ( '(?:' . preg_quote( $suffix, '#' ) . ')?' );
$matches = array();
@@ -2505,7 +2715,7 @@ function wfRelativePath( $path, $from ) {
$path = rtrim( $path, DIRECTORY_SEPARATOR );
$from = rtrim( $from, DIRECTORY_SEPARATOR );
- $pieces = explode( DIRECTORY_SEPARATOR, dirname( $path ) );
+ $pieces = explode( DIRECTORY_SEPARATOR, dirname( $path ) );
$against = explode( DIRECTORY_SEPARATOR, $from );
if( $pieces[0] !== $against[0] ) {
@@ -2553,24 +2763,26 @@ function wfArrayMerge( $array1/* ... */ ) {
/**
* Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
* e.g.
- * wfMergeErrorArrays(
- * array( array( 'x' ) ),
- * array( array( 'x', '2' ) ),
- * array( array( 'x' ) ),
+ * wfMergeErrorArrays(
+ * array( array( 'x' ) ),
+ * array( array( 'x', '2' ) ),
+ * array( array( 'x' ) ),
* array( array( 'y') )
* );
* returns:
- * array(
+ * array(
* array( 'x', '2' ),
* array( 'x' ),
* array( 'y' )
* )
*/
-function wfMergeErrorArrays(/*...*/) {
+function wfMergeErrorArrays( /*...*/ ) {
$args = func_get_args();
$out = array();
foreach ( $args as $errors ) {
foreach ( $errors as $params ) {
+ # FIXME: sometimes get nested arrays for $params,
+ # which leads to E_NOTICEs
$spec = implode( "\t", $params );
$out[$spec] = $params;
}
@@ -2604,7 +2816,7 @@ function wfParseUrl( $url ) {
$bits['delimiter'] = ':';
// parse_url detects for news: and mailto: the host part of an url as path
// We have to correct this wrong detection
- if ( isset ( $bits['path'] ) ) {
+ if ( isset( $bits['path'] ) ) {
$bits['host'] = $bits['path'];
$bits['path'] = '';
}
@@ -2625,7 +2837,7 @@ function wfMakeUrlIndex( $url ) {
// For emails reverse domainpart only
if ( $bits['scheme'] == 'mailto' ) {
$mailparts = explode( '@', $bits['host'], 2 );
- if ( count($mailparts) === 2 ) {
+ if ( count( $mailparts ) === 2 ) {
$domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
} else {
// No domain specified, don't mangle it
@@ -2644,39 +2856,53 @@ function wfMakeUrlIndex( $url ) {
$prot = $bits['scheme'];
$index = $prot . $bits['delimiter'] . $reversedHost;
// Leave out user and password. Add the port, path, query and fragment
- if ( isset( $bits['port'] ) ) $index .= ':' . $bits['port'];
+ if ( isset( $bits['port'] ) ) {
+ $index .= ':' . $bits['port'];
+ }
if ( isset( $bits['path'] ) ) {
$index .= $bits['path'];
} else {
$index .= '/';
}
- if ( isset( $bits['query'] ) ) $index .= '?' . $bits['query'];
- if ( isset( $bits['fragment'] ) ) $index .= '#' . $bits['fragment'];
+ if ( isset( $bits['query'] ) ) {
+ $index .= '?' . $bits['query'];
+ }
+ if ( isset( $bits['fragment'] ) ) {
+ $index .= '#' . $bits['fragment'];
+ }
return $index;
}
/**
* Do any deferred updates and clear the list
- * TODO: This could be in Wiki.php if that class made any sense at all
+ *
+ * @param $commit Boolean: commit after every update to prevent lock contention
*/
-function wfDoUpdates()
-{
- global $wgPostCommitUpdateList, $wgDeferredUpdateList;
- foreach ( $wgDeferredUpdateList as $update ) {
- $update->doUpdate();
+function wfDoUpdates( $commit = false ) {
+ global $wgDeferredUpdateList;
+
+ wfProfileIn( __METHOD__ );
+
+ // No need to get master connections in case of empty updates array
+ if ( !count( $wgDeferredUpdateList ) ) {
+ wfProfileOut( __METHOD__ );
+ return;
}
- foreach ( $wgPostCommitUpdateList as $update ) {
+
+ if ( $commit ) {
+ $dbw = wfGetDB( DB_MASTER );
+ }
+
+ foreach ( $wgDeferredUpdateList as $update ) {
$update->doUpdate();
+
+ if ( $commit && $dbw->trxLevel() ) {
+ $dbw->commit();
+ }
}
- $wgDeferredUpdateList = array();
- $wgPostCommitUpdateList = array();
-}
-/**
- * @deprecated use StringUtils::explodeMarkup
- */
-function wfExplodeMarkup( $separator, $text ) {
- return StringUtils::explodeMarkup( $separator, $text );
+ $wgDeferredUpdateList = array();
+ wfProfileOut( __METHOD__ );
}
/**
@@ -2693,7 +2919,7 @@ function wfExplodeMarkup( $separator, $text ) {
* @param $lowercase Boolean
* @return String or false on invalid input
*/
-function wfBaseConvert( $input, $sourceBase, $destBase, $pad=1, $lowercase=true ) {
+function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true ) {
$input = strval( $input );
if( $sourceBase < 2 ||
$sourceBase > 36 ||
@@ -2707,7 +2933,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad=1, $lowercase=true
$input == '' ) {
return false;
}
- $digitChars = ( $lowercase ) ? '0123456789abcdefghijklmnopqrstuvwxyz' : '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ $digitChars = ( $lowercase ) ? '0123456789abcdefghijklmnopqrstuvwxyz' : '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$inDigits = array();
$outChars = '';
@@ -2771,7 +2997,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad=1, $lowercase=true
* @param $name String
* @param $p Array: parameters
*/
-function wfCreateObject( $name, $p ){
+function wfCreateObject( $name, $p ) {
$p = array_values( $p );
switch ( count( $p ) ) {
case 0:
@@ -2789,32 +3015,15 @@ function wfCreateObject( $name, $p ){
case 6:
return new $name( $p[0], $p[1], $p[2], $p[3], $p[4], $p[5] );
default:
- throw new MWException( "Too many arguments to construtor in wfCreateObject" );
+ throw new MWException( 'Too many arguments to construtor in wfCreateObject' );
}
}
-/**
- * Alias for modularized function
- * @deprecated Use Http::get() instead
- */
-function wfGetHTTP( $url ) {
- wfDeprecated(__FUNCTION__);
- return Http::get( $url );
-}
-
-/**
- * Alias for modularized function
- * @deprecated Use Http::isLocalURL() instead
- */
-function wfIsLocalURL( $url ) {
- wfDeprecated(__FUNCTION__);
- return Http::isLocalURL( $url );
-}
-
function wfHttpOnlySafe() {
global $wgHttpOnlyBlacklist;
- if( !version_compare("5.2", PHP_VERSION, "<") )
+ if( !version_compare( '5.2', PHP_VERSION, '<' ) ) {
return false;
+ }
if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
foreach( $wgHttpOnlyBlacklist as $regex ) {
@@ -2830,15 +3039,15 @@ function wfHttpOnlySafe() {
/**
* Initialise php session
*/
-function wfSetupSession() {
- global $wgSessionsInMemcached, $wgCookiePath, $wgCookieDomain,
+function wfSetupSession( $sessionId = false ) {
+ global $wgSessionsInMemcached, $wgCookiePath, $wgCookieDomain,
$wgCookieSecure, $wgCookieHttpOnly, $wgSessionHandler;
if( $wgSessionsInMemcached ) {
require_once( 'MemcachedSessions.php' );
} elseif( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
# Only set this if $wgSessionHandler isn't null and session.save_handler
# hasn't already been set to the desired value (that causes errors)
- ini_set ( 'session.save_handler', $wgSessionHandler );
+ ini_set( 'session.save_handler', $wgSessionHandler );
}
$httpOnlySafe = wfHttpOnlySafe();
wfDebugLog( 'cookie',
@@ -2856,6 +3065,9 @@ function wfSetupSession() {
session_set_cookie_params( 0, $wgCookiePath, $wgCookieDomain, $wgCookieSecure );
}
session_cache_limiter( 'private, must-revalidate' );
+ if ( $sessionId ) {
+ session_id( $sessionId );
+ }
wfSuppressWarnings();
session_start();
wfRestoreWarnings();
@@ -2882,7 +3094,7 @@ function wfGetPrecompiledData( $name ) {
function wfGetCaller( $level = 2 ) {
$backtrace = wfDebugBacktrace();
if ( isset( $backtrace[$level] ) ) {
- return wfFormatStackFrame($backtrace[$level]);
+ return wfFormatStackFrame( $backtrace[$level] );
} else {
$caller = 'unknown';
}
@@ -2890,20 +3102,28 @@ function wfGetCaller( $level = 2 ) {
}
/**
- * Return a string consisting all callers in stack, somewhat useful sometimes
- * for profiling specific points
+ * Return a string consisting of callers in the stack. Useful sometimes
+ * for profiling specific points.
+ *
+ * @param $limit The maximum depth of the stack frame to return, or false for
+ * the entire stack.
*/
-function wfGetAllCallers() {
- return implode('/', array_map('wfFormatStackFrame',array_reverse(wfDebugBacktrace())));
+function wfGetAllCallers( $limit = 3 ) {
+ $trace = array_reverse( wfDebugBacktrace() );
+ if ( !$limit || $limit > count( $trace ) - 1 ) {
+ $limit = count( $trace ) - 1;
+ }
+ $trace = array_slice( $trace, -$limit - 1, $limit );
+ return implode( '/', array_map( 'wfFormatStackFrame', $trace ) );
}
/**
* Return a string representation of frame
*/
-function wfFormatStackFrame($frame) {
- return isset( $frame["class"] )?
- $frame["class"]."::".$frame["function"]:
- $frame["function"];
+function wfFormatStackFrame( $frame ) {
+ return isset( $frame['class'] ) ?
+ $frame['class'] . '::' . $frame['function'] :
+ $frame['function'];
}
/**
@@ -2953,7 +3173,7 @@ function wfSplitWikiID( $wiki ) {
return $bits;
}
-/*
+/**
* Get a Database object.
* @param $db Integer: index of the connection to get. May be DB_MASTER for the
* master (for write queries), DB_SLAVE for potentially lagged read
@@ -2968,6 +3188,8 @@ function wfSplitWikiID( $wiki ) {
* Note: multiple calls to wfGetDB(DB_SLAVE) during the course of one request
* will always return the same object, unless the underlying connection or load
* balancer is manually destroyed.
+ *
+ * @return DatabaseBase
*/
function &wfGetDB( $db, $groups = array(), $wiki = false ) {
return wfGetLB( $wiki )->getConnection( $db, $groups, $wiki );
@@ -2993,7 +3215,7 @@ function &wfGetLBFactory() {
/**
* Find a file.
* Shortcut for RepoGroup::singleton()->findFile()
- * @param $title Either a string or Title object
+ * @param $title String or Title object
* @param $options Associative array of options:
* time: requested time for an archived image, or false for the
* current version. An image object will be returned which was
@@ -3001,7 +3223,7 @@ function &wfGetLBFactory() {
*
* ignoreRedirect: If true, do not follow file redirects
*
- * private: If true, return restricted (deleted) files if the current
+ * private: If true, return restricted (deleted) files if the current
* user is allowed to view them. Otherwise, such files will not
* be found.
*
@@ -3016,7 +3238,7 @@ function wfFindFile( $title, $options = array() ) {
/**
* Get an object referring to a locally registered file.
* Returns a valid placeholder object if the file does not exist.
- * @param $title Either a string or Title object
+ * @param $title Title or String
* @return File, or null if passed an invalid Title
*/
function wfLocalFile( $title ) {
@@ -3047,12 +3269,13 @@ function wfScript( $script = 'index' ) {
global $wgScriptPath, $wgScriptExtension;
return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
}
+
/**
- * Get the script url.
+ * Get the script URL.
*
- * @return script url
+ * @return script URL
*/
-function wfGetScriptUrl(){
+function wfGetScriptUrl() {
if( isset( $_SERVER['SCRIPT_NAME'] ) ) {
#
# as it was called, minus the query string.
@@ -3083,7 +3306,7 @@ function wfBoolToStr( $value ) {
/**
* Load an extension messages file
- * @deprecated
+ * @deprecated in 1.16 (warnings in 1.18, removed in ?)
*/
function wfLoadExtensionMessages( $extensionName, $langcode = false ) {
}
@@ -3145,18 +3368,21 @@ function wfDeprecated( $function ) {
*/
function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
$callers = wfDebugBacktrace();
- if( isset( $callers[$callerOffset+1] ) ){
- $callerfunc = $callers[$callerOffset+1];
+ if( isset( $callers[$callerOffset + 1] ) ){
+ $callerfunc = $callers[$callerOffset + 1];
$callerfile = $callers[$callerOffset];
- if( isset( $callerfile['file'] ) && isset( $callerfile['line'] ) ){
+ if( isset( $callerfile['file'] ) && isset( $callerfile['line'] ) ) {
$file = $callerfile['file'] . ' at line ' . $callerfile['line'];
} else {
$file = '(internal function)';
}
$func = '';
- if( isset( $callerfunc['class'] ) )
+ if( isset( $callerfunc['class'] ) ) {
$func .= $callerfunc['class'] . '::';
- $func .= @$callerfunc['function'];
+ }
+ if( isset( $callerfunc['function'] ) ) {
+ $func .= $callerfunc['function'];
+ }
$msg .= " [Called from $func in $file]";
}
@@ -3187,23 +3413,24 @@ function wfWaitForSlaves( $maxLag, $wiki = false ) {
$lb = wfGetLB( $wiki );
list( $host, $lag ) = $lb->getMaxLag( $wiki );
while( $lag > $maxLag ) {
- $name = @gethostbyaddr( $host );
+ wfSuppressWarnings();
+ $name = gethostbyaddr( $host );
+ wfRestoreWarnings();
if( $name !== false ) {
$host = $name;
}
print "Waiting for $host (lagged $lag seconds)...\n";
- sleep($maxLag);
+ sleep( $maxLag );
list( $host, $lag ) = $lb->getMaxLag();
}
}
}
/**
- * Output some plain text in command-line mode or in the installer (updaters.inc).
- * Do not use it in any other context, its behaviour is subject to change.
+ * Used to be used for outputting text in the installer/updater
+ * @deprecated Warnings in 1.19, removal in 1.20
*/
function wfOut( $s ) {
- static $lineStarted = false;
global $wgCommandLineMode;
if ( $wgCommandLineMode && !defined( 'MEDIAWIKI_INSTALL' ) ) {
echo $s;
@@ -3214,14 +3441,14 @@ function wfOut( $s ) {
}
/**
- * Count down from $n to zero on the terminal, with a one-second pause
+ * Count down from $n to zero on the terminal, with a one-second pause
* between showing each number. For use in command-line scripts.
*/
function wfCountDown( $n ) {
for ( $i = $n; $i >= 0; $i-- ) {
if ( $i != $n ) {
echo str_repeat( "\x08", strlen( $i + 1 ) );
- }
+ }
echo $i;
flush();
if ( $i ) {
@@ -3231,14 +3458,14 @@ function wfCountDown( $n ) {
echo "\n";
}
-/** Generate a random 32-character hexadecimal token.
+/**
+ * Generate a random 32-character hexadecimal token.
* @param $salt Mixed: some sort of salt, if necessary, to add to random
* characters before hashing.
*/
function wfGenerateToken( $salt = '' ) {
- $salt = serialize($salt);
-
- return md5( mt_rand( 0, 0x7fffffff ) . $salt );
+ $salt = serialize( $salt );
+ return md5( mt_rand( 0, 0x7fffffff ) . $salt );
}
/**
@@ -3248,7 +3475,13 @@ function wfGenerateToken( $salt = '' ) {
function wfStripIllegalFilenameChars( $name ) {
global $wgIllegalFileChars;
$name = wfBaseName( $name );
- $name = preg_replace("/[^".Title::legalChars()."]".($wgIllegalFileChars ? "|[".$wgIllegalFileChars."]":"")."/",'-',$name);
+ $name = preg_replace(
+ "/[^" . Title::legalChars() . "]" .
+ ( $wgIllegalFileChars ? "|[" . $wgIllegalFileChars . "]" : '' ) .
+ "/",
+ '-',
+ $name
+ );
return $name;
}
@@ -3260,31 +3493,34 @@ function wfStripIllegalFilenameChars( $name ) {
*/
function wfArrayInsertAfter( $array, $insert, $after ) {
// Find the offset of the element to insert after.
- $keys = array_keys($array);
+ $keys = array_keys( $array );
$offsetByKey = array_flip( $keys );
-
+
$offset = $offsetByKey[$after];
-
+
// Insert at the specified offset
$before = array_slice( $array, 0, $offset + 1, true );
- $after = array_slice( $array, $offset + 1, count($array)-$offset, true );
-
+ $after = array_slice( $array, $offset + 1, count( $array ) - $offset, true );
+
$output = $before + $insert + $after;
-
+
return $output;
}
/* Recursively converts the parameter (an object) to an array with the same data */
-function wfObjectToArray( $object, $recursive = true ) {
+function wfObjectToArray( $objOrArray, $recursive = true ) {
$array = array();
- foreach ( get_object_vars($object) as $key => $value ) {
- if ( is_object($value) && $recursive ) {
+ if( is_object( $objOrArray ) ) {
+ $objOrArray = get_object_vars( $objOrArray );
+ }
+ foreach ( $objOrArray as $key => $value ) {
+ if ( $recursive && ( is_object( $value ) || is_array( $value ) ) ) {
$value = wfObjectToArray( $value );
}
-
+
$array[$key] = $value;
}
-
+
return $array;
}
@@ -3292,22 +3528,21 @@ function wfObjectToArray( $object, $recursive = true ) {
* Set PHP's memory limit to the larger of php.ini or $wgMemoryLimit;
* @return Integer value memory was set to.
*/
-
-function wfMemoryLimit () {
+function wfMemoryLimit() {
global $wgMemoryLimit;
- $memlimit = wfShorthandToInteger( ini_get( "memory_limit" ) );
- $conflimit = wfShorthandToInteger( $wgMemoryLimit );
+ $memlimit = wfShorthandToInteger( ini_get( 'memory_limit' ) );
if( $memlimit != -1 ) {
+ $conflimit = wfShorthandToInteger( $wgMemoryLimit );
if( $conflimit == -1 ) {
wfDebug( "Removing PHP's memory limit\n" );
wfSuppressWarnings();
- ini_set( "memory_limit", $conflimit );
+ ini_set( 'memory_limit', $conflimit );
wfRestoreWarnings();
return $conflimit;
} elseif ( $conflimit > $memlimit ) {
wfDebug( "Raising PHP's memory limit to $conflimit bytes\n" );
wfSuppressWarnings();
- ini_set( "memory_limit", $conflimit );
+ ini_set( 'memory_limit', $conflimit );
wfRestoreWarnings();
return $conflimit;
}
@@ -3320,24 +3555,32 @@ function wfMemoryLimit () {
* @param $string String
* @return Integer
*/
-function wfShorthandToInteger ( $string = '' ) {
- $string = trim($string);
- if( empty($string) ) { return -1; }
- $last = strtolower($string[strlen($string)-1]);
- $val = intval($string);
- switch($last) {
+function wfShorthandToInteger( $string = '' ) {
+ $string = trim( $string );
+ if( $string === '' ) {
+ return -1;
+ }
+ $last = $string[strlen( $string ) - 1];
+ $val = intval( $string );
+ switch( $last ) {
case 'g':
+ case 'G':
$val *= 1024;
+ // break intentionally missing
case 'm':
+ case 'M':
$val *= 1024;
+ // break intentionally missing
case 'k':
+ case 'K':
$val *= 1024;
}
return $val;
}
-/* Get the normalised IETF language tag
+/**
+ * Get the normalised IETF language tag
* @param $code String: The language code.
* @return $langCode String: The language code which complying with BCP 47 standards.
*/
@@ -3346,19 +3589,31 @@ function wfBCP47( $code ) {
foreach ( $codeSegment as $segNo => $seg ) {
if ( count( $codeSegment ) > 0 ) {
// ISO 3166 country code
- if ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) )
+ if ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
$codeBCP[$segNo] = strtoupper( $seg );
// ISO 15924 script code
- else if ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) )
+ } elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) {
$codeBCP[$segNo] = ucfirst( $seg );
// Use lowercase for other cases
- else
+ } else {
$codeBCP[$segNo] = strtolower( $seg );
+ }
} else {
// Use lowercase for single segment
$codeBCP[$segNo] = strtolower( $seg );
}
}
- $langCode = implode ( '-' , $codeBCP );
+ $langCode = implode( '-', $codeBCP );
return $langCode;
}
+
+function wfArrayMap( $function, $input ) {
+ $ret = array_map( $function, $input );
+ foreach ( $ret as $key => $value ) {
+ $taint = istainted( $input[$key] );
+ if ( $taint ) {
+ taint( $ret[$key], $taint );
+ }
+ }
+ return $ret;
+}
diff --git a/includes/HTMLCacheUpdate.php b/includes/HTMLCacheUpdate.php
index 6f90b2d9..f0456a22 100644
--- a/includes/HTMLCacheUpdate.php
+++ b/includes/HTMLCacheUpdate.php
@@ -63,7 +63,6 @@ class HTMLCacheUpdate
$this->invalidateTitles( $titleArray );
}
}
- wfRunHooks( 'HTMLCacheUpdate::doUpdate', array($this->mTitle) );
}
/**
diff --git a/includes/HTMLFileCache.php b/includes/HTMLFileCache.php
index 53af1e6e..26cb147d 100644
--- a/includes/HTMLFileCache.php
+++ b/includes/HTMLFileCache.php
@@ -7,8 +7,7 @@
/**
* Handles talking to the file cache, putting stuff in and taking it back out.
- * Mostly called from Article.php, also from DatabaseFunctions.php for the
- * emergency abort/fallback to cache.
+ * Mostly called from Article.php for the emergency abort/fallback to cache.
*
* Global options that affect this module:
* - $wgCachePages
@@ -31,7 +30,7 @@ class HTMLFileCache {
public function fileCacheName() {
if( !$this->mFileCache ) {
- global $wgCacheDirectory, $wgFileCacheDirectory, $wgRequest;
+ global $wgCacheDirectory, $wgFileCacheDirectory, $wgFileCacheDepth;
if ( $wgFileCacheDirectory ) {
$dir = $wgFileCacheDirectory;
@@ -43,17 +42,21 @@ class HTMLFileCache {
# Store raw pages (like CSS hits) elsewhere
$subdir = ($this->mType === 'raw') ? 'raw/' : '';
+
$key = $this->mTitle->getPrefixedDbkey();
- $hash = md5( $key );
+ if ( $wgFileCacheDepth > 0 ) {
+ $hash = md5( $key );
+ for ( $i = 1; $i <= $wgFileCacheDepth; $i++ ) {
+ $subdir .= substr( $hash, 0, $i ) . '/';
+ }
+ }
# Avoid extension confusion
$key = str_replace( '.', '%2E', urlencode( $key ) );
-
- $hash1 = substr( $hash, 0, 1 );
- $hash2 = substr( $hash, 0, 2 );
- $this->mFileCache = "{$wgFileCacheDirectory}/{$subdir}{$hash1}/{$hash2}/{$key}.html";
+ $this->mFileCache = "{$dir}/{$subdir}{$key}.html";
- if( $this->useGzip() )
+ if( $this->useGzip() ) {
$this->mFileCache .= '.gz';
+ }
wfDebug( __METHOD__ . ": {$this->mFileCache}\n" );
}
@@ -135,7 +138,7 @@ class HTMLFileCache {
/* Working directory to/from output */
public function loadFromFileCache() {
- global $wgOut, $wgMimeType, $wgOutputEncoding, $wgContLanguageCode;
+ global $wgOut, $wgMimeType, $wgOutputEncoding, $wgLanguageCode;
wfDebug( __METHOD__ . "()\n");
$filename = $this->fileCacheName();
// Raw pages should handle cache control on their own,
@@ -143,7 +146,7 @@ class HTMLFileCache {
if( $this->mType !== 'raw' ) {
$wgOut->sendCacheControl();
header( "Content-Type: $wgMimeType; charset={$wgOutputEncoding}" );
- header( "Content-Language: $wgContLanguageCode" );
+ header( "Content-Language: $wgLanguageCode" );
}
if( $this->useGzip() ) {
@@ -210,11 +213,21 @@ class HTMLFileCache {
public static function clearFileCache( $title ) {
global $wgUseFileCache;
- if( !$wgUseFileCache ) return false;
+
+ if ( !$wgUseFileCache ) {
+ return false;
+ }
+
+ wfSuppressWarnings();
+
$fc = new self( $title, 'view' );
- @unlink( $fc->fileCacheName() );
+ unlink( $fc->fileCacheName() );
+
$fc = new self( $title, 'raw' );
- @unlink( $fc->fileCacheName() );
+ unlink( $fc->fileCacheName() );
+
+ wfRestoreWarnings();
+
return true;
}
}
diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index 12687dc4..be912daf 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -1,48 +1,52 @@
<?php
-
/**
- * Object handling generic submission, CSRF protection, layout and
- * other logic for UI forms. in a reusable manner.
+ * Object handling generic submission, CSRF protection, layout and
+ * other logic for UI forms. in a reusable manner.
*
- * In order to generate the form, the HTMLForm object takes an array
- * structure detailing the form fields available. Each element of the
- * array is a basic property-list, including the type of field, the
+ * In order to generate the form, the HTMLForm object takes an array
+ * structure detailing the form fields available. Each element of the
+ * array is a basic property-list, including the type of field, the
* label it is to be given in the form, callbacks for validation and
- * 'filtering', and other pertinent information.
+ * 'filtering', and other pertinent information.
*
* Field types are implemented as subclasses of the generic HTMLFormField
- * object, and typically implement at least getInputHTML, which generates
+ * object, and typically implement at least getInputHTML, which generates
* the HTML for the input field to be placed in the table.
- *
+ *
* The constructor input is an associative array of $fieldname => $info,
* where $info is an Associative Array with any of the following:
- *
- * 'class' -- the subclass of HTMLFormField that will be used
- * to create the object. *NOT* the CSS class!
- * 'type' -- roughly translates into the <select> type attribute.
- * if 'class' is not specified, this is used as a map
- * through HTMLForm::$typeMappings to get the class name.
- * 'default' -- default value when the form is displayed
- * 'id' -- HTML id attribute
- * 'options' -- varies according to the specific object.
- * 'label-message' -- message key for a message to use as the label.
- * can be an array of msg key and then parameters to
- * the message.
- * 'label' -- alternatively, a raw text message. Overridden by
- * label-message
- * 'help-message' -- message key for a message to use as a help text.
- * can be an array of msg key and then parameters to
- * the message.
- * 'required' -- passed through to the object, indicating that it
- * is a required field.
- * 'size' -- the length of text fields
- * 'filter-callback -- a function name to give you the chance to
- * massage the inputted value before it's processed.
- * @see HTMLForm::filter()
- * 'validation-callback' -- a function name to give you the chance
- * to impose extra validation on the field input.
- * @see HTMLForm::validate()
- *
+ *
+ * 'class' -- the subclass of HTMLFormField that will be used
+ * to create the object. *NOT* the CSS class!
+ * 'type' -- roughly translates into the <select> type attribute.
+ * if 'class' is not specified, this is used as a map
+ * through HTMLForm::$typeMappings to get the class name.
+ * 'default' -- default value when the form is displayed
+ * 'id' -- HTML id attribute
+ * 'cssclass' -- CSS class
+ * 'options' -- varies according to the specific object.
+ * 'label-message' -- message key for a message to use as the label.
+ * can be an array of msg key and then parameters to
+ * the message.
+ * 'label' -- alternatively, a raw text message. Overridden by
+ * label-message
+ * 'help-message' -- message key for a message to use as a help text.
+ * can be an array of msg key and then parameters to
+ * the message.
+ * 'required' -- passed through to the object, indicating that it
+ * is a required field.
+ * 'size' -- the length of text fields
+ * 'filter-callback -- a function name to give you the chance to
+ * massage the inputted value before it's processed.
+ * @see HTMLForm::filter()
+ * 'validation-callback' -- a function name to give you the chance
+ * to impose extra validation on the field input.
+ * @see HTMLForm::validate()
+ * 'name' -- By default, the 'name' attribute of the input field
+ * is "wp{$fieldname}". If you want a different name
+ * (eg one without the "wp" prefix), specify it here and
+ * it will be used without modification.
+ *
* TODO: Document 'section' / 'subsection' stuff
*/
class HTMLForm {
@@ -64,38 +68,40 @@ class HTMLForm {
'submit' => 'HTMLSubmitField',
'hidden' => 'HTMLHiddenField',
'edittools' => 'HTMLEditTools',
-
+
# HTMLTextField will output the correct type="" attribute automagically.
# There are about four zillion other HTML5 input types, like url, but
# we don't use those at the moment, so no point in adding all of them.
'email' => 'HTMLTextField',
'password' => 'HTMLTextField',
);
-
+
protected $mMessagePrefix;
protected $mFlatFields;
protected $mFieldTree;
protected $mShowReset = false;
public $mFieldData;
-
+
protected $mSubmitCallback;
protected $mValidationErrorMessage;
-
+
protected $mPre = '';
protected $mHeader = '';
+ protected $mFooter = '';
protected $mPost = '';
protected $mId;
-
+
protected $mSubmitID;
protected $mSubmitName;
protected $mSubmitText;
protected $mSubmitTooltip;
protected $mTitle;
-
+ protected $mMethod = 'post';
+
protected $mUseMultipart = false;
protected $mHiddenFields = array();
protected $mButtons = array();
-
+
protected $mWrapperLegend = false;
/**
@@ -103,31 +109,30 @@ class HTMLForm {
* @param $descriptor Array of Field constructs, as described above
* @param $messagePrefix String a prefix to go in front of default messages
*/
- public function __construct( $descriptor, $messagePrefix='' ) {
+ public function __construct( $descriptor, $messagePrefix = '' ) {
$this->mMessagePrefix = $messagePrefix;
// Expand out into a tree.
$loadedDescriptor = array();
$this->mFlatFields = array();
- foreach( $descriptor as $fieldname => $info ) {
- $section = '';
- if ( isset( $info['section'] ) )
- $section = $info['section'];
+ foreach ( $descriptor as $fieldname => $info ) {
+ $section = isset( $info['section'] )
+ ? $info['section']
+ : '';
- $info['name'] = $fieldname;
-
- if ( isset( $info['type'] ) && $info['type'] == 'file' )
+ if ( isset( $info['type'] ) && $info['type'] == 'file' ) {
$this->mUseMultipart = true;
+ }
- $field = self::loadInputFromParameters( $info );
+ $field = self::loadInputFromParameters( $fieldname, $info );
$field->mParent = $this;
$setSection =& $loadedDescriptor;
- if( $section ) {
+ if ( $section ) {
$sectionParts = explode( '/', $section );
- while( count( $sectionParts ) ) {
+ while ( count( $sectionParts ) ) {
$newName = array_shift( $sectionParts );
if ( !isset( $setSection[$newName] ) ) {
@@ -146,15 +151,15 @@ class HTMLForm {
}
/**
- * Add the HTMLForm-specific JavaScript, if it hasn't been
+ * Add the HTMLForm-specific JavaScript, if it hasn't been
* done already.
*/
static function addJS() {
- if( self::$jsAdded ) return;
+ if ( self::$jsAdded ) return;
- global $wgOut, $wgStylePath;
+ global $wgOut;
- $wgOut->addScriptFile( "$wgStylePath/common/htmlform.js" );
+ $wgOut->addModules( 'mediawiki.legacy.htmlform' );
}
/**
@@ -162,7 +167,7 @@ class HTMLForm {
* @param $descriptor input Descriptor, as described above
* @return HTMLFormField subclass
*/
- static function loadInputFromParameters( $descriptor ) {
+ static function loadInputFromParameters( $fieldname, $descriptor ) {
if ( isset( $descriptor['class'] ) ) {
$class = $descriptor['class'];
} elseif ( isset( $descriptor['type'] ) ) {
@@ -170,9 +175,11 @@ class HTMLForm {
$descriptor['class'] = $class;
}
- if( !$class ) {
+ if ( !$class ) {
throw new MWException( "Descriptor with no class: " . print_r( $descriptor, true ) );
}
+
+ $descriptor['fieldname'] = $fieldname;
$obj = new $class( $descriptor );
@@ -180,31 +187,50 @@ class HTMLForm {
}
/**
- * The here's-one-I-made-earlier option: do the submission if
- * posted, or display the form with or without funky valiation
- * errors
- * @return Bool whether submission was successful.
+ * Prepare form for submission
*/
- function show() {
- $html = '';
+ function prepareForm() {
+ # Check if we have the info we need
+ if ( ! $this->mTitle ) {
+ throw new MWException( "You must call setTitle() on an HTMLForm" );
+ }
+ // FIXME shouldn't this be closer to displayForm() ?
self::addJS();
# Load data from the request.
$this->loadData();
+ }
- # Try a submission
+ /**
+ * Try submitting, with edit token check first
+ * @return Status|boolean
+ */
+ function tryAuthorizedSubmit() {
global $wgUser, $wgRequest;
$editToken = $wgRequest->getVal( 'wpEditToken' );
$result = false;
- if ( $wgUser->matchEditToken( $editToken ) )
+ if ( $this->getMethod() != 'post' || $wgUser->matchEditToken( $editToken ) ) {
$result = $this->trySubmit();
+ }
+ return $result;
+ }
+
+ /**
+ * The here's-one-I-made-earlier option: do the submission if
+ * posted, or display the form with or without funky valiation
+ * errors
+ * @return Bool or Status whether submission was successful.
+ */
+ function show() {
+ $this->prepareForm();
- if( $result === true )
+ $result = $this->tryAuthorizedSubmit();
+ if ( $result === true || ( $result instanceof Status && $result->isGood() ) ){
return $result;
+ }
- # Display form.
$this->displayForm( $result );
return false;
}
@@ -213,19 +239,20 @@ class HTMLForm {
* Validate all the fields, and call the submision callback
* function if everything is kosher.
* @return Mixed Bool true == Successful submission, Bool false
- * == No submission attempted, anything else == Error to
+ * == No submission attempted, anything else == Error to
* display.
*/
function trySubmit() {
# Check for validation
- foreach( $this->mFlatFields as $fieldname => $field ) {
- if ( !empty( $field->mParams['nodata'] ) )
+ foreach ( $this->mFlatFields as $fieldname => $field ) {
+ if ( !empty( $field->mParams['nodata'] ) ) {
continue;
- if ( $field->validate(
+ }
+ if ( $field->validate(
$this->mFieldData[$fieldname],
- $this->mFieldData )
- !== true )
- {
+ $this->mFieldData )
+ !== true
+ ) {
return isset( $this->mValidationErrorMessage )
? $this->mValidationErrorMessage
: array( 'htmlform-invalid-input' );
@@ -254,14 +281,14 @@ class HTMLForm {
}
/**
- * Set a message to display on a validation error.
+ * Set a message to display on a validation error.
* @param $msg Mixed String or Array of valid inputs to wfMsgExt()
* (so each entry can be either a String or Array)
*/
function setValidationErrorMessage( $msg ) {
$this->mValidationErrorMessage = $msg;
}
-
+
/**
* Set the introductory message, overwriting any existing message.
* @param $msg String complete text of message to display
@@ -273,52 +300,58 @@ class HTMLForm {
* @param $msg String complete text of message to display
*/
function addPreText( $msg ) { $this->mPre .= $msg; }
-
+
/**
* Add header text, inside the form.
* @param $msg String complete text of message to display
*/
function addHeaderText( $msg ) { $this->mHeader .= $msg; }
-
+
+ /**
+ * Add footer text, inside the form.
+ * @param $msg String complete text of message to display
+ */
+ function addFooterText( $msg ) { $this->mFooter .= $msg; }
+
/**
* Add text to the end of the display.
* @param $msg String complete text of message to display
*/
function addPostText( $msg ) { $this->mPost .= $msg; }
-
+
/**
* Add a hidden field to the output
- * @param $name String field name
+ * @param $name String field name. This will be used exactly as entered
* @param $value String field value
+ * @param $attribs Array
*/
- public function addHiddenField( $name, $value ){
- $this->mHiddenFields[ $name ] = $value;
+ public function addHiddenField( $name, $value, $attribs = array() ) {
+ $attribs += array( 'name' => $name );
+ $this->mHiddenFields[] = array( $value, $attribs );
}
-
- public function addButton( $name, $value, $id=null, $attribs=null ){
+
+ public function addButton( $name, $value, $id = null, $attribs = null ) {
$this->mButtons[] = compact( 'name', 'value', 'id', 'attribs' );
}
/**
- * Display the form (sending to wgOut), with an appropriate error
+ * Display the form (sending to wgOut), with an appropriate error
* message or stack of messages, and any validation errors, etc.
* @param $submitResult Mixed output from HTMLForm::trySubmit()
*/
function displayForm( $submitResult ) {
global $wgOut;
- if ( $submitResult !== false ) {
- $this->displayErrors( $submitResult );
- }
-
# For good measure (it is the default)
$wgOut->preventClickjacking();
$html = ''
+ . $this->getErrors( $submitResult )
. $this->mHeader
. $this->getBody()
. $this->getHiddenFields()
. $this->getButtons()
+ . $this->mFooter
;
$html = $this->wrapForm( $html );
@@ -336,25 +369,26 @@ class HTMLForm {
* @return String wrapped HTML.
*/
function wrapForm( $html ) {
-
+
# Include a <fieldset> wrapper for style, if requested.
- if ( $this->mWrapperLegend !== false ){
+ if ( $this->mWrapperLegend !== false ) {
$html = Xml::fieldset( $this->mWrapperLegend, $html );
}
# Use multipart/form-data
- $encType = $this->mUseMultipart
+ $encType = $this->mUseMultipart
? 'multipart/form-data'
: 'application/x-www-form-urlencoded';
# Attributes
$attribs = array(
'action' => $this->getTitle()->getFullURL(),
- 'method' => 'post',
+ 'method' => $this->mMethod,
'class' => 'visualClear',
- 'enctype' => $encType,
+ 'enctype' => $encType,
);
- if ( !empty( $this->mId ) )
+ if ( !empty( $this->mId ) ) {
$attribs['id'] = $this->mId;
-
+ }
+
return Html::rawElement( 'form', $attribs, $html );
}
@@ -364,13 +398,17 @@ class HTMLForm {
*/
function getHiddenFields() {
global $wgUser;
- $html = '';
- $html .= Html::hidden( 'wpEditToken', $wgUser->editToken(), array( 'id' => 'wpEditToken' ) ) . "\n";
- $html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
+ $html = '';
- foreach( $this->mHiddenFields as $name => $value ){
- $html .= Html::hidden( $name, $value ) . "\n";
+ if( $this->getMethod() == 'post' ){
+ $html .= Html::hidden( 'wpEditToken', $wgUser->editToken(), array( 'id' => 'wpEditToken' ) ) . "\n";
+ $html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
+ }
+
+ foreach ( $this->mHiddenFields as $data ) {
+ list( $value, $attribs ) = $data;
+ $html .= Html::hidden( $attribs['name'], $value, $attribs ) . "\n";
}
return $html;
@@ -382,13 +420,16 @@ class HTMLForm {
*/
function getButtons() {
$html = '';
-
$attribs = array();
- if ( isset( $this->mSubmitID ) )
+ if ( isset( $this->mSubmitID ) ) {
$attribs['id'] = $this->mSubmitID;
- if ( isset( $this->mSubmitName ) )
+ }
+
+ if ( isset( $this->mSubmitName ) ) {
$attribs['name'] = $this->mSubmitName;
+ }
+
if ( isset( $this->mSubmitTooltip ) ) {
global $wgUser;
$attribs += $wgUser->getSkin()->tooltipAndAccessKeyAttribs( $this->mSubmitTooltip );
@@ -398,7 +439,7 @@ class HTMLForm {
$html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
- if( $this->mShowReset ) {
+ if ( $this->mShowReset ) {
$html .= Html::element(
'input',
array(
@@ -407,20 +448,25 @@ class HTMLForm {
)
) . "\n";
}
-
- foreach( $this->mButtons as $button ){
+
+ foreach ( $this->mButtons as $button ) {
$attrs = array(
'type' => 'submit',
'name' => $button['name'],
'value' => $button['value']
);
- if ( $button['attribs'] )
- $attrs += $button['attribs'];
- if( isset( $button['id'] ) )
+
+ if ( $button['attribs'] ) {
+ $attrs += $button['attribs'];
+ }
+
+ if ( isset( $button['id'] ) ) {
$attrs['id'] = $button['id'];
+ }
+
$html .= Html::element( 'input', $attrs );
}
-
+
return $html;
}
@@ -434,18 +480,25 @@ class HTMLForm {
/**
* Format and display an error message stack.
* @param $errors Mixed String or Array of message keys
+ * @return String
*/
- function displayErrors( $errors ) {
- if ( is_array( $errors ) ) {
+ function getErrors( $errors ) {
+ if ( $errors instanceof Status ) {
+ global $wgOut;
+ if ( $errors->isOK() ) {
+ $errorstr = '';
+ } else {
+ $errorstr = $wgOut->parse( $errors->getWikiText() );
+ }
+ } elseif ( is_array( $errors ) ) {
$errorstr = $this->formatErrors( $errors );
} else {
$errorstr = $errors;
}
-
- $errorstr = Html::rawElement( 'div', array( 'class' => 'error' ), $errorstr );
- global $wgOut;
- $wgOut->addHTML( $errorstr );
+ return $errorstr
+ ? Html::rawElement( 'div', array( 'class' => 'error' ), $errorstr )
+ : '';
}
/**
@@ -455,13 +508,15 @@ class HTMLForm {
*/
static function formatErrors( $errors ) {
$errorstr = '';
+
foreach ( $errors as $error ) {
- if( is_array( $error ) ) {
+ if ( is_array( $error ) ) {
$msg = array_shift( $error );
} else {
$msg = $error;
$error = array();
}
+
$errorstr .= Html::rawElement(
'li',
null,
@@ -488,27 +543,26 @@ class HTMLForm {
*/
function getSubmitText() {
return $this->mSubmitText
- ? $this->mSubmitText
+ ? $this->mSubmitText
: wfMsg( 'htmlform-submit' );
}
-
+
public function setSubmitName( $name ) {
$this->mSubmitName = $name;
}
-
+
public function setSubmitTooltip( $name ) {
$this->mSubmitTooltip = $name;
}
-
/**
- * Set the id for the submit button.
+ * Set the id for the submit button.
* @param $t String. FIXME: Integrity is *not* validated
*/
function setSubmitID( $t ) {
$this->mSubmitID = $t;
}
-
+
public function setId( $id ) {
$this->mId = $id;
}
@@ -518,11 +572,11 @@ class HTMLForm {
* @param $legend String HTML to go inside the <legend> element.
* Will be escaped
*/
- public function setWrapperLegend( $legend ){ $this->mWrapperLegend = $legend; }
+ public function setWrapperLegend( $legend ) { $this->mWrapperLegend = $legend; }
/**
* Set the prefix for various default messages
- * TODO: currently only used for the <fieldset> legend on forms
+ * TODO: currently only used for the <fieldset> legend on forms
* with multiple sections; should be used elsewhre?
* @param $p String
*/
@@ -545,6 +599,18 @@ class HTMLForm {
function getTitle() {
return $this->mTitle;
}
+
+ /**
+ * Set the method used to submit the form
+ * @param $method String
+ */
+ public function setMethod( $method='post' ){
+ $this->mMethod = $method;
+ }
+
+ public function getMethod(){
+ return $this->mMethod;
+ }
/**
* TODO: Document
@@ -555,14 +621,14 @@ class HTMLForm {
$subsectionHtml = '';
$hasLeftColumn = false;
- foreach( $fields as $key => $value ) {
+ foreach ( $fields as $key => $value ) {
if ( is_object( $value ) ) {
$v = empty( $value->mParams['nodata'] )
? $this->mFieldData[$key]
: $value->getDefault();
$tableHtml .= $value->getTableRow( $v );
- if( $value->getLabel() != '&nbsp;' )
+ if ( $value->getLabel() != '&#160;' )
$hasLeftColumn = true;
} elseif ( is_array( $value ) ) {
$section = $this->displaySection( $value, $key );
@@ -572,13 +638,18 @@ class HTMLForm {
}
$classes = array();
- if( !$hasLeftColumn ) // Avoid strange spacing when no labels exist
+
+ if ( !$hasLeftColumn ) { // Avoid strange spacing when no labels exist
$classes[] = 'mw-htmlform-nolabel';
+ }
+
$attribs = array(
- 'class' => implode( ' ', $classes ),
+ 'class' => implode( ' ', $classes ),
);
- if ( $sectionName )
+
+ if ( $sectionName ) {
$attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
+ }
$tableHtml = Html::rawElement( 'table', $attribs,
Html::rawElement( 'tbody', array(), "\n$tableHtml\n" ) ) . "\n";
@@ -594,9 +665,10 @@ class HTMLForm {
$fieldData = array();
- foreach( $this->mFlatFields as $fieldname => $field ) {
- if ( !empty( $field->mParams['nodata'] ) ) continue;
- if ( !empty( $field->mParams['disabled'] ) ) {
+ foreach ( $this->mFlatFields as $fieldname => $field ) {
+ if ( !empty( $field->mParams['nodata'] ) ) {
+ continue;
+ } elseif ( !empty( $field->mParams['disabled'] ) ) {
$fieldData[$fieldname] = $field->getDefault();
} else {
$fieldData[$fieldname] = $field->loadDataFromRequest( $wgRequest );
@@ -604,7 +676,7 @@ class HTMLForm {
}
# Filter data.
- foreach( $fieldData as $name => &$value ) {
+ foreach ( $fieldData as $name => &$value ) {
$field = $this->mFlatFields[$name];
$value = $field->filter( $value, $this->mFlatFields );
}
@@ -614,7 +686,7 @@ class HTMLForm {
/**
* Stop a reset button being shown for this form
- * @param $suppressReset Bool set to false to re-enable the
+ * @param $suppressReset Bool set to false to re-enable the
* button again
*/
function suppressReset( $suppressReset = true ) {
@@ -623,9 +695,9 @@ class HTMLForm {
/**
* Overload this if you want to apply special filtration routines
- * to the form as a whole, after it's submitted but before it's
+ * to the form as a whole, after it's submitted but before it's
* processed.
- * @param $data
+ * @param $data
* @return unknown_type
*/
function filterDataForSubmit( $data ) {
@@ -634,36 +706,37 @@ class HTMLForm {
}
/**
- * The parent class to generate form fields. Any field type should
+ * The parent class to generate form fields. Any field type should
* be a subclass of this.
*/
abstract class HTMLFormField {
-
+
protected $mValidationCallback;
protected $mFilterCallback;
protected $mName;
public $mParams;
protected $mLabel; # String label. Set on construction
protected $mID;
+ protected $mClass = '';
protected $mDefault;
public $mParent;
-
+
/**
* This function must be implemented to return the HTML to generate
* the input object itself. It should not implement the surrounding
* table cells/rows, or labels/help messages.
* @param $value String the value to set the input to; eg a default
- * text for a text input.
+ * text for a text input.
* @return String valid HTML.
*/
abstract function getInputHTML( $value );
/**
- * Override this function to add specific validation checks on the
+ * Override this function to add specific validation checks on the
* field input. Don't forget to call parent::validate() to ensure
* that the user-defined callback mValidationCallback is still run
* @param $value String the value the field was submitted with
- * @param $alldata $all the data collected from the form
+ * @param $alldata Array the data collected from the form
* @return Mixed Bool true on success, or String error to display.
*/
function validate( $value, $alldata ) {
@@ -671,11 +744,15 @@ abstract class HTMLFormField {
return call_user_func( $this->mValidationCallback, $value, $alldata );
}
+ if ( isset( $this->mParams['required'] ) && $value === '' ) {
+ return wfMsgExt( 'htmlform-required', 'parseinline' );
+ }
+
return true;
}
function filter( $value, $alldata ) {
- if( isset( $this->mFilterCallback ) ) {
+ if ( isset( $this->mFilterCallback ) ) {
$value = call_user_func( $this->mFilterCallback, $value, $alldata );
}
@@ -699,7 +776,7 @@ abstract class HTMLFormField {
* @return String the value
*/
function loadDataFromRequest( $request ) {
- if( $request->getCheck( $this->mName ) ) {
+ if ( $request->getCheck( $this->mName ) ) {
return $request->getText( $this->mName );
} else {
return $this->getDefault();
@@ -714,7 +791,7 @@ abstract class HTMLFormField {
$this->mParams = $params;
# Generate the label from a message, if possible
- if( isset( $params['label-message'] ) ) {
+ if ( isset( $params['label-message'] ) ) {
$msgInfo = $params['label-message'];
if ( is_array( $msgInfo ) ) {
@@ -729,15 +806,17 @@ abstract class HTMLFormField {
$this->mLabel = $params['label'];
}
+ $this->mName = "wp{$params['fieldname']}";
if ( isset( $params['name'] ) ) {
- $name = $params['name'];
- $validName = Sanitizer::escapeId( $name );
- if( $name != $validName ) {
- throw new MWException("Invalid name '$name' passed to " . __METHOD__ );
- }
- $this->mName = 'wp'.$name;
- $this->mID = 'mw-input-'.$name;
+ $this->mName = $params['name'];
}
+
+ $validName = Sanitizer::escapeId( $this->mName );
+ if ( $this->mName != $validName && !isset( $params['nodata'] ) ) {
+ throw new MWException( "Invalid name '{$this->mName}' passed to " . __METHOD__ );
+ }
+
+ $this->mID = "mw-input-{$this->mName}";
if ( isset( $params['default'] ) ) {
$this->mDefault = $params['default'];
@@ -746,12 +825,18 @@ abstract class HTMLFormField {
if ( isset( $params['id'] ) ) {
$id = $params['id'];
$validId = Sanitizer::escapeId( $id );
- if( $id != $validId ) {
- throw new MWException("Invalid id '$id' passed to " . __METHOD__ );
+
+ if ( $id != $validId ) {
+ throw new MWException( "Invalid id '$id' passed to " . __METHOD__ );
}
+
$this->mID = $id;
}
+ if ( isset( $params['cssclass'] ) ) {
+ $this->mClass = $params['cssclass'];
+ }
+
if ( isset( $params['validation-callback'] ) ) {
$this->mValidationCallback = $params['validation-callback'];
}
@@ -772,22 +857,44 @@ abstract class HTMLFormField {
global $wgRequest;
$errors = $this->validate( $value, $this->mParent->mFieldData );
- if ( $errors === true || !$wgRequest->wasPosted() ) {
+
+ $cellAttributes = array();
+ $verticalLabel = false;
+
+ if ( !empty($this->mParams['vertical-label']) ) {
+ $cellAttributes['colspan'] = 2;
+ $verticalLabel = true;
+ }
+
+ if ( $errors === true || ( !$wgRequest->wasPosted() && ( $this->mParent->getMethod() == 'post' ) ) ) {
$errors = '';
} else {
$errors = Html::rawElement( 'span', array( 'class' => 'error' ), $errors );
}
- $html = $this->getLabelHtml();
- $html .= Html::rawElement( 'td', array( 'class' => 'mw-input' ),
- $this->getInputHTML( $value ) ."\n$errors" );
-
+ $label = $this->getLabelHtml( $cellAttributes );
+ $field = Html::rawElement(
+ 'td',
+ array( 'class' => 'mw-input' ) + $cellAttributes,
+ $this->getInputHTML( $value ) . "\n$errors"
+ );
+
$fieldType = get_class( $this );
-
- $html = Html::rawElement( 'tr', array( 'class' => "mw-htmlform-field-$fieldType" ),
- $html ) . "\n";
+
+ if ($verticalLabel) {
+ $html = Html::rawElement( 'tr',
+ array( 'class' => 'mw-htmlform-vertical-label' ), $label );
+ $html .= Html::rawElement( 'tr',
+ array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass}" ),
+ $field );
+ } else {
+ $html = Html::rawElement( 'tr',
+ array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass}" ),
+ $label . $field );
+ }
$helptext = null;
+
if ( isset( $this->mParams['help-message'] ) ) {
$msg = $this->mParams['help-message'];
$helptext = wfMsgExt( $msg, 'parseinline' );
@@ -812,16 +919,18 @@ abstract class HTMLFormField {
function getLabel() {
return $this->mLabel;
}
- function getLabelHtml() {
+ function getLabelHtml( $cellAttributes = array() ) {
# Don't output a for= attribute for labels with no associated input.
# Kind of hacky here, possibly we don't want these to be <label>s at all.
$for = array();
+
if ( $this->needsLabel() ) {
$for['for'] = $this->mID;
}
- return Html::rawElement( 'td', array( 'class' => 'mw-label' ),
- Html::rawElement( 'label', $for, $this->getLabel() )
- );
+
+ return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
+ Html::rawElement( 'label', $for, $this->getLabel() )
+ );
}
function getDefault() {
@@ -831,23 +940,25 @@ abstract class HTMLFormField {
return null;
}
}
-
+
/**
* Returns the attributes required for the tooltip and accesskey.
- *
+ *
* @return array Attributes
*/
public function getTooltipAndAccessKey() {
- if ( empty( $this->mParams['tooltip'] ) )
+ if ( empty( $this->mParams['tooltip'] ) ) {
return array();
+ }
global $wgUser;
- return $wgUser->getSkin()->tooltipAndAccessKeyAttribs();
+
+ return $wgUser->getSkin()->tooltipAndAccessKeyAttribs( $this->mParams['tooltip'] );
}
/**
* flatten an array of options to a single array, for instance,
- * a set of <options> inside <optgroups>.
+ * a set of <options> inside <optgroups>.
* @param $options Associative Array with values either Strings
* or Arrays
* @return Array flattened input
@@ -855,7 +966,7 @@ abstract class HTMLFormField {
public static function flattenOptions( $options ) {
$flatOpts = array();
- foreach( $options as $key => $value ) {
+ foreach ( $options as $value ) {
if ( is_array( $value ) ) {
$flatOpts = array_merge( $flatOpts, self::flattenOptions( $value ) );
} else {
@@ -865,14 +976,12 @@ abstract class HTMLFormField {
return $flatOpts;
}
-
}
class HTMLTextField extends HTMLFormField {
-
function getSize() {
- return isset( $this->mParams['size'] )
- ? $this->mParams['size']
+ return isset( $this->mParams['size'] )
+ ? $this->mParams['size']
: 45;
}
@@ -887,7 +996,7 @@ class HTMLTextField extends HTMLFormField {
if ( isset( $this->mParams['maxlength'] ) ) {
$attribs['maxlength'] = $this->mParams['maxlength'];
}
-
+
if ( !empty( $this->mParams['disabled'] ) ) {
$attribs['disabled'] = 'disabled';
}
@@ -900,13 +1009,13 @@ class HTMLTextField extends HTMLFormField {
$attribs[$param] = $this->mParams[$param];
}
}
- foreach ( array( 'required', 'autofocus', 'multiple', 'readonly' ) as
- $param ) {
+
+ foreach ( array( 'required', 'autofocus', 'multiple', 'readonly' ) as $param ) {
if ( isset( $this->mParams[$param] ) ) {
$attribs[$param] = '';
}
}
-
+
# Implement tiny differences between some field variants
# here, rather than creating a new class for each one which
# is essentially just a clone of this one.
@@ -934,18 +1043,18 @@ class HTMLTextField extends HTMLFormField {
}
}
class HTMLTextAreaField extends HTMLFormField {
-
function getCols() {
- return isset( $this->mParams['cols'] )
- ? $this->mParams['cols']
+ return isset( $this->mParams['cols'] )
+ ? $this->mParams['cols']
: 80;
}
+
function getRows() {
- return isset( $this->mParams['rows'] )
- ? $this->mParams['rows']
+ return isset( $this->mParams['rows'] )
+ ? $this->mParams['rows']
: 25;
}
-
+
function getInputHTML( $value ) {
$attribs = array(
'id' => $this->mID,
@@ -958,10 +1067,11 @@ class HTMLTextAreaField extends HTMLFormField {
if ( !empty( $this->mParams['disabled'] ) ) {
$attribs['disabled'] = 'disabled';
}
+
if ( !empty( $this->mParams['readonly'] ) ) {
$attribs['readonly'] = 'readonly';
}
-
+
foreach ( array( 'required', 'autofocus' ) as $param ) {
if ( isset( $this->mParams[$param] ) ) {
$attribs[$param] = '';
@@ -976,36 +1086,43 @@ class HTMLTextAreaField extends HTMLFormField {
* A field that will contain a numeric value
*/
class HTMLFloatField extends HTMLTextField {
-
function getSize() {
- return isset( $this->mParams['size'] )
- ? $this->mParams['size']
+ return isset( $this->mParams['size'] )
+ ? $this->mParams['size']
: 20;
}
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
- if ( $p !== true ) return $p;
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ $value = trim( $value );
- if ( floatval( $value ) != $value ) {
+ # http://dev.w3.org/html5/spec/common-microsyntaxes.html#real-numbers
+ # with the addition that a leading '+' sign is ok.
+ if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
return wfMsgExt( 'htmlform-float-invalid', 'parse' );
}
- $in_range = true;
-
- # The "int" part of these message names is rather confusing.
+ # The "int" part of these message names is rather confusing.
# They make equal sense for all numbers.
if ( isset( $this->mParams['min'] ) ) {
$min = $this->mParams['min'];
- if ( $min > $value )
+
+ if ( $min > $value ) {
return wfMsgExt( 'htmlform-int-toolow', 'parse', array( $min ) );
+ }
}
if ( isset( $this->mParams['max'] ) ) {
$max = $this->mParams['max'];
- if( $max < $value )
+
+ if ( $max < $value ) {
return wfMsgExt( 'htmlform-int-toohigh', 'parse', array( $max ) );
+ }
}
return true;
@@ -1019,9 +1136,18 @@ class HTMLIntField extends HTMLFloatField {
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
- if ( $p !== true ) return $p;
+ if ( $p !== true ) {
+ return $p;
+ }
- if ( intval( $value ) != $value ) {
+ # http://dev.w3.org/html5/spec/common-microsyntaxes.html#signed-integers
+ # with the addition that a leading '+' sign is ok. Note that leading zeros
+ # are fine, and will be left in the input, which is useful for things like
+ # phone numbers when you know that they are integers (the HTML5 type=tel
+ # input does not require its value to be numeric). If you want a tidier
+ # value to, eg, save in the DB, clean it up with intval().
+ if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) )
+ ) {
return wfMsgExt( 'htmlform-int-invalid', 'parse' );
}
@@ -1034,17 +1160,19 @@ class HTMLIntField extends HTMLFloatField {
*/
class HTMLCheckField extends HTMLFormField {
function getInputHTML( $value ) {
- if ( !empty( $this->mParams['invert'] ) )
+ if ( !empty( $this->mParams['invert'] ) ) {
$value = !$value;
+ }
- $attr = $this->getTooltipAndAccessKey();
+ $attr = $this->getTooltipAndAccessKey();
$attr['id'] = $this->mID;
- if( !empty( $this->mParams['disabled'] ) ) {
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
$attr['disabled'] = 'disabled';
}
- return Xml::check( $this->mName, $value, $attr ) . '&nbsp;' .
- Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+ return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
+ Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
}
/**
@@ -1052,7 +1180,7 @@ class HTMLCheckField extends HTMLFormField {
* added in getInputHTML(), rather than HTMLFormField::getRow()
*/
function getLabel() {
- return '&nbsp;';
+ return '&#160;';
}
function loadDataFromRequest( $request ) {
@@ -1062,7 +1190,7 @@ class HTMLCheckField extends HTMLFormField {
}
// GetCheck won't work like we want for checks.
- if( $request->getCheck( 'wpEditToken' ) ) {
+ if ( $request->getCheck( 'wpEditToken' ) ) {
// XOR has the following truth table, which is what we want
// INVERT VALUE | OUTPUT
// true true | false
@@ -1080,12 +1208,15 @@ class HTMLCheckField extends HTMLFormField {
* A select dropdown field. Basically a wrapper for Xmlselect class
*/
class HTMLSelectField extends HTMLFormField {
-
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
- if( $p !== true ) return $p;
+
+ if ( $p !== true ) {
+ return $p;
+ }
$validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
+
if ( in_array( $value, $validOptions ) )
return true;
else
@@ -1098,13 +1229,18 @@ class HTMLSelectField extends HTMLFormField {
# If one of the options' 'name' is int(0), it is automatically selected.
# because PHP sucks and things int(0) == 'some string'.
# Working around this by forcing all of them to strings.
- $options = array_map( 'strval', $this->mParams['options'] );
+ foreach( $this->mParams['options'] as $key => &$opt ){
+ if( is_int( $opt ) ){
+ $opt = strval( $opt );
+ }
+ }
+ unset( $opt ); # PHP keeps $opt around as a reference, which is a bit scary
- if( !empty( $this->mParams['disabled'] ) ) {
+ if ( !empty( $this->mParams['disabled'] ) ) {
$select->setAttribute( 'disabled', 'disabled' );
}
- $select->addOptions( $options );
+ $select->addOptions( $this->mParams['options'] );
return $select->getHTML();
}
@@ -1117,30 +1253,33 @@ class HTMLSelectOrOtherField extends HTMLTextField {
static $jsAdded = false;
function __construct( $params ) {
- if( !in_array( 'other', $params['options'], true ) ) {
+ if ( !in_array( 'other', $params['options'], true ) ) {
$params['options'][wfMsg( 'htmlform-selectorother-other' )] = 'other';
}
parent::__construct( $params );
}
-
+
static function forceToStringRecursive( $array ) {
- if ( is_array($array) ) {
- return array_map( array( __CLASS__, 'forceToStringRecursive' ), $array);
+ if ( is_array( $array ) ) {
+ return array_map( array( __CLASS__, 'forceToStringRecursive' ), $array );
} else {
- return strval($array);
+ return strval( $array );
}
}
function getInputHTML( $value ) {
$valInSelect = false;
- if( $value !== false )
- $valInSelect = in_array( $value,
- HTMLFormField::flattenOptions( $this->mParams['options'] ) );
+ if ( $value !== false ) {
+ $valInSelect = in_array(
+ $value,
+ HTMLFormField::flattenOptions( $this->mParams['options'] )
+ );
+ }
$selected = $valInSelect ? $value : 'other';
-
+
$opts = self::forceToStringRecursive( $this->mParams['options'] );
$select = new XmlSelect( $this->mName, $this->mID, $selected );
@@ -1149,7 +1288,8 @@ class HTMLSelectOrOtherField extends HTMLTextField {
$select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
$tbAttribs = array( 'id' => $this->mID . '-other', 'size' => $this->getSize() );
- if( !empty( $this->mParams['disabled'] ) ) {
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
$select->setAttribute( 'disabled', 'disabled' );
$tbAttribs['disabled'] = 'disabled';
}
@@ -1160,19 +1300,21 @@ class HTMLSelectOrOtherField extends HTMLTextField {
$tbAttribs['maxlength'] = $this->mParams['maxlength'];
}
- $textbox = Html::input( $this->mName . '-other',
- $valInSelect ? '' : $value,
- 'text',
- $tbAttribs );
+ $textbox = Html::input(
+ $this->mName . '-other',
+ $valInSelect ? '' : $value,
+ 'text',
+ $tbAttribs
+ );
return "$select<br />\n$textbox";
}
function loadDataFromRequest( $request ) {
- if( $request->getCheck( $this->mName ) ) {
+ if ( $request->getCheck( $this->mName ) ) {
$val = $request->getText( $this->mName );
- if( $val == 'other' ) {
+ if ( $val == 'other' ) {
$val = $request->getText( $this->mName . '-other' );
}
@@ -1187,22 +1329,27 @@ class HTMLSelectOrOtherField extends HTMLTextField {
* Multi-select field
*/
class HTMLMultiSelectField extends HTMLFormField {
-
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
- if( $p !== true ) return $p;
- if( !is_array( $value ) ) return false;
+ if ( $p !== true ) {
+ return $p;
+ }
- # If all options are valid, array_intersect of the valid options
+ if ( !is_array( $value ) ) {
+ return false;
+ }
+
+ # If all options are valid, array_intersect of the valid options
# and the provided options will return the provided options.
$validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
$validValues = array_intersect( $value, $validOptions );
- if ( count( $validValues ) == count( $value ) )
+ if ( count( $validValues ) == count( $value ) ) {
return true;
- else
+ } else {
return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+ }
}
function getInputHTML( $value ) {
@@ -1215,20 +1362,23 @@ class HTMLMultiSelectField extends HTMLFormField {
$html = '';
$attribs = array();
+
if ( !empty( $this->mParams['disabled'] ) ) {
$attribs['disabled'] = 'disabled';
}
- foreach( $options as $label => $info ) {
- if( is_array( $info ) ) {
+ foreach ( $options as $label => $info ) {
+ if ( is_array( $info ) ) {
$html .= Html::rawElement( 'h1', array(), $label ) . "\n";
$html .= $this->formatOptions( $info, $value );
} else {
- $thisAttribs = array( 'id' => $this->mID . "-$info", 'value' => $info );
-
- $checkbox = Xml::check( $this->mName . '[]', in_array( $info, $value ),
- $attribs + $thisAttribs );
- $checkbox .= '&nbsp;' . Html::rawElement( 'label', array( 'for' => $this->mID . "-$info" ), $label );
+ $thisAttribs = array( 'id' => "{$this->mID}-$info", 'value' => $info );
+
+ $checkbox = Xml::check(
+ $this->mName . '[]',
+ in_array( $info, $value, true ),
+ $attribs + $thisAttribs );
+ $checkbox .= '&#160;' . Html::rawElement( 'label', array( 'for' => "{$this->mID}-$info" ), $label );
$html .= $checkbox . '<br />';
}
@@ -1239,11 +1389,12 @@ class HTMLMultiSelectField extends HTMLFormField {
function loadDataFromRequest( $request ) {
# won't work with getCheck
- if( $request->getCheck( 'wpEditToken' ) ) {
+ if ( $request->getCheck( 'wpEditToken' ) ) {
$arr = $request->getArray( $this->mName );
- if( !$arr )
+ if ( !$arr ) {
$arr = array();
+ }
return $arr;
} else {
@@ -1270,17 +1421,22 @@ class HTMLMultiSelectField extends HTMLFormField {
class HTMLRadioField extends HTMLFormField {
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
- if( $p !== true ) return $p;
- if( !is_string( $value ) && !is_int( $value ) )
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ if ( !is_string( $value ) && !is_int( $value ) ) {
return false;
+ }
$validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
- if ( in_array( $value, $validOptions ) )
+ if ( in_array( $value, $validOptions ) ) {
return true;
- else
+ } else {
return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+ }
}
/**
@@ -1292,7 +1448,7 @@ class HTMLRadioField extends HTMLFormField {
return $html;
}
-
+
function formatOptions( $options, $value ) {
$html = '';
@@ -1302,15 +1458,19 @@ class HTMLRadioField extends HTMLFormField {
}
# TODO: should this produce an unordered list perhaps?
- foreach( $options as $label => $info ) {
- if( is_array( $info ) ) {
+ foreach ( $options as $label => $info ) {
+ if ( is_array( $info ) ) {
$html .= Html::rawElement( 'h1', array(), $label ) . "\n";
$html .= $this->formatOptions( $info, $value );
} else {
$id = Sanitizer::escapeId( $this->mID . "-$info" );
- $html .= Xml::radio( $this->mName, $info, $info == $value,
- $attribs + array( 'id' => $id ) );
- $html .= '&nbsp;' .
+ $html .= Xml::radio(
+ $this->mName,
+ $info,
+ $info == $value,
+ $attribs + array( 'id' => $id )
+ );
+ $html .= '&#160;' .
Html::rawElement( 'label', array( 'for' => $id ), $label );
$html .= "<br />\n";
@@ -1353,41 +1513,76 @@ class HTMLInfoField extends HTMLFormField {
}
class HTMLHiddenField extends HTMLFormField {
-
- public function getTableRow( $value ){
- $this->mParent->addHiddenField(
- $this->mParams['name'],
- $this->mParams['default']
+ public function __construct( $params ) {
+ parent::__construct( $params );
+
+ # Per HTML5 spec, hidden fields cannot be 'required'
+ # http://dev.w3.org/html5/spec/states-of-the-type-attribute.html#hidden-state
+ unset( $this->mParams['required'] );
+ }
+
+ public function getTableRow( $value ) {
+ $params = array();
+ if ( $this->mID ) {
+ $params['id'] = $this->mID;
+ }
+
+ $this->mParent->addHiddenField(
+ $this->mName,
+ $this->mDefault,
+ $params
);
+
return '';
}
- public function getInputHTML( $value ){ return ''; }
+ public function getInputHTML( $value ) { return ''; }
}
+/**
+ * Add a submit button inline in the form (as opposed to
+ * HTMLForm::addButton(), which will add it at the end).
+ */
class HTMLSubmitField extends HTMLFormField {
-
- public function getTableRow( $value ){
- $this->mParent->addButton(
- $this->mParams['name'],
- $this->mParams['default'],
- isset($this->mParams['id']) ? $this->mParams['id'] : null,
- $this->getTooltipAndAccessKey()
+
+ function __construct( $info ) {
+ $info['nodata'] = true;
+ parent::__construct( $info );
+ }
+
+ function getInputHTML( $value ) {
+ return Xml::submitButton(
+ $value,
+ array(
+ 'class' => 'mw-htmlform-submit',
+ 'name' => $this->mName,
+ 'id' => $this->mID,
+ )
);
}
+
+ protected function needsLabel() {
+ return false;
+ }
- public function getInputHTML( $value ){ return ''; }
+ /**
+ * Button cannot be invalid
+ */
+ public function validate( $value, $alldata ){
+ return true;
+ }
}
class HTMLEditTools extends HTMLFormField {
public function getInputHTML( $value ) {
return '';
}
+
public function getTableRow( $value ) {
- return "<tr><td></td><td class=\"mw-input\">"
- . '<div class="mw-editTools">'
- . wfMsgExt( empty( $this->mParams['message'] )
- ? 'edittools' : $this->mParams['message'],
+ return "<tr><td></td><td class=\"mw-input\">"
+ . '<div class="mw-editTools">'
+ . wfMsgExt( empty( $this->mParams['message'] )
+ ? 'edittools' : $this->mParams['message'],
array( 'parse', 'content' ) )
. "</div></td></tr>\n";
}
diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php
index 664ceb4f..fe2b48bf 100644
--- a/includes/HistoryBlob.php
+++ b/includes/HistoryBlob.php
@@ -11,12 +11,15 @@ interface HistoryBlob
* Adds an item of text, returns a stub object which points to the item.
* You must call setLocation() on the stub object before storing it to the
* database
- * Returns the key for getItem()
+ *
+ * @return String: the key for getItem()
*/
public function addItem( $text );
/**
* Get item by key, or false if the key is not present
+ *
+ * @return String or false
*/
public function getItem( $key );
@@ -32,6 +35,8 @@ interface HistoryBlob
/**
* Get default text. This is called from Revision::getRevisionText()
+ *
+ * @return String
*/
function getText();
}
@@ -132,27 +137,27 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
}
-/**
- * One-step cache variable to hold base blobs; operations that
- * pull multiple revisions may often pull multiple times from
- * the same blob. By keeping the last-used one open, we avoid
- * redundant unserialization and decompression overhead.
- */
-global $wgBlobCache;
-$wgBlobCache = array();
/**
* Pointer object for an item within a CGZ blob stored in the text table.
*/
class HistoryBlobStub {
+ /**
+ * One-step cache variable to hold base blobs; operations that
+ * pull multiple revisions may often pull multiple times from
+ * the same blob. By keeping the last-used one open, we avoid
+ * redundant unserialization and decompression overhead.
+ */
+ protected static $blobCache = array();
+
var $mOldId, $mHash, $mRef;
/**
- * @param string $hash The content hash of the text
- * @param integer $oldid The old_id for the CGZ object
+ * @param $hash Strng: the content hash of the text
+ * @param $oldid Integer: the old_id for the CGZ object
*/
- function HistoryBlobStub( $hash = '', $oldid = 0 ) {
+ function __construct( $hash = '', $oldid = 0 ) {
$this->mHash = $hash;
}
@@ -180,9 +185,9 @@ class HistoryBlobStub {
function getText() {
$fname = 'HistoryBlobStub::getText';
- global $wgBlobCache;
- if( isset( $wgBlobCache[$this->mOldId] ) ) {
- $obj = $wgBlobCache[$this->mOldId];
+
+ if( isset( self::$blobCache[$this->mOldId] ) ) {
+ $obj = self::$blobCache[$this->mOldId];
} else {
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'text', array( 'old_flags', 'old_text' ), array( 'old_id' => $this->mOldId ) );
@@ -220,7 +225,7 @@ class HistoryBlobStub {
// Save this item for reference; if pulling many
// items in a row we'll likely use it again.
$obj->uncompress();
- $wgBlobCache = array( $this->mOldId => $obj );
+ self::$blobCache = array( $this->mOldId => $obj );
}
return $obj->getItem( $this->mHash );
}
@@ -246,9 +251,9 @@ class HistoryBlobCurStub {
var $mCurId;
/**
- * @param integer $curid The cur_id pointed to
+ * @param $curid Integer: the cur_id pointed to
*/
- function HistoryBlobCurStub( $curid = 0 ) {
+ function __construct( $curid = 0 ) {
$this->mCurId = $curid;
}
diff --git a/includes/HistoryPage.php b/includes/HistoryPage.php
index 8f5c2dda..b2cf044a 100644
--- a/includes/HistoryPage.php
+++ b/includes/HistoryPage.php
@@ -19,7 +19,12 @@ class HistoryPage {
const DIR_PREV = 0;
const DIR_NEXT = 1;
- var $article, $title, $skin;
+ /** Contains the Article object. Passed on construction. */
+ private $article;
+ /** The $article title object. Found on construction. */
+ private $title;
+ /** Shortcut to the user Skin object. */
+ private $skin;
/**
* Construct a new HistoryPage.
@@ -34,11 +39,13 @@ class HistoryPage {
$this->preCacheMessages();
}
- function getArticle() {
+ /** Get the Article object we are working on. */
+ public function getArticle() {
return $this->article;
}
- function getTitle() {
+ /** Get the Title object. */
+ public function getTitle() {
return $this->title;
}
@@ -46,12 +53,12 @@ class HistoryPage {
* As we use the same small set of messages in various methods and that
* they are called often, we call them once and save them in $this->message
*/
- function preCacheMessages() {
+ private function preCacheMessages() {
// Precache various messages
- if( !isset( $this->message ) ) {
+ if ( !isset( $this->message ) ) {
$msgs = array( 'cur', 'last', 'pipe-separator' );
- foreach( $msgs as $msg ) {
- $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities') );
+ foreach ( $msgs as $msg ) {
+ $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
}
}
}
@@ -63,17 +70,15 @@ class HistoryPage {
function history() {
global $wgOut, $wgRequest, $wgScript;
- /*
+ /**
* Allow client caching.
*/
- if( $wgOut->checkLastModified( $this->article->getTouched() ) )
+ if ( $wgOut->checkLastModified( $this->article->getTouched() ) )
return; // Client cache fresh and headers sent, nothing more to do.
wfProfileIn( __METHOD__ );
- /*
- * Setup page variables.
- */
+ // Setup page variables.
$wgOut->setPageTitle( wfMsg( 'history-title', $this->title->getPrefixedText() ) );
$wgOut->setPageTitleActionText( wfMsg( 'history_short' ) );
$wgOut->setArticleFlag( false );
@@ -81,8 +86,9 @@ class HistoryPage {
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->setSyndicated( true );
$wgOut->setFeedAppendQuery( 'action=history' );
- $wgOut->addScriptFile( 'history.js' );
+ $wgOut->addModules( array( 'mediawiki.legacy.history', 'mediawiki.action.history' ) );
+ // Creation of a subtitle link pointing to [[Special:Log]]
$logPage = SpecialPage::getTitleFor( 'Log' );
$logLink = $this->skin->link(
$logPage,
@@ -93,16 +99,15 @@ class HistoryPage {
);
$wgOut->setSubtitle( $logLink );
+ // Handle atom/RSS feeds.
$feedType = $wgRequest->getVal( 'feed' );
- if( $feedType ) {
+ if ( $feedType ) {
wfProfileOut( __METHOD__ );
return $this->feed( $feedType );
}
- /*
- * Fail if article doesn't exist.
- */
- if( !$this->title->exists() ) {
+ // Fail nicely if article doesn't exist.
+ if ( !$this->title->exists() ) {
$wgOut->addWikiMsg( 'nohistory' );
# show deletion/move log if there is an entry
LogEventsList::showLogExtract(
@@ -123,21 +128,23 @@ class HistoryPage {
/**
* Add date selector to quickly get to a certain time
*/
- $year = $wgRequest->getInt( 'year' );
- $month = $wgRequest->getInt( 'month' );
- $tagFilter = $wgRequest->getVal( 'tagfilter' );
+ $year = $wgRequest->getInt( 'year' );
+ $month = $wgRequest->getInt( 'month' );
+ $tagFilter = $wgRequest->getVal( 'tagfilter' );
$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
+
/**
* Option to show only revisions that have been (partially) hidden via RevisionDelete
*/
if ( $wgRequest->getBool( 'deleted' ) ) {
- $conds = array("rev_deleted != '0'");
+ $conds = array( "rev_deleted != '0'" );
} else {
$conds = array();
}
$checkDeleted = Xml::checkLabel( wfMsg( 'history-show-deleted' ),
'deleted', 'mw-show-deleted-only', $wgRequest->getBool( 'deleted' ) ) . "\n";
+ // Add the general form
$action = htmlspecialchars( $wgScript );
$wgOut->addHTML(
"<form action=\"$action\" method=\"get\" id=\"mw-history-searchform\">" .
@@ -146,10 +153,10 @@ class HistoryPage {
false,
array( 'id' => 'mw-history-search' )
) .
- Xml::hidden( 'title', $this->title->getPrefixedDBKey() ) . "\n" .
- Xml::hidden( 'action', 'history' ) . "\n" .
- Xml::dateMenu( $year, $month ) . '&nbsp;' .
- ( $tagSelector ? ( implode( '&nbsp;', $tagSelector ) . '&nbsp;' ) : '' ) .
+ Html::hidden( 'title', $this->title->getPrefixedDBKey() ) . "\n" .
+ Html::hidden( 'action', 'history' ) . "\n" .
+ Xml::dateMenu( $year, $month ) . '&#160;' .
+ ( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
$checkDeleted .
Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
'</fieldset></form>'
@@ -157,9 +164,7 @@ class HistoryPage {
wfRunHooks( 'PageHistoryBeforeList', array( &$this->article ) );
- /**
- * Do the list
- */
+ // Create and output the list.
$pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds );
$wgOut->addHTML(
$pager->getNavigationBar() .
@@ -184,24 +189,26 @@ class HistoryPage {
function fetchRevisions( $limit, $offset, $direction ) {
$dbr = wfGetDB( DB_SLAVE );
- if( $direction == HistoryPage::DIR_PREV )
- list($dirs, $oper) = array("ASC", ">=");
- else /* $direction == HistoryPage::DIR_NEXT */
- list($dirs, $oper) = array("DESC", "<=");
+ if ( $direction == HistoryPage::DIR_PREV ) {
+ list( $dirs, $oper ) = array( "ASC", ">=" );
+ } else { /* $direction == HistoryPage::DIR_NEXT */
+ list( $dirs, $oper ) = array( "DESC", "<=" );
+ }
- if( $offset )
- $offsets = array("rev_timestamp $oper '$offset'");
- else
+ if ( $offset ) {
+ $offsets = array( "rev_timestamp $oper '$offset'" );
+ } else {
$offsets = array();
+ }
$page_id = $this->title->getArticleID();
return $dbr->select( 'revision',
Revision::selectFields(),
- array_merge(array("rev_page=$page_id"), $offsets),
+ array_merge( array( "rev_page=$page_id" ), $offsets ),
__METHOD__,
array( 'ORDER BY' => "rev_timestamp $dirs",
- 'USE INDEX' => 'page_timestamp', 'LIMIT' => $limit)
+ 'USE INDEX' => 'page_timestamp', 'LIMIT' => $limit )
);
}
@@ -212,7 +219,7 @@ class HistoryPage {
*/
function feed( $type ) {
global $wgFeedClasses, $wgRequest, $wgFeedLimit;
- if( !FeedUtils::checkFeedOutput($type) ) {
+ if ( !FeedUtils::checkFeedOutput( $type ) ) {
return;
}
@@ -226,14 +233,15 @@ class HistoryPage {
// Get a limit on number of feed entries. Provide a sane default
// of 10 if none is defined (but limit to $wgFeedLimit max)
$limit = $wgRequest->getInt( 'limit', 10 );
- if( $limit > $wgFeedLimit || $limit < 1 ) {
+ if ( $limit > $wgFeedLimit || $limit < 1 ) {
$limit = 10;
}
- $items = $this->fetchRevisions($limit, 0, HistoryPage::DIR_NEXT);
+ $items = $this->fetchRevisions( $limit, 0, HistoryPage::DIR_NEXT );
+ // Generate feed elements enclosed between header and footer.
$feed->outHeader();
- if( $items ) {
- foreach( $items as $row ) {
+ if ( $items ) {
+ foreach ( $items as $row ) {
$feed->outItem( $this->feedItem( $row ) );
}
} else {
@@ -272,7 +280,7 @@ class HistoryPage {
$rev->getTimestamp(),
$rev->getComment()
);
- if( $rev->getComment() == '' ) {
+ if ( $rev->getComment() == '' ) {
global $wgContLang;
$title = wfMsgForContent( 'history-feed-item-nocomment',
$rev->getUserText(),
@@ -304,10 +312,10 @@ class HistoryPager extends ReverseChronologicalPager {
protected $oldIdChecked;
protected $preventClickjacking = false;
- function __construct( $historyPage, $year='', $month='', $tagFilter = '', $conds = array() ) {
+ function __construct( $historyPage, $year = '', $month = '', $tagFilter = '', $conds = array() ) {
parent::__construct();
$this->historyPage = $historyPage;
- $this->title = $this->historyPage->title;
+ $this->title = $this->historyPage->getTitle();
$this->tagFilter = $tagFilter;
$this->getDateCond( $year, $month );
$this->conds = $conds;
@@ -328,12 +336,12 @@ class HistoryPager extends ReverseChronologicalPager {
function getQueryInfo() {
$queryInfo = array(
- 'tables' => array('revision'),
+ 'tables' => array( 'revision' ),
'fields' => Revision::selectFields(),
'conds' => array_merge(
- array( 'rev_page' => $this->historyPage->title->getArticleID() ),
+ array( 'rev_page' => $this->historyPage->getTitle()->getArticleID() ),
$this->conds ),
- 'options' => array( 'USE INDEX' => array('revision' => 'page_timestamp') ),
+ 'options' => array( 'USE INDEX' => array( 'revision' => 'page_timestamp' ) ),
'join_conds' => array( 'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ),
);
ChangeTags::modifyDisplayQuery(
@@ -353,10 +361,11 @@ class HistoryPager extends ReverseChronologicalPager {
}
function formatRow( $row ) {
- if( $this->lastRow ) {
- $latest = ($this->counter == 1 && $this->mIsFirst);
+ if ( $this->lastRow ) {
+ $latest = ( $this->counter == 1 && $this->mIsFirst );
$firstInList = $this->counter == 1;
- $s = $this->historyLine( $this->lastRow, $row, $this->counter++,
+ $this->counter++;
+ $s = $this->historyLine( $this->lastRow, $row,
$this->title->getNotificationTimestamp(), $latest, $firstInList );
} else {
$s = '';
@@ -376,18 +385,26 @@ class HistoryPager extends ReverseChronologicalPager {
$this->counter = 1;
$this->oldIdChecked = 0;
- $wgOut->wrapWikiMsg( "<div class='mw-history-legend'>\n$1</div>", 'histlegend' );
- $s = Xml::openElement( 'form', array( 'action' => $wgScript,
+ $wgOut->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
+ $s = Html::openElement( 'form', array( 'action' => $wgScript,
'id' => 'mw-history-compare' ) ) . "\n";
- $s .= Xml::hidden( 'title', $this->title->getPrefixedDbKey() ) . "\n";
- $s .= Xml::hidden( 'action', 'historysubmit' ) . "\n";
+ $s .= Html::hidden( 'title', $this->title->getPrefixedDbKey() ) . "\n";
+ $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
+
+ $s .= '<div>' . $this->submitButton( wfMsg( 'compareselectedversions' ),
+ array( 'class' => 'historysubmit' ) ) . "\n";
$this->buttons = '<div>';
- if( $wgUser->isAllowed('deleterevision') ) {
+ $this->buttons .= $this->submitButton( wfMsg( 'compareselectedversions' ),
+ array( 'class' => 'historysubmit' )
+ + $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'compareselectedversions' )
+ ) . "\n";
+
+ if ( $wgUser->isAllowed( 'deleterevision' ) ) {
$this->preventClickjacking();
$float = $wgContLang->alignEnd();
# Note bug #20966, <button> is non-standard in IE<8
- $this->buttons .= Xml::element( 'button',
+ $element = Html::element( 'button',
array(
'type' => 'submit',
'name' => 'revisiondelete',
@@ -397,26 +414,21 @@ class HistoryPager extends ReverseChronologicalPager {
),
wfMsg( 'showhideselectedversions' )
) . "\n";
+ $s .= $element;
+ $this->buttons .= $element;
}
- $this->buttons .= $this->submitButton( wfMsg( 'compareselectedversions'),
- array(
- 'class' => 'historysubmit',
- 'accesskey' => wfMsg( 'accesskey-compareselectedversions' ),
- 'title' => wfMsg( 'tooltip-compareselectedversions' ),
- )
- ) . "\n";
$this->buttons .= '</div>';
- $s .= $this->buttons . '<ul id="pagehistory">' . "\n";
+ $s .= '</div><ul id="pagehistory">' . "\n";
return $s;
}
function getEndBody() {
- if( $this->lastRow ) {
+ if ( $this->lastRow ) {
$latest = $this->counter == 1 && $this->mIsFirst;
$firstInList = $this->counter == 1;
- if( $this->mIsBackwards ) {
+ if ( $this->mIsBackwards ) {
# Next row is unknown, but for UI reasons, probably exists if an offset has been specified
- if( $this->mOffset == '' ) {
+ if ( $this->mOffset == '' ) {
$next = null;
} else {
$next = 'unknown';
@@ -425,14 +437,15 @@ class HistoryPager extends ReverseChronologicalPager {
# The next row is the past-the-end row
$next = $this->mPastTheEndRow;
}
- $s = $this->historyLine( $this->lastRow, $next, $this->counter++,
+ $this->counter++;
+ $s = $this->historyLine( $this->lastRow, $next,
$this->title->getNotificationTimestamp(), $latest, $firstInList );
} else {
$s = '';
}
$s .= "</ul>\n";
# Add second buttons only if there is more than one rev
- if( $this->getNumRows() > 2 ) {
+ if ( $this->getNumRows() > 2 ) {
$s .= $this->buttons;
}
$s .= '</form>';
@@ -448,7 +461,7 @@ class HistoryPager extends ReverseChronologicalPager {
*/
function submitButton( $message, $attributes = array() ) {
# Disable submit button if history has 1 revision only
- if( $this->getNumRows() > 1 ) {
+ if ( $this->getNumRows() > 1 ) {
return Xml::submitButton( $message , $attributes );
} else {
return '';
@@ -462,13 +475,12 @@ class HistoryPager extends ReverseChronologicalPager {
*
* @param $row Object: the database row corresponding to the previous line.
* @param $next Mixed: the database row corresponding to the next line.
- * @param $counter Integer: apparently a counter of what row number we're at, counted from the top row = 1.
* @param $notificationtimestamp
* @param $latest Boolean: whether this row corresponds to the page's latest revision.
* @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page.
* @return String: HTML output for the row
*/
- function historyLine( $row, $next, $counter = '', $notificationtimestamp = false,
+ function historyLine( $row, $next, $notificationtimestamp = false,
$latest = false, $firstInList = false )
{
global $wgUser, $wgLang;
@@ -476,8 +488,8 @@ class HistoryPager extends ReverseChronologicalPager {
$rev->setTitle( $this->title );
$curlink = $this->curLink( $rev, $latest );
- $lastlink = $this->lastLink( $rev, $next, $counter );
- $diffButtons = $this->diffButtons( $rev, $firstInList, $counter );
+ $lastlink = $this->lastLink( $rev, $next );
+ $diffButtons = $this->diffButtons( $rev, $firstInList );
$histLinks = Html::rawElement(
'span',
array( 'class' => 'mw-history-histlinks' ),
@@ -489,61 +501,63 @@ class HistoryPager extends ReverseChronologicalPager {
$classes = array();
$del = '';
- // User can delete revisions...
- if( $wgUser->isAllowed( 'deleterevision' ) ) {
+ // Show checkboxes for each revision
+ if ( $wgUser->isAllowed( 'deleterevision' ) ) {
$this->preventClickjacking();
// If revision was hidden from sysops, disable the checkbox
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
$del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
// Otherwise, enable the checkbox...
} else {
$del = Xml::check( 'showhiderevisions', false,
- array( 'name' => 'ids['.$rev->getId().']' ) );
+ array( 'name' => 'ids[' . $rev->getId() . ']' ) );
}
// User can only view deleted revisions...
- } else if( $rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) {
+ } else if ( $rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) {
// If revision was hidden from sysops, disable the link
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
$cdel = $this->getSkin()->revDeleteLinkDisabled( false );
// Otherwise, show the link...
} else {
$query = array( 'type' => 'revision',
- 'target' => $this->title->getPrefixedDbkey(), 'ids' => $rev->getId() );
+ 'target' => $this->title->getPrefixedDbkey(), 'ids' => $rev->getId() );
$del .= $this->getSkin()->revDeleteLink( $query,
$rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
}
}
- if( $del ) $s .= " $del ";
+ if ( $del ) {
+ $s .= " $del ";
+ }
$s .= " $link";
$s .= " <span class='history-user'>" .
$this->getSkin()->revUserTools( $rev, true ) . "</span>";
- if( $rev->isMinor() ) {
+ if ( $rev->isMinor() ) {
$s .= ' ' . ChangesList::flag( 'minor' );
}
- if( !is_null( $size = $rev->getSize() ) && !$rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( !is_null( $size = $rev->getSize() ) && !$rev->isDeleted( Revision::DELETED_TEXT ) ) {
$s .= ' ' . $this->getSkin()->formatRevisionSize( $size );
}
$s .= $this->getSkin()->revComment( $rev, false, true );
- if( $notificationtimestamp && ($row->rev_timestamp >= $notificationtimestamp) ) {
+ if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
$s .= ' <span class="updatedmarker">' . wfMsgHtml( 'updatedmarker' ) . '</span>';
}
$tools = array();
# Rollback and undo links
- if( !is_null( $next ) && is_object( $next ) ) {
- if( $latest && $this->title->userCan( 'rollback' ) && $this->title->userCan( 'edit' ) ) {
+ if ( !is_null( $next ) && is_object( $next ) ) {
+ if ( $latest && $this->title->userCan( 'rollback' ) && $this->title->userCan( 'edit' ) ) {
$this->preventClickjacking();
- $tools[] = '<span class="mw-rollback-link">'.
- $this->getSkin()->buildRollbackLink( $rev ).'</span>';
+ $tools[] = '<span class="mw-rollback-link">' .
+ $this->getSkin()->buildRollbackLink( $rev ) . '</span>';
}
- if( $this->title->quickUserCan( 'edit' )
+ if ( $this->title->quickUserCan( 'edit' )
&& !$rev->isDeleted( Revision::DELETED_TEXT )
&& !$next->rev_deleted & Revision::DELETED_TEXT )
{
@@ -566,12 +580,12 @@ class HistoryPager extends ReverseChronologicalPager {
}
}
- if( $tools ) {
+ if ( $tools ) {
$s .= ' (' . $wgLang->pipeList( $tools ) . ')';
}
# Tags
- list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow( $row->ts_tags, 'history' );
+ list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'history' );
$classes = array_merge( $classes, $newClasses );
$s .= " $tagSummary";
@@ -593,9 +607,9 @@ class HistoryPager extends ReverseChronologicalPager {
*/
function revLink( $rev ) {
global $wgLang;
- $date = $wgLang->timeanddate( wfTimestamp(TS_MW, $rev->getTimestamp()), true );
+ $date = $wgLang->timeanddate( wfTimestamp( TS_MW, $rev->getTimestamp() ), true );
$date = htmlspecialchars( $date );
- if( !$rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( $rev->userCan( Revision::DELETED_TEXT ) ) {
$link = $this->getSkin()->link(
$this->title,
$date,
@@ -604,7 +618,10 @@ class HistoryPager extends ReverseChronologicalPager {
array( 'known', 'noclasses' )
);
} else {
- $link = "<span class=\"history-deleted\">$date</span>";
+ $link = $date;
+ }
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $link = "<span class=\"history-deleted\">$link</span>";
}
return $link;
}
@@ -618,7 +635,7 @@ class HistoryPager extends ReverseChronologicalPager {
*/
function curLink( $rev, $latest ) {
$cur = $this->historyPage->message['cur'];
- if( $latest || !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if ( $latest || !$rev->userCan( Revision::DELETED_TEXT ) ) {
return $cur;
} else {
return $this->getSkin()->link(
@@ -639,17 +656,16 @@ class HistoryPager extends ReverseChronologicalPager {
*
* @param $prevRev Revision: the previous revision
* @param $next Mixed: the newer revision
- * @param $counter Integer: what row on the history list this is
* @return String
*/
- function lastLink( $prevRev, $next, $counter ) {
+ function lastLink( $prevRev, $next ) {
$last = $this->historyPage->message['last'];
# $next may either be a Row, null, or "unkown"
- $nextRev = is_object($next) ? new Revision( $next ) : $next;
- if( is_null($next) ) {
+ $nextRev = is_object( $next ) ? new Revision( $next ) : $next;
+ if ( is_null( $next ) ) {
# Probably no next row
return $last;
- } elseif( $next === 'unknown' ) {
+ } elseif ( $next === 'unknown' ) {
# Next row probably exists but is unknown, use an oldid=prev link
return $this->getSkin()->link(
$this->title,
@@ -661,8 +677,8 @@ class HistoryPager extends ReverseChronologicalPager {
),
array( 'known', 'noclasses' )
);
- } elseif( !$prevRev->userCan(Revision::DELETED_TEXT)
- || !$nextRev->userCan(Revision::DELETED_TEXT) )
+ } elseif ( !$prevRev->userCan( Revision::DELETED_TEXT )
+ || !$nextRev->userCan( Revision::DELETED_TEXT ) )
{
return $last;
} else {
@@ -684,15 +700,15 @@ class HistoryPager extends ReverseChronologicalPager {
*
* @param $rev Revision object
* @param $firstInList Boolean: is this version the first one?
- * @param $counter Integer: a counter of what row number we're at, counted from the top row = 1.
+ *
* @return String: HTML output for the radio buttons
*/
- function diffButtons( $rev, $firstInList, $counter ) {
- if( $this->getNumRows() > 1 ) {
+ function diffButtons( $rev, $firstInList ) {
+ if ( $this->getNumRows() > 1 ) {
$id = $rev->getId();
$radio = array( 'type' => 'radio', 'value' => $id );
/** @todo: move title texts to javascript */
- if( $firstInList ) {
+ if ( $firstInList ) {
$first = Xml::element( 'input',
array_merge( $radio, array(
'style' => 'visibility:hidden',
@@ -702,10 +718,10 @@ class HistoryPager extends ReverseChronologicalPager {
$checkmark = array( 'checked' => 'checked' );
} else {
# Check visibility of old revisions
- if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT ) ) {
$radio['disabled'] = 'disabled';
$checkmark = array(); // We will check the next possible one
- } else if( $counter == 2 || !$this->oldIdChecked ) {
+ } else if ( !$this->oldIdChecked ) {
$checkmark = array( 'checked' => 'checked' );
$this->oldIdChecked = $id;
} else {
diff --git a/includes/Hooks.php b/includes/Hooks.php
index dec1c442..168f4bd9 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -1,6 +1,7 @@
<?php
/**
- * Hooks.php -- a tool for running hook functions
+ * A tool for running hook functions.
+ *
* Copyright 2004, 2005 Evan Prodromou <evan@wikitravel.org>.
*
* This program is free software; you can redistribute it and/or modify
@@ -24,9 +25,15 @@
/**
+ * Call hook functions defined in $wgHooks
+ *
* Because programmers assign to $wgHooks, we need to be very
* careful about its contents. So, there's a lot more error-checking
* in here than would normally be necessary.
+ *
+ * @param $event String: event name
+ * @param $args Array: parameters passed to hook functions
+ * @return Boolean
*/
function wfRunHooks($event, $args = array()) {
@@ -39,12 +46,10 @@ function wfRunHooks($event, $args = array()) {
if (!is_array($wgHooks)) {
throw new MWException("Global hooks array is not an array!\n");
- return false;
}
if (!is_array($wgHooks[$event])) {
throw new MWException("Hooks array for event '$event' is not an array!\n");
- return false;
}
foreach ($wgHooks[$event] as $index => $hook) {
@@ -55,6 +60,7 @@ function wfRunHooks($event, $args = array()) {
$data = null;
$have_data = false;
$closure = false;
+ $badhookmsg = false;
/* $hook can be: a function, an object, an array of $function and $data,
* an array of just a function, an array of object and method, or an
@@ -128,13 +134,35 @@ function wfRunHooks($event, $args = array()) {
// Run autoloader (workaround for call_user_func_array bug)
is_callable( $callback );
- /* Call the hook. */
+ /* Call the hook. The documentation of call_user_func_array clearly
+ * states that FALSE is returned on failure. However this is not
+ * case always. In some version of PHP if the function signature
+ * does not match the call signature, PHP will issue an warning:
+ * Param y in x expected to be a reference, value given.
+ *
+ * In that case the call will also return null. The following code
+ * catches that warning and provides better error message. The
+ * function documentation also says that:
+ * In other words, it does not depend on the function signature
+ * whether the parameter is passed by a value or by a reference.
+ * There is also PHP bug http://bugs.php.net/bug.php?id=47554 which
+ * is unsurprisingly marked as bogus. In short handling of failures
+ * with call_user_func_array is a failure, the documentation for that
+ * function is wrong and misleading and PHP developers don't see any
+ * problem here.
+ */
+ $retval = null;
+ set_error_handler( 'hookErrorHandler' );
wfProfileIn( $func );
- $retval = call_user_func_array( $callback, $hook_args );
+ try {
+ $retval = call_user_func_array( $callback, $hook_args );
+ } catch ( MWHookException $e ) {
+ $badhookmsg = $e->getMessage();
+ }
wfProfileOut( $func );
+ restore_error_handler();
/* String return is an error; false return means stop processing. */
-
if ( is_string( $retval ) ) {
global $wgOut;
$wgOut->showFatalError( $retval );
@@ -152,9 +180,14 @@ function wfRunHooks($event, $args = array()) {
} else {
$prettyFunc = strval( $callback );
}
- throw new MWException( "Detected bug in an extension! " .
- "Hook $prettyFunc failed to return a value; " .
- "should return true to continue hook processing or false to abort." );
+ if ( $badhookmsg ) {
+ throw new MWException( "Detected bug in an extension! " .
+ "Hook $prettyFunc has invalid call signature; " . $badhookmsg );
+ } else {
+ throw new MWException( "Detected bug in an extension! " .
+ "Hook $prettyFunc failed to return a value; " .
+ "should return true to continue hook processing or false to abort." );
+ }
} else if ( !$retval ) {
return false;
}
@@ -162,3 +195,12 @@ function wfRunHooks($event, $args = array()) {
return true;
}
+
+function hookErrorHandler( $errno, $errstr ) {
+ if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
+ throw new MWHookException( $errstr );
+ }
+ return false;
+}
+
+class MWHookException extends MWException {} \ No newline at end of file
diff --git a/includes/Html.php b/includes/Html.php
index 00183b31..6c802ca3 100644
--- a/includes/Html.php
+++ b/includes/Html.php
@@ -1,21 +1,27 @@
<?php
-# Copyright (C) 2009 Aryeh Gregor
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
+/**
+ * Collection of methods to generate HTML content
+ *
+ * Copyright © 2009 Aryeh Gregor
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
/**
* This class is a collection of static functions that serve two purposes:
@@ -38,6 +44,8 @@
* This class is meant to be confined to utility functions that are called from
* trusted code paths. It does not do enforcement of policy like not allowing
* <a> elements.
+ *
+ * @since 1.16
*/
class Html {
# List of void elements from HTML5, section 9.1.2 as of 2009-08-10
@@ -59,10 +67,9 @@ class Html {
);
# Boolean attributes, which may have the value omitted entirely. Manually
- # collected from the HTML5 spec as of 2009-08-10.
+ # collected from the HTML5 spec as of 2010-06-07.
private static $boolAttribs = array(
'async',
- 'autobuffer',
'autofocus',
'autoplay',
'checked',
@@ -72,15 +79,18 @@ class Html {
'formnovalidate',
'hidden',
'ismap',
+ 'itemscope',
'loop',
'multiple',
'novalidate',
'open',
+ 'pubdate',
'readonly',
'required',
'reversed',
'scoped',
'seamless',
+ 'selected',
);
/**
@@ -115,7 +125,7 @@ class Html {
}
return $start;
} else {
- return "$start$contents</$element>";
+ return "$start$contents" . self::closeElement( $element );
}
}
@@ -134,15 +144,23 @@ class Html {
/**
* Identical to rawElement(), but has no third parameter and omits the end
- * tag (and the self-closing / in XML mode for empty elements).
+ * tag (and the self-closing '/' in XML mode for empty elements).
*/
public static function openElement( $element, $attribs = array() ) {
- global $wgHtml5;
+ global $wgHtml5, $wgWellFormedXml;
$attribs = (array)$attribs;
# This is not required in HTML5, but let's do it anyway, for
# consistency and better compression.
$element = strtolower( $element );
+ # In text/html, initial <html> and <head> tags can be omitted under
+ # pretty much any sane circumstances, if they have no attributes. See:
+ # <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
+ if ( !$wgWellFormedXml && !$attribs
+ && in_array( $element, array( 'html', 'head' ) ) ) {
+ return '';
+ }
+
# Remove HTML5-only attributes if we aren't doing HTML5, and disable
# form validation regardless (see bug 23769 and the more detailed
# comment in expandAttributes())
@@ -170,22 +188,6 @@ class Html {
&& !$wgHtml5 ) {
unset( $attribs['type'] );
}
- # Here we're blacklisting some HTML5-only attributes...
- $html5attribs = array(
- 'autocomplete',
- 'autofocus',
- 'max',
- 'min',
- 'multiple',
- 'pattern',
- 'placeholder',
- 'required',
- 'step',
- 'spellcheck',
- );
- foreach ( $html5attribs as $badAttr ) {
- unset( $attribs[$badAttr] );
- }
}
if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
unset( $attribs['maxlength'] );
@@ -196,6 +198,36 @@ class Html {
}
/**
+ * Returns "</$element>", except if $wgWellFormedXml is off, in which case
+ * it returns the empty string when that's guaranteed to be safe.
+ *
+ * @param $element string Name of the element, e.g., 'a'
+ * @return string A closing tag, if required
+ */
+ public static function closeElement( $element ) {
+ global $wgWellFormedXml;
+
+ $element = strtolower( $element );
+
+ # Reference:
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
+ if ( !$wgWellFormedXml && in_array( $element, array(
+ 'html',
+ 'head',
+ 'body',
+ 'li',
+ 'dt',
+ 'dd',
+ 'tr',
+ 'td',
+ 'th',
+ ) ) ) {
+ return '';
+ }
+ return "</$element>";
+ }
+
+ /**
* Given an element name and an associative array of element attributes,
* return an array that is functionally identical to the input array, but
* possibly smaller. In particular, attributes might be stripped if they
@@ -344,6 +376,22 @@ class Html {
continue;
}
+ # Here we're blacklisting some HTML5-only attributes...
+ if ( !$wgHtml5 && in_array( $key, array(
+ 'autocomplete',
+ 'autofocus',
+ 'max',
+ 'min',
+ 'multiple',
+ 'pattern',
+ 'placeholder',
+ 'required',
+ 'step',
+ 'spellcheck',
+ ) ) ) {
+ continue;
+ }
+
# See the "Attributes" section in the HTML syntax part of HTML5,
# 9.1.2.3 as of 2009-08-10. Most attributes can have quotation
# marks omitted, but not all. (Although a literal " is not
@@ -499,8 +547,7 @@ class Html {
}
/**
- * Convenience function to produce an input element with type=hidden, like
- * Xml::hidden.
+ * Convenience function to produce an input element with type=hidden
*
* @param $name string name attribute
* @param $value string value attribute
@@ -529,11 +576,68 @@ class Html {
global $wgHtml5;
$attribs['name'] = $name;
if ( !$wgHtml5 ) {
- if ( !isset( $attribs['cols'] ) )
+ if ( !isset( $attribs['cols'] ) ) {
$attribs['cols'] = "";
- if ( !isset( $attribs['rows'] ) )
+ }
+ if ( !isset( $attribs['rows'] ) ) {
$attribs['rows'] = "";
+ }
}
return self::element( 'textarea', $attribs, $value );
}
+
+ /**
+ * Constructs the opening html-tag with necessary doctypes depending on
+ * global variables.
+ *
+ * @param $attribs array Associative array of miscellaneous extra
+ * attributes, passed to Html::element() of html tag.
+ * @return string Raw HTML
+ */
+ public static function htmlHeader( $attribs = array() ) {
+ $ret = '';
+
+ global $wgMimeType, $wgOutputEncoding;
+ if ( self::isXmlMimeType( $wgMimeType ) ) {
+ $ret .= "<?xml version=\"1.0\" encoding=\"$wgOutputEncoding\" ?" . ">\n";
+ }
+
+ global $wgHtml5, $wgHtml5Version, $wgDocType, $wgDTD;
+ global $wgXhtmlNamespaces, $wgXhtmlDefaultNamespace;
+ if ( $wgHtml5 ) {
+ $ret .= "<!DOCTYPE html>\n";
+ if ( $wgHtml5Version ) {
+ $attribs['version'] = $wgHtml5Version;
+ }
+ } else {
+ $ret .= "<!DOCTYPE html PUBLIC \"$wgDocType\" \"$wgDTD\">\n";
+ $attribs['xmlns'] = $wgXhtmlDefaultNamespace;
+ foreach ( $wgXhtmlNamespaces as $tag => $ns ) {
+ $attribs["xmlns:$tag"] = $ns;
+ }
+ }
+ $html = Html::openElement( 'html', $attribs );
+ if ( $html ) {
+ $html .= "\n";
+ }
+ $ret .= $html;
+ return $ret;
+ }
+
+ /**
+ * Determines if the given mime type is xml.
+ *
+ * @param $mimetype string MimeType
+ * @return Boolean
+ */
+ public static function isXmlMimeType( $mimetype ) {
+ switch ( $mimetype ) {
+ case 'text/xml':
+ case 'application/xhtml+xml':
+ case 'application/xml':
+ return true;
+ default:
+ return false;
+ }
+ }
}
diff --git a/includes/HttpFunctions.old.php b/includes/HttpFunctions.old.php
new file mode 100644
index 00000000..6d28abc6
--- /dev/null
+++ b/includes/HttpFunctions.old.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * HttpRequest was renamed to MWHttpRequest in order
+ * to prevent conflicts with PHP's HTTP extension
+ * which also defines an HttpRequest class.
+ * http://www.php.net/manual/en/class.httprequest.php
+ *
+ * This is for backwards compatibility.
+ */
+
+class HttpRequest extends MWHttpRequest { }
diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php
index d5983635..e6124426 100644
--- a/includes/HttpFunctions.php
+++ b/includes/HttpFunctions.php
@@ -12,28 +12,37 @@ class Http {
/**
* Perform an HTTP request
- * @param $method string HTTP method. Usually GET/POST
- * @param $url string Full URL to act on
- * @param $options options to pass to HttpRequest object
- * Possible keys for the array:
- * timeout Timeout length in seconds
- * postData An array of key-value pairs or a url-encoded form data
- * proxy The proxy to use. Will use $wgHTTPProxy (if set) otherwise.
- * noProxy Override $wgHTTPProxy (if set) and don't use any proxy at all.
- * sslVerifyHost (curl only) Verify the SSL certificate
- * caInfo (curl only) Provide CA information
- * maxRedirects Maximum number of redirects to follow (defaults to 5)
- * followRedirects Whether to follow redirects (defaults to true)
- * @returns mixed (bool)false on failure or a string on success
+ *
+ * @param $method String: HTTP method. Usually GET/POST
+ * @param $url String: full URL to act on
+ * @param $options Array: options to pass to MWHttpRequest object.
+ * Possible keys for the array:
+ * - timeout Timeout length in seconds
+ * - postData An array of key-value pairs or a url-encoded form data
+ * - proxy The proxy to use.
+ * Will use $wgHTTPProxy (if set) otherwise.
+ * - noProxy Override $wgHTTPProxy (if set) and don't use any proxy at all.
+ * - sslVerifyHost (curl only) Verify hostname against certificate
+ * - sslVerifyCert (curl only) Verify SSL certificate
+ * - caInfo (curl only) Provide CA information
+ * - maxRedirects Maximum number of redirects to follow (defaults to 5)
+ * - followRedirects Whether to follow redirects (defaults to false).
+ * Note: this should only be used when the target URL is trusted,
+ * to avoid attacks on intranet services accessible by HTTP.
+ * @return Mixed: (bool)false on failure or a string on success
*/
public static function request( $method, $url, $options = array() ) {
- wfDebug( "HTTP: $method: $url" );
+ $url = wfExpandUrl( $url );
+ wfDebug( "HTTP: $method: $url\n" );
$options['method'] = strtoupper( $method );
+
if ( !isset( $options['timeout'] ) ) {
$options['timeout'] = 'default';
}
- $req = HttpRequest::factory( $url, $options );
+
+ $req = MWHttpRequest::factory( $url, $options );
$status = $req->execute();
+
if ( $status->isOK() ) {
return $req->getContent();
} else {
@@ -60,11 +69,13 @@ class Http {
/**
* Check if the URL can be served by localhost
- * @param $url string Full url to check
- * @return bool
+ *
+ * @param $url String: full url to check
+ * @return Boolean
*/
public static function isLocalURL( $url ) {
global $wgCommandLineMode, $wgConf;
+
if ( $wgCommandLineMode ) {
return false;
}
@@ -77,6 +88,7 @@ class Http {
$domainParts = explode( '.', $host );
// Check if this domain or any superdomain is listed in $wgConf as a local virtual host
$domainParts = array_reverse( $domainParts );
+
for ( $i = 0; $i < count( $domainParts ); $i++ ) {
$domainPart = $domainParts[$i];
if ( $i == 0 ) {
@@ -84,17 +96,19 @@ class Http {
} else {
$domain = $domainPart . '.' . $domain;
}
+
if ( $wgConf->isLocalVHost( $domain ) ) {
return true;
}
}
}
+
return false;
}
/**
* A standard user-agent we can use for external requests.
- * @returns string
+ * @return String
*/
public static function userAgent() {
global $wgVersion;
@@ -102,15 +116,19 @@ class Http {
}
/**
- * Checks that the given URI is a valid one
+ * Checks that the given URI is a valid one. Hardcoding the
+ * protocols, because we only want protocols that both cURL
+ * and php support.
+ *
+ * @fixme this is wildly inaccurate and fails to actually check most stuff
+ *
* @param $uri Mixed: URI to check for validity
- * @returns bool
+ * @returns Boolean
*/
public static function isValidURI( $uri ) {
return preg_match(
- '/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/',
- $uri,
- $matches
+ '/^https?:\/\/[^\/\s]\S*$/D',
+ $uri
);
}
}
@@ -118,8 +136,11 @@ class Http {
/**
* This wrapper class will call out to curl (if available) or fallback
* to regular PHP if necessary for handling internal HTTP requests.
+ *
+ * Renamed from HttpRequest to MWHttpRequst to avoid conflict with
+ * php's HTTP extension.
*/
-class HttpRequest {
+class MWHttpRequest {
protected $content;
protected $timeout = 'default';
protected $headersOnly = null;
@@ -127,6 +148,7 @@ class HttpRequest {
protected $proxy = null;
protected $noProxy = false;
protected $sslVerifyHost = true;
+ protected $sslVerifyCert = true;
protected $caInfo = null;
protected $method = "GET";
protected $reqHeaders = array();
@@ -134,7 +156,7 @@ class HttpRequest {
protected $parsedUrl;
protected $callback;
protected $maxRedirects = 5;
- protected $followRedirects = true;
+ protected $followRedirects = false;
protected $cookieJar;
@@ -146,8 +168,8 @@ class HttpRequest {
public $status;
/**
- * @param $url string url to use
- * @param $options array (optional) extra params to pass (see Http::request())
+ * @param $url String: url to use
+ * @param $options Array: (optional) extra params to pass (see Http::request())
*/
function __construct( $url, $options = array() ) {
global $wgHTTPTimeout;
@@ -156,21 +178,22 @@ class HttpRequest {
$this->parsedUrl = parse_url( $url );
if ( !Http::isValidURI( $this->url ) ) {
- $this->status = Status::newFatal('http-invalid-url');
+ $this->status = Status::newFatal( 'http-invalid-url' );
} else {
$this->status = Status::newGood( 100 ); // continue
}
- if ( isset($options['timeout']) && $options['timeout'] != 'default' ) {
+ if ( isset( $options['timeout'] ) && $options['timeout'] != 'default' ) {
$this->timeout = $options['timeout'];
} else {
$this->timeout = $wgHTTPTimeout;
}
$members = array( "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo",
- "method", "followRedirects", "maxRedirects" );
+ "method", "followRedirects", "maxRedirects", "sslVerifyCert" );
+
foreach ( $members as $o ) {
- if ( isset($options[$o]) ) {
+ if ( isset( $options[$o] ) ) {
$this->$o = $options[$o];
}
}
@@ -178,42 +201,54 @@ class HttpRequest {
/**
* Generate a new request object
- * @see HttpRequest::__construct
+ * @see MWHttpRequest::__construct
*/
public static function factory( $url, $options = null ) {
if ( !Http::$httpEngine ) {
Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
} elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
- throw new MWException( __METHOD__.': curl (http://php.net/curl) is not installed, but'.
+ throw new MWException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
' Http::$httpEngine is set to "curl"' );
}
switch( Http::$httpEngine ) {
- case 'curl':
- return new CurlHttpRequest( $url, $options );
- case 'php':
- if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
- throw new MWException( __METHOD__.': allow_url_fopen needs to be enabled for pure PHP'.
- ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
- }
- return new PhpHttpRequest( $url, $options );
- default:
- throw new MWException( __METHOD__.': The setting of Http::$httpEngine is not valid.' );
+ case 'curl':
+ return new CurlHttpRequest( $url, $options );
+ case 'php':
+ if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
+ throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
+ ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
+ }
+ return new PhpHttpRequest( $url, $options );
+ default:
+ throw new MWException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
}
}
/**
* Get the body, or content, of the response to the request
- * @return string
+ *
+ * @return String
*/
public function getContent() {
return $this->content;
}
/**
+ * Set the parameters of the request
+
+ * @param $args Array
+ * @todo overload the args param
+ */
+ public function setData( $args ) {
+ $this->postData = $args;
+ }
+
+ /**
* Take care of setting up the proxy
* (override in subclass)
- * @return string
+ *
+ * @return String
*/
public function proxySetup() {
global $wgHTTPProxy;
@@ -221,6 +256,7 @@ class HttpRequest {
if ( $this->proxy ) {
return;
}
+
if ( Http::isLocalURL( $this->url ) ) {
$this->proxy = 'http://localhost:80/';
} elseif ( $wgHTTPProxy ) {
@@ -234,20 +270,20 @@ class HttpRequest {
* Set the refererer header
*/
public function setReferer( $url ) {
- $this->setHeader('Referer', $url);
+ $this->setHeader( 'Referer', $url );
}
/**
* Set the user agent
*/
public function setUserAgent( $UA ) {
- $this->setHeader('User-Agent', $UA);
+ $this->setHeader( 'User-Agent', $UA );
}
/**
* Set an arbitrary header
*/
- public function setHeader($name, $value) {
+ public function setHeader( $name, $value ) {
// I feel like I should normalize the case here...
$this->reqHeaders[$name] = $value;
}
@@ -258,30 +294,51 @@ class HttpRequest {
public function getHeaderList() {
$list = array();
- if( $this->cookieJar ) {
+ if ( $this->cookieJar ) {
$this->reqHeaders['Cookie'] =
- $this->cookieJar->serializeToHttpRequest($this->parsedUrl['path'],
- $this->parsedUrl['host']);
+ $this->cookieJar->serializeToHttpRequest(
+ $this->parsedUrl['path'],
+ $this->parsedUrl['host']
+ );
}
- foreach($this->reqHeaders as $name => $value) {
+
+ foreach ( $this->reqHeaders as $name => $value ) {
$list[] = "$name: $value";
}
+
return $list;
}
/**
- * Set the callback
- * @param $callback callback
+ * Set a read callback to accept data read from the HTTP request.
+ * By default, data is appended to an internal buffer which can be
+ * retrieved through $req->getContent().
+ *
+ * To handle data as it comes in -- especially for large files that
+ * would not fit in memory -- you can instead set your own callback,
+ * in the form function($resource, $buffer) where the first parameter
+ * is the low-level resource being read (implementation specific),
+ * and the second parameter is the data buffer.
+ *
+ * You MUST return the number of bytes handled in the buffer; if fewer
+ * bytes are reported handled than were passed to you, the HTTP fetch
+ * will be aborted.
+ *
+ * @param $callback Callback
*/
public function setCallback( $callback ) {
+ if ( !is_callable( $callback ) ) {
+ throw new MWException( 'Invalid MwHttpRequest callback' );
+ }
$this->callback = $callback;
}
/**
* A generic callback to read the body of the response from a remote
* server.
+ *
* @param $fh handle
- * @param $content string
+ * @param $content String
*/
public function read( $fh, $content ) {
$this->content .= $content;
@@ -290,12 +347,15 @@ class HttpRequest {
/**
* Take care of whatever is necessary to perform the URI request.
+ *
* @return Status
*/
public function execute() {
global $wgTitle;
- if( strtoupper($this->method) == "HEAD" ) {
+ $this->content = "";
+
+ if ( strtoupper( $this->method ) == "HEAD" ) {
$this->headersOnly = true;
}
@@ -303,7 +363,7 @@ class HttpRequest {
$this->postData = wfArrayToCGI( $this->postData );
}
- if ( is_object( $wgTitle ) && !isset($this->reqHeaders['Referer']) ) {
+ if ( is_object( $wgTitle ) && !isset( $this->reqHeaders['Referer'] ) ) {
$this->setReferer( $wgTitle->getFullURL() );
}
@@ -315,8 +375,8 @@ class HttpRequest {
$this->setCallback( array( $this, 'read' ) );
}
- if ( !isset($this->reqHeaders['User-Agent']) ) {
- $this->setUserAgent(Http::userAgent());
+ if ( !isset( $this->reqHeaders['User-Agent'] ) ) {
+ $this->setUserAgent( Http::userAgent() );
}
}
@@ -324,18 +384,20 @@ class HttpRequest {
* Parses the headers, including the HTTP status code and any
* Set-Cookie headers. This function expectes the headers to be
* found in an array in the member variable headerList.
- * @returns nothing
+ *
+ * @return nothing
*/
protected function parseHeader() {
$lastname = "";
- foreach( $this->headerList as $header ) {
- if( preg_match( "#^HTTP/([0-9.]+) (.*)#", $header, $match ) ) {
+
+ foreach ( $this->headerList as $header ) {
+ if ( preg_match( "#^HTTP/([0-9.]+) (.*)#", $header, $match ) ) {
$this->respVersion = $match[1];
$this->respStatus = $match[2];
- } elseif( preg_match( "#^[ \t]#", $header ) ) {
- $last = count($this->respHeaders[$lastname]) - 1;
+ } elseif ( preg_match( "#^[ \t]#", $header ) ) {
+ $last = count( $this->respHeaders[$lastname] ) - 1;
$this->respHeaders[$lastname][$last] .= "\r\n$header";
- } elseif( preg_match( "#^([^:]*):[\t ]*(.*)#", $header, $match ) ) {
+ } elseif ( preg_match( "#^([^:]*):[\t ]*(.*)#", $header, $match ) ) {
$this->respHeaders[strtolower( $match[1] )][] = $match[2];
$lastname = strtolower( $match[1] );
}
@@ -345,35 +407,58 @@ class HttpRequest {
}
/**
- * Sets the member variable status to a fatal status if the HTTP
- * status code was not 200.
- * @returns nothing
+ * Sets HTTPRequest status member to a fatal value with the error
+ * message if the returned integer value of the status code was
+ * not successful (< 300) or a redirect (>=300 and < 400). (see
+ * RFC2616, section 10,
+ * http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for a
+ * list of status codes.)
+ *
+ * @return nothing
*/
protected function setStatus() {
- if( !$this->respHeaders ) {
+ if ( !$this->respHeaders ) {
$this->parseHeader();
}
- if((int)$this->respStatus !== 200) {
- list( $code, $message ) = explode(" ", $this->respStatus, 2);
- $this->status->fatal("http-bad-status", $code, $message );
+ if ( (int)$this->respStatus > 399 ) {
+ list( $code, $message ) = explode( " ", $this->respStatus, 2 );
+ $this->status->fatal( "http-bad-status", $code, $message );
}
}
+ /**
+ * Get the integer value of the HTTP status code (e.g. 200 for "200 Ok")
+ * (see RFC2616, section 10, http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ * for a list of status codes.)
+ *
+ * @return Integer
+ */
+ public function getStatus() {
+ if ( !$this->respHeaders ) {
+ $this->parseHeader();
+ }
+
+ return (int)$this->respStatus;
+ }
+
/**
* Returns true if the last status code was a redirect.
- * @return bool
+ *
+ * @return Boolean
*/
public function isRedirect() {
- if( !$this->respHeaders ) {
+ if ( !$this->respHeaders ) {
$this->parseHeader();
}
$status = (int)$this->respStatus;
- if ( $status >= 300 && $status < 400 ) {
+
+ if ( $status >= 300 && $status <= 303 ) {
return true;
}
+
return false;
}
@@ -382,33 +467,39 @@ class HttpRequest {
* request has been executed. Because some headers
* (e.g. Set-Cookie) can appear more than once the, each value of
* the associative array is an array of the values given.
- * @return array
+ *
+ * @return Array
*/
public function getResponseHeaders() {
- if( !$this->respHeaders ) {
+ if ( !$this->respHeaders ) {
$this->parseHeader();
}
+
return $this->respHeaders;
}
/**
* Returns the value of the given response header.
- * @param $header string
- * @return string
+ *
+ * @param $header String
+ * @return String
*/
- public function getResponseHeader($header) {
- if( !$this->respHeaders ) {
+ public function getResponseHeader( $header ) {
+ if ( !$this->respHeaders ) {
$this->parseHeader();
}
+
if ( isset( $this->respHeaders[strtolower ( $header ) ] ) ) {
$v = $this->respHeaders[strtolower ( $header ) ];
return $v[count( $v ) - 1];
}
+
return null;
}
/**
- * Tells the HttpRequest object to use this pre-loaded CookieJar.
+ * Tells the MWHttpRequest object to use this pre-loaded CookieJar.
+ *
* @param $jar CookieJar
*/
public function setCookieJar( $jar ) {
@@ -417,12 +508,14 @@ class HttpRequest {
/**
* Returns the cookie jar in use.
+ *
* @returns CookieJar
*/
public function getCookieJar() {
- if( !$this->respHeaders ) {
+ if ( !$this->respHeaders ) {
$this->parseHeader();
}
+
return $this->cookieJar;
}
@@ -432,23 +525,25 @@ class HttpRequest {
* Set-Cookie headers.
* @see Cookie::set
*/
- public function setCookie( $name, $value = null, $attr = null) {
- if( !$this->cookieJar ) {
+ public function setCookie( $name, $value = null, $attr = null ) {
+ if ( !$this->cookieJar ) {
$this->cookieJar = new CookieJar;
}
- $this->cookieJar->setCookie($name, $value, $attr);
+
+ $this->cookieJar->setCookie( $name, $value, $attr );
}
/**
* Parse the cookies in the response headers and store them in the cookie jar.
*/
protected function parseCookies() {
- if( !$this->cookieJar ) {
+ if ( !$this->cookieJar ) {
$this->cookieJar = new CookieJar;
}
- if( isset( $this->respHeaders['set-cookie'] ) ) {
+
+ if ( isset( $this->respHeaders['set-cookie'] ) ) {
$url = parse_url( $this->getFinalUrl() );
- foreach( $this->respHeaders['set-cookie'] as $cookie ) {
+ foreach ( $this->respHeaders['set-cookie'] as $cookie ) {
$this->cookieJar->parseCookieResponseHeader( $cookie, $url['host'] );
}
}
@@ -456,16 +551,26 @@ class HttpRequest {
/**
* Returns the final URL after all redirections.
- * @returns string
+ *
+ * @return String
*/
public function getFinalUrl() {
- $location = $this->getResponseHeader("Location");
+ $location = $this->getResponseHeader( "Location" );
+
if ( $location ) {
return $location;
}
return $this->url;
}
+
+ /**
+ * Returns true if the backend can follow redirects. Overridden by the
+ * child classes.
+ */
+ public function canFollowRedirects() {
+ return true;
+ }
}
@@ -490,30 +595,33 @@ class Cookie {
* Sets a cookie. Used before a request to set up any individual
* cookies. Used internally after a request to parse the
* Set-Cookie headers.
- * @param $name string the name of the cookie
- * @param $value string the value of the cookie
- * @param $attr array possible key/values:
+ *
+ * @param $value String: the value of the cookie
+ * @param $attr Array: possible key/values:
* expires A date string
* path The path this cookie is used on
* domain Domain this cookie is used on
*/
public function set( $value, $attr ) {
$this->value = $value;
- if( isset( $attr['expires'] ) ) {
+
+ if ( isset( $attr['expires'] ) ) {
$this->isSessionKey = false;
$this->expires = strtotime( $attr['expires'] );
}
- if( isset( $attr['path'] ) ) {
+
+ if ( isset( $attr['path'] ) ) {
$this->path = $attr['path'];
} else {
$this->path = "/";
}
- if( isset( $attr['domain'] ) ) {
- if( self::validateCookieDomain( $attr['domain'] ) ) {
+
+ if ( isset( $attr['domain'] ) ) {
+ if ( self::validateCookieDomain( $attr['domain'] ) ) {
$this->domain = $attr['domain'];
}
} else {
- throw new MWException("You must specify a domain.");
+ throw new MWException( "You must specify a domain." );
}
}
@@ -525,46 +633,52 @@ class Cookie {
* A better method might be to use a blacklist like
* http://publicsuffix.org/
*
- * @param $domain string the domain to validate
- * @param $originDomain string (optional) the domain the cookie originates from
- * @return bool
+ * @param $domain String: the domain to validate
+ * @param $originDomain String: (optional) the domain the cookie originates from
+ * @return Boolean
*/
- public static function validateCookieDomain( $domain, $originDomain = null) {
+ public static function validateCookieDomain( $domain, $originDomain = null ) {
// Don't allow a trailing dot
- if( substr( $domain, -1 ) == "." ) return false;
-
- $dc = explode(".", $domain);
+ if ( substr( $domain, -1 ) == "." ) {
+ return false;
+ }
- // Don't allow cookies for "localhost", "ls" or other dot-less hosts
- if( count($dc) < 2 ) return false;
+ $dc = explode( ".", $domain );
// Only allow full, valid IP addresses
- if( preg_match( '/^[0-9.]+$/', $domain ) ) {
- if( count( $dc ) != 4 ) return false;
+ if ( preg_match( '/^[0-9.]+$/', $domain ) ) {
+ if ( count( $dc ) != 4 ) {
+ return false;
+ }
- if( ip2long( $domain ) === false ) return false;
+ if ( ip2long( $domain ) === false ) {
+ return false;
+ }
- if( $originDomain == null || $originDomain == $domain ) return true;
+ if ( $originDomain == null || $originDomain == $domain ) {
+ return true;
+ }
}
// Don't allow cookies for "co.uk" or "gov.uk", etc, but allow "supermarket.uk"
- if( strrpos( $domain, "." ) - strlen( $domain ) == -3 ) {
- if( (count($dc) == 2 && strlen( $dc[0] ) <= 2 )
- || (count($dc) == 3 && strlen( $dc[0] ) == "" && strlen( $dc[1] ) <= 2 ) ) {
+ if ( strrpos( $domain, "." ) - strlen( $domain ) == -3 ) {
+ if ( ( count( $dc ) == 2 && strlen( $dc[0] ) <= 2 )
+ || ( count( $dc ) == 3 && strlen( $dc[0] ) == "" && strlen( $dc[1] ) <= 2 ) ) {
return false;
}
- if( (count($dc) == 2 || (count($dc) == 3 && $dc[0] == "") )
- && preg_match( '/(com|net|org|gov|edu)\...$/', $domain) ) {
+ if ( ( count( $dc ) == 2 || ( count( $dc ) == 3 && $dc[0] == "" ) )
+ && preg_match( '/(com|net|org|gov|edu)\...$/', $domain ) ) {
return false;
}
}
- if( $originDomain != null ) {
- if( substr( $domain, 0, 1 ) != "." && $domain != $originDomain ) {
+ if ( $originDomain != null ) {
+ if ( substr( $domain, 0, 1 ) != "." && $domain != $originDomain ) {
return false;
}
- if( substr( $domain, 0, 1 ) == "."
+
+ if ( substr( $domain, 0, 1 ) == "."
&& substr_compare( $originDomain, $domain, -strlen( $domain ),
strlen( $domain ), TRUE ) != 0 ) {
return false;
@@ -576,47 +690,50 @@ class Cookie {
/**
* Serialize the cookie jar into a format useful for HTTP Request headers.
- * @param $path string the path that will be used. Required.
- * @param $domain string the domain that will be used. Required.
- * @return string
+ *
+ * @param $path String: the path that will be used. Required.
+ * @param $domain String: the domain that will be used. Required.
+ * @return String
*/
public function serializeToHttpRequest( $path, $domain ) {
$ret = "";
- if( $this->canServeDomain( $domain )
+ if ( $this->canServeDomain( $domain )
&& $this->canServePath( $path )
&& $this->isUnExpired() ) {
- $ret = $this->name ."=". $this->value;
+ $ret = $this->name . "=" . $this->value;
}
return $ret;
}
protected function canServeDomain( $domain ) {
- if( $domain == $this->domain
- || ( strlen( $domain) > strlen( $this->domain )
- && substr( $this->domain, 0, 1) == "."
+ if ( $domain == $this->domain
+ || ( strlen( $domain ) > strlen( $this->domain )
+ && substr( $this->domain, 0, 1 ) == "."
&& substr_compare( $domain, $this->domain, -strlen( $this->domain ),
strlen( $this->domain ), TRUE ) == 0 ) ) {
return true;
}
+
return false;
}
protected function canServePath( $path ) {
- if( $this->path && substr_compare( $this->path, $path, 0, strlen( $this->path ) ) == 0 ) {
+ if ( $this->path && substr_compare( $this->path, $path, 0, strlen( $this->path ) ) == 0 ) {
return true;
}
+
return false;
}
protected function isUnExpired() {
- if( $this->isSessionKey || $this->expires > time() ) {
+ if ( $this->isSessionKey || $this->expires > time() ) {
return true;
}
+
return false;
}
-
}
class CookieJar {
@@ -626,12 +743,13 @@ class CookieJar {
* Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
* @see Cookie::set()
*/
- public function setCookie ($name, $value, $attr) {
+ public function setCookie ( $name, $value, $attr ) {
/* cookies: case insensitive, so this should work.
* We'll still send the cookies back in the same case we got them, though.
*/
- $index = strtoupper($name);
- if( isset( $this->cookie[$index] ) ) {
+ $index = strtoupper( $name );
+
+ if ( isset( $this->cookie[$index] ) ) {
$this->cookie[$index]->set( $value, $attr );
} else {
$this->cookie[$index] = new Cookie( $name, $value, $attr );
@@ -644,38 +762,46 @@ class CookieJar {
public function serializeToHttpRequest( $path, $domain ) {
$cookies = array();
- foreach( $this->cookie as $c ) {
+ foreach ( $this->cookie as $c ) {
$serialized = $c->serializeToHttpRequest( $path, $domain );
- if ( $serialized ) $cookies[] = $serialized;
+
+ if ( $serialized ) {
+ $cookies[] = $serialized;
+ }
}
- return implode("; ", $cookies);
+ return implode( "; ", $cookies );
}
/**
* Parse the content of an Set-Cookie HTTP Response header.
- * @param $cookie string
+ *
+ * @param $cookie String
+ * @param $domain String: cookie's domain
*/
public function parseCookieResponseHeader ( $cookie, $domain ) {
$len = strlen( "Set-Cookie:" );
+
if ( substr_compare( "Set-Cookie:", $cookie, 0, $len, TRUE ) === 0 ) {
$cookie = substr( $cookie, $len );
}
$bit = array_map( 'trim', explode( ";", $cookie ) );
- if ( count($bit) >= 1 ) {
- list($name, $value) = explode( "=", array_shift( $bit ), 2 );
+
+ if ( count( $bit ) >= 1 ) {
+ list( $name, $value ) = explode( "=", array_shift( $bit ), 2 );
$attr = array();
- foreach( $bit as $piece ) {
+
+ foreach ( $bit as $piece ) {
$parts = explode( "=", $piece );
- if( count( $parts ) > 1 ) {
+ if ( count( $parts ) > 1 ) {
$attr[strtolower( $parts[0] )] = $parts[1];
} else {
$attr[strtolower( $parts[0] )] = true;
}
}
- if( !isset( $attr['domain'] ) ) {
+ if ( !isset( $attr['domain'] ) ) {
$attr['domain'] = $domain;
} elseif ( !Cookie::validateCookieDomain( $attr['domain'], $domain ) ) {
return null;
@@ -686,11 +812,10 @@ class CookieJar {
}
}
-
/**
- * HttpRequest implemented using internal curl compiled into PHP
+ * MWHttpRequest implemented using internal curl compiled into PHP
*/
-class CurlHttpRequest extends HttpRequest {
+class CurlHttpRequest extends MWHttpRequest {
static $curlMessageMap = array(
6 => 'http-host-unreachable',
28 => 'http-timed-out'
@@ -706,26 +831,33 @@ class CurlHttpRequest extends HttpRequest {
public function execute() {
parent::execute();
+
if ( !$this->status->isOK() ) {
return $this->status;
}
+
$this->curlOptions[CURLOPT_PROXY] = $this->proxy;
$this->curlOptions[CURLOPT_TIMEOUT] = $this->timeout;
$this->curlOptions[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
$this->curlOptions[CURLOPT_WRITEFUNCTION] = $this->callback;
- $this->curlOptions[CURLOPT_HEADERFUNCTION] = array($this, "readHeader");
+ $this->curlOptions[CURLOPT_HEADERFUNCTION] = array( $this, "readHeader" );
$this->curlOptions[CURLOPT_MAXREDIRS] = $this->maxRedirects;
+ $this->curlOptions[CURLOPT_ENCODING] = ""; # Enable compression
/* not sure these two are actually necessary */
- if(isset($this->reqHeaders['Referer'])) {
+ if ( isset( $this->reqHeaders['Referer'] ) ) {
$this->curlOptions[CURLOPT_REFERER] = $this->reqHeaders['Referer'];
}
$this->curlOptions[CURLOPT_USERAGENT] = $this->reqHeaders['User-Agent'];
- if ( $this->sslVerifyHost ) {
+ if ( isset( $this->sslVerifyHost ) ) {
$this->curlOptions[CURLOPT_SSL_VERIFYHOST] = $this->sslVerifyHost;
}
+ if ( isset( $this->sslVerifyCert ) ) {
+ $this->curlOptions[CURLOPT_SSL_VERIFYPEER] = $this->sslVerifyCert;
+ }
+
if ( $this->caInfo ) {
$this->curlOptions[CURLOPT_CAINFO] = $this->caInfo;
}
@@ -747,12 +879,18 @@ class CurlHttpRequest extends HttpRequest {
$this->curlOptions[CURLOPT_HTTPHEADER] = $this->getHeaderList();
$curlHandle = curl_init( $this->url );
+
if ( !curl_setopt_array( $curlHandle, $this->curlOptions ) ) {
- throw new MWException("Error setting curl options.");
+ throw new MWException( "Error setting curl options." );
}
- if ( ! @curl_setopt( $curlHandle, CURLOPT_FOLLOWLOCATION, $this->followRedirects ) ) {
- wfDebug("Couldn't set CURLOPT_FOLLOWLOCATION. Probably safe_mode or open_basedir is set.");
- /* Continue the processing. If it were in curl_setopt_array, processing would have halted on its entry */
+
+ if ( $this->followRedirects && $this->canFollowRedirects() ) {
+ if ( ! @curl_setopt( $curlHandle, CURLOPT_FOLLOWLOCATION, true ) ) {
+ wfDebug( __METHOD__ . ": Couldn't set CURLOPT_FOLLOWLOCATION. " .
+ "Probably safe_mode or open_basedir is set.\n" );
+ // Continue the processing. If it were in curl_setopt_array,
+ // processing would have halted on its entry
+ }
}
if ( false === curl_exec( $curlHandle ) ) {
@@ -764,20 +902,33 @@ class CurlHttpRequest extends HttpRequest {
$this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
}
} else {
- $this->headerList = explode("\r\n", $this->headerText);
+ $this->headerList = explode( "\r\n", $this->headerText );
}
curl_close( $curlHandle );
$this->parseHeader();
$this->setStatus();
+
return $this->status;
}
-}
-class PhpHttpRequest extends HttpRequest {
- protected $manuallyRedirect = false;
+ public function canFollowRedirects() {
+ if ( strval( ini_get( 'open_basedir' ) ) !== '' || wfIniGetBool( 'safe_mode' ) ) {
+ wfDebug( "Cannot follow redirects in safe mode\n" );
+ return false;
+ }
+
+ if ( !defined( 'CURLOPT_REDIR_PROTOCOLS' ) ) {
+ wfDebug( "Cannot follow redirects with libcurl < 7.19.4 due to CVE-2009-0037\n" );
+ return false;
+ }
+
+ return true;
+ }
+}
+class PhpHttpRequest extends MWHttpRequest {
protected function urlToTcp( $url ) {
$parsedUrl = parse_url( $url );
@@ -789,11 +940,10 @@ class PhpHttpRequest extends HttpRequest {
// At least on Centos 4.8 with PHP 5.1.6, using max_redirects to follow redirects
// causes a segfault
- if ( version_compare( '5.1.7', phpversion(), '>' ) ) {
- $this->manuallyRedirect = true;
- }
+ $manuallyRedirect = version_compare( phpversion(), '5.1.7', '<' );
- if ( $this->parsedUrl['scheme'] != 'http' ) {
+ if ( $this->parsedUrl['scheme'] != 'http' &&
+ $this->parsedUrl['scheme'] != 'https' ) {
$this->status->fatal( 'http-invalid-scheme', $this->parsedUrl['scheme'] );
}
@@ -810,14 +960,14 @@ class PhpHttpRequest extends HttpRequest {
$options['request_fulluri'] = true;
}
- if ( !$this->followRedirects || $this->manuallyRedirect ) {
+ if ( !$this->followRedirects || $manuallyRedirect ) {
$options['max_redirects'] = 0;
} else {
$options['max_redirects'] = $this->maxRedirects;
}
$options['method'] = $this->method;
- $options['header'] = implode("\r\n", $this->getHeaderList());
+ $options['header'] = implode( "\r\n", $this->getHeaderList() );
// Note that at some future point we may want to support
// HTTP/1.1, but we'd have to write support for chunking
// in version of PHP < 5.3.1
@@ -833,7 +983,7 @@ class PhpHttpRequest extends HttpRequest {
$oldTimeout = false;
if ( version_compare( '5.2.1', phpversion(), '>' ) ) {
- $oldTimeout = ini_set('default_socket_timeout', $this->timeout);
+ $oldTimeout = ini_set( 'default_socket_timeout', $this->timeout );
} else {
$options['timeout'] = $this->timeout;
}
@@ -843,25 +993,42 @@ class PhpHttpRequest extends HttpRequest {
$this->headerList = array();
$reqCount = 0;
$url = $this->url;
+
do {
- $again = false;
$reqCount++;
wfSuppressWarnings();
$fh = fopen( $url, "r", false, $context );
wfRestoreWarnings();
- if ( $fh ) {
- $result = stream_get_meta_data( $fh );
- $this->headerList = $result['wrapper_data'];
- $this->parseHeader();
- $url = $this->getResponseHeader("Location");
- $again = $this->manuallyRedirect && $this->followRedirects && $url
- && $this->isRedirect() && $this->maxRedirects > $reqCount;
+
+ if ( !$fh ) {
+ break;
+ }
+
+ $result = stream_get_meta_data( $fh );
+ $this->headerList = $result['wrapper_data'];
+ $this->parseHeader();
+
+ if ( !$manuallyRedirect || !$this->followRedirects ) {
+ break;
}
- } while ( $again );
+
+ # Handle manual redirection
+ if ( !$this->isRedirect() || $reqCount > $this->maxRedirects ) {
+ break;
+ }
+ # Check security of URL
+ $url = $this->getResponseHeader( "Location" );
+
+ if ( substr( $url, 0, 7 ) !== 'http://' ) {
+ wfDebug( __METHOD__ . ": insecure redirection\n" );
+ break;
+ }
+ } while ( true );
if ( $oldTimeout !== false ) {
- ini_set('default_socket_timeout', $oldTimeout);
+ ini_set( 'default_socket_timeout', $oldTimeout );
}
+
$this->setStatus();
if ( $fh === false ) {
@@ -874,13 +1041,15 @@ class PhpHttpRequest extends HttpRequest {
return $this->status;
}
- if($this->status->isOK()) {
+ if ( $this->status->isOK() ) {
while ( !feof( $fh ) ) {
$buf = fread( $fh, 8192 );
+
if ( $buf === false ) {
$this->status->fatal( 'http-read-error' );
break;
}
+
if ( strlen( $buf ) ) {
call_user_func( $this->callback, $fh, $buf );
}
diff --git a/includes/IP.php b/includes/IP.php
index bbe70339..5f492c66 100644
--- a/includes/IP.php
+++ b/includes/IP.php
@@ -1,39 +1,69 @@
<?php
-/*
- * @Author "Ashar Voultoiz" <hashar@altern.org>
- * @License GPL v2 or later
+/**
+ * Functions and constants to play with IP addresses and ranges
+ *
+ * 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 Ashar Voultoiz <hashar at free dot fr>, Aaron Schulz
*/
// Some regex definition to "play" with IP address and IP address blocks
-// An IP is made of 4 bytes from x00 to xFF which is d0 to d255
-define( 'RE_IP_BYTE', '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])');
-define( 'RE_IP_ADD' , RE_IP_BYTE . '\.' . RE_IP_BYTE . '\.' . RE_IP_BYTE . '\.' . RE_IP_BYTE );
+// An IPv4 address is made of 4 bytes from x00 to xFF which is d0 to d255
+define( 'RE_IP_BYTE', '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])' );
+define( 'RE_IP_ADD', RE_IP_BYTE . '\.' . RE_IP_BYTE . '\.' . RE_IP_BYTE . '\.' . RE_IP_BYTE );
// An IPv4 block is an IP address and a prefix (d1 to d32)
-define( 'RE_IP_PREFIX', '(3[0-2]|[12]?\d)');
-define( 'RE_IP_BLOCK', RE_IP_ADD . '\/' . RE_IP_PREFIX);
-// For IPv6 canonicalization (NOT for strict validation; these are quite lax!)
+define( 'RE_IP_PREFIX', '(3[0-2]|[12]?\d)' );
+define( 'RE_IP_BLOCK', RE_IP_ADD . '\/' . RE_IP_PREFIX );
+
+// An IPv6 address is made up of 8 words (each x0000 to xFFFF).
+// However, the "::" abbreviation can be used on consecutive x0000 words.
define( 'RE_IPV6_WORD', '([0-9A-Fa-f]{1,4})' );
-define( 'RE_IPV6_GAP', ':(?:0+:)*(?::(?:0+:)*)?' );
-define( 'RE_IPV6_V4_PREFIX', '0*' . RE_IPV6_GAP . '(?:ffff:)?' );
-// An IPv6 block is an IP address and a prefix (d1 to d128)
define( 'RE_IPV6_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)');
-// An IPv6 IP is made up of 8 octets. However abbreviations like "::" can be used.
-// This is lax! Number of octets/double colons validation not done.
define( 'RE_IPV6_ADD',
- '(' .
- ':(:' . RE_IPV6_WORD . '){1,7}' . // IPs that start with ":"
- '|' .
- RE_IPV6_WORD . '(:{1,2}' . RE_IPV6_WORD . '|::$){1,7}' . // IPs that don't start with ":"
+ '(?:' . // starts with "::" (including "::")
+ ':(?::|(?::' . RE_IPV6_WORD . '){1,7})' .
+ '|' . // ends with "::" (except "::")
+ RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,6}::' .
+ '|' . // contains one "::" in the middle, ending in "::WORD"
+ RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,5}' . '::' . RE_IPV6_WORD .
+ '|' . // contains one "::" in the middle, not ending in "::WORD" (regex for PCRE 4.0+)
+ RE_IPV6_WORD . '(?::(?P<abn>:(?P<iabn>))?' . RE_IPV6_WORD . '(?!:(?P=abn))){1,5}' .
+ ':' . RE_IPV6_WORD . '(?P=iabn)' .
+ // NOTE: (?!(?P=abn)) fails iff "::" used twice; (?P=iabn) passes iff a "::" was found.
+ '|' . // contains no "::"
+ RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){7}' .
')'
+ // NOTE: With PCRE 7.2+, we can combine the two '"::" in the middle' cases into:
+ // RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)'
+ // This also improves regex concatenation by using relative references.
);
+// An IPv6 block is an IP address and a prefix (d1 to d128)
define( 'RE_IPV6_BLOCK', RE_IPV6_ADD . '\/' . RE_IPV6_PREFIX );
+// For IPv6 canonicalization (NOT for strict validation; these are quite lax!)
+define( 'RE_IPV6_GAP', ':(?:0+:)*(?::(?:0+:)*)?' );
+define( 'RE_IPV6_V4_PREFIX', '0*' . RE_IPV6_GAP . '(?:ffff:)?' );
+
// This might be useful for regexps used elsewhere, matches any IPv6 or IPv6 address or network
define( 'IP_ADDRESS_STRING',
'(?:' .
- RE_IP_ADD . '(\/' . RE_IP_PREFIX . '|)' . // IPv4
+ RE_IP_ADD . '(?:\/' . RE_IP_PREFIX . ')?' . // IPv4
'|' .
- RE_IPV6_ADD . '(\/' . RE_IPV6_PREFIX . '|)' . // IPv6
+ RE_IPV6_ADD . '(?:\/' . RE_IPV6_PREFIX . ')?' . // IPv6
')'
);
@@ -43,284 +73,193 @@ define( 'IP_ADDRESS_STRING',
*/
class IP {
/**
- * Given a string, determine if it as valid IP
- * Unlike isValid(), this looks for networks too
- * @param $ip IP address.
- * @return string
+ * Determine if a string is as valid IP address or network (CIDR prefix).
+ * SIIT IPv4-translated addresses are rejected.
+ * Note: canonicalize() tries to convert translated addresses to IPv4.
+ *
+ * @param $ip String: possible IP address
+ * @return Boolean
*/
public static function isIPAddress( $ip ) {
- if ( !$ip ) return false;
- if ( is_array( $ip ) ) {
- throw new MWException( "invalid value passed to " . __METHOD__ );
- }
- // IPv6 IPs with two "::" strings are ambiguous and thus invalid
- return preg_match( '/^' . IP_ADDRESS_STRING . '$/', $ip) && ( substr_count($ip, '::') < 2 );
+ return (bool)preg_match( '/^' . IP_ADDRESS_STRING . '$/', $ip );
}
+ /**
+ * Given a string, determine if it as valid IP in IPv6 only.
+ * Note: Unlike isValid(), this looks for networks too.
+ *
+ * @param $ip String: possible IP address
+ * @return Boolean
+ */
public static function isIPv6( $ip ) {
- if ( !$ip ) return false;
- if( is_array( $ip ) ) {
- throw new MWException( "invalid value passed to " . __METHOD__ );
- }
- $doubleColons = substr_count($ip, '::');
- // IPv6 IPs with two "::" strings are ambiguous and thus invalid
- return preg_match( '/^' . RE_IPV6_ADD . '(\/' . RE_IPV6_PREFIX . '|)$/', $ip)
- && ( $doubleColons == 1 || substr_count($ip,':') == 7 );
+ return (bool)preg_match( '/^' . RE_IPV6_ADD . '(?:\/' . RE_IPV6_PREFIX . ')?$/', $ip );
}
+ /**
+ * Given a string, determine if it as valid IP in IPv4 only.
+ * Note: Unlike isValid(), this looks for networks too.
+ *
+ * @param $ip String: possible IP address
+ * @return Boolean
+ */
public static function isIPv4( $ip ) {
- if ( !$ip ) return false;
- return preg_match( '/^' . RE_IP_ADD . '(\/' . RE_IP_PREFIX . '|)$/', $ip);
+ return (bool)preg_match( '/^' . RE_IP_ADD . '(?:\/' . RE_IP_PREFIX . ')?$/', $ip );
}
/**
- * Given an IP address in dotted-quad notation, returns an IPv6 octet.
- * See http://www.answers.com/topic/ipv4-compatible-address
- * IPs with the first 92 bits as zeros are reserved from IPv6
- * @param $ip quad-dotted IP address.
- * @return string
+ * Validate an IP address. Ranges are NOT considered valid.
+ * SIIT IPv4-translated addresses are rejected.
+ * Note: canonicalize() tries to convert translated addresses to IPv4.
+ *
+ * @param $ip String
+ * @return Boolean: True if it is valid.
*/
- public static function IPv4toIPv6( $ip ) {
- if ( !$ip ) return null;
- // Convert only if needed
- if ( self::isIPv6( $ip ) ) return $ip;
- // IPv4 CIDRs
- if ( strpos( $ip, '/' ) !== false ) {
- $parts = explode( '/', $ip, 2 );
- if ( count( $parts ) != 2 ) {
- return false;
- }
- $network = self::toUnsigned( $parts[0] );
- if ( $network !== false && is_numeric( $parts[1] ) && $parts[1] >= 0 && $parts[1] <= 32 ) {
- $bits = $parts[1] + 96;
- return self::toOctet( $network ) . "/$bits";
- } else {
- return false;
- }
- }
- return self::toOctet( self::toUnsigned( $ip ) );
+ public static function isValid( $ip ) {
+ return ( preg_match( '/^' . RE_IP_ADD . '$/', $ip )
+ || preg_match( '/^' . RE_IPV6_ADD . '$/', $ip ) );
}
/**
- * Given an IPv6 address in octet notation, returns an unsigned integer.
- * @param $ip octet ipv6 IP address.
- * @return string
+ * Validate an IP Block (valid address WITH a valid prefix).
+ * SIIT IPv4-translated addresses are rejected.
+ * Note: canonicalize() tries to convert translated addresses to IPv4.
+ *
+ * @param $ipblock String
+ * @return Boolean: True if it is valid.
*/
- public static function toUnsigned6( $ip ) {
- if ( !$ip ) return null;
- $ip = explode(':', self::sanitizeIP( $ip ) );
- $r_ip = '';
- foreach ($ip as $v) {
- $r_ip .= str_pad( $v, 4, 0, STR_PAD_LEFT );
- }
- $r_ip = wfBaseConvert( $r_ip, 16, 10 );
- return $r_ip;
+ public static function isValidBlock( $ipblock ) {
+ return ( preg_match( '/^' . RE_IPV6_BLOCK . '$/', $ipblock )
+ || preg_match( '/^' . RE_IP_BLOCK . '$/', $ipblock ) );
}
/**
- * Given an IPv6 address in octet notation, returns the expanded octet.
- * IPv4 IPs will be trimmed, thats it...
- * @param $ip octet ipv6 IP address.
- * @return string
+ * Convert an IP into a nice standard form.
+ * IPv6 addresses in octet notation are expanded to 8 words.
+ * IPv4 addresses are just trimmed.
+ *
+ * @param $ip String: IP address in quad or octet form (CIDR or not).
+ * @return String
*/
public static function sanitizeIP( $ip ) {
$ip = trim( $ip );
- if ( $ip === '' ) return null;
- // Trim and return IPv4 addresses
- if ( self::isIPv4($ip) ) return $ip;
- // Only IPv6 addresses can be expanded
- if ( !self::isIPv6($ip) ) return $ip;
+ if ( $ip === '' ) {
+ return null;
+ }
+ if ( self::isIPv4( $ip ) || !self::isIPv6( $ip ) ) {
+ return $ip; // nothing else to do for IPv4 addresses or invalid ones
+ }
// Remove any whitespaces, convert to upper case
$ip = strtoupper( $ip );
// Expand zero abbreviations
$abbrevPos = strpos( $ip, '::' );
if ( $abbrevPos !== false ) {
+ // We know this is valid IPv6. Find the last index of the
+ // address before any CIDR number (e.g. "a:b:c::/24").
+ $CIDRStart = strpos( $ip, "/" );
+ $addressEnd = ( $CIDRStart !== false )
+ ? $CIDRStart - 1
+ : strlen( $ip ) - 1;
// If the '::' is at the beginning...
- if( $abbrevPos == 0 ) {
- $repeat = '0:'; $extra = ''; $pad = 9; // 7+2 (due to '::')
- // If the '::' is at the end...
- } else if( $abbrevPos == (strlen($ip)-2) ) {
- $repeat = ':0'; $extra = ''; $pad = 9; // 7+2 (due to '::')
+ if ( $abbrevPos == 0 ) {
+ $repeat = '0:';
+ $extra = ( $ip == '::' ) ? '0' : ''; // for the address '::'
+ $pad = 9; // 7+2 (due to '::')
// If the '::' is at the end...
+ } elseif ( $abbrevPos == ( $addressEnd - 1 ) ) {
+ $repeat = ':0';
+ $extra = '';
+ $pad = 9; // 7+2 (due to '::')
+ // If the '::' is in the middle...
} else {
- $repeat = ':0'; $extra = ':'; $pad = 8; // 6+2 (due to '::')
+ $repeat = ':0';
+ $extra = ':';
+ $pad = 8; // 6+2 (due to '::')
}
- $ip = str_replace('::', str_repeat($repeat, $pad-substr_count($ip,':')).$extra, $ip);
+ $ip = str_replace( '::',
+ str_repeat( $repeat, $pad - substr_count( $ip, ':' ) ) . $extra,
+ $ip
+ );
}
// Remove leading zereos from each bloc as needed
- $ip = preg_replace( '/(^|:)0+' . RE_IPV6_WORD . '/', '$1$2', $ip );
+ $ip = preg_replace( '/(^|:)0+(' . RE_IPV6_WORD . ')/', '$1$2', $ip );
return $ip;
}
/**
* Given an unsigned integer, returns an IPv6 address in octet notation
- * @param $ip integer IP address.
- * @return string
+ *
+ * @param $ip_int String: IP address.
+ * @return String
*/
public static function toOctet( $ip_int ) {
- // Convert to padded uppercase hex
- $ip_hex = wfBaseConvert($ip_int, 10, 16, 32, false);
- // Separate into 8 octets
- $ip_oct = substr( $ip_hex, 0, 4 );
- for ($n=1; $n < 8; $n++) {
- $ip_oct .= ':' . substr($ip_hex, 4*$n, 4);
- }
- // NO leading zeroes
- $ip_oct = preg_replace( '/(^|:)0+' . RE_IPV6_WORD . '/', '$1$2', $ip_oct );
- return $ip_oct;
+ return self::hexToOctet( wfBaseConvert( $ip_int, 10, 16, 32, false ) );
}
/**
* Convert an IPv4 or IPv6 hexadecimal representation back to readable format
+ *
+ * @param $hex String: number, with "v6-" prefix if it is IPv6
+ * @return String: quad-dotted (IPv4) or octet notation (IPv6)
*/
public static function formatHex( $hex ) {
- if ( substr( $hex, 0, 3 ) == 'v6-' ) {
- return self::hexToOctet( $hex );
- } else {
+ if ( substr( $hex, 0, 3 ) == 'v6-' ) { // IPv6
+ return self::hexToOctet( substr( $hex, 3 ) );
+ } else { // IPv4
return self::hexToQuad( $hex );
}
}
-
+
/**
- * Given a hexadecimal number, returns to an IPv6 address in octet notation
- * @param $ip string hex IP
- * @return string
+ * Converts a hexadecimal number to an IPv6 address in octet notation
+ *
+ * @param $ip_hex String: pure hex (no v6- prefix)
+ * @return String (of format a:b:c:d:e:f:g:h)
*/
- public static function hextoOctet( $ip_hex ) {
- // Convert to padded uppercase hex
- $ip_hex = str_pad( strtoupper($ip_hex), 32, '0');
- // Separate into 8 octets
- $ip_oct = substr( $ip_hex, 0, 4 );
- for ($n=1; $n < 8; $n++) {
- $ip_oct .= ':' . substr($ip_hex, 4*$n, 4);
- }
- // NO leading zeroes
- $ip_oct = preg_replace( '/(^|:)0+' . RE_IPV6_WORD . '/', '$1$2', $ip_oct );
+ public static function hexToOctet( $ip_hex ) {
+ // Pad hex to 32 chars (128 bits)
+ $ip_hex = str_pad( strtoupper( $ip_hex ), 32, '0', STR_PAD_LEFT );
+ // Separate into 8 words
+ $ip_oct = substr( $ip_hex, 0, 4 );
+ for ( $n = 1; $n < 8; $n++ ) {
+ $ip_oct .= ':' . substr( $ip_hex, 4 * $n, 4 );
+ }
+ // NO leading zeroes
+ $ip_oct = preg_replace( '/(^|:)0+(' . RE_IPV6_WORD . ')/', '$1$2', $ip_oct );
return $ip_oct;
}
-
+
/**
- * Converts a hexadecimal number to an IPv4 address in octet notation
- * @param $ip string Hex IP
- * @return string
- */
- public static function hexToQuad( $ip ) {
- // Converts a hexadecimal IP to nnn.nnn.nnn.nnn format
+ * Converts a hexadecimal number to an IPv4 address in quad-dotted notation
+ *
+ * @param $ip_hex String: pure hex
+ * @return String (of format a.b.c.d)
+ */
+ public static function hexToQuad( $ip_hex ) {
+ // Pad hex to 8 chars (32 bits)
+ $ip_hex = str_pad( strtoupper( $ip_hex ), 8, '0', STR_PAD_LEFT );
+ // Separate into four quads
$s = '';
for ( $i = 0; $i < 4; $i++ ) {
if ( $s !== '' ) {
$s .= '.';
}
- $s .= base_convert( substr( $ip, $i * 2, 2 ), 16, 10 );
+ $s .= base_convert( substr( $ip_hex, $i * 2, 2 ), 16, 10 );
}
return $s;
}
/**
- * Convert a network specification in IPv6 CIDR notation to an integer network and a number of bits
- * @return array(string, int)
- */
- public static function parseCIDR6( $range ) {
- # Expand any IPv6 IP
- $parts = explode( '/', IP::sanitizeIP( $range ), 2 );
- if ( count( $parts ) != 2 ) {
- return array( false, false );
- }
- $network = self::toUnsigned6( $parts[0] );
- if ( $network !== false && is_numeric( $parts[1] ) && $parts[1] >= 0 && $parts[1] <= 128 ) {
- $bits = $parts[1];
- if ( $bits == 0 ) {
- $network = 0;
- } else {
- # Native 32 bit functions WONT work here!!!
- # Convert to a padded binary number
- $network = wfBaseConvert( $network, 10, 2, 128 );
- # Truncate the last (128-$bits) bits and replace them with zeros
- $network = str_pad( substr( $network, 0, $bits ), 128, 0, STR_PAD_RIGHT );
- # Convert back to an integer
- $network = wfBaseConvert( $network, 2, 10 );
- }
- } else {
- $network = false;
- $bits = false;
- }
- return array( $network, $bits );
- }
-
- /**
- * Given a string range in a number of formats, return the start and end of
- * the range in hexadecimal. For IPv6.
- *
- * Formats are:
- * 2001:0db8:85a3::7344/96 CIDR
- * 2001:0db8:85a3::7344 - 2001:0db8:85a3::7344 Explicit range
- * 2001:0db8:85a3::7344/96 Single IP
- * @return array(string, int)
- */
- public static function parseRange6( $range ) {
- # Expand any IPv6 IP
- $range = IP::sanitizeIP( $range );
- if ( strpos( $range, '/' ) !== false ) {
- # CIDR
- list( $network, $bits ) = self::parseCIDR6( $range );
- if ( $network === false ) {
- $start = $end = false;
- } else {
- $start = wfBaseConvert( $network, 10, 16, 32, false );
- # Turn network to binary (again)
- $end = wfBaseConvert( $network, 10, 2, 128 );
- # Truncate the last (128-$bits) bits and replace them with ones
- $end = str_pad( substr( $end, 0, $bits ), 128, 1, STR_PAD_RIGHT );
- # Convert to hex
- $end = wfBaseConvert( $end, 2, 16, 32, false );
- # see toHex() comment
- $start = "v6-$start"; $end = "v6-$end";
- }
- } elseif ( strpos( $range, '-' ) !== false ) {
- # Explicit range
- list( $start, $end ) = array_map( 'trim', explode( '-', $range, 2 ) );
- $start = self::toUnsigned6( $start ); $end = self::toUnsigned6( $end );
- if ( $start > $end ) {
- $start = $end = false;
- } else {
- $start = wfBaseConvert( $start, 10, 16, 32, false );
- $end = wfBaseConvert( $end, 10, 16, 32, false );
- }
- # see toHex() comment
- $start = "v6-$start"; $end = "v6-$end";
- } else {
- # Single IP
- $start = $end = self::toHex( $range );
- }
- if ( $start === false || $end === false ) {
- return array( false, false );
- } else {
- return array( $start, $end );
- }
- }
-
- /**
- * Validate an IP address.
- * @return boolean True if it is valid.
- */
- public static function isValid( $ip ) {
- return ( preg_match( '/^' . RE_IP_ADD . '$/', $ip) || preg_match( '/^' . RE_IPV6_ADD . '$/', $ip) );
- }
-
- /**
- * Validate an IP Block.
- * @return boolean True if it is valid.
- */
- public static function isValidBlock( $ipblock ) {
- return ( count(self::toArray($ipblock)) == 1 + 5 );
- }
-
- /**
* Determine if an IP address really is an IP address, and if it is public,
* i.e. not RFC 1918 or similar
* Comes from ProxyTools.php
+ *
+ * @param $ip String
+ * @return Boolean
*/
public static function isPublic( $ip ) {
+ if ( self::isIPv6( $ip ) ) {
+ return self::isPublic6( $ip );
+ }
$n = self::toUnsigned( $ip );
if ( !$n ) {
return false;
@@ -328,7 +267,7 @@ class IP {
// ip2long accepts incomplete addresses, as well as some addresses
// followed by garbage characters. Check that it's really valid.
- if( $ip != long2ip( $n ) ) {
+ if ( $ip != long2ip( $n ) ) {
return false;
}
@@ -354,100 +293,118 @@ class IP {
}
/**
- * Split out an IP block as an array of 4 bytes and a mask,
- * return false if it can't be determined
+ * Determine if an IPv6 address really is an IP address, and if it is public,
+ * i.e. not RFC 4193 or similar
*
- * @param $ip string A quad dotted/octet IP address
- * @return array
+ * @param $ip String
+ * @return Boolean
*/
- public static function toArray( $ipblock ) {
- $matches = array();
- if( preg_match( '/^' . RE_IP_ADD . '(?:\/(?:'.RE_IP_PREFIX.'))?' . '$/', $ipblock, $matches ) ) {
- return $matches;
- } else if ( preg_match( '/^' . RE_IPV6_ADD . '(?:\/(?:'.RE_IPV6_PREFIX.'))?' . '$/', $ipblock, $matches ) ) {
- return $matches;
- } else {
- return false;
+ private static function isPublic6( $ip ) {
+ static $privateRanges = false;
+ if ( !$privateRanges ) {
+ $privateRanges = array(
+ array( 'fc::', 'fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' ), # RFC 4193 (local)
+ array( '0:0:0:0:0:0:0:1', '0:0:0:0:0:0:0:1' ), # loopback
+ );
}
+ $n = self::toHex( $ip );
+ foreach ( $privateRanges as $r ) {
+ $start = self::toHex( $r[0] );
+ $end = self::toHex( $r[1] );
+ if ( $n >= $start && $n <= $end ) {
+ return false;
+ }
+ }
+ return true;
}
/**
- * Return a zero-padded hexadecimal representation of an IP address.
+ * Return a zero-padded upper case hexadecimal representation of an IP address.
*
* Hexadecimal addresses are used because they can easily be extended to
* IPv6 support. To separate the ranges, the return value from this
* function for an IPv6 address will be prefixed with "v6-", a non-
* hexadecimal string which sorts after the IPv4 addresses.
*
- * @param $ip Quad dotted/octet IP address.
- * @return hexidecimal
+ * @param $ip String: quad dotted/octet IP address.
+ * @return String
*/
public static function toHex( $ip ) {
- $n = self::toUnsigned( $ip );
- if ( $n !== false ) {
- $n = self::isIPv6($ip) ? "v6-" . wfBaseConvert( $n, 10, 16, 32, false ) : wfBaseConvert( $n, 10, 16, 8, false );
+ if ( self::isIPv6( $ip ) ) {
+ $n = 'v6-' . self::IPv6ToRawHex( $ip );
+ } else {
+ $n = self::toUnsigned( $ip );
+ if ( $n !== false ) {
+ $n = wfBaseConvert( $n, 10, 16, 8, false );
+ }
}
return $n;
}
/**
+ * Given an IPv6 address in octet notation, returns a pure hex string.
+ *
+ * @param $ip String: octet ipv6 IP address.
+ * @return String: pure hex (uppercase)
+ */
+ private static function IPv6ToRawHex( $ip ) {
+ $ip = self::sanitizeIP( $ip );
+ if ( !$ip ) {
+ return null;
+ }
+ $r_ip = '';
+ foreach ( explode( ':', $ip ) as $v ) {
+ $r_ip .= str_pad( $v, 4, 0, STR_PAD_LEFT );
+ }
+ return $r_ip;
+ }
+
+ /**
* Given an IP address in dotted-quad/octet notation, returns an unsigned integer.
* Like ip2long() except that it actually works and has a consistent error return value.
* Comes from ProxyTools.php
- * @param $ip Quad dotted IP address.
- * @return integer
+ *
+ * @param $ip String: quad dotted IP address.
+ * @return Mixed: string/int/false
*/
public static function toUnsigned( $ip ) {
- // Use IPv6 functions if needed
if ( self::isIPv6( $ip ) ) {
- return self::toUnsigned6( $ip );
- }
- if ( $ip == '255.255.255.255' ) {
- $n = -1;
+ $n = self::toUnsigned6( $ip );
} else {
$n = ip2long( $ip );
- if ( $n == -1 || $n === false ) { # Return value on error depends on PHP version
- $n = false;
+ if ( $n < 0 ) {
+ $n += pow( 2, 32 );
}
}
- if ( $n < 0 ) {
- $n += pow( 2, 32 );
- }
return $n;
}
- /**
- * Convert a dotted-quad IP to a signed integer
- * Returns false on failure
- */
- public static function toSigned( $ip ) {
- if ( $ip == '255.255.255.255' ) {
- $n = -1;
- } else {
- $n = ip2long( $ip );
- if ( $n == -1 ) {
- $n = false;
- }
- }
- return $n;
+ private static function toUnsigned6( $ip ) {
+ return wfBaseConvert( self::IPv6ToRawHex( $ip ), 16, 10 );
}
/**
- * Convert a network specification in CIDR notation to an integer network and a number of bits
- * @return array(string, int)
+ * Convert a network specification in CIDR notation
+ * to an integer network and a number of bits
+ *
+ * @param $range String: IP with CIDR prefix
+ * @return array(int or string, int)
*/
public static function parseCIDR( $range ) {
+ if ( self::isIPv6( $range ) ) {
+ return self::parseCIDR6( $range );
+ }
$parts = explode( '/', $range, 2 );
if ( count( $parts ) != 2 ) {
return array( false, false );
}
- $network = self::toSigned( $parts[0] );
- if ( $network !== false && is_numeric( $parts[1] ) && $parts[1] >= 0 && $parts[1] <= 32 ) {
- $bits = $parts[1];
+ list( $network, $bits ) = $parts;
+ $network = ip2long( $network );
+ if ( $network !== false && is_numeric( $bits ) && $bits >= 0 && $bits <= 32 ) {
if ( $bits == 0 ) {
$network = 0;
} else {
- $network &= ~((1 << (32 - $bits)) - 1);
+ $network &= ~( ( 1 << ( 32 - $bits ) ) - 1);
}
# Convert to unsigned
if ( $network < 0 ) {
@@ -461,8 +418,8 @@ class IP {
}
/**
- * Given a string range in a number of formats, return the start and end of
- * the range in hexadecimal.
+ * Given a string range in a number of formats,
+ * return the start and end of the range in hexadecimal.
*
* Formats are:
* 1.2.3.4/24 CIDR
@@ -472,27 +429,31 @@ class IP {
* 2001:0db8:85a3::7344/96 CIDR
* 2001:0db8:85a3::7344 - 2001:0db8:85a3::7344 Explicit range
* 2001:0db8:85a3::7344 Single IP
- * @return array(string, int)
+ * @param $range String: IP range
+ * @return array(string, string)
*/
public static function parseRange( $range ) {
- // Use IPv6 functions if needed
- if ( self::isIPv6( $range ) ) {
- return self::parseRange6( $range );
- }
+ // CIDR notation
if ( strpos( $range, '/' ) !== false ) {
- # CIDR
+ if ( self::isIPv6( $range ) ) {
+ return self::parseRange6( $range );
+ }
list( $network, $bits ) = self::parseCIDR( $range );
if ( $network === false ) {
$start = $end = false;
} else {
$start = sprintf( '%08X', $network );
- $end = sprintf( '%08X', $network + pow( 2, (32 - $bits) ) - 1 );
+ $end = sprintf( '%08X', $network + pow( 2, ( 32 - $bits ) ) - 1 );
}
+ // Explicit range
} elseif ( strpos( $range, '-' ) !== false ) {
- # Explicit range
list( $start, $end ) = array_map( 'trim', explode( '-', $range, 2 ) );
- if( self::isIPAddress( $start ) && self::isIPAddress( $end ) ) {
- $start = self::toUnsigned( $start ); $end = self::toUnsigned( $end );
+ if ( self::isIPv6( $start ) && self::isIPv6( $end ) ) {
+ return self::parseRange6( $range );
+ }
+ if ( self::isIPv4( $start ) && self::isIPv4( $end ) ) {
+ $start = self::toUnsigned( $start );
+ $end = self::toUnsigned( $end );
if ( $start > $end ) {
$start = $end = false;
} else {
@@ -514,17 +475,105 @@ class IP {
}
/**
+ * Convert a network specification in IPv6 CIDR notation to an
+ * integer network and a number of bits
+ *
+ * @return array(string, int)
+ */
+ private static function parseCIDR6( $range ) {
+ # Explode into <expanded IP,range>
+ $parts = explode( '/', IP::sanitizeIP( $range ), 2 );
+ if ( count( $parts ) != 2 ) {
+ return array( false, false );
+ }
+ list( $network, $bits ) = $parts;
+ $network = self::IPv6ToRawHex( $network );
+ if ( $network !== false && is_numeric( $bits ) && $bits >= 0 && $bits <= 128 ) {
+ if ( $bits == 0 ) {
+ $network = "0";
+ } else {
+ # Native 32 bit functions WONT work here!!!
+ # Convert to a padded binary number
+ $network = wfBaseConvert( $network, 16, 2, 128 );
+ # Truncate the last (128-$bits) bits and replace them with zeros
+ $network = str_pad( substr( $network, 0, $bits ), 128, 0, STR_PAD_RIGHT );
+ # Convert back to an integer
+ $network = wfBaseConvert( $network, 2, 10 );
+ }
+ } else {
+ $network = false;
+ $bits = false;
+ }
+ return array( $network, (int)$bits );
+ }
+
+ /**
+ * Given a string range in a number of formats, return the
+ * start and end of the range in hexadecimal. For IPv6.
+ *
+ * Formats are:
+ * 2001:0db8:85a3::7344/96 CIDR
+ * 2001:0db8:85a3::7344 - 2001:0db8:85a3::7344 Explicit range
+ * 2001:0db8:85a3::7344/96 Single IP
+ * @return array(string, string)
+ */
+ private static function parseRange6( $range ) {
+ # Expand any IPv6 IP
+ $range = IP::sanitizeIP( $range );
+ // CIDR notation...
+ if ( strpos( $range, '/' ) !== false ) {
+ list( $network, $bits ) = self::parseCIDR6( $range );
+ if ( $network === false ) {
+ $start = $end = false;
+ } else {
+ $start = wfBaseConvert( $network, 10, 16, 32, false );
+ # Turn network to binary (again)
+ $end = wfBaseConvert( $network, 10, 2, 128 );
+ # Truncate the last (128-$bits) bits and replace them with ones
+ $end = str_pad( substr( $end, 0, $bits ), 128, 1, STR_PAD_RIGHT );
+ # Convert to hex
+ $end = wfBaseConvert( $end, 2, 16, 32, false );
+ # see toHex() comment
+ $start = "v6-$start";
+ $end = "v6-$end";
+ }
+ // Explicit range notation...
+ } elseif ( strpos( $range, '-' ) !== false ) {
+ list( $start, $end ) = array_map( 'trim', explode( '-', $range, 2 ) );
+ $start = self::toUnsigned6( $start );
+ $end = self::toUnsigned6( $end );
+ if ( $start > $end ) {
+ $start = $end = false;
+ } else {
+ $start = wfBaseConvert( $start, 10, 16, 32, false );
+ $end = wfBaseConvert( $end, 10, 16, 32, false );
+ }
+ # see toHex() comment
+ $start = "v6-$start";
+ $end = "v6-$end";
+ } else {
+ # Single IP
+ $start = $end = self::toHex( $range );
+ }
+ if ( $start === false || $end === false ) {
+ return array( false, false );
+ } else {
+ return array( $start, $end );
+ }
+ }
+
+ /**
* Determine if a given IPv4/IPv6 address is in a given CIDR network
- * @param $addr The address to check against the given range.
- * @param $range The range to check the given address against.
- * @return bool Whether or not the given address is in the given range.
+ *
+ * @param $addr String: the address to check against the given range.
+ * @param $range String: the range to check the given address against.
+ * @return Boolean: whether or not the given address is in the given range.
*/
public static function isInRange( $addr, $range ) {
- // Convert to IPv6 if needed
$hexIP = self::toHex( $addr );
list( $start, $end ) = self::parseRange( $range );
- return (strcmp($hexIP, $start) >= 0 &&
- strcmp($hexIP, $end) <= 0);
+ return ( strcmp( $hexIP, $start ) >= 0 &&
+ strcmp( $hexIP, $end ) <= 0 );
}
/**
@@ -534,29 +583,34 @@ class IP {
* This currently only checks a few IPV4-to-IPv6 related cases. More
* unusual representations may be added later.
*
- * @param $addr something that might be an IP address
- * @return valid dotted quad IPv4 address or null
+ * @param $addr String: something that might be an IP address
+ * @return String: valid dotted quad IPv4 address or null
*/
public static function canonicalize( $addr ) {
- if ( self::isValid( $addr ) )
+ if ( self::isValid( $addr ) ) {
return $addr;
-
+ }
// Turn mapped addresses from ::ce:ffff:1.2.3.4 to 1.2.3.4
- if ( strpos($addr,':') !==false && strpos($addr,'.') !==false ) {
- $addr = substr( $addr, strrpos($addr,':')+1 );
- if( self::isIPv4($addr) ) return $addr;
+ if ( strpos( $addr, ':' ) !== false && strpos( $addr, '.' ) !== false ) {
+ $addr = substr( $addr, strrpos( $addr, ':' ) + 1 );
+ if ( self::isIPv4( $addr ) ) {
+ return $addr;
+ }
}
-
// IPv6 loopback address
$m = array();
- if ( preg_match( '/^0*' . RE_IPV6_GAP . '1$/', $addr, $m ) )
- return '127.0.0.1';
-
+ if ( preg_match( '/^0*' . RE_IPV6_GAP . '1$/', $addr, $m ) ) {
+ return '127.0.0.1';
+ }
// IPv4-mapped and IPv4-compatible IPv6 addresses
- if ( preg_match( '/^' . RE_IPV6_V4_PREFIX . '(' . RE_IP_ADD . ')$/i', $addr, $m ) )
+ if ( preg_match( '/^' . RE_IPV6_V4_PREFIX . '(' . RE_IP_ADD . ')$/i', $addr, $m ) ) {
return $m[1];
- if ( preg_match( '/^' . RE_IPV6_V4_PREFIX . RE_IPV6_WORD . ':' . RE_IPV6_WORD . '$/i', $addr, $m ) )
+ }
+ if ( preg_match( '/^' . RE_IPV6_V4_PREFIX . RE_IPV6_WORD .
+ ':' . RE_IPV6_WORD . '$/i', $addr, $m ) )
+ {
return long2ip( ( hexdec( $m[1] ) << 16 ) + hexdec( $m[2] ) );
+ }
return null; // give up
}
diff --git a/includes/ImageFunctions.php b/includes/ImageFunctions.php
index 5f01ab6e..8eaebd26 100644
--- a/includes/ImageFunctions.php
+++ b/includes/ImageFunctions.php
@@ -1,110 +1,9 @@
<?php
/**
- * Return a rounded pixel equivalent for a labeled CSS/SVG length.
- * http://www.w3.org/TR/SVG11/coords.html#UnitIdentifiers
+ * Global functions related to images
*
- * @param $length String: CSS/SVG length.
- * @param $viewportSize: Float optional scale for percentage units...
- * @return float: length in pixels
+ * @file
*/
-function wfScaleSVGUnit( $length, $viewportSize=512 ) {
- static $unitLength = array(
- 'px' => 1.0,
- 'pt' => 1.25,
- 'pc' => 15.0,
- 'mm' => 3.543307,
- 'cm' => 35.43307,
- 'in' => 90.0,
- 'em' => 16.0, // fake it?
- 'ex' => 12.0, // fake it?
- '' => 1.0, // "User units" pixels by default
- );
- $matches = array();
- if( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
- $length = floatval( $matches[1] );
- $unit = $matches[2];
- if( $unit == '%' ) {
- return $length * 0.01 * $viewportSize;
- } else {
- return $length * $unitLength[$unit];
- }
- } else {
- // Assume pixels
- return floatval( $length );
- }
-}
-
-class XmlSizeFilter {
- const DEFAULT_WIDTH = 512;
- const DEFAULT_HEIGHT = 512;
- var $first = true;
- var $width = self::DEFAULT_WIDTH;
- var $height = self::DEFAULT_HEIGHT;
- function filter( $name, $attribs ) {
- if( $this->first ) {
- $defaultWidth = self::DEFAULT_WIDTH;
- $defaultHeight = self::DEFAULT_HEIGHT;
- $aspect = 1.0;
- $width = null;
- $height = null;
-
- if( isset( $attribs['viewBox'] ) ) {
- // min-x min-y width height
- $viewBox = preg_split( '/\s+/', trim( $attribs['viewBox'] ) );
- if( count( $viewBox ) == 4 ) {
- $viewWidth = wfScaleSVGUnit( $viewBox[2] );
- $viewHeight = wfScaleSVGUnit( $viewBox[3] );
- if( $viewWidth > 0 && $viewHeight > 0 ) {
- $aspect = $viewWidth / $viewHeight;
- $defaultHeight = $defaultWidth / $aspect;
- }
- }
- }
- if( isset( $attribs['width'] ) ) {
- $width = wfScaleSVGUnit( $attribs['width'], $defaultWidth );
- }
- if( isset( $attribs['height'] ) ) {
- $height = wfScaleSVGUnit( $attribs['height'], $defaultHeight );
- }
-
- if( !isset( $width ) && !isset( $height ) ) {
- $width = $defaultWidth;
- $height = $width / $aspect;
- } elseif( isset( $width ) && !isset( $height ) ) {
- $height = $width / $aspect;
- } elseif( isset( $height ) && !isset( $width ) ) {
- $width = $height * $aspect;
- }
-
- if( $width > 0 && $height > 0 ) {
- $this->width = intval( round( $width ) );
- $this->height = intval( round( $height ) );
- }
-
- $this->first = false;
- }
- }
-}
-
-/**
- * Compatible with PHP getimagesize()
- * @todo support gzipped SVGZ
- * @todo check XML more carefully
- * @todo sensible defaults
- *
- * @param $filename String: full name of the file (passed to php fopen()).
- * @return array
- */
-function wfGetSVGsize( $filename ) {
- $filter = new XmlSizeFilter();
- $xml = new XmlTypeCheck( $filename, array( $filter, 'filter' ) );
- if( $xml->wellFormed ) {
- return array( $filter->width, $filter->height, 'SVG',
- "width=\"$filter->width\" height=\"$filter->height\"" );
- }
-
- return false;
-}
/**
* Determine if an image exists on the 'bad image list'.
diff --git a/includes/ImageGallery.php b/includes/ImageGallery.php
index 5bff0ae3..f7020d63 100644
--- a/includes/ImageGallery.php
+++ b/includes/ImageGallery.php
@@ -32,20 +32,30 @@ class ImageGallery
*/
private $contextTitle = false;
- private $mPerRow = 4; // How many images wide should the gallery be?
- private $mWidths = 120, $mHeights = 120; // How wide/tall each thumbnail should be
-
private $mAttribs = array();
/**
+ * Fixed margins
+ */
+ const THUMB_PADDING = 30;
+ const GB_PADDING = 5;
+ //2px borders on each side + 2px implied padding on each side
+ const GB_BORDERS = 8;
+
+ /**
* Create a new image gallery object.
*/
function __construct( ) {
+ global $wgGalleryOptions;
$this->mImages = array();
- $this->mShowBytes = true;
+ $this->mShowBytes = $wgGalleryOptions['showBytes'];
$this->mShowFilename = true;
$this->mParser = false;
$this->mHideBadImages = false;
+ $this->mPerRow = $wgGalleryOptions['imagesPerRow'];
+ $this->mWidths = $wgGalleryOptions['imageWidth'];
+ $this->mHeights = $wgGalleryOptions['imageHeight'];
+ $this->mCaptionLength = $wgGalleryOptions['captionLength'];
}
/**
@@ -74,7 +84,7 @@ class ImageGallery
/**
* Set the caption (as HTML)
*
- * @param $caption Caption
+ * @param $caption String: Caption
*/
public function setCaptionHtml( $caption ) {
$this->mCaption = $caption;
@@ -83,10 +93,11 @@ class ImageGallery
/**
* Set how many images will be displayed per row.
*
- * @param int $num > 0; invalid numbers will be rejected
+ * @param $num Integer >= 0; If perrow=0 the gallery layout will adapt to screensize
+ * invalid numbers will be rejected
*/
public function setPerRow( $num ) {
- if ($num > 0) {
+ if ($num >= 0) {
$this->mPerRow = (int)$num;
}
}
@@ -94,7 +105,7 @@ class ImageGallery
/**
* Set how wide each image will be, in pixels.
*
- * @param int $num > 0; invalid numbers will be ignored
+ * @param $num Integer > 0; invalid numbers will be ignored
*/
public function setWidths( $num ) {
if ($num > 0) {
@@ -105,7 +116,7 @@ class ImageGallery
/**
* Set how high each image will be, in pixels.
*
- * @param int $num > 0; invalid numbers will be ignored
+ * @param $num Integer > 0; invalid numbers will be ignored
*/
public function setHeights( $num ) {
if ($num > 0) {
@@ -153,11 +164,11 @@ class ImageGallery
}
/**
- * 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.
- */
+ * 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.
+ */
function insert( $title, $html='' ) {
if ( $title instanceof File ) {
// Old calling convention
@@ -181,7 +192,7 @@ class ImageGallery
* @param $f Boolean: set to false to disable.
*/
function setShowBytes( $f ) {
- $this->mShowBytes = ( $f == true);
+ $this->mShowBytes = (bool)$f;
}
/**
@@ -191,17 +202,17 @@ class ImageGallery
* @param $f Boolean: set to false to disable.
*/
function setShowFilename( $f ) {
- $this->mShowFilename = ( $f == true);
+ $this->mShowFilename = (bool)$f;
}
/**
* Set arbitrary attributes to go on the HTML gallery output element.
- * Should be suitable for a &lt;table&gt; element.
+ * Should be suitable for a <ul> element.
*
* Note -- if taking from user input, you should probably run through
* Sanitizer::validateAttributes() first.
*
- * @param array of HTML attribute pairs
+ * @param $attribs Array of HTML attribute pairs
*/
function setAttributes( $attribs ) {
$this->mAttribs = $attribs;
@@ -222,15 +233,20 @@ class ImageGallery
$sk = $this->getSkin();
+ if ( $this->mPerRow > 0 ) {
+ $maxwidth = $this->mPerRow * ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING + self::GB_BORDERS );
+ $oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : "";
+ $this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" . $oldStyle;
+ }
+
$attribs = Sanitizer::mergeAttributes(
array(
- 'class' => 'gallery',
- 'cellspacing' => '0',
- 'cellpadding' => '0' ),
+ 'class' => 'gallery'),
$this->mAttribs );
- $s = Xml::openElement( 'table', $attribs );
- if( $this->mCaption )
- $s .= "\n\t<caption>{$this->mCaption}</caption>";
+ $s = Xml::openElement( 'ul', $attribs );
+ if ( $this->mCaption ) {
+ $s .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
+ }
$params = array( 'width' => $this->mWidths, 'height' => $this->mHeights );
$i = 0;
@@ -242,15 +258,19 @@ class ImageGallery
$time = $descQuery = false;
wfRunHooks( 'BeforeGalleryFindFile', array( &$this, &$nt, &$time, &$descQuery ) );
- $img = wfFindFile( $nt, array( 'time' => $time ) );
+ if ( $nt->getNamespace() == NS_FILE ) {
+ $img = wfFindFile( $nt, array( 'time' => $time ) );
+ } else {
+ $img = false;
+ }
- if( $nt->getNamespace() != NS_FILE || !$img ) {
+ if( !$img ) {
# We're dealing with a non-image, spit out the name and be done with it.
- $thumbhtml = "\n\t\t\t".'<div style="height: '.($this->mHeights*1.25+2).'px;">'
+ $thumbhtml = "\n\t\t\t".'<div style="height: '.(self::THUMB_PADDING + $this->mHeights).'px;">'
. htmlspecialchars( $nt->getText() ) . '</div>';
} elseif( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
# The image is blacklisted, just show it as a text link.
- $thumbhtml = "\n\t\t\t".'<div style="height: '.($this->mHeights*1.25+2).'px;">' .
+ $thumbhtml = "\n\t\t\t".'<div style="height: '.(self::THUMB_PADDING + $this->mHeights).'px;">' .
$sk->link(
$nt,
htmlspecialchars( $nt->getText() ),
@@ -261,10 +281,14 @@ class ImageGallery
'</div>';
} elseif( !( $thumb = $img->transform( $params ) ) ) {
# Error generating thumbnail.
- $thumbhtml = "\n\t\t\t".'<div style="height: '.($this->mHeights*1.25+2).'px;">'
+ $thumbhtml = "\n\t\t\t".'<div style="height: '.(self::THUMB_PADDING + $this->mHeights).'px;">'
. htmlspecialchars( $img->getLastError() ) . '</div>';
} else {
- $vpad = floor( ( 1.25*$this->mHeights - $thumb->height ) /2 ) - 2;
+ //We get layout problems with the margin, if the image is smaller
+ //than the line-height, so we less margin in these cases.
+ $minThumbHeight = $thumb->height > 17 ? $thumb->height : 17;
+ $vpad = floor(( self::THUMB_PADDING + $this->mHeights - $minThumbHeight ) /2);
+
$imageParameters = array(
'desc-link' => true,
@@ -274,13 +298,14 @@ class ImageGallery
if ( $text == '' ) {
$imageParameters['alt'] = $nt->getText();
}
-
+
+ # Set both fixed width and min-height.
$thumbhtml = "\n\t\t\t".
- '<div class="thumb" style="padding: ' . $vpad . 'px 0; width: ' .($this->mWidths+30).'px;">'
+ '<div class="thumb" style="width: ' .($this->mWidths + self::THUMB_PADDING).'px;">'
# Auto-margin centering for block-level elements. Needed now that we have video
# handlers since they may emit block-level elements as opposed to simple <img> tags.
# ref http://css-discuss.incutio.com/?page=CenteringBlockElement
- . '<div style="margin-left: auto; margin-right: auto; width: ' .$this->mWidths.'px;">'
+ . '<div style="margin:'.$vpad.'px auto;">'
. $thumb->toHtml( $imageParameters ) . '</div></div>';
// Call parser transform hook
@@ -308,7 +333,7 @@ class ImageGallery
$textlink = $this->mShowFilename ?
$sk->link(
$nt,
- htmlspecialchars( $wgLang->truncate( $nt->getText(), 20 ) ),
+ htmlspecialchars( $wgLang->truncate( $nt->getText(), $this->mCaptionLength ) ),
array(),
array(),
array( 'known', 'noclasses' )
@@ -319,31 +344,25 @@ class ImageGallery
# in version 4.8.6 generated crackpot html in its absence, see:
# http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
- if ( $i % $this->mPerRow == 0 ) {
- $s .= "\n\t<tr>";
- }
+ # Weird double wrapping in div needed due to FF2 bug
+ # Can be safely removed if FF2 falls completely out of existance
$s .=
- "\n\t\t" . '<td><div class="gallerybox" style="width: '.($this->mWidths+35).'px;">'
+ "\n\t\t" . '<li class="gallerybox" style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
+ . '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
. $thumbhtml
. "\n\t\t\t" . '<div class="gallerytext">' . "\n"
. $textlink . $text . $nb
. "\n\t\t\t</div>"
- . "\n\t\t</div></td>";
- if ( $i % $this->mPerRow == $this->mPerRow - 1 ) {
- $s .= "\n\t</tr>";
- }
+ . "\n\t\t</div></li>";
++$i;
}
- if( $i % $this->mPerRow != 0 ) {
- $s .= "\n\t</tr>";
- }
- $s .= "\n</table>";
+ $s .= "\n</ul>";
return $s;
}
/**
- * @return int Number of images in the gallery
+ * @return Integer: number of images in the gallery
*/
public function count() {
return count( $this->mImages );
@@ -352,7 +371,7 @@ class ImageGallery
/**
* Set the contextual title
*
- * @param Title $title Contextual title
+ * @param $title Title: contextual title
*/
public function setContextTitle( $title ) {
$this->contextTitle = $title;
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index f16acc33..c018e647 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -1,6 +1,6 @@
<?php
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) )
die( 1 );
/**
@@ -22,7 +22,11 @@ class ImagePage extends Article {
$this->dupes = null;
$this->repo = null;
}
-
+
+ /**
+ * @param $file File:
+ * @return void
+ */
public function setFile( $file ) {
$this->displayImg = $file;
$this->img = $file;
@@ -30,20 +34,20 @@ class ImagePage extends Article {
}
protected function loadFile() {
- if( $this->fileLoaded ) {
+ if ( $this->fileLoaded ) {
return true;
}
$this->fileLoaded = true;
$this->displayImg = $this->img = false;
wfRunHooks( 'ImagePageFindFile', array( $this, &$this->img, &$this->displayImg ) );
- if( !$this->img ) {
+ if ( !$this->img ) {
$this->img = wfFindFile( $this->mTitle );
- if( !$this->img ) {
+ if ( !$this->img ) {
$this->img = wfLocalFile( $this->mTitle );
}
}
- if( !$this->displayImg ) {
+ if ( !$this->displayImg ) {
$this->displayImg = $this->img;
}
$this->repo = $this->img->getRepo();
@@ -61,13 +65,22 @@ class ImagePage extends Article {
public function view() {
global $wgOut, $wgShowEXIF, $wgRequest, $wgUser;
+
+ $diff = $wgRequest->getVal( 'diff' );
+ $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
+
+ if ( $this->mTitle->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
+ return parent::view();
+ }
+
$this->loadFile();
- if( $this->mTitle->getNamespace() == NS_FILE && $this->img->getRedirected() ) {
- if( $this->mTitle->getDBkey() == $this->img->getName() ) {
+ if ( $this->mTitle->getNamespace() == NS_FILE && $this->img->getRedirected() ) {
+ if ( $this->mTitle->getDBkey() == $this->img->getName() || isset( $diff ) ) {
// mTitle is the same as the redirect target so ask Article
// to perform the redirect for us.
- return Article::view();
+ $wgRequest->setVal( 'diffonly', 'true' );
+ return parent::view();
} else {
// mTitle is not the same as the redirect target so it is
// probably the redirect page itself. Fake the redirect symbol
@@ -79,15 +92,9 @@ class ImagePage extends Article {
}
}
- $diff = $wgRequest->getVal( 'diff' );
- $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
-
- if( $this->mTitle->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) )
- return Article::view();
-
$this->showRedirectedFromHeader();
- if( $wgShowEXIF && $this->displayImg->exists() ) {
+ if ( $wgShowEXIF && $this->displayImg->exists() ) {
// FIXME: bad interface, see note on MediaHandler::formatMetadata().
$formattedMetadata = $this->displayImg->formatMetadata();
$showmeta = $formattedMetadata !== false;
@@ -95,15 +102,15 @@ class ImagePage extends Article {
$showmeta = false;
}
- if( !$diff && $this->displayImg->exists() )
- $wgOut->addHTML( $this->showTOC($showmeta) );
+ if ( !$diff && $this->displayImg->exists() )
+ $wgOut->addHTML( $this->showTOC( $showmeta ) );
- if( !$diff )
+ if ( !$diff )
$this->openShowImage();
# No need to display noarticletext, we use our own message, output in openShowImage()
- if( $this->getID() ) {
- Article::view();
+ if ( $this->getID() ) {
+ parent::view();
} else {
# Just need to set the right headers
$wgOut->setArticleFlag( true );
@@ -112,9 +119,9 @@ class ImagePage extends Article {
}
# Show shared description, if needed
- if( $this->mExtraDescription ) {
+ if ( $this->mExtraDescription ) {
$fol = wfMsgNoTrans( 'shareddescriptionfollows' );
- if( $fol != '-' && !wfEmptyMsg( 'shareddescriptionfollows', $fol ) ) {
+ if ( $fol != '-' && !wfEmptyMsg( 'shareddescriptionfollows', $fol ) ) {
$wgOut->addWikiText( $fol );
}
$wgOut->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
@@ -123,7 +130,7 @@ class ImagePage extends Article {
$this->closeShowImage();
$this->imageHistory();
// TODO: Cleanup the following
-
+
$wgOut->addHTML( Xml::element( 'h2',
array( 'id' => 'filelinks' ),
wfMsg( 'imagelinks' ) ) . "\n" );
@@ -136,49 +143,49 @@ class ImagePage extends Article {
# Allow extensions to add something after the image links
$html = '';
wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
- if ( $html)
+ if ( $html )
$wgOut->addHTML( $html );
- if( $showmeta ) {
- global $wgStylePath, $wgStyleVersion;
- $expand = htmlspecialchars( Xml::escapeJsString( wfMsg( 'metadata-expand' ) ) );
- $collapse = htmlspecialchars( Xml::escapeJsString( wfMsg( 'metadata-collapse' ) ) );
+ if ( $showmeta ) {
$wgOut->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
$wgOut->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
- $wgOut->addScriptFile( 'metadata.js' );
- $wgOut->addHTML(
- "<script type=\"text/javascript\">attachMetadataToggle('mw_metadata', '$expand', '$collapse');</script>\n" );
+ $wgOut->addModules( array( 'mediawiki.legacy.metadata' ) );
+ }
+
+ $css = $this->repo->getDescriptionStylesheetUrl();
+ if ( $css ) {
+ $wgOut->addStyle( $css );
}
}
public function getRedirectTarget() {
$this->loadFile();
- if( $this->img->isLocal() ) {
+ if ( $this->img->isLocal() ) {
return parent::getRedirectTarget();
}
// Foreign image page
$from = $this->img->getRedirected();
$to = $this->img->getName();
- if( $from == $to ) {
- return null;
+ if ( $from == $to ) {
+ return null;
}
return $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
}
public function followRedirect() {
$this->loadFile();
- if( $this->img->isLocal() ) {
+ if ( $this->img->isLocal() ) {
return parent::followRedirect();
}
$from = $this->img->getRedirected();
$to = $this->img->getName();
- if( $from == $to ) {
- return false;
+ if ( $from == $to ) {
+ return false;
}
- return Title::makeTitle( NS_FILE, $to );
+ return Title::makeTitle( NS_FILE, $to );
}
public function isRedirect( $text = false ) {
$this->loadFile();
- if( $this->img->isLocal() )
+ if ( $this->img->isLocal() )
return parent::isRedirect( $text );
return (bool)$this->img->getRedirected();
@@ -201,21 +208,21 @@ class ImagePage extends Article {
public function getDuplicates() {
$this->loadFile();
- if( !is_null($this->dupes) ) {
+ if ( !is_null( $this->dupes ) ) {
return $this->dupes;
}
- if( !( $hash = $this->img->getSha1() ) ) {
+ if ( !( $hash = $this->img->getSha1() ) ) {
return $this->dupes = array();
}
$dupes = RepoGroup::singleton()->findBySha1( $hash );
// Remove duplicates with self and non matching file sizes
- $self = $this->img->getRepoName().':'.$this->img->getName();
+ $self = $this->img->getRepoName() . ':' . $this->img->getName();
$size = $this->img->getSize();
foreach ( $dupes as $index => $file ) {
- $key = $file->getRepoName().':'.$file->getName();
- if( $key == $self )
+ $key = $file->getRepoName() . ':' . $file->getName();
+ if ( $key == $self )
unset( $dupes[$index] );
- if( $file->getSize() != $size )
+ if ( $file->getSize() != $size )
unset( $dupes[$index] );
}
return $this->dupes = $dupes;
@@ -226,14 +233,14 @@ class ImagePage extends Article {
/**
* Create the TOC
*
- * @param bool $metadata Whether or not to show the metadata link
- * @return string
+ * @param $metadata Boolean: whether or not to show the metadata link
+ * @return String
*/
protected function showTOC( $metadata ) {
$r = array(
'<li><a href="#file">' . wfMsgHtml( 'file-anchor-link' ) . '</a></li>',
'<li><a href="#filehistory">' . wfMsgHtml( 'filehist' ) . '</a></li>',
- '<li><a href="#filelinks">' . wfMsgHtml( 'imagelinks' ) . '</a></li>',
+ '<li><a href="#filelinks">' . wfMsgHtml( 'imagelinks' ) . '</a></li>',
);
if ( $metadata ) {
$r[] = '<li><a href="#metadata">' . wfMsgHtml( 'metadata' ) . '</a></li>';
@@ -249,8 +256,8 @@ class ImagePage extends Article {
*
* FIXME: bad interface, see note on MediaHandler::formatMetadata().
*
- * @param array $exif The array containing the EXIF data
- * @return string
+ * @param $metadata Array: the array containing the EXIF data
+ * @return String
*/
protected function makeMetadataTable( $metadata ) {
$r = "<div class=\"mw-imagepage-section-metadata\">";
@@ -260,7 +267,7 @@ class ImagePage extends Article {
foreach ( $stuff as $v ) {
# FIXME, why is this using escapeId for a class?!
$class = Sanitizer::escapeId( $v['id'] );
- if( $type == 'collapsed' ) {
+ if ( $type == 'collapsed' ) {
$class .= ' collapsable';
}
$r .= "<tr class=\"$class\">\n";
@@ -280,10 +287,10 @@ class ImagePage extends Article {
*/
public function getContent() {
$this->loadFile();
- if( $this->img && !$this->img->isLocal() && 0 == $this->getID() ) {
+ if ( $this->img && !$this->img->isLocal() && 0 == $this->getID() ) {
return '';
}
- return Article::getContent();
+ return parent::getContent();
}
protected function openShowImage() {
@@ -292,15 +299,13 @@ class ImagePage extends Article {
$this->loadFile();
- $full_url = $this->displayImg->getURL();
- $linkAttribs = false;
- $sizeSel = intval( $wgUser->getOption( 'imagesize') );
- if( !isset( $wgImageLimits[$sizeSel] ) ) {
+ $sizeSel = intval( $wgUser->getOption( 'imagesize' ) );
+ if ( !isset( $wgImageLimits[$sizeSel] ) ) {
$sizeSel = User::getDefaultOption( 'imagesize' );
// The user offset might still be incorrect, specially if
// $wgImageLimits got changed (see bug #8858).
- if( !isset( $wgImageLimits[$sizeSel] ) ) {
+ if ( !isset( $wgImageLimits[$sizeSel] ) ) {
// Default to the first offset in $wgImageLimits
$sizeSel = 0;
}
@@ -311,41 +316,39 @@ class ImagePage extends Article {
$sk = $wgUser->getSkin();
$dirmark = $wgContLang->getDirMark();
- if( $this->displayImg->exists() ) {
+ if ( $this->displayImg->exists() ) {
# image
$page = $wgRequest->getIntOrNull( 'page' );
- if( is_null( $page ) ) {
+ if ( is_null( $page ) ) {
$params = array();
$page = 1;
} else {
$params = array( 'page' => $page );
}
- $width_orig = $this->displayImg->getWidth();
+ $width_orig = $this->displayImg->getWidth( $page );
$width = $width_orig;
- $height_orig = $this->displayImg->getHeight();
+ $height_orig = $this->displayImg->getHeight( $page );
$height = $height_orig;
- $mime = $this->displayImg->getMimeType();
- $showLink = false;
- $linkAttribs = array( 'href' => $full_url );
- $longDesc = $this->displayImg->getLongDesc();
+
+ $longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$wgOut ) );
- if( $this->displayImg->allowInlineDisplay() ) {
+ if ( $this->displayImg->allowInlineDisplay() ) {
# image
# "Download high res version" link below the image
- #$msgsize = wfMsgHtml('file-info-size', $width_orig, $height_orig, $sk->formatSize( $this->displayImg->getSize() ), $mime );
+ # $msgsize = wfMsgHtml('file-info-size', $width_orig, $height_orig, $sk->formatSize( $this->displayImg->getSize() ), $mime );
# We'll show a thumbnail of this image
- if( $width > $maxWidth || $height > $maxHeight ) {
+ if ( $width > $maxWidth || $height > $maxHeight ) {
# Calculate the thumbnail size.
# First case, the limiting factor is the width, not the height.
- if( $width / $height >= $maxWidth / $maxHeight ) {
- $height = round( $height * $maxWidth / $width);
+ if ( $width / $height >= $maxWidth / $maxHeight ) {
+ $height = round( $height * $maxWidth / $width );
$width = $maxWidth;
# Note that $height <= $maxHeight now.
} else {
- $newwidth = floor( $width * $maxHeight / $height);
+ $newwidth = floor( $width * $maxHeight / $height );
$height = round( $height * $newwidth / $width );
$width = $newwidth;
# Note that $height <= $maxHeight now, but might not be identical
@@ -358,28 +361,24 @@ class ImagePage extends Article {
);
} else {
# Image is small enough to show full size on image page
- $msgbig = htmlspecialchars( $this->displayImg->getName() );
$msgsmall = wfMsgExt( 'file-nohires', array( 'parseinline' ) );
}
$params['width'] = $width;
$thumbnail = $this->displayImg->transform( $params );
- $anchorclose = "<br />";
- if( $this->displayImg->mustRender() ) {
- $showLink = true;
- } else {
- $anchorclose .=
- $msgsmall .
- '<br />' . Xml::tags( 'a', $linkAttribs, $msgbig ) . "$dirmark " . $longDesc;
+ $showLink = true;
+ $anchorclose = '';
+ if ( !$this->displayImg->mustRender() ) {
+ $anchorclose = "<br />" . $msgsmall;
}
$isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
- if( $isMulti ) {
+ if ( $isMulti ) {
$wgOut->addHTML( '<table class="multipageimage"><tr><td>' );
}
- if( $thumbnail ) {
+ if ( $thumbnail ) {
$options = array(
'alt' => $this->displayImg->getTitle()->getPrefixedText(),
'file-link' => true,
@@ -389,10 +388,10 @@ class ImagePage extends Article {
$anchorclose . "</div>\n" );
}
- if( $isMulti ) {
+ if ( $isMulti ) {
$count = $this->displayImg->pageCount();
- if( $page > 1 ) {
+ if ( $page > 1 ) {
$label = $wgOut->parse( wfMsg( 'imgmultipageprev' ), false );
$link = $sk->link(
$this->mTitle,
@@ -407,7 +406,7 @@ class ImagePage extends Article {
$thumb1 = '';
}
- if( $page < $count ) {
+ if ( $page < $count ) {
$label = wfMsg( 'imgmultipagenext' );
$link = $sk->link(
$this->mTitle,
@@ -430,9 +429,8 @@ class ImagePage extends Article {
'onchange' => 'document.pageselector.submit();',
);
- $option = array();
- for ( $i=1; $i <= $count; $i++ ) {
- $options[] = Xml::option( $wgLang->formatNum($i), $i, $i == $page );
+ for ( $i = 1; $i <= $count; $i++ ) {
+ $options[] = Xml::option( $wgLang->formatNum( $i ), $i, $i == $page );
}
$select = Xml::tags( 'select',
array( 'id' => 'pageselector', 'name' => 'page' ),
@@ -441,7 +439,7 @@ class ImagePage extends Article {
$wgOut->addHTML(
'</td><td><div class="multipageimagenavbox">' .
Xml::openElement( 'form', $formParams ) .
- Xml::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
wfMsgExt( 'imgmultigoto', array( 'parseinline', 'replaceafter' ), $select ) .
Xml::submitButton( wfMsg( 'imgmultigo' ) ) .
Xml::closeElement( 'form' ) .
@@ -449,9 +447,9 @@ class ImagePage extends Article {
);
}
} else {
- #if direct link is allowed but it's not a renderable image, show an icon.
- if( $this->displayImg->isSafeFile() ) {
- $icon= $this->displayImg->iconThumb();
+ # if direct link is allowed but it's not a renderable image, show an icon.
+ if ( $this->displayImg->isSafeFile() ) {
+ $icon = $this->displayImg->iconThumb();
$wgOut->addHTML( '<div class="fullImageLink" id="file">' .
$icon->toHtml( array( 'file-link' => true ) ) .
@@ -462,32 +460,31 @@ class ImagePage extends Article {
}
- if($showLink) {
+ if ( $showLink ) {
$filename = wfEscapeWikiText( $this->displayImg->getName() );
- $medialink = "[[Media:$filename|$filename]]";
+ $linktext = $filename;
+ if ( isset( $msgbig ) ) {
+ $linktext = wfEscapeWikiText( $msgbig );
+ }
+ $medialink = "[[Media:$filename|$linktext]]";
- if( !$this->displayImg->isSafeFile() ) {
+ if ( !$this->displayImg->isSafeFile() ) {
$warning = wfMsgNoTrans( 'mediawarning' );
$wgOut->addWikiText( <<<EOT
-<div class="fullMedia">
-<span class="dangerousLink">{$medialink}</span>$dirmark
-<span class="fileInfo">$longDesc</span>
-</div>
+<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
-<div class="fullMedia">
-{$medialink}{$dirmark}
-<span class="fileInfo">$longDesc</span>
+<div class="fullMedia">{$medialink}{$dirmark} <span class="fileInfo">$longDesc</span>
</div>
EOT
);
}
}
- if( !$this->displayImg->isLocal() ) {
+ if ( !$this->displayImg->isLocal() ) {
$this->printSharedImageText();
}
} else {
@@ -506,6 +503,11 @@ EOT
}
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+ if ( !$this->getID() ) {
+ // 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" );
+ }
}
}
@@ -520,11 +522,15 @@ EOT
$descUrl = $this->img->getDescriptionUrl();
$descText = $this->img->getDescriptionText();
+ /* Add canonical to head if there is no local page for this shared file */
+ if( $descUrl && $this->getID() == 0 ) {
+ $wgOut->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
+ }
+
$wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
$repo = $this->img->getRepo()->getDisplayName();
- $msg = '';
- if( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-' ) {
+ if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-' ) {
$wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
} elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
$wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
@@ -532,7 +538,7 @@ EOT
$wgOut->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
}
- if( $descText ) {
+ if ( $descText ) {
$this->mExtraDescription = $descText;
}
}
@@ -553,10 +559,10 @@ EOT
protected function uploadLinksBox() {
global $wgUser, $wgOut, $wgEnableUploads, $wgUseExternalEditor;
- if( !$wgEnableUploads ) { return; }
+ if ( !$wgEnableUploads ) { return; }
$this->loadFile();
- if( !$this->img->isLocal() )
+ if ( !$this->img->isLocal() )
return;
$sk = $wgUser->getSkin();
@@ -564,7 +570,7 @@ EOT
$wgOut->addHTML( "<br /><ul>\n" );
# "Upload a new version of this file" link
- if( UploadBase::userCanReUpload($wgUser,$this->img->name) ) {
+ if ( UploadBase::userCanReUpload( $wgUser, $this->img->name ) ) {
$ulink = $sk->makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
$wgOut->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
}
@@ -588,7 +594,7 @@ EOT
$wgOut->addHTML( "</ul>\n" );
}
- protected function closeShowImage() {} # For overloading
+ protected function closeShowImage() { } # For overloading
/**
* If the page we've just displayed is in the "Image" namespace,
@@ -606,7 +612,7 @@ EOT
# Exist check because we don't want to show this on pages where an image
# doesn't exist along with the noimage message, that would suck. -ævar
- if( $this->img->exists() ) {
+ if ( $this->img->exists() ) {
$this->uploadLinksBox();
}
}
@@ -623,18 +629,16 @@ EOT
array( 'page_namespace', 'page_title' ),
array( 'il_to' => $this->mTitle->getDBkey(), 'il_from = page_id' ),
__METHOD__,
- array( 'LIMIT' => $limit + 1)
+ array( 'LIMIT' => $limit + 1 )
);
$count = $dbr->numRows( $res );
- if( $count == 0 ) {
- $wgOut->addHTML( "<div id='mw-imagepage-nolinkstoimage'>\n" );
- $wgOut->addWikiMsg( 'nolinkstoimage' );
- $wgOut->addHTML( "</div>\n" );
+ if ( $count == 0 ) {
+ $wgOut->wrapWikiMsg( Html::rawElement( 'div', array ( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ), 'nolinkstoimage' );
return;
}
$wgOut->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
- if( $count <= $limit - 1 ) {
+ if ( $count <= $limit - 1 ) {
$wgOut->addWikiMsg( 'linkstoimage', $count );
} else {
// More links than the limit. Add a link to [[Special:Whatlinkshere]]
@@ -644,37 +648,47 @@ EOT
);
}
- $wgOut->addHTML( "<ul class='mw-imagepage-linkstoimage'>\n" );
+ $wgOut->addHTML( Html::openElement( 'ul', array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n" );
$sk = $wgUser->getSkin();
$count = 0;
- while ( $s = $res->fetchObject() ) {
+ $elements = array();
+ foreach ( $res as $s ) {
$count++;
- if( $count <= $limit ) {
+ if ( $count <= $limit ) {
// We have not yet reached the extra one that tells us there is more to fetch
- $link = $sk->link(
- Title::makeTitle( $s->page_namespace, $s->page_title ),
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
- $wgOut->addHTML( "<li>{$link}</li>\n" );
+ $elements[] = $s;
}
}
- $wgOut->addHTML( "</ul>\n" );
+
+ // Sort the list by namespace:title
+ usort ( $elements, array( $this, 'compare' ) );
+
+ // Create links for every element
+ foreach( $elements as $element ) {
+ $link = $sk->linkKnown( Title::makeTitle( $element->page_namespace, $element->page_title ) );
+ $wgOut->addHTML( Html::rawElement(
+ 'li',
+ array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ $link
+ ) . "\n"
+ );
+
+ };
+ $wgOut->addHTML( Html::closeElement( 'ul' ) . "\n" );
$res->free();
// Add a links to [[Special:Whatlinkshere]]
- if( $count > $limit )
+ if ( $count > $limit ) {
$wgOut->addWikiMsg( 'morelinkstoimage', $this->mTitle->getPrefixedDBkey() );
- $wgOut->addHTML( "</div>\n" );
+ }
+ $wgOut->addHTML( Html::closeElement( 'div' ) . "\n" );
}
protected function imageRedirects() {
global $wgUser, $wgOut, $wgLang;
$redirects = $this->getTitle()->getRedirectsHere( NS_FILE );
- if( count( $redirects ) == 0 ) return;
+ if ( count( $redirects ) == 0 ) return;
$wgOut->addHTML( "<div id='mw-imagepage-section-redirectstofile'>\n" );
$wgOut->addWikiMsg( 'redirectstofile',
@@ -703,7 +717,7 @@ EOT
$this->loadFile();
$dupes = $this->getDuplicates();
- if( count( $dupes ) == 0 ) return;
+ if ( count( $dupes ) == 0 ) return;
$wgOut->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
$wgOut->addWikiMsg( 'duplicatesoffile',
@@ -714,7 +728,7 @@ EOT
$sk = $wgUser->getSkin();
foreach ( $dupes as $file ) {
$fromSrc = '';
- if( $file->isLocal() ) {
+ if ( $file->isLocal() ) {
$link = $sk->link(
$file->getTitle(),
null,
@@ -737,16 +751,16 @@ EOT
*/
public function delete() {
global $wgUploadMaintenance;
- if( $wgUploadMaintenance && $this->mTitle && $this->mTitle->getNamespace() == NS_FILE ) {
+ if ( $wgUploadMaintenance && $this->mTitle && $this->mTitle->getNamespace() == NS_FILE ) {
global $wgOut;
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1</div>\n", array( 'filedelete-maintenance' ) );
+ $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n", array( 'filedelete-maintenance' ) );
return;
}
$this->loadFile();
- if( !$this->img->exists() || !$this->img->isLocal() || $this->img->getRedirected() ) {
+ if ( !$this->img->exists() || !$this->img->isLocal() || $this->img->getRedirected() ) {
// Standard article deletion
- Article::delete();
+ parent::delete();
return;
}
$deleter = new FileDeleteForm( $this->img );
@@ -767,7 +781,7 @@ EOT
*/
public function doPurge() {
$this->loadFile();
- if( $this->img->exists() ) {
+ if ( $this->img->exists() ) {
wfDebug( "ImagePage::doPurge purging " . $this->img->getName() . "\n" );
$update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
$update->doUpdate();
@@ -794,6 +808,22 @@ EOT
$wgOut->addWikiText( $description );
}
+
+ /**
+ * Callback for usort() to do link sorts by (namespace, title)
+ * Function copied from Title::compare()
+ *
+ * @param $a object page to compare with
+ * @param $b object page to compare with
+ * @return Integer: result of string comparison, or namespace comparison
+ */
+ protected function compare( $a, $b ) {
+ if ( $a->page_namespace == $b->page_namespace ) {
+ return strcmp( $a->page_title, $b->page_title );
+ } else {
+ return $a->page_namespace - $b->page_namespace;
+ }
+ }
}
/**
@@ -836,7 +866,7 @@ class ImageHistoryList {
. $navLinks . "\n"
. Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
. '<tr><td></td>'
- . ( $this->current->isLocal() && ($wgUser->isAllowed('delete') || $wgUser->isAllowed('deletedhistory') ) ? '<td></td>' : '' )
+ . ( $this->current->isLocal() && ( $wgUser->isAllowed( 'delete' ) || $wgUser->isAllowed( 'deletedhistory' ) ) ? '<td></td>' : '' )
. '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
. ( $this->showThumb ? '<th>' . wfMsgHtml( 'filehist-thumb' ) . '</th>' : '' )
. '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
@@ -850,24 +880,24 @@ class ImageHistoryList {
}
public function imageHistoryLine( $iscur, $file ) {
- global $wgUser, $wgLang, $wgContLang, $wgTitle;
+ global $wgUser, $wgLang;
- $timestamp = wfTimestamp(TS_MW, $file->getTimestamp());
+ $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
$img = $iscur ? $file->getName() : $file->getArchiveName();
- $user = $file->getUser('id');
- $usertext = $file->getUser('text');
+ $user = $file->getUser( 'id' );
+ $usertext = $file->getUser( 'text' );
$description = $file->getDescription();
$local = $this->current->isLocal();
- $row = $css = $selected = '';
+ $row = $selected = '';
// Deletion link
- if( $local && ($wgUser->isAllowed('delete') || $wgUser->isAllowed('deletedhistory') ) ) {
+ if ( $local && ( $wgUser->isAllowed( 'delete' ) || $wgUser->isAllowed( 'deletedhistory' ) ) ) {
$row .= '<td>';
# Link to remove from history
- if( $wgUser->isAllowed( 'delete' ) ) {
+ if ( $wgUser->isAllowed( 'delete' ) ) {
$q = array( 'action' => 'delete' );
- if( !$iscur )
+ if ( !$iscur )
$q['oldimage'] = $img;
$row .= $this->skin->link(
$this->title,
@@ -877,22 +907,22 @@ 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') ) {
+ if ( $canHide || ( $wgUser->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+ if ( $wgUser->isAllowed( 'delete' ) ) {
$row .= '<br />';
}
// If file is top revision or locked from this user, don't link
- if( $iscur || !$file->userCan(File::DELETED_RESTRICTED) ) {
+ if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
$del = $this->skin->revDeleteLinkDisabled( $canHide );
} else {
list( $ts, $name ) = explode( '!', $img, 2 );
$query = array(
'type' => 'oldimage',
- 'target' => $wgTitle->getPrefixedText(),
+ 'target' => $this->title->getPrefixedText(),
'ids' => $ts,
);
$del = $this->skin->revDeleteLink( $query,
- $file->isDeleted(File::DELETED_RESTRICTED), $canHide );
+ $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
}
$row .= $del;
}
@@ -901,11 +931,11 @@ class ImageHistoryList {
// Reversion link/current indicator
$row .= '<td>';
- if( $iscur ) {
+ if ( $iscur ) {
$row .= wfMsgHtml( 'filehist-current' );
- } elseif( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
- if( $file->isDeleted(File::DELETED_FILE) ) {
- $row .= wfMsgHtml('filehist-revert');
+ } elseif ( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
+ if ( $file->isDeleted( File::DELETED_FILE ) ) {
+ $row .= wfMsgHtml( 'filehist-revert' );
} else {
$row .= $this->skin->link(
$this->title,
@@ -923,14 +953,14 @@ class ImageHistoryList {
$row .= '</td>';
// Date/time and image link
- if( $file->getTimestamp() === $this->img->getTimestamp() ) {
+ if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
$selected = "class='filehistory-selected'";
}
$row .= "<td $selected style='white-space: nowrap;'>";
- if( !$file->userCan(File::DELETED_FILE) ) {
+ if ( !$file->userCan( File::DELETED_FILE ) ) {
# Don't link to unviewable files
$row .= '<span class="history-deleted">' . $wgLang->timeAndDate( $timestamp, true ) . '</span>';
- } elseif( $file->isDeleted(File::DELETED_FILE) ) {
+ } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
$this->preventClickjacking();
$revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
# Make a link to review the image
@@ -939,13 +969,13 @@ class ImageHistoryList {
$wgLang->timeAndDate( $timestamp, true ),
array(),
array(
- 'target' => $wgTitle->getPrefixedText(),
+ 'target' => $this->title->getPrefixedText(),
'file' => $img,
'token' => $wgUser->editToken( $img )
),
array( 'known', 'noclasses' )
);
- $row .= '<span class="history-deleted">'.$url.'</span>';
+ $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 ) );
@@ -965,27 +995,28 @@ class ImageHistoryList {
// Uploading user
$row .= '<td>';
- if( $local ) {
- // Hide deleted usernames
- if( $file->isDeleted(File::DELETED_USER) ) {
- $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+ // Hide deleted usernames
+ if ( $file->isDeleted( File::DELETED_USER ) ) {
+ $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+ } else {
+ if ( $local ) {
+ $row .= $this->skin->userLink( $user, $usertext ) . ' <span style="white-space: nowrap;">' .
+ $this->skin->userToolLinks( $user, $usertext ) . '</span>';
} else {
- $row .= $this->skin->userLink( $user, $usertext ) . " <span style='white-space: nowrap;'>" .
- $this->skin->userToolLinks( $user, $usertext ) . "</span>";
+ $row .= htmlspecialchars( $usertext );
}
- } else {
- $row .= htmlspecialchars( $usertext );
}
$row .= '</td><td>';
// Don't show deleted descriptions
- if( $file->isDeleted(File::DELETED_COMMENT) ) {
- $row .= '<span class="history-deleted">' . wfMsgHtml('rev-deleted-comment') . '</span>';
+ if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+ $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
} else {
$row .= $this->skin->commentBlock( $description, $this->title );
}
$row .= '</td>';
+ $rowClass = null;
wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
$classAttr = $rowClass ? " class='$rowClass'" : "";
@@ -995,12 +1026,12 @@ class ImageHistoryList {
protected function getThumbForLine( $file ) {
global $wgLang;
- if( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
+ if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
$params = array(
'width' => '120',
'height' => '120',
);
- $timestamp = wfTimestamp(TS_MW, $file->getTimestamp());
+ $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
$thumbnail = $file->transform( $params );
$options = array(
@@ -1034,7 +1065,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
function __construct( $imagePage ) {
parent::__construct();
$this->mImagePage = $imagePage;
- $this->mTitle = clone( $imagePage->getTitle() );
+ $this->mTitle = clone ( $imagePage->getTitle() );
$this->mTitle->setFragment( '#filehistory' );
$this->mImg = null;
$this->mHist = array();
@@ -1060,17 +1091,17 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
function getBody() {
$s = '';
$this->doQuery();
- if( count($this->mHist) ) {
+ if ( count( $this->mHist ) ) {
$list = new ImageHistoryList( $this->mImagePage );
# Generate prev/next links
$navLink = $this->getNavigationBar();
- $s = $list->beginImageHistoryList($navLink);
+ $s = $list->beginImageHistoryList( $navLink );
// Skip rows there just for paging links
- for( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
+ for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
$file = $this->mHist[$i];
$s .= $list->imageHistoryLine( !$file->isOld(), $file );
}
- $s .= $list->endImageHistoryList($navLink);
+ $s .= $list->endImageHistoryList( $navLink );
if ( $list->getPreventClickjacking() ) {
$this->preventClickjacking();
@@ -1080,52 +1111,52 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
}
function doQuery() {
- if( $this->mQueryDone ) return;
+ if ( $this->mQueryDone ) return;
$this->mImg = $this->mImagePage->getFile(); // ensure loading
- if( !$this->mImg->exists() ) {
+ if ( !$this->mImg->exists() ) {
return;
}
$queryLimit = $this->mLimit + 1; // limit plus extra row
- if( $this->mIsBackwards ) {
+ if ( $this->mIsBackwards ) {
// Fetch the file history
- $this->mHist = $this->mImg->getHistory($queryLimit,null,$this->mOffset,false);
+ $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
// The current rev may not meet the offset/limit
- $numRows = count($this->mHist);
- if( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
- $this->mHist = array_merge( array($this->mImg), $this->mHist );
+ $numRows = count( $this->mHist );
+ if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
+ $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
}
} else {
// The current rev may not meet the offset
- if( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
+ if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
$this->mHist[] = $this->mImg;
}
// Old image versions (fetch extra row for nav links)
- $oiLimit = count($this->mHist) ? $this->mLimit : $this->mLimit+1;
+ $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
// Fetch the file history
$this->mHist = array_merge( $this->mHist,
- $this->mImg->getHistory($oiLimit,$this->mOffset,null,false) );
+ $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
}
- $numRows = count($this->mHist); // Total number of query results
- if( $numRows ) {
+ $numRows = count( $this->mHist ); // Total number of query results
+ if ( $numRows ) {
# Index value of top item in the list
$firstIndex = $this->mIsBackwards ?
- $this->mHist[$numRows-1]->getTimestamp() : $this->mHist[0]->getTimestamp();
+ $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
# Discard the extra result row if there is one
- if( $numRows > $this->mLimit && $numRows > 1 ) {
- if( $this->mIsBackwards ) {
+ if ( $numRows > $this->mLimit && $numRows > 1 ) {
+ if ( $this->mIsBackwards ) {
# Index value of item past the index
$this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
# Index value of bottom item in the list
$lastIndex = $this->mHist[1]->getTimestamp();
# Display range
- $this->mRange = array( 1, $numRows-1 );
+ $this->mRange = array( 1, $numRows - 1 );
} else {
# Index value of item past the index
- $this->mPastTheEndIndex = $this->mHist[$numRows-1]->getTimestamp();
+ $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
# Index value of bottom item in the list
- $lastIndex = $this->mHist[$numRows-2]->getTimestamp();
+ $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
# Display range
- $this->mRange = array( 0, $numRows-2 );
+ $this->mRange = array( 0, $numRows - 2 );
}
} else {
# Setting indexes to an empty string means that they will be
@@ -1135,16 +1166,16 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
$this->mPastTheEndIndex = '';
# Index value of bottom item in the list
$lastIndex = $this->mIsBackwards ?
- $this->mHist[0]->getTimestamp() : $this->mHist[$numRows-1]->getTimestamp();
+ $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
# Display range
- $this->mRange = array( 0, $numRows-1 );
+ $this->mRange = array( 0, $numRows - 1 );
}
} else {
$firstIndex = '';
$lastIndex = '';
$this->mPastTheEndIndex = '';
}
- if( $this->mIsBackwards ) {
+ if ( $this->mIsBackwards ) {
$this->mIsFirst = ( $numRows < $queryLimit );
$this->mIsLast = ( $this->mOffset == '' );
$this->mLastShown = $firstIndex;
diff --git a/includes/Import.php b/includes/Import.php
index 45908a66..c76a6834 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -1,7 +1,8 @@
<?php
/**
* MediaWiki page data importer
- * Copyright (C) 2003,2005 Brion Vibber <brion@pobox.com>
+ *
+ * Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -24,7 +25,756 @@
*/
/**
+ * XML file reader for the page data importer
*
+ * implements Special:Import
+ * @ingroup SpecialPage
+ */
+class WikiImporter {
+ private $reader = null;
+ private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
+ private $mSiteInfoCallback, $mTargetNamespace, $mPageOutCallback;
+ private $mDebug;
+
+ /**
+ * Creates an ImportXMLReader drawing from the source provided
+ */
+ function __construct( $source ) {
+ $this->reader = new XMLReader();
+
+ stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
+ $id = UploadSourceAdapter::registerSource( $source );
+ $this->reader->open( "uploadsource://$id" );
+
+ // Default callbacks
+ $this->setRevisionCallback( array( $this, "importRevision" ) );
+ $this->setUploadCallback( array( $this, 'importUpload' ) );
+ $this->setLogItemCallback( array( $this, 'importLogItem' ) );
+ $this->setPageOutCallback( array( $this, 'finishImportPage' ) );
+ }
+
+ private function throwXmlError( $err ) {
+ $this->debug( "FAILURE: $err" );
+ wfDebug( "WikiImporter XML error: $err\n" );
+ }
+
+ private function debug( $data ) {
+ if( $this->mDebug ) {
+ wfDebug( "IMPORT: $data\n" );
+ }
+ }
+
+ private function warn( $data ) {
+ wfDebug( "IMPORT: $data\n" );
+ }
+
+ private function notice( $data ) {
+ global $wgCommandLineMode;
+ if( $wgCommandLineMode ) {
+ print "$data\n";
+ } else {
+ global $wgOut;
+ $wgOut->addHTML( "<li>" . htmlspecialchars( $data ) . "</li>\n" );
+ }
+ }
+
+ /**
+ * Set debug mode...
+ */
+ function setDebug( $debug ) {
+ $this->mDebug = $debug;
+ }
+
+ /**
+ * Sets the action to perform as each new page in the stream is reached.
+ * @param $callback callback
+ * @return callback
+ */
+ public function setPageCallback( $callback ) {
+ $previous = $this->mPageCallback;
+ $this->mPageCallback = $callback;
+ return $previous;
+ }
+
+ /**
+ * Sets the action to perform as each page in the stream is completed.
+ * Callback accepts the page title (as a Title object), a second object
+ * with the original title form (in case it's been overridden into a
+ * local namespace), and a count of revisions.
+ *
+ * @param $callback callback
+ * @return callback
+ */
+ public function setPageOutCallback( $callback ) {
+ $previous = $this->mPageOutCallback;
+ $this->mPageOutCallback = $callback;
+ return $previous;
+ }
+
+ /**
+ * Sets the action to perform as each page revision is reached.
+ * @param $callback callback
+ * @return callback
+ */
+ public function setRevisionCallback( $callback ) {
+ $previous = $this->mRevisionCallback;
+ $this->mRevisionCallback = $callback;
+ return $previous;
+ }
+
+ /**
+ * Sets the action to perform as each file upload version is reached.
+ * @param $callback callback
+ * @return callback
+ */
+ public function setUploadCallback( $callback ) {
+ $previous = $this->mUploadCallback;
+ $this->mUploadCallback = $callback;
+ return $previous;
+ }
+
+ /**
+ * Sets the action to perform as each log item reached.
+ * @param $callback callback
+ * @return callback
+ */
+ public function setLogItemCallback( $callback ) {
+ $previous = $this->mLogItemCallback;
+ $this->mLogItemCallback = $callback;
+ return $previous;
+ }
+
+ /**
+ * Sets the action to perform when site info is encountered
+ * @param $callback callback
+ * @return callback
+ */
+ public function setSiteInfoCallback( $callback ) {
+ $previous = $this->mSiteInfoCallback;
+ $this->mSiteInfoCallback = $callback;
+ return $previous;
+ }
+
+ /**
+ * Set a target namespace to override the defaults
+ */
+ public function setTargetNamespace( $namespace ) {
+ if( is_null( $namespace ) ) {
+ // Don't override namespaces
+ $this->mTargetNamespace = null;
+ } elseif( $namespace >= 0 ) {
+ // FIXME: Check for validity
+ $this->mTargetNamespace = intval( $namespace );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Default per-revision callback, performs the import.
+ * @param $revision WikiRevision
+ */
+ public function importRevision( $revision ) {
+ $dbw = wfGetDB( DB_MASTER );
+ return $dbw->deadlockLoop( array( $revision, 'importOldRevision' ) );
+ }
+
+ /**
+ * Default per-revision callback, performs the import.
+ * @param $rev WikiRevision
+ */
+ public function importLogItem( $rev ) {
+ $dbw = wfGetDB( DB_MASTER );
+ return $dbw->deadlockLoop( array( $rev, 'importLogItem' ) );
+ }
+
+ /**
+ * Dummy for now...
+ */
+ public function importUpload( $revision ) {
+ //$dbw = wfGetDB( DB_MASTER );
+ //return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
+ return false;
+ }
+
+ /**
+ * Mostly for hook use
+ */
+ public function finishImportPage( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) {
+ $args = func_get_args();
+ return wfRunHooks( 'AfterImportPage', $args );
+ }
+
+ /**
+ * Alternate per-revision callback, for debugging.
+ * @param $revision WikiRevision
+ */
+ public function debugRevisionHandler( &$revision ) {
+ $this->debug( "Got revision:" );
+ if( is_object( $revision->title ) ) {
+ $this->debug( "-- Title: " . $revision->title->getPrefixedText() );
+ } else {
+ $this->debug( "-- Title: <invalid>" );
+ }
+ $this->debug( "-- User: " . $revision->user_text );
+ $this->debug( "-- Timestamp: " . $revision->timestamp );
+ $this->debug( "-- Comment: " . $revision->comment );
+ $this->debug( "-- Text: " . $revision->text );
+ }
+
+ /**
+ * Notify the callback function when a new <page> is reached.
+ * @param $title Title
+ */
+ function pageCallback( $title ) {
+ if( isset( $this->mPageCallback ) ) {
+ call_user_func( $this->mPageCallback, $title );
+ }
+ }
+
+ /**
+ * Notify the callback function when a </page> is closed.
+ * @param $title Title
+ * @param $origTitle Title
+ * @param $revCount Integer
+ * @param $sucCount Int: number of revisions for which callback returned true
+ * @param $pageInfo Array: associative array of page information
+ */
+ private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
+ if( isset( $this->mPageOutCallback ) ) {
+ $args = func_get_args();
+ call_user_func_array( $this->mPageOutCallback, $args );
+ }
+ }
+
+ /**
+ * Notify the callback function of a revision
+ * @param $revision A WikiRevision object
+ */
+ private function revisionCallback( $revision ) {
+ if ( isset( $this->mRevisionCallback ) ) {
+ return call_user_func_array( $this->mRevisionCallback,
+ array( $revision, $this ) );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Notify the callback function of a new log item
+ * @param $revision A WikiRevision object
+ */
+ private function logItemCallback( $revision ) {
+ if ( isset( $this->mLogItemCallback ) ) {
+ return call_user_func_array( $this->mLogItemCallback,
+ array( $revision, $this ) );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Shouldn't something like this be built-in to XMLReader?
+ * Fetches text contents of the current element, assuming
+ * no sub-elements or such scary things.
+ * @return string
+ * @access private
+ */
+ private function nodeContents() {
+ if( $this->reader->isEmptyElement ) {
+ return "";
+ }
+ $buffer = "";
+ while( $this->reader->read() ) {
+ switch( $this->reader->nodeType ) {
+ case XmlReader::TEXT:
+ case XmlReader::SIGNIFICANT_WHITESPACE:
+ $buffer .= $this->reader->value;
+ break;
+ case XmlReader::END_ELEMENT:
+ return $buffer;
+ }
+ }
+
+ $this->reader->close();
+ return '';
+ }
+
+ # --------------
+
+ /** Left in for debugging */
+ private function dumpElement() {
+ static $lookup = null;
+ if (!$lookup) {
+ $xmlReaderConstants = array(
+ "NONE",
+ "ELEMENT",
+ "ATTRIBUTE",
+ "TEXT",
+ "CDATA",
+ "ENTITY_REF",
+ "ENTITY",
+ "PI",
+ "COMMENT",
+ "DOC",
+ "DOC_TYPE",
+ "DOC_FRAGMENT",
+ "NOTATION",
+ "WHITESPACE",
+ "SIGNIFICANT_WHITESPACE",
+ "END_ELEMENT",
+ "END_ENTITY",
+ "XML_DECLARATION",
+ );
+ $lookup = array();
+
+ foreach( $xmlReaderConstants as $name ) {
+ $lookup[constant("XmlReader::$name")] = $name;
+ }
+ }
+
+ print( var_dump(
+ $lookup[$this->reader->nodeType],
+ $this->reader->name,
+ $this->reader->value
+ )."\n\n" );
+ }
+
+ /**
+ * Primary entry point
+ */
+ public function doImport() {
+ $this->reader->read();
+
+ if ( $this->reader->name != 'mediawiki' ) {
+ throw new MWException( "Expected <mediawiki> tag, got ".
+ $this->reader->name );
+ }
+ $this->debug( "<mediawiki> tag is correct." );
+
+ $this->debug( "Starting primary dump processing loop." );
+
+ $keepReading = $this->reader->read();
+ $skip = false;
+ while ( $keepReading ) {
+ $tag = $this->reader->name;
+ $type = $this->reader->nodeType;
+
+ if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', $this ) ) {
+ // Do nothing
+ } elseif ( $tag == 'mediawiki' && $type == XmlReader::END_ELEMENT ) {
+ break;
+ } elseif ( $tag == 'siteinfo' ) {
+ $this->handleSiteInfo();
+ } elseif ( $tag == 'page' ) {
+ $this->handlePage();
+ } elseif ( $tag == 'logitem' ) {
+ $this->handleLogItem();
+ } elseif ( $tag != '#text' ) {
+ $this->warn( "Unhandled top-level XML tag $tag" );
+
+ $skip = true;
+ }
+
+ if ($skip) {
+ $keepReading = $this->reader->next();
+ $skip = false;
+ $this->debug( "Skip" );
+ } else {
+ $keepReading = $this->reader->read();
+ }
+ }
+
+ return true;
+ }
+
+ private function handleSiteInfo() {
+ // Site info is useful, but not actually used for dump imports.
+ // Includes a quick short-circuit to save performance.
+ if ( ! $this->mSiteInfoCallback ) {
+ $this->reader->next();
+ return true;
+ }
+ throw new MWException( "SiteInfo tag is not yet handled, do not set mSiteInfoCallback" );
+ }
+
+ private function handleLogItem() {
+ $this->debug( "Enter log item handler." );
+ $logInfo = array();
+
+ // Fields that can just be stuffed in the pageInfo object
+ $normalFields = array( 'id', 'comment', 'type', 'action', 'timestamp',
+ 'logtitle', 'params' );
+
+ while ( $this->reader->read() ) {
+ if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+ $this->reader->name == 'logitem') {
+ break;
+ }
+
+ $tag = $this->reader->name;
+
+ if ( !wfRunHooks( 'ImportHandleLogItemXMLTag',
+ $this, $logInfo ) ) {
+ // Do nothing
+ } elseif ( in_array( $tag, $normalFields ) ) {
+ $logInfo[$tag] = $this->nodeContents();
+ } elseif ( $tag == 'contributor' ) {
+ $logInfo['contributor'] = $this->handleContributor();
+ } elseif ( $tag != '#text' ) {
+ $this->warn( "Unhandled log-item XML tag $tag" );
+ }
+ }
+
+ $this->processLogItem( $logInfo );
+ }
+
+ private function processLogItem( $logInfo ) {
+ $revision = new WikiRevision;
+
+ $revision->setID( $logInfo['id'] );
+ $revision->setType( $logInfo['type'] );
+ $revision->setAction( $logInfo['action'] );
+ $revision->setTimestamp( $logInfo['timestamp'] );
+ $revision->setParams( $logInfo['params'] );
+ $revision->setTitle( Title::newFromText( $logInfo['logtitle'] ) );
+
+ if ( isset( $logInfo['comment'] ) ) {
+ $revision->setComment( $logInfo['comment'] );
+ }
+
+ if ( isset( $logInfo['contributor']['ip'] ) ) {
+ $revision->setUserIP( $logInfo['contributor']['ip'] );
+ }
+ if ( isset( $logInfo['contributor']['username'] ) ) {
+ $revision->setUserName( $logInfo['contributor']['username'] );
+ }
+
+ return $this->logItemCallback( $revision );
+ }
+
+ private function handlePage() {
+ // Handle page data.
+ $this->debug( "Enter page handler." );
+ $pageInfo = array( 'revisionCount' => 0, 'successfulRevisionCount' => 0 );
+
+ // Fields that can just be stuffed in the pageInfo object
+ $normalFields = array( 'title', 'id', 'redirect', 'restrictions' );
+
+ $skip = false;
+ $badTitle = false;
+
+ while ( $skip ? $this->reader->next() : $this->reader->read() ) {
+ if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+ $this->reader->name == 'page') {
+ break;
+ }
+
+ $tag = $this->reader->name;
+
+ if ( $badTitle ) {
+ // The title is invalid, bail out of this page
+ $skip = true;
+ } elseif ( !wfRunHooks( 'ImportHandlePageXMLTag', array( $this,
+ &$pageInfo ) ) ) {
+ // Do nothing
+ } elseif ( in_array( $tag, $normalFields ) ) {
+ $pageInfo[$tag] = $this->nodeContents();
+ if ( $tag == 'title' ) {
+ $title = $this->processTitle( $pageInfo['title'] );
+
+ if ( !$title ) {
+ $badTitle = true;
+ $skip = true;
+ }
+
+ $this->pageCallback( $title );
+ list( $pageInfo['_title'], $origTitle ) = $title;
+ }
+ } elseif ( $tag == 'revision' ) {
+ $this->handleRevision( $pageInfo );
+ } elseif ( $tag == 'upload' ) {
+ $this->handleUpload( $pageInfo );
+ } elseif ( $tag != '#text' ) {
+ $this->warn( "Unhandled page XML tag $tag" );
+ $skip = true;
+ }
+ }
+
+ $this->pageOutCallback( $pageInfo['_title'], $origTitle,
+ $pageInfo['revisionCount'],
+ $pageInfo['successfulRevisionCount'],
+ $pageInfo );
+ }
+
+ private function handleRevision( &$pageInfo ) {
+ $this->debug( "Enter revision handler" );
+ $revisionInfo = array();
+
+ $normalFields = array( 'id', 'timestamp', 'comment', 'minor', 'text' );
+
+ $skip = false;
+
+ while ( $skip ? $this->reader->next() : $this->reader->read() ) {
+ if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+ $this->reader->name == 'revision') {
+ break;
+ }
+
+ $tag = $this->reader->name;
+
+ if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', $this,
+ $pageInfo, $revisionInfo ) ) {
+ // Do nothing
+ } elseif ( in_array( $tag, $normalFields ) ) {
+ $revisionInfo[$tag] = $this->nodeContents();
+ } elseif ( $tag == 'contributor' ) {
+ $revisionInfo['contributor'] = $this->handleContributor();
+ } elseif ( $tag != '#text' ) {
+ $this->warn( "Unhandled revision XML tag $tag" );
+ $skip = true;
+ }
+ }
+
+ $pageInfo['revisionCount']++;
+ if ( $this->processRevision( $pageInfo, $revisionInfo ) ) {
+ $pageInfo['successfulRevisionCount']++;
+ }
+ }
+
+ private function processRevision( $pageInfo, $revisionInfo ) {
+ $revision = new WikiRevision;
+
+ $revision->setID( $revisionInfo['id'] );
+ $revision->setText( $revisionInfo['text'] );
+ $revision->setTitle( $pageInfo['_title'] );
+ $revision->setTimestamp( $revisionInfo['timestamp'] );
+
+ if ( isset( $revisionInfo['comment'] ) ) {
+ $revision->setComment( $revisionInfo['comment'] );
+ }
+
+ if ( isset( $revisionInfo['minor'] ) )
+ $revision->setMinor( true );
+
+ if ( isset( $revisionInfo['contributor']['ip'] ) ) {
+ $revision->setUserIP( $revisionInfo['contributor']['ip'] );
+ }
+ if ( isset( $revisionInfo['contributor']['username'] ) ) {
+ $revision->setUserName( $revisionInfo['contributor']['username'] );
+ }
+
+ return $this->revisionCallback( $revision );
+ }
+
+ private function handleUpload( &$pageInfo ) {
+ $this->debug( "Enter upload handler" );
+ $uploadInfo = array();
+
+ $normalFields = array( 'timestamp', 'comment', 'filename', 'text',
+ 'src', 'size' );
+
+ $skip = false;
+
+ while ( $skip ? $this->reader->next() : $this->reader->read() ) {
+ if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+ $this->reader->name == 'upload') {
+ break;
+ }
+
+ $tag = $this->reader->name;
+
+ if ( !wfRunHooks( 'ImportHandleUploadXMLTag', $this,
+ $pageInfo ) ) {
+ // Do nothing
+ } elseif ( in_array( $tag, $normalFields ) ) {
+ $uploadInfo[$tag] = $this->nodeContents();
+ } elseif ( $tag == 'contributor' ) {
+ $uploadInfo['contributor'] = $this->handleContributor();
+ } elseif ( $tag != '#text' ) {
+ $this->warn( "Unhandled upload XML tag $tag" );
+ $skip = true;
+ }
+ }
+
+ return $this->processUpload( $pageInfo, $uploadInfo );
+ }
+
+ private function processUpload( $pageInfo, $uploadInfo ) {
+ $revision = new WikiRevision;
+
+ $revision->setTitle( $pageInfo['_title'] );
+ $revision->setID( $uploadInfo['id'] );
+ $revision->setTimestamp( $uploadInfo['timestamp'] );
+ $revision->setText( $uploadInfo['text'] );
+ $revision->setFilename( $uploadInfo['filename'] );
+ $revision->setSrc( $uploadInfo['src'] );
+ $revision->setSize( intval( $uploadInfo['size'] ) );
+ $revision->setComment( $uploadInfo['comment'] );
+
+ if ( isset( $uploadInfo['contributor']['ip'] ) ) {
+ $revision->setUserIP( $uploadInfo['contributor']['ip'] );
+ }
+ if ( isset( $uploadInfo['contributor']['username'] ) ) {
+ $revision->setUserName( $uploadInfo['contributor']['username'] );
+ }
+
+ return $this->uploadCallback( $revision );
+ }
+
+ private function handleContributor() {
+ $fields = array( 'id', 'ip', 'username' );
+ $info = array();
+
+ while ( $this->reader->read() ) {
+ if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+ $this->reader->name == 'contributor') {
+ break;
+ }
+
+ $tag = $this->reader->name;
+
+ if ( in_array( $tag, $fields ) ) {
+ $info[$tag] = $this->nodeContents();
+ }
+ }
+
+ return $info;
+ }
+
+ private function processTitle( $text ) {
+ $workTitle = $text;
+ $origTitle = Title::newFromText( $workTitle );
+
+ if( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
+ $title = Title::makeTitle( $this->mTargetNamespace,
+ $origTitle->getDBkey() );
+ } else {
+ $title = Title::newFromText( $workTitle );
+ }
+
+ if( is_null( $title ) ) {
+ // Invalid page title? Ignore the page
+ $this->notice( "Skipping invalid page title '$workTitle'" );
+ return false;
+ } elseif( $title->getInterwiki() != '' ) {
+ $this->notice( "Skipping interwiki page title '$workTitle'" );
+ return false;
+ }
+
+ return array( $title, $origTitle );
+ }
+}
+
+/** This is a horrible hack used to keep source compatibility */
+class UploadSourceAdapter {
+ static $sourceRegistrations = array();
+
+ private $mSource;
+ private $mBuffer;
+ private $mPosition;
+
+ static function registerSource( $source ) {
+ $id = wfGenerateToken();
+
+ self::$sourceRegistrations[$id] = $source;
+
+ return $id;
+ }
+
+ function stream_open( $path, $mode, $options, &$opened_path ) {
+ $url = parse_url($path);
+ $id = $url['host'];
+
+ if ( !isset( self::$sourceRegistrations[$id] ) ) {
+ return false;
+ }
+
+ $this->mSource = self::$sourceRegistrations[$id];
+
+ return true;
+ }
+
+ function stream_read( $count ) {
+ $return = '';
+ $leave = false;
+
+ while ( !$leave && !$this->mSource->atEnd() &&
+ strlen($this->mBuffer) < $count ) {
+ $read = $this->mSource->readChunk();
+
+ if ( !strlen($read) ) {
+ $leave = true;
+ }
+
+ $this->mBuffer .= $read;
+ }
+
+ if ( strlen($this->mBuffer) ) {
+ $return = substr( $this->mBuffer, 0, $count );
+ $this->mBuffer = substr( $this->mBuffer, $count );
+ }
+
+ $this->mPosition += strlen($return);
+
+ return $return;
+ }
+
+ function stream_write( $data ) {
+ return false;
+ }
+
+ function stream_tell() {
+ return $this->mPosition;
+ }
+
+ function stream_eof() {
+ return $this->mSource->atEnd();
+ }
+
+ function url_stat() {
+ $result = array();
+
+ $result['dev'] = $result[0] = 0;
+ $result['ino'] = $result[1] = 0;
+ $result['mode'] = $result[2] = 0;
+ $result['nlink'] = $result[3] = 0;
+ $result['uid'] = $result[4] = 0;
+ $result['gid'] = $result[5] = 0;
+ $result['rdev'] = $result[6] = 0;
+ $result['size'] = $result[7] = 0;
+ $result['atime'] = $result[8] = 0;
+ $result['mtime'] = $result[9] = 0;
+ $result['ctime'] = $result[10] = 0;
+ $result['blksize'] = $result[11] = 0;
+ $result['blocks'] = $result[12] = 0;
+
+ return $result;
+ }
+}
+
+class XMLReader2 extends XMLReader {
+ function nodeContents() {
+ if( $this->isEmptyElement ) {
+ return "";
+ }
+ $buffer = "";
+ while( $this->read() ) {
+ switch( $this->nodeType ) {
+ case XmlReader::TEXT:
+ case XmlReader::SIGNIFICANT_WHITESPACE:
+ $buffer .= $this->value;
+ break;
+ case XmlReader::END_ELEMENT:
+ return $buffer;
+ }
+ }
+ return $this->close();
+ }
+}
+
+/**
+ * @todo document (e.g. one-sentence class description).
* @ingroup SpecialPage
*/
class WikiRevision {
@@ -310,7 +1060,6 @@ class WikiRevision {
$file = wfLocalFile( $this->getTitle() );
if( !$file ) {
- var_dump( $file );
wfDebug( "IMPORT: Bad file. :(\n" );
return false;
}
@@ -371,658 +1120,6 @@ class WikiRevision {
}
/**
- * implements Special:Import
- * @ingroup SpecialPage
- */
-class WikiImporter {
- var $mDebug = false;
- var $mSource = null;
- var $mPageCallback = null;
- var $mPageOutCallback = null;
- var $mRevisionCallback = null;
- var $mLogItemCallback = null;
- var $mUploadCallback = null;
- var $mTargetNamespace = null;
- var $mXmlNamespace = false;
- var $lastfield;
- var $tagStack = array();
-
- function __construct( $source ) {
- $this->setRevisionCallback( array( $this, "importRevision" ) );
- $this->setUploadCallback( array( $this, "importUpload" ) );
- $this->setLogItemCallback( array( $this, "importLogItem" ) );
- $this->mSource = $source;
- }
-
- function throwXmlError( $err ) {
- $this->debug( "FAILURE: $err" );
- wfDebug( "WikiImporter XML error: $err\n" );
- }
-
- function handleXmlNamespace ( $parser, $data, $prefix=false, $uri=false ) {
- if( preg_match( '/www.mediawiki.org/',$prefix ) ) {
- $prefix = str_replace( '/','\/',$prefix );
- $this->mXmlNamespace='/^'.$prefix.':/';
- }
- }
-
- function stripXmlNamespace($name) {
- if( $this->mXmlNamespace ) {
- return(preg_replace($this->mXmlNamespace,'',$name,1));
- }
- else {
- return($name);
- }
- }
-
- # --------------
-
- function doImport() {
- if( empty( $this->mSource ) ) {
- return new WikiErrorMsg( "importnotext" );
- }
-
- $parser = xml_parser_create_ns( "UTF-8" );
-
- # case folding violates XML standard, turn it off
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
- xml_set_object( $parser, $this );
- xml_set_element_handler( $parser, "in_start", "" );
- xml_set_start_namespace_decl_handler( $parser, "handleXmlNamespace" );
-
- $offset = 0; // for context extraction on error reporting
- do {
- $chunk = $this->mSource->readChunk();
- if( !xml_parse( $parser, $chunk, $this->mSource->atEnd() ) ) {
- wfDebug( "WikiImporter::doImport encountered XML parsing error\n" );
- return new WikiXmlError( $parser, wfMsgHtml( 'import-parse-failure' ), $chunk, $offset );
- }
- $offset += strlen( $chunk );
- } while( $chunk !== false && !$this->mSource->atEnd() );
- xml_parser_free( $parser );
-
- return true;
- }
-
- function debug( $data ) {
- if( $this->mDebug ) {
- wfDebug( "IMPORT: $data\n" );
- }
- }
-
- function notice( $data ) {
- global $wgCommandLineMode;
- if( $wgCommandLineMode ) {
- print "$data\n";
- } else {
- global $wgOut;
- $wgOut->addHTML( "<li>" . htmlspecialchars( $data ) . "</li>\n" );
- }
- }
-
- /**
- * Set debug mode...
- */
- function setDebug( $debug ) {
- $this->mDebug = $debug;
- }
-
- /**
- * Sets the action to perform as each new page in the stream is reached.
- * @param $callback callback
- * @return callback
- */
- function setPageCallback( $callback ) {
- $previous = $this->mPageCallback;
- $this->mPageCallback = $callback;
- return $previous;
- }
-
- /**
- * Sets the action to perform as each page in the stream is completed.
- * Callback accepts the page title (as a Title object), a second object
- * with the original title form (in case it's been overridden into a
- * local namespace), and a count of revisions.
- *
- * @param $callback callback
- * @return callback
- */
- function setPageOutCallback( $callback ) {
- $previous = $this->mPageOutCallback;
- $this->mPageOutCallback = $callback;
- return $previous;
- }
-
- /**
- * Sets the action to perform as each page revision is reached.
- * @param $callback callback
- * @return callback
- */
- function setRevisionCallback( $callback ) {
- $previous = $this->mRevisionCallback;
- $this->mRevisionCallback = $callback;
- return $previous;
- }
-
- /**
- * Sets the action to perform as each file upload version is reached.
- * @param $callback callback
- * @return callback
- */
- function setUploadCallback( $callback ) {
- $previous = $this->mUploadCallback;
- $this->mUploadCallback = $callback;
- return $previous;
- }
-
- /**
- * Sets the action to perform as each log item reached.
- * @param $callback callback
- * @return callback
- */
- function setLogItemCallback( $callback ) {
- $previous = $this->mLogItemCallback;
- $this->mLogItemCallback = $callback;
- return $previous;
- }
-
- /**
- * Set a target namespace to override the defaults
- */
- function setTargetNamespace( $namespace ) {
- if( is_null( $namespace ) ) {
- // Don't override namespaces
- $this->mTargetNamespace = null;
- } elseif( $namespace >= 0 ) {
- // FIXME: Check for validity
- $this->mTargetNamespace = intval( $namespace );
- } else {
- return false;
- }
- }
-
- /**
- * Default per-revision callback, performs the import.
- * @param $revision WikiRevision
- * @private
- */
- function importRevision( $revision ) {
- $dbw = wfGetDB( DB_MASTER );
- return $dbw->deadlockLoop( array( $revision, 'importOldRevision' ) );
- }
-
- /**
- * Default per-revision callback, performs the import.
- * @param $rev WikiRevision
- * @private
- */
- function importLogItem( $rev ) {
- $dbw = wfGetDB( DB_MASTER );
- return $dbw->deadlockLoop( array( $rev, 'importLogItem' ) );
- }
-
- /**
- * Dummy for now...
- */
- function importUpload( $revision ) {
- //$dbw = wfGetDB( DB_MASTER );
- //return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
- return false;
- }
-
- /**
- * Alternate per-revision callback, for debugging.
- * @param $revision WikiRevision
- * @private
- */
- function debugRevisionHandler( &$revision ) {
- $this->debug( "Got revision:" );
- if( is_object( $revision->title ) ) {
- $this->debug( "-- Title: " . $revision->title->getPrefixedText() );
- } else {
- $this->debug( "-- Title: <invalid>" );
- }
- $this->debug( "-- User: " . $revision->user_text );
- $this->debug( "-- Timestamp: " . $revision->timestamp );
- $this->debug( "-- Comment: " . $revision->comment );
- $this->debug( "-- Text: " . $revision->text );
- }
-
- /**
- * Notify the callback function when a new <page> is reached.
- * @param $title Title
- * @private
- */
- function pageCallback( $title ) {
- if( is_callable( $this->mPageCallback ) ) {
- call_user_func( $this->mPageCallback, $title );
- }
- }
-
- /**
- * Notify the callback function when a </page> is closed.
- * @param $title Title
- * @param $origTitle Title
- * @param $revisionCount int
- * @param $successCount Int: number of revisions for which callback returned true
- * @private
- */
- function pageOutCallback( $title, $origTitle, $revisionCount, $successCount ) {
- if( is_callable( $this->mPageOutCallback ) ) {
- call_user_func( $this->mPageOutCallback, $title, $origTitle,
- $revisionCount, $successCount );
- }
- }
-
- # XML parser callbacks from here out -- beware!
- function donothing( $parser, $x, $y="" ) {
- #$this->debug( "donothing" );
- }
-
- function in_start( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_start $name" );
- if( $name != "mediawiki" ) {
- return $this->throwXMLerror( "Expected <mediawiki>, got <$name>" );
- }
- xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" );
- }
-
- function in_mediawiki( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_mediawiki $name" );
- if( $name == 'siteinfo' ) {
- xml_set_element_handler( $parser, "in_siteinfo", "out_siteinfo" );
- } elseif( $name == 'page' ) {
- $this->push( $name );
- $this->workRevisionCount = 0;
- $this->workSuccessCount = 0;
- $this->uploadCount = 0;
- $this->uploadSuccessCount = 0;
- xml_set_element_handler( $parser, "in_page", "out_page" );
- } elseif( $name == 'logitem' ) {
- $this->push( $name );
- $this->workRevision = new WikiRevision;
- xml_set_element_handler( $parser, "in_logitem", "out_logitem" );
- } else {
- return $this->throwXMLerror( "Expected <page>, got <$name>" );
- }
- }
- function out_mediawiki( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_mediawiki $name" );
- if( $name != "mediawiki" ) {
- return $this->throwXMLerror( "Expected </mediawiki>, got </$name>" );
- }
- xml_set_element_handler( $parser, "donothing", "donothing" );
- }
-
-
- function in_siteinfo( $parser, $name, $attribs ) {
- // no-ops for now
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_siteinfo $name" );
- switch( $name ) {
- case "sitename":
- case "base":
- case "generator":
- case "case":
- case "namespaces":
- case "namespace":
- break;
- default:
- return $this->throwXMLerror( "Element <$name> not allowed in <siteinfo>." );
- }
- }
-
- function out_siteinfo( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- if( $name == "siteinfo" ) {
- xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" );
- }
- }
-
-
- function in_page( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_page $name" );
- switch( $name ) {
- case "id":
- case "title":
- case "redirect":
- case "restrictions":
- $this->appendfield = $name;
- $this->appenddata = "";
- xml_set_element_handler( $parser, "in_nothing", "out_append" );
- xml_set_character_data_handler( $parser, "char_append" );
- break;
- case "revision":
- $this->push( "revision" );
- if( is_object( $this->pageTitle ) ) {
- $this->workRevision = new WikiRevision;
- $this->workRevision->setTitle( $this->pageTitle );
- $this->workRevisionCount++;
- } else {
- // Skipping items due to invalid page title
- $this->workRevision = null;
- }
- xml_set_element_handler( $parser, "in_revision", "out_revision" );
- break;
- case "upload":
- $this->push( "upload" );
- if( is_object( $this->pageTitle ) ) {
- $this->workRevision = new WikiRevision;
- $this->workRevision->setTitle( $this->pageTitle );
- $this->uploadCount++;
- } else {
- // Skipping items due to invalid page title
- $this->workRevision = null;
- }
- xml_set_element_handler( $parser, "in_upload", "out_upload" );
- break;
- default:
- return $this->throwXMLerror( "Element <$name> not allowed in a <page>." );
- }
- }
-
- function out_page( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_page $name" );
- $this->pop();
- if( $name != "page" ) {
- return $this->throwXMLerror( "Expected </page>, got </$name>" );
- }
- xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" );
-
- $this->pageOutCallback( $this->pageTitle, $this->origTitle,
- $this->workRevisionCount, $this->workSuccessCount );
-
- $this->workTitle = null;
- $this->workRevision = null;
- $this->workRevisionCount = 0;
- $this->workSuccessCount = 0;
- $this->pageTitle = null;
- $this->origTitle = null;
- }
-
- function in_nothing( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_nothing $name" );
- return $this->throwXMLerror( "No child elements allowed here; got <$name>" );
- }
-
- function char_append( $parser, $data ) {
- $this->debug( "char_append '$data'" );
- $this->appenddata .= $data;
- }
-
- function out_append( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_append $name" );
- if( $name != $this->appendfield ) {
- return $this->throwXMLerror( "Expected </{$this->appendfield}>, got </$name>" );
- }
-
- switch( $this->appendfield ) {
- case "title":
- $this->workTitle = $this->appenddata;
- $this->origTitle = Title::newFromText( $this->workTitle );
- if( !is_null( $this->mTargetNamespace ) && !is_null( $this->origTitle ) ) {
- $this->pageTitle = Title::makeTitle( $this->mTargetNamespace,
- $this->origTitle->getDBkey() );
- } else {
- $this->pageTitle = Title::newFromText( $this->workTitle );
- }
- if( is_null( $this->pageTitle ) ) {
- // Invalid page title? Ignore the page
- $this->notice( "Skipping invalid page title '$this->workTitle'" );
- } elseif( $this->pageTitle->getInterwiki() != '' ) {
- $this->notice( "Skipping interwiki page title '$this->workTitle'" );
- $this->pageTitle = null;
- } else {
- $this->pageCallback( $this->workTitle );
- }
- break;
- case "id":
- if ( $this->parentTag() == 'revision' || $this->parentTag() == 'logitem' ) {
- if( $this->workRevision )
- $this->workRevision->setID( $this->appenddata );
- }
- break;
- case "text":
- if( $this->workRevision )
- $this->workRevision->setText( $this->appenddata );
- break;
- case "username":
- if( $this->workRevision )
- $this->workRevision->setUsername( $this->appenddata );
- break;
- case "ip":
- if( $this->workRevision )
- $this->workRevision->setUserIP( $this->appenddata );
- break;
- case "timestamp":
- if( $this->workRevision )
- $this->workRevision->setTimestamp( $this->appenddata );
- break;
- case "comment":
- if( $this->workRevision )
- $this->workRevision->setComment( $this->appenddata );
- break;
- case "type":
- if( $this->workRevision )
- $this->workRevision->setType( $this->appenddata );
- break;
- case "action":
- if( $this->workRevision )
- $this->workRevision->setAction( $this->appenddata );
- break;
- case "logtitle":
- if( $this->workRevision )
- $this->workRevision->setTitle( Title::newFromText( $this->appenddata ) );
- break;
- case "params":
- if( $this->workRevision )
- $this->workRevision->setParams( $this->appenddata );
- break;
- case "minor":
- if( $this->workRevision )
- $this->workRevision->setMinor( true );
- break;
- case "filename":
- if( $this->workRevision )
- $this->workRevision->setFilename( $this->appenddata );
- break;
- case "src":
- if( $this->workRevision )
- $this->workRevision->setSrc( $this->appenddata );
- break;
- case "size":
- if( $this->workRevision )
- $this->workRevision->setSize( intval( $this->appenddata ) );
- break;
- default:
- $this->debug( "Bad append: {$this->appendfield}" );
- }
- $this->appendfield = "";
- $this->appenddata = "";
-
- $parent = $this->parentTag();
- xml_set_element_handler( $parser, "in_$parent", "out_$parent" );
- xml_set_character_data_handler( $parser, "donothing" );
- }
-
- function in_revision( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_revision $name" );
- switch( $name ) {
- case "id":
- case "timestamp":
- case "comment":
- case "minor":
- case "text":
- $this->appendfield = $name;
- xml_set_element_handler( $parser, "in_nothing", "out_append" );
- xml_set_character_data_handler( $parser, "char_append" );
- break;
- case "contributor":
- $this->push( "contributor" );
- xml_set_element_handler( $parser, "in_contributor", "out_contributor" );
- break;
- default:
- return $this->throwXMLerror( "Element <$name> not allowed in a <revision>." );
- }
- }
-
- function out_revision( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_revision $name" );
- $this->pop();
- if( $name != "revision" ) {
- return $this->throwXMLerror( "Expected </revision>, got </$name>" );
- }
- xml_set_element_handler( $parser, "in_page", "out_page" );
-
- if( $this->workRevision ) {
- $ok = call_user_func_array( $this->mRevisionCallback,
- array( $this->workRevision, $this ) );
- if( $ok ) {
- $this->workSuccessCount++;
- }
- }
- }
-
- function in_logitem( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_logitem $name" );
- switch( $name ) {
- case "id":
- case "timestamp":
- case "comment":
- case "type":
- case "action":
- case "logtitle":
- case "params":
- $this->appendfield = $name;
- xml_set_element_handler( $parser, "in_nothing", "out_append" );
- xml_set_character_data_handler( $parser, "char_append" );
- break;
- case "contributor":
- $this->push( "contributor" );
- xml_set_element_handler( $parser, "in_contributor", "out_contributor" );
- break;
- default:
- return $this->throwXMLerror( "Element <$name> not allowed in a <revision>." );
- }
- }
-
- function out_logitem( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_logitem $name" );
- $this->pop();
- if( $name != "logitem" ) {
- return $this->throwXMLerror( "Expected </logitem>, got </$name>" );
- }
- xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" );
-
- if( $this->workRevision ) {
- $ok = call_user_func_array( $this->mLogItemCallback,
- array( $this->workRevision, $this ) );
- if( $ok ) {
- $this->workSuccessCount++;
- }
- }
- }
-
- function in_upload( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_upload $name" );
- switch( $name ) {
- case "timestamp":
- case "comment":
- case "text":
- case "filename":
- case "src":
- case "size":
- $this->appendfield = $name;
- xml_set_element_handler( $parser, "in_nothing", "out_append" );
- xml_set_character_data_handler( $parser, "char_append" );
- break;
- case "contributor":
- $this->push( "contributor" );
- xml_set_element_handler( $parser, "in_contributor", "out_contributor" );
- break;
- default:
- return $this->throwXMLerror( "Element <$name> not allowed in an <upload>." );
- }
- }
-
- function out_upload( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_revision $name" );
- $this->pop();
- if( $name != "upload" ) {
- return $this->throwXMLerror( "Expected </upload>, got </$name>" );
- }
- xml_set_element_handler( $parser, "in_page", "out_page" );
-
- if( $this->workRevision ) {
- $ok = call_user_func_array( $this->mUploadCallback,
- array( $this->workRevision, $this ) );
- if( $ok ) {
- $this->workUploadSuccessCount++;
- }
- }
- }
-
- function in_contributor( $parser, $name, $attribs ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "in_contributor $name" );
- switch( $name ) {
- case "username":
- case "ip":
- case "id":
- $this->appendfield = $name;
- xml_set_element_handler( $parser, "in_nothing", "out_append" );
- xml_set_character_data_handler( $parser, "char_append" );
- break;
- default:
- $this->throwXMLerror( "Invalid tag <$name> in <contributor>" );
- }
- }
-
- function out_contributor( $parser, $name ) {
- $name = $this->stripXmlNamespace($name);
- $this->debug( "out_contributor $name" );
- $this->pop();
- if( $name != "contributor" ) {
- return $this->throwXMLerror( "Expected </contributor>, got </$name>" );
- }
- $parent = $this->parentTag();
- xml_set_element_handler( $parser, "in_$parent", "out_$parent" );
- }
-
- private function push( $name ) {
- array_push( $this->tagStack, $name );
- $this->debug( "PUSH $name" );
- }
-
- private function pop() {
- $name = array_pop( $this->tagStack );
- $this->debug( "POP $name" );
- return $name;
- }
-
- private function parentTag() {
- $name = $this->tagStack[count( $this->tagStack ) - 1];
- $this->debug( "PARENT $name" );
- return $name;
- }
-
-}
-
-/**
* @todo document (e.g. one-sentence class description).
* @ingroup SpecialPage
*/
@@ -1066,27 +1163,27 @@ class ImportStreamSource {
static function newFromFile( $filename ) {
$file = @fopen( $filename, 'rt' );
if( !$file ) {
- return new WikiErrorMsg( "importcantopen" );
+ return Status::newFatal( "importcantopen" );
}
- return new ImportStreamSource( $file );
+ return Status::newGood( new ImportStreamSource( $file ) );
}
static function newFromUpload( $fieldname = "xmlimport" ) {
$upload =& $_FILES[$fieldname];
if( !isset( $upload ) || !$upload['name'] ) {
- return new WikiErrorMsg( 'importnofile' );
+ return Status::newFatal( 'importnofile' );
}
if( !empty( $upload['error'] ) ) {
switch($upload['error']){
case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
- return new WikiErrorMsg( 'importuploaderrorsize' );
+ return Status::newFatal( 'importuploaderrorsize' );
case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
- return new WikiErrorMsg( 'importuploaderrorsize' );
+ return Status::newFatal( 'importuploaderrorsize' );
case 3: # The uploaded file was only partially uploaded
- return new WikiErrorMsg( 'importuploaderrorpartial' );
- case 6: #Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3.
- return new WikiErrorMsg( 'importuploaderrortemp' );
+ return Status::newFatal( 'importuploaderrorpartial' );
+ case 6: #Missing a temporary folder.
+ return Status::newFatal( 'importuploaderrortemp' );
# case else: # Currently impossible
}
@@ -1095,7 +1192,7 @@ class ImportStreamSource {
if( is_uploaded_file( $fname ) ) {
return ImportStreamSource::newFromFile( $fname );
} else {
- return new WikiErrorMsg( 'importnofile' );
+ return Status::newFatal( 'importnofile' );
}
}
@@ -1111,19 +1208,19 @@ class ImportStreamSource {
fwrite( $file, $data );
fflush( $file );
fseek( $file, 0 );
- return new ImportStreamSource( $file );
+ return Status::newGood( new ImportStreamSource( $file ) );
} else {
- return new WikiErrorMsg( 'importcantopen' );
+ return Status::newFatal( 'importcantopen' );
}
}
public static function newFromInterwiki( $interwiki, $page, $history = false, $templates = false, $pageLinkDepth = 0 ) {
if( $page == '' ) {
- return new WikiErrorMsg( 'import-noarticle' );
+ return Status::newFatal( 'import-noarticle' );
}
$link = Title::newFromText( "$interwiki:Special:Export/$page" );
if( is_null( $link ) || $link->getInterwiki() == '' ) {
- return new WikiErrorMsg( 'importbadinterwiki' );
+ return Status::newFatal( 'importbadinterwiki' );
} else {
$params = array();
if ( $history ) $params['history'] = 1;
diff --git a/includes/Interwiki.php b/includes/Interwiki.php
index 3c71f6ee..5a3b6556 100644
--- a/includes/Interwiki.php
+++ b/includes/Interwiki.php
@@ -7,7 +7,8 @@
/**
* The interwiki class
* All information is loaded on creation when called by Interwiki::fetch( $prefix ).
- * All work is done on slave, because this should *never* change (except during schema updates etc, which arent wiki-related)
+ * All work is done on slave, because this should *never* change (except during
+ * schema updates etc, which aren't wiki-related)
*/
class Interwiki {
@@ -15,11 +16,13 @@ class Interwiki {
protected static $smCache = array();
const CACHE_LIMIT = 100; // 0 means unlimited, any other value is max number of entries.
- protected $mPrefix, $mURL, $mLocal, $mTrans;
+ protected $mPrefix, $mURL, $mAPI, $mWikiID, $mLocal, $mTrans;
- public function __construct( $prefix = null, $url = '', $local = 0, $trans = 0 ) {
+ public function __construct( $prefix = null, $url = '', $api = '', $wikiId = '', $local = 0, $trans = 0 ) {
$this->mPrefix = $prefix;
$this->mURL = $url;
+ $this->mAPI = $api;
+ $this->mWikiID = $wikiId;
$this->mLocal = $local;
$this->mTrans = $trans;
}
@@ -61,7 +64,7 @@ class Interwiki {
}
if( self::CACHE_LIMIT && count( self::$smCache ) >= self::CACHE_LIMIT ) {
reset( self::$smCache );
- unset( self::$smCache[ key( self::$smCache ) ] );
+ unset( self::$smCache[key( self::$smCache )] );
}
self::$smCache[$prefix] = $iw;
return $iw;
@@ -107,7 +110,7 @@ class Interwiki {
$db = CdbReader::open( $wgInterwikiCache );
}
/* Resolve site name */
- if( $wgInterwikiScopes>=3 && !$site ) {
+ if( $wgInterwikiScopes >= 3 && !$site ) {
$site = $db->get( '__sites:' . wfWikiID() );
if ( $site == '' ) {
$site = $wgInterwikiFallbackSite;
@@ -123,8 +126,9 @@ class Interwiki {
if ( $value == '' && $wgInterwikiScopes >= 2 ) {
$value = $db->get( "__global:{$prefix}" );
}
- if ( $value == 'undef' )
+ if ( $value == 'undef' ) {
$value = '';
+ }
return $value;
}
@@ -139,7 +143,7 @@ class Interwiki {
global $wgMemc, $wgInterwikiExpiry;
$key = wfMemcKey( 'interwiki', $prefix );
$mc = $wgMemc->get( $key );
- $iw = false;
+
if( $mc && is_array( $mc ) ) { // is_array is hack for old keys
$iw = Interwiki::loadFromArray( $mc );
if( $iw ) {
@@ -153,7 +157,12 @@ class Interwiki {
__METHOD__ ) );
$iw = Interwiki::loadFromArray( $row );
if ( $iw ) {
- $mc = array( 'iw_url' => $iw->mURL, 'iw_local' => $iw->mLocal, 'iw_trans' => $iw->mTrans );
+ $mc = array(
+ 'iw_url' => $iw->mURL,
+ 'iw_api' => $iw->mAPI,
+ 'iw_local' => $iw->mLocal,
+ 'iw_trans' => $iw->mTrans
+ );
$wgMemc->add( $key, $mc, $wgInterwikiExpiry );
return $iw;
}
@@ -173,6 +182,9 @@ class Interwiki {
$iw->mURL = $mc['iw_url'];
$iw->mLocal = $mc['iw_local'];
$iw->mTrans = $mc['iw_trans'];
+ $iw->mAPI = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
+ $iw->mWikiID = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
+
return $iw;
}
return false;
@@ -180,7 +192,7 @@ class Interwiki {
/**
* Get the URL for a particular title (or with $1 if no title given)
- *
+ *
* @param $title String: what text to put for the article name
* @return String: the URL
*/
@@ -193,6 +205,24 @@ class Interwiki {
}
/**
+ * Get the API URL for this wiki
+ *
+ * @return String: the URL
+ */
+ public function getAPI() {
+ return $this->mAPI;
+ }
+
+ /**
+ * Get the DB name for this wiki
+ *
+ * @return String: the DB name
+ */
+ public function getWikiID() {
+ return $this->mWikiID;
+ }
+
+ /**
* Is this a local link from a sister project, or is
* it something outside, like Google
*
diff --git a/includes/JSMin.php b/includes/JSMin.php
deleted file mode 100644
index 70db7022..00000000
--- a/includes/JSMin.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-/**
- * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
- *
- * This is pretty much a direct port of jsmin.c to PHP with just a few
- * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and
- * outputs to stdout, this library accepts a string as input and returns another
- * string as output.
- *
- * PHP 5 or higher is required.
- *
- * Permission is hereby granted to use this version of the library under the
- * same terms as jsmin.c, which has the following license:
- *
- * --
- * Copyright (c) 2002 Douglas Crockford (www.crockford.com)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * The Software shall be used for Good, not Evil.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- * --
- *
- * @package JSMin
- * @author Ryan Grove <ryan@wonko.com>
- * @copyright 2002 Douglas Crockford <douglas@crockford.com> (jsmin.c)
- * @copyright 2008 Ryan Grove <ryan@wonko.com> (PHP port)
- * @license http://opensource.org/licenses/mit-license.php MIT License
- * @version 1.1.1 (2008-03-02)
- * @link http://code.google.com/p/jsmin-php/
- */
-
-class JSMin {
- const ORD_LF = 10;
- const ORD_SPACE = 32;
-
- protected $a = '';
- protected $b = '';
- protected $input = '';
- protected $inputIndex = 0;
- protected $inputLength = 0;
- protected $lookAhead = null;
- protected $output = '';
-
- // -- Public Static Methods --------------------------------------------------
-
- public static function minify( $js ) {
- $jsmin = new JSMin( $js );
- return $jsmin->min();
- }
-
- // -- Public Instance Methods ------------------------------------------------
-
- public function __construct( $input ) {
- $this->input = str_replace( "\r\n", "\n", $input );
- $this->inputLength = strlen( $this->input );
- }
-
- // -- Protected Instance Methods ---------------------------------------------
-
- protected function action( $d ) {
- switch( $d ) {
- case 1:
- $this->output .= $this->a;
-
- case 2:
- $this->a = $this->b;
-
- if ( $this->a === "'" || $this->a === '"' ) {
- for ( ; ; ) {
- $this->output .= $this->a;
- $this->a = $this->get();
-
- if ( $this->a === $this->b ) {
- break;
- }
-
- if ( ord( $this->a ) <= self::ORD_LF ) {
- throw new JSMinException( 'Unterminated string literal.' );
- }
-
- if ( $this->a === '\\' ) {
- $this->output .= $this->a;
- $this->a = $this->get();
- }
- }
- }
-
- case 3:
- $this->b = $this->next();
-
- if ( $this->b === '/' && (
- $this->a === '(' || $this->a === ',' || $this->a === '=' ||
- $this->a === ':' || $this->a === '[' || $this->a === '!' ||
- $this->a === '&' || $this->a === '|' || $this->a === '?' ) ) {
-
- $this->output .= $this->a . $this->b;
-
- for ( ; ; ) {
- $this->a = $this->get();
-
- if ( $this->a === '/' ) {
- break;
- } elseif ( $this->a === '\\' ) {
- $this->output .= $this->a;
- $this->a = $this->get();
- } elseif ( ord( $this->a ) <= self::ORD_LF ) {
- throw new JSMinException( 'Unterminated regular expression ' .
- 'literal.' );
- }
-
- $this->output .= $this->a;
- }
-
- $this->b = $this->next();
- }
- }
- }
-
- protected function get() {
- $c = $this->lookAhead;
- $this->lookAhead = null;
-
- if ( $c === null ) {
- if ( $this->inputIndex < $this->inputLength ) {
- $c = substr( $this->input, $this->inputIndex, 1 );
- $this->inputIndex += 1;
- } else {
- $c = null;
- }
- }
-
- if ( $c === "\r" ) {
- return "\n";
- }
-
- if ( $c === null || $c === "\n" || ord( $c ) >= self::ORD_SPACE ) {
- return $c;
- }
-
- return ' ';
- }
-
- protected function isAlphaNum( $c ) {
- return ord( $c ) > 126 || $c === '\\' || preg_match( '/^[\w\$]$/', $c ) === 1;
- }
-
- protected function min() {
- $this->a = "\n";
- $this->action( 3 );
-
- while ( $this->a !== null ) {
- switch ( $this->a ) {
- case ' ':
- if ( $this->isAlphaNum( $this->b ) ) {
- $this->action( 1 );
- } else {
- $this->action( 2 );
- }
- break;
-
- case "\n":
- switch ( $this->b ) {
- case '{':
- case '[':
- case '(':
- case '+':
- case '-':
- $this->action( 1 );
- break;
-
- case ' ':
- $this->action( 3 );
- break;
-
- default:
- if ( $this->isAlphaNum( $this->b ) ) {
- $this->action( 1 );
- }
- else {
- $this->action( 2 );
- }
- }
- break;
-
- default:
- switch ( $this->b ) {
- case ' ':
- if ( $this->isAlphaNum( $this->a ) ) {
- $this->action( 1 );
- break;
- }
-
- $this->action( 3 );
- break;
-
- case "\n":
- switch ( $this->a ) {
- case '}':
- case ']':
- case ')':
- case '+':
- case '-':
- case '"':
- case "'":
- $this->action( 1 );
- break;
-
- default:
- if ( $this->isAlphaNum( $this->a ) ) {
- $this->action( 1 );
- }
- else {
- $this->action( 3 );
- }
- }
- break;
-
- default:
- $this->action( 1 );
- break;
- }
- }
- }
-
- return $this->output;
- }
-
- protected function next() {
- $c = $this->get();
-
- if ( $c === '/' ) {
- switch( $this->peek() ) {
- case '/':
- for ( ; ; ) {
- $c = $this->get();
-
- if ( ord( $c ) <= self::ORD_LF ) {
- return $c;
- }
- }
-
- case '*':
- $this->get();
-
- for ( ; ; ) {
- switch( $this->get() ) {
- case '*':
- if ( $this->peek() === '/' ) {
- $this->get();
- return ' ';
- }
- break;
-
- case null:
- throw new JSMinException( 'Unterminated comment.' );
- }
- }
-
- default:
- return $c;
- }
- }
-
- return $c;
- }
-
- protected function peek() {
- $this->lookAhead = $this->get();
- return $this->lookAhead;
- }
-}
-
-// -- Exceptions ---------------------------------------------------------------
-class JSMinException extends Exception {}
diff --git a/includes/Licenses.php b/includes/Licenses.php
index 12a1f938..45944c73 100644
--- a/includes/Licenses.php
+++ b/includes/Licenses.php
@@ -31,7 +31,7 @@ class Licenses extends HTMLFormField {
*/
public function __construct( $params ) {
parent::__construct( $params );
-
+
$this->msg = empty( $params['licenses'] ) ? wfMsgForContent( 'licenses' ) : $params['licenses'];
$this->selected = null;
@@ -69,8 +69,6 @@ class Licenses extends HTMLFormField {
}
protected function trimStars( $str ) {
- $i = $count = 0;
-
$numStars = strspn( $str, '*' );
return array( $numStars, ltrim( substr( $str, $numStars ), ' ' ) );
}
@@ -107,7 +105,7 @@ class Licenses extends HTMLFormField {
protected function outputOption( $text, $value, $attribs = null, $depth = 0 ) {
$attribs['value'] = $value;
if ( $value === $this->selected )
- $attribs['selected'] = 'selected';
+ $attribs['selected'] = 'selected';
$val = str_repeat( /* &nbsp */ "\xc2\xa0", $depth * 2 ) . $text;
return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
}
@@ -133,18 +131,18 @@ class Licenses extends HTMLFormField {
*/
public function getInputHTML( $value ) {
$this->selected = $value;
-
+
$this->html = $this->outputOption( wfMsg( 'nolicense' ), '',
(bool)$this->selected ? null : array( 'selected' => 'selected' ) );
$this->makeHtml( $this->getLicenses() );
-
+
$attribs = array(
'name' => $this->mName,
'id' => $this->mID
);
if ( !empty( $this->mParams['disabled'] ) )
$attibs['disabled'] = 'disabled';
-
+
return Html::rawElement( 'select', $attribs, $this->html );
}
}
@@ -168,7 +166,7 @@ class License {
*
* @param $str String: license name??
*/
- function License( $str ) {
+ function __construct( $str ) {
list( $text, $template ) = explode( '|', strrev( $str ), 2 );
$this->template = strrev( $template );
diff --git a/includes/LinkBatch.php b/includes/LinkBatch.php
index d9a9666d..e689f966 100644
--- a/includes/LinkBatch.php
+++ b/includes/LinkBatch.php
@@ -12,12 +12,26 @@ class LinkBatch {
*/
var $data = array();
+ /**
+ * For debugging which method is using this class.
+ */
+ protected $caller;
+
function __construct( $arr = array() ) {
foreach( $arr as $item ) {
$this->addObj( $item );
}
}
+ /**
+ * Use ->setCaller( __METHOD__ ) to indicate which code is using this
+ * class. Only used in debugging output.
+ * @since 1.17
+ */
+ public function setCaller( $caller ) {
+ $this->caller = $caller;
+ }
+
public function addObj( $title ) {
if ( is_object( $title ) ) {
$this->add( $title->getNamespace(), $title->getDBkey() );
@@ -95,9 +109,9 @@ class LinkBatch {
$ids = array();
$remaining = $this->data;
- while ( $row = $res->fetchObject() ) {
+ foreach ( $res as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $cache->addGoodLinkObj( $row->page_id, $title, $row->page_len, $row->page_is_redirect );
+ $cache->addGoodLinkObj( $row->page_id, $title, $row->page_len, $row->page_is_redirect, $row->page_latest );
$ids[$title->getPrefixedDBkey()] = $row->page_id;
unset( $remaining[$row->page_namespace][$row->page_title] );
}
@@ -122,19 +136,19 @@ class LinkBatch {
}
wfProfileIn( __METHOD__ );
- // Construct query
- // This is very similar to Parser::replaceLinkHolders
+ // This is similar to LinkHolderArray::replaceInternal
$dbr = wfGetDB( DB_SLAVE );
- $page = $dbr->tableName( 'page' );
- $set = $this->constructSet( 'page', $dbr );
- if ( $set === false ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- $sql = "SELECT page_id, page_namespace, page_title, page_len, page_is_redirect FROM $page WHERE $set";
+ $table = 'page';
+ $fields = array( 'page_id', 'page_namespace', 'page_title', 'page_len',
+ 'page_is_redirect', 'page_latest' );
+ $conds = $this->constructSet( 'page', $dbr );
// Do query
- $res = $dbr->query( $sql, __METHOD__ );
+ $caller = __METHOD__;
+ if ( strval( $this->caller ) !== '' ) {
+ $caller .= " (for {$this->caller})";
+ }
+ $res = $dbr->select( $table, $fields, $conds, $caller );
wfProfileOut( __METHOD__ );
return $res;
}
@@ -142,50 +156,11 @@ class LinkBatch {
/**
* Construct a WHERE clause which will match all the given titles.
*
- * @param string $prefix the appropriate table's field name prefix ('page', 'pl', etc)
- * @return string
- * @public
+ * @param $prefix String: the appropriate table's field name prefix ('page', 'pl', etc)
+ * @param $db DatabaseBase object to use
+ * @return mixed string with SQL where clause fragment, or false if no items.
*/
- public function constructSet( $prefix, &$db ) {
- $first = true;
- $firstTitle = true;
- $sql = '';
- foreach ( $this->data as $ns => $dbkeys ) {
- if ( !count( $dbkeys ) ) {
- continue;
- }
-
- if ( $first ) {
- $first = false;
- } else {
- $sql .= ' OR ';
- }
-
- if (count($dbkeys)==1) { // avoid multiple-reference syntax if simple equality can be used
- $singleKey = array_keys($dbkeys);
- $sql .= "({$prefix}_namespace=$ns AND {$prefix}_title=".
- $db->addQuotes($singleKey[0]).
- ")";
- } else {
- $sql .= "({$prefix}_namespace=$ns AND {$prefix}_title IN (";
-
- $firstTitle = true;
- foreach( $dbkeys as $dbkey => $unused ) {
- if ( $firstTitle ) {
- $firstTitle = false;
- } else {
- $sql .= ',';
- }
- $sql .= $db->addQuotes( $dbkey );
- }
- $sql .= '))';
- }
- }
- if ( $first && $firstTitle ) {
- # No titles added
- return false;
- } else {
- return $sql;
- }
+ public function constructSet( $prefix, $db ) {
+ return $db->makeWhereFrom2d( $this->data, "{$prefix}_namespace", "{$prefix}_title" );
}
}
diff --git a/includes/LinkCache.php b/includes/LinkCache.php
index 8d035763..dce34592 100644
--- a/includes/LinkCache.php
+++ b/includes/LinkCache.php
@@ -48,8 +48,8 @@ class LinkCache {
/**
* Get a field of a title object from cache.
* If this link is not good, it will return NULL.
- * @param Title $title
- * @param string $field ('length','redirect')
+ * @param $title Title
+ * @param $field String: ('length','redirect','revision')
* @return mixed
*/
public function getGoodLinkFieldObj( $title, $field ) {
@@ -67,17 +67,20 @@ class LinkCache {
/**
* Add a link for the title to the link cache
- * @param int $id
- * @param Title $title
- * @param int $len
- * @param int $redir
+ *
+ * @param $id Integer: page's ID
+ * @param $title Title object
+ * @param $len Integer: text's length
+ * @param $redir Integer: whether the page is a redirect
+ * @param $revision Integer: latest revision's ID
*/
- public function addGoodLinkObj( $id, $title, $len = -1, $redir = null ) {
+ public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, $revision = false ) {
$dbkey = $title->getPrefixedDbKey();
$this->mGoodLinks[$dbkey] = intval( $id );
$this->mGoodLinkFields[$dbkey] = array(
'length' => intval( $len ),
- 'redirect' => intval( $redir ) );
+ 'redirect' => intval( $redir ),
+ 'revision' => intval( $revision ) );
}
public function addBadLinkObj( $title ) {
@@ -109,15 +112,14 @@ class LinkCache {
/**
* Add a title to the link cache, return the page_id or zero if non-existent
+ *
* @param $title String: title to add
- * @param $len int, page size
- * @param $redir bool, is redirect?
- * @return integer
+ * @return Integer
*/
- public function addLink( $title, $len = -1, $redir = null ) {
+ public function addLink( $title ) {
$nt = Title::newFromDBkey( $title );
if( $nt ) {
- return $this->addLinkObj( $nt, $len, $redir );
+ return $this->addLinkObj( $nt );
} else {
return 0;
}
@@ -125,13 +127,12 @@ class LinkCache {
/**
* Add a title to the link cache, return the page_id or zero if non-existent
- * @param $nt Title to add.
- * @param $len int, page size
- * @param $redir bool, is redirect?
- * @return integer
+ *
+ * @param $nt Title object to add
+ * @return Integer
*/
- public function addLinkObj( &$nt, $len = -1, $redirect = null ) {
- global $wgAntiLockFlags, $wgProfiler;
+ public function addLinkObj( $nt ) {
+ global $wgAntiLockFlags;
wfProfileIn( __METHOD__ );
$key = $nt->getPrefixedDBkey();
@@ -164,7 +165,7 @@ class LinkCache {
}
$s = $db->selectRow( 'page',
- array( 'page_id', 'page_len', 'page_is_redirect' ),
+ array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
__METHOD__, $options );
# Set fields...
@@ -172,15 +173,18 @@ class LinkCache {
$id = intval( $s->page_id );
$len = intval( $s->page_len );
$redirect = intval( $s->page_is_redirect );
+ $revision = intval( $s->page_latest );
} else {
+ $id = 0;
$len = -1;
$redirect = 0;
+ $revision = 0;
}
if ( $id == 0 ) {
$this->addBadLinkObj( $nt );
} else {
- $this->addGoodLinkObj( $id, $nt, $len, $redirect );
+ $this->addGoodLinkObj( $id, $nt, $len, $redirect, $revision );
}
wfProfileOut( __METHOD__ );
return $id;
diff --git a/includes/Linker.php b/includes/Linker.php
index fe193011..e2193f97 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -21,7 +21,7 @@ class Linker {
* Get the appropriate HTML attributes to add to the "a" element of an ex-
* ternal link, as created by [wikisyntax].
*
- * @param string $class The contents of the class attribute; if an empty
+ * @param $class String: the contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
*/
function getExternalLinkAttributes( $class = 'external' ) {
@@ -32,10 +32,10 @@ class Linker {
* Get the appropriate HTML attributes to add to the "a" element of an in-
* terwiki link.
*
- * @param string $title The title text for the link, URL-encoded (???) but
+ * @param $title String: the title text for the link, URL-encoded (???) but
* not HTML-escaped
- * @param string $unused Unused
- * @param string $class The contents of the class attribute; if an empty
+ * @param $unused String: unused
+ * @param $class String: the contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
*/
function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
@@ -54,12 +54,12 @@ class Linker {
* Get the appropriate HTML attributes to add to the "a" element of an in-
* ternal link.
*
- * @param string $title The title text for the link, URL-encoded (???) but
+ * @param $title String: the title text for the link, URL-encoded (???) but
* not HTML-escaped
- * @param string $unused Unused
- * @param string $class The contents of the class attribute, default none
+ * @param $unused String: unused
+ * @param $class String: the contents of the class attribute, default none
*/
- function getInternalLinkAttributes( $title, $unused = null, $class='' ) {
+ function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
$title = urldecode( $title );
$title = str_replace( '_', ' ', $title );
return $this->getLinkAttributesInternal( $title, $class );
@@ -69,14 +69,14 @@ class Linker {
* Get the appropriate HTML attributes to add to the "a" element of an in-
* ternal link, given the Title object for the page we want to link to.
*
- * @param Title $nt The Title object
- * @param string $unused Unused
- * @param string $class The contents of the class attribute, default none
- * @param mixed $title Optional (unescaped) string to use in the title
+ * @param $nt The Title object
+ * @param $unused String: unused
+ * @param $class String: the contents of the class attribute, default none
+ * @param $title Mixed: optional (unescaped) string to use in the title
* attribute; if false, default to the name of the page we're linking to
*/
function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
- if( $title === false ) {
+ if ( $title === false ) {
$title = $nt->getPrefixedText();
}
return $this->getLinkAttributesInternal( $title, $class );
@@ -92,7 +92,7 @@ class Linker {
if ( $class != '' ) {
$r .= " class=\"$class\"";
}
- if ( $title != '') {
+ if ( $title != '' ) {
$r .= " title=\"$title\"";
}
return $r;
@@ -101,9 +101,9 @@ class Linker {
/**
* Return the CSS colour of a known link
*
- * @param Title $t
- * @param integer $threshold user defined threshold
- * @return string CSS class
+ * @param $t Title object
+ * @param $threshold Integer: user defined threshold
+ * @return String: CSS class
*/
function getLinkColour( $t, $threshold ) {
$colour = '';
@@ -112,7 +112,7 @@ class Linker {
$colour = 'mw-redirect';
} elseif ( $threshold > 0 &&
$t->exists() && $t->getLength() < $threshold &&
- MWNamespace::isContent( $t->getNamespace() ) ) {
+ $t->isContentPage() ) {
# Page is a stub
$colour = 'stub';
}
@@ -158,13 +158,14 @@ class Linker {
*/
public function link( $target, $text = null, $customAttribs = array(), $query = array(), $options = array() ) {
wfProfileIn( __METHOD__ );
- if( !$target instanceof Title ) {
+ if ( !$target instanceof Title ) {
+ wfProfileOut( __METHOD__ );
return "<!-- ERROR -->$text";
}
$options = (array)$options;
$ret = null;
- if( !wfRunHooks( 'LinkBegin', array( $this, $target, &$text,
+ if ( !wfRunHooks( 'LinkBegin', array( $this, $target, &$text,
&$customAttribs, &$query, &$options, &$ret ) ) ) {
wfProfileOut( __METHOD__ );
return $ret;
@@ -175,24 +176,24 @@ class Linker {
# If we don't know whether the page exists, let's find out.
wfProfileIn( __METHOD__ . '-checkPageExistence' );
- if( !in_array( 'known', $options ) and !in_array( 'broken', $options ) ) {
- if( $target->isKnown() ) {
- $options []= 'known';
+ if ( !in_array( 'known', $options ) and !in_array( 'broken', $options ) ) {
+ if ( $target->isKnown() ) {
+ $options[] = 'known';
} else {
- $options []= 'broken';
+ $options[] = 'broken';
}
}
wfProfileOut( __METHOD__ . '-checkPageExistence' );
$oldquery = array();
- if( in_array( "forcearticlepath", $options ) && $query ){
+ if ( in_array( "forcearticlepath", $options ) && $query ) {
$oldquery = $query;
$query = array();
}
# Note: we want the href attribute first, for prettiness.
$attribs = array( 'href' => $this->linkUrl( $target, $query, $options ) );
- if( in_array( 'forcearticlepath', $options ) && $oldquery ){
+ if ( in_array( 'forcearticlepath', $options ) && $oldquery ) {
$attribs['href'] = wfAppendQuery( $attribs['href'], wfArrayToCgi( $oldquery ) );
}
@@ -200,12 +201,12 @@ class Linker {
$attribs,
$this->linkAttribs( $target, $customAttribs, $options )
);
- if( is_null( $text ) ) {
+ if ( is_null( $text ) ) {
$text = $this->linkText( $target );
}
$ret = null;
- if( wfRunHooks( 'LinkEnd', array( $this, $target, $options, &$text, &$attribs, &$ret ) ) ) {
+ if ( wfRunHooks( 'LinkEnd', array( $this, $target, $options, &$text, &$attribs, &$ret ) ) ) {
$ret = Html::rawElement( 'a', $attribs, $text );
}
@@ -216,7 +217,7 @@ class Linker {
/**
* Identical to link(), except $options defaults to 'known'.
*/
- public function linkKnown( $target, $text = null, $customAttribs = array(), $query = array(), $options = array('known','noclasses') ) {
+ public function linkKnown( $target, $text = null, $customAttribs = array(), $query = array(), $options = array( 'known', 'noclasses' ) ) {
return $this->link( $target, $text, $customAttribs, $query, $options );
}
@@ -227,7 +228,7 @@ class Linker {
wfProfileIn( __METHOD__ );
# We don't want to include fragments for broken links, because they
# generally make no sense.
- if( in_array( 'broken', $options ) and $target->mFragment !== '' ) {
+ if ( in_array( 'broken', $options ) and $target->mFragment !== '' ) {
$target = clone $target;
$target->mFragment = '';
}
@@ -235,7 +236,7 @@ class Linker {
# If it's a broken link, add the appropriate query pieces, unless
# there's already an action specified, or unless 'edit' makes no sense
# (i.e., for a nonexistent special page).
- if( in_array( 'broken', $options ) and empty( $query['action'] )
+ if ( in_array( 'broken', $options ) and empty( $query['action'] )
and $target->getNamespace() != NS_SPECIAL ) {
$query['action'] = 'edit';
$query['redlink'] = '1';
@@ -253,40 +254,36 @@ class Linker {
global $wgUser;
$defaults = array();
- if( !in_array( 'noclasses', $options ) ) {
+ if ( !in_array( 'noclasses', $options ) ) {
wfProfileIn( __METHOD__ . '-getClasses' );
# Now build the classes.
$classes = array();
- if( in_array( 'broken', $options ) ) {
+ if ( in_array( 'broken', $options ) ) {
$classes[] = 'new';
}
- if( $target->isExternal() ) {
+ if ( $target->isExternal() ) {
$classes[] = 'extiw';
}
- # Note that redirects never count as stubs here.
- if ( !in_array( 'broken', $options ) && $target->isRedirect() ) {
- $classes[] = 'mw-redirect';
- } elseif( $target->isContentPage() ) {
- # Check for stub.
- $threshold = $wgUser->getOption( 'stubthreshold' );
- if( $threshold > 0 and $target->exists() and $target->getLength() < $threshold ) {
- $classes[] = 'stub';
+ if ( !in_array( 'broken', $options ) ) { # Avoid useless calls to LinkCache (see r50387)
+ $colour = $this->getLinkColour( $target, $wgUser->getStubThreshold() );
+ if ( $colour !== '' ) {
+ $classes[] = $colour; # mw-redirect or stub
}
}
- if( $classes != array() ) {
+ if ( $classes != array() ) {
$defaults['class'] = implode( ' ', $classes );
}
wfProfileOut( __METHOD__ . '-getClasses' );
}
# Get a default title attribute.
- if( $target->getPrefixedText() == '' ) {
+ if ( $target->getPrefixedText() == '' ) {
# A link like [[#Foo]]. This used to mean an empty title
# attribute, but that's silly. Just don't output a title.
- } elseif( in_array( 'known', $options ) ) {
+ } elseif ( in_array( 'known', $options ) ) {
$defaults['title'] = $target->getPrefixedText();
} else {
$defaults['title'] = wfMsg( 'red-link-title', $target->getPrefixedText() );
@@ -296,10 +293,10 @@ class Linker {
# over that, deleting all "false" attributes.
$ret = array();
$merged = Sanitizer::mergeAttributes( $defaults, $attribs );
- foreach( $merged as $key => $val ) {
+ foreach ( $merged as $key => $val ) {
# A false value suppresses the attribute, and we don't want the
# href attribute to be overridden.
- if( $key != 'href' and $val !== false ) {
+ if ( $key != 'href' and $val !== false ) {
$ret[$key] = $val;
}
}
@@ -312,13 +309,13 @@ class Linker {
*/
private function linkText( $target ) {
# We might be passed a non-Title by make*LinkObj(). Fail gracefully.
- if( !$target instanceof Title ) {
+ if ( !$target instanceof Title ) {
return '';
}
# If the target is just a fragment, with no title, we return the frag-
# ment text. Otherwise, we return the title text itself.
- if( $target->getPrefixedText() === '' and $target->getFragment() !== '' ) {
+ if ( $target->getPrefixedText() === '' and $target->getFragment() !== '' ) {
return htmlspecialchars( $target->getFragment() );
}
return htmlspecialchars( $target->getPrefixedText() );
@@ -328,17 +325,20 @@ class Linker {
* Generate either a normal exists-style link or a stub link, depending
* on the given page size.
*
- * @param $size Integer
- * @param $nt Title object.
- * @param $text String
- * @param $query String
- * @param $trail String
- * @param $prefix String
- * @return string HTML of link
+ * @param $size Integer
+ * @param $nt Title object.
+ * @param $text String
+ * @param $query String
+ * @param $trail String
+ * @param $prefix String
+ * @return string HTML of link
+ * @deprecated
*/
function makeSizeLinkObj( $size, $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
global $wgUser;
- $threshold = intval( $wgUser->getOption( 'stubthreshold' ) );
+ wfDeprecated( __METHOD__ );
+
+ $threshold = $wgUser->getStubThreshold();
$colour = ( $size < $threshold ) ? 'stub' : '';
// FIXME: replace deprecated makeColouredLinkObj by link()
return $this->makeColouredLinkObj( $nt, $colour, $text, $query, $trail, $prefix );
@@ -360,7 +360,9 @@ class Linker {
function normaliseSpecialPage( Title $title ) {
if ( $title->getNamespace() == NS_SPECIAL ) {
list( $name, $subpage ) = SpecialPage::resolveAliasWithSubpage( $title->getDBkey() );
- if ( !$name ) return $title;
+ if ( !$name ) {
+ return $title;
+ }
$ret = SpecialPage::getTitleFor( $name, $subpage );
$ret->mFragment = $title->getFragment();
return $ret;
@@ -392,9 +394,9 @@ class Linker {
$alt = $this->fnamePart( $url );
}
$img = '';
- $success = wfRunHooks('LinkerMakeExternalImage', array( &$url, &$alt, &$img ) );
- if(!$success) {
- wfDebug("Hook LinkerMakeExternalImage changed the output of external image with url {$url} and alt text {$alt} to {$img}\n", true);
+ $success = wfRunHooks( 'LinkerMakeExternalImage', array( &$url, &$alt, &$img ) );
+ if ( !$success ) {
+ wfDebug( "Hook LinkerMakeExternalImage changed the output of external image with url {$url} and alt text {$alt} to {$img}\n", true );
return $img;
}
return Html::element( 'img',
@@ -407,10 +409,9 @@ class Linker {
* Given parameters derived from [[Image:Foo|options...]], generate the
* HTML that that syntax inserts in the page.
*
- * @param Title $title Title object
- * @param File $file File object, or false if it doesn't exist
- *
- * @param array $frameParams Associative array of parameters external to the media handler.
+ * @param $title Title object
+ * @param $file File object, or false if it doesn't exist
+ * @param $frameParams Array: associative array of parameters external to the media handler.
* Boolean parameters are indicated by presence or absence, the value is arbitrary and
* will often be false.
* thumbnail If present, downscale and frame
@@ -427,24 +428,25 @@ class Linker {
* caption HTML for image caption.
* link-url URL to link to
* link-title Title object to link to
+ * link-target Value for the target attribue, only with link-url
* no-link Boolean, suppress description link
*
- * @param array $handlerParams Associative array of media handler parameters, to be passed
+ * @param $handlerParams Array: associative array of media handler parameters, to be passed
* to transform(). Typical keys are "width" and "page".
- * @param string $time, timestamp of the file, set as false for current
- * @param string $query, query params for desc url
- * @return string HTML for an image, with links, wrappers, etc.
+ * @param $time String: timestamp of the file, set as false for current
+ * @param $query String: query params for desc url
+ * @param $widthOption: Used by the parser to remember the user preference thumbnailsize
+ * @return String: HTML for an image, with links, wrappers, etc.
*/
- function makeImageLink2( Title $title, $file, $frameParams = array(), $handlerParams = array(), $time = false, $query = "" ) {
+ function makeImageLink2( Title $title, $file, $frameParams = array(), $handlerParams = array(), $time = false, $query = "", $widthOption = null ) {
$res = null;
- if( !wfRunHooks( 'ImageBeforeProduceHTML', array( &$this, &$title,
+ if ( !wfRunHooks( 'ImageBeforeProduceHTML', array( &$this, &$title,
&$file, &$frameParams, &$handlerParams, &$time, &$res ) ) ) {
return $res;
}
- global $wgContLang, $wgUser, $wgThumbLimits, $wgThumbUpright;
if ( $file && !$file->allowInlineDisplay() ) {
- wfDebug( __METHOD__.': '.$title->getPrefixedDBkey()." does not allow inline display\n" );
+ wfDebug( __METHOD__ . ': ' . $title->getPrefixedDBkey() . " does not allow inline display\n" );
return $this->link( $title );
}
@@ -468,29 +470,32 @@ class Linker {
if ( $file && !isset( $hp['width'] ) ) {
$hp['width'] = $file->getWidth( $page );
- if( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
- $wopt = $wgUser->getOption( 'thumbsize' );
-
- if( !isset( $wgThumbLimits[$wopt] ) ) {
- $wopt = User::getDefaultOption( 'thumbsize' );
+ if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+ global $wgThumbLimits, $wgThumbUpright;
+ if ( !isset( $widthOption ) || !isset( $wgThumbLimits[$widthOption] ) ) {
+ $widthOption = User::getDefaultOption( 'thumbsize' );
}
// Reduce width for upright images when parameter 'upright' is used
if ( isset( $fp['upright'] ) && $fp['upright'] == 0 ) {
$fp['upright'] = $wgThumbUpright;
}
- // Use width which is smaller: real image width or user preference width
// For caching health: If width scaled down due to upright parameter, round to full __0 pixel to avoid the creation of a lot of odd thumbs
$prefWidth = isset( $fp['upright'] ) ?
- round( $wgThumbLimits[$wopt] * $fp['upright'], -1 ) :
- $wgThumbLimits[$wopt];
- if ( $hp['width'] <= 0 || $prefWidth < $hp['width'] ) {
+ round( $wgThumbLimits[$widthOption] * $fp['upright'], -1 ) :
+ $wgThumbLimits[$widthOption];
+
+ // Use width which is smaller: real image width or user preference width
+ // Unless image is scalable vector.
+ if ( !isset( $hp['height'] ) && ( $hp['width'] <= 0 ||
+ $prefWidth < $hp['width'] || $file->isVectorized() ) ) {
$hp['width'] = $prefWidth;
}
}
}
if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) ) {
+ global $wgContLang;
# Create a thumbnail. Alignment depends on language
# writing direction, # right aligned for left-to-right-
# languages ("Western languages"), left-aligned
@@ -501,7 +506,7 @@ class Linker {
if ( $fp['align'] == '' ) {
$fp['align'] = $wgContLang->alignEnd();
}
- return $prefix.$this->makeThumbLink2( $title, $file, $fp, $hp, $time, $query ).$postfix;
+ return $prefix . $this->makeThumbLink2( $title, $file, $fp, $hp, $time, $query ) . $postfix;
}
if ( $file && isset( $fp['frameless'] ) ) {
@@ -513,7 +518,7 @@ class Linker {
}
}
- if ( $file && $hp['width'] ) {
+ if ( $file && isset( $hp['width'] ) ) {
# Create a resized image, without the additional thumbnail features
$thumb = $file->transform( $hp );
} else {
@@ -521,38 +526,59 @@ class Linker {
}
if ( !$thumb ) {
- $s = $this->makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time==true );
+ $s = $this->makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
} else {
$params = array(
'alt' => $fp['alt'],
'title' => $fp['title'],
'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false ,
'img-class' => isset( $fp['border'] ) ? 'thumbborder' : false );
- if ( !empty( $fp['link-url'] ) ) {
- $params['custom-url-link'] = $fp['link-url'];
- } elseif ( !empty( $fp['link-title'] ) ) {
- $params['custom-title-link'] = $fp['link-title'];
- } elseif ( !empty( $fp['no-link'] ) ) {
- // No link
- } else {
- $params['desc-link'] = true;
- $params['desc-query'] = $query;
- }
+ $params = $this->getImageLinkMTOParams( $fp, $query ) + $params;
$s = $thumb->toHtml( $params );
}
if ( $fp['align'] != '' ) {
$s = "<div class=\"float{$fp['align']}\">{$s}</div>";
}
- return str_replace("\n", ' ',$prefix.$s.$postfix);
+ return str_replace( "\n", ' ', $prefix . $s . $postfix );
}
/**
- * Make HTML for a thumbnail including image, border and caption
- * @param Title $title
- * @param File $file File object or false if it doesn't exist
+ * Get the link parameters for MediaTransformOutput::toHtml() from given
+ * frame parameters supplied by the Parser.
+ * @param $frameParams The frame parameters
+ * @param $query An optional query string to add to description page links
*/
- function makeThumbLinkObj( Title $title, $file, $label = '', $alt, $align = 'right', $params = array(), $framed=false , $manualthumb = "" ) {
+ function getImageLinkMTOParams( $frameParams, $query = '' ) {
+ $mtoParams = array();
+ if ( isset( $frameParams['link-url'] ) && $frameParams['link-url'] !== '' ) {
+ $mtoParams['custom-url-link'] = $frameParams['link-url'];
+ if ( isset( $frameParams['link-target'] ) ) {
+ $mtoParams['custom-target-link'] = $frameParams['link-target'];
+ }
+ } elseif ( isset( $frameParams['link-title'] ) && $frameParams['link-title'] !== '' ) {
+ $mtoParams['custom-title-link'] = $this->normaliseSpecialPage( $frameParams['link-title'] );
+ } elseif ( !empty( $frameParams['no-link'] ) ) {
+ // No link
+ } else {
+ $mtoParams['desc-link'] = true;
+ $mtoParams['desc-query'] = $query;
+ }
+ return $mtoParams;
+ }
+
+ /**
+ * Make HTML for a thumbnail including image, border and caption
+ * @param $title Title object
+ * @param $file File object or false if it doesn't exist
+ * @param $label String
+ * @param $alt String
+ * @param $align String
+ * @param $params Array
+ * @param $framed Boolean
+ * @param $manualthumb String
+ */
+ function makeThumbLinkObj( Title $title, $file, $label = '', $alt, $align = 'right', $params = array(), $framed = false , $manualthumb = "" ) {
$frameParams = array(
'alt' => $alt,
'caption' => $label,
@@ -564,7 +590,7 @@ class Linker {
}
function makeThumbLink2( Title $title, $file, $frameParams = array(), $handlerParams = array(), $time = false, $query = "" ) {
- global $wgStylePath, $wgContLang;
+ global $wgStylePath;
$exists = $file && $file->exists();
# Shortcuts
@@ -589,17 +615,17 @@ class Linker {
if ( isset( $fp['manualthumb'] ) ) {
# Use manually specified thumbnail
$manual_title = Title::makeTitleSafe( NS_FILE, $fp['manualthumb'] );
- if( $manual_title ) {
+ if ( $manual_title ) {
$manual_img = wfFindFile( $manual_title );
if ( $manual_img ) {
- $thumb = $manual_img->getUnscaledThumb();
+ $thumb = $manual_img->getUnscaledThumb( $hp );
} else {
$exists = false;
}
}
} elseif ( isset( $fp['framed'] ) ) {
// Use image dimensions, don't scale
- $thumb = $file->getUnscaledThumb( $page );
+ $thumb = $file->getUnscaledThumb( $hp );
} else {
# Do not present an image bigger than the source, for bitmap-style images
# This is a hack to maintain compatibility with arbitrary pre-1.10 behaviour
@@ -621,104 +647,102 @@ class Linker {
# So we don't need to pass it here in $query. However, the URL for the
# zoom icon still needs it, so we make a unique query for it. See bug 14771
$url = $title->getLocalURL( $query );
- if( $page ) {
+ if ( $page ) {
$url = wfAppendQuery( $url, 'page=' . urlencode( $page ) );
}
- $more = htmlspecialchars( wfMsg( 'thumbnail-more' ) );
-
$s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
- if( !$exists ) {
- $s .= $this->makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time==true );
- $zoomicon = '';
+ if ( !$exists ) {
+ $s .= $this->makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
+ $zoomIcon = '';
} elseif ( !$thumb ) {
$s .= htmlspecialchars( wfMsg( 'thumbnail_error', '' ) );
- $zoomicon = '';
+ $zoomIcon = '';
} else {
- $s .= $thumb->toHtml( array(
+ $params = array(
'alt' => $fp['alt'],
'title' => $fp['title'],
- 'img-class' => 'thumbimage',
- 'desc-link' => true,
- 'desc-query' => $query ) );
+ 'img-class' => 'thumbimage' );
+ $params = $this->getImageLinkMTOParams( $fp, $query ) + $params;
+ $s .= $thumb->toHtml( $params );
if ( isset( $fp['framed'] ) ) {
- $zoomicon="";
+ $zoomIcon = "";
} else {
- $zoomicon = '<div class="magnify">'.
- '<a href="'.$url.'" class="internal" title="'.$more.'">'.
- '<img src="'.$wgStylePath.'/common/images/magnify-clip.png" ' .
- 'width="15" height="11" alt="" /></a></div>';
+ $zoomIcon = '<div class="magnify">' .
+ '<a href="' . htmlspecialchars( $url ) . '" class="internal" ' .
+ 'title="' . htmlspecialchars( wfMsg( 'thumbnail-more' ) ) . '">' .
+ '<img src="' . htmlspecialchars( $wgStylePath ) . '/common/images/magnify-clip.png" ' .
+ 'width="15" height="11" alt="" /></a></div>';
}
}
- $s .= ' <div class="thumbcaption">'.$zoomicon.$fp['caption']."</div></div></div>";
- return str_replace("\n", ' ', $s);
+ $s .= ' <div class="thumbcaption">' . $zoomIcon . $fp['caption'] . "</div></div></div>";
+ return str_replace( "\n", ' ', $s );
}
/**
* Make a "broken" link to an image
*
- * @param Title $title Image title
- * @param string $text Link label
- * @param string $query Query string
- * @param string $trail Link trail
- * @param string $prefix Link prefix
- * @param bool $time, a file of a certain timestamp was requested
- * @return string
+ * @param $title Title object
+ * @param $text String: link label
+ * @param $query String: query string
+ * @param $trail String: link trail
+ * @param $prefix String: link prefix
+ * @param $time Boolean: a file of a certain timestamp was requested
+ * @return String
*/
public function makeBrokenImageLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '', $time = false ) {
- global $wgEnableUploads, $wgUploadNavigationUrl;
- if( $title instanceof Title ) {
+ global $wgEnableUploads, $wgUploadMissingFileUrl;
+ if ( $title instanceof Title ) {
wfProfileIn( __METHOD__ );
$currentExists = $time ? ( wfFindFile( $title ) != false ) : false;
- if( ( $wgUploadNavigationUrl || $wgEnableUploads ) && !$currentExists ) {
- if( $text == '' )
- $text = htmlspecialchars( $title->getPrefixedText() );
+ list( $inside, $trail ) = self::splitTrail( $trail );
+ if ( $text == '' )
+ $text = htmlspecialchars( $title->getPrefixedText() );
+
+ if ( ( $wgUploadMissingFileUrl || $wgEnableUploads ) && !$currentExists ) {
$redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
- if( $redir ) {
+
+ if ( $redir ) {
wfProfileOut( __METHOD__ );
- return $this->makeKnownLinkObj( $title, $text, $query, $trail, $prefix );
+ return $this->linkKnown( $title, "$prefix$text$inside", array(), $query ) . $trail;
}
-
- $href = $this->getUploadUrl( $title, $query );
-
- list( $inside, $trail ) = self::splitTrail( $trail );
+ $href = $this->getUploadUrl( $title, $query );
wfProfileOut( __METHOD__ );
- return Html::element( 'a', array(
- 'href' => $href,
- 'class' => 'new',
- 'title' => $title->getPrefixedText()
- ), $prefix . $text . $inside ) . $trail;
+ return '<a href="' . htmlspecialchars( $href ) . '" class="new" title="' .
+ htmlspecialchars( $title->getPrefixedText(), ENT_QUOTES ) . '">' .
+ htmlspecialchars( $prefix . $text . $inside, ENT_NOQUOTES ) . '</a>' . $trail;
} else {
wfProfileOut( __METHOD__ );
- return $this->makeKnownLinkObj( $title, $text, $query, $trail, $prefix );
+ return $this->linkKnown( $title, "$prefix$text$inside", array(), $query ) . $trail;
}
} else {
+ wfProfileOut( __METHOD__ );
return "<!-- ERROR -->{$prefix}{$text}{$trail}";
}
}
-
+
/**
* Get the URL to upload a certain file
- *
- * @param $destFile Title Title of the file to upload
- * @param $query string Urlencoded query string to prepend
- * @return string Urlencoded URL
+ *
+ * @param $destFile Title object of the file to upload
+ * @param $query String: urlencoded query string to prepend
+ * @return String: urlencoded URL
*/
protected function getUploadUrl( $destFile, $query = '' ) {
- global $wgUploadNavigationUrl;
+ global $wgUploadMissingFileUrl;
$q = 'wpDestFile=' . $destFile->getPartialUrl();
- if( $query != '' )
+ if ( $query != '' )
$q .= '&' . $query;
- if( $wgUploadNavigationUrl ) {
- return wfAppendQuery( $wgUploadNavigationUrl, $q );
+ if ( $wgUploadMissingFileUrl ) {
+ return wfAppendQuery( $wgUploadMissingFileUrl, $q );
} else {
$upload = SpecialPage::getTitleFor( 'Upload' );
return $upload->getLocalUrl( $q );
- }
+ }
}
/**
@@ -727,26 +751,25 @@ class Linker {
* @param $title Title object.
* @param $text String: pre-sanitized HTML
* @param $time string: time image was created
- * @return string HTML
+ * @return String: HTML
*
- * @public
* @todo Handle invalid or missing images better.
*/
- function makeMediaLinkObj( $title, $text = '', $time = false ) {
- if( is_null( $title ) ) {
- ### HOTFIX. Instead of breaking, return empty string.
+ public function makeMediaLinkObj( $title, $text = '', $time = false ) {
+ if ( is_null( $title ) ) {
+ # # # HOTFIX. Instead of breaking, return empty string.
return $text;
} else {
$img = wfFindFile( $title, array( 'time' => $time ) );
- if( $img ) {
+ if ( $img ) {
$url = $img->getURL();
$class = 'internal';
} else {
$url = $this->getUploadUrl( $title );
$class = 'new';
}
- $alt = htmlspecialchars( $title->getText() );
- if( $text == '' ) {
+ $alt = htmlspecialchars( $title->getText(), ENT_QUOTES );
+ if ( $text == '' ) {
$text = $alt;
}
$u = htmlspecialchars( $url );
@@ -760,21 +783,18 @@ class Linker {
* Usage example: $skin->specialLink( 'recentchanges' )
*/
function specialLink( $name, $key = '' ) {
- global $wgContLang;
-
if ( $key == '' ) { $key = strtolower( $name ); }
- $pn = $wgContLang->ucfirst( $name );
- return $this->makeKnownLink( $wgContLang->specialPage( $pn ),
- wfMsg( $key ) );
+
+ return $this->linkKnown( SpecialPage::getTitleFor( $name ) , wfMsg( $key ) );
}
/**
* Make an external link
- * @param String $url URL to link to
- * @param String $text text of link
- * @param boolean $escape Do we escape the link text?
- * @param String $linktype Type of external link. Gets added to the classes
- * @param array $attribs Array of extra attributes to <a>
+ * @param $url String: URL to link to
+ * @param $text String: text of link
+ * @param $escape Boolean: do we escape the link text?
+ * @param $linktype String: type of external link. Gets added to the classes
+ * @param $attribs Array of extra attributes to <a>
*
* @todo FIXME: This is a really crappy implementation. $linktype and
* 'external' are mashed into the class attrib for the link (which is made
@@ -785,35 +805,39 @@ class Linker {
* hook play with them, *then* expand it all at once.
*/
function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
- if ( isset( $attribs[ 'class' ] ) ) $class = $attribs[ 'class' ]; # yet another hack :(
- else $class = 'external ' . $linktype;
+ if ( isset( $attribs['class'] ) ) {
+ # yet another hack :(
+ $class = $attribs['class'];
+ } else {
+ $class = "external $linktype";
+ }
$attribsText = $this->getExternalLinkAttributes( $class );
$url = htmlspecialchars( $url );
- if( $escape ) {
+ if ( $escape ) {
$text = htmlspecialchars( $text );
}
$link = '';
- $success = wfRunHooks('LinkerMakeExternalLink', array( &$url, &$text, &$link, &$attribs, $linktype ) );
- if(!$success) {
- wfDebug("Hook LinkerMakeExternalLink changed the output of link with url {$url} and text {$text} to {$link}\n", true);
+ $success = wfRunHooks( 'LinkerMakeExternalLink', array( &$url, &$text, &$link, &$attribs, $linktype ) );
+ if ( !$success ) {
+ wfDebug( "Hook LinkerMakeExternalLink changed the output of link with url {$url} and text {$text} to {$link}\n", true );
return $link;
}
if ( $attribs ) {
$attribsText .= Html::expandAttributes( $attribs );
}
- return '<a href="'.$url.'"'.$attribsText.'>'.$text.'</a>';
+ return '<a href="' . $url . '"' . $attribsText . '>' . $text . '</a>';
}
/**
* Make user link (or user contributions for unregistered users)
* @param $userId Integer: user id in database.
* @param $userText String: user name in database
- * @return string HTML fragment
+ * @return String: HTML fragment
* @private
*/
function userLink( $userId, $userText ) {
- if( $userId == 0 ) {
+ if ( $userId == 0 ) {
$page = SpecialPage::getTitleFor( 'Contributions', $userText );
} else {
$page = Title::makeTitle( NS_USER, $userText );
@@ -824,28 +848,29 @@ class Linker {
/**
* Generate standard user tool links (talk, contributions, block link, etc.)
*
- * @param int $userId User identifier
- * @param string $userText User name or IP address
- * @param bool $redContribsWhenNoEdits Should the contributions link be red if the user has no edits?
- * @param int $flags Customisation flags (e.g. self::TOOL_LINKS_NOBLOCK)
- * @param int $edits, user edit count (optional, for performance)
- * @return string
- */
- public function userToolLinks( $userId, $userText, $redContribsWhenNoEdits = false, $flags = 0, $edits=null ) {
+ * @param $userId Integer: user identifier
+ * @param $userText String: user name or IP address
+ * @param $redContribsWhenNoEdits Boolean: should the contributions link be
+ * red if the user has no edits?
+ * @param $flags Integer: customisation flags (e.g. self::TOOL_LINKS_NOBLOCK)
+ * @param $edits Integer: user edit count (optional, for performance)
+ * @return String: HTML fragment
+ */
+ public function userToolLinks( $userId, $userText, $redContribsWhenNoEdits = false, $flags = 0, $edits = null ) {
global $wgUser, $wgDisableAnonTalk, $wgSysopUserBans, $wgLang;
$talkable = !( $wgDisableAnonTalk && 0 == $userId );
$blockable = ( $wgSysopUserBans || 0 == $userId ) && !$flags & self::TOOL_LINKS_NOBLOCK;
$items = array();
- if( $talkable ) {
+ if ( $talkable ) {
$items[] = $this->userTalkLink( $userId, $userText );
}
- if( $userId ) {
+ if ( $userId ) {
// check if the user has an edit
$attribs = array();
- if( $redContribsWhenNoEdits ) {
- $count = !is_null($edits) ? $edits : User::edits( $userId );
- if( $count == 0 ) {
+ if ( $redContribsWhenNoEdits ) {
+ $count = !is_null( $edits ) ? $edits : User::edits( $userId );
+ if ( $count == 0 ) {
$attribs['class'] = 'new';
}
}
@@ -853,11 +878,11 @@ class Linker {
$items[] = $this->link( $contribsPage, wfMsgHtml( 'contribslink' ), $attribs );
}
- if( $blockable && $wgUser->isAllowed( 'block' ) ) {
+ if ( $blockable && $wgUser->isAllowed( 'block' ) ) {
$items[] = $this->blockLink( $userId, $userText );
}
- if( $items ) {
+ if ( $items ) {
return ' <span class="mw-usertoollinks">(' . $wgLang->pipeList( $items ) . ')</span>';
} else {
return '';
@@ -866,11 +891,11 @@ class Linker {
/**
* Alias for userToolLinks( $userId, $userText, true );
- * @param int $userId User identifier
- * @param string $userText User name or IP address
- * @param int $edits, user edit count (optional, for performance)
+ * @param $userId Integer: user identifier
+ * @param $userText String: user name or IP address
+ * @param $edits Integer: user edit count (optional, for performance)
*/
- public function userToolLinksRedContribs( $userId, $userText, $edits=null ) {
+ public function userToolLinksRedContribs( $userId, $userText, $edits = null ) {
return $this->userToolLinks( $userId, $userText, true, 0, $edits );
}
@@ -878,7 +903,7 @@ class Linker {
/**
* @param $userId Integer: user id in database.
* @param $userText String: user name in database.
- * @return string HTML fragment with user talk link
+ * @return String: HTML fragment with user talk link
* @private
*/
function userTalkLink( $userId, $userText ) {
@@ -890,7 +915,7 @@ class Linker {
/**
* @param $userId Integer: userid
* @param $userText String: user name in database.
- * @return string HTML fragment with block link
+ * @return String: HTML fragment with block link
* @private
*/
function blockLink( $userId, $userText ) {
@@ -902,19 +927,19 @@ class Linker {
/**
* Generate a user link if the current user is allowed to view it
* @param $rev Revision object.
- * @param $isPublic, bool, show only if all users can see it
- * @return string HTML
+ * @param $isPublic Boolean: show only if all users can see it
+ * @return String: HTML fragment
*/
function revUserLink( $rev, $isPublic = false ) {
- if( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
+ if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
$link = wfMsgHtml( 'rev-deleted-user' );
- } else if( $rev->userCan( Revision::DELETED_USER ) ) {
+ } else if ( $rev->userCan( Revision::DELETED_USER ) ) {
$link = $this->userLink( $rev->getUser( Revision::FOR_THIS_USER ),
$rev->getUserText( Revision::FOR_THIS_USER ) );
} else {
$link = wfMsgHtml( 'rev-deleted-user' );
}
- if( $rev->isDeleted( Revision::DELETED_USER ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
return '<span class="history-deleted">' . $link . '</span>';
}
return $link;
@@ -923,13 +948,13 @@ class Linker {
/**
* Generate a user tool link cluster if the current user is allowed to view it
* @param $rev Revision object.
- * @param $isPublic, bool, show only if all users can see it
+ * @param $isPublic Boolean: show only if all users can see it
* @return string HTML
*/
function revUserTools( $rev, $isPublic = false ) {
- if( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
+ if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
$link = wfMsgHtml( 'rev-deleted-user' );
- } else if( $rev->userCan( Revision::DELETED_USER ) ) {
+ } else if ( $rev->userCan( Revision::DELETED_USER ) ) {
$userId = $rev->getUser( Revision::FOR_THIS_USER );
$userText = $rev->getUserText( Revision::FOR_THIS_USER );
$link = $this->userLink( $userId, $userText ) .
@@ -937,7 +962,7 @@ class Linker {
} else {
$link = wfMsgHtml( 'rev-deleted-user' );
}
- if( $rev->isDeleted( Revision::DELETED_USER ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
return ' <span class="history-deleted">' . $link . '</span>';
}
return $link;
@@ -955,11 +980,11 @@ class Linker {
* Since you can't set a default parameter for a reference, I've turned it
* temporarily to a value pass. Should be adjusted further. --brion
*
- * @param string $comment
- * @param mixed $title Title object (to generate link to the section in autocomment) or null
- * @param bool $local Whether section links should refer to local page
+ * @param $comment String
+ * @param $title Mixed: Title object (to generate link to the section in autocomment) or null
+ * @param $local Boolean: whether section links should refer to local page
*/
- function formatComment($comment, $title = null, $local = false) {
+ function formatComment( $comment, $title = null, $local = false ) {
wfProfileIn( __METHOD__ );
# Sanitize text a bit:
@@ -982,11 +1007,10 @@ class Linker {
* add a separator where needed and format the comment itself with CSS
* Called by Linker::formatComment.
*
- * @param string $comment Comment text
- * @param object $title An optional title object used to links to sections
- * @return string $comment formatted comment
- *
- * @todo Document the $local parameter.
+ * @param $comment String: comment text
+ * @param $title An optional title object used to links to sections
+ * @param $local Boolean: whether section links should refer to local page
+ * @return String: formatted comment
*/
private function formatAutocomments( $comment, $title = null, $local = false ) {
// Bah!
@@ -1012,14 +1036,13 @@ class Linker {
if ( $title ) {
$section = $auto;
- # Generate a valid anchor name from the section title.
- # Hackish, but should generally work - we strip wiki
- # syntax, including the magic [[: that is used to
- # "link rather than show" in case of images and
- # interlanguage links.
+ # Remove links that a user may have manually put in the autosummary
+ # This could be improved by copying as much of Parser::stripSectionName as desired.
$section = str_replace( '[[:', '', $section );
$section = str_replace( '[[', '', $section );
$section = str_replace( ']]', '', $section );
+
+ $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
if ( $local ) {
$sectionTitle = Title::newFromText( '#' . $section );
} else {
@@ -1035,11 +1058,11 @@ class Linker {
}
}
$auto = "$link$auto";
- if( $pre ) {
+ if ( $pre ) {
# written summary $presep autocomment (summary /* section */)
$auto = wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) ) . $auto;
}
- if( $post ) {
+ if ( $post ) {
# autocomment $postsep written summary (/* section */ summary)
$auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
}
@@ -1053,8 +1076,10 @@ class Linker {
* is ignored
*
* @todo Fixme: doesn't handle sub-links as in image thumb texts like the main parser
- * @param string $comment Text to format links in
- * @return string
+ * @param $comment String: text to format links in
+ * @param $title An optional title object used to links to sections
+ * @param $local Boolean: whether section links should refer to local page
+ * @return String
*/
public function formatLinksInComment( $comment, $title = null, $local = false ) {
$this->commentContextTitle = $title;
@@ -1077,33 +1102,33 @@ class Linker {
$comment = $match[0];
# fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
- if( strpos( $match[1], '%' ) !== false ) {
- $match[1] = str_replace( array('<', '>'), array('&lt;', '&gt;'), urldecode($match[1]) );
+ if ( strpos( $match[1], '%' ) !== false ) {
+ $match[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), urldecode( $match[1] ) );
}
# Handle link renaming [[foo|text]] will show link as "text"
- if( $match[3] != "" ) {
+ if ( $match[3] != "" ) {
$text = $match[3];
} else {
$text = $match[1];
}
$submatch = array();
$thelink = null;
- if( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
+ if ( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
# Media link; trail not supported.
$linkRegexp = '/\[\[(.*?)\]\]/';
$title = Title::makeTitleSafe( NS_FILE, $submatch[1] );
$thelink = $this->makeMediaLinkObj( $title, $text );
} else {
# Other kind of link
- if( preg_match( $wgContLang->linkTrail(), $match[4], $submatch ) ) {
+ if ( preg_match( $wgContLang->linkTrail(), $match[4], $submatch ) ) {
$trail = $submatch[1];
} else {
$trail = "";
}
$linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
- if (isset($match[1][0]) && $match[1][0] == ':')
- $match[1] = substr($match[1], 1);
+ if ( isset( $match[1][0] ) && $match[1][0] == ':' )
+ $match[1] = substr( $match[1], 1 );
list( $inside, $trail ) = Linker::splitTrail( $trail );
$linkText = $text;
@@ -1111,9 +1136,11 @@ class Linker {
$match[1], $linkText );
$target = Title::newFromText( $linkTarget );
- if( $target ) {
- if( $target->getText() == '' && !$this->commentLocal && $this->commentContextTitle ) {
- $newTarget = clone( $this->commentContextTitle );
+ if ( $target ) {
+ if ( $target->getText() == '' && $target->getInterwiki() === ''
+ && !$this->commentLocal && $this->commentContextTitle )
+ {
+ $newTarget = clone ( $this->commentContextTitle );
$newTarget->setFragment( '#' . $target->getFragment() );
$target = $newTarget;
}
@@ -1123,7 +1150,7 @@ class Linker {
) . $trail;
}
}
- if( $thelink ) {
+ if ( $thelink ) {
// If the link is still valid, go ahead and replace it in!
$comment = preg_replace( $linkRegexp, StringUtils::escapeRegexReplacement( $thelink ), $comment, 1 );
}
@@ -1145,9 +1172,9 @@ class Linker {
# Some namespaces don't allow subpages,
# so only perform processing if subpages are allowed
- if( $contextTitle && MWNamespace::hasSubpages( $contextTitle->getNamespace() ) ) {
+ if ( $contextTitle && MWNamespace::hasSubpages( $contextTitle->getNamespace() ) ) {
$hash = strpos( $target, '#' );
- if( $hash !== false ) {
+ if ( $hash !== false ) {
$suffix = substr( $target, $hash );
$target = substr( $target, 0, $hash );
} else {
@@ -1156,41 +1183,41 @@ class Linker {
# bug 7425
$target = trim( $target );
# Look at the first character
- if( $target != '' && $target{0} === '/' ) {
+ if ( $target != '' && $target { 0 } === '/' ) {
# / at end means we don't want the slash to be shown
$m = array();
$trailingSlashes = preg_match_all( '%(/+)$%', $target, $m );
- if( $trailingSlashes ) {
- $noslash = $target = substr( $target, 1, -strlen($m[0][0]) );
+ if ( $trailingSlashes ) {
+ $noslash = $target = substr( $target, 1, -strlen( $m[0][0] ) );
} else {
$noslash = substr( $target, 1 );
}
- $ret = $contextTitle->getPrefixedText(). '/' . trim($noslash) . $suffix;
- if( $text === '' ) {
+ $ret = $contextTitle->getPrefixedText() . '/' . trim( $noslash ) . $suffix;
+ if ( $text === '' ) {
$text = $target . $suffix;
} # this might be changed for ugliness reasons
} else {
# check for .. subpage backlinks
$dotdotcount = 0;
$nodotdot = $target;
- while( strncmp( $nodotdot, "../", 3 ) == 0 ) {
+ while ( strncmp( $nodotdot, "../", 3 ) == 0 ) {
++$dotdotcount;
$nodotdot = substr( $nodotdot, 3 );
}
- if($dotdotcount > 0) {
+ if ( $dotdotcount > 0 ) {
$exploded = explode( '/', $contextTitle->GetPrefixedText() );
- if( count( $exploded ) > $dotdotcount ) { # not allowed to go below top level page
+ if ( count( $exploded ) > $dotdotcount ) { # not allowed to go below top level page
$ret = implode( '/', array_slice( $exploded, 0, -$dotdotcount ) );
# / at the end means don't show full path
- if( substr( $nodotdot, -1, 1 ) === '/' ) {
+ if ( substr( $nodotdot, -1, 1 ) === '/' ) {
$nodotdot = substr( $nodotdot, 0, -1 );
- if( $text === '' ) {
+ if ( $text === '' ) {
$text = $nodotdot . $suffix;
}
}
$nodotdot = trim( $nodotdot );
- if( $nodotdot != '' ) {
+ if ( $nodotdot != '' ) {
$ret .= '/' . $nodotdot;
}
$ret .= $suffix;
@@ -1207,9 +1234,9 @@ class Linker {
* Wrap a comment in standard punctuation and formatting if
* it's non-empty, otherwise return empty string.
*
- * @param string $comment
- * @param mixed $title Title object (to generate link to section in autocomment) or null
- * @param bool $local Whether section links should refer to local page
+ * @param $comment String
+ * @param $title Mixed: Title object (to generate link to section in autocomment) or null
+ * @param $local Boolean: whether section links should refer to local page
*
* @return string
*/
@@ -1217,7 +1244,7 @@ class Linker {
// '*' used to be the comment inserted by the software way back
// in antiquity in case none was provided, here for backwards
// compatability, acc. to brion -ævar
- if( $comment == '' || $comment == '*' ) {
+ if ( $comment == '' || $comment == '*' ) {
return '';
} else {
$formatted = $this->formatComment( $comment, $title, $local );
@@ -1229,22 +1256,22 @@ class Linker {
* Wrap and format the given revision's comment block, if the current
* user is allowed to view it.
*
- * @param Revision $rev
- * @param bool $local Whether section links should refer to local page
- * @param $isPublic, show only if all users can see it
- * @return string HTML
+ * @param $rev Revision object
+ * @param $local Boolean: whether section links should refer to local page
+ * @param $isPublic Boolean: show only if all users can see it
+ * @return String: HTML fragment
*/
function revComment( Revision $rev, $local = false, $isPublic = false ) {
- if( $rev->getRawComment() == "" ) return "";
- if( $rev->isDeleted( Revision::DELETED_COMMENT ) && $isPublic ) {
+ if ( $rev->getRawComment() == "" ) return "";
+ if ( $rev->isDeleted( Revision::DELETED_COMMENT ) && $isPublic ) {
$block = " <span class=\"comment\">" . wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
- } else if( $rev->userCan( Revision::DELETED_COMMENT ) ) {
+ } else if ( $rev->userCan( Revision::DELETED_COMMENT ) ) {
$block = $this->commentBlock( $rev->getComment( Revision::FOR_THIS_USER ),
$rev->getTitle(), $local );
} else {
$block = " <span class=\"comment\">" . wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
}
- if( $rev->isDeleted( Revision::DELETED_COMMENT ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_COMMENT ) ) {
return " <span class=\"history-deleted\">$block</span>";
}
return $block;
@@ -1272,8 +1299,8 @@ class Linker {
/**
* Finish one or more sublevels on the Table of Contents
*/
- function tocUnindent($level) {
- return "</li>\n" . str_repeat( "</ul>\n</li>\n", $level>0 ? $level : 0 );
+ function tocUnindent( $level ) {
+ return "</li>\n" . str_repeat( "</ul>\n</li>\n", $level > 0 ? $level : 0 );
}
/**
@@ -1296,36 +1323,30 @@ class Linker {
*/
function tocLineEnd() {
return "</li>\n";
- }
+ }
/**
* Wraps the TOC in a table and provides the hide/collapse javascript.
- * @param string $toc html of the Table Of Contents
- * @return string Full html of the TOC
+ *
+ * @param $toc String: html of the Table Of Contents
+ * @param $lang mixed: Language code for the toc title
+ * @return String: full html of the TOC
*/
- function tocList($toc) {
- $title = wfMsgHtml('toc') ;
+ function tocList( $toc, $lang = false ) {
+ $title = wfMsgExt( 'toc', array( 'language' => $lang, 'escape' ) );
return
'<table id="toc" class="toc"><tr><td>'
. '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
. $toc
- # no trailing newline, script should not be wrapped in a
- # paragraph
- . "</ul>\n</td></tr></table>"
- . Html::inlineScript(
- 'if (window.showTocToggle) {'
- . ' var tocShowText = "' . Xml::escapeJsString( wfMsg('showtoc') ) . '";'
- . ' var tocHideText = "' . Xml::escapeJsString( wfMsg('hidetoc') ) . '";'
- . ' showTocToggle();'
- . ' } ' )
- . "\n";
+ . "</ul>\n</td></tr></table>\n";
}
/**
* Generate a table of contents from a section tree
* Currently unused.
+ *
* @param $tree Return value of ParserOutput::getSections()
- * @return string HTML
+ * @return String: HTML fragment
*/
public function generateTOC( $tree ) {
$toc = '';
@@ -1358,16 +1379,19 @@ class Linker {
* to be included in the link, like "&section=$section"
* @param $tooltip string The tooltip to use for the link: will be escaped
* and wrapped in the 'editsectionhint' message
+ * @param $lang string Language code
* @return string HTML to use for edit link
*/
- public function doEditSectionLink( Title $nt, $section, $tooltip = null ) {
+ public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) {
// HTML generated here should probably have userlangattributes
// added to it for LTR text on RTL pages
$attribs = array();
- if( !is_null( $tooltip ) ) {
- $attribs['title'] = wfMsg( 'editsectionhint', $tooltip );
+ if ( !is_null( $tooltip ) ) {
+ # Bug 25462: undo double-escaping.
+ $tooltip = Sanitizer::decodeCharReferences( $tooltip );
+ $attribs['title'] = wfMsgReal( 'editsectionhint', array( $tooltip ), true, $lang );
}
- $link = $this->link( $nt, wfMsg('editsection'),
+ $link = $this->link( $nt, wfMsgExt( 'editsection', array( 'language' => $lang ) ),
$attribs,
array( 'action' => 'edit', 'section' => $section ),
array( 'noclasses', 'known' )
@@ -1376,43 +1400,44 @@ class Linker {
# Run the old hook. This takes up half of the function . . . hopefully
# we can rid of it someday.
$attribs = '';
- if( $tooltip ) {
- $attribs = wfMsgHtml( 'editsectionhint', htmlspecialchars( $tooltip ) );
+ if ( $tooltip ) {
+ $attribs = htmlspecialchars( wfMsgReal( 'editsectionhint', array( $tooltip ), true, $lang ) );
$attribs = " title=\"$attribs\"";
}
$result = null;
- wfRunHooks( 'EditSectionLink', array( &$this, $nt, $section, $attribs, $link, &$result ) );
- if( !is_null( $result ) ) {
+ wfRunHooks( 'EditSectionLink', array( &$this, $nt, $section, $attribs, $link, &$result, $lang ) );
+ if ( !is_null( $result ) ) {
# For reverse compatibility, add the brackets *after* the hook is
# run, and even add them to hook-provided text. (This is the main
# reason that the EditSectionLink hook is deprecated in favor of
# DoEditSectionLink: it can't change the brackets or the span.)
- $result = wfMsgHtml( 'editsection-brackets', $result );
+ $result = wfMsgExt( 'editsection-brackets', array( 'escape', 'replaceafter', 'language' => $lang ), $result );
return "<span class=\"editsection\">$result</span>";
}
# Add the brackets and the span, and *then* run the nice new hook, with
# clean and non-redundant arguments.
- $result = wfMsgHtml( 'editsection-brackets', $link );
+ $result = wfMsgExt( 'editsection-brackets', array( 'escape', 'replaceafter', 'language' => $lang ), $link );
$result = "<span class=\"editsection\">$result</span>";
- wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result ) );
+ wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) );
return $result;
}
/**
* Create a headline for content
*
- * @param int $level The level of the headline (1-6)
- * @param string $attribs Any attributes for the headline, starting with a space and ending with '>'
- * This *must* be at least '>' for no attribs
- * @param string $anchor The anchor to give the headline (the bit after the #)
- * @param string $text The text of the header
- * @param string $link HTML to add for the section edit link
- * @param mixed $legacyAnchor A second, optional anchor to give for
+ * @param $level Integer: the level of the headline (1-6)
+ * @param $attribs String: any attributes for the headline, starting with
+ * a space and ending with '>'
+ * This *must* be at least '>' for no attribs
+ * @param $anchor String: the anchor to give the headline (the bit after the #)
+ * @param $text String: the text of the header
+ * @param $link String: HTML to add for the section edit link
+ * @param $legacyAnchor Mixed: a second, optional anchor to give for
* backward compatibility (false to omit)
*
- * @return string HTML headline
+ * @return String: HTML headline
*/
public function makeHeadline( $level, $attribs, $anchor, $text, $link, $legacyAnchor = false ) {
$ret = "<h$level$attribs"
@@ -1420,7 +1445,7 @@ class Linker {
. " <span class=\"mw-headline\" id=\"$anchor\">$text</span>"
. "</h$level>";
if ( $legacyAnchor !== false ) {
- $ret = "<a id=\"$legacyAnchor\"></a>$ret";
+ $ret = "<div id=\"$legacyAnchor\"></div>$ret";
}
return $ret;
}
@@ -1428,8 +1453,6 @@ class Linker {
/**
* Split a link trail, return the "inside" portion and the remainder of the trail
* as a two-element array
- *
- * @static
*/
static function splitTrail( $trail ) {
static $regex = false;
@@ -1438,7 +1461,7 @@ class Linker {
$regex = $wgContLang->linkTrail();
}
$inside = '';
- if ( $trail != '' ) {
+ if ( $trail !== '' ) {
$m = array();
if ( preg_match( $regex, $trail, $m ) ) {
$inside = $m[1];
@@ -1459,7 +1482,7 @@ class Linker {
* changes, so this allows sysops to combat a busy vandal without bothering
* other users.
*
- * @param Revision $rev
+ * @param $rev Revision object
*/
function generateRollback( $rev ) {
return '<span class="mw-rollback-link">['
@@ -1470,8 +1493,8 @@ class Linker {
/**
* Build a raw rollback link, useful for collections of "tool" links
*
- * @param Revision $rev
- * @return string
+ * @param $rev Revision object
+ * @return String: HTML fragment
*/
public function buildRollbackLink( $rev ) {
global $wgRequest, $wgUser;
@@ -1480,7 +1503,7 @@ class Linker {
'action' => 'rollback',
'from' => $rev->getUserText()
);
- if( $wgRequest->getBool( 'bot' ) ) {
+ if ( $wgRequest->getBool( 'bot' ) ) {
$query['bot'] = '1';
$query['hidediff'] = '1'; // bug 15999
}
@@ -1494,11 +1517,11 @@ class Linker {
/**
* Returns HTML for the "templates used on this page" list.
*
- * @param array $templates Array of templates from Article::getUsedTemplate
+ * @param $templates Array of templates from Article::getUsedTemplate
* or similar
- * @param bool $preview Whether this is for a preview
- * @param bool $section Whether this is for a section edit
- * @return string HTML output
+ * @param $preview Boolean: whether this is for a preview
+ * @param $section Boolean: whether this is for a section edit
+ * @return String: HTML output
*/
public function formatTemplates( $templates, $preview = false, $section = false ) {
wfProfileIn( __METHOD__ );
@@ -1507,7 +1530,7 @@ class Linker {
if ( count( $templates ) > 0 ) {
# Do a batch existence check
$batch = new LinkBatch;
- foreach( $templates as $title ) {
+ foreach ( $templates as $title ) {
$batch->addObj( $title );
}
$batch->execute();
@@ -1533,7 +1556,7 @@ class Linker {
} else {
$protected = '';
}
- if( $titleObj->quickUserCan( 'edit' ) ) {
+ if ( $titleObj->quickUserCan( 'edit' ) ) {
$editLink = $this->link(
$titleObj,
wfMsg( 'editlink' ),
@@ -1559,9 +1582,9 @@ class Linker {
/**
* Returns HTML for the "hidden categories on this page" list.
*
- * @param array $hiddencats Array of hidden categories from Article::getHiddenCategories
+ * @param $hiddencats Array of hidden categories from Article::getHiddenCategories
* or similar
- * @return string HTML output
+ * @return String: HTML output
*/
public function formatHiddenCategories( $hiddencats ) {
global $wgLang;
@@ -1588,7 +1611,7 @@ class Linker {
* unit (B, KB, MB or GB) according to the magnitude in question
*
* @param $size Size to format
- * @return string
+ * @return String
*/
public function formatSize( $size ) {
global $wgLang;
@@ -1601,27 +1624,30 @@ class Linker {
* isn't always, because sometimes the accesskey needs to go on a different
* element than the id, for reverse-compatibility, etc.)
*
- * @param string $name Id of the element, minus prefixes.
- * @param mixed $options null or the string 'withaccess' to add an access-
+ * @param $name String: id of the element, minus prefixes.
+ * @param $options Mixed: null or the string 'withaccess' to add an access-
* key hint
- * @return string Contents of the title attribute (which you must HTML-
+ * @return String: contents of the title attribute (which you must HTML-
* escape), or false for no title attribute
*/
public function titleAttrib( $name, $options = null ) {
wfProfileIn( __METHOD__ );
- $tooltip = wfMsg( "tooltip-$name" );
- # Compatibility: formerly some tooltips had [alt-.] hardcoded
- $tooltip = preg_replace( "/ ?\[alt-.\]$/", '', $tooltip );
-
- # Message equal to '-' means suppress it.
- if ( wfEmptyMsg( "tooltip-$name", $tooltip ) || $tooltip == '-' ) {
+ if ( wfEmptyMsg( "tooltip-$name" ) ) {
$tooltip = false;
+ } else {
+ $tooltip = wfMsg( "tooltip-$name" );
+ # Compatibility: formerly some tooltips had [alt-.] hardcoded
+ $tooltip = preg_replace( "/ ?\[alt-.\]$/", '', $tooltip );
+ # Message equal to '-' means suppress it.
+ if ( $tooltip == '-' ) {
+ $tooltip = false;
+ }
}
if ( $options == 'withaccess' ) {
$accesskey = $this->accesskey( $name );
- if( $accesskey !== false ) {
+ if ( $accesskey !== false ) {
if ( $tooltip === false || $tooltip === '' ) {
$tooltip = "[$accesskey]";
} else {
@@ -1640,35 +1666,42 @@ class Linker {
* the id but isn't always, because sometimes the accesskey needs to go on
* a different element than the id, for reverse-compatibility, etc.)
*
- * @param string $name Id of the element, minus prefixes.
- * @return string Contents of the accesskey attribute (which you must HTML-
+ * @param $name String: id of the element, minus prefixes.
+ * @return String: contents of the accesskey attribute (which you must HTML-
* escape), or false for no accesskey attribute
*/
public function accesskey( $name ) {
+ if ( isset( $this->accesskeycache[$name] ) ) {
+ return $this->accesskeycache[$name];
+ }
wfProfileIn( __METHOD__ );
- $accesskey = wfMsg( "accesskey-$name" );
+ $message = wfMessage( "accesskey-$name" );
- # FIXME: Per standard MW behavior, a value of '-' means to suppress the
- # attribute, but this is broken for accesskey: that might be a useful
- # value.
- if( $accesskey != '' && $accesskey != '-' && !wfEmptyMsg( "accesskey-$name", $accesskey ) ) {
- wfProfileOut( __METHOD__ );
- return $accesskey;
+ if ( !$message->exists() ) {
+ $accesskey = false;
+ } else {
+ $accesskey = $message->plain();
+ if ( $accesskey === '' || $accesskey === '-' ) {
+ # FIXME: Per standard MW behavior, a value of '-' means to suppress the
+ # attribute, but this is broken for accesskey: that might be a useful
+ # value.
+ $accesskey = false;
+ }
}
wfProfileOut( __METHOD__ );
- return false;
+ return $this->accesskeycache[$name] = $accesskey;
}
/**
* Creates a (show/hide) link for deleting revisions/log entries
*
- * @param array $query Query parameters to be passed to link()
- * @param bool $restricted Set to true to use a <strong> instead of a <span>
- * @param bool $delete Set to true to use (show/hide) rather than (show)
+ * @param $query Array: query parameters to be passed to link()
+ * @param $restricted Boolean: set to true to use a <strong> instead of a <span>
+ * @param $delete Boolean: set to true to use (show/hide) rather than (show)
*
- * @return string HTML <a> link to Special:Revisiondelete, wrapped in a
+ * @return String: HTML <a> link to Special:Revisiondelete, wrapped in a
* span to allow for customization of appearance with CSS
*/
public function revDeleteLink( $query = array(), $restricted = false, $delete = true ) {
@@ -1682,7 +1715,7 @@ class Linker {
/**
* Creates a dead (show/hide) link for deleting revisions/log entries
*
- * @param bool $delete Set to true to use (show/hide) rather than (show)
+ * @param $delete Boolean: set to true to use (show/hide) rather than (show)
*
* @return string HTML text wrapped in a span to allow for customization
* of appearance with CSS
@@ -1718,11 +1751,11 @@ class Linker {
*/
function makeLink( $title, $text = '', $query = '', $trail = '' ) {
wfProfileIn( __METHOD__ );
- $nt = Title::newFromText( $title );
+ $nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
$result = $this->makeLinkObj( $nt, $text, $query, $trail );
} else {
- wfDebug( 'Invalid title passed to Linker::makeLink(): "'.$title."\"\n" );
+ wfDebug( 'Invalid title passed to Linker::makeLink(): "' . $title . "\"\n" );
$result = $text == "" ? $title : $text;
}
@@ -1742,13 +1775,15 @@ class Linker {
* @param $trail String: optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
+ * @param $prefix String: Optional prefix
+ * @param $aprops String: extra attributes to the a-element
*/
- function makeKnownLink( $title, $text = '', $query = '', $trail = '', $prefix = '',$aprops = '') {
+ function makeKnownLink( $title, $text = '', $query = '', $trail = '', $prefix = '', $aprops = '' ) {
$nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
return $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix , $aprops );
} else {
- wfDebug( 'Invalid title passed to Linker::makeKnownLink(): "'.$title."\"\n" );
+ wfDebug( 'Invalid title passed to Linker::makeKnownLink(): "' . $title . "\"\n" );
return $text == '' ? $title : $text;
}
}
@@ -1759,19 +1794,19 @@ class Linker {
* This function is a shortcut to makeBrokenLinkObj(Title::newFromText($title),...). Do not call
* it if you already have a title object handy. See makeBrokenLinkObj for further documentation.
*
- * @param string $title The text of the title
- * @param string $text Link text
- * @param string $query Optional query part
- * @param string $trail Optional trail. Alphabetic characters at the start of this string will
- * be included in the link text. Other characters will be appended after
- * the end of the link.
+ * @param $title String: The text of the title
+ * @param $text String: Link text
+ * @param $query String: Optional query part
+ * @param $trail String: Optional trail. Alphabetic characters at the start of this string will
+ * be included in the link text. Other characters will be appended after
+ * the end of the link.
*/
function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
$nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
return $this->makeBrokenLinkObj( $nt, $text, $query, $trail );
} else {
- wfDebug( 'Invalid title passed to Linker::makeBrokenLink(): "'.$title."\"\n" );
+ wfDebug( 'Invalid title passed to Linker::makeBrokenLink(): "' . $title . "\"\n" );
return $text == '' ? $title : $text;
}
}
@@ -1795,7 +1830,7 @@ class Linker {
if ( $nt instanceof Title ) {
return $this->makeStubLinkObj( $nt, $text, $query, $trail );
} else {
- wfDebug( 'Invalid title passed to Linker::makeStubLink(): "'.$title."\"\n" );
+ wfDebug( 'Invalid title passed to Linker::makeStubLink(): "' . $title . "\"\n" );
return $text == '' ? $title : $text;
}
}
@@ -1816,12 +1851,12 @@ class Linker {
* the end of the link.
* @param $prefix String: optional prefix. As trail, only before instead of after.
*/
- function makeLinkObj( $nt, $text= '', $query = '', $trail = '', $prefix = '' ) {
+ function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
wfProfileIn( __METHOD__ );
$query = wfCgiToArray( $query );
list( $inside, $trail ) = Linker::splitTrail( $trail );
- if( $text === '' ) {
+ if ( $text === '' ) {
$text = $this->linkText( $nt );
}
@@ -1838,7 +1873,7 @@ class Linker {
* it doesn't have to do a database query. It's also valid for interwiki titles and special
* pages.
*
- * @param $nt Title object of target page
+ * @param $title Title object of target page
* @param $text String: text to replace the title
* @param $query String: link target
* @param $trail String: text after link
@@ -1872,21 +1907,21 @@ class Linker {
*
* Make a red link to the edit page of a given title.
*
- * @param $nt Title object of the target page
+ * @param $title Title object of the target page
* @param $text String: Link text
* @param $query String: Optional query part
* @param $trail String: Optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
+ * @param $prefix String: Optional prefix
*/
function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
wfProfileIn( __METHOD__ );
list( $inside, $trail ) = Linker::splitTrail( $trail );
- if( $text === '' ) {
+ if ( $text === '' ) {
$text = $this->linkText( $title );
}
- $nt = $this->normaliseSpecialPage( $title );
$ret = $this->link( $title, "$prefix$text$inside", array(),
wfCgiToArray( $query ), 'broken' ) . $trail;
@@ -1906,9 +1941,10 @@ class Linker {
* @param $trail String: optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
+ * @param $prefix String: Optional prefix
*/
function makeStubLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
- wfDeprecated( __METHOD__ );
+ // wfDeprecated( __METHOD__ );
return $this->makeColouredLinkObj( $nt, 'stub', $text, $query, $trail, $prefix );
}
@@ -1924,9 +1960,11 @@ class Linker {
* @param $trail String: optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
+ * @param $prefix String: Optional prefix
*/
function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
- if($colour != ''){
+ // wfDeprecated( __METHOD__ );
+ if ( $colour != '' ) {
$style = $this->getInternalLinkAttributesObj( $nt, $text, $colour );
} else $style = '';
return $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix, '', $style );
@@ -1942,17 +1980,17 @@ class Linker {
* Creates the HTML source for images
* @deprecated use makeImageLink2
*
- * @param object $title
- * @param string $label label text
- * @param string $alt alt text
- * @param string $align horizontal alignment: none, left, center, right)
- * @param array $handlerParams Parameters to be passed to the media handler
- * @param boolean $framed shows image in original size in a frame
- * @param boolean $thumb shows image as thumbnail in a frame
- * @param string $manualthumb image name for the manual thumbnail
- * @param string $valign vertical alignment: baseline, sub, super, top, text-top, middle, bottom, text-bottom
- * @param string $time, timestamp of the file, set as false for current
- * @return string
+ * @param $title Title object
+ * @param $label String: label text
+ * @param $alt String: alt text
+ * @param $align String: horizontal alignment: none, left, center, right)
+ * @param $handlerParams Array: parameters to be passed to the media handler
+ * @param $framed Boolean: shows image in original size in a frame
+ * @param $thumb Boolean: shows image as thumbnail in a frame
+ * @param $manualthumb String: image name for the manual thumbnail
+ * @param $valign String: vertical alignment: baseline, sub, super, top, text-top, middle, bottom, text-bottom
+ * @param $time String: timestamp of the file, set as false for current
+ * @return String
*/
function makeImageLinkObj( $title, $label, $alt, $align = '', $handlerParams = array(), $framed = false,
$thumb = false, $manualthumb = '', $valign = '', $time = false )
@@ -2005,7 +2043,7 @@ class Linker {
*/
public function editSectionLink( Title $nt, $section, $hint = '' ) {
wfDeprecated( __METHOD__ );
- if( $hint === '' ) {
+ if ( $hint === '' ) {
# No way to pass an actual empty $hint here! The new interface al-
# lows this, so we have to do this for compatibility.
$hint = null;
@@ -2014,7 +2052,7 @@ class Linker {
}
/**
- * Returns the attributes for the tooltip and access key
+ * Returns the attributes for the tooltip and access key.
*/
public function tooltipAndAccesskeyAttribs( $name ) {
global $wgEnableTooltipsAndAccesskeys;
@@ -2042,7 +2080,6 @@ class Linker {
return Xml::expandAttributes( $this->tooltipAndAccesskeyAttribs( $name ) );
}
-
/** @deprecated Returns raw bits of HTML, use titleAttrib() */
public function tooltip( $name, $options = null ) {
global $wgEnableTooltipsAndAccesskeys;
diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php
index ef3374d9..b86ea565 100644
--- a/includes/LinksUpdate.php
+++ b/includes/LinksUpdate.php
@@ -26,11 +26,11 @@ class LinksUpdate {
/**
* Constructor
*
- * @param Title $title Title of the page we're updating
- * @param ParserOutput $parserOutput Output from a full parse of this page
- * @param bool $recursive Queue jobs for recursive updates?
+ * @param $title Title of the page we're updating
+ * @param $parserOutput ParserOutput: output from a full parse of this page
+ * @param $recursive Boolean: queue jobs for recursive updates?
*/
- function LinksUpdate( $title, $parserOutput, $recursive = true ) {
+ function __construct( $title, $parserOutput, $recursive = true ) {
global $wgAntiLockFlags;
if ( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) {
@@ -54,6 +54,7 @@ class LinksUpdate {
$this->mExternals = $parserOutput->getExternalLinks();
$this->mCategories = $parserOutput->getCategories();
$this->mProperties = $parserOutput->getProperties();
+ $this->mInterwikis = $parserOutput->getInterwikiLinks();
# Convert the format of the interlanguage links
# I didn't want to change it in the ParserOutput, because that array is passed all
@@ -66,8 +67,18 @@ class LinksUpdate {
$this->mInterlangs[$key] = $title;
}
+ foreach ( $this->mCategories as $cat => &$sortkey ) {
+ # If the sortkey is longer then 255 bytes,
+ # it truncated by DB, and then doesn't get
+ # matched when comparing existing vs current
+ # categories, causing bug 25254.
+ # Also. substr behaves weird when given "".
+ if ( $sortkey !== '' ) {
+ $sortkey = substr( $sortkey, 0, 255 );
+ }
+ }
+
$this->mRecursive = $recursive;
- $this->mTouchTmplLinks = false;
wfRunHooks( 'LinksUpdateConstructed', array( &$this ) );
}
@@ -115,6 +126,11 @@ class LinksUpdate {
$this->incrTableUpdate( 'langlinks', 'll', $this->getInterlangDeletions( $existing ),
$this->getInterlangInsertions( $existing ) );
+ # Inline interwiki links
+ $existing = $this->getExistingInterwikis();
+ $this->incrTableUpdate( 'iwlinks', 'iwl', $this->getInterwikiDeletions( $existing ),
+ $this->getInterwikiInsertions( $existing ) );
+
# Template links
$existing = $this->getExistingTemplates();
$this->incrTableUpdate( 'templatelinks', 'tl', $this->getTemplateDeletions( $existing ),
@@ -175,6 +191,7 @@ class LinksUpdate {
$this->dumbTableUpdate( 'templatelinks', $this->getTemplateInsertions(), 'tl_from' );
$this->dumbTableUpdate( 'externallinks', $this->getExternalInsertions(), 'el_from' );
$this->dumbTableUpdate( 'langlinks', $this->getInterlangInsertions(),'ll_from' );
+ $this->dumbTableUpdate( 'iwlinks', $this->getInterwikiInsertions(),'iwl_from' );
$this->dumbTableUpdate( 'page_props', $this->getPropertyInsertions(), 'pp_page' );
# Update the cache of all the category pages and image description
@@ -219,8 +236,8 @@ class LinksUpdate {
/**
* Invalidate the cache of a list of pages from a single namespace
*
- * @param integer $namespace
- * @param array $dbkeys
+ * @param $namespace Integer
+ * @param $dbkeys Array
*/
function invalidatePages( $namespace, $dbkeys ) {
if ( !count( $dbkeys ) ) {
@@ -241,7 +258,7 @@ class LinksUpdate {
'page_touched < ' . $this->mDb->addQuotes( $now )
), __METHOD__
);
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$ids[] = $row->page_id;
}
if ( !count( $ids ) ) {
@@ -292,18 +309,6 @@ class LinksUpdate {
}
/**
- * Make a WHERE clause from a 2-d NS/dbkey array
- *
- * @param array $arr 2-d array indexed by namespace and DB key
- * @param string $prefix Field name prefix, without the underscore
- */
- function makeWhereFrom2d( &$arr, $prefix ) {
- $lb = new LinkBatch;
- $lb->setArray( $arr );
- return $lb->constructSet( $prefix, $this->mDb );
- }
-
- /**
* Update a table by doing a delete query then an insert query
* @private
*/
@@ -314,8 +319,13 @@ class LinksUpdate {
$fromField = "{$prefix}_from";
}
$where = array( $fromField => $this->mId );
- if ( $table == 'pagelinks' || $table == 'templatelinks' ) {
- $clause = $this->makeWhereFrom2d( $deletions, $prefix );
+ if ( $table == 'pagelinks' || $table == 'templatelinks' || $table == 'iwlinks' ) {
+ if ( $table == 'iwlinks' ) {
+ $baseKey = 'iwl_prefix';
+ } else {
+ $baseKey = "{$prefix}_namespace";
+ }
+ $clause = $this->mDb->makeWhereFrom2d( $deletions, $baseKey, "{$prefix}_title" );
if ( $clause ) {
$where[] = $clause;
} else {
@@ -352,8 +362,6 @@ class LinksUpdate {
function getLinkInsertions( $existing = array() ) {
$arr = array();
foreach( $this->mLinks as $ns => $dbkeys ) {
- # array_diff_key() was introduced in PHP 5.1, there is a compatibility function
- # in GlobalFunctions.php
$diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
foreach ( $diffs as $dbk => $id ) {
$arr[] = array(
@@ -421,22 +429,42 @@ class LinksUpdate {
/**
* Get an array of category insertions
- * @param array $existing Array mapping existing category names to sort keys. If both
+ *
+ * @param $existing Array mapping existing category names to sort keys. If both
* match a link in $this, the link will be omitted from the output
* @private
*/
function getCategoryInsertions( $existing = array() ) {
- global $wgContLang;
+ global $wgContLang, $wgCategoryCollation;
$diffs = array_diff_assoc( $this->mCategories, $existing );
$arr = array();
- foreach ( $diffs as $name => $sortkey ) {
+ foreach ( $diffs as $name => $prefix ) {
$nt = Title::makeTitleSafe( NS_CATEGORY, $name );
$wgContLang->findVariantLink( $name, $nt, true );
+
+ if ( $this->mTitle->getNamespace() == NS_CATEGORY ) {
+ $type = 'subcat';
+ } elseif ( $this->mTitle->getNamespace() == NS_FILE ) {
+ $type = 'file';
+ } else {
+ $type = 'page';
+ }
+
+ # Treat custom sortkeys as a prefix, so that if multiple
+ # things are forced to sort as '*' or something, they'll
+ # sort properly in the category rather than in page_id
+ # order or such.
+ $sortkey = Collation::singleton()->getSortKey(
+ $this->mTitle->getCategorySortkey( $prefix ) );
+
$arr[] = array(
'cl_from' => $this->mId,
'cl_to' => $name,
'cl_sortkey' => $sortkey,
- 'cl_timestamp' => $this->mDb->timestamp()
+ 'cl_timestamp' => $this->mDb->timestamp(),
+ 'cl_sortkey_prefix' => $prefix,
+ 'cl_collation' => $wgCategoryCollation,
+ 'cl_type' => $type,
);
}
return $arr;
@@ -444,7 +472,8 @@ class LinksUpdate {
/**
* Get an array of interlanguage link insertions
- * @param array $existing Array mapping existing language codes to titles
+ *
+ * @param $existing Array mapping existing language codes to titles
* @private
*/
function getInterlangInsertions( $existing = array() ) {
@@ -476,6 +505,25 @@ class LinksUpdate {
return $arr;
}
+ /**
+ * Get an array of interwiki insertions for passing to the DB
+ * Skips the titles specified by the 2-D array $existing
+ * @private
+ */
+ function getInterwikiInsertions( $existing = array() ) {
+ $arr = array();
+ foreach( $this->mInterwikis as $prefix => $dbkeys ) {
+ $diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
+ foreach ( $diffs as $dbk => $id ) {
+ $arr[] = array(
+ 'iwl_from' => $this->mId,
+ 'iwl_prefix' => $prefix,
+ 'iwl_title' => $dbk
+ );
+ }
+ }
+ return $arr;
+ }
/**
* Given an array of existing links, returns those links which are not in $this
@@ -556,6 +604,23 @@ class LinksUpdate {
}
/**
+ * Given an array of existing interwiki links, returns those links which are not in $this
+ * and thus should be deleted.
+ * @private
+ */
+ function getInterwikiDeletions( $existing ) {
+ $del = array();
+ foreach ( $existing as $prefix => $dbkeys ) {
+ if ( isset( $this->mInterwikis[$prefix] ) ) {
+ $del[$prefix] = array_diff_key( $existing[$prefix], $this->mInterwikis[$prefix] );
+ } else {
+ $del[$prefix] = $existing[$prefix];
+ }
+ }
+ return $del;
+ }
+
+ /**
* Get an array of existing links, as a 2-D array
* @private
*/
@@ -563,13 +628,12 @@ class LinksUpdate {
$res = $this->mDb->select( 'pagelinks', array( 'pl_namespace', 'pl_title' ),
array( 'pl_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( !isset( $arr[$row->pl_namespace] ) ) {
$arr[$row->pl_namespace] = array();
}
$arr[$row->pl_namespace][$row->pl_title] = 1;
}
- $this->mDb->freeResult( $res );
return $arr;
}
@@ -581,13 +645,12 @@ class LinksUpdate {
$res = $this->mDb->select( 'templatelinks', array( 'tl_namespace', 'tl_title' ),
array( 'tl_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( !isset( $arr[$row->tl_namespace] ) ) {
$arr[$row->tl_namespace] = array();
}
$arr[$row->tl_namespace][$row->tl_title] = 1;
}
- $this->mDb->freeResult( $res );
return $arr;
}
@@ -599,10 +662,9 @@ class LinksUpdate {
$res = $this->mDb->select( 'imagelinks', array( 'il_to' ),
array( 'il_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$arr[$row->il_to] = 1;
}
- $this->mDb->freeResult( $res );
return $arr;
}
@@ -614,10 +676,9 @@ class LinksUpdate {
$res = $this->mDb->select( 'externallinks', array( 'el_to' ),
array( 'el_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$arr[$row->el_to] = 1;
}
- $this->mDb->freeResult( $res );
return $arr;
}
@@ -626,13 +687,12 @@ class LinksUpdate {
* @private
*/
function getExistingCategories() {
- $res = $this->mDb->select( 'categorylinks', array( 'cl_to', 'cl_sortkey' ),
+ $res = $this->mDb->select( 'categorylinks', array( 'cl_to', 'cl_sortkey_prefix' ),
array( 'cl_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
- $arr[$row->cl_to] = $row->cl_sortkey;
+ foreach ( $res as $row ) {
+ $arr[$row->cl_to] = $row->cl_sortkey_prefix;
}
- $this->mDb->freeResult( $res );
return $arr;
}
@@ -645,13 +705,30 @@ class LinksUpdate {
$res = $this->mDb->select( 'langlinks', array( 'll_lang', 'll_title' ),
array( 'll_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$arr[$row->ll_lang] = $row->ll_title;
}
return $arr;
}
/**
+ * Get an array of existing inline interwiki links, as a 2-D array
+ * @return array (prefix => array(dbkey => 1))
+ */
+ protected function getExistingInterwikis() {
+ $res = $this->mDb->select( 'iwlinks', array( 'iwl_prefix', 'iwl_title' ),
+ array( 'iwl_from' => $this->mId ), __METHOD__, $this->mOptions );
+ $arr = array();
+ foreach ( $res as $row ) {
+ if ( !isset( $arr[$row->iwl_prefix] ) ) {
+ $arr[$row->iwl_prefix] = array();
+ }
+ $arr[$row->iwl_prefix][$row->iwl_title] = 1;
+ }
+ return $arr;
+ }
+
+ /**
* Get an array of existing categories, with the name in the key and sort key in the value.
* @private
*/
@@ -659,10 +736,9 @@ class LinksUpdate {
$res = $this->mDb->select( 'page_props', array( 'pp_propname', 'pp_value' ),
array( 'pp_page' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
- while ( $row = $this->mDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$arr[$row->pp_propname] = $row->pp_value;
}
- $this->mDb->freeResult( $res );
return $arr;
}
diff --git a/includes/LocalisationCache.php b/includes/LocalisationCache.php
index 12925b68..9ead21f1 100644
--- a/includes/LocalisationCache.php
+++ b/includes/LocalisationCache.php
@@ -101,7 +101,7 @@ class LocalisationCache {
* by a fallback sequence.
*/
static public $mergeableMapKeys = array( 'messages', 'namespaceNames', 'mathNames',
- 'dateFormats', 'defaultUserOptionOverrides', 'magicWords', 'imageFiles',
+ 'dateFormats', 'defaultUserOptionOverrides', 'imageFiles',
'preloadedMessages',
);
@@ -122,6 +122,11 @@ class LocalisationCache {
* key is removed after the first merge.
*/
static public $optionalMergeKeys = array( 'bookstoreList' );
+
+ /**
+ * Keys for items that are formatted like $magicWords
+ */
+ static public $magicWordKeys = array( 'magicWords' );
/**
* Keys for items where the subitems are stored in the backend separately.
@@ -187,7 +192,8 @@ class LocalisationCache {
self::$mergeableMapKeys,
self::$mergeableListKeys,
self::$mergeableAliasListKeys,
- self::$optionalMergeKeys
+ self::$optionalMergeKeys,
+ self::$magicWordKeys
) );
}
return isset( $this->mergeableKeys[$key] );
@@ -435,6 +441,8 @@ class LocalisationCache {
if ( isset( $value['inherit'] ) ) {
unset( $value['inherit'] );
}
+ } elseif ( in_array( $key, self::$magicWordKeys ) ) {
+ $this->mergeMagicWords( $value, $fallbackValue );
}
}
} else {
@@ -442,6 +450,20 @@ class LocalisationCache {
}
}
+ protected function mergeMagicWords( &$value, $fallbackValue ) {
+ foreach ( $fallbackValue as $magicName => $fallbackInfo ) {
+ if ( !isset( $value[$magicName] ) ) {
+ $value[$magicName] = $fallbackInfo;
+ } else {
+ $oldSynonyms = array_slice( $fallbackInfo, 1 );
+ $newSynonyms = array_slice( $value[$magicName], 1 );
+ $synonyms = array_values( array_unique( array_merge(
+ $newSynonyms, $oldSynonyms ) ) );
+ $value[$magicName] = array_merge( array( $fallbackInfo[0] ), $synonyms );
+ }
+ }
+ }
+
/**
* Given an array mapping language code to localisation value, such as is
* found in extension *.i18n.php files, iterate through a fallback sequence
@@ -621,6 +643,13 @@ class LocalisationCache {
}
}
$this->store->finishWrite();
+
+ # Clear out the MessageBlobStore
+ # HACK: If using a null (i.e. disabled) storage backend, we
+ # can't write to the MessageBlobStore either
+ if ( !$this->store instanceof LCStore_Null ) {
+ MessageBlobStore::clear();
+ }
wfProfileOut( __METHOD__ );
}
diff --git a/includes/LogEventsList.php b/includes/LogEventsList.php
index 4bfdc2a3..128500c5 100644
--- a/includes/LogEventsList.php
+++ b/includes/LogEventsList.php
@@ -1,24 +1,31 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
+/**
+ * Contain classes to list log entries
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
class LogEventsList {
const NO_ACTION_LINK = 1;
+ const NO_EXTRA_USER_LINKS = 2;
private $skin;
private $out;
@@ -40,7 +47,7 @@ class LogEventsList {
if( !isset( $this->message ) ) {
$messages = array( 'revertmerge', 'protect_change', 'unblocklink', 'change-blocklink',
'revertmove', 'undeletelink', 'undeleteviewlink', 'revdel-restore', 'hist', 'diff',
- 'pipe-separator' );
+ 'pipe-separator', 'revdel-restore-deleted', 'revdel-restore-visible' );
foreach( $messages as $msg ) {
$this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
}
@@ -64,6 +71,7 @@ class LogEventsList {
/**
* Show options for the log list
+ *
* @param $types string or Array
* @param $user String
* @param $page String
@@ -87,8 +95,7 @@ class LogEventsList {
$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
- $html = '';
- $html .= Xml::hidden( 'title', $special );
+ $html = Html::hidden( 'title', $special );
// Basic selectors
$html .= $this->getTypeMenu( $types ) . "\n";
@@ -106,7 +113,7 @@ class LogEventsList {
// Tag filter
if ($tagSelector) {
- $html .= Xml::tags( 'p', null, implode( '&nbsp;', $tagSelector ) );
+ $html .= Xml::tags( 'p', null, implode( '&#160;', $tagSelector ) );
}
// Filter links
@@ -155,7 +162,7 @@ class LogEventsList {
);
$links[$type] = wfMsgHtml( "log-show-hide-{$type}", $link );
- $hiddens .= Xml::hidden( "hide_{$type}_log", $val ) . "\n";
+ $hiddens .= Html::hidden( "hide_{$type}_log", $val ) . "\n";
}
// Build links
return '<small>'.$wgLang->pipeList( $links ) . '</small>' . $hiddens;
@@ -198,6 +205,14 @@ class LogEventsList {
// Note the query type
$queryType = count($queryTypes) == 1 ? $queryTypes[0] : '';
+
+ // Always put "All public logs" on top
+ if ( isset( $typesByName[''] ) ) {
+ $all = $typesByName[''];
+ unset( $typesByName[''] );
+ $typesByName = array( '' => $all ) + $typesByName;
+ }
+
// Third pass generates sorted XHTML content
foreach( $typesByName as $type => $text ) {
$selected = ($type == $queryType);
@@ -271,38 +286,87 @@ class LogEventsList {
* @return String: Formatted HTML list item
*/
public function logLine( $row ) {
- global $wgLang, $wgUser, $wgContLang;
-
+ $classes = array( 'mw-logline-' . $row->log_type );
$title = Title::makeTitle( $row->log_namespace, $row->log_title );
- $classes = array( "mw-logline-{$row->log_type}" );
- $time = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->log_timestamp ), true );
+ // Log time
+ $time = $this->logTimestamp( $row );
// User links
+ $userLink = $this->logUserLinks( $row );
+ // Extract extra parameters
+ $paramArray = LogPage::extractParams( $row->log_params );
+ // Event description
+ $action = $this->logAction( $row, $title, $paramArray );
+ // Log comment
+ $comment = $this->logComment( $row );
+ // Add review/revert links and such...
+ $revert = $this->logActionLinks( $row, $title, $paramArray, $comment );
+
+ // Some user can hide log items and have review links
+ $del = $this->getShowHideLinks( $row );
+ if( $del != '' ) $del .= ' ';
+
+ // Any tags...
+ list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'logevent' );
+ $classes = array_merge( $classes, $newClasses );
+
+ return Xml::tags( 'li', array( "class" => implode( ' ', $classes ) ),
+ $del . "$time $userLink $action $comment $revert $tagDisplay" ) . "\n";
+ }
+
+ private function logTimestamp( $row ) {
+ global $wgLang;
+ $time = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->log_timestamp ), true );
+ return htmlspecialchars( $time );
+ }
+
+ private function logUserLinks( $row ) {
if( self::isDeleted( $row, LogPage::DELETED_USER ) ) {
- $userLink = '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+ $userLinks = '<span class="history-deleted">' .
+ wfMsgHtml( 'rev-deleted-user' ) . '</span>';
} else {
- $userLink = $this->skin->userLink( $row->log_user, $row->user_name ) .
- $this->skin->userToolLinks( $row->log_user, $row->user_name, true, 0, $row->user_editcount );
+ $userLinks = $this->skin->userLink( $row->log_user, $row->user_name );
+ // Talk|Contribs links...
+ if( !( $this->flags & self::NO_EXTRA_USER_LINKS ) ) {
+ $userLinks .= $this->skin->userToolLinks(
+ $row->log_user, $row->user_name, true, 0, $row->user_editcount );
+ }
}
- // Comment
+ return $userLinks;
+ }
+
+ private function logAction( $row, $title, $paramArray ) {
+ if( self::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
+ $action = '<span class="history-deleted">' .
+ wfMsgHtml( 'rev-deleted-event' ) . '</span>';
+ } else {
+ $action = LogPage::actionText(
+ $row->log_type, $row->log_action, $title, $this->skin, $paramArray, true );
+ }
+ return $action;
+ }
+
+ private function logComment( $row ) {
+ global $wgContLang;
if( self::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
- $comment = '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
+ $comment = '<span class="history-deleted">' .
+ wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
} else {
- $comment = $wgContLang->getDirMark() . $this->skin->commentBlock( $row->log_comment );
+ $comment = $wgContLang->getDirMark() .
+ $this->skin->commentBlock( $row->log_comment );
}
- // Extract extra parameters
- $paramArray = LogPage::extractParams( $row->log_params );
- $revert = $del = '';
- // Some user can hide log items and have review links
- if( !( $this->flags & self::NO_ACTION_LINK ) && $wgUser->isAllowed( 'deletedhistory' ) ) {
- // Don't show useless link to people who cannot hide revisions
- if( $row->log_deleted || $wgUser->isAllowed( 'deleterevision' ) ) {
- $del = $this->getShowHideLinks( $row ) . ' ';
- }
+ return $comment;
+ }
+
+ // @TODO: split up!
+ private function logActionLinks( $row, $title, $paramArray, &$comment ) {
+ global $wgUser;
+ if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the action
+ || self::isDeleted( $row, LogPage::DELETED_ACTION ) ) // action is hidden
+ {
+ return '';
}
- // Add review links and such...
- if( ( $this->flags & self::NO_ACTION_LINK ) || ( $row->log_deleted & LogPage::DELETED_ACTION ) ) {
- // Action text is suppressed...
- } else if( self::typeAction( $row, 'move', 'move', 'move' ) && !empty( $paramArray[0] ) ) {
+ $revert = '';
+ if( self::typeAction( $row, 'move', 'move', 'move' ) && !empty( $paramArray[0] ) ) {
$destTitle = Title::newFromText( $paramArray[0] );
if( $destTitle ) {
$revert = '(' . $this->skin->link(
@@ -312,7 +376,7 @@ class LogEventsList {
array(
'wpOldTitle' => $destTitle->getPrefixedDBkey(),
'wpNewTitle' => $title->getPrefixedDBkey(),
- 'wpReason' => wfMsgForContent( 'revertmove' ),
+ 'wpReason' => wfMsgForContent( 'revertmove' ),
'wpMovetalk' => 0
),
array( 'known', 'noclasses' )
@@ -325,7 +389,6 @@ class LogEventsList {
} else {
$viewdeleted = $this->message['undeletelink'];
}
-
$revert = '(' . $this->skin->link(
SpecialPage::getTitleFor( 'Undelete' ),
$viewdeleted,
@@ -377,9 +440,8 @@ class LogEventsList {
$revert .= ')';
// Show unmerge link
} else if( self::typeAction( $row, 'merge', 'merge', 'mergehistory' ) ) {
- $merge = SpecialPage::getTitleFor( 'Mergehistory' );
$revert = '(' . $this->skin->link(
- $merge,
+ SpecialPage::getTitleFor( 'MergeHistory' ),
$this->message['revertmerge'],
array(),
array(
@@ -391,63 +453,13 @@ class LogEventsList {
) . ')';
// If an edit was hidden from a page give a review link to the history
} else if( self::typeAction( $row, array( 'delete', 'suppress' ), 'revision', 'deletedhistory' ) ) {
- if( count($paramArray) >= 2 ) {
- // Different revision types use different URL params...
- $key = $paramArray[0];
- // $paramArray[1] is a CSV of the IDs
- $Ids = explode( ',', $paramArray[1] );
- $query = $paramArray[1];
- $revert = array();
- // Diff link for single rev deletions
- if( count($Ids) == 1 ) {
- // Live revision diffs...
- if( in_array( $key, array( 'oldid', 'revision' ) ) ) {
- $revert[] = $this->skin->link(
- $title,
- $this->message['diff'],
- array(),
- array(
- 'diff' => intval( $Ids[0] ),
- 'unhide' => 1
- ),
- array( 'known', 'noclasses' )
- );
- // Deleted revision diffs...
- } else if( in_array( $key, array( 'artimestamp','archive' ) ) ) {
- $revert[] = $this->skin->link(
- SpecialPage::getTitleFor( 'Undelete' ),
- $this->message['diff'],
- array(),
- array(
- 'target' => $title->getPrefixedDBKey(),
- 'diff' => 'prev',
- 'timestamp' => $Ids[0]
- ),
- array( 'known', 'noclasses' )
- );
- }
- }
- // View/modify link...
- $revert[] = $this->skin->link(
- SpecialPage::getTitleFor( 'Revisiondelete' ),
- $this->message['revdel-restore'],
- array(),
- array(
- 'target' => $title->getPrefixedText(),
- 'type' => $key,
- 'ids' => $query
- ),
- array( 'known', 'noclasses' )
- );
- // Pipe links
- $revert = wfMsg( 'parentheses', $wgLang->pipeList( $revert ) );
- }
+ $revert = RevisionDeleter::getLogLinks( $title, $paramArray,
+ $this->skin, $this->message );
// Hidden log items, give review link
} else if( self::typeAction( $row, array( 'delete', 'suppress' ), 'event', 'deletedhistory' ) ) {
if( count($paramArray) >= 1 ) {
$revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
// $paramArray[1] is a CSV of the IDs
- $Ids = explode( ',', $paramArray[0] );
$query = $paramArray[0];
// Link to each hidden object ID, $paramArray[1] is the url param
$revert = '(' . $this->skin->link(
@@ -470,7 +482,7 @@ class LogEventsList {
# Fall back to a blue contributions link
$revert = $this->skin->userToolLinks( 1, $title->getDBkey() );
}
- if( $time < '20080129000000' ) {
+ if( wfTimestamp( TS_MW, $row->log_timestamp ) < '20080129000000' ) {
# Suppress $comment from old entries (before 2008-01-29),
# not needed and can contain incorrect links
$comment = '';
@@ -480,26 +492,10 @@ class LogEventsList {
wfRunHooks( 'LogLine', array( $row->log_type, $row->log_action, $title, $paramArray,
&$comment, &$revert, $row->log_timestamp ) );
}
- // Event description
- if( self::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
- $action = '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-event' ) . '</span>';
- } else {
- $action = LogPage::actionText( $row->log_type, $row->log_action, $title,
- $this->skin, $paramArray, true );
- }
-
- // Any tags...
- list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'logevent' );
- $classes = array_merge( $classes, $newClasses );
-
if( $revert != '' ) {
$revert = '<span class="mw-logevent-actionlink">' . $revert . '</span>';
}
-
- $time = htmlspecialchars( $time );
-
- return Xml::tags( 'li', array( "class" => implode( ' ', $classes ) ),
- $del . $time . ' ' . $userLink . ' ' . $action . ' ' . $comment . ' ' . $revert . " $tagDisplay" ) . "\n";
+ return $revert;
}
/**
@@ -508,23 +504,30 @@ class LogEventsList {
*/
private function getShowHideLinks( $row ) {
global $wgUser;
- if( $row->log_type == 'suppress' ) {
- return ''; // No one can hide items from the oversight log
+ if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the links
+ || $row->log_type == 'suppress' ) // no one can hide items from the suppress log
+ {
+ return '';
}
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- // If event was hidden from sysops
- if( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) {
- $del = $this->skin->revDeleteLinkDisabled( $canHide );
- } else {
- $target = SpecialPage::getTitleFor( 'Log', $row->log_type );
- $page = Title::makeTitle( $row->log_namespace, $row->log_title );
- $query = array(
- 'target' => $target->getPrefixedDBkey(),
- 'type' => 'logging',
- 'ids' => $row->log_id,
- );
- $del = $this->skin->revDeleteLink( $query,
- self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
+ $del = '';
+ // Don't show useless link to people who cannot hide revisions
+ if( $wgUser->isAllowed( 'deletedhistory' ) ) {
+ if( $row->log_deleted || $wgUser->isAllowed( 'deleterevision' ) ) {
+ $canHide = $wgUser->isAllowed( 'deleterevision' );
+ // If event was hidden from sysops
+ if( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) {
+ $del = $this->skin->revDeleteLinkDisabled( $canHide );
+ } else {
+ $target = SpecialPage::getTitleFor( 'Log', $row->log_type );
+ $query = array(
+ 'target' => $target->getPrefixedDBkey(),
+ 'type' => 'logging',
+ 'ids' => $row->log_id,
+ );
+ $del = $this->skin->revDeleteLink( $query,
+ self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
+ }
+ }
}
return $del;
}
@@ -534,7 +537,7 @@ class LogEventsList {
* @param $type Mixed: string/array
* @param $action Mixed: string/array
* @param $right string
- * @return bool
+ * @return Boolean
*/
public static function typeAction( $row, $type, $action, $right='' ) {
$match = is_array($type) ?
@@ -553,6 +556,7 @@ class LogEventsList {
/**
* Determine if the current user is allowed to view a particular
* field of this log row, if it's marked as deleted.
+ *
* @param $row Row
* @param $field Integer
* @return Boolean
@@ -560,10 +564,11 @@ class LogEventsList {
public static function userCan( $row, $field ) {
return self::userCanBitfield( $row->log_deleted, $field );
}
-
+
/**
* Determine if the current user is allowed to view a particular
* field of this log row, if it's marked as deleted.
+ *
* @param $bitfield Integer (current field)
* @param $field Integer
* @return Boolean
@@ -571,7 +576,7 @@ class LogEventsList {
public static function userCanBitfield( $bitfield, $field ) {
if( $bitfield & $field ) {
global $wgUser;
- $permission = '';
+
if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
$permission = 'suppressrevision';
} else {
@@ -595,6 +600,7 @@ class LogEventsList {
/**
* Show log extract. Either with text and a box (set $msgKey) or without (don't set $msgKey)
+ *
* @param $out OutputPage or String-by-reference
* @param $types String or Array
* @param $page String The page title to show log entries for
@@ -609,38 +615,41 @@ class LogEventsList {
* that are processed with wgMsgExt and option 'parse'
* - offset Set to overwrite offset parameter in $wgRequest
* set to '' to unset offset
- * - wrap String: Wrap the message in html (usually something like "<div ...>$1</div>").
+ * - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
+ * - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
* @return Integer Number of total log items (not limited by $lim)
*/
- public static function showLogExtract( &$out, $types=array(), $page='', $user='',
- $param = array() ) {
-
+ public static function showLogExtract(
+ &$out, $types=array(), $page='', $user='', $param = array()
+ ) {
+ global $wgUser, $wgOut;
$defaultParameters = array(
'lim' => 25,
'conds' => array(),
'showIfEmpty' => true,
'msgKey' => array(''),
- 'wrap' => "$1"
+ 'wrap' => "$1",
+ 'flags' => 0
);
-
# The + operator appends elements of remaining keys from the right
# handed array to the left handed, whereas duplicated keys are NOT overwritten.
$param += $defaultParameters;
-
- global $wgUser, $wgOut;
# Convert $param array to individual variables
$lim = $param['lim'];
$conds = $param['conds'];
$showIfEmpty = $param['showIfEmpty'];
$msgKey = $param['msgKey'];
$wrap = $param['wrap'];
- if ( !is_array( $msgKey ) )
+ $flags = $param['flags'];
+ if ( !is_array( $msgKey ) ) {
$msgKey = array( $msgKey );
+ }
# Insert list of top 50 (or top $lim) items
- $loglist = new LogEventsList( $wgUser->getSkin(), $wgOut, 0 );
+ $loglist = new LogEventsList( $wgUser->getSkin(), $wgOut, $flags );
$pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
- if ( isset( $param['offset'] ) ) # Tell pager to ignore $wgRequest offset
+ if ( isset( $param['offset'] ) ) { # Tell pager to ignore $wgRequest offset
$pager->setOffset( $param['offset'] );
+ }
if( $lim > 0 ) $pager->mLimit = $lim;
$logBody = $pager->getBody();
$s = '';
@@ -681,10 +690,10 @@ class LogEventsList {
array(),
$urlParam
);
-
}
- if ( $logBody && $msgKey[0] )
+ if ( $logBody && $msgKey[0] ) {
$s .= '</div>';
+ }
if ( $wrap!='' ) { // Wrap message in html
$s = str_replace( '$1', $s, $wrap );
@@ -701,9 +710,10 @@ class LogEventsList {
/**
* SQL clause to skip forbidden log types for this user
+ *
* @param $db Database
* @param $audience string, public/user
- * @return mixed (string or false)
+ * @return Mixed: string or false
*/
public static function getExcludeClause( $db, $audience = 'public' ) {
global $wgLogRestrictions, $wgUser;
@@ -734,15 +744,17 @@ class LogPager extends ReverseChronologicalPager {
public $mLogEventsList;
/**
- * constructor
+ * Constructor
+ *
* @param $list LogEventsList
- * @param $types String or Array log types to show
- * @param $user String The user who made the log entries
- * @param $title String The page title the log entries are for
- * @param $pattern String Do a prefix search rather than an exact title match
- * @param $conds Array Extra conditions for the query
- * @param $year Integer The year to start from
- * @param $month Integer The month to start from
+ * @param $types String or Array: log types to show
+ * @param $user String: the user who made the log entries
+ * @param $title String: the page title the log entries are for
+ * @param $pattern String: do a prefix search rather than an exact title match
+ * @param $conds Array: extra conditions for the query
+ * @param $year Integer: the year to start from
+ * @param $month Integer: the month to start from
+ * @param $tagFilter String: tag
*/
public function __construct( $list, $types = array(), $user = '', $title = '', $pattern = '',
$conds = array(), $year = false, $month = false, $tagFilter = '' )
@@ -790,6 +802,7 @@ class LogPager extends ReverseChronologicalPager {
/**
* Set the log reader to return only entries of the given type.
* Type restrictions enforced here
+ *
* @param $types String or array: Log types ('upload', 'delete', etc);
* empty string means no restriction
*/
@@ -822,6 +835,7 @@ class LogPager extends ReverseChronologicalPager {
/**
* Set the log reader to return only entries by the given user.
+ *
* @param $name String: (In)valid user name
*/
private function limitUser( $name ) {
@@ -855,6 +869,7 @@ class LogPager extends ReverseChronologicalPager {
/**
* Set the log reader to return only entries affecting the given page.
* (For the block and rights logs, this is a user page.)
+ *
* @param $page String: Title name as text
* @param $pattern String
*/
@@ -898,7 +913,6 @@ class LogPager extends ReverseChronologicalPager {
}
public function getQueryInfo() {
- global $wgOut;
$tables = array( 'logging', 'user' );
$this->mConds[] = 'user_id = log_user';
$index = array();
@@ -951,7 +965,7 @@ class LogPager extends ReverseChronologicalPager {
# Do a link batch query
if( $this->getNumRows() > 0 ) {
$lb = new LinkBatch;
- while( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$lb->add( $row->log_namespace, $row->log_title );
$lb->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
$lb->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
@@ -1009,6 +1023,7 @@ class LogPager extends ReverseChronologicalPager {
*/
class LogReader {
var $pager;
+
/**
* @param $request WebRequest: for internal use use a FauxRequest object to pass arbitrary parameters.
*/
@@ -1073,8 +1088,9 @@ class LogViewer {
* Take over the whole output page in $wgOut with the log display.
*/
public function show() {
+ global $wgOut;
# Set title and add header
- $this->list->showHeader( $pager->getType() );
+ $this->list->showHeader( $this->pager->getType() );
# Show form options
$this->list->showOptions( $this->pager->getType(), $this->pager->getUser(), $this->pager->getPage(),
$this->pager->getPattern(), $this->pager->getYear(), $this->pager->getMonth() );
@@ -1097,6 +1113,7 @@ class LogViewer {
* Output just the list of entries given by the linked LogReader,
* with extraneous UI elements. Use for displaying log fragments in
* another page (eg at Special:Undelete)
+ *
* @param $out OutputPage: where to send output
*/
public function showList( &$out ) {
diff --git a/includes/LogPage.php b/includes/LogPage.php
index 1d8d6c1c..8bd08dc4 100644
--- a/includes/LogPage.php
+++ b/includes/LogPage.php
@@ -1,25 +1,25 @@
<?php
-#
-# Copyright (C) 2002, 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* Contain log classes
+ *
+ * Copyright © 2002, 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
*/
@@ -43,17 +43,17 @@ class LogPage {
var $updateRecentChanges, $sendToUDP;
/**
- * Constructor
- *
- * @param string $type One of '', 'block', 'protect', 'rights', 'delete',
- * 'upload', 'move'
- * @param bool $rc Whether to update recent changes as well as the logging table
- * @param bool $udp Whether to send to the UDP feed if NOT sent to RC
- */
+ * Constructor
+ *
+ * @param $type String: one of '', 'block', 'protect', 'rights', 'delete',
+ * 'upload', 'move'
+ * @param $rc Boolean: whether to update recent changes as well as the logging table
+ * @param $udp String: pass 'UDP' to send to the UDP feed if NOT sent to RC
+ */
public function __construct( $type, $rc = true, $udp = 'skipUDP' ) {
$this->type = $type;
$this->updateRecentChanges = $rc;
- $this->sendToUDP = ($udp == 'UDP');
+ $this->sendToUDP = ( $udp == 'UDP' );
}
protected function saveContent() {
@@ -77,23 +77,29 @@ class LogPage {
'log_params' => $this->params
);
$dbw->insert( 'logging', $data, __METHOD__ );
- $newId = !is_null($log_id) ? $log_id : $dbw->insertId();
+ $newId = !is_null( $log_id ) ? $log_id : $dbw->insertId();
# And update recentchanges
if( $this->updateRecentChanges ) {
$titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
- RecentChange::notifyLog( $now, $titleObj, $this->doer, $this->getRcComment(), '', $this->type,
- $this->action, $this->target, $this->comment, $this->params, $newId );
- } else if( $this->sendToUDP ) {
+ RecentChange::notifyLog(
+ $now, $titleObj, $this->doer, $this->getRcComment(), '',
+ $this->type, $this->action, $this->target, $this->comment,
+ $this->params, $newId
+ );
+ } elseif( $this->sendToUDP ) {
# Don't send private logs to UDP
- if( isset($wgLogRestrictions[$this->type]) && $wgLogRestrictions[$this->type] !='*' ) {
+ if( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
return true;
}
# Notify external application via UDP.
# We send this to IRC but do not want to add it the RC table.
$titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
- $rc = RecentChange::newLogEntry( $now, $titleObj, $this->doer, $this->getRcComment(), '',
- $this->type, $this->action, $this->target, $this->comment, $this->params, $newId );
+ $rc = RecentChange::newLogEntry(
+ $now, $titleObj, $this->doer, $this->getRcComment(), '',
+ $this->type, $this->action, $this->target, $this->comment,
+ $this->params, $newId
+ );
$rc->notifyRC2UDP();
}
return $newId;
@@ -105,10 +111,11 @@ class LogPage {
public function getRcComment() {
$rcComment = $this->actionText;
if( $this->comment != '' ) {
- if ($rcComment == '')
+ if ( $rcComment == '' ) {
$rcComment = $this->comment;
- else
+ } else {
$rcComment .= wfMsgForContent( 'colon-separator' ) . $this->comment;
+ }
}
return $rcComment;
}
@@ -121,7 +128,9 @@ class LogPage {
}
/**
- * @static
+ * Get the list of valid log types
+ *
+ * @return Array of strings
*/
public static function validTypes() {
global $wgLogTypes;
@@ -129,21 +138,25 @@ class LogPage {
}
/**
- * @static
+ * Is $type a valid log type
+ *
+ * @param $type String: log type to check
+ * @return Boolean
*/
public static function isLogType( $type ) {
return in_array( $type, LogPage::validTypes() );
}
/**
- * @static
- * @param string $type logtype
+ * Get the name for the given log type
+ *
+ * @param $type String: logtype
+ * @return String: log name
*/
public static function logName( $type ) {
- global $wgLogNames, $wgMessageCache;
+ global $wgLogNames;
if( isset( $wgLogNames[$type] ) ) {
- $wgMessageCache->loadAllMessages();
return str_replace( '_', ' ', wfMsg( $wgLogNames[$type] ) );
} else {
// Bogus log types? Perhaps an extension was removed.
@@ -152,26 +165,34 @@ class LogPage {
}
/**
+ * Get the log header for the given log type
+ *
* @todo handle missing log types
- * @param string $type logtype
- * @return string Headertext of this logtype
+ * @param $type String: logtype
+ * @return String: headertext of this logtype
*/
public static function logHeader( $type ) {
- global $wgLogHeaders, $wgMessageCache;
- $wgMessageCache->loadAllMessages();
- return wfMsgExt($wgLogHeaders[$type],array('parseinline'));
+ global $wgLogHeaders;
+ return wfMsgExt( $wgLogHeaders[$type], array( 'parseinline' ) );
}
/**
- * @static
+ * Generate text for a log entry
+ *
+ * @param $type String: log type
+ * @param $action String: log action
+ * @param $title Mixed: Title object or null
+ * @param $skin Mixed: Skin object or null. If null, we want to use the wiki
+ * content language, since that will go to the IRC feed.
+ * @param $params Array: parameters
+ * @param $filterWikilinks Boolean: whether to filter wiki links
* @return HTML string
*/
- public static function actionText( $type, $action, $title = null, $skin = null,
- $params = array(), $filterWikilinks = false )
+ public static function actionText( $type, $action, $title = null, $skin = null,
+ $params = array(), $filterWikilinks = false )
{
- global $wgLang, $wgContLang, $wgLogActions, $wgMessageCache;
+ global $wgLang, $wgContLang, $wgLogActions;
- $wgMessageCache->loadAllMessages();
$key = "$type/$action";
# Defer patrol log to PatrolLog class
if( $key == 'patrol/patrol' ) {
@@ -187,16 +208,18 @@ class LogPage {
$rightsnone = wfMsg( 'rightsnone' );
foreach ( $params as &$param ) {
$groupArray = array_map( 'trim', explode( ',', $param ) );
- $groupArray = array_map( array( 'User', 'getGroupName' ), $groupArray );
+ $groupArray = array_map( array( 'User', 'getGroupMember' ), $groupArray );
$param = $wgLang->listToText( $groupArray );
}
} else {
$rightsnone = wfMsgForContent( 'rightsnone' );
}
- if( !isset( $params[0] ) || trim( $params[0] ) == '' )
+ if( !isset( $params[0] ) || trim( $params[0] ) == '' ) {
$params[0] = $rightsnone;
- if( !isset( $params[1] ) || trim( $params[1] ) == '' )
+ }
+ if( !isset( $params[1] ) || trim( $params[1] ) == '' ) {
$params[1] = $rightsnone;
+ }
}
if( count( $params ) == 0 ) {
if ( $skin ) {
@@ -210,15 +233,16 @@ class LogPage {
// User suppression
if ( preg_match( '/^(block|suppress)\/(block|reblock)$/', $key ) ) {
if ( $skin ) {
- $params[1] = '<span title="' . htmlspecialchars( $params[1] ). '">' .
+ $params[1] = '<span class="blockExpiry" dir="ltr" title="' . htmlspecialchars( $params[1] ). '">' .
$wgLang->translateBlockExpiry( $params[1] ) . '</span>';
} else {
$params[1] = $wgContLang->translateBlockExpiry( $params[1] );
}
- $params[2] = isset( $params[2] ) ?
+ $params[2] = isset( $params[2] ) ?
self::formatBlockFlags( $params[2], is_null( $skin ) ) : '';
+
// Page protections
- } else if ( $type == 'protect' && count($params) == 3 ) {
+ } elseif ( $type == 'protect' && count($params) == 3 ) {
// Restrictions and expiries
if( $skin ) {
$details .= htmlspecialchars( " {$params[1]}" );
@@ -228,13 +252,14 @@ class LogPage {
// Cascading flag...
if( $params[2] ) {
if ( $skin ) {
- $details .= ' ['.wfMsg('protect-summary-cascade').']';
+ $details .= ' [' . wfMsg( 'protect-summary-cascade' ) . ']';
} else {
- $details .= ' ['.wfMsgForContent('protect-summary-cascade').']';
+ $details .= ' [' . wfMsgForContent( 'protect-summary-cascade' ) . ']';
}
}
+
// Page moves
- } else if ( $type == 'move' && count( $params ) == 3 ) {
+ } elseif ( $type == 'move' && count( $params ) == 3 ) {
if( $params[2] ) {
if ( $skin ) {
$details .= ' [' . wfMsg( 'move-redirect-suppressed' ) . ']';
@@ -242,19 +267,22 @@ class LogPage {
$details .= ' [' . wfMsgForContent( 'move-redirect-suppressed' ) . ']';
}
}
+
// Revision deletion
- } else if ( preg_match( '/^(delete|suppress)\/revision$/', $key ) && count( $params ) == 5 ) {
+ } elseif ( preg_match( '/^(delete|suppress)\/revision$/', $key ) && count( $params ) == 5 ) {
$count = substr_count( $params[2], ',' ) + 1; // revisions
$ofield = intval( substr( $params[3], 7 ) ); // <ofield=x>
$nfield = intval( substr( $params[4], 7 ) ); // <nfield=x>
- $details .= ': '.RevisionDeleter::getLogMessage( $count, $nfield, $ofield, false );
+ $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, false, is_null( $skin ) );
+
// Log deletion
- } else if ( preg_match( '/^(delete|suppress)\/event$/', $key ) && count( $params ) == 4 ) {
+ } elseif ( preg_match( '/^(delete|suppress)\/event$/', $key ) && count( $params ) == 4 ) {
$count = substr_count( $params[1], ',' ) + 1; // log items
$ofield = intval( substr( $params[2], 7 ) ); // <ofield=x>
$nfield = intval( substr( $params[3], 7 ) ); // <nfield=x>
- $details .= ': '.RevisionDeleter::getLogMessage( $count, $nfield, $ofield, true );
+ $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, true, is_null( $skin ) );
}
+
if ( $skin ) {
$rv = wfMsgHtml( $wgLogActions[$key], $params ) . $details;
} else {
@@ -272,24 +300,24 @@ class LogPage {
$rv = "$action";
}
}
-
+
// For the perplexed, this feature was added in r7855 by Erik.
- // The feature was added because we liked adding [[$1]] in our log entries
- // but the log entries are parsed as Wikitext on RecentChanges but as HTML
- // on Special:Log. The hack is essentially that [[$1]] represented a link
- // to the title in question. The first parameter to the HTML version (Special:Log)
- // is that link in HTML form, and so this just gets rid of the ugly [[]].
- // However, this is a horrible hack and it doesn't work like you expect if, say,
- // you want to link to something OTHER than the title of the log entry.
- // The real problem, which Erik was trying to fix (and it sort-of works now) is
- // that the same messages are being treated as both wikitext *and* HTML.
+ // The feature was added because we liked adding [[$1]] in our log entries
+ // but the log entries are parsed as Wikitext on RecentChanges but as HTML
+ // on Special:Log. The hack is essentially that [[$1]] represented a link
+ // to the title in question. The first parameter to the HTML version (Special:Log)
+ // is that link in HTML form, and so this just gets rid of the ugly [[]].
+ // However, this is a horrible hack and it doesn't work like you expect if, say,
+ // you want to link to something OTHER than the title of the log entry.
+ // The real problem, which Erik was trying to fix (and it sort-of works now) is
+ // that the same messages are being treated as both wikitext *and* HTML.
if( $filterWikilinks ) {
- $rv = str_replace( "[[", "", $rv );
- $rv = str_replace( "]]", "", $rv );
+ $rv = str_replace( '[[', '', $rv );
+ $rv = str_replace( ']]', '', $rv );
}
return $rv;
}
-
+
protected static function getTitleLink( $type, $skin, $title, &$params ) {
global $wgLang, $wgContLang, $wgUserrightsInterwikiDelimiter;
if( !$skin ) {
@@ -298,7 +326,7 @@ class LogPage {
switch( $type ) {
case 'move':
$titleLink = $skin->link(
- $title,
+ $title,
htmlspecialchars( $title->getPrefixedText() ),
array(),
array( 'redirect' => 'no' )
@@ -331,8 +359,9 @@ class LogPage {
if ( count( $parts ) == 2 ) {
$titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
htmlspecialchars( $title->getPrefixedText() ) );
- if ( $titleLink !== false )
+ if ( $titleLink !== false ) {
break;
+ }
}
$titleLink = $skin->link( Title::makeTitle( NS_USER, $text ) );
break;
@@ -354,7 +383,7 @@ class LogPage {
list( $name, $par ) = SpecialPage::resolveAliasWithSubpage( $title->getDBkey() );
# Use the language name for log titles, rather than Log/X
if( $name == 'Log' ) {
- $titleLink = '('.$skin->link( $title, LogPage::logName( $par ) ).')';
+ $titleLink = '(' . $skin->link( $title, LogPage::logName( $par ) ) . ')';
} else {
$titleLink = $skin->link( $title );
}
@@ -367,48 +396,60 @@ class LogPage {
/**
* Add a log entry
- * @param string $action one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
- * @param object &$target A title object.
- * @param string $comment Description associated
- * @param array $params Parameters passed later to wfMsg.* functions
- * @param User $doer The user doing the action
+ *
+ * @param $action String: one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
+ * @param $target Title object
+ * @param $comment String: description associated
+ * @param $params Array: parameters passed later to wfMsg.* functions
+ * @param $doer User object: the user doing the action
*/
public function addEntry( $action, $target, $comment, $params = array(), $doer = null ) {
if ( !is_array( $params ) ) {
$params = array( $params );
}
- if ( $comment === null ) $comment = "";
+ if ( $comment === null ) {
+ $comment = '';
+ }
$this->action = $action;
$this->target = $target;
$this->comment = $comment;
$this->params = LogPage::makeParamBlob( $params );
-
- if ($doer === null) {
+
+ if ( $doer === null ) {
global $wgUser;
$doer = $wgUser;
- } elseif (!is_object( $doer ) ) {
+ } elseif ( !is_object( $doer ) ) {
$doer = User::newFromId( $doer );
}
-
+
$this->doer = $doer;
$this->actionText = LogPage::actionText( $this->type, $action, $target, null, $params );
return $this->saveContent();
}
-
+
/**
* Add relations to log_search table
- * @static
+ *
+ * @param $field String
+ * @param $values Array
+ * @param $logid Integer
+ * @return Boolean
*/
public function addRelations( $field, $values, $logid ) {
- if( !strlen($field) || empty($values) )
+ if( !strlen( $field ) || empty( $values ) ) {
return false; // nothing
+ }
$data = array();
foreach( $values as $value ) {
- $data[] = array('ls_field' => $field,'ls_value' => $value,'ls_log_id' => $logid);
+ $data[] = array(
+ 'ls_field' => $field,
+ 'ls_value' => $value,
+ 'ls_log_id' => $logid
+ );
}
$dbw = wfGetDB( DB_MASTER );
$dbw->insert( 'log_search', $data, __METHOD__, 'IGNORE' );
@@ -417,7 +458,9 @@ class LogPage {
/**
* Create a blob from a parameter array
- * @static
+ *
+ * @param $params Array
+ * @return String
*/
public static function makeParamBlob( $params ) {
return implode( "\n", $params );
@@ -425,7 +468,9 @@ class LogPage {
/**
* Extract a parameter array from a blob
- * @static
+ *
+ * @param $blob String
+ * @return Array
*/
public static function extractParams( $blob ) {
if ( $blob === '' ) {
@@ -442,15 +487,16 @@ class LogPage {
* @param $flags Flags to format
* @param $forContent Whether to localize the message depending of the user
* language
- * @return string
+ * @return String
*/
public static function formatBlockFlags( $flags, $forContent = false ) {
global $wgLang;
$flags = explode( ',', trim( $flags ) );
if( count( $flags ) > 0 ) {
- for( $i = 0; $i < count( $flags ); $i++ )
+ for( $i = 0; $i < count( $flags ); $i++ ) {
$flags[$i] = self::formatBlockFlag( $flags[$i], $forContent );
+ }
return '(' . $wgLang->commaList( $flags ) . ')';
} else {
return '';
@@ -463,16 +509,17 @@ class LogPage {
* @param $flag Flag to translate
* @param $forContent Whether to localize the message depending of the user
* language
- * @return string
+ * @return String
*/
public static function formatBlockFlag( $flag, $forContent = false ) {
static $messages = array();
if( !isset( $messages[$flag] ) ) {
$k = 'block-log-flags-' . $flag;
- if( $forContent )
+ if( $forContent ) {
$msg = wfMsgForContent( $k );
- else
+ } else {
$msg = wfMsg( $k );
+ }
$messages[$flag] = htmlspecialchars( wfEmptyMsg( $k, $msg ) ? $flag : $msg );
}
return $messages[$flag];
diff --git a/includes/MacBinary.php b/includes/MacBinary.php
index b5b11e6c..0c38a641 100644
--- a/includes/MacBinary.php
+++ b/includes/MacBinary.php
@@ -35,7 +35,7 @@ class MacBinary {
* The file must be seekable, such as local filesystem.
* Remote URLs probably won't work.
*
- * @param string $filename
+ * @param $filename String
*/
function open( $filename ) {
$this->valid = false;
@@ -48,7 +48,8 @@ class MacBinary {
/**
* Does this appear to be a valid MacBinary archive?
- * @return bool
+ *
+ * @return Boolean
*/
function isValid() {
return $this->valid;
@@ -56,7 +57,8 @@ class MacBinary {
/**
* Get length of data fork
- * @return int
+ *
+ * @return Integer
*/
function dataForkLength() {
return $this->dataLength;
@@ -64,8 +66,9 @@ class MacBinary {
/**
* Copy the data fork to an external file or resource.
- * @param resource $destination
- * @return bool
+ *
+ * @param $destination Ressource
+ * @return Boolean
*/
function extractData( $destination ) {
if( !$this->isValid() ) {
@@ -173,9 +176,9 @@ class MacBinary {
* with magic array thingy by Jim Van Verth.
* http://search.cpan.org/~eryq/Convert-BinHex-1.119/lib/Convert/BinHex.pm
*
- * @param string $data
- * @param int $seed
- * @return int
+ * @param $data String
+ * @param $seed Integer
+ * @return Integer
* @access private
*/
function calcCRC( $data, $seed = 0 ) {
@@ -226,9 +229,9 @@ class MacBinary {
}
/**
- * @param resource $destination
- * @param int $bytesToCopy
- * @return bool
+ * @param $destination Resource
+ * @param $bytesToCopy Integer
+ * @return Boolean
* @access private
*/
function copyBytesTo( $destination, $bytesToCopy ) {
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index d741832f..31d83332 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -1,6 +1,7 @@
<?php
/**
* File for magic words
+ *
* See docs/magicword.txt
*
* @file
@@ -60,6 +61,7 @@ class MagicWord {
'numberofarticles',
'numberoffiles',
'numberofedits',
+ 'articlepath',
'sitename',
'server',
'servername',
@@ -79,6 +81,7 @@ class MagicWord {
'revisionday',
'revisionday2',
'revisionmonth',
+ 'revisionmonth1',
'revisionyear',
'revisiontimestamp',
'revisionuser',
@@ -175,7 +178,7 @@ class MagicWord {
/**#@-*/
- function __construct($id = 0, $syn = '', $cs = false) {
+ function __construct($id = 0, $syn = array(), $cs = false) {
$this->mId = $id;
$this->mSynonyms = (array)$syn;
$this->mCaseSensitive = $cs;
@@ -269,13 +272,13 @@ class MagicWord {
* @private
*/
function initRegex() {
- #$variableClass = Title::legalChars();
- # This was used for matching "$1" variables, but different uses of the feature will have
- # different restrictions, which should be checked *after* the MagicWord has been matched,
- # not here. - IMSoP
+ // Sort the synonyms by length, descending, so that the longest synonym
+ // matches in precedence to the shortest
+ $synonyms = $this->mSynonyms;
+ usort( $synonyms, array( $this, 'compareStringLength' ) );
$escSyn = array();
- foreach ( $this->mSynonyms as $synonym )
+ foreach ( $synonyms as $synonym )
// In case a magic word contains /, like that's going to happen;)
$escSyn[] = preg_quote( $synonym, '/' );
$this->mBaseRegex = implode( '|', $escSyn );
@@ -289,6 +292,23 @@ class MagicWord {
}
/**
+ * A comparison function that returns -1, 0 or 1 depending on whether the
+ * first string is longer, the same length or shorter than the second
+ * string.
+ */
+ function compareStringLength( $s1, $s2 ) {
+ $l1 = strlen( $s1 );
+ $l2 = strlen( $s2 );
+ if ( $l1 < $l2 ) {
+ return 1;
+ } elseif ( $l1 > $l2 ) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
* Gets a regex representing matching the word
*/
function getRegex() {
@@ -513,7 +533,6 @@ class MagicWordArray {
* Add a magic word by name
*/
public function add( $name ) {
- global $wgContLang;
$this->names[] = $name;
$this->hash = $this->baseRegex = $this->regex = null;
}
@@ -646,7 +665,6 @@ class MagicWordArray {
}
// This shouldn't happen either
throw new MWException( __METHOD__.': parameter not found' );
- return array( false, false );
}
/**
@@ -656,7 +674,6 @@ class MagicWordArray {
* Both elements are false if there was no match.
*/
public function matchVariableStartToEnd( $text ) {
- global $wgContLang;
$regexes = $this->getVariableStartToEndRegex();
foreach ( $regexes as $regex ) {
if ( $regex !== '' ) {
@@ -720,7 +737,7 @@ class MagicWordArray {
continue;
}
if ( preg_match( $regex, $text, $m ) ) {
- list( $id, $param ) = $this->parseMatch( $m );
+ list( $id, ) = $this->parseMatch( $m );
if ( strlen( $m[0] ) >= strlen( $text ) ) {
$text = '';
} else {
diff --git a/includes/Math.php b/includes/Math.php
index 8cf9b8d8..0e136d5f 100644
--- a/includes/Math.php
+++ b/includes/Math.php
@@ -37,7 +37,8 @@ class MathRenderer {
if( $this->mode == MW_MATH_SOURCE ) {
# No need to render or parse anything more!
- return ('$ '.htmlspecialchars( $this->tex ).' $');
+ # New lines are replaced with spaces, which avoids confusing our parser (bugs 23190, 22818)
+ return ('<span class="tex">$ ' . str_replace( "\n", " ", htmlspecialchars( $this->tex ) ) . ' $</span>');
}
if( $this->tex == '' ) {
return; # bug 8372
@@ -55,7 +56,7 @@ class MathRenderer {
}
}
- if( function_exists( 'is_executable' ) && !is_executable( $wgTexvc ) ) {
+ if( !is_executable( $wgTexvc ) ) {
return $this->_error( 'math_notexvc' );
}
$cmd = $wgTexvc . ' ' .
@@ -71,7 +72,7 @@ class MathRenderer {
}
wfDebug( "TeX: $cmd\n" );
- $contents = `$cmd`;
+ $contents = wfShellExec( $cmd );
wfDebug( "TeX output:\n $contents\n---\n" );
if (strlen($contents) == 0) {
@@ -153,7 +154,10 @@ class MathRenderer {
$hashpath = $this->_getHashPath();
if( !file_exists( $hashpath ) ) {
- if( !@wfMkdirParents( $hashpath, 0755 ) ) {
+ wfSuppressWarnings();
+ $ret = wfMkdirParents( $hashpath, 0755 );
+ wfRestoreWarnings();
+ if( !$ret ) {
return $this->_error( 'math_bad_output' );
}
} elseif( !is_dir( $hashpath ) || !is_writable( $hashpath ) ) {
@@ -231,7 +235,9 @@ class MathRenderer {
if( file_exists( $filename ) ) {
if( filesize( $filename ) == 0 ) {
// Some horrible error corrupted stuff :(
- @unlink( $filename );
+ wfSuppressWarnings();
+ unlink( $filename );
+ wfRestoreWarnings();
} else {
return true;
}
@@ -241,7 +247,10 @@ class MathRenderer {
$hashpath = $this->_getHashPath();
if( !file_exists( $hashpath ) ) {
- if( !@wfMkdirParents( $hashpath, 0755 ) ) {
+ wfSuppressWarnings();
+ $ret = wfMkdirParents( $hashpath, 0755 );
+ wfRestoreWarnings();
+ if( !$ret ) {
return false;
}
} elseif( !is_dir( $hashpath ) || !is_writable( $hashpath ) ) {
@@ -323,10 +332,10 @@ class MathRenderer {
.'/'. substr($this->hash, 2, 1);
}
- public static function renderMath( $tex, $params=array() ) {
- global $wgUser;
+ public static function renderMath( $tex, $params=array(), ParserOptions $parserOptions = null ) {
$math = new MathRenderer( $tex, $params );
- $math->setOutputMode( $wgUser->getOption('math'));
+ if ( $parserOptions )
+ $math->setOutputMode( $parserOptions->getMath() );
return $math->render();
}
}
diff --git a/includes/MemcachedSessions.php b/includes/MemcachedSessions.php
index e3bcea1b..4f10f99c 100644
--- a/includes/MemcachedSessions.php
+++ b/includes/MemcachedSessions.php
@@ -11,30 +11,42 @@
*/
/**
- * @todo document
+ * Get a cache key for the given session id.
+ *
+ * @param $id String: session id
+ * @return String: cache key
*/
function memsess_key( $id ) {
return wfMemcKey( 'session', $id );
}
/**
- * @todo document
+ * Callback when opening a session.
+ * NOP: $wgMemc should be set up already.
+ *
+ * @param $save_path String: path used to store session files, unused
+ * @param $session_name String: session name
+ * @return Boolean: success
*/
function memsess_open( $save_path, $session_name ) {
- # NOP, $wgMemc should be set up already
return true;
}
/**
- * @todo document
+ * Callback when closing a session.
+ * NOP.
+ *
+ * @return Boolean: success
*/
function memsess_close() {
- # NOP
return true;
}
/**
- * @todo document
+ * Callback when reading session data.
+ *
+ * @param $id String: session id
+ * @return Mixed: session data
*/
function memsess_read( $id ) {
global $wgMemc;
@@ -44,7 +56,11 @@ function memsess_read( $id ) {
}
/**
- * @todo document
+ * Callback when writing session data.
+ *
+ * @param $id String: session id
+ * @param $data Mixed: session data
+ * @return Boolean: success
*/
function memsess_write( $id, $data ) {
global $wgMemc;
@@ -53,19 +69,26 @@ function memsess_write( $id, $data ) {
}
/**
- * @todo document
+ * Callback to destroy a session when calling session_destroy().
+ *
+ * @param $id String: session id
+ * @return Boolean: success
*/
function memsess_destroy( $id ) {
global $wgMemc;
+
$wgMemc->delete( memsess_key( $id ) );
return true;
}
/**
- * @todo document
+ * Callback to execute garbage collection.
+ * NOP: Memcached performs garbage collection.
+ *
+ * @param $maxlifetime Integer: maximum session life time
+ * @return Boolean: success
*/
function memsess_gc( $maxlifetime ) {
- # NOP: Memcached performs garbage collection.
return true;
}
diff --git a/includes/Message.php b/includes/Message.php
new file mode 100644
index 00000000..72232ec9
--- /dev/null
+++ b/includes/Message.php
@@ -0,0 +1,360 @@
+<?php
+/**
+ * This class provides methods for fetching interface messages and
+ * processing them into variety of formats that are needed in MediaWiki.
+ *
+ * It is intented to replace the old wfMsg* functions that over time grew
+ * unusable.
+ *
+ * Examples:
+ * Fetching a message text for interface message
+ * $button = Xml::button( wfMessage( 'submit' )->text() );
+ * </pre>
+ * Messages can have parameters:
+ * wfMessage( 'welcome-to' )->params( $wgSitename )->text();
+ * {{GRAMMAR}} and friends work correctly
+ * wfMessage( 'are-friends', $user, $friend );
+ * wfMessage( 'bad-message' )->rawParams( '<script>...</script>' )->escaped();
+ * </pre>
+ * Sometimes the message text ends up in the database, so content language is needed.
+ * wfMessage( 'file-log', $user, $filename )->inContentLanguage()->text()
+ * </pre>
+ * Checking if message exists:
+ * wfMessage( 'mysterious-message' )->exists()
+ * </pre>
+ * If you want to use a different language:
+ * wfMessage( 'email-header' )->inLanguage( $user->getOption( 'language' ) )->plain()
+ * Note that you cannot parse the text except in the content or interface
+ * languages
+ * </pre>
+ *
+ *
+ * Comparison with old wfMsg* functions:
+ *
+ * Use full parsing.
+ * wfMsgExt( 'key', array( 'parseinline' ), 'apple' );
+ * === wfMessage( 'key', 'apple' )->parse();
+ * </pre>
+ * Parseinline is used because it is more useful when pre-building html.
+ * In normal use it is better to use OutputPage::(add|wrap)WikiMsg.
+ *
+ * Places where html cannot be used. {{-transformation is done.
+ * wfMsgExt( 'key', array( 'parsemag' ), 'apple', 'pear' );
+ * === wfMessage( 'key', 'apple', 'pear' )->text();
+ * </pre>
+ *
+ * Shortcut for escaping the message too, similar to wfMsgHTML, but
+ * parameters are not replaced after escaping by default.
+ * $escaped = wfMessage( 'key' )->rawParams( 'apple' )->escaped();
+ * </pre>
+ *
+ * TODO:
+ * - test, can we have tests?
+ * - sort out the details marked with fixme
+ *
+ * @since 1.17
+ * @author Niklas Laxström
+ */
+class Message {
+ /**
+ * In which language to get this message. True, which is the default,
+ * means the current interface language, false content language.
+ */
+ protected $interface = true;
+
+ /**
+ * In which language to get this message. Overrides the $interface
+ * variable.
+ */
+ protected $language = null;
+
+ /**
+ * The message key.
+ */
+ protected $key;
+
+ /**
+ * List of parameters which will be substituted into the message.
+ */
+ protected $parameters = array();
+
+ /**
+ * Format for the message.
+ * Supported formats are:
+ * * text (transform)
+ * * escaped (transform+htmlspecialchars)
+ * * block-parse
+ * * parse (default)
+ * * plain
+ */
+ protected $format = 'parse';
+
+ /**
+ * Whether database can be used.
+ */
+ protected $useDatabase = true;
+
+ /**
+ * Constructor.
+ * @param $key String: message key
+ * @param $params Array message parameters
+ * @return Message: $this
+ */
+ public function __construct( $key, $params = array() ) {
+ global $wgLang;
+ $this->key = $key;
+ $this->parameters = array_values( $params );
+ $this->language = $wgLang;
+ }
+
+ /**
+ * Factory function that is just wrapper for the real constructor. It is
+ * intented to be used instead of the real constructor, because it allows
+ * chaining method calls, while new objects don't.
+ * @param $key String: message key
+ * @param Varargs: parameters as Strings
+ * @return Message: $this
+ */
+ public static function newFromKey( $key /*...*/ ) {
+ $params = func_get_args();
+ array_shift( $params );
+ return new self( $key, $params );
+ }
+
+ /**
+ * Adds parameters to the parameter list of this message.
+ * @param Varargs: parameters as Strings
+ * @return Message: $this
+ */
+ public function params( /*...*/ ) {
+ $args_values = array_values( func_get_args() );
+ $this->parameters = array_merge( $this->parameters, $args_values );
+ return $this;
+ }
+
+ /**
+ * Add parameters that are substituted after parsing or escaping.
+ * In other words the parsing process cannot access the contents
+ * of this type of parameter, and you need to make sure it is
+ * sanitized beforehand. The parser will see "$n", instead.
+ * @param Varargs: raw parameters as Strings
+ * @return Message: $this
+ */
+ public function rawParams( /*...*/ ) {
+ $params = func_get_args();
+ foreach( $params as $param ) {
+ $this->parameters[] = self::rawParam( $param );
+ }
+ return $this;
+ }
+
+ /**
+ * Request the message in any language that is supported.
+ * As a side effect interface message status is unconditionally
+ * turned off.
+ * @param $lang Mixed: language code or Language object.
+ * @return Message: $this
+ */
+ public function inLanguage( $lang ) {
+ if( $lang instanceof Language ){
+ $this->language = $lang;
+ } elseif ( is_string( $lang ) ) {
+ if( $this->language->getCode() != $lang ) {
+ $this->language = Language::factory( $lang );
+ }
+ } else {
+ $type = gettype( $lang );
+ throw new MWException( __METHOD__ . " must be "
+ . "passed a String or Language object; $type given"
+ );
+ }
+ $this->interface = false;
+ return $this;
+ }
+
+ /**
+ * Request the message in the wiki's content language.
+ * @return Message: $this
+ */
+ public function inContentLanguage() {
+ global $wgContLang;
+ $this->interface = false;
+ $this->language = $wgContLang;
+ return $this;
+ }
+
+ /**
+ * Enable or disable database use.
+ * @param $value Boolean
+ * @return Message: $this
+ */
+ public function useDatabase( $value ) {
+ $this->useDatabase = (bool) $value;
+ return $this;
+ }
+
+ /**
+ * Returns the message parsed from wikitext to HTML.
+ * TODO: in PHP >= 5.2.0, we can make this a magic method,
+ * and then we can do, eg:
+ * $foo = Message::get($key);
+ * $string = "<abbr>$foo</abbr>";
+ * But we shouldn't implement that while MediaWiki still supports
+ * PHP < 5.2; or people will start using it...
+ * @return String: HTML
+ */
+ public function toString() {
+ $string = $this->getMessageText();
+
+ # Replace parameters before text parsing
+ $string = $this->replaceParameters( $string, 'before' );
+
+ # Maybe transform using the full parser
+ if( $this->format === 'parse' ) {
+ $string = $this->parseText( $string );
+ $m = array();
+ if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+ $string = $m[1];
+ }
+ } elseif( $this->format === 'block-parse' ){
+ $string = $this->parseText( $string );
+ } elseif( $this->format === 'text' ){
+ $string = $this->transformText( $string );
+ } elseif( $this->format === 'escaped' ){
+ # FIXME: Sanitizer method here?
+ $string = $this->transformText( $string );
+ $string = htmlspecialchars( $string );
+ }
+
+ # Raw parameter replacement
+ $string = $this->replaceParameters( $string, 'after' );
+
+ return $string;
+ }
+
+ /**
+ * Fully parse the text from wikitext to HTML
+ * @return String parsed HTML
+ */
+ public function parse() {
+ $this->format = 'parse';
+ return $this->toString();
+ }
+
+ /**
+ * Returns the message text. {{-transformation is done.
+ * @return String: Unescaped message text.
+ */
+ public function text() {
+ $this->format = 'text';
+ return $this->toString();
+ }
+
+ /**
+ * Returns the message text as-is, only parameters are subsituted.
+ * @return String: Unescaped untransformed message text.
+ */
+ public function plain() {
+ $this->format = 'plain';
+ return $this->toString();
+ }
+
+ /**
+ * Returns the parsed message text which is always surrounded by a block element.
+ * @return String: HTML
+ */
+ public function parseAsBlock() {
+ $this->format = 'block-parse';
+ return $this->toString();
+ }
+
+ /**
+ * Returns the message text. {{-transformation is done and the result
+ * is escaped excluding any raw parameters.
+ * @return String: Escaped message text.
+ */
+ public function escaped() {
+ $this->format = 'escaped';
+ return $this->toString();
+ }
+
+ /**
+ * Check whether a message key has been defined currently.
+ * @return Bool: true if it is and false if not.
+ */
+ public function exists() {
+ return $this->fetchMessage() !== false;
+ }
+
+ public static function rawParam( $value ) {
+ return array( 'raw' => $value );
+ }
+
+ /**
+ * Substitutes any paramaters into the message text.
+ * @param $message String, the message text
+ * @param $type String: either before or after
+ * @return String
+ */
+ protected function replaceParameters( $message, $type = 'before' ) {
+ $replacementKeys = array();
+ foreach( $this->parameters as $n => $param ) {
+ if ( $type === 'before' && !is_array( $param ) ) {
+ $replacementKeys['$' . ($n + 1)] = $param;
+ } elseif ( $type === 'after' && isset( $param['raw'] ) ) {
+ $replacementKeys['$' . ($n + 1)] = $param['raw'];
+ }
+ }
+ $message = strtr( $message, $replacementKeys );
+ return $message;
+ }
+
+ /**
+ * Wrapper for what ever method we use to parse wikitext.
+ * @param $string String: Wikitext message contents
+ * @return Wikitext parsed into HTML
+ */
+ protected function parseText( $string ) {
+ global $wgOut, $wgLang, $wgContLang;
+ if ( $this->language !== $wgLang && $this->language !== $wgContLang ) {
+ # FIXME: remove this limitation
+ throw new MWException( 'Can only parse in interface or content language' );
+ }
+ return $wgOut->parse( $string, /*linestart*/true, $this->interface );
+ }
+
+ /**
+ * Wrapper for what ever method we use to {{-transform wikitext.
+ * @param $string String: Wikitext message contents
+ * @return Wikitext with {{-constructs replaced with their values.
+ */
+ protected function transformText( $string ) {
+ global $wgMessageCache;
+ return $wgMessageCache->transform( $string, $this->interface, $this->language );
+ }
+
+ /**
+ * Returns the textual value for the message.
+ * @return Message contents or placeholder
+ */
+ protected function getMessageText() {
+ $message = $this->fetchMessage();
+ if ( $message === false ) {
+ return '&lt;' . htmlspecialchars( $this->key ) . '&gt;';
+ } else {
+ return $message;
+ }
+ }
+
+ /**
+ * Wrapper for what ever method we use to get message contents
+ */
+ protected function fetchMessage() {
+ if ( !isset( $this->message ) ) {
+ global $wgMessageCache;
+ $this->message = $wgMessageCache->get( $this->key, $this->useDatabase, $this->language );
+ }
+ return $this->message;
+ }
+
+} \ No newline at end of file
diff --git a/includes/MessageBlobStore.php b/includes/MessageBlobStore.php
new file mode 100644
index 00000000..5e6c8e5e
--- /dev/null
+++ b/includes/MessageBlobStore.php
@@ -0,0 +1,370 @@
+<?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
+ *
+ * @author Roan Kattouw
+ * @author Trevor Parscal
+ */
+
+/**
+ * This class provides access to the resource message blobs storage used by
+ * the ResourceLoader.
+ *
+ * A message blob is a JSON object containing the interface messages for a
+ * certain resource in a certain language. These message blobs are cached
+ * in the msg_resource table and automatically invalidated when one of their
+ * consistuent messages or the resource itself is changed.
+ */
+class MessageBlobStore {
+
+ /**
+ * Get the message blobs for a set of modules
+ *
+ * @param $resourceLoader ResourceLoader object
+ * @param $modules array Array of module objects keyed by module name
+ * @param $lang string Language code
+ * @return array An array mapping module names to message blobs
+ */
+ public static function get( ResourceLoader $resourceLoader, $modules, $lang ) {
+ wfProfileIn( __METHOD__ );
+ if ( !count( $modules ) ) {
+ wfProfileOut( __METHOD__ );
+ return array();
+ }
+ // Try getting from the DB first
+ $blobs = self::getFromDB( $resourceLoader, array_keys( $modules ), $lang );
+
+ // Generate blobs for any missing modules and store them in the DB
+ $missing = array_diff( array_keys( $modules ), array_keys( $blobs ) );
+ foreach ( $missing as $name ) {
+ $blob = self::insertMessageBlob( $name, $modules[$name], $lang );
+ if ( $blob ) {
+ $blobs[$name] = $blob;
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $blobs;
+ }
+
+ /**
+ * Generate and insert a new message blob. If the blob was already
+ * present, it is not regenerated; instead, the preexisting blob
+ * is fetched and returned.
+ *
+ * @param $name String: module name
+ * @param $module ResourceLoaderModule object
+ * @param $lang String: language code
+ * @return mixed Message blob or false if the module has no messages
+ */
+ public static function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
+ $blob = self::generateMessageBlob( $module, $lang );
+
+ if ( !$blob ) {
+ return false;
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+ $success = $dbw->insert( 'msg_resource', array(
+ 'mr_lang' => $lang,
+ 'mr_resource' => $name,
+ 'mr_blob' => $blob,
+ 'mr_timestamp' => $dbw->timestamp()
+ ),
+ __METHOD__,
+ array( 'IGNORE' )
+ );
+
+ if ( $success ) {
+ if ( $dbw->affectedRows() == 0 ) {
+ // Blob was already present, fetch it
+ $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array(
+ 'mr_resource' => $name,
+ 'mr_lang' => $lang,
+ ),
+ __METHOD__
+ );
+ } else {
+ // Update msg_resource_links
+ $rows = array();
+
+ foreach ( $module->getMessages() as $key ) {
+ $rows[] = array(
+ 'mrl_resource' => $name,
+ 'mrl_message' => $key
+ );
+ }
+ $dbw->insert( 'msg_resource_links', $rows,
+ __METHOD__, array( 'IGNORE' )
+ );
+ }
+ }
+
+ return $blob;
+ }
+
+ /**
+ * Update all message blobs for a given module.
+ *
+ * @param $name String: module name
+ * @param $module ResourceLoaderModule object
+ * @param $lang String: language code (optional)
+ * @return Mixed: if $lang is set, the new message blob for that language is
+ * returned if present. Otherwise, null is returned.
+ */
+ public static function updateModule( $name, ResourceLoaderModule $module, $lang = null ) {
+ $retval = null;
+
+ // Find all existing blobs for this module
+ $dbw = wfGetDB( DB_MASTER );
+ $res = $dbw->select( 'msg_resource',
+ array( 'mr_lang', 'mr_blob' ),
+ array( 'mr_resource' => $name ),
+ __METHOD__
+ );
+
+ // Build the new msg_resource rows
+ $newRows = array();
+ $now = $dbw->timestamp();
+ // Save the last-processed old and new blobs for later
+ $oldBlob = $newBlob = null;
+
+ foreach ( $res as $row ) {
+ $oldBlob = $row->mr_blob;
+ $newBlob = self::generateMessageBlob( $module, $row->mr_lang );
+
+ if ( $row->mr_lang === $lang ) {
+ $retval = $newBlob;
+ }
+ $newRows[] = array(
+ 'mr_resource' => $name,
+ 'mr_lang' => $row->mr_lang,
+ 'mr_blob' => $newBlob,
+ 'mr_timestamp' => $now
+ );
+ }
+
+ $dbw->replace( 'msg_resource',
+ array( array( 'mr_resource', 'mr_lang' ) ),
+ $newRows, __METHOD__
+ );
+
+ // Figure out which messages were added and removed
+ $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) );
+ $newMessages = array_keys( FormatJson::decode( $newBlob, true ) );
+ $added = array_diff( $newMessages, $oldMessages );
+ $removed = array_diff( $oldMessages, $newMessages );
+
+ // Delete removed messages, insert added ones
+ if ( $removed ) {
+ $dbw->delete( 'msg_resource_links', array(
+ 'mrl_resource' => $name,
+ 'mrl_message' => $removed
+ ), __METHOD__
+ );
+ }
+
+ $newLinksRows = array();
+
+ foreach ( $added as $message ) {
+ $newLinksRows[] = array(
+ 'mrl_resource' => $name,
+ 'mrl_message' => $message
+ );
+ }
+
+ if ( $newLinksRows ) {
+ $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__,
+ array( 'IGNORE' ) // just in case
+ );
+ }
+
+ return $retval;
+ }
+
+ /**
+ * Update a single message in all message blobs it occurs in.
+ *
+ * @param $key String: message key
+ */
+ public static function updateMessage( $key ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ // Keep running until the updates queue is empty.
+ // Due to update conflicts, the queue might not be emptied
+ // in one iteration.
+ $updates = null;
+ do {
+ $updates = self::getUpdatesForMessage( $key, $updates );
+
+ foreach ( $updates as $k => $update ) {
+ // Update the row on the condition that it
+ // didn't change since we fetched it by putting
+ // the timestamp in the WHERE clause.
+ $success = $dbw->update( 'msg_resource',
+ array(
+ 'mr_blob' => $update['newBlob'],
+ 'mr_timestamp' => $dbw->timestamp() ),
+ array(
+ 'mr_resource' => $update['resource'],
+ 'mr_lang' => $update['lang'],
+ 'mr_timestamp' => $update['timestamp'] ),
+ __METHOD__
+ );
+
+ // Only requeue conflicted updates.
+ // If update() returned false, don't retry, for
+ // fear of getting into an infinite loop
+ if ( !( $success && $dbw->affectedRows() == 0 ) ) {
+ // Not conflicted
+ unset( $updates[$k] );
+ }
+ }
+ } while ( count( $updates ) );
+
+ // No need to update msg_resource_links because we didn't add
+ // or remove any messages, we just changed their contents.
+ }
+
+ public static function clear() {
+ // TODO: Give this some more thought
+ // TODO: Is TRUNCATE better?
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'msg_resource', '*', __METHOD__ );
+ $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
+ }
+
+ /**
+ * Create an update queue for updateMessage()
+ *
+ * @param $key String: message key
+ * @param $prevUpdates Array: updates queue to refresh or null to build a fresh update queue
+ * @return Array: updates queue
+ */
+ private static function getUpdatesForMessage( $key, $prevUpdates = null ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ if ( is_null( $prevUpdates ) ) {
+ // Fetch all blobs referencing $key
+ $res = $dbw->select(
+ array( 'msg_resource', 'msg_resource_links' ),
+ array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
+ array( 'mrl_message' => $key, 'mr_resource=mrl_resource' ),
+ __METHOD__
+ );
+ } else {
+ // Refetch the blobs referenced by $prevUpdates
+
+ // Reorganize the (resource, lang) pairs in the format
+ // expected by makeWhereFrom2d()
+ $twoD = array();
+
+ foreach ( $prevUpdates as $update ) {
+ $twoD[$update['resource']][$update['lang']] = true;
+ }
+
+ $res = $dbw->select( 'msg_resource',
+ array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
+ $dbw->makeWhereFrom2d( $twoD, 'mr_resource', 'mr_lang' ),
+ __METHOD__
+ );
+ }
+
+ // Build the new updates queue
+ $updates = array();
+
+ foreach ( $res as $row ) {
+ $updates[] = array(
+ 'resource' => $row->mr_resource,
+ 'lang' => $row->mr_lang,
+ 'timestamp' => $row->mr_timestamp,
+ 'newBlob' => self::reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
+ );
+ }
+
+ return $updates;
+ }
+
+ /**
+ * Reencode a message blob with the updated value for a message
+ *
+ * @param $blob String: message blob (JSON object)
+ * @param $key String: message key
+ * @param $lang String: language code
+ * @return Message blob with $key replaced with its new value
+ */
+ private static function reencodeBlob( $blob, $key, $lang ) {
+ $decoded = FormatJson::decode( $blob, true );
+ $decoded[$key] = wfMsgExt( $key, array( 'language' => $lang ) );
+
+ return FormatJson::encode( (object)$decoded );
+ }
+
+ /**
+ * Get the message blobs for a set of modules from the database.
+ * Modules whose blobs are not in the database are silently dropped.
+ *
+ * @param $resourceLoader ResourceLoader object
+ * @param $modules Array of module names
+ * @param $lang String: language code
+ * @return array Array mapping module names to blobs
+ */
+ private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
+ global $wgCacheEpoch;
+ $retval = array();
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'msg_resource',
+ array( 'mr_blob', 'mr_resource', 'mr_timestamp' ),
+ array( 'mr_resource' => $modules, 'mr_lang' => $lang ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ $module = $resourceLoader->getModule( $row->mr_resource );
+ if ( !$module ) {
+ // This shouldn't be possible
+ throw new MWException( __METHOD__ . ' passed an invalid module name' );
+ }
+ // Update the module's blobs if the set of messages changed or if the blob is
+ // older than $wgCacheEpoch
+ if ( array_keys( FormatJson::decode( $row->mr_blob, true ) ) !== $module->getMessages() ||
+ wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch ) {
+ $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang );
+ } else {
+ $retval[$row->mr_resource] = $row->mr_blob;
+ }
+ }
+
+ return $retval;
+ }
+
+ /**
+ * Generate the message blob for a given module in a given language.
+ *
+ * @param $module ResourceLoaderModule object
+ * @param $lang String: language code
+ * @return String: JSON object
+ */
+ private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
+ $messages = array();
+
+ foreach ( $module->getMessages() as $key ) {
+ $messages[$key] = wfMsgExt( $key, array( 'language' => $lang ) );
+ }
+
+ return FormatJson::encode( (object)$messages );
+ }
+}
diff --git a/includes/MessageCache.php b/includes/MessageCache.php
index 2c53430f..cc14ec2b 100644
--- a/includes/MessageCache.php
+++ b/includes/MessageCache.php
@@ -18,23 +18,38 @@ define( 'MSG_CACHE_VERSION', 1 );
* @ingroup Cache
*/
class MessageCache {
- // Holds loaded messages that are defined in MediaWiki namespace.
- var $mCache;
+ /**
+ * Process local cache of loaded messages that are defined in
+ * MediaWiki namespace. First array level is a language code,
+ * second level is message key and the values are either message
+ * content prefixed with space, or !NONEXISTENT for negative
+ * caching.
+ */
+ protected $mCache;
+
+ // Should mean that database cannot be used, but check
+ protected $mDisable;
+
+ /// Lifetime for cache, used by object caching
+ protected $mExpiry;
+
+ /**
+ * Message cache has it's own parser which it uses to transform
+ * messages.
+ */
+ protected $mParserOptions, $mParser;
- var $mUseCache, $mDisable, $mExpiry;
- var $mKeys, $mParserOptions, $mParser;
+ /// Variable for tracking which variables are already loaded
+ protected $mLoadedLanguages = array();
- // Variable for tracking which variables are loaded
- var $mLoadedLanguages = array();
+ function __construct( $memCached, $useDB, $expiry ) {
+ if ( !$memCached ) {
+ $memCached = wfGetCache( CACHE_NONE );
+ }
- function __construct( &$memCached, $useDB, $expiry, /*ignored*/ $memcPrefix ) {
- $this->mUseCache = !is_null( $memCached );
- $this->mMemc = &$memCached;
+ $this->mMemc = $memCached;
$this->mDisable = !$useDB;
$this->mExpiry = $expiry;
- $this->mDisableTransform = false;
- $this->mKeys = false; # initialised on demand
- $this->mParser = null;
}
@@ -139,9 +154,9 @@ class MessageCache {
fwrite($file,"<?php\n//$hash\n\n \$this->mCache = array(");
- foreach ($array as $key => $message) {
+ foreach ( $array as $key => $message ) {
$key = $this->escapeForScript($key);
- $messages = $this->escapeForScript($message);
+ $message = $this->escapeForScript($message);
fwrite($file, "'$key' => '$message',\n");
}
@@ -177,7 +192,7 @@ class MessageCache {
* When succesfully loading from (2) or (3), all higher level caches are
* updated for the newest version.
*
- * Nothing is loaded if member variable mDisabled is true, either manually
+ * Nothing is loaded if member variable mDisable is true, either manually
* set by calling code or if message loading fails (is this possible?).
*
* Returns true if cache is already populated or it was succesfully populated,
@@ -189,10 +204,6 @@ class MessageCache {
function load( $code = false ) {
global $wgUseLocalMessageCache;
- if ( !$this->mUseCache ) {
- return true;
- }
-
if( !is_string( $code ) ) {
# This isn't really nice, so at least make a note about it and try to
# fall back
@@ -331,11 +342,10 @@ class MessageCache {
$bigConds[] = 'page_len > ' . intval( $wgMaxMsgCacheEntrySize );
# Load titles for all oversized pages in the MediaWiki namespace
- $res = $dbr->select( 'page', 'page_title', $bigConds, __METHOD__ );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ $res = $dbr->select( 'page', 'page_title', $bigConds, __METHOD__ . "($code)-big" );
+ foreach ( $res as $row ) {
$cache[$row->page_title] = '!TOO BIG';
}
- $dbr->freeResult( $res );
# Conditions to load the remaining pages with their contents
$smallConds = $conds;
@@ -345,12 +355,11 @@ class MessageCache {
$res = $dbr->select( array( 'page', 'revision', 'text' ),
array( 'page_title', 'old_text', 'old_flags' ),
- $smallConds, __METHOD__. "($code)" );
+ $smallConds, __METHOD__ . "($code)-small" );
- for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$cache[$row->page_title] = ' ' . Revision::getRevisionText( $row );
}
- $dbr->freeResult( $res );
$cache['VERSION'] = MSG_CACHE_VERSION;
wfProfileOut( __METHOD__ );
@@ -367,8 +376,12 @@ class MessageCache {
global $wgMaxMsgCacheEntrySize;
wfProfileIn( __METHOD__ );
+ if ( $this->mDisable ) {
+ wfProfileOut( __METHOD__ );
+ return;
+ }
- list( , $code ) = $this->figureMessage( $title );
+ list( $msg, $code ) = $this->figureMessage( $title );
$cacheKey = wfMemcKey( 'messages', $code );
$this->load($code);
@@ -410,6 +423,10 @@ class MessageCache {
$sidebarKey = wfMemcKey( 'sidebar', $code );
$parserMemc->delete( $sidebarKey );
}
+
+ // Update the message in the message blob store
+ global $wgContLang;
+ MessageBlobStore::updateMessage( $wgContLang->lcfirst( $msg ) );
wfRunHooks( "MessageCacheReplace", array( $title, $text ) );
@@ -420,7 +437,6 @@ class MessageCache {
* Shortcut to update caches.
*
* @param $cache Array: cached messages with a version.
- * @param $cacheKey String: Identifier for the cache.
* @param $memc Bool: Wether to update or not memcache.
* @param $code String: Language code.
* @return False on somekind of error.
@@ -454,14 +470,11 @@ class MessageCache {
}
/**
- * Returns success
* Represents a write lock on the messages key
+ *
+ * @return Boolean: success
*/
function lock($key) {
- if ( !$this->mUseCache ) {
- return true;
- }
-
$lockKey = $key . ':lock';
for ($i=0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
sleep(1);
@@ -471,10 +484,6 @@ class MessageCache {
}
function unlock($key) {
- if ( !$this->mUseCache ) {
- return;
- }
-
$lockKey = $key . ':lock';
$this->mMemc->delete( $lockKey );
}
@@ -482,28 +491,37 @@ class MessageCache {
/**
* Get a message from either the content language or the user language.
*
- * @param string $key The message cache key
- * @param bool $useDB Get the message from the DB, false to use only the localisation
- * @param string $langcode Code of the language to get the message for, if
- * it is a valid code create a language for that
- * language, if it is a string but not a valid code
- * then make a basic language object, if it is a
- * false boolean then use the current users
- * language (as a fallback for the old parameter
- * functionality), or if it is a true boolean then
- * use the wikis content language (also as a
- * fallback).
- * @param bool $isFullKey Specifies whether $key is a two part key "msg/lang".
+ * @param $key String: the message cache key
+ * @param $useDB Boolean: get the message from the DB, false to use only
+ * the localisation
+ * @param $langcode String: code of the language to get the message for, if
+ * it is a valid code create a language for that language,
+ * if it is a string but not a valid code then make a basic
+ * language object, if it is a false boolean then use the
+ * current users language (as a fallback for the old
+ * parameter functionality), or if it is a true boolean
+ * then use the wikis content language (also as a
+ * fallback).
+ * @param $isFullKey Boolean: specifies whether $key is a two part key
+ * "msg/lang".
*/
function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
- global $wgContLanguageCode, $wgContLang;
+ global $wgLanguageCode, $wgContLang;
+
+ if ( !is_string( $key ) ) {
+ throw new MWException( "Non-string key given" );
+ }
if ( strval( $key ) === '' ) {
# Shortcut: the empty key is always missing
- return '&lt;&gt;';
+ return false;
}
$lang = wfGetLangObj( $langcode );
+ if ( !$lang ) {
+ throw new MWException( "Bad lang code $langcode given" );
+ }
+
$langcode = $lang->getCode();
$message = false;
@@ -521,7 +539,7 @@ class MessageCache {
# Try the MediaWiki namespace
if( !$this->mDisable && $useDB ) {
$title = $uckey;
- if(!$isFullKey && ( $langcode != $wgContLanguageCode ) ) {
+ if(!$isFullKey && ( $langcode != $wgLanguageCode ) ) {
$title .= '/' . $langcode;
}
$message = $this->getMsgFromNamespace( $title, $langcode );
@@ -552,13 +570,13 @@ class MessageCache {
# Is this a custom message? Try the default language in the db...
if( ($message === false || $message === '-' ) &&
!$this->mDisable && $useDB &&
- !$isFullKey && ($langcode != $wgContLanguageCode) ) {
- $message = $this->getMsgFromNamespace( $uckey, $wgContLanguageCode );
+ !$isFullKey && ($langcode != $wgLanguageCode) ) {
+ $message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
}
# Final fallback
if( $message === false ) {
- return '&lt;' . htmlspecialchars($key) . '&gt;';
+ return false;
}
# Fix whitespace
@@ -568,6 +586,7 @@ class MessageCache {
'&#32;' => ' ',
# Fix for NBSP, converted to space by firefox
'&nbsp;' => "\xc2\xa0",
+ '&#160;' => "\xc2\xa0",
) );
return $message;
@@ -584,14 +603,12 @@ class MessageCache {
$type = false;
$message = false;
- if ( $this->mUseCache ) {
- $this->load( $code );
- if (isset( $this->mCache[$code][$title] ) ) {
- $entry = $this->mCache[$code][$title];
- $type = substr( $entry, 0, 1 );
- if ( $type == ' ' ) {
- return substr( $entry, 1 );
- }
+ $this->load( $code );
+ if ( isset( $this->mCache[$code][$title] ) ) {
+ $entry = $this->mCache[$code][$title];
+ $type = substr( $entry, 0, 1 );
+ if ( $type == ' ' ) {
+ return substr( $entry, 1 );
}
}
@@ -601,31 +618,23 @@ class MessageCache {
return $message;
}
- # If there is no cache entry and no placeholder, it doesn't exist
- if ( $type !== '!' ) {
- return false;
- }
-
$titleKey = wfMemcKey( 'messages', 'individual', $title );
# Try the individual message cache
- if ( $this->mUseCache ) {
- $entry = $this->mMemc->get( $titleKey );
- if ( $entry ) {
- $type = substr( $entry, 0, 1 );
-
- if ( $type === ' ' ) {
- # Ok!
- $message = substr( $entry, 1 );
- $this->mCache[$code][$title] = $entry;
- return $message;
- } elseif ( $entry === '!NONEXISTENT' ) {
- return false;
- } else {
- # Corrupt/obsolete entry, delete it
- $this->mMemc->delete( $titleKey );
- }
-
+ $entry = $this->mMemc->get( $titleKey );
+ if ( $entry ) {
+ $type = substr( $entry, 0, 1 );
+
+ if ( $type === ' ' ) {
+ # Ok!
+ $message = substr( $entry, 1 );
+ $this->mCache[$code][$title] = $entry;
+ return $message;
+ } elseif ( $entry === '!NONEXISTENT' ) {
+ return false;
+ } else {
+ # Corrupt/obsolete entry, delete it
+ $this->mMemc->delete( $titleKey );
}
}
@@ -633,10 +642,8 @@ class MessageCache {
$revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
if( $revision ) {
$message = $revision->getText();
- if ($this->mUseCache) {
- $this->mCache[$code][$title] = ' ' . $message;
- $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
- }
+ $this->mCache[$code][$title] = ' ' . $message;
+ $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
} else {
# Negative caching
# Use some special text instead of false, because false gets converted to '' somewhere
@@ -670,6 +677,7 @@ class MessageCache {
$popts = $this->getParserOptions();
$popts->setInterfaceMessage( $interface );
$popts->setTargetLanguage( $language );
+ $popts->setUserLang( $language );
$message = $this->mParser->transformMsg( $message, $popts );
}
return $message;
@@ -697,24 +705,23 @@ class MessageCache {
* Clear all stored messages. Mainly used after a mass rebuild.
*/
function clear() {
- if( $this->mUseCache ) {
- $langs = Language::getLanguageNames( false );
- foreach ( array_keys($langs) as $code ) {
- # Global cache
- $this->mMemc->delete( wfMemcKey( 'messages', $code ) );
- # Invalidate all local caches
- $this->mMemc->delete( wfMemcKey( 'messages', $code, 'hash' ) );
- }
- }
+ $langs = Language::getLanguageNames( false );
+ foreach ( array_keys($langs) as $code ) {
+ # Global cache
+ $this->mMemc->delete( wfMemcKey( 'messages', $code ) );
+ # Invalidate all local caches
+ $this->mMemc->delete( wfMemcKey( 'messages', $code, 'hash' ) );
+ }
+ $this->mLoadedLanguages = array();
}
/**
* Add a message to the cache
* @deprecated Use $wgExtensionMessagesFiles
*
- * @param mixed $key
- * @param mixed $value
- * @param string $lang The messages language, English by default
+ * @param $key Mixed
+ * @param $value Mixed
+ * @param $lang String: the messages language, English by default
*/
function addMessage( $key, $value, $lang = 'en' ) {
wfDeprecated( __METHOD__ );
@@ -726,8 +733,8 @@ class MessageCache {
* Add an associative array of message to the cache
* @deprecated Use $wgExtensionMessagesFiles
*
- * @param array $messages An associative array of key => values to be added
- * @param string $lang The messages language, English by default
+ * @param $messages Array: an associative array of key => values to be added
+ * @param $lang String: the messages language, English by default
*/
function addMessages( $messages, $lang = 'en' ) {
wfDeprecated( __METHOD__ );
@@ -739,7 +746,7 @@ class MessageCache {
* Add a 2-D array of messages by lang. Useful for extensions.
* @deprecated Use $wgExtensionMessagesFiles
*
- * @param array $messages The array to be added
+ * @param $messages Array: the array to be added
*/
function addMessagesByLang( $messages ) {
wfDeprecated( __METHOD__ );
@@ -767,15 +774,15 @@ class MessageCache {
}
public function figureMessage( $key ) {
- global $wgContLanguageCode;
+ global $wgLanguageCode;
$pieces = explode( '/', $key );
if( count( $pieces ) < 2 )
- return array( $key, $wgContLanguageCode );
+ return array( $key, $wgLanguageCode );
$lang = array_pop( $pieces );
$validCodes = Language::getLanguageNames();
if( !array_key_exists( $lang, $validCodes ) )
- return array( $key, $wgContLanguageCode );
+ return array( $key, $wgLanguageCode );
$message = implode( '/', $pieces );
return array( $message, $lang );
diff --git a/includes/Metadata.php b/includes/Metadata.php
index 0b4fbf8c..93ce4b27 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -1,6 +1,7 @@
<?php
/**
- * Metadata.php -- provides DublinCore and CreativeCommons metadata
+ * Provides DublinCore and CreativeCommons metadata
+ *
* Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
*
* This program is free software; you can redistribute it and/or modify
@@ -18,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
* @author Evan Prodromou <evan@wikitravel.org>
+ * @file
*/
abstract class RdfMetaData {
@@ -27,7 +29,7 @@ abstract class RdfMetaData {
* Constructor
* @param $article Article object
*/
- public function __construct( Article $article ){
+ public function __construct( Article $article ) {
$this->mArticle = $article;
}
@@ -61,11 +63,11 @@ abstract class RdfMetaData {
}
protected function basics() {
- global $wgContLanguageCode, $wgSitename;
+ global $wgLanguageCode, $wgSitename;
$this->element( 'title', $this->mArticle->mTitle->getText() );
$this->pageOrString( 'publisher', wfMsg( 'aboutpage' ), $wgSitename );
- $this->element( 'language', $wgContLanguageCode );
+ $this->element( 'language', $wgLanguageCode );
$this->element( 'type', 'Text' );
$this->element( 'format', 'text/html' );
$this->element( 'identifier', $this->reallyFullUrl() );
@@ -92,7 +94,7 @@ abstract class RdfMetaData {
. substr($timestamp, 6, 2);
}
- protected function pageOrString( $name, $page, $str ){
+ protected function pageOrString( $name, $page, $str ) {
if( $page instanceof Title )
$nt = $page;
else
@@ -105,7 +107,7 @@ abstract class RdfMetaData {
}
}
- protected function page( $name, $title ){
+ protected function page( $name, $title ) {
$this->url( $name, $title->getFullUrl() );
}
@@ -114,15 +116,17 @@ abstract class RdfMetaData {
print "\t\t<dc:{$name} rdf:resource=\"{$url}\" />\n";
}
- protected function person($name, User $user ){
- global $wgContLang;
-
+ protected function person( $name, User $user ) {
if( $user->isAnon() ){
$this->element( $name, wfMsgExt( 'anonymous', array( 'parsemag' ), 1 ) );
- } else if( $real = $user->getRealName() ) {
- $this->element( $name, $real );
} else {
- $this->pageOrString( $name, $user->getUserPage(), wfMsg( 'siteuser', $user->getName() ) );
+ $real = $user->getRealName();
+ if( $real ) {
+ $this->element( $name, $real );
+ } else {
+ $userName = $user->getName();
+ $this->pageOrString( $name, $user->getUserPage(), wfMsgExt( 'siteuser', 'parsemag', $userName, $userName ) );
+ }
}
}
@@ -315,4 +319,4 @@ PROLOGUE;
protected function epilogue() {
echo "</rdf:RDF>\n";
}
-} \ No newline at end of file
+}
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
index 39c82c9d..018f601d 100644
--- a/includes/MimeMagic.php
+++ b/includes/MimeMagic.php
@@ -1,15 +1,31 @@
<?php
-/** Module defining helper functions for detecting and dealing with mime types.
+/**
+ * Module defining helper functions for detecting and dealing with mime types.
*
+ * @file
*/
- /** Defines a set of well known mime types
+/**
+ * Defines a set of well known mime types
* This is used as a fallback to mime.types files.
* An extensive list of well known mime types is provided by
* the file mime.types in the includes directory.
+ *
+ * This list concatenated with mime.types is used to create a mime <-> ext
+ * map. Each line contains a mime type followed by a space separated list of
+ * extensions. If multiple extensions for a single mime type exist or if
+ * multiple mime types exist for a single extension then in most cases
+ * MediaWiki assumes that the first extension following the mime type is the
+ * canonical extension, and the first time a mime type appears for a certain
+ * extension is considered the canonical mime type.
+ *
+ * (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES
+ * sucks because you can't redefine canonical types. This could be fixed by
+ * appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
+ * what will break? In practice this probably isn't a problem anyway -- Bryan)
*/
define('MM_WELL_KNOWN_MIME_TYPES',<<<END_STRING
-application/ogg ogg ogm ogv
+application/ogg ogx ogg ogm ogv oga spx
application/pdf pdf
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.chart-template otc
@@ -33,24 +49,28 @@ audio/midi mid midi kar
audio/mpeg mpga mpa mp2 mp3
audio/x-aiff aif aiff aifc
audio/x-wav wav
-audio/ogg ogg
+audio/ogg oga spx ogg
image/x-bmp bmp
image/gif gif
image/jpeg jpeg jpg jpe
image/png png
-image/svg+xml image/svg svg
+image/svg+xml svg
+image/svg svg
image/tiff tiff tif
-image/vnd.djvu image/x.djvu image/x-djvu djvu
+image/vnd.djvu djvu
+image/x.djvu djvu
+image/x-djvu djvu
image/x-portable-pixmap ppm
image/x-xcf xcf
text/plain txt
text/html html htm
-video/ogg ogm ogg ogv
+video/ogg ogv ogm ogg
video/mpeg mpg mpeg
END_STRING
);
- /** Defines a set of well known mime info entries
+/**
+ * Defines a set of well known mime info entries
* This is used as a fallback to mime.info files.
* An extensive list of well known mime types is provided by
* the file mime.info in the includes directory.
@@ -80,7 +100,7 @@ audio/x-aiff [AUDIO]
audio/x-wav [AUDIO]
audio/mp3 audio/mpeg [AUDIO]
application/ogg audio/ogg video/ogg [MULTIMEDIA]
-image/x-bmp image/bmp [BITMAP]
+image/x-bmp image/x-ms-bmp image/bmp [BITMAP]
image/gif [BITMAP]
image/jpeg [BITMAP]
image/png [BITMAP]
@@ -102,7 +122,7 @@ END_STRING
global $wgLoadFileinfoExtension;
if ($wgLoadFileinfoExtension) {
- if(!extension_loaded('fileinfo')) dl('fileinfo.' . PHP_SHLIB_SUFFIX);
+ wfDl( 'fileinfo' );
}
/**
@@ -396,7 +416,9 @@ class MimeMagic {
'xbm',
// Formats we recognize magic numbers for
- 'djvu', 'ogg', 'ogv', 'mid', 'pdf', 'wmf', 'xcf',
+ 'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx',
+ 'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka',
+ 'webp',
// XML formats we sure hope we recognize reliably
'svg',
@@ -404,18 +426,73 @@ class MimeMagic {
return in_array( strtolower( $extension ), $types );
}
+ /** improves a mime type using the file extension. Some file formats are very generic,
+ * so their mime type is not very meaningful. A more useful mime type can be derived
+ * by looking at the file extension. Typically, this method would be called on the
+ * result of guessMimeType().
+ *
+ * Currently, this method does the following:
+ *
+ * If $mime is "unknown/unknown" and isRecognizableExtension( $ext ) returns false,
+ * return the result of guessTypesForExtension($ext).
+ *
+ * If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
+ * gives true, return the result of guessTypesForExtension($ext).
+ *
+ * @param $mime String: the mime type, typically guessed from a file's content.
+ * @param $ext String: the file extension, as taken from the file name
+ *
+ * @return string the mime type
+ */
+ function improveTypeFromExtension( $mime, $ext ) {
+ if ( $mime === "unknown/unknown" ) {
+ if( $this->isRecognizableExtension( $ext ) ) {
+ wfDebug( __METHOD__. ": refusing to guess mime type for .$ext file, " .
+ "we should have recognized it\n" );
+ } else {
+ /* Not something we can detect, so simply
+ * trust the file extension */
+ $mime = $this->guessTypesForExtension( $ext );
+ }
+ }
+ else if ( $mime === "application/x-opc+zip" ) {
+ if ( $this->isMatchingExtension( $ext, $mime ) ) {
+ /* A known file extension for an OPC file,
+ * find the proper mime type for that file extension */
+ $mime = $this->guessTypesForExtension( $ext );
+ } else {
+ wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " .
+ ".$ext is not a known OPC extension.\n" );
+ $mime = "application/zip";
+ }
+ }
+
+ if ( isset( $this->mMimeTypeAliases[$mime] ) ) {
+ $mime = $this->mMimeTypeAliases[$mime];
+ }
+
+ wfDebug(__METHOD__.": improved mime type for .$ext: $mime\n");
+ return $mime;
+ }
/** mime type detection. This uses detectMimeType to detect the mime type of the file,
* but applies additional checks to determine some well known file formats that may be missed
- * or misinterpreter by the default mime detection (namely xml based formats like XHTML or SVG).
+ * or misinterpreter by the default mime detection (namely XML based formats like XHTML or SVG,
+ * as well as ZIP based formats like OPC/ODF files).
*
- * @param string $file The file to check
- * @param mixed $ext The file extension, or true to extract it from the filename.
- * Set it to false to ignore the extension.
+ * @param $file String: the file to check
+ * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
+ * Set it to false to ignore the extension. DEPRECATED! Set to false, use
+ * improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string the mime type of $file
*/
function guessMimeType( $file, $ext = true ) {
+ if( $ext ) { # TODO: make $ext default to false. Or better, remove it.
+ wfDebug( __METHOD__.": WARNING: use of the \$ext parameter is deprecated. " .
+ "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+ }
+
$mime = $this->doGuessMimeType( $file, $ext );
if( !$mime ) {
@@ -427,11 +504,11 @@ class MimeMagic {
$mime = $this->mMimeTypeAliases[$mime];
}
- wfDebug(__METHOD__.": final mime type of $file: $mime\n");
+ wfDebug(__METHOD__.": guessed mime type of $file: $mime\n");
return $mime;
}
- function doGuessMimeType( $file, $ext = true ) {
+ private function doGuessMimeType( $file, $ext ) { # TODO: remove $ext param
// Read a chunk of the file
wfSuppressWarnings();
$f = fopen( $file, "rt" );
@@ -442,6 +519,8 @@ class MimeMagic {
$tail = fread( $f, 65558 ); // 65558 = maximum size of a zip EOCDR
fclose( $f );
+ wfDebug( __METHOD__ . ": analyzing head and tail of $file for magic numbers.\n" );
+
// Hardcode a few magic number checks...
$headers = array(
// Multimedia...
@@ -468,6 +547,30 @@ class MimeMagic {
}
}
+ /* Look for WebM and Matroska files */
+ if( strncmp( $head, pack( "C4", 0x1a, 0x45, 0xdf, 0xa3 ), 4 ) == 0 ) {
+ $doctype = strpos( $head, "\x42\x82" );
+ if( $doctype ) {
+ // Next byte is datasize, then data (sizes larger than 1 byte are very stupid muxers)
+ $data = substr($head, $doctype+3, 8);
+ if( strncmp( $data, "matroska", 8 ) == 0 ) {
+ wfDebug( __METHOD__ . ": recognized file as video/x-matroska\n" );
+ return "video/x-matroska";
+ } else if ( strncmp( $data, "webm", 4 ) == 0 ) {
+ wfDebug( __METHOD__ . ": recognized file as video/webm\n" );
+ return "video/webm";
+ }
+ }
+ wfDebug( __METHOD__ . ": unknown EBML file\n" );
+ return "unknown/unknown";
+ }
+
+ /* Look for WebP */
+ if( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8), "WEBPVP8 ", 8 ) == 0 ) {
+ wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
+ return "image/webp";
+ }
+
/*
* Look for PHP. Check for this before HTML/XML... Warning: this is a
* heuristic, and won't match a file with a lot of non-PHP before. It
@@ -545,10 +648,10 @@ class MimeMagic {
}
}
- // Check for ZIP (before getimagesize)
+ // Check for ZIP variants (before getimagesize)
if ( strpos( $tail, "PK\x05\x06" ) !== false ) {
- wfDebug( __METHOD__.": ZIP header present at end of $file\n" );
- return $this->detectZipType( $head );
+ wfDebug( __METHOD__.": ZIP header present in $file\n" );
+ return $this->detectZipType( $head, $tail, $ext );
}
wfSuppressWarnings();
@@ -573,13 +676,24 @@ class MimeMagic {
/**
* Detect application-specific file type of a given ZIP file from its
- * header data. Currently works for OpenDocument types...
+ * header data. Currently works for OpenDocument and OpenXML types...
* If can't tell, returns 'application/zip'.
*
- * @param string $header Some reasonably-sized chunk of file header
+ * @param $header String: some reasonably-sized chunk of file header
+ * @param $tail String: the tail of the file
+ * @param $ext Mixed: the file extension, or true to extract it from the filename.
+ * Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
+ * use improveTypeFromExtension($mime, $ext) later to improve mime type.
+ *
* @return string
*/
- function detectZipType( $header ) {
+ function detectZipType( $header, $tail = null, $ext = false ) {
+ if( $ext ) { # TODO: remove $ext param
+ wfDebug( __METHOD__.": WARNING: use of the \$ext parameter is deprecated. " .
+ "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+ }
+
+ $mime = 'application/zip';
$opendocTypes = array(
'chart-template',
'chart',
@@ -601,16 +715,62 @@ class MimeMagic {
// http://lists.oasis-open.org/archives/office/200505/msg00006.html
$types = '(?:' . implode( '|', $opendocTypes ) . ')';
$opendocRegex = "/^mimetype(application\/vnd\.oasis\.opendocument\.$types)/";
- wfDebug( __METHOD__.": $opendocRegex\n" );
-
+
+ $openxmlRegex = "/^\[Content_Types\].xml/";
+
if( preg_match( $opendocRegex, substr( $header, 30 ), $matches ) ) {
$mime = $matches[1];
wfDebug( __METHOD__.": detected $mime from ZIP archive\n" );
- return $mime;
+ } elseif( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
+ $mime = "application/x-opc+zip";
+ # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
+ if( $ext !== true && $ext !== false ) {
+ /** This is the mode used by getPropsFromPath
+ * These mime's are stored in the database, where we don't really want
+ * x-opc+zip, because we use it only for internal purposes
+ */
+ if( $this->isMatchingExtension( $ext, $mime) ) {
+ /* A known file extension for an OPC file,
+ * find the proper mime type for that file extension */
+ $mime = $this->guessTypesForExtension( $ext );
+ } else {
+ $mime = "application/zip";
+ }
+ }
+ wfDebug( __METHOD__.": detected an Open Packaging Conventions archive: $mime\n" );
+ } else if( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
+ ($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
+ preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
+ if( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
+ $mime = "application/msword";
+ }
+ switch( substr( $header, 512, 6) ) {
+ case "\xEC\xA5\xC1\x00\x0E\x00":
+ case "\xEC\xA5\xC1\x00\x1C\x00":
+ case "\xEC\xA5\xC1\x00\x43\x00":
+ $mime = "application/vnd.ms-powerpoint";
+ break;
+ case "\xFD\xFF\xFF\xFF\x10\x00":
+ case "\xFD\xFF\xFF\xFF\x1F\x00":
+ case "\xFD\xFF\xFF\xFF\x22\x00":
+ case "\xFD\xFF\xFF\xFF\x23\x00":
+ case "\xFD\xFF\xFF\xFF\x28\x00":
+ case "\xFD\xFF\xFF\xFF\x29\x00":
+ case "\xFD\xFF\xFF\xFF\x10\x02":
+ case "\xFD\xFF\xFF\xFF\x1F\x02":
+ case "\xFD\xFF\xFF\xFF\x22\x02":
+ case "\xFD\xFF\xFF\xFF\x23\x02":
+ case "\xFD\xFF\xFF\xFF\x28\x02":
+ case "\xFD\xFF\xFF\xFF\x29\x02":
+ $mime = "application/vnd.msexcel";
+ break;
+ }
+
+ wfDebug( __METHOD__.": detected a MS Office document with OPC trailer\n");
} else {
wfDebug( __METHOD__.": unable to identify type of ZIP archive\n" );
- return 'application/zip';
}
+ return $mime;
}
/** Internal mime type detection, please use guessMimeType() for application code instead.
@@ -621,16 +781,21 @@ class MimeMagic {
* If the mime type is still unknown, getimagesize is used to detect the mime type if the file is an image.
* If no mime type can be determined, this function returns "unknown/unknown".
*
- * @param string $file The file to check
- * @param mixed $ext The file extension, or true to extract it from the filename.
- * Set it to false to ignore the extension.
+ * @param $file String: the file to check
+ * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
+ * Set it to false to ignore the extension. DEPRECATED! Set to false, use
+ * improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string the mime type of $file
* @access private
*/
- function detectMimeType( $file, $ext = true ) {
+ private function detectMimeType( $file, $ext = true ) {
global $wgMimeDetectorCommand;
+ if( $ext ) { # TODO: make $ext default to false. Or better, remove it.
+ wfDebug( __METHOD__.": WARNING: use of the \$ext parameter is deprecated. Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+ }
+
$m = null;
if ( $wgMimeDetectorCommand ) {
$fn = wfEscapeShellArg( $file );
@@ -717,9 +882,9 @@ class MimeMagic {
* @todo analyse file if need be
* @todo look at multiple extension, separately and together.
*
- * @param string $path full path to the image file, in case we have to look at the contents
+ * @param $path String: full path to the image file, in case we have to look at the contents
* (if null, only the mime type is used to determine the media type code).
- * @param string $mime mime type. If null it will be guessed using guessMimeType.
+ * @param $mime String: mime type. If null it will be guessed using guessMimeType.
*
* @return (int?string?) a value to be used with the MEDIATYPE_xxx constants.
*/
@@ -756,7 +921,6 @@ class MimeMagic {
}
# Check for entry for file extension
- $e = null;
if ( $path ) {
$i = strrpos( $path, '.' );
$e = strtolower( $i ? substr( $path, $i + 1 ) : '' );
@@ -819,9 +983,9 @@ class MimeMagic {
* Get the MIME types that various versions of Internet Explorer would
* detect from a chunk of the content.
*
- * @param string $fileName The file name (unused at present)
- * @param string $chunk The first 256 bytes of the file
- * @param string $proposed The MIME type proposed by the server
+ * @param $fileName String: the file name (unused at present)
+ * @param $chunk String: the first 256 bytes of the file
+ * @param $proposed String: the MIME type proposed by the server
*/
public function getIEMimeTypes( $fileName, $chunk, $proposed ) {
$ca = $this->getIEContentAnalyzer();
diff --git a/includes/Namespace.php b/includes/Namespace.php
index e8e7523f..47dc3c5f 100644
--- a/includes/Namespace.php
+++ b/includes/Namespace.php
@@ -28,7 +28,8 @@ $wgCanonicalNamespaceNames = array(
NS_CATEGORY_TALK => 'Category_talk',
);
-if( isset( $wgExtraNamespaces ) && is_array( $wgExtraNamespaces ) ) {
+/// @todo UGLY UGLY
+if( is_array( $wgExtraNamespaces ) ) {
$wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
}
@@ -112,21 +113,40 @@ class MWNamespace {
* Returns whether the specified namespace exists
*/
public static function exists( $index ) {
- global $wgCanonicalNamespaceNames;
- return isset( $wgCanonicalNamespaceNames[$index] );
+ $nslist = self::getCanonicalNamespaces();
+ return isset( $nslist[$index] );
}
+ /**
+ * Returns array of all defined namespaces with their canonical
+ * (English) names.
+ *
+ * @return \array
+ * @since 1.17
+ */
+ public static function getCanonicalNamespaces() {
+ static $namespaces = null;
+ if ( $namespaces === null ) {
+ global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
+ $namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames;
+ if ( is_array( $wgExtraNamespaces ) ) {
+ $namespaces += $wgExtraNamespaces;
+ }
+ wfRunHooks( 'CanonicalNamespaces', array( &$namespaces ) );
+ }
+ return $namespaces;
+ }
/**
- * Returns the canonical (English Wikipedia) name for a given index
+ * Returns the canonical (English) name for a given index
*
* @param $index Int: namespace index
* @return string or false if no canonical definition.
*/
public static function getCanonicalName( $index ) {
- global $wgCanonicalNamespaceNames;
- if( isset( $wgCanonicalNamespaceNames[$index] ) ) {
- return $wgCanonicalNamespaceNames[$index];
+ $nslist = self::getCanonicalNamespaces();
+ if( isset( $nslist[$index] ) ) {
+ return $nslist[$index];
} else {
return false;
}
@@ -140,11 +160,10 @@ class MWNamespace {
* @return int
*/
public static function getCanonicalIndex( $name ) {
- global $wgCanonicalNamespaceNames;
static $xNamespaces = false;
if ( $xNamespaces === false ) {
$xNamespaces = array();
- foreach ( $wgCanonicalNamespaceNames as $i => $text ) {
+ foreach ( self::getCanonicalNamespaces() as $i => $text ) {
$xNamespaces[strtolower($text)] = $i;
}
}
@@ -156,6 +175,25 @@ class MWNamespace {
}
/**
+ * Returns an array of the namespaces (by integer id) that exist on the
+ * wiki. Used primarily by the api in help documentation.
+ * @return array
+ */
+ public static function getValidNamespaces() {
+ static $mValidNamespaces = null;
+
+ if ( is_null( $mValidNamespaces ) ) {
+ foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) {
+ if ( $ns >= 0 ) {
+ $mValidNamespaces[] = $ns;
+ }
+ }
+ }
+
+ return $mValidNamespaces;
+ }
+
+ /**
* Can this namespace ever have a talk namespace?
*
* @param $index Int: namespace index
diff --git a/includes/NamespaceCompat.php b/includes/NamespaceCompat.php
deleted file mode 100644
index 15c76478..00000000
--- a/includes/NamespaceCompat.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-/**
- * For compatibility with extensions...
- * Will still die on PHP 5.3, of course. :P
- */
-class Namespace extends MWNamespace {
- // ..
-}
diff --git a/includes/ObjectCache.php b/includes/ObjectCache.php
index f83e0020..db22c074 100644
--- a/includes/ObjectCache.php
+++ b/includes/ObjectCache.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Functions to get cache objects
+ *
* @file
* @ingroup Cache
*/
@@ -66,6 +68,8 @@ function &wfGetCache( $inputType ) {
$wgCaches[CACHE_ACCEL] = new APCBagOStuff;
} elseif( function_exists( 'xcache_get' ) ) {
$wgCaches[CACHE_ACCEL] = new XCacheBagOStuff();
+ } elseif( function_exists( 'wincache_ucache_get' ) ) {
+ $wgCaches[CACHE_ACCEL] = new WinCacheBagOStuff();
} else {
$wgCaches[CACHE_ACCEL] = false;
}
diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php
index 91819cc7..8f310da2 100644
--- a/includes/OutputHandler.php
+++ b/includes/OutputHandler.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Functions to be used with PHP's output buffer
+ *
+ * @file
+ */
/**
* Standard output handler for use with ob_start
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 97e26110..6ecc2754 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -1,6 +1,7 @@
<?php
-if ( ! defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
die( 1 );
+}
/**
* @todo document
@@ -8,13 +9,23 @@ if ( ! defined( 'MEDIAWIKI' ) )
class OutputPage {
var $mMetatags = array(), $mKeywords = array(), $mLinktags = array();
var $mExtStyles = array();
- var $mPagetitle = '', $mBodytext = '', $mDebugtext = '';
- var $mHTMLtitle = '', $mHTMLtitleFromPagetitle = true, $mIsarticle = true, $mPrintable = false;
+ var $mPagetitle = '', $mBodytext = '';
+
+ /**
+ * Holds the debug lines that will be outputted as comments in page source if
+ * $wgDebugComments is enabled. See also $wgShowDebug.
+ * TODO: make a getter method for this
+ */
+ public $mDebugtext = '';
+
+ var $mHTMLtitle = '', $mIsarticle = true, $mPrintable = false;
var $mSubtitle = '', $mRedirect = '', $mStatusCode;
var $mLastModified = '', $mETag = false;
var $mCategoryLinks = array(), $mCategories = array(), $mLanguageLinks = array();
- var $mScripts = '', $mLinkColours, $mPageLinkTitle = '', $mHeadItems = array();
+ var $mScripts = '', $mInlineStyles = '', $mLinkColours, $mPageLinkTitle = '', $mHeadItems = array();
+ var $mModules = array(), $mModuleScripts = array(), $mModuleStyles = array(), $mModuleMessages = array();
+ var $mResourceLoader;
var $mInlineMsg = array();
var $mTemplateIds = array();
@@ -55,9 +66,10 @@ class OutputPage {
private $mIndexPolicy = 'index';
private $mFollowPolicy = 'follow';
- private $mVaryHeader = array( 'Accept-Encoding' => array('list-contains=gzip'),
- 'Cookie' => null );
-
+ private $mVaryHeader = array(
+ 'Accept-Encoding' => array( 'list-contains=gzip' ),
+ 'Cookie' => null
+ );
/**
* Constructor
@@ -99,7 +111,6 @@ class OutputPage {
$this->mStatusCode = $statusCode;
}
-
/**
* Add a new <meta> tag
* To add an http-equiv meta tag, precede the name with "http:"
@@ -148,7 +159,6 @@ class OutputPage {
$haveMeta = true;
}
-
/**
* Add raw HTML to the list of scripts (including \<script\> tag, etc.)
*
@@ -184,15 +194,19 @@ class OutputPage {
*
* @param $file String: filename in skins/common or complete on-server path
* (/foo/bar.js)
+ * @param $version String: style version of the file. Defaults to $wgStyleVersion
*/
- public function addScriptFile( $file ) {
+ public function addScriptFile( $file, $version = null ) {
global $wgStylePath, $wgStyleVersion;
- if( substr( $file, 0, 1 ) == '/' || substr( $file, 0, 7 ) == 'http://' ) {
+ // See if $file parameter is an absolute URL or begins with a slash
+ if( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
$path = $file;
} else {
- $path = "{$wgStylePath}/common/{$file}";
+ $path = "{$wgStylePath}/common/{$file}";
}
- $this->addScript( Html::linkedScript( wfAppendQuery( $path, $wgStyleVersion ) ) );
+ if ( is_null( $version ) )
+ $version = $wgStyleVersion;
+ $this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
}
/**
@@ -214,6 +228,85 @@ class OutputPage {
}
/**
+ * Get the list of modules to include on this page
+ *
+ * @return Array of module names
+ */
+ public function getModules() {
+ return array_values( array_unique( $this->mModules ) );
+ }
+
+ /**
+ * Add one or more modules recognized by the resource loader. Modules added
+ * through this function will be loaded by the resource loader when the
+ * page loads.
+ *
+ * @param $modules Mixed: module name (string) or array of module names
+ */
+ public function addModules( $modules ) {
+ $this->mModules = array_merge( $this->mModules, (array)$modules );
+ }
+
+ /**
+ * Get the list of module JS to include on this page
+ * @return array of module names
+ */
+ public function getModuleScripts() {
+ return array_values( array_unique( $this->mModuleScripts ) );
+ }
+
+ /**
+ * Add only JS of one or more modules recognized by the resource loader. Module
+ * scripts added through this function will be loaded by the resource loader when
+ * the page loads.
+ *
+ * @param $modules Mixed: module name (string) or array of module names
+ */
+ public function addModuleScripts( $modules ) {
+ $this->mModuleScripts = array_merge( $this->mModuleScripts, (array)$modules );
+ }
+
+ /**
+ * Get the list of module CSS to include on this page
+ *
+ * @return Array of module names
+ */
+ public function getModuleStyles() {
+ return array_values( array_unique( $this->mModuleStyles ) );
+ }
+
+ /**
+ * Add only CSS of one or more modules recognized by the resource loader. Module
+ * styles added through this function will be loaded by the resource loader when
+ * the page loads.
+ *
+ * @param $modules Mixed: module name (string) or array of module names
+ */
+ public function addModuleStyles( $modules ) {
+ $this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
+ }
+
+ /**
+ * Get the list of module messages to include on this page
+ *
+ * @return Array of module names
+ */
+ public function getModuleMessages() {
+ return array_values( array_unique( $this->mModuleMessages ) );
+ }
+
+ /**
+ * Add only messages of one or more modules recognized by the resource loader.
+ * Module messages added through this function will be loaded by the resource
+ * loader when the page loads.
+ *
+ * @param $modules Mixed: module name (string) or array of module names
+ */
+ public function addModuleMessages( $modules ) {
+ $this->mModuleMessages = array_merge( $this->mModuleMessages, (array)$modules );
+ }
+
+ /**
* Get all header items in a string
*
* @return String
@@ -275,7 +368,6 @@ class OutputPage {
return $this->mArticleBodyOnly;
}
-
/**
* checkLastModified tells the client to use the client-cached page if
* possible. If sucessful, the OutputPage is disabled so that
@@ -352,7 +444,7 @@ class OutputPage {
# Not modified
# Give a 304 response code and disable body output
wfDebug( __METHOD__ . ": NOT MODIFIED, $info\n", false );
- ini_set('zlib.output_compression', 0);
+ ini_set( 'zlib.output_compression', 0 );
$wgRequest->response()->header( "HTTP/1.1 304 Not Modified" );
$this->sendCacheControl();
$this->disable();
@@ -365,6 +457,15 @@ class OutputPage {
return true;
}
+ /**
+ * Override the last modified timestamp
+ *
+ * @param $timestamp String: new timestamp, in a format readable by
+ * wfTimestamp()
+ */
+ public function setLastModified( $timestamp ) {
+ $this->mLastModified = wfTimestamp( TS_RFC2822, $timestamp );
+ }
/**
* Set the robot policy for the page: <http://www.robotstxt.org/meta.html>
@@ -377,10 +478,10 @@ class OutputPage {
public function setRobotPolicy( $policy ) {
$policy = Article::formatRobotPolicy( $policy );
- if( isset( $policy['index'] ) ){
+ if( isset( $policy['index'] ) ) {
$this->setIndexPolicy( $policy['index'] );
}
- if( isset( $policy['follow'] ) ){
+ if( isset( $policy['follow'] ) ) {
$this->setFollowPolicy( $policy['follow'] );
}
}
@@ -413,7 +514,6 @@ class OutputPage {
}
}
-
/**
* Set the new value of the "action text", this will be added to the
* "HTML title", separated from it with " - ".
@@ -438,17 +538,9 @@ class OutputPage {
/**
* "HTML title" means the contents of <title>.
* It is stored as plain, unescaped text and will be run through htmlspecialchars in the skin file.
- * If $name is from page title, it can only override names which are also from page title,
- * but if it is not from page title, it can override all other names.
*/
- public function setHTMLTitle( $name, $frompagetitle = false ) {
- if ( $frompagetitle && $this->mHTMLtitleFromPagetitle ) {
- $this->mHTMLtitle = $name;
- }
- elseif ( $this->mHTMLtitleFromPagetitle ) {
- $this->mHTMLtitle = $name;
- $this->mHTMLtitleFromPagetitle = false;
- }
+ public function setHTMLTitle( $name ) {
+ $this->mHTMLtitle = $name;
}
/**
@@ -472,11 +564,6 @@ class OutputPage {
$nameWithTags = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $name ) );
$this->mPagetitle = $nameWithTags;
- $taction = $this->getPageTitleActionText();
- if( !empty( $taction ) ) {
- $name .= ' - '.$taction;
- }
-
# change "<i>foo&amp;bar</i>" to "foo&bar"
$this->setHTMLTitle( wfMsg( 'pagetitle', Sanitizer::stripAllTags( $nameWithTags ) ) );
}
@@ -508,7 +595,7 @@ class OutputPage {
if ( $this->mTitle instanceof Title ) {
return $this->mTitle;
} else {
- wfDebug( __METHOD__ . ' called and $mTitle is null. Return $wgTitle for sanity' );
+ wfDebug( __METHOD__ . " called and \$mTitle is null. Return \$wgTitle for sanity\n" );
global $wgTitle;
return $wgTitle;
}
@@ -541,7 +628,6 @@ class OutputPage {
return $this->mSubtitle;
}
-
/**
* Set the page as printable, i.e. it'll be displayed with with all
* print styles included
@@ -559,7 +645,6 @@ class OutputPage {
return $this->mPrintable;
}
-
/**
* Disable output completely, i.e. calling output() will have no effect
*/
@@ -576,7 +661,6 @@ class OutputPage {
return $this->mDoNothing;
}
-
/**
* Show an "add new section" link?
*
@@ -595,7 +679,6 @@ class OutputPage {
return $this->mHideNewSectionLink;
}
-
/**
* Add or remove feed links in the page header
* This is mainly kept for backward compatibility, see OutputPage::addFeedLink()
@@ -642,7 +725,11 @@ class OutputPage {
* @param $href String: URL
*/
public function addFeedLink( $format, $href ) {
- $this->mFeedLinks[$format] = $href;
+ global $wgAdvertisedFeedTypes;
+
+ if ( in_array( $format, $wgAdvertisedFeedTypes ) ) {
+ $this->mFeedLinks[$format] = $href;
+ }
}
/**
@@ -716,7 +803,6 @@ class OutputPage {
return $this->mIsArticleRelated;
}
-
/**
* Add new language links
*
@@ -746,7 +832,6 @@ class OutputPage {
return $this->mLanguageLinks;
}
-
/**
* Add an array of categories, with names in the keys
*
@@ -769,7 +854,7 @@ class OutputPage {
$pageTable = $dbr->tableName( 'page' );
$where = $lb->constructSet( 'page', $dbr );
$propsTable = $dbr->tableName( 'page_props' );
- $sql = "SELECT page_id, page_namespace, page_title, page_len, page_is_redirect, pp_value
+ $sql = "SELECT page_id, page_namespace, page_title, page_len, page_is_redirect, page_latest, pp_value
FROM $pageTable LEFT JOIN $propsTable ON pp_propname='hiddencat' AND pp_page=page_id WHERE $where";
$res = $dbr->query( $sql, __METHOD__ );
@@ -777,8 +862,10 @@ class OutputPage {
$lb->addResultToCache( LinkCache::singleton(), $res );
# Set all the values to 'normal'. This can be done with array_fill_keys in PHP 5.2.0+
- $categories = array_combine( array_keys( $categories ),
- array_fill( 0, count( $categories ), 'normal' ) );
+ $categories = array_combine(
+ array_keys( $categories ),
+ array_fill( 0, count( $categories ), 'normal' )
+ );
# Mark hidden categories
foreach ( $res as $row ) {
@@ -794,9 +881,11 @@ class OutputPage {
$origcategory = $category;
$title = Title::makeTitleSafe( NS_CATEGORY, $category );
$wgContLang->findVariantLink( $category, $title, true );
- if ( $category != $origcategory )
- if ( array_key_exists( $category, $categories ) )
+ if ( $category != $origcategory ) {
+ if ( array_key_exists( $category, $categories ) ) {
continue;
+ }
+ }
$text = $wgContLang->convertHtml( $title->getText() );
$this->mCategories[] = $title->getText();
$this->mCategoryLinks[$type][] = $sk->link( $title, $text );
@@ -835,7 +924,6 @@ class OutputPage {
return $this->mCategories;
}
-
/**
* Suppress the quickbar from the output, only for skin supporting
* the quickbar
@@ -853,7 +941,6 @@ class OutputPage {
return $this->mSuppressQuickbar;
}
-
/**
* Remove user JavaScript from scripts to load
*/
@@ -870,7 +957,6 @@ class OutputPage {
return $this->mAllowUserJs;
}
-
/**
* Prepend $text to the body HTML
*
@@ -905,7 +991,6 @@ class OutputPage {
return $this->mBodytext;
}
-
/**
* Add $text to the debug output
*
@@ -915,7 +1000,6 @@ class OutputPage {
$this->mDebugtext .= $text;
}
-
/**
* @deprecated use parserOptions() instead
*/
@@ -983,7 +1067,7 @@ class OutputPage {
}
/**
- * Add wikitext with a custom Title object and
+ * Add wikitext with a custom Title object and
*
* @param $text String: wikitext
* @param $title Title object
@@ -1001,7 +1085,7 @@ class OutputPage {
*/
public function addWikiTextTidy( $text, $linestart = true ) {
$title = $this->getTitle();
- $this->addWikiTextTitleTidy($text, $title, $linestart);
+ $this->addWikiTextTitleTidy( $text, $title, $linestart );
}
/**
@@ -1022,8 +1106,10 @@ class OutputPage {
$popts = $this->parserOptions();
$oldTidy = $popts->setTidy( $tidy );
- $parserOutput = $wgParser->parse( $text, $title, $popts,
- $linestart, true, $this->mRevisionId );
+ $parserOutput = $wgParser->parse(
+ $text, $title, $popts,
+ $linestart, true, $this->mRevisionId
+ );
$popts->setTidy( $oldTidy );
@@ -1047,13 +1133,15 @@ class OutputPage {
wfDeprecated( __METHOD__ );
$popts = $this->parserOptions();
- $popts->setTidy(true);
- $parserOutput = $wgParser->parse( $text, $article->mTitle,
- $popts, true, true, $this->mRevisionId );
- $popts->setTidy(false);
- if ( $cache && $article && $parserOutput->getCacheTime() != -1 ) {
+ $popts->setTidy( true );
+ $parserOutput = $wgParser->parse(
+ $text, $article->mTitle,
+ $popts, true, true, $this->mRevisionId
+ );
+ $popts->setTidy( false );
+ if ( $cache && $article && $parserOutput->isCacheable() ) {
$parserCache = ParserCache::singleton();
- $parserCache->save( $parserOutput, $article, $popts);
+ $parserCache->save( $parserOutput, $article, $popts );
}
$this->addParserOutput( $parserOutput );
@@ -1064,29 +1152,27 @@ class OutputPage {
*/
public function addSecondaryWikiText( $text, $linestart = true ) {
wfDeprecated( __METHOD__ );
- $this->addWikiTextTitleTidy($text, $this->getTitle(), $linestart);
+ $this->addWikiTextTitleTidy( $text, $this->getTitle(), $linestart );
}
-
/**
* Add a ParserOutput object, but without Html
*
* @param $parserOutput ParserOutput object
*/
public function addParserOutputNoText( &$parserOutput ) {
- global $wgExemptFromUserRobotsControl, $wgContentNamespaces;
-
$this->mLanguageLinks += $parserOutput->getLanguageLinks();
$this->addCategoryLinks( $parserOutput->getCategories() );
$this->mNewSectionLink = $parserOutput->getNewSection();
$this->mHideNewSectionLink = $parserOutput->getHideNewSection();
$this->mParseWarnings = $parserOutput->getWarnings();
- if ( $parserOutput->getCacheTime() == -1 ) {
+ if ( !$parserOutput->isCacheable() ) {
$this->enableClientCache( false );
}
$this->mNoGallery = $parserOutput->getNoGallery();
$this->mHeadItems = array_merge( $this->mHeadItems, $parserOutput->getHeadItems() );
+ $this->addModules( $parserOutput->getModules() );
// Versioning...
foreach ( (array)$parserOutput->mTemplateIds as $ns => $dbks ) {
if ( isset( $this->mTemplateIds[$ns] ) ) {
@@ -1095,11 +1181,6 @@ class OutputPage {
$this->mTemplateIds[$ns] = $dbks;
}
}
- // Page title
- $title = $parserOutput->getTitleText();
- if ( $title != '' ) {
- $this->setPageTitle( $title );
- }
// Hooks registered in the object
global $wgParserOutputHooks;
@@ -1121,7 +1202,7 @@ class OutputPage {
function addParserOutput( &$parserOutput ) {
$this->addParserOutputNoText( $parserOutput );
$text = $parserOutput->getText();
- wfRunHooks( 'OutputPageBeforeHTML',array( &$this, &$text ) );
+ wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
$this->addHTML( $text );
}
@@ -1154,10 +1235,16 @@ class OutputPage {
throw new MWException( 'Empty $mTitle in ' . __METHOD__ );
}
$popts = $this->parserOptions();
- if ( $interface) { $popts->setInterfaceMessage(true); }
- $parserOutput = $wgParser->parse( $text, $this->getTitle(), $popts,
- $linestart, true, $this->mRevisionId );
- if ( $interface) { $popts->setInterfaceMessage(false); }
+ if ( $interface ) {
+ $popts->setInterfaceMessage( true );
+ }
+ $parserOutput = $wgParser->parse(
+ $text, $this->getTitle(), $popts,
+ $linestart, true, $this->mRevisionId
+ );
+ if ( $interface ) {
+ $popts->setInterfaceMessage( false );
+ }
return $parserOutput->getText();
}
@@ -1192,7 +1279,7 @@ class OutputPage {
wfDeprecated( __METHOD__ );
$parserOutput = ParserCache::singleton()->get( $article, $article->getParserOptions() );
- if ($parserOutput !== false) {
+ if ( $parserOutput !== false ) {
$this->addParserOutput( $parserOutput );
return true;
} else {
@@ -1235,21 +1322,21 @@ class OutputPage {
),
$wgCacheVaryCookies
);
- wfRunHooks('GetCacheVaryCookies', array( $this, &$cookies ) );
+ wfRunHooks( 'GetCacheVaryCookies', array( $this, &$cookies ) );
}
return $cookies;
}
/**
* Return whether this page is not cacheable because "useskin" or "uselang"
- * url parameters were passed
+ * URL parameters were passed.
*
* @return Boolean
*/
function uncacheableBecauseRequestVars() {
global $wgRequest;
- return $wgRequest->getText('useskin', false) === false
- && $wgRequest->getText('uselang', false) === false;
+ return $wgRequest->getText( 'useskin', false ) === false
+ && $wgRequest->getText( 'uselang', false ) === false;
}
/**
@@ -1268,11 +1355,11 @@ class OutputPage {
foreach ( $cvCookies as $cookieName ) {
# Check for a simple string match, like the way squid does it
if ( strpos( $cookieHeader, $cookieName ) !== false ) {
- wfDebug( __METHOD__.": found $cookieName\n" );
+ wfDebug( __METHOD__ . ": found $cookieName\n" );
return true;
}
}
- wfDebug( __METHOD__.": no cache-varying cookies found\n" );
+ wfDebug( __METHOD__ . ": no cache-varying cookies found\n" );
return false;
}
@@ -1281,16 +1368,16 @@ class OutputPage {
*
* @param $header String: header name
* @param $option either an Array or null
+ * @fixme Document the $option parameter; it appears to be for
+ * X-Vary-Options but what format is acceptable?
*/
public function addVaryHeader( $header, $option = null ) {
if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
- $this->mVaryHeader[$header] = $option;
- }
- elseif( is_array( $option ) ) {
+ $this->mVaryHeader[$header] = (array)$option;
+ } elseif( is_array( $option ) ) {
if( is_array( $this->mVaryHeader[$header] ) ) {
$this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
- }
- else {
+ } else {
$this->mVaryHeader[$header] = $option;
}
}
@@ -1304,22 +1391,23 @@ class OutputPage {
*/
public function getXVO() {
$cvCookies = $this->getCacheVaryCookies();
-
+
$cookiesOption = array();
foreach ( $cvCookies as $cookieName ) {
$cookiesOption[] = 'string-contains=' . $cookieName;
}
$this->addVaryHeader( 'Cookie', $cookiesOption );
-
+
$headers = array();
foreach( $this->mVaryHeader as $header => $option ) {
$newheader = $header;
- if( is_array( $option ) )
+ if( is_array( $option ) ) {
$newheader .= ';' . implode( ';', $option );
+ }
$headers[] = $newheader;
}
$xvo = 'X-Vary-Options: ' . implode( ',', $headers );
-
+
return $xvo;
}
@@ -1330,19 +1418,28 @@ class OutputPage {
* For example:
* /w/index.php?title=Main_page should always be served; but
* /w/index.php?title=Main_page&variant=zh-cn should never be served.
- *
- * patched by Liangent and Philip
*/
function addAcceptLanguage() {
global $wgRequest, $wgContLang;
- if( !$wgRequest->getCheck('variant') && $wgContLang->hasVariants() ) {
+ if( !$wgRequest->getCheck( 'variant' ) && $wgContLang->hasVariants() ) {
$variants = $wgContLang->getVariants();
$aloption = array();
foreach ( $variants as $variant ) {
- if( $variant === $wgContLang->getCode() )
+ if( $variant === $wgContLang->getCode() ) {
continue;
- else
- $aloption[] = "string-contains=$variant";
+ } else {
+ $aloption[] = 'string-contains=' . $variant;
+
+ // IE and some other browsers use another form of language code
+ // in their Accept-Language header, like "zh-CN" or "zh-TW".
+ // We should handle these too.
+ $ievariant = explode( '-', $variant );
+ if ( count( $ievariant ) == 2 ) {
+ $ievariant[1] = strtoupper( $ievariant[1] );
+ $ievariant = implode( '-', $ievariant );
+ $aloption[] = 'string-contains=' . $ievariant;
+ }
+ }
}
$this->addVaryHeader( 'Accept-Language', $aloption );
}
@@ -1390,8 +1487,9 @@ class OutputPage {
global $wgUseSquid, $wgUseESI, $wgUseETag, $wgSquidMaxage, $wgRequest, $wgUseXVO;
$response = $wgRequest->response();
- if ($wgUseETag && $this->mETag)
- $response->header("ETag: $this->mETag");
+ if ( $wgUseETag && $this->mETag ) {
+ $response->header( "ETag: $this->mETag" );
+ }
$this->addAcceptLanguage();
@@ -1405,8 +1503,10 @@ class OutputPage {
}
if( !$this->uncacheableBecauseRequestVars() && $this->mEnableClientCache ) {
- if( $wgUseSquid && session_id() == '' &&
- ! $this->isPrintable() && $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies() )
+ if(
+ $wgUseSquid && session_id() == '' && !$this->isPrintable() &&
+ $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
+ )
{
if ( $wgUseESI ) {
# We'll purge the proxy cache explicitly, but require end user agents
@@ -1513,12 +1613,12 @@ class OutputPage {
*/
public function output() {
global $wgUser, $wgOutputEncoding, $wgRequest;
- global $wgContLanguageCode, $wgDebugRedirects, $wgMimeType;
+ global $wgLanguageCode, $wgDebugRedirects, $wgMimeType;
global $wgUseAjax, $wgAjaxWatch;
global $wgEnableMWSuggest, $wgUniversalEditButton;
global $wgArticle;
- if( $this->mDoNothing ){
+ if( $this->mDoNothing ) {
return;
}
wfProfileIn( __METHOD__ );
@@ -1547,35 +1647,44 @@ class OutputPage {
return;
} elseif ( $this->mStatusCode ) {
$message = self::getStatusMessage( $this->mStatusCode );
- if ( $message )
+ if ( $message ) {
$wgRequest->response()->header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $message );
+ }
}
$sk = $wgUser->getSkin();
+ // Add base resources
+ $this->addModules( 'mediawiki.util' );
+ global $wgIncludeLegacyJavaScript;
+ if( $wgIncludeLegacyJavaScript ){
+ $this->addModules( 'mediawiki.legacy.wikibits' );
+ }
+
+ // Add various resources if required
if ( $wgUseAjax ) {
- $this->addScriptFile( 'ajax.js' );
+ $this->addModules( 'mediawiki.legacy.ajax' );
wfRunHooks( 'AjaxAddScript', array( &$this ) );
if( $wgAjaxWatch && $wgUser->isLoggedIn() ) {
- $this->addScriptFile( 'ajaxwatch.js' );
+ $this->addModules( 'mediawiki.legacy.ajaxwatch' );
}
- if ( $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ){
- $this->addScriptFile( 'mwsuggest.js' );
+ if ( $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ) {
+ $this->addModules( 'mediawiki.legacy.mwsuggest' );
}
}
if( $wgUser->getBoolOption( 'editsectiononrightclick' ) ) {
- $this->addScriptFile( 'rightclickedit.js' );
+ $this->addModules( 'mediawiki.action.view.rightClickEdit' );
}
if( $wgUniversalEditButton ) {
if( isset( $wgArticle ) && $this->getTitle() && $this->getTitle()->quickUserCan( 'edit' )
&& ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create' ) ) ) {
// Original UniversalEditButton
- $msg = wfMsg('edit');
+ $msg = wfMsg( 'edit' );
$this->addLink( array(
'rel' => 'alternate',
'type' => 'application/x-wiki',
@@ -1591,11 +1700,12 @@ class OutputPage {
}
}
+
# Buffer output; final headers may depend on later processing
ob_start();
$wgRequest->response()->header( "Content-type: $wgMimeType; charset={$wgOutputEncoding}" );
- $wgRequest->response()->header( 'Content-language: '.$wgContLanguageCode );
+ $wgRequest->response()->header( 'Content-language: ' . $wgLanguageCode );
// Prevent framing, if requested
$frameOptions = $this->getFrameOptions();
@@ -1603,9 +1713,8 @@ class OutputPage {
$wgRequest->response()->header( "X-Frame-Options: $frameOptions" );
}
-
- if ($this->mArticleBodyOnly) {
- $this->out($this->mBodytext);
+ if ( $this->mArticleBodyOnly ) {
+ $this->out( $this->mBodytext );
} else {
// Hook that allows last minute changes to the output page, e.g.
// adding of CSS or Javascript by extensions.
@@ -1633,7 +1742,9 @@ class OutputPage {
$outs = $ins;
} else {
$outs = $wgContLang->iconv( $wgInputEncoding, $wgOutputEncoding, $ins );
- if ( false === $outs ) { $outs = $ins; }
+ if ( false === $outs ) {
+ $outs = $ins;
+ }
}
print $outs;
}
@@ -1643,7 +1754,6 @@ class OutputPage {
*/
public static function setEncodings() {
global $wgInputEncoding, $wgOutputEncoding;
- global $wgContLang;
$wgInputEncoding = strtolower( $wgInputEncoding );
@@ -1683,7 +1793,9 @@ class OutputPage {
if( $reason == '' ) {
$reason = wfMsg( 'blockednoreason' );
}
- $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $wgUser->mBlock->mTimestamp ), true );
+ $blockTimestamp = $wgLang->timeanddate(
+ wfTimestamp( TS_MW, $wgUser->mBlock->mTimestamp ), true
+ );
$ip = wfGetIP();
$link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
@@ -1696,16 +1808,20 @@ class OutputPage {
// Search for localization in 'ipboptions'
$scBlockExpiryOptions = wfMsg( 'ipboptions' );
foreach ( explode( ',', $scBlockExpiryOptions ) as $option ) {
- if ( strpos( $option, ":" ) === false )
+ if ( strpos( $option, ':' ) === false ) {
continue;
- list( $show, $value ) = explode( ":", $option );
+ }
+ list( $show, $value ) = explode( ':', $option );
if ( $value == 'infinite' || $value == 'indefinite' ) {
$blockExpiry = $show;
break;
}
}
} else {
- $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
+ $blockExpiry = $wgLang->timeanddate(
+ wfTimestamp( TS_MW, $blockExpiry ),
+ true
+ );
}
if ( $wgUser->mBlock->mAuto ) {
@@ -1715,10 +1831,13 @@ class OutputPage {
}
/* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
- * This could be a username, an ip range, or a single ip. */
+ * This could be a username, an IP range, or a single IP. */
$intended = $wgUser->mBlock->mAddress;
- $this->addWikiMsg( $msg, $link, $reason, $ip, $name, $blockid, $blockExpiry, $intended, $blockTimestamp );
+ $this->addWikiMsg(
+ $msg, $link, $reason, $ip, $name, $blockid, $blockExpiry,
+ $intended, $blockTimestamp
+ );
# Don't auto-return to special pages
if( $return ) {
@@ -1806,9 +1925,11 @@ class OutputPage {
$groups = array_map( array( 'User', 'makeGroupLinkWiki' ),
User::getGroupsWithPermission( $permission ) );
if( $groups ) {
- $this->addWikiMsg( 'badaccess-groups',
+ $this->addWikiMsg(
+ 'badaccess-groups',
$wgLang->commaList( $groups ),
- count( $groups) );
+ count( $groups )
+ );
} else {
$this->addWikiMsg( 'badaccess-group0' );
}
@@ -1816,24 +1937,10 @@ class OutputPage {
}
/**
- * @deprecated use permissionRequired()
- */
- public function sysopRequired() {
- throw new MWException( "Call to deprecated OutputPage::sysopRequired() method\n" );
- }
-
- /**
- * @deprecated use permissionRequired()
- */
- public function developerRequired() {
- throw new MWException( "Call to deprecated OutputPage::developerRequired() method\n" );
- }
-
- /**
* Produce the stock "please login to use the wiki" page
*/
public function loginToUse() {
- global $wgUser, $wgContLang;
+ global $wgUser;
if( $wgUser->isLoggedIn() ) {
$this->permissionRequired( 'read' );
@@ -1856,13 +1963,14 @@ class OutputPage {
array( 'known', 'noclasses' )
);
$this->addHTML( wfMsgWikiHtml( 'loginreqpagetext', $loginLink ) );
- $this->addHTML( "\n<!--" . $this->getTitle()->getPrefixedUrl() . "-->" );
+ $this->addHTML( "\n<!--" . $this->getTitle()->getPrefixedUrl() . '-->' );
# Don't return to the main page if the user can't read it
# otherwise we'll end up in a pointless loop
$mainPage = Title::newMainPage();
- if( $mainPage->userCanRead() )
+ if( $mainPage->userCanRead() ) {
$this->returnToMain( null, $mainPage );
+ }
}
/**
@@ -1873,26 +1981,30 @@ class OutputPage {
* @return String: the wikitext error-messages, formatted into a list.
*/
public function formatPermissionsErrorMessage( $errors, $action = null ) {
- if ($action == null) {
- $text = wfMsgNoTrans( 'permissionserrorstext', count($errors)). "\n\n";
+ if ( $action == null ) {
+ $text = wfMsgNoTrans( 'permissionserrorstext', count( $errors ) ) . "\n\n";
} else {
- global $wgLang;
$action_desc = wfMsgNoTrans( "action-$action" );
- $text = wfMsgNoTrans( 'permissionserrorstext-withaction', count($errors), $action_desc ) . "\n\n";
+ $text = wfMsgNoTrans(
+ 'permissionserrorstext-withaction',
+ count( $errors ),
+ $action_desc
+ ) . "\n\n";
}
- if (count( $errors ) > 1) {
+ if ( count( $errors ) > 1 ) {
$text .= '<ul class="permissions-errors">' . "\n";
- foreach( $errors as $error )
- {
+ foreach( $errors as $error ) {
$text .= '<li>';
$text .= call_user_func_array( 'wfMsgNoTrans', $error );
$text .= "</li>\n";
}
$text .= '</ul>';
} else {
- $text .= "<div class=\"permissions-errors\">\n" . call_user_func_array( 'wfMsgNoTrans', reset( $errors ) ) . "\n</div>";
+ $text .= "<div class=\"permissions-errors\">\n" .
+ call_user_func_array( 'wfMsgNoTrans', reset( $errors ) ) .
+ "\n</div>";
}
return $text;
@@ -1927,25 +2039,16 @@ class OutputPage {
// If no reason is given, just supply a default "I can't let you do
// that, Dave" message. Should only occur if called by legacy code.
- if ( $protected && empty($reasons) ) {
+ if ( $protected && empty( $reasons ) ) {
$reasons[] = array( 'badaccess-group0' );
}
- if ( !empty($reasons) ) {
+ if ( !empty( $reasons ) ) {
// Permissions error
if( $source ) {
$this->setPageTitle( wfMsg( 'viewsource' ) );
$this->setSubtitle(
- wfMsg(
- 'viewsourcefor',
- $skin->link(
- $this->getTitle(),
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- )
- )
+ wfMsg( 'viewsourcefor', $skin->linkKnown( $this->getTitle() ) )
);
} else {
$this->setPageTitle( wfMsg( 'badaccess' ) );
@@ -1955,7 +2058,7 @@ class OutputPage {
// Wiki is read only
$this->setPageTitle( wfMsg( 'readonly' ) );
$reason = wfReadOnlyReason();
- $this->wrapWikiMsg( '<div class="mw-readonly-error">\n$1</div>', array( 'readonlytext', $reason ) );
+ $this->wrapWikiMsg( "<div class='mw-readonly-error'>\n$1\n</div>", array( 'readonlytext', $reason ) );
}
// Show source, if supplied
@@ -2036,8 +2139,8 @@ class OutputPage {
}
public function showFatalError( $message ) {
- $this->setPageTitle( wfMsg( "internalerror" ) );
- $this->setRobotPolicy( "noindex,nofollow" );
+ $this->setPageTitle( wfMsg( 'internalerror' ) );
+ $this->setRobotPolicy( 'noindex,nofollow' );
$this->setArticleRelated( false );
$this->enableClientCache( false );
$this->mRedirect = '';
@@ -2069,12 +2172,15 @@ class OutputPage {
*
* @param $title Title to link
* @param $query String: query string
+ * @param $text String text of the link (input is not escaped)
*/
- public function addReturnTo( $title, $query = array() ) {
+ public function addReturnTo( $title, $query = array(), $text = null ) {
global $wgUser;
- $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullUrl() ) );
- $link = wfMsgHtml( 'returnto', $wgUser->getSkin()->link(
- $title, null, array(), $query ) );
+ $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL() ) );
+ $link = wfMsgHtml(
+ 'returnto',
+ $wgUser->getSkin()->link( $title, $text, array(), $query )
+ );
$this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
}
@@ -2115,88 +2221,75 @@ class OutputPage {
/**
* @param $sk Skin The given Skin
- * @param $includeStyle Unused (?)
+ * @param $includeStyle Boolean: unused
* @return String: The doctype, opening <html>, and head element.
*/
public function headElement( Skin $sk, $includeStyle = true ) {
- global $wgDocType, $wgDTD, $wgContLanguageCode, $wgOutputEncoding, $wgMimeType;
- global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
- global $wgContLang, $wgUseTrackbacks, $wgStyleVersion, $wgHtml5, $wgWellFormedXml;
+ global $wgOutputEncoding, $wgMimeType;
+ global $wgUseTrackbacks, $wgHtml5;
global $wgUser, $wgRequest, $wgLang;
- $this->addMeta( "http:Content-Type", "$wgMimeType; charset={$wgOutputEncoding}" );
if ( $sk->commonPrintStylesheet() ) {
- $this->addStyle( 'common/wikiprintable.css', 'print' );
+ $this->addModuleStyles( 'mediawiki.legacy.wikiprintable' );
}
$sk->setupUserCss( $this );
- $ret = '';
-
- if( $wgMimeType == 'text/xml' || $wgMimeType == 'application/xhtml+xml' || $wgMimeType == 'application/xml' ) {
- $ret .= "<?xml version=\"1.0\" encoding=\"$wgOutputEncoding\" ?" . ">\n";
- }
+ $lang = wfUILang();
+ $ret = Html::htmlHeader( array( 'lang' => $lang->getCode(), 'dir' => $lang->getDir() ) );
if ( $this->getHTMLTitle() == '' ) {
- $this->setHTMLTitle( wfMsg( 'pagetitle', $this->getPageTitle() ));
+ $this->setHTMLTitle( wfMsg( 'pagetitle', $this->getPageTitle() ) );
}
- $dir = $wgContLang->getDir();
+ $openHead = Html::openElement( 'head' );
+ if ( $openHead ) {
+ # Don't bother with the newline if $head == ''
+ $ret .= "$openHead\n";
+ }
if ( $wgHtml5 ) {
- if ( $wgWellFormedXml ) {
- # Unknown elements and attributes are okay in XML, but unknown
- # named entities are well-formedness errors and will break XML
- # parsers. Thus we need a doctype that gives us appropriate
- # entity definitions. The HTML5 spec permits four legacy
- # doctypes as obsolete but conforming, so let's pick one of
- # those, although it makes our pages look like XHTML1 Strict.
- # Isn't compatibility great?
- $ret .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
- } else {
- # Much saner.
- $ret .= "<!doctype html>\n";
- }
- $ret .= "<html lang=\"$wgContLanguageCode\" dir=\"$dir\"";
- if ( $wgHtml5Version ) $ret .= " version=\"$wgHtml5Version\"";
- $ret .= ">\n";
+ # More succinct than <meta http-equiv=Content-Type>, has the
+ # same effect
+ $ret .= Html::element( 'meta', array( 'charset' => $wgOutputEncoding ) ) . "\n";
} else {
- $ret .= "<!DOCTYPE html PUBLIC \"$wgDocType\" \"$wgDTD\">\n";
- $ret .= "<html xmlns=\"{$wgXhtmlDefaultNamespace}\" ";
- foreach($wgXhtmlNamespaces as $tag => $ns) {
- $ret .= "xmlns:{$tag}=\"{$ns}\" ";
- }
- $ret .= "lang=\"$wgContLanguageCode\" dir=\"$dir\">\n";
+ $this->addMeta( 'http:Content-Type', "$wgMimeType; charset=$wgOutputEncoding" );
}
- $ret .= "<head>\n";
- $ret .= "<title>" . htmlspecialchars( $this->getHTMLTitle() ) . "</title>\n";
+ $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
+
$ret .= implode( "\n", array(
- $this->getHeadLinks(),
- $this->buildCssLinks(),
- $this->getHeadScripts( $sk ),
- $this->getHeadItems(),
- ));
- if( $sk->usercss ){
- $ret .= Html::inlineStyle( $sk->usercss );
- }
+ $this->getHeadLinks( $sk ),
+ $this->buildCssLinks( $sk ),
+ $this->getHeadItems()
+ ) );
- if ($wgUseTrackbacks && $this->isArticleRelated())
+ if ( $wgUseTrackbacks && $this->isArticleRelated() ) {
$ret .= $this->getTitle()->trackbackRDF();
+ }
- $ret .= "</head>\n";
+ $closeHead = Html::closeElement( 'head' );
+ if ( $closeHead ) {
+ $ret .= "$closeHead\n";
+ }
$bodyAttrs = array();
# Crazy edit-on-double-click stuff
$action = $wgRequest->getVal( 'action', 'view' );
- if ( $this->getTitle()->getNamespace() != NS_SPECIAL
- && !in_array( $action, array( 'edit', 'submit' ) )
- && $wgUser->getOption( 'editondblclick' ) ) {
- $bodyAttrs['ondblclick'] = "document.location = '" . Xml::escapeJsString( $this->getTitle()->getEditURL() ) . "'";
+ if (
+ $this->getTitle()->getNamespace() != NS_SPECIAL &&
+ !in_array( $action, array( 'edit', 'submit' ) ) &&
+ $wgUser->getOption( 'editondblclick' )
+ )
+ {
+ $editUrl = $this->getTitle()->getLocalUrl( $sk->editUrlOptions() );
+ $bodyAttrs['ondblclick'] = "document.location = '" .
+ Xml::escapeJsString( $editUrl ) . "'";
}
# Class bloat
+ $dir = wfUILang()->getDir();
$bodyAttrs['class'] = "mediawiki $dir";
if ( $wgLang->capitalizeAllNouns() ) {
@@ -2214,55 +2307,220 @@ class OutputPage {
$bodyAttrs['class'] .= ' ' . Sanitizer::escapeClass( 'page-' . $this->getTitle()->getPrefixedText() );
$bodyAttrs['class'] .= ' skin-' . Sanitizer::escapeClass( $wgUser->getSkin()->getSkinName() );
+ $sk->addToBodyAttributes( $this, $bodyAttrs ); // Allow skins to add body attributes they need
+ wfRunHooks( 'OutputPageBodyAttributes', array( $this, $sk, &$bodyAttrs ) );
+
$ret .= Html::openElement( 'body', $bodyAttrs ) . "\n";
return $ret;
}
/**
+ * Get a ResourceLoader object associated with this OutputPage
+ */
+ public function getResourceLoader() {
+ if ( is_null( $this->mResourceLoader ) ) {
+ $this->mResourceLoader = new ResourceLoader();
+ }
+ return $this->mResourceLoader;
+ }
+
+ /**
+ * TODO: Document
+ * @param $skin Skin
+ * @param $modules Array/string with the module name
+ * @param $only string May be styles, messages or scripts
+ * @param $useESI boolean
+ * @return string html <script> and <style> tags
+ */
+ protected function makeResourceLoaderLink( Skin $skin, $modules, $only, $useESI = false ) {
+ global $wgUser, $wgLang, $wgLoadScript, $wgResourceLoaderUseESI,
+ $wgResourceLoaderInlinePrivateModules, $wgRequest;
+ // Lazy-load ResourceLoader
+ // TODO: Should this be a static function of ResourceLoader instead?
+ $baseQuery = array(
+ 'lang' => $wgLang->getCode(),
+ 'debug' => ResourceLoader::inDebugMode() ? 'true' : 'false',
+ 'skin' => $skin->getSkinName(),
+ 'only' => $only,
+ );
+ // Propagate printable and handheld parameters if present
+ if ( $wgRequest->getBool( 'printable' ) ) {
+ $baseQuery['printable'] = 1;
+ }
+ if ( $wgRequest->getBool( 'handheld' ) ) {
+ $baseQuery['handheld'] = 1;
+ }
+
+ if ( !count( $modules ) ) {
+ return '';
+ }
+
+ if ( count( $modules ) > 1 ) {
+ // Remove duplicate module requests
+ $modules = array_unique( (array) $modules );
+ // Sort module names so requests are more uniform
+ sort( $modules );
+
+ if ( ResourceLoader::inDebugMode() ) {
+ // Recursively call us for every item
+ $links = '';
+ foreach ( $modules as $name ) {
+ $links .= $this->makeResourceLoaderLink( $skin, $name, $only, $useESI );
+ }
+ return $links;
+ }
+ }
+
+ // Create keyed-by-group list of module objects from modules list
+ $groups = array();
+ $resourceLoader = $this->getResourceLoader();
+ foreach ( (array) $modules as $name ) {
+ $module = $resourceLoader->getModule( $name );
+
+ $group = $module->getGroup();
+ if ( !isset( $groups[$group] ) ) {
+ $groups[$group] = array();
+ }
+ $groups[$group][$name] = $module;
+ }
+ $links = '';
+ foreach ( $groups as $group => $modules ) {
+ $query = $baseQuery;
+ // Special handling for user-specific groups
+ if ( ( $group === 'user' || $group === 'private' ) && $wgUser->isLoggedIn() ) {
+ $query['user'] = $wgUser->getName();
+ }
+
+ // Create a fake request based on the one we are about to make so modules return
+ // correct timestamp and emptiness data
+ $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
+ // Drop modules that know they're empty
+ foreach ( $modules as $key => $module ) {
+ if ( $module->isKnownEmpty( $context ) ) {
+ unset( $modules[$key] );
+ }
+ }
+ // If there are no modules left, skip this group
+ if ( $modules === array() ) {
+ continue;
+ }
+
+ $query['modules'] = ResourceLoader::makePackedModulesString( array_keys( $modules ) );
+
+ // Support inlining of private modules if configured as such
+ if ( $group === 'private' && $wgResourceLoaderInlinePrivateModules ) {
+ if ( $only == 'styles' ) {
+ $links .= Html::inlineStyle(
+ $resourceLoader->makeModuleResponse( $context, $modules )
+ );
+ } else {
+ $links .= Html::inlineScript(
+ ResourceLoader::makeLoaderConditionalScript(
+ $resourceLoader->makeModuleResponse( $context, $modules )
+ )
+ );
+ }
+ continue;
+ }
+ // Special handling for the user group; because users might change their stuff
+ // on-wiki like user pages, or user preferences; we need to find the highest
+ // timestamp of these user-changable modules so we can ensure cache misses on change
+ // This should NOT be done for the site group (bug 27564) because anons get that too
+ // and we shouldn't be putting timestamps in Squid-cached HTML
+ if ( $group === 'user' ) {
+ // Get the maximum timestamp
+ $timestamp = 1;
+ foreach ( $modules as $module ) {
+ $timestamp = max( $timestamp, $module->getModifiedTime( $context ) );
+ }
+ // Add a version parameter so cache will break when things change
+ $query['version'] = wfTimestamp( TS_ISO_8601_BASIC, $timestamp );
+ }
+ // Make queries uniform in order
+ ksort( $query );
+
+ $url = wfAppendQuery( $wgLoadScript, $query );
+ // Prevent the IE6 extension check from being triggered (bug 28840)
+ // by appending a character that's invalid in Windows extensions ('*')
+ $url .= '&*';
+ if ( $useESI && $wgResourceLoaderUseESI ) {
+ $esi = Xml::element( 'esi:include', array( 'src' => $url ) );
+ if ( $only == 'styles' ) {
+ $links .= Html::inlineStyle( $esi );
+ } else {
+ $links .= Html::inlineScript( $esi );
+ }
+ } else {
+ // Automatically select style/script elements
+ if ( $only === 'styles' ) {
+ $links .= Html::linkedStyle( $url ) . "\n";
+ } else {
+ $links .= Html::linkedScript( $url ) . "\n";
+ }
+ }
+ }
+ return $links;
+ }
+
+ /**
* Gets the global variables and mScripts; also adds userjs to the end if
- * enabled
+ * enabled. Despite the name, these scripts are no longer put in the
+ * <head> but at the bottom of the <body>
*
* @param $sk Skin object to use
* @return String: HTML fragment
*/
function getHeadScripts( Skin $sk ) {
- global $wgUser, $wgRequest, $wgJsMimeType, $wgUseSiteJs;
- global $wgStylePath, $wgStyleVersion;
+ global $wgUser, $wgRequest, $wgUseSiteJs;
- $scripts = Skin::makeGlobalVariablesScript( $sk->getSkinName() );
- $scripts .= Html::linkedScript( "{$wgStylePath}/common/wikibits.js?$wgStyleVersion" );
+ // Startup - this will immediately load jquery and mediawiki modules
+ $scripts = $this->makeResourceLoaderLink( $sk, 'startup', 'scripts', true );
- //add site JS if enabled:
- if( $wgUseSiteJs ) {
- $jsCache = $wgUser->isLoggedIn() ? '&smaxage=0' : '';
- $this->addScriptFile( Skin::makeUrl( '-',
- "action=raw$jsCache&gen=js&useskin=" .
- urlencode( $sk->getSkinName() )
- )
- );
+ // Configuration -- This could be merged together with the load and go, but
+ // makeGlobalVariablesScript returns a whole script tag -- grumble grumble...
+ $scripts .= Skin::makeGlobalVariablesScript( $sk->getSkinName() ) . "\n";
+
+ // Script and Messages "only" requests
+ $scripts .= $this->makeResourceLoaderLink( $sk, $this->getModuleScripts(), 'scripts' );
+ $scripts .= $this->makeResourceLoaderLink( $sk, $this->getModuleMessages(), 'messages' );
+
+ // Modules requests - let the client calculate dependencies and batch requests as it likes
+ if ( $this->getModules() ) {
+ $scripts .= Html::inlineScript(
+ ResourceLoader::makeLoaderConditionalScript(
+ Xml::encodeJsCall( 'mediaWiki.loader.load', array( $this->getModules() ) ) .
+ Xml::encodeJsCall( 'mediaWiki.loader.go', array() )
+ )
+ ) . "\n";
}
- //add user js if enabled:
- if( $this->isUserJsAllowed() && $wgUser->isLoggedIn() ) {
+ // Legacy Scripts
+ $scripts .= "\n" . $this->mScripts;
+
+ // Add site JS if enabled
+ if ( $wgUseSiteJs ) {
+ $scripts .= $this->makeResourceLoaderLink( $sk, 'site', 'scripts' );
+ }
+
+ // Add user JS if enabled - trying to load user.options as a bundle if possible
+ $userOptionsAdded = false;
+ if ( $this->isUserJsAllowed() && $wgUser->isLoggedIn() ) {
$action = $wgRequest->getVal( 'action', 'view' );
- if( $this->mTitle && $this->mTitle->isJsSubpage() and $sk->userCanPreview( $action ) ) {
+ if( $this->mTitle && $this->mTitle->isJsSubpage() && $sk->userCanPreview( $action ) ) {
# XXX: additional security check/prompt?
- $this->addInlineScript( $wgRequest->getText( 'wpTextbox1' ) );
+ $scripts .= Html::inlineScript( "\n" . $wgRequest->getText( 'wpTextbox1' ) . "\n" ) . "\n";
} else {
- $userpage = $wgUser->getUserPage();
- $scriptpage = Title::makeTitleSafe(
- NS_USER,
- $userpage->getDBkey() . '/' . $sk->getSkinName() . '.js'
+ $scripts .= $this->makeResourceLoaderLink(
+ $sk, array( 'user', 'user.options' ), 'scripts'
);
- if ( $scriptpage && $scriptpage->exists() ) {
- $userjs = Skin::makeUrl( $scriptpage->getPrefixedText(), 'action=raw&ctype=' . $wgJsMimeType );
- $this->addScriptFile( $userjs );
- }
+ $userOptionsAdded = true;
}
}
-
- $scripts .= "\n" . $this->mScripts;
+ if ( !$userOptionsAdded ) {
+ $scripts .= $this->makeResourceLoaderLink( $sk, 'user.options', 'scripts' );
+ }
+
return $scripts;
}
@@ -2280,7 +2538,7 @@ class OutputPage {
$called = true;
if ( !$wgHtml5 ) {
- $this->addMeta( 'http:Content-Style-Type', 'text/css' ); //bug 15835
+ $this->addMeta( 'http:Content-Style-Type', 'text/css' ); // bug 15835
}
$this->addMeta( 'generator', "MediaWiki $wgVersion" );
@@ -2296,15 +2554,22 @@ class OutputPage {
"/<.*?" . ">/" => '',
"/_/" => ' '
);
- $this->addMeta( 'keywords', preg_replace(array_keys($strip), array_values($strip),implode( ",", $this->mKeywords ) ) );
+ $this->addMeta(
+ 'keywords',
+ preg_replace(
+ array_keys( $strip ),
+ array_values( $strip ),
+ implode( ',', $this->mKeywords )
+ )
+ );
}
}
/**
* @return string HTML tag links to be put in the header.
*/
- public function getHeadLinks() {
- global $wgRequest, $wgFeed;
+ public function getHeadLinks( Skin $sk ) {
+ global $wgFeed;
// Ideally this should happen earlier, somewhere. :P
$this->addDefaultMeta();
@@ -2321,7 +2586,9 @@ class OutputPage {
$tags[] = Html::element( 'meta',
array(
$a => $tag[0],
- 'content' => $tag[1] ) );
+ 'content' => $tag[1]
+ )
+ );
}
foreach ( $this->mLinktags as $tag ) {
$tags[] = Html::element( 'link', $tag );
@@ -2338,7 +2605,8 @@ class OutputPage {
$format,
$link,
# Used messages: 'page-rss-feed' and 'page-atom-feed' (for an easier grep)
- wfMsg( "page-{$format}-feed", $this->getTitle()->getPrefixedText() ) );
+ wfMsg( "page-{$format}-feed", $this->getTitle()->getPrefixedText() )
+ );
}
# Recent changes feed should appear on every page (except recentchanges,
@@ -2354,17 +2622,19 @@ class OutputPage {
if ( $wgOverrideSiteFeed ) {
foreach ( $wgOverrideSiteFeed as $type => $feedUrl ) {
- $tags[] = $this->feedLink (
+ $tags[] = $this->feedLink(
$type,
htmlspecialchars( $feedUrl ),
- wfMsg( "site-{$type}-feed", $wgSitename ) );
+ wfMsg( "site-{$type}-feed", $wgSitename )
+ );
}
} elseif ( $this->getTitle()->getPrefixedText() != $rctitle->getPrefixedText() ) {
foreach ( $wgAdvertisedFeedTypes as $format ) {
$tags[] = $this->feedLink(
$format,
$rctitle->getLocalURL( "feed={$format}" ),
- wfMsg( "site-{$format}-feed", $wgSitename ) ); # For grep: 'site-rss-feed', 'site-atom-feed'.
+ wfMsg( "site-{$format}-feed", $wgSitename ) # For grep: 'site-rss-feed', 'site-atom-feed'.
+ );
}
}
}
@@ -2385,7 +2655,8 @@ class OutputPage {
'rel' => 'alternate',
'type' => "application/$type+xml",
'title' => $text,
- 'href' => $url ) );
+ 'href' => $url )
+ );
}
/**
@@ -2397,16 +2668,19 @@ class OutputPage {
* @param $condition String: for IE conditional comments, specifying an IE version
* @param $dir String: set to 'rtl' or 'ltr' for direction-specific sheets
*/
- public function addStyle( $style, $media='', $condition='', $dir='' ) {
+ public function addStyle( $style, $media = '', $condition = '', $dir = '' ) {
$options = array();
// Even though we expect the media type to be lowercase, but here we
// force it to lowercase to be safe.
- if( $media )
+ if( $media ) {
$options['media'] = $media;
- if( $condition )
+ }
+ if( $condition ) {
$options['condition'] = $condition;
- if( $dir )
+ }
+ if( $dir ) {
$options['dir'] = $dir;
+ }
$this->styles[$style] = $options;
}
@@ -2415,22 +2689,58 @@ class OutputPage {
* @param $style_css Mixed: inline CSS
*/
public function addInlineStyle( $style_css ){
- $this->mScripts .= Html::inlineStyle( $style_css );
+ $this->mInlineStyles .= Html::inlineStyle( $style_css );
}
/**
* Build a set of <link>s for the stylesheets specified in the $this->styles array.
* These will be applied to various media & IE conditionals.
+ * @param $sk Skin object
*/
- public function buildCssLinks() {
+ public function buildCssLinks( $sk ) {
+ $ret = '';
+ // Add ResourceLoader styles
+ // Split the styles into four groups
+ $styles = array( 'other' => array(), 'user' => array(), 'site' => array(), 'private' => array() );
+ $resourceLoader = $this->getResourceLoader();
+ foreach ( $this->getModuleStyles() as $name ) {
+ $group = $resourceLoader->getModule( $name )->getGroup();
+ // Modules in groups named "other" or anything different than "user", "site" or "private"
+ // will be placed in the "other" group
+ $styles[isset( $styles[$group] ) ? $group : 'other'][] = $name;
+ }
+
+ // We want site, private and user styles to override dynamically added styles from modules, but we want
+ // dynamically added styles to override statically added styles from other modules. So the order
+ // has to be other, dynamic, site, private, user
+ // Add statically added styles for other modules
+ $ret .= $this->makeResourceLoaderLink( $sk, $styles['other'], 'styles' );
+ // Add normal styles added through addStyle()/addInlineStyle() here
+ $ret .= implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
+ // Add marker tag to mark the place where the client-side loader should inject dynamic styles
+ // We use a <meta> tag with a made-up name for this because that's valid HTML
+ $ret .= Html::element( 'meta', array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ) );
+
+ // Add site, private and user styles
+ // 'private' at present only contains user.options, so put that before 'user'
+ // Any future private modules will likely have a similar user-specific character
+ foreach ( array( 'site', 'private', 'user' ) as $group ) {
+ $ret .= $this->makeResourceLoaderLink(
+ $sk, array_merge( $styles['site'], $styles['user'] ), 'styles'
+ );
+ }
+ return $ret;
+ }
+
+ public function buildCssLinksArray() {
$links = array();
foreach( $this->styles as $file => $options ) {
$link = $this->styleLink( $file, $options );
- if( $link )
- $links[] = $link;
+ if( $link ) {
+ $links[$file] = $link;
+ }
}
-
- return implode( "\n", $links );
+ return $links;
}
/**
@@ -2442,17 +2752,15 @@ class OutputPage {
* @return String: HTML fragment
*/
protected function styleLink( $style, $options ) {
- global $wgRequest;
-
if( isset( $options['dir'] ) ) {
- global $wgContLang;
- $siteDir = $wgContLang->getDir();
- if( $siteDir != $options['dir'] )
+ $siteDir = wfUILang()->getDir();
+ if( $siteDir != $options['dir'] ) {
return '';
+ }
}
if( isset( $options['media'] ) ) {
- $media = $this->transformCssMedia( $options['media'] );
+ $media = self::transformCssMedia( $options['media'] );
if( is_null( $media ) ) {
return '';
}
@@ -2484,7 +2792,7 @@ class OutputPage {
* @param $media String: current value of the "media" attribute
* @return String: modified value of the "media" attribute
*/
- function transformCssMedia( $media ) {
+ public static function transformCssMedia( $media ) {
global $wgRequest, $wgHandheldForIPhone;
// Switch in on-screen display for media testing
@@ -2522,13 +2830,13 @@ class OutputPage {
* for when rate limiting has triggered.
*/
public function rateLimited() {
- $this->setPageTitle(wfMsg('actionthrottled'));
+ $this->setPageTitle( wfMsg( 'actionthrottled' ) );
$this->setRobotPolicy( 'noindex,follow' );
$this->setArticleRelated( false );
$this->enableClientCache( false );
$this->mRedirect = '';
$this->clearHTML();
- $this->setStatusCode(503);
+ $this->setStatusCode( 503 );
$this->addWikiMsg( 'actionthrottledtext' );
$this->returnToMain( null, $this->getTitle() );
@@ -2595,11 +2903,11 @@ class OutputPage {
*
* For example:
*
- * $wgOut->wrapWikiMsg( "<div class='error'>\n$1</div>", 'some-error' );
+ * $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>", 'some-error' );
*
* Is equivalent to:
*
- * $wgOut->addWikiText( "<div class='error'>\n" . wfMsgNoTrans( 'some-error' ) . "</div>" );
+ * $wgOut->addWikiText( "<div class='error'>\n" . wfMsgNoTrans( 'some-error' ) . "\n</div>" );
*
* The newline after opening div is needed in some wikitext. See bug 19226.
*/
@@ -2628,26 +2936,15 @@ class OutputPage {
/**
* Include jQuery core. Use this to avoid loading it multiple times
- * before we get a usable script loader.
+ * before we get a usable script loader.
*
* @param $modules Array: list of jQuery modules which should be loaded
* @return Array: the list of modules which were not loaded.
+ * @since 1.16
+ * @deprecated No longer needed as of 1.17
*/
public function includeJQuery( $modules = array() ) {
- global $wgStylePath, $wgStyleVersion, $wgJsMimeType;
-
- $supportedModules = array( /** TODO: add things here */ );
- $unsupported = array_diff( $modules, $supportedModules );
-
- $params = array(
- 'type' => $wgJsMimeType,
- 'src' => "$wgStylePath/common/jquery.min.js?$wgStyleVersion",
- );
- if ( !$this->mJQueryDone ) {
- $this->mJQueryDone = true;
- $this->mScripts = Html::element( 'script', $params ) . "\n" . $this->mScripts;
- }
- return $unsupported;
+ return array();
}
}
diff --git a/includes/PageQueryPage.php b/includes/PageQueryPage.php
index a2091e8b..892ff259 100644
--- a/includes/PageQueryPage.php
+++ b/includes/PageQueryPage.php
@@ -18,8 +18,9 @@ class PageQueryPage extends QueryPage {
global $wgContLang;
$title = Title::makeTitleSafe( $row->namespace, $row->title );
$text = $row->title;
- if ($title instanceof Title)
- $text = $wgContLang->convert( $title->getPrefixedText() );
- return $skin->link( $title, htmlspecialchars($text), array(), array(), array('known', 'noclasses') );
+ if ( $title instanceof Title ) {
+ $text = $wgContLang->convert( $title->getPrefixedText() );
+ }
+ return $skin->link( $title, htmlspecialchars( $text ), array(), array(), array('known', 'noclasses') );
}
}
diff --git a/includes/Pager.php b/includes/Pager.php
index e5eef1fc..19b61e8d 100644
--- a/includes/Pager.php
+++ b/includes/Pager.php
@@ -164,7 +164,7 @@ abstract class IndexPager implements Pager {
}
/**
- * Return the result wrapper.
+ * @return ResultWrapper The result wrapper.
*/
function getResult() {
return $this->mResult;
@@ -186,12 +186,20 @@ abstract class IndexPager implements Pager {
/**
* Extract some useful data from the result object for use by
* the navigation bar, put it into $this
+ *
+ * @param $offset String: index offset, inclusive
+ * @param $limit Integer: exact query limit
+ * @param $res ResultWrapper
*/
function extractResultInfo( $offset, $limit, ResultWrapper $res ) {
$numRows = $res->numRows();
if ( $numRows ) {
+ # Remove any table prefix from index field
+ $parts = explode( '.', $this->mIndexField );
+ $indexColumn = end( $parts );
+
$row = $res->fetchRow();
- $firstIndex = $row[$this->mIndexField];
+ $firstIndex = $row[$indexColumn];
# Discard the extra result row if there is one
if ( $numRows > $this->mLimit && $numRows > 1 ) {
@@ -201,7 +209,7 @@ abstract class IndexPager implements Pager {
$this->mPastTheEndIndex = $this->mPastTheEndRow->$indexField;
$res->seek( $numRows - 2 );
$row = $res->fetchRow();
- $lastIndex = $row[$this->mIndexField];
+ $lastIndex = $row[$indexColumn];
} else {
$this->mPastTheEndRow = null;
# Setting indexes to an empty string means that they will be
@@ -211,7 +219,7 @@ abstract class IndexPager implements Pager {
$this->mPastTheEndIndex = '';
$res->seek( $numRows - 1 );
$row = $res->fetchRow();
- $lastIndex = $row[$this->mIndexField];
+ $lastIndex = $row[$indexColumn];
}
} else {
$firstIndex = '';
@@ -235,6 +243,8 @@ abstract class IndexPager implements Pager {
/**
* Get some text to go in brackets in the "function name" part of the SQL comment
+ *
+ * @return String
*/
function getSqlComment() {
return get_class( $this );
@@ -244,9 +254,9 @@ abstract class IndexPager implements Pager {
* Do a query with specified parameters, rather than using the object
* context
*
- * @param string $offset Index offset, inclusive
- * @param integer $limit Exact query limit
- * @param boolean $descending Query direction, false for ascending, true for descending
+ * @param $offset String: index offset, inclusive
+ * @param $limit Integer: exact query limit
+ * @param $descending Boolean: query direction, false for ascending, true for descending
* @return ResultWrapper
*/
function reallyDoQuery( $offset, $limit, $descending ) {
@@ -275,13 +285,15 @@ abstract class IndexPager implements Pager {
/**
* Pre-process results; useful for performing batch existence checks, etc.
*
- * @param ResultWrapper $result Result wrapper
+ * @param $result ResultWrapper
*/
protected function preprocessResults( $result ) {}
/**
* Get the formatted result list. Calls getStartBody(), formatRow() and
* getEndBody(), concatenates the results and returns them.
+ *
+ * @return String
*/
function getBody() {
if ( !$this->mQueryDone ) {
@@ -314,6 +326,11 @@ abstract class IndexPager implements Pager {
/**
* Make a self-link
+ *
+ * @param $text String: text displayed on the link
+ * @param $query Array: associative array of paramter to be in the query string
+ * @param $type String: value of the "rel" attribute
+ * @return String: HTML fragment
*/
function makeLink($text, $query = null, $type=null) {
if ( $query === null ) {
@@ -341,6 +358,8 @@ abstract class IndexPager implements Pager {
/**
* Hook into getBody(), allows text to be inserted at the start. This
* will be called even if there are no rows in the result set.
+ *
+ * @return String
*/
function getStartBody() {
return '';
@@ -348,6 +367,8 @@ abstract class IndexPager implements Pager {
/**
* Hook into getBody() for the end of the list
+ *
+ * @return String
*/
function getEndBody() {
return '';
@@ -356,6 +377,8 @@ abstract class IndexPager implements Pager {
/**
* Hook into getBody(), for the bit between the start and the
* end when there are no rows
+ *
+ * @return String
*/
function getEmptyBody() {
return '';
@@ -364,6 +387,8 @@ abstract class IndexPager implements Pager {
/**
* Title used for self-links. Override this if you want to be able to
* use a title other than $wgTitle
+ *
+ * @return Title object
*/
function getTitle() {
return $GLOBALS['wgTitle'];
@@ -371,6 +396,8 @@ abstract class IndexPager implements Pager {
/**
* Get the current skin. This can be overridden if necessary.
+ *
+ * @return Skin object
*/
function getSkin() {
if ( !isset( $this->mSkin ) ) {
@@ -384,6 +411,8 @@ abstract class IndexPager implements Pager {
* Get an array of query parameters that should be put into self-links.
* By default, all parameters passed in the URL are used, except for a
* short blacklist.
+ *
+ * @return Associative array
*/
function getDefaultQuery() {
if ( !isset( $this->mDefaultQuery ) ) {
@@ -401,6 +430,8 @@ abstract class IndexPager implements Pager {
/**
* Get the number of rows in the result set
+ *
+ * @return Integer
*/
function getNumRows() {
if ( !$this->mQueryDone ) {
@@ -411,6 +442,8 @@ abstract class IndexPager implements Pager {
/**
* Get a URL query array for the prev, next, first and last links.
+ *
+ * @return Array
*/
function getPagingQueries() {
if ( !$this->mQueryDone ) {
@@ -446,6 +479,11 @@ abstract class IndexPager implements Pager {
);
}
+ /**
+ * Returns whether to show the "navigation bar"
+ *
+ * @return Boolean
+ */
function isNavigationBarShown() {
if ( !$this->mQueryDone ) {
$this->doQuery();
@@ -459,6 +497,8 @@ abstract class IndexPager implements Pager {
* will be used. If there is no such item, the unlinked text from
* $linkTexts will be used. Both $linkTexts and $disabledTexts are arrays
* of HTML.
+ *
+ * @return Array
*/
function getPagingLinks( $linkTexts, $disabledTexts = array() ) {
$queries = $this->getPagingQueries();
@@ -501,6 +541,9 @@ abstract class IndexPager implements Pager {
* Abstract formatting function. This should return an HTML string
* representing the result row $row. Rows will be concatenated and
* returned by getBody()
+ *
+ * @param $row Object: database row
+ * @return String
*/
abstract function formatRow( $row );
@@ -513,6 +556,8 @@ abstract class IndexPager implements Pager {
* conds => WHERE conditions
* options => option array
* join_conds => JOIN conditions
+ *
+ * @return Array
*/
abstract function getQueryInfo();
@@ -544,6 +589,8 @@ abstract class IndexPager implements Pager {
* $this->mDefaultDirection member variable. That's the default for this
* particular instantiation, which is a single value. This is the set of
* all defaults for the class.
+ *
+ * @return Boolean
*/
protected function getDefaultDirections() { return false; }
}
@@ -632,7 +679,8 @@ abstract class AlphabeticPager extends IndexPager {
* enabling each one in getNavigationBar. The return type is an associa-
* tive array whose keys must exactly match the keys of the array returned
* by getIndexField(), and whose values are message keys.
- * @return array
+ *
+ * @return Array
*/
protected function getOrderTypeMessages() {
return null;
@@ -773,7 +821,7 @@ abstract class TablePager extends IndexPager {
# Make table header
foreach ( $fields as $field => $name ) {
if ( strval( $name ) == '' ) {
- $s .= "<th>&nbsp;</th>\n";
+ $s .= "<th>&#160;</th>\n";
} elseif ( $this->isFieldSortable( $field ) ) {
$query = array( 'sort' => $field, 'limit' => $this->mLimit );
if ( $field == $this->mSort ) {
@@ -826,7 +874,7 @@ abstract class TablePager extends IndexPager {
$value = isset( $row->$field ) ? $row->$field : null;
$formatted = strval( $this->formatValue( $field, $value ) );
if ( $formatted == '' ) {
- $formatted = '&nbsp;';
+ $formatted = '&#160;';
}
$s .= Xml::tags( 'td', $this->getCellAttrs( $field, $value ), $formatted );
}
@@ -836,7 +884,9 @@ abstract class TablePager extends IndexPager {
/**
* Get a class name to be applied to the given row.
- * @param object $row The database result row
+ *
+ * @param $row Object: the database result row
+ * @return String
*/
function getRowClass( $row ) {
return '';
@@ -844,20 +894,28 @@ abstract class TablePager extends IndexPager {
/**
* Get attributes to be applied to the given row.
- * @param object $row The database result row
- * @return associative array
+ *
+ * @param $row Object: the database result row
+ * @return Associative array
*/
function getRowAttrs( $row ) {
- return array( 'class' => $this->getRowClass( $row ) );
+ $class = $this->getRowClass( $row );
+ if ( $class === '' ) {
+ // Return an empty array to avoid clutter in HTML like class=""
+ return array();
+ } else {
+ return array( 'class' => $this->getRowClass( $row ) );
+ }
}
/**
* Get any extra attributes to be applied to the given cell. Don't
* take this as an excuse to hardcode styles; use classes and
* CSS instead. Row context is available in $this->mCurrentRow
+ *
* @param $field The column
* @param $value The cell contents
- * @return associative array
+ * @return Associative array
*/
function getCellAttrs( $field, $value ) {
return array( 'class' => 'TablePager_col_' . $field );
@@ -885,7 +943,9 @@ abstract class TablePager extends IndexPager {
function getNavigationBar() {
global $wgStylePath, $wgContLang;
- if ( !$this->isNavigationBarShown() ) return '';
+ if ( !$this->isNavigationBarShown() ) {
+ return '';
+ }
$path = "$wgStylePath/common/images";
$labels = array(
@@ -933,10 +993,19 @@ abstract class TablePager extends IndexPager {
/**
* Get a <select> element which has options for each of the allowed limits
+ *
+ * @return String: HTML fragment
*/
function getLimitSelect() {
global $wgLang;
- $s = "<select name=\"limit\">";
+
+ # Add the current limit from the query string
+ # to avoid that the limit is lost after clicking Go next time
+ if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) {
+ $this->mLimitsShown[] = $this->mLimit;
+ sort( $this->mLimitsShown );
+ }
+ $s = Html::openElement( 'select', array( 'name' => 'limit' ) ) . "\n";
foreach ( $this->mLimitsShown as $key => $value ) {
# The pair is either $index => $limit, in which case the $value
# will be numeric, or $limit => $text, in which case the $value
@@ -948,10 +1017,9 @@ abstract class TablePager extends IndexPager {
$limit = $key;
$text = $value;
}
- $selected = ( $limit == $this->mLimit ? 'selected="selected"' : '' );
- $s .= "<option value=\"$limit\" $selected>$text</option>\n";
+ $s .= Xml::option( $text, $limit, $limit == $this->mLimit ) . "\n";
}
- $s .= "</select>";
+ $s .= Html::closeElement( 'select' );
return $s;
}
@@ -959,6 +1027,8 @@ abstract class TablePager extends IndexPager {
* Get <input type="hidden"> elements for use in a method="get" form.
* Resubmits all defined elements of the $_GET array, except for a
* blacklist, passed in the $blacklist parameter.
+ *
+ * @return String: HTML fragment
*/
function getHiddenFields( $blacklist = array() ) {
$blacklist = (array)$blacklist;
@@ -977,43 +1047,51 @@ abstract class TablePager extends IndexPager {
/**
* Get a form containing a limit selection dropdown
+ *
+ * @return String: HTML fragment
*/
function getLimitForm() {
global $wgScript;
+ return Xml::openElement(
+ 'form',
+ array(
+ 'method' => 'get',
+ 'action' => $wgScript
+ ) ) . "\n" . $this->getLimitDropdown() . "</form>\n";
+ }
+
+ /**
+ * Gets a limit selection dropdown
+ *
+ * @return string
+ */
+ function getLimitDropdown() {
# Make the select with some explanatory text
$msgSubmit = wfMsgHtml( 'table_pager_limit_submit' );
- return
- Xml::openElement(
- 'form',
- array(
- 'method' => 'get',
- 'action' => $wgScript
- )
- ) . "\n" .
- wfMsgHtml( 'table_pager_limit', $this->getLimitSelect() ) .
+
+ return wfMsgHtml( 'table_pager_limit', $this->getLimitSelect() ) .
"\n<input type=\"submit\" value=\"$msgSubmit\"/>\n" .
- $this->getHiddenFields( array( 'limit' ) ) .
- "</form>\n";
+ $this->getHiddenFields( array( 'limit' ) );
}
/**
* Return true if the named field should be sortable by the UI, false
* otherwise
*
- * @param string $field
+ * @param $field String
*/
abstract function isFieldSortable( $field );
/**
* Format a table cell. The return value should be HTML, but use an empty
- * string not &nbsp; for empty cells. Do not include the <td> and </td>.
+ * string not &#160; for empty cells. Do not include the <td> and </td>.
*
* The current result row is available as $this->mCurrentRow, in case you
* need more context.
*
- * @param string $name The database field name
- * @param string $value The value retrieved from the database
+ * @param $name String: the database field name
+ * @param $value String: the value retrieved from the database
*/
abstract function formatValue( $name, $value );
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
index 2564fbc6..3851767f 100644
--- a/includes/PoolCounter.php
+++ b/includes/PoolCounter.php
@@ -1,6 +1,68 @@
<?php
+/**
+ * When you have many workers (threads/servers) giving service, and a
+ * cached item expensive to produce expires, you may get several workers
+ * doing the job at the same time.
+ * Given enough requests and the item expiring fast (non-cacheable,
+ * lots of edits...) that single work can end up unfairly using most (all)
+ * of the cpu of the pool. This is also known as 'Michael Jackson effect'.
+ * The PoolCounter provides semaphore semantics for restricting the number
+ * of workers that may be concurrently performing such single task.
+ *
+ * By default PoolCounter_Stub is used, which provides no locking. You
+ * can get a useful one in the PoolCounter extension.
+ */
abstract class PoolCounter {
+
+ /* Return codes */
+ const LOCKED = 1; /* Lock acquired */
+ const RELEASED = 2; /* Lock released */
+ const DONE = 3; /* Another one did the work for you */
+
+ const ERROR = -1; /* Indeterminate error */
+ const NOT_LOCKED = -2; /* Called release() with no lock held */
+ const QUEUE_FULL = -3; /* There are already maxqueue workers on this lock */
+ const TIMEOUT = -4; /* Timeout exceeded */
+ const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
+
+ /**
+ * I want to do this task and I need to do it myself.
+ *
+ * @return Locked/Error
+ */
+ abstract function acquireForMe();
+
+ /**
+ * I want to do this task, but if anyone else does it
+ * instead, it's also fine for me. I will read its cached data.
+ *
+ * @return Locked/Done/Error
+ */
+ abstract function acquireForAnyone();
+
+ /**
+ * I have successfully finished my task.
+ * Lets another one grab the lock, and returns the workers
+ * waiting on acquireForAnyone()
+ *
+ * @return Released/NotLocked/Error
+ */
+ abstract function release();
+
+ /**
+ * $key: All workers with the same key share the lock.
+ * $workers: It wouldn't be a good idea to have more than this number of
+ * workers doing the task simultaneously.
+ * $maxqueue: If this number of workers are already working/waiting,
+ * fail instead of wait.
+ * $timeout: Maximum time in seconds to wait for the lock.
+ */
+ protected $key, $workers, $maxqueue, $timeout;
+
+ /**
+ * Create a Pool counter. This should only be called from the PoolWorks.
+ */
public static function factory( $type, $key ) {
global $wgPoolCounterConf;
if ( !isset( $wgPoolCounterConf[$type] ) ) {
@@ -8,57 +70,120 @@ abstract class PoolCounter {
}
$conf = $wgPoolCounterConf[$type];
$class = $conf['class'];
+
return new $class( $conf, $type, $key );
}
-
- abstract public function acquire();
- abstract public function release();
- abstract public function wait();
-
- public function executeProtected( $mainCallback, $dirtyCallback = false ) {
- $status = $this->acquire();
- if ( !$status->isOK() ) {
- return $status;
- }
- if ( !empty( $status->value['overload'] ) ) {
- # Overloaded. Try a dirty cache entry.
- if ( $dirtyCallback ) {
- if ( call_user_func( $dirtyCallback ) ) {
- $this->release();
- return Status::newGood();
- }
- }
-
- # Wait for a thread
- $status = $this->wait();
- if ( !$status->isOK() ) {
- $this->release();
- return $status;
- }
- }
- # Call the main callback
- call_user_func( $mainCallback );
- return $this->release();
+
+ protected function __construct( $conf, $type, $key ) {
+ $this->key = $key;
+ $this->workers = $conf['workers'];
+ $this->maxqueue = $conf['maxqueue'];
+ $this->timeout = $conf['timeout'];
}
}
class PoolCounter_Stub extends PoolCounter {
- public function acquire() {
- return Status::newGood();
+ function acquireForMe() {
+ return Status::newGood( PoolCounter::LOCKED );
}
- public function release() {
- return Status::newGood();
+ function acquireForAnyone() {
+ return Status::newGood( PoolCounter::LOCKED );
}
- public function wait() {
- return Status::newGood();
+ function release() {
+ return Status::newGood( PoolCounter::RELEASED );
}
-
- public function executeProtected( $mainCallback, $dirtyCallback = false ) {
- call_user_func( $mainCallback );
- return Status::newGood();
+
+ public function __construct() {
+ /* No parameters needed */
}
}
+/**
+ * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ */
+abstract class PoolCounterWork {
+ protected $cacheable = false; //Does this override getCachedWork() ?
+
+ /**
+ * Actually perform the work, caching it if needed.
+ */
+ abstract function doWork();
+ /**
+ * Retrieve the work from cache
+ * @return mixed work result or false
+ */
+ function getCachedWork() {
+ return false;
+ }
+
+ /**
+ * A work not so good (eg. expired one) but better than an error
+ * message.
+ * @return mixed work result or false
+ */
+ function fallback() {
+ return false;
+ }
+
+ /**
+ * Do something with the error, like showing it to the user.
+ */
+ function error( $status ) {
+ return false;
+ }
+
+ /**
+ * Get the result of the work (whatever it is), or false.
+ */
+ function execute( $skipcache = false ) {
+ if ( $this->cacheable && !$skipcache ) {
+ $status = $this->poolCounter->acquireForAnyone();
+ } else {
+ $status = $this->poolCounter->acquireForMe();
+ }
+
+ if ( $status->isOK() ) {
+ switch ( $status->value ) {
+ case PoolCounter::LOCKED:
+ $result = $this->doWork();
+ $this->poolCounter->release();
+ return $result;
+
+ case PoolCounter::DONE:
+ $result = $this->getCachedWork();
+ if ( $result === false ) {
+ /* That someone else work didn't serve us.
+ * Acquire the lock for me
+ */
+ return $this->execute( true );
+ }
+ return $result;
+
+ case PoolCounter::QUEUE_FULL:
+ case PoolCounter::TIMEOUT:
+ $result = $this->fallback();
+
+ if ( $result !== false ) {
+ return $result;
+ }
+ /* no break */
+
+ /* These two cases should never be hit... */
+ case PoolCounter::ERROR:
+ default:
+ $errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' );
+
+ $status = Status::newFatal( isset($errors[$status->value]) ? $errors[$status->value] : 'pool-errorunknown' );
+ /* continue to the error */
+ }
+ }
+ return $this->error( $status );
+ }
+
+ function __construct( $type, $key ) {
+ $this->poolCounter = PoolCounter::factory( $type, $key );
+ }
+}
diff --git a/includes/Preferences.php b/includes/Preferences.php
index 70d88ec9..c8ea2cc6 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -1,5 +1,4 @@
<?php
-
/**
* We're now using the HTMLForm object with some customisation to generate the
* Preferences form. This object handles generic submission, CSRF protection,
@@ -25,19 +24,22 @@
* Once fields have been retrieved and validated, submission logic is handed
* over to the tryUISubmit static method of this class.
*/
+
class Preferences {
static $defaultPreferences = null;
- static $saveFilters =
- array(
+ static $saveFilters = array(
'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
- );
+ 'cols' => array( 'Preferences', 'filterIntval' ),
+ 'rows' => array( 'Preferences', 'filterIntval' ),
+ 'rclimit' => array( 'Preferences', 'filterIntval' ),
+ 'wllimit' => array( 'Preferences', 'filterIntval' ),
+ 'searchlimit' => array( 'Preferences', 'filterIntval' ),
+ );
static function getPreferences( $user ) {
if ( self::$defaultPreferences )
return self::$defaultPreferences;
- global $wgRCMaxAge;
-
$defaultPreferences = array();
self::profilePreferences( $user, $defaultPreferences );
@@ -63,14 +65,13 @@ class Preferences {
}
## Prod in defaults from the user
- global $wgDefaultUserOptions;
- foreach( $defaultPreferences as $name => &$info ) {
+ foreach ( $defaultPreferences as $name => &$info ) {
$prefFromUser = self::getOptionFromUser( $name, $info, $user );
- $field = HTMLForm::loadInputFromParameters( $info ); // For validation
+ $field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
$defaultOptions = User::getDefaultOptions();
$globalDefault = isset( $defaultOptions[$name] )
- ? $defaultOptions[$name]
- : null;
+ ? $defaultOptions[$name]
+ : null;
// If it validates, set it as the default
if ( isset( $info['default'] ) ) {
@@ -79,7 +80,7 @@ class Preferences {
} elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
$field->validate( $prefFromUser, $user->mOptions ) === true ) {
$info['default'] = $prefFromUser;
- } elseif( $field->validate( $globalDefault, $user->mOptions ) === true ) {
+ } elseif ( $field->validate( $globalDefault, $user->mOptions ) === true ) {
$info['default'] = $globalDefault;
} else {
throw new MWException( "Global default '$globalDefault' is invalid for field $name" );
@@ -98,13 +99,12 @@ class Preferences {
// Handling for array-type preferences
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
-
$options = HTMLFormField::flattenOptions( $info['options'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
$val = array();
- foreach( $options as $label => $value ) {
- if( $user->getOption( "$prefix$value" ) ) {
+ foreach ( $options as $value ) {
+ if ( $user->getOption( "$prefix$value" ) ) {
$val[] = $value;
}
}
@@ -117,27 +117,25 @@ class Preferences {
global $wgLang, $wgUser;
## User info #####################################
// Information panel
- $defaultPreferences['username'] =
- array(
- 'type' => 'info',
- 'label-message' => 'username',
- 'default' => $user->getName(),
- 'section' => 'personal/info',
- );
+ $defaultPreferences['username'] = array(
+ 'type' => 'info',
+ 'label-message' => 'username',
+ 'default' => $user->getName(),
+ 'section' => 'personal/info',
+ );
- $defaultPreferences['userid'] =
- array(
- 'type' => 'info',
- 'label-message' => 'uid',
- 'default' => $user->getId(),
- 'section' => 'personal/info',
- );
+ $defaultPreferences['userid'] = array(
+ 'type' => 'info',
+ 'label-message' => 'uid',
+ 'default' => $user->getId(),
+ 'section' => 'personal/info',
+ );
# Get groups to which the user belongs
$userEffectiveGroups = $user->getEffectiveGroups();
$userGroups = $userMembers = array();
- foreach( $userEffectiveGroups as $ueg ) {
- if( $ueg == '*' ) {
+ foreach ( $userEffectiveGroups as $ueg ) {
+ if ( $ueg == '*' ) {
// Skip the default * group, seems useless here
continue;
}
@@ -150,147 +148,149 @@ class Preferences {
asort( $userGroups );
asort( $userMembers );
- $defaultPreferences['usergroups'] =
- array(
- 'type' => 'info',
- 'label' => wfMsgExt( 'prefs-memberingroups', 'parseinline',
- $wgLang->formatNum( count($userGroups) ) ),
- 'default' => wfMsgExt( 'prefs-memberingroups-type', array(),
- $wgLang->commaList( $userGroups ),
- $wgLang->commaList( $userMembers )
- ),
- 'raw' => true,
- 'section' => 'personal/info',
- );
+ $defaultPreferences['usergroups'] = array(
+ 'type' => 'info',
+ 'label' => wfMsgExt(
+ 'prefs-memberingroups', 'parseinline',
+ $wgLang->formatNum( count( $userGroups ) )
+ ),
+ 'default' => wfMsgExt(
+ 'prefs-memberingroups-type', array(),
+ $wgLang->commaList( $userGroups ),
+ $wgLang->commaList( $userMembers )
+ ),
+ 'raw' => true,
+ 'section' => 'personal/info',
+ );
- $defaultPreferences['editcount'] =
- array(
- 'type' => 'info',
- 'label-message' => 'prefs-edits',
- 'default' => $wgLang->formatNum( $user->getEditCount() ),
- 'section' => 'personal/info',
- );
+ $defaultPreferences['editcount'] = array(
+ 'type' => 'info',
+ 'label-message' => 'prefs-edits',
+ 'default' => $wgLang->formatNum( $user->getEditCount() ),
+ 'section' => 'personal/info',
+ );
- if( $user->getRegistration() ) {
- $defaultPreferences['registrationdate'] =
- array(
- 'type' => 'info',
- 'label-message' => 'prefs-registration',
- 'default' => wfMsgExt( 'prefs-registration-date-time', 'parsemag',
- $wgLang->timeanddate( $user->getRegistration(), true ),
- $wgLang->date( $user->getRegistration(), true ),
- $wgLang->time( $user->getRegistration(), true ) ),
- 'section' => 'personal/info',
- );
+ if ( $user->getRegistration() ) {
+ $defaultPreferences['registrationdate'] = array(
+ 'type' => 'info',
+ 'label-message' => 'prefs-registration',
+ 'default' => wfMsgExt(
+ 'prefs-registration-date-time', 'parsemag',
+ $wgLang->timeanddate( $user->getRegistration(), true ),
+ $wgLang->date( $user->getRegistration(), true ),
+ $wgLang->time( $user->getRegistration(), true )
+ ),
+ 'section' => 'personal/info',
+ );
}
// Actually changeable stuff
global $wgAuth;
- $defaultPreferences['realname'] =
- array(
- 'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
- 'default' => $user->getRealName(),
- 'section' => 'personal/info',
- 'label-message' => 'yourrealname',
- 'help-message' => 'prefs-help-realname',
- );
+ $defaultPreferences['realname'] = array(
+ 'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
+ 'default' => $user->getRealName(),
+ 'section' => 'personal/info',
+ 'label-message' => 'yourrealname',
+ 'help-message' => 'prefs-help-realname',
+ );
- $defaultPreferences['gender'] =
- array(
- 'type' => 'select',
- 'section' => 'personal/info',
- 'options' => array(
- wfMsg( 'gender-male' ) => 'male',
- wfMsg( 'gender-female' ) => 'female',
- wfMsg( 'gender-unknown' ) => 'unknown',
- ),
- 'label-message' => 'yourgender',
- 'help-message' => 'prefs-help-gender',
- );
+ $defaultPreferences['gender'] = array(
+ 'type' => 'select',
+ 'section' => 'personal/info',
+ 'options' => array(
+ wfMsg( 'gender-male' ) => 'male',
+ wfMsg( 'gender-female' ) => 'female',
+ wfMsg( 'gender-unknown' ) => 'unknown',
+ ),
+ 'label-message' => 'yourgender',
+ 'help-message' => 'prefs-help-gender',
+ );
- if( $wgAuth->allowPasswordChange() ) {
+ if ( $wgAuth->allowPasswordChange() ) {
$link = $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'Resetpass' ),
wfMsgHtml( 'prefs-resetpass' ), array(),
array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' ) ) );
- $defaultPreferences['password'] =
- array(
- 'type' => 'info',
- 'raw' => true,
- 'default' => $link,
- 'label-message' => 'yourpassword',
- 'section' => 'personal/info',
- );
+ $defaultPreferences['password'] = array(
+ 'type' => 'info',
+ 'raw' => true,
+ 'default' => $link,
+ 'label-message' => 'yourpassword',
+ 'section' => 'personal/info',
+ );
+ }
+ global $wgCookieExpiration;
+ if ( $wgCookieExpiration > 0 ) {
+ $defaultPreferences['rememberpassword'] = array(
+ 'type' => 'toggle',
+ 'label' => wfMsgExt(
+ 'tog-rememberpassword',
+ array( 'parsemag' ),
+ $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )
+ ),
+ 'section' => 'personal/info',
+ );
}
-
- $defaultPreferences['rememberpassword'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'tog-rememberpassword',
- 'section' => 'personal/info',
- );
// Language
- global $wgContLanguageCode;
- $languages = array_reverse( Language::getLanguageNames( false ) );
- if( !array_key_exists( $wgContLanguageCode, $languages ) ) {
- $languages[$wgContLanguageCode] = $wgContLanguageCode;
+ global $wgLanguageCode;
+ $languages = Language::getLanguageNames( false );
+ if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
+ $languages[$wgLanguageCode] = $wgLanguageCode;
}
ksort( $languages );
$options = array();
- foreach( $languages as $code => $name ) {
+ foreach ( $languages as $code => $name ) {
$display = wfBCP47( $code ) . ' - ' . $name;
$options[$display] = $code;
}
- $defaultPreferences['language'] =
- array(
- 'type' => 'select',
- 'section' => 'personal/i18n',
- 'options' => $options,
- 'label-message' => 'yourlanguage',
- );
+ $defaultPreferences['language'] = array(
+ 'type' => 'select',
+ 'section' => 'personal/i18n',
+ 'options' => $options,
+ 'label-message' => 'yourlanguage',
+ );
global $wgContLang, $wgDisableLangConversion;
global $wgDisableTitleConversion;
/* see if there are multiple language variants to choose from*/
$variantArray = array();
- if( !$wgDisableLangConversion ) {
+ if ( !$wgDisableLangConversion ) {
$variants = $wgContLang->getVariants();
$languages = Language::getLanguageNames( true );
- foreach( $variants as $v ) {
+ foreach ( $variants as $v ) {
$v = str_replace( '_', '-', strtolower( $v ) );
- if( array_key_exists( $v, $languages ) ) {
+ if ( array_key_exists( $v, $languages ) ) {
// If it doesn't have a name, we'll pretend it doesn't exist
$variantArray[$v] = $languages[$v];
}
}
$options = array();
- foreach( $variantArray as $code => $name ) {
+ foreach ( $variantArray as $code => $name ) {
$display = wfBCP47( $code ) . ' - ' . $name;
$options[$display] = $code;
}
- if( count( $variantArray ) > 1 ) {
- $defaultPreferences['variant'] =
- array(
- 'label-message' => 'yourvariant',
- 'type' => 'select',
- 'options' => $options,
- 'section' => 'personal/i18n',
- );
+ if ( count( $variantArray ) > 1 ) {
+ $defaultPreferences['variant'] = array(
+ 'label-message' => 'yourvariant',
+ 'type' => 'select',
+ 'options' => $options,
+ 'section' => 'personal/i18n',
+ );
}
}
- if( count( $variantArray ) > 1 && !$wgDisableLangConversion && !$wgDisableTitleConversion ) {
+ if ( count( $variantArray ) > 1 && !$wgDisableLangConversion && !$wgDisableTitleConversion ) {
$defaultPreferences['noconvertlink'] =
array(
- 'type' => 'toggle',
- 'section' => 'personal/i18n',
- 'label-message' => 'tog-noconvertlink',
- );
+ 'type' => 'toggle',
+ 'section' => 'personal/i18n',
+ 'label-message' => 'tog-noconvertlink',
+ );
}
global $wgMaxSigChars, $wgOut, $wgParser;
@@ -298,66 +298,62 @@ class Preferences {
// show a preview of the old signature first
$oldsigWikiText = $wgParser->preSaveTransform( "~~~", new Title , $user, new ParserOptions );
$oldsigHTML = $wgOut->parseInline( $oldsigWikiText );
- $defaultPreferences['oldsig'] =
- array(
- 'type' => 'info',
- 'raw' => true,
- 'label-message' => 'tog-oldsig',
- 'default' => $oldsigHTML,
- 'section' => 'personal/signature',
- );
- $defaultPreferences['nickname'] =
- array(
- 'type' => $wgAuth->allowPropChange( 'nickname' ) ? 'text' : 'info',
- 'maxlength' => $wgMaxSigChars,
- 'label-message' => 'yournick',
- 'validation-callback' =>
- array( 'Preferences', 'validateSignature' ),
- 'section' => 'personal/signature',
- 'filter-callback' => array( 'Preferences', 'cleanSignature' ),
- );
- $defaultPreferences['fancysig'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'tog-fancysig',
- 'help-message' => 'prefs-help-signature', // show general help about signature at the bottom of the section
- 'section' => 'personal/signature'
- );
-
+ $defaultPreferences['oldsig'] = array(
+ 'type' => 'info',
+ 'raw' => true,
+ 'label-message' => 'tog-oldsig',
+ 'default' => $oldsigHTML,
+ 'section' => 'personal/signature',
+ );
+ $defaultPreferences['nickname'] = array(
+ 'type' => $wgAuth->allowPropChange( 'nickname' ) ? 'text' : 'info',
+ 'maxlength' => $wgMaxSigChars,
+ 'label-message' => 'yournick',
+ 'validation-callback' => array( 'Preferences', 'validateSignature' ),
+ 'section' => 'personal/signature',
+ 'filter-callback' => array( 'Preferences', 'cleanSignature' ),
+ );
+ $defaultPreferences['fancysig'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'tog-fancysig',
+ 'help-message' => 'prefs-help-signature', // show general help about signature at the bottom of the section
+ 'section' => 'personal/signature'
+ );
+
## Email stuff
-
+
global $wgEnableEmail;
- if ($wgEnableEmail) {
-
+ if ( $wgEnableEmail ) {
global $wgEmailConfirmToEdit;
-
- $defaultPreferences['emailaddress'] =
- array(
- 'type' => $wgAuth->allowPropChange( 'emailaddress' ) ? 'email' : 'info',
- 'default' => $user->getEmail(),
- 'section' => 'personal/email',
- 'label-message' => 'youremail',
- 'help-message' => $wgEmailConfirmToEdit
- ? 'prefs-help-email-required'
- : 'prefs-help-email',
- 'validation-callback' => array( 'Preferences', 'validateEmail' ),
- );
-
+
+ $defaultPreferences['emailaddress'] = array(
+ 'type' => $wgAuth->allowPropChange( 'emailaddress' ) ? 'email' : 'info',
+ 'default' => $user->getEmail(),
+ 'section' => 'personal/email',
+ 'label-message' => 'youremail',
+ 'help-message' => $wgEmailConfirmToEdit
+ ? 'prefs-help-email-required'
+ : 'prefs-help-email',
+ 'validation-callback' => array( 'Preferences', 'validateEmail' ),
+ );
+
global $wgEnableUserEmail, $wgEmailAuthentication;
-
+
$disableEmailPrefs = false;
-
+
if ( $wgEmailAuthentication ) {
if ( $user->getEmail() ) {
- if( $user->getEmailAuthenticationTimestamp() ) {
+ if ( $user->getEmailAuthenticationTimestamp() ) {
// date and time are separate parameters to facilitate localisation.
// $time is kept for backward compat reasons.
// 'emailauthenticated' is also used in SpecialConfirmemail.php
$time = $wgLang->timeAndDate( $user->getEmailAuthenticationTimestamp(), true );
$d = $wgLang->date( $user->getEmailAuthenticationTimestamp(), true );
$t = $wgLang->time( $user->getEmailAuthenticationTimestamp(), true );
- $emailauthenticated = wfMsgExt( 'emailauthenticated', 'parseinline',
- array($time, $d, $t ) ) . '<br />';
+ $emailauthenticated = wfMsgExt(
+ 'emailauthenticated', 'parseinline',
+ array( $time, $d, $t )
+ ) . '<br />';
$disableEmailPrefs = false;
} else {
$disableEmailPrefs = true;
@@ -375,131 +371,149 @@ class Preferences {
$disableEmailPrefs = true;
$emailauthenticated = wfMsgHtml( 'noemailprefs' );
}
-
- $defaultPreferences['emailauthentication'] =
- array(
- 'type' => 'info',
- 'raw' => true,
- 'section' => 'personal/email',
- 'label-message' => 'prefs-emailconfirm-label',
- 'default' => $emailauthenticated,
- );
-
+
+ $defaultPreferences['emailauthentication'] = array(
+ 'type' => 'info',
+ 'raw' => true,
+ 'section' => 'personal/email',
+ 'label-message' => 'prefs-emailconfirm-label',
+ 'default' => $emailauthenticated,
+ );
+
}
-
- if( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
- $defaultPreferences['disablemail'] =
- array(
- 'type' => 'toggle',
- 'invert' => true,
- 'section' => 'personal/email',
- 'label-message' => 'allowemail',
- 'disabled' => $disableEmailPrefs,
- );
- $defaultPreferences['ccmeonemails'] =
- array(
- 'type' => 'toggle',
- 'section' => 'personal/email',
- 'label-message' => 'tog-ccmeonemails',
- 'disabled' => $disableEmailPrefs,
- );
+
+ if ( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
+ $defaultPreferences['disablemail'] = array(
+ 'type' => 'toggle',
+ 'invert' => true,
+ 'section' => 'personal/email',
+ 'label-message' => 'allowemail',
+ 'disabled' => $disableEmailPrefs,
+ );
+ $defaultPreferences['ccmeonemails'] = array(
+ 'type' => 'toggle',
+ 'section' => 'personal/email',
+ 'label-message' => 'tog-ccmeonemails',
+ 'disabled' => $disableEmailPrefs,
+ );
}
-
+
global $wgEnotifWatchlist;
if ( $wgEnotifWatchlist ) {
- $defaultPreferences['enotifwatchlistpages'] =
- array(
- 'type' => 'toggle',
- 'section' => 'personal/email',
- 'label-message' => 'tog-enotifwatchlistpages',
- 'disabled' => $disableEmailPrefs,
- );
+ $defaultPreferences['enotifwatchlistpages'] = array(
+ 'type' => 'toggle',
+ 'section' => 'personal/email',
+ 'label-message' => 'tog-enotifwatchlistpages',
+ 'disabled' => $disableEmailPrefs,
+ );
}
global $wgEnotifUserTalk;
- if( $wgEnotifUserTalk ) {
- $defaultPreferences['enotifusertalkpages'] =
- array(
- 'type' => 'toggle',
- 'section' => 'personal/email',
- 'label-message' => 'tog-enotifusertalkpages',
- 'disabled' => $disableEmailPrefs,
- );
- }
- if( $wgEnotifUserTalk || $wgEnotifWatchlist ) {
- $defaultPreferences['enotifminoredits'] =
- array(
- 'type' => 'toggle',
- 'section' => 'personal/email',
- 'label-message' => 'tog-enotifminoredits',
- 'disabled' => $disableEmailPrefs,
- );
+ if ( $wgEnotifUserTalk ) {
+ $defaultPreferences['enotifusertalkpages'] = array(
+ 'type' => 'toggle',
+ 'section' => 'personal/email',
+ 'label-message' => 'tog-enotifusertalkpages',
+ 'disabled' => $disableEmailPrefs,
+ );
}
- $defaultPreferences['enotifrevealaddr'] =
- array(
+ if ( $wgEnotifUserTalk || $wgEnotifWatchlist ) {
+ $defaultPreferences['enotifminoredits'] = array(
+ 'type' => 'toggle',
+ 'section' => 'personal/email',
+ 'label-message' => 'tog-enotifminoredits',
+ 'disabled' => $disableEmailPrefs,
+ );
+
+ global $wgEnotifRevealEditorAddress;
+ if ( $wgEnotifRevealEditorAddress ) {
+ $defaultPreferences['enotifrevealaddr'] = array(
'type' => 'toggle',
'section' => 'personal/email',
'label-message' => 'tog-enotifrevealaddr',
'disabled' => $disableEmailPrefs,
);
+ }
+ }
}
}
static function skinPreferences( $user, &$defaultPreferences ) {
## Skin #####################################
- $defaultPreferences['skin'] =
- array(
- 'type' => 'radio',
- 'options' => self::generateSkinOptions( $user ),
- 'label' => '&nbsp;',
- 'section' => 'rendering/skin',
- );
+ global $wgLang, $wgAllowUserCss, $wgAllowUserJs;
+
+ $defaultPreferences['skin'] = array(
+ 'type' => 'radio',
+ 'options' => self::generateSkinOptions( $user ),
+ 'label' => '&#160;',
+ 'section' => 'rendering/skin',
+ );
+
+ # Create links to user CSS/JS pages for all skins
+ # This code is basically copied from generateSkinOptions(). It'd
+ # be nice to somehow merge this back in there to avoid redundancy.
+ if ( $wgAllowUserCss || $wgAllowUserJs ) {
+ $sk = $user->getSkin();
+ $linkTools = array();
+
+ if ( $wgAllowUserCss ) {
+ $cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/common.css' );
+ $linkTools[] = $sk->link( $cssPage, wfMsgHtml( 'prefs-custom-css' ) );
+ }
+
+ if ( $wgAllowUserJs ) {
+ $jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/common.js' );
+ $linkTools[] = $sk->link( $jsPage, wfMsgHtml( 'prefs-custom-js' ) );
+ }
+
+ $defaultPreferences['commoncssjs'] = array(
+ 'type' => 'info',
+ 'raw' => true,
+ 'default' => $wgLang->pipeList( $linkTools ),
+ 'label-message' => 'prefs-common-css-js',
+ 'section' => 'rendering/skin',
+ );
+ }
$selectedSkin = $user->getOption( 'skin' );
if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
- global $wgLang;
$settings = array_flip( $wgLang->getQuickbarSettings() );
- $defaultPreferences['quickbar'] =
- array(
- 'type' => 'radio',
- 'options' => $settings,
- 'section' => 'rendering/skin',
- 'label-message' => 'qbsettings',
- );
+ $defaultPreferences['quickbar'] = array(
+ 'type' => 'radio',
+ 'options' => $settings,
+ 'section' => 'rendering/skin',
+ 'label-message' => 'qbsettings',
+ );
}
}
static function mathPreferences( $user, &$defaultPreferences ) {
## Math #####################################
global $wgUseTeX, $wgLang;
- if( $wgUseTeX ) {
- $defaultPreferences['math'] =
- array(
- 'type' => 'radio',
- 'options' =>
- array_flip( array_map( 'wfMsgHtml', $wgLang->getMathNames() ) ),
- 'label' => '&nbsp;',
- 'section' => 'rendering/math',
- );
+ if ( $wgUseTeX ) {
+ $defaultPreferences['math'] = array(
+ 'type' => 'radio',
+ 'options' => array_flip( array_map( 'wfMsgHtml', $wgLang->getMathNames() ) ),
+ 'label' => '&#160;',
+ 'section' => 'rendering/math',
+ );
}
}
static function filesPreferences( $user, &$defaultPreferences ) {
## Files #####################################
- $defaultPreferences['imagesize'] =
- array(
- 'type' => 'select',
- 'options' => self::getImageSizes(),
- 'label-message' => 'imagemaxsize',
- 'section' => 'rendering/files',
- );
- $defaultPreferences['thumbsize'] =
- array(
- 'type' => 'select',
- 'options' => self::getThumbSizes(),
- 'label-message' => 'thumbsize',
- 'section' => 'rendering/files',
- );
+ $defaultPreferences['imagesize'] = array(
+ 'type' => 'select',
+ 'options' => self::getImageSizes(),
+ 'label-message' => 'imagemaxsize',
+ 'section' => 'rendering/files',
+ );
+ $defaultPreferences['thumbsize'] = array(
+ 'type' => 'select',
+ 'options' => self::getThumbSizes(),
+ 'label-message' => 'thumbsize',
+ 'section' => 'rendering/files',
+ );
}
static function datetimePreferences( $user, &$defaultPreferences ) {
@@ -507,380 +521,353 @@ class Preferences {
## Date and time #####################################
$dateOptions = self::getDateOptions();
- if( $dateOptions ) {
- $defaultPreferences['date'] =
- array(
- 'type' => 'radio',
- 'options' => $dateOptions,
- 'label' => '&nbsp;',
- 'section' => 'datetime/dateformat',
- );
+ if ( $dateOptions ) {
+ $defaultPreferences['date'] = array(
+ 'type' => 'radio',
+ 'options' => $dateOptions,
+ 'label' => '&#160;',
+ 'section' => 'datetime/dateformat',
+ );
}
// Info
$nowlocal = Xml::element( 'span', array( 'id' => 'wpLocalTime' ),
$wgLang->time( $now = wfTimestampNow(), true ) );
$nowserver = $wgLang->time( $now, false ) .
- Xml::hidden( 'wpServerTime', substr( $now, 8, 2 ) * 60 + substr( $now, 10, 2 ) );
-
- $defaultPreferences['nowserver'] =
- array(
- 'type' => 'info',
- 'raw' => 1,
- 'label-message' => 'servertime',
- 'default' => $nowserver,
- 'section' => 'datetime/timeoffset',
- );
+ Html::hidden( 'wpServerTime', substr( $now, 8, 2 ) * 60 + substr( $now, 10, 2 ) );
+
+ $defaultPreferences['nowserver'] = array(
+ 'type' => 'info',
+ 'raw' => 1,
+ 'label-message' => 'servertime',
+ 'default' => $nowserver,
+ 'section' => 'datetime/timeoffset',
+ );
- $defaultPreferences['nowlocal'] =
- array(
- 'type' => 'info',
- 'raw' => 1,
- 'label-message' => 'localtime',
- 'default' => $nowlocal,
- 'section' => 'datetime/timeoffset',
- );
+ $defaultPreferences['nowlocal'] = array(
+ 'type' => 'info',
+ 'raw' => 1,
+ 'label-message' => 'localtime',
+ 'default' => $nowlocal,
+ 'section' => 'datetime/timeoffset',
+ );
// Grab existing pref.
$tzOffset = $user->getOption( 'timecorrection' );
$tz = explode( '|', $tzOffset, 2 );
$tzSetting = $tzOffset;
- if( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
+ if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
$minDiff = $tz[1];
- $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff/60 ), abs( $minDiff )%60 );
+ $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
}
- $defaultPreferences['timecorrection'] =
- array(
- 'class' => 'HTMLSelectOrOtherField',
- 'label-message' => 'timezonelegend',
- 'options' => self::getTimezoneOptions(),
- 'default' => $tzSetting,
- 'size' => 20,
- 'section' => 'datetime/timeoffset',
- );
+ $defaultPreferences['timecorrection'] = array(
+ 'class' => 'HTMLSelectOrOtherField',
+ 'label-message' => 'timezonelegend',
+ 'options' => self::getTimezoneOptions(),
+ 'default' => $tzSetting,
+ 'size' => 20,
+ 'section' => 'datetime/timeoffset',
+ );
}
static function renderingPreferences( $user, &$defaultPreferences ) {
## Page Rendering ##############################
- $defaultPreferences['underline'] =
- array(
- 'type' => 'select',
- 'options' => array(
- wfMsg( 'underline-never' ) => 0,
- wfMsg( 'underline-always' ) => 1,
- wfMsg( 'underline-default' ) => 2,
- ),
- 'label-message' => 'tog-underline',
- 'section' => 'rendering/advancedrendering',
- );
+ global $wgAllowUserCssPrefs;
+ if ( $wgAllowUserCssPrefs ) {
+ $defaultPreferences['underline'] = array(
+ 'type' => 'select',
+ 'options' => array(
+ wfMsg( 'underline-never' ) => 0,
+ wfMsg( 'underline-always' ) => 1,
+ wfMsg( 'underline-default' ) => 2,
+ ),
+ 'label-message' => 'tog-underline',
+ 'section' => 'rendering/advancedrendering',
+ );
+ }
- $stubThresholdValues = array( 0, 50, 100, 500, 1000, 2000, 5000, 10000 );
- $stubThresholdOptions = array();
- foreach( $stubThresholdValues as $value ) {
+ $stubThresholdValues = array( 50, 100, 500, 1000, 2000, 5000, 10000 );
+ $stubThresholdOptions = array( wfMsg( 'stub-threshold-disabled' ) => 0 );
+ foreach ( $stubThresholdValues as $value ) {
$stubThresholdOptions[wfMsg( 'size-bytes', $value )] = $value;
}
- $defaultPreferences['stubthreshold'] =
- array(
- 'type' => 'selectorother',
- 'section' => 'rendering/advancedrendering',
- 'options' => $stubThresholdOptions,
- 'size' => 20,
- 'label' => wfMsg( 'stub-threshold' ), // Raw HTML message. Yay?
- );
- $defaultPreferences['highlightbroken'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label' => wfMsg( 'tog-highlightbroken' ), // Raw HTML
- );
- $defaultPreferences['showtoc'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label-message' => 'tog-showtoc',
- );
- $defaultPreferences['nocache'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'tog-nocache',
- 'section' => 'rendering/advancedrendering',
- );
- $defaultPreferences['showhiddencats'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label-message' => 'tog-showhiddencats'
- );
- $defaultPreferences['showjumplinks'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label-message' => 'tog-showjumplinks',
- );
- $defaultPreferences['justify'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label-message' => 'tog-justify',
- );
- $defaultPreferences['numberheadings'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label-message' => 'tog-numberheadings',
- );
+ $defaultPreferences['stubthreshold'] = array(
+ 'type' => 'selectorother',
+ 'section' => 'rendering/advancedrendering',
+ 'options' => $stubThresholdOptions,
+ 'size' => 20,
+ 'label' => wfMsg( 'stub-threshold' ), // Raw HTML message. Yay?
+ );
+
+ if ( $wgAllowUserCssPrefs ) {
+ $defaultPreferences['highlightbroken'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/advancedrendering',
+ 'label' => wfMsg( 'tog-highlightbroken' ), // Raw HTML
+ );
+ $defaultPreferences['showtoc'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/advancedrendering',
+ 'label-message' => 'tog-showtoc',
+ );
+ }
+ $defaultPreferences['nocache'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'tog-nocache',
+ 'section' => 'rendering/advancedrendering',
+ );
+ $defaultPreferences['showhiddencats'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/advancedrendering',
+ 'label-message' => 'tog-showhiddencats'
+ );
+ $defaultPreferences['showjumplinks'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/advancedrendering',
+ 'label-message' => 'tog-showjumplinks',
+ );
+
+ if ( $wgAllowUserCssPrefs ) {
+ $defaultPreferences['justify'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/advancedrendering',
+ 'label-message' => 'tog-justify',
+ );
+ }
+
+ $defaultPreferences['numberheadings'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/advancedrendering',
+ 'label-message' => 'tog-numberheadings',
+ );
}
static function editingPreferences( $user, &$defaultPreferences ) {
- global $wgUseExternalEditor, $wgLivePreview;
+ global $wgUseExternalEditor, $wgAllowUserCssPrefs;
## Editing #####################################
- $defaultPreferences['cols'] =
- array(
- 'type' => 'int',
- 'label-message' => 'columns',
- 'section' => 'editing/textboxsize',
- 'min' => 4,
- 'max' => 1000,
- );
- $defaultPreferences['rows'] =
- array(
- 'type' => 'int',
- 'label-message' => 'rows',
- 'section' => 'editing/textboxsize',
- 'min' => 4,
- 'max' => 1000,
- );
+ $defaultPreferences['cols'] = array(
+ 'type' => 'int',
+ 'label-message' => 'columns',
+ 'section' => 'editing/textboxsize',
+ 'min' => 4,
+ 'max' => 1000,
+ );
+ $defaultPreferences['rows'] = array(
+ 'type' => 'int',
+ 'label-message' => 'rows',
+ 'section' => 'editing/textboxsize',
+ 'min' => 4,
+ 'max' => 1000,
+ );
- $defaultPreferences['editfont'] =
- array(
- 'type' => 'select',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'editfont-style',
- 'options' => array(
- wfMsg( 'editfont-default' ) => 'default',
- wfMsg( 'editfont-monospace' ) => 'monospace',
- wfMsg( 'editfont-sansserif' ) => 'sans-serif',
- wfMsg( 'editfont-serif' ) => 'serif',
- )
- );
- $defaultPreferences['previewontop'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-previewontop',
- );
- $defaultPreferences['previewonfirst'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-previewonfirst',
- );
- $defaultPreferences['editsection'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editsection',
- );
- $defaultPreferences['editsectiononrightclick'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editsectiononrightclick',
- );
- $defaultPreferences['editondblclick'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editondblclick',
- );
- $defaultPreferences['editwidth'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editwidth',
- );
- $defaultPreferences['showtoolbar'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-showtoolbar',
- );
- $defaultPreferences['minordefault'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-minordefault',
- );
+ if ( $wgAllowUserCssPrefs ) {
+ $defaultPreferences['editfont'] = array(
+ 'type' => 'select',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'editfont-style',
+ 'options' => array(
+ wfMsg( 'editfont-default' ) => 'default',
+ wfMsg( 'editfont-monospace' ) => 'monospace',
+ wfMsg( 'editfont-sansserif' ) => 'sans-serif',
+ wfMsg( 'editfont-serif' ) => 'serif',
+ )
+ );
+ }
+ $defaultPreferences['previewontop'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-previewontop',
+ );
+ $defaultPreferences['previewonfirst'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-previewonfirst',
+ );
- if ( $wgUseExternalEditor ) {
- $defaultPreferences['externaleditor'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-externaleditor',
- );
- $defaultPreferences['externaldiff'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-externaldiff',
- );
+ if ( $wgAllowUserCssPrefs ) {
+ $defaultPreferences['editsection'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-editsection',
+ );
}
+ $defaultPreferences['editsectiononrightclick'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-editsectiononrightclick',
+ );
+ $defaultPreferences['editondblclick'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-editondblclick',
+ );
+ $defaultPreferences['showtoolbar'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-showtoolbar',
+ );
+ $defaultPreferences['minordefault'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-minordefault',
+ );
- $defaultPreferences['forceeditsummary'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-forceeditsummary',
- );
- if ( $wgLivePreview ) {
- $defaultPreferences['uselivepreview'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-uselivepreview',
- );
+ if ( $wgUseExternalEditor ) {
+ $defaultPreferences['externaleditor'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-externaleditor',
+ );
+ $defaultPreferences['externaldiff'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-externaldiff',
+ );
}
+
+ $defaultPreferences['forceeditsummary'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-forceeditsummary',
+ );
+
+
+ $defaultPreferences['uselivepreview'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-uselivepreview',
+ );
}
static function rcPreferences( $user, &$defaultPreferences ) {
global $wgRCMaxAge, $wgUseRCPatrol, $wgLang;
+
## RecentChanges #####################################
- $defaultPreferences['rcdays'] =
- array(
- 'type' => 'float',
- 'label-message' => 'recentchangesdays',
- 'section' => 'rc/display',
- 'min' => 1,
- 'max' => ceil( $wgRCMaxAge / ( 3600*24 ) ),
- 'help' => wfMsgExt( 'recentchangesdays-max', array( 'parsemag' ), $wgLang->formatNum( ceil( $wgRCMaxAge / ( 3600*24 ) ) ) ),
- );
- $defaultPreferences['rclimit'] =
- array(
- 'type' => 'int',
- 'label-message' => 'recentchangescount',
- 'help-message' => 'prefs-help-recentchangescount',
- 'section' => 'rc/display',
- );
- $defaultPreferences['usenewrc'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'tog-usenewrc',
- 'section' => 'rc/advancedrc',
- );
- $defaultPreferences['hideminor'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'tog-hideminor',
- 'section' => 'rc/advancedrc',
- );
+ $defaultPreferences['rcdays'] = array(
+ 'type' => 'float',
+ 'label-message' => 'recentchangesdays',
+ 'section' => 'rc/displayrc',
+ 'min' => 1,
+ 'max' => ceil( $wgRCMaxAge / ( 3600 * 24 ) ),
+ 'help' => wfMsgExt(
+ 'recentchangesdays-max',
+ array( 'parsemag' ),
+ $wgLang->formatNum( ceil( $wgRCMaxAge / ( 3600 * 24 ) ) )
+ )
+ );
+ $defaultPreferences['rclimit'] = array(
+ 'type' => 'int',
+ 'label-message' => 'recentchangescount',
+ 'help-message' => 'prefs-help-recentchangescount',
+ 'section' => 'rc/displayrc',
+ );
+ $defaultPreferences['usenewrc'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'tog-usenewrc',
+ 'section' => 'rc/advancedrc',
+ );
+ $defaultPreferences['hideminor'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'tog-hideminor',
+ 'section' => 'rc/advancedrc',
+ );
- if( $wgUseRCPatrol ) {
- $defaultPreferences['hidepatrolled'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rc/advancedrc',
- 'label-message' => 'tog-hidepatrolled',
- );
- $defaultPreferences['newpageshidepatrolled'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rc/advancedrc',
- 'label-message' => 'tog-newpageshidepatrolled',
- );
+ if ( $wgUseRCPatrol ) {
+ $defaultPreferences['hidepatrolled'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rc/advancedrc',
+ 'label-message' => 'tog-hidepatrolled',
+ );
+ $defaultPreferences['newpageshidepatrolled'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rc/advancedrc',
+ 'label-message' => 'tog-newpageshidepatrolled',
+ );
}
global $wgRCShowWatchingUsers;
- if( $wgRCShowWatchingUsers ) {
- $defaultPreferences['shownumberswatching'] =
- array(
- 'type' => 'toggle',
- 'section' => 'rc/advancedrc',
- 'label-message' => 'tog-shownumberswatching',
- );
+ if ( $wgRCShowWatchingUsers ) {
+ $defaultPreferences['shownumberswatching'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rc/advancedrc',
+ 'label-message' => 'tog-shownumberswatching',
+ );
}
}
static function watchlistPreferences( $user, &$defaultPreferences ) {
global $wgUseRCPatrol, $wgEnableAPI;
+
## Watchlist #####################################
- $defaultPreferences['watchlistdays'] =
- array(
- 'type' => 'float',
- 'min' => 0,
- 'max' => 7,
- 'section' => 'watchlist/display',
- 'help' => wfMsgHtml( 'prefs-watchlist-days-max' ),
- 'label-message' => 'prefs-watchlist-days',
- );
- $defaultPreferences['wllimit'] =
- array(
- 'type' => 'int',
- 'min' => 0,
- 'max' => 1000,
- 'label-message' => 'prefs-watchlist-edits',
- 'help' => wfMsgHtml( 'prefs-watchlist-edits-max' ),
- 'section' => 'watchlist/display',
- );
- $defaultPreferences['extendwatchlist'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-extendwatchlist',
- );
- $defaultPreferences['watchlisthideminor'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlisthideminor',
- );
- $defaultPreferences['watchlisthidebots'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlisthidebots',
- );
- $defaultPreferences['watchlisthideown'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlisthideown',
- );
- $defaultPreferences['watchlisthideanons'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlisthideanons',
- );
- $defaultPreferences['watchlisthideliu'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlisthideliu',
- );
+ $defaultPreferences['watchlistdays'] = array(
+ 'type' => 'float',
+ 'min' => 0,
+ 'max' => 7,
+ 'section' => 'watchlist/displaywatchlist',
+ 'help' => wfMsgHtml( 'prefs-watchlist-days-max' ),
+ 'label-message' => 'prefs-watchlist-days',
+ );
+ $defaultPreferences['wllimit'] = array(
+ 'type' => 'int',
+ 'min' => 0,
+ 'max' => 1000,
+ 'label-message' => 'prefs-watchlist-edits',
+ 'help' => wfMsgHtml( 'prefs-watchlist-edits-max' ),
+ 'section' => 'watchlist/displaywatchlist',
+ );
+ $defaultPreferences['extendwatchlist'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-extendwatchlist',
+ );
+ $defaultPreferences['watchlisthideminor'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlisthideminor',
+ );
+ $defaultPreferences['watchlisthidebots'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlisthidebots',
+ );
+ $defaultPreferences['watchlisthideown'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlisthideown',
+ );
+ $defaultPreferences['watchlisthideanons'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlisthideanons',
+ );
+ $defaultPreferences['watchlisthideliu'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlisthideliu',
+ );
+
+ if ( $wgUseRCPatrol ) {
+ $defaultPreferences['watchlisthidepatrolled'] = array(
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlisthidepatrolled',
+ );
+ }
+
if ( $wgEnableAPI ) {
# Some random gibberish as a proposed default
$hash = sha1( mt_rand() . microtime( true ) );
- $defaultPreferences['watchlisttoken'] =
- array(
- 'type' => 'text',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'prefs-watchlist-token',
- 'help' => wfMsgHtml( 'prefs-help-watchlist-token', $hash )
- );
- }
- if ( $wgUseRCPatrol ) {
- $defaultPreferences['watchlisthidepatrolled'] =
- array(
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlisthidepatrolled',
- );
+ $defaultPreferences['watchlisttoken'] = array(
+ 'type' => 'text',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'prefs-watchlist-token',
+ 'help' => wfMsgHtml( 'prefs-help-watchlist-token', $hash )
+ );
}
$watchTypes = array(
@@ -890,11 +877,11 @@ class Preferences {
);
// Kinda hacky
- if( $user->isAllowed( 'createpage' ) || $user->isAllowed( 'createtalk' ) ) {
+ if ( $user->isAllowed( 'createpage' ) || $user->isAllowed( 'createtalk' ) ) {
$watchTypes['read'] = 'watchcreations';
}
- foreach( $watchTypes as $action => $pref ) {
+ foreach ( $watchTypes as $action => $pref ) {
if ( $user->isAllowed( $action ) ) {
$defaultPreferences[$pref] = array(
'type' => 'toggle',
@@ -909,101 +896,108 @@ class Preferences {
global $wgContLang;
## Search #####################################
- $defaultPreferences['searchlimit'] =
- array(
- 'type' => 'int',
- 'label-message' => 'resultsperpage',
- 'section' => 'searchoptions/display',
- 'min' => 0,
- );
- $defaultPreferences['contextlines'] =
- array(
- 'type' => 'int',
- 'label-message' => 'contextlines',
- 'section' => 'searchoptions/display',
- 'min' => 0,
- );
- $defaultPreferences['contextchars'] =
- array(
- 'type' => 'int',
- 'label-message' => 'contextchars',
- 'section' => 'searchoptions/display',
- 'min' => 0,
- );
+ $defaultPreferences['searchlimit'] = array(
+ 'type' => 'int',
+ 'label-message' => 'resultsperpage',
+ 'section' => 'searchoptions/displaysearchoptions',
+ 'min' => 0,
+ );
+ $defaultPreferences['contextlines'] = array(
+ 'type' => 'int',
+ 'label-message' => 'contextlines',
+ 'section' => 'searchoptions/displaysearchoptions',
+ 'min' => 0,
+ );
+ $defaultPreferences['contextchars'] = array(
+ 'type' => 'int',
+ 'label-message' => 'contextchars',
+ 'section' => 'searchoptions/displaysearchoptions',
+ 'min' => 0,
+ );
+
global $wgEnableMWSuggest;
- if( $wgEnableMWSuggest ) {
- $defaultPreferences['disablesuggest'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'mwsuggest-disable',
- 'section' => 'searchoptions/display',
- );
+ if ( $wgEnableMWSuggest ) {
+ $defaultPreferences['disablesuggest'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'mwsuggest-disable',
+ 'section' => 'searchoptions/displaysearchoptions',
+ );
+ }
+
+ global $wgVectorUseSimpleSearch;
+ if ( $wgVectorUseSimpleSearch ) {
+ $defaultPreferences['vector-simplesearch'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'vector-simplesearch-preference',
+ 'section' => 'searchoptions/displaysearchoptions'
+ );
}
- $defaultPreferences['searcheverything'] =
- array(
- 'type' => 'toggle',
- 'label-message' => 'searcheverything-enable',
- 'section' => 'searchoptions/advancedsearchoptions',
- );
+ $defaultPreferences['searcheverything'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'searcheverything-enable',
+ 'section' => 'searchoptions/advancedsearchoptions',
+ );
// Searchable namespaces back-compat with old format
$searchableNamespaces = SearchEngine::searchableNamespaces();
$nsOptions = array();
- foreach( $wgContLang->getNamespaces() as $ns => $name ) {
- if( $ns < 0 ) continue;
+
+ foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
+ if ( $ns < 0 ) {
+ continue;
+ }
+
$displayNs = str_replace( '_', ' ', $name );
- if( !$displayNs ) $displayNs = wfMsg( 'blanknamespace' );
+ if ( !$displayNs ) {
+ $displayNs = wfMsg( 'blanknamespace' );
+ }
$displayNs = htmlspecialchars( $displayNs );
$nsOptions[$displayNs] = $ns;
}
- $defaultPreferences['searchnamespaces'] =
- array(
- 'type' => 'multiselect',
- 'label-message' => 'defaultns',
- 'options' => $nsOptions,
- 'section' => 'searchoptions/advancedsearchoptions',
- 'prefix' => 'searchNs',
- );
+ $defaultPreferences['searchnamespaces'] = array(
+ 'type' => 'multiselect',
+ 'label-message' => 'defaultns',
+ 'options' => $nsOptions,
+ 'section' => 'searchoptions/advancedsearchoptions',
+ 'prefix' => 'searchNs',
+ );
}
static function miscPreferences( $user, &$defaultPreferences ) {
## Misc #####################################
- $defaultPreferences['diffonly'] =
- array(
- 'type' => 'toggle',
- 'section' => 'misc/diffs',
- 'label-message' => 'tog-diffonly',
- );
- $defaultPreferences['norollbackdiff'] =
- array(
- 'type' => 'toggle',
- 'section' => 'misc/diffs',
- 'label-message' => 'tog-norollbackdiff',
- );
+ $defaultPreferences['diffonly'] = array(
+ 'type' => 'toggle',
+ 'section' => 'misc/diffs',
+ 'label-message' => 'tog-diffonly',
+ );
+ $defaultPreferences['norollbackdiff'] = array(
+ 'type' => 'toggle',
+ 'section' => 'misc/diffs',
+ 'label-message' => 'tog-norollbackdiff',
+ );
// Stuff from Language::getExtraUserToggles()
global $wgContLang;
$toggles = $wgContLang->getExtraUserToggles();
- foreach( $toggles as $toggle ) {
- $defaultPreferences[$toggle] =
- array(
- 'type' => 'toggle',
- 'section' => 'personal/i18n',
- 'label-message' => "tog-$toggle",
- );
+ foreach ( $toggles as $toggle ) {
+ $defaultPreferences[$toggle] = array(
+ 'type' => 'toggle',
+ 'section' => 'personal/i18n',
+ 'label-message' => "tog-$toggle",
+ );
}
}
/**
- * @param object $user The user object
- * @return array Text/links to display as key; $skinkey as value
+ * @param $user The User object
+ * @return Array: text/links to display as key; $skinkey as value
*/
static function generateSkinOptions( $user ) {
global $wgDefaultSkin, $wgLang, $wgAllowUserCss, $wgAllowUserJs;
@@ -1011,9 +1005,11 @@ class Preferences {
$mptitle = Title::newMainPage();
$previewtext = wfMsgHtml( 'skin-preview' );
+
# Only show members of Skin::getSkinNames() rather than
# $skinNames (skins is all skin names from Language.php)
$validSkinNames = Skin::getUsableSkins();
+
# Sort by UI skin name. First though need to update validSkinNames as sometimes
# the skinkey & UI skinname differ (e.g. "standard" skinkey is "Classic" in the UI).
foreach ( $validSkinNames as $skinkey => &$skinname ) {
@@ -1026,11 +1022,11 @@ class Preferences {
asort( $validSkinNames );
$sk = $user->getSkin();
- foreach( $validSkinNames as $skinkey => $sn ) {
+ foreach ( $validSkinNames as $skinkey => $sn ) {
$linkTools = array();
# Mark the default skin
- if( $skinkey == $wgDefaultSkin ) {
+ if ( $skinkey == $wgDefaultSkin ) {
$linkTools[] = wfMsgHtml( 'default' );
}
@@ -1039,11 +1035,12 @@ class Preferences {
$linkTools[] = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
# Create links to user CSS/JS pages
- if( $wgAllowUserCss ) {
+ if ( $wgAllowUserCss ) {
$cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.css' );
$linkTools[] = $sk->link( $cssPage, wfMsgHtml( 'prefs-custom-css' ) );
}
- if( $wgAllowUserJs ) {
+
+ if ( $wgAllowUserJs ) {
$jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.js' );
$linkTools[] = $sk->link( $jsPage, wfMsgHtml( 'prefs-custom-js' ) );
}
@@ -1061,16 +1058,21 @@ class Preferences {
$ret = array();
- if( $dateopts ) {
+ if ( $dateopts ) {
if ( !in_array( 'default', $dateopts ) ) {
$dateopts[] = 'default'; // Make sure default is always valid
// Bug 19237
}
- $idCnt = 0;
+ // KLUGE: site default might not be valid for user language
+ global $wgDefaultUserOptions;
+ if ( !in_array( $wgDefaultUserOptions['date'], $dateopts ) ) {
+ $wgDefaultUserOptions['date'] = 'default';
+ }
+
$epoch = wfTimestampNow();
- foreach( $dateopts as $key ) {
- if( $key == 'default' ) {
+ foreach ( $dateopts as $key ) {
+ if ( $key == 'default' ) {
$formatted = wfMsgHtml( 'datedefault' );
} else {
$formatted = htmlspecialchars( $wgLang->timeanddate( $epoch, false, $key ) );
@@ -1109,14 +1111,14 @@ class Preferences {
static function validateSignature( $signature, $alldata ) {
global $wgParser, $wgMaxSigChars, $wgLang;
- if( mb_strlen( $signature ) > $wgMaxSigChars ) {
- return
- Xml::element( 'span', array( 'class' => 'error' ),
- wfMsgExt( 'badsiglength', 'parsemag',
- $wgLang->formatNum( $wgMaxSigChars )
- )
- );
- } elseif( !empty( $alldata['fancysig'] ) &&
+ if ( mb_strlen( $signature ) > $wgMaxSigChars ) {
+ return Xml::element( 'span', array( 'class' => 'error' ),
+ wfMsgExt( 'badsiglength', 'parsemag',
+ $wgLang->formatNum( $wgMaxSigChars )
+ )
+ );
+ } elseif ( isset( $alldata['fancysig'] ) &&
+ $alldata['fancysig'] &&
false === $wgParser->validateSig( $signature ) ) {
return Xml::element( 'span', array( 'class' => 'error' ), wfMsg( 'badsig' ) );
} else {
@@ -1126,7 +1128,7 @@ class Preferences {
static function cleanSignature( $signature, $alldata ) {
global $wgParser;
- if( $alldata['fancysig'] ) {
+ if ( isset( $alldata['fancysig'] ) && $alldata['fancysig'] ) {
$signature = $wgParser->cleanSig( $signature );
} else {
// When no fancy sig used, make sure ~{3,5} get removed.
@@ -1142,17 +1144,19 @@ class Preferences {
}
global $wgEmailConfirmToEdit;
- if( $wgEmailConfirmToEdit && !$email ) {
+ if ( $wgEmailConfirmToEdit && !$email ) {
return wfMsgExt( 'noemailtitle', 'parseinline' );
}
return true;
}
- static function getFormObject( $user ) {
+ static function getFormObject( $user, $formClass = 'PreferencesForm' ) {
$formDescriptor = Preferences::getPreferences( $user );
- $htmlForm = new PreferencesForm( $formDescriptor, 'prefs' );
+ $htmlForm = new $formClass( $formDescriptor, 'prefs' );
$htmlForm->setSubmitText( wfMsg( 'saveprefs' ) );
+ # Used message keys: 'accesskey-preferences-save', 'tooltip-preferences-save'
+ $htmlForm->setSubmitTooltip( 'preferences-save' );
$htmlForm->setTitle( SpecialPage::getTitleFor( 'Preferences' ) );
$htmlForm->setSubmitID( 'prefsubmit' );
$htmlForm->setSubmitCallback( array( 'Preferences', 'tryFormSubmit' ) );
@@ -1196,24 +1200,29 @@ class Preferences {
$z = explode( '/', $tz, 2 );
# timezone_identifiers_list() returns a number of
- # backwards-compatibility entries. This filters them out of the
+ # backwards-compatibility entries. This filters them out of the
# list presented to the user.
- if ( count( $z ) != 2 || !array_key_exists( $z[0], $tzRegions ) )
+ if ( count( $z ) != 2 || !array_key_exists( $z[0], $tzRegions ) ) {
continue;
+ }
# Localize region
$z[0] = $tzRegions[$z[0]];
$minDiff = floor( timezone_offset_get( timezone_open( $tz ), $now ) / 60 );
-
+
$display = str_replace( '_', ' ', $z[0] . '/' . $z[1] );
$value = "ZoneInfo|$minDiff|$tz";
-
+
$opt[$z[0]][$display] = $value;
}
}
return $opt;
}
+
+ static function filterIntval( $value, $alldata ){
+ return intval( $value );
+ }
static function filterTimezoneInput( $tz, $alldata ) {
$data = explode( '|', $tz, 3 );
@@ -1223,12 +1232,11 @@ class Preferences {
return $tz;
default:
$data = explode( ':', $tz, 2 );
- $minDiff = 0;
- if( count( $data ) == 2 ) {
+ if ( count( $data ) == 2 ) {
$data[0] = intval( $data[0] );
$data[1] = intval( $data[1] );
$minDiff = abs( $data[0] ) * 60 + $data[1];
- if ( $data[0] < 0 ) $minDiff = -$minDiff;
+ if ( $data[0] < 0 ) $minDiff = - $minDiff;
} else {
$minDiff = intval( $data[0] ) * 60;
}
@@ -1236,18 +1244,18 @@ class Preferences {
# Max is +14:00 and min is -12:00, see:
# http://en.wikipedia.org/wiki/Timezone
$minDiff = min( $minDiff, 840 ); # 14:00
- $minDiff = max( $minDiff, -720 ); # -12:00
- return 'Offset|'.$minDiff;
+ $minDiff = max( $minDiff, - 720 ); # -12:00
+ return 'Offset|' . $minDiff;
}
}
-
+
static function tryFormSubmit( $formData, $entryPoint = 'internal' ) {
global $wgUser, $wgEmailAuthentication, $wgEnableEmail;
$result = true;
// Filter input
- foreach( array_keys( $formData ) as $name ) {
+ foreach ( array_keys( $formData ) as $name ) {
if ( isset( self::$saveFilters[$name] ) ) {
$formData[$name] =
call_user_func( self::$saveFilters[$name], $formData[$name], $formData );
@@ -1260,30 +1268,31 @@ class Preferences {
'emailaddress',
);
- if( $wgEnableEmail ) {
- $newadr = $formData['emailaddress'];
- $oldadr = $wgUser->getEmail();
- if( ( $newadr != '' ) && ( $newadr != $oldadr ) ) {
+ if ( $wgEnableEmail ) {
+ $newaddr = $formData['emailaddress'];
+ $oldaddr = $wgUser->getEmail();
+ if ( ( $newaddr != '' ) && ( $newaddr != $oldaddr ) ) {
# the user has supplied a new email address on the login page
# new behaviour: set this new emailaddr from login-page into user database record
- $wgUser->setEmail( $newadr );
+ $wgUser->setEmail( $newaddr );
# but flag as "dirty" = unauthenticated
$wgUser->invalidateEmail();
- if( $wgEmailAuthentication ) {
+ if ( $wgEmailAuthentication ) {
# Mail a temporary password to the dirty address.
# User can come back through the confirmation URL to re-enable email.
- $result = $wgUser->sendConfirmationMail();
- if( WikiError::isError( $result ) ) {
- return wfMsg( 'mailerror', htmlspecialchars( $result->getMessage() ) );
- } elseif( $entryPoint == 'ui' ) {
+ $type = $oldaddr != '' ? 'changed' : 'set';
+ $result = $wgUser->sendConfirmationMail( $type );
+ if ( !$result->isGood() ) {
+ return htmlspecialchars( $result->getWikiText( 'mailerror' ) );
+ } elseif ( $entryPoint == 'ui' ) {
$result = 'eauth';
}
}
} else {
- $wgUser->setEmail( $newadr );
+ $wgUser->setEmail( $newaddr );
}
- if( $oldadr != $newadr ) {
- wfRunHooks( 'PrefsEmailAudit', array( $wgUser, $oldadr, $newadr ) );
+ if ( $oldaddr != $newaddr ) {
+ wfRunHooks( 'PrefsEmailAudit', array( $wgUser, $oldaddr, $newaddr ) );
}
}
@@ -1294,14 +1303,15 @@ class Preferences {
$wgUser->setRealName( $realName );
}
- foreach( $saveBlacklist as $b )
+ foreach ( $saveBlacklist as $b ) {
unset( $formData[$b] );
+ }
// Keeps old preferences from interfering due to back-compat
// code, etc.
$wgUser->resetOptions();
- foreach( $formData as $key => $value ) {
+ foreach ( $formData as $key => $value ) {
$wgUser->setOption( $key, $value );
}
@@ -1313,19 +1323,22 @@ class Preferences {
public static function tryUISubmit( $formData ) {
$res = self::tryFormSubmit( $formData, 'ui' );
- if( $res ) {
+ if ( $res ) {
$urlOptions = array( 'success' );
- if( $res === 'eauth' )
+
+ if ( $res === 'eauth' ) {
$urlOptions[] = 'eauth';
+ }
$queryString = implode( '&', $urlOptions );
$url = SpecialPage::getTitleFor( 'Preferences' )->getFullURL( $queryString );
+
global $wgOut;
$wgOut->redirect( $url );
}
- return true;
+ return Status::newGood();
}
public static function loadOldSearchNs( $user ) {
@@ -1333,8 +1346,8 @@ class Preferences {
// Back compat with old format
$arr = array();
- foreach( $searchableNamespaces as $ns => $name ) {
- if( $user->getOption( 'searchNs' . $ns ) ) {
+ foreach ( $searchableNamespaces as $ns => $name ) {
+ if ( $user->getOption( 'searchNs' . $ns ) ) {
$arr[] = $ns;
}
}
@@ -1345,7 +1358,6 @@ class Preferences {
/** Some tweaks to allow js prefs to work */
class PreferencesForm extends HTMLForm {
-
function wrapForm( $html ) {
$html = Xml::tags( 'div', array( 'id' => 'preferences' ), $html );
@@ -1370,13 +1382,13 @@ class PreferencesForm extends HTMLForm {
function filterDataForSubmit( $data ) {
// Support for separating MultiSelect preferences into multiple preferences
// Due to lack of array support.
- foreach( $this->mFlatFields as $fieldname => $field ) {
+ foreach ( $this->mFlatFields as $fieldname => $field ) {
$info = $field->mParams;
- if( $field instanceof HTMLMultiSelectField ) {
+ if ( $field instanceof HTMLMultiSelectField ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
- foreach( $options as $opt ) {
+ foreach ( $options as $opt ) {
$data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
}
diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php
index 930b29d4..236e4370 100644
--- a/includes/PrefixSearch.php
+++ b/includes/PrefixSearch.php
@@ -1,5 +1,4 @@
<?php
-
/**
* PrefixSearch - Handles searching prefixes of titles and finding any page
* names that match. Used largely by the OpenSearch implementation.
@@ -23,6 +22,7 @@ class PrefixSearch {
}
$namespaces = self::validateNamespaces( $namespaces );
+ // Find a Title which is not an interwiki and is in NS_MAIN
$title = Title::newFromText( $search );
if( $title && $title->getInterwiki() == '' ) {
$ns = array($title->getNamespace());
@@ -77,6 +77,10 @@ class PrefixSearch {
*/
protected static function specialSearch( $search, $limit ) {
global $wgContLang;
+
+ # normalize searchKey, so aliases with spaces can be found - bug 25675
+ $search = str_replace( ' ', '_', $search );
+
$searchKey = $wgContLang->caseFold( $search );
// Unlike SpecialPage itself, we want the canonical forms of both
@@ -87,9 +91,11 @@ class PrefixSearch {
foreach( array_keys( SpecialPage::$mList ) as $page ) {
$keys[$wgContLang->caseFold( $page )] = $page;
}
+
foreach( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
- if( !array_key_exists( $page, SpecialPage::$mList ) ) # bug 20885
+ if( !array_key_exists( $page, SpecialPage::$mList ) ) {# bug 20885
continue;
+ }
foreach( $aliases as $alias ) {
$keys[$wgContLang->caseFold( $alias )] = $alias;
@@ -100,12 +106,20 @@ class PrefixSearch {
$srchres = array();
foreach( $keys as $pageKey => $page ) {
if( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
- $srchres[] = Title::makeTitle( NS_SPECIAL, $page )->getPrefixedText();
+ wfSuppressWarnings();
+ // bug 27671: Don't use SpecialPage::getTitleFor() here because it
+ // localizes its input leading to searches for e.g. Special:All
+ // returning Spezial:MediaWiki-Systemnachrichten and returning
+ // Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
+ $srchres[] = Title::makeTitleSafe( NS_SPECIAL, $page )->getPrefixedText();
+ wfRestoreWarnings();
}
+
if( count( $srchres ) >= $limit ) {
break;
}
}
+
return $srchres;
}
@@ -156,10 +170,12 @@ class PrefixSearch {
* Validate an array of numerical namespace indexes
*
* @param $namespaces Array
- * @return Array
+ * @return Array (default: contains only NS_MAIN)
*/
protected static function validateNamespaces($namespaces){
global $wgContLang;
+
+ // We will look at each given namespace against wgContLang namespaces
$validNamespaces = $wgContLang->getNamespaces();
if( is_array($namespaces) && count($namespaces)>0 ){
$valid = array();
@@ -167,8 +183,9 @@ class PrefixSearch {
if( is_numeric($ns) && array_key_exists($ns, $validNamespaces) )
$valid[] = $ns;
}
- if( count($valid) > 0 )
+ if( count($valid) > 0 ) {
return $valid;
+ }
}
return array( NS_MAIN );
diff --git a/includes/Profiler.php b/includes/Profiler.php
index 817b71ab..6deb742e 100644
--- a/includes/Profiler.php
+++ b/includes/Profiler.php
@@ -12,7 +12,7 @@ $wgProfiling = true;
/**
* Begin profiling of a function
- * @param $functionname name of the function we will profile
+ * @param $functionname String: name of the function we will profile
*/
function wfProfileIn( $functionname ) {
global $wgProfiler;
@@ -21,7 +21,7 @@ function wfProfileIn( $functionname ) {
/**
* Stop profiling of a function
- * @param $functionname name of the function we have profiled
+ * @param $functionname String: name of the function we have profiled
*/
function wfProfileOut( $functionname = 'missing' ) {
global $wgProfiler;
@@ -61,6 +61,7 @@ if (!function_exists('memory_get_usage')) {
class Profiler {
var $mStack = array (), $mWorkStack = array (), $mCollated = array ();
var $mCalls = array (), $mTotals = array ();
+ var $mTemplated = false;
function __construct() {
// Push an entry for the pre-profile setup time onto the stack
@@ -75,7 +76,8 @@ class Profiler {
/**
* Called by wfProfieIn()
- * @param $functionname string
+ *
+ * @param $functionname String
*/
function profileIn( $functionname ) {
global $wgDebugFunctionEntry, $wgProfiling;
@@ -89,7 +91,8 @@ class Profiler {
/**
* Called by wfProfieOut()
- * @param $functionname string
+ *
+ * @param $functionname String
*/
function profileOut($functionname) {
global $wgDebugFunctionEntry, $wgProfiling;
@@ -140,7 +143,16 @@ class Profiler {
}
/**
- * called by wfGetProfilingOutput()
+ * Mark this call as templated or not
+ *
+ * @param $t Boolean
+ */
+ function setTemplated( $t ) {
+ $this->mTemplated = $t;
+ }
+
+ /**
+ * Called by wfGetProfilingOutput()
*/
function getOutput() {
global $wgDebugFunctionEntry, $wgProfileCallTree;
@@ -164,7 +176,7 @@ class Profiler {
}
/**
- * returns a tree of function call instead of a list of functions
+ * Returns a tree of function call instead of a list of functions
*/
function getCallTree() {
return implode( '', array_map( array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack ) ) );
@@ -275,9 +287,9 @@ class Profiler {
$overheadInternal[] = $elapsed;
}
}
- $overheadTotal = array_sum( $overheadTotal ) / count( $overheadInternal );
- $overheadMemory = array_sum( $overheadMemory ) / count( $overheadInternal );
- $overheadInternal = array_sum( $overheadInternal ) / count( $overheadInternal );
+ $overheadTotal = $overheadTotal ? array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
+ $overheadMemory = $overheadMemory ? array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
+ $overheadInternal = $overheadInternal ? array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
# Collate
foreach( $this->mStack as $index => $entry ){
@@ -356,9 +368,10 @@ class Profiler {
/**
* Log a function into the database.
*
- * @param $name string: function name
- * @param $timeSum float
- * @param $eventCount int: number of times that function was called
+ * @param $name String: function name
+ * @param $timeSum Float
+ * @param $eventCount Integer: number of times that function was called
+ * @param $memorySum Integer: memory used by the function
*/
static function logToDB( $name, $timeSum, $eventCount, $memorySum ){
# Do not log anything if database is readonly (bug 5375)
@@ -420,7 +433,8 @@ class Profiler {
/**
* Get function caller
- * @param $level int
+ *
+ * @param $level Integer
*/
static function getCaller( $level ) {
$backtrace = wfDebugBacktrace();
@@ -438,7 +452,8 @@ class Profiler {
/**
* Add an entry in the debug log file
- * @param $s string to output
+ *
+ * @param $s String to output
*/
function debug( $s ) {
if( function_exists( 'wfDebug' ) ) {
diff --git a/includes/ProfilerSimple.php b/includes/ProfilerSimple.php
index 5989061d..8aab1ecc 100644
--- a/includes/ProfilerSimple.php
+++ b/includes/ProfilerSimple.php
@@ -109,8 +109,9 @@ class ProfilerSimple extends Profiler {
function getCpuTime($ru=null) {
if ( function_exists( 'getrusage' ) ) {
- if ( $ru == null )
+ if ( $ru == null ) {
$ru = getrusage();
+ }
return ($ru['ru_utime.tv_sec'] + $ru['ru_stime.tv_sec'] + ($ru['ru_utime.tv_usec'] +
$ru['ru_stime.tv_usec']) * 1e-6);
} else {
@@ -120,8 +121,9 @@ class ProfilerSimple extends Profiler {
/* If argument is passed, it assumes that it is dual-format time string, returns proper float time value */
function getTime($time=null) {
- if ($time==null)
+ if ($time==null) {
return microtime(true);
+ }
list($a,$b)=explode(" ",$time);
return (float)($a+$b);
}
diff --git a/includes/ProfilerSimpleText.php b/includes/ProfilerSimpleText.php
index d3df3908..db4b6053 100644
--- a/includes/ProfilerSimpleText.php
+++ b/includes/ProfilerSimpleText.php
@@ -9,7 +9,7 @@ require_once( dirname( __FILE__ ) . '/ProfilerSimple.php' );
/**
* The least sophisticated profiler output class possible, view your source! :)
*
- * Put it to StartProfiler.php like this:
+ * Put the following 3 lines in StartProfiler.php:
*
* require_once( dirname( __FILE__ ) . '/includes/ProfilerSimpleText.php' );
* $wgProfiler = new ProfilerSimpleText;
@@ -19,21 +19,21 @@ require_once( dirname( __FILE__ ) . '/ProfilerSimple.php' );
*/
class ProfilerSimpleText extends ProfilerSimple {
public $visible=false; /* Show as <PRE> or <!-- ? */
+ static private $out;
function getFunctionReport() {
- global $wgRequest;
- if ( $wgRequest->getVal( 'action' ) == 'raw' ) # bug 20388
- return;
-
- if ($this->visible) print "<pre>";
- else print "<!--\n";
- uasort($this->mCollated,array('self','sort'));
- array_walk($this->mCollated,array('self','format'));
- if ($this->visible) print "</pre>\n";
- else print "-->\n";
+ if($this->mTemplated) {
+ uasort($this->mCollated,array('self','sort'));
+ array_walk($this->mCollated,array('self','format'));
+ if ($this->visible) {
+ print '<pre>'.self::$out.'</pre>';
+ } else {
+ print "<!--\n".self::$out."\n-->\n";
+ }
+ }
}
/* dense is good */
static function sort($a,$b) { return $a['real']<$b['real']; /* sort descending by time elapsed */ }
- static function format($item,$key) { printf("%3.6f %6d - %s\n",$item['real'],$item['count'], $key); }
+ static function format($item,$key) { self::$out .= sprintf("%3.6f %6d - %s\n",$item['real'],$item['count'], $key); }
}
diff --git a/includes/ProfilerSimpleTrace.php b/includes/ProfilerSimpleTrace.php
index 63119228..8f6a2a1c 100644
--- a/includes/ProfilerSimpleTrace.php
+++ b/includes/ProfilerSimpleTrace.php
@@ -21,50 +21,48 @@ class ProfilerSimpleTrace extends ProfilerSimple {
function __construct() {
global $wgRequestTime, $wgRUstart;
- if (!empty($wgRequestTime) && !empty($wgRUstart)) {
- $this->mWorkStack[] = array( '-total', 0, $wgRequestTime,$this->getCpuTime($wgRUstart));
- $elapsedcpu = $this->getCpuTime() - $this->getCpuTime($wgRUstart);
- $elapsedreal = microtime(true) - $wgRequestTime;
+ if ( !empty( $wgRequestTime ) && !empty( $wgRUstart ) ) {
+ $this->mWorkStack[] = array( '-total', 0, $wgRequestTime, $this->getCpuTime( $wgRUstart ) );
}
$this->trace .= "Beginning trace: \n";
}
function profileIn($functionname) {
- global $wgDebugFunctionEntry;
$this->mWorkStack[] = array($functionname, count( $this->mWorkStack ), microtime(true), $this->getCpuTime());
- $this->trace .= " " . sprintf("%6.1f",$this->memoryDiff()) . str_repeat( " ", count($this->mWorkStack)) . " > " . $functionname . "\n";
+ $this->trace .= " " . sprintf("%6.1f",$this->memoryDiff()) .
+ str_repeat( " ", count($this->mWorkStack)) . " > " . $functionname . "\n";
}
function profileOut($functionname) {
global $wgDebugFunctionEntry;
- if ($wgDebugFunctionEntry) {
+ if ( $wgDebugFunctionEntry ) {
$this->debug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
}
- list($ofname, /* $ocount */ ,$ortime,$octime) = array_pop($this->mWorkStack);
+ list( $ofname, /* $ocount */ , $ortime, $octime ) = array_pop( $this->mWorkStack );
- if (!$ofname) {
+ if ( !$ofname ) {
$this->trace .= "Profiling error: $functionname\n";
} else {
- if ($functionname == 'close') {
+ if ( $functionname == 'close' ) {
$message = "Profile section ended by close(): {$ofname}";
$functionname = $ofname;
$this->trace .= $message . "\n";
}
- elseif ($ofname != $functionname) {
- $self->trace .= "Profiling error: in({$ofname}), out($functionname)";
+ elseif ( $ofname != $functionname ) {
+ $this->trace .= "Profiling error: in({$ofname}), out($functionname)";
}
- $elapsedcpu = $this->getCpuTime() - $octime;
- $elapsedreal = microtime(true) - $ortime;
- $this->trace .= sprintf("%03.6f %6.1f",$elapsedreal,$this->memoryDiff()) . str_repeat(" ",count($this->mWorkStack)+1) . " < " . $functionname . "\n";
+ $elapsedreal = microtime( true ) - $ortime;
+ $this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
+ str_repeat(" ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
}
}
function memoryDiff() {
$diff = memory_get_usage() - $this->memory;
$this->memory = memory_get_usage();
- return $diff/1024;
+ return $diff / 1024;
}
function getOutput() {
diff --git a/includes/ProfilerStub.php b/includes/ProfilerStub.php
index 100cb8df..e624e6f0 100644
--- a/includes/ProfilerStub.php
+++ b/includes/ProfilerStub.php
@@ -7,6 +7,7 @@
/** backward compatibility */
$wgProfiling = false;
+$wgProfiler = null;
/** is setproctitle function available ? */
$haveProctitle = function_exists( 'setproctitle' );
@@ -29,12 +30,15 @@ function wfProfileIn( $fn = '' ) {
*/
function wfProfileOut( $fn = '' ) {
global $hackwhere, $wgDBname, $haveProctitle;
- if( !$haveProctitle )
+ if( !$haveProctitle ) {
return;
- if( count( $hackwhere ) )
+ }
+ if( count( $hackwhere ) ) {
array_pop( $hackwhere );
- if( count( $hackwhere ) )
+ }
+ if( count( $hackwhere ) ) {
setproctitle( $hackwhere[count( $hackwhere )-1] . " [$wgDBname]" );
+ }
}
/**
diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php
index 28df01ac..2d95d801 100644
--- a/includes/ProtectionForm.php
+++ b/includes/ProtectionForm.php
@@ -1,6 +1,8 @@
<?php
/**
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Page protection
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -17,6 +19,8 @@
* 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
*/
/**
@@ -71,7 +75,9 @@ class ProtectionForm {
$this->loadData();
}
- // Loads the current state of protection into the object.
+ /**
+ * Loads the current state of protection into the object.
+ */
function loadData() {
global $wgRequest, $wgUser;
global $wgRestrictionLevels;
@@ -140,7 +146,8 @@ class ProtectionForm {
/**
* Get the expiry time for a given action, by combining the relevant inputs.
- * Returns a 14-char timestamp or "infinity", or false if the input was invalid
+ *
+ * @return 14-char timestamp or "infinity", or false if the input was invalid
*/
function getExpiry( $action ) {
if ( $this->mExpirySelection[$action] == 'existing' ) {
@@ -166,6 +173,9 @@ class ProtectionForm {
return $time;
}
+ /**
+ * Main entry point for action=protect and action=unprotect
+ */
function execute() {
global $wgRequest, $wgOut;
if( $wgRequest->wasPosted() ) {
@@ -178,6 +188,11 @@ class ProtectionForm {
}
}
+ /**
+ * Show the input form with optional error message
+ *
+ * @param $err String: error message or null if there's no error
+ */
function show( $err = null ) {
global $wgOut, $wgUser;
@@ -228,8 +243,14 @@ class ProtectionForm {
$this->showLogExtract( $wgOut );
}
+ /**
+ * Save submitted protection form
+ *
+ * @return Boolean: success
+ */
function save() {
global $wgRequest, $wgUser;
+
# Permission check!
if ( $this->disabled ) {
$this->show();
@@ -306,21 +327,21 @@ class ProtectionForm {
/**
* Build the input form
*
- * @return $out string HTML form
+ * @return String: HTML form
*/
function buildForm() {
- global $wgUser, $wgLang;
+ global $wgUser, $wgLang, $wgOut;
$mProtectreasonother = Xml::label( wfMsg( 'protectcomment' ), 'wpProtectReasonSelection' );
$mProtectreason = Xml::label( wfMsg( 'protect-otherreason' ), 'mwProtect-reason' );
$out = '';
if( !$this->disabled ) {
- $out .= $this->buildScript();
+ $wgOut->addModules( 'mediawiki.legacy.protect' );
$out .= Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->mTitle->getLocalUrl( 'action=protect' ),
'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
- $out .= Xml::hidden( 'wpEditToken',$wgUser->editToken() );
+ $out .= Html::hidden( 'wpEditToken',$wgUser->editToken() );
}
$out .= Xml::openElement( 'fieldset' ) .
@@ -487,13 +508,20 @@ class ProtectionForm {
}
if ( !$this->disabled ) {
- $out .= Xml::closeElement( 'form' ) .
- $this->buildCleanupScript();
+ $out .= Xml::closeElement( 'form' );
+ $wgOut->addScript( $this->buildCleanupScript() );
}
return $out;
}
+ /**
+ * Build protection level selector
+ *
+ * @param $action String: action to protect
+ * @param $selected String: current protection level
+ * @return String: HTML fragment
+ */
function buildSelector( $action, $selected ) {
global $wgRestrictionLevels, $wgUser;
@@ -530,8 +558,8 @@ class ProtectionForm {
/**
* Prepare the label for a protection selector option
*
- * @param string $permission Permission required
- * @return string
+ * @param $permission String: permission required
+ * @return String
*/
private function getOptionLabel( $permission ) {
if( $permission == '' ) {
@@ -544,14 +572,7 @@ class ProtectionForm {
return $msg;
}
}
-
- function buildScript() {
- global $wgStylePath, $wgStyleVersion;
- return Xml::tags( 'script', array(
- 'type' => 'text/javascript',
- 'src' => $wgStylePath . "/common/protect.js?$wgStyleVersion.1" ), '' );
- }
-
+
function buildCleanupScript() {
global $wgRestrictionLevels, $wgGroupPermissions;
$script = 'var wgCascadeableLevels=';
@@ -571,11 +592,13 @@ class ProtectionForm {
$encOptions = Xml::encodeJsVar( $options );
$script .= "ProtectionForm.init($encOptions)";
- return Xml::tags( 'script', array( 'type' => 'text/javascript' ), $script );
+ return Html::inlineScript( "if ( window.mediaWiki ) { $script }" );
}
/**
- * @param OutputPage $out
+ * Show protection long extracts for this page
+ *
+ * @param $out OutputPage
* @access private
*/
function showLogExtract( &$out ) {
diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php
index 5719e3e8..13c19965 100644
--- a/includes/ProxyTools.php
+++ b/includes/ProxyTools.php
@@ -1,6 +1,7 @@
<?php
/**
* Functions for dealing with proxies
+ *
* @file
*/
@@ -67,15 +68,15 @@ function wfGetAgent() {
* @return string
*/
function wfGetIP() {
- global $wgIP, $wgUsePrivateIPs, $wgCommandLineMode;
+ global $wgUsePrivateIPs, $wgCommandLineMode;
+ static $ip = false;
# Return cached result
- if ( !empty( $wgIP ) ) {
- return $wgIP;
+ if ( !empty( $ip ) ) {
+ return $ip;
}
$ipchain = array();
- $ip = false;
/* collect the originating ips */
# Client connecting to this webserver
@@ -111,12 +112,14 @@ function wfGetIP() {
}
}
+ # Allow extensions to improve our guess
+ wfRunHooks( 'GetIP', array( &$ip ) );
+
if( !$ip ) {
throw new MWException( "Unable to determine IP" );
}
wfDebug( "IP: $ip\n" );
- $wgIP = $ip;
return $ip;
}
@@ -183,9 +186,12 @@ function wfProxyCheck() {
/**
* Convert a network specification in CIDR notation to an integer network and a number of bits
+ *
+ * @deprecated Call IP::parseCIDR() directly, will be removed in 1.19
* @return array(string, int)
*/
function wfParseCIDR( $range ) {
+ wfDeprecated( __FUNCTION__ );
return IP::parseCIDR( $range );
}
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index 827264be..d9fb3bb2 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -228,8 +228,6 @@ class QueryPage {
return false;
}
- $querycache = $dbr->tableName( 'querycache' );
-
if ( $ignoreErrors ) {
$ignoreW = $dbw->ignoreErrors( true );
$ignoreR = $dbr->ignoreErrors( true );
@@ -264,13 +262,9 @@ class QueryPage {
if ( count( $vals ) ) {
if ( !$dbw->insert( 'querycache', $vals, __METHOD__ ) ) {
// Set result to false to indicate error
- $dbr->freeResult( $res );
$res = false;
}
}
- if ( $res ) {
- $dbr->freeResult( $res );
- }
if ( $ignoreErrors ) {
$dbw->ignoreErrors( $ignoreW );
$dbr->ignoreErrors( $ignoreR );
@@ -349,7 +343,7 @@ class QueryPage {
$this->preprocessResults( $dbr, $res );
- $wgOut->addHTML( XML::openElement( 'div', array('class' => 'mw-spcontent') ) );
+ $wgOut->addHTML( Xml::openElement( 'div', array('class' => 'mw-spcontent') ) );
# Top header and navigation
if( $shownavigation ) {
@@ -364,7 +358,7 @@ class QueryPage {
# No results to show, so don't bother with "showing X of Y" etc.
# -- just let the user know and give up now
$wgOut->addHTML( '<p>' . wfMsgHtml( 'specialpage-empty' ) . '</p>' );
- $wgOut->addHTML( XML::closeElement( 'div' ) );
+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
return;
}
}
@@ -384,7 +378,7 @@ class QueryPage {
$wgOut->addHTML( '<p>' . $paging . '</p>' );
}
- $wgOut->addHTML( XML::closeElement( 'div' ) );
+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
return $num;
}
@@ -488,11 +482,12 @@ class QueryPage {
$sql = $this->getSQL() . $this->getOrder();
$sql = $dbr->limitResult( $sql, $limit, 0 );
$res = $dbr->query( $sql, 'QueryPage::doFeed' );
- while( $obj = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $obj ) {
$item = $this->feedResult( $obj );
- if( $item ) $feed->outItem( $item );
+ if( $item ) {
+ $feed->outItem( $item );
+ }
}
- $dbr->freeResult( $res );
$feed->outFooter();
return true;
@@ -539,10 +534,10 @@ class QueryPage {
}
function feedTitle() {
- global $wgContLanguageCode, $wgSitename;
+ global $wgLanguageCode, $wgSitename;
$page = SpecialPage::getPage( $this->getName() );
$desc = $page->getDescription();
- return "$wgSitename - $desc [$wgContLanguageCode]";
+ return "$wgSitename - $desc [$wgLanguageCode]";
}
function feedDesc() {
@@ -574,8 +569,9 @@ abstract class WantedQueryPage extends QueryPage {
*/
function preprocessResults( $db, $res ) {
$batch = new LinkBatch;
- while ( $row = $db->fetchObject( $res ) )
+ foreach ( $res as $row ) {
$batch->add( $row->namespace, $row->title );
+ }
$batch->execute();
// Back to start for display
@@ -585,6 +581,17 @@ abstract class WantedQueryPage extends QueryPage {
}
/**
+ * Should formatResult() always check page existence, even if
+ * the results are fresh? This is a (hopefully temporary)
+ * kluge for Special:WantedFiles, which may contain false
+ * positives for files that exist e.g. in a shared repo (bug
+ * 6220).
+ */
+ function forceExistenceCheck() {
+ return false;
+ }
+
+ /**
* Format an individual result
*
* @param $skin Skin to use for UI elements
@@ -594,9 +601,9 @@ abstract class WantedQueryPage extends QueryPage {
public function formatResult( $skin, $result ) {
$title = Title::makeTitleSafe( $result->namespace, $result->title );
if( $title instanceof Title ) {
- if( $this->isCached() ) {
- $pageLink = $title->exists()
- ? '<s>' . $skin->link( $title ) . '</s>'
+ if( $this->isCached() || $this->forceExistenceCheck() ) {
+ $pageLink = $title->isKnown()
+ ? '<del>' . $skin->link( $title ) . '</del>'
: $skin->link(
$title,
null,
diff --git a/includes/RawPage.php b/includes/RawPage.php
index 2b610318..ff935c2a 100644
--- a/includes/RawPage.php
+++ b/includes/RawPage.php
@@ -1,7 +1,10 @@
<?php
/**
- * Copyright (C) 2004 Gabriel Wicke <wicke@wikidev.net>
+ * Raw page text accessor
+ *
+ * Copyright © 2004 Gabriel Wicke <wicke@wikidev.net>
* http://wikidev.net/
+ *
* Based on HistoryPage and SpecialExport
*
* License: GPL (http://www.gnu.org/copyleft/gpl.html)
@@ -20,15 +23,15 @@ class RawPage {
var $mSmaxage, $mMaxage;
var $mContentType, $mExpandTemplates;
- function __construct( &$article, $request = false ) {
+ function __construct( Article $article, $request = false ) {
global $wgRequest, $wgInputEncoding, $wgSquidMaxage, $wgJsMimeType, $wgGroupPermissions;
- $allowedCTypes = array('text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit');
- $this->mArticle =& $article;
- $this->mTitle =& $article->mTitle;
+ $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
+ $this->mArticle = $article;
+ $this->mTitle = $article->mTitle;
if( $request === false ) {
- $this->mRequest =& $wgRequest;
+ $this->mRequest = $wgRequest;
} else {
$this->mRequest = $request;
}
@@ -54,7 +57,7 @@ class RawPage {
break;
case 'prev':
# output previous revision, or nothing if there isn't one
- if( ! $oldid ) {
+ if( !$oldid ) {
# get the current revision so we can get the penultimate one
$this->mArticle->getTouched();
$oldid = $this->mArticle->mLatest;
@@ -73,8 +76,12 @@ class RawPage {
if( $gen == 'css' ) {
$this->mGen = $gen;
- if( is_null( $smaxage ) ) $smaxage = $wgSquidMaxage;
- if($ctype == '') $ctype = 'text/css';
+ if( is_null( $smaxage ) ) {
+ $smaxage = $wgSquidMaxage;
+ }
+ if( $ctype == '' ) {
+ $ctype = 'text/css';
+ }
} elseif( $gen == 'js' ) {
$this->mGen = $gen;
if( is_null( $smaxage ) ) $smaxage = $wgSquidMaxage;
@@ -85,9 +92,9 @@ class RawPage {
$this->mCharset = $wgInputEncoding;
# Force caching for CSS and JS raw content, default: 5 minutes
- if( is_null($smaxage) and ($ctype=='text/css' or $ctype==$wgJsMimeType) ) {
+ if( is_null( $smaxage ) && ( $ctype == 'text/css' || $ctype == $wgJsMimeType ) ) {
global $wgForcedRawSMaxage;
- $this->mSmaxage = intval($wgForcedRawSMaxage);
+ $this->mSmaxage = intval( $wgForcedRawSMaxage );
} else {
$this->mSmaxage = intval( $smaxage );
}
@@ -95,13 +102,13 @@ class RawPage {
# Output may contain user-specific data;
# vary generated content for open sessions and private wikis
- if( $this->mGen or !$wgGroupPermissions['*']['read'] ) {
+ if( $this->mGen || !$wgGroupPermissions['*']['read'] ) {
$this->mPrivateCache = $this->mSmaxage == 0 || session_id() != '';
} else {
$this->mPrivateCache = false;
}
- if( $ctype == '' or ! in_array( $ctype, $allowedCTypes ) ) {
+ if( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
$this->mContentType = 'text/x-wiki';
} else {
$this->mContentType = $ctype;
@@ -109,44 +116,30 @@ class RawPage {
}
function view() {
- global $wgOut, $wgScript, $wgRequest;
-
- if( $wgRequest->isPathInfoBad() ) {
- # Internet Explorer will ignore the Content-Type header if it
- # thinks it sees a file extension it recognizes. Make sure that
- # all raw requests are done through the script node, which will
- # have eg '.php' and should remain safe.
- #
- # We used to redirect to a canonical-form URL as a general
- # backwards-compatibility / good-citizen nice thing. However
- # a lot of servers are set up in buggy ways, resulting in
- # redirect loops which hang the browser until the CSS load
- # times out.
- #
- # Just return a 403 Forbidden and get it over with.
- wfHttpError( 403, 'Forbidden',
- 'Invalid file extension found in PATH_INFO or QUERY_STRING. ' .
- 'Raw pages must be accessed through the primary script entry point.' );
+ global $wgOut, $wgRequest;
+
+ if( !$wgRequest->checkUrlExtension() ) {
+ $wgOut->disable();
return;
}
- header( "Content-type: ".$this->mContentType.'; charset='.$this->mCharset );
+ header( 'Content-type: ' . $this->mContentType . '; charset=' . $this->mCharset );
# allow the client to cache this for 24 hours
$mode = $this->mPrivateCache ? 'private' : 'public';
- header( 'Cache-Control: '.$mode.', s-maxage='.$this->mSmaxage.', max-age='.$this->mMaxage );
-
+ header( 'Cache-Control: ' . $mode . ', s-maxage=' . $this->mSmaxage . ', max-age=' . $this->mMaxage );
+
global $wgUseFileCache;
- if( $wgUseFileCache and HTMLFileCache::useFileCache() ) {
+ if( $wgUseFileCache && HTMLFileCache::useFileCache() ) {
$cache = new HTMLFileCache( $this->mTitle, 'raw' );
if( $cache->isFileCacheGood( /* Assume up to date */ ) ) {
$cache->loadFromFileCache();
$wgOut->disable();
return;
} else {
- ob_start( array(&$cache, 'saveToFileCache' ) );
+ ob_start( array( &$cache, 'saveToFileCache' ) );
}
}
-
+
$text = $this->getRawText();
if( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
@@ -158,11 +151,12 @@ class RawPage {
}
function getRawText() {
- global $wgUser, $wgOut, $wgRequest;
+ global $wgUser, $wgOut;
if( $this->mGen ) {
$sk = $wgUser->getSkin();
- if( !StubObject::isRealObject( $wgOut ) )
+ if( !StubObject::isRealObject( $wgOut ) ) {
$wgOut->_unstub( 2 );
+ }
$sk->initPage( $wgOut );
if( $this->mGen == 'css' ) {
return $sk->generateUserStylesheet();
@@ -183,8 +177,9 @@ class RawPage {
$key = $this->mTitle->getDBkey();
$text = wfMsgForContentNoTrans( $key );
# If the message doesn't exist, return a blank
- if( wfEmptyMsg( $key, $text ) )
+ if( wfEmptyMsg( $key, $text ) ) {
$text = '';
+ }
$found = true;
} else {
// Get it from the DB
@@ -193,11 +188,12 @@ class RawPage {
$lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
header( "Last-modified: $lastmod" );
- if( !is_null($this->mSection ) ) {
+ if( !is_null( $this->mSection ) ) {
global $wgParser;
- $text = $wgParser->getSection ( $rev->getText(), $this->mSection );
- } else
+ $text = $wgParser->getSection( $rev->getText(), $this->mSection );
+ } else {
$text = $rev->getText();
+ }
$found = true;
}
}
@@ -209,7 +205,7 @@ class RawPage {
# 404s aren't generally cached and it would create
# extra hits when user CSS/JS are on and the user doesn't
# have the pages.
- header( "HTTP/1.0 404 Not Found" );
+ header( 'HTTP/1.0 404 Not Found' );
}
// Special-case for empty CSS/JS
@@ -221,22 +217,24 @@ class RawPage {
//
// Give it a comment...
if( strlen( $text ) == 0 &&
- ($this->mContentType == 'text/css' ||
+ ( $this->mContentType == 'text/css' ||
$this->mContentType == 'text/javascript' ) ) {
- return "/* Empty */";
+ return '/* Empty */';
}
return $this->parseArticleText( $text );
}
function parseArticleText( $text ) {
- if( $text === '' )
+ if( $text === '' ) {
return '';
- else
+ } else {
if( $this->mExpandTemplates ) {
global $wgParser;
return $wgParser->preprocess( $text, $this->mTitle, new ParserOptions() );
- } else
+ } else {
return $text;
+ }
+ }
}
}
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
index 51b608d8..803420f6 100644
--- a/includes/RecentChange.php
+++ b/includes/RecentChange.php
@@ -2,6 +2,7 @@
/**
* Utility class for creating new RC entries
+ *
* mAttribs:
* rc_id id of the row in the recentchanges table
* rc_timestamp time the entry was made
@@ -73,7 +74,6 @@ class RecentChange {
$res = $dbr->select( 'recentchanges', '*', array( 'rc_id' => $rcid ), __METHOD__ );
if( $res && $dbr->numRows( $res ) > 0 ) {
$row = $dbr->fetchObject( $res );
- $dbr->freeResult( $res );
return self::newFromRow( $row );
} else {
return null;
@@ -115,6 +115,10 @@ class RecentChange {
$this->mExtra = $extra;
}
+ /**
+ *
+ * @return Title
+ */
public function &getTitle() {
if( $this->mTitle === false ) {
$this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
@@ -208,24 +212,27 @@ class RecentChange {
}
/**
- * Send some text to UDP
+ * Send some text to UDP.
+ * @see RecentChange::cleanupForIRC
* @param $line String: text to send
- * @param $prefix String
- * @param $address String: address
+ * @param $address String: defaults to $wgRC2UDPAddress.
+ * @param $prefix String: defaults to $wgRC2UDPPrefix.
+ * @param $port Int: defaults to $wgRC2UDPPort. (Since 1.17)
* @return Boolean: success
*/
- public static function sendToUDP( $line, $address = '', $prefix = '' ) {
+ public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
global $wgRC2UDPAddress, $wgRC2UDPPrefix, $wgRC2UDPPort;
# Assume default for standard RC case
$address = $address ? $address : $wgRC2UDPAddress;
$prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
+ $port = $port ? $port : $wgRC2UDPPort;
# Notify external application via UDP
if( $address ) {
$conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
if( $conn ) {
$line = $prefix . $line;
wfDebug( __METHOD__ . ": sending UDP line: $line\n" );
- socket_sendto( $conn, $line, strlen($line), 0, $address, $wgRC2UDPPort );
+ socket_sendto( $conn, $line, strlen($line), 0, $address, $port );
socket_close( $conn );
return true;
} else {
@@ -249,7 +256,7 @@ class RecentChange {
*
* @param $change Mixed: RecentChange or corresponding rc_id
* @param $auto Boolean: for automatic patrol
- * @return See doMarkPatrolled(), or null if $change is not an existing rc_id
+ * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id
*/
public static function markPatrolled( $change, $auto = false ) {
$change = $change instanceof RecentChange
@@ -576,7 +583,7 @@ class RecentChange {
/**
* Get an attribute value
*
- * @param $name Attribute name
+ * @param $name String Attribute name
* @return mixed
*/
public function getAttribute( $name ) {
@@ -667,7 +674,7 @@ class RecentChange {
$flag .= ($rc_new ? "N" : "") . ($rc_minor ? "M" : "") . ($rc_bot ? "B" : "");
}
- if ( $wgRC2UDPInterwikiPrefix === true ) {
+ if ( $wgRC2UDPInterwikiPrefix === true && $wgLocalInterwiki !== false ) {
$prefix = $wgLocalInterwiki;
} elseif ( $wgRC2UDPInterwikiPrefix ) {
$prefix = $wgRC2UDPInterwikiPrefix;
diff --git a/includes/Revision.php b/includes/Revision.php
index 8d2c7e9d..9cc49350 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -82,6 +82,9 @@ class Revision {
if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
// Pre-1.5 ar_text row
$attribs['text'] = self::getRevisionText( $row, 'ar_' );
+ if ( $attribs['text'] === false ) {
+ throw new MWException( 'Unable to load text from archive row (possibly bug 22624)' );
+ }
}
return new self( $attribs );
}
@@ -290,7 +293,7 @@ class Revision {
* @param $row Mixed: either a database row or an array
* @access private
*/
- function Revision( $row ) {
+ function __construct( $row ) {
if( is_object( $row ) ) {
$this->mId = intval( $row->rev_id );
$this->mPage = intval( $row->rev_page );
@@ -314,8 +317,7 @@ class Revision {
if( isset( $row->page_latest ) ) {
$this->mCurrent = ( $row->rev_id == $row->page_latest );
- $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title );
- $this->mTitle->resetArticleID( $this->mPage );
+ $this->mTitle = Title::newFromRow( $row );
} else {
$this->mCurrent = false;
$this->mTitle = null;
@@ -601,6 +603,7 @@ class Revision {
/**
* Alias for getText(Revision::FOR_THIS_USER)
*
+ * @deprecated
* @return String
*/
public function revText() {
@@ -798,7 +801,7 @@ class Revision {
* Insert a new revision into the database, returning the new revision ID
* number on success and dies horribly on failure.
*
- * @param $dbw DatabaseBase (master connection)
+ * @param $dbw DatabaseBase: (master connection)
* @return Integer
*/
public function insertOn( $dbw ) {
@@ -996,7 +999,6 @@ class Revision {
public static function userCanBitfield( $bitfield, $field ) {
if( $bitfield & $field ) { // aspect is deleted
global $wgUser;
- $permission = '';
if ( $bitfield & self::DELETED_RESTRICTED ) {
$permission = 'suppressrevision';
} elseif ( $field & self::DELETED_TEXT ) {
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index 26837b3c..a6c64264 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -2,7 +2,7 @@
/**
* XHTML sanitizer for MediaWiki
*
- * Copyright (C) 2002-2005 Brion Vibber <brion@pobox.com> et al
+ * Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -40,10 +40,11 @@ define( 'MW_CHAR_REFS_REGEX',
* Allows some... latitude.
* Used in Sanitizer::fixTagAttributes and Sanitizer::decodeTagAttributes
*/
-$attrib = '[A-Za-z0-9]';
+$attribFirst = '[:A-Z_a-z0-9]';
+$attrib = '[:A-Z_a-z-.0-9]';
$space = '[\x09\x0a\x0d\x20]';
define( 'MW_ATTRIBS_REGEX',
- "/(?:^|$space)((?:xml:|xmlns:)?$attrib+)
+ "/(?:^|$space)({$attribFirst}{$attrib}*)
($space*=$space*
(?:
# The attribute value: quoted or alone
@@ -367,7 +368,8 @@ class Sanitizer {
'h2', 'h3', 'h4', 'h5', 'h6', 'cite', 'code', 'em', 's',
'strike', 'strong', 'tt', 'var', 'div', 'center',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
- 'ruby', 'rt' , 'rb' , 'rp', 'p', 'span', 'u', 'abbr'
+ 'ruby', 'rt' , 'rb' , 'rp', 'p', 'span', 'abbr', 'dfn',
+ 'kbd', 'samp'
);
$htmlsingle = array(
'br', 'hr', 'li', 'dt', 'dd'
@@ -389,6 +391,12 @@ class Sanitizer {
'li',
);
+ global $wgAllowImageTag;
+ if ( $wgAllowImageTag ) {
+ $htmlsingle[] = 'img';
+ $htmlsingleonly[] = 'img';
+ }
+
$htmlsingleallowed = array_unique( array_merge( $htmlsingle, $tabletags ) );
$htmlelementsStatic = array_unique( array_merge( $htmlsingle, $htmlpairsStatic, $htmlnest ) );
@@ -620,7 +628,7 @@ class Sanitizer {
* @todo Check for unique id attribute :P
*/
static function validateAttributes( $attribs, $whitelist ) {
- global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
+ global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes, $wgHtml5;
$whitelist = array_flip( $whitelist );
$hrefExp = '/^(' . wfUrlProtocols() . ')[^\s]+$/';
@@ -636,7 +644,8 @@ class Sanitizer {
continue;
}
- if( !isset( $whitelist[$attribute] ) ) {
+ # Allow any attribute beginning with "data-", if in HTML5 mode
+ if ( !($wgHtml5 && preg_match( '/^data-/i', $attribute )) && !isset( $whitelist[$attribute] ) ) {
continue;
}
@@ -914,7 +923,9 @@ class Sanitizer {
*
* To ensure we don't have to bother escaping anything, we also strip ', ",
* & even if $wgExperimentalIds is true. TODO: Is this the best tactic?
- * We also strip # because it upsets IE6.
+ * We also strip # because it upsets IE, and % because it could be
+ * ambiguous if it's part of something that looks like a percent escape
+ * (which don't work reliably in fragments cross-browser).
*
* @see http://www.w3.org/TR/html401/types.html#type-name Valid characters
* in the id and
@@ -940,7 +951,7 @@ class Sanitizer {
if ( $wgHtml5 && $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
$id = Sanitizer::decodeCharReferences( $id );
- $id = preg_replace( '/[ \t\n\r\f_\'"&#]+/', '_', $id );
+ $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
$id = trim( $id, '_' );
if ( $id === '' ) {
# Must have been all whitespace to start with.
@@ -988,17 +999,16 @@ class Sanitizer {
/**
* Given HTML input, escape with htmlspecialchars but un-escape entites.
- * This allows (generally harmless) entities like &nbsp; to survive.
+ * This allows (generally harmless) entities like &#160; to survive.
*
* @param $html String to escape
* @return String: escaped input
*/
static function escapeHtmlAllowEntities( $html ) {
+ $html = Sanitizer::decodeCharReferences( $html );
# It seems wise to escape ' as well as ", as a matter of course. Can't
# hurt.
$html = htmlspecialchars( $html, ENT_QUOTES );
- $html = str_replace( '&amp;', '&', $html );
- $html = Sanitizer::normalizeCharReferences( $html );
return $html;
}
@@ -1102,11 +1112,24 @@ class Sanitizer {
}
/**
+ * Normalizes whitespace in a section name, such as might be returned
+ * by Parser::stripSectionName(), for use in the id's that are used for
+ * section links.
+ *
+ * @param $section String
+ * @return String
+ */
+ static function normalizeSectionNameWhitespace( $section ) {
+ return trim( preg_replace( '/[ _]+/', ' ', $section ) );
+ }
+
+ /**
* Ensure that any entities and character references are legal
* for XML and XHTML specifically. Any stray bits will be
* &amp;-escaped to result in a valid text fragment.
*
- * a. any named char refs must be known in XHTML
+ * a. named char refs can only be &lt; &gt; &amp; &quot;, others are
+ * numericized (this way we're well-formed even without a DTD)
* b. any numeric char refs must be legal chars, not invalid or forbidden
* c. use &#x, not &#X
* d. fix or reject non-valid attributes
@@ -1145,9 +1168,10 @@ class Sanitizer {
/**
* If the named entity is defined in the HTML 4.0/XHTML 1.0 DTD,
- * return the named entity reference as is. If the entity is a
- * MediaWiki-specific alias, returns the HTML equivalent. Otherwise,
- * returns HTML-escaped text of pseudo-entity source (eg &amp;foo;)
+ * return the equivalent numeric entity reference (except for the core &lt;
+ * &gt; &amp; &quot;). If the entity is a MediaWiki-specific alias, returns
+ * the HTML equivalent. Otherwise, returns HTML-escaped text of
+ * pseudo-entity source (eg &amp;foo;)
*
* @param $name String
* @return String
@@ -1156,8 +1180,11 @@ class Sanitizer {
global $wgHtmlEntities, $wgHtmlEntityAliases;
if ( isset( $wgHtmlEntityAliases[$name] ) ) {
return "&{$wgHtmlEntityAliases[$name]};";
- } elseif( isset( $wgHtmlEntities[$name] ) ) {
+ } elseif ( in_array( $name,
+ array( 'lt', 'gt', 'amp', 'quot' ) ) ) {
return "&$name;";
+ } elseif ( isset( $wgHtmlEntities[$name] ) ) {
+ return "&#{$wgHtmlEntities[$name]};";
} else {
return "&amp;$name;";
}
@@ -1210,6 +1237,30 @@ class Sanitizer {
}
/**
+ * Decode any character references, numeric or named entities,
+ * in the next and normalize the resulting string. (bug 14952)
+ *
+ * This is useful for page titles, not for text to be displayed,
+ * MediaWiki allows HTML entities to escape normalization as a feature.
+ *
+ * @param $text String (already normalized, containing entities)
+ * @return String (still normalized, without entities)
+ */
+ public static function decodeCharReferencesAndNormalize( $text ) {
+ global $wgContLang;
+ $text = preg_replace_callback(
+ MW_CHAR_REFS_REGEX,
+ array( 'Sanitizer', 'decodeCharReferencesCallback' ),
+ $text, /* limit */ -1, $count );
+
+ if ( $count ) {
+ return $wgContLang->normalize( $text );
+ } else {
+ return $text;
+ }
+ }
+
+ /**
* @param $matches String
* @return String
*/
@@ -1342,10 +1393,10 @@ class Sanitizer {
'em' => $common,
'strong' => $common,
'cite' => $common,
- # dfn
+ 'dfn' => $common,
'code' => $common,
- # samp
- # kbd
+ 'samp' => $common,
+ 'kbd' => $common,
'var' => $common,
'abbr' => $common,
# acronym
@@ -1412,8 +1463,9 @@ class Sanitizer {
# 13.2
# Not usually allowed, but may be used for extension-style hooks
- # such as <math> when it is rasterized
- 'img' => array_merge( $common, array( 'alt' ) ),
+ # such as <math> when it is rasterized, or if $wgAllowImageTag is
+ # true
+ 'img' => array_merge( $common, array( 'alt', 'src', 'width', 'height' ) ),
# 15.2.1
'tt' => $common,
@@ -1495,7 +1547,7 @@ class Sanitizer {
$url = Sanitizer::decodeCharReferences( $url );
# Escape any control characters introduced by the above step
- $url = preg_replace( '/[\][<>"\\x00-\\x20\\x7F]/e', "urlencode('\\0')", $url );
+ $url = preg_replace( '/[\][<>"\\x00-\\x20\\x7F\|]/e', "urlencode('\\0')", $url );
# Validate hostname portion
$matches = array();
diff --git a/includes/SeleniumWebSettings.php b/includes/SeleniumWebSettings.php
new file mode 100644
index 00000000..8afb26da
--- /dev/null
+++ b/includes/SeleniumWebSettings.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * Dynamically change configuration variables based on the test suite name and a cookie value.
+ * For details on how to configure a wiki for a Selenium test, see:
+ * http://www.mediawiki.org/wiki/SeleniumFramework#Test_Wiki_configuration
+ */
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( 1 );
+}
+
+$fname = 'SeleniumWebSettings.php';
+wfProfileIn( $fname );
+
+$cookiePrefix = $wgSitename . "-";
+$cookieName = $cookiePrefix . "Selenium";
+
+//if we find a request parameter containing the test name, set a cookie with the test name
+if ( isset( $_GET['setupTestSuite'] ) ) {
+ $setupTestSuiteName = $_GET['setupTestSuite'];
+
+ if ( preg_match( '/[^a-zA-Z0-9_-]/', $setupTestSuiteName ) || !isset( $wgSeleniumTestConfigs[$setupTestSuiteName] ) ) {
+ return;
+ }
+ if ( strlen( $setupTestSuiteName) > 0 ) {
+ $expire = time() + 600;
+ setcookie( $cookieName,
+ $setupTestSuiteName,
+ $expire,
+ $wgCookiePath,
+ $wgCookieDomain,
+ $wgCookieSecure,
+ true );
+ }
+}
+//clear the cookie based on a request param
+if ( isset( $_GET['clearTestSuite'] ) ) {
+ $expire = time() - 600;
+ setcookie( $cookieName,
+ '',
+ $expire,
+ $wgCookiePath,
+ $wgCookieDomain,
+ $wgCookieSecure,
+ true );
+}
+
+//if a cookie is found, run the appropriate callback to get the config params.
+if ( isset( $_COOKIE[$cookieName] ) ) {
+ $testSuiteName = $_COOKIE[$cookieName];
+ if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
+ return;
+ }
+ $testIncludes = array(); //array containing all the includes needed for this test
+ $testGlobalConfigs = array(); //an array containg all the global configs needed for this test
+ $callback = $wgSeleniumTestConfigs[$testSuiteName];
+ call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs));
+
+ foreach ( $testIncludes as $includeFile ) {
+ $file = $IP . '/' . $includeFile;
+ require_once( $file );
+ }
+ foreach ( $testGlobalConfigs as $key => $value ) {
+ if ( is_array( $value ) ) {
+ $GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
+
+ } else {
+ $GLOBALS[$key] = $value;
+ }
+ }
+}
+
+wfProfileOut( $fname );
diff --git a/includes/Setup.php b/includes/Setup.php
index cd9146ab..5d348885 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -1,6 +1,8 @@
<?php
/**
* Include most things that's need to customize the site
+ *
+ * @file
*/
/**
@@ -29,6 +31,7 @@ if ( !isset( $wgVersion ) ) {
// Set various default paths sensibly...
if( $wgScript === false ) $wgScript = "$wgScriptPath/index$wgScriptExtension";
if( $wgRedirectScript === false ) $wgRedirectScript = "$wgScriptPath/redirect$wgScriptExtension";
+if( $wgLoadScript === false ) $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
if( $wgArticlePath === false ) {
if( $wgUsePathInfo ) {
@@ -39,6 +42,7 @@ if( $wgArticlePath === false ) {
}
if( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
+if( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
if( $wgStyleDirectory === false) $wgStyleDirectory = "$IP/skins";
if( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
@@ -53,9 +57,32 @@ if( $wgTmpDirectory === false ) $wgTmpDirectory = "{$wgUploadDirectory}/tmp";
if( $wgReadOnlyFile === false ) $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
if( $wgFileCacheDirectory === false ) $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
+if( $wgDeletedDirectory === false ) $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
+
+if( isset( $wgFileStore['deleted']['directory'] ) ) {
+ $wgDeletedDirectory = $wgFileStore['deleted']['directory'];
+}
+
+if( isset($wgFooterIcons["copyright"]) &&
+ isset($wgFooterIcons["copyright"]["copyright"]) &&
+ $wgFooterIcons["copyright"]["copyright"] === array() ) {
+ if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) {
+ $wgFooterIcons["copyright"]["copyright"] = $wgCopyrightIcon;
+ } elseif ( $wgRightsIcon || $wgRightsText ) {
+ $wgFooterIcons["copyright"]["copyright"] = array(
+ "url" => $wgRightsUrl,
+ "src" => $wgRightsIcon,
+ "alt" => $wgRightsText,
+ );
+ } else {
+ unset($wgFooterIcons["copyright"]["copyright"]);
+ }
+}
-if ( empty( $wgFileStore['deleted']['directory'] ) ) {
- $wgFileStore['deleted']['directory'] = "{$wgUploadDirectory}/deleted";
+if( isset($wgFooterIcons["poweredby"]) &&
+ isset($wgFooterIcons["poweredby"]["mediawiki"]) &&
+ $wgFooterIcons["poweredby"]["mediawiki"]["src"] === null ) {
+ $wgFooterIcons["poweredby"]["mediawiki"]["src"] = "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
}
/**
@@ -79,16 +106,23 @@ $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
* Initialise $wgLocalFileRepo from backwards-compatible settings
*/
if ( !$wgLocalFileRepo ) {
+ if( isset( $wgFileStore['deleted']['hash'] ) ) {
+ $deletedHashLevel = $wgFileStore['deleted']['hash'];
+ } else {
+ $deletedHashLevel = $wgHashedUploadDirectory ? 3 : 0;
+ }
$wgLocalFileRepo = array(
'class' => 'LocalRepo',
'name' => 'local',
'directory' => $wgUploadDirectory,
+ 'scriptDirUrl' => $wgScriptPath,
+ 'scriptExtension' => $wgScriptExtension,
'url' => $wgUploadBaseUrl ? $wgUploadBaseUrl . $wgUploadPath : $wgUploadPath,
'hashLevels' => $wgHashedUploadDirectory ? 2 : 0,
'thumbScriptUrl' => $wgThumbnailScriptPath,
'transformVia404' => !$wgGenerateThumbnailOnParse,
- 'deletedDir' => $wgFileStore['deleted']['directory'],
- 'deletedHashLevels' => $wgFileStore['deleted']['hash']
+ 'deletedDir' => $wgDeletedDirectory,
+ 'deletedHashLevels' => $deletedHashLevel
);
}
/**
@@ -157,7 +191,6 @@ require_once( "$IP/includes/Namespace.php" );
require_once( "$IP/includes/ProxyTools.php" );
require_once( "$IP/includes/ObjectCache.php" );
require_once( "$IP/includes/ImageFunctions.php" );
-require_once( "$IP/includes/StubObject.php" );
wfProfileOut( $fname.'-includes' );
wfProfileIn( $fname.'-misc1' );
@@ -165,7 +198,7 @@ wfProfileIn( $fname.'-misc1' );
wfMemoryLimit();
/**
- * Set up the timezone, suppressing the pseudo-security warning in PHP 5.1+
+ * Set up the timezone, suppressing the pseudo-security warning in PHP 5.1+
* that happens whenever you use a date function without the timezone being
* explicitly set. Inspired by phpMyAdmin's treatment of the problem.
*/
@@ -173,16 +206,21 @@ wfSuppressWarnings();
date_default_timezone_set( date_default_timezone_get() );
wfRestoreWarnings();
-$wgIP = false; # Load on demand
# Can't stub this one, it sets up $_GET and $_REQUEST in its constructor
$wgRequest = new WebRequest;
# Useful debug output
+global $wgCommandLineMode;
if ( $wgCommandLineMode ) {
wfDebug( "\n\nStart command line script $self\n" );
} else {
wfDebug( "Start request\n\n" );
- wfDebug( $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . "\n" );
+ # Output the REQUEST_URI. This is not supported by IIS in rewrite mode,
+ # so use an alternative
+ $requestUri = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] :
+ ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ? $_SERVER['HTTP_X_ORIGINAL_URL'] :
+ $_SERVER['PHP_SELF'] );
+ wfDebug( "{$_SERVER['REQUEST_METHOD']} {$requestUri}\n" );
if ( $wgDebugPrintHttpHeaders ) {
$headerOut = "HTTP HEADERS:\n";
@@ -251,6 +289,12 @@ if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
else $wgHtml5Version = 'HTML+RDFa 1.0';
}
+if ( $wgInvalidateCacheOnLocalSettingsChange ) {
+ $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) );
+}
+
+# Blacklisted file extensions shouldn't appear on the "allowed" list
+$wgFileExtensions = array_diff ( $wgFileExtensions, $wgFileBlacklist );
wfProfileOut( $fname.'-misc1' );
wfProfileIn( $fname.'-memcached' );
@@ -291,13 +335,15 @@ $wgCookiePrefix = strtr($wgCookiePrefix, "=,; +.\"'\\[", "__________");
if( !wfIniGetBool( 'session.auto_start' ) )
session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
-if( !$wgCommandLineMode && ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix.'Token'] ) ) ) {
- wfIncrStats( 'request_with_session' );
- wfSetupSession();
- $wgSessionStarted = true;
-} else {
- wfIncrStats( 'request_without_session' );
- $wgSessionStarted = false;
+if( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
+ if( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix.'Token'] ) ) {
+ wfIncrStats( 'request_with_session' );
+ wfSetupSession();
+ $wgSessionStarted = true;
+ } else {
+ wfIncrStats( 'request_without_session' );
+ $wgSessionStarted = false;
+ }
}
wfProfileOut( $fname.'-SetupSession' );
@@ -307,14 +353,13 @@ $wgContLang = new StubContLang;
// Now that variant lists may be available...
$wgRequest->interpolateTitle();
-
-$wgUser = new StubUser;
+$wgUser = $wgCommandLineMode ? new User : User::newFromSession();
$wgLang = new StubUserLang;
$wgOut = new StubObject( 'wgOut', 'OutputPage' );
$wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
$wgMessageCache = new StubObject( 'wgMessageCache', 'MessageCache',
- array( $messageMemc, $wgUseDatabaseMessages, $wgMsgCacheExpiry, wfWikiID() ) );
+ array( $messageMemc, $wgUseDatabaseMessages, $wgMsgCacheExpiry ) );
wfProfileOut( $fname.'-globals' );
wfProfileIn( $fname.'-User' );
@@ -337,9 +382,7 @@ wfProfileOut( $fname.'-User' );
wfProfileIn( $fname.'-misc2' );
$wgDeferredUpdateList = array();
-$wgPostCommitUpdateList = array();
-if ( $wgAjaxWatch ) $wgAjaxExportList[] = 'wfAjaxWatch';
if ( $wgAjaxUploadDestCheck ) $wgAjaxExportList[] = 'SpecialUpload::ajaxGetExistsWarning';
# Placeholders in case of DB error
diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php
index b6d83670..f4a4576a 100644
--- a/includes/SiteConfiguration.php
+++ b/includes/SiteConfiguration.php
@@ -194,10 +194,9 @@ class SiteConfiguration {
/**
* Retrieves a configuration setting for a given wiki, forced to a boolean.
- * @param $settingName String ID of the setting name to retrieve
+ * @param $setting String ID of the setting name to retrieve
* @param $wiki String Wiki ID of the wiki in question.
* @param $suffix String The suffix of the wiki in question.
- * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
* @param $wikiTags Array The tags assigned to the wiki.
* @return bool The value of the setting requested.
*/
@@ -216,7 +215,7 @@ class SiteConfiguration {
/**
* Retrieves the value of a given setting, and places it in a variable passed by reference.
- * @param $settingName String ID of the setting name to retrieve
+ * @param $setting String ID of the setting name to retrieve
* @param $wiki String Wiki ID of the wiki in question.
* @param $suffix String The suffix of the wiki in question.
* @param $var Reference The variable to insert the value into.
@@ -232,7 +231,7 @@ class SiteConfiguration {
/**
* Retrieves the value of a given setting, and places it in its corresponding global variable.
- * @param $settingName String ID of the setting name to retrieve
+ * @param $setting String ID of the setting name to retrieve
* @param $wiki String Wiki ID of the wiki in question.
* @param $suffix String The suffix of the wiki in question.
* @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
@@ -294,8 +293,9 @@ class SiteConfiguration {
$ret = call_user_func_array( $this->siteParamsCallback, array( $this, $wiki ) );
# Validate the returned value
- if( !is_array( $ret ) )
+ if( !is_array( $ret ) ) {
return $default;
+ }
foreach( $default as $name => $def ){
if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) )
diff --git a/includes/SiteStats.php b/includes/SiteStats.php
index 16e3c5f2..11cef56f 100644
--- a/includes/SiteStats.php
+++ b/includes/SiteStats.php
@@ -104,23 +104,27 @@ class SiteStats {
*/
static function admins() {
wfDeprecated(__METHOD__);
- return self::numberingroup('sysop');
+ return self::numberingroup( 'sysop' );
}
/**
* Find the number of users in a given user group.
- * @param string $group Name of group
- * @return int
+ * @param $group String: name of group
+ * @return Integer
*/
- static function numberingroup($group) {
+ static function numberingroup( $group ) {
if ( !isset( self::$groupMemberCounts[$group] ) ) {
global $wgMemc;
$key = wfMemcKey( 'SiteStats', 'groupcounts', $group );
$hit = $wgMemc->get( $key );
if ( !$hit ) {
$dbr = wfGetDB( DB_SLAVE );
- $hit = $dbr->selectField( 'user_groups', 'COUNT(*)',
- array( 'ug_group' => $group ), __METHOD__ );
+ $hit = $dbr->selectField(
+ 'user_groups',
+ 'COUNT(*)',
+ array( 'ug_group' => $group ),
+ __METHOD__
+ );
$wgMemc->set( $key, $hit, 3600 );
}
self::$groupMemberCounts[$group] = $hit;
@@ -131,9 +135,9 @@ class SiteStats {
static function jobs() {
if ( !isset( self::$jobs ) ) {
$dbr = wfGetDB( DB_SLAVE );
- self::$jobs = $dbr->estimateRowCount('job');
+ self::$jobs = $dbr->estimateRowCount( 'job' );
/* Zero rows still do single row read for row that doesn't exist, but people are annoyed by that */
- if (self::$jobs == 1) {
+ if ( self::$jobs == 1 ) {
self::$jobs = 0;
}
}
@@ -144,7 +148,12 @@ class SiteStats {
wfProfileIn( __METHOD__ );
if( !isset( self::$pageCount[$ns] ) ) {
$dbr = wfGetDB( DB_SLAVE );
- $pageCount[$ns] = (int)$dbr->selectField( 'page', 'COUNT(*)', array( 'page_namespace' => $ns ), __METHOD__ );
+ $pageCount[$ns] = (int)$dbr->selectField(
+ 'page',
+ 'COUNT(*)',
+ array( 'page_namespace' => $ns ),
+ __METHOD__
+ );
}
wfProfileOut( __METHOD__ );
return $pageCount[$ns];
@@ -156,7 +165,6 @@ class SiteStats {
$row === false
or $row->ss_total_pages < $row->ss_good_articles
or $row->ss_total_edits < $row->ss_total_pages
- or $row->ss_users < $row->ss_admins
) {
return false;
}
@@ -164,7 +172,7 @@ class SiteStats {
foreach( array( 'total_views', 'total_edits', 'good_articles',
'total_pages', 'users', 'admins', 'images' ) as $member ) {
if(
- $row->{"ss_$member"} > 2000000000
+ $row->{"ss_$member"} > 2000000000
or $row->{"ss_$member"} < 0
) {
return false;
@@ -226,15 +234,26 @@ class SiteStatsUpdate {
}
public static function cacheUpdate( $dbw ) {
- $dbr = wfGetDB( DB_SLAVE, array( 'SpecialStatistics', 'vslow') );
+ global $wgActiveUserDays;
+ $dbr = wfGetDB( DB_SLAVE, array( 'SpecialStatistics', 'vslow' ) );
# Get non-bot users than did some recent action other than making accounts.
# If account creation is included, the number gets inflated ~20+ fold on enwiki.
- $activeUsers = $dbr->selectField( 'recentchanges', 'COUNT( DISTINCT rc_user_text )',
- array( 'rc_user != 0', 'rc_bot' => 0, "rc_log_type != 'newusers' OR rc_log_type IS NULL" ),
- __METHOD__ );
- $dbw->update( 'site_stats',
- array( 'ss_active_users' => intval($activeUsers) ),
- array( 'ss_row_id' => 1 ), __METHOD__
+ $activeUsers = $dbr->selectField(
+ 'recentchanges',
+ 'COUNT( DISTINCT rc_user_text )',
+ array(
+ 'rc_user != 0',
+ 'rc_bot' => 0,
+ "rc_log_type != 'newusers' OR rc_log_type IS NULL",
+ "rc_timestamp >= '{$dbw->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 )}'",
+ ),
+ __METHOD__
+ );
+ $dbw->update(
+ 'site_stats',
+ array( 'ss_active_users' => intval( $activeUsers ) ),
+ array( 'ss_row_id' => 1 ),
+ __METHOD__
);
return $activeUsers;
}
@@ -245,7 +264,7 @@ class SiteStatsUpdate {
*/
class SiteStatsInit {
- // Db connection
+ // Database connection
private $db;
// Various stats
@@ -253,7 +272,7 @@ class SiteStatsInit {
/**
* Constructor
- * @param $useMaster bool Whether to use the master db
+ * @param $useMaster Boolean: whether to use the master DB
*/
public function __construct( $useMaster = false ) {
$this->db = wfGetDB( $useMaster ? DB_MASTER : DB_SLAVE );
@@ -261,7 +280,7 @@ class SiteStatsInit {
/**
* Count the total number of edits
- * @return int
+ * @return Integer
*/
public function edits() {
$this->mEdits = $this->db->selectField( 'revision', 'COUNT(*)', '', __METHOD__ );
@@ -270,18 +289,27 @@ class SiteStatsInit {
}
/**
- * Count pages in article space
- * @return int
+ * Count pages in article space(s)
+ * @return Integer
*/
public function articles() {
global $wgContentNamespaces;
- $this->mArticles = $this->db->selectField( 'page', 'COUNT(*)', array( 'page_namespace' => $wgContentNamespaces, 'page_is_redirect' => 0, 'page_len > 0' ), __METHOD__ );
+ $this->mArticles = $this->db->selectField(
+ 'page',
+ 'COUNT(*)',
+ array(
+ 'page_namespace' => $wgContentNamespaces,
+ 'page_is_redirect' => 0,
+ 'page_len > 0'
+ ),
+ __METHOD__
+ );
return $this->mArticles;
}
/**
* Count total pages
- * @return int
+ * @return Integer
*/
public function pages() {
$this->mPages = $this->db->selectField( 'page', 'COUNT(*)', '', __METHOD__ );
@@ -290,7 +318,7 @@ class SiteStatsInit {
/**
* Count total users
- * @return int
+ * @return Integer
*/
public function users() {
$this->mUsers = $this->db->selectField( 'user', 'COUNT(*)', '', __METHOD__ );
@@ -299,7 +327,7 @@ class SiteStatsInit {
/**
* Count views
- * @return int
+ * @return Integer
*/
public function views() {
$this->mViews = $this->db->selectField( 'page', 'SUM(page_counter)', '', __METHOD__ );
@@ -308,7 +336,7 @@ class SiteStatsInit {
/**
* Count total files
- * @return int
+ * @return Integer
*/
public function files() {
$this->mFiles = $this->db->selectField( 'image', 'COUNT(*)', '', __METHOD__ );
@@ -318,9 +346,9 @@ class SiteStatsInit {
/**
* Do all updates and commit them. More or less a replacement
* for the original initStats, but without the calls to wfOut()
- * @param $update bool Whether to update the current stats or write fresh
- * @param $noViews bool When true, do not update the number of page views
- * @param $activeUsers Whether to update the number of active users
+ * @param $update Boolean: whether to update the current stats or write fresh
+ * @param $noViews Boolean: when true, do not update the number of page views
+ * @param $activeUsers Boolean: whether to update the number of active users
*/
public static function doAllAndCommit( $update, $noViews = false, $activeUsers = false ) {
// Grab the object and count everything
@@ -332,18 +360,21 @@ class SiteStatsInit {
$counter->files();
// Only do views if we don't want to not count them
- if( !$noViews )
+ if( !$noViews ) {
$counter->views();
+ }
// Update/refresh
- if( $update )
+ if( $update ) {
$counter->update();
- else
+ } else {
$counter->refresh();
+ }
// Count active users if need be
- if( $activeUsers )
+ if( $activeUsers ) {
SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
+ }
}
/**
@@ -368,15 +399,16 @@ class SiteStatsInit {
/**
* Return three arrays of params for the db queries
- * @return array
+ * @return Array
*/
private function getDbParams() {
- $values = array( 'ss_total_edits' => $this->mEdits,
- 'ss_good_articles' => $this->mArticles,
- 'ss_total_pages' => $this->mPages,
- 'ss_users' => $this->mUsers,
- 'ss_admins' => SiteStats::numberingroup( 'sysop' ), // @todo make this go away
- 'ss_images' => $this->mFiles );
+ $values = array(
+ 'ss_total_edits' => $this->mEdits,
+ 'ss_good_articles' => $this->mArticles,
+ 'ss_total_pages' => $this->mPages,
+ 'ss_users' => $this->mUsers,
+ 'ss_images' => $this->mFiles
+ );
$conds = array( 'ss_row_id' => 1 );
$views = array( 'ss_total_views' => $this->mViews );
return array( $values, $conds, $views );
diff --git a/includes/Skin.php b/includes/Skin.php
index 18867cbe..01b3b4fe 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -40,20 +40,24 @@ class Skin extends Linker {
static function getSkinNames() {
global $wgValidSkinNames;
static $skinsInitialised = false;
+
if ( !$skinsInitialised ) {
# Get a list of available skins
# Build using the regular expression '^(.*).php$'
# Array keys are all lower case, array value keep the case used by filename
#
wfProfileIn( __METHOD__ . '-init' );
+
global $wgStyleDirectory;
+
$skinDir = dir( $wgStyleDirectory );
# while code from www.php.net
- while( false !== ( $file = $skinDir->read() ) ) {
+ while ( false !== ( $file = $skinDir->read() ) ) {
// Skip non-PHP files, hidden files, and '.dep' includes
$matches = array();
- if( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
+
+ if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
$aSkin = $matches[1];
$wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
}
@@ -73,10 +77,13 @@ class Skin extends Linker {
*/
public static function getUsableSkins() {
global $wgSkipSkins;
+
$usableSkins = self::getSkinNames();
+
foreach ( $wgSkipSkins as $skip ) {
unset( $usableSkins[$skip] );
}
+
return $usableSkins;
}
@@ -89,15 +96,16 @@ class Skin extends Linker {
*/
static function normalizeKey( $key ) {
global $wgDefaultSkin;
+
$skinNames = Skin::getSkinNames();
- if( $key == '' ) {
+ if ( $key == '' ) {
// Don't return the default immediately;
// in a misconfiguration we need to fall back.
$key = $wgDefaultSkin;
}
- if( isset( $skinNames[$key] ) ) {
+ if ( isset( $skinNames[$key] ) ) {
return $key;
}
@@ -109,14 +117,16 @@ class Skin extends Linker {
2 => 'cologneblue'
);
- if( isset( $fallback[$key] ) ) {
+ if ( isset( $fallback[$key] ) ) {
$key = $fallback[$key];
}
- if( isset( $skinNames[$key] ) ) {
+ if ( isset( $skinNames[$key] ) ) {
return $key;
+ } else if ( isset( $skinNames[$wgDefaultSkin] ) ) {
+ return $wgDefaultSkin;
} else {
- return 'monobook';
+ return 'vector';
}
}
@@ -138,20 +148,21 @@ class Skin extends Linker {
if ( !class_exists( $className ) ) {
// Preload base classes to work around APC/PHP5 bug
$deps = "{$wgStyleDirectory}/{$skinName}.deps.php";
- if( file_exists( $deps ) ) {
+
+ if ( file_exists( $deps ) ) {
include_once( $deps );
}
require_once( "{$wgStyleDirectory}/{$skinName}.php" );
# Check if we got if not failback to default skin
- if( !class_exists( $className ) ) {
+ if ( !class_exists( $className ) ) {
# DO NOT die if the class isn't found. This breaks maintenance
# scripts and can cause a user account to be unrecoverable
# except by SQL manipulation if a previously valid skin name
# is no longer valid.
wfDebug( "Skin class does not exist: $className\n" );
- $className = 'SkinMonobook';
- require_once( "{$wgStyleDirectory}/MonoBook.php" );
+ $className = 'SkinVector';
+ require_once( "{$wgStyleDirectory}/Vector.php" );
}
}
$skin = new $className;
@@ -174,12 +185,14 @@ class Skin extends Linker {
if ( $wgOut->isQuickbarSuppressed() ) {
return 0;
}
+
$q = $wgUser->getOption( 'quickbar', 0 );
+
return $q;
}
function initPage( OutputPage $out ) {
- global $wgFavicon, $wgAppleTouchIcon;
+ global $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI;
wfProfileIn( __METHOD__ );
@@ -187,11 +200,11 @@ class Skin extends Linker {
# should not matter, but Konqueror (3.5.9 at least) incorrectly
# uses whichever one appears later in the HTML source. Make sure
# apple-touch-icon is specified first to avoid this.
- if( false !== $wgAppleTouchIcon ) {
+ if ( false !== $wgAppleTouchIcon ) {
$out->addLink( array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
}
- if( false !== $wgFavicon ) {
+ if ( false !== $wgFavicon ) {
$out->addLink( array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
}
@@ -201,7 +214,19 @@ class Skin extends Linker {
'type' => 'application/opensearchdescription+xml',
'href' => wfScript( 'opensearch_desc' ),
'title' => wfMsgForContent( 'opensearch-desc' ),
- ));
+ ) );
+
+ if ( $wgEnableAPI ) {
+ # Real Simple Discovery link, provides auto-discovery information
+ # for the MediaWiki API (and potentially additional custom API
+ # support such as WordPress or Twitter-compatible APIs for a
+ # blogging extension, etc)
+ $out->addLink( array(
+ 'rel' => 'EditURI',
+ 'type' => 'application/rsd+xml',
+ 'href' => wfExpandUrl( wfAppendQuery( wfScript( 'api' ), array( 'action' => 'rsd' ) ) ),
+ ) );
+ }
$this->addMetadataLinks( $out );
@@ -231,28 +256,41 @@ class Skin extends Linker {
}
$lb = new LinkBatch( $titles );
+ $lb->setCaller( __METHOD__ );
$lb->execute();
}
/**
- * Adds metadata links (Creative Commons/Dublin Core/copyright) to the HTML
- * output.
+ * Adds metadata links below to the HTML output.
+ * <ol>
+ * <li>Creative Commons
+ * <br />See http://wiki.creativecommons.org/Extend_Metadata.
+ * </li>
+ * <li>Dublin Core</li>
+ * <li>Use hreflang to specify canonical and alternate links
+ * <br />See http://www.google.com/support/webmasters/bin/answer.py?answer=189077
+ * </li>
+ * <li>Copyright</li>
+ * <ol>
+ *
* @param $out Object: instance of OutputPage
*/
function addMetadataLinks( OutputPage $out ) {
global $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf;
+ global $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgContLang;
global $wgRightsPage, $wgRightsUrl;
- if( $out->isArticleRelated() ) {
+ if ( $out->isArticleRelated() ) {
# note: buggy CC software only reads first "meta" link
- if( $wgEnableCreativeCommonsRdf ) {
+ if ( $wgEnableCreativeCommonsRdf ) {
$out->addMetadataLink( array(
'title' => 'Creative Commons',
'type' => 'application/rdf+xml',
'href' => $this->mTitle->getLocalURL( 'action=creativecommons' ) )
);
}
- if( $wgEnableDublinCoreRdf ) {
+
+ if ( $wgEnableDublinCoreRdf ) {
$out->addMetadataLink( array(
'title' => 'Dublin Core',
'type' => 'application/rdf+xml',
@@ -260,17 +298,43 @@ class Skin extends Linker {
);
}
}
+
+ if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks
+ && $wgContLang->hasVariants() ) {
+
+ $urlvar = $wgContLang->getURLVariant();
+
+ if ( !$urlvar ) {
+ $variants = $wgContLang->getVariants();
+ foreach ( $variants as $_v ) {
+ $out->addLink( array(
+ 'rel' => 'alternate',
+ 'hreflang' => $_v,
+ 'href' => $this->mTitle->getLocalURL( '', $_v ) )
+ );
+ }
+ } else {
+ $out->addLink( array(
+ 'rel' => 'canonical',
+ 'href' => $this->mTitle->getFullURL() )
+ );
+ }
+ }
+
$copyright = '';
- if( $wgRightsPage ) {
+ if ( $wgRightsPage ) {
$copy = Title::newFromText( $wgRightsPage );
- if( $copy ) {
+
+ if ( $copy ) {
$copyright = $copy->getLocalURL();
}
}
- if( !$copyright && $wgRightsUrl ) {
+
+ if ( !$copyright && $wgRightsUrl ) {
$copyright = $wgRightsUrl;
}
- if( $copyright ) {
+
+ if ( $copyright ) {
$out->addLink( array(
'rel' => 'copyright',
'href' => $copyright )
@@ -290,7 +354,7 @@ class Skin extends Linker {
/**
* Set the title
- * @param Title $t The title to use
+ * @param $t Title object to use
*/
public function setTitle( $t ) {
$this->mTitle = $t;
@@ -330,7 +394,7 @@ class Skin extends Linker {
$out->out( $afterContent );
- $out->out( $this->bottomScripts() );
+ $out->out( $this->bottomScripts( $out ) );
$out->out( wfReportTime() );
@@ -339,67 +403,30 @@ class Skin extends Linker {
}
static function makeVariablesScript( $data ) {
- if( $data ) {
- $r = array();
- foreach ( $data as $name => $value ) {
- $encValue = Xml::encodeJsVar( $value );
- $r[] = "$name=$encValue";
- }
- $js = 'var ' . implode( ",\n", $r ) . ';';
- return Html::inlineScript( "\n$js\n" );
+ if ( $data ) {
+ return Html::inlineScript(
+ ResourceLoader::makeLoaderConditionalScript( ResourceLoader::makeConfigSetScript( $data ) )
+ );
} else {
return '';
- }
+ }
}
/**
* Make a <script> tag containing global variables
* @param $skinName string Name of the skin
* The odd calling convention is for backwards compatibility
- * @TODO @FIXME Make this not depend on $wgTitle!
+ * @todo FIXME: Make this not depend on $wgTitle!
+ *
+ * Do not add things here which can be evaluated in ResourceLoaderStartupScript - in other words, without state.
+ * You will only be adding bloat to the page and causing page caches to have to be purged on configuration changes.
*/
static function makeGlobalVariablesScript( $skinName ) {
- if ( is_array( $skinName ) ) {
- # Weird back-compat stuff.
- $skinName = $skinName['skinname'];
- }
- global $wgScript, $wgTitle, $wgStylePath, $wgUser, $wgScriptExtension;
- global $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang, $wgLang;
- global $wgOut, $wgArticle;
- global $wgBreakFrames, $wgRequest, $wgVariantArticlePath, $wgActionPaths;
- global $wgUseAjax, $wgAjaxWatch;
- global $wgVersion, $wgEnableAPI, $wgEnableWriteAPI;
- global $wgRestrictionTypes;
- global $wgMWSuggestTemplate, $wgDBname, $wgEnableMWSuggest;
- global $wgSitename;
-
+ global $wgTitle, $wgUser, $wgRequest, $wgArticle, $wgOut, $wgUseAjax, $wgEnableMWSuggest;
+
$ns = $wgTitle->getNamespace();
$nsname = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $wgTitle->getNsText();
- $separatorTransTable = $wgContLang->separatorTransformTable();
- $separatorTransTable = $separatorTransTable ? $separatorTransTable : array();
- $compactSeparatorTransTable = array(
- implode( "\t", array_keys( $separatorTransTable ) ),
- implode( "\t", $separatorTransTable ),
- );
- $digitTransTable = $wgContLang->digitTransformTable();
- $digitTransTable = $digitTransTable ? $digitTransTable : array();
- $compactDigitTransTable = array(
- implode( "\t", array_keys( $digitTransTable ) ),
- implode( "\t", $digitTransTable ),
- );
-
- $mainPage = Title::newFromText( wfMsgForContent( 'mainpage' ) );
$vars = array(
- 'skin' => $skinName,
- 'stylepath' => $wgStylePath,
- 'wgUrlProtocols' => wfUrlProtocols(),
- 'wgArticlePath' => $wgArticlePath,
- 'wgScriptPath' => $wgScriptPath,
- 'wgScriptExtension' => $wgScriptExtension,
- 'wgScript' => $wgScript,
- 'wgVariantArticlePath' => $wgVariantArticlePath,
- 'wgActionPaths' => (object)$wgActionPaths,
- 'wgServer' => $wgServer,
'wgCanonicalNamespace' => $nsname,
'wgCanonicalSpecialPageName' => $ns == NS_SPECIAL ?
SpecialPage::resolveAlias( $wgTitle->getDBkey() ) : false, # bug 21115
@@ -410,55 +437,21 @@ class Skin extends Linker {
'wgArticleId' => $wgTitle->getArticleId(),
'wgIsArticle' => $wgOut->isArticle(),
'wgUserName' => $wgUser->isAnon() ? null : $wgUser->getName(),
- 'wgUserGroups' => $wgUser->isAnon() ? null : $wgUser->getEffectiveGroups(),
- 'wgUserLanguage' => $wgLang->getCode(),
- 'wgContentLanguage' => $wgContLang->getCode(),
- 'wgBreakFrames' => $wgOut->getFrameOptions() == 'DENY',
+ 'wgUserGroups' => $wgUser->getEffectiveGroups(),
'wgCurRevisionId' => isset( $wgArticle ) ? $wgArticle->getLatest() : 0,
- 'wgVersion' => $wgVersion,
- 'wgEnableAPI' => $wgEnableAPI,
- 'wgEnableWriteAPI' => $wgEnableWriteAPI,
- 'wgSeparatorTransformTable' => $compactSeparatorTransTable,
- 'wgDigitTransformTable' => $compactDigitTransTable,
- 'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
- 'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
- 'wgNamespaceIds' => $wgContLang->getNamespaceIds(),
- 'wgSiteName' => $wgSitename,
'wgCategories' => $wgOut->getCategories(),
+ 'wgBreakFrames' => $wgOut->getFrameOptions() == 'DENY',
);
- if ( $wgContLang->hasVariants() ) {
- $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
- }
-
- // if on upload page output the extension list & js_upload
- if( SpecialPage::resolveAlias( $wgTitle->getDBkey() ) == 'Upload' ) {
- global $wgFileExtensions, $wgAjaxUploadInterface;
- $vars['wgFileExtensions'] = $wgFileExtensions;
- }
-
- if( $wgUseAjax && $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ) {
- $vars['wgMWSuggestTemplate'] = SearchEngine::getMWSuggestTemplate();
- $vars['wgDBname'] = $wgDBname;
- $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces( $wgUser );
- $vars['wgMWSuggestMessages'] = array( wfMsg( 'search-mwsuggest-enabled' ), wfMsg( 'search-mwsuggest-disabled' ) );
- }
-
- foreach( $wgRestrictionTypes as $type ) {
+ foreach ( $wgTitle->getRestrictionTypes() as $type ) {
$vars['wgRestriction' . ucfirst( $type )] = $wgTitle->getRestrictions( $type );
}
-
- if ( $wgOut->isArticleRelated() && $wgUseAjax && $wgAjaxWatch && $wgUser->isLoggedIn() ) {
- $msgs = (object)array();
- foreach ( array( 'watch', 'unwatch', 'watching', 'unwatching',
- 'tooltip-ca-watch', 'tooltip-ca-unwatch' ) as $msgName ) {
- $msgs->{$msgName . 'Msg'} = wfMsg( $msgName );
- }
- $vars['wgAjaxWatch'] = $msgs;
+ if ( $wgUseAjax && $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ) {
+ $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces( $wgUser );
}
-
+
// Allow extensions to add their custom variables to the global JS variables
wfRunHooks( 'MakeGlobalVariablesScript', array( &$vars ) );
-
+
return self::makeVariablesScript( $vars );
}
@@ -475,18 +468,19 @@ class Skin extends Linker {
public function userCanPreview( $action ) {
global $wgRequest, $wgUser;
- if( $action != 'submit' ) {
+ if ( $action != 'submit' ) {
return false;
}
- if( !$wgRequest->wasPosted() ) {
+ if ( !$wgRequest->wasPosted() ) {
return false;
}
- if( !$this->mTitle->userCanEditCssSubpage() ) {
+ if ( !$this->mTitle->userCanEditCssSubpage() ) {
return false;
}
- if( !$this->mTitle->userCanEditJsSubpage() ) {
+ if ( !$this->mTitle->userCanEditJsSubpage() ) {
return false;
}
+
return $wgUser->matchEditToken(
$wgRequest->getVal( 'wpEditToken' ) );
}
@@ -506,185 +500,126 @@ class Skin extends Linker {
* @return string
*/
public function generateUserJs( $skinName = null ) {
- global $wgStylePath;
-
- wfProfileIn( __METHOD__ );
- if( !$skinName ) {
- $skinName = $this->getSkinName();
- }
-
- $s = "/* generated javascript */\n";
- $s .= "var skin = '" . Xml::escapeJsString( $skinName ) . "';\n";
- $s .= "var stylepath = '" . Xml::escapeJsString( $wgStylePath ) . "';";
- $s .= "\n\n/* MediaWiki:Common.js */\n";
- $commonJs = wfMsgExt( 'common.js', 'content' );
- if ( !wfEmptyMsg( 'common.js', $commonJs ) ) {
- $s .= $commonJs;
- }
-
- $s .= "\n\n/* MediaWiki:" . ucfirst( $skinName ) . ".js */\n";
- // avoid inclusion of non defined user JavaScript (with custom skins only)
- // by checking for default message content
- $msgKey = ucfirst( $skinName ) . '.js';
- $userJS = wfMsgExt( $msgKey, 'content' );
- if ( !wfEmptyMsg( $msgKey, $userJS ) ) {
- $s .= $userJS;
- }
-
- wfProfileOut( __METHOD__ );
- return $s;
+
+ // Stub - see ResourceLoaderSiteModule, CologneBlue, Simple and Standard skins override this
+
+ return '';
}
/**
* Generate user stylesheet for action=raw&gen=css
*/
public function generateUserStylesheet() {
- wfProfileIn( __METHOD__ );
- $s = "/* generated user stylesheet */\n" .
- $this->reallyGenerateUserStylesheet();
- wfProfileOut( __METHOD__ );
- return $s;
+
+ // Stub - see ResourceLoaderUserModule, CologneBlue, Simple and Standard skins override this
+
+ return '';
}
/**
* Split for easier subclassing in SkinSimple, SkinStandard and SkinCologneBlue
+ * Anything in here won't be generated if $wgAllowUserCssPrefs is false.
*/
protected function reallyGenerateUserStylesheet() {
- global $wgUser;
- $s = '';
- if( ( $undopt = $wgUser->getOption( 'underline' ) ) < 2 ) {
- $underline = $undopt ? 'underline' : 'none';
- $s .= "a { text-decoration: $underline; }\n";
- }
- if( $wgUser->getOption( 'highlightbroken' ) ) {
- $s .= "a.new, #quickbar a.new { color: #CC2200; }\n";
- } else {
- $s .= <<<CSS
-a.new, #quickbar a.new,
-a.stub, #quickbar a.stub {
- color: inherit;
-}
-a.new:after, #quickbar a.new:after {
- content: "?";
- color: #CC2200;
-}
-a.stub:after, #quickbar a.stub:after {
- content: "!";
- color: #772233;
-}
-CSS;
- }
- if( $wgUser->getOption( 'justify' ) ) {
- $s .= "#article, #bodyContent, #mw_content { text-align: justify; }\n";
- }
- if( !$wgUser->getOption( 'showtoc' ) ) {
- $s .= "#toc { display: none; }\n";
- }
- if( !$wgUser->getOption( 'editsection' ) ) {
- $s .= ".editsection { display: none; }\n";
- }
- $fontstyle = $wgUser->getOption( 'editfont' );
- if ( $fontstyle !== 'default' ) {
- $s .= "textarea { font-family: $fontstyle; }\n";
- }
- return $s;
+
+ // Stub - see ResourceLoaderUserModule, CologneBlue, Simple and Standard skins override this
+
+ return '';
}
/**
* @private
*/
function setupUserCss( OutputPage $out ) {
- global $wgRequest, $wgContLang, $wgUser;
- global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage, $wgStylePath;
+ global $wgRequest;
+ global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs;
wfProfileIn( __METHOD__ );
$this->setupSkinUserCss( $out );
-
- $siteargs = array(
- 'action' => 'raw',
- 'maxage' => $wgSquidMaxage,
- );
-
// Add any extension CSS
foreach ( $out->getExtStyle() as $url ) {
$out->addStyle( $url );
}
- // If we use the site's dynamic CSS, throw that in, too
// Per-site custom styles
- if( $wgUseSiteCss ) {
- global $wgHandheldStyle;
- $query = wfArrayToCGI( array(
- 'usemsgcache' => 'yes',
- 'ctype' => 'text/css',
- 'smaxage' => $wgSquidMaxage
- ) + $siteargs );
- # Site settings must override extension css! (bug 15025)
- $out->addStyle( self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) );
- $out->addStyle( self::makeNSUrl( 'Print.css', $query, NS_MEDIAWIKI ), 'print' );
- if( $wgHandheldStyle ) {
- $out->addStyle( self::makeNSUrl( 'Handheld.css', $query, NS_MEDIAWIKI ), 'handheld' );
- }
- $out->addStyle( self::makeNSUrl( $this->getSkinName() . '.css', $query, NS_MEDIAWIKI ) );
+ if ( $wgUseSiteCss ) {
+ $out->addModuleStyles( 'site' );
}
- if( $wgUser->isLoggedIn() ) {
- // Ensure that logged-in users' generated CSS isn't clobbered
- // by anons' publicly cacheable generated CSS.
- $siteargs['smaxage'] = '0';
- $siteargs['ts'] = $wgUser->mTouched;
- }
- // Per-user styles based on preferences
- $siteargs['gen'] = 'css';
- if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) {
- $siteargs['useskin'] = $us;
- }
- $out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) );
-
- // Per-user custom style pages
- if( $wgAllowUserCss && $wgUser->isLoggedIn() ) {
- $action = $wgRequest->getVal( 'action' );
- # If we're previewing the CSS page, use it
- if( $this->mTitle->isCssSubpage() && $this->userCanPreview( $action ) ) {
+ // Per-user custom styles
+ if ( $wgAllowUserCss ) {
+ if ( $this->mTitle->isCssSubpage() && $this->userCanPreview( $wgRequest->getVal( 'action' ) ) ) {
// @FIXME: properly escape the cdata!
$out->addInlineStyle( $wgRequest->getText( 'wpTextbox1' ) );
} else {
- $out->addStyle( self::makeUrl(
- $this->userpage . '/' . $this->getSkinName() . '.css',
- 'action=raw&ctype=text/css' )
- );
+ $out->addModuleStyles( 'user' );
}
}
+ // Per-user preference styles
+ if ( $wgAllowUserCssPrefs ) {
+ $out->addModuleStyles( 'user.options' );
+ }
+
wfProfileOut( __METHOD__ );
}
/**
+ * Get the query to generate a dynamic stylesheet
+ *
+ * @return array
+ */
+ public static function getDynamicStylesheetQuery() {
+ global $wgSquidMaxage;
+
+ return array(
+ 'action' => 'raw',
+ 'maxage' => $wgSquidMaxage,
+ 'usemsgcache' => 'yes',
+ 'ctype' => 'text/css',
+ 'smaxage' => $wgSquidMaxage,
+ );
+ }
+
+ /**
* Add skin specific stylesheets
* @param $out OutputPage
*/
function setupSkinUserCss( OutputPage $out ) {
- $out->addStyle( 'common/shared.css' );
- $out->addStyle( 'common/oldshared.css' );
+ $out->addModuleStyles( 'mediawiki.legacy.shared' );
+ $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
+ // TODO: When converting old skins to use ResourceLoader (or removing them) the following should be reconsidered
$out->addStyle( $this->getStylesheet() );
$out->addStyle( 'common/common_rtl.css', '', '', 'rtl' );
}
function getPageClasses( $title ) {
$numeric = 'ns-' . $title->getNamespace();
- if( $title->getNamespace() == NS_SPECIAL ) {
+
+ if ( $title->getNamespace() == NS_SPECIAL ) {
$type = 'ns-special';
- } elseif( $title->isTalkPage() ) {
+ } elseif ( $title->isTalkPage() ) {
$type = 'ns-talk';
} else {
$type = 'ns-subject';
}
+
$name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() );
+
return "$numeric $type $name";
}
/**
+ * This will be called by OutputPage::headElement when it is creating the
+ * <body> tag, skins can override it if they have a need to add in any
+ * body attributes or classes of their own.
+ */
+ function addToBodyAttributes( $out, &$bodyAttrs ) {
+ // does nothing by default
+ }
+
+ /**
* URL to the logo
*/
function getLogo() {
@@ -708,7 +643,7 @@ CSS;
$qb = $this->qbSetting();
$langlinks = $this->otherLanguages();
- if( $langlinks ) {
+ if ( $langlinks ) {
$rows = 2;
$borderhack = '';
} else {
@@ -722,16 +657,18 @@ CSS;
$shove = ( $qb != 0 );
$left = ( $qb == 1 || $qb == 3 );
- if( $wgContLang->isRTL() ) {
+
+ if ( $wgContLang->isRTL() ) {
$left = !$left;
}
- if( !$shove ) {
+ if ( !$shove ) {
$s .= "<td class='top' align='left' valign='top' rowspan='{$rows}'>\n" .
$this->logoText() . '</td>';
- } elseif( $left ) {
+ } elseif ( $left ) {
$s .= $this->getQuickbarCompensator( $rows );
}
+
$l = $wgContLang->alignStart();
$s .= "<td {$borderhack} align='$l' valign='top'>\n";
@@ -750,16 +687,19 @@ CSS;
if ( $shove && !$left ) { # Right
$s .= $this->getQuickbarCompensator( $rows );
}
+
$s .= "</tr>\n</table>\n</div>\n";
$s .= "\n<div id='article'>\n";
$notice = wfGetSiteNotice();
- if( $notice ) {
+
+ if ( $notice ) {
$s .= "\n<div id='siteNotice'>$notice</div>\n";
}
$s .= $this->pageTitle();
$s .= $this->pageSubtitle();
$s .= $this->getCategories();
+
wfProfileOut( __METHOD__ );
return $s;
}
@@ -768,7 +708,7 @@ CSS;
global $wgOut, $wgUseCategoryBrowser;
global $wgContLang, $wgUser;
- if( count( $wgOut->mCategoryLinks ) == 0 ) {
+ if ( count( $wgOut->mCategoryLinks ) == 0 ) {
return '';
}
@@ -784,6 +724,7 @@ CSS;
$allCats = $wgOut->getCategoryLinks();
$s = '';
$colon = wfMsgExt( 'colon-separator', 'escapenoentities' );
+
if ( !empty( $allCats['normal'] ) ) {
$t = $embed . implode( "{$pop} {$sep} {$embed}" , $allCats['normal'] ) . $pop;
@@ -796,12 +737,13 @@ CSS;
# Hidden categories
if ( isset( $allCats['hidden'] ) ) {
if ( $wgUser->getBoolOption( 'showhiddencats' ) ) {
- $class ='mw-hidden-cats-user-shown';
+ $class = 'mw-hidden-cats-user-shown';
} elseif ( $this->mTitle->getNamespace() == NS_CATEGORY ) {
$class = 'mw-hidden-cats-ns-shown';
} else {
$class = 'mw-hidden-cats-hidden';
}
+
$s .= "<div id=\"mw-hidden-catlinks\" class=\"$class\">" .
wfMsgExt( 'hidden-categories', array( 'parsemag', 'escapenoentities' ), count( $allCats['hidden'] ) ) .
$colon . $embed . implode( "$pop $sep $embed", $allCats['hidden'] ) . $pop .
@@ -810,14 +752,14 @@ CSS;
# optional 'dmoz-like' category browser. Will be shown under the list
# of categories an article belong to
- if( $wgUseCategoryBrowser ) {
+ if ( $wgUseCategoryBrowser ) {
$s .= '<br /><hr />';
# get a big array of the parents tree
$parenttree = $this->mTitle->getParentCategoryTree();
# Skin object passed by reference cause it can not be
# accessed under the method subfunction drawCategoryBrowser
- $tempout = explode( "\n", Skin::drawCategoryBrowser( $parenttree, $this ) );
+ $tempout = explode( "\n", $this->drawCategoryBrowser( $parenttree, $this ) );
# Clean out bogus first entry and sort them
unset( $tempout[0] );
asort( $tempout );
@@ -836,18 +778,21 @@ CSS;
*/
function drawCategoryBrowser( $tree, &$skin ) {
$return = '';
- foreach( $tree as $element => $parent ) {
- if( empty( $parent ) ) {
+
+ foreach ( $tree as $element => $parent ) {
+ if ( empty( $parent ) ) {
# element start a new list
$return .= "\n";
} else {
# grab the others elements
- $return .= Skin::drawCategoryBrowser( $parent, $skin ) . ' &gt; ';
+ $return .= $this->drawCategoryBrowser( $parent, $skin ) . ' &gt; ';
}
+
# add our current element to the list
$eltitle = Title::newFromText( $element );
$return .= $skin->link( $eltitle, $eltitle->getText() );
}
+
return $return;
}
@@ -856,13 +801,14 @@ CSS;
$classes = 'catlinks';
- // Check what we're showing
global $wgOut, $wgUser;
+
+ // Check what we're showing
$allCats = $wgOut->getCategoryLinks();
$showHidden = $wgUser->getBoolOption( 'showhiddencats' ) ||
$this->mTitle->getNamespace() == NS_CATEGORY;
- if( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) {
+ if ( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) {
$classes .= ' catlinks-allhidden';
}
@@ -870,7 +816,7 @@ CSS;
}
function getQuickbarCompensator( $rows = 1 ) {
- return "<td width='152' rowspan='{$rows}'>&nbsp;</td>";
+ return "<td width='152' rowspan='{$rows}'>&#160;</td>";
}
/**
@@ -890,10 +836,10 @@ CSS;
protected function afterContentHook() {
$data = '';
- if( wfRunHooks( 'SkinAfterContent', array( &$data ) ) ) {
+ if ( wfRunHooks( 'SkinAfterContent', array( &$data, $this ) ) ) {
// adding just some spaces shouldn't toggle the output
// of the whole <div/>, so we use trim() here
- if( trim( $data ) != '' ) {
+ if ( trim( $data ) != '' ) {
// Doing this here instead of in the skins to
// ensure that the div has the same ID in all
// skins
@@ -915,11 +861,13 @@ CSS;
*/
protected function generateDebugHTML() {
global $wgShowDebug, $wgOut;
+
if ( $wgShowDebug ) {
$listInternals = $this->formatDebugHTML( $wgOut->mDebugtext );
return "\n<hr />\n<strong>Debug data:</strong><ul style=\"font-family:monospace;\" id=\"mw-debug-html\">" .
$listInternals . "</ul>\n";
}
+
return '';
}
@@ -927,8 +875,8 @@ CSS;
$lines = explode( "\n", $debugText );
$curIdent = 0;
$ret = '<li>';
- foreach( $lines as $line ) {
- $m = array();
+
+ foreach ( $lines as $line ) {
$display = ltrim( $line );
$ident = strlen( $line ) - strlen( $display );
$diff = $ident - $curIdent;
@@ -956,7 +904,9 @@ CSS;
$curIdent = $ident;
}
+
$ret .= str_repeat( '</li></ul>', $curIdent ) . '</li>';
+
return $ret;
}
@@ -971,11 +921,13 @@ CSS;
/**
* This gets called shortly before the </body> tag.
+ * @param $out OutputPage object
* @return String HTML-wrapped JS code to be put before </body>
*/
- function bottomScripts() {
- $bottomScriptText = "\n" . Html::inlineScript( 'if (window.runOnloadHook) runOnloadHook();' ) . "\n";
+ function bottomScripts( $out ) {
+ $bottomScriptText = "\n" . $out->getHeadScripts( $this );
wfRunHooks( 'SkinAfterBottomScripts', array( $this, &$bottomScriptText ) );
+
return $bottomScriptText;
}
@@ -1004,11 +956,14 @@ CSS;
$s[] = $this->printableLink();
$disclaimer = $this->disclaimerLink(); # may be empty
- if( $disclaimer ) {
+
+ if ( $disclaimer ) {
$s[] = $disclaimer;
}
+
$privacy = $this->privacyLink(); # may be empty too
- if( $privacy ) {
+
+ if ( $privacy ) {
$s[] = $privacy;
}
@@ -1016,13 +971,15 @@ CSS;
if ( $this->mTitle->getNamespace() == NS_FILE ) {
$name = $this->mTitle->getDBkey();
$image = wfFindFile( $this->mTitle );
- if( $image ) {
+
+ if ( $image ) {
$link = htmlspecialchars( $image->getURL() );
$style = $this->getInternalLinkAttributes( $link, $name );
$s[] = "<a href=\"{$link}\"{$style}>{$name}</a>";
}
}
}
+
if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) {
$s[] .= $this->link(
$this->mTitle,
@@ -1036,7 +993,7 @@ CSS;
if ( $wgUser->getNewtalk() ) {
# do not show "You have new messages" text when we are viewing our
# own talk page
- if( !$this->mTitle->equals( $wgUser->getTalkPage() ) ) {
+ if ( !$this->mTitle->equals( $wgUser->getTalkPage() ) ) {
$tl = $this->link(
$wgUser->getTalkPage(),
wfMsgHtml( 'newmessageslink' ),
@@ -1052,7 +1009,7 @@ CSS;
array( 'diff' => 'cur' ),
array( 'known', 'noclasses' )
);
- $s[] = '<strong>'. wfMsg( 'youhavenewmessages', $tl, $dl ) . '</strong>';
+ $s[] = '<strong>' . wfMsg( 'youhavenewmessages', $tl, $dl ) . '</strong>';
# disable caching
$wgOut->setSquidMaxage( 0 );
$wgOut->enableClientCache( false );
@@ -1060,26 +1017,30 @@ CSS;
}
$undelete = $this->getUndeleteLink();
- if( !empty( $undelete ) ) {
+
+ if ( !empty( $undelete ) ) {
$s[] = $undelete;
}
+
return $wgLang->pipeList( $s );
}
function getUndeleteLink() {
- global $wgUser, $wgContLang, $wgLang, $wgRequest;
+ global $wgUser, $wgLang, $wgRequest;
$action = $wgRequest->getVal( 'action', 'view' );
if ( $wgUser->isAllowed( 'deletedhistory' ) &&
( $this->mTitle->getArticleId() == 0 || $action == 'history' ) ) {
$n = $this->mTitle->isDeleted();
+
if ( $n ) {
if ( $wgUser->isAllowed( 'undelete' ) ) {
$msg = 'thisisdeleted';
} else {
$msg = 'viewdeleted';
}
+
return wfMsg(
$msg,
$this->link(
@@ -1092,6 +1053,7 @@ CSS;
);
}
}
+
return '';
}
@@ -1105,8 +1067,8 @@ CSS;
$s[] = "<a href=\"$printurl\" rel=\"alternate\">" . wfMsg( 'printableversion' ) . '</a>';
}
- if( $wgOut->isSyndicated() ) {
- foreach( $wgFeedClasses as $format => $class ) {
+ if ( $wgOut->isSyndicated() ) {
+ foreach ( $wgFeedClasses as $format => $class ) {
$feedurl = $wgRequest->escapeAppendQuery( "feed=$format" );
$s[] = "<a href=\"$feedurl\" rel=\"alternate\" type=\"application/{$format}+xml\""
. " class=\"feedlink\">" . wfMsgHtml( "feed-$format" ) . "</a>";
@@ -1129,36 +1091,43 @@ CSS;
global $wgOut;
$sub = $wgOut->getSubtitle();
+
if ( $sub == '' ) {
global $wgExtraSubtitle;
$sub = wfMsgExt( 'tagline', 'parsemag' ) . $wgExtraSubtitle;
}
+
$subpages = $this->subPageSubtitle();
$sub .= !empty( $subpages ) ? "</p><p class='subpages'>$subpages" : '';
$s = "<p class='subtitle'>{$sub}</p>\n";
+
return $s;
}
function subPageSubtitle() {
$subpages = '';
- if( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages ) ) ) {
+
+ if ( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages, $this ) ) ) {
return $subpages;
}
global $wgOut;
- if( $wgOut->isArticle() && MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) {
+
+ if ( $wgOut->isArticle() && MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) {
$ptext = $this->mTitle->getPrefixedText();
- if( preg_match( '/\//', $ptext ) ) {
+ if ( preg_match( '/\//', $ptext ) ) {
$links = explode( '/', $ptext );
array_pop( $links );
$c = 0;
$growinglink = '';
$display = '';
- foreach( $links as $link ) {
+
+ foreach ( $links as $link ) {
$growinglink .= $link;
$display .= $link;
$linkObj = Title::newFromText( $growinglink );
- if( is_object( $linkObj ) && $linkObj->exists() ) {
+
+ if ( is_object( $linkObj ) && $linkObj->exists() ) {
$getlink = $this->link(
$linkObj,
htmlspecialchars( $display ),
@@ -1166,12 +1135,15 @@ CSS;
array(),
array( 'known', 'noclasses' )
);
+
$c++;
- if( $c > 1 ) {
+
+ if ( $c > 1 ) {
$subpages .= wfMsgExt( 'pipe-separator', 'escapenoentities' );
} else {
$subpages .= '&lt; ';
}
+
$subpages .= $getlink;
$display = '';
} else {
@@ -1181,6 +1153,7 @@ CSS;
}
}
}
+
return $subpages;
}
@@ -1198,8 +1171,9 @@ CSS;
$logoutPage = $wgContLang->specialPage( 'Userlogout' );
$ret = '';
+
if ( $wgUser->isAnon() ) {
- if( $this->showIPinHeader() ) {
+ if ( $this->showIPinHeader() ) {
$name = wfGetIP();
$talkLink = $this->link( $wgUser->getTalkPage(),
@@ -1212,6 +1186,7 @@ CSS;
$returnTo = $this->mTitle->getPrefixedDBkey();
$query = array();
+
if ( $logoutPage != $returnTo ) {
$query['returnto'] = $returnTo;
}
@@ -1236,9 +1211,10 @@ CSS;
SpecialPage::getTitleFor( 'Userlogout' ), wfMsg( 'logout' ),
array(), array( 'returnto' => $returnTo )
),
- $this->specialLink( 'preferences' ),
+ $this->specialLink( 'Preferences' ),
) );
}
+
$ret = $wgLang->pipeList( array(
$ret,
$this->link(
@@ -1261,6 +1237,7 @@ CSS;
function searchForm() {
global $wgRequest, $wgUseTwoButtonsSearchForm;
+
$search = $wgRequest->getText( 'search' );
$s = '<form id="searchform' . $this->searchboxes . '" name="search" class="inline" method="post" action="'
@@ -1269,8 +1246,8 @@ CSS;
. htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />\n"
. '<input type="submit" name="go" value="' . wfMsg( 'searcharticle' ) . '" />';
- if( $wgUseTwoButtonsSearchForm ) {
- $s .= '&nbsp;<input type="submit" name="fulltext" value="' . wfMsg( 'searchbutton' ) . "\" />\n";
+ if ( $wgUseTwoButtonsSearchForm ) {
+ $s .= '&#160;<input type="submit" name="fulltext" value="' . wfMsg( 'searchbutton' ) . "\" />\n";
} else {
$s .= ' <a href="' . $this->escapeSearchLink() . '" rel="search">' . wfMsg( 'powersearch-legend' ) . "</a>\n";
}
@@ -1288,25 +1265,26 @@ CSS;
$s = array(
$this->mainPageLink(),
- $this->specialLink( 'recentchanges' )
+ $this->specialLink( 'Recentchanges' )
);
if ( $wgOut->isArticleRelated() ) {
$s[] = $this->editThisPage();
$s[] = $this->historyLink();
}
+
# Many people don't like this dropdown box
- #$s[] = $this->specialPagesList();
+ # $s[] = $this->specialPagesList();
- if( $this->variantLinks() ) {
+ if ( $this->variantLinks() ) {
$s[] = $this->variantLinks();
}
- if( $this->extensionTabLinks() ) {
+ if ( $this->extensionTabLinks() ) {
$s[] = $this->extensionTabLinks();
}
- // FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline
+ // @todo FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline
return implode( $s, wfMsgExt( 'pipe-separator', 'escapenoentities' ) . "\n" );
}
@@ -1321,13 +1299,13 @@ CSS;
$out = '';
$s = array();
wfRunHooks( 'SkinTemplateTabs', array( $this, &$tabs ) );
- foreach( $tabs as $tab ) {
+ foreach ( $tabs as $tab ) {
$s[] = Xml::element( 'a',
array( 'href' => $tab['href'] ),
$tab['text'] );
}
- if( count( $s ) ) {
+ if ( count( $s ) ) {
global $wgLang;
$out = wfMsgExt( 'pipe-separator' , 'escapenoentities' );
@@ -1343,13 +1321,17 @@ CSS;
*/
function variantLinks() {
$s = '';
+
/* show links to different language variants */
global $wgDisableLangConversion, $wgLang, $wgContLang;
+
$variants = $wgContLang->getVariants();
- if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
- foreach( $variants as $code ) {
+
+ if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
+ foreach ( $variants as $code ) {
$varname = $wgContLang->getVariantname( $code );
- if( $varname == 'disable' ) {
+
+ if ( $varname == 'disable' ) {
continue;
}
$s = $wgLang->pipeList( array(
@@ -1358,6 +1340,7 @@ CSS;
) );
}
}
+
return $s;
}
@@ -1368,31 +1351,33 @@ CSS;
$s = '';
if ( $wgOut->isArticleRelated() ) {
$element[] = '<strong>' . $this->editThisPage() . '</strong>';
+
if ( $wgUser->isLoggedIn() ) {
$element[] = $this->watchThisPage();
}
+
$element[] = $this->talkLink();
$element[] = $this->historyLink();
$element[] = $this->whatLinksHere();
$element[] = $this->watchPageLinksLink();
- if( $wgUseTrackbacks ) {
+ if ( $wgUseTrackbacks ) {
$element[] = $this->trackbackLink();
}
if (
$this->mTitle->getNamespace() == NS_USER ||
$this->mTitle->getNamespace() == NS_USER_TALK
- )
- {
+ ) {
$id = User::idFromName( $this->mTitle->getText() );
$ip = User::isIP( $this->mTitle->getText() );
# Both anons and non-anons have contributions list
- if( $id || $ip ) {
+ if ( $id || $ip ) {
$element[] = $this->userContribsLink();
}
- if( $this->showEmailUser( $id ) ) {
+
+ if ( $this->showEmailUser( $id ) ) {
$element[] = $this->emailUserLink();
}
}
@@ -1401,17 +1386,21 @@ CSS;
if ( $this->mTitle->getArticleId() ) {
$s .= "\n<br />";
+
// Delete/protect/move links for privileged users
- if( $wgUser->isAllowed( 'delete' ) ) {
+ if ( $wgUser->isAllowed( 'delete' ) ) {
$s .= $this->deleteThisPage();
}
- if( $wgUser->isAllowed( 'protect' ) ) {
+
+ if ( $wgUser->isAllowed( 'protect' ) ) {
$s .= $sep . $this->protectThisPage();
}
- if( $wgUser->isAllowed( 'move' ) ) {
+
+ if ( $wgUser->isAllowed( 'move' ) ) {
$s .= $sep . $this->moveThisPage();
}
}
+
$s .= "<br />\n" . $this->otherLanguages();
}
@@ -1424,34 +1413,40 @@ CSS;
$oldid = $wgRequest->getVal( 'oldid' );
$diff = $wgRequest->getVal( 'diff' );
+
if ( !$wgOut->isArticle() ) {
return '';
}
- if( !$wgArticle instanceof Article ) {
+
+ if ( !$wgArticle instanceof Article ) {
return '';
}
+
if ( isset( $oldid ) || isset( $diff ) ) {
return '';
}
+
if ( 0 == $wgArticle->getID() ) {
return '';
}
$s = '';
+
if ( !$wgDisableCounters ) {
$count = $wgLang->formatNum( $wgArticle->getCount() );
+
if ( $count ) {
$s = wfMsgExt( 'viewcount', array( 'parseinline' ), $count );
}
}
- if( $wgMaxCredits != 0 ) {
+ if ( $wgMaxCredits != 0 ) {
$s .= ' ' . Credits::getCredits( $wgArticle, $wgMaxCredits, $wgShowCreditsIfMax );
} else {
$s .= $this->lastModified();
}
- if( $wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' ) ) {
+ if ( $wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' ) ) {
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select(
'watchlist',
@@ -1478,6 +1473,7 @@ CSS;
if ( $type == 'detect' ) {
$diff = $wgRequest->getVal( 'diff' );
$isCur = $wgArticle && $wgArticle->isCurrent();
+
if ( is_null( $diff ) && !$isCur && wfMsgForContent( 'history_copyright' ) !== '-' ) {
$type = 'history';
} else {
@@ -1492,43 +1488,58 @@ CSS;
}
$out = '';
- if( $wgRightsPage ) {
+
+ if ( $wgRightsPage ) {
$title = Title::newFromText( $wgRightsPage );
$link = $this->linkKnown( $title, $wgRightsText );
- } elseif( $wgRightsUrl ) {
+ } elseif ( $wgRightsUrl ) {
$link = $this->makeExternalLink( $wgRightsUrl, $wgRightsText );
- } elseif( $wgRightsText ) {
+ } elseif ( $wgRightsText ) {
$link = $wgRightsText;
} else {
# Give up now
return $out;
}
+
// Allow for site and per-namespace customization of copyright notice.
- if( isset( $wgArticle ) ) {
- wfRunHooks( 'SkinCopyrightFooter', array( $wgArticle->getTitle(), $type, &$msg, &$link ) );
+ $forContent = true;
+
+ if ( isset( $wgArticle ) ) {
+ wfRunHooks( 'SkinCopyrightFooter', array( $wgArticle->getTitle(), $type, &$msg, &$link, &$forContent ) );
+ }
+
+ if ( $forContent ) {
+ $out .= wfMsgForContent( $msg, $link );
+ } else {
+ $out .= wfMsg( $msg, $link );
}
- $out .= wfMsgForContent( $msg, $link );
return $out;
}
function getCopyrightIcon() {
global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon;
+
$out = '';
+
if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) {
$out = $wgCopyrightIcon;
} elseif ( $wgRightsIcon ) {
$icon = htmlspecialchars( $wgRightsIcon );
+
if ( $wgRightsUrl ) {
$url = htmlspecialchars( $wgRightsUrl );
- $out .= '<a href="'.$url.'">';
+ $out .= '<a href="' . $url . '">';
}
+
$text = htmlspecialchars( $wgRightsText );
$out .= "<img src=\"$icon\" alt=\"$text\" width=\"88\" height=\"31\" />";
+
if ( $wgRightsUrl ) {
$out .= '</a>';
}
}
+
return $out;
}
@@ -1538,18 +1549,22 @@ CSS;
*/
function getPoweredBy() {
global $wgStylePath;
+
$url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
- $img = '<a href="http://www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
- return $img;
+ $text = '<a href="http://www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+ wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
+ return $text;
}
function lastModified() {
global $wgLang, $wgArticle;
- if( $this->mRevisionId && $this->mRevisionId != $wgArticle->getLatest() ) {
+
+ if ( $this->mRevisionId && $this->mRevisionId != $wgArticle->getLatest() ) {
$timestamp = Revision::getTimestampFromId( $wgArticle->getTitle(), $this->mRevisionId );
} else {
$timestamp = $wgArticle->getTimestamp();
}
+
if ( $timestamp ) {
$d = $wgLang->date( $timestamp, true );
$t = $wgLang->time( $timestamp, true );
@@ -1557,9 +1572,11 @@ CSS;
} else {
$s = '';
}
+
if ( wfGetLB()->getLaggedSlaveMode() ) {
$s .= ' <strong>' . wfMsg( 'laggedslavemode' ) . '</strong>';
}
+
return $s;
}
@@ -1576,6 +1593,7 @@ CSS;
$logourl = $this->getLogo();
$s = "<a href='{$url}'><img{$a} src='{$logourl}' alt='[{$mp}]' /></a>";
+
return $s;
}
@@ -1583,8 +1601,10 @@ CSS;
* Show a drop-down box of special pages
*/
function specialPagesList() {
- global $wgUser, $wgContLang, $wgServer, $wgRedirectScript;
+ global $wgContLang, $wgServer, $wgRedirectScript;
+
$pages = array_merge( SpecialPage::getRegularPages(), SpecialPage::getRestrictedPages() );
+
foreach ( $pages as $name => $page ) {
$pages[$name] = $page->getDescription();
}
@@ -1603,13 +1623,38 @@ CSS;
$p = $wgContLang->specialPage( $name );
$s .= "<option value=\"{$p}\">{$desc}</option>\n";
}
+
$s .= "</select>\n";
$s .= "<input type='submit' value=\"{$go}\" name='redirect' />\n";
$s .= "</form>\n";
+
return $s;
}
/**
+ * Renders a $wgFooterIcons icon acording to the method's arguments
+ * @param $icon Array: The icon to build the html for, see $wgFooterIcons for the format of this array
+ * @param $withImage Boolean: Whether to use the icon's image or output a text-only footericon
+ */
+ function makeFooterIcon( $icon, $withImage = 'withImage' ) {
+ if ( is_string( $icon ) ) {
+ $html = $icon;
+ } else { // Assuming array
+ $url = isset($icon["url"]) ? $icon["url"] : null;
+ unset( $icon["url"] );
+ if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
+ $html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
+ } else {
+ $html = htmlspecialchars( $icon["alt"] );
+ }
+ if ( $url ) {
+ $html = Html::rawElement( 'a', array( "href" => $url ), $html );
+ }
+ }
+ return $html;
+ }
+
+ /**
* Gets the link to the wiki's main page.
* @return string
*/
@@ -1621,12 +1666,13 @@ CSS;
array(),
array( 'known', 'noclasses' )
);
+
return $s;
}
- private function footerLink( $desc, $page ) {
+ public function footerLink( $desc, $page ) {
// if the link description has been set to "-" in the default language,
- if ( wfMsgForContent( $desc ) == '-') {
+ if ( wfMsgForContent( $desc ) == '-' ) {
// then it is disabled, for all languages.
return '';
} else {
@@ -1634,6 +1680,7 @@ CSS;
// language (which may or may not be the same as the default language),
// but we make the link target be the one site-wide page.
$title = Title::newFromText( wfMsgForContent( $page ) );
+
return $this->linkKnown(
$title,
wfMsgExt( $desc, array( 'parsemag', 'escapenoentities' ) )
@@ -1668,9 +1715,9 @@ CSS;
if ( !$wgOut->isArticleRelated() ) {
$s = wfMsg( 'protectedpage' );
} else {
- if( $this->mTitle->quickUserCan( 'edit' ) && $this->mTitle->exists() ) {
+ if ( $this->mTitle->quickUserCan( 'edit' ) && $this->mTitle->exists() ) {
$t = wfMsg( 'editthispage' );
- } elseif( $this->mTitle->quickUserCan( 'create' ) && !$this->mTitle->exists() ) {
+ } elseif ( $this->mTitle->quickUserCan( 'create' ) && !$this->mTitle->exists() ) {
$t = wfMsg( 'create-this-page' );
} else {
$t = wfMsg( 'viewsource' );
@@ -1684,6 +1731,7 @@ CSS;
array( 'known', 'noclasses' )
);
}
+
return $s;
}
@@ -1699,7 +1747,7 @@ CSS;
$options = array( 'action' => 'edit' );
- if( $this->mRevisionId && ! $wgArticle->isCurrent() ) {
+ if ( $this->mRevisionId && ! $wgArticle->isCurrent() ) {
$options['oldid'] = intval( $this->mRevisionId );
}
@@ -1710,6 +1758,7 @@ CSS;
global $wgUser, $wgRequest;
$diff = $wgRequest->getVal( 'diff' );
+
if ( $this->mTitle->getArticleId() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
$t = wfMsg( 'deletethispage' );
@@ -1723,6 +1772,7 @@ CSS;
} else {
$s = '';
}
+
return $s;
}
@@ -1730,7 +1780,8 @@ CSS;
global $wgUser, $wgRequest;
$diff = $wgRequest->getVal( 'diff' );
- if ( $this->mTitle->getArticleId() && ( ! $diff ) && $wgUser->isAllowed('protect') ) {
+
+ if ( $this->mTitle->getArticleId() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) {
if ( $this->mTitle->isProtected() ) {
$text = wfMsg( 'unprotectthispage' );
$query = array( 'action' => 'unprotect' );
@@ -1749,6 +1800,7 @@ CSS;
} else {
$s = '';
}
+
return $s;
}
@@ -1777,6 +1829,7 @@ CSS;
} else {
$s = wfMsg( 'notanarticle' );
}
+
return $s;
}
@@ -1843,6 +1896,7 @@ CSS;
function watchPageLinksLink() {
global $wgOut;
+
if ( !$wgOut->isArticleRelated() ) {
return '(' . wfMsg( 'notanarticle' ) . ')';
} else {
@@ -1869,34 +1923,42 @@ CSS;
}
$a = $wgOut->getLanguageLinks();
+
if ( 0 == count( $a ) ) {
return '';
}
$s = wfMsg( 'otherlanguages' ) . wfMsg( 'colon-separator' );
$first = true;
- if( $wgContLang->isRTL() ) {
+
+ if ( $wgContLang->isRTL() ) {
$s .= '<span dir="LTR">';
}
- foreach( $a as $l ) {
+
+ foreach ( $a as $l ) {
if ( !$first ) {
$s .= wfMsgExt( 'pipe-separator', 'escapenoentities' );
}
+
$first = false;
$nt = Title::newFromText( $l );
$url = $nt->escapeFullURL();
$text = $wgContLang->getLanguageName( $nt->getInterwiki() );
+ $title = htmlspecialchars( $nt->getText() );
if ( $text == '' ) {
$text = $l;
}
+
$style = $this->getExternalLinkAttributes();
- $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
+ $s .= "<a href=\"{$url}\" title=\"{$title}\"{$style}>{$text}</a>";
}
- if( $wgContLang->isRTL() ) {
+
+ if ( $wgContLang->isRTL() ) {
$s .= '</span>';
}
+
return $s;
}
@@ -1908,7 +1970,7 @@ CSS;
$linkOptions = array();
- if( $this->mTitle->isTalkPage() ) {
+ if ( $this->mTitle->isTalkPage() ) {
$link = $this->mTitle->getSubjectPage();
switch( $link->getNamespace() ) {
case NS_MAIN:
@@ -1923,7 +1985,7 @@ CSS;
case NS_FILE:
$text = wfMsg( 'imagepage' );
# Make link known if image exists, even if the desc. page doesn't.
- if( wfFindFile( $link ) )
+ if ( wfFindFile( $link ) )
$linkOptions[] = 'known';
break;
case NS_MEDIAWIKI:
@@ -1961,9 +2023,9 @@ CSS;
# __NEWSECTIONLINK___ changes behaviour here
# If it is present, the link points to this page, otherwise
# it points to the talk page
- if( $this->mTitle->isTalkPage() ) {
+ if ( $this->mTitle->isTalkPage() ) {
$title = $this->mTitle;
- } elseif( $wgOut->showNewSectionLink() ) {
+ } elseif ( $wgOut->showNewSectionLink() ) {
$title = $this->mTitle;
} else {
$title = $this->mTitle->getTalkPage();
@@ -1981,10 +2043,52 @@ CSS;
);
}
+ function getUploadLink() {
+ global $wgUploadNavigationUrl;
+
+ if ( $wgUploadNavigationUrl ) {
+ # Using an empty class attribute to avoid automatic setting of "external" class
+ return $this->makeExternalLink( $wgUploadNavigationUrl, wfMsgHtml( 'upload' ), false, null, array( 'class' => '' ) );
+ } else {
+ return $this->link(
+ SpecialPage::getTitleFor( 'Upload' ),
+ wfMsgHtml( 'upload' ),
+ array(),
+ array(),
+ array( 'known', 'noclasses' )
+ );
+ }
+ }
+
+ /**
+ * Return a fully resolved style path url to images or styles stored in the common folder.
+ * This method returns a url resolved using the configured skin style path
+ * and includes the style version inside of the url.
+ * @param $name String: The name or path of the common file to return the full path for.
+ * @return String The fully resolved style path url including styleversion
+ */
+ function getCommonStylePath( $name ) {
+ global $wgStylePath, $wgStyleVersion;
+ return "{$wgStylePath}/common/$name?{$wgStyleVersion}";
+ }
+
+ /**
+ * Return a fully resolved style path url to images or styles stored in the curent skins's folder.
+ * This method returns a url resolved using the configured skin style path
+ * and includes the style version inside of the url.
+ * @param $name String: The name or path of the skin resource file to return the full path for.
+ * @return String The fully resolved style path url including styleversion
+ */
+ function getSkinStylePath( $name ) {
+ global $wgStylePath, $wgStyleVersion;
+ return "{$wgStylePath}/{$this->stylename}/$name?{$wgStyleVersion}";
+ }
+
/* these are used extensively in SkinTemplate, but also some other places */
static function makeMainPageUrl( $urlaction = '' ) {
$title = Title::newMainPage();
self::checkTitle( $title, '' );
+
return $title->getLocalURL( $urlaction );
}
@@ -2007,6 +2111,7 @@ CSS;
static function makeUrl( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
+
return $title->getLocalURL( $urlaction );
}
@@ -2026,6 +2131,7 @@ CSS;
static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) {
$title = Title::makeTitleSafe( $namespace, $name );
self::checkTitle( $title, $name );
+
return $title->getLocalURL( $urlaction );
}
@@ -2033,9 +2139,10 @@ CSS;
static function makeUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
+
return array(
'href' => $title->getLocalURL( $urlaction ),
- 'exists' => $title->getArticleID() != 0 ? true : false
+ 'exists' => $title->getArticleID() != 0,
);
}
@@ -2045,6 +2152,7 @@ CSS;
static function makeKnownUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
+
return array(
'href' => $title->getLocalURL( $urlaction ),
'exists' => true
@@ -2053,9 +2161,9 @@ CSS;
# make sure we have some title to operate on
static function checkTitle( &$title, $name ) {
- if( !is_object( $title ) ) {
+ if ( !is_object( $title ) ) {
$title = Title::newFromText( $name );
- if( !is_object( $title ) ) {
+ if ( !is_object( $title ) ) {
$title = Title::newFromText( '--error: link target missing--' );
}
}
@@ -2088,6 +2196,7 @@ CSS;
if ( $wgEnableSidebarCache ) {
$parserMemc->set( $key, $bar, $wgSidebarCacheExpiry );
}
+
wfProfileOut( __METHOD__ );
return $bar;
}
@@ -2095,34 +2204,55 @@ CSS;
* Add content from a sidebar system message
* Currently only used for MediaWiki:Sidebar (but may be used by Extensions)
*
+ * This is just a wrapper around addToSidebarPlain() for backwards compatibility
+ *
* @param &$bar array
* @param $message String
*/
function addToSidebar( &$bar, $message ) {
- $lines = explode( "\n", wfMsgForContent( $message ) );
+ $this->addToSidebarPlain( $bar, wfMsgForContent( $message ) );
+ }
+
+ /**
+ * Add content from plain text
+ * @since 1.17
+ * @param &$bar array
+ * @param $text string
+ */
+ function addToSidebarPlain( &$bar, $text ) {
+ $lines = explode( "\n", $text );
+ $wikiBar = array(); # We need to handle the wikitext on a different variable, to avoid trying to do an array operation on text, which would be a fatal error.
+
$heading = '';
- foreach( $lines as $line ) {
- if( strpos( $line, '*' ) !== 0 ) {
+
+ foreach ( $lines as $line ) {
+ if ( strpos( $line, '*' ) !== 0 ) {
continue;
}
- if( strpos( $line, '**') !== 0 ) {
+
+ if ( strpos( $line, '**' ) !== 0 ) {
$heading = trim( $line, '* ' );
- if( !array_key_exists( $heading, $bar ) ) {
+ if ( !array_key_exists( $heading, $bar ) ) {
$bar[$heading] = array();
}
} else {
- if( strpos( $line, '|' ) !== false ) { // sanity check
- $line = array_map( 'trim', explode( '|', trim( $line, '* ' ), 2 ) );
+ $line = trim( $line, '* ' );
+
+ if ( strpos( $line, '|' ) !== false ) { // sanity check
+ $line = array_map( 'trim', explode( '|', $line, 2 ) );
$link = wfMsgForContent( $line[0] );
- if( $link == '-' ) {
+
+ if ( $link == '-' ) {
continue;
}
$text = wfMsgExt( $line[1], 'parsemag' );
- if( wfEmptyMsg( $line[1], $text ) ) {
+
+ if ( wfEmptyMsg( $line[1], $text ) ) {
$text = $line[1];
}
- if( wfEmptyMsg( $line[0], $link ) ) {
+
+ if ( wfEmptyMsg( $line[0], $link ) ) {
$link = $line[0];
}
@@ -2130,6 +2260,7 @@ CSS;
$href = $link;
} else {
$title = Title::newFromText( $link );
+
if ( $title ) {
$title = $title->fixSpecialName();
$href = $title->getLocalURL();
@@ -2144,11 +2275,26 @@ CSS;
'id' => 'n-' . strtr( $line[1], ' ', '-' ),
'active' => false
);
+ } else if ( ( substr( $line, 0, 2 ) == '{{' ) && ( substr( $line, -2 ) == '}}' ) ) {
+ global $wgParser, $wgTitle;
+
+ $line = substr( $line, 2, strlen( $line ) - 4 );
+
+ $options = new ParserOptions();
+ $options->setEditSection( false );
+ $options->setInterfaceMessage( true );
+ $wikiBar[$heading] = $wgParser->parse( wfMsgForContentNoTrans( $line ) , $wgTitle, $options )->getText();
} else {
continue;
}
}
}
+
+ if ( count( $wikiBar ) > 0 ) {
+ $bar = array_merge( $bar, $wikiBar );
+ }
+
+ return $bar;
}
/**
@@ -2162,4 +2308,62 @@ CSS;
public function commonPrintStylesheet() {
return true;
}
+
+ /**
+ * Gets new talk page messages for the current user.
+ * @return MediaWiki message or if no new talk page messages, nothing
+ */
+ function getNewtalks() {
+ global $wgUser, $wgOut;
+
+ $newtalks = $wgUser->getNewMessageLinks();
+ $ntl = '';
+
+ if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
+ $userTitle = $this->mUser->getUserPage();
+ $userTalkTitle = $userTitle->getTalkPage();
+
+ if ( !$userTalkTitle->equals( $this->mTitle ) ) {
+ $newMessagesLink = $this->link(
+ $userTalkTitle,
+ wfMsgHtml( 'newmessageslink' ),
+ array(),
+ array( 'redirect' => 'no' ),
+ array( 'known', 'noclasses' )
+ );
+
+ $newMessagesDiffLink = $this->link(
+ $userTalkTitle,
+ wfMsgHtml( 'newmessagesdifflink' ),
+ array(),
+ array( 'diff' => 'cur' ),
+ array( 'known', 'noclasses' )
+ );
+
+ $ntl = wfMsg(
+ 'youhavenewmessages',
+ $newMessagesLink,
+ $newMessagesDiffLink
+ );
+ # Disable Squid cache
+ $wgOut->setSquidMaxage( 0 );
+ }
+ } elseif ( count( $newtalks ) ) {
+ // _>" " for BC <= 1.16
+ $sep = str_replace( '_', ' ', wfMsgHtml( 'newtalkseparator' ) );
+ $msgs = array();
+
+ foreach ( $newtalks as $newtalk ) {
+ $msgs[] = Xml::element(
+ 'a',
+ array( 'href' => $newtalk['link'] ), $newtalk['wiki']
+ );
+ }
+ $parts = implode( $sep, $msgs );
+ $ntl = wfMsgHtml( 'youhavenewmessagesmulti', $parts );
+ $wgOut->setSquidMaxage( 0 );
+ }
+
+ return $ntl;
+ }
}
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index e5fdb274..cfb67250 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -1,22 +1,28 @@
<?php
+/**
+ * Base class for template-based skins
+ *
+ * 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
+ */
+
if ( ! defined( 'MEDIAWIKI' ) )
die( 1 );
-# 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
-
/**
* Wrapper object for MediaWiki's localization functions,
* to be passed to the template engine.
@@ -101,8 +107,7 @@ class SkinTemplate extends Skin {
* @param $out OutputPage
*/
function setupSkinUserCss( OutputPage $out ){
- $out->addStyle( 'common/shared.css', 'screen' );
- $out->addStyle( 'common/commonPrint.css', 'print' );
+ $out->addModuleStyles( array( 'mediawiki.legacy.shared', 'mediawiki.legacy.commonPrint' ) );
}
/**
@@ -110,7 +115,7 @@ class SkinTemplate extends Skin {
* and eventually it spits out some HTML. Should have interface
* roughly equivalent to PHPTAL 0.7.
*
- * @param $callback string (or file)
+ * @param $classname string (or file)
* @param $repository string: subdirectory where we keep template files
* @param $cache_dir string
* @return object
@@ -127,16 +132,19 @@ class SkinTemplate extends Skin {
*/
function outputPage( OutputPage $out ) {
global $wgArticle, $wgUser, $wgLang, $wgContLang;
- global $wgScript, $wgStylePath, $wgContLanguageCode;
+ global $wgScript, $wgStylePath, $wgLanguageCode;
global $wgMimeType, $wgJsMimeType, $wgOutputEncoding, $wgRequest;
global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
global $wgDisableCounters, $wgLogo, $wgHideInterlanguageLinks;
global $wgMaxCredits, $wgShowCreditsIfMax;
global $wgPageShowWatchingUsers;
global $wgUseTrackbacks, $wgUseSiteJs, $wgDebugComments;
- global $wgArticlePath, $wgScriptPath, $wgServer;
+ global $wgArticlePath, $wgScriptPath, $wgServer, $wgProfiler;
wfProfileIn( __METHOD__ );
+ if ( is_object( $wgProfiler ) ) {
+ $wgProfiler->setTemplated( true );
+ }
$oldid = $wgRequest->getVal( 'oldid' );
$diff = $wgRequest->getVal( 'diff' );
@@ -209,8 +217,8 @@ class SkinTemplate extends Skin {
$tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
$tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
$tpl->set( 'html5version', $wgHtml5Version );
- $tpl->set( 'headlinks', $out->getHeadLinks() );
- $tpl->set( 'csslinks', $out->buildCssLinks() );
+ $tpl->set( 'headlinks', $out->getHeadLinks( $this ) );
+ $tpl->set( 'csslinks', $out->buildCssLinks( $this ) );
if( $wgUseTrackbacks && $out->isArticleRelated() ) {
$tpl->set( 'trackbackhtml', $out->getTitle()->trackbackRDF() );
@@ -294,11 +302,13 @@ class SkinTemplate extends Skin {
$tpl->setRef( 'scriptpath', $wgScriptPath );
$tpl->setRef( 'serverurl', $wgServer );
$tpl->setRef( 'logopath', $wgLogo );
- $tpl->setRef( 'lang', $wgContLanguageCode );
- $tpl->set( 'dir', $wgContLang->getDir() );
- $tpl->set( 'rtl', $wgContLang->isRTL() );
+
+ $lang = wfUILang();
+ $tpl->set( 'lang', $lang->getCode() );
+ $tpl->set( 'dir', $lang->getDir() );
+ $tpl->set( 'rtl', $lang->isRTL() );
+
$tpl->set( 'capitalizeallnouns', $wgLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
- $tpl->set( 'langname', $wgContLang->getLanguageName( $wgContLanguageCode ) );
$tpl->set( 'showjumplinks', $wgUser->getOption( 'showjumplinks' ) );
$tpl->set( 'username', $wgUser->isAnon() ? null : $this->username );
$tpl->setRef( 'userpage', $this->userpage );
@@ -308,8 +318,8 @@ class SkinTemplate extends Skin {
// Users can have their language set differently than the
// content of the wiki. For these users, tell the web browser
// that interface elements are in a different language.
- $tpl->set( 'userlangattributes', '');
- $tpl->set( 'specialpageattributes', '');
+ $tpl->set( 'userlangattributes', '' );
+ $tpl->set( 'specialpageattributes', '' );
$lang = $wgLang->getCode();
$dir = $wgLang->getDir();
@@ -320,59 +330,17 @@ class SkinTemplate extends Skin {
// The content of SpecialPages should be presented in the
// user's language. Content of regular pages should not be touched.
- if($this->mTitle->isSpecialPage()) {
+ if( $this->mTitle->isSpecialPage() ) {
$tpl->set( 'specialpageattributes', $attrs );
}
}
- $newtalks = $wgUser->getNewMessageLinks();
- $ntl = '';
-
- if( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
- $usertitle = $this->mUser->getUserPage();
- $usertalktitle = $usertitle->getTalkPage();
-
- if( !$usertalktitle->equals( $this->mTitle ) ) {
- $newmessageslink = $this->link(
- $usertalktitle,
- wfMsgHtml( 'newmessageslink' ),
- array(),
- array( 'redirect' => 'no' ),
- array( 'known', 'noclasses' )
- );
-
- $newmessagesdifflink = $this->link(
- $usertalktitle,
- wfMsgHtml( 'newmessagesdifflink' ),
- array(),
- array( 'diff' => 'cur' ),
- array( 'known', 'noclasses' )
- );
+ $newtalks = $this->getNewtalks();
- $ntl = wfMsg(
- 'youhavenewmessages',
- $newmessageslink,
- $newmessagesdifflink
- );
- # Disable Cache
- $out->setSquidMaxage( 0 );
- }
- } else if( count( $newtalks ) ) {
- // _>" " for BC <= 1.16
- $sep = str_replace( '_', ' ', wfMsgHtml( 'newtalkseparator' ) );
- $msgs = array();
- foreach( $newtalks as $newtalk ) {
- $msgs[] = Xml::element('a',
- array( 'href' => $newtalk['link'] ), $newtalk['wiki'] );
- }
- $parts = implode( $sep, $msgs );
- $ntl = wfMsgHtml( 'youhavenewmessagesmulti', $parts );
- $out->setSquidMaxage( 0 );
- }
wfProfileOut( __METHOD__ . '-stuff2' );
wfProfileIn( __METHOD__ . '-stuff3' );
- $tpl->setRef( 'newtalk', $ntl );
+ $tpl->setRef( 'newtalk', $newtalks );
$tpl->setRef( 'skin', $this );
$tpl->set( 'logo', $this->logoText() );
if ( $out->isArticle() and ( !isset( $oldid ) or isset( $diff ) ) and
@@ -390,7 +358,6 @@ class SkinTemplate extends Skin {
if( $wgPageShowWatchingUsers ) {
$dbr = wfGetDB( DB_SLAVE );
- $watchlist = $dbr->tableName( 'watchlist' );
$res = $dbr->select( 'watchlist',
array( 'COUNT(*) AS n' ),
array( 'wl_title' => $dbr->strencode( $this->mTitle->getDBkey() ), 'wl_namespace' => $this->mTitle->getNamespace() ),
@@ -444,6 +411,36 @@ class SkinTemplate extends Skin {
$tpl->set( 'privacy', $this->privacyLink() );
$tpl->set( 'about', $this->aboutLink() );
+ $tpl->set( 'footerlinks', array(
+ 'info' => array(
+ 'lastmod',
+ 'viewcount',
+ 'numberofwatchingusers',
+ 'credits',
+ 'copyright',
+ ),
+ 'places' => array(
+ 'privacy',
+ 'about',
+ 'disclaimer',
+ ),
+ ) );
+
+ global $wgFooterIcons;
+ $tpl->set( 'footericons', $wgFooterIcons );
+ foreach ( $tpl->data["footericons"] as $footerIconsKey => &$footerIconsBlock ) {
+ if ( count($footerIconsBlock) > 0 ) {
+ foreach ( $footerIconsBlock as &$footerIcon ) {
+ if ( isset($footerIcon["src"]) ) {
+ if ( !isset($footerIcon["width"]) ) $footerIcon["width"] = 88;
+ if ( !isset($footerIcon["height"]) ) $footerIcon["height"] = 31;
+ }
+ }
+ } else {
+ unset($tpl->data["footericons"][$footerIconsKey]);
+ }
+ }
+
if ( $wgDebugComments ) {
$tpl->setRef( 'debug', $out->mDebugtext );
} else {
@@ -452,9 +449,14 @@ class SkinTemplate extends Skin {
$tpl->set( 'reporttime', wfReportTime() );
$tpl->set( 'sitenotice', wfGetSiteNotice() );
- $tpl->set( 'bottomscripts', $this->bottomScripts() );
+ $tpl->set( 'bottomscripts', $this->bottomScripts( $out ) );
$printfooter = "<div class=\"printfooter\">\n" . $this->printSource() . "</div>\n";
+ global $wgBetterDirectionality;
+ if ( $wgBetterDirectionality ) {
+ $realBodyAttribs = array( 'lang' => $wgLanguageCode, 'dir' => $wgContLang->getDir() );
+ $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
+ }
$out->mBodytext .= $printfooter . $this->generateDebugHTML();
$tpl->setRef( 'bodytext', $out->mBodytext );
@@ -472,6 +474,7 @@ class SkinTemplate extends Skin {
'href' => $nt->getFullURL(),
'text' => ( $wgContLang->getLanguageName( $nt->getInterwiki() ) != '' ?
$wgContLang->getLanguageName( $nt->getInterwiki() ) : $l ),
+ 'title' => $nt->getText(),
'class' => $class
);
}
@@ -525,7 +528,7 @@ class SkinTemplate extends Skin {
* an error object of the appropriate type.
* For the base class, assume strings all around.
*
- * @param mixed $str
+ * @param $str Mixed
* @private
*/
function printOrError( $str ) {
@@ -603,7 +606,9 @@ class SkinTemplate extends Skin {
$personal_urls['logout'] = array(
'text' => wfMsg( 'userlogout' ),
'href' => self::makeSpecialUrl( 'Userlogout',
- $title->isSpecial( 'Preferences' ) ? '' : $returnto
+ // userlogout link must always contain an & character, otherwise we might not be able
+ // to detect a buggy precaching proxy (bug 17790)
+ $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto
),
'active' => false
);
@@ -612,6 +617,21 @@ class SkinTemplate extends Skin {
$loginlink = $wgUser->isAllowed( 'createaccount' )
? 'nav-login-createaccount'
: 'login';
+
+ # anonlogin & login are the same
+ $login_url = array(
+ 'text' => wfMsg( $loginlink ),
+ 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
+ 'active' => $title->isSpecial( 'Userlogin' )
+ );
+ global $wgProto, $wgSecureLogin;
+ if( $wgProto === 'http' && $wgSecureLogin ) {
+ $title = SpecialPage::getTitleFor( 'Userlogin' );
+ $https_url = preg_replace( '/^http:/', 'https:', $title->getFullURL() );
+ $login_url['href'] = $https_url;
+ $login_url['class'] = 'link-https'; # FIXME class depends on skin
+ }
+
if( $this->showIPinHeader() ) {
$href = &$this->userpageUrlDetails['href'];
$personal_urls['anonuserpage'] = array(
@@ -628,17 +648,9 @@ class SkinTemplate extends Skin {
'class' => $usertalkUrlDetails['exists'] ? false : 'new',
'active' => ( $pageurl == $href )
);
- $personal_urls['anonlogin'] = array(
- 'text' => wfMsg( $loginlink ),
- 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
- 'active' => $title->isSpecial( 'Userlogin' )
- );
+ $personal_urls['anonlogin'] = $login_url;
} else {
- $personal_urls['login'] = array(
- 'text' => wfMsg( $loginlink ),
- 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
- 'active' => $title->isSpecial( 'Userlogin' )
- );
+ $personal_urls['login'] = $login_url;
}
}
@@ -685,7 +697,7 @@ class SkinTemplate extends Skin {
self::checkTitle( $title, $name );
return array(
'href' => $title->getLocalURL( $urlaction ),
- 'exists' => $title->getArticleID() != 0 ? true : false
+ 'exists' => $title->getArticleID() != 0,
);
}
@@ -695,7 +707,7 @@ class SkinTemplate extends Skin {
self::checkTitle( $title, $name );
return array(
'href' => $title->getLocalURL( $urlaction ),
- 'exists' => $title->getArticleID() != 0 ? true : false
+ 'exists' => $title->getArticleID() != 0,
);
}
@@ -712,6 +724,7 @@ class SkinTemplate extends Skin {
$action = $wgRequest->getVal( 'action', 'view' );
$section = $wgRequest->getVal( 'section' );
$content_actions = array();
+ $userCanRead = $this->mTitle->userCanRead();
$prevent_active_tabs = false;
wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$prevent_active_tabs ) );
@@ -725,7 +738,7 @@ class SkinTemplate extends Skin {
$subjpage,
$nskey,
!$this->mTitle->isTalkPage() && !$prevent_active_tabs,
- '', true
+ '', $userCanRead
);
$content_actions['talk'] = $this->tabAction(
@@ -733,16 +746,16 @@ class SkinTemplate extends Skin {
'talk',
$this->mTitle->isTalkPage() && !$prevent_active_tabs,
'',
- true
+ $userCanRead
);
wfProfileIn( __METHOD__ . '-edit' );
- if ( $this->mTitle->quickUserCan( 'edit' ) && ( $this->mTitle->exists() || $this->mTitle->quickUserCan( 'create' ) ) ) {
+ if ( $userCanRead && $this->mTitle->quickUserCan( 'edit' ) && ( $this->mTitle->exists() || $this->mTitle->quickUserCan( 'create' ) ) ) {
$istalk = $this->mTitle->isTalkPage();
$istalkclass = $istalk?' istalk':'';
$content_actions['edit'] = array(
'class' => ( ( ( $action == 'edit' or $action == 'submit' ) and $section != 'new' ) ? 'selected' : '' ) . $istalkclass,
- 'text' => $this->mTitle->exists()
+ 'text' => ( $this->mTitle->exists() || ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !wfEmptyMsg( $this->mTitle->getText() ) ) )
? wfMsg( 'edit' )
: wfMsg( 'create' ),
'href' => $this->mTitle->getLocalUrl( $this->editUrlOptions() )
@@ -758,7 +771,7 @@ class SkinTemplate extends Skin {
);
}
}
- } elseif ( $this->mTitle->isKnown() ) {
+ } elseif ( $this->mTitle->hasSourceText() && $userCanRead ) {
$content_actions['viewsource'] = array(
'class' => ($action == 'edit') ? 'selected' : false,
'text' => wfMsg( 'viewsource' ),
@@ -768,7 +781,7 @@ class SkinTemplate extends Skin {
wfProfileOut( __METHOD__ . '-edit' );
wfProfileIn( __METHOD__ . '-live' );
- if ( $this->mTitle->exists() ) {
+ if ( $this->mTitle->exists() && $userCanRead ) {
$content_actions['history'] = array(
'class' => ($action == 'history') ? 'selected' : false,
@@ -812,7 +825,8 @@ class SkinTemplate extends Skin {
} else {
//article doesn't exist or is deleted
if( $wgUser->isAllowed( 'deletedhistory' ) && $wgUser->isAllowed( 'deletedtext' ) ) {
- if( $n = $this->mTitle->isDeleted() ) {
+ $n = $this->mTitle->isDeleted();
+ if( $n ) {
$undelTitle = SpecialPage::getTitleFor( 'Undelete' );
$content_actions['undelete'] = array(
'class' => false,
@@ -906,7 +920,7 @@ class SkinTemplate extends Skin {
*/
function buildNavUrls() {
global $wgUseTrackbacks, $wgOut, $wgUser, $wgRequest;
- global $wgEnableUploads, $wgUploadNavigationUrl;
+ global $wgUploadNavigationUrl;
wfProfileIn( __METHOD__ );
@@ -916,7 +930,7 @@ class SkinTemplate extends Skin {
$nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
if( $wgUploadNavigationUrl ) {
$nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
- } elseif( $wgEnableUploads && $wgUser->isAllowed( 'upload' ) ) {
+ } elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
$nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) );
} else {
$nav_urls['upload'] = false;
@@ -969,8 +983,9 @@ class SkinTemplate extends Skin {
}
if( $this->mTitle->getNamespace() == NS_USER || $this->mTitle->getNamespace() == NS_USER_TALK ) {
- $id = User::idFromName( $this->mTitle->getText() );
- $ip = User::isIP( $this->mTitle->getText() );
+ $rootUser = strtok( $this->mTitle->getText(), '/' );
+ $id = User::idFromName( $rootUser );
+ $ip = User::isIP( $rootUser );
} else {
$id = 0;
$ip = false;
@@ -978,7 +993,7 @@ class SkinTemplate extends Skin {
if( $id || $ip ) { # both anons and non-anons have contribs list
$nav_urls['contributions'] = array(
- 'href' => self::makeSpecialUrlSubpage( 'Contributions', $this->mTitle->getText() )
+ 'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser )
);
if( $id ) {
@@ -986,7 +1001,7 @@ class SkinTemplate extends Skin {
$nav_urls['log'] = array(
'href' => $logPage->getLocalUrl(
array(
- 'user' => $this->mTitle->getText()
+ 'user' => $rootUser
)
)
);
@@ -996,7 +1011,7 @@ class SkinTemplate extends Skin {
if ( $wgUser->isAllowed( 'block' ) ) {
$nav_urls['blockip'] = array(
- 'href' => self::makeSpecialUrlSubpage( 'Blockip', $this->mTitle->getText() )
+ 'href' => self::makeSpecialUrlSubpage( 'Blockip', $rootUser )
);
} else {
$nav_urls['blockip'] = false;
@@ -1009,7 +1024,7 @@ class SkinTemplate extends Skin {
$nav_urls['emailuser'] = false;
if( $this->showEmailUser( $id ) ) {
$nav_urls['emailuser'] = array(
- 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $this->mTitle->getText() )
+ 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser )
);
}
wfProfileOut( __METHOD__ );
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 80e2f7ed..12ad517a 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -70,6 +70,10 @@ class SpecialPage {
*/
var $mAllowedRedirectParams = array();
/**
+ * Query parameteres added by redirects
+ */
+ var $mAddedRedirectParams = array();
+ /**
* List of special pages, followed by parameters.
* If the only parameter is a string, that is the page name.
* Otherwise, it is an array. The format is one of:
@@ -88,8 +92,8 @@ class SpecialPage {
'Lonelypages' => array( 'SpecialPage', 'Lonelypages' ),
'Fewestrevisions' => array( 'SpecialPage', 'Fewestrevisions' ),
'Withoutinterwiki' => array( 'SpecialPage', 'Withoutinterwiki' ),
- 'Protectedpages' => array( 'SpecialPage', 'Protectedpages' ),
- 'Protectedtitles' => array( 'SpecialPage', 'Protectedtitles' ),
+ 'Protectedpages' => 'SpecialProtectedpages',
+ 'Protectedtitles' => 'SpecialProtectedtitles',
'Shortpages' => array( 'SpecialPage', 'Shortpages' ),
'Uncategorizedcategories' => array( 'SpecialPage', 'Uncategorizedcategories' ),
'Uncategorizedimages' => array( 'SpecialPage', 'Uncategorizedimages' ),
@@ -107,7 +111,7 @@ class SpecialPage {
# List of pages
'Allpages' => 'SpecialAllpages',
'Prefixindex' => 'SpecialPrefixindex',
- 'Categories' => array( 'SpecialPage', 'Categories' ),
+ 'Categories' => 'SpecialCategories',
'Disambiguations' => array( 'SpecialPage', 'Disambiguations' ),
'Listredirects' => array( 'SpecialPage', 'Listredirects' ),
@@ -116,20 +120,23 @@ class SpecialPage {
'CreateAccount' => array( 'SpecialRedirectToSpecial', 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) ),
# Users and rights
- 'Blockip' => array( 'SpecialPage', 'Blockip', 'block' ),
- 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ),
+ 'Blockip' => 'IPBlockForm',
+ 'Ipblocklist' => 'IPUnblockForm',
+ 'Unblock' => array( 'SpecialRedirectToSpecial', 'Unblock', 'Ipblocklist', false, array( 'uselang', 'ip', 'id' ), array( 'action' => 'unblock' ) ),
'Resetpass' => 'SpecialResetpass',
'DeletedContributions' => 'DeletedContributionsPage',
'Preferences' => 'SpecialPreferences',
'Contributions' => 'SpecialContributions',
'Listgrouprights' => 'SpecialListGroupRights',
'Listusers' => array( 'SpecialPage', 'Listusers' ),
+ 'Listadmins' => array( 'SpecialRedirectToSpecial', 'Listadmins', 'Listusers', 'sysop' ),
+ 'Listbots' => array( 'SpecialRedirectToSpecial', 'Listbots', 'Listusers', 'bot' ),
'Activeusers' => 'SpecialActiveUsers',
'Userrights' => 'UserrightsPage',
# Recent changes and logs
'Newimages' => array( 'IncludableSpecialPage', 'Newimages' ),
- 'Log' => array( 'SpecialPage', 'Log' ),
+ 'Log' => 'SpecialLog',
'Watchlist' => array( 'SpecialPage', 'Watchlist' ),
'Newpages' => 'SpecialNewpages',
'Recentchanges' => 'SpecialRecentchanges',
@@ -138,17 +145,18 @@ class SpecialPage {
# Media reports and uploads
'Listfiles' => array( 'SpecialPage', 'Listfiles' ),
- 'Filepath' => array( 'SpecialPage', 'Filepath' ),
+ 'Filepath' => 'SpecialFilepath',
'MIMEsearch' => array( 'SpecialPage', 'MIMEsearch' ),
'FileDuplicateSearch' => array( 'SpecialPage', 'FileDuplicateSearch' ),
'Upload' => 'SpecialUpload',
+ 'UploadStash' => 'SpecialUploadStash',
# Wiki data and tools
'Statistics' => 'SpecialStatistics',
'Allmessages' => 'SpecialAllmessages',
'Version' => 'SpecialVersion',
- 'Lockdb' => array( 'SpecialPage', 'Lockdb', 'siteadmin' ),
- 'Unlockdb' => array( 'SpecialPage', 'Unlockdb', 'siteadmin' ),
+ 'Lockdb' => 'SpecialLockdb',
+ 'Unlockdb' => 'SpecialUnlockdb',
# Redirecting special pages
'LinkSearch' => array( 'SpecialPage', 'LinkSearch' ),
@@ -164,28 +172,28 @@ class SpecialPage {
'Mostrevisions' => array( 'SpecialPage', 'Mostrevisions' ),
# Page tools
+ 'ComparePages' => 'SpecialComparePages',
'Export' => 'SpecialExport',
'Import' => 'SpecialImport',
- 'Undelete' => array( 'SpecialPage', 'Undelete', 'deletedhistory' ),
+ 'Undelete' => 'UndeleteForm',
'Whatlinkshere' => 'SpecialWhatlinkshere',
- 'MergeHistory' => array( 'SpecialPage', 'MergeHistory', 'mergehistory' ),
+ 'MergeHistory' => 'SpecialMergeHistory',
# Other
'Booksources' => 'SpecialBookSources',
# Unlisted / redirects
'Blankpage' => 'SpecialBlankpage',
- 'Blockme' => array( 'UnlistedSpecialPage', 'Blockme' ),
- 'Emailuser' => array( 'UnlistedSpecialPage', 'Emailuser' ),
- 'Listadmins' => array( 'SpecialRedirectToSpecial', 'Listadmins', 'Listusers', 'sysop' ),
- 'Listbots' => array( 'SpecialRedirectToSpecial', 'Listbots', 'Listusers', 'bot' ),
- 'Movepage' => array( 'UnlistedSpecialPage', 'Movepage' ),
- 'Mycontributions' => array( 'SpecialMycontributions' ),
- 'Mypage' => array( 'SpecialMypage' ),
- 'Mytalk' => array( 'SpecialMytalk' ),
+ 'Blockme' => 'SpecialBlockme',
+ 'Emailuser' => 'SpecialEmailUser',
+ 'Movepage' => 'MovePageForm',
+ 'Mycontributions' => 'SpecialMycontributions',
+ 'Mypage' => 'SpecialMypage',
+ 'Mytalk' => 'SpecialMytalk',
+ 'Myuploads' => 'SpecialMyuploads',
'Revisiondelete' => 'SpecialRevisionDelete',
- 'Specialpages' => array( 'UnlistedSpecialPage', 'Specialpages' ),
- 'Userlogout' => array( 'UnlistedSpecialPage', 'Userlogout' ),
+ 'Specialpages' => 'SpecialSpecialpages',
+ 'Userlogout' => 'SpecialUserlogout',
);
static public $mAliases;
@@ -254,6 +262,9 @@ class SpecialPage {
/**
* Given a special page alias, return the special page name.
* Returns false if there is no such alias.
+ *
+ * @param $alias String
+ * @return String or false
*/
static function resolveAlias( $alias ) {
global $wgContLang;
@@ -261,6 +272,7 @@ class SpecialPage {
if ( !self::$mListInitialised ) self::initList();
if ( is_null( self::$mAliases ) ) self::initAliasList();
$caseFoldedAlias = $wgContLang->caseFold( $alias );
+ $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
if ( isset( self::$mAliases[$caseFoldedAlias] ) ) {
return self::$mAliases[$caseFoldedAlias];
} else {
@@ -272,6 +284,9 @@ class SpecialPage {
* Given a special page name with a possible subpage, return an array
* where the first element is the special page name and the second is the
* subpage.
+ *
+ * @param $alias String
+ * @return Array
*/
static function resolveAliasWithSubpage( $alias ) {
$bits = explode( '/', $alias, 2 );
@@ -289,10 +304,11 @@ class SpecialPage {
* method for adding special pages in extensions. It's now suggested that you add
* an associative record to $wgSpecialPages. This avoids autoloading SpecialPage.
*
- * @param SpecialPage $page
- * @static
+ * @param $page SpecialPage
+ * Deprecated in 1.7, warnings in 1.17, might be removed in 1.20
*/
static function addPage( &$page ) {
+ wfDeprecated( __METHOD__ );
if ( !self::$mListInitialised ) {
self::initList();
}
@@ -302,9 +318,8 @@ class SpecialPage {
/**
* Add a page to a certain display group for Special:SpecialPages
*
- * @param mixed $page (SpecialPage or string)
- * @param string $group
- * @static
+ * @param $page Mixed: SpecialPage or string
+ * @param $group String
*/
static function setGroup( $page, $group ) {
global $wgSpecialPageGroups;
@@ -315,8 +330,7 @@ class SpecialPage {
/**
* Add a page to a certain display group for Special:SpecialPages
*
- * @param SpecialPage $page
- * @static
+ * @param $page SpecialPage
*/
static function getGroup( &$page ) {
global $wgSpecialPageGroups;
@@ -340,8 +354,6 @@ class SpecialPage {
* Remove a special page from the list
* Formerly used to disable expensive or dangerous special pages. The
* preferred method is now to add a SpecialPage_initList hook.
- *
- * @static
*/
static function removePage( $name ) {
if ( !self::$mListInitialised ) {
@@ -352,8 +364,9 @@ class SpecialPage {
/**
* Check if a given name exist as a special page or as a special page alias
- * @param $name string: name of a special page
- * @return boolean: true if a special page exists with this name
+ *
+ * @param $name String: name of a special page
+ * @return Boolean: true if a special page exists with this name
*/
static function exists( $name ) {
global $wgContLang;
@@ -376,8 +389,9 @@ class SpecialPage {
/**
* Find the object with a given name and return it (or NULL)
- * @static
- * @param string $name
+ *
+ * @param $name String
+ * @return SpecialPage object or null if the page doesn't exist
*/
static function getPage( $name ) {
if ( !self::$mListInitialised ) {
@@ -401,6 +415,8 @@ class SpecialPage {
/**
* Get a special page with a given localised name, or NULL if there
* is no such special page.
+ *
+ * @return SpecialPage object or null if the page doesn't exist
*/
static function getPageByAlias( $alias ) {
$realName = self::resolveAlias( $alias );
@@ -414,7 +430,8 @@ class SpecialPage {
/**
* Return categorised listable special pages which are available
* for the current user, and everyone.
- * @static
+ *
+ * @return Associative array mapping page's name to its SpecialPage object
*/
static function getUsablePages() {
global $wgUser;
@@ -439,7 +456,8 @@ class SpecialPage {
/**
* Return categorised listable special pages for all users
- * @static
+ *
+ * @return Associative array mapping page's name to its SpecialPage object
*/
static function getRegularPages() {
if ( !self::$mListInitialised ) {
@@ -459,7 +477,8 @@ class SpecialPage {
/**
* Return categorised listable special pages which are available
* for the current user, but not for everyone
- * @static
+ *
+ * @return Associative array mapping page's name to its SpecialPage object
*/
static function getRestrictedPages() {
global $wgUser;
@@ -554,7 +573,7 @@ class SpecialPage {
$page->including( $including );
// Execute special page
- $profName = 'Special:' . $page->getName();
+ $profName = 'Special:' . $page->name();
wfProfileIn( $profName );
$page->execute( $par );
wfProfileOut( $profName );
@@ -566,7 +585,8 @@ class SpecialPage {
* Just like executePath() except it returns the HTML instead of outputting it
* Returns false if there was no such special page, or a title object if it was
* a redirect.
- * @static
+ *
+ * @return String: HTML fragment
*/
static function capturePath( &$title ) {
global $wgOut, $wgTitle;
@@ -588,10 +608,10 @@ class SpecialPage {
/**
* Get the local name for a specified canonical name
*
- * @param $name
- * @param mixed $subpage Boolean false, or string
+ * @param $name String
+ * @param $subpage Mixed: boolean false, or string
*
- * @return string
+ * @return String
*/
static function getLocalNameFor( $name, $subpage = false ) {
global $wgContLang;
@@ -603,15 +623,17 @@ class SpecialPage {
$found = false;
foreach ( $aliases as $n => $values ) {
if ( strcasecmp( $name, $n ) === 0 ) {
- wfWarn( "Found alias defined for $n when searching for special page aliases
-for $name. Case mismatch?" );
+ wfWarn( "Found alias defined for $n when searching for" .
+ "special page aliases for $name. Case mismatch?" );
$name = $values[0];
$found = true;
break;
}
}
- if ( !$found ) wfWarn( "Did not find alias for special page '$name'.
-Perhaps no page aliases are defined for it?" );
+ if ( !$found ) {
+ wfWarn( "Did not find alias for special page '$name'. " .
+ "Perhaps no aliases are defined for it?" );
+ }
}
if ( $subpage !== false && !is_null( $subpage ) ) {
$name = "$name/$subpage";
@@ -621,6 +643,8 @@ Perhaps no page aliases are defined for it?" );
/**
* Get a localised Title object for a specified special page name
+ *
+ * @return Title object
*/
static function getTitleFor( $name, $subpage = false ) {
$name = self::getLocalNameFor( $name, $subpage );
@@ -633,6 +657,8 @@ Perhaps no page aliases are defined for it?" );
/**
* Get a localised Title object for a page name with a possibly unvalidated subpage
+ *
+ * @return Title object or null if the page doesn't exist
*/
static function getSafeTitleFor( $name, $subpage = false ) {
$name = self::getLocalNameFor( $name, $subpage );
@@ -645,6 +671,7 @@ Perhaps no page aliases are defined for it?" );
/**
* Get a title for a given alias
+ *
* @return Title or null if there is no such alias
*/
static function getTitleForAlias( $alias ) {
@@ -666,18 +693,28 @@ Perhaps no page aliases are defined for it?" );
* If you override execute(), you can recover the default behaviour with userCanExecute()
* and displayRestrictionError()
*
- * @param string $name Name of the special page, as seen in links and URLs
- * @param string $restriction User right required, e.g. "block" or "delete"
- * @param boolean $listed Whether the page is listed in Special:Specialpages
- * @param string $function Function called by execute(). By default it is constructed from $name
- * @param string $file File which is included by execute(). It is also constructed from $name by default
+ * @param $name String: name of the special page, as seen in links and URLs
+ * @param $restriction String: user right required, e.g. "block" or "delete"
+ * @param $listed Boolean: whether the page is listed in Special:Specialpages
+ * @param $function Callback: function called by execute(). By default it is constructed from $name
+ * @param $file String: file which is included by execute(). It is also constructed from $name by default
+ * @param $includable Boolean: whether the page can be included in normal pages
*/
- function SpecialPage( $name = '', $restriction = '', $listed = true, $function = false, $file = 'default', $includable = false ) {
+ public function __construct( $name = '', $restriction = '', $listed = true, $function = false, $file = 'default', $includable = false ) {
+ $this->init( $name, $restriction, $listed, $function, $file, $includable );
+ }
+
+ /**
+ * Do the real work for the constructor, mainly so __call() can intercept
+ * calls to SpecialPage()
+ * @see __construct() for param docs
+ */
+ private function init( $name, $restriction, $listed, $function, $file, $includable ) {
$this->mName = $name;
$this->mRestriction = $restriction;
$this->mListed = $listed;
$this->mIncludable = $includable;
- if ( $function == false ) {
+ if ( !$function ) {
$this->mFunction = 'wfSpecial'.$name;
} else {
$this->mFunction = $function;
@@ -689,6 +726,29 @@ Perhaps no page aliases are defined for it?" );
}
}
+ /**
+ * Use PHP's magic __call handler to get calls to the old PHP4 constructor
+ * because PHP E_STRICT yells at you for having __construct() and SpecialPage()
+ *
+ * @param $name String Name of called method
+ * @param $a Array Arguments to the method
+ * @deprecated Call isn't deprecated, but SpecialPage::SpecialPage() is
+ */
+ public function __call( $fName, $a ) {
+ // Sometimes $fName is SpecialPage, sometimes it's specialpage. <3 PHP
+ if( strtolower( $fName ) == 'specialpage' ) {
+ // Debug messages now, warnings in 1.19 or 1.20?
+ wfDebug( "Deprecated SpecialPage::SpecialPage() called, use __construct();\n" );
+ $name = isset( $a[0] ) ? $a[0] : '';
+ $restriction = isset( $a[1] ) ? $a[1] : '';
+ $listed = isset( $a[2] ) ? $a[2] : true;
+ $function = isset( $a[3] ) ? $a[3] : false;
+ $file = isset( $a[4] ) ? $a[4] : 'default';
+ $includable = isset( $a[5] ) ? $a[5] : false;
+ $this->init( $name, $restriction, $listed, $function, $file, $includable );
+ }
+ }
+
/**#@+
* Accessor
*
@@ -731,7 +791,7 @@ Perhaps no page aliases are defined for it?" );
* Can be overridden by subclasses with more complicated permissions
* schemes.
*
- * @return bool Should the page be displayed with the restricted-access
+ * @return Boolean: should the page be displayed with the restricted-access
* pages?
*/
public function isRestricted() {
@@ -745,8 +805,8 @@ Perhaps no page aliases are defined for it?" );
* special page (as defined by $mRestriction). Can be overridden by sub-
* classes with more complicated permissions schemes.
*
- * @param User $user The user to check
- * @return bool Does the user have permission to view the page?
+ * @param $user User: the user to check
+ * @return Boolean: does the user have permission to view the page?
*/
public function userCanExecute( $user ) {
return $user->isAllowed( $this->mRestriction );
@@ -774,7 +834,7 @@ Perhaps no page aliases are defined for it?" );
* Default execute method
* Checks user permissions, calls the function given in mFunction
*
- * This may be overridden by subclasses.
+ * This must be overridden by subclasses; it will be made abstract in a future version
*/
function execute( $par ) {
global $wgUser;
@@ -800,7 +860,7 @@ Perhaps no page aliases are defined for it?" );
* May be overriden, i.e. by extensions to stick with the naming conventions
* for message keys: 'extensionname-xxx'
*
- * @param string message key of the summary
+ * @param $summaryMessageKey String: message key of the summary
*/
function outputHeader( $summaryMessageKey = '' ) {
global $wgOut, $wgContLang;
@@ -812,22 +872,29 @@ Perhaps no page aliases are defined for it?" );
}
$out = wfMsgNoTrans( $msg );
if ( ! wfEmptyMsg( $msg, $out ) and $out !== '' and ! $this->including() ) {
- $wgOut->wrapWikiMsg( "<div class='mw-specialpage-summary'>\n$1</div>", $msg );
+ $wgOut->wrapWikiMsg( "<div class='mw-specialpage-summary'>\n$1\n</div>", $msg );
}
}
- # Returns the name that goes in the <h1> in the special page itself, and also the name that
- # will be listed in Special:Specialpages
- #
- # Derived classes can override this, but usually it is easier to keep the default behaviour.
- # Messages can be added at run-time, see MessageCache.php
+ /**
+ * Returns the name that goes in the \<h1\> in the special page itself, and
+ * also the name that will be listed in Special:Specialpages
+ *
+ * Derived classes can override this, but usually it is easier to keep the
+ * default behaviour. Messages can be added at run-time, see
+ * MessageCache.php.
+ *
+ * @return String
+ */
function getDescription() {
return wfMsg( strtolower( $this->mName ) );
}
/**
* Get a self-referential title object
+ *
+ * @return Title object
*/
function getTitle( $subpage = false ) {
return self::getTitleFor( $this->mName, $subpage );
@@ -852,7 +919,7 @@ Perhaps no page aliases are defined for it?" );
* Return part of the request string for a special redirect page
* This allows passing, e.g. action=history to Special:Mypage, etc.
*
- * @return string
+ * @return String
*/
function getRedirectQuery() {
global $wgRequest;
@@ -861,7 +928,11 @@ Perhaps no page aliases are defined for it?" );
if( ( $val = $wgRequest->getVal( $arg, null ) ) !== null )
$params[] = $arg . '=' . $val;
}
-
+
+ foreach( $this->mAddedRedirectParams as $arg => $val ) {
+ $params[] = $arg . '=' . $val;
+ }
+
return count( $params ) ? implode( '&', $params ) : false;
}
}
@@ -872,8 +943,8 @@ Perhaps no page aliases are defined for it?" );
*/
class UnlistedSpecialPage extends SpecialPage
{
- function UnlistedSpecialPage( $name, $restriction = '', $function = false, $file = 'default' ) {
- SpecialPage::SpecialPage( $name, $restriction, false, $function, $file );
+ function __construct( $name, $restriction = '', $function = false, $file = 'default' ) {
+ parent::__construct( $name, $restriction, false, $function, $file );
}
}
@@ -883,8 +954,8 @@ class UnlistedSpecialPage extends SpecialPage
*/
class IncludableSpecialPage extends SpecialPage
{
- function IncludableSpecialPage( $name, $restriction = '', $listed = true, $function = false, $file = 'default' ) {
- SpecialPage::SpecialPage( $name, $restriction, $listed, $function, $file, true );
+ function __construct( $name, $restriction = '', $listed = true, $function = false, $file = 'default' ) {
+ parent::__construct( $name, $restriction, $listed, $function, $file, true );
}
}
@@ -895,11 +966,12 @@ class IncludableSpecialPage extends SpecialPage
class SpecialRedirectToSpecial extends UnlistedSpecialPage {
var $redirName, $redirSubpage;
- function __construct( $name, $redirName, $redirSubpage = false, $redirectParams = array() ) {
+ function __construct( $name, $redirName, $redirSubpage = false, $allowedRedirectParams = array(), $addedRedirectParams = array() ) {
parent::__construct( $name );
$this->redirName = $redirName;
$this->redirSubpage = $redirSubpage;
- $this->mAllowedRedirectParams = $redirectParams;
+ $this->mAllowedRedirectParams = $allowedRedirectParams;
+ $this->mAddedRedirectParams = $addedRedirectParams;
}
function getRedirect( $subpage ) {
@@ -925,7 +997,8 @@ class SpecialRedirectToSpecial extends UnlistedSpecialPage {
class SpecialMypage extends UnlistedSpecialPage {
function __construct() {
parent::__construct( 'Mypage' );
- $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro', 'section' );
+ $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro',
+ 'section', 'oldid', 'diff', 'dir' );
}
function getRedirect( $subpage ) {
@@ -945,7 +1018,8 @@ class SpecialMypage extends UnlistedSpecialPage {
class SpecialMytalk extends UnlistedSpecialPage {
function __construct() {
parent::__construct( 'Mytalk' );
- $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro', 'section' );
+ $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro',
+ 'section', 'oldid', 'diff', 'dir' );
}
function getRedirect( $subpage ) {
@@ -974,3 +1048,18 @@ class SpecialMycontributions extends UnlistedSpecialPage {
return SpecialPage::getTitleFor( 'Contributions', $wgUser->getName() );
}
}
+
+/**
+ * Redirect to Special:Listfiles?user=$wgUser
+ */
+class SpecialMyuploads extends UnlistedSpecialPage {
+ function __construct() {
+ parent::__construct( 'Myuploads' );
+ $this->mAllowedRedirectParams = array( 'limit' );
+ }
+
+ function getRedirect( $subpage ) {
+ global $wgUser;
+ return SpecialPage::getTitleFor( 'Listfiles', $wgUser->getName() );
+ }
+}
diff --git a/includes/SquidPurgeClient.php b/includes/SquidPurgeClient.php
index 65da5c1a..1b315e5f 100644
--- a/includes/SquidPurgeClient.php
+++ b/includes/SquidPurgeClient.php
@@ -265,7 +265,7 @@ class SquidPurgeClient {
$this->markDown();
return;
}
- list( $all, $major, $minor, $status, $reason ) = $m;
+ list( , , , $status, $reason ) = $m;
$status = intval( $status );
if ( $status !== 200 && $status !== 404 ) {
$this->log( "unexpected status code: $status $reason" );
@@ -356,12 +356,12 @@ class SquidPurgeClientPool {
}
foreach ( $readSockets as $key => $socket ) {
- list( $clientIndex, $i ) = explode( '/', $key );
+ list( $clientIndex, ) = explode( '/', $key );
$client = $this->clients[$clientIndex];
$client->doReads();
}
foreach ( $writeSockets as $key => $socket ) {
- list( $clientIndex, $i ) = explode( '/', $key );
+ list( $clientIndex, ) = explode( '/', $key );
$client = $this->clients[$clientIndex];
$client->doWrites();
}
diff --git a/includes/SquidUpdate.php b/includes/SquidUpdate.php
index 66517719..31f7aa68 100644
--- a/includes/SquidUpdate.php
+++ b/includes/SquidUpdate.php
@@ -26,6 +26,7 @@ class SquidUpdate {
}
static function newFromLinksTo( &$title ) {
+ global $wgMaxSquidPurgeTitles;
wfProfileIn( __METHOD__ );
# Get a list of URLs linking to this page
@@ -38,14 +39,12 @@ class SquidUpdate {
'pl_from=page_id' ),
__METHOD__ );
$blurlArr = $title->getSquidURLs();
- if ( $dbr->numRows( $res ) <= $this->mMaxTitles ) {
- while ( $BL = $dbr->fetchObject ( $res ) )
- {
+ if ( $dbr->numRows( $res ) <= $wgMaxSquidPurgeTitles ) {
+ foreach ( $res as $BL ) {
$tobj = Title::makeTitle( $BL->page_namespace, $BL->page_title ) ;
$blurlArr[] = $tobj->getInternalURL();
}
}
- $dbr->freeResult ( $res ) ;
wfProfileOut( __METHOD__ );
return new SquidUpdate( $blurlArr );
diff --git a/includes/Status.php b/includes/Status.php
index a07a4b81..f049980f 100644
--- a/includes/Status.php
+++ b/includes/Status.php
@@ -24,6 +24,8 @@ class Status {
/**
* Factory function for fatal errors
+ *
+ * @param $message String: message name
*/
static function newFatal( $message /*, parameters...*/ ) {
$params = func_get_args();
@@ -33,25 +35,52 @@ class Status {
return $result;
}
+ /**
+ * Factory function for good results
+ *
+ * @param $value Mixed
+ */
static function newGood( $value = null ) {
$result = new self;
$result->value = $value;
return $result;
}
+ /**
+ * Change operation result
+ *
+ * @param $ok Boolean: whether to operation completed
+ * @param $value Mixed
+ */
function setResult( $ok, $value = null ) {
$this->ok = $ok;
$this->value = $value;
}
+ /**
+ * Returns whether the operation completed and didn't have any error or
+ * warnings
+ *
+ * @return Boolean
+ */
function isGood() {
return $this->ok && !$this->errors;
}
+ /**
+ * Returns whether the operation completed
+ *
+ * @return Boolean
+ */
function isOK() {
return $this->ok;
}
+ /**
+ * Add a new warning
+ *
+ * @param $message String: message name
+ */
function warning( $message /*, parameters... */ ) {
$params = array_slice( func_get_args(), 1 );
$this->errors[] = array(
@@ -63,6 +92,8 @@ class Status {
/**
* Add an error, do not set fatal flag
* This can be used for non-fatal errors
+ *
+ * @param $message String: message name
*/
function error( $message /*, parameters... */ ) {
$params = array_slice( func_get_args(), 1 );
@@ -73,7 +104,10 @@ class Status {
}
/**
- * Add an error and set OK to false, indicating that the operation as a whole was fatal
+ * Add an error and set OK to false, indicating that the operation
+ * as a whole was fatal
+ *
+ * @param $message String: message name
*/
function fatal( $message /*, parameters... */ ) {
$params = array_slice( func_get_args(), 1 );
@@ -128,9 +162,11 @@ class Status {
/**
* Get the error list as a wikitext formatted list
- * @param string $shortContext A short enclosing context message name, to be used
- * when there is a single error
- * @param string $longContext A long enclosing context message name, for a list
+ *
+ * @param $shortContext String: a short enclosing context message name, to
+ * be used when there is a single error
+ * @param $longContext String: a long enclosing context message name, for a list
+ * @return String
*/
function getWikiText( $shortContext = false, $longContext = false ) {
if ( count( $this->errors ) == 0 ) {
@@ -143,19 +179,15 @@ class Status {
}
}
if ( count( $this->errors ) == 1 ) {
- $params = array_map( 'wfEscapeWikiText', $this->cleanParams( $this->errors[0]['params'] ) );
- $s = wfMsgReal( $this->errors[0]['message'], $params, true, false, false );
+ $s = $this->getWikiTextForError( $this->errors[0], $this->errors[0] );
if ( $shortContext ) {
$s = wfMsgNoTrans( $shortContext, $s );
} elseif ( $longContext ) {
$s = wfMsgNoTrans( $longContext, "* $s\n" );
}
} else {
- $s = '';
- foreach ( $this->errors as $error ) {
- $params = array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) );
- $s .= '* ' . wfMsgReal( $error['message'], $params, true, false, false ) . "\n";
- }
+ $s = '* '. implode("\n* ",
+ $this->getWikiTextArray( $this->errors ) ) . "\n";
if ( $longContext ) {
$s = wfMsgNoTrans( $longContext, $s );
} elseif ( $shortContext ) {
@@ -166,7 +198,45 @@ class Status {
}
/**
+ * Return the wiki text for a single error.
+ * @param $error Mixed With an array & two values keyed by
+ * 'message' and 'params', use those keys-value pairs.
+ * Otherwise, if its an array, just use the first value as the
+ * message and the remaining items as the params.
+ *
+ * @return String
+ */
+ protected function getWikiTextForError( $error ) {
+ if ( is_array( $error ) ) {
+ if ( isset( $error['message'] ) && isset( $error['params'] ) ) {
+ return wfMsgReal( $error['message'],
+ array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) ),
+ true, false, false );
+ } else {
+ $message = array_shift($error);
+ return wfMsgReal( $message,
+ array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ),
+ true, false, false );
+ }
+ } else {
+ return wfMsgReal( $error, array(), true, false, false);
+ }
+ }
+
+ /**
+ * Return an array with the wikitext for each item in the array.
+ * @param $errors Array
+ * @return Array
+ */
+ function getWikiTextArray( $errors ) {
+ return array_map( array( $this, 'getWikiTextForError' ), $errors );
+ }
+
+ /**
* Merge another status object into this one
+ *
+ * @param $other Other Status object
+ * @param $overwriteValue Boolean: whether to override the "value" member
*/
function merge( $other, $overwriteValue = false ) {
$this->errors = array_merge( $this->errors, $other->errors );
@@ -178,20 +248,48 @@ class Status {
$this->failCount += $other->failCount;
}
+ /**
+ * Get the list of errors (but not warnings)
+ *
+ * @return Array
+ */
function getErrorsArray() {
+ return $this->getStatusArray( "error" );
+ }
+
+ /**
+ * Get the list of warnings (but not errors)
+ *
+ * @return Array
+ */
+ function getWarningsArray() {
+ return $this->getStatusArray( "warning" );
+ }
+
+ /**
+ * Returns a list of status messages of the given type
+ * @param $type String
+ *
+ * @return Array
+ */
+ protected function getStatusArray( $type ) {
$result = array();
foreach ( $this->errors as $error ) {
- if ( $error['type'] == 'error' )
- if( $error['params'] )
+ if ( $error['type'] === $type ) {
+ if( $error['params'] ) {
$result[] = array_merge( array( $error['message'] ), $error['params'] );
- else
+ } else {
$result[] = $error['message'];
+ }
+ }
}
return $result;
}
-
/**
* Returns true if the specified message is present as a warning or error
+ *
+ * @param $msg String: message name
+ * @return Boolean
*/
function hasMessage( $msg ) {
foreach ( $this->errors as $error ) {
@@ -201,4 +299,30 @@ class Status {
}
return false;
}
+
+ /**
+ * If the specified source message exists, replace it with the specified
+ * destination message, but keep the same parameters as in the original error.
+ *
+ * Return true if the replacement was done, false otherwise.
+ */
+ function replaceMessage( $source, $dest ) {
+ $replaced = false;
+ foreach ( $this->errors as $index => $error ) {
+ if ( $error['message'] === $source ) {
+ $this->errors[$index]['message'] = $dest;
+ $replaced = true;
+ }
+ }
+ return $replaced;
+ }
+
+ /**
+ * Backward compatibility function for WikiError -> Status migration
+ *
+ * @return String
+ */
+ public function getMessage() {
+ return $this->getWikiText();
+ }
}
diff --git a/includes/StreamFile.php b/includes/StreamFile.php
index 6db66ba8..5f460ee3 100644
--- a/includes/StreamFile.php
+++ b/includes/StreamFile.php
@@ -1,5 +1,9 @@
<?php
-/** */
+/**
+ * Functions related to the output of file content
+ *
+ * @file
+ */
/** */
function wfStreamFile( $fname, $headers = array() ) {
@@ -37,8 +41,8 @@ function wfStreamFile( $fname, $headers = array() ) {
return;
}
- global $wgContLanguageCode;
- header( "Content-Disposition: inline;filename*=utf-8'$wgContLanguageCode'" . urlencode( basename( $fname ) ) );
+ global $wgLanguageCode;
+ header( "Content-Disposition: inline;filename*=utf-8'$wgLanguageCode'" . urlencode( basename( $fname ) ) );
foreach ( $headers as $header ) {
header( $header );
@@ -91,8 +95,8 @@ function wfGetType( $filename, $safe = true ) {
*/
if ( $safe ) {
global $wgFileBlacklist, $wgCheckFileExtensions, $wgStrictFileExtensions,
- $wgFileExtensions, $wgVerifyMimeType, $wgMimeTypeBlacklist, $wgRequest;
- list( $partName, $extList ) = UploadBase::splitExtensions( $filename );
+ $wgFileExtensions, $wgVerifyMimeType, $wgMimeTypeBlacklist;
+ list( , $extList ) = UploadBase::splitExtensions( $filename );
if ( UploadBase::checkFileExtensionList( $extList, $wgFileBlacklist ) ) {
return 'unknown/unknown';
}
diff --git a/includes/StringUtils.php b/includes/StringUtils.php
index 0be88df5..c1e617a0 100644
--- a/includes/StringUtils.php
+++ b/includes/StringUtils.php
@@ -36,7 +36,11 @@ class StringUtils {
* This implementation is slower than hungryDelimiterReplace but uses far less
* memory. The delimiters are literal strings, not regular expressions.
*
- * @param string $flags Regular expression flags
+ * @param $startDelim String: start delimiter
+ * @param $endDelim String: end delimiter
+ * @param $callback Callback: function to call on each match
+ * @param $subject String
+ * @param $flags String: regular expression flags
*/
# If the start delimiter ends with an initial substring of the end delimiter,
# e.g. in the case of C-style comments, the behaviour differs from the model
@@ -115,17 +119,18 @@ class StringUtils {
return $output;
}
- /*
+ /**
* Perform an operation equivalent to
*
* preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
*
- * @param string $startDelim Start delimiter regular expression
- * @param string $endDelim End delimiter regular expression
- * @param string $replace Replacement string. May contain $1, which will be
- * replaced by the text between the delimiters
- * @param string $subject String to search
- * @return string The string with the matches replaced
+ * @param $startDelim String: start delimiter regular expression
+ * @param $endDelim String: end delimiter regular expression
+ * @param $replace String: replacement string. May contain $1, which will be
+ * replaced by the text between the delimiters
+ * @param $subject String to search
+ * @param $flags String: regular expression flags
+ * @return String: The string with the matches replaced
*/
static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
$replacer = new RegexlikeReplacer( $replace );
@@ -136,8 +141,8 @@ class StringUtils {
/**
* More or less "markup-safe" explode()
* Ignores any instances of the separator inside <...>
- * @param string $separator
- * @param string $text
+ * @param $separator String
+ * @param $text String
* @return array
*/
static function explodeMarkup( $separator, $text ) {
@@ -163,8 +168,8 @@ class StringUtils {
* Escape a string to make it suitable for inclusion in a preg_replace()
* replacement parameter.
*
- * @param string $string
- * @return string
+ * @param $string String
+ * @return String
*/
static function escapeRegexReplacement( $string ) {
$string = str_replace( '\\', '\\\\', $string );
diff --git a/includes/StubObject.php b/includes/StubObject.php
index 52fbeb24..678b2744 100644
--- a/includes/StubObject.php
+++ b/includes/StubObject.php
@@ -21,10 +21,10 @@ class StubObject {
/**
* Constructor.
*
- * @param String $global name of the global variable.
- * @param String $class name of the class of the real object.
- * @param Array $param array of parameters to pass to contructor of the real
- * object.
+ * @param $global String: name of the global variable.
+ * @param $class String: name of the class of the real object.
+ * @param $params Array: parameters to pass to contructor of the real
+ * object.
*/
function __construct( $global = null, $class = null, $params = array() ) {
$this->mGlobal = $global;
@@ -36,8 +36,8 @@ class StubObject {
* Returns a bool value whetever $obj is a stub object. Can be used to break
* a infinite loop when unstubbing an object.
*
- * @param Object $obj object to check.
- * @return bool true if $obj is not an instance of StubObject class.
+ * @param $obj Object to check.
+ * @return Boolean: true if $obj is not an instance of StubObject class.
*/
static function isRealObject( $obj ) {
return is_object( $obj ) && !($obj instanceof StubObject);
@@ -50,8 +50,8 @@ class StubObject {
* This function will also call the function with the same name in the real
* object.
*
- * @param String $name name of the function called.
- * @param Array $args array of arguments.
+ * @param $name String: name of the function called
+ * @param $args Array: arguments
*/
function _call( $name, $args ) {
$this->_unstub( $name, 5 );
@@ -69,8 +69,8 @@ class StubObject {
* Function called by PHP if no function with that name exists in this
* object.
*
- * @param String $name name of the function called
- * @param Array $args array of arguments
+ * @param $name String: name of the function called
+ * @param $args Array: arguments
*/
function __call( $name, $args ) {
return $this->_call( $name, $args );
@@ -82,9 +82,9 @@ class StubObject {
* This is public, for the convenience of external callers wishing to access
* properties, e.g. eval.php
*
- * @param String $name name of the method called in this object.
- * @param Integer $level level to go in the stact trace to get the function
- * who called this function.
+ * @param $name String: name of the method called in this object.
+ * @param $level Integer: level to go in the stact trace to get the function
+ * who called this function.
*/
function _unstub( $name = '_unstub', $level = 2 ) {
static $recursionLevel = 0;
@@ -100,7 +100,7 @@ class StubObject {
throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
}
wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
- $obj = $GLOBALS[$this->mGlobal] = $this->_newObject();
+ $GLOBALS[$this->mGlobal] = $this->_newObject();
--$recursionLevel;
wfProfileOut( $fname );
}
@@ -122,8 +122,8 @@ class StubContLang extends StubObject {
}
function _newObject() {
- global $wgContLanguageCode;
- $obj = Language::factory( $wgContLanguageCode );
+ global $wgLanguageCode;
+ $obj = Language::factory( $wgLanguageCode );
$obj->initEncoding();
$obj->initContLang();
return $obj;
@@ -146,7 +146,7 @@ class StubUserLang extends StubObject {
}
function _newObject() {
- global $wgContLanguageCode, $wgRequest, $wgUser, $wgContLang;
+ global $wgLanguageCode, $wgRequest, $wgUser, $wgContLang;
$code = $wgRequest->getVal( 'uselang', $wgUser->getOption( 'language' ) );
// BCP 47 - letter case MUST NOT carry meaning
$code = strtolower( $code );
@@ -154,10 +154,10 @@ class StubUserLang extends StubObject {
# Validate $code
if( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) {
wfDebug( "Invalid user language code\n" );
- $code = $wgContLanguageCode;
+ $code = $wgLanguageCode;
}
- if( $code === $wgContLanguageCode ) {
+ if( $code === $wgLanguageCode ) {
return $wgContLang;
} else {
$obj = Language::factory( $code );
@@ -165,30 +165,3 @@ class StubUserLang extends StubObject {
}
}
}
-
-/**
- * Stub object for the user. The initialisation of the will depend of
- * $wgCommandLineMode. If it's true, it will be an anonymous user and if it's
- * false, the user will be loaded from credidentails provided by cookies. This
- * object have to be in $wgUser global.
- */
-class StubUser extends StubObject {
-
- function __construct() {
- parent::__construct( 'wgUser' );
- }
-
- function __call( $name, $args ) {
- return $this->_call( $name, $args );
- }
-
- function _newObject() {
- global $wgCommandLineMode;
- if( $wgCommandLineMode ) {
- $user = new User;
- } else {
- $user = User::newFromSession();
- }
- return $user;
- }
-}
diff --git a/includes/Title.php b/includes/Title.php
index be41a85a..5ae2f1a0 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -4,24 +4,34 @@
* @file
*/
+/**
+ * @todo: determine if it is really necessary to load this. Appears to be left over from pre-autoloader versions, and
+ * is only really needed to provide access to constant UTF8_REPLACEMENT, which actually resides in UtfNormalDefines.php
+ * and is loaded by UtfNormalUtil.php, which is loaded by UtfNormal.php.
+ */
if ( !class_exists( 'UtfNormal' ) ) {
- require_once( dirname(__FILE__) . '/normal/UtfNormal.php' );
+ require_once( dirname( __FILE__ ) . '/normal/UtfNormal.php' );
}
-define ( 'GAID_FOR_UPDATE', 1 );
+/**
+ * @deprecated This used to be a define, but was moved to
+ * Title::GAID_FOR_UPDATE in 1.17. This will probably be removed in 1.18
+ */
+define( 'GAID_FOR_UPDATE', Title::GAID_FOR_UPDATE );
/**
* Represents a title within MediaWiki.
* Optionally may contain an interwiki designation or namespace.
* @note This class can fetch various kinds of data from the database;
* however, it does so inefficiently.
+ *
+ * @internal documentation reviewed 15 Mar 2010
*/
class Title {
/** @name Static cache variables */
- //@{
- static private $titleCache=array();
- static private $interwikiCache=array();
- //@}
+ // @{
+ static private $titleCache = array();
+ // @}
/**
* Title::newFromText maintains a cache to avoid expensive re-normalization of
@@ -30,51 +40,60 @@ class Title {
*/
const CACHE_MAX = 1000;
+ /**
+ * Used to be GAID_FOR_UPDATE define. Used with getArticleId() and friends
+ * to use the master DB
+ */
+ const GAID_FOR_UPDATE = 1;
+
/**
* @name Private member variables
* Please use the accessor functions instead.
* @private
*/
- //@{
-
- var $mTextform = ''; ///< Text form (spaces not underscores) of the main part
- var $mUrlform = ''; ///< URL-encoded form of the main part
- var $mDbkeyform = ''; ///< Main part with underscores
- var $mUserCaseDBKey; ///< DB key with the initial letter in the case specified by the user
- var $mNamespace = NS_MAIN; ///< Namespace index, i.e. one of the NS_xxxx constants
- var $mInterwiki = ''; ///< Interwiki prefix (or null string)
- var $mFragment; ///< Title fragment (i.e. the bit after the #)
- var $mArticleID = -1; ///< Article ID, fetched from the link cache on demand
- var $mLatestID = false; ///< ID of most recent revision
- var $mRestrictions = array(); ///< Array of groups allowed to edit this article
+ // @{
+
+ var $mTextform = ''; // /< Text form (spaces not underscores) of the main part
+ var $mUrlform = ''; // /< URL-encoded form of the main part
+ var $mDbkeyform = ''; // /< Main part with underscores
+ var $mUserCaseDBKey; // /< DB key with the initial letter in the case specified by the user
+ var $mNamespace = NS_MAIN; // /< Namespace index, i.e. one of the NS_xxxx constants
+ var $mInterwiki = ''; // /< Interwiki prefix (or null string)
+ var $mFragment; // /< Title fragment (i.e. the bit after the #)
+ var $mArticleID = -1; // /< Article ID, fetched from the link cache on demand
+ var $mLatestID = false; // /< ID of most recent revision
+ var $mRestrictions = array(); // /< Array of groups allowed to edit this article
var $mOldRestrictions = false;
var $mCascadeRestriction; ///< Cascade restrictions on this page to included templates and images?
+ var $mCascadingRestrictions; // Caching the results of getCascadeProtectionSources
var $mRestrictionsExpiry = array(); ///< When do the restrictions on this page expire?
var $mHasCascadingRestrictions; ///< Are cascading restrictions in effect on this page?
var $mCascadeSources; ///< Where are the cascading restrictions coming from on this page?
var $mRestrictionsLoaded = false; ///< Boolean for initialisation on demand
var $mPrefixedText; ///< Text form including namespace/interwiki, initialised on demand
+ var $mTitleProtection; ///< Cached value for getTitleProtection (create protection)
# Don't change the following default, NS_MAIN is hardcoded in several
# places. See bug 696.
- var $mDefaultNamespace = NS_MAIN; ///< Namespace index when there is no namespace
+ var $mDefaultNamespace = NS_MAIN; // /< Namespace index when there is no namespace
# Zero except in {{transclusion}} tags
- var $mWatched = null; ///< Is $wgUser watching this page? null if unfilled, accessed through userIsWatching()
- var $mLength = -1; ///< The page length, 0 for special pages
- 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 $mWatched = null; // /< Is $wgUser watching this page? null if unfilled, accessed through userIsWatching()
+ var $mLength = -1; // /< The page length, 0 for special pages
+ 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
+ // @}
/**
* Constructor
* @private
*/
- /* private */ function __construct() {}
+ /* private */ function __construct() { }
/**
* Create a new Title from a prefixed DB key
+ *
* @param $key \type{\string} The database key, which has underscores
* instead of spaces, possibly including namespace and
* interwiki prefixes
@@ -83,26 +102,27 @@ class Title {
public static function newFromDBkey( $key ) {
$t = new Title();
$t->mDbkeyform = $key;
- if( $t->secureAndSplit() )
+ if ( $t->secureAndSplit() ) {
return $t;
- else
+ } else {
return null;
+ }
}
/**
* Create a new Title from text, such as what one would find in a link. De-
* codes any HTML entities in the text.
*
- * @param $text string The link text; spaces, prefixes, and an
+ * @param $text string The link text; spaces, prefixes, and an
* initial ':' indicating the main namespace are accepted.
- * @param $defaultNamespace int The namespace to use if none is speci-
+ * @param $defaultNamespace int The namespace to use if none is speci-
* 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 The new object, or null on an error.
*/
public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
- if( is_object( $text ) ) {
+ if ( is_object( $text ) ) {
throw new MWException( 'Title::newFromText given an object' );
}
@@ -114,26 +134,26 @@ class Title {
*
* In theory these are value objects and won't get changed...
*/
- if( $defaultNamespace == NS_MAIN && isset( Title::$titleCache[$text] ) ) {
+ if ( $defaultNamespace == NS_MAIN && isset( Title::$titleCache[$text] ) ) {
return Title::$titleCache[$text];
}
/**
- * Convert things like &eacute; &#257; or &#x3017; into real text...
+ * Convert things like &eacute; &#257; or &#x3017; into normalized (bug 14952) text
*/
- $filteredText = Sanitizer::decodeCharReferences( $text );
+ $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
$t = new Title();
$t->mDbkeyform = str_replace( ' ', '_', $filteredText );
$t->mDefaultNamespace = $defaultNamespace;
static $cachedcount = 0 ;
- if( $t->secureAndSplit() ) {
- if( $defaultNamespace == NS_MAIN ) {
- if( $cachedcount >= self::CACHE_MAX ) {
+ if ( $t->secureAndSplit() ) {
+ if ( $defaultNamespace == NS_MAIN ) {
+ if ( $cachedcount >= self::CACHE_MAX ) {
# Avoid memory leaks on mass operations...
Title::$titleCache = array();
- $cachedcount=0;
+ $cachedcount = 0;
}
$cachedcount++;
Title::$titleCache[$text] =& $t;
@@ -156,6 +176,7 @@ class Title {
*
* Create a new Title from URL-encoded text. Ensures that
* the given title's length does not exceed the maximum.
+ *
* @param $url \type{\string} the title, as might be taken from a URL
* @return \type{Title} the new object, or NULL on an error
*/
@@ -171,7 +192,7 @@ class Title {
}
$t->mDbkeyform = str_replace( ' ', '_', $url );
- if( $t->secureAndSplit() ) {
+ if ( $t->secureAndSplit() ) {
return $t;
} else {
return null;
@@ -182,13 +203,13 @@ class Title {
* Create a new Title from an article ID
*
* @param $id \type{\int} the page_id corresponding to the Title to create
- * @param $flags \type{\int} use GAID_FOR_UPDATE to use master
+ * @param $flags \type{\int} use Title::GAID_FOR_UPDATE to use master
* @return \type{Title} the new object, or NULL on an error
*/
public static function newFromID( $id, $flags = 0 ) {
- $db = ($flags & GAID_FOR_UPDATE) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
+ $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
$row = $db->selectRow( 'page', '*', array( 'page_id' => $id ), __METHOD__ );
- if( $row !== false ) {
+ if ( $row !== false ) {
$title = Title::newFromRow( $row );
} else {
$title = null;
@@ -198,6 +219,7 @@ class Title {
/**
* Make an array of titles from an array of IDs
+ *
* @param $ids \type{\arrayof{\int}} Array of IDs
* @return \type{\arrayof{Title}} Array of Titles
*/
@@ -206,28 +228,37 @@ class Title {
return array();
}
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'page', array( 'page_namespace', 'page_title' ),
- 'page_id IN (' . $dbr->makeList( $ids ) . ')', __METHOD__ );
+
+ $res = $dbr->select(
+ 'page',
+ array(
+ 'page_namespace', 'page_title', 'page_id',
+ 'page_len', 'page_is_redirect', 'page_latest',
+ ),
+ array( 'page_id' => $ids ),
+ __METHOD__
+ );
$titles = array();
- foreach( $res as $row ) {
- $titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
+ foreach ( $res as $row ) {
+ $titles[] = Title::newFromRow( $row );
}
return $titles;
}
/**
* Make a Title object from a DB row
+ *
* @param $row \type{Row} (needs at least page_title,page_namespace)
* @return \type{Title} corresponding Title
*/
public static function newFromRow( $row ) {
$t = self::makeTitle( $row->page_namespace, $row->page_title );
- $t->mArticleID = isset($row->page_id) ? intval($row->page_id) : -1;
- $t->mLength = isset($row->page_len) ? intval($row->page_len) : -1;
- $t->mRedirect = isset($row->page_is_redirect) ? (bool)$row->page_is_redirect : null;
- $t->mLatestID = isset($row->page_latest) ? $row->page_latest : false;
+ $t->mArticleID = isset( $row->page_id ) ? intval( $row->page_id ) : -1;
+ $t->mLength = isset( $row->page_len ) ? intval( $row->page_len ) : -1;
+ $t->mRedirect = isset( $row->page_is_redirect ) ? (bool)$row->page_is_redirect : null;
+ $t->mLatestID = isset( $row->page_latest ) ? intval( $row->page_latest ) : false;
return $t;
}
@@ -242,11 +273,12 @@ class Title {
* @param $ns \type{\int} the namespace of the article
* @param $title \type{\string} the unprefixed database key form
* @param $fragment \type{\string} The link fragment (after the "#")
+ * @param $interwiki \type{\string} The interwiki prefix
* @return \type{Title} the new object
*/
- public static function &makeTitle( $ns, $title, $fragment = '' ) {
+ public static function &makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) {
$t = new Title();
- $t->mInterwiki = '';
+ $t->mInterwiki = $interwiki;
$t->mFragment = $fragment;
$t->mNamespace = $ns = intval( $ns );
$t->mDbkeyform = str_replace( ' ', '_', $title );
@@ -264,12 +296,13 @@ class Title {
* @param $ns \type{\int} the namespace of the article
* @param $title \type{\string} the database key form
* @param $fragment \type{\string} The link fragment (after the "#")
+ * @param $interwiki \type{\string} The interwiki prefix
* @return \type{Title} the new object, or NULL on an error
*/
- public static function makeTitleSafe( $ns, $title, $fragment = '' ) {
+ public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
$t = new Title();
- $t->mDbkeyform = Title::makeName( $ns, $title, $fragment );
- if( $t->secureAndSplit() ) {
+ $t->mDbkeyform = Title::makeName( $ns, $title, $fragment, $interwiki );
+ if ( $t->secureAndSplit() ) {
return $t;
} else {
return null;
@@ -278,6 +311,7 @@ class Title {
/**
* Create a new Title for the Main Page
+ *
* @return \type{Title} the new object
*/
public static function newMainPage() {
@@ -295,8 +329,8 @@ class Title {
* This will only return the very next target, useful for
* the redirect table and other checks that don't need full recursion
*
- * @param $text \type{\string} Text with possible redirect
- * @return \type{Title} The corresponding Title
+ * @param $text String: Text with possible redirect
+ * @return Title: The corresponding Title
*/
public static function newFromRedirect( $text ) {
return self::newFromRedirectInternal( $text );
@@ -328,23 +362,25 @@ class Title {
public static function newFromRedirectArray( $text ) {
global $wgMaxRedirects;
// are redirects disabled?
- if( $wgMaxRedirects < 1 )
+ if ( $wgMaxRedirects < 1 ) {
return null;
+ }
$title = self::newFromRedirectInternal( $text );
- if( is_null( $title ) )
+ if ( is_null( $title ) ) {
return null;
+ }
// recursive check to follow double redirects
$recurse = $wgMaxRedirects;
$titles = array( $title );
- while( --$recurse > 0 ) {
- if( $title->isRedirect() ) {
+ while ( --$recurse > 0 ) {
+ if ( $title->isRedirect() ) {
$article = new Article( $title, 0 );
$newtitle = $article->getRedirectTarget();
} else {
break;
}
// Redirects to some special pages are not permitted
- if( $newtitle instanceOf Title && $newtitle->isValidRedirectTarget() ) {
+ if ( $newtitle instanceOf Title && $newtitle->isValidRedirectTarget() ) {
// the new title passes the checks, so make that our current title so that further recursion can be checked
$title = $newtitle;
$titles[] = $newtitle;
@@ -364,16 +400,16 @@ class Title {
*/
protected static function newFromRedirectInternal( $text ) {
$redir = MagicWord::get( 'redirect' );
- $text = trim($text);
- if( $redir->matchStartAndRemove( $text ) ) {
+ $text = trim( $text );
+ if ( $redir->matchStartAndRemove( $text ) ) {
// Extract the first link and see if it's usable
// Ensure that it really does come directly after #REDIRECT
// Some older redirects included a colon, so don't freak about that!
$m = array();
- if( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
+ if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
// Strip preceding colon used to "escape" categories, etc.
// and URL-decode links
- if( strpos( $m[1], '%' ) !== false ) {
+ if ( strpos( $m[1], '%' ) !== false ) {
// Match behavior of inline link parsing here;
// don't interpret + as " " most of the time!
// It might be safe to just use rawurldecode instead, though.
@@ -381,7 +417,7 @@ class Title {
}
$title = Title::newFromText( $m[1] );
// If the title is a redirect to bad special pages or is invalid, return null
- if( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
+ if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
return null;
}
return $title;
@@ -390,12 +426,13 @@ class Title {
return null;
}
-#----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------
# Static functions
-#----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------
/**
* Get the prefixed DB key associated with an ID
+ *
* @param $id \type{\int} the page_id of the article
* @return \type{Title} an object representing the article, or NULL
* if no such article was found
@@ -403,11 +440,15 @@ class Title {
public static function nameOf( $id ) {
$dbr = wfGetDB( DB_SLAVE );
- $s = $dbr->selectRow( 'page',
- array( 'page_namespace','page_title' ),
+ $s = $dbr->selectRow(
+ 'page',
+ array( 'page_namespace', 'page_title' ),
array( 'page_id' => $id ),
- __METHOD__ );
- if ( $s === false ) { return null; }
+ __METHOD__
+ );
+ if ( $s === false ) {
+ return null;
+ }
$n = self::makeName( $s->page_namespace, $s->page_title );
return $n;
@@ -415,6 +456,7 @@ class Title {
/**
* Get a regex character class describing the legal characters in a link
+ *
* @return \type{\string} the list of characters, not delimited
*/
public static function legalChars() {
@@ -453,16 +495,21 @@ class Title {
/**
* Make a prefixed DB key from a DB key and a namespace index
+ *
* @param $ns \type{\int} numerical representation of the namespace
* @param $title \type{\string} the DB key form the title
* @param $fragment \type{\string} The link fragment (after the "#")
+ * @param $interwiki \type{\string} The interwiki prefix
* @return \type{\string} the prefixed form of the title
*/
- public static function makeName( $ns, $title, $fragment = '' ) {
+ public static function makeName( $ns, $title, $fragment = '', $interwiki = '' ) {
global $wgContLang;
$namespace = $wgContLang->getNsText( $ns );
$name = $namespace == '' ? $title : "$namespace:$title";
+ if ( strval( $interwiki ) != '' ) {
+ $name = "$interwiki:$name";
+ }
if ( strval( $fragment ) != '' ) {
$name .= '#' . $fragment;
}
@@ -491,14 +538,32 @@ class Title {
* @return \type{\bool} TRUE if this is transcludable
*/
public function isTrans() {
- if ($this->mInterwiki == '')
+ if ( $this->mInterwiki == '' ) {
return false;
+ }
return Interwiki::fetch( $this->mInterwiki )->isTranscludable();
}
/**
+ * Returns the DB name of the distant wiki
+ * which owns the object.
+ *
+ * @return \type{\string} the DB name
+ */
+ public function getTransWikiID() {
+ if ( $this->mInterwiki == '' ) {
+ return false;
+ }
+
+ return Interwiki::fetch( $this->mInterwiki )->getWikiID();
+ }
+
+ /**
* Escape a text fragment, say from a link, for a URL
+ *
+ * @param $fragment string containing a URL or link fragment (after the "#")
+ * @return String: escaped string
*/
static function escapeFragmentForURL( $fragment ) {
# Note that we don't urlencode the fragment. urlencoded Unicode
@@ -508,34 +573,43 @@ class Title {
return Sanitizer::escapeId( $fragment, 'noninitial' );
}
-#----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------
# Other stuff
-#----------------------------------------------------------------------------
+# ----------------------------------------------------------------------------
/** Simple accessors */
/**
* Get the text form (spaces not underscores) of the main part
+ *
* @return \type{\string} Main part of the title
*/
public function getText() { return $this->mTextform; }
+
/**
* Get the URL-encoded form of the main part
+ *
* @return \type{\string} Main part of the title, URL-encoded
*/
public function getPartialURL() { return $this->mUrlform; }
+
/**
* Get the main part with underscores
- * @return \type{\string} Main part of the title, with underscores
+ *
+ * @return String: Main part of the title, with underscores
*/
public function getDBkey() { return $this->mDbkeyform; }
+
/**
* Get the namespace index, i.e.\ one of the NS_xxxx constants.
- * @return \type{\int} Namespace index
+ *
+ * @return Integer: Namespace index
*/
public function getNamespace() { return $this->mNamespace; }
+
/**
* Get the namespace text
- * @return \type{\string} Namespace text
+ *
+ * @return String: Namespace text
*/
public function getNsText() {
global $wgContLang;
@@ -547,52 +621,65 @@ class Title {
//
// Use the canonical namespaces if possible to try to
// resolve a foreign namespace.
- if( MWNamespace::exists( $this->mNamespace ) ) {
+ if ( MWNamespace::exists( $this->mNamespace ) ) {
return MWNamespace::getCanonicalName( $this->mNamespace );
}
}
return $wgContLang->getNsText( $this->mNamespace );
}
+
/**
* Get the DB key with the initial letter case as specified by the user
+ *
* @return \type{\string} DB key
*/
function getUserCaseDBKey() {
return $this->mUserCaseDBKey;
}
+
/**
* Get the namespace text of the subject (rather than talk) page
+ *
* @return \type{\string} Namespace text
*/
public function getSubjectNsText() {
global $wgContLang;
return $wgContLang->getNsText( MWNamespace::getSubject( $this->mNamespace ) );
}
+
/**
* Get the namespace text of the talk page
+ *
* @return \type{\string} Namespace text
*/
public function getTalkNsText() {
global $wgContLang;
return( $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ) );
}
+
/**
* Could this title have a corresponding talk page?
+ *
* @return \type{\bool} TRUE or FALSE
*/
public function canTalk() {
return( MWNamespace::canTalk( $this->mNamespace ) );
}
+
/**
* Get the interwiki prefix (or null string)
+ *
* @return \type{\string} Interwiki prefix
*/
public function getInterwiki() { return $this->mInterwiki; }
+
/**
* Get the Title fragment (i.e.\ the bit after the #) in text form
+ *
* @return \type{\string} Title fragment
*/
public function getFragment() { return $this->mFragment; }
+
/**
* Get the fragment in URL form, including the "#" character if there is one
* @return \type{\string} Fragment in URL form
@@ -604,14 +691,17 @@ class Title {
return '#' . Title::escapeFragmentForURL( $this->mFragment );
}
}
+
/**
* Get the default namespace index, for when there is no namespace
+ *
* @return \type{\int} Default namespace index
*/
public function getDefaultNamespace() { return $this->mDefaultNamespace; }
/**
* Get title for search index
+ *
* @return \type{\string} a stripped-down title string ready for the
* search index
*/
@@ -621,6 +711,7 @@ class Title {
/**
* Get the prefixed database key form
+ *
* @return \type{\string} the prefixed title, with underscores and
* any interwiki and namespace prefixes
*/
@@ -633,6 +724,7 @@ class Title {
/**
* Get the prefixed title with spaces.
* This is the form usually used for display
+ *
* @return \type{\string} the prefixed title, with spaces
*/
public function getPrefixedText() {
@@ -647,12 +739,13 @@ class Title {
/**
* Get the prefixed title with spaces, plus any fragment
* (part beginning with '#')
+ *
* @return \type{\string} the prefixed title, with spaces and
* the fragment, including '#'
*/
public function getFullText() {
$text = $this->getPrefixedText();
- if( $this->mFragment != '' ) {
+ if ( $this->mFragment != '' ) {
$text .= '#' . $this->mFragment;
}
return $text;
@@ -660,34 +753,38 @@ class Title {
/**
* Get the base name, i.e. the leftmost parts before the /
+ *
* @return \type{\string} Base name
*/
public function getBaseText() {
- if( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
+ if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
return $this->getText();
}
$parts = explode( '/', $this->getText() );
# Don't discard the real title if there's no subpage involved
- if( count( $parts ) > 1 )
- unset( $parts[ count( $parts ) - 1 ] );
+ if ( count( $parts ) > 1 ) {
+ unset( $parts[count( $parts ) - 1] );
+ }
return implode( '/', $parts );
}
/**
* Get the lowest-level subpage name, i.e. the rightmost part after /
+ *
* @return \type{\string} Subpage name
*/
public function getSubpageText() {
- if( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
+ if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
return( $this->mTextform );
}
$parts = explode( '/', $this->mTextform );
- return( $parts[ count( $parts ) - 1 ] );
+ return( $parts[count( $parts ) - 1] );
}
/**
* Get a URL-encoded form of the subpage text
+ *
* @return \type{\string} URL-encoded subpage name
*/
public function getSubpageUrlForm() {
@@ -698,6 +795,7 @@ class Title {
/**
* Get a URL-encoded title (not an actual URL) including interwiki
+ *
* @return \type{\string} the URL-encoded form
*/
public function getPrefixedURL() {
@@ -717,9 +815,9 @@ class Title {
* @return \type{\string} the URL
*/
public function getFullURL( $query = '', $variant = false ) {
- global $wgContLang, $wgServer, $wgRequest;
+ global $wgServer, $wgRequest;
- if( is_array( $query ) ) {
+ if ( is_array( $query ) ) {
$query = wfArrayToCGI( $query );
}
@@ -729,11 +827,11 @@ class Title {
// Ugly quick hack to avoid duplicate prefixes (bug 4571 etc)
// Correct fix would be to move the prepending elsewhere.
- if ($wgRequest->getVal('action') != 'render') {
+ if ( $wgRequest->getVal( 'action' ) != 'render' ) {
$url = $wgServer . $url;
}
} else {
- $baseUrl = $interwiki->getURL( );
+ $baseUrl = $interwiki->getURL();
$namespace = wfUrlencode( $this->getNsText() );
if ( $namespace != '' ) {
@@ -755,7 +853,8 @@ class Title {
/**
* Get a URL with no fragment or server name. If this page is generated
* with action=render, $wgServer is prepended.
- * @param mixed $query an optional query string; if not specified,
+ *
+ * @param $query Mixed: an optional query string; if not specified,
* $wgArticlePath will be used. Can be specified as an associative array
* as well, e.g., array( 'action' => 'edit' ) (keys and values will be
* URL-escaped).
@@ -764,19 +863,12 @@ class Title {
*/
public function getLocalURL( $query = '', $variant = false ) {
global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
- global $wgVariantArticlePath, $wgContLang, $wgUser;
+ global $wgVariantArticlePath, $wgContLang;
- if( is_array( $query ) ) {
+ if ( is_array( $query ) ) {
$query = wfArrayToCGI( $query );
}
- // internal links should point to same variant as current page (only anonymous users)
- if($variant == false && $wgContLang->hasVariants() && !$wgUser->isLoggedIn()){
- $pref = $wgContLang->getPreferredVariant(false);
- if($pref != $wgContLang->getCode())
- $variant = $pref;
- }
-
if ( $this->isExternal() ) {
$url = $this->getFullURL();
if ( $query ) {
@@ -789,8 +881,8 @@ class Title {
} else {
$dbkey = wfUrlencode( $this->getPrefixedDBkey() );
if ( $query == '' ) {
- if( $variant != false && $wgContLang->hasVariants() ) {
- if( $wgVariantArticlePath == false ) {
+ if ( $variant != false && $wgContLang->hasVariants() ) {
+ if ( !$wgVariantArticlePath ) {
$variantArticlePath = "$wgScript?title=$1&variant=$2"; // default
} else {
$variantArticlePath = $wgVariantArticlePath;
@@ -804,15 +896,17 @@ class Title {
global $wgActionPaths;
$url = false;
$matches = array();
- if( !empty( $wgActionPaths ) &&
+ if ( !empty( $wgActionPaths ) &&
preg_match( '/^(.*&|)action=([^&]*)(&(.*)|)$/', $query, $matches ) )
{
$action = urldecode( $matches[2] );
- if( isset( $wgActionPaths[$action] ) ) {
+ if ( isset( $wgActionPaths[$action] ) ) {
$query = $matches[1];
- if( isset( $matches[4] ) ) $query .= $matches[4];
+ if ( isset( $matches[4] ) ) {
+ $query .= $matches[4];
+ }
$url = str_replace( '$1', $dbkey, $wgActionPaths[$action] );
- if( $query != '' ) {
+ if ( $query != '' ) {
$url = wfAppendQuery( $url, $query );
}
}
@@ -827,7 +921,7 @@ class Title {
// FIXME: this causes breakage in various places when we
// actually expected a local URL and end up with dupe prefixes.
- if ($wgRequest->getVal('action') == 'render') {
+ if ( $wgRequest->getVal( 'action' ) == 'render' ) {
$url = $wgServer . $url;
}
}
@@ -854,9 +948,9 @@ class Title {
*/
public function getLinkUrl( $query = array(), $variant = false ) {
wfProfileIn( __METHOD__ );
- if( $this->isExternal() ) {
+ if ( $this->isExternal() ) {
$ret = $this->getFullURL( $query );
- } elseif( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
+ } elseif ( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
$ret = $this->getFragmentForURL();
} else {
$ret = $this->getLocalURL( $query, $variant ) . $this->getFragmentForURL();
@@ -868,6 +962,7 @@ class Title {
/**
* Get an HTML-escaped version of the URL form, suitable for
* using in a link, without a server name or fragment
+ *
* @param $query \type{\string} an optional query string
* @return \type{\string} the URL
*/
@@ -904,11 +999,14 @@ class Title {
/**
* Get the edit URL for this Title
+ *
* @return \type{\string} the URL, or a null string if this is an
* interwiki link
*/
public function getEditURL() {
- if ( $this->mInterwiki != '' ) { return ''; }
+ if ( $this->mInterwiki != '' ) {
+ return '';
+ }
$s = $this->getLocalURL( 'action=edit' );
return $s;
@@ -917,6 +1015,7 @@ class Title {
/**
* Get the HTML-escaped displayable text form.
* Used for the title field in <a> tags.
+ *
* @return \type{\string} the text, including any prefixes
*/
public function getEscapedText() {
@@ -925,23 +1024,27 @@ class Title {
/**
* Is this Title interwiki?
+ *
* @return \type{\bool}
*/
- public function isExternal() { return ( $this->mInterwiki != '' ); }
+ public function isExternal() {
+ return ( $this->mInterwiki != '' );
+ }
/**
* Is this page "semi-protected" - the *only* protection is autoconfirm?
*
- * @param @action \type{\string} Action to check (default: edit)
+ * @param $action \type{\string} Action to check (default: edit)
* @return \type{\bool}
*/
public function isSemiProtected( $action = 'edit' ) {
- if( $this->exists() ) {
+ if ( $this->exists() ) {
$restrictions = $this->getRestrictions( $action );
- if( count( $restrictions ) > 0 ) {
- foreach( $restrictions as $restriction ) {
- if( strtolower( $restriction ) != 'autoconfirmed' )
+ if ( count( $restrictions ) > 0 ) {
+ foreach ( $restrictions as $restriction ) {
+ if ( strtolower( $restriction ) != 'autoconfirmed' ) {
return false;
+ }
}
} else {
# Not protected
@@ -956,7 +1059,8 @@ class Title {
/**
* Does the title correspond to a protected article?
- * @param $what \type{\string} the action the page is protected from,
+ *
+ * @param $action \type{\string} the action the page is protected from,
* by default checks all actions.
* @return \type{\bool}
*/
@@ -966,15 +1070,16 @@ class Title {
$restrictionTypes = $this->getRestrictionTypes();
# Special pages have inherent protection
- if( $this->getNamespace() == NS_SPECIAL )
+ if( $this->getNamespace() == NS_SPECIAL ) {
return true;
+ }
# Check regular protection levels
- foreach( $restrictionTypes as $type ){
- if( $action == $type || $action == '' ) {
+ foreach ( $restrictionTypes as $type ) {
+ if ( $action == $type || $action == '' ) {
$r = $this->getRestrictions( $type );
- foreach( $wgRestrictionLevels as $level ) {
- if( in_array( $level, $r ) && $level != '' ) {
+ foreach ( $wgRestrictionLevels as $level ) {
+ if ( in_array( $level, $r ) && $level != '' ) {
return true;
}
}
@@ -986,11 +1091,15 @@ class Title {
/**
* Is this a conversion table for the LanguageConverter?
+ *
* @return \type{\bool}
*/
public function isConversionTable() {
- if($this->getNamespace() == NS_MEDIAWIKI
- && strpos( $this->getText(), 'Conversiontable' ) !== false ) {
+ if(
+ $this->getNamespace() == NS_MEDIAWIKI &&
+ strpos( $this->getText(), 'Conversiontable' ) !== false
+ )
+ {
return true;
}
@@ -999,13 +1108,14 @@ class Title {
/**
* Is $wgUser watching this page?
+ *
* @return \type{\bool}
*/
public function userIsWatching() {
global $wgUser;
if ( is_null( $this->mWatched ) ) {
- if ( NS_SPECIAL == $this->mNamespace || !$wgUser->isLoggedIn()) {
+ if ( NS_SPECIAL == $this->mNamespace || !$wgUser->isLoggedIn() ) {
$this->mWatched = false;
} else {
$this->mWatched = $wgUser->isWatched( $this );
@@ -1039,10 +1149,11 @@ class Title {
*/
public function isNamespaceProtected() {
global $wgNamespaceProtection, $wgUser;
- if( isset( $wgNamespaceProtection[ $this->mNamespace ] ) ) {
- foreach( (array)$wgNamespaceProtection[ $this->mNamespace ] as $right ) {
- if( $right != '' && !$wgUser->isAllowed( $right ) )
+ if ( isset( $wgNamespaceProtection[$this->mNamespace] ) ) {
+ foreach ( (array)$wgNamespaceProtection[$this->mNamespace] as $right ) {
+ if ( $right != '' && !$wgUser->isAllowed( $right ) ) {
return true;
+ }
}
}
return false;
@@ -1050,13 +1161,14 @@ class Title {
/**
* Can $wgUser perform $action on this page?
+ *
* @param $action \type{\string} action that permission needs to be checked for
* @param $doExpensiveQueries \type{\bool} Set this to false to avoid doing unnecessary queries.
* @return \type{\bool}
*/
public function userCan( $action, $doExpensiveQueries = true ) {
global $wgUser;
- return ($this->getUserPermissionsErrorsInternal( $action, $wgUser, $doExpensiveQueries, true ) === array());
+ return ( $this->getUserPermissionsErrorsInternal( $action, $wgUser, $doExpensiveQueries, true ) === array() );
}
/**
@@ -1071,79 +1183,14 @@ class Title {
* @return \type{\array} Array of arrays of the arguments to wfMsg to explain permissions problems.
*/
public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true, $ignoreErrors = array() ) {
- if( !StubObject::isRealObject( $user ) ) {
- //Since StubObject is always used on globals, we can unstub $wgUser here and set $user = $wgUser
- global $wgUser;
- $wgUser->_unstub( '', 5 );
- $user = $wgUser;
- }
$errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries );
- global $wgContLang;
- global $wgLang;
- global $wgEmailConfirmToEdit;
-
- if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount' ) {
- $errors[] = array( 'confirmedittext' );
- }
-
- // Edit blocks should not affect reading. Account creation blocks handled at userlogin.
- if ( $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this ) ) {
- $block = $user->mBlock;
-
- // This is from OutputPage::blockedPage
- // Copied at r23888 by werdna
-
- $id = $user->blockedBy();
- $reason = $user->blockedFor();
- if( $reason == '' ) {
- $reason = wfMsg( 'blockednoreason' );
- }
- $ip = wfGetIP();
-
- if ( is_numeric( $id ) ) {
- $name = User::whoIs( $id );
- } else {
- $name = $id;
- }
-
- $link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
- $blockid = $block->mId;
- $blockExpiry = $user->mBlock->mExpiry;
- $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $user->mBlock->mTimestamp ), true );
-
- if ( $blockExpiry == 'infinity' ) {
- // Entry in database (table ipblocks) is 'infinity' but 'ipboptions' uses 'infinite' or 'indefinite'
- $scBlockExpiryOptions = wfMsg( 'ipboptions' );
-
- foreach ( explode( ',', $scBlockExpiryOptions ) as $option ) {
- if ( strpos( $option, ':' ) == false )
- continue;
-
- list ($show, $value) = explode( ":", $option );
-
- if ( $value == 'infinite' || $value == 'indefinite' ) {
- $blockExpiry = $show;
- break;
- }
- }
- } else {
- $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
- }
-
- $intended = $user->mBlock->mAddress;
-
- $errors[] = array( ($block->mAuto ? 'autoblockedtext' : 'blockedtext'), $link, $reason, $ip, $name,
- $blockid, $blockExpiry, $intended, $blockTimestamp );
- }
-
// Remove the errors being ignored.
+ foreach ( $errors as $index => $error ) {
+ $error_key = is_array( $error ) ? $error[0] : $error;
- foreach( $errors as $index => $error ) {
- $error_key = is_array($error) ? $error[0] : $error;
-
- if (in_array( $error_key, $ignoreErrors )) {
- unset($errors[$index]);
+ if ( in_array( $error_key, $ignoreErrors ) ) {
+ unset( $errors[$index] );
}
}
@@ -1151,36 +1198,35 @@ class Title {
}
/**
- * Can $user perform $action on this page? This is an internal function,
- * which checks ONLY that previously checked by userCan (i.e. it leaves out
- * checks on wfReadOnly() and blocks)
+ * Permissions checks that fail most often, and which are easiest to test.
*
- * @param $action \type{\string} action that permission needs to be checked for
- * @param $user \type{User} user to check
- * @param $doExpensiveQueries \type{\bool} Set this to false to avoid doing unnecessary queries.
- * @param $short \type{\bool} Set this to true to stop after the first permission error.
- * @return \type{\array} Array of arrays of the arguments to wfMsg to explain permissions problems.
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
*/
- private function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries=true, $short=false ) {
- wfProfileIn( __METHOD__ );
-
- $errors = array();
-
- // First stop is permissions checks, which fail most often, and which are easiest to test.
- if ( $action == 'move' ) {
- if( !$user->isAllowed( 'move-rootuserpages' )
- && $this->getNamespace() == NS_USER && !$this->isSubpage() )
- {
+ private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ if ( $action == 'create' ) {
+ if ( ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
+ ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) ) {
+ $errors[] = $user->isAnon() ? array( 'nocreatetext' ) : array( 'nocreate-loggedin' );
+ }
+ } elseif ( $action == 'move' ) {
+ if ( !$user->isAllowed( 'move-rootuserpages' )
+ && $this->mNamespace == NS_USER && !$this->isSubpage() ) {
// Show user page-specific message only if the user can move other pages
$errors[] = array( 'cant-move-user-page' );
}
// Check if user is allowed to move files if it's a file
- if( $this->getNamespace() == NS_FILE && !$user->isAllowed( 'movefile' ) ) {
+ if ( $this->mNamespace == NS_FILE && !$user->isAllowed( 'movefile' ) ) {
$errors[] = array( 'movenotallowedfile' );
}
- if( !$user->isAllowed( 'move' ) ) {
+ if ( !$user->isAllowed( 'move' ) ) {
// User can't move anything
global $wgGroupPermissions;
$userCanMove = false;
@@ -1193,135 +1239,183 @@ class Title {
}
if ( $user->isAnon() && ( $userCanMove || $autoconfirmedCanMove ) ) {
// custom message if logged-in users without any special rights can move
- $errors[] = array ( 'movenologintext' );
+ $errors[] = array( 'movenologintext' );
} else {
- $errors[] = array ('movenotallowed');
+ $errors[] = array( 'movenotallowed' );
}
}
- } elseif ( $action == 'create' ) {
- if( ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
- ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) )
- {
- $errors[] = $user->isAnon() ? array ('nocreatetext') : array ('nocreate-loggedin');
- }
- } elseif( $action == 'move-target' ) {
- if( !$user->isAllowed( 'move' ) ) {
+ } elseif ( $action == 'move-target' ) {
+ if ( !$user->isAllowed( 'move' ) ) {
// User can't move anything
- $errors[] = array ('movenotallowed');
- } elseif( !$user->isAllowed( 'move-rootuserpages' )
- && $this->getNamespace() == NS_USER && !$this->isSubpage() )
- {
+ $errors[] = array( 'movenotallowed' );
+ } elseif ( !$user->isAllowed( 'move-rootuserpages' )
+ && $this->mNamespace == NS_USER && !$this->isSubpage() ) {
// Show user page-specific message only if the user can move other pages
$errors[] = array( 'cant-move-to-user-page' );
}
- } elseif( !$user->isAllowed( $action ) ) {
- $return = null;
-
+ } elseif ( !$user->isAllowed( $action ) ) {
// We avoid expensive display logic for quickUserCan's and such
$groups = false;
- if (!$short) {
+ if ( !$short ) {
$groups = array_map( array( 'User', 'makeGroupLinkWiki' ),
User::getGroupsWithPermission( $action ) );
}
- if( $groups ) {
- $return = array( 'badaccess-groups',
- array( implode( ', ', $groups ), count( $groups ) ) );
+ if ( $groups ) {
+ global $wgLang;
+ $return = array(
+ 'badaccess-groups',
+ $wgLang->commaList( $groups ),
+ count( $groups )
+ );
} else {
- $return = array( "badaccess-group0" );
+ $return = array( 'badaccess-group0' );
}
$errors[] = $return;
}
- # Short-circuit point
- if( $short && count($errors) > 0 ) {
- wfProfileOut( __METHOD__ );
- return $errors;
+ return $errors;
+ }
+
+ /**
+ * Add the resulting error code to the errors array
+ *
+ * @param $errors Array list of current errors
+ * @param $result Mixed result of errors
+ *
+ * @return Array list of errors
+ */
+ private function resultToError( $errors, $result ) {
+ if ( is_array( $result ) && count( $result ) && !is_array( $result[0] ) ) {
+ // A single array representing an error
+ $errors[] = $result;
+ } else if ( is_array( $result ) && is_array( $result[0] ) ) {
+ // A nested array representing multiple errors
+ $errors = array_merge( $errors, $result );
+ } else if ( $result !== '' && is_string( $result ) ) {
+ // A string representing a message-id
+ $errors[] = array( $result );
+ } else if ( $result === false ) {
+ // a generic "We don't want them to do that"
+ $errors[] = array( 'badaccess-group0' );
}
+ return $errors;
+ }
+ /**
+ * Check various permission hooks
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkPermissionHooks( $action, $user, $errors, $doExpensiveQueries, $short ) {
// Use getUserPermissionsErrors instead
- if( !wfRunHooks( 'userCan', array( &$this, &$user, $action, &$result ) ) ) {
- wfProfileOut( __METHOD__ );
+ $result = '';
+ if ( !wfRunHooks( 'userCan', array( &$this, &$user, $action, &$result ) ) ) {
return $result ? array() : array( array( 'badaccess-group0' ) );
}
// Check getUserPermissionsErrors hook
- if( !wfRunHooks( 'getUserPermissionsErrors', array(&$this,&$user,$action,&$result) ) ) {
- if( is_array($result) && count($result) && !is_array($result[0]) )
- $errors[] = $result; # A single array representing an error
- else if( is_array($result) && is_array($result[0]) )
- $errors = array_merge( $errors, $result ); # A nested array representing multiple errors
- else if( $result !== '' && is_string($result) )
- $errors[] = array($result); # A string representing a message-id
- else if( $result === false )
- $errors[] = array('badaccess-group0'); # a generic "We don't want them to do that"
- }
- # Short-circuit point
- if( $short && count($errors) > 0 ) {
- wfProfileOut( __METHOD__ );
- return $errors;
+ if ( !wfRunHooks( 'getUserPermissionsErrors', array( &$this, &$user, $action, &$result ) ) ) {
+ $errors = $this->resultToError( $errors, $result );
}
// Check getUserPermissionsErrorsExpensive hook
- if( $doExpensiveQueries && !wfRunHooks( 'getUserPermissionsErrorsExpensive', array(&$this,&$user,$action,&$result) ) ) {
- if( is_array($result) && count($result) && !is_array($result[0]) )
- $errors[] = $result; # A single array representing an error
- else if( is_array($result) && is_array($result[0]) )
- $errors = array_merge( $errors, $result ); # A nested array representing multiple errors
- else if( $result !== '' && is_string($result) )
- $errors[] = array($result); # A string representing a message-id
- else if( $result === false )
- $errors[] = array('badaccess-group0'); # a generic "We don't want them to do that"
- }
- # Short-circuit point
- if( $short && count($errors) > 0 ) {
- wfProfileOut( __METHOD__ );
- return $errors;
+ if ( $doExpensiveQueries && !( $short && count( $errors ) > 0 ) &&
+ !wfRunHooks( 'getUserPermissionsErrorsExpensive', array( &$this, &$user, $action, &$result ) ) ) {
+ $errors = $this->resultToError( $errors, $result );
}
+ return $errors;
+ }
+
+ /**
+ * Check permissions on special pages & namespaces
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
# Only 'createaccount' and 'execute' can be performed on
# special pages, which don't actually exist in the DB.
$specialOKActions = array( 'createaccount', 'execute' );
- if( NS_SPECIAL == $this->mNamespace && !in_array( $action, $specialOKActions) ) {
- $errors[] = array('ns-specialprotected');
+ if ( NS_SPECIAL == $this->mNamespace && !in_array( $action, $specialOKActions ) ) {
+ $errors[] = array( 'ns-specialprotected' );
}
# Check $wgNamespaceProtection for restricted namespaces
- if( $this->isNamespaceProtected() ) {
- $ns = $this->getNamespace() == NS_MAIN ?
+ if ( $this->isNamespaceProtected() ) {
+ $ns = $this->mNamespace == NS_MAIN ?
wfMsg( 'nstab-main' ) : $this->getNsText();
- $errors[] = NS_MEDIAWIKI == $this->mNamespace ?
- array('protectedinterface') : array( 'namespaceprotected', $ns );
+ $errors[] = $this->mNamespace == NS_MEDIAWIKI ?
+ array( 'protectedinterface' ) : array( 'namespaceprotected', $ns );
}
+ return $errors;
+ }
+
+ /**
+ * Check CSS/JS sub-page permissions
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkCSSandJSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
# Protect css/js subpages of user pages
# XXX: this might be better using restrictions
# XXX: Find a way to work around the php bug that prevents using $this->userCanEditCssSubpage()
# and $this->userCanEditJsSubpage() from working
# XXX: right 'editusercssjs' is deprecated, for backward compatibility only
- if( $this->isCssSubpage() && !( $user->isAllowed('editusercssjs') || $user->isAllowed('editusercss') )
- && $action != 'patrol'
- && !preg_match('/^'.preg_quote($user->getName(), '/').'\//', $this->mTextform) )
- {
- $errors[] = array('customcssjsprotected');
- } else if( $this->isJsSubpage() && !( $user->isAllowed('editusercssjs') || $user->isAllowed('edituserjs') )
- && $action != 'patrol'
- && !preg_match('/^'.preg_quote($user->getName(), '/').'\//', $this->mTextform) )
- {
- $errors[] = array('customcssjsprotected');
+ if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' )
+ && !preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
+ if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
+ $errors[] = array( 'customcssjsprotected' );
+ } else if ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
+ $errors[] = array( 'customcssjsprotected' );
+ }
}
- # Check against page_restrictions table requirements on this
- # page. The user must possess all required rights for this action.
- foreach( $this->getRestrictions($action) as $right ) {
+ return $errors;
+ }
+
+ /**
+ * Check against page_restrictions table requirements on this
+ * page. The user must possess all required rights for this
+ * action.
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkPageRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ foreach ( $this->getRestrictions( $action ) as $right ) {
// Backwards compatibility, rewrite sysop -> protect
- if( $right == 'sysop' ) {
+ if ( $right == 'sysop' ) {
$right = 'protect';
}
- if( $right != '' && !$user->isAllowed( $right ) ) {
+ if ( $right != '' && !$user->isAllowed( $right ) ) {
// Users with 'editprotected' permission can edit protected pages
- if( $action=='edit' && $user->isAllowed( 'editprotected' ) ) {
+ if ( $action == 'edit' && $user->isAllowed( 'editprotected' ) ) {
// Users with 'editprotected' permission cannot edit protected pages
// with cascading option turned on.
- if( $this->mCascadeRestriction ) {
+ if ( $this->mCascadeRestriction ) {
$errors[] = array( 'protectedpagetext', $right );
}
} else {
@@ -1329,74 +1423,200 @@ class Title {
}
}
}
- # Short-circuit point
- if( $short && count($errors) > 0 ) {
- wfProfileOut( __METHOD__ );
- return $errors;
- }
- if( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
- # We /could/ use the protection level on the source page, but it's fairly ugly
- # as we have to establish a precedence hierarchy for pages included by multiple
- # cascade-protected pages. So just restrict it to people with 'protect' permission,
- # as they could remove the protection anyway.
+ return $errors;
+ }
+
+ /**
+ * Check restrictions on cascading pages.
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkCascadingSourcesRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ if ( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
+ # We /could/ use the protection level on the source page, but it's
+ # fairly ugly as we have to establish a precedence hierarchy for pages
+ # included by multiple cascade-protected pages. So just restrict
+ # it to people with 'protect' permission, as they could remove the
+ # protection anyway.
list( $cascadingSources, $restrictions ) = $this->getCascadeProtectionSources();
# Cascading protection depends on more than this page...
# Several cascading protected pages may include this page...
# Check each cascading level
# This is only for protection restrictions, not for all actions
- if( $cascadingSources > 0 && isset($restrictions[$action]) ) {
- foreach( $restrictions[$action] as $right ) {
+ if ( isset( $restrictions[$action] ) ) {
+ foreach ( $restrictions[$action] as $right ) {
$right = ( $right == 'sysop' ) ? 'protect' : $right;
- if( $right != '' && !$user->isAllowed( $right ) ) {
+ if ( $right != '' && !$user->isAllowed( $right ) ) {
$pages = '';
- foreach( $cascadingSources as $page )
+ foreach ( $cascadingSources as $page )
$pages .= '* [[:' . $page->getPrefixedText() . "]]\n";
$errors[] = array( 'cascadeprotected', count( $cascadingSources ), $pages );
}
}
}
}
- # Short-circuit point
- if( $short && count($errors) > 0 ) {
- wfProfileOut( __METHOD__ );
- return $errors;
- }
- if( $action == 'protect' ) {
- if( $this->getUserPermissionsErrors('edit', $user) != array() ) {
- $errors[] = array( 'protect-cantedit' ); // If they can't edit, they shouldn't protect.
- }
- }
+ return $errors;
+ }
- if( $action == 'create' ) {
+ /**
+ * Check action permissions not already checked in checkQuickPermissions
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkActionPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ if ( $action == 'protect' ) {
+ if ( $this->getUserPermissionsErrors( 'edit', $user ) != array() ) {
+ // If they can't edit, they shouldn't protect.
+ $errors[] = array( 'protect-cantedit' );
+ }
+ } elseif ( $action == 'create' ) {
$title_protection = $this->getTitleProtection();
- if( is_array($title_protection) ) {
- extract($title_protection); // is this extract() really needed?
-
- if( $pt_create_perm == 'sysop' ) {
- $pt_create_perm = 'protect'; // B/C
+ if( $title_protection ) {
+ if( $title_protection['pt_create_perm'] == 'sysop' ) {
+ $title_protection['pt_create_perm'] = 'protect'; // B/C
}
- if( $pt_create_perm == '' || !$user->isAllowed($pt_create_perm) ) {
- $errors[] = array( 'titleprotected', User::whoIs($pt_user), $pt_reason );
+ if( $title_protection['pt_create_perm'] == '' || !$user->isAllowed( $title_protection['pt_create_perm'] ) ) {
+ $errors[] = array( 'titleprotected', User::whoIs( $title_protection['pt_user'] ), $title_protection['pt_reason'] );
}
}
- } elseif( $action == 'move' ) {
+ } elseif ( $action == 'move' ) {
// Check for immobile pages
- if( !MWNamespace::isMovable( $this->getNamespace() ) ) {
+ if ( !MWNamespace::isMovable( $this->mNamespace ) ) {
// Specific message for this case
$errors[] = array( 'immobile-source-namespace', $this->getNsText() );
- } elseif( !$this->isMovable() ) {
+ } elseif ( !$this->isMovable() ) {
// Less specific message for rarer cases
$errors[] = array( 'immobile-page' );
}
- } elseif( $action == 'move-target' ) {
- if( !MWNamespace::isMovable( $this->getNamespace() ) ) {
+ } elseif ( $action == 'move-target' ) {
+ if ( !MWNamespace::isMovable( $this->mNamespace ) ) {
$errors[] = array( 'immobile-target-namespace', $this->getNsText() );
- } elseif( !$this->isMovable() ) {
+ } elseif ( !$this->isMovable() ) {
$errors[] = array( 'immobile-target-page' );
}
}
+ return $errors;
+ }
+
+ /**
+ * Check that the user isn't blocked from editting.
+ *
+ * @param $action String the action to check
+ * @param $user User user to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ if( $short && count( $errors ) > 0 ) {
+ return $errors;
+ }
+
+ global $wgContLang, $wgLang, $wgEmailConfirmToEdit;
+
+ if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount' ) {
+ $errors[] = array( 'confirmedittext' );
+ }
+
+ // Edit blocks should not affect reading. Account creation blocks handled at userlogin.
+ if ( $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this ) ) {
+ $block = $user->mBlock;
+
+ // This is from OutputPage::blockedPage
+ // Copied at r23888 by werdna
+
+ $id = $user->blockedBy();
+ $reason = $user->blockedFor();
+ if ( $reason == '' ) {
+ $reason = wfMsg( 'blockednoreason' );
+ }
+ $ip = wfGetIP();
+
+ if ( is_numeric( $id ) ) {
+ $name = User::whoIs( $id );
+ } else {
+ $name = $id;
+ }
+
+ $link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
+ $blockid = $block->mId;
+ $blockExpiry = $user->mBlock->mExpiry;
+ $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $user->mBlock->mTimestamp ), true );
+ if ( $blockExpiry == 'infinity' ) {
+ // Entry in database (table ipblocks) is 'infinity' but 'ipboptions' uses 'infinite' or 'indefinite'
+ $scBlockExpiryOptions = wfMsg( 'ipboptions' );
+
+ foreach ( explode( ',', $scBlockExpiryOptions ) as $option ) {
+ if ( !strpos( $option, ':' ) )
+ continue;
+
+ list( $show, $value ) = explode( ':', $option );
+
+ if ( $value == 'infinite' || $value == 'indefinite' ) {
+ $blockExpiry = $show;
+ break;
+ }
+ }
+ } else {
+ $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
+ }
+
+ $intended = $user->mBlock->mAddress;
+
+ $errors[] = array( ( $block->mAuto ? 'autoblockedtext' : 'blockedtext' ), $link, $reason, $ip, $name,
+ $blockid, $blockExpiry, $intended, $blockTimestamp );
+ }
+
+ return $errors;
+ }
+
+ /**
+ * Can $user perform $action on this page? This is an internal function,
+ * which checks ONLY that previously checked by userCan (i.e. it leaves out
+ * checks on wfReadOnly() and blocks)
+ *
+ * @param $action \type{\string} action that permission needs to be checked for
+ * @param $user \type{User} user to check
+ * @param $doExpensiveQueries \type{\bool} Set this to false to avoid doing unnecessary queries.
+ * @param $short \type{\bool} Set this to true to stop after the first permission error.
+ * @return \type{\array} Array of arrays of the arguments to wfMsg to explain permissions problems.
+ */
+ protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
+ wfProfileIn( __METHOD__ );
+
+ $errors = array();
+ $checks = array(
+ 'checkQuickPermissions',
+ 'checkPermissionHooks',
+ 'checkSpecialsAndNSPermissions',
+ 'checkCSSandJSPermissions',
+ 'checkPageRestrictions',
+ 'checkCascadingSourcesRestrictions',
+ 'checkActionPermissions',
+ 'checkUserBlock'
+ );
+
+ while( count( $checks ) > 0 &&
+ !( $short && count( $errors ) > 0 ) ) {
+ $method = array_shift( $checks );
+ $errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
+ }
wfProfileOut( __METHOD__ );
return $errors;
@@ -1404,6 +1624,8 @@ class Title {
/**
* Is this title subject to title protection?
+ * Title protection is the one applied against creation of such title.
+ *
* @return \type{\mixed} An associative array representing any existent title
* protection, or false if there's none.
*/
@@ -1414,75 +1636,78 @@ class Title {
}
// Can't protect pages that exist.
- if ($this->exists()) {
+ if ( $this->exists() ) {
return false;
}
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'protected_titles', '*',
- array( 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ),
- __METHOD__ );
+ if ( !isset( $this->mTitleProtection ) ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'protected_titles', '*',
+ array( 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ),
+ __METHOD__ );
- if ($row = $dbr->fetchRow( $res )) {
- return $row;
- } else {
- return false;
+ // fetchRow returns false if there are no rows.
+ $this->mTitleProtection = $dbr->fetchRow( $res );
}
+ return $this->mTitleProtection;
}
/**
* Update the title protection status
+ *
* @param $create_perm \type{\string} Permission required for creation
* @param $reason \type{\string} Reason for protection
* @param $expiry \type{\string} Expiry timestamp
+ * @return boolean true
*/
public function updateTitleProtection( $create_perm, $reason, $expiry ) {
- global $wgUser,$wgContLang;
+ global $wgUser, $wgContLang;
- if ($create_perm == implode(',',$this->getRestrictions('create'))
- && $expiry == $this->mRestrictionsExpiry['create']) {
+ if ( $create_perm == implode( ',', $this->getRestrictions( 'create' ) )
+ && $expiry == $this->mRestrictionsExpiry['create'] ) {
// No change
return true;
}
- list ($namespace, $title) = array( $this->getNamespace(), $this->getDBkey() );
+ list ( $namespace, $title ) = array( $this->getNamespace(), $this->getDBkey() );
$dbw = wfGetDB( DB_MASTER );
- $encodedExpiry = Block::encodeExpiry($expiry, $dbw );
+ $encodedExpiry = Block::encodeExpiry( $expiry, $dbw );
$expiry_description = '';
if ( $encodedExpiry != 'infinity' ) {
- $expiry_description = ' (' . wfMsgForContent( 'protect-expiring',$wgContLang->timeanddate( $expiry ),
- $wgContLang->date( $expiry ) , $wgContLang->time( $expiry ) ).')';
- }
- else {
- $expiry_description .= ' (' . wfMsgForContent( 'protect-expiry-indefinite' ).')';
+ $expiry_description = ' (' . wfMsgForContent( 'protect-expiring', $wgContLang->timeanddate( $expiry ),
+ $wgContLang->date( $expiry ) , $wgContLang->time( $expiry ) ) . ')';
+ } else {
+ $expiry_description .= ' (' . wfMsgForContent( 'protect-expiry-indefinite' ) . ')';
}
# Update protection table
- if ($create_perm != '' ) {
- $dbw->replace( 'protected_titles', array(array('pt_namespace', 'pt_title')),
- array(
+ if ( $create_perm != '' ) {
+ $this->mTitleProtection = array(
'pt_namespace' => $namespace,
'pt_title' => $title,
'pt_create_perm' => $create_perm,
- 'pt_timestamp' => Block::encodeExpiry(wfTimestampNow(), $dbw),
+ 'pt_timestamp' => Block::encodeExpiry( wfTimestampNow(), $dbw ),
'pt_expiry' => $encodedExpiry,
'pt_user' => $wgUser->getId(),
'pt_reason' => $reason,
- ), __METHOD__
- );
+ );
+ $dbw->replace( 'protected_titles', array( array( 'pt_namespace', 'pt_title' ) ),
+ $this->mTitleProtection, __METHOD__ );
} else {
$dbw->delete( 'protected_titles', array( 'pt_namespace' => $namespace,
'pt_title' => $title ), __METHOD__ );
+ $this->mTitleProtection = false;
}
+
# Update the protection log
- if( $dbw->affectedRows() ) {
+ if ( $dbw->affectedRows() ) {
$log = new LogPage( 'protect' );
- if( $create_perm ) {
- $params = array("[create=$create_perm] $expiry_description",'');
+ if ( $create_perm ) {
+ $params = array( "[create=$create_perm] $expiry_description", '' );
$log->addEntry( ( isset( $this->mRestrictions['create'] ) && $this->mRestrictions['create'] ) ? 'modify' : 'protect', $this, trim( $reason ), $params );
} else {
$log->addEntry( 'unprotect', $this, $reason );
@@ -1498,9 +1723,12 @@ class Title {
public function deleteTitleProtection() {
$dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'protected_titles',
+ $dbw->delete(
+ 'protected_titles',
array( 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ),
- __METHOD__ );
+ __METHOD__
+ );
+ $this->mTitleProtection = false;
}
/**
@@ -1515,7 +1743,8 @@ class Title {
/**
* Can $wgUser read this page?
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
* @todo fold these checks into userCan()
*/
public function userCanRead() {
@@ -1524,21 +1753,21 @@ class Title {
static $useShortcut = null;
# Initialize the $useShortcut boolean, to determine if we can skip quite a bit of code below
- if( is_null( $useShortcut ) ) {
+ if ( is_null( $useShortcut ) ) {
global $wgRevokePermissions;
$useShortcut = true;
- if( empty( $wgGroupPermissions['*']['read'] ) ) {
+ if ( empty( $wgGroupPermissions['*']['read'] ) ) {
# Not a public wiki, so no shortcut
$useShortcut = false;
- } elseif( !empty( $wgRevokePermissions ) ) {
+ } elseif ( !empty( $wgRevokePermissions ) ) {
/*
* Iterate through each group with permissions being revoked (key not included since we don't care
* what the group name is), then check if the read permission is being revoked. If it is, then
* we don't use the shortcut below since the user might not be able to read, even though anon
* reading is allowed.
*/
- foreach( $wgRevokePermissions as $perms ) {
- if( !empty( $perms['read'] ) ) {
+ foreach ( $wgRevokePermissions as $perms ) {
+ if ( !empty( $perms['read'] ) ) {
# We might be removing the read right from the user, so no shortcut
$useShortcut = false;
break;
@@ -1554,10 +1783,11 @@ class Title {
}
# Shortcut for public wikis, allows skipping quite a bit of code
- if ( $useShortcut )
+ if ( $useShortcut ) {
return true;
+ }
- if( $wgUser->isAllowed( 'read' ) ) {
+ if ( $wgUser->isAllowed( 'read' ) ) {
return true;
} else {
global $wgWhitelistRead;
@@ -1566,14 +1796,14 @@ class Title {
* Always grant access to the login page.
* Even anons need to be able to log in.
*/
- if( $this->isSpecial( 'Userlogin' ) || $this->isSpecial( 'Resetpass' ) ) {
+ if ( $this->isSpecial( 'Userlogin' ) || $this->isSpecial( 'Resetpass' ) ) {
return true;
}
/**
* Bail out if there isn't whitelist
*/
- if( !is_array($wgWhitelistRead) ) {
+ if ( !is_array( $wgWhitelistRead ) ) {
return false;
}
@@ -1583,33 +1813,35 @@ class Title {
$name = $this->getPrefixedText();
$dbName = $this->getPrefixedDBKey();
// Check with and without underscores
- if( in_array($name,$wgWhitelistRead,true) || in_array($dbName,$wgWhitelistRead,true) )
+ if ( in_array( $name, $wgWhitelistRead, true ) || in_array( $dbName, $wgWhitelistRead, true ) )
return true;
/**
* Old settings might have the title prefixed with
* a colon for main-namespace pages
*/
- if( $this->getNamespace() == NS_MAIN ) {
- if( in_array( ':' . $name, $wgWhitelistRead ) )
+ if ( $this->getNamespace() == NS_MAIN ) {
+ if ( in_array( ':' . $name, $wgWhitelistRead ) ) {
return true;
+ }
}
/**
* If it's a special page, ditch the subpage bit
* and check again
*/
- if( $this->getNamespace() == NS_SPECIAL ) {
+ if ( $this->getNamespace() == NS_SPECIAL ) {
$name = $this->getDBkey();
- list( $name, /* $subpage */) = SpecialPage::resolveAliasWithSubpage( $name );
+ list( $name, /* $subpage */ ) = SpecialPage::resolveAliasWithSubpage( $name );
if ( $name === false ) {
# Invalid special page, but we show standard login required message
return false;
}
$pure = SpecialPage::getTitleFor( $name )->getPrefixedText();
- if( in_array( $pure, $wgWhitelistRead, true ) )
+ if ( in_array( $pure, $wgWhitelistRead, true ) ) {
return true;
+ }
}
}
@@ -1618,7 +1850,8 @@ class Title {
/**
* Is this a talk page of some sort?
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
*/
public function isTalkPage() {
return MWNamespace::isTalk( $this->getNamespace() );
@@ -1626,7 +1859,8 @@ class Title {
/**
* Is this a subpage?
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
*/
public function isSubpage() {
return MWNamespace::hasSubpages( $this->mNamespace )
@@ -1636,10 +1870,11 @@ class Title {
/**
* Does this have subpages? (Warning, usually requires an extra DB query.)
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
*/
public function hasSubpages() {
- if( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
+ if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
# Duh
return false;
}
@@ -1648,32 +1883,36 @@ class Title {
# alone to cache the result. There's no point in having it hanging
# around uninitialized in every Title object; therefore we only add it
# if needed and don't declare it statically.
- if( isset( $this->mHasSubpages ) ) {
+ if ( isset( $this->mHasSubpages ) ) {
return $this->mHasSubpages;
}
$subpages = $this->getSubpages( 1 );
- if( $subpages instanceof TitleArray )
+ if ( $subpages instanceof TitleArray ) {
return $this->mHasSubpages = (bool)$subpages->count();
+ }
return $this->mHasSubpages = false;
}
/**
* Get all subpages of this page.
+ *
* @param $limit Maximum number of subpages to fetch; -1 for no limit
* @return mixed TitleArray, or empty array if this page's namespace
* doesn't allow subpages
*/
public function getSubpages( $limit = -1 ) {
- if( !MWNamespace::hasSubpages( $this->getNamespace() ) )
+ if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) {
return array();
+ }
$dbr = wfGetDB( DB_SLAVE );
$conds['page_namespace'] = $this->getNamespace();
$conds[] = 'page_title ' . $dbr->buildLike( $this->getDBkey() . '/', $dbr->anyString() );
$options = array();
- if( $limit > -1 )
+ if ( $limit > -1 ) {
$options['LIMIT'] = $limit;
+ }
return $this->mSubpages = TitleArray::newFromResult(
$dbr->select( 'page',
array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' ),
@@ -1688,7 +1927,7 @@ class Title {
* Could this page contain custom CSS or JavaScript, based
* on the title?
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function isCssOrJsPage() {
return $this->mNamespace == NS_MEDIAWIKI
@@ -1697,69 +1936,75 @@ class Title {
/**
* Is this a .css or .js subpage of a user page?
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function isCssJsSubpage() {
- return ( NS_USER == $this->mNamespace and preg_match("/\\/.*\\.(?:css|js)$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace and preg_match( "/\\/.*\\.(?:css|js)$/", $this->mTextform ) );
}
+
/**
* Is this a *valid* .css or .js subpage of a user page?
- * Check that the corresponding skin exists
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
+ * @deprecated
*/
public function isValidCssJsSubpage() {
- if ( $this->isCssJsSubpage() ) {
- $skinNames = Skin::getSkinNames();
- return array_key_exists( $this->getSkinFromCssJsSubpage(), $skinNames );
- } else {
- return false;
- }
+ return $this->isCssJsSubpage();
}
+
/**
* Trim down a .css or .js subpage title to get the corresponding skin name
+ *
+ * @return string containing skin name from .css or .js subpage title
*/
public function getSkinFromCssJsSubpage() {
$subpage = explode( '/', $this->mTextform );
$subpage = $subpage[ count( $subpage ) - 1 ];
return( str_replace( array( '.css', '.js' ), array( '', '' ), $subpage ) );
}
+
/**
* Is this a .css subpage of a user page?
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
*/
public function isCssSubpage() {
- return ( NS_USER == $this->mNamespace && preg_match("/\\/.*\\.css$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.css$/", $this->mTextform ) );
}
+
/**
* Is this a .js subpage of a user page?
- * @return \type{\bool} TRUE or FALSE
+ *
+ * @return \type{\bool}
*/
public function isJsSubpage() {
- return ( NS_USER == $this->mNamespace && preg_match("/\\/.*\\.js$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.js$/", $this->mTextform ) );
}
+
/**
* Protect css subpages of user pages: can $wgUser edit
* this page?
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
* @todo XXX: this might be better using restrictions
*/
public function userCanEditCssSubpage() {
global $wgUser;
- return ( ( $wgUser->isAllowed('editusercssjs') && $wgUser->isAllowed('editusercss') )
- || preg_match('/^'.preg_quote($wgUser->getName(), '/').'\//', $this->mTextform) );
+ return ( ( $wgUser->isAllowed( 'editusercssjs' ) && $wgUser->isAllowed( 'editusercss' ) )
+ || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
}
+
/**
* Protect js subpages of user pages: can $wgUser edit
* this page?
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
* @todo XXX: this might be better using restrictions
*/
public function userCanEditJsSubpage() {
global $wgUser;
- return ( ( $wgUser->isAllowed('editusercssjs') && $wgUser->isAllowed('edituserjs') )
- || preg_match('/^'.preg_quote($wgUser->getName(), '/').'\//', $this->mTextform) );
+ return ( ( $wgUser->isAllowed( 'editusercssjs' ) && $wgUser->isAllowed( 'edituserjs' ) )
+ || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
}
/**
@@ -1775,17 +2020,20 @@ class Title {
/**
* Cascading protection: Get the source of any cascading restrictions on this page.
*
- * @param $get_pages \type{\bool} Whether or not to retrieve the actual pages that the restrictions have come from.
- * @return \type{\arrayof{mixed title array, restriction array}} Array of the Title objects of the pages from
- * which cascading restrictions have come, false for none, or true if such restrictions exist, but $get_pages was not set.
- * The restriction array is an array of each type, each of which contains an array of unique groups.
- */
- public function getCascadeProtectionSources( $get_pages = true ) {
+ * @param $getPages \type{\bool} Whether or not to retrieve the actual pages
+ * that the restrictions have come from.
+ * @return \type{\arrayof{mixed title array, restriction array}} Array of the Title
+ * objects of the pages from which cascading restrictions have come,
+ * false for none, or true if such restrictions exist, but $getPages was not set.
+ * The restriction array is an array of each type, each of which contains a
+ * array of unique groups.
+ */
+ public function getCascadeProtectionSources( $getPages = true ) {
$pagerestrictions = array();
- if ( isset( $this->mCascadeSources ) && $get_pages ) {
+ if ( isset( $this->mCascadeSources ) && $getPages ) {
return array( $this->mCascadeSources, $this->mCascadingRestrictions );
- } else if ( isset( $this->mHasCascadingRestrictions ) && !$get_pages ) {
+ } else if ( isset( $this->mHasCascadingRestrictions ) && !$getPages ) {
return array( $this->mHasCascadingRestrictions, $pagerestrictions );
}
@@ -1794,22 +2042,25 @@ class Title {
$dbr = wfGetDB( DB_SLAVE );
if ( $this->getNamespace() == NS_FILE ) {
- $tables = array ('imagelinks', 'page_restrictions');
+ $tables = array( 'imagelinks', 'page_restrictions' );
$where_clauses = array(
'il_to' => $this->getDBkey(),
'il_from=pr_page',
- 'pr_cascade' => 1 );
+ 'pr_cascade' => 1
+ );
} else {
- $tables = array ('templatelinks', 'page_restrictions');
+ $tables = array( 'templatelinks', 'page_restrictions' );
$where_clauses = array(
'tl_namespace' => $this->getNamespace(),
'tl_title' => $this->getDBkey(),
'tl_from=pr_page',
- 'pr_cascade' => 1 );
+ 'pr_cascade' => 1
+ );
}
- if ( $get_pages ) {
- $cols = array('pr_page', 'page_namespace', 'page_title', 'pr_expiry', 'pr_type', 'pr_level' );
+ if ( $getPages ) {
+ $cols = array( 'pr_page', 'page_namespace', 'page_title',
+ 'pr_expiry', 'pr_type', 'pr_level' );
$where_clauses[] = 'page_id=pr_page';
$tables[] = 'page';
} else {
@@ -1818,18 +2069,18 @@ class Title {
$res = $dbr->select( $tables, $cols, $where_clauses, __METHOD__ );
- $sources = $get_pages ? array() : false;
+ $sources = $getPages ? array() : false;
$now = wfTimestampNow();
$purgeExpired = false;
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$expiry = Block::decodeExpiry( $row->pr_expiry );
- if( $expiry > $now ) {
- if ($get_pages) {
+ if ( $expiry > $now ) {
+ if ( $getPages ) {
$page_id = $row->pr_page;
$page_ns = $row->page_namespace;
$page_title = $row->page_title;
- $sources[$page_id] = Title::makeTitle($page_ns, $page_title);
+ $sources[$page_id] = Title::makeTitle( $page_ns, $page_title );
# Add groups needed for each restriction type if its not already there
# Make sure this restriction type still exists
@@ -1837,9 +2088,9 @@ class Title {
$pagerestrictions[$row->pr_type] = array();
}
- if ( isset($pagerestrictions[$row->pr_type]) &&
- !in_array($row->pr_level, $pagerestrictions[$row->pr_type]) ) {
- $pagerestrictions[$row->pr_type][]=$row->pr_level;
+ if ( isset( $pagerestrictions[$row->pr_type] ) &&
+ !in_array( $row->pr_level, $pagerestrictions[$row->pr_type] ) ) {
+ $pagerestrictions[$row->pr_type][] = $row->pr_level;
}
} else {
$sources = true;
@@ -1849,23 +2100,28 @@ class Title {
$purgeExpired = true;
}
}
- if( $purgeExpired ) {
+ if ( $purgeExpired ) {
Title::purgeExpiredRestrictions();
}
- wfProfileOut( __METHOD__ );
-
- if ( $get_pages ) {
+ if ( $getPages ) {
$this->mCascadeSources = $sources;
$this->mCascadingRestrictions = $pagerestrictions;
} else {
$this->mHasCascadingRestrictions = $sources;
}
+
+ wfProfileOut( __METHOD__ );
return array( $sources, $pagerestrictions );
}
+ /**
+ * Returns cascading restrictions for the current article
+ *
+ * @return Boolean
+ */
function areRestrictionsCascading() {
- if (!$this->mRestrictionsLoaded) {
+ if ( !$this->mRestrictionsLoaded ) {
$this->loadRestrictions();
}
@@ -1874,27 +2130,38 @@ class Title {
/**
* Loads a string into mRestrictions array
+ *
* @param $res \type{Resource} restrictions as an SQL result.
+ * @param $oldFashionedRestrictions string comma-separated list of page
+ * restrictions from page table (pre 1.10)
*/
private function loadRestrictionsFromResultWrapper( $res, $oldFashionedRestrictions = null ) {
$rows = array();
- $dbr = wfGetDB( DB_SLAVE );
- while( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$rows[] = $row;
}
$this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions );
}
+ /**
+ * Compiles list of active page restrictions from both page table (pre 1.10)
+ * and page_restrictions table for this existing page.
+ * Public for usage by LiquidThreads.
+ *
+ * @param $rows array of db result objects
+ * @param $oldFashionedRestrictions string comma-separated list of page
+ * restrictions from page table (pre 1.10)
+ */
public function loadRestrictionsFromRows( $rows, $oldFashionedRestrictions = null ) {
$dbr = wfGetDB( DB_SLAVE );
$restrictionTypes = $this->getRestrictionTypes();
- foreach( $restrictionTypes as $type ){
+ foreach ( $restrictionTypes as $type ) {
$this->mRestrictions[$type] = array();
- $this->mRestrictionsExpiry[$type] = Block::decodeExpiry('');
+ $this->mRestrictionsExpiry[$type] = Block::decodeExpiry( '' );
}
$this->mCascadeRestriction = false;
@@ -1906,11 +2173,11 @@ class Title {
array( 'page_id' => $this->getArticleId() ), __METHOD__ );
}
- if ($oldFashionedRestrictions != '') {
+ if ( $oldFashionedRestrictions != '' ) {
- foreach( explode( ':', trim( $oldFashionedRestrictions ) ) as $restrict ) {
+ foreach ( explode( ':', trim( $oldFashionedRestrictions ) ) as $restrict ) {
$temp = explode( '=', trim( $restrict ) );
- if(count($temp) == 1) {
+ if ( count( $temp ) == 1 ) {
// old old format should be treated as edit/move restriction
$this->mRestrictions['edit'] = explode( ',', trim( $temp[0] ) );
$this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) );
@@ -1923,17 +2190,17 @@ class Title {
}
- if( count($rows) ) {
+ if ( count( $rows ) ) {
# Current system - load second to make them override.
$now = wfTimestampNow();
$purgeExpired = false;
- foreach( $rows as $row ) {
+ foreach ( $rows as $row ) {
# Cycle through all the restrictions.
// Don't take care of restrictions types that aren't allowed
- if( !in_array( $row->pr_type, $restrictionTypes ) )
+ if ( !in_array( $row->pr_type, $restrictionTypes ) )
continue;
// This code should be refactored, now that it's being used more generally,
@@ -1952,7 +2219,7 @@ class Title {
}
}
- if( $purgeExpired ) {
+ if ( $purgeExpired ) {
Title::purgeExpiredRestrictions();
}
}
@@ -1962,34 +2229,36 @@ class Title {
/**
* Load restrictions from the page_restrictions table
+ *
+ * @param $oldFashionedRestrictions string comma-separated list of page
+ * restrictions from page table (pre 1.10)
*/
public function loadRestrictions( $oldFashionedRestrictions = null ) {
- if( !$this->mRestrictionsLoaded ) {
- if ($this->exists()) {
+ if ( !$this->mRestrictionsLoaded ) {
+ if ( $this->exists() ) {
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'page_restrictions', '*',
- array ( 'pr_page' => $this->getArticleId() ), __METHOD__ );
+ array( 'pr_page' => $this->getArticleId() ), __METHOD__ );
$this->loadRestrictionsFromResultWrapper( $res, $oldFashionedRestrictions );
} else {
$title_protection = $this->getTitleProtection();
- if (is_array($title_protection)) {
- extract($title_protection);
-
+ if ( $title_protection ) {
$now = wfTimestampNow();
- $expiry = Block::decodeExpiry($pt_expiry);
+ $expiry = Block::decodeExpiry( $title_protection['pt_expiry'] );
- if (!$expiry || $expiry > $now) {
+ if ( !$expiry || $expiry > $now ) {
// Apply the restrictions
$this->mRestrictionsExpiry['create'] = $expiry;
- $this->mRestrictions['create'] = explode(',', trim($pt_create_perm) );
+ $this->mRestrictions['create'] = explode( ',', trim( $title_protection['pt_create_perm'] ) );
} else { // Get rid of the old restrictions
Title::purgeExpiredRestrictions();
+ $this->mTitleProtection = false;
}
} else {
- $this->mRestrictionsExpiry['create'] = Block::decodeExpiry('');
+ $this->mRestrictionsExpiry['create'] = Block::decodeExpiry( '' );
}
$this->mRestrictionsLoaded = true;
}
@@ -2001,13 +2270,17 @@ class Title {
*/
static function purgeExpiredRestrictions() {
$dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'page_restrictions',
+ $dbw->delete(
+ 'page_restrictions',
array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
- __METHOD__ );
+ __METHOD__
+ );
- $dbw->delete( 'protected_titles',
+ $dbw->delete(
+ 'protected_titles',
array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
- __METHOD__ );
+ __METHOD__
+ );
}
/**
@@ -2017,7 +2290,7 @@ class Title {
* @return \type{\arrayof{\string}} the array of groups allowed to edit this article
*/
public function getRestrictions( $action ) {
- if( !$this->mRestrictionsLoaded ) {
+ if ( !$this->mRestrictionsLoaded ) {
$this->loadRestrictions();
}
return isset( $this->mRestrictions[$action] )
@@ -2027,11 +2300,12 @@ class Title {
/**
* Get the expiry time for the restriction against a given action
+ *
* @return 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 ) {
+ if ( !$this->mRestrictionsLoaded ) {
$this->loadRestrictions();
}
return isset( $this->mRestrictionsExpiry[$action] ) ? $this->mRestrictionsExpiry[$action] : false;
@@ -2039,10 +2313,11 @@ class Title {
/**
* Is there a version of this page in the deletion archive?
+ *
* @return \type{\int} the number of archived revisions
*/
public function isDeleted() {
- if( $this->getNamespace() < 0 ) {
+ if ( $this->getNamespace() < 0 ) {
$n = 0;
} else {
$dbr = wfGetDB( DB_SLAVE );
@@ -2050,7 +2325,7 @@ class Title {
array( 'ar_namespace' => $this->getNamespace(), 'ar_title' => $this->getDBkey() ),
__METHOD__
);
- if( $this->getNamespace() == NS_FILE ) {
+ if ( $this->getNamespace() == NS_FILE ) {
$n += $dbr->selectField( 'filearchive', 'COUNT(*)',
array( 'fa_name' => $this->getDBkey() ),
__METHOD__
@@ -2062,10 +2337,11 @@ class Title {
/**
* Is there a version of this page in the deletion archive?
- * @return bool
+ *
+ * @return Boolean
*/
public function isDeletedQuick() {
- if( $this->getNamespace() < 0 ) {
+ if ( $this->getNamespace() < 0 ) {
return false;
}
$dbr = wfGetDB( DB_SLAVE );
@@ -2073,7 +2349,7 @@ class Title {
array( 'ar_namespace' => $this->getNamespace(), 'ar_title' => $this->getDBkey() ),
__METHOD__
);
- if( !$deleted && $this->getNamespace() == NS_FILE ) {
+ if ( !$deleted && $this->getNamespace() == NS_FILE ) {
$deleted = (bool)$dbr->selectField( 'filearchive', '1',
array( 'fa_name' => $this->getDBkey() ),
__METHOD__
@@ -2085,22 +2361,23 @@ class Title {
/**
* Get the article ID for this Title from the link cache,
* adding it if necessary
- * @param $flags \type{\int} a bit field; may be GAID_FOR_UPDATE to select
+ *
+ * @param $flags \type{\int} a bit field; may be Title::GAID_FOR_UPDATE to select
* for update
* @return \type{\int} the ID
*/
public function getArticleID( $flags = 0 ) {
- if( $this->getNamespace() < 0 ) {
+ if ( $this->getNamespace() < 0 ) {
return $this->mArticleID = 0;
}
$linkCache = LinkCache::singleton();
- if( $flags & GAID_FOR_UPDATE ) {
+ if ( $flags & self::GAID_FOR_UPDATE ) {
$oldUpdate = $linkCache->forUpdate( true );
$linkCache->clearLink( $this );
$this->mArticleID = $linkCache->addLinkObj( $this );
$linkCache->forUpdate( $oldUpdate );
} else {
- if( -1 == $this->mArticleID ) {
+ if ( -1 == $this->mArticleID ) {
$this->mArticleID = $linkCache->addLinkObj( $this );
}
}
@@ -2110,14 +2387,16 @@ class Title {
/**
* Is this an article that is a redirect page?
* Uses link cache, adding it if necessary
- * @param $flags \type{\int} a bit field; may be GAID_FOR_UPDATE to select for update
+ *
+ * @param $flags \type{\int} a bit field; may be Title::GAID_FOR_UPDATE to select for update
* @return \type{\bool}
*/
public function isRedirect( $flags = 0 ) {
- if( !is_null($this->mRedirect) )
+ if ( !is_null( $this->mRedirect ) ) {
return $this->mRedirect;
+ }
# Calling getArticleID() loads the field from cache as needed
- if( !$this->getArticleID($flags) ) {
+ if ( !$this->getArticleID( $flags ) ) {
return $this->mRedirect = false;
}
$linkCache = LinkCache::singleton();
@@ -2129,14 +2408,16 @@ class Title {
/**
* What is the length of this page?
* Uses link cache, adding it if necessary
- * @param $flags \type{\int} a bit field; may be GAID_FOR_UPDATE to select for update
+ *
+ * @param $flags \type{\int} a bit field; may be Title::GAID_FOR_UPDATE to select for update
* @return \type{\bool}
*/
public function getLength( $flags = 0 ) {
- if( $this->mLength != -1 )
+ if ( $this->mLength != -1 ) {
return $this->mLength;
+ }
# Calling getArticleID() loads the field from cache as needed
- if( !$this->getArticleID($flags) ) {
+ if ( !$this->getArticleID( $flags ) ) {
return $this->mLength = 0;
}
$linkCache = LinkCache::singleton();
@@ -2147,15 +2428,21 @@ class Title {
/**
* What is the page_latest field for this page?
- * @param $flags \type{\int} a bit field; may be GAID_FOR_UPDATE to select for update
- * @return \type{\int} or false if the page doesn't exist
+ *
+ * @param $flags \type{\int} a bit field; may be Title::GAID_FOR_UPDATE to select for update
+ * @return \type{\int} or 0 if the page doesn't exist
*/
public function getLatestRevID( $flags = 0 ) {
- if( $this->mLatestID !== false )
- return $this->mLatestID;
+ if ( $this->mLatestID !== false ) {
+ return intval( $this->mLatestID );
+ }
+ # Calling getArticleID() loads the field from cache as needed
+ if ( !$this->getArticleID( $flags ) ) {
+ return $this->mLatestID = 0;
+ }
+ $linkCache = LinkCache::singleton();
+ $this->mLatestID = intval( $linkCache->getGoodLinkFieldObj( $this, 'revision' ) );
- $db = ($flags & GAID_FOR_UPDATE) ? wfGetDB(DB_MASTER) : wfGetDB(DB_SLAVE);
- $this->mLatestID = $db->selectField( 'page', 'page_latest', $this->pageCond(), __METHOD__ );
return $this->mLatestID;
}
@@ -2173,22 +2460,30 @@ class Title {
$linkCache = LinkCache::singleton();
$linkCache->clearBadLink( $this->getPrefixedDBkey() );
- if ( $newid === false ) { $this->mArticleID = -1; }
- else { $this->mArticleID = intval( $newid ); }
+ if ( $newid === false ) {
+ $this->mArticleID = -1;
+ } else {
+ $this->mArticleID = intval( $newid );
+ }
$this->mRestrictionsLoaded = false;
$this->mRestrictions = array();
+ $this->mRedirect = null;
+ $this->mLength = -1;
+ $this->mLatestID = false;
}
/**
* Updates page_touched for this page; called from LinksUpdate.php
+ *
* @return \type{\bool} true if the update succeded
*/
public function invalidateCache() {
- if( wfReadOnly() ) {
+ if ( wfReadOnly() ) {
return;
}
$dbw = wfGetDB( DB_MASTER );
- $success = $dbw->update( 'page',
+ $success = $dbw->update(
+ 'page',
array( 'page_touched' => $dbw->timestamp() ),
$this->pageCond(),
__METHOD__
@@ -2216,12 +2511,16 @@ class Title {
return $p . $name;
}
- // Returns a simple regex that will match on characters and sequences invalid in titles.
- // Note that this doesn't pick up many things that could be wrong with titles, but that
- // replacing this regex with something valid will make many titles valid.
+ /**
+ * Returns a simple regex that will match on characters and sequences invalid in titles.
+ * Note that this doesn't pick up many things that could be wrong with titles, but that
+ * replacing this regex with something valid will make many titles valid.
+ *
+ * @return string regex string
+ */
static function getTitleInvalidRegex() {
static $rxTc = false;
- if( !$rxTc ) {
+ if ( !$rxTc ) {
# Matching titles will be held as illegal.
$rxTc = '/' .
# Any character not allowed is forbidden...
@@ -2240,15 +2539,20 @@ class Title {
}
/**
- * Capitalize a text if it belongs to a namespace that capitalizes
+ * Capitalize a text string for a title if it belongs to a namespace that capitalizes
+ *
+ * @param $text string containing title to capitalize
+ * @param $ns int namespace index, defaults to NS_MAIN
+ * @return String containing capitalized title
*/
public static function capitalize( $text, $ns = NS_MAIN ) {
global $wgContLang;
- if ( MWNamespace::isCapitalized( $ns ) )
+ if ( MWNamespace::isCapitalized( $ns ) ) {
return $wgContLang->ucfirst( $text );
- else
+ } else {
return $text;
+ }
}
/**
@@ -2259,6 +2563,7 @@ class Title {
* removes illegal characters, splits off the interwiki and
* namespace prefixes, sets the other forms, and canonicalizes
* everything.
+ *
* @return \type{\bool} true on success
*/
private function secureAndSplit() {
@@ -2289,7 +2594,7 @@ class Title {
return false;
}
- if( false !== strpos( $dbkey, UTF8_REPLACEMENT ) ) {
+ if ( false !== strpos( $dbkey, UTF8_REPLACEMENT ) ) {
# Contained illegal UTF-8 sequences or forbidden Unicode chars.
return false;
}
@@ -2298,7 +2603,7 @@ class Title {
# Initial colon indicates main namespace rather than specified default
# but should not create invalid {ns,title} pairs such as {0,Project:Foo}
- if ( ':' == $dbkey{0} ) {
+ if ( ':' == $dbkey { 0 } ) {
$this->mNamespace = NS_MAIN;
$dbkey = substr( $dbkey, 1 ); # remove the colon but continue processing
$dbkey = trim( $dbkey, '_' ); # remove any subsequent whitespace
@@ -2311,19 +2616,20 @@ class Title {
$m = array();
if ( preg_match( $prefixRegexp, $dbkey, $m ) ) {
$p = $m[1];
- if ( $ns = $wgContLang->getNsIndex( $p ) ) {
+ if ( ( $ns = $wgContLang->getNsIndex( $p ) ) !== false ) {
# Ordinary namespace
$dbkey = $m[2];
$this->mNamespace = $ns;
# For Talk:X pages, check if X has a "namespace" prefix
- if( $ns == NS_TALK && preg_match( $prefixRegexp, $dbkey, $x ) ) {
- if( $wgContLang->getNsIndex( $x[1] ) )
+ if ( $ns == NS_TALK && preg_match( $prefixRegexp, $dbkey, $x ) ) {
+ if ( $wgContLang->getNsIndex( $x[1] ) ) {
return false; # Disallow Talk:File:x type titles...
- else if( Interwiki::isValidInterwiki( $x[1] ) )
+ } else if ( Interwiki::isValidInterwiki( $x[1] ) ) {
return false; # Disallow Talk:Interwiki:x type titles...
+ }
}
- } elseif( Interwiki::isValidInterwiki( $p ) ) {
- if( !$firstPass ) {
+ } elseif ( Interwiki::isValidInterwiki( $p ) ) {
+ if ( !$firstPass ) {
# Can't make a local interwiki link to an interwiki link.
# That's just crazy!
return false;
@@ -2334,8 +2640,10 @@ class Title {
$this->mInterwiki = $wgContLang->lc( $p );
# Redundant interwiki prefix to the local wiki
- if ( 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki ) ) {
- if( $dbkey == '' ) {
+ if ( $wgLocalInterwiki !== false
+ && 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki ) )
+ {
+ if ( $dbkey == '' ) {
# Can't have an empty self-link
return false;
}
@@ -2356,7 +2664,7 @@ class Title {
# then let the colon expression be part of the title.
}
break;
- } while( true );
+ } while ( true );
# We already know that some pages won't be in the database!
#
@@ -2365,7 +2673,7 @@ class Title {
}
$fragment = strstr( $dbkey, '#' );
if ( false !== $fragment ) {
- $this->setFragment( $fragment );
+ $this->setFragment( preg_replace( '/^#_*/', '#', $fragment ) );
$dbkey = substr( $dbkey, 0, strlen( $dbkey ) - strlen( $fragment ) );
# remove whitespace again: prevents "Foo_bar_#"
# becoming "Foo_bar_"
@@ -2374,7 +2682,7 @@ class Title {
# Reject illegal characters.
#
- if( preg_match( $rxTc, $dbkey ) ) {
+ if ( preg_match( $rxTc, $dbkey ) ) {
return false;
}
@@ -2398,7 +2706,7 @@ class Title {
/**
* Magic tilde sequences? Nu-uh!
*/
- if( strpos( $dbkey, '~~~' ) !== false ) {
+ if ( strpos( $dbkey, '~~~' ) !== false ) {
return false;
}
@@ -2424,7 +2732,7 @@ class Title {
* site might be case-sensitive.
*/
$this->mUserCaseDBKey = $dbkey;
- if( $this->mInterwiki == '') {
+ if ( $this->mInterwiki == '' ) {
$dbkey = self::capitalize( $dbkey, $this->mNamespace );
}
@@ -2433,7 +2741,7 @@ class Title {
* "empty" local links can only be self-links
* with a fragment identifier.
*/
- if( $dbkey == '' &&
+ if ( $dbkey == '' &&
$this->mInterwiki == '' &&
$this->mNamespace != NS_MAIN ) {
return false;
@@ -2444,10 +2752,10 @@ class Title {
// there are numerous ways to present the same IP. Having sp:contribs scan
// them all is silly and having some show the edits and others not is
// inconsistent. Same for talk/userpages. Keep them normalized instead.
- $dbkey = ($this->mNamespace == NS_USER || $this->mNamespace == NS_USER_TALK) ?
+ $dbkey = ( $this->mNamespace == NS_USER || $this->mNamespace == NS_USER_TALK ) ?
IP::sanitizeIP( $dbkey ) : $dbkey;
// Any remaining initial :s are illegal.
- if ( $dbkey !== '' && ':' == $dbkey{0} ) {
+ if ( $dbkey !== '' && ':' == $dbkey { 0 } ) {
return false;
}
@@ -2476,7 +2784,8 @@ class Title {
/**
* Get a Title object associated with the talk page of this article
- * @return \type{Title} the object for the talk page
+ *
+ * @return Title the object for the talk page
*/
public function getTalkPage() {
return Title::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() );
@@ -2486,12 +2795,12 @@ class Title {
* Get a title object associated with the subject page of this
* talk page
*
- * @return \type{Title} the object for the subject page
+ * @return Title the object for the subject page
*/
public function getSubjectPage() {
// Is this the same title?
$subjectNS = MWNamespace::getSubject( $this->getNamespace() );
- if( $this->getNamespace() == $subjectNS ) {
+ if ( $this->getNamespace() == $subjectNS ) {
return $this;
}
return Title::makeTitle( $subjectNS, $this->getDBkey() );
@@ -2504,7 +2813,9 @@ class Title {
* WARNING: do not use this function on arbitrary user-supplied titles!
* On heavily-used templates it will max out the memory.
*
- * @param array $options may be FOR UPDATE
+ * @param $options Array: may be FOR UPDATE
+ * @param $table String: table name
+ * @param $prefix String: fields prefix
* @return \type{\arrayof{Title}} the Title objects linking here
*/
public function getLinksTo( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
@@ -2516,25 +2827,27 @@ class Title {
$db = wfGetDB( DB_SLAVE );
}
- $res = $db->select( array( 'page', $table ),
- array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect' ),
+ $res = $db->select(
+ array( 'page', $table ),
+ array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
array(
"{$prefix}_from=page_id",
"{$prefix}_namespace" => $this->getNamespace(),
"{$prefix}_title" => $this->getDBkey() ),
__METHOD__,
- $options );
+ $options
+ );
$retVal = array();
if ( $db->numRows( $res ) ) {
- foreach( $res as $row ) {
- if ( $titleObj = Title::makeTitle( $row->page_namespace, $row->page_title ) ) {
- $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect );
+ foreach ( $res as $row ) {
+ $titleObj = Title::makeTitle( $row->page_namespace, $row->page_title );
+ if ( $titleObj ) {
+ $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect, $row->page_latest );
$retVal[] = $titleObj;
}
}
}
- $db->freeResult( $res );
return $retVal;
}
@@ -2545,7 +2858,7 @@ class Title {
* WARNING: do not use this function on arbitrary user-supplied titles!
* On heavily-used templates it will max out the memory.
*
- * @param array $options may be FOR UPDATE
+ * @param $options Array: may be FOR UPDATE
* @return \type{\arrayof{Title}} the Title objects linking here
*/
public function getTemplateLinksTo( $options = array() ) {
@@ -2582,7 +2895,7 @@ class Title {
);
$retVal = array();
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$retVal[] = Title::makeTitle( $row->pl_namespace, $row->pl_title );
}
return $retVal;
@@ -2604,7 +2917,7 @@ class Title {
);
// purge variant urls as well
- if($wgContLang->hasVariants()){
+ if ( $wgContLang->hasVariants() ) {
$variants = $wgContLang->getVariants();
foreach ( $variants as $vCode ) {
$urls[] = $this->getInternalURL( '', $vCode );
@@ -2628,7 +2941,9 @@ class Title {
/**
* Move this page without authentication
- * @param &$nt \type{Title} the new page Title
+ *
+ * @param $nt \type{Title} the new page Title
+ * @return \type{\mixed} true on success, getUserPermissionsErrors()-like array on failure
*/
public function moveNoAuth( &$nt ) {
return $this->moveTo( $nt, false );
@@ -2637,7 +2952,8 @@ class Title {
/**
* Check whether a given move operation would be valid.
* Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
- * @param &$nt \type{Title} the new title
+ *
+ * @param $nt \type{Title} the new title
* @param $auth \type{\bool} indicates whether $wgUser's permissions
* should be checked
* @param $reason \type{\string} is the log summary of the move, used for spam checking
@@ -2647,74 +2963,77 @@ class Title {
global $wgUser;
$errors = array();
- if( !$nt ) {
+ if ( !$nt ) {
// Normally we'd add this to $errors, but we'll get
// lots of syntax errors if $nt is not an object
- return array(array('badtitletext'));
+ return array( array( 'badtitletext' ) );
}
- if( $this->equals( $nt ) ) {
- $errors[] = array('selfmove');
+ if ( $this->equals( $nt ) ) {
+ $errors[] = array( 'selfmove' );
}
- if( !$this->isMovable() ) {
+ if ( !$this->isMovable() ) {
$errors[] = array( 'immobile-source-namespace', $this->getNsText() );
}
if ( $nt->getInterwiki() != '' ) {
$errors[] = array( 'immobile-target-namespace-iw' );
}
if ( !$nt->isMovable() ) {
- $errors[] = array('immobile-target-namespace', $nt->getNsText() );
+ $errors[] = array( 'immobile-target-namespace', $nt->getNsText() );
}
$oldid = $this->getArticleID();
$newid = $nt->getArticleID();
if ( strlen( $nt->getDBkey() ) < 1 ) {
- $errors[] = array('articleexists');
+ $errors[] = array( 'articleexists' );
}
if ( ( $this->getDBkey() == '' ) ||
( !$oldid ) ||
( $nt->getDBkey() == '' ) ) {
- $errors[] = array('badarticleerror');
+ $errors[] = array( 'badarticleerror' );
}
// Image-specific checks
- if( $this->getNamespace() == NS_FILE ) {
+ if ( $this->getNamespace() == NS_FILE ) {
+ if ( $nt->getNamespace() != NS_FILE ) {
+ $errors[] = array( 'imagenocrossnamespace' );
+ }
$file = wfLocalFile( $this );
- if( $file->exists() ) {
- if( $nt->getNamespace() != NS_FILE ) {
- $errors[] = array('imagenocrossnamespace');
+ if ( $file->exists() ) {
+ if ( $nt->getText() != wfStripIllegalFilenameChars( $nt->getText() ) ) {
+ $errors[] = array( 'imageinvalidfilename' );
}
- if( $nt->getText() != wfStripIllegalFilenameChars( $nt->getText() ) ) {
- $errors[] = array('imageinvalidfilename');
- }
- if( !File::checkExtensionCompatibility( $file, $nt->getDBkey() ) ) {
- $errors[] = array('imagetypemismatch');
+ if ( !File::checkExtensionCompatibility( $file, $nt->getDBkey() ) ) {
+ $errors[] = array( 'imagetypemismatch' );
}
}
$destfile = wfLocalFile( $nt );
- if( !$wgUser->isAllowed( 'reupload-shared' ) && !$destfile->exists() && wfFindFile( $nt ) ) {
+ if ( !$wgUser->isAllowed( 'reupload-shared' ) && !$destfile->exists() && wfFindFile( $nt ) ) {
$errors[] = array( 'file-exists-sharedrepo' );
}
+ }
+ if ( $nt->getNamespace() == NS_FILE && $this->getNamespace() != NS_FILE ) {
+ $errors[] = array( 'nonfile-cannot-move-to-file' );
}
if ( $auth ) {
$errors = wfMergeErrorArrays( $errors,
- $this->getUserPermissionsErrors('move', $wgUser),
- $this->getUserPermissionsErrors('edit', $wgUser),
- $nt->getUserPermissionsErrors('move-target', $wgUser),
- $nt->getUserPermissionsErrors('edit', $wgUser) );
+ $this->getUserPermissionsErrors( 'move', $wgUser ),
+ $this->getUserPermissionsErrors( 'edit', $wgUser ),
+ $nt->getUserPermissionsErrors( 'move-target', $wgUser ),
+ $nt->getUserPermissionsErrors( 'edit', $wgUser ) );
}
$match = EditPage::matchSummarySpamRegex( $reason );
- if( $match !== false ) {
+ if ( $match !== false ) {
// This is kind of lame, won't display nice
- $errors[] = array('spamprotectiontext');
+ $errors[] = array( 'spamprotectiontext' );
}
$err = null;
- if( !wfRunHooks( 'AbortMove', array( $this, $nt, $wgUser, &$err, $reason ) ) ) {
- $errors[] = array('hookaborted', $err);
+ if ( !wfRunHooks( 'AbortMove', array( $this, $nt, $wgUser, &$err, $reason ) ) ) {
+ $errors[] = array( 'hookaborted', $err );
}
# The move is allowed only if (1) the target doesn't exist, or
@@ -2722,24 +3041,26 @@ class Title {
# (so we can undo bad moves right after they're done).
if ( 0 != $newid ) { # Target exists; check for validity
- if ( ! $this->isValidMoveTarget( $nt ) ) {
- $errors[] = array('articleexists');
+ if ( !$this->isValidMoveTarget( $nt ) ) {
+ $errors[] = array( 'articleexists' );
}
} else {
$tp = $nt->getTitleProtection();
$right = ( $tp['pt_create_perm'] == 'sysop' ) ? 'protect' : $tp['pt_create_perm'];
if ( $tp and !$wgUser->isAllowed( $right ) ) {
- $errors[] = array('cantmove-titleprotected');
+ $errors[] = array( 'cantmove-titleprotected' );
}
}
- if(empty($errors))
+ if ( empty( $errors ) ) {
return true;
+ }
return $errors;
}
/**
* Move a title to a new location
- * @param &$nt \type{Title} the new title
+ *
+ * @param $nt \type{Title} the new title
* @param $auth \type{\bool} indicates whether $wgUser's permissions
* should be checked
* @param $reason \type{\string} The reason for the move
@@ -2749,58 +3070,57 @@ class Title {
*/
public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true ) {
$err = $this->isValidMoveOperation( $nt, $auth, $reason );
- if( is_array( $err ) ) {
+ if ( is_array( $err ) ) {
return $err;
}
// If it is a file, move it first. It is done before all other moving stuff is done because it's hard to revert
$dbw = wfGetDB( DB_MASTER );
- if( $this->getNamespace() == NS_FILE ) {
+ if ( $this->getNamespace() == NS_FILE ) {
$file = wfLocalFile( $this );
- if( $file->exists() ) {
+ if ( $file->exists() ) {
$status = $file->move( $nt );
- if( !$status->isOk() ) {
+ if ( !$status->isOk() ) {
return $status->getErrorsArray();
}
}
}
- $pageid = $this->getArticleID();
+ $dbw->begin(); # If $file was a LocalFile, its transaction would have closed our own.
+ $pageid = $this->getArticleID( GAID_FOR_UPDATE );
$protected = $this->isProtected();
- if( $nt->exists() ) {
+ if ( $nt->exists() ) {
$err = $this->moveOverExistingRedirect( $nt, $reason, $createRedirect );
- $pageCountChange = ($createRedirect ? 0 : -1);
+ $pageCountChange = ( $createRedirect ? 0 : -1 );
} else { # Target didn't exist, do normal move.
$err = $this->moveToNewTitle( $nt, $reason, $createRedirect );
- $pageCountChange = ($createRedirect ? 1 : 0);
+ $pageCountChange = ( $createRedirect ? 1 : 0 );
}
- if( is_array( $err ) ) {
+ if ( is_array( $err ) ) {
+ # FIXME: What about the File we have already moved?
+ $dbw->rollback();
return $err;
}
$redirid = $this->getArticleID();
- // Category memberships include a sort key which may be customized.
- // If it's left as the default (the page title), we need to update
- // the sort key to match the new title.
- //
- // Be careful to avoid resetting cl_timestamp, which may disturb
- // time-based lists on some sites.
- //
- // Warning -- if the sort key is *explicitly* set to the old title,
- // we can't actually distinguish it from a default here, and it'll
- // be set to the new title even though it really shouldn't.
- // It'll get corrected on the next edit, but resetting cl_timestamp.
+ // Refresh the sortkey for this row. Be careful to avoid resetting
+ // cl_timestamp, which may disturb time-based lists on some sites.
+ $prefix = $dbw->selectField(
+ 'categorylinks',
+ 'cl_sortkey_prefix',
+ array( 'cl_from' => $pageid ),
+ __METHOD__
+ );
$dbw->update( 'categorylinks',
array(
- 'cl_sortkey' => $nt->getPrefixedText(),
+ 'cl_sortkey' => Collation::singleton()->getSortKey(
+ $nt->getCategorySortkey( $prefix ) ),
'cl_timestamp=cl_timestamp' ),
- array(
- 'cl_from' => $pageid,
- 'cl_sortkey' => $this->getPrefixedText() ),
+ array( 'cl_from' => $pageid ),
__METHOD__ );
- if( $protected ) {
+ if ( $protected ) {
# Protect the redirect title as the title used to be...
$dbw->insertSelect( 'page_restrictions', 'page_restrictions',
array(
@@ -2818,8 +3138,10 @@ class Title {
# Update the protection log
$log = new LogPage( 'protect' );
$comment = wfMsgForContent( 'prot_1movedto2', $this->getPrefixedText(), $nt->getPrefixedText() );
- if( $reason ) $comment .= wfMsgForContent( 'colon-separator' ) . $reason;
- $log->addEntry( 'move_prot', $nt, $comment, array($this->getPrefixedText()) ); // FIXME: $params?
+ if ( $reason ) {
+ $comment .= wfMsgForContent( 'colon-separator' ) . $reason;
+ }
+ $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ) ); // FIXME: $params?
}
# Update watchlists
@@ -2828,7 +3150,7 @@ class Title {
$oldtitle = $this->getDBkey();
$newtitle = $nt->getDBkey();
- if( $oldnamespace != $newnamespace || $oldtitle != $newtitle ) {
+ if ( $oldnamespace != $newnamespace || $oldtitle != $newtitle ) {
WatchedItem::duplicateEntries( $this, $nt );
}
@@ -2838,28 +3160,30 @@ class Title {
$u = new SearchUpdate( $redirid, $this->getPrefixedDBkey(), '' );
$u->doUpdate();
+ $dbw->commit();
+
# Update site_stats
- if( $this->isContentPage() && !$nt->isContentPage() ) {
+ if ( $this->isContentPage() && !$nt->isContentPage() ) {
# No longer a content page
# Not viewed, edited, removing
$u = new SiteStatsUpdate( 0, 1, -1, $pageCountChange );
- } elseif( !$this->isContentPage() && $nt->isContentPage() ) {
+ } elseif ( !$this->isContentPage() && $nt->isContentPage() ) {
# Now a content page
# Not viewed, edited, adding
- $u = new SiteStatsUpdate( 0, 1, +1, $pageCountChange );
- } elseif( $pageCountChange ) {
+ $u = new SiteStatsUpdate( 0, 1, + 1, $pageCountChange );
+ } elseif ( $pageCountChange ) {
# Redirect added
$u = new SiteStatsUpdate( 0, 0, 0, 1 );
} else {
# Nothing special
$u = false;
}
- if( $u )
+ if ( $u ) {
$u->doUpdate();
+ }
# Update message cache for interface messages
- if( $nt->getNamespace() == NS_MEDIAWIKI ) {
- global $wgMessageCache;
-
+ global $wgMessageCache;
+ if ( $this->getNamespace() == NS_MEDIAWIKI ) {
# @bug 17860: old article can be deleted, if this the case,
# delete it from message cache
if ( $this->getArticleID() === 0 ) {
@@ -2868,7 +3192,8 @@ class Title {
$oldarticle = new Article( $this );
$wgMessageCache->replace( $this->getDBkey(), $oldarticle->getContent() );
}
-
+ }
+ if ( $nt->getNamespace() == NS_MEDIAWIKI ) {
$newarticle = new Article( $nt );
$wgMessageCache->replace( $nt->getDBkey(), $newarticle->getContent() );
}
@@ -2882,7 +3207,7 @@ class Title {
* Move page to a title which is at present a redirect to the
* source page
*
- * @param &$nt \type{Title} the page to move to, which should currently
+ * @param $nt \type{Title} the page to move to, which should currently
* be a redirect
* @param $reason \type{\string} The reason for the move
* @param $createRedirect \type{\bool} Whether to leave a redirect at the old title.
@@ -2918,8 +3243,9 @@ class Title {
if ( !$dbw->cascadingDeletes() ) {
$dbw->delete( 'revision', array( 'rev_page' => $newid ), __METHOD__ );
global $wgUseTrackbacks;
- if ($wgUseTrackbacks)
+ if ( $wgUseTrackbacks ) {
$dbw->delete( 'trackbacks', array( 'tb_page' => $newid ), __METHOD__ );
+ }
$dbw->delete( 'pagelinks', array( 'pl_from' => $newid ), __METHOD__ );
$dbw->delete( 'imagelinks', array( 'il_from' => $newid ), __METHOD__ );
$dbw->delete( 'categorylinks', array( 'cl_from' => $newid ), __METHOD__ );
@@ -2939,12 +3265,12 @@ class Title {
$nullRevId = $nullRevision->insertOn( $dbw );
$article = new Article( $this );
- wfRunHooks( 'NewRevisionFromEditComplete', array($article, $nullRevision, $latest, $wgUser) );
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $article, $nullRevision, $latest, $wgUser ) );
# Change the name of the target page:
$dbw->update( 'page',
/* SET */ array(
- 'page_touched' => $dbw->timestamp($now),
+ 'page_touched' => $dbw->timestamp( $now ),
'page_namespace' => $nt->getNamespace(),
'page_title' => $nt->getDBkey(),
'page_latest' => $nullRevId,
@@ -2955,7 +3281,7 @@ class Title {
$nt->resetArticleID( $oldid );
# Recreate the redirect, this time in the other direction.
- if( $createRedirect || !$wgUser->isAllowed('suppressredirect') ) {
+ if ( $createRedirect || !$wgUser->isAllowed( 'suppressredirect' ) ) {
$mwRedir = MagicWord::get( 'redirect' );
$redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
$redirectArticle = new Article( $this );
@@ -2967,7 +3293,7 @@ class Title {
$redirectRevision->insertOn( $dbw );
$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
- wfRunHooks( 'NewRevisionFromEditComplete', array($redirectArticle, $redirectRevision, false, $wgUser) );
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $redirectArticle, $redirectRevision, false, $wgUser ) );
# Now, we record the link from the redirect to the new title.
# It should have no other outgoing links...
@@ -2999,13 +3325,14 @@ class Title {
/**
* Move page to non-existing title.
- * @param &$nt \type{Title} the new Title
+ *
+ * @param $nt \type{Title} the new Title
* @param $reason \type{\string} The reason for the move
* @param $createRedirect \type{\bool} Whether to create a redirect from the old title to the new title
* Ignored if the user doesn't have the suppressredirect right
*/
private function moveToNewTitle( &$nt, $reason = '', $createRedirect = true ) {
- global $wgUseSquid, $wgUser, $wgContLang;
+ global $wgUser, $wgContLang;
$comment = wfMsgForContent( '1movedto2', $this->getPrefixedText(), $nt->getPrefixedText() );
if ( $reason ) {
@@ -3016,7 +3343,6 @@ class Title {
# Truncate for whole multibyte characters. +5 bytes for ellipsis
$comment = $wgContLang->truncate( $comment, 250 );
- $newid = $nt->getArticleID();
$oldid = $this->getArticleID();
$latest = $this->getLatestRevId();
@@ -3031,7 +3357,7 @@ class Title {
$nullRevId = $nullRevision->insertOn( $dbw );
$article = new Article( $this );
- wfRunHooks( 'NewRevisionFromEditComplete', array($article, $nullRevision, $latest, $wgUser) );
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $article, $nullRevision, $latest, $wgUser ) );
# Rename page entry
$dbw->update( 'page',
@@ -3046,7 +3372,7 @@ class Title {
);
$nt->resetArticleID( $oldid );
- if( $createRedirect || !$wgUser->isAllowed('suppressredirect') ) {
+ if ( $createRedirect || !$wgUser->isAllowed( 'suppressredirect' ) ) {
# Insert redirect
$mwRedir = MagicWord::get( 'redirect' );
$redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
@@ -3059,7 +3385,7 @@ class Title {
$redirectRevision->insertOn( $dbw );
$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
- wfRunHooks( 'NewRevisionFromEditComplete', array($redirectArticle, $redirectRevision, false, $wgUser) );
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $redirectArticle, $redirectRevision, false, $wgUser ) );
# Record the just-created redirect's linking to the page
$dbw->insert( 'pagelinks',
@@ -3084,11 +3410,11 @@ class Title {
# Purge old title from squid
# The new title, and links to the new title, are purged in Article::onArticleCreate()
$this->purgeSquid();
-
}
/**
* Move this page's subpages to be subpages of $nt
+ *
* @param $nt Title Move target
* @param $auth bool Whether $wgUser's permissions should be checked
* @param $reason string The reason for the move
@@ -3100,22 +3426,25 @@ class Title {
public function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true ) {
global $wgMaximumMovedPages;
// Check permissions
- if( !$this->userCan( 'move-subpages' ) )
+ if ( !$this->userCan( 'move-subpages' ) ) {
return array( 'cant-move-subpages' );
+ }
// Do the source and target namespaces support subpages?
- if( !MWNamespace::hasSubpages( $this->getNamespace() ) )
+ if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) {
return array( 'namespace-nosubpages',
MWNamespace::getCanonicalName( $this->getNamespace() ) );
- if( !MWNamespace::hasSubpages( $nt->getNamespace() ) )
+ }
+ if ( !MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
return array( 'namespace-nosubpages',
MWNamespace::getCanonicalName( $nt->getNamespace() ) );
+ }
- $subpages = $this->getSubpages($wgMaximumMovedPages + 1);
+ $subpages = $this->getSubpages( $wgMaximumMovedPages + 1 );
$retval = array();
$count = 0;
- foreach( $subpages as $oldSubpage ) {
+ foreach ( $subpages as $oldSubpage ) {
$count++;
- if( $count > $wgMaximumMovedPages ) {
+ if ( $count > $wgMaximumMovedPages ) {
$retval[$oldSubpage->getPrefixedTitle()] =
array( 'movepage-max-pages',
$wgMaximumMovedPages );
@@ -3125,16 +3454,18 @@ class Title {
// We don't know whether this function was called before
// or after moving the root page, so check both
// $this and $nt
- if( $oldSubpage->getArticleId() == $this->getArticleId() ||
+ if ( $oldSubpage->getArticleId() == $this->getArticleId() ||
$oldSubpage->getArticleID() == $nt->getArticleId() )
+ {
// When moving a page to a subpage of itself,
// don't move it twice
continue;
+ }
$newPageName = preg_replace(
- '#^'.preg_quote( $this->getDBkey(), '#' ).'#',
+ '#^' . preg_quote( $this->getDBkey(), '#' ) . '#',
StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
$oldSubpage->getDBkey() );
- if( $oldSubpage->isTalkPage() ) {
+ if ( $oldSubpage->isTalkPage() ) {
$newNs = $nt->getTalkPage()->getNamespace();
} else {
$newNs = $nt->getSubjectPage()->getNamespace();
@@ -3144,7 +3475,7 @@ class Title {
$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
$success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect );
- if( $success === true ) {
+ if ( $success === true ) {
$retval[$oldSubpage->getPrefixedText()] = $newSubpage->getPrefixedText();
} else {
$retval[$oldSubpage->getPrefixedText()] = $success;
@@ -3157,7 +3488,7 @@ class Title {
* Checks if this page is just a one-rev redirect.
* Adds lock, so don't use just for light purposes.
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function isSingleRevRedirect() {
$dbw = wfGetDB( DB_MASTER );
@@ -3169,14 +3500,14 @@ class Title {
array( 'FOR UPDATE' )
);
# Cache some fields we may want
- $this->mArticleID = $row ? intval($row->page_id) : 0;
+ $this->mArticleID = $row ? intval( $row->page_id ) : 0;
$this->mRedirect = $row ? (bool)$row->page_is_redirect : false;
- $this->mLatestID = $row ? intval($row->page_latest) : false;
- if( !$this->mRedirect ) {
+ $this->mLatestID = $row ? intval( $row->page_latest ) : false;
+ if ( !$this->mRedirect ) {
return false;
}
# Does the article have a history?
- $row = $dbw->selectField( array( 'page', 'revision'),
+ $row = $dbw->selectField( array( 'page', 'revision' ),
'rev_id',
array( 'page_namespace' => $this->getNamespace(),
'page_title' => $this->getDBkey(),
@@ -3187,28 +3518,27 @@ class Title {
array( 'FOR UPDATE' )
);
# Return true if there was no history
- return ($row === false);
+ return ( $row === false );
}
/**
* Checks if $this can be moved to a given Title
* - Selects for update, so don't call it unless you mean business
*
- * @param &$nt \type{Title} the new title to check
+ * @param $nt \type{Title} the new title to check
* @return \type{\bool} TRUE or FALSE
*/
public function isValidMoveTarget( $nt ) {
- $dbw = wfGetDB( DB_MASTER );
- # Is it an existsing file?
- if( $nt->getNamespace() == NS_FILE ) {
+ # Is it an existing file?
+ if ( $nt->getNamespace() == NS_FILE ) {
$file = wfLocalFile( $nt );
- if( $file->exists() ) {
+ if ( $file->exists() ) {
wfDebug( __METHOD__ . ": file exists\n" );
return false;
}
}
# Is it a redirect with no history?
- if( !$nt->isSingleRevRedirect() ) {
+ if ( !$nt->isSingleRevRedirect() ) {
wfDebug( __METHOD__ . ": not a one-rev redirect\n" );
return false;
}
@@ -3220,7 +3550,7 @@ class Title {
$m = array();
if ( preg_match( "/\\[\\[\\s*([^\\]\\|]*)]]/", $text, $m ) ) {
$redirTitle = Title::newFromText( $m[1] );
- if( !is_object( $redirTitle ) ||
+ if ( !is_object( $redirTitle ) ||
( $redirTitle->getPrefixedDBkey() != $this->getPrefixedDBkey() &&
$redirTitle->getPrefixedDBkey() != $nt->getPrefixedDBkey() ) ) {
wfDebug( __METHOD__ . ": redirect points to other page\n" );
@@ -3259,25 +3589,25 @@ class Title {
# NEW SQL
$sql = "SELECT * FROM $categorylinks"
- ." WHERE cl_from='$titlekey'"
- ." AND cl_from <> '0'"
- ." ORDER BY cl_sortkey";
+ . " WHERE cl_from='$titlekey'"
+ . " AND cl_from <> '0'"
+ . " ORDER BY cl_sortkey";
$res = $dbr->query( $sql );
+ $data = array();
- if( $dbr->numRows( $res ) > 0 ) {
- foreach( $res as $row )
- //$data[] = Title::newFromText($wgContLang->getNSText ( NS_CATEGORY ).':'.$row->cl_to);
- $data[$wgContLang->getNSText( NS_CATEGORY ).':'.$row->cl_to] = $this->getFullText();
- $dbr->freeResult( $res );
- } else {
- $data = array();
+ if ( $dbr->numRows( $res ) > 0 ) {
+ foreach ( $res as $row ) {
+ // $data[] = Title::newFromText($wgContLang->getNSText ( NS_CATEGORY ).':'.$row->cl_to);
+ $data[$wgContLang->getNSText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
+ }
}
return $data;
}
/**
* Get a tree of parent categories
+ *
* @param $children \type{\array} an array with the children in the keys, to check for circular refs
* @return \type{\array} Tree of parent categories
*/
@@ -3285,22 +3615,21 @@ class Title {
$stack = array();
$parents = $this->getParentCategories();
- if( $parents ) {
- foreach( $parents as $parent => $current ) {
+ if ( $parents ) {
+ foreach ( $parents as $parent => $current ) {
if ( array_key_exists( $parent, $children ) ) {
# Circular reference
$stack[$parent] = array();
} else {
- $nt = Title::newFromText($parent);
+ $nt = Title::newFromText( $parent );
if ( $nt ) {
- $stack[$parent] = $nt->getParentCategoryTree( $children + array($parent => 1) );
+ $stack[$parent] = $nt->getParentCategoryTree( $children + array( $parent => 1 ) );
}
}
}
- return $stack;
- } else {
- return array();
}
+
+ return $stack;
}
@@ -3311,7 +3640,7 @@ class Title {
* @return \type{\array} Selection array
*/
public function pageCond() {
- if( $this->mArticleID > 0 ) {
+ if ( $this->mArticleID > 0 ) {
// PK avoids secondary lookups in InnoDB, shouldn't hurt other DBs
return array( 'page_id' => $this->mArticleID );
} else {
@@ -3323,14 +3652,14 @@ class Title {
* Get the revision ID of the previous revision
*
* @param $revId \type{\int} Revision ID. Get the revision that was before this one.
- * @param $flags \type{\int} GAID_FOR_UPDATE
+ * @param $flags \type{\int} Title::GAID_FOR_UPDATE
* @return \twotypes{\int,\bool} Old revision ID, or FALSE if none exists
*/
- public function getPreviousRevisionID( $revId, $flags=0 ) {
- $db = ($flags & GAID_FOR_UPDATE) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
+ public function getPreviousRevisionID( $revId, $flags = 0 ) {
+ $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
return $db->selectField( 'revision', 'rev_id',
array(
- 'rev_page' => $this->getArticleId($flags),
+ 'rev_page' => $this->getArticleId( $flags ),
'rev_id < ' . intval( $revId )
),
__METHOD__,
@@ -3342,14 +3671,14 @@ class Title {
* Get the revision ID of the next revision
*
* @param $revId \type{\int} Revision ID. Get the revision that was after this one.
- * @param $flags \type{\int} GAID_FOR_UPDATE
+ * @param $flags \type{\int} Title::GAID_FOR_UPDATE
* @return \twotypes{\int,\bool} Next revision ID, or FALSE if none exists
*/
- public function getNextRevisionID( $revId, $flags=0 ) {
- $db = ($flags & GAID_FOR_UPDATE) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
+ public function getNextRevisionID( $revId, $flags = 0 ) {
+ $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
return $db->selectField( 'revision', 'rev_id',
array(
- 'rev_page' => $this->getArticleId($flags),
+ 'rev_page' => $this->getArticleId( $flags ),
'rev_id > ' . intval( $revId )
),
__METHOD__,
@@ -3360,19 +3689,21 @@ class Title {
/**
* Get the first revision of the page
*
- * @param $flags \type{\int} GAID_FOR_UPDATE
+ * @param $flags \type{\int} Title::GAID_FOR_UPDATE
* @return Revision (or NULL if page doesn't exist)
*/
- public function getFirstRevision( $flags=0 ) {
- $db = ($flags & GAID_FOR_UPDATE) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
- $pageId = $this->getArticleId($flags);
- if( !$pageId ) return null;
+ public function getFirstRevision( $flags = 0 ) {
+ $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
+ $pageId = $this->getArticleId( $flags );
+ if ( !$pageId ) {
+ return null;
+ }
$row = $db->selectRow( 'revision', '*',
array( 'rev_page' => $pageId ),
__METHOD__,
array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 )
);
- if( !$row ) {
+ if ( !$row ) {
return null;
} else {
return new Revision( $row );
@@ -3392,11 +3723,11 @@ class Title {
/**
* Get the oldest revision timestamp of this page
*
- * @return string, MW timestamp
+ * @return String: MW timestamp
*/
public function getEarliestRevTime() {
$dbr = wfGetDB( DB_SLAVE );
- if( $this->exists() ) {
+ if ( $this->exists() ) {
$min = $dbr->selectField( 'revision',
'MIN(rev_timestamp)',
array( 'rev_page' => $this->getArticleId() ),
@@ -3425,9 +3756,32 @@ class Title {
}
/**
+ * Get the number of authors between the given revision IDs.
+ * Used for diffs and other things that really need it.
+ *
+ * @param $fromRevId \type{\int} Revision ID (first before range)
+ * @param $toRevId \type{\int} Revision ID (first after range)
+ * @param $limit \type{\int} Maximum number of authors
+ * @param $flags \type{\int} Title::GAID_FOR_UPDATE
+ * @return \type{\int}
+ */
+ public function countAuthorsBetween( $fromRevId, $toRevId, $limit, $flags = 0 ) {
+ $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
+ $res = $db->select( 'revision', 'DISTINCT rev_user_text',
+ array(
+ 'rev_page = ' . $this->getArticleID(),
+ 'rev_id > ' . (int)$fromRevId,
+ 'rev_id < ' . (int)$toRevId
+ ), __METHOD__,
+ array( 'LIMIT' => $limit )
+ );
+ return (int)$db->numRows( $res );
+ }
+
+ /**
* Compare with another title.
*
- * @param \type{Title} $title
+ * @param $title \type{Title}
* @return \type{\bool} TRUE or FALSE
*/
public function equals( Title $title ) {
@@ -3439,9 +3793,11 @@ class Title {
/**
* Callback for usort() to do title sorts by (namespace, title)
+ *
+ * @return Integer: result of string comparison, or namespace comparison
*/
public static function compare( $a, $b ) {
- if( $a->getNamespace() == $b->getNamespace() ) {
+ if ( $a->getNamespace() == $b->getNamespace() ) {
return strcmp( $a->getText(), $b->getText() );
} else {
return $a->getNamespace() - $b->getNamespace();
@@ -3464,7 +3820,7 @@ class Title {
* If you want to know if a title can be meaningfully viewed, you should
* probably call the isKnown() method instead.
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function exists() {
return $this->getArticleId() != 0;
@@ -3484,30 +3840,28 @@ class Title {
* existing code, but we might want to add an optional parameter to skip
* it and any other expensive checks.)
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function isAlwaysKnown() {
- if( $this->mInterwiki != '' ) {
+ if ( $this->mInterwiki != '' ) {
return true; // any interwiki link might be viewable, for all we know
}
switch( $this->mNamespace ) {
- case NS_MEDIA:
- case NS_FILE:
- return wfFindFile( $this ); // file exists, possibly in a foreign repo
- case NS_SPECIAL:
- return SpecialPage::exists( $this->getDBkey() ); // valid special page
- case NS_MAIN:
- return $this->mDbkeyform == ''; // selflink, possibly with fragment
- case NS_MEDIAWIKI:
- // If the page is form Mediawiki:message/lang, calling wfMsgWeirdKey causes
- // the full l10n of that language to be loaded. That takes much memory and
- // isn't needed. So we strip the language part away.
- // Also, extension messages which are not loaded, are shown as red, because
- // we don't call MessageCache::loadAllMessages.
- list( $basename, /* rest */ ) = explode( '/', $this->mDbkeyform, 2 );
- return wfMsgWeirdKey( $basename ); // known system message
- default:
- return false;
+ case NS_MEDIA:
+ case NS_FILE:
+ return (bool)wfFindFile( $this ); // file exists, possibly in a foreign repo
+ case NS_SPECIAL:
+ return SpecialPage::exists( $this->getDBkey() ); // valid special page
+ case NS_MAIN:
+ return $this->mDbkeyform == ''; // selflink, possibly with fragment
+ case NS_MEDIAWIKI:
+ // If the page is form Mediawiki:message/lang, calling wfMsgWeirdKey causes
+ // the full l10n of that language to be loaded. That takes much memory and
+ // isn't needed. So we strip the language part away.
+ list( $basename, /* rest */ ) = explode( '/', $this->mDbkeyform, 2 );
+ return (bool)wfMsgWeirdKey( $basename ); // known system message
+ default:
+ return false;
}
}
@@ -3517,17 +3871,41 @@ class Title {
* links to the title should be rendered as "bluelinks" (as opposed to
* "redlinks" to non-existent pages).
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function isKnown() {
- return $this->exists() || $this->isAlwaysKnown();
+ return $this->isAlwaysKnown() || $this->exists();
}
/**
- * Is this in a namespace that allows actual pages?
- *
- * @return \type{\bool} TRUE or FALSE
- */
+ * Does this page have source text?
+ *
+ * @return Boolean
+ */
+ public function hasSourceText() {
+ if ( $this->exists() ) {
+ return true;
+ }
+
+ if ( $this->mNamespace == NS_MEDIAWIKI ) {
+ // If the page doesn't exist but is a known system message, default
+ // message content will be displayed, same for language subpages
+ // Also, if the page is form Mediawiki:message/lang, calling wfMsgWeirdKey
+ // causes the full l10n of that language to be loaded. That takes much
+ // memory and isn't needed. So we strip the language part away.
+ list( $basename, /* rest */ ) = explode( '/', $this->mDbkeyform, 2 );
+ return (bool)wfMsgWeirdKey( $basename );
+ }
+
+ return false;
+ }
+
+ /**
+ * Is this in a namespace that allows actual pages?
+ *
+ * @return \type{\bool}
+ * @internal note -- uses hardcoded namespace index instead of constants
+ */
public function canExist() {
return $this->mNamespace >= 0 && $this->mNamespace != NS_MEDIA;
}
@@ -3549,34 +3927,39 @@ class Title {
/**
* Get the last touched timestamp
- * @param Database $db, optional db
+ *
+ * @param $db DatabaseBase: optional db
* @return \type{\string} Last touched timestamp
*/
public function getTouched( $db = null ) {
- $db = isset($db) ? $db : wfGetDB( DB_SLAVE );
+ $db = isset( $db ) ? $db : wfGetDB( DB_SLAVE );
$touched = $db->selectField( 'page', 'page_touched', $this->pageCond(), __METHOD__ );
return $touched;
}
/**
* Get the timestamp when this page was updated since the user last saw it.
- * @param User $user
- * @return mixed string/NULL
+ *
+ * @param $user User
+ * @return Mixed: string/null
*/
public function getNotificationTimestamp( $user = null ) {
global $wgUser, $wgShowUpdatedMarker;
// Assume current user if none given
- if( !$user ) $user = $wgUser;
+ if ( !$user ) {
+ $user = $wgUser;
+ }
// Check cache first
$uid = $user->getId();
- if( isset($this->mNotificationTimestamp[$uid]) ) {
+ // avoid isset here, as it'll return false for null entries
+ if ( array_key_exists( $uid, $this->mNotificationTimestamp ) ) {
return $this->mNotificationTimestamp[$uid];
}
- if( !$uid || !$wgShowUpdatedMarker ) {
+ if ( !$uid || !$wgShowUpdatedMarker ) {
return $this->mNotificationTimestamp[$uid] = false;
}
// Don't cache too much!
- if( count($this->mNotificationTimestamp) >= self::CACHE_MAX ) {
+ if ( count( $this->mNotificationTimestamp ) >= self::CACHE_MAX ) {
$this->mNotificationTimestamp = array();
}
$dbr = wfGetDB( DB_SLAVE );
@@ -3593,22 +3976,24 @@ class Title {
/**
* Get the trackback URL for this page
+ *
* @return \type{\string} Trackback URL
*/
public function trackbackURL() {
global $wgScriptPath, $wgServer, $wgScriptExtension;
return "$wgServer$wgScriptPath/trackback$wgScriptExtension?article="
- . htmlspecialchars(urlencode($this->getPrefixedDBkey()));
+ . htmlspecialchars( urlencode( $this->getPrefixedDBkey() ) );
}
/**
* Get the trackback RDF for this page
+ *
* @return \type{\string} Trackback RDF
*/
public function trackbackRDF() {
- $url = htmlspecialchars($this->getFullURL());
- $title = htmlspecialchars($this->getText());
+ $url = htmlspecialchars( $this->getFullURL() );
+ $title = htmlspecialchars( $this->getText() );
$tburl = $this->trackbackURL();
// Autodiscovery RDF is placed in comments so HTML validator
@@ -3631,6 +4016,8 @@ class Title {
/**
* Generate strings used for xml 'id' names in monobook tabs
+ *
+ * @param $prepend string defaults to 'nstab-'
* @return \type{\string} XML 'id' name
*/
public function getNamespaceKey( $prepend = 'nstab-' ) {
@@ -3660,14 +4047,18 @@ class Title {
/**
* Returns true if this is a special page.
+ *
+ * @return boolean
*/
- public function isSpecialPage( ) {
+ public function isSpecialPage() {
return $this->getNamespace() == NS_SPECIAL;
}
/**
* Returns true if this title resolves to the named special page
+ *
* @param $name \type{\string} The special page name
+ * @return boolean
*/
public function isSpecial( $name ) {
if ( $this->getNamespace() == NS_SPECIAL ) {
@@ -3681,7 +4072,9 @@ class Title {
/**
* If the Title refers to a special page alias which is not the local default,
- * @return \type{Title} A new Title which points to the local default. Otherwise, returns $this.
+ *
+ * @return \type{Title} A new Title which points to the local default.
+ * Otherwise, returns $this.
*/
public function fixSpecialName() {
if ( $this->getNamespace() == NS_SPECIAL ) {
@@ -3701,7 +4094,7 @@ class Title {
* In other words, is this a content page, for the purposes of calculating
* statistics, etc?
*
- * @return \type{\bool} TRUE or FALSE
+ * @return Boolean
*/
public function isContentPage() {
return MWNamespace::isContent( $this->getNamespace() );
@@ -3723,7 +4116,9 @@ class Title {
'rd_title' => $this->getDBkey(),
'rd_from = page_id'
);
- if ( !is_null($ns) ) $where['page_namespace'] = $ns;
+ if ( !is_null( $ns ) ) {
+ $where['page_namespace'] = $ns;
+ }
$res = $dbr->select(
array( 'redirect', 'page' ),
@@ -3732,8 +4127,7 @@ class Title {
__METHOD__
);
-
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$redirs[] = self::newFromRow( $row );
}
return $redirs;
@@ -3742,18 +4136,18 @@ class Title {
/**
* Check if this Title is a valid redirect target
*
- * @return \type{\bool} TRUE or FALSE
+ * @return \type{\bool}
*/
public function isValidRedirectTarget() {
global $wgInvalidRedirectTargets;
// invalid redirect targets are stored in a global array, but explicity disallow Userlogout here
- if( $this->isSpecial( 'Userlogout' ) ) {
+ if ( $this->isSpecial( 'Userlogout' ) ) {
return false;
}
- foreach( $wgInvalidRedirectTargets as $target ) {
- if( $this->isSpecial( $target ) ) {
+ foreach ( $wgInvalidRedirectTargets as $target ) {
+ if ( $this->isSpecial( $target ) ) {
return false;
}
}
@@ -3763,6 +4157,8 @@ class Title {
/**
* Get a backlink cache object
+ *
+ * @return object BacklinkCache
*/
function getBacklinkCache() {
if ( is_null( $this->mBacklinkCache ) ) {
@@ -3774,11 +4170,11 @@ class Title {
/**
* Whether the magic words __INDEX__ and __NOINDEX__ function for
* this page.
- * @return Bool
+ *
+ * @return Boolean
*/
- public function canUseNoindex(){
- global $wgArticleRobotPolicies, $wgContentNamespaces,
- $wgExemptFromUserRobotsControl;
+ public function canUseNoindex() {
+ global $wgContentNamespaces, $wgExemptFromUserRobotsControl;
$bannedNamespaces = is_null( $wgExemptFromUserRobotsControl )
? $wgContentNamespaces
@@ -3788,16 +4184,66 @@ class Title {
}
+ /**
+ * Returns restriction types for the current Title
+ *
+ * @return array applicable restriction types
+ */
public function getRestrictionTypes() {
- global $wgRestrictionTypes;
- $types = $this->exists() ? $wgRestrictionTypes : array('create');
-
- if ( $this->getNamespace() == NS_FILE ) {
- $types[] = 'upload';
+ $types = self::getFilteredRestrictionTypes( $this->exists() );
+
+ if ( $this->getNamespace() != NS_FILE ) {
+ # Remove the upload restriction for non-file titles
+ $types = array_diff( $types, array( 'upload' ) );
}
-
+
wfRunHooks( 'TitleGetRestrictionTypes', array( $this, &$types ) );
+
+ wfDebug( __METHOD__ . ': applicable restriction types for ' .
+ $this->getPrefixedText() . ' are ' . implode( ',', $types ) );
return $types;
}
+ /**
+ * Get a filtered list of all restriction types supported by this wiki.
+ * @param bool $exists True to get all restriction types that apply to
+ * titles that do exist, False for all restriction types that apply to
+ * titles that do not exist
+ * @return array
+ */
+ public static function getFilteredRestrictionTypes( $exists = true ) {
+ global $wgRestrictionTypes;
+ $types = $wgRestrictionTypes;
+ if ( $exists ) {
+ # Remove the create restriction for existing titles
+ $types = array_diff( $types, array( 'create' ) );
+ } else {
+ # Only the create and upload restrictions apply to non-existing titles
+ $types = array_intersect( $types, array( 'create', 'upload' ) );
+ }
+ return $types;
+ }
+
+ /**
+ * Returns the raw sort key to be used for categories, with the specified
+ * prefix. This will be fed to Collation::getSortKey() to get a
+ * binary sortkey that can be used for actual sorting.
+ *
+ * @param $prefix string The prefix to be used, specified using
+ * {{defaultsort:}} or like [[Category:Foo|prefix]]. Empty for no
+ * prefix.
+ * @return string
+ */
+ public function getCategorySortkey( $prefix = '' ) {
+ $unprefixed = $this->getText();
+ if ( $prefix !== '' ) {
+ # Separate with a line feed, so the unprefixed part is only used as
+ # a tiebreaker when two pages have the exact same prefix.
+ # In UCA, tab is the only character that can sort above LF
+ # so we strip both of them from the original prefix.
+ $prefix = strtr( $prefix, "\n\t", ' ' );
+ return "$prefix\n$unprefixed";
+ }
+ return $unprefixed;
+ }
}
diff --git a/includes/User.php b/includes/User.php
index fb19ddf2..5760003b 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -41,58 +41,13 @@ class PasswordError extends MWException {
* of the database.
*/
class User {
-
/**
- * \type{\arrayof{\string}} A list of default user toggles, i.e., boolean user
- * preferences that are displayed by Special:Preferences as checkboxes.
- * This list can be extended via the UserToggles hook or by
- * $wgContLang::getExtraUserToggles().
- * @showinitializer
+ * Global constants made accessible as class constants so that autoloader
+ * magic can be used.
*/
- public static $mToggles = array(
- 'highlightbroken',
- 'justify',
- 'hideminor',
- 'extendwatchlist',
- 'usenewrc',
- 'numberheadings',
- 'showtoolbar',
- 'editondblclick',
- 'editsection',
- 'editsectiononrightclick',
- 'showtoc',
- 'rememberpassword',
- 'editwidth',
- 'watchcreations',
- 'watchdefault',
- 'watchmoves',
- 'watchdeletion',
- 'minordefault',
- 'previewontop',
- 'previewonfirst',
- 'nocache',
- 'enotifwatchlistpages',
- 'enotifusertalkpages',
- 'enotifminoredits',
- 'enotifrevealaddr',
- 'shownumberswatching',
- 'fancysig',
- 'externaleditor',
- 'externaldiff',
- 'showjumplinks',
- 'uselivepreview',
- 'forceeditsummary',
- 'watchlisthideminor',
- 'watchlisthidebots',
- 'watchlisthideown',
- 'watchlisthideanons',
- 'watchlisthideliu',
- 'ccmeonemails',
- 'diffonly',
- 'showhiddencats',
- 'noconvertlink',
- 'norollbackdiff',
- );
+ const USER_TOKEN_LENGTH = USER_TOKEN_LENGTH;
+ const MW_USER_VERSION = MW_USER_VERSION;
+ const EDIT_TOKEN_SUFFIX = EDIT_TOKEN_SUFFIX;
/**
* \type{\arrayof{\string}} List of member variables which are saved to the
@@ -144,14 +99,18 @@ class User {
'deletedhistory',
'deletedtext',
'deleterevision',
+ 'disableaccount',
'edit',
'editinterface',
- 'editusercssjs',
+ 'editusercssjs', #deprecated
+ 'editusercss',
+ 'edituserjs',
'hideuser',
'import',
'importupload',
'ipblock-exempt',
'markbotedits',
+ 'mergehistory',
'minoredit',
'move',
'movefile',
@@ -168,12 +127,14 @@ class User {
'reupload',
'reupload-shared',
'rollback',
+ 'selenium',
'sendemail',
'siteadmin',
'suppressionlog',
'suppressredirect',
'suppressrevision',
'trackback',
+ 'unblockself',
'undelete',
'unwatchedpages',
'upload',
@@ -229,7 +190,7 @@ class User {
* @see newFromSession()
* @see newFromRow()
*/
- function User() {
+ function __construct() {
$this->clearInstanceCache( 'defaults' );
}
@@ -292,7 +253,7 @@ class User {
}
if ( !$data ) {
- wfDebug( "Cache miss for user {$this->mId}\n" );
+ wfDebug( "User: cache miss for user {$this->mId}\n" );
# Load from DB
if ( !$this->loadFromDatabase() ) {
# Can't load from ID, user is anonymous
@@ -300,7 +261,7 @@ class User {
}
$this->saveToCache();
} else {
- wfDebug( "Got user {$this->mId} from cache\n" );
+ wfDebug( "User: got user {$this->mId} from cache\n" );
# Restore from cache
foreach ( self::$mCacheVars as $name ) {
$this->$name = $data[$name];
@@ -345,7 +306,7 @@ class User {
* User::getCanonicalName(), except that true is accepted as an alias
* for 'valid', for BC.
*
- * @return \type{User} The User object, or false if the username is invalid
+ * @return User The User object, or false if the username is invalid
* (e.g. if it contains illegal characters or is an IP address). If the
* username is not present in the database, the result will be a user object
* with a name, zero user ID and default settings.
@@ -600,20 +561,34 @@ class User {
* either by batch processes or by user accounts which have
* already been created.
*
- * Additional character blacklisting may be added here
- * rather than in isValidUserName() to avoid disrupting
- * existing accounts.
+ * Additional blacklisting may be added here rather than in
+ * isValidUserName() to avoid disrupting existing accounts.
*
* @param $name \string String to match
* @return \bool True or false
*/
static function isCreatableName( $name ) {
global $wgInvalidUsernameCharacters;
- return
- self::isUsableName( $name ) &&
- // Registration-time character blacklisting...
- !preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name );
+ // Ensure that the username isn't longer than 235 bytes, so that
+ // (at least for the builtin skins) user javascript and css files
+ // will work. (bug 23080)
+ if( strlen( $name ) > 235 ) {
+ wfDebugLog( 'username', __METHOD__ .
+ ": '$name' invalid due to length" );
+ return false;
+ }
+
+ // Preg yells if you try to give it an empty string
+ if( $wgInvalidUsernameCharacters ) {
+ if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+ wfDebugLog( 'username', __METHOD__ .
+ ": '$name' invalid due to wgInvalidUsernameCharacters" );
+ return false;
+ }
+ }
+
+ return self::isUsableName( $name );
}
/**
@@ -635,6 +610,11 @@ class User {
*/
function getPasswordValidity( $password ) {
global $wgMinimalPasswordLength, $wgContLang;
+
+ static $blockedLogins = array(
+ 'Useruser' => 'Passpass', 'Useruser1' => 'Passpass1', # r75589
+ 'Apitestsysop' => 'testpass', 'Apitestuser' => 'testpass' # r75605
+ );
$result = false; //init $result to false for the internal checks
@@ -646,6 +626,8 @@ class User {
return 'passwordtooshort';
} elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
return 'password-name-match';
+ } elseif ( isset( $blockedLogins[ $this->getName() ] ) && $password == $blockedLogins[ $this->getName() ] ) {
+ return 'password-login-forbidden';
} else {
//it seems weird returning true here, but this is because of the
//initialization of $result to false above. If the hook is never run or it
@@ -663,14 +645,28 @@ class User {
/**
* Does a string look like an e-mail address?
*
- * There used to be a regular expression here, it got removed because it
- * rejected valid addresses. Actually just check if there is '@' somewhere
- * in the given address.
+ * This validates an email address using an HTML5 specification found at:
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
+ * Which as of 2011-01-24 says:
*
- * @todo Check for RFC 2822 compilance (bug 959)
+ * A valid e-mail address is a string that matches the ABNF production
+ * 1*( atext / "." ) "@" ldh-str *( "." ldh-str ) where atext is defined
+ * in RFC 5322 section 3.2.3, and ldh-str is defined in RFC 1034 section
+ * 3.5.
*
- * @param $addr \string E-mail address
- * @return \bool True or false
+ * This function is an implementation of the specification as requested in
+ * bug 22449.
+ *
+ * Client-side forms will use the same standard validation rules via JS or
+ * HTML 5 validation; additional restrictions can be enforced server-side
+ * by extensions via the 'isValidEmailAddr' hook.
+ *
+ * Note that this validation doesn't 100% match RFC 2822, but is believed
+ * to be liberal enough for wide use. Some invalid addresses will still
+ * pass validation here.
+ *
+ * @param $addr String E-mail address
+ * @return Bool
*/
public static function isValidEmailAddr( $addr ) {
$result = null;
@@ -678,7 +674,22 @@ class User {
return $result;
}
- return strpos( $addr, '@' ) !== false;
+ // Please note strings below are enclosed in brackets [], this make the
+ // hyphen "-" a range indicator. Hence it is double backslashed below.
+ // See bug 26948
+ $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~" ;
+ $rfc1034_ldh_str = "a-z0-9\\-" ;
+
+ $HTML5_email_regexp = "/
+ ^ # start of string
+ [$rfc5322_atext\\.]+ # user part which is liberal :p
+ @ # 'apostrophe'
+ [$rfc1034_ldh_str]+ # First domain part
+ (\\.[$rfc1034_ldh_str]+)* # Following part prefixed with a dot
+ $ # End of string
+ /ix" ; // case Insensitive, eXtended
+
+ return (bool) preg_match( $HTML5_email_regexp, $addr );
}
/**
@@ -711,7 +722,6 @@ class User {
}
# Reject various classes of invalid names
- $name = $t->getText();
global $wgAuth;
$name = $wgAuth->getCanonicalName( $t->getText() );
@@ -806,7 +816,7 @@ class User {
function loadDefaults( $name = false ) {
wfProfileIn( __METHOD__ );
- global $wgCookiePrefix;
+ global $wgRequest;
$this->mId = 0;
$this->mName = $name;
@@ -817,8 +827,8 @@ class User {
$this->mOptionOverrides = null;
$this->mOptionsLoaded = false;
- if ( isset( $_COOKIE[$wgCookiePrefix.'LoggedOut'] ) ) {
- $this->mTouched = wfTimestamp( TS_MW, $_COOKIE[$wgCookiePrefix.'LoggedOut'] );
+ if( $wgRequest->getCookie( 'LoggedOut' ) !== null ) {
+ $this->mTouched = wfTimestamp( TS_MW, $wgRequest->getCookie( 'LoggedOut' ) );
} else {
$this->mTouched = '0'; # Allow any pages to be cached
}
@@ -849,7 +859,7 @@ class User {
* @return \bool True if the user is logged in, false otherwise.
*/
private function loadFromSession() {
- global $wgMemc, $wgCookiePrefix, $wgExternalAuthType, $wgAutocreatePolicy;
+ global $wgRequest, $wgExternalAuthType, $wgAutocreatePolicy;
$result = null;
wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
@@ -865,8 +875,8 @@ class User {
}
}
- if ( isset( $_COOKIE["{$wgCookiePrefix}UserID"] ) ) {
- $sId = intval( $_COOKIE["{$wgCookiePrefix}UserID"] );
+ if ( $wgRequest->getCookie( 'UserID' ) !== null ) {
+ $sId = intval( $wgRequest->getCookie( 'UserID' ) );
if( isset( $_SESSION['wsUserID'] ) && $sId != $_SESSION['wsUserID'] ) {
$this->loadDefaults(); // Possible collision!
wfDebugLog( 'loginSessions', "Session user ID ({$_SESSION['wsUserID']}) and
@@ -888,15 +898,14 @@ class User {
if ( isset( $_SESSION['wsUserName'] ) ) {
$sName = $_SESSION['wsUserName'];
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserName"] ) ) {
- $sName = $_COOKIE["{$wgCookiePrefix}UserName"];
+ } else if ( $wgRequest->getCookie('UserName') !== null ) {
+ $sName = $wgRequest->getCookie('UserName');
$_SESSION['wsUserName'] = $sName;
} else {
$this->loadDefaults();
return false;
}
- $passwordCorrect = FALSE;
$proposedUser = User::newFromId( $sId );
if ( !$proposedUser->isLoggedIn() ) {
# Not a valid ID
@@ -914,8 +923,8 @@ class User {
if ( isset( $_SESSION['wsToken'] ) ) {
$passwordCorrect = $proposedUser->getToken() === $_SESSION['wsToken'];
$from = 'session';
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}Token"] ) ) {
- $passwordCorrect = $proposedUser->getToken() === $_COOKIE["{$wgCookiePrefix}Token"];
+ } else if ( $wgRequest->getCookie( 'Token' ) !== null ) {
+ $passwordCorrect = $proposedUser->getToken() === $wgRequest->getCookie( 'Token' );
$from = 'cookie';
} else {
# No session or persistent login cookie
@@ -926,11 +935,11 @@ class User {
if ( ( $sName === $proposedUser->getName() ) && $passwordCorrect ) {
$this->loadFromUserObject( $proposedUser );
$_SESSION['wsToken'] = $this->mToken;
- wfDebug( "Logged in from $from\n" );
+ wfDebug( "User: logged in from $from\n" );
return true;
} else {
# Invalid credentials
- wfDebug( "Can't log in from $from, invalid credentials\n" );
+ wfDebug( "User: can't log in from $from, invalid credentials\n" );
$this->loadDefaults();
return false;
}
@@ -1023,7 +1032,7 @@ class User {
array( 'ug_user' => $this->mId ),
__METHOD__ );
$this->mGroups = array();
- while( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$this->mGroups[] = $row->ug_group;
}
}
@@ -1068,7 +1077,7 @@ class User {
/**
* default language setting
*/
- $variant = $wgContLang->getPreferredVariant( false );
+ $variant = $wgContLang->getDefaultVariant();
$defOpt['variant'] = $variant;
$defOpt['language'] = $variant;
foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
@@ -1094,22 +1103,6 @@ class User {
}
}
- /**
- * Get a list of user toggle names
- * @return \type{\arrayof{\string}} Array of user toggle names
- */
- static function getToggles() {
- global $wgContLang, $wgUseRCPatrol;
- $extraToggles = array();
- wfRunHooks( 'UserToggles', array( &$extraToggles ) );
- if( $wgUseRCPatrol ) {
- $extraToggles[] = 'hidepatrolled';
- $extraToggles[] = 'newpageshidepatrolled';
- $extraToggles[] = 'watchlisthidepatrolled';
- }
- return array_merge( self::$mToggles, $extraToggles, $wgContLang->getExtraUserToggles() );
- }
-
/**
* Get blocking information
@@ -1167,7 +1160,7 @@ class User {
if ( $this->mBlock->load( $ip , $this->mId ) ) {
wfDebug( __METHOD__ . ": Found block.\n" );
$this->mBlockedby = $this->mBlock->mBy;
- if( $this->mBlockedby == "0" )
+ if( $this->mBlockedby == 0 )
$this->mBlockedby = $this->mBlock->mByName;
$this->mBlockreason = $this->mBlock->mReason;
$this->mHideName = $this->mBlock->mHideName;
@@ -1236,7 +1229,6 @@ class User {
wfProfileIn( __METHOD__ );
$found = false;
- $host = '';
// FIXME: IPv6 ??? (http://bugs.php.net/bug.php?id=33170)
if( IP::isIPv4( $ip ) ) {
# Reverse IP, bug 21255
@@ -1507,7 +1499,7 @@ class User {
/**
* Get the user's ID.
- * @return \int The user's ID; 0 if the user is anonymous or nonexistent
+ * @return Integer The user's ID; 0 if the user is anonymous or nonexistent
*/
function getId() {
if( $this->mId === null and $this->mName !== null
@@ -1813,11 +1805,11 @@ class User {
}
if( !$this->isValidPassword( $str ) ) {
- global $wgMinimalPasswordLength;
+ global $wgMinimalPasswordLength;
$valid = $this->getPasswordValidity( $str );
throw new PasswordError( wfMsgExt( $valid, array( 'parsemag' ),
$wgMinimalPasswordLength ) );
- }
+ }
}
if( !$wgAuth->setPassword( $this, $str ) ) {
@@ -2045,7 +2037,7 @@ class User {
if ( $oname == 'skin' ) {
# Clear cached skin, so the new one displays immediately in Special:Preferences
- unset( $this->mSkin );
+ $this->mSkin = null;
}
// Explicitly NULL values should refer to defaults
@@ -2083,6 +2075,20 @@ class User {
}
/**
+ * Get the user preferred stub threshold
+ */
+ function getStubThreshold() {
+ global $wgMaxArticleSize; # Maximum article size, in Kb
+ $threshold = intval( $this->getOption( 'stubthreshold' ) );
+ if ( $threshold > $wgMaxArticleSize * 1024 ) {
+ # If they have set an impossible value, disable the preference
+ # so we can use the parser cache again.
+ $threshold = 0;
+ }
+ return $threshold;
+ }
+
+ /**
* Get the permissions this user has.
* @return \type{\arrayof{\string}} Array of permission names
*/
@@ -2164,7 +2170,7 @@ class User {
'ug_user' => $this->getID(),
'ug_group' => $group,
),
- 'User::addGroup',
+ __METHOD__,
array( 'IGNORE' ) );
}
@@ -2187,8 +2193,7 @@ class User {
array(
'ug_user' => $this->getID(),
'ug_group' => $group,
- ),
- 'User::removeGroup' );
+ ), __METHOD__ );
$this->loadGroups();
$this->mGroups = array_diff( $this->mGroups, array( $group ) );
@@ -2226,11 +2231,12 @@ class User {
/**
* Check if user is allowed to access a feature / make an action
* @param $action \string action to be checked
- * @return \bool True if action is allowed, else false
+ * @return Boolean: True if action is allowed, else false
*/
function isAllowed( $action = '' ) {
- if ( $action === '' )
+ if ( $action === '' ) {
return true; // In the spirit of DWIM
+ }
# Patrolling may not be enabled
if( $action === 'patrol' || $action === 'autopatrol' ) {
global $wgUseRCPatrol, $wgUseNPPatrol;
@@ -2244,7 +2250,7 @@ class User {
/**
* Check whether to enable recent changes patrol features for this user
- * @return \bool True or false
+ * @return Boolean: True or false
*/
public function useRCPatrol() {
global $wgUseRCPatrol;
@@ -2266,33 +2272,41 @@ class User {
* @return Skin The current skin
* @todo FIXME : need to check the old failback system [AV]
*/
- function &getSkin( $t = null ) {
- if ( !isset( $this->mSkin ) ) {
- wfProfileIn( __METHOD__ );
+ function getSkin( $t = null ) {
+ if( !$this->mSkin ) {
+ global $wgOut;
+ $this->mSkin = $this->createSkinObject();
+ $this->mSkin->setTitle( $wgOut->getTitle() );
+ }
+ if ( $t && ( !$this->mSkin->getTitle() || !$t->equals( $this->mSkin->getTitle() ) ) ) {
+ $skin = $this->createSkinObject();
+ $skin->setTitle( $t );
+ return $skin;
+ } else {
+ return $this->mSkin;
+ }
+ }
- global $wgHiddenPrefs;
- if( !in_array( 'skin', $wgHiddenPrefs ) ) {
- # get the user skin
- global $wgRequest;
- $userSkin = $this->getOption( 'skin' );
- $userSkin = $wgRequest->getVal( 'useskin', $userSkin );
- } else {
- # if we're not allowing users to override, then use the default
- global $wgDefaultSkin;
- $userSkin = $wgDefaultSkin;
- }
+ // Creates a Skin object, for getSkin()
+ private function createSkinObject() {
+ wfProfileIn( __METHOD__ );
- $this->mSkin =& Skin::newFromKey( $userSkin );
- wfProfileOut( __METHOD__ );
- }
- if( $t || !$this->mSkin->getTitle() ) {
- if ( !$t ) {
- global $wgOut;
- $t = $wgOut->getTitle();
- }
- $this->mSkin->setTitle( $t );
+ global $wgHiddenPrefs;
+ if( !in_array( 'skin', $wgHiddenPrefs ) ) {
+ global $wgRequest;
+ # get the user skin
+ $userSkin = $this->getOption( 'skin' );
+ $userSkin = $wgRequest->getVal( 'useskin', $userSkin );
+ } else {
+ # if we're not allowing users to override, then use the default
+ global $wgDefaultSkin;
+ $userSkin = $wgDefaultSkin;
}
- return $this->mSkin;
+
+ $skin = Skin::newFromKey( $userSkin );
+ wfProfileOut( __METHOD__ );
+
+ return $skin;
}
/**
@@ -2424,7 +2438,9 @@ class User {
$this->mOptionsLoaded = true;
$this->mOptionOverrides = array();
- $this->mOptions = array();
+ // If an option is not set in $str, use the default value
+ $this->mOptions = self::getDefaultOptions();
+
$a = explode( "\n", $str );
foreach ( $a as $s ) {
$m = array();
@@ -2536,8 +2552,8 @@ class User {
'user_newpassword' => $this->mNewpassword,
'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
'user_real_name' => $this->mRealName,
- 'user_email' => $this->mEmail,
- 'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
+ 'user_email' => $this->mEmail,
+ 'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
'user_options' => '',
'user_touched' => $dbw->timestamp( $this->mTouched ),
'user_token' => $this->mToken,
@@ -2595,12 +2611,13 @@ class User {
}
$dbw = wfGetDB( DB_MASTER );
$seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
+
$fields = array(
'user_id' => $seqVal,
'user_name' => $name,
'user_password' => $user->mPassword,
'user_newpassword' => $user->mNewpassword,
- 'user_newpass_time' => $dbw->timestamp( $user->mNewpassTime ),
+ 'user_newpass_time' => $dbw->timestampOrNull( $user->mNewpassTime ),
'user_email' => $user->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
'user_real_name' => $user->mRealName,
@@ -2634,7 +2651,7 @@ class User {
'user_name' => $this->mName,
'user_password' => $this->mPassword,
'user_newpassword' => $this->mNewpassword,
- 'user_newpass_time' => $dbw->timestamp( $this->mNewpassTime ),
+ 'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
'user_email' => $this->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
'user_real_name' => $this->mRealName,
@@ -2682,6 +2699,7 @@ class User {
* which will give them a chance to modify this key based on their own
* settings.
*
+ * @deprecated use the ParserOptions object to get the relevant options
* @return \string Page rendering hash
*/
function getPageRenderingHash() {
@@ -2689,13 +2707,15 @@ class User {
if( $this->mHash ){
return $this->mHash;
}
+ wfDeprecated( __METHOD__ );
// stubthreshold is only included below for completeness,
- // it will always be 0 when this function is called by parsercache.
+ // since it disables the parser cache, its value will always
+ // be 0 when this function is called by parsercache.
$confstr = $this->getOption( 'math' );
- $confstr .= '!' . $this->getOption( 'stubthreshold' );
- if ( $wgUseDynamicDates ) {
+ $confstr .= '!' . $this->getStubThreshold();
+ if ( $wgUseDynamicDates ) { # This is wrong (bug 24714)
$confstr .= '!' . $this->getDatePreference();
}
$confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
@@ -2705,6 +2725,9 @@ class User {
$extra = $wgContLang->getExtraHashOptions();
$confstr .= $extra;
+ // Since the skin could be overloading link(), it should be
+ // included here but in practice, none of our skins do that.
+
$confstr .= $wgRenderHashAppend;
// Give a chance for extensions to modify the hash, if they have
@@ -2728,7 +2751,7 @@ class User {
/**
* Get whether the user is blocked from using Special:Emailuser.
- * @return \bool True if blocked
+ * @return Boolean: True if blocked
*/
function isBlockedFromEmailuser() {
$this->getBlockedStatus();
@@ -2737,23 +2760,16 @@ class User {
/**
* Get whether the user is allowed to create an account.
- * @return \bool True if allowed
+ * @return Boolean: True if allowed
*/
function isAllowedToCreateAccount() {
return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
}
/**
- * @deprecated
- */
- function setLoaded( $loaded ) {
- wfDeprecated( __METHOD__ );
- }
-
- /**
* Get this user's personal page title.
*
- * @return \type{Title} User's personal page title
+ * @return Title: User's personal page title
*/
function getUserPage() {
return Title::makeTitle( NS_USER, $this->getName() );
@@ -2762,7 +2778,7 @@ class User {
/**
* Get this user's talk page title.
*
- * @return \type{Title} User's talk page title
+ * @return Title: User's talk page title
*/
function getTalkPage() {
$title = $this->getUserPage();
@@ -2771,24 +2787,24 @@ class User {
/**
* Get the maximum valid user ID.
- * @return \int User ID
+ * @return Integer: User ID
* @static
*/
function getMaxID() {
static $res; // cache
- if ( isset( $res ) )
+ if ( isset( $res ) ) {
return $res;
- else {
+ } else {
$dbr = wfGetDB( DB_SLAVE );
- return $res = $dbr->selectField( 'user', 'max(user_id)', false, 'User::getMaxID' );
+ return $res = $dbr->selectField( 'user', 'max(user_id)', false, __METHOD__ );
}
}
/**
* Determine whether the user is a newbie. Newbies are either
* anonymous IPs, or the most recently created accounts.
- * @return \bool True if the user is a newbie
+ * @return Boolean: True if the user is a newbie
*/
function isNewbie() {
return !$this->isAllowed( 'autoconfirmed' );
@@ -2796,8 +2812,8 @@ class User {
/**
* Check to see if the given clear-text password is one of the accepted passwords
- * @param $password \string user password.
- * @return \bool True if the given password is correct, otherwise False.
+ * @param $password String: user password.
+ * @return Boolean: True if the given password is correct, otherwise False.
*/
function checkPassword( $password ) {
global $wgAuth;
@@ -2807,7 +2823,7 @@ class User {
// are shorter than this, doesn't mean people wont be able
// to. Certain authentication plugins do NOT want to save
// domain passwords in a mysql database, so we should
- // check this (incase $wgAuth->strict() is false).
+ // check this (in case $wgAuth->strict() is false).
if( !$this->isValidPassword( $password ) ) {
return false;
}
@@ -2837,12 +2853,14 @@ class User {
/**
* Check if the given clear-text password matches the temporary password
* sent by e-mail for password reset operations.
- * @return \bool True if matches, false otherwise
+ * @return Boolean: True if matches, false otherwise
*/
function checkTemporaryPassword( $plaintext ) {
global $wgNewPasswordExpiry;
if( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
- $this->load();
+ if ( is_null( $this->mNewpassTime ) ) {
+ return true;
+ }
$expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgNewPasswordExpiry;
return ( time() < $expiry );
} else {
@@ -2895,7 +2913,7 @@ class User {
*
* @param $val \string Input value to compare
* @param $salt \string Optional function-specific data for hashing
- * @return \bool Whether the token matches
+ * @return Boolean: Whether the token matches
*/
function matchEditToken( $val, $salt = '' ) {
$sessionToken = $this->editToken( $salt );
@@ -2911,7 +2929,7 @@ class User {
*
* @param $val \string Input value to compare
* @param $salt \string Optional function-specific data for hashing
- * @return \bool Whether the token matches
+ * @return Boolean: Whether the token matches
*/
function matchEditTokenNoSuffix( $val, $salt = '' ) {
$sessionToken = $this->editToken( $salt );
@@ -2922,9 +2940,10 @@ class User {
* Generate a new e-mail confirmation token and send a confirmation/invalidation
* mail to the user's given address.
*
- * @return \types{\bool,\type{WikiError}} True on success, a WikiError object on failure.
+ * @param $type String: message to send, either "created", "changed" or "set"
+ * @return Status object
*/
- function sendConfirmationMail() {
+ function sendConfirmationMail( $type = 'created' ) {
global $wgLang;
$expiration = null; // gets passed-by-ref and defined in next line.
$token = $this->confirmationToken( $expiration );
@@ -2932,8 +2951,16 @@ class User {
$invalidateURL = $this->invalidationTokenUrl( $token );
$this->saveSettings();
+ if ( $type == 'created' || $type === false ) {
+ $message = 'confirmemail_body';
+ } elseif ( $type === true ) {
+ $message = 'confirmemail_body_changed';
+ } else {
+ $message = 'confirmemail_body_' . $type;
+ }
+
return $this->sendMail( wfMsg( 'confirmemail_subject' ),
- wfMsg( 'confirmemail_body',
+ wfMsg( $message,
wfGetIP(),
$this->getName(),
$url,
@@ -2951,16 +2978,17 @@ class User {
* @param $body \string Message body
* @param $from \string Optional From address; if unspecified, default $wgPasswordSender will be used
* @param $replyto \string Reply-To address
- * @return \types{\bool,\type{WikiError}} True on success, a WikiError object on failure
+ * @return Status object
*/
function sendMail( $subject, $body, $from = null, $replyto = null ) {
if( is_null( $from ) ) {
- global $wgPasswordSender;
- $from = $wgPasswordSender;
+ global $wgPasswordSender, $wgPasswordSenderName;
+ $sender = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
+ } else {
+ $sender = new MailAddress( $from );
}
$to = new MailAddress( $this );
- $sender = new MailAddress( $from );
return UserMailer::send( $to, $sender, $subject, $body, $replyto );
}
@@ -3069,7 +3097,7 @@ class User {
/**
* Is this user allowed to send e-mails within limits of current
* site configuration?
- * @return \bool True if allowed
+ * @return Boolean: True if allowed
*/
function canSendEmail() {
global $wgEnableEmail, $wgEnableUserEmail;
@@ -3084,7 +3112,7 @@ class User {
/**
* Is this user allowed to receive e-mails within limits of current
* site configuration?
- * @return \bool True if allowed
+ * @return Boolean: True if allowed
*/
function canReceiveEmail() {
return $this->isEmailConfirmed() && !$this->getOption( 'disablemail' );
@@ -3098,7 +3126,7 @@ class User {
* confirmed their address by returning a code or using a password
* sent to the address from the wiki.
*
- * @return \bool True if confirmed
+ * @return Boolean: True if confirmed
*/
function isEmailConfirmed() {
global $wgEmailAuthentication;
@@ -3119,7 +3147,7 @@ class User {
/**
* Check whether there is an outstanding request for e-mail confirmation.
- * @return \bool True if pending
+ * @return Boolean: True if pending
*/
function isEmailConfirmationPending() {
global $wgEmailAuthentication;
@@ -3210,8 +3238,6 @@ class User {
* @return \string Localized descriptive group name
*/
static function getGroupName( $group ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$key = "group-$group";
$name = wfMsg( $key );
return $name == '' || wfEmptyMsg( $key, $name )
@@ -3226,8 +3252,6 @@ class User {
* @return \string Localized name for group member
*/
static function getGroupMember( $group ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$key = "group-$group-member";
$name = wfMsg( $key );
return $name == '' || wfEmptyMsg( $key, $name )
@@ -3239,7 +3263,7 @@ class User {
* Return the set of defined explicit groups.
* The implicit groups (by default *, 'user' and 'autoconfirmed')
* are not included, as they are defined automatically, not in the database.
- * @return \type{\arrayof{\string}} Array of internal group names
+ * @return Array of internal group names
*/
static function getAllGroups() {
global $wgGroupPermissions, $wgRevokePermissions;
@@ -3251,7 +3275,7 @@ class User {
/**
* Get a list of all available permissions.
- * @return \type{\arrayof{\string}} Array of permission names
+ * @return Array of permission names
*/
static function getAllRights() {
if ( self::$mAllRights === false ) {
@@ -3284,8 +3308,6 @@ class User {
* @return \types{\type{Title},\bool} Title of the page if it exists, false otherwise
*/
static function getGroupPage( $group ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$page = wfMsgForContent( 'grouppage-' . $group );
if( !wfEmptyMsg( 'grouppage-' . $group, $page ) ) {
$title = Title::newFromText( $page );
@@ -3498,8 +3520,6 @@ class User {
* @return \string Localized description of the right
*/
static function getRightDescription( $right ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$key = "right-$right";
$name = wfMsg( $key );
return $name == '' || wfEmptyMsg( $key, $name )
@@ -3556,10 +3576,9 @@ class User {
* @param $hash \string Password hash
* @param $password \string Plain-text password to compare
* @param $userId \string User ID for old-style password salt
- * @return \bool
+ * @return Boolean:
*/
static function comparePasswords( $hash, $password, $userId = false ) {
- $m = false;
$type = substr( $hash, 0, 3 );
$result = false;
@@ -3582,28 +3601,34 @@ class User {
/**
* Add a newuser log entry for this user
+ *
* @param $byEmail Boolean: account made by email?
+ * @param $reason String: user supplied reason
*/
- public function addNewUserLogEntry( $byEmail = false ) {
- global $wgUser, $wgNewUserLog;
+ public function addNewUserLogEntry( $byEmail = false, $reason = '' ) {
+ global $wgUser, $wgContLang, $wgNewUserLog;
if( empty( $wgNewUserLog ) ) {
return true; // disabled
}
if( $this->getName() == $wgUser->getName() ) {
$action = 'create';
- $message = '';
} else {
$action = 'create2';
- $message = $byEmail
- ? wfMsgForContent( 'newuserlog-byemail' )
- : '';
+ if ( $byEmail ) {
+ if ( $reason === '' ) {
+ $reason = wfMsgForContent( 'newuserlog-byemail' );
+ } else {
+ $reason = $wgContLang->commaList( array(
+ $reason, wfMsgForContent( 'newuserlog-byemail' ) ) );
+ }
+ }
}
$log = new LogPage( 'newusers' );
$log->addEntry(
$action,
$this->getUserPage(),
- $message,
+ $reason,
array( $this->getId() )
);
return true;
@@ -3614,8 +3639,8 @@ class User {
* Used by things like CentralAuth and perhaps other authplugins.
*/
public function addNewUserLogEntryAutoCreate() {
- global $wgNewUserLog;
- if( empty( $wgNewUserLog ) ) {
+ global $wgNewUserLog, $wgLogAutocreatedAccounts;
+ if( !$wgNewUserLog || !$wgLogAutocreatedAccounts ) {
return true; // disabled
}
$log = new LogPage( 'newusers', false );
@@ -3632,12 +3657,12 @@ class User {
// Maybe load from the object
if ( !is_null( $this->mOptionOverrides ) ) {
- wfDebug( "Loading options for user " . $this->getId() . " from override cache.\n" );
+ wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
foreach( $this->mOptionOverrides as $key => $value ) {
$this->mOptions[$key] = $value;
}
} else {
- wfDebug( "Loading options for user " . $this->getId() . " from database.\n" );
+ wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
// Load from database
$dbr = wfGetDB( DB_SLAVE );
@@ -3648,7 +3673,7 @@ class User {
__METHOD__
);
- while( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$this->mOptionOverrides[$row->up_property] = $row->up_value;
$this->mOptions[$row->up_property] = $row->up_value;
}
@@ -3718,6 +3743,10 @@ class User {
*
* Obviously, you still need to do server-side checking.
*
+ * NOTE: A combination of bugs in various browsers means that this function
+ * actually just returns array() unconditionally at the moment. May as
+ * well keep it around for when the browser bugs get fixed, though.
+ *
* @return array Array of HTML attributes suitable for feeding to
* Html::element(), directly or indirectly. (Don't feed to Xml::*()!
* That will potentially output invalid XHTML 1.0 Transitional, and will
@@ -3732,7 +3761,14 @@ class User {
# Note that the pattern requirement will always be satisfied if the
# input is empty, so we need required in all cases.
- $ret = array( 'required' );
+ #
+ # FIXME (bug 23769): This needs to not claim the password is required
+ # if e-mail confirmation is being used. Since HTML5 input validation
+ # is b0rked anyway in some browsers, just return nothing. When it's
+ # re-enabled, fix this code to not output required for e-mail
+ # registration.
+ #$ret = array( 'required' );
+ $ret = array();
# We can't actually do this right now, because Opera 9.6 will print out
# the entered password visibly in its error message! When other
@@ -3750,4 +3786,92 @@ class User {
return $ret;
}
+
+ /**
+ * Format the user message using a hook, a template, or, failing these, a static format.
+ * @param $subject String the subject of the message
+ * @param $text String the content of the message
+ * @param $signature String the signature, if provided.
+ */
+ static protected function formatUserMessage( $subject, $text, $signature ) {
+ if ( wfRunHooks( 'FormatUserMessage',
+ array( $subject, &$text, $signature ) ) ) {
+
+ $signature = empty($signature) ? "~~~~~" : "{$signature} ~~~~~";
+
+ $template = Title::newFromText( wfMsgForContent( 'usermessage-template' ) );
+ if ( !$template
+ || $template->getNamespace() !== NS_TEMPLATE
+ || !$template->exists() ) {
+ $text = "\n== $subject ==\n\n$text\n\n-- $signature";
+ } else {
+ $text = '{{'. $template->getText()
+ . " | subject=$subject | body=$text | signature=$signature }}";
+ }
+ }
+
+ return $text;
+ }
+
+ /**
+ * Leave a user a message
+ * @param $subject String the subject of the message
+ * @param $text String the message to leave
+ * @param $signature String Text to leave in the signature
+ * @param $summary String the summary for this change, defaults to
+ * "Leave system message."
+ * @param $editor User The user leaving the message, defaults to
+ * "{{MediaWiki:usermessage-editor}}"
+ * @param $flags Int default edit flags
+ *
+ * @return boolean true if it was successful
+ */
+ public function leaveUserMessage( $subject, $text, $signature = "",
+ $summary = null, $editor = null, $flags = 0 ) {
+ if ( !isset( $summary ) ) {
+ $summary = wfMsgForContent( 'usermessage-summary' );
+ }
+
+ if ( !isset( $editor ) ) {
+ $editor = User::newFromName( wfMsgForContent( 'usermessage-editor' ) );
+ if ( !$editor->isLoggedIn() ) {
+ $editor->addToDatabase();
+ }
+ }
+
+ $article = new Article( $this->getTalkPage() );
+ wfRunHooks( 'SetupUserMessageArticle',
+ array( $this, &$article, $subject, $text, $signature, $summary, $editor ) );
+
+
+ $text = self::formatUserMessage( $subject, $text, $signature );
+ $flags = $article->checkFlags( $flags );
+
+ if ( $flags & EDIT_UPDATE ) {
+ $text = $article->getContent() . $text;
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+
+ try {
+ $status = $article->doEdit( $text, $summary, $flags, false, $editor );
+ } catch ( DBQueryError $e ) {
+ $status = Status::newFatal("DB Error");
+ }
+
+ if ( $status->isGood() ) {
+ // Set newtalk with the right user ID
+ $this->setNewtalk( true );
+ wfRunHooks( 'AfterUserMessage',
+ array( $this, $article, $summary, $text, $signature, $summary, $editor ) );
+ $dbw->commit();
+ } else {
+ // The article was concurrently created
+ wfDebug( __METHOD__ . ": Error ".$status->getWikiText() );
+ $dbw->rollback();
+ }
+
+ return $status->isGood();
+ }
}
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
index daf8b621..c15843d9 100644
--- a/includes/UserMailer.php
+++ b/includes/UserMailer.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Classes used to send e-mails
+ *
* 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,10 +17,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author <brion@pobox.com>
* @author <mail@tgries.de>
* @author Tim Starling
- *
*/
@@ -31,9 +33,10 @@ class MailAddress {
/**
* @param $address Mixed: string with an email address, or a User object
* @param $name String: human-readable name if a string address is given
+ * @param $realName String: human-readable real name if a string address is given
*/
function __construct( $address, $name = null, $realName = null ) {
- if( is_object( $address ) && $address instanceof User ) {
+ if ( is_object( $address ) && $address instanceof User ) {
$this->address = $address->getEmail();
$this->name = $address->getName();
$this->realName = $address->getRealName();
@@ -52,11 +55,11 @@ class MailAddress {
# PHP's mail() implementation under Windows is somewhat shite, and
# can't handle "Joe Bloggs <joe@bloggs.com>" format email addresses,
# so don't bother generating them
- if( $this->name != '' && !wfIsWindows() ) {
+ if ( $this->name != '' && !wfIsWindows() ) {
global $wgEnotifUseRealName;
$name = ( $wgEnotifUseRealName && $this->realName ) ? $this->realName : $this->name;
$quoted = wfQuotedPrintable( $name );
- if( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
+ if ( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
$quoted = '"' . $quoted . '"';
}
return "$quoted <{$this->address}>";
@@ -75,19 +78,20 @@ class MailAddress {
* Collection of static functions for sending mail
*/
class UserMailer {
+ static $mErrorString;
+
/**
* Send mail using a PEAR mailer
*/
- protected static function sendWithPear($mailer, $dest, $headers, $body)
- {
- $mailResult = $mailer->send($dest, $headers, $body);
+ protected static function sendWithPear( $mailer, $dest, $headers, $body ) {
+ $mailResult = $mailer->send( $dest, $headers, $body );
# Based on the result return an error string,
- if( PEAR::isError( $mailResult ) ) {
+ if ( PEAR::isError( $mailResult ) ) {
wfDebug( "PEAR::Mail failed: " . $mailResult->getMessage() . "\n" );
- return new WikiError( $mailResult->getMessage() );
+ return Status::newFatal( 'pear-mail-error', $mailResult->getMessage() );
} else {
- return true;
+ return Status::newGood();
}
}
@@ -97,41 +101,58 @@ class UserMailer {
* array of parameters. It requires PEAR:Mail to do that.
* Otherwise it just uses the standard PHP 'mail' function.
*
- * @param $to MailAddress: recipient's email
+ * @param $to MailAddress: recipient's email (or an array of them)
* @param $from MailAddress: sender's email
* @param $subject String: email's subject.
* @param $body String: email's text.
* @param $replyto MailAddress: optional reply-to email (default: null).
* @param $contentType String: optional custom Content-Type
- * @return mixed True on success, a WikiError object on failure.
+ * @return Status object
*/
- static function send( $to, $from, $subject, $body, $replyto=null, $contentType=null ) {
- global $wgSMTP, $wgOutputEncoding, $wgErrorString, $wgEnotifImpersonal;
- global $wgEnotifMaxRecips;
+ public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = null ) {
+ global $wgSMTP, $wgOutputEncoding, $wgEnotifImpersonal;
+ global $wgEnotifMaxRecips, $wgAdditionalMailParams;
if ( is_array( $to ) ) {
- wfDebug( __METHOD__.': sending mail to ' . implode( ',', $to ) . "\n" );
+ // This wouldn't be necessary if implode() worked on arrays of
+ // objects using __toString(). http://bugs.php.net/bug.php?id=36612
+ foreach ( $to as $t ) {
+ $emails .= $t->toString() . ",";
+ }
+ $emails = rtrim( $emails, ',' );
+ wfDebug( __METHOD__ . ': sending mail to ' . $emails . "\n" );
} else {
- wfDebug( __METHOD__.': sending mail to ' . implode( ',', array( $to->toString() ) ) . "\n" );
+ wfDebug( __METHOD__ . ': sending mail to ' . implode( ',', array( $to->toString() ) ) . "\n" );
}
- if (is_array( $wgSMTP )) {
+ if ( is_array( $wgSMTP ) ) {
+ $found = false;
+ $pathArray = explode( PATH_SEPARATOR, get_include_path() );
+ foreach ( $pathArray as $path ) {
+ if ( file_exists( $path . DIRECTORY_SEPARATOR . 'Mail.php' ) ) {
+ $found = true;
+ break;
+ }
+ }
+ if ( !$found ) {
+ throw new MWException( 'PEAR mail package is not installed' );
+ }
require_once( 'Mail.php' );
- $msgid = str_replace(" ", "_", microtime());
- if (function_exists('posix_getpid'))
+ $msgid = str_replace( " ", "_", microtime() );
+ if ( function_exists( 'posix_getpid' ) )
$msgid .= '.' . posix_getpid();
- if (is_array($to)) {
+ if ( is_array( $to ) ) {
$dest = array();
- foreach ($to as $u)
+ foreach ( $to as $u )
$dest[] = $u->address;
} else
$dest = $to->address;
$headers['From'] = $from->toString();
- if ($wgEnotifImpersonal) {
+ if ( $wgEnotifImpersonal ) {
$headers['To'] = 'undisclosed-recipients:;';
}
else {
@@ -144,26 +165,33 @@ class UserMailer {
$headers['Subject'] = wfQuotedPrintable( $subject );
$headers['Date'] = date( 'r' );
$headers['MIME-Version'] = '1.0';
- $headers['Content-type'] = (is_null($contentType) ?
- 'text/plain; charset='.$wgOutputEncoding : $contentType);
+ $headers['Content-type'] = ( is_null( $contentType ) ?
+ 'text/plain; charset=' . $wgOutputEncoding : $contentType );
$headers['Content-transfer-encoding'] = '8bit';
$headers['Message-ID'] = "<$msgid@" . $wgSMTP['IDHost'] . '>'; // FIXME
$headers['X-Mailer'] = 'MediaWiki mailer';
+ wfSuppressWarnings();
+
// Create the mail object using the Mail::factory method
- $mail_object =& Mail::factory('smtp', $wgSMTP);
- if( PEAR::isError( $mail_object ) ) {
+ $mail_object =& Mail::factory( 'smtp', $wgSMTP );
+ if ( PEAR::isError( $mail_object ) ) {
wfDebug( "PEAR::Mail factory failed: " . $mail_object->getMessage() . "\n" );
- return new WikiError( $mail_object->getMessage() );
+ wfRestoreWarnings();
+ return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
}
wfDebug( "Sending mail via PEAR::Mail to $dest\n" );
$chunks = array_chunk( (array)$dest, $wgEnotifMaxRecips );
- foreach ($chunks as $chunk) {
- $e = self::sendWithPear($mail_object, $chunk, $headers, $body);
- if( WikiError::isError( $e ) )
- return $e;
+ foreach ( $chunks as $chunk ) {
+ $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
+ if ( !$status->isOK() ) {
+ wfRestoreWarnings();
+ return $status;
+ }
}
+ wfRestoreWarnings();
+ return Status::newGood();
} else {
# In the following $headers = expression we removed "Reply-To: {$from}\r\n" , because it is treated differently
# (fifth parameter of the PHP mail function, see some lines below)
@@ -176,68 +204,63 @@ class UserMailer {
} else {
$endl = "\n";
}
- $ctype = (is_null($contentType) ?
- 'text/plain; charset='.$wgOutputEncoding : $contentType);
+ $ctype = ( is_null( $contentType ) ?
+ 'text/plain; charset=' . $wgOutputEncoding : $contentType );
$headers =
"MIME-Version: 1.0$endl" .
"Content-type: $ctype$endl" .
"Content-Transfer-Encoding: 8bit$endl" .
- "X-Mailer: MediaWiki mailer$endl".
+ "X-Mailer: MediaWiki mailer$endl" .
'From: ' . $from->toString();
- if ($replyto) {
+ if ( $replyto ) {
$headers .= "{$endl}Reply-To: " . $replyto->toString();
}
wfDebug( "Sending mail via internal mail() function\n" );
-
- $wgErrorString = '';
+
+ self::$mErrorString = '';
$html_errors = ini_get( 'html_errors' );
ini_set( 'html_errors', '0' );
set_error_handler( array( 'UserMailer', 'errorHandler' ) );
- if (function_exists('mail')) {
- if (is_array($to)) {
- foreach ($to as $recip) {
- $sent = mail( $recip->toString(), wfQuotedPrintable( $subject ), $body, $headers );
- }
- } else {
- $sent = mail( $to->toString(), wfQuotedPrintable( $subject ), $body, $headers );
+ if ( is_array( $to ) ) {
+ foreach ( $to as $recip ) {
+ $sent = mail( $recip->toString(), wfQuotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
}
} else {
- $wgErrorString = 'PHP is not configured to send mail';
+ $sent = mail( $to->toString(), wfQuotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
}
restore_error_handler();
ini_set( 'html_errors', $html_errors );
- if ( $wgErrorString ) {
- wfDebug( "Error sending mail: $wgErrorString\n" );
- return new WikiError( $wgErrorString );
- } elseif (! $sent) {
- //mail function only tells if there's an error
+ if ( self::$mErrorString ) {
+ wfDebug( "Error sending mail: " . self::$mErrorString . "\n" );
+ return Status::newFatal( 'php-mail-error', self::$mErrorString );
+ } elseif ( ! $sent ) {
+ // mail function only tells if there's an error
wfDebug( "Error sending mail\n" );
- return new WikiError( 'mailer error' );
+ return Status::newFatal( 'php-mail-error-unknown' );
} else {
- return true;
+ return Status::newGood();
}
}
}
/**
- * Get the mail error message in global $wgErrorString
+ * Set the mail error message in self::$mErrorString
*
* @param $code Integer: error number
* @param $string String: error message
*/
static function errorHandler( $code, $string ) {
- global $wgErrorString;
- $wgErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
+ self::$mErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
}
/**
* Converts a string into a valid RFC 822 "phrase", such as is used for the sender name
*/
- static function rfc822Phrase( $phrase ) {
+ public static function rfc822Phrase( $phrase ) {
$phrase = strtr( $phrase, array( "\r" => '', "\n" => '', '"' => '' ) );
return '"' . $phrase . '"';
}
@@ -281,15 +304,15 @@ class EmailNotification {
* @param $minorEdit
* @param $oldid (default: false)
*/
- function notifyOnPageChange($editor, $title, $timestamp, $summary, $minorEdit, $oldid = false) {
+ public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false ) {
global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker;
- if ($title->getNamespace() < 0)
+ if ( $title->getNamespace() < 0 )
return;
// Build a list of users to notfiy
$watchers = array();
- if ($wgEnotifWatchlist || $wgShowUpdatedMarker) {
+ if ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) {
$dbw = wfGetDB( DB_MASTER );
$res = $dbw->select( array( 'watchlist' ),
array( 'wl_user' ),
@@ -300,10 +323,10 @@ class EmailNotification {
'wl_notificationtimestamp IS NULL',
), __METHOD__
);
- while ($row = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$watchers[] = intval( $row->wl_user );
}
- if ($watchers) {
+ if ( $watchers ) {
// Update wl_notificationtimestamp for all watching users except
// the editor
$dbw->begin();
@@ -320,7 +343,7 @@ class EmailNotification {
}
}
- if ($wgEnotifUseJobQ) {
+ if ( $wgEnotifUseJobQ ) {
$params = array(
"editor" => $editor->getName(),
"editorID" => $editor->getID(),
@@ -328,7 +351,7 @@ class EmailNotification {
"summary" => $summary,
"minorEdit" => $minorEdit,
"oldid" => $oldid,
- "watchers" => $watchers);
+ "watchers" => $watchers );
$job = new EnotifNotifyJob( $title, $params );
$job->insert();
} else {
@@ -351,11 +374,10 @@ class EmailNotification {
* @param $oldid int Revision ID
* @param $watchers array of user IDs
*/
- function actuallyNotifyOnPageChange($editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers) {
+ public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers ) {
# we use $wgPasswordSender as sender's address
global $wgEnotifWatchlist;
global $wgEnotifMinorEdits, $wgEnotifUserTalk;
- global $wgEnotifImpersonal;
wfProfileIn( __METHOD__ );
@@ -363,9 +385,7 @@ class EmailNotification {
# 1. EmailNotification for pages (other than user_talk pages) must be enabled
# 2. minor edits (changes) are only regarded if the global flag indicates so
- $isUserTalkPage = ($title->getNamespace() == NS_USER_TALK);
- $enotifusertalkpage = ($isUserTalkPage && $wgEnotifUserTalk);
- $enotifwatchlistpage = $wgEnotifWatchlist;
+ $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
$this->title = $title;
$this->timestamp = $timestamp;
@@ -377,23 +397,23 @@ class EmailNotification {
$userTalkId = false;
- if ( !$minorEdit || ($wgEnotifMinorEdits && !$editor->isAllowed('nominornewtalk') ) ) {
+ if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
if ( $wgEnotifUserTalk && $isUserTalkPage ) {
$targetUser = User::newFromName( $title->getText() );
if ( !$targetUser || $targetUser->isAnon() ) {
- wfDebug( __METHOD__.": user talk page edited, but user does not exist\n" );
+ wfDebug( __METHOD__ . ": user talk page edited, but user does not exist\n" );
} elseif ( $targetUser->getId() == $editor->getId() ) {
- wfDebug( __METHOD__.": user edited their own talk page, no notification sent\n" );
- } elseif( $targetUser->getOption( 'enotifusertalkpages' ) ) {
- if( $targetUser->isEmailConfirmed() ) {
- wfDebug( __METHOD__.": sending talk page update notification\n" );
+ wfDebug( __METHOD__ . ": user edited their own talk page, no notification sent\n" );
+ } elseif ( $targetUser->getOption( 'enotifusertalkpages' ) ) {
+ if ( $targetUser->isEmailConfirmed() ) {
+ wfDebug( __METHOD__ . ": sending talk page update notification\n" );
$this->compose( $targetUser );
$userTalkId = $targetUser->getId();
} else {
- wfDebug( __METHOD__.": talk page owner doesn't have validated email\n" );
+ wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
}
} else {
- wfDebug( __METHOD__.": talk page owner doesn't want notifications\n" );
+ wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
}
}
@@ -402,7 +422,7 @@ class EmailNotification {
$userArray = UserArray::newFromIDs( $watchers );
foreach ( $userArray as $watchingUser ) {
if ( $watchingUser->getOption( 'enotifwatchlistpages' ) &&
- ( !$minorEdit || $watchingUser->getOption('enotifminoredits') ) &&
+ ( !$minorEdit || $watchingUser->getOption( 'enotifminoredits' ) ) &&
$watchingUser->isEmailConfirmed() &&
$watchingUser->getID() != $userTalkId )
{
@@ -423,17 +443,17 @@ class EmailNotification {
}
/**
- * @private
+ * Generate the generic "this page has been changed" e-mail text.
*/
- function composeCommonMailtext() {
- global $wgPasswordSender, $wgNoReplyAddress;
+ private function composeCommonMailtext() {
+ global $wgPasswordSender, $wgPasswordSenderName, $wgNoReplyAddress;
global $wgEnotifFromEditor, $wgEnotifRevealEditorAddress;
global $wgEnotifImpersonal, $wgEnotifUseRealName;
$this->composed_common = true;
- $summary = ($this->summary == '') ? ' - ' : $this->summary;
- $medit = ($this->minorEdit) ? wfMsg( 'minoredit' ) : '';
+ $summary = ( $this->summary == '' ) ? ' - ' : $this->summary;
+ $medit = ( $this->minorEdit ) ? wfMsgForContent( 'minoredit' ) : '';
# You as the WikiAdmin and Sysops can make use of plenty of
# named variables when composing your notification emails while
@@ -445,7 +465,7 @@ class EmailNotification {
$replyto = ''; /* fail safe */
$keys = array();
- if( $this->oldid ) {
+ if ( $this->oldid ) {
$difflink = $this->title->getFullUrl( 'diff=0&oldid=' . $this->oldid );
$keys['$NEWPAGE'] = wfMsgForContent( 'enotif_lastvisited', $difflink );
$keys['$OLDID'] = $this->oldid;
@@ -457,13 +477,14 @@ class EmailNotification {
$keys['$CHANGEDORCREATED'] = wfMsgForContent( 'created' );
}
- if ($wgEnotifImpersonal && $this->oldid)
+ if ( $wgEnotifImpersonal && $this->oldid ) {
/*
* For impersonal mail, show a diff link to the last
* revision.
*/
- $keys['$NEWPAGE'] = wfMsgForContent('enotif_lastdiff',
- $this->title->getFullURL("oldid={$this->oldid}&diff=prev"));
+ $keys['$NEWPAGE'] = wfMsgForContent( 'enotif_lastdiff',
+ $this->title->getFullURL( "oldid={$this->oldid}&diff=next" ) );
+ }
$body = strtr( $body, $keys );
$pagetitle = $this->title->getPrefixedText();
@@ -481,12 +502,12 @@ class EmailNotification {
# global configuration level.
$editor = $this->editor;
$name = $wgEnotifUseRealName ? $editor->getRealName() : $editor->getName();
- $adminAddress = new MailAddress( $wgPasswordSender, 'WikiAdmin' );
+ $adminAddress = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
$editorAddress = new MailAddress( $editor );
- if( $wgEnotifRevealEditorAddress
+ if ( $wgEnotifRevealEditorAddress
&& ( $editor->getEmail() != '' )
&& $editor->getOption( 'enotifrevealaddr' ) ) {
- if( $wgEnotifFromEditor ) {
+ if ( $wgEnotifFromEditor ) {
$from = $editorAddress;
} else {
$from = $adminAddress;
@@ -497,14 +518,14 @@ class EmailNotification {
$replyto = new MailAddress( $wgNoReplyAddress );
}
- if( $editor->isIP( $name ) ) {
- #real anon (user:xxx.xxx.xxx.xxx)
- $utext = wfMsgForContent('enotif_anon_editor', $name);
- $subject = str_replace('$PAGEEDITOR', $utext, $subject);
+ if ( $editor->isIP( $name ) ) {
+ # real anon (user:xxx.xxx.xxx.xxx)
+ $utext = wfMsgForContent( 'enotif_anon_editor', $name );
+ $subject = str_replace( '$PAGEEDITOR', $utext, $subject );
$keys['$PAGEEDITOR'] = $utext;
$keys['$PAGEEDITOR_EMAIL'] = wfMsgForContent( 'noemailtitle' );
} else {
- $subject = str_replace('$PAGEEDITOR', $name, $subject);
+ $subject = str_replace( '$PAGEEDITOR', $name, $subject );
$keys['$PAGEEDITOR'] = $name;
$emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $name );
$keys['$PAGEEDITOR_EMAIL'] = $emailPage->getFullUrl();
@@ -555,9 +576,8 @@ class EmailNotification {
* timestamp in proper timezone, etc) and sends it out.
* Returns true if the mail was sent successfully.
*
- * @param User $watchingUser
- * @param object $mail
- * @return bool
+ * @param $watchingUser User object
+ * @return Boolean
* @private
*/
function sendPersonalised( $watchingUser ) {
@@ -567,7 +587,7 @@ class EmailNotification {
// The mail command will not parse this properly while talking with the MTA.
$to = new MailAddress( $watchingUser );
$name = $wgEnotifUseRealName ? $watchingUser->getRealName() : $watchingUser->getName();
- $body = str_replace( '$WATCHINGUSERNAME', $name , $this->body );
+ $body = str_replace( '$WATCHINGUSERNAME', $name, $this->body );
$timecorrection = $watchingUser->getOption( 'timecorrection' );
@@ -575,15 +595,15 @@ class EmailNotification {
# expressed in terms of individual local time of the notification
# recipient, i.e. watching user
$body = str_replace(
- array( '$PAGEEDITDATEANDTIME',
+ array( '$PAGEEDITDATEANDTIME',
'$PAGEEDITDATE',
'$PAGEEDITTIME' ),
- array( $wgContLang->timeanddate( $this->timestamp, true, false, $timecorrection ),
+ array( $wgContLang->timeanddate( $this->timestamp, true, false, $timecorrection ),
$wgContLang->date( $this->timestamp, true, false, $timecorrection ),
$wgContLang->time( $this->timestamp, true, false, $timecorrection ) ),
- $body);
+ $body );
- return UserMailer::send($to, $this->from, $this->subject, $body, $this->replyto);
+ return UserMailer::send( $to, $this->from, $this->subject, $body, $this->replyto );
}
/**
@@ -593,28 +613,33 @@ class EmailNotification {
function sendImpersonal( $addresses ) {
global $wgContLang;
- if (empty($addresses))
+ if ( empty( $addresses ) )
return;
$body = str_replace(
- array( '$WATCHINGUSERNAME',
- '$PAGEEDITDATE'),
- array( wfMsgForContent('enotif_impersonal_salutation'),
- $wgContLang->timeanddate($this->timestamp, true, false, false)),
- $this->body);
+ array( '$WATCHINGUSERNAME',
+ '$PAGEEDITDATE' ),
+ array( wfMsgForContent( 'enotif_impersonal_salutation' ),
+ $wgContLang->timeanddate( $this->timestamp, true, false, false ) ),
+ $this->body );
- return UserMailer::send($addresses, $this->from, $this->subject, $body, $this->replyto);
+ return UserMailer::send( $addresses, $this->from, $this->subject, $body, $this->replyto );
}
} # end of class EmailNotification
-/**
+/**@{
* Backwards compatibility functions
+ *
+ * @deprecated Use UserMailer methods; will be removed in 1.19
*/
function wfRFC822Phrase( $s ) {
+ wfDeprecated( __FUNCTION__ );
return UserMailer::rfc822Phrase( $s );
}
-function userMailer( $to, $from, $subject, $body, $replyto=null ) {
+function userMailer( $to, $from, $subject, $body, $replyto = null ) {
+ wfDeprecated( __FUNCTION__ );
return UserMailer::send( $to, $from, $subject, $body, $replyto );
}
+/**@}*/ \ No newline at end of file
diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php
index 0d6b8151..6c2a5f12 100644
--- a/includes/UserRightsProxy.php
+++ b/includes/UserRightsProxy.php
@@ -21,6 +21,7 @@ class UserRightsProxy {
$this->database = $database;
$this->name = $name;
$this->id = intval( $id );
+ $this->newOptions = array();
}
/**
@@ -48,10 +49,11 @@ class UserRightsProxy {
*
* @param $database String: database name
* @param $id Integer: user ID
+ * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return String: user name or false if the user doesn't exist
*/
- public static function whoIs( $database, $id ) {
- $user = self::newFromId( $database, $id );
+ public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
+ $user = self::newFromId( $database, $id, $ignoreInvalidDB );
if( $user ) {
return $user->name;
} else {
@@ -64,10 +66,11 @@ class UserRightsProxy {
*
* @param $database String: database name
* @param $id Integer: user ID
+ * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return UserRightsProxy or null if doesn't exist
*/
- public static function newFromId( $database, $id ) {
- return self::newFromLookup( $database, 'user_id', intval( $id ) );
+ public static function newFromId( $database, $id, $ignoreInvalidDB = false ) {
+ return self::newFromLookup( $database, 'user_id', intval( $id ), $ignoreInvalidDB );
}
/**
@@ -75,14 +78,15 @@ class UserRightsProxy {
*
* @param $database String: database name
* @param $name String: user name
+ * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return UserRightsProxy or null if doesn't exist
*/
- public static function newFromName( $database, $name ) {
- return self::newFromLookup( $database, 'user_name', $name );
+ public static function newFromName( $database, $name, $ignoreInvalidDB = false ) {
+ return self::newFromLookup( $database, 'user_name', $name, $ignoreInvalidDB );
}
- private static function newFromLookup( $database, $field, $value ) {
- $db = self::getDB( $database );
+ private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
+ $db = self::getDB( $database, $ignoreInvalidDB );
if( $db ) {
$row = $db->selectRow( 'user',
array( 'user_id', 'user_name' ),
@@ -102,10 +106,11 @@ class UserRightsProxy {
* This may be a new connection to another database for remote users.
*
* @param $database String
+ * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return DatabaseBase or null if invalid selection
*/
- public static function getDB( $database ) {
- global $wgLocalDatabases, $wgDBname;
+ public static function getDB( $database, $ignoreInvalidDB = false ) {
+ global $wgDBname;
if( self::validDatabase( $database ) ) {
if( $database == $wgDBname ) {
// Hmm... this shouldn't happen though. :)
@@ -152,7 +157,7 @@ class UserRightsProxy {
array( 'ug_user' => $this->id ),
__METHOD__ );
$groups = array();
- while( $row = $this->db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$groups[] = $row->ug_group;
}
return $groups;
@@ -182,6 +187,29 @@ class UserRightsProxy {
),
__METHOD__ );
}
+
+ /**
+ * Replaces User::setOption()
+ */
+ public function setOption( $option, $value ) {
+ $this->newOptions[$option] = $value;
+ }
+
+ public function saveSettings() {
+ $rows = array();
+ foreach ( $this->newOptions as $option => $value ) {
+ $rows[] = array(
+ 'up_user' => $this->id,
+ 'up_property' => $option,
+ 'up_value' => $value,
+ );
+ }
+ $this->db->replace( 'user_properties',
+ array( array( 'up_user', 'up_property' ) ),
+ $rows, __METHOD__
+ );
+ $this->invalidateCache();
+ }
/**
* Replaces User::touchUser()
@@ -193,11 +221,7 @@ class UserRightsProxy {
__METHOD__ );
global $wgMemc;
- if ( function_exists( 'wfForeignMemcKey' ) ) {
- $key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
- } else {
- $key = "$this->database:user:id:" . $this->id;
- }
+ $key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
$wgMemc->delete( $key );
}
}
diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php
index d1c15296..dd6e247b 100644
--- a/includes/WatchedItem.php
+++ b/includes/WatchedItem.php
@@ -84,6 +84,8 @@ class WatchedItem {
* @return bool
*/
public function removeWatch() {
+ wfProfileIn( __METHOD__ );
+
$success = false;
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'watchlist',
@@ -112,6 +114,8 @@ class WatchedItem {
if ( $dbw->affectedRows() ) {
$success = true;
}
+
+ wfProfileOut( __METHOD__ );
return $success;
}
@@ -143,14 +147,13 @@ class WatchedItem {
);
# Construct array to replace into the watchlist
$values = array();
- while ( $s = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $s ) {
$values[] = array(
'wl_user' => $s->wl_user,
'wl_namespace' => $newnamespace,
'wl_title' => $newtitle
);
}
- $dbw->freeResult( $res );
if( empty( $values ) ) {
// Nothing to do
diff --git a/includes/WatchlistEditor.php b/includes/WatchlistEditor.php
index e9e79ee1..37673784 100644
--- a/includes/WatchlistEditor.php
+++ b/includes/WatchlistEditor.php
@@ -100,15 +100,17 @@ class WatchlistEditor {
$titles = array();
if( !is_array( $list ) ) {
$list = explode( "\n", trim( $list ) );
- if( !is_array( $list ) )
+ if( !is_array( $list ) ) {
return array();
+ }
}
foreach( $list as $text ) {
$text = trim( $text );
if( strlen( $text ) > 0 ) {
$title = Title::newFromText( $text );
- if( $title instanceof Title && $title->isWatchable() )
+ if( $title instanceof Title && $title->isWatchable() ) {
$titles[] = $title->getPrefixedText();
+ }
}
}
return array_unique( $titles );
@@ -129,8 +131,9 @@ class WatchlistEditor {
// Do a batch existence check
$batch = new LinkBatch();
foreach( $titles as $title ) {
- if( !$title instanceof Title )
+ if( !$title instanceof Title ) {
$title = Title::newFromText( $title );
+ }
if( $title instanceof Title ) {
$batch->addObj( $title );
$batch->addObj( $title->getTalkPage() );
@@ -140,8 +143,9 @@ class WatchlistEditor {
// Print out the list
$output->addHTML( "<ul>\n" );
foreach( $titles as $title ) {
- if( !$title instanceof Title )
+ if( !$title instanceof Title ) {
$title = Title::newFromText( $title );
+ }
if( $title instanceof Title ) {
$output->addHTML( "<li>" . $skin->link( $title )
. ' (' . $skin->link( $title->getTalkPage(), $talk ) . ")</li>\n" );
@@ -182,7 +186,7 @@ class WatchlistEditor {
__METHOD__
);
if( $res->numRows() > 0 ) {
- while( $row = $res->fetchObject() ) {
+ foreach ( $res as $row ) {
$title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
if( $title instanceof Title && !$title->isTalkPage() )
$list[] = $title->getPrefixedText();
@@ -205,24 +209,28 @@ class WatchlistEditor {
$dbr = wfGetDB( DB_MASTER );
$uid = intval( $user->getId() );
list( $watchlist, $page ) = $dbr->tableNamesN( 'watchlist', 'page' );
- $sql = "SELECT wl_namespace, wl_title, page_id, page_len, page_is_redirect
+ $sql = "SELECT wl_namespace, wl_title, page_id, page_len, page_is_redirect, page_latest
FROM {$watchlist} LEFT JOIN {$page} ON ( wl_namespace = page_namespace
AND wl_title = page_title ) WHERE wl_user = {$uid}";
+ if ( ! $dbr->implicitOrderby() ) {
+ $sql .= " ORDER BY wl_namespace, wl_title";
+ }
$res = $dbr->query( $sql, __METHOD__ );
if( $res && $dbr->numRows( $res ) > 0 ) {
$cache = LinkCache::singleton();
- while( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
if( $title instanceof Title ) {
// Update the link cache while we're at it
if( $row->page_id ) {
- $cache->addGoodLinkObj( $row->page_id, $title, $row->page_len, $row->page_is_redirect );
+ $cache->addGoodLinkObj( $row->page_id, $title, $row->page_len, $row->page_is_redirect, $row->page_latest );
} else {
$cache->addBadLinkObj( $title );
}
// Ignore non-talk
- if( !$title->isTalkPage() )
+ if( !$title->isTalkPage() ) {
$titles[$row->wl_namespace][$row->wl_title] = $row->page_is_redirect;
+ }
}
}
}
@@ -270,8 +278,9 @@ class WatchlistEditor {
$dbw = wfGetDB( DB_MASTER );
$rows = array();
foreach( $titles as $title ) {
- if( !$title instanceof Title )
+ if( !$title instanceof Title ) {
$title = Title::newFromText( $title );
+ }
if( $title instanceof Title ) {
$rows[] = array(
'wl_user' => $user->getId(),
@@ -302,8 +311,9 @@ class WatchlistEditor {
private function unwatchTitles( $titles, $user ) {
$dbw = wfGetDB( DB_MASTER );
foreach( $titles as $title ) {
- if( !$title instanceof Title )
+ if( !$title instanceof Title ) {
$title = Title::newFromText( $title );
+ }
if( $title instanceof Title ) {
$dbw->delete(
'watchlist',
@@ -337,11 +347,12 @@ class WatchlistEditor {
*/
private function showNormalForm( $output, $user ) {
global $wgUser;
- if( ( $count = $this->showItemCount( $output, $user ) ) > 0 ) {
+ $count = $this->showItemCount( $output, $user );
+ if( $count > 0 ) {
$self = SpecialPage::getTitleFor( 'Watchlist' );
$form = Xml::openElement( 'form', array( 'method' => 'post',
'action' => $self->getLocalUrl( array( 'action' => 'edit' ) ) ) );
- $form .= Xml::hidden( 'token', $wgUser->editToken( 'watchlistedit' ) );
+ $form .= Html::hidden( 'token', $wgUser->editToken( 'watchlistedit' ) );
$form .= "<fieldset>\n<legend>" . wfMsgHtml( 'watchlistedit-normal-legend' ) . "</legend>";
$form .= wfMsgExt( 'watchlistedit-normal-explain', 'parse' );
$form .= $this->buildRemoveList( $user, $wgUser->getSkin() );
@@ -410,8 +421,9 @@ class WatchlistEditor {
global $wgLang;
$link = $skin->link( $title );
- if( $redirect )
+ if( $redirect ) {
$link = '<span class="watchlistredir">' . $link . '</span>';
+ }
$tools[] = $skin->link( $title->getTalkPage(), wfMsgHtml( 'talkpagelinktext' ) );
if( $title->exists() ) {
$tools[] = $skin->link(
@@ -431,10 +443,13 @@ class WatchlistEditor {
array( 'known', 'noclasses' )
);
}
+
+ wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $redirect, $skin ) );
+
return "<li>"
. Xml::check( 'titles[]', false, array( 'value' => $title->getPrefixedText() ) )
. $link . " (" . $wgLang->pipeList( $tools ) . ")" . "</li>\n";
- }
+ }
/**
* Show a form for editing the watchlist in "raw" mode
@@ -446,9 +461,9 @@ class WatchlistEditor {
global $wgUser;
$this->showItemCount( $output, $user );
$self = SpecialPage::getTitleFor( 'Watchlist' );
- $form = Xml::openElement( 'form', array( 'method' => 'post',
+ $form = Xml::openElement( 'form', array( 'method' => 'post',
'action' => $self->getLocalUrl( array( 'action' => 'raw' ) ) ) );
- $form .= Xml::hidden( 'token', $wgUser->editToken( 'watchlistedit' ) );
+ $form .= Html::hidden( 'token', $wgUser->editToken( 'watchlistedit' ) );
$form .= '<fieldset><legend>' . wfMsgHtml( 'watchlistedit-raw-legend' ) . '</legend>';
$form .= wfMsgExt( 'watchlistedit-raw-explain', 'parse' );
$form .= Xml::label( wfMsg( 'watchlistedit-raw-titles' ), 'titles' );
@@ -456,8 +471,9 @@ class WatchlistEditor {
$form .= Xml::openElement( 'textarea', array( 'id' => 'titles', 'name' => 'titles',
'rows' => $wgUser->getIntOption( 'rows' ), 'cols' => $wgUser->getIntOption( 'cols' ) ) );
$titles = $this->getWatchlist( $user );
- foreach( $titles as $title )
+ foreach( $titles as $title ) {
$form .= htmlspecialchars( $title ) . "\n";
+ }
$form .= '</textarea>';
$form .= '<p>' . Xml::submitButton( wfMsg( 'watchlistedit-raw-submit' ) ) . '</p>';
$form .= '</fieldset></form>';
@@ -500,14 +516,13 @@ class WatchlistEditor {
$modes = array( 'view' => false, 'edit' => 'edit', 'raw' => 'raw' );
foreach( $modes as $mode => $subpage ) {
// can use messages 'watchlisttools-view', 'watchlisttools-edit', 'watchlisttools-raw'
- $tools[] = $skin->link(
+ $tools[] = $skin->linkKnown(
SpecialPage::getTitleFor( 'Watchlist', $subpage ),
- wfMsgHtml( "watchlisttools-{$mode}" ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( "watchlisttools-{$mode}" )
);
}
- return $wgLang->pipeList( $tools );
+ return Html::rawElement( 'span',
+ array( 'class' => 'mw-watchlist-toollinks' ),
+ wfMsg( 'parentheses', $wgLang->pipeList( $tools ) ) );
}
}
diff --git a/includes/WebRequest.php b/includes/WebRequest.php
index 877f7cf6..940b693f 100644
--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -1,35 +1,28 @@
<?php
/**
* Deal with importing all those nasssty globals and things
+ *
+ * Copyright © 2003 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
-# Copyright (C) 2003 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-
-/**
- * Some entry points may use this file without first enabling the
- * autoloader.
- */
-if ( !function_exists( '__autoload' ) ) {
- require_once( dirname(__FILE__) . '/normal/UtfNormal.php' );
-}
-
/**
* The WebRequest class encapsulates getting at data passed in the
* URL or via a POSTed form, handling remove of "magic quotes" slashes,
@@ -44,7 +37,12 @@ if ( !function_exists( '__autoload' ) ) {
*/
class WebRequest {
protected $data, $headers = array();
- private $_response;
+
+ /**
+ * Lazy-init response object
+ * @var WebResponse
+ */
+ private $response;
public function __construct() {
/// @todo Fixme: this preemptive de-quoting can interfere with other web libraries
@@ -67,6 +65,11 @@ class WebRequest {
public function interpolateTitle() {
global $wgUsePathInfo;
+ // bug 16019: title interpolation on API queries is useless and possible harmful
+ if ( defined( 'MW_API' ) ) {
+ return;
+ }
+
if ( $wgUsePathInfo ) {
// PATH_INFO is mangled due to http://bugs.php.net/bug.php?id=31892
// And also by Apache 2.x, double slashes are converted to single slashes.
@@ -160,6 +163,7 @@ class WebRequest {
/**
* Recursively strips slashes from the given array;
* used for undoing the evil that is magic_quotes_gpc.
+ *
* @param $arr array: will be modified
* @return array the original array
*/
@@ -195,6 +199,7 @@ class WebRequest {
/**
* Recursively normalizes UTF-8 strings in the given array.
+ *
* @param $data string or array
* @return cleaned-up version of the given
* @private
@@ -214,9 +219,9 @@ class WebRequest {
/**
* Fetch a value from the given array or return $default if it's not set.
*
- * @param $arr array
- * @param $name string
- * @param $default mixed
+ * @param $arr Array
+ * @param $name String
+ * @param $default Mixed
* @return mixed
*/
private function getGPCVal( $arr, $name, $default ) {
@@ -247,9 +252,9 @@ class WebRequest {
* non-freeform text inputs (e.g. predefined internal text keys
* selected by a drop-down menu). For freeform input, see getText().
*
- * @param $name string
- * @param $default string: optional default (or NULL)
- * @return string
+ * @param $name String
+ * @param $default String: optional default (or NULL)
+ * @return String
*/
public function getVal( $name, $default = null ) {
$val = $this->getGPCVal( $this->data, $name, $default );
@@ -265,9 +270,10 @@ class WebRequest {
/**
* Set an aribtrary value into our get/post data.
- * @param $key string Key name to use
- * @param $value mixed Value to set
- * @return mixed old value if one was present, null otherwise
+ *
+ * @param $key String: key name to use
+ * @param $value Mixed: value to set
+ * @return Mixed: old value if one was present, null otherwise
*/
public function setVal( $key, $value ) {
$ret = isset( $this->data[$key] ) ? $this->data[$key] : null;
@@ -280,9 +286,9 @@ class WebRequest {
* If source was scalar, will return an array with a single element.
* If no source and no default, returns NULL.
*
- * @param $name string
- * @param $default array: optional default (or NULL)
- * @return array
+ * @param $name String
+ * @param $default Array: optional default (or NULL)
+ * @return Array
*/
public function getArray( $name, $default = null ) {
$val = $this->getGPCVal( $this->data, $name, $default );
@@ -299,9 +305,9 @@ class WebRequest {
* If no source and no default, returns NULL.
* If an array is returned, contents are guaranteed to be integers.
*
- * @param $name string
- * @param $default array: option default (or NULL)
- * @return array of ints
+ * @param $name String
+ * @param $default Array: option default (or NULL)
+ * @return Array of ints
*/
public function getIntArray( $name, $default = null ) {
$val = $this->getArray( $name, $default );
@@ -315,9 +321,10 @@ class WebRequest {
* Fetch an integer value from the input or return $default if not set.
* Guaranteed to return an integer; non-numeric input will typically
* return 0.
- * @param $name string
- * @param $default int
- * @return int
+ *
+ * @param $name String
+ * @param $default Integer
+ * @return Integer
*/
public function getInt( $name, $default = 0 ) {
return intval( $this->getVal( $name, $default ) );
@@ -327,8 +334,9 @@ class WebRequest {
* Fetch an integer value from the input or return null if empty.
* Guaranteed to return an integer or null; non-numeric input will
* typically return null.
- * @param $name string
- * @return int
+ *
+ * @param $name String
+ * @return Integer
*/
public function getIntOrNull( $name ) {
$val = $this->getVal( $name );
@@ -341,20 +349,35 @@ class WebRequest {
* Fetch a boolean value from the input or return $default if not set.
* Guaranteed to return true or false, with normal PHP semantics for
* boolean interpretation of strings.
- * @param $name string
- * @param $default bool
- * @return bool
+ *
+ * @param $name String
+ * @param $default Boolean
+ * @return Boolean
*/
public function getBool( $name, $default = false ) {
- return $this->getVal( $name, $default ) ? true : false;
+ return (bool)$this->getVal( $name, $default );
+ }
+
+ /**
+ * Fetch a boolean value from the input or return $default if not set.
+ * Unlike getBool, the string "false" will result in boolean false, which is
+ * useful when interpreting information sent from JavaScript.
+ *
+ * @param $name String
+ * @param $default Boolean
+ * @return Boolean
+ */
+ public function getFuzzyBool( $name, $default = false ) {
+ return $this->getBool( $name, $default ) && strcasecmp( $this->getVal( $name ), 'false' ) !== 0;
}
/**
* Return true if the named value is set in the input, whatever that
* value is (even "0"). Return false if the named value is not set.
* Example use is checking for the presence of check boxes in forms.
- * @param $name string
- * @return bool
+ *
+ * @param $name String
+ * @return Boolean
*/
public function getCheck( $name ) {
# Checkboxes and buttons are only present when clicked
@@ -365,15 +388,15 @@ class WebRequest {
/**
* Fetch a text string from the given array or return $default if it's not
- * set. \r is stripped from the text, and with some language modules there
- * is an input transliteration applied. This should generally be used for
- * form <textarea> and <input> fields. Used for user-supplied freeform text
- * input (for which input transformations may be required - e.g. Esperanto
- * x-coding).
+ * set. Carriage returns are stripped from the text, and with some language
+ * modules there is an input transliteration applied. This should generally
+ * be used for form <textarea> and <input> fields. Used for user-supplied
+ * freeform text input (for which input transformations may be required - e.g.
+ * Esperanto x-coding).
*
- * @param $name string
- * @param $default string: optional
- * @return string
+ * @param $name String
+ * @param $default String: optional
+ * @return String
*/
public function getText( $name, $default = '' ) {
global $wgContLang;
@@ -410,7 +433,7 @@ class WebRequest {
* Note that values retrieved by the object may come from the
* GET URL etc even on a POST request.
*
- * @return bool
+ * @return Boolean
*/
public function wasPosted() {
return $_SERVER['REQUEST_METHOD'] == 'POST';
@@ -425,15 +448,32 @@ class WebRequest {
* during the current request (in which case the cookie will
* be sent back to the client at the end of the script run).
*
- * @return bool
+ * @return Boolean
*/
public function checkSessionCookie() {
- return isset( $_COOKIE[session_name()] );
+ return isset( $_COOKIE[ session_name() ] );
+ }
+
+ /**
+ * Get a cookie from the $_COOKIE jar
+ *
+ * @param $key String: the name of the cookie
+ * @param $prefix String: a prefix to use for the cookie name, if not $wgCookiePrefix
+ * @param $default Mixed: what to return if the value isn't found
+ * @return Mixed: cookie value or $default if the cookie not set
+ */
+ public function getCookie( $key, $prefix = null, $default = null ) {
+ if( $prefix === null ) {
+ global $wgCookiePrefix;
+ $prefix = $wgCookiePrefix;
+ }
+ return $this->getGPCVal( $_COOKIE, $prefix . $key , $default );
}
/**
* Return the path portion of the request URI.
- * @return string
+ *
+ * @return String
*/
public function getRequestURL() {
if( isset( $_SERVER['REQUEST_URI']) && strlen($_SERVER['REQUEST_URI']) ) {
@@ -468,7 +508,8 @@ class WebRequest {
/**
* Return the request URI with the canonical service and hostname.
- * @return string
+ *
+ * @return String
*/
public function getFullRequestURL() {
global $wgServer;
@@ -478,7 +519,8 @@ class WebRequest {
/**
* Take an arbitrary query and rewrite the present URL to include it
* @param $query String: query string fragment; do not include initial '?'
- * @return string
+ *
+ * @return String
*/
public function appendQuery( $query ) {
global $wgTitle;
@@ -502,8 +544,9 @@ class WebRequest {
/**
* HTML-safe version of appendQuery().
+ *
* @param $query String: query string fragment; do not include initial '?'
- * @return string
+ * @return String
*/
public function escapeAppendQuery( $query ) {
return htmlspecialchars( $this->appendQuery( $query ) );
@@ -515,10 +558,11 @@ class WebRequest {
/**
* Appends or replaces value of query variables.
+ *
* @param $array Array of values to replace/add to query
* @param $onlyquery Bool: whether to only return the query string and not
* the complete URL
- * @return string
+ * @return String
*/
public function appendQueryArray( $array, $onlyquery = false ) {
global $wgTitle;
@@ -542,53 +586,59 @@ class WebRequest {
global $wgUser;
$limit = $this->getInt( 'limit', 0 );
- if( $limit < 0 ) $limit = 0;
+ if( $limit < 0 ) {
+ $limit = 0;
+ }
if( ( $limit == 0 ) && ( $optionname != '' ) ) {
$limit = (int)$wgUser->getOption( $optionname );
}
- if( $limit <= 0 ) $limit = $deflimit;
- if( $limit > 5000 ) $limit = 5000; # We have *some* limits...
+ if( $limit <= 0 ) {
+ $limit = $deflimit;
+ }
+ if( $limit > 5000 ) {
+ $limit = 5000; # We have *some* limits...
+ }
$offset = $this->getInt( 'offset', 0 );
- if( $offset < 0 ) $offset = 0;
+ if( $offset < 0 ) {
+ $offset = 0;
+ }
return array( $limit, $offset );
}
/**
* Return the path to the temporary file where PHP has stored the upload.
+ *
* @param $key String:
* @return string or NULL if no such file.
*/
public function getFileTempname( $key ) {
- if( !isset( $_FILES[$key] ) ) {
- return null;
- }
- return $_FILES[$key]['tmp_name'];
+ $file = new WebRequestUpload( $this, $key );
+ return $file->getTempName();
}
/**
* Return the size of the upload, or 0.
+ *
+ * @deprecated
* @param $key String:
* @return integer
*/
public function getFileSize( $key ) {
- if( !isset( $_FILES[$key] ) ) {
- return 0;
- }
- return $_FILES[$key]['size'];
+ $file = new WebRequestUpload( $this, $key );
+ return $file->getSize();
}
/**
* Return the upload error or 0
+ *
* @param $key String:
* @return integer
*/
public function getUploadError( $key ) {
- if( !isset( $_FILES[$key] ) || !isset( $_FILES[$key]['error'] ) ) {
- return 0/*UPLOAD_ERR_OK*/;
- }
- return $_FILES[$key]['error'];
+ $file = new WebRequestUpload( $this, $key );
+ return $file->getError();
}
/**
@@ -603,31 +653,33 @@ class WebRequest {
* @return string or NULL if no such file.
*/
public function getFileName( $key ) {
- global $wgContLang;
- if( !isset( $_FILES[$key] ) ) {
- return null;
- }
- $name = $_FILES[$key]['name'];
+ $file = new WebRequestUpload( $this, $key );
+ return $file->getName();
+ }
- # Safari sends filenames in HTML-encoded Unicode form D...
- # Horrid and evil! Let's try to make some kind of sense of it.
- $name = Sanitizer::decodeCharReferences( $name );
- $name = $wgContLang->normalize( $name );
- wfDebug( "WebRequest::getFileName() '" . $_FILES[$key]['name'] . "' normalized to '$name'\n" );
- return $name;
+ /**
+ * Return a WebRequestUpload object corresponding to the key
+ *
+ * @param @key string
+ * @return WebRequestUpload
+ */
+ public function getUpload( $key ) {
+ return new WebRequestUpload( $this, $key );
}
/**
* Return a handle to WebResponse style object, for setting cookies,
* headers and other stuff, for Request being worked on.
+ *
+ * @return WebResponse
*/
public function response() {
/* Lazy initialization of response object for this request */
- if ( !is_object( $this->_response ) ) {
+ if ( !is_object( $this->response ) ) {
$class = ( $this instanceof FauxRequest ) ? 'FauxResponse' : 'WebResponse';
- $this->_response = new $class();
+ $this->response = new $class();
}
- return $this->_response;
+ return $this->response;
}
/**
@@ -649,6 +701,9 @@ class WebRequest {
}
} else {
$name = 'HTTP_' . str_replace( '-', '_', $name );
+ if ( $name === 'HTTP_CONTENT_LENGTH' && !isset( $_SERVER[$name] ) ) {
+ $name = 'CONTENT_LENGTH';
+ }
if ( isset( $_SERVER[$name] ) ) {
return $_SERVER[$name];
} else {
@@ -657,27 +712,86 @@ class WebRequest {
}
}
- /*
+ /**
* Get data from $_SESSION
- * @param $key String Name of key in $_SESSION
- * @return mixed
+ *
+ * @param $key String: name of key in $_SESSION
+ * @return Mixed
*/
public function getSessionData( $key ) {
- if( !isset( $_SESSION[$key] ) )
+ if( !isset( $_SESSION[$key] ) ) {
return null;
+ }
return $_SESSION[$key];
}
/**
* Set session data
- * @param $key String Name of key in $_SESSION
- * @param $data mixed
+ *
+ * @param $key String: name of key in $_SESSION
+ * @param $data Mixed
*/
public function setSessionData( $key, $data ) {
$_SESSION[$key] = $data;
}
/**
+ * Check if Internet Explorer will detect an incorrect cache extension in
+ * PATH_INFO or QUERY_STRING. If the request can't be allowed, show an error
+ * message or redirect to a safer URL. Returns true if the URL is OK, and
+ * false if an error message has been shown and the request should be aborted.
+ */
+ public function checkUrlExtension( $extWhitelist = array() ) {
+ global $wgScriptExtension;
+ $extWhitelist[] = ltrim( $wgScriptExtension, '.' );
+ if ( IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist ) ) {
+ if ( !$this->wasPosted() ) {
+ $newUrl = IEUrlExtension::fixUrlForIE6(
+ $this->getFullRequestURL(), $extWhitelist );
+ if ( $newUrl !== false ) {
+ $this->doSecurityRedirect( $newUrl );
+ return false;
+ }
+ }
+ wfHttpError( 403, 'Forbidden',
+ 'Invalid file extension found in the path info or query string.' );
+
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Attempt to redirect to a URL with a QUERY_STRING that's not dangerous in
+ * IE 6. Returns true if it was successful, false otherwise.
+ */
+ protected function doSecurityRedirect( $url ) {
+ header( 'Location: ' . $url );
+ header( 'Content-Type: text/html' );
+ $encUrl = htmlspecialchars( $url );
+ echo <<<HTML
+<html>
+<head>
+<title>Security redirect</title>
+</head>
+<body>
+<h1>Security redirect</h1>
+<p>
+We can't serve non-HTML content from the URL you have requested, because
+Internet Explorer would interpret it as an incorrect and potentially dangerous
+content type.</p>
+<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the URL you have requested, except that
+"&amp;*" is appended. This prevents Internet Explorer from seeing a bogus file
+extension.
+</p>
+</body>
+</html>
+HTML;
+ echo "\n";
+ return true;
+ }
+
+ /**
* Returns true if the PATH_INFO ends with an extension other than a script
* extension. This could confuse IE for scripts that send arbitrary data which
* is not HTML but may be detected as such.
@@ -695,30 +809,163 @@ class WebRequest {
*/
public function isPathInfoBad() {
global $wgScriptExtension;
+ $extWhitelist[] = ltrim( $wgScriptExtension, '.' );
+ return IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist );
+ }
+
+ /**
+ * Parse the Accept-Language header sent by the client into an array
+ * @return array( languageCode => q-value ) sorted by q-value in descending order
+ * May contain the "language" '*', which applies to languages other than those explicitly listed.
+ * This is aligned with rfc2616 section 14.4
+ */
+ public function getAcceptLang() {
+ // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
+ $acceptLang = $this->getHeader( 'Accept-Language' );
+ if ( !$acceptLang ) {
+ return array();
+ }
+
+ // Return the language codes in lower case
+ $acceptLang = strtolower( $acceptLang );
+
+ // Break up string into pieces (languages and q factors)
+ $lang_parse = null;
+ preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})?|\*)\s*(;\s*q\s*=\s*(1|0(\.[0-9]+)?)?)?/',
+ $acceptLang, $lang_parse );
- if ( isset( $_SERVER['QUERY_STRING'] )
- && preg_match( '/\.[^\\/:*?"<>|%]+(#|\?|$)/i', $_SERVER['QUERY_STRING'] ) )
- {
- // Bug 28235
- // Block only Internet Explorer, and requests with missing UA
- // headers that could be IE users behind a privacy proxy.
- if ( !isset( $_SERVER['HTTP_USER_AGENT'] )
- || preg_match( '/; *MSIE/', $_SERVER['HTTP_USER_AGENT'] ) )
- {
- return true;
+ if ( !count( $lang_parse[1] ) ) {
+ return array();
+ }
+
+ // Create a list like "en" => 0.8
+ $langs = array_combine( $lang_parse[1], $lang_parse[4] );
+ // Set default q factor to 1
+ foreach ( $langs as $lang => $val ) {
+ if ( $val === '' ) {
+ $langs[$lang] = 1;
+ } else if ( $val == 0 ) {
+ unset($langs[$lang]);
}
}
- if ( !isset( $_SERVER['PATH_INFO'] ) ) {
- return false;
+ // Sort list
+ arsort( $langs, SORT_NUMERIC );
+ return $langs;
+ }
+}
+
+/**
+ * Object to access the $_FILES array
+ */
+class WebRequestUpload {
+ protected $request;
+ protected $doesExist;
+ protected $fileInfo;
+
+ /**
+ * Constructor. Should only be called by WebRequest
+ *
+ * @param $request WebRequest The associated request
+ * @param $key string Key in $_FILES array (name of form field)
+ */
+ public function __construct( $request, $key ) {
+ $this->request = $request;
+ $this->doesExist = isset( $_FILES[$key] );
+ if ( $this->doesExist ) {
+ $this->fileInfo = $_FILES[$key];
}
- $pi = $_SERVER['PATH_INFO'];
- $dotPos = strrpos( $pi, '.' );
- if ( $dotPos === false ) {
- return false;
+ }
+
+ /**
+ * Return whether a file with this name was uploaded.
+ *
+ * @return bool
+ */
+ public function exists() {
+ return $this->doesExist;
+ }
+
+ /**
+ * Return the original filename of the uploaded file
+ *
+ * @return mixed Filename or null if non-existent
+ */
+ public function getName() {
+ if ( !$this->exists() ) {
+ return null;
+ }
+
+ global $wgContLang;
+ $name = $this->fileInfo['name'];
+
+ # Safari sends filenames in HTML-encoded Unicode form D...
+ # Horrid and evil! Let's try to make some kind of sense of it.
+ $name = Sanitizer::decodeCharReferences( $name );
+ $name = $wgContLang->normalize( $name );
+ wfDebug( __METHOD__ . ": {$this->fileInfo['name']} normalized to '$name'\n" );
+ return $name;
+ }
+
+ /**
+ * Return the file size of the uploaded file
+ *
+ * @return int File size or zero if non-existent
+ */
+ public function getSize() {
+ if ( !$this->exists() ) {
+ return 0;
+ }
+
+ return $this->fileInfo['size'];
+ }
+
+ /**
+ * Return the path to the temporary file
+ *
+ * @return mixed Path or null if non-existent
+ */
+ public function getTempName() {
+ if ( !$this->exists() ) {
+ return null;
+ }
+
+ return $this->fileInfo['tmp_name'];
+ }
+
+ /**
+ * Return the upload error. See link for explanation
+ * http://www.php.net/manual/en/features.file-upload.errors.php
+ *
+ * @return int One of the UPLOAD_ constants, 0 if non-existent
+ */
+ public function getError() {
+ if ( !$this->exists() ) {
+ return 0; # UPLOAD_ERR_OK
}
- $ext = substr( $pi, $dotPos );
- return !in_array( $ext, array( $wgScriptExtension, '.php', '.php5' ) );
+
+ return $this->fileInfo['error'];
+ }
+
+ /**
+ * Returns whether this upload failed because of overflow of a maximum set
+ * in php.ini
+ *
+ * @return bool
+ */
+ public function isIniSizeOverflow() {
+ if ( $this->getError() == UPLOAD_ERR_INI_SIZE ) {
+ # PHP indicated that upload_max_filesize is exceeded
+ return true;
+ }
+
+ $contentLength = $this->request->getHeader( 'CONTENT_LENGTH' );
+ if ( $contentLength > wfShorthandToInteger( ini_get( 'post_max_size' ) ) ) {
+ # post_max_size is exceeded
+ return true;
+ }
+
+ return false;
}
}
@@ -730,12 +977,12 @@ class WebRequest {
class FauxRequest extends WebRequest {
private $wasPosted = false;
private $session = array();
- private $response;
/**
* @param $data Array of *non*-urlencoded key => value pairs, the
* fake GET/POST values
* @param $wasPosted Bool: whether to treat the data as POST
+ * @param $session Mixed: session array or null
*/
public function __construct( $data, $wasPosted = false, $session = null ) {
if( is_array( $data ) ) {
@@ -774,7 +1021,25 @@ class FauxRequest extends WebRequest {
}
public function appendQuery( $query ) {
- $this->notImplemented( __METHOD__ );
+ global $wgTitle;
+ $basequery = '';
+ foreach( $this->data as $var => $val ) {
+ if ( $var == 'title' ) {
+ continue;
+ }
+ if ( is_array( $val ) ) {
+ /* This will happen given a request like
+ * http://en.wikipedia.org/w/index.php?title[]=Special:Userlogin&returnto[]=Main_Page
+ */
+ continue;
+ }
+ $basequery .= '&' . urlencode( $var ) . '=' . urlencode( $val );
+ }
+ $basequery .= '&' . $query;
+
+ # Trim the extra &
+ $basequery = substr( $basequery, 1 );
+ return $wgTitle->getLocalURL( $basequery );
}
public function getHeader( $name ) {
@@ -791,10 +1056,14 @@ class FauxRequest extends WebRequest {
}
public function setSessionData( $key, $data ) {
- $this->notImplemented( __METHOD__ );
+ $this->session[$key] = $data;
}
- public function isPathInfoBad() {
+ public function isPathInfoBad( $extWhitelist = array() ) {
return false;
}
+
+ public function checkUrlExtension( $extWhitelist = array() ) {
+ return true;
+ }
}
diff --git a/includes/WebResponse.php b/includes/WebResponse.php
index f7d57e41..2b1ec04c 100644
--- a/includes/WebResponse.php
+++ b/includes/WebResponse.php
@@ -1,5 +1,11 @@
<?php
/**
+ * Classes used to send headers and cookies back to the user
+ *
+ * @file
+ */
+
+/**
* Allow programs to request this object from WebRequest::response()
* and handle all outputting (or lack of outputting) via it.
* @ingroup HTTP
diff --git a/includes/WebStart.php b/includes/WebStart.php
index d62b4a62..b5140718 100644
--- a/includes/WebStart.php
+++ b/includes/WebStart.php
@@ -1,14 +1,18 @@
<?php
-
-# This does the initial setup for a web request. It does some security checks,
-# starts the profiler and loads the configuration, and optionally loads
-# Setup.php depending on whether MW_NO_SETUP is defined.
+/**
+ * This does the initial setup for a web request.
+ * It does some security checks, starts the profiler and loads the
+ * configuration, and optionally loads Setup.php depending on whether
+ * MW_NO_SETUP is defined.
+ *
+ * @file
+ */
# Protect against register_globals
# This must be done before any globals are set by the code
if ( ini_get( 'register_globals' ) ) {
if ( isset( $_REQUEST['GLOBALS'] ) ) {
- die( '<a href="http://www.hardened-php.net/index.76.html">$GLOBALS overwrite vulnerability</a>');
+ die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>');
}
$verboten = array(
'GLOBALS',
@@ -30,7 +34,7 @@ if ( ini_get( 'register_globals' ) ) {
);
foreach ( $_REQUEST as $name => $value ) {
if( in_array( $name, $verboten ) ) {
- header( "HTTP/1.x 500 Internal Server Error" );
+ header( "HTTP/1.1 500 Internal Server Error" );
echo "register_globals security paranoia: trying to overwrite superglobals, aborting.";
die( -1 );
}
@@ -85,44 +89,47 @@ if ( !function_exists( 'version_compare' )
exit;
}
-# Test for PHP bug which breaks PHP 5.0.x on 64-bit...
-# As of 1.8 this breaks lots of common operations instead
-# of just some rare ones like export.
-$borked = str_replace( 'a', 'b', array( -1 => -1 ) );
-if( !isset( $borked[-1] ) ) {
- echo "PHP 5.0.x is buggy on your 64-bit system; you must upgrade to PHP 5.1.x\n" .
- "or higher. ABORTING. (http://bugs.php.net/bug.php?id=34879 for details)\n";
- exit;
-}
-
# Start the autoloader, so that extensions can derive classes from core files
require_once( "$IP/includes/AutoLoader.php" );
+# Load default settings
+require_once( "$IP/includes/DefaultSettings.php" );
if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
# Use a callback function to configure MediaWiki
- require_once( "$IP/includes/DefaultSettings.php" );
- call_user_func( MW_CONFIG_CALLBACK );
+ $callback = MW_CONFIG_CALLBACK;
+ # PHP 5.1 doesn't support "class::method" for call_user_func, so split it
+ if ( strpos( $callback, '::' ) !== false ) {
+ $callback = explode( '::', $callback, 2);
+ }
+ call_user_func( $callback );
} else {
- # LocalSettings.php is the per site customization file. If it does not exit
- # the wiki installer need to be launched or the generated file moved from
- # ./config/ to ./
- if( !file_exists( "$IP/LocalSettings.php" ) ) {
- require_once( "$IP/includes/DefaultSettings.php" ); # used for printing the version
+ if ( !defined('MW_CONFIG_FILE') )
+ define('MW_CONFIG_FILE', "$IP/LocalSettings.php");
+
+ # LocalSettings.php is the per site customization file. If it does not exist
+ # the wiki installer needs to be launched or the generated file uploaded to
+ # the root wiki directory
+ if( !file_exists( MW_CONFIG_FILE ) ) {
require_once( "$IP/includes/templates/NoLocalSettings.php" );
die();
}
# Include site settings. $IP may be changed (hopefully before the AutoLoader is invoked)
- require_once( "$IP/LocalSettings.php" );
+ require_once( MW_CONFIG_FILE );
}
+
+if ( $wgEnableSelenium ) {
+ require_once( "$IP/includes/SeleniumWebSettings.php" );
+}
+
wfProfileOut( 'WebStart.php-conf' );
wfProfileIn( 'WebStart.php-ob_start' );
# Initialise output buffering
-if ( ob_get_level() ) {
- # Someone's been mixing configuration data with code!
- # How annoying.
-} elseif ( !defined( 'MW_NO_OUTPUT_BUFFER' ) ) {
+# Check that there is no previous output or previously set up buffers, because
+# that would cause us to potentially mix gzip and non-gzip output, creating a
+# big mess.
+if ( !defined( 'MW_NO_OUTPUT_BUFFER' ) && ob_get_level() == 0 ) {
require_once( "$IP/includes/OutputHandler.php" );
ob_start( 'wfOutputHandler' );
}
@@ -131,3 +138,4 @@ wfProfileOut( 'WebStart.php-ob_start' );
if ( !defined( 'MW_NO_SETUP' ) ) {
require_once( "$IP/includes/Setup.php" );
}
+
diff --git a/includes/Wiki.php b/includes/Wiki.php
index dc4467b6..b2cb1eb0 100644
--- a/includes/Wiki.php
+++ b/includes/Wiki.php
@@ -1,16 +1,14 @@
<?php
/**
* MediaWiki is the to-be base class for this whole project
+ *
+ * @internal documentation reviewed 15 Mar 2010
*/
class MediaWiki {
-
- var $GET; /* Stores the $_GET variables at time of creation, can be changed */
var $params = array();
- /** Constructor. It just save the $_GET variable */
- function __construct() {
- $this->GET = $_GET;
- }
+ /** Constructor */
+ function __construct() {}
/**
* Stores key/value pairs to circumvent global variables
@@ -29,7 +27,8 @@ class MediaWiki {
* Note that keys are case-insensitive!
*
* @param $key String: key to get
- * @param $default Mixed: default value if if the key doesn't exist
+ * @param $default string default value, defaults to empty string
+ * @return $default Mixed: default value if if the key doesn't exist
*/
function getVal( $key, $default = '' ) {
$key = strtolower( $key );
@@ -51,12 +50,12 @@ class MediaWiki {
*/
function performRequestForTitle( &$title, &$article, &$output, &$user, $request ) {
wfProfileIn( __METHOD__ );
-
+
$output->setTitle( $title );
-
+
wfRunHooks( 'BeforeInitialize', array( &$title, &$article, &$output, &$user, $request, $this ) );
-
- if( !$this->preliminaryChecks( $title, $output, $request ) ) {
+
+ if( !$this->preliminaryChecks( $title, $output ) ) {
wfProfileOut( __METHOD__ );
return;
}
@@ -109,9 +108,15 @@ class MediaWiki {
if( $wgRequest->getVal( 'printable' ) === 'yes' ) {
$wgOut->setPrintable();
}
- $ret = null;
- if( $curid = $wgRequest->getInt( 'curid' ) ) {
- # URLs like this are generated by RC, because rc_title isn't always accurate
+
+ $curid = $wgRequest->getInt( 'curid' );
+ if( $wgRequest->getCheck( 'search' ) ) {
+ // Compatibility with old search URLs which didn't use Special:Search
+ // Just check for presence here, so blank requests still
+ // show the search page when using ugly URLs (bug 8054).
+ $ret = SpecialPage::getTitleFor( 'Search' );
+ } elseif( $curid ) {
+ // URLs like this are generated by RC, because rc_title isn't always accurate
$ret = Title::newFromID( $curid );
} elseif( $title == '' && $action != 'delete' ) {
$ret = Title::newMainPage();
@@ -122,7 +127,7 @@ class MediaWiki {
if( count( $wgContLang->getVariants() ) > 1 && !is_null( $ret ) && $ret->getArticleID() == 0 )
$wgContLang->findVariantLink( $title, $ret );
}
- # For non-special titles, check for implicit titles
+ // For non-special titles, check for implicit titles
if( is_null( $ret ) || $ret->getNamespace() != NS_SPECIAL ) {
// We can have urls with just ?diff=,?oldid= or even just ?diff=
$oldid = $wgRequest->getInt( 'oldid' );
@@ -137,28 +142,19 @@ class MediaWiki {
}
/**
- * Checks for search query and anon-cannot-read case
+ * Checks for anon-cannot-read case
*
* @param $title Title
* @param $output OutputPage
- * @param $request WebRequest
+ * @return boolean true if successful
*/
- function preliminaryChecks( &$title, &$output, $request ) {
- if( $request->getCheck( 'search' ) ) {
- // Compatibility with old search URLs which didn't use Special:Search
- // Just check for presence here, so blank requests still
- // show the search page when using ugly URLs (bug 8054).
-
- // Do this above the read whitelist check for security...
- $title = SpecialPage::getTitleFor( 'Search' );
- }
- # If the user is not logged in, the Namespace:title of the article must be in
- # the Read array in order for the user to see it. (We have to check here to
- # catch special pages etc. We check again in Article::view())
+ function preliminaryChecks( &$title, &$output ) {
+ // If the user is not logged in, the Namespace:title of the article must be in
+ // the Read array in order for the user to see it. (We have to check here to
+ // catch special pages etc. We check again in Article::view())
if( !is_null( $title ) && !$title->userCanRead() ) {
- global $wgDeferredUpdateList;
$output->loginToUse();
- $this->finalCleanup( $wgDeferredUpdateList, $output );
+ $this->finalCleanup( $output );
$output->disable();
return false;
}
@@ -179,19 +175,20 @@ class MediaWiki {
*/
function handleSpecialCases( &$title, &$output, $request ) {
wfProfileIn( __METHOD__ );
- global $wgContLang, $wgUser;
+
$action = $this->getVal( 'Action' );
- $perferred = $wgContLang->getPreferredVariant( false );
// Invalid titles. Bug 21776: The interwikis must redirect even if the page name is empty.
- if( is_null($title) || ( ($title->getDBkey() == '') && ($title->getInterwiki() == '') ) ) {
+ if( is_null($title) || ( ( $title->getDBkey() == '' ) && ( $title->getInterwiki() == '' ) ) ) {
$title = SpecialPage::getTitleFor( 'Badtitle' );
- # Die now before we mess up $wgArticle and the skin stops working
+ $output->setTitle( $title ); // bug 21456
+ // Die now before we mess up $wgArticle and the skin stops working
throw new ErrorPageError( 'badtitle', 'badtitletext' );
// Interwiki redirects
} else if( $title->getInterwiki() != '' ) {
- if( $rdfrom = $request->getVal( 'rdfrom' ) ) {
+ $rdfrom = $request->getVal( 'rdfrom' );
+ if( $rdfrom ) {
$url = $title->getFullURL( 'rdfrom=' . urlencode( $rdfrom ) );
} else {
$query = $request->getValues();
@@ -200,26 +197,26 @@ class MediaWiki {
}
/* Check for a redirect loop */
if( !preg_match( '/^' . preg_quote( $this->getVal('Server'), '/' ) . '/', $url ) && $title->isLocal() ) {
- $output->redirect( $url );
+ // 301 so google et al report the target as the actual url.
+ $output->redirect( $url, 301 );
} else {
$title = SpecialPage::getTitleFor( 'Badtitle' );
+ $output->setTitle( $title ); // bug 21456
wfProfileOut( __METHOD__ );
throw new ErrorPageError( 'badtitle', 'badtitletext' );
}
// Redirect loops, no title in URL, $wgUsePathInfo URLs, and URLs with a variant
- } else if( $action == 'view' && !$request->wasPosted() &&
- ( ( !isset($this->GET['title']) || $title->getPrefixedDBKey() != $this->GET['title'] ) ||
- // No valid variant in URL (if the main-language has multi-variants), to ensure
- // anonymous access would always be redirect to a URL with 'variant' parameter
- ( !isset($this->GET['variant']) && $wgContLang->hasVariants() && !$wgUser->isLoggedIn() ) ) &&
- !count( array_diff( array_keys( $this->GET ), array( 'action', 'title' ) ) ) )
+ } else if ( $action == 'view' && !$request->wasPosted()
+ && ( $request->getVal( 'title' ) === null || $title->getPrefixedDBKey() != $request->getVal( 'title' ) )
+ && !count( array_diff( array_keys( $request->getValues() ), array( 'action', 'title' ) ) ) )
{
- if( !$wgUser->isLoggedIn() ) {
- $pref = $wgContLang->getPreferredVariant( false, $fromHeader = true );
- $targetUrl = $title->getFullURL( '', $variant = $pref );
+ if ( $title->getNamespace() == NS_SPECIAL ) {
+ list( $name, $subpage ) = SpecialPage::resolveAliasWithSubpage( $title->getDBkey() );
+ if ( $name ) {
+ $title = SpecialPage::getTitleFor( $name, $subpage );
+ }
}
- else
- $targetUrl = $title->getFullURL();
+ $targetUrl = $title->getFullURL();
// Redirect to canonical url, make it a 301 to allow caching
if( $targetUrl == $request->getFullRequestURL() ) {
$message = "Redirect loop detected!\n\n" .
@@ -304,8 +301,8 @@ class MediaWiki {
$action = $this->getVal( 'action', 'view' );
$article = self::articleFromTitle( $title );
- # NS_MEDIAWIKI has no redirects.
- # It is also used for CSS/JS, so performance matters here...
+ // NS_MEDIAWIKI has no redirects.
+ // It is also used for CSS/JS, so performance matters here...
if( $title->getNamespace() == NS_MEDIAWIKI ) {
wfProfileOut( __METHOD__ );
return $article;
@@ -315,23 +312,24 @@ class MediaWiki {
$file = ($title->getNamespace() == NS_FILE) ? $article->getFile() : null;
if( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
&& !$request->getVal( 'oldid' ) && // ... and are not old revisions
+ !$request->getVal( 'diff' ) && // ... and not when showing diff
$request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to
// ... and the article is not a non-redirect image page with associated file
!( is_object( $file ) && $file->exists() && !$file->getRedirected() ) )
{
- # Give extensions a change to ignore/handle redirects as needed
+ // Give extensions a change to ignore/handle redirects as needed
$ignoreRedirect = $target = false;
-
+
$dbr = wfGetDB( DB_SLAVE );
$article->loadPageData( $article->pageDataFromTitle( $dbr, $title ) );
- wfRunHooks( 'InitializeArticleMaybeRedirect',
+ wfRunHooks( 'InitializeArticleMaybeRedirect',
array(&$title,&$request,&$ignoreRedirect,&$target,&$article) );
// Follow redirects only for... redirects.
// If $target is set, then a hook wanted to redirect.
if( !$ignoreRedirect && ($target || $article->isRedirect()) ) {
- # Is the target already set by an extension?
+ // Is the target already set by an extension?
$target = $target ? $target : $article->followRedirect();
if( is_string( $target ) ) {
if( !$this->getVal( 'DisableHardRedirects' ) ) {
@@ -363,52 +361,23 @@ class MediaWiki {
* Cleaning up request by doing:
** deferred updates, DB transaction, and the output
*
- * @param $deferredUpdates array of updates to do
* @param $output OutputPage
*/
- function finalCleanup( &$deferredUpdates, &$output ) {
+ function finalCleanup( &$output ) {
wfProfileIn( __METHOD__ );
- # Now commit any transactions, so that unreported errors after
- # output() don't roll back the whole DB transaction
+ // Now commit any transactions, so that unreported errors after
+ // output() don't roll back the whole DB transaction
$factory = wfGetLBFactory();
$factory->commitMasterChanges();
- # Output everything!
+ // Output everything!
$output->output();
- # Do any deferred jobs
- $this->doUpdates( $deferredUpdates );
+ // Do any deferred jobs
+ wfDoUpdates( true );
$this->doJobs();
wfProfileOut( __METHOD__ );
}
/**
- * Deferred updates aren't really deferred anymore. It's important to report
- * errors to the user, and that means doing this before OutputPage::output().
- * Note that for page saves, the client will wait until the script exits
- * anyway before following the redirect.
- *
- * @param $updates array of objects that hold an update to do
- */
- function doUpdates( &$updates ) {
- wfProfileIn( __METHOD__ );
- /* No need to get master connections in case of empty updates array */
- if (!$updates) {
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $dbw = wfGetDB( DB_MASTER );
- foreach( $updates as $up ) {
- $up->doUpdate();
-
- # Commit after every update to prevent lock contention
- if( $dbw->trxLevel() ) {
- $dbw->commit();
- }
- }
- wfProfileOut( __METHOD__ );
- }
-
- /**
* Do a job from the job queue
*/
function doJobs() {
@@ -447,7 +416,7 @@ class MediaWiki {
*/
function restInPeace() {
wfLogProfilingData();
- # Commit and close up!
+ // Commit and close up!
$factory = wfGetLBFactory();
$factory->commitMasterChanges();
$factory->shutdown();
@@ -477,8 +446,8 @@ class MediaWiki {
$action = 'nosuchaction';
}
- # Workaround for bug #20966: inability of IE to provide an action dependent
- # on which submit button is clicked.
+ // Workaround for bug #20966: inability of IE to provide an action dependent
+ // on which submit button is clicked.
if ( $action === 'historysubmit' ) {
if ( $request->getBool( 'revisiondelete' ) ) {
$action = 'revisiondelete';
@@ -566,7 +535,7 @@ class MediaWiki {
$history->history();
break;
case 'revisiondelete':
- # For show/hide submission from history page
+ // For show/hide submission from history page
$special = SpecialPage::getPage( 'Revisiondelete' );
$special->execute( '' );
break;
@@ -579,4 +548,4 @@ class MediaWiki {
}
-}; /* End of class MediaWiki */
+}
diff --git a/includes/WikiError.php b/includes/WikiError.php
index 251c1742..452554c3 100644
--- a/includes/WikiError.php
+++ b/includes/WikiError.php
@@ -1,7 +1,8 @@
<?php
/**
* MediaWiki error classes
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -19,6 +20,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
*/
/**
@@ -58,7 +60,13 @@ class WikiError {
* @return bool
*/
public static function isError( $object ) {
- return $object instanceof WikiError;
+ if ( $object instanceof WikiError ) {
+ return true;
+ } elseif ( $object instanceof Status ) {
+ return !$object->isOK();
+ } else {
+ return false;
+ }
}
}
@@ -71,7 +79,7 @@ class WikiErrorMsg extends WikiError {
* @param $message String: wiki message name
* @param ... parameters to pass to wfMsg()
*/
- function WikiErrorMsg( $message/*, ... */ ) {
+ function __construct( $message/*, ... */ ) {
$args = func_get_args();
array_shift( $args );
$this->mMessage = wfMsgReal( $message, $args, true );
@@ -100,7 +108,7 @@ class WikiXmlError extends WikiError {
* @param $context
* @param $offset Int
*/
- function WikiXmlError( $parser, $message = 'XML parsing error', $context = null, $offset = 0 ) {
+ function __construct( $parser, $message = 'XML parsing error', $context = null, $offset = 0 ) {
$this->mXmlError = xml_get_error_code( $parser );
$this->mColumn = xml_get_current_column_number( $parser );
$this->mLine = xml_get_current_line_number( $parser );
diff --git a/includes/WikiMap.php b/includes/WikiMap.php
index 878e165f..e12f7abe 100644
--- a/includes/WikiMap.php
+++ b/includes/WikiMap.php
@@ -12,7 +12,7 @@ class WikiMap {
* @return WikiReference object or null if the wiki was not found
*/
public static function getWiki( $wikiID ) {
- global $wgConf, $IP;
+ global $wgConf;
$wgConf->loadFullData();
@@ -68,12 +68,14 @@ class WikiMap {
global $wgUser;
$sk = $wgUser->getSkin();
- if ( !$text )
+ if ( !$text ) {
$text = $page;
+ }
$url = self::getForeignURL( $wikiID, $page );
- if ( $url === false )
+ if ( $url === false ) {
return false;
+ }
return $sk->makeExternalLink( $url, $text );
}
@@ -88,8 +90,9 @@ class WikiMap {
public static function getForeignURL( $wikiID, $page ) {
$wiki = WikiMap::getWiki( $wikiID );
- if ( $wiki )
+ if ( $wiki ) {
return $wiki->getUrl( $page );
+ }
return false;
}
diff --git a/includes/Xml.php b/includes/Xml.php
index 464b142c..970444fa 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -46,8 +46,9 @@ class Xml {
if( is_null( $attribs ) ) {
return null;
} elseif( is_array( $attribs ) ) {
- foreach( $attribs as $name => $val )
+ foreach( $attribs as $name => $val ) {
$out .= " {$name}=\"" . Sanitizer::encodeAttribute( $val ) . '"';
+ }
return $out;
} else {
throw new MWException( 'Expected attribute array, got something else in ' . __METHOD__ );
@@ -80,7 +81,7 @@ class Xml {
/**
* This opens an XML element
*
- * @param $element name of the element
+ * @param $element String name of the element
* @param $attribs array of attributes, see Xml::expandAttributes()
* @return string
*/
@@ -90,7 +91,7 @@ class Xml {
/**
* Shortcut to close an XML element
- * @param $element element name
+ * @param $element String element name
* @return string
*/
public static function closeElement( $element ) { return "</$element>"; }
@@ -99,9 +100,9 @@ class Xml {
* Same as Xml::element(), but does not escape contents. Handy when the
* content you have is already valid xml.
*
- * @param $element element name
+ * @param $element String element name
* @param $attribs array of attributes
- * @param $contents content of the element
+ * @param $contents String content of the element
* @return string
*/
public static function tags( $element, $attribs = null, $contents ) {
@@ -133,10 +134,12 @@ class Xml {
if( !is_null( $all ) )
$namespaces = array( $all => wfMsg( 'namespacesall' ) ) + $namespaces;
foreach( $namespaces as $index => $name ) {
- if( $index < NS_MAIN )
+ if( $index < NS_MAIN ) {
continue;
- if( $index === 0 )
+ }
+ if( $index === 0 ) {
$name = wfMsg( 'blanknamespace' );
+ }
$options[] = self::option( $name, $index, $index === $selected );
}
@@ -147,7 +150,7 @@ class Xml {
. "\n"
. Xml::closeElement( 'select' );
if ( !is_null( $label ) ) {
- $ret = Xml::label( $label, $element_name ) . '&nbsp;' . $ret;
+ $ret = Xml::label( $label, $element_name ) . '&#160;' . $ret;
}
return $ret;
}
@@ -173,7 +176,7 @@ class Xml {
. implode( "\n", $options )
. self::closeElement( 'select' );
}
-
+
/**
* @param $year Integer
* @param $month Integer
@@ -211,14 +214,14 @@ class Xml {
* @return array of label and select
*/
public static function languageSelector( $selected, $customisedOnly = true ) {
- global $wgContLanguageCode;
+ global $wgLanguageCode;
/**
* Make sure the site language is in the list; a custom language code
* might not have a defined name...
*/
$languages = Language::getLanguageNames( $customisedOnly );
- if( !array_key_exists( $wgContLanguageCode, $languages ) ) {
- $languages[$wgContLanguageCode] = $wgContLanguageCode;
+ if( !array_key_exists( $wgLanguageCode, $languages ) ) {
+ $languages[$wgLanguageCode] = $wgLanguageCode;
}
ksort( $languages );
@@ -227,7 +230,7 @@ class Xml {
* Otherwise, no default is selected and the user ends up
* with an Afrikaans interface since it's first in the list.
*/
- $selected = isset( $languages[$selected] ) ? $selected : $wgContLanguageCode;
+ $selected = isset( $languages[$selected] ) ? $selected : $wgLanguageCode;
$options = "\n";
foreach( $languages as $code => $name ) {
$options .= Xml::option( "$code - $name", $code, ($code == $selected) ) . "\n";
@@ -245,10 +248,10 @@ class Xml {
/**
* Shortcut to make a span element
- * @param $text content of the element, will be escaped
- * @param $class class name of the span element
+ * @param $text String content of the element, will be escaped
+ * @param $class String class name of the span element
* @param $attribs other attributes
- * @return string
+ * @return string
*/
public static function span( $text, $class, $attribs=array() ) {
return self::element( 'span', array( 'class' => $class ) + $attribs, $text );
@@ -260,7 +263,7 @@ class Xml {
* @param $class class name of the span element
* @param $tag element name
* @param $attribs other attributes
- * @return string
+ * @return string
*/
public static function wrapClass( $text, $class, $tag='span', $attribs=array() ) {
return self::tags( $tag, array( 'class' => $class ) + $attribs, $text );
@@ -268,17 +271,24 @@ class Xml {
/**
* Convenience function to build an HTML text input field
- * @param $name value of the name attribute
+ * @param $name String value of the name attribute
* @param $size value of the size attribute
* @param $value value of the value attribute
* @param $attribs other attributes
* @return string HTML
*/
public static function input( $name, $size=false, $value=false, $attribs=array() ) {
- return self::element( 'input', array(
- 'name' => $name,
- 'size' => $size,
- 'value' => $value ) + $attribs );
+ $attributes = array( 'name' => $name );
+
+ if( $size ) {
+ $attributes['size'] = $size;
+ }
+
+ if( $value !== false ) { // maybe 0
+ $attributes['value'] = $value;
+ }
+
+ return self::element( 'input', $attributes + $attribs );
}
/**
@@ -303,9 +313,9 @@ class Xml {
/**
* Convenience function to build an HTML checkbox
- * @param $name value of the name attribute
- * @param $checked Whether the checkbox is checked or not
- * @param $attribs other attributes
+ * @param $name String value of the name attribute
+ * @param $checked Bool Whether the checkbox is checked or not
+ * @param $attribs Array other attributes
* @return string HTML
*/
public static function check( $name, $checked=false, $attribs=array() ) {
@@ -335,19 +345,27 @@ class Xml {
/**
* Convenience function to build an HTML form label
- * @param $label text of the label
- * @param $id
+ * @param $label String text of the label
+ * @param $id
+ * @param $attribs Array an attribute array. This will usuall be
+ * the same array as is passed to the corresponding input element,
+ * so this function will cherry-pick appropriate attributes to
+ * apply to the label as well; currently only class is applied.
* @return string HTML
*/
- public static function label( $label, $id ) {
- return self::element( 'label', array( 'for' => $id ), $label );
+ public static function label( $label, $id, $attribs=array() ) {
+ $a = array( 'for' => $id );
+ if( isset( $attribs['class'] ) ){
+ $a['class'] = $attribs['class'];
+ }
+ return self::element( 'label', $a, $label );
}
/**
* Convenience function to build an HTML text input field with a label
- * @param $label text of the label
- * @param $name value of the name attribute
- * @param $id id of the input
+ * @param $label String text of the label
+ * @param $name String value of the name attribute
+ * @param $id String id of the input
* @param $size value of the size attribute
* @param $value value of the value attribute
* @param $attribs other attributes
@@ -355,7 +373,7 @@ class Xml {
*/
public static function inputLabel( $label, $name, $id, $size=false, $value=false, $attribs=array() ) {
list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
- return $label . '&nbsp;' . $input;
+ return $label . '&#160;' . $input;
}
/**
@@ -363,7 +381,7 @@ class Xml {
*/
public static function inputLabelSep( $label, $name, $id, $size=false, $value=false, $attribs=array() ) {
return array(
- Xml::label( $label, $id ),
+ Xml::label( $label, $id, $attribs ),
self::input( $name, $size, $value, array( 'id' => $id ) + $attribs )
);
}
@@ -374,8 +392,8 @@ class Xml {
*/
public static function checkLabel( $label, $name, $id, $checked=false, $attribs=array() ) {
return self::check( $name, $checked, array( 'id' => $id ) + $attribs ) .
- '&nbsp;' .
- self::label( $label, $id );
+ '&#160;' .
+ self::label( $label, $id, $attribs );
}
/**
@@ -384,8 +402,8 @@ class Xml {
*/
public static function radioLabel( $label, $name, $value, $id, $checked=false, $attribs=array() ) {
return self::radio( $name, $value, $checked, array( 'id' => $id ) + $attribs ) .
- '&nbsp;' .
- self::label( $label, $id );
+ '&#160;' .
+ self::label( $label, $id, $attribs );
}
/**
@@ -436,7 +454,6 @@ class Xml {
* @return string
*/
public static function listDropDown( $name= '', $list = '', $other = '', $selected = '', $class = '', $tabindex = Null ) {
- $options = '';
$optgroup = false;
$options = self::option( $other, 'other', $selected === 'other' );
@@ -501,7 +518,7 @@ class Xml {
return $s;
}
-
+
/**
* Shortcut for creating textareas.
*
@@ -566,8 +583,8 @@ class Xml {
$s = $value ? 'true' : 'false';
} elseif ( is_null( $value ) ) {
$s = 'null';
- } elseif ( is_int( $value ) ) {
- $s = $value;
+ } elseif ( is_int( $value ) || is_float( $value ) ) {
+ $s = strval($value);
} elseif ( is_array( $value ) && // Make sure it's not associative.
array_keys($value) === range( 0, count($value) - 1 ) ||
count($value) == 0
@@ -580,6 +597,8 @@ class Xml {
$s .= self::encodeJsVar( $elt );
}
$s .= ']';
+ } elseif ( $value instanceof XmlJsCode ) {
+ $s = $value->value;
} elseif ( is_object( $value ) || is_array( $value ) ) {
// Objects and associative arrays
$s = '{';
@@ -597,6 +616,30 @@ class Xml {
return $s;
}
+ /**
+ * Create a call to a JavaScript function. The supplied arguments will be
+ * encoded using Xml::encodeJsVar().
+ *
+ * @param $name The name of the function to call, or a JavaScript expression
+ * which evaluates to a function object which is called.
+ * @param $args Array of arguments to pass to the function.
+ * @since 1.17
+ */
+ public static function encodeJsCall( $name, $args ) {
+ $s = "$name(";
+ $first = true;
+ foreach ( $args as $arg ) {
+ if ( $first ) {
+ $first = false;
+ } else {
+ $s .= ', ';
+ }
+ $s .= Xml::encodeJsVar( $arg );
+ }
+ $s .= ");\n";
+ return $s;
+ }
+
/**
* Check if a string is well-formed XML.
@@ -655,18 +698,18 @@ class Xml {
array( '&quot;', '&gt;', '&lt;' ),
$in );
}
-
+
/**
* Generate a form (without the opening form element).
* Output optionally includes a submit button.
- * @param $fields Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
- * @param $submitLabel A message containing a label for the submit button.
+ * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
+ * @param $submitLabel String A message containing a label for the submit button.
* @return string HTML form.
*/
public static function buildForm( $fields, $submitLabel = null ) {
$form = '';
$form .= "<table><tbody>";
-
+
foreach( $fields as $labelmsg => $input ) {
$id = "mw-$labelmsg";
$form .= Xml::openElement( 'tr', array( 'id' => $id ) );
@@ -681,13 +724,13 @@ class Xml {
$form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMsg( $submitLabel ) ) . Xml::closeElement( 'td' );
$form .= Xml::closeElement( 'tr' );
}
-
+
$form .= "</tbody></table>";
-
+
return $form;
}
-
+
/**
* Build a table of data
* @param $rows An array of arrays of strings, each to be a row in a table
@@ -712,7 +755,7 @@ class Xml {
$s .= Xml::closeElement( 'table' );
return $s;
}
-
+
/**
* Build a row for a table
* @param $attribs An array of attributes to apply to the tr tag
@@ -737,9 +780,15 @@ class XmlSelect {
protected $attributes = array();
public function __construct( $name = false, $id = false, $default = false ) {
- if ( $name ) $this->setAttribute( 'name', $name );
- if ( $id ) $this->setAttribute( 'id', $id );
- if ( $default ) $this->default = $default;
+ if ( $name ) {
+ $this->setAttribute( 'name', $name );
+ }
+ if ( $id ) {
+ $this->setAttribute( 'id', $id );
+ }
+ if ( $default !== false ) {
+ $this->default = $default;
+ }
}
public function setDefault( $default ) {
@@ -763,7 +812,7 @@ class XmlSelect {
$value = ($value !== false) ? $value : $name;
$this->options[] = Xml::option( $name, $value, $value === $this->default );
}
-
+
// This accepts an array of form
// label => value
// label => ( label => value, label => value )
@@ -773,7 +822,7 @@ class XmlSelect {
// This accepts an array of form
// label => value
- // label => ( label => value, label => value )
+ // label => ( label => value, label => value )
static function formatOptions( $options, $default = false ) {
$data = '';
foreach( $options as $label => $value ) {
@@ -784,7 +833,7 @@ class XmlSelect {
$data .= Xml::option( $label, $value, $value === $default ) . "\n";
}
}
-
+
return $data;
}
@@ -793,3 +842,23 @@ class XmlSelect {
}
}
+
+/**
+ * A wrapper class which causes Xml::encodeJsVar() and Xml::encodeJsCall() to
+ * interpret a given string as being a JavaScript expression, instead of string
+ * data.
+ *
+ * Example:
+ *
+ * Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
+ *
+ * Returns "a + b".
+ * @since 1.17
+ */
+class XmlJsCode {
+ public $value;
+
+ function __construct( $value ) {
+ $this->value = $value;
+ }
+}
diff --git a/includes/XmlFunctions.php b/includes/XmlFunctions.php
deleted file mode 100644
index 8cb8f3f5..00000000
--- a/includes/XmlFunctions.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-/**
- * Aliases for functions in the Xml module
- * Look at the Xml class (Xml.php) for the implementations.
- */
-function wfElement( $element, $attribs = null, $contents = '') {
- wfDeprecated(__FUNCTION__);
- return Xml::element( $element, $attribs, $contents );
-}
-function wfElementClean( $element, $attribs = array(), $contents = '') {
- wfDeprecated(__FUNCTION__);
- return Xml::elementClean( $element, $attribs, $contents );
-}
-function wfOpenElement( $element, $attribs = null ) {
- wfDeprecated(__FUNCTION__);
- return Xml::openElement( $element, $attribs );
-}
-function wfCloseElement( $element ) {
- wfDeprecated(__FUNCTION__);
- return "</$element>";
-}
-function HTMLnamespaceselector($selected = '', $allnamespaces = null ) {
- wfDeprecated(__FUNCTION__);
- return Xml::namespaceSelector( $selected, $allnamespaces );
-}
-function wfSpan( $text, $class, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::span( $text, $class, $attribs );
-}
-function wfInput( $name, $size=false, $value=false, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::input( $name, $size, $value, $attribs );
-}
-function wfAttrib( $name, $present = true ) {
- wfDeprecated(__FUNCTION__);
- return Xml::attrib( $name, $present );
-}
-function wfCheck( $name, $checked=false, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::check( $name, $checked, $attribs );
-}
-function wfRadio( $name, $value, $checked=false, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::radio( $name, $value, $checked, $attribs );
-}
-function wfLabel( $label, $id ) {
- wfDeprecated(__FUNCTION__);
- return Xml::label( $label, $id );
-}
-function wfInputLabel( $label, $name, $id, $size=false, $value=false, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::inputLabel( $label, $name, $id, $size, $value, $attribs );
-}
-function wfCheckLabel( $label, $name, $id, $checked=false, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::checkLabel( $label, $name, $id, $checked, $attribs );
-}
-function wfRadioLabel( $label, $name, $value, $id, $checked=false, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::radioLabel( $label, $name, $value, $id, $checked, $attribs );
-}
-function wfSubmitButton( $value, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::submitButton( $value, $attribs );
-}
-function wfHidden( $name, $value, $attribs=array() ) {
- wfDeprecated(__FUNCTION__);
- return Xml::hidden( $name, $value, $attribs );
-}
-function wfEscapeJsString( $string ) {
- wfDeprecated(__FUNCTION__);
- return Xml::escapeJsString( $string );
-}
-function wfIsWellFormedXml( $text ) {
- wfDeprecated(__FUNCTION__);
- return Xml::isWellFormed( $text );
-}
-function wfIsWellFormedXmlFragment( $text ) {
- wfDeprecated(__FUNCTION__);
- return Xml::isWellFormedXmlFragment( $text );
-}
-
-function wfBuildForm( $fields, $submitLabel ) {
- wfDeprecated(__FUNCTION__);
- return Xml::buildForm( $fields, $submitLabel );
-}
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index 61faa8df..a04220c6 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -12,7 +12,7 @@ class ZhClient {
*
* @access private
*/
- function ZhClient($host, $port) {
+ function __construct($host, $port) {
$this->mHost = $host;
$this->mPort = $port;
$this->mConnected = $this->connect();
@@ -35,7 +35,7 @@ class ZhClient {
$errno = $errstr = '';
$this->mFP = fsockopen($this->mHost, $this->mPort, $errno, $errstr, 30);
wfRestoreWarnings();
- if(!$this->mFP) {
+ if ( !$this->mFP ) {
return false;
}
return true;
@@ -47,8 +47,9 @@ class ZhClient {
* @access private
*/
function query($request) {
- if(!$this->mConnected)
+ if ( !$this->mConnected ) {
return false;
+ }
fwrite($this->mFP, $request);
@@ -68,8 +69,9 @@ class ZhClient {
$data .= $str;
}
//data should be of length $len. otherwise something is wrong
- if(strlen($data) != $len)
+ if ( strlen($data) != $len ) {
return false;
+ }
return $data;
}
@@ -84,8 +86,9 @@ class ZhClient {
$len = strlen($text);
$q = "CONV $tolang $len\n$text";
$result = $this->query($q);
- if(!$result)
+ if ( !$result ) {
$result = $text;
+ }
return $result;
}
@@ -99,8 +102,9 @@ class ZhClient {
$len = strlen($text);
$q = "CONV ALL $len\n$text";
$result = $this->query($q);
- if(!$result)
+ if ( !$result ) {
return false;
+ }
list($infoline, $data) = explode('|', $result, 2);
$info = explode(";", $infoline);
$ret = array();
@@ -122,8 +126,8 @@ class ZhClient {
$len = strlen($text);
$q = "SEG $len\n$text";
$result = $this->query($q);
- if(!$result) {// fallback to character based segmentation
- $result = ZhClientFake::segment($text);
+ if ( !$result ) {// fallback to character based segmentation
+ $result = $this->segment($text);
}
return $result;
}
diff --git a/includes/ZhConversion.php b/includes/ZhConversion.php
index 400cdd2e..7ffdeab8 100644
--- a/includes/ZhConversion.php
+++ b/includes/ZhConversion.php
@@ -4,6 +4,8 @@
*
* Automatically generated using code and data in includes/zhtable/
* Do not modify directly!
+ *
+ * @file
*/
$zh2Hant = array(
@@ -82,6 +84,7 @@ $zh2Hant = array(
'䴗' => '鶪',
'ä´˜' => 'é·ˆ',
'ä´™' => 'é·¿',
+'䶮' => '龑',
'万' => 'è¬',
'与' => '與',
'专' => '專',
@@ -203,6 +206,7 @@ $zh2Hant = array(
'击' => '擊',
'凿' => '鑿',
'åˆ' => '芻',
+'划' => '劃',
'刘' => '劉',
'则' => '則',
'刚' => '剛',
@@ -272,6 +276,7 @@ $zh2Hant = array(
'å·' => '號',
'å¹' => '嘆',
'å½' => '嘰',
+'åŽ' => '後',
'å“' => '嚇',
'å•' => 'å‘‚',
'å—' => 'å—Ž',
@@ -2745,40 +2750,82 @@ $zh2Hant = array(
'𫛢' => '鸋',
'𫛶' => '鶒',
'𫛸' => '鶗',
+'0åªæ”¯æŒ' => '0åªæ”¯æŒ',
+'0åªæ”¯æ´' => '0åªæ”¯æ´',
+'0周åŽ' => '0周後',
'0多åª' => '0多隻',
'0天åŽ' => '0天後',
+'0å¹´' => '0å¹´',
'0åª' => '0éš»',
'0余' => '0餘',
+'1åªæ”¯æŒ' => '1åªæ”¯æŒ',
+'1åªæ”¯æ´' => '1åªæ”¯æ´',
+'1周åŽ' => '1周後',
'1天åŽ' => '1天後',
+'1å¹´' => '1å¹´',
'1åª' => '1éš»',
'1余' => '1餘',
+'2åªæ”¯æŒ' => '2åªæ”¯æŒ',
+'2åªæ”¯æ´' => '2åªæ”¯æ´',
+'2周åŽ' => '2周後',
'2天åŽ' => '2天後',
+'2å¹´' => '2å¹´',
'2åª' => '2éš»',
'2余' => '2餘',
+'3åªæ”¯æŒ' => '3åªæ”¯æŒ',
+'3åªæ”¯æ´' => '3åªæ”¯æ´',
+'3周åŽ' => '3周後',
'3天åŽ' => '3天後',
+'3å¹´' => '3å¹´',
'3åª' => '3éš»',
'3余' => '3餘',
+'4åªæ”¯æŒ' => '4åªæ”¯æŒ',
+'4åªæ”¯æ´' => '4åªæ”¯æ´',
+'4周åŽ' => '4周後',
'4天åŽ' => '4天後',
+'4å¹´' => '4å¹´',
'4åª' => '4éš»',
'4余' => '4餘',
+'5åªæ”¯æŒ' => '5åªæ”¯æŒ',
+'5åªæ”¯æ´' => '5åªæ”¯æ´',
+'5周åŽ' => '5周後',
'5天åŽ' => '5天後',
+'5å¹´' => '5å¹´',
'5åª' => '5éš»',
'5余' => '5餘',
+'6åªæ”¯æŒ' => '6åªæ”¯æŒ',
+'6åªæ”¯æ´' => '6åªæ”¯æ´',
+'6周åŽ' => '6周後',
'6天åŽ' => '6天後',
+'6å¹´' => '6å¹´',
'6åª' => '6éš»',
'6余' => '6餘',
+'7åªæ”¯æŒ' => '7åªæ”¯æŒ',
+'7åªæ”¯æ´' => '7åªæ”¯æ´',
+'7周åŽ' => '7周後',
'7天åŽ' => '7天後',
+'7å¹´' => '7å¹´',
'7åª' => '7éš»',
'7余' => '7餘',
+'8åªæ”¯æŒ' => '8åªæ”¯æŒ',
+'8åªæ”¯æ´' => '8åªæ”¯æ´',
+'8周åŽ' => '8周後',
'8天åŽ' => '8天後',
+'8å¹´' => '8å¹´',
'8åª' => '8éš»',
'8余' => '8餘',
+'9åªæ”¯æŒ' => '9åªæ”¯æŒ',
+'9åªæ”¯æ´' => '9åªæ”¯æ´',
+'9周åŽ' => '9周後',
'9天åŽ' => '9天後',
+'9å¹´' => '9å¹´',
'9åª' => '9éš»',
'9余' => '9餘',
'·范' => '·范',
'ã€å…‹åˆ¶' => 'ã€å‰‹åˆ¶',
'。克制' => '。剋制',
+'〇周åŽ' => '〇周後',
+'〇年' => '〇年',
'〇åª' => '〇隻',
'〇余' => '〇餘',
'一干二净' => '一乾二淨',
@@ -2794,10 +2841,11 @@ $zh2Hant = array(
'一出生' => '一出生',
'一出ç¥å±±' => '一出ç¥å±±',
'一出逃' => '一出逃',
-'一å‰ä¸€åŽ' => '一å‰ä¸€å¾Œ',
-'一划' => '一劃',
+'一划' => '一划',
'一åŠåª' => '一åŠåª',
+'一åŠéŒ¢' => '一åŠéŒ¢',
'一åŠé’±' => '一åŠéŒ¢',
+'一周åŽ' => '一周後',
'一地里' => '一地裡',
'一伙' => '一夥',
'一天åŽ' => '一天後',
@@ -2807,6 +2855,8 @@ $zh2Hant = array(
'一干弟兄' => '一干弟兄',
'一干弟å­' => '一干弟å­',
'一干部下' => '一干部下',
+'一年' => '一年',
+'一年里' => '一年裡',
'一åŠ' => '一弔',
'一别头' => '一彆頭',
'一斗斗' => '一斗斗',
@@ -2820,9 +2870,11 @@ $zh2Hant = array(
'一锅é¢' => '一é‹éºµ',
'一åª' => '一隻',
'一é¢é£Ÿ' => '一é¢é£Ÿ',
+'一头长å‘' => '一頭長髮',
'一余' => '一餘',
'一å‘åƒé’§' => '一髮åƒéˆž',
'一哄而散' => '一鬨而散',
+'一出å­' => '一齣å­',
'ä¸ä¸å½“当' => 'ä¸ä¸ç•¶ç•¶',
'ä¸ä¸‘' => 'ä¸ä¸‘',
'七个' => '七個',
@@ -2832,8 +2884,9 @@ $zh2Hant = array(
'七出生' => '七出生',
'七出ç¥å±±' => '七出ç¥å±±',
'七出逃' => '七出逃',
-'七划' => '七劃',
+'七周åŽ' => '七周後',
'七天åŽ' => '七天後',
+'七年' => '七年',
'七情六欲' => '七情六慾',
'七扎' => '七紮',
'七åª' => '七隻',
@@ -2847,7 +2900,9 @@ $zh2Hant = array(
'三出生' => '三出生',
'三出ç¥å±±' => '三出ç¥å±±',
'三出逃' => '三出逃',
+'三周åŽ' => '三周後',
'三天åŽ' => '三天後',
+'三年' => '三年',
'三å¾ä¸ƒè¾Ÿ' => '三徵七辟',
'三准' => '三準',
'三扎' => '三紮',
@@ -2890,7 +2945,6 @@ $zh2Hant = array(
'ä¸å‡†è®¸' => 'ä¸å‡†è¨±',
'ä¸å‡†è°' => 'ä¸å‡†èª°',
'ä¸å…‹åˆ¶' => 'ä¸å‰‹åˆ¶',
-'ä¸å‰ä¸åŽ' => 'ä¸å‰ä¸å¾Œ',
'ä¸åŠ è‡ªåˆ¶' => 'ä¸åŠ è‡ªåˆ¶',
'ä¸å å‡¶å‰' => 'ä¸å å‡¶å‰',
'ä¸å åœ' => 'ä¸å åœ',
@@ -2918,6 +2972,7 @@ $zh2Hant = array(
'ä¸å¹²' => 'ä¸å¹¹',
'ä¸åŠ' => 'ä¸å¼”',
'ä¸é‡‡' => 'ä¸æŽ¡',
+'ä¸æ–—膽' => 'ä¸æ–—膽',
'ä¸æ–—胆' => 'ä¸æ–—膽',
'ä¸æ–­å‘' => 'ä¸æ–·ç™¼',
'ä¸æ¯åª' => 'ä¸æ¯åª',
@@ -2930,6 +2985,7 @@ $zh2Hant = array(
'ä¸é€šåŠåº†' => 'ä¸é€šå¼”æ…¶',
'ä¸ä¸‘' => 'ä¸é†œ',
'ä¸é‡‡å£°' => 'ä¸é‡‡è²',
+'ä¸é‡‡è²' => 'ä¸é‡‡è²',
'ä¸é”ˆé’¢' => 'ä¸é½é‹¼',
'ä¸é£Ÿå¹²è…Š' => 'ä¸é£Ÿä¹¾è…Š',
'ä¸æ–—' => 'ä¸é¬¥',
@@ -2950,12 +3006,15 @@ $zh2Hant = array(
'世纪钟表' => '世紀é˜éŒ¶',
'丢丑' => '丟醜',
'并ä¸å‡†' => '並ä¸å‡†',
+'并ä¸å‡†ç¡®' => '並ä¸æº–確',
'并存ç€' => '並存著',
'并曰入淀' => '並曰入澱',
'并å‘动' => '並發動',
'并å‘展' => '並發展',
+'并å‘布' => '並發布',
'并å‘现' => '並發ç¾',
'并å‘表' => '並發表',
+'并行' => '並行',
'中国国际信托投资公å¸' => '中國國際信托投資公å¸',
'中型钟' => '中型é˜',
'中型钟表é¢' => '中型é˜è¡¨é¢',
@@ -2963,11 +3022,13 @@ $zh2Hant = array(
'中型钟é¢' => '中型é˜é¢',
'中仑' => '中崙',
'中岳' => '中嶽',
+'中庄å­' => '中庄å­',
'中文里' => '中文裡',
'中于' => '中於',
'中签' => '中籤',
'中美å‘表' => '中美發表',
'中è¯' => '中藥',
+'中风åŽ' => '中風後',
'丰儀' => '丰儀',
'丰仪' => '丰儀',
'丰å—' => '丰å—',
@@ -2994,7 +3055,6 @@ $zh2Hant = array(
'之一åª' => '之一åª',
'之二åª' => '之二åª',
'之八ä¹åª' => '之八ä¹åª',
-'之åŽ' => '之後',
'之å¾' => '之徵',
'之托' => '之託',
'之钟' => '之é˜',
@@ -3008,13 +3068,15 @@ $zh2Hant = array(
'ä¹å‡ºç”Ÿ' => 'ä¹å‡ºç”Ÿ',
'ä¹å‡ºç¥å±±' => 'ä¹å‡ºç¥å±±',
'ä¹å‡ºé€ƒ' => 'ä¹å‡ºé€ƒ',
-'ä¹åˆ’' => 'ä¹åŠƒ',
+'ä¹å‘¨åŽ' => 'ä¹å‘¨å¾Œ',
'ä¹å¤©åŽ' => 'ä¹å¤©å¾Œ',
+'ä¹å¹´' => 'ä¹å¹´',
'ä¹è°·' => 'ä¹ç©€',
'ä¹æ‰Ž' => 'ä¹ç´®',
'ä¹åª' => 'ä¹éš»',
'ä¹ä½™' => 'ä¹é¤˜',
'ä¹é¾™è¡¨è¡Œ' => 'ä¹é¾è¡¨è¡Œ',
+'ä¹é¾è¡¨è¡Œ' => 'ä¹é¾è¡¨è¡Œ',
'也克制' => '也剋制',
'也斗了胆' => '也斗了膽',
'干干' => '乾乾',
@@ -3176,7 +3238,7 @@ $zh2Hant = array(
'乱哄' => '亂鬨',
'乱哄ä¸è¿‡æ¥' => '亂鬨ä¸éŽä¾†',
'了克制' => '了剋制',
-'事åŽ' => '事後',
+'了然åŽ' => '了然後',
'事情干脆' => '事情干脆',
'事有斗巧' => '事有鬥巧',
'事迹' => '事迹',
@@ -3189,10 +3251,11 @@ $zh2Hant = array(
'二出生' => '二出生',
'二出ç¥å±±' => '二出ç¥å±±',
'二出逃' => '二出逃',
-'二划' => '二劃',
'二åªå¾—' => '二åªå¾—',
+'二周åŽ' => '二周後',
'二天åŽ' => '二天後',
'二仑' => '二崙',
+'二年' => '二年',
'二缶钟惑' => '二缶é˜æƒ‘',
'二è€æ¿' => '二è€æ¿',
'二虎相斗' => '二虎相鬥',
@@ -3203,31 +3266,42 @@ $zh2Hant = array(
'于丹' => '于丹',
'于于' => '于于',
'于ä»æ³°' => '于ä»æ³°',
+'于仲文' => '于仲文',
'于佳å‰' => '于佳å‰',
+'于æ¥å±±' => '于來山',
'于伟国' => '于å‰åœ‹',
'于å‰åœ‹' => '于å‰åœ‹',
+'于光新' => '于光新',
'于光远' => '于光é ',
'于光é ' => '于光é ',
'于克-蘭多縣' => '于克-蘭多縣',
'于克-兰多县' => '于克-蘭多縣',
'于克勒' => '于克勒',
+'于å†æ¸…' => '于å†æ¸…',
'于冕' => '于冕',
+'于冠åŽ' => '于冠è¯',
'于凌奎' => '于凌奎',
+'于凌辰' => '于凌辰',
'于勒' => '于勒',
'于化虎' => '于化虎',
'于å å…ƒ' => '于å å…ƒ',
+'于å‹æ³½' => '于å‹æ¾¤',
'于å°ç…™' => '于å°ç…™',
'于å°çƒŸ' => '于å°ç…™',
'于å³ä»»' => '于å³ä»»',
'于å‰' => '于å‰',
+'于和伟' => '于和å‰',
'于å“æµ·' => '于å“æµ·',
'于国桢' => '于國楨',
'于國楨' => '于國楨',
+'于国治' => '于國治',
+'于國治' => '于國治',
'于åš' => '于堅',
'于堅' => '于堅',
'于大寶' => '于大寶',
'于大å®' => '于大寶',
'于天ä»' => '于天ä»',
+'于天龙' => '于天é¾',
'于奇库æœå…‹' => '于奇庫æœå…‹',
'于奇庫æœå…‹' => '于奇庫æœå…‹',
'于姓' => '于姓',
@@ -3242,6 +3316,8 @@ $zh2Hant = array(
'于å°ä¼Ÿ' => '于å°å‰',
'于å°å‰' => '于å°å‰',
'于å°å½¤' => '于å°å½¤',
+'于å°æƒ ' => '于å°æƒ ',
+'于少ä¿' => '于少ä¿',
'于山' => '于山',
'于山国' => '于山國',
'于山國' => '于山國',
@@ -3258,6 +3334,7 @@ $zh2Hant = array(
'于德海' => '于德海',
'于志å®' => '于志寧',
'于志寧' => '于志寧',
+'于忠肃集' => '于忠肅集',
'于æ€' => '于æ€',
'于慎行' => '于慎行',
'于慧' => '于慧',
@@ -3269,8 +3346,8 @@ $zh2Hant = array(
'于æ•ä¸­' => '于æ•ä¸­',
'于斌' => '于斌',
'于斯塔德' => '于斯塔德',
-'于斯ç´çˆ¾æ–¯è²é‡Œ' => '于斯ç´çˆ¾æ–¯è²é‡Œ',
'于斯纳尔斯è´é‡Œ' => '于斯ç´çˆ¾æ–¯è²é‡Œ',
+'于斯ç´çˆ¾æ–¯è²é‡Œ' => '于斯ç´çˆ¾æ–¯è²é‡Œ',
'于斯达尔' => '于斯é”爾',
'于斯é”爾' => '于斯é”爾',
'于明涛' => '于明濤',
@@ -3283,9 +3360,13 @@ $zh2Hant = array(
'于根伟' => '于根å‰',
'于根å‰' => '于根å‰',
'于格' => '于格',
+'于楓' => '于楓',
+'于枫' => '于楓',
+'于è£å…‰' => '于榮光',
'于樂' => '于樂',
'于树æ´' => '于樹潔',
'于樹潔' => '于樹潔',
+'于欣' => '于欣',
'于欣æº' => '于欣æº',
'于正å‡' => '于正昇',
'于正昇' => '于正昇',
@@ -3294,22 +3375,26 @@ $zh2Hant = array(
'于永波' => '于永波',
'于江震' => '于江震',
'于波' => '于波',
+'于洋' => '于洋',
'于洪区' => '于洪å€',
'于洪å€' => '于洪å€',
'于浩å¨' => '于浩å¨',
+'于海' => '于海',
'于海洋' => '于海洋',
'于湘兰' => '于湘蘭',
'于湘蘭' => '于湘蘭',
'于漢超' => '于漢超',
'于汉超' => '于漢超',
+'于澄' => '于澄',
'于泽尔' => '于澤爾',
'于澤爾' => '于澤爾',
'于涛' => '于濤',
'于濤' => '于濤',
+'于熙ç' => '于熙ç',
'于爾岑' => '于爾岑',
'于尔岑' => '于爾岑',
-'于尔根' => '于爾根',
'于爾根' => '于爾根',
+'于尔根' => '于爾根',
'于尔里克' => '于爾里克',
'于爾里克' => '于爾里克',
'于特森' => '于特森',
@@ -3317,8 +3402,10 @@ $zh2Hant = array(
'于田' => '于田',
'于ç¦' => '于ç¦',
'于秀æ•' => '于秀æ•',
+'于立æˆ' => '于立æˆ',
'于素秋' => '于素秋',
'于美人' => '于美人',
+'于耘婕' => '于耘婕',
'于若木' => '于若木',
'于蔭霖' => '于蔭霖',
'于è«éœ–' => '于蔭霖',
@@ -3326,6 +3413,7 @@ $zh2Hant = array(
'于西翰' => '于西翰',
'于謙' => '于謙',
'于谦' => '于謙',
+'于谨' => '于謹',
'于è²çˆ¾' => '于è²çˆ¾',
'于è´å°”' => '于è²çˆ¾',
'于赠' => '于贈',
@@ -3342,6 +3430,8 @@ $zh2Hant = array(
'于阗' => '于é—',
'于雙戈' => '于雙戈',
'于åŒæˆˆ' => '于雙戈',
+'于云鹤' => '于雲鶴',
+'于震' => '于震',
'于震寰' => '于震寰',
'于震环' => '于震環',
'于震環' => '于震環',
@@ -3352,11 +3442,15 @@ $zh2Hant = array(
'于风政' => '于風政',
'于風政' => '于風政',
'于飞' => '于飛',
+'于飛島' => '于飛島',
+'于飞岛' => '于飛島',
'于余曲折' => '于餘曲折',
+'于鬯' => '于鬯',
+'于é­æ™º' => '于é­æ™º',
'于凤æ¡' => '于鳳æ¡',
'于鳳æ¡' => '于鳳æ¡',
-'于鳳至' => '于鳳至',
'于凤至' => '于鳳至',
+'于鳳至' => '于鳳至',
'于默奥' => '于默奧',
'于默奧' => '于默奧',
'云乎' => '云乎',
@@ -3374,9 +3468,10 @@ $zh2Hant = array(
'五出生' => '五出生',
'五出ç¥å±±' => '五出ç¥å±±',
'五出逃' => '五出逃',
-'五划' => '五劃',
+'五周åŽ' => '五周後',
'五天åŽ' => '五天後',
'五岳' => '五嶽',
+'五年' => '五年',
'五谷' => '五穀',
'五扎' => '五紮',
'五行生克' => '五行生剋',
@@ -3416,38 +3511,44 @@ $zh2Hant = array(
'人å‚选' => '人åƒé¸',
'人å‚é…Œ' => '人åƒé…Œ',
'人å‚阅' => '人åƒé–±',
-'人åŽ' => '人後',
+'人如风åŽå…¥æ±Ÿäº‘' => '人如風後入江雲',
'人欲' => '人慾',
'人物志' => '人物誌',
'人å‚' => '人蔘',
'什锦é¢' => '什錦麵',
'什么' => '什麼',
'仇仇' => '仇讎',
-'今åŽ' => '今後',
'他克制' => '他剋制',
'ä»–é’Ÿ' => 'ä»–é˜',
'付托' => '付託',
-'ä»™åŽåº§' => 'ä»™åŽåº§',
+'ä»™åŽ' => 'ä»™åŽ',
'ä»™è¯' => '仙藥',
'代ç è¡¨' => '代碼表',
+'代表' => '代表',
'令人å‘指' => '令人髮指',
-'以åŽ' => '以後',
'以自制' => '以自制',
'ä»°è¯' => 'ä»°è—¥',
'件钟' => '件é˜',
+'任何表演' => '任何表演',
+'任何表示' => '任何表示',
+'任何表é”' => '任何表é”',
+'任何表达' => '任何表é”',
'任何表' => '任何錶',
'任何钟' => '任何é˜',
'任何钟表' => '任何é˜éŒ¶',
'任教于' => '任教於',
'任于' => '任於',
'仿制' => '仿製',
-'ä¼åˆ’' => 'ä¼åŠƒ',
'伊于湖底' => '伊于湖底',
'伊府é¢' => '伊府麵',
'伊斯兰教历' => '伊斯蘭教曆',
'伊斯兰教历å²' => '伊斯蘭教歷å²',
'伊斯兰历' => '伊斯蘭曆',
'伊斯兰历å²' => '伊斯蘭歷å²',
+'伊东怜' => '伊æ±æ€œ',
+'伊尔汗历表' => '伊爾汗曆表',
+'伊达里å­' => '伊é”里å­',
+'伊适æ°' => '伊é©æ°',
'伊éƒ' => '伊鬱',
'ä¼å‡ ' => 'ä¼å‡ ',
'ä¼ç½ªåŠæ°‘' => 'ä¼ç½ªå¼”æ°‘',
@@ -3712,8 +3813,17 @@ $zh2Hant = array(
'å ï½˜' => '佔x',
'å ï½™' => '佔y',
'å ï½š' => '佔z',
+'何æ°' => '何æ°',
+'余三胜' => '余三å‹',
+'余三å‹' => '余三å‹',
'余光中' => '余光中',
'余光生' => '余光生',
+'余力為' => '余力為',
+'余力为' => '余力為',
+'余姓' => '余姓',
+'ä½™å¨å¾·' => 'ä½™å¨å¾·',
+'ä½™å­æ˜Ž' => 'ä½™å­æ˜Ž',
+'ä½™æ€æ•' => 'ä½™æ€æ•',
'佛罗棱è¨' => '佛羅稜薩',
'佛钟' => 'ä½›é˜',
'作å“里' => '作å“裡',
@@ -3726,6 +3836,7 @@ $zh2Hant = array(
'佣金收益' => '佣金收益',
'佣金费用' => '佣金費用',
'佳肴' => '佳肴',
+'佳里鎮' => '佳里鎮',
'并一ä¸äºŒ' => '併一ä¸äºŒ',
'并入' => '併入',
'并兼' => '併兼',
@@ -3742,7 +3853,10 @@ $zh2Hant = array(
'并产' => '併產',
'并当' => '併當',
'并å ' => '併疊',
-'并å‘' => '併發',
+'并å‘型模å¼' => '併發型模å¼',
+'并å‘模å¼' => '併發模å¼',
+'并å‘ç—‡' => '併發症',
+'并å‘é‡ç—‡' => '併發é‡ç—‡',
'并科' => '併科',
'并网' => '併網',
'并线' => '併線',
@@ -3768,8 +3882,8 @@ $zh2Hant = array(
'ä¿é™©æŸœ' => 'ä¿éšªæŸœ',
'信托贸易' => '信托貿易',
'信托' => '信託',
-'修改åŽ' => '修改後',
'ä¿®æ°æ¥·' => 'ä¿®æ°æ¥·',
+'ä¿®æ°éºŸ' => 'ä¿®æ°éºŸ',
'修炼' => 'ä¿®éŠ',
'修胡刀' => 'ä¿®é¬åˆ€',
'俯冲' => '俯è¡',
@@ -3790,7 +3904,6 @@ $zh2Hant = array(
'å‡æ‰˜' => 'å‡è¨—',
'å‡å‘' => 'å‡é«®',
'åŽå¹²' => 'åŽä¹¾',
-'ååŽ' => 'å後',
'åšåº„' => 'åšèŽŠ',
'åœåœå½“当' => 'åœåœç•¶ç•¶',
'åœå¾' => 'åœå¾µ',
@@ -3810,8 +3923,10 @@ $zh2Hant = array(
'佣懒' => '傭懶',
'佣书' => '傭書',
'佣金' => '傭金',
+'傲游' => '傲éŠ',
'傲霜斗雪' => '傲霜鬥雪',
'ä¼ ä½äºŽå››å¤ªå­' => '傳ä½äºŽå››å¤ªå­',
+'傳ä½äºŽå››å¤ªå­' => '傳ä½äºŽå››å¤ªå­',
'传于' => '傳於',
'伤痕累累' => 'å‚·ç—•çºçº',
'傻里傻气' => '傻裡傻氣',
@@ -3824,6 +3939,7 @@ $zh2Hant = array(
'仆固怀æ©' => '僕固懷æ©',
'仆夫' => '僕夫',
'仆姑' => '僕姑',
+'仆婢' => '僕婢',
'仆妇' => '僕婦',
'仆射' => '僕射',
'仆少' => '僕少',
@@ -3837,6 +3953,7 @@ $zh2Hant = array(
'僮仆' => '僮僕',
'雇主' => '僱主',
'雇人' => '僱人',
+'雇佣' => '僱傭',
'雇到' => '僱到',
'雇员' => '僱員',
'雇工' => '僱工',
@@ -3845,8 +3962,10 @@ $zh2Hant = array(
'仪范' => '儀範',
'仪表' => '儀錶',
'亿个' => '億個',
+'亿周åŽ' => '億周後',
'亿多åª' => '億多隻',
'亿天åŽ' => '億天後',
+'亿年' => '億年',
'亿åª' => 'å„„éš»',
'亿余' => '億餘',
'俭仆' => '儉僕',
@@ -3895,19 +4014,7 @@ $zh2Hant = array(
'凶相' => '兇相',
'凶险' => '兇險',
'å…ˆå ' => '先佔',
-'å…ˆåŽ' => '先後',
-'先忧åŽä¹' => '先憂後樂',
'先采' => '先採',
-'先攻åŽå®ˆ' => '先攻後守',
-'先盛åŽè¡°' => '先盛後衰',
-'先礼åŽå…µ' => '先禮後兵',
-'先义åŽåˆ©' => '先義後利',
-'先声åŽå®ž' => 'å…ˆè²å¾Œå¯¦',
-'先苦åŽç”˜' => '先苦後甘',
-'先赢åŽè¾“' => 'å…ˆè´å¾Œè¼¸',
-'先进åŽå‡º' => '先進後出',
-'先开花åŽç»“æžœ' => '先開花後çµæžœ',
-'å…‰å‰è£•åŽ' => 'å…‰å‰è£•å¾Œ',
'光致致' => '光緻緻',
'å…‹è¯' => 'å…‹è—¥',
'å…‹å¤' => '克複',
@@ -3916,8 +4023,8 @@ $zh2Hant = array(
'党太尉' => '党太尉',
'党怀英' => '党懷英',
'党进' => '党進',
+'å…šé …' => 'å…šé …',
'党项' => '党項',
-'入夜åŽ' => '入夜後',
'内制' => '內製',
'内é¢åŒ…' => 'å…§é¢åŒ…',
'内é¢åŒ…çš„' => 'å…§é¢åŒ…çš„',
@@ -3927,8 +4034,10 @@ $zh2Hant = array(
'å…¨é¢åŒ…å›´' => 'å…¨é¢åŒ…åœ',
'å…¨é¢åŒ…裹' => 'å…¨é¢åŒ…裹',
'两个' => '兩個',
+'两周åŽ' => '兩周後',
'两天åŽ' => '兩天後',
'两天晒网' => '兩天晒網',
+'两年' => '兩年',
'两扎' => '兩紮',
'两虎共斗' => '兩虎共鬥',
'两åª' => 'å…©éš»',
@@ -3941,16 +4050,17 @@ $zh2Hant = array(
'八出生' => '八出生',
'八出ç¥å±±' => '八出ç¥å±±',
'八出逃' => '八出逃',
+'八周åŽ' => '八周後',
'八大胡åŒ' => '八大胡åŒ',
'八天åŽ' => '八天後',
'八字胡' => 'å…«å­—é¬',
+'å…«å¹´' => 'å…«å¹´',
'八扎' => '八紮',
'八蜡' => '八蜡',
'å…«åª' => 'å…«éš»',
'八余' => '八餘',
'公仔é¢' => '公仔麵',
'公仆' => '公僕',
-'公元åŽ' => '公元後',
'公孙丑' => '公孫丑',
'公干' => '公幹',
'公历' => '公曆',
@@ -3964,8 +4074,9 @@ $zh2Hant = array(
'六出生' => '六出生',
'六出ç¥å±±' => '六出ç¥å±±',
'六出逃' => '六出逃',
-'六划' => '六劃',
+'六周åŽ' => '六周後',
'六天åŽ' => '六天後',
+'å…­å¹´' => 'å…­å¹´',
'å…­è°·' => 'å…­ç©€',
'六扎' => '六紮',
'六冲' => 'å…­è¡',
@@ -3977,7 +4088,6 @@ $zh2Hant = array(
'其一åª' => '其一åª',
'其二åª' => '其二åª',
'其八ä¹åª' => '其八ä¹åª',
-'å…¶åŽ' => '其後',
'其次辟地' => '其次辟地',
'其余' => '其餘',
'典范' => '典範',
@@ -3994,6 +4104,7 @@ $zh2Hant = array(
'冷庄å­' => '冷莊å­',
'冷é¢ç›¸' => '冷é¢ç›¸',
'冷é¢' => '冷麵',
+'准三åŽ' => '准三åŽ',
'准ä¸å‡†ä»–' => '准ä¸å‡†ä»–',
'准ä¸å‡†ä½ ' => '准ä¸å‡†ä½ ',
'准ä¸å‡†å¥¹' => '准ä¸å‡†å¥¹',
@@ -4001,8 +4112,10 @@ $zh2Hant = array(
'准ä¸å‡†æˆ‘' => '准ä¸å‡†æˆ‘',
'准ä¸å‡†è®¸' => '准ä¸å‡†è¨±',
'准ä¸å‡†è°' => '准ä¸å‡†èª°',
+'准ä¿è­·' => '准ä¿è­·',
'准ä¿æŠ¤' => '准ä¿è­·',
'准ä¿é‡Š' => '准ä¿é‡‹',
+'准ä¿é‡‹' => '准ä¿é‡‹',
'凌蒙åˆ' => '凌濛åˆ',
'å‡ç‚¼' => 'å‡éŠ',
'几上' => '几上',
@@ -4025,7 +4138,6 @@ $zh2Hant = array(
'出乖露丑' => '出乖露醜',
'出å¾æ”¶' => '出å¾æ”¶',
'出于' => '出於',
-'出谋划策' => '出謀劃策',
'出游' => '出éŠ',
'出丑' => '出醜',
'出锤' => '出鎚',
@@ -4034,6 +4146,7 @@ $zh2Hant = array(
'分åŠé’Ÿ' => '分åŠé˜',
'分多钟' => '分多é˜',
'分å­é’Ÿ' => '分å­é˜',
+'分å­äº‘' => '分å­é›²',
'分布圖' => '分布圖',
'分布图' => '分布圖',
'分布于' => '分布於',
@@ -4041,16 +4154,40 @@ $zh2Hant = array(
'分钟' => '分é˜',
'刑余' => '刑餘',
'划一桨' => '划一槳',
+'划上' => '划上',
+'划下' => '划下',
+'划ä¸æ¥' => '划ä¸ä¾†',
+'划了' => '划了',
'划了一会' => '划了一會',
'划æ¥åˆ’去' => '划來划去',
+'划具' => '划具',
+'划出' => '划出',
+'划到' => '划到',
'划到岸' => '划到岸',
'划到江心' => '划到江心',
+'划动' => '划動',
+'划去' => '划去',
+'划å­' => '划å­',
'划得æ¥' => '划得來',
+'划拳' => '划拳',
+'划桨' => '划槳',
+'划水' => '划水',
+'划算' => '划算',
+'划船' => '划船',
+'划艇' => '划艇',
'划ç€' => '划著',
'划ç€èµ°' => '划著走',
+'划行' => '划行',
+'划走' => '划走',
+'划起' => '划起',
+'划进' => '划進',
+'划进æ¥' => '划進來',
+'划进去' => '划進去',
+'划过' => '划éŽ',
+'划过æ¥' => '划éŽä¾†',
+'划过去' => '划éŽåŽ»',
'划龙舟' => '划é¾èˆŸ',
'判断å‘' => '判斷發',
-'别åŽ' => '別後',
'别日å—鸿æ‰åŒ—去' => '別日å—鴻纔北去',
'别致' => '別緻',
'别庄' => '別莊',
@@ -4059,8 +4196,6 @@ $zh2Hant = array(
'利欲' => '利慾',
'利于' => '利於',
'利欲ç†å¿ƒ' => '利欲ç†å¿ƒ',
-'删åŽç•™ä½' => '刪後留ä½',
-'删åŽç¼©ä½' => '刪後縮ä½',
'刮æ¥åˆ®åŽ»' => '刮來刮去',
'刮ç€' => '刮著',
'刮起æ¥' => '刮起來',
@@ -4070,7 +4205,6 @@ $zh2Hant = array(
'制签' => '制籤',
'制钟' => '制é˜',
'刺绣' => '刺繡',
-'刻划' => '刻劃',
'刻åŠé’Ÿ' => '刻åŠé˜',
'刻多钟' => '刻多é˜',
'刻钟' => '刻é˜',
@@ -4086,15 +4220,7 @@ $zh2Hant = array(
'克期' => '剋期',
'克死' => '剋死',
'克薄' => '剋薄',
-'å‰ä»°åŽåˆ' => 'å‰ä»°å¾Œåˆ',
-'å‰å€¨åŽæ­' => 'å‰å€¨å¾Œæ­',
-'å‰å‰åŽåŽ' => 'å‰å‰å¾Œå¾Œ',
-'å‰å‘¼åŽæ‹¥' => 'å‰å‘¼å¾Œæ“',
-'å‰åŽ' => 'å‰å¾Œ',
-'å‰æ€åŽæƒ³' => 'å‰æ€å¾Œæƒ³',
-'å‰æŒ½åŽæŽ¨' => 'å‰æŒ½å¾ŒæŽ¨',
-'å‰çŸ­åŽé•¿' => 'å‰çŸ­å¾Œé•·',
-'å‰è¨€ä¸å¯¹åŽè¯­' => 'å‰è¨€ä¸å°å¾Œèªž',
+'å‰å¾€' => 'å‰å¾€',
'å‰è¨€ä¸ç­”åŽè¯­' => 'å‰è¨€ä¸ç­”後語',
'å‰é¢åº—' => 'å‰é¢åº—',
'剔庄货' => '剔莊貨',
@@ -4115,36 +4241,13 @@ $zh2Hant = array(
'铲平' => '剷平',
'铲除' => '剷除',
'铲头' => '剷頭',
-'划一' => '劃一',
-'划上' => '劃上',
-'划下' => '劃下',
-'划了' => '劃了',
-'划出' => '劃出',
-'划分' => '劃分',
-'划到' => '劃到',
-'划划' => '劃劃',
-'划去' => '劃去',
-'划在' => '劃在',
-'划地' => '劃地',
-'划定' => '劃定',
-'划得' => '劃得',
-'划æˆ' => '劃æˆ',
-'划掉' => '劃掉',
-'划拨' => '劃撥',
-'划时代' => '劃時代',
-'划款' => '劃款',
-'划归' => '劃歸',
-'划法' => '劃法',
-'划清' => '劃清',
+'划入' => '劃入',
'划为' => '劃為',
-'划界' => '劃界',
-'划破' => '劃破',
-'划线' => '劃線',
-'划足' => '劃足',
-'划过' => '劃éŽ',
-'划开' => '劃開',
'剧è¯' => '劇藥',
+'刘佳怜' => '劉佳怜',
+'劉佳怜' => '劉佳怜',
'刘克庄' => '劉克莊',
+'刘芸åŽ' => '劉芸åŽ',
'力克制' => '力剋制',
'力拼' => '力拚',
'力拼众敌' => '力拼眾敵',
@@ -4156,7 +4259,6 @@ $zh2Hant = array(
'加注' => '加註',
'劣于' => '劣於',
'助于' => '助於',
-'劫åŽä½™ç”Ÿ' => '劫後餘生',
'劫余' => '劫餘',
'勃éƒ' => '勃鬱',
'动è¡' => 'å‹•è•©',
@@ -4181,7 +4283,6 @@ $zh2Hant = array(
'匡å¤' => '匡複',
'匪干' => '匪幹',
'匿于' => '匿於',
-'区划' => 'å€åŠƒ',
'å个' => 'å個',
'å出刊' => 'å出刊',
'å出å£' => 'å出å£',
@@ -4189,21 +4290,26 @@ $zh2Hant = array(
'å出生' => 'å出生',
'å出ç¥å±±' => 'å出ç¥å±±',
'å出逃' => 'å出逃',
-'å划' => 'å劃',
+'å周åŽ' => 'å周後',
'å多åª' => 'å多隻',
'å天åŽ' => 'å天後',
+'åå¹´' => 'åå¹´',
'å扎' => 'åç´®',
'ååª' => 'åéš»',
'åä½™' => 'å餘',
'å出' => 'åé½£',
'åƒä¸ª' => 'åƒå€‹',
'åƒåªå¯' => 'åƒåªå¯',
+'åƒåªå¤ ' => 'åƒåªå¤ ',
'åƒåªå¤Ÿ' => 'åƒåªå¤ ',
'åƒåªæ€•' => 'åƒåªæ€•',
'åƒåªèƒ½' => 'åƒåªèƒ½',
'åƒåªè¶³å¤Ÿ' => 'åƒåªè¶³å¤ ',
+'åƒåªè¶³å¤ ' => 'åƒåªè¶³å¤ ',
+'åƒå‘¨åŽ' => 'åƒå‘¨å¾Œ',
'åƒå¤šåª' => 'åƒå¤šéš»',
'åƒå¤©åŽ' => 'åƒå¤©å¾Œ',
+'åƒå¹´' => 'åƒå¹´',
'åƒæ‰Ž' => 'åƒç´®',
'åƒä¸ä¸‡ç¼•' => 'åƒçµ²è¬ç¸·',
'åƒå›žç™¾æŠ˜' => 'åƒè¿´ç™¾æŠ˜',
@@ -4212,12 +4318,13 @@ $zh2Hant = array(
'åƒåª' => 'åƒéš»',
'åƒä½™' => 'åƒé¤˜',
'å‡å®˜å‘è´¢' => 'å‡å®˜ç™¼è²¡',
-'åˆåŽ' => 'åˆå¾Œ',
'åŠåˆ¶å“' => 'åŠåˆ¶å“',
'åŠåªå¯' => 'åŠåªå¯',
'åŠåªå¤Ÿ' => 'åŠåªå¤ ',
'åŠäºŽ' => 'åŠæ–¼',
'åŠåª' => 'åŠéš»',
+'åè°ƒ' => 'å”調',
+'å防' => 'å”防',
'å—京钟' => 'å—京é˜',
'å—京钟表' => 'å—京é˜éŒ¶',
'å—宫适' => 'å—宮适',
@@ -4229,6 +4336,7 @@ $zh2Hant = array(
'å—游' => 'å—éŠ',
'åšæ±‡' => 'åšå½™',
'åšé‡‡' => 'åšæŽ¡',
+'åœäº‘å‰' => 'åœäº‘å‰',
'åžåº„' => 'åžèŽŠ',
'åžåº„å­' => 'åžèŽŠå­',
'å äº†åœ' => 'å äº†åœ',
@@ -4247,7 +4355,6 @@ $zh2Hant = array(
'原å­é’Ÿ' => '原å­é˜',
'原钟' => '原é˜',
'历物之æ„' => '厤物之æ„',
-'厥åŽ' => '厥後',
'å‚åˆ' => 'åƒåˆ',
'å‚考价值' => 'åƒè€ƒåƒ¹å€¼',
'å‚与' => 'åƒèˆ‡',
@@ -4293,9 +4400,12 @@ $zh2Hant = array(
'åªå ç®—' => 'åªå ç®—',
'åªé‡‡' => 'åªæŽ¡',
'åªå†²' => 'åªè¡',
+'åªè¦åŠŸå¤«æ·±ï¼Œé“æµç£¨æˆé”ˆèŠ±é’ˆ' => 'åªè¦åŠŸå¤«æ·±ï¼Œéµæµç£¨æˆé½èŠ±é‡',
'åªèº«ä¸Šå·²' => 'åªèº«ä¸Šå·²',
'åªèº«ä¸Šæœ‰' => 'åªèº«ä¸Šæœ‰',
+'åªèº«ä¸Šæ²’' => 'åªèº«ä¸Šæ²’',
'åªèº«ä¸Šæ²¡' => 'åªèº«ä¸Šæ²’',
+'åªèº«ä¸Šç„¡' => 'åªèº«ä¸Šç„¡',
'åªèº«ä¸Šæ— ' => 'åªèº«ä¸Šç„¡',
'åªèº«ä¸Šçš„' => 'åªèº«ä¸Šçš„',
'åªèº«ä¸–' => 'åªèº«ä¸–',
@@ -4306,14 +4416,18 @@ $zh2Hant = array(
'åªèº«å½¢' => 'åªèº«å½¢',
'åªèº«å½±' => 'åªèº«å½±',
'åªèº«åŽ' => 'åªèº«å¾Œ',
+'åªèº«å¾Œ' => 'åªèº«å¾Œ',
'åªèº«å¿ƒ' => 'åªèº«å¿ƒ',
'åªèº«æ—' => 'åªèº«æ—',
'åªèº«æ' => 'åªèº«æ',
'åªèº«æ®µ' => 'åªèº«æ®µ',
'åªèº«ä¸º' => 'åªèº«ç‚º',
+'åªèº«ç‚º' => 'åªèº«ç‚º',
'åªèº«è¾¹' => 'åªèº«é‚Š',
+'åªèº«é‚Š' => 'åªèº«é‚Š',
'åªèº«é¦–' => 'åªèº«é¦–',
'åªèº«ä½“' => 'åªèº«é«”',
+'åªèº«é«”' => 'åªèº«é«”',
'åªèº«é«˜' => 'åªèº«é«˜',
'åªé‡‡å£°' => 'åªé‡‡è²',
'å®å®å½“当' => 'å®å®å™¹å™¹',
@@ -4324,7 +4438,6 @@ $zh2Hant = array(
'å°å­å¥³' => 'å°å­å¥³',
'å°å­å­™' => 'å°å­å­«',
'å°å¸ƒæ™¯' => 'å°å¸ƒæ™¯',
-'å°åŽ' => 'å°å¾Œ',
'å°åŽ†å²' => 'å°æ­·å²',
'å°é’Ÿ' => 'å°é˜',
'å°é¢å‰' => 'å°é¢å‰',
@@ -4336,9 +4449,10 @@ $zh2Hant = array(
'å±å’¤å’¤' => 'å±å’¤å’¤',
'å±å’¤ä¹å›' => 'å±å’¤æ¨‚壇',
'å±å’¤æ¨‚壇' => 'å±å’¤æ¨‚壇',
-'å³åŽ' => 'å³å¾Œ',
'å¶ æ­å¼˜' => 'å¶ æ­å¼˜',
'å¶ã€€æ­å¼˜' => 'å¶ã€€æ­å¼˜',
+'å¶ä¸äºŒå­' => 'å¶ä¸äºŒå­',
+'å¶å¿—ç©—' => 'å¶å¿—ç©—',
'å¶æ­å¼˜' => 'å¶æ­å¼˜',
'å¶éŸ³' => 'å¶éŸ³',
'å¶éŸµ' => 'å¶éŸ»',
@@ -4346,7 +4460,6 @@ $zh2Hant = array(
'åƒç€ä¸å°½' => 'åƒè‘—ä¸ç›¡',
'åƒå§œ' => 'åƒè–‘',
'åƒè¯' => 'åƒè—¥',
-'åƒè¯åŽ' => 'åƒè—¥å¾Œ',
'åƒé‡Œæ‰’外' => 'åƒè£¡æ‰’外',
'åƒé‡Œçˆ¬å¤–' => 'åƒè£¡çˆ¬å¤–',
'åƒè¾£é¢' => 'åƒè¾£éºµ',
@@ -4374,16 +4487,35 @@ $zh2Hant = array(
'åŒä¼™' => 'åŒå¤¥',
'åŒäºŽ' => 'åŒæ–¼',
'åŒä½™' => 'åŒé¤˜',
+'åŽå† ' => 'åŽå† ',
+'åŽåŒ—è¡—' => 'åŽåŒ—è¡—',
+'åŽåœŸ' => 'åŽåœŸ',
+'åŽå¦ƒ' => 'åŽå¦ƒ',
+'åŽå®‰è·¯' => 'åŽå®‰è·¯',
+'åŽå¹³è·¯' => 'åŽå¹³è·¯',
+'åŽåº§' => 'åŽåº§',
+'åŽæµ·æ¹¾' => 'åŽæµ·ç£',
+'åŽæµ·ç£' => 'åŽæµ·ç£',
+'åŽç‘žç«™' => 'åŽç‘žç«™',
+'åŽç¨·' => 'åŽç¨·',
+'åŽç¾¿' => 'åŽç¾¿',
+'åŽè¡—' => 'åŽè¡—',
+'åŽè§’' => 'åŽè§’',
'åŽä¸°' => 'åŽè±',
'åŽè±' => 'åŽè±',
+'åŽé‡Œ' => 'åŽé‡Œ',
+'åŽå‘FK型星' => 'åŽé«®FK型星',
+'åŽé«®FK型星' => 'åŽé«®FK型星',
+'åŽé«®åº§' => 'åŽé«®åº§',
'åŽå‘座' => 'åŽé«®åº§',
+'åŽå‘星系团' => 'åŽé«®æ˜Ÿç³»åœ˜',
+'åŽé«®æ˜Ÿç³»åœ˜' => 'åŽé«®æ˜Ÿç³»åœ˜',
'å哺æ‰å‘' => 'å哺æ‰é«®',
'å哺æ¡å‘' => 'å哺æ¡é«®',
'å‘å¾€æ¥' => 'å‘往來',
'å‘往常' => 'å‘往常',
'å‘往日' => 'å‘往日',
'å‘往时' => 'å‘往時',
-'å‘åŽ' => 'å‘後',
'å‘ç€' => 'å‘è‘—',
'åžå¹¶' => 'åžä½µ',
'åŸæ¸¸' => 'åŸéŠ',
@@ -4392,8 +4524,11 @@ $zh2Hant = array(
'å¹å‘' => 'å¹é«®',
'å¹èƒ¡' => 'å¹é¬',
'å¾ä¸ºä¹‹èŒƒæˆ‘驰驱' => 'å¾çˆ²ä¹‹ç¯„我馳驅',
+'å•åŽ' => 'å‘‚åŽ',
+'å‘‚åŽ' => 'å‘‚åŽ',
'呆呆傻傻' => '呆呆傻傻',
'呆呆挣挣' => '呆呆掙掙',
+'呆呆ç¸' => '呆呆ç¸',
'呆呆兽' => '呆呆ç¸',
'呆呆笨笨' => '呆呆笨笨',
'呆致致' => '呆緻緻',
@@ -4403,6 +4538,7 @@ $zh2Hant = array(
'周二' => '周二',
'周五' => '周五',
'周六' => '周六',
+'周åŽ' => '周åŽ',
'周四' => '周四',
'周历' => '周曆',
'周æ°ä¼¦' => '周æ°å€«',
@@ -4429,16 +4565,15 @@ $zh2Hant = array(
'å”åŠ' => 'å”å¼”',
'呗赞' => '唄讚',
'唇干' => '唇乾',
-'å”®åŽ' => '售後',
'唯一åª' => '唯一åª',
'唱游' => 'å”±éŠ',
'唾é¢è‡ªå¹²' => '唾é¢è‡ªä¹¾',
'唾余' => '唾餘',
'商历' => '商曆',
'商历å²' => '商歷å²',
+'å¯å‘å¼' => '啟發å¼',
'啷当' => '啷噹',
'喂了一声' => '喂了一è²',
-'å–„åŽ' => '善後',
'善于' => '善於',
'å–œå‘å¾€' => 'å–œå‘å¾€',
'喜欢表' => '喜歡錶',
@@ -4452,9 +4587,7 @@ $zh2Hant = array(
'å•å•äºŽ' => '單單於',
'å•å¹²' => '單幹',
'å•æ‰“独斗' => '單打ç¨é¬¥',
-'å•åª' => '單隻',
'å—‘è¯' => 'å—‘è—¥',
-'å—£åŽ' => '嗣後',
'嘀嗒的表' => '嘀嗒的錶',
'嘉谷' => '嘉穀',
'嘉肴' => '嘉肴',
@@ -4469,6 +4602,7 @@ $zh2Hant = array(
'å‘å¾€' => '嚮往',
'å‘应' => '嚮應',
'å‘è¿©' => '嚮邇',
+'严云农' => '嚴云農',
'严于' => '嚴於',
'严ä¸åˆç¼' => 'åš´çµ²åˆç¸«',
'嚼谷' => '嚼穀',
@@ -4485,8 +4619,11 @@ $zh2Hant = array(
'四出逃' => '四出逃',
'四分历' => '四分曆',
'四分历å²' => '四分歷å²',
+'四周åŽ' => '四周後',
'四天åŽ' => '四天後',
+'四年' => '四年',
'å››èˆäº”å…¥' => 'å››æ¨äº”å…¥',
+'å››èˆå…­å…¥' => 'å››æ¨å…­å…¥',
'四扎' => '四紮',
'å››åª' => '四隻',
'å››é¢åŒ…' => 'å››é¢åŒ…',
@@ -4507,6 +4644,7 @@ $zh2Hant = array(
'困兽之斗' => 'å›°ç¸ä¹‹é¬¥',
'困兽犹斗' => 'å›°ç¸çŒ¶é¬¥',
'困斗' => '困鬥',
+'固定制' => '固定制',
'固å¾' => '固徵',
'囿于' => '囿於',
'圈å ' => '圈佔',
@@ -4520,6 +4658,7 @@ $zh2Hant = array(
'国历任' => '國歷任',
'国历å²' => '國歷å²',
'国历届' => '國歷屆',
+'国历ç»' => '國歷經',
'国仇' => '國讎',
'园里' => '園裡',
'园游会' => '園éŠæœƒ',
@@ -4530,10 +4669,10 @@ $zh2Hant = array(
'土霉素' => '土霉素',
'在制å“' => '在制å“',
'在克制' => '在剋制',
-'在åŽ' => '在後',
'在于' => '在於',
'地å ' => '地佔',
'地克制' => '地剋制',
+'地心历表' => '地心曆表',
'地方志' => '地方志',
'地志' => '地誌',
'地丑德é½' => '地醜德齊',
@@ -4552,11 +4691,15 @@ $zh2Hant = array(
'型范' => '型範',
'埃åŠåŽ†' => '埃åŠæ›†',
'埃åŠåŽ†å²' => '埃åŠæ­·å²',
+'埃åŠè‰³åŽ' => '埃åŠè±”åŽ',
'埃è£å†²' => '埃榮è¡',
'埋头寻表' => '埋頭尋錶',
'埋头寻钟' => '埋頭尋é˜',
'埋头寻钟表' => '埋頭尋é˜éŒ¶',
'城里' => '城裡',
+'埔裡社撫墾局' => '埔è£ç¤¾æ’«å¢¾å±€',
+'埔è£ç¤¾æ’«å¢¾å±€' => '埔è£ç¤¾æ’«å¢¾å±€',
+'埔里社抚垦局' => '埔è£ç¤¾æ’«å¢¾å±€',
'基干' => '基幹',
'基于' => '基於',
'基准' => '基準',
@@ -4583,6 +4726,8 @@ $zh2Hant = array(
'壶里' => '壺裡',
'壸范' => '壼範',
'寿é¢' => '壽麵',
+'å¤äºŽä¹”' => 'å¤äºŽå–¬',
+'å¤äºŽå–¬' => 'å¤äºŽå–¬',
'å¤å¤©é‡Œ' => 'å¤å¤©è£¡',
'å¤æ—¥é‡Œ' => 'å¤æ—¥è£¡',
'å¤åŽ†' => 'å¤æ›†',
@@ -4591,15 +4736,17 @@ $zh2Hant = array(
'外强中干' => '外強中乾',
'外制' => '外製',
'多å ' => '多佔',
-'多划' => '多劃',
'多åŠåª' => '多åŠåª',
'多åªå¯' => '多åªå¯',
'多åªåœ¨' => '多åªåœ¨',
'多åªæ˜¯' => '多åªæ˜¯',
+'多åªæœƒ' => '多åªæœƒ',
'多åªä¼š' => '多åªæœƒ',
'多åªæœ‰' => '多åªæœ‰',
+'多åªç”¨' => '多åªç”¨',
'多åªèƒ½' => '多åªèƒ½',
'多åªéœ€' => '多åªéœ€',
+'多周åŽ' => '多周後',
'多天åŽ' => '多天後',
'多于' => '多於',
'多冲' => '多è¡',
@@ -4611,6 +4758,7 @@ $zh2Hant = array(
'夜里' => '夜裡',
'夜游' => '夜éŠ',
'够克制' => '夠剋制',
+'夢有五ä¸å ' => '夢有五ä¸å ',
'梦有五ä¸å ' => '夢有五ä¸å ',
'梦里' => '夢裡',
'梦游' => '夢éŠ',
@@ -4628,6 +4776,7 @@ $zh2Hant = array(
'大åªæœ‰' => '大åªæœ‰',
'大åªèƒ½' => '大åªèƒ½',
'大åªéœ€' => '大åªéœ€',
+'大周åŽ' => '大周åŽ',
'大型钟' => '大型é˜',
'大型钟表é¢' => '大型é˜è¡¨é¢',
'大型钟表' => '大型é˜éŒ¶',
@@ -4657,22 +4806,29 @@ $zh2Hant = array(
'大锤' => '大鎚',
'大钟' => '大é˜',
'大åª' => '大隻',
+'大风åŽ' => '大風後',
'大曲' => '大麴',
'天干物燥' => '天乾物燥',
'天克地冲' => '天克地è¡',
+'天åŽ' => '天åŽ',
'天åŽå®«' => '天åŽå®®',
-'天åŽåº™é“' => '天åŽå»Ÿé“',
'天地志狼' => '天地志狼',
'天地为范' => '天地為範',
'天干地支' => '天干地支',
-'天åŽ' => '天後',
+'天åŽæ¥' => '天後來',
+'天åŽåŠ' => '天後åŠ',
+'天åŽå¤©' => '天後天',
'天文学钟' => '天文學é˜',
+'天文历表' => '天文曆表',
'天文钟' => '天文é˜',
+'天历' => '天曆',
+'天历å²' => '天歷å²',
'天翻地覆' => '天翻地覆',
'天覆地载' => '天覆地載',
'太仆' => '太僕',
'太åˆåŽ†' => '太åˆæ›†',
'太åˆåŽ†å²' => '太åˆæ­·å²',
+'太åŽ' => '太åŽ',
'夯干' => '夯幹',
'夸人' => '夸人',
'夸克' => '夸克',
@@ -4686,7 +4842,7 @@ $zh2Hant = array(
'夸诞' => '夸誕',
'夸诞ä¸ç»' => '夸誕ä¸ç¶“',
'夸丽' => '夸麗',
-'奇迹' => '奇迹',
+'奇迹' => '奇蹟',
'奇丑' => '奇醜',
'å¥æŠ˜' => 'å¥æ‘º',
'奥å ' => '奧佔',
@@ -4707,6 +4863,7 @@ $zh2Hant = array(
'好斗笠' => '好斗笠',
'好斗篷' => '好斗篷',
'好斗胆' => '好斗膽',
+'好斗膽' => '好斗膽',
'好斗蓬' => '好斗蓬',
'好于' => '好於',
'好呆' => '好çƒ',
@@ -4716,6 +4873,7 @@ $zh2Hant = array(
'好斗' => '好鬥',
'如果干' => '如果幹',
'如饥似渴' => '如饑似渴',
+'妖åŽ' => '妖åŽ',
'妙è¯' => '妙藥',
'始于' => '始於',
'委托' => '委託',
@@ -4732,7 +4890,6 @@ $zh2Hant = array(
'奸细' => '姦細',
'奸邪' => '姦邪',
'å¨æ£±' => 'å¨ç¨œ',
-'å©šåŽ' => '婚後',
'婢仆' => '婢僕',
'娲æ†' => '媧æ†',
'å«ç¥¸äºŽ' => 'å«ç¦æ–¼',
@@ -4749,17 +4906,13 @@ $zh2Hant = array(
'å­˜å一于åƒç™¾' => 'å­˜å一於åƒç™¾',
'存折' => '存摺',
'存于' => '存於',
-'å­£åŽèµ›' => '季後賽',
'孤寡ä¸è°·' => '孤寡ä¸ç©€',
'学里' => '學裡',
'宇宙志' => '宇宙誌',
-'守先待åŽ' => '守先待後',
'安于' => '安於',
'安沈é“è·¯' => '安瀋éµè·¯',
'安眠è¯' => '安眠藥',
'安胎è¯' => '安胎藥',
-'完工åŽ' => '完工後',
-'完æˆåŽ' => '完æˆå¾Œ',
'宗周钟' => '宗周é˜',
'官ä¸æ€•å¤§åªæ€•ç®¡' => '官ä¸æ€•å¤§åªæ€•ç®¡',
'官地为采' => '官地為寀',
@@ -4784,9 +4937,9 @@ $zh2Hant = array(
'家庄' => '家莊',
'家里' => '家裡',
'家丑' => '家醜',
-'容åŽè¯´æ˜Ž' => '容後說明',
'容于' => '容於',
'容范' => '容範',
+'宿èˆ' => '宿èˆ',
'寄托在' => '寄托在',
'寄托' => '寄託',
'密致' => '密緻',
@@ -4814,6 +4967,7 @@ $zh2Hant = array(
'å®é‡Œå®æ°”' => '寶裡寶氣',
'寸å‘åƒé‡‘' => '寸髮åƒé‡‘',
'寺钟' => '寺é˜',
+'å°åŽ' => 'å°åŽ',
'å°é¢é‡Œ' => 'å°é¢è£¡',
'射雕' => '射鵰',
'å°†å ' => '將佔',
@@ -4821,6 +4975,7 @@ $zh2Hant = array(
'专å‘å¾€' => 'å°ˆå‘å¾€',
'专注' => '專註',
'专辑里' => '專輯裡',
+'å°ŠåŽ' => 'å°ŠåŽ',
'对折' => 'å°æ‘º',
'对于' => 'å°æ–¼',
'对准' => 'å°æº–',
@@ -4831,8 +4986,10 @@ $zh2Hant = array(
'对表中' => 'å°è¡¨ä¸­',
'对表扬' => 'å°è¡¨æš',
'对表明' => 'å°è¡¨æ˜Ž',
+'对表格' => 'å°è¡¨æ ¼',
'对表演' => 'å°è¡¨æ¼”',
'对表现' => 'å°è¡¨ç¾',
+'对表示' => 'å°è¡¨ç¤º',
'对表达' => 'å°è¡¨é”',
'对表' => 'å°éŒ¶',
'导游' => 'å°ŽéŠ',
@@ -4847,6 +5004,7 @@ $zh2Hant = array(
'å°åªæœ‰' => 'å°åªæœ‰',
'å°åªèƒ½' => 'å°åªèƒ½',
'å°åªéœ€' => 'å°åªéœ€',
+'å°å‘¨åŽ' => 'å°å‘¨åŽ',
'å°åž‹é’Ÿ' => 'å°åž‹é˜',
'å°åž‹é’Ÿè¡¨é¢' => 'å°åž‹é˜è¡¨é¢',
'å°åž‹é’Ÿè¡¨' => 'å°åž‹é˜éŒ¶',
@@ -4862,8 +5020,11 @@ $zh2Hant = array(
'å°¸ä½ç´ é¤' => 'å°¸ä½ç´ é¤',
'尸利' => '尸利',
'尸居余气' => '尸居餘氣',
+'尸弃佛' => '尸棄佛',
'å°¸ç¥' => 'å°¸ç¥',
'尸禄' => '尸祿',
+'尸罗精èˆ' => '尸羅精èˆ',
+'尸羅精èˆ' => '尸羅精èˆ',
'尸臣' => '尸臣',
'å°¸è°' => '尸諫',
'尸魂界' => '尸魂界',
@@ -4873,6 +5034,7 @@ $zh2Hant = array(
'屋å­é‡Œ' => '屋å­è£¡',
'屋æ¢' => '屋樑',
'屋里' => '屋裡',
+'å±é£ŽåŽ' => 'å±é¢¨å¾Œ',
'屑于' => '屑於',
'屡顾尔仆' => '屢顧爾僕',
'属于' => '屬於',
@@ -4881,7 +5043,6 @@ $zh2Hant = array(
'屯里' => '屯裡',
'山崩钟应' => '山崩é˜æ‡‰',
'山岳' => '山嶽',
-'å±±åŽ' => '山後',
'å±±æ¢' => '山樑',
'山洞里' => '山洞裡',
'山棱' => '山稜',
@@ -4889,6 +5050,7 @@ $zh2Hant = array(
'山庄' => '山莊',
'å±±è¯' => '山藥',
'山里' => '山裡',
+'山谷é“' => '山谷é“',
'å±±é‡æ°´å¤' => 'å±±é‡æ°´è¤‡',
'岱岳' => '岱嶽',
'峰回' => '峰迴',
@@ -4911,7 +5073,6 @@ $zh2Hant = array(
'巡回' => '巡迴',
'巡游' => 'å·¡éŠ',
'工致' => '工緻',
-'å·¦åŽ' => '左後',
'左冲å³çª' => 'å·¦è¡å³çª',
'巧妇åšä¸å¾—æ— é¢é¦Žé¥¦' => '巧婦åšä¸å¾—無麵餺飥',
'巧干' => '巧幹',
@@ -4937,12 +5098,12 @@ $zh2Hant = array(
'希伯æ¥åŽ†å²' => '希伯來歷å²',
'帘å­' => '帘å­',
'帘布' => '帘布',
+'å¸åŽå°' => 'å¸åŽè‡º',
'师范' => '師範',
'席å·' => '席æ²',
'带团å‚加' => '帶團åƒåŠ ',
'带å¾' => '帶徵',
'带å‘修行' => '帶髮修行',
-'幕åŽ' => '幕後',
'帮佣' => '幫傭',
'干系' => '干係',
'å¹²ç€æ€¥' => '干著急',
@@ -4950,7 +5111,6 @@ $zh2Hant = array(
'平泉庄' => '平泉莊',
'平准' => '平準',
'年代里' => '年代裡',
-'å¹´åŽ' => '年後',
'年历' => '年曆',
'年历å²' => 'å¹´æ­·å²',
'å¹´è°·' => 'å¹´ç©€',
@@ -4959,7 +5119,6 @@ $zh2Hant = array(
'并åž' => '并åž',
'并州' => '并州',
'并日而食' => '并日而食',
-'并行' => '并行',
'并迭' => '并迭',
'幸å…于难' => '幸å…於難',
'幸于' => '幸於',
@@ -5019,7 +5178,8 @@ $zh2Hant = array(
'å¹²é©å‘½' => 'å¹¹é©å‘½',
'干头' => '幹頭',
'干么' => '幹麼',
-'几划' => '幾劃',
+'几个' => '幾個',
+'几周åŽ' => '幾周後',
'几天åŽ' => '幾天後',
'几åª' => '幾隻',
'几出' => '幾齣',
@@ -5036,17 +5196,17 @@ $zh2Hant = array(
'府干é ' => '府干é ',
'府干预' => '府干é ',
'府干' => '府幹',
-'府åŽ' => '府後',
'座钟' => '座é˜',
'康庄大é“' => '康庄大é“',
-'康采æ©' => '康採æ©',
'康庄' => '康莊',
'厨余' => '廚餘',
'厮斗' => 'å»é¬¥',
'庙里' => '廟裡',
+'废åŽ' => '廢åŽ',
+'廢åŽ' => '廢åŽ',
'广å¾' => '廣徵',
'广èˆ' => '廣æ¨',
-'延åŽ' => '延後',
+'延历' => '延曆',
'建于' => '建於',
'弄干' => '弄乾',
'弄丑' => '弄醜',
@@ -5082,6 +5242,7 @@ $zh2Hant = array(
'åŠä¹¦' => '弔書',
'åŠæ¡¥' => '弔橋',
'åŠæ­»' => '弔死',
+'åŠæ­»é—®å­¤' => '弔死å•å­¤',
'åŠæ­»é—®ç–¾' => '弔死å•ç–¾',
'åŠæ°‘' => '弔民',
'åŠæ°‘ä¼ç½ª' => '弔民ä¼ç½ª',
@@ -5107,6 +5268,7 @@ $zh2Hant = array(
'张三丰' => '張三丰',
'張三丰' => '張三丰',
'张勋' => '張勳',
+'å¼ ä¹äºŽå¼ å¾' => '張樂于張å¾',
'强å ' => 'å¼·ä½”',
'强制作用' => '強制作用',
'强奸' => '強姦',
@@ -5131,10 +5293,11 @@ $zh2Hant = array(
'å½¢å•å½±åª' => '形單影隻',
'形影相åŠ' => '形影相弔',
'形于' => '形於',
+'彭于æ™' => '彭于æ™',
+'å½±åŽ' => 'å½±åŽ',
'仿佛' => '彷彿',
'役于' => '役於',
'彼此克制' => '彼此剋制',
-'å¾€åŽ' => '往後',
'往日無仇' => '往日無讎',
'往里' => '往裡',
'å¾€å¤' => '往複',
@@ -5142,180 +5305,10 @@ $zh2Hant = array(
'很凶' => '很兇',
'很丑' => '很醜',
'律历志' => '律曆志',
-'åŽä¸Š' => '後上',
-'åŽä¸‹' => '後下',
-'åŽä¸–' => '後世',
-'åŽä¸»' => '後主',
-'åŽäº‹' => '後事',
-'åŽäºº' => '後人',
-'åŽä»£' => '後代',
-'åŽä»°' => '後仰',
-'åŽä»¶' => '後件',
-'åŽä»»' => '後任',
-'åŽä½œ' => '後作',
-'åŽæ¥' => '後來',
-'åŽå' => '後å',
-'åŽå¤‡' => '後備',
-'åŽä¼ ' => '後傳',
-'åŽåˆ†' => '後分',
-'åŽåˆ°' => '後到',
-'åŽåŠ›ä¸ç»§' => '後力ä¸ç¹¼',
-'åŽåŠ²' => '後å‹',
-'åŽå‹¤' => '後勤',
-'åŽåŒº' => '後å€',
-'åŽåŠ' => '後åŠ',
'åŽå°' => '後å°',
-'åŽåŽè·¯' => '後åŽè·¯',
-'åŽåŽ»' => '後去',
-'åŽå°' => '後å°',
'åŽå°è€æ¿' => '後å°è€æ¿',
-'åŽå‘' => '後å‘',
-'åŽå‘¨' => '後周',
-'åŽå”' => '後å”',
-'åŽå—£' => '後嗣',
-'åŽå›­' => '後園',
-'åŽå›¾' => '後圖',
-'åŽåœŸ' => '後土',
-'åŽåŸ”' => '後埔',
-'åŽå ‚' => '後堂',
-'åŽå°˜' => '後塵',
-'åŽå£' => '後å£',
-'åŽå¤©' => '後天',
-'åŽå¤«' => '後夫',
-'åŽå¥' => '後å¥',
-'åŽå¦»' => '後妻',
-'åŽå¨˜' => '後娘',
-'åŽå¦‡' => '後婦',
-'åŽå­¦' => '後學',
-'åŽå®«' => '後宮',
-'åŽå±±' => '後山',
-'åŽå··' => '後巷',
-'åŽå¸‚' => '後市',
-'åŽå¹´' => '後年',
-'åŽå‡ ' => '後幾',
'åŽåº„' => '後庄',
-'åŽåº' => '後åº',
-'åŽåº§' => '後座',
-'åŽåº­' => '後庭',
-'åŽæ‚”' => '後悔',
-'åŽæ‚£' => '後患',
-'åŽæˆ¿' => '後房',
-'åŽæ‰‹' => '後手',
-'åŽæŽ’' => '後排',
-'åŽæŽ è§’' => '後掠角',
-'åŽæŽ¥' => '後接',
-'åŽæ´' => '後æ´',
-'åŽæ’¤' => '後撤',
-'åŽæ”»' => '後攻',
-'åŽæ”¾' => '後放',
-'åŽæ•ˆ' => '後效',
-'åŽæ–‡' => '後文',
-'åŽæ–¹' => '後方',
-'åŽäºŽ' => '後於',
-'åŽæ—¥' => '後日',
-'åŽæ˜Œè·¯' => '後昌路',
-'åŽæ™‹' => '後晉',
-'åŽæ™Œ' => '後晌',
-'åŽæ™š' => '後晚',
-'åŽæ™¯' => '後景',
-'åŽä¼š' => '後會',
-'åŽæœ‰' => '後有',
-'åŽæœ›é•œ' => '後望é¡',
-'åŽæœŸ' => '後期',
-'åŽæžœ' => '後果',
-'åŽæ¡…' => '後桅',
-'åŽæ¢' => '後æ¢',
-'åŽæ¡¥' => '後橋',
-'åŽæ­¥' => '後步',
-'åŽæ®µ' => '後段',
-'åŽæ®¿' => '後殿',
-'åŽæ¯' => '後æ¯',
-'åŽæ´¾' => '後派',
-'åŽæµª' => '後浪',
-'åŽå‡‰' => '後涼',
-'åŽæ¸¯' => '後港',
-'åŽæ±‰' => '後漢',
-'åŽä¸º' => '後為',
-'åŽæ— æ¥è€…' => '後無來者',
-'åŽç…§é•œ' => '後照é¡',
-'åŽç‡•' => '後燕',
-'åŽçˆ¶' => '後父',
-'åŽçŽ°ä»£' => '後ç¾ä»£',
-'åŽç”Ÿ' => '後生',
-'åŽç”¨' => '後用',
-'åŽç”±' => '後由',
-'åŽç›¾' => '後盾',
-'åŽçŸ¥' => '後知',
-'åŽçŸ¥åŽè§‰' => '後知後覺',
-'åŽç¦' => '後ç¦',
-'åŽç§ƒ' => '後禿',
-'åŽç§¦' => '後秦',
-'åŽç©ºç¿»' => '後空翻',
-'åŽçª—' => '後窗',
-'åŽç«™' => '後站',
-'åŽç«¯' => '後端',
-'åŽç«¹å›´' => '後竹åœ',
-'åŽèŠ‚' => '後節',
-'åŽç¯‡' => '後篇',
-'åŽç¼€' => '後綴',
-'åŽç»§' => '後繼',
-'åŽç»­' => '後續',
-'åŽç½®' => '後置',
-'åŽè€…' => '後者',
-'åŽè‚¢' => '後肢',
-'åŽèƒŒ' => '後背',
-'åŽè„‘' => '後腦',
-'åŽè„š' => '後腳',
-'åŽè…¿' => '後腿',
-'åŽè†›' => '後膛',
-'åŽèŠ±å›­' => '後花園',
-'åŽèœå›­' => '後èœåœ’',
-'åŽå¶' => '後葉',
-'åŽè¡Œ' => '後行',
-'åŽè¡—' => '後街',
-'åŽå«' => '後衛',
-'åŽè£”' => '後裔',
-'åŽè¡¥' => '後補',
-'åŽä™“' => '後襬',
-'åŽè§†é•œ' => '後視é¡',
-'åŽè¨€' => '後言',
-'åŽè®¡' => '後計',
-'åŽè®°' => '後記',
-'åŽè®¾' => '後設',
-'åŽè¯»' => '後讀',
-'åŽèµ°' => '後走',
-'åŽèµ·' => '後起',
-'åŽèµµ' => '後趙',
-'åŽè¶³' => '後足',
-'åŽè·Ÿ' => '後跟',
-'åŽè·¯' => '後路',
-'åŽèº«' => '後身',
-'åŽè½¦' => '後車',
-'åŽè¾ˆ' => '後輩',
-'åŽè½®' => '後輪',
-'åŽè½¬' => '後轉',
-'åŽè¿°' => '後述',
-'åŽé€€' => '後退',
-'åŽé€' => '後é€',
-'åŽè¿›' => '後進',
-'åŽè¿‡' => '後éŽ',
-'åŽé—ç—‡' => '後éºç—‡',
-'åŽè¾¹' => '後邊',
-'åŽéƒ¨' => '後部',
-'åŽé•œ' => '後é¡',
-'åŽé—¨' => '後門',
-'åŽé˜²' => '後防',
-'åŽé™¢' => '後院',
-'åŽé›†' => '後集',
-'åŽé¢' => '後é¢',
'åŽé¢åº—' => '後é¢åº—',
-'åŽé¡¹' => '後項',
-'åŽå¤´' => '後頭',
-'åŽé¢ˆ' => '後頸',
-'åŽé¡¾' => '後顧',
-'åŽé­' => '後é­',
-'åŽç‚¹' => '後點',
-'åŽé¾™' => '後é¾',
'å¾å¹²' => 'å¾å¹¹',
'徒托空言' => '徒託空言',
'得克制' => '得剋制',
@@ -5323,6 +5316,7 @@ $zh2Hant = array(
'从里到外' => '從裡到外',
'从里å‘外' => '從裡å‘外',
'å¤å§‹' => '復始',
+'å¤æ´»èŠ‚历表' => '復活節曆表',
'å¾äºº' => '徵人',
'å¾ä»¤' => '徵令',
'å¾å ' => '徵佔',
@@ -5508,13 +5502,10 @@ $zh2Hant = array(
'快克制' => '快剋制',
'快快当当' => '快快當當',
'快冲' => 'å¿«è¡',
-'忽å‰å¿½åŽ' => '忽å‰å¿½å¾Œ',
'怎么' => '怎麼',
'怎么ç€' => '怎麼著',
'怒于' => '怒於',
'怒å‘冲冠' => '怒髮è¡å† ',
-'æ€å‰æ€åŽ' => 'æ€å‰æ€å¾Œ',
-'æ€å‰æƒ³åŽ' => 'æ€å‰æƒ³å¾Œ',
'æ€å¦‚泉涌' => 'æ€å¦‚泉湧',
'怠于' => '怠於',
'急于' => '急於',
@@ -5524,9 +5515,7 @@ $zh2Hant = array(
'怪里怪气' => '怪裡怪氣',
'怫éƒ' => '怫鬱',
'æ‚æ —' => 'æ‚æ…„',
-'æ’生指数' => 'æ’生指數',
-'æ’生股价指数' => 'æ’生股價指數',
-'æ’生银行' => 'æ’生銀行',
+'æ’生' => 'æ’生',
'æ•ä¹ä»·å‚¬' => 'æ•ä¹ä»·å‚¬',
'æ¯äº¤ç»æ¸¸' => 'æ¯äº¤çµ•éŠ',
'æ¯è°·' => 'æ¯ç©€',
@@ -5585,11 +5574,11 @@ $zh2Hant = array(
'蒙懂' => '懞懂',
'蒙蒙懂懂' => '懞懞懂懂',
'蒙直' => '懞直',
-'惩å‰æ¯–åŽ' => '懲å‰æ¯–後',
'惩忿窒欲' => '懲忿窒欲',
'怀里' => '懷裡',
'怀表' => '懷錶',
'怀钟' => '懷é˜',
+'悬挂' => '懸掛',
'悬æ¢' => '懸樑',
'悬臂æ¢' => '懸臂樑',
'悬钟' => '懸é˜',
@@ -5602,11 +5591,11 @@ $zh2Hant = array(
'戬谷' => '戩穀',
'截å‘' => '截髮',
'战天斗地' => '戰天鬥地',
-'战åŽ' => '戰後',
'战栗' => '戰慄',
'战斗' => '戰鬥',
'æˆå½©å¨±äº²' => '戲綵娛親',
'æˆé‡Œ' => '戲裡',
+'戴表元' => '戴表元',
'戴表' => '戴錶',
'戴å‘å«é½¿' => '戴髮å«é½’',
'房里' => '房裡',
@@ -5630,6 +5619,7 @@ $zh2Hant = array(
'手表达' => '手表é”',
'手表露' => '手表露',
'手表é¢' => '手表é¢',
+'手里剑' => '手è£åŠ',
'手里' => '手裡',
'手表' => '手錶',
'手æ¾' => '手鬆',
@@ -5658,6 +5648,7 @@ $zh2Hant = array(
'打ç€é’Ÿ' => '打著é˜',
'打路庄æ¿' => '打路莊æ¿',
'打钟' => '打é˜',
+'打风åŽ' => '打風後',
'打斗' => '打鬥',
'托管国' => '托管國',
'扛大æ¢' => '扛大樑',
@@ -5668,8 +5659,6 @@ $zh2Hant = array(
'批å¤' => '批複',
'批注' => '批註',
'批斗' => '批鬥',
-'承先å¯åŽ' => '承先啟後',
-'承å‰å¯åŽ' => '承å‰å•Ÿå¾Œ',
'承制' => '承製',
'抑制作用' => '抑制作用',
'抑éƒ' => '抑鬱',
@@ -5737,7 +5726,6 @@ $zh2Hant = array(
'拿下钟' => '拿下é˜',
'拿准' => '拿準',
'拿破仑' => '拿破崙',
-'挂å' => '挂å',
'挂图' => '挂圖',
'挂帅' => '挂帥',
'挂彩' => '挂彩',
@@ -5745,7 +5733,6 @@ $zh2Hant = array(
'挂å·' => '挂號',
'挂车' => '挂車',
'挂é¢' => '挂é¢',
-'指手划脚' => '指手劃腳',
'挌斗' => '挌鬥',
'挑大æ¢' => '挑大樑',
'挑斗' => '挑鬥',
@@ -5817,6 +5804,7 @@ $zh2Hant = array(
'扫è¡' => '掃蕩',
'掌柜' => '掌柜',
'排骨é¢' => '排骨麵',
+'挂å' => '掛å',
'挂帘' => '掛帘',
'挂历' => '掛曆',
'挂钩' => '掛鈎',
@@ -5953,7 +5941,6 @@ $zh2Hant = array(
'æ’žé’Ÿ' => 'æ’žé˜',
'撞阵冲军' => '撞陣è¡è»',
'撤并' => '撤併',
-'æ’¤åŽ' => '撤後',
'拨谷' => '撥穀',
'撩斗' => '撩鬥',
'播于' => '播於',
@@ -5967,7 +5954,6 @@ $zh2Hant = array(
'æ‹…æ‹…é¢' => '擔擔麵',
'æ‹…ç€' => '擔著',
'æ‹…è´Ÿç€' => '擔負著',
-'擘划' => '擘劃',
'æ®äº‘' => '據云',
'æ®å¹²è€Œçª¥äº•åº•' => '據榦而窺井底',
'æ“¢å‘' => '擢髮',
@@ -6006,31 +5992,29 @@ $zh2Hant = array(
'敲钟' => '敲é˜',
'整庄' => '整莊',
'æ•´åª' => 'æ•´éš»',
+'整风åŽ' => '整風後',
'æ•´å‘用å“' => '整髮用å“',
-'æ•ŒåŽ' => '敵後',
'敌忾åŒä»‡' => '敵愾åŒè®Ž',
'æ•·è¯' => 'æ•·è—¥',
'数天åŽ' => '數天後',
-'数字表' => '數字錶',
'æ•°å­—é’Ÿ' => '數字é˜',
'数字钟表' => '數字é˜éŒ¶',
'数罪并罚' => '數罪併罰',
'数与è™ç¡®' => '數與虜确',
'文丑' => '文丑',
'文汇报' => '文匯報',
-'æ–‡åŽ' => '文後',
'æ–‡å¾æ˜Ž' => '文徵明',
'æ–‡æ€æ³‰æ¶Œ' => 'æ–‡æ€æ³‰æ¹§',
'文采éƒéƒ' => '文采éƒéƒ',
'斗转å‚横' => '斗轉åƒæ©«',
'斫雕为朴' => '斫雕為樸',
+'新井里美' => '新井里美',
'新历' => '新曆',
'新历å²' => 'æ–°æ­·å²',
'新扎' => '新紮',
'新庄' => '新莊',
'新庄市' => '新莊市',
'斲雕为朴' => '斲雕為樸',
-'æ–­åŽ' => '斷後',
'æ–­å‘' => 'æ–·é«®',
'æ–­å‘文身' => '斷髮文身',
'方便é¢' => '方便麵',
@@ -6113,6 +6097,8 @@ $zh2Hant = array(
'于民' => '於民',
'于水' => '於水',
'于法' => '於法',
+'于海上' => '於海上',
+'于海边' => '於海邊',
'于潜县' => '於潛縣',
'于ç«' => 'æ–¼ç«',
'于焉' => '於焉',
@@ -6138,6 +6124,9 @@ $zh2Hant = array(
'于丑' => '於醜',
'于野' => '於野',
'于陆' => '於陸',
+'于震中' => '於震中',
+'于震å‰' => '於震å‰',
+'于震åŽ' => '於震åŽ',
'于ï¼' => 'æ–¼ï¼',
'于1' => '於1',
'于2' => '於2',
@@ -6162,7 +6151,7 @@ $zh2Hant = array(
'æ——æ†' => 'æ——æ†',
'æ—¥å ' => '日佔',
'æ—¥å­é‡Œ' => 'æ—¥å­è£¡',
-'æ—¥åŽ' => '日後',
+'日心历表' => '日心曆表',
'日晒' => '日晒',
'日历' => '日曆',
'日历å²' => '日歷å²',
@@ -6232,6 +6221,7 @@ $zh2Hant = array(
'历书' => '曆書',
'历本' => '曆本',
'历法' => '曆法',
+'历狱' => '曆ç„',
'历纪' => '曆紀',
'历象' => '曆象',
'æ›æ™’' => 'æ›æ™’',
@@ -6240,34 +6230,42 @@ $zh2Hant = array(
'更仆难数' => '更僕難數',
'更签' => '更籤',
'æ›´é’Ÿ' => 'æ›´é˜',
-'书åŽ' => '書後',
'书呆å­' => '書çƒå­',
'书签' => '書籤',
'曼谷人' => '曼谷人',
'曾朴' => '曾樸',
'最多' => '最多',
-'最åŽ' => '最後',
'会上签署' => '會上簽署',
'会上签订' => '會上簽訂',
'会å ' => '會佔',
'会å åœ' => '會å åœ',
+'会干扰' => '會干擾',
+'會干擾' => '會干擾',
'会干' => '會幹',
'会åŠ' => '會弔',
-'会åŽ' => '會後',
'会里' => '會裡',
-'月åŽ' => '月後',
'月历' => '月曆',
'月历å²' => '月歷å²',
+'月çƒåŽ†è¡¨' => '月çƒæ›†è¡¨',
'月离于毕' => '月離於畢',
'月é¢' => '月é¢',
'月丽于箕' => '月麗於箕',
'有事之无范' => '有事之無範',
'有仆' => '有僕',
+'有åªä¸' => '有åªä¸',
+'有åªå…' => '有åªå…',
+'有åªå®¹' => '有åªå®¹',
+'有åªæŽ¡' => '有åªæŽ¡',
+'有åªé‡‡' => '有åªæŽ¡',
+'有åªæ˜¯' => '有åªæ˜¯',
+'有åªç”¨' => '有åªç”¨',
'有够赞' => '有夠讚',
'有å¾ä¼' => '有å¾ä¼',
+'有å¾æˆ°' => '有å¾æˆ°',
'有å¾æˆ˜' => '有å¾æˆ°',
'有å¾æœ' => '有å¾æœ',
'有å¾è®¨' => '有å¾è¨Ž',
+'有å¾è¨Ž' => '有å¾è¨Ž',
'有å¾' => '有徵',
'有æ’è¡—' => '有æ’è¡—',
'有栖å·' => '有栖å·',
@@ -6279,11 +6277,11 @@ $zh2Hant = array(
'æœäºŽ' => 'æœæ–¼',
'æœè¯' => 'æœè—¥',
'望了望' => '望了望',
+'望åŽçŸ³' => '望åŽçŸ³',
'望ç€è¡¨' => '望著錶',
'望ç€é’Ÿ' => '望著é˜',
'望ç€é’Ÿè¡¨' => '望著é˜éŒ¶',
'æœä¹¾å¤•æƒ•' => 'æœä¹¾å¤•æƒ•',
-'æœåŽ' => 'æœå¾Œ',
'æœé’Ÿ' => 'æœé˜',
'朦胧' => '朦朧',
'蒙胧' => '朦朧',
@@ -6302,6 +6300,7 @@ $zh2Hant = array(
'朱ç†å®‰åŽ†' => '朱ç†å®‰æ›†',
'朱ç†å®‰åŽ†å²' => '朱ç†å®‰æ­·å²',
'æ†å­' => 'æ†å­',
+'æŽå¿—å–œ' => 'æŽå¿—å–œ',
'æŽé€£æ°' => 'æŽé€£æ°',
'æŽè¿žæ°' => 'æŽé€£æ°',
'æå¹²' => 'æå¹¹',
@@ -6309,19 +6308,22 @@ $zh2Hant = array(
'æ‘庄' => 'æ‘莊',
'æ‘è½å‘' => 'æ‘è½ç™¼',
'æ‘里' => 'æ‘裡',
+'æ‘里长' => 'æ‘里長',
+'æ‘里長' => 'æ‘里長',
'æœè€å¿—é“' => 'æœè€èªŒé“',
'æžå®‹æ— å¾' => 'æžå®‹ç„¡å¾µ',
'æŸå‘' => 'æŸé«®',
'æ¯å¹²' => 'æ¯ä¹¾',
'æ¯é¢' => 'æ¯éºµ',
'æ°ä¼¦' => 'æ°å€«',
+'æ°å¨çˆ¾éŸ³æ¨‚' => 'æ°å¨çˆ¾éŸ³æ¨‚',
+'æ°å¨å°”音ä¹' => 'æ°å¨çˆ¾éŸ³æ¨‚',
'æ°ç‰¹' => 'æ°ç‰¹',
'东周钟' => 'æ±å‘¨é˜',
'东岳' => 'æ±å¶½',
'东冲西çª' => 'æ±è¡è¥¿çª',
'东游' => 'æ±éŠ',
'æ¾å±±åº„' => 'æ¾å±±åº„',
-'æ¾æŸåŽå‡‹' => 'æ¾æŸå¾Œå‡‹',
'æ¿ç€è„¸' => 'æ¿è‘—臉',
'æ¿è¡' => 'æ¿è•©',
'æž—å®å²³' => 'æž—å®å¶½',
@@ -6336,6 +6338,7 @@ $zh2Hant = array(
'架钟' => '架é˜',
'æŸåª' => 'æŸéš»',
'染指于' => '染指於',
+'染殿åŽ' => '染殿åŽ',
'染å‘' => '染髮',
'柜上' => '柜上',
'柜å­' => '柜å­',
@@ -6353,7 +6356,6 @@ $zh2Hant = array(
'格斗' => '格鬥',
'桂圆干' => '桂圓乾',
'æ¡…æ†' => 'æ¡…æ†',
-'案å‘åŽ' => '案發後',
'桌几' => '桌几',
'桌历' => '桌曆',
'桌历å²' => '桌歷å²',
@@ -6374,18 +6376,20 @@ $zh2Hant = array(
'棺æ里' => '棺æ裡',
'æ¤å‘' => 'æ¤é«®',
'椰枣干' => '椰棗乾',
+'楊雅筑' => '楊雅筑',
+'æ¨é›…ç­‘' => '楊雅筑',
'楚庄问鼎' => '楚莊å•é¼Ž',
'楚庄王' => '楚莊王',
'楚庄ç»ç¼¨' => '楚莊絕纓',
'桢干' => '楨幹',
'业余' => '業餘',
'榨干' => '榨乾',
-'è£ç™»åŽåº§' => '榮登åŽåº§',
'æ æ†' => '槓桿',
'ä¹å™¨é’Ÿ' => '樂器é˜',
'樊于期' => '樊於期',
'æ¢ä¸Š' => '樑上',
'æ¢æŸ±' => '樑柱',
+'樗里å­' => '樗里å­',
'æ ‡æ†' => '標æ†',
'标标致致' => '標標致致',
'标准' => '標準',
@@ -6395,6 +6399,11 @@ $zh2Hant = array(
'标志' => '標誌',
'模棱' => '模稜',
'模范' => '模範',
+'模范14棒' => '模范14棒',
+'模范21棒' => '模范21棒',
+'模范七棒' => '模范七棒',
+'模范三军' => '模范三è»',
+'模范三è»' => '模范三è»',
'模范棒棒堂' => '模范棒棒堂',
'模制' => '模製',
'样范' => '樣範',
@@ -6441,7 +6450,7 @@ $zh2Hant = array(
'æ æ†' => '欄æ†',
'欲海难填' => '欲海難填',
'欺蒙' => '欺矇',
-'æ­‡åŽ' => '歇後',
+'æ­ŒåŽ' => 'æ­ŒåŽ',
'歌钟' => 'æ­Œé˜',
'欧游' => 'æ­éŠ',
'止咳è¯' => '止咳藥',
@@ -6450,10 +6459,9 @@ $zh2Hant = array(
'止血è¯' => '止血藥',
'正在å±å’¤' => '正在å±å’¤',
'正官庄' => '正官庄',
-'æ­£åŽ' => '正後',
'正当ç€' => '正當著',
-'æ­¤åŽ' => '此後',
'武丑' => '武丑',
+'æ­¦åŽ' => 'æ­¦åŽ',
'武斗' => '武鬥',
'å²è¿äº‘æš®' => 'æ­²è¿äº‘æš®',
'历å²é‡Œ' => 'æ­·å²è£¡',
@@ -6461,7 +6469,6 @@ $zh2Hant = array(
'归于' => '歸於',
'归余' => '歸餘',
'歹斗' => '歹鬥',
-'æ­»åŽ' => '死後',
'死于' => '死於',
'死胡åŒ' => '死胡åŒ',
'死里求生' => '死裡求生',
@@ -6473,17 +6480,17 @@ $zh2Hant = array(
'殷师牛斗' => '殷師牛鬥',
'æ€è™«è¯' => '殺蟲藥',
'壳里' => '殼裡',
-'殿åŽ' => '殿後',
'殿钟自鸣' => '殿é˜è‡ªé³´',
'æ¯äºŽ' => '毀於',
'æ¯é’Ÿä¸ºé“Ž' => '毀é˜ç‚ºé¸',
'殴斗' => '毆鬥',
+'æ¯åŽ' => 'æ¯åŽ',
'æ¯èŒƒ' => 'æ¯ç¯„',
'æ¯ä¸‘' => 'æ¯é†œ',
'æ¯æ¯åª' => 'æ¯æ¯åª',
'æ¯åª' => 'æ¯éš»',
'毒è¯' => '毒藥',
-'比划' => '比劃',
+'毗婆尸佛' => '毗婆尸佛',
'毛å' => '毛å',
'毛姜' => '毛薑',
'毛å‘' => '毛髮',
@@ -6494,7 +6501,10 @@ $zh2Hant = array(
'æ°¤éƒ' => '氤鬱',
'æ°´æ¥æ±¤é‡ŒåŽ»' => '水來湯裡去',
'水准' => '水準',
+'水无怜奈' => '水無怜奈',
'水里' => '水裡',
+'水里溪' => '水里溪',
+'水里浊水溪' => '水里æ¿æ°´æºª',
'水里鄉' => '水里鄉',
'水里乡' => '水里鄉',
'永历' => '永曆',
@@ -6543,7 +6553,6 @@ $zh2Hant = array(
'æ³±éƒ' => '泱鬱',
'泳气钟' => '泳氣é˜',
'洄游' => 'æ´„éŠ',
-'æ´‹é¢' => '洋麵',
'洒家' => '洒家',
'洒扫' => '洒掃',
'æ´’æ°´' => 'æ´’æ°´',
@@ -6580,11 +6589,15 @@ $zh2Hant = array(
'海上布雷' => '海上佈雷',
'æµ·å¹²' => 'æµ·ä¹¾',
'海湾布雷' => 'æµ·ç£ä½ˆé›·',
+'涂善妮' => '涂善妮',
'涂å¤' => '涂å¤',
-'涂壮勋' => '涂壯勳',
'涂壯勳' => '涂壯勳',
+'涂壮勋' => '涂壯勳',
'涂天相' => '涂天相',
+'涂姓' => '涂姓',
'涂åºç‘„' => '涂åºç‘„',
+'涂æ•æ’' => '涂æ•æ†',
+'涂æ•æ†' => '涂æ•æ†',
'涂澤民' => '涂澤民',
'涂泽民' => '涂澤民',
'涂ç»ç…ƒ' => '涂紹煃',
@@ -6671,6 +6684,7 @@ $zh2Hant = array(
'准会' => '準會',
'准决赛' => '準決賽',
'准的' => '準的',
+'准直' => '準直',
'准确' => '準確',
'准线' => '準線',
'准绳' => '準繩',
@@ -6712,6 +6726,7 @@ $zh2Hant = array(
'潭里' => '潭裡',
'潮涌' => '潮湧',
'溃于' => '潰於',
+'涩谷区' => '澀谷å€',
'澄澹精致' => '澄澹精致',
'æ¾’è’™' => 'æ¾’æ¿›',
'泽渗漓而下é™' => '澤滲ç•è€Œä¸‹é™',
@@ -6732,6 +6747,7 @@ $zh2Hant = array(
'蒙雾' => '濛霧',
'è’™æ¾é›¨' => '濛鬆雨',
'蒙鸿' => '濛鴻',
+'滨田里佳å­' => '濱田里佳å­',
'æ³»è¯' => '瀉藥',
'沈å‰çº¿' => '瀋å‰ç·š',
'沈山线' => '瀋山線',
@@ -6766,7 +6782,6 @@ $zh2Hant = array(
'炮制' => '炮製',
'炸è¯' => '炸藥',
'炸酱é¢' => '炸醬麵',
-'为åŽ' => '為後',
'为准' => '為準',
'为ç€' => '為著',
'乌å‘' => 'çƒé«®',
@@ -6776,7 +6791,6 @@ $zh2Hant = array(
'烤干' => '烤乾',
'烤晒' => '烤晒',
'焙干' => '焙乾',
-'æ— åŽ' => '無後',
'æ— å¾ä¸ä¿¡' => 'ç„¡å¾µä¸ä¿¡',
'无业游民' => '無業游民',
'æ— æ¢æ¥¼ç›–' => '無樑樓蓋',
@@ -6784,7 +6798,6 @@ $zh2Hant = array(
'æ— è¯å¯æ•‘' => 'ç„¡è—¥å¯æ•‘',
'無言ä¸ä»‡' => '無言ä¸è®Ž',
'无余' => '無餘',
-'然åŽ' => '然後',
'然身死æ‰æ•°æœˆè€³' => '然身死纔數月耳',
'炼è¯' => '煉藥',
'炼制' => '煉製',
@@ -6798,6 +6811,7 @@ $zh2Hant = array(
'照相干片' => '照相乾片',
'煨干' => '煨乾',
'ç…®é¢' => '煮麵',
+'熊æ°' => '熊æ°',
'è§éƒ' => '熒鬱',
'熬è¯' => '熬藥',
'ç‚–è¯' => '燉藥',
@@ -6816,7 +6830,7 @@ $zh2Hant = array(
'烫é¢' => '燙麵',
'è¥å¹²' => '營幹',
'烬余' => '燼餘',
-'争先æåŽ' => '爭先æ後',
+'爆å‘指数' => '爆發指數',
'争奇斗å¦' => '爭奇鬥å¦',
'争奇斗异' => '爭奇鬥異',
'争奇斗艳' => '爭奇鬥豔',
@@ -6827,11 +6841,9 @@ $zh2Hant = array(
'爰定祥历' => '爰定祥厤',
'爽è¡' => '爽蕩',
'尔冬å‡' => '爾冬陞',
-'å°”åŽ' => '爾後',
'墙里' => '牆裡',
'片言åªè¯­' => '片言隻語',
'牙签' => '牙籤',
-'牛åŽ' => '牛後',
'牛肉é¢' => '牛肉麵',
'牛åª' => '牛隻',
'物欲' => '物慾',
@@ -6844,12 +6856,12 @@ $zh2Hant = array(
'特效è¯' => '特效藥',
'特制' => '特製',
'牵一å‘' => '牽一髮',
-'牵挂' => '牽挂',
'牵系' => '牽繫',
'è¦ç¡®' => '犖确',
'ç‹‚å ' => 'ç‹‚ä½”',
'狂并潮' => '狂併潮',
'狃于' => '狃於',
+'ç‹„å¿—æ°' => 'ç‹„å¿—æ°',
'ç‹å€Ÿè™Žå¨' => 'ç‹è—‰è™Žå¨',
'猛于' => '猛於',
'猛冲' => '猛è¡',
@@ -6886,6 +6898,8 @@ $zh2Hant = array(
'率团å‚加' => '率團åƒåŠ ',
'玉历' => '玉曆',
'玉历å²' => '玉歷å²',
+'王侯åŽ' => '王侯åŽ',
+'王åŽ' => '王åŽ',
'王庄' => '王莊',
'王余鱼' => '王餘魚',
'ç肴异馔' => 'ç肴異饌',
@@ -6902,6 +6916,8 @@ $zh2Hant = array(
'ç‘žå¾' => 'ç‘žå¾µ',
'瑶签' => '瑤籤',
'环游' => 'ç’°éŠ',
+'瓷制' => '瓷製',
+'甄åŽ' => '甄åŽ',
'瓮安' => '甕安',
'甚于' => '甚於',
'甚么' => '甚麼',
@@ -6912,11 +6928,11 @@ $zh2Hant = array(
'生殖洄游' => '生殖洄游',
'生物钟' => '生物é˜',
'生å‘生' => '生發生',
+'生åŽå‘' => '生è¯é«®',
'生姜' => '生薑',
'生锈' => '生é½',
'生å‘' => '生髮',
'产åµæ´„游' => '產åµæ´„游',
-'产åŽ' => '產後',
'用è¯' => '用藥',
'甩å‘' => '甩髮',
'ç”°è°·' => 'ç”°ç©€',
@@ -6925,11 +6941,11 @@ $zh2Hant = array(
'由余' => '由余',
'由于' => '由於',
'由表åŠé‡Œ' => '由表åŠè£¡',
+'甲åŽè·¯' => '甲åŽè·¯',
'男佣人' => '男佣人',
'男仆' => '男僕',
'男用表' => '男用錶',
'ç•äºŽ' => 'ç•æ–¼',
-'ç•™åŽ' => '留後',
'ç•™å‘' => '留髮',
'毕于' => '畢於',
'毕业于' => '畢業於',
@@ -6944,8 +6960,6 @@ $zh2Hant = array(
'疑凶' => '疑兇',
'疲于' => '疲於',
'疲困' => 'ç–²ç',
-'ç—…åŽ' => '病後',
-'ç—…åŽåˆæ„ˆ' => '病後åˆç™’',
'ç—…å¾' => 'ç—…å¾µ',
'病愈' => '病癒',
'病余' => '病餘',
@@ -6985,11 +6999,15 @@ $zh2Hant = array(
'白霉' => '白黴',
'百个' => '百個',
'百åªå¯' => '百åªå¯',
+'百åªå¤ ' => '百åªå¤ ',
'百åªå¤Ÿ' => '百åªå¤ ',
'百åªæ€•' => '百åªæ€•',
'百åªè¶³å¤Ÿ' => '百åªè¶³å¤ ',
+'百åªè¶³å¤ ' => '百åªè¶³å¤ ',
+'百周åŽ' => '百周後',
'百多åª' => '百多隻',
'百天åŽ' => '百天後',
+'百年' => '百年',
'百拙åƒä¸‘' => '百拙åƒé†œ',
'百科里' => '百科裡',
'百谷' => '百穀',
@@ -7003,9 +7021,10 @@ $zh2Hant = array(
'的克制' => '的剋制',
'çš„é’Ÿ' => 'çš„é˜',
'的钟表' => 'çš„é˜éŒ¶',
+'çš„é•¿å‘' => 'çš„é•·é«®',
'皆å¯ä½œæ·€' => '皆å¯ä½œæ¾±',
'皆准' => '皆準',
-'皇天åŽåœŸ' => '皇天åŽåœŸ',
+'皇åŽ' => '皇åŽ',
'皇历' => '皇曆',
'皇æžåŽ†' => '皇極曆',
'皇æžåŽ†å²' => '皇極歷å²',
@@ -7054,6 +7073,7 @@ $zh2Hant = array(
'看钟' => '看é˜',
'真凶' => '真兇',
'真个' => '真箇',
+'眼干' => '眼乾',
'眼帘' => '眼帘',
'眼眶里' => '眼眶裡',
'眼ç›é‡Œ' => '眼ç›è£¡',
@@ -7067,7 +7087,6 @@ $zh2Hant = array(
'瞄准' => '瞄準',
'瞅下表' => '瞅下錶',
'瞅下钟' => '瞅下é˜',
-'瞠乎åŽçŸ£' => '瞠乎後矣',
'瞧ç€è¡¨' => '瞧著錶',
'瞧ç€é’Ÿ' => '瞧著é˜',
'瞧ç€é’Ÿè¡¨' => '瞧著é˜éŒ¶',
@@ -7075,7 +7094,6 @@ $zh2Hant = array(
'了然' => '瞭然',
'了若指掌' => '瞭若指掌',
'瞳蒙' => '瞳矇',
-'çž»å‰é¡¾åŽ' => 'çž»å‰é¡§å¾Œ',
'蒙事' => '矇事',
'蒙昧无知' => '矇昧無知',
'蒙混' => '矇混',
@@ -7152,7 +7170,6 @@ $zh2Hant = array(
'ç§æ–—' => 'ç§é¬¥',
'秋å‡é‡Œ' => '秋å‡è£¡',
'秋天里' => '秋天裡',
-'秋åŽ' => '秋後',
'秋日里' => '秋日裡',
'秋裤' => '秋褲',
'秋游' => '秋éŠ',
@@ -7167,11 +7184,9 @@ $zh2Hant = array(
'秒表示' => '秒表示',
'秒表' => '秒錶',
'秒钟' => '秒é˜',
+'秦庄襄王' => '秦莊襄王',
'移祸于' => '移ç¦æ–¼',
'稀æ¾' => '稀鬆',
-'税åŽ' => '稅後',
-'税åŽå‡€åˆ©' => '稅後淨利',
-'ç¨åŽ' => 'ç¨å¾Œ',
'棱å°' => '稜å°',
'棱å­' => '稜å­',
'棱层' => '稜層',
@@ -7243,6 +7258,7 @@ $zh2Hant = array(
'穷追ä¸èˆ' => '窮追ä¸æ¨',
'ç©·å‘' => '窮髮',
'窃钟掩耳' => 'ç«Šé˜æŽ©è€³',
+'ç«‹åŽç»¼' => 'ç«‹åŽç¶œ',
'立于' => '立於',
'立范' => '立範',
'站干岸儿' => '站乾岸兒',
@@ -7252,10 +7268,10 @@ $zh2Hant = array(
'竹几' => '竹几',
'竹林之游' => '竹林之éŠ',
'竹签' => '竹籤',
+'竹制' => '竹製',
'笑里è—刀' => '笑裡è—刀',
'笨笨呆呆' => '笨笨呆呆',
'第四出局' => '第四出局',
-'笔划' => '筆劃',
'笔秃墨干' => '筆禿墨乾',
'等于' => '等於',
'笋干' => 'ç­ä¹¾',
@@ -7273,7 +7289,6 @@ $zh2Hant = array(
'筑阳' => '筑陽',
'ç­”å¤' => '答覆',
'答覆' => '答覆',
-'策划' => '策劃',
'筵几' => '筵几',
'个中原因' => '箇中原因',
'个中奥妙' => '箇中奧妙',
@@ -7302,15 +7317,17 @@ $zh2Hant = array(
'范字' => '範字',
'范å¼' => '範å¼',
'范性形å˜' => '範性形變',
+'范数' => '範數',
'范文' => '範文',
'范本' => '範本',
'范畴' => '範疇',
'范金' => '範金',
'简并' => '簡併',
'简朴' => '簡樸',
+'简筑翎' => '簡筑翎',
+'ç°¡ç­‘ç¿Ž' => 'ç°¡ç­‘ç¿Ž',
'ç°¸è¡' => '簸蕩',
'ç­¾ç€' => '簽著',
-'筹划' => '籌劃',
'ç­¾å¹' => '籤å¹',
'签押' => '籤押',
'ç­¾æ¡' => '籤æ¢',
@@ -7340,11 +7357,11 @@ $zh2Hant = array(
'系列里' => '系列裡',
'ç³»ç€' => '系著',
'系里' => '系裡',
-'纪元åŽ' => '紀元後',
'纪历' => '紀曆',
'纪历å²' => '紀歷å²',
'约å ' => 'ç´„ä½”',
'红绳系足' => '紅繩繫足',
+'红色长å‘' => '紅色長髮',
'红钟' => 'ç´…é˜',
'红霉素' => '紅霉素',
'红å‘' => 'ç´…é«®',
@@ -7390,10 +7407,10 @@ $zh2Hant = array(
'结余' => 'çµé¤˜',
'结å‘' => 'çµé«®',
'ç»å¯¹å‚ç…§' => '絕å°åƒç…§',
-'ç»åŽ' => '絕後',
'ç»äºŽ' => '絕於',
'绞干' => '絞乾',
'络腮胡' => '絡腮é¬',
+'給我干脆' => '給我干脆',
'给我干脆' => '給我干脆',
'给于' => '給於',
'ä¸æ¥çº¿åŽ»' => '絲來線去',
@@ -7405,6 +7422,7 @@ $zh2Hant = array(
'ä¸çº¿' => '絲線',
'ä¸ç»‡åŽ‚' => '絲織廠',
'ä¸è™«' => '絲蟲',
+'ä¸åˆ¶' => '絲製',
'ä¸å‘' => '絲髮',
'绑扎' => 'ç¶ç´®',
'綑扎' => '綑紮',
@@ -7416,6 +7434,7 @@ $zh2Hant = array(
'绾å‘' => '綰髮',
'网里' => '網裡',
'网志' => '網誌',
+'网游' => '網éŠ',
'彩带' => '綵帶',
'彩排' => '綵排',
'彩楼' => '綵樓',
@@ -7453,7 +7472,6 @@ $zh2Hant = array(
'纵欲' => '縱慾',
'纤夫' => '縴夫',
'纤手' => '縴手',
-'总åŽ' => '總後',
'总è£åˆ¶' => '總è£åˆ¶',
'ç¹å¤' => 'ç¹è¤‡',
'ç¹é’Ÿ' => 'ç¹é˜',
@@ -7543,18 +7561,17 @@ $zh2Hant = array(
'è€å§œ' => 'è€è–‘',
'è€æ¿' => 'è€é—†',
'è€é¢çš®' => 'è€é¢çš®',
-'考åŽ' => '考後',
'考å¾' => '考徵',
'而克制' => '而剋制',
-'而åŽ' => '而後',
'è€æ–—' => 'è€é¬¥',
'耕佣' => '耕傭',
'耕获' => '耕穫',
-'耳åŽ' => '耳後',
'耳余' => '耳餘',
'耿于' => '耿於',
'èŠæ–‹å¿—异' => 'èŠé½‹å¿—ç•°',
+'圣åŽ' => 'è–åŽ',
'è˜é›‡' => 'è˜åƒ±',
+'闻风åŽ' => 'èžé¢¨å¾Œ',
'è”ç³»' => 'è¯ç¹«',
'å¬äºŽ' => 'è½æ–¼',
'肉干' => '肉乾',
@@ -7573,7 +7590,6 @@ $zh2Hant = array(
'胃里' => '胃裡',
'背å‘ç€' => '背å‘è‘—',
'背地里' => '背地裡',
-'背åŽ' => '背後',
'胎å‘' => '胎髮',
'胜肽' => '胜肽',
'胜键' => '胜éµ',
@@ -7607,7 +7623,6 @@ $zh2Hant = array(
'腕表' => '腕錶',
'è„‘å­é‡Œ' => 'è…¦å­è£¡',
'脑干' => '腦幹',
-'è„‘åŽ' => '腦後',
'腰里' => '腰裡',
'脚注' => '腳註',
'脚炼' => 'è…³éŠ',
@@ -7656,8 +7671,8 @@ $zh2Hant = array(
'旧钟' => '舊é˜',
'旧钟表' => '舊é˜éŒ¶',
'舌干唇焦' => '舌乾唇焦',
-'舌åŽ' => '舌後',
'舒å·' => '舒æ²',
+'舞åŽ' => '舞åŽ',
'航海历' => '航海曆',
'航海历å²' => '航海歷å²',
'船åªå¾—' => '船åªå¾—',
@@ -7668,6 +7683,8 @@ $zh2Hant = array(
'舰åª' => '艦隻',
'良è¯' => '良藥',
'色欲' => '色慾',
+'艷åŽ' => '艷åŽ',
+'艳åŽ' => '艷åŽ',
'艸木丰丰' => '艸木丰丰',
'èŠè¯' => 'èŠè—¥',
'芒果干' => '芒果乾',
@@ -7699,6 +7716,8 @@ $zh2Hant = array(
'范文藤' => '范文藤',
'范文虎' => '范文虎',
'范登堡' => '范登堡',
+'范贤惠' => '范賢惠',
+'范賢惠' => '范賢惠',
'茶几' => '茶几',
'茶庄' => '茶莊',
'茶余' => '茶餘',
@@ -7734,6 +7753,7 @@ $zh2Hant = array(
'庄院' => '莊院',
'庄骚' => '莊騷',
'茎干' => '莖幹',
+'莜é¢' => '莜麵',
'莽è¡' => '莽蕩',
'èŒä¸ä½“' => 'èŒçµ²é«”',
'èœå¹²' => 'èœä¹¾',
@@ -7742,10 +7762,14 @@ $zh2Hant = array(
'è èå¹²' => 'è è˜¿ä¹¾',
'åŽä¸¥é’Ÿ' => 'è¯åš´é˜',
'åŽå‘' => 'è¯é«®',
+'è¬ä¸€åª' => 'è¬ä¸€åª',
'万一åª' => 'è¬ä¸€åª',
'万个' => 'è¬å€‹',
+'万周åŽ' => 'è¬å‘¨å¾Œ',
'万多åª' => 'è¬å¤šéš»',
'万天åŽ' => 'è¬å¤©å¾Œ',
+'万年' => 'è¬å¹´',
+'万年历' => 'è¬å¹´æ›†',
'万年历表' => 'è¬å¹´æ›†éŒ¶',
'万历' => 'è¬æ›†',
'万历å²' => 'è¬æ­·å²',
@@ -7754,9 +7778,9 @@ $zh2Hant = array(
'万象' => 'è¬è±¡',
'万åª' => 'è¬éš»',
'万余' => 'è¬é¤˜',
-'è½åŽ' => 'è½å¾Œ',
'è½è…®èƒ¡' => 'è½è…®é¬',
'è½å‘' => 'è½é«®',
+'å¶å¶ç´' => '葉å¶ç´',
'å¶å¶ç¹' => '葉å¶ç¹',
'ç€å„¿' => 'è‘—å…’',
'ç€å…‹åˆ¶' => '著剋制',
@@ -7819,8 +7843,8 @@ $zh2Hant = array(
'è–™å‘' => '薙髮',
'è–åœ' => 'è–è””',
'苧悴' => '薴悴',
-'苧烯' => '薴烯',
'薴烯' => '薴烯',
+'苧烯' => '薴烯',
'借以' => '藉以',
'借助' => '藉助',
'借寇兵' => '藉寇兵',
@@ -7913,6 +7937,7 @@ $zh2Hant = array(
'蚊动牛斗' => '蚊動牛鬥',
'蛇å‘女妖' => '蛇髮女妖',
'蛔虫è¯' => '蛔蟲藥',
+'蜂åŽ' => '蜂åŽ',
'蜂涌' => '蜂湧',
'蜂准' => '蜂準',
'蜜里调油' => '蜜裡調油',
@@ -7922,6 +7947,8 @@ $zh2Hant = array(
'èŽè°®' => 'èŽè­–',
'è™®è¨ç›¸åŠ' => '蟣è¨ç›¸å¼”',
'è›å¹²' => '蟶乾',
+'èšåŽ' => '蟻åŽ',
+'蟻åŽ' => '蟻åŽ',
'è å¹²' => 'è å¹¹',
'蛮干' => '蠻幹',
'血拼' => '血拚',
@@ -7930,11 +7957,11 @@ $zh2Hant = array(
'行事历å²' => '行事歷å²',
'行凶' => '行兇',
'行凶å‰' => '行兇å‰',
-'行凶åŽ' => '行兇後',
'行凶後' => '行兇後',
'行于' => '行於',
'行百里者åŠäºŽä¹å' => '行百里者åŠæ–¼ä¹å',
'胡åŒ' => 'è¡šè¡•',
+'å«åŽåº„å…¬' => '衛後莊公',
'å«æ˜Ÿé’Ÿ' => '衛星é˜',
'冲上' => 'è¡ä¸Š',
'冲下' => 'è¡ä¸‹',
@@ -8009,8 +8036,6 @@ $zh2Hant = array(
'补注' => '補註',
'装折' => 'è£æ‘º',
'里勾外连' => '裡勾外連',
-'里外' => '裡外',
-'里å­' => '裡å­',
'里屋' => '裡屋',
'里层' => '裡層',
'里布' => '裡布',
@@ -8118,7 +8143,6 @@ $zh2Hant = array(
'褒赞' => '褒讚',
'衬里' => '襯裡',
'西å ' => '西佔',
-'西元åŽ' => '西元後',
'西周钟' => '西周é˜',
'西岳' => '西嶽',
'西晒' => '西晒',
@@ -8126,6 +8150,7 @@ $zh2Hant = array(
'西历å²' => '西歷å²',
'西米谷' => '西米谷',
'西è¯' => '西藥',
+'西西里' => '西西里',
'西谷米' => '西谷米',
'西游' => '西éŠ',
'è¦å ' => 'è¦ä½”',
@@ -8148,7 +8173,6 @@ $zh2Hant = array(
'è§æ£±è§è§’' => '見稜見角',
'è§ç´ æŠ±æœ´' => '見素抱樸',
'è§é’Ÿä¸æ‰“' => '見é˜ä¸æ‰“',
-'规划' => 'è¦åŠƒ',
'规范' => 'è¦ç¯„',
'視如寇仇' => '視如寇讎',
'视于' => '視於',
@@ -8167,7 +8191,6 @@ $zh2Hant = array(
'言大而夸' => '言大而夸',
'言辩而确' => '言辯而确',
'订制' => '訂製',
-'计划' => '計劃',
'计时表' => '計時錶',
'托了' => '託了',
'托事' => '託事',
@@ -8197,6 +8220,7 @@ $zh2Hant = array(
'托过' => '託éŽ',
'托附' => '託附',
'许愿起ç»' => '許愿起經',
+'许虬' => '許虬',
'诉说ç€' => '訴說著',
'注上' => '註上',
'注册' => '註冊',
@@ -8249,7 +8273,6 @@ $zh2Hant = array(
'诬蔑' => '誣衊',
'说ç€' => '說著',
'è°å¹²çš„' => '誰幹的',
-'课åŽ' => '課後',
'课å¾' => '課徵',
'课余' => '課餘',
'调准' => '調準',
@@ -8262,9 +8285,9 @@ $zh2Hant = array(
'请托' => '請託',
'咨询' => '諮詢',
'诸余' => '諸餘',
-'谋定åŽåŠ¨' => '謀定後動',
'谋干' => '謀幹',
'è°¢ç»å‚观' => 'è¬çµ•åƒè§€',
+'è°¢åŽåŽ' => 'è¬è¯åŽ',
'谬采虚声' => '謬採虛è²',
'谬赞' => '謬讚',
'謷丑' => '謷醜',
@@ -8275,7 +8298,6 @@ $zh2Hant = array(
'警钟' => 'è­¦é˜',
'译注' => '譯註',
'护å‘' => 'è­·é«®',
-'读åŽ' => '讀後',
'å˜å¾' => '變徵',
'å˜ä¸‘' => '變醜',
'å˜è„' => '變髒',
@@ -8320,12 +8342,16 @@ $zh2Hant = array(
'è´¹å ' => '費佔',
'贻范' => '貽範',
'资金å ç”¨' => '資金å ç”¨',
-'è´¾åŽ' => '賈後',
+'è´¾åŽ' => '賈åŽ',
+'賈åŽ' => '賈åŽ',
'赈饥' => '賑饑',
'èµèµž' => '賞讚',
+'è´¤åŽ' => 'è³¢åŽ',
+'è³¢åŽ' => 'è³¢åŽ',
'å–æ–­å‘' => '賣斷發',
'å–呆' => 'è³£çƒ',
'质朴' => '質樸',
+'赌åŽ' => 'è³­åŽ',
'赌å°' => '賭檯',
'赌斗' => '賭鬥',
'賸余' => '賸餘',
@@ -8336,19 +8362,19 @@ $zh2Hant = array(
'赤绳系足' => '赤繩繫足',
'赤霉素' => '赤霉素',
'走回路' => '走回路',
-'èµ°åŽ' => '走後',
'èµ·å¤' => '起複',
'起哄' => '起鬨',
'超级æ¯' => '超級盃',
'赶制' => '趕製',
'赶é¢æ£' => '趕麵æ£',
+'èµµå¨åŽ' => '趙å¨åŽ',
+'赵惠åŽ' => '趙惠åŽ',
'赵治勋' => '趙治勳',
'赵庄' => '趙莊',
'趱干' => '趲幹',
'足于' => '足於',
'跌扑' => '跌扑',
'è·Œè¡' => '跌蕩',
-'è·Ÿå‰è·ŸåŽ' => 'è·Ÿå‰è·Ÿå¾Œ',
'路签' => '路籤',
'è·³æ¢å°ä¸‘' => '跳樑å°ä¸‘',
'è·³è¡' => '跳蕩',
@@ -8356,7 +8382,6 @@ $zh2Hant = array(
'蹪于' => '蹪於',
'蹭棱å­' => '蹭稜å­',
'èºéƒ' => 'èºé¬±',
-'身åŽ' => '身後',
'身于' => '身於',
'身体å‘肤' => '身體髮膚',
'躯干' => '軀幹',
@@ -8431,15 +8456,20 @@ $zh2Hant = array(
'è¿·é­‚è¯' => 'è¿·é­‚è—¥',
'追凶' => '追兇',
'退伙' => '退夥',
-'退åŽ' => '退後',
'退烧è¯' => '退燒藥',
'退è—于密' => '退è—於密',
'逆钟' => '逆é˜',
'逆钟å‘' => '逆é˜å‘',
+'逆风åŽ' => '逆風後',
'逋å‘' => '逋髮',
'é€é¥æ¸¸' => 'é€é™éŠ',
'é€è¾Ÿ' => 'é€é—¢',
+'è¿™åªä¸' => '這åªä¸',
+'è¿™åªå…' => '這åªå…',
+'è¿™åªå®¹' => '這åªå®¹',
+'è¿™åªé‡‡' => '這åªæŽ¡',
'è¿™åªæ˜¯' => '這åªæ˜¯',
+'è¿™åªç”¨' => '這åªç”¨',
'这伙人' => '這夥人',
'这里' => '這裡',
'这钟' => '這é˜',
@@ -8464,7 +8494,10 @@ $zh2Hant = array(
'连庄' => '連莊',
'周游世界' => '週éŠä¸–ç•Œ',
'è¿›å ' => '進佔',
+'進制' => '進制',
+'进制' => '進制',
'逼并' => '逼併',
+'é‡é£ŽåŽ' => 'é‡é¢¨å¾Œ',
'游了' => 'éŠäº†',
'游人' => 'éŠäºº',
'游仙' => 'éŠä»™',
@@ -8514,7 +8547,6 @@ $zh2Hant = array(
'游离' => 'éŠé›¢',
'游骑兵' => 'éŠé¨Žå…µ',
'游魂' => 'éŠé­‚',
-'过åŽ' => 'éŽå¾Œ',
'过于' => 'éŽæ–¼',
'过æ†' => 'éŽæ†',
'过水é¢' => 'éŽæ°´éºµ',
@@ -8526,6 +8558,7 @@ $zh2Hant = array(
'é¨æ¸¸' => 'é¨éŠ',
'é®ä¸‘' => 'é®é†œ',
'è¿äºŽ' => 'é·æ–¼',
+'选手' => 'é¸æ‰‹',
'选手表明' => 'é¸æ‰‹è¡¨æ˜Ž',
'选手表决' => 'é¸æ‰‹è¡¨æ±º',
'选手表现' => 'é¸æ‰‹è¡¨ç¾',
@@ -8548,14 +8581,17 @@ $zh2Hant = array(
'é‚£åª' => '那隻',
'那么' => '那麼',
'那么ç€' => '那麼著',
+'邱于庭' => '邱于庭',
'éƒæœ´' => 'éƒæ¨¸',
'éƒéƒè²è²' => 'éƒéƒè²è²',
+'éƒéƒé’é’' => 'éƒéƒé’é’',
'郊游' => '郊éŠ',
'郘钟' => '郘é˜',
'部è½å‘' => '部è½ç™¼',
+'郭åŽ' => '郭åŽ',
'都于' => '都於',
+'鄉愿' => '鄉愿',
'乡愿' => '鄉愿',
-'é‚“åŽ' => '鄧後',
'鄭凱云' => '鄭凱云',
'郑凯云' => '鄭凱云',
'郑庄公' => '鄭莊公',
@@ -8565,7 +8601,6 @@ $zh2Hant = array(
'é…è¯' => 'é…è—¥',
'é…制' => 'é…製',
'酒帘' => '酒帘',
-'é…’åŽ' => '酒後',
'é…’å›' => '酒罈',
'é…’è‚´' => 'é…’è‚´',
'é…’è¯' => 'é…’è—¥',
@@ -8638,7 +8673,6 @@ $zh2Hant = array(
'采石矶' => '采石磯',
'釉è¯' => '釉藥',
'里程表' => '里程錶',
-'é‡åˆ’' => 'é‡åŠƒ',
'é‡å›ž' => 'é‡å›ž',
'é‡æŠ˜' => 'é‡æ‘º',
'é‡äºŽ' => 'é‡æ–¼',
@@ -8660,6 +8694,7 @@ $zh2Hant = array(
'金仑溪' => '金崙溪',
'金布é“' => '金布é“',
'金范' => '金範',
+'金色长å‘' => '金色長髮',
'金表情' => '金表情',
'金表æ€' => '金表態',
'金表扬' => '金表æš',
@@ -8677,7 +8712,6 @@ $zh2Hant = array(
'金å‘' => '金髮',
'钉锤' => '釘鎚',
'钩心斗角' => '鈎心鬥角',
-'铃å“åŽ' => '鈴響後',
'银朱' => '銀硃',
'银å‘' => '銀髮',
'铜范' => '銅範',
@@ -8825,7 +8859,6 @@ $zh2Hant = array(
'长历å²' => 'é•·æ­·å²',
'长生è¯' => '長生藥',
'长胡' => 'é•·é¬',
-'é—¨å‰é—¨åŽ' => 'é–€å‰é–€å¾Œ',
'门帘' => '門帘',
'é—¨åŠå„¿' => '門弔兒',
'门里' => '門裡',
@@ -8874,6 +8907,7 @@ $zh2Hant = array(
'阿呆瓜' => '阿呆瓜',
'阿斯图里亚斯' => '阿斯圖里亞斯',
'阿呆' => '阿çƒ',
+'阿里' => '阿里',
'附于' => '附於',
'附注' => '附註',
'é™åŽ‹è¯' => 'é™å£“è—¥',
@@ -8886,6 +8920,9 @@ $zh2Hant = array(
'阴历å²' => 'é™°æ­·å²',
'阴沟里翻船' => 'é™°æºè£¡ç¿»èˆ¹',
'阴éƒ' => '陰鬱',
+'陈冲' => '陳冲',
+'陳冲' => '陳冲',
+'陈有åŽ' => '陳有åŽ',
'陈炼' => '陳éŠ',
'陆游' => '陸éŠ',
'阳春é¢' => '陽春麵',
@@ -8893,7 +8930,6 @@ $zh2Hant = array(
'阳历å²' => '陽歷å²',
'隆准许' => '隆准許',
'隆准' => '隆準',
-'éšåŽ' => '隨後',
'éšäºŽ' => '隨於',
'éšå ' => '隱佔',
'éšå‡ ' => '隱几',
@@ -8909,7 +8945,6 @@ $zh2Hant = array(
'雅致' => '雅緻',
'集于' => '集於',
'集游法' => '集éŠæ³•',
-'雇佣' => '雇傭',
'雕æ¢ç”»æ ‹' => '雕樑畫棟',
'åŒæŠ˜å°„' => '雙折射',
'åŒæŠ˜' => '雙摺',
@@ -8929,7 +8964,6 @@ $zh2Hant = array(
'离于' => '離於',
'éš¾èˆ' => '難æ¨',
'难于' => '難於',
-'雨åŽ' => '雨後',
'雪窗è¤å‡ ' => '雪窗螢几',
'雪里' => '雪裡',
'雪里红' => '雪裡紅',
@@ -8939,8 +8973,10 @@ $zh2Hant = array(
'云游' => '雲éŠ',
'云须' => '雲鬚',
'零个' => '零個',
+'零周åŽ' => '零周後',
'零多åª' => '零多隻',
'零天åŽ' => '零天後',
+'零年' => '零年',
'零åª' => '零隻',
'零余' => '零餘',
'电å­è¡¨æ ¼' => 'é›»å­è¡¨æ ¼',
@@ -8948,6 +8984,7 @@ $zh2Hant = array(
'电å­é’Ÿ' => 'é›»å­é˜',
'电å­é’Ÿè¡¨' => 'é›»å­é˜éŒ¶',
'电æ†' => 'é›»æ†',
+'电波钟' => '電波é˜',
'电ç è¡¨' => '電碼表',
'电线æ†' => '電線æ†',
'电冲' => 'é›»è¡',
@@ -8967,7 +9004,6 @@ $zh2Hant = array(
'é’霉素' => 'é’霉素',
'é’霉' => 'é’é»´',
'éžå ä¸å¯' => 'éžä½”ä¸å¯',
-'é åŽ' => 'é å¾Œ',
'é¢åŒ…ä½' => 'é¢åŒ…ä½',
'é¢åŒ…å«' => 'é¢åŒ…å«',
'é¢åŒ…å›´' => 'é¢åŒ…åœ',
@@ -9014,6 +9050,7 @@ $zh2Hant = array(
'项庄' => '項莊',
'顺于' => '順於',
'顺钟å‘' => 'é †é˜å‘',
+'顺风åŽ' => '順風後',
'须根æ®' => '須根據',
'颂系' => '頌繫',
'颂赞' => '頌讚',
@@ -9032,14 +9069,16 @@ $zh2Hant = array(
'颠干倒å¤' => '顛乾倒å¤',
'颠覆' => '顛覆',
'颠颠仆仆' => '顛顛仆仆',
-'顾å‰ä¸é¡¾åŽ' => '顧å‰ä¸é¡§å¾Œ',
+'顛顛仆仆' => '顛顛仆仆',
'颤栗' => '顫慄',
'显示表' => '顯示錶',
'显示钟' => '顯示é˜',
'显示钟表' => '顯示é˜éŒ¶',
'显著标志' => '顯著標志',
'风干' => '風乾',
+'风åŽ' => '風åŽ',
'风土志' => '風土誌',
+'风åŽï¼Œ' => '風後,',
'风å·æ®‹äº‘' => '風æ²æ®˜é›²',
'风物志' => '風物誌',
'风范' => '風範',
@@ -9048,6 +9087,7 @@ $zh2Hant = array(
'风采' => '風采',
'風采' => '風采',
'å°é£Ž' => '颱風',
+'å°é£ŽåŽ' => '颱風後',
'刮了' => '颳了',
'刮倒' => '颳倒',
'刮去' => '颳去',
@@ -9056,6 +9096,7 @@ $zh2Hant = array(
'刮起' => '颳起',
'刮雪' => '颳雪',
'刮风' => '颳風',
+'刮风åŽ' => '颳風後',
'飘è¡' => '飄蕩',
'飘游' => '飄éŠ',
'飘飘è¡è¡' => '飄飄蕩蕩',
@@ -9066,7 +9107,6 @@ $zh2Hant = array(
'食欲ä¸æŒ¯' => '食欲ä¸æŒ¯',
'食野之苹' => '食野之苹',
'食é¢' => '食麵',
-'饭åŽ' => '飯後',
'饭åŽé’Ÿ' => '飯後é˜',
'饭团' => '飯糰',
'饭庄' => '飯莊',
@@ -9167,6 +9207,7 @@ $zh2Hant = array(
'余辉' => '餘è¼',
'余辜' => '餘辜',
'余酲' => '餘酲',
+'ä½™é‡' => '餘é‡',
'余闰' => '餘é–',
'余闲' => '餘閒',
'余零' => '餘零',
@@ -9191,8 +9232,6 @@ $zh2Hant = array(
'余8' => '餘8',
'余9' => '餘9',
'馄饨é¢' => '餛飩麵',
-'馆åŽä¸€è¡—' => '館後一街',
-'馆åŽäºŒè¡—' => '館後二街',
'馆谷' => '館穀',
'馆里' => '館裡',
'喂乳' => '餵乳',
@@ -9225,11 +9264,14 @@ $zh2Hant = array(
'马干' => '馬乾',
'马å å±±' => '馬å å±±',
'馬å å±±' => '馬å å±±',
-'马åŽ' => '馬後',
'马æ†' => '馬æ†',
+'馬格里布' => '馬格里布',
+'马格里布' => '馬格里布',
'马表' => '馬錶',
'驻扎' => 'é§ç´®',
'骀è¡' => '駘蕩',
+'腾格里' => '騰格里',
+'騰格里' => '騰格里',
'腾冲' => '騰è¡',
'惊赞' => '驚讚',
'惊钟' => 'é©šé˜',
@@ -9260,6 +9302,7 @@ $zh2Hant = array(
'高干预' => '高干é ',
'高干' => '高幹',
'高度自制' => '高度自制',
+'高清愿' => '高清愿',
'é«¡å‘' => 'é«¡é«®',
'髭胡' => 'é«­é¬',
'髭须' => '髭鬚',
@@ -9483,6 +9526,7 @@ $zh2Hant = array(
'鬼谷å­' => '鬼谷å­',
'魂牵梦系' => '魂牽夢繫',
'é­å¾' => 'é­å¾µ',
+'é­”æ°åº§' => 'é­”æ°åº§',
'魔表' => '魔錶',
'鱼干' => '魚乾',
'é±¼æ¾' => '魚鬆',
@@ -9579,13 +9623,18 @@ $zh2Hant = array(
'黄历' => '黃曆',
'黄曲霉' => '黃曲霉',
'黄历å²' => '黃歷å²',
+'黃詩æ°' => '黃詩æ°',
+'黄诗æ°' => '黃詩æ°',
'黄金表' => '黃金表',
'黃鈺筑' => '黃鈺筑',
'黄钰筑' => '黃鈺筑',
'黄钟' => '黃é˜',
'黄å‘' => '黃髮',
'黄曲毒素' => '黃麴毒素',
+'黎å‰äº‘' => '黎å‰é›²',
+'黎å‰é›²' => '黎å‰é›²',
'黑奴å天录' => '黑奴籲天錄',
+'黑色长å‘' => '黑色長髮',
'黑å‘' => '黑髮',
'点åŠé’Ÿ' => '點åŠé˜',
'点多钟' => '點多é˜',
@@ -9612,7 +9661,6 @@ $zh2Hant = array(
'出剧' => '齣劇',
'出动画' => '齣動畫',
'出å¡é€š' => 'é½£å¡é€š',
-'出å­' => 'é½£å­',
'出æˆ' => '齣戲',
'出节目' => '齣節目',
'出电影' => '齣電影',
@@ -9624,35 +9672,55 @@ $zh2Hant = array(
'龟山庄' => '龜山庄',
'ï¼å…‹åˆ¶' => 'ï¼å‰‹åˆ¶',
',克制' => ',剋制',
+'ï¼å‘¨åŽ' => 'ï¼å‘¨å¾Œ',
'ï¼å¤šåª' => 'ï¼å¤šéš»',
'ï¼å¤©åŽ' => 'ï¼å¤©å¾Œ',
+'ï¼å¹´' => 'ï¼å¹´',
'ï¼åª' => 'ï¼éš»',
'ï¼ä½™' => 'ï¼é¤˜',
+'1周åŽ' => '1周後',
'1天åŽ' => '1天後',
+'1年' => '1年',
'1åª' => '1隻',
'1余' => '1餘',
+'2周åŽ' => '2周後',
'2天åŽ' => '2天後',
+'ï¼’å¹´' => 'ï¼’å¹´',
'ï¼’åª' => 'ï¼’éš»',
'2余' => '2餘',
+'3周åŽ' => '3周後',
'3天åŽ' => '3天後',
+'3年' => '3年',
'3åª' => '3隻',
'3余' => '3餘',
+'4周åŽ' => '4周後',
'4天åŽ' => '4天後',
+'4年' => '4年',
'ï¼”åª' => '4隻',
'4余' => '4餘',
+'5周åŽ' => '5周後',
'5天åŽ' => '5天後',
+'5年' => '5年',
'5åª' => '5隻',
'5余' => '5餘',
+'6周åŽ' => '6周後',
'6天åŽ' => '6天後',
+'ï¼–å¹´' => 'ï¼–å¹´',
'ï¼–åª' => 'ï¼–éš»',
'6余' => '6餘',
+'7周åŽ' => '7周後',
'7天åŽ' => '7天後',
+'ï¼—å¹´' => 'ï¼—å¹´',
'ï¼—åª' => 'ï¼—éš»',
'7余' => '7餘',
+'8周åŽ' => '8周後',
'8天åŽ' => '8天後',
+'8年' => '8年',
'8åª' => '8隻',
'8余' => '8餘',
+'9周åŽ' => '9周後',
'9天åŽ' => '9天後',
+'9年' => '9年',
'ï¼™åª' => '9隻',
'9余' => '9餘',
':克制' => ':剋制',
@@ -10616,6 +10684,7 @@ $zh2Hans = array(
'產' => '产',
'産' => '产',
'甦' => 'è‹',
+'甯' => 'å®',
'ç•' => '亩',
'畢' => '毕',
'ç•«' => 'ç”»',
@@ -10670,6 +10739,7 @@ $zh2Hans = array(
'盤' => '盘',
'盧' => 'å¢',
'盪' => 'è¡',
+'眞' => '真',
'眥' => '眦',
'眾' => '众',
'ç' => '𪾢',
@@ -12566,6 +12636,7 @@ $zh2Hans = array(
'é¾' => 'é¾™',
'龎' => 'åŽ',
'é¾' => '庞',
+'龑' => '䶮',
'龔' => '龚',
'龕' => '龛',
'龜' => '龟',
@@ -12656,11 +12727,14 @@ $zh2Hans = array(
'與著者' => '与著者',
'與著述' => '与著述',
'丑著' => '丑ç€',
+'丑著书' => '丑著书',
'丑著書' => '丑著书',
'丑著作' => '丑著作',
'丑著å' => '丑著å',
+'丑著录' => '丑著录',
'丑著錄' => '丑著录',
'丑著稱' => '丑著称',
+'丑著称' => '丑著称',
'丑著者' => '丑著者',
'丑著述' => '丑著述',
'專著' => '专著',
@@ -12689,13 +12763,20 @@ $zh2Hans = array(
'樂著者' => 'ä¹è‘—者',
'樂著述' => 'ä¹è‘—è¿°',
'乘著' => '乘ç€',
+'乘著书' => '乘著书',
'乘著書' => '乘著书',
'乘著作' => '乘著作',
'乘著å' => '乘著å',
+'乘著录' => '乘著录',
'乘著錄' => '乘著录',
'乘著稱' => '乘著称',
+'乘著称' => '乘著称',
'乘著者' => '乘著者',
'乘著述' => '乘著述',
+'乾一å›' => '乾一å›',
+'乾一壇' => '乾一å›',
+'乾一组' => '乾一组',
+'乾一組' => '乾一组',
'乾上乾下' => '乾上乾下',
'乾為天' => '乾为天',
'乾為陽' => '乾为阳',
@@ -12765,8 +12846,8 @@ $zh2Hans = array(
'乾旦' => '乾旦',
'乾明' => '乾明',
'乾昧' => '乾昧',
-'乾暉' => '乾晖',
'乾晖' => '乾晖',
+'乾暉' => '乾晖',
'乾景' => '乾景',
'乾晷' => '乾晷',
'乾曜' => '乾曜',
@@ -12830,8 +12911,8 @@ $zh2Hans = array(
'乾贶' => '乾贶',
'乾车' => '乾车',
'乾車' => '乾车',
-'乾轴' => '乾轴',
'乾軸' => '乾轴',
+'乾轴' => '乾轴',
'乾通' => '乾通',
'乾造' => '乾造',
'ä¹¾é“' => 'ä¹¾é“',
@@ -12870,26 +12951,35 @@ $zh2Hans = array(
'爭著述' => '争著述',
'五箇山' => '五箇山',
'亮著' => '亮ç€',
+'亮著书' => '亮著书',
'亮著書' => '亮著书',
'亮著作' => '亮著作',
'亮著å' => '亮著å',
'亮著錄' => '亮著录',
+'亮著录' => '亮著录',
+'亮著称' => '亮著称',
'亮著稱' => '亮著称',
'亮著者' => '亮著者',
'亮著述' => '亮著述',
'ä»—è‘—' => 'ä»—ç€',
+'仗著书' => '仗著书',
'仗著書' => '仗著书',
'仗著作' => '仗著作',
'ä»—è‘—å' => 'ä»—è‘—å',
+'仗著录' => '仗著录',
'仗著錄' => '仗著录',
'仗著稱' => '仗著称',
+'仗著称' => '仗著称',
'仗著者' => '仗著者',
'ä»—è‘—è¿°' => 'ä»—è‘—è¿°',
'代表著' => '代表ç€',
'代表著書' => '代表著书',
+'代表著书' => '代表著书',
'代表著作' => '代表著作',
'代表著å' => '代表著å',
'代表著錄' => '代表著录',
+'代表著录' => '代表著录',
+'代表著称' => '代表著称',
'代表著稱' => '代表著称',
'代表著者' => '代表著者',
'代表著述' => '代表著述',
@@ -12906,26 +12996,35 @@ $zh2Hans = array(
'傳著者' => '传著者',
'傳著述' => '传著述',
'ä¼´è‘—' => 'ä¼´ç€',
+'伴著书' => '伴著书',
'伴著書' => '伴著书',
'伴著作' => '伴著作',
'ä¼´è‘—å' => 'ä¼´è‘—å',
+'伴著录' => '伴著录',
'伴著錄' => '伴著录',
'伴著稱' => '伴著称',
+'伴著称' => '伴著称',
'伴著者' => '伴著者',
'ä¼´è‘—è¿°' => 'ä¼´è‘—è¿°',
'低著' => '低ç€',
'低著書' => '低著书',
+'低著书' => '低著书',
'低著作' => '低著作',
'低著å' => '低著å',
+'低著录' => '低著录',
'低著錄' => '低著录',
'低著稱' => '低著称',
+'低著称' => '低著称',
'低著者' => '低著者',
'低著述' => '低著述',
'ä½è‘—' => 'ä½ç€',
'ä½è‘—書' => 'ä½è‘—书',
+'ä½è‘—书' => 'ä½è‘—书',
'ä½è‘—作' => 'ä½è‘—作',
'ä½è‘—å' => 'ä½è‘—å',
'ä½è‘—錄' => 'ä½è‘—录',
+'ä½è‘—录' => 'ä½è‘—录',
+'ä½è‘—称' => 'ä½è‘—称',
'ä½è‘—稱' => 'ä½è‘—称',
'ä½è‘—者' => 'ä½è‘—者',
'ä½è‘—è¿°' => 'ä½è‘—è¿°',
@@ -12941,28 +13040,37 @@ $zh2Hans = array(
'å´è‘—è¿°' => '侧著述',
'ä¿è­·è‘—' => 'ä¿æŠ¤ç€',
'ä¿éšœè‘—' => 'ä¿éšœç€',
+'ä¿éšœè‘—书' => 'ä¿éšœè‘—书',
'ä¿éšœè‘—書' => 'ä¿éšœè‘—书',
'ä¿éšœè‘—作' => 'ä¿éšœè‘—作',
'ä¿éšœè‘—å' => 'ä¿éšœè‘—å',
'ä¿éšœè‘—錄' => 'ä¿éšœè‘—录',
+'ä¿éšœè‘—录' => 'ä¿éšœè‘—录',
'ä¿éšœè‘—稱' => 'ä¿éšœè‘—称',
+'ä¿éšœè‘—称' => 'ä¿éšœè‘—称',
'ä¿éšœè‘—者' => 'ä¿éšœè‘—者',
'ä¿éšœè‘—è¿°' => 'ä¿éšœè‘—è¿°',
'ä¿¡è‘—' => 'ä¿¡ç€',
+'信著书' => '信著书',
'信著書' => '信著书',
'信著作' => '信著作',
'ä¿¡è‘—å' => 'ä¿¡è‘—å',
+'信著录' => '信著录',
'信著錄' => '信著录',
+'信著称' => '信著称',
'信著稱' => '信著称',
'信著者' => '信著者',
'ä¿¡è‘—è¿°' => 'ä¿¡è‘—è¿°',
'ä¿®éŠ' => '修炼',
'候著' => '候ç€',
'候著書' => '候著书',
+'候著书' => '候著书',
'候著作' => '候著作',
'候著å' => '候著å',
+'候著录' => '候著录',
'候著錄' => '候著录',
'候著稱' => '候著称',
+'候著称' => '候著称',
'候著者' => '候著者',
'候著述' => '候著述',
'藉助' => '借助',
@@ -12977,36 +13085,48 @@ $zh2Hans = array(
'藉著' => '借ç€',
'藉端' => '借端',
'借著書' => '借著书',
+'借著书' => '借著书',
'借著作' => '借著作',
'借著å' => '借著å',
+'借著录' => '借著录',
'借著錄' => '借著录',
+'借著称' => '借著称',
'借著稱' => '借著称',
'借著者' => '借著者',
'借著述' => '借著述',
'藉詞' => '借è¯',
'åšè‘—' => 'åšç€',
'åšè‘—書' => 'åšè‘—书',
+'åšè‘—书' => 'åšè‘—书',
'åšè‘—作' => 'åšè‘—作',
'åšè‘—å' => 'åšè‘—å',
'åšè‘—錄' => 'åšè‘—录',
+'åšè‘—录' => 'åšè‘—录',
'åšè‘—稱' => 'åšè‘—称',
+'åšè‘—称' => 'åšè‘—称',
'åšè‘—者' => 'åšè‘—者',
'åšè‘—è¿°' => 'åšè‘—è¿°',
'å·è‘—' => 'å·ç€',
'å·è‘—書' => 'å·è‘—书',
+'å·è‘—书' => 'å·è‘—书',
'å·è‘—作' => 'å·è‘—作',
'å·è‘—å' => 'å·è‘—å',
'å·è‘—錄' => 'å·è‘—录',
+'å·è‘—录' => 'å·è‘—录',
'å·è‘—稱' => 'å·è‘—称',
+'å·è‘—称' => 'å·è‘—称',
'å·è‘—者' => 'å·è‘—者',
'å·è‘—è¿°' => 'å·è‘—è¿°',
'傢俬' => '傢俬',
'光著' => 'å…‰ç€',
'光著書' => '光著书',
+'光著书' => '光著书',
'光著作' => '光著作',
'光著å' => '光著å',
'光著錄' => '光著录',
+'光著录' => '光著录',
'光著稱' => '光著称',
+'光著称' => '光著称',
'光著者' => '光著者',
'光著述' => '光著述',
'關著' => 'å…³ç€',
@@ -13019,18 +13139,24 @@ $zh2Hans = array(
'關著述' => '关著述',
'冀著' => '冀ç€',
'冀著書' => '冀著书',
+'冀著书' => '冀著书',
'冀著作' => '冀著作',
'冀著å' => '冀著å',
'冀著錄' => '冀著录',
+'冀著录' => '冀著录',
'冀著稱' => '冀著称',
+'冀著称' => '冀著称',
'冀著者' => '冀著者',
'冀著述' => '冀著述',
'冒著' => '冒ç€',
+'冒著书' => '冒著书',
'冒著書' => '冒著书',
'冒著作' => '冒著作',
'冒著å' => '冒著å',
+'冒著录' => '冒著录',
'冒著錄' => '冒著录',
'冒著稱' => '冒著称',
+'冒著称' => '冒著称',
'冒著者' => '冒著者',
'冒著述' => '冒著述',
'寫著' => '写ç€',
@@ -13051,19 +13177,25 @@ $zh2Hans = array(
'涼著述' => '凉著述',
'憑藉' => '凭借',
'制著' => '制ç€',
+'制著书' => '制著书',
'制著書' => '制著书',
'制著作' => '制著作',
'制著å' => '制著å',
'制著錄' => '制著录',
+'制著录' => '制著录',
+'制著称' => '制著称',
'制著稱' => '制著称',
'制著者' => '制著者',
'制著述' => '制著述',
'刻著' => '刻ç€',
'刻著書' => '刻著书',
+'刻著书' => '刻著书',
'刻著作' => '刻著作',
'刻著å' => '刻著å',
+'刻著录' => '刻著录',
'刻著錄' => '刻著录',
'刻著稱' => '刻著称',
+'刻著称' => '刻著称',
'刻著者' => '刻著者',
'刻著述' => '刻著述',
'辦著' => '办ç€',
@@ -13084,26 +13216,35 @@ $zh2Hans = array(
'動著述' => '动著述',
'努力著' => '努力ç€',
'努力著書' => '努力著书',
+'努力著书' => '努力著书',
'努力著作' => '努力著作',
'努力著å' => '努力著å',
'努力著錄' => '努力著录',
+'努力著录' => '努力著录',
+'努力著称' => '努力著称',
'努力著稱' => '努力著称',
'努力著者' => '努力著者',
'努力著述' => '努力著述',
'努著' => '努ç€',
'努著書' => '努著书',
+'努著书' => '努著书',
'努著作' => '努著作',
'努著å' => '努著å',
'努著錄' => '努著录',
+'努著录' => '努著录',
+'努著称' => '努著称',
'努著稱' => '努著称',
'努著者' => '努著者',
'努著述' => '努著述',
'å“è‘—' => 'å“è‘—',
'å°è‘—' => 'å°ç€',
+'å°è‘—书' => 'å°è‘—书',
'å°è‘—書' => 'å°è‘—书',
'å°è‘—作' => 'å°è‘—作',
'å°è‘—å' => 'å°è‘—å',
+'å°è‘—录' => 'å°è‘—录',
'å°è‘—錄' => 'å°è‘—录',
+'å°è‘—称' => 'å°è‘—称',
'å°è‘—稱' => 'å°è‘—称',
'å°è‘—者' => 'å°è‘—者',
'å°è‘—è¿°' => 'å°è‘—è¿°',
@@ -13118,21 +13259,27 @@ $zh2Hans = array(
'壓著述' => '压著述',
'原著' => '原著',
'去著' => '去ç€',
+'去著书' => '去著书',
'去著書' => '去著书',
'去著作' => '去著作',
'去著å' => '去著å',
+'去著录' => '去著录',
'去著錄' => '去著录',
'去著稱' => '去著称',
+'去著称' => '去著称',
'去著者' => '去著者',
'去著述' => '去著述',
'åå覆覆' => 'ååå¤å¤',
'å覆' => 'åå¤',
'å—è‘—' => 'å—ç€',
'å—著書' => 'å—著书',
+'å—著书' => 'å—著书',
'å—著作' => 'å—著作',
'å—è‘—å' => 'å—è‘—å',
'å—著錄' => 'å—著录',
+'å—著录' => 'å—著录',
'å—著稱' => 'å—著称',
+'å—著称' => 'å—著称',
'å—著者' => 'å—著者',
'å—è‘—è¿°' => 'å—è‘—è¿°',
'變著' => 'å˜ç€',
@@ -13144,10 +13291,13 @@ $zh2Hans = array(
'變著者' => 'å˜è‘—者',
'變著述' => 'å˜è‘—è¿°',
'å«è‘—' => 'å«ç€',
+'å«è‘—书' => 'å«è‘—书',
'å«è‘—書' => 'å«è‘—书',
'å«è‘—作' => 'å«è‘—作',
'å«è‘—å' => 'å«è‘—å',
+'å«è‘—录' => 'å«è‘—录',
'å«è‘—錄' => 'å«è‘—录',
+'å«è‘—称' => 'å«è‘—称',
'å«è‘—稱' => 'å«è‘—称',
'å«è‘—者' => 'å«è‘—者',
'å«è‘—è¿°' => 'å«è‘—è¿°',
@@ -13161,17 +13311,23 @@ $zh2Hans = array(
'åè‘—' => 'åè‘—',
'å‘è‘—' => 'å‘ç€',
'å‘著書' => 'å‘著书',
+'å‘著书' => 'å‘著书',
'å‘著作' => 'å‘著作',
'å‘è‘—å' => 'å‘è‘—å',
'å‘著錄' => 'å‘著录',
+'å‘著录' => 'å‘著录',
+'å‘著称' => 'å‘著称',
'å‘著稱' => 'å‘著称',
'å‘著者' => 'å‘著者',
'å‘è‘—è¿°' => 'å‘è‘—è¿°',
'å«è‘—' => 'å«ç€',
'å«è‘—書' => 'å«è‘—书',
+'å«è‘—书' => 'å«è‘—书',
'å«è‘—作' => 'å«è‘—作',
'å«è‘—å' => 'å«è‘—å',
'å«è‘—錄' => 'å«è‘—录',
+'å«è‘—录' => 'å«è‘—录',
+'å«è‘—称' => 'å«è‘—称',
'å«è‘—稱' => 'å«è‘—称',
'å«è‘—者' => 'å«è‘—者',
'å«è‘—è¿°' => 'å«è‘—è¿°',
@@ -13189,18 +13345,24 @@ $zh2Hans = array(
'å³å…¶æ¿¬' => 'å´å…¶æ¿¬',
'å¹è‘—' => 'å¹ç€',
'å¹è‘—書' => 'å¹è‘—书',
+'å¹è‘—书' => 'å¹è‘—书',
'å¹è‘—作' => 'å¹è‘—作',
'å¹è‘—å' => 'å¹è‘—å',
+'å¹è‘—录' => 'å¹è‘—录',
'å¹è‘—錄' => 'å¹è‘—录',
'å¹è‘—稱' => 'å¹è‘—称',
+'å¹è‘—称' => 'å¹è‘—称',
'å¹è‘—者' => 'å¹è‘—者',
'å¹è‘—è¿°' => 'å¹è‘—è¿°',
'周易乾' => '周易乾',
'味著' => '味ç€',
+'味著书' => '味著书',
'味著書' => '味著书',
'味著作' => '味著作',
'味著å' => '味著å',
+'味著录' => '味著录',
'味著錄' => '味著录',
+'味著称' => '味著称',
'味著稱' => '味著称',
'味著者' => '味著者',
'味著述' => '味著述',
@@ -13216,26 +13378,35 @@ $zh2Hans = array(
'哪å’' => '哪å’',
'å“­è‘—' => 'å“­ç€',
'哭著書' => '哭著书',
+'哭著书' => '哭著书',
'哭著作' => '哭著作',
'å“­è‘—å' => 'å“­è‘—å',
'哭著錄' => '哭著录',
+'哭著录' => '哭著录',
'哭著稱' => '哭著称',
+'哭著称' => '哭著称',
'哭著者' => '哭著者',
'å“­è‘—è¿°' => 'å“­è‘—è¿°',
'唱著' => 'å”±ç€',
+'唱著书' => '唱著书',
'唱著書' => '唱著书',
'唱著作' => '唱著作',
'唱著å' => '唱著å',
+'唱著录' => '唱著录',
'唱著錄' => '唱著录',
+'唱著称' => '唱著称',
'唱著稱' => '唱著称',
'唱著者' => '唱著者',
'唱著述' => '唱著述',
'å–è‘—' => 'å–ç€',
+'å–著书' => 'å–著书',
'å–著書' => 'å–著书',
'å–著作' => 'å–著作',
'å–è‘—å' => 'å–è‘—å',
+'å–著录' => 'å–著录',
'å–著錄' => 'å–著录',
'å–著稱' => 'å–著称',
+'å–著称' => 'å–著称',
'å–著者' => 'å–著者',
'å–è‘—è¿°' => 'å–è‘—è¿°',
'å—…ä¸è‘—' => 'å—…ä¸ç€',
@@ -13243,9 +13414,12 @@ $zh2Hans = array(
'å—…è‘—' => 'å—…ç€',
'åš·è‘—' => 'åš·ç€',
'嚷著書' => '嚷著书',
+'嚷著书' => '嚷著书',
'嚷著作' => '嚷著作',
'åš·è‘—å' => 'åš·è‘—å',
'嚷著錄' => '嚷著录',
+'嚷著录' => '嚷著录',
+'嚷著称' => '嚷著称',
'嚷著稱' => '嚷著称',
'嚷著者' => '嚷著者',
'åš·è‘—è¿°' => 'åš·è‘—è¿°',
@@ -13254,17 +13428,23 @@ $zh2Hans = array(
'因著〈' => '因著〈',
'因著《' => '因著《',
'因著書' => '因著书',
+'因著书' => '因著书',
'因著作' => '因著作',
'å› è‘—å' => 'å› è‘—å',
'因著錄' => '因著录',
+'因著录' => '因著录',
'因著稱' => '因著称',
+'因著称' => '因著称',
'因著者' => '因著者',
'å› è‘—è¿°' => 'å› è‘—è¿°',
'å›°è‘—' => 'å›°ç€',
'困著書' => '困著书',
+'困著书' => '困著书',
'困著作' => '困著作',
'å›°è‘—å' => 'å›°è‘—å',
'困著錄' => '困著录',
+'困著录' => '困著录',
+'困著称' => '困著称',
'困著稱' => '困著称',
'困著者' => '困著者',
'å›°è‘—è¿°' => 'å›°è‘—è¿°',
@@ -13279,17 +13459,23 @@ $zh2Hans = array(
'土著' => '土著',
'在著' => '在ç€',
'在著書' => '在著书',
+'在著书' => '在著书',
'在著作' => '在著作',
'在著å' => '在著å',
'在著錄' => '在著录',
+'在著录' => '在著录',
'在著稱' => '在著称',
+'在著称' => '在著称',
'在著者' => '在著者',
'在著述' => '在著述',
'åè‘—' => 'åç€',
+'å著书' => 'å著书',
'å著書' => 'å著书',
'å著作' => 'å著作',
'åè‘—å' => 'åè‘—å',
+'å著录' => 'å著录',
'å著錄' => 'å著录',
+'å著称' => 'å著称',
'å著稱' => 'å著称',
'å著者' => 'å著者',
'åè‘—è¿°' => 'åè‘—è¿°',
@@ -13302,8 +13488,11 @@ $zh2Hans = array(
'備著稱' => '备著称',
'備著者' => '备著者',
'備著述' => '备著述',
+'覆查' => 'å¤æŸ¥',
+'覆核' => 'å¤æ ¸',
'天é“为乾' => '天é“为乾',
'天é“為乾' => '天é“为乾',
+'太閤' => '太é˜',
'夾著' => '夹ç€',
'夾著書' => '夹著书',
'夾著作' => '夹著作',
@@ -13314,12 +13503,16 @@ $zh2Hans = array(
'夾著述' => '夹著述',
'奧å€' => '奧区',
'姓幺' => '姓幺',
+'字乾生' => '字乾生',
'存摺' => '存摺',
'孤著' => 'å­¤ç€',
+'孤著书' => '孤著书',
'孤著書' => '孤著书',
'孤著作' => '孤著作',
'孤著å' => '孤著å',
'孤著錄' => '孤著录',
+'孤著录' => '孤著录',
+'孤著称' => '孤著称',
'孤著稱' => '孤著称',
'孤著者' => '孤著者',
'孤著述' => '孤著述',
@@ -13333,17 +13526,23 @@ $zh2Hans = array(
'學著述' => '学著述',
'守著' => '守ç€',
'守著書' => '守著书',
+'守著书' => '守著书',
'守著作' => '守著作',
'守著å' => '守著å',
+'守著录' => '守著录',
'守著錄' => '守著录',
+'守著称' => '守著称',
'守著稱' => '守著称',
'守著者' => '守著者',
'守著述' => '守著述',
'定著' => '定ç€',
'定著書' => '定著书',
+'定著书' => '定著书',
'定著作' => '定著作',
'定著å' => '定著å',
'定著錄' => '定著录',
+'定著录' => '定著录',
+'定著称' => '定著称',
'定著稱' => '定著称',
'定著者' => '定著者',
'定著述' => '定著述',
@@ -13367,12 +13566,16 @@ $zh2Hans = array(
'尼乾陀' => '尼乾陀',
'展著' => '展ç€',
'展著書' => '展著书',
+'展著书' => '展著书',
'展著作' => '展著作',
'展著å' => '展著å',
'展著錄' => '展著录',
+'展著录' => '展著录',
'展著稱' => '展著称',
+'展著称' => '展著称',
'展著者' => '展著者',
'展著述' => '展著述',
+'峯岸å—' => '峯岸å—',
'巨著' => '巨著',
'帶著' => '带ç€',
'帶著書' => '带著书',
@@ -13404,8 +13607,8 @@ $zh2Hans = array(
'幺åŠç¾¤' => '幺åŠç¾¤',
'幺å»' => '幺厮',
'幺厮' => '幺厮',
-'么å”' => '幺å”',
'幺å”' => '幺å”',
+'么å”' => '幺å”',
'么媽' => '幺妈',
'幺媽' => '幺妈',
'么妹' => '幺妹',
@@ -13449,10 +13652,13 @@ $zh2Hans = array(
'應著述' => '应著述',
'康乾' => '康乾',
'康著' => '康ç€',
+'康著书' => '康著书',
'康著書' => '康著书',
'康著作' => '康著作',
'康著å' => '康著å',
+'康著录' => '康著录',
'康著錄' => '康著录',
+'康著称' => '康著称',
'康著稱' => '康著称',
'康著者' => '康著者',
'康著述' => '康著述',
@@ -13465,6 +13671,7 @@ $zh2Hans = array(
'開著者' => '开著者',
'開著述' => '开著述',
'張法乾' => '张法乾',
+'张法乾' => '张法乾',
'當著' => '当ç€',
'當著書' => '当著书',
'當著作' => '当著作',
@@ -13475,58 +13682,79 @@ $zh2Hans = array(
'當著述' => '当著述',
'彰明較著' => '彰明较著',
'å¾…è‘—' => 'å¾…ç€',
+'待著书' => '待著书',
'待著書' => '待著书',
'待著作' => '待著作',
'å¾…è‘—å' => 'å¾…è‘—å',
+'待著录' => '待著录',
'待著錄' => '待著录',
'待著稱' => '待著称',
+'待著称' => '待著称',
'待著者' => '待著者',
'å¾…è‘—è¿°' => 'å¾…è‘—è¿°',
'å¾—è‘—' => 'å¾—ç€',
'得著書' => '得著书',
+'得著书' => '得著书',
'得著作' => '得著作',
'å¾—è‘—å' => 'å¾—è‘—å',
'得著錄' => '得著录',
+'得著录' => '得著录',
'得著稱' => '得著称',
+'得著称' => '得著称',
'得著者' => '得著者',
'å¾—è‘—è¿°' => 'å¾—è‘—è¿°',
'循著' => '循ç€',
+'循著书' => '循著书',
'循著書' => '循著书',
'循著作' => '循著作',
'循著å' => '循著å',
+'循著录' => '循著录',
'循著錄' => '循著录',
+'循著称' => '循著称',
'循著稱' => '循著称',
'循著者' => '循著者',
'循著述' => '循著述',
'心著' => '心ç€',
+'心著书' => '心著书',
'心著書' => '心著书',
'心著作' => '心著作',
'心著å' => '心著å',
+'心著录' => '心著录',
'心著錄' => '心著录',
'心著稱' => '心著称',
+'心著称' => '心著称',
'心著者' => '心著者',
'心著述' => '心著述',
'å¿è‘—' => 'å¿ç€',
+'å¿è‘—书' => 'å¿è‘—书',
'å¿è‘—書' => 'å¿è‘—书',
'å¿è‘—作' => 'å¿è‘—作',
'å¿è‘—å' => 'å¿è‘—å',
+'å¿è‘—录' => 'å¿è‘—录',
'å¿è‘—錄' => 'å¿è‘—录',
'å¿è‘—稱' => 'å¿è‘—称',
+'å¿è‘—称' => 'å¿è‘—称',
'å¿è‘—者' => 'å¿è‘—者',
'å¿è‘—è¿°' => 'å¿è‘—è¿°',
'å¿—è‘—' => 'å¿—ç€',
'志著書' => '志著书',
+'志著书' => '志著书',
'志著作' => '志著作',
'å¿—è‘—å' => 'å¿—è‘—å',
'志著錄' => '志著录',
+'志著录' => '志著录',
+'志著称' => '志著称',
'志著稱' => '志著称',
'志著者' => '志著者',
'å¿—è‘—è¿°' => 'å¿—è‘—è¿°',
'忙著' => 'å¿™ç€',
+'忙著书' => '忙著书',
'忙著書' => '忙著书',
'忙著作' => '忙著作',
'忙著å' => '忙著å',
+'忙著录' => '忙著录',
'忙著錄' => '忙著录',
+'忙著称' => '忙著称',
'忙著稱' => '忙著称',
'忙著者' => '忙著者',
'忙著述' => '忙著述',
@@ -13539,18 +13767,24 @@ $zh2Hans = array(
'懷著者' => '怀著者',
'懷著述' => '怀著述',
'急著' => '急ç€',
+'急著书' => '急著书',
'急著書' => '急著书',
'急著作' => '急著作',
'急著å' => '急著å',
+'急著录' => '急著录',
'急著錄' => '急著录',
+'急著称' => '急著称',
'急著稱' => '急著称',
'急著者' => '急著者',
'急著述' => '急著述',
'性著' => '性ç€',
+'性著书' => '性著书',
'性著書' => '性著书',
'性著作' => '性著作',
'性著å' => '性著å',
+'性著录' => '性著录',
'性著錄' => '性著录',
+'性著称' => '性著称',
'性著稱' => '性著称',
'性著者' => '性著者',
'性著述' => '性著述',
@@ -13565,9 +13799,12 @@ $zh2Hans = array(
'æ©å¨ä¸¦è‘—' => 'æ©å¨å¹¶è‘—',
'æ‚ è‘—' => 'æ‚ ç€',
'悠著書' => '悠著书',
+'悠著书' => '悠著书',
'悠著作' => '悠著作',
'æ‚ è‘—å' => 'æ‚ è‘—å',
'悠著錄' => '悠著录',
+'悠著录' => '悠著录',
+'悠著称' => '悠著称',
'悠著稱' => '悠著称',
'悠著者' => '悠著者',
'æ‚ è‘—è¿°' => 'æ‚ è‘—è¿°',
@@ -13581,9 +13818,12 @@ $zh2Hans = array(
'慣著述' => '惯著述',
'想著' => '想ç€',
'想著書' => '想著书',
+'想著书' => '想著书',
'想著作' => '想著作',
'想著å' => '想著å',
'想著錄' => '想著录',
+'想著录' => '想著录',
+'想著称' => '想著称',
'想著稱' => '想著称',
'想著者' => '想著者',
'想著述' => '想著述',
@@ -13597,33 +13837,45 @@ $zh2Hans = array(
'戰著述' => '战著述',
'戴著' => '戴ç€',
'戴著書' => '戴著书',
+'戴著书' => '戴著书',
'戴著作' => '戴著作',
'戴著å' => '戴著å',
'戴著錄' => '戴著录',
+'戴著录' => '戴著录',
'戴著稱' => '戴著称',
+'戴著称' => '戴著称',
'戴著者' => '戴著者',
'戴著述' => '戴著述',
'扎著' => '扎ç€',
'扎著書' => '扎著书',
+'扎著书' => '扎著书',
'扎著作' => '扎著作',
'扎著å' => '扎著å',
'扎著錄' => '扎著录',
+'扎著录' => '扎著录',
+'扎著称' => '扎著称',
'扎著稱' => '扎著称',
'扎著者' => '扎著者',
'扎著述' => '扎著述',
'打著' => '打ç€',
'打著書' => '打著书',
+'打著书' => '打著书',
'打著作' => '打著作',
'打著å' => '打著å',
'打著錄' => '打著录',
+'打著录' => '打著录',
+'打著称' => '打著称',
'打著稱' => '打著称',
'打著者' => '打著者',
'打著述' => '打著述',
'扛著' => '扛ç€',
+'扛著书' => '扛著书',
'扛著書' => '扛著书',
'扛著作' => '扛著作',
'扛著å' => '扛著å',
+'扛著录' => '扛著录',
'扛著錄' => '扛著录',
+'扛著称' => '扛著称',
'扛著稱' => '扛著称',
'扛著者' => '扛著者',
'扛著述' => '扛著述',
@@ -13633,7 +13885,9 @@ $zh2Hans = array(
'抓著' => '抓ç€',
'抓著作' => '抓著作',
'抓著å' => '抓著å',
+'抓著录' => '抓著录',
'抓著錄' => '抓著录',
+'抓著称' => '抓著称',
'抓著稱' => '抓著称',
'抓著者' => '抓著者',
'抓著述' => '抓著述',
@@ -13646,32 +13900,42 @@ $zh2Hans = array(
'護著者' => '护著者',
'護著述' => '护著述',
'披著' => '披ç€',
+'披著书' => '披著书',
'披著書' => '披著书',
'披著作' => '披著作',
'披著å' => '披著å',
+'披著录' => '披著录',
'披著錄' => '披著录',
'披著稱' => '披著称',
+'披著称' => '披著称',
'披著者' => '披著者',
'披著述' => '披著述',
'抬著' => '抬ç€',
'抬著作' => '抬著作',
'抬著å' => '抬著å',
+'抬著录' => '抬著录',
'抬著錄' => '抬著录',
'抬著稱' => '抬著称',
+'抬著称' => '抬著称',
'抬著者' => '抬著者',
'抬著述' => '抬著述',
'抱著' => '抱ç€',
'抱著作' => '抱著作',
'抱著å' => '抱著å',
+'抱著录' => '抱著录',
'抱著錄' => '抱著录',
'抱著稱' => '抱著称',
+'抱著称' => '抱著称',
'抱著者' => '抱著者',
'抱著述' => '抱著述',
'拉著' => '拉ç€',
+'拉著书' => '拉著书',
'拉著書' => '拉著书',
'拉著作' => '拉著作',
'拉著å' => '拉著å',
+'拉著录' => '拉著录',
'拉著錄' => '拉著录',
+'拉著称' => '拉著称',
'拉著稱' => '拉著称',
'拉著者' => '拉著者',
'拉著述' => '拉著述',
@@ -13680,6 +13944,8 @@ $zh2Hans = array(
'拎著作' => '拎著作',
'æ‹Žè‘—å' => 'æ‹Žè‘—å',
'拎著錄' => '拎著录',
+'拎著录' => '拎著录',
+'拎著称' => '拎著称',
'拎著稱' => '拎著称',
'拎著者' => '拎著者',
'æ‹Žè‘—è¿°' => 'æ‹Žè‘—è¿°',
@@ -13687,7 +13953,9 @@ $zh2Hans = array(
'拖著作' => '拖著作',
'æ‹–è‘—å' => 'æ‹–è‘—å',
'拖著錄' => '拖著录',
+'拖著录' => '拖著录',
'拖著稱' => '拖著称',
+'拖著称' => '拖著称',
'拖著者' => '拖著者',
'æ‹–è‘—è¿°' => 'æ‹–è‘—è¿°',
'拙著' => '拙著',
@@ -13697,14 +13965,18 @@ $zh2Hans = array(
'拼著' => '拼ç€',
'拼著作' => '拼著作',
'拼著å' => '拼著å',
+'拼著录' => '拼著录',
'拼著錄' => '拼著录',
'拼著稱' => '拼著称',
+'拼著称' => '拼著称',
'拼著者' => '拼著者',
'拼著述' => '拼著述',
'æ‹¿è‘—' => 'æ‹¿ç€',
'拿著作' => '拿著作',
'æ‹¿è‘—å' => 'æ‹¿è‘—å',
+'拿著录' => '拿著录',
'拿著錄' => '拿著录',
+'拿著称' => '拿著称',
'拿著稱' => '拿著称',
'拿著者' => '拿著者',
'æ‹¿è‘—è¿°' => 'æ‹¿è‘—è¿°',
@@ -13712,6 +13984,8 @@ $zh2Hans = array(
'æŒè‘—作' => 'æŒè‘—作',
'æŒè‘—å' => 'æŒè‘—å',
'æŒè‘—錄' => 'æŒè‘—录',
+'æŒè‘—录' => 'æŒè‘—录',
+'æŒè‘—称' => 'æŒè‘—称',
'æŒè‘—稱' => 'æŒè‘—称',
'æŒè‘—者' => 'æŒè‘—者',
'æŒè‘—è¿°' => 'æŒè‘—è¿°',
@@ -13719,6 +13993,8 @@ $zh2Hans = array(
'挑著作' => '挑著作',
'挑著å' => '挑著å',
'挑著錄' => '挑著录',
+'挑著录' => '挑著录',
+'挑著称' => '挑著称',
'挑著稱' => '挑著称',
'挑著者' => '挑著者',
'挑著述' => '挑著述',
@@ -13748,13 +14024,17 @@ $zh2Hans = array(
'挨著作' => '挨著作',
'挨著å' => '挨著å',
'挨著錄' => '挨著录',
+'挨著录' => '挨著录',
'挨著稱' => '挨著称',
+'挨著称' => '挨著称',
'挨著者' => '挨著者',
'挨著述' => '挨著述',
'æ†è‘—' => 'æ†ç€',
'æ†è‘—作' => 'æ†è‘—作',
'æ†è‘—å' => 'æ†è‘—å',
'æ†è‘—錄' => 'æ†è‘—录',
+'æ†è‘—录' => 'æ†è‘—录',
+'æ†è‘—称' => 'æ†è‘—称',
'æ†è‘—稱' => 'æ†è‘—称',
'æ†è‘—者' => 'æ†è‘—者',
'æ†è‘—è¿°' => 'æ†è‘—è¿°',
@@ -13770,21 +14050,28 @@ $zh2Hans = array(
'掖著作' => '掖著作',
'掖著å' => '掖著å',
'掖著錄' => '掖著录',
+'掖著录' => '掖著录',
'掖著稱' => '掖著称',
+'掖著称' => '掖著称',
'掖著者' => '掖著者',
'掖著述' => '掖著述',
'接著' => '接ç€',
'接著作' => '接著作',
'接著å' => '接著å',
'接著錄' => '接著录',
+'接著录' => '接著录',
'接著稱' => '接著称',
+'接著称' => '接著称',
'接著者' => '接著者',
'接著述' => '接著述',
'æ‰è‘—' => 'æ‰ç€',
+'æ‰è‘—书' => 'æ‰è‘—书',
'æ‰è‘—書' => 'æ‰è‘—书',
'æ‰è‘—作' => 'æ‰è‘—作',
'æ‰è‘—å' => 'æ‰è‘—å',
+'æ‰è‘—录' => 'æ‰è‘—录',
'æ‰è‘—錄' => 'æ‰è‘—录',
+'æ‰è‘—称' => 'æ‰è‘—称',
'æ‰è‘—稱' => 'æ‰è‘—称',
'æ‰è‘—者' => 'æ‰è‘—者',
'æ‰è‘—è¿°' => 'æ‰è‘—è¿°',
@@ -13792,7 +14079,9 @@ $zh2Hans = array(
'æ著作' => 'æ著作',
'æè‘—å' => 'æè‘—å',
'æ著錄' => 'æ著录',
+'æ著录' => 'æ著录',
'æ著稱' => 'æ著称',
+'æ著称' => 'æ著称',
'æ著者' => 'æ著者',
'æè‘—è¿°' => 'æè‘—è¿°',
'æ‘Ÿè‘—' => 'æ‚ç€',
@@ -13812,9 +14101,12 @@ $zh2Hans = array(
'æ’°è‘—' => 'æ’°è‘—',
'撼著' => 'æ’¼ç€',
'撼著書' => '撼著书',
+'撼著书' => '撼著书',
'撼著作' => '撼著作',
'撼著å' => '撼著å',
'撼著錄' => '撼著录',
+'撼著录' => '撼著录',
+'撼著称' => '撼著称',
'撼著稱' => '撼著称',
'撼著者' => '撼著者',
'撼著述' => '撼著述',
@@ -13822,7 +14114,9 @@ $zh2Hans = array(
'敞著作' => '敞著作',
'æ•žè‘—å' => 'æ•žè‘—å',
'敞著錄' => '敞著录',
+'敞著录' => '敞著录',
'敞著稱' => '敞著称',
+'敞著称' => '敞著称',
'敞著者' => '敞著者',
'æ•žè‘—è¿°' => 'æ•žè‘—è¿°',
'數著' => 'æ•°ç€',
@@ -13834,18 +14128,24 @@ $zh2Hans = array(
'數著述' => '数著述',
'æ–—è‘—' => 'æ–—ç€',
'斗著書' => '斗著书',
+'斗著书' => '斗著书',
'斗著作' => '斗著作',
'æ–—è‘—å' => 'æ–—è‘—å',
'斗著錄' => '斗著录',
+'斗著录' => '斗著录',
+'斗著称' => '斗著称',
'斗著稱' => '斗著称',
'斗著者' => '斗著者',
'æ–—è‘—è¿°' => 'æ–—è‘—è¿°',
'斥著' => 'æ–¥ç€',
'斥著書' => '斥著书',
+'斥著书' => '斥著书',
'斥著作' => '斥著作',
'斥著å' => '斥著å',
'斥著錄' => '斥著录',
+'斥著录' => '斥著录',
'斥著稱' => '斥著称',
+'斥著称' => '斥著称',
'斥著者' => '斥著者',
'斥著述' => '斥著述',
'æ–°è‘—' => 'æ–°è‘—',
@@ -13873,14 +14173,18 @@ $zh2Hans = array(
'æ–¼èŸ' => 'æ–¼èŸ',
'於賢德' => '於贤德',
'於除鞬' => '於除鞬',
+'旋乾转å¤' => '旋乾转å¤',
'旋乾轉å¤' => '旋乾转å¤',
'曠若發矇' => 'æ—·è‹¥å‘矇',
'昂著' => '昂ç€',
+'昂著书' => '昂著书',
'昂著書' => '昂著书',
'昂著作' => '昂著作',
'昂著å' => '昂著å',
'昂著錄' => '昂著录',
+'昂著录' => '昂著录',
'昂著稱' => '昂著称',
+'昂著称' => '昂著称',
'昂著者' => '昂著者',
'昂著述' => '昂著述',
'易·乾' => '易·乾',
@@ -13890,10 +14194,13 @@ $zh2Hans = array(
'易ç»ä¹¾' => '易ç»ä¹¾',
'映著' => '映ç€',
'映著書' => '映著书',
+'映著书' => '映著书',
'映著作' => '映著作',
'映著å' => '映著å',
'映著錄' => '映著录',
+'映著录' => '映著录',
'映著稱' => '映著称',
+'映著称' => '映著称',
'映著者' => '映著者',
'映著述' => '映著述',
'昭著' => '昭著',
@@ -13903,46 +14210,61 @@ $zh2Hans = array(
'晃著作' => '晃著作',
'晃著å' => '晃著å',
'晃著錄' => '晃著录',
+'晃著录' => '晃著录',
+'晃著称' => '晃著称',
'晃著稱' => '晃著称',
'晃著者' => '晃著者',
'晃著述' => '晃著述',
'æš—è‘—' => 'æš—ç€',
+'暗著书' => '暗著书',
'暗著書' => '暗著书',
'暗著作' => '暗著作',
'æš—è‘—å' => 'æš—è‘—å',
'暗著錄' => '暗著录',
+'暗著录' => '暗著录',
+'暗著称' => '暗著称',
'暗著稱' => '暗著称',
'暗著者' => '暗著者',
'æš—è‘—è¿°' => 'æš—è‘—è¿°',
'有著' => '有ç€',
'有著書' => '有著书',
+'有著书' => '有著书',
'有著作' => '有著作',
'有著å' => '有著å',
'有著錄' => '有著录',
+'有著录' => '有著录',
+'有著称' => '有著称',
'有著稱' => '有著称',
'有著者' => '有著者',
'有著述' => '有著述',
'望著' => '望ç€',
'望著作' => '望著作',
'望著å' => '望著å',
+'望著录' => '望著录',
'望著錄' => '望著录',
'望著稱' => '望著称',
+'望著称' => '望著称',
'望著者' => '望著者',
'望著述' => '望著述',
'æœä¹¾å¤•æƒ•' => 'æœä¹¾å¤•æƒ•',
'æœè‘—' => 'æœç€',
'æœè‘—作' => 'æœè‘—作',
'æœè‘—å' => 'æœè‘—å',
+'æœè‘—录' => 'æœè‘—录',
'æœè‘—錄' => 'æœè‘—录',
'æœè‘—稱' => 'æœè‘—称',
+'æœè‘—称' => 'æœè‘—称',
'æœè‘—者' => 'æœè‘—者',
'æœè‘—è¿°' => 'æœè‘—è¿°',
'本著' => '本ç€',
+'本著书' => '本著书',
'本著書' => '本著书',
'本著作' => '本著作',
'本著å' => '本著å',
+'本著录' => '本著录',
'本著錄' => '本著录',
'本著稱' => '本著称',
+'本著称' => '本著称',
'本著者' => '本著者',
'本著述' => '本著述',
'朴於宇åŒ' => '朴於宇åŒ',
@@ -13979,7 +14301,9 @@ $zh2Hans = array(
'枕著作' => '枕著作',
'æž•è‘—å' => 'æž•è‘—å',
'枕著錄' => '枕著录',
+'枕著录' => '枕著录',
'枕著稱' => '枕著称',
+'枕著称' => '枕著称',
'枕著者' => '枕著者',
'æž•è‘—è¿°' => 'æž•è‘—è¿°',
'柳詒徵' => '柳诒徵',
@@ -13998,16 +14322,21 @@ $zh2Hans = array(
'梳著作' => '梳著作',
'梳著å' => '梳著å',
'梳著錄' => '梳著录',
+'梳著录' => '梳著录',
'梳著稱' => '梳著称',
+'梳著称' => '梳著称',
'梳著者' => '梳著者',
'梳著述' => '梳著述',
'樊於期' => '樊於期',
'氆氌' => '氆氌',
'求著' => '求ç€',
+'求著书' => '求著书',
'求著書' => '求著书',
'求著作' => '求著作',
'求著å' => '求著å',
+'求著录' => '求著录',
'求著錄' => '求著录',
+'求著称' => '求著称',
'求著稱' => '求著称',
'求著者' => '求著者',
'求著述' => '求著述',
@@ -14016,46 +14345,61 @@ $zh2Hans = array(
'沈ç©' => '沉积',
'沈船' => '沉船',
'沉著書' => '沉著书',
+'沉著书' => '沉著书',
'沉著作' => '沉著作',
'沉著å' => '沉著å',
'沉著錄' => '沉著录',
+'沉著录' => '沉著录',
+'沉著称' => '沉著称',
'沉著稱' => '沉著称',
'沉著者' => '沉著者',
'沉著述' => '沉著述',
'沈默' => '沉默',
'沿著' => '沿ç€',
+'沿著书' => '沿著书',
'沿著書' => '沿著书',
'沿著作' => '沿著作',
'沿著å' => '沿著å',
+'沿著录' => '沿著录',
'沿著錄' => '沿著录',
'沿著稱' => '沿著称',
+'沿著称' => '沿著称',
'沿著者' => '沿著者',
'沿著述' => '沿著述',
'氾濫' => '泛滥',
'æ´—éŠ' => '洗练',
'活著' => 'æ´»ç€',
+'活著书' => '活著书',
'活著書' => '活著书',
'活著作' => '活著作',
'活著å' => '活著å',
+'活著录' => '活著录',
'活著錄' => '活著录',
'活著稱' => '活著称',
+'活著称' => '活著称',
'活著者' => '活著者',
'活著述' => '活著述',
'æµè‘—' => 'æµç€',
+'æµè‘—书' => 'æµè‘—书',
'æµè‘—書' => 'æµè‘—书',
'æµè‘—作' => 'æµè‘—作',
'æµè‘—å' => 'æµè‘—å',
+'æµè‘—录' => 'æµè‘—录',
'æµè‘—錄' => 'æµè‘—录',
'æµè‘—稱' => 'æµè‘—称',
+'æµè‘—称' => 'æµè‘—称',
'æµè‘—者' => 'æµè‘—者',
'æµè‘—è¿°' => 'æµè‘—è¿°',
'æµéœ²è‘—' => 'æµéœ²ç€',
'浮著' => 'æµ®ç€',
+'浮著书' => '浮著书',
'浮著書' => '浮著书',
'浮著作' => '浮著作',
'浮著å' => '浮著å',
+'浮著录' => '浮著录',
'浮著錄' => '浮著录',
'浮著稱' => '浮著称',
+'浮著称' => '浮著称',
'浮著者' => '浮著者',
'浮著述' => '浮著述',
'潤著' => '润ç€',
@@ -14067,42 +14411,57 @@ $zh2Hans = array(
'潤著者' => '润著者',
'潤著述' => '润著述',
'涵著' => '涵ç€',
+'涵著书' => '涵著书',
'涵著書' => '涵著书',
'涵著作' => '涵著作',
'涵著å' => '涵著å',
+'涵著录' => '涵著录',
'涵著錄' => '涵著录',
'涵著稱' => '涵著称',
+'涵著称' => '涵著称',
'涵著者' => '涵著者',
'涵著述' => '涵著述',
'渴著' => '渴ç€',
+'渴著书' => '渴著书',
'渴著書' => '渴著书',
'渴著作' => '渴著作',
'渴著å' => '渴著å',
+'渴著录' => '渴著录',
'渴著錄' => '渴著录',
+'渴著称' => '渴著称',
'渴著稱' => '渴著称',
'渴著者' => '渴著者',
'渴著述' => '渴著述',
'溢著' => '溢ç€',
'溢著書' => '溢著书',
+'溢著书' => '溢著书',
'溢著作' => '溢著作',
'溢著å' => '溢著å',
'溢著錄' => '溢著录',
+'溢著录' => '溢著录',
+'溢著称' => '溢著称',
'溢著稱' => '溢著称',
'溢著者' => '溢著者',
'溢著述' => '溢著述',
'演著' => 'æ¼”ç€',
+'演著书' => '演著书',
'演著書' => '演著书',
'演著作' => '演著作',
'演著å' => '演著å',
+'演著录' => '演著录',
'演著錄' => '演著录',
'演著稱' => '演著称',
+'演著称' => '演著称',
'演著者' => '演著者',
'演著述' => '演著述',
'漫著' => '漫ç€',
'漫著書' => '漫著书',
+'漫著书' => '漫著书',
'漫著作' => '漫著作',
'漫著å' => '漫著å',
+'漫著录' => '漫著录',
'漫著錄' => '漫著录',
+'漫著称' => '漫著称',
'漫著稱' => '漫著称',
'漫著者' => '漫著者',
'漫著述' => '漫著述',
@@ -14121,10 +14480,13 @@ $zh2Hans = array(
'燒著者' => '烧著者',
'燒著述' => '烧著述',
'照著' => 'ç…§ç€',
+'照著书' => '照著书',
'照著書' => '照著书',
'照著作' => '照著作',
'照著å' => '照著å',
+'照著录' => '照著录',
'照著錄' => '照著录',
+'照著称' => '照著称',
'照著稱' => '照著称',
'照著者' => '照著者',
'照著述' => '照著述',
@@ -14160,41 +14522,60 @@ $zh2Hans = array(
'猜著作' => '猜著作',
'猜著å' => '猜著å',
'猜著錄' => '猜著录',
+'猜著录' => '猜著录',
+'猜著称' => '猜著称',
'猜著稱' => '猜著称',
'猜著者' => '猜著者',
'猜著述' => '猜著述',
'玩著' => '玩ç€',
'甜著' => '甜ç€',
'甜著書' => '甜著书',
+'甜著书' => '甜著书',
'甜著作' => '甜著作',
'甜著å' => '甜著å',
+'甜著录' => '甜著录',
'甜著錄' => '甜著录',
'甜著稱' => '甜著称',
+'甜著称' => '甜著称',
'甜著者' => '甜著者',
'甜著述' => '甜著述',
'用ä¸è‘—' => '用ä¸ç€',
'用得著' => '用得ç€',
'用著' => '用ç€',
+'用著书' => '用著书',
'用著書' => '用著书',
'用著作' => '用著作',
'用著å' => '用著å',
+'用著录' => '用著录',
'用著錄' => '用著录',
+'用著称' => '用著称',
'用著稱' => '用著称',
'用著者' => '用著者',
'用著述' => '用著述',
+'男为乾' => '男为乾',
+'男爲乾' => '男为乾',
+'男為乾' => '男为乾',
+'男性為乾' => '男性为乾',
+'男性爲乾' => '男性为乾',
+'男性为乾' => '男性为乾',
'留著' => 'ç•™ç€',
'留著書' => 'ç•™ç€ä¹¦',
'留著作' => '留著作',
'留著å' => '留著å',
'留著錄' => '留著录',
+'留著录' => '留著录',
'留著稱' => '留著称',
+'留著称' => '留著称',
'留著者' => '留著者',
'留著述' => '留著述',
'ç–‘è‘—' => 'ç–‘ç€',
+'疑著书' => '疑著书',
'疑著書' => '疑著书',
'疑著作' => '疑著作',
'ç–‘è‘—å' => 'ç–‘è‘—å',
+'疑著录' => '疑著录',
'疑著錄' => '疑著录',
+'疑著称' => '疑著称',
'疑著稱' => '疑著称',
'疑著者' => '疑著者',
'ç–‘è‘—è¿°' => 'ç–‘è‘—è¿°',
@@ -14208,11 +14589,14 @@ $zh2Hans = array(
'皺著者' => '皱著者',
'皺著述' => '皱著述',
'盛著' => 'ç››ç€',
+'盛著书' => '盛著书',
'盛著書' => '盛著书',
'盛著作' => '盛著作',
'盛著å' => '盛著å',
'盛著錄' => '盛著录',
+'盛著录' => '盛著录',
'盛著稱' => '盛著称',
+'盛著称' => '盛著称',
'盛著者' => '盛著者',
'盛著述' => '盛著述',
'盯著' => '盯ç€',
@@ -14220,15 +14604,20 @@ $zh2Hans = array(
'盯著作' => '盯著作',
'盯著å' => '盯著å',
'盯著錄' => '盯著录',
+'盯著录' => '盯著录',
'盯著稱' => '盯著称',
+'盯著称' => '盯著称',
'盯著者' => '盯著者',
'盯著述' => '盯著述',
'盾著' => '盾ç€',
'盾著書' => '盾著书',
+'盾著书' => '盾著书',
'盾著作' => '盾著作',
'盾著å' => '盾著å',
'盾著錄' => '盾著录',
+'盾著录' => '盾著录',
'盾著稱' => '盾著称',
+'盾著称' => '盾著称',
'盾著者' => '盾著者',
'盾著述' => '盾著述',
'看ä¸è‘—' => '看ä¸ç€',
@@ -14237,8 +14626,10 @@ $zh2Hans = array(
'看著書' => '看ç€ä¹¦',
'看著作' => '看著作',
'看著å' => '看著å',
+'看著录' => '看著录',
'看著錄' => '看著录',
'看著稱' => '看著称',
+'看著称' => '看著称',
'看著者' => '看著者',
'看著述' => '看著述',
'著業' => 'ç€ä¸š',
@@ -14347,9 +14738,12 @@ $zh2Hans = array(
'ç¡å¾—è‘—' => 'ç¡å¾—ç€',
'ç¡è‘—' => 'ç¡ç€',
'ç¡è‘—書' => 'ç¡è‘—书',
+'ç¡è‘—书' => 'ç¡è‘—书',
'ç¡è‘—作' => 'ç¡è‘—作',
'ç¡è‘—å' => 'ç¡è‘—å',
'ç¡è‘—錄' => 'ç¡è‘—录',
+'ç¡è‘—录' => 'ç¡è‘—录',
+'ç¡è‘—称' => 'ç¡è‘—称',
'ç¡è‘—稱' => 'ç¡è‘—称',
'ç¡è‘—者' => 'ç¡è‘—者',
'ç¡è‘—è¿°' => 'ç¡è‘—è¿°',
@@ -14367,15 +14761,20 @@ $zh2Hans = array(
'瞧著書' => '瞧ç€ä¹¦',
'瞧著作' => '瞧著作',
'瞧著å' => '瞧著å',
+'瞧著录' => '瞧著录',
'瞧著錄' => '瞧著录',
+'瞧著称' => '瞧著称',
'瞧著稱' => '瞧著称',
'瞧著者' => '瞧著者',
'瞧著述' => '瞧著述',
'瞪著' => '瞪ç€',
'瞪著書' => '瞪著书',
+'瞪著书' => '瞪著书',
'瞪著作' => '瞪著作',
'瞪著å' => '瞪著å',
'瞪著錄' => '瞪著录',
+'瞪著录' => '瞪著录',
+'瞪著称' => '瞪著称',
'瞪著稱' => '瞪著称',
'瞪著者' => '瞪著者',
'瞪著述' => '瞪著述',
@@ -14383,27 +14782,36 @@ $zh2Hans = array(
'石ç¢é•‡' => '石ç¢é•‡',
'石ç¢éŽ®' => '石ç¢é•‡',
'ç¦è‘—' => 'ç¦ç€',
+'ç¦è‘—书' => 'ç¦è‘—书',
'ç¦è‘—書' => 'ç¦è‘—书',
'ç¦è‘—作' => 'ç¦è‘—作',
'ç¦è‘—å' => 'ç¦è‘—å',
'ç¦è‘—錄' => 'ç¦è‘—录',
+'ç¦è‘—录' => 'ç¦è‘—录',
'ç¦è‘—稱' => 'ç¦è‘—称',
+'ç¦è‘—称' => 'ç¦è‘—称',
'ç¦è‘—者' => 'ç¦è‘—者',
'ç¦è‘—è¿°' => 'ç¦è‘—è¿°',
'ç©€æ¢' => 'ç©€æ¢',
'空著' => '空ç€',
+'空著书' => '空著书',
'空著書' => '空著书',
'空著作' => '空著作',
'空著å' => '空著å',
+'空著录' => '空著录',
'空著錄' => '空著录',
+'空著称' => '空著称',
'空著稱' => '空著称',
'空著者' => '空著者',
'空著述' => '空著述',
'ç©¿è‘—' => 'ç©¿ç€',
+'穿著书' => '穿著书',
'穿著書' => '穿著书',
'穿著作' => '穿著作',
'ç©¿è‘—å' => 'ç©¿è‘—å',
+'穿著录' => '穿著录',
'穿著錄' => '穿著录',
+'穿著称' => '穿著称',
'穿著稱' => '穿著称',
'穿著者' => '穿著者',
'ç©¿è‘—è¿°' => 'ç©¿è‘—è¿°',
@@ -14416,30 +14824,41 @@ $zh2Hans = array(
'豎著者' => '竖著者',
'豎著述' => '竖著述',
'站著' => 'ç«™ç€',
+'站著书' => '站著书',
'站著書' => '站著书',
'站著作' => '站著作',
'站著å' => '站著å',
'站著錄' => '站著录',
+'站著录' => '站著录',
+'站著称' => '站著称',
'站著稱' => '站著称',
'站著者' => '站著者',
'站著述' => '站著述',
'笑著' => '笑ç€',
+'笑著书' => '笑著书',
'笑著書' => '笑著书',
'笑著作' => '笑著作',
'笑著å' => '笑著å',
+'笑著录' => '笑著录',
'笑著錄' => '笑著录',
+'笑著称' => '笑著称',
'笑著稱' => '笑著称',
'笑著者' => '笑著者',
'笑著述' => '笑著述',
'答覆' => 'ç­”å¤',
'管著' => '管ç€',
+'管著书' => '管著书',
'管著書' => '管著书',
'管著作' => '管著作',
'管著å' => '管著å',
+'管著录' => '管著录',
'管著錄' => '管著录',
'管著稱' => '管著称',
+'管著称' => '管著称',
'管著者' => '管著者',
'管著述' => '管著述',
+'米澤瑠美' => '米泽瑠美',
+'米泽瑠美' => '米泽瑠美',
'ç¶è‘—' => '绑ç€',
'ç¶è‘—書' => '绑著书',
'ç¶è‘—作' => '绑著作',
@@ -14466,45 +14885,60 @@ $zh2Hans = array(
'çºè‘—者' => '缠著者',
'çºè‘—è¿°' => 'ç¼ è‘—è¿°',
'罩著' => '罩ç€',
+'罩著书' => '罩著书',
'罩著書' => '罩著书',
'罩著作' => '罩著作',
'罩著å' => '罩著å',
'罩著錄' => '罩著录',
+'罩著录' => '罩著录',
+'罩著称' => '罩著称',
'罩著稱' => '罩著称',
'罩著者' => '罩著者',
'罩著述' => '罩著述',
'美著' => '美ç€',
+'美著书' => '美著书',
'美著書' => '美著书',
'美著作' => '美著作',
'美著å' => '美著å',
+'美著录' => '美著录',
'美著錄' => '美著录',
'美著稱' => '美著称',
+'美著称' => '美著称',
'美著者' => '美著者',
'美著述' => '美著述',
'耀著' => '耀ç€',
'耀著書' => '耀著书',
+'耀著书' => '耀著书',
'耀著作' => '耀著作',
'耀著å' => '耀著å',
'耀著錄' => '耀著录',
+'耀著录' => '耀著录',
+'耀著称' => '耀著称',
'耀著稱' => '耀著称',
'耀著者' => '耀著者',
'耀著述' => '耀著述',
'è€å¹º' => 'è€å¹º',
'考著' => '考ç€',
'考著書' => '考著书',
+'考著书' => '考著书',
'考著作' => '考著作',
'考著å' => '考著å',
'考著錄' => '考著录',
+'考著录' => '考著录',
'考著稱' => '考著称',
+'考著称' => '考著称',
'考著者' => '考著者',
'考著述' => '考著述',
'肉乾乾' => '肉干干',
'肘手éŠè¶³' => '肘手链足',
'背著' => '背ç€',
+'背著书' => '背著书',
'背著書' => '背著书',
'背著作' => '背著作',
'背著å' => '背著å',
+'背著录' => '背著录',
'背著錄' => '背著录',
+'背著称' => '背著称',
'背著稱' => '背著称',
'背著者' => '背著者',
'背著述' => '背著述',
@@ -14525,11 +14959,14 @@ $zh2Hans = array(
'è—著者' => '艺著者',
'è—è‘—è¿°' => '艺著述',
'苦著' => '苦ç€',
+'苦著书' => '苦著书',
'苦著書' => '苦著书',
'苦著作' => '苦著作',
'苦著å' => '苦著å',
+'苦著录' => '苦著录',
'苦著錄' => '苦著录',
'苦著稱' => '苦著称',
+'苦著称' => '苦著称',
'苦著者' => '苦著者',
'苦著述' => '苦著述',
'苧烯' => '苧烯',
@@ -14545,11 +14982,14 @@ $zh2Hans = array(
'è•­ä¹¾' => 'è§ä¹¾',
'è§ä¹¾' => 'è§ä¹¾',
'è½è‘—' => 'è½ç€',
+'è½è‘—书' => 'è½è‘—书',
'è½è‘—書' => 'è½è‘—书',
'è½è‘—作' => 'è½è‘—作',
'è½è‘—å' => 'è½è‘—å',
+'è½è‘—录' => 'è½è‘—录',
'è½è‘—錄' => 'è½è‘—录',
'è½è‘—稱' => 'è½è‘—称',
+'è½è‘—称' => 'è½è‘—称',
'è½è‘—者' => 'è½è‘—者',
'è½è‘—è¿°' => 'è½è‘—è¿°',
'著書' => '著书',
@@ -14565,42 +15005,57 @@ $zh2Hans = array(
'è‘—è¿°' => 'è‘—è¿°',
'蒙著' => 'è’™ç€',
'蒙著書' => '蒙著书',
+'蒙著书' => '蒙著书',
'蒙著作' => '蒙著作',
'蒙著å' => '蒙著å',
+'蒙著录' => '蒙著录',
'蒙著錄' => '蒙著录',
'蒙著稱' => '蒙著称',
+'蒙著称' => '蒙著称',
'蒙著者' => '蒙著者',
'蒙著述' => '蒙著述',
'è—è‘—' => 'è—ç€',
'è—著書' => 'è—著书',
+'è—著书' => 'è—著书',
'è—著作' => 'è—著作',
'è—è‘—å' => 'è—è‘—å',
'è—著錄' => 'è—著录',
+'è—著录' => 'è—著录',
+'è—著称' => 'è—著称',
'è—著稱' => 'è—著称',
'è—著者' => 'è—著者',
'è—è‘—è¿°' => 'è—è‘—è¿°',
'蘸著' => '蘸ç€',
'蘸著書' => '蘸著书',
+'蘸著书' => '蘸著书',
'蘸著作' => '蘸著作',
'蘸著å' => '蘸著å',
+'蘸著录' => '蘸著录',
'蘸著錄' => '蘸著录',
'蘸著稱' => '蘸著称',
+'蘸著称' => '蘸著称',
'蘸著者' => '蘸著者',
'蘸著述' => '蘸著述',
'行著' => 'è¡Œç€',
+'行著书' => '行著书',
'行著書' => '行著书',
'行著作' => '行著作',
'行著å' => '行著å',
+'行著录' => '行著录',
'行著錄' => '行著录',
'行著稱' => '行著称',
+'行著称' => '行著称',
'行著者' => '行著者',
'行著述' => '行著述',
'衣著' => 'è¡£ç€',
+'衣著书' => '衣著书',
'衣著書' => '衣著书',
'衣著作' => '衣著作',
'衣著å' => '衣著å',
+'衣著录' => '衣著录',
'衣著錄' => '衣著录',
'衣著稱' => '衣著称',
+'衣著称' => '衣著称',
'衣著者' => '衣著者',
'衣著述' => '衣著述',
'è£è‘—' => '装ç€',
@@ -14613,9 +15068,12 @@ $zh2Hans = array(
'è£è‘—è¿°' => '装著述',
'裹著' => '裹ç€',
'裹著書' => '裹著书',
+'裹著书' => '裹著书',
'裹著作' => '裹著作',
'裹著å' => '裹著å',
+'裹著录' => '裹著录',
'裹著錄' => '裹著录',
+'裹著称' => '裹著称',
'裹著稱' => '裹著称',
'裹著者' => '裹著者',
'裹著述' => '裹著述',
@@ -14658,10 +15116,13 @@ $zh2Hans = array(
'語著者' => '语著者',
'語著述' => '语著述',
'豫著' => '豫ç€',
+'豫著书' => '豫著书',
'豫著書' => '豫著书',
'豫著作' => '豫著作',
'豫著å' => '豫著å',
+'豫著录' => '豫著录',
'豫著錄' => '豫著录',
+'豫著称' => '豫著称',
'豫著稱' => '豫著称',
'豫著者' => '豫著者',
'豫著述' => '豫著述',
@@ -14675,10 +15136,13 @@ $zh2Hans = array(
'貞著述' => '贞著述',
'èµ°è‘—' => 'èµ°ç€',
'走著書' => '走著书',
+'走著书' => '走著书',
'走著作' => '走著作',
'èµ°è‘—å' => 'èµ°è‘—å',
'走著錄' => '走著录',
+'走著录' => '走著录',
'走著稱' => '走著称',
+'走著称' => '走著称',
'走著者' => '走著者',
'èµ°è‘—è¿°' => 'èµ°è‘—è¿°',
'趕著' => '赶ç€',
@@ -14691,9 +15155,12 @@ $zh2Hans = array(
'趕著述' => '赶著述',
'趴著' => '趴ç€',
'趴著書' => '趴著书',
+'趴著书' => '趴著书',
'趴著作' => '趴著作',
'趴著å' => '趴著å',
+'趴著录' => '趴著录',
'趴著錄' => '趴著录',
+'趴著称' => '趴著称',
'趴著稱' => '趴著称',
'趴著者' => '趴著者',
'趴著述' => '趴著述',
@@ -14707,66 +15174,90 @@ $zh2Hans = array(
'èºè‘—è¿°' => '跃著述',
'è·‘è‘—' => 'è·‘ç€',
'跑著書' => '跑著书',
+'跑著书' => '跑著书',
'跑著作' => '跑著作',
'è·‘è‘—å' => 'è·‘è‘—å',
+'跑著录' => '跑著录',
'跑著錄' => '跑著录',
'跑著稱' => '跑著称',
+'跑著称' => '跑著称',
'跑著者' => '跑著者',
'è·‘è‘—è¿°' => 'è·‘è‘—è¿°',
'è·Ÿè‘—' => 'è·Ÿç€',
+'跟著书' => '跟著书',
'跟著書' => '跟著书',
'跟著作' => '跟著作',
'è·Ÿè‘—å' => 'è·Ÿè‘—å',
+'跟著录' => '跟著录',
'跟著錄' => '跟著录',
+'跟著称' => '跟著称',
'跟著稱' => '跟著称',
'跟著者' => '跟著者',
'è·Ÿè‘—è¿°' => 'è·Ÿè‘—è¿°',
'跪著' => 'è·ªç€',
'跪著書' => '跪著书',
+'跪著书' => '跪著书',
'跪著作' => '跪著作',
'跪著å' => '跪著å',
'跪著錄' => '跪著录',
+'跪著录' => '跪著录',
'跪著稱' => '跪著称',
+'跪著称' => '跪著称',
'跪著者' => '跪著者',
'跪著述' => '跪著述',
'跳著' => 'è·³ç€',
+'跳著书' => '跳著书',
'跳著書' => '跳著书',
'跳著作' => '跳著作',
'跳著å' => '跳著å',
+'跳著录' => '跳著录',
'跳著錄' => '跳著录',
+'跳著称' => '跳著称',
'跳著稱' => '跳著称',
'跳著者' => '跳著者',
'跳著述' => '跳著述',
'躊躇滿志' => '踌躇滿志',
'è¸è‘—' => 'è¸ç€',
'è¸è‘—書' => 'è¸è‘—书',
+'è¸è‘—书' => 'è¸è‘—书',
'è¸è‘—作' => 'è¸è‘—作',
'è¸è‘—å' => 'è¸è‘—å',
'è¸è‘—錄' => 'è¸è‘—录',
+'è¸è‘—录' => 'è¸è‘—录',
+'è¸è‘—称' => 'è¸è‘—称',
'è¸è‘—稱' => 'è¸è‘—称',
'è¸è‘—者' => 'è¸è‘—者',
'è¸è‘—è¿°' => 'è¸è‘—è¿°',
'踩著' => '踩ç€',
+'踩著书' => '踩著书',
'踩著書' => '踩著书',
'踩著作' => '踩著作',
'踩著å' => '踩著å',
+'踩著录' => '踩著录',
'踩著錄' => '踩著录',
'踩著稱' => '踩著称',
+'踩著称' => '踩著称',
'踩著者' => '踩著者',
'踩著述' => '踩著述',
'身著' => '身ç€',
+'身著书' => '身著书',
'身著書' => '身著书',
'身著作' => '身著作',
'身著å' => '身著å',
+'身著录' => '身著录',
'身著錄' => '身著录',
'身著稱' => '身著称',
+'身著称' => '身著称',
'身著者' => '身著者',
'身著述' => '身著述',
'躺著' => '躺ç€',
'躺著書' => '躺著书',
+'躺著书' => '躺著书',
'躺著作' => '躺著作',
'躺著å' => '躺著å',
'躺著錄' => '躺著录',
+'躺著录' => '躺著录',
+'躺著称' => '躺著称',
'躺著稱' => '躺著称',
'躺著者' => '躺著者',
'躺著述' => '躺著述',
@@ -14816,34 +15307,46 @@ $zh2Hans = array(
'è¿«è‘—' => 'è¿«ç€',
'追著' => '追ç€',
'追著書' => '追著书',
+'追著书' => '追著书',
'追著作' => '追著作',
'追著å' => '追著å',
'追著錄' => '追著录',
+'追著录' => '追著录',
+'追著称' => '追著称',
'追著稱' => '追著称',
'追著者' => '追著者',
'追著述' => '追著述',
'逆著' => '逆ç€',
'逆著書' => '逆著书',
+'逆著书' => '逆著书',
'逆著作' => '逆著作',
'逆著å' => '逆著å',
'逆著錄' => '逆著录',
+'逆著录' => '逆著录',
+'逆著称' => '逆著称',
'逆著稱' => '逆著称',
'逆著者' => '逆著者',
'逆著述' => '逆著述',
'逼著' => '逼ç€',
'逼著書' => '逼著书',
+'逼著书' => '逼著书',
'逼著作' => '逼著作',
'逼著å' => '逼著å',
'逼著錄' => '逼著录',
+'逼著录' => '逼著录',
+'逼著称' => '逼著称',
'逼著稱' => '逼著称',
'逼著者' => '逼著者',
'逼著述' => '逼著述',
'é‡è‘—' => 'é‡ç€',
'é‡è‘—書' => 'é‡è‘—书',
+'é‡è‘—书' => 'é‡è‘—书',
'é‡è‘—作' => 'é‡è‘—作',
'é‡è‘—å' => 'é‡è‘—å',
'é‡è‘—錄' => 'é‡è‘—录',
+'é‡è‘—录' => 'é‡è‘—录',
'é‡è‘—稱' => 'é‡è‘—称',
+'é‡è‘—称' => 'é‡è‘—称',
'é‡è‘—者' => 'é‡è‘—者',
'é‡è‘—è¿°' => 'é‡è‘—è¿°',
'éºè‘—' => 'é—è‘—',
@@ -14851,10 +15354,13 @@ $zh2Hans = array(
'郭å­ä¹¾' => '郭å­ä¹¾',
'é…è‘—' => 'é…ç€',
'é…著書' => 'é…著书',
+'é…著书' => 'é…著书',
'é…著作' => 'é…著作',
'é…è‘—å' => 'é…è‘—å',
'é…著錄' => 'é…著录',
+'é…著录' => 'é…著录',
'é…著稱' => 'é…著称',
+'é…著称' => 'é…著称',
'é…著者' => 'é…著者',
'é…è‘—è¿°' => 'é…è‘—è¿°',
'釀著' => 'é…¿ç€',
@@ -14867,8 +15373,8 @@ $zh2Hans = array(
'釀著述' => '酿著述',
'醯壺' => '醯壶',
'醯壶' => '醯壶',
-'醯酱' => '醯酱',
'醯醬' => '醯酱',
+'醯酱' => '醯酱',
'醯醋' => '醯醋',
'醯醢' => '醯醢',
'醯鸡' => '醯鸡',
@@ -14913,29 +15419,45 @@ $zh2Hans = array(
'èžä¸è‘—' => 'é—»ä¸ç€',
'èžå¾—è‘—' => '闻得ç€',
'èžè‘—' => 'é—»ç€',
+'阳为乾' => '阳为乾',
+'陽爲乾' => '阳为乾',
+'陽為乾' => '阳为乾',
'阿部正瞭' => '阿部正瞭',
'附著' => '附ç€',
'附çª' => '附ç¾',
+'附著书' => '附著书',
'附著書' => '附著书',
'附著作' => '附著作',
'附著å' => '附著å',
'附著錄' => '附著录',
+'附著录' => '附著录',
+'附著称' => '附著称',
'附著稱' => '附著称',
'附著者' => '附著者',
'附著述' => '附著述',
+'陈乾生' => '陈乾生',
+'陳乾生' => '陈乾生',
+'陈公乾生' => '陈公乾生',
+'陳公乾生' => '陈公乾生',
'陋著' => '陋ç€',
'陋著書' => '陋著书',
+'陋著书' => '陋著书',
'陋著作' => '陋著作',
'陋著å' => '陋著å',
'陋著錄' => '陋著录',
+'陋著录' => '陋著录',
+'陋著称' => '陋著称',
'陋著稱' => '陋著称',
'陋著者' => '陋著者',
'陋著述' => '陋著述',
'陪著' => '陪ç€',
+'陪著书' => '陪著书',
'陪著書' => '陪著书',
'陪著作' => '陪著作',
'陪著å' => '陪著å',
+'陪著录' => '陪著录',
'陪著錄' => '陪著录',
+'陪著称' => '陪著称',
'陪著稱' => '陪著称',
'陪著者' => '陪著者',
'陪著述' => '陪著述',
@@ -14950,19 +15472,25 @@ $zh2Hans = array(
'隨著者' => 'éšè‘—者',
'隨著述' => 'éšè‘—è¿°',
'隔著' => 'éš”ç€',
+'隔著书' => '隔著书',
'隔著書' => '隔著书',
'隔著作' => '隔著作',
'隔著å' => '隔著å',
+'隔著录' => '隔著录',
'隔著錄' => '隔著录',
+'隔著称' => '隔著称',
'隔著稱' => '隔著称',
'隔著者' => '隔著者',
'隔著述' => '隔著述',
'éš±çª' => 'éš±ç¾',
'é›…è‘—' => 'é›…ç€',
+'雅著书' => '雅著书',
'雅著書' => '雅著书',
'雅著作' => '雅著作',
'é›…è‘—å' => 'é›…è‘—å',
+'雅著录' => '雅著录',
'雅著錄' => '雅著录',
+'雅著称' => '雅著称',
'雅著稱' => '雅著称',
'雅著者' => '雅著者',
'é›…è‘—è¿°' => 'é›…è‘—è¿°',
@@ -14971,7 +15499,9 @@ $zh2Hans = array(
'é è‘—作' => 'é è‘—作',
'é è‘—å' => 'é è‘—å',
'é è‘—錄' => 'é è‘—录',
+'é è‘—录' => 'é è‘—录',
'é è‘—稱' => 'é è‘—称',
+'é è‘—称' => 'é è‘—称',
'é è‘—者' => 'é è‘—者',
'é è‘—è¿°' => 'é è‘—è¿°',
'é ‚è‘—' => '顶ç€',
@@ -15041,18 +15571,24 @@ $zh2Hans = array(
'騙著者' => '骗著者',
'騙著述' => '骗著述',
'高著' => '高ç€',
+'高著书' => '高著书',
'高著書' => '高著书',
'高著作' => '高著作',
'高著å' => '高著å',
+'高著录' => '高著录',
'高著錄' => '高著录',
'高著稱' => '高著称',
+'高著称' => '高著称',
'高著者' => '高著者',
'高著述' => '高著述',
'é«­è‘—' => 'é«­ç€',
+'髭著书' => '髭著书',
'髭著書' => '髭著书',
'髭著作' => '髭著作',
'é«­è‘—å' => 'é«­è‘—å',
'髭著錄' => '髭著录',
+'髭著录' => '髭著录',
+'髭著称' => '髭著称',
'髭著稱' => '髭著称',
'髭著者' => '髭著者',
'é«­è‘—è¿°' => 'é«­è‘—è¿°',
@@ -15068,11 +15604,16 @@ $zh2Hans = array(
'麽æ°' => '麽æ°',
'麽麽' => '麽麽',
'麼麼' => '麽麽',
+'黄润乾' => '黄润乾',
+'黃潤乾' => '黄润乾',
'é»è‘—' => 'é»ç€',
+'é»è‘—书' => 'é»è‘—书',
'é»è‘—書' => 'é»è‘—书',
'é»è‘—作' => 'é»è‘—作',
'é»è‘—å' => 'é»è‘—å',
+'é»è‘—录' => 'é»è‘—录',
'é»è‘—錄' => 'é»è‘—录',
+'é»è‘—称' => 'é»è‘—称',
'é»è‘—稱' => 'é»è‘—称',
'é»è‘—者' => 'é»è‘—者',
'é»è‘—è¿°' => 'é»è‘—è¿°',
@@ -15229,6 +15770,7 @@ $zh2TW = array(
'心è£' => '心裡',
'快闪存储器' => '快閃記憶體',
'闪存' => '快閃記憶體',
+'想象' => '想åƒ',
'传感' => '感測',
'习用' => '慣用',
'æˆå½©å¨±äº²' => '戲綵娛親',
@@ -15317,7 +15859,6 @@ $zh2TW = array(
'盘片' => '碟片',
'ç£ç›˜' => 'ç£ç¢Ÿ',
'ç£é“' => 'ç£è»Œ',
-'ç¦å£«' => 'ç¦æ–¯',
'秋å‡è£' => '秋å‡è£¡',
'秋天è£' => '秋天裡',
'秋日è£' => '秋日裡',
@@ -15432,7 +15973,6 @@ $zh2TW = array(
'追凶' => '追凶',
'追兇' => '追凶',
'這è£' => '這裡',
-'ä¿¡é“' => '通é“',
'逞凶鬥狠' => '逞凶鬥狠',
'逞兇鬥狠' => '逞凶鬥狠',
'逞凶斗狠' => '逞凶鬥狠',
@@ -15461,6 +16001,7 @@ $zh2TW = array(
'雪è£ç´…' => '雪裡紅',
'雪è£è•»' => '雪裡蕻',
'雪é“é¾™' => '雪éµé¾',
+'é’霉素' => 'é’é»´ç´ ',
'异步' => 'éžåŒæ­¥',
'声å¡' => '音效å¡',
'缺çœ' => 'é è¨­',
@@ -16126,6 +16667,7 @@ $zh2HK = array(
'悠著者' => '悠著者',
'æ‚ è‘—è¿°' => 'æ‚ è‘—è¿°',
'悠著錄' => '悠著錄',
+'想象' => '想åƒ',
'想著' => '想ç€',
'想著作' => '想著作',
'想著å' => '想著å',
@@ -17756,6 +18298,7 @@ $zh2CN = array(
'記憶體' => '内存',
'甘比亞' => '冈比亚',
'防寫' => '写ä¿æŠ¤',
+'è»ä¸­æ¨‚園' => '军中ä¹å›­',
'冷èœ' => '凉èœ',
'冷盤' => '凉èœ',
'幾內亞比索' => '几内亚比ç»',
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index 708a3a40..175fa6a1 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -1,10 +1,9 @@
<?php
-
/**
- * Created on Sep 5, 2006
- *
* API for MediaWiki 1.8+
*
+ * Created on Sep 5, 2006
+ *
* Copyright © 2006, 2010 Yuri Astrakhan <Firstname><Lastname>@gmail.com
*
* This program is free software; you can redistribute it and/or modify
@@ -19,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
/**
@@ -50,6 +51,8 @@ abstract class ApiBase {
const PARAM_MIN = 5; // Lowest value allowed for a parameter. Only applies if TYPE='integer'
const PARAM_ALLOW_DUPLICATES = 6; // Boolean, do we allow the same value to be set more than once when ISMULTI=true
const PARAM_DEPRECATED = 7; // Boolean, is the parameter deprecated (will show a warning)
+ const PARAM_REQUIRED = 8; // Boolean, is the parameter required?
+ const PARAM_RANGE_ENFORCE = 9; // Boolean, if MIN/MAX are set, enforce (die) these? Only applies if TYPE='integer' Use with extreme caution
const LIMIT_BIG1 = 500; // Fast query, std user limit
const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit
@@ -179,8 +182,7 @@ abstract class ApiBase {
if ( isset( $data['warnings'][$this->getModuleName()] ) ) {
// Don't add duplicate warnings
$warn_regex = preg_quote( $warning, '/' );
- if ( preg_match( "/{$warn_regex}(\\n|$)/", $data['warnings'][$this->getModuleName()]['*'] ) )
- {
+ if ( preg_match( "/{$warn_regex}(\\n|$)/", $data['warnings'][$this->getModuleName()]['*'] ) ) {
return;
}
$oldwarning = $data['warnings'][$this->getModuleName()]['*'];
@@ -224,13 +226,13 @@ abstract class ApiBase {
$msg = $lnPrfx . implode( $lnPrfx, $msg ) . "\n";
if ( $this->isReadMode() ) {
- $msg .= "\nThis module requires read rights.";
+ $msg .= "\nThis module requires read rights";
}
if ( $this->isWriteMode() ) {
- $msg .= "\nThis module requires write rights.";
+ $msg .= "\nThis module requires write rights";
}
if ( $this->mustBePosted() ) {
- $msg .= "\nThis module only accepts POST requests.";
+ $msg .= "\nThis module only accepts POST requests";
}
if ( $this->isReadMode() || $this->isWriteMode() ||
$this->mustBePosted() )
@@ -252,8 +254,11 @@ abstract class ApiBase {
$examples
);
}
- $msg .= 'Example' . ( count( $examples ) > 1 ? 's' : '' ) . ":\n ";
- $msg .= implode( $lnPrfx, $examples ) . "\n";
+
+ if ( count( $examples ) > 0 ) {
+ $msg .= 'Example' . ( count( $examples ) > 1 ? 's' : '' ) . ":\n ";
+ $msg .= implode( $lnPrfx, $examples ) . "\n";
+ }
}
if ( $this->getMain()->getShowVersions() ) {
@@ -295,12 +300,24 @@ abstract class ApiBase {
$desc = implode( $paramPrefix, $desc );
}
+ if ( !is_array( $paramSettings ) ) {
+ $paramSettings = array(
+ self::PARAM_DFLT => $paramSettings,
+ );
+ }
+
$deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] ) ?
$paramSettings[self::PARAM_DEPRECATED] : false;
if ( $deprecated ) {
$desc = "DEPRECATED! $desc";
}
+ $required = isset( $paramSettings[self::PARAM_REQUIRED] ) ?
+ $paramSettings[self::PARAM_REQUIRED] : false;
+ if ( $required ) {
+ $desc .= $paramPrefix . "This parameter is required";
+ }
+
$type = isset( $paramSettings[self::PARAM_TYPE] ) ? $paramSettings[self::PARAM_TYPE] : null;
if ( isset( $type ) ) {
if ( isset( $paramSettings[self::PARAM_ISMULTI] ) ) {
@@ -312,21 +329,26 @@ abstract class ApiBase {
if ( is_array( $type ) ) {
$choices = array();
$nothingPrompt = false;
- foreach ( $type as $t )
+ foreach ( $type as $t ) {
if ( $t === '' ) {
$nothingPrompt = 'Can be empty, or ';
} else {
$choices[] = $t;
}
+ }
$desc .= $paramPrefix . $nothingPrompt . $prompt . implode( ', ', $choices );
} else {
switch ( $type ) {
case 'namespace':
// Special handling because namespaces are type-limited, yet they are not given
- $desc .= $paramPrefix . $prompt . implode( ', ', ApiBase::getValidNamespaces() );
+ $desc .= $paramPrefix . $prompt . implode( ', ', MWNamespace::getValidNamespaces() );
break;
case 'limit':
- $desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]} ({$paramSettings[self::PARAM_MAX2]} for bots) allowed.";
+ $desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]}";
+ if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
+ $desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
+ }
+ $desc .= ' allowed';
break;
case 'integer':
$hasMin = isset( $paramSettings[self::PARAM_MIN] );
@@ -344,10 +366,22 @@ abstract class ApiBase {
}
break;
}
+
+ if ( isset( $paramSettings[self::PARAM_ISMULTI] ) ) {
+ $isArray = is_array( $paramSettings[self::PARAM_TYPE] );
+
+ if ( !$isArray
+ || $isArray && count( $paramSettings[self::PARAM_TYPE] ) > self::LIMIT_SML1) {
+ $desc .= $paramPrefix . "Maximum number of values " .
+ self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
+ }
+ }
}
}
- $default = is_array( $paramSettings ) ? ( isset( $paramSettings[self::PARAM_DFLT] ) ? $paramSettings[self::PARAM_DFLT] : null ) : $paramSettings;
+ $default = is_array( $paramSettings )
+ ? ( isset( $paramSettings[self::PARAM_DFLT] ) ? $paramSettings[self::PARAM_DFLT] : null )
+ : $paramSettings;
if ( !is_null( $default ) && $default !== false ) {
$desc .= $paramPrefix . "Default: $default";
}
@@ -480,7 +514,7 @@ abstract class ApiBase {
if ( $params ) { // getFinalParams() can return false
foreach ( $params as $paramName => $paramSettings ) {
- $results[$paramName] = $this->getParameterFromSettings(
+ $results[$paramName] = $this->getParameterFromSettings(
$paramName, $paramSettings, $parseLimit );
}
}
@@ -510,8 +544,8 @@ abstract class ApiBase {
array_shift( $required );
$intersection = array_intersect( array_keys( array_filter( $params,
- create_function( '$x', 'return !is_null($x) && $x !== false;' )
- ) ), $required );
+ array( $this, "parameterNotEmpty" ) ) ), $required );
+
if ( count( $intersection ) > 1 ) {
$this->dieUsage( 'The parameters ' . implode( ', ', $intersection ) . ' can not be used together', 'invalidparammix' );
} elseif ( count( $intersection ) == 0 ) {
@@ -520,24 +554,81 @@ abstract class ApiBase {
}
/**
- * Returns an array of the namespaces (by integer id) that exist on the
- * wiki. Used primarily in help documentation.
- * @return array
+ * Callback function used in requireOnlyOneParameter to check whether reequired parameters are set
+ *
+ * @param $x object Parameter to check is not null/false
+ * @return bool
+ */
+ private function parameterNotEmpty( $x ) {
+ return !is_null( $x ) && $x !== false;
+ }
+
+ /**
+ * @deprecated use MWNamespace::getValidNamespaces()
*/
public static function getValidNamespaces() {
- static $mValidNamespaces = null;
-
- if ( is_null( $mValidNamespaces ) ) {
- global $wgContLang;
- $mValidNamespaces = array();
- foreach ( array_keys( $wgContLang->getNamespaces() ) as $ns ) {
- if ( $ns >= 0 ) {
- $mValidNamespaces[] = $ns;
+ return MWNamespace::getValidNamespaces();
+ }
+
+ /**
+ * Return true if we're to watch the page, false if not, null if no change.
+ * @param $watchlist String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+ * @param $titleObj Title the page under consideration
+ * @param $userOption String The user option to consider when $watchlist=preferences.
+ * If not set will magically default to either watchdefault or watchcreations
+ * @returns Boolean
+ */
+ protected function getWatchlistValue ( $watchlist, $titleObj, $userOption = null ) {
+
+ $userWatching = $titleObj->userIsWatching();
+
+ global $wgUser;
+ switch ( $watchlist ) {
+ case 'watch':
+ return true;
+
+ case 'unwatch':
+ return false;
+
+ case 'preferences':
+ # If the user is already watching, don't bother checking
+ if ( $userWatching ) {
+ return true;
}
- }
+ # If no user option was passed, use watchdefault or watchcreation
+ if ( is_null( $userOption ) ) {
+ $userOption = $titleObj->exists()
+ ? 'watchdefault' : 'watchcreations';
+ }
+ # Watch the article based on the user preference
+ return (bool)$wgUser->getOption( $userOption );
+
+ case 'nochange':
+ return $userWatching;
+
+ default:
+ return $userWatching;
}
+ }
- return $mValidNamespaces;
+ /**
+ * Set a watch (or unwatch) based the based on a watchlist parameter.
+ * @param $watch String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+ * @param $titleObj Title the article's title to change
+ * @param $userOption String The user option to consider when $watch=preferences
+ */
+ protected function setWatch ( $watch, $titleObj, $userOption = null ) {
+ $value = $this->getWatchlistValue( $watch, $titleObj, $userOption );
+ if ( $value === null ) {
+ return;
+ }
+
+ $articleObj = new Article( $titleObj );
+ if ( $value ) {
+ $articleObj->doWatch();
+ } else {
+ $articleObj->doUnwatch();
+ }
}
/**
@@ -559,12 +650,14 @@ abstract class ApiBase {
$type = gettype( $paramSettings );
$dupes = false;
$deprecated = false;
+ $required = false;
} else {
$default = isset( $paramSettings[self::PARAM_DFLT] ) ? $paramSettings[self::PARAM_DFLT] : null;
$multi = isset( $paramSettings[self::PARAM_ISMULTI] ) ? $paramSettings[self::PARAM_ISMULTI] : false;
$type = isset( $paramSettings[self::PARAM_TYPE] ) ? $paramSettings[self::PARAM_TYPE] : null;
$dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] ) ? $paramSettings[self::PARAM_ALLOW_DUPLICATES] : false;
$deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] ) ? $paramSettings[self::PARAM_DEPRECATED] : false;
+ $required = isset( $paramSettings[self::PARAM_REQUIRED] ) ? $paramSettings[self::PARAM_REQUIRED] : false;
// When type is not given, and no choices, the type is the same as $default
if ( !isset( $type ) ) {
@@ -587,7 +680,7 @@ abstract class ApiBase {
$value = $this->getMain()->getRequest()->getVal( $encParamName, $default );
if ( isset( $value ) && $type == 'namespace' ) {
- $type = ApiBase::getValidNamespaces();
+ $type = MWNamespace::getValidNamespaces();
}
}
@@ -602,19 +695,28 @@ abstract class ApiBase {
switch ( $type ) {
case 'NULL': // nothing to do
break;
- case 'string': // nothing to do
+ case 'string':
+ if ( $required && $value === '' ) {
+ $this->dieUsageMsg( array( 'missingparam', $paramName ) );
+ }
+
break;
case 'integer': // Force everything using intval() and optionally validate limits
-
- $value = is_array( $value ) ? array_map( 'intval', $value ) : intval( $value );
$min = isset ( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
$max = isset ( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
+ $enforceLimits = isset ( $paramSettings[self::PARAM_RANGE_ENFORCE] )
+ ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
if ( !is_null( $min ) || !is_null( $max ) ) {
- $values = is_array( $value ) ? $value : array( $value );
- foreach ( $values as &$v ) {
- $this->validateLimit( $paramName, $v, $min, $max );
- }
+ if ( is_array( $value ) ) {
+ $value = array_map( 'intval', $value );
+ foreach ( $value as &$v ) {
+ $this->validateLimit( $paramName, $v, $min, $max, null, $enforceLimits );
+ }
+ } else {
+ $value = intval( $value );
+ $this->validateLimit( $paramName, $value, $min, $max, null, $enforceLimits );
+ }
}
break;
case 'limit':
@@ -631,15 +733,16 @@ abstract class ApiBase {
$min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : 0;
if ( $value == 'max' ) {
$value = $this->getMain()->canApiHighLimits() ? $paramSettings[self::PARAM_MAX2] : $paramSettings[self::PARAM_MAX];
- $this->getResult()->addValue( 'limits', $this->getModuleName(), $value );
+ $this->getResult()->setParsedLimit( $this->getModuleName(), $value );
} else {
$value = intval( $value );
$this->validateLimit( $paramName, $value, $min, $paramSettings[self::PARAM_MAX], $paramSettings[self::PARAM_MAX2] );
}
break;
case 'boolean':
- if ( $multi )
+ if ( $multi ) {
ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" );
+ }
break;
case 'timestamp':
if ( $multi ) {
@@ -652,11 +755,21 @@ abstract class ApiBase {
$value = wfTimestamp( TS_MW, $value );
break;
case 'user':
- $title = Title::makeTitleSafe( NS_USER, $value );
- if ( is_null( $title ) ) {
- $this->dieUsage( "Invalid value for user parameter $encParamName", "baduser_{$encParamName}" );
+ if ( !is_array( $value ) ) {
+ $value = array( $value );
+ }
+
+ foreach ( $value as $key => $val ) {
+ $title = Title::makeTitleSafe( NS_USER, $val );
+ if ( is_null( $title ) ) {
+ $this->dieUsage( "Invalid value for user parameter $encParamName", "baduser_{$encParamName}" );
+ }
+ $value[$key] = $title->getText();
+ }
+
+ if ( !$multi ) {
+ $value = $value[0];
}
- $value = $title->getText();
break;
default:
ApiBase::dieDebug( __METHOD__, "Param $encParamName's type is unknown - $type" );
@@ -672,6 +785,8 @@ abstract class ApiBase {
if ( $deprecated && $value !== false ) {
$this->setWarning( "The $encParamName parameter has been deprecated." );
}
+ } else if ( $required ) {
+ $this->dieUsageMsg( array( 'missingparam', $paramName ) );
}
return $value;
@@ -736,10 +851,13 @@ abstract class ApiBase {
* @param $min int Minimum value
* @param $max int Maximum value for users
* @param $botMax int Maximum value for sysops/bots
+ * @param $enforceLimits Boolean Whether to enforce (die) if value is outside limits
*/
- function validateLimit( $paramName, &$value, $min, $max, $botMax = null ) {
+ function validateLimit( $paramName, &$value, $min, $max, $botMax = null, $enforceLimits = false ) {
if ( !is_null( $min ) && $value < $min ) {
- $this->setWarning( $this->encodeParamName( $paramName ) . " may not be less than $min (set to $value)" );
+
+ $msg = $this->encodeParamName( $paramName ) . " may not be less than $min (set to $value)";
+ $this->warnOrDie( $msg, $enforceLimits );
$value = $min;
}
@@ -753,17 +871,33 @@ abstract class ApiBase {
if ( !is_null( $max ) && $value > $max ) {
if ( !is_null( $botMax ) && $this->getMain()->canApiHighLimits() ) {
if ( $value > $botMax ) {
- $this->setWarning( $this->encodeParamName( $paramName ) . " may not be over $botMax (set to $value) for bots or sysops" );
+ $msg = $this->encodeParamName( $paramName ) . " may not be over $botMax (set to $value) for bots or sysops";
+ $this->warnOrDie( $msg, $enforceLimits );
$value = $botMax;
}
} else {
- $this->setWarning( $this->encodeParamName( $paramName ) . " may not be over $max (set to $value) for users" );
+ $msg = $this->encodeParamName( $paramName ) . " may not be over $max (set to $value) for users";
+ $this->warnOrDie( $msg, $enforceLimits );
$value = $max;
}
}
}
/**
+ * Adds a warning to the output, else dies
+ *
+ * @param $msg String Message to show as a warning, or error message if dying
+ * @param $enforceLimits Boolean Whether this is an enforce (die)
+ */
+ private function warnOrDie( $msg, $enforceLimits = false ) {
+ if ( $enforceLimits ) {
+ $this->dieUsage( $msg, 'integeroutofrange' );
+ } else {
+ $this->setWarning( $msg );
+ }
+ }
+
+ /**
* Truncate an array to a certain length.
* @param $arr array Array to truncate
* @param $limit int Maximum length
@@ -772,7 +906,7 @@ abstract class ApiBase {
public static function truncateArray( &$arr, $limit ) {
$modified = false;
while ( count( $arr ) > $limit ) {
- $junk = array_pop( $arr );
+ array_pop( $arr );
$modified = true;
}
return $modified;
@@ -848,6 +982,8 @@ abstract class ApiBase {
'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address ``\$1'' was blocked as part of range ``\$2''. You can't unblock the IP invidually, but you can unblock the range as a whole." ),
'ipb_cant_unblock' => array( 'code' => 'cantunblock', 'info' => "The block you specified was not found. It may have been unblocked already" ),
'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed e-mail address, or you are not allowed to send e-mail to other users, so you cannot send e-mail" ),
+ 'ipbblocked' => array( 'code' => 'ipbblocked', 'info' => 'You cannot block or unblock users while you are yourself blocked' ),
+ 'ipbnounblockself' => array( 'code' => 'ipbnounblockself', 'info' => 'You are not allowed to unblock yourself' ),
'usermaildisabled' => array( 'code' => 'usermaildisabled', 'info' => "User email has been disabled" ),
'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending e-mail" ),
'notarget' => array( 'code' => 'notarget', 'info' => "You have not specified a valid target for this action" ),
@@ -860,6 +996,7 @@ abstract class ApiBase {
'userrights-nodatabase' => array( 'code' => 'nosuchdatabase', 'info' => "Database ``\$1'' does not exist or is not local" ),
'nouserspecified' => array( 'code' => 'invaliduser', 'info' => "Invalid username ``\$1''" ),
'noname' => array( 'code' => 'invaliduser', 'info' => "Invalid username ``\$1''" ),
+ 'summaryrequired' => array( 'code' => 'summaryrequired', 'info' => 'Summary required' ),
// API-specific messages
'readrequired' => array( 'code' => 'readapidenied', 'info' => "You need read permission to use this module" ),
@@ -886,7 +1023,6 @@ abstract class ApiBase {
'createonly-exists' => array( 'code' => 'articleexists', 'info' => "The article you tried to create has been created already" ),
'nocreate-missing' => array( 'code' => 'missingtitle', 'info' => "The article you tried to edit doesn't exist" ),
'nosuchrcid' => array( 'code' => 'nosuchrcid', 'info' => "There is no change with rcid ``\$1''" ),
- 'cantpurge' => array( 'code' => 'cantpurge', 'info' => "Only users with the 'purge' right can purge pages via the API" ),
'protect-invalidaction' => array( 'code' => 'protect-invalidaction', 'info' => "Invalid protection type ``\$1''" ),
'protect-invalidlevel' => array( 'code' => 'protect-invalidlevel', 'info' => "Invalid protection level ``\$1''" ),
'toofewexpiries' => array( 'code' => 'toofewexpiries', 'info' => "\$1 expiry timestamps were provided where \$2 were needed" ),
@@ -927,6 +1063,7 @@ abstract class ApiBase {
'invalid-session-key' => array( 'code' => 'invalid-session-key', 'info' => 'Not a valid session key' ),
'nouploadmodule' => array( 'code' => 'nouploadmodule', 'info' => 'No upload module set' ),
'uploaddisabled' => array( 'code' => 'uploaddisabled', 'info' => 'Uploads are not enabled. Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true' ),
+ 'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
);
/**
@@ -1022,12 +1159,46 @@ abstract class ApiBase {
}
/**
+ * Gets the user for whom to get the watchlist
+ *
+ * @returns User
+ */
+ public function getWatchlistUser( $params ) {
+ global $wgUser;
+ if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
+ $user = User::newFromName( $params['owner'], false );
+ if ( !$user->getId() ) {
+ $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
+ }
+ $token = $user->getOption( 'watchlisttoken' );
+ if ( $token == '' || $token != $params['token'] ) {
+ $this->dieUsage( 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences', 'bad_wltoken' );
+ }
+ } else {
+ if ( !$wgUser->isLoggedIn() ) {
+ $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
+ }
+ $user = $wgUser;
+ }
+ return $user;
+ }
+
+ /**
* Returns a list of all possible errors returned by the module
* @return array in the format of array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
*/
public function getPossibleErrors() {
$ret = array();
+ $params = $this->getFinalParams();
+ if ( $params ) {
+ foreach ( $params as $paramName => $paramSettings ) {
+ if ( isset( $paramSettings[ApiBase::PARAM_REQUIRED] ) ) {
+ $ret[] = array( 'missingparam', $paramName );
+ }
+ }
+ }
+
if ( $this->mustBePosted() ) {
$ret[] = array( 'mustbeposted', $this->getModuleName() );
}
@@ -1192,6 +1363,6 @@ abstract class ApiBase {
* @return string
*/
public static function getBaseVersion() {
- return __CLASS__ . ': $Id: ApiBase.php 79562 2011-01-04 06:15:54Z tstarling $';
+ return __CLASS__ . ': $Id: ApiBase.php 82730 2011-02-24 16:03:05Z reedy $';
}
}
diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php
index 23de07d6..875b8aeb 100644
--- a/includes/api/ApiBlock.php
+++ b/includes/api/ApiBlock.php
@@ -1,9 +1,9 @@
<?php
-
/**
- * Created on Sep 4, 2007
* API for MediaWiki 1.8+
*
+ * Created on Sep 4, 2007
+ *
* Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* This program is free software; you can redistribute it and/or modify
@@ -18,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -58,12 +60,16 @@ class ApiBlock extends ApiBase {
return;
}
- if ( is_null( $params['user'] ) ) {
- $this->dieUsageMsg( array( 'missingparam', 'user' ) );
- }
if ( !$wgUser->isAllowed( 'block' ) ) {
$this->dieUsageMsg( array( 'cantblock' ) );
}
+ # bug 15810: blocked admins should have limited access here
+ if ( $wgUser->isBlocked() ) {
+ $status = IPBlockForm::checkUnblockSelf( $params['user'] );
+ if ( $status !== true ) {
+ $this->dieUsageMsg( array( $status ) );
+ }
+ }
if ( $params['hidename'] && !$wgUser->isAllowed( 'hideuser' ) ) {
$this->dieUsageMsg( array( 'canthide' ) );
}
@@ -128,7 +134,10 @@ class ApiBlock extends ApiBase {
public function getAllowedParams() {
return array(
- 'user' => null,
+ 'user' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'token' => null,
'gettoken' => false,
'expiry' => 'never',
@@ -161,20 +170,19 @@ class ApiBlock extends ApiBase {
}
public function getDescription() {
- return array(
- 'Block a user.'
- );
+ return 'Block a user';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'user' ),
array( 'cantblock' ),
array( 'canthide' ),
array( 'cantblock-email' ),
+ array( 'ipbblocked' ),
+ array( 'ipbnounblockself' ),
) );
}
-
+
public function needsToken() {
return true;
}
@@ -186,11 +194,11 @@ class ApiBlock extends ApiBase {
protected function getExamples() {
return array(
'api.php?action=block&user=123.5.5.12&expiry=3%20days&reason=First%20strike',
- 'api.php?action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate&autoblock&noemail'
+ 'api.php?action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail='
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiBlock.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiBlock.php 77192 2010-11-23 22:05:27Z btongminh $';
}
}
diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php
index c4550a96..fbf62391 100644
--- a/includes/api/ApiDelete.php
+++ b/includes/api/ApiDelete.php
@@ -1,9 +1,9 @@
<?php
-
/**
- * Created on Jun 30, 2007
* API for MediaWiki 1.8+
*
+ * Created on Jun 30, 2007
+ *
* Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* This program is free software; you can redistribute it and/or modify
@@ -18,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -28,7 +30,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
/**
- * API module that facilitates deleting pages. The API eqivalent of action=delete.
+ * API module that facilitates deleting pages. The API equivalent of action=delete.
* Requires API write mode to be enabled.
*
* @ingroup API
@@ -47,8 +49,6 @@ class ApiDelete extends ApiBase {
* result object.
*/
public function execute() {
- global $wgUser;
-
$params = $this->extractRequestParams();
$this->requireOnlyOneParameter( $params, 'title', 'pageid' );
@@ -82,17 +82,26 @@ class ApiDelete extends ApiBase {
$this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them
}
- if ( $params['watch'] || $wgUser->getOption( 'watchdeletion' ) ) {
- $articleObj->doWatch();
+ // Deprecated parameters
+ if ( $params['watch'] ) {
+ $watch = 'watch';
} elseif ( $params['unwatch'] ) {
- $articleObj->doUnwatch();
+ $watch = 'unwatch';
+ } else {
+ $watch = $params['watchlist'];
}
+ $this->setWatch( $watch, $titleObj, 'watchdeletion' );
}
$r = array( 'title' => $titleObj->getPrefixedText(), 'reason' => $reason );
$this->getResult()->addValue( null, $this->getModuleName(), $r );
}
+ /**
+ *
+ * @param &$title Title
+ * @param $token String
+ */
private static function getPermissionsError( &$title, $token ) {
global $wgUser;
@@ -108,9 +117,9 @@ class ApiDelete extends ApiBase {
/**
* We have our own delete() function, since Article.php's implementation is split in two phases
*
- * @param Article $article - Article object to work on
- * @param string $token - Delete token (same as edit token)
- * @param string $reason - Reason for the deletion. Autogenerated if NULL
+ * @param $article Article object to work on
+ * @param $token String: delete token (same as edit token)
+ * @param $reason String: reason for the deletion. Autogenerated if NULL
* @return Title::getUserPermissionsErrors()-like array
*/
public static function delete( &$article, $token, &$reason = null ) {
@@ -137,8 +146,8 @@ class ApiDelete extends ApiBase {
}
$error = '';
- if ( !wfRunHooks( 'ArticleDelete', array( &$article, &$wgUser, &$reason, $error ) ) ) {
- $this->dieUsageMsg( array( 'hookaborted', $error ) );
+ if ( !wfRunHooks( 'ArticleDelete', array( &$article, &$wgUser, &$reason, &$error ) ) ) {
+ return array( array( 'hookaborted', $error ) );
}
// Luckily, Article.php provides a reusable delete function that does the hard work for us
@@ -149,6 +158,15 @@ class ApiDelete extends ApiBase {
return array( array( 'cannotdelete', $article->mTitle->getPrefixedText() ) );
}
+ /**
+ * @static
+ * @param $token
+ * @param $title
+ * @param $oldimage
+ * @param $reason
+ * @param $suppress bool
+ * @return \type|array|Title
+ */
public static function deleteFile( $token, &$title, $oldimage, &$reason = null, $suppress = false ) {
$errors = self::getPermissionsError( $title, $token );
if ( count( $errors ) ) {
@@ -197,28 +215,43 @@ class ApiDelete extends ApiBase {
),
'token' => null,
'reason' => null,
- 'watch' => false,
- 'unwatch' => false,
- 'oldimage' => null
+ 'watch' => array(
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
+ ),
+ 'watchlist' => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
+ 'watch',
+ 'unwatch',
+ 'preferences',
+ 'nochange'
+ ),
+ ),
+ 'unwatch' => array(
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
+ ),
+ 'oldimage' => null,
);
}
public function getParamDescription() {
+ $p = $this->getModulePrefix();
return array(
- 'title' => 'Title of the page you want to delete. Cannot be used together with pageid',
- 'pageid' => 'Page ID of the page you want to delete. Cannot be used together with title',
+ 'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
+ 'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
'token' => 'A delete token previously retrieved through prop=info',
- 'reason' => 'Reason for the deletion. If not set, an automatically generated reason will be used.',
+ 'reason' => 'Reason for the deletion. If not set, an automatically generated reason will be used',
'watch' => 'Add the page to your watchlist',
+ 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
'unwatch' => 'Remove the page from your watchlist',
'oldimage' => 'The name of the old image to delete as provided by iiprop=archivename'
);
}
public function getDescription() {
- return array(
- 'Delete a page.'
- );
+ return 'Delete a page';
}
public function getPossibleErrors() {
@@ -246,6 +279,6 @@ class ApiDelete extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiDelete.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiDelete.php 77141 2010-11-23 10:04:38Z ialex $';
}
} \ No newline at end of file
diff --git a/includes/api/ApiDisabled.php b/includes/api/ApiDisabled.php
index 60e0e7ee..f83bfdc9 100644
--- a/includes/api/ApiDisabled.php
+++ b/includes/api/ApiDisabled.php
@@ -1,9 +1,9 @@
<?php
-
/**
- * Created on Sep 25, 2008
* API for MediaWiki 1.8+
*
+ * Created on Sep 25, 2008
+ *
* Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* This program is free software; you can redistribute it and/or modify
@@ -18,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -60,9 +62,7 @@ class ApiDisabled extends ApiBase {
}
public function getDescription() {
- return array(
- 'This module has been disabled.'
- );
+ return 'This module has been disabled';
}
protected function getExamples() {
@@ -70,6 +70,6 @@ class ApiDisabled extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiDisabled.php 62783 2010-02-21 18:09:00Z ashley $';
+ return __CLASS__ . ': $Id: ApiDisabled.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index e78f66bc..75cc0ba2 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on August 16, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Iker Labarga <Firstname><Lastname>@gmail.com
+ * Created on August 16, 2007
+ *
+ * Copyright © 2007 Iker Labarga <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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ // Eclipse helper - will be ignored in production
+ require_once( "ApiBase.php" );
}
/**
@@ -38,40 +39,71 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiEditPage extends ApiBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName );
+ parent::__construct( $query, $moduleName );
}
public function execute() {
global $wgUser;
$params = $this->extractRequestParams();
-
- if ( is_null( $params['title'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'title' ) );
if ( is_null( $params['text'] ) && is_null( $params['appendtext'] ) &&
is_null( $params['prependtext'] ) &&
$params['undo'] == 0 )
+ {
$this->dieUsageMsg( array( 'missingtext' ) );
+ }
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj || $titleObj->isExternal() )
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-
+ }
+
+ if( $params['redirect'] ) {
+ if( $titleObj->isRedirect() ) {
+ $oldTitle = $titleObj;
+
+ $titles = Title::newFromRedirectArray( Revision::newFromTitle( $oldTitle )->getText( Revision::FOR_THIS_USER ) );
+
+ $redirValues = array();
+ foreach ( $titles as $id => $newTitle ) {
+
+ if( !isset( $titles[ $id - 1 ] ) ) {
+ $titles[ $id - 1 ] = $oldTitle;
+ }
+
+ $redirValues[] = array(
+ 'from' => $titles[ $id - 1 ]->getPrefixedText(),
+ 'to' => $newTitle->getPrefixedText()
+ );
+
+ $titleObj = $newTitle;
+ }
+
+ $this->getResult()->setIndexedTagName( $redirValues, 'r' );
+ $this->getResult()->addValue( null, 'redirects', $redirValues );
+
+ }
+ }
+
// Some functions depend on $wgTitle == $ep->mTitle
global $wgTitle;
$wgTitle = $titleObj;
- if ( $params['createonly'] && $titleObj->exists() )
+ if ( $params['createonly'] && $titleObj->exists() ) {
$this->dieUsageMsg( array( 'createonly-exists' ) );
- if ( $params['nocreate'] && !$titleObj->exists() )
+ }
+ if ( $params['nocreate'] && !$titleObj->exists() ) {
$this->dieUsageMsg( array( 'nocreate-missing' ) );
+ }
// Now let's check whether we're even allowed to do this
$errors = $titleObj->getUserPermissionsErrors( 'edit', $wgUser );
- if ( !$titleObj->exists() )
+ if ( !$titleObj->exists() ) {
$errors = array_merge( $errors, $titleObj->getUserPermissionsErrors( 'create', $wgUser ) );
- if ( count( $errors ) )
+ }
+ if ( count( $errors ) ) {
$this->dieUsageMsg( $errors[0] );
+ }
$articleObj = new Article( $titleObj );
$toMD5 = $params['text'];
@@ -81,127 +113,126 @@ class ApiEditPage extends ApiBase {
// returns an interface message rather than ''
// We do want getContent()'s behavior for non-existent
// MediaWiki: pages, though
- if ( $articleObj->getID() == 0 && $titleObj->getNamespace() != NS_MEDIAWIKI )
+ if ( $articleObj->getID() == 0 && $titleObj->getNamespace() != NS_MEDIAWIKI ) {
$content = '';
- else
+ } else {
$content = $articleObj->getContent();
-
- if ( !is_null( $params['section'] ) )
- {
+ }
+
+ if ( !is_null( $params['section'] ) ) {
// Process the content for section edits
global $wgParser;
$section = intval( $params['section'] );
$content = $wgParser->getSection( $content, $section, false );
- if ( $content === false )
+ if ( $content === false ) {
$this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+ }
}
$params['text'] = $params['prependtext'] . $content . $params['appendtext'];
$toMD5 = $params['prependtext'] . $params['appendtext'];
}
-
- if ( $params['undo'] > 0 )
- {
- if ( $params['undoafter'] > 0 )
- {
- if ( $params['undo'] < $params['undoafter'] )
+
+ if ( $params['undo'] > 0 ) {
+ if ( $params['undoafter'] > 0 ) {
+ if ( $params['undo'] < $params['undoafter'] ) {
list( $params['undo'], $params['undoafter'] ) =
array( $params['undoafter'], $params['undo'] );
+ }
$undoafterRev = Revision::newFromID( $params['undoafter'] );
}
$undoRev = Revision::newFromID( $params['undo'] );
- if ( is_null( $undoRev ) || $undoRev->isDeleted( Revision::DELETED_TEXT ) )
+ if ( is_null( $undoRev ) || $undoRev->isDeleted( Revision::DELETED_TEXT ) ) {
$this->dieUsageMsg( array( 'nosuchrevid', $params['undo'] ) );
+ }
- if ( $params['undoafter'] == 0 )
+ if ( $params['undoafter'] == 0 ) {
$undoafterRev = $undoRev->getPrevious();
- if ( is_null( $undoafterRev ) || $undoafterRev->isDeleted( Revision::DELETED_TEXT ) )
+ }
+ if ( is_null( $undoafterRev ) || $undoafterRev->isDeleted( Revision::DELETED_TEXT ) ) {
$this->dieUsageMsg( array( 'nosuchrevid', $params['undoafter'] ) );
+ }
- if ( $undoRev->getPage() != $articleObj->getID() )
+ if ( $undoRev->getPage() != $articleObj->getID() ) {
$this->dieUsageMsg( array( 'revwrongpage', $undoRev->getID(), $titleObj->getPrefixedText() ) );
- if ( $undoafterRev->getPage() != $articleObj->getID() )
+ }
+ if ( $undoafterRev->getPage() != $articleObj->getID() ) {
$this->dieUsageMsg( array( 'revwrongpage', $undoafterRev->getID(), $titleObj->getPrefixedText() ) );
-
+ }
+
$newtext = $articleObj->getUndoText( $undoRev, $undoafterRev );
- if ( $newtext === false )
+ if ( $newtext === false ) {
$this->dieUsageMsg( array( 'undo-failure' ) );
+ }
$params['text'] = $newtext;
// If no summary was given and we only undid one rev,
// use an autosummary
- if ( is_null( $params['summary'] ) && $titleObj->getNextRevisionID( $undoafterRev->getID() ) == $params['undo'] )
+ if ( is_null( $params['summary'] ) && $titleObj->getNextRevisionID( $undoafterRev->getID() ) == $params['undo'] ) {
$params['summary'] = wfMsgForContent( 'undo-summary', $params['undo'], $undoRev->getUserText() );
+ }
}
// See if the MD5 hash checks out
- if ( !is_null( $params['md5'] ) && md5( $toMD5 ) !== $params['md5'] )
+ if ( !is_null( $params['md5'] ) && md5( $toMD5 ) !== $params['md5'] ) {
$this->dieUsageMsg( array( 'hashcheckfailed' ) );
-
+ }
+
$ep = new EditPage( $articleObj );
// EditPage wants to parse its stuff from a WebRequest
// That interface kind of sucks, but it's workable
- $reqArr = array( 'wpTextbox1' => $params['text'],
- 'wpEditToken' => $params['token'],
- 'wpIgnoreBlankSummary' => ''
+ $reqArr = array(
+ 'wpTextbox1' => $params['text'],
+ 'wpEditToken' => $params['token'],
+ 'wpIgnoreBlankSummary' => ''
);
- if ( !is_null( $params['summary'] ) )
+ if ( !is_null( $params['summary'] ) ) {
$reqArr['wpSummary'] = $params['summary'];
+ }
// Watch out for basetimestamp == ''
// wfTimestamp() treats it as NOW, almost certainly causing an edit conflict
- if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' )
+ if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' ) {
$reqArr['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
- else
+ } else {
$reqArr['wpEdittime'] = $articleObj->getTimestamp();
+ }
- if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' )
+ if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
$reqArr['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
- else
- $reqArr['wpStarttime'] = $reqArr['wpEdittime']; // Fake wpStartime
+ } else {
+ $reqArr['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
+ }
- if ( $params['minor'] || ( !$params['notminor'] && $wgUser->getOption( 'minordefault' ) ) )
+ if ( $params['minor'] || ( !$params['notminor'] && $wgUser->getOption( 'minordefault' ) ) ) {
$reqArr['wpMinoredit'] = '';
+ }
- if ( $params['recreate'] )
+ if ( $params['recreate'] ) {
$reqArr['wpRecreate'] = '';
+ }
- if ( !is_null( $params['section'] ) )
- {
+ if ( !is_null( $params['section'] ) ) {
$section = intval( $params['section'] );
- if ( $section == 0 && $params['section'] != '0' && $params['section'] != 'new' )
+ if ( $section == 0 && $params['section'] != '0' && $params['section'] != 'new' ) {
$this->dieUsage( "The section parameter must be set to an integer or 'new'", "invalidsection" );
+ }
$reqArr['wpSection'] = $params['section'];
- }
- else
+ } else {
$reqArr['wpSection'] = '';
-
- // Handle watchlist settings
- switch ( $params['watchlist'] )
- {
- case 'watch':
- $watch = true;
- break;
- case 'unwatch':
- $watch = false;
- break;
- case 'preferences':
- if ( $titleObj->exists() )
- $watch = $wgUser->getOption( 'watchdefault' ) || $titleObj->userIsWatching();
- else
- $watch = $wgUser->getOption( 'watchcreations' );
- break;
- case 'nochange':
- default:
- $watch = $titleObj->userIsWatching();
}
+
+ $watch = $this->getWatchlistValue( $params['watchlist'], $titleObj );
+
// Deprecated parameters
- if ( $params['watch'] )
+ if ( $params['watch'] ) {
$watch = true;
- elseif ( $params['unwatch'] )
+ } elseif ( $params['unwatch'] ) {
$watch = false;
-
- if ( $watch )
+ }
+
+ if ( $watch ) {
$reqArr['wpWatchthis'] = '';
+ }
$req = new FauxRequest( $reqArr, true );
$ep->importFormData( $req );
@@ -209,22 +240,22 @@ class ApiEditPage extends ApiBase {
// Run hooks
// Handle CAPTCHA parameters
global $wgRequest;
- if ( !is_null( $params['captchaid'] ) )
+ if ( !is_null( $params['captchaid'] ) ) {
$wgRequest->setVal( 'wpCaptchaId', $params['captchaid'] );
- if ( !is_null( $params['captchaword'] ) )
+ }
+ if ( !is_null( $params['captchaword'] ) ) {
$wgRequest->setVal( 'wpCaptchaWord', $params['captchaword'] );
+ }
$r = array();
- if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $ep->textbox1, &$r ) ) )
- {
- if ( count( $r ) )
- {
- $r['result'] = "Failure";
+ if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $ep->textbox1, &$r ) ) ) {
+ if ( count( $r ) ) {
+ $r['result'] = 'Failure';
$this->getResult()->addValue( null, $this->getModuleName(), $r );
return;
- }
- else
+ } else {
$this->dieUsageMsg( array( 'hookaborted' ) );
+ }
}
// Do the actual save
@@ -237,8 +268,9 @@ class ApiEditPage extends ApiBase {
$retval = $ep->internalAttemptSave( $result, $wgUser->isAllowed( 'bot' ) && $params['bot'] );
$wgRequest = $oldRequest;
- switch( $retval )
- {
+ global $wgMaxArticleSize;
+
+ switch( $retval ) {
case EditPage::AS_HOOK_ERROR:
case EditPage::AS_HOOK_ERROR_EXPECTED:
$this->dieUsageMsg( array( 'hookaborted' ) );
@@ -260,7 +292,6 @@ class ApiEditPage extends ApiBase {
case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
case EditPage::AS_CONTENT_TOO_BIG:
- global $wgMaxArticleSize;
$this->dieUsageMsg( array( 'contenttoobig', $wgMaxArticleSize ) );
case EditPage::AS_READ_ONLY_PAGE_ANON:
@@ -293,8 +324,9 @@ class ApiEditPage extends ApiBase {
case EditPage::AS_SUCCESS_NEW_ARTICLE:
$r['new'] = '';
+
case EditPage::AS_SUCCESS_UPDATE:
- $r['result'] = "Success";
+ $r['result'] = 'Success';
$r['pageid'] = intval( $titleObj->getArticleID() );
$r['title'] = $titleObj->getPrefixedText();
// HACK: We create a new Article object here because getRevIdFetched()
@@ -303,10 +335,9 @@ class ApiEditPage extends ApiBase {
// don't want to do.
$newArticle = new Article( $titleObj );
$newRevId = $newArticle->getRevIdFetched();
- if ( $newRevId == $oldRevId )
+ if ( $newRevId == $oldRevId ) {
$r['nochange'] = '';
- else
- {
+ } else {
$r['oldrevid'] = intval( $oldRevId );
$r['newrevid'] = intval( $newRevId );
$r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
@@ -314,12 +345,15 @@ class ApiEditPage extends ApiBase {
}
break;
+ case EditPage::AS_SUMMARY_NEEDED:
+ $this->dieUsageMsg( array( 'summaryrequired' ) );
+
case EditPage::AS_END:
// This usually means some kind of race condition
- // or DB weirdness occurred. Fall through to throw an unknown
+ // or DB weirdness occurred. Fall through to throw an unknown
// error.
- // This needs fixing higher up, as Article::doEdit should be
+ // This needs fixing higher up, as Article::doEdit should be
// used rather than Article::updateArticle, so that specific
// error conditions can be returned
default:
@@ -339,12 +373,11 @@ class ApiEditPage extends ApiBase {
protected function getDescription() {
return 'Create and edit pages.';
}
-
+
public function getPossibleErrors() {
global $wgMaxArticleSize;
-
+
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'title' ),
array( 'missingtext' ),
array( 'invalidtitle', 'title' ),
array( 'createonly-exists' ),
@@ -358,6 +391,7 @@ class ApiEditPage extends ApiBase {
array( 'noimageredirect-anon' ),
array( 'noimageredirect-logged' ),
array( 'spamdetected', 'spam' ),
+ array( 'summaryrequired' ),
array( 'filtered' ),
array( 'blockedtext' ),
array( 'contenttoobig', $wgMaxArticleSize ),
@@ -376,8 +410,11 @@ class ApiEditPage extends ApiBase {
}
protected function getAllowedParams() {
- return array (
- 'title' => null,
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'section' => null,
'text' => null,
'token' => null,
@@ -393,16 +430,16 @@ class ApiEditPage extends ApiBase {
'captchaword' => null,
'captchaid' => null,
'watch' => array(
- ApiBase :: PARAM_DFLT => false,
- ApiBase :: PARAM_DEPRECATED => true,
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
),
'unwatch' => array(
- ApiBase :: PARAM_DFLT => false,
- ApiBase :: PARAM_DEPRECATED => true,
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
),
'watchlist' => array(
- ApiBase :: PARAM_DFLT => 'preferences',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
'watch',
'unwatch',
'preferences',
@@ -413,16 +450,21 @@ class ApiEditPage extends ApiBase {
'prependtext' => null,
'appendtext' => null,
'undo' => array(
- ApiBase :: PARAM_TYPE => 'integer'
+ ApiBase::PARAM_TYPE => 'integer'
),
'undoafter' => array(
- ApiBase :: PARAM_TYPE => 'integer'
+ ApiBase::PARAM_TYPE => 'integer'
+ ),
+ 'redirect' => array(
+ ApiBase::PARAM_TYPE => 'boolean',
+ ApiBase::PARAM_DFLT => false,
),
);
}
protected function getParamDescription() {
- return array (
+ $p = $this->getModulePrefix();
+ return array(
'title' => 'Page title',
'section' => 'Section number. 0 for the top section, \'new\' for a new section',
'text' => 'Page content',
@@ -435,7 +477,7 @@ class ApiEditPage extends ApiBase {
'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.'
+ 'Used to detect edit conflicts; leave unset to ignore conflicts'
),
'recreate' => 'Override any errors about the article having been deleted in the meantime',
'createonly' => 'Don\'t edit the page if it exists already',
@@ -445,15 +487,16 @@ class ApiEditPage extends ApiBase {
'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
'captchaid' => 'CAPTCHA ID from previous request',
'captchaword' => 'Answer to the CAPTCHA',
- 'md5' => array( 'The MD5 hash of the text parameter, or the prependtext and appendtext parameters concatenated.',
+ '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 text.',
- 'appendtext' => 'Add this text to the end of the page. Overrides text',
- 'undo' => 'Undo this revision. Overrides text, prependtext and appendtext',
+ '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",
+ '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',
);
}
-
+
public function needsToken() {
return true;
}
@@ -463,17 +506,17 @@ class ApiEditPage extends ApiBase {
}
protected function getExamples() {
- return array (
- "Edit a page (anonymous user):",
- " api.php?action=edit&title=Test&summary=test%20summary&text=article%20content&basetimestamp=20070824123454&token=%2B\\",
- "Prepend __NOTOC__ to a page (anonymous user):",
- " api.php?action=edit&title=Test&summary=NOTOC&minor&prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\",
- "Undo r13579 through r13585 with autosummary(anonymous user):",
- " api.php?action=edit&title=Test&undo=13585&undoafter=13579&basetimestamp=20070824123454&token=%2B\\",
+ return array(
+ 'Edit a page (anonymous user):',
+ ' api.php?action=edit&title=Test&summary=test%20summary&text=article%20content&basetimestamp=20070824123454&token=%2B\\',
+ 'Prepend __NOTOC__ to a page (anonymous user):',
+ ' api.php?action=edit&title=Test&summary=NOTOC&minor=&prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\',
+ 'Undo r13579 through r13585 with autosummary (anonymous user):',
+ ' api.php?action=edit&title=Test&undo=13585&undoafter=13579&basetimestamp=20070824123454&token=%2B\\',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiEditPage.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiEditPage.php 90492 2011-06-20 22:39:10Z reedy $';
}
}
diff --git a/includes/api/ApiEmailUser.php b/includes/api/ApiEmailUser.php
index 66f2dff5..ab58eb18 100644
--- a/includes/api/ApiEmailUser.php
+++ b/includes/api/ApiEmailUser.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on June 1, 2008
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
+ * Created on June 1, 2008
+ *
+ * Copyright © 2008 Bryan Tong Minh <Bryan.TongMinh@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
@@ -18,58 +18,74 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
+ * API Module to facilitate sending of emails to users
* @ingroup API
*/
class ApiEmailUser extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
global $wgUser;
- // Check whether email is enabled
- if ( !EmailUserForm::userEmailEnabled() )
- $this->dieUsageMsg( array( 'usermaildisabled' ) );
$params = $this->extractRequestParams();
- // Check required parameters
- if ( !isset( $params['target'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'target' ) );
- if ( !isset( $params['text'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'text' ) );
-
- // Validate target
- $targetUser = EmailUserForm::validateEmailTarget( $params['target'] );
- if ( !( $targetUser instanceof User ) )
+
+ // Validate target
+ $targetUser = SpecialEmailUser::getTarget( $params['target'] );
+ if ( !( $targetUser instanceof User ) ) {
$this->dieUsageMsg( array( $targetUser ) );
-
- // Check permissions
- $error = EmailUserForm::getPermissionsError( $wgUser, $params['token'] );
- if ( $error )
+ }
+
+ // Check permissions and errors
+ $error = SpecialEmailUser::getPermissionsError( $wgUser, $params['token'] );
+ if ( $error ) {
$this->dieUsageMsg( array( $error ) );
+ }
+
+ $data = array(
+ 'Target' => $targetUser->getName(),
+ 'Text' => $params['text'],
+ 'Subject' => $params['subject'],
+ 'CCMe' => $params['ccme'],
+ );
+ $retval = SpecialEmailUser::submit( $data );
- $form = new EmailUserForm( $targetUser, $params['text'], $params['subject'], $params['ccme'] );
- $retval = $form->doSubmit();
- if ( is_null( $retval ) )
+ if ( $retval instanceof Status ) {
+ // SpecialEmailUser sometimes returns a status
+ // sometimes it doesn't.
+ if ( $retval->isGood() ) {
+ $retval = true;
+ } else {
+ $retval = $retval->getErrorsArray();
+ }
+ }
+
+ if ( $retval === true ) {
$result = array( 'result' => 'Success' );
- else
- $result = array( 'result' => 'Failure',
- 'message' => $retval->getMessage() );
-
+ } else {
+ $result = array(
+ 'result' => 'Failure',
+ 'message' => $retval
+ );
+ }
+
$this->getResult()->addValue( null, $this->getModuleName(), $result );
}
-
+
public function mustBePosted() {
return true;
}
@@ -79,17 +95,23 @@ class ApiEmailUser extends ApiBase {
}
public function getAllowedParams() {
- return array (
- 'target' => null,
+ return array(
+ 'target' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'subject' => null,
- 'text' => null,
+ 'text' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'token' => null,
'ccme' => false,
);
}
public function getParamDescription() {
- return array (
+ return array(
'target' => 'User to send email to',
'subject' => 'Subject header',
'text' => 'Mail body',
@@ -99,19 +121,15 @@ class ApiEmailUser extends ApiBase {
}
public function getDescription() {
- return array(
- 'Email a user.'
- );
+ return 'Email a user.';
}
-
- public function getPossibleErrors() {
+
+ public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'usermaildisabled' ),
- array( 'missingparam', 'target' ),
- array( 'missingparam', 'text' ),
- ) );
+ ) );
}
-
+
public function needsToken() {
return true;
}
@@ -121,13 +139,12 @@ class ApiEmailUser extends ApiBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=emailuser&target=WikiSysop&text=Content'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiEmailUser.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiEmailUser.php 85354 2011-04-04 18:25:31Z demon $';
}
}
- \ No newline at end of file
diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php
index d0c00db7..6f2df1b8 100644
--- a/includes/api/ApiExpandTemplates.php
+++ b/includes/api/ApiExpandTemplates.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 05, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 05, 2007
+ *
+ * Copyright © 2007 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -38,7 +39,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiExpandTemplates extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
@@ -49,18 +50,18 @@ class ApiExpandTemplates extends ApiBase {
$params = $this->extractRequestParams();
// Create title for parser
- $title_obj = Title :: newFromText( $params['title'] );
- if ( !$title_obj )
- $title_obj = Title :: newFromText( "API" ); // default
+ $title_obj = Title::newFromText( $params['title'] );
+ if ( !$title_obj ) {
+ $title_obj = Title::newFromText( 'API' ); // default
+ }
$result = $this->getResult();
// Parse text
global $wgParser;
$options = new ParserOptions();
-
- if ( $params['generatexml'] )
- {
+
+ if ( $params['generatexml'] ) {
$wgParser->startExternalParse( $title_obj, $options, OT_PREPROCESS );
$dom = $wgParser->preprocessToDom( $params['text'] );
if ( is_callable( array( $dom, 'saveXML' ) ) ) {
@@ -81,9 +82,9 @@ class ApiExpandTemplates extends ApiBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'title' => array(
- ApiBase :: PARAM_DFLT => 'API',
+ ApiBase::PARAM_DFLT => 'API',
),
'text' => null,
'generatexml' => false,
@@ -91,7 +92,7 @@ class ApiExpandTemplates extends ApiBase {
}
public function getParamDescription() {
- return array (
+ return array(
'text' => 'Wikitext to convert',
'title' => 'Title of page',
'generatexml' => 'Generate XML parse tree',
@@ -103,12 +104,12 @@ class ApiExpandTemplates extends ApiBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=expandtemplates&text={{Project:Sandbox}}'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiExpandTemplates.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiExpandTemplates.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php
index 03d12800..e1ba61f6 100644
--- a/includes/api/ApiFeedWatchlist.php
+++ b/includes/api/ApiFeedWatchlist.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 13, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -38,7 +39,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiFeedWatchlist extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
/**
@@ -48,13 +49,14 @@ class ApiFeedWatchlist extends ApiBase {
return new ApiFormatFeedWrapper( $this->getMain() );
}
+ private $linkToDiffs = false;
+
/**
* Make a nested call to the API to request watchlist items in the last $hours.
* Wrap the result as an RSS/Atom feed.
*/
public function execute() {
-
- global $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgContLanguageCode;
+ global $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
try {
$params = $this->extractRequestParams();
@@ -62,16 +64,15 @@ class ApiFeedWatchlist extends ApiBase {
// limit to the number of hours going from now back
$endTime = wfTimestamp( TS_MW, time() - intval( $params['hours'] * 60 * 60 ) );
- $dbr = wfGetDB( DB_SLAVE );
// Prepare parameters for nested request
- $fauxReqArr = array (
+ $fauxReqArr = array(
'action' => 'query',
'meta' => 'siteinfo',
'siprop' => 'general',
'list' => 'watchlist',
'wlprop' => 'title|user|comment|timestamp',
- 'wldir' => 'older', // reverse order - from newest to oldest
- 'wlend' => $dbr->timestamp( $endTime ), // stop at this time
+ 'wldir' => 'older', // reverse order - from newest to oldest
+ 'wlend' => $endTime, // stop at this time
'wllimit' => ( 50 > $wgFeedLimit ) ? $wgFeedLimit : 50
);
@@ -82,13 +83,19 @@ class ApiFeedWatchlist extends ApiBase {
$fauxReqArr['wltoken'] = $params['wltoken'];
}
+ // Support linking to diffs instead of article
+ if ( $params['linktodiffs'] ) {
+ $this->linkToDiffs = true;
+ $fauxReqArr['wlprop'] .= '|ids';
+ }
+
// Check for 'allrev' parameter, and if found, show all revisions to each page on wl.
- if ( !is_null ( $params['allrev'] ) ) {
+ if ( !is_null( $params['allrev'] ) ) {
$fauxReqArr['wlallrev'] = '';
}
// Create the request
- $fauxReq = new FauxRequest ( $fauxReqArr );
+ $fauxReq = new FauxRequest( $fauxReqArr );
// Execute
$module = new ApiMain( $fauxReq );
@@ -102,20 +109,20 @@ class ApiFeedWatchlist extends ApiBase {
$feedItems[] = $this->createFeedItem( $info );
}
- $feedTitle = $wgSitename . ' - ' . wfMsgForContent( 'watchlist' ) . ' [' . $wgContLanguageCode . ']';
- $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullUrl();
+ $feedTitle = $wgSitename . ' - ' . wfMsgForContent( 'watchlist' ) . ' [' . $wgLanguageCode . ']';
+ $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
$feed = new $wgFeedClasses[$params['feedformat']] ( $feedTitle, htmlspecialchars( wfMsgForContent( 'watchlist' ) ), $feedUrl );
- ApiFormatFeedWrapper :: setResult( $this->getResult(), $feed, $feedItems );
+ ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems );
} catch ( Exception $e ) {
// Error results should not be cached
$this->getMain()->setCacheMaxAge( 0 );
- $feedTitle = $wgSitename . ' - Error - ' . wfMsgForContent( 'watchlist' ) . ' [' . $wgContLanguageCode . ']';
- $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullUrl();
+ $feedTitle = $wgSitename . ' - Error - ' . wfMsgForContent( 'watchlist' ) . ' [' . $wgLanguageCode . ']';
+ $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
$feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
$feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, htmlspecialchars( wfMsgForContent( 'watchlist' ) ), $feedUrl );
@@ -128,15 +135,19 @@ class ApiFeedWatchlist extends ApiBase {
}
$errorText = $e->getMessage();
- $feedItems[] = new FeedItem( "Error ($errorCode)", $errorText, "", "", "" );
- ApiFormatFeedWrapper :: setResult( $this->getResult(), $feed, $feedItems );
+ $feedItems[] = new FeedItem( "Error ($errorCode)", $errorText, '', '', '' );
+ ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems );
}
}
private function createFeedItem( $info ) {
$titleStr = $info['title'];
- $title = Title :: newFromText( $titleStr );
- $titleUrl = $title->getFullUrl();
+ $title = Title::newFromText( $titleStr );
+ if ( $this->linkToDiffs && isset( $info['revid'] ) ) {
+ $titleUrl = $title->getFullURL( array( 'diff' => $info['revid'] ) );
+ } else {
+ $titleUrl = $title->getFullURL();
+ }
$comment = isset( $info['comment'] ) ? $info['comment'] : null;
$timestamp = $info['timestamp'];
$user = $info['user'];
@@ -150,33 +161,35 @@ class ApiFeedWatchlist extends ApiBase {
global $wgFeedClasses;
$feedFormatNames = array_keys( $wgFeedClasses );
return array (
- 'feedformat' => array (
- ApiBase :: PARAM_DFLT => 'rss',
- ApiBase :: PARAM_TYPE => $feedFormatNames
+ 'feedformat' => array(
+ ApiBase::PARAM_DFLT => 'rss',
+ ApiBase::PARAM_TYPE => $feedFormatNames
),
- 'hours' => array (
- ApiBase :: PARAM_DFLT => 24,
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => 72,
+ 'hours' => array(
+ ApiBase::PARAM_DFLT => 24,
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => 72,
),
'allrev' => null,
- 'wlowner' => array (
- ApiBase :: PARAM_TYPE => 'user'
+ 'wlowner' => array(
+ ApiBase::PARAM_TYPE => 'user'
),
- 'wltoken' => array (
- ApiBase :: PARAM_TYPE => 'string'
- )
+ 'wltoken' => array(
+ ApiBase::PARAM_TYPE => 'string'
+ ),
+ 'linktodiffs' => false,
);
}
public function getParamDescription() {
- return array (
+ return array(
'feedformat' => 'The format of the feed',
'hours' => 'List pages modified within this many hours from now',
- 'allrev' => 'Include multiple revisions of the same page within given timeframe.',
- 'wlowner' => "The user whose watchlist you want (must be accompanied by wltoken if it's not you)",
- 'wltoken' => 'Security token that requested user set in their preferences'
+ 'allrev' => 'Include multiple revisions of the same page within given timeframe',
+ 'wlowner' => "The user whose watchlist you want (must be accompanied by {$this->getModulePrefix()}token if it's not you)",
+ 'wltoken' => 'Security token that requested user set in their preferences',
+ 'linktodiffs'=> 'Link to change differences instead of article pages'
);
}
@@ -185,12 +198,13 @@ class ApiFeedWatchlist extends ApiBase {
}
protected function getExamples() {
- return array (
- 'api.php?action=feedwatchlist'
+ return array(
+ 'api.php?action=feedwatchlist',
+ 'api.php?action=feedwatchlist&allrev=allrev&linktodiffs=&hours=6'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFeedWatchlist.php 69357 2010-07-14 22:39:23Z mah $';
+ return __CLASS__ . ': $Id: ApiFeedWatchlist.php 77674 2010-12-03 19:47:22Z catrope $';
}
}
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index de211fe9..9d1dfbc1 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 19, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 19, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
abstract class ApiFormatBase extends ApiBase {
private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp, $mCleared;
- private $mBufferResult = false, $mBuffer;
+ private $mBufferResult = false, $mBuffer, $mDisabled = false;
/**
* Constructor
@@ -45,13 +46,14 @@ abstract class ApiFormatBase extends ApiBase {
* @param $format string Format name
*/
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
$this->mIsHtml = ( substr( $format, - 2, 2 ) === 'fm' ); // ends with 'fm'
- if ( $this->mIsHtml )
+ if ( $this->mIsHtml ) {
$this->mFormat = substr( $format, 0, - 2 ); // remove ending 'fm'
- else
+ } else {
$this->mFormat = $format;
+ }
$this->mFormat = strtoupper( $this->mFormat );
$this->mCleared = false;
}
@@ -113,20 +115,36 @@ abstract class ApiFormatBase extends ApiBase {
}
/**
+ * Disable the formatter completely. This causes calls to initPrinter(),
+ * printText() and closePrinter() to be ignored.
+ */
+ public function disable() {
+ $this->mDisabled = true;
+ }
+
+ public function isDisabled() {
+ return $this->mDisabled;
+ }
+
+ /**
* Initialize the printer function and prepare the output headers, etc.
* This method must be the first outputing method during execution.
* A help screen's header is printed for the HTML-based output
* @param $isError bool Whether an error message is printed
*/
function initPrinter( $isError ) {
+ if ( $this->mDisabled ) {
+ return;
+ }
$isHtml = $this->getIsHtml();
$mime = $isHtml ? 'text/html' : $this->getMimeType();
$script = wfScript( 'api' );
// Some printers (ex. Feed) do their own header settings,
// in which case $mime will be set to null
- if ( is_null( $mime ) )
+ if ( is_null( $mime ) ) {
return; // skip any initialization
+ }
header( "Content-Type: $mime; charset=utf-8" );
@@ -170,6 +188,9 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
* Finish printing. Closes HTML tags.
*/
public function closePrinter() {
+ if ( $this->mDisabled ) {
+ return;
+ }
if ( $this->getIsHtml() ) {
?>
@@ -189,6 +210,9 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
* @param $text string
*/
public function printText( $text ) {
+ if ( $this->mDisabled ) {
+ return;
+ }
if ( $this->mBufferResult ) {
$this->mBuffer = $text;
} elseif ( $this->getIsHtml() ) {
@@ -197,8 +221,7 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
// For non-HTML output, clear all errors that might have been
// displayed if display_errors=On
// Do this only once, of course
- if ( !$this->mCleared )
- {
+ if ( !$this->mCleared ) {
ob_clean();
$this->mCleared = true;
}
@@ -224,15 +247,15 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
* @param $help bool
*/
public function setHelp( $help = true ) {
- $this->mHelp = true;
+ $this->mHelp = $help;
}
/**
- * Prety-print various elements in HTML format, such as xml tags and
- * URLs. This method also escapes characters like <
- * @param $text string
- * @return string
- */
+ * Pretty-print various elements in HTML format, such as xml tags and
+ * URLs. This method also escapes characters like <
+ * @param $text string
+ * @return string
+ */
protected function formatHTML( $text ) {
global $wgUrlProtocols;
@@ -254,12 +277,15 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
$text = preg_replace( "#\\$[^<>\n]+\\$#", '<b><i>\\0</i></b>', $text );
}
- /* Temporary fix for bad links in help messages. As a special case,
+ /**
+ * Temporary fix for bad links in help messages. As a special case,
* XML-escaped metachars are de-escaped one level in the help message
- * for legibility. Should be removed once we have completed a fully-html
- * version of the help message. */
- if ( $this->mUnescapeAmps )
+ * for legibility. Should be removed once we have completed a fully-HTML
+ * version of the help message.
+ */
+ if ( $this->mUnescapeAmps ) {
$text = preg_replace( '/&amp;(amp|quot|lt|gt);/', '&\1;', $text );
+ }
return $text;
}
@@ -273,7 +299,7 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
}
public static function getBaseVersion() {
- return __CLASS__ . ': $Id: ApiFormatBase.php 62367 2010-02-12 14:09:42Z siebrand $';
+ return __CLASS__ . ': $Id: ApiFormatBase.php 75970 2010-11-04 00:55:30Z reedy $';
}
}
@@ -284,7 +310,7 @@ See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
class ApiFormatFeedWrapper extends ApiFormatBase {
public function __construct( $main ) {
- parent :: __construct( $main, 'feed' );
+ parent::__construct( $main, 'feed' );
}
/**
@@ -326,13 +352,14 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
*/
public function execute() {
$data = $this->getResultData();
- if ( isset ( $data['_feed'] ) && isset ( $data['_feeditems'] ) ) {
+ if ( isset( $data['_feed'] ) && isset( $data['_feeditems'] ) ) {
$feed = $data['_feed'];
$items = $data['_feeditems'];
$feed->outHeader();
- foreach ( $items as & $item )
+ foreach ( $items as & $item ) {
$feed->outItem( $item );
+ }
$feed->outFooter();
} else {
// Error has occured, print something useful
@@ -341,6 +368,6 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatBase.php 62367 2010-02-12 14:09:42Z siebrand $';
+ return __CLASS__ . ': $Id: ApiFormatBase.php 75970 2010-11-04 00:55:30Z reedy $';
}
} \ No newline at end of file
diff --git a/includes/api/ApiFormatDbg.php b/includes/api/ApiFormatDbg.php
index 26afd329..d4aeb0b8 100644
--- a/includes/api/ApiFormatDbg.php
+++ b/includes/api/ApiFormatDbg.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 22, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Oct 22, 2006
+ *
+ * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,22 +18,25 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API PHP's var_export() output formatter
* @ingroup API
*/
class ApiFormatDbg extends ApiFormatBase {
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
}
public function getMimeType() {
@@ -49,10 +51,10 @@ class ApiFormatDbg extends ApiFormatBase {
}
public function getDescription() {
- return 'Output data in PHP\'s var_export() format' . parent :: getDescription();
+ return 'Output data in PHP\'s var_export() format' . parent::getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatDbg.php 61444 2010-01-23 22:52:40Z reedy $';
+ return __CLASS__ . ': $Id: ApiFormatDbg.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFormatDump.php b/includes/api/ApiFormatDump.php
new file mode 100644
index 00000000..6197563d
--- /dev/null
+++ b/includes/api/ApiFormatDump.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * API for MediaWiki 1.8+
+ *
+ * Created on August 8, 2010
+ *
+ * Copyright © 2010 Soxred93
+ *
+ * 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
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ // Eclipse helper - will be ignored in production
+ require_once( 'ApiFormatBase.php' );
+}
+
+/**
+ * API PHP's var_dump() output formatter
+ * @ingroup API
+ */
+class ApiFormatDump extends ApiFormatBase {
+
+ public function __construct( $main, $format ) {
+ parent::__construct( $main, $format );
+ }
+
+ public function getMimeType() {
+ // This looks like it should be text/plain, but IE7 is so
+ // brain-damaged it tries to parse text/plain as HTML if it
+ // contains HTML tags. Using MIME text/text works around this bug
+ return 'text/text';
+ }
+
+ public function execute() {
+ ob_start();
+ var_dump( $this->getResultData() );
+ $result = ob_get_contents();
+ ob_end_clean();
+ $this->printText( $result );
+ }
+
+ public function getDescription() {
+ return 'Output data in PHP\'s var_dump() format' . parent::getDescription();
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id$';
+ }
+}
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index 69686bfb..7c02baa0 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 19, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 19, 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
@@ -19,16 +18,19 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API JSON output formatter
* @ingroup API
*/
class ApiFormatJson extends ApiFormatBase {
@@ -36,7 +38,7 @@ class ApiFormatJson extends ApiFormatBase {
private $mIsRaw;
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
$this->mIsRaw = ( $format === 'rawfm' );
}
@@ -59,40 +61,42 @@ class ApiFormatJson extends ApiFormatBase {
}
public function execute() {
- $prefix = $suffix = "";
+ $prefix = $suffix = '';
$params = $this->extractRequestParams();
$callback = $params['callback'];
if ( !is_null( $callback ) ) {
- $prefix = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", "", $callback ) . "(";
- $suffix = ")";
+ $prefix = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ) . '(';
+ $suffix = ')';
}
$this->printText(
$prefix .
- FormatJson::encode( $this->getResultData(), $this->getIsHtml() ) .
- $suffix );
+ FormatJson::encode( $this->getResultData(), $this->getIsHtml() ) .
+ $suffix
+ );
}
public function getAllowedParams() {
- return array (
+ return array(
'callback' => null,
);
}
public function getParamDescription() {
- return array (
+ return array(
'callback' => 'If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.',
);
}
public function getDescription() {
- if ( $this->mIsRaw )
- return 'Output data with the debuging elements in JSON format' . parent :: getDescription();
- else
- return 'Output data in JSON format' . parent :: getDescription();
+ if ( $this->mIsRaw ) {
+ return 'Output data with the debuging elements in JSON format' . parent::getDescription();
+ } else {
+ return 'Output data in JSON format' . parent::getDescription();
+ }
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatJson.php 62354 2010-02-12 06:44:16Z mah $';
+ return __CLASS__ . ': $Id: ApiFormatJson.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFormatPhp.php b/includes/api/ApiFormatPhp.php
index dd03c300..e83941d4 100644
--- a/includes/api/ApiFormatPhp.php
+++ b/includes/api/ApiFormatPhp.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 22, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 22, 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
@@ -19,22 +18,25 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API Serialized PHP output formatter
* @ingroup API
*/
class ApiFormatPhp extends ApiFormatBase {
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
}
public function getMimeType() {
@@ -46,10 +48,10 @@ class ApiFormatPhp extends ApiFormatBase {
}
public function getDescription() {
- return 'Output data in serialized PHP format' . parent :: getDescription();
+ return 'Output data in serialized PHP format' . parent::getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatPhp.php 60930 2010-01-11 15:55:52Z simetrical $';
+ return __CLASS__ . ': $Id: ApiFormatPhp.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFormatRaw.php b/includes/api/ApiFormatRaw.php
index 8bb66aea..98a50652 100644
--- a/includes/api/ApiFormatRaw.php
+++ b/includes/api/ApiFormatRaw.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Feb 2, 2009
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Feb 2, 2009
+ *
+ * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
@@ -40,36 +41,38 @@ class ApiFormatRaw extends ApiFormatBase {
* @param $errorFallback Formatter object to fall back on for errors
*/
public function __construct( $main, $errorFallback ) {
- parent :: __construct( $main, 'raw' );
+ parent::__construct( $main, 'raw' );
$this->mErrorFallback = $errorFallback;
}
public function getMimeType() {
$data = $this->getResultData();
- if ( isset( $data['error'] ) )
+ if ( isset( $data['error'] ) ) {
return $this->mErrorFallback->getMimeType();
+ }
+
+ if ( !isset( $data['mime'] ) ) {
+ ApiBase::dieDebug( __METHOD__, 'No MIME type set for raw formatter' );
+ }
- if ( !isset( $data['mime'] ) )
- ApiBase::dieDebug( __METHOD__, "No MIME type set for raw formatter" );
-
return $data['mime'];
}
public function execute() {
$data = $this->getResultData();
- if ( isset( $data['error'] ) )
- {
+ if ( isset( $data['error'] ) ) {
$this->mErrorFallback->execute();
return;
}
-
- if ( !isset( $data['text'] ) )
- ApiBase::dieDebug( __METHOD__, "No text given for raw formatter" );
+
+ if ( !isset( $data['text'] ) ) {
+ ApiBase::dieDebug( __METHOD__, 'No text given for raw formatter' );
+ }
$this->printText( $data['text'] );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatRaw.php 61437 2010-01-23 22:26:40Z reedy $';
+ return __CLASS__ . ': $Id: ApiFormatRaw.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFormatTxt.php b/includes/api/ApiFormatTxt.php
index 1627dde6..bbb268f1 100644
--- a/includes/api/ApiFormatTxt.php
+++ b/includes/api/ApiFormatTxt.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 22, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Oct 22, 2006
+ *
+ * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,22 +18,25 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API Text output formatter
* @ingroup API
*/
class ApiFormatTxt extends ApiFormatBase {
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
}
public function getMimeType() {
@@ -49,10 +51,10 @@ class ApiFormatTxt extends ApiFormatBase {
}
public function getDescription() {
- return 'Output data in PHP\'s print_r() format' . parent :: getDescription();
+ return 'Output data in PHP\'s print_r() format' . parent::getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatTxt.php 61444 2010-01-23 22:52:40Z reedy $';
+ return __CLASS__ . ': $Id: ApiFormatTxt.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
index e95e540b..6c1e3066 100644
--- a/includes/api/ApiFormatWddx.php
+++ b/includes/api/ApiFormatWddx.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 22, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 22, 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
@@ -19,22 +18,25 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API WDDX output formatter
* @ingroup API
*/
class ApiFormatWddx extends ApiFormatBase {
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
}
public function getMimeType() {
@@ -53,8 +55,8 @@ class ApiFormatWddx extends ApiFormatBase {
} else {
// Don't do newlines and indentation if we weren't asked
// for pretty output
- $nl = ( $this->getIsHtml() ? "" : "\n" );
- $indstr = " ";
+ $nl = ( $this->getIsHtml() ? '' : "\n" );
+ $indstr = ' ';
$this->printText( "<?xml version=\"1.0\"?>$nl" );
$this->printText( "<wddxPacket version=\"1.0\">$nl" );
$this->printText( "$indstr<header/>$nl" );
@@ -69,11 +71,11 @@ class ApiFormatWddx extends ApiFormatBase {
* Recursively go through the object and output its data in WDDX format.
*/
function slowWddxPrinter( $elemValue, $indent = 0 ) {
- $indstr = ( $this->getIsHtml() ? "" : str_repeat( ' ', $indent ) );
- $indstr2 = ( $this->getIsHtml() ? "" : str_repeat( ' ', $indent + 2 ) );
- $nl = ( $this->getIsHtml() ? "" : "\n" );
+ $indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
+ $indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
+ $nl = ( $this->getIsHtml() ? '' : "\n" );
switch ( gettype( $elemValue ) ) {
- case 'array' :
+ case 'array':
// Check whether we've got an associative array (<struct>)
// or a regular array (<array>)
$cnt = count( $elemValue );
@@ -81,8 +83,9 @@ class ApiFormatWddx extends ApiFormatBase {
// Regular array
$this->printText( $indstr . Xml::element( 'array', array(
'length' => $cnt ), null ) . $nl );
- foreach ( $elemValue as $subElemValue )
+ foreach ( $elemValue as $subElemValue ) {
$this->slowWddxPrinter( $subElemValue, $indent + 2 );
+ }
$this->printText( "$indstr</array>$nl" );
} else {
// Associative array (<struct>)
@@ -97,23 +100,23 @@ class ApiFormatWddx extends ApiFormatBase {
$this->printText( "$indstr</struct>$nl" );
}
break;
- case 'integer' :
- case 'double' :
+ case 'integer':
+ case 'double':
$this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
break;
- case 'string' :
+ case 'string':
$this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
break;
- default :
- ApiBase :: dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
+ default:
+ ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
}
}
public function getDescription() {
- return 'Output data in WDDX format' . parent :: getDescription();
+ return 'Output data in WDDX format' . parent::getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatWddx.php 61437 2010-01-23 22:26:40Z reedy $';
+ return __CLASS__ . ': $Id: ApiFormatWddx.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiFormatXml.php b/includes/api/ApiFormatXml.php
index a3758a49..45ab73ef 100644
--- a/includes/api/ApiFormatXml.php
+++ b/includes/api/ApiFormatXml.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 19, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 19, 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
@@ -19,16 +18,19 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API XML output formatter
* @ingroup API
*/
class ApiFormatXml extends ApiFormatBase {
@@ -38,7 +40,7 @@ class ApiFormatXml extends ApiFormatBase {
private $mXslt = null;
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
}
public function getMimeType() {
@@ -59,45 +61,50 @@ class ApiFormatXml extends ApiFormatBase {
$this->mXslt = $params['xslt'];
$this->printText( '<?xml version="1.0"?>' );
- if ( !is_null( $this->mXslt ) )
+ if ( !is_null( $this->mXslt ) ) {
$this->addXslt();
- $this->printText( self::recXmlPrint( $this->mRootElemName,
+ }
+ $this->printText(
+ self::recXmlPrint( $this->mRootElemName,
$this->getResultData(),
$this->getIsHtml() ? - 2 : null,
- $this->mDoubleQuote ) );
+ $this->mDoubleQuote
+ )
+ );
}
/**
- * This method takes an array and converts it to XML.
- * There are several noteworthy cases:
- *
- * If array contains a key '_element', then the code assumes that ALL other keys are not important and replaces them with the value['_element'].
- * Example: name='root', value = array( '_element'=>'page', 'x', 'y', 'z') creates <root> <page>x</page> <page>y</page> <page>z</page> </root>
- *
- * If any of the array's element key is '*', then the code treats all other key->value pairs as attributes, and the value['*'] as the element's content.
- * Example: name='root', value = array( '*'=>'text', 'lang'=>'en', 'id'=>10) creates <root lang='en' id='10'>text</root>
- *
- * If neither key is found, all keys become element names, and values become element content.
- * The method is recursive, so the same rules apply to any sub-arrays.
- */
+ * This method takes an array and converts it to XML.
+ * There are several noteworthy cases:
+ *
+ * If array contains a key '_element', then the code assumes that ALL other keys are not important and replaces them with the value['_element'].
+ * Example: name='root', value = array( '_element'=>'page', 'x', 'y', 'z') creates <root> <page>x</page> <page>y</page> <page>z</page> </root>
+ *
+ * If any of the array's element key is '*', then the code treats all other key->value pairs as attributes, and the value['*'] as the element's content.
+ * Example: name='root', value = array( '*'=>'text', 'lang'=>'en', 'id'=>10) creates <root lang='en' id='10'>text</root>
+ *
+ * If neither key is found, all keys become element names, and values become element content.
+ * The method is recursive, so the same rules apply to any sub-arrays.
+ */
public static function recXmlPrint( $elemName, $elemValue, $indent, $doublequote = false ) {
$retval = '';
if ( !is_null( $indent ) ) {
$indent += 2;
- $indstr = "\n" . str_repeat( " ", $indent );
+ $indstr = "\n" . str_repeat( ' ', $indent );
} else {
$indstr = '';
}
$elemName = str_replace( ' ', '_', $elemName );
switch ( gettype( $elemValue ) ) {
- case 'array' :
- if ( isset ( $elemValue['*'] ) ) {
+ case 'array':
+ if ( isset( $elemValue['*'] ) ) {
$subElemContent = $elemValue['*'];
- if ( $doublequote )
+ if ( $doublequote ) {
$subElemContent = Sanitizer::encodeAttribute( $subElemContent );
- unset ( $elemValue['*'] );
-
+ }
+ unset( $elemValue['*'] );
+
// Add xml:space="preserve" to the
// element so XML parsers will leave
// whitespace in the content alone
@@ -106,59 +113,65 @@ class ApiFormatXml extends ApiFormatBase {
$subElemContent = null;
}
- if ( isset ( $elemValue['_element'] ) ) {
+ if ( isset( $elemValue['_element'] ) ) {
$subElemIndName = $elemValue['_element'];
- unset ( $elemValue['_element'] );
+ unset( $elemValue['_element'] );
} else {
$subElemIndName = null;
}
- $indElements = array ();
- $subElements = array ();
+ $indElements = array();
+ $subElements = array();
foreach ( $elemValue as $subElemId => & $subElemValue ) {
- if ( is_string( $subElemValue ) && $doublequote )
+ if ( is_string( $subElemValue ) && $doublequote ) {
$subElemValue = Sanitizer::encodeAttribute( $subElemValue );
-
+ }
+
if ( gettype( $subElemId ) === 'integer' ) {
$indElements[] = $subElemValue;
- unset ( $elemValue[$subElemId] );
+ unset( $elemValue[$subElemId] );
} elseif ( is_array( $subElemValue ) ) {
$subElements[$subElemId] = $subElemValue;
unset ( $elemValue[$subElemId] );
}
}
- if ( is_null( $subElemIndName ) && count( $indElements ) )
- ApiBase :: dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
+ if ( is_null( $subElemIndName ) && count( $indElements ) ) {
+ ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
+ }
- if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) )
- ApiBase :: dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+ if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
+ ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+ }
if ( !is_null( $subElemContent ) ) {
$retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
} elseif ( !count( $indElements ) && !count( $subElements ) ) {
- $retval .= $indstr . Xml::element( $elemName, $elemValue );
+ $retval .= $indstr . Xml::element( $elemName, $elemValue );
} else {
$retval .= $indstr . Xml::element( $elemName, $elemValue, null );
- foreach ( $subElements as $subElemId => & $subElemValue )
+ foreach ( $subElements as $subElemId => & $subElemValue ) {
$retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
+ }
- foreach ( $indElements as $subElemId => & $subElemValue )
+ foreach ( $indElements as &$subElemValue ) {
$retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
+ }
$retval .= $indstr . Xml::closeElement( $elemName );
}
break;
- case 'object' :
+ case 'object':
// ignore
break;
- default :
+ default:
$retval .= $indstr . Xml::element( $elemName, null, $elemValue );
break;
}
return $retval;
}
+
function addXslt() {
$nt = Title::newFromText( $this->mXslt );
if ( is_null( $nt ) || !$nt->exists() ) {
@@ -175,26 +188,26 @@ class ApiFormatXml extends ApiFormatBase {
}
$this->printText( '<?xml-stylesheet href="' . $nt->escapeLocalURL( 'action=raw' ) . '" type="text/xsl" ?>' );
}
-
+
public function getAllowedParams() {
- return array (
+ return array(
'xmldoublequote' => false,
'xslt' => null,
);
}
public function getParamDescription() {
- return array (
- 'xmldoublequote' => 'If specified, double quotes all attributes and content.',
+ return array(
+ 'xmldoublequote' => 'If specified, double quotes all attributes and content',
'xslt' => 'If specified, adds <xslt> as stylesheet',
);
}
public function getDescription() {
- return 'Output data in XML format' . parent :: getDescription();
+ return 'Output data in XML format' . parent::getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatXml.php 62402 2010-02-13 00:09:05Z reedy $';
+ return __CLASS__ . ': $Id: ApiFormatXml.php 73753 2010-09-25 16:56:03Z reedy $';
}
}
diff --git a/includes/api/ApiFormatYaml.php b/includes/api/ApiFormatYaml.php
index 39381b0f..ccf52746 100644
--- a/includes/api/ApiFormatYaml.php
+++ b/includes/api/ApiFormatYaml.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 19, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 19, 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
@@ -19,22 +18,25 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiFormatBase.php' );
+ require_once( 'ApiFormatBase.php' );
}
/**
+ * API YAML output formatter
* @ingroup API
*/
class ApiFormatYaml extends ApiFormatBase {
public function __construct( $main, $format ) {
- parent :: __construct( $main, $format );
+ parent::__construct( $main, $format );
}
public function getMimeType() {
@@ -42,14 +44,14 @@ class ApiFormatYaml extends ApiFormatBase {
}
public function execute() {
- $this->printText( Spyc :: YAMLDump( $this->getResultData() ) );
+ $this->printText( Spyc::YAMLDump( $this->getResultData() ) );
}
public function getDescription() {
- return 'Output data in YAML format' . parent :: getDescription();
+ return 'Output data in YAML format' . parent::getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatYaml.php 60930 2010-01-11 15:55:52Z simetrical $';
+ return __CLASS__ . ': $Id: ApiFormatYaml.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php
index 1f32e019..eedbde13 100644
--- a/includes/api/ApiHelp.php
+++ b/includes/api/ApiHelp.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 6, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 6, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -36,14 +37,71 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiHelp extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
/**
- * Stub module for displaying help when no parameters are given
+ * Module for displaying help
*/
public function execute() {
- $this->dieUsage( '', 'help' );
+ // Get parameters
+ $params = $this->extractRequestParams();
+
+ if ( !isset( $params['modules'] ) && !isset( $params['querymodules'] ) ) {
+ $this->dieUsage( '', 'help' );
+ }
+
+ $this->getMain()->setHelp();
+
+ $result = $this->getResult();
+ $queryObj = new ApiQuery( $this->getMain(), 'query' );
+ $r = array();
+ if ( is_array( $params['modules'] ) ) {
+ $modArr = $this->getMain()->getModules();
+
+ foreach ( $params['modules'] as $m ) {
+ if ( !isset( $modArr[$m] ) ) {
+ $r[] = array( 'name' => $m, 'missing' => '' );
+ continue;
+ }
+ $module = new $modArr[$m]( $this->getMain(), $m );
+
+ $r[] = $this->buildModuleHelp( $module, 'action' );
+ }
+ }
+
+ if ( is_array( $params['querymodules'] ) ) {
+ $qmodArr = $queryObj->getModules();
+
+ foreach ( $params['querymodules'] as $qm ) {
+ if ( !isset( $qmodArr[$qm] ) ) {
+ $r[] = array( 'name' => $qm, 'missing' => '' );
+ continue;
+ }
+ $module = new $qmodArr[$qm]( $this, $qm );
+ $type = $queryObj->getModuleType( $qm );
+
+ if ( $type === null ) {
+ $r[] = array( 'name' => $qm, 'missing' => '' );
+ continue;
+ }
+
+ $r[] = $this->buildModuleHelp( $module, $type );
+ }
+ }
+ $result->setIndexedTagName( $r, 'module' );
+ $result->addValue( null, $this->getModuleName(), $r );
+ }
+
+ private function buildModuleHelp( $module, $type ) {
+ $msg = ApiMain::makeHelpMsgHeader( $module, $type );
+
+ $msg2 = $module->makeHelpMsg();
+ if ( $msg2 !== false ) {
+ $msg .= $msg2;
+ }
+
+ return $msg;
}
public function shouldCheckMaxlag() {
@@ -54,13 +112,44 @@ class ApiHelp extends ApiBase {
return false;
}
+ public function getAllowedParams() {
+ return array(
+ 'modules' => array(
+ ApiBase::PARAM_ISMULTI => true
+ ),
+ 'querymodules' => array(
+ ApiBase::PARAM_ISMULTI => true
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'modules' => 'List of module names (value of the action= parameter)',
+ 'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)',
+ );
+ }
+
public function getDescription() {
- return array (
- 'Display this help screen.'
+ return 'Display this help screen. Or the help screen for the specified module';
+ }
+
+ protected function getExamples() {
+ return array(
+ 'Whole help page:',
+ ' api.php?action=help',
+ 'Module (action) help page:',
+ ' api.php?action=help&modules=protect',
+ 'Query (list) modules help page:',
+ ' api.php?action=help&querymodules=categorymembers',
+ 'Query (prop) modules help page:',
+ ' api.php?action=help&querymodules=info',
+ 'Query (meta) modules help page:',
+ ' api.php?action=help&querymodules=siteinfo',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiHelp.php 60930 2010-01-11 15:55:52Z simetrical $';
+ return __CLASS__ . ': $Id: ApiHelp.php 73863 2010-09-28 02:33:43Z brion $';
}
}
diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php
index d33a472a..1b5153f9 100644
--- a/includes/api/ApiImport.php
+++ b/includes/api/ApiImport.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Feb 4, 2009
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Feb 4, 2009
+ *
+ * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -36,58 +37,54 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiImport extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
global $wgUser;
- if ( !$wgUser->isAllowed( 'import' ) )
+ if ( !$wgUser->isAllowed( 'import' ) ) {
$this->dieUsageMsg( array( 'cantimport' ) );
+ }
$params = $this->extractRequestParams();
- $source = null;
$isUpload = false;
- if ( isset( $params['interwikisource'] ) )
- {
- if ( !isset( $params['interwikipage'] ) )
+ if ( isset( $params['interwikisource'] ) ) {
+ if ( !isset( $params['interwikipage'] ) ) {
$this->dieUsageMsg( array( 'missingparam', 'interwikipage' ) );
+ }
$source = ImportStreamSource::newFromInterwiki(
- $params['interwikisource'],
- $params['interwikipage'],
- $params['fullhistory'],
- $params['templates'] );
- }
- else
- {
+ $params['interwikisource'],
+ $params['interwikipage'],
+ $params['fullhistory'],
+ $params['templates']
+ );
+ } else {
$isUpload = true;
- if ( !$wgUser->isAllowed( 'importupload' ) )
+ if ( !$wgUser->isAllowed( 'importupload' ) ) {
$this->dieUsageMsg( array( 'cantimport-upload' ) );
+ }
$source = ImportStreamSource::newFromUpload( 'xml' );
}
- if ( $source instanceof WikiErrorMsg )
- $this->dieUsageMsg( array_merge(
- array( $source->getMessageKey() ),
- $source->getMessageArgs() ) );
- else if ( WikiError::isError( $source ) )
- // This shouldn't happen
- $this->dieUsageMsg( array( 'import-unknownerror', $source->getMessage() ) );
-
- $importer = new WikiImporter( $source );
- if ( isset( $params['namespace'] ) )
+ if ( !$source->isOK() ) {
+ $this->dieUsageMsg( $source->getErrorsArray() );
+ }
+
+ $importer = new WikiImporter( $source->value );
+ if ( isset( $params['namespace'] ) ) {
$importer->setTargetNamespace( $params['namespace'] );
- $reporter = new ApiImportReporter( $importer, $isUpload,
- $params['interwikisource'],
- $params['summary'] );
-
- $result = $importer->doImport();
- if ( $result instanceof WikiXmlError )
- $this->dieUsageMsg( array( 'import-xml-error',
- $result->mLine,
- $result->mColumn,
- $result->mByte . $result->mContext,
- xml_error_string( $result->mXmlError ) ) );
- else if ( WikiError::isError( $result ) )
- $this->dieUsageMsg( array( 'import-unknownerror', $result->getMessage() ) ); // This shouldn't happen
+ }
+ $reporter = new ApiImportReporter(
+ $importer,
+ $isUpload,
+ $params['interwikisource'],
+ $params['summary']
+ );
+
+ try {
+ $importer->doImport();
+ } catch ( MWException $e ) {
+ $this->dieUsageMsg( array( 'import-unknownerror', $e->getMessage() ) );
+ }
$resultData = $reporter->getData();
$this->getResult()->setIndexedTagName( $resultData, 'page' );
@@ -104,24 +101,24 @@ class ApiImport extends ApiBase {
public function getAllowedParams() {
global $wgImportSources;
- return array (
+ return array(
'token' => null,
'summary' => null,
'xml' => null,
'interwikisource' => array(
- ApiBase :: PARAM_TYPE => $wgImportSources
+ ApiBase::PARAM_TYPE => $wgImportSources
),
'interwikipage' => null,
'fullhistory' => false,
'templates' => false,
'namespace' => array(
- ApiBase :: PARAM_TYPE => 'namespace'
+ ApiBase::PARAM_TYPE => 'namespace'
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'token' => 'Import token obtained through prop=info',
'summary' => 'Import summary',
'xml' => 'Uploaded XML file',
@@ -134,11 +131,9 @@ class ApiImport extends ApiBase {
}
public function getDescription() {
- return array (
- 'Import a page from another wiki, or an XML file'
- );
+ return 'Import a page from another wiki, or an XML file';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'cantimport' ),
@@ -148,7 +143,7 @@ class ApiImport extends ApiBase {
array( 'import-unknownerror', 'result' ),
) );
}
-
+
public function needsToken() {
return true;
}
@@ -160,12 +155,12 @@ class ApiImport extends ApiBase {
protected function getExamples() {
return array(
'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history:',
- ' api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory&token=123ABC',
+ ' api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory=&token=123ABC',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiImport.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiImport.php 77800 2010-12-05 14:22:49Z ialex $';
}
}
@@ -176,8 +171,7 @@ class ApiImport extends ApiBase {
class ApiImportReporter extends ImportReporter {
private $mResultArr = array();
- function reportPage( $title, $origTitle, $revisionCount, $successCount )
- {
+ function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
// Add a result entry
$r = array();
ApiQueryBase::addTitleInfo( $r, $title );
@@ -185,11 +179,10 @@ class ApiImportReporter extends ImportReporter {
$this->mResultArr[] = $r;
// Piggyback on the parent to do the logging
- parent::reportPage( $title, $origTitle, $revisionCount, $successCount );
+ parent::reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo );
}
- function getData()
- {
+ function getData() {
return $this->mResultArr;
}
-} \ No newline at end of file
+}
diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php
index 442bc44c..0675de7b 100644
--- a/includes/api/ApiLogin.php
+++ b/includes/api/ApiLogin.php
@@ -1,10 +1,9 @@
<?php
-
/**
- * Created on Sep 19, 2006
- *
* API for MediaWiki 1.8+
*
+ * Created on Sep 19, 2006
+ *
* Copyright © 2006-2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com,
* Daniel Cannon (cannon dot danielc at gmail dot com)
*
@@ -20,8 +19,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -68,10 +69,11 @@ class ApiLogin extends ApiBase {
}
$loginForm = new LoginForm( $req );
+
+ global $wgCookiePrefix, $wgUser, $wgPasswordAttemptThrottle;
+
switch ( $authRes = $loginForm->authenticateUserData() ) {
case LoginForm::SUCCESS:
- global $wgUser, $wgCookiePrefix;
-
$wgUser->setOption( 'rememberpassword', 1 );
$wgUser->setCookies();
@@ -87,15 +89,14 @@ class ApiLogin extends ApiBase {
$result['cookieprefix'] = $wgCookiePrefix;
$result['sessionid'] = session_id();
break;
-
+
case LoginForm::NEED_TOKEN:
- global $wgCookiePrefix;
$result['result'] = 'NeedToken';
$result['token'] = $loginForm->getLoginToken();
$result['cookieprefix'] = $wgCookiePrefix;
$result['sessionid'] = session_id();
break;
-
+
case LoginForm::WRONG_TOKEN:
$result['result'] = 'WrongToken';
break;
@@ -131,7 +132,6 @@ class ApiLogin extends ApiBase {
break;
case LoginForm::THROTTLED:
- global $wgPasswordAttemptThrottle;
$result['result'] = 'Throttled';
$result['wait'] = intval( $wgPasswordAttemptThrottle['seconds'] );
break;
@@ -179,7 +179,7 @@ class ApiLogin extends ApiBase {
'In the event of a successful log-in, a cookie will be attached',
'to your session. In the event of a failed log-in, you will not ',
'be able to attempt another log-in through this method for 5 seconds.',
- 'This is to prevent password guessing by automated password crackers.'
+ 'This is to prevent password guessing by automated password crackers'
);
}
@@ -206,6 +206,6 @@ class ApiLogin extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiLogin.php 64697 2010-04-07 09:05:05Z catrope $';
+ return __CLASS__ . ': $Id: ApiLogin.php 76080 2010-11-05 11:54:35Z catrope $';
}
}
diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php
index 6637ee09..89326915 100644
--- a/includes/api/ApiLogout.php
+++ b/includes/api/ApiLogout.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Jan 4, 2008
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Yuri Astrakhan <Firstname><Lastname>@gmail.com,
+ * Created on Jan 4, 2008
+ *
+ * Copyright © 2008 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -37,14 +38,14 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiLogout extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
global $wgUser;
$oldName = $wgUser->getName();
$wgUser->logout();
-
+
// Give extensions to do something after user logout
$injected_html = '';
wfRunHooks( 'UserLogoutComplete', array( &$wgUser, &$injected_html, $oldName ) );
@@ -55,17 +56,15 @@ class ApiLogout extends ApiBase {
}
public function getAllowedParams() {
- return array ();
+ return array();
}
public function getParamDescription() {
- return array ();
+ return array();
}
public function getDescription() {
- return array (
- 'This module is used to logout and clear session data'
- );
+ return 'This module is used to logout and clear session data';
}
protected function getExamples() {
@@ -75,6 +74,6 @@ class ApiLogout extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiLogout.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiLogout.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index fa6957b6..d5238a51 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 4, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 4, 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
@@ -19,20 +18,19 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @defgroup API API
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
- * @defgroup API API
- */
-
-/**
* This is the main API class, used for both external and internal processing.
* When executed, it will create the requested formatter object,
* instantiate and execute an object associated with the needed action,
@@ -55,7 +53,7 @@ class ApiMain extends ApiBase {
/**
* List of available modules: action name => module class
*/
- private static $Modules = array (
+ private static $Modules = array(
'login' => 'ApiLogin',
'logout' => 'ApiLogout',
'query' => 'ApiQuery',
@@ -65,6 +63,7 @@ class ApiMain extends ApiBase {
'feedwatchlist' => 'ApiFeedWatchlist',
'help' => 'ApiHelp',
'paraminfo' => 'ApiParamInfo',
+ 'rsd' => 'ApiRsd',
// Write modules
'purge' => 'ApiPurge',
@@ -87,7 +86,7 @@ class ApiMain extends ApiBase {
/**
* List of available formats: format name => format class
*/
- private static $Formats = array (
+ private static $Formats = array(
'json' => 'ApiFormatJson',
'jsonfm' => 'ApiFormatJson',
'php' => 'ApiFormatPhp',
@@ -102,7 +101,9 @@ class ApiMain extends ApiBase {
'txt' => 'ApiFormatTxt',
'txtfm' => 'ApiFormatTxt',
'dbg' => 'ApiFormatDbg',
- 'dbgfm' => 'ApiFormatDbg'
+ 'dbgfm' => 'ApiFormatDbg',
+ 'dump' => 'ApiFormatDump',
+ 'dumpfm' => 'ApiFormatDump',
);
/**
@@ -111,17 +112,17 @@ class ApiMain extends ApiBase {
* 'params' => array ( $someVarToSubst ) ),
* );
*/
- private static $mRights = array( 'writeapi' => array(
- 'msg' => 'Use of the write API',
- 'params' => array()
- ),
- 'apihighlimits' => array(
- 'msg' => 'Use higher limits in API queries (Slow queries: $1 results; Fast queries: $2 results). The limits for slow queries also apply to multivalue parameters.',
- 'params' => array ( ApiMain::LIMIT_SML2, ApiMain::LIMIT_BIG2 )
- )
+ private static $mRights = array(
+ 'writeapi' => array(
+ 'msg' => 'Use of the write API',
+ 'params' => array()
+ ),
+ 'apihighlimits' => array(
+ 'msg' => 'Use higher limits in API queries (Slow queries: $1 results; Fast queries: $2 results). The limits for slow queries also apply to multivalue parameters.',
+ 'params' => array( ApiBase::LIMIT_SML2, ApiBase::LIMIT_BIG2 )
+ )
);
-
private $mPrinter, $mModules, $mModuleNames, $mFormats, $mFormatNames;
private $mResult, $mAction, $mShowVersions, $mEnableWrite, $mRequest;
private $mInternalMode, $mSquidMaxage, $mModule;
@@ -130,20 +131,18 @@ class ApiMain extends ApiBase {
private $mCacheControl = array();
/**
- * Constructs an instance of ApiMain that utilizes the module and format specified by $request.
- *
- * @param $request object - if this is an instance of FauxRequest, errors are thrown and no printing occurs
- * @param $enableWrite bool should be set to true if the api may modify data
- */
+ * Constructs an instance of ApiMain that utilizes the module and format specified by $request.
+ *
+ * @param $request WebRequest - if this is an instance of FauxRequest, errors are thrown and no printing occurs
+ * @param $enableWrite bool should be set to true if the api may modify data
+ */
public function __construct( $request, $enableWrite = false ) {
-
$this->mInternalMode = ( $request instanceof FauxRequest );
// Special handling for the main module: $parent === $this
- parent :: __construct( $this, $this->mInternalMode ? 'main_int' : 'main' );
+ parent::__construct( $this, $this->mInternalMode ? 'main_int' : 'main' );
if ( !$this->mInternalMode ) {
-
// Impose module restrictions.
// If the current user cannot read,
// Remove all modules other than login
@@ -158,17 +157,17 @@ class ApiMain extends ApiBase {
}
global $wgAPIModules; // extension modules
- $this->mModules = $wgAPIModules + self :: $Modules;
+ $this->mModules = $wgAPIModules + self::$Modules;
$this->mModuleNames = array_keys( $this->mModules );
- $this->mFormats = self :: $Formats;
+ $this->mFormats = self::$Formats;
$this->mFormatNames = array_keys( $this->mFormats );
$this->mResult = new ApiResult( $this );
$this->mShowVersions = false;
$this->mEnableWrite = $enableWrite;
- $this->mRequest = & $request;
+ $this->mRequest = &$request;
$this->mSquidMaxage = - 1; // flag for executeActionWithErrorHandling()
$this->mCommit = false;
@@ -183,6 +182,7 @@ class ApiMain extends ApiBase {
/**
* Return the request object that contains client's request
+ * @return WebRequest
*/
public function getRequest() {
return $this->mRequest;
@@ -190,6 +190,8 @@ class ApiMain extends ApiBase {
/**
* Get the ApiResult object associated with current request
+ *
+ * @return ApiResult
*/
public function getResult() {
return $this->mResult;
@@ -203,14 +205,12 @@ class ApiMain extends ApiBase {
}
/**
- * Only kept for backwards compatibility
- * @deprecated Use isWriteMode() instead
+ * Get the result formatter object. Only works after setupExecuteAction()
+ *
+ * @return ApiFormatBase
*/
- public function requestWriteMode() {
- if ( !$this->mEnableWrite )
- $this->dieUsageMsg( array( 'writedisabled' ) );
- if ( wfReadOnly() )
- $this->dieUsageMsg( array( 'readonlytext' ) );
+ public function getPrinter() {
+ return $this->mPrinter;
}
/**
@@ -226,31 +226,31 @@ class ApiMain extends ApiBase {
/**
* Set the type of caching headers which will be sent.
*
- * @param $mode One of:
- * - 'public': Cache this object in public caches, if the maxage or smaxage
+ * @param $mode String One of:
+ * - 'public': Cache this object in public caches, if the maxage or smaxage
* parameter is set, or if setCacheMaxAge() was called. If a maximum age is
* not provided by any of these means, the object will be private.
* - 'private': Cache this object only in private client-side caches.
* - 'anon-public-user-private': Make this object cacheable for logged-out
- * users, but private for logged-in users. IMPORTANT: If this is set, it must be
- * set consistently for a given URL, it cannot be set differently depending on
+ * users, but private for logged-in users. IMPORTANT: If this is set, it must be
+ * set consistently for a given URL, it cannot be set differently depending on
* things like the contents of the database, or whether the user is logged in.
*
* If the wiki does not allow anonymous users to read it, the mode set here
- * will be ignored, and private caching headers will always be sent. In other words,
+ * will be ignored, and private caching headers will always be sent. In other words,
* the "public" mode is equivalent to saying that the data sent is as public as a page
* view.
*
- * For user-dependent data, the private mode should generally be used. The
- * anon-public-user-private mode should only be used where there is a particularly
+ * For user-dependent data, the private mode should generally be used. The
+ * anon-public-user-private mode should only be used where there is a particularly
* good performance reason for caching the anonymous response, but where the
- * response to logged-in users may differ, or may contain private data.
+ * response to logged-in users may differ, or may contain private data.
*
* If this function is never called, then the default will be the private mode.
*/
public function setCacheMode( $mode ) {
if ( !in_array( $mode, array( 'private', 'public', 'anon-public-user-private' ) ) ) {
- wfDebug( __METHOD__.": unrecognised cache mode \"$mode\"\n" );
+ wfDebug( __METHOD__ . ": unrecognised cache mode \"$mode\"\n" );
// Ignore for forwards-compatibility
return;
}
@@ -258,18 +258,18 @@ class ApiMain extends ApiBase {
if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
// Private wiki, only private headers
if ( $mode !== 'private' ) {
- wfDebug( __METHOD__.": ignoring request for $mode cache mode, private wiki\n" );
+ wfDebug( __METHOD__ . ": ignoring request for $mode cache mode, private wiki\n" );
return;
}
}
- wfDebug( __METHOD__.": setting cache mode $mode\n" );
+ wfDebug( __METHOD__ . ": setting cache mode $mode\n" );
$this->mCacheMode = $mode;
}
-
+
/**
- * @deprecated Private caching is now the default, so there is usually no
- * need to call this function. If there is a need, you can use
+ * @deprecated Private caching is now the default, so there is usually no
+ * need to call this function. If there is a need, you can use
* $this->setCacheMode('private')
*/
public function setCachePrivate() {
@@ -281,13 +281,13 @@ class ApiMain extends ApiBase {
* Boolean values will be formatted as such, by including or omitting
* without an equals sign.
*
- * Cache control values set here will only be used if the cache mode is not
+ * Cache control values set here will only be used if the cache mode is not
* private, see setCacheMode().
*/
public function setCacheControl( $directives ) {
$this->mCacheControl = $directives + $this->mCacheControl;
}
-
+
/**
* Make sure Vary: Cookie and friends are set. Use this when the output of a request
* may be cached for anons but may not be cached for logged-in users.
@@ -306,8 +306,9 @@ class ApiMain extends ApiBase {
* Create an instance of an output formatter by its name
*/
public function createPrinterByName( $format ) {
- if ( !isset( $this->mFormats[$format] ) )
+ if ( !isset( $this->mFormats[$format] ) ) {
$this->dieUsage( "Unrecognized format: {$format}", 'unknown_format' );
+ }
return new $this->mFormats[$format] ( $this, $format );
}
@@ -316,10 +317,11 @@ class ApiMain extends ApiBase {
*/
public function execute() {
$this->profileIn();
- if ( $this->mInternalMode )
+ if ( $this->mInternalMode ) {
$this->executeAction();
- else
+ } else {
$this->executeActionWithErrorHandling();
+ }
$this->profileOut();
}
@@ -329,7 +331,6 @@ class ApiMain extends ApiBase {
* have been accumulated, and replace it with an error message and a help screen.
*/
protected function executeActionWithErrorHandling() {
-
// In case an error occurs during data output,
// clear the output buffer and print just the error information
ob_start();
@@ -354,10 +355,11 @@ class ApiMain extends ApiBase {
$this->setCacheMode( 'private' );
$headerStr = 'MediaWiki-API-Error: ' . $errCode;
- if ( $e->getCode() === 0 )
+ if ( $e->getCode() === 0 ) {
header( $headerStr );
- else
+ } else {
header( $headerStr, true, $e->getCode() );
+ }
// Reset and print just the error message
ob_clean();
@@ -367,11 +369,11 @@ class ApiMain extends ApiBase {
$this->printResult( true );
}
- // Send cache headers after any code which might generate an error, to
+ // Send cache headers after any code which might generate an error, to
// avoid sending public cache headers for errors.
$this->sendCacheHeaders();
- if ( $this->mPrinter->getIsHtml() ) {
+ if ( $this->mPrinter->getIsHtml() && !$this->mPrinter->isDisabled() ) {
echo wfReportTime();
}
@@ -401,12 +403,6 @@ class ApiMain extends ApiBase {
header( 'Cache-Control: private' );
return;
} // else no XVO and anonymous, send public headers below
- } else /* if public */ {
- // Give a debugging message if the user object is unstubbed on a public request
- global $wgUser;
- if ( !( $wgUser instanceof StubUser ) ) {
- wfDebug( __METHOD__." \$wgUser is unstubbed on a public request!\n" );
- }
}
// If nobody called setCacheMaxAge(), use the (s)maxage parameters
@@ -446,26 +442,28 @@ class ApiMain extends ApiBase {
$separator = ', ';
}
}
-
+
header( "Cache-Control: $ccHeader" );
}
/**
* Replace the result data with the information about an exception.
* Returns the error code
+ * @param $e Exception
*/
protected function substituteResultWithError( $e ) {
-
// Printer may not be initialized if the extractRequestParams() fails for the main module
if ( !isset ( $this->mPrinter ) ) {
// The printer has not been created yet. Try to manually get formatter value.
$value = $this->getRequest()->getVal( 'format', self::API_DEFAULT_FORMAT );
- if ( !in_array( $value, $this->mFormatNames ) )
+ if ( !in_array( $value, $this->mFormatNames ) ) {
$value = self::API_DEFAULT_FORMAT;
+ }
$this->mPrinter = $this->createPrinterByName( $value );
- if ( $this->mPrinter->getNeedsRawData() )
+ if ( $this->mPrinter->getNeedsRawData() ) {
$this->getResult()->setRawMode();
+ }
}
if ( $e instanceof UsageException ) {
@@ -475,8 +473,9 @@ class ApiMain extends ApiBase {
$errMessage = $e->getMessageArray();
// Only print the help message when this is for the developer, not runtime
- if ( $this->mPrinter->getWantsHelp() || $this->mAction == 'help' )
- ApiResult :: setContent( $errMessage, $this->makeHelpMsg() );
+ if ( $this->mPrinter->getWantsHelp() || $this->mAction == 'help' ) {
+ ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
+ }
} else {
global $wgShowSQLErrors, $wgShowExceptionDetails;
@@ -484,37 +483,45 @@ class ApiMain extends ApiBase {
// Something is seriously wrong
//
if ( ( $e instanceof DBQueryError ) && !$wgShowSQLErrors ) {
- $info = "Database query error";
+ $info = 'Database query error';
} else {
$info = "Exception Caught: {$e->getMessage()}";
}
- $errMessage = array (
+ $errMessage = array(
'code' => 'internal_api_error_' . get_class( $e ),
'info' => $info,
);
- ApiResult :: setContent( $errMessage, $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : "" );
+ ApiResult::setContent( $errMessage, $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : '' );
}
$this->getResult()->reset();
$this->getResult()->disableSizeCheck();
// Re-add the id
$requestid = $this->getParameter( 'requestid' );
- if ( !is_null( $requestid ) )
+ if ( !is_null( $requestid ) ) {
$this->getResult()->addValue( null, 'requestid', $requestid );
+ }
+ // servedby is especially useful when debugging errors
+ $this->getResult()->addValue( null, 'servedby', wfHostName() );
$this->getResult()->addValue( null, 'error', $errMessage );
return $errMessage['code'];
}
/**
- * Execute the actual module, without any error handling
+ * Set up for the execution.
*/
- protected function executeAction() {
+ protected function setupExecuteAction() {
// First add the id to the top element
$requestid = $this->getParameter( 'requestid' );
- if ( !is_null( $requestid ) )
+ if ( !is_null( $requestid ) ) {
$this->getResult()->addValue( null, 'requestid', $requestid );
+ }
+ $servedby = $this->getParameter( 'servedby' );
+ if ( $servedby ) {
+ $this->getResult()->addValue( null, 'servedby', wfHostName() );
+ }
$params = $this->extractRequestParams();
@@ -522,19 +529,26 @@ class ApiMain extends ApiBase {
$this->mAction = $params['action'];
if ( !is_string( $this->mAction ) ) {
- $this->dieUsage( "The API requires a valid action parameter", 'unknown_action' );
+ $this->dieUsage( 'The API requires a valid action parameter', 'unknown_action' );
}
-
+
+ return $params;
+ }
+
+ /**
+ * Set up the module for response
+ * @return ApiBase The module that will handle this action
+ */
+ protected function setupModule() {
// Instantiate the module requested by the user
$module = new $this->mModules[$this->mAction] ( $this, $this->mAction );
$this->mModule = $module;
$moduleParams = $module->extractRequestParams();
-
+
// Die if token required, but not provided (unless there is a gettoken parameter)
$salt = $module->getTokenSalt();
- if ( $salt !== false && !isset( $moduleParams['gettoken'] ) )
- {
+ if ( $salt !== false && !isset( $moduleParams['gettoken'] ) ) {
if ( !isset( $moduleParams['token'] ) ) {
$this->dieUsageMsg( array( 'missingparam', 'token' ) );
} else {
@@ -544,7 +558,16 @@ class ApiMain extends ApiBase {
}
}
}
+ return $module;
+ }
+ /**
+ * Check the max lag if necessary
+ * @param $module ApiBase object: Api module being used
+ * @param $params Array an array containing the request parameters.
+ * @return boolean True on success, false should exit immediately
+ */
+ protected function checkMaxLag( $module, $params ) {
if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
// Check for maxlag
global $wgShowHostnames;
@@ -558,36 +581,75 @@ class ApiMain extends ApiBase {
} else {
$this->dieUsage( "Waiting for a database server: $lag seconds lagged", 'maxlag' );
}
- return;
+ return false;
}
}
+ return true;
+ }
+
- global $wgUser, $wgGroupPermissions;
- if ( $module->isReadMode() && !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) && !$wgUser->isAllowed( 'read' ) )
+ /**
+ * Check for sufficient permissions to execute
+ * @param $module ApiBase An Api module
+ */
+ protected function checkExecutePermissions( $module ) {
+ global $wgUser;
+ if ( $module->isReadMode() && !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) &&
+ !$wgUser->isAllowed( 'read' ) )
+ {
$this->dieUsageMsg( array( 'readrequired' ) );
+ }
if ( $module->isWriteMode() ) {
- if ( !$this->mEnableWrite )
+ if ( !$this->mEnableWrite ) {
$this->dieUsageMsg( array( 'writedisabled' ) );
- if ( !$wgUser->isAllowed( 'writeapi' ) )
+ }
+ if ( !$wgUser->isAllowed( 'writeapi' ) ) {
$this->dieUsageMsg( array( 'writerequired' ) );
- if ( wfReadOnly() )
+ }
+ if ( wfReadOnly() ) {
$this->dieReadOnly();
+ }
}
+ }
- if ( !$this->mInternalMode ) {
- // Ignore mustBePosted() for internal calls
- if ( $module->mustBePosted() && !$this->mRequest->wasPosted() )
- $this->dieUsageMsg( array ( 'mustbeposted', $this->mAction ) );
-
- // See if custom printer is used
- $this->mPrinter = $module->getCustomPrinter();
- if ( is_null( $this->mPrinter ) ) {
- // Create an appropriate printer
- $this->mPrinter = $this->createPrinterByName( $params['format'] );
- }
+ /**
+ * Check POST for external response and setup result printer
+ * @param $module ApiBase An Api module
+ * @param $params Array an array with the request parameters
+ */
+ protected function setupExternalResponse( $module, $params ) {
+ // Ignore mustBePosted() for internal calls
+ if ( $module->mustBePosted() && !$this->mRequest->wasPosted() ) {
+ $this->dieUsageMsg( array( 'mustbeposted', $this->mAction ) );
+ }
- if ( $this->mPrinter->getNeedsRawData() )
- $this->getResult()->setRawMode();
+ // See if custom printer is used
+ $this->mPrinter = $module->getCustomPrinter();
+ if ( is_null( $this->mPrinter ) ) {
+ // Create an appropriate printer
+ $this->mPrinter = $this->createPrinterByName( $params['format'] );
+ }
+
+ if ( $this->mPrinter->getNeedsRawData() ) {
+ $this->getResult()->setRawMode();
+ }
+ }
+
+ /**
+ * Execute the actual module, without any error handling
+ */
+ protected function executeAction() {
+ $params = $this->setupExecuteAction();
+ $module = $this->setupModule();
+
+ $this->checkExecutePermissions( $module );
+
+ if ( !$this->checkMaxLag( $module, $params ) ) {
+ return;
+ }
+
+ if ( !$this->mInternalMode ) {
+ $this->setupExternalResponse( $module, $params );
}
// Execute
@@ -610,10 +672,12 @@ class ApiMain extends ApiBase {
$printer = $this->mPrinter;
$printer->profileIn();
- /* If the help message is requested in the default (xmlfm) format,
+ /**
+ * If the help message is requested in the default (xmlfm) format,
* tell the printer not to escape ampersands so that our links do
- * not break. */
- $printer->setUnescapeAmps ( ( $this->mAction == 'help' || $isError )
+ * not break.
+ */
+ $printer->setUnescapeAmps( ( $this->mAction == 'help' || $isError )
&& $printer->getFormat() == 'XML' && $printer->getIsHtml() );
$printer->initPrinter( $isError );
@@ -631,28 +695,29 @@ class ApiMain extends ApiBase {
* See ApiBase for description.
*/
public function getAllowedParams() {
- return array (
- 'format' => array (
- ApiBase :: PARAM_DFLT => ApiMain :: API_DEFAULT_FORMAT,
- ApiBase :: PARAM_TYPE => $this->mFormatNames
+ return array(
+ 'format' => array(
+ ApiBase::PARAM_DFLT => ApiMain::API_DEFAULT_FORMAT,
+ ApiBase::PARAM_TYPE => $this->mFormatNames
),
- 'action' => array (
- ApiBase :: PARAM_DFLT => 'help',
- ApiBase :: PARAM_TYPE => $this->mModuleNames
+ 'action' => array(
+ ApiBase::PARAM_DFLT => 'help',
+ ApiBase::PARAM_TYPE => $this->mModuleNames
),
'version' => false,
- 'maxlag' => array (
- ApiBase :: PARAM_TYPE => 'integer'
+ 'maxlag' => array(
+ ApiBase::PARAM_TYPE => 'integer'
),
- 'smaxage' => array (
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_DFLT => 0
+ 'smaxage' => array(
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_DFLT => 0
),
- 'maxage' => array (
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_DFLT => 0
+ 'maxage' => array(
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_DFLT => 0
),
'requestid' => null,
+ 'servedby' => false,
);
}
@@ -660,14 +725,15 @@ class ApiMain extends ApiBase {
* See ApiBase for description.
*/
public function getParamDescription() {
- return array (
+ return array(
'format' => 'The format of the output',
- 'action' => 'What action you would like to perform',
+ 'action' => 'What action you would like to perform. See below for module help',
'version' => 'When showing help, include version for each module',
'maxlag' => 'Maximum lag',
'smaxage' => 'Set the s-maxage header to this many seconds. Errors are never cached',
'maxage' => 'Set the max-age header to this many seconds. Errors are never cached',
'requestid' => 'Request ID to distinguish requests. This will just be output back to you',
+ 'servedby' => 'Include the hostname that served the request in the results. Unconditionally shown on error',
);
}
@@ -675,25 +741,26 @@ class ApiMain extends ApiBase {
* See ApiBase for description.
*/
public function getDescription() {
- return array (
+ return array(
'',
'',
- '******************************************************************',
- '** **',
- '** This is an auto-generated MediaWiki API documentation page **',
- '** **',
- '** Documentation and Examples: **',
- '** http://www.mediawiki.org/wiki/API **',
- '** **',
- '******************************************************************',
+ '******************************************************************************************',
+ '** **',
+ '** This is an auto-generated MediaWiki API documentation page **',
+ '** **',
+ '** Documentation and Examples: **',
+ '** http://www.mediawiki.org/wiki/API **',
+ '** **',
+ '******************************************************************************************',
'',
- 'Status: All features shown on this page should be working, but the API',
- ' is still in active development, and may change at any time.',
- ' Make sure to monitor our mailing list for any updates.',
+ 'Status: All features shown on this page should be working, but the API',
+ ' is still in active development, and may change at any time.',
+ ' Make sure to monitor our mailing list for any updates',
'',
- 'Documentation: http://www.mediawiki.org/wiki/API',
- 'Mailing list: http://lists.wikimedia.org/mailman/listinfo/mediawiki-api',
- 'Bugs & Requests: http://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts',
+ 'Documentation: http://www.mediawiki.org/wiki/API',
+ 'Mailing list: http://lists.wikimedia.org/mailman/listinfo/mediawiki-api',
+ 'Api Announcements: http://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce',
+ 'Bugs & Requests: http://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts',
'',
'',
'',
@@ -702,14 +769,14 @@ class ApiMain extends ApiBase {
);
}
- public function getPossibleErrors() {
+ public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'readonlytext' ),
array( 'code' => 'unknown_format', 'info' => 'Unrecognized format: format' ),
array( 'code' => 'unknown_action', 'info' => 'The API requires a valid action parameter' ),
array( 'code' => 'maxlag', 'info' => 'Waiting for host: x seconds lagged' ),
array( 'code' => 'maxlag', 'info' => 'Waiting for a database server: x seconds lagged' ),
- ) );
+ ) );
}
/**
@@ -728,74 +795,83 @@ class ApiMain extends ApiBase {
'or file a bug report at http://bugzilla.wikimedia.org/'
);
}
+ /**
+ * Sets whether the pretty-printer should format *bold* and $italics$
+ */
+ public function setHelp( $help = true ) {
+ $this->mPrinter->setHelp( $help );
+ }
/**
* Override the parent to generate help messages for all available modules.
*/
public function makeHelpMsg() {
global $wgMemc, $wgAPICacheHelp, $wgAPICacheHelpTimeout;
- $this->mPrinter->setHelp();
+ $this->setHelp();
// Get help text from cache if present
$key = wfMemcKey( 'apihelp', $this->getModuleName(),
SpecialVersion::getVersion( 'nodb' ) .
$this->getMain()->getShowVersions() );
if ( $wgAPICacheHelp ) {
$cached = $wgMemc->get( $key );
- if ( $cached )
+ if ( $cached ) {
return $cached;
+ }
}
$retval = $this->reallyMakeHelpMsg();
- if ( $wgAPICacheHelp )
+ if ( $wgAPICacheHelp ) {
$wgMemc->set( $key, $retval, $wgAPICacheHelpTimeout );
+ }
return $retval;
}
public function reallyMakeHelpMsg() {
-
- $this->mPrinter->setHelp();
+ $this->setHelp();
// Use parent to make default message for the main module
- $msg = parent :: makeHelpMsg();
+ $msg = parent::makeHelpMsg();
$astriks = str_repeat( '*** ', 10 );
$msg .= "\n\n$astriks Modules $astriks\n\n";
- foreach ( $this->mModules as $moduleName => $unused ) {
+ foreach ( array_keys( $this->mModules ) as $moduleName ) {
$module = new $this->mModules[$moduleName] ( $this, $moduleName );
$msg .= self::makeHelpMsgHeader( $module, 'action' );
$msg2 = $module->makeHelpMsg();
- if ( $msg2 !== false )
+ if ( $msg2 !== false ) {
$msg .= $msg2;
+ }
$msg .= "\n";
}
$msg .= "\n$astriks Permissions $astriks\n\n";
- foreach ( self :: $mRights as $right => $rightMsg ) {
+ foreach ( self::$mRights as $right => $rightMsg ) {
$groups = User::getGroupsWithPermission( $right );
$msg .= "* " . $right . " *\n " . wfMsgReplaceArgs( $rightMsg[ 'msg' ], $rightMsg[ 'params' ] ) .
- "\nGranted to:\n " . str_replace( "*", "all", implode( ", ", $groups ) ) . "\n";
+ "\nGranted to:\n " . str_replace( '*', 'all', implode( ', ', $groups ) ) . "\n\n";
}
$msg .= "\n$astriks Formats $astriks\n\n";
- foreach ( $this->mFormats as $formatName => $unused ) {
+ foreach ( array_keys( $this->mFormats ) as $formatName ) {
$module = $this->createPrinterByName( $formatName );
$msg .= self::makeHelpMsgHeader( $module, 'format' );
$msg2 = $module->makeHelpMsg();
- if ( $msg2 !== false )
+ if ( $msg2 !== false ) {
$msg .= $msg2;
+ }
$msg .= "\n";
}
$msg .= "\n*** Credits: ***\n " . implode( "\n ", $this->getCredits() ) . "\n";
-
return $msg;
}
public static function makeHelpMsgHeader( $module, $paramName ) {
$modulePrefix = $module->getModulePrefix();
- if ( strval( $modulePrefix ) !== '' )
+ if ( strval( $modulePrefix ) !== '' ) {
$modulePrefix = "($modulePrefix) ";
+ }
return "* $paramName={$module->getModuleName()} $modulePrefix*";
}
@@ -809,7 +885,7 @@ class ApiMain extends ApiBase {
* OBSOLETE, use canApiHighLimits() instead
*/
public function isBot() {
- if ( !isset ( $this->mIsBot ) ) {
+ if ( !isset( $this->mIsBot ) ) {
global $wgUser;
$this->mIsBot = $wgUser->isAllowed( 'bot' );
}
@@ -822,7 +898,7 @@ class ApiMain extends ApiBase {
* OBSOLETE, use canApiHighLimits() instead
*/
public function isSysop() {
- if ( !isset ( $this->mIsSysop ) ) {
+ if ( !isset( $this->mIsSysop ) ) {
global $wgUser;
$this->mIsSysop = in_array( 'sysop', $wgUser->getGroups() );
}
@@ -858,10 +934,10 @@ class ApiMain extends ApiBase {
public function getVersion() {
$vers = array ();
$vers[] = 'MediaWiki: ' . SpecialVersion::getVersion() . "\n http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/";
- $vers[] = __CLASS__ . ': $Id: ApiMain.php 70066 2010-07-28 05:52:32Z tstarling $';
- $vers[] = ApiBase :: getBaseVersion();
- $vers[] = ApiFormatBase :: getBaseVersion();
- $vers[] = ApiQueryBase :: getBaseVersion();
+ $vers[] = __CLASS__ . ': $Id: ApiMain.php 76196 2010-11-06 16:11:19Z reedy $';
+ $vers[] = ApiBase::getBaseVersion();
+ $vers[] = ApiFormatBase::getBaseVersion();
+ $vers[] = ApiQueryBase::getBaseVersion();
return $vers;
}
@@ -870,7 +946,6 @@ class ApiMain extends ApiBase {
* classes who wish to add their own modules to their lexicon or override the
* behavior of inherent ones.
*
- * @access protected
* @param $mdlName String The identifier for this module.
* @param $mdlClass String The class where this module is implemented.
*/
@@ -882,7 +957,6 @@ class ApiMain extends ApiBase {
* Add or overwrite an output format for this ApiMain. Intended for use by extending
* classes who wish to add to or modify current formatters.
*
- * @access protected
* @param $fmtName The identifier for this format.
* @param $fmtClass The class implementing this format.
*/
@@ -910,22 +984,26 @@ class UsageException extends Exception {
private $mExtraData;
public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
- parent :: __construct( $message, $code );
+ parent::__construct( $message, $code );
$this->mCodestr = $codestr;
$this->mExtraData = $extradata;
}
+
public function getCodeString() {
return $this->mCodestr;
}
+
public function getMessageArray() {
- $result = array (
- 'code' => $this->mCodestr,
- 'info' => $this->getMessage()
+ $result = array(
+ 'code' => $this->mCodestr,
+ 'info' => $this->getMessage()
);
- if ( is_array( $this->mExtraData ) )
+ if ( is_array( $this->mExtraData ) ) {
$result = array_merge( $result, $this->mExtraData );
+ }
return $result;
}
+
public function __toString() {
return "{$this->getCodeString()}: {$this->getMessage()}";
}
diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php
index c234f084..a93188bf 100644
--- a/includes/api/ApiMove.php
+++ b/includes/api/ApiMove.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on Oct 31, 2007
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Oct 31, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,55 +18,57 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
-
/**
+ * API Module to move pages
* @ingroup API
*/
class ApiMove extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
global $wgUser;
$params = $this->extractRequestParams();
- if ( is_null( $params['reason'] ) )
+ if ( is_null( $params['reason'] ) ) {
$params['reason'] = '';
+ }
$this->requireOnlyOneParameter( $params, 'from', 'fromid' );
- if ( !isset( $params['to'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'to' ) );
- if ( isset( $params['from'] ) )
- {
+ if ( isset( $params['from'] ) ) {
$fromTitle = Title::newFromText( $params['from'] );
- if ( !$fromTitle )
+ if ( !$fromTitle ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['from'] ) );
- }
- else if ( isset( $params['fromid'] ) )
- {
+ }
+ } elseif ( isset( $params['fromid'] ) ) {
$fromTitle = Title::newFromID( $params['fromid'] );
- if ( !$fromTitle )
+ if ( !$fromTitle ) {
$this->dieUsageMsg( array( 'nosuchpageid', $params['fromid'] ) );
+ }
}
- if ( !$fromTitle->exists() )
+ if ( !$fromTitle->exists() ) {
$this->dieUsageMsg( array( 'notanarticle' ) );
+ }
$fromTalk = $fromTitle->getTalkPage();
$toTitle = Title::newFromText( $params['to'] );
- if ( !$toTitle )
+ if ( !$toTitle ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['to'] ) );
+ }
$toTalk = $toTitle->getTalkPage();
if ( $toTitle->getNamespace() == NS_FILE
@@ -81,27 +83,24 @@ class ApiMove extends ApiBase {
}
// Move the page
- $hookErr = null;
$retval = $fromTitle->moveTo( $toTitle, true, $params['reason'], !$params['noredirect'] );
- if ( $retval !== true )
+ if ( $retval !== true ) {
$this->dieUsageMsg( reset( $retval ) );
+ }
$r = array( 'from' => $fromTitle->getPrefixedText(), 'to' => $toTitle->getPrefixedText(), 'reason' => $params['reason'] );
- if ( !$params['noredirect'] || !$wgUser->isAllowed( 'suppressredirect' ) )
+ if ( !$params['noredirect'] || !$wgUser->isAllowed( 'suppressredirect' ) ) {
$r['redirectcreated'] = '';
+ }
// Move the talk page
- if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() )
- {
+ if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
$retval = $fromTalk->moveTo( $toTalk, true, $params['reason'], !$params['noredirect'] );
- if ( $retval === true )
- {
+ if ( $retval === true ) {
$r['talkfrom'] = $fromTalk->getPrefixedText();
$r['talkto'] = $toTalk->getPrefixedText();
- }
- // We're not gonna dieUsage() on failure, since we already changed something
- else
- {
+ } else {
+ // We're not gonna dieUsage() on failure, since we already changed something
$parsed = $this->parseMsg( reset( $retval ) );
$r['talkmove-error-code'] = $parsed['code'];
$r['talkmove-error-info'] = $parsed['info'];
@@ -109,51 +108,49 @@ class ApiMove extends ApiBase {
}
// Move subpages
- if ( $params['movesubpages'] )
- {
+ if ( $params['movesubpages'] ) {
$r['subpages'] = $this->moveSubpages( $fromTitle, $toTitle,
$params['reason'], $params['noredirect'] );
$this->getResult()->setIndexedTagName( $r['subpages'], 'subpage' );
- if ( $params['movetalk'] )
- {
+ if ( $params['movetalk'] ) {
$r['subpages-talk'] = $this->moveSubpages( $fromTalk, $toTalk,
$params['reason'], $params['noredirect'] );
$this->getResult()->setIndexedTagName( $r['subpages-talk'], 'subpage' );
}
}
- // Watch pages
- if ( $params['watch'] || $wgUser->getOption( 'watchmoves' ) )
- {
- $wgUser->addWatch( $fromTitle );
- $wgUser->addWatch( $toTitle );
- }
- else if ( $params['unwatch'] )
- {
- $wgUser->removeWatch( $fromTitle );
- $wgUser->removeWatch( $toTitle );
+ $watch = "preferences";
+ if ( isset( $params['watchlist'] ) ) {
+ $watch = $params['watchlist'];
+ } elseif ( $params['watch'] ) {
+ $watch = 'watch';
+ } elseif ( $params['unwatch'] ) {
+ $watch = 'unwatch';
}
+
+ // Watch pages
+ $this->setWatch( $watch, $fromTitle, 'watchmoves' );
+ $this->setWatch( $watch, $toTitle, 'watchmoves' );
+
$this->getResult()->addValue( null, $this->getModuleName(), $r );
}
- public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect )
- {
+ public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect ) {
$retval = array();
$success = $fromTitle->moveSubpages( $toTitle, true, $reason, !$noredirect );
- if ( isset( $success[0] ) )
+ if ( isset( $success[0] ) ) {
return array( 'error' => $this->parseMsg( $success ) );
- else
- {
+ } else {
// At least some pages could be moved
// Report each of them separately
- foreach ( $success as $oldTitle => $newTitle )
- {
+ foreach ( $success as $oldTitle => $newTitle ) {
$r = array( 'from' => $oldTitle );
- if ( is_array( $newTitle ) )
+ if ( is_array( $newTitle ) ) {
$r['error'] = $this->parseMsg( reset( $newTitle ) );
- else
+ } else {
// Success
$r['to'] = $newTitle;
+ }
$retval[] = $r;
}
}
@@ -169,48 +166,65 @@ class ApiMove extends ApiBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'from' => null,
'fromid' => array(
ApiBase::PARAM_TYPE => 'integer'
),
- 'to' => null,
+ 'to' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'token' => null,
'reason' => null,
'movetalk' => false,
'movesubpages' => false,
'noredirect' => false,
- 'watch' => false,
- 'unwatch' => false,
+ 'watch' => array(
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
+ ),
+ 'unwatch' => array(
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
+ ),
+ 'watchlist' => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
+ 'watch',
+ 'unwatch',
+ 'preferences',
+ 'nochange'
+ ),
+ ),
'ignorewarnings' => false
);
}
public function getParamDescription() {
- return array (
- 'from' => 'Title of the page you want to move. Cannot be used together with fromid.',
- 'fromid' => 'Page ID of the page you want to move. Cannot be used together with from.',
- 'to' => 'Title you want to rename the page to.',
+ $p = $this->getModulePrefix();
+ return array(
+ 'from' => "Title of the page you want to move. Cannot be used together with {$p}fromid",
+ 'fromid' => "Page ID of the page you want to move. Cannot be used together with {$p}from",
+ 'to' => 'Title you want to rename the page to',
'token' => 'A move token previously retrieved through prop=info',
- 'reason' => 'Reason for the move (optional).',
- 'movetalk' => 'Move the talk page, if it exists.',
+ 'reason' => 'Reason for the move (optional)',
+ 'movetalk' => 'Move the talk page, if it exists',
'movesubpages' => 'Move subpages, if applicable',
'noredirect' => 'Don\'t create a redirect',
'watch' => 'Add the page and the redirect to your watchlist',
'unwatch' => 'Remove the page and the redirect from your watchlist',
+ 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
'ignorewarnings' => 'Ignore any warnings'
);
}
public function getDescription() {
- return array(
- 'Move a page.'
- );
+ return 'Move a page';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'to' ),
array( 'invalidtitle', 'from' ),
array( 'nosuchpageid', 'fromid' ),
array( 'notanarticle' ),
@@ -228,12 +242,12 @@ class ApiMove extends ApiBase {
}
protected function getExamples() {
- return array (
- 'api.php?action=move&from=Exampel&to=Example&token=123ABC&reason=Misspelled%20title&movetalk&noredirect'
+ return array(
+ 'api.php?action=move&from=Exampel&to=Example&token=123ABC&reason=Misspelled%20title&movetalk=&noredirect='
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiMove.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiMove.php 77192 2010-11-23 22:05:27Z btongminh $';
}
}
diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php
index e145d80c..885766d2 100644
--- a/includes/api/ApiOpenSearch.php
+++ b/includes/api/ApiOpenSearch.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 13, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -34,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiOpenSearch extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function getCustomPrinter() {
@@ -50,44 +51,63 @@ class ApiOpenSearch extends ApiBase {
$suggest = $params['suggest'];
// MWSuggest or similar hit
- if ( $suggest && !$wgEnableOpenSearchSuggest )
- $srchres = array();
- else {
- // Open search results may be stored for a very long
- // time
+ if ( $suggest && !$wgEnableOpenSearchSuggest ) {
+ $searches = array();
+ } else {
+ // Open search results may be stored for a very long time
$this->getMain()->setCacheMaxAge( $wgSearchSuggestCacheExpiry );
$this->getMain()->setCacheMode( 'public' );
- $srchres = PrefixSearch::titleSearch( $search, $limit,
+ $searches = PrefixSearch::titleSearch( $search, $limit,
$namespaces );
+
+ // if the content language has variants, try to retrieve fallback results
+ $fallbackLimit = $limit - count( $searches );
+ if ( $fallbackLimit > 0 ) {
+ global $wgContLang;
+
+ $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search );
+ $fallbackSearches = array_diff( array_unique( $fallbackSearches ), array( $search ) );
+
+ foreach ( $fallbackSearches as $fbs ) {
+ $fallbackSearchResult = PrefixSearch::titleSearch( $fbs, $fallbackLimit,
+ $namespaces );
+ $searches = array_merge( $searches, $fallbackSearchResult );
+ $fallbackLimit -= count( $fallbackSearchResult );
+
+ if ( $fallbackLimit == 0 ) {
+ break;
+ }
+ }
+ }
}
// Set top level elements
$result = $this->getResult();
$result->addValue( null, 0, $search );
- $result->addValue( null, 1, $srchres );
+ $result->addValue( null, 1, $searches );
}
public function getAllowedParams() {
- return array (
+ return array(
'search' => null,
'limit' => array(
- ApiBase :: PARAM_DFLT => 10,
- ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => 100,
- ApiBase :: PARAM_MAX2 => 100
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => 100,
+ ApiBase::PARAM_MAX2 => 100
),
'namespace' => array(
- ApiBase :: PARAM_DFLT => NS_MAIN,
- ApiBase :: PARAM_TYPE => 'namespace',
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_DFLT => NS_MAIN,
+ ApiBase::PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_ISMULTI => true
),
'suggest' => false,
);
}
public function getParamDescription() {
- return array (
+ return array(
'search' => 'Search string',
'limit' => 'Maximum amount of results to return',
'namespace' => 'Namespaces to search',
@@ -100,12 +120,12 @@ class ApiOpenSearch extends ApiBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=opensearch&search=Te'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiOpenSearch.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiOpenSearch.php 79720 2011-01-06 14:48:34Z catrope $';
}
}
diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php
index 361f1d8b..1cb12c07 100644
--- a/includes/api/ApiPageSet.php
+++ b/includes/api/ApiPageSet.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 24, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 24, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -45,9 +46,10 @@ class ApiPageSet extends ApiQueryBase {
private $mAllPages; // [ns][dbkey] => page_id or negative when missing
private $mTitles, $mGoodTitles, $mMissingTitles, $mInvalidTitles;
- private $mMissingPageIDs, $mRedirectTitles;
+ private $mMissingPageIDs, $mRedirectTitles, $mSpecialTitles;
private $mNormalizedTitles, $mInterwikiTitles;
private $mResolveRedirects, $mPendingRedirectIDs;
+ private $mConvertTitles, $mConvertedTitles;
private $mGoodRevIDs, $mMissingRevIDs;
private $mFakePageId;
@@ -58,25 +60,30 @@ class ApiPageSet extends ApiQueryBase {
* @param $query ApiQuery
* @param $resolveRedirects bool Whether redirects should be resolved
*/
- public function __construct( $query, $resolveRedirects = false ) {
- parent :: __construct( $query, 'query' );
+ public function __construct( $query, $resolveRedirects = false, $convertTitles = false ) {
+ parent::__construct( $query, 'query' );
- $this->mAllPages = array ();
+ $this->mAllPages = array();
$this->mTitles = array();
- $this->mGoodTitles = array ();
- $this->mMissingTitles = array ();
- $this->mInvalidTitles = array ();
- $this->mMissingPageIDs = array ();
- $this->mRedirectTitles = array ();
- $this->mNormalizedTitles = array ();
- $this->mInterwikiTitles = array ();
+ $this->mGoodTitles = array();
+ $this->mMissingTitles = array();
+ $this->mInvalidTitles = array();
+ $this->mMissingPageIDs = array();
+ $this->mRedirectTitles = array();
+ $this->mNormalizedTitles = array();
+ $this->mInterwikiTitles = array();
$this->mGoodRevIDs = array();
$this->mMissingRevIDs = array();
+ $this->mSpecialTitles = array();
- $this->mRequestedPageFields = array ();
+ $this->mRequestedPageFields = array();
$this->mResolveRedirects = $resolveRedirects;
- if ( $resolveRedirects )
+ if ( $resolveRedirects ) {
$this->mPendingRedirectIDs = array();
+ }
+
+ $this->mConvertTitles = $convertTitles;
+ $this->mConvertedTitles = array();
$this->mFakePageId = - 1;
}
@@ -117,14 +124,15 @@ class ApiPageSet extends ApiQueryBase {
public function getPageTableFields() {
// Ensure we get minimum required fields
// DON'T change this order
- $pageFlds = array (
+ $pageFlds = array(
'page_namespace' => null,
'page_title' => null,
'page_id' => null,
);
- if ( $this->mResolveRedirects )
+ if ( $this->mResolveRedirects ) {
$pageFlds['page_is_redirect'] = null;
+ }
// only store non-default fields
$this->mRequestedPageFields = array_diff_key( $this->mRequestedPageFields, $pageFlds );
@@ -220,6 +228,15 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Get a list of title conversions - maps a title to its converted
+ * version.
+ * @return array raw_prefixed_title (string) => prefixed_title (string)
+ */
+ public function getConvertedTitles() {
+ return $this->mConvertedTitles;
+ }
+
+ /**
* Get a list of interwiki titles - maps a title to its interwiki
* prefix.
* @return array raw_prefixed_title (string) => interwiki_prefix (string)
@@ -245,6 +262,14 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Get the list of titles with negative namespace
+ * @return array Title
+ */
+ public function getSpecialTitles() {
+ return $this->mSpecialTitles;
+ }
+
+ /**
* Returns the number of revisions (requested with revids= parameter)\
* @return int
*/
@@ -261,34 +286,38 @@ class ApiPageSet extends ApiQueryBase {
// Only one of the titles/pageids/revids is allowed at the same time
$dataSource = null;
- if ( isset ( $params['titles'] ) )
+ if ( isset( $params['titles'] ) ) {
$dataSource = 'titles';
- if ( isset ( $params['pageids'] ) ) {
- if ( isset ( $dataSource ) )
+ }
+ if ( isset( $params['pageids'] ) ) {
+ if ( isset( $dataSource ) ) {
$this->dieUsage( "Cannot use 'pageids' at the same time as '$dataSource'", 'multisource' );
+ }
$dataSource = 'pageids';
}
- if ( isset ( $params['revids'] ) ) {
- if ( isset ( $dataSource ) )
+ if ( isset( $params['revids'] ) ) {
+ if ( isset( $dataSource ) ) {
$this->dieUsage( "Cannot use 'revids' at the same time as '$dataSource'", 'multisource' );
+ }
$dataSource = 'revids';
}
switch ( $dataSource ) {
- case 'titles' :
+ case 'titles':
$this->initFromTitles( $params['titles'] );
break;
- case 'pageids' :
+ case 'pageids':
$this->initFromPageIds( $params['pageids'] );
break;
- case 'revids' :
- if ( $this->mResolveRedirects )
+ case 'revids':
+ if ( $this->mResolveRedirects ) {
$this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
'Any redirects the revids= point to have not been resolved.' );
+ }
$this->mResolveRedirects = false;
$this->initFromRevIDs( $params['revids'] );
break;
- default :
+ default:
// Do nothing - some queries do not need any of the data sources.
break;
}
@@ -318,7 +347,7 @@ class ApiPageSet extends ApiQueryBase {
/**
* Populate this PageSet from a rowset returned from the database
* @param $db Database object
- * @param $queryResult Query result object
+ * @param $queryResult ResultWrapper Query result object
*/
public function populateFromQueryResult( $db, $queryResult ) {
$this->profileIn();
@@ -341,9 +370,8 @@ class ApiPageSet extends ApiQueryBase {
* @param $row Result row
*/
public function processDbRow( $row ) {
-
// Store Title object in various data structures
- $title = Title :: makeTitle( $row->page_namespace, $row->page_title );
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
$pageId = intval( $row->page_id );
$this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
@@ -355,8 +383,9 @@ class ApiPageSet extends ApiQueryBase {
$this->mGoodTitles[$pageId] = $title;
}
- foreach ( $this->mRequestedPageFields as $fieldName => & $fieldValues )
+ foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
$fieldValues[$pageId] = $row-> $fieldName;
+ }
}
/**
@@ -385,11 +414,11 @@ class ApiPageSet extends ApiQueryBase {
* @param $titles array of Title objects or strings
*/
private function initFromTitles( $titles ) {
-
// Get validated and normalized title objects
$linkBatch = $this->processTitlesArray( $titles );
- if ( $linkBatch->isEmpty() )
+ if ( $linkBatch->isEmpty() ) {
return;
+ }
$db = $this->getDB();
$set = $linkBatch->constructSet( 'page', $db );
@@ -401,7 +430,7 @@ class ApiPageSet extends ApiQueryBase {
$this->profileDBOut();
// Hack: get the ns:titles stored in array(ns => array(titles)) format
- $this->initFromQueryResult( $db, $res, $linkBatch->data, true ); // process Titles
+ $this->initFromQueryResult( $db, $res, $linkBatch->data, true ); // process Titles
// Resolve any found redirects
$this->resolvePendingRedirects();
@@ -412,11 +441,12 @@ class ApiPageSet extends ApiQueryBase {
* @param $pageids array of page IDs
*/
private function initFromPageIds( $pageids ) {
- if ( !count( $pageids ) )
+ if ( !count( $pageids ) ) {
return;
+ }
$pageids = array_map( 'intval', $pageids ); // paranoia
- $set = array (
+ $set = array(
'page_id' => $pageids
);
$db = $this->getDB();
@@ -438,7 +468,7 @@ class ApiPageSet extends ApiQueryBase {
* Iterate through the result of the query on 'page' table,
* and for each row create and store title object and save any extra fields requested.
* @param $db Database
- * @param $res DB Query result
+ * @param $res ResultWrapper DB Query result
* @param $remaining array of either pageID or ns/title elements (optional).
* If given, any missing items will go to $mMissingPageIDs and $mMissingTitles
* @param $processTitles bool Must be provided together with $remaining.
@@ -446,47 +476,46 @@ class ApiPageSet extends ApiQueryBase {
* If false, treat it as an array of [pageIDs]
*/
private function initFromQueryResult( $db, $res, &$remaining = null, $processTitles = null ) {
- if ( !is_null( $remaining ) && is_null( $processTitles ) )
- ApiBase :: dieDebug( __METHOD__, 'Missing $processTitles parameter when $remaining is provided' );
-
- while ( $row = $db->fetchObject( $res ) ) {
+ if ( !is_null( $remaining ) && is_null( $processTitles ) ) {
+ ApiBase::dieDebug( __METHOD__, 'Missing $processTitles parameter when $remaining is provided' );
+ }
+ foreach ( $res as $row ) {
$pageId = intval( $row->page_id );
// Remove found page from the list of remaining items
if ( isset( $remaining ) ) {
- if ( $processTitles )
- unset ( $remaining[$row->page_namespace][$row->page_title] );
- else
- unset ( $remaining[$pageId] );
+ if ( $processTitles ) {
+ unset( $remaining[$row->page_namespace][$row->page_title] );
+ } else {
+ unset( $remaining[$pageId] );
+ }
}
// Store any extra fields requested by modules
$this->processDbRow( $row );
}
- $db->freeResult( $res );
if ( isset( $remaining ) ) {
// Any items left in the $remaining list are added as missing
if ( $processTitles ) {
// The remaining titles in $remaining are non-existent pages
foreach ( $remaining as $ns => $dbkeys ) {
- foreach ( $dbkeys as $dbkey => $unused ) {
- $title = Title :: makeTitle( $ns, $dbkey );
+ foreach ( array_keys( $dbkeys ) as $dbkey ) {
+ $title = Title::makeTitle( $ns, $dbkey );
$this->mAllPages[$ns][$dbkey] = $this->mFakePageId;
$this->mMissingTitles[$this->mFakePageId] = $title;
$this->mFakePageId--;
$this->mTitles[] = $title;
}
}
- }
- else
- {
+ } else {
// The remaining pageids do not exist
- if ( !$this->mMissingPageIDs )
+ if ( !$this->mMissingPageIDs ) {
$this->mMissingPageIDs = array_keys( $remaining );
- else
+ } else {
$this->mMissingPageIDs = array_merge( $this->mMissingPageIDs, array_keys( $remaining ) );
+ }
}
}
}
@@ -497,9 +526,9 @@ class ApiPageSet extends ApiQueryBase {
* @param $revids array of revision IDs
*/
private function initFromRevIDs( $revids ) {
-
- if ( !count( $revids ) )
+ if ( !count( $revids ) ) {
return;
+ }
$revids = array_map( 'intval', $revids ); // paranoia
$db = $this->getDB();
@@ -513,14 +542,13 @@ class ApiPageSet extends ApiQueryBase {
// Get pageIDs data from the `page` table
$this->profileDBIn();
$res = $db->select( $tables, $fields, $where, __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$revid = intval( $row->rev_id );
$pageid = intval( $row->rev_page );
$this->mGoodRevIDs[$revid] = $pageid;
$pageids[$pageid] = '';
unset( $remaining[$revid] );
}
- $db->freeResult( $res );
$this->profileDBOut();
$this->mMissingRevIDs = array_keys( $remaining );
@@ -535,7 +563,6 @@ class ApiPageSet extends ApiQueryBase {
* have been resolved.
*/
private function resolvePendingRedirects() {
-
if ( $this->mResolveRedirects ) {
$db = $this->getDB();
$pageFlds = $this->getPageTableFields();
@@ -543,17 +570,18 @@ class ApiPageSet extends ApiQueryBase {
// Repeat until all redirects have been resolved
// The infinite loop is prevented by keeping all known pages in $this->mAllPages
while ( $this->mPendingRedirectIDs ) {
-
// Resolve redirects by querying the pagelinks table, and repeat the process
// Create a new linkBatch object for the next pass
$linkBatch = $this->getRedirectTargets();
- if ( $linkBatch->isEmpty() )
+ if ( $linkBatch->isEmpty() ) {
break;
+ }
$set = $linkBatch->constructSet( 'page', $db );
- if ( $set === false )
+ if ( $set === false ) {
break;
+ }
// Get pageIDs data from the `page` table
$this->profileDBIn();
@@ -578,7 +606,9 @@ class ApiPageSet extends ApiQueryBase {
$db = $this->getDB();
$this->profileDBIn();
- $res = $db->select( 'redirect', array(
+ $res = $db->select(
+ 'redirect',
+ array(
'rd_from',
'rd_namespace',
'rd_title'
@@ -587,28 +617,27 @@ class ApiPageSet extends ApiQueryBase {
);
$this->profileDBOut();
- while ( $row = $db->fetchObject( $res ) )
- {
+ foreach ( $res as $row ) {
$rdfrom = intval( $row->rd_from );
$from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
$to = Title::makeTitle( $row->rd_namespace, $row->rd_title )->getPrefixedText();
unset( $this->mPendingRedirectIDs[$rdfrom] );
- if ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) )
+ if ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
$lb->add( $row->rd_namespace, $row->rd_title );
+ }
$this->mRedirectTitles[$from] = $to;
}
- $db->freeResult( $res );
- if ( $this->mPendingRedirectIDs )
- {
+
+ if ( $this->mPendingRedirectIDs ) {
// We found pages that aren't in the redirect table
// Add them
- foreach ( $this->mPendingRedirectIDs as $id => $title )
- {
+ foreach ( $this->mPendingRedirectIDs as $id => $title ) {
$article = new Article( $title );
$rt = $article->insertRedirect();
- if ( !$rt )
+ if ( !$rt ) {
// What the hell. Let's just ignore this
continue;
+ }
$lb->addObj( $rt );
$this->mRedirectTitles[$title->getPrefixedText()] = $rt->getPrefixedText();
unset( $this->mPendingRedirectIDs[$id] );
@@ -627,31 +656,45 @@ class ApiPageSet extends ApiQueryBase {
* @return LinkBatch
*/
private function processTitlesArray( $titles ) {
-
$linkBatch = new LinkBatch();
foreach ( $titles as $title ) {
-
- $titleObj = is_string( $title ) ? Title :: newFromText( $title ) : $title;
- if ( !$titleObj )
- {
+ $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title;
+ if ( !$titleObj ) {
// Handle invalid titles gracefully
$this->mAllpages[0][$title] = $this->mFakePageId;
$this->mInvalidTitles[$this->mFakePageId] = $title;
$this->mFakePageId--;
continue; // There's nothing else we can do
}
+ $unconvertedTitle = $titleObj->getPrefixedText();
+ $titleWasConverted = false;
$iw = $titleObj->getInterwiki();
if ( strval( $iw ) !== '' ) {
// This title is an interwiki link.
$this->mInterwikiTitles[$titleObj->getPrefixedText()] = $iw;
} else {
+ // Variants checking
+ global $wgContLang;
+ if ( $this->mConvertTitles &&
+ count( $wgContLang->getVariants() ) > 1 &&
+ !$titleObj->exists() ) {
+ // Language::findVariantLink will modify titleObj into
+ // the canonical variant if possible
+ $wgContLang->findVariantLink( $title, $titleObj );
+ $titleWasConverted = $unconvertedTitle !== $titleObj->getPrefixedText();
+ }
+
- // Validation
- if ( $titleObj->getNamespace() < 0 )
- $this->setWarning( "No support for special pages has been implemented" );
- else
+ if ( $titleObj->getNamespace() < 0 ) {
+ // Handle Special and Media pages
+ $titleObj = $titleObj->fixSpecialName();
+ $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+ $this->mFakePageId--;
+ } else {
+ // Regular page
$linkBatch->addObj( $titleObj );
+ }
}
// Make sure we remember the original title that was
@@ -659,7 +702,9 @@ class ApiPageSet extends ApiQueryBase {
// titles with the originally requested when e.g. the
// namespace is localized or the capitalization is
// different
- if ( is_string( $title ) && $title !== $titleObj->getPrefixedText() ) {
+ if ( $titleWasConverted ) {
+ $this->mConvertedTitles[$title] = $titleObj->getPrefixedText();
+ } elseif ( is_string( $title ) && $title !== $titleObj->getPrefixedText() ) {
$this->mNormalizedTitles[$title] = $titleObj->getPrefixedText();
}
}
@@ -668,23 +713,23 @@ class ApiPageSet extends ApiQueryBase {
}
protected function getAllowedParams() {
- return array (
- 'titles' => array (
- ApiBase :: PARAM_ISMULTI => true
+ return array(
+ 'titles' => array(
+ ApiBase::PARAM_ISMULTI => true
),
- 'pageids' => array (
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_ISMULTI => true
+ 'pageids' => array(
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_ISMULTI => true
),
- 'revids' => array (
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_ISMULTI => true
+ 'revids' => array(
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_ISMULTI => true
)
);
}
protected function getParamDescription() {
- return array (
+ return array(
'titles' => 'A list of titles to work on',
'pageids' => 'A list of page IDs to work on',
'revids' => 'A list of revision IDs to work on'
@@ -699,6 +744,6 @@ class ApiPageSet extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiPageSet.php 62410 2010-02-13 01:21:52Z reedy $';
+ return __CLASS__ . ': $Id: ApiPageSet.php 76196 2010-11-06 16:11:19Z reedy $';
}
}
diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php
index 8fe2cad2..a2c0bd11 100644
--- a/includes/api/ApiParamInfo.php
+++ b/includes/api/ApiParamInfo.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Dec 01, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Dec 01, 2007
+ *
+ * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -34,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiParamInfo extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
@@ -43,14 +44,11 @@ class ApiParamInfo extends ApiBase {
$result = $this->getResult();
$queryObj = new ApiQuery( $this->getMain(), 'query' );
$r = array();
- if ( is_array( $params['modules'] ) )
- {
+ if ( is_array( $params['modules'] ) ) {
$modArr = $this->getMain()->getModules();
$r['modules'] = array();
- foreach ( $params['modules'] as $m )
- {
- if ( !isset( $modArr[$m] ) )
- {
+ foreach ( $params['modules'] as $m ) {
+ if ( !isset( $modArr[$m] ) ) {
$r['modules'][] = array( 'name' => $m, 'missing' => '' );
continue;
}
@@ -61,14 +59,11 @@ class ApiParamInfo extends ApiBase {
}
$result->setIndexedTagName( $r['modules'], 'module' );
}
- if ( is_array( $params['querymodules'] ) )
- {
+ if ( is_array( $params['querymodules'] ) ) {
$qmodArr = $queryObj->getModules();
$r['querymodules'] = array();
- foreach ( $params['querymodules'] as $qm )
- {
- if ( !isset( $qmodArr[$qm] ) )
- {
+ foreach ( $params['querymodules'] as $qm ) {
+ if ( !isset( $qmodArr[$qm] ) ) {
$r['querymodules'][] = array( 'name' => $qm, 'missing' => '' );
continue;
}
@@ -79,60 +74,64 @@ class ApiParamInfo extends ApiBase {
}
$result->setIndexedTagName( $r['querymodules'], 'module' );
}
- if ( $params['mainmodule'] )
+ if ( $params['mainmodule'] ) {
$r['mainmodule'] = $this->getClassInfo( $this->getMain() );
- if ( $params['pagesetmodule'] )
- {
+ }
+ if ( $params['pagesetmodule'] ) {
$pageSet = new ApiPageSet( $queryObj );
$r['pagesetmodule'] = $this->getClassInfo( $pageSet );
}
$result->addValue( null, $this->getModuleName(), $r );
}
- function getClassInfo( $obj )
- {
+ function getClassInfo( $obj ) {
$result = $this->getResult();
$retval['classname'] = get_class( $obj );
$retval['description'] = implode( "\n", (array)$obj->getDescription() );
+ $retval['examples'] = implode( "\n", (array)$obj->getExamples() );
$retval['version'] = implode( "\n", (array)$obj->getVersion() );
$retval['prefix'] = $obj->getModulePrefix();
- if ( $obj->isReadMode() )
+ if ( $obj->isReadMode() ) {
$retval['readrights'] = '';
- if ( $obj->isWriteMode() )
+ }
+ if ( $obj->isWriteMode() ) {
$retval['writerights'] = '';
- if ( $obj->mustBePosted() )
+ }
+ if ( $obj->mustBePosted() ) {
$retval['mustbeposted'] = '';
- if ( $obj instanceof ApiQueryGeneratorBase )
+ }
+ if ( $obj instanceof ApiQueryGeneratorBase ) {
$retval['generator'] = '';
+ }
$allowedParams = $obj->getFinalParams();
- if ( !is_array( $allowedParams ) )
+ if ( !is_array( $allowedParams ) ) {
return $retval;
-
+ }
+
$retval['parameters'] = array();
$paramDesc = $obj->getFinalParamDescription();
- foreach ( $allowedParams as $n => $p )
- {
+ foreach ( $allowedParams as $n => $p ) {
$a = array( 'name' => $n );
- if ( isset( $paramDesc[$n] ) )
+ if ( isset( $paramDesc[$n] ) ) {
$a['description'] = implode( "\n", (array)$paramDesc[$n] );
- if ( isset( $p[ApiBase::PARAM_DEPRECATED] ) && $p[ApiBase::PARAM_DEPRECATED] )
+ }
+ if ( isset( $p[ApiBase::PARAM_DEPRECATED] ) && $p[ApiBase::PARAM_DEPRECATED] ) {
$a['deprecated'] = '';
- if ( !is_array( $p ) )
- {
- if ( is_bool( $p ) )
- {
+ }
+ if ( isset( $p[ApiBase::PARAM_REQUIRED] ) && $p[ApiBase::PARAM_REQUIRED] ) {
+ $a['required'] = '';
+ }
+
+ if ( !is_array( $p ) ) {
+ if ( is_bool( $p ) ) {
$a['type'] = 'bool';
$a['default'] = ( $p ? 'true' : 'false' );
- }
- else if ( is_string( $p ) || is_null( $p ) )
- {
+ } elseif ( is_string( $p ) || is_null( $p ) ) {
$a['type'] = 'string';
$a['default'] = strval( $p );
- }
- else if ( is_int( $p ) )
- {
+ } elseif ( is_int( $p ) ) {
$a['type'] = 'integer';
$a['default'] = intval( $p );
}
@@ -140,42 +139,45 @@ class ApiParamInfo extends ApiBase {
continue;
}
- if ( isset( $p[ApiBase::PARAM_DFLT] ) )
+ if ( isset( $p[ApiBase::PARAM_DFLT] ) ) {
$a['default'] = $p[ApiBase::PARAM_DFLT];
- if ( isset( $p[ApiBase::PARAM_ISMULTI] ) )
- if ( $p[ApiBase::PARAM_ISMULTI] )
- {
- $a['multi'] = '';
- $a['limit'] = $this->getMain()->canApiHighLimits() ?
- ApiBase::LIMIT_SML2 :
- ApiBase::LIMIT_SML1;
- }
+ }
+ if ( isset( $p[ApiBase::PARAM_ISMULTI] ) && $p[ApiBase::PARAM_ISMULTI] ) {
+ $a['multi'] = '';
+ $a['limit'] = $this->getMain()->canApiHighLimits() ?
+ ApiBase::LIMIT_SML2 :
+ ApiBase::LIMIT_SML1;
+ }
- if ( isset( $p[ApiBase::PARAM_ALLOW_DUPLICATES] ) )
- if ( $p[ApiBase::PARAM_ALLOW_DUPLICATES] )
- $a['allowsduplicates'] = '';
+ if ( isset( $p[ApiBase::PARAM_ALLOW_DUPLICATES] ) && $p[ApiBase::PARAM_ALLOW_DUPLICATES] ) {
+ $a['allowsduplicates'] = '';
+ }
- if ( isset( $p[ApiBase::PARAM_TYPE] ) )
- {
+ if ( isset( $p[ApiBase::PARAM_TYPE] ) ) {
$a['type'] = $p[ApiBase::PARAM_TYPE];
- if ( is_array( $a['type'] ) )
+ if ( is_array( $a['type'] ) ) {
+ $a['type'] = array_values( $a['type'] ); // to prevent sparse arrays from being serialized to JSON as objects
$result->setIndexedTagName( $a['type'], 't' );
+ }
}
- if ( isset( $p[ApiBase::PARAM_MAX] ) )
+ if ( isset( $p[ApiBase::PARAM_MAX] ) ) {
$a['max'] = $p[ApiBase::PARAM_MAX];
- if ( isset( $p[ApiBase::PARAM_MAX2] ) )
+ }
+ if ( isset( $p[ApiBase::PARAM_MAX2] ) ) {
$a['highmax'] = $p[ApiBase::PARAM_MAX2];
- if ( isset( $p[ApiBase::PARAM_MIN] ) )
+ }
+ if ( isset( $p[ApiBase::PARAM_MIN] ) ) {
$a['min'] = $p[ApiBase::PARAM_MIN];
+ }
$retval['parameters'][] = $a;
}
$result->setIndexedTagName( $retval['parameters'], 'param' );
-
+
// Errors
$retval['errors'] = $this->parseErrors( $obj->getPossibleErrors() );
-
+
$result->setIndexedTagName( $retval['errors'], 'error' );
-
+
return $retval;
}
@@ -184,12 +186,12 @@ class ApiParamInfo extends ApiBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'modules' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true
),
'querymodules' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true
),
'mainmodule' => false,
'pagesetmodule' => false,
@@ -197,7 +199,7 @@ class ApiParamInfo extends ApiBase {
}
public function getParamDescription() {
- return array (
+ return array(
'modules' => 'List of module names (value of the action= parameter)',
'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)',
'mainmodule' => 'Get information about the main (top-level) module as well',
@@ -206,16 +208,16 @@ class ApiParamInfo extends ApiBase {
}
public function getDescription() {
- return 'Obtain information about certain API parameters';
+ return 'Obtain information about certain API parameters and errors';
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=paraminfo&modules=parse&querymodules=allpages|siteinfo'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiParamInfo.php 62336 2010-02-11 22:22:20Z reedy $';
+ return __CLASS__ . ': $Id: ApiParamInfo.php 87170 2011-04-30 16:57:22Z catrope $';
}
}
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php
index db389bdb..2d12c233 100644
--- a/includes/api/ApiParse.php
+++ b/includes/api/ApiParse.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Dec 01, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Dec 01, 2007
+ *
+ * Copyright © 2007 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -33,8 +34,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*/
class ApiParse extends ApiBase {
+ private $section, $text, $pstText = null;
+
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
@@ -46,141 +49,238 @@ class ApiParse extends ApiBase {
$text = $params['text'];
$title = $params['title'];
$page = $params['page'];
+ $pageid = $params['pageid'];
$oldid = $params['oldid'];
- if ( !is_null( $page ) && ( !is_null( $text ) || $title != "API" ) )
- $this->dieUsage( "The page parameter cannot be used together with the text and title parameters", 'params' );
+
+ if ( !is_null( $page ) && ( !is_null( $text ) || $title != 'API' ) ) {
+ $this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
+ }
$prop = array_flip( $params['prop'] );
- $revid = false;
+
+ if ( isset( $params['section'] ) ) {
+ $this->section = $params['section'];
+ } else {
+ $this->section = false;
+ }
// The parser needs $wgTitle to be set, apparently the
// $title parameter in Parser::parse isn't enough *sigh*
- global $wgParser, $wgUser, $wgTitle, $wgEnableParserCache;
+ global $wgParser, $wgUser, $wgTitle, $wgLang;
+
+ // 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'] );
+ }
+
$popts = new ParserOptions();
$popts->setTidy( true );
- $popts->enableLimitReport();
+ $popts->enableLimitReport( !$params['disablepp'] );
+
$redirValues = null;
- if ( !is_null( $oldid ) || !is_null( $page ) )
- {
- if ( !is_null( $oldid ) )
- {
+
+ if ( !is_null( $oldid ) || !is_null( $pageid ) || !is_null( $page ) ) {
+
+ if ( !is_null( $oldid ) ) {
// Don't use the parser cache
$rev = Revision::newFromID( $oldid );
- if ( !$rev )
+ if ( !$rev ) {
$this->dieUsage( "There is no revision ID $oldid", 'missingrev' );
- if ( !$rev->userCan( Revision::DELETED_TEXT ) )
+ }
+ if ( !$rev->userCan( Revision::DELETED_TEXT ) ) {
$this->dieUsage( "You don't have permission to view deleted revisions", 'permissiondenied' );
+ }
- $text = $rev->getText( Revision::FOR_THIS_USER );
$titleObj = $rev->getTitle();
+
$wgTitle = $titleObj;
- $p_result = $wgParser->parse( $text, $titleObj, $popts );
- }
- else
- {
- if ( $params['redirects'] )
- {
- $req = new FauxRequest( array(
- 'action' => 'query',
- 'redirects' => '',
- 'titles' => $page
- ) );
- $main = new ApiMain( $req );
- $main->execute();
- $data = $main->getResultData();
- $redirValues = @$data['query']['redirects'];
- $to = $page;
- foreach ( (array)$redirValues as $r )
- $to = $r['to'];
+
+ //If for some reason the "oldid" is actually the current revision, it may be cached
+ if ( $titleObj->getLatestRevID() === $oldid ) {
+ $articleObj = new Article( $titleObj, 0 );
+
+ $p_result = $this->getParsedSectionOrText( $articleObj, $titleObj, $popts, $pageid,
+ isset( $prop['wikitext'] ) ) ;
+
+ } else { // This is an old revision, so get the text differently
+ $this->text = $rev->getText( Revision::FOR_THIS_USER );
+
+ $wgTitle = $titleObj;
+
+ if ( $this->section !== false ) {
+ $this->text = $this->getSectionText( $this->text, 'r' . $rev->getId() );
+ }
+
+ $p_result = $wgParser->parse( $this->text, $titleObj, $popts );
}
- else
- $to = $page;
- $titleObj = Title::newFromText( $to );
- if ( !$titleObj )
- $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
-
- $articleObj = new Article( $titleObj );
- if ( isset( $prop['revid'] ) )
+
+ } else { // Not $oldid
+
+ if ( !is_null ( $pageid ) ) {
+ $titleObj = Title::newFromID( $pageid );
+
+ if ( !$titleObj ) {
+ $this->dieUsageMsg( array( 'nosuchpageid', $pageid ) );
+ }
+ } else { // $page
+
+ if ( $params['redirects'] ) {
+ $req = new FauxRequest( array(
+ 'action' => 'query',
+ 'redirects' => '',
+ 'titles' => $page
+ ) );
+ $main = new ApiMain( $req );
+ $main->execute();
+ $data = $main->getResultData();
+ $redirValues = @$data['query']['redirects'];
+ $to = $page;
+ foreach ( (array)$redirValues as $r ) {
+ $to = $r['to'];
+ }
+ } else {
+ $to = $page;
+ }
+ $titleObj = Title::newFromText( $to );
+ if ( !$titleObj || !$titleObj->exists() ) {
+ $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
+ }
+ }
+ $wgTitle = $titleObj;
+
+ $articleObj = new Article( $titleObj, 0 );
+ if ( isset( $prop['revid'] ) ) {
$oldid = $articleObj->getRevIdFetched();
- // Try the parser cache first
- $p_result = false;
- $pcache = ParserCache::singleton();
- if ( $wgEnableParserCache )
- $p_result = $pcache->get( $articleObj, $wgUser );
- if ( !$p_result )
- {
- $p_result = $wgParser->parse( $articleObj->getContent(), $titleObj, $popts );
-
- if ( $wgEnableParserCache )
- $pcache->save( $p_result, $articleObj, $popts );
}
+
+ $p_result = $this->getParsedSectionOrText( $articleObj, $titleObj, $popts, $pageid,
+ isset( $prop['wikitext'] ) ) ;
}
- }
- else
- {
+
+ } else { // Not $oldid, $pageid, $page. Hence based on $text
+
+ $this->text = $text;
$titleObj = Title::newFromText( $title );
- if ( !$titleObj )
- $titleObj = Title::newFromText( "API" );
+ if ( !$titleObj ) {
+ $titleObj = Title::newFromText( 'API' );
+ }
$wgTitle = $titleObj;
- if ( $params['pst'] || $params['onlypst'] )
- $text = $wgParser->preSaveTransform( $text, $titleObj, $wgUser, $popts );
- if ( $params['onlypst'] )
- {
+
+ if ( $this->section !== false ) {
+ $this->text = $this->getSectionText( $this->text, $titleObj->getText() );
+ }
+
+ if ( $params['pst'] || $params['onlypst'] ) {
+ $this->pstText = $wgParser->preSaveTransform( $this->text, $titleObj, $wgUser, $popts );
+ }
+ if ( $params['onlypst'] ) {
// Build a result and bail out
$result_array['text'] = array();
- $this->getResult()->setContent( $result_array['text'], $text );
+ $this->getResult()->setContent( $result_array['text'], $this->pstText );
+ if ( isset( $prop['wikitext'] ) ) {
+ $result_array['wikitext'] = array();
+ $this->getResult()->setContent( $result_array['wikitext'], $this->text );
+ }
$this->getResult()->addValue( null, $this->getModuleName(), $result_array );
return;
}
- $p_result = $wgParser->parse( $text, $titleObj, $popts );
+ $p_result = $wgParser->parse( $params['pst'] ? $this->pstText : $this->text, $titleObj, $popts );
}
// Return result
$result = $this->getResult();
$result_array = array();
- if ( $params['redirects'] && !is_null( $redirValues ) )
+ if ( $params['redirects'] && !is_null( $redirValues ) ) {
$result_array['redirects'] = $redirValues;
-
+ }
+
if ( isset( $prop['text'] ) ) {
$result_array['text'] = array();
$result->setContent( $result_array['text'], $p_result->getText() );
}
-
+
if ( !is_null( $params['summary'] ) ) {
$result_array['parsedsummary'] = array();
$result->setContent( $result_array['parsedsummary'], $wgUser->getSkin()->formatComment( $params['summary'], $titleObj ) );
}
-
- if ( isset( $prop['langlinks'] ) )
+
+ if ( isset( $prop['langlinks'] ) ) {
$result_array['langlinks'] = $this->formatLangLinks( $p_result->getLanguageLinks() );
- if ( isset( $prop['categories'] ) )
+ }
+ if ( isset( $prop['languageshtml'] ) ) {
+ $languagesHtml = $this->languagesHtml( $p_result->getLanguageLinks() );
+ $result_array['languageshtml'] = array();
+ $result->setContent( $result_array['languageshtml'], $languagesHtml );
+ }
+ if ( isset( $prop['categories'] ) ) {
$result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
- if ( isset( $prop['links'] ) )
+ }
+ if ( isset( $prop['categorieshtml'] ) ) {
+ $categoriesHtml = $this->categoriesHtml( $p_result->getCategories() );
+ $result_array['categorieshtml'] = array();
+ $result->setContent( $result_array['categorieshtml'], $categoriesHtml );
+ }
+ if ( isset( $prop['links'] ) ) {
$result_array['links'] = $this->formatLinks( $p_result->getLinks() );
- if ( isset( $prop['templates'] ) )
+ }
+ if ( isset( $prop['templates'] ) ) {
$result_array['templates'] = $this->formatLinks( $p_result->getTemplates() );
- if ( isset( $prop['images'] ) )
+ }
+ if ( isset( $prop['images'] ) ) {
$result_array['images'] = array_keys( $p_result->getImages() );
- if ( isset( $prop['externallinks'] ) )
+ }
+ if ( isset( $prop['externallinks'] ) ) {
$result_array['externallinks'] = array_keys( $p_result->getExternalLinks() );
- if ( isset( $prop['sections'] ) )
+ }
+ if ( isset( $prop['sections'] ) ) {
$result_array['sections'] = $p_result->getSections();
- if ( isset( $prop['displaytitle'] ) )
+ }
+
+ if ( isset( $prop['displaytitle'] ) ) {
$result_array['displaytitle'] = $p_result->getDisplayTitle() ?
$p_result->getDisplayTitle() :
$titleObj->getPrefixedText();
-
- if ( isset( $prop['headitems'] ) )
- $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
-
- if ( isset( $prop['headhtml'] ) ) {
+ }
+
+ if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
$out = new OutputPage;
$out->addParserOutputNoText( $p_result );
+ $userSkin = $wgUser->getSkin();
+ }
+
+ if ( isset( $prop['headitems'] ) ) {
+ $headItems = $this->formatHeadItems( $p_result->getHeadItems() );
+
+ $userSkin->setupUserCss( $out );
+ $css = $this->formatCss( $out->buildCssLinksArray() );
+
+ $scripts = array( $out->getHeadScripts( $userSkin ) );
+
+ $result_array['headitems'] = array_merge( $headItems, $css, $scripts );
+ }
+
+ if ( isset( $prop['headhtml'] ) ) {
$result_array['headhtml'] = array();
- $result->setContent( $result_array['headhtml'], $out->headElement( $wgUser->getSkin() ) );
+ $result->setContent( $result_array['headhtml'], $out->headElement( $userSkin ) );
+ }
+
+ if ( isset( $prop['iwlinks'] ) ) {
+ $result_array['iwlinks'] = $this->formatIWLinks( $p_result->getInterwikiLinks() );
}
- if ( !is_null( $oldid ) )
+ if ( isset( $prop['wikitext'] ) ) {
+ $result_array['wikitext'] = array();
+ $result->setContent( $result_array['wikitext'], $this->text );
+ if ( !is_null( $this->pstText ) ) {
+ $result_array['psttext'] = array();
+ $result->setContent( $result_array['psttext'], $this->pstText );
+ }
+ }
+
+ if ( !is_null( $oldid ) ) {
$result_array['revid'] = intval( $oldid );
+ }
$result_mapping = array(
'redirects' => 'r',
@@ -190,11 +290,54 @@ class ApiParse extends ApiBase {
'templates' => 'tl',
'images' => 'img',
'externallinks' => 'el',
+ 'iwlinks' => 'iw',
'sections' => 's',
- 'headitems' => 'hi'
+ 'headitems' => 'hi',
);
$this->setIndexedTagNames( $result_array, $result_mapping );
$result->addValue( null, $this->getModuleName(), $result_array );
+
+ if ( !is_null( $oldLang ) ) {
+ $wgLang = $oldLang; // Reset $wgLang to $oldLang
+ }
+ }
+
+ /**
+ * @param $articleObj Article
+ * @param $titleObj Title
+ * @param $popts ParserOptions
+ * @param $pageId Int
+ * @param $getWikitext Bool
+ * @return ParserOutput
+ */
+ private function getParsedSectionOrText( $articleObj, $titleObj, $popts, $pageId = null, $getWikitext = false ) {
+ if ( $this->section !== false ) {
+ global $wgParser;
+
+ $this->text = $this->getSectionText( $articleObj->getRawText(), !is_null ( $pageId )
+ ? 'page id ' . $pageId : $titleObj->getText() );
+
+ return $wgParser->parse( $this->text, $titleObj, $popts );
+ } else {
+ // Try the parser cache first
+ $pout = $articleObj->getParserOutput();
+ if ( $getWikitext ) {
+ $rev = Revision::newFromTitle( $titleObj );
+ if ( $rev ) {
+ $this->text = $rev->getText();
+ }
+ }
+ return $pout;
+ }
+ }
+
+ private function getSectionText( $text, $what ) {
+ global $wgParser;
+ $text = $wgParser->getSection( $text, $this->section, false );
+ if ( $text === false ) {
+ $this->dieUsage( "There is no section {$this->section} in " . $what, 'nosuchsection' );
+ }
+ return $text;
}
private function formatLangLinks( $links ) {
@@ -202,7 +345,12 @@ class ApiParse extends ApiBase {
foreach ( $links as $link ) {
$entry = array();
$bits = explode( ':', $link, 2 );
+ $title = Title::newFromText( $link );
+
$entry['lang'] = $bits[0];
+ if ( $title ) {
+ $entry['url'] = $title->getFullURL();
+ }
$this->getResult()->setContent( $entry, $bits[1] );
$result[] = $entry;
}
@@ -220,6 +368,20 @@ class ApiParse extends ApiBase {
return $result;
}
+ private function categoriesHtml( $categories ) {
+ global $wgOut, $wgUser;
+ $wgOut->addCategoryLinks( $categories );
+ $sk = $wgUser->getSkin();
+ return $sk->getCategories();
+ }
+
+ private function languagesHtml( $languages ) {
+ global $wgOut, $wgUser;
+ $wgOut->setLanguageLinks( $languages );
+ $sk = $wgUser->getSkin();
+ return $sk->otherLanguages();
+ }
+
private function formatLinks( $links ) {
$result = array();
foreach ( $links as $ns => $nslinks ) {
@@ -227,8 +389,28 @@ class ApiParse extends ApiBase {
$entry = array();
$entry['ns'] = $ns;
$this->getResult()->setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
- if ( $id != 0 )
+ if ( $id != 0 ) {
$entry['exists'] = '';
+ }
+ $result[] = $entry;
+ }
+ }
+ return $result;
+ }
+
+ private function formatIWLinks( $iw ) {
+ $result = array();
+ foreach ( $iw as $prefix => $titles ) {
+ foreach ( array_keys( $titles ) as $title ) {
+ $entry = array();
+ $entry['prefix'] = $prefix;
+
+ $title = Title::newFromText( "{$prefix}:{$title}" );
+ if ( $title ) {
+ $entry['url'] = $title->getFullURL();
+ }
+
+ $this->getResult()->setContent( $entry, $title->getFullText() );
$result[] = $entry;
}
}
@@ -246,30 +428,45 @@ class ApiParse extends ApiBase {
return $result;
}
+ private function formatCss( $css ) {
+ $result = array();
+ foreach ( $css as $file => $link ) {
+ $entry = array();
+ $entry['file'] = $file;
+ $this->getResult()->setContent( $entry, $link );
+ $result[] = $entry;
+ }
+ return $result;
+ }
+
private function setIndexedTagNames( &$array, $mapping ) {
foreach ( $mapping as $key => $name ) {
- if ( isset( $array[$key] ) )
+ if ( isset( $array[$key] ) ) {
$this->getResult()->setIndexedTagName( $array[$key], $name );
+ }
}
}
public function getAllowedParams() {
- return array (
+ return array(
'title' => array(
- ApiBase :: PARAM_DFLT => 'API',
+ ApiBase::PARAM_DFLT => 'API',
),
'text' => null,
'summary' => null,
'page' => null,
+ 'pageid' => null,
'redirects' => false,
'oldid' => null,
'prop' => array(
- ApiBase :: PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle',
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'text',
'langlinks',
+ 'languageshtml',
'categories',
+ 'categorieshtml',
'links',
'templates',
'images',
@@ -278,54 +475,84 @@ class ApiParse extends ApiBase {
'revid',
'displaytitle',
'headitems',
- 'headhtml'
+ 'headhtml',
+ 'iwlinks',
+ 'wikitext',
)
),
'pst' => false,
'onlypst' => false,
+ 'uselang' => null,
+ 'section' => null,
+ 'disablepp' => false,
);
}
public function getParamDescription() {
- return array (
+ $p = $this->getModulePrefix();
+ return array(
'text' => 'Wikitext to parse',
'summary' => 'Summary to parse',
- 'redirects' => 'If the page parameter is set to a redirect, resolve it',
+ 'redirects' => "If the {$p}page parameter is set to a redirect, resolve it",
'title' => 'Title of page the text belongs to',
- 'page' => 'Parse the content of this page. Cannot be used together with text and title',
- 'oldid' => 'Parse the content of this revision. Overrides page',
- 'prop' => array( 'Which pieces of information to get.',
- 'NOTE: Section tree is only generated if there are more than 4 sections, or if the __TOC__ keyword is present'
+ 'page' => "Parse the content of this page. Cannot be used together with {$p}text and {$p}title",
+ 'pageid' => "Parse the content of this page. Overrides {$p}page",
+ 'oldid' => "Parse the content of this revision. Overrides {$p}page and {$p}pageid",
+ 'prop' => array(
+ 'Which pieces of information to get',
+ ' text - Gives the parsed text of the wikitext',
+ ' langlinks - Gives the langlinks the parsed wikitext',
+ ' categories - Gives the categories of the parsed wikitext',
+ ' categorieshtml - Gives the html version of the categories',
+ ' languageshtml - Gives the html version of the languagelinks',
+ ' links - Gives the internal links in the parsed wikitext',
+ ' templates - Gives the templates in the parsed wikitext',
+ ' images - Gives the images in the parsed wikitext',
+ ' externallinks - Gives the external links in the parsed wikitext',
+ ' sections - Gives the sections in the parsed wikitext',
+ ' revid - Adds the revision id of the parsed page',
+ ' displaytitle - Adds the title of the parsed wikitext',
+ ' headitems - Gives items to put in the <head> of the page',
+ ' headhtml - Gives parsed <head> of the page',
+ ' iwlinks - Gives interwiki links in the parsed wikitext',
+ ' wikitext - Gives the original wikitext that was parsed',
),
- 'pst' => array( 'Do a pre-save transform on the input before parsing it.',
- 'Ignored if page or oldid is used.'
+ 'pst' => array(
+ 'Do a pre-save transform on the input before parsing it',
+ 'Ignored if page, pageid or oldid is used'
),
- 'onlypst' => array( 'Do a PST on the input, but don\'t parse it.',
- 'Returns PSTed wikitext. Ignored if page or oldid is used.'
+ 'onlypst' => array(
+ 'Do a pre-save transform (PST) on the input, but don\'t parse it',
+ 'Returns the same wikitext, after a PST has been applied. Ignored if page, pageid or oldid is used'
),
+ 'uselang' => 'Which language to parse the request in',
+ 'section' => 'Only retrieve the content of this section number',
+ 'disablepp' => 'Disable the PP Report from the parser output',
);
}
public function getDescription() {
return 'This module parses wikitext and returns parser output';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'params', 'info' => 'The page parameter cannot be used together with the text and title parameters' ),
array( 'code' => 'missingrev', 'info' => 'There is no revision ID oldid' ),
array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revisions' ),
array( 'code' => 'missingtitle', 'info' => 'The page you specified doesn\'t exist' ),
+ array( 'code' => 'nosuchsection', 'info' => 'There is no section sectionnumber in page' ),
+ array( 'nosuchpageid' ),
) );
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=parse&text={{Project:Sandbox}}'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiParse.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiParse.php 89672 2011-06-07 18:45:20Z catrope $';
}
}
diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php
index 79916117..08835743 100644
--- a/includes/api/ApiPatrol.php
+++ b/includes/api/ApiPatrol.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 2, 2008
- *
+/**
* API for MediaWiki 1.14+
*
- * Copyright (C) 2008 Soxred93 soxred93@gmail.com,
+ * Created on Sep 2, 2008
+ *
+ * Copyright © 2008 Soxred93 soxred93@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
@@ -19,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -34,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiPatrol extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
/**
@@ -42,62 +43,63 @@ class ApiPatrol extends ApiBase {
*/
public function execute() {
$params = $this->extractRequestParams();
-
- if ( !isset( $params['rcid'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'rcid' ) );
$rc = RecentChange::newFromID( $params['rcid'] );
- if ( !$rc instanceof RecentChange )
+ if ( !$rc instanceof RecentChange ) {
$this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+ }
$retval = RecentChange::markPatrolled( $params['rcid'] );
-
- if ( $retval )
+
+ if ( $retval ) {
$this->dieUsageMsg( reset( $retval ) );
-
+ }
+
$result = array( 'rcid' => intval( $rc->getAttribute( 'rc_id' ) ) );
ApiQueryBase::addTitleInfo( $result, $rc->getTitle() );
$this->getResult()->addValue( null, $this->getModuleName(), $result );
}
+ public function mustBePosted() {
+ return true;
+ }
+
public function isWriteMode() {
return true;
}
public function getAllowedParams() {
- return array (
+ return array(
'token' => null,
'rcid' => array(
- ApiBase :: PARAM_TYPE => 'integer'
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_REQUIRED => true
),
);
}
public function getParamDescription() {
- return array (
+ return array(
'token' => 'Patrol token obtained from list=recentchanges',
'rcid' => 'Recentchanges ID to patrol',
);
}
public function getDescription() {
- return array (
- 'Patrol a page or revision. '
- );
+ return 'Patrol a page or revision';
}
-
- public function getPossibleErrors() {
+
+ public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'rcid' ),
array( 'nosuchrcid', 'rcid' ),
- ) );
+ ) );
}
-
+
public function needsToken() {
return true;
}
public function getTokenSalt() {
- return '';
+ return 'patrol';
}
protected function getExamples() {
@@ -107,6 +109,6 @@ class ApiPatrol extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiPatrol.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiPatrol.php 78437 2010-12-15 14:14:16Z catrope $';
}
-} \ No newline at end of file
+}
diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php
index 0b1ae4c8..3a1d18e0 100644
--- a/includes/api/ApiProtect.php
+++ b/includes/api/ApiProtect.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on Sep 1, 2007
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Sep 1, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -33,68 +35,68 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiProtect extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
- global $wgUser, $wgRestrictionTypes, $wgRestrictionLevels;
+ global $wgUser, $wgRestrictionLevels;
$params = $this->extractRequestParams();
- $titleObj = null;
- if ( !isset( $params['title'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'title' ) );
- if ( empty( $params['protections'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'protections' ) );
-
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj )
+ if ( !$titleObj ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
$errors = $titleObj->getUserPermissionsErrors( 'protect', $wgUser );
- if ( $errors )
+ if ( $errors ) {
// We don't care about multiple errors, just report one of them
$this->dieUsageMsg( reset( $errors ) );
+ }
$expiry = (array)$params['expiry'];
- if ( count( $expiry ) != count( $params['protections'] ) )
- {
- if ( count( $expiry ) == 1 )
+ if ( count( $expiry ) != count( $params['protections'] ) ) {
+ if ( count( $expiry ) == 1 ) {
$expiry = array_fill( 0, count( $params['protections'] ), $expiry[0] );
- else
+ } else {
$this->dieUsageMsg( array( 'toofewexpiries', count( $expiry ), count( $params['protections'] ) ) );
+ }
}
-
+
$restrictionTypes = $titleObj->getRestrictionTypes();
-
+
$protections = array();
$expiryarray = array();
$resultProtections = array();
- foreach ( $params['protections'] as $i => $prot )
- {
+ foreach ( $params['protections'] as $i => $prot ) {
$p = explode( '=', $prot );
$protections[$p[0]] = ( $p[1] == 'all' ? '' : $p[1] );
- if ( $titleObj->exists() && $p[0] == 'create' )
+ if ( $titleObj->exists() && $p[0] == 'create' ) {
$this->dieUsageMsg( array( 'create-titleexists' ) );
- if ( !$titleObj->exists() && $p[0] != 'create' )
+ }
+ if ( !$titleObj->exists() && $p[0] != 'create' ) {
$this->dieUsageMsg( array( 'missingtitle-createonly' ) );
+ }
- if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' )
+ if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' ) {
$this->dieUsageMsg( array( 'protect-invalidaction', $p[0] ) );
- if ( !in_array( $p[1], $wgRestrictionLevels ) && $p[1] != 'all' )
+ }
+ if ( !in_array( $p[1], $wgRestrictionLevels ) && $p[1] != 'all' ) {
$this->dieUsageMsg( array( 'protect-invalidlevel', $p[1] ) );
+ }
- if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'never' ) ) )
+ if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'never' ) ) ) {
$expiryarray[$p[0]] = Block::infinity();
- else
- {
+ } else {
$exp = strtotime( $expiry[$i] );
- if ( $exp < 0 || $exp == false )
+ if ( $exp < 0 || !$exp ) {
$this->dieUsageMsg( array( 'invalidexpiry', $expiry[$i] ) );
+ }
$exp = wfTimestamp( TS_MW, $exp );
- if ( $exp < wfTimestampNow() )
+ if ( $exp < wfTimestampNow() ) {
$this->dieUsageMsg( array( 'pastexpiry', $expiry[$i] ) );
+ }
$expiryarray[$p[0]] = $exp;
}
$resultProtections[] = array( $p[0] => $protections[$p[0]],
@@ -105,19 +107,27 @@ class ApiProtect extends ApiBase {
$cascade = $params['cascade'];
$articleObj = new Article( $titleObj );
- if ( $params['watch'] )
- $articleObj->doWatch();
- if ( $titleObj->exists() )
+
+ $watch = $params['watch'] ? 'watch' : $params['watchlist'];
+ $this->setWatch( $watch, $titleObj );
+
+ if ( $titleObj->exists() ) {
$ok = $articleObj->updateRestrictions( $protections, $params['reason'], $cascade, $expiryarray );
- else
+ } else {
$ok = $titleObj->updateTitleProtection( $protections['create'], $params['reason'], $expiryarray['create'] );
- if ( !$ok )
+ }
+ if ( !$ok ) {
// This is very weird. Maybe the article was deleted or the user was blocked/desysopped in the meantime?
// Just throw an unknown error in this case, as it's very likely to be a race condition
$this->dieUsageMsg( array() );
- $res = array( 'title' => $titleObj->getPrefixedText(), 'reason' => $params['reason'] );
- if ( $cascade )
+ }
+ $res = array(
+ 'title' => $titleObj->getPrefixedText(),
+ 'reason' => $params['reason']
+ );
+ if ( $cascade ) {
$res['cascade'] = '';
+ }
$res['protections'] = $resultProtections;
$this->getResult()->setIndexedTagName( $res['protections'], 'protection' );
$this->getResult()->addValue( null, $this->getModuleName(), $res );
@@ -132,26 +142,42 @@ class ApiProtect extends ApiBase {
}
public function getAllowedParams() {
- return array (
- 'title' => null,
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'token' => null,
'protections' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_REQUIRED => true,
),
'expiry' => array(
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_ALLOW_DUPLICATES => true,
- ApiBase :: PARAM_DFLT => 'infinite',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_ALLOW_DUPLICATES => true,
+ ApiBase::PARAM_DFLT => 'infinite',
),
'reason' => '',
'cascade' => false,
- 'watch' => false,
+ 'watch' => array(
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
+ ),
+ 'watchlist' => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
+ 'watch',
+ 'unwatch',
+ 'preferences',
+ 'nochange'
+ ),
+ ),
);
}
public function getParamDescription() {
- return array (
- 'title' => 'Title of the page you want to (un)protect.',
+ return array(
+ 'title' => 'Title of the page you want to (un)protect',
'token' => 'A protect token previously retrieved through prop=info',
'protections' => 'Pipe-separated list of protection levels, formatted action=group (e.g. edit=sysop)',
'expiry' => array( 'Expiry timestamps. If only one timestamp is set, it\'ll be used for all protections.',
@@ -160,19 +186,16 @@ class ApiProtect extends ApiBase {
'cascade' => array( 'Enable cascading protection (i.e. protect pages included in this page)',
'Ignored if not all protection levels are \'sysop\' or \'protect\'' ),
'watch' => 'If set, add the page being (un)protected to your watchlist',
+ 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
);
}
public function getDescription() {
- return array(
- 'Change the protection level of a page.'
- );
+ return 'Change the protection level of a page';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'title' ),
- array( 'missingparam', 'protections' ),
array( 'invalidtitle', 'title' ),
array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
array( 'create-titleexists' ),
@@ -183,7 +206,7 @@ class ApiProtect extends ApiBase {
array( 'pastexpiry', 'expiry' ),
) );
}
-
+
public function needsToken() {
return true;
}
@@ -193,13 +216,13 @@ class ApiProtect extends ApiBase {
}
protected function getExamples() {
- return array (
- 'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=sysop|move=sysop&cascade&expiry=20070901163000|never',
+ return array(
+ 'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never',
'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=all|move=all&reason=Lifting%20restrictions'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiProtect.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiProtect.php 77192 2010-11-23 22:05:27Z btongminh $';
}
}
diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php
index 76d45404..a17abf16 100644
--- a/includes/api/ApiPurge.php
+++ b/includes/api/ApiPurge.php
@@ -1,11 +1,11 @@
<?php
-/*
- * Created on Sep 2, 2008
- *
+/**
* API for MediaWiki 1.14+
*
- * Copyright (C) 2008 Chad Horohoe
+ * Created on Sep 2, 2008
+ *
+ * Copyright © 2008 Chad Horohoe
*
* 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
@@ -19,12 +19,14 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -34,7 +36,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiPurge extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
/**
@@ -43,29 +45,27 @@ class ApiPurge extends ApiBase {
public function execute() {
global $wgUser;
$params = $this->extractRequestParams();
- if ( !$wgUser->isAllowed( 'purge' ) )
- $this->dieUsageMsg( array( 'cantpurge' ) );
- if ( !isset( $params['titles'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'titles' ) );
+ if ( !$wgUser->isAllowed( 'purge' ) && !$this->getMain()->isInternalMode() &&
+ !$this->getMain()->getRequest()->wasPosted() ) {
+ $this->dieUsageMsg( array( 'mustbeposted', $this->getModuleName() ) );
+ }
$result = array();
foreach ( $params['titles'] as $t ) {
$r = array();
$title = Title::newFromText( $t );
- if ( !$title instanceof Title )
- {
+ if ( !$title instanceof Title ) {
$r['title'] = $t;
$r['invalid'] = '';
$result[] = $r;
continue;
}
ApiQueryBase::addTitleInfo( $r, $title );
- if ( !$title->exists() )
- {
+ if ( !$title->exists() ) {
$r['missing'] = '';
$result[] = $r;
continue;
}
- $article = Mediawiki::articleFromTitle( $title );
+ $article = MediaWiki::articleFromTitle( $title );
$article->doPurge(); // Directly purge and skip the UI part of purge().
$r['purged'] = '';
$result[] = $r;
@@ -74,40 +74,35 @@ class ApiPurge extends ApiBase {
$this->getResult()->addValue( null, $this->getModuleName(), $result );
}
- public function mustBePosted() {
- global $wgUser;
- return $wgUser->isAnon();
- }
-
public function isWriteMode() {
return true;
}
public function getAllowedParams() {
- return array (
+ return array(
'titles' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_REQUIRED => true
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'titles' => 'A list of titles',
);
}
public function getDescription() {
- return array (
- 'Purge the cache for the given titles.'
+ return array( 'Purge the cache for the given titles.',
+ 'This module requires a POST request if the user is not logged in.'
);
}
-
- public function getPossibleErrors() {
+
+ public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'cantpurge' ),
- array( 'missingparam', 'titles' ),
- ) );
+ ) );
}
protected function getExamples() {
@@ -117,6 +112,6 @@ class ApiPurge extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiPurge.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiPurge.php 74944 2010-10-18 09:19:20Z catrope $';
}
}
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index 8d3ef616..f88aa850 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 7, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 7, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -43,23 +44,26 @@ class ApiQuery extends ApiBase {
private $mPropModuleNames, $mListModuleNames, $mMetaModuleNames;
private $mPageSet;
- private $params, $redirect;
+ private $params, $redirects, $convertTitles;
- private $mQueryPropModules = array (
+ private $mQueryPropModules = array(
'info' => 'ApiQueryInfo',
'revisions' => 'ApiQueryRevisions',
'links' => 'ApiQueryLinks',
+ 'iwlinks' => 'ApiQueryIWLinks',
'langlinks' => 'ApiQueryLangLinks',
'images' => 'ApiQueryImages',
'imageinfo' => 'ApiQueryImageInfo',
+ 'stashimageinfo' => 'ApiQueryStashImageInfo',
'templates' => 'ApiQueryLinks',
'categories' => 'ApiQueryCategories',
'extlinks' => 'ApiQueryExternalLinks',
'categoryinfo' => 'ApiQueryCategoryInfo',
'duplicatefiles' => 'ApiQueryDuplicateFiles',
+ 'pageprops' => 'ApiQueryPageProps',
);
- private $mQueryListModules = array (
+ private $mQueryListModules = array(
'allimages' => 'ApiQueryAllimages',
'allpages' => 'ApiQueryAllpages',
'alllinks' => 'ApiQueryAllLinks',
@@ -70,7 +74,9 @@ class ApiQuery extends ApiBase {
'categorymembers' => 'ApiQueryCategoryMembers',
'deletedrevs' => 'ApiQueryDeletedrevs',
'embeddedin' => 'ApiQueryBacklinks',
+ 'filearchive' => 'ApiQueryFilearchive',
'imageusage' => 'ApiQueryBacklinks',
+ 'iwbacklinks' => 'ApiQueryIWBacklinks',
'logevents' => 'ApiQueryLogEvents',
'recentchanges' => 'ApiQueryRecentChanges',
'search' => 'ApiQuerySearch',
@@ -84,7 +90,7 @@ class ApiQuery extends ApiBase {
'protectedtitles' => 'ApiQueryProtectedTitles',
);
- private $mQueryMetaModules = array (
+ private $mQueryMetaModules = array(
'siteinfo' => 'ApiQuerySiteinfo',
'userinfo' => 'ApiQueryUserInfo',
'allmessages' => 'ApiQueryAllmessages',
@@ -94,13 +100,13 @@ class ApiQuery extends ApiBase {
private $mNamedDB = array();
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
// Allow custom modules to be added in LocalSettings.php
global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules;
- self :: appendUserModules( $this->mQueryPropModules, $wgAPIPropModules );
- self :: appendUserModules( $this->mQueryListModules, $wgAPIListModules );
- self :: appendUserModules( $this->mQueryMetaModules, $wgAPIMetaModules );
+ self::appendUserModules( $this->mQueryPropModules, $wgAPIPropModules );
+ self::appendUserModules( $this->mQueryListModules, $wgAPIListModules );
+ self::appendUserModules( $this->mQueryMetaModules, $wgAPIMetaModules );
$this->mPropModuleNames = array_keys( $this->mQueryPropModules );
$this->mListModuleNames = array_keys( $this->mQueryListModules );
@@ -129,7 +135,7 @@ class ApiQuery extends ApiBase {
* @return Database
*/
public function getDB() {
- if ( !isset ( $this->mSlaveDB ) ) {
+ if ( !isset( $this->mSlaveDB ) ) {
$this->profileDBIn();
$this->mSlaveDB = wfGetDB( DB_SLAVE, 'api' );
$this->profileDBOut();
@@ -172,14 +178,37 @@ class ApiQuery extends ApiBase {
return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules );
}
+ /**
+ * Get whether the specified module is a prop, list or a meta query module
+ * @param $moduleName string Name of the module to find type for
+ * @return mixed string or null
+ */
+ function getModuleType( $moduleName ) {
+ if ( array_key_exists ( $moduleName, $this->mQueryPropModules ) ) {
+ return 'prop';
+ }
+
+ if ( array_key_exists ( $moduleName, $this->mQueryListModules ) ) {
+ return 'list';
+ }
+
+ if ( array_key_exists ( $moduleName, $this->mQueryMetaModules ) ) {
+ return 'meta';
+ }
+
+ return null;
+ }
+
public function getCustomPrinter() {
// If &exportnowrap is set, use the raw formatter
if ( $this->getParameter( 'export' ) &&
$this->getParameter( 'exportnowrap' ) )
+ {
return new ApiFormatRaw( $this->getMain(),
$this->getMain()->createPrinterByName( 'xml' ) );
- else
+ } else {
return null;
+ }
}
/**
@@ -193,26 +222,26 @@ class ApiQuery extends ApiBase {
* #5 Execute all requested modules
*/
public function execute() {
-
$this->params = $this->extractRequestParams();
$this->redirects = $this->params['redirects'];
+ $this->convertTitles = $this->params['converttitles'];
// Create PageSet
- $this->mPageSet = new ApiPageSet( $this, $this->redirects );
+ $this->mPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles );
// Instantiate requested modules
- $modules = array ();
- $this->InstantiateModules( $modules, 'prop', $this->mQueryPropModules );
- $this->InstantiateModules( $modules, 'list', $this->mQueryListModules );
- $this->InstantiateModules( $modules, 'meta', $this->mQueryMetaModules );
+ $modules = array();
+ $this->instantiateModules( $modules, 'prop', $this->mQueryPropModules );
+ $this->instantiateModules( $modules, 'list', $this->mQueryListModules );
+ $this->instantiateModules( $modules, 'meta', $this->mQueryMetaModules );
$cacheMode = 'public';
// If given, execute generator to substitute user supplied data with generated data.
- if ( isset ( $this->params['generator'] ) ) {
+ if ( isset( $this->params['generator'] ) ) {
$generator = $this->newGenerator( $this->params['generator'] );
$params = $generator->extractRequestParams();
- $cacheMode = $this->mergeCacheMode( $cacheMode,
+ $cacheMode = $this->mergeCacheMode( $cacheMode,
$generator->getCacheMode( $params ) );
$this->executeGeneratorModule( $generator, $modules );
} else {
@@ -227,7 +256,7 @@ class ApiQuery extends ApiBase {
// Execute all requested modules.
foreach ( $modules as $module ) {
$params = $module->extractRequestParams();
- $cacheMode = $this->mergeCacheMode(
+ $cacheMode = $this->mergeCacheMode(
$cacheMode, $module->getCacheMode( $params ) );
$module->profileIn();
$module->execute();
@@ -241,7 +270,7 @@ class ApiQuery extends ApiBase {
/**
* Update a cache mode string, applying the cache mode of a new module to it.
- * The cache mode may increase in the level of privacy, but public modules
+ * The cache mode may increase in the level of privacy, but public modules
* added to private data do not decrease the level of privacy.
*/
protected function mergeCacheMode( $cacheMode, $modCacheMode ) {
@@ -273,15 +302,17 @@ class ApiQuery extends ApiBase {
/**
* Create instances of all modules requested by the client
- * @param $modules array to append instatiated modules to
+ * @param $modules Array to append instantiated modules to
* @param $param string Parameter name to read modules from
- * @param $moduleList array(modulename => classname)
+ * @param $moduleList Array array(modulename => classname)
*/
- private function InstantiateModules( &$modules, $param, $moduleList ) {
+ private function instantiateModules( &$modules, $param, $moduleList ) {
$list = @$this->params[$param];
- if ( !is_null ( $list ) )
- foreach ( $list as $moduleName )
+ if ( !is_null ( $list ) ) {
+ foreach ( $list as $moduleName ) {
$modules[] = new $moduleList[$moduleName] ( $this, $moduleName );
+ }
+ }
}
/**
@@ -290,7 +321,6 @@ class ApiQuery extends ApiBase {
* and missing or invalid title/pageids/revids.
*/
private function outputGeneralPageInfo() {
-
$pageSet = $this->getPageSet();
$result = $this->getResult();
@@ -299,9 +329,9 @@ class ApiQuery extends ApiBase {
// and the maximum result size must be even higher than that.
// Title normalizations
- $normValues = array ();
+ $normValues = array();
foreach ( $pageSet->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
- $normValues[] = array (
+ $normValues[] = array(
'from' => $rawTitleStr,
'to' => $titleStr
);
@@ -312,10 +342,24 @@ class ApiQuery extends ApiBase {
$result->addValue( 'query', 'normalized', $normValues );
}
+ // Title conversions
+ $convValues = array();
+ foreach ( $pageSet->getConvertedTitles() as $rawTitleStr => $titleStr ) {
+ $convValues[] = array(
+ 'from' => $rawTitleStr,
+ 'to' => $titleStr
+ );
+ }
+
+ if ( count( $convValues ) ) {
+ $result->setIndexedTagName( $convValues, 'c' );
+ $result->addValue( 'query', 'converted', $convValues );
+ }
+
// Interwiki titles
- $intrwValues = array ();
+ $intrwValues = array();
foreach ( $pageSet->getInterwikiTitles() as $rawTitleStr => $interwikiStr ) {
- $intrwValues[] = array (
+ $intrwValues[] = array(
'title' => $rawTitleStr,
'iw' => $interwikiStr
);
@@ -327,9 +371,9 @@ class ApiQuery extends ApiBase {
}
// Show redirect information
- $redirValues = array ();
+ $redirValues = array();
foreach ( $pageSet->getRedirectTitles() as $titleStrFrom => $titleStrTo ) {
- $redirValues[] = array (
+ $redirValues[] = array(
'from' => strval( $titleStrFrom ),
'to' => $titleStrTo
);
@@ -340,14 +384,12 @@ class ApiQuery extends ApiBase {
$result->addValue( 'query', 'redirects', $redirValues );
}
- //
// Missing revision elements
- //
$missingRevIDs = $pageSet->getMissingRevisionIDs();
if ( count( $missingRevIDs ) ) {
- $revids = array ();
+ $revids = array();
foreach ( $missingRevIDs as $revid ) {
- $revids[$revid] = array (
+ $revids[$revid] = array(
'revid' => $revid
);
}
@@ -355,39 +397,51 @@ class ApiQuery extends ApiBase {
$result->addValue( 'query', 'badrevids', $revids );
}
- //
// Page elements
- //
- $pages = array ();
+ $pages = array();
// Report any missing titles
foreach ( $pageSet->getMissingTitles() as $fakeId => $title ) {
$vals = array();
- ApiQueryBase :: addTitleInfo( $vals, $title );
+ ApiQueryBase::addTitleInfo( $vals, $title );
$vals['missing'] = '';
$pages[$fakeId] = $vals;
}
// Report any invalid titles
- foreach ( $pageSet->getInvalidTitles() as $fakeId => $title )
+ foreach ( $pageSet->getInvalidTitles() as $fakeId => $title ) {
$pages[$fakeId] = array( 'title' => $title, 'invalid' => '' );
+ }
// Report any missing page ids
foreach ( $pageSet->getMissingPageIDs() as $pageid ) {
- $pages[$pageid] = array (
+ $pages[$pageid] = array(
'pageid' => $pageid,
'missing' => ''
);
}
+ // Report special pages
+ foreach ( $pageSet->getSpecialTitles() as $fakeId => $title ) {
+ $vals = array();
+ ApiQueryBase::addTitleInfo( $vals, $title );
+ $vals['special'] = '';
+ if ( $title->getNamespace() == NS_SPECIAL &&
+ !SpecialPage::exists( $title->getDbKey() ) ) {
+ $vals['missing'] = '';
+ } elseif ( $title->getNamespace() == NS_MEDIA &&
+ !wfFindFile( $title ) ) {
+ $vals['missing'] = '';
+ }
+ $pages[$fakeId] = $vals;
+ }
// Output general page information for found titles
foreach ( $pageSet->getGoodTitles() as $pageid => $title ) {
$vals = array();
$vals['pageid'] = $pageid;
- ApiQueryBase :: addTitleInfo( $vals, $title );
+ ApiQueryBase::addTitleInfo( $vals, $title );
$pages[$pageid] = $vals;
}
if ( count( $pages ) ) {
-
if ( $this->params['indexpageids'] ) {
$pageIDs = array_keys( $pages );
// json treats all map keys as strings - converting to match
@@ -400,57 +454,76 @@ class ApiQuery extends ApiBase {
$result->addValue( 'query', 'pages', $pages );
}
if ( $this->params['export'] ) {
- $exporter = new WikiExporter( $this->getDB() );
- // WikiExporter writes to stdout, so catch its
- // output with an ob
- ob_start();
- $exporter->openStream();
- foreach ( @$pageSet->getGoodTitles() as $title )
- if ( $title->userCanRead() )
- $exporter->pageByTitle( $title );
- $exporter->closeStream();
- $exportxml = ob_get_contents();
- ob_end_clean();
-
- // Don't check the size of exported stuff
- // It's not continuable, so it would cause more
- // problems than it'd solve
- $result->disableSizeCheck();
- if ( $this->params['exportnowrap'] ) {
- $result->reset();
- // Raw formatter will handle this
- $result->addValue( null, 'text', $exportxml );
- $result->addValue( null, 'mime', 'text/xml' );
- } else {
- $r = array();
- ApiResult::setContent( $r, $exportxml );
- $result->addValue( 'query', 'export', $r );
+ $this->doExport( $pageSet, $result );
+ }
+ }
+
+ /**
+ * @param $pageSet ApiPageSet Pages to be exported
+ * @param $result ApiResult Result to output to
+ */
+ private function doExport( $pageSet, $result ) {
+ $exportTitles = array();
+ $titles = $pageSet->getGoodTitles();
+ if( count( $titles ) ) {
+ foreach ( $titles as $title ) {
+ if ( $title->userCanRead() ) {
+ $exportTitles[] = $title;
+ }
}
- $result->enableSizeCheck();
}
+ // only export when there are titles
+ if ( !count( $exportTitles ) ) {
+ return;
+ }
+
+ $exporter = new WikiExporter( $this->getDB() );
+ // WikiExporter writes to stdout, so catch its
+ // output with an ob
+ ob_start();
+ $exporter->openStream();
+ foreach ( $exportTitles as $title ) {
+ $exporter->pageByTitle( $title );
+ }
+ $exporter->closeStream();
+ $exportxml = ob_get_contents();
+ ob_end_clean();
+
+ // Don't check the size of exported stuff
+ // It's not continuable, so it would cause more
+ // problems than it'd solve
+ $result->disableSizeCheck();
+ if ( $this->params['exportnowrap'] ) {
+ $result->reset();
+ // Raw formatter will handle this
+ $result->addValue( null, 'text', $exportxml );
+ $result->addValue( null, 'mime', 'text/xml' );
+ } else {
+ $r = array();
+ ApiResult::setContent( $r, $exportxml );
+ $result->addValue( 'query', 'export', $r );
+ }
+ $result->enableSizeCheck();
}
/**
* Create a generator object of the given type and return it
+ * @param $generatorName string Module name
+ * @return ApiQueryGeneratorBase
*/
public function newGenerator( $generatorName ) {
-
// Find class that implements requested generator
- if ( isset ( $this->mQueryListModules[$generatorName] ) ) {
+ if ( isset( $this->mQueryListModules[$generatorName] ) ) {
$className = $this->mQueryListModules[$generatorName];
- } elseif ( isset ( $this->mQueryPropModules[$generatorName] ) ) {
+ } elseif ( isset( $this->mQueryPropModules[$generatorName] ) ) {
$className = $this->mQueryPropModules[$generatorName];
} else {
- ApiBase :: dieDebug( __METHOD__, "Unknown generator=$generatorName" );
+ ApiBase::dieDebug( __METHOD__, "Unknown generator=$generatorName" );
}
-
- // Generator results
- $resultPageSet = new ApiPageSet( $this, $this->redirects );
-
- // Create and execute the generator
$generator = new $className ( $this, $generatorName );
- if ( !$generator instanceof ApiQueryGeneratorBase )
- $this->dieUsage( "Module $generatorName cannot be used as a generator", "badgenerator" );
+ if ( !$generator instanceof ApiQueryGeneratorBase ) {
+ $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' );
+ }
$generator->setGeneratorMode();
return $generator;
}
@@ -458,7 +531,7 @@ class ApiQuery extends ApiBase {
/**
* For generator mode, execute generator, and use its output as new
* ApiPageSet
- * @param $generatorName string Module name
+ * @param $generator ApiQueryGeneratorBase Generator Module
* @param $modules array of module objects
*/
protected function executeGeneratorModule( $generator, $modules ) {
@@ -484,23 +557,24 @@ class ApiQuery extends ApiBase {
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => $this->mPropModuleNames
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $this->mPropModuleNames
),
- 'list' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => $this->mListModuleNames
+ 'list' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $this->mListModuleNames
),
- 'meta' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => $this->mMetaModuleNames
+ 'meta' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $this->mMetaModuleNames
),
- 'generator' => array (
- ApiBase :: PARAM_TYPE => $this->mAllowedGenerators
+ 'generator' => array(
+ ApiBase::PARAM_TYPE => $this->mAllowedGenerators
),
'redirects' => false,
+ 'converttitles' => false,
'indexpageids' => false,
'export' => false,
'exportnowrap' => false,
@@ -512,49 +586,48 @@ class ApiQuery extends ApiBase {
* @return string
*/
public function makeHelpMsg() {
-
$msg = '';
// Make sure the internal object is empty
// (just in case a sub-module decides to optimize during instantiation)
$this->mPageSet = null;
- $this->mAllowedGenerators = array(); // Will be repopulated
+ $this->mAllowedGenerators = array(); // Will be repopulated
- $astriks = str_repeat( '--- ', 8 );
- $astriks2 = str_repeat( '*** ', 10 );
- $msg .= "\n$astriks Query: Prop $astriks\n\n";
+ $querySeparator = str_repeat( '--- ', 8 );
+ $moduleSeparator = str_repeat( '*** ', 10 );
+ $msg .= "\n$querySeparator Query: Prop $querySeparator\n\n";
$msg .= $this->makeHelpMsgHelper( $this->mQueryPropModules, 'prop' );
- $msg .= "\n$astriks Query: List $astriks\n\n";
+ $msg .= "\n$querySeparator Query: List $querySeparator\n\n";
$msg .= $this->makeHelpMsgHelper( $this->mQueryListModules, 'list' );
- $msg .= "\n$astriks Query: Meta $astriks\n\n";
+ $msg .= "\n$querySeparator Query: Meta $querySeparator\n\n";
$msg .= $this->makeHelpMsgHelper( $this->mQueryMetaModules, 'meta' );
- $msg .= "\n\n$astriks2 Modules: continuation $astriks2\n\n";
+ $msg .= "\n\n$moduleSeparator Modules: continuation $moduleSeparator\n\n";
// Perform the base call last because the $this->mAllowedGenerators
// will be updated inside makeHelpMsgHelper()
// Use parent to make default message for the query module
- $msg = parent :: makeHelpMsg() . $msg;
+ $msg = parent::makeHelpMsg() . $msg;
return $msg;
}
/**
* For all modules in $moduleList, generate help messages and join them together
- * @param $moduleList array(modulename => classname)
+ * @param $moduleList Array array(modulename => classname)
* @param $paramName string Parameter name
* @return string
*/
private function makeHelpMsgHelper( $moduleList, $paramName ) {
-
- $moduleDescriptions = array ();
+ $moduleDescriptions = array();
foreach ( $moduleList as $moduleName => $moduleClass ) {
$module = new $moduleClass ( $this, $moduleName, null );
$msg = ApiMain::makeHelpMsgHeader( $module, $paramName );
$msg2 = $module->makeHelpMsg();
- if ( $msg2 !== false )
+ if ( $msg2 !== false ) {
$msg .= $msg2;
+ }
if ( $module instanceof ApiQueryGeneratorBase ) {
$this->mAllowedGenerators[] = $moduleName;
$msg .= "Generator:\n This module may be used as a generator\n";
@@ -571,7 +644,7 @@ class ApiQuery extends ApiBase {
*/
public function makeHelpMsgParameters() {
$psModule = new ApiPageSet( $this );
- return $psModule->makeHelpMsgParameters() . parent :: makeHelpMsgParameters();
+ return $psModule->makeHelpMsgParameters() . parent::makeHelpMsgParameters();
}
public function shouldCheckMaxlag() {
@@ -579,27 +652,29 @@ class ApiQuery extends ApiBase {
}
public function getParamDescription() {
- return array (
- 'prop' => 'Which properties to get for the titles/revisions/pageids',
- 'list' => 'Which lists to get',
- 'meta' => 'Which meta data to get about the site',
+ return array(
+ 'prop' => 'Which properties to get for the titles/revisions/pageids. Module help is available below',
+ 'list' => 'Which lists to get. Module help is available below',
+ 'meta' => 'Which metadata to get about the site. Module help is available below',
'generator' => array( 'Use the output of a list as the input for other prop/list/meta items',
- 'NOTE: generator parameter names must be prefixed with a \'g\', see examples.' ),
+ 'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ),
'redirects' => 'Automatically resolve redirects',
- 'indexpageids' => 'Include an additional pageids section listing all returned page IDs.',
+ 'converttitles' => array( "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion.",
+ 'Languages that support variant conversion include kk, ku, gan, tg, sr, zh' ),
+ 'indexpageids' => 'Include an additional pageids section listing all returned page IDs',
'export' => 'Export the current revisions of all given or generated pages',
'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
);
}
public function getDescription() {
- return array (
+ return array(
'Query API module allows applications to get needed pieces of data from the MediaWiki databases,',
'and is loosely based on the old query.php interface.',
- 'All data modifications will first have to use query to acquire a token to prevent abuse from malicious sites.'
+ 'All data modifications will first have to use query to acquire a token to prevent abuse from malicious sites'
);
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'badgenerator', 'info' => 'Module $generatorName cannot be used as a generator' ),
@@ -607,7 +682,7 @@ class ApiQuery extends ApiBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment',
'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions',
);
@@ -615,8 +690,8 @@ class ApiQuery extends ApiBase {
public function getVersion() {
$psModule = new ApiPageSet( $this );
- $vers = array ();
- $vers[] = __CLASS__ . ': $Id: ApiQuery.php 69932 2010-07-26 08:03:21Z tstarling $';
+ $vers = array();
+ $vers[] = __CLASS__ . ': $Id: ApiQuery.php 80897 2011-01-24 18:57:42Z catrope $';
$vers[] = $psModule->getVersion();
return $vers;
}
diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php
index 8f24fc7c..c1473252 100644
--- a/includes/api/ApiQueryAllCategories.php
+++ b/includes/api/ApiQueryAllCategories.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on December 12, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on December 12, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,7 +38,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryAllCategories extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'ac' );
+ parent::__construct( $query, $moduleName, 'ac' );
}
public function execute() {
@@ -53,7 +54,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
$db = $this->getDB();
$params = $this->extractRequestParams();
@@ -62,17 +62,19 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
$dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
$from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
- $this->addWhereRange( 'cat_title', $dir, $from, null );
- if ( isset ( $params['prefix'] ) )
+ $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+ $this->addWhereRange( 'cat_title', $dir, $from, $to );
+
+ 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' : '' ) );
$prop = array_flip( $params['prop'] );
$this->addFieldsIf( array( 'cat_pages', 'cat_subcats', 'cat_files' ), isset( $prop['size'] ) );
- if ( isset( $prop['hidden'] ) )
- {
+ if ( isset( $prop['hidden'] ) ) {
$this->addTables( array( 'page', 'page_props' ) );
$this->addJoinConds( array(
'page' => array( 'LEFT JOIN', array(
@@ -88,10 +90,10 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
$res = $this->select( __METHOD__ );
$pages = array();
- $categories = array();
+
$result = $this->getResult();
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++ $count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional cats to be had. Stop here...
// TODO: Security issue - if the user has no right to view next title, it will still be shown
@@ -101,9 +103,9 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
// Normalize titles
$titleObj = Title::makeTitle( NS_CATEGORY, $row->cat_title );
- if ( !is_null( $resultPageSet ) )
+ if ( !is_null( $resultPageSet ) ) {
$pages[] = $titleObj->getPrefixedText();
- else {
+ } else {
$item = array();
$result->setContent( $item, $titleObj->getText() );
if ( isset( $prop['size'] ) ) {
@@ -112,17 +114,16 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
$item['files'] = intval( $row->cat_files );
$item['subcats'] = intval( $row->cat_subcats );
}
- if ( isset( $prop['hidden'] ) && $row->cat_hidden )
+ if ( isset( $prop['hidden'] ) && $row->cat_hidden ) {
$item['hidden'] = '';
+ }
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $item );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->cat_title ) );
break;
}
}
}
- $db->freeResult( $res );
if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'c' );
@@ -132,38 +133,44 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'from' => null,
+ 'to' => null,
'prefix' => null,
'dir' => array(
- ApiBase :: PARAM_DFLT => 'ascending',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
'ascending',
'descending'
),
),
- '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
+ '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
),
- 'prop' => array (
- ApiBase :: PARAM_TYPE => array( 'size', 'hidden' ),
- ApiBase :: PARAM_DFLT => '',
- ApiBase :: PARAM_ISMULTI => true
+ 'prop' => array(
+ ApiBase::PARAM_TYPE => array( 'size', 'hidden' ),
+ ApiBase::PARAM_DFLT => '',
+ ApiBase::PARAM_ISMULTI => true
),
);
}
public function getParamDescription() {
- return array (
- 'from' => 'The category to start enumerating from.',
- 'prefix' => 'Search for all category titles that begin with this value.',
- 'dir' => 'Direction to sort in.',
- 'limit' => 'How many categories to return.',
- 'prop' => 'Which properties to get',
+ return array(
+ 'from' => 'The category to start enumerating from',
+ 'to' => 'The category to stop enumerating at',
+ 'prefix' => 'Search for all category titles that begin with this value',
+ 'dir' => 'Direction to sort in',
+ 'limit' => 'How many categories to return',
+ 'prop' => array(
+ 'Which properties to get',
+ ' size - Adds number of pages in the category',
+ ' hidden - Tags categories that are hidden with __HIDDENCAT__',
+ ),
);
}
@@ -172,13 +179,13 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=allcategories&acprop=size',
'api.php?action=query&generator=allcategories&gacprefix=List&prop=info',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllCategories.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryAllCategories.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php
index 6b6fc2c0..78784845 100644
--- a/includes/api/ApiQueryAllLinks.php
+++ b/includes/api/ApiQueryAllLinks.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 7, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on July 7, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryAllLinks extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'al' );
+ parent::__construct( $query, $moduleName, 'al' );
}
public function execute() {
@@ -52,7 +53,6 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
$db = $this->getDB();
$params = $this->extractRequestParams();
@@ -61,36 +61,46 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
$fld_title = isset( $prop['title'] );
if ( $params['unique'] ) {
- if ( !is_null( $resultPageSet ) )
+ if ( !is_null( $resultPageSet ) ) {
$this->dieUsage( $this->getModuleName() . ' cannot be used as a generator in unique links mode', 'params' );
- if ( $fld_ids )
+ }
+ if ( $fld_ids ) {
$this->dieUsage( $this->getModuleName() . ' cannot return corresponding page ids in unique links mode', 'params' );
+ }
$this->addOption( 'DISTINCT' );
}
$this->addTables( 'pagelinks' );
$this->addWhereFld( 'pl_namespace', $params['namespace'] );
-
- if ( !is_null( $params['from'] ) && !is_null( $params['continue'] ) )
+
+ if ( !is_null( $params['from'] ) && !is_null( $params['continue'] ) ) {
$this->dieUsage( 'alcontinue and alfrom cannot be used together', 'params' );
- if ( !is_null( $params['continue'] ) )
- {
+ }
+ if ( !is_null( $params['continue'] ) ) {
$arr = explode( '|', $params['continue'] );
- if ( count( $arr ) != 2 )
- $this->dieUsage( "Invalid continue parameter", 'badcontinue' );
+ if ( count( $arr ) != 2 ) {
+ $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
+ }
$from = $this->getDB()->strencode( $this->titleToKey( $arr[0] ) );
$id = intval( $arr[1] );
- $this->addWhere( "pl_title > '$from' OR " .
- "(pl_title = '$from' AND " .
- "pl_from > $id)" );
+ $this->addWhere(
+ "pl_title > '$from' OR " .
+ "(pl_title = '$from' AND " .
+ "pl_from > $id)"
+ );
}
- if ( !is_null( $params['from'] ) )
+ if ( !is_null( $params['from'] ) ) {
$this->addWhere( 'pl_title>=' . $db->addQuotes( $this->titlePartToKey( $params['from'] ) ) );
- if ( isset ( $params['prefix'] ) )
+ }
+ if ( !is_null( $params['to'] ) ) {
+ $this->addWhere( 'pl_title<=' . $db->addQuotes( $this->titlePartToKey( $params['to'] ) ) );
+ }
+ if ( isset( $params['prefix'] ) ) {
$this->addWhere( 'pl_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+ }
- $this->addFields( array (
+ $this->addFields( array(
'pl_title',
) );
$this->addFieldsIf( 'pl_from', !$params['unique'] );
@@ -98,49 +108,51 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
$this->addOption( 'USE INDEX', 'pl_namespace' );
$limit = $params['limit'];
$this->addOption( 'LIMIT', $limit + 1 );
- if ( $params['unique'] )
+ if ( $params['unique'] ) {
$this->addOption( 'ORDER BY', 'pl_title' );
- else
+ } else {
$this->addOption( 'ORDER BY', 'pl_title, pl_from' );
+ }
$res = $this->select( __METHOD__ );
- $pageids = array ();
+ $pageids = array();
$count = 0;
$result = $this->getResult();
- while ( $row = $db->fetchObject( $res ) ) {
+ 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
- if ( $params['unique'] )
+ if ( $params['unique'] ) {
$this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->pl_title ) );
- else
+ } else {
$this->setContinueEnumParameter( 'continue', $this->keyToTitle( $row->pl_title ) . "|" . $row->pl_from );
+ }
break;
}
if ( is_null( $resultPageSet ) ) {
$vals = array();
- if ( $fld_ids )
+ if ( $fld_ids ) {
$vals['fromid'] = intval( $row->pl_from );
+ }
if ( $fld_title ) {
- $title = Title :: makeTitle( $params['namespace'], $row->pl_title );
+ $title = Title::makeTitle( $params['namespace'], $row->pl_title );
ApiQueryBase::addTitleInfo( $vals, $title );
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
- if ( $params['unique'] )
+ if ( !$fit ) {
+ if ( $params['unique'] ) {
$this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->pl_title ) );
- else
+ } else {
$this->setContinueEnumParameter( 'continue', $this->keyToTitle( $row->pl_title ) . "|" . $row->pl_from );
+ }
break;
}
} else {
$pageids[] = $row->pl_from;
}
}
- $db->freeResult( $res );
if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'l' );
@@ -150,65 +162,73 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'continue' => null,
'from' => null,
+ 'to' => null,
'prefix' => null,
'unique' => false,
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'title',
- ApiBase :: PARAM_TYPE => array (
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'title',
+ ApiBase::PARAM_TYPE => array(
'ids',
'title'
)
),
- 'namespace' => array (
- ApiBase :: PARAM_DFLT => 0,
- ApiBase :: PARAM_TYPE => 'namespace'
+ 'namespace' => array(
+ ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_TYPE => 'namespace'
),
- '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
+ '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
)
);
}
public function getParamDescription() {
- return array (
- 'from' => 'The page title to start enumerating from.',
- 'prefix' => 'Search for all page titles that begin with this value.',
- 'unique' => 'Only show unique links. Cannot be used with generator or prop=ids',
- 'prop' => 'What pieces of information to include',
- 'namespace' => 'The namespace to enumerate.',
- 'limit' => 'How many total links to return.',
- 'continue' => 'When more results are available, use this to continue.',
+ $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',
+ 'unique' => "Only show unique links. Cannot be used with generator or {$p}prop=ids",
+ 'prop' => array(
+ 'What pieces of information to include',
+ " ids - Adds pageid of where the link is from (Cannot be used with {$p}unique)",
+ ' title - Adds the title of the link',
+ ),
+ 'namespace' => 'The namespace to enumerate',
+ 'limit' => 'How many total links to return',
+ 'continue' => 'When more results are available, use this to continue',
);
}
public function getDescription() {
return 'Enumerate all links that point to a given namespace';
}
-
+
public function getPossibleErrors() {
+ $m = $this->getModuleName();
return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => 'params', 'info' => $this->getModuleName() . ' cannot be used as a generator in unique links mode' ),
- array( 'code' => 'params', 'info' => $this->getModuleName() . ' cannot return corresponding page ids in unique links mode' ),
+ array( 'code' => 'params', 'info' => "{$m} cannot be used as a generator in unique links mode" ),
+ array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique links mode" ),
array( 'code' => 'params', 'info' => 'alcontinue and alfrom cannot be used together' ),
array( 'code' => 'badcontinue', 'info' => 'Invalid continue parameter' ),
) );
}
protected function getExamples() {
- return array (
- 'api.php?action=query&list=alllinks&alunique&alfrom=B',
+ return array(
+ 'api.php?action=query&list=alllinks&alunique=&alfrom=B',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllLinks.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryAllLinks.php 77192 2010-11-23 22:05:27Z btongminh $';
}
}
diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php
index 611fc98c..77f507fc 100644
--- a/includes/api/ApiQueryAllUsers.php
+++ b/includes/api/ApiQueryAllUsers.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 7, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on July 7, 2007
+ *
+ * Copyright © 2007 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -34,9 +35,8 @@ if ( !defined( 'MEDIAWIKI' ) ) {
* @ingroup API
*/
class ApiQueryAllUsers extends ApiQueryBase {
-
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'au' );
+ parent::__construct( $query, $moduleName, 'au' );
}
public function execute() {
@@ -51,18 +51,23 @@ class ApiQueryAllUsers extends ApiQueryBase {
$fld_groups = isset( $prop['groups'] );
$fld_registration = isset( $prop['registration'] );
} else {
- $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration = false;
+ $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration = $fld_rights = false;
}
$limit = $params['limit'];
$this->addTables( 'user', 'u1' );
$useIndex = true;
- if ( !is_null( $params['from'] ) )
+ if ( !is_null( $params['from'] ) ) {
$this->addWhere( 'u1.user_name >= ' . $db->addQuotes( $this->keyToTitle( $params['from'] ) ) );
+ }
+ if ( !is_null( $params['to'] ) ) {
+ $this->addWhere( 'u1.user_name <= ' . $db->addQuotes( $this->keyToTitle( $params['to'] ) ) );
+ }
- if ( !is_null( $params['prefix'] ) )
+ if ( !is_null( $params['prefix'] ) ) {
$this->addWhere( 'u1.user_name' . $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
+ }
if ( !is_null( $params['group'] ) ) {
$useIndex = false;
@@ -73,8 +78,9 @@ class ApiQueryAllUsers extends ApiQueryBase {
'ug1.ug_group' => $params['group'] ) ) ) );
}
- if ( $params['witheditsonly'] )
+ if ( $params['witheditsonly'] ) {
$this->addWhere( 'u1.user_editcount > 0' );
+ }
if ( $fld_groups ) {
// Show the groups the given users belong to
@@ -89,19 +95,14 @@ class ApiQueryAllUsers extends ApiQueryBase {
} else {
$sqlLimit = $limit + 1;
}
- if ( $fld_blockinfo ) {
- $this->addTables( 'ipblocks' );
- $this->addTables( 'user', 'u2' );
- $u2 = $this->getAliasedName( 'user', 'u2' );
- $this->addJoinConds( array(
- 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=u1.user_id' ),
- $u2 => array( 'LEFT JOIN', 'ipb_by=u2.user_id' ) ) );
- $this->addFields( array( 'ipb_reason', 'u2.user_name AS blocker_name' ) );
- }
+ $this->showHiddenUsersAddBlockInfo( $fld_blockinfo );
$this->addOption( 'LIMIT', $sqlLimit );
- $this->addFields( 'u1.user_name' );
+ $this->addFields( array(
+ 'u1.user_name',
+ 'u1.user_id'
+ ) );
$this->addFieldsIf( 'u1.user_editcount', $fld_editcount );
$this->addFieldsIf( 'u1.user_registration', $fld_registration );
@@ -113,7 +114,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
$res = $this->select( __METHOD__ );
- $data = array ();
$count = 0;
$lastUserData = false;
$lastUser = false;
@@ -125,30 +125,25 @@ class ApiQueryAllUsers extends ApiQueryBase {
// Otherwise, the group of the new row is appended to the last entry.
// The setContinue... is more complex because of this, and takes into account the higher sql limit
// to make sure all rows that belong to the same user are received.
- //
- while ( true ) {
- $row = $db->fetchObject( $res );
+ foreach ( $res as $row ) {
$count++;
- if ( !$row || $lastUser !== $row->user_name ) {
+ if ( $lastUser !== $row->user_name ) {
// Save the last pass's user data
- if ( is_array( $lastUserData ) )
- {
+ if ( is_array( $lastUserData ) ) {
$fit = $result->addValue( array( 'query', $this->getModuleName() ),
null, $lastUserData );
- if ( !$fit )
- {
+
+ $lastUserData = null;
+
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'from',
$this->keyToTitle( $lastUserData['name'] ) );
break;
}
}
- // No more rows left
- if ( !$row )
- 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 ) );
@@ -157,23 +152,31 @@ class ApiQueryAllUsers extends ApiQueryBase {
// Record new user's data
$lastUser = $row->user_name;
- $lastUserData = array( 'name' => $lastUser );
- if ( $fld_blockinfo ) {
+ $lastUserData = array(
+ 'name' => $lastUser,
+ 'userid' => $row->user_id,
+ );
+ if ( $fld_blockinfo && !is_null( $row->blocker_name ) ) {
$lastUserData['blockedby'] = $row->blocker_name;
$lastUserData['blockreason'] = $row->ipb_reason;
}
- if ( $fld_editcount )
+ if ( $row->ipb_deleted ) {
+ $lastUserData['hidden'] = '';
+ }
+ if ( $fld_editcount ) {
$lastUserData['editcount'] = intval( $row->user_editcount );
- if ( $fld_registration )
+ }
+ if ( $fld_registration ) {
$lastUserData['registration'] = $row->user_registration ?
wfTimestamp( TS_ISO_8601, $row->user_registration ) : '';
+ }
}
if ( $sqlLimit == $count ) {
// BUG! database contains group name that User::getAllGroups() does not return
// TODO: should handle this more gracefully
- ApiBase :: dieDebug( __METHOD__,
+ ApiBase::dieDebug( __METHOD__,
'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
}
@@ -185,57 +188,63 @@ class ApiQueryAllUsers extends ApiQueryBase {
}
if ( is_array( $lastUserData ) ) {
- $fit = $result->addValue( array( 'query', $this->getModuleName() ),
- null, $lastUserData );
- if ( !$fit ) {
- $this->setContinueEnumParameter( 'from',
- $this->keyToTitle( $lastUserData['name'] ) );
- }
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ),
+ null, $lastUserData );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'from',
+ $this->keyToTitle( $lastUserData['name'] ) );
+ }
}
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'u' );
}
public function getCacheMode( $params ) {
- return 'public';
+ return 'anon-public-user-private';
}
public function getAllowedParams() {
- return array (
+ return array(
'from' => null,
+ 'to' => null,
'prefix' => null,
'group' => array(
- ApiBase :: PARAM_TYPE => User::getAllGroups()
+ ApiBase::PARAM_TYPE => User::getAllGroups()
),
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'blockinfo',
'groups',
'editcount',
'registration'
)
),
- '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
+ '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
),
'witheditsonly' => false,
);
}
public function getParamDescription() {
- return array (
- 'from' => 'The user name to start enumerating from.',
- 'prefix' => 'Search for all page titles that begin with this value.',
+ return array(
+ 'from' => 'The user name to start enumerating from',
+ 'to' => 'The user name to stop enumerating at',
+ 'prefix' => 'Search for all users that begin with this value',
'group' => 'Limit users to a given group name',
'prop' => array(
'What pieces of information to include.',
- '`groups` property uses more server resources and may return fewer results than the limit.' ),
- 'limit' => 'How many total user names to return.',
+ ' blockinfo - Adds the information about a current block on the user',
+ ' groups - Lists groups that the user is in',
+ ' editcount - Adds the edit count of the user',
+ ' registration - Adds the timestamp of when the user registered',
+ '`groups` property uses more server resources and may return fewer results than the limit' ),
+ 'limit' => 'How many total user names to return',
'witheditsonly' => 'Only list users who have made edits',
);
}
@@ -245,12 +254,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=allusers&aufrom=Y',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllUsers.php 79562 2011-01-04 06:15:54Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryAllUsers.php 85354 2011-04-04 18:25:31Z demon $';
}
}
diff --git a/includes/api/ApiQueryAllimages.php b/includes/api/ApiQueryAllimages.php
index 0a745516..a7825519 100644
--- a/includes/api/ApiQueryAllimages.php
+++ b/includes/api/ApiQueryAllimages.php
@@ -1,11 +1,11 @@
<?php
-/*
- * Created on Mar 16, 2008
- *
+/**
* API for MediaWiki 1.12+
*
- * Copyright (C) 2008 Vasiliev Victor vasilvv@gmail.com,
+ * 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
@@ -20,13 +20,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,14 +39,14 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryAllimages extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'ai' );
+ parent::__construct( $query, $moduleName, 'ai' );
$this->mRepo = RepoGroup::singleton()->getLocalRepo();
}
-
+
/**
* Overide 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.
*/
protected function getDB() {
@@ -60,16 +62,18 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
}
public function executeGenerator( $resultPageSet ) {
- if ( $resultPageSet->isResolvingRedirects() )
+ if ( $resultPageSet->isResolvingRedirects() ) {
$this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
+ }
$this->run( $resultPageSet );
}
private function run( $resultPageSet = null ) {
$repo = $this->mRepo;
- if ( !$repo instanceof LocalRepo )
+ if ( !$repo instanceof LocalRepo ) {
$this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
+ }
$db = $this->getDB();
@@ -78,15 +82,17 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
// Image filters
$dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
$from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
- $this->addWhereRange( 'img_name', $dir, $from, null );
- if ( isset ( $params['prefix'] ) )
+ $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'] ) ) {
+ if ( isset( $params['minsize'] ) ) {
$this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
}
- if ( isset ( $params['maxsize'] ) ) {
+ if ( isset( $params['maxsize'] ) ) {
$this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
}
@@ -115,7 +121,7 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
$titles = array();
$count = 0;
$result = $this->getResult();
- while ( $row = $db->fetchObject( $res ) ) {
+ 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
@@ -136,7 +142,6 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
$titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
}
}
- $db->freeResult( $res );
if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
@@ -148,55 +153,71 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
public function getAllowedParams() {
return array (
'from' => null,
+ 'to' => null,
'prefix' => null,
- 'minsize' => array (
- ApiBase :: PARAM_TYPE => 'integer',
+ 'minsize' => array(
+ ApiBase::PARAM_TYPE => 'integer',
),
- 'maxsize' => 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
+ '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 (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
'ascending',
'descending'
)
),
'sha1' => null,
'sha1base36' => null,
- 'prop' => array (
- ApiBase :: PARAM_TYPE => ApiQueryImageInfo::getPropertyNames(),
- ApiBase :: PARAM_DFLT => 'timestamp|url',
- ApiBase :: PARAM_ISMULTI => true
+ 'prop' => array(
+ ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames(),
+ ApiBase::PARAM_DFLT => 'timestamp|url',
+ ApiBase::PARAM_ISMULTI => true
)
);
}
public function getParamDescription() {
- return array (
- 'from' => 'The image title to start enumerating from.',
- 'prefix' => 'Search for all image titles that begin with this value.',
+ 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 total images to return.',
- 'sha1' => 'SHA1 hash of image',
+ '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' => 'Which properties to get',
+ 'prop' => array(
+ 'Which properties to get',
+ ' timestamp - Adds the timestamp when the image was upload',
+ ' user - Adds the username of the last uploader',
+ ' userid - Adds the user id of the last uploader',
+ ' comment - Adds the comment of the last upload',
+ ' url - Adds the URL of the image and its description page',
+ ' size - Adds the size of the image in bytes and its height and width',
+ ' dimensions - Alias of size',
+ ' sha1 - Adds the sha1 of the image',
+ ' mime - Adds the MIME of the image',
+ ' thumbmime - Adds the MIME of the tumbnail for the image',
+ ' archivename - Adds the file name of the archive version for non-latest versions',
+ ' bitdepth - Adds the bit depth of the version',
+ ),
);
}
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' ),
@@ -205,7 +226,7 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
+ return array(
'Simple Use',
' Show a list of images starting at the letter "B"',
' api.php?action=query&list=allimages&aifrom=B',
@@ -216,6 +237,6 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllimages.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryAllimages.php 71838 2010-08-28 01:18:18Z reedy $';
}
}
diff --git a/includes/api/ApiQueryAllmessages.php b/includes/api/ApiQueryAllmessages.php
index 7dd9d874..81ff255a 100644
--- a/includes/api/ApiQueryAllmessages.php
+++ b/includes/api/ApiQueryAllmessages.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Dec 1, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,22 +37,23 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryAllmessages extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'am' );
+ parent::__construct( $query, $moduleName, 'am' );
}
public function execute() {
$params = $this->extractRequestParams();
- if ( !is_null( $params['lang'] ) )
- {
- global $wgLang;
+ global $wgLang;
+
+ $oldLang = null;
+ if ( !is_null( $params['lang'] ) ) {
+ $oldLang = $wgLang; // Keep $wgLang for restore later
$wgLang = Language::factory( $params['lang'] );
}
-
+
$prop = array_flip( (array)$params['prop'] );
// Determine which messages should we print
- $messages_target = array();
if ( in_array( '*', $params['messages'] ) ) {
$message_names = array_keys( Language::getMessagesFor( 'en' ) );
sort( $message_names );
@@ -64,7 +66,8 @@ class ApiQueryAllmessages extends ApiQueryBase {
if ( isset( $params['filter'] ) ) {
$messages_filtered = array();
foreach ( $messages_target as $message ) {
- if ( strpos( $message, $params['filter'] ) !== false ) { // !== is used because filter can be at the beginnig of the string
+ // !== is used because filter can be at the beginning of the string
+ if ( strpos( $message, $params['filter'] ) !== false ) {
$messages_filtered[] = $message;
}
}
@@ -72,13 +75,18 @@ class ApiQueryAllmessages extends ApiQueryBase {
}
// Get all requested messages and print the result
- $messages = array();
$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'] )
+ if ( $skip && $message === $params['from'] ) {
$skip = false;
+ }
+
+ if( $useto && $message > $params['to'] ) {
+ break;
+ }
if ( !$skip ) {
$a = array( 'name' => $message );
@@ -89,35 +97,40 @@ class ApiQueryAllmessages extends ApiQueryBase {
// Check if the parser is enabled:
if ( $params['enableparser'] ) {
$msg = wfMsgExt( $message, array( 'parsemag' ), $args );
- } else if ( $args ) {
+ } elseif ( $args ) {
$msgString = wfMsgGetKey( $message, true, false, false );
$msg = wfMsgReplaceArgs( $msgString, $args );
} else {
$msg = wfMsgGetKey( $message, true, false, false );
}
- if ( wfEmptyMsg( $message, $msg ) )
+ if ( wfEmptyMsg( $message, $msg ) ) {
$a['missing'] = '';
- else {
+ } else {
ApiResult::setContent( $a, $msg );
if ( isset( $prop['default'] ) ) {
$default = wfMsgGetKey( $message, false, false, false );
if ( $default !== $msg ) {
- if ( wfEmptyMsg( $message, $default ) )
+ if ( wfEmptyMsg( $message, $default ) ) {
$a['defaultmissing'] = '';
- else
+ } else {
$a['default'] = $default;
+ }
}
}
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
if ( !$fit ) {
- $this->setContinueEnumParameter( 'from', $name );
+ $this->setContinueEnumParameter( 'from', $message );
break;
}
}
}
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
+
+ if ( !is_null( $oldLang ) ) {
+ $wgLang = $oldLang; // Restore $oldLang
+ }
}
public function getCacheMode( $params ) {
@@ -134,29 +147,30 @@ class ApiQueryAllmessages extends ApiQueryBase {
}
public function getAllowedParams() {
- return array (
- 'messages' => array (
- ApiBase :: PARAM_DFLT => '*',
- ApiBase :: PARAM_ISMULTI => true,
+ return array(
+ 'messages' => array(
+ ApiBase::PARAM_DFLT => '*',
+ ApiBase::PARAM_ISMULTI => true,
),
'prop' => array(
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'default'
)
),
'enableparser' => false,
'args' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true
),
'filter' => array(),
'lang' => null,
'from' => null,
+ 'to' => null,
);
}
public function getParamDescription() {
- return array (
+ return array(
'messages' => 'Which messages to output. "*" means all messages',
'prop' => 'Which properties to get',
'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
@@ -165,21 +179,22 @@ class ApiQueryAllmessages extends ApiQueryBase {
'filter' => 'Return only messages that contain this string',
'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.';
+ return 'Return messages from this site';
}
protected function getExamples() {
return array(
'api.php?action=query&meta=allmessages&amfilter=ipb-',
'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
- );
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllmessages.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryAllmessages.php 73756 2010-09-25 17:08:23Z reedy $';
}
}
diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php
index 37f22ee2..21f72916 100644
--- a/includes/api/ApiQueryAllpages.php
+++ b/includes/api/ApiQueryAllpages.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 25, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryAllpages extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'ap' );
+ parent::__construct( $query, $moduleName, 'ap' );
}
public function execute() {
@@ -48,8 +49,9 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
}
public function executeGenerator( $resultPageSet ) {
- if ( $resultPageSet->isResolvingRedirects() )
+ if ( $resultPageSet->isResolvingRedirects() ) {
$this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
+ }
$this->run( $resultPageSet );
}
@@ -61,22 +63,25 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
// Page filters
$this->addTables( 'page' );
-
- if ( $params['filterredir'] == 'redirects' )
+
+ if ( $params['filterredir'] == 'redirects' ) {
$this->addWhereFld( 'page_is_redirect', 1 );
- else if ( $params['filterredir'] == 'nonredirects' )
+ } 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'] ) );
- $this->addWhereRange( 'page_title', $dir, $from, null );
+ $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+ $this->addWhereRange( 'page_title', $dir, $from, $to );
- if ( isset ( $params['prefix'] ) )
+ if ( isset( $params['prefix'] ) ) {
$this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+ }
if ( is_null( $resultPageSet ) ) {
- $selectFields = array (
+ $selectFields = array(
'page_namespace',
'page_title',
'page_id'
@@ -87,40 +92,42 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
$this->addFields( $selectFields );
$forceNameTitleIndex = true;
- if ( isset ( $params['minsize'] ) ) {
+ if ( isset( $params['minsize'] ) ) {
$this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
$forceNameTitleIndex = false;
}
- if ( isset ( $params['maxsize'] ) ) {
+ if ( isset( $params['maxsize'] ) ) {
$this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
$forceNameTitleIndex = false;
}
// Page protection filtering
- if ( !empty ( $params['prtype'] ) ) {
+ if ( !empty( $params['prtype'] ) ) {
$this->addTables( 'page_restrictions' );
$this->addWhere( 'page_id=pr_page' );
$this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
$this->addWhereFld( 'pr_type', $params['prtype'] );
- if ( isset ( $params['prlevel'] ) ) {
+ if ( isset( $params['prlevel'] ) ) {
// Remove the empty string and '*' from the prlevel array
$prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
-
- if ( !empty( $prlevel ) )
+
+ if ( !empty( $prlevel ) ) {
$this->addWhereFld( 'pr_level', $prlevel );
+ }
}
- if ( $params['prfiltercascade'] == 'cascading' )
+ if ( $params['prfiltercascade'] == 'cascading' ) {
$this->addWhereFld( 'pr_cascade', 1 );
- else if ( $params['prfiltercascade'] == 'noncascading' )
+ } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
$this->addWhereFld( 'pr_cascade', 0 );
+ }
$this->addOption( 'DISTINCT' );
$forceNameTitleIndex = false;
- } else if ( isset ( $params['prlevel'] ) ) {
+ } elseif ( isset( $params['prlevel'] ) ) {
$this->dieUsage( 'prlevel may not be used without prtype', 'params' );
}
@@ -129,7 +136,7 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
$this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
$this->addWhere( 'll_from IS NULL' );
$forceNameTitleIndex = false;
- } else if ( $params['filterlanglinks'] == 'withlanglinks' ) {
+ } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
$this->addTables( 'langlinks' );
$this->addWhere( 'page_id=ll_from' );
$this->addOption( 'STRAIGHT_JOIN' );
@@ -139,8 +146,9 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
$forceNameTitleIndex = false;
}
- if ( $forceNameTitleIndex )
+ if ( $forceNameTitleIndex ) {
$this->addOption( 'USE INDEX', 'name_title' );
+ }
$limit = $params['limit'];
$this->addOption( 'LIMIT', $limit + 1 );
@@ -148,7 +156,7 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
$count = 0;
$result = $this->getResult();
- while ( $row = $db->fetchObject( $res ) ) {
+ 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
@@ -157,14 +165,14 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
}
if ( is_null( $resultPageSet ) ) {
- $title = Title :: makeTitle( $row->page_namespace, $row->page_title );
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
$vals = array(
'pageid' => intval( $row->page_id ),
'ns' => intval( $title->getNamespace() ),
- 'title' => $title->getPrefixedText() );
+ 'title' => $title->getPrefixedText()
+ );
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
break;
}
@@ -172,7 +180,6 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
$resultPageSet->processDbRow( $row );
}
}
- $db->freeResult( $res );
if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
@@ -180,82 +187,85 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- global $wgRestrictionTypes, $wgRestrictionLevels;
+ global $wgRestrictionLevels;
- return array (
+ return array(
'from' => null,
+ 'to' => null,
'prefix' => null,
- 'namespace' => array (
- ApiBase :: PARAM_DFLT => 0,
- ApiBase :: PARAM_TYPE => 'namespace',
+ 'namespace' => array(
+ ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_TYPE => 'namespace',
),
- 'filterredir' => array (
- ApiBase :: PARAM_DFLT => 'all',
- ApiBase :: PARAM_TYPE => array (
+ 'filterredir' => array(
+ ApiBase::PARAM_DFLT => 'all',
+ ApiBase::PARAM_TYPE => array(
'all',
'redirects',
'nonredirects'
)
),
- 'minsize' => array (
- ApiBase :: PARAM_TYPE => 'integer',
+ 'minsize' => array(
+ ApiBase::PARAM_TYPE => 'integer',
),
- 'maxsize' => array (
- ApiBase :: PARAM_TYPE => 'integer',
+ 'maxsize' => array(
+ ApiBase::PARAM_TYPE => 'integer',
),
- 'prtype' => array (
- ApiBase :: PARAM_TYPE => $wgRestrictionTypes,
- ApiBase :: PARAM_ISMULTI => true
+ 'prtype' => array(
+ ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
+ ApiBase::PARAM_ISMULTI => true
),
- 'prlevel' => array (
- ApiBase :: PARAM_TYPE => $wgRestrictionLevels,
- ApiBase :: PARAM_ISMULTI => true
+ 'prlevel' => array(
+ ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+ ApiBase::PARAM_ISMULTI => true
),
- 'prfiltercascade' => array (
- ApiBase :: PARAM_DFLT => 'all',
- ApiBase :: PARAM_TYPE => array (
+ '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
+ '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 (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
'ascending',
'descending'
)
),
'filterlanglinks' => array(
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_TYPE => array(
'withlanglinks',
'withoutlanglinks',
'all'
),
- ApiBase :: PARAM_DFLT => 'all'
+ ApiBase::PARAM_DFLT => 'all'
)
);
}
public function getParamDescription() {
- return array (
- 'from' => 'The page title to start enumerating from.',
- 'prefix' => 'Search for all page titles that begin with this value.',
- 'namespace' => 'The namespace to enumerate.',
- 'filterredir' => 'Which pages to list.',
+ $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 apprtype= parameter)',
- 'prfiltercascade' => 'Filter protections based on cascadingness (ignored when apprtype isn\'t set)',
+ '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.'
);
@@ -264,7 +274,7 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
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' ),
@@ -273,7 +283,7 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
+ return array(
'Simple Use',
' Show a list of pages starting at the letter "B"',
' api.php?action=query&list=allpages&apfrom=B',
@@ -286,6 +296,6 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllpages.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryAllpages.php 85354 2011-04-04 18:25:31Z demon $';
}
}
diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php
index 648da069..b412d2d6 100644
--- a/includes/api/ApiQueryBacklinks.php
+++ b/includes/api/ApiQueryBacklinks.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 16, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 16, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -38,23 +39,23 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*/
class ApiQueryBacklinks extends ApiQueryGeneratorBase {
- private $params, $rootTitle, $contRedirs, $contLevel, $contTitle, $contID, $redirID, $redirect;
+ private $params, $rootTitle, $contID, $redirID, $redirect;
private $bl_ns, $bl_from, $bl_table, $bl_code, $bl_title, $bl_sort, $bl_fields, $hasNS;
private $pageMap, $resultArr;
// output element name, database column field prefix, database table
- private $backlinksSettings = array (
- 'backlinks' => array (
+ private $backlinksSettings = array(
+ 'backlinks' => array(
'code' => 'bl',
'prefix' => 'pl',
'linktbl' => 'pagelinks'
),
- 'embeddedin' => array (
+ 'embeddedin' => array(
'code' => 'ei',
'prefix' => 'tl',
'linktbl' => 'templatelinks'
),
- 'imageusage' => array (
+ 'imageusage' => array(
'code' => 'iu',
'prefix' => 'il',
'linktbl' => 'imagelinks'
@@ -62,27 +63,29 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
);
public function __construct( $query, $moduleName ) {
- extract( $this->backlinksSettings[$moduleName] );
+ $settings = $this->backlinksSettings[$moduleName];
+ $prefix = $settings['prefix'];
+ $code = $settings['code'];
$this->resultArr = array();
- parent :: __construct( $query, $moduleName, $code );
+ parent::__construct( $query, $moduleName, $code );
$this->bl_ns = $prefix . '_namespace';
$this->bl_from = $prefix . '_from';
- $this->bl_table = $linktbl;
+ $this->bl_table = $settings['linktbl'];
$this->bl_code = $code;
$this->hasNS = $moduleName !== 'imageusage';
if ( $this->hasNS ) {
$this->bl_title = $prefix . '_title';
$this->bl_sort = "{$this->bl_ns}, {$this->bl_title}, {$this->bl_from}";
- $this->bl_fields = array (
+ $this->bl_fields = array(
$this->bl_ns,
$this->bl_title
);
} else {
$this->bl_title = $prefix . '_to';
$this->bl_sort = "{$this->bl_title}, {$this->bl_from}";
- $this->bl_fields = array (
+ $this->bl_fields = array(
$this->bl_title
);
}
@@ -106,29 +109,32 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
* AND pl_title='Foo' AND pl_namespace=0
* LIMIT 11 ORDER BY pl_from
*/
- $db = $this->getDB();
$this->addTables( array( $this->bl_table, 'page' ) );
$this->addWhere( "{$this->bl_from}=page_id" );
- if ( is_null( $resultPageSet ) )
+ if ( is_null( $resultPageSet ) ) {
$this->addFields( array( 'page_id', 'page_title', 'page_namespace' ) );
- else
+ } else {
$this->addFields( $resultPageSet->getPageTableFields() );
+ }
$this->addFields( 'page_is_redirect' );
$this->addWhereFld( $this->bl_title, $this->rootTitle->getDBkey() );
- if ( $this->hasNS )
+ if ( $this->hasNS ) {
$this->addWhereFld( $this->bl_ns, $this->rootTitle->getNamespace() );
+ }
$this->addWhereFld( 'page_namespace', $this->params['namespace'] );
- if ( !is_null( $this->contID ) )
+ if ( !is_null( $this->contID ) ) {
$this->addWhere( "{$this->bl_from}>={$this->contID}" );
+ }
- if ( $this->params['filterredir'] == 'redirects' )
+ if ( $this->params['filterredir'] == 'redirects' ) {
$this->addWhereFld( 'page_is_redirect', 1 );
- else if ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect )
+ } elseif ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect ) {
// bug 22245 - Check for !redirect, as filtering nonredirects, when getting what links to them is contradictory
$this->addWhereFld( 'page_is_redirect', 0 );
+ }
$this->addOption( 'LIMIT', $this->params['limit'] + 1 );
$this->addOption( 'ORDER BY', $this->bl_from );
@@ -145,45 +151,48 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$this->addTables( array( 'page', $this->bl_table ) );
$this->addWhere( "{$this->bl_from}=page_id" );
- if ( is_null( $resultPageSet ) )
+ if ( is_null( $resultPageSet ) ) {
$this->addFields( array( 'page_id', 'page_title', 'page_namespace', 'page_is_redirect' ) );
- else
+ } else {
$this->addFields( $resultPageSet->getPageTableFields() );
+ }
$this->addFields( $this->bl_title );
- if ( $this->hasNS )
+ if ( $this->hasNS ) {
$this->addFields( $this->bl_ns );
+ }
// We can't use LinkBatch here because $this->hasNS may be false
$titleWhere = array();
- foreach ( $this->redirTitles as $t )
+ foreach ( $this->redirTitles as $t ) {
$titleWhere[] = "{$this->bl_title} = " . $db->addQuotes( $t->getDBkey() ) .
- ( $this->hasNS ? " AND {$this->bl_ns} = '{$t->getNamespace()}'" : "" );
+ ( $this->hasNS ? " AND {$this->bl_ns} = '{$t->getNamespace()}'" : '' );
+ }
$this->addWhere( $db->makeList( $titleWhere, LIST_OR ) );
$this->addWhereFld( 'page_namespace', $this->params['namespace'] );
- if ( !is_null( $this->redirID ) )
- {
+ if ( !is_null( $this->redirID ) ) {
$first = $this->redirTitles[0];
$title = $db->strencode( $first->getDBkey() );
$ns = $first->getNamespace();
$from = $this->redirID;
- if ( $this->hasNS )
+ if ( $this->hasNS ) {
$this->addWhere( "{$this->bl_ns} > $ns OR " .
"({$this->bl_ns} = $ns AND " .
"({$this->bl_title} > '$title' OR " .
"({$this->bl_title} = '$title' AND " .
"{$this->bl_from} >= $from)))" );
- else
+ } else {
$this->addWhere( "{$this->bl_title} > '$title' OR " .
"({$this->bl_title} = '$title' AND " .
"{$this->bl_from} >= $from)" );
-
+ }
}
- if ( $this->params['filterredir'] == 'redirects' )
+ if ( $this->params['filterredir'] == 'redirects' ) {
$this->addWhereFld( 'page_is_redirect', 1 );
- else if ( $this->params['filterredir'] == 'nonredirects' )
+ } elseif ( $this->params['filterredir'] == 'nonredirects' ) {
$this->addWhereFld( 'page_is_redirect', 0 );
+ }
$this->addOption( 'LIMIT', $this->params['limit'] + 1 );
$this->addOption( 'ORDER BY', $this->bl_sort );
@@ -197,20 +206,19 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$botMax = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
if ( $this->params['limit'] == 'max' ) {
$this->params['limit'] = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
- $this->getResult()->addValue( 'limits', $this->getModuleName(), $this->params['limit'] );
+ $this->getResult()->setParsedLimit( $this->getModuleName(), $this->params['limit'] );
}
$this->processContinue();
$this->prepareFirstQuery( $resultPageSet );
- $db = $this->getDB();
$res = $this->select( __METHOD__ . '::firstQuery' );
$count = 0;
$this->pageMap = array(); // Maps ns and title to pageid
$this->continueStr = null;
$this->redirTitles = array();
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++ $count > $this->params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
// Continue string preserved in case the redirect query doesn't pass the limit
@@ -218,93 +226,89 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
break;
}
- if ( is_null( $resultPageSet ) )
+ if ( is_null( $resultPageSet ) ) {
$this->extractRowInfo( $row );
- else
- {
+ } else {
$this->pageMap[$row->page_namespace][$row->page_title] = $row->page_id;
- if ( $row->page_is_redirect )
+ if ( $row->page_is_redirect ) {
$this->redirTitles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
+ }
$resultPageSet->processDbRow( $row );
}
}
- $db->freeResult( $res );
- if ( $this->redirect && count( $this->redirTitles ) )
- {
+ if ( $this->redirect && count( $this->redirTitles ) ) {
$this->resetQueryParams();
$this->prepareSecondQuery( $resultPageSet );
$res = $this->select( __METHOD__ . '::secondQuery' );
$count = 0;
- while ( $row = $db->fetchObject( $res ) )
- {
- if ( ++$count > $this->params['limit'] )
- {
+ foreach ( $res as $row ) {
+ if ( ++$count > $this->params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
// We need to keep the parent page of this redir in
- if ( $this->hasNS )
- $parentID = $this->pageMap[$row-> { $this->bl_ns } ][$row-> { $this->bl_title } ];
- else
- $parentID = $this->pageMap[NS_IMAGE][$row-> { $this->bl_title } ];
+ if ( $this->hasNS ) {
+ $parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
+ } else {
+ $parentID = $this->pageMap[NS_IMAGE][$row->{$this->bl_title}];
+ }
$this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
break;
}
- if ( is_null( $resultPageSet ) )
+ if ( is_null( $resultPageSet ) ) {
$this->extractRedirRowInfo( $row );
- else
+ } else {
$resultPageSet->processDbRow( $row );
+ }
}
- $db->freeResult( $res );
}
if ( is_null( $resultPageSet ) ) {
// Try to add the result data in one go and pray that it fits
$fit = $this->getResult()->addValue( 'query', $this->getModuleName(), array_values( $this->resultArr ) );
- if ( !$fit )
- {
+ if ( !$fit ) {
// It didn't fit. Add elements one by one until the
// result is full.
- foreach ( $this->resultArr as $pageID => $arr )
- {
+ foreach ( $this->resultArr as $pageID => $arr ) {
// Add the basic entry without redirlinks first
$fit = $this->getResult()->addValue(
array( 'query', $this->getModuleName() ),
null, array_diff_key( $arr, array( 'redirlinks' => '' ) ) );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->continueStr = $this->getContinueStr( $pageID );
break;
}
$hasRedirs = false;
- foreach ( (array)@$arr['redirlinks'] as $key => $redir )
- {
+ foreach ( (array)@$arr['redirlinks'] as $key => $redir ) {
$fit = $this->getResult()->addValue(
array( 'query', $this->getModuleName(), $pageID, 'redirlinks' ),
$key, $redir );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->continueStr = $this->getContinueRedirStr( $pageID, $redir['pageid'] );
break;
}
$hasRedirs = true;
}
- if ( $hasRedirs )
+ if ( $hasRedirs ) {
$this->getResult()->setIndexedTagName_internal(
array( 'query', $this->getModuleName(), $pageID, 'redirlinks' ),
$this->bl_code );
- if ( !$fit )
+ }
+ if ( !$fit ) {
break;
+ }
}
}
$this->getResult()->setIndexedTagName_internal(
- array( 'query', $this->getModuleName() ),
- $this->bl_code );
+ array( 'query', $this->getModuleName() ),
+ $this->bl_code
+ );
}
- if ( !is_null( $this->continueStr ) )
+ if ( !is_null( $this->continueStr ) ) {
$this->setContinueEnumParameter( 'continue', $this->continueStr );
+ }
}
private function extractRowInfo( $row ) {
@@ -312,8 +316,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$t = Title::makeTitle( $row->page_namespace, $row->page_title );
$a = array( 'pageid' => intval( $row->page_id ) );
ApiQueryBase::addTitleInfo( $a, $t );
- if ( $row->page_is_redirect )
- {
+ if ( $row->page_is_redirect ) {
$a['redirect'] = '';
$this->redirTitles[] = $t;
}
@@ -321,12 +324,12 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$this->resultArr[$a['pageid']] = $a;
}
- private function extractRedirRowInfo( $row )
- {
+ private function extractRedirRowInfo( $row ) {
$a['pageid'] = intval( $row->page_id );
ApiQueryBase::addTitleInfo( $a, Title::makeTitle( $row->page_namespace, $row->page_title ) );
- if ( $row->page_is_redirect )
+ if ( $row->page_is_redirect ) {
$a['redirect'] = '';
+ }
$ns = $this->hasNS ? $row-> { $this->bl_ns } : NS_FILE;
$parentID = $this->pageMap[$ns][$row-> { $this->bl_title } ];
// Put all the results in an array first
@@ -335,24 +338,23 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
}
protected function processContinue() {
- if ( !is_null( $this->params['continue'] ) )
+ if ( !is_null( $this->params['continue'] ) ) {
$this->parseContinueParam();
- else {
- if ( $this->params['title'] !== "" ) {
+ } else {
+ if ( $this->params['title'] !== '' ) {
$title = Title::newFromText( $this->params['title'] );
if ( !$title ) {
$this->dieUsageMsg( array( 'invalidtitle', $this->params['title'] ) );
} else {
$this->rootTitle = $title;
}
- } else {
- $this->dieUsageMsg( array( 'missingparam', 'title' ) );
}
}
// only image titles are allowed for the root in imageinfo mode
- if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE )
+ if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE ) {
$this->dieUsage( "The title for {$this->getModuleName()} query must be an image", 'bad_image_title' );
+ }
}
protected function parseContinueParam() {
@@ -366,23 +368,27 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
// null stuff out now so we know what's set and what isn't
$this->rootTitle = $this->contID = $this->redirID = null;
$rootNs = intval( $continueList[0] );
- if ( $rootNs === 0 && $continueList[0] !== '0' )
+ if ( $rootNs === 0 && $continueList[0] !== '0' ) {
// Illegal continue parameter
- $this->dieUsage( "Invalid continue param. You should pass the original value returned by the previous query", "_badcontinue" );
+ $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', '_badcontinue' );
+ }
$this->rootTitle = Title::makeTitleSafe( $rootNs, $continueList[1] );
- if ( !$this->rootTitle )
- $this->dieUsage( "Invalid continue param. You should pass the original value returned by the previous query", "_badcontinue" );
+ if ( !$this->rootTitle ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', '_badcontinue' );
+ }
$contID = intval( $continueList[2] );
- if ( $contID === 0 && $continueList[2] !== '0' )
- $this->dieUsage( "Invalid continue param. You should pass the original value returned by the previous query", "_badcontinue" );
+ if ( $contID === 0 && $continueList[2] !== '0' ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', '_badcontinue' );
+ }
$this->contID = $contID;
$redirID = intval( @$continueList[3] );
-
- if ( $redirID === 0 && @$continueList[3] !== '0' )
+
+ if ( $redirID === 0 && @$continueList[3] !== '0' ) {
// This one isn't required
return;
+ }
$this->redirID = $redirID;
}
@@ -398,88 +404,92 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- $retval = array (
- 'title' => null,
+ $retval = array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'continue' => null,
- 'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace'
+ 'namespace' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace'
),
'filterredir' => array(
- ApiBase :: PARAM_DFLT => 'all',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'all',
+ ApiBase::PARAM_TYPE => array(
'all',
'redirects',
'nonredirects'
)
),
- '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
+ '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
)
);
- if ( $this->getModuleName() == 'embeddedin' )
+ if ( $this->getModuleName() == 'embeddedin' ) {
return $retval;
+ }
$retval['redirect'] = false;
return $retval;
}
public function getParamDescription() {
- $retval = array (
- 'title' => 'Title to search.',
- 'continue' => 'When more results are available, use this to continue.',
- 'namespace' => 'The namespace to enumerate.',
+ $retval = array(
+ 'title' => 'Title to search',
+ 'continue' => 'When more results are available, use this to continue',
+ 'namespace' => 'The namespace to enumerate',
);
- if ( $this->getModuleName() != 'embeddedin' )
+ if ( $this->getModuleName() != 'embeddedin' ) {
return array_merge( $retval, array(
'redirect' => 'If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.',
'filterredir' => "How to filter for redirects. If set to nonredirects when {$this->bl_code}redirect is enabled, this is only applied to the second level",
'limit' => "How many total pages to return. If {$this->bl_code}redirect is enabled, limit applies to each level separately (which means you may get up to 2 * limit results)."
) );
+ }
return array_merge( $retval, array(
'filterredir' => 'How to filter for redirects',
- 'limit' => 'How many total pages to return.'
+ 'limit' => 'How many total pages to return'
) );
}
public function getDescription() {
switch ( $this->getModuleName() ) {
- case 'backlinks' :
+ case 'backlinks':
return 'Find all pages that link to the given page';
- case 'embeddedin' :
+ case 'embeddedin':
return 'Find all pages that embed (transclude) the given title';
- case 'imageusage' :
+ case 'imageusage':
return 'Find all pages that use the given image title.';
- default :
- ApiBase :: dieDebug( __METHOD__, 'Unknown module name' );
+ default:
+ ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
}
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'invalidtitle', 'title' ),
- array( 'missingparam', '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' ),
) );
}
protected function getExamples() {
- static $examples = array (
- 'backlinks' => array (
- "api.php?action=query&list=backlinks&bltitle=Main%20Page",
- "api.php?action=query&generator=backlinks&gbltitle=Main%20Page&prop=info"
+ static $examples = array(
+ 'backlinks' => array(
+ 'api.php?action=query&list=backlinks&bltitle=Main%20Page',
+ 'api.php?action=query&generator=backlinks&gbltitle=Main%20Page&prop=info'
),
- 'embeddedin' => array (
- "api.php?action=query&list=embeddedin&eititle=Template:Stub",
- "api.php?action=query&generator=embeddedin&geititle=Template:Stub&prop=info"
+ 'embeddedin' => array(
+ 'api.php?action=query&list=embeddedin&eititle=Template:Stub',
+ 'api.php?action=query&generator=embeddedin&geititle=Template:Stub&prop=info'
),
- 'imageusage' => array (
- "api.php?action=query&list=imageusage&iutitle=File:Albert%20Einstein%20Head.jpg",
- "api.php?action=query&generator=imageusage&giutitle=File:Albert%20Einstein%20Head.jpg&prop=info"
+ 'imageusage' => array(
+ 'api.php?action=query&list=imageusage&iutitle=File:Albert%20Einstein%20Head.jpg',
+ 'api.php?action=query&generator=imageusage&giutitle=File:Albert%20Einstein%20Head.jpg&prop=info'
)
);
@@ -487,6 +497,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryBacklinks.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryBacklinks.php 75921 2010-11-03 12:49:21Z demon $';
}
}
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index 893da566..61a5b4c8 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 7, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 7, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -39,18 +40,19 @@ abstract class ApiQueryBase extends ApiBase {
private $mQueryModule, $mDb, $tables, $where, $fields, $options, $join_conds;
- public function __construct( $query, $moduleName, $paramPrefix = '' ) {
- parent :: __construct( $query->getMain(), $moduleName, $paramPrefix );
+ public function __construct( ApiBase $query, $moduleName, $paramPrefix = '' ) {
+ parent::__construct( $query->getMain(), $moduleName, $paramPrefix );
$this->mQueryModule = $query;
$this->mDb = null;
$this->resetQueryParams();
}
/**
- * Get the cache mode for the data generated by this module. Override this
- * in the module subclass.
+ * Get the cache mode for the data generated by this module. Override
+ * this in the module subclass. For possible return values and other
+ * details about cache modes, see ApiMain::setCacheMode()
*
- * Public caching will only be allowed if *all* the modules that supply
+ * Public caching will only be allowed if *all* the modules that supply
* data for a given request return a cache mode of public.
*/
public function getCacheMode( $params ) {
@@ -61,11 +63,11 @@ abstract class ApiQueryBase extends ApiBase {
* Blank the internal arrays with query parameters
*/
protected function resetQueryParams() {
- $this->tables = array ();
- $this->where = array ();
- $this->fields = array ();
- $this->options = array ();
- $this->join_conds = array ();
+ $this->tables = array();
+ $this->where = array();
+ $this->fields = array();
+ $this->options = array();
+ $this->join_conds = array();
}
/**
@@ -76,16 +78,18 @@ abstract class ApiQueryBase extends ApiBase {
*/
protected function addTables( $tables, $alias = null ) {
if ( is_array( $tables ) ) {
- if ( !is_null( $alias ) )
- ApiBase :: dieDebug( __METHOD__, 'Multiple table aliases not supported' );
+ if ( !is_null( $alias ) ) {
+ ApiBase::dieDebug( __METHOD__, 'Multiple table aliases not supported' );
+ }
$this->tables = array_merge( $this->tables, $tables );
} else {
- if ( !is_null( $alias ) )
+ if ( !is_null( $alias ) ) {
$tables = $this->getAliasedName( $tables, $alias );
+ }
$this->tables[] = $tables;
}
}
-
+
/**
* Get the SQL for a table name with alias
* @param $table string Table name
@@ -95,7 +99,7 @@ abstract class ApiQueryBase extends ApiBase {
protected function getAliasedName( $table, $alias ) {
return $this->getDB()->tableName( $table ) . ' ' . $alias;
}
-
+
/**
* Add a set of JOIN conditions to the internal array
*
@@ -106,8 +110,9 @@ abstract class ApiQueryBase extends ApiBase {
* @param $join_conds array JOIN conditions
*/
protected function addJoinConds( $join_conds ) {
- if ( !is_array( $join_conds ) )
+ if ( !is_array( $join_conds ) ) {
ApiBase::dieDebug( __METHOD__, 'Join conditions have to be arrays' );
+ }
$this->join_conds = array_merge( $this->join_conds, $join_conds );
}
@@ -116,10 +121,11 @@ abstract class ApiQueryBase extends ApiBase {
* @param $value mixed Field name or array of field names
*/
protected function addFields( $value ) {
- if ( is_array( $value ) )
+ if ( is_array( $value ) ) {
$this->fields = array_merge( $this->fields, $value );
- else
+ } else {
$this->fields[] = $value;
+ }
}
/**
@@ -151,17 +157,18 @@ abstract class ApiQueryBase extends ApiBase {
if ( is_array( $value ) ) {
// Sanity check: don't insert empty arrays,
// Database::makeList() chokes on them
- if ( count( $value ) )
+ if ( count( $value ) ) {
$this->where = array_merge( $this->where, $value );
- }
- else
+ }
+ } else {
$this->where[] = $value;
+ }
}
/**
* Same as addWhere(), but add the WHERE clauses only if a condition is met
* @param $value mixed See addWhere()
- * @param $condition boolIf false, do nothing
+ * @param $condition bool If false, do nothing
* @return bool $condition
*/
protected function addWhereIf( $value, $condition ) {
@@ -178,10 +185,11 @@ abstract class ApiQueryBase extends ApiBase {
* @param $value string Value; ignored if null or empty array;
*/
protected function addWhereFld( $field, $value ) {
- // Use count() to its full documented capabilities to simultaneously
+ // Use count() to its full documented capabilities to simultaneously
// test for null, empty array or empty countable object
- if ( count( $value ) )
+ if ( count( $value ) ) {
$this->where[$field] = $value;
+ }
}
/**
@@ -202,18 +210,21 @@ abstract class ApiQueryBase extends ApiBase {
$before = ( $isDirNewer ? '<=' : '>=' );
$db = $this->getDB();
- if ( !is_null( $start ) )
+ if ( !is_null( $start ) ) {
$this->addWhere( $field . $after . $db->addQuotes( $start ) );
+ }
- if ( !is_null( $end ) )
+ if ( !is_null( $end ) ) {
$this->addWhere( $field . $before . $db->addQuotes( $end ) );
+ }
if ( $sort ) {
$order = $field . ( $isDirNewer ? '' : ' DESC' );
- if ( !isset( $this->options['ORDER BY'] ) )
+ if ( !isset( $this->options['ORDER BY'] ) ) {
$this->addOption( 'ORDER BY', $order );
- else
+ } else {
$this->addOption( 'ORDER BY', $this->options['ORDER BY'] . ', ' . $order );
+ }
}
}
@@ -224,24 +235,34 @@ abstract class ApiQueryBase extends ApiBase {
* @param $value string Option value
*/
protected function addOption( $name, $value = null ) {
- if ( is_null( $value ) )
+ if ( is_null( $value ) ) {
$this->options[] = $name;
- else
+ } else {
$this->options[$name] = $value;
+ }
}
/**
* Execute a SELECT query based on the values in the internal arrays
* @param $method string Function the query should be attributed to.
* You should usually use __METHOD__ here
+ * @param $extraQuery array Query data to add but not store in the object
+ * Format is array( 'tables' => ..., 'fields' => ..., 'where' => ..., 'options' => ..., 'join_conds' => ... )
* @return ResultWrapper
*/
- protected function select( $method ) {
+ protected function select( $method, $extraQuery = array() ) {
+
+ $tables = array_merge( $this->tables, isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : array() );
+ $fields = array_merge( $this->fields, isset( $extraQuery['fields'] ) ? (array)$extraQuery['fields'] : array() );
+ $where = array_merge( $this->where, isset( $extraQuery['where'] ) ? (array)$extraQuery['where'] : array() );
+ $options = array_merge( $this->options, isset( $extraQuery['options'] ) ? (array)$extraQuery['options'] : array() );
+ $join_conds = array_merge( $this->join_conds, isset( $extraQuery['join_conds'] ) ? (array)$extraQuery['join_conds'] : array() );
+
// getDB has its own profileDBIn/Out calls
$db = $this->getDB();
$this->profileDBIn();
- $res = $db->select( $this->tables, $this->fields, $this->where, $method, $this->options, $this->join_conds );
+ $res = $db->select( $tables, $fields, $where, $method, $options, $join_conds );
$this->profileDBOut();
return $res;
@@ -259,8 +280,9 @@ abstract class ApiQueryBase extends ApiBase {
$this->profileDBOut();
global $wgAPIMaxDBRows;
- if ( $rowcount > $wgAPIMaxDBRows )
+ if ( $rowcount > $wgAPIMaxDBRows ) {
return false;
+ }
return true;
}
@@ -295,7 +317,7 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Add a sub-element under the page element with the given page ID
* @param $pageId int Page ID
- * @param $data array Data array à la ApiResult
+ * @param $data array Data array à la ApiResult
* @return bool Whether the element fit in the result
*/
protected function addPageSubItems( $pageId, $data ) {
@@ -305,23 +327,25 @@ abstract class ApiQueryBase extends ApiBase {
$this->getModuleName(),
$data );
}
-
+
/**
* Same as addPageSubItems(), but one element of $data at a time
* @param $pageId int Page ID
- * @param $data array Data array à la ApiResult
+ * @param $item array Data array à la ApiResult
* @param $elemname string XML element name. If null, getModuleName()
* is used
* @return bool Whether the element fit in the result
*/
protected function addPageSubItem( $pageId, $item, $elemname = null ) {
- if ( is_null( $elemname ) )
+ if ( is_null( $elemname ) ) {
$elemname = $this->getModulePrefix();
+ }
$result = $this->getResult();
$fit = $result->addValue( array( 'query', 'pages', $pageId,
$this->getModuleName() ), null, $item );
- if ( !$fit )
+ if ( !$fit ) {
return false;
+ }
$result->setIndexedTagName_internal( array( 'query', 'pages', $pageId,
$this->getModuleName() ), $elemname );
return true;
@@ -345,8 +369,10 @@ abstract class ApiQueryBase extends ApiBase {
* @return Database
*/
protected function getDB() {
- if ( is_null( $this->mDb ) )
- $this->mDb = $this->getQuery()->getDB();
+ if ( is_null( $this->mDb ) ) {
+ $apiQuery = $this->getQuery();
+ $this->mDb = $apiQuery->getDB();
+ }
return $this->mDb;
}
@@ -356,7 +382,7 @@ abstract class ApiQueryBase extends ApiBase {
* @param $name string Name to assign to the database connection
* @param $db int One of the DB_* constants
* @param $groups array Query groups
- * @return Database
+ * @return Database
*/
public function selectNamedDB( $name, $db, $groups ) {
$this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
@@ -377,11 +403,13 @@ abstract class ApiQueryBase extends ApiBase {
*/
public function titleToKey( $title ) {
// Don't throw an error if we got an empty string
- if ( trim( $title ) == '' )
+ if ( trim( $title ) == '' ) {
return '';
+ }
$t = Title::newFromText( $title );
- if ( !$t )
+ if ( !$t ) {
$this->dieUsageMsg( array( 'invalidtitle', $title ) );
+ }
return $t->getPrefixedDbKey();
}
@@ -392,15 +420,17 @@ abstract class ApiQueryBase extends ApiBase {
*/
public function keyToTitle( $key ) {
// Don't throw an error if we got an empty string
- if ( trim( $key ) == '' )
+ if ( trim( $key ) == '' ) {
return '';
+ }
$t = Title::newFromDbKey( $key );
// This really shouldn't happen but we gotta check anyway
- if ( !$t )
+ if ( !$t ) {
$this->dieUsageMsg( array( 'invalidtitle', $key ) );
+ }
return $t->getPrefixedText();
}
-
+
/**
* An alternative to titleToKey() that doesn't trim trailing spaces
* @param $titlePart string Title part with spaces
@@ -409,7 +439,7 @@ abstract class ApiQueryBase extends ApiBase {
public function titlePartToKey( $titlePart ) {
return substr( $this->titleToKey( $titlePart . 'x' ), 0, - 1 );
}
-
+
/**
* An alternative to keyToTitle() that doesn't trim trailing spaces
* @param $keyPart string Key part with spaces
@@ -418,7 +448,37 @@ abstract class ApiQueryBase extends ApiBase {
public function keyPartToTitle( $keyPart ) {
return substr( $this->keyToTitle( $keyPart . 'x' ), 0, - 1 );
}
-
+
+ /**
+ * Filters hidden users (where the user doesn't have the right to view them)
+ * Also adds relevant block information
+ *
+ * @param bool $showBlockInfo
+ * @return void
+ */
+ public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
+ global $wgUser;
+ $userCanViewHiddenUsers = $wgUser->isAllowed( 'hideuser' );
+
+ if ( $showBlockInfo || !$userCanViewHiddenUsers ) {
+ $this->addTables( 'ipblocks' );
+ $this->addJoinConds( array(
+ 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=user_id' ),
+ ) );
+
+ $this->addFields( 'ipb_deleted' );
+
+ if ( $showBlockInfo ) {
+ $this->addFields( array( 'ipb_reason', 'ipb_by_text', 'ipb_expiry' ) );
+ }
+
+ // Don't show hidden names
+ if ( !$userCanViewHiddenUsers ) {
+ $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' );
+ }
+ }
+ }
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'invalidtitle', 'title' ),
@@ -431,7 +491,7 @@ abstract class ApiQueryBase extends ApiBase {
* @return string
*/
public static function getBaseVersion() {
- return __CLASS__ . ': $Id: ApiQueryBase.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryBase.php 85435 2011-04-05 14:00:08Z demon $';
}
}
@@ -443,7 +503,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
private $mIsGenerator;
public function __construct( $query, $moduleName, $paramPrefix = '' ) {
- parent :: __construct( $query, $moduleName, $paramPrefix );
+ parent::__construct( $query, $moduleName, $paramPrefix );
$this->mIsGenerator = false;
}
@@ -457,14 +517,15 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
/**
* Overrides base class to prepend 'g' to every generator parameter
- * @param $paramNames string Parameter name
+ * @param $paramName string Parameter name
* @return string Prefixed parameter name
*/
public function encodeParamName( $paramName ) {
- if ( $this->mIsGenerator )
- return 'g' . parent :: encodeParamName( $paramName );
- else
- return parent :: encodeParamName( $paramName );
+ if ( $this->mIsGenerator ) {
+ return 'g' . parent::encodeParamName( $paramName );
+ } else {
+ return parent::encodeParamName( $paramName );
+ }
}
/**
diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php
index 8b321044..4edda645 100644
--- a/includes/api/ApiQueryBlocks.php
+++ b/includes/api/ApiQueryBlocks.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 10, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Sep 10, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -34,19 +35,20 @@ if ( !defined( 'MEDIAWIKI' ) ) {
* @ingroup API
*/
class ApiQueryBlocks extends ApiQueryBase {
-
+
var $users;
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'bk' );
+ parent::__construct( $query, $moduleName, 'bk' );
}
public function execute() {
global $wgUser;
$params = $this->extractRequestParams();
- if ( isset( $params['users'] ) && isset( $params['ip'] ) )
+ if ( isset( $params['users'] ) && isset( $params['ip'] ) ) {
$this->dieUsage( 'bkusers and bkip cannot be used together', 'usersandip' );
+ }
$prop = array_flip( $params['prop'] );
$fld_id = isset( $prop['id'] );
@@ -59,60 +61,62 @@ class ApiQueryBlocks extends ApiQueryBase {
$fld_flags = isset( $prop['flags'] );
$result = $this->getResult();
- $pageSet = $this->getPageSet();
- $titles = $pageSet->getTitles();
- $data = array();
$this->addTables( 'ipblocks' );
$this->addFields( 'ipb_auto' );
- if ( $fld_id )
+ if ( $fld_id ) {
$this->addFields( 'ipb_id' );
- if ( $fld_user )
+ }
+ if ( $fld_user ) {
$this->addFields( array( 'ipb_address', 'ipb_user' ) );
- if ( $fld_by )
- {
+ }
+ if ( $fld_by ) {
$this->addTables( 'user' );
$this->addFields( array( 'ipb_by', 'user_name' ) );
$this->addWhere( 'user_id = ipb_by' );
}
- if ( $fld_timestamp )
+ if ( $fld_timestamp ) {
$this->addFields( 'ipb_timestamp' );
- if ( $fld_expiry )
+ }
+ if ( $fld_expiry ) {
$this->addFields( 'ipb_expiry' );
- if ( $fld_reason )
+ }
+ if ( $fld_reason ) {
$this->addFields( 'ipb_reason' );
- if ( $fld_range )
+ }
+ if ( $fld_range ) {
$this->addFields( array( 'ipb_range_start', 'ipb_range_end' ) );
- if ( $fld_flags )
+ }
+ if ( $fld_flags ) {
$this->addFields( array( 'ipb_anon_only', 'ipb_create_account', 'ipb_enable_autoblock', 'ipb_block_email', 'ipb_deleted', 'ipb_allow_usertalk' ) );
+ }
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$this->addWhereRange( 'ipb_timestamp', $params['dir'], $params['start'], $params['end'] );
- if ( isset( $params['ids'] ) )
+ if ( isset( $params['ids'] ) ) {
$this->addWhereFld( 'ipb_id', $params['ids'] );
- if ( isset( $params['users'] ) )
- {
- foreach ( (array)$params['users'] as $u )
+ }
+ if ( isset( $params['users'] ) ) {
+ foreach ( (array)$params['users'] as $u ) {
$this->prepareUsername( $u );
+ }
$this->addWhereFld( 'ipb_address', $this->usernames );
$this->addWhereFld( 'ipb_auto', 0 );
}
- if ( isset( $params['ip'] ) )
- {
+ if ( isset( $params['ip'] ) ) {
list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
- if ( $ip && $range )
- {
+ if ( $ip && $range ) {
// We got a CIDR range
if ( $range < 16 )
$this->dieUsage( 'CIDR ranges broader than /16 are not accepted', 'cidrtoobroad' );
$lower = wfBaseConvert( $ip, 10, 16, 8, false );
$upper = wfBaseConvert( $ip + pow( 2, 32 - $range ) - 1, 10, 16, 8, false );
- }
- else
+ } else {
$lower = $upper = IP::toHex( $params['ip'] );
+ }
$prefix = substr( $lower, 0, 4 );
-
+
$db = $this->getDB();
$this->addWhere( array(
'ipb_range_start' . $db->buildLike( $prefix, $db->anyString() ),
@@ -121,147 +125,169 @@ class ApiQueryBlocks extends ApiQueryBase {
'ipb_auto' => 0
) );
}
- if ( !$wgUser->isAllowed( 'hideuser' ) )
+
+ if ( !$wgUser->isAllowed( 'hideuser' ) ) {
$this->addWhereFld( 'ipb_deleted', 0 );
+ }
// Purge expired entries on one in every 10 queries
- if ( !mt_rand( 0, 10 ) )
+ if ( !mt_rand( 0, 10 ) ) {
Block::purgeExpired();
+ }
$res = $this->select( __METHOD__ );
$count = 0;
- while ( $row = $res->fetchObject() )
- {
- if ( ++$count > $params['limit'] )
- {
+ foreach ( $res as $row ) {
+ if ( ++$count > $params['limit'] ) {
// We've had enough
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ipb_timestamp ) );
break;
}
$block = array();
- if ( $fld_id )
+ if ( $fld_id ) {
$block['id'] = $row->ipb_id;
- if ( $fld_user && !$row->ipb_auto )
+ }
+ if ( $fld_user && !$row->ipb_auto ) {
$block['user'] = $row->ipb_address;
- if ( $fld_by )
+ }
+ if ( $fld_by ) {
$block['by'] = $row->user_name;
- if ( $fld_timestamp )
+ }
+ if ( $fld_timestamp ) {
$block['timestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
- if ( $fld_expiry )
+ }
+ if ( $fld_expiry ) {
$block['expiry'] = Block::decodeExpiry( $row->ipb_expiry, TS_ISO_8601 );
- if ( $fld_reason )
+ }
+ if ( $fld_reason ) {
$block['reason'] = $row->ipb_reason;
- if ( $fld_range && !$row->ipb_auto )
- {
+ }
+ if ( $fld_range && !$row->ipb_auto ) {
$block['rangestart'] = IP::hexToQuad( $row->ipb_range_start );
$block['rangeend'] = IP::hexToQuad( $row->ipb_range_end );
}
- if ( $fld_flags )
- {
+ if ( $fld_flags ) {
// For clarity, these flags use the same names as their action=block counterparts
- if ( $row->ipb_auto )
+ if ( $row->ipb_auto ) {
$block['automatic'] = '';
- if ( $row->ipb_anon_only )
+ }
+ if ( $row->ipb_anon_only ) {
$block['anononly'] = '';
- if ( $row->ipb_create_account )
+ }
+ if ( $row->ipb_create_account ) {
$block['nocreate'] = '';
- if ( $row->ipb_enable_autoblock )
+ }
+ if ( $row->ipb_enable_autoblock ) {
$block['autoblock'] = '';
- if ( $row->ipb_block_email )
+ }
+ if ( $row->ipb_block_email ) {
$block['noemail'] = '';
- if ( $row->ipb_deleted )
+ }
+ if ( $row->ipb_deleted ) {
$block['hidden'] = '';
- if ( $row->ipb_allow_usertalk )
+ }
+ if ( $row->ipb_allow_usertalk ) {
$block['allowusertalk'] = '';
+ }
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $block );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ipb_timestamp ) );
break;
}
}
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'block' );
}
-
- protected function prepareUsername( $user )
- {
- if ( !$user )
+
+ protected function prepareUsername( $user ) {
+ if ( !$user ) {
$this->dieUsage( 'User parameter may not be empty', 'param_user' );
+ }
$name = User::isIP( $user )
? $user
: User::getCanonicalName( $user, 'valid' );
- if ( $name === false )
+ if ( $name === false ) {
$this->dieUsage( "User name {$user} is not valid", 'param_user' );
+ }
$this->usernames[] = $name;
}
public function getAllowedParams() {
- return array (
+ return array(
'start' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'end' => array(
- ApiBase :: PARAM_TYPE => 'timestamp',
+ ApiBase::PARAM_TYPE => 'timestamp',
),
'dir' => array(
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
),
- ApiBase :: PARAM_DFLT => 'older'
+ ApiBase::PARAM_DFLT => 'older'
),
'ids' => array(
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_ISMULTI => true
),
'users' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true
),
'ip' => null,
'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
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'prop' => array(
- ApiBase :: PARAM_DFLT => 'id|user|by|timestamp|expiry|reason|flags',
- ApiBase :: PARAM_TYPE => array(
- 'id',
- 'user',
- 'by',
- 'timestamp',
- 'expiry',
- 'reason',
- 'range',
- 'flags'
- ),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_DFLT => 'id|user|by|timestamp|expiry|reason|flags',
+ ApiBase::PARAM_TYPE => array(
+ 'id',
+ 'user',
+ 'by',
+ 'timestamp',
+ 'expiry',
+ 'reason',
+ 'range',
+ 'flags'
+ ),
+ ApiBase::PARAM_ISMULTI => true
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'start' => 'The timestamp to start enumerating from',
'end' => 'The timestamp to stop enumerating at',
'dir' => 'The direction in which to enumerate',
'ids' => 'Pipe-separated list of block IDs to list (optional)',
'users' => 'Pipe-separated list of users to search for (optional)',
'ip' => array( 'Get all blocks applying to this IP or CIDR range, including range blocks.',
- 'Cannot be used together with bkusers. CIDR ranges broader than /16 are not accepted.' ),
+ 'Cannot be used together with bkusers. CIDR ranges broader than /16 are not accepted' ),
'limit' => 'The maximum amount of blocks to list',
- 'prop' => 'Which properties to get',
+ 'prop' => array(
+ 'Which properties to get',
+ ' id - Adds the id of the block',
+ ' user - Adds the username of the blocked user',
+ ' by - Adds the username of the blocking admin',
+ ' timestamp - Adds the timestamp of when the block was given',
+ ' expiry - Adds the timestamp of when the block expires',
+ ' reason - Adds the reason given for the block',
+ ' range - Adds the range of IPs affected by the block',
+ ' flags - Tags the ban with (autoblock, anononly, etc)',
+ ),
);
}
public function getDescription() {
- return 'List all blocked users and IP addresses.';
+ return 'List all blocked users and IP addresses';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'usersandip', 'info' => 'bkusers and bkip cannot be used together' ),
@@ -272,12 +298,13 @@ class ApiQueryBlocks extends ApiQueryBase {
}
protected function getExamples() {
- return array ( 'api.php?action=query&list=blocks',
- 'api.php?action=query&list=blocks&bkusers=Alice|Bob'
+ return array(
+ 'api.php?action=query&list=blocks',
+ 'api.php?action=query&list=blocks&bkusers=Alice|Bob'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryBlocks.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryBlocks.php 73858 2010-09-28 01:21:15Z reedy $';
}
-} \ No newline at end of file
+}
diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php
index 03135052..b2769dc2 100644
--- a/includes/api/ApiQueryCategories.php
+++ b/includes/api/ApiQueryCategories.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on May 13, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on May 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryCategories extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'cl' );
+ parent::__construct( $query, $moduleName, 'cl' );
}
public function execute() {
@@ -52,52 +53,55 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
- if ( $this->getPageSet()->getGoodTitleCount() == 0 )
+ if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
return; // nothing to do
+ }
$params = $this->extractRequestParams();
$prop = array_flip( (array)$params['prop'] );
$show = array_flip( (array)$params['show'] );
- $this->addFields( array (
+ $this->addFields( array(
'cl_from',
'cl_to'
) );
- $this->addFieldsIf( 'cl_sortkey', isset( $prop['sortkey'] ) );
+ $this->addFieldsIf( array( 'cl_sortkey', 'cl_sortkey_prefix' ), isset( $prop['sortkey'] ) );
$this->addFieldsIf( 'cl_timestamp', isset( $prop['timestamp'] ) );
$this->addTables( 'categorylinks' );
$this->addWhereFld( 'cl_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
- if ( !is_null( $params['categories'] ) )
- {
+ if ( !is_null( $params['categories'] ) ) {
$cats = array();
- foreach ( $params['categories'] as $cat )
- {
+ foreach ( $params['categories'] as $cat ) {
$title = Title::newFromText( $cat );
- if ( !$title || $title->getNamespace() != NS_CATEGORY )
+ if ( !$title || $title->getNamespace() != NS_CATEGORY ) {
$this->setWarning( "``$cat'' is not a category" );
- else
+ } else {
$cats[] = $title->getDBkey();
+ }
}
$this->addWhereFld( 'cl_to', $cats );
}
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
+ if ( count( $cont ) != 2 ) {
$this->dieUsage( "Invalid continue param. You should pass the " .
"original value returned by the previous query", "_badcontinue" );
+ }
$clfrom = intval( $cont[0] );
$clto = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
- $this->addWhere( "cl_from > $clfrom OR " .
- "(cl_from = $clfrom AND " .
- "cl_to >= '$clto')" );
+ $this->addWhere(
+ "cl_from > $clfrom OR " .
+ "(cl_from = $clfrom AND " .
+ "cl_to >= '$clto')"
+ );
}
- if ( isset( $show['hidden'] ) && isset( $show['!hidden'] ) )
+ if ( isset( $show['hidden'] ) && isset( $show['!hidden'] ) ) {
$this->dieUsageMsg( array( 'show' ) );
+ }
if ( isset( $show['hidden'] ) || isset( $show['!hidden'] ) || isset( $prop['hidden'] ) )
{
$this->addOption( 'STRAIGHT_JOIN' );
@@ -111,26 +115,26 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
'pp_page=page_id',
'pp_propname' => 'hiddencat' ) )
) );
- if ( isset( $show['hidden'] ) )
+ if ( isset( $show['hidden'] ) ) {
$this->addWhere( array( 'pp_propname IS NOT NULL' ) );
- else if ( isset( $show['!hidden'] ) )
+ } elseif ( isset( $show['!hidden'] ) ) {
$this->addWhere( array( 'pp_propname IS NULL' ) );
+ }
}
$this->addOption( 'USE INDEX', array( 'categorylinks' => 'cl_from' ) );
// Don't order by cl_from if it's constant in the WHERE clause
- if ( count( $this->getPageSet()->getGoodTitles() ) == 1 )
+ if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
$this->addOption( 'ORDER BY', 'cl_to' );
- else
+ } else {
$this->addOption( 'ORDER BY', "cl_from, cl_to" );
+ }
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
+ $count = 0;
if ( is_null( $resultPageSet ) ) {
-
- $count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -139,28 +143,30 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
break;
}
- $title = Title :: makeTitle( NS_CATEGORY, $row->cl_to );
+ $title = Title::makeTitle( NS_CATEGORY, $row->cl_to );
$vals = array();
- ApiQueryBase :: addTitleInfo( $vals, $title );
- if ( isset( $prop['sortkey'] ) )
- $vals['sortkey'] = $row->cl_sortkey;
- if ( isset( $prop['timestamp'] ) )
+ ApiQueryBase::addTitleInfo( $vals, $title );
+ if ( isset( $prop['sortkey'] ) ) {
+ $vals['sortkey'] = bin2hex( $row->cl_sortkey );
+ $vals['sortkeyprefix'] = $row->cl_sortkey_prefix;
+ }
+ if ( isset( $prop['timestamp'] ) ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->cl_timestamp );
- if ( isset( $prop['hidden'] ) && !is_null( $row->pp_propname ) )
+ }
+ if ( isset( $prop['hidden'] ) && !is_null( $row->pp_propname ) ) {
$vals['hidden'] = '';
+ }
$fit = $this->addPageSubItem( $row->cl_from, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->cl_from .
'|' . $this->keyToTitle( $row->cl_to ) );
break;
}
}
} else {
-
$titles = array();
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -173,44 +179,47 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
}
$resultPageSet->populateFromTitles( $titles );
}
-
- $db->freeResult( $res );
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array (
'sortkey',
'timestamp',
'hidden',
)
),
'show' => array(
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'hidden',
'!hidden',
)
),
'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
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'continue' => null,
'categories' => array(
- ApiBase :: PARAM_ISMULTI => true,
+ ApiBase::PARAM_ISMULTI => true,
),
);
}
public function getParamDescription() {
- return array (
- 'prop' => 'Which additional properties to get for each category.',
+ return array(
+ 'prop' => array(
+ 'Which additional properties to get for each category',
+ ' sortkey - Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category',
+ ' timestamp - Adds timestamp of when the category was added',
+ ' hidden - Tags categories that are hidden with __HIDDENCAT__',
+ ),
'limit' => 'How many categories to return',
'show' => 'Which kind of categories to show',
'continue' => 'When more results are available, use this to continue',
@@ -221,7 +230,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
public function getDescription() {
return 'List all categories the page(s) belong to';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'show' ),
@@ -229,15 +238,15 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
- "Get a list of categories [[Albert Einstein]] belongs to:",
- " api.php?action=query&prop=categories&titles=Albert%20Einstein",
- "Get information about all categories used in the [[Albert Einstein]]:",
- " api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info"
- );
+ return array(
+ 'Get a list of categories [[Albert Einstein]] belongs to:',
+ ' api.php?action=query&prop=categories&titles=Albert%20Einstein',
+ 'Get information about all categories used in the [[Albert Einstein]]:',
+ ' api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info'
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryCategories.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryCategories.php 86474 2011-04-20 13:22:05Z catrope $';
}
}
diff --git a/includes/api/ApiQueryCategoryInfo.php b/includes/api/ApiQueryCategoryInfo.php
index 4df2f181..d4b64025 100644
--- a/includes/api/ApiQueryCategoryInfo.php
+++ b/includes/api/ApiQueryCategoryInfo.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on May 13, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on May 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryCategoryInfo extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'ci' );
+ parent::__construct( $query, $moduleName, 'ci' );
}
public function execute() {
@@ -50,8 +51,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
$titles = $this->getPageSet()->getGoodTitles() +
$this->getPageSet()->getMissingTitles();
$cattitles = array();
- foreach ( $categories as $c )
- {
+ foreach ( $categories as $c ) {
$t = $titles[$c];
$cattitles[$c] = $t->getDBkey();
}
@@ -69,34 +69,30 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
$this->addFields( array( 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files', 'pp_propname AS cat_hidden' ) );
$this->addWhere( array( 'cat_title' => $cattitles ) );
- if ( !is_null( $params['continue'] ) )
- {
+ if ( !is_null( $params['continue'] ) ) {
$title = $this->getDB()->addQuotes( $params['continue'] );
$this->addWhere( "cat_title >= $title" );
}
$this->addOption( 'ORDER BY', 'cat_title' );
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
$catids = array_flip( $cattitles );
- while ( $row = $db->fetchObject( $res ) )
- {
+ foreach ( $res as $row ) {
$vals = array();
$vals['size'] = intval( $row->cat_pages );
$vals['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
$vals['files'] = intval( $row->cat_files );
$vals['subcats'] = intval( $row->cat_subcats );
- if ( $row->cat_hidden )
+ if ( $row->cat_hidden ) {
$vals['hidden'] = '';
+ }
$fit = $this->addPageSubItems( $catids[$row->cat_title], $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->cat_title );
break;
}
}
- $db->freeResult( $res );
}
public function getCacheMode( $params ) {
@@ -104,13 +100,13 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'continue' => null,
);
}
public function getParamDescription() {
- return array (
+ return array(
'continue' => 'When more results are available, use this to continue',
);
}
@@ -120,10 +116,10 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
}
protected function getExamples() {
- return "api.php?action=query&prop=categoryinfo&titles=Category:Foo|Category:Bar";
+ return 'api.php?action=query&prop=categoryinfo&titles=Category:Foo|Category:Bar';
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryCategoryInfo.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryCategoryInfo.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php
index 107f5049..bbcf8b9b 100644
--- a/includes/api/ApiQueryCategoryMembers.php
+++ b/includes/api/ApiQueryCategoryMembers.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on June 14, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on June 14, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'cm' );
+ parent::__construct( $query, $moduleName, 'cm' );
}
public function execute() {
@@ -52,42 +53,40 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
$params = $this->extractRequestParams();
- if ( !isset( $params['title'] ) || is_null( $params['title'] ) )
- $this->dieUsage( "The cmtitle parameter is required", 'notitle' );
$categoryTitle = Title::newFromText( $params['title'] );
- if ( is_null( $categoryTitle ) || $categoryTitle->getNamespace() != NS_CATEGORY )
- $this->dieUsage( "The category name you entered is not valid", 'invalidcategory' );
+ if ( is_null( $categoryTitle ) || $categoryTitle->getNamespace() != NS_CATEGORY ) {
+ $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
+ }
$prop = array_flip( $params['prop'] );
$fld_ids = isset( $prop['ids'] );
$fld_title = isset( $prop['title'] );
$fld_sortkey = isset( $prop['sortkey'] );
+ $fld_sortkeyprefix = isset( $prop['sortkeyprefix'] );
$fld_timestamp = isset( $prop['timestamp'] );
+ $fld_type = isset( $prop['type'] );
if ( is_null( $resultPageSet ) ) {
- $this->addFields( array( 'cl_from', 'cl_sortkey', 'page_namespace', 'page_title' ) );
+ $this->addFields( array( 'cl_from', 'cl_sortkey', 'cl_type', 'page_namespace', 'page_title' ) );
$this->addFieldsIf( 'page_id', $fld_ids );
+ $this->addFieldsIf( 'cl_sortkey_prefix', $fld_sortkeyprefix );
} else {
$this->addFields( $resultPageSet->getPageTableFields() ); // will include page_ id, ns, title
- $this->addFields( array( 'cl_from', 'cl_sortkey' ) );
+ $this->addFields( array( 'cl_from', 'cl_sortkey', 'cl_type' ) );
}
$this->addFieldsIf( 'cl_timestamp', $fld_timestamp || $params['sort'] == 'timestamp' );
+
$this->addTables( array( 'page', 'categorylinks' ) ); // must be in this order for 'USE INDEX'
- // Not needed after bug 10280 is applied to servers
- if ( $params['sort'] == 'timestamp' )
- $this->addOption( 'USE INDEX', 'cl_timestamp' );
- else
- $this->addOption( 'USE INDEX', 'cl_sortkey' );
- $this->addWhere( 'cl_from=page_id' );
- $this->setContinuation( $params['continue'], $params['dir'] );
$this->addWhereFld( 'cl_to', $categoryTitle->getDBkey() );
- // Scanning large datasets for rare categories sucks, and I already told
+ $queryTypes = $params['type'];
+ $contWhere = false;
+
+ // Scanning large datasets for rare categories sucks, and I already told
// how to have efficient subcategory access :-) ~~~~ (oh well, domas)
global $wgMiserMode;
$miser_ns = array();
@@ -96,69 +95,146 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
} else {
$this->addWhereFld( 'page_namespace', $params['namespace'] );
}
- if ( $params['sort'] == 'timestamp' )
- $this->addWhereRange( 'cl_timestamp', ( $params['dir'] == 'asc' ? 'newer' : 'older' ), $params['start'], $params['end'] );
- else
- {
- $this->addWhereRange( 'cl_sortkey', ( $params['dir'] == 'asc' ? 'newer' : 'older' ), $params['startsortkey'], $params['endsortkey'] );
- $this->addWhereRange( 'cl_from', ( $params['dir'] == 'asc' ? 'newer' : 'older' ), null, null );
+
+ $dir = $params['dir'] == 'asc' ? 'newer' : 'older';
+
+ if ( $params['sort'] == 'timestamp' ) {
+ $this->addWhereRange( 'cl_timestamp',
+ $dir,
+ $params['start'],
+ $params['end'] );
+
+ $this->addOption( 'USE INDEX', 'cl_timestamp' );
+ } else {
+ if ( $params['continue'] ) {
+ $cont = explode( '|', $params['continue'], 3 );
+ if ( count( $cont ) != 3 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original value returned '.
+ 'by the previous query', '_badcontinue'
+ );
+ }
+
+ // Remove the types to skip from $queryTypes
+ $contTypeIndex = array_search( $cont[0], $queryTypes );
+ $queryTypes = array_slice( $queryTypes, $contTypeIndex );
+
+ // Add a WHERE clause for sortkey and from
+ // pack( "H*", $foo ) is used to convert hex back to binary
+ $escSortkey = $this->getDB()->addQuotes( pack( "H*", $cont[1] ) );
+ $from = intval( $cont[2] );
+ $op = $dir == 'newer' ? '>' : '<';
+ // $contWhere is used further down
+ $contWhere = "cl_sortkey $op $escSortkey OR " .
+ "(cl_sortkey = $escSortkey AND " .
+ "cl_from $op= $from)";
+
+ } else {
+ // The below produces ORDER BY cl_sortkey, cl_from, possibly with DESC added to each of them
+ $this->addWhereRange( 'cl_sortkey',
+ $dir,
+ $params['startsortkey'],
+ $params['endsortkey'] );
+ $this->addWhereRange( 'cl_from', $dir, null, null );
+ }
+ $this->addOption( 'USE INDEX', 'cl_sortkey' );
}
+ $this->addWhere( 'cl_from=page_id' );
+
$limit = $params['limit'];
$this->addOption( 'LIMIT', $limit + 1 );
- $db = $this->getDB();
-
- $data = array ();
+ if ( $params['sort'] == 'sortkey' ) {
+ // Run a separate SELECT query for each value of cl_type.
+ // This is needed because cl_type is an enum, and MySQL has
+ // inconsistencies between ORDER BY cl_type and
+ // WHERE cl_type >= 'foo' making proper paging impossible
+ // and unindexed.
+ $rows = array();
+ $first = true;
+ foreach ( $queryTypes as $type ) {
+ $extraConds = array( 'cl_type' => $type );
+ if ( $first && $contWhere ) {
+ // Continuation condition. Only added to the
+ // first query, otherwise we'll skip things
+ $extraConds[] = $contWhere;
+ }
+ $res = $this->select( __METHOD__, array( 'where' => $extraConds ) );
+ $rows = array_merge( $rows, iterator_to_array( $res ) );
+ if ( count( $rows ) >= $limit + 1 ) {
+ break;
+ }
+ $first = false;
+ }
+ } else {
+ // Sorting by timestamp
+ // No need to worry about per-type queries because we
+ // aren't sorting or filtering by type anyway
+ $res = $this->select( __METHOD__ );
+ $rows = iterator_to_array( $res );
+ }
$count = 0;
- $lastSortKey = null;
- $res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $rows 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
- if ( $params['sort'] == 'timestamp' )
+ if ( $params['sort'] == 'timestamp' ) {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->cl_timestamp ) );
- else
- $this->setContinueEnumParameter( 'continue', $this->getContinueStr( $row, $lastSortKey ) );
+ } else {
+ $sortkey = bin2hex( $row->cl_sortkey );
+ $this->setContinueEnumParameter( 'continue',
+ "{$row->cl_type}|$sortkey|{$row->cl_from}"
+ );
+ }
break;
}
- // Since domas won't tell anyone what he told long ago, apply
- // cmnamespace here. This means the query may return 0 actual
- // results, but on the other hand it could save returning 5000
+ // Since domas won't tell anyone what he told long ago, apply
+ // cmnamespace here. This means the query may return 0 actual
+ // results, but on the other hand it could save returning 5000
// useless results to the client. ~~~~
- if ( count( $miser_ns ) && !in_array( $row->page_namespace, $miser_ns ) )
+ if ( count( $miser_ns ) && !in_array( $row->page_namespace, $miser_ns ) ) {
continue;
+ }
if ( is_null( $resultPageSet ) ) {
$vals = array();
- if ( $fld_ids )
+ if ( $fld_ids ) {
$vals['pageid'] = intval( $row->page_id );
+ }
if ( $fld_title ) {
- $title = Title :: makeTitle( $row->page_namespace, $row->page_title );
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
ApiQueryBase::addTitleInfo( $vals, $title );
}
- if ( $fld_sortkey )
- $vals['sortkey'] = $row->cl_sortkey;
- if ( $fld_timestamp )
+ if ( $fld_sortkey ) {
+ $vals['sortkey'] = bin2hex( $row->cl_sortkey );
+ }
+ if ( $fld_sortkeyprefix ) {
+ $vals['sortkeyprefix'] = $row->cl_sortkey_prefix;
+ }
+ if ( $fld_type ) {
+ $vals['type'] = $row->cl_type;
+ }
+ if ( $fld_timestamp ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->cl_timestamp );
+ }
$fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ),
null, $vals );
- if ( !$fit )
- {
- if ( $params['sort'] == 'timestamp' )
+ if ( !$fit ) {
+ if ( $params['sort'] == 'timestamp' ) {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->cl_timestamp ) );
- else
- $this->setContinueEnumParameter( 'continue', $this->getContinueStr( $row, $lastSortKey ) );
+ } else {
+ $sortkey = bin2hex( $row->cl_sortkey );
+ $this->setContinueEnumParameter( 'continue',
+ "{$row->cl_type}|$sortkey|{$row->cl_from}"
+ );
+ }
break;
}
} else {
$resultPageSet->processDbRow( $row );
}
- $lastSortKey = $row->cl_sortkey; // detect duplicate sortkeys
}
- $db->freeResult( $res );
if ( is_null( $resultPageSet ) ) {
$this->getResult()->setIndexedTagName_internal(
@@ -166,85 +242,64 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
}
}
- private function getContinueStr( $row, $lastSortKey ) {
- $ret = $row->cl_sortkey . '|';
- if ( $row->cl_sortkey == $lastSortKey ) // duplicate sort key, add cl_from
- $ret .= $row->cl_from;
- return $ret;
- }
-
- /**
- * Add DB WHERE clause to continue previous query based on 'continue' parameter
- */
- private function setContinuation( $continue, $dir ) {
- if ( is_null( $continue ) )
- return; // This is not a continuation request
-
- $pos = strrpos( $continue, '|' );
- $sortkey = substr( $continue, 0, $pos );
- $fromstr = substr( $continue, $pos + 1 );
- $from = intval( $fromstr );
-
- if ( $from == 0 && strlen( $fromstr ) > 0 )
- $this->dieUsage( "Invalid continue param. You should pass the original value returned by the previous query", "badcontinue" );
-
- $encSortKey = $this->getDB()->addQuotes( $sortkey );
- $encFrom = $this->getDB()->addQuotes( $from );
-
- $op = ( $dir == 'desc' ? '<' : '>' );
-
- if ( $from != 0 ) {
- // Duplicate sort key continue
- $this->addWhere( "cl_sortkey$op$encSortKey OR (cl_sortkey=$encSortKey AND cl_from$op=$encFrom)" );
- } else {
- $this->addWhere( "cl_sortkey$op=$encSortKey" );
- }
- }
-
public function getAllowedParams() {
- return array (
- 'title' => null,
- 'prop' => array (
- ApiBase :: PARAM_DFLT => 'ids|title',
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => 'ids|title',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array (
'ids',
'title',
'sortkey',
+ 'sortkeyprefix',
+ 'type',
'timestamp',
)
),
'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace',
+ ),
+ 'type' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'page|subcat|file',
+ ApiBase::PARAM_TYPE => array(
+ 'page',
+ 'subcat',
+ 'file'
+ )
),
'continue' => null,
- 'limit' => array (
- ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_DFLT => 10,
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
- ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'sort' => array(
- ApiBase :: PARAM_DFLT => 'sortkey',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'sortkey',
+ ApiBase::PARAM_TYPE => array(
'sortkey',
'timestamp'
)
),
'dir' => array(
- ApiBase :: PARAM_DFLT => 'asc',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'asc',
+ ApiBase::PARAM_TYPE => array(
'asc',
'desc'
)
),
'start' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'end' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'startsortkey' => null,
'endsortkey' => null,
@@ -253,16 +308,26 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
public function getParamDescription() {
global $wgMiserMode;
- $desc = array (
+ $p = $this->getModulePrefix();
+ $desc = array(
'title' => 'Which category to enumerate (required). Must include Category: prefix',
- 'prop' => 'What pieces of information to include',
+ 'prop' => array(
+ 'What pieces of information to include',
+ ' ids - Adds the page ID',
+ ' title - Adds the title and namespace ID of the page',
+ ' sortkey - Adds the sortkey used for sorting in the category (hexadecimal string)',
+ ' sortkeyprefix - Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey)',
+ ' type - Adds the type that the page has been categorised as (page, subcat or file)',
+ ' timestamp - Adds the timestamp of when the page was included',
+ ),
'namespace' => 'Only include pages in these namespaces',
+ 'type' => "What type of category members to include. Ignored when {$p}sort=timestamp is set",
'sort' => 'Property to sort by',
'dir' => 'In which direction to sort',
- 'start' => 'Timestamp to start listing from. Can only be used with cmsort=timestamp',
- 'end' => 'Timestamp to end listing at. Can only be used with cmsort=timestamp',
- 'startsortkey' => 'Sortkey to start listing from. Can only be used with cmsort=sortkey',
- 'endsortkey' => 'Sortkey to end listing at. Can only be used with cmsort=sortkey',
+ 'start' => "Timestamp to start listing from. Can only be used with {$p}sort=timestamp",
+ 'end' => "Timestamp to end listing at. Can only be used with {$p}sort=timestamp",
+ 'startsortkey' => "Sortkey to start listing from. Can only be used with {$p}sort=sortkey",
+ 'endsortkey' => "Sortkey to end listing at. Can only be used with {$p}sort=sortkey",
'continue' => 'For large categories, give the value retured from previous query',
'limit' => 'The maximum number of pages to return.',
);
@@ -271,6 +336,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
$desc['namespace'],
'NOTE: Due to $wgMiserMode, using this may result in fewer than "limit" results',
'returned before continuing; in extreme cases, zero results may be returned.',
+ 'Note that you can use cmtype=subcat or cmtype=file instead of cmnamespace=14 or 6.',
);
}
return $desc;
@@ -279,7 +345,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
public function getDescription() {
return 'List all pages in a given category';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'notitle', 'info' => 'The cmtitle parameter is required' ),
@@ -289,15 +355,15 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
- "Get first 10 pages in [[Category:Physics]]:",
- " api.php?action=query&list=categorymembers&cmtitle=Category:Physics",
- "Get page info about first 10 pages in [[Category:Physics]]:",
- " api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info",
- );
+ return array(
+ 'Get first 10 pages in [[Category:Physics]]:',
+ ' api.php?action=query&list=categorymembers&cmtitle=Category:Physics',
+ 'Get page info about first 10 pages in [[Category:Physics]]:',
+ ' api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info',
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryCategoryMembers.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryCategoryMembers.php 86474 2011-04-20 13:22:05Z catrope $';
}
}
diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php
index b26c7051..523862c0 100644
--- a/includes/api/ApiQueryDeletedrevs.php
+++ b/includes/api/ApiQueryDeletedrevs.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Jul 2, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Jul 2, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,101 +18,115 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
- * Query module to enumerate all available pages.
+ * Query module to enumerate all deleted revisions.
*
* @ingroup API
*/
class ApiQueryDeletedrevs extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'dr' );
+ parent::__construct( $query, $moduleName, 'dr' );
}
public function execute() {
-
global $wgUser;
// Before doing anything at all, let's check permissions
- if ( !$wgUser->isAllowed( 'deletedhistory' ) )
+ if ( !$wgUser->isAllowed( 'deletedhistory' ) ) {
$this->dieUsage( 'You don\'t have permission to view deleted revision information', 'permissiondenied' );
+ }
$db = $this->getDB();
$params = $this->extractRequestParams( false );
$prop = array_flip( $params['prop'] );
$fld_revid = isset( $prop['revid'] );
$fld_user = isset( $prop['user'] );
+ $fld_userid = isset( $prop['userid'] );
$fld_comment = isset( $prop['comment'] );
$fld_parsedcomment = isset ( $prop['parsedcomment'] );
$fld_minor = isset( $prop['minor'] );
$fld_len = isset( $prop['len'] );
$fld_content = isset( $prop['content'] );
$fld_token = isset( $prop['token'] );
-
+
$result = $this->getResult();
$pageSet = $this->getPageSet();
$titles = $pageSet->getTitles();
- $data = array();
-
+
// This module operates in three modes:
// 'revs': List deleted revs for certain titles
// 'user': List deleted revs by a certain user
// 'all': List all deleted revs
$mode = 'all';
- if ( count( $titles ) > 0 )
+ if ( count( $titles ) > 0 ) {
$mode = 'revs';
- else if ( !is_null( $params['user'] ) )
+ } elseif ( !is_null( $params['user'] ) ) {
$mode = 'user';
-
- if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) )
+ }
+
+ if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
$this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
+ }
$this->addTables( 'archive' );
$this->addWhere( 'ar_deleted = 0' );
$this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp' ) );
- if ( $fld_revid )
+ if ( $fld_revid ) {
$this->addFields( 'ar_rev_id' );
- if ( $fld_user )
+ }
+ if ( $fld_user ) {
$this->addFields( 'ar_user_text' );
- if ( $fld_comment || $fld_parsedcomment )
+ }
+ if ( $fld_userid ) {
+ $this->addFields( 'ar_user' );
+ }
+ if ( $fld_comment || $fld_parsedcomment ) {
$this->addFields( 'ar_comment' );
- if ( $fld_minor )
+ }
+ if ( $fld_minor ) {
$this->addFields( 'ar_minor_edit' );
- if ( $fld_len )
+ }
+ if ( $fld_len ) {
$this->addFields( 'ar_len' );
+ }
if ( $fld_content ) {
$this->addTables( 'text' );
$this->addFields( array( 'ar_text', 'ar_text_id', 'old_text', 'old_flags' ) );
$this->addWhere( 'ar_text_id = old_id' );
// This also means stricter restrictions
- if ( !$wgUser->isAllowed( 'undelete' ) )
+ if ( !$wgUser->isAllowed( 'undelete' ) ) {
$this->dieUsage( 'You don\'t have permission to view deleted revision content', 'permissiondenied' );
+ }
}
// Check limits
- $userMax = $fld_content ? ApiBase :: LIMIT_SML1 : ApiBase :: LIMIT_BIG1;
- $botMax = $fld_content ? ApiBase :: LIMIT_SML2 : ApiBase :: LIMIT_BIG2;
+ $userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1;
+ $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
$limit = $params['limit'];
if ( $limit == 'max' ) {
$limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
- $this->getResult()->addValue( 'limits', $this->getModuleName(), $limit );
+ $this->getResult()->setParsedLimit( $this->getModuleName(), $limit );
}
$this->validateLimit( 'limit', $limit, 1, $userMax, $botMax );
- if ( $fld_token )
+ if ( $fld_token ) {
// Undelete tokens are identical for all pages, so we cache one here
$token = $wgUser->editToken();
+ }
// We need a custom WHERE clause that matches all titles.
if ( $mode == 'revs' ) {
@@ -122,25 +135,25 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$this->addWhere( $where );
} elseif ( $mode == 'all' ) {
$this->addWhereFld( 'ar_namespace', $params['namespace'] );
- if ( !is_null( $params['from'] ) )
- {
+ if ( !is_null( $params['from'] ) ) {
$from = $this->getDB()->strencode( $this->titleToKey( $params['from'] ) );
$this->addWhere( "ar_title >= '$from'" );
}
}
-
+
if ( !is_null( $params['user'] ) ) {
$this->addWhereFld( 'ar_user_text', $params['user'] );
} elseif ( !is_null( $params['excludeuser'] ) ) {
$this->addWhere( 'ar_user_text != ' .
$this->getDB()->addQuotes( $params['excludeuser'] ) );
}
-
+
if ( !is_null( $params['continue'] ) && ( $mode == 'all' || $mode == 'revs' ) )
{
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 )
- $this->dieUsage( "Invalid continue param. You should pass the original value returned by the previous query", "badcontinue" );
+ if ( count( $cont ) != 3 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', 'badcontinue' );
+ }
$ns = intval( $cont[0] );
$title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
$ts = $this->getDB()->strencode( $cont[2] );
@@ -155,15 +168,14 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$this->addOption( 'LIMIT', $limit + 1 );
$this->addOption( 'USE INDEX', array( 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ) );
if ( $mode == 'all' ) {
- if ( $params['unique'] )
- {
+ if ( $params['unique'] ) {
$this->addOption( 'GROUP BY', 'ar_title' );
$this->addOption( 'ORDER BY', 'ar_title' );
- } else
+ } else {
$this->addOption( 'ORDER BY', 'ar_title, ar_timestamp' );
+ }
} else {
- if ( $mode == 'revs' )
- {
+ if ( $mode == 'revs' ) {
// Sort by ns and title in the same order as timestamp for efficiency
$this->addWhereRange( 'ar_namespace', $params['dir'], null, null );
$this->addWhereRange( 'ar_title', $params['dir'], null, null );
@@ -174,39 +186,47 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$pageMap = array(); // Maps ns&title to (fake) pageid
$count = 0;
$newPageID = 0;
- while ( $row = $db->fetchObject( $res ) )
- {
+ foreach ( $res as $row ) {
if ( ++$count > $limit ) {
// We've had enough
- if ( $mode == 'all' || $mode == 'revs' )
+ if ( $mode == 'all' || $mode == 'revs' ) {
$this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' .
$this->keyToTitle( $row->ar_title ) . '|' . $row->ar_timestamp );
- else
+ } else {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) );
+ }
break;
}
$rev = array();
$rev['timestamp'] = wfTimestamp( TS_ISO_8601, $row->ar_timestamp );
- if ( $fld_revid )
+ if ( $fld_revid ) {
$rev['revid'] = intval( $row->ar_rev_id );
- if ( $fld_user )
+ }
+ if ( $fld_user ) {
$rev['user'] = $row->ar_user_text;
- if ( $fld_comment )
+ }
+ if ( $fld_userid ) {
+ $rev['userid'] = $row->ar_user;
+ }
+ if ( $fld_comment ) {
$rev['comment'] = $row->ar_comment;
+ }
$title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
if ( $fld_parsedcomment ) {
- global $wgUser;
$rev['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->ar_comment, $title );
}
- if ( $fld_minor && $row->ar_minor_edit == 1 )
+ if ( $fld_minor && $row->ar_minor_edit == 1 ) {
$rev['minor'] = '';
- if ( $fld_len )
+ }
+ if ( $fld_len ) {
$rev['len'] = $row->ar_len;
- if ( $fld_content )
+ }
+ if ( $fld_content ) {
ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
+ }
if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
$pageID = $newPageID++;
@@ -214,8 +234,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$a['revisions'] = array( $rev );
$result->setIndexedTagName( $a['revisions'], 'rev' );
ApiQueryBase::addTitleInfo( $a, $title );
- if ( $fld_token )
+ if ( $fld_token ) {
$a['token'] = $token;
+ }
$fit = $result->addValue( array( 'query', $this->getModuleName() ), $pageID, $a );
} else {
$pageID = $pageMap[$row->ar_namespace][$row->ar_title];
@@ -224,58 +245,59 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
null, $rev );
}
if ( !$fit ) {
- if ( $mode == 'all' || $mode == 'revs' )
+ if ( $mode == 'all' || $mode == 'revs' ) {
$this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' .
$this->keyToTitle( $row->ar_title ) . '|' . $row->ar_timestamp );
- else
+ } else {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) );
+ }
break;
}
}
- $db->freeResult( $res );
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
}
public function getAllowedParams() {
- return array (
+ return array(
'start' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'end' => array(
- ApiBase :: PARAM_TYPE => 'timestamp',
+ ApiBase::PARAM_TYPE => 'timestamp',
),
'dir' => array(
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
),
- ApiBase :: PARAM_DFLT => 'older'
+ ApiBase::PARAM_DFLT => 'older'
),
'from' => null,
'continue' => null,
'unique' => false,
'user' => array(
- ApiBase :: PARAM_TYPE => 'user'
+ ApiBase::PARAM_TYPE => 'user'
),
'excludeuser' => array(
- ApiBase :: PARAM_TYPE => 'user'
+ ApiBase::PARAM_TYPE => 'user'
),
'namespace' => array(
- ApiBase :: PARAM_TYPE => 'namespace',
- ApiBase :: PARAM_DFLT => 0,
+ ApiBase::PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_DFLT => 0,
),
'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
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'prop' => array(
- ApiBase :: PARAM_DFLT => 'user|comment',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'user|comment',
+ ApiBase::PARAM_TYPE => array(
'revid',
'user',
+ 'userid',
'comment',
'parsedcomment',
'minor',
@@ -283,18 +305,29 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
'content',
'token'
),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true
),
);
}
public function getParamDescription() {
- return array (
- 'start' => 'The timestamp to start enumerating from. (1,2)',
- 'end' => 'The timestamp to stop enumerating at. (1,2)',
- 'dir' => 'The direction in which to enumerate. (1,2)',
+ return array(
+ 'start' => 'The timestamp to start enumerating from (1,2)',
+ 'end' => 'The timestamp to stop enumerating at (1,2)',
+ 'dir' => 'The direction in which to enumerate (1,2)',
'limit' => 'The maximum amount of revisions to list',
- 'prop' => 'Which properties to get',
+ 'prop' => array(
+ 'Which properties to get',
+ ' revid - Adds the revision id of the deleted revision',
+ ' user - Adds the user who made the revision',
+ ' userid - Adds the user id whom made the revision',
+ ' comment - Adds the comment of the revision',
+ ' parsedcomment - Adds the parsed comment of the revision',
+ ' minor - Tags if the revision is minor',
+ ' len - Adds the length of the revision',
+ ' content - Adds the content of the revision',
+ ' token - Gives the edit token',
+ ),
'namespace' => 'Only list pages in this namespace (3)',
'user' => 'Only list revisions by this user',
'excludeuser' => 'Don\'t list revisions by this user',
@@ -305,16 +338,17 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
}
public function getDescription() {
- return array( 'List deleted revisions.',
- 'This module operates in three modes:',
- '1) List deleted revisions for the given title(s), sorted by timestamp',
- '2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
- '3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, druser not set)',
- 'Certain parameters only apply to some modes and are ignored in others.',
- 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3.',
+ return array(
+ 'List deleted revisions.',
+ 'This module operates in three modes:',
+ '1) List deleted revisions for the given title(s), sorted by timestamp',
+ '2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
+ '3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, druser not set)',
+ 'Certain parameters only apply to some modes and are ignored in others.',
+ 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3',
);
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision information' ),
@@ -325,7 +359,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1):',
' api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content',
'List the last 50 deleted contributions by Bob (mode 2):',
@@ -333,11 +367,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
'List the first 50 deleted revisions in the main namespace (mode 3):',
' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50',
'List the first 50 deleted pages in the Talk namespace (mode 3):',
- ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique',
+ ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique=',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryDeletedrevs.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryDeletedrevs.php 77192 2010-11-23 22:05:27Z btongminh $';
}
-} \ No newline at end of file
+}
diff --git a/includes/api/ApiQueryDisabled.php b/includes/api/ApiQueryDisabled.php
index 4bd3f5fd..b5712069 100644
--- a/includes/api/ApiQueryDisabled.php
+++ b/includes/api/ApiQueryDisabled.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on Sep 25, 2008
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Sep 25, 2008
+ *
+ * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,18 +18,19 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
-
/**
- * API module that does nothing
+ * API module that does nothing
*
* Use this to disable core modules with e.g.
* $wgAPIPropModules['modulename'] = 'ApiQueryDisabled';
@@ -41,7 +42,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryDisabled extends ApiQueryBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
@@ -49,11 +50,11 @@ class ApiQueryDisabled extends ApiQueryBase {
}
public function getAllowedParams() {
- return array ();
+ return array();
}
public function getParamDescription() {
- return array ();
+ return array();
}
public function getDescription() {
@@ -63,10 +64,10 @@ class ApiQueryDisabled extends ApiQueryBase {
}
protected function getExamples() {
- return array ();
+ return array();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryDisabled.php 60930 2010-01-11 15:55:52Z simetrical $';
+ return __CLASS__ . ': $Id: ApiQueryDisabled.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php
index ed070069..ffe98038 100644
--- a/includes/api/ApiQueryDuplicateFiles.php
+++ b/includes/api/ApiQueryDuplicateFiles.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 27, 2008
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Roan Kattow <Firstname>,<Lastname>@home.nl
+ * Created on Sep 27, 2008
+ *
+ * Copyright © 2008 Roan Kattow <Firstname>,<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'df' );
+ parent::__construct( $query, $moduleName, 'df' );
}
public function execute() {
@@ -58,7 +59,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
return;
}
$images = $namespaces[NS_FILE];
-
+
$this->addTables( 'image', 'i1' );
$this->addTables( 'image', 'i2' );
$this->addFields( array(
@@ -74,30 +75,29 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
'i1.img_name != i2.img_name',
) );
- if ( isset( $params['continue'] ) )
- {
+ if ( isset( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 2 ) {
+ $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] ) );
- $this->addWhere( "i1.img_name > '$orig' OR " .
- "(i1.img_name = '$orig' AND " .
- "i2.img_name >= '$dup')" );
+ $this->addWhere(
+ "i1.img_name > '$orig' OR " .
+ "(i1.img_name = '$orig' AND " .
+ "i2.img_name >= '$dup')"
+ );
}
$this->addOption( 'ORDER BY', 'i1.img_name' );
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$res = $this->select( __METHOD__ );
- $db = $this->getDB();
$count = 0;
$titles = array();
- while ( $row = $db->fetchObject( $res ) )
- {
- if ( ++$count > $params['limit'] )
- {
+ foreach ( $res as $row ) {
+ if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
$this->setContinueEnumParameter( 'continue',
@@ -105,18 +105,16 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
$this->keyToTitle( $row->dup_name ) );
break;
}
- if ( !is_null( $resultPageSet ) )
+ if ( !is_null( $resultPageSet ) ) {
$titles[] = Title::makeTitle( NS_FILE, $row->dup_name );
- else
- {
+ } else {
$r = array(
'name' => $row->dup_name,
'user' => $row->dup_user_text,
'timestamp' => wfTimestamp( TS_ISO_8601, $row->dup_timestamp )
);
$fit = $this->addPageSubItem( $images[$row->orig_name], $r );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue',
$this->keyToTitle( $row->orig_name ) . '|' .
$this->keyToTitle( $row->dup_name ) );
@@ -124,35 +122,35 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
}
}
}
- if ( !is_null( $resultPageSet ) )
+ if ( !is_null( $resultPageSet ) ) {
$resultPageSet->populateFromTitles( $titles );
- $db->freeResult( $res );
+ }
}
public function getAllowedParams() {
- return array (
+ return array(
'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
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'continue' => null,
);
}
public function getParamDescription() {
- return array (
+ return array(
'limit' => 'How many files to return',
'continue' => 'When more results are available, use this to continue',
);
}
public function getDescription() {
- return 'List all files that are duplicates of the given file(s).';
+ return 'List all files that are duplicates of the given file(s)';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
@@ -160,12 +158,13 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array ( 'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles',
- 'api.php?action=query&generator=allimages&prop=duplicatefiles',
- );
+ return array(
+ 'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles',
+ 'api.php?action=query&generator=allimages&prop=duplicatefiles',
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryDuplicateFiles.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryDuplicateFiles.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php
index 0e171e44..ecd9e699 100644
--- a/includes/api/ApiQueryExtLinksUsage.php
+++ b/includes/api/ApiQueryExtLinksUsage.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 7, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on July 7, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -34,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'eu' );
+ parent::__construct( $query, $moduleName, 'eu' );
}
public function execute() {
@@ -50,7 +51,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
$params = $this->extractRequestParams();
$protocol = $params['protocol'];
@@ -58,17 +58,16 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
// Find the right prefix
global $wgUrlProtocols;
- if ( $protocol && !in_array( $protocol, $wgUrlProtocols ) )
- {
+ if ( $protocol && !in_array( $protocol, $wgUrlProtocols ) ) {
foreach ( $wgUrlProtocols as $p ) {
if ( substr( $p, 0, strlen( $protocol ) ) === $protocol ) {
$protocol = $p;
break;
}
}
- }
- else
+ } else {
$protocol = null;
+ }
$db = $this->getDB();
$this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
@@ -76,20 +75,21 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
$this->addWhere( 'page_id=el_from' );
$this->addWhereFld( 'page_namespace', $params['namespace'] );
- if ( !is_null( $query ) || $query != '' )
- {
- if ( is_null( $protocol ) )
+ if ( !is_null( $query ) || $query != '' ) {
+ if ( is_null( $protocol ) ) {
$protocol = 'http://';
+ }
$likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
- if ( !$likeQuery )
+ if ( !$likeQuery ) {
$this->dieUsage( 'Invalid query', 'bad_query' );
+ }
$likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
$this->addWhere( 'el_index ' . $db->buildLike( $likeQuery ) );
- }
- else if ( !is_null( $protocol ) )
+ } elseif ( !is_null( $protocol ) ) {
$this->addWhere( 'el_index ' . $db->buildLike( "$protocol", $db->anyString() ) );
+ }
$prop = array_flip( $params['prop'] );
$fld_ids = isset( $prop['ids'] );
@@ -97,7 +97,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
$fld_url = isset( $prop['url'] );
if ( is_null( $resultPageSet ) ) {
- $this->addFields( array (
+ $this->addFields( array(
'page_id',
'page_namespace',
'page_title'
@@ -110,14 +110,15 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
$limit = $params['limit'];
$offset = $params['offset'];
$this->addOption( 'LIMIT', $limit + 1 );
- if ( isset ( $offset ) )
+ if ( isset( $offset ) ) {
$this->addOption( 'OFFSET', $offset );
+ }
$res = $this->select( __METHOD__ );
$result = $this->getResult();
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ 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...
$this->setContinueEnumParameter( 'offset', $offset + $limit );
@@ -126,17 +127,18 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
if ( is_null( $resultPageSet ) ) {
$vals = array();
- if ( $fld_ids )
+ if ( $fld_ids ) {
$vals['pageid'] = intval( $row->page_id );
+ }
if ( $fld_title ) {
- $title = Title :: makeTitle( $row->page_namespace, $row->page_title );
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
ApiQueryBase::addTitleInfo( $vals, $title );
}
- if ( $fld_url )
+ if ( $fld_url ) {
$vals['url'] = $row->el_to;
+ }
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
break;
}
@@ -144,7 +146,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
$resultPageSet->processDbRow( $row );
}
}
- $db->freeResult( $res );
if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ),
@@ -159,44 +160,52 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
$protocols[] = substr( $p, 0, strpos( $p, ':' ) );
}
- return array (
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'ids|title|url',
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'ids|title|url',
+ ApiBase::PARAM_TYPE => array(
'ids',
'title',
'url'
)
),
- 'offset' => array (
- ApiBase :: PARAM_TYPE => 'integer'
+ 'offset' => array(
+ ApiBase::PARAM_TYPE => 'integer'
),
- 'protocol' => array (
- ApiBase :: PARAM_TYPE => $protocols,
- ApiBase :: PARAM_DFLT => '',
+ 'protocol' => array(
+ ApiBase::PARAM_TYPE => $protocols,
+ ApiBase::PARAM_DFLT => '',
),
'query' => null,
- 'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace'
+ 'namespace' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace'
),
- '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
+ '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
)
);
}
public function getParamDescription() {
- return array (
- 'prop' => 'What pieces of information to include',
+ $p = $this->getModulePrefix();
+ return array(
+ 'prop' => array(
+ 'What pieces of information to include',
+ ' ids - Adds the id of page',
+ ' title - Adds the title and namespace id of the page',
+ ' url - Adds the URL used in the page',
+ ),
'offset' => 'Used for paging. Use the value returned for "continue"',
- 'protocol' => array( 'Protocol of the url. If empty and euquery set, the protocol is http.',
- 'Leave both this and euquery empty to list all external links' ),
+ 'protocol' => array(
+ "Protocol of the url. If empty and {$p}query set, the protocol is http.",
+ "Leave both this and {$p}query empty to list all external links"
+ ),
'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
'namespace' => 'The page namespace(s) to enumerate.',
'limit' => 'How many pages to return.'
@@ -206,7 +215,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
public function getDescription() {
return 'Enumerate pages that contain a given URL';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'bad_query', 'info' => 'Invalid query' ),
@@ -214,12 +223,12 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryExtLinksUsage.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryExtLinksUsage.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php
index a748e036..fbfcbfb9 100644
--- a/includes/api/ApiQueryExternalLinks.php
+++ b/includes/api/ApiQueryExternalLinks.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on May 13, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on May 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,15 +37,16 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryExternalLinks extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'el' );
+ parent::__construct( $query, $moduleName, 'el' );
}
public function execute() {
- if ( $this->getPageSet()->getGoodTitleCount() == 0 )
+ if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
return;
+ }
$params = $this->extractRequestParams();
- $this->addFields( array (
+ $this->addFields( array(
'el_from',
'el_to'
) );
@@ -53,18 +55,19 @@ class ApiQueryExternalLinks extends ApiQueryBase {
$this->addWhereFld( 'el_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
// Don't order by el_from if it's constant in the WHERE clause
- if ( count( $this->getPageSet()->getGoodTitles() ) != 1 )
+ if ( count( $this->getPageSet()->getGoodTitles() ) != 1 ) {
$this->addOption( 'ORDER BY', 'el_from' );
+ }
$this->addOption( 'LIMIT', $params['limit'] + 1 );
- if ( !is_null( $params['offset'] ) )
+ if ( !is_null( $params['offset'] ) ) {
$this->addOption( 'OFFSET', $params['offset'] );
+ }
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -72,15 +75,13 @@ class ApiQueryExternalLinks extends ApiQueryBase {
break;
}
$entry = array();
- ApiResult :: setContent( $entry, $row->el_to );
+ ApiResult::setContent( $entry, $row->el_to );
$fit = $this->addPageSubItem( $row->el_from, $entry );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'offset', @$params['offset'] + $count - 1 );
break;
}
}
- $db->freeResult( $res );
}
public function getCacheMode( $params ) {
@@ -89,18 +90,18 @@ class ApiQueryExternalLinks extends ApiQueryBase {
public function getAllowedParams() {
return array(
- '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
- ),
- 'offset' => null,
+ '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
+ ),
+ 'offset' => null,
);
}
- public function getParamDescription () {
+ public function getParamDescription() {
return array(
'limit' => 'How many links to return',
'offset' => 'When more results are available, use this to continue',
@@ -112,13 +113,13 @@ class ApiQueryExternalLinks extends ApiQueryBase {
}
protected function getExamples() {
- return array (
- "Get a list of external links on the [[Main Page]]:",
- " api.php?action=query&prop=extlinks&titles=Main%20Page",
- );
+ return array(
+ 'Get a list of external links on the [[Main Page]]:',
+ ' api.php?action=query&prop=extlinks&titles=Main%20Page',
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryExternalLinks.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryExternalLinks.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php
new file mode 100644
index 00000000..05ccb346
--- /dev/null
+++ b/includes/api/ApiQueryFilearchive.php
@@ -0,0 +1,264 @@
+<?php
+/**
+ * API for MediaWiki 1.12+
+ *
+ * Created on May 10, 2010
+ *
+ * Copyright © 2010 Sam Reed
+ * 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
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ // Eclipse helper - will be ignored in production
+ require_once( 'ApiQueryBase.php' );
+}
+
+/**
+ * Query module to enumerate all deleted files.
+ *
+ * @ingroup API
+ */
+class ApiQueryFilearchive extends ApiQueryBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'fa' );
+ }
+
+ public function execute() {
+ global $wgUser;
+ // Before doing anything at all, let's check permissions
+ if ( !$wgUser->isAllowed( 'deletedhistory' ) ) {
+ $this->dieUsage( 'You don\'t have permission to view deleted file information', 'permissiondenied' );
+ }
+
+ $db = $this->getDB();
+
+ $params = $this->extractRequestParams();
+
+ $prop = array_flip( $params['prop'] );
+ $fld_sha1 = isset( $prop['sha1'] );
+ $fld_timestamp = isset( $prop['timestamp'] );
+ $fld_user = isset( $prop['user'] );
+ $fld_size = isset( $prop['size'] );
+ $fld_dimensions = isset( $prop['dimensions'] );
+ $fld_description = isset( $prop['description'] );
+ $fld_mime = isset( $prop['mime'] );
+ $fld_metadata = isset( $prop['metadata'] );
+ $fld_bitdepth = isset( $prop['bitdepth'] );
+
+ $this->addTables( 'filearchive' );
+
+ $this->addFields( array( 'fa_name', 'fa_deleted' ) );
+ $this->addFieldsIf( 'fa_storage_key', $fld_sha1 );
+ $this->addFieldsIf( 'fa_timestamp', $fld_timestamp );
+
+ if ( $fld_user ) {
+ $this->addFields( array( 'fa_user', 'fa_user_text' ) );
+ }
+ $this->addFieldsIf( 'fa_size', $fld_size );
+
+ if ( $fld_dimensions ) {
+ $this->addFields( array( 'fa_height', 'fa_width' ) );
+ }
+
+ $this->addFieldsIf( 'fa_description', $fld_description );
+
+ if ( $fld_mime ) {
+ $this->addFields( array( 'fa_major_mime', 'fa_minor_mime' ) );
+ }
+
+ $this->addFieldsIf( 'fa_metadata', $fld_metadata );
+ $this->addFieldsIf( 'fa_bits', $fld_bitdepth );
+
+ // Image filters
+ $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+ $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+ $this->addWhereRange( 'fa_name', $dir, $from, null );
+ if ( isset( $params['prefix'] ) ) {
+ $this->addWhere( 'fa_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+ }
+
+ if ( !$wgUser->isAllowed( 'suppressrevision' ) ) {
+ // Filter out revisions that the user is not allowed to see. There
+ // is no way to indicate that we have skipped stuff because the
+ // continuation parameter is fa_name
+
+ // Note that this field is unindexed. This should however not be
+ // a big problem as files with fa_deleted are rare
+ $this->addWhereFld( 'fa_deleted', 0 );
+ }
+
+
+
+ $limit = $params['limit'];
+ $this->addOption( 'LIMIT', $limit + 1 );
+ $this->addOption( 'ORDER BY', 'fa_name' .
+ ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+
+ $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->fa_name ) );
+ break;
+ }
+
+ $file = array();
+ $file['name'] = $row->fa_name;
+
+ if ( $fld_sha1 ) {
+ $file['sha1'] = wfBaseConvert( $row->fa_storage_key, 36, 16, 40 );
+ }
+ if ( $fld_timestamp ) {
+ $file['timestamp'] = wfTimestamp( TS_ISO_8601, $row->fa_timestamp );
+ }
+ if ( $fld_user ) {
+ $file['userid'] = $row->fa_user;
+ $file['user'] = $row->fa_user_text;
+ }
+ if ( $fld_size ) {
+ $file['size'] = $row->fa_size;
+ }
+ if ( $fld_dimensions ) {
+ $file['height'] = $row->fa_height;
+ $file['width'] = $row->fa_width;
+ }
+ if ( $fld_description ) {
+ $file['description'] = $row->fa_description;
+ }
+ if ( $fld_metadata ) {
+ $file['metadata'] = $row->fa_metadata ? ApiQueryImageInfo::processMetaData( unserialize( $row->fa_metadata ), $result ) : null;
+ }
+ if ( $fld_bitdepth ) {
+ $file['bitdepth'] = $row->fa_bits;
+ }
+ if ( $fld_mime ) {
+ $file['mime'] = "$row->fa_major_mime/$row->fa_minor_mime";
+ }
+
+ if ( $row->fa_deleted & File::DELETED_FILE ) {
+ $file['filehidden'] = '';
+ }
+ if ( $row->fa_deleted & File::DELETED_COMMENT ) {
+ $file['commenthidden'] = '';
+ }
+ if ( $row->fa_deleted & File::DELETED_USER ) {
+ $file['userhidden'] = '';
+ }
+ if ( $row->fa_deleted & File::DELETED_RESTRICTED ) {
+ // This file is deleted for normal admins
+ $file['suppressed'] = '';
+ }
+
+
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->fa_name ) );
+ break;
+ }
+ }
+
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'fa' );
+ }
+
+ public function getAllowedParams() {
+ return array (
+ 'from' => null,
+ 'prefix' => null,
+ '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'
+ )
+ ),
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => 'timestamp',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
+ 'sha1',
+ 'timestamp',
+ 'user',
+ 'size',
+ 'dimensions',
+ 'description',
+ 'mime',
+ 'metadata',
+ 'bitdepth'
+ ),
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'from' => 'The image title to start enumerating from',
+ 'prefix' => 'Search for all image titles that begin with this value',
+ 'dir' => 'The direction in which to list',
+ 'limit' => 'How many total images to return',
+ 'prop' => array(
+ 'What image information to get:',
+ ' sha1 - Adds sha1 hash for the image',
+ ' timestamp - Adds timestamp for the uploaded version',
+ ' user - Adds user who uploaded the image version',
+ ' size - Adds the size of the image in bytes',
+ ' dimensions - Adds the height and width of the image',
+ ' description - Adds description the image version',
+ ' mime - Adds MIME of the image',
+ ' metadata - Lists EXIF metadata for the version of the image',
+ ' bitdepth - Adds the bit depth of the version',
+ ),
+ );
+ }
+
+ public function getDescription() {
+ return 'Enumerate all deleted files sequentially';
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted file information' ),
+ ) );
+ }
+
+ protected function getExamples() {
+ return array(
+ 'Simple Use',
+ ' Show a list of all deleted files',
+ ' api.php?action=query&list=filearchive',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryFilearchive.php 85354 2011-04-04 18:25:31Z demon $';
+ }
+}
diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php
new file mode 100644
index 00000000..6958a253
--- /dev/null
+++ b/includes/api/ApiQueryIWBacklinks.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * API for MediaWiki 1.17+
+ *
+ * Created on May 14, 2010
+ *
+ * Copyright © 2010 Sam Reed
+ * 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
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ // Eclipse helper - will be ignored in production
+ require_once( "ApiQueryBase.php" );
+}
+
+/**
+ * This gives links pointing to the given interwiki
+ * @ingroup API
+ */
+class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'iwbl' );
+ }
+
+ public function execute() {
+ $this->run();
+ }
+
+ public function executeGenerator( $resultPageSet ) {
+ $this->run( $resultPageSet );
+ }
+
+ public function run( $resultPageSet = null ) {
+ $params = $this->extractRequestParams();
+
+ if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
+ $this->dieUsageMsg( array( 'missingparam', 'prefix' ) );
+ }
+
+ if ( !is_null( $params['continue'] ) ) {
+ $cont = explode( '|', $params['continue'] );
+ if ( count( $cont ) != 3 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
+
+ $prefix = $this->getDB()->strencode( $cont[0] );
+ $title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+ $from = intval( $cont[2] );
+ $this->addWhere(
+ "iwl_prefix > '$prefix' OR " .
+ "(iwl_prefix = '$prefix' AND " .
+ "(iwl_title > '$title' OR " .
+ "(iwl_title = '$title' AND " .
+ "iwl_from >= $from)))"
+ );
+ }
+
+ $prop = array_flip( $params['prop'] );
+ $iwprefix = isset( $prop['iwprefix'] );
+ $iwtitle = isset( $prop['iwtitle'] );
+
+ $this->addTables( array( 'iwlinks', 'page' ) );
+ $this->addWhere( 'iwl_from = page_id' );
+
+ $this->addFields( array( 'page_id', 'page_title', 'page_namespace', 'page_is_redirect',
+ 'iwl_from', 'iwl_prefix', 'iwl_title' ) );
+
+ 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' );
+ } else {
+ $this->addOption( 'ORDER BY', 'iwl_title, iwl_from' );
+ }
+ } else {
+ $this->addOption( 'ORDER BY', 'iwl_prefix, iwl_title, iwl_from' );
+ }
+
+ $this->addOption( 'LIMIT', $params['limit'] + 1 );
+
+ $res = $this->select( __METHOD__ );
+
+ $pages = array();
+
+ $count = 0;
+ $result = $this->getResult();
+ foreach ( $res as $row ) {
+ if ( ++ $count > $params['limit'] ) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ // Continue string preserved in case the redirect query doesn't pass the limit
+ $this->setContinueEnumParameter( 'continue', "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}" );
+ break;
+ }
+
+ if ( !is_null( $resultPageSet ) ) {
+ $pages[] = Title::newFromRow( $row );
+ } else {
+ $entry = array();
+
+ $entry['pageid'] = intval( $row->page_id );
+ $entry['ns'] = intval( $row->page_namespace );
+ $entry['title'] = $row->page_title;
+
+ if ( $row->page_is_redirect ) {
+ $entry['redirect'] = '';
+ }
+
+ if ( $iwprefix ) {
+ $entry['iwprefix'] = $row->iwl_prefix;
+ }
+
+ if ( $iwtitle ) {
+ $entry['iwtitle'] = $row->iwl_title;
+ }
+
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $entry );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}" );
+ break;
+ }
+ }
+ }
+
+ if ( is_null( $resultPageSet ) ) {
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'iw' );
+ } else {
+ $resultPageSet->populateFromTitles( $pages );
+ }
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'prefix' => null,
+ 'title' => null,
+ 'continue' => null,
+ '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
+ ),
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => '',
+ ApiBase::PARAM_TYPE => array(
+ 'iwprefix',
+ 'iwtitle',
+ ),
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'prefix' => 'Prefix for the interwiki',
+ 'title' => "Interwiki link to search for. Must be used with {$this->getModulePrefix()}prefix",
+ 'continue' => 'When more results are available, use this to continue',
+ 'prop' => array(
+ 'Which properties to get',
+ ' iwprefix - Adds the prefix of the interwiki',
+ ' iwtitle - Adds the title of the interwiki',
+ ),
+ 'limit' => 'How many total pages to return',
+ );
+ }
+
+ public function getDescription() {
+ return array( 'Find all pages that link to the given interwiki link.',
+ 'Can be used to find all links with a prefix, or',
+ 'all links to a title (with a given prefix).',
+ 'Using neither parameter is effectively "All IW Links"',
+ );
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'missingparam', 'prefix' ),
+ array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+ ) );
+ }
+
+ protected 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'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryIWBacklinks.php 70647 2010-08-07 19:59:42Z ialex $';
+ }
+}
diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php
new file mode 100644
index 00000000..e980d6a5
--- /dev/null
+++ b/includes/api/ApiQueryIWLinks.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * API for MediaWiki 1.17+
+ *
+ * Created on May 14, 2010
+ *
+ * Copyright © 2010 Sam Reed
+ * 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
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ // Eclipse helper - will be ignored in production
+ require_once( "ApiQueryBase.php" );
+}
+
+/**
+ * A query module to list all interwiki links on a page
+ *
+ * @ingroup API
+ */
+class ApiQueryIWLinks extends ApiQueryBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'iw' );
+ }
+
+ public function execute() {
+ if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
+ return;
+ }
+
+ $params = $this->extractRequestParams();
+ $this->addFields( array(
+ 'iwl_from',
+ 'iwl_prefix',
+ 'iwl_title'
+ ) );
+
+ $this->addTables( 'iwlinks' );
+ $this->addWhereFld( 'iwl_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
+
+ if ( !is_null( $params['continue'] ) ) {
+ $cont = explode( '|', $params['continue'] );
+ if ( count( $cont ) != 3 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
+ $iwlfrom = intval( $cont[0] );
+ $iwlprefix = $this->getDB()->strencode( $cont[1] );
+ $iwltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
+ $this->addWhere(
+ "iwl_from > $iwlfrom OR " .
+ "(iwl_from = $iwlfrom AND " .
+ "(iwl_prefix > '$iwlprefix' OR " .
+ "(iwl_prefix = '$iwlprefix' AND " .
+ "iwl_title >= '$iwltitle')))"
+ );
+ }
+
+ // 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' );
+ } else {
+ $this->addOption( 'ORDER BY', 'iwl_from, iwl_prefix' );
+ }
+ $this->addOption( 'LIMIT', $params['limit'] + 1 );
+ $res = $this->select( __METHOD__ );
+
+ $count = 0;
+ foreach ( $res as $row ) {
+ if ( ++$count > $params['limit'] ) {
+ // We've reached the one extra which shows that
+ // there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}" );
+ break;
+ }
+ $entry = array( 'prefix' => $row->iwl_prefix );
+
+ if ( !is_null( $params['url'] ) ) {
+ $title = Title::newFromText( "{$row->iwl_prefix}:{$row->iwl_title}" );
+ if ( $title ) {
+ $entry['url'] = $title->getFullURL();
+ }
+ }
+
+ ApiResult::setContent( $entry, $row->iwl_title );
+ $fit = $this->addPageSubItem( $row->iwl_from, $entry );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}" );
+ break;
+ }
+ }
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'url' => null,
+ '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
+ ),
+ 'continue' => null,
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'url' => 'Whether to get the full URL',
+ 'limit' => 'How many interwiki links to return',
+ 'continue' => 'When more results are available, use this to continue',
+ );
+ }
+
+ public function getDescription() {
+ return 'Returns all interwiki links from the given page(s)';
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+ ) );
+ }
+
+ protected function getExamples() {
+ return array(
+ 'Get interwiki links from the [[Main Page]]:',
+ ' api.php?action=query&prop=iwlinks&titles=Main%20Page',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryIWLinks.php 77080 2010-11-21 17:27:13Z reedy $';
+ }
+}
diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php
index 3704710a..21696be2 100644
--- a/includes/api/ApiQueryImageInfo.php
+++ b/includes/api/ApiQueryImageInfo.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 6, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on July 6, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -35,8 +36,13 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*/
class ApiQueryImageInfo extends ApiQueryBase {
- public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'ii' );
+ public function __construct( $query, $moduleName, $prefix = 'ii' ) {
+ // We allow a subclass to override the prefix, to create a related API module.
+ // Some other parts of MediaWiki construct this with a null $prefix, which used to be ignored when this only took two arguments
+ if ( is_null( $prefix ) ) {
+ $prefix = 'ii';
+ }
+ parent::__construct( $query, $moduleName, $prefix );
}
public function execute() {
@@ -44,16 +50,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
$prop = array_flip( $params['prop'] );
- if ( $params['urlheight'] != - 1 && $params['urlwidth'] == - 1 )
- $this->dieUsage( "iiurlheight cannot be used without iiurlwidth", 'iiurlwidth' );
-
- if ( $params['urlwidth'] != - 1 ) {
- $scale = array();
- $scale['width'] = $params['urlwidth'];
- $scale['height'] = $params['urlheight'];
- } else {
- $scale = null;
- }
+ $scale = $this->getScale( $params );
$pageIds = $this->getPageSet()->getAllTitlesByNamespace();
if ( !empty( $pageIds[NS_FILE] ) ) {
@@ -61,30 +58,33 @@ class ApiQueryImageInfo extends ApiQueryBase {
asort( $titles ); // Ensure the order is always the same
$skip = false;
- if ( !is_null( $params['continue'] ) )
- {
+ if ( !is_null( $params['continue'] ) ) {
$skip = true;
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the original " .
- "value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original ' .
+ 'value returned by the previous query', '_badcontinue' );
+ }
$fromTitle = strval( $cont[0] );
$fromTimestamp = $cont[1];
// Filter out any titles before $fromTitle
- foreach ( $titles as $key => $title )
- if ( $title < $fromTitle )
+ foreach ( $titles as $key => $title ) {
+ if ( $title < $fromTitle ) {
unset( $titles[$key] );
- else
+ } else {
break;
+ }
+ }
}
$result = $this->getResult();
$images = RepoGroup::singleton()->findFiles( $titles );
foreach ( $images as $img ) {
// Skip redirects
- if ( $img->getOriginalTitle()->isRedirect() )
+ if ( $img->getOriginalTitle()->isRedirect() ) {
continue;
-
+ }
+
$start = $skip ? $fromTimestamp : $params['start'];
$pageId = $pageIds[NS_IMAGE][ $img->getOriginalTitle()->getDBkey() ];
@@ -92,9 +92,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
array( 'query', 'pages', intval( $pageId ) ),
'imagerepository', $img->getRepoName()
);
- if ( !$fit )
- {
- if ( count( $pageIds[NS_IMAGE] ) == 1 )
+ if ( !$fit ) {
+ if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
// The user is screwed. imageinfo can't be solely
// responsible for exceeding the limit in this case,
// so set a query-continue that just returns the same
@@ -102,29 +101,33 @@ class ApiQueryImageInfo extends ApiQueryBase {
// out-continued, the result will get through
$this->setContinueEnumParameter( 'start',
wfTimestamp( TS_ISO_8601, $img->getTimestamp() ) );
- else
+ } else {
$this->setContinueEnumParameter( 'continue',
$this->getContinueStr( $img ) );
+ }
break;
}
// Get information about the current version first
// Check that the current version is within the start-end boundaries
$gotOne = false;
- if ( ( is_null( $start ) || $img->getTimestamp() <= $start ) &&
- ( is_null( $params['end'] ) || $img->getTimestamp() >= $params['end'] ) ) {
+ if (
+ ( is_null( $start ) || $img->getTimestamp() <= $start ) &&
+ ( is_null( $params['end'] ) || $img->getTimestamp() >= $params['end'] )
+ )
+ {
$gotOne = true;
$fit = $this->addPageSubItem( $pageId,
self::getInfo( $img, $prop, $result, $scale ) );
- if ( !$fit )
- {
- if ( count( $pageIds[NS_IMAGE] ) == 1 )
+ if ( !$fit ) {
+ if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
// See the 'the user is screwed' comment above
$this->setContinueEnumParameter( 'start',
wfTimestamp( TS_ISO_8601, $img->getTimestamp() ) );
- else
+ } else {
$this->setContinueEnumParameter( 'continue',
$this->getContinueStr( $img ) );
+ }
break;
}
}
@@ -137,8 +140,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
if ( ++$count > $params['limit'] ) {
// We've reached the extra one which shows that there are additional pages to be had. Stop here...
// Only set a query-continue if there was only one title
- if ( count( $pageIds[NS_FILE] ) == 1 )
- {
+ if ( count( $pageIds[NS_FILE] ) == 1 ) {
$this->setContinueEnumParameter( 'start',
wfTimestamp( TS_ISO_8601, $oldie->getTimestamp() ) );
}
@@ -146,97 +148,210 @@ class ApiQueryImageInfo extends ApiQueryBase {
}
$fit = $this->addPageSubItem( $pageId,
self::getInfo( $oldie, $prop, $result ) );
- if ( !$fit )
- {
- if ( count( $pageIds[NS_IMAGE] ) == 1 )
+ if ( !$fit ) {
+ if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
$this->setContinueEnumParameter( 'start',
wfTimestamp( TS_ISO_8601, $oldie->getTimestamp() ) );
- else
+ } else {
$this->setContinueEnumParameter( 'continue',
$this->getContinueStr( $oldie ) );
+ }
break;
}
}
- if ( !$fit )
+ if ( !$fit ) {
break;
+ }
$skip = false;
}
-
+
$data = $this->getResultData();
foreach ( $data['query']['pages'] as $pageid => $arr ) {
- if ( !isset( $arr['imagerepository'] ) )
+ if ( !isset( $arr['imagerepository'] ) ) {
$result->addValue(
array( 'query', 'pages', $pageid ),
'imagerepository', ''
);
- // The above can't fail because it doesn't increase the result size
+ }
+ // The above can't fail because it doesn't increase the result size
}
}
}
/**
+ * From parameters, construct a 'scale' array
+ * @param $params Array:
+ * @return Array or Null: key-val array of 'width' and 'height', or null
+ */
+ public function getScale( $params ) {
+ $p = $this->getModulePrefix();
+ if ( $params['urlheight'] != -1 && $params['urlwidth'] == -1 ) {
+ $this->dieUsage( "${p}urlheight cannot be used without {$p}urlwidth", "{$p}urlwidth" );
+ }
+
+ if ( $params['urlwidth'] != -1 ) {
+ $scale = array();
+ $scale['width'] = $params['urlwidth'];
+ $scale['height'] = $params['urlheight'];
+ } else {
+ $scale = null;
+ }
+ return $scale;
+ }
+
+
+ /**
* Get result information for an image revision
- * @param File f The image
- * @return array Result array
+ *
+ * @param $file File object
+ * @param $prop Array of properties to get (in the keys)
+ * @param $result ApiResult object
+ * @param $scale Array containing 'width' and 'height' items, or null
+ * @return Array: result array
*/
static function getInfo( $file, $prop, $result, $scale = null ) {
$vals = array();
- if ( isset( $prop['timestamp'] ) )
+ // Timestamp is shown even if the file is revdelete'd in interface
+ // so do same here.
+ if ( isset( $prop['timestamp'] ) ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $file->getTimestamp() );
- if ( isset( $prop['user'] ) ) {
- $vals['user'] = $file->getUser();
- if ( !$file->getUser( 'id' ) )
- $vals['anon'] = '';
}
+
+ $user = isset( $prop['user'] );
+ $userid = isset( $prop['userid'] );
+
+ if ( $user || $userid ) {
+ if ( $file->isDeleted( File::DELETED_USER ) ) {
+ $vals['userhidden'] = '';
+ } else {
+ if ( $user ) {
+ $vals['user'] = $file->getUser();
+ }
+ if ( $userid ) {
+ $vals['userid'] = $file->getUser( 'id' );
+ }
+ if ( !$file->getUser( 'id' ) ) {
+ $vals['anon'] = '';
+ }
+ }
+ }
+
+ // This is shown even if the file is revdelete'd in interface
+ // so do same here.
if ( isset( $prop['size'] ) || isset( $prop['dimensions'] ) ) {
$vals['size'] = intval( $file->getSize() );
$vals['width'] = intval( $file->getWidth() );
$vals['height'] = intval( $file->getHeight() );
+
+ $pageCount = $file->pageCount();
+ if ( $pageCount !== false ) {
+ $vals['pagecount'] = $pageCount;
+ }
+ }
+
+ $pcomment = isset( $prop['parsedcomment'] );
+ $comment = isset( $prop['comment'] );
+
+ if ( $pcomment || $comment ) {
+ if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+ $vals['commenthidden'] = '';
+ } else {
+ if ( $pcomment ) {
+ global $wgUser;
+ $vals['parsedcomment'] = $wgUser->getSkin()->formatComment(
+ $file->getDescription(), $file->getTitle() );
+ }
+ if ( $comment ) {
+ $vals['comment'] = $file->getDescription();
+ }
+ }
}
- if ( isset( $prop['url'] ) ) {
+
+ $url = isset( $prop['url'] );
+ $sha1 = isset( $prop['sha1'] );
+ $meta = isset( $prop['metadata'] );
+ $mime = isset( $prop['mime'] );
+ $archive = isset( $prop['archivename'] );
+ $bitdepth = isset( $prop['bitdepth'] );
+
+ if ( ( $url || $sha1 || $meta || $mime || $archive || $bitdepth )
+ && $file->isDeleted( File::DELETED_FILE ) ) {
+ $vals['filehidden'] = '';
+
+ //Early return, tidier than indenting all following things one level
+ return $vals;
+ }
+
+ if ( $url ) {
if ( !is_null( $scale ) && !$file->isOld() ) {
$mto = $file->transform( array( 'width' => $scale['width'], 'height' => $scale['height'] ) );
- if ( $mto && !$mto->isError() )
- {
+ if ( $mto && !$mto->isError() ) {
$vals['thumburl'] = wfExpandUrl( $mto->getUrl() );
- $vals['thumbwidth'] = intval( $mto->getWidth() );
- $vals['thumbheight'] = intval( $mto->getHeight() );
+
+ // bug 23834 - If the URL's are the same, we haven't resized it, so shouldn't give the wanted
+ // thumbnail sizes for the thumbnail actual size
+ if ( $mto->getUrl() !== $file->getUrl() ) {
+ $vals['thumbwidth'] = intval( $mto->getWidth() );
+ $vals['thumbheight'] = intval( $mto->getHeight() );
+ } else {
+ $vals['thumbwidth'] = intval( $file->getWidth() );
+ $vals['thumbheight'] = intval( $file->getHeight() );
+ }
+
+ if ( isset( $prop['thumbmime'] ) && $file->getHandler() ) {
+ list( $ext, $mime ) = $file->getHandler()->getThumbType(
+ substr( $mto->getPath(), strrpos( $mto->getPath(), '.' ) + 1 ),
+ $file->getMimeType(), $thumbParams );
+ $vals['thumbmime'] = $mime;
+ }
+ } else if ( $mto && $mto->isError() ) {
+ $vals['thumberror'] = $mto->toText();
}
}
$vals['url'] = $file->getFullURL();
$vals['descriptionurl'] = wfExpandUrl( $file->getDescriptionUrl() );
}
- if ( isset( $prop['comment'] ) )
- $vals['comment'] = $file->getDescription();
- if ( isset( $prop['sha1'] ) )
+
+ if ( $sha1 ) {
$vals['sha1'] = wfBaseConvert( $file->getSha1(), 36, 16, 40 );
- if ( isset( $prop['metadata'] ) ) {
+ }
+
+ if ( $meta ) {
$metadata = $file->getMetadata();
$vals['metadata'] = $metadata ? self::processMetaData( unserialize( $metadata ), $result ) : null;
}
- if ( isset( $prop['mime'] ) )
+
+ if ( $mime ) {
$vals['mime'] = $file->getMimeType();
-
- if ( isset( $prop['archivename'] ) && $file->isOld() )
+ }
+
+ if ( $archive && $file->isOld() ) {
$vals['archivename'] = $file->getArchiveName();
-
- if ( isset( $prop['bitdepth'] ) )
+ }
+
+ if ( $bitdepth ) {
$vals['bitdepth'] = $file->getBitDepth();
+ }
return $vals;
}
-
- public static function processMetaData( $metadata, $result )
- {
+
+ /*
+ *
+ * @param $metadata Array
+ * @param $result ApiResult
+ * @return Array
+ */
+ public static function processMetaData( $metadata, $result ) {
$retval = array();
if ( is_array( $metadata ) ) {
- foreach ( $metadata as $key => $value )
- {
+ foreach ( $metadata as $key => $value ) {
$r = array( 'name' => $key );
- if ( is_array( $value ) )
+ if ( is_array( $value ) ) {
$r['value'] = self::processMetaData( $value, $result );
- else
+ } else {
$r['value'] = $value;
+ }
$retval[] = $r;
}
}
@@ -248,82 +363,104 @@ class ApiQueryImageInfo extends ApiQueryBase {
return 'public';
}
- private function getContinueStr( $img )
- {
+ private function getContinueStr( $img ) {
return $img->getOriginalTitle()->getText() .
'|' . $img->getTimestamp();
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'timestamp|user',
- ApiBase :: PARAM_TYPE => self::getPropertyNames()
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'timestamp|user',
+ ApiBase::PARAM_TYPE => self::getPropertyNames()
),
'limit' => array(
- ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_DFLT => 1,
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
- ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 1,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'start' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'end' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'urlwidth' => array(
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_DFLT => - 1
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_DFLT => -1
),
'urlheight' => array(
- ApiBase :: PARAM_TYPE => 'integer',
- ApiBase :: PARAM_DFLT => - 1
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_DFLT => -1
),
'continue' => null,
);
}
-
+
/**
* Returns all possible parameters to iiprop
*/
public static function getPropertyNames() {
- return array (
- 'timestamp',
- 'user',
- 'comment',
- 'url',
- 'size',
- 'dimensions', // For backwards compatibility with Allimages
- 'sha1',
- 'mime',
- 'metadata',
- 'archivename',
- 'bitdepth',
- );
+ return array(
+ 'timestamp',
+ 'user',
+ 'userid',
+ 'comment',
+ 'parsedcomment',
+ 'url',
+ 'size',
+ 'dimensions', // For backwards compatibility with Allimages
+ 'sha1',
+ 'mime',
+ 'thumbmime',
+ 'metadata',
+ 'archivename',
+ 'bitdepth',
+ );
}
+
+ /**
+ * Return the API documentation for the parameters.
+ * @return {Array} parameter documentation.
+ */
public function getParamDescription() {
- return array (
- 'prop' => 'What image information to get.',
+ $p = $this->getModulePrefix();
+ return array(
+ 'prop' => array(
+ 'What image information to get:',
+ ' timestamp - Adds timestamp for the uploaded version',
+ ' user - Adds the user who uploaded the image version',
+ ' userid - Add the user id that uploaded the image version',
+ ' comment - Comment on the version',
+ ' parsedcomment - Parse the comment on the version',
+ ' url - Gives URL to the image and the description page',
+ ' size - Adds the size of the image in bytes and the height and width',
+ ' dimensions - Alias for size',
+ ' sha1 - Adds sha1 hash for the image',
+ ' mime - Adds MIME of the image',
+ ' thumbmime - Adss MIME of the image thumbnail (requires url)',
+ ' metadata - Lists EXIF metadata for the version of the image',
+ ' archivename - Adds the file name of the archive version for non-latest versions',
+ ' bitdepth - Adds the bit depth of the version',
+ ),
+ 'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
+ 'Only the current version of the image can be scaled' ),
+ 'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth",
'limit' => 'How many image revisions to return',
'start' => 'Timestamp to start listing from',
'end' => 'Timestamp to stop listing at',
- 'urlwidth' => array( 'If iiprop=url is set, a URL to an image scaled to this width will be returned.',
- 'Only the current version of the image can be scaled.' ),
- 'urlheight' => 'Similar to iiurlwidth. Cannot be used without iiurlwidth',
- 'continue' => 'When more results are available, use this to continue',
+ 'continue' => 'If the query response includes a continue value, use it here to get another page of results'
);
}
public function getDescription() {
- return array (
- 'Returns image information and upload history'
- );
+ return 'Returns image information and upload history';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'iiurlwidth', 'info' => 'iiurlheight cannot be used without iiurlwidth' ),
@@ -331,13 +468,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo',
'api.php?action=query&titles=File:Test.jpg&prop=imageinfo&iilimit=50&iiend=20071231235959&iiprop=timestamp|user|url',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryImageInfo.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryImageInfo.php 85435 2011-04-05 14:00:08Z demon $';
}
}
diff --git a/includes/api/ApiQueryImages.php b/includes/api/ApiQueryImages.php
index 65df94dc..af2920c7 100644
--- a/includes/api/ApiQueryImages.php
+++ b/includes/api/ApiQueryImages.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on May 13, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on May 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryImages extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'im' );
+ parent::__construct( $query, $moduleName, 'im' );
}
public function execute() {
@@ -48,12 +49,12 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
- if ( $this->getPageSet()->getGoodTitleCount() == 0 )
+ if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
return; // nothing to do
+ }
$params = $this->extractRequestParams();
- $this->addFields( array (
+ $this->addFields( array(
'il_from',
'il_to'
) );
@@ -62,29 +63,32 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
$this->addWhereFld( 'il_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
$ilfrom = intval( $cont[0] );
$ilto = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
- $this->addWhere( "il_from > $ilfrom OR " .
- "(il_from = $ilfrom AND " .
- "il_to >= '$ilto')" );
+ $this->addWhere(
+ "il_from > $ilfrom OR " .
+ "(il_from = $ilfrom AND " .
+ "il_to >= '$ilto')"
+ );
}
// Don't order by il_from if it's constant in the WHERE clause
- if ( count( $this->getPageSet()->getGoodTitles() ) == 1 )
+ if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
$this->addOption( 'ORDER BY', 'il_to' );
- else
+ } else {
$this->addOption( 'ORDER BY', 'il_from, il_to' );
+ }
$this->addOption( 'LIMIT', $params['limit'] + 1 );
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
if ( is_null( $resultPageSet ) ) {
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -93,20 +97,18 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
break;
}
$vals = array();
- ApiQueryBase :: addTitleInfo( $vals, Title :: makeTitle( NS_FILE, $row->il_to ) );
+ ApiQueryBase::addTitleInfo( $vals, Title::makeTitle( NS_FILE, $row->il_to ) );
$fit = $this->addPageSubItem( $row->il_from, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->il_from .
'|' . $this->keyToTitle( $row->il_to ) );
break;
}
}
} else {
-
$titles = array();
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -114,12 +116,10 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
'|' . $this->keyToTitle( $row->il_to ) );
break;
}
- $titles[] = Title :: makeTitle( NS_FILE, $row->il_to );
+ $titles[] = Title::makeTitle( NS_FILE, $row->il_to );
}
$resultPageSet->populateFromTitles( $titles );
}
-
- $db->freeResult( $res );
}
public function getCacheMode( $params ) {
@@ -128,18 +128,18 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
public function getAllowedParams() {
return array(
- '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
- ),
- 'continue' => null,
+ '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
+ ),
+ 'continue' => null,
);
}
- public function getParamDescription () {
+ public function getParamDescription() {
return array(
'limit' => 'How many images to return',
'continue' => 'When more results are available, use this to continue',
@@ -149,7 +149,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
public function getDescription() {
return 'Returns all images contained on the given page(s)';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
@@ -157,15 +157,15 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
- "Get a list of images used in the [[Main Page]]:",
- " api.php?action=query&prop=images&titles=Main%20Page",
- "Get information about all images used in the [[Main Page]]:",
- " api.php?action=query&generator=images&titles=Main%20Page&prop=info"
- );
+ return array(
+ 'Get a list of images used in the [[Main Page]]:',
+ ' api.php?action=query&prop=images&titles=Main%20Page',
+ 'Get information about all images used in the [[Main Page]]:',
+ ' api.php?action=query&generator=images&titles=Main%20Page&prop=info'
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryImages.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryImages.php 73543 2010-09-22 16:50:09Z platonides $';
}
}
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index b1c2963c..59f61de1 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 25, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -38,17 +39,23 @@ class ApiQueryInfo extends ApiQueryBase {
private $fld_protection = false, $fld_talkid = false,
$fld_subjectid = false, $fld_url = false,
$fld_readable = false, $fld_watched = false,
- $fld_preload = false;
+ $fld_preload = false, $fld_displaytitle = false;
+
+ private $tokenFunctions;
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'in' );
+ parent::__construct( $query, $moduleName, 'in' );
}
public function requestExtraData( $pageSet ) {
+ global $wgDisableCounters;
+
$pageSet->requestField( 'page_restrictions' );
$pageSet->requestField( 'page_is_redirect' );
$pageSet->requestField( 'page_is_new' );
- $pageSet->requestField( 'page_counter' );
+ if ( !$wgDisableCounters ) {
+ $pageSet->requestField( 'page_counter' );
+ }
$pageSet->requestField( 'page_touched' );
$pageSet->requestField( 'page_latest' );
$pageSet->requestField( 'page_len' );
@@ -62,12 +69,14 @@ class ApiQueryInfo extends ApiQueryBase {
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
- if ( isset( $this->tokenFunctions ) )
+ if ( isset( $this->tokenFunctions ) ) {
return $this->tokenFunctions;
+ }
// If we're in JSON callback mode, no tokens can be obtained
- if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) )
+ if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) {
return array();
+ }
$this->tokenFunctions = array(
'edit' => array( 'ApiQueryInfo', 'getEditToken' ),
@@ -83,109 +92,115 @@ class ApiQueryInfo extends ApiQueryBase {
return $this->tokenFunctions;
}
- public static function getEditToken( $pageid, $title )
- {
+ public static function getEditToken( $pageid, $title ) {
// We could check for $title->userCan('edit') here,
// but that's too expensive for this purpose
// and would break caching
global $wgUser;
- if ( !$wgUser->isAllowed( 'edit' ) )
+ if ( !$wgUser->isAllowed( 'edit' ) ) {
return false;
+ }
// The edit token is always the same, let's exploit that
static $cachedEditToken = null;
- if ( !is_null( $cachedEditToken ) )
+ if ( !is_null( $cachedEditToken ) ) {
return $cachedEditToken;
+ }
$cachedEditToken = $wgUser->editToken();
return $cachedEditToken;
}
- public static function getDeleteToken( $pageid, $title )
- {
+ public static function getDeleteToken( $pageid, $title ) {
global $wgUser;
- if ( !$wgUser->isAllowed( 'delete' ) )
+ if ( !$wgUser->isAllowed( 'delete' ) ) {
return false;
+ }
static $cachedDeleteToken = null;
- if ( !is_null( $cachedDeleteToken ) )
+ if ( !is_null( $cachedDeleteToken ) ) {
return $cachedDeleteToken;
+ }
$cachedDeleteToken = $wgUser->editToken();
return $cachedDeleteToken;
}
- public static function getProtectToken( $pageid, $title )
- {
+ public static function getProtectToken( $pageid, $title ) {
global $wgUser;
- if ( !$wgUser->isAllowed( 'protect' ) )
+ if ( !$wgUser->isAllowed( 'protect' ) ) {
return false;
+ }
static $cachedProtectToken = null;
- if ( !is_null( $cachedProtectToken ) )
+ if ( !is_null( $cachedProtectToken ) ) {
return $cachedProtectToken;
+ }
$cachedProtectToken = $wgUser->editToken();
return $cachedProtectToken;
}
- public static function getMoveToken( $pageid, $title )
- {
+ public static function getMoveToken( $pageid, $title ) {
global $wgUser;
- if ( !$wgUser->isAllowed( 'move' ) )
+ if ( !$wgUser->isAllowed( 'move' ) ) {
return false;
+ }
static $cachedMoveToken = null;
- if ( !is_null( $cachedMoveToken ) )
+ if ( !is_null( $cachedMoveToken ) ) {
return $cachedMoveToken;
+ }
$cachedMoveToken = $wgUser->editToken();
return $cachedMoveToken;
}
- public static function getBlockToken( $pageid, $title )
- {
+ public static function getBlockToken( $pageid, $title ) {
global $wgUser;
- if ( !$wgUser->isAllowed( 'block' ) )
+ if ( !$wgUser->isAllowed( 'block' ) ) {
return false;
+ }
static $cachedBlockToken = null;
- if ( !is_null( $cachedBlockToken ) )
+ if ( !is_null( $cachedBlockToken ) ) {
return $cachedBlockToken;
+ }
$cachedBlockToken = $wgUser->editToken();
return $cachedBlockToken;
}
- public static function getUnblockToken( $pageid, $title )
- {
+ public static function getUnblockToken( $pageid, $title ) {
// Currently, this is exactly the same as the block token
return self::getBlockToken( $pageid, $title );
}
- public static function getEmailToken( $pageid, $title )
- {
+ public static function getEmailToken( $pageid, $title ) {
global $wgUser;
- if ( !$wgUser->canSendEmail() || $wgUser->isBlockedFromEmailUser() )
+ if ( !$wgUser->canSendEmail() || $wgUser->isBlockedFromEmailUser() ) {
return false;
+ }
static $cachedEmailToken = null;
- if ( !is_null( $cachedEmailToken ) )
+ if ( !is_null( $cachedEmailToken ) ) {
return $cachedEmailToken;
+ }
$cachedEmailToken = $wgUser->editToken();
return $cachedEmailToken;
}
- public static function getImportToken( $pageid, $title )
- {
+ public static function getImportToken( $pageid, $title ) {
global $wgUser;
- if ( !$wgUser->isAllowed( 'import' ) )
+ if ( !$wgUser->isAllowed( 'import' ) ) {
return false;
+ }
static $cachedImportToken = null;
- if ( !is_null( $cachedImportToken ) )
+ if ( !is_null( $cachedImportToken ) ) {
return $cachedImportToken;
+ }
$cachedImportToken = $wgUser->editToken();
return $cachedImportToken;
@@ -201,7 +216,8 @@ class ApiQueryInfo extends ApiQueryBase {
$this->fld_subjectid = isset( $prop['subjectid'] );
$this->fld_url = isset( $prop['url'] );
$this->fld_readable = isset( $prop['readable'] );
- $this->fld_preload = isset ( $prop['preload'] );
+ $this->fld_preload = isset( $prop['preload'] );
+ $this->fld_displaytitle = isset( $prop['displaytitle'] );
}
$pageSet = $this->getPageSet();
@@ -211,19 +227,19 @@ class ApiQueryInfo extends ApiQueryBase {
$result = $this->getResult();
uasort( $this->everything, array( 'Title', 'compare' ) );
- if ( !is_null( $this->params['continue'] ) )
- {
+ if ( !is_null( $this->params['continue'] ) ) {
// Throw away any titles we're gonna skip so they don't
// clutter queries
$cont = explode( '|', $this->params['continue'] );
- if ( count( $cont ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the original " .
- "value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original ' .
+ 'value returned by the previous query', '_badcontinue' );
+ }
$conttitle = Title::makeTitleSafe( $cont[0], $cont[1] );
- foreach ( $this->everything as $pageid => $title )
- {
- if ( Title::compare( $title, $conttitle ) >= 0 )
+ foreach ( $this->everything as $pageid => $title ) {
+ if ( Title::compare( $title, $conttitle ) >= 0 ) {
break;
+ }
unset( $this->titles[$pageid] );
unset( $this->missing[$pageid] );
unset( $this->everything[$pageid] );
@@ -233,31 +249,41 @@ class ApiQueryInfo extends ApiQueryBase {
$this->pageRestrictions = $pageSet->getCustomField( 'page_restrictions' );
$this->pageIsRedir = $pageSet->getCustomField( 'page_is_redirect' );
$this->pageIsNew = $pageSet->getCustomField( 'page_is_new' );
- $this->pageCounter = $pageSet->getCustomField( 'page_counter' );
+
+ global $wgDisableCounters;
+
+ if ( !$wgDisableCounters ) {
+ $this->pageCounter = $pageSet->getCustomField( 'page_counter' );
+ }
$this->pageTouched = $pageSet->getCustomField( 'page_touched' );
$this->pageLatest = $pageSet->getCustomField( 'page_latest' );
$this->pageLength = $pageSet->getCustomField( 'page_len' );
- $db = $this->getDB();
// Get protection info if requested
- if ( $this->fld_protection )
+ if ( $this->fld_protection ) {
$this->getProtectionInfo();
+ }
- if ( $this->fld_watched )
+ if ( $this->fld_watched ) {
$this->getWatchedInfo();
+ }
// Run the talkid/subjectid query if requested
- if ( $this->fld_talkid || $this->fld_subjectid )
+ if ( $this->fld_talkid || $this->fld_subjectid ) {
$this->getTSIDs();
+ }
+
+ if ( $this->fld_displaytitle ) {
+ $this->getDisplayTitle();
+ }
foreach ( $this->everything as $pageid => $title ) {
$pageInfo = $this->extractPageInfo( $pageid, $title );
- $fit = $result->addValue( array (
+ $fit = $result->addValue( array(
'query',
'pages'
), $pageid, $pageInfo );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue',
$title->getNamespace() . '|' .
$title->getText() );
@@ -272,81 +298,99 @@ class ApiQueryInfo extends ApiQueryBase {
* @param $title Title object
* @return array
*/
- private function extractPageInfo( $pageid, $title )
- {
+ private function extractPageInfo( $pageid, $title ) {
$pageInfo = array();
- if ( $title->exists() )
- {
+ if ( $title->exists() ) {
+ global $wgDisableCounters;
+
$pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
$pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] );
- $pageInfo['counter'] = intval( $this->pageCounter[$pageid] );
+ $pageInfo['counter'] = $wgDisableCounters
+ ? ""
+ : intval( $this->pageCounter[$pageid] );
$pageInfo['length'] = intval( $this->pageLength[$pageid] );
- if ( $this->pageIsRedir[$pageid] )
+
+ if ( $this->pageIsRedir[$pageid] ) {
$pageInfo['redirect'] = '';
- if ( $this->pageIsNew[$pageid] )
+ }
+ if ( $this->pageIsNew[$pageid] ) {
$pageInfo['new'] = '';
+ }
}
if ( !is_null( $this->params['token'] ) ) {
$tokenFunctions = $this->getTokenFunctions();
$pageInfo['starttimestamp'] = wfTimestamp( TS_ISO_8601, time() );
- foreach ( $this->params['token'] as $t )
- {
+ foreach ( $this->params['token'] as $t ) {
$val = call_user_func( $tokenFunctions[$t], $pageid, $title );
- if ( $val === false )
+ if ( $val === false ) {
$this->setWarning( "Action '$t' is not allowed for the current user" );
- else
+ } else {
$pageInfo[$t . 'token'] = $val;
+ }
}
}
if ( $this->fld_protection ) {
$pageInfo['protection'] = array();
- if ( isset( $this->protections[$title->getNamespace()][$title->getDBkey()] ) )
+ if ( isset( $this->protections[$title->getNamespace()][$title->getDBkey()] ) ) {
$pageInfo['protection'] =
$this->protections[$title->getNamespace()][$title->getDBkey()];
+ }
$this->getResult()->setIndexedTagName( $pageInfo['protection'], 'pr' );
}
- if ( $this->fld_watched && isset( $this->watched[$title->getNamespace()][$title->getDBkey()] ) )
+ if ( $this->fld_watched && isset( $this->watched[$title->getNamespace()][$title->getDBkey()] ) ) {
$pageInfo['watched'] = '';
-
- if ( $this->fld_talkid && isset( $this->talkids[$title->getNamespace()][$title->getDBkey()] ) )
+ }
+
+ if ( $this->fld_talkid && isset( $this->talkids[$title->getNamespace()][$title->getDBkey()] ) ) {
$pageInfo['talkid'] = $this->talkids[$title->getNamespace()][$title->getDBkey()];
+ }
- if ( $this->fld_subjectid && isset( $this->subjectids[$title->getNamespace()][$title->getDBkey()] ) )
+ if ( $this->fld_subjectid && isset( $this->subjectids[$title->getNamespace()][$title->getDBkey()] ) ) {
$pageInfo['subjectid'] = $this->subjectids[$title->getNamespace()][$title->getDBkey()];
+ }
if ( $this->fld_url ) {
$pageInfo['fullurl'] = $title->getFullURL();
$pageInfo['editurl'] = $title->getFullURL( 'action=edit' );
}
- if ( $this->fld_readable && $title->userCanRead() )
+ if ( $this->fld_readable && $title->userCanRead() ) {
$pageInfo['readable'] = '';
-
+ }
+
if ( $this->fld_preload ) {
- if ( $title->exists() )
+ if ( $title->exists() ) {
$pageInfo['preload'] = '';
- else {
+ } else {
+ $text = null;
wfRunHooks( 'EditFormPreloadText', array( &$text, &$title ) );
-
+
$pageInfo['preload'] = $text;
}
}
+
+ if ( $this->fld_displaytitle ) {
+ if ( isset( $this->displaytitles[$title->getArticleId()] ) ) {
+ $pageInfo['displaytitle'] = $this->displaytitles[$title->getArticleId()];
+ } else {
+ $pageInfo['displaytitle'] = $title->getPrefixedText();
+ }
+ }
+
return $pageInfo;
}
/**
* Get information about protections and put it in $protections
*/
- private function getProtectionInfo()
- {
+ private function getProtectionInfo() {
$this->protections = array();
$db = $this->getDB();
// Get normal protections for existing titles
- if ( count( $this->titles ) )
- {
+ if ( count( $this->titles ) ) {
$this->resetQueryParams();
$this->addTables( array( 'page_restrictions', 'page' ) );
$this->addWhere( 'page_id=pr_page' );
@@ -356,14 +400,15 @@ class ApiQueryInfo extends ApiQueryBase {
$this->addWhereFld( 'pr_page', array_keys( $this->titles ) );
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$a = array(
'type' => $row->pr_type,
'level' => $row->pr_level,
'expiry' => Block::decodeExpiry( $row->pr_expiry, TS_ISO_8601 )
);
- if ( $row->pr_cascade )
+ if ( $row->pr_cascade ) {
$a['cascade'] = '';
+ }
$this->protections[$row->page_namespace][$row->page_title][] = $a;
// Also check old restrictions
@@ -375,8 +420,9 @@ class ApiQueryInfo extends ApiQueryBase {
// old old format should be treated as edit/move restriction
$restriction = trim( $temp[0] );
- if ( $restriction == '' )
+ if ( $restriction == '' ) {
continue;
+ }
$this->protections[$row->page_namespace][$row->page_title][] = array(
'type' => 'edit',
'level' => $restriction,
@@ -389,8 +435,9 @@ class ApiQueryInfo extends ApiQueryBase {
);
} else {
$restriction = trim( $temp[1] );
- if ( $restriction == '' )
+ if ( $restriction == '' ) {
continue;
+ }
$this->protections[$row->page_namespace][$row->page_title][] = array(
'type' => $temp[0],
'level' => $restriction,
@@ -400,35 +447,34 @@ class ApiQueryInfo extends ApiQueryBase {
}
}
}
- $db->freeResult( $res );
}
// Get protections for missing titles
- if ( count( $this->missing ) )
- {
+ if ( count( $this->missing ) ) {
$this->resetQueryParams();
$lb = new LinkBatch( $this->missing );
$this->addTables( 'protected_titles' );
$this->addFields( array( 'pt_title', 'pt_namespace', 'pt_create_perm', 'pt_expiry' ) );
$this->addWhere( $lb->constructSet( 'pt', $db ) );
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$this->protections[$row->pt_namespace][$row->pt_title][] = array(
'type' => 'create',
'level' => $row->pt_create_perm,
'expiry' => Block::decodeExpiry( $row->pt_expiry, TS_ISO_8601 )
);
}
- $db->freeResult( $res );
}
// Cascading protections
$images = $others = array();
- foreach ( $this->everything as $title )
- if ( $title->getNamespace() == NS_FILE )
+ foreach ( $this->everything as $title ) {
+ if ( $title->getNamespace() == NS_FILE ) {
$images[] = $title->getDBkey();
- else
+ } else {
$others[] = $title;
+ }
+ }
if ( count( $others ) ) {
// Non-images: check templatelinks
@@ -444,7 +490,7 @@ class ApiQueryInfo extends ApiQueryBase {
$this->addWhereFld( 'pr_cascade', 1 );
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$source = Title::makeTitle( $row->page_namespace, $row->page_title );
$this->protections[$row->tl_namespace][$row->tl_title][] = array(
'type' => $row->pr_type,
@@ -453,7 +499,6 @@ class ApiQueryInfo extends ApiQueryBase {
'source' => $source->getPrefixedText()
);
}
- $db->freeResult( $res );
}
if ( count( $images ) ) {
@@ -468,7 +513,7 @@ class ApiQueryInfo extends ApiQueryBase {
$this->addWhereFld( 'il_to', $images );
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$source = Title::makeTitle( $row->page_namespace, $row->page_title );
$this->protections[NS_FILE][$row->il_to][] = array(
'type' => $row->pr_type,
@@ -477,30 +522,30 @@ class ApiQueryInfo extends ApiQueryBase {
'source' => $source->getPrefixedText()
);
}
- $db->freeResult( $res );
}
}
/**
* Get talk page IDs (if requested) and subject page IDs (if requested)
- * and put them in $talkids and $subjectids
+ * and put them in $talkids and $subjectids
*/
- private function getTSIDs()
- {
+ private function getTSIDs() {
$getTitles = $this->talkids = $this->subjectids = array();
- $db = $this->getDB();
- foreach ( $this->everything as $t )
- {
- if ( MWNamespace::isTalk( $t->getNamespace() ) )
- {
- if ( $this->fld_subjectid )
+
+ foreach ( $this->everything as $t ) {
+ if ( MWNamespace::isTalk( $t->getNamespace() ) ) {
+ if ( $this->fld_subjectid ) {
$getTitles[] = $t->getSubjectPage();
- }
- else if ( $this->fld_talkid )
+ }
+ } elseif ( $this->fld_talkid ) {
$getTitles[] = $t->getTalkPage();
+ }
}
- if ( !count( $getTitles ) )
+ if ( !count( $getTitles ) ) {
return;
+ }
+
+ $db = $this->getDB();
// Construct a custom WHERE clause that matches
// all titles in $getTitles
@@ -510,46 +555,65 @@ class ApiQueryInfo extends ApiQueryBase {
$this->addFields( array( 'page_title', 'page_namespace', 'page_id' ) );
$this->addWhere( $lb->constructSet( 'page', $db ) );
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) )
- {
- if ( MWNamespace::isTalk( $row->page_namespace ) )
+ foreach ( $res as $row ) {
+ if ( MWNamespace::isTalk( $row->page_namespace ) ) {
$this->talkids[MWNamespace::getSubject( $row->page_namespace )][$row->page_title] =
intval( $row->page_id );
- else
+ } else {
$this->subjectids[MWNamespace::getTalk( $row->page_namespace )][$row->page_title] =
intval( $row->page_id );
+ }
+ }
+ }
+
+ private function getDisplayTitle() {
+ $this->displaytitles = array();
+
+ $pageIds = array_keys( $this->titles );
+
+ if ( !count( $pageIds ) ) {
+ return;
+ }
+
+ $this->resetQueryParams();
+ $this->addTables( 'page_props' );
+ $this->addFields( array( 'pp_page', 'pp_value' ) );
+ $this->addWhereFld( 'pp_page', $pageIds );
+ $this->addWhereFld( 'pp_propname', 'displaytitle' );
+ $res = $this->select( __METHOD__ );
+
+ foreach ( $res as $row ) {
+ $this->displaytitles[$row->pp_page] = $row->pp_value;
}
}
/**
* Get information about watched status and put it in $this->watched
*/
- private function getWatchedInfo()
- {
+ private function getWatchedInfo() {
global $wgUser;
- if ( $wgUser->isAnon() || count( $this->titles ) == 0 )
+ if ( $wgUser->isAnon() || count( $this->everything ) == 0 ) {
return;
+ }
$this->watched = array();
$db = $this->getDB();
- $lb = new LinkBatch( $this->titles );
+ $lb = new LinkBatch( $this->everything );
$this->resetQueryParams();
- $this->addTables( array( 'page', 'watchlist' ) );
- $this->addFields( array( 'page_title', 'page_namespace' ) );
+ $this->addTables( array( 'watchlist' ) );
+ $this->addFields( array( 'wl_title', 'wl_namespace' ) );
$this->addWhere( array(
- $lb->constructSet( 'page', $db ),
- 'wl_namespace=page_namespace',
- 'wl_title=page_title',
+ $lb->constructSet( 'wl', $db ),
'wl_user' => $wgUser->getID()
) );
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
- $this->watched[$row->page_namespace][$row->page_title] = true;
+ foreach ( $res as $row ) {
+ $this->watched[$row->wl_namespace][$row->wl_title] = true;
}
}
@@ -560,6 +624,7 @@ class ApiQueryInfo extends ApiQueryBase {
'subjectid',
'url',
'preload',
+ 'displaytitle',
);
if ( !is_null( $params['prop'] ) ) {
foreach ( $params['prop'] as $prop ) {
@@ -575,33 +640,34 @@ class ApiQueryInfo extends ApiQueryBase {
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_DFLT => null,
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => null,
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'protection',
'talkid',
'watched', # private
'subjectid',
'url',
'readable', # private
- 'preload'
- // If you add more properties here, please consider whether they
+ 'preload',
+ 'displaytitle',
+ // If you add more properties here, please consider whether they
// need to be added to getCacheMode()
) ),
- 'token' => array (
- ApiBase :: PARAM_DFLT => null,
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array_keys( $this->getTokenFunctions() )
+ 'token' => array(
+ ApiBase::PARAM_DFLT => null,
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() )
),
'continue' => null,
);
}
public function getParamDescription() {
- return array (
- 'prop' => array (
+ return array(
+ 'prop' => array(
'Which additional properties to get:',
' protection - List the protection level of each page',
' talkid - The page ID of the talk page for each non-talk page',
@@ -609,7 +675,8 @@ class ApiQueryInfo extends ApiQueryBase {
' subjectid - The page ID of the parent page for each talk page',
' url - Gives a full URL to the page, and also an edit URL',
' readable - Whether the user can read this page',
- ' preload - Gives the text returned by EditFormPreloadText'
+ ' preload - Gives the text returned by EditFormPreloadText',
+ ' displaytitle - Gives the way the page title is actually displayed',
),
'token' => 'Request a token to perform a data-modifying action on a page',
'continue' => 'When more results are available, use this to continue',
@@ -619,7 +686,7 @@ class ApiQueryInfo extends ApiQueryBase {
public function getDescription() {
return 'Get basic page information such as namespace, title, last touched date, ...';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
@@ -627,13 +694,13 @@ class ApiQueryInfo extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&prop=info&titles=Main%20Page',
'api.php?action=query&prop=info&inprop=protection&titles=Main%20Page'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryInfo.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryInfo.php 78439 2010-12-15 14:23:46Z catrope $';
}
}
diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php
index 9330e380..c2ecbfee 100644
--- a/includes/api/ApiQueryLangLinks.php
+++ b/includes/api/ApiQueryLangLinks.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on May 13, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on May 13, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -36,15 +37,16 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryLangLinks extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'll' );
+ parent::__construct( $query, $moduleName, 'll' );
}
public function execute() {
- if ( $this->getPageSet()->getGoodTitleCount() == 0 )
+ if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
return;
+ }
$params = $this->extractRequestParams();
- $this->addFields( array (
+ $this->addFields( array(
'll_from',
'll_lang',
'll_title'
@@ -54,27 +56,30 @@ class ApiQueryLangLinks extends ApiQueryBase {
$this->addWhereFld( 'll_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
$llfrom = intval( $cont[0] );
$lllang = $this->getDB()->strencode( $cont[1] );
- $this->addWhere( "ll_from > $llfrom OR " .
- "(ll_from = $llfrom AND " .
- "ll_lang >= '$lllang')" );
+ $this->addWhere(
+ "ll_from > $llfrom OR " .
+ "(ll_from = $llfrom AND " .
+ "ll_lang >= '$lllang')"
+ );
}
// Don't order by ll_from if it's constant in the WHERE clause
- if ( count( $this->getPageSet()->getGoodTitles() ) == 1 )
+ if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
$this->addOption( 'ORDER BY', 'll_lang' );
- else
+ } else {
$this->addOption( 'ORDER BY', 'll_from, ll_lang' );
+ }
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$res = $this->select( __METHOD__ );
$count = 0;
- $db = $this->getDB();
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -82,15 +87,19 @@ class ApiQueryLangLinks extends ApiQueryBase {
break;
}
$entry = array( 'lang' => $row->ll_lang );
- ApiResult :: setContent( $entry, $row->ll_title );
+ if ( $params['url'] ) {
+ $title = Title::newFromText( "{$row->ll_lang}:{$row->ll_title}" );
+ if ( $title ) {
+ $entry['url'] = $title->getFullURL();
+ }
+ }
+ ApiResult::setContent( $entry, $row->ll_title );
$fit = $this->addPageSubItem( $row->ll_from, $entry );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', "{$row->ll_from}|{$row->ll_lang}" );
break;
}
}
- $db->freeResult( $res );
}
public function getCacheMode( $params ) {
@@ -99,28 +108,30 @@ class ApiQueryLangLinks extends ApiQueryBase {
public function getAllowedParams() {
return array(
- '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
- ),
- 'continue' => null,
+ '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
+ ),
+ 'continue' => null,
+ 'url' => false,
);
}
- public function getParamDescription () {
+ public function getParamDescription() {
return array(
'limit' => 'How many langlinks to return',
'continue' => 'When more results are available, use this to continue',
+ 'url' => 'Whether to get the full URL',
);
}
public function getDescription() {
return 'Returns all interlanguage links from the given page(s)';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
@@ -128,13 +139,13 @@ class ApiQueryLangLinks extends ApiQueryBase {
}
protected function getExamples() {
- return array (
- "Get interlanguage links from the [[Main Page]]:",
- " api.php?action=query&prop=langlinks&titles=Main%20Page&redirects",
- );
+ return array(
+ 'Get interlanguage links from the [[Main Page]]:',
+ ' api.php?action=query&prop=langlinks&titles=Main%20Page&redirects=',
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryLangLinks.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryLangLinks.php 77660 2010-12-03 14:44:07Z catrope $';
}
}
diff --git a/includes/api/ApiQueryLinks.php b/includes/api/ApiQueryLinks.php
index 52dfd591..4f3bad3b 100644
--- a/includes/api/ApiQueryLinks.php
+++ b/includes/api/ApiQueryLinks.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on May 12, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on May 12, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiQueryBase.php" );
+ require_once( "ApiQueryBase.php" );
}
/**
@@ -41,23 +42,24 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
private $table, $prefix, $description;
public function __construct( $query, $moduleName ) {
-
switch ( $moduleName ) {
- case self::LINKS :
+ case self::LINKS:
$this->table = 'pagelinks';
$this->prefix = 'pl';
$this->description = 'link';
+ $this->titlesParam = 'titles';
break;
- case self::TEMPLATES :
+ case self::TEMPLATES:
$this->table = 'templatelinks';
$this->prefix = 'tl';
$this->description = 'template';
+ $this->titlesParam = 'templates';
break;
- default :
- ApiBase :: dieDebug( __METHOD__, 'Unknown module name' );
+ default:
+ ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
}
- parent :: __construct( $query, $moduleName, $this->prefix );
+ parent::__construct( $query, $moduleName, $this->prefix );
}
public function execute() {
@@ -73,13 +75,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
-
- if ( $this->getPageSet()->getGoodTitleCount() == 0 )
+ if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
return; // nothing to do
+ }
$params = $this->extractRequestParams();
- $this->addFields( array (
+ $this->addFields( array(
$this->prefix . '_from AS pl_from',
$this->prefix . '_namespace AS pl_namespace',
$this->prefix . '_title AS pl_title'
@@ -89,19 +91,38 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
$this->addWhereFld( $this->prefix . '_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
$this->addWhereFld( $this->prefix . '_namespace', $params['namespace'] );
+ if ( !is_null( $params[$this->titlesParam] ) ) {
+ $lb = new LinkBatch;
+ foreach ( $params[$this->titlesParam] as $t ) {
+ $title = Title::newFromText( $t );
+ if ( !$title ) {
+ $this->setWarning( "``$t'' is not a valid title" );
+ } else {
+ $lb->addObj( $title );
+ }
+ }
+ $cond = $lb->constructSet( $this->prefix, $this->getDB() );
+ if ( $cond ) {
+ $this->addWhere( $cond );
+ }
+ }
+
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 )
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 3 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
$plfrom = intval( $cont[0] );
$plns = intval( $cont[1] );
$pltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
- $this->addWhere( "{$this->prefix}_from > $plfrom OR " .
- "({$this->prefix}_from = $plfrom AND " .
- "({$this->prefix}_namespace > $plns OR " .
- "({$this->prefix}_namespace = $plns AND " .
- "{$this->prefix}_title >= '$pltitle')))" );
+ $this->addWhere(
+ "{$this->prefix}_from > $plfrom OR " .
+ "({$this->prefix}_from = $plfrom AND " .
+ "({$this->prefix}_namespace > $plns OR " .
+ "({$this->prefix}_namespace = $plns AND " .
+ "{$this->prefix}_title >= '$pltitle')))"
+ );
}
// Here's some MySQL craziness going on: if you use WHERE foo='bar'
@@ -110,22 +131,23 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
// already. To work around this, we drop constant fields in the WHERE
// clause from the ORDER BY clause
$order = array();
- if ( count( $this->getPageSet()->getGoodTitles() ) != 1 )
+ if ( count( $this->getPageSet()->getGoodTitles() ) != 1 ) {
$order[] = "{$this->prefix}_from";
- if ( count( $params['namespace'] ) != 1 )
+ }
+ if ( count( $params['namespace'] ) != 1 ) {
$order[] = "{$this->prefix}_namespace";
+ }
$order[] = "{$this->prefix}_title";
- $this->addOption( 'ORDER BY', implode( ", ", $order ) );
+ $this->addOption( 'ORDER BY', implode( ', ', $order ) );
$this->addOption( 'USE INDEX', "{$this->prefix}_from" );
$this->addOption( 'LIMIT', $params['limit'] + 1 );
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
if ( is_null( $resultPageSet ) ) {
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -135,10 +157,9 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
break;
}
$vals = array();
- ApiQueryBase :: addTitleInfo( $vals, Title :: makeTitle( $row->pl_namespace, $row->pl_title ) );
+ ApiQueryBase::addTitleInfo( $vals, Title::makeTitle( $row->pl_namespace, $row->pl_title ) );
$fit = $this->addPageSubItem( $row->pl_from, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue',
"{$row->pl_from}|{$row->pl_namespace}|" .
$this->keyToTitle( $row->pl_title ) );
@@ -148,7 +169,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
} else {
$titles = array();
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
@@ -157,39 +178,45 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
$this->keyToTitle( $row->pl_title ) );
break;
}
- $titles[] = Title :: makeTitle( $row->pl_namespace, $row->pl_title );
+ $titles[] = Title::makeTitle( $row->pl_namespace, $row->pl_title );
}
$resultPageSet->populateFromTitles( $titles );
}
-
- $db->freeResult( $res );
}
- public function getAllowedParams()
- {
+ public function getAllowedParams() {
return array(
- 'namespace' => array(
- ApiBase :: PARAM_TYPE => 'namespace',
- ApiBase :: PARAM_ISMULTI => true
- ),
- '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
- ),
- 'continue' => null,
- );
+ 'namespace' => array(
+ ApiBase::PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_ISMULTI => true
+ ),
+ '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
+ ),
+ 'continue' => null,
+ $this->titlesParam => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ );
}
- public function getParamDescription()
- {
- return array(
- 'namespace' => "Show {$this->description}s in this namespace(s) only",
- 'limit' => "How many {$this->description}s to return",
- 'continue' => 'When more results are available, use this to continue',
+ public function getParamDescription() {
+ $desc = $this->description;
+ $arr = array(
+ 'namespace' => "Show {$desc}s in this namespace(s) only",
+ 'limit' => "How many {$desc}s to return",
+ 'continue' => 'When more results are available, use this to continue',
);
+ if ( $this->getModuleName() == self::LINKS ) {
+ $arr[$this->titlesParam] = 'Only list links to these titles. Useful for checking whether a certain page links to a certain title.';
+ } else if ( $this->getModuleName() == self::TEMPLATES ) {
+ $arr[$this->titlesParam] = 'Only list these templates. Useful for checking whether a certain page uses a certain template.';
+ }
+ return $arr;
}
public function getDescription() {
@@ -197,17 +224,17 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
- "Get {$this->description}s from the [[Main Page]]:",
- " api.php?action=query&prop={$this->getModuleName()}&titles=Main%20Page",
- "Get information about the {$this->description} pages in the [[Main Page]]:",
- " api.php?action=query&generator={$this->getModuleName()}&titles=Main%20Page&prop=info",
- "Get {$this->description}s from the Main Page in the User and Template namespaces:",
- " api.php?action=query&prop={$this->getModuleName()}&titles=Main%20Page&{$this->prefix}namespace=2|10"
- );
+ return array(
+ "Get {$this->description}s from the [[Main Page]]:",
+ " api.php?action=query&prop={$this->getModuleName()}&titles=Main%20Page",
+ "Get information about the {$this->description} pages in the [[Main Page]]:",
+ " api.php?action=query&generator={$this->getModuleName()}&titles=Main%20Page&prop=info",
+ "Get {$this->description}s from the Main Page in the User and Template namespaces:",
+ " api.php?action=query&prop={$this->getModuleName()}&titles=Main%20Page&{$this->prefix}namespace=2|10"
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryLinks.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryLinks.php 70647 2010-08-07 19:59:42Z ialex $';
}
}
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
index bdeee952..7d69ca39 100644
--- a/includes/api/ApiQueryLogEvents.php
+++ b/includes/api/ApiQueryLogEvents.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 16, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 16, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,30 +37,36 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryLogEvents extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'le' );
+ parent::__construct( $query, $moduleName, 'le' );
}
+ private $fld_ids = false, $fld_title = false, $fld_type = false,
+ $fld_action = false, $fld_user = false, $fld_userid = false,
+ $fld_timestamp = false, $fld_comment = false, $fld_parsedcomment = false,
+ $fld_details = false, $fld_tags = false;
+
public function execute() {
$params = $this->extractRequestParams();
$db = $this->getDB();
-
+
$prop = array_flip( $params['prop'] );
-
+
$this->fld_ids = isset( $prop['ids'] );
$this->fld_title = isset( $prop['title'] );
$this->fld_type = isset( $prop['type'] );
+ $this->fld_action = isset ( $prop['action'] );
$this->fld_user = isset( $prop['user'] );
+ $this->fld_userid = isset( $prop['userid'] );
$this->fld_timestamp = isset( $prop['timestamp'] );
$this->fld_comment = isset( $prop['comment'] );
$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
$this->fld_details = isset( $prop['details'] );
$this->fld_tags = isset( $prop['tags'] );
- list( $tbl_logging, $tbl_page, $tbl_user ) = $db->tableNamesN( 'logging', 'page', 'user' );
-
$hideLogs = LogEventsList::getExcludeClause( $db );
- if ( $hideLogs !== false )
+ if ( $hideLogs !== false ) {
$this->addWhere( $hideLogs );
+ }
// Order is significant here
$this->addTables( array( 'logging', 'user', 'page' ) );
@@ -72,7 +79,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
'log_title=page_title' ) ) ) );
$index = array( 'logging' => 'times' ); // default, may change
- $this->addFields( array (
+ $this->addFields( array(
'log_type',
'log_action',
'log_timestamp',
@@ -83,30 +90,36 @@ class ApiQueryLogEvents extends ApiQueryBase {
$this->addFieldsIf( 'page_id', $this->fld_ids );
$this->addFieldsIf( 'log_user', $this->fld_user );
$this->addFieldsIf( 'user_name', $this->fld_user );
- $this->addFieldsIf( 'log_namespace', $this->fld_title );
- $this->addFieldsIf( 'log_title', $this->fld_title );
+ $this->addFieldsIf( 'user_id', $this->fld_userid );
+ $this->addFieldsIf( 'log_namespace', $this->fld_title || $this->fld_parsedcomment );
+ $this->addFieldsIf( 'log_title', $this->fld_title || $this->fld_parsedcomment );
$this->addFieldsIf( 'log_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'log_params', $this->fld_details );
-
+
if ( $this->fld_tags ) {
$this->addTables( 'tag_summary' );
$this->addJoinConds( array( 'tag_summary' => array( 'LEFT JOIN', 'log_id=ts_log_id' ) ) );
$this->addFields( 'ts_tags' );
}
-
+
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'log_id=ct_log_id' ) ) ) );
$this->addWhereFld( 'ct_tag', $params['tag'] );
global $wgOldChangeTagsIndex;
- $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+ $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
}
-
- if ( !is_null( $params['type'] ) ) {
+
+ if ( !is_null( $params['action'] ) ) {
+ list( $type, $action ) = explode( '/', $params['action'] );
+ $this->addWhereFld( 'log_type', $type );
+ $this->addWhereFld( 'log_action', $action );
+ }
+ else if ( !is_null( $params['type'] ) ) {
$this->addWhereFld( 'log_type', $params['type'] );
$index['logging'] = 'type_time';
}
-
+
$this->addWhereRange( 'log_timestamp', $params['dir'], $params['start'], $params['end'] );
$limit = $params['limit'];
@@ -115,17 +128,19 @@ class ApiQueryLogEvents extends ApiQueryBase {
$user = $params['user'];
if ( !is_null( $user ) ) {
$userid = User::idFromName( $user );
- if ( !$userid )
+ if ( !$userid ) {
$this->dieUsage( "User name $user not found", 'param_user' );
+ }
$this->addWhereFld( 'log_user', $userid );
$index['logging'] = 'user_time';
}
$title = $params['title'];
if ( !is_null( $title ) ) {
- $titleObj = Title :: newFromText( $title );
- if ( is_null( $titleObj ) )
+ $titleObj = Title::newFromText( $title );
+ if ( is_null( $titleObj ) ) {
$this->dieUsage( "Bad title value '$title'", 'param_title' );
+ }
$this->addWhereFld( 'log_namespace', $titleObj->getNamespace() );
$this->addWhereFld( 'log_title', $titleObj->getDBkey() );
@@ -145,7 +160,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
$count = 0;
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ 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...
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->log_timestamp ) );
@@ -153,33 +168,40 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
$vals = $this->extractRowInfo( $row );
- if ( !$vals )
+ if ( !$vals ) {
continue;
+ }
$fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->log_timestamp ) );
break;
}
}
- $db->freeResult( $res );
-
$this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'item' );
}
-
+
+ /**
+ * @static
+ * @param $result ApiResult
+ * @param $vals
+ * @param $params
+ * @param $type
+ * @param $ts
+ * @return array
+ */
public static function addLogParams( $result, &$vals, $params, $type, $ts ) {
$params = explode( "\n", $params );
switch ( $type ) {
case 'move':
- if ( isset ( $params[0] ) ) {
- $title = Title :: newFromText( $params[0] );
+ if ( isset( $params[0] ) ) {
+ $title = Title::newFromText( $params[0] );
if ( $title ) {
$vals2 = array();
- ApiQueryBase :: addTitleInfo( $vals2, $title, "new_" );
+ ApiQueryBase::addTitleInfo( $vals2, $title, 'new_' );
$vals[$type] = $vals2;
}
}
- if ( isset ( $params[1] ) && $params[1] ) {
+ if ( isset( $params[1] ) && $params[1] ) {
$vals[$type]['suppressedredirect'] = '';
}
$params = null;
@@ -199,8 +221,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
case 'block':
$vals2 = array();
list( $vals2['duration'], $vals2['flags'] ) = $params;
- $vals2['expiry'] = wfTimestamp( TS_ISO_8601,
+
+ // Indefinite blocks have no expiry time
+ if ( Block::parseExpiryInput( $params[0] ) !== Block::infinity() ) {
+ $vals2['expiry'] = wfTimestamp( TS_ISO_8601,
strtotime( $params[0], wfTimestamp( TS_UNIX, $ts ) ) );
+ }
$vals[$type] = $vals2;
$params = null;
break;
@@ -220,7 +246,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
$vals['pageid'] = intval( $row->page_id );
}
- $title = Title::makeTitle( $row->log_namespace, $row->log_title );
+ if ( $this->fld_title || $this->fld_parsedcomment ) {
+ $title = Title::makeTitle( $row->log_namespace, $row->log_title );
+ }
if ( $this->fld_title ) {
if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
@@ -230,7 +258,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
}
- if ( $this->fld_type ) {
+ if ( $this->fld_type || $this->fld_action ) {
$vals['type'] = $row->log_type;
$vals['action'] = $row->log_action;
}
@@ -239,32 +267,42 @@ class ApiQueryLogEvents extends ApiQueryBase {
if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
$vals['actionhidden'] = '';
} else {
- self::addLogParams( $this->getResult(), $vals,
+ self::addLogParams(
+ $this->getResult(), $vals,
$row->log_params, $row->log_type,
- $row->log_timestamp );
+ $row->log_timestamp
+ );
}
}
- if ( $this->fld_user ) {
+ if ( $this->fld_user || $this->fld_userid ) {
if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
$vals['userhidden'] = '';
} else {
- $vals['user'] = $row->user_name;
- if ( !$row->log_user )
+ if ( $this->fld_user ) {
+ $vals['user'] = $row->user_name;
+ }
+ if ( $this->fld_userid ) {
+ $vals['userid'] = $row->user_id;
+ }
+
+ if ( !$row->log_user ) {
$vals['anon'] = '';
+ }
}
}
if ( $this->fld_timestamp ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->log_timestamp );
}
-
+
if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->log_comment ) ) {
if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
$vals['commenthidden'] = '';
} else {
- if ( $this->fld_comment )
+ if ( $this->fld_comment ) {
$vals['comment'] = $row->log_comment;
-
+ }
+
if ( $this->fld_parsedcomment ) {
global $wgUser;
$vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->log_comment, $title );
@@ -281,10 +319,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
$vals['tags'] = array();
}
}
-
+
return $vals;
}
-
+
public function getCacheMode( $params ) {
if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
// formatComment() calls wfMsg() among other things
@@ -295,16 +333,17 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
public function getAllowedParams() {
- global $wgLogTypes;
- return array (
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'ids|title|type|user|timestamp|comment|details',
- ApiBase :: PARAM_TYPE => array (
+ global $wgLogTypes, $wgLogActions;
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'ids|title|type|user|timestamp|comment|details',
+ ApiBase::PARAM_TYPE => array(
'ids',
'title',
'type',
'user',
+ 'userid',
'timestamp',
'comment',
'parsedcomment',
@@ -312,18 +351,21 @@ class ApiQueryLogEvents extends ApiQueryBase {
'tags'
)
),
- 'type' => array (
- ApiBase :: PARAM_TYPE => $wgLogTypes
+ 'type' => array(
+ ApiBase::PARAM_TYPE => $wgLogTypes
+ ),
+ 'action' => array(
+ ApiBase::PARAM_TYPE => array_keys( $wgLogActions )
),
- 'start' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'start' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'end' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'end' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'dir' => array (
- ApiBase :: PARAM_DFLT => 'older',
- ApiBase :: PARAM_TYPE => array (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'older',
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
)
@@ -331,34 +373,47 @@ class ApiQueryLogEvents extends ApiQueryBase {
'user' => null,
'title' => null,
'tag' => null,
- '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
+ '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
)
);
}
public function getParamDescription() {
- return array (
- 'prop' => 'Which properties to get',
+ return array(
+ 'prop' => array(
+ 'Which properties to get',
+ ' ids - Adds the id of the log event',
+ ' title - Adds the title of the page for the log event',
+ ' type - Adds the type of log event',
+ ' user - Adds the user responsible for the log event',
+ ' userid - Adds the user id who was responsible for the log event',
+ ' timestamp - Adds the timestamp for the event',
+ ' comment - Adds the comment of the event',
+ ' parsedcomment - Adds the parsed comment of the event',
+ ' details - Lists addtional details about the event',
+ ' tags - Lists tags for the event',
+ ),
'type' => 'Filter log entries to only this type(s)',
- 'start' => 'The timestamp to start enumerating from.',
- 'end' => 'The timestamp to end enumerating.',
- 'dir' => 'In which direction to enumerate.',
- 'user' => 'Filter entries to those made by the given user.',
- 'title' => 'Filter entries to those related to a page.',
- 'limit' => 'How many total event entries to return.',
- 'tag' => 'Only list event entries tagged with this tag.',
+ 'action' => "Filter log actions to only this type. Overrides {$this->getModulePrefix()}type",
+ 'start' => 'The timestamp to start enumerating from',
+ 'end' => 'The timestamp to end enumerating',
+ 'dir' => 'In which direction to enumerate',
+ 'user' => 'Filter entries to those made by the given user',
+ 'title' => 'Filter entries to those related to a page',
+ 'limit' => 'How many total event entries to return',
+ 'tag' => 'Only list event entries tagged with this tag',
);
}
public function getDescription() {
- return 'Get events from logs.';
+ return 'Get events from logs';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'param_user', 'info' => 'User name $user not found' ),
@@ -367,12 +422,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=logevents'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryLogEvents.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryLogEvents.php 74535 2010-10-09 00:01:45Z reedy $';
}
}
diff --git a/includes/api/ApiQueryPageProps.php b/includes/api/ApiQueryPageProps.php
new file mode 100644
index 00000000..894e812d
--- /dev/null
+++ b/includes/api/ApiQueryPageProps.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * API for MediaWiki 1.8+
+ *
+ * Created on Aug 7, 2010
+ *
+ * Copyright © 2010 soxred93, Bryan Tong Minh
+ *
+ * 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
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ // Eclipse helper - will be ignored in production
+ require_once( 'ApiQueryBase.php' );
+}
+
+/**
+ * A query module to show basic page information.
+ *
+ * @ingroup API
+ */
+class ApiQueryPageProps extends ApiQueryBase {
+
+ private $params;
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'pp' );
+ }
+
+ public function execute() {
+ $this->params = $this->extractRequestParams();
+
+ # Only operate on existing pages
+ $pages = $this->getPageSet()->getGoodTitles();
+ if ( !count( $pages ) ) {
+ # Nothing to do
+ return;
+ }
+
+ $this->addTables( 'page_props' );
+ $this->addFields( array( 'pp_page', 'pp_propname', 'pp_value' ) );
+ $this->addWhereFld( 'pp_page', array_keys( $pages ) );
+
+ if ( $this->params['continue'] ) {
+ $this->addWhere( 'pp_page >=' . intval( $this->params['continue'] ) );
+ }
+
+ # Force a sort order to ensure that properties are grouped by page
+ $this->addOption( 'ORDER BY', 'pp_page' );
+
+ $res = $this->select( __METHOD__ );
+ $currentPage = 0; # Id of the page currently processed
+ $props = array();
+ $result = $this->getResult();
+
+ foreach ( $res as $row ) {
+ if ( $currentPage != $row->pp_page ) {
+ # Different page than previous row, so add the properties to
+ # the result and save the new page id
+
+ if ( $currentPage ) {
+ if ( !$this->addPageProps( $result, $currentPage, $props ) ) {
+ # addPageProps() indicated that the result did not fit
+ # so stop adding data. Reset props so that it doesn't
+ # get added again after loop exit
+
+ $props = array();
+ break;
+ }
+
+ $props = array();
+ }
+
+ $currentPage = $row->pp_page;
+ }
+
+ $props[$row->pp_propname] = $row->pp_value;
+ }
+
+ if ( count( $props ) ) {
+ # Add any remaining properties to the results
+ $this->addPageProps( $result, $currentPage, $props );
+ }
+ }
+
+ /**
+ * Add page properties to an ApiResult, adding a continue
+ * parameter if it doesn't fit.
+ *
+ * @param $result ApiResult
+ * @param $page int
+ * @param $props array
+ * @return bool True if it fits in the result
+ */
+ private function addPageProps( $result, $page, $props ) {
+ $fit = $result->addValue( array( 'query', 'pages', $page ), 'pageprops', $props );
+
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', $page );
+ }
+ return $fit;
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function getAllowedParams() {
+ return array( 'continue' => null );
+ }
+
+ public function getParamDescription() {
+ return array( 'continue' => 'When more results are available, use this to continue' );
+ }
+
+ public function getDescription() {
+ return 'Get various properties defined in the page content';
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+ ) );
+ }
+
+ protected function getExamples() {
+ return array(
+ 'api.php?action=query&prop=pageprops&titles=Category:Foo',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryPageProps.php 85211 2011-04-02 21:01:00Z demon $';
+ }
+}
diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php
index ab794805..e647c39f 100644
--- a/includes/api/ApiQueryProtectedTitles.php
+++ b/includes/api/ApiQueryProtectedTitles.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Feb 13, 2009
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Feb 13, 2009
+ *
+ * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'pt' );
+ parent::__construct( $query, $moduleName, 'pt' );
}
public function execute() {
@@ -48,14 +49,13 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
- $db = $this->getDB();
$params = $this->extractRequestParams();
$this->addTables( 'protected_titles' );
$this->addFields( array( 'pt_namespace', 'pt_title', 'pt_timestamp' ) );
$prop = array_flip( $params['prop'] );
- $this->addFieldsIf( 'pt_user', isset( $prop['user'] ) );
+ $this->addFieldsIf( 'pt_user', isset( $prop['user'] ) || isset( $prop['userid'] ) );
$this->addFieldsIf( 'pt_reason', isset( $prop['comment'] ) || isset( $prop['parsedcomment'] ) );
$this->addFieldsIf( 'pt_expiry', isset( $prop['expiry'] ) );
$this->addFieldsIf( 'pt_create_perm', isset( $prop['level'] ) );
@@ -63,9 +63,8 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
$this->addWhereRange( 'pt_timestamp', $params['dir'], $params['start'], $params['end'] );
$this->addWhereFld( 'pt_namespace', $params['namespace'] );
$this->addWhereFld( 'pt_create_perm', $params['level'] );
-
- if ( isset( $prop['user'] ) )
- {
+
+ if ( isset( $prop['user'] ) ) {
$this->addTables( 'user' );
$this->addFields( 'user_name' );
$this->addJoinConds( array( 'user' => array( 'LEFT JOIN',
@@ -78,7 +77,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
$count = 0;
$result = $this->getResult();
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++ $count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->pt_timestamp ) );
@@ -89,26 +88,35 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
if ( is_null( $resultPageSet ) ) {
$vals = array();
ApiQueryBase::addTitleInfo( $vals, $title );
- if ( isset( $prop['timestamp'] ) )
+ if ( isset( $prop['timestamp'] ) ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->pt_timestamp );
-
- if ( isset( $prop['user'] ) && !is_null( $row->user_name ) )
+ }
+
+ if ( isset( $prop['user'] ) && !is_null( $row->user_name ) ) {
$vals['user'] = $row->user_name;
-
- if ( isset( $prop['comment'] ) )
+ }
+
+ if ( isset( $prop['user'] ) ) {
+ $vals['userid'] = $row->pt_user;
+ }
+
+ if ( isset( $prop['comment'] ) ) {
$vals['comment'] = $row->pt_reason;
-
+ }
+
if ( isset( $prop['parsedcomment'] ) ) {
global $wgUser;
$vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->pt_reason, $title );
}
-
- if ( isset( $prop['expiry'] ) )
+
+ if ( isset( $prop['expiry'] ) ) {
$vals['expiry'] = Block::decodeExpiry( $row->pt_expiry, TS_ISO_8601 );
-
- if ( isset( $prop['level'] ) )
+ }
+
+ if ( isset( $prop['level'] ) ) {
$vals['level'] = $row->pt_create_perm;
-
+ }
+
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
if ( !$fit ) {
$this->setContinueEnumParameter( 'start',
@@ -119,11 +127,12 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
$titles[] = $title;
}
}
- $db->freeResult( $res );
- if ( is_null( $resultPageSet ) )
+
+ if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $this->getModulePrefix() );
- else
+ } else {
$resultPageSet->populateFromTitles( $titles );
+ }
}
public function getCacheMode( $params ) {
@@ -137,41 +146,42 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
public function getAllowedParams() {
global $wgRestrictionLevels;
- return array (
- 'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace',
+ return array(
+ 'namespace' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace',
),
'level' => array(
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
),
'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
+ 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 => 'older',
- ApiBase :: PARAM_TYPE => array (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'older',
+ ApiBase::PARAM_TYPE => array(
'older',
'newer'
)
),
'start' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'end' => array(
- ApiBase :: PARAM_TYPE => 'timestamp'
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'prop' => array(
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'timestamp|level',
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'timestamp|level',
+ ApiBase::PARAM_TYPE => array(
'timestamp',
'user',
+ 'userid',
'comment',
'parsedcomment',
'expiry',
@@ -182,13 +192,22 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
}
public function getParamDescription() {
- return array (
+ return array(
'namespace' => 'Only list titles in these namespaces',
'start' => 'Start listing at this protection timestamp',
'end' => 'Stop listing at this protection timestamp',
'dir' => 'The direction in which to list',
- 'limit' => 'How many total pages to return.',
- 'prop' => 'Which properties to get',
+ 'limit' => 'How many total pages to return',
+ 'prop' => array(
+ 'Which properties to get',
+ ' timestamp - Adds the timestamp of when protection was added',
+ ' user - Adds the user to add the protection',
+ ' userid - Adds the user id to add the protection',
+ ' comment - Adds the comment for the protection',
+ ' parsedcomment - Adds the parsed comment for the protection',
+ ' expiry - Adds the timestamp of when the protection will be lifted',
+ ' level - Adds the protection level',
+ ),
'level' => 'Only list titles with these protection levels',
);
}
@@ -198,12 +217,12 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=protectedtitles',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryProtectedTitles.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryProtectedTitles.php 71838 2010-08-28 01:18:18Z reedy $';
}
}
diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php
index 10796810..b3b840fd 100644
--- a/includes/api/ApiQueryRandom.php
+++ b/includes/api/ApiQueryRandom.php
@@ -1,11 +1,11 @@
<?php
-/*
- * Created on Monday, January 28, 2008
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Brent Garber
+ * Created on Monday, January 28, 2008
+ *
+ * Copyright © 2008 Brent Garber
*
* 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
@@ -19,13 +19,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,7 +39,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryRandom extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'rn' );
+ parent::__construct( $query, $moduleName, 'rn' );
}
public function execute() {
@@ -56,38 +58,37 @@ if ( !defined( 'MEDIAWIKI' ) ) {
$this->addWhereRange( 'page_random', 'newer', $randstr, null );
$this->addWhereFld( 'page_is_redirect', $redirect );
$this->addOption( 'USE INDEX', 'page_random' );
- if ( is_null( $resultPageSet ) )
+ if ( is_null( $resultPageSet ) ) {
$this->addFields( array( 'page_id', 'page_title', 'page_namespace' ) );
- else
+ } else {
$this->addFields( $resultPageSet->getPageTableFields() );
+ }
}
protected function runQuery( &$resultPageSet ) {
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
$count = 0;
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$count++;
- if ( is_null( $resultPageSet ) )
- {
+ if ( is_null( $resultPageSet ) ) {
// Prevent duplicates
- if ( !in_array( $row->page_id, $this->pageIDs ) )
- {
+ if ( !in_array( $row->page_id, $this->pageIDs ) ) {
$fit = $this->getResult()->addValue(
array( 'query', $this->getModuleName() ),
null, $this->extractRowInfo( $row ) );
- if ( !$fit )
+ if ( !$fit ) {
// We can't really query-continue a random list.
// Return an insanely high value so
// $count < $limit is false
return 1E9;
+ }
$this->pageIDs[] = $row->page_id;
}
- }
- else
+ } else {
$resultPageSet->processDbRow( $row );
+ }
}
- $db->freeResult( $res );
+
return $count;
}
@@ -95,17 +96,16 @@ if ( !defined( 'MEDIAWIKI' ) ) {
$params = $this->extractRequestParams();
$result = $this->getResult();
$this->pageIDs = array();
-
+
$this->prepareQuery( wfRandom(), $params['limit'], $params['namespace'], $resultPageSet, $params['redirect'] );
$count = $this->runQuery( $resultPageSet );
- if ( $count < $params['limit'] )
- {
+ if ( $count < $params['limit'] ) {
/* We got too few pages, we probably picked a high value
* for page_random. We'll just take the lowest ones, see
* also the comment in Title::getRandomTitle()
*/
- $this->prepareQuery( 0, $params['limit'] - $count, $params['namespace'], $resultPageSet, $params['redirect'] );
- $this->runQuery( $resultPageSet );
+ $this->prepareQuery( 0, $params['limit'] - $count, $params['namespace'], $resultPageSet, $params['redirect'] );
+ $this->runQuery( $resultPageSet );
}
if ( is_null( $resultPageSet ) ) {
@@ -126,24 +126,24 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
public function getAllowedParams() {
- return array (
+ return array(
'namespace' => array(
- ApiBase :: PARAM_TYPE => 'namespace',
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_ISMULTI => true
),
- 'limit' => array (
- ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_DFLT => 1,
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => 10,
- ApiBase :: PARAM_MAX2 => 20
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 1,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => 10,
+ ApiBase::PARAM_MAX2 => 20
),
'redirect' => false,
);
}
public function getParamDescription() {
- return array (
+ return array(
'namespace' => 'Return pages in these namespaces only',
'limit' => 'Limit how many random pages will be returned',
'redirect' => 'Load a random redirect instead of a random page'
@@ -151,10 +151,11 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
public function getDescription() {
- return array( 'Get a set of random pages',
- 'NOTE: Pages are listed in a fixed sequence, only the starting point is random. This means that if, for example, "Main Page" is the first ',
- ' random page on your list, "List of fictional monkeys" will *always* be second, "List of people on stamps of Vanuatu" third, etc.',
- 'NOTE: If the number of pages in the namespace is lower than rnlimit, you will get fewer pages. You will not get the same page twice.'
+ return array(
+ 'Get a set of random pages',
+ 'NOTE: Pages are listed in a fixed sequence, only the starting point is random. This means that if, for example, "Main Page" is the first ',
+ ' random page on your list, "List of fictional monkeys" will *always* be second, "List of people on stamps of Vanuatu" third, etc',
+ 'NOTE: If the number of pages in the namespace is lower than rnlimit, you will get fewer pages. You will not get the same page twice'
);
}
diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php
index 1f0de3be..fb0d42b8 100644
--- a/includes/api/ApiQueryRecentChanges.php
+++ b/includes/api/ApiQueryRecentChanges.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 19, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 19, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,12 +38,15 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryRecentChanges extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'rc' );
+ parent::__construct( $query, $moduleName, 'rc' );
}
- private $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_flags = false,
- $fld_timestamp = false, $fld_title = false, $fld_ids = false,
- $fld_sizes = false;
+ private $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
+ $fld_flags = false, $fld_timestamp = false, $fld_title = false, $fld_ids = false,
+ $fld_sizes = false, $fld_redirect = false, $fld_patrolled = false, $fld_loginfo = false, $fld_tags = false;
+
+ private $tokenFunctions;
+
/**
* Get an array mapping token names to their handler functions.
* The prototype for a token function is func($pageid, $title, $rc)
@@ -51,12 +55,14 @@ class ApiQueryRecentChanges extends ApiQueryBase {
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
- if ( isset( $this->tokenFunctions ) )
+ if ( isset( $this->tokenFunctions ) ) {
return $this->tokenFunctions;
+ }
// If we're in JSON callback mode, no tokens can be obtained
- if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) )
+ if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) {
return array();
+ }
$this->tokenFunctions = array(
'patrol' => array( 'ApiQueryRecentChanges', 'getPatrolToken' )
@@ -64,36 +70,38 @@ class ApiQueryRecentChanges extends ApiQueryBase {
wfRunHooks( 'APIQueryRecentChangesTokens', array( &$this->tokenFunctions ) );
return $this->tokenFunctions;
}
-
- public static function getPatrolToken( $pageid, $title, $rc )
- {
+
+ public static function getPatrolToken( $pageid, $title, $rc ) {
global $wgUser;
if ( !$wgUser->useRCPatrol() && ( !$wgUser->useNPPatrol() ||
- $rc->getAttribute( 'rc_type' ) != RC_NEW ) )
+ $rc->getAttribute( 'rc_type' ) != RC_NEW ) )
+ {
return false;
-
+ }
+
// The patrol token is always the same, let's exploit that
static $cachedPatrolToken = null;
- if ( !is_null( $cachedPatrolToken ) )
- return $cachedPatrolToken;
-
- $cachedPatrolToken = $wgUser->editToken();
+ if ( is_null( $cachedPatrolToken ) ) {
+ $cachedPatrolToken = $wgUser->editToken( 'patrol' );
+ }
+
return $cachedPatrolToken;
}
/**
* Sets internal state to include the desired properties in the output.
- * @param $prop associative array of properties, only keys are used here
+ * @param $prop Array associative array of properties, only keys are used here
*/
public function initProperties( $prop ) {
- $this->fld_comment = isset ( $prop['comment'] );
- $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
- $this->fld_user = isset ( $prop['user'] );
- $this->fld_flags = isset ( $prop['flags'] );
- $this->fld_timestamp = isset ( $prop['timestamp'] );
- $this->fld_title = isset ( $prop['title'] );
- $this->fld_ids = isset ( $prop['ids'] );
- $this->fld_sizes = isset ( $prop['sizes'] );
+ $this->fld_comment = isset( $prop['comment'] );
+ $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+ $this->fld_user = isset( $prop['user'] );
+ $this->fld_userid = isset( $prop['userid'] );
+ $this->fld_flags = isset( $prop['flags'] );
+ $this->fld_timestamp = isset( $prop['timestamp'] );
+ $this->fld_title = isset( $prop['title'] );
+ $this->fld_ids = isset( $prop['ids'] );
+ $this->fld_sizes = isset( $prop['sizes'] );
$this->fld_redirect = isset( $prop['redirect'] );
$this->fld_patrolled = isset( $prop['patrolled'] );
$this->fld_loginfo = isset( $prop['loginfo'] );
@@ -104,6 +112,7 @@ class ApiQueryRecentChanges extends ApiQueryBase {
* Generates and outputs the result of this query based upon the provided parameters.
*/
public function execute() {
+ global $wgUser;
/* Get the parameters of the request. */
$params = $this->extractRequestParams();
@@ -112,73 +121,78 @@ class ApiQueryRecentChanges extends ApiQueryBase {
* AND rc_timestamp < $end AND rc_namespace = $namespace
* AND rc_deleted = '0'
*/
- $db = $this->getDB();
$this->addTables( 'recentchanges' );
$index = array( 'recentchanges' => 'rc_timestamp' ); // May change
$this->addWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
$this->addWhereFld( 'rc_namespace', $params['namespace'] );
$this->addWhereFld( 'rc_deleted', 0 );
- if ( !is_null( $params['type'] ) )
- $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+ if ( !is_null( $params['type'] ) ) {
+ $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+ }
if ( !is_null( $params['show'] ) ) {
$show = array_flip( $params['show'] );
/* Check for conflicting parameters. */
- if ( ( isset ( $show['minor'] ) && isset ( $show['!minor'] ) )
- || ( isset ( $show['bot'] ) && isset ( $show['!bot'] ) )
- || ( isset ( $show['anon'] ) && isset ( $show['!anon'] ) )
- || ( isset ( $show['redirect'] ) && isset ( $show['!redirect'] ) )
- || ( isset ( $show['patrolled'] ) && isset ( $show['!patrolled'] ) ) ) {
-
+ if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
+ || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
+ || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
+ || ( isset( $show['redirect'] ) && isset( $show['!redirect'] ) )
+ || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+ )
+ {
$this->dieUsageMsg( array( 'show' ) );
}
-
+
// Check permissions
- global $wgUser;
- if ( ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) && !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() )
- $this->dieUsage( "You need the patrol right to request the patrolled flag", 'permissiondenied' );
+ if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
+ if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+ }
+ }
/* Add additional conditions to query depending upon parameters. */
- $this->addWhereIf( 'rc_minor = 0', isset ( $show['!minor'] ) );
- $this->addWhereIf( 'rc_minor != 0', isset ( $show['minor'] ) );
- $this->addWhereIf( 'rc_bot = 0', isset ( $show['!bot'] ) );
- $this->addWhereIf( 'rc_bot != 0', isset ( $show['bot'] ) );
- $this->addWhereIf( 'rc_user = 0', isset ( $show['anon'] ) );
- $this->addWhereIf( 'rc_user != 0', isset ( $show['!anon'] ) );
+ $this->addWhereIf( 'rc_minor = 0', isset( $show['!minor'] ) );
+ $this->addWhereIf( 'rc_minor != 0', isset( $show['minor'] ) );
+ $this->addWhereIf( 'rc_bot = 0', isset( $show['!bot'] ) );
+ $this->addWhereIf( 'rc_bot != 0', isset( $show['bot'] ) );
+ $this->addWhereIf( 'rc_user = 0', isset( $show['anon'] ) );
+ $this->addWhereIf( 'rc_user != 0', isset( $show['!anon'] ) );
$this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
$this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
- $this->addWhereIf( 'page_is_redirect = 1', isset ( $show['redirect'] ) );
-
+ $this->addWhereIf( 'page_is_redirect = 1', isset( $show['redirect'] ) );
+
// Don't throw log entries out the window here
- $this->addWhereIf( 'page_is_redirect = 0 OR page_is_redirect IS NULL', isset ( $show['!redirect'] ) );
+ $this->addWhereIf( 'page_is_redirect = 0 OR page_is_redirect IS NULL', isset( $show['!redirect'] ) );
}
-
- if ( !is_null( $params['user'] ) && !is_null( $param['excludeuser'] ) )
+
+ if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
$this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
-
- if ( !is_null( $params['user'] ) )
- {
+ }
+
+ if ( !is_null( $params['user'] ) ) {
$this->addWhereFld( 'rc_user_text', $params['user'] );
$index['recentchanges'] = 'rc_user_text';
}
-
- if ( !is_null( $params['excludeuser'] ) )
+
+ if ( !is_null( $params['excludeuser'] ) ) {
// We don't use the rc_user_text index here because
// * it would require us to sort by rc_user_text before rc_timestamp
// * the != condition doesn't throw out too many rows anyway
$this->addWhere( 'rc_user_text != ' . $this->getDB()->addQuotes( $params['excludeuser'] ) );
+ }
/* Add the fields we're concerned with to our query. */
- $this->addFields( array (
+ $this->addFields( array(
'rc_timestamp',
'rc_namespace',
'rc_title',
'rc_cur_id',
'rc_type',
'rc_moved_to_ns',
- 'rc_moved_to_title'
+ 'rc_moved_to_title',
+ 'rc_deleted'
) );
/* Determine what properties we need to display. */
@@ -188,9 +202,9 @@ class ApiQueryRecentChanges extends ApiQueryBase {
/* Set up internal members based upon params. */
$this->initProperties( $prop );
- global $wgUser;
- if ( $this->fld_patrolled && !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() )
- $this->dieUsage( "You need the patrol right to request the patrolled flag", 'permissiondenied' );
+ if ( $this->fld_patrolled && !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+ }
/* Add fields to our query if they are specified as a needed parameter. */
$this->addFieldsIf( 'rc_id', $this->fld_ids );
@@ -198,7 +212,7 @@ class ApiQueryRecentChanges extends ApiQueryBase {
$this->addFieldsIf( 'rc_last_oldid', $this->fld_ids );
$this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'rc_user', $this->fld_user );
- $this->addFieldsIf( 'rc_user_text', $this->fld_user );
+ $this->addFieldsIf( 'rc_user_text', $this->fld_user || $this->fld_userid );
$this->addFieldsIf( 'rc_minor', $this->fld_flags );
$this->addFieldsIf( 'rc_bot', $this->fld_flags );
$this->addFieldsIf( 'rc_new', $this->fld_flags );
@@ -209,39 +223,37 @@ class ApiQueryRecentChanges extends ApiQueryBase {
$this->addFieldsIf( 'rc_log_type', $this->fld_loginfo );
$this->addFieldsIf( 'rc_log_action', $this->fld_loginfo );
$this->addFieldsIf( 'rc_params', $this->fld_loginfo );
- if ( $this->fld_redirect || isset( $show['redirect'] ) || isset( $show['!redirect'] ) )
- {
+ if ( $this->fld_redirect || isset( $show['redirect'] ) || isset( $show['!redirect'] ) ) {
$this->addTables( 'page' );
$this->addJoinConds( array( 'page' => array( 'LEFT JOIN', array( 'rc_namespace=page_namespace', 'rc_title=page_title' ) ) ) );
$this->addFields( 'page_is_redirect' );
}
}
-
+
if ( $this->fld_tags ) {
$this->addTables( 'tag_summary' );
$this->addJoinConds( array( 'tag_summary' => array( 'LEFT JOIN', array( 'rc_id=ts_rc_id' ) ) ) );
$this->addFields( 'ts_tags' );
}
-
+
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rc_id=ct_rc_id' ) ) ) );
$this->addWhereFld( 'ct_tag' , $params['tag'] );
global $wgOldChangeTagsIndex;
- $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+ $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
}
-
+
$this->token = $params['token'];
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$this->addOption( 'USE INDEX', $index );
$count = 0;
/* Perform the actual query. */
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
/* Iterate through the rows, adding data extracted from them to our query result. */
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++ $count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
@@ -252,18 +264,16 @@ class ApiQueryRecentChanges extends ApiQueryBase {
$vals = $this->extractRowInfo( $row );
/* Add that row's data to our final output. */
- if ( !$vals )
+ if ( !$vals ) {
continue;
+ }
$fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
break;
}
}
- $db->freeResult( $res );
-
/* Format the result */
$this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'rc' );
}
@@ -279,15 +289,17 @@ class ApiQueryRecentChanges extends ApiQueryBase {
/* If page was moved somewhere, get the title of the move target. */
$movedToTitle = false;
if ( isset( $row->rc_moved_to_title ) && $row->rc_moved_to_title !== '' )
- $movedToTitle = Title :: makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
+ {
+ $movedToTitle = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
+ }
/* Determine the title of the page that has been changed. */
- $title = Title :: makeTitle( $row->rc_namespace, $row->rc_title );
+ $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
/* Our output data. */
- $vals = array ();
+ $vals = array();
- $type = intval ( $row->rc_type );
+ $type = intval( $row->rc_type );
/* Determine what kind of change this was. */
switch ( $type ) {
@@ -312,9 +324,10 @@ class ApiQueryRecentChanges extends ApiQueryBase {
/* Create a new entry in the result for the title. */
if ( $this->fld_title ) {
- ApiQueryBase :: addTitleInfo( $vals, $title );
- if ( $movedToTitle )
- ApiQueryBase :: addTitleInfo( $vals, $movedToTitle, "new_" );
+ ApiQueryBase::addTitleInfo( $vals, $title );
+ if ( $movedToTitle ) {
+ ApiQueryBase::addTitleInfo( $vals, $movedToTitle, 'new_' );
+ }
}
/* Add ids, such as rcid, pageid, revid, and oldid to the change's info. */
@@ -326,20 +339,32 @@ class ApiQueryRecentChanges extends ApiQueryBase {
}
/* Add user data and 'anon' flag, if use is anonymous. */
- if ( $this->fld_user ) {
- $vals['user'] = $row->rc_user_text;
- if ( !$row->rc_user )
+ if ( $this->fld_user || $this->fld_userid ) {
+
+ if ( $this->fld_user ) {
+ $vals['user'] = $row->rc_user_text;
+ }
+
+ if ( $this->fld_userid ) {
+ $vals['userid'] = $row->rc_user;
+ }
+
+ if ( !$row->rc_user ) {
$vals['anon'] = '';
+ }
}
/* Add flags, such as new, minor, bot. */
if ( $this->fld_flags ) {
- if ( $row->rc_bot )
+ if ( $row->rc_bot ) {
$vals['bot'] = '';
- if ( $row->rc_new )
+ }
+ if ( $row->rc_new ) {
$vals['new'] = '';
- if ( $row->rc_minor )
+ }
+ if ( $row->rc_minor ) {
$vals['minor'] = '';
+ }
}
/* Add sizes of each revision. (Only available on 1.10+) */
@@ -349,35 +374,42 @@ class ApiQueryRecentChanges extends ApiQueryBase {
}
/* Add the timestamp. */
- if ( $this->fld_timestamp )
+ if ( $this->fld_timestamp ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->rc_timestamp );
+ }
/* Add edit summary / log summary. */
- if ( $this->fld_comment && isset( $row->rc_comment ) )
+ if ( $this->fld_comment && isset( $row->rc_comment ) ) {
$vals['comment'] = $row->rc_comment;
-
+ }
+
if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
global $wgUser;
$vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->rc_comment, $title );
}
- if ( $this->fld_redirect )
- if ( $row->page_is_redirect )
+ if ( $this->fld_redirect ) {
+ if ( $row->page_is_redirect ) {
$vals['redirect'] = '';
+ }
+ }
/* Add the patrolled flag */
- if ( $this->fld_patrolled && $row->rc_patrolled == 1 )
+ if ( $this->fld_patrolled && $row->rc_patrolled == 1 ) {
$vals['patrolled'] = '';
-
+ }
+
if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
$vals['logid'] = intval( $row->rc_logid );
$vals['logtype'] = $row->rc_log_type;
$vals['logaction'] = $row->rc_log_action;
- ApiQueryLogEvents::addLogParams( $this->getResult(),
+ ApiQueryLogEvents::addLogParams(
+ $this->getResult(),
$vals, $row->rc_params,
- $row->rc_log_type, $row->rc_timestamp );
+ $row->rc_log_type, $row->rc_timestamp
+ );
}
-
+
if ( $this->fld_tags ) {
if ( $row->ts_tags ) {
$tags = explode( ',', $row->ts_tags );
@@ -387,39 +419,39 @@ class ApiQueryRecentChanges extends ApiQueryBase {
$vals['tags'] = array();
}
}
-
- if ( !is_null( $this->token ) )
- {
+
+ if ( !is_null( $this->token ) ) {
$tokenFunctions = $this->getTokenFunctions();
- foreach ( $this->token as $t )
- {
+ foreach ( $this->token as $t ) {
$val = call_user_func( $tokenFunctions[$t], $row->rc_cur_id,
$title, RecentChange::newFromRow( $row ) );
- if ( $val === false )
+ if ( $val === false ) {
$this->setWarning( "Action '$t' is not allowed for the current user" );
- else
+ } else {
$vals[$t . 'token'] = $val;
+ }
}
}
return $vals;
}
- private function parseRCType( $type )
- {
- if ( is_array( $type ) )
- {
- $retval = array();
- foreach ( $type as $t )
- $retval[] = $this->parseRCType( $t );
- return $retval;
- }
- switch( $type )
- {
- case 'edit': return RC_EDIT;
- case 'new': return RC_NEW;
- case 'log': return RC_LOG;
+ private function parseRCType( $type ) {
+ if ( is_array( $type ) ) {
+ $retval = array();
+ foreach ( $type as $t ) {
+ $retval[] = $this->parseRCType( $t );
}
+ return $retval;
+ }
+ switch( $type ) {
+ case 'edit':
+ return RC_EDIT;
+ case 'new':
+ return RC_NEW;
+ case 'log':
+ return RC_LOG;
+ }
}
public function getCacheMode( $params ) {
@@ -441,36 +473,37 @@ class ApiQueryRecentChanges extends ApiQueryBase {
}
public function getAllowedParams() {
- return array (
- 'start' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ return array(
+ 'start' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'end' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'end' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'dir' => array (
- ApiBase :: PARAM_DFLT => 'older',
- ApiBase :: PARAM_TYPE => array (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'older',
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
)
),
- 'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace'
+ 'namespace' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace'
),
'user' => array(
- ApiBase :: PARAM_TYPE => 'user'
+ ApiBase::PARAM_TYPE => 'user'
),
'excludeuser' => array(
- ApiBase :: PARAM_TYPE => 'user'
+ ApiBase::PARAM_TYPE => 'user'
),
'tag' => null,
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'title|timestamp|ids',
- ApiBase :: PARAM_TYPE => array (
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'title|timestamp|ids',
+ ApiBase::PARAM_TYPE => array(
'user',
+ 'userid',
'comment',
'parsedcomment',
'flags',
@@ -485,12 +518,12 @@ class ApiQueryRecentChanges extends ApiQueryBase {
)
),
'token' => array(
- ApiBase :: PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
+ ApiBase::PARAM_ISMULTI => true
),
- 'show' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'show' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'minor',
'!minor',
'bot',
@@ -503,16 +536,16 @@ class ApiQueryRecentChanges extends ApiQueryBase {
'!patrolled'
)
),
- '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
+ '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
),
- 'type' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'type' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'edit',
'new',
'log'
@@ -522,29 +555,44 @@ class ApiQueryRecentChanges extends ApiQueryBase {
}
public function getParamDescription() {
- return array (
- 'start' => 'The timestamp to start enumerating from.',
- 'end' => 'The timestamp to end enumerating.',
- 'dir' => 'In which direction to enumerate.',
+ return array(
+ 'start' => 'The timestamp to start enumerating from',
+ 'end' => 'The timestamp to end enumerating',
+ 'dir' => 'In which direction to enumerate',
'namespace' => 'Filter log entries to only this namespace(s)',
'user' => 'Only list changes by this user',
'excludeuser' => 'Don\'t list changes by this user',
- 'prop' => 'Include additional pieces of information',
+ 'prop' => array(
+ 'Include additional pieces of information',
+ ' user - Adds the user responsible for the edit and tags if they are an IP',
+ ' userid - Adds the user id responsible for the edit',
+ ' comment - Adds the comment for the edit',
+ ' parsedcomment - Adds the parsed comment for the edit',
+ ' flags - Adds flags for the edit',
+ ' timestamp - Adds timestamp of the edit',
+ ' title - Adds the page title of the edit',
+ ' ids - Adds the page id, recent changes id and the new and old revision id',
+ ' sizes - Adds the new and old page length in bytes',
+ ' redirect - Tags edit if page is a redirect',
+ ' patrolled - Tags edits have have been patrolled',
+ ' loginfo - Adds log information (logid, logtype, etc) to log entries',
+ ' tags - Lists tags for the entry',
+ ),
'token' => 'Which tokens to obtain for each change',
- 'show' => array (
+ 'show' => array(
'Show only items that meet this criteria.',
- 'For example, to see only minor edits done by logged-in users, set show=minor|!anon'
+ "For example, to see only minor edits done by logged-in users, set {$this->getModulePrefix()}show=minor|!anon"
),
- 'type' => 'Which types of changes to show.',
- 'limit' => 'How many total changes to return.',
- 'tag' => 'Only list changes tagged with this tag.',
+ 'type' => 'Which types of changes to show',
+ 'limit' => 'How many total changes to return',
+ 'tag' => 'Only list changes tagged with this tag',
);
}
public function getDescription() {
return 'Enumerate recent changes';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'show' ),
@@ -554,12 +602,12 @@ class ApiQueryRecentChanges extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=recentchanges'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryRecentChanges.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryRecentChanges.php 78437 2010-12-15 14:14:16Z catrope $';
}
}
diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php
index 3992d6a9..64a0a4ea 100644
--- a/includes/api/ApiQueryRevisions.php
+++ b/includes/api/ApiQueryRevisions.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 7, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 7, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,12 +38,18 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*/
class ApiQueryRevisions extends ApiQueryBase {
+ private $diffto, $difftotext, $expandTemplates, $generateXML, $section,
+ $token;
+
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'rv' );
+ parent::__construct( $query, $moduleName, 'rv' );
}
private $fld_ids = false, $fld_flags = false, $fld_timestamp = false, $fld_size = false,
- $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_content = false, $fld_tags = false;
+ $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
+ $fld_content = false, $fld_tags = false;
+
+ private $tokenFunctions;
protected function getTokenFunctions() {
// tokenname => function
@@ -50,12 +57,14 @@ class ApiQueryRevisions extends ApiQueryBase {
// should return token or false
// Don't call the hooks twice
- if ( isset( $this->tokenFunctions ) )
+ if ( isset( $this->tokenFunctions ) ) {
return $this->tokenFunctions;
+ }
// If we're in JSON callback mode, no tokens can be obtained
- if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) )
+ if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) {
return array();
+ }
$this->tokenFunctions = array(
'rollback' => array( 'ApiQueryRevisions', 'getRollbackToken' )
@@ -64,11 +73,11 @@ class ApiQueryRevisions extends ApiQueryBase {
return $this->tokenFunctions;
}
- public static function getRollbackToken( $pageid, $title, $rev )
- {
+ public static function getRollbackToken( $pageid, $title, $rev ) {
global $wgUser;
- if ( !$wgUser->isAllowed( 'rollback' ) )
+ if ( !$wgUser->isAllowed( 'rollback' ) ) {
return false;
+ }
return $wgUser->editToken( array( $title->getPrefixedText(),
$rev->getUserText() ) );
}
@@ -91,31 +100,37 @@ class ApiQueryRevisions extends ApiQueryBase {
$revCount = $pageSet->getRevisionCount();
// Optimization -- nothing to do
- if ( $revCount === 0 && $pageCount === 0 )
+ if ( $revCount === 0 && $pageCount === 0 ) {
return;
+ }
- if ( $revCount > 0 && $enumRevMode )
+ if ( $revCount > 0 && $enumRevMode ) {
$this->dieUsage( 'The revids= parameter may not be used with the list options (limit, startid, endid, dirNewer, start, end).', 'revids' );
+ }
- if ( $pageCount > 1 && $enumRevMode )
+ if ( $pageCount > 1 && $enumRevMode ) {
$this->dieUsage( 'titles, pageids or a generator was used to supply multiple pages, but the limit, startid, endid, dirNewer, user, excludeuser, start and end parameters may only be used on a single page.', 'multpages' );
+ }
- $this->diffto = $this->difftotext = null;
if ( !is_null( $params['difftotext'] ) ) {
$this->difftotext = $params['difftotext'];
- } else if ( !is_null( $params['diffto'] ) ) {
- if ( $params['diffto'] == 'cur' )
+ } elseif ( !is_null( $params['diffto'] ) ) {
+ if ( $params['diffto'] == 'cur' ) {
$params['diffto'] = 0;
+ }
if ( ( !ctype_digit( $params['diffto'] ) || $params['diffto'] < 0 )
&& $params['diffto'] != 'prev' && $params['diffto'] != 'next' )
+ {
$this->dieUsage( 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"', 'diffto' );
+ }
// Check whether the revision exists and is readable,
// DifferenceEngine returns a rather ambiguous empty
// string if that's not the case
if ( $params['diffto'] != 0 ) {
$difftoRev = Revision::newFromID( $params['diffto'] );
- if ( !$difftoRev )
+ if ( !$difftoRev ) {
$this->dieUsageMsg( array( 'nosuchrevid', $params['diffto'] ) );
+ }
if ( !$difftoRev->userCan( Revision::DELETED_TEXT ) ) {
$this->setWarning( "Couldn't diff to r{$difftoRev->getID()}: content is hidden" );
$params['diffto'] = null;
@@ -139,39 +154,49 @@ class ApiQueryRevisions extends ApiQueryBase {
$this->fld_comment = isset ( $prop['comment'] );
$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
$this->fld_size = isset ( $prop['size'] );
+ $this->fld_userid = isset( $prop['userid'] );
$this->fld_user = isset ( $prop['user'] );
$this->token = $params['token'];
// Possible indexes used
$index = array();
+ $userMax = ( $this->fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
+ $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
+ $limit = $params['limit'];
+ if ( $limit == 'max' ) {
+ $limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
+ $this->getResult()->setParsedLimit( $this->getModuleName(), $limit );
+ }
+
+
if ( !is_null( $this->token ) || $pageCount > 0 ) {
$this->addFields( Revision::selectPageFields() );
}
- if ( isset ( $prop['tags'] ) ) {
+ if ( isset( $prop['tags'] ) ) {
$this->fld_tags = true;
$this->addTables( 'tag_summary' );
$this->addJoinConds( array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) ) );
$this->addFields( 'ts_tags' );
}
-
+
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
$this->addWhereFld( 'ct_tag' , $params['tag'] );
global $wgOldChangeTagsIndex;
- $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+ $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
}
-
- if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
+ if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
// For each page we will request, the user must have read rights for that page
foreach ( $pageSet->getGoodTitles() as $title ) {
- if ( !$title->userCanRead() )
+ if ( !$title->userCanRead() ) {
$this->dieUsage(
'The current user is not allowed to read ' . $title->getPrefixedText(),
'accessdenied' );
+ }
}
$this->addTables( 'text' );
@@ -183,34 +208,39 @@ class ApiQueryRevisions extends ApiQueryBase {
$this->expandTemplates = $params['expandtemplates'];
$this->generateXML = $params['generatexml'];
- if ( isset( $params['section'] ) )
+ $this->parseContent = $params['parse'];
+ if ( $this->parseContent ) {
+ // Must manually initialize unset limit
+ if ( is_null( $limit ) ) {
+ $limit = 1;
+ }
+ // We are only going to parse 1 revision per request
+ $this->validateLimit( 'limit', $limit, 1, 1, 1 );
+ }
+ if ( isset( $params['section'] ) ) {
$this->section = $params['section'];
- else
+ } else {
$this->section = false;
+ }
}
//Bug 24166 - API error when using rvprop=tags
$this->addTables( 'revision' );
- $userMax = ( $this->fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
- $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
- $limit = $params['limit'];
- if ( $limit == 'max' ) {
- $limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
- $this->getResult()->addValue( 'limits', $this->getModuleName(), $limit );
- }
if ( $enumRevMode ) {
-
// This is mostly to prevent parameter errors (and optimize SQL?)
- if ( !is_null( $params['startid'] ) && !is_null( $params['start'] ) )
+ if ( !is_null( $params['startid'] ) && !is_null( $params['start'] ) ) {
$this->dieUsage( 'start and startid cannot be used together', 'badparams' );
+ }
- if ( !is_null( $params['endid'] ) && !is_null( $params['end'] ) )
+ if ( !is_null( $params['endid'] ) && !is_null( $params['end'] ) ) {
$this->dieUsage( 'end and endid cannot be used together', 'badparams' );
+ }
- if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) )
+ if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
$this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
+ }
// This code makes an assumption that sorting by rev_id and rev_timestamp produces
// the same result. This way users may request revisions starting at a given time,
@@ -218,11 +248,10 @@ class ApiQueryRevisions extends ApiQueryBase {
// Switching to rev_id removes the potential problem of having more than
// one row with the same timestamp for the same page.
// The order needs to be the same as start parameter to avoid SQL filesort.
-
- if ( is_null( $params['startid'] ) && is_null( $params['endid'] ) )
+ if ( is_null( $params['startid'] ) && is_null( $params['endid'] ) ) {
$this->addWhereRange( 'rev_timestamp', $params['dir'],
$params['start'], $params['end'] );
- else {
+ } else {
$this->addWhereRange( 'rev_id', $params['dir'],
$params['startid'], $params['endid'] );
// One of start and end can be set
@@ -232,8 +261,9 @@ class ApiQueryRevisions extends ApiQueryBase {
}
// must manually initialize unset limit
- if ( is_null( $limit ) )
+ if ( is_null( $limit ) ) {
$limit = 10;
+ }
$this->validateLimit( 'limit', $limit, 1, $userMax, $botMax );
// There is only one ID, use it
@@ -250,114 +280,125 @@ class ApiQueryRevisions extends ApiQueryBase {
// Paranoia: avoid brute force searches (bug 17342)
$this->addWhere( $db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
}
- }
- elseif ( $revCount > 0 ) {
+ } elseif ( $revCount > 0 ) {
$max = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
$revs = $pageSet->getRevisionIDs();
- if ( self::truncateArray( $revs, $max ) )
+ if ( self::truncateArray( $revs, $max ) ) {
$this->setWarning( "Too many values supplied for parameter 'revids': the limit is $max" );
+ }
// Get all revision IDs
$this->addWhereFld( 'rev_id', array_keys( $revs ) );
- if ( !is_null( $params['continue'] ) )
+ if ( !is_null( $params['continue'] ) ) {
$this->addWhere( "rev_id >= '" . intval( $params['continue'] ) . "'" );
+ }
$this->addOption( 'ORDER BY', 'rev_id' );
// assumption testing -- we should never get more then $revCount rows.
$limit = $revCount;
- }
- elseif ( $pageCount > 0 ) {
+ } elseif ( $pageCount > 0 ) {
$max = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
$titles = $pageSet->getGoodTitles();
- if ( self::truncateArray( $titles, $max ) )
+ if ( self::truncateArray( $titles, $max ) ) {
$this->setWarning( "Too many values supplied for parameter 'titles': the limit is $max" );
-
+ }
+
// When working in multi-page non-enumeration mode,
// limit to the latest revision only
$this->addWhere( 'page_id=rev_page' );
$this->addWhere( 'page_latest=rev_id' );
-
+
// Get all page IDs
$this->addWhereFld( 'page_id', array_keys( $titles ) );
// Every time someone relies on equality propagation, god kills a kitten :)
$this->addWhereFld( 'rev_page', array_keys( $titles ) );
-
- if ( !is_null( $params['continue'] ) )
- {
+
+ if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the original " .
- "value returned by the previous query", "_badcontinue" );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original ' .
+ 'value returned by the previous query', '_badcontinue' );
+ }
$pageid = intval( $cont[0] );
$revid = intval( $cont[1] );
- $this->addWhere( "rev_page > '$pageid' OR " .
- "(rev_page = '$pageid' AND " .
- "rev_id >= '$revid')" );
+ $this->addWhere(
+ "rev_page > '$pageid' OR " .
+ "(rev_page = '$pageid' AND " .
+ "rev_id >= '$revid')"
+ );
}
$this->addOption( 'ORDER BY', 'rev_page, rev_id' );
// assumption testing -- we should never get more then $pageCount rows.
$limit = $pageCount;
- } else
- ApiBase :: dieDebug( __METHOD__, 'param validation?' );
+ } else {
+ ApiBase::dieDebug( __METHOD__, 'param validation?' );
+ }
$this->addOption( 'LIMIT', $limit + 1 );
$this->addOption( 'USE INDEX', $index );
- $data = array ();
$count = 0;
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
-
+ 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...
- if ( !$enumRevMode )
- ApiBase :: dieDebug( __METHOD__, 'Got more rows then expected' ); // bug report
+ if ( !$enumRevMode ) {
+ ApiBase::dieDebug( __METHOD__, 'Got more rows then expected' ); // bug report
+ }
$this->setContinueEnumParameter( 'startid', intval( $row->rev_id ) );
break;
}
-
- //
+
$fit = $this->addPageSubItem( $row->rev_page, $this->extractRowInfo( $row ), 'rev' );
- if ( !$fit )
- {
- if ( $enumRevMode )
+ if ( !$fit ) {
+ if ( $enumRevMode ) {
$this->setContinueEnumParameter( 'startid', intval( $row->rev_id ) );
- else if ( $revCount > 0 )
+ } elseif ( $revCount > 0 ) {
$this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
- else
+ } else {
$this->setContinueEnumParameter( 'continue', intval( $row->rev_page ) .
'|' . intval( $row->rev_id ) );
+ }
break;
}
}
- $db->freeResult( $res );
}
private function extractRowInfo( $row ) {
$revision = new Revision( $row );
$title = $revision->getTitle();
- $vals = array ();
+ $vals = array();
if ( $this->fld_ids ) {
$vals['revid'] = intval( $revision->getId() );
- // $vals['oldid'] = intval($row->rev_text_id); // todo: should this be exposed?
- if ( !is_null( $revision->getParentId() ) )
+ // $vals['oldid'] = intval( $row->rev_text_id ); // todo: should this be exposed?
+ if ( !is_null( $revision->getParentId() ) ) {
$vals['parentid'] = intval( $revision->getParentId() );
+ }
}
- if ( $this->fld_flags && $revision->isMinor() )
+ if ( $this->fld_flags && $revision->isMinor() ) {
$vals['minor'] = '';
+ }
- if ( $this->fld_user ) {
+ if ( $this->fld_user || $this->fld_userid ) {
if ( $revision->isDeleted( Revision::DELETED_USER ) ) {
$vals['userhidden'] = '';
} else {
- $vals['user'] = $revision->getUserText();
- if ( !$revision->getUser() )
+ if ( $this->fld_user ) {
+ $vals['user'] = $revision->getUserText();
+ }
+ $userid = $revision->getUser();
+ if ( !$userid ) {
$vals['anon'] = '';
+ }
+
+ if ( $this->fld_userid ) {
+ $vals['userid'] = $userid;
+ }
}
}
@@ -374,15 +415,14 @@ class ApiQueryRevisions extends ApiQueryBase {
$vals['commenthidden'] = '';
} else {
$comment = $revision->getComment();
- if ( strval( $comment ) !== '' )
- {
- if ( $this->fld_comment )
- $vals['comment'] = $comment;
-
- if ( $this->fld_parsedcomment ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $comment, $title );
- }
+
+ if ( $this->fld_comment ) {
+ $vals['comment'] = $comment;
+ }
+
+ if ( $this->fld_parsedcomment ) {
+ global $wgUser;
+ $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $comment, $title );
}
}
}
@@ -396,31 +436,31 @@ class ApiQueryRevisions extends ApiQueryBase {
$vals['tags'] = array();
}
}
-
- if ( !is_null( $this->token ) )
- {
+
+ if ( !is_null( $this->token ) ) {
$tokenFunctions = $this->getTokenFunctions();
- foreach ( $this->token as $t )
- {
+ foreach ( $this->token as $t ) {
$val = call_user_func( $tokenFunctions[$t], $title->getArticleID(), $title, $revision );
- if ( $val === false )
+ if ( $val === false ) {
$this->setWarning( "Action '$t' is not allowed for the current user" );
- else
+ } else {
$vals[$t . 'token'] = $val;
+ }
}
}
-
+
$text = null;
+ global $wgParser;
if ( $this->fld_content || !is_null( $this->difftotext ) ) {
- global $wgParser;
$text = $revision->getText();
// Expand templates after getting section content because
// template-added sections don't count and Parser::preprocess()
// will have less input
if ( $this->section !== false ) {
$text = $wgParser->getSection( $text, $this->section, false );
- if ( $text === false )
+ if ( $text === false ) {
$this->dieUsage( "There is no section {$this->section} in r" . $revision->getId(), 'nosuchsection' );
+ }
}
}
if ( $this->fld_content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
@@ -433,13 +473,36 @@ class ApiQueryRevisions extends ApiQueryBase {
$xml = $dom->__toString();
}
$vals['parsetree'] = $xml;
-
+
}
- if ( $this->expandTemplates ) {
+ if ( $this->expandTemplates && !$this->parseContent ) {
$text = $wgParser->preprocess( $text, $title, new ParserOptions() );
}
- ApiResult :: setContent( $vals, $text );
- } else if ( $this->fld_content ) {
+ if ( $this->parseContent ) {
+ global $wgEnableParserCache;
+
+ $popts = new ParserOptions();
+ $popts->setTidy( true );
+
+ $articleObj = new Article( $title );
+
+ $p_result = false;
+ $pcache = ParserCache::singleton();
+ if ( $wgEnableParserCache ) {
+ $p_result = $pcache->get( $articleObj, $popts );
+ }
+ if ( !$p_result ) {
+ $p_result = $wgParser->parse( $text, $title, $popts );
+
+ if ( $wgEnableParserCache ) {
+ $pcache->save( $p_result, $articleObj, $popts );
+ }
+ }
+
+ $text = $p_result->getText();
+ }
+ ApiResult::setContent( $vals, $text );
+ } elseif ( $this->fld_content ) {
$vals['texthidden'] = '';
}
@@ -458,8 +521,9 @@ class ApiQueryRevisions extends ApiQueryBase {
}
$difftext = $engine->getDiffBody();
ApiResult::setContent( $vals['diff'], $difftext );
- if ( !$engine->wasCacheHit() )
+ if ( !$engine->wasCacheHit() ) {
$n++;
+ }
} else {
$vals['diff']['notcached'] = '';
}
@@ -474,20 +538,21 @@ class ApiQueryRevisions extends ApiQueryBase {
if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
// formatComment() calls wfMsg() among other things
return 'anon-public-user-private';
- }
+ }
return 'public';
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'ids|timestamp|flags|comment|user',
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'ids|timestamp|flags|comment|user',
+ ApiBase::PARAM_TYPE => array(
'ids',
'flags',
'timestamp',
'user',
+ 'userid',
'size',
'comment',
'parsedcomment',
@@ -495,44 +560,45 @@ class ApiQueryRevisions extends ApiQueryBase {
'tags'
)
),
- 'limit' => array (
- ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
- ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
- 'startid' => array (
- ApiBase :: PARAM_TYPE => 'integer'
+ 'startid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
),
- 'endid' => array (
- ApiBase :: PARAM_TYPE => 'integer'
+ 'endid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
),
- 'start' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'start' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'end' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'end' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'dir' => array (
- ApiBase :: PARAM_DFLT => 'older',
- ApiBase :: PARAM_TYPE => array (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'older',
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
)
),
'user' => array(
- ApiBase :: PARAM_TYPE => 'user'
+ ApiBase::PARAM_TYPE => 'user'
),
'excludeuser' => array(
- ApiBase :: PARAM_TYPE => 'user'
+ ApiBase::PARAM_TYPE => 'user'
),
'tag' => null,
'expandtemplates' => false,
'generatexml' => false,
+ 'parse' => false,
'section' => null,
'token' => array(
- ApiBase :: PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
+ ApiBase::PARAM_ISMULTI => true
),
'continue' => null,
'diffto' => null,
@@ -541,8 +607,21 @@ class ApiQueryRevisions extends ApiQueryBase {
}
public function getParamDescription() {
- return array (
- 'prop' => 'Which properties to get for each revision.',
+ $p = $this->getModulePrefix();
+ return array(
+ 'prop' => array(
+ 'Which properties to get for each revision:',
+ ' ids - The ID of the revision',
+ ' flags - Revision flags (minor)',
+ ' timestamp - The timestamp of the revision',
+ ' user - User that made the revision',
+ ' userid - User id of revision creator',
+ ' size - Length of the revision',
+ ' comment - Comment by the user for revision',
+ ' parsedcomment - Parsed comment by the user for the revision',
+ ' content - Text of the revision',
+ ' tags - Tags for the revision',
+ ),
'limit' => 'Limit how many revisions will be returned (enum)',
'startid' => 'From which revision id to start enumeration (enum)',
'endid' => 'Stop revision enumeration on this revid (enum)',
@@ -553,28 +632,29 @@ class ApiQueryRevisions extends ApiQueryBase {
'excludeuser' => 'Exclude revisions made by user',
'expandtemplates' => 'Expand templates in revision content',
'generatexml' => 'Generate XML parse tree for revision content',
- 'section' => 'Only retrieve the content of this section',
+ 'parse' => 'Parse revision content. For performance reasons if this option is used, rvlimit is enforced to 1.',
+ 'section' => 'Only retrieve the content of this section number',
'token' => 'Which tokens to obtain for each revision',
'continue' => 'When more results are available, use this to continue',
'diffto' => array( 'Revision ID to diff each revision to.',
- 'Use "prev", "next" and "cur" for the previous, next and current revision respectively.' ),
+ 'Use "prev", "next" and "cur" for the previous, next and current revision respectively' ),
'difftotext' => array( 'Text to diff each revision to. Only diffs a limited number of revisions.',
- 'Overrides diffto. If rvsection is set, only that section will be diffed against this text.' ),
+ "Overrides {$p}diffto. If {$p}section is set, only that section will be diffed against this text" ),
'tag' => 'Only list revisions tagged with this tag',
);
}
public function getDescription() {
- return array (
- 'Get revision information.',
+ return array(
+ 'Get revision information',
'This module may be used in several ways:',
- ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter.',
- ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params.',
- ' 3) Get data about a set of revisions by setting their IDs with revids parameter.',
- 'All parameters marked as (enum) may only be used with a single page (#2).'
+ ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter',
+ ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params',
+ ' 3) Get data about a set of revisions by setting their IDs with revids parameter',
+ 'All parameters marked as (enum) may only be used with a single page (#2)'
);
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'nosuchrevid', 'diffto' ),
@@ -589,7 +669,7 @@ class ApiQueryRevisions extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'Get data with content for the last revision of titles "API" and "Main Page":',
' api.php?action=query&prop=revisions&titles=API|Main%20Page&rvprop=timestamp|user|comment|content',
'Get last 5 revisions of the "Main Page":',
@@ -606,6 +686,6 @@ class ApiQueryRevisions extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryRevisions.php 72117 2010-09-01 16:50:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiQueryRevisions.php 75521 2010-10-27 11:50:20Z catrope $';
}
}
diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php
index 4e032321..3cf693af 100644
--- a/includes/api/ApiQuerySearch.php
+++ b/includes/api/ApiQuerySearch.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 30, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on July 30, 2007
+ *
+ * Copyright © 2007 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,7 +37,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQuerySearch extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'sr' );
+ parent::__construct( $query, $moduleName, 'sr' );
}
public function execute() {
@@ -57,9 +58,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
$what = $params['what'];
$searchInfo = array_flip( $params['info'] );
$prop = array_flip( $params['prop'] );
-
- if ( strval( $query ) === '' )
- $this->dieUsage( "empty search string is not allowed", 'param-search' );
// Create search engine instance and set options
$search = SearchEngine::create();
@@ -72,6 +70,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
$matches = $search->searchText( $query );
} elseif ( $what == 'title' ) {
$matches = $search->searchTitle( $query );
+ } elseif ( $what == 'nearmatch' ) {
+ $matches = SearchEngine::getNearMatchResultSet( $query );
} else {
// We default to title searches; this is a terrible legacy
// of the way we initially set up the MySQL fulltext-based
@@ -79,7 +79,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
// In the future, the default should be for a combined index.
$what = 'title';
$matches = $search->searchTitle( $query );
-
+
// Not all search engines support a separate title search,
// for instance the Lucene-based engine we use on Wikipedia.
// In this case, fall back to full-text search (which will
@@ -89,9 +89,10 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
$matches = $search->searchText( $query );
}
}
- if ( is_null( $matches ) )
+ if ( is_null( $matches ) ) {
$this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
-
+ }
+
// Add search meta data to result
if ( isset( $searchInfo['totalhits'] ) ) {
$totalhits = $matches->getTotalHits();
@@ -107,7 +108,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
// Add the search results to the result
$terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
- $titles = array ();
+ $titles = array();
$count = 0;
while ( $result = $matches->next() ) {
if ( ++ $count > $limit ) {
@@ -117,23 +118,53 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
}
// Silently skip broken and missing titles
- if ( $result->isBrokenTitle() || $result->isMissingRevision() )
+ if ( $result->isBrokenTitle() || $result->isMissingRevision() ) {
continue;
-
+ }
+
$title = $result->getTitle();
if ( is_null( $resultPageSet ) ) {
$vals = array();
ApiQueryBase::addTitleInfo( $vals, $title );
-
- if ( isset( $prop['snippet'] ) )
+
+ if ( isset( $prop['snippet'] ) ) {
$vals['snippet'] = $result->getTextSnippet( $terms );
- if ( isset( $prop['size'] ) )
+ }
+ if ( isset( $prop['size'] ) ) {
$vals['size'] = $result->getByteSize();
- if ( isset( $prop['wordcount'] ) )
+ }
+ if ( isset( $prop['wordcount'] ) ) {
$vals['wordcount'] = $result->getWordCount();
- if ( isset( $prop['timestamp'] ) )
+ }
+ if ( isset( $prop['timestamp'] ) ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() );
-
+ }
+ if ( !is_null( $result->getScore() ) && isset( $prop['score'] ) ) {
+ $vals['score'] = $result->getScore();
+ }
+ if ( isset( $prop['titlesnippet'] ) ) {
+ $vals['titlesnippet'] = $result->getTitleSnippet( $terms );
+ }
+ if ( !is_null( $result->getRedirectTitle() ) ) {
+ if ( isset( $prop['redirecttitle'] ) ) {
+ $vals['redirecttitle'] = $result->getRedirectTitle();
+ }
+ if ( isset( $prop['redirectsnippet'] ) ) {
+ $vals['redirectsnippet'] = $result->getRedirectSnippet( $terms );
+ }
+ }
+ if ( !is_null( $result->getSectionTitle() ) ) {
+ if ( isset( $prop['sectiontitle'] ) ) {
+ $vals['sectiontitle'] = $result->getSectionTitle();
+ }
+ if ( isset( $prop['sectionsnippet'] ) ) {
+ $vals['sectionsnippet'] = $result->getSectionSnippet();
+ }
+ }
+ if ( isset( $prop['hasrelated'] ) && $result->hasRelated() ) {
+ $vals['hasrelated'] = "";
+ }
+
// Add item to results and see whether it fits
$fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ),
null, $vals );
@@ -160,77 +191,100 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array (
- 'search' => null,
- 'namespace' => array (
- ApiBase :: PARAM_DFLT => 0,
- ApiBase :: PARAM_TYPE => 'namespace',
- ApiBase :: PARAM_ISMULTI => true,
+ return array(
+ 'search' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ 'namespace' => array(
+ ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_ISMULTI => true,
),
- 'what' => array (
- ApiBase :: PARAM_DFLT => null,
- ApiBase :: PARAM_TYPE => array (
+ 'what' => array(
+ ApiBase::PARAM_DFLT => null,
+ ApiBase::PARAM_TYPE => array(
'title',
'text',
+ 'nearmatch',
)
),
'info' => array(
- ApiBase :: PARAM_DFLT => 'totalhits|suggestion',
- ApiBase :: PARAM_TYPE => array (
+ ApiBase::PARAM_DFLT => 'totalhits|suggestion',
+ ApiBase::PARAM_TYPE => array(
'totalhits',
'suggestion',
),
- ApiBase :: PARAM_ISMULTI => true,
+ ApiBase::PARAM_ISMULTI => true,
),
'prop' => array(
- ApiBase :: PARAM_DFLT => 'size|wordcount|timestamp|snippet',
- ApiBase :: PARAM_TYPE => array (
+ ApiBase::PARAM_DFLT => 'size|wordcount|timestamp|snippet',
+ ApiBase::PARAM_TYPE => array(
'size',
'wordcount',
'timestamp',
+ 'score',
'snippet',
+ 'titlesnippet',
+ 'redirecttitle',
+ 'redirectsnippet',
+ 'sectiontitle',
+ 'sectionsnippet',
+ 'hasrelated',
),
- ApiBase :: PARAM_ISMULTI => true,
+ ApiBase::PARAM_ISMULTI => true,
),
'redirects' => false,
'offset' => 0,
- 'limit' => array (
- ApiBase :: PARAM_DFLT => 10,
- ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX => ApiBase :: LIMIT_SML1,
- ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_SML2
+ 'limit' => array(
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_SML1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_SML2
)
);
}
public function getParamDescription() {
- return array (
- 'search' => 'Search for all page titles (or content) that has this value.',
- 'namespace' => 'The namespace(s) to enumerate.',
- 'what' => 'Search inside the text or titles.',
- 'info' => 'What metadata to return.',
- 'prop' => 'What properties to return.',
- 'redirects' => 'Include redirect pages in the search.',
+ return array(
+ 'search' => 'Search for all page titles (or content) that has this value',
+ 'namespace' => 'The namespace(s) to enumerate',
+ 'what' => 'Search inside the text or titles',
+ 'info' => 'What metadata to return',
+ 'prop' => array(
+ 'What properties to return',
+ ' size - Adds the size of the page in bytes',
+ ' wordcount - Adds the word count of the page',
+ ' timestamp - Adds the timestamp of when the page was last edited',
+ ' score - Adds the score (if any) from the search engine',
+ ' snippet - Adds a parsed snippet of the page',
+ ' titlesnippet - Adds a parsed snippet of the page title',
+ ' redirectsnippet - Adds a parsed snippet of the redirect',
+ ' redirecttitle - Adds a parsed snippet of the redirect title',
+ ' sectionsnippet - Adds a parsed snippet of the matching section',
+ ' sectiontitle - Adds a parsed snippet of the matching section title',
+ ' hasrelated - Indicates whether a related search is available',
+ ),
+ 'redirects' => 'Include redirect pages in the search',
'offset' => 'Use this value to continue paging (return by query)',
- 'limit' => 'How many total pages to return.'
+ 'limit' => 'How many total pages to return'
);
}
public function getDescription() {
return 'Perform a full text search';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => 'param-search', 'info' => 'empty search string is not allowed' ),
array( 'code' => 'search-text-disabled', 'info' => 'text search is disabled' ),
array( 'code' => 'search-title-disabled', 'info' => 'title search is disabled' ),
) );
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=search&srsearch=meaning',
'api.php?action=query&list=search&srwhat=text&srsearch=meaning',
'api.php?action=query&generator=search&gsrsearch=meaning&prop=info',
@@ -238,6 +292,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQuerySearch.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQuerySearch.php 76300 2010-11-08 12:23:24Z reedy $';
}
}
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index 0385e192..379a4228 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 25, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * 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
@@ -19,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -36,16 +37,14 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQuerySiteinfo extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'si' );
+ parent::__construct( $query, $moduleName, 'si' );
}
public function execute() {
$params = $this->extractRequestParams();
$done = array();
- foreach ( $params['prop'] as $p )
- {
- switch ( $p )
- {
+ foreach ( $params['prop'] as $p ) {
+ switch ( $p ) {
case 'general':
$fit = $this->appendGeneralInfo( $p );
break;
@@ -86,11 +85,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
case 'languages':
$fit = $this->appendLanguages( $p );
break;
- default :
- ApiBase :: dieDebug( __METHOD__, "Unknown prop=$p" );
+ default:
+ ApiBase::dieDebug( __METHOD__, "Unknown prop=$p" );
}
- if ( !$fit )
- {
+ if ( !$fit ) {
// Abuse siprop as a query-continue parameter
// and set it to all unprocessed props
$this->setContinueEnumParameter( 'prop', implode( '|',
@@ -103,10 +101,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
protected function appendGeneralInfo( $property ) {
global $wgContLang;
- global $wgLang;
$data = array();
- $mainPage = Title :: newFromText( wfMsgForContent( 'mainpage' ) );
+ $mainPage = Title::newMainPage();
$data['mainpage'] = $mainPage->getPrefixedText();
$data['base'] = $mainPage->getFullUrl();
$data['sitename'] = $GLOBALS['wgSitename'];
@@ -117,26 +114,30 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data['dbversion'] = $this->getDB()->getServerVersion();
$svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
- if ( $svn )
+ if ( $svn ) {
$data['rev'] = $svn;
+ }
// 'case-insensitive' option is reserved for future
$data['case'] = $GLOBALS['wgCapitalLinks'] ? 'first-letter' : 'case-sensitive';
- if ( isset( $GLOBALS['wgRightsCode'] ) )
+ if ( isset( $GLOBALS['wgRightsCode'] ) ) {
$data['rightscode'] = $GLOBALS['wgRightsCode'];
+ }
$data['rights'] = $GLOBALS['wgRightsText'];
$data['lang'] = $GLOBALS['wgLanguageCode'];
- if ( $wgContLang->isRTL() )
+ if ( $wgContLang->isRTL() ) {
$data['rtl'] = '';
- $data['fallback8bitEncoding'] = $wgLang->fallback8bitEncoding();
-
+ }
+ $data['fallback8bitEncoding'] = $wgContLang->fallback8bitEncoding();
+
if ( wfReadOnly() ) {
$data['readonly'] = '';
$data['readonlyreason'] = wfReadOnlyReason();
}
- if ( $GLOBALS['wgEnableWriteAPI'] )
+ if ( $GLOBALS['wgEnableWriteAPI'] ) {
$data['writeapi'] = '';
+ }
$tz = $GLOBALS['wgLocaltimezone'];
$offset = $GLOBALS['wgLocalTZoffset'];
@@ -162,23 +163,25 @@ class ApiQuerySiteinfo extends ApiQueryBase {
protected function appendNamespaces( $property ) {
global $wgContLang;
$data = array();
- foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title )
- {
+ foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
$data[$ns] = array(
'id' => intval( $ns ),
'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
);
- ApiResult :: setContent( $data[$ns], $title );
+ ApiResult::setContent( $data[$ns], $title );
$canonical = MWNamespace::getCanonicalName( $ns );
-
- if ( MWNamespace::hasSubpages( $ns ) )
+
+ if ( MWNamespace::hasSubpages( $ns ) ) {
$data[$ns]['subpages'] = '';
-
- if ( $canonical )
+ }
+
+ if ( $canonical ) {
$data[$ns]['canonical'] = strtr( $canonical, '_', ' ' );
-
- if ( MWNamespace::isContent( $ns ) )
+ }
+
+ if ( MWNamespace::isContent( $ns ) ) {
$data[$ns]['content'] = '';
+ }
}
$this->getResult()->setIndexedTagName( $data, 'ns' );
@@ -198,7 +201,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$item = array(
'id' => intval( $ns )
);
- ApiResult :: setContent( $item, strtr( $title, '_', ' ' ) );
+ ApiResult::setContent( $item, strtr( $title, '_', ' ' ) );
$data[] = $item;
}
@@ -207,9 +210,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
protected function appendSpecialPageAliases( $property ) {
- global $wgLang;
+ global $wgContLang;
$data = array();
- foreach ( $wgLang->getSpecialPageAliases() as $specialpage => $aliases )
+ foreach ( $wgContLang->getSpecialPageAliases() as $specialpage => $aliases )
{
$arr = array( 'realname' => $specialpage, 'aliases' => $aliases );
$this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
@@ -218,16 +221,16 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$this->getResult()->setIndexedTagName( $data, 'specialpage' );
return $this->getResult()->addValue( 'query', $property, $data );
}
-
+
protected function appendMagicWords( $property ) {
global $wgContLang;
$data = array();
- foreach ( $wgContLang->getMagicWords() as $magicword => $aliases )
- {
+ foreach ( $wgContLang->getMagicWords() as $magicword => $aliases ) {
$caseSensitive = array_shift( $aliases );
$arr = array( 'name' => $magicword, 'aliases' => $aliases );
- if ( $caseSensitive )
+ if ( $caseSensitive ) {
$arr['case-sensitive'] = '';
+ }
$this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
$data[] = $arr;
}
@@ -240,34 +243,34 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$this->addTables( 'interwiki' );
$this->addFields( array( 'iw_prefix', 'iw_local', 'iw_url' ) );
- if ( $filter === 'local' )
+ if ( $filter === 'local' ) {
$this->addWhere( 'iw_local = 1' );
- elseif ( $filter === '!local' )
+ } elseif ( $filter === '!local' ) {
$this->addWhere( 'iw_local = 0' );
- elseif ( $filter )
- ApiBase :: dieDebug( __METHOD__, "Unknown filter=$filter" );
+ } elseif ( $filter ) {
+ ApiBase::dieDebug( __METHOD__, "Unknown filter=$filter" );
+ }
$this->addOption( 'ORDER BY', 'iw_prefix' );
- $db = $this->getDB();
$res = $this->select( __METHOD__ );
$data = array();
$langNames = Language::getLanguageNames();
- while ( $row = $db->fetchObject( $res ) )
- {
+ foreach ( $res as $row ) {
$val = array();
$val['prefix'] = $row->iw_prefix;
- if ( $row->iw_local == '1' )
+ if ( $row->iw_local == '1' ) {
$val['local'] = '';
-// $val['trans'] = intval($row->iw_trans); // should this be exposed?
- if ( isset( $langNames[$row->iw_prefix] ) )
+ }
+ // $val['trans'] = intval( $row->iw_trans ); // should this be exposed?
+ if ( isset( $langNames[$row->iw_prefix] ) ) {
$val['language'] = $langNames[$row->iw_prefix];
+ }
$val['url'] = $row->iw_url;
$data[] = $val;
}
- $db->freeResult( $res );
$this->getResult()->setIndexedTagName( $data, 'iw' );
return $this->getResult()->addValue( 'query', $property, $data );
@@ -277,8 +280,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
global $wgShowHostnames;
$data = array();
if ( $includeAll ) {
- if ( !$wgShowHostnames )
+ if ( !$wgShowHostnames ) {
$this->dieUsage( 'Cannot view all servers info unless $wgShowHostnames is true', 'includeAllDenied' );
+ }
$lb = wfGetLB();
$lags = $lb->getLagTimes();
@@ -319,27 +323,52 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
protected function appendUserGroups( $property, $numberInGroup ) {
- global $wgGroupPermissions;
+ global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+
$data = array();
foreach ( $wgGroupPermissions as $group => $permissions ) {
$arr = array(
'name' => $group,
'rights' => array_keys( $permissions, true ),
);
- if ( $numberInGroup )
- $arr['number'] = SiteStats::numberInGroup( $group );
+
+ if ( $numberInGroup ) {
+ global $wgAutopromote;
+
+ if ( $group == 'user' ) {
+ $arr['number'] = SiteStats::users();
+
+ // '*' and autopromote groups have no size
+ } elseif ( $group !== '*' && !isset( $wgAutopromote[$group] ) ) {
+ $arr['number'] = SiteStats::numberInGroup( $group );
+ }
+ }
+
+ $groupArr = array(
+ 'add' => $wgAddGroups,
+ 'remove' => $wgRemoveGroups,
+ 'add-self' => $wgGroupsAddToSelf,
+ 'remove-self' => $wgGroupsRemoveFromSelf
+ );
+
+ foreach( $groupArr as $type => $rights ) {
+ if( isset( $rights[$group] ) ) {
+ $arr[$type] = $rights[$group];
+ $this->getResult()->setIndexedTagName( $arr[$type], 'group' );
+ }
+ }
$this->getResult()->setIndexedTagName( $arr['rights'], 'permission' );
$data[] = $arr;
}
-
+
$this->getResult()->setIndexedTagName( $data, 'group' );
return $this->getResult()->addValue( 'query', $property, $data );
}
-
+
protected function appendFileExtensions( $property ) {
global $wgFileExtensions;
-
+
$data = array();
foreach ( $wgFileExtensions as $ext ) {
$data[] = array( 'ext' => $ext );
@@ -355,10 +384,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
foreach ( $extensions as $ext ) {
$ret = array();
$ret['type'] = $type;
- if ( isset( $ext['name'] ) )
+ if ( isset( $ext['name'] ) ) {
$ret['name'] = $ext['name'];
- if ( isset( $ext['description'] ) )
+ }
+ if ( isset( $ext['description'] ) ) {
$ret['description'] = $ext['description'];
+ }
if ( isset( $ext['descriptionmsg'] ) ) {
// Can be a string or array( key, param1, param2, ... )
if ( is_array( $ext['descriptionmsg'] ) ) {
@@ -428,9 +459,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
public function getAllowedParams() {
return array(
'prop' => array(
- ApiBase :: PARAM_DFLT => 'general',
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_DFLT => 'general',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'general',
'namespaces',
'namespacealiases',
@@ -447,7 +478,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
)
),
'filteriw' => array(
- ApiBase :: PARAM_TYPE => array(
+ ApiBase::PARAM_TYPE => array(
'local',
'!local',
)
@@ -461,19 +492,19 @@ class ApiQuerySiteinfo extends ApiQueryBase {
return array(
'prop' => array(
'Which sysinfo properties to get:',
- ' general - Overall system information',
- ' namespaces - List of registered namespaces and their canonical names',
- ' namespacealiases - List of registered namespace aliases',
- ' specialpagealiases - List of special page aliases',
- ' magicwords - List of magic words and their aliases',
- ' statistics - Returns site statistics',
- ' interwikimap - Returns interwiki map (optionally filtered)',
- ' dbrepllag - Returns database server with the highest replication lag',
- ' usergroups - Returns user groups and the associated permissions',
- ' extensions - Returns extensions installed on the wiki',
- ' fileextensions - Returns list of file extensions allowed to be uploaded',
- ' rightsinfo - Returns wiki rights (license) information if available',
- ' languages - Returns a list of languages MediaWiki supports',
+ ' general - Overall system information',
+ ' namespaces - List of registered namespaces and their canonical names',
+ ' namespacealiases - List of registered namespace aliases',
+ ' specialpagealiases - List of special page aliases',
+ ' magicwords - List of magic words and their aliases',
+ ' statistics - Returns site statistics',
+ ' interwikimap - Returns interwiki map (optionally filtered)',
+ ' dbrepllag - Returns database server with the highest replication lag',
+ ' usergroups - Returns user groups and the associated permissions',
+ ' extensions - Returns extensions installed on the wiki',
+ ' fileextensions - Returns list of file extensions allowed to be uploaded',
+ ' rightsinfo - Returns wiki rights (license) information if available',
+ ' languages - Returns a list of languages MediaWiki supports',
),
'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
'showalldb' => 'List all database servers, not just the one lagging the most',
@@ -482,7 +513,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
public function getDescription() {
- return 'Return general information about the site.';
+ return 'Return general information about the site';
}
public function getPossibleErrors() {
@@ -495,11 +526,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
return array(
'api.php?action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics',
'api.php?action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local',
- 'api.php?action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb',
- );
+ 'api.php?action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb=',
+ );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQuerySiteinfo.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQuerySiteinfo.php 77192 2010-11-23 22:05:27Z btongminh $';
}
}
diff --git a/includes/api/ApiQueryStashImageInfo.php b/includes/api/ApiQueryStashImageInfo.php
new file mode 100644
index 00000000..769b3e9d
--- /dev/null
+++ b/includes/api/ApiQueryStashImageInfo.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * API for MediaWiki 1.16+
+ *
+ * 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 get image information from temporarily stashed files.
+ *
+ * @ingroup API
+ */
+class ApiQueryStashImageInfo extends ApiQueryImageInfo {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'sii' );
+ }
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $modulePrefix = $this->getModulePrefix();
+
+ $prop = array_flip( $params['prop'] );
+
+ $scale = $this->getScale( $params );
+
+ $result = $this->getResult();
+
+ try {
+ $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+
+ foreach ( $params['sessionkey'] as $sessionkey ) {
+ $file = $stash->getFile( $sessionkey );
+ $imageInfo = self::getInfo( $file, $prop, $result, $scale );
+ $result->addValue( array( 'query', $this->getModuleName() ), null, $imageInfo );
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $modulePrefix );
+ }
+
+ } catch ( UploadStashNotAvailableException $e ) {
+ $this->dieUsage( "Session not available: " . $e->getMessage(), "nosession" );
+ } catch ( UploadStashFileNotFoundException $e ) {
+ $this->dieUsage( "File not found: " . $e->getMessage(), "invalidsessiondata" );
+ } catch ( UploadStashBadPathException $e ) {
+ $this->dieUsage( "Bad path: " . $e->getMessage(), "invalidsessiondata" );
+ }
+
+ }
+
+ /**
+ * Returns all valid parameters to siiprop
+ */
+ public static function getPropertyNames() {
+ return array(
+ 'timestamp',
+ 'url',
+ 'size',
+ 'dimensions', // For backwards compatibility with Allimages
+ 'sha1',
+ 'mime',
+ 'thumbmime',
+ 'metadata',
+ 'bitdepth',
+ );
+ }
+
+
+ public function getAllowedParams() {
+ return array(
+ 'sessionkey' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_REQUIRED => true,
+ ApiBase::PARAM_DFLT => null
+ ),
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'timestamp|url',
+ ApiBase::PARAM_TYPE => self::getPropertyNames()
+ ),
+ 'urlwidth' => array(
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_DFLT => -1
+ ),
+ 'urlheight' => array(
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_DFLT => -1
+ )
+ );
+ }
+
+ /**
+ * Return the API documentation for the parameters.
+ * @return {Array} parameter documentation.
+ */
+ public function getParamDescription() {
+ $p = $this->getModulePrefix();
+ return array(
+ 'prop' => array(
+ 'What image information to get:',
+ ' timestamp - Adds timestamp for the uploaded version',
+ ' url - Gives URL to the image and the description page',
+ ' size - Adds the size of the image in bytes and the height and width',
+ ' dimensions - Alias for size',
+ ' sha1 - Adds sha1 hash for the image',
+ ' mime - Adds MIME of the image',
+ ' thumbmime - Adss MIME of the image thumbnail (requires url)',
+ ' metadata - Lists EXIF metadata for the version of the image',
+ ' bitdepth - Adds the bit depth of the version',
+ ),
+ 'sessionkey' => 'Session key that identifies a previous upload that was stashed temporarily.',
+ 'urlwidth' => "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
+ 'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth"
+ );
+ }
+
+ public function getDescription() {
+ return 'Returns image information for stashed images';
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'code' => 'siiurlwidth', 'info' => 'siiurlheight cannot be used without iiurlwidth' ),
+ ) );
+ }
+
+ protected function getExamples() {
+ return array(
+ 'api.php?action=query&prop=stashimageinfo&siisessionkey=124sd34rsdf567',
+ 'api.php?action=query&prop=stashimageinfo&siisessionkey=b34edoe3|bceffd4&siiurlwidth=120&siiprop=url',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryStashImageInfo.php 81000 2011-01-25 22:49:34Z catrope $';
+ }
+
+}
+
diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php
index a5d152bc..e88ec9b5 100644
--- a/includes/api/ApiQueryTags.php
+++ b/includes/api/ApiQueryTags.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Jul 9, 2009
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2009
+ * Created on Jul 9, 2009
+ *
+ * Copyright © 2009
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -34,148 +35,154 @@ if ( !defined( 'MEDIAWIKI' ) ) {
* @ingroup API
*/
class ApiQueryTags extends ApiQueryBase {
-
+
private $limit, $result;
private $fld_displayname = false, $fld_description = false,
$fld_hitcount = false;
-
+
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'tg' );
+ parent::__construct( $query, $moduleName, 'tg' );
}
public function execute() {
$params = $this->extractRequestParams();
-
+
$prop = array_flip( $params['prop'] );
-
+
$this->fld_displayname = isset( $prop['displayname'] );
$this->fld_description = isset( $prop['description'] );
$this->fld_hitcount = isset( $prop['hitcount'] );
-
+
$this->limit = $params['limit'];
$this->result = $this->getResult();
-
- $pageSet = $this->getPageSet();
- $titles = $pageSet->getTitles();
- $data = array();
-
+
$this->addTables( 'change_tag' );
$this->addFields( 'ct_tag' );
-
- if ( $this->fld_hitcount )
+
+ if ( $this->fld_hitcount ) {
$this->addFields( 'count(*) AS hitcount' );
-
+ }
+
$this->addOption( 'LIMIT', $this->limit + 1 );
$this->addOption( 'GROUP BY', 'ct_tag' );
$this->addWhereRange( 'ct_tag', 'newer', $params['continue'], null );
-
+
$res = $this->select( __METHOD__ );
-
+
$ok = true;
-
- while ( $row = $res->fetchObject() ) {
- if ( !$ok ) break;
+
+ foreach ( $res as $row ) {
+ if ( !$ok ) {
+ break;
+ }
$ok = $this->doTag( $row->ct_tag, $row->hitcount );
}
-
+
// include tags with no hits yet
foreach ( ChangeTags::listDefinedTags() as $tag ) {
- if ( !$ok ) break;
+ if ( !$ok ) {
+ break;
+ }
$ok = $this->doTag( $tag, 0 );
}
-
+
$this->result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'tag' );
}
-
+
private function doTag( $tagName, $hitcount ) {
static $count = 0;
static $doneTags = array();
-
+
if ( in_array( $tagName, $doneTags ) ) {
return true;
}
-
- if ( ++$count > $this->limit )
- {
+
+ if ( ++$count > $this->limit ) {
$this->setContinueEnumParameter( 'continue', $tagName );
return false;
}
-
+
$tag = array();
$tag['name'] = $tagName;
-
- if ( $this->fld_displayname )
+
+ if ( $this->fld_displayname ) {
$tag['displayname'] = ChangeTags::tagDescription( $tagName );
-
- if ( $this->fld_description )
- {
+ }
+
+ if ( $this->fld_description ) {
$msg = wfMsg( "tag-$tagName-description" );
$msg = wfEmptyMsg( "tag-$tagName-description", $msg ) ? '' : $msg;
$tag['description'] = $msg;
}
-
- if ( $this->fld_hitcount )
+
+ if ( $this->fld_hitcount ) {
$tag['hitcount'] = $hitcount;
-
+ }
+
$doneTags[] = $tagName;
-
+
$fit = $this->result->addValue( array( 'query', $this->getModuleName() ), null, $tag );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $tagName );
return false;
}
-
+
return true;
}
-
+
public function getCacheMode( $params ) {
return 'public';
}
public function getAllowedParams() {
- return array (
+ return array(
'continue' => array(
),
'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
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'prop' => array(
- ApiBase :: PARAM_DFLT => 'name',
- ApiBase :: PARAM_TYPE => array(
- 'name',
- 'displayname',
- 'description',
- 'hitcount'
- ),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_DFLT => 'name',
+ ApiBase::PARAM_TYPE => array(
+ 'name',
+ 'displayname',
+ 'description',
+ 'hitcount'
+ ),
+ ApiBase::PARAM_ISMULTI => true
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'continue' => 'When more results are available, use this to continue',
'limit' => 'The maximum number of tags to list',
- 'prop' => 'Which properties to get',
+ 'prop' => array(
+ 'Which properties to get',
+ ' name - Adds name of tag',
+ ' displayname - Adds system messsage for the tag',
+ ' description - Adds description of the tag',
+ ' hitcount - Adds the amount of revisions that have this tag',
+ ),
);
}
public function getDescription() {
- return 'List change tags.';
+ return 'List change tags';
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryTags.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryTags.php 73858 2010-09-28 01:21:15Z reedy $';
}
}
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php
index b51b9adb..5d63fa60 100644
--- a/includes/api/ApiQueryUserContributions.php
+++ b/includes/api/ApiQueryUserContributions.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 16, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Oct 16, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -36,13 +37,13 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryContributions extends ApiQueryBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'uc' );
+ parent::__construct( $query, $moduleName, 'uc' );
}
- private $params, $username;
+ private $params, $prefixMode, $userprefix, $multiUserMode, $usernames;
private $fld_ids = false, $fld_title = false, $fld_timestamp = false,
$fld_comment = false, $fld_parsedcomment = false, $fld_flags = false,
- $fld_patrolled = false, $fld_tags = false;
+ $fld_patrolled = false, $fld_tags = false, $fld_size = false;
public function execute() {
// Parse some parameters
@@ -61,23 +62,22 @@ class ApiQueryContributions extends ApiQueryBase {
// TODO: if the query is going only against the revision table, should this be done?
$this->selectNamedDB( 'contributions', DB_SLAVE, 'contributions' );
- $db = $this->getDB();
- if ( isset( $this->params['userprefix'] ) )
- {
+ if ( isset( $this->params['userprefix'] ) ) {
$this->prefixMode = true;
$this->multiUserMode = true;
$this->userprefix = $this->params['userprefix'];
- }
- else
- {
+ } else {
$this->usernames = array();
- if ( !is_array( $this->params['user'] ) )
+ if ( !is_array( $this->params['user'] ) ) {
$this->params['user'] = array( $this->params['user'] );
- if ( !count( $this->params['user'] ) )
+ }
+ if ( !count( $this->params['user'] ) ) {
$this->dieUsage( 'User parameter may not be empty.', 'param_user' );
- foreach ( $this->params['user'] as $u )
+ }
+ foreach ( $this->params['user'] as $u ) {
$this->prepareUsername( $u );
+ }
$this->prefixMode = false;
$this->multiUserMode = ( count( $this->params['user'] ) > 1 );
}
@@ -91,31 +91,29 @@ class ApiQueryContributions extends ApiQueryBase {
$limit = $this->params['limit'];
// Fetch each row
- while ( $row = $db->fetchObject( $res ) ) {
+ 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...
- if ( $this->multiUserMode )
+ if ( $this->multiUserMode ) {
$this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
- else
+ } else {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rev_timestamp ) );
+ }
break;
}
$vals = $this->extractRowInfo( $row );
$fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
- if ( $this->multiUserMode )
+ if ( !$fit ) {
+ if ( $this->multiUserMode ) {
$this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
- else
+ } else {
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rev_timestamp ) );
+ }
break;
}
}
- // Free the database record so the connection can get on with other stuff
- $db->freeResult( $res );
-
$this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'item' );
}
@@ -150,32 +148,37 @@ class ApiQueryContributions extends ApiQueryBase {
$this->addWhere( 'page_id=rev_page' );
// Handle continue parameter
- if ( $this->multiUserMode && !is_null( $this->params['continue'] ) )
- {
+ if ( $this->multiUserMode && !is_null( $this->params['continue'] ) ) {
$continue = explode( '|', $this->params['continue'] );
- if ( count( $continue ) != 2 )
- $this->dieUsage( "Invalid continue param. You should pass the original " .
- "value returned by the previous query", "_badcontinue" );
+ if ( count( $continue ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the original ' .
+ 'value returned by the previous query', '_badcontinue' );
+ }
$encUser = $this->getDB()->strencode( $continue[0] );
$encTS = wfTimestamp( TS_MW, $continue[1] );
$op = ( $this->params['dir'] == 'older' ? '<' : '>' );
- $this->addWhere( "rev_user_text $op '$encUser' OR " .
- "(rev_user_text = '$encUser' AND " .
- "rev_timestamp $op= '$encTS')" );
+ $this->addWhere(
+ "rev_user_text $op '$encUser' OR " .
+ "(rev_user_text = '$encUser' AND " .
+ "rev_timestamp $op= '$encTS')"
+ );
}
- if ( !$wgUser->isAllowed( 'hideuser' ) )
+ if ( !$wgUser->isAllowed( 'hideuser' ) ) {
$this->addWhere( $this->getDB()->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+ }
// We only want pages by the specified users.
- if ( $this->prefixMode )
+ if ( $this->prefixMode ) {
$this->addWhere( 'rev_user_text' . $this->getDB()->buildLike( $this->userprefix, $this->getDB()->anyString() ) );
- else
+ } else {
$this->addWhereFld( 'rev_user_text', $this->usernames );
+ }
// ... and in the specified timeframe.
// Ensure the same sort order for rev_user_text and rev_timestamp
// so our query is indexed
- if ( $this->multiUserMode )
+ if ( $this->multiUserMode ) {
$this->addWhereRange( 'rev_user_text', $this->params['dir'], null, null );
+ }
$this->addWhereRange( 'rev_timestamp',
$this->params['dir'], $this->params['start'], $this->params['end'] );
$this->addWhereFld( 'page_namespace', $this->params['namespace'] );
@@ -184,8 +187,9 @@ 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( array( 'show' ) );
+ }
$this->addWhereIf( 'rev_minor_edit = 0', isset( $show['!minor'] ) );
$this->addWhereIf( 'rev_minor_edit != 0', isset( $show['minor'] ) );
@@ -202,22 +206,22 @@ class ApiQueryContributions extends ApiQueryBase {
'rev_timestamp',
'page_namespace',
'page_title',
+ 'rev_user',
'rev_user_text',
'rev_deleted'
) );
-
+
if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ||
- $this->fld_patrolled )
- {
- global $wgUser;
- if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() )
- $this->dieUsage( "You need the patrol right to request the patrolled flag", 'permissiondenied' );
+ $this->fld_patrolled ) {
+ if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+ }
+
// Use a redundant join condition on both
// timestamp and ID so we can use the timestamp
// index
$index['recentchanges'] = 'rc_user_text';
- if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) )
- {
+ if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
// Put the tables in the right order for
// STRAIGHT_JOIN
$tables = array( 'revision', 'recentchanges', 'page' );
@@ -225,9 +229,7 @@ class ApiQueryContributions extends ApiQueryBase {
$this->addWhere( 'rc_user_text=rev_user_text' );
$this->addWhere( 'rc_timestamp=rev_timestamp' );
$this->addWhere( 'rc_this_oldid=rev_id' );
- }
- else
- {
+ } else {
$tables[] = 'recentchanges';
$this->addJoinConds( array( 'recentchanges' => array(
'LEFT JOIN', array(
@@ -241,28 +243,27 @@ class ApiQueryContributions extends ApiQueryBase {
$this->addFieldsIf( 'rev_page', $this->fld_ids );
$this->addFieldsIf( 'rev_id', $this->fld_ids || $this->fld_flags );
$this->addFieldsIf( 'page_latest', $this->fld_flags );
- // $this->addFieldsIf('rev_text_id', $this->fld_ids); // Should this field be exposed?
+ // $this->addFieldsIf( 'rev_text_id', $this->fld_ids ); // Should this field be exposed?
$this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'rev_len', $this->fld_size );
$this->addFieldsIf( 'rev_minor_edit', $this->fld_flags );
$this->addFieldsIf( 'rev_parent_id', $this->fld_flags );
$this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
-
- if ( $this->fld_tags )
- {
+
+ if ( $this->fld_tags ) {
$this->addTables( 'tag_summary' );
$this->addJoinConds( array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) ) );
$this->addFields( 'ts_tags' );
}
-
+
if ( isset( $this->params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
$this->addWhereFld( 'ct_tag', $this->params['tag'] );
global $wgOldChangeTagsIndex;
- $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+ $index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
}
-
+
$this->addOption( 'USE INDEX', $index );
}
@@ -270,42 +271,49 @@ class ApiQueryContributions extends ApiQueryBase {
* Extract fields from the database row and append them to a result array
*/
private function extractRowInfo( $row ) {
-
$vals = array();
+ $vals['userid'] = $row->rev_user;
$vals['user'] = $row->rev_user_text;
- if ( $row->rev_deleted & Revision::DELETED_USER )
+ if ( $row->rev_deleted & Revision::DELETED_USER ) {
$vals['userhidden'] = '';
+ }
if ( $this->fld_ids ) {
$vals['pageid'] = intval( $row->rev_page );
$vals['revid'] = intval( $row->rev_id );
- // $vals['textid'] = intval($row->rev_text_id); // todo: Should this field be exposed?
+ // $vals['textid'] = intval( $row->rev_text_id ); // todo: Should this field be exposed?
}
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- if ( $this->fld_title )
+ if ( $this->fld_title ) {
ApiQueryBase::addTitleInfo( $vals, $title );
+ }
- if ( $this->fld_timestamp )
+ if ( $this->fld_timestamp ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->rev_timestamp );
+ }
if ( $this->fld_flags ) {
- if ( $row->rev_parent_id == 0 && !is_null( $row->rev_parent_id ) )
+ if ( $row->rev_parent_id == 0 && !is_null( $row->rev_parent_id ) ) {
$vals['new'] = '';
- if ( $row->rev_minor_edit )
+ }
+ if ( $row->rev_minor_edit ) {
$vals['minor'] = '';
- if ( $row->page_latest == $row->rev_id )
+ }
+ if ( $row->page_latest == $row->rev_id ) {
$vals['top'] = '';
+ }
}
if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->rev_comment ) ) {
- if ( $row->rev_deleted & Revision::DELETED_COMMENT )
+ if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
$vals['commenthidden'] = '';
- else {
- if ( $this->fld_comment )
+ } else {
+ if ( $this->fld_comment ) {
$vals['comment'] = $row->rev_comment;
-
+ }
+
if ( $this->fld_parsedcomment ) {
global $wgUser;
$vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->rev_comment, $title );
@@ -313,11 +321,13 @@ class ApiQueryContributions extends ApiQueryBase {
}
}
- if ( $this->fld_patrolled && $row->rc_patrolled )
+ if ( $this->fld_patrolled && $row->rc_patrolled ) {
$vals['patrolled'] = '';
-
- if ( $this->fld_size && !is_null( $row->rev_len ) )
+ }
+
+ if ( $this->fld_size && !is_null( $row->rev_len ) ) {
$vals['size'] = intval( $row->rev_len );
+ }
if ( $this->fld_tags ) {
if ( $row->ts_tags ) {
@@ -328,12 +338,11 @@ class ApiQueryContributions extends ApiQueryBase {
$vals['tags'] = array();
}
}
-
+
return $vals;
}
-
- private function continueStr( $row )
- {
+
+ private function continueStr( $row ) {
return $row->rev_user_text . '|' .
wfTimestamp( TS_ISO_8601, $row->rev_timestamp );
}
@@ -345,40 +354,40 @@ class ApiQueryContributions extends ApiQueryBase {
}
public function getAllowedParams() {
- return array (
- '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
+ return array(
+ '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
),
- 'start' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'start' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'end' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'end' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'continue' => null,
- 'user' => array (
- ApiBase :: PARAM_ISMULTI => true
+ 'user' => array(
+ ApiBase::PARAM_ISMULTI => true
),
'userprefix' => null,
- 'dir' => array (
- ApiBase :: PARAM_DFLT => 'older',
- ApiBase :: PARAM_TYPE => array (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'older',
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
)
),
- 'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace'
+ 'namespace' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace'
),
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_DFLT => 'ids|title|timestamp|comment|size|flags',
- ApiBase :: PARAM_TYPE => array (
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'ids|title|timestamp|comment|size|flags',
+ ApiBase::PARAM_TYPE => array(
'ids',
'title',
'timestamp',
@@ -390,9 +399,9 @@ class ApiQueryContributions extends ApiQueryBase {
'tags'
)
),
- 'show' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'show' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'minor',
'!minor',
'patrolled',
@@ -404,18 +413,31 @@ class ApiQueryContributions extends ApiQueryBase {
}
public function getParamDescription() {
- return array (
- 'limit' => 'The maximum number of contributions to return.',
- 'start' => 'The start timestamp to return from.',
- 'end' => 'The end timestamp to return to.',
- 'continue' => 'When more results are available, use this to continue.',
- 'user' => 'The user to retrieve contributions for.',
- 'userprefix' => 'Retrieve contibutions for all users whose names begin with this value. Overrides ucuser.',
- 'dir' => 'The direction to search (older or newer).',
+ global $wgRCMaxAge;
+ $p = $this->getModulePrefix();
+ return array(
+ 'limit' => 'The maximum number of contributions to return',
+ 'start' => 'The start timestamp to return from',
+ 'end' => 'The end timestamp to return to',
+ 'continue' => 'When more results are available, use this to continue',
+ 'user' => 'The users to retrieve contributions for',
+ 'userprefix' => "Retrieve contibutions for all users whose names begin with this value. Overrides {$p}user",
+ 'dir' => 'The direction to search (older or newer)',
'namespace' => 'Only list contributions in these namespaces',
- 'prop' => 'Include additional pieces of information',
- 'show' => array( 'Show only items that meet this criteria, e.g. non minor edits only: show=!minor',
- 'NOTE: if show=patrolled or show=!patrolled is set, revisions older than $wgRCMaxAge won\'t be shown', ),
+ 'prop' => array(
+ 'Include additional pieces of information',
+ ' ids - Adds the page id and revision id',
+ ' title - Adds the title and namespace id of the page',
+ ' timestamp - Adds the timestamp of the edit',
+ ' comment - Adds the comment of the edit',
+ ' parsedcomment - Adds the parsed comment of the edit',
+ ' size - Adds the size of the page',
+ ' flags - Adds flags of the edit',
+ ' patrolled - Tags patrolled edits',
+ ' tags - Lists tags for the edit',
+ ),
+ 'show' => array( "Show only items that meet this criteria, e.g. non minor edits only: {$p}show=!minor",
+ "NOTE: if {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than $wgRCMaxAge won\'t be shown", ),
'tag' => 'Only list revisions tagged with this tag',
);
}
@@ -423,7 +445,7 @@ class ApiQueryContributions extends ApiQueryBase {
public function getDescription() {
return 'Get all edits by a user';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'param_user', 'info' => 'User parameter may not be empty.' ),
@@ -434,13 +456,13 @@ class ApiQueryContributions extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=usercontribs&ucuser=YurikBot',
'api.php?action=query&list=usercontribs&ucuserprefix=217.121.114.',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryUserContributions.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryUserContributions.php 75096 2010-10-20 18:50:33Z reedy $';
}
}
diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php
index 42cb47b9..ec7b74b3 100644
--- a/includes/api/ApiQueryUserInfo.php
+++ b/includes/api/ApiQueryUserInfo.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 30, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on July 30, 2007
+ *
+ * Copyright © 2007 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -35,33 +36,34 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*/
class ApiQueryUserInfo extends ApiQueryBase {
+ private $prop = array();
+
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'ui' );
+ parent::__construct( $query, $moduleName, 'ui' );
}
public function execute() {
$params = $this->extractRequestParams();
$result = $this->getResult();
- $r = array();
if ( !is_null( $params['prop'] ) ) {
$this->prop = array_flip( $params['prop'] );
- } else {
- $this->prop = array();
}
+
$r = $this->getCurrentUserInfo();
- $result->addValue( "query", $this->getModuleName(), $r );
+ $result->addValue( 'query', $this->getModuleName(), $r );
}
protected function getCurrentUserInfo() {
- global $wgUser;
+ global $wgUser, $wgRequest;
$result = $this->getResult();
$vals = array();
$vals['id'] = intval( $wgUser->getId() );
$vals['name'] = $wgUser->getName();
- if ( $wgUser->isAnon() )
+ if ( $wgUser->isAnon() ) {
$vals['anon'] = '';
+ }
if ( isset( $this->prop['blockinfo'] ) ) {
if ( $wgUser->isBlocked() ) {
@@ -75,7 +77,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
if ( isset( $this->prop['groups'] ) ) {
- $vals['groups'] = $wgUser->getGroups();
+ $autolist = ApiQueryUsers::getAutoGroups( $wgUser );
+
+ $vals['groups'] = array_merge( $autolist, $wgUser->getGroups() );
$result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
}
@@ -97,7 +101,11 @@ class ApiQueryUserInfo extends ApiQueryBase {
$vals['options'] = $wgUser->getOptions();
}
- if ( isset( $this->prop['preferencestoken'] ) && is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) {
+ if (
+ isset( $this->prop['preferencestoken'] ) &&
+ is_null( $this->getMain()->getRequest()->getVal( 'callback' ) )
+ )
+ {
$vals['preferencestoken'] = $wgUser->editToken();
}
@@ -112,26 +120,39 @@ class ApiQueryUserInfo extends ApiQueryBase {
if ( isset( $this->prop['email'] ) ) {
$vals['email'] = $wgUser->getEmail();
$auth = $wgUser->getEmailAuthenticationTimestamp();
- if ( !is_null( $auth ) )
+ if ( !is_null( $auth ) ) {
$vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
+ }
+ }
+
+ if ( isset( $this->prop['acceptlang'] ) ) {
+ $langs = $wgRequest->getAcceptLang();
+ $acceptLang = array();
+ foreach ( $langs as $lang => $val ) {
+ $r = array( 'q' => $val );
+ ApiResult::setContent( $r, $lang );
+ $acceptLang[] = $r;
+ }
+ $result->setIndexedTagName( $acceptLang, 'lang' );
+ $vals['acceptlang'] = $acceptLang;
}
return $vals;
}
- protected function getRateLimits()
- {
+ protected function getRateLimits() {
global $wgUser, $wgRateLimits;
- if ( !$wgUser->isPingLimitable() )
+ if ( !$wgUser->isPingLimitable() ) {
return array(); // No limits
+ }
// Find out which categories we belong to
$categories = array();
- if ( $wgUser->isAnon() )
+ if ( $wgUser->isAnon() ) {
$categories[] = 'anon';
- else
+ } else {
$categories[] = 'user';
- if ( $wgUser->isNewBie() )
- {
+ }
+ if ( $wgUser->isNewbie() ) {
$categories[] = 'ip';
$categories[] = 'subnet';
if ( !$wgUser->isAnon() )
@@ -141,22 +162,23 @@ class ApiQueryUserInfo extends ApiQueryBase {
// Now get the actual limits
$retval = array();
- foreach ( $wgRateLimits as $action => $limits )
- foreach ( $categories as $cat )
- if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) )
- {
+ foreach ( $wgRateLimits as $action => $limits ) {
+ foreach ( $categories as $cat ) {
+ if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) ) {
$retval[$action][$cat]['hits'] = intval( $limits[$cat][0] );
$retval[$action][$cat]['seconds'] = intval( $limits[$cat][1] );
}
+ }
+ }
return $retval;
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_DFLT => null,
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => null,
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'blockinfo',
'hasmsg',
'groups',
@@ -167,23 +189,26 @@ class ApiQueryUserInfo extends ApiQueryBase {
'editcount',
'ratelimits',
'email',
+ 'acceptlang',
)
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'prop' => array(
'What pieces of information to include',
- ' blockinfo - tags if the current user is blocked, by whom, and for what reason',
- ' hasmsg - adds a tag "message" if the current user has pending messages',
- ' groups - lists all the groups the current user belongs to',
- ' rights - lists all the rights the current user has',
- ' changeablegroups - lists the groups the current user can add to and remove from',
- ' options - lists all preferences the current user has set',
- ' editcount - adds the current user\'s edit count',
- ' ratelimits - lists all rate limits applying to the current user'
+ ' blockinfo - Tags if the current user is blocked, by whom, and for what reason',
+ ' hasmsg - Adds a tag "message" if the current user has pending messages',
+ ' groups - Lists all the groups the current user belongs to',
+ ' rights - Lists all the rights the current user has',
+ ' changeablegroups - Lists the groups the current user can add to and remove from',
+ ' options - Lists all preferences the current user has set',
+ ' editcount - Adds the current user\'s edit count',
+ ' ratelimits - Lists all rate limits applying to the current user',
+ ' email - Adds the user\'s email address and email authentication date',
+ ' acceptlang - Echoes the Accept-Language header sent by the client in a structured format',
)
);
}
@@ -193,13 +218,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&meta=userinfo',
'api.php?action=query&meta=userinfo&uiprop=blockinfo|groups|rights|hasmsg',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryUserInfo.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryUserInfo.php 75937 2010-11-03 17:01:21Z reedy $';
}
}
diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php
index 5dc0e4a6..2619d200 100644
--- a/includes/api/ApiQueryUsers.php
+++ b/includes/api/ApiQueryUsers.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on July 30, 2007
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on July 30, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -35,24 +36,28 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*/
class ApiQueryUsers extends ApiQueryBase {
+ private $tokenFunctions, $prop;
+
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'us' );
+ parent::__construct( $query, $moduleName, 'us' );
}
-
+
/**
* Get an array mapping token names to their handler functions.
* The prototype for a token function is func($user)
* it should return a token or false (permission denied)
- * @return array(tokenname => function)
+ * @return Array tokenname => function
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
- if ( isset( $this->tokenFunctions ) )
+ if ( isset( $this->tokenFunctions ) ) {
return $this->tokenFunctions;
+ }
// If we're in JSON callback mode, no tokens can be obtained
- if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) )
+ if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) {
return array();
+ }
$this->tokenFunctions = array(
'userrights' => array( 'ApiQueryUsers', 'getUserrightsToken' ),
@@ -60,9 +65,8 @@ if ( !defined( 'MEDIAWIKI' ) ) {
wfRunHooks( 'APIQueryUsersTokens', array( &$this->tokenFunctions ) );
return $this->tokenFunctions;
}
-
- public static function getUserrightsToken( $user )
- {
+
+ public static function getUserrightsToken( $user ) {
global $wgUser;
// Since the permissions check for userrights is non-trivial,
// don't bother with it here
@@ -71,8 +75,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
public function execute() {
$params = $this->extractRequestParams();
- $result = $this->getResult();
- $r = array();
if ( !is_null( $params['prop'] ) ) {
$this->prop = array_flip( $params['prop'] );
@@ -86,27 +88,23 @@ if ( !defined( 'MEDIAWIKI' ) ) {
// Canonicalize user names
foreach ( $users as $u ) {
$n = User::getCanonicalName( $u );
- if ( $n === false || $n === '' )
- {
+ if ( $n === false || $n === '' ) {
$vals = array( 'name' => $u, 'invalid' => '' );
$fit = $result->addValue( array( 'query', $this->getModuleName() ),
null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'users',
implode( '|', array_diff( $users, $done ) ) );
$goodNames = array();
break;
}
$done[] = $u;
- }
- else
+ } else {
$goodNames[] = $n;
+ }
}
- if ( count( $goodNames ) )
- {
- $db = $this->getDb();
+ if ( count( $goodNames ) ) {
$this->addTables( 'user', 'u1' );
$this->addFields( 'u1.*' );
$this->addWhereFld( 'u1.user_name', $goodNames );
@@ -116,35 +114,50 @@ if ( !defined( 'MEDIAWIKI' ) ) {
$this->addJoinConds( array( 'user_groups' => array( 'LEFT JOIN', 'ug_user=u1.user_id' ) ) );
$this->addFields( 'ug_group' );
}
- if ( isset( $this->prop['blockinfo'] ) ) {
- $this->addTables( 'ipblocks' );
- $this->addTables( 'user', 'u2' );
- $u2 = $this->getAliasedName( 'user', 'u2' );
- $this->addJoinConds( array(
- 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=u1.user_id' ),
- $u2 => array( 'LEFT JOIN', 'ipb_by=u2.user_id' ) ) );
- $this->addFields( array( 'ipb_reason', 'u2.user_name AS blocker_name' ) );
- }
+
+ $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
$data = array();
$res = $this->select( __METHOD__ );
- while ( ( $r = $db->fetchObject( $res ) ) ) {
- $user = User::newFromRow( $r );
+ foreach ( $res as $row ) {
+ $user = User::newFromRow( $row );
$name = $user->getName();
$data[$name]['name'] = $name;
- if ( isset( $this->prop['editcount'] ) )
+
+ if ( isset( $this->prop['editcount'] ) ) {
$data[$name]['editcount'] = intval( $user->getEditCount() );
- if ( isset( $this->prop['registration'] ) )
+ }
+
+ if ( isset( $this->prop['registration'] ) ) {
$data[$name]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
- if ( isset( $this->prop['groups'] ) && !is_null( $r->ug_group ) )
+ }
+
+ if ( isset( $this->prop['groups'] ) && !is_null( $row->ug_group ) ) {
// This row contains only one group, others will be added from other rows
- $data[$name]['groups'][] = $r->ug_group;
- if ( isset( $this->prop['blockinfo'] ) && !is_null( $r->blocker_name ) ) {
- $data[$name]['blockedby'] = $r->blocker_name;
- $data[$name]['blockreason'] = $r->ipb_reason;
+ $data[$name]['groups'][] = $row->ug_group;
}
- if ( isset( $this->prop['emailable'] ) && $user->canReceiveEmail() )
+
+ if ( isset( $this->prop['rights'] ) && !is_null( $row->ug_group ) ) {
+ if ( !isset( $data[$name]['rights'] ) ) {
+ $data[$name]['rights'] = User::getGroupPermissions( User::getImplicitGroups() );
+ }
+
+ $data[$name]['rights'] = array_unique( array_merge( $data[$name]['rights'],
+ User::getGroupPermissions( array( $row->ug_group ) ) ) );
+ $result->setIndexedTagName( $data[$name]['rights'], 'r' );
+ }
+ if ( $row->ipb_deleted ) {
+ $data[$name]['hidden'] = '';
+ }
+ if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) {
+ $data[$name]['blockedby'] = $row->ipb_by_text;
+ $data[$name]['blockreason'] = $row->ipb_reason;
+ $data[$name]['blockexpiry'] = $row->ipb_expiry;
+ }
+
+ if ( isset( $this->prop['emailable'] ) && $user->canReceiveEmail() ) {
$data[$name]['emailable'] = '';
+ }
if ( isset( $this->prop['gender'] ) ) {
$gender = $user->getOption( 'gender' );
@@ -154,16 +167,15 @@ if ( !defined( 'MEDIAWIKI' ) ) {
$data[$name]['gender'] = $gender;
}
- if ( !is_null( $params['token'] ) )
- {
+ if ( !is_null( $params['token'] ) ) {
$tokenFunctions = $this->getTokenFunctions();
- foreach ( $params['token'] as $t )
- {
+ foreach ( $params['token'] as $t ) {
$val = call_user_func( $tokenFunctions[$t], $user );
- if ( $val === false )
+ if ( $val === false ) {
$this->setWarning( "Action '$t' is not allowed for the current user" );
- else
+ } else {
$data[$name][$t . 'token'] = $val;
+ }
}
}
}
@@ -174,30 +186,37 @@ if ( !defined( 'MEDIAWIKI' ) ) {
$data[$u] = array( 'name' => $u );
$urPage = new UserrightsPage;
$iwUser = $urPage->fetchUser( $u );
+
if ( $iwUser instanceof UserRightsProxy ) {
$data[$u]['interwiki'] = '';
- if ( !is_null( $params['token'] ) )
- {
+
+ if ( !is_null( $params['token'] ) ) {
$tokenFunctions = $this->getTokenFunctions();
- foreach ( $params['token'] as $t )
- {
+
+ foreach ( $params['token'] as $t ) {
$val = call_user_func( $tokenFunctions[$t], $iwUser );
- if ( $val === false )
+ if ( $val === false ) {
$this->setWarning( "Action '$t' is not allowed for the current user" );
- else
+ } else {
$data[$u][$t . 'token'] = $val;
+ }
}
}
- } else
+ } else {
$data[$u]['missing'] = '';
+ }
} else {
- if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) )
+ if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) {
+ $autolist = ApiQueryUsers::getAutoGroups( User::newFromName( $u ) );
+
+ $data[$u]['groups'] = array_merge( $autolist, $data[$u]['groups'] );
+
$this->getResult()->setIndexedTagName( $data[$u]['groups'], 'g' );
+ }
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ),
null, $data[$u] );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'users',
implode( '|', array_diff( $users, $done ) ) );
break;
@@ -207,20 +226,34 @@ if ( !defined( 'MEDIAWIKI' ) ) {
return $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' );
}
+ /**
+ * Gets all the groups that a user is automatically a member of
+ * @return array
+ */
+ public static function getAutoGroups( $user ) {
+ $groups = array( '*' );
+
+ if ( !$user->isAnon() ) {
+ $groups[] = 'user';
+ }
+
+ return array_merge( $groups, Autopromote::getAutopromoteGroups( $user ) );
+ }
+
public function getCacheMode( $params ) {
if ( isset( $params['token'] ) ) {
return 'private';
} else {
- return 'public';
+ return 'anon-public-user-private';
}
}
public function getAllowedParams() {
- return array (
- 'prop' => array (
- ApiBase :: PARAM_DFLT => null,
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => null,
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'blockinfo',
'groups',
'editcount',
@@ -230,25 +263,26 @@ if ( !defined( 'MEDIAWIKI' ) ) {
)
),
'users' => array(
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true
),
'token' => array(
- ApiBase :: PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
+ ApiBase::PARAM_ISMULTI => true
),
);
}
public function getParamDescription() {
- return array (
+ return array(
'prop' => array(
'What pieces of information to include',
- ' blockinfo - tags if the user is blocked, by whom, and for what reason',
- ' groups - lists all the groups the user belongs to',
- ' editcount - adds the user\'s edit count',
- ' registration - adds the user\'s registration timestamp',
- ' emailable - tags if the user can and wants to receive e-mail through [[Special:Emailuser]]',
- ' gender - tags the gender of the user. Returns "male", "female", or "unknown"',
+ ' blockinfo - Tags if the user is blocked, by whom, and for what reason',
+ ' groups - Lists all the groups the user(s) belongs to',
+ ' rights - Lists all the rights the user(s) has',
+ ' editcount - Adds the user\'s edit count',
+ ' registration - Adds the user\'s registration timestamp',
+ ' emailable - Tags if the user can and wants to receive e-mail through [[Special:Emailuser]]',
+ ' gender - Tags the gender of the user. Returns "male", "female", or "unknown"',
),
'users' => 'A list of users to obtain the same information for',
'token' => 'Which tokens to obtain for each user',
@@ -264,6 +298,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryUsers.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryUsers.php 85354 2011-04-04 18:25:31Z demon $';
}
}
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
index caac0706..784f89c0 100644
--- a/includes/api/ApiQueryWatchlist.php
+++ b/includes/api/ApiQueryWatchlist.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 25, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,7 +38,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryWatchlist extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'wl' );
+ parent::__construct( $query, $moduleName, 'wl' );
}
public function execute() {
@@ -50,38 +51,23 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
private $fld_ids = false, $fld_title = false, $fld_patrol = false, $fld_flags = false,
$fld_timestamp = false, $fld_user = false, $fld_comment = false, $fld_parsedcomment = false, $fld_sizes = false,
- $fld_notificationtimestamp = false;
+ $fld_notificationtimestamp = false, $fld_userid = false;
private function run( $resultPageSet = null ) {
- global $wgUser;
-
$this->selectNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
$params = $this->extractRequestParams();
- if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
- $user = User::newFromName( $params['owner'], false );
- if ( !$user->getId() ) {
- $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
- }
- $token = $user->getOption( 'watchlisttoken' );
- if ( $token == '' || $token != $params['token'] ) {
- $this->dieUsage( 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences', 'bad_wltoken' );
- }
- } elseif ( !$wgUser->isLoggedIn() ) {
- $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
- } else {
- $user = $wgUser;
- }
+ $user = $this->getWatchlistUser( $params );
if ( !is_null( $params['prop'] ) && is_null( $resultPageSet ) ) {
-
$prop = array_flip( $params['prop'] );
$this->fld_ids = isset( $prop['ids'] );
$this->fld_title = isset( $prop['title'] );
$this->fld_flags = isset( $prop['flags'] );
$this->fld_user = isset( $prop['user'] );
+ $this->fld_userid = isset( $prop['userid'] );
$this->fld_comment = isset( $prop['comment'] );
$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
$this->fld_timestamp = isset( $prop['timestamp'] );
@@ -90,19 +76,20 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$this->fld_notificationtimestamp = isset( $prop['notificationtimestamp'] );
if ( $this->fld_patrol ) {
- if ( !$user->useRCPatrol() && !$user->useNPPatrol() )
+ if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieUsage( 'patrol property is not available', 'patrol' );
+ }
}
}
-
- $this->addFields( array (
+
+ $this->addFields( array(
'rc_namespace',
'rc_title',
'rc_timestamp'
) );
if ( is_null( $resultPageSet ) ) {
- $this->addFields( array (
+ $this->addFields( array(
'rc_cur_id',
'rc_this_oldid'
) );
@@ -110,7 +97,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$this->addFieldsIf( 'rc_new', $this->fld_flags );
$this->addFieldsIf( 'rc_minor', $this->fld_flags );
$this->addFieldsIf( 'rc_bot', $this->fld_flags );
- $this->addFieldsIf( 'rc_user', $this->fld_user );
+ $this->addFieldsIf( 'rc_user', $this->fld_user || $this->fld_userid );
$this->addFieldsIf( 'rc_user_text', $this->fld_user );
$this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'rc_patrolled', $this->fld_patrol );
@@ -123,22 +110,26 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$this->addFields( 'rc_cur_id' );
}
- $this->addTables( array (
+ $this->addTables( array(
'watchlist',
'page',
'recentchanges'
) );
$userId = $user->getId();
- $this->addWhere( array (
+ $this->addWhere( array(
'wl_namespace = rc_namespace',
'wl_title = rc_title',
'rc_cur_id = page_id',
'wl_user' => $userId,
'rc_deleted' => 0,
) );
+
+ $db = $this->getDB();
- $this->addWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
+ $this->addWhereRange( 'rc_timestamp', $params['dir'],
+ $db->timestamp( $params['start'] ),
+ $db->timestamp( $params['end'] ) );
$this->addWhereFld( 'wl_namespace', $params['namespace'] );
$this->addWhereIf( 'rc_this_oldid=page_latest', !$params['allrev'] );
@@ -149,45 +140,53 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
if ( ( isset ( $show['minor'] ) && isset ( $show['!minor'] ) )
|| ( isset ( $show['bot'] ) && isset ( $show['!bot'] ) )
|| ( isset ( $show['anon'] ) && isset ( $show['!anon'] ) )
- || ( isset ( $show['patrolled'] ) && isset ( $show['!patrolled'] ) ) ) {
-
+ || ( isset ( $show['patrolled'] ) && isset ( $show['!patrolled'] ) )
+ )
+ {
$this->dieUsageMsg( array( 'show' ) );
}
-
+
// Check permissions.
- if ( ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) && !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() )
- $this->dieUsage( "You need the patrol right to request the patrolled flag", 'permissiondenied' );
+ if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
+ global $wgUser;
+ if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+ }
+ }
/* Add additional conditions to query depending upon parameters. */
- $this->addWhereIf( 'rc_minor = 0', isset ( $show['!minor'] ) );
- $this->addWhereIf( 'rc_minor != 0', isset ( $show['minor'] ) );
- $this->addWhereIf( 'rc_bot = 0', isset ( $show['!bot'] ) );
- $this->addWhereIf( 'rc_bot != 0', isset ( $show['bot'] ) );
- $this->addWhereIf( 'rc_user = 0', isset ( $show['anon'] ) );
- $this->addWhereIf( 'rc_user != 0', isset ( $show['!anon'] ) );
+ $this->addWhereIf( 'rc_minor = 0', isset( $show['!minor'] ) );
+ $this->addWhereIf( 'rc_minor != 0', isset( $show['minor'] ) );
+ $this->addWhereIf( 'rc_bot = 0', isset( $show['!bot'] ) );
+ $this->addWhereIf( 'rc_bot != 0', isset( $show['bot'] ) );
+ $this->addWhereIf( 'rc_user = 0', isset( $show['anon'] ) );
+ $this->addWhereIf( 'rc_user != 0', isset( $show['!anon'] ) );
$this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
$this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
}
- if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) )
+ if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
$this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
- if ( !is_null( $params['user'] ) )
+ }
+ if ( !is_null( $params['user'] ) ) {
$this->addWhereFld( 'rc_user_text', $params['user'] );
- if ( !is_null( $params['excludeuser'] ) )
+ }
+ if ( !is_null( $params['excludeuser'] ) ) {
$this->addWhere( 'rc_user_text != ' . $this->getDB()->addQuotes( $params['excludeuser'] ) );
+ }
+
+
- $db = $this->getDB();
-
// This is an index optimization for mysql, as done in the Special:Watchlist page
- $this->addWhereIf( "rc_timestamp > ''", !isset ( $params['start'] ) && !isset ( $params['end'] ) && $db->getType() == 'mysql' );
+ $this->addWhereIf( "rc_timestamp > ''", !isset( $params['start'] ) && !isset( $params['end'] ) && $db->getType() == 'mysql' );
$this->addOption( 'LIMIT', $params['limit'] + 1 );
- $ids = array ();
+ $ids = array();
$count = 0;
$res = $this->select( __METHOD__ );
- while ( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( ++ $count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
$this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
@@ -197,8 +196,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
if ( is_null( $resultPageSet ) ) {
$vals = $this->extractRowInfo( $row );
$fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'start',
wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
break;
@@ -212,12 +210,9 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
}
}
- $db->freeResult( $res );
-
if ( is_null( $resultPageSet ) ) {
$this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'item' );
- }
- elseif ( $params['allrev'] ) {
+ } elseif ( $params['allrev'] ) {
$resultPageSet->populateFromRevisionIDs( $ids );
} else {
$resultPageSet->populateFromPageIDs( $ids );
@@ -225,8 +220,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
}
private function extractRowInfo( $row ) {
-
- $vals = array ();
+ $vals = array();
if ( $this->fld_ids ) {
$vals['pageid'] = intval( $row->rc_cur_id );
@@ -235,41 +229,60 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
- if ( $this->fld_title )
+ if ( $this->fld_title ) {
ApiQueryBase::addTitleInfo( $vals, $title );
+ }
- if ( $this->fld_user ) {
- $vals['user'] = $row->rc_user_text;
- if ( !$row->rc_user )
+ if ( $this->fld_user || $this->fld_userid ) {
+
+ if ( $this->fld_user ) {
+ $vals['user'] = $row->rc_user_text;
+ }
+
+ if ( $this->fld_userid ) {
+ $vals['user'] = $row->rc_user;
+ }
+
+ if ( !$row->rc_user ) {
$vals['anon'] = '';
+ }
}
if ( $this->fld_flags ) {
- if ( $row->rc_new )
+ if ( $row->rc_new ) {
$vals['new'] = '';
- if ( $row->rc_minor )
+ }
+ if ( $row->rc_minor ) {
$vals['minor'] = '';
- if ( $row->rc_bot )
+ }
+ if ( $row->rc_bot ) {
$vals['bot'] = '';
+ }
}
- if ( $this->fld_patrol && isset( $row->rc_patrolled ) )
+ if ( $this->fld_patrol && isset( $row->rc_patrolled ) ) {
$vals['patrolled'] = '';
+ }
- if ( $this->fld_timestamp )
+ if ( $this->fld_timestamp ) {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->rc_timestamp );
+ }
if ( $this->fld_sizes ) {
$vals['oldlen'] = intval( $row->rc_old_len );
$vals['newlen'] = intval( $row->rc_new_len );
}
-
- if ( $this->fld_notificationtimestamp )
- $vals['notificationtimestamp'] = ( $row->wl_notificationtimestamp == null ) ? '' : wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
- if ( $this->fld_comment && isset( $row->rc_comment ) )
+ if ( $this->fld_notificationtimestamp ) {
+ $vals['notificationtimestamp'] = ( $row->wl_notificationtimestamp == null )
+ ? ''
+ : wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
+ }
+
+ if ( $this->fld_comment && isset( $row->rc_comment ) ) {
$vals['comment'] = $row->rc_comment;
-
+ }
+
if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
global $wgUser;
$vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->rc_comment, $title );
@@ -279,46 +292,47 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'allrev' => false,
- 'start' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'start' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
- 'end' => array (
- ApiBase :: PARAM_TYPE => 'timestamp'
+ 'end' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
),
'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace'
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace'
),
'user' => array(
- ApiBase :: PARAM_TYPE => 'user',
+ ApiBase::PARAM_TYPE => 'user',
),
'excludeuser' => array(
- ApiBase :: PARAM_TYPE => 'user',
+ ApiBase::PARAM_TYPE => 'user',
),
- 'dir' => array (
- ApiBase :: PARAM_DFLT => 'older',
- ApiBase :: PARAM_TYPE => array (
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'older',
+ ApiBase::PARAM_TYPE => array(
'newer',
'older'
)
),
- '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
+ '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
),
- 'prop' => array (
- APIBase :: PARAM_ISMULTI => true,
- APIBase :: PARAM_DFLT => 'ids|title|flags',
- APIBase :: PARAM_TYPE => array (
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DFLT => 'ids|title|flags',
+ ApiBase::PARAM_TYPE => array(
'ids',
'title',
'flags',
'user',
+ 'userid',
'comment',
'parsedcomment',
'timestamp',
@@ -327,9 +341,9 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
'notificationtimestamp'
)
),
- 'show' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'show' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'minor',
'!minor',
'bot',
@@ -340,39 +354,52 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
'!patrolled',
)
),
- 'owner' => array (
- ApiBase :: PARAM_TYPE => 'user'
+ 'owner' => array(
+ ApiBase::PARAM_TYPE => 'user'
),
- 'token' => array (
- ApiBase :: PARAM_TYPE => 'string'
+ 'token' => array(
+ ApiBase::PARAM_TYPE => 'string'
)
);
}
public function getParamDescription() {
- return array (
- 'allrev' => 'Include multiple revisions of the same page within given timeframe.',
- 'start' => 'The timestamp to start enumerating from.',
- 'end' => 'The timestamp to end enumerating.',
- 'namespace' => 'Filter changes to only the given namespace(s).',
+ return array(
+ 'allrev' => 'Include multiple revisions of the same page within given timeframe',
+ 'start' => 'The timestamp to start enumerating from',
+ 'end' => 'The timestamp to end enumerating',
+ 'namespace' => 'Filter changes to only the given namespace(s)',
'user' => 'Only list changes by this user',
'excludeuser' => 'Don\'t list changes by this user',
- 'dir' => 'In which direction to enumerate pages.',
- 'limit' => 'How many total results to return per request.',
- 'prop' => 'Which additional items to get (non-generator mode only).',
- 'show' => array (
+ 'dir' => 'In which direction to enumerate pages',
+ 'limit' => 'How many total results to return per request',
+ 'prop' => array(
+ 'Which additional items to get (non-generator mode only).',
+ ' ids - Adds revision ids and page ids',
+ ' title - Adds title of the page',
+ ' flags - Adds flags for the edit',
+ ' user - Adds the user who made the edit',
+ ' userid - Adds user id of whom made the edit',
+ ' comment - Adds comment of the edit',
+ ' parsedcomment - Adds parsed comment of the edit',
+ ' timestamp - Adds timestamp of the edit',
+ ' patrol - Tags edits that are patrolled',
+ ' size - Adds the old and new lengths of the page',
+ ' notificationtimestamp - Adds timestamp of when the user was last notified about the edit',
+ ),
+ 'show' => array(
'Show only items that meet this criteria.',
- 'For example, to see only minor edits done by logged-in users, set show=minor|!anon'
+ "For example, to see only minor edits done by logged-in users, set {$this->getModulePrefix()}show=minor|!anon"
),
- 'owner' => "The name of the user whose watchlist you'd like to access",
- 'token' => "Give a security token (settable in preferences) to allow access to another user's watchlist"
+ 'owner' => 'The name of the user whose watchlist you\'d like to access',
+ 'token' => 'Give a security token (settable in preferences) to allow access to another user\'s watchlist'
);
}
public function getDescription() {
return "Get all recent changes to pages in the logged in user's watchlist";
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'bad_wlowner', 'info' => 'Specified user does not exist' ),
@@ -386,17 +413,17 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=watchlist',
'api.php?action=query&list=watchlist&wlprop=ids|title|timestamp|user|comment',
- 'api.php?action=query&list=watchlist&wlallrev&wlprop=ids|title|timestamp|user|comment',
+ 'api.php?action=query&list=watchlist&wlallrev=&wlprop=ids|title|timestamp|user|comment',
'api.php?action=query&generator=watchlist&prop=info',
- 'api.php?action=query&generator=watchlist&gwlallrev&prop=revisions&rvprop=timestamp|user',
+ 'api.php?action=query&generator=watchlist&gwlallrev=&prop=revisions&rvprop=timestamp|user',
'api.php?action=query&list=watchlist&wlowner=Bob_Smith&wltoken=d8d562e9725ea1512894cdab28e5ceebc7f20237'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryWatchlist.php 69932 2010-07-26 08:03:21Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryWatchlist.php 85435 2011-04-05 14:00:08Z demon $';
}
}
diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php
index 42d4005b..0e5617e3 100644
--- a/includes/api/ApiQueryWatchlistRaw.php
+++ b/includes/api/ApiQueryWatchlistRaw.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Oct 4, 2008
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Oct 4, 2008
+ *
+ * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiQueryBase.php' );
+ require_once( 'ApiQueryBase.php' );
}
/**
@@ -37,7 +38,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent :: __construct( $query, $moduleName, 'wr' );
+ parent::__construct( $query, $moduleName, 'wr' );
}
public function execute() {
@@ -49,54 +50,54 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
}
private function run( $resultPageSet = null ) {
- global $wgUser;
-
$this->selectNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
- if ( !$wgUser->isLoggedIn() )
- $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
$params = $this->extractRequestParams();
+
+ $user = $this->getWatchlistUser( $params );
+
$prop = array_flip( (array)$params['prop'] );
$show = array_flip( (array)$params['show'] );
- if ( isset( $show['changed'] ) && isset( $show['!changed'] ) )
+ if ( isset( $show['changed'] ) && isset( $show['!changed'] ) ) {
$this->dieUsageMsg( array( 'show' ) );
+ }
$this->addTables( 'watchlist' );
$this->addFields( array( 'wl_namespace', 'wl_title' ) );
$this->addFieldsIf( 'wl_notificationtimestamp', isset( $prop['changed'] ) );
- $this->addWhereFld( 'wl_user', $wgUser->getId() );
+ $this->addWhereFld( 'wl_user', $user->getId() );
$this->addWhereFld( 'wl_namespace', $params['namespace'] );
$this->addWhereIf( 'wl_notificationtimestamp IS NOT NULL', isset( $show['changed'] ) );
$this->addWhereIf( 'wl_notificationtimestamp IS NULL', isset( $show['!changed'] ) );
- if ( isset( $params['continue'] ) )
- {
+ if ( isset( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 )
+ if ( count( $cont ) != 2 ) {
$this->dieUsage( "Invalid continue param. You should pass the " .
"original value returned by the previous query", "_badcontinue" );
+ }
$ns = intval( $cont[0] );
$title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
- $this->addWhere( "wl_namespace > '$ns' OR " .
- "(wl_namespace = '$ns' AND " .
- "wl_title >= '$title')" );
+ $this->addWhere(
+ "wl_namespace > '$ns' OR " .
+ "(wl_namespace = '$ns' AND " .
+ "wl_title >= '$title')"
+ );
}
// Don't ORDER BY wl_namespace if it's constant in the WHERE clause
- if ( count( $params['namespace'] ) == 1 )
+ if ( count( $params['namespace'] ) == 1 ) {
$this->addOption( 'ORDER BY', 'wl_title' );
- else
+ } else {
$this->addOption( 'ORDER BY', 'wl_namespace, wl_title' );
+ }
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$res = $this->select( __METHOD__ );
-
- $db = $this->getDB();
+
$titles = array();
$count = 0;
- while ( $row = $db->fetchObject( $res ) )
- {
- if ( ++$count > $params['limit'] )
- {
+ foreach ( $res as $row ) {
+ if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
$this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' .
$this->keyToTitle( $row->wl_title ) );
@@ -104,88 +105,102 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
}
$t = Title::makeTitle( $row->wl_namespace, $row->wl_title );
- if ( is_null( $resultPageSet ) )
- {
+ if ( is_null( $resultPageSet ) ) {
$vals = array();
ApiQueryBase::addTitleInfo( $vals, $t );
if ( isset( $prop['changed'] ) && !is_null( $row->wl_notificationtimestamp ) )
+ {
$vals['changed'] = wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
+ }
$fit = $this->getResult()->addValue( $this->getModuleName(), null, $vals );
- if ( !$fit )
- {
+ if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' .
$this->keyToTitle( $row->wl_title ) );
break;
}
- }
- else
+ } else {
$titles[] = $t;
+ }
}
- if ( is_null( $resultPageSet ) )
+ if ( is_null( $resultPageSet ) ) {
$this->getResult()->setIndexedTagName_internal( $this->getModuleName(), 'wr' );
- else
+ } else {
$resultPageSet->populateFromTitles( $titles );
+ }
}
public function getAllowedParams() {
- return array (
+ return array(
'continue' => null,
- 'namespace' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => 'namespace'
+ 'namespace' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => 'namespace'
),
- '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
+ '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
),
- 'prop' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'changed',
)
),
- 'show' => array (
- ApiBase :: PARAM_ISMULTI => true,
- ApiBase :: PARAM_TYPE => array (
+ 'show' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
'changed',
'!changed',
)
+ ),
+ 'owner' => array(
+ ApiBase::PARAM_TYPE => 'user'
+ ),
+ 'token' => array(
+ ApiBase::PARAM_TYPE => 'string'
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'continue' => 'When more results are available, use this to continue',
- 'namespace' => 'Only list pages in the given namespace(s).',
- 'limit' => 'How many total results to return per request.',
- 'prop' => 'Which additional properties to get (non-generator mode only).',
- 'show' => 'Only list items that meet these criteria.',
+ 'namespace' => 'Only list pages in the given namespace(s)',
+ 'limit' => 'How many total results to return per request',
+ 'prop' => array(
+ 'Which additional properties to get (non-generator mode only)',
+ ' changed - Adds timestamp of when the user was last notified about the edit',
+ ),
+ 'show' => 'Only list items that meet these criteria',
+ 'owner' => 'The name of the user whose watchlist you\'d like to access',
+ 'token' => 'Give a security token (settable in preferences) to allow access to another user\'s watchlist',
);
}
public function getDescription() {
return "Get all pages on the logged in user's watchlist";
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ),
array( 'show' ),
+ array( 'code' => 'bad_wlowner', 'info' => 'Specified user does not exist' ),
+ array( 'code' => 'bad_wltoken', 'info' => 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences' ),
) );
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=query&list=watchlistraw',
'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryWatchlistRaw.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryWatchlistRaw.php 70647 2010-08-07 19:59:42Z ialex $';
}
} \ No newline at end of file
diff --git a/includes/api/ApiResult.php b/includes/api/ApiResult.php
index 64c2c3fb..9d42a58e 100644
--- a/includes/api/ApiResult.php
+++ b/includes/api/ApiResult.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Sep 4, 2006
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Created on Sep 4, 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -54,7 +55,7 @@ class ApiResult extends ApiBase {
* @param $main ApiMain object
*/
public function __construct( $main ) {
- parent :: __construct( $main, 'result' );
+ parent::__construct( $main, 'result' );
$this->mIsRawMode = false;
$this->mCheckingSize = true;
$this->reset();
@@ -64,7 +65,7 @@ class ApiResult extends ApiBase {
* Clear the current result data.
*/
public function reset() {
- $this->mData = array ();
+ $this->mData = array();
$this->mSize = 0;
}
@@ -100,12 +101,14 @@ class ApiResult extends ApiBase {
*/
public static function size( $value ) {
$s = 0;
- if ( is_array( $value ) )
- foreach ( $value as $v )
+ if ( is_array( $value ) ) {
+ foreach ( $value as $v ) {
$s += self::size( $v );
- else if ( !is_object( $value ) )
+ }
+ } elseif ( !is_object( $value ) ) {
// Objects can't always be cast to string
$s = strlen( $value );
+ }
return $s;
}
@@ -139,57 +142,65 @@ class ApiResult extends ApiBase {
* @param $arr array to add $value to
* @param $name string Index of $arr to add $value at
* @param $value mixed
+ * @param $overwrite bool Whether overwriting an existing element is allowed
*/
- public static function setElement( & $arr, $name, $value ) {
- if ( $arr === null || $name === null || $value === null || !is_array( $arr ) || is_array( $name ) )
- ApiBase :: dieDebug( __METHOD__, 'Bad parameter' );
+ public static function setElement( &$arr, $name, $value, $overwrite = false ) {
+ if ( $arr === null || $name === null || $value === null || !is_array( $arr ) || is_array( $name ) ) {
+ ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
+ }
- if ( !isset ( $arr[$name] ) ) {
+ if ( !isset ( $arr[$name] ) || $overwrite ) {
$arr[$name] = $value;
- }
- elseif ( is_array( $arr[$name] ) && is_array( $value ) ) {
+ } elseif ( is_array( $arr[$name] ) && is_array( $value ) ) {
$merged = array_intersect_key( $arr[$name], $value );
- if ( !count( $merged ) )
+ if ( !count( $merged ) ) {
$arr[$name] += $value;
- else
- ApiBase :: dieDebug( __METHOD__, "Attempting to merge element $name" );
- } else
- ApiBase :: dieDebug( __METHOD__, "Attempting to add element $name=$value, existing value is {$arr[$name]}" );
+ } else {
+ ApiBase::dieDebug( __METHOD__, "Attempting to merge element $name" );
+ }
+ } else {
+ ApiBase::dieDebug( __METHOD__, "Attempting to add element $name=$value, existing value is {$arr[$name]}" );
+ }
}
/**
* Adds a content element to an array.
* Use this function instead of hardcoding the '*' element.
* @param $arr array to add the content element to
+ * @param $value Mixed
* @param $subElemName string when present, content element is created
* as a sub item of $arr. Use this parameter to create elements in
* format <elem>text</elem> without attributes
*/
- public static function setContent( & $arr, $value, $subElemName = null ) {
- if ( is_array( $value ) )
- ApiBase :: dieDebug( __METHOD__, 'Bad parameter' );
+ public static function setContent( &$arr, $value, $subElemName = null ) {
+ if ( is_array( $value ) ) {
+ ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
+ }
if ( is_null( $subElemName ) ) {
- ApiResult :: setElement( $arr, '*', $value );
+ ApiResult::setElement( $arr, '*', $value );
} else {
- if ( !isset ( $arr[$subElemName] ) )
- $arr[$subElemName] = array ();
- ApiResult :: setElement( $arr[$subElemName], '*', $value );
+ if ( !isset( $arr[$subElemName] ) ) {
+ $arr[$subElemName] = array();
+ }
+ ApiResult::setElement( $arr[$subElemName], '*', $value );
}
}
/**
* In case the array contains indexed values (in addition to named),
* give all indexed values the given tag name. This function MUST be
- * called on every arrray that has numerical indexes.
+ * called on every array that has numerical indexes.
* @param $arr array
* @param $tag string Tag name
*/
- public function setIndexedTagName( & $arr, $tag ) {
+ public function setIndexedTagName( &$arr, $tag ) {
// In raw mode, add the '_element', otherwise just ignore
- if ( !$this->getIsRawMode() )
+ if ( !$this->getIsRawMode() ) {
return;
- if ( $arr === null || $tag === null || !is_array( $arr ) || is_array( $tag ) )
- ApiBase :: dieDebug( __METHOD__, 'Bad parameter' );
+ }
+ if ( $arr === null || $tag === null || !is_array( $arr ) || is_array( $tag ) ) {
+ ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
+ }
// Do not use setElement() as it is ok to call this more than once
$arr['_element'] = $tag;
}
@@ -200,14 +211,15 @@ class ApiResult extends ApiBase {
* @param $tag string Tag name
*/
public function setIndexedTagName_recursive( &$arr, $tag ) {
- if ( !is_array( $arr ) )
- return;
- foreach ( $arr as &$a )
- {
- if ( !is_array( $a ) )
- continue;
- $this->setIndexedTagName( $a, $tag );
- $this->setIndexedTagName_recursive( $a, $tag );
+ if ( !is_array( $arr ) ) {
+ return;
+ }
+ foreach ( $arr as &$a ) {
+ if ( !is_array( $a ) ) {
+ continue;
+ }
+ $this->setIndexedTagName( $a, $tag );
+ $this->setIndexedTagName_recursive( $a, $tag );
}
}
@@ -219,57 +231,73 @@ class ApiResult extends ApiBase {
* @param $tag string
*/
public function setIndexedTagName_internal( $path, $tag ) {
- $data = & $this->mData;
+ $data = &$this->mData;
foreach ( (array)$path as $p ) {
if ( !isset( $data[$p] ) ) {
$data[$p] = array();
}
- $data = & $data[$p];
+ $data = &$data[$p];
}
- if ( is_null( $data ) )
+ if ( is_null( $data ) ) {
return;
+ }
$this->setIndexedTagName( $data, $tag );
}
/**
* Add value to the output data at the given path.
- * Path is an indexed array, each element specifing the branch at which to add the new value
+ * Path is an indexed array, each element specifying the branch at which to add the new value
* Setting $path to array('a','b','c') is equivalent to data['a']['b']['c'] = $value
* If $name is empty, the $value is added as a next list element data[] = $value
* @return bool True if $value fits in the result, false if not
*/
- public function addValue( $path, $name, $value ) {
+ public function addValue( $path, $name, $value, $overwrite = false ) {
global $wgAPIMaxResultSize;
- $data = & $this->mData;
+ $data = &$this->mData;
if ( $this->mCheckingSize ) {
$newsize = $this->mSize + self::size( $value );
- if ( $newsize > $wgAPIMaxResultSize )
+ if ( $newsize > $wgAPIMaxResultSize ) {
return false;
+ }
$this->mSize = $newsize;
}
if ( !is_null( $path ) ) {
if ( is_array( $path ) ) {
foreach ( $path as $p ) {
- if ( !isset ( $data[$p] ) )
- $data[$p] = array ();
- $data = & $data[$p];
+ if ( !isset( $data[$p] ) ) {
+ $data[$p] = array();
+ }
+ $data = &$data[$p];
}
} else {
- if ( !isset ( $data[$path] ) )
- $data[$path] = array ();
- $data = & $data[$path];
+ if ( !isset( $data[$path] ) ) {
+ $data[$path] = array();
+ }
+ $data = &$data[$path];
}
}
- if ( !$name )
- $data[] = $value; // Add list element
- else
- ApiResult :: setElement( $data, $name, $value ); // Add named element
+ if ( !$name ) {
+ $data[] = $value; // Add list element
+ } else {
+ self::setElement( $data, $name, $value, $overwrite ); // Add named element
+ }
return true;
}
/**
+ * Add a parsed limit=max to the result.
+ *
+ * @param $moduleName string
+ * @param $limit int
+ */
+ public function setParsedLimit( $moduleName, $limit ) {
+ // Add value, allowing overwriting
+ $this->addValue( 'limits', $moduleName, $limit, true );
+ }
+
+ /**
* Unset a value previously added to the result set.
* Fails silently if the value isn't found.
* For parameters, see addValue()
@@ -277,13 +305,15 @@ class ApiResult extends ApiBase {
* @param $name string
*/
public function unsetValue( $path, $name ) {
- $data = & $this->mData;
- if ( !is_null( $path ) )
+ $data = &$this->mData;
+ if ( !is_null( $path ) ) {
foreach ( (array)$path as $p ) {
- if ( !isset( $data[$p] ) )
+ if ( !isset( $data[$p] ) ) {
return;
- $data = & $data[$p];
+ }
+ $data = &$data[$p];
}
+ }
$this->mSize -= self::size( $data[$name] );
unset( $data[$name] );
}
@@ -291,27 +321,26 @@ class ApiResult extends ApiBase {
/**
* Ensure all values in this result are valid UTF-8.
*/
- public function cleanUpUTF8()
- {
+ public function cleanUpUTF8() {
array_walk_recursive( $this->mData, array( 'ApiResult', 'cleanUp_helper' ) );
}
/**
* Callback function for cleanUpUTF8()
*/
- private static function cleanUp_helper( &$s )
- {
- if ( !is_string( $s ) )
+ private static function cleanUp_helper( &$s ) {
+ if ( !is_string( $s ) ) {
return;
+ }
global $wgContLang;
$s = $wgContLang->normalize( $s );
}
public function execute() {
- ApiBase :: dieDebug( __METHOD__, 'execute() is not supported on Result object' );
+ ApiBase::dieDebug( __METHOD__, 'execute() is not supported on Result object' );
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiResult.php 62354 2010-02-12 06:44:16Z mah $';
+ return __CLASS__ . ': $Id: ApiResult.php 74230 2010-10-03 19:07:11Z reedy $';
}
}
diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php
index 5c259f4e..e31bfed8 100644
--- a/includes/api/ApiRollback.php
+++ b/includes/api/ApiRollback.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on Jun 20, 2007
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Jun 20, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -33,39 +35,27 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiRollback extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
+ private $mTitleObj = null, $mUser = null;
+
public function execute() {
$params = $this->extractRequestParams();
- $titleObj = null;
- if ( !isset( $params['title'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'title' ) );
- if ( !isset( $params['user'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'user' ) );
-
- $titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj )
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
- if ( !$titleObj->exists() )
- $this->dieUsageMsg( array( 'notanarticle' ) );
-
- // We need to be able to revert IPs, but getCanonicalName rejects them
- $username = User::isIP( $params['user'] )
- ? $params['user']
- : User::getCanonicalName( $params['user'] );
- if ( !$username )
- $this->dieUsageMsg( array( 'invaliduser', $params['user'] ) );
-
+ // User and title already validated in call to getTokenSalt from Main
+ $titleObj = $this->getTitle();
$articleObj = new Article( $titleObj );
- $summary = ( isset( $params['summary'] ) ? $params['summary'] : "" );
+ $summary = ( isset( $params['summary'] ) ? $params['summary'] : '' );
$details = null;
- $retval = $articleObj->doRollback( $username, $summary, $params['token'], $params['markbot'], $details );
+ $retval = $articleObj->doRollback( $this->getUser(), $summary, $params['token'], $params['markbot'], $details );
- if ( $retval )
+ if ( $retval ) {
// We don't care about multiple errors, just report one of them
$this->dieUsageMsg( reset( $retval ) );
+ }
+
+ $this->setWatch( $params['watchlist'], $titleObj );
$info = array(
'title' => $titleObj->getPrefixedText(),
@@ -79,57 +69,121 @@ class ApiRollback extends ApiBase {
$this->getResult()->addValue( null, $this->getModuleName(), $info );
}
- public function mustBePosted() { return true; }
+ public function mustBePosted() {
+ return true;
+ }
public function isWriteMode() {
return true;
}
public function getAllowedParams() {
- return array (
- 'title' => null,
- 'user' => null,
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ 'user' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'token' => null,
'summary' => null,
- 'markbot' => false
+ 'markbot' => false,
+ 'watchlist' => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
+ 'watch',
+ 'unwatch',
+ 'preferences',
+ 'nochange'
+ ),
+ ),
);
}
public function getParamDescription() {
- return array (
+ return array(
'title' => 'Title of the page you want to rollback.',
'user' => 'Name of the user whose edits are to be rolled back. If set incorrectly, you\'ll get a badtoken error.',
- 'token' => 'A rollback token previously retrieved through prop=revisions',
- 'summary' => 'Custom edit summary. If not set, default summary will be used.',
- 'markbot' => 'Mark the reverted edits and the revert as bot edits'
+ 'token' => "A rollback token previously retrieved through {$this->getModulePrefix()}prop=revisions",
+ 'summary' => 'Custom edit summary. If not set, default summary will be used',
+ 'markbot' => 'Mark the reverted edits and the revert as bot edits',
+ 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
);
}
public function getDescription() {
return array(
- 'Undo the last edit to the page. If the last user who edited the page made multiple edits in a row,',
- 'they will all be rolled back.'
- );
+ 'Undo the last edit to the page. If the last user who edited the page made multiple edits in a row,',
+ 'they will all be rolled back'
+ );
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'title' ),
- array( 'missingparam', 'user' ),
array( 'invalidtitle', 'title' ),
array( 'notanarticle' ),
array( 'invaliduser', 'user' ),
) );
}
+ public function needsToken() {
+ return true;
+ }
+
+ public function getTokenSalt() {
+ return array( $this->getTitle()->getPrefixedText(), $this->getUser() );
+ }
+
+ private function getUser() {
+ if ( $this->mUser !== null ) {
+ return $this->mUser;
+ }
+
+ $params = $this->extractRequestParams();
+
+ // We need to be able to revert IPs, but getCanonicalName rejects them
+ $this->mUser = User::isIP( $params['user'] )
+ ? $params['user']
+ : User::getCanonicalName( $params['user'] );
+ if ( !$this->mUser ) {
+ $this->dieUsageMsg( array( 'invaliduser', $params['user'] ) );
+ }
+
+ return $this->mUser;
+ }
+
+ /**
+ * @return Title
+ */
+ private function getTitle() {
+ if ( $this->mTitleObj !== null ) {
+ return $this->mTitleObj;
+ }
+
+ $params = $this->extractRequestParams();
+
+ $this->mTitleObj = Title::newFromText( $params['title'] );
+
+ if ( !$this->mTitleObj ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
+ if ( !$this->mTitleObj->exists() ) {
+ $this->dieUsageMsg( array( 'notanarticle' ) );
+ }
+
+ return $this->mTitleObj;
+ }
+
protected function getExamples() {
- return array (
+ return array(
'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC',
'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&token=123ABC&summary=Reverting%20vandalism&markbot=1'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiRollback.php 65371 2010-04-21 10:41:25Z tstarling $';
+ return __CLASS__ . ': $Id: ApiRollback.php 75602 2010-10-28 00:04:48Z reedy $';
}
}
diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php
new file mode 100644
index 00000000..7bc4722c
--- /dev/null
+++ b/includes/api/ApiRsd.php
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * API for MediaWiki 1.17+
+ *
+ * Created on October 26, 2010
+ *
+ * Copyright © 2010 Bryan Tong Minh and Brion Vibber
+ *
+ * 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
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ require_once( 'ApiBase.php' );
+}
+
+/**
+ * API module for sending out RSD information
+ * @ingroup API
+ */
+class ApiRsd extends ApiBase {
+
+ public function __construct( $main, $action ) {
+ parent::__construct( $main, $action );
+ }
+
+ public function execute() {
+ $result = $this->getResult();
+
+ $result->addValue( null, 'version', '1.0' );
+ $result->addValue( null, 'xmlns', 'http://archipelago.phrasewise.com/rsd' );
+
+ $service = array( 'apis' => $this->formatRsdApiList() );
+ ApiResult::setContent( $service, 'MediaWiki', 'engineName' );
+ ApiResult::setContent( $service, 'http://www.mediawiki.org/', 'engineLink' );
+
+ $result->setIndexedTagName( $service['apis'], 'api' );
+
+ $result->addValue( null, 'service', $service );
+ }
+
+ public function getCustomPrinter() {
+ return new ApiFormatXmlRsd( $this->getMain(), 'xml' );
+ }
+
+ public function getAllowedParams() {
+ return array();
+ }
+
+ public function getParamDescription() {
+ return array();
+ }
+
+ public function getDescription() {
+ return 'Export an RSD schema';
+ }
+
+ protected function getExamples() {
+ return array(
+ 'api.php?action=rsd'
+ );
+ }
+
+ /**
+ * Builds an internal list of APIs to expose information about.
+ * Normally this only lists the MediaWiki API, with its base URL,
+ * link to documentation, and a marker as to available authentication
+ * (to aid in OAuth client apps switching to support in the future).
+ *
+ * Extensions can expose other APIs, such as WordPress or Twitter-
+ * compatible APIs, by hooking 'ApiRsdServiceApis' and adding more
+ * elements to the array.
+ *
+ * See http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html for
+ * the base RSD spec, and check WordPress and StatusNet sites for
+ * in-production examples listing several blogging and micrblogging
+ * APIs.
+ *
+ * @return array
+ */
+ protected function getRsdApiList() {
+ $apis = array(
+ 'MediaWiki' => array(
+ // The API link is required for all RSD API entries.
+ 'apiLink' => wfExpandUrl( wfScript( 'api' ) ),
+
+ // Docs link is optional, but recommended.
+ 'docs' => 'http://mediawiki.org/wiki/API',
+
+ // Some APIs may need a blog ID, but it may be left blank.
+ 'blogID' => '',
+
+ // Additional settings are optional.
+ 'settings' => array(
+ // Change this to true in the future as an aid to
+ // machine discovery of OAuth for API access.
+ 'OAuth' => false,
+ )
+ ),
+ );
+ wfRunHooks( 'ApiRsdServiceApis', array( &$apis ) );
+ return $apis;
+ }
+
+ /**
+ * Formats the internal list of exposed APIs into an array suitable
+ * to pass to the API's XML formatter.
+ *
+ * @return array
+ */
+ protected function formatRsdApiList() {
+ $apis = $this->getRsdApiList();
+
+ $outputData = array();
+ foreach ( $apis as $name => $info ) {
+ $data = array(
+ 'name' => $name,
+ 'preferred' => wfBoolToStr( $name == 'MediaWiki' ),
+ 'apiLink' => $info['apiLink'],
+ 'blogID' => isset( $info['blogID'] ) ? $info['blogID'] : '',
+ );
+ $settings = array();
+ if ( isset( $info['docs'] ) ) {
+ ApiResult::setContent( $settings, $info['docs'], 'docs' );
+ }
+ if ( isset( $info['settings'] ) ) {
+ foreach ( $info['settings'] as $setting => $val ) {
+ if ( is_bool( $val ) ) {
+ $xmlVal = wfBoolToStr( $val );
+ } else {
+ $xmlVal = $val;
+ }
+ $setting = array( 'name' => $setting );
+ ApiResult::setContent( $setting, $xmlVal );
+ $settings[] = $setting;
+ }
+ }
+ if ( count( $settings ) ) {
+ $this->getResult()->setIndexedTagName( $settings, 'setting' );
+ $data['settings'] = $settings;
+ }
+ $outputData[] = $data;
+ }
+ return $outputData;
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiRsd.php 76195 2010-11-06 15:57:15Z btongminh $';
+ }
+}
+
+class ApiFormatXmlRsd extends ApiFormatXml {
+ public function __construct( $main, $format ) {
+ parent::__construct( $main, $format );
+ $this->setRootElement( 'rsd' );
+ }
+
+ public function getMimeType() {
+ return 'application/rsd+xml';
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiRsd.php 76195 2010-11-06 15:57:15Z btongminh $';
+ }
+}
diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php
index 1c4a4ade..4f6e4fb7 100644
--- a/includes/api/ApiUnblock.php
+++ b/includes/api/ApiUnblock.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on Sep 7, 2007
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Sep 7, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -36,7 +38,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiUnblock extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
/**
@@ -46,27 +48,37 @@ class ApiUnblock extends ApiBase {
global $wgUser;
$params = $this->extractRequestParams();
- if ( $params['gettoken'] )
- {
+ if ( $params['gettoken'] ) {
$res['unblocktoken'] = $wgUser->editToken();
$this->getResult()->addValue( null, $this->getModuleName(), $res );
return;
}
- if ( is_null( $params['id'] ) && is_null( $params['user'] ) )
+ if ( is_null( $params['id'] ) && is_null( $params['user'] ) ) {
$this->dieUsageMsg( array( 'unblock-notarget' ) );
- if ( !is_null( $params['id'] ) && !is_null( $params['user'] ) )
+ }
+ if ( !is_null( $params['id'] ) && !is_null( $params['user'] ) ) {
$this->dieUsageMsg( array( 'unblock-idanduser' ) );
+ }
- if ( !$wgUser->isAllowed( 'block' ) )
+ if ( !$wgUser->isAllowed( 'block' ) ) {
$this->dieUsageMsg( array( 'cantunblock' ) );
+ }
+ # bug 15810: blocked admins should have limited access here
+ if ( $wgUser->isBlocked() ) {
+ $status = IPBlockForm::checkUnblockSelf( $params['user'] );
+ if ( $status !== true ) {
+ $this->dieUsageMsg( array( $status ) );
+ }
+ }
$id = $params['id'];
$user = $params['user'];
$reason = ( is_null( $params['reason'] ) ? '' : $params['reason'] );
$retval = IPUnblockForm::doUnblock( $id, $user, $reason, $range );
- if ( $retval )
+ if ( $retval ) {
$this->dieUsageMsg( $retval );
+ }
$res['id'] = intval( $id );
$res['user'] = $user;
@@ -83,7 +95,7 @@ class ApiUnblock extends ApiBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'id' => null,
'user' => null,
'token' => null,
@@ -93,29 +105,30 @@ class ApiUnblock extends ApiBase {
}
public function getParamDescription() {
- return array (
- 'id' => 'ID of the block you want to unblock (obtained through list=blocks). Cannot be used together with user',
- 'user' => 'Username, IP address or IP range you want to unblock. Cannot be used together with id',
- 'token' => 'An unblock token previously obtained through the gettoken parameter or prop=info',
+ $p = $this->getModulePrefix();
+ 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",
'gettoken' => 'If set, an unblock token will be returned, and no other action will be taken',
'reason' => 'Reason for unblock (optional)',
);
}
public function getDescription() {
- return array(
- 'Unblock a user.'
- );
+ return 'Unblock a user';
}
-
- public function getPossibleErrors() {
+
+ public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'unblock-notarget' ),
array( 'unblock-idanduser' ),
array( 'cantunblock' ),
- ) );
+ array( 'ipbblocked' ),
+ array( 'ipbnounblockself' ),
+ ) );
}
-
+
public function needsToken() {
return true;
}
@@ -125,13 +138,13 @@ class ApiUnblock extends ApiBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=unblock&id=105',
'api.php?action=unblock&user=Bob&reason=Sorry%20Bob'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiUnblock.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiUnblock.php 74098 2010-10-01 20:12:50Z reedy $';
}
}
diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php
index ae705b69..3c7d91a5 100644
--- a/includes/api/ApiUndelete.php
+++ b/includes/api/ApiUndelete.php
@@ -1,10 +1,10 @@
<?php
-
-/*
- * Created on Jul 3, 2007
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Jul 3, 2007
+ *
+ * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -33,45 +35,49 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiUndelete extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
global $wgUser;
$params = $this->extractRequestParams();
- $titleObj = null;
- if ( !isset( $params['title'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'title' ) );
-
- if ( !$wgUser->isAllowed( 'undelete' ) )
+ if ( !$wgUser->isAllowed( 'undelete' ) ) {
$this->dieUsageMsg( array( 'permdenied-undelete' ) );
+ }
- if ( $wgUser->isBlocked() )
+ if ( $wgUser->isBlocked() ) {
$this->dieUsageMsg( array( 'blockedtext' ) );
+ }
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj )
+ if ( !$titleObj ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
// Convert timestamps
- if ( !isset( $params['timestamps'] ) )
+ if ( !isset( $params['timestamps'] ) ) {
$params['timestamps'] = array();
- if ( !is_array( $params['timestamps'] ) )
+ }
+ if ( !is_array( $params['timestamps'] ) ) {
$params['timestamps'] = array( $params['timestamps'] );
- foreach ( $params['timestamps'] as $i => $ts )
+ }
+ foreach ( $params['timestamps'] as $i => $ts ) {
$params['timestamps'][$i] = wfTimestamp( TS_MW, $ts );
+ }
$pa = new PageArchive( $titleObj );
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
$retval = $pa->undelete( ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ), $params['reason'] );
- if ( !is_array( $retval ) )
+ if ( !is_array( $retval ) ) {
$this->dieUsageMsg( array( 'cannotundelete' ) );
+ }
- if ( $retval[1] )
+ if ( $retval[1] ) {
wfRunHooks( 'FileUndeleteComplete',
array( $titleObj, array(), $wgUser, $params['reason'] ) );
+ }
+
+ $this->setWatch( $params['watchlist'], $titleObj );
$info['title'] = $titleObj->getPrefixedText();
$info['revisions'] = intval( $retval[0] );
@@ -89,22 +95,35 @@ class ApiUndelete extends ApiBase {
}
public function getAllowedParams() {
- return array (
- 'title' => null,
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'token' => null,
- 'reason' => "",
+ 'reason' => '',
'timestamps' => array(
- ApiBase :: PARAM_ISMULTI => true
- )
+ ApiBase::PARAM_ISMULTI => true
+ ),
+ 'watchlist' => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
+ 'watch',
+ 'unwatch',
+ 'preferences',
+ 'nochange'
+ ),
+ ),
);
}
public function getParamDescription() {
- return array (
- 'title' => 'Title of the page you want to restore.',
+ return array(
+ 'title' => 'Title of the page you want to restore',
'token' => 'An undelete token previously retrieved through list=deletedrevs',
'reason' => 'Reason for restoring (optional)',
- 'timestamps' => 'Timestamps of the revisions to restore. If not set, all revisions will be restored.'
+ 'timestamps' => 'Timestamps of the revisions to restore. If not set, all revisions will be restored.',
+ 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
);
}
@@ -114,17 +133,16 @@ class ApiUndelete extends ApiBase {
'retrieved through list=deletedrevs'
);
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'title' ),
array( 'permdenied-undelete' ),
array( 'blockedtext' ),
array( 'invalidtitle', 'title' ),
array( 'cannotundelete' ),
) );
}
-
+
public function needsToken() {
return true;
}
@@ -134,13 +152,13 @@ class ApiUndelete extends ApiBase {
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=undelete&title=Main%20Page&token=123ABC&reason=Restoring%20main%20page',
'api.php?action=undelete&title=Main%20Page&token=123ABC&timestamps=20070703220045|20070702194856'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiUndelete.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiUndelete.php 74098 2010-10-01 20:12:50Z reedy $';
}
}
diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php
index 06688997..e7d7b939 100644
--- a/includes/api/ApiUpload.php
+++ b/includes/api/ApiUpload.php
@@ -1,9 +1,10 @@
<?php
-/*
- * Created on Aug 21, 2008
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 - 2010 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
+ * Created on Aug 21, 2008
+ *
+ * Copyright © 2008 - 2010 Bryan Tong Minh <Bryan.TongMinh@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
@@ -17,8 +18,10 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
@@ -38,141 +41,269 @@ class ApiUpload extends ApiBase {
}
public function execute() {
- global $wgUser, $wgAllowCopyUploads;
+ global $wgUser;
// Check whether upload is enabled
- if ( !UploadBase::isEnabled() )
+ if ( !UploadBase::isEnabled() ) {
$this->dieUsageMsg( array( 'uploaddisabled' ) );
+ }
+ // Parameter handling
$this->mParams = $this->extractRequestParams();
$request = $this->getMain()->getRequest();
-
// Add the uploaded file to the params array
$this->mParams['file'] = $request->getFileName( 'file' );
+ // Select an upload module
+ if ( !$this->selectUploadModule() ) {
+ // This is not a true upload, but a status request or similar
+ return;
+ }
+ if ( !isset( $this->mUpload ) ) {
+ $this->dieUsage( 'No upload module set', 'nomodule' );
+ }
+
+ // First check permission to upload
+ $this->checkPermissions( $wgUser );
+
+ // Fetch the file
+ $status = $this->mUpload->fetchFile();
+ if ( !$status->isGood() ) {
+ $errors = $status->getErrorsArray();
+ $error = array_shift( $errors[0] );
+ $this->dieUsage( 'Error fetching file from remote source', $error, 0, $errors[0] );
+ }
+
+ // Check if the uploaded file is sane
+ $this->verifyUpload();
+
+ // Check permission to upload this file
+ $permErrors = $this->mUpload->verifyPermissions( $wgUser );
+ if ( $permErrors !== true ) {
+ // TODO: stash the upload and allow choosing a new name
+ $this->dieUsageMsg( array( 'badaccess-groups' ) );
+ }
+
+ // Prepare the API result
+ $result = array();
+
+ $warnings = $this->getApiWarnings();
+ if ( $warnings ) {
+ $result['result'] = 'Warning';
+ $result['warnings'] = $warnings;
+ // in case the warnings can be fixed with some further user action, let's stash this upload
+ // and return a key they can use to restart it
+ try {
+ $result['sessionkey'] = $this->performStash();
+ } catch ( MWException $e ) {
+ $result['warnings']['stashfailed'] = $e->getMessage();
+ }
+ } elseif ( $this->mParams['stash'] ) {
+ // Some uploads can request they be stashed, so as not to publish them immediately.
+ // In this case, a failure to stash ought to be fatal
+ try {
+ $result['result'] = 'Success';
+ $result['sessionkey'] = $this->performStash();
+ } catch ( MWException $e ) {
+ $this->dieUsage( $e->getMessage(), 'stashfailed' );
+ }
+ } else {
+ // This is the most common case -- a normal upload with no warnings
+ // $result will be formatted properly for the API already, with a status
+ $result = $this->performUpload();
+ }
+
+ if ( $result['result'] === 'Success' ) {
+ $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+ }
+
+ $this->getResult()->addValue( null, $this->getModuleName(), $result );
+
+ // Cleanup any temporary mess
+ $this->mUpload->cleanupTempFile();
+ }
+
+ /**
+ * Stash the file and return the session key
+ * Also re-raises exceptions with slightly more informative message strings (useful for API)
+ * @throws MWException
+ * @return {String} session key
+ */
+ function performStash() {
+ try {
+ $sessionKey = $this->mUpload->stashSessionFile()->getSessionKey();
+ } catch ( MWException $e ) {
+ throw new MWException( 'Stashing temporary file failed: ' . get_class($e) . ' ' . $e->getMessage() );
+ }
+ return $sessionKey;
+ }
+
+
+ /**
+ * Select an upload module and set it to mUpload. Dies on failure. If the
+ * request was a status request and not a true upload, returns false;
+ * otherwise true
+ *
+ * @return bool
+ */
+ protected function selectUploadModule() {
+ global $wgAllowAsyncCopyUploads;
+ $request = $this->getMain()->getRequest();
+
// One and only one of the following parameters is needed
$this->requireOnlyOneParameter( $this->mParams,
- 'sessionkey', 'file', 'url' );
+ 'sessionkey', 'file', 'url', 'statuskey' );
+
+ if ( $wgAllowAsyncCopyUploads && $this->mParams['statuskey'] ) {
+ // Status request for an async upload
+ $sessionData = UploadFromUrlJob::getSessionData( $this->mParams['statuskey'] );
+ if ( !isset( $sessionData['result'] ) ) {
+ $this->dieUsage( 'No result in session data', 'missingresult');
+ }
+ if ( $sessionData['result'] == 'Warning' ) {
+ $sessionData['warnings'] = $this->transformWarnings( $sessionData['warnings'] );
+ $sessionData['sessionkey'] = $this->mParams['statuskey'];
+ }
+ $this->getResult()->addValue( null, $this->getModuleName(), $sessionData );
+ return false;
+
+ }
+
+
+ // The following modules all require the filename parameter to be set
+ if ( is_null( $this->mParams['filename'] ) ) {
+ $this->dieUsageMsg( array( 'missingparam', 'filename' ) );
+ }
+
if ( $this->mParams['sessionkey'] ) {
- /**
- * Upload stashed in a previous request
- */
- // Check the session key
- if ( !isset( $_SESSION['wsUploadData'][$this->mParams['sessionkey']] ) )
+ // Upload stashed in a previous request
+ $sessionData = $request->getSessionData( UploadBase::getSessionKeyName() );
+ if ( !UploadFromStash::isValidSessionKey( $this->mParams['sessionkey'], $sessionData ) ) {
$this->dieUsageMsg( array( 'invalid-session-key' ) );
+ }
$this->mUpload = new UploadFromStash();
$this->mUpload->initialize( $this->mParams['filename'],
$this->mParams['sessionkey'],
- $_SESSION['wsUploadData'][$this->mParams['sessionkey']] );
- } elseif ( isset( $this->mParams['filename'] ) ) {
- /**
- * Upload from url, etc
- * Parameter filename is required
- */
-
- if ( isset( $this->mParams['file'] ) ) {
- $this->mUpload = new UploadFromFile();
- $this->mUpload->initialize(
- $this->mParams['filename'],
- $request->getFileTempName( 'file' ),
- $request->getFileSize( 'file' )
- );
- } elseif ( isset( $this->mParams['url'] ) ) {
- // make sure upload by url is enabled:
- if ( !$wgAllowCopyUploads )
- $this->dieUsageMsg( array( 'uploaddisabled' ) );
-
- // make sure the current user can upload
- if ( ! $wgUser->isAllowed( 'upload_by_url' ) )
- $this->dieUsageMsg( array( 'badaccess-groups' ) );
-
- $this->mUpload = new UploadFromUrl();
- $this->mUpload->initialize( $this->mParams['filename'],
- $this->mParams['url'] );
-
- $status = $this->mUpload->fetchFile();
- if ( !$status->isOK() ) {
- $this->dieUsage( $status->getWikiText(), 'fetchfileerror' );
+ $sessionData[$this->mParams['sessionkey']] );
+
+
+ } elseif ( isset( $this->mParams['file'] ) ) {
+ $this->mUpload = new UploadFromFile();
+ $this->mUpload->initialize(
+ $this->mParams['filename'],
+ $request->getUpload( 'file' )
+ );
+ } elseif ( isset( $this->mParams['url'] ) ) {
+ // Make sure upload by URL is enabled:
+ if ( !UploadFromUrl::isEnabled() ) {
+ $this->dieUsageMsg( array( 'copyuploaddisabled' ) );
+ }
+
+ $async = false;
+ if ( $this->mParams['asyncdownload'] ) {
+ if ( $this->mParams['leavemessage'] && !$this->mParams['ignorewarnings'] ) {
+ $this->dieUsage( 'Using leavemessage without ignorewarnings is not supported',
+ 'missing-ignorewarnings' );
+ }
+
+ if ( $this->mParams['leavemessage'] ) {
+ $async = 'async-leavemessage';
+ } else {
+ $async = 'async';
}
}
- } else $this->dieUsageMsg( array( 'missingparam', 'filename' ) );
+ $this->mUpload = new UploadFromUrl;
+ $this->mUpload->initialize( $this->mParams['filename'],
+ $this->mParams['url'], $async );
- if ( !isset( $this->mUpload ) )
- $this->dieUsage( 'No upload module set', 'nomodule' );
+ }
+
+ return true;
+ }
+ /**
+ * Checks that the user has permissions to perform this upload.
+ * Dies with usage message on inadequate permissions.
+ * @param $user User The user to check.
+ */
+ protected function checkPermissions( $user ) {
// Check whether the user has the appropriate permissions to upload anyway
- $permission = $this->mUpload->isAllowed( $wgUser );
+ $permission = $this->mUpload->isAllowed( $user );
if ( $permission !== true ) {
- if ( !$wgUser->isLoggedIn() )
+ if ( !$user->isLoggedIn() ) {
$this->dieUsageMsg( array( 'mustbeloggedin', 'upload' ) );
- else
+ } else {
$this->dieUsageMsg( array( 'badaccess-groups' ) );
+ }
}
- // Perform the upload
- $result = $this->performUpload();
-
- // Cleanup any temporary mess
- $this->mUpload->cleanupTempFile();
-
- $this->getResult()->addValue( null, $this->getModuleName(), $result );
}
- protected function performUpload() {
- global $wgUser;
- $result = array();
- $permErrors = $this->mUpload->verifyPermissions( $wgUser );
- if ( $permErrors !== true ) {
- $this->dieUsageMsg( array( 'badaccess-groups' ) );
+ /**
+ * Performs file verification, dies on error.
+ */
+ protected function verifyUpload( ) {
+ global $wgFileExtensions;
+
+ $verification = $this->mUpload->verifyUpload( );
+ if ( $verification['status'] === UploadBase::OK ) {
+ return;
}
// TODO: Move them to ApiBase's message map
- $verification = $this->mUpload->verifyUpload();
- if ( $verification['status'] !== UploadBase::OK ) {
- $result['result'] = 'Failure';
- switch( $verification['status'] ) {
- case UploadBase::EMPTY_FILE:
- $this->dieUsage( 'The file you submitted was empty', 'empty-file' );
- break;
- case UploadBase::FILETYPE_MISSING:
- $this->dieUsage( 'The file is missing an extension', 'filetype-missing' );
- break;
- case UploadBase::FILETYPE_BADTYPE:
- global $wgFileExtensions;
- $this->dieUsage( 'This type of file is banned', 'filetype-banned',
- 0, array(
- 'filetype' => $verification['finalExt'],
- 'allowed' => $wgFileExtensions
- ) );
- break;
- case UploadBase::MIN_LENGTH_PARTNAME:
- $this->dieUsage( 'The filename is too short', 'filename-tooshort' );
- break;
- case UploadBase::ILLEGAL_FILENAME:
- $this->dieUsage( 'The filename is not allowed', 'illegal-filename',
- 0, array( 'filename' => $verification['filtered'] ) );
- break;
- case UploadBase::OVERWRITE_EXISTING_FILE:
- $this->dieUsage( 'Overwriting an existing file is not allowed', 'overwrite' );
- break;
- case UploadBase::VERIFICATION_ERROR:
- $this->getResult()->setIndexedTagName( $verification['details'], 'detail' );
- $this->dieUsage( 'This file did not pass file verification', 'verification-error',
- 0, array( 'details' => $verification['details'] ) );
- break;
- case UploadBase::HOOK_ABORTED:
- $this->dieUsage( "The modification you tried to make was aborted by an extension hook",
- 'hookaborted', 0, array( 'error' => $verification['error'] ) );
- break;
- default:
- $this->dieUsage( 'An unknown error occurred', 'unknown-error',
- 0, array( 'code' => $verification['status'] ) );
- break;
- }
- return $result;
+ switch( $verification['status'] ) {
+ case UploadBase::EMPTY_FILE:
+ $this->dieUsage( 'The file you submitted was empty', 'empty-file' );
+ break;
+ case UploadBase::FILE_TOO_LARGE:
+ $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
+ break;
+ case UploadBase::FILETYPE_MISSING:
+ $this->dieUsage( 'The file is missing an extension', 'filetype-missing' );
+ break;
+ case UploadBase::FILETYPE_BADTYPE:
+ $this->dieUsage( 'This type of file is banned', 'filetype-banned',
+ 0, array(
+ 'filetype' => $verification['finalExt'],
+ 'allowed' => $wgFileExtensions
+ ) );
+ break;
+ case UploadBase::MIN_LENGTH_PARTNAME:
+ $this->dieUsage( 'The filename is too short', 'filename-tooshort' );
+ break;
+ case UploadBase::ILLEGAL_FILENAME:
+ $this->dieUsage( 'The filename is not allowed', 'illegal-filename',
+ 0, array( 'filename' => $verification['filtered'] ) );
+ break;
+ case UploadBase::VERIFICATION_ERROR:
+ $this->getResult()->setIndexedTagName( $verification['details'], 'detail' );
+ $this->dieUsage( 'This file did not pass file verification', 'verification-error',
+ 0, array( 'details' => $verification['details'] ) );
+ break;
+ case UploadBase::HOOK_ABORTED:
+ $this->dieUsage( "The modification you tried to make was aborted by an extension hook",
+ 'hookaborted', 0, array( 'error' => $verification['error'] ) );
+ break;
+ default:
+ $this->dieUsage( 'An unknown error occurred', 'unknown-error',
+ 0, array( 'code' => $verification['status'] ) );
+ break;
}
+ }
+
+
+ /**
+ * Check warnings if ignorewarnings is not set.
+ * Returns a suitable array for inclusion into API results if there were warnings
+ * Returns the empty array if there were no warnings
+ *
+ * @return array
+ */
+ protected function getApiWarnings() {
+ $warnings = array();
+
if ( !$this->mParams['ignorewarnings'] ) {
$warnings = $this->mUpload->checkWarnings();
if ( $warnings ) {
@@ -181,51 +312,70 @@ class ApiUpload extends ApiBase {
if ( isset( $warnings['duplicate'] ) ) {
$dupes = array();
- foreach ( $warnings['duplicate'] as $key => $dupe )
+ foreach ( $warnings['duplicate'] as $dupe ) {
$dupes[] = $dupe->getName();
+ }
$this->getResult()->setIndexedTagName( $dupes, 'duplicate' );
$warnings['duplicate'] = $dupes;
}
-
if ( isset( $warnings['exists'] ) ) {
$warning = $warnings['exists'];
unset( $warnings['exists'] );
$warnings[$warning['warning']] = $warning['file']->getName();
}
-
- $result['result'] = 'Warning';
- $result['warnings'] = $warnings;
-
- $sessionKey = $this->mUpload->stashSession();
- if ( !$sessionKey )
- $this->dieUsage( 'Stashing temporary file failed', 'stashfailed' );
-
- $result['sessionkey'] = $sessionKey;
-
- return $result;
}
}
+ return $warnings;
+ }
+
+ /**
+ * Perform the actual upload. Returns a suitable result array on success;
+ * dies on failure.
+ */
+ protected function performUpload() {
+ global $wgUser;
+
// Use comment as initial page text by default
- if ( is_null( $this->mParams['text'] ) )
+ if ( is_null( $this->mParams['text'] ) ) {
$this->mParams['text'] = $this->mParams['comment'];
+ }
+
+ $file = $this->mUpload->getLocalFile();
+ $watch = $this->getWatchlistValue( $this->mParams['watchlist'], $file->getTitle() );
+
+ // Deprecated parameters
+ if ( $this->mParams['watch'] ) {
+ $watch = true;
+ }
// No errors, no warnings: do the upload
$status = $this->mUpload->performUpload( $this->mParams['comment'],
- $this->mParams['text'], $this->mParams['watch'], $wgUser );
+ $this->mParams['text'], $watch, $wgUser );
if ( !$status->isGood() ) {
$error = $status->getErrorsArray();
- $this->getResult()->setIndexedTagName( $result['details'], 'error' );
- $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error );
+ if ( count( $error ) == 1 && $error[0][0] == 'async' ) {
+ // The upload can not be performed right now, because the user
+ // requested so
+ return array(
+ 'result' => 'Queued',
+ 'statuskey' => $error[0][1],
+ );
+ } else {
+ $this->getResult()->setIndexedTagName( $error, 'error' );
+
+ $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error );
+ }
}
$file = $this->mUpload->getLocalFile();
+
$result['result'] = 'Success';
$result['filename'] = $file->getName();
- $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+
return $result;
}
@@ -240,36 +390,70 @@ class ApiUpload extends ApiBase {
public function getAllowedParams() {
$params = array(
- 'filename' => null,
+ 'filename' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ),
'comment' => array(
ApiBase::PARAM_DFLT => ''
),
'text' => null,
'token' => null,
- 'watch' => false,
+ 'watch' => array(
+ ApiBase::PARAM_DFLT => false,
+ ApiBase::PARAM_DEPRECATED => true,
+ ),
+ 'watchlist' => array(
+ ApiBase::PARAM_DFLT => 'preferences',
+ ApiBase::PARAM_TYPE => array(
+ 'watch',
+ 'preferences',
+ 'nochange'
+ ),
+ ),
'ignorewarnings' => false,
'file' => null,
'url' => null,
'sessionkey' => null,
+ 'stash' => false,
);
- return $params;
+ global $wgAllowAsyncCopyUploads;
+ if ( $wgAllowAsyncCopyUploads ) {
+ $params += array(
+ 'asyncdownload' => false,
+ 'leavemessage' => false,
+ 'statuskey' => null,
+ );
+ }
+ return $params;
}
public function getParamDescription() {
- return array(
+ $params = array(
'filename' => 'Target filename',
'token' => 'Edit token. You can get one of these through prop=info',
'comment' => 'Upload comment. Also used as the initial page text for new files if "text" is not specified',
'text' => 'Initial page text for new files',
'watch' => 'Watch the page',
+ 'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
'ignorewarnings' => 'Ignore any warnings',
'file' => 'File contents',
'url' => 'Url to fetch the file from',
- 'sessionkey' => array(
- 'Session key returned by a previous upload that failed due to warnings',
- ),
+ 'sessionkey' => 'Session key that identifies a previous upload that was stashed temporarily.',
+ 'stash' => 'If set, the server will not add the file to the repository and stash it temporarily.'
);
+
+ global $wgAllowAsyncCopyUploads;
+ if ( $wgAllowAsyncCopyUploads ) {
+ $params += array(
+ 'asyncdownload' => 'Make fetching a URL asynchronous',
+ 'leavemessage' => 'If asyncdownload is used, leave a message on the user talk page if finished',
+ 'statuskey' => 'Fetch the upload status for this session key',
+ );
+ }
+
+ return $params;
+
}
public function getDescription() {
@@ -281,17 +465,16 @@ class ApiUpload extends ApiBase {
'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
'sending the "file". Note also that queries using session keys must be',
'done in the same login session as the query that originally returned the key (i.e. do not',
- 'log out and then log back in). Also you must get and send an edit token before doing any upload stuff.'
+ 'log out and then log back in). Also you must get and send an edit token before doing any upload stuff'
);
}
-
- public function getPossibleErrors() {
+
+ public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'uploaddisabled' ),
array( 'invalid-session-key' ),
array( 'uploaddisabled' ),
array( 'badaccess-groups' ),
- array( 'missingparam', 'filename' ),
array( 'mustbeloggedin', 'upload' ),
array( 'badaccess-groups' ),
array( 'badaccess-groups' ),
@@ -303,9 +486,9 @@ class ApiUpload extends ApiBase {
array( 'code' => 'overwrite', 'info' => 'Overwriting an existing file is not allowed' ),
array( 'code' => 'stashfailed', 'info' => 'Stashing temporary file failed' ),
array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ),
- ) );
+ ) );
}
-
+
public function needsToken() {
return true;
}
diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php
index be0750d6..f9fe9ad2 100644
--- a/includes/api/ApiUserrights.php
+++ b/includes/api/ApiUserrights.php
@@ -1,10 +1,11 @@
<?php
-/*
- * Created on Mar 24, 2009
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
+ * Created on Mar 24, 2009
+ *
+ * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl
*
* 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
@@ -18,13 +19,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( "ApiBase.php" );
+ require_once( "ApiBase.php" );
}
/**
@@ -33,16 +36,17 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiUserrights extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
+ private $mUser = null;
+
public function execute() {
$params = $this->extractRequestParams();
-
- // User already validated in call to getTokenSalt from Main
+
+ $user = $this->getUser();
+
$form = new UserrightsPage;
- $user = $form->fetchUser( $params['user'] );
-
$r['user'] = $user->getName();
list( $r['added'], $r['removed'] ) =
$form->doSaveUserGroups(
@@ -54,6 +58,29 @@ class ApiUserrights extends ApiBase {
$this->getResult()->addValue( null, $this->getModuleName(), $r );
}
+ /**
+ * @return User
+ */
+ private function getUser() {
+ if ( $this->mUser !== null ) {
+ return $this->mUser;
+ }
+
+ $params = $this->extractRequestParams();
+
+ $form = new UserrightsPage;
+ $status = $form->fetchUser( $params['user'] );
+ if ( !$status->isOK() ) {
+ $errors = $status->getErrorsArray();
+ $this->dieUsageMsg( $errors[0] );
+ } else {
+ $user = $status->value;
+ }
+
+ $this->mUser = $user;
+ return $user;
+ }
+
public function mustBePosted() {
return true;
}
@@ -64,24 +91,27 @@ class ApiUserrights extends ApiBase {
public function getAllowedParams() {
return array (
- 'user' => null,
+ 'user' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
'add' => array(
- ApiBase :: PARAM_TYPE => User::getAllGroups(),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => User::getAllGroups(),
+ ApiBase::PARAM_ISMULTI => true
),
'remove' => array(
- ApiBase :: PARAM_TYPE => User::getAllGroups(),
- ApiBase :: PARAM_ISMULTI => true
+ ApiBase::PARAM_TYPE => User::getAllGroups(),
+ ApiBase::PARAM_ISMULTI => true
),
'token' => null,
'reason' => array(
- ApiBase :: PARAM_DFLT => ''
+ ApiBase::PARAM_DFLT => ''
)
);
}
public function getParamDescription() {
- return array (
+ return array(
'user' => 'User name',
'add' => 'Add the user to these groups',
'remove' => 'Remove the user from these groups',
@@ -91,42 +121,24 @@ class ApiUserrights extends ApiBase {
}
public function getDescription() {
- return array(
- 'Add/remove a user to/from groups',
- );
- }
-
- public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'missingparam', 'user' ),
- ) );
+ return 'Add/remove a user to/from groups';
}
public function needsToken() {
return true;
}
-
- public function getTokenSalt() {
- $params = $this->extractRequestParams();
- if ( is_null( $params['user'] ) )
- $this->dieUsageMsg( array( 'missingparam', 'user' ) );
-
- $form = new UserrightsPage;
- $user = $form->fetchUser( $params['user'] );
- if ( $user instanceof WikiErrorMsg )
- $this->dieUsageMsg( array_merge(
- (array)$user->getMessageKey(), $user->getMessageArgs() ) );
- return $user->getName();
+ public function getTokenSalt() {
+ return $this->getUser()->getName();
}
protected function getExamples() {
- return array (
+ return array(
'api.php?action=userrights&user=FooBot&add=bot&remove=sysop|bureaucrat&token=123ABC'
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiUserrights.php 74217 2010-10-03 15:53:07Z reedy $';
+ return __CLASS__ . ': $Id: ApiUserrights.php 75602 2010-10-28 00:04:48Z reedy $';
}
}
diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php
index 391d91e2..e9560a4d 100644
--- a/includes/api/ApiWatch.php
+++ b/includes/api/ApiWatch.php
@@ -1,11 +1,10 @@
<?php
-
-/*
- * Created on Jan 4, 2008
- *
+/**
* API for MediaWiki 1.8+
*
- * Copyright (C) 2008 Yuri Astrakhan <Firstname><Lastname>@gmail.com,
+ * Created on Jan 4, 2008
+ *
+ * Copyright © 2008 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
@@ -19,13 +18,15 @@
*
* 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
*/
if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ( 'ApiBase.php' );
+ require_once( 'ApiBase.php' );
}
/**
@@ -36,35 +37,37 @@ if ( !defined( 'MEDIAWIKI' ) ) {
class ApiWatch extends ApiBase {
public function __construct( $main, $action ) {
- parent :: __construct( $main, $action );
+ parent::__construct( $main, $action );
}
public function execute() {
global $wgUser;
- if ( !$wgUser->isLoggedIn() )
+ if ( !$wgUser->isLoggedIn() ) {
$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
+ }
$params = $this->extractRequestParams();
$title = Title::newFromText( $params['title'] );
- if ( !$title )
+ if ( !$title ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
$article = new Article( $title );
$res = array( 'title' => $title->getPrefixedText() );
- if ( $params['unwatch'] )
- {
+ if ( $params['unwatch'] ) {
$res['unwatched'] = '';
+ $res['message'] = wfMsgExt( 'removedwatchtext', array( 'parse' ), $title->getPrefixedText() );
$success = $article->doUnwatch();
- }
- else
- {
+ } else {
$res['watched'] = '';
+ $res['message'] = wfMsgExt( 'addedwatchtext', array( 'parse' ), $title->getPrefixedText() );
$success = $article->doWatch();
}
- if ( !$success )
+ if ( !$success ) {
$this->dieUsageMsg( array( 'hookaborted' ) );
+ }
$this->getResult()->addValue( null, $this->getModuleName(), $res );
}
@@ -73,25 +76,27 @@ class ApiWatch extends ApiBase {
}
public function getAllowedParams() {
- return array (
- 'title' => null,
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+
'unwatch' => false,
);
}
public function getParamDescription() {
- return array (
+ return array(
'title' => 'The page to (un)watch',
'unwatch' => 'If set the page will be unwatched rather than watched',
);
}
public function getDescription() {
- return array (
- 'Add or remove a page from/to the current user\'s watchlist'
- );
+ return 'Add or remove a page from/to the current user\'s watchlist';
}
-
+
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ),
@@ -103,11 +108,11 @@ class ApiWatch extends ApiBase {
protected function getExamples() {
return array(
'api.php?action=watch&title=Main_Page',
- 'api.php?action=watch&title=Main_Page&unwatch',
+ 'api.php?action=watch&title=Main_Page&unwatch=',
);
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiWatch.php 69578 2010-07-20 02:46:20Z tstarling $';
+ return __CLASS__ . ': $Id: ApiWatch.php 77192 2010-11-23 22:05:27Z btongminh $';
}
}
diff --git a/includes/db/Database.php b/includes/db/Database.php
index ea5d77da..5acb67fa 100644
--- a/includes/db/Database.php
+++ b/includes/db/Database.php
@@ -4,7 +4,7 @@
*
* @file
* @ingroup Database
- * This file deals with MySQL interface functions
+ * This file deals with database interface functions
* and query specifics/optimisations
*/
@@ -16,14 +16,200 @@ define( 'DEADLOCK_DELAY_MIN', 500000 );
define( 'DEADLOCK_DELAY_MAX', 1500000 );
/**
+ * Base interface for all DBMS-specific code. At a bare minimum, all of the
+ * following must be implemented to support MediaWiki
+ *
+ * @file
+ * @ingroup Database
+ */
+interface DatabaseType {
+ /**
+ * Get the type of the DBMS, as it appears in $wgDBtype.
+ *
+ * @return string
+ */
+ public function getType();
+
+ /**
+ * Open a connection to the database. Usually aborts on failure
+ *
+ * @param $server String: database server host
+ * @param $user String: database user name
+ * @param $password String: database user password
+ * @param $dbName String: database name
+ * @return bool
+ * @throws DBConnectionError
+ */
+ public function open( $server, $user, $password, $dbName );
+
+ /**
+ * The DBMS-dependent part of query()
+ * @todo Fixme: Make this private someday
+ *
+ * @param $sql String: SQL query.
+ * @return Result object to feed to fetchObject, fetchRow, ...; or false on failure
+ * @private
+ */
+ /*private*/ function doQuery( $sql );
+
+ /**
+ * Fetch the next row from the given result object, in object form.
+ * Fields can be retrieved with $row->fieldname, with fields acting like
+ * member variables.
+ *
+ * @param $res SQL result object as returned from DatabaseBase::query(), etc.
+ * @return Row object
+ * @throws DBUnexpectedError Thrown if the database returns an error
+ */
+ public function fetchObject( $res );
+
+ /**
+ * Fetch the next row from the given result object, in associative array
+ * form. Fields are retrieved with $row['fieldname'].
+ *
+ * @param $res SQL result object as returned from DatabaseBase::query(), etc.
+ * @return Row object
+ * @throws DBUnexpectedError Thrown if the database returns an error
+ */
+ public function fetchRow( $res );
+
+ /**
+ * Get the number of rows in a result object
+ *
+ * @param $res Mixed: A SQL result
+ * @return int
+ */
+ public function numRows( $res );
+
+ /**
+ * Get the number of fields in a result object
+ * @see http://www.php.net/mysql_num_fields
+ *
+ * @param $res Mixed: A SQL result
+ * @return int
+ */
+ public function numFields( $res );
+
+ /**
+ * Get a field name in a result object
+ * @see http://www.php.net/mysql_field_name
+ *
+ * @param $res Mixed: A SQL result
+ * @param $n Integer
+ * @return string
+ */
+ public function fieldName( $res, $n );
+
+ /**
+ * Get the inserted value of an auto-increment row
+ *
+ * The value inserted should be fetched from nextSequenceValue()
+ *
+ * Example:
+ * $id = $dbw->nextSequenceValue('page_page_id_seq');
+ * $dbw->insert('page',array('page_id' => $id));
+ * $id = $dbw->insertId();
+ *
+ * @return int
+ */
+ public function insertId();
+
+ /**
+ * Change the position of the cursor in a result object
+ * @see http://www.php.net/mysql_data_seek
+ *
+ * @param $res Mixed: A SQL result
+ * @param $row Mixed: Either MySQL row or ResultWrapper
+ */
+ public function dataSeek( $res, $row );
+
+ /**
+ * Get the last error number
+ * @see http://www.php.net/mysql_errno
+ *
+ * @return int
+ */
+ public function lastErrno();
+
+ /**
+ * Get a description of the last error
+ * @see http://www.php.net/mysql_error
+ *
+ * @return string
+ */
+ public function lastError();
+
+ /**
+ * mysql_fetch_field() wrapper
+ * Returns false if the field doesn't exist
+ *
+ * @param $table string: table name
+ * @param $field string: field name
+ */
+ public function fieldInfo( $table, $field );
+
+ /**
+ * Get information about an index into an object
+ * @param $table string: Table name
+ * @param $index string: Index name
+ * @param $fname string: Calling function name
+ * @return Mixed: Database-specific index description class or false if the index does not exist
+ */
+ function indexInfo( $table, $index, $fname = 'Database::indexInfo' );
+
+ /**
+ * Get the number of rows affected by the last write query
+ * @see http://www.php.net/mysql_affected_rows
+ *
+ * @return int
+ */
+ public function affectedRows();
+
+ /**
+ * Wrapper for addslashes()
+ *
+ * @param $s string: to be slashed.
+ * @return string: slashed string.
+ */
+ public function strencode( $s );
+
+ /**
+ * Returns a wikitext link to the DB's website, e.g.,
+ * return "[http://www.mysql.com/ MySQL]";
+ * Should at least contain plain text, if for some reason
+ * your database has no website.
+ *
+ * @return string: wikitext of a link to the server software's web site
+ */
+ public static function getSoftwareLink();
+
+ /**
+ * A string describing the current software version, like from
+ * mysql_get_server_info().
+ *
+ * @return string: Version information from the database server.
+ */
+ public function getServerVersion();
+
+ /**
+ * A string describing the current software version, and possibly
+ * other details in a user-friendly way. Will be listed on Special:Version, etc.
+ * Use getServerVersion() to get machine-friendly information.
+ *
+ * @return string: Version information from the database server
+ */
+ public function getServerInfo();
+}
+
+/**
* Database abstraction object
* @ingroup Database
*/
-abstract class DatabaseBase {
+abstract class DatabaseBase implements DatabaseType {
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
# Variables
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
protected $mLastQuery = '';
protected $mDoneWrites = false;
@@ -32,7 +218,6 @@ abstract class DatabaseBase {
protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
protected $mOpened = false;
- protected $mFailFunction;
protected $mTablePrefix;
protected $mFlags;
protected $mTrxLevel = 0;
@@ -40,26 +225,22 @@ abstract class DatabaseBase {
protected $mLBInfo = array();
protected $mFakeSlaveLag = null, $mFakeMaster = false;
protected $mDefaultBigSelects = null;
+ protected $mSchemaVars = false;
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
# Accessors
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
# These optionally set a variable and return the previous state
/**
- * Fail function, takes a Database as a parameter
- * Set to false for default, 1 for ignore errors
- */
- function failFunction( $function = null ) {
- return wfSetVar( $this->mFailFunction, $function );
- }
-
- /**
- * Output page, used for reporting errors
- * FALSE means discard output
+ * A string describing the current software version, and possibly
+ * other details in a user-friendly way. Will be listed on Special:Version, etc.
+ * Use getServerVersion() to get machine-friendly information.
+ *
+ * @return string: Version information from the database server
*/
- function setOutputPage( $out ) {
- wfDeprecated( __METHOD__ );
+ public function getServerInfo() {
+ return $this->getServerVersion();
}
/**
@@ -193,8 +374,8 @@ abstract class DatabaseBase {
}
/**
- * Returns true if this database requires that SELECT DISTINCT queries require that all
- ORDER BY expressions occur in the SELECT list per the SQL92 standard
+ * Returns true if this database requires that SELECT DISTINCT queries require that all
+ ORDER BY expressions occur in the SELECT list per the SQL92 standard
*/
function standardSelectDistinct() {
return true;
@@ -216,7 +397,7 @@ abstract class DatabaseBase {
}
/**
- * Return the last query that went through Database::query()
+ * Return the last query that went through DatabaseBase::query()
* @return String
*/
function lastQuery() { return $this->mLastQuery; }
@@ -244,7 +425,7 @@ abstract class DatabaseBase {
* - DBO_TRX: automatically start transactions
* - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
* and removes it in command line mode
- * - DBO_PERSISTENT: use persistant database connection
+ * - DBO_PERSISTENT: use persistant database connection
*/
function setFlag( $flag ) {
$this->mFlags |= $flag;
@@ -266,7 +447,7 @@ abstract class DatabaseBase {
* @return Boolean
*/
function getFlag( $flag ) {
- return !!($this->mFlags & $flag);
+ return !!( $this->mFlags & $flag );
}
/**
@@ -277,7 +458,7 @@ abstract class DatabaseBase {
}
function getWikiID() {
- if( $this->mTablePrefix ) {
+ if ( $this->mTablePrefix ) {
return "{$this->mDBname}-{$this->mTablePrefix}";
} else {
return $this->mDBname;
@@ -285,13 +466,20 @@ abstract class DatabaseBase {
}
/**
- * Get the type of the DBMS, as it appears in $wgDBtype.
+ * Return a path to the DBMS-specific schema, otherwise default to tables.sql
*/
- abstract function getType();
+ public function getSchema() {
+ global $IP;
+ if ( file_exists( "$IP/maintenance/" . $this->getType() . "/tables.sql" ) ) {
+ return "$IP/maintenance/" . $this->getType() . "/tables.sql";
+ } else {
+ return "$IP/maintenance/tables.sql";
+ }
+ }
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
# Other functions
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
/**
* Constructor.
@@ -299,20 +487,18 @@ abstract class DatabaseBase {
* @param $user String: database user name
* @param $password String: database user password
* @param $dbName String: database name
- * @param $failFunction
* @param $flags
* @param $tablePrefix String: database table prefixes. By default use the prefix gave in LocalSettings.php
*/
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $failFunction = false, $flags = 0, $tablePrefix = 'get from global' ) {
-
+ $flags = 0, $tablePrefix = 'get from global'
+ ) {
global $wgOut, $wgDBprefix, $wgCommandLineMode;
+
# Can't get a reference if it hasn't been set yet
if ( !isset( $wgOut ) ) {
$wgOut = null;
}
-
- $this->mFailFunction = $failFunction;
$this->mFlags = $flags;
if ( $this->mFlags & DBO_DEFAULT ) {
@@ -344,27 +530,53 @@ abstract class DatabaseBase {
/**
* Same as new DatabaseMysql( ... ), kept for backward compatibility
- * @param $server String: database server host
- * @param $user String: database user name
- * @param $password String: database user password
- * @param $dbName String: database name
- * @param failFunction
- * @param $flags
+ * @deprecated
*/
- static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 )
- {
- return new DatabaseMysql( $server, $user, $password, $dbName, $failFunction, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
+ wfDeprecated( __METHOD__ );
+ return new DatabaseMysql( $server, $user, $password, $dbName, $flags );
}
/**
- * Usually aborts on failure
- * If the failFunction is set to a non-zero integer, returns success
- * @param $server String: database server host
- * @param $user String: database user name
- * @param $password String: database user password
- * @param $dbName String: database name
- */
- abstract function open( $server, $user, $password, $dbName );
+ * Given a DB type, construct the name of the appropriate child class of
+ * DatabaseBase. This is designed to replace all of the manual stuff like:
+ * $class = 'Database' . ucfirst( strtolower( $type ) );
+ * as well as validate against the canonical list of DB types we have
+ *
+ * This factory function is mostly useful for when you need to connect to a
+ * database other than the MediaWiki default (such as for external auth,
+ * an extension, et cetera). Do not use this to connect to the MediaWiki
+ * database. Example uses in core:
+ * @see LoadBalancer::reallyOpenConnection()
+ * @see ExternalUser_MediaWiki::initFromCond()
+ * @see ForeignDBRepo::getMasterDB()
+ * @see WebInstaller_DBConnect::execute()
+ *
+ * @param $dbType String A possible DB type
+ * @param $p Array An array of options to pass to the constructor.
+ * Valid options are: host, user, password, dbname, flags, tableprefix
+ * @return DatabaseBase subclass or null
+ */
+ public final static function newFromType( $dbType, $p = array() ) {
+ $canonicalDBTypes = array(
+ 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql', 'ibm_db2'
+ );
+ $dbType = strtolower( $dbType );
+
+ if( in_array( $dbType, $canonicalDBTypes ) ) {
+ $class = 'Database' . ucfirst( $dbType );
+ return new $class(
+ isset( $p['host'] ) ? $p['host'] : false,
+ isset( $p['user'] ) ? $p['user'] : false,
+ isset( $p['password'] ) ? $p['password'] : false,
+ isset( $p['dbname'] ) ? $p['dbname'] : false,
+ isset( $p['flags'] ) ? $p['flags'] : 0,
+ isset( $p['tableprefix'] ) ? $p['tableprefix'] : 'get from global'
+ );
+ } else {
+ return null;
+ }
+ }
protected function installErrorHandler() {
$this->mPHPError = false;
@@ -402,7 +614,7 @@ abstract class DatabaseBase {
}
/**
- * @param $error String: fallback error message, used if none is given by MySQL
+ * @param $error String: fallback error message, used if none is given by DB
*/
function reportConnectionError( $error = 'Unknown error' ) {
$myError = $this->lastError();
@@ -410,16 +622,8 @@ abstract class DatabaseBase {
$error = $myError;
}
- if ( $this->mFailFunction ) {
- # Legacy error handling method
- if ( !is_int( $this->mFailFunction ) ) {
- $ff = $this->mFailFunction;
- $ff( $this, $error );
- }
- } else {
- # New method
- throw new DBConnectionError( $this, $error );
- }
+ # New method
+ throw new DBConnectionError( $this, $error );
}
/**
@@ -434,11 +638,11 @@ abstract class DatabaseBase {
* Usually aborts on failure. If errors are explicitly ignored, returns success.
*
* @param $sql String: SQL query
- * @param $fname String: Name of the calling function, for profiling/SHOW PROCESSLIST
+ * @param $fname String: Name of the calling function, for profiling/SHOW PROCESSLIST
* comment (you can use __METHOD__ or add some extra info)
- * @param $tempIgnore Boolean: Whether to avoid throwing an exception on errors...
+ * @param $tempIgnore Boolean: Whether to avoid throwing an exception on errors...
* maybe best to catch the exception instead?
- * @return true for a successful write query, ResultWrapper object for a successful read query,
+ * @return boolean or ResultWrapper. true for a successful write query, ResultWrapper object for a successful read query,
* or false on failure if $tempIgnore set
* @throws DBQueryError Thrown when the database returns an error of any kind
*/
@@ -451,15 +655,16 @@ abstract class DatabaseBase {
# logging size most of the time. The substr is really just a sanity check.
# Who's been wasting my precious column space? -- TS
- #$profName = 'query: ' . $fname . ' ' . substr( Database::generalizeSQL( $sql ), 0, 255 );
+ # $profName = 'query: ' . $fname . ' ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
if ( $isMaster ) {
- $queryProf = 'query-m: ' . substr( Database::generalizeSQL( $sql ), 0, 255 );
- $totalProf = 'Database::query-master';
+ $queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+ $totalProf = 'DatabaseBase::query-master';
} else {
- $queryProf = 'query: ' . substr( Database::generalizeSQL( $sql ), 0, 255 );
- $totalProf = 'Database::query';
+ $queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+ $totalProf = 'DatabaseBase::query';
}
+
wfProfileIn( $totalProf );
wfProfileIn( $queryProf );
}
@@ -467,14 +672,14 @@ abstract class DatabaseBase {
$this->mLastQuery = $sql;
if ( !$this->mDoneWrites && $this->isWriteQuery( $sql ) ) {
// Set a flag indicating that writes have been done
- wfDebug( __METHOD__.": Writes done: $sql\n" );
+ wfDebug( __METHOD__ . ": Writes done: $sql\n" );
$this->mDoneWrites = true;
}
# Add a comment for easy SHOW PROCESSLIST interpretation
- #if ( $fname ) {
+ # if ( $fname ) {
global $wgUser;
- if ( is_object( $wgUser ) && !($wgUser instanceof StubObject) ) {
+ if ( is_object( $wgUser ) && $wgUser->mDataLoaded ) {
$userName = $wgUser->getName();
if ( mb_strlen( $userName ) > 15 ) {
$userName = mb_substr( $userName, 0, 15 ) . '...';
@@ -483,29 +688,33 @@ abstract class DatabaseBase {
} else {
$userName = '';
}
- $commentedSql = preg_replace('/\s/', " /* $fname $userName */ ", $sql, 1);
- #} else {
+ $commentedSql = preg_replace( '/\s/', " /* $fname $userName */ ", $sql, 1 );
+ # } else {
# $commentedSql = $sql;
- #}
+ # }
# If DBO_TRX is set, start a transaction
- if ( ( $this->mFlags & DBO_TRX ) && !$this->trxLevel() &&
- $sql != 'BEGIN' && $sql != 'COMMIT' && $sql != 'ROLLBACK') {
+ if ( ( $this->mFlags & DBO_TRX ) && !$this->trxLevel() &&
+ $sql != 'BEGIN' && $sql != 'COMMIT' && $sql != 'ROLLBACK' ) {
// avoid establishing transactions for SHOW and SET statements too -
- // that would delay transaction initializations to once connection
+ // that would delay transaction initializations to once connection
// is really used by application
- $sqlstart = substr($sql,0,10); // very much worth it, benchmark certified(tm)
- if (strpos($sqlstart,"SHOW ")!==0 and strpos($sqlstart,"SET ")!==0)
- $this->begin();
+ $sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
+ if ( strpos( $sqlstart, "SHOW " ) !== 0 and strpos( $sqlstart, "SET " ) !== 0 )
+ $this->begin();
}
if ( $this->debug() ) {
+ static $cnt = 0;
+
+ $cnt++;
$sqlx = substr( $commentedSql, 0, 500 );
$sqlx = strtr( $sqlx, "\t\n", ' ' );
+
if ( $isMaster ) {
- wfDebug( "SQL-master: $sqlx\n" );
+ wfDebug( "Query $cnt (master): $sqlx\n" );
} else {
- wfDebug( "SQL: $sqlx\n" );
+ wfDebug( "Query $cnt (slave): $sqlx\n" );
}
}
@@ -521,13 +730,17 @@ abstract class DatabaseBase {
# Transaction is gone, like it or not
$this->mTrxLevel = 0;
wfDebug( "Connection lost, reconnecting...\n" );
+
if ( $this->ping() ) {
wfDebug( "Reconnected\n" );
$sqlx = substr( $commentedSql, 0, 500 );
$sqlx = strtr( $sqlx, "\t\n", ' ' );
global $wgRequestTime;
- $elapsed = round( microtime(true) - $wgRequestTime, 3 );
- wfLogDBError( "Connection lost and reconnected after {$elapsed}s, query: $sqlx\n" );
+ $elapsed = round( microtime( true ) - $wgRequestTime, 3 );
+ if ( $elapsed < 300 ) {
+ # Not a database error to lose a transaction after a minute or two
+ wfLogDBError( "Connection lost and reconnected after {$elapsed}s, query: $sqlx\n" );
+ }
$ret = $this->doQuery( $commentedSql );
} else {
wfDebug( "Failed\n" );
@@ -542,18 +755,11 @@ abstract class DatabaseBase {
wfProfileOut( $queryProf );
wfProfileOut( $totalProf );
}
+
return $this->resultObject( $ret );
}
/**
- * The DBMS-dependent part of query()
- * @param $sql String: SQL query.
- * @return Result object to feed to fetchObject, fetchRow, ...; or false on failure
- * @private
- */
- /*private*/ abstract function doQuery( $sql );
-
- /**
* @param $error String
* @param $errno Integer
* @param $sql String
@@ -561,18 +767,17 @@ abstract class DatabaseBase {
* @param $tempIgnore Boolean
*/
function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
- global $wgCommandLineMode;
# Ignore errors during error handling to avoid infinite recursion
$ignore = $this->ignoreErrors( true );
++$this->mErrorCount;
- if( $ignore || $tempIgnore ) {
- wfDebug("SQL ERROR (ignored): $error\n");
+ if ( $ignore || $tempIgnore ) {
+ wfDebug( "SQL ERROR (ignored): $error\n" );
$this->ignoreErrors( $ignore );
} else {
$sql1line = str_replace( "\n", "\\n", $sql );
- wfLogDBError("$fname\t{$this->mServer}\t$errno\t$error\t$sql1line\n");
- wfDebug("SQL ERROR: " . $error . "\n");
+ wfLogDBError( "$fname\t{$this->mServer}\t$errno\t$error\t$sql1line\n" );
+ wfDebug( "SQL ERROR: " . $error . "\n" );
throw new DBQueryError( $this, $error, $errno, $sql, $fname );
}
}
@@ -587,7 +792,7 @@ abstract class DatabaseBase {
* & = filename; reads the file and inserts as a blob
* (we don't use this though...)
*/
- function prepare( $sql, $func = 'Database::prepare' ) {
+ function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
/* MySQL doesn't support prepared statements (yet), so just
pack up the query for reference. We'll manually replace
the bits later. */
@@ -595,7 +800,7 @@ abstract class DatabaseBase {
}
function freePrepared( $prepared ) {
- /* No-op for MySQL */
+ /* No-op by default */
}
/**
@@ -604,12 +809,14 @@ abstract class DatabaseBase {
* @param $args Mixed: Either an array here, or put scalars as varargs
*/
function execute( $prepared, $args = null ) {
- if( !is_array( $args ) ) {
+ if ( !is_array( $args ) ) {
# Pull the var args
$args = func_get_args();
array_shift( $args );
}
+
$sql = $this->fillPrepared( $prepared['query'], $args );
+
return $this->query( $sql, $prepared['func'] );
}
@@ -620,14 +827,17 @@ abstract class DatabaseBase {
* @param $args ...
*/
function safeQuery( $query, $args = null ) {
- $prepared = $this->prepare( $query, 'Database::safeQuery' );
- if( !is_array( $args ) ) {
+ $prepared = $this->prepare( $query, 'DatabaseBase::safeQuery' );
+
+ if ( !is_array( $args ) ) {
# Pull the var args
$args = func_get_args();
array_shift( $args );
}
+
$retval = $this->execute( $prepared, $args );
$this->freePrepared( $prepared );
+
return $retval;
}
@@ -641,6 +851,7 @@ abstract class DatabaseBase {
function fillPrepared( $preparedQuery, $args ) {
reset( $args );
$this->preparedArgs =& $args;
+
return preg_replace_callback( '/(\\\\[?!&]|[?!&])/',
array( &$this, 'fillPreparedArg' ), $preparedQuery );
}
@@ -660,7 +871,9 @@ abstract class DatabaseBase {
case '\\!': return '!';
case '\\&': return '&';
}
+
list( /* $n */ , $arg ) = each( $this->preparedArgs );
+
switch( $matches[1] ) {
case '?': return $this->addQuotes( $arg );
case '!': return $arg;
@@ -682,98 +895,18 @@ abstract class DatabaseBase {
}
/**
- * Fetch the next row from the given result object, in object form.
- * Fields can be retrieved with $row->fieldname, with fields acting like
- * member variables.
- *
- * @param $res SQL result object as returned from Database::query(), etc.
- * @return MySQL row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- abstract function fetchObject( $res );
-
- /**
- * Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
- *
- * @param $res SQL result object as returned from Database::query(), etc.
- * @return MySQL row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- abstract function fetchRow( $res );
-
- /**
- * Get the number of rows in a result object
- * @param $res Mixed: A SQL result
- */
- abstract function numRows( $res );
-
- /**
- * Get the number of fields in a result object
- * See documentation for mysql_num_fields()
- * @param $res Mixed: A SQL result
- */
- abstract function numFields( $res );
-
- /**
- * Get a field name in a result object
- * See documentation for mysql_field_name():
- * http://www.php.net/mysql_field_name
- * @param $res Mixed: A SQL result
- * @param $n Integer
- */
- abstract function fieldName( $res, $n );
-
- /**
- * Get the inserted value of an auto-increment row
- *
- * The value inserted should be fetched from nextSequenceValue()
- *
- * Example:
- * $id = $dbw->nextSequenceValue('page_page_id_seq');
- * $dbw->insert('page',array('page_id' => $id));
- * $id = $dbw->insertId();
- */
- abstract function insertId();
-
- /**
- * Change the position of the cursor in a result object
- * See mysql_data_seek()
- * @param $res Mixed: A SQL result
- * @param $row Mixed: Either MySQL row or ResultWrapper
- */
- abstract function dataSeek( $res, $row );
-
- /**
- * Get the last error number
- * See mysql_errno()
- */
- abstract function lastErrno();
-
- /**
- * Get a description of the last error
- * See mysql_error() for more details
- */
- abstract function lastError();
-
- /**
- * Get the number of rows affected by the last write query
- * See mysql_affected_rows() for more details
- */
- abstract function affectedRows();
-
- /**
* Simple UPDATE wrapper
* Usually aborts on failure
* If errors are explicitly ignored, returns success
*
- * This function exists for historical reasons, Database::update() has a more standard
+ * This function exists for historical reasons, DatabaseBase::update() has a more standard
* calling convention and feature set
*/
- function set( $table, $var, $value, $cond, $fname = 'Database::set' ) {
+ function set( $table, $var, $value, $cond, $fname = 'DatabaseBase::set' ) {
$table = $this->tableName( $table );
$sql = "UPDATE $table SET $var = '" .
$this->strencode( $value ) . "' WHERE ($cond)";
+
return (bool)$this->query( $sql, $fname );
}
@@ -782,19 +915,22 @@ abstract class DatabaseBase {
* Usually aborts on failure
* If errors are explicitly ignored, returns FALSE on failure
*/
- function selectField( $table, $var, $cond='', $fname = 'Database::selectField', $options = array() ) {
+ function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField', $options = array() ) {
if ( !is_array( $options ) ) {
$options = array( $options );
}
+
$options['LIMIT'] = 1;
$res = $this->select( $table, $var, $cond, $fname, $options );
+
if ( $res === false || !$this->numRows( $res ) ) {
return false;
}
+
$row = $this->fetchRow( $res );
+
if ( $row !== false ) {
- $this->freeResult( $res );
return reset( $row );
} else {
return false;
@@ -816,42 +952,82 @@ abstract class DatabaseBase {
$startOpts = '';
$noKeyOptions = array();
+
foreach ( $options as $key => $option ) {
if ( is_numeric( $key ) ) {
$noKeyOptions[$option] = true;
}
}
- if ( isset( $options['GROUP BY'] ) ) $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
- if ( isset( $options['HAVING'] ) ) $preLimitTail .= " HAVING {$options['HAVING']}";
- if ( isset( $options['ORDER BY'] ) ) $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
-
- //if (isset($options['LIMIT'])) {
+ if ( isset( $options['GROUP BY'] ) ) {
+ $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
+ }
+
+ if ( isset( $options['HAVING'] ) ) {
+ $preLimitTail .= " HAVING {$options['HAVING']}";
+ }
+
+ if ( isset( $options['ORDER BY'] ) ) {
+ $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
+ }
+
+ // if (isset($options['LIMIT'])) {
// $tailOpts .= $this->limitResult('', $options['LIMIT'],
- // isset($options['OFFSET']) ? $options['OFFSET']
+ // isset($options['OFFSET']) ? $options['OFFSET']
// : false);
- //}
+ // }
+
+ if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
+ $postLimitTail .= ' FOR UPDATE';
+ }
+
+ if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) {
+ $postLimitTail .= ' LOCK IN SHARE MODE';
+ }
- if ( isset( $noKeyOptions['FOR UPDATE'] ) ) $postLimitTail .= ' FOR UPDATE';
- if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) $postLimitTail .= ' LOCK IN SHARE MODE';
- if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
+ if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
+ $startOpts .= 'DISTINCT';
+ }
# Various MySQL extensions
- if ( isset( $noKeyOptions['STRAIGHT_JOIN'] ) ) $startOpts .= ' /*! STRAIGHT_JOIN */';
- if ( isset( $noKeyOptions['HIGH_PRIORITY'] ) ) $startOpts .= ' HIGH_PRIORITY';
- if ( isset( $noKeyOptions['SQL_BIG_RESULT'] ) ) $startOpts .= ' SQL_BIG_RESULT';
- if ( isset( $noKeyOptions['SQL_BUFFER_RESULT'] ) ) $startOpts .= ' SQL_BUFFER_RESULT';
- if ( isset( $noKeyOptions['SQL_SMALL_RESULT'] ) ) $startOpts .= ' SQL_SMALL_RESULT';
- if ( isset( $noKeyOptions['SQL_CALC_FOUND_ROWS'] ) ) $startOpts .= ' SQL_CALC_FOUND_ROWS';
- if ( isset( $noKeyOptions['SQL_CACHE'] ) ) $startOpts .= ' SQL_CACHE';
- if ( isset( $noKeyOptions['SQL_NO_CACHE'] ) ) $startOpts .= ' SQL_NO_CACHE';
+ if ( isset( $noKeyOptions['STRAIGHT_JOIN'] ) ) {
+ $startOpts .= ' /*! STRAIGHT_JOIN */';
+ }
+
+ if ( isset( $noKeyOptions['HIGH_PRIORITY'] ) ) {
+ $startOpts .= ' HIGH_PRIORITY';
+ }
+
+ if ( isset( $noKeyOptions['SQL_BIG_RESULT'] ) ) {
+ $startOpts .= ' SQL_BIG_RESULT';
+ }
+
+ if ( isset( $noKeyOptions['SQL_BUFFER_RESULT'] ) ) {
+ $startOpts .= ' SQL_BUFFER_RESULT';
+ }
+
+ if ( isset( $noKeyOptions['SQL_SMALL_RESULT'] ) ) {
+ $startOpts .= ' SQL_SMALL_RESULT';
+ }
+
+ if ( isset( $noKeyOptions['SQL_CALC_FOUND_ROWS'] ) ) {
+ $startOpts .= ' SQL_CALC_FOUND_ROWS';
+ }
+
+ if ( isset( $noKeyOptions['SQL_CACHE'] ) ) {
+ $startOpts .= ' SQL_CACHE';
+ }
+
+ if ( isset( $noKeyOptions['SQL_NO_CACHE'] ) ) {
+ $startOpts .= ' SQL_NO_CACHE';
+ }
if ( isset( $options['USE INDEX'] ) && ! is_array( $options['USE INDEX'] ) ) {
$useIndex = $this->useIndexClause( $options['USE INDEX'] );
} else {
$useIndex = '';
}
-
+
return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
}
@@ -863,44 +1039,47 @@ abstract class DatabaseBase {
* @param $conds Mixed: Array or string, condition(s) for WHERE
* @param $fname String: Calling function name (use __METHOD__) for logs/profiling
* @param $options Array: Associative array of options (e.g. array('GROUP BY' => 'page_title')),
- * see Database::makeSelectOptions code for list of supported stuff
+ * see DatabaseBase::makeSelectOptions code for list of supported stuff
* @param $join_conds Array: Associative array of table join conditions (optional)
* (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
- * @return mixed Database result resource (feed to Database::fetchObject or whatever), or false on failure
+ * @return mixed Database result resource (feed to DatabaseBase::fetchObject or whatever), or false on failure
*/
- function select( $table, $vars, $conds='', $fname = 'Database::select', $options = array(), $join_conds = array() )
- {
+ function select( $table, $vars, $conds = '', $fname = 'DatabaseBase::select', $options = array(), $join_conds = array() ) {
$sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+
return $this->query( $sql, $fname );
}
-
+
/**
* SELECT wrapper
*
- * @param $table Mixed: Array or string, table name(s) (prefix auto-added)
+ * @param $table Mixed: Array or string, table name(s) (prefix auto-added). Array keys are table aliases (optional)
* @param $vars Mixed: Array or string, field name(s) to be retrieved
* @param $conds Mixed: Array or string, condition(s) for WHERE
* @param $fname String: Calling function name (use __METHOD__) for logs/profiling
* @param $options Array: Associative array of options (e.g. array('GROUP BY' => 'page_title')),
- * see Database::makeSelectOptions code for list of supported stuff
+ * see DatabaseBase::makeSelectOptions code for list of supported stuff
* @param $join_conds Array: Associative array of table join conditions (optional)
* (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
* @return string, the SQL text
*/
- function selectSQLText( $table, $vars, $conds='', $fname = 'Database::select', $options = array(), $join_conds = array() ) {
- if( is_array( $vars ) ) {
+ function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseBase::select', $options = array(), $join_conds = array() ) {
+ if ( is_array( $vars ) ) {
$vars = implode( ',', $vars );
}
- if( !is_array( $options ) ) {
+
+ if ( !is_array( $options ) ) {
$options = array( $options );
}
- if( is_array( $table ) ) {
- if ( !empty($join_conds) || ( isset( $options['USE INDEX'] ) && is_array( @$options['USE INDEX'] ) ) )
+
+ if ( is_array( $table ) ) {
+ if ( !empty( $join_conds ) || ( isset( $options['USE INDEX'] ) && is_array( @$options['USE INDEX'] ) ) ) {
$from = ' FROM ' . $this->tableNamesWithUseIndexOrJOIN( $table, @$options['USE INDEX'], $join_conds );
- else
- $from = ' FROM ' . implode( ',', array_map( array( &$this, 'tableName' ), $table ) );
- } elseif ($table!='') {
- if ($table{0}==' ') {
+ } else {
+ $from = ' FROM ' . implode( ',', $this->tableNamesWithAlias( $table ) );
+ }
+ } elseif ( $table != '' ) {
+ if ( $table { 0 } == ' ' ) {
$from = ' FROM ' . $table;
} else {
$from = ' FROM ' . $this->tableName( $table );
@@ -911,7 +1090,7 @@ abstract class DatabaseBase {
list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) = $this->makeSelectOptions( $options );
- if( !empty( $conds ) ) {
+ if ( !empty( $conds ) ) {
if ( is_array( $conds ) ) {
$conds = $this->makeList( $conds, LIST_AND );
}
@@ -920,14 +1099,15 @@ abstract class DatabaseBase {
$sql = "SELECT $startOpts $vars $from $useIndex $preLimitTail";
}
- if (isset($options['LIMIT']))
- $sql = $this->limitResult($sql, $options['LIMIT'],
- isset($options['OFFSET']) ? $options['OFFSET'] : false);
+ if ( isset( $options['LIMIT'] ) )
+ $sql = $this->limitResult( $sql, $options['LIMIT'],
+ isset( $options['OFFSET'] ) ? $options['OFFSET'] : false );
$sql = "$sql $postLimitTail";
-
- if (isset($options['EXPLAIN'])) {
+
+ if ( isset( $options['EXPLAIN'] ) ) {
$sql = 'EXPLAIN ' . $sql;
}
+
return $sql;
}
@@ -949,42 +1129,45 @@ abstract class DatabaseBase {
*
* @todo migrate documentation to phpdocumentor format
*/
- function selectRow( $table, $vars, $conds, $fname = 'Database::selectRow', $options = array(), $join_conds = array() ) {
+ function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow', $options = array(), $join_conds = array() ) {
$options['LIMIT'] = 1;
$res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds );
- if ( $res === false )
+
+ if ( $res === false ) {
return false;
- if ( !$this->numRows($res) ) {
- $this->freeResult($res);
+ }
+
+ if ( !$this->numRows( $res ) ) {
return false;
}
+
$obj = $this->fetchObject( $res );
- $this->freeResult( $res );
- return $obj;
+ return $obj;
}
-
+
/**
* Estimate rows in dataset
* Returns estimated count - not necessarily an accurate estimate across different databases,
* so use sparingly
- * Takes same arguments as Database::select()
+ * Takes same arguments as DatabaseBase::select()
*
- * @param string $table table name
- * @param array $vars unused
- * @param array $conds filters on the table
- * @param string $fname function name for profiling
- * @param array $options options for select
- * @return int row count
+ * @param $table String: table name
+ * @param $vars Array: unused
+ * @param $conds Array: filters on the table
+ * @param $fname String: function name for profiling
+ * @param $options Array: options for select
+ * @return Integer: row count
*/
- public function estimateRowCount( $table, $vars='*', $conds='', $fname = 'Database::estimateRowCount', $options = array() ) {
+ public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseBase::estimateRowCount', $options = array() ) {
$rows = 0;
$res = $this->select ( $table, 'COUNT(*) AS rowcount', $conds, $fname, $options );
+
if ( $res ) {
$row = $this->fetchRow( $res );
$rows = ( isset( $row['rowcount'] ) ) ? $row['rowcount'] : 0;
}
- $this->freeResult( $res );
+
return $rows;
}
@@ -999,42 +1182,33 @@ abstract class DatabaseBase {
# as to avoid crashing php on some large strings.
# $sql = preg_replace ( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql);
- $sql = str_replace ( "\\\\", '', $sql);
- $sql = str_replace ( "\\'", '', $sql);
- $sql = str_replace ( "\\\"", '', $sql);
- $sql = preg_replace ("/'.*'/s", "'X'", $sql);
- $sql = preg_replace ('/".*"/s', "'X'", $sql);
+ $sql = str_replace ( "\\\\", '', $sql );
+ $sql = str_replace ( "\\'", '', $sql );
+ $sql = str_replace ( "\\\"", '', $sql );
+ $sql = preg_replace ( "/'.*'/s", "'X'", $sql );
+ $sql = preg_replace ( '/".*"/s', "'X'", $sql );
# All newlines, tabs, etc replaced by single space
- $sql = preg_replace ( '/\s+/', ' ', $sql);
+ $sql = preg_replace ( '/\s+/', ' ', $sql );
# All numbers => N
- $sql = preg_replace ('/-?[0-9]+/s', 'N', $sql);
+ $sql = preg_replace ( '/-?[0-9]+/s', 'N', $sql );
return $sql;
}
/**
* Determines whether a field exists in a table
- * Usually aborts on failure
- * If errors are explicitly ignored, returns NULL on failure
+ *
+ * @param $table String: table name
+ * @param $field String: filed to check on that table
+ * @param $fname String: calling function name (optional)
+ * @return Boolean: whether $table has filed $field
*/
- function fieldExists( $table, $field, $fname = 'Database::fieldExists' ) {
- $table = $this->tableName( $table );
- $res = $this->query( 'DESCRIBE '.$table, $fname );
- if ( !$res ) {
- return null;
- }
-
- $found = false;
+ function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
+ $info = $this->fieldInfo( $table, $field );
- while ( $row = $this->fetchObject( $res ) ) {
- if ( $row->Field == $field ) {
- $found = true;
- break;
- }
- }
- return $found;
+ return (bool)$info;
}
/**
@@ -1042,7 +1216,7 @@ abstract class DatabaseBase {
* Usually aborts on failure
* If errors are explicitly ignored, returns NULL on failure
*/
- function indexExists( $table, $index, $fname = 'Database::indexExists' ) {
+ function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
$info = $this->indexInfo( $table, $index, $fname );
if ( is_null( $info ) ) {
return null;
@@ -1051,58 +1225,17 @@ abstract class DatabaseBase {
}
}
-
- /**
- * Get information about an index into an object
- * Returns false if the index does not exist
- */
- function indexInfo( $table, $index, $fname = 'Database::indexInfo' ) {
- # SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
- # SHOW INDEX should work for 3.x and up:
- # http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
- $table = $this->tableName( $table );
- $index = $this->indexName( $index );
- $sql = 'SHOW INDEX FROM '.$table;
- $res = $this->query( $sql, $fname );
- if ( !$res ) {
- return null;
- }
-
- $result = array();
- while ( $row = $this->fetchObject( $res ) ) {
- if ( $row->Key_name == $index ) {
- $result[] = $row;
- }
- }
- $this->freeResult($res);
-
- return empty($result) ? false : $result;
- }
-
/**
* Query whether a given table exists
*/
function tableExists( $table ) {
$table = $this->tableName( $table );
$old = $this->ignoreErrors( true );
- $res = $this->query( "SELECT 1 FROM $table LIMIT 1" );
+ $res = $this->query( "SELECT 1 FROM $table LIMIT 1", __METHOD__ );
$this->ignoreErrors( $old );
- if( $res ) {
- $this->freeResult( $res );
- return true;
- } else {
- return false;
- }
- }
- /**
- * mysql_fetch_field() wrapper
- * Returns false if the field doesn't exist
- *
- * @param $table
- * @param $field
- */
- abstract function fieldInfo( $table, $field );
+ return (bool)$res;
+ }
/**
* mysql_field_type() wrapper
@@ -1111,6 +1244,7 @@ abstract class DatabaseBase {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
+
return mysql_field_type( $res, $index );
}
@@ -1119,9 +1253,11 @@ abstract class DatabaseBase {
*/
function indexUnique( $table, $index ) {
$indexInfo = $this->indexInfo( $table, $index );
+
if ( !$indexInfo ) {
return null;
}
+
return !$indexInfo[0]->Non_unique;
}
@@ -1133,17 +1269,26 @@ abstract class DatabaseBase {
*
* Usually aborts on failure
* If errors are explicitly ignored, returns success
+ *
+ * @param $table String: table name (prefix auto-added)
+ * @param $a Array: Array of rows to insert
+ * @param $fname String: Calling function name (use __METHOD__) for logs/profiling
+ * @param $options Mixed: Associative array of options
+ *
+ * @return bool
*/
- function insert( $table, $a, $fname = 'Database::insert', $options = array() ) {
+ function insert( $table, $a, $fname = 'DatabaseBase::insert', $options = array() ) {
# No rows to insert, easy just return now
if ( !count( $a ) ) {
return true;
}
$table = $this->tableName( $table );
+
if ( !is_array( $options ) ) {
$options = array( $options );
}
+
if ( isset( $a[0] ) && is_array( $a[0] ) ) {
$multi = true;
$keys = array_keys( $a[0] );
@@ -1168,26 +1313,33 @@ abstract class DatabaseBase {
} else {
$sql .= '(' . $this->makeList( $a ) . ')';
}
+
return (bool)$this->query( $sql, $fname );
}
/**
- * Make UPDATE options for the Database::update function
+ * Make UPDATE options for the DatabaseBase::update function
*
* @private
- * @param $options Array: The options passed to Database::update
+ * @param $options Array: The options passed to DatabaseBase::update
* @return string
*/
function makeUpdateOptions( $options ) {
- if( !is_array( $options ) ) {
+ if ( !is_array( $options ) ) {
$options = array( $options );
}
+
$opts = array();
- if ( in_array( 'LOW_PRIORITY', $options ) )
+
+ if ( in_array( 'LOW_PRIORITY', $options ) ) {
$opts[] = $this->lowPriorityOption();
- if ( in_array( 'IGNORE', $options ) )
+ }
+
+ if ( in_array( 'IGNORE', $options ) ) {
$opts[] = 'IGNORE';
- return implode(' ', $opts);
+ }
+
+ return implode( ' ', $opts );
}
/**
@@ -1202,13 +1354,15 @@ abstract class DatabaseBase {
* more of IGNORE, LOW_PRIORITY
* @return Boolean
*/
- function update( $table, $values, $conds, $fname = 'Database::update', $options = array() ) {
+ function update( $table, $values, $conds, $fname = 'DatabaseBase::update', $options = array() ) {
$table = $this->tableName( $table );
$opts = $this->makeUpdateOptions( $options );
$sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET );
+
if ( $conds != '*' ) {
$sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
}
+
return $this->query( $sql, $fname );
}
@@ -1223,16 +1377,17 @@ abstract class DatabaseBase {
*/
function makeList( $a, $mode = LIST_COMMA ) {
if ( !is_array( $a ) ) {
- throw new DBUnexpectedError( $this, 'Database::makeList called with incorrect parameters' );
+ throw new DBUnexpectedError( $this, 'DatabaseBase::makeList called with incorrect parameters' );
}
$first = true;
$list = '';
+
foreach ( $a as $field => $value ) {
if ( !$first ) {
if ( $mode == LIST_AND ) {
$list .= ' AND ';
- } elseif($mode == LIST_OR) {
+ } elseif ( $mode == LIST_OR ) {
$list .= ' OR ';
} else {
$list .= ',';
@@ -1240,23 +1395,24 @@ abstract class DatabaseBase {
} else {
$first = false;
}
- if ( ($mode == LIST_AND || $mode == LIST_OR) && is_numeric( $field ) ) {
+
+ if ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_numeric( $field ) ) {
$list .= "($value)";
- } elseif ( ($mode == LIST_SET) && is_numeric( $field ) ) {
+ } elseif ( ( $mode == LIST_SET ) && is_numeric( $field ) ) {
$list .= "$value";
- } elseif ( ($mode == LIST_AND || $mode == LIST_OR) && is_array($value) ) {
- if( count( $value ) == 0 ) {
- throw new MWException( __METHOD__.': empty input' );
- } elseif( count( $value ) == 1 ) {
+ } elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
+ if ( count( $value ) == 0 ) {
+ throw new MWException( __METHOD__ . ': empty input' );
+ } elseif ( count( $value ) == 1 ) {
// Special-case single values, as IN isn't terribly efficient
// Don't necessarily assume the single key is 0; we don't
// enforce linear numeric ordering on other arrays here.
$value = array_values( $value );
- $list .= $field." = ".$this->addQuotes( $value[0] );
+ $list .= $field . " = " . $this->addQuotes( $value[0] );
} else {
- $list .= $field." IN (".$this->makeList($value).") ";
+ $list .= $field . " IN (" . $this->makeList( $value ) . ") ";
}
- } elseif( $value === null ) {
+ } elseif ( $value === null ) {
if ( $mode == LIST_AND || $mode == LIST_OR ) {
$list .= "$field IS ";
} elseif ( $mode == LIST_SET ) {
@@ -1270,35 +1426,64 @@ abstract class DatabaseBase {
$list .= $mode == LIST_NAMES ? $value : $this->addQuotes( $value );
}
}
+
return $list;
}
/**
+ * Build a partial where clause from a 2-d array such as used for LinkBatch.
+ * The keys on each level may be either integers or strings.
+ *
+ * @param $data Array: organized as 2-d array(baseKeyVal => array(subKeyVal => <ignored>, ...), ...)
+ * @param $baseKey String: field name to match the base-level keys to (eg 'pl_namespace')
+ * @param $subKey String: field name to match the sub-level keys to (eg 'pl_title')
+ * @return Mixed: string SQL fragment, or false if no items in array.
+ */
+ function makeWhereFrom2d( $data, $baseKey, $subKey ) {
+ $conds = array();
+
+ foreach ( $data as $base => $sub ) {
+ if ( count( $sub ) ) {
+ $conds[] = $this->makeList(
+ array( $baseKey => $base, $subKey => array_keys( $sub ) ),
+ LIST_AND );
+ }
+ }
+
+ if ( $conds ) {
+ return $this->makeList( $conds, LIST_OR );
+ } else {
+ // Nothing to search for...
+ return false;
+ }
+ }
+
+ /**
* Bitwise operations
*/
- function bitNot($field) {
- return "(~$bitField)";
+ function bitNot( $field ) {
+ return "(~$field)";
}
- function bitAnd($fieldLeft, $fieldRight) {
+ function bitAnd( $fieldLeft, $fieldRight ) {
return "($fieldLeft & $fieldRight)";
}
- function bitOr($fieldLeft, $fieldRight) {
+ function bitOr( $fieldLeft, $fieldRight ) {
return "($fieldLeft | $fieldRight)";
}
/**
* Change the current database
*
+ * @todo Explain what exactly will fail if this is not overridden.
* @return bool Success or failure
*/
function selectDB( $db ) {
# Stub. Shouldn't cause serious problems if it's not overridden, but
# if your database engine supports a concept similar to MySQL's
- # databases you may as well. TODO: explain what exactly will fail if
- # this is not overridden.
+ # databases you may as well.
return true;
}
@@ -1335,8 +1520,10 @@ abstract class DatabaseBase {
# Note that we check the end so that we will still quote any use of
# use of `database`.table. But won't break things if someone wants
# to query a database table with a dot in the name.
- if ( $name[0] == '`' && substr( $name, -1, 1 ) == '`' ) return $name;
-
+ if ( $name[0] == '`' && substr( $name, -1, 1 ) == '`' ) {
+ return $name;
+ }
+
# Lets test for any bits of text that should never show up in a table
# name. Basically anything like JOIN or ON which are actually part of
# SQL queries, but may end up inside of the table value to combine
@@ -1344,23 +1531,30 @@ abstract class DatabaseBase {
# Note that we use a whitespace test rather than a \b test to avoid
# any remote case where a word like on may be inside of a table name
# surrounded by symbols which may be considered word breaks.
- if( preg_match( '/(^|\s)(DISTINCT|JOIN|ON|AS)(\s|$)/i', $name ) !== 0 ) return $name;
-
+ if ( preg_match( '/(^|\s)(DISTINCT|JOIN|ON|AS)(\s|$)/i', $name ) !== 0 ) {
+ return $name;
+ }
+
# Split database and table into proper variables.
# We reverse the explode so that database.table and table both output
# the correct table.
$dbDetails = array_reverse( explode( '.', $name, 2 ) );
- if( isset( $dbDetails[1] ) ) @list( $table, $database ) = $dbDetails;
- else @list( $table ) = $dbDetails;
+ if ( isset( $dbDetails[1] ) ) {
+ @list( $table, $database ) = $dbDetails;
+ } else {
+ @list( $table ) = $dbDetails;
+ }
$prefix = $this->mTablePrefix; # Default prefix
-
+
# A database name has been specified in input. Quote the table name
# because we don't want any prefixes added.
- if( isset($database) ) $table = ( $table[0] == '`' ? $table : "`{$table}`" );
-
+ if ( isset( $database ) ) {
+ $table = ( $table[0] == '`' ? $table : "`{$table}`" );
+ }
+
# Note that we use the long format because php will complain in in_array if
# the input is not an array, and will complain in is_array if it is not set.
- if( !isset( $database ) # Don't use shared database if pre selected.
+ if ( !isset( $database ) # Don't use shared database if pre selected.
&& isset( $wgSharedDB ) # We have a shared database
&& $table[0] != '`' # Paranoia check to prevent shared tables listing '`table`'
&& isset( $wgSharedTables )
@@ -1369,15 +1563,16 @@ abstract class DatabaseBase {
$database = $wgSharedDB;
$prefix = isset( $wgSharedPrefix ) ? $wgSharedPrefix : $prefix;
}
-
+
# Quote the $database and $table and apply the prefix if not quoted.
- if( isset($database) ) $database = ( $database[0] == '`' ? $database : "`{$database}`" );
+ if ( isset( $database ) ) {
+ $database = ( $database[0] == '`' ? $database : "`{$database}`" );
+ }
$table = ( $table[0] == '`' ? $table : "`{$prefix}{$table}`" );
-
+
# Merge our database and table into our final table name.
- $tableName = ( isset($database) ? "{$database}.{$table}" : "{$table}" );
-
- # We're finished, return.
+ $tableName = ( isset( $database ) ? "{$database}.{$table}" : "{$table}" );
+
return $tableName;
}
@@ -1393,12 +1588,14 @@ abstract class DatabaseBase {
public function tableNames() {
$inArray = func_get_args();
$retVal = array();
+
foreach ( $inArray as $name ) {
$retVal[$name] = $this->tableName( $name );
}
+
return $retVal;
}
-
+
/**
* Fetch a number of table names into an zero-indexed numerical array
* This is handy when you need to construct SQL for joins
@@ -1411,47 +1608,97 @@ abstract class DatabaseBase {
public function tableNamesN() {
$inArray = func_get_args();
$retVal = array();
+
foreach ( $inArray as $name ) {
$retVal[] = $this->tableName( $name );
}
+
return $retVal;
}
/**
+ * Get an aliased table name
+ * e.g. tableName AS newTableName
+ *
+ * @param $name string Table name, see tableName()
+ * @param $alias string Alias (optional)
+ * @return string SQL name for aliased table. Will not alias a table to its own name
+ */
+ public function tableNameWithAlias( $name, $alias = false ) {
+ if ( !$alias || $alias == $name ) {
+ return $this->tableName( $name );
+ } else {
+ return $this->tableName( $name ) . ' ' . $this->addIdentifierQuotes( $alias );
+ }
+ }
+
+ /**
+ * Gets an array of aliased table names
+ *
+ * @param $tables array( [alias] => table )
+ * @return array of strings, see tableNameWithAlias()
+ */
+ public function tableNamesWithAlias( $tables ) {
+ $retval = array();
+ foreach ( $tables as $alias => $table ) {
+ if ( is_numeric( $alias ) ) {
+ $alias = $table;
+ }
+ $retval[] = $this->tableNameWithAlias( $table, $alias );
+ }
+ return $retval;
+ }
+
+ /**
* @private
*/
function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
$ret = array();
$retJOIN = array();
- $use_index_safe = is_array($use_index) ? $use_index : array();
- $join_conds_safe = is_array($join_conds) ? $join_conds : array();
- foreach ( $tables as $table ) {
+ $use_index_safe = is_array( $use_index ) ? $use_index : array();
+ $join_conds_safe = is_array( $join_conds ) ? $join_conds : array();
+
+ foreach ( $tables as $alias => $table ) {
+ if ( !is_string( $alias ) ) {
+ // No alias? Set it equal to the table name
+ $alias = $table;
+ }
// Is there a JOIN and INDEX clause for this table?
- if ( isset($join_conds_safe[$table]) && isset($use_index_safe[$table]) ) {
- $tableClause = $join_conds_safe[$table][0] . ' ' . $this->tableName( $table );
- $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$table] ) );
- $tableClause .= ' ON (' . $this->makeList((array)$join_conds_safe[$table][1], LIST_AND) . ')';
+ if ( isset( $join_conds_safe[$alias] ) && isset( $use_index_safe[$alias] ) ) {
+ $tableClause = $join_conds_safe[$alias][0] . ' ' . $this->tableNameWithAlias( $table, $alias );
+ $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$alias] ) );
+ $on = $this->makeList( (array)$join_conds_safe[$alias][1], LIST_AND );
+ if ( $on != '' ) {
+ $tableClause .= ' ON (' . $on . ')';
+ }
+
$retJOIN[] = $tableClause;
// Is there an INDEX clause?
- } else if ( isset($use_index_safe[$table]) ) {
- $tableClause = $this->tableName( $table );
- $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$table] ) );
+ } else if ( isset( $use_index_safe[$alias] ) ) {
+ $tableClause = $this->tableNameWithAlias( $table, $alias );
+ $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$alias] ) );
$ret[] = $tableClause;
// Is there a JOIN clause?
- } else if ( isset($join_conds_safe[$table]) ) {
- $tableClause = $join_conds_safe[$table][0] . ' ' . $this->tableName( $table );
- $tableClause .= ' ON (' . $this->makeList((array)$join_conds_safe[$table][1], LIST_AND) . ')';
+ } else if ( isset( $join_conds_safe[$alias] ) ) {
+ $tableClause = $join_conds_safe[$alias][0] . ' ' . $this->tableNameWithAlias( $table, $alias );
+ $on = $this->makeList( (array)$join_conds_safe[$alias][1], LIST_AND );
+ if ( $on != '' ) {
+ $tableClause .= ' ON (' . $on . ')';
+ }
+
$retJOIN[] = $tableClause;
} else {
- $tableClause = $this->tableName( $table );
+ $tableClause = $this->tableNameWithAlias( $table, $alias );
$ret[] = $tableClause;
}
}
+
// We can't separate explicit JOIN clauses with ',', use ' ' for those
- $straightJoins = !empty($ret) ? implode( ',', $ret ) : "";
- $otherJoins = !empty($retJOIN) ? implode( ' ', $retJOIN ) : "";
+ $straightJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
+ $otherJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
+
// Compile our final table clause
- return implode(' ',array($straightJoins,$otherJoins) );
+ return implode( ' ', array( $straightJoins, $otherJoins ) );
}
/**
@@ -1464,7 +1711,8 @@ abstract class DatabaseBase {
'un_user_id' => 'user_id',
'un_user_ip' => 'user_ip',
);
- if( isset( $renamed[$index] ) ) {
+
+ if ( isset( $renamed[$index] ) ) {
return $renamed[$index];
} else {
return $index;
@@ -1472,13 +1720,6 @@ abstract class DatabaseBase {
}
/**
- * Wrapper for addslashes()
- * @param $s String: to be slashed.
- * @return String: slashed string.
- */
- abstract function strencode( $s );
-
- /**
* If it's a string, adds quotes and backslashes
* Otherwise returns as-is
*/
@@ -1495,14 +1736,42 @@ abstract class DatabaseBase {
}
/**
+ * Quotes an identifier using `backticks` or "double quotes" depending on the database type.
+ * MySQL uses `backticks` while basically everything else uses double quotes.
+ * Since MySQL is the odd one out here the double quotes are our generic
+ * and we implement backticks in DatabaseMysql.
+ */
+ public function addIdentifierQuotes( $s ) {
+ return '"' . str_replace( '"', '""', $s ) . '"';
+ }
+
+ /**
+ * Backwards compatibility, identifier quoting originated in DatabasePostgres
+ * which used quote_ident which does not follow our naming conventions
+ * was renamed to addIdentifierQuotes.
+ * @deprecated use addIdentifierQuotes
+ */
+ function quote_ident( $s ) {
+ wfDeprecated( __METHOD__ );
+ return $this->addIdentifierQuotes( $s );
+ }
+
+ /**
* Escape string for safe LIKE usage.
* WARNING: you should almost never use this function directly,
* instead use buildLike() that escapes everything automatically
+ * Deprecated in 1.17, warnings in 1.17, removed in ???
*/
- function escapeLike( $s ) {
+ public function escapeLike( $s ) {
+ wfDeprecated( __METHOD__ );
+ return $this->escapeLikeInternal( $s );
+ }
+
+ protected function escapeLikeInternal( $s ) {
$s = str_replace( '\\', '\\\\', $s );
$s = $this->strencode( $s );
$s = str_replace( array( '%', '_' ), array( '\%', '\_' ), $s );
+
return $s;
}
@@ -1510,27 +1779,31 @@ abstract class DatabaseBase {
* LIKE statement wrapper, receives a variable-length argument list with parts of pattern to match
* containing either string literals that will be escaped or tokens returned by anyChar() or anyString().
* Alternatively, the function could be provided with an array of aforementioned parameters.
- *
+ *
* Example: $dbr->buildLike( 'My_page_title/', $dbr->anyString() ) returns a LIKE clause that searches
* for subpages of 'My page title'.
* Alternatively: $pattern = array( 'My_page_title/', $dbr->anyString() ); $query .= $dbr->buildLike( $pattern );
*
- * @ return String: fully built LIKE statement
+ * @since 1.16
+ * @return String: fully built LIKE statement
*/
function buildLike() {
$params = func_get_args();
- if (count($params) > 0 && is_array($params[0])) {
+
+ if ( count( $params ) > 0 && is_array( $params[0] ) ) {
$params = $params[0];
}
$s = '';
- foreach( $params as $value) {
- if( $value instanceof LikeMatch ) {
+
+ foreach ( $params as $value ) {
+ if ( $value instanceof LikeMatch ) {
$s .= $value->toString();
} else {
- $s .= $this->escapeLike( $value );
+ $s .= $this->escapeLikeInternal( $value );
}
}
+
return " LIKE '" . $s . "' ";
}
@@ -1580,9 +1853,12 @@ abstract class DatabaseBase {
* However if you do this, you run the risk of encountering errors which wouldn't have
* occurred in MySQL
*
- * @todo migrate comment to phodocumentor format
+ * @param $table String: The table to replace the row(s) in.
+ * @param $uniqueIndexes Array: An associative array of indexes
+ * @param $rows Array: Array of rows to replace
+ * @param $fname String: Calling function name (use __METHOD__) for logs/profiling
*/
- function replace( $table, $uniqueIndexes, $rows, $fname = 'Database::replace' ) {
+ function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
$table = $this->tableName( $table );
# Single row case
@@ -1590,16 +1866,19 @@ abstract class DatabaseBase {
$rows = array( $rows );
}
- $sql = "REPLACE INTO $table (" . implode( ',', array_keys( $rows[0] ) ) .') VALUES ';
+ $sql = "REPLACE INTO $table (" . implode( ',', array_keys( $rows[0] ) ) . ') VALUES ';
$first = true;
+
foreach ( $rows as $row ) {
if ( $first ) {
$first = false;
} else {
$sql .= ',';
}
+
$sql .= '(' . $this->makeList( $row ) . ')';
}
+
return $this->query( $sql, $fname );
}
@@ -1619,14 +1898,15 @@ abstract class DatabaseBase {
* @param $conds Array: Condition array of field names mapped to variables, ANDed together in the WHERE clause
* @param $fname String: Calling function name (use __METHOD__) for logs/profiling
*/
- function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'Database::deleteJoin' ) {
+ function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
if ( !$conds ) {
- throw new DBUnexpectedError( $this, 'Database::deleteJoin() called with empty $conds' );
+ throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
}
$delTable = $this->tableName( $delTable );
$joinTable = $this->tableName( $joinTable );
$sql = "DELETE $delTable FROM $delTable, $joinTable WHERE $delVar=$joinVar ";
+
if ( $conds != '*' ) {
$sql .= ' AND ' . $this->makeList( $conds, LIST_AND );
}
@@ -1640,16 +1920,17 @@ abstract class DatabaseBase {
function textFieldSize( $table, $field ) {
$table = $this->tableName( $table );
$sql = "SHOW COLUMNS FROM $table LIKE \"$field\";";
- $res = $this->query( $sql, 'Database::textFieldSize' );
+ $res = $this->query( $sql, 'DatabaseBase::textFieldSize' );
$row = $this->fetchObject( $res );
- $this->freeResult( $res );
$m = array();
+
if ( preg_match( '/\((.*)\)/', $row->Type, $m ) ) {
$size = $m[1];
} else {
$size = -1;
}
+
return $size;
}
@@ -1669,48 +1950,59 @@ abstract class DatabaseBase {
*
* Use $conds == "*" to delete all rows
*/
- function delete( $table, $conds, $fname = 'Database::delete' ) {
+ function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
if ( !$conds ) {
- throw new DBUnexpectedError( $this, 'Database::delete() called with no conditions' );
+ throw new DBUnexpectedError( $this, 'DatabaseBase::delete() called with no conditions' );
}
+
$table = $this->tableName( $table );
$sql = "DELETE FROM $table";
+
if ( $conds != '*' ) {
$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
}
+
return $this->query( $sql, $fname );
}
/**
* INSERT SELECT wrapper
* $varMap must be an associative array of the form array( 'dest1' => 'source1', ...)
- * Source items may be literals rather than field names, but strings should be quoted with Database::addQuotes()
+ * Source items may be literals rather than field names, but strings should be quoted with DatabaseBase::addQuotes()
* $conds may be "*" to copy the whole table
* srcTable may be an array of tables.
*/
- function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'Database::insertSelect',
+ function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseBase::insertSelect',
$insertOptions = array(), $selectOptions = array() )
{
$destTable = $this->tableName( $destTable );
+
if ( is_array( $insertOptions ) ) {
$insertOptions = implode( ' ', $insertOptions );
}
- if( !is_array( $selectOptions ) ) {
+
+ if ( !is_array( $selectOptions ) ) {
$selectOptions = array( $selectOptions );
}
+
list( $startOpts, $useIndex, $tailOpts ) = $this->makeSelectOptions( $selectOptions );
- if( is_array( $srcTable ) ) {
+
+ if ( is_array( $srcTable ) ) {
$srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
} else {
$srcTable = $this->tableName( $srcTable );
}
+
$sql = "INSERT $insertOptions INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
" SELECT $startOpts " . implode( ',', $varMap ) .
" FROM $srcTable $useIndex ";
+
if ( $conds != '*' ) {
$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
}
+
$sql .= " $tailOpts";
+
return $this->query( $sql, $fname );
}
@@ -1732,20 +2024,22 @@ abstract class DatabaseBase {
* @param $limit Integer: the SQL limit
* @param $offset Integer the SQL offset (default false)
*/
- function limitResult( $sql, $limit, $offset=false ) {
- if( !is_numeric( $limit ) ) {
+ function limitResult( $sql, $limit, $offset = false ) {
+ if ( !is_numeric( $limit ) ) {
throw new DBUnexpectedError( $this, "Invalid non-numeric limit passed to limitResult()\n" );
}
+
return "$sql LIMIT "
- . ( (is_numeric($offset) && $offset != 0) ? "{$offset}," : "" )
+ . ( ( is_numeric( $offset ) && $offset != 0 ) ? "{$offset}," : "" )
. "{$limit} ";
}
+
function limitResultForUpdate( $sql, $num ) {
return $this->limitResult( $sql, $num, 0 );
}
/**
- * Returns true if current database backend supports ORDER BY or LIMIT for separate subqueries
+ * Returns true if current database backend supports ORDER BY or LIMIT for separate subqueries
* within the UNION construct.
* @return Boolean
*/
@@ -1761,9 +2055,9 @@ abstract class DatabaseBase {
* @param $all Boolean: use UNION ALL
* @return String: SQL fragment
*/
- function unionQueries($sqls, $all) {
+ function unionQueries( $sqls, $all ) {
$glue = $all ? ') UNION ALL (' : ') UNION (';
- return '('.implode( $glue, $sqls ) . ')';
+ return '(' . implode( $glue, $sqls ) . ')';
}
/**
@@ -1792,6 +2086,16 @@ abstract class DatabaseBase {
}
/**
+ * Convert a field to an unix timestamp
+ *
+ * @param $field String: field name
+ * @return String: SQL statement
+ */
+ public function unixTimestamp( $field ) {
+ return "EXTRACT(epoch FROM $field)";
+ }
+
+ /**
* Determines if the last failure was due to a deadlock
* STUB
*/
@@ -1800,7 +2104,7 @@ abstract class DatabaseBase {
}
/**
- * Determines if the last query error was something that should be dealt
+ * Determines if the last query error was something that should be dealt
* with by pinging the connection and reissuing the query.
* STUB
*/
@@ -1833,18 +2137,20 @@ abstract class DatabaseBase {
* reached.
*/
function deadlockLoop() {
- $myFname = 'Database::deadlockLoop';
+ $myFname = 'DatabaseBase::deadlockLoop';
$this->begin();
$args = func_get_args();
$function = array_shift( $args );
$oldIgnore = $this->ignoreErrors( true );
$tries = DEADLOCK_TRIES;
+
if ( is_array( $function ) ) {
$fname = $function[0];
} else {
$fname = $function;
}
+
do {
$retVal = call_user_func_array( $function, $args );
$error = $this->lastError();
@@ -1859,14 +2165,16 @@ abstract class DatabaseBase {
$this->reportQueryError( $error, $errno, $sql, $fname );
}
}
- } while( $this->wasDeadlock() && --$tries > 0 );
+ } while ( $this->wasDeadlock() && --$tries > 0 );
+
$this->ignoreErrors( $oldIgnore );
+
if ( $tries <= 0 ) {
- $this->query( 'ROLLBACK', $myFname );
+ $this->rollback( $myFname );
$this->reportQueryError( $error, $errno, $sql, $fname );
return false;
} else {
- $this->query( 'COMMIT', $myFname );
+ $this->commit( $myFname );
return $retVal;
}
}
@@ -1878,7 +2186,7 @@ abstract class DatabaseBase {
* @param $timeout Integer: the maximum number of seconds to wait for synchronisation
*/
function masterPosWait( MySQLMasterPos $pos, $timeout ) {
- $fname = 'Database::masterPosWait';
+ $fname = 'DatabaseBase::masterPosWait';
wfProfileIn( $fname );
# Commit any open transactions
@@ -1887,7 +2195,8 @@ abstract class DatabaseBase {
}
if ( !is_null( $this->mFakeSlaveLag ) ) {
- $wait = intval( ( $pos->pos - microtime(true) + $this->mFakeSlaveLag ) * 1e6 );
+ $wait = intval( ( $pos->pos - microtime( true ) + $this->mFakeSlaveLag ) * 1e6 );
+
if ( $wait > $timeout * 1e6 ) {
wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
wfProfileOut( $fname );
@@ -1909,8 +2218,8 @@ abstract class DatabaseBase {
$encPos = intval( $pos->pos );
$sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
$res = $this->doQuery( $sql );
+
if ( $res && $row = $this->fetchRow( $res ) ) {
- $this->freeResult( $res );
wfProfileOut( $fname );
return $row[0];
} else {
@@ -1924,14 +2233,16 @@ abstract class DatabaseBase {
*/
function getSlavePos() {
if ( !is_null( $this->mFakeSlaveLag ) ) {
- $pos = new MySQLMasterPos( 'fake', microtime(true) - $this->mFakeSlaveLag );
- wfDebug( __METHOD__.": fake slave pos = $pos\n" );
+ $pos = new MySQLMasterPos( 'fake', microtime( true ) - $this->mFakeSlaveLag );
+ wfDebug( __METHOD__ . ": fake slave pos = $pos\n" );
return $pos;
}
- $res = $this->query( 'SHOW SLAVE STATUS', 'Database::getSlavePos' );
+
+ $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
$row = $this->fetchObject( $res );
+
if ( $row ) {
- $pos = isset($row->Exec_master_log_pos) ? $row->Exec_master_log_pos : $row->Exec_Master_Log_Pos;
+ $pos = isset( $row->Exec_master_log_pos ) ? $row->Exec_master_log_pos : $row->Exec_Master_Log_Pos;
return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
} else {
return false;
@@ -1945,8 +2256,10 @@ abstract class DatabaseBase {
if ( $this->mFakeMaster ) {
return new MySQLMasterPos( 'fake', microtime( true ) );
}
- $res = $this->query( 'SHOW MASTER STATUS', 'Database::getMasterPos' );
+
+ $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
$row = $this->fetchObject( $res );
+
if ( $row ) {
return new MySQLMasterPos( $row->File, $row->Position );
} else {
@@ -1957,7 +2270,7 @@ abstract class DatabaseBase {
/**
* Begin a transaction, committing any previously open transaction
*/
- function begin( $fname = 'Database::begin' ) {
+ function begin( $fname = 'DatabaseBase::begin' ) {
$this->query( 'BEGIN', $fname );
$this->mTrxLevel = 1;
}
@@ -1965,25 +2278,30 @@ abstract class DatabaseBase {
/**
* End a transaction
*/
- function commit( $fname = 'Database::commit' ) {
- $this->query( 'COMMIT', $fname );
- $this->mTrxLevel = 0;
+ function commit( $fname = 'DatabaseBase::commit' ) {
+ if ( $this->mTrxLevel ) {
+ $this->query( 'COMMIT', $fname );
+ $this->mTrxLevel = 0;
+ }
}
/**
* Rollback a transaction.
* No-op on non-transactional databases.
*/
- function rollback( $fname = 'Database::rollback' ) {
- $this->query( 'ROLLBACK', $fname, true );
- $this->mTrxLevel = 0;
+ function rollback( $fname = 'DatabaseBase::rollback' ) {
+ if ( $this->mTrxLevel ) {
+ $this->query( 'ROLLBACK', $fname, true );
+ $this->mTrxLevel = 0;
+ }
}
/**
* Begin a transaction, committing any previously open transaction
* @deprecated use begin()
*/
- function immediateBegin( $fname = 'Database::immediateBegin' ) {
+ function immediateBegin( $fname = 'DatabaseBase::immediateBegin' ) {
+ wfDeprecated( __METHOD__ );
$this->begin();
}
@@ -1991,7 +2309,8 @@ abstract class DatabaseBase {
* Commit transaction, if one is open
* @deprecated use commit()
*/
- function immediateCommit( $fname = 'Database::immediateCommit' ) {
+ function immediateCommit( $fname = 'DatabaseBase::immediateCommit' ) {
+ wfDeprecated( __METHOD__ );
$this->commit();
}
@@ -2004,24 +2323,25 @@ abstract class DatabaseBase {
* @param $oldName String: name of table whose structure should be copied
* @param $newName String: name of table to be created
* @param $temporary Boolean: whether the new table should be temporary
+ * @param $fname String: calling function name
* @return Boolean: true if operation was successful
*/
- function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'Database::duplicateTableStructure' ) {
+ function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseBase::duplicateTableStructure' ) {
throw new MWException( 'DatabaseBase::duplicateTableStructure is not implemented in descendant class' );
}
/**
* Return MW-style timestamp used for MySQL schema
*/
- function timestamp( $ts=0 ) {
- return wfTimestamp(TS_MW,$ts);
+ function timestamp( $ts = 0 ) {
+ return wfTimestamp( TS_MW, $ts );
}
/**
* Local database timestamp format or null
*/
function timestampOrNull( $ts = null ) {
- if( is_null( $ts ) ) {
+ if ( is_null( $ts ) ) {
return null;
} else {
return $this->timestamp( $ts );
@@ -2032,7 +2352,7 @@ abstract class DatabaseBase {
* @todo document
*/
function resultObject( $result ) {
- if( empty( $result ) ) {
+ if ( empty( $result ) ) {
return false;
} elseif ( $result instanceof ResultWrapper ) {
return $result;
@@ -2047,29 +2367,11 @@ abstract class DatabaseBase {
/**
* Return aggregated value alias
*/
- function aggregateValue ($valuedata,$valuename='value') {
+ function aggregateValue ( $valuedata, $valuename = 'value' ) {
return $valuename;
}
/**
- * Returns a wikitext link to the DB's website, e.g.,
- * return "[http://www.mysql.com/ MySQL]";
- * Should at least contain plain text, if for some reason
- * your database has no website.
- *
- * @return String: wikitext of a link to the server software's web site
- */
- abstract function getSoftwareLink();
-
- /**
- * A string describing the current software version, like from
- * mysql_get_server_info(). Will be listed on Special:Version, etc.
- *
- * @return String: Version information from the database
- */
- abstract function getServerVersion();
-
- /**
* Ping the server and try to reconnect if it there is no connection
*
* @return bool Success or failure
@@ -2081,52 +2383,24 @@ abstract class DatabaseBase {
/**
* Get slave lag.
- * At the moment, this will only work if the DB user has the PROCESS privilege
+ * Currently supported only by MySQL
+ * @return Database replication lag in seconds
*/
function getLag() {
- if ( !is_null( $this->mFakeSlaveLag ) ) {
- wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
- return $this->mFakeSlaveLag;
- }
- $res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
- # Find slave SQL thread
- while ( $row = $this->fetchObject( $res ) ) {
- /* This should work for most situations - when default db
- * for thread is not specified, it had no events executed,
- * and therefore it doesn't know yet how lagged it is.
- *
- * Relay log I/O thread does not select databases.
- */
- if ( $row->User == 'system user' &&
- $row->State != 'Waiting for master to send event' &&
- $row->State != 'Connecting to master' &&
- $row->State != 'Queueing master event to the relay log' &&
- $row->State != 'Waiting for master update' &&
- $row->State != 'Requesting binlog dump' &&
- $row->State != 'Waiting to reconnect after a failed master event read' &&
- $row->State != 'Reconnecting after a failed master event read' &&
- $row->State != 'Registering slave on master'
- ) {
- # This is it, return the time (except -ve)
- if ( $row->Time > 0x7fffffff ) {
- return false;
- } else {
- return $row->Time;
- }
- }
- }
- return false;
+ return intval( $this->mFakeSlaveLag );
}
/**
* Get status information from SHOW STATUS in an associative array
*/
- function getStatus($which="%") {
+ function getStatus( $which = "%" ) {
$res = $this->query( "SHOW STATUS LIKE '{$which}'" );
$status = array();
- while ( $row = $this->fetchObject( $res ) ) {
+
+ foreach ( $res as $row ) {
$status[$row->Variable_name] = $row->Value;
}
+
return $status;
}
@@ -2137,11 +2411,11 @@ abstract class DatabaseBase {
return 0;
}
- function encodeBlob($b) {
+ function encodeBlob( $b ) {
return $b;
}
- function decodeBlob($b) {
+ function decodeBlob( $b ) {
return $b;
}
@@ -2161,56 +2435,79 @@ abstract class DatabaseBase {
* @param $filename String: File name to open
* @param $lineCallback Callback: Optional function called before reading each line
* @param $resultCallback Callback: Optional function called for each MySQL result
+ * @param $fname String: Calling function name or false if name should be generated dynamically
+ * using $filename
*/
- function sourceFile( $filename, $lineCallback = false, $resultCallback = false ) {
+ function sourceFile( $filename, $lineCallback = false, $resultCallback = false, $fname = false ) {
$fp = fopen( $filename, 'r' );
+
if ( false === $fp ) {
- if (!defined("MEDIAWIKI_INSTALL"))
+ if ( !defined( "MEDIAWIKI_INSTALL" ) )
throw new MWException( "Could not open \"{$filename}\".\n" );
else
return "Could not open \"{$filename}\".\n";
}
+
+ if ( !$fname ) {
+ $fname = __METHOD__ . "( $filename )";
+ }
+
try {
- $error = $this->sourceStream( $fp, $lineCallback, $resultCallback );
+ $error = $this->sourceStream( $fp, $lineCallback, $resultCallback, $fname );
}
- catch( MWException $e ) {
- if ( defined("MEDIAWIKI_INSTALL") ) {
+ catch ( MWException $e ) {
+ if ( defined( "MEDIAWIKI_INSTALL" ) ) {
$error = $e->getMessage();
} else {
fclose( $fp );
throw $e;
}
}
-
+
fclose( $fp );
+
return $error;
}
/**
* Get the full path of a patch file. Originally based on archive()
- * from updaters.inc. Keep in mind this always returns a patch, as
+ * from updaters.inc. Keep in mind this always returns a patch, as
* it fails back to MySQL if no DB-specific patch can be found
*
* @param $patch String The name of the patch, like patch-something.sql
* @return String Full path to patch file
*/
- public static function patchPath( $patch ) {
- global $wgDBtype, $IP;
- if ( file_exists( "$IP/maintenance/$wgDBtype/archives/$patch" ) ) {
- return "$IP/maintenance/$wgDBtype/archives/$patch";
+ public function patchPath( $patch ) {
+ global $IP;
+
+ $dbType = $this->getType();
+ if ( file_exists( "$IP/maintenance/$dbType/archives/$patch" ) ) {
+ return "$IP/maintenance/$dbType/archives/$patch";
} else {
return "$IP/maintenance/archives/$patch";
}
}
/**
+ * Set variables to be used in sourceFile/sourceStream, in preference to the
+ * ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
+ * all. If it's set to false, $GLOBALS will be used.
+ *
+ * @param $vars False, or array mapping variable name to value.
+ */
+ function setSchemaVars( $vars ) {
+ $this->mSchemaVars = $vars;
+ }
+
+ /**
* Read and execute commands from an open file handle
* Returns true on success, error string or exception on failure (depending on object's error ignore settings)
* @param $fp String: File handle
* @param $lineCallback Callback: Optional function called before reading each line
* @param $resultCallback Callback: Optional function called for each MySQL result
+ * @param $fname String: Calling function name
*/
- function sourceStream( $fp, $lineCallback = false, $resultCallback = false ) {
+ function sourceStream( $fp, $lineCallback = false, $resultCallback = false, $fname = 'DatabaseBase::sourceStream' ) {
$cmd = "";
$done = false;
$dollarquote = false;
@@ -2219,15 +2516,21 @@ abstract class DatabaseBase {
if ( $lineCallback ) {
call_user_func( $lineCallback );
}
+
$line = trim( fgets( $fp, 1024 ) );
$sl = strlen( $line ) - 1;
- if ( $sl < 0 ) { continue; }
- if ( '-' == $line{0} && '-' == $line{1} ) { continue; }
+ if ( $sl < 0 ) {
+ continue;
+ }
+
+ if ( '-' == $line { 0 } && '-' == $line { 1 } ) {
+ continue;
+ }
- ## Allow dollar quoting for function declarations
- if (substr($line,0,4) == '$mw$') {
- if ($dollarquote) {
+ # # Allow dollar quoting for function declarations
+ if ( substr( $line, 0, 4 ) == '$mw$' ) {
+ if ( $dollarquote ) {
$dollarquote = false;
$done = true;
}
@@ -2235,20 +2538,24 @@ abstract class DatabaseBase {
$dollarquote = true;
}
}
- else if (!$dollarquote) {
- if ( ';' == $line{$sl} && ($sl < 2 || ';' != $line{$sl - 1})) {
+ else if ( !$dollarquote ) {
+ if ( ';' == $line { $sl } && ( $sl < 2 || ';' != $line { $sl - 1 } ) ) {
$done = true;
$line = substr( $line, 0, $sl );
}
}
- if ( $cmd != '' ) { $cmd .= ' '; }
+ if ( $cmd != '' ) {
+ $cmd .= ' ';
+ }
+
$cmd .= "$line\n";
if ( $done ) {
- $cmd = str_replace(';;', ";", $cmd);
+ $cmd = str_replace( ';;', ";", $cmd );
$cmd = $this->replaceVars( $cmd );
- $res = $this->query( $cmd, __METHOD__ );
+ $res = $this->query( $cmd, $fname );
+
if ( $resultCallback ) {
call_user_func( $resultCallback, $res, $this );
}
@@ -2262,41 +2569,76 @@ abstract class DatabaseBase {
$done = false;
}
}
+
return true;
}
+ /**
+ * Database independent variable replacement, replaces a set of variables
+ * in a sql statement with their contents as given by $this->getSchemaVars().
+ * Supports '{$var}' `{$var}` and / *$var* / (without the spaces) style variables
+ *
+ * '{$var}' should be used for text and is passed through the database's addQuotes method
+ * `{$var}` should be used for identifiers (eg: table and database names), it is passed through
+ * the database's addIdentifierQuotes method which can be overridden if the database
+ * uses something other than backticks.
+ * / *$var* / is just encoded, besides traditional dbprefix and tableoptions it's use should be avoided
+ *
+ * @param $ins String: SQL statement to replace variables in
+ * @return String The new SQL statement with variables replaced
+ */
+ protected function replaceSchemaVars( $ins ) {
+ $vars = $this->getSchemaVars();
+ foreach ( $vars as $var => $value ) {
+ // replace '{$var}'
+ $ins = str_replace( '\'{$' . $var . '}\'', $this->addQuotes( $value ), $ins );
+ // replace `{$var}`
+ $ins = str_replace( '`{$' . $var . '}`', $this->addIdentifierQuotes( $value ), $ins );
+ // replace /*$var*/
+ $ins = str_replace( '/*$' . $var . '*/', $this->strencode( $value ) , $ins );
+ }
+ return $ins;
+ }
/**
* Replace variables in sourced SQL
*/
protected function replaceVars( $ins ) {
- $varnames = array(
- 'wgDBserver', 'wgDBname', 'wgDBintlname', 'wgDBuser',
- 'wgDBpassword', 'wgDBsqluser', 'wgDBsqlpassword',
- 'wgDBadminuser', 'wgDBadminpassword', 'wgDBTableOptions',
- );
-
- // Ordinary variables
- foreach ( $varnames as $var ) {
- if( isset( $GLOBALS[$var] ) ) {
- $val = addslashes( $GLOBALS[$var] ); // FIXME: safety check?
- $ins = str_replace( '{$' . $var . '}', $val, $ins );
- $ins = str_replace( '/*$' . $var . '*/`', '`' . $val, $ins );
- $ins = str_replace( '/*$' . $var . '*/', $val, $ins );
- }
- }
+ $ins = $this->replaceSchemaVars( $ins );
// Table prefixes
$ins = preg_replace_callback( '!/\*(?:\$wgDBprefix|_)\*/([a-zA-Z_0-9]*)!',
array( $this, 'tableNameCallback' ), $ins );
// Index names
- $ins = preg_replace_callback( '!/\*i\*/([a-zA-Z_0-9]*)!',
+ $ins = preg_replace_callback( '!/\*i\*/([a-zA-Z_0-9]*)!',
array( $this, 'indexNameCallback' ), $ins );
+
return $ins;
}
/**
+ * Get schema variables. If none have been set via setSchemaVars(), then
+ * use some defaults from the current object.
+ */
+ protected function getSchemaVars() {
+ if ( $this->mSchemaVars ) {
+ return $this->mSchemaVars;
+ } else {
+ return $this->getDefaultSchemaVars();
+ }
+ }
+
+ /**
+ * Get schema variables to use if none have been set via setSchemaVars().
+ * Override this in derived classes to provide variables for tables.sql
+ * and SQL patch files.
+ */
+ protected function getDefaultSchemaVars() {
+ return array();
+ }
+
+ /**
* Table name callback
* @private
*/
@@ -2319,16 +2661,17 @@ abstract class DatabaseBase {
function buildConcat( $stringList ) {
return 'CONCAT(' . implode( ',', $stringList ) . ')';
}
-
+
/**
* Acquire a named lock
- *
+ *
* Abstracted from Filestore::lock() so child classes can implement for
* their own needs.
- *
- * @param $lockName String: Name of lock to aquire
- * @param $method String: Name of method calling us
- * @return bool
+ *
+ * @param $lockName String: name of lock to aquire
+ * @param $method String: name of method calling us
+ * @param $timeout Integer: timeout
+ * @return Boolean
*/
public function lock( $lockName, $method, $timeout = 5 ) {
return true;
@@ -2336,13 +2679,12 @@ abstract class DatabaseBase {
/**
* Release a lock.
- *
+ *
* @param $lockName String: Name of lock to release
* @param $method String: Name of method calling us
*
- * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
* @return Returns 1 if the lock was released, 0 if the lock was not established
- * by this thread (in which case the lock is not released), and NULL if the named
+ * by this thread (in which case the lock is not released), and NULL if the named
* lock did not exist
*/
public function unlock( $lockName, $method ) {
@@ -2360,7 +2702,7 @@ abstract class DatabaseBase {
public function lockTables( $read, $write, $method, $lowPriority = true ) {
return true;
}
-
+
/**
* Unlock specific tables
*
@@ -2369,31 +2711,30 @@ abstract class DatabaseBase {
public function unlockTables( $method ) {
return true;
}
-
+
/**
- * Get search engine class. All subclasses of this
- * need to implement this if they wish to use searching.
- *
+ * Get search engine class. All subclasses of this need to implement this
+ * if they wish to use searching.
+ *
* @return String
*/
public function getSearchEngine() {
- return "SearchMySQL";
+ return 'SearchEngineDummy';
}
/**
- * Allow or deny "big selects" for this session only. This is done by setting
+ * Allow or deny "big selects" for this session only. This is done by setting
* the sql_big_selects session variable.
*
- * This is a MySQL-specific feature.
+ * This is a MySQL-specific feature.
*
- * @param mixed $value true for allow, false for deny, or "default" to restore the initial value
+ * @param $value Mixed: true for allow, false for deny, or "default" to restore the initial value
*/
public function setBigSelects( $value = true ) {
// no-op
}
}
-
/******************************************************************************
* Utility classes
*****************************************************************************/
@@ -2405,7 +2746,7 @@ abstract class DatabaseBase {
class DBObject {
public $mData;
- function DBObject($data) {
+ function __construct( $data ) {
$this->mData = $data;
}
@@ -2426,65 +2767,44 @@ class DBObject {
*/
class Blob {
private $mData;
- function __construct($data) {
+
+ function __construct( $data ) {
$this->mData = $data;
}
+
function fetch() {
return $this->mData;
}
}
/**
- * Utility class.
+ * Base for all database-specific classes representing information about database fields
* @ingroup Database
*/
-class MySQLField {
- private $name, $tablename, $default, $max_length, $nullable,
- $is_pk, $is_unique, $is_multiple, $is_key, $type;
- function __construct ($info) {
- $this->name = $info->name;
- $this->tablename = $info->table;
- $this->default = $info->def;
- $this->max_length = $info->max_length;
- $this->nullable = !$info->not_null;
- $this->is_pk = $info->primary_key;
- $this->is_unique = $info->unique_key;
- $this->is_multiple = $info->multiple_key;
- $this->is_key = ($this->is_pk || $this->is_unique || $this->is_multiple);
- $this->type = $info->type;
- }
-
- function name() {
- return $this->name;
- }
-
- function tableName() {
- return $this->tableName;
- }
-
- function defaultValue() {
- return $this->default;
- }
-
- function maxLength() {
- return $this->max_length;
- }
-
- function nullable() {
- return $this->nullable;
- }
+interface Field {
+ /**
+ * Field name
+ * @return string
+ */
+ function name();
- function isKey() {
- return $this->is_key;
- }
+ /**
+ * Name of table this field belongs to
+ * @return string
+ */
+ function tableName();
- function isMultipleKey() {
- return $this->is_multiple;
- }
+ /**
+ * Database type
+ * @return string
+ */
+ function type();
- function type() {
- return $this->type;
- }
+ /**
+ * Whether this field can store NULL values
+ * @return bool
+ */
+ function isNullable();
}
/******************************************************************************
@@ -2510,10 +2830,13 @@ class DBError extends MWException {
function getText() {
global $wgShowDBErrorBacktrace;
+
$s = $this->getMessage() . "\n";
+
if ( $wgShowDBErrorBacktrace ) {
$s .= "Backtrace:\n" . $this->getTraceAsString() . "\n";
}
+
return $s;
}
}
@@ -2523,13 +2846,16 @@ class DBError extends MWException {
*/
class DBConnectionError extends DBError {
public $error;
-
+
function __construct( DatabaseBase &$db, $error = 'unknown error' ) {
$msg = 'DB connection error';
+
if ( trim( $error ) != '' ) {
$msg .= ": $error";
}
+
$this->error = $error;
+
parent::__construct( $db, $msg );
}
@@ -2542,7 +2868,7 @@ class DBConnectionError extends DBError {
// Not likely to work
return false;
}
-
+
function getLogMessage() {
# Don't send to the exception log
return false;
@@ -2550,11 +2876,13 @@ class DBConnectionError extends DBError {
function getPageTitle() {
global $wgSitename, $wgLang;
+
$header = "$wgSitename has a problem";
+
if ( $wgLang instanceof Language ) {
$header = htmlspecialchars( $wgLang->getMessage( 'dberr-header' ) );
}
-
+
return $header;
}
@@ -2577,7 +2905,7 @@ class DBConnectionError extends DBError {
}
if ( trim( $this->error ) == '' ) {
- $this->error = $this->db->getProperty('mServer');
+ $this->error = $this->db->getProperty( 'mServer' );
}
$noconnect = "<p><strong>$sorry</strong><br />$again</p><p><small>$info</small></p>";
@@ -2589,33 +2917,38 @@ class DBConnectionError extends DBError {
$extra = $this->searchForm();
- if( $wgUseFileCache ) {
+ if ( $wgUseFileCache ) {
try {
$cache = $this->fileCachedPage();
# Cached version on file system?
- if( $cache !== null ) {
+ if ( $cache !== null ) {
# Hack: extend the body for error messages
- $cache = str_replace( array('</html>','</body>'), '', $cache );
+ $cache = str_replace( array( '</html>', '</body>' ), '', $cache );
# Add cache notice...
$cachederror = "This is a cached copy of the requested page, and may not be up to date. ";
+
# Localize it if possible...
- if( $wgLang instanceof Language ) {
+ if ( $wgLang instanceof Language ) {
$cachederror = htmlspecialchars( $wgLang->getMessage( 'dberr-cachederror' ) );
}
+
$warning = "<div style='color:red;font-size:150%;font-weight:bold;'>$cachederror</div>";
+
# Output cached page with notices on bottom and re-close body
return "{$cache}{$warning}<hr />$text<hr />$extra</body></html>";
}
- } catch( MWException $e ) {
+ } catch ( MWException $e ) {
// Do nothing, just use the default page
}
}
+
# Headers needed here - output is just the error message
- return $this->htmlHeader()."$text<hr />$extra".$this->htmlFooter();
+ return $this->htmlHeader() . "$text<hr />$extra" . $this->htmlFooter();
}
function searchForm() {
- global $wgSitename, $wgServer, $wgLang, $wgInputEncoding;
+ global $wgSitename, $wgServer, $wgLang;
+
$usegoogle = "You can try searching via Google in the meantime.";
$outofdate = "Note that their indexes of our content may be out of date.";
$googlesearch = "Search";
@@ -2626,23 +2959,26 @@ class DBConnectionError extends DBError {
$googlesearch = htmlspecialchars( $wgLang->getMessage( 'searchbutton' ) );
}
- $search = htmlspecialchars(@$_REQUEST['search']);
+ $search = htmlspecialchars( @$_REQUEST['search'] );
+
+ $server = htmlspecialchars( $wgServer );
+ $sitename = htmlspecialchars( $wgSitename );
$trygoogle = <<<EOT
<div style="margin: 1.5em">$usegoogle<br />
<small>$outofdate</small></div>
<!-- SiteSearch Google -->
<form method="get" action="http://www.google.com/search" id="googlesearch">
- <input type="hidden" name="domains" value="$wgServer" />
- <input type="hidden" name="num" value="50" />
- <input type="hidden" name="ie" value="$wgInputEncoding" />
- <input type="hidden" name="oe" value="$wgInputEncoding" />
+ <input type="hidden" name="domains" value="$server" />
+ <input type="hidden" name="num" value="50" />
+ <input type="hidden" name="ie" value="UTF-8" />
+ <input type="hidden" name="oe" value="UTF-8" />
- <input type="text" name="q" size="31" maxlength="255" value="$search" />
- <input type="submit" name="btnG" value="$googlesearch" />
+ <input type="text" name="q" size="31" maxlength="255" value="$search" />
+ <input type="submit" name="btnG" value="$googlesearch" />
<div>
- <input type="radio" name="sitesearch" id="gwiki" value="$wgServer" checked="checked" /><label for="gwiki">$wgSitename</label>
- <input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label>
+ <input type="radio" name="sitesearch" id="gwiki" value="$server" checked="checked" /><label for="gwiki">$sitename</label>
+ <input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label>
</div>
</form>
<!-- SiteSearch Google -->
@@ -2651,33 +2987,35 @@ EOT;
}
function fileCachedPage() {
- global $wgTitle, $title, $wgLang, $wgOut;
- if( $wgOut->isDisabled() ) return; // Done already?
+ global $wgTitle, $wgLang, $wgOut;
+
+ if ( $wgOut->isDisabled() ) {
+ return; // Done already?
+ }
+
$mainpage = 'Main Page';
+
if ( $wgLang instanceof Language ) {
$mainpage = htmlspecialchars( $wgLang->getMessage( 'mainpage' ) );
}
- if( $wgTitle ) {
+ if ( $wgTitle ) {
$t =& $wgTitle;
- } elseif( $title ) {
- $t = Title::newFromURL( $title );
} else {
$t = Title::newFromText( $mainpage );
}
$cache = new HTMLFileCache( $t );
- if( $cache->isFileCached() ) {
+ if ( $cache->isFileCached() ) {
return $cache->fetchPageText();
} else {
return '';
}
}
-
+
function htmlBodyOnly() {
return true;
}
-
}
/**
@@ -2685,14 +3023,15 @@ EOT;
*/
class DBQueryError extends DBError {
public $error, $errno, $sql, $fname;
-
+
function __construct( DatabaseBase &$db, $error, $errno, $sql, $fname ) {
- $message = "A database error has occurred\n" .
+ $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
"Query: $sql\n" .
"Function: $fname\n" .
"Error: $errno $error\n";
parent::__construct( $db, $message );
+
$this->error = $error;
$this->errno = $errno;
$this->sql = $sql;
@@ -2701,27 +3040,31 @@ class DBQueryError extends DBError {
function getText() {
global $wgShowDBErrorBacktrace;
+
if ( $this->useMessageCache() ) {
$s = wfMsg( 'dberrortextcl', htmlspecialchars( $this->getSQL() ),
htmlspecialchars( $this->fname ), $this->errno, htmlspecialchars( $this->error ) ) . "\n";
+
if ( $wgShowDBErrorBacktrace ) {
$s .= "Backtrace:\n" . $this->getTraceAsString() . "\n";
}
+
return $s;
} else {
return parent::getText();
}
}
-
+
function getSQL() {
global $wgShowSQLErrors;
- if( !$wgShowSQLErrors ) {
+
+ if ( !$wgShowSQLErrors ) {
return $this->msg( 'sqlhidden', 'SQL hidden' );
} else {
return $this->sql;
}
}
-
+
function getLogMessage() {
# Don't send to the exception log
return false;
@@ -2733,15 +3076,18 @@ class DBQueryError extends DBError {
function getHTML() {
global $wgShowDBErrorBacktrace;
+
if ( $this->useMessageCache() ) {
$s = wfMsgNoDB( 'dberrortext', htmlspecialchars( $this->getSQL() ),
htmlspecialchars( $this->fname ), $this->errno, htmlspecialchars( $this->error ) );
} else {
$s = nl2br( htmlspecialchars( $this->getMessage() ) );
}
+
if ( $wgShowDBErrorBacktrace ) {
$s .= '<p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) );
}
+
return $s;
}
}
@@ -2762,8 +3108,9 @@ class ResultWrapper implements Iterator {
/**
* Create a new result object from a result resource and a Database object
*/
- function ResultWrapper( $database, $result ) {
+ function __construct( $database, $result ) {
$this->db = $database;
+
if ( $result instanceof ResultWrapper ) {
$this->result = $result->result;
} else {
@@ -2783,7 +3130,6 @@ class ResultWrapper implements Iterator {
* Fields can be retrieved with $row->fieldname, with fields acting like
* member variables.
*
- * @param $res SQL result object as returned from Database::query(), etc.
* @return MySQL row object
* @throws DBUnexpectedError Thrown if the database returns an error
*/
@@ -2795,7 +3141,6 @@ class ResultWrapper implements Iterator {
* Fetch the next row from the given result object, in associative array
* form. Fields are retrieved with $row['fieldname'].
*
- * @param $res SQL result object as returned from Database::query(), etc.
* @return MySQL row object
* @throws DBUnexpectedError Thrown if the database returns an error
*/
@@ -2827,8 +3172,8 @@ class ResultWrapper implements Iterator {
*/
function rewind() {
- if ($this->numRows()) {
- $this->db->dataSeek($this, 0);
+ if ( $this->numRows() ) {
+ $this->db->dataSeek( $this, 0 );
}
$this->pos = 0;
$this->currentRow = null;
@@ -2857,8 +3202,49 @@ class ResultWrapper implements Iterator {
}
/**
+ * Overloads the relevant methods of the real ResultsWrapper so it
+ * doesn't go anywhere near an actual database.
+ */
+class FakeResultWrapper extends ResultWrapper {
+ var $result = array();
+ var $db = null; // And it's going to stay that way :D
+ var $pos = 0;
+ var $currentRow = null;
+
+ function __construct( $array ) {
+ $this->result = $array;
+ }
+
+ function numRows() {
+ return count( $this->result );
+ }
+
+ function fetchRow() {
+ $this->currentRow = $this->result[$this->pos++];
+ return $this->currentRow;
+ }
+
+ function seek( $row ) {
+ $this->pos = $row;
+ }
+
+ function free() {}
+
+ // Callers want to be able to access fields with $this->fieldName
+ function fetchObject() {
+ $this->currentRow = $this->result[$this->pos++];
+ return (object)$this->currentRow;
+ }
+
+ function rewind() {
+ $this->pos = 0;
+ $this->currentRow = null;
+ }
+}
+
+/**
* Used by DatabaseBase::buildLike() to represent characters that have special meaning in SQL LIKE clauses
- * and thus need no escaping. Don't instantiate it manually, use Database::anyChar() and anyString() instead.
+ * and thus need no escaping. Don't instantiate it manually, use DatabaseBase::anyChar() and anyString() instead.
*/
class LikeMatch {
private $str;
diff --git a/includes/db/DatabaseIbm_db2.php b/includes/db/DatabaseIbm_db2.php
index 9b62af82..becca11e 100644
--- a/includes/db/DatabaseIbm_db2.php
+++ b/includes/db/DatabaseIbm_db2.php
@@ -1,10 +1,11 @@
<?php
/**
- * This script is the IBM DB2 database abstraction layer
+ * This is the IBM DB2 database abstraction layer.
+ * See maintenance/ibm_db2/README for development notes
+ * and other specific information
*
- * See maintenance/ibm_db2/README for development notes and other specific information
- * @ingroup Database
* @file
+ * @ingroup Database
* @author leo.petr+mediawiki@gmail.com
*/
@@ -12,7 +13,7 @@
* This represents a column in a DB2 database
* @ingroup Database
*/
-class IBM_DB2Field {
+class IBM_DB2Field implements Field {
private $name = '';
private $tablename = '';
private $type = '';
@@ -20,32 +21,36 @@ class IBM_DB2Field {
private $max_length = 0;
/**
- * Builder method for the class
+ * Builder method for the class
* @param $db DatabaseIbm_db2: Database interface
* @param $table String: table name
* @param $field String: column name
* @return IBM_DB2Field
*/
- static function fromText($db, $table, $field) {
+ static function fromText( $db, $table, $field ) {
global $wgDBmwschema;
$q = <<<SQL
SELECT
-lcase(coltype) AS typname,
+lcase( coltype ) AS typname,
nulls AS attnotnull, length AS attlen
FROM sysibm.syscolumns
WHERE tbcreator=%s AND tbname=%s AND name=%s;
SQL;
- $res = $db->query(sprintf($q,
- $db->addQuotes($wgDBmwschema),
- $db->addQuotes($table),
- $db->addQuotes($field)));
- $row = $db->fetchObject($res);
- if (!$row)
+ $res = $db->query(
+ sprintf( $q,
+ $db->addQuotes( $wgDBmwschema ),
+ $db->addQuotes( $table ),
+ $db->addQuotes( $field )
+ )
+ );
+ $row = $db->fetchObject( $res );
+ if ( !$row ) {
return null;
+ }
$n = new IBM_DB2Field;
$n->type = $row->typname;
- $n->nullable = ($row->attnotnull == 'N');
+ $n->nullable = ( $row->attnotnull == 'N' );
$n->name = $field;
$n->tablename = $table;
$n->max_length = $row->attlen;
@@ -70,7 +75,7 @@ SQL;
* Can column be null?
* @return bool true or false
*/
- function nullable() { return $this->nullable; }
+ function isNullable() { return $this->nullable; }
/**
* How much can you fit in the column per row?
* @return int length
@@ -85,18 +90,17 @@ SQL;
class IBM_DB2Blob {
private $mData;
- public function __construct($data) {
+ public function __construct( $data ) {
$this->mData = $data;
}
public function getData() {
return $this->mData;
}
-
- public function __toString()
- {
- return $this->mData;
- }
+
+ public function __toString() {
+ return $this->mData;
+ }
}
/**
@@ -112,7 +116,6 @@ class DatabaseIbm_db2 extends DatabaseBase {
protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
protected $mOut, $mOpened = false;
- protected $mFailFunction;
protected $mTablePrefix;
protected $mFlags;
protected $mTrxLevel = 0;
@@ -121,207 +124,50 @@ class DatabaseIbm_db2 extends DatabaseBase {
protected $mFakeSlaveLag = null, $mFakeMaster = false;
*
*/
-
- /// Server port for uncataloged connections
+
+ /** Database server port */
protected $mPort = null;
- /// Whether connection is cataloged
- protected $mCataloged = null;
- /// Schema for tables, stored procedures, triggers
+ /** Schema for tables, stored procedures, triggers */
protected $mSchema = null;
- /// Whether the schema has been applied in this session
+ /** Whether the schema has been applied in this session */
protected $mSchemaSet = false;
- /// Result of last query
+ /** Result of last query */
protected $mLastResult = null;
- /// Number of rows affected by last INSERT/UPDATE/DELETE
+ /** Number of rows affected by last INSERT/UPDATE/DELETE */
protected $mAffectedRows = null;
- /// Number of rows returned by last SELECT
+ /** Number of rows returned by last SELECT */
protected $mNumRows = null;
-
- /// Connection config options - see constructor
+
+ /** Connection config options - see constructor */
public $mConnOptions = array();
- /// Statement config options -- see constructor
+ /** Statement config options -- see constructor */
public $mStmtOptions = array();
-
-
- const CATALOGED = "cataloged";
- const UNCATALOGED = "uncataloged";
- const USE_GLOBAL = "get from global";
-
+
+ /** Default schema */
+ const USE_GLOBAL = 'mediawiki';
+
+ /** Option that applies to nothing */
const NONE_OPTION = 0x00;
+ /** Option that applies to connection objects */
const CONN_OPTION = 0x01;
+ /** Option that applies to statement objects */
const STMT_OPTION = 0x02;
-
+
+ /** Regular operation mode -- minimal debug messages */
const REGULAR_MODE = 'regular';
+ /** Installation mode -- lots of debug messages */
const INSTALL_MODE = 'install';
-
- // Whether this is regular operation or the initial installation
+
+ /** Controls the level of debug message output */
protected $mMode = self::REGULAR_MODE;
-
- /// Last sequence value used for a primary key
+
+ /** Last sequence value used for a primary key */
protected $mInsertId = null;
-
- /*
- * These can be safely inherited
- *
- * Getter/Setter: (18)
- * failFunction
- * setOutputPage
- * bufferResults
- * ignoreErrors
- * trxLevel
- * errorCount
- * getLBInfo
- * setLBInfo
- * lastQuery
- * isOpen
- * setFlag
- * clearFlag
- * getFlag
- * getProperty
- * getDBname
- * getServer
- * tableNameCallback
- * tablePrefix
- *
- * Administrative: (8)
- * debug
- * installErrorHandler
- * restoreErrorHandler
- * connectionErrorHandler
- * reportConnectionError
- * sourceFile
- * sourceStream
- * replaceVars
- *
- * Database: (5)
- * query
- * set
- * selectField
- * generalizeSQL
- * update
- * strreplace
- * deadlockLoop
- *
- * Prepared Statement: 6
- * prepare
- * freePrepared
- * execute
- * safeQuery
- * fillPrepared
- * fillPreparedArg
- *
- * Slave/Master: (4)
- * masterPosWait
- * getSlavePos
- * getMasterPos
- * getLag
- *
- * Generation: (9)
- * tableNames
- * tableNamesN
- * tableNamesWithUseIndexOrJOIN
- * escapeLike
- * delete
- * insertSelect
- * timestampOrNull
- * resultObject
- * aggregateValue
- * selectSQLText
- * selectRow
- * makeUpdateOptions
- *
- * Reflection: (1)
- * indexExists
- */
-
- /*
- * These have been implemented
- *
- * Administrative: 7 / 7
- * constructor [Done]
- * open [Done]
- * openCataloged [Done]
- * close [Done]
- * newFromParams [Done]
- * openUncataloged [Done]
- * setup_database [Done]
- *
- * Getter/Setter: 13 / 13
- * cascadingDeletes [Done]
- * cleanupTriggers [Done]
- * strictIPs [Done]
- * realTimestamps [Done]
- * impliciGroupby [Done]
- * implicitOrderby [Done]
- * searchableIPs [Done]
- * functionalIndexes [Done]
- * getWikiID [Done]
- * isOpen [Done]
- * getServerVersion [Done]
- * getSoftwareLink [Done]
- * getSearchEngine [Done]
- *
- * Database driver wrapper: 23 / 23
- * lastError [Done]
- * lastErrno [Done]
- * doQuery [Done]
- * tableExists [Done]
- * fetchObject [Done]
- * fetchRow [Done]
- * freeResult [Done]
- * numRows [Done]
- * numFields [Done]
- * fieldName [Done]
- * insertId [Done]
- * dataSeek [Done]
- * affectedRows [Done]
- * selectDB [Done]
- * strencode [Done]
- * conditional [Done]
- * wasDeadlock [Done]
- * ping [Done]
- * getStatus [Done]
- * setTimeout [Done]
- * lock [Done]
- * unlock [Done]
- * insert [Done]
- * select [Done]
- *
- * Slave/master: 2 / 2
- * setFakeSlaveLag [Done]
- * setFakeMaster [Done]
- *
- * Reflection: 6 / 6
- * fieldExists [Done]
- * indexInfo [Done]
- * fieldInfo [Done]
- * fieldType [Done]
- * indexUnique [Done]
- * textFieldSize [Done]
- *
- * Generation: 16 / 16
- * tableName [Done]
- * addQuotes [Done]
- * makeList [Done]
- * makeSelectOptions [Done]
- * estimateRowCount [Done]
- * nextSequenceValue [Done]
- * useIndexClause [Done]
- * replace [Done]
- * deleteJoin [Done]
- * lowPriorityOption [Done]
- * limitResult [Done]
- * limitResultForUpdate [Done]
- * timestamp [Done]
- * encodeBlob [Done]
- * decodeBlob [Done]
- * buildConcat [Done]
- */
-
+
######################################
# Getters and Setters
######################################
-
+
/**
* Returns true if this database supports (and uses) cascading deletes
*/
@@ -330,20 +176,22 @@ class DatabaseIbm_db2 extends DatabaseBase {
}
/**
- * Returns true if this database supports (and uses) triggers (e.g. on the page table)
+ * Returns true if this database supports (and uses) triggers (e.g. on the
+ * page table)
*/
function cleanupTriggers() {
return true;
}
/**
- * Returns true if this database is strict about what can be put into an IP field.
+ * Returns true if this database is strict about what can be put into an
+ * IP field.
* Specifically, it uses a NULL value instead of an empty string.
*/
function strictIPs() {
return true;
}
-
+
/**
* Returns true if this database uses timestamps rather than integers
*/
@@ -359,7 +207,8 @@ class DatabaseIbm_db2 extends DatabaseBase {
}
/**
- * Returns true if this database does an implicit order by when the column has an index
+ * Returns true if this database does an implicit order by when the column
+ * has an index
* For example: SELECT page_title FROM page LIMIT 1
*/
function implicitOrderby() {
@@ -380,7 +229,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
function functionalIndexes() {
return true;
}
-
+
/**
* Returns a unique string representing the wiki on the server
*/
@@ -395,153 +244,148 @@ class DatabaseIbm_db2 extends DatabaseBase {
function getType() {
return 'ibm_db2';
}
-
- ######################################
- # Setup
- ######################################
-
-
+
/**
- *
+ *
* @param $server String: hostname of database server
* @param $user String: username
* @param $password String: password
* @param $dbName String: database name on the server
- * @param $failFunction Callback (optional)
* @param $flags Integer: database behaviour flags (optional, unused)
* @param $schema String
*/
- public function DatabaseIbm_db2($server = false, $user = false, $password = false,
- $dbName = false, $failFunction = false, $flags = 0,
+ public function __construct( $server = false, $user = false,
+ $password = false,
+ $dbName = false, $flags = 0,
$schema = self::USE_GLOBAL )
{
+ global $wgDBmwschema;
- global $wgOut, $wgDBmwschema;
- # Can't get a reference if it hasn't been set yet
- if ( !isset( $wgOut ) ) {
- $wgOut = null;
- }
- $this->mOut =& $wgOut;
- $this->mFailFunction = $failFunction;
- $this->mFlags = DBO_TRX | $flags;
-
if ( $schema == self::USE_GLOBAL ) {
$this->mSchema = $wgDBmwschema;
- }
- else {
+ } else {
$this->mSchema = $schema;
}
-
+
// configure the connection and statement objects
- $this->setDB2Option('db2_attr_case', 'DB2_CASE_LOWER', self::CONN_OPTION | self::STMT_OPTION);
- $this->setDB2Option('deferred_prepare', 'DB2_DEFERRED_PREPARE_ON', self::STMT_OPTION);
- $this->setDB2Option('rowcount', 'DB2_ROWCOUNT_PREFETCH_ON', self::STMT_OPTION);
-
- $this->open( $server, $user, $password, $dbName);
+ $this->setDB2Option( 'db2_attr_case', 'DB2_CASE_LOWER',
+ self::CONN_OPTION | self::STMT_OPTION );
+ $this->setDB2Option( 'deferred_prepare', 'DB2_DEFERRED_PREPARE_ON',
+ self::STMT_OPTION );
+ $this->setDB2Option( 'rowcount', 'DB2_ROWCOUNT_PREFETCH_ON',
+ self::STMT_OPTION );
+
+ parent::__construct( $server, $user, $password, $dbName, DBO_TRX | $flags );
}
-
+
/**
* Enables options only if the ibm_db2 extension version supports them
* @param $name String: name of the option in the options array
* @param $const String: name of the constant holding the right option value
* @param $type Integer: whether this is a Connection or Statement otion
*/
- private function setDB2Option($name, $const, $type) {
- if (defined($const)) {
- if ($type & self::CONN_OPTION) $this->mConnOptions[$name] = constant($const);
- if ($type & self::STMT_OPTION) $this->mStmtOptions[$name] = constant($const);
- }
- else {
- $this->installPrint("$const is not defined. ibm_db2 version is likely too low.");
+ private function setDB2Option( $name, $const, $type ) {
+ if ( defined( $const ) ) {
+ if ( $type & self::CONN_OPTION ) {
+ $this->mConnOptions[$name] = constant( $const );
+ }
+ if ( $type & self::STMT_OPTION ) {
+ $this->mStmtOptions[$name] = constant( $const );
+ }
+ } else {
+ $this->installPrint(
+ "$const is not defined. ibm_db2 version is likely too low." );
}
}
-
+
/**
* Outputs debug information in the appropriate place
* @param $string String: the relevant debug message
*/
- private function installPrint($string) {
- wfDebug("$string");
- if ($this->mMode == self::INSTALL_MODE) {
- print "<li>$string</li>";
+ private function installPrint( $string ) {
+ wfDebug( "$string\n" );
+ if ( $this->mMode == self::INSTALL_MODE ) {
+ print "<li><pre>$string</pre></li>";
flush();
- }
+ }
}
-
+
/**
* Opens a database connection and returns it
* Closes any existing connection
- * @return a fresh connection
+ *
* @param $server String: hostname
* @param $user String
* @param $password String
* @param $dbName String: database name
+ * @return a fresh connection
*/
- public function open( $server, $user, $password, $dbName )
- {
+ public function open( $server, $user, $password, $dbName ) {
// Load the port number
- global $wgDBport_db2, $wgDBcataloged;
+ global $wgDBport;
wfProfileIn( __METHOD__ );
-
+
// Load IBM DB2 driver if missing
- if (!@extension_loaded('ibm_db2')) {
- @dl('ibm_db2.so');
- }
+ wfDl( 'ibm_db2' );
+
// Test for IBM DB2 support, to avoid suppressed fatal error
if ( !function_exists( 'db2_connect' ) ) {
- $error = "DB2 functions missing, have you enabled the ibm_db2 extension for PHP?\n";
- $this->installPrint($error);
- $this->reportConnectionError($error);
+ $error = <<<ERROR
+DB2 functions missing, have you enabled the ibm_db2 extension for PHP?
+
+ERROR;
+ $this->installPrint( $error );
+ $this->reportConnectionError( $error );
}
- if (!strlen($user)) { // Copied from Postgres
+ if ( strlen( $user ) < 1 ) {
+ wfProfileOut( __METHOD__ );
return null;
}
-
+
// Close existing connection
$this->close();
// Cache conn info
$this->mServer = $server;
- $this->mPort = $port = $wgDBport_db2;
+ $this->mPort = $port = $wgDBport;
$this->mUser = $user;
$this->mPassword = $password;
$this->mDBname = $dbName;
- $this->mCataloged = $cataloged = $wgDBcataloged;
-
- if ( $cataloged == self::CATALOGED ) {
- $this->openCataloged($dbName, $user, $password);
- }
- elseif ( $cataloged == self::UNCATALOGED ) {
- $this->openUncataloged($dbName, $user, $password, $server, $port);
- }
+
+ $this->openUncataloged( $dbName, $user, $password, $server, $port );
+
// Apply connection config
- db2_set_option($this->mConn, $this->mConnOptions, 1);
- // Not all MediaWiki code is transactional
- // Rather, turn autocommit off in the begin function and turn on after a commit
- db2_autocommit($this->mConn, DB2_AUTOCOMMIT_ON);
+ db2_set_option( $this->mConn, $this->mConnOptions, 1 );
+ // Some MediaWiki code is still transaction-less (?).
+ // The strategy is to keep AutoCommit on for that code
+ // but switch it off whenever a transaction is begun.
+ db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
- if ( $this->mConn == false ) {
+ if ( !$this->mConn ) {
$this->installPrint( "DB connection error\n" );
- $this->installPrint( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
- $this->installPrint( $this->lastError()."\n" );
+ $this->installPrint(
+ "Server: $server, Database: $dbName, User: $user, Password: "
+ . substr( $password, 0, 3 ) . "...\n" );
+ $this->installPrint( $this->lastError() . "\n" );
+
+ wfProfileOut( __METHOD__ );
return null;
}
$this->mOpened = true;
$this->applySchema();
-
+
wfProfileOut( __METHOD__ );
return $this->mConn;
}
-
+
/**
* Opens a cataloged database connection, sets mConn
*/
- protected function openCataloged( $dbName, $user, $password )
- {
- @$this->mConn = db2_connect($dbName, $user, $password);
+ protected function openCataloged( $dbName, $user, $password ) {
+ @$this->mConn = db2_pconnect( $dbName, $user, $password );
}
-
+
/**
* Opens an uncataloged database connection, sets mConn
*/
@@ -550,14 +394,15 @@ class DatabaseIbm_db2 extends DatabaseBase {
$str = "DRIVER={IBM DB2 ODBC DRIVER};";
$str .= "DATABASE=$dbName;";
$str .= "HOSTNAME=$server;";
- if ($port) $str .= "PORT=$port;";
+ // port was formerly validated to not be 0
+ $str .= "PORT=$port;";
$str .= "PROTOCOL=TCPIP;";
$str .= "UID=$user;";
$str .= "PWD=$password;";
-
- @$this->mConn = db2_connect($str, $user, $password);
+
+ @$this->mConn = db2_pconnect( $str, $user, $password );
}
-
+
/**
* Closes a database connection, if it is open
* Returns success, true if already closed
@@ -565,16 +410,15 @@ class DatabaseIbm_db2 extends DatabaseBase {
public function close() {
$this->mOpened = false;
if ( $this->mConn ) {
- if ($this->trxLevel() > 0) {
+ if ( $this->trxLevel() > 0 ) {
$this->commit();
}
return db2_close( $this->mConn );
- }
- else {
+ } else {
return true;
}
}
-
+
/**
* Returns a fresh instance of this class
*
@@ -582,34 +426,35 @@ class DatabaseIbm_db2 extends DatabaseBase {
* @param $user String: username
* @param $password String
* @param $dbName String: database name on the server
- * @param $failFunction Callback (optional)
* @param $flags Integer: database behaviour flags (optional, unused)
* @return DatabaseIbm_db2 object
*/
- static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0)
+ static function newFromParams( $server, $user, $password, $dbName,
+ $flags = 0 )
{
- return new DatabaseIbm_db2( $server, $user, $password, $dbName, $failFunction, $flags );
+ return new DatabaseIbm_db2( $server, $user, $password, $dbName,
+ $flags );
}
-
+
/**
* Retrieves the most current database error
* Forces a database rollback
*/
public function lastError() {
$connerr = db2_conn_errormsg();
- if ($connerr) {
+ if ( $connerr ) {
//$this->rollback();
return $connerr;
}
$stmterr = db2_stmt_errormsg();
- if ($stmterr) {
+ if ( $stmterr ) {
//$this->rollback();
return $stmterr;
}
-
+
return false;
}
-
+
/**
* Get the last error number
* Return 0 if no error
@@ -617,43 +462,45 @@ class DatabaseIbm_db2 extends DatabaseBase {
*/
public function lastErrno() {
$connerr = db2_conn_error();
- if ($connerr) return $connerr;
+ if ( $connerr ) {
+ return $connerr;
+ }
$stmterr = db2_stmt_error();
- if ($stmterr) return $stmterr;
+ if ( $stmterr ) {
+ return $stmterr;
+ }
return 0;
}
-
+
/**
* Is a database connection open?
- * @return
+ * @return
*/
public function isOpen() { return $this->mOpened; }
-
+
/**
* The DBMS-dependent part of query()
* @param $sql String: SQL query.
- * @return object Result object to feed to fetchObject, fetchRow, ...; or false on failure
+ * @return object Result object for fetch functions or false on failure
* @access private
*/
/*private*/
public function doQuery( $sql ) {
- //print "<li><pre>$sql</pre></li>";
- // Switch into the correct namespace
$this->applySchema();
-
+
$ret = db2_exec( $this->mConn, $sql, $this->mStmtOptions );
- if( !$ret ) {
- print "<br><pre>";
- print $sql;
- print "</pre><br>";
+ if( $ret == false ) {
$error = db2_stmt_errormsg();
- throw new DBUnexpectedError($this, 'SQL error: ' . htmlspecialchars( $error ) );
+ $this->installPrint( "<pre>$sql</pre>" );
+ $this->installPrint( $error );
+ throw new DBUnexpectedError( $this, 'SQL error: '
+ . htmlspecialchars( $error ) );
}
$this->mLastResult = $ret;
- $this->mAffectedRows = null; // Not calculated until asked for
+ $this->mAffectedRows = null; // Not calculated until asked for
return $ret;
}
-
+
/**
* @return string Version information from the database
*/
@@ -661,7 +508,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
$info = db2_server_info( $this->mConn );
return $info->DBMS_VER;
}
-
+
/**
* Queries whether a given table exists
* @return boolean
@@ -669,22 +516,24 @@ class DatabaseIbm_db2 extends DatabaseBase {
public function tableExists( $table ) {
$schema = $this->mSchema;
$sql = <<< EOF
-SELECT COUNT(*) FROM SYSIBM.SYSTABLES ST
+SELECT COUNT( * ) FROM SYSIBM.SYSTABLES ST
WHERE ST.NAME = '$table' AND ST.CREATOR = '$schema'
EOF;
$res = $this->query( $sql );
- if (!$res) return false;
-
+ if ( !$res ) {
+ return false;
+ }
+
// If the table exists, there should be one of it
- @$row = $this->fetchRow($res);
+ @$row = $this->fetchRow( $res );
$count = $row[0];
- if ($count == '1' or $count == 1) {
+ if ( $count == '1' || $count == 1 ) {
return true;
}
-
+
return false;
}
-
+
/**
* Fetch the next row from the given result object, in object form.
* Fields can be retrieved with $row->fieldname, with fields acting like
@@ -700,14 +549,15 @@ EOF;
}
@$row = db2_fetch_object( $res );
if( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
+ throw new DBUnexpectedError( $this, 'Error in fetchObject(): '
+ . htmlspecialchars( $this->lastError() ) );
}
return $row;
}
/**
* Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
+ * form. Fields are retrieved with $row['fieldname'].
*
* @param $res SQL result object as returned from Database::query(), etc.
* @return DB2 row object
@@ -719,55 +569,47 @@ EOF;
}
@$row = db2_fetch_array( $res );
if ( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
+ throw new DBUnexpectedError( $this, 'Error in fetchRow(): '
+ . htmlspecialchars( $this->lastError() ) );
}
return $row;
}
-
- /**
- * Override if introduced to base Database class
- */
- public function initial_setup() {
- // do nothing
- }
-
+
/**
* Create tables, stored procedures, and so on
*/
public function setup_database() {
- // Timeout was being changed earlier due to mysterious crashes
- // Changing it now may cause more problems than not changing it
- //set_time_limit(240);
try {
// TODO: switch to root login if available
-
+
// Switch into the correct namespace
$this->applySchema();
$this->begin();
-
+
$res = $this->sourceFile( "../maintenance/ibm_db2/tables.sql" );
- if ($res !== true) {
- print " <b>FAILED</b>: " . htmlspecialchars( $res ) . "</li>";
+ if ( $res !== true ) {
+ print ' <b>FAILED</b>: ' . htmlspecialchars( $res ) . '</li>';
} else {
- print " done</li>";
+ print ' done</li>';
}
- $res = null;
-
- // TODO: update mediawiki_version table
-
+ $res = $this->sourceFile( "../maintenance/ibm_db2/foreignkeys.sql" );
+ if ( $res !== true ) {
+ print ' <b>FAILED</b>: ' . htmlspecialchars( $res ) . '</li>';
+ } else {
+ print '<li>Foreign keys done</li>';
+ }
+
// TODO: populate interwiki links
-
- if ($this->lastError()) {
- print "<li>Errors encountered during table creation -- rolled back</li>\n";
- print "<li>Please install again</li>\n";
+
+ if ( $this->lastError() ) {
+ $this->installPrint(
+ 'Errors encountered during table creation -- rolled back' );
+ $this->installPrint( 'Please install again' );
$this->rollback();
- }
- else {
+ } else {
$this->commit();
}
- }
- catch (MWException $mwe)
- {
+ } catch ( MWException $mwe ) {
print "<br><pre>$mwe</pre><br>";
}
}
@@ -775,47 +617,48 @@ EOF;
/**
* Escapes strings
* Doesn't escape numbers
+ *
* @param $s String: string to escape
* @return escaped string
*/
public function addQuotes( $s ) {
- //$this->installPrint("DB2::addQuotes($s)\n");
+ //$this->installPrint( "DB2::addQuotes( $s )\n" );
if ( is_null( $s ) ) {
- return "NULL";
- } else if ($s instanceof Blob) {
- return "'".$s->fetch($s)."'";
- } else if ($s instanceof IBM_DB2Blob) {
- return "'".$this->decodeBlob($s)."'";
- }
- $s = $this->strencode($s);
- if ( is_numeric($s) ) {
+ return 'NULL';
+ } elseif ( $s instanceof Blob ) {
+ return "'" . $s->fetch( $s ) . "'";
+ } elseif ( $s instanceof IBM_DB2Blob ) {
+ return "'" . $this->decodeBlob( $s ) . "'";
+ }
+ $s = $this->strencode( $s );
+ if ( is_numeric( $s ) ) {
return $s;
- }
- else {
+ } else {
return "'$s'";
}
}
-
+
/**
* Verifies that a DB2 column/field type is numeric
- * @return bool true if numeric
+ *
* @param $type String: DB2 column type
+ * @return Boolean: true if numeric
*/
public function is_numeric_type( $type ) {
- switch (strtoupper($type)) {
- case 'SMALLINT':
- case 'INTEGER':
- case 'INT':
- case 'BIGINT':
- case 'DECIMAL':
- case 'REAL':
- case 'DOUBLE':
- case 'DECFLOAT':
- return true;
+ switch ( strtoupper( $type ) ) {
+ case 'SMALLINT':
+ case 'INTEGER':
+ case 'INT':
+ case 'BIGINT':
+ case 'DECIMAL':
+ case 'REAL':
+ case 'DOUBLE':
+ case 'DECFLOAT':
+ return true;
}
return false;
}
-
+
/**
* Alias for addQuotes()
* @param $s String: string to escape
@@ -823,178 +666,153 @@ EOF;
*/
public function strencode( $s ) {
// Bloody useless function
- // Prepends backslashes to \x00, \n, \r, \, ', " and \x1a.
+ // Prepends backslashes to \x00, \n, \r, \, ', " and \x1a.
// But also necessary
- $s = db2_escape_string($s);
+ $s = db2_escape_string( $s );
// Wide characters are evil -- some of them look like '
- $s = utf8_encode($s);
+ $s = utf8_encode( $s );
// Fix its stupidity
- $from = array("\\\\", "\\'", '\\n', '\\t', '\\"', '\\r');
- $to = array("\\", "''", "\n", "\t", '"', "\r");
- $s = str_replace($from, $to, $s); // DB2 expects '', not \' escaping
+ $from = array( "\\\\", "\\'", '\\n', '\\t', '\\"', '\\r' );
+ $to = array( "\\", "''", "\n", "\t", '"', "\r" );
+ $s = str_replace( $from, $to, $s ); // DB2 expects '', not \' escaping
return $s;
}
-
+
/**
* Switch into the database schema
*/
protected function applySchema() {
- if ( !($this->mSchemaSet) ) {
+ if ( !( $this->mSchemaSet ) ) {
$this->mSchemaSet = true;
$this->begin();
- $this->doQuery("SET SCHEMA = $this->mSchema");
+ $this->doQuery( "SET SCHEMA = $this->mSchema" );
$this->commit();
- }
+ }
}
-
+
/**
* Start a transaction (mandatory)
*/
public function begin( $fname = 'DatabaseIbm_db2::begin' ) {
- // turn off auto-commit
- db2_autocommit($this->mConn, DB2_AUTOCOMMIT_OFF);
+ // BEGIN is implicit for DB2
+ // However, it requires that AutoCommit be off.
+
+ // Some MediaWiki code is still transaction-less (?).
+ // The strategy is to keep AutoCommit on for that code
+ // but switch it off whenever a transaction is begun.
+ db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_OFF );
+
$this->mTrxLevel = 1;
}
-
+
/**
* End a transaction
* Must have a preceding begin()
*/
public function commit( $fname = 'DatabaseIbm_db2::commit' ) {
- db2_commit($this->mConn);
- // turn auto-commit back on
- db2_autocommit($this->mConn, DB2_AUTOCOMMIT_ON);
+ db2_commit( $this->mConn );
+
+ // Some MediaWiki code is still transaction-less (?).
+ // The strategy is to keep AutoCommit on for that code
+ // but switch it off whenever a transaction is begun.
+ db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
+
$this->mTrxLevel = 0;
}
-
+
/**
* Cancel a transaction
*/
public function rollback( $fname = 'DatabaseIbm_db2::rollback' ) {
- db2_rollback($this->mConn);
+ db2_rollback( $this->mConn );
// turn auto-commit back on
// not sure if this is appropriate
- db2_autocommit($this->mConn, DB2_AUTOCOMMIT_ON);
+ db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
$this->mTrxLevel = 0;
}
-
+
/**
* Makes an encoded list of strings from an array
* $mode:
- * LIST_COMMA - comma separated, no field names
- * LIST_AND - ANDed WHERE clause (without the WHERE)
- * LIST_OR - ORed WHERE clause (without the WHERE)
- * LIST_SET - comma separated with field names, like a SET clause
- * LIST_NAMES - comma separated field names
- */
- public function makeList( $a, $mode = LIST_COMMA ) {
+ * LIST_COMMA - comma separated, no field names
+ * LIST_AND - ANDed WHERE clause (without the WHERE)
+ * LIST_OR - ORed WHERE clause (without the WHERE)
+ * LIST_SET - comma separated with field names, like a SET clause
+ * LIST_NAMES - comma separated field names
+ * LIST_SET_PREPARED - like LIST_SET, except with ? tokens as values
+ */
+ function makeList( $a, $mode = LIST_COMMA ) {
if ( !is_array( $a ) ) {
- throw new DBUnexpectedError( $this, 'Database::makeList called with incorrect parameters' );
+ throw new DBUnexpectedError( $this,
+ 'DatabaseIbm_db2::makeList called with incorrect parameters' );
}
- $first = true;
- $list = '';
- foreach ( $a as $field => $value ) {
- if ( !$first ) {
- if ( $mode == LIST_AND ) {
- $list .= ' AND ';
- } elseif($mode == LIST_OR) {
- $list .= ' OR ';
+ // if this is for a prepared UPDATE statement
+ // (this should be promoted to the parent class
+ // once other databases use prepared statements)
+ if ( $mode == LIST_SET_PREPARED ) {
+ $first = true;
+ $list = '';
+ foreach ( $a as $field => $value ) {
+ if ( !$first ) {
+ $list .= ", $field = ?";
} else {
- $list .= ',';
- }
- } else {
- $first = false;
- }
- if ( ($mode == LIST_AND || $mode == LIST_OR) && is_numeric( $field ) ) {
- $list .= "($value)";
- } elseif ( ($mode == LIST_SET) && is_numeric( $field ) ) {
- $list .= "$value";
- } elseif ( ($mode == LIST_AND || $mode == LIST_OR) && is_array($value) ) {
- if( count( $value ) == 0 ) {
- throw new MWException( __METHOD__.': empty input' );
- } elseif( count( $value ) == 1 ) {
- // Special-case single values, as IN isn't terribly efficient
- // Don't necessarily assume the single key is 0; we don't
- // enforce linear numeric ordering on other arrays here.
- $value = array_values( $value );
- $list .= $field." = ".$this->addQuotes( $value[0] );
- } else {
- $list .= $field." IN (".$this->makeList($value).") ";
- }
- } elseif( is_null($value) ) {
- if ( $mode == LIST_AND || $mode == LIST_OR ) {
- $list .= "$field IS ";
- } elseif ( $mode == LIST_SET ) {
- $list .= "$field = ";
- }
- $list .= 'NULL';
- } else {
- if ( $mode == LIST_AND || $mode == LIST_OR || $mode == LIST_SET ) {
- $list .= "$field = ";
- }
- if ( $mode == LIST_NAMES ) {
- $list .= $value;
- }
- // Leo: Can't insert quoted numbers into numeric columns
- // (?) Might cause other problems. May have to check column type before insertion.
- else if ( is_numeric($value) ) {
- $list .= $value;
- }
- else {
- $list .= $this->addQuotes( $value );
+ $list .= "$field = ?";
+ $first = false;
}
}
+ $list .= '';
+
+ return $list;
}
- return $list;
+
+ // otherwise, call the usual function
+ return parent::makeList( $a, $mode );
}
-
+
/**
* Construct a LIMIT query with optional offset
* This is used for query pages
+ *
* @param $sql string SQL query we will append the limit too
* @param $limit integer the SQL limit
* @param $offset integer the SQL offset (default false)
*/
- public function limitResult($sql, $limit, $offset=false) {
- if( !is_numeric($limit) ) {
- throw new DBUnexpectedError( $this, "Invalid non-numeric limit passed to limitResult()\n" );
+ public function limitResult( $sql, $limit, $offset=false ) {
+ if( !is_numeric( $limit ) ) {
+ throw new DBUnexpectedError( $this,
+ "Invalid non-numeric limit passed to limitResult()\n" );
}
if( $offset ) {
- $this->installPrint("Offset parameter not supported in limitResult()\n");
+ if ( stripos( $sql, 'where' ) === false ) {
+ return "$sql AND ( ROWNUM BETWEEN $offset AND $offset+$limit )";
+ } else {
+ return "$sql WHERE ( ROWNUM BETWEEN $offset AND $offset+$limit )";
+ }
}
- // TODO implement proper offset handling
- // idea: get all the rows between 0 and offset, advance cursor to offset
return "$sql FETCH FIRST $limit ROWS ONLY ";
}
-
+
/**
* Handle reserved keyword replacement in table names
- * @return
+ *
* @param $name Object
+ * @return String
*/
public function tableName( $name ) {
- # Replace reserved words with better ones
-// switch( $name ) {
-// case 'user':
-// return 'mwuser';
-// case 'text':
-// return 'pagecontent';
-// default:
-// return $name;
-// }
// we want maximum compatibility with MySQL schema
return $name;
}
-
+
/**
* Generates a timestamp in an insertable format
- * @return string timestamp value
+ *
* @param $ts timestamp
+ * @return String: timestamp value
*/
- public function timestamp( $ts=0 ) {
+ public function timestamp( $ts = 0 ) {
// TS_MW cannot be easily distinguished from an integer
- return wfTimestamp(TS_DB2,$ts);
+ return wfTimestamp( TS_DB2, $ts );
}
/**
@@ -1003,19 +821,20 @@ EOF;
* @return next value in that sequence
*/
public function nextSequenceValue( $seqName ) {
- // Not using sequences in the primary schema to allow for easy third-party migration scripts
- // Emulating MySQL behaviour of using NULL to signal that sequences aren't used
+ // Not using sequences in the primary schema to allow for easier migration
+ // from MySQL
+ // Emulating MySQL behaviour of using NULL to signal that sequences
+ // aren't used
/*
$safeseq = preg_replace( "/'/", "''", $seqName );
$res = $this->query( "VALUES NEXTVAL FOR $safeseq" );
$row = $this->fetchRow( $res );
$this->mInsertId = $row[0];
- $this->freeResult( $res );
return $this->mInsertId;
*/
return null;
}
-
+
/**
* This must be called after nextSequenceVal
* @return Last sequence value used as a primary key
@@ -1023,26 +842,27 @@ EOF;
public function insertId() {
return $this->mInsertId;
}
-
+
/**
- * Updates the mInsertId property with the value of the last insert into a generated column
+ * Updates the mInsertId property with the value of the last insert
+ * into a generated column
+ *
* @param $table String: sanitized table name
- * @param $primaryKey Mixed: string name of the primary key or a bool if this call is a do-nothing
+ * @param $primaryKey Mixed: string name of the primary key
* @param $stmt Resource: prepared statement resource
* of the SELECT primary_key FROM FINAL TABLE ( INSERT ... ) form
*/
- private function calcInsertId($table, $primaryKey, $stmt) {
- if ($primaryKey) {
- $id_row = $this->fetchRow($stmt);
- $this->mInsertId = $id_row[0];
+ private function calcInsertId( $table, $primaryKey, $stmt ) {
+ if ( $primaryKey ) {
+ $this->mInsertId = db2_last_insert_id( $this->mConn );
}
}
-
+
/**
* INSERT wrapper, inserts an array into a table
*
- * $args may be a single associative array, or an array of these with numeric keys,
- * for multi-row insert
+ * $args may be a single associative array, or an array of arrays
+ * with numeric keys, for multi-row insert
*
* @param $table String: Name of the table to insert to.
* @param $args Array: Items to insert into the table.
@@ -1051,30 +871,33 @@ EOF;
*
* @return bool Success of insert operation. IGNORE always returns true.
*/
- public function insert( $table, $args, $fname = 'DatabaseIbm_db2::insert', $options = array() ) {
+ public function insert( $table, $args, $fname = 'DatabaseIbm_db2::insert',
+ $options = array() )
+ {
if ( !count( $args ) ) {
return true;
}
// get database-specific table name (not used)
$table = $this->tableName( $table );
// format options as an array
- if ( !is_array( $options ) ) $options = array( $options );
+ $options = IBM_DB2Helper::makeArray( $options );
// format args as an array of arrays
if ( !( isset( $args[0] ) && is_array( $args[0] ) ) ) {
- $args = array($args);
+ $args = array( $args );
}
+
// prevent insertion of NULL into primary key columns
- list($args, $primaryKeys) = $this->removeNullPrimaryKeys($table, $args);
+ list( $args, $primaryKeys ) = $this->removeNullPrimaryKeys( $table, $args );
// if there's only one primary key
// we'll be able to read its value after insertion
$primaryKey = false;
- if (count($primaryKeys) == 1) {
+ if ( count( $primaryKeys ) == 1 ) {
$primaryKey = $primaryKeys[0];
}
-
+
// get column names
$keys = array_keys( $args[0] );
- $key_count = count($keys);
+ $key_count = count( $keys );
// If IGNORE is set, we use savepoints to emulate mysql's behavior
$ignore = in_array( 'IGNORE', $options ) ? 'mw' : '';
@@ -1082,144 +905,169 @@ EOF;
// assume success
$res = true;
// If we are not in a transaction, we need to be for savepoint trickery
- $didbegin = 0;
- if (! $this->mTrxLevel) {
+ if ( !$this->mTrxLevel ) {
$this->begin();
- $didbegin = 1;
}
- $sql = "INSERT INTO $table (" . implode( ',', $keys ) . ') VALUES ';
- switch($key_count) {
- //case 0 impossible
- case 1:
- $sql .= '(?)';
- break;
- default:
- $sql .= '(?' . str_repeat(',?', $key_count-1) . ')';
- }
- // add logic to read back the new primary key value
- if ($primaryKey) {
- $sql = "SELECT $primaryKey FROM FINAL TABLE($sql)";
+ $sql = "INSERT INTO $table ( " . implode( ',', $keys ) . ' ) VALUES ';
+ if ( $key_count == 1 ) {
+ $sql .= '( ? )';
+ } else {
+ $sql .= '( ?' . str_repeat( ',?', $key_count-1 ) . ' )';
}
- $stmt = $this->prepare($sql);
-
+ //$this->installPrint( "Preparing the following SQL:" );
+ //$this->installPrint( "$sql" );
+ //$this->installPrint( print_r( $args, true ));
+ $stmt = $this->prepare( $sql );
+
// start a transaction/enter transaction mode
$this->begin();
if ( !$ignore ) {
- $first = true;
+ //$first = true;
foreach ( $args as $row ) {
+ //$this->installPrint( "Inserting " . print_r( $row, true ));
// insert each row into the database
- $res = $res & $this->execute($stmt, $row);
+ $res = $res & $this->execute( $stmt, $row );
+ if ( !$res ) {
+ $this->installPrint( 'Last error:' );
+ $this->installPrint( $this->lastError() );
+ }
// get the last inserted value into a generated column
- $this->calcInsertId($table, $primaryKey, $stmt);
+ $this->calcInsertId( $table, $primaryKey, $stmt );
}
- }
- else {
+ } else {
$olde = error_reporting( 0 );
// For future use, we may want to track the number of actual inserts
// Right now, insert (all writes) simply return true/false
$numrowsinserted = 0;
-
+
// always return true
$res = true;
-
+
foreach ( $args as $row ) {
$overhead = "SAVEPOINT $ignore ON ROLLBACK RETAIN CURSORS";
- db2_exec($this->mConn, $overhead, $this->mStmtOptions);
-
- $res2 = $this->execute($stmt, $row);
+ db2_exec( $this->mConn, $overhead, $this->mStmtOptions );
+
+ $res2 = $this->execute( $stmt, $row );
+
+ if ( !$res2 ) {
+ $this->installPrint( 'Last error:' );
+ $this->installPrint( $this->lastError() );
+ }
// get the last inserted value into a generated column
- $this->calcInsertId($table, $primaryKey, $stmt);
-
+ $this->calcInsertId( $table, $primaryKey, $stmt );
+
$errNum = $this->lastErrno();
- if ($errNum) {
- db2_exec( $this->mConn, "ROLLBACK TO SAVEPOINT $ignore", $this->mStmtOptions );
- }
- else {
- db2_exec( $this->mConn, "RELEASE SAVEPOINT $ignore", $this->mStmtOptions );
+ if ( $errNum ) {
+ db2_exec( $this->mConn, "ROLLBACK TO SAVEPOINT $ignore",
+ $this->mStmtOptions );
+ } else {
+ db2_exec( $this->mConn, "RELEASE SAVEPOINT $ignore",
+ $this->mStmtOptions );
$numrowsinserted++;
}
}
-
+
$olde = error_reporting( $olde );
// Set the affected row count for the whole operation
$this->mAffectedRows = $numrowsinserted;
}
// commit either way
$this->commit();
-
+ $this->freePrepared( $stmt );
+
return $res;
}
-
+
/**
* Given a table name and a hash of columns with values
* Removes primary key columns from the hash where the value is NULL
- *
+ *
* @param $table String: name of the table
* @param $args Array of hashes of column names with values
- * @return Array: tuple containing filtered array of columns, array of primary keys
+ * @return Array: tuple( filtered array of columns, array of primary keys )
*/
- private function removeNullPrimaryKeys($table, $args) {
+ private function removeNullPrimaryKeys( $table, $args ) {
$schema = $this->mSchema;
// find out the primary keys
- $keyres = db2_primary_keys($this->mConn, null, strtoupper($schema), strtoupper($table));
+ $keyres = db2_primary_keys( $this->mConn, null, strtoupper( $schema ),
+ strtoupper( $table )
+ );
$keys = array();
- for ($row = $this->fetchObject($keyres); $row != null; $row = $this->fetchRow($keyres)) {
- $keys[] = strtolower($row->column_name);
+ for (
+ $row = $this->fetchObject( $keyres );
+ $row != null;
+ $row = $this->fetchObject( $keyres )
+ )
+ {
+ $keys[] = strtolower( $row->column_name );
}
// remove primary keys
- foreach ($args as $ai => $row) {
- foreach ($keys as $ki => $key) {
- if ($row[$key] == null) {
- unset($row[$key]);
+ foreach ( $args as $ai => $row ) {
+ foreach ( $keys as $key ) {
+ if ( $row[$key] == null ) {
+ unset( $row[$key] );
}
}
$args[$ai] = $row;
}
// return modified hash
- return array($args, $keys);
+ return array( $args, $keys );
}
-
+
/**
* UPDATE wrapper, takes a condition array and a SET array
*
* @param $table String: The table to UPDATE
* @param $values An array of values to SET
- * @param $conds An array of conditions (WHERE). Use '*' to update all rows.
+ * @param $conds An array of conditions ( WHERE ). Use '*' to update all rows.
* @param $fname String: The Class::Function calling this function
- * (for the log)
+ * ( for the log )
* @param $options An array of UPDATE options, can be one or
* more of IGNORE, LOW_PRIORITY
* @return Boolean
*/
- public function update( $table, $values, $conds, $fname = 'Database::update', $options = array() ) {
+ public function update( $table, $values, $conds, $fname = 'DatabaseIbm_db2::update',
+ $options = array() )
+ {
$table = $this->tableName( $table );
$opts = $this->makeUpdateOptions( $options );
- $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET );
+ $sql = "UPDATE $opts $table SET "
+ . $this->makeList( $values, LIST_SET_PREPARED );
if ( $conds != '*' ) {
$sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
}
- return $this->query( $sql, $fname );
+ $stmt = $this->prepare( $sql );
+ $this->installPrint( 'UPDATE: ' . print_r( $values, true ) );
+ // assuming for now that an array with string keys will work
+ // if not, convert to simple array first
+ $result = $this->execute( $stmt, $values );
+ $this->freePrepared( $stmt );
+
+ return $result;
}
-
+
/**
* DELETE query wrapper
*
* Use $conds == "*" to delete all rows
*/
- public function delete( $table, $conds, $fname = 'Database::delete' ) {
+ public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
if ( !$conds ) {
- throw new DBUnexpectedError( $this, 'Database::delete() called with no conditions' );
+ throw new DBUnexpectedError( $this,
+ 'DatabaseIbm_db2::delete() called with no conditions' );
}
$table = $this->tableName( $table );
$sql = "DELETE FROM $table";
if ( $conds != '*' ) {
$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
}
- return $this->query( $sql, $fname );
+ $result = $this->query( $sql, $fname );
+
+ return $result;
}
-
+
/**
* Returns the number of rows affected by the last query or 0
* @return Integer: the number of rows affected by the last query
@@ -1229,11 +1077,12 @@ EOF;
// Forced result for simulated queries
return $this->mAffectedRows;
}
- if( empty( $this->mLastResult ) )
+ if( empty( $this->mLastResult ) ) {
return 0;
+ }
return db2_num_rows( $this->mLastResult );
}
-
+
/**
* Simulates REPLACE with a DELETE followed by INSERT
* @param $table Object
@@ -1242,10 +1091,12 @@ EOF;
* @param $fname String: name of the function for profiling
* @return nothing
*/
- function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseIbm_db2::replace' ) {
+ function replace( $table, $uniqueIndexes, $rows,
+ $fname = 'DatabaseIbm_db2::replace' )
+ {
$table = $this->tableName( $table );
- if (count($rows)==0) {
+ if ( count( $rows )==0 ) {
return;
}
@@ -1262,9 +1113,9 @@ EOF;
foreach ( $uniqueIndexes as $index ) {
if ( $first ) {
$first = false;
- $sql .= "(";
+ $sql .= '( ';
} else {
- $sql .= ') OR (';
+ $sql .= ' ) OR ( ';
}
if ( is_array( $index ) ) {
$first2 = true;
@@ -1274,23 +1125,24 @@ EOF;
} else {
$sql .= ' AND ';
}
- $sql .= $col.'=' . $this->addQuotes( $row[$col] );
+ $sql .= $col . '=' . $this->addQuotes( $row[$col] );
}
} else {
- $sql .= $index.'=' . $this->addQuotes( $row[$index] );
+ $sql .= $index . '=' . $this->addQuotes( $row[$index] );
}
}
- $sql .= ')';
+ $sql .= ' )';
$this->query( $sql, $fname );
}
# Now insert the row
- $sql = "INSERT INTO $table (" . $this->makeList( array_keys( $row ), LIST_NAMES ) .') VALUES (' .
- $this->makeList( $row, LIST_COMMA ) . ')';
+ $sql = "INSERT INTO $table ( "
+ . $this->makeList( array_keys( $row ), LIST_NAMES )
+ .' ) VALUES ( ' . $this->makeList( $row, LIST_COMMA ) . ' )';
$this->query( $sql, $fname );
}
}
-
+
/**
* Returns the number of rows in the result set
* Has to be called right after the corresponding select query
@@ -1303,12 +1155,11 @@ EOF;
}
if ( $this->mNumRows ) {
return $this->mNumRows;
- }
- else {
+ } else {
return 0;
}
}
-
+
/**
* Moves the row pointer of the result set
* @param $res Object: result set
@@ -1321,11 +1172,11 @@ EOF;
}
return db2_fetch_row( $res, $row );
}
-
+
###
- # Fix notices in Block.php
+ # Fix notices in Block.php
###
-
+
/**
* Frees memory associated with a statement resource
* @param $res Object: statement resource to free
@@ -1336,10 +1187,10 @@ EOF;
$res = $res->result;
}
if ( !@db2_free_result( $res ) ) {
- throw new DBUnexpectedError($this, "Unable to free DB2 result\n" );
+ throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
}
}
-
+
/**
* Returns the number of columns in a resource
* @param $res Object: statement resource
@@ -1351,7 +1202,7 @@ EOF;
}
return db2_num_fields( $res );
}
-
+
/**
* Returns the nth column name
* @param $res Object: statement resource
@@ -1364,57 +1215,65 @@ EOF;
}
return db2_field_name( $res, $n );
}
-
+
/**
* SELECT wrapper
*
* @param $table Array or string, table name(s) (prefix auto-added)
* @param $vars Array or string, field name(s) to be retrieved
* @param $conds Array or string, condition(s) for WHERE
- * @param $fname String: calling function name (use __METHOD__) for logs/profiling
- * @param $options Associative array of options (e.g. array('GROUP BY' => 'page_title')),
- * see Database::makeSelectOptions code for list of supported stuff
+ * @param $fname String: calling function name (use __METHOD__)
+ * for logs/profiling
+ * @param $options Associative array of options
+ * (e.g. array('GROUP BY' => 'page_title')),
+ * see Database::makeSelectOptions code for list of
+ * supported stuff
* @param $join_conds Associative array of table join conditions (optional)
- * (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
- * @return Mixed: database result resource (feed to Database::fetchObject or whatever), or false on failure
+ * (e.g. array( 'page' => array('LEFT JOIN',
+ * 'page_latest=rev_id') )
+ * @return Mixed: database result resource for fetch functions or false
+ * on failure
*/
- public function select( $table, $vars, $conds='', $fname = 'DatabaseIbm_db2::select', $options = array(), $join_conds = array() )
+ public function select( $table, $vars, $conds = '', $fname = 'DatabaseIbm_db2::select', $options = array(), $join_conds = array() )
{
- $res = parent::select( $table, $vars, $conds, $fname, $options, $join_conds );
-
+ $res = parent::select( $table, $vars, $conds, $fname, $options,
+ $join_conds );
+
// We must adjust for offset
- if ( isset( $options['LIMIT'] ) ) {
- if ( isset ($options['OFFSET'] ) ) {
- $limit = $options['LIMIT'];
- $offset = $options['OFFSET'];
- }
+ if ( isset( $options['LIMIT'] ) && isset ( $options['OFFSET'] ) ) {
+ $limit = $options['LIMIT'];
+ $offset = $options['OFFSET'];
}
-
-
- // DB2 does not have a proper num_rows() function yet, so we must emulate it
- // DB2 9.5.3/9.5.4 and the corresponding ibm_db2 driver will introduce a working one
- // Yay!
-
+
+ // DB2 does not have a proper num_rows() function yet, so we must emulate
+ // DB2 9.5.4 and the corresponding ibm_db2 driver will introduce
+ // a working one
+ // TODO: Yay!
+
// we want the count
- $vars2 = array('count(*) as num_rows');
+ $vars2 = array( 'count( * ) as num_rows' );
// respecting just the limit option
$options2 = array();
- if ( isset( $options['LIMIT'] ) ) $options2['LIMIT'] = $options['LIMIT'];
+ if ( isset( $options['LIMIT'] ) ) {
+ $options2['LIMIT'] = $options['LIMIT'];
+ }
// but don't try to emulate for GROUP BY
- if ( isset( $options['GROUP BY'] ) ) return $res;
-
- $res2 = parent::select( $table, $vars2, $conds, $fname, $options2, $join_conds );
- $obj = $this->fetchObject($res2);
+ if ( isset( $options['GROUP BY'] ) ) {
+ return $res;
+ }
+
+ $res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
+ $join_conds );
+ $obj = $this->fetchObject( $res2 );
$this->mNumRows = $obj->num_rows;
-
-
+
return $res;
}
-
+
/**
* Handles ordering, grouping, and having options ('GROUP BY' => colname)
* Has limited support for per-column options (colnum => 'DISTINCT')
- *
+ *
* @private
*
* @param $options Associative array of options to be turned into
@@ -1432,31 +1291,41 @@ EOF;
}
}
- if ( isset( $options['GROUP BY'] ) ) $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
- if ( isset( $options['HAVING'] ) ) $preLimitTail .= " HAVING {$options['HAVING']}";
- if ( isset( $options['ORDER BY'] ) ) $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
-
- if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
-
+ if ( isset( $options['GROUP BY'] ) ) {
+ $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
+ }
+ if ( isset( $options['HAVING'] ) ) {
+ $preLimitTail .= " HAVING {$options['HAVING']}";
+ }
+ if ( isset( $options['ORDER BY'] ) ) {
+ $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
+ }
+
+ if ( isset( $noKeyOptions['DISTINCT'] )
+ || isset( $noKeyOptions['DISTINCTROW'] ) )
+ {
+ $startOpts .= 'DISTINCT';
+ }
+
return array( $startOpts, '', $preLimitTail, $postLimitTail );
}
-
+
/**
* Returns link to IBM DB2 free download
- * @return string wikitext of a link to the server software's web site
+ * @return String: wikitext of a link to the server software's web site
*/
- public function getSoftwareLink() {
- return "[http://www.ibm.com/software/data/db2/express/?s_cmp=ECDDWW01&s_tact=MediaWiki IBM DB2]";
+ public static function getSoftwareLink() {
+ return '[http://www.ibm.com/db2/express/ IBM DB2]';
}
-
+
/**
* Get search engine class. All subclasses of this
* need to implement this if they wish to use searching.
- *
+ *
* @return String
*/
public function getSearchEngine() {
- return "SearchIBM_DB2";
+ return 'SearchIBM_DB2';
}
/**
@@ -1466,16 +1335,17 @@ EOF;
public function wasDeadlock() {
// get SQLSTATE
$err = $this->lastErrno();
- switch($err) {
+ switch( $err ) {
+ // This is literal port of the MySQL logic and may be wrong for DB2
case '40001': // sql0911n, Deadlock or timeout, rollback
case '57011': // sql0904n, Resource unavailable, no rollback
case '57033': // sql0913n, Deadlock or timeout, no rollback
- $this->installPrint("In a deadlock because of SQLSTATE $err");
+ $this->installPrint( "In a deadlock because of SQLSTATE $err" );
return true;
}
return false;
}
-
+
/**
* Ping the server and try to reconnect if it there is no connection
* The connection may be closed and reopened while this happens
@@ -1485,15 +1355,9 @@ EOF;
// db2_ping() doesn't exist
// Emulate
$this->close();
- if ($this->mCataloged == null) {
- return false;
- }
- else if ($this->mCataloged) {
- $this->mConn = $this->openCataloged($this->mDBName, $this->mUser, $this->mPassword);
- }
- else if (!$this->mCataloged) {
- $this->mConn = $this->openUncataloged($this->mDBName, $this->mUser, $this->mPassword, $this->mServer, $this->mPort);
- }
+ $this->mConn = $this->openUncataloged( $this->mDBName, $this->mUser,
+ $this->mPassword, $this->mServer, $this->mPort );
+
return false;
}
######################################
@@ -1502,65 +1366,33 @@ EOF;
/**
* Not implemented
* @return string ''
- * @deprecated
*/
- public function getStatus( $which="%" ) { $this->installPrint('Not implemented for DB2: getStatus()'); return ''; }
- /**
- * Not implemented
- * TODO
- * @return bool true
- */
- /**
- * Not implemented
- * @deprecated
- */
- public function setFakeSlaveLag( $lag ) { $this->installPrint('Not implemented for DB2: setFakeSlaveLag()'); }
- /**
- * Not implemented
- * @deprecated
- */
- public function setFakeMaster( $enabled = true ) { $this->installPrint('Not implemented for DB2: setFakeMaster()'); }
+ public function getStatus( $which = '%' ) {
+ $this->installPrint( 'Not implemented for DB2: getStatus()' );
+ return '';
+ }
/**
* Not implemented
* @return string $sql
- * @deprecated
- */
- public function limitResultForUpdate($sql, $num) { $this->installPrint('Not implemented for DB2: limitResultForUpdate()'); return $sql; }
-
+ */
+ public function limitResultForUpdate( $sql, $num ) {
+ $this->installPrint( 'Not implemented for DB2: limitResultForUpdate()' );
+ return $sql;
+ }
+
/**
* Only useful with fake prepare like in base Database class
* @return string
*/
- public function fillPreparedArg( $matches ) { $this->installPrint('Not useful for DB2: fillPreparedArg()'); return ''; }
-
+ public function fillPreparedArg( $matches ) {
+ $this->installPrint( 'Not useful for DB2: fillPreparedArg()' );
+ return '';
+ }
+
######################################
# Reflection
######################################
-
- /**
- * Query whether a given column exists in the mediawiki schema
- * @param $table String: name of the table
- * @param $field String: name of the column
- * @param $fname String: function name for logging and profiling
- */
- public function fieldExists( $table, $field, $fname = 'DatabaseIbm_db2::fieldExists' ) {
- $table = $this->tableName( $table );
- $schema = $this->mSchema;
- $etable = preg_replace("/'/", "''", $table);
- $eschema = preg_replace("/'/", "''", $schema);
- $ecol = preg_replace("/'/", "''", $field);
- $sql = <<<SQL
-SELECT 1 as fieldexists
-FROM sysibm.syscolumns sc
-WHERE sc.name='$ecol' AND sc.tbname='$etable' AND sc.tbcreator='$eschema'
-SQL;
- $res = $this->query( $sql, $fname );
- $count = $res ? $this->numRows($res) : 0;
- if ($res)
- $this->freeResult( $res );
- return $count;
- }
-
+
/**
* Returns information about an index
* If errors are explicitly ignored, returns NULL on failure
@@ -1569,22 +1401,28 @@ SQL;
* @param $fname String: function name for logging and profiling
* @return Object query row in object form
*/
- public function indexInfo( $table, $index, $fname = 'DatabaseIbm_db2::indexExists' ) {
+ public function indexInfo( $table, $index,
+ $fname = 'DatabaseIbm_db2::indexExists' )
+ {
$table = $this->tableName( $table );
$sql = <<<SQL
SELECT name as indexname
FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table' AND sc.tbcreator='$this->mSchema'
+WHERE si.name='$index' AND si.tbname='$table'
+AND sc.tbcreator='$this->mSchema'
SQL;
$res = $this->query( $sql, $fname );
if ( !$res ) {
return null;
}
$row = $this->fetchObject( $res );
- if ($row != null) return $row;
- else return false;
+ if ( $row != null ) {
+ return $row;
+ } else {
+ return false;
+ }
}
-
+
/**
* Returns an information object on a table column
* @param $table String: table name
@@ -1592,9 +1430,9 @@ SQL;
* @return IBM_DB2Field
*/
public function fieldInfo( $table, $field ) {
- return IBM_DB2Field::fromText($this, $table, $field);
+ return IBM_DB2Field::fromText( $this, $table, $field );
}
-
+
/**
* db2_field_type() wrapper
* @param $res Object: result of executed statement
@@ -1607,7 +1445,7 @@ SQL;
}
return db2_field_type( $res, $index );
}
-
+
/**
* Verifies that an index was created as unique
* @param $table String: table name
@@ -1615,25 +1453,28 @@ SQL;
* @param $fname function name for profiling
* @return Bool
*/
- public function indexUnique ($table, $index, $fname = 'Database::indexUnique' ) {
+ public function indexUnique ( $table, $index,
+ $fname = 'DatabaseIbm_db2::indexUnique' )
+ {
$table = $this->tableName( $table );
$sql = <<<SQL
SELECT si.name as indexname
FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table' AND sc.tbcreator='$this->mSchema'
-AND si.uniquerule IN ('U', 'P')
+WHERE si.name='$index' AND si.tbname='$table'
+AND sc.tbcreator='$this->mSchema'
+AND si.uniquerule IN ( 'U', 'P' )
SQL;
$res = $this->query( $sql, $fname );
if ( !$res ) {
return null;
}
- if ($this->fetchObject( $res )) {
+ if ( $this->fetchObject( $res ) ) {
return true;
}
return false;
}
-
+
/**
* Returns the size of a text field, or -1 for "unlimited"
* @param $table String: table name
@@ -1645,15 +1486,15 @@ SQL;
$sql = <<<SQL
SELECT length as size
FROM sysibm.syscolumns sc
-WHERE sc.name='$field' AND sc.tbname='$table' AND sc.tbcreator='$this->mSchema'
+WHERE sc.name='$field' AND sc.tbname='$table'
+AND sc.tbcreator='$this->mSchema'
SQL;
- $res = $this->query($sql);
- $row = $this->fetchObject($res);
+ $res = $this->query( $sql );
+ $row = $this->fetchObject( $res );
$size = $row->size;
- $this->freeResult( $res );
return $size;
}
-
+
/**
* DELETE where the condition is a join
* @param $delTable String: deleting from this table
@@ -1663,18 +1504,26 @@ SQL;
* @param $conds Array: conditionals for join table
* @param $fname String: function name for profiling
*/
- public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = "DatabaseIbm_db2::deleteJoin" ) {
+ public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar,
+ $conds, $fname = "DatabaseIbm_db2::deleteJoin" )
+ {
if ( !$conds ) {
- throw new DBUnexpectedError($this, 'Database::deleteJoin() called with empty $conds' );
+ throw new DBUnexpectedError( $this,
+ 'DatabaseIbm_db2::deleteJoin() called with empty $conds' );
}
$delTable = $this->tableName( $delTable );
$joinTable = $this->tableName( $joinTable );
- $sql = "DELETE FROM $delTable WHERE $delVar IN (SELECT $joinVar FROM $joinTable ";
+ $sql = <<<SQL
+DELETE FROM $delTable
+WHERE $delVar IN (
+ SELECT $joinVar FROM $joinTable
+
+SQL;
if ( $conds != '*' ) {
$sql .= 'WHERE ' . $this->makeList( $conds, LIST_AND );
}
- $sql .= ')';
+ $sql .= ' )';
$this->query( $sql, $fname );
}
@@ -1684,22 +1533,23 @@ SQL;
* @param $b Mixed: data to be encoded
* @return IBM_DB2Blob
*/
- public function encodeBlob($b) {
- return new IBM_DB2Blob($b);
+ public function encodeBlob( $b ) {
+ return new IBM_DB2Blob( $b );
}
-
+
/**
* Description is left as an exercise for the reader
* @param $b IBM_DB2Blob: data to be decoded
* @return mixed
*/
- public function decodeBlob($b) {
- return $b->getData();
+ public function decodeBlob( $b ) {
+ return "$b";
}
-
+
/**
* Convert into a list of string being concatenated
- * @param $stringList Array: strings that need to be joined together by the SQL engine
+ * @param $stringList Array: strings that need to be joined together
+ * by the SQL engine
* @return String: joined by the concatenation operator
*/
public function buildConcat( $stringList ) {
@@ -1707,7 +1557,7 @@ SQL;
// Sample query: VALUES 'foo' CONCAT 'bar' CONCAT 'baz'
return implode( ' || ', $stringList );
}
-
+
/**
* Generates the SQL required to convert a DB2 timestamp into a Unix epoch
* @param $column String: name of timestamp column
@@ -1717,11 +1567,11 @@ SQL;
// TODO
// see SpecialAncientpages
}
-
+
######################################
# Prepared statements
######################################
-
+
/**
* Intended to be compatible with the PEAR::DB wrapper functions.
* http://pear.php.net/manual/en/package.database.db.intro-execute.php
@@ -1735,7 +1585,7 @@ SQL;
* @return resource a prepared DB2 SQL statement
*/
public function prepare( $sql, $func = 'DB2::prepare' ) {
- $stmt = db2_prepare($this->mConn, $sql, $this->mStmtOptions);
+ $stmt = db2_prepare( $this->mConn, $sql, $this->mStmtOptions );
return $stmt;
}
@@ -1744,7 +1594,7 @@ SQL;
* @return Boolean success or failure
*/
public function freePrepared( $prepared ) {
- return db2_free_stmt($prepared);
+ return db2_free_stmt( $prepared );
}
/**
@@ -1759,7 +1609,10 @@ SQL;
$args = func_get_args();
array_shift( $args );
}
- $res = db2_execute($prepared, $args);
+ $res = db2_execute( $prepared, $args );
+ if ( !$res ) {
+ $this->installPrint( db2_stmt_errormsg() );
+ }
return $res;
}
@@ -1792,32 +1645,32 @@ SQL;
public function fillPrepared( $preparedQuery, $args ) {
reset( $args );
$this->preparedArgs =& $args;
-
- foreach ($args as $i => $arg) {
- db2_bind_param($preparedQuery, $i+1, $args[$i]);
+
+ foreach ( $args as $i => $arg ) {
+ db2_bind_param( $preparedQuery, $i+1, $args[$i] );
}
-
+
return $preparedQuery;
}
-
+
/**
* Switches module between regular and install modes
*/
- public function setMode($mode) {
- $old = $this->mMode;
+ public function setMode( $mode ) {
+ $old = $this->mMode;
$this->mMode = $mode;
return $old;
}
-
+
/**
* Bitwise negation of a column or value in SQL
* Same as (~field) in C
* @param $field String
* @return String
*/
- function bitNot($field) {
- //expecting bit-fields smaller than 4bytes
- return 'BITNOT('.$bitField.')';
+ function bitNot( $field ) {
+ // expecting bit-fields smaller than 4bytes
+ return "BITNOT( $field )";
}
/**
@@ -1827,8 +1680,8 @@ SQL;
* @param $fieldRight String
* @return String
*/
- function bitAnd($fieldLeft, $fieldRight) {
- return 'BITAND('.$fieldLeft.', '.$fieldRight.')';
+ function bitAnd( $fieldLeft, $fieldRight ) {
+ return "BITAND( $fieldLeft, $fieldRight )";
}
/**
@@ -1838,7 +1691,17 @@ SQL;
* @param $fieldRight String
* @return String
*/
- function bitOr($fieldLeft, $fieldRight) {
- return 'BITOR('.$fieldLeft.', '.$fieldRight.')';
+ function bitOr( $fieldLeft, $fieldRight ) {
+ return "BITOR( $fieldLeft, $fieldRight )";
+ }
+}
+
+class IBM_DB2Helper {
+ public static function makeArray( $maybeArray ) {
+ if ( !is_array( $maybeArray ) ) {
+ return array( $maybeArray );
+ }
+
+ return $maybeArray;
}
}
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
index 6b1206b0..41ba2d08 100644
--- a/includes/db/DatabaseMssql.php
+++ b/includes/db/DatabaseMssql.php
@@ -1,968 +1,1226 @@
<?php
/**
- * This script is the MSSQL Server database abstraction layer
+ * This is the MS SQL Server Native database abstraction layer.
*
- * See maintenance/mssql/README for development notes and other specific information
- * @ingroup Database
* @file
+ * @ingroup Database
+ * @author Joel Penner <a-joelpe at microsoft dot com>
+ * @author Chris Pucci <a-cpucci at microsoft dot com>
+ * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
*/
/**
* @ingroup Database
*/
class DatabaseMssql extends DatabaseBase {
+ var $mInsertId = NULL;
+ var $mLastResult = NULL;
+ var $mAffectedRows = NULL;
- var $mAffectedRows;
- var $mLastResult;
- var $mLastError;
- var $mLastErrorNo;
- var $mDatabaseFile;
-
- /**
- * Constructor
- */
- function __construct($server = false, $user = false, $password = false, $dbName = false,
- $failFunction = false, $flags = 0, $tablePrefix = 'get from global') {
-
- global $wgOut, $wgDBprefix, $wgCommandLineMode;
- if (!isset($wgOut)) $wgOut = null; # Can't get a reference if it hasn't been set yet
- $this->mOut =& $wgOut;
- $this->mFailFunction = $failFunction;
- $this->mFlags = $flags;
-
- if ( $this->mFlags & DBO_DEFAULT ) {
- if ( $wgCommandLineMode ) {
- $this->mFlags &= ~DBO_TRX;
- } else {
- $this->mFlags |= DBO_TRX;
- }
- }
-
- /** Get the default table prefix*/
- $this->mTablePrefix = $tablePrefix == 'get from global' ? $wgDBprefix : $tablePrefix;
-
- if ($server) $this->open($server, $user, $password, $dbName);
-
+ function cascadingDeletes() {
+ return true;
}
-
- function getType() {
- return 'mssql';
+ function cleanupTriggers() {
+ return true;
+ }
+ function strictIPs() {
+ return true;
+ }
+ function realTimestamps() {
+ return true;
+ }
+ function implicitGroupby() {
+ return false;
+ }
+ function implicitOrderby() {
+ return false;
+ }
+ function functionalIndexes() {
+ return true;
+ }
+ function unionSupportsOrderAndLimit() {
+ return false;
}
- /**
- * todo: check if these should be true like parent class
- */
- function implicitGroupby() { return false; }
- function implicitOrderby() { return false; }
-
- static function newFromParams($server, $user, $password, $dbName, $failFunction = false, $flags = 0) {
- return new DatabaseMssql($server, $user, $password, $dbName, $failFunction, $flags);
+ static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
+ return new DatabaseMssql( $server, $user, $password, $dbName, $flags );
}
- /** Open an MSSQL database and return a resource handle to it
- * NOTE: only $dbName is used, the other parameters are irrelevant for MSSQL databases
+ /**
+ * Usually aborts on failure
*/
- function open($server,$user,$password,$dbName) {
- wfProfileIn(__METHOD__);
-
- # Test for missing mysql.so
- # First try to load it
- if (!@extension_loaded('mssql')) {
- @dl('mssql.so');
+ function open( $server, $user, $password, $dbName ) {
+ # Test for driver support, to avoid suppressed fatal error
+ if ( !function_exists( 'sqlsrv_connect' ) ) {
+ throw new DBConnectionError( $this, "MS Sql Server Native (sqlsrv) functions missing. You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n" );
}
- # Fail now
- # Otherwise we get a suppressed fatal error, which is very hard to track down
- if (!function_exists( 'mssql_connect')) {
- throw new DBConnectionError( $this, "MSSQL functions missing, have you compiled PHP with the --with-mssql option?\n" );
+ global $wgDBport;
+
+ if ( !strlen( $user ) ) { # e.g. the class is being loaded
+ return;
}
$this->close();
- $this->mServer = $server;
- $this->mUser = $user;
+ $this->mServer = $server;
+ $this->mPort = $wgDBport;
+ $this->mUser = $user;
$this->mPassword = $password;
- $this->mDBname = $dbName;
-
- wfProfileIn("dbconnect-$server");
-
- # Try to connect up to three times
- # The kernel's default SYN retransmission period is far too slow for us,
- # so we use a short timeout plus a manual retry.
- $this->mConn = false;
- $max = 3;
- for ( $i = 0; $i < $max && !$this->mConn; $i++ ) {
- if ( $i > 1 ) {
- usleep( 1000 );
- }
- if ($this->mFlags & DBO_PERSISTENT) {
- @/**/$this->mConn = mssql_pconnect($server, $user, $password);
- } else {
- # Create a new connection...
- @/**/$this->mConn = mssql_connect($server, $user, $password, true);
- }
+ $this->mDBname = $dbName;
+
+ $connectionInfo = array();
+
+ if( $dbName ) {
+ $connectionInfo['Database'] = $dbName;
}
-
- wfProfileOut("dbconnect-$server");
-
- if ($dbName != '') {
- if ($this->mConn !== false) {
- $success = @/**/mssql_select_db($dbName, $this->mConn);
- if (!$success) {
- $error = "Error selecting database $dbName on server {$this->mServer} " .
- "from client host " . wfHostname() . "\n";
- wfLogDBError(" Error selecting database $dbName on server {$this->mServer} \n");
- wfDebug( $error );
- }
- } else {
- wfDebug("DB connection error\n");
- wfDebug("Server: $server, User: $user, Password: ".substr($password, 0, 3)."...\n");
- $success = false;
- }
+
+ // Start NT Auth Hack
+ // Quick and dirty work around to provide NT Auth designation support.
+ // Current solution requires installer to know to input 'ntauth' for both username and password
+ // to trigger connection via NT Auth. - ugly, ugly, ugly
+ // TO-DO: Make this better and add NT Auth choice to MW installer when SQL Server option is chosen.
+ $ntAuthUserTest = strtolower( $user );
+ $ntAuthPassTest = strtolower( $password );
+
+ // Decide which auth scenerio to use
+ if( ( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) ){
+ // Don't add credentials to $connectionInfo
} else {
- # Delay USE query
- $success = (bool)$this->mConn;
+ $connectionInfo['UID'] = $user;
+ $connectionInfo['PWD'] = $password;
+ }
+ // End NT Auth Hack
+
+ $this->mConn = @sqlsrv_connect( $server, $connectionInfo );
+
+ if ( $this->mConn === false ) {
+ wfDebug( "DB connection error\n" );
+ wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
+ wfDebug( $this->lastError() . "\n" );
+ return false;
}
- if (!$success) $this->reportConnectionError();
- $this->mOpened = $success;
- wfProfileOut(__METHOD__);
- return $success;
+ $this->mOpened = true;
+ return $this->mConn;
}
/**
- * Close an MSSQL database
+ * Closes a database connection, if it is open
+ * Returns success, true if already closed
*/
function close() {
$this->mOpened = false;
- if ($this->mConn) {
- if ($this->trxLevel()) $this->commit();
- return mssql_close($this->mConn);
- } else return true;
+ if ( $this->mConn ) {
+ return sqlsrv_close( $this->mConn );
+ } else {
+ return true;
+ }
}
- /**
- * - MSSQL doesn't seem to do buffered results
- * - the trasnaction syntax is modified here to avoid having to replicate
- * Database::query which uses BEGIN, COMMIT, ROLLBACK
- */
- function doQuery($sql) {
- if ($sql == 'BEGIN' || $sql == 'COMMIT' || $sql == 'ROLLBACK') return true; # $sql .= ' TRANSACTION';
- $sql = preg_replace('|[^\x07-\x7e]|','?',$sql); # TODO: need to fix unicode - just removing it here while testing
- $ret = mssql_query($sql, $this->mConn);
- if ($ret === false) {
- $err = mssql_get_last_message();
- if ($err) $this->mlastError = $err;
- $row = mssql_fetch_row(mssql_query('select @@ERROR'));
- if ($row[0]) $this->mlastErrorNo = $row[0];
- } else $this->mlastErrorNo = false;
- return $ret;
+ function doQuery( $sql ) {
+ wfDebug( "SQL: [$sql]\n" );
+ $this->offset = 0;
+
+ // several extensions seem to think that all databases support limits via LIMIT N after the WHERE clause
+ // well, MSSQL uses SELECT TOP N, so to catch any of those extensions we'll do a quick check for a LIMIT
+ // clause and pass $sql through $this->LimitToTopN() which parses the limit clause and passes the result to
+ // $this->limitResult();
+ if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
+ // massage LIMIT -> TopN
+ $sql = $this->LimitToTopN( $sql ) ;
+ }
+
+ // MSSQL doesn't have EXTRACT(epoch FROM XXX)
+ if ( preg_match('#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+ // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
+ $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
+ }
+
+ // perform query
+ $stmt = sqlsrv_query( $this->mConn, $sql );
+ if ( $stmt == false ) {
+ $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
+ "Query: " . htmlentities( $sql ) . "\n" .
+ "Function: " . __METHOD__ . "\n";
+ // process each error (our driver will give us an array of errors unlike other providers)
+ foreach ( sqlsrv_errors() as $error ) {
+ $message .= $message . "ERROR[" . $error['code'] . "] " . $error['message'] . "\n";
+ }
+
+ throw new DBUnexpectedError( $this, $message );
+ }
+ // remember number of rows affected
+ $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
+
+ // if it is a SELECT statement, or an insert with a request to output something we want to return a row.
+ if ( ( preg_match( '#\bSELECT\s#i', $sql ) ) ||
+ ( preg_match( '#\bINSERT\s#i', $sql ) && preg_match( '#\bOUTPUT\s+INSERTED\b#i', $sql ) ) ) {
+ // this is essentially a rowset, but Mediawiki calls these 'result'
+ // the rowset owns freeing the statement
+ $res = new MssqlResult( $stmt );
+ } else {
+ // otherwise we simply return it was successful, failure throws an exception
+ $res = true;
+ }
+ return $res;
}
- /**
- * Free a result object
- */
function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- if ( !@/**/mssql_free_result( $res ) ) {
- throw new DBUnexpectedError( $this, "Unable to free MSSQL result" );
- }
+ $res->free();
}
- /**
- * Fetch the next row from the given result object, in object form.
- * Fields can be retrieved with $row->fieldname, with fields acting like
- * member variables.
- *
- * @param $res SQL result object as returned from Database::query(), etc.
- * @return MySQL row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- @/**/$row = mssql_fetch_object( $res );
- if ( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
- }
+ $row = $res->fetch( 'OBJECT' );
return $row;
}
- /**
- * Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
- *
- * @param $res SQL result object as returned from Database::query(), etc.
- * @return MySQL row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- function fetchRow( $res ) {
+ function getErrors() {
+ $strRet = '';
+ $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
+ if ( $retErrors != null ) {
+ foreach ( $retErrors as $arrError ) {
+ $strRet .= "SQLState: " . $arrError[ 'SQLSTATE'] . "\n";
+ $strRet .= "Error Code: " . $arrError[ 'code'] . "\n";
+ $strRet .= "Message: " . $arrError[ 'message'] . "\n";
+ }
+ } else {
+ $strRet = "No errors found";
+ }
+ return $strRet;
+ }
+
+ function fetchRow( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- @/**/$row = mssql_fetch_array( $res );
- if ( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
- }
+ $row = $res->fetch( SQLSRV_FETCH_BOTH );
return $row;
}
- /**
- * Get the number of rows in a result object
- */
function numRows( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- @/**/$n = mssql_num_rows( $res );
- if ( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in numRows(): ' . htmlspecialchars( $this->lastError() ) );
- }
- return $n;
+ return ( $res ) ? $res->numrows() : 0;
}
- /**
- * Get the number of fields in a result object
- * See documentation for mysql_num_fields()
- * @param $res SQL result object as returned from Database::query(), etc.
- */
function numFields( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- return mssql_num_fields( $res );
+ return ( $res ) ? $res->numfields() : 0;
}
- /**
- * Get a field name in a result object
- * See documentation for mysql_field_name():
- * http://www.php.net/mysql_field_name
- * @param $res SQL result object as returned from Database::query(), etc.
- * @param $n Int
- */
function fieldName( $res, $n ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- return mssql_field_name( $res, $n );
+ return ( $res ) ? $res->fieldname( $n ) : 0;
}
/**
- * Get the inserted value of an auto-increment row
- *
- * The value inserted should be fetched from nextSequenceValue()
- *
- * Example:
- * $id = $dbw->nextSequenceValue('page_page_id_seq');
- * $dbw->insert('page',array('page_id' => $id));
- * $id = $dbw->insertId();
+ * This must be called after nextSequenceVal
*/
function insertId() {
- $row = mssql_fetch_row(mssql_query('select @@IDENTITY'));
- return $row[0];
+ return $this->mInsertId;
}
- /**
- * Change the position of the cursor in a result object
- * See mysql_data_seek()
- * @param $res SQL result object as returned from Database::query(), etc.
- * @param $row Database row
- */
function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
- return mssql_data_seek( $res, $row );
+ return ( $res ) ? $res->seek( $row ) : false;
}
- /**
- * Get the last error number
- */
- function lastErrno() {
- return $this->mlastErrorNo;
+ function lastError() {
+ if ( $this->mConn ) {
+ return $this->getErrors();
+ }
+ else {
+ return "No database connection";
+ }
}
- /**
- * Get a description of the last error
- */
- function lastError() {
- return $this->mlastError;
+ function lastErrno() {
+ $err = sqlsrv_errors( SQLSRV_ERR_ALL );
+ if ( $err[0] ) return $err[0]['code'];
+ else return 0;
}
- /**
- * Get the number of rows affected by the last write query
- */
function affectedRows() {
- return mssql_rows_affected( $this->mConn );
+ return $this->mAffectedRows;
}
/**
- * Simple UPDATE wrapper
- * Usually aborts on failure
- * If errors are explicitly ignored, returns success
+ * SELECT wrapper
*
- * This function exists for historical reasons, Database::update() has a more standard
- * calling convention and feature set
+ * @param $table Mixed: array or string, table name(s) (prefix auto-added)
+ * @param $vars Mixed: array or string, field name(s) to be retrieved
+ * @param $conds Mixed: array or string, condition(s) for WHERE
+ * @param $fname String: calling function name (use __METHOD__) for logs/profiling
+ * @param $options Array: associative array of options (e.g. array('GROUP BY' => 'page_title')),
+ * see Database::makeSelectOptions code for list of supported stuff
+ * @param $join_conds Array: Associative array of table join conditions (optional)
+ * (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+ * @return Mixed: database result resource (feed to Database::fetchObject or whatever), or false on failure
*/
- function set( $table, $var, $value, $cond, $fname = 'Database::set' )
+ function select( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() )
{
- if ($value == "NULL") $value = "''"; # see comments in makeListWithoutNulls()
- $table = $this->tableName( $table );
- $sql = "UPDATE $table SET $var = '" .
- $this->strencode( $value ) . "' WHERE ($cond)";
- return (bool)$this->query( $sql, $fname );
- }
-
- /**
- * Simple SELECT wrapper, returns a single field, input must be encoded
- * Usually aborts on failure
- * If errors are explicitly ignored, returns FALSE on failure
- */
- function selectField( $table, $var, $cond='', $fname = 'Database::selectField', $options = array() ) {
- if ( !is_array( $options ) ) {
- $options = array( $options );
- }
- $options['LIMIT'] = 1;
-
- $res = $this->select( $table, $var, $cond, $fname, $options );
- if ( $res === false || !$this->numRows( $res ) ) {
- return false;
- }
- $row = $this->fetchRow( $res );
- if ( $row !== false ) {
- $this->freeResult( $res );
- return $row[0];
- } else {
- return false;
- }
- }
-
- /**
- * Returns an optional USE INDEX clause to go after the table, and a
- * string to go at the end of the query
- *
- * @private
- *
- * @param $options Array: an associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
- * @return array
- */
- function makeSelectOptions( $options ) {
- $preLimitTail = $postLimitTail = '';
- $startOpts = '';
-
- $noKeyOptions = array();
- foreach ( $options as $key => $option ) {
- if ( is_numeric( $key ) ) {
- $noKeyOptions[$option] = true;
- }
- }
-
- if ( isset( $options['GROUP BY'] ) ) $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
- if ( isset( $options['HAVING'] ) ) $preLimitTail .= " HAVING {$options['HAVING']}";
- if ( isset( $options['ORDER BY'] ) ) $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
-
- //if (isset($options['LIMIT'])) {
- // $tailOpts .= $this->limitResult('', $options['LIMIT'],
- // isset($options['OFFSET']) ? $options['OFFSET']
- // : false);
- //}
-
- if ( isset( $noKeyOptions['FOR UPDATE'] ) ) $postLimitTail .= ' FOR UPDATE';
- if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) $postLimitTail .= ' LOCK IN SHARE MODE';
- if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
-
- # Various MySQL extensions
- if ( isset( $noKeyOptions['STRAIGHT_JOIN'] ) ) $startOpts .= ' /*! STRAIGHT_JOIN */';
- if ( isset( $noKeyOptions['HIGH_PRIORITY'] ) ) $startOpts .= ' HIGH_PRIORITY';
- if ( isset( $noKeyOptions['SQL_BIG_RESULT'] ) ) $startOpts .= ' SQL_BIG_RESULT';
- if ( isset( $noKeyOptions['SQL_BUFFER_RESULT'] ) ) $startOpts .= ' SQL_BUFFER_RESULT';
- if ( isset( $noKeyOptions['SQL_SMALL_RESULT'] ) ) $startOpts .= ' SQL_SMALL_RESULT';
- if ( isset( $noKeyOptions['SQL_CALC_FOUND_ROWS'] ) ) $startOpts .= ' SQL_CALC_FOUND_ROWS';
- if ( isset( $noKeyOptions['SQL_CACHE'] ) ) $startOpts .= ' SQL_CACHE';
- if ( isset( $noKeyOptions['SQL_NO_CACHE'] ) ) $startOpts .= ' SQL_NO_CACHE';
-
- if ( isset( $options['USE INDEX'] ) && ! is_array( $options['USE INDEX'] ) ) {
- $useIndex = $this->useIndexClause( $options['USE INDEX'] );
- } else {
- $useIndex = '';
+ $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+ if ( isset( $options['EXPLAIN'] ) ) {
+ sqlsrv_query( $this->mConn, "SET SHOWPLAN_ALL ON;" );
+ $ret = $this->query( $sql, $fname );
+ sqlsrv_query( $this->mConn, "SET SHOWPLAN_ALL OFF;" );
+ return $ret;
}
-
- return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
+ return $this->query( $sql, $fname );
}
/**
* SELECT wrapper
*
- * @param $table Mixed: Array or string, table name(s) (prefix auto-added)
- * @param $vars Mixed: Array or string, field name(s) to be retrieved
- * @param $conds Mixed: Array or string, condition(s) for WHERE
+ * @param $table Mixed: Array or string, table name(s) (prefix auto-added)
+ * @param $vars Mixed: Array or string, field name(s) to be retrieved
+ * @param $conds Mixed: Array or string, condition(s) for WHERE
* @param $fname String: Calling function name (use __METHOD__) for logs/profiling
- * @param $options Array: Associative array of options (e.g. array('GROUP BY' => 'page_title')),
- * see Database::makeSelectOptions code for list of supported stuff
- * @return mixed Database result resource (feed to Database::fetchObject or whatever), or false on failure
+ * @param $options Array: Associative array of options (e.g. array('GROUP BY' => 'page_title')),
+ * see Database::makeSelectOptions code for list of supported stuff
+ * @param $join_conds Array: Associative array of table join conditions (optional)
+ * (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+ * @return string, the SQL text
*/
- function select( $table, $vars, $conds='', $fname = 'Database::select', $options = array() )
- {
- if( is_array( $vars ) ) {
- $vars = implode( ',', $vars );
- }
- if( !is_array( $options ) ) {
- $options = array( $options );
- }
- if( is_array( $table ) ) {
- if ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
- $from = ' FROM ' . $this->tableNamesWithUseIndex( $table, $options['USE INDEX'] );
- else
- $from = ' FROM ' . implode( ',', array_map( array( &$this, 'tableName' ), $table ) );
- } elseif ($table!='') {
- if ($table{0}==' ') {
- $from = ' FROM ' . $table;
- } else {
- $from = ' FROM ' . $this->tableName( $table );
- }
- } else {
- $from = '';
- }
-
- list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) = $this->makeSelectOptions( $options );
-
- if( !empty( $conds ) ) {
- if ( is_array( $conds ) ) {
- $conds = $this->makeList( $conds, LIST_AND );
- }
- $sql = "SELECT $startOpts $vars $from $useIndex WHERE $conds $preLimitTail";
- } else {
- $sql = "SELECT $startOpts $vars $from $useIndex $preLimitTail";
- }
-
- if (isset($options['LIMIT']))
- $sql = $this->limitResult($sql, $options['LIMIT'],
- isset($options['OFFSET']) ? $options['OFFSET'] : false);
- $sql = "$sql $postLimitTail";
-
- if (isset($options['EXPLAIN'])) {
- $sql = 'EXPLAIN ' . $sql;
+ function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() ) {
+ if ( isset( $options['EXPLAIN'] ) ) {
+ unset( $options['EXPLAIN'] );
}
- return $this->query( $sql, $fname );
+ return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
}
/**
- * Determines whether a field exists in a table
- * Usually aborts on failure
- * If errors are explicitly ignored, returns NULL on failure
+ * Estimate rows in dataset
+ * Returns estimated count, based on SHOWPLAN_ALL output
+ * This is not necessarily an accurate estimate, so use sparingly
+ * Returns -1 if count cannot be found
+ * Takes same arguments as Database::select()
*/
- function fieldExists( $table, $field, $fname = 'Database::fieldExists' ) {
- $table = $this->tableName( $table );
- $sql = "SELECT TOP 1 * FROM $table";
- $res = $this->query( $sql, 'Database::fieldExists' );
-
- $found = false;
- while ( $row = $this->fetchArray( $res ) ) {
- if ( isset($row[$field]) ) {
- $found = true;
- break;
- }
+ function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMssql::estimateRowCount', $options = array() ) {
+ $options['EXPLAIN'] = true;// http://msdn2.microsoft.com/en-us/library/aa259203.aspx
+ $res = $this->select( $table, $vars, $conds, $fname, $options );
+
+ $rows = -1;
+ if ( $res ) {
+ $row = $this->fetchRow( $res );
+ if ( isset( $row['EstimateRows'] ) ) $rows = $row['EstimateRows'];
}
-
- $this->freeResult( $res );
- return $found;
+ return $rows;
}
+
/**
- * Get information about an index into an object
- * Returns false if the index does not exist
+ * Returns information about an index
+ * If errors are explicitly ignored, returns NULL on failure
*/
- function indexInfo( $table, $index, $fname = 'Database::indexInfo' ) {
-
- throw new DBUnexpectedError( $this, 'Database::indexInfo called which is not supported yet' );
- return null;
-
- $table = $this->tableName( $table );
- $sql = 'SHOW INDEX FROM '.$table;
+ function indexInfo( $table, $index, $fname = 'DatabaseMssql::indexExists' ) {
+ # This does not return the same info as MYSQL would, but that's OK because MediaWiki never uses the
+ # returned value except to check for the existance of indexes.
+ $sql = "sp_helpindex '" . $table . "'";
$res = $this->query( $sql, $fname );
if ( !$res ) {
- return null;
+ return NULL;
}
$result = array();
- while ( $row = $this->fetchObject( $res ) ) {
- if ( $row->Key_name == $index ) {
- $result[] = $row;
- }
- }
- $this->freeResult($res);
-
- return empty($result) ? false : $result;
- }
-
- /**
- * Query whether a given table exists
- */
- function tableExists( $table ) {
- $table = $this->tableName( $table );
- $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '$table'" );
- $exist = ($res->numRows() > 0);
- $this->freeResult($res);
- return $exist;
- }
-
- /**
- * mysql_fetch_field() wrapper
- * Returns false if the field doesn't exist
- *
- * @param $table
- * @param $field
- */
- function fieldInfo( $table, $field ) {
- $table = $this->tableName( $table );
- $res = $this->query( "SELECT TOP 1 * FROM $table" );
- $n = mssql_num_fields( $res->result );
- for( $i = 0; $i < $n; $i++ ) {
- $meta = mssql_fetch_field( $res->result, $i );
- if( $field == $meta->name ) {
- return new MSSQLField($meta);
+ foreach ( $res as $row ) {
+ if ( $row->index_name == $index ) {
+ $row->Non_unique = !stristr( $row->index_description, "unique" );
+ $cols = explode( ", ", $row->index_keys );
+ foreach ( $cols as $col ) {
+ $row->Column_name = trim( $col );
+ $result[] = clone $row;
+ }
+ } else if ( $index == 'PRIMARY' && stristr( $row->index_description, 'PRIMARY' ) ) {
+ $row->Non_unique = 0;
+ $cols = explode( ", ", $row->index_keys );
+ foreach ( $cols as $col ) {
+ $row->Column_name = trim( $col );
+ $result[] = clone $row;
+ }
}
}
- return false;
- }
-
- /**
- * mysql_field_type() wrapper
- */
- function fieldType( $res, $index ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- return mssql_field_type( $res, $index );
+ return empty( $result ) ? false : $result;
}
/**
* INSERT wrapper, inserts an array into a table
*
- * $a may be a single associative array, or an array of these with numeric keys, for
+ * $arrToInsert may be a single associative array, or an array of these with numeric keys, for
* multi-row insert.
*
* Usually aborts on failure
* If errors are explicitly ignored, returns success
- *
- * Same as parent class implementation except that it removes primary key from column lists
- * because MSSQL doesn't support writing nulls to IDENTITY (AUTO_INCREMENT) columns
*/
- function insert( $table, $a, $fname = 'Database::insert', $options = array() ) {
+ function insert( $table, $arrToInsert, $fname = 'DatabaseMssql::insert', $options = array() ) {
# No rows to insert, easy just return now
- if ( !count( $a ) ) {
+ if ( !count( $arrToInsert ) ) {
return true;
}
- $table = $this->tableName( $table );
+
if ( !is_array( $options ) ) {
$options = array( $options );
}
-
- # todo: need to record primary keys at table create time, and remove NULL assignments to them
- if ( isset( $a[0] ) && is_array( $a[0] ) ) {
- $multi = true;
- $keys = array_keys( $a[0] );
-# if (ereg('_id$',$keys[0])) {
- foreach ($a as $i) {
- if (is_null($i[$keys[0]])) unset($i[$keys[0]]); # remove primary-key column from multiple insert lists if empty value
- }
-# }
- $keys = array_keys( $a[0] );
- } else {
- $multi = false;
- $keys = array_keys( $a );
-# if (ereg('_id$',$keys[0]) && empty($a[$keys[0]])) unset($a[$keys[0]]); # remove primary-key column from insert list if empty value
- if (is_null($a[$keys[0]])) unset($a[$keys[0]]); # remove primary-key column from insert list if empty value
- $keys = array_keys( $a );
+
+ $table = $this->tableName( $table );
+
+ if ( !( isset( $arrToInsert[0] ) && is_array( $arrToInsert[0] ) ) ) {// Not multi row
+ $arrToInsert = array( 0 => $arrToInsert );// make everything multi row compatible
}
- # handle IGNORE option
- # example:
- # MySQL: INSERT IGNORE INTO user_groups (ug_user,ug_group) VALUES ('1','sysop')
- # MSSQL: IF NOT EXISTS (SELECT * FROM user_groups WHERE ug_user = '1') INSERT INTO user_groups (ug_user,ug_group) VALUES ('1','sysop')
- $ignore = in_array('IGNORE',$options);
-
- # remove IGNORE from options list
- if ($ignore) {
- $oldoptions = $options;
- $options = array();
- foreach ($oldoptions as $o) if ($o != 'IGNORE') $options[] = $o;
- }
-
- $keylist = implode(',', $keys);
- $sql = 'INSERT '.implode(' ', $options)." INTO $table (".implode(',', $keys).') VALUES ';
- if ($multi) {
- if ($ignore) {
- # If multiple and ignore, then do each row as a separate conditional insert
- foreach ($a as $row) {
- $prival = $row[$keys[0]];
- $sql = "IF NOT EXISTS (SELECT * FROM $table WHERE $keys[0] = '$prival') $sql";
- if (!$this->query("$sql (".$this->makeListWithoutNulls($row).')', $fname)) return false;
+ $allOk = true;
+
+
+ // We know the table we're inserting into, get its identity column
+ $identity = null;
+ $tableRaw = preg_replace( '#\[([^\]]*)\]#', '$1', $table ); // strip matching square brackets from table name
+ $res = $this->doQuery( "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'" );
+ if( $res && $res->numrows() ){
+ // There is an identity for this table.
+ $identity = array_pop( $res->fetch( SQLSRV_FETCH_ASSOC ) );
+ }
+ unset( $res );
+
+ foreach ( $arrToInsert as $a ) {
+ // start out with empty identity column, this is so we can return it as a result of the insert logic
+ $sqlPre = '';
+ $sqlPost = '';
+ $identityClause = '';
+
+ // if we have an identity column
+ if( $identity ) {
+ // iterate through
+ foreach ($a as $k => $v ) {
+ if ( $k == $identity ) {
+ if( !is_null($v) ){
+ // there is a value being passed to us, we need to turn on and off inserted identity
+ $sqlPre = "SET IDENTITY_INSERT $table ON;" ;
+ $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
+
+ } else {
+ // we can't insert NULL into an identity column, so remove the column from the insert.
+ unset( $a[$k] );
+ }
+ }
}
- return true;
- } else {
- $first = true;
- foreach ($a as $row) {
- if ($first) $first = false; else $sql .= ',';
- $sql .= '('.$this->makeListWithoutNulls($row).')';
+ $identityClause = "OUTPUT INSERTED.$identity "; // we want to output an identity column as result
+ }
+
+ $keys = array_keys( $a );
+
+
+ // INSERT IGNORE is not supported by SQL Server
+ // remove IGNORE from options list and set ignore flag to true
+ $ignoreClause = false;
+ foreach ( $options as $k => $v ) {
+ if ( strtoupper( $v ) == "IGNORE" ) {
+ unset( $options[$k] );
+ $ignoreClause = true;
}
}
- } else {
- if ($ignore) {
+
+ // translate MySQL INSERT IGNORE to something SQL Server can use
+ // example:
+ // MySQL: INSERT IGNORE INTO user_groups (ug_user,ug_group) VALUES ('1','sysop')
+ // MSSQL: IF NOT EXISTS (SELECT * FROM user_groups WHERE ug_user = '1') INSERT INTO user_groups (ug_user,ug_group) VALUES ('1','sysop')
+ if ( $ignoreClause == true ) {
$prival = $a[$keys[0]];
- $sql = "IF NOT EXISTS (SELECT * FROM $table WHERE $keys[0] = '$prival') $sql";
+ $sqlPre .= "IF NOT EXISTS (SELECT * FROM $table WHERE $keys[0] = '$prival')";
+ }
+
+ // Build the actual query
+ $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
+ " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
+
+ $first = true;
+ foreach ( $a as $value ) {
+ if ( $first ) {
+ $first = false;
+ } else {
+ $sql .= ',';
+ }
+ if ( is_string( $value ) ) {
+ $sql .= $this->addIdentifierQuotes( $value );
+ } elseif ( is_null( $value ) ) {
+ $sql .= 'null';
+ } elseif ( is_array( $value ) || is_object( $value ) ) {
+ if ( is_object( $value ) && strtolower( get_class( $value ) ) == 'blob' ) {
+ $sql .= $this->addIdentifierQuotes( $value->fetch() );
+ } else {
+ $sql .= $this->addIdentifierQuotes( serialize( $value ) );
+ }
+ } else {
+ $sql .= $value;
+ }
}
- $sql .= '('.$this->makeListWithoutNulls($a).')';
+ $sql .= ')' . $sqlPost;
+
+ // Run the query
+ $ret = sqlsrv_query( $this->mConn, $sql );
+
+ if ( $ret === false ) {
+ throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), $sql, $fname );
+ } elseif ( $ret != NULL ) {
+ // remember number of rows affected
+ $this->mAffectedRows = sqlsrv_rows_affected( $ret );
+ if ( !is_null($identity) ) {
+ // then we want to get the identity column value we were assigned and save it off
+ $row = sqlsrv_fetch_object( $ret );
+ $this->mInsertId = $row->$identity;
+ }
+ sqlsrv_free_stmt( $ret );
+ continue;
+ }
+ $allOk = false;
}
- return (bool)$this->query( $sql, $fname );
+ return $allOk;
}
/**
- * MSSQL doesn't allow implicit casting of NULL's into non-null values for NOT NULL columns
- * for now I've just converted the NULL's in the lists for updates and inserts into empty strings
- * which get implicitly casted to 0 for numeric columns
- * NOTE: the set() method above converts NULL to empty string as well but not via this method
+ * INSERT SELECT wrapper
+ * $varMap must be an associative array of the form array( 'dest1' => 'source1', ...)
+ * Source items may be literals rather than field names, but strings should be quoted with Database::addQuotes()
+ * $conds may be "*" to copy the whole table
+ * srcTable may be an array of tables.
*/
- function makeListWithoutNulls($a, $mode = LIST_COMMA) {
- return str_replace("NULL","''",$this->makeList($a,$mode));
+ function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
+ $insertOptions = array(), $selectOptions = array() )
+ {
+ $ret = parent::insertSelect( $destTable, $srcTable, $varMap, $conds, $fname, $insertOptions, $selectOptions );
+
+ if ( $ret === false ) {
+ throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), $sql, $fname );
+ } elseif ( $ret != NULL ) {
+ // remember number of rows affected
+ $this->mAffectedRows = sqlsrv_rows_affected( $ret );
+ return $ret;
+ }
+ return NULL;
}
/**
- * UPDATE wrapper, takes a condition array and a SET array
+ * Format a table name ready for use in constructing an SQL query
+ *
+ * This does two important things: it brackets table names which as necessary,
+ * and it adds a table prefix if there is one.
*
- * @param $table String: The table to UPDATE
- * @param $values Array: An array of values to SET
- * @param $conds Array: An array of conditions (WHERE). Use '*' to update all rows.
- * @param $fname String: The Class::Function calling this function
- * (for the log)
- * @param $options Array: An array of UPDATE options, can be one or
- * more of IGNORE, LOW_PRIORITY
- * @return bool
+ * All functions of this object which require a table name call this function
+ * themselves. Pass the canonical name to such functions. This is only needed
+ * when calling query() directly.
+ *
+ * @param $name String: database table name
*/
- function update( $table, $values, $conds, $fname = 'Database::update', $options = array() ) {
- $table = $this->tableName( $table );
- $opts = $this->makeUpdateOptions( $options );
- $sql = "UPDATE $opts $table SET " . $this->makeListWithoutNulls( $values, LIST_SET );
- if ( $conds != '*' ) {
- $sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
+ function tableName( $name ) {
+ global $wgSharedDB;
+ # Skip quoted literals
+ if ( $name != '' && $name { 0 } != '[' ) {
+ if ( $this->mTablePrefix !== '' && strpos( '.', $name ) === false ) {
+ $name = "{$this->mTablePrefix}$name";
+ }
+ if ( isset( $wgSharedDB ) && "{$this->mTablePrefix}user" == $name ) {
+ $name = "[$wgSharedDB].[$name]";
+ } else {
+ # Standard quoting
+ if ( $name != '' ) $name = "[$name]";
+ }
}
- return $this->query( $sql, $fname );
+ return $name;
}
/**
- * Make UPDATE options for the Database::update function
- *
- * @private
- * @param $options Array: The options passed to Database::update
- * @return string
+ * Return the next in a sequence, save the value for retrieval via insertId()
*/
- function makeUpdateOptions( $options ) {
- if( !is_array( $options ) ) {
- $options = array( $options );
+ function nextSequenceValue( $seqName ) {
+ if ( !$this->tableExists( 'sequence_' . $seqName ) ) {
+ sqlsrv_query( $this->mConn, "CREATE TABLE [sequence_$seqName] (id INT NOT NULL IDENTITY PRIMARY KEY, junk varchar(10) NULL)" );
}
- $opts = array();
- if ( in_array( 'LOW_PRIORITY', $options ) )
- $opts[] = $this->lowPriorityOption();
- if ( in_array( 'IGNORE', $options ) )
- $opts[] = 'IGNORE';
- return implode(' ', $opts);
- }
+ sqlsrv_query( $this->mConn, "INSERT INTO [sequence_$seqName] (junk) VALUES ('')" );
+ $ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
+ $row = sqlsrv_fetch_array( $ret, SQLSRV_FETCH_ASSOC );// KEEP ASSOC THERE, weird weird bug dealing with the return value if you don't
- /**
- * Change the current database
- */
- function selectDB( $db ) {
- $this->mDBname = $db;
- return mssql_select_db( $db, $this->mConn );
+ sqlsrv_free_stmt( $ret );
+ $this->mInsertId = $row['id'];
+ return $row['id'];
}
/**
- * MSSQL has a problem with the backtick quoting, so all this does is ensure the prefix is added exactly once
+ * Return the current value of a sequence. Assumes it has ben nextval'ed in this session.
*/
- function tableName($name) {
- return strpos($name, $this->mTablePrefix) === 0 ? $name : "{$this->mTablePrefix}$name";
+ function currentSequenceValue( $seqName ) {
+ $ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
+ if ( $ret !== false ) {
+ $row = sqlsrv_fetch_array( $ret );
+ sqlsrv_free_stmt( $ret );
+ return $row['id'];
+ } else {
+ return $this->nextSequenceValue( $seqName );
+ }
}
- /**
- * MSSQL doubles quotes instead of escaping them
- * @param $s String to be slashed.
- * @return string slashed string.
- */
- function strencode($s) {
- return str_replace("'","''",$s);
- }
- /**
- * REPLACE query wrapper
- * PostgreSQL simulates this with a DELETE followed by INSERT
- * $row is the row to insert, an associative array
- * $uniqueIndexes is an array of indexes. Each element may be either a
- * field name or an array of field names
- *
- * It may be more efficient to leave off unique indexes which are unlikely to collide.
- * However if you do this, you run the risk of encountering errors which wouldn't have
- * occurred in MySQL
- *
- * @todo migrate comment to phodocumentor format
- */
- function replace( $table, $uniqueIndexes, $rows, $fname = 'Database::replace' ) {
+ # REPLACE query wrapper
+ # MSSQL simulates this with a DELETE followed by INSERT
+ # $row is the row to insert, an associative array
+ # $uniqueIndexes is an array of indexes. Each element may be either a
+ # field name or an array of field names
+ #
+ # It may be more efficient to leave off unique indexes which are unlikely to collide.
+ # However if you do this, you run the risk of encountering errors which wouldn't have
+ # occurred in MySQL
+ function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseMssql::replace' ) {
$table = $this->tableName( $table );
+ if ( count( $rows ) == 0 ) {
+ return;
+ }
+
# Single row case
if ( !is_array( reset( $rows ) ) ) {
$rows = array( $rows );
}
- $sql = "REPLACE INTO $table (" . implode( ',', array_keys( $rows[0] ) ) .') VALUES ';
- $first = true;
foreach ( $rows as $row ) {
- if ( $first ) {
- $first = false;
- } else {
- $sql .= ',';
+ # Delete rows which collide
+ if ( $uniqueIndexes ) {
+ $sql = "DELETE FROM $table WHERE ";
+ $first = true;
+ foreach ( $uniqueIndexes as $index ) {
+ if ( $first ) {
+ $first = false;
+ $sql .= "(";
+ } else {
+ $sql .= ') OR (';
+ }
+ if ( is_array( $index ) ) {
+ $first2 = true;
+ foreach ( $index as $col ) {
+ if ( $first2 ) {
+ $first2 = false;
+ } else {
+ $sql .= ' AND ';
+ }
+ $sql .= $col . '=' . $this->addQuotes( $row[$col] );
+ }
+ } else {
+ $sql .= $index . '=' . $this->addQuotes( $row[$index] );
+ }
+ }
+ $sql .= ')';
+ $this->query( $sql, $fname );
}
- $sql .= '(' . $this->makeList( $row ) . ')';
+
+ # Now insert the row
+ $sql = "INSERT INTO $table (" . $this->makeList( array_keys( $row ), LIST_NAMES ) . ') VALUES (' .
+ $this->makeList( $row, LIST_COMMA ) . ')';
+ $this->query( $sql, $fname );
}
- return $this->query( $sql, $fname );
}
- /**
- * DELETE where the condition is a join
- * MySQL does this with a multi-table DELETE syntax, PostgreSQL does it with sub-selects
- *
- * For safety, an empty $conds will not delete everything. If you want to delete all rows where the
- * join condition matches, set $conds='*'
- *
- * DO NOT put the join condition in $conds
- *
- * @param $delTable String: The table to delete from.
- * @param $joinTable String: The other table.
- * @param $delVar String: The variable to join on, in the first table.
- * @param $joinVar String: The variable to join on, in the second table.
- * @param $conds Array: Condition array of field names mapped to variables, ANDed together in the WHERE clause
- * @param $fname String: Calling function name
- */
- function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'Database::deleteJoin' ) {
+ # DELETE where the condition is a join
+ function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = "DatabaseMssql::deleteJoin" ) {
if ( !$conds ) {
- throw new DBUnexpectedError( $this, 'Database::deleteJoin() called with empty $conds' );
+ throw new DBUnexpectedError( $this, 'DatabaseMssql::deleteJoin() called with empty $conds' );
}
$delTable = $this->tableName( $delTable );
$joinTable = $this->tableName( $joinTable );
- $sql = "DELETE $delTable FROM $delTable, $joinTable WHERE $delVar=$joinVar ";
+ $sql = "DELETE FROM $delTable WHERE $delVar IN (SELECT $joinVar FROM $joinTable ";
if ( $conds != '*' ) {
- $sql .= ' AND ' . $this->makeList( $conds, LIST_AND );
+ $sql .= 'WHERE ' . $this->makeList( $conds, LIST_AND );
}
+ $sql .= ')';
- return $this->query( $sql, $fname );
+ $this->query( $sql, $fname );
}
- /**
- * Returns the size of a text field, or -1 for "unlimited"
- */
+ # Returns the size of a text field, or -1 for "unlimited"
function textFieldSize( $table, $field ) {
$table = $this->tableName( $table );
- $sql = "SELECT TOP 1 * FROM $table;";
- $res = $this->query( $sql, 'Database::textFieldSize' );
- $row = $this->fetchObject( $res );
- $this->freeResult( $res );
-
- $m = array();
- if ( preg_match( '/\((.*)\)/', $row->Type, $m ) ) {
- $size = $m[1];
+ $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
+ WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
+ $res = $this->query( $sql );
+ $row = $this->fetchRow( $res );
+ $size = -1;
+ if ( strtolower( $row['DATA_TYPE'] ) != 'text' ) $size = $row['CHARACTER_MAXIMUM_LENGTH'];
+ return $size;
+ }
+
+ /**
+ * Construct a LIMIT query with optional offset
+ * This is used for query pages
+ * $sql string SQL query we will append the limit too
+ * $limit integer the SQL limit
+ * $offset integer the SQL offset (default false)
+ */
+ function limitResult( $sql, $limit, $offset = false ) {
+ if ( $offset === false || $offset == 0 ) {
+ if ( strpos( $sql, "SELECT" ) === false ) {
+ return "TOP {$limit} " . $sql;
+ } else {
+ return preg_replace( '/\bSELECT(\s*DISTINCT)?\b/Dsi', 'SELECT$1 TOP ' . $limit, $sql, 1 );
+ }
} else {
- $size = -1;
+ $sql = '
+ SELECT * FROM (
+ SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3 FROM (
+ SELECT 1 AS line2, sub1.* FROM (' . $sql . ') AS sub1
+ ) as sub2
+ ) AS sub3
+ WHERE line3 BETWEEN ' . ( $offset + 1 ) . ' AND ' . ( $offset + $limit );
+ return $sql;
}
- return $size;
+ }
+
+ // If there is a limit clause, parse it, strip it, and pass the remaining sql through limitResult()
+ // with the appropriate parameters. Not the prettiest solution, but better than building a whole new parser.
+ // This exists becase there are still too many extensions that don't use dynamic sql generation.
+ function LimitToTopN( $sql ) {
+ // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
+ $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
+ if ( preg_match( $pattern, $sql, $matches ) ) {
+ // row_count = $matches[4]
+ $row_count = $matches[4];
+ // offset = $matches[3] OR $matches[6]
+ $offset = $matches[3] or
+ $offset = $matches[6] or
+ $offset = false;
+
+ // strip the matching LIMIT clause out
+ $sql = str_replace( $matches[0], '', $sql );
+ return $this->limitResult( $sql, $row_count, $offset );
+ }
+ return $sql;
+ }
+
+ // MSSQL does support this, but documentation is too thin to make a generalized
+ // function for this. Apparently UPDATE TOP (N) works, but the sort order
+ // may not be what we're expecting so the top n results may be a random selection.
+ // TODO: Implement properly.
+ function limitResultForUpdate( $sql, $num ) {
+ return $sql;
+ }
+
+
+ function timestamp( $ts = 0 ) {
+ return wfTimestamp( TS_ISO_8601, $ts );
}
/**
- * @return string Returns the text of the low priority option if it is supported, or a blank string otherwise
+ * @return string wikitext of a link to the server software's web site
*/
- function lowPriorityOption() {
- return 'LOW_PRIORITY';
+ public static function getSoftwareLink() {
+ return "[http://www.microsoft.com/sql/ MS SQL Server]";
}
/**
- * INSERT SELECT wrapper
- * $varMap must be an associative array of the form array( 'dest1' => 'source1', ...)
- * Source items may be literals rather than field names, but strings should be quoted with Database::addQuotes()
- * $conds may be "*" to copy the whole table
- * srcTable may be an array of tables.
+ * @return string Version information from the database
*/
- function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'Database::insertSelect',
- $insertOptions = array(), $selectOptions = array() )
- {
- $destTable = $this->tableName( $destTable );
- if ( is_array( $insertOptions ) ) {
- $insertOptions = implode( ' ', $insertOptions );
- }
- if( !is_array( $selectOptions ) ) {
- $selectOptions = array( $selectOptions );
- }
- list( $startOpts, $useIndex, $tailOpts ) = $this->makeSelectOptions( $selectOptions );
- if( is_array( $srcTable ) ) {
- $srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
- } else {
- $srcTable = $this->tableName( $srcTable );
- }
- $sql = "INSERT $insertOptions INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
- " SELECT $startOpts " . implode( ',', $varMap ) .
- " FROM $srcTable $useIndex ";
- if ( $conds != '*' ) {
- $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
+ function getServerVersion() {
+ $server_info = sqlsrv_server_info( $this->mConn );
+ $version = 'Error';
+ if ( isset( $server_info['SQLServerVersion'] ) ) $version = $server_info['SQLServerVersion'];
+ return $version;
+ }
+
+ function tableExists ( $table, $schema = false ) {
+ $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
+ WHERE table_type='BASE TABLE' AND table_name = '$table'" );
+ if ( $res === false ) {
+ print( "Error in tableExists query: " . $this->getErrors() );
+ return false;
}
- $sql .= " $tailOpts";
- return $this->query( $sql, $fname );
+ if ( sqlsrv_fetch( $res ) )
+ return true;
+ else
+ return false;
}
/**
- * Construct a LIMIT query with optional offset
- * This is used for query pages
- * $sql string SQL query we will append the limit to
- * $limit integer the SQL limit
- * $offset integer the SQL offset (default false)
+ * Query whether a given column exists in the mediawiki schema
*/
- function limitResult($sql, $limit, $offset=false) {
- if( !is_numeric($limit) ) {
- throw new DBUnexpectedError( $this, "Invalid non-numeric limit passed to limitResult()\n" );
+ function fieldExists( $table, $field, $fname = 'DatabaseMssql::fieldExists' ) {
+ $table = $this->tableName( $table );
+ $res = sqlsrv_query( $this->mConn, "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.Columns
+ WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+ if ( $res === false ) {
+ print( "Error in fieldExists query: " . $this->getErrors() );
+ return false;
}
- if ($offset) {
- throw new DBUnexpectedError( $this, 'Database::limitResult called with non-zero offset which is not supported yet' );
- } else {
- $sql = ereg_replace("^SELECT", "SELECT TOP $limit", $sql);
+ if ( sqlsrv_fetch( $res ) )
+ return true;
+ else
+ return false;
+ }
+
+ function fieldInfo( $table, $field ) {
+ $table = $this->tableName( $table );
+ $res = sqlsrv_query( $this->mConn, "SELECT * FROM INFORMATION_SCHEMA.Columns
+ WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+ if ( $res === false ) {
+ print( "Error in fieldInfo query: " . $this->getErrors() );
+ return false;
}
- return $sql;
+ $meta = $this->fetchRow( $res );
+ if ( $meta ) {
+ return new MssqlField( $meta );
+ }
+ return false;
+ }
+
+ public function unixTimestamp( $field ) {
+ return "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),$field)";
}
/**
- * Should determine if the last failure was due to a deadlock
- * @return bool
+ * Begin a transaction, committing any previously open transaction
*/
- function wasDeadlock() {
- return $this->lastErrno() == 1205;
+ function begin( $fname = 'DatabaseMssql::begin' ) {
+ sqlsrv_begin_transaction( $this->mConn );
+ $this->mTrxLevel = 1;
}
/**
- * Return MW-style timestamp used for MySQL schema
+ * End a transaction
*/
- function timestamp( $ts=0 ) {
- return wfTimestamp(TS_MW,$ts);
+ function commit( $fname = 'DatabaseMssql::commit' ) {
+ sqlsrv_commit( $this->mConn );
+ $this->mTrxLevel = 0;
}
/**
- * Local database timestamp format or null
+ * Rollback a transaction.
+ * No-op on non-transactional databases.
*/
- function timestampOrNull( $ts = null ) {
- if( is_null( $ts ) ) {
- return null;
- } else {
- return $this->timestamp( $ts );
+ function rollback( $fname = 'DatabaseMssql::rollback' ) {
+ sqlsrv_rollback( $this->mConn );
+ $this->mTrxLevel = 0;
+ }
+
+ function setup_database() {
+ global $wgDBuser;
+
+ // Make sure that we can write to the correct schema
+ $ctest = "mediawiki_test_table";
+ if ( $this->tableExists( $ctest ) ) {
+ $this->doQuery( "DROP TABLE $ctest" );
+ }
+ $SQL = "CREATE TABLE $ctest (a int)";
+ $res = $this->doQuery( $SQL );
+ if ( !$res ) {
+ print "<b>FAILED</b>. Make sure that the user " . htmlspecialchars( $wgDBuser ) . " can write to the database</li>\n";
+ dieout( );
}
+ $this->doQuery( "DROP TABLE $ctest" );
+
+ $res = $this->sourceFile( "../maintenance/mssql/tables.sql" );
+ if ( $res !== true ) {
+ echo " <b>FAILED</b></li>";
+ dieout( htmlspecialchars( $res ) );
+ }
+
+ # Avoid the non-standard "REPLACE INTO" syntax
+ $f = fopen( "../maintenance/interwiki.sql", 'r' );
+ if ( $f == false ) {
+ dieout( "<li>Could not find the interwiki.sql file" );
+ }
+ # We simply assume it is already empty as we have just created it
+ $SQL = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local) VALUES ";
+ while ( ! feof( $f ) ) {
+ $line = fgets( $f, 1024 );
+ $matches = array();
+ if ( !preg_match( '/^\s*(\(.+?),(\d)\)/', $line, $matches ) ) {
+ continue;
+ }
+ $this->query( "$SQL $matches[1],$matches[2])" );
+ }
+ print " (table interwiki successfully populated)...\n";
+
+ $this->commit();
}
/**
- * @return string wikitext of a link to the server software's web site
+ * Escapes a identifier for use inm SQL.
+ * Throws an exception if it is invalid.
+ * Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
*/
- function getSoftwareLink() {
- return "[http://www.microsoft.com/sql/default.mspx Microsoft SQL Server 2005 Home]";
+ private function escapeIdentifier( $identifier ) {
+ if ( strlen( $identifier ) == 0 ) {
+ throw new MWException( "An identifier must not be empty" );
+ }
+ if ( strlen( $identifier ) > 128 ) {
+ throw new MWException( "The identifier '$identifier' is too long (max. 128)" );
+ }
+ if ( ( strpos( $identifier, '[' ) !== false ) || ( strpos( $identifier, ']' ) !== false ) ) {
+ // It may be allowed if you quoted with double quotation marks, but that would break if QUOTED_IDENTIFIER is OFF
+ throw new MWException( "You can't use square brackers in the identifier '$identifier'" );
+ }
+ return "[$identifier]";
}
/**
- * @return string Version information from the database
+ * Initial setup.
+ * Precondition: This object is connected as the superuser.
+ * Creates the database, schema, user and login.
*/
- function getServerVersion() {
- $row = mssql_fetch_row(mssql_query('select @@VERSION'));
- return ereg("^(.+[0-9]+\\.[0-9]+\\.[0-9]+) ",$row[0],$m) ? $m[1] : $row[0];
+ function initial_setup( $dbName, $newUser, $loginPassword ) {
+ $dbName = $this->escapeIdentifier( $dbName );
+
+ // It is not clear what can be used as a login,
+ // From http://msdn.microsoft.com/en-us/library/ms173463.aspx
+ // a sysname may be the same as an identifier.
+ $newUser = $this->escapeIdentifier( $newUser );
+ $loginPassword = $this->addQuotes( $loginPassword );
+
+ $this->doQuery("CREATE DATABASE $dbName;");
+ $this->doQuery("USE $dbName;");
+ $this->doQuery("CREATE SCHEMA $dbName;");
+ $this->doQuery("
+ CREATE
+ LOGIN $newUser
+ WITH
+ PASSWORD=$loginPassword
+ ;
+ ");
+ $this->doQuery("
+ CREATE
+ USER $newUser
+ FOR
+ LOGIN $newUser
+ WITH
+ DEFAULT_SCHEMA=$dbName
+ ;
+ ");
+ $this->doQuery("
+ GRANT
+ BACKUP DATABASE,
+ BACKUP LOG,
+ CREATE DEFAULT,
+ CREATE FUNCTION,
+ CREATE PROCEDURE,
+ CREATE RULE,
+ CREATE TABLE,
+ CREATE VIEW,
+ CREATE FULLTEXT CATALOG
+ ON
+ DATABASE::$dbName
+ TO $newUser
+ ;
+ ");
+ $this->doQuery("
+ GRANT
+ CONTROL
+ ON
+ SCHEMA::$dbName
+ TO $newUser
+ ;
+ ");
+
+
}
- function limitResultForUpdate($sql, $num) {
- return $sql;
+ function encodeBlob( $b ) {
+ // we can't have zero's and such, this is a simple encoding to make sure we don't barf
+ return base64_encode( $b );
+ }
+
+ function decodeBlob( $b ) {
+ // we can't have zero's and such, this is a simple encoding to make sure we don't barf
+ return base64_decode( $b );
}
/**
- * How lagged is this slave?
+ * @private
*/
- public function getLag() {
- return 0;
+ function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
+ $ret = array();
+ $retJOIN = array();
+ $use_index_safe = is_array( $use_index ) ? $use_index : array();
+ $join_conds_safe = is_array( $join_conds ) ? $join_conds : array();
+ foreach ( $tables as $table ) {
+ // Is there a JOIN and INDEX clause for this table?
+ if ( isset( $join_conds_safe[$table] ) && isset( $use_index_safe[$table] ) ) {
+ $tableClause = $join_conds_safe[$table][0] . ' ' . $this->tableName( $table );
+ $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$table] ) );
+ $tableClause .= ' ON (' . $this->makeList( (array)$join_conds_safe[$table][1], LIST_AND ) . ')';
+ $retJOIN[] = $tableClause;
+ // Is there an INDEX clause?
+ } else if ( isset( $use_index_safe[$table] ) ) {
+ $tableClause = $this->tableName( $table );
+ $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$table] ) );
+ $ret[] = $tableClause;
+ // Is there a JOIN clause?
+ } else if ( isset( $join_conds_safe[$table] ) ) {
+ $tableClause = $join_conds_safe[$table][0] . ' ' . $this->tableName( $table );
+ $tableClause .= ' ON (' . $this->makeList( (array)$join_conds_safe[$table][1], LIST_AND ) . ')';
+ $retJOIN[] = $tableClause;
+ } else {
+ $tableClause = $this->tableName( $table );
+ $ret[] = $tableClause;
+ }
+ }
+ // We can't separate explicit JOIN clauses with ',', use ' ' for those
+ $straightJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
+ $otherJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
+ // Compile our final table clause
+ return implode( ' ', array( $straightJoins, $otherJoins ) );
+ }
+
+ function strencode( $s ) { # Should not be called by us
+ return str_replace( "'", "''", $s );
+ }
+
+ function addQuotes( $s ) {
+ if ( $s instanceof Blob ) {
+ return "'" . $s->fetch( $s ) . "'";
+ } else {
+ return parent::addQuotes( $s );
+ }
+ }
+
+ function selectDB( $db ) {
+ return ( $this->query( "SET DATABASE $db" ) !== false );
}
/**
- * Called by the installer script
- * - this is the same way as DatabasePostgresql.php, MySQL reads in tables.sql and interwiki.sql using dbsource (which calls db->sourceFile)
+ * @private
+ *
+ * @param $options Array: an associative array of options to be turned into
+ * an SQL query, valid keys are listed in the function.
+ * @return Array
*/
- public function setup_database() {
- global $IP,$wgDBTableOptions;
- $wgDBTableOptions = '';
- $mysql_tmpl = "$IP/maintenance/tables.sql";
- $mysql_iw = "$IP/maintenance/interwiki.sql";
- $mssql_tmpl = "$IP/maintenance/mssql/tables.sql";
-
- # Make an MSSQL template file if it doesn't exist (based on the same one MySQL uses to create a new wiki db)
- if (!file_exists($mssql_tmpl)) { # todo: make this conditional again
- $sql = file_get_contents($mysql_tmpl);
- $sql = preg_replace('/^\s*--.*?$/m','',$sql); # strip comments
- $sql = preg_replace('/^\s*(UNIQUE )?(INDEX|KEY|FULLTEXT).+?$/m', '', $sql); # These indexes should be created with a CREATE INDEX query
- $sql = preg_replace('/(\sKEY) [^\(]+\(/is', '$1 (', $sql); # "KEY foo (foo)" should just be "KEY (foo)"
- $sql = preg_replace('/(varchar\([0-9]+\))\s+binary/i', '$1', $sql); # "varchar(n) binary" cannot be followed by "binary"
- $sql = preg_replace('/(var)?binary\(([0-9]+)\)/ie', '"varchar(".strlen(pow(2,$2)).")"', $sql); # use varchar(chars) not binary(bits)
- $sql = preg_replace('/ (var)?binary/i', ' varchar', $sql); # use varchar not binary
- $sql = preg_replace('/(varchar\([0-9]+\)(?! N))/', '$1 NULL', $sql); # MSSQL complains if NULL is put into a varchar
- #$sql = preg_replace('/ binary/i',' varchar',$sql); # MSSQL binary's can't be assigned with strings, so use varchar's instead
- #$sql = preg_replace('/(binary\([0-9]+\) (NOT NULL )?default) [\'"].*?[\'"]/i','$1 0',$sql); # binary default cannot be string
- $sql = preg_replace('/[a-z]*(blob|text)([ ,])/i', 'text$2', $sql); # no BLOB types in MSSQL
- $sql = preg_replace('/\).+?;/',');', $sql); # remove all table options
- $sql = preg_replace('/ (un)?signed/i', '', $sql);
- $sql = preg_replace('/ENUM\(.+?\)/','TEXT',$sql); # Make ENUM's into TEXT's
- $sql = str_replace(' bool ', ' bit ', $sql);
- $sql = str_replace('auto_increment', 'IDENTITY(1,1)', $sql);
- #$sql = preg_replace('/NOT NULL(?! IDENTITY)/', 'NULL', $sql); # Allow NULL's for non IDENTITY columns
-
- # Tidy up and write file
- $sql = preg_replace('/,\s*\)/s', "\n)", $sql); # Remove spurious commas left after INDEX removals
- $sql = preg_replace('/^\s*^/m', '', $sql); # Remove empty lines
- $sql = preg_replace('/;$/m', ";\n", $sql); # Separate each statement with an empty line
- file_put_contents($mssql_tmpl, $sql);
- }
-
- # Parse the MSSQL template replacing inline variables such as /*$wgDBprefix*/
- $err = $this->sourceFile($mssql_tmpl);
- if ($err !== true) $this->reportQueryError($err,0,$sql,__FUNCTION__);
-
- # Use DatabasePostgres's code to populate interwiki from MySQL template
- $f = fopen($mysql_iw,'r');
- if ($f == false) dieout("<li>Could not find the interwiki.sql file");
- $sql = "INSERT INTO {$this->mTablePrefix}interwiki(iw_prefix,iw_url,iw_local) VALUES ";
- while (!feof($f)) {
- $line = fgets($f,1024);
- $matches = array();
- if (!preg_match('/^\s*(\(.+?),(\d)\)/', $line, $matches)) continue;
- $this->query("$sql $matches[1],$matches[2])");
+ function makeSelectOptions( $options ) {
+ $tailOpts = '';
+ $startOpts = '';
+
+ $noKeyOptions = array();
+ foreach ( $options as $key => $option ) {
+ if ( is_numeric( $key ) ) {
+ $noKeyOptions[$option] = true;
+ }
}
+
+ if ( isset( $options['GROUP BY'] ) ) $tailOpts .= " GROUP BY {$options['GROUP BY']}";
+ if ( isset( $options['HAVING'] ) ) $tailOpts .= " HAVING {$options['GROUP BY']}";
+ if ( isset( $options['ORDER BY'] ) ) $tailOpts .= " ORDER BY {$options['ORDER BY']}";
+
+ if ( isset( $noKeyOptions['DISTINCT'] ) && isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
+
+ // we want this to be compatible with the output of parent::makeSelectOptions()
+ return array( $startOpts, '' , $tailOpts, '' );
+ }
+
+ /**
+ * Get the type of the DBMS, as it appears in $wgDBtype.
+ */
+ function getType(){
+ return 'mssql';
}
-
+
+ function buildConcat( $stringList ) {
+ return implode( ' + ', $stringList );
+ }
+
public function getSearchEngine() {
- return "SearchEngineDummy";
+ return "SearchMssql";
+ }
+
+} // end DatabaseMssql class
+
+/**
+ * Utility class.
+ *
+ * @ingroup Database
+ */
+class MssqlField implements Field {
+ private $name, $tablename, $default, $max_length, $nullable, $type;
+ function __construct ( $info ) {
+ $this->name = $info['COLUMN_NAME'];
+ $this->tablename = $info['TABLE_NAME'];
+ $this->default = $info['COLUMN_DEFAULT'];
+ $this->max_length = $info['CHARACTER_MAXIMUM_LENGTH'];
+ $this->nullable = ( strtolower( $info['IS_NULLABLE'] ) == 'no' ) ? false:true;
+ $this->type = $info['DATA_TYPE'];
+ }
+ function name() {
+ return $this->name;
+ }
+
+ function tableName() {
+ return $this->tableName;
+ }
+
+ function defaultValue() {
+ return $this->default;
+ }
+
+ function maxLength() {
+ return $this->max_length;
+ }
+
+ function isNullable() {
+ return $this->nullable;
+ }
+
+ function type() {
+ return $this->type;
}
}
/**
+ * The MSSQL PHP driver doesn't support sqlsrv_num_rows, so we recall all rows into an array and maintain our
+ * own cursor index into that array...This is similar to the way the Oracle driver handles this same issue
+ *
* @ingroup Database
*/
-class MSSQLField extends MySQLField {
+class MssqlResult {
+
+ public function __construct( $queryresult = false ) {
+ $this->mCursor = 0;
+ $this->mRows = array();
+ $this->mNumFields = sqlsrv_num_fields( $queryresult );
+ $this->mFieldMeta = sqlsrv_field_metadata( $queryresult );
+ while ( $row = sqlsrv_fetch_array( $queryresult, SQLSRV_FETCH_ASSOC ) ) {
+ if ( $row !== null ) {
+ foreach ( $row as $k => $v ) {
+ if ( is_object( $v ) && method_exists( $v, 'format' ) ) {// DateTime Object
+ $row[$k] = $v->format( "Y-m-d\TH:i:s\Z" );
+ }
+ }
+ $this->mRows[] = $row;// read results into memory, cursors are not supported
+ }
+ }
+ $this->mRowCount = count( $this->mRows );
+ sqlsrv_free_stmt( $queryresult );
+ }
+
+ private function array_to_obj( $array, &$obj ) {
+ foreach ( $array as $key => $value ) {
+ if ( is_array( $value ) ) {
+ $obj->$key = new stdClass();
+ $this->array_to_obj( $value, $obj->$key );
+ } else {
+ if ( !empty( $key ) ) {
+ $obj->$key = $value;
+ }
+ }
+ }
+ return $obj;
+ }
- function __construct() {
+ public function fetch( $mode = SQLSRV_FETCH_BOTH, $object_class = 'stdClass' ) {
+ if ( $this->mCursor >= $this->mRowCount || $this->mRowCount == 0 ) {
+ return false;
+ }
+ $arrNum = array();
+ if ( $mode == SQLSRV_FETCH_NUMERIC || $mode == SQLSRV_FETCH_BOTH ) {
+ foreach ( $this->mRows[$this->mCursor] as $value ) {
+ $arrNum[] = $value;
+ }
+ }
+ switch( $mode ) {
+ case SQLSRV_FETCH_ASSOC:
+ $ret = $this->mRows[$this->mCursor];
+ break;
+ case SQLSRV_FETCH_NUMERIC:
+ $ret = $arrNum;
+ break;
+ case 'OBJECT':
+ $o = new $object_class;
+ $ret = $this->array_to_obj( $this->mRows[$this->mCursor], $o );
+ break;
+ case SQLSRV_FETCH_BOTH:
+ default:
+ $ret = $this->mRows[$this->mCursor] + $arrNum;
+ break;
}
- static function fromText($db, $table, $field) {
- $n = new MSSQLField;
- $n->name = $field;
- $n->tablename = $table;
- return $n;
+ $this->mCursor++;
+ return $ret;
+ }
+
+ public function get( $pos, $fld ) {
+ return $this->mRows[$pos][$fld];
+ }
+
+ public function numrows() {
+ return $this->mRowCount;
+ }
+
+ public function seek( $iRow ) {
+ $this->mCursor = min( $iRow, $this->mRowCount );
+ }
+
+ public function numfields() {
+ return $this->mNumFields;
+ }
+
+ public function fieldname( $nr ) {
+ $arrKeys = array_keys( $this->mRows[0] );
+ return $arrKeys[$nr];
+ }
+
+ public function fieldtype( $nr ) {
+ $i = 0;
+ $intType = -1;
+ foreach ( $this->mFieldMeta as $meta ) {
+ if ( $nr == $i ) {
+ $intType = $meta['Type'];
+ break;
+ }
+ $i++;
}
+ // http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
+ switch( $intType ) {
+ case SQLSRV_SQLTYPE_BIGINT: $strType = 'bigint'; break;
+ case SQLSRV_SQLTYPE_BINARY: $strType = 'binary'; break;
+ case SQLSRV_SQLTYPE_BIT: $strType = 'bit'; break;
+ case SQLSRV_SQLTYPE_CHAR: $strType = 'char'; break;
+ case SQLSRV_SQLTYPE_DATETIME: $strType = 'datetime'; break;
+ case SQLSRV_SQLTYPE_DECIMAL/*($precision, $scale)*/: $strType = 'decimal'; break;
+ case SQLSRV_SQLTYPE_FLOAT: $strType = 'float'; break;
+ case SQLSRV_SQLTYPE_IMAGE: $strType = 'image'; break;
+ case SQLSRV_SQLTYPE_INT: $strType = 'int'; break;
+ case SQLSRV_SQLTYPE_MONEY: $strType = 'money'; break;
+ case SQLSRV_SQLTYPE_NCHAR/*($charCount)*/: $strType = 'nchar'; break;
+ case SQLSRV_SQLTYPE_NUMERIC/*($precision, $scale)*/: $strType = 'numeric'; break;
+ case SQLSRV_SQLTYPE_NVARCHAR/*($charCount)*/: $strType = 'nvarchar'; break;
+ // case SQLSRV_SQLTYPE_NVARCHAR('max'): $strType = 'nvarchar(MAX)'; break;
+ case SQLSRV_SQLTYPE_NTEXT: $strType = 'ntext'; break;
+ case SQLSRV_SQLTYPE_REAL: $strType = 'real'; break;
+ case SQLSRV_SQLTYPE_SMALLDATETIME: $strType = 'smalldatetime'; break;
+ case SQLSRV_SQLTYPE_SMALLINT: $strType = 'smallint'; break;
+ case SQLSRV_SQLTYPE_SMALLMONEY: $strType = 'smallmoney'; break;
+ case SQLSRV_SQLTYPE_TEXT: $strType = 'text'; break;
+ case SQLSRV_SQLTYPE_TIMESTAMP: $strType = 'timestamp'; break;
+ case SQLSRV_SQLTYPE_TINYINT: $strType = 'tinyint'; break;
+ case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER: $strType = 'uniqueidentifier'; break;
+ case SQLSRV_SQLTYPE_UDT: $strType = 'UDT'; break;
+ case SQLSRV_SQLTYPE_VARBINARY/*($byteCount)*/: $strType = 'varbinary'; break;
+ // case SQLSRV_SQLTYPE_VARBINARY('max'): $strType = 'varbinary(MAX)'; break;
+ case SQLSRV_SQLTYPE_VARCHAR/*($charCount)*/: $strType = 'varchar'; break;
+ // case SQLSRV_SQLTYPE_VARCHAR('max'): $strType = 'varchar(MAX)'; break;
+ case SQLSRV_SQLTYPE_XML: $strType = 'xml'; break;
+ default: $strType = $intType;
+ }
+ return $strType;
+ }
-} // end DatabaseMssql class
+ public function free() {
+ unset( $this->mRows );
+ return;
+ }
+}
diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php
index ea7ef5b9..ed276ec5 100644
--- a/includes/db/DatabaseMysql.php
+++ b/includes/db/DatabaseMysql.php
@@ -1,5 +1,12 @@
<?php
/**
+ * This is the MySQL database abstraction layer.
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
* Database abstraction object for mySQL
* Inherit all methods and properties of Database::Database()
*
@@ -24,11 +31,8 @@ class DatabaseMysql extends DatabaseBase {
global $wgAllDBsAreLocalhost;
wfProfileIn( __METHOD__ );
- # Test for missing mysql.so
- # First try to load it
- if (!@extension_loaded('mysql')) {
- @dl('mysql.so');
- }
+ # Load mysql.so if we don't have it
+ wfDl( 'mysql' );
# Fail now
# Otherwise we get a suppressed fatal error, which is very hard to track down
@@ -48,8 +52,6 @@ class DatabaseMysql extends DatabaseBase {
$this->mPassword = $password;
$this->mDBname = $dbName;
- $success = false;
-
wfProfileIn("dbconnect-$server");
# The kernel's default SYN retransmission period is far too slow for us,
@@ -72,10 +74,10 @@ class DatabaseMysql extends DatabaseBase {
# Create a new connection...
$this->mConn = mysql_connect( $realServer, $user, $password, true );
}
- if ($this->mConn === false) {
+ #if ( $this->mConn === false ) {
#$iplus = $i + 1;
- #wfLogDBError("Connect loop error $iplus of $max ($server): " . mysql_errno() . " - " . mysql_error()."\n");
- }
+ #wfLogDBError("Connect loop error $iplus of $max ($server): " . mysql_errno() . " - " . mysql_error()."\n");
+ #}
}
$phpError = $this->restoreErrorHandler();
# Always log connection errors
@@ -88,9 +90,8 @@ class DatabaseMysql extends DatabaseBase {
wfDebug( "DB connection error\n" );
wfDebug( "Server: $server, User: $user, Password: " .
substr( $password, 0, 3 ) . "..., error: " . mysql_error() . "\n" );
- $success = false;
}
-
+
wfProfileOut("dbconnect-$server");
if ( $dbName != '' && $this->mConn !== false ) {
@@ -114,9 +115,15 @@ class DatabaseMysql extends DatabaseBase {
global $wgDBmysql5;
if( $wgDBmysql5 ) {
$this->query( 'SET NAMES utf8', __METHOD__ );
+ } else {
+ $this->query( 'SET NAMES binary', __METHOD__ );
+ }
+ // Set SQL mode, default is turning them all off, can be overridden or skipped with null
+ global $wgSQLMode;
+ if ( is_string( $wgSQLMode ) ) {
+ $mode = $this->addQuotes( $wgSQLMode );
+ $this->query( "SET sql_mode = $mode", __METHOD__ );
}
- // Turn off strict mode
- $this->query( "SET sql_mode = ''", __METHOD__ );
}
// Turn off strict mode if it is on
@@ -233,34 +240,35 @@ class DatabaseMysql extends DatabaseBase {
}
function affectedRows() { return mysql_affected_rows( $this->mConn ); }
-
+
/**
* Estimate rows in dataset
* Returns estimated count, based on EXPLAIN output
* Takes same arguments as Database::select()
*/
- public function estimateRowCount( $table, $vars='*', $conds='', $fname = 'Database::estimateRowCount', $options = array() ) {
+ public function estimateRowCount( $table, $vars='*', $conds='', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
$options['EXPLAIN'] = true;
$res = $this->select( $table, $vars, $conds, $fname, $options );
- if ( $res === false )
+ if ( $res === false ) {
return false;
+ }
if ( !$this->numRows( $res ) ) {
- $this->freeResult($res);
return 0;
}
$rows = 1;
- while( $plan = $this->fetchObject( $res ) ) {
+ foreach ( $res as $plan ) {
$rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
}
-
- $this->freeResult($res);
- return $rows;
+ return $rows;
}
function fieldInfo( $table, $field ) {
$table = $this->tableName( $table );
- $res = $this->query( "SELECT * FROM $table LIMIT 1" );
+ $res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
+ if ( !$res ) {
+ return false;
+ }
$n = mysql_num_fields( $res->result );
for( $i = 0; $i < $n; $i++ ) {
$meta = mysql_fetch_field( $res->result, $i );
@@ -271,32 +279,108 @@ class DatabaseMysql extends DatabaseBase {
return false;
}
+ /**
+ * Get information about an index into an object
+ * Returns false if the index does not exist
+ */
+ function indexInfo( $table, $index, $fname = 'DatabaseMysql::indexInfo' ) {
+ # SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
+ # SHOW INDEX should work for 3.x and up:
+ # http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
+ $table = $this->tableName( $table );
+ $index = $this->indexName( $index );
+ $sql = 'SHOW INDEX FROM ' . $table;
+ $res = $this->query( $sql, $fname );
+
+ if ( !$res ) {
+ return null;
+ }
+
+ $result = array();
+
+ foreach ( $res as $row ) {
+ if ( $row->Key_name == $index ) {
+ $result[] = $row;
+ }
+ }
+
+ return empty( $result ) ? false : $result;
+ }
+
function selectDB( $db ) {
$this->mDBname = $db;
return mysql_select_db( $db, $this->mConn );
}
function strencode( $s ) {
- return mysql_real_escape_string( $s, $this->mConn );
+ $sQuoted = mysql_real_escape_string( $s, $this->mConn );
+
+ if($sQuoted === false) {
+ $this->ping();
+ $sQuoted = mysql_real_escape_string( $s, $this->mConn );
+ }
+ return $sQuoted;
+ }
+
+ /**
+ * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
+ */
+ public function addIdentifierQuotes( $s ) {
+ return "`" . $this->strencode( $s ) . "`";
}
function ping() {
- if( !function_exists( 'mysql_ping' ) ) {
- wfDebug( "Tried to call mysql_ping but this is ancient PHP version. Faking it!\n" );
- return true;
- }
$ping = mysql_ping( $this->mConn );
if ( $ping ) {
return true;
}
- // Need to reconnect manually in MySQL client 5.0.13+
- if ( version_compare( mysql_get_client_info(), '5.0.13', '>=' ) ) {
- mysql_close( $this->mConn );
- $this->mOpened = false;
- $this->mConn = false;
- $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
- return true;
+ mysql_close( $this->mConn );
+ $this->mOpened = false;
+ $this->mConn = false;
+ $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+ return true;
+ }
+
+ /**
+ * Returns slave lag.
+ * At the moment, this will only work if the DB user has the PROCESS privilege
+ * @result int
+ */
+ function getLag() {
+ if ( !is_null( $this->mFakeSlaveLag ) ) {
+ wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
+ return $this->mFakeSlaveLag;
+ }
+ $res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
+ if( !$res ) {
+ return false;
+ }
+ # Find slave SQL thread
+ foreach( $res as $row ) {
+ /* This should work for most situations - when default db
+ * for thread is not specified, it had no events executed,
+ * and therefore it doesn't know yet how lagged it is.
+ *
+ * Relay log I/O thread does not select databases.
+ */
+ if ( $row->User == 'system user' &&
+ $row->State != 'Waiting for master to send event' &&
+ $row->State != 'Connecting to master' &&
+ $row->State != 'Queueing master event to the relay log' &&
+ $row->State != 'Waiting for master update' &&
+ $row->State != 'Requesting binlog dump' &&
+ $row->State != 'Waiting to reconnect after a failed master event read' &&
+ $row->State != 'Reconnecting after a failed master event read' &&
+ $row->State != 'Registering slave on master'
+ ) {
+ # This is it, return the time (except -ve)
+ if ( $row->Time > 0x7fffffff ) {
+ return false;
+ } else {
+ return $row->Time;
+ }
+ }
}
return false;
}
@@ -313,7 +397,7 @@ class DatabaseMysql extends DatabaseBase {
return 'LOW_PRIORITY';
}
- function getSoftwareLink() {
+ public static function getSoftwareLink() {
return '[http://www.mysql.com/ MySQL]';
}
@@ -330,7 +414,6 @@ class DatabaseMysql extends DatabaseBase {
$lockName = $this->addQuotes( $lockName );
$result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
$row = $this->fetchObject( $result );
- $this->freeResult( $result );
if( $row->lockstatus == 1 ) {
return true;
@@ -340,6 +423,9 @@ class DatabaseMysql extends DatabaseBase {
}
}
+ /**
+ * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
+ */
public function unlock( $lockName, $method ) {
$lockName = $this->addQuotes( $lockName );
$result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
@@ -351,8 +437,8 @@ class DatabaseMysql extends DatabaseBase {
$items = array();
foreach( $write as $table ) {
- $tbl = $this->tableName( $table ) .
- ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
+ $tbl = $this->tableName( $table ) .
+ ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
' WRITE';
$items[] = $tbl;
}
@@ -367,6 +453,16 @@ class DatabaseMysql extends DatabaseBase {
$this->query( "UNLOCK TABLES", $method );
}
+ /**
+ * Get search engine class. All subclasses of this
+ * need to implement this if they wish to use searching.
+ *
+ * @return String
+ */
+ public function getSearchEngine() {
+ return 'SearchMySQL';
+ }
+
public function setBigSelects( $value = true ) {
if ( $value === 'default' ) {
if ( $this->mDefaultBigSelects === null ) {
@@ -382,7 +478,10 @@ class DatabaseMysql extends DatabaseBase {
$this->query( "SET sql_big_selects=$encValue", __METHOD__ );
}
-
+ public function unixTimestamp( $field ) {
+ return "UNIX_TIMESTAMP($field)";
+ }
+
/**
* Determines if the last failure was due to a deadlock
*/
@@ -391,7 +490,7 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * Determines if the last query error was something that should be dealt
+ * Determines if the last query error was something that should be dealt
* with by pinging the connection and reissuing the query
*/
function wasErrorReissuable() {
@@ -402,7 +501,7 @@ class DatabaseMysql extends DatabaseBase {
* Determines if the last failure was due to the database being read-only.
*/
function wasReadOnlyError() {
- return $this->lastErrno() == 1223 ||
+ return $this->lastErrno() == 1223 ||
( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
}
@@ -420,7 +519,7 @@ class DatabaseMysql extends DatabaseBase {
$res = $this->query( "SHOW CREATE TABLE $oldName" );
$row = $this->fetchRow( $res );
$oldQuery = $row[1];
- $query = preg_replace( '/CREATE TABLE `(.*?)`/',
+ $query = preg_replace( '/CREATE TABLE `(.*?)`/',
"CREATE $tmp TABLE `$newName`", $oldQuery );
if ($oldQuery === $query) {
# Couldn't do replacement
@@ -432,6 +531,11 @@ class DatabaseMysql extends DatabaseBase {
$this->query( $query, $fname );
}
+ protected function getDefaultSchemaVars() {
+ $vars = parent::getDefaultSchemaVars();
+ $vars['wgDBTableOptions'] = $GLOBALS['wgDBTableOptions'];
+ return $vars;
+ }
}
/**
@@ -439,6 +543,56 @@ class DatabaseMysql extends DatabaseBase {
*/
class Database extends DatabaseMysql {}
+/**
+ * Utility class.
+ * @ingroup Database
+ */
+class MySQLField implements Field {
+ private $name, $tablename, $default, $max_length, $nullable,
+ $is_pk, $is_unique, $is_multiple, $is_key, $type;
+
+ function __construct ( $info ) {
+ $this->name = $info->name;
+ $this->tablename = $info->table;
+ $this->default = $info->def;
+ $this->max_length = $info->max_length;
+ $this->nullable = !$info->not_null;
+ $this->is_pk = $info->primary_key;
+ $this->is_unique = $info->unique_key;
+ $this->is_multiple = $info->multiple_key;
+ $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
+ $this->type = $info->type;
+ }
+
+ function name() {
+ return $this->name;
+ }
+
+ function tableName() {
+ return $this->tableName;
+ }
+
+ function type() {
+ return $this->type;
+ }
+
+ function isNullable() {
+ return $this->nullable;
+ }
+
+ function defaultValue() {
+ return $this->default;
+ }
+
+ function isKey() {
+ return $this->is_key;
+ }
+
+ function isMultipleKey() {
+ return $this->is_multiple;
+ }
+}
+
class MySQLMasterPos {
var $file, $pos;
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
index bd60bbf8..4fe3e980 100644
--- a/includes/db/DatabaseOracle.php
+++ b/includes/db/DatabaseOracle.php
@@ -1,24 +1,10 @@
<?php
/**
- * @ingroup Database
- * @file
- */
-
-/**
* This is the Oracle database abstraction layer.
+ *
+ * @file
* @ingroup Database
*/
-class ORABlob {
- var $mData;
-
- function __construct( $data ) {
- $this->mData = $data;
- }
-
- function getData() {
- return $this->mData;
- }
-}
/**
* The oci8 extension is fairly weak and doesn't support oci_num_rows, among
@@ -29,15 +15,15 @@ class ORABlob {
class ORAResult {
private $rows;
private $cursor;
- private $stmt;
private $nrows;
+
+ private $columns = array();
- private $unique;
private function array_unique_md( $array_in ) {
$array_out = array();
$array_hashes = array();
- foreach ( $array_in as $key => $item ) {
+ foreach ( $array_in as $item ) {
$hash = md5( serialize( $item ) );
if ( !isset( $array_hashes[$hash] ) ) {
$array_hashes[$hash] = $hash;
@@ -53,7 +39,8 @@ class ORAResult {
if ( ( $this->nrows = oci_fetch_all( $stmt, $this->rows, 0, - 1, OCI_FETCHSTATEMENT_BY_ROW | OCI_NUM ) ) === false ) {
$e = oci_error( $stmt );
- $db->reportQueryError( $e['message'], $e['code'], '', __FUNCTION__ );
+ $db->reportQueryError( $e['message'], $e['code'], '', __METHOD__ );
+ $this->free();
return;
}
@@ -62,12 +49,18 @@ class ORAResult {
$this->nrows = count( $this->rows );
}
+ if ($this->nrows > 0) {
+ foreach ( $this->rows[0] as $k => $v ) {
+ $this->columns[$k] = strtolower( oci_field_name( $stmt, $k + 1 ) );
+ }
+ }
+
$this->cursor = 0;
- $this->stmt = $stmt;
+ oci_free_statement( $stmt );
}
public function free() {
- oci_free_statement( $this->stmt );
+ unset($this->db);
}
public function seek( $row ) {
@@ -79,7 +72,7 @@ class ORAResult {
}
public function numFields() {
- return oci_num_fields( $this->stmt );
+ return count($this->columns);
}
public function fetchObject() {
@@ -89,7 +82,7 @@ class ORAResult {
$row = $this->rows[$this->cursor++];
$ret = new stdClass();
foreach ( $row as $k => $v ) {
- $lc = strtolower( oci_field_name( $this->stmt, $k + 1 ) );
+ $lc = $this->columns[$k];
$ret->$lc = $v;
}
@@ -104,7 +97,7 @@ class ORAResult {
$row = $this->rows[$this->cursor++];
$ret = array();
foreach ( $row as $k => $v ) {
- $lc = strtolower( oci_field_name( $this->stmt, $k + 1 ) );
+ $lc = $this->columns[$k];
$ret[$lc] = $v;
$ret[$k] = $v;
}
@@ -116,7 +109,7 @@ class ORAResult {
* Utility class.
* @ingroup Database
*/
-class ORAField {
+class ORAField implements Field {
private $name, $tablename, $default, $max_length, $nullable,
$is_pk, $is_unique, $is_multiple, $is_key, $type;
@@ -149,7 +142,7 @@ class ORAField {
return $this->max_length;
}
- function nullable() {
+ function isNullable() {
return $this->nullable;
}
@@ -185,11 +178,19 @@ class DatabaseOracle extends DatabaseBase {
var $mFieldInfoCache = array();
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $failFunction = false, $flags = 0, $tablePrefix = 'get from global' )
+ $flags = 0, $tablePrefix = 'get from global' )
{
$tablePrefix = $tablePrefix == 'get from global' ? $tablePrefix : strtoupper( $tablePrefix );
- parent::__construct( $server, $user, $password, $dbName, $failFunction, $flags, $tablePrefix );
- wfRunHooks( 'DatabaseOraclePostInit', array( &$this ) );
+ parent::__construct( $server, $user, $password, $dbName, $flags, $tablePrefix );
+ wfRunHooks( 'DatabaseOraclePostInit', array( $this ) );
+ }
+
+ function __destruct() {
+ if ($this->mOpened) {
+ wfSuppressWarnings();
+ $this->close();
+ wfRestoreWarnings();
+ }
}
function getType() {
@@ -218,25 +219,36 @@ class DatabaseOracle extends DatabaseBase {
return true;
}
- static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 )
+ static function newFromParams( $server, $user, $password, $dbName, $flags = 0 )
{
- return new DatabaseOracle( $server, $user, $password, $dbName, $failFunction, $flags );
+ return new DatabaseOracle( $server, $user, $password, $dbName, $flags );
}
/**
* Usually aborts on failure
- * If the failFunction is set to a non-zero integer, returns success
*/
function open( $server, $user, $password, $dbName ) {
if ( !function_exists( 'oci_connect' ) ) {
throw new DBConnectionError( $this, "Oracle functions missing, have you compiled PHP with the --with-oci8 option?\n (Note: if you recently installed PHP, you may need to restart your webserver and database)\n" );
}
- $this->close();
- $this->mServer = $server;
$this->mUser = $user;
$this->mPassword = $password;
- $this->mDBname = $dbName;
+ // changed internal variables functions
+ // mServer now holds the TNS endpoint
+ // mDBname is schema name if different from username
+ if ( !$server ) {
+ // backward compatibillity (server used to be null and TNS was supplied in dbname)
+ $this->mServer = $dbName;
+ $this->mDBname = $user;
+ } else {
+ $this->mServer = $server;
+ if ( !$dbName ) {
+ $this->mDBname = $user;
+ } else {
+ $this->mDBname = $dbName;
+ }
+ }
if ( !strlen( $user ) ) { # e.g. the class is being loaded
return;
@@ -244,16 +256,18 @@ class DatabaseOracle extends DatabaseBase {
$session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
if ( $this->mFlags & DBO_DEFAULT ) {
- $this->mConn = oci_new_connect( $user, $password, $dbName, $this->defaultCharset, $session_mode );
+ $this->mConn = oci_new_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
} else {
- $this->mConn = oci_connect( $user, $password, $dbName, $this->defaultCharset, $session_mode );
+ $this->mConn = oci_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
}
- if ( $this->mConn == false ) {
- wfDebug( "DB connection error\n" );
- wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
- wfDebug( $this->lastError() . "\n" );
- return false;
+ if ( $this->mUser != $this->mDBname ) {
+ //change current schema in session
+ $this->selectDB( $this->mDBname );
+ }
+
+ if ( !$this->mConn ) {
+ throw new DBConnectionError( $this, $this->lastError() );
}
$this->mOpened = true;
@@ -271,6 +285,9 @@ class DatabaseOracle extends DatabaseBase {
function close() {
$this->mOpened = false;
if ( $this->mConn ) {
+ if ( $this->mTrxLevel ) {
+ $this->commit();
+ }
return oci_close( $this->mConn );
} else {
return true;
@@ -289,9 +306,10 @@ class DatabaseOracle extends DatabaseBase {
// handle some oracle specifics
// remove AS column/table/subquery namings
- if ( !defined( 'MEDIAWIKI_INSTALL' ) ) {
+ if( !$this->getFlag( DBO_DDLMODE ) ) {
$sql = preg_replace( '/ as /i', ' ', $sql );
}
+
// Oracle has issues with UNION clause if the statement includes LOB fields
// So we do a UNION ALL and then filter the results array with array_unique
$union_unique = ( preg_match( '/\/\* UNION_UNIQUE \*\/ /', $sql ) != 0 );
@@ -301,23 +319,22 @@ class DatabaseOracle extends DatabaseBase {
$sql = preg_replace( '/^EXPLAIN /', 'EXPLAIN PLAN SET STATEMENT_ID = \'' . $explain_id . '\' FOR', $sql, 1, $explain_count );
-
wfSuppressWarnings();
if ( ( $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ) ) === false ) {
$e = oci_error( $this->mConn );
- $this->reportQueryError( $e['message'], $e['code'], $sql, __FUNCTION__ );
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
}
- if ( oci_execute( $stmt, $this->execFlags() ) == false ) {
+ if ( !oci_execute( $stmt, $this->execFlags() ) ) {
$e = oci_error( $stmt );
if ( !$this->ignore_DUP_VAL_ON_INDEX || $e['code'] != '1' ) {
- $this->reportQueryError( $e['message'], $e['code'], $sql, __FUNCTION__ );
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
}
}
-
+
wfRestoreWarnings();
if ( $explain_count > 0 ) {
@@ -335,43 +352,43 @@ class DatabaseOracle extends DatabaseBase {
}
function freeResult( $res ) {
- if ( $res instanceof ORAResult ) {
- $res->free();
- } else {
- $res->result->free();
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
}
+
+ $res->free();
}
function fetchObject( $res ) {
- if ( $res instanceof ORAResult ) {
- return $res->numRows();
- } else {
- return $res->result->fetchObject();
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
}
+
+ return $res->fetchObject();
}
function fetchRow( $res ) {
- if ( $res instanceof ORAResult ) {
- return $res->fetchRow();
- } else {
- return $res->result->fetchRow();
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
}
+
+ return $res->fetchRow();
}
function numRows( $res ) {
- if ( $res instanceof ORAResult ) {
- return $res->numRows();
- } else {
- return $res->result->numRows();
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
}
+
+ return $res->numRows();
}
function numFields( $res ) {
- if ( $res instanceof ORAResult ) {
- return $res->numFields();
- } else {
- return $res->result->numFields();
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
}
+
+ return $res->numFields();
}
function fieldName( $stmt, $n ) {
@@ -456,8 +473,38 @@ class DatabaseOracle extends DatabaseBase {
return $retVal;
}
+ private function fieldBindStatement ( $table, $col, &$val, $includeCol = false ) {
+ $col_info = $this->fieldInfoMulti( $table, $col );
+ $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
+
+ $bind = '';
+ if ( is_numeric( $col ) ) {
+ $bind = $val;
+ $val = null;
+ return $bind;
+ } else if ( $includeCol ) {
+ $bind = "$col = ";
+ }
+
+ if ( $val == '' && $val !== 0 && $col_type != 'BLOB' && $col_type != 'CLOB' ) {
+ $val = null;
+ }
+
+ if ( $val === null ) {
+ if ( $col_info != false && $col_info->isNullable() == 0 && $col_info->defaultValue() != null ) {
+ $bind .= 'DEFAULT';
+ } else {
+ $bind .= 'NULL';
+ }
+ } else {
+ $bind .= ':' . $col;
+ }
+
+ return $bind;
+ }
+
private function insertOneRow( $table, $row, $fname ) {
- global $wgLang;
+ global $wgContLang;
$table = $this->tableName( $table );
// "INSERT INTO tables (a, b, c)"
@@ -466,18 +513,22 @@ class DatabaseOracle extends DatabaseBase {
// for each value, append ":key"
$first = true;
- foreach ( $row as $col => $val ) {
- if ( $first ) {
- $sql .= $val !== null ? ':' . $col : 'NULL';
+ foreach ( $row as $col => &$val ) {
+ if ( !$first ) {
+ $sql .= ', ';
} else {
- $sql .= $val !== null ? ', :' . $col : ', NULL';
+ $first = false;
}
-
- $first = false;
+
+ $sql .= $this->fieldBindStatement( $table, $col, $val );
}
$sql .= ')';
- $stmt = oci_parse( $this->mConn, $sql );
+ if ( ( $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ) ) === false ) {
+ $e = oci_error( $this->mConn );
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+ return false;
+ }
foreach ( $row as $col => &$val ) {
$col_info = $this->fieldInfoMulti( $table, $col );
$col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
@@ -486,16 +537,17 @@ class DatabaseOracle extends DatabaseBase {
// do nothing ... null was inserted in statement creation
} elseif ( $col_type != 'BLOB' && $col_type != 'CLOB' ) {
if ( is_object( $val ) ) {
- $val = $val->getData();
+ $val = $val->fetch();
}
if ( preg_match( '/^timestamp.*/i', $col_type ) == 1 && strtolower( $val ) == 'infinity' ) {
$val = '31-12-2030 12:00:00.000000';
}
- $val = ( $wgLang != null ) ? $wgLang->checkTitleEncoding( $val ) : $val;
+ $val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val;
if ( oci_bind_by_name( $stmt, ":$col", $val ) === false ) {
- $this->reportQueryError( $this->lastErrno(), $this->lastError(), $sql, __METHOD__ );
+ $e = oci_error( $stmt );
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
}
} else {
@@ -504,11 +556,15 @@ class DatabaseOracle extends DatabaseBase {
throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
}
- if ( $col_type == 'BLOB' ) { // is_object($val)) {
- $lob[$col]->writeTemporary( $val ); // ->getData());
- oci_bind_by_name( $stmt, ":$col", $lob[$col], - 1, SQLT_BLOB );
+ if ( is_object( $val ) ) {
+ $val = $val->fetch();
+ }
+
+ if ( $col_type == 'BLOB' ) {
+ $lob[$col]->writeTemporary( $val, OCI_TEMP_BLOB );
+ oci_bind_by_name( $stmt, ":$col", $lob[$col], - 1, OCI_B_BLOB );
} else {
- $lob[$col]->writeTemporary( $val );
+ $lob[$col]->writeTemporary( $val, OCI_TEMP_CLOB );
oci_bind_by_name( $stmt, ":$col", $lob[$col], - 1, OCI_B_CLOB );
}
}
@@ -516,9 +572,8 @@ class DatabaseOracle extends DatabaseBase {
wfSuppressWarnings();
- if ( oci_execute( $stmt, OCI_DEFAULT ) === false ) {
+ if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
$e = oci_error( $stmt );
-
if ( !$this->ignore_DUP_VAL_ON_INDEX || $e['code'] != '1' ) {
$this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
return false;
@@ -532,7 +587,7 @@ class DatabaseOracle extends DatabaseBase {
wfRestoreWarnings();
if ( isset( $lob ) ) {
- foreach ( $lob as $lob_i => $lob_v ) {
+ foreach ( $lob as $lob_v ) {
$lob_v->free();
}
}
@@ -560,11 +615,13 @@ class DatabaseOracle extends DatabaseBase {
if ( ( $sequenceData = $this->getSequenceData( $destTable ) ) !== false &&
!isset( $varMap[$sequenceData['column']] ) )
+ {
$varMap[$sequenceData['column']] = 'GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')';
+ }
// count-alias subselect fields to avoid abigious definition errors
$i = 0;
- foreach ( $varMap as $key => &$val ) {
+ foreach ( $varMap as &$val ) {
$val = $val . ' field' . ( $i++ );
}
@@ -640,13 +697,18 @@ class DatabaseOracle extends DatabaseBase {
if ( isset( $database ) ) {
$database = ( $database[0] == '"' ? $database : "\"{$database}\"" );
}
- $table = ( $table[0] == '"' ? $table : "\"{$prefix}{$table}\"" );
+ $table = ( $table[0] == '"') ? $table : "\"{$prefix}{$table}\"" ;
$tableName = ( isset( $database ) ? "{$database}.{$table}" : "{$table}" );
return strtoupper( $tableName );
}
+ function tableNameInternal( $name ) {
+ $name = $this->tableName( $name );
+ return preg_replace( '/.*\."(.*)"/', '$1', $name);
+ }
+
/**
* Return the next in a sequence, save the value for retrieval via insertId()
*/
@@ -654,7 +716,6 @@ class DatabaseOracle extends DatabaseBase {
$res = $this->query( "SELECT $seqName.nextval FROM dual" );
$row = $this->fetchRow( $res );
$this->mInsertId = $row[0];
- $this->freeResult( $res );
return $this->mInsertId;
}
@@ -663,7 +724,7 @@ class DatabaseOracle extends DatabaseBase {
*/
private function getSequenceData( $table ) {
if ( $this->sequenceData == null ) {
- $result = $this->query( "SELECT lower(us.sequence_name), lower(utc.table_name), lower(utc.column_name) from user_sequences us, user_tab_columns utc where us.sequence_name = utc.table_name||'_'||utc.column_name||'_SEQ'" );
+ $result = $this->doQuery( 'SELECT lower(us.sequence_name), lower(utc.table_name), lower(utc.column_name) from user_sequences us, user_tab_columns utc where us.sequence_name = utc.table_name||\'_\'||utc.column_name||\'_SEQ\'' );
while ( ( $row = $result->fetchRow() ) !== false ) {
$this->sequenceData[$this->tableName( $row[1] )] = array(
@@ -676,15 +737,23 @@ class DatabaseOracle extends DatabaseBase {
return ( isset( $this->sequenceData[$table] ) ) ? $this->sequenceData[$table] : false;
}
- # REPLACE query wrapper
- # Oracle simulates this with a DELETE followed by INSERT
- # $row is the row to insert, an associative array
- # $uniqueIndexes is an array of indexes. Each element may be either a
- # field name or an array of field names
- #
- # It may be more efficient to leave off unique indexes which are unlikely to collide.
- # However if you do this, you run the risk of encountering errors which wouldn't have
- # occurred in MySQL
+ /**
+ * REPLACE query wrapper
+ * Oracle simulates this with a DELETE followed by INSERT
+ * $row is the row to insert, an associative array
+ * $uniqueIndexes is an array of indexes. Each element may be either a
+ * field name or an array of field names
+ *
+ * It may be more efficient to leave off unique indexes which are unlikely to collide.
+ * However if you do this, you run the risk of encountering errors which wouldn't have
+ * occurred in MySQL.
+ *
+ * @param $table String: table name
+ * @param $uniqueIndexes Array: array of indexes. Each element may be
+ * either a field name or an array of field names
+ * @param $rows Array: rows to insert to $table
+ * @param $fname String: function name, you can use __METHOD__ here
+ */
function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseOracle::replace' ) {
$table = $this->tableName( $table );
@@ -703,9 +772,10 @@ class DatabaseOracle extends DatabaseBase {
# Delete rows which collide
if ( $uniqueIndexes ) {
$condsDelete = array();
- foreach ( $uniqueIndexes as $index )
+ foreach ( $uniqueIndexes as $index ) {
$condsDelete[$index] = $row[$index];
- if (count($condsDelete) > 0) {
+ }
+ if ( count( $condsDelete ) > 0 ) {
$this->delete( $table, $condsDelete, $fname );
}
}
@@ -720,9 +790,9 @@ class DatabaseOracle extends DatabaseBase {
}
# DELETE where the condition is a join
- function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = "DatabaseOracle::deleteJoin" ) {
+ function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseOracle::deleteJoin' ) {
if ( !$conds ) {
- throw new DBUnexpectedError( $this, 'DatabaseOracle::deleteJoin() called with empty $conds' );
+ throw new DBUnexpectedError( $this, 'DatabaseOracle::deleteJoin() called with empty $conds' );
}
$delTable = $this->tableName( $delTable );
@@ -738,13 +808,8 @@ class DatabaseOracle extends DatabaseBase {
# Returns the size of a text field, or -1 for "unlimited"
function textFieldSize( $table, $field ) {
- $fieldInfoData = $this->fieldInfo( $table, $field);
- if ( $fieldInfoData->type == "varchar" ) {
- $size = $row->size - 4;
- } else {
- $size = $row->size;
- }
- return $size;
+ $fieldInfoData = $this->fieldInfo( $table, $field );
+ return $fieldInfoData->maxLength();
}
function limitResult( $sql, $limit, $offset = false ) {
@@ -754,40 +819,73 @@ class DatabaseOracle extends DatabaseBase {
return "SELECT * FROM ($sql) WHERE rownum >= (1 + $offset) AND rownum < (1 + $limit + $offset)";
}
+ function encodeBlob( $b ) {
+ return new Blob( $b );
+ }
+
+ function decodeBlob( $b ) {
+ if ( $b instanceof Blob ) {
+ $b = $b->fetch();
+ }
+ return $b;
+ }
function unionQueries( $sqls, $all ) {
$glue = ' UNION ALL ';
return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')' ;
}
+ public function unixTimestamp( $field ) {
+ return "((trunc($field) - to_date('19700101','YYYYMMDD')) * 86400)";
+ }
+
function wasDeadlock() {
return $this->lastErrno() == 'OCI-00060';
}
-
function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseOracle::duplicateTableStructure' ) {
- $temporary = $temporary ? 'TRUE' : 'FALSE';
- $oldName = trim(strtoupper($oldName), '"');
- $oldParts = explode('_', $oldName);
+ global $wgDBprefix;
- $newName = trim(strtoupper($newName), '"');
- $newParts = explode('_', $newName);
-
- $oldPrefix = '';
- $newPrefix = '';
- for ($i = count($oldParts)-1; $i >= 0; $i--) {
- if ($oldParts[$i] != $newParts[$i]) {
- $oldPrefix = implode('_', $oldParts).'_';
- $newPrefix = implode('_', $newParts).'_';
- break;
- }
- unset($oldParts[$i]);
- unset($newParts[$i]);
+ $temporary = $temporary ? 'TRUE' : 'FALSE';
+
+ $newName = trim( strtoupper( $newName ), '"');
+ $oldName = trim( strtoupper( $oldName ), '"');
+
+ $tabName = substr( $newName, strlen( $wgDBprefix ) );
+ $oldPrefix = substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) );
+
+ return $this->doQuery( 'BEGIN DUPLICATE_TABLE(\'' . $tabName . '\', \'' . $oldPrefix . '\', \'' . strtoupper( $wgDBprefix ) . '\', ' . $temporary . '); END;' );
+ }
+
+ function listTables( $prefix = null, $fname = 'DatabaseOracle::listTables' ) {
+ $listWhere = '';
+ if (!empty($prefix)) {
+ $listWhere = ' AND table_name LIKE \''.strtoupper($prefix).'%\'';
}
- $tabName = substr($oldName, strlen($oldPrefix));
+ $result = $this->doQuery( "SELECT table_name FROM user_tables WHERE table_name NOT LIKE '%!_IDX$_' ESCAPE '!' $listWhere" );
+
+ // dirty code ... i know
+ $endArray = array();
+ $endArray[] = $prefix.'MWUSER';
+ $endArray[] = $prefix.'PAGE';
+ $endArray[] = $prefix.'IMAGE';
+ $fixedOrderTabs = $endArray;
+ while (($row = $result->fetchRow()) !== false) {
+ if (!in_array($row['table_name'], $fixedOrderTabs))
+ $endArray[] = $row['table_name'];
+ }
+
+ return $endArray;
+ }
+
+ public function dropTable( $tableName, $fName = 'DatabaseOracle::dropTable' ) {
+ $tableName = $this->tableName($tableName);
+ if( !$this->tableExists( $tableName ) ) {
+ return false;
+ }
- return $this->query( 'BEGIN DUPLICATE_TABLE(\'' . $tabName . '\', \'' . $oldPrefix . '\', \''.$newPrefix.'\', ' . $temporary . '); END;', $fname );
+ return $this->doQuery( "DROP TABLE $tableName CASCADE CONSTRAINTS PURGE" );
}
function timestamp( $ts = 0 ) {
@@ -818,7 +916,7 @@ class DatabaseOracle extends DatabaseBase {
/**
* @return string wikitext of a link to the server software's web site
*/
- function getSoftwareLink() {
+ public static function getSoftwareLink() {
return '[http://www.oracle.com/ Oracle]';
}
@@ -826,14 +924,21 @@ class DatabaseOracle extends DatabaseBase {
* @return string Version information from the database
*/
function getServerVersion() {
- return oci_server_version( $this->mConn );
+ //better version number, fallback on driver
+ $rset = $this->doQuery( 'SELECT version FROM product_component_version WHERE UPPER(product) LIKE \'ORACLE DATABASE%\'' );
+ if ( !( $row = $rset->fetchRow() ) ) {
+ return oci_server_version( $this->mConn );
+ }
+ return $row['version'];
}
/**
* Query whether a given table exists (in the given schema, or the default mw one if not given)
*/
function tableExists( $table ) {
- $SQL = "SELECT 1 FROM user_tables WHERE table_name='$table'";
+ $table = $this->addQuotes( trim( $this->tableName($table), '"' ) );
+ $owner = $this->addQuotes( strtoupper( $this->mDBname ) );
+ $SQL = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
$res = $this->doQuery( $SQL );
if ( $res ) {
$count = $res->numRows();
@@ -841,7 +946,7 @@ class DatabaseOracle extends DatabaseBase {
} else {
$count = 0;
}
- return $count;
+ return $count!=0;
}
/**
@@ -850,76 +955,78 @@ class DatabaseOracle extends DatabaseBase {
* For internal calls. Use fieldInfo for normal usage.
* Returns false if the field doesn't exist
*
- * @param Array $table
- * @param String $field
+ * @param $table Array
+ * @param $field String
*/
private function fieldInfoMulti( $table, $field ) {
- $tableWhere = '';
- $field = strtoupper($field);
- if (is_array($table)) {
- $table = array_map( array( &$this, 'tableName' ), $table );
+ $field = strtoupper( $field );
+ if ( is_array( $table ) ) {
+ $table = array_map( array( &$this, 'tableNameInternal' ), $table );
$tableWhere = 'IN (';
- foreach($table as &$singleTable) {
- $singleTable = strtoupper(trim( $singleTable, '"' ));
- if (isset($this->mFieldInfoCache["$singleTable.$field"])) {
+ foreach( $table as &$singleTable ) {
+ $singleTable = strtoupper( trim( $singleTable, '"' ) );
+ if ( isset( $this->mFieldInfoCache["$singleTable.$field"] ) ) {
return $this->mFieldInfoCache["$singleTable.$field"];
}
- $tableWhere .= '\''.$singleTable.'\',';
+ $tableWhere .= '\'' . $singleTable . '\',';
}
- $tableWhere = rtrim($tableWhere, ',').')';
+ $tableWhere = rtrim( $tableWhere, ',' ) . ')';
} else {
- $table = strtoupper(trim( $this->tableName($table), '"' ));
- if (isset($this->mFieldInfoCache["$table.$field"])) {
+ $table = strtoupper( trim( $this->tableNameInternal( $table ), '"' ) );
+ if ( isset( $this->mFieldInfoCache["$table.$field"] ) ) {
return $this->mFieldInfoCache["$table.$field"];
}
$tableWhere = '= \''.$table.'\'';
}
$fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name '.$tableWhere.' and column_name = \''.$field.'\'' );
- if ( oci_execute( $fieldInfoStmt, OCI_DEFAULT ) === false ) {
+ if ( oci_execute( $fieldInfoStmt, $this->execFlags() ) === false ) {
$e = oci_error( $fieldInfoStmt );
$this->reportQueryError( $e['message'], $e['code'], 'fieldInfo QUERY', __METHOD__ );
return false;
}
$res = new ORAResult( $this, $fieldInfoStmt );
- if ($res->numRows() == 0 ) {
- if (is_array($table)) {
- foreach($table as &$singleTable) {
+ if ( $res->numRows() == 0 ) {
+ if ( is_array( $table ) ) {
+ foreach( $table as &$singleTable ) {
$this->mFieldInfoCache["$singleTable.$field"] = false;
}
} else {
$this->mFieldInfoCache["$table.$field"] = false;
}
+ $fieldInfoTemp = null;
} else {
$fieldInfoTemp = new ORAField( $res->fetchRow() );
$table = $fieldInfoTemp->tableName();
$this->mFieldInfoCache["$table.$field"] = $fieldInfoTemp;
- return $fieldInfoTemp;
}
+ $res->free();
+ return $fieldInfoTemp;
}
function fieldInfo( $table, $field ) {
if ( is_array( $table ) ) {
- throw new DBUnexpectedError( $this, 'Database::fieldInfo called with table array!' );
+ throw new DBUnexpectedError( $this, 'DatabaseOracle::fieldInfo called with table array!' );
}
return $this->fieldInfoMulti ($table, $field);
}
- function fieldExists( $table, $field, $fname = 'DatabaseOracle::fieldExists' ) {
- return (bool)$this->fieldInfo( $table, $field, $fname );
- }
-
- function begin( $fname = '' ) {
+ function begin( $fname = 'DatabaseOracle::begin' ) {
$this->mTrxLevel = 1;
}
- function immediateCommit( $fname = '' ) {
- return true;
+ function commit( $fname = 'DatabaseOracle::commit' ) {
+ if ( $this->mTrxLevel ) {
+ oci_commit( $this->mConn );
+ $this->mTrxLevel = 0;
+ }
}
- function commit( $fname = '' ) {
- oci_commit( $this->mConn );
- $this->mTrxLevel = 0;
+ function rollback( $fname = 'DatabaseOracle::rollback' ) {
+ if ( $this->mTrxLevel ) {
+ oci_rollback( $this->mConn );
+ $this->mTrxLevel = 0;
+ }
}
/* Not even sure why this is used in the main codebase... */
@@ -928,7 +1035,7 @@ class DatabaseOracle extends DatabaseBase {
}
/* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
- function sourceStream( $fp, $lineCallback = false, $resultCallback = false ) {
+ function sourceStream( $fp, $lineCallback = false, $resultCallback = false, $fname = 'DatabaseOracle::sourceStream' ) {
$cmd = '';
$done = false;
$dollarquote = false;
@@ -953,6 +1060,7 @@ class DatabaseOracle extends DatabaseBase {
if ( substr( $line, 0, 8 ) == '/*$mw$*/' ) {
if ( $dollarquote ) {
$dollarquote = false;
+ $line = str_replace( '/*$mw$*/', '', $line ); // remove dollarquotes
$done = true;
} else {
$dollarquote = true;
@@ -977,11 +1085,11 @@ class DatabaseOracle extends DatabaseBase {
}
} else {
foreach ( $replacements as $mwVar => $scVar ) {
- $cmd = str_replace( '&' . $scVar . '.', '{$' . $mwVar . '}', $cmd );
+ $cmd = str_replace( '&' . $scVar . '.', '`{$' . $mwVar . '}`', $cmd );
}
$cmd = $this->replaceVars( $cmd );
- $res = $this->query( $cmd, __METHOD__ );
+ $res = $this->doQuery( $cmd );
if ( $resultCallback ) {
call_user_func( $resultCallback, $res, $this );
}
@@ -999,36 +1107,24 @@ class DatabaseOracle extends DatabaseBase {
return true;
}
- function setup_database() {
- global $wgVersion, $wgDBmwschema, $wgDBts2schema, $wgDBport, $wgDBuser;
-
- $res = $this->sourceFile( "../maintenance/ora/tables.sql" );
- if ($res === true) {
- print " done.</li>\n";
- } else {
- print " <b>FAILED</b></li>\n";
- dieout( htmlspecialchars( $res ) );
- }
-
- // Avoid the non-standard "REPLACE INTO" syntax
- echo "<li>Populating interwiki table</li>\n";
- $f = fopen( "../maintenance/interwiki.sql", 'r' );
- if ( $f == false ) {
- dieout( "Could not find the interwiki.sql file" );
+ function selectDB( $db ) {
+ $this->mDBname = $db;
+ if ( $db == null || $db == $this->mUser ) {
+ return true;
}
-
- // do it like the postgres :D
- $SQL = "INSERT INTO ".$this->tableName('interwiki')." (iw_prefix,iw_url,iw_local) VALUES ";
- while ( !feof( $f ) ) {
- $line = fgets( $f, 1024 );
- $matches = array();
- if ( !preg_match( '/^\s*(\(.+?),(\d)\)/', $line, $matches ) ) {
- continue;
+ $sql = 'ALTER SESSION SET CURRENT_SCHEMA=' . strtoupper($db);
+ $stmt = oci_parse( $this->mConn, $sql );
+ wfSuppressWarnings();
+ $success = oci_execute( $stmt );
+ wfRestoreWarnings();
+ if ( !$success ) {
+ $e = oci_error( $stmt );
+ if ( $e['code'] != '1435' ) {
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
}
- $this->query( "$SQL $matches[1],$matches[2])" );
+ return false;
}
-
- echo "<li>Table interwiki successfully populated</li>\n";
+ return true;
}
function strencode( $s ) {
@@ -1036,35 +1132,42 @@ class DatabaseOracle extends DatabaseBase {
}
function addQuotes( $s ) {
- global $wgLang;
- if ( isset( $wgLang->mLoaded ) && $wgLang->mLoaded ) {
- $s = $wgLang->checkTitleEncoding( $s );
+ global $wgContLang;
+ if ( isset( $wgContLang->mLoaded ) && $wgContLang->mLoaded ) {
+ $s = $wgContLang->checkTitleEncoding( $s );
}
return "'" . $this->strencode( $s ) . "'";
}
- function quote_ident( $s ) {
+ public function addIdentifierQuotes( $s ) {
+ if ( !$this->mFlags & DBO_DDLMODE ) {
+ $s = '"' . str_replace( '"', '""', $s ) . '"';
+ }
return $s;
}
function selectRow( $table, $vars, $conds, $fname = 'DatabaseOracle::selectRow', $options = array(), $join_conds = array() ) {
- global $wgLang;
+ global $wgContLang;
- $conds2 = array();
- $conds = ($conds != null && !is_array($conds)) ? array($conds) : $conds;
- foreach ( $conds as $col => $val ) {
- $col_info = $this->fieldInfoMulti( $table, $col );
- $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
- if ( $col_type == 'CLOB' ) {
- $conds2['TO_CHAR(' . $col . ')'] = $wgLang->checkTitleEncoding( $val );
- } elseif ( $col_type == 'VARCHAR2' && !mb_check_encoding( $val ) ) {
- $conds2[$col] = $wgLang->checkTitleEncoding( $val );
- } else {
- $conds2[$col] = $val;
+ if ($conds != null) {
+ $conds2 = array();
+ $conds = ( !is_array( $conds ) ) ? array( $conds ) : $conds;
+ foreach ( $conds as $col => $val ) {
+ $col_info = $this->fieldInfoMulti( $table, $col );
+ $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
+ if ( $col_type == 'CLOB' ) {
+ $conds2['TO_CHAR(' . $col . ')'] = $wgContLang->checkTitleEncoding( $val );
+ } elseif ( $col_type == 'VARCHAR2' && !mb_check_encoding( $val ) ) {
+ $conds2[$col] = $wgContLang->checkTitleEncoding( $val );
+ } else {
+ $conds2[$col] = $val;
+ }
}
- }
- return parent::selectRow( $table, $vars, $conds2, $fname, $options, $join_conds );
+ return parent::selectRow( $table, $vars, $conds2, $fname, $options, $join_conds );
+ } else {
+ return parent::selectRow( $table, $vars, $conds, $fname, $options, $join_conds );
+ }
}
/**
@@ -1111,24 +1214,24 @@ class DatabaseOracle extends DatabaseBase {
}
public function delete( $table, $conds, $fname = 'DatabaseOracle::delete' ) {
- global $wgLang;
+ global $wgContLang;
- if ( $wgLang != null ) {
+ if ( $wgContLang != null && $conds != null && $conds != '*' ) {
$conds2 = array();
- $conds = ($conds != null && !is_array($conds)) ? array($conds) : $conds;
+ $conds = ( !is_array( $conds ) ) ? array( $conds ) : $conds;
foreach ( $conds as $col => $val ) {
$col_info = $this->fieldInfoMulti( $table, $col );
$col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
if ( $col_type == 'CLOB' ) {
- $conds2['TO_CHAR(' . $col . ')'] = $wgLang->checkTitleEncoding( $val );
+ $conds2['TO_CHAR(' . $col . ')'] = $wgContLang->checkTitleEncoding( $val );
} else {
if ( is_array( $val ) ) {
$conds2[$col] = $val;
foreach ( $conds2[$col] as &$val2 ) {
- $val2 = $wgLang->checkTitleEncoding( $val2 );
+ $val2 = $wgContLang->checkTitleEncoding( $val2 );
}
} else {
- $conds2[$col] = $wgLang->checkTitleEncoding( $val );
+ $conds2[$col] = $wgContLang->checkTitleEncoding( $val );
}
}
}
@@ -1139,9 +1242,103 @@ class DatabaseOracle extends DatabaseBase {
}
}
+ function update( $table, $values, $conds, $fname = 'DatabaseOracle::update', $options = array() ) {
+ global $wgContLang;
+
+ $table = $this->tableName( $table );
+ $opts = $this->makeUpdateOptions( $options );
+ $sql = "UPDATE $opts $table SET ";
+
+ $first = true;
+ foreach ( $values as $col => &$val ) {
+ $sqlSet = $this->fieldBindStatement( $table, $col, $val, true );
+
+ if ( !$first ) {
+ $sqlSet = ', ' . $sqlSet;
+ } else {
+ $first = false;
+ }
+ $sql .= $sqlSet;
+ }
+
+ if ( $conds != '*' ) {
+ $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
+ }
+
+ if ( ( $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ) ) === false ) {
+ $e = oci_error( $this->mConn );
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+ return false;
+ }
+ foreach ( $values as $col => &$val ) {
+ $col_info = $this->fieldInfoMulti( $table, $col );
+ $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
+
+ if ( $val === null ) {
+ // do nothing ... null was inserted in statement creation
+ } elseif ( $col_type != 'BLOB' && $col_type != 'CLOB' ) {
+ if ( is_object( $val ) ) {
+ $val = $val->getData();
+ }
+
+ if ( preg_match( '/^timestamp.*/i', $col_type ) == 1 && strtolower( $val ) == 'infinity' ) {
+ $val = '31-12-2030 12:00:00.000000';
+ }
+
+ $val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val;
+ if ( oci_bind_by_name( $stmt, ":$col", $val ) === false ) {
+ $e = oci_error( $stmt );
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+ return false;
+ }
+ } else {
+ if ( ( $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ) ) === false ) {
+ $e = oci_error( $stmt );
+ throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
+ }
+
+ if ( $col_type == 'BLOB' ) {
+ $lob[$col]->writeTemporary( $val );
+ oci_bind_by_name( $stmt, ":$col", $lob[$col], - 1, SQLT_BLOB );
+ } else {
+ $lob[$col]->writeTemporary( $val );
+ oci_bind_by_name( $stmt, ":$col", $lob[$col], - 1, OCI_B_CLOB );
+ }
+ }
+ }
+
+ wfSuppressWarnings();
+
+ if ( oci_execute( $stmt, $this->execFlags() ) === false ) {
+ $e = oci_error( $stmt );
+ if ( !$this->ignore_DUP_VAL_ON_INDEX || $e['code'] != '1' ) {
+ $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
+ return false;
+ } else {
+ $this->mAffectedRows = oci_num_rows( $stmt );
+ }
+ } else {
+ $this->mAffectedRows = oci_num_rows( $stmt );
+ }
+
+ wfRestoreWarnings();
+
+ if ( isset( $lob ) ) {
+ foreach ( $lob as $lob_v ) {
+ $lob_v->free();
+ }
+ }
+
+ if ( !$this->mTrxLevel ) {
+ oci_commit( $this->mConn );
+ }
+
+ oci_free_statement( $stmt );
+ }
+
function bitNot( $field ) {
// expecting bit-fields smaller than 4bytes
- return 'BITNOT(' . $bitField . ')';
+ return 'BITNOT(' . $field . ')';
}
function bitAnd( $fieldLeft, $fieldRight ) {
@@ -1152,17 +1349,6 @@ class DatabaseOracle extends DatabaseBase {
return 'BITOR(' . $fieldLeft . ', ' . $fieldRight . ')';
}
- /**
- * How lagged is this slave?
- *
- * @return int
- */
- public function getLag() {
- # Not implemented for Oracle
- return 0;
- }
-
- function setFakeSlaveLag( $lag ) { }
function setFakeMaster( $enabled = true ) { }
function getDBname() {
@@ -1173,26 +1359,6 @@ class DatabaseOracle extends DatabaseBase {
return $this->mServer;
}
- public function replaceVars( $ins ) {
- $varnames = array( 'wgDBprefix' );
- if ( $this->mFlags & DBO_SYSDBA ) {
- $varnames[] = 'wgDBOracleDefTS';
- $varnames[] = 'wgDBOracleTempTS';
- }
-
- // Ordinary variables
- foreach ( $varnames as $var ) {
- if ( isset( $GLOBALS[$var] ) ) {
- $val = addslashes( $GLOBALS[$var] ); // FIXME: safety check?
- $ins = str_replace( '{$' . $var . '}', $val, $ins );
- $ins = str_replace( '/*$' . $var . '*/`', '`' . $val, $ins );
- $ins = str_replace( '/*$' . $var . '*/', $val, $ins );
- }
- }
-
- return parent::replaceVars( $ins );
- }
-
public function getSearchEngine() {
return 'SearchOracle';
}
diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php
index 9072a5b2..bc71a9a5 100644
--- a/includes/db/DatabasePostgres.php
+++ b/includes/db/DatabasePostgres.php
@@ -1,46 +1,59 @@
<?php
/**
- * @ingroup Database
- * @file
* This is the Postgres database abstraction layer.
*
+ * @file
+ * @ingroup Database
*/
-class PostgresField {
- private $name, $tablename, $type, $nullable, $max_length;
+
+class PostgresField implements Field {
+ private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname;
static function fromText($db, $table, $field) {
global $wgDBmwschema;
$q = <<<SQL
SELECT
-CASE WHEN typname = 'int2' THEN 'smallint'
-WHEN typname = 'int4' THEN 'integer'
-WHEN typname = 'int8' THEN 'bigint'
-WHEN typname = 'bpchar' THEN 'char'
-ELSE typname END AS typname,
-attnotnull, attlen
-FROM pg_class, pg_namespace, pg_attribute, pg_type
-WHERE relnamespace=pg_namespace.oid
-AND relkind='r'
-AND attrelid=pg_class.oid
-AND atttypid=pg_type.oid
+ attnotnull, attlen, COALESCE(conname, '') AS conname,
+ COALESCE(condeferred, 'f') AS deferred,
+ COALESCE(condeferrable, 'f') AS deferrable,
+ CASE WHEN typname = 'int2' THEN 'smallint'
+ WHEN typname = 'int4' THEN 'integer'
+ WHEN typname = 'int8' THEN 'bigint'
+ WHEN typname = 'bpchar' THEN 'char'
+ ELSE typname END AS typname
+FROM pg_class c
+JOIN pg_namespace n ON (n.oid = c.relnamespace)
+JOIN pg_attribute a ON (a.attrelid = c.oid)
+JOIN pg_type t ON (t.oid = a.atttypid)
+LEFT JOIN pg_constraint o ON (o.conrelid = c.oid AND a.attnum = ANY(o.conkey) AND o.contype = 'f')
+WHERE relkind = 'r'
AND nspname=%s
AND relname=%s
AND attname=%s;
SQL;
- $res = $db->query(sprintf($q,
- $db->addQuotes($wgDBmwschema),
- $db->addQuotes($table),
- $db->addQuotes($field)));
- $row = $db->fetchObject($res);
- if (!$row)
+
+ $table = $db->tableName( $table );
+ $res = $db->query(
+ sprintf( $q,
+ $db->addQuotes( $wgDBmwschema ),
+ $db->addQuotes( $table ),
+ $db->addQuotes( $field )
+ )
+ );
+ $row = $db->fetchObject( $res );
+ if ( !$row ) {
return null;
+ }
$n = new PostgresField;
$n->type = $row->typname;
- $n->nullable = ($row->attnotnull == 'f');
+ $n->nullable = ( $row->attnotnull == 'f' );
$n->name = $field;
$n->tablename = $table;
$n->max_length = $row->attlen;
+ $n->deferrable = ( $row->deferrable == 't' );
+ $n->deferred = ( $row->deferred == 't' );
+ $n->conname = $row->conname;
return $n;
}
@@ -56,13 +69,26 @@ SQL;
return $this->type;
}
- function nullable() {
+ function isNullable() {
return $this->nullable;
}
function maxLength() {
return $this->max_length;
}
+
+ function is_deferrable() {
+ return $this->deferrable;
+ }
+
+ function is_deferred() {
+ return $this->deferred;
+ }
+
+ function conname() {
+ return $this->conname;
+ }
+
}
/**
@@ -74,16 +100,6 @@ class DatabasePostgres extends DatabaseBase {
var $numeric_version = null;
var $mAffectedRows = null;
- function DatabasePostgres($server = false, $user = false, $password = false, $dbName = false,
- $failFunction = false, $flags = 0 )
- {
-
- $this->mFailFunction = $failFunction;
- $this->mFlags = $flags;
- $this->open( $server, $user, $password, $dbName);
-
- }
-
function getType() {
return 'postgres';
}
@@ -115,18 +131,18 @@ class DatabasePostgres extends DatabaseBase {
function hasConstraint( $name ) {
global $wgDBmwschema;
- $SQL = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n WHERE c.connamespace = n.oid AND conname = '" . pg_escape_string( $name ) . "' AND n.nspname = '" . pg_escape_string($wgDBmwschema) ."'";
- return $this->numRows($res = $this->doQuery($SQL));
+ $SQL = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n WHERE c.connamespace = n.oid AND conname = '" .
+ pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" . pg_escape_string( $this->mConn, $wgDBmwschema ) ."'";
+ $res = $this->doQuery( $SQL );
+ return $this->numRows( $res );
}
- static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0)
- {
- return new DatabasePostgres( $server, $user, $password, $dbName, $failFunction, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
+ return new DatabasePostgres( $server, $user, $password, $dbName, $flags );
}
/**
* Usually aborts on failure
- * If the failFunction is set to a non-zero integer, returns success
*/
function open( $server, $user, $password, $dbName ) {
# Test for Postgres support, to avoid suppressed fatal error
@@ -136,7 +152,7 @@ class DatabasePostgres extends DatabaseBase {
global $wgDBport;
- if (!strlen($user)) { ## e.g. the class is being loaded
+ if ( !strlen( $user ) ) { # e.g. the class is being loaded
return;
}
$this->close();
@@ -149,11 +165,12 @@ class DatabasePostgres extends DatabaseBase {
$connectVars = array(
'dbname' => $dbName,
'user' => $user,
- 'password' => $password );
- if ($server!=false && $server!="") {
+ 'password' => $password
+ );
+ if ( $server != false && $server != '' ) {
$connectVars['host'] = $server;
}
- if ($port!=false && $port!="") {
+ if ( $port != false && $port != '' ) {
$connectVars['port'] = $port;
}
$connectString = $this->makeConnectionString( $connectVars, PGSQL_CONNECT_FORCE_NEW );
@@ -162,35 +179,30 @@ class DatabasePostgres extends DatabaseBase {
$this->mConn = pg_connect( $connectString );
$phpError = $this->restoreErrorHandler();
- if ( $this->mConn == false ) {
+ if ( !$this->mConn ) {
wfDebug( "DB connection error\n" );
wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
- wfDebug( $this->lastError()."\n" );
- if ( !$this->mFailFunction ) {
- throw new DBConnectionError( $this, $phpError );
- } else {
- return false;
- }
+ wfDebug( $this->lastError() . "\n" );
+ throw new DBConnectionError( $this, str_replace( "\n", ' ', $phpError ) );
}
$this->mOpened = true;
global $wgCommandLineMode;
- ## If called from the command-line (e.g. importDump), only show errors
- if ($wgCommandLineMode) {
+ # If called from the command-line (e.g. importDump), only show errors
+ if ( $wgCommandLineMode ) {
$this->doQuery( "SET client_min_messages = 'ERROR'" );
}
$this->doQuery( "SET client_encoding='UTF8'" );
global $wgDBmwschema, $wgDBts2schema;
- if (isset( $wgDBmwschema ) && isset( $wgDBts2schema )
+ if ( isset( $wgDBmwschema ) && isset( $wgDBts2schema )
&& $wgDBmwschema !== 'mediawiki'
&& preg_match( '/^\w+$/', $wgDBmwschema )
&& preg_match( '/^\w+$/', $wgDBts2schema )
) {
- $safeschema = $this->quote_ident($wgDBmwschema);
- $safeschema2 = $this->quote_ident($wgDBts2schema);
+ $safeschema = $this->addIdentifierQuotes( $wgDBmwschema );
$this->doQuery( "SET search_path = $safeschema, $wgDBts2schema, public" );
}
@@ -205,365 +217,6 @@ class DatabasePostgres extends DatabaseBase {
return $s;
}
-
- function initial_setup($password, $dbName) {
- // If this is the initial connection, setup the schema stuff and possibly create the user
- global $wgDBname, $wgDBuser, $wgDBpassword, $wgDBsuperuser, $wgDBmwschema, $wgDBts2schema;
-
- print "<li>Checking the version of Postgres...";
- $version = $this->getServerVersion();
- $PGMINVER = '8.1';
- if ($version < $PGMINVER) {
- print "<b>FAILED</b>. Required version is $PGMINVER. You have " . htmlspecialchars( $version ) . "</li>\n";
- dieout("</ul>");
- }
- print "version " . htmlspecialchars( $this->numeric_version ) . " is OK.</li>\n";
-
- $safeuser = $this->quote_ident($wgDBuser);
- // Are we connecting as a superuser for the first time?
- if ($wgDBsuperuser) {
- // Are we really a superuser? Check out our rights
- $SQL = "SELECT
- CASE WHEN usesuper IS TRUE THEN
- CASE WHEN usecreatedb IS TRUE THEN 3 ELSE 1 END
- ELSE CASE WHEN usecreatedb IS TRUE THEN 2 ELSE 0 END
- END AS rights
- FROM pg_catalog.pg_user WHERE usename = " . $this->addQuotes($wgDBsuperuser);
- $rows = $this->numRows($res = $this->doQuery($SQL));
- if (!$rows) {
- print "<li>ERROR: Could not read permissions for user \"" . htmlspecialchars( $wgDBsuperuser ) . "\"</li>\n";
- dieout('</ul>');
- }
- $perms = pg_fetch_result($res, 0, 0);
-
- $SQL = "SELECT 1 FROM pg_catalog.pg_user WHERE usename = " . $this->addQuotes($wgDBuser);
- $rows = $this->numRows($this->doQuery($SQL));
- if ($rows) {
- print "<li>User \"" . htmlspecialchars( $wgDBuser ) . "\" already exists, skipping account creation.</li>";
- }
- else {
- if ($perms != 1 and $perms != 3) {
- print "<li>ERROR: the user \"" . htmlspecialchars( $wgDBsuperuser ) . "\" cannot create other users. ";
- print 'Please use a different Postgres user.</li>';
- dieout('</ul>');
- }
- print "<li>Creating user <b>" . htmlspecialchars( $wgDBuser ) . "</b>...";
- $safepass = $this->addQuotes($wgDBpassword);
- $SQL = "CREATE USER $safeuser NOCREATEDB PASSWORD $safepass";
- $this->doQuery($SQL);
- print "OK</li>\n";
- }
- // User now exists, check out the database
- if ($dbName != $wgDBname) {
- $SQL = "SELECT 1 FROM pg_catalog.pg_database WHERE datname = " . $this->addQuotes($wgDBname);
- $rows = $this->numRows($this->doQuery($SQL));
- if ($rows) {
- print "<li>Database \"" . htmlspecialchars( $wgDBname ) . "\" already exists, skipping database creation.</li>";
- }
- else {
- if ($perms < 1) {
- print "<li>ERROR: the user \"" . htmlspecialchars( $wgDBsuperuser ) . "\" cannot create databases. ";
- print 'Please use a different Postgres user.</li>';
- dieout('</ul>');
- }
- print "<li>Creating database <b>" . htmlspecialchars( $wgDBname ) . "</b>...";
- $safename = $this->quote_ident($wgDBname);
- $SQL = "CREATE DATABASE $safename OWNER $safeuser ";
- $this->doQuery($SQL);
- print "OK</li>\n";
- // Hopefully tsearch2 and plpgsql are in template1...
- }
-
- // Reconnect to check out tsearch2 rights for this user
- print "<li>Connecting to \"" . htmlspecialchars( $wgDBname ) . "\" as superuser \"" .
- htmlspecialchars( $wgDBsuperuser ) . "\" to check rights...";
-
- $connectVars = array();
- if ($this->mServer!=false && $this->mServer!="") {
- $connectVars['host'] = $this->mServer;
- }
- if ($this->mPort!=false && $this->mPort!="") {
- $connectVars['port'] = $this->mPort;
- }
- $connectVars['dbname'] = $wgDBname;
- $connectVars['user'] = $wgDBsuperuser;
- $connectVars['password'] = $password;
-
- @$this->mConn = pg_connect( $this->makeConnectionString( $connectVars ) );
- if ( $this->mConn == false ) {
- print "<b>FAILED TO CONNECT!</b></li>";
- dieout("</ul>");
- }
- print "OK</li>\n";
- }
-
- if ($this->numeric_version < 8.3) {
- // Tsearch2 checks
- print "<li>Checking that tsearch2 is installed in the database \"" .
- htmlspecialchars( $wgDBname ) . "\"...";
- if (! $this->tableExists("pg_ts_cfg", $wgDBts2schema)) {
- print "<b>FAILED</b>. tsearch2 must be installed in the database \"" .
- htmlspecialchars( $wgDBname ) . "\".";
- print "Please see <a href='http://www.devx.com/opensource/Article/21674/0/page/2'>this article</a>";
- print " for instructions or ask on #postgresql on irc.freenode.net</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
- print "<li>Ensuring that user \"" . htmlspecialchars( $wgDBuser ) .
- "\" has select rights on the tsearch2 tables...";
- foreach (array('cfg','cfgmap','dict','parser') as $table) {
- $SQL = "GRANT SELECT ON pg_ts_$table TO $safeuser";
- $this->doQuery($SQL);
- }
- print "OK</li>\n";
- }
-
- // Setup the schema for this user if needed
- $result = $this->schemaExists($wgDBmwschema);
- $safeschema = $this->quote_ident($wgDBmwschema);
- if (!$result) {
- print "<li>Creating schema <b>" . htmlspecialchars( $wgDBmwschema ) . "</b> ...";
- $result = $this->doQuery("CREATE SCHEMA $safeschema AUTHORIZATION $safeuser");
- if (!$result) {
- print "<b>FAILED</b>.</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
- }
- else {
- print "<li>Schema already exists, explicitly granting rights...\n";
- $safeschema2 = $this->addQuotes($wgDBmwschema);
- $SQL = "SELECT 'GRANT ALL ON '||pg_catalog.quote_ident(relname)||' TO $safeuser;'\n".
- "FROM pg_catalog.pg_class p, pg_catalog.pg_namespace n\n".
- "WHERE relnamespace = n.oid AND n.nspname = $safeschema2\n".
- "AND p.relkind IN ('r','S','v')\n";
- $SQL .= "UNION\n";
- $SQL .= "SELECT 'GRANT ALL ON FUNCTION '||pg_catalog.quote_ident(proname)||'('||\n".
- "pg_catalog.oidvectortypes(p.proargtypes)||') TO $safeuser;'\n".
- "FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n\n".
- "WHERE p.pronamespace = n.oid AND n.nspname = $safeschema2";
- $res = $this->doQuery($SQL);
- if (!$res) {
- print "<b>FAILED</b>. Could not set rights for the user.</li>\n";
- dieout("</ul>");
- }
- $this->doQuery("SET search_path = $safeschema");
- $rows = $this->numRows($res);
- while ($rows) {
- $rows--;
- $this->doQuery(pg_fetch_result($res, $rows, 0));
- }
- print "OK</li>";
- }
-
- // Install plpgsql if needed
- $this->setup_plpgsql();
-
- $wgDBsuperuser = '';
- return true; // Reconnect as regular user
-
- } // end superuser
-
- if (!defined('POSTGRES_SEARCHPATH')) {
-
- if ($this->numeric_version < 8.3) {
- // Do we have the basic tsearch2 table?
- print "<li>Checking for tsearch2 in the schema \"" . htmlspecialchars( $wgDBts2schema ) . "\"...";
- if (! $this->tableExists("pg_ts_dict", $wgDBts2schema)) {
- print "<b>FAILED</b>. Make sure tsearch2 is installed. See <a href=";
- print "'http://www.devx.com/opensource/Article/21674/0/page/2'>this article</a>";
- print " for instructions.</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
-
- // Does this user have the rights to the tsearch2 tables?
- $ctype = pg_fetch_result($this->doQuery("SHOW lc_ctype"),0,0);
- print "<li>Checking tsearch2 permissions...";
- // Let's check all four, just to be safe
- error_reporting( 0 );
- $ts2tables = array('cfg','cfgmap','dict','parser');
- $safetsschema = $this->quote_ident($wgDBts2schema);
- foreach ( $ts2tables AS $tname ) {
- $SQL = "SELECT count(*) FROM $safetsschema.pg_ts_$tname";
- $res = $this->doQuery($SQL);
- if (!$res) {
- print "<b>FAILED</b> to access " . htmlspecialchars( "pg_ts_$tname" ) .
- ". Make sure that the user \"". htmlspecialchars( $wgDBuser ) .
- "\" has SELECT access to all four tsearch2 tables</li>\n";
- dieout("</ul>");
- }
- }
- $SQL = "SELECT ts_name FROM $safetsschema.pg_ts_cfg WHERE locale = " . $this->addQuotes( $ctype ) ;
- $SQL .= " ORDER BY CASE WHEN ts_name <> 'default' THEN 1 ELSE 0 END";
- $res = $this->doQuery($SQL);
- error_reporting( E_ALL );
- if (!$res) {
- print "<b>FAILED</b>. Could not determine the tsearch2 locale information</li>\n";
- dieout("</ul>");
- }
- print "OK</li>";
-
- // Will the current locale work? Can we force it to?
- print "<li>Verifying tsearch2 locale with " . htmlspecialchars( $ctype ) . "...";
- $rows = $this->numRows($res);
- $resetlocale = 0;
- if (!$rows) {
- print "<b>not found</b></li>\n";
- print "<li>Attempting to set default tsearch2 locale to \"" . htmlspecialchars( $ctype ) . "\"...";
- $resetlocale = 1;
- }
- else {
- $tsname = pg_fetch_result($res, 0, 0);
- if ($tsname != 'default') {
- print "<b>not set to default (" . htmlspecialchars( $tsname ) . ")</b>";
- print "<li>Attempting to change tsearch2 default locale to \"" .
- htmlspecialchars( $ctype ) . "\"...";
- $resetlocale = 1;
- }
- }
- if ($resetlocale) {
- $SQL = "UPDATE $safetsschema.pg_ts_cfg SET locale = " . $this->addQuotes( $ctype ) . " WHERE ts_name = 'default'";
- $res = $this->doQuery($SQL);
- if (!$res) {
- print "<b>FAILED</b>. ";
- print "Please make sure that the locale in pg_ts_cfg for \"default\" is set to \"" .
- htmlspecialchars( $ctype ) . "\"</li>\n";
- dieout("</ul>");
- }
- print "OK</li>";
- }
-
- // Final test: try out a simple tsearch2 query
- $SQL = "SELECT $safetsschema.to_tsvector('default','MediaWiki tsearch2 testing')";
- $res = $this->doQuery($SQL);
- if (!$res) {
- print "<b>FAILED</b>. Specifically, \"" . htmlspecialchars( $SQL ) . "\" did not work.</li>";
- dieout("</ul>");
- }
- print "OK</li>";
- }
-
- // Install plpgsql if needed
- $this->setup_plpgsql();
-
- // Does the schema already exist? Who owns it?
- $result = $this->schemaExists($wgDBmwschema);
- if (!$result) {
- print "<li>Creating schema <b>" . htmlspecialchars( $wgDBmwschema ) . "</b> ...";
- error_reporting( 0 );
- $safeschema = $this->quote_ident($wgDBmwschema);
- $result = $this->doQuery("CREATE SCHEMA $safeschema");
- error_reporting( E_ALL );
- if (!$result) {
- print "<b>FAILED</b>. The user \"" . htmlspecialchars( $wgDBuser ) .
- "\" must be able to access the schema. ".
- "You can try making them the owner of the database, or try creating the schema with a ".
- "different user, and then grant access to the \"" .
- htmlspecialchars( $wgDBuser ) . "\" user.</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
- }
- else if ($result != $wgDBuser) {
- print "<li>Schema \"" . htmlspecialchars( $wgDBmwschema ) . "\" exists but is not owned by \"" .
- htmlspecialchars( $wgDBuser ) . "\". Not ideal.</li>\n";
- }
- else {
- print "<li>Schema \"" . htmlspecialchars( $wgDBmwschema ) . "\" exists and is owned by \"" .
- htmlspecialchars( $wgDBuser ) . "\". Excellent.</li>\n";
- }
-
- // Always return GMT time to accomodate the existing integer-based timestamp assumption
- print "<li>Setting the timezone to GMT for user \"" . htmlspecialchars( $wgDBuser ) . "\" ...";
- $SQL = "ALTER USER $safeuser SET timezone = 'GMT'";
- $result = pg_query($this->mConn, $SQL);
- if (!$result) {
- print "<b>FAILED</b>.</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
- // Set for the rest of this session
- $SQL = "SET timezone = 'GMT'";
- $result = pg_query($this->mConn, $SQL);
- if (!$result) {
- print "<li>Failed to set timezone</li>\n";
- dieout("</ul>");
- }
-
- print "<li>Setting the datestyle to ISO, YMD for user \"" . htmlspecialchars( $wgDBuser ) . "\" ...";
- $SQL = "ALTER USER $safeuser SET datestyle = 'ISO, YMD'";
- $result = pg_query($this->mConn, $SQL);
- if (!$result) {
- print "<b>FAILED</b>.</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
- // Set for the rest of this session
- $SQL = "SET datestyle = 'ISO, YMD'";
- $result = pg_query($this->mConn, $SQL);
- if (!$result) {
- print "<li>Failed to set datestyle</li>\n";
- dieout("</ul>");
- }
-
- // Fix up the search paths if needed
- print "<li>Setting the search path for user \"" . htmlspecialchars( $wgDBuser ) . "\" ...";
- $path = $this->quote_ident($wgDBmwschema);
- if ($wgDBts2schema !== $wgDBmwschema)
- $path .= ", ". $this->quote_ident($wgDBts2schema);
- if ($wgDBmwschema !== 'public' and $wgDBts2schema !== 'public')
- $path .= ", public";
- $SQL = "ALTER USER $safeuser SET search_path = $path";
- $result = pg_query($this->mConn, $SQL);
- if (!$result) {
- print "<b>FAILED</b>.</li>\n";
- dieout("</ul>");
- }
- print "OK</li>\n";
- // Set for the rest of this session
- $SQL = "SET search_path = $path";
- $result = pg_query($this->mConn, $SQL);
- if (!$result) {
- print "<li>Failed to set search_path</li>\n";
- dieout("</ul>");
- }
- define( "POSTGRES_SEARCHPATH", $path );
- }
- }
-
-
- function setup_plpgsql() {
- print "<li>Checking for Pl/Pgsql ...";
- $SQL = "SELECT 1 FROM pg_catalog.pg_language WHERE lanname = 'plpgsql'";
- $rows = $this->numRows($this->doQuery($SQL));
- if ($rows < 1) {
- // plpgsql is not installed, but if we have a pg_pltemplate table, we should be able to create it
- print "not installed. Attempting to install Pl/Pgsql ...";
- $SQL = "SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace) ".
- "WHERE relname = 'pg_pltemplate' AND nspname='pg_catalog'";
- $rows = $this->numRows($this->doQuery($SQL));
- if ($rows >= 1) {
- $olde = error_reporting(0);
- error_reporting($olde - E_WARNING);
- $result = $this->doQuery("CREATE LANGUAGE plpgsql");
- error_reporting($olde);
- if (!$result) {
- print "<b>FAILED</b>. You need to install the language plpgsql in the database <tt>" .
- htmlspecialchars( $wgDBname ) . "</tt></li>";
- dieout("</ul>");
- }
- }
- else {
- print "<b>FAILED</b>. You need to install the language plpgsql in the database <tt>" .
- htmlspecialchars( $wgDBname ) . "</tt></li>";
- dieout("</ul>");
- }
- }
- print "OK</li>\n";
- }
-
-
/**
* Closes a database connection, if it is open
* Returns success, true if already closed
@@ -578,15 +231,15 @@ class DatabasePostgres extends DatabaseBase {
}
function doQuery( $sql ) {
- if (function_exists('mb_convert_encoding')) {
- $sql = mb_convert_encoding($sql,'UTF-8');
+ if ( function_exists( 'mb_convert_encoding' ) ) {
+ $sql = mb_convert_encoding( $sql, 'UTF-8' );
}
- $this->mLastResult = pg_query( $this->mConn, $sql);
+ $this->mLastResult = pg_query( $this->mConn, $sql );
$this->mAffectedRows = null; // use pg_affected_rows(mLastResult)
return $this->mLastResult;
}
- function queryIgnore( $sql, $fname = '' ) {
+ function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
return $this->query( $sql, $fname, true );
}
@@ -595,7 +248,7 @@ class DatabasePostgres extends DatabaseBase {
$res = $res->result;
}
if ( !@pg_free_result( $res ) ) {
- throw new DBUnexpectedError($this, "Unable to free Postgres result\n" );
+ throw new DBUnexpectedError( $this, "Unable to free Postgres result\n" );
}
}
@@ -609,8 +262,8 @@ class DatabasePostgres extends DatabaseBase {
# TODO:
# hashar : not sure if the following test really trigger if the object
# fetching failed.
- if( pg_last_error($this->mConn) ) {
- throw new DBUnexpectedError($this, 'SQL error: ' . htmlspecialchars( pg_last_error($this->mConn) ) );
+ if( pg_last_error( $this->mConn ) ) {
+ throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
}
return $row;
}
@@ -620,8 +273,8 @@ class DatabasePostgres extends DatabaseBase {
$res = $res->result;
}
@$row = pg_fetch_array( $res );
- if( pg_last_error($this->mConn) ) {
- throw new DBUnexpectedError($this, 'SQL error: ' . htmlspecialchars( pg_last_error($this->mConn) ) );
+ if( pg_last_error( $this->mConn ) ) {
+ throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
}
return $row;
}
@@ -631,17 +284,19 @@ class DatabasePostgres extends DatabaseBase {
$res = $res->result;
}
@$n = pg_num_rows( $res );
- if( pg_last_error($this->mConn) ) {
- throw new DBUnexpectedError($this, 'SQL error: ' . htmlspecialchars( pg_last_error($this->mConn) ) );
+ if( pg_last_error( $this->mConn ) ) {
+ throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
}
return $n;
}
+
function numFields( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
return pg_num_fields( $res );
}
+
function fieldName( $res, $n ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -666,9 +321,8 @@ class DatabasePostgres extends DatabaseBase {
function lastError() {
if ( $this->mConn ) {
return pg_last_error();
- }
- else {
- return "No database connection";
+ } else {
+ return 'No database connection';
}
}
function lastErrno() {
@@ -680,8 +334,9 @@ class DatabasePostgres extends DatabaseBase {
// Forced result for simulated queries
return $this->mAffectedRows;
}
- if( empty( $this->mLastResult ) )
+ if( empty( $this->mLastResult ) ) {
return 0;
+ }
return pg_affected_rows( $this->mLastResult );
}
@@ -692,8 +347,7 @@ class DatabasePostgres extends DatabaseBase {
* Returns -1 if count cannot be found
* Takes same arguments as Database::select()
*/
-
- function estimateRowCount( $table, $vars='*', $conds='', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
+ function estimateRowCount( $table, $vars = '*', $conds='', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
$options['EXPLAIN'] = true;
$res = $this->select( $table, $vars, $conds, $fname, $options );
$rows = -1;
@@ -703,12 +357,10 @@ class DatabasePostgres extends DatabaseBase {
if( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
$rows = $count[1];
}
- $this->freeResult($res);
}
return $rows;
}
-
/**
* Returns information about an index
* If errors are explicitly ignored, returns NULL on failure
@@ -719,7 +371,7 @@ class DatabasePostgres extends DatabaseBase {
if ( !$res ) {
return null;
}
- while ( $row = $this->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( $row->indexname == $this->indexName( $index ) ) {
return $row;
}
@@ -727,18 +379,19 @@ class DatabasePostgres extends DatabaseBase {
return false;
}
- function indexUnique ($table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
+ function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
$sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
- " AND indexdef LIKE 'CREATE UNIQUE%(" .
+ " AND indexdef LIKE 'CREATE UNIQUE%(" .
$this->strencode( $this->indexName( $index ) ) .
")'";
$res = $this->query( $sql, $fname );
- if ( !$res )
+ if ( !$res ) {
return null;
- while ($row = $this->fetchObject( $res ))
+ }
+ foreach ( $res as $row ) {
return true;
+ }
return false;
-
}
/**
@@ -755,25 +408,23 @@ class DatabasePostgres extends DatabaseBase {
* @return bool Success of insert operation. IGNORE always returns true.
*/
function insert( $table, $args, $fname = 'DatabasePostgres::insert', $options = array() ) {
- global $wgDBversion;
-
if ( !count( $args ) ) {
return true;
}
$table = $this->tableName( $table );
- if (! isset( $wgDBversion ) ) {
- $wgDBversion = $this->getServerVersion();
+ if (! isset( $this->numeric_version ) ) {
+ $this->getServerVersion();
}
- if ( !is_array( $options ) )
+ if ( !is_array( $options ) ) {
$options = array( $options );
+ }
if ( isset( $args[0] ) && is_array( $args[0] ) ) {
$multi = true;
$keys = array_keys( $args[0] );
- }
- else {
+ } else {
$multi = false;
$keys = array_keys( $args );
}
@@ -784,7 +435,7 @@ class DatabasePostgres extends DatabaseBase {
// If we are not in a transaction, we need to be for savepoint trickery
$didbegin = 0;
if ( $ignore ) {
- if (! $this->mTrxLevel) {
+ if ( !$this->mTrxLevel ) {
$this->begin();
$didbegin = 1;
}
@@ -797,7 +448,7 @@ class DatabasePostgres extends DatabaseBase {
$sql = "INSERT INTO $table (" . implode( ',', $keys ) . ') VALUES ';
if ( $multi ) {
- if ( $wgDBversion >= 8.2 && !$ignore ) {
+ if ( $this->numeric_version >= 8.2 && !$ignore ) {
$first = true;
foreach ( $args as $row ) {
if ( $first ) {
@@ -808,8 +459,7 @@ class DatabasePostgres extends DatabaseBase {
$sql .= '(' . $this->makeList( $row ) . ')';
}
$res = (bool)$this->query( $sql, $fname, $ignore );
- }
- else {
+ } else {
$res = true;
$origsql = $sql;
foreach ( $args as $row ) {
@@ -817,17 +467,16 @@ class DatabasePostgres extends DatabaseBase {
$tempsql .= '(' . $this->makeList( $row ) . ')';
if ( $ignore ) {
- pg_query($this->mConn, "SAVEPOINT $ignore");
+ pg_query( $this->mConn, "SAVEPOINT $ignore" );
}
$tempres = (bool)$this->query( $tempsql, $fname, $ignore );
if ( $ignore ) {
$bar = pg_last_error();
- if ($bar != false) {
+ if ( $bar != false ) {
pg_query( $this->mConn, "ROLLBACK TO $ignore" );
- }
- else {
+ } else {
pg_query( $this->mConn, "RELEASE $ignore" );
$numrowsinserted++;
}
@@ -835,12 +484,12 @@ class DatabasePostgres extends DatabaseBase {
// If any of them fail, we fail overall for this function call
// Note that this will be ignored if IGNORE is set
- if (! $tempres)
+ if ( !$tempres ) {
$res = false;
+ }
}
}
- }
- else {
+ } else {
// Not multi, just a lone insert
if ( $ignore ) {
pg_query($this->mConn, "SAVEPOINT $ignore");
@@ -850,10 +499,9 @@ class DatabasePostgres extends DatabaseBase {
$res = (bool)$this->query( $sql, $fname, $ignore );
if ( $ignore ) {
$bar = pg_last_error();
- if ($bar != false) {
+ if ( $bar != false ) {
pg_query( $this->mConn, "ROLLBACK TO $ignore" );
- }
- else {
+ } else {
pg_query( $this->mConn, "RELEASE $ignore" );
$numrowsinserted++;
}
@@ -861,7 +509,7 @@ class DatabasePostgres extends DatabaseBase {
}
if ( $ignore ) {
$olde = error_reporting( $olde );
- if ($didbegin) {
+ if ( $didbegin ) {
$this->commit();
}
@@ -872,9 +520,7 @@ class DatabasePostgres extends DatabaseBase {
return true;
}
-
return $res;
-
}
/**
@@ -884,7 +530,7 @@ class DatabasePostgres extends DatabaseBase {
* $conds may be "*" to copy the whole table
* srcTable may be an array of tables.
* @todo FIXME: implement this a little better (seperate select/insert)?
- */
+ */
function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabasePostgres::insertSelect',
$insertOptions = array(), $selectOptions = array() )
{
@@ -922,7 +568,7 @@ class DatabasePostgres extends DatabaseBase {
" SELECT $startOpts " . implode( ',', $varMap ) .
" FROM $srcTable $useIndex";
- if ( $conds != '*') {
+ if ( $conds != '*' ) {
$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
}
@@ -951,7 +597,7 @@ class DatabasePostgres extends DatabaseBase {
return $res;
}
-
+
function tableName( $name ) {
# Replace reserved words with better ones
switch( $name ) {
@@ -968,11 +614,10 @@ class DatabasePostgres extends DatabaseBase {
* Return the next in a sequence, save the value for retrieval via insertId()
*/
function nextSequenceValue( $seqName ) {
- $safeseq = preg_replace( "/'/", "''", $seqName );
+ $safeseq = str_replace( "'", "''", $seqName );
$res = $this->query( "SELECT nextval('$safeseq')" );
$row = $this->fetchRow( $res );
$this->mInsertId = $row[0];
- $this->freeResult( $res );
return $this->mInsertId;
}
@@ -980,27 +625,28 @@ class DatabasePostgres extends DatabaseBase {
* Return the current value of a sequence. Assumes it has been nextval'ed in this session.
*/
function currentSequenceValue( $seqName ) {
- $safeseq = preg_replace( "/'/", "''", $seqName );
+ $safeseq = str_replace( "'", "''", $seqName );
$res = $this->query( "SELECT currval('$safeseq')" );
$row = $this->fetchRow( $res );
$currval = $row[0];
- $this->freeResult( $res );
return $currval;
}
- # REPLACE query wrapper
- # Postgres simulates this with a DELETE followed by INSERT
- # $row is the row to insert, an associative array
- # $uniqueIndexes is an array of indexes. Each element may be either a
- # field name or an array of field names
- #
- # It may be more efficient to leave off unique indexes which are unlikely to collide.
- # However if you do this, you run the risk of encountering errors which wouldn't have
- # occurred in MySQL
+ /**
+ * REPLACE query wrapper
+ * Postgres simulates this with a DELETE followed by INSERT
+ * $row is the row to insert, an associative array
+ * $uniqueIndexes is an array of indexes. Each element may be either a
+ * field name or an array of field names
+ *
+ * It may be more efficient to leave off unique indexes which are unlikely to collide.
+ * However if you do this, you run the risk of encountering errors which wouldn't have
+ * occurred in MySQL
+ */
function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabasePostgres::replace' ) {
$table = $this->tableName( $table );
- if (count($rows)==0) {
+ if ( count( $rows ) == 0 ) {
return;
}
@@ -1017,7 +663,7 @@ class DatabasePostgres extends DatabaseBase {
foreach ( $uniqueIndexes as $index ) {
if ( $first ) {
$first = false;
- $sql .= "(";
+ $sql .= '(';
} else {
$sql .= ') OR (';
}
@@ -1049,7 +695,7 @@ class DatabasePostgres extends DatabaseBase {
# DELETE where the condition is a join
function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabasePostgres::deleteJoin' ) {
if ( !$conds ) {
- throw new DBUnexpectedError($this, 'Database::deleteJoin() called with empty $conds' );
+ throw new DBUnexpectedError( $this, 'DatabasePostgres::deleteJoin() called with empty $conds' );
}
$delTable = $this->tableName( $delTable );
@@ -1070,19 +716,18 @@ class DatabasePostgres extends DatabaseBase {
FROM pg_class c, pg_attribute a, pg_type t
WHERE relname='$table' AND a.attrelid=c.oid AND
a.atttypid=t.oid and a.attname='$field'";
- $res =$this->query($sql);
- $row=$this->fetchObject($res);
- if ($row->ftype=="varchar") {
- $size=$row->size-4;
+ $res =$this->query( $sql );
+ $row = $this->fetchObject( $res );
+ if ( $row->ftype == 'varchar' ) {
+ $size = $row->size - 4;
} else {
- $size=$row->size;
+ $size = $row->size;
}
- $this->freeResult( $res );
return $size;
}
- function limitResult($sql, $limit, $offset=false) {
- return "$sql LIMIT $limit ".(is_numeric($offset)?" OFFSET {$offset} ":"");
+ function limitResult( $sql, $limit, $offset = false ) {
+ return "$sql LIMIT $limit " . ( is_numeric( $offset ) ? " OFFSET {$offset} " : '' );
}
function wasDeadlock() {
@@ -1093,57 +738,40 @@ class DatabasePostgres extends DatabaseBase {
return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName (LIKE $oldName INCLUDING DEFAULTS)", $fname );
}
- function timestamp( $ts=0 ) {
- return wfTimestamp(TS_POSTGRES,$ts);
+ function timestamp( $ts = 0 ) {
+ return wfTimestamp( TS_POSTGRES, $ts );
}
/**
* Return aggregated value function call
*/
- function aggregateValue ($valuedata,$valuename='value') {
+ function aggregateValue( $valuedata, $valuename = 'value' ) {
return $valuedata;
}
-
- function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
- // Ignore errors during error handling to avoid infinite recursion
- $ignore = $this->ignoreErrors( true );
- $this->mErrorCount++;
-
- if ($ignore || $tempIgnore) {
- wfDebug("SQL ERROR (ignored): $error\n");
- $this->ignoreErrors( $ignore );
- }
- else {
- $message = "A database error has occurred\n" .
- "Query: $sql\n" .
- "Function: $fname\n" .
- "Error: $errno $error\n";
- throw new DBUnexpectedError($this, $message);
- }
- }
-
/**
* @return string wikitext of a link to the server software's web site
*/
- function getSoftwareLink() {
- return "[http://www.postgresql.org/ PostgreSQL]";
+ public static function getSoftwareLink() {
+ return '[http://www.postgresql.org/ PostgreSQL]';
}
/**
* @return string Version information from the database
*/
function getServerVersion() {
- $versionInfo = pg_version( $this->mConn );
- if ( version_compare( $versionInfo['client'], '7.4.0', 'lt' ) ) {
- // Old client, abort install
- $this->numeric_version = '7.3 or earlier';
- } elseif ( isset( $versionInfo['server'] ) ) {
- // Normal client
- $this->numeric_version = $versionInfo['server'];
- } else {
- // Bug 16937: broken pgsql extension from PHP<5.3
- $this->numeric_version = pg_parameter_status( $this->mConn, 'server_version' );
+ if ( !isset( $this->numeric_version ) ) {
+ $versionInfo = pg_version( $this->mConn );
+ if ( version_compare( $versionInfo['client'], '7.4.0', 'lt' ) ) {
+ // Old client, abort install
+ $this->numeric_version = '7.3 or earlier';
+ } elseif ( isset( $versionInfo['server'] ) ) {
+ // Normal client
+ $this->numeric_version = $versionInfo['server'];
+ } else {
+ // Bug 16937: broken pgsql extension from PHP<5.3
+ $this->numeric_version = pg_parameter_status( $this->mConn, 'server_version' );
+ }
}
return $this->numeric_version;
}
@@ -1154,23 +782,23 @@ class DatabasePostgres extends DatabaseBase {
*/
function relationExists( $table, $types, $schema = false ) {
global $wgDBmwschema;
- if ( !is_array( $types ) )
+ if ( !is_array( $types ) ) {
$types = array( $types );
- if ( !$schema )
+ }
+ if ( !$schema ) {
$schema = $wgDBmwschema;
+ }
$etable = $this->addQuotes( $table );
$eschema = $this->addQuotes( $schema );
$SQL = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "
. "WHERE c.relnamespace = n.oid AND c.relname = $etable AND n.nspname = $eschema "
- . "AND c.relkind IN ('" . implode("','", $types) . "')";
+ . "AND c.relkind IN ('" . implode( "','", $types ) . "')";
$res = $this->query( $SQL );
$count = $res ? $res->numRows() : 0;
- if ($res)
- $this->freeResult( $res );
- return $count ? true : false;
+ return (bool)$count;
}
- /*
+ /**
* For backward compatibility, this function checks both tables and
* views.
*/
@@ -1191,82 +819,71 @@ class DatabasePostgres extends DatabaseBase {
AND tgrelid=pg_class.oid
AND nspname=%s AND relname=%s AND tgname=%s
SQL;
- $res = $this->query(sprintf($q,
- $this->addQuotes($wgDBmwschema),
- $this->addQuotes($table),
- $this->addQuotes($trigger)));
- if (!$res)
+ $res = $this->query(
+ sprintf(
+ $q,
+ $this->addQuotes( $wgDBmwschema ),
+ $this->addQuotes( $table ),
+ $this->addQuotes( $trigger )
+ )
+ );
+ if ( !$res ) {
return null;
+ }
$rows = $res->numRows();
- $this->freeResult( $res );
return $rows;
}
function ruleExists( $table, $rule ) {
global $wgDBmwschema;
- $exists = $this->selectField("pg_rules", "rulename",
- array( "rulename" => $rule,
- "tablename" => $table,
- "schemaname" => $wgDBmwschema ) );
+ $exists = $this->selectField( 'pg_rules', 'rulename',
+ array(
+ 'rulename' => $rule,
+ 'tablename' => $table,
+ 'schemaname' => $wgDBmwschema
+ )
+ );
return $exists === $rule;
}
function constraintExists( $table, $constraint ) {
global $wgDBmwschema;
- $SQL = sprintf("SELECT 1 FROM information_schema.table_constraints ".
+ $SQL = sprintf( "SELECT 1 FROM information_schema.table_constraints ".
"WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
- $this->addQuotes($wgDBmwschema),
- $this->addQuotes($table),
- $this->addQuotes($constraint));
- $res = $this->query($SQL);
- if (!$res)
+ $this->addQuotes( $wgDBmwschema ),
+ $this->addQuotes( $table ),
+ $this->addQuotes( $constraint )
+ );
+ $res = $this->query( $SQL );
+ if ( !$res ) {
return null;
+ }
$rows = $res->numRows();
- $this->freeResult($res);
return $rows;
}
/**
- * Query whether a given schema exists. Returns the name of the owner
+ * Query whether a given schema exists. Returns true if it does, false if it doesn't.
*/
function schemaExists( $schema ) {
- $eschema = preg_replace("/'/", "''", $schema);
- $SQL = "SELECT rolname FROM pg_catalog.pg_namespace n, pg_catalog.pg_roles r "
- ."WHERE n.nspowner=r.oid AND n.nspname = '$eschema'";
- $res = $this->query( $SQL );
- if ( $res && $res->numRows() ) {
- $row = $res->fetchObject();
- $owner = $row->rolname;
- } else {
- $owner = false;
- }
- if ($res)
- $this->freeResult($res);
- return $owner;
+ $exists = $this->selectField( '"pg_catalog"."pg_namespace"', 1,
+ array( 'nspname' => $schema ), __METHOD__ );
+ return (bool)$exists;
}
/**
- * Query whether a given column exists in the mediawiki schema
+ * Returns true if a given role (i.e. user) exists, false otherwise.
*/
- function fieldExists( $table, $field, $fname = 'DatabasePostgres::fieldExists' ) {
- global $wgDBmwschema;
- $etable = preg_replace("/'/", "''", $table);
- $eschema = preg_replace("/'/", "''", $wgDBmwschema);
- $ecol = preg_replace("/'/", "''", $field);
- $SQL = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a "
- . "WHERE c.relnamespace = n.oid AND c.relname = '$etable' AND n.nspname = '$eschema' "
- . "AND a.attrelid = c.oid AND a.attname = '$ecol'";
- $res = $this->query( $SQL, $fname );
- $count = $res ? $res->numRows() : 0;
- if ($res)
- $this->freeResult( $res );
- return $count;
+ function roleExists( $roleName ) {
+ $exists = $this->selectField( '"pg_catalog"."pg_roles"', 1,
+ array( 'rolname' => $roleName ), __METHOD__ );
+ return (bool)$exists;
}
function fieldInfo( $table, $field ) {
- return PostgresField::fromText($this, $table, $field);
+ return PostgresField::fromText( $this, $table, $field );
}
-
+
/**
* pg_field_type() wrapper
*/
@@ -1277,119 +894,35 @@ SQL;
return pg_field_type( $res, $index );
}
- function begin( $fname = 'DatabasePostgres::begin' ) {
- $this->query( 'BEGIN', $fname );
- $this->mTrxLevel = 1;
- }
- function immediateCommit( $fname = 'DatabasePostgres::immediateCommit' ) {
- return true;
- }
- function commit( $fname = 'DatabasePostgres::commit' ) {
- $this->query( 'COMMIT', $fname );
- $this->mTrxLevel = 0;
- }
-
/* Not even sure why this is used in the main codebase... */
function limitResultForUpdate( $sql, $num ) {
return $sql;
}
- function setup_database() {
- global $wgVersion, $wgDBmwschema, $wgDBts2schema, $wgDBport, $wgDBuser;
-
- // Make sure that we can write to the correct schema
- // If not, Postgres will happily and silently go to the next search_path item
- $ctest = "mediawiki_test_table";
- $safeschema = $this->quote_ident($wgDBmwschema);
- if ($this->tableExists($ctest, $wgDBmwschema)) {
- $this->doQuery("DROP TABLE $safeschema.$ctest");
- }
- $SQL = "CREATE TABLE $safeschema.$ctest(a int)";
- $olde = error_reporting( 0 );
- $res = $this->doQuery($SQL);
- error_reporting( $olde );
- if (!$res) {
- print "<b>FAILED</b>. Make sure that the user \"" . htmlspecialchars( $wgDBuser ) .
- "\" can write to the schema \"" . htmlspecialchars( $wgDBmwschema ) . "\"</li>\n";
- dieout(""); # Will close the main list <ul> and finish the page.
- }
- $this->doQuery("DROP TABLE $safeschema.$ctest");
-
- $res = $this->sourceFile( "../maintenance/postgres/tables.sql" );
- if ($res === true) {
- print " done.</li>\n";
- } else {
- print " <b>FAILED</b></li>\n";
- dieout( htmlspecialchars( $res ) );
- }
-
- ## Update version information
- $mwv = $this->addQuotes($wgVersion);
- $pgv = $this->addQuotes($this->getServerVersion());
- $pgu = $this->addQuotes($this->mUser);
- $mws = $this->addQuotes($wgDBmwschema);
- $tss = $this->addQuotes($wgDBts2schema);
- $pgp = $this->addQuotes($wgDBport);
- $dbn = $this->addQuotes($this->mDBname);
- $ctype = $this->addQuotes( pg_fetch_result($this->doQuery("SHOW lc_ctype"),0,0) );
-
- $SQL = "UPDATE mediawiki_version SET mw_version=$mwv, pg_version=$pgv, pg_user=$pgu, ".
- "mw_schema = $mws, ts2_schema = $tss, pg_port=$pgp, pg_dbname=$dbn, ".
- "ctype = $ctype ".
- "WHERE type = 'Creation'";
- $this->query($SQL);
-
- echo "<li>Populating interwiki table... ";
-
- ## Avoid the non-standard "REPLACE INTO" syntax
- $f = fopen( "../maintenance/interwiki.sql", 'r' );
- if ($f == false ) {
- print "<b>FAILED</b></li>";
- dieout( "Could not find the interwiki.sql file" );
- }
- ## We simply assume it is already empty as we have just created it
- $SQL = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local) VALUES ";
- while ( ! feof( $f ) ) {
- $line = fgets($f,1024);
- $matches = array();
- if (!preg_match('/^\s*(\(.+?),(\d)\)/', $line, $matches)) {
- continue;
- }
- $this->query("$SQL $matches[1],$matches[2])");
- }
- print " successfully populated.</li>\n";
-
- $this->doQuery("COMMIT");
- }
-
function encodeBlob( $b ) {
- return new Blob ( pg_escape_bytea( $b ) ) ;
+ return new Blob( pg_escape_bytea( $this->mConn, $b ) );
}
function decodeBlob( $b ) {
- if ($b instanceof Blob) {
+ if ( $b instanceof Blob ) {
$b = $b->fetch();
}
return pg_unescape_bytea( $b );
}
- function strencode( $s ) { ## Should not be called by us
- return pg_escape_string( $s );
+ function strencode( $s ) { # Should not be called by us
+ return pg_escape_string( $this->mConn, $s );
}
function addQuotes( $s ) {
if ( is_null( $s ) ) {
return 'NULL';
- } else if ( is_bool( $s ) ) {
+ } elseif ( is_bool( $s ) ) {
return intval( $s );
- } else if ($s instanceof Blob) {
- return "'".$s->fetch($s)."'";
+ } elseif ( $s instanceof Blob ) {
+ return "'" . $s->fetch( $s ) . "'";
}
- return "'" . pg_escape_string($s) . "'";
- }
-
- function quote_ident( $s ) {
- return '"' . preg_replace( '/"/', '""', $s) . '"';
+ return "'" . pg_escape_string( $this->mConn, $s ) . "'";
}
/**
@@ -1403,15 +936,14 @@ SQL;
* @return string SQL string
*/
protected function replaceVars( $ins ) {
-
$ins = parent::replaceVars( $ins );
- if ($this->numeric_version >= 8.3) {
+ if ( $this->numeric_version >= 8.3 ) {
// Thanks for not providing backwards-compatibility, 8.3
$ins = preg_replace( "/to_tsvector\s*\(\s*'default'\s*,/", 'to_tsvector(', $ins );
}
- if ($this->numeric_version <= 8.1) { // Our minimum version
+ if ( $this->numeric_version <= 8.1 ) { // Our minimum version
$ins = str_replace( 'USING gin', 'USING gist', $ins );
}
@@ -1438,33 +970,35 @@ SQL;
}
}
- if ( isset( $options['GROUP BY'] ) ) $preLimitTail .= " GROUP BY " . $options['GROUP BY'];
- if ( isset( $options['HAVING'] ) ) $preLimitTail .= " HAVING {$options['HAVING']}";
- if ( isset( $options['ORDER BY'] ) ) $preLimitTail .= " ORDER BY " . $options['ORDER BY'];
+ if ( isset( $options['GROUP BY'] ) ) {
+ $preLimitTail .= ' GROUP BY ' . $options['GROUP BY'];
+ }
+ if ( isset( $options['HAVING'] ) ) {
+ $preLimitTail .= " HAVING {$options['HAVING']}";
+ }
+ if ( isset( $options['ORDER BY'] ) ) {
+ $preLimitTail .= ' ORDER BY ' . $options['ORDER BY'];
+ }
- //if (isset($options['LIMIT'])) {
- // $tailOpts .= $this->limitResult('', $options['LIMIT'],
- // isset($options['OFFSET']) ? $options['OFFSET']
- // : false);
+ //if ( isset( $options['LIMIT'] ) ) {
+ // $tailOpts .= $this->limitResult( '', $options['LIMIT'],
+ // isset( $options['OFFSET'] ) ? $options['OFFSET']
+ // : false );
//}
- if ( isset( $noKeyOptions['FOR UPDATE'] ) ) $postLimitTail .= ' FOR UPDATE';
- if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) $postLimitTail .= ' LOCK IN SHARE MODE';
- if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
+ if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
+ $postLimitTail .= ' FOR UPDATE';
+ }
+ if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) {
+ $postLimitTail .= ' LOCK IN SHARE MODE';
+ }
+ if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
+ $startOpts .= 'DISTINCT';
+ }
return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
}
- /**
- * How lagged is this slave?
- *
- */
- public function getLag() {
- # Not implemented for PostgreSQL
- return false;
- }
-
- function setFakeSlaveLag( $lag ) {}
function setFakeMaster( $enabled = true ) {}
function getDBname() {
@@ -1480,6 +1014,6 @@ SQL;
}
public function getSearchEngine() {
- return "SearchPostgres";
+ return 'SearchPostgres';
}
} // end DatabasePostgres class
diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php
index c149cf04..503ebdf6 100644
--- a/includes/db/DatabaseSqlite.php
+++ b/includes/db/DatabaseSqlite.php
@@ -1,10 +1,10 @@
<?php
/**
- * This script is the SQLite database abstraction layer
- *
+ * This is the SQLite database abstraction layer.
* See maintenance/sqlite/README for development notes and other specific information
- * @ingroup Database
+ *
* @file
+ * @ingroup Database
*/
/**
@@ -12,6 +12,8 @@
*/
class DatabaseSqlite extends DatabaseBase {
+ private static $fulltextEnabled = null;
+
var $mAffectedRows;
var $mLastResult;
var $mDatabaseFile;
@@ -21,11 +23,16 @@ class DatabaseSqlite extends DatabaseBase {
* Constructor.
* Parameters $server, $user and $password are not used.
*/
- function __construct( $server = false, $user = false, $password = false, $dbName = false, $failFunction = false, $flags = 0 ) {
- $this->mFailFunction = $failFunction;
- $this->mFlags = $flags;
+ function __construct( $server = false, $user = false, $password = false, $dbName = false, $flags = 0 ) {
$this->mName = $dbName;
- $this->open( $server, $user, $password, $dbName );
+ parent::__construct( $server, $user, $password, $dbName, $flags );
+ // parent doesn't open when $user is false, but we can work with $dbName
+ if( !$user && $dbName ) {
+ global $wgSharedDB;
+ if( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
+ $this->attachDatabase( $wgSharedDB );
+ }
+ }
}
function getType() {
@@ -37,8 +44,8 @@ class DatabaseSqlite extends DatabaseBase {
*/
function implicitGroupby() { return false; }
- static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 ) {
- return new DatabaseSqlite( $server, $user, $password, $dbName, $failFunction, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
+ return new DatabaseSqlite( $server, $user, $password, $dbName, $flags );
}
/** Open an SQLite database and return a resource handle to it
@@ -49,7 +56,8 @@ class DatabaseSqlite extends DatabaseBase {
$fileName = self::generateFileName( $wgSQLiteDataDir, $dbName );
if ( !is_readable( $fileName ) ) {
- throw new DBConnectionError( $this, "SQLite database not accessible" ); $this->mConn = false;
+ $this->mConn = false;
+ throw new DBConnectionError( $this, "SQLite database not accessible" );
}
$this->openFile( $fileName );
return $this->mConn;
@@ -71,14 +79,9 @@ class DatabaseSqlite extends DatabaseBase {
} catch ( PDOException $e ) {
$err = $e->getMessage();
}
- if ( $this->mConn === false ) {
+ if ( !$this->mConn ) {
wfDebug( "DB connection error: $err\n" );
- if ( !$this->mFailFunction ) {
- throw new DBConnectionError( $this, $err );
- } else {
- return false;
- }
-
+ throw new DBConnectionError( $this, $err );
}
$this->mOpened = !!$this->mConn;
# set error codes only, don't raise exceptions
@@ -111,17 +114,64 @@ class DatabaseSqlite extends DatabaseBase {
}
/**
+ * Check if the searchindext table is FTS enabled.
+ * @returns false if not enabled.
+ */
+ function checkForEnabledSearch() {
+ if ( self::$fulltextEnabled === null ) {
+ self::$fulltextEnabled = false;
+ $table = $this->tableName( 'searchindex' );
+ $res = $this->query( "SELECT sql FROM sqlite_master WHERE tbl_name = '$table'", __METHOD__ );
+ if ( $res ) {
+ $row = $res->fetchRow();
+ self::$fulltextEnabled = stristr($row['sql'], 'fts' ) !== false;
+ }
+ }
+ return self::$fulltextEnabled;
+ }
+
+ /**
* Returns version of currently supported SQLite fulltext search module or false if none present.
* @return String
*/
- function getFulltextSearchModule() {
+ static function getFulltextSearchModule() {
+ static $cachedResult = null;
+ if ( $cachedResult !== null ) {
+ return $cachedResult;
+ }
+ $cachedResult = false;
$table = 'dummy_search_test';
- $this->query( "DROP TABLE IF EXISTS $table", __METHOD__ );
- if ( $this->query( "CREATE VIRTUAL TABLE $table USING FTS3(dummy_field)", __METHOD__, true ) ) {
- $this->query( "DROP TABLE IF EXISTS $table", __METHOD__ );
- return 'FTS3';
+
+ $db = new DatabaseSqliteStandalone( ':memory:' );
+
+ if ( $db->query( "CREATE VIRTUAL TABLE $table USING FTS3(dummy_field)", __METHOD__, true ) ) {
+ $cachedResult = 'FTS3';
}
- return false;
+ $db->close();
+ return $cachedResult;
+ }
+
+ /**
+ * Attaches external database to our connection, see http://sqlite.org/lang_attach.html
+ * for details.
+ * @param $name String: database name to be used in queries like SELECT foo FROM dbname.table
+ * @param $file String: database file name. If omitted, will be generated using $name and $wgSQLiteDataDir
+ * @param $fname String: calling function name
+ */
+ function attachDatabase( $name, $file = false, $fname = 'DatabaseSqlite::attachDatabase' ) {
+ global $wgSQLiteDataDir;
+ if ( !$file ) {
+ $file = self::generateFileName( $wgSQLiteDataDir, $name );
+ }
+ $file = $this->addQuotes( $file );
+ return $this->query( "ATTACH DATABASE $file AS $name", $fname );
+ }
+
+ /**
+ * @see DatabaseBase::isWriteQuery()
+ */
+ function isWriteQuery( $sql ) {
+ return parent::isWriteQuery( $sql ) && !preg_match( '/^ATTACH\b/i', $sql );
}
/**
@@ -140,25 +190,29 @@ class DatabaseSqlite extends DatabaseBase {
}
function freeResult( $res ) {
- if ( $res instanceof ResultWrapper )
+ if ( $res instanceof ResultWrapper ) {
$res->result = null;
- else
+ } else {
$res = null;
+ }
}
function fetchObject( $res ) {
- if ( $res instanceof ResultWrapper )
+ if ( $res instanceof ResultWrapper ) {
$r =& $res->result;
- else
+ } else {
$r =& $res;
+ }
$cur = current( $r );
if ( is_array( $cur ) ) {
next( $r );
$obj = new stdClass;
- foreach ( $cur as $k => $v )
- if ( !is_numeric( $k ) )
+ foreach ( $cur as $k => $v ) {
+ if ( !is_numeric( $k ) ) {
$obj->$k = $v;
+ }
+ }
return $obj;
}
@@ -166,11 +220,11 @@ class DatabaseSqlite extends DatabaseBase {
}
function fetchRow( $res ) {
- if ( $res instanceof ResultWrapper )
+ if ( $res instanceof ResultWrapper ) {
$r =& $res->result;
- else
+ } else {
$r =& $res;
-
+ }
$cur = current( $r );
if ( is_array( $cur ) ) {
next( $r );
@@ -205,6 +259,8 @@ class DatabaseSqlite extends DatabaseBase {
* Use MySQL's naming (accounts for prefix etc) but remove surrounding backticks
*/
function tableName( $name ) {
+ // table names starting with sqlite_ are reserved
+ if ( strpos( $name, 'sqlite_' ) === 0 ) return $name;
return str_replace( '`', '', parent::tableName( $name ) );
}
@@ -223,19 +279,23 @@ class DatabaseSqlite extends DatabaseBase {
}
function dataSeek( $res, $row ) {
- if ( $res instanceof ResultWrapper )
+ if ( $res instanceof ResultWrapper ) {
$r =& $res->result;
- else
+ } else {
$r =& $res;
+ }
reset( $r );
- if ( $row > 0 )
- for ( $i = 0; $i < $row; $i++ )
+ if ( $row > 0 ) {
+ for ( $i = 0; $i < $row; $i++ ) {
next( $r );
+ }
+ }
}
function lastError() {
- if ( !is_object( $this->mConn ) )
+ if ( !is_object( $this->mConn ) ) {
return "Cannot return last error, no db connection";
+ }
$e = $this->mConn->errorInfo();
return isset( $e[2] ) ? $e[2] : '';
}
@@ -298,9 +358,11 @@ class DatabaseSqlite extends DatabaseBase {
* Filter the options used in SELECT statements
*/
function makeSelectOptions( $options ) {
- foreach ( $options as $k => $v )
- if ( is_numeric( $k ) && $v == 'FOR UPDATE' )
+ foreach ( $options as $k => $v ) {
+ if ( is_numeric( $k ) && $v == 'FOR UPDATE' ) {
$options[$k] = '';
+ }
+ }
return parent::makeSelectOptions( $options );
}
@@ -308,20 +370,28 @@ class DatabaseSqlite extends DatabaseBase {
* Based on generic method (parent) with some prior SQLite-sepcific adjustments
*/
function insert( $table, $a, $fname = 'DatabaseSqlite::insert', $options = array() ) {
- if ( !count( $a ) ) return true;
- if ( !is_array( $options ) ) $options = array( $options );
+ if ( !count( $a ) ) {
+ return true;
+ }
+ if ( !is_array( $options ) ) {
+ $options = array( $options );
+ }
# SQLite uses OR IGNORE not just IGNORE
- foreach ( $options as $k => $v )
- if ( $v == 'IGNORE' )
+ foreach ( $options as $k => $v ) {
+ if ( $v == 'IGNORE' ) {
$options[$k] = 'OR IGNORE';
+ }
+ }
# SQLite can't handle multi-row inserts, so divide up into multiple single-row inserts
if ( isset( $a[0] ) && is_array( $a[0] ) ) {
$ret = true;
- foreach ( $a as $k => $v )
- if ( !parent::insert( $table, $v, "$fname/multi-row", $options ) )
+ foreach ( $a as $v ) {
+ if ( !parent::insert( $table, $v, "$fname/multi-row", $options ) ) {
$ret = false;
+ }
+ }
} else {
$ret = parent::insert( $table, $a, "$fname/single-row", $options );
}
@@ -331,13 +401,15 @@ class DatabaseSqlite extends DatabaseBase {
function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseSqlite::replace' ) {
if ( !count( $rows ) ) return true;
-
+
# SQLite can't handle multi-row replaces, so divide up into multiple single-row queries
if ( isset( $rows[0] ) && is_array( $rows[0] ) ) {
$ret = true;
- foreach ( $rows as $k => $v )
- if ( !parent::replace( $table, $uniqueIndexes, $v, "$fname/multi-row" ) )
+ foreach ( $rows as $v ) {
+ if ( !parent::replace( $table, $uniqueIndexes, $v, "$fname/multi-row" ) ) {
$ret = false;
+ }
+ }
} else {
$ret = parent::replace( $table, $uniqueIndexes, $rows, "$fname/single-row" );
}
@@ -362,6 +434,10 @@ class DatabaseSqlite extends DatabaseBase {
return implode( $glue, $sqls );
}
+ public function unixTimestamp( $field ) {
+ return $field;
+ }
+
function wasDeadlock() {
return $this->lastErrno() == 5; // SQLITE_BUSY
}
@@ -377,7 +453,7 @@ class DatabaseSqlite extends DatabaseBase {
/**
* @return string wikitext of a link to the server software's web site
*/
- function getSoftwareLink() {
+ public static function getSoftwareLink() {
return "[http://sqlite.org/ SQLite]";
}
@@ -390,11 +466,10 @@ class DatabaseSqlite extends DatabaseBase {
}
/**
- * Query whether a given column exists in the mediawiki schema
+ * @return string User-friendly database information
*/
- function fieldExists( $table, $field, $fname = '' ) {
- $info = $this->fieldInfo( $table, $field );
- return (bool)$info;
+ public function getServerInfo() {
+ return wfMsg( self::getFulltextSearchModule() ? 'sqlite-has-fts' : 'sqlite-no-fts', $this->getServerVersion() );
}
/**
@@ -458,10 +533,6 @@ class DatabaseSqlite extends DatabaseBase {
}
}
- function quote_ident( $s ) {
- return $s;
- }
-
function buildLike() {
$params = func_get_args();
if ( count( $params ) > 0 && is_array( $params[0] ) ) {
@@ -470,43 +541,6 @@ class DatabaseSqlite extends DatabaseBase {
return parent::buildLike( $params ) . "ESCAPE '\' ";
}
- /**
- * How lagged is this slave?
- */
- public function getLag() {
- return 0;
- }
-
- /**
- * Called by the installer script (when modified according to the MediaWikiLite installation instructions)
- * - this is the same way PostgreSQL works, MySQL reads in tables.sql and interwiki.sql using dbsource (which calls db->sourceFile)
- */
- public function setup_database() {
- global $IP;
-
- # Process common MySQL/SQLite table definitions
- $err = $this->sourceFile( "$IP/maintenance/tables.sql" );
- if ( $err !== true ) {
- echo " <b>FAILED</b></li>";
- dieout( htmlspecialchars( $err ) );
- }
- echo " done.</li>";
-
- # Use DatabasePostgres's code to populate interwiki from MySQL template
- $f = fopen( "$IP/maintenance/interwiki.sql", 'r' );
- if ( $f == false ) {
- dieout( "Could not find the interwiki.sql file." );
- }
-
- $sql = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local) VALUES ";
- while ( !feof( $f ) ) {
- $line = fgets( $f, 1024 );
- $matches = array();
- if ( !preg_match( '/^\s*(\(.+?),(\d)\)/', $line, $matches ) ) continue;
- $this->query( "$sql $matches[1],$matches[2])" );
- }
- }
-
public function getSearchEngine() {
return "SearchSqlite";
}
@@ -530,9 +564,11 @@ class DatabaseSqlite extends DatabaseBase {
// no such thing as unsigned
$s = preg_replace( '/\b(un)?signed\b/i', '', $s );
// INT -> INTEGER
- $s = preg_replace( '/\b(tiny|small|medium|big|)int(\([\s\d]*\)|\b)/i', 'INTEGER', $s );
+ $s = preg_replace( '/\b(tiny|small|medium|big|)int(\s*\(\s*\d+\s*\)|\b)/i', 'INTEGER', $s );
+ // floating point types -> REAL
+ $s = preg_replace( '/\b(float|double(\s+precision)?)(\s*\(\s*\d+\s*(,\s*\d+\s*)?\)|\b)/i', 'REAL', $s );
// varchar -> TEXT
- $s = preg_replace( '/\bvarchar\(\d+\)/i', 'TEXT', $s );
+ $s = preg_replace( '/\b(var)?char\s*\(.*?\)/i', 'TEXT', $s );
// TEXT normalization
$s = preg_replace( '/\b(tiny|medium|long)text\b/i', 'TEXT', $s );
// BLOB normalization
@@ -542,13 +578,15 @@ class DatabaseSqlite extends DatabaseBase {
// DATETIME -> TEXT
$s = preg_replace( '/\b(datetime|timestamp)\b/i', 'TEXT', $s );
// No ENUM type
- $s = preg_replace( '/enum\([^)]*\)/i', 'BLOB', $s );
+ $s = preg_replace( '/\benum\s*\([^)]*\)/i', 'TEXT', $s );
// binary collation type -> nothing
$s = preg_replace( '/\bbinary\b/i', '', $s );
// auto_increment -> autoincrement
$s = preg_replace( '/\bauto_increment\b/i', 'AUTOINCREMENT', $s );
// No explicit options
$s = preg_replace( '/\)[^);]*(;?)\s*$/', ')\1', $s );
+ // AUTOINCREMENT should immedidately follow PRIMARY KEY
+ $s = preg_replace( '/primary key (.*?) autoincrement/i', 'PRIMARY KEY AUTOINCREMENT $1', $s );
} elseif ( preg_match( '/^\s*CREATE (\s*(?:UNIQUE|FULLTEXT)\s+)?INDEX/i', $s ) ) {
// No truncated indexes
$s = preg_replace( '/\(\d+\)/', '', $s );
@@ -585,6 +623,7 @@ class DatabaseSqlite extends DatabaseBase {
class DatabaseSqliteStandalone extends DatabaseSqlite {
public function __construct( $fileName, $flags = 0 ) {
$this->mFlags = $flags;
+ $this->tablePrefix( null );
$this->openFile( $fileName );
}
}
@@ -592,7 +631,7 @@ class DatabaseSqliteStandalone extends DatabaseSqlite {
/**
* @ingroup Database
*/
-class SQLiteField {
+class SQLiteField implements Field {
private $info, $tableName;
function __construct( $info, $tableName ) {
$this->info = $info;
@@ -617,18 +656,10 @@ class SQLiteField {
return $this->info->dflt_value;
}
- function maxLength() {
- return -1;
+ function isNullable() {
+ return !$this->info->notnull;
}
- function nullable() {
- // SQLite dynamic types are always nullable
- return true;
- }
-
- # isKey(), isMultipleKey() not implemented, MySQL-specific concept.
- # Suggest removal from base class [TS]
-
function type() {
return $this->info->type;
}
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
index 10c87133..f84a70e5 100644
--- a/includes/db/LBFactory.php
+++ b/includes/db/LBFactory.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Generator of database load balancing objects
+ *
* @file
* @ingroup Database
*/
@@ -12,6 +14,23 @@ abstract class LBFactory {
static $instance;
/**
+ * Disables all access to the load balancer, will cause all database access
+ * to throw a DBAccessError
+ */
+ public static function disableBackend() {
+ global $wgLBFactoryConf;
+ self::$instance = new LBFactory_Fake( $wgLBFactoryConf );
+ }
+
+ /**
+ * Resets the singleton for use if it's been disabled. Does nothing otherwise
+ */
+ public static function enableBackend() {
+ if( self::$instance instanceof LBFactory_Fake )
+ self::$instance = null;
+ }
+
+ /**
* Get an LBFactory instance
*/
static function &singleton() {
@@ -36,6 +55,14 @@ abstract class LBFactory {
}
/**
+ * Set the instance to be the given object
+ */
+ static function setInstance( $instance ) {
+ self::destroyInstance();
+ self::$instance = $instance;
+ }
+
+ /**
* Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
*/
abstract function __construct( $conf );
@@ -44,7 +71,7 @@ abstract class LBFactory {
* Create a new load balancer object. The resulting object will be untracked,
* not chronology-protected, and the caller is responsible for cleaning it up.
*
- * @param string $wiki Wiki ID, or false for the current wiki
+ * @param $wiki String: wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function newMainLB( $wiki = false );
@@ -52,7 +79,7 @@ abstract class LBFactory {
/**
* Get a cached (tracked) load balancer object.
*
- * @param string $wiki Wiki ID, or false for the current wiki
+ * @param $wiki String: wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function getMainLB( $wiki = false );
@@ -62,16 +89,16 @@ abstract class LBFactory {
* untracked, not chronology-protected, and the caller is responsible for
* cleaning it up.
*
- * @param string $cluster External storage cluster, or false for core
- * @param string $wiki Wiki ID, or false for the current wiki
+ * @param $cluster String: external storage cluster, or false for core
+ * @param $wiki String: wiki ID, or false for the current wiki
*/
abstract function newExternalLB( $cluster, $wiki = false );
/*
* Get a cached (tracked) load balancer for external storage
*
- * @param string $cluster External storage cluster, or false for core
- * @param string $wiki Wiki ID, or false for the current wiki
+ * @param $cluster String: external storage cluster, or false for core
+ * @param $wiki String: wiki ID, or false for the current wiki
*/
abstract function &getExternalLB( $cluster, $wiki = false );
@@ -198,6 +225,39 @@ class LBFactory_Simple extends LBFactory {
}
/**
+ * LBFactory class that throws an error on any attempt to use it.
+ * This will typically be done via wfGetDB().
+ * Call LBFactory::disableBackend() to start using this, and
+ * LBFactory::enableBackend() to return to normal behavior
+ */
+class LBFactory_Fake extends LBFactory {
+ function __construct( $conf ) {}
+
+ function newMainLB( $wiki = false) {
+ throw new DBAccessError;
+ }
+ function getMainLB( $wiki = false ) {
+ throw new DBAccessError;
+ }
+ function newExternalLB( $cluster, $wiki = false ) {
+ throw new DBAccessError;
+ }
+ function &getExternalLB( $cluster, $wiki = false ) {
+ throw new DBAccessError;
+ }
+ function forEachLB( $callback, $params = array() ) {}
+}
+
+/**
+ * Exception class for attempted DB access
+ */
+class DBAccessError extends MWException {
+ function __construct() {
+ parent::__construct( "Mediawiki tried to access the database via wfGetDB(). This is not allowed." );
+ }
+}
+
+/**
* Class for ensuring a consistent ordering of events as seen by the user, despite replication.
* Kind of like Hawking's [[Chronology Protection Agency]].
*/
@@ -208,7 +268,7 @@ class ChronologyProtector {
/**
* Initialise a LoadBalancer to give it appropriate chronology protection.
*
- * @param LoadBalancer $lb
+ * @param $lb LoadBalancer
*/
function initLB( $lb ) {
if ( $this->startupPos === null ) {
@@ -233,7 +293,7 @@ class ChronologyProtector {
* Notify the ChronologyProtector that the LoadBalancer is about to shut
* down. Saves replication positions.
*
- * @param LoadBalancer $lb
+ * @param $lb LoadBalancer
*/
function shutdownLB( $lb ) {
// Don't start a session, don't bother with non-replicated setups
diff --git a/includes/db/LBFactory_Multi.php b/includes/db/LBFactory_Multi.php
index 820aa2ea..0d411ec6 100644
--- a/includes/db/LBFactory_Multi.php
+++ b/includes/db/LBFactory_Multi.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Advanced generator of database load balancing objects for wiki farms
+ *
* @file
* @ingroup Database
*/
@@ -85,7 +87,7 @@ class LBFactory_Multi extends LBFactory {
if ( $this->lastWiki === $wiki ) {
return $this->lastSection;
}
- list( $dbName, $prefix ) = $this->getDBNameAndPrefix( $wiki );
+ list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
if ( isset( $this->sectionsByDB[$dbName] ) ) {
$section = $this->sectionsByDB[$dbName];
} else {
@@ -97,7 +99,7 @@ class LBFactory_Multi extends LBFactory {
}
function newMainLB( $wiki = false ) {
- list( $dbName, $prefix ) = $this->getDBNameAndPrefix( $wiki );
+ list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
$section = $this->getSectionForWiki( $wiki );
$groupLoads = array();
if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
diff --git a/includes/db/LBFactory_Single.php b/includes/db/LBFactory_Single.php
new file mode 100644
index 00000000..25acdc5b
--- /dev/null
+++ b/includes/db/LBFactory_Single.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * An LBFactory class that always returns a single database object.
+ */
+class LBFactory_Single extends LBFactory {
+ protected $lb;
+
+ /**
+ * @param $conf An associative array with one member:
+ * - connection: The DatabaseBase connection object
+ */
+ function __construct( $conf ) {
+ $this->lb = new LoadBalancer_Single( $conf );
+ }
+
+ function newMainLB( $wiki = false ) {
+ return $this->lb;
+ }
+
+ function getMainLB( $wiki = false ) {
+ return $this->lb;
+ }
+
+ function newExternalLB( $cluster, $wiki = false ) {
+ return $this->lb;
+ }
+
+ function &getExternalLB( $cluster, $wiki = false ) {
+ return $this->lb;
+ }
+
+ function forEachLB( $callback, $params = array() ) {
+ call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
+ }
+}
+
+/**
+ * Helper class for LBFactory_Single.
+ */
+class LoadBalancer_Single extends LoadBalancer {
+ var $db;
+
+ function __construct( $params ) {
+ $this->db = $params['connection'];
+ parent::__construct( array( 'servers' => array( array(
+ 'type' => $this->db->getType(),
+ 'host' => $this->db->getServer(),
+ 'dbname' => $this->db->getDBname(),
+ 'load' => 1,
+ ) ) ) );
+ }
+
+ function reallyOpenConnection( $server, $dbNameOverride = false ) {
+ return $this->db;
+ }
+}
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
index 083b70b3..d899ce07 100644
--- a/includes/db/LoadBalancer.php
+++ b/includes/db/LoadBalancer.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Database load balancing
+ *
* @file
* @ingroup Database
*/
@@ -12,7 +14,7 @@
*/
class LoadBalancer {
/* private */ var $mServers, $mConns, $mLoads, $mGroupLoads;
- /* private */ var $mFailFunction, $mErrorConnection;
+ /* private */ var $mErrorConnection;
/* private */ var $mReadIndex, $mAllowLagged;
/* private */ var $mWaitForPos, $mWaitTimeout;
/* private */ var $mLaggedSlaveMode, $mLastError = 'Unknown error';
@@ -20,9 +22,8 @@ class LoadBalancer {
/* private */ var $mLoadMonitorClass, $mLoadMonitor;
/**
- * @param array $params Array with keys:
+ * @param $params Array with keys:
* servers Required. Array of server info structures.
- * failFunction Deprecated, use exceptions instead.
* masterWaitTimeout Replication lag wait timeout
* loadMonitor Name of a class used to fetch server lag and load.
*/
@@ -33,11 +34,6 @@ class LoadBalancer {
}
$this->mServers = $params['servers'];
- if ( isset( $params['failFunction'] ) ) {
- $this->mFailFunction = $params['failFunction'];
- } else {
- $this->mFailFunction = false;
- }
if ( isset( $params['waitTimeout'] ) ) {
$this->mWaitTimeout = $params['waitTimeout'];
} else {
@@ -54,7 +50,7 @@ class LoadBalancer {
$this->mWaitForPos = false;
$this->mLaggedSlaveMode = false;
$this->mErrorConnection = false;
- $this->mAllowLag = false;
+ $this->mAllowLagged = false;
$this->mLoadMonitorClass = isset( $params['loadMonitor'] )
? $params['loadMonitor'] : 'LoadMonitor_MySQL';
@@ -71,11 +67,6 @@ class LoadBalancer {
}
}
- static function newFromParams( $servers, $failFunction = false, $waitTimeout = 10 )
- {
- return new LoadBalancer( $servers, $failFunction, $waitTimeout );
- }
-
/**
* Get a LoadMonitor instance
*/
@@ -129,11 +120,11 @@ class LoadBalancer {
# Unset excessively lagged servers
$lags = $this->getLagTimes( $wiki );
foreach ( $lags as $i => $lag ) {
- if ( $i != 0 && isset( $this->mServers[$i]['max lag'] ) ) {
+ if ( $i != 0 ) {
if ( $lag === false ) {
wfDebug( "Server #$i is not replicating\n" );
unset( $loads[$i] );
- } elseif ( $lag > $this->mServers[$i]['max lag'] ) {
+ } elseif ( isset( $this->mServers[$i]['max lag'] ) && $lag > $this->mServers[$i]['max lag'] ) {
wfDebug( "Server #$i is excessively lagged ($lag seconds)\n" );
unset( $loads[$i] );
}
@@ -214,8 +205,6 @@ class LoadBalancer {
# Scale the configured load ratios according to the dynamic load (if the load monitor supports it)
$this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $group, $wiki );
- $i = false;
- $found = false;
$laggedSlaveMode = false;
# First try quickly looking through the available servers for a server that
@@ -231,7 +220,8 @@ class LoadBalancer {
$i = $this->getRandomNonLagged( $currentLoads, $wiki );
if ( $i === false && count( $currentLoads ) != 0 ) {
# All slaves lagged. Switch to read-only mode
- $wgReadOnly = wfMsgNoDBForContent( 'readonly_lag' );
+ $wgReadOnly = 'The database has been automatically locked ' .
+ 'while the slave database servers catch up to the master';
$i = $this->pickRandom( $currentLoads );
$laggedSlaveMode = true;
}
@@ -332,14 +322,6 @@ class LoadBalancer {
}
/**
- * Get a random server to use in a query group
- * @deprecated use getReaderIndex
- */
- function getGroupIndex( $group ) {
- return $this->getReaderIndex( $group );
- }
-
- /**
* Set the master wait position
* If a DB_SLAVE connection has been opened already, waits
* Otherwise sets a variable telling it to wait if such a connection is opened
@@ -357,13 +339,25 @@ class LoadBalancer {
}
wfProfileOut( __METHOD__ );
}
+
+ /**
+ * Set the master wait position and wait for ALL slaves to catch up to it
+ */
+ public function waitForAll( $pos ) {
+ wfProfileIn( __METHOD__ );
+ $this->mWaitForPos = $pos;
+ for ( $i = 1; $i < count( $this->mServers ); $i++ ) {
+ $this->doWait( $i );
+ }
+ wfProfileOut( __METHOD__ );
+ }
/**
* Get any open connection to a given server index, local or foreign
* Returns false if there is no connection open
*/
function getAnyOpenConnection( $i ) {
- foreach ( $this->mConns as $type => $conns ) {
+ foreach ( $this->mConns as $conns ) {
if ( !empty( $conns[$i] ) ) {
return reset( $conns[$i] );
}
@@ -398,12 +392,14 @@ class LoadBalancer {
/**
* Get a connection by index
* This is the main entry point for this class.
- * @param int $i Database
- * @param array $groups Query groups
- * @param string $wiki Wiki ID
+ *
+ * @param $i Integer: server index
+ * @param $groups Array: query groups
+ * @param $wiki String: wiki ID
+ *
+ * @return DatabaseBase
*/
public function &getConnection( $i, $groups = array(), $wiki = false ) {
- global $wgDBtype;
wfProfileIn( __METHOD__ );
if ( $i == DB_LAST ) {
@@ -445,6 +441,7 @@ class LoadBalancer {
if ( $i === false ) {
$this->mLastError = 'No working slave server: ' . $this->mLastError;
$this->reportConnectionError( $this->mErrorConnection );
+ wfProfileOut( __METHOD__ );
return false;
}
}
@@ -509,9 +506,9 @@ class LoadBalancer {
* On error, returns false, and the connection which caused the
* error will be available via $this->mErrorConnection.
*
- * @param integer $i Server index
- * @param string $wiki Wiki ID to open
- * @return Database
+ * @param $i Integer: server index
+ * @param $wiki String: wiki ID to open
+ * @return DatabaseBase
*
* @access private
*/
@@ -554,9 +551,9 @@ class LoadBalancer {
* On error, returns false, and the connection which caused the
* error will be available via $this->mErrorConnection.
*
- * @param integer $i Server index
- * @param string $wiki Wiki ID to open
- * @return Database
+ * @param $i Integer: server index
+ * @param $wiki String: wiki ID to open
+ * @return DatabaseBase
*/
function openForeignConnection( $i, $wiki ) {
wfProfileIn(__METHOD__);
@@ -615,6 +612,8 @@ class LoadBalancer {
/**
* Test if the specified index represents an open connection
+ *
+ * @param $index Integer: server index
* @access private
*/
function isOpen( $index ) {
@@ -634,21 +633,26 @@ class LoadBalancer {
throw new MWException( 'You must update your load-balancing configuration. See DefaultSettings.php entry for $wgDBservers.' );
}
- extract( $server );
+ $host = $server['host'];
+ $dbname = $server['dbname'];
+
if ( $dbNameOverride !== false ) {
- $dbname = $dbNameOverride;
+ $server['dbname'] = $dbname = $dbNameOverride;
}
- # Get class for this database type
- $class = 'Database' . ucfirst( $type );
-
# Create object
wfDebug( "Connecting to $host $dbname...\n" );
- $db = new $class( $host, $user, $password, $dbname, 1, $flags );
+ try {
+ $db = DatabaseBase::newFromType( $server['type'], $server );
+ } catch ( DBConnectionError $e ) {
+ // FIXME: This is probably the ugliest thing I have ever done to
+ // PHP. I'm half-expecting it to segfault, just out of disgust. -- TS
+ $db = $e->db;
+ }
if ( $db->isOpen() ) {
- wfDebug( "Connected\n" );
+ wfDebug( "Connected to $host $dbname.\n" );
} else {
- wfDebug( "Failed\n" );
+ wfDebug( "Connection failed to $host $dbname.\n" );
}
$db->setLBInfo( $server );
if ( isset( $server['fakeSlaveLag'] ) ) {
@@ -667,19 +671,9 @@ class LoadBalancer {
// No last connection, probably due to all servers being too busy
wfLogDBError( "LB failure with no last connection\n" );
$conn = new Database;
- if ( $this->mFailFunction ) {
- $conn->failFunction( $this->mFailFunction );
- $conn->reportConnectionError( $this->mLastError );
- } else {
- // If all servers were busy, mLastError will contain something sensible
- throw new DBConnectionError( $conn, $this->mLastError );
- }
+ // If all servers were busy, mLastError will contain something sensible
+ throw new DBConnectionError( $conn, $this->mLastError );
} else {
- if ( $this->mFailFunction ) {
- $conn->failFunction( $this->mFailFunction );
- } else {
- $conn->failFunction( false );
- }
$server = $conn->getProperty( 'mServer' );
wfLogDBError( "Connection error: {$this->mLastError} ({$server})\n" );
$conn->reportConnectionError( "{$this->mLastError} ({$server})" );
@@ -779,11 +773,20 @@ class LoadBalancer {
}
/**
+ * Deprecated function, typo in function name
+ */
+ function closeConnecton( $conn ) {
+ $this->closeConnection( $conn );
+ }
+
+ /**
* Close a connection
* Using this function makes sure the LoadBalancer knows the connection is closed.
* If you use $conn->close() directly, the load balancer won't update its state.
+ * @param $conn
+ * @return void
*/
- function closeConnecton( $conn ) {
+ function closeConnection( $conn ) {
$done = false;
foreach ( $this->mConns as $i1 => $conns2 ) {
foreach ( $conns2 as $i2 => $conns3 ) {
@@ -819,7 +822,7 @@ class LoadBalancer {
function commitMasterChanges() {
// Always 0, but who knows.. :)
$masterIndex = $this->getWriterIndex();
- foreach ( $this->mConns as $type => $conns2 ) {
+ foreach ( $this->mConns as $conns2 ) {
if ( empty( $conns2[$masterIndex] ) ) {
continue;
}
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index 929ab2b9..9b959728 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -1,9 +1,16 @@
<?php
+/**
+ * Database load monitoring
+ *
+ * @file
+ * @ingroup Database
+ */
/**
* An interface for database load monitoring
+ *
+ * @ingroup Database
*/
-
interface LoadMonitor {
/**
* Construct a new LoadMonitor with a given LoadBalancer parent
@@ -12,9 +19,9 @@ interface LoadMonitor {
/**
* Perform pre-connection load ratio adjustment.
- * @param array $loads
- * @param string $group The selected query group
- * @param string $wiki
+ * @param $loads Array
+ * @param $group String: the selected query group
+ * @param $wiki String
*/
function scaleLoads( &$loads, $group = false, $wiki = false );
@@ -31,8 +38,8 @@ interface LoadMonitor {
* to the running thread count. The threshold may be false, which indicates
* that the sysadmin has not configured this feature.
*
- * @param Database $conn
- * @param float $threshold
+ * @param $conn DatabaseBase
+ * @param $threshold Float
*/
function postConnectionBackoff( $conn, $threshold );
@@ -46,8 +53,9 @@ interface LoadMonitor {
/**
* Basic MySQL load monitor with no external dependencies
* Uses memcached to cache the replication lag for a short time
+ *
+ * @ingroup Database
*/
-
class LoadMonitor_MySQL implements LoadMonitor {
var $parent; // LoadBalancer
diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php
index 184d1fc2..edf35a92 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -1,1240 +1,1090 @@
<?php
/**
- * @defgroup DifferenceEngine DifferenceEngine
- */
-
-// A PHP diff engine for phpwiki. (Taken from phpwiki-1.3.3)
-//
-// Copyright (C) 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
-// You may copy this code freely under the conditions of the GPL.
-//
-
-define('USE_ASSERTS', function_exists('assert'));
-
-/**
- * @todo document
- * @private
+ * User interface for the difference engine
+ *
+ * @file
* @ingroup DifferenceEngine
*/
-class _DiffOp {
- var $type;
- var $orig;
- var $closing;
-
- function reverse() {
- trigger_error('pure virtual', E_USER_ERROR);
- }
-
- function norig() {
- return $this->orig ? sizeof($this->orig) : 0;
- }
-
- function nclosing() {
- return $this->closing ? sizeof($this->closing) : 0;
- }
-}
/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
+ * Constant to indicate diff cache compatibility.
+ * Bump this when changing the diff formatting in a way that
+ * fixes important bugs or such to force cached diff views to
+ * clear.
*/
-class _DiffOp_Copy extends _DiffOp {
- var $type = 'copy';
-
- function _DiffOp_Copy ($orig, $closing = false) {
- if (!is_array($closing))
- $closing = $orig;
- $this->orig = $orig;
- $this->closing = $closing;
- }
-
- function reverse() {
- return new _DiffOp_Copy($this->closing, $this->orig);
- }
-}
+define( 'MW_DIFF_VERSION', '1.11a' );
/**
* @todo document
- * @private
* @ingroup DifferenceEngine
*/
-class _DiffOp_Delete extends _DiffOp {
- var $type = 'delete';
+class DifferenceEngine {
+ /**#@+
+ * @private
+ */
+ var $mOldid, $mNewid, $mTitle;
+ var $mOldtitle, $mNewtitle, $mPagetitle;
+ var $mOldtext, $mNewtext;
+ var $mOldPage, $mNewPage;
+ var $mRcidMarkPatrolled;
+ var $mOldRev, $mNewRev;
+ var $mRevisionsLoaded = false; // Have the revisions been loaded
+ var $mTextLoaded = 0; // How many text blobs have been loaded, 0, 1 or 2?
+ var $mCacheHit = false; // Was the diff fetched from cache?
- function _DiffOp_Delete ($lines) {
- $this->orig = $lines;
- $this->closing = false;
- }
+ /**
+ * Set this to true to add debug info to the HTML output.
+ * Warning: this may cause RSS readers to spuriously mark articles as "new"
+ * (bug 20601)
+ */
+ var $enableDebugComment = false;
- function reverse() {
- return new _DiffOp_Add($this->orig);
- }
-}
+ // If true, line X is not displayed when X is 1, for example to increase
+ // readability and conserve space with many small diffs.
+ protected $mReducedLineNumbers = false;
-/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class _DiffOp_Add extends _DiffOp {
- var $type = 'add';
+ protected $unhide = false; # show rev_deleted content if allowed
+ /**#@-*/
- function _DiffOp_Add ($lines) {
- $this->closing = $lines;
- $this->orig = false;
+ /**
+ * Constructor
+ * @param $titleObj Title object that the diff is associated with
+ * @param $old Integer: old ID we want to show and diff with.
+ * @param $new String: either 'prev' or 'next'.
+ * @param $rcid Integer: ??? FIXME (default 0)
+ * @param $refreshCache boolean If set, refreshes the diff cache
+ * @param $unhide boolean If set, allow viewing deleted revs
+ */
+ function __construct( $titleObj = null, $old = 0, $new = 0, $rcid = 0,
+ $refreshCache = false, $unhide = false )
+ {
+ if ( $titleObj ) {
+ $this->mTitle = $titleObj;
+ } else {
+ global $wgTitle;
+ $this->mTitle = $wgTitle;
+ }
+ wfDebug( "DifferenceEngine old '$old' new '$new' rcid '$rcid'\n" );
+
+ if ( 'prev' === $new ) {
+ # Show diff between revision $old and the previous one.
+ # Get previous one from DB.
+ $this->mNewid = intval( $old );
+ $this->mOldid = $this->mTitle->getPreviousRevisionID( $this->mNewid );
+ } elseif ( 'next' === $new ) {
+ # Show diff between revision $old and the next one.
+ # Get next one from DB.
+ $this->mOldid = intval( $old );
+ $this->mNewid = $this->mTitle->getNextRevisionID( $this->mOldid );
+ if ( false === $this->mNewid ) {
+ # if no result, NewId points to the newest old revision. The only newer
+ # revision is cur, which is "0".
+ $this->mNewid = 0;
+ }
+ } else {
+ $this->mOldid = intval( $old );
+ $this->mNewid = intval( $new );
+ wfRunHooks( 'NewDifferenceEngine', array( &$titleObj, &$this->mOldid, &$this->mNewid, $old, $new ) );
+ }
+ $this->mRcidMarkPatrolled = intval( $rcid ); # force it to be an integer
+ $this->mRefreshCache = $refreshCache;
+ $this->unhide = $unhide;
}
- function reverse() {
- return new _DiffOp_Delete($this->closing);
+ function setReducedLineNumbers( $value = true ) {
+ $this->mReducedLineNumbers = $value;
}
-}
-/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class _DiffOp_Change extends _DiffOp {
- var $type = 'change';
-
- function _DiffOp_Change ($orig, $closing) {
- $this->orig = $orig;
- $this->closing = $closing;
+ function getTitle() {
+ return $this->mTitle;
}
- function reverse() {
- return new _DiffOp_Change($this->closing, $this->orig);
+ function wasCacheHit() {
+ return $this->mCacheHit;
}
-}
-/**
- * Class used internally by Diff to actually compute the diffs.
- *
- * The algorithm used here is mostly lifted from the perl module
- * Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
- * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
- *
- * More ideas are taken from:
- * http://www.ics.uci.edu/~eppstein/161/960229.html
- *
- * Some ideas are (and a bit of code) are from from analyze.c, from GNU
- * diffutils-2.7, which can be found at:
- * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
- *
- * closingly, some ideas (subdivision by NCHUNKS > 2, and some optimizations)
- * are my own.
- *
- * Line length limits for robustness added by Tim Starling, 2005-08-31
- * Alternative implementation added by Guy Van den Broeck, 2008-07-30
- *
- * @author Geoffrey T. Dairiki, Tim Starling, Guy Van den Broeck
- * @private
- * @ingroup DifferenceEngine
- */
-class _DiffEngine {
+ function getOldid() {
+ return $this->mOldid;
+ }
- const MAX_XREF_LENGTH = 10000;
+ function getNewid() {
+ return $this->mNewid;
+ }
- function diff ($from_lines, $to_lines){
+ function showDiffPage( $diffOnly = false ) {
+ global $wgUser, $wgOut, $wgUseExternalEditor, $wgUseRCPatrol;
wfProfileIn( __METHOD__ );
- // Diff and store locally
- $this->diff_local($from_lines, $to_lines);
-
- // Merge edits when possible
- $this->_shift_boundaries($from_lines, $this->xchanged, $this->ychanged);
- $this->_shift_boundaries($to_lines, $this->ychanged, $this->xchanged);
-
- // Compute the edit operations.
- $n_from = sizeof($from_lines);
- $n_to = sizeof($to_lines);
-
- $edits = array();
- $xi = $yi = 0;
- while ($xi < $n_from || $yi < $n_to) {
- USE_ASSERTS && assert($yi < $n_to || $this->xchanged[$xi]);
- USE_ASSERTS && assert($xi < $n_from || $this->ychanged[$yi]);
-
- // Skip matching "snake".
- $copy = array();
- while ( $xi < $n_from && $yi < $n_to
- && !$this->xchanged[$xi] && !$this->ychanged[$yi]) {
- $copy[] = $from_lines[$xi++];
- ++$yi;
- }
- if ($copy)
- $edits[] = new _DiffOp_Copy($copy);
+ # Allow frames except in certain special cases
+ $wgOut->allowClickjacking();
+
+ # If external diffs are enabled both globally and for the user,
+ # we'll use the application/x-external-editor interface to call
+ # an external diff tool like kompare, kdiff3, etc.
+ if ( $wgUseExternalEditor && $wgUser->getOption( 'externaldiff' ) ) {
+ global $wgInputEncoding, $wgServer, $wgScript, $wgLang;
+ $wgOut->disable();
+ header ( "Content-type: application/x-external-editor; charset=" . $wgInputEncoding );
+ $url1 = $this->mTitle->getFullURL( array(
+ 'action' => 'raw',
+ 'oldid' => $this->mOldid
+ ) );
+ $url2 = $this->mTitle->getFullURL( array(
+ 'action' => 'raw',
+ 'oldid' => $this->mNewid
+ ) );
+ $special = $wgLang->getNsText( NS_SPECIAL );
+ $control = <<<CONTROL
+ [Process]
+ Type=Diff text
+ Engine=MediaWiki
+ Script={$wgServer}{$wgScript}
+ Special namespace={$special}
+
+ [File]
+ Extension=wiki
+ URL=$url1
+
+ [File 2]
+ Extension=wiki
+ URL=$url2
+CONTROL;
+ echo( $control );
+
+ wfProfileOut( __METHOD__ );
+ return;
+ }
- // Find deletes & adds.
- $delete = array();
- while ($xi < $n_from && $this->xchanged[$xi])
- $delete[] = $from_lines[$xi++];
+ $wgOut->setArticleFlag( false );
+ if ( !$this->loadRevisionData() ) {
+ $t = $this->mTitle->getPrefixedText();
+ $d = wfMsgExt( 'missingarticle-diff', array( 'escape' ), $this->mOldid, $this->mNewid );
+ $wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
+ $wgOut->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", $d );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
- $add = array();
- while ($yi < $n_to && $this->ychanged[$yi])
- $add[] = $to_lines[$yi++];
+ wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
- if ($delete && $add)
- $edits[] = new _DiffOp_Change($delete, $add);
- elseif ($delete)
- $edits[] = new _DiffOp_Delete($delete);
- elseif ($add)
- $edits[] = new _DiffOp_Add($add);
+ if ( $this->mNewRev->isCurrent() ) {
+ $wgOut->setArticleFlag( true );
}
- wfProfileOut( __METHOD__ );
- return $edits;
- }
-
- function diff_local ($from_lines, $to_lines) {
- global $wgExternalDiffEngine;
- wfProfileIn( __METHOD__);
-
- if($wgExternalDiffEngine == 'wikidiff3'){
- // wikidiff3
- $wikidiff3 = new WikiDiff3();
- $wikidiff3->diff($from_lines, $to_lines);
- $this->xchanged = $wikidiff3->removed;
- $this->ychanged = $wikidiff3->added;
- unset($wikidiff3);
- }else{
- // old diff
- $n_from = sizeof($from_lines);
- $n_to = sizeof($to_lines);
- $this->xchanged = $this->ychanged = array();
- $this->xv = $this->yv = array();
- $this->xind = $this->yind = array();
- unset($this->seq);
- unset($this->in_seq);
- unset($this->lcs);
-
- // Skip leading common lines.
- for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) {
- if ($from_lines[$skip] !== $to_lines[$skip])
- break;
- $this->xchanged[$skip] = $this->ychanged[$skip] = false;
- }
- // Skip trailing common lines.
- $xi = $n_from; $yi = $n_to;
- for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) {
- if ($from_lines[$xi] !== $to_lines[$yi])
- break;
- $this->xchanged[$xi] = $this->ychanged[$yi] = false;
- }
- // Ignore lines which do not exist in both files.
- for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
- $xhash[$this->_line_hash($from_lines[$xi])] = 1;
- }
+ # mOldid is false if the difference engine is called with a "vague" query for
+ # a diff between a version V and its previous version V' AND the version V
+ # is the first version of that article. In that case, V' does not exist.
+ if ( $this->mOldid === false ) {
+ $this->showFirstRevision();
+ $this->renderNewRevision(); // should we respect $diffOnly here or not?
+ wfProfileOut( __METHOD__ );
+ return;
+ }
- for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {
- $line = $to_lines[$yi];
- if ( ($this->ychanged[$yi] = empty($xhash[$this->_line_hash($line)])) )
- continue;
- $yhash[$this->_line_hash($line)] = 1;
- $this->yv[] = $line;
- $this->yind[] = $yi;
- }
- for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
- $line = $from_lines[$xi];
- if ( ($this->xchanged[$xi] = empty($yhash[$this->_line_hash($line)])) )
- continue;
- $this->xv[] = $line;
- $this->xind[] = $xi;
- }
+ $wgOut->suppressQuickbar();
- // Find the LCS.
- $this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv));
+ $oldTitle = $this->mOldPage->getPrefixedText();
+ $newTitle = $this->mNewPage->getPrefixedText();
+ if ( $oldTitle == $newTitle ) {
+ $wgOut->setPageTitle( $newTitle );
+ } else {
+ $wgOut->setPageTitle( $oldTitle . ', ' . $newTitle );
+ }
+ if ( $this->mNewPage->equals( $this->mOldPage ) ) {
+ $wgOut->setSubtitle( wfMsgExt( 'difference', array( 'parseinline' ) ) );
+ } else {
+ $wgOut->setSubtitle( wfMsgExt( 'difference-multipage', array( 'parseinline' ) ) );
+ }
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
+
+ if ( !$this->mOldPage->userCanRead() || !$this->mNewPage->userCanRead() ) {
+ $wgOut->loginToUse();
+ $wgOut->output();
+ $wgOut->disable();
+ wfProfileOut( __METHOD__ );
+ return;
}
- wfProfileOut( __METHOD__ );
- }
- /**
- * Returns the whole line if it's small enough, or the MD5 hash otherwise
- */
- function _line_hash( $line ) {
- if ( strlen( $line ) > self::MAX_XREF_LENGTH ) {
- return md5( $line );
+ $sk = $wgUser->getSkin();
+
+ // Check if page is editable
+ $editable = $this->mNewRev->getTitle()->userCan( 'edit' );
+ if ( $editable && $this->mNewRev->isCurrent() && $wgUser->isAllowed( 'rollback' ) ) {
+ $wgOut->preventClickjacking();
+ $rollback = '&#160;&#160;&#160;' . $sk->generateRollback( $this->mNewRev );
} else {
- return $line;
+ $rollback = '';
}
- }
- /* Divide the Largest Common Subsequence (LCS) of the sequences
- * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
- * sized segments.
- *
- * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
- * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
- * sub sequences. The first sub-sequence is contained in [X0, X1),
- * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on. Note
- * that (X0, Y0) == (XOFF, YOFF) and
- * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
- *
- * This function assumes that the first lines of the specified portions
- * of the two files do not match, and likewise that the last lines do not
- * match. The caller must trim matching lines from the beginning and end
- * of the portions it is going to specify.
- */
- function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) {
- $flip = false;
-
- if ($xlim - $xoff > $ylim - $yoff) {
- // Things seems faster (I'm not sure I understand why)
- // when the shortest sequence in X.
- $flip = true;
- list ($xoff, $xlim, $yoff, $ylim)
- = array( $yoff, $ylim, $xoff, $xlim);
- }
-
- if ($flip)
- for ($i = $ylim - 1; $i >= $yoff; $i--)
- $ymatches[$this->xv[$i]][] = $i;
- else
- for ($i = $ylim - 1; $i >= $yoff; $i--)
- $ymatches[$this->yv[$i]][] = $i;
-
- $this->lcs = 0;
- $this->seq[0]= $yoff - 1;
- $this->in_seq = array();
- $ymids[0] = array();
-
- $numer = $xlim - $xoff + $nchunks - 1;
- $x = $xoff;
- for ($chunk = 0; $chunk < $nchunks; $chunk++) {
- if ($chunk > 0)
- for ($i = 0; $i <= $this->lcs; $i++)
- $ymids[$i][$chunk-1] = $this->seq[$i];
-
- $x1 = $xoff + (int)(($numer + ($xlim-$xoff)*$chunk) / $nchunks);
- for ( ; $x < $x1; $x++) {
- $line = $flip ? $this->yv[$x] : $this->xv[$x];
- if (empty($ymatches[$line]))
- continue;
- $matches = $ymatches[$line];
- reset($matches);
- while (list ($junk, $y) = each($matches))
- if (empty($this->in_seq[$y])) {
- $k = $this->_lcs_pos($y);
- USE_ASSERTS && assert($k > 0);
- $ymids[$k] = $ymids[$k-1];
- break;
- }
- while (list ( /* $junk */, $y) = each($matches)) {
- if ($y > $this->seq[$k-1]) {
- USE_ASSERTS && assert($y < $this->seq[$k]);
- // Optimization: this is a common case:
- // next match is just replacing previous match.
- $this->in_seq[$this->seq[$k]] = false;
- $this->seq[$k] = $y;
- $this->in_seq[$y] = 1;
- } else if (empty($this->in_seq[$y])) {
- $k = $this->_lcs_pos($y);
- USE_ASSERTS && assert($k > 0);
- $ymids[$k] = $ymids[$k-1];
- }
+ // Prepare a change patrol link, if applicable
+ if ( $wgUseRCPatrol && $this->mTitle->userCan( 'patrol' ) ) {
+ // If we've been given an explicit change identifier, use it; saves time
+ if ( $this->mRcidMarkPatrolled ) {
+ $rcid = $this->mRcidMarkPatrolled;
+ $rc = RecentChange::newFromId( $rcid );
+ // Already patrolled?
+ $rcid = is_object( $rc ) && !$rc->getAttribute( 'rc_patrolled' ) ? $rcid : 0;
+ } else {
+ // Look for an unpatrolled change corresponding to this diff
+ $db = wfGetDB( DB_SLAVE );
+ $change = RecentChange::newFromConds(
+ array(
+ // Redundant user,timestamp condition so we can use the existing index
+ 'rc_user_text' => $this->mNewRev->getRawUserText(),
+ 'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+ 'rc_this_oldid' => $this->mNewid,
+ 'rc_last_oldid' => $this->mOldid,
+ 'rc_patrolled' => 0
+ ),
+ __METHOD__
+ );
+ if ( $change instanceof RecentChange ) {
+ $rcid = $change->mAttribs['rc_id'];
+ $this->mRcidMarkPatrolled = $rcid;
+ } else {
+ // None found
+ $rcid = 0;
}
}
+ // Build the link
+ if ( $rcid ) {
+ $wgOut->preventClickjacking();
+ $token = $wgUser->editToken( $rcid );
+ $patrol = ' <span class="patrollink">[' . $sk->link(
+ $this->mTitle,
+ wfMsgHtml( 'markaspatrolleddiff' ),
+ array(),
+ array(
+ 'action' => 'markpatrolled',
+ 'rcid' => $rcid,
+ 'token' => $token,
+ ),
+ array(
+ 'known',
+ 'noclasses'
+ )
+ ) . ']</span>';
+ } else {
+ $patrol = '';
+ }
+ } else {
+ $patrol = '';
}
- $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff);
- $ymid = $ymids[$this->lcs];
- for ($n = 0; $n < $nchunks - 1; $n++) {
- $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks);
- $y1 = $ymid[$n] + 1;
- $seps[] = $flip ? array($y1, $x1) : array($x1, $y1);
+ # Carry over 'diffonly' param via navigation links
+ if ( $diffOnly != $wgUser->getBoolOption( 'diffonly' ) ) {
+ $query['diffonly'] = $diffOnly;
}
- $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim);
- return array($this->lcs, $seps);
- }
-
- function _lcs_pos ($ypos) {
- $end = $this->lcs;
- if ($end == 0 || $ypos > $this->seq[$end]) {
- $this->seq[++$this->lcs] = $ypos;
- $this->in_seq[$ypos] = 1;
- return $this->lcs;
+ # Make "previous revision link"
+ $query['diff'] = 'prev';
+ $query['oldid'] = $this->mOldid;
+ # Cascade unhide param in links for easy deletion browsing
+ if ( $this->unhide ) {
+ $query['unhide'] = 1;
+ }
+ if ( !$this->mOldRev->getPrevious() ) {
+ $prevlink = '&#160;';
+ } else {
+ $prevlink = $sk->link(
+ $this->mTitle,
+ wfMsgHtml( 'previousdiff' ),
+ array(
+ 'id' => 'differences-prevlink'
+ ),
+ $query,
+ array(
+ 'known',
+ 'noclasses'
+ )
+ );
}
- $beg = 1;
- while ($beg < $end) {
- $mid = (int)(($beg + $end) / 2);
- if ( $ypos > $this->seq[$mid] )
- $beg = $mid + 1;
- else
- $end = $mid;
+ # Make "next revision link"
+ $query['diff'] = 'next';
+ $query['oldid'] = $this->mNewid;
+ # Skip next link on the top revision
+ if ( $this->mNewRev->isCurrent() ) {
+ $nextlink = '&#160;';
+ } else {
+ $nextlink = $sk->link(
+ $this->mTitle,
+ wfMsgHtml( 'nextdiff' ),
+ array(
+ 'id' => 'differences-nextlink'
+ ),
+ $query,
+ array(
+ 'known',
+ 'noclasses'
+ )
+ );
}
- USE_ASSERTS && assert($ypos != $this->seq[$end]);
+ $oldminor = '';
+ $newminor = '';
- $this->in_seq[$this->seq[$end]] = false;
- $this->seq[$end] = $ypos;
- $this->in_seq[$ypos] = 1;
- return $end;
- }
+ if ( $this->mOldRev->isMinor() ) {
+ $oldminor = ChangesList::flag( 'minor' );
+ }
+ if ( $this->mNewRev->isMinor() ) {
+ $newminor = ChangesList::flag( 'minor' );
+ }
- /* Find LCS of two sequences.
- *
- * The results are recorded in the vectors $this->{x,y}changed[], by
- * storing a 1 in the element for each line that is an insertion
- * or deletion (ie. is not in the LCS).
- *
- * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
- *
- * Note that XLIM, YLIM are exclusive bounds.
- * All line numbers are origin-0 and discarded lines are not counted.
- */
- function _compareseq ($xoff, $xlim, $yoff, $ylim) {
- // Slide down the bottom initial diagonal.
- while ($xoff < $xlim && $yoff < $ylim
- && $this->xv[$xoff] == $this->yv[$yoff]) {
- ++$xoff;
- ++$yoff;
- }
-
- // Slide up the top initial diagonal.
- while ($xlim > $xoff && $ylim > $yoff
- && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) {
- --$xlim;
- --$ylim;
- }
-
- if ($xoff == $xlim || $yoff == $ylim)
- $lcs = 0;
- else {
- // This is ad hoc but seems to work well.
- //$nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
- //$nchunks = max(2,min(8,(int)$nchunks));
- $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1;
- list ($lcs, $seps)
- = $this->_diag($xoff,$xlim,$yoff, $ylim,$nchunks);
- }
-
- if ($lcs == 0) {
- // X and Y sequences have no common subsequence:
- // mark all changed.
- while ($yoff < $ylim)
- $this->ychanged[$this->yind[$yoff++]] = 1;
- while ($xoff < $xlim)
- $this->xchanged[$this->xind[$xoff++]] = 1;
+ # Handle RevisionDelete links...
+ $ldel = $this->revisionDeleteLink( $this->mOldRev );
+ $rdel = $this->revisionDeleteLink( $this->mNewRev );
+
+ $oldHeader = '<div id="mw-diff-otitle1"><strong>' . $this->mOldtitle . '</strong></div>' .
+ '<div id="mw-diff-otitle2">' .
+ $sk->revUserTools( $this->mOldRev, !$this->unhide ) . '</div>' .
+ '<div id="mw-diff-otitle3">' . $oldminor .
+ $sk->revComment( $this->mOldRev, !$diffOnly, !$this->unhide ) . $ldel . '</div>' .
+ '<div id="mw-diff-otitle4">' . $prevlink . '</div>';
+ $newHeader = '<div id="mw-diff-ntitle1"><strong>' . $this->mNewtitle . '</strong></div>' .
+ '<div id="mw-diff-ntitle2">' . $sk->revUserTools( $this->mNewRev, !$this->unhide ) .
+ " $rollback</div>" .
+ '<div id="mw-diff-ntitle3">' . $newminor .
+ $sk->revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
+ '<div id="mw-diff-ntitle4">' . $nextlink . $patrol . '</div>';
+
+ # Check if this user can see the revisions
+ $allowed = $this->mOldRev->userCan( Revision::DELETED_TEXT )
+ && $this->mNewRev->userCan( Revision::DELETED_TEXT );
+ # Check if one of the revisions is deleted/suppressed
+ $deleted = $suppressed = false;
+ if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $deleted = true; // old revisions text is hidden
+ if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) )
+ $suppressed = true; // also suppressed
+ }
+ if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $deleted = true; // new revisions text is hidden
+ if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) )
+ $suppressed = true; // also suppressed
+ }
+ # If the diff cannot be shown due to a deleted revision, then output
+ # the diff header and links to unhide (if available)...
+ if ( $deleted && ( !$this->unhide || !$allowed ) ) {
+ $this->showDiffStyle();
+ $multi = $this->getMultiNotice();
+ $wgOut->addHTML( $this->addHeader( '', $oldHeader, $newHeader, $multi ) );
+ if ( !$allowed ) {
+ $msg = $suppressed ? 'rev-suppressed-no-diff' : 'rev-deleted-no-diff';
+ # Give explanation for why revision is not visible
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ array( $msg ) );
+ } else {
+ # Give explanation and add a link to view the diff...
+ $link = $this->mTitle->getFullUrl( array(
+ 'diff' => $this->mNewid,
+ 'oldid' => $this->mOldid,
+ 'unhide' => 1
+ ) );
+ $msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
+ }
+ # Otherwise, output a regular diff...
} else {
- // Use the partitions to split this problem into subproblems.
- reset($seps);
- $pt1 = $seps[0];
- while ($pt2 = next($seps)) {
- $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]);
- $pt1 = $pt2;
+ # Add deletion notice if the user is viewing deleted content
+ $notice = '';
+ if ( $deleted ) {
+ $msg = $suppressed ? 'rev-suppressed-diff-view' : 'rev-deleted-diff-view';
+ $notice = "<div class='mw-warning plainlinks'>\n" . wfMsgExt( $msg, 'parseinline' ) . "</div>\n";
+ }
+ $this->showDiff( $oldHeader, $newHeader, $notice );
+ if ( !$diffOnly ) {
+ $this->renderNewRevision();
}
}
+ wfProfileOut( __METHOD__ );
}
- /* Adjust inserts/deletes of identical lines to join changes
- * as much as possible.
- *
- * We do something when a run of changed lines include a
- * line at one end and has an excluded, identical line at the other.
- * We are free to choose which identical line is included.
- * `compareseq' usually chooses the one at the beginning,
- * but usually it is cleaner to consider the following identical line
- * to be the "change".
- *
- * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
- */
- function _shift_boundaries ($lines, &$changed, $other_changed) {
- wfProfileIn( __METHOD__ );
- $i = 0;
- $j = 0;
-
- USE_ASSERTS && assert('sizeof($lines) == sizeof($changed)');
- $len = sizeof($lines);
- $other_len = sizeof($other_changed);
-
- while (1) {
- /*
- * Scan forwards to find beginning of another run of changes.
- * Also keep track of the corresponding point in the other file.
- *
- * Throughout this code, $i and $j are adjusted together so that
- * the first $i elements of $changed and the first $j elements
- * of $other_changed both contain the same number of zeros
- * (unchanged lines).
- * Furthermore, $j is always kept so that $j == $other_len or
- * $other_changed[$j] == false.
- */
- while ($j < $other_len && $other_changed[$j])
- $j++;
-
- while ($i < $len && ! $changed[$i]) {
- USE_ASSERTS && assert('$j < $other_len && ! $other_changed[$j]');
- $i++; $j++;
- while ($j < $other_len && $other_changed[$j])
- $j++;
- }
-
- if ($i == $len)
- break;
-
- $start = $i;
-
- // Find the end of this run of changes.
- while (++$i < $len && $changed[$i])
- continue;
-
- do {
- /*
- * Record the length of this run of changes, so that
- * we can later determine whether the run has grown.
- */
- $runlength = $i - $start;
-
- /*
- * Move the changed region back, so long as the
- * previous unchanged line matches the last changed one.
- * This merges with previous changed regions.
- */
- while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) {
- $changed[--$start] = 1;
- $changed[--$i] = false;
- while ($start > 0 && $changed[$start - 1])
- $start--;
- USE_ASSERTS && assert('$j > 0');
- while ($other_changed[--$j])
- continue;
- USE_ASSERTS && assert('$j >= 0 && !$other_changed[$j]');
- }
-
- /*
- * Set CORRESPONDING to the end of the changed run, at the last
- * point where it corresponds to a changed run in the other file.
- * CORRESPONDING == LEN means no such point has been found.
- */
- $corresponding = $j < $other_len ? $i : $len;
-
- /*
- * Move the changed region forward, so long as the
- * first changed line matches the following unchanged one.
- * This merges with following changed regions.
- * Do this second, so that if there are no merges,
- * the changed region is moved forward as far as possible.
- */
- while ($i < $len && $lines[$start] == $lines[$i]) {
- $changed[$start++] = false;
- $changed[$i++] = 1;
- while ($i < $len && $changed[$i])
- $i++;
-
- USE_ASSERTS && assert('$j < $other_len && ! $other_changed[$j]');
- $j++;
- if ($j < $other_len && $other_changed[$j]) {
- $corresponding = $i;
- while ($j < $other_len && $other_changed[$j])
- $j++;
- }
- }
- } while ($runlength != $i - $start);
-
- /*
- * If possible, move the fully-merged run of changes
- * back to a corresponding run in the other file.
- */
- while ($corresponding < $i) {
- $changed[--$start] = 1;
- $changed[--$i] = 0;
- USE_ASSERTS && assert('$j > 0');
- while ($other_changed[--$j])
- continue;
- USE_ASSERTS && assert('$j >= 0 && !$other_changed[$j]');
+ protected function revisionDeleteLink( $rev ) {
+ global $wgUser;
+ $link = '';
+ $canHide = $wgUser->isAllowed( 'deleterevision' );
+ // Show del/undel link if:
+ // (a) the user can delete revisions, or
+ // (b) the user can view deleted revision *and* this one is deleted
+ if ( $canHide || ( $rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) ) {
+ $sk = $wgUser->getSkin();
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
+ $link = $sk->revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+ } else {
+ $query = array(
+ 'type' => 'revision',
+ 'target' => $rev->mTitle->getPrefixedDbkey(),
+ 'ids' => $rev->getId()
+ );
+ $link = $sk->revDeleteLink( $query,
+ $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
}
+ $link = '&#160;&#160;&#160;' . $link . ' ';
}
- wfProfileOut( __METHOD__ );
+ return $link;
}
-}
-
-/**
- * Class representing a 'diff' between two sequences of strings.
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class Diff
-{
- var $edits;
/**
- * Constructor.
- * Computes diff between sequences of strings.
- *
- * @param $from_lines array An array of strings.
- * (Typically these are lines from a file.)
- * @param $to_lines array An array of strings.
+ * Show the new revision of the page.
*/
- function Diff($from_lines, $to_lines) {
- $eng = new _DiffEngine;
- $this->edits = $eng->diff($from_lines, $to_lines);
- //$this->_check($from_lines, $to_lines);
- }
+ function renderNewRevision() {
+ global $wgOut, $wgUser;
+ wfProfileIn( __METHOD__ );
- /**
- * Compute reversed Diff.
- *
- * SYNOPSIS:
- *
- * $diff = new Diff($lines1, $lines2);
- * $rev = $diff->reverse();
- * @return object A Diff object representing the inverse of the
- * original diff.
- */
- function reverse () {
- $rev = $this;
- $rev->edits = array();
- foreach ($this->edits as $edit) {
- $rev->edits[] = $edit->reverse();
+ $wgOut->addHTML( "<hr /><h2>{$this->mPagetitle}</h2>\n" );
+ # Add deleted rev tag if needed
+ if ( !$this->mNewRev->userCan( Revision::DELETED_TEXT ) ) {
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+ } else if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
}
- return $rev;
- }
- /**
- * Check for empty diff.
- *
- * @return bool True iff two sequences were identical.
- */
- function isEmpty () {
- foreach ($this->edits as $edit) {
- if ($edit->type != 'copy')
- return false;
+ $pCache = true;
+ if ( !$this->mNewRev->isCurrent() ) {
+ $oldEditSectionSetting = $wgOut->parserOptions()->setEditSection( false );
+ $pCache = false;
}
- return true;
- }
- /**
- * Compute the length of the Longest Common Subsequence (LCS).
- *
- * This is mostly for diagnostic purposed.
- *
- * @return int The length of the LCS.
- */
- function lcs () {
- $lcs = 0;
- foreach ($this->edits as $edit) {
- if ($edit->type == 'copy')
- $lcs += sizeof($edit->orig);
+ $this->loadNewText();
+ if ( is_object( $this->mNewRev ) ) {
+ $wgOut->setRevisionId( $this->mNewRev->getId() );
}
- return $lcs;
- }
-
- /**
- * Get the original set of lines.
- *
- * This reconstructs the $from_lines parameter passed to the
- * constructor.
- *
- * @return array The original sequence of strings.
- */
- function orig() {
- $lines = array();
- foreach ($this->edits as $edit) {
- if ($edit->orig)
- array_splice($lines, sizeof($lines), 0, $edit->orig);
+ if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
+ // Stolen from Article::view --AG 2007-10-11
+ // Give hooks a chance to customise the output
+ if ( wfRunHooks( 'ShowRawCssJs', array( $this->mNewtext, $this->mTitle, $wgOut ) ) ) {
+ // Wrap the whole lot in a <pre> and don't parse
+ $m = array();
+ preg_match( '!\.(css|js)$!u', $this->mTitle->getText(), $m );
+ $wgOut->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
+ $wgOut->addHTML( htmlspecialchars( $this->mNewtext ) );
+ $wgOut->addHTML( "\n</pre>\n" );
+ }
+ } elseif ( wfRunHooks( 'ArticleContentOnDiff', array( $this, $wgOut ) ) ) {
+ if ( $pCache ) {
+ $article = new Article( $this->mTitle, 0 );
+ $pOutput = ParserCache::singleton()->get( $article, $wgOut->parserOptions() );
+ if ( $pOutput ) {
+ $wgOut->addParserOutput( $pOutput );
+ } else {
+ $article->doViewParse();
+ }
+ } else {
+ $wgOut->addWikiTextTidy( $this->mNewtext );
+ }
}
- return $lines;
- }
- /**
- * Get the closing set of lines.
- *
- * This reconstructs the $to_lines parameter passed to the
- * constructor.
- *
- * @return array The sequence of strings.
- */
- function closing() {
- $lines = array();
+ if ( is_object( $this->mNewRev ) && !$this->mNewRev->isCurrent() ) {
+ $wgOut->parserOptions()->setEditSection( $oldEditSectionSetting );
+ }
- foreach ($this->edits as $edit) {
- if ($edit->closing)
- array_splice($lines, sizeof($lines), 0, $edit->closing);
+ # Add redundant patrol link on bottom...
+ if ( $this->mRcidMarkPatrolled && $this->mTitle->quickUserCan( 'patrol' ) ) {
+ $sk = $wgUser->getSkin();
+ $token = $wgUser->editToken( $this->mRcidMarkPatrolled );
+ $wgOut->preventClickjacking();
+ $wgOut->addHTML(
+ "<div class='patrollink'>[" . $sk->link(
+ $this->mTitle,
+ wfMsgHtml( 'markaspatrolleddiff' ),
+ array(),
+ array(
+ 'action' => 'markpatrolled',
+ 'rcid' => $this->mRcidMarkPatrolled,
+ 'token' => $token,
+ )
+ ) . ']</div>'
+ );
}
- return $lines;
+
+ wfProfileOut( __METHOD__ );
}
/**
- * Check a Diff for validity.
- *
- * This is here only for debugging purposes.
+ * Show the first revision of an article. Uses normal diff headers in
+ * contrast to normal "old revision" display style.
*/
- function _check ($from_lines, $to_lines) {
+ function showFirstRevision() {
+ global $wgOut, $wgUser;
wfProfileIn( __METHOD__ );
- if (serialize($from_lines) != serialize($this->orig()))
- trigger_error("Reconstructed original doesn't match", E_USER_ERROR);
- if (serialize($to_lines) != serialize($this->closing()))
- trigger_error("Reconstructed closing doesn't match", E_USER_ERROR);
- $rev = $this->reverse();
- if (serialize($to_lines) != serialize($rev->orig()))
- trigger_error("Reversed original doesn't match", E_USER_ERROR);
- if (serialize($from_lines) != serialize($rev->closing()))
- trigger_error("Reversed closing doesn't match", E_USER_ERROR);
+ # Get article text from the DB
+ #
+ if ( ! $this->loadNewText() ) {
+ $t = $this->mTitle->getPrefixedText();
+ $d = wfMsgExt( 'missingarticle-diff', array( 'escape' ), $this->mOldid, $this->mNewid );
+ $wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
+ $wgOut->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", $d );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+ if ( $this->mNewRev->isCurrent() ) {
+ $wgOut->setArticleFlag( true );
+ }
+
+ # Check if user is allowed to look at this page. If not, bail out.
+ #
+ if ( !$this->mTitle->userCanRead() ) {
+ $wgOut->loginToUse();
+ $wgOut->output();
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "Permission Error: you do not have access to view this page" );
+ }
+ # Prepare the header box
+ #
+ $sk = $wgUser->getSkin();
- $prevtype = 'none';
- foreach ($this->edits as $edit) {
- if ( $prevtype == $edit->type )
- trigger_error("Edit sequence is non-optimal", E_USER_ERROR);
- $prevtype = $edit->type;
+ $next = $this->mTitle->getNextRevisionID( $this->mNewid );
+ if ( !$next ) {
+ $nextlink = '';
+ } else {
+ $nextlink = '<br />' . $sk->link(
+ $this->mTitle,
+ wfMsgHtml( 'nextdiff' ),
+ array(
+ 'id' => 'differences-nextlink'
+ ),
+ array(
+ 'diff' => 'next',
+ 'oldid' => $this->mNewid,
+ ),
+ array(
+ 'known',
+ 'noclasses'
+ )
+ );
}
+ $header = "<div class=\"firstrevisionheader\" style=\"text-align: center\">" .
+ $sk->revUserTools( $this->mNewRev ) . "<br />" . $sk->revComment( $this->mNewRev ) . $nextlink . "</div>\n";
+
+ $wgOut->addHTML( $header );
+
+ $wgOut->setSubtitle( wfMsgExt( 'difference', array( 'parseinline' ) ) );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $lcs = $this->lcs();
- trigger_error('Diff okay: LCS = '.$lcs, E_USER_NOTICE);
wfProfileOut( __METHOD__ );
}
-}
-/**
- * @todo document, bad name.
- * @private
- * @ingroup DifferenceEngine
- */
-class MappedDiff extends Diff
-{
/**
- * Constructor.
- *
- * Computes diff between sequences of strings.
- *
- * This can be used to compute things like
- * case-insensitve diffs, or diffs which ignore
- * changes in white-space.
- *
- * @param $from_lines array An array of strings.
- * (Typically these are lines from a file.)
- *
- * @param $to_lines array An array of strings.
- *
- * @param $mapped_from_lines array This array should
- * have the same size number of elements as $from_lines.
- * The elements in $mapped_from_lines and
- * $mapped_to_lines are what is actually compared
- * when computing the diff.
- *
- * @param $mapped_to_lines array This array should
- * have the same number of elements as $to_lines.
+ * Get the diff text, send it to $wgOut
+ * Returns false if the diff could not be generated, otherwise returns true
*/
- function MappedDiff($from_lines, $to_lines,
- $mapped_from_lines, $mapped_to_lines) {
- wfProfileIn( __METHOD__ );
-
- assert(sizeof($from_lines) == sizeof($mapped_from_lines));
- assert(sizeof($to_lines) == sizeof($mapped_to_lines));
-
- $this->Diff($mapped_from_lines, $mapped_to_lines);
-
- $xi = $yi = 0;
- for ($i = 0; $i < sizeof($this->edits); $i++) {
- $orig = &$this->edits[$i]->orig;
- if (is_array($orig)) {
- $orig = array_slice($from_lines, $xi, sizeof($orig));
- $xi += sizeof($orig);
- }
-
- $closing = &$this->edits[$i]->closing;
- if (is_array($closing)) {
- $closing = array_slice($to_lines, $yi, sizeof($closing));
- $yi += sizeof($closing);
- }
+ function showDiff( $otitle, $ntitle, $notice = '' ) {
+ global $wgOut;
+ $diff = $this->getDiff( $otitle, $ntitle, $notice );
+ if ( $diff === false ) {
+ $wgOut->addWikiMsg( 'missing-article', "<nowiki>(fixme, bug)</nowiki>", '' );
+ return false;
+ } else {
+ $this->showDiffStyle();
+ $wgOut->addHTML( $diff );
+ return true;
}
- wfProfileOut( __METHOD__ );
}
-}
-/**
- * A class to format Diffs
- *
- * This class formats the diff in classic diff format.
- * It is intended that this class be customized via inheritance,
- * to obtain fancier outputs.
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class DiffFormatter {
/**
- * Number of leading context "lines" to preserve.
- *
- * This should be left at zero for this class, but subclasses
- * may want to set this to other values.
+ * Add style sheets and supporting JS for diff display.
*/
- var $leading_context_lines = 0;
+ function showDiffStyle() {
+ global $wgOut;
+ $wgOut->addModuleStyles( 'mediawiki.legacy.diff' );
+ $wgOut->addModuleScripts( 'mediawiki.legacy.diff' );
+ }
/**
- * Number of trailing context "lines" to preserve.
+ * Get complete diff table, including header
*
- * This should be left at zero for this class, but subclasses
- * may want to set this to other values.
+ * @param $otitle Title: old title
+ * @param $ntitle Title: new title
+ * @param $notice String: HTML between diff header and body
+ * @return mixed
*/
- var $trailing_context_lines = 0;
+ function getDiff( $otitle, $ntitle, $notice = '' ) {
+ $body = $this->getDiffBody();
+ if ( $body === false ) {
+ return false;
+ } else {
+ $multi = $this->getMultiNotice();
+ return $this->addHeader( $body, $otitle, $ntitle, $multi, $notice );
+ }
+ }
/**
- * Format a diff.
+ * Get the diff table body, without header
*
- * @param $diff object A Diff object.
- * @return string The formatted output.
+ * @return mixed (string/false)
*/
- function format($diff) {
+ public function getDiffBody() {
+ global $wgMemc;
wfProfileIn( __METHOD__ );
-
- $xi = $yi = 1;
- $block = false;
- $context = array();
-
- $nlead = $this->leading_context_lines;
- $ntrail = $this->trailing_context_lines;
-
- $this->_start_diff();
-
- foreach ($diff->edits as $edit) {
- if ($edit->type == 'copy') {
- if (is_array($block)) {
- if (sizeof($edit->orig) <= $nlead + $ntrail) {
- $block[] = $edit;
- }
- else{
- if ($ntrail) {
- $context = array_slice($edit->orig, 0, $ntrail);
- $block[] = new _DiffOp_Copy($context);
- }
- $this->_block($x0, $ntrail + $xi - $x0,
- $y0, $ntrail + $yi - $y0,
- $block);
- $block = false;
- }
- }
- $context = $edit->orig;
- }
- else {
- if (! is_array($block)) {
- $context = array_slice($context, sizeof($context) - $nlead);
- $x0 = $xi - sizeof($context);
- $y0 = $yi - sizeof($context);
- $block = array();
- if ($context)
- $block[] = new _DiffOp_Copy($context);
+ $this->mCacheHit = true;
+ // Check if the diff should be hidden from this user
+ if ( !$this->loadRevisionData() ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ } elseif ( $this->mOldRev && !$this->mOldRev->userCan( Revision::DELETED_TEXT ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ } elseif ( $this->mNewRev && !$this->mNewRev->userCan( Revision::DELETED_TEXT ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ // Short-circuit
+ if ( $this->mOldRev && $this->mNewRev
+ && $this->mOldRev->getID() == $this->mNewRev->getID() )
+ {
+ wfProfileOut( __METHOD__ );
+ return '';
+ }
+ // Cacheable?
+ $key = false;
+ if ( $this->mOldid && $this->mNewid ) {
+ $key = wfMemcKey( 'diff', 'version', MW_DIFF_VERSION,
+ 'oldid', $this->mOldid, 'newid', $this->mNewid );
+ // Try cache
+ if ( !$this->mRefreshCache ) {
+ $difftext = $wgMemc->get( $key );
+ if ( $difftext ) {
+ wfIncrStats( 'diff_cache_hit' );
+ $difftext = $this->localiseLineNumbers( $difftext );
+ $difftext .= "\n<!-- diff cache key $key -->\n";
+ wfProfileOut( __METHOD__ );
+ return $difftext;
}
- $block[] = $edit;
- }
+ } // don't try to load but save the result
+ }
+ $this->mCacheHit = false;
- if ($edit->orig)
- $xi += sizeof($edit->orig);
- if ($edit->closing)
- $yi += sizeof($edit->closing);
+ // Loadtext is permission safe, this just clears out the diff
+ if ( !$this->loadText() ) {
+ wfProfileOut( __METHOD__ );
+ return false;
}
- if (is_array($block))
- $this->_block($x0, $xi - $x0,
- $y0, $yi - $y0,
- $block);
+ $difftext = $this->generateDiffBody( $this->mOldtext, $this->mNewtext );
- $end = $this->_end_diff();
+ // Save to cache for 7 days
+ if ( !wfRunHooks( 'AbortDiffCache', array( &$this ) ) ) {
+ wfIncrStats( 'diff_uncacheable' );
+ } elseif ( $key !== false && $difftext !== false ) {
+ wfIncrStats( 'diff_cache_miss' );
+ $wgMemc->set( $key, $difftext, 7 * 86400 );
+ } else {
+ wfIncrStats( 'diff_uncacheable' );
+ }
+ // Replace line numbers with the text in the user's language
+ if ( $difftext !== false ) {
+ $difftext = $this->localiseLineNumbers( $difftext );
+ }
wfProfileOut( __METHOD__ );
- return $end;
+ return $difftext;
}
- function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) {
- wfProfileIn( __METHOD__ );
- $this->_start_block($this->_block_header($xbeg, $xlen, $ybeg, $ylen));
- foreach ($edits as $edit) {
- if ($edit->type == 'copy')
- $this->_context($edit->orig);
- elseif ($edit->type == 'add')
- $this->_added($edit->closing);
- elseif ($edit->type == 'delete')
- $this->_deleted($edit->orig);
- elseif ($edit->type == 'change')
- $this->_changed($edit->orig, $edit->closing);
- else
- trigger_error('Unknown edit type', E_USER_ERROR);
- }
- $this->_end_block();
- wfProfileOut( __METHOD__ );
+ /**
+ * Make sure the proper modules are loaded before we try to
+ * make the diff
+ */
+ private function initDiffEngines() {
+ global $wgExternalDiffEngine;
+ if ( $wgExternalDiffEngine == 'wikidiff' && !function_exists( 'wikidiff_do_diff' ) ) {
+ wfProfileIn( __METHOD__ . '-php_wikidiff.so' );
+ wfSuppressWarnings();
+ dl( 'php_wikidiff.so' );
+ wfRestoreWarnings();
+ wfProfileOut( __METHOD__ . '-php_wikidiff.so' );
+ }
+ else if ( $wgExternalDiffEngine == 'wikidiff2' && !function_exists( 'wikidiff2_do_diff' ) ) {
+ wfProfileIn( __METHOD__ . '-php_wikidiff2.so' );
+ wfSuppressWarnings();
+ wfDl( 'wikidiff2' );
+ wfRestoreWarnings();
+ wfProfileOut( __METHOD__ . '-php_wikidiff2.so' );
+ }
}
- function _start_diff() {
- ob_start();
- }
+ /**
+ * Generate a diff, no caching
+ *
+ * @param $otext String: old text, must be already segmented
+ * @param $ntext String: new text, must be already segmented
+ */
+ function generateDiffBody( $otext, $ntext ) {
+ global $wgExternalDiffEngine, $wgContLang;
- function _end_diff() {
- $val = ob_get_contents();
- ob_end_clean();
- return $val;
- }
+ $otext = str_replace( "\r\n", "\n", $otext );
+ $ntext = str_replace( "\r\n", "\n", $ntext );
- function _block_header($xbeg, $xlen, $ybeg, $ylen) {
- if ($xlen > 1)
- $xbeg .= "," . ($xbeg + $xlen - 1);
- if ($ylen > 1)
- $ybeg .= "," . ($ybeg + $ylen - 1);
+ $this->initDiffEngines();
- return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg;
- }
+ if ( $wgExternalDiffEngine == 'wikidiff' && function_exists( 'wikidiff_do_diff' ) ) {
+ # For historical reasons, external diff engine expects
+ # input text to be HTML-escaped already
+ $otext = htmlspecialchars ( $wgContLang->segmentForDiff( $otext ) );
+ $ntext = htmlspecialchars ( $wgContLang->segmentForDiff( $ntext ) );
+ return $wgContLang->unsegmentForDiff( wikidiff_do_diff( $otext, $ntext, 2 ) ) .
+ $this->debug( 'wikidiff1' );
+ }
- function _start_block($header) {
- echo $header . "\n";
- }
+ if ( $wgExternalDiffEngine == 'wikidiff2' && function_exists( 'wikidiff2_do_diff' ) ) {
+ # Better external diff engine, the 2 may some day be dropped
+ # This one does the escaping and segmenting itself
+ wfProfileIn( 'wikidiff2_do_diff' );
+ $text = wikidiff2_do_diff( $otext, $ntext, 2 );
+ $text .= $this->debug( 'wikidiff2' );
+ wfProfileOut( 'wikidiff2_do_diff' );
+ return $text;
+ }
+ if ( $wgExternalDiffEngine != 'wikidiff3' && $wgExternalDiffEngine !== false ) {
+ # Diff via the shell
+ global $wgTmpDirectory;
+ $tempName1 = tempnam( $wgTmpDirectory, 'diff_' );
+ $tempName2 = tempnam( $wgTmpDirectory, 'diff_' );
+
+ $tempFile1 = fopen( $tempName1, "w" );
+ if ( !$tempFile1 ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ $tempFile2 = fopen( $tempName2, "w" );
+ if ( !$tempFile2 ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ fwrite( $tempFile1, $otext );
+ fwrite( $tempFile2, $ntext );
+ fclose( $tempFile1 );
+ fclose( $tempFile2 );
+ $cmd = wfEscapeShellArg( $wgExternalDiffEngine, $tempName1, $tempName2 );
+ wfProfileIn( __METHOD__ . "-shellexec" );
+ $difftext = wfShellExec( $cmd );
+ $difftext .= $this->debug( "external $wgExternalDiffEngine" );
+ wfProfileOut( __METHOD__ . "-shellexec" );
+ unlink( $tempName1 );
+ unlink( $tempName2 );
+ wfProfileOut( __METHOD__ );
+ return $difftext;
+ }
- function _end_block() {
+ # Native PHP diff
+ $ota = explode( "\n", $wgContLang->segmentForDiff( $otext ) );
+ $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) );
+ $diffs = new Diff( $ota, $nta );
+ $formatter = new TableDiffFormatter();
+ $difftext = $wgContLang->unsegmentForDiff( $formatter->format( $diffs ) ) .
+ wfProfileOut( __METHOD__ );
+ return $difftext;
+ $this->debug();
}
- function _lines($lines, $prefix = ' ') {
- foreach ($lines as $line)
- echo "$prefix $line\n";
+ /**
+ * Generate a debug comment indicating diff generating time,
+ * server node, and generator backend.
+ */
+ protected function debug( $generator = "internal" ) {
+ global $wgShowHostnames;
+ if ( !$this->enableDebugComment ) {
+ return '';
+ }
+ $data = array( $generator );
+ if ( $wgShowHostnames ) {
+ $data[] = wfHostname();
+ }
+ $data[] = wfTimestamp( TS_DB );
+ return "<!-- diff generator: " .
+ implode( " ",
+ array_map(
+ "htmlspecialchars",
+ $data ) ) .
+ " -->\n";
}
- function _context($lines) {
- $this->_lines($lines);
+ /**
+ * Replace line numbers with the text in the user's language
+ */
+ function localiseLineNumbers( $text ) {
+ return preg_replace_callback( '/<!--LINE (\d+)-->/',
+ array( &$this, 'localiseLineNumbersCb' ), $text );
}
- function _added($lines) {
- $this->_lines($lines, '>');
- }
- function _deleted($lines) {
- $this->_lines($lines, '<');
+ function localiseLineNumbersCb( $matches ) {
+ global $wgLang;
+ if ( $matches[1] === '1' && $this->mReducedLineNumbers ) return '';
+ return wfMsgExt( 'lineno', 'escape', $wgLang->formatNum( $matches[1] ) );
}
- function _changed($orig, $closing) {
- $this->_deleted($orig);
- echo "---\n";
- $this->_added($closing);
- }
-}
-/**
- * A formatter that outputs unified diffs
- * @ingroup DifferenceEngine
- */
+ /**
+ * If there are revisions between the ones being compared, return a note saying so.
+ * @return string
+ */
+ function getMultiNotice() {
+ if ( !is_object( $this->mOldRev ) || !is_object( $this->mNewRev ) ) {
+ return '';
+ } elseif ( !$this->mOldPage->equals( $this->mNewPage ) ) {
+ // Comparing two different pages? Count would be meaningless.
+ return '';
+ }
-class UnifiedDiffFormatter extends DiffFormatter {
- var $leading_context_lines = 2;
- var $trailing_context_lines = 2;
+ $oldid = $this->mOldRev->getId();
+ $newid = $this->mNewRev->getId();
+ if ( $oldid > $newid ) {
+ $tmp = $oldid; $oldid = $newid; $newid = $tmp;
+ }
- function _added($lines) {
- $this->_lines($lines, '+');
- }
- function _deleted($lines) {
- $this->_lines($lines, '-');
- }
- function _changed($orig, $closing) {
- $this->_deleted($orig);
- $this->_added($closing);
- }
- function _block_header($xbeg, $xlen, $ybeg, $ylen) {
- return "@@ -$xbeg,$xlen +$ybeg,$ylen @@";
+ $nEdits = $this->mTitle->countRevisionsBetween( $oldid, $newid );
+ if ( $nEdits > 0 ) {
+ $limit = 100;
+ // We use ($limit + 1) so we can detect if there are > 100 authors
+ // in a given revision range. In that case, diff-multi-manyusers is used.
+ $numUsers = $this->mTitle->countAuthorsBetween( $oldid, $newid, $limit + 1 );
+ return self::intermediateEditsMsg( $nEdits, $numUsers, $limit );
+ }
+ return ''; // nothing
}
-}
-/**
- * A pseudo-formatter that just passes along the Diff::$edits array
- * @ingroup DifferenceEngine
- */
-class ArrayDiffFormatter extends DiffFormatter {
- function format($diff) {
- $oldline = 1;
- $newline = 1;
- $retval = array();
- foreach($diff->edits as $edit)
- switch($edit->type) {
- case 'add':
- foreach($edit->closing as $l) {
- $retval[] = array(
- 'action' => 'add',
- 'new'=> $l,
- 'newline' => $newline++
- );
- }
- break;
- case 'delete':
- foreach($edit->orig as $l) {
- $retval[] = array(
- 'action' => 'delete',
- 'old' => $l,
- 'oldline' => $oldline++,
- );
- }
- break;
- case 'change':
- foreach($edit->orig as $i => $l) {
- $retval[] = array(
- 'action' => 'change',
- 'old' => $l,
- 'new' => @$edit->closing[$i],
- 'oldline' => $oldline++,
- 'newline' => $newline++,
- );
- }
- break;
- case 'copy':
- $oldline += count($edit->orig);
- $newline += count($edit->orig);
+ /**
+ * Get a notice about how many intermediate edits and users there are
+ * @param $numEdits int
+ * @param $numUsers int
+ * @param $limit int
+ * @return string
+ */
+ public static function intermediateEditsMsg( $numEdits, $numUsers, $limit ) {
+ global $wgLang;
+ if ( $numUsers > $limit ) {
+ $msg = 'diff-multi-manyusers';
+ $numUsers = $limit;
+ } else {
+ $msg = 'diff-multi';
}
- return $retval;
+ return wfMsgExt( $msg, 'parseinline',
+ $wgLang->formatnum( $numEdits ), $wgLang->formatnum( $numUsers ) );
}
-}
-/**
- * Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
- *
- */
-
-define('NBSP', '&#160;'); // iso-8859-x non-breaking space.
-
-/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class _HWLDF_WordAccumulator {
- function _HWLDF_WordAccumulator () {
- $this->_lines = array();
- $this->_line = '';
- $this->_group = '';
- $this->_tag = '';
- }
+ /**
+ * Add the header to a diff body
+ */
+ static function addHeader( $diff, $otitle, $ntitle, $multi = '', $notice = '' ) {
+ $header = "<table class='diff'>";
+ if ( $diff ) { // Safari/Chrome show broken output if cols not used
+ $header .= "
+ <col class='diff-marker' />
+ <col class='diff-content' />
+ <col class='diff-marker' />
+ <col class='diff-content' />";
+ $colspan = 2;
+ $multiColspan = 4;
+ } else {
+ $colspan = 1;
+ $multiColspan = 2;
+ }
+ $header .= "
+ <tr valign='top'>
+ <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
+ <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
+ </tr>";
+
+ if ( $multi != '' ) {
+ $header .= "<tr><td colspan='{$multiColspan}' align='center' class='diff-multi'>{$multi}</td></tr>";
+ }
+ if ( $notice != '' ) {
+ $header .= "<tr><td colspan='{$multiColspan}' align='center'>{$notice}</td></tr>";
+ }
- function _flushGroup ($new_tag) {
- if ($this->_group !== '') {
- if ($this->_tag == 'ins')
- $this->_line .= '<ins class="diffchange diffchange-inline">' .
- htmlspecialchars ( $this->_group ) . '</ins>';
- elseif ($this->_tag == 'del')
- $this->_line .= '<del class="diffchange diffchange-inline">' .
- htmlspecialchars ( $this->_group ) . '</del>';
- else
- $this->_line .= htmlspecialchars ( $this->_group );
- }
- $this->_group = '';
- $this->_tag = $new_tag;
+ return $header . $diff . "</table>";
}
- function _flushLine ($new_tag) {
- $this->_flushGroup($new_tag);
- if ($this->_line != '')
- array_push ( $this->_lines, $this->_line );
- else
- # make empty lines visible by inserting an NBSP
- array_push ( $this->_lines, NBSP );
- $this->_line = '';
+ /**
+ * Use specified text instead of loading from the database
+ */
+ function setText( $oldText, $newText ) {
+ $this->mOldtext = $oldText;
+ $this->mNewtext = $newText;
+ $this->mTextLoaded = 2;
+ $this->mRevisionsLoaded = true;
}
- function addWords ($words, $tag = '') {
- if ($tag != $this->_tag)
- $this->_flushGroup($tag);
-
- foreach ($words as $word) {
- // new-line should only come as first char of word.
- if ($word == '')
- continue;
- if ($word[0] == "\n") {
- $this->_flushLine($tag);
- $word = substr($word, 1);
- }
- assert(!strstr($word, "\n"));
- $this->_group .= $word;
+ /**
+ * Load revision metadata for the specified articles. If newid is 0, then compare
+ * the old article in oldid to the current article; if oldid is 0, then
+ * compare the current article to the immediately previous one (ignoring the
+ * value of newid).
+ *
+ * If oldid is false, leave the corresponding revision object set
+ * to false. This is impossible via ordinary user input, and is provided for
+ * API convenience.
+ */
+ function loadRevisionData() {
+ global $wgLang, $wgUser;
+ if ( $this->mRevisionsLoaded ) {
+ return true;
+ } else {
+ // Whether it succeeds or fails, we don't want to try again
+ $this->mRevisionsLoaded = true;
}
- }
- function getLines() {
- $this->_flushLine('~done');
- return $this->_lines;
- }
-}
-
-/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class WordLevelDiff extends MappedDiff {
- const MAX_LINE_LENGTH = 10000;
-
- function WordLevelDiff ($orig_lines, $closing_lines) {
- wfProfileIn( __METHOD__ );
-
- list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
- list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
-
- $this->MappedDiff($orig_words, $closing_words,
- $orig_stripped, $closing_stripped);
- wfProfileOut( __METHOD__ );
- }
+ // Load the new revision object
+ $this->mNewRev = $this->mNewid
+ ? Revision::newFromId( $this->mNewid )
+ : Revision::newFromTitle( $this->mTitle );
+ if ( !$this->mNewRev instanceof Revision )
+ return false;
- function _split($lines) {
- wfProfileIn( __METHOD__ );
+ // Update the new revision ID in case it was 0 (makes life easier doing UI stuff)
+ $this->mNewid = $this->mNewRev->getId();
+
+ // Check if page is editable
+ $editable = $this->mNewRev->getTitle()->userCan( 'edit' );
+
+ // Set assorted variables
+ $timestamp = $wgLang->timeanddate( $this->mNewRev->getTimestamp(), true );
+ $dateofrev = $wgLang->date( $this->mNewRev->getTimestamp(), true );
+ $timeofrev = $wgLang->time( $this->mNewRev->getTimestamp(), true );
+ $this->mNewPage = $this->mNewRev->getTitle();
+ if ( $this->mNewRev->isCurrent() ) {
+ $newLink = $this->mNewPage->escapeLocalUrl( array(
+ 'oldid' => $this->mNewid
+ ) );
+ $this->mPagetitle = htmlspecialchars( wfMsg(
+ 'currentrev-asof',
+ $timestamp,
+ $dateofrev,
+ $timeofrev
+ ) );
+ $newEdit = $this->mNewPage->escapeLocalUrl( array(
+ 'action' => 'edit'
+ ) );
+
+ $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>";
+ $this->mNewtitle .= " (<a href='$newEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
+ } else {
+ $newLink = $this->mNewPage->escapeLocalUrl( array(
+ 'oldid' => $this->mNewid
+ ) );
+ $newEdit = $this->mNewPage->escapeLocalUrl( array(
+ 'action' => 'edit',
+ 'oldid' => $this->mNewid
+ ) );
+ $this->mPagetitle = htmlspecialchars( wfMsg(
+ 'revisionasof',
+ $timestamp,
+ $dateofrev,
+ $timeofrev
+ ) );
+
+ $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>";
+ $this->mNewtitle .= " (<a href='$newEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
+ }
+ if ( !$this->mNewRev->userCan( Revision::DELETED_TEXT ) ) {
+ $this->mNewtitle = "<span class='history-deleted'>{$this->mPagetitle}</span>";
+ } else if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $this->mNewtitle = "<span class='history-deleted'>{$this->mNewtitle}</span>";
+ }
- $words = array();
- $stripped = array();
- $first = true;
- foreach ( $lines as $line ) {
- # If the line is too long, just pretend the entire line is one big word
- # This prevents resource exhaustion problems
- if ( $first ) {
- $first = false;
+ // Load the old revision object
+ $this->mOldRev = false;
+ if ( $this->mOldid ) {
+ $this->mOldRev = Revision::newFromId( $this->mOldid );
+ } elseif ( $this->mOldid === 0 ) {
+ $rev = $this->mNewRev->getPrevious();
+ if ( $rev ) {
+ $this->mOldid = $rev->getId();
+ $this->mOldRev = $rev;
} else {
- $words[] = "\n";
- $stripped[] = "\n";
+ // No previous revision; mark to show as first-version only.
+ $this->mOldid = false;
+ $this->mOldRev = false;
}
- if ( strlen( $line ) > self::MAX_LINE_LENGTH ) {
- $words[] = $line;
- $stripped[] = $line;
- } else {
- $m = array();
- if (preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
- $line, $m))
- {
- $words = array_merge( $words, $m[0] );
- $stripped = array_merge( $stripped, $m[1] );
- }
- }
- }
- wfProfileOut( __METHOD__ );
- return array($words, $stripped);
- }
-
- function orig () {
- wfProfileIn( __METHOD__ );
- $orig = new _HWLDF_WordAccumulator;
+ } /* elseif ( $this->mOldid === false ) leave mOldRev false; */
- foreach ($this->edits as $edit) {
- if ($edit->type == 'copy')
- $orig->addWords($edit->orig);
- elseif ($edit->orig)
- $orig->addWords($edit->orig, 'del');
+ if ( is_null( $this->mOldRev ) ) {
+ return false;
}
- $lines = $orig->getLines();
- wfProfileOut( __METHOD__ );
- return $lines;
- }
- function closing () {
- wfProfileIn( __METHOD__ );
- $closing = new _HWLDF_WordAccumulator;
+ if ( $this->mOldRev ) {
+ $this->mOldPage = $this->mOldRev->getTitle();
+
+ $t = $wgLang->timeanddate( $this->mOldRev->getTimestamp(), true );
+ $dateofrev = $wgLang->date( $this->mOldRev->getTimestamp(), true );
+ $timeofrev = $wgLang->time( $this->mOldRev->getTimestamp(), true );
+ $oldLink = $this->mOldPage->escapeLocalUrl( array(
+ 'oldid' => $this->mOldid
+ ) );
+ $oldEdit = $this->mOldPage->escapeLocalUrl( array(
+ 'action' => 'edit',
+ 'oldid' => $this->mOldid
+ ) );
+ $this->mOldPagetitle = htmlspecialchars( wfMsg( 'revisionasof', $t, $dateofrev, $timeofrev ) );
+
+ $this->mOldtitle = "<a href='$oldLink'>{$this->mOldPagetitle}</a>"
+ . " (<a href='$oldEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
+ // Add an "undo" link
+ $newUndo = $this->mNewPage->escapeLocalUrl( array(
+ 'action' => 'edit',
+ 'undoafter' => $this->mOldid,
+ 'undo' => $this->mNewid
+ ) );
+ $htmlLink = htmlspecialchars( wfMsg( 'editundo' ) );
+ $htmlTitle = Xml::expandAttributes( array( 'title' => $wgUser->getSkin()->titleAttrib( 'undo' ) ) );
+ if ( $editable && !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $this->mNewtitle .= " (<a href='$newUndo' $htmlTitle>" . $htmlLink . "</a>)";
+ }
- foreach ($this->edits as $edit) {
- if ($edit->type == 'copy')
- $closing->addWords($edit->closing);
- elseif ($edit->closing)
- $closing->addWords($edit->closing, 'ins');
+ if ( !$this->mOldRev->userCan( Revision::DELETED_TEXT ) ) {
+ $this->mOldtitle = '<span class="history-deleted">' . $this->mOldPagetitle . '</span>';
+ } else if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $this->mOldtitle = '<span class="history-deleted">' . $this->mOldtitle . '</span>';
+ }
}
- $lines = $closing->getLines();
- wfProfileOut( __METHOD__ );
- return $lines;
- }
-}
-
-/**
- * Wikipedia Table style diff formatter.
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class TableDiffFormatter extends DiffFormatter {
- function TableDiffFormatter() {
- $this->leading_context_lines = 2;
- $this->trailing_context_lines = 2;
- }
-
- public static function escapeWhiteSpace( $msg ) {
- $msg = preg_replace( '/^ /m', '&nbsp; ', $msg );
- $msg = preg_replace( '/ $/m', ' &nbsp;', $msg );
- $msg = preg_replace( '/ /', '&nbsp; ', $msg );
- return $msg;
- }
- function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
- $r = '<tr><td colspan="2" class="diff-lineno"><!--LINE '.$xbeg."--></td>\n" .
- '<td colspan="2" class="diff-lineno"><!--LINE '.$ybeg."--></td></tr>\n";
- return $r;
- }
-
- function _start_block( $header ) {
- echo $header;
- }
-
- function _end_block() {
- }
-
- function _lines( $lines, $prefix=' ', $color='white' ) {
- }
-
- # HTML-escape parameter before calling this
- function addedLine( $line ) {
- return $this->wrapLine( '+', 'diff-addedline', $line );
- }
-
- # HTML-escape parameter before calling this
- function deletedLine( $line ) {
- return $this->wrapLine( '-', 'diff-deletedline', $line );
- }
-
- # HTML-escape parameter before calling this
- function contextLine( $line ) {
- return $this->wrapLine( ' ', 'diff-context', $line );
+ return true;
}
- private function wrapLine( $marker, $class, $line ) {
- if( $line !== '' ) {
- // The <div> wrapper is needed for 'overflow: auto' style to scroll properly
- $line = Xml::tags( 'div', null, $this->escapeWhiteSpace( $line ) );
+ /**
+ * Load the text of the revisions, as well as revision data.
+ */
+ function loadText() {
+ if ( $this->mTextLoaded == 2 ) {
+ return true;
+ } else {
+ // Whether it succeeds or fails, we don't want to try again
+ $this->mTextLoaded = 2;
}
- return "<td class='diff-marker'>$marker</td><td class='$class'>$line</td>";
- }
- function emptyLine() {
- return '<td colspan="2">&nbsp;</td>';
- }
-
- function _added( $lines ) {
- foreach ($lines as $line) {
- echo '<tr>' . $this->emptyLine() .
- $this->addedLine( '<ins class="diffchange">' .
- htmlspecialchars ( $line ) . '</ins>' ) . "</tr>\n";
+ if ( !$this->loadRevisionData() ) {
+ return false;
}
- }
-
- function _deleted($lines) {
- foreach ($lines as $line) {
- echo '<tr>' . $this->deletedLine( '<del class="diffchange">' .
- htmlspecialchars ( $line ) . '</del>' ) .
- $this->emptyLine() . "</tr>\n";
+ if ( $this->mOldRev ) {
+ $this->mOldtext = $this->mOldRev->getText( Revision::FOR_THIS_USER );
+ if ( $this->mOldtext === false ) {
+ return false;
+ }
}
- }
-
- function _context( $lines ) {
- foreach ($lines as $line) {
- echo '<tr>' .
- $this->contextLine( htmlspecialchars ( $line ) ) .
- $this->contextLine( htmlspecialchars ( $line ) ) . "</tr>\n";
+ if ( $this->mNewRev ) {
+ $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
+ if ( $this->mNewtext === false ) {
+ return false;
+ }
}
+ return true;
}
- function _changed( $orig, $closing ) {
- wfProfileIn( __METHOD__ );
-
- $diff = new WordLevelDiff( $orig, $closing );
- $del = $diff->orig();
- $add = $diff->closing();
-
- # Notice that WordLevelDiff returns HTML-escaped output.
- # Hence, we will be calling addedLine/deletedLine without HTML-escaping.
-
- while ( $line = array_shift( $del ) ) {
- $aline = array_shift( $add );
- echo '<tr>' . $this->deletedLine( $line ) .
- $this->addedLine( $aline ) . "</tr>\n";
+ /**
+ * Load the text of the new revision, not the old one
+ */
+ function loadNewText() {
+ if ( $this->mTextLoaded >= 1 ) {
+ return true;
+ } else {
+ $this->mTextLoaded = 1;
}
- foreach ($add as $line) { # If any leftovers
- echo '<tr>' . $this->emptyLine() .
- $this->addedLine( $line ) . "</tr>\n";
+ if ( !$this->loadRevisionData() ) {
+ return false;
}
- wfProfileOut( __METHOD__ );
+ $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
+ return true;
}
}
diff --git a/includes/diff/DifferenceInterface.php b/includes/diff/DifferenceInterface.php
deleted file mode 100644
index 0e9ca9f6..00000000
--- a/includes/diff/DifferenceInterface.php
+++ /dev/null
@@ -1,1024 +0,0 @@
-<?php
-/**
- * @defgroup DifferenceEngine DifferenceEngine
- */
-
-/**
- * Constant to indicate diff cache compatibility.
- * Bump this when changing the diff formatting in a way that
- * fixes important bugs or such to force cached diff views to
- * clear.
- */
-define( 'MW_DIFF_VERSION', '1.11a' );
-
-/**
- * @todo document
- * @ingroup DifferenceEngine
- */
-class DifferenceEngine {
- /**#@+
- * @private
- */
- var $mOldid, $mNewid, $mTitle;
- var $mOldtitle, $mNewtitle, $mPagetitle;
- var $mOldtext, $mNewtext;
- var $mOldPage, $mNewPage;
- var $mRcidMarkPatrolled;
- var $mOldRev, $mNewRev;
- var $mRevisionsLoaded = false; // Have the revisions been loaded
- var $mTextLoaded = 0; // How many text blobs have been loaded, 0, 1 or 2?
- var $mCacheHit = false; // Was the diff fetched from cache?
-
- /**
- * Set this to true to add debug info to the HTML output.
- * Warning: this may cause RSS readers to spuriously mark articles as "new"
- * (bug 20601)
- */
- var $enableDebugComment = false;
-
- // If true, line X is not displayed when X is 1, for example to increase
- // readability and conserve space with many small diffs.
- protected $mReducedLineNumbers = false;
-
- protected $unhide = false;
- /**#@-*/
-
- /**
- * Constructor
- * @param $titleObj Title object that the diff is associated with
- * @param $old Integer: old ID we want to show and diff with.
- * @param $new String: either 'prev' or 'next'.
- * @param $rcid Integer: ??? FIXME (default 0)
- * @param $refreshCache boolean If set, refreshes the diff cache
- * @param $unhide boolean If set, allow viewing deleted revs
- */
- function __construct( $titleObj = null, $old = 0, $new = 0, $rcid = 0,
- $refreshCache = false, $unhide = false )
- {
- if ( $titleObj ) {
- $this->mTitle = $titleObj;
- } else {
- global $wgTitle;
- $this->mTitle = $wgTitle;
- }
- wfDebug("DifferenceEngine old '$old' new '$new' rcid '$rcid'\n");
-
- if ( 'prev' === $new ) {
- # Show diff between revision $old and the previous one.
- # Get previous one from DB.
- $this->mNewid = intval($old);
- $this->mOldid = $this->mTitle->getPreviousRevisionID( $this->mNewid );
- } elseif ( 'next' === $new ) {
- # Show diff between revision $old and the next one.
- # Get next one from DB.
- $this->mOldid = intval($old);
- $this->mNewid = $this->mTitle->getNextRevisionID( $this->mOldid );
- if ( false === $this->mNewid ) {
- # if no result, NewId points to the newest old revision. The only newer
- # revision is cur, which is "0".
- $this->mNewid = 0;
- }
- } else {
- $this->mOldid = intval($old);
- $this->mNewid = intval($new);
- wfRunHooks( 'NewDifferenceEngine', array(&$titleObj, &$this->mOldid, &$this->mNewid, $old, $new) );
- }
- $this->mRcidMarkPatrolled = intval($rcid); # force it to be an integer
- $this->mRefreshCache = $refreshCache;
- $this->unhide = $unhide;
- }
-
- function setReducedLineNumbers( $value = true ) {
- $this->mReducedLineNumbers = $value;
- }
-
- function getTitle() {
- return $this->mTitle;
- }
-
- function wasCacheHit() {
- return $this->mCacheHit;
- }
-
- function getOldid() {
- return $this->mOldid;
- }
-
- function getNewid() {
- return $this->mNewid;
- }
-
- function showDiffPage( $diffOnly = false ) {
- global $wgUser, $wgOut, $wgUseExternalEditor, $wgUseRCPatrol;
- wfProfileIn( __METHOD__ );
-
- # Allow frames except in certain special cases
- $wgOut->allowClickjacking();
-
- # If external diffs are enabled both globally and for the user,
- # we'll use the application/x-external-editor interface to call
- # an external diff tool like kompare, kdiff3, etc.
- if($wgUseExternalEditor && $wgUser->getOption('externaldiff')) {
- global $wgInputEncoding,$wgServer,$wgScript,$wgLang;
- $wgOut->disable();
- header ( "Content-type: application/x-external-editor; charset=".$wgInputEncoding );
- $url1=$this->mTitle->getFullURL( array(
- 'action' => 'raw',
- 'oldid' => $this->mOldid
- ) );
- $url2=$this->mTitle->getFullURL( array(
- 'action' => 'raw',
- 'oldid' => $this->mNewid
- ) );
- $special=$wgLang->getNsText(NS_SPECIAL);
- $control=<<<CONTROL
- [Process]
- Type=Diff text
- Engine=MediaWiki
- Script={$wgServer}{$wgScript}
- Special namespace={$special}
-
- [File]
- Extension=wiki
- URL=$url1
-
- [File 2]
- Extension=wiki
- URL=$url2
-CONTROL;
- echo($control);
- return;
- }
-
- $wgOut->setArticleFlag( false );
- if ( !$this->loadRevisionData() ) {
- $t = $this->mTitle->getPrefixedText();
- $d = wfMsgExt( 'missingarticle-diff', array( 'escape' ), $this->mOldid, $this->mNewid );
- $wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
- $wgOut->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", $d );
- wfProfileOut( __METHOD__ );
- return;
- }
-
- wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
-
- if ( $this->mNewRev->isCurrent() ) {
- $wgOut->setArticleFlag( true );
- }
-
- # mOldid is false if the difference engine is called with a "vague" query for
- # a diff between a version V and its previous version V' AND the version V
- # is the first version of that article. In that case, V' does not exist.
- if ( $this->mOldid === false ) {
- $this->showFirstRevision();
- $this->renderNewRevision(); // should we respect $diffOnly here or not?
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $wgOut->suppressQuickbar();
-
- $oldTitle = $this->mOldPage->getPrefixedText();
- $newTitle = $this->mNewPage->getPrefixedText();
- if( $oldTitle == $newTitle ) {
- $wgOut->setPageTitle( $newTitle );
- } else {
- $wgOut->setPageTitle( $oldTitle . ', ' . $newTitle );
- }
- $wgOut->setSubtitle( wfMsgExt( 'difference', array( 'parseinline' ) ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
-
- if ( !$this->mOldPage->userCanRead() || !$this->mNewPage->userCanRead() ) {
- $wgOut->loginToUse();
- $wgOut->output();
- $wgOut->disable();
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $sk = $wgUser->getSkin();
-
- // Check if page is editable
- $editable = $this->mNewRev->getTitle()->userCan( 'edit' );
- if ( $editable && $this->mNewRev->isCurrent() && $wgUser->isAllowed( 'rollback' ) ) {
- $wgOut->preventClickjacking();
- $rollback = '&nbsp;&nbsp;&nbsp;' . $sk->generateRollback( $this->mNewRev );
- } else {
- $rollback = '';
- }
-
- // Prepare a change patrol link, if applicable
- if( $wgUseRCPatrol && $this->mTitle->userCan('patrol') ) {
- // If we've been given an explicit change identifier, use it; saves time
- if( $this->mRcidMarkPatrolled ) {
- $rcid = $this->mRcidMarkPatrolled;
- $rc = RecentChange::newFromId( $rcid );
- // Already patrolled?
- $rcid = is_object($rc) && !$rc->getAttribute('rc_patrolled') ? $rcid : 0;
- } else {
- // Look for an unpatrolled change corresponding to this diff
- $db = wfGetDB( DB_SLAVE );
- $change = RecentChange::newFromConds(
- array(
- // Redundant user,timestamp condition so we can use the existing index
- 'rc_user_text' => $this->mNewRev->getRawUserText(),
- 'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
- 'rc_this_oldid' => $this->mNewid,
- 'rc_last_oldid' => $this->mOldid,
- 'rc_patrolled' => 0
- ),
- __METHOD__
- );
- if( $change instanceof RecentChange ) {
- $rcid = $change->mAttribs['rc_id'];
- $this->mRcidMarkPatrolled = $rcid;
- } else {
- // None found
- $rcid = 0;
- }
- }
- // Build the link
- if( $rcid ) {
- $patrol = ' <span class="patrollink">[' . $sk->link(
- $this->mTitle,
- wfMsgHtml( 'markaspatrolleddiff' ),
- array(),
- array(
- 'action' => 'markpatrolled',
- 'rcid' => $rcid
- ),
- array(
- 'known',
- 'noclasses'
- )
- ) . ']</span>';
- } else {
- $patrol = '';
- }
- } else {
- $patrol = '';
- }
-
- # Carry over 'diffonly' param via navigation links
- if( $diffOnly != $wgUser->getBoolOption('diffonly') ) {
- $query['diffonly'] = $diffOnly;
- }
-
- # Make "previous revision link"
- $query['diff'] = 'prev';
- $query['oldid'] = $this->mOldid;
- # Cascade unhide param in links for easy deletion browsing
- if( $this->unhide ) {
- $query['unhide'] = 1;
- }
- $prevlink = $sk->link(
- $this->mTitle,
- wfMsgHtml( 'previousdiff' ),
- array(
- 'id' => 'differences-prevlink'
- ),
- $query,
- array(
- 'known',
- 'noclasses'
- )
- );
-
- # Make "next revision link"
- $query['diff'] = 'next';
- $query['oldid'] = $this->mNewid;
- # Skip next link on the top revision
- if( $this->mNewRev->isCurrent() ) {
- $nextlink = '&nbsp;';
- } else {
- $nextlink = $sk->link(
- $this->mTitle,
- wfMsgHtml( 'nextdiff' ),
- array(
- 'id' => 'differences-nextlink'
- ),
- $query,
- array(
- 'known',
- 'noclasses'
- )
- );
- }
-
- $oldminor = '';
- $newminor = '';
-
- if( $this->mOldRev->isMinor() ) {
- $oldminor = ChangesList::flag( 'minor' );
- }
- if( $this->mNewRev->isMinor() ) {
- $newminor = ChangesList::flag( 'minor' );
- }
-
- # Handle RevisionDelete links...
- $ldel = $this->revisionDeleteLink( $this->mOldRev );
- $rdel = $this->revisionDeleteLink( $this->mNewRev );
-
- $oldHeader = '<div id="mw-diff-otitle1"><strong>'.$this->mOldtitle.'</strong></div>' .
- '<div id="mw-diff-otitle2">' .
- $sk->revUserTools( $this->mOldRev, !$this->unhide ).'</div>' .
- '<div id="mw-diff-otitle3">' . $oldminor .
- $sk->revComment( $this->mOldRev, !$diffOnly, !$this->unhide ).$ldel.'</div>' .
- '<div id="mw-diff-otitle4">' . $prevlink .'</div>';
- $newHeader = '<div id="mw-diff-ntitle1"><strong>'.$this->mNewtitle.'</strong></div>' .
- '<div id="mw-diff-ntitle2">' . $sk->revUserTools( $this->mNewRev, !$this->unhide ) .
- " $rollback</div>" .
- '<div id="mw-diff-ntitle3">' . $newminor .
- $sk->revComment( $this->mNewRev, !$diffOnly, !$this->unhide ).$rdel.'</div>' .
- '<div id="mw-diff-ntitle4">' . $nextlink . $patrol . '</div>';
-
- # Check if this user can see the revisions
- $allowed = $this->mOldRev->userCan(Revision::DELETED_TEXT)
- && $this->mNewRev->userCan(Revision::DELETED_TEXT);
- # Check if one of the revisions is deleted/suppressed
- $deleted = $suppressed = false;
- if( $this->mOldRev->isDeleted(Revision::DELETED_TEXT) ) {
- $deleted = true; // old revisions text is hidden
- if( $this->mOldRev->isDeleted(Revision::DELETED_RESTRICTED) )
- $suppressed = true; // also suppressed
- }
- if( $this->mNewRev->isDeleted(Revision::DELETED_TEXT) ) {
- $deleted = true; // new revisions text is hidden
- if( $this->mNewRev->isDeleted(Revision::DELETED_RESTRICTED) )
- $suppressed = true; // also suppressed
- }
- # If the diff cannot be shown due to a deleted revision, then output
- # the diff header and links to unhide (if available)...
- if( $deleted && (!$this->unhide || !$allowed) ) {
- $this->showDiffStyle();
- $multi = $this->getMultiNotice();
- $wgOut->addHTML( $this->addHeader( '', $oldHeader, $newHeader, $multi ) );
- if( !$allowed ) {
- $msg = $suppressed ? 'rev-suppressed-no-diff' : 'rev-deleted-no-diff';
- # Give explanation for why revision is not visible
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n",
- array( $msg ) );
- } else {
- # Give explanation and add a link to view the diff...
- $link = $this->mTitle->getFullUrl( array(
- 'diff' => $this->mNewid,
- 'oldid' => $this->mOldid,
- 'unhide' => 1
- ) );
- $msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", array( $msg, $link ) );
- }
- # Otherwise, output a regular diff...
- } else {
- # Add deletion notice if the user is viewing deleted content
- $notice = '';
- if( $deleted ) {
- $msg = $suppressed ? 'rev-suppressed-diff-view' : 'rev-deleted-diff-view';
- $notice = "<div class='mw-warning plainlinks'>\n".wfMsgExt($msg,'parseinline')."</div>\n";
- }
- $this->showDiff( $oldHeader, $newHeader, $notice );
- if( !$diffOnly ) {
- $this->renderNewRevision();
- }
- }
- wfProfileOut( __METHOD__ );
- }
-
- protected function revisionDeleteLink( $rev ) {
- global $wgUser;
- $link = '';
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- // Show del/undel link if:
- // (a) the user can delete revisions, or
- // (b) the user can view deleted revision *and* this one is deleted
- if( $canHide || ($rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' )) ) {
- $sk = $wgUser->getSkin();
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $link = $sk->revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
- } else {
- $query = array(
- 'type' => 'revision',
- 'target' => $rev->mTitle->getPrefixedDbkey(),
- 'ids' => $rev->getId()
- );
- $link = $sk->revDeleteLink( $query,
- $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
- }
- $link = '&nbsp;&nbsp;&nbsp;' . $link . ' ';
- }
- return $link;
- }
-
- /**
- * Show the new revision of the page.
- */
- function renderNewRevision() {
- global $wgOut, $wgUser;
- wfProfileIn( __METHOD__ );
-
- $wgOut->addHTML( "<hr /><h2>{$this->mPagetitle}</h2>\n" );
- # Add deleted rev tag if needed
- if( !$this->mNewRev->userCan(Revision::DELETED_TEXT) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", 'rev-deleted-text-permission' );
- } else if( $this->mNewRev->isDeleted(Revision::DELETED_TEXT) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", 'rev-deleted-text-view' );
- }
-
- if( !$this->mNewRev->isCurrent() ) {
- $oldEditSectionSetting = $wgOut->parserOptions()->setEditSection( false );
- }
-
- $this->loadNewText();
- if( is_object( $this->mNewRev ) ) {
- $wgOut->setRevisionId( $this->mNewRev->getId() );
- }
-
- if( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
- // Stolen from Article::view --AG 2007-10-11
- // Give hooks a chance to customise the output
- if( wfRunHooks( 'ShowRawCssJs', array( $this->mNewtext, $this->mTitle, $wgOut ) ) ) {
- // Wrap the whole lot in a <pre> and don't parse
- $m = array();
- preg_match( '!\.(css|js)$!u', $this->mTitle->getText(), $m );
- $wgOut->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
- $wgOut->addHTML( htmlspecialchars( $this->mNewtext ) );
- $wgOut->addHTML( "\n</pre>\n" );
- }
- } else {
- $wgOut->addWikiTextTidy( $this->mNewtext );
- }
-
- if( is_object( $this->mNewRev ) && !$this->mNewRev->isCurrent() ) {
- $wgOut->parserOptions()->setEditSection( $oldEditSectionSetting );
- }
- # Add redundant patrol link on bottom...
- if( $this->mRcidMarkPatrolled && $this->mTitle->quickUserCan('patrol') ) {
- $sk = $wgUser->getSkin();
- $wgOut->addHTML(
- "<div class='patrollink'>[" . $sk->link(
- $this->mTitle,
- wfMsgHtml( 'markaspatrolleddiff' ),
- array(),
- array(
- 'action' => 'markpatrolled',
- 'rcid' => $this->mRcidMarkPatrolled
- )
- ) . ']</div>'
- );
- }
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Show the first revision of an article. Uses normal diff headers in
- * contrast to normal "old revision" display style.
- */
- function showFirstRevision() {
- global $wgOut, $wgUser;
- wfProfileIn( __METHOD__ );
-
- # Get article text from the DB
- #
- if ( ! $this->loadNewText() ) {
- $t = $this->mTitle->getPrefixedText();
- $d = wfMsgExt( 'missingarticle-diff', array( 'escape' ), $this->mOldid, $this->mNewid );
- $wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
- $wgOut->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", $d );
- wfProfileOut( __METHOD__ );
- return;
- }
- if ( $this->mNewRev->isCurrent() ) {
- $wgOut->setArticleFlag( true );
- }
-
- # Check if user is allowed to look at this page. If not, bail out.
- #
- if ( !$this->mTitle->userCanRead() ) {
- $wgOut->loginToUse();
- $wgOut->output();
- wfProfileOut( __METHOD__ );
- throw new MWException("Permission Error: you do not have access to view this page");
- }
-
- # Prepare the header box
- #
- $sk = $wgUser->getSkin();
-
- $next = $this->mTitle->getNextRevisionID( $this->mNewid );
- if( !$next ) {
- $nextlink = '';
- } else {
- $nextlink = '<br />' . $sk->link(
- $this->mTitle,
- wfMsgHtml( 'nextdiff' ),
- array(
- 'id' => 'differences-nextlink'
- ),
- array(
- 'diff' => 'next',
- 'oldid' => $this->mNewid,
- ),
- array(
- 'known',
- 'noclasses'
- )
- );
- }
- $header = "<div class=\"firstrevisionheader\" style=\"text-align: center\">" .
- $sk->revUserTools( $this->mNewRev ) . "<br />" . $sk->revComment( $this->mNewRev ) . $nextlink . "</div>\n";
-
- $wgOut->addHTML( $header );
-
- $wgOut->setSubtitle( wfMsgExt( 'difference', array( 'parseinline' ) ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Get the diff text, send it to $wgOut
- * Returns false if the diff could not be generated, otherwise returns true
- */
- function showDiff( $otitle, $ntitle, $notice = '' ) {
- global $wgOut;
- $diff = $this->getDiff( $otitle, $ntitle, $notice );
- if ( $diff === false ) {
- $wgOut->addWikiMsg( 'missing-article', "<nowiki>(fixme, bug)</nowiki>", '' );
- return false;
- } else {
- $this->showDiffStyle();
- $wgOut->addHTML( $diff );
- return true;
- }
- }
-
- /**
- * Add style sheets and supporting JS for diff display.
- */
- function showDiffStyle() {
- global $wgStylePath, $wgStyleVersion, $wgOut;
- $wgOut->addStyle( 'common/diff.css' );
-
- // JS is needed to detect old versions of Mozilla to work around an annoyance bug.
- $wgOut->addScript( "<script type=\"text/javascript\" src=\"$wgStylePath/common/diff.js?$wgStyleVersion\"></script>" );
- }
-
- /**
- * Get complete diff table, including header
- *
- * @param Title $otitle Old title
- * @param Title $ntitle New title
- * @param string $notice HTML between diff header and body
- * @return mixed
- */
- function getDiff( $otitle, $ntitle, $notice = '' ) {
- $body = $this->getDiffBody();
- if ( $body === false ) {
- return false;
- } else {
- $multi = $this->getMultiNotice();
- return $this->addHeader( $body, $otitle, $ntitle, $multi, $notice );
- }
- }
-
- /**
- * Get the diff table body, without header
- *
- * @return mixed
- */
- function getDiffBody() {
- global $wgMemc;
- wfProfileIn( __METHOD__ );
- $this->mCacheHit = true;
- // Check if the diff should be hidden from this user
- if ( !$this->loadRevisionData() )
- return '';
- if ( $this->mOldRev && !$this->mOldRev->userCan(Revision::DELETED_TEXT) ) {
- return '';
- } else if ( $this->mNewRev && !$this->mNewRev->userCan(Revision::DELETED_TEXT) ) {
- return '';
- } else if ( $this->mOldRev && $this->mNewRev && $this->mOldRev->getID() == $this->mNewRev->getID() ) {
- return '';
- }
- // Cacheable?
- $key = false;
- if ( $this->mOldid && $this->mNewid ) {
- $key = wfMemcKey( 'diff', 'version', MW_DIFF_VERSION, 'oldid', $this->mOldid, 'newid', $this->mNewid );
- // Try cache
- if ( !$this->mRefreshCache ) {
- $difftext = $wgMemc->get( $key );
- if ( $difftext ) {
- wfIncrStats( 'diff_cache_hit' );
- $difftext = $this->localiseLineNumbers( $difftext );
- $difftext .= "\n<!-- diff cache key $key -->\n";
- wfProfileOut( __METHOD__ );
- return $difftext;
- }
- } // don't try to load but save the result
- }
- $this->mCacheHit = false;
-
- // Loadtext is permission safe, this just clears out the diff
- if ( !$this->loadText() ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- $difftext = $this->generateDiffBody( $this->mOldtext, $this->mNewtext );
-
- // Save to cache for 7 days
- if ( !wfRunHooks( 'AbortDiffCache', array( &$this ) ) ) {
- wfIncrStats( 'diff_uncacheable' );
- } else if ( $key !== false && $difftext !== false ) {
- wfIncrStats( 'diff_cache_miss' );
- $wgMemc->set( $key, $difftext, 7*86400 );
- } else {
- wfIncrStats( 'diff_uncacheable' );
- }
- // Replace line numbers with the text in the user's language
- if ( $difftext !== false ) {
- $difftext = $this->localiseLineNumbers( $difftext );
- }
- wfProfileOut( __METHOD__ );
- return $difftext;
- }
-
- /**
- * Make sure the proper modules are loaded before we try to
- * make the diff
- */
- private function initDiffEngines() {
- global $wgExternalDiffEngine;
- if ( $wgExternalDiffEngine == 'wikidiff' && !function_exists( 'wikidiff_do_diff' ) ) {
- wfProfileIn( __METHOD__ . '-php_wikidiff.so' );
- wfSuppressWarnings();
- dl( 'php_wikidiff.so' );
- wfRestoreWarnings();
- wfProfileOut( __METHOD__ . '-php_wikidiff.so' );
- }
- else if ( $wgExternalDiffEngine == 'wikidiff2' && !function_exists( 'wikidiff2_do_diff' ) ) {
- wfProfileIn( __METHOD__ . '-php_wikidiff2.so' );
- wfSuppressWarnings();
- dl( 'php_wikidiff2.so' );
- wfRestoreWarnings();
- wfProfileOut( __METHOD__ . '-php_wikidiff2.so' );
- }
- }
-
- /**
- * Generate a diff, no caching
- * $otext and $ntext must be already segmented
- */
- function generateDiffBody( $otext, $ntext ) {
- global $wgExternalDiffEngine, $wgContLang;
-
- $otext = str_replace( "\r\n", "\n", $otext );
- $ntext = str_replace( "\r\n", "\n", $ntext );
-
- $this->initDiffEngines();
-
- if ( $wgExternalDiffEngine == 'wikidiff' && function_exists( 'wikidiff_do_diff' ) ) {
- # For historical reasons, external diff engine expects
- # input text to be HTML-escaped already
- $otext = htmlspecialchars ( $wgContLang->segmentForDiff( $otext ) );
- $ntext = htmlspecialchars ( $wgContLang->segmentForDiff( $ntext ) );
- return $wgContLang->unsegementForDiff( wikidiff_do_diff( $otext, $ntext, 2 ) ) .
- $this->debug( 'wikidiff1' );
- }
-
- if ( $wgExternalDiffEngine == 'wikidiff2' && function_exists( 'wikidiff2_do_diff' ) ) {
- # Better external diff engine, the 2 may some day be dropped
- # This one does the escaping and segmenting itself
- wfProfileIn( 'wikidiff2_do_diff' );
- $text = wikidiff2_do_diff( $otext, $ntext, 2 );
- $text .= $this->debug( 'wikidiff2' );
- wfProfileOut( 'wikidiff2_do_diff' );
- return $text;
- }
- if ( $wgExternalDiffEngine != 'wikidiff3' && $wgExternalDiffEngine !== false ) {
- # Diff via the shell
- global $wgTmpDirectory;
- $tempName1 = tempnam( $wgTmpDirectory, 'diff_' );
- $tempName2 = tempnam( $wgTmpDirectory, 'diff_' );
-
- $tempFile1 = fopen( $tempName1, "w" );
- if ( !$tempFile1 ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- $tempFile2 = fopen( $tempName2, "w" );
- if ( !$tempFile2 ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- fwrite( $tempFile1, $otext );
- fwrite( $tempFile2, $ntext );
- fclose( $tempFile1 );
- fclose( $tempFile2 );
- $cmd = wfEscapeShellArg( $wgExternalDiffEngine, $tempName1, $tempName2 );
- wfProfileIn( __METHOD__ . "-shellexec" );
- $difftext = wfShellExec( $cmd );
- $difftext .= $this->debug( "external $wgExternalDiffEngine" );
- wfProfileOut( __METHOD__ . "-shellexec" );
- unlink( $tempName1 );
- unlink( $tempName2 );
- return $difftext;
- }
-
- # Native PHP diff
- $ota = explode( "\n", $wgContLang->segmentForDiff( $otext ) );
- $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) );
- $diffs = new Diff( $ota, $nta );
- $formatter = new TableDiffFormatter();
- return $wgContLang->unsegmentForDiff( $formatter->format( $diffs ) ) .
- $this->debug();
- }
-
- /**
- * Generate a debug comment indicating diff generating time,
- * server node, and generator backend.
- */
- protected function debug( $generator="internal" ) {
- global $wgShowHostnames;
- if ( !$this->enableDebugComment ) {
- return '';
- }
- $data = array( $generator );
- if( $wgShowHostnames ) {
- $data[] = wfHostname();
- }
- $data[] = wfTimestamp( TS_DB );
- return "<!-- diff generator: " .
- implode( " ",
- array_map(
- "htmlspecialchars",
- $data ) ) .
- " -->\n";
- }
-
- /**
- * Replace line numbers with the text in the user's language
- */
- function localiseLineNumbers( $text ) {
- return preg_replace_callback( '/<!--LINE (\d+)-->/',
- array( &$this, 'localiseLineNumbersCb' ), $text );
- }
-
- function localiseLineNumbersCb( $matches ) {
- global $wgLang;
- if ( $matches[1] === '1' && $this->mReducedLineNumbers ) return '';
- return wfMsgExt( 'lineno', 'escape', $wgLang->formatNum( $matches[1] ) );
- }
-
-
- /**
- * If there are revisions between the ones being compared, return a note saying so.
- */
- function getMultiNotice() {
- if ( !is_object($this->mOldRev) || !is_object($this->mNewRev) )
- return '';
-
- if( !$this->mOldPage->equals( $this->mNewPage ) ) {
- // Comparing two different pages? Count would be meaningless.
- return '';
- }
-
- $oldid = $this->mOldRev->getId();
- $newid = $this->mNewRev->getId();
- if ( $oldid > $newid ) {
- $tmp = $oldid; $oldid = $newid; $newid = $tmp;
- }
-
- $n = $this->mTitle->countRevisionsBetween( $oldid, $newid );
- if ( !$n )
- return '';
-
- return wfMsgExt( 'diff-multi', array( 'parseinline' ), $n );
- }
-
-
- /**
- * Add the header to a diff body
- */
- static function addHeader( $diff, $otitle, $ntitle, $multi = '', $notice = '' ) {
- $header = "<table class='diff'>";
- if( $diff ) { // Safari/Chrome show broken output if cols not used
- $header .= "
- <col class='diff-marker' />
- <col class='diff-content' />
- <col class='diff-marker' />
- <col class='diff-content' />";
- $colspan = 2;
- $multiColspan = 4;
- } else {
- $colspan = 1;
- $multiColspan = 2;
- }
- $header .= "
- <tr valign='top'>
- <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
- <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
- </tr>";
-
- if ( $multi != '' ) {
- $header .= "<tr><td colspan='{$multiColspan}' align='center' class='diff-multi'>{$multi}</td></tr>";
- }
- if ( $notice != '' ) {
- $header .= "<tr><td colspan='{$multiColspan}' align='center'>{$notice}</td></tr>";
- }
-
- return $header . $diff . "</table>";
- }
-
- /**
- * Use specified text instead of loading from the database
- */
- function setText( $oldText, $newText ) {
- $this->mOldtext = $oldText;
- $this->mNewtext = $newText;
- $this->mTextLoaded = 2;
- $this->mRevisionsLoaded = true;
- }
-
- /**
- * Load revision metadata for the specified articles. If newid is 0, then compare
- * the old article in oldid to the current article; if oldid is 0, then
- * compare the current article to the immediately previous one (ignoring the
- * value of newid).
- *
- * If oldid is false, leave the corresponding revision object set
- * to false. This is impossible via ordinary user input, and is provided for
- * API convenience.
- */
- function loadRevisionData() {
- global $wgLang, $wgUser;
- if ( $this->mRevisionsLoaded ) {
- return true;
- } else {
- // Whether it succeeds or fails, we don't want to try again
- $this->mRevisionsLoaded = true;
- }
-
- // Load the new revision object
- $this->mNewRev = $this->mNewid
- ? Revision::newFromId( $this->mNewid )
- : Revision::newFromTitle( $this->mTitle );
- if( !$this->mNewRev instanceof Revision )
- return false;
-
- // Update the new revision ID in case it was 0 (makes life easier doing UI stuff)
- $this->mNewid = $this->mNewRev->getId();
-
- // Check if page is editable
- $editable = $this->mNewRev->getTitle()->userCan( 'edit' );
-
- // Set assorted variables
- $timestamp = $wgLang->timeanddate( $this->mNewRev->getTimestamp(), true );
- $dateofrev = $wgLang->date( $this->mNewRev->getTimestamp(), true );
- $timeofrev = $wgLang->time( $this->mNewRev->getTimestamp(), true );
- $this->mNewPage = $this->mNewRev->getTitle();
- if( $this->mNewRev->isCurrent() ) {
- $newLink = $this->mNewPage->escapeLocalUrl( array(
- 'oldid' => $this->mNewid
- ) );
- $this->mPagetitle = htmlspecialchars( wfMsg(
- 'currentrev-asof',
- $timestamp,
- $dateofrev,
- $timeofrev
- ) );
- $newEdit = $this->mNewPage->escapeLocalUrl( array(
- 'action' => 'edit'
- ) );
-
- $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>";
- $this->mNewtitle .= " (<a href='$newEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
- } else {
- $newLink = $this->mNewPage->escapeLocalUrl( array(
- 'oldid' => $this->mNewid
- ) );
- $newEdit = $this->mNewPage->escapeLocalUrl( array(
- 'action' => 'edit',
- 'oldid' => $this->mNewid
- ) );
- $this->mPagetitle = htmlspecialchars( wfMsg(
- 'revisionasof',
- $timestamp,
- $dateofrev,
- $timeofrev
- ) );
-
- $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>";
- $this->mNewtitle .= " (<a href='$newEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
- }
- if( !$this->mNewRev->userCan(Revision::DELETED_TEXT) ) {
- $this->mNewtitle = "<span class='history-deleted'>{$this->mPagetitle}</span>";
- } else if ( $this->mNewRev->isDeleted(Revision::DELETED_TEXT) ) {
- $this->mNewtitle = "<span class='history-deleted'>{$this->mNewtitle}</span>";
- }
-
- // Load the old revision object
- $this->mOldRev = false;
- if( $this->mOldid ) {
- $this->mOldRev = Revision::newFromId( $this->mOldid );
- } elseif ( $this->mOldid === 0 ) {
- $rev = $this->mNewRev->getPrevious();
- if( $rev ) {
- $this->mOldid = $rev->getId();
- $this->mOldRev = $rev;
- } else {
- // No previous revision; mark to show as first-version only.
- $this->mOldid = false;
- $this->mOldRev = false;
- }
- }/* elseif ( $this->mOldid === false ) leave mOldRev false; */
-
- if( is_null( $this->mOldRev ) ) {
- return false;
- }
-
- if ( $this->mOldRev ) {
- $this->mOldPage = $this->mOldRev->getTitle();
-
- $t = $wgLang->timeanddate( $this->mOldRev->getTimestamp(), true );
- $dateofrev = $wgLang->date( $this->mOldRev->getTimestamp(), true );
- $timeofrev = $wgLang->time( $this->mOldRev->getTimestamp(), true );
- $oldLink = $this->mOldPage->escapeLocalUrl( array(
- 'oldid' => $this->mOldid
- ) );
- $oldEdit = $this->mOldPage->escapeLocalUrl( array(
- 'action' => 'edit',
- 'oldid' => $this->mOldid
- ) );
- $this->mOldPagetitle = htmlspecialchars( wfMsg( 'revisionasof', $t, $dateofrev, $timeofrev ) );
-
- $this->mOldtitle = "<a href='$oldLink'>{$this->mOldPagetitle}</a>"
- . " (<a href='$oldEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
- // Add an "undo" link
- $newUndo = $this->mNewPage->escapeLocalUrl( array(
- 'action' => 'edit',
- 'undoafter' => $this->mOldid,
- 'undo' => $this->mNewid
- ) );
- $htmlLink = htmlspecialchars( wfMsg( 'editundo' ) );
- $htmlTitle = $wgUser->getSkin()->tooltip( 'undo' );
- if( $editable && !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $this->mNewtitle .= " (<a href='$newUndo' $htmlTitle>" . $htmlLink . "</a>)";
- }
-
- if( !$this->mOldRev->userCan( Revision::DELETED_TEXT ) ) {
- $this->mOldtitle = '<span class="history-deleted">' . $this->mOldPagetitle . '</span>';
- } else if( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $this->mOldtitle = '<span class="history-deleted">' . $this->mOldtitle . '</span>';
- }
- }
-
- return true;
- }
-
- /**
- * Load the text of the revisions, as well as revision data.
- */
- function loadText() {
- if ( $this->mTextLoaded == 2 ) {
- return true;
- } else {
- // Whether it succeeds or fails, we don't want to try again
- $this->mTextLoaded = 2;
- }
-
- if ( !$this->loadRevisionData() ) {
- return false;
- }
- if ( $this->mOldRev ) {
- $this->mOldtext = $this->mOldRev->getText( Revision::FOR_THIS_USER );
- if ( $this->mOldtext === false ) {
- return false;
- }
- }
- if ( $this->mNewRev ) {
- $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
- if ( $this->mNewtext === false ) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Load the text of the new revision, not the old one
- */
- function loadNewText() {
- if ( $this->mTextLoaded >= 1 ) {
- return true;
- } else {
- $this->mTextLoaded = 1;
- }
- if ( !$this->loadRevisionData() ) {
- return false;
- }
- $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
- return true;
- }
-}
diff --git a/includes/diff/WikiDiff.php b/includes/diff/WikiDiff.php
new file mode 100644
index 00000000..2d904c96
--- /dev/null
+++ b/includes/diff/WikiDiff.php
@@ -0,0 +1,1241 @@
+<?php
+/**
+ * A PHP diff engine for phpwiki. (Taken from phpwiki-1.3.3)
+ *
+ * Copyright © 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
+ * You may copy this code freely under the conditions of the GPL.
+ *
+ * @file
+ * @ingroup DifferenceEngine
+ * @defgroup DifferenceEngine DifferenceEngine
+ */
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _DiffOp {
+ var $type;
+ var $orig;
+ var $closing;
+
+ function reverse() {
+ trigger_error( 'pure virtual', E_USER_ERROR );
+ }
+
+ function norig() {
+ return $this->orig ? sizeof( $this->orig ) : 0;
+ }
+
+ function nclosing() {
+ return $this->closing ? sizeof( $this->closing ) : 0;
+ }
+}
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _DiffOp_Copy extends _DiffOp {
+ var $type = 'copy';
+
+ function __construct ( $orig, $closing = false ) {
+ if ( !is_array( $closing ) )
+ $closing = $orig;
+ $this->orig = $orig;
+ $this->closing = $closing;
+ }
+
+ function reverse() {
+ return new _DiffOp_Copy( $this->closing, $this->orig );
+ }
+}
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _DiffOp_Delete extends _DiffOp {
+ var $type = 'delete';
+
+ function __construct ( $lines ) {
+ $this->orig = $lines;
+ $this->closing = false;
+ }
+
+ function reverse() {
+ return new _DiffOp_Add( $this->orig );
+ }
+}
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _DiffOp_Add extends _DiffOp {
+ var $type = 'add';
+
+ function __construct ( $lines ) {
+ $this->closing = $lines;
+ $this->orig = false;
+ }
+
+ function reverse() {
+ return new _DiffOp_Delete( $this->closing );
+ }
+}
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _DiffOp_Change extends _DiffOp {
+ var $type = 'change';
+
+ function __construct ( $orig, $closing ) {
+ $this->orig = $orig;
+ $this->closing = $closing;
+ }
+
+ function reverse() {
+ return new _DiffOp_Change( $this->closing, $this->orig );
+ }
+}
+
+/**
+ * Class used internally by Diff to actually compute the diffs.
+ *
+ * The algorithm used here is mostly lifted from the perl module
+ * Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
+ * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
+ *
+ * More ideas are taken from:
+ * http://www.ics.uci.edu/~eppstein/161/960229.html
+ *
+ * Some ideas are (and a bit of code) are from from analyze.c, from GNU
+ * diffutils-2.7, which can be found at:
+ * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
+ *
+ * closingly, some ideas (subdivision by NCHUNKS > 2, and some optimizations)
+ * are my own.
+ *
+ * Line length limits for robustness added by Tim Starling, 2005-08-31
+ * Alternative implementation added by Guy Van den Broeck, 2008-07-30
+ *
+ * @author Geoffrey T. Dairiki, Tim Starling, Guy Van den Broeck
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _DiffEngine {
+
+ const MAX_XREF_LENGTH = 10000;
+
+ function diff ( $from_lines, $to_lines ) {
+ wfProfileIn( __METHOD__ );
+
+ // Diff and store locally
+ $this->diff_local( $from_lines, $to_lines );
+
+ // Merge edits when possible
+ $this->_shift_boundaries( $from_lines, $this->xchanged, $this->ychanged );
+ $this->_shift_boundaries( $to_lines, $this->ychanged, $this->xchanged );
+
+ // Compute the edit operations.
+ $n_from = sizeof( $from_lines );
+ $n_to = sizeof( $to_lines );
+
+ $edits = array();
+ $xi = $yi = 0;
+ while ( $xi < $n_from || $yi < $n_to ) {
+ assert( $yi < $n_to || $this->xchanged[$xi] );
+ assert( $xi < $n_from || $this->ychanged[$yi] );
+
+ // Skip matching "snake".
+ $copy = array();
+ while ( $xi < $n_from && $yi < $n_to
+ && !$this->xchanged[$xi] && !$this->ychanged[$yi] ) {
+ $copy[] = $from_lines[$xi++];
+ ++$yi;
+ }
+ if ( $copy )
+ $edits[] = new _DiffOp_Copy( $copy );
+
+ // Find deletes & adds.
+ $delete = array();
+ while ( $xi < $n_from && $this->xchanged[$xi] )
+ $delete[] = $from_lines[$xi++];
+
+ $add = array();
+ while ( $yi < $n_to && $this->ychanged[$yi] )
+ $add[] = $to_lines[$yi++];
+
+ if ( $delete && $add )
+ $edits[] = new _DiffOp_Change( $delete, $add );
+ elseif ( $delete )
+ $edits[] = new _DiffOp_Delete( $delete );
+ elseif ( $add )
+ $edits[] = new _DiffOp_Add( $add );
+ }
+ wfProfileOut( __METHOD__ );
+ return $edits;
+ }
+
+ function diff_local ( $from_lines, $to_lines ) {
+ global $wgExternalDiffEngine;
+ wfProfileIn( __METHOD__ );
+
+ if ( $wgExternalDiffEngine == 'wikidiff3' ) {
+ // wikidiff3
+ $wikidiff3 = new WikiDiff3();
+ $wikidiff3->diff( $from_lines, $to_lines );
+ $this->xchanged = $wikidiff3->removed;
+ $this->ychanged = $wikidiff3->added;
+ unset( $wikidiff3 );
+ } else {
+ // old diff
+ $n_from = sizeof( $from_lines );
+ $n_to = sizeof( $to_lines );
+ $this->xchanged = $this->ychanged = array();
+ $this->xv = $this->yv = array();
+ $this->xind = $this->yind = array();
+ unset( $this->seq );
+ unset( $this->in_seq );
+ unset( $this->lcs );
+
+ // Skip leading common lines.
+ for ( $skip = 0; $skip < $n_from && $skip < $n_to; $skip++ ) {
+ if ( $from_lines[$skip] !== $to_lines[$skip] )
+ break;
+ $this->xchanged[$skip] = $this->ychanged[$skip] = false;
+ }
+ // Skip trailing common lines.
+ $xi = $n_from; $yi = $n_to;
+ for ( $endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++ ) {
+ if ( $from_lines[$xi] !== $to_lines[$yi] )
+ break;
+ $this->xchanged[$xi] = $this->ychanged[$yi] = false;
+ }
+
+ // Ignore lines which do not exist in both files.
+ for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
+ $xhash[$this->_line_hash( $from_lines[$xi] )] = 1;
+ }
+
+ for ( $yi = $skip; $yi < $n_to - $endskip; $yi++ ) {
+ $line = $to_lines[$yi];
+ if ( ( $this->ychanged[$yi] = empty( $xhash[$this->_line_hash( $line )] ) ) )
+ continue;
+ $yhash[$this->_line_hash( $line )] = 1;
+ $this->yv[] = $line;
+ $this->yind[] = $yi;
+ }
+ for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
+ $line = $from_lines[$xi];
+ if ( ( $this->xchanged[$xi] = empty( $yhash[$this->_line_hash( $line )] ) ) )
+ continue;
+ $this->xv[] = $line;
+ $this->xind[] = $xi;
+ }
+
+ // Find the LCS.
+ $this->_compareseq( 0, sizeof( $this->xv ), 0, sizeof( $this->yv ) );
+ }
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Returns the whole line if it's small enough, or the MD5 hash otherwise
+ */
+ function _line_hash( $line ) {
+ if ( strlen( $line ) > self::MAX_XREF_LENGTH ) {
+ return md5( $line );
+ } else {
+ return $line;
+ }
+ }
+
+ /* Divide the Largest Common Subsequence (LCS) of the sequences
+ * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
+ * sized segments.
+ *
+ * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
+ * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
+ * sub sequences. The first sub-sequence is contained in [X0, X1),
+ * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on. Note
+ * that (X0, Y0) == (XOFF, YOFF) and
+ * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
+ *
+ * This function assumes that the first lines of the specified portions
+ * of the two files do not match, and likewise that the last lines do not
+ * match. The caller must trim matching lines from the beginning and end
+ * of the portions it is going to specify.
+ */
+ function _diag ( $xoff, $xlim, $yoff, $ylim, $nchunks ) {
+ $flip = false;
+
+ if ( $xlim - $xoff > $ylim - $yoff ) {
+ // Things seems faster (I'm not sure I understand why)
+ // when the shortest sequence in X.
+ $flip = true;
+ list ( $xoff, $xlim, $yoff, $ylim )
+ = array( $yoff, $ylim, $xoff, $xlim );
+ }
+
+ if ( $flip )
+ for ( $i = $ylim - 1; $i >= $yoff; $i-- )
+ $ymatches[$this->xv[$i]][] = $i;
+ else
+ for ( $i = $ylim - 1; $i >= $yoff; $i-- )
+ $ymatches[$this->yv[$i]][] = $i;
+
+ $this->lcs = 0;
+ $this->seq[0] = $yoff - 1;
+ $this->in_seq = array();
+ $ymids[0] = array();
+
+ $numer = $xlim - $xoff + $nchunks - 1;
+ $x = $xoff;
+ for ( $chunk = 0; $chunk < $nchunks; $chunk++ ) {
+ if ( $chunk > 0 )
+ for ( $i = 0; $i <= $this->lcs; $i++ )
+ $ymids[$i][$chunk -1] = $this->seq[$i];
+
+ $x1 = $xoff + (int)( ( $numer + ( $xlim -$xoff ) * $chunk ) / $nchunks );
+ for ( ; $x < $x1; $x++ ) {
+ $line = $flip ? $this->yv[$x] : $this->xv[$x];
+ if ( empty( $ymatches[$line] ) ) {
+ continue;
+ }
+ $matches = $ymatches[$line];
+ reset( $matches );
+ while ( list( , $y ) = each( $matches ) ) {
+ if ( empty( $this->in_seq[$y] ) ) {
+ $k = $this->_lcs_pos( $y );
+ assert( $k > 0 );
+ $ymids[$k] = $ymids[$k -1];
+ break;
+ }
+ }
+ while ( list ( , $y ) = each( $matches ) ) {
+ if ( $y > $this->seq[$k -1] ) {
+ assert( $y < $this->seq[$k] );
+ // Optimization: this is a common case:
+ // next match is just replacing previous match.
+ $this->in_seq[$this->seq[$k]] = false;
+ $this->seq[$k] = $y;
+ $this->in_seq[$y] = 1;
+ } else if ( empty( $this->in_seq[$y] ) ) {
+ $k = $this->_lcs_pos( $y );
+ assert( $k > 0 );
+ $ymids[$k] = $ymids[$k -1];
+ }
+ }
+ }
+ }
+
+ $seps[] = $flip ? array( $yoff, $xoff ) : array( $xoff, $yoff );
+ $ymid = $ymids[$this->lcs];
+ for ( $n = 0; $n < $nchunks - 1; $n++ ) {
+ $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $n ) / $nchunks );
+ $y1 = $ymid[$n] + 1;
+ $seps[] = $flip ? array( $y1, $x1 ) : array( $x1, $y1 );
+ }
+ $seps[] = $flip ? array( $ylim, $xlim ) : array( $xlim, $ylim );
+
+ return array( $this->lcs, $seps );
+ }
+
+ function _lcs_pos ( $ypos ) {
+ $end = $this->lcs;
+ if ( $end == 0 || $ypos > $this->seq[$end] ) {
+ $this->seq[++$this->lcs] = $ypos;
+ $this->in_seq[$ypos] = 1;
+ return $this->lcs;
+ }
+
+ $beg = 1;
+ while ( $beg < $end ) {
+ $mid = (int)( ( $beg + $end ) / 2 );
+ if ( $ypos > $this->seq[$mid] )
+ $beg = $mid + 1;
+ else
+ $end = $mid;
+ }
+
+ assert( $ypos != $this->seq[$end] );
+
+ $this->in_seq[$this->seq[$end]] = false;
+ $this->seq[$end] = $ypos;
+ $this->in_seq[$ypos] = 1;
+ return $end;
+ }
+
+ /* Find LCS of two sequences.
+ *
+ * The results are recorded in the vectors $this->{x,y}changed[], by
+ * storing a 1 in the element for each line that is an insertion
+ * or deletion (ie. is not in the LCS).
+ *
+ * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
+ *
+ * Note that XLIM, YLIM are exclusive bounds.
+ * All line numbers are origin-0 and discarded lines are not counted.
+ */
+ function _compareseq ( $xoff, $xlim, $yoff, $ylim ) {
+ // Slide down the bottom initial diagonal.
+ while ( $xoff < $xlim && $yoff < $ylim
+ && $this->xv[$xoff] == $this->yv[$yoff] ) {
+ ++$xoff;
+ ++$yoff;
+ }
+
+ // Slide up the top initial diagonal.
+ while ( $xlim > $xoff && $ylim > $yoff
+ && $this->xv[$xlim - 1] == $this->yv[$ylim - 1] ) {
+ --$xlim;
+ --$ylim;
+ }
+
+ if ( $xoff == $xlim || $yoff == $ylim )
+ $lcs = 0;
+ else {
+ // This is ad hoc but seems to work well.
+ // $nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
+ // $nchunks = max(2,min(8,(int)$nchunks));
+ $nchunks = min( 7, $xlim - $xoff, $ylim - $yoff ) + 1;
+ list ( $lcs, $seps )
+ = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
+ }
+
+ if ( $lcs == 0 ) {
+ // X and Y sequences have no common subsequence:
+ // mark all changed.
+ while ( $yoff < $ylim )
+ $this->ychanged[$this->yind[$yoff++]] = 1;
+ while ( $xoff < $xlim )
+ $this->xchanged[$this->xind[$xoff++]] = 1;
+ } else {
+ // Use the partitions to split this problem into subproblems.
+ reset( $seps );
+ $pt1 = $seps[0];
+ while ( $pt2 = next( $seps ) ) {
+ $this->_compareseq ( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
+ $pt1 = $pt2;
+ }
+ }
+ }
+
+ /* Adjust inserts/deletes of identical lines to join changes
+ * as much as possible.
+ *
+ * We do something when a run of changed lines include a
+ * line at one end and has an excluded, identical line at the other.
+ * We are free to choose which identical line is included.
+ * `compareseq' usually chooses the one at the beginning,
+ * but usually it is cleaner to consider the following identical line
+ * to be the "change".
+ *
+ * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
+ */
+ function _shift_boundaries ( $lines, &$changed, $other_changed ) {
+ wfProfileIn( __METHOD__ );
+ $i = 0;
+ $j = 0;
+
+ assert( 'sizeof($lines) == sizeof($changed)' );
+ $len = sizeof( $lines );
+ $other_len = sizeof( $other_changed );
+
+ while ( 1 ) {
+ /*
+ * Scan forwards to find beginning of another run of changes.
+ * Also keep track of the corresponding point in the other file.
+ *
+ * Throughout this code, $i and $j are adjusted together so that
+ * the first $i elements of $changed and the first $j elements
+ * of $other_changed both contain the same number of zeros
+ * (unchanged lines).
+ * Furthermore, $j is always kept so that $j == $other_len or
+ * $other_changed[$j] == false.
+ */
+ while ( $j < $other_len && $other_changed[$j] )
+ $j++;
+
+ while ( $i < $len && ! $changed[$i] ) {
+ assert( '$j < $other_len && ! $other_changed[$j]' );
+ $i++; $j++;
+ while ( $j < $other_len && $other_changed[$j] )
+ $j++;
+ }
+
+ if ( $i == $len )
+ break;
+
+ $start = $i;
+
+ // Find the end of this run of changes.
+ while ( ++$i < $len && $changed[$i] )
+ continue;
+
+ do {
+ /*
+ * Record the length of this run of changes, so that
+ * we can later determine whether the run has grown.
+ */
+ $runlength = $i - $start;
+
+ /*
+ * Move the changed region back, so long as the
+ * previous unchanged line matches the last changed one.
+ * This merges with previous changed regions.
+ */
+ while ( $start > 0 && $lines[$start - 1] == $lines[$i - 1] ) {
+ $changed[--$start] = 1;
+ $changed[--$i] = false;
+ while ( $start > 0 && $changed[$start - 1] )
+ $start--;
+ assert( '$j > 0' );
+ while ( $other_changed[--$j] )
+ continue;
+ assert( '$j >= 0 && !$other_changed[$j]' );
+ }
+
+ /*
+ * Set CORRESPONDING to the end of the changed run, at the last
+ * point where it corresponds to a changed run in the other file.
+ * CORRESPONDING == LEN means no such point has been found.
+ */
+ $corresponding = $j < $other_len ? $i : $len;
+
+ /*
+ * Move the changed region forward, so long as the
+ * first changed line matches the following unchanged one.
+ * This merges with following changed regions.
+ * Do this second, so that if there are no merges,
+ * the changed region is moved forward as far as possible.
+ */
+ while ( $i < $len && $lines[$start] == $lines[$i] ) {
+ $changed[$start++] = false;
+ $changed[$i++] = 1;
+ while ( $i < $len && $changed[$i] )
+ $i++;
+
+ assert( '$j < $other_len && ! $other_changed[$j]' );
+ $j++;
+ if ( $j < $other_len && $other_changed[$j] ) {
+ $corresponding = $i;
+ while ( $j < $other_len && $other_changed[$j] )
+ $j++;
+ }
+ }
+ } while ( $runlength != $i - $start );
+
+ /*
+ * If possible, move the fully-merged run of changes
+ * back to a corresponding run in the other file.
+ */
+ while ( $corresponding < $i ) {
+ $changed[--$start] = 1;
+ $changed[--$i] = 0;
+ assert( '$j > 0' );
+ while ( $other_changed[--$j] )
+ continue;
+ assert( '$j >= 0 && !$other_changed[$j]' );
+ }
+ }
+ wfProfileOut( __METHOD__ );
+ }
+}
+
+/**
+ * Class representing a 'diff' between two sequences of strings.
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class Diff
+{
+ var $edits;
+
+ /**
+ * Constructor.
+ * Computes diff between sequences of strings.
+ *
+ * @param $from_lines array An array of strings.
+ * (Typically these are lines from a file.)
+ * @param $to_lines array An array of strings.
+ */
+ function __construct( $from_lines, $to_lines ) {
+ $eng = new _DiffEngine;
+ $this->edits = $eng->diff( $from_lines, $to_lines );
+ // $this->_check($from_lines, $to_lines);
+ }
+
+ /**
+ * Compute reversed Diff.
+ *
+ * SYNOPSIS:
+ *
+ * $diff = new Diff($lines1, $lines2);
+ * $rev = $diff->reverse();
+ * @return object A Diff object representing the inverse of the
+ * original diff.
+ */
+ function reverse () {
+ $rev = $this;
+ $rev->edits = array();
+ foreach ( $this->edits as $edit ) {
+ $rev->edits[] = $edit->reverse();
+ }
+ return $rev;
+ }
+
+ /**
+ * Check for empty diff.
+ *
+ * @return bool True iff two sequences were identical.
+ */
+ function isEmpty () {
+ foreach ( $this->edits as $edit ) {
+ if ( $edit->type != 'copy' )
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Compute the length of the Longest Common Subsequence (LCS).
+ *
+ * This is mostly for diagnostic purposed.
+ *
+ * @return int The length of the LCS.
+ */
+ function lcs () {
+ $lcs = 0;
+ foreach ( $this->edits as $edit ) {
+ if ( $edit->type == 'copy' )
+ $lcs += sizeof( $edit->orig );
+ }
+ return $lcs;
+ }
+
+ /**
+ * Get the original set of lines.
+ *
+ * This reconstructs the $from_lines parameter passed to the
+ * constructor.
+ *
+ * @return array The original sequence of strings.
+ */
+ function orig() {
+ $lines = array();
+
+ foreach ( $this->edits as $edit ) {
+ if ( $edit->orig )
+ array_splice( $lines, sizeof( $lines ), 0, $edit->orig );
+ }
+ return $lines;
+ }
+
+ /**
+ * Get the closing set of lines.
+ *
+ * This reconstructs the $to_lines parameter passed to the
+ * constructor.
+ *
+ * @return array The sequence of strings.
+ */
+ function closing() {
+ $lines = array();
+
+ foreach ( $this->edits as $edit ) {
+ if ( $edit->closing )
+ array_splice( $lines, sizeof( $lines ), 0, $edit->closing );
+ }
+ return $lines;
+ }
+
+ /**
+ * Check a Diff for validity.
+ *
+ * This is here only for debugging purposes.
+ */
+ function _check ( $from_lines, $to_lines ) {
+ wfProfileIn( __METHOD__ );
+ if ( serialize( $from_lines ) != serialize( $this->orig() ) )
+ trigger_error( "Reconstructed original doesn't match", E_USER_ERROR );
+ if ( serialize( $to_lines ) != serialize( $this->closing() ) )
+ trigger_error( "Reconstructed closing doesn't match", E_USER_ERROR );
+
+ $rev = $this->reverse();
+ if ( serialize( $to_lines ) != serialize( $rev->orig() ) )
+ trigger_error( "Reversed original doesn't match", E_USER_ERROR );
+ if ( serialize( $from_lines ) != serialize( $rev->closing() ) )
+ trigger_error( "Reversed closing doesn't match", E_USER_ERROR );
+
+
+ $prevtype = 'none';
+ foreach ( $this->edits as $edit ) {
+ if ( $prevtype == $edit->type )
+ trigger_error( "Edit sequence is non-optimal", E_USER_ERROR );
+ $prevtype = $edit->type;
+ }
+
+ $lcs = $this->lcs();
+ trigger_error( 'Diff okay: LCS = ' . $lcs, E_USER_NOTICE );
+ wfProfileOut( __METHOD__ );
+ }
+}
+
+/**
+ * @todo document, bad name.
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class MappedDiff extends Diff
+{
+ /**
+ * Constructor.
+ *
+ * Computes diff between sequences of strings.
+ *
+ * This can be used to compute things like
+ * case-insensitve diffs, or diffs which ignore
+ * changes in white-space.
+ *
+ * @param $from_lines array An array of strings.
+ * (Typically these are lines from a file.)
+ *
+ * @param $to_lines array An array of strings.
+ *
+ * @param $mapped_from_lines array This array should
+ * have the same size number of elements as $from_lines.
+ * The elements in $mapped_from_lines and
+ * $mapped_to_lines are what is actually compared
+ * when computing the diff.
+ *
+ * @param $mapped_to_lines array This array should
+ * have the same number of elements as $to_lines.
+ */
+ function __construct( $from_lines, $to_lines,
+ $mapped_from_lines, $mapped_to_lines ) {
+ wfProfileIn( __METHOD__ );
+
+ assert( sizeof( $from_lines ) == sizeof( $mapped_from_lines ) );
+ assert( sizeof( $to_lines ) == sizeof( $mapped_to_lines ) );
+
+ parent::__construct( $mapped_from_lines, $mapped_to_lines );
+
+ $xi = $yi = 0;
+ for ( $i = 0; $i < sizeof( $this->edits ); $i++ ) {
+ $orig = &$this->edits[$i]->orig;
+ if ( is_array( $orig ) ) {
+ $orig = array_slice( $from_lines, $xi, sizeof( $orig ) );
+ $xi += sizeof( $orig );
+ }
+
+ $closing = &$this->edits[$i]->closing;
+ if ( is_array( $closing ) ) {
+ $closing = array_slice( $to_lines, $yi, sizeof( $closing ) );
+ $yi += sizeof( $closing );
+ }
+ }
+ wfProfileOut( __METHOD__ );
+ }
+}
+
+/**
+ * A class to format Diffs
+ *
+ * This class formats the diff in classic diff format.
+ * It is intended that this class be customized via inheritance,
+ * to obtain fancier outputs.
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class DiffFormatter {
+ /**
+ * Number of leading context "lines" to preserve.
+ *
+ * This should be left at zero for this class, but subclasses
+ * may want to set this to other values.
+ */
+ var $leading_context_lines = 0;
+
+ /**
+ * Number of trailing context "lines" to preserve.
+ *
+ * This should be left at zero for this class, but subclasses
+ * may want to set this to other values.
+ */
+ var $trailing_context_lines = 0;
+
+ /**
+ * Format a diff.
+ *
+ * @param $diff object A Diff object.
+ * @return string The formatted output.
+ */
+ function format( $diff ) {
+ wfProfileIn( __METHOD__ );
+
+ $xi = $yi = 1;
+ $block = false;
+ $context = array();
+
+ $nlead = $this->leading_context_lines;
+ $ntrail = $this->trailing_context_lines;
+
+ $this->_start_diff();
+
+ foreach ( $diff->edits as $edit ) {
+ if ( $edit->type == 'copy' ) {
+ if ( is_array( $block ) ) {
+ if ( sizeof( $edit->orig ) <= $nlead + $ntrail ) {
+ $block[] = $edit;
+ }
+ else {
+ if ( $ntrail ) {
+ $context = array_slice( $edit->orig, 0, $ntrail );
+ $block[] = new _DiffOp_Copy( $context );
+ }
+ $this->_block( $x0, $ntrail + $xi - $x0,
+ $y0, $ntrail + $yi - $y0,
+ $block );
+ $block = false;
+ }
+ }
+ $context = $edit->orig;
+ }
+ else {
+ if ( ! is_array( $block ) ) {
+ $context = array_slice( $context, sizeof( $context ) - $nlead );
+ $x0 = $xi - sizeof( $context );
+ $y0 = $yi - sizeof( $context );
+ $block = array();
+ if ( $context )
+ $block[] = new _DiffOp_Copy( $context );
+ }
+ $block[] = $edit;
+ }
+
+ if ( $edit->orig )
+ $xi += sizeof( $edit->orig );
+ if ( $edit->closing )
+ $yi += sizeof( $edit->closing );
+ }
+
+ if ( is_array( $block ) )
+ $this->_block( $x0, $xi - $x0,
+ $y0, $yi - $y0,
+ $block );
+
+ $end = $this->_end_diff();
+ wfProfileOut( __METHOD__ );
+ return $end;
+ }
+
+ function _block( $xbeg, $xlen, $ybeg, $ylen, &$edits ) {
+ wfProfileIn( __METHOD__ );
+ $this->_start_block( $this->_block_header( $xbeg, $xlen, $ybeg, $ylen ) );
+ foreach ( $edits as $edit ) {
+ if ( $edit->type == 'copy' )
+ $this->_context( $edit->orig );
+ elseif ( $edit->type == 'add' )
+ $this->_added( $edit->closing );
+ elseif ( $edit->type == 'delete' )
+ $this->_deleted( $edit->orig );
+ elseif ( $edit->type == 'change' )
+ $this->_changed( $edit->orig, $edit->closing );
+ else
+ trigger_error( 'Unknown edit type', E_USER_ERROR );
+ }
+ $this->_end_block();
+ wfProfileOut( __METHOD__ );
+ }
+
+ function _start_diff() {
+ ob_start();
+ }
+
+ function _end_diff() {
+ $val = ob_get_contents();
+ ob_end_clean();
+ return $val;
+ }
+
+ function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
+ if ( $xlen > 1 )
+ $xbeg .= "," . ( $xbeg + $xlen - 1 );
+ if ( $ylen > 1 )
+ $ybeg .= "," . ( $ybeg + $ylen - 1 );
+
+ return $xbeg . ( $xlen ? ( $ylen ? 'c' : 'd' ) : 'a' ) . $ybeg;
+ }
+
+ function _start_block( $header ) {
+ echo $header . "\n";
+ }
+
+ function _end_block() {
+ }
+
+ function _lines( $lines, $prefix = ' ' ) {
+ foreach ( $lines as $line )
+ echo "$prefix $line\n";
+ }
+
+ function _context( $lines ) {
+ $this->_lines( $lines );
+ }
+
+ function _added( $lines ) {
+ $this->_lines( $lines, '>' );
+ }
+ function _deleted( $lines ) {
+ $this->_lines( $lines, '<' );
+ }
+
+ function _changed( $orig, $closing ) {
+ $this->_deleted( $orig );
+ echo "---\n";
+ $this->_added( $closing );
+ }
+}
+
+/**
+ * A formatter that outputs unified diffs
+ * @ingroup DifferenceEngine
+ */
+
+class UnifiedDiffFormatter extends DiffFormatter {
+ var $leading_context_lines = 2;
+ var $trailing_context_lines = 2;
+
+ function _added( $lines ) {
+ $this->_lines( $lines, '+' );
+ }
+ function _deleted( $lines ) {
+ $this->_lines( $lines, '-' );
+ }
+ function _changed( $orig, $closing ) {
+ $this->_deleted( $orig );
+ $this->_added( $closing );
+ }
+ function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
+ return "@@ -$xbeg,$xlen +$ybeg,$ylen @@";
+ }
+}
+
+/**
+ * A pseudo-formatter that just passes along the Diff::$edits array
+ * @ingroup DifferenceEngine
+ */
+class ArrayDiffFormatter extends DiffFormatter {
+ function format( $diff ) {
+ $oldline = 1;
+ $newline = 1;
+ $retval = array();
+ foreach ( $diff->edits as $edit )
+ switch( $edit->type ) {
+ case 'add':
+ foreach ( $edit->closing as $l ) {
+ $retval[] = array(
+ 'action' => 'add',
+ 'new' => $l,
+ 'newline' => $newline++
+ );
+ }
+ break;
+ case 'delete':
+ foreach ( $edit->orig as $l ) {
+ $retval[] = array(
+ 'action' => 'delete',
+ 'old' => $l,
+ 'oldline' => $oldline++,
+ );
+ }
+ break;
+ case 'change':
+ foreach ( $edit->orig as $i => $l ) {
+ $retval[] = array(
+ 'action' => 'change',
+ 'old' => $l,
+ 'new' => @$edit->closing[$i],
+ 'oldline' => $oldline++,
+ 'newline' => $newline++,
+ );
+ }
+ break;
+ case 'copy':
+ $oldline += count( $edit->orig );
+ $newline += count( $edit->orig );
+ }
+ return $retval;
+ }
+}
+
+/**
+ * Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
+ *
+ */
+
+define( 'NBSP', '&#160;' ); // iso-8859-x non-breaking space.
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class _HWLDF_WordAccumulator {
+ function __construct () {
+ $this->_lines = array();
+ $this->_line = '';
+ $this->_group = '';
+ $this->_tag = '';
+ }
+
+ function _flushGroup ( $new_tag ) {
+ if ( $this->_group !== '' ) {
+ if ( $this->_tag == 'ins' )
+ $this->_line .= '<ins class="diffchange diffchange-inline">' .
+ htmlspecialchars ( $this->_group ) . '</ins>';
+ elseif ( $this->_tag == 'del' )
+ $this->_line .= '<del class="diffchange diffchange-inline">' .
+ htmlspecialchars ( $this->_group ) . '</del>';
+ else
+ $this->_line .= htmlspecialchars ( $this->_group );
+ }
+ $this->_group = '';
+ $this->_tag = $new_tag;
+ }
+
+ function _flushLine ( $new_tag ) {
+ $this->_flushGroup( $new_tag );
+ if ( $this->_line != '' )
+ array_push ( $this->_lines, $this->_line );
+ else
+ # make empty lines visible by inserting an NBSP
+ array_push ( $this->_lines, NBSP );
+ $this->_line = '';
+ }
+
+ function addWords ( $words, $tag = '' ) {
+ if ( $tag != $this->_tag )
+ $this->_flushGroup( $tag );
+
+ foreach ( $words as $word ) {
+ // new-line should only come as first char of word.
+ if ( $word == '' )
+ continue;
+ if ( $word[0] == "\n" ) {
+ $this->_flushLine( $tag );
+ $word = substr( $word, 1 );
+ }
+ assert( !strstr( $word, "\n" ) );
+ $this->_group .= $word;
+ }
+ }
+
+ function getLines() {
+ $this->_flushLine( '~done' );
+ return $this->_lines;
+ }
+}
+
+/**
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class WordLevelDiff extends MappedDiff {
+ const MAX_LINE_LENGTH = 10000;
+
+ function __construct ( $orig_lines, $closing_lines ) {
+ wfProfileIn( __METHOD__ );
+
+ list ( $orig_words, $orig_stripped ) = $this->_split( $orig_lines );
+ list ( $closing_words, $closing_stripped ) = $this->_split( $closing_lines );
+
+ parent::__construct( $orig_words, $closing_words,
+ $orig_stripped, $closing_stripped );
+ wfProfileOut( __METHOD__ );
+ }
+
+ function _split( $lines ) {
+ wfProfileIn( __METHOD__ );
+
+ $words = array();
+ $stripped = array();
+ $first = true;
+ foreach ( $lines as $line ) {
+ # If the line is too long, just pretend the entire line is one big word
+ # This prevents resource exhaustion problems
+ if ( $first ) {
+ $first = false;
+ } else {
+ $words[] = "\n";
+ $stripped[] = "\n";
+ }
+ if ( strlen( $line ) > self::MAX_LINE_LENGTH ) {
+ $words[] = $line;
+ $stripped[] = $line;
+ } else {
+ $m = array();
+ if ( preg_match_all( '/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+ $line, $m ) )
+ {
+ $words = array_merge( $words, $m[0] );
+ $stripped = array_merge( $stripped, $m[1] );
+ }
+ }
+ }
+ wfProfileOut( __METHOD__ );
+ return array( $words, $stripped );
+ }
+
+ function orig () {
+ wfProfileIn( __METHOD__ );
+ $orig = new _HWLDF_WordAccumulator;
+
+ foreach ( $this->edits as $edit ) {
+ if ( $edit->type == 'copy' )
+ $orig->addWords( $edit->orig );
+ elseif ( $edit->orig )
+ $orig->addWords( $edit->orig, 'del' );
+ }
+ $lines = $orig->getLines();
+ wfProfileOut( __METHOD__ );
+ return $lines;
+ }
+
+ function closing () {
+ wfProfileIn( __METHOD__ );
+ $closing = new _HWLDF_WordAccumulator;
+
+ foreach ( $this->edits as $edit ) {
+ if ( $edit->type == 'copy' )
+ $closing->addWords( $edit->closing );
+ elseif ( $edit->closing )
+ $closing->addWords( $edit->closing, 'ins' );
+ }
+ $lines = $closing->getLines();
+ wfProfileOut( __METHOD__ );
+ return $lines;
+ }
+}
+
+/**
+ * Wikipedia Table style diff formatter.
+ * @todo document
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class TableDiffFormatter extends DiffFormatter {
+ function __construct() {
+ $this->leading_context_lines = 2;
+ $this->trailing_context_lines = 2;
+ }
+
+ public static function escapeWhiteSpace( $msg ) {
+ $msg = preg_replace( '/^ /m', '&#160; ', $msg );
+ $msg = preg_replace( '/ $/m', ' &#160;', $msg );
+ $msg = preg_replace( '/ /', '&#160; ', $msg );
+ return $msg;
+ }
+
+ function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
+ $r = '<tr><td colspan="2" class="diff-lineno"><!--LINE ' . $xbeg . "--></td>\n" .
+ '<td colspan="2" class="diff-lineno"><!--LINE ' . $ybeg . "--></td></tr>\n";
+ return $r;
+ }
+
+ function _start_block( $header ) {
+ echo $header;
+ }
+
+ function _end_block() {
+ }
+
+ function _lines( $lines, $prefix = ' ', $color = 'white' ) {
+ }
+
+ # HTML-escape parameter before calling this
+ function addedLine( $line ) {
+ return $this->wrapLine( '+', 'diff-addedline', $line );
+ }
+
+ # HTML-escape parameter before calling this
+ function deletedLine( $line ) {
+ return $this->wrapLine( '&minus;', 'diff-deletedline', $line );
+ }
+
+ # HTML-escape parameter before calling this
+ function contextLine( $line ) {
+ return $this->wrapLine( '&#160;', 'diff-context', $line );
+ }
+
+ private function wrapLine( $marker, $class, $line ) {
+ if ( $line !== '' ) {
+ // The <div> wrapper is needed for 'overflow: auto' style to scroll properly
+ $line = Xml::tags( 'div', null, $this->escapeWhiteSpace( $line ) );
+ }
+ return "<td class='diff-marker'>$marker</td><td class='$class'>$line</td>";
+ }
+
+ function emptyLine() {
+ return '<td colspan="2">&#160;</td>';
+ }
+
+ function _added( $lines ) {
+ foreach ( $lines as $line ) {
+ echo '<tr>' . $this->emptyLine() .
+ $this->addedLine( '<ins class="diffchange">' .
+ htmlspecialchars ( $line ) . '</ins>' ) . "</tr>\n";
+ }
+ }
+
+ function _deleted( $lines ) {
+ foreach ( $lines as $line ) {
+ echo '<tr>' . $this->deletedLine( '<del class="diffchange">' .
+ htmlspecialchars ( $line ) . '</del>' ) .
+ $this->emptyLine() . "</tr>\n";
+ }
+ }
+
+ function _context( $lines ) {
+ foreach ( $lines as $line ) {
+ echo '<tr>' .
+ $this->contextLine( htmlspecialchars ( $line ) ) .
+ $this->contextLine( htmlspecialchars ( $line ) ) . "</tr>\n";
+ }
+ }
+
+ function _changed( $orig, $closing ) {
+ wfProfileIn( __METHOD__ );
+
+ $diff = new WordLevelDiff( $orig, $closing );
+ $del = $diff->orig();
+ $add = $diff->closing();
+
+ # Notice that WordLevelDiff returns HTML-escaped output.
+ # Hence, we will be calling addedLine/deletedLine without HTML-escaping.
+
+ while ( $line = array_shift( $del ) ) {
+ $aline = array_shift( $add );
+ echo '<tr>' . $this->deletedLine( $line ) .
+ $this->addedLine( $aline ) . "</tr>\n";
+ }
+ foreach ( $add as $line ) { # If any leftovers
+ echo '<tr>' . $this->emptyLine() .
+ $this->addedLine( $line ) . "</tr>\n";
+ }
+ wfProfileOut( __METHOD__ );
+ }
+}
diff --git a/includes/diff/Diff.php b/includes/diff/WikiDiff3.php
index 538c2d83..8def296d 100644
--- a/includes/diff/Diff.php
+++ b/includes/diff/WikiDiff3.php
@@ -1,5 +1,8 @@
<?php
-/* Copyright (C) 2008 Guy Van den Broeck <guy@guyvdb.eu>
+/**
+ * New version of the difference engine
+ *
+ * Copyright © 2008 Guy Van den Broeck <guy@guyvdb.eu>
*
* 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
@@ -13,8 +16,11 @@
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * or see http://www.gnu.org/
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup DifferenceEngine
*/
/**
@@ -32,7 +38,7 @@
*/
class WikiDiff3 {
- //Input variables
+ // Input variables
private $from;
private $to;
private $m;
@@ -41,117 +47,117 @@ class WikiDiff3 {
private $tooLong;
private $powLimit;
- //State variables
+ // State variables
private $maxDifferences;
private $lcsLengthCorrectedForHeuristic = false;
- //Output variables
+ // Output variables
public $length;
public $removed;
public $added;
public $heuristicUsed;
- function __construct($tooLong = 2000000, $powLimit = 1.45){
+ function __construct( $tooLong = 2000000, $powLimit = 1.45 ) {
$this->tooLong = $tooLong;
$this->powLimit = $powLimit;
}
- public function diff(/*array*/ $from, /*array*/ $to){
- //remember initial lengths
- $m = sizeof($from);
- $n = count($to);
+ public function diff( /*array*/ $from, /*array*/ $to ) {
+ // remember initial lengths
+ $m = sizeof( $from );
+ $n = count( $to );
$this->heuristicUsed = false;
- //output
- $removed = $m > 0 ? array_fill(0, $m, true) : array();
- $added = $n > 0 ? array_fill(0, $n, true) : array();
+ // output
+ $removed = $m > 0 ? array_fill( 0, $m, true ) : array();
+ $added = $n > 0 ? array_fill( 0, $n, true ) : array();
- //reduce the complexity for the next step (intentionally done twice)
- //remove common tokens at the start
+ // reduce the complexity for the next step (intentionally done twice)
+ // remove common tokens at the start
$i = 0;
- while($i < $m && $i < $n && $from[$i] === $to[$i]) {
+ while ( $i < $m && $i < $n && $from[$i] === $to[$i] ) {
$removed[$i] = $added[$i] = false;
- unset($from[$i], $to[$i]);
+ unset( $from[$i], $to[$i] );
++$i;
}
- //remove common tokens at the end
+ // remove common tokens at the end
$j = 1;
- while($i + $j <= $m && $i + $j <= $n && $from[$m - $j] === $to[$n - $j]) {
+ while ( $i + $j <= $m && $i + $j <= $n && $from[$m - $j] === $to[$n - $j] ) {
$removed[$m - $j] = $added[$n - $j] = false;
- unset($from[$m - $j], $to[$n - $j]);
+ unset( $from[$m - $j], $to[$n - $j] );
++$j;
}
$this->from = $newFromIndex = $this->to = $newToIndex = array();
- //remove tokens not in both sequences
+ // remove tokens not in both sequences
$shared = array();
- foreach( $from as $key ) {
+ foreach ( $from as $key ) {
$shared[$key] = false;
}
- foreach($to as $index => &$el) {
- if(array_key_exists($el, $shared)) {
- //keep it
+ foreach ( $to as $index => &$el ) {
+ if ( array_key_exists( $el, $shared ) ) {
+ // keep it
$this->to[] = $el;
$shared[$el] = true;
$newToIndex[] = $index;
}
}
- foreach($from as $index => &$el) {
- if($shared[$el]) {
- //keep it
+ foreach ( $from as $index => &$el ) {
+ if ( $shared[$el] ) {
+ // keep it
$this->from[] = $el;
$newFromIndex[] = $index;
}
}
- unset($shared, $from, $to);
+ unset( $shared, $from, $to );
- $this->m = count($this->from);
- $this->n = count($this->to);
+ $this->m = count( $this->from );
+ $this->n = count( $this->to );
- $this->removed = $this->m > 0 ? array_fill(0, $this->m, true) : array();
- $this->added = $this->n > 0 ? array_fill(0, $this->n, true) : array();
+ $this->removed = $this->m > 0 ? array_fill( 0, $this->m, true ) : array();
+ $this->added = $this->n > 0 ? array_fill( 0, $this->n, true ) : array();
- if ($this->m == 0 || $this->n == 0) {
+ if ( $this->m == 0 || $this->n == 0 ) {
$this->length = 0;
} else {
- $this->maxDifferences = ceil(($this->m + $this->n) / 2.0);
- if ($this->m * $this->n > $this->tooLong) {
+ $this->maxDifferences = ceil( ( $this->m + $this->n ) / 2.0 );
+ if ( $this->m * $this->n > $this->tooLong ) {
// limit complexity to D^POW_LIMIT for long sequences
- $this->maxDifferences = floor(pow($this->maxDifferences, $this->powLimit - 1.0));
- wfDebug("Limiting max number of differences to $this->maxDifferences\n");
+ $this->maxDifferences = floor( pow( $this->maxDifferences, $this->powLimit - 1.0 ) );
+ wfDebug( "Limiting max number of differences to $this->maxDifferences\n" );
}
/*
* The common prefixes and suffixes are always part of some LCS, include
* them now to reduce our search space
*/
- $max = min($this->m, $this->n);
- for ($forwardBound = 0; $forwardBound < $max
+ $max = min( $this->m, $this->n );
+ for ( $forwardBound = 0; $forwardBound < $max
&& $this->from[$forwardBound] === $this->to[$forwardBound];
- ++$forwardBound) {
+ ++$forwardBound ) {
$this->removed[$forwardBound] = $this->added[$forwardBound] = false;
}
$backBoundL1 = $this->m - 1;
$backBoundL2 = $this->n - 1;
- while ($backBoundL1 >= $forwardBound && $backBoundL2 >= $forwardBound
- && $this->from[$backBoundL1] === $this->to[$backBoundL2]) {
+ while ( $backBoundL1 >= $forwardBound && $backBoundL2 >= $forwardBound
+ && $this->from[$backBoundL1] === $this->to[$backBoundL2] ) {
$this->removed[$backBoundL1--] = $this->added[$backBoundL2--] = false;
}
- $temp = array_fill(0, $this->m + $this->n + 1, 0);
- $V = array($temp, $temp);
- $snake = array(0, 0, 0);
+ $temp = array_fill( 0, $this->m + $this->n + 1, 0 );
+ $V = array( $temp, $temp );
+ $snake = array( 0, 0, 0 );
$this->length = $forwardBound + $this->m - $backBoundL1 - 1
- + $this->lcs_rec($forwardBound, $backBoundL1,
- $forwardBound, $backBoundL2, $V, $snake);
+ + $this->lcs_rec( $forwardBound, $backBoundL1,
+ $forwardBound, $backBoundL2, $V, $snake );
}
$this->m = $m;
@@ -159,13 +165,13 @@ class WikiDiff3 {
$this->length += $i + $j - 1;
- foreach($this->removed as $key => &$removed_elem) {
- if(!$removed_elem) {
+ foreach ( $this->removed as $key => &$removed_elem ) {
+ if ( !$removed_elem ) {
$removed[$newFromIndex[$key]] = false;
}
}
- foreach($this->added as $key => &$added_elem) {
- if(!$added_elem) {
+ foreach ( $this->added as $key => &$added_elem ) {
+ if ( !$added_elem ) {
$added[$newToIndex[$key]] = false;
}
}
@@ -173,48 +179,48 @@ class WikiDiff3 {
$this->added = $added;
}
- function diff_range($from_lines, $to_lines) {
+ function diff_range( $from_lines, $to_lines ) {
// Diff and store locally
- $this->diff($from_lines, $to_lines);
- unset($from_lines, $to_lines);
+ $this->diff( $from_lines, $to_lines );
+ unset( $from_lines, $to_lines );
$ranges = array();
$xi = $yi = 0;
- while ($xi < $this->m || $yi < $this->n) {
+ while ( $xi < $this->m || $yi < $this->n ) {
// Matching "snake".
- while ($xi < $this->m && $yi < $this->n
+ while ( $xi < $this->m && $yi < $this->n
&& !$this->removed[$xi]
- && !$this->added[$yi]) {
+ && !$this->added[$yi] ) {
++$xi;
++$yi;
}
// Find deletes & adds.
$xstart = $xi;
- while ($xi < $this->m && $this->removed[$xi]) {
+ while ( $xi < $this->m && $this->removed[$xi] ) {
++$xi;
}
$ystart = $yi;
- while ($yi < $this->n && $this->added[$yi]) {
+ while ( $yi < $this->n && $this->added[$yi] ) {
++$yi;
}
- if ($xi > $xstart || $yi > $ystart) {
- $ranges[] = new RangeDifference($xstart, $xi,
- $ystart, $yi);
+ if ( $xi > $xstart || $yi > $ystart ) {
+ $ranges[] = new RangeDifference( $xstart, $xi,
+ $ystart, $yi );
}
}
return $ranges;
}
- private function lcs_rec($bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake) {
+ private function lcs_rec( $bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake ) {
// check that both sequences are non-empty
- if ($bottoml1 > $topl1 || $bottoml2 > $topl2) {
+ if ( $bottoml1 > $topl1 || $bottoml2 > $topl2 ) {
return 0;
}
- $d = $this->find_middle_snake($bottoml1, $topl1, $bottoml2,
- $topl2, $V, $snake);
+ $d = $this->find_middle_snake( $bottoml1, $topl1, $bottoml2,
+ $topl2, $V, $snake );
// need to store these so we don't lose them when they're
// overwritten by the recursion
@@ -223,24 +229,24 @@ class WikiDiff3 {
$starty = $snake[1];
// the middle snake is part of the LCS, store it
- for ($i = 0; $i < $len; ++$i) {
+ for ( $i = 0; $i < $len; ++$i ) {
$this->removed[$startx + $i] = $this->added[$starty + $i] = false;
}
- if ($d > 1) {
+ if ( $d > 1 ) {
return $len
- + $this->lcs_rec($bottoml1, $startx - 1, $bottoml2,
- $starty - 1, $V, $snake)
- + $this->lcs_rec($startx + $len, $topl1, $starty + $len,
- $topl2, $V, $snake);
- } else if ($d == 1) {
+ + $this->lcs_rec( $bottoml1, $startx - 1, $bottoml2,
+ $starty - 1, $V, $snake )
+ + $this->lcs_rec( $startx + $len, $topl1, $starty + $len,
+ $topl2, $V, $snake );
+ } else if ( $d == 1 ) {
/*
* In this case the sequences differ by exactly 1 line. We have
* already saved all the lines after the difference in the for loop
* above, now we need to save all the lines before the difference.
*/
- $max = min($startx - $bottoml1, $starty - $bottoml2);
- for ($i = 0; $i < $max; ++$i) {
+ $max = min( $startx - $bottoml1, $starty - $bottoml2 );
+ for ( $i = 0; $i < $max; ++$i ) {
$this->removed[$bottoml1 + $i] =
$this->added[$bottoml2 + $i] = false;
}
@@ -249,7 +255,7 @@ class WikiDiff3 {
return $len;
}
- private function find_middle_snake($bottoml1, $topl1, $bottoml2,$topl2, &$V, &$snake) {
+ private function find_middle_snake( $bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake ) {
$from = &$this->from;
$to = &$this->to;
$V0 = &$V[0];
@@ -257,24 +263,24 @@ class WikiDiff3 {
$snake0 = &$snake[0];
$snake1 = &$snake[1];
$snake2 = &$snake[2];
- $bottoml1_min_1 = $bottoml1-1;
- $bottoml2_min_1 = $bottoml2-1;
+ $bottoml1_min_1 = $bottoml1 -1;
+ $bottoml2_min_1 = $bottoml2 -1;
$N = $topl1 - $bottoml1_min_1;
$M = $topl2 - $bottoml2_min_1;
$delta = $N - $M;
- $maxabsx = $N+$bottoml1;
- $maxabsy = $M+$bottoml2;
- $limit = min($this->maxDifferences, ceil(($N + $M ) / 2));
+ $maxabsx = $N + $bottoml1;
+ $maxabsy = $M + $bottoml2;
+ $limit = min( $this->maxDifferences, ceil( ( $N + $M ) / 2 ) );
- //value_to_add_forward: a 0 or 1 that we add to the start
+ // value_to_add_forward: a 0 or 1 that we add to the start
// offset to make it odd/even
- if (($M & 1) == 1) {
+ if ( ( $M & 1 ) == 1 ) {
$value_to_add_forward = 1;
} else {
$value_to_add_forward = 0;
}
- if (($N & 1) == 1) {
+ if ( ( $N & 1 ) == 1 ) {
$value_to_add_backward = 1;
} else {
$value_to_add_backward = 0;
@@ -290,18 +296,18 @@ class WikiDiff3 {
$V0[$limit_plus_1] = 0;
$V1[$limit_min_1] = $N;
- $limit = min($this->maxDifferences, ceil(($N + $M ) / 2));
+ $limit = min( $this->maxDifferences, ceil( ( $N + $M ) / 2 ) );
- if (($delta & 1) == 1) {
- for ($d = 0; $d <= $limit; ++$d) {
- $start_diag = max($value_to_add_forward + $start_forward, -$d);
- $end_diag = min($end_forward, $d);
+ if ( ( $delta & 1 ) == 1 ) {
+ for ( $d = 0; $d <= $limit; ++$d ) {
+ $start_diag = max( $value_to_add_forward + $start_forward, -$d );
+ $end_diag = min( $end_forward, $d );
$value_to_add_forward = 1 - $value_to_add_forward;
// compute forward furthest reaching paths
- for ($k = $start_diag; $k <= $end_diag; $k += 2) {
- if ($k == -$d || ($k < $d
- && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k])) {
+ for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+ if ( $k == -$d || ( $k < $d
+ && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k] ) ) {
$x = $V0[$limit_plus_1 + $k];
} else {
$x = $V0[$limit_min_1 + $k] + 1;
@@ -310,36 +316,36 @@ class WikiDiff3 {
$absx = $snake0 = $x + $bottoml1;
$absy = $snake1 = $x - $k + $bottoml2;
- while ($absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy]) {
+ while ( $absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy] ) {
++$absx;
++$absy;
}
- $x = $absx-$bottoml1;
+ $x = $absx -$bottoml1;
$snake2 = $absx -$snake0;
$V0[$limit + $k] = $x;
- if ($k >= $delta - $d + 1 && $k <= $delta + $d - 1
- && $x >= $V1[$limit + $k - $delta]) {
+ if ( $k >= $delta - $d + 1 && $k <= $delta + $d - 1
+ && $x >= $V1[$limit + $k - $delta] ) {
return 2 * $d - 1;
}
// check to see if we can cut down the diagonal range
- if ($x >= $N && $end_forward > $k - 1) {
+ if ( $x >= $N && $end_forward > $k - 1 ) {
$end_forward = $k - 1;
- } else if ($absy - $bottoml2 >= $M) {
+ } else if ( $absy - $bottoml2 >= $M ) {
$start_forward = $k + 1;
$value_to_add_forward = 0;
}
}
- $start_diag = max($value_to_add_backward + $start_backward, -$d);
- $end_diag = min($end_backward, $d);
+ $start_diag = max( $value_to_add_backward + $start_backward, -$d );
+ $end_diag = min( $end_backward, $d );
$value_to_add_backward = 1 - $value_to_add_backward;
// compute backward furthest reaching paths
- for ($k = $start_diag; $k <= $end_diag; $k += 2) {
- if ($k == $d
- || ($k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k])) {
+ for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+ if ( $k == $d
+ || ( $k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k] ) ) {
$x = $V1[$limit_min_1 + $k];
} else {
$x = $V1[$limit_plus_1 + $k] - 1;
@@ -348,8 +354,8 @@ class WikiDiff3 {
$y = $x - $k - $delta;
$snake2 = 0;
- while ($x > 0 && $y > 0
- && $from[$x +$bottoml1_min_1] === $to[$y + $bottoml2_min_1]) {
+ while ( $x > 0 && $y > 0
+ && $from[$x + $bottoml1_min_1] === $to[$y + $bottoml2_min_1] ) {
--$x;
--$y;
++$snake2;
@@ -357,24 +363,24 @@ class WikiDiff3 {
$V1[$limit + $k] = $x;
// check to see if we can cut down our diagonal range
- if ($x <= 0) {
+ if ( $x <= 0 ) {
$start_backward = $k + 1;
$value_to_add_backward = 0;
- } else if ($y <= 0 && $end_backward > $k - 1) {
+ } else if ( $y <= 0 && $end_backward > $k - 1 ) {
$end_backward = $k - 1;
}
}
}
} else {
- for ($d = 0; $d <= $limit; ++$d) {
- $start_diag = max($value_to_add_forward + $start_forward, -$d);
- $end_diag = min($end_forward, $d);
+ for ( $d = 0; $d <= $limit; ++$d ) {
+ $start_diag = max( $value_to_add_forward + $start_forward, -$d );
+ $end_diag = min( $end_forward, $d );
$value_to_add_forward = 1 - $value_to_add_forward;
// compute forward furthest reaching paths
- for ($k = $start_diag; $k <= $end_diag; $k += 2) {
- if ($k == -$d
- || ($k < $d && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k])) {
+ for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+ if ( $k == -$d
+ || ( $k < $d && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k] ) ) {
$x = $V0[$limit_plus_1 + $k];
} else {
$x = $V0[$limit_min_1 + $k] + 1;
@@ -383,31 +389,31 @@ class WikiDiff3 {
$absx = $snake0 = $x + $bottoml1;
$absy = $snake1 = $x - $k + $bottoml2;
- while ($absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy]) {
+ while ( $absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy] ) {
++$absx;
++$absy;
}
- $x = $absx-$bottoml1;
+ $x = $absx -$bottoml1;
$snake2 = $absx -$snake0;
$V0[$limit + $k] = $x;
// check to see if we can cut down the diagonal range
- if ($x >= $N && $end_forward > $k - 1) {
+ if ( $x >= $N && $end_forward > $k - 1 ) {
$end_forward = $k - 1;
- } else if ($absy-$bottoml2 >= $M) {
+ } else if ( $absy -$bottoml2 >= $M ) {
$start_forward = $k + 1;
$value_to_add_forward = 0;
}
}
- $start_diag = max($value_to_add_backward + $start_backward, -$d);
- $end_diag = min($end_backward, $d);
+ $start_diag = max( $value_to_add_backward + $start_backward, -$d );
+ $end_diag = min( $end_backward, $d );
$value_to_add_backward = 1 - $value_to_add_backward;
// compute backward furthest reaching paths
- for ($k = $start_diag; $k <= $end_diag; $k += 2) {
- if ($k == $d
- || ($k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k])) {
+ for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+ if ( $k == $d
+ || ( $k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k] ) ) {
$x = $V1[$limit_min_1 + $k];
} else {
$x = $V1[$limit_plus_1 + $k] - 1;
@@ -416,26 +422,26 @@ class WikiDiff3 {
$y = $x - $k - $delta;
$snake2 = 0;
- while ($x > 0 && $y > 0
- && $from[$x +$bottoml1_min_1] === $to[$y + $bottoml2_min_1]) {
+ while ( $x > 0 && $y > 0
+ && $from[$x + $bottoml1_min_1] === $to[$y + $bottoml2_min_1] ) {
--$x;
--$y;
++$snake2;
}
$V1[$limit + $k] = $x;
- if ($k >= -$delta - $d && $k <= $d - $delta
- && $x <= $V0[$limit + $k + $delta]) {
+ if ( $k >= -$delta - $d && $k <= $d - $delta
+ && $x <= $V0[$limit + $k + $delta] ) {
$snake0 = $bottoml1 + $x;
$snake1 = $bottoml2 + $y;
return 2 * $d;
}
// check to see if we can cut down our diagonal range
- if ($x <= 0) {
+ if ( $x <= 0 ) {
$start_backward = $k + 1;
$value_to_add_backward = 0;
- } else if ($y <= 0 && $end_backward > $k - 1) {
+ } else if ( $y <= 0 && $end_backward > $k - 1 ) {
$end_backward = $k - 1;
}
}
@@ -447,12 +453,12 @@ class WikiDiff3 {
* there.
*/
- $most_progress = self::findMostProgress($M, $N, $limit, $V);
+ $most_progress = self::findMostProgress( $M, $N, $limit, $V );
$snake0 = $bottoml1 + $most_progress[0];
$snake1 = $bottoml2 + $most_progress[1];
$snake2 = 0;
- wfDebug("Computing the LCS is too expensive. Using a heuristic.\n");
+ wfDebug( "Computing the LCS is too expensive. Using a heuristic.\n" );
$this->heuristicUsed = true;
return 5; /*
* HACK: since we didn't really finish the LCS computation
@@ -463,48 +469,48 @@ class WikiDiff3 {
*/
}
- private static function findMostProgress($M, $N, $limit, $V) {
+ private static function findMostProgress( $M, $N, $limit, $V ) {
$delta = $N - $M;
- if (($M & 1) == ($limit & 1)) {
- $forward_start_diag = max(-$M, -$limit);
+ if ( ( $M & 1 ) == ( $limit & 1 ) ) {
+ $forward_start_diag = max( -$M, -$limit );
} else {
- $forward_start_diag = max(1 - $M, -$limit);
+ $forward_start_diag = max( 1 - $M, -$limit );
}
- $forward_end_diag = min($N, $limit);
+ $forward_end_diag = min( $N, $limit );
- if (($N & 1) == ($limit & 1)) {
- $backward_start_diag = max(-$N, -$limit);
+ if ( ( $N & 1 ) == ( $limit & 1 ) ) {
+ $backward_start_diag = max( -$N, -$limit );
} else {
- $backward_start_diag = max(1 - $N, -$limit);
+ $backward_start_diag = max( 1 - $N, -$limit );
}
- $backward_end_diag = -min($M, $limit);
+ $backward_end_diag = -min( $M, $limit );
- $temp = array(0, 0, 0);
+ $temp = array( 0, 0, 0 );
- $max_progress = array_fill(0, ceil(max($forward_end_diag - $forward_start_diag,
- $backward_end_diag - $backward_start_diag) / 2), $temp);
+ $max_progress = array_fill( 0, ceil( max( $forward_end_diag - $forward_start_diag,
+ $backward_end_diag - $backward_start_diag ) / 2 ), $temp );
$num_progress = 0; // the 1st entry is current, it is initialized
// with 0s
// first search the forward diagonals
- for ($k = $forward_start_diag; $k <= $forward_end_diag; $k += 2) {
+ for ( $k = $forward_start_diag; $k <= $forward_end_diag; $k += 2 ) {
$x = $V[0][$limit + $k];
$y = $x - $k;
- if ($x > $N || $y > $M) {
+ if ( $x > $N || $y > $M ) {
continue;
}
$progress = $x + $y;
- if ($progress > $max_progress[0][2]) {
+ if ( $progress > $max_progress[0][2] ) {
$num_progress = 0;
$max_progress[0][0] = $x;
$max_progress[0][1] = $y;
$max_progress[0][2] = $progress;
- } else if ($progress == $max_progress[0][2]) {
+ } else if ( $progress == $max_progress[0][2] ) {
++$num_progress;
$max_progress[$num_progress][0] = $x;
$max_progress[$num_progress][1] = $y;
@@ -517,21 +523,21 @@ class WikiDiff3 {
// direction
// now search the backward diagonals
- for ($k = $backward_start_diag; $k <= $backward_end_diag; $k += 2) {
+ for ( $k = $backward_start_diag; $k <= $backward_end_diag; $k += 2 ) {
$x = $V[1][$limit + $k];
$y = $x - $k - $delta;
- if ($x < 0 || $y < 0) {
+ if ( $x < 0 || $y < 0 ) {
continue;
}
$progress = $N - $x + $M - $y;
- if ($progress > $max_progress[0][2]) {
+ if ( $progress > $max_progress[0][2] ) {
$num_progress = 0;
$max_progress_forward = false;
$max_progress[0][0] = $x;
$max_progress[0][1] = $y;
$max_progress[0][2] = $progress;
- } else if ($progress == $max_progress[0][2] && !$max_progress_forward) {
+ } else if ( $progress == $max_progress[0][2] && !$max_progress_forward ) {
++$num_progress;
$max_progress[$num_progress][0] = $x;
$max_progress[$num_progress][1] = $y;
@@ -540,13 +546,13 @@ class WikiDiff3 {
}
// return the middle diagonal with maximal progress.
- return $max_progress[floor($num_progress / 2)];
+ return $max_progress[floor( $num_progress / 2 )];
}
- public function getLcsLength(){
- if($this->heuristicUsed && !$this->lcsLengthCorrectedForHeuristic){
+ public function getLcsLength() {
+ if ( $this->heuristicUsed && !$this->lcsLengthCorrectedForHeuristic ) {
$this->lcsLengthCorrectedForHeuristic = true;
- $this->length = $this->m-array_sum($this->added);
+ $this->length = $this->m -array_sum( $this->added );
}
return $this->length;
}
@@ -556,7 +562,7 @@ class WikiDiff3 {
/**
* Alternative representation of a set of changes, by the index
* ranges that are changed.
- *
+ *
* @ingroup DifferenceEngine
*/
class RangeDifference {
@@ -569,7 +575,7 @@ class RangeDifference {
public $rightend;
public $rightlength;
- function __construct($leftstart, $leftend, $rightstart, $rightend){
+ function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
$this->leftstart = $leftstart;
$this->leftend = $leftend;
$this->leftlength = $leftend - $leftstart;
diff --git a/includes/extauth/Hardcoded.php b/includes/extauth/Hardcoded.php
index a9a60bea..dfb46742 100644
--- a/includes/extauth/Hardcoded.php
+++ b/includes/extauth/Hardcoded.php
@@ -1,21 +1,26 @@
<?php
-
-# Copyright (C) 2009 Aryeh Gregor
-#
-# 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
+/**
+ * External authentication with hardcoded user names and passwords
+ *
+ * Copyright © 2009 Aryeh Gregor
+ *
+ * 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
+ */
/**
* This class supports external authentication from a literal array dumped in
diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php
index 7d6a3c71..9df4ea1f 100644
--- a/includes/extauth/MediaWiki.php
+++ b/includes/extauth/MediaWiki.php
@@ -1,21 +1,26 @@
<?php
-
-# Copyright (C) 2009 Aryeh Gregor
-#
-# 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
+/**
+ * External authentication with external MediaWiki database.
+ *
+ * Copyright © 2009 Aryeh Gregor
+ *
+ * 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
+ */
/**
* This class supports authentication against an external MediaWiki database,
@@ -67,15 +72,14 @@ class ExternalUser_MediaWiki extends ExternalUser {
private function initFromCond( $cond ) {
global $wgExternalAuthConf;
- $class = 'Database' . $wgExternalAuthConf['DBtype'];
- $this->mDb = new $class(
- $wgExternalAuthConf['DBserver'],
- $wgExternalAuthConf['DBuser'],
- $wgExternalAuthConf['DBpassword'],
- $wgExternalAuthConf['DBname'],
- false,
- 0,
- $wgExternalAuthConf['DBprefix']
+ $this->mDb = DatabaseBase::newFromType( $wgExternalAuthConf['DBtype'],
+ array(
+ 'server' => $wgExternalAuthConf['DBserver'],
+ 'user' => $wgExternalAuthConf['DBuser'],
+ 'password' => $wgExternalAuthConf['DBpassword'],
+ 'dbname' => $wgExternalAuthConf['DBname'],
+ 'tableprefix' => $wgExternalAuthConf['DBprefix'],
+ )
);
$row = $this->mDb->selectRow(
diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php
index 23523665..860048f3 100644
--- a/includes/extauth/vB.php
+++ b/includes/extauth/vB.php
@@ -1,21 +1,26 @@
<?php
-
-# Copyright (C) 2009 Aryeh Gregor
-#
-# 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
+/**
+ * External authentication with a vBulletin database.
+ *
+ * Copyright © 2009 Aryeh Gregor
+ *
+ * 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
+ */
/**
* This class supports the proprietary vBulletin forum system
@@ -36,7 +41,7 @@
* @ingroup ExternalUser
*/
class ExternalUser_vB extends ExternalUser {
- private $mDb, $mRow;
+ private $mRow;
protected function initFromName( $name ) {
return $this->initFromCond( array( 'username' => $name ) );
@@ -50,13 +55,13 @@ class ExternalUser_vB extends ExternalUser {
# Try using the session table. It will only have a row if the user has
# an active session, so it might not always work, but it's a lot easier
# than trying to convince PHP to give us vB's $_SESSION.
- global $wgExternalAuthConf;
+ global $wgExternalAuthConf, $wgRequest;
if ( !isset( $wgExternalAuthConf['cookieprefix'] ) ) {
$prefix = 'bb';
} else {
$prefix = $wgExternalAuthConf['cookieprefix'];
}
- if ( !isset( $_COOKIE["{$prefix}sessionhash"] ) ) {
+ if ( $wgRequest->getCookie( 'sessionhash', $prefix ) === null ) {
return false;
}
@@ -67,7 +72,7 @@ class ExternalUser_vB extends ExternalUser {
$this->getFields(),
array(
'session.userid = user.userid',
- 'sessionhash' => $_COOKIE["{$prefix}sessionhash"]
+ 'sessionhash' => $wgRequest->getCookie( 'sessionhash', $prefix ),
),
__METHOD__
);
diff --git a/includes/filerepo/ArchivedFile.php b/includes/filerepo/ArchivedFile.php
index ffc06303..ecc09978 100644
--- a/includes/filerepo/ArchivedFile.php
+++ b/includes/filerepo/ArchivedFile.php
@@ -1,10 +1,17 @@
<?php
+/**
+ * Deleted file in the 'filearchive' table
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
- * @ingroup Media
+ * Class representing a row of the 'filearchive' table
+ *
+ * @ingroup FileRepo
*/
-class ArchivedFile
-{
+class ArchivedFile {
/**#@+
* @private
*/
@@ -29,7 +36,7 @@ class ArchivedFile
/**#@-*/
- function ArchivedFile( $title, $id=0, $key='' ) {
+ function __construct( $title, $id=0, $key='' ) {
$this->id = -1;
$this->title = false;
$this->name = false;
@@ -140,7 +147,6 @@ class ArchivedFile
$this->deleted = $row->fa_deleted;
} else {
throw new MWException( 'This title does not correspond to an image page.' );
- return;
}
$this->dataLoaded = true;
$this->exists = true;
@@ -219,7 +225,7 @@ class ArchivedFile
* Return the FileStore storage group
*/
public function getGroup() {
- return $file->group;
+ return $this->group;
}
/**
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
index 0dd9d0f7..e2251b2b 100644
--- a/includes/filerepo/FSRepo.php
+++ b/includes/filerepo/FSRepo.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * A repository for files accessible via the local filesystem.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* A repository for files accessible via the local filesystem. Does not support
@@ -132,8 +138,8 @@ class FSRepo extends FileRepo {
/**
* Store a batch of files
*
- * @param array $triplets (src,zone,dest) triplets as per store()
- * @param integer $flags Bitwise combination of the following flags:
+ * @param $triplets Array: (src,zone,dest) triplets as per store()
+ * @param $flags Integer: bitwise combination of the following flags:
* self::DELETE_SOURCE Delete the source file after upload
* self::OVERWRITE Overwrite an existing destination file instead of failing
* self::OVERWRITE_SAME Overwrite the file if the destination exists and has the
@@ -267,8 +273,8 @@ class FSRepo extends FileRepo {
/**
* Checks existence of specified array of files.
*
- * @param array $files URLs of files to check
- * @param integer $flags Bitwise combination of the following flags:
+ * @param $files Array: URLs of files to check
+ * @param $flags Integer: bitwise combination of the following flags:
* self::FILES_ONLY Mark file as existing only if it is a file (not directory)
* @return Either array of files and existence flags, or false
*/
@@ -307,9 +313,9 @@ class FSRepo extends FileRepo {
/**
* Pick a random name in the temp zone and store a file to it.
- * @param string $originalName The base name of the file as specified
+ * @param $originalName String: the base name of the file as specified
* by the user. The file extension will be maintained.
- * @param string $srcPath The current location of the file.
+ * @param $srcPath String: the current location of the file.
* @return FileRepoStatus object with the URL in the value.
*/
function storeTemp( $originalName, $srcPath ) {
@@ -325,8 +331,8 @@ class FSRepo extends FileRepo {
/**
* Remove a temporary file or mark it for garbage collection
- * @param string $virtualUrl The virtual URL returned by storeTemp
- * @return boolean True on success, false on failure
+ * @param $virtualUrl String: the virtual URL returned by storeTemp
+ * @return Boolean: true on success, false on failure
*/
function freeTemp( $virtualUrl ) {
$temp = "mwrepo://{$this->name}/temp";
@@ -343,8 +349,8 @@ class FSRepo extends FileRepo {
/**
* Publish a batch of files
- * @param array $triplets (source,dest,archive) triplets as per publish()
- * @param integer $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
+ * @param $triplets Array: (source,dest,archive) triplets as per publish()
+ * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source files should be deleted if possible
*/
function publishBatch( $triplets, $flags = 0 ) {
@@ -454,7 +460,7 @@ class FSRepo extends FileRepo {
* If no valid deletion archive is configured, this may either delete the
* file or throw an exception, depending on the preference of the repository.
*
- * @param array $sourceDestPairs Array of source/destination pairs. Each element
+ * @param $sourceDestPairs Array of source/destination pairs. Each element
* is a two-element array containing the source file path relative to the
* public root in the first element, and the archive file path relative
* to the deleted zone root in the second element.
@@ -615,7 +621,7 @@ class FSRepo extends FileRepo {
/**
* Chmod a file, supressing the warnings.
- * @param String $path The path to change
+ * @param $path String: the path to change
*/
protected function chmod( $path ) {
wfSuppressWarnings();
diff --git a/includes/filerepo/File.php b/includes/filerepo/File.php
index d79a1661..192e8c8a 100644
--- a/includes/filerepo/File.php
+++ b/includes/filerepo/File.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Base code for files.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* Implements some public methods and some protected utility functions which
@@ -177,7 +183,8 @@ abstract class File {
* Return a fully-qualified URL to the file.
* Upload URL paths _may or may not_ be fully qualified, so
* we check. Local paths are assumed to belong on $wgServer.
- * @return string
+ *
+ * @return String
*/
public function getFullUrl() {
return wfExpandUrl( $this->getUrl() );
@@ -260,6 +267,19 @@ abstract class File {
}
/**
+ * Return true if the file is vectorized
+ */
+ public function isVectorized() {
+ $handler = $this->getHandler();
+ if ( $handler ) {
+ return $handler->isVectorized( $this );
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
* Get handler-specific metadata
* Overridden by LocalFile, UnregisteredLocalFile
* STUB
@@ -437,26 +457,21 @@ abstract class File {
/**
* Get a ThumbnailImage which is the same size as the source
*/
- function getUnscaledThumb( $page = false ) {
+ function getUnscaledThumb( $handlerParams = array() ) {
+ $hp =& $handlerParams;
+ $page = isset( $hp['page'] ) ? $hp['page'] : false;
$width = $this->getWidth( $page );
if ( !$width ) {
return $this->iconThumb();
}
- if ( $page ) {
- $params = array(
- 'page' => $page,
- 'width' => $this->getWidth( $page )
- );
- } else {
- $params = array( 'width' => $this->getWidth() );
- }
- return $this->transform( $params );
+ $hp['width'] = $width;
+ return $this->transform( $hp );
}
/**
* Return the file name of a thumbnail with the specified parameters
*
- * @param array $params Handler-specific parameters
+ * @param $params Array: handler-specific parameters
* @private -ish
*/
function thumbName( $params ) {
@@ -464,7 +479,7 @@ abstract class File {
return null;
}
$extension = $this->getExtension();
- list( $thumbExt, $thumbMime ) = $this->handler->getThumbType( $extension, $this->getMimeType() );
+ list( $thumbExt, $thumbMime ) = $this->handler->getThumbType( $extension, $this->getMimeType(), $params );
$thumbName = $this->handler->makeParamString( $params ) . '-' . $this->getName();
if ( $thumbExt != $extension ) {
$thumbName .= ".$thumbExt";
@@ -484,8 +499,8 @@ abstract class File {
* specified, the generated image will be no bigger than width x height,
* and will also have correct aspect ratio.
*
- * @param integer $width maximum width of the generated thumbnail
- * @param integer $height maximum height of the image (optional)
+ * @param $width Integer: maximum width of the generated thumbnail
+ * @param $height Integer: maximum height of the image (optional)
*/
public function createThumb( $width, $height = -1 ) {
$params = array( 'width' => $width );
@@ -500,19 +515,20 @@ abstract class File {
/**
* As createThumb, but returns a ThumbnailImage object. This can
* provide access to the actual file, the real size of the thumb,
- * and can produce a convenient <img> tag for you.
+ * and can produce a convenient \<img\> tag for you.
*
* For non-image formats, this may return a filetype-specific icon.
*
- * @param integer $width maximum width of the generated thumbnail
- * @param integer $height maximum height of the image (optional)
- * @param boolean $render Deprecated
+ * @param $width Integer: maximum width of the generated thumbnail
+ * @param $height Integer: maximum height of the image (optional)
+ * @param $render Integer: Deprecated
*
* @return ThumbnailImage or null on failure
*
* @deprecated use transform()
*/
public function getThumbnail( $width, $height=-1, $render = true ) {
+ wfDeprecated( __METHOD__ );
$params = array( 'width' => $width );
if ( $height != -1 ) {
$params['height'] = $height;
@@ -523,10 +539,10 @@ abstract class File {
/**
* Transform a media file
*
- * @param array $params An associative array of handler-specific parameters. Typical
- * keys are width, height and page.
- * @param integer $flags A bitfield, may contain self::RENDER_NOW to force rendering
- * @return MediaTransformOutput
+ * @param $params Array: an associative array of handler-specific parameters.
+ * Typical keys are width, height and page.
+ * @param $flags Integer: a bitfield, may contain self::RENDER_NOW to force rendering
+ * @return MediaTransformOutput | false
*/
function transform( $params, $flags = 0 ) {
global $wgUseSquid, $wgIgnoreImageErrors, $wgThumbnailEpoch, $wgServer;
@@ -560,7 +576,7 @@ abstract class File {
$thumbPath = $this->getThumbPath( $thumbName );
$thumbUrl = $this->getThumbUrl( $thumbName );
- if ( $this->repo->canTransformVia404() && !($flags & self::RENDER_NOW ) ) {
+ if ( $this->repo && $this->repo->canTransformVia404() && !($flags & self::RENDER_NOW ) ) {
$thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
break;
}
@@ -842,19 +858,18 @@ abstract class File {
/**
* Move or copy a file to its public location. If a file exists at the
- * destination, move it to an archive. Returns the archive name on success
- * or an empty string if it was a new file, and a wikitext-formatted
- * WikiError object on failure.
+ * destination, move it to an archive. Returns a FileRepoStatus object with
+ * the archive name in the "value" member on success.
*
* The archive name should be passed through to recordUpload for database
* registration.
*
- * @param string $sourcePath Local filesystem path to the source image
- * @param integer $flags A bitwise combination of:
+ * @param $srcPath String: local filesystem path to the source image
+ * @param $flags Integer: a bitwise combination of:
* File::DELETE_SOURCE Delete the source file, i.e. move
* rather than copy
- * @return The archive name on success or an empty string if it was a new
- * file, and a wikitext-formatted WikiError object on failure.
+ * @return FileRepoStatus object. On success, the value member contains the
+ * archive name, or an empty string if it was a new file.
*
* STUB
* Overridden by LocalFile
@@ -872,6 +887,7 @@ abstract class File {
* @deprecated Use HTMLCacheUpdate, this function uses too much memory
*/
function getLinksTo( $options = array() ) {
+ wfDeprecated( __METHOD__ );
wfProfileIn( __METHOD__ );
// Note: use local DB not repo DB, we want to know local links
@@ -884,21 +900,21 @@ abstract class File {
$encName = $db->addQuotes( $this->getName() );
$res = $db->select( array( 'page', 'imagelinks'),
- array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect' ),
- array( 'page_id' => 'il_from', 'il_to' => $encName ),
+ array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+ array( 'page_id=il_from', 'il_to' => $encName ),
__METHOD__,
$options );
$retVal = array();
if ( $db->numRows( $res ) ) {
- while ( $row = $db->fetchObject( $res ) ) {
- if ( $titleObj = Title::newFromRow( $row ) ) {
- $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect );
+ foreach ( $res as $row ) {
+ $titleObj = Title::newFromRow( $row );
+ if ( $titleObj ) {
+ $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect, $row->page_latest );
$retVal[] = $titleObj;
}
}
}
- $db->freeResult( $res );
wfProfileOut( __METHOD__ );
return $retVal;
}
@@ -916,7 +932,8 @@ abstract class File {
* @return bool
*/
function isLocal() {
- return $this->getRepoName() == 'local';
+ $repo = $this->getRepo();
+ return $repo && $repo->isLocal();
}
/**
@@ -992,8 +1009,8 @@ abstract class File {
*
* Cache purging is done; logging is caller's responsibility.
*
- * @param $reason
- * @param $suppress, hide content from sysops?
+ * @param $reason String
+ * @param $suppress Boolean: hide content from sysops?
* @return true on success, false on some kind of failure
* STUB
* Overridden by LocalFile
@@ -1010,7 +1027,7 @@ abstract class File {
*
* @param $versions set of record ids of deleted items to restore,
* or empty to restore all revisions.
- * @param $unsuppress, remove restrictions on content upon restoration?
+ * @param $unsuppress remove restrictions on content upon restoration?
* @return the number of file revisions restored if successful,
* or false on failure
* STUB
@@ -1032,7 +1049,7 @@ abstract class File {
}
/**
- * Returns the number of pages of a multipage document, or NULL for
+ * Returns the number of pages of a multipage document, or false for
* documents which aren't multipage documents
*/
function pageCount() {
@@ -1059,11 +1076,11 @@ abstract class File {
}
/**
- * Get an image size array like that returned by getimagesize(), or false if it
+ * Get an image size array like that returned by getImageSize(), or false if it
* can't be determined.
*
- * @param string $fileName The filename
- * @return array
+ * @param $fileName String: The filename
+ * @return Array
*/
function getImageSize( $fileName ) {
if ( !$this->getHandler() ) {
@@ -1156,8 +1173,8 @@ abstract class File {
* Determine if the current user is allowed to view a particular
* field of this file, if it's marked as deleted.
* STUB
- * @param int $field
- * @return bool
+ * @param $field Integer
+ * @return Boolean
*/
function userCan( $field ) {
return true;
@@ -1166,9 +1183,9 @@ abstract class File {
/**
* Get an associative array containing information about a file in the local filesystem.
*
- * @param string $path Absolute local filesystem path
- * @param mixed $ext The file extension, or true to extract it from the filename.
- * Set it to false to ignore the extension.
+ * @param $path String: absolute local filesystem path
+ * @param $ext Mixed: the file extension, or true to extract it from the filename.
+ * Set it to false to ignore the extension.
*/
static function getPropsFromPath( $path, $ext = true ) {
wfProfileIn( __METHOD__ );
@@ -1180,7 +1197,16 @@ abstract class File {
if ( $info['fileExists'] ) {
$magic = MimeMagic::singleton();
- $info['mime'] = $magic->guessMimeType( $path, $ext );
+ if ( $ext === true ) {
+ $i = strrpos( $path, '.' );
+ $ext = strtolower( $i ? substr( $path, $i + 1 ) : '' );
+ }
+
+ # mime type according to file contents
+ $info['file-mime'] = $magic->guessMimeType( $path, false );
+ # logical mime type
+ $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
+
list( $info['major_mime'], $info['minor_mime'] ) = self::splitMime( $info['mime'] );
$info['media_type'] = $magic->getMediaType( $path, $info['mime'] );
diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php
index f94709b3..ff73a73c 100644
--- a/includes/filerepo/FileRepo.php
+++ b/includes/filerepo/FileRepo.php
@@ -1,8 +1,15 @@
<?php
+/**
+ * Base code for file repositories.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
- * Base class for file repositories
+ * Base class for file repositories.
* Do not instantiate, use a derived class.
+ *
* @ingroup FileRepo
*/
abstract class FileRepo {
@@ -12,7 +19,8 @@ abstract class FileRepo {
const OVERWRITE_SAME = 4;
var $thumbScriptUrl, $transformVia404;
- var $descBaseUrl, $scriptDirUrl, $articleUrl, $fetchDescription, $initialCapital;
+ var $descBaseUrl, $scriptDirUrl, $scriptExtension, $articleUrl;
+ var $fetchDescription, $initialCapital;
var $pathDisclosureProtection = 'paranoid';
var $descriptionCacheExpiry, $hashLevels, $url, $thumbUrl;
@@ -31,7 +39,8 @@ abstract class FileRepo {
$this->initialCapital = MWNamespace::isCapitalized( NS_FILE );
foreach ( array( 'descBaseUrl', 'scriptDirUrl', 'articleUrl', 'fetchDescription',
'thumbScriptUrl', 'initialCapital', 'pathDisclosureProtection',
- 'descriptionCacheExpiry', 'hashLevels', 'url', 'thumbUrl' ) as $var )
+ 'descriptionCacheExpiry', 'hashLevels', 'url', 'thumbUrl', 'scriptExtension' )
+ as $var )
{
if ( isset( $info[$var] ) ) {
$this->$var = $info[$var];
@@ -49,12 +58,13 @@ abstract class FileRepo {
/**
* Create a new File object from the local repository
- * @param mixed $title Title object or string
- * @param mixed $time Time at which the image was uploaded.
- * If this is specified, the returned object will be an
- * instance of the repository's old file class instead of
- * a current file. Repositories not supporting version
- * control should return false if this parameter is set.
+ *
+ * @param $title Mixed: Title object or string
+ * @param $time Mixed: Time at which the image was uploaded.
+ * If this is specified, the returned object will be an
+ * instance of the repository's old file class instead of a
+ * current file. Repositories not supporting version control
+ * should return false if this parameter is set.
*/
function newFile( $title, $time = false ) {
if ( !($title instanceof Title) ) {
@@ -79,7 +89,7 @@ abstract class FileRepo {
* Returns false if the file does not exist. Repositories not supporting
* version control should return false if the time is specified.
*
- * @param mixed $title Title object or string
+ * @param $title Mixed: Title object or string
* @param $options Associative array of options:
* time: requested time for an archived image, or false for the
* current version. An image object will be returned which was
@@ -144,7 +154,7 @@ abstract class FileRepo {
/*
* Find many files at once.
- * @param array $items, an array of titles, or an array of findFile() options with
+ * @param $items An array of titles, or an array of findFile() options with
* the "title" option giving the title. Example:
*
* $findItem = array( 'title' => $title, 'private' => true );
@@ -153,7 +163,7 @@ abstract class FileRepo {
*/
function findFiles( $items ) {
$result = array();
- foreach ( $items as $index => $item ) {
+ foreach ( $items as $item ) {
if ( is_array( $item ) ) {
$title = $item['title'];
$options = $item;
@@ -163,31 +173,33 @@ abstract class FileRepo {
$options = array();
}
$file = $this->findFile( $title, $options );
- if ( $file )
+ if ( $file ) {
$result[$file->getTitle()->getDBkey()] = $file;
+ }
}
return $result;
}
/**
* Create a new File object from the local repository
- * @param mixed $sha1 SHA-1 key
- * @param mixed $time Time at which the image was uploaded.
- * If this is specified, the returned object will be an
- * instance of the repository's old file class instead of
- * a current file. Repositories not supporting version
- * control should return false if this parameter is set.
+ * @param $sha1 Mixed: SHA-1 key
+ * @param $time Mixed: time at which the image was uploaded.
+ * If this is specified, the returned object will be an
+ * of the repository's old file class instead of a current
+ * file. Repositories not supporting version control should
+ * return false if this parameter is set.
*/
function newFileFromKey( $sha1, $time = false ) {
if ( $time ) {
if ( $this->oldFileFactoryKey ) {
return call_user_func( $this->oldFileFactoryKey, $sha1, $this, $time );
- } else {
- return false;
}
} else {
- return call_user_func( $this->fileFactoryKey, $sha1, $this );
+ if ( $this->fileFactoryKey ) {
+ return call_user_func( $this->fileFactoryKey, $sha1, $this );
+ }
}
+ return false;
}
/**
@@ -195,8 +207,8 @@ abstract class FileRepo {
* Returns false if the file does not exist. Repositories not supporting
* version control should return false if the time is specified.
*
- * @param string $sha1 string
- * @param array $options Option array, same as findFile().
+ * @param $sha1 String
+ * @param $options Option array, same as findFile().
*/
function findFileFromKey( $sha1, $options = array() ) {
if ( !is_array( $options ) ) {
@@ -217,7 +229,7 @@ abstract class FileRepo {
# Now try an old version of the file
if ( $time !== false ) {
$img = $this->newFileFromKey( $sha1, $time );
- if ( $img->exists() ) {
+ if ( $img && $img->exists() ) {
if ( !$img->isDeleted(File::DELETED_FILE) ) {
return $img;
} else if ( !empty( $options['private'] ) && $img->userCan(File::DELETED_FILE) ) {
@@ -237,7 +249,7 @@ abstract class FileRepo {
/**
* Get the URL corresponding to one of the four basic zones
- * @param String $zone One of: public, deleted, temp, thumb
+ * @param $zone String: one of: public, deleted, temp, thumb
* @return String or false
*/
function getZoneUrl( $zone ) {
@@ -255,7 +267,6 @@ abstract class FileRepo {
* Get the name of an image from its title object
*/
function getNameFromTitle( $title ) {
- global $wgCapitalLinks;
if ( $this->initialCapital != MWNamespace::isCapitalized( NS_FILE ) ) {
global $wgContLang;
$name = $title->getUserCaseDBKey();
@@ -295,6 +306,18 @@ abstract class FileRepo {
function getName() {
return $this->name;
}
+
+ /**
+ * Make an url to this repo
+ *
+ * @param $query mixed Query string to append
+ * @param $entry string Entry point; defaults to index
+ * @return string
+ */
+ function makeUrl( $query = '', $entry = 'index' ) {
+ $ext = isset( $this->scriptExtension ) ? $this->scriptExtension : '.php';
+ return wfAppendQuery( "{$this->scriptDirUrl}/{$entry}{$ext}", $query );
+ }
/**
* Get the URL of an image description page. May return false if it is
@@ -325,8 +348,7 @@ abstract class FileRepo {
# We use "Image:" as the canonical namespace for
# compatibility across all MediaWiki versions,
# and just sort of hope index.php is right. ;)
- return $this->scriptDirUrl .
- "/index.php?title=Image:$encName";
+ return $this->makeUrl( "title=Image:$encName" );
}
return false;
}
@@ -336,8 +358,8 @@ abstract class FileRepo {
* MediaWiki this means action=render. This should only be called by the
* repository's file class, since it may return invalid results. User code
* should use File::getDescriptionText().
- * @param string $name Name of image to fetch
- * @param string $lang Language to fetch it in, if any.
+ * @param $name String: name of image to fetch
+ * @param $lang String: language to fetch it in, if any.
*/
function getDescriptionRenderUrl( $name, $lang = null ) {
$query = 'action=render';
@@ -345,9 +367,10 @@ abstract class FileRepo {
$query .= '&uselang=' . $lang;
}
if ( isset( $this->scriptDirUrl ) ) {
- return $this->scriptDirUrl . '/index.php?title=' .
+ return $this->makeUrl(
+ 'title=' .
wfUrlencode( 'Image:' . $name ) .
- "&$query";
+ "&$query" );
} else {
$descUrl = $this->getDescriptionUrl( $name );
if ( $descUrl ) {
@@ -357,14 +380,25 @@ abstract class FileRepo {
}
}
}
+
+ /**
+ * Get the URL of the stylesheet to apply to description pages
+ * @return string
+ */
+ function getDescriptionStylesheetUrl() {
+ if ( $this->scriptDirUrl ) {
+ return $this->makeUrl( 'title=MediaWiki:Filepage.css&' .
+ wfArrayToCGI( Skin::getDynamicStylesheetQuery() ) );
+ }
+ }
/**
* Store a file to a given destination.
*
- * @param string $srcPath Source path or virtual URL
- * @param string $dstZone Destination zone
- * @param string $dstRel Destination relative path
- * @param integer $flags Bitwise combination of the following flags:
+ * @param $srcPath String: source path or virtual URL
+ * @param $dstZone String: destination zone
+ * @param $dstRel String: destination relative path
+ * @param $flags Integer: bitwise combination of the following flags:
* self::DELETE_SOURCE Delete the source file after upload
* self::OVERWRITE Overwrite an existing destination file instead of failing
* self::OVERWRITE_SAME Overwrite the file if the destination exists and has the
@@ -382,8 +416,8 @@ abstract class FileRepo {
/**
* Store a batch of files
*
- * @param array $triplets (src,zone,dest) triplets as per store()
- * @param integer $flags Flags as per store
+ * @param $triplets Array: (src,zone,dest) triplets as per store()
+ * @param $flags Integer: flags as per store
*/
abstract function storeBatch( $triplets, $flags = 0 );
@@ -391,18 +425,18 @@ abstract class FileRepo {
* Pick a random name in the temp zone and store a file to it.
* Returns a FileRepoStatus object with the URL in the value.
*
- * @param string $originalName The base name of the file as specified
+ * @param $originalName String: the base name of the file as specified
* by the user. The file extension will be maintained.
- * @param string $srcPath The current location of the file.
+ * @param $srcPath String: the current location of the file.
*/
abstract function storeTemp( $originalName, $srcPath );
/**
* Append the contents of the source path to the given file.
- * @param $srcPath string location of the source file
- * @param $toAppendPath string path to append to.
- * @param $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
+ * @param $srcPath String: location of the source file
+ * @param $toAppendPath String: path to append to.
+ * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source file should be deleted if possible
* @return mixed Status or false
*/
@@ -410,8 +444,8 @@ abstract class FileRepo {
/**
* Remove a temporary file or mark it for garbage collection
- * @param string $virtualUrl The virtual URL returned by storeTemp
- * @return boolean True on success, false on failure
+ * @param $virtualUrl String: the virtual URL returned by storeTemp
+ * @return Boolean: true on success, false on failure
* STUB
*/
function freeTemp( $virtualUrl ) {
@@ -425,11 +459,11 @@ abstract class FileRepo {
* Returns a FileRepoStatus object. On success, the value contains "new" or
* "archived", to indicate whether the file was new with that name.
*
- * @param string $srcPath The source path or URL
- * @param string $dstRel The destination relative path
- * @param string $archiveRel The relative path where the existing file is to
+ * @param $srcPath String: the source path or URL
+ * @param $dstRel String: the destination relative path
+ * @param $archiveRel String: rhe relative path where the existing file is to
* be archived, if there is one. Relative to the public zone root.
- * @param integer $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
+ * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source file should be deleted if possible
*/
function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
@@ -447,8 +481,8 @@ abstract class FileRepo {
/**
* Publish a batch of files
- * @param array $triplets (source,dest,archive) triplets as per publish()
- * @param integer $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
+ * @param $triplets Array: (source,dest,archive) triplets as per publish()
+ * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source files should be deleted if possible
*/
abstract function publishBatch( $triplets, $flags = 0 );
@@ -461,8 +495,8 @@ abstract class FileRepo {
/**
* Checks existence of an array of files.
*
- * @param array $files URLs (or paths) of files to check
- * @param integer $flags Bitwise combination of the following flags:
+ * @param $files Array: URLs (or paths) of files to check
+ * @param $flags Integer: bitwise combination of the following flags:
* self::FILES_ONLY Mark file as existing only if it is a file (not directory)
* @return Either array of files and existence flags, or false
*/
@@ -478,7 +512,7 @@ abstract class FileRepo {
* assumes a naming scheme in the deleted zone based on content hash, as
* opposed to the public zone which is assumed to be unique.
*
- * @param array $sourceDestPairs Array of source/destination pairs. Each element
+ * @param $sourceDestPairs Array of source/destination pairs. Each element
* is a two-element array containing the source file path relative to the
* public root in the first element, and the archive file path relative
* to the deleted zone root in the second element.
@@ -490,10 +524,10 @@ abstract class FileRepo {
* Move a file to the deletion archive.
* If no valid deletion archive exists, this may either delete the file
* or throw an exception, depending on the preference of the repository
- * @param mixed $srcRel Relative path for the file to be deleted
- * @param mixed $archiveRel Relative path for the archive location.
+ * @param $srcRel Mixed: relative path for the file to be deleted
+ * @param $archiveRel Mixed: relative path for the archive location.
* Relative to a private archive directory.
- * @return WikiError object (wikitext-formatted), or true for success
+ * @return FileRepoStatus object
*/
function delete( $srcRel, $archiveRel ) {
return $this->deleteBatch( array( array( $srcRel, $archiveRel ) ) );
@@ -589,7 +623,7 @@ abstract class FileRepo {
* title object. If not, return false.
* STUB
*
- * @param Title $title Title of image
+ * @param $title Title of image
*/
function checkRedirect( $title ) {
return false;
@@ -600,7 +634,7 @@ abstract class FileRepo {
* Doesn't do anything for repositories that don't support image redirects.
*
* STUB
- * @param Title $title Title of image
+ * @param $title Title of image
*/
function invalidateImageRedirect( $title ) {}
@@ -620,7 +654,7 @@ abstract class FileRepo {
*/
public function getDisplayName() {
// We don't name our own repo, return nothing
- if ( $this->name == 'local' ) {
+ if ( $this->isLocal() ) {
return null;
}
// 'shared-repo-name-wikimediacommons' is used when $wgUseInstantCommons = true
@@ -632,6 +666,16 @@ abstract class FileRepo {
}
/**
+ * Returns true if this the local file repository.
+ *
+ * @return bool
+ */
+ function isLocal() {
+ return $this->getName() == 'local';
+ }
+
+
+ /**
* Get a key on the primary cache for this repository.
* Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
@@ -652,4 +696,11 @@ abstract class FileRepo {
array_unshift( $args, 'filerepo', $this->getName() );
return call_user_func_array( 'wfMemcKey', $args );
}
+
+ /**
+ * Get an UploadStash associated with this repo.
+ */
+ function getUploadStash() {
+ return new UploadStash( $this );
+ }
}
diff --git a/includes/filerepo/FileRepoStatus.php b/includes/filerepo/FileRepoStatus.php
index 63460fa8..161284c0 100644
--- a/includes/filerepo/FileRepoStatus.php
+++ b/includes/filerepo/FileRepoStatus.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Generic operation result for FileRepo-related operations
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* Generic operation result class for FileRepo-related operations
diff --git a/includes/filerepo/ForeignAPIFile.php b/includes/filerepo/ForeignAPIFile.php
index c46b1f8f..56fed75e 100644
--- a/includes/filerepo/ForeignAPIFile.php
+++ b/includes/filerepo/ForeignAPIFile.php
@@ -1,8 +1,14 @@
<?php
+/**
+ * Foreign file accessible through api.php requests.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
-/**
- * Very hacky and inefficient
- * do not use :D
+/**
+ * Foreign file accessible through api.php requests.
+ * Very hacky and inefficient, do not use :D
*
* @ingroup FileRepo
*/
@@ -15,16 +21,47 @@ class ForeignAPIFile extends File {
$this->mInfo = $info;
$this->mExists = $exists;
}
-
+
+ /**
+ * @static
+ * @param $title Title
+ * @param $repo ForeignApiRepo
+ * @return ForeignAPIFile|null
+ */
static function newFromTitle( $title, $repo ) {
- $info = $repo->getImageInfo( $title );
+ $data = $repo->fetchImageQuery( array(
+ 'titles' => 'File:' . $title->getDBKey(),
+ 'iiprop' => self::getProps(),
+ 'prop' => 'imageinfo' ) );
+
+ $info = $repo->getImageInfo( $data );
+
if( $info ) {
- return new ForeignAPIFile( $title, $repo, $info, true );
+ $lastRedirect = isset( $data['query']['redirects'] )
+ ? count( $data['query']['redirects'] ) - 1
+ : -1;
+ if( $lastRedirect >= 0 ) {
+ $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
+ $img = new ForeignAPIFile( $newtitle, $repo, $info, true );
+ if( $img ) {
+ $img->redirectedFrom( $title->getDBkey() );
+ }
+ } else {
+ $img = new ForeignAPIFile( $title, $repo, $info, true );
+ }
+ return $img;
} else {
return null;
}
}
+ /**
+ * Get the property string for iiprop and aiprop
+ */
+ static function getProps() {
+ return 'timestamp|user|comment|url|size|sha1|metadata|mime';
+ }
+
// Dummy functions...
public function exists() {
return $this->mExists;
@@ -40,10 +77,10 @@ class ForeignAPIFile extends File {
return parent::transform( $params, $flags );
}
$thumbUrl = $this->repo->getThumbUrlFromCache(
- $this->getName(),
- isset( $params['width'] ) ? $params['width'] : -1,
- isset( $params['height'] ) ? $params['height'] : -1 );
- return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );;
+ $this->getName(),
+ isset( $params['width'] ) ? $params['width'] : -1,
+ isset( $params['height'] ) ? $params['height'] : -1 );
+ return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
}
// Info we can get from API...
@@ -74,27 +111,33 @@ class ForeignAPIFile extends File {
}
public function getSize() {
- return intval( @$this->mInfo['size'] );
+ return isset( $this->mInfo['size'] ) ? intval( $this->mInfo['size'] ) : null;
}
public function getUrl() {
- return strval( @$this->mInfo['url'] );
+ return isset( $this->mInfo['url'] ) ? strval( $this->mInfo['url'] ) : null;
}
public function getUser( $method='text' ) {
- return strval( @$this->mInfo['user'] );
+ return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null;
}
public function getDescription() {
- return strval( @$this->mInfo['comment'] );
+ return isset( $this->mInfo['comment'] ) ? strval( $this->mInfo['comment'] ) : null;
}
function getSha1() {
- return wfBaseConvert( strval( @$this->mInfo['sha1'] ), 16, 36, 31 );
+ return isset( $this->mInfo['sha1'] ) ?
+ wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 ) :
+ null;
}
function getTimestamp() {
- return wfTimestamp( TS_MW, strval( @$this->mInfo['timestamp'] ) );
+ return wfTimestamp( TS_MW,
+ isset( $this->mInfo['timestamp'] ) ?
+ strval( $this->mInfo['timestamp'] ) :
+ null
+ );
}
function getMimeType() {
@@ -122,15 +165,13 @@ class ForeignAPIFile extends File {
*/
function getThumbPath( $suffix = '' ) {
if ( $this->repo->canCacheThumbs() ) {
- global $wgUploadDirectory;
- $path = $wgUploadDirectory . '/thumb/' . $this->getHashPath( $this->getName() );
+ $path = $this->repo->getZonePath('thumb') . '/' . $this->getHashPath( $this->getName() );
if ( $suffix ) {
$path = $path . $suffix . '/';
}
return $path;
- }
- else {
- return null;
+ } else {
+ return null;
}
}
diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php
index 264cb920..e4188d6b 100644
--- a/includes/filerepo/ForeignAPIRepo.php
+++ b/includes/filerepo/ForeignAPIRepo.php
@@ -1,9 +1,13 @@
<?php
+/**
+ * Foreign repository accessible through api.php requests.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* A foreign repository with a remote MediaWiki with an API thingy
- * Very hacky and inefficient
- * do not use except for testing :D
*
* Example config:
*
@@ -18,17 +22,37 @@
* @ingroup FileRepo
*/
class ForeignAPIRepo extends FileRepo {
+ /* This version string is used in the user agent for requests and will help
+ * server maintainers in identify ForeignAPI usage.
+ * Update the version every time you make breaking or significant changes. */
+ const VERSION = "2.0";
+
var $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' );
+ /* Check back with Commons after a day */
var $apiThumbCacheExpiry = 86400;
+ /* Redownload thumbnail files after a month */
+ var $fileCacheExpiry = 2629743;
+ /* Local image directory */
+ var $directory;
+ var $thumbDir;
+
protected $mQueryCache = array();
protected $mFileExists = array();
function __construct( $info ) {
parent::__construct( $info );
- $this->mApiBase = $info['apibase']; // http://commons.wikimedia.org/w/api.php
+ global $wgUploadDirectory;
+
+ // http://commons.wikimedia.org/w/api.php
+ $this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
+ $this->directory = isset( $info['directory'] ) ? $info['directory'] : $wgUploadDirectory;
+
if( isset( $info['apiThumbCacheExpiry'] ) ) {
$this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
}
+ if( isset( $info['fileCacheExpiry'] ) ) {
+ $this->fileCacheExpiry = $info['fileCacheExpiry'];
+ }
if( !$this->scriptDirUrl ) {
// hack for description fetches
$this->scriptDirUrl = dirname( $this->mApiBase );
@@ -41,6 +65,11 @@ class ForeignAPIRepo extends FileRepo {
if( $this->canCacheThumbs() && !$this->thumbUrl ) {
$this->thumbUrl = $this->url . '/thumb';
}
+ if ( isset( $info['thumbDir'] ) ) {
+ $this->thumbDir = $info['thumbDir'];
+ } else {
+ $this->thumbDir = "{$this->directory}/thumb";
+ }
}
/**
@@ -89,7 +118,7 @@ class ForeignAPIRepo extends FileRepo {
}
}
- $results = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
+ $data = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
'prop' => 'imageinfo' ) );
if( isset( $data['query']['pages'] ) ) {
$i = 0;
@@ -98,40 +127,32 @@ class ForeignAPIRepo extends FileRepo {
$i++;
}
}
+ return $results;
}
function getFileProps( $virtualUrl ) {
return false;
}
- protected function queryImage( $query ) {
- $data = $this->fetchImageQuery( $query );
-
- if( isset( $data['query']['pages'] ) ) {
- foreach( $data['query']['pages'] as $pageid => $info ) {
- if( isset( $info['imageinfo'][0] ) ) {
- return $info['imageinfo'][0];
- }
- }
- }
- return false;
- }
-
- protected function fetchImageQuery( $query ) {
+ function fetchImageQuery( $query ) {
global $wgMemc;
- $url = $this->mApiBase .
- '?' .
- wfArrayToCgi(
- array_merge( $query,
- array(
- 'format' => 'json',
- 'action' => 'query' ) ) );
+ $query = array_merge( $query,
+ array(
+ 'format' => 'json',
+ 'action' => 'query',
+ 'redirects' => 'true'
+ ) );
+ if ( $this->mApiBase ) {
+ $url = wfAppendQuery( $this->mApiBase, $query );
+ } else {
+ $url = $this->makeUrl( $query, 'api' );
+ }
if( !isset( $this->mQueryCache[$url] ) ) {
$key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
$data = $wgMemc->get( $key );
if( !$data ) {
- $data = Http::get( $url );
+ $data = self::httpGet( $url );
if ( !$data ) {
return null;
}
@@ -147,81 +168,141 @@ class ForeignAPIRepo extends FileRepo {
return FormatJson::decode( $this->mQueryCache[$url], true );
}
- function getImageInfo( $title, $time = false ) {
- return $this->queryImage( array(
- 'titles' => 'Image:' . $title->getText(),
- 'iiprop' => 'timestamp|user|comment|url|size|sha1|metadata|mime',
- 'prop' => 'imageinfo' ) );
+ function getImageInfo( $data ) {
+ if( $data && isset( $data['query']['pages'] ) ) {
+ foreach( $data['query']['pages'] as $info ) {
+ if( isset( $info['imageinfo'][0] ) ) {
+ return $info['imageinfo'][0];
+ }
+ }
+ }
+ return false;
}
function findBySha1( $hash ) {
$results = $this->fetchImageQuery( array(
'aisha1base36' => $hash,
- 'aiprop' => 'timestamp|user|comment|url|size|sha1|metadata|mime',
+ 'aiprop' => ForeignAPIFile::getProps(),
'list' => 'allimages', ) );
$ret = array();
if ( isset( $results['query']['allimages'] ) ) {
foreach ( $results['query']['allimages'] as $img ) {
+ // 1.14 was broken, doesn't return name attribute
+ if( !isset( $img['name'] ) ) {
+ continue;
+ }
$ret[] = new ForeignAPIFile( Title::makeTitle( NS_FILE, $img['name'] ), $this, $img );
}
}
return $ret;
}
- function getThumbUrl( $name, $width=-1, $height=-1 ) {
- $info = $this->queryImage( array(
- 'titles' => 'Image:' . $name,
- 'iiprop' => 'url',
+ function getThumbUrl( $name, $width=-1, $height=-1, &$result=NULL ) {
+ $data = $this->fetchImageQuery( array(
+ 'titles' => 'File:' . $name,
+ 'iiprop' => 'url|timestamp',
'iiurlwidth' => $width,
'iiurlheight' => $height,
'prop' => 'imageinfo' ) );
- if( $info && $info['thumburl'] ) {
+ $info = $this->getImageInfo( $data );
+
+ if( $data && $info && isset( $info['thumburl'] ) ) {
wfDebug( __METHOD__ . " got remote thumb " . $info['thumburl'] . "\n" );
+ $result = $info;
return $info['thumburl'];
} else {
return false;
}
}
+ /*
+ * Return the imageurl from cache if possible
+ *
+ * If the url has been requested today, get it from cache
+ * Otherwise retrieve remote thumb url, check for local file.
+ *
+ * @param $name String is a dbkey form of a title
+ * @param $width
+ * @param $height
+ */
function getThumbUrlFromCache( $name, $width, $height ) {
- global $wgMemc, $wgUploadPath, $wgServer, $wgUploadDirectory;
+ global $wgMemc;
if ( !$this->canCacheThumbs() ) {
return $this->getThumbUrl( $name, $width, $height );
}
-
$key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $name );
- if ( $thumbUrl = $wgMemc->get($key) ) {
- wfDebug("Got thumb from local cache. $thumbUrl \n");
- return $thumbUrl;
- }
- else {
- $foreignUrl = $this->getThumbUrl( $name, $width, $height );
- if( !$foreignUrl ) {
- wfDebug( __METHOD__ . " Could not find thumburl\n" );
- return false;
- }
- $thumb = Http::get( $foreignUrl );
- if( !$thumb ) {
- wfDebug( __METHOD__ . " Could not download thumb\n" );
- return false;
+ $sizekey = "$width:$height";
+
+ /* Get the array of urls that we already know */
+ $knownThumbUrls = $wgMemc->get($key);
+ if( !$knownThumbUrls ) {
+ /* No knownThumbUrls for this file */
+ $knownThumbUrls = array();
+ } else {
+ if( isset( $knownThumbUrls[$sizekey] ) ) {
+ wfDebug("Got thumburl from local cache. {$knownThumbUrls[$sizekey]} \n");
+ return $knownThumbUrls[$sizekey];
}
- // We need the same filename as the remote one :)
- $fileName = rawurldecode( pathinfo( $foreignUrl, PATHINFO_BASENAME ) );
- $path = 'thumb/' . $this->getHashPath( $name ) . $name . "/";
- if ( !is_dir($wgUploadDirectory . '/' . $path) ) {
- wfMkdirParents($wgUploadDirectory . '/' . $path);
+ /* This size is not yet known */
+ }
+
+ $metadata = null;
+ $foreignUrl = $this->getThumbUrl( $name, $width, $height, $metadata );
+
+ if( !$foreignUrl ) {
+ wfDebug( __METHOD__ . " Could not find thumburl\n" );
+ return false;
+ }
+
+ // We need the same filename as the remote one :)
+ $fileName = rawurldecode( pathinfo( $foreignUrl, PATHINFO_BASENAME ) );
+ if( !$this->validateFilename( $fileName ) ) {
+ wfDebug( __METHOD__ . " The deduced filename $fileName is not safe\n" );
+ return false;
+ }
+ $localPath = $this->getZonePath( 'thumb' ) . "/" . $this->getHashPath( $name ) . $name;
+ $localFilename = $localPath . "/" . $fileName;
+ $localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
+
+ if( file_exists( $localFilename ) && isset( $metadata['timestamp'] ) ) {
+ wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
+ $modified = filemtime( $localFilename );
+ $remoteModified = strtotime( $metadata['timestamp'] );
+ $current = time();
+ $diff = abs( $modified - $current );
+ if( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
+ /* Use our current and already downloaded thumbnail */
+ $knownThumbUrls["$width:$height"] = $localUrl;
+ $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+ return $localUrl;
}
- $localUrl = $wgServer . $wgUploadPath . '/' . $path . $fileName;
- # FIXME: Delete old thumbs that aren't being used. Maintenance script?
- if( !file_put_contents($wgUploadDirectory . '/' . $path . $fileName, $thumb ) ) {
- wfDebug( __METHOD__ . " could not write to thumb path\n" );
+ /* There is a new Commons file, or existing thumbnail older than a month */
+ }
+ $thumb = self::httpGet( $foreignUrl );
+ if( !$thumb ) {
+ wfDebug( __METHOD__ . " Could not download thumb\n" );
+ return false;
+ }
+ if ( !is_dir($localPath) ) {
+ if( !wfMkdirParents($localPath) ) {
+ wfDebug( __METHOD__ . " could not create directory $localPath for thumb\n" );
return $foreignUrl;
}
- $wgMemc->set( $key, $localUrl, $this->apiThumbCacheExpiry );
- wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
- return $localUrl;
}
+
+ # FIXME: Delete old thumbs that aren't being used. Maintenance script?
+ wfSuppressWarnings();
+ if( !file_put_contents( $localFilename, $thumb ) ) {
+ 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" );
+ return $localUrl;
}
/**
@@ -239,10 +320,57 @@ class ForeignAPIRepo extends FileRepo {
}
/**
+ * Get the local directory corresponding to one of the three basic zones
+ */
+ function getZonePath( $zone ) {
+ switch ( $zone ) {
+ case 'public':
+ return $this->directory;
+ case 'thumb':
+ return $this->thumbDir;
+ default:
+ return false;
+ }
+ }
+
+ /**
* Are we locally caching the thumbnails?
* @return bool
*/
public function canCacheThumbs() {
return ( $this->apiThumbCacheExpiry > 0 );
}
+
+ /**
+ * The user agent the ForeignAPIRepo will use.
+ */
+ public static function getUserAgent() {
+ return Http::userAgent() . " ForeignAPIRepo/" . self::VERSION;
+ }
+
+ /**
+ * Like a Http:get request, but with custom User-Agent.
+ * @see Http:get
+ */
+ public static function httpGet( $url, $timeout = 'default', $options = array() ) {
+ $options['timeout'] = $timeout;
+ /* Http::get */
+ $url = wfExpandUrl( $url );
+ wfDebug( "ForeignAPIRepo: HTTP GET: $url\n" );
+ $options['method'] = "GET";
+
+ if ( !isset( $options['timeout'] ) ) {
+ $options['timeout'] = 'default';
+ }
+
+ $req = MWHttpRequest::factory( $url, $options );
+ $req->setUserAgent( ForeignAPIRepo::getUserAgent() );
+ $status = $req->execute();
+
+ if ( $status->isOK() ) {
+ return $req->getContent();
+ } else {
+ return false;
+ }
+ }
}
diff --git a/includes/filerepo/ForeignDBFile.php b/includes/filerepo/ForeignDBFile.php
index a24ff72b..5f04ea73 100644
--- a/includes/filerepo/ForeignDBFile.php
+++ b/includes/filerepo/ForeignDBFile.php
@@ -1,6 +1,14 @@
<?php
+/**
+ * Foreign file with an accessible MediaWiki database
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
+ * Foreign file with an accessible MediaWiki database
+ *
* @ingroup FileRepo
*/
class ForeignDBFile extends LocalFile {
diff --git a/includes/filerepo/ForeignDBRepo.php b/includes/filerepo/ForeignDBRepo.php
index 35c2c4bf..590350b4 100644
--- a/includes/filerepo/ForeignDBRepo.php
+++ b/includes/filerepo/ForeignDBRepo.php
@@ -1,7 +1,14 @@
<?php
+/**
+ * A foreign repository with an accessible MediaWiki database
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* A foreign repository with an accessible MediaWiki database
+ *
* @ingroup FileRepo
*/
class ForeignDBRepo extends LocalRepo {
@@ -28,10 +35,16 @@ class ForeignDBRepo extends LocalRepo {
function getMasterDB() {
if ( !isset( $this->dbConn ) ) {
- $class = 'Database' . ucfirst( $this->dbType );
- $this->dbConn = new $class( $this->dbServer, $this->dbUser,
- $this->dbPassword, $this->dbName, false, $this->dbFlags,
- $this->tablePrefix );
+ $this->dbConn = DatabaseBase::newFromType( $this->dbType,
+ array(
+ 'server' => $this->dbServer,
+ 'user' => $this->dbUser,
+ 'password' => $this->dbPassword,
+ 'dbname' => $this->dbName,
+ 'flags' => $this->dbFlags,
+ 'tableprefix' => $this->tablePrefix
+ )
+ );
}
return $this->dbConn;
}
@@ -65,7 +78,7 @@ class ForeignDBRepo extends LocalRepo {
function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
throw new MWException( get_class($this) . ': write operations are not supported' );
}
- function deleteBatch( $fileMap ) {
+ function deleteBatch( $sourceDestPairs ) {
throw new MWException( get_class($this) . ': write operations are not supported' );
}
}
diff --git a/includes/filerepo/ForeignDBViaLBRepo.php b/includes/filerepo/ForeignDBViaLBRepo.php
index 80325752..4c530b51 100644
--- a/includes/filerepo/ForeignDBViaLBRepo.php
+++ b/includes/filerepo/ForeignDBViaLBRepo.php
@@ -1,7 +1,14 @@
<?php
+/**
+ * A foreign repository with a MediaWiki database accessible via the configured LBFactory
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* A foreign repository with a MediaWiki database accessible via the configured LBFactory
+ *
* @ingroup FileRepo
*/
class ForeignDBViaLBRepo extends LocalRepo {
diff --git a/includes/filerepo/Image.php b/includes/filerepo/Image.php
index 08ce219a..59a07ef9 100644
--- a/includes/filerepo/Image.php
+++ b/includes/filerepo/Image.php
@@ -1,8 +1,14 @@
<?php
+/**
+ * Backward compatibility code for MW < 1.11
+ *
+ * @file
+ */
/**
* Backwards compatibility class
- * @deprecated
+ *
+ * @deprecated. Will be removed in 1.18!
* @ingroup FileRepo
*/
class Image extends LocalFile {
@@ -17,7 +23,7 @@ class Image extends LocalFile {
* Do not use in core code.
* @deprecated
*/
- static function newFromTitle( $title, $time = false ) {
+ static function newFromTitle( $title, $repo, $time = null ) {
wfDeprecated( __METHOD__ );
$img = wfFindFile( $title, array( 'time' => $time ) );
if ( !$img ) {
@@ -30,7 +36,7 @@ class Image extends LocalFile {
* Wrapper for wfFindFile(), for backwards-compatibility only.
* Do not use in core code.
*
- * @param string $name name of the image, used to create a title object using Title::makeTitleSafe
+ * @param $name String: name of the image, used to create a title object using Title::makeTitleSafe
* @return image object or null if invalid title
* @deprecated
*/
@@ -55,8 +61,8 @@ class Image extends LocalFile {
* Note that fromSharedDirectory will only use the shared path for files
* that actually exist there now, and will return local paths otherwise.
*
- * @param string $name Name of the image, without the leading "Image:"
- * @param boolean $fromSharedDirectory Should this be in $wgSharedUploadPath?
+ * @param $name String: name of the image, without the leading "Image:"
+ * @param $fromSharedDirectory Boolean: Should this be in $wgSharedUploadPath?
* @return string URL of $name image
* @deprecated
*/
diff --git a/includes/filerepo/LocalFile.php b/includes/filerepo/LocalFile.php
index b6b4bfed..5489ecb2 100644
--- a/includes/filerepo/LocalFile.php
+++ b/includes/filerepo/LocalFile.php
@@ -1,5 +1,9 @@
<?php
/**
+ * Local file in the wiki's own database
+ *
+ * @file
+ * @ingroup FileRepo
*/
/**
@@ -28,9 +32,10 @@ class LocalFile extends File {
/**#@+
* @private
*/
- var $fileExists, # does the file file exist on disk? (loadFromXxx)
- $historyLine, # Number of line to return by nextHistoryLine() (constructor)
- $historyRes, # result of the query for the file's history (nextHistoryLine)
+ var
+ $fileExists, # does the file file exist on disk? (loadFromXxx)
+ $historyLine, # Number of line to return by nextHistoryLine() (constructor)
+ $historyRes, # result of the query for the file's history (nextHistoryLine)
$width, # \
$height, # |
$bits, # --- returned by getimagesize (loadFromXxx)
@@ -49,7 +54,7 @@ class LocalFile extends File {
$upgraded, # Whether the row was upgraded on load
$locked, # True if the image row is locked
$missing, # True if file is not present in file system. Not to be cached in memcached
- $deleted; # Bitfield akin to rev_deleted
+ $deleted; # Bitfield akin to rev_deleted
/**#@-*/
@@ -71,29 +76,31 @@ class LocalFile extends File {
$title = Title::makeTitle( NS_FILE, $row->img_name );
$file = new self( $title, $repo );
$file->loadFromRow( $row );
+
return $file;
}
-
+
/**
* Create a LocalFile from a SHA-1 key
* Do not call this except from inside a repo class.
*/
static function newFromKey( $sha1, $repo, $timestamp = false ) {
- # Polymorphic function name to distinguish foreign and local fetches
- $fname = get_class( $this ) . '::' . __FUNCTION__;
-
$conds = array( 'img_sha1' => $sha1 );
- if( $timestamp ) {
+
+ if ( $timestamp ) {
$conds['img_timestamp'] = $timestamp;
}
- $row = $dbr->selectRow( 'image', $this->getCacheFields( 'img_' ), $conds, $fname );
- if( $row ) {
+
+ $dbr = $repo->getSlaveDB();
+ $row = $dbr->selectRow( 'image', self::selectFields(), $conds, __METHOD__ );
+
+ if ( $row ) {
return self::newFromRow( $row, $repo );
} else {
return false;
}
}
-
+
/**
* Fields in the image table
*/
@@ -121,10 +128,12 @@ class LocalFile extends File {
* Do not call this except from inside a repo class.
*/
function __construct( $title, $repo ) {
- if( !is_object( $title ) ) {
+ if ( !is_object( $title ) ) {
throw new MWException( __CLASS__ . ' constructor given bogus title.' );
}
+
parent::__construct( $title, $repo );
+
$this->metadata = '';
$this->historyLine = 0;
$this->historyRes = null;
@@ -132,11 +141,12 @@ class LocalFile extends File {
}
/**
- * Get the memcached key for the main data for this file, or false if
+ * Get the memcached key for the main data for this file, or false if
* there is no access to the shared cache.
*/
function getCacheKey() {
$hashedName = md5( $this->getName() );
+
return $this->repo->getSharedCacheKey( 'file', $hashedName );
}
@@ -145,13 +155,16 @@ class LocalFile extends File {
*/
function loadFromCache() {
global $wgMemc;
+
wfProfileIn( __METHOD__ );
$this->dataLoaded = false;
$key = $this->getCacheKey();
+
if ( !$key ) {
wfProfileOut( __METHOD__ );
return false;
}
+
$cachedValues = $wgMemc->get( $key );
// Check if the key existed and belongs to this version of MediaWiki
@@ -163,6 +176,7 @@ class LocalFile extends File {
}
$this->dataLoaded = true;
}
+
if ( $this->dataLoaded ) {
wfIncrStats( 'image_cache_hit' );
} else {
@@ -178,14 +192,18 @@ class LocalFile extends File {
*/
function saveToCache() {
global $wgMemc;
+
$this->load();
$key = $this->getCacheKey();
+
if ( !$key ) {
return;
}
+
$fields = $this->getCacheFields( '' );
$cache = array( 'version' => MW_FILE_VERSION );
$cache['fileExists'] = $this->fileExists;
+
if ( $this->fileExists ) {
foreach ( $fields as $field ) {
$cache[$field] = $this->$field;
@@ -206,9 +224,11 @@ class LocalFile extends File {
static $fields = array( 'size', 'width', 'height', 'bits', 'media_type',
'major_mime', 'minor_mime', 'metadata', 'timestamp', 'sha1', 'user', 'user_text', 'description' );
static $results = array();
+
if ( $prefix == '' ) {
return $fields;
}
+
if ( !isset( $results[$prefix] ) ) {
$prefixedFields = array();
foreach ( $fields as $field ) {
@@ -216,6 +236,7 @@ class LocalFile extends File {
}
$results[$prefix] = $prefixedFields;
}
+
return $results[$prefix];
}
@@ -234,6 +255,7 @@ class LocalFile extends File {
$row = $dbr->selectRow( 'image', $this->getCacheFields( 'img_' ),
array( 'img_name' => $this->getName() ), $fname );
+
if ( $row ) {
$this->loadFromRow( $row );
} else {
@@ -250,15 +272,20 @@ class LocalFile extends File {
function decodeRow( $row, $prefix = 'img_' ) {
$array = (array)$row;
$prefixLength = strlen( $prefix );
+
// Sanity check prefix once
if ( substr( key( $array ), 0, $prefixLength ) !== $prefix ) {
throw new MWException( __METHOD__ . ': incorrect $prefix parameter' );
}
+
$decoded = array();
+
foreach ( $array as $name => $value ) {
$decoded[substr( $name, $prefixLength )] = $value;
}
+
$decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] );
+
if ( empty( $decoded['major_mime'] ) ) {
$decoded['mime'] = 'unknown/unknown';
} else {
@@ -267,8 +294,10 @@ class LocalFile extends File {
}
$decoded['mime'] = $decoded['major_mime'] . '/' . $decoded['minor_mime'];
}
+
# Trim zero padding from char/binary field
$decoded['sha1'] = rtrim( $decoded['sha1'], "\0" );
+
return $decoded;
}
@@ -278,9 +307,11 @@ class LocalFile extends File {
function loadFromRow( $row, $prefix = 'img_' ) {
$this->dataLoaded = true;
$array = $this->decodeRow( $row, $prefix );
+
foreach ( $array as $name => $value ) {
$this->$name = $value;
}
+
$this->fileExists = true;
$this->maybeUpgradeRow();
}
@@ -305,6 +336,7 @@ class LocalFile extends File {
if ( wfReadOnly() ) {
return;
}
+
if ( is_null( $this->media_type ) ||
$this->mime == 'image/svg'
) {
@@ -337,6 +369,7 @@ class LocalFile extends File {
wfProfileOut( __METHOD__ );
return;
}
+
$dbw = $this->repo->getMasterDB();
list( $major, $minor ) = self::splitMime( $this->mime );
@@ -359,6 +392,7 @@ class LocalFile extends File {
), array( 'img_name' => $this->getName() ),
__METHOD__
);
+
$this->saveToCache();
wfProfileOut( __METHOD__ );
}
@@ -374,15 +408,18 @@ class LocalFile extends File {
$this->dataLoaded = true;
$fields = $this->getCacheFields( '' );
$fields[] = 'fileExists';
+
foreach ( $fields as $field ) {
if ( isset( $info[$field] ) ) {
$this->$field = $info[$field];
}
}
+
// Fix up mime fields
if ( isset( $info['major_mime'] ) ) {
$this->mime = "{$info['major_mime']}/{$info['minor_mime']}";
} elseif ( isset( $info['mime'] ) ) {
+ $this->mime = $info['mime'];
list( $this->major_mime, $this->minor_mime ) = self::splitMime( $this->mime );
}
}
@@ -396,7 +433,7 @@ class LocalFile extends File {
/** isVisible inhereted */
function isMissing() {
- if( $this->missing === null ) {
+ if ( $this->missing === null ) {
list( $fileExists ) = $this->repo->fileExistsBatch( array( $this->getVirtualUrl() ), FileRepo::FILES_ONLY );
$this->missing = !$fileExists;
}
@@ -410,6 +447,7 @@ class LocalFile extends File {
*/
public function getWidth( $page = 1 ) {
$this->load();
+
if ( $this->isMultipage() ) {
$dim = $this->getHandler()->getPageDimensions( $this, $page );
if ( $dim ) {
@@ -429,6 +467,7 @@ class LocalFile extends File {
*/
public function getHeight( $page = 1 ) {
$this->load();
+
if ( $this->isMultipage() ) {
$dim = $this->getHandler()->getPageDimensions( $this, $page );
if ( $dim ) {
@@ -448,9 +487,10 @@ class LocalFile extends File {
*/
function getUser( $type = 'text' ) {
$this->load();
- if( $type == 'text' ) {
+
+ if ( $type == 'text' ) {
return $this->user_text;
- } elseif( $type == 'id' ) {
+ } elseif ( $type == 'id' ) {
return $this->user;
}
}
@@ -521,6 +561,7 @@ class LocalFile extends File {
function migrateThumbFile( $thumbName ) {
$thumbDir = $this->getThumbPath();
$thumbPath = "$thumbDir/$thumbName";
+
if ( is_dir( $thumbPath ) ) {
// Directory where file should be
// This happened occasionally due to broken migration code in 1.5
@@ -535,6 +576,7 @@ class LocalFile extends File {
// Doesn't exist anymore
clearstatcache();
}
+
if ( is_file( $thumbDir ) ) {
// File where directory should be
unlink( $thumbDir );
@@ -552,6 +594,7 @@ class LocalFile extends File {
*/
function getThumbnails() {
$this->load();
+
$files = array();
$dir = $this->getThumbPath();
@@ -560,10 +603,11 @@ class LocalFile extends File {
if ( $handle ) {
while ( false !== ( $file = readdir( $handle ) ) ) {
- if ( $file{0} != '.' ) {
+ if ( $file { 0 } != '.' ) {
$files[] = $file;
}
}
+
closedir( $handle );
}
}
@@ -585,8 +629,10 @@ class LocalFile extends File {
*/
function purgeHistory() {
global $wgMemc;
+
$hashedName = md5( $this->getName() );
$oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName );
+
if ( $oldKey ) {
$wgMemc->delete( $oldKey );
}
@@ -611,10 +657,12 @@ class LocalFile extends File {
*/
function purgeThumbnails() {
global $wgUseSquid;
+
// Delete thumbnails
$files = $this->getThumbnails();
$dir = $this->getThumbPath();
$urls = array();
+
foreach ( $files as $file ) {
# Check that the base file name is part of the thumb name
# This is a basic sanity check to avoid erasing unrelated directories
@@ -641,31 +689,42 @@ class LocalFile extends File {
$conds = $opts = $join_conds = array();
$eq = $inc ? '=' : '';
$conds[] = "oi_name = " . $dbr->addQuotes( $this->title->getDBkey() );
- if( $start ) {
+
+ if ( $start ) {
$conds[] = "oi_timestamp <$eq " . $dbr->addQuotes( $dbr->timestamp( $start ) );
}
- if( $end ) {
+
+ if ( $end ) {
$conds[] = "oi_timestamp >$eq " . $dbr->addQuotes( $dbr->timestamp( $end ) );
}
- if( $limit ) {
+
+ if ( $limit ) {
$opts['LIMIT'] = $limit;
}
+
// Search backwards for time > x queries
$order = ( !$start && $end !== null ) ? 'ASC' : 'DESC';
$opts['ORDER BY'] = "oi_timestamp $order";
$opts['USE INDEX'] = array( 'oldimage' => 'oi_name_timestamp' );
- wfRunHooks( 'LocalFile::getHistory', array( &$this, &$tables, &$fields,
+ wfRunHooks( 'LocalFile::getHistory', array( &$this, &$tables, &$fields,
&$conds, &$opts, &$join_conds ) );
$res = $dbr->select( $tables, $fields, $conds, __METHOD__, $opts, $join_conds );
$r = array();
- while( $row = $dbr->fetchObject( $res ) ) {
- $r[] = OldLocalFile::newFromRow( $row, $this->repo );
+
+ foreach ( $res as $row ) {
+ if ( $this->repo->oldFileFromRowFactory ) {
+ $r[] = call_user_func( $this->repo->oldFileFromRowFactory, $row, $this->repo );
+ } else {
+ $r[] = OldLocalFile::newFromRow( $row, $this->repo );
+ }
}
- if( $order == 'ASC' ) {
+
+ if ( $order == 'ASC' ) {
$r = array_reverse( $r ); // make sure it ends up descending
}
+
return $r;
}
@@ -694,13 +753,12 @@ class LocalFile extends File {
array( 'img_name' => $this->title->getDBkey() ),
$fname
);
+
if ( 0 == $dbr->numRows( $this->historyRes ) ) {
- $dbr->freeResult( $this->historyRes );
$this->historyRes = null;
return false;
}
} elseif ( $this->historyLine == 1 ) {
- $dbr->freeResult( $this->historyRes );
$this->historyRes = $dbr->select( 'oldimage', '*',
array( 'oi_name' => $this->title->getDBkey() ),
$fname,
@@ -717,8 +775,8 @@ class LocalFile extends File {
*/
public function resetHistory() {
$this->historyLine = 0;
+
if ( !is_null( $this->historyRes ) ) {
- $this->repo->getSlaveDB()->freeResult( $this->historyRes );
$this->historyRes = null;
}
}
@@ -739,14 +797,16 @@ class LocalFile extends File {
/**
* Upload a file and record it in the DB
- * @param string $srcPath Source path or virtual URL
- * @param string $comment Upload description
- * @param string $pageText Text to use for the new description page, if a new description page is created
- * @param integer $flags Flags for publish()
- * @param array $props File properties, if known. This can be used to reduce the
- * upload time when uploading virtual URLs for which the file info
- * is already known
- * @param string $timestamp Timestamp for img_timestamp, or false to use the current time
+ * @param $srcPath String: source path or virtual URL
+ * @param $comment String: upload description
+ * @param $pageText String: text to use for the new description page,
+ * if a new description page is created
+ * @param $flags Integer: flags for publish()
+ * @param $props Array: File properties, if known. This can be used to reduce the
+ * upload time when uploading virtual URLs for which the file info
+ * is already known
+ * @param $timestamp String: timestamp for img_timestamp, or false to use the current time
+ * @param $user Mixed: User object or null to use $wgUser
*
* @return FileRepoStatus object. On success, the value member contains the
* archive name, or an empty string if it was a new file.
@@ -754,12 +814,15 @@ class LocalFile extends File {
function upload( $srcPath, $comment, $pageText, $flags = 0, $props = false, $timestamp = false, $user = null ) {
$this->lock();
$status = $this->publish( $srcPath, $flags );
+
if ( $status->ok ) {
if ( !$this->recordUpload2( $status->value, $comment, $pageText, $props, $timestamp, $user ) ) {
$status->fatal( 'filenotfound', $srcPath );
}
}
+
$this->unlock();
+
return $status;
}
@@ -771,9 +834,11 @@ class LocalFile extends File {
$watch = false, $timestamp = false )
{
$pageText = SpecialUpload::getInitialPageText( $desc, $license, $copyStatus, $source );
+
if ( !$this->recordUpload2( $oldver, $desc, $pageText ) ) {
return false;
}
+
if ( $watch ) {
global $wgUser;
$wgUser->addWatch( $this->getTitle() );
@@ -785,11 +850,12 @@ class LocalFile extends File {
/**
* Record a file upload in the upload log and the image table
*/
- function recordUpload2( $oldver, $comment, $pageText, $props = false, $timestamp = false, $user = null )
- {
- if( is_null( $user ) ) {
+ function recordUpload2(
+ $oldver, $comment, $pageText, $props = false, $timestamp = false, $user = null
+ ) {
+ if ( is_null( $user ) ) {
global $wgUser;
- $user = $wgUser;
+ $user = $wgUser;
}
$dbw = $this->repo->getMasterDB();
@@ -798,27 +864,30 @@ class LocalFile extends File {
if ( !$props ) {
$props = $this->repo->getFileProps( $this->getVirtualUrl() );
}
+
+ if ( $timestamp === false ) {
+ $timestamp = $dbw->timestamp();
+ }
+
$props['description'] = $comment;
$props['user'] = $user->getId();
$props['user_text'] = $user->getName();
- $props['timestamp'] = wfTimestamp( TS_MW );
+ $props['timestamp'] = wfTimestamp( TS_MW, $timestamp ); // DB -> TS_MW
$this->setProps( $props );
- // Delete thumbnails and refresh the metadata cache
+ # Delete thumbnails
$this->purgeThumbnails();
- $this->saveToCache();
+
+ # The file is already on its final location, remove it from the squid cache
SquidUpdate::purge( array( $this->getURL() ) );
- // Fail now if the file isn't there
+ # Fail now if the file isn't there
if ( !$this->fileExists ) {
wfDebug( __METHOD__ . ": File " . $this->getPath() . " went missing!\n" );
return false;
}
$reupload = false;
- if ( $timestamp === false ) {
- $timestamp = $dbw->timestamp();
- }
# Test to see if the row exists using INSERT IGNORE
# This avoids race conditions by locking the row until the commit, and also
@@ -826,7 +895,7 @@ class LocalFile extends File {
$dbw->insert( 'image',
array(
'img_name' => $this->getName(),
- 'img_size'=> $this->size,
+ 'img_size' => $this->size,
'img_width' => intval( $this->width ),
'img_height' => intval( $this->height ),
'img_bits' => $this->bits,
@@ -844,7 +913,7 @@ class LocalFile extends File {
'IGNORE'
);
- if( $dbw->affectedRows() == 0 ) {
+ if ( $dbw->affectedRows() == 0 ) {
$reupload = true;
# Collision, this is an update of a file
@@ -905,13 +974,17 @@ class LocalFile extends File {
$action = $reupload ? 'overwrite' : 'upload';
$log->addEntry( $action, $descTitle, $comment, array(), $user );
- if( $descTitle->exists() ) {
+ if ( $descTitle->exists() ) {
# Create a null revision
$latest = $descTitle->getLatestRevID();
- $nullRevision = Revision::newNullRevision( $dbw, $descTitle->getArticleId(),
- $log->getRcComment(), false );
+ $nullRevision = Revision::newNullRevision(
+ $dbw,
+ $descTitle->getArticleId(),
+ $log->getRcComment(),
+ false
+ );
$nullRevision->insertOn( $dbw );
-
+
wfRunHooks( 'NewRevisionFromEditComplete', array( $article, $nullRevision, $latest, $user ) );
$article->updateRevisionOn( $dbw, $nullRevision );
@@ -919,24 +992,33 @@ class LocalFile extends File {
$descTitle->invalidateCache();
$descTitle->purgeSquid();
} else {
- // New file; create the description page.
- // There's already a log entry, so don't make a second RC entry
+ # New file; create the description page.
+ # There's already a log entry, so don't make a second RC entry
+ # Squid and file cache for the description page are purged by doEdit.
$article->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC );
}
- # Hooks, hooks, the magic of hooks...
- wfRunHooks( 'FileUpload', array( $this ) );
-
# Commit the transaction now, in case something goes wrong later
# The most important thing is that files don't get lost, especially archives
$dbw->commit();
+ # Save to cache and purge the squid
+ # We shall not saveToCache before the commit since otherwise
+ # in case of a rollback there is an usable file from memcached
+ # which in fact doesn't really exist (bug 24978)
+ $this->saveToCache();
+
+ # Hooks, hooks, the magic of hooks...
+ wfRunHooks( 'FileUpload', array( $this, $reupload, $descTitle->exists() ) );
+
# Invalidate cache for all pages using this file
$update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
$update->doUpdate();
+
# Invalidate cache for all pages that redirects on this page
$redirs = $this->getTitle()->getRedirectsHere();
- foreach( $redirs as $redir ) {
+
+ foreach ( $redirs as $redir ) {
$update = new HTMLCacheUpdate( $redir, 'imagelinks' );
$update->doUpdate();
}
@@ -946,15 +1028,14 @@ class LocalFile extends File {
/**
* Move or copy a file to its public location. If a file exists at the
- * destination, move it to an archive. Returns the archive name on success
- * or an empty string if it was a new file, and a wikitext-formatted
- * WikiError object on failure.
+ * destination, move it to an archive. Returns a FileRepoStatus object with
+ * the archive name in the "value" member on success.
*
* The archive name should be passed through to recordUpload for database
* registration.
*
- * @param string $sourcePath Local filesystem path to the source image
- * @param integer $flags A bitwise combination of:
+ * @param $srcPath String: local filesystem path to the source image
+ * @param $flags Integer: a bitwise combination of:
* File::DELETE_SOURCE Delete the source file, i.e. move
* rather than copy
* @return FileRepoStatus object. On success, the value member contains the
@@ -962,17 +1043,21 @@ class LocalFile extends File {
*/
function publish( $srcPath, $flags = 0 ) {
$this->lock();
+
$dstRel = $this->getRel();
- $archiveName = gmdate( 'YmdHis' ) . '!'. $this->getName();
+ $archiveName = gmdate( 'YmdHis' ) . '!' . $this->getName();
$archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
$flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
$status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags );
+
if ( $status->value == 'new' ) {
$status->value = '';
} else {
$status->value = $archiveName;
}
+
$this->unlock();
+
return $status;
}
@@ -996,12 +1081,14 @@ class LocalFile extends File {
function move( $target ) {
wfDebugLog( 'imagemove', "Got request to move {$this->name} to " . $target->getText() );
$this->lock();
+
$batch = new LocalFileMoveBatch( $this, $target );
$batch->addCurrent();
$batch->addOlds();
$status = $batch->execute();
wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
+
$this->purgeEverything();
$this->unlock();
@@ -1014,7 +1101,7 @@ class LocalFile extends File {
// Purge the new image
$this->purgeEverything();
}
-
+
return $status;
}
@@ -1032,6 +1119,7 @@ class LocalFile extends File {
*/
function delete( $reason, $suppress = false ) {
$this->lock();
+
$batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
$batch->addCurrent();
@@ -1040,7 +1128,7 @@ class LocalFile extends File {
$result = $dbw->select( 'oldimage',
array( 'oi_archive_name' ),
array( 'oi_name' => $this->getName() ) );
- while ( $row = $dbw->fetchObject( $result ) ) {
+ foreach ( $result as $row ) {
$batch->addOld( $row->oi_archive_name );
}
$status = $batch->execute();
@@ -1053,6 +1141,7 @@ class LocalFile extends File {
}
$this->unlock();
+
return $status;
}
@@ -1064,21 +1153,26 @@ class LocalFile extends File {
*
* Cache purging is done; logging is caller's responsibility.
*
- * @param $reason
- * @param $suppress
+ * @param $archiveName String
+ * @param $reason String
+ * @param $suppress Boolean
* @throws MWException or FSException on database or file store failure
* @return FileRepoStatus object.
*/
- function deleteOld( $archiveName, $reason, $suppress=false ) {
+ function deleteOld( $archiveName, $reason, $suppress = false ) {
$this->lock();
+
$batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
$batch->addOld( $archiveName );
$status = $batch->execute();
+
$this->unlock();
+
if ( $status->ok ) {
$this->purgeDescription();
$this->purgeHistory();
}
+
return $status;
}
@@ -1090,17 +1184,20 @@ class LocalFile extends File {
*
* @param $versions set of record ids of deleted items to restore,
* or empty to restore all revisions.
- * @param $unuppress
+ * @param $unsuppress Boolean
* @return FileRepoStatus
*/
function restore( $versions = array(), $unsuppress = false ) {
$batch = new LocalFileRestoreBatch( $this, $unsuppress );
+
if ( !$versions ) {
$batch->addAll();
} else {
$batch->addIds( $versions );
}
+
$status = $batch->execute();
+
if ( !$status->ok ) {
return $status;
}
@@ -1109,6 +1206,7 @@ class LocalFile extends File {
$cleanupStatus->successCount = 0;
$cleanupStatus->failCount = 0;
$status->merge( $cleanupStatus );
+
return $status;
}
@@ -1174,10 +1272,12 @@ class LocalFile extends File {
*/
function lock() {
$dbw = $this->repo->getMasterDB();
+
if ( !$this->locked ) {
$dbw->begin();
$this->locked++;
}
+
return $dbw->selectField( 'image', '1', array( 'img_name' => $this->getName() ), __METHOD__ );
}
@@ -1205,7 +1305,7 @@ class LocalFile extends File {
}
} // LocalFile class
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
/**
* Helper class for file deletion
@@ -1240,25 +1340,33 @@ class LocalFileDeleteBatch {
unset( $oldRels['.'] );
$deleteCurrent = true;
}
+
return array( $oldRels, $deleteCurrent );
}
/*protected*/ function getHashes() {
$hashes = array();
list( $oldRels, $deleteCurrent ) = $this->getOldRels();
+
if ( $deleteCurrent ) {
$hashes['.'] = $this->file->getSha1();
}
+
if ( count( $oldRels ) ) {
$dbw = $this->file->repo->getMasterDB();
- $res = $dbw->select( 'oldimage', array( 'oi_archive_name', 'oi_sha1' ),
- 'oi_archive_name IN(' . $dbw->makeList( array_keys( $oldRels ) ) . ')',
- __METHOD__ );
- while ( $row = $dbw->fetchObject( $res ) ) {
+ $res = $dbw->select(
+ 'oldimage',
+ array( 'oi_archive_name', 'oi_sha1' ),
+ 'oi_archive_name IN (' . $dbw->makeList( array_keys( $oldRels ) ) . ')',
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
if ( rtrim( $row->oi_sha1, "\0" ) === '' ) {
// Get the hash from the file
$oldUrl = $this->file->getArchiveVirtualUrl( $row->oi_archive_name );
$props = $this->file->repo->getFileProps( $oldUrl );
+
if ( $props['fileExists'] ) {
// Upgrade the oldimage row
$dbw->update( 'oldimage',
@@ -1274,10 +1382,13 @@ class LocalFileDeleteBatch {
}
}
}
+
$missing = array_diff_key( $this->srcRels, $hashes );
+
foreach ( $missing as $name => $rel ) {
$this->status->error( 'filedelete-old-unregistered', $name );
}
+
foreach ( $hashes as $name => $hash ) {
if ( !$hash ) {
$this->status->error( 'filedelete-missing', $this->srcRels[$name] );
@@ -1290,6 +1401,7 @@ class LocalFileDeleteBatch {
function doDBInserts() {
global $wgUser;
+
$dbw = $this->file->repo->getMasterDB();
$encTimestamp = $dbw->addQuotes( $dbw->timestamp() );
$encUserId = $dbw->addQuotes( $wgUser->getId() );
@@ -1377,6 +1489,7 @@ class LocalFileDeleteBatch {
function doDBDeletes() {
$dbw = $this->file->repo->getMasterDB();
list( $oldRels, $deleteCurrent ) = $this->getOldRels();
+
if ( count( $oldRels ) ) {
$dbw->delete( 'oldimage',
array(
@@ -1384,6 +1497,7 @@ class LocalFileDeleteBatch {
'oi_archive_name' => array_keys( $oldRels )
), __METHOD__ );
}
+
if ( $deleteCurrent ) {
$dbw->delete( 'image', array( 'img_name' => $this->file->getName() ), __METHOD__ );
}
@@ -1401,14 +1515,16 @@ class LocalFileDeleteBatch {
$privateFiles = array();
list( $oldRels, $deleteCurrent ) = $this->getOldRels();
$dbw = $this->file->repo->getMasterDB();
- if( !empty( $oldRels ) ) {
+
+ if ( !empty( $oldRels ) ) {
$res = $dbw->select( 'oldimage',
array( 'oi_archive_name' ),
array( 'oi_name' => $this->file->getName(),
- 'oi_archive_name IN (' . $dbw->makeList( array_keys($oldRels) ) . ')',
- $dbw->bitAnd('oi_deleted', File::DELETED_FILE) => File::DELETED_FILE ),
+ 'oi_archive_name IN (' . $dbw->makeList( array_keys( $oldRels ) ) . ')',
+ $dbw->bitAnd( 'oi_deleted', File::DELETED_FILE ) => File::DELETED_FILE ),
__METHOD__ );
- while( $row = $dbw->fetchObject( $res ) ) {
+
+ foreach ( $res as $row ) {
$privateFiles[$row->oi_archive_name] = 1;
}
}
@@ -1417,6 +1533,7 @@ class LocalFileDeleteBatch {
$this->deletionBatch = array();
$ext = $this->file->getExtension();
$dotExt = $ext === '' ? '' : ".$ext";
+
foreach ( $this->srcRels as $name => $srcRel ) {
// Skip files that have no hash (missing source).
// Keep private files where they are.
@@ -1441,6 +1558,7 @@ class LocalFileDeleteBatch {
// Execute the file deletion batch
$status = $this->file->repo->deleteBatch( $this->deletionBatch );
+
if ( !$status->isGood() ) {
$this->status->merge( $status );
}
@@ -1457,6 +1575,7 @@ class LocalFileDeleteBatch {
// Purge squid
if ( $wgUseSquid ) {
$urls = array();
+
foreach ( $this->srcRels as $srcRel ) {
$urlRel = str_replace( '%2F', '/', rawurlencode( $srcRel ) );
$urls[] = $this->file->repo->getZoneUrl( 'public' ) . '/' . $urlRel;
@@ -1470,6 +1589,7 @@ class LocalFileDeleteBatch {
// Commit and return
$this->file->unlock();
wfProfileOut( __METHOD__ );
+
return $this->status;
}
@@ -1478,19 +1598,25 @@ class LocalFileDeleteBatch {
*/
function removeNonexistentFiles( $batch ) {
$files = $newBatch = array();
- foreach( $batch as $batchItem ) {
+
+ foreach ( $batch as $batchItem ) {
list( $src, $dest ) = $batchItem;
$files[$src] = $this->file->repo->getVirtualUrl( 'public' ) . '/' . rawurlencode( $src );
}
+
$result = $this->file->repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
- foreach( $batch as $batchItem )
- if( $result[$batchItem[0]] )
+
+ foreach ( $batch as $batchItem ) {
+ if ( $result[$batchItem[0]] ) {
$newBatch[] = $batchItem;
+ }
+ }
+
return $newBatch;
}
}
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
/**
* Helper class for file undeletion
@@ -1536,6 +1662,7 @@ class LocalFileRestoreBatch {
*/
function execute() {
global $wgLang;
+
if ( !$this->all && !$this->ids ) {
// Do nothing
return $this->file->repo->newGood();
@@ -1548,7 +1675,8 @@ class LocalFileRestoreBatch {
// Fetch all or selected archived revisions for the file,
// sorted from the most recent to the oldest.
$conditions = array( 'fa_name' => $this->file->getName() );
- if( !$this->all ) {
+
+ if ( !$this->all ) {
$conditions[] = 'fa_id IN (' . $dbw->makeList( $this->ids ) . ')';
}
@@ -1565,7 +1693,8 @@ class LocalFileRestoreBatch {
$deleteIds = array();
$first = true;
$archiveNames = array();
- while( $row = $dbw->fetchObject( $result ) ) {
+
+ foreach ( $result as $row ) {
$idsPresent[] = $row->fa_id;
if ( $row->fa_name != $this->file->getName() ) {
@@ -1573,6 +1702,7 @@ class LocalFileRestoreBatch {
$status->failCount++;
continue;
}
+
if ( $row->fa_storage_key == '' ) {
// Revision was missing pre-deletion
$status->error( 'undelete-bad-store-key', $wgLang->timeanddate( $row->fa_timestamp ) );
@@ -1584,12 +1714,13 @@ class LocalFileRestoreBatch {
$deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
$sha1 = substr( $row->fa_storage_key, 0, strcspn( $row->fa_storage_key, '.' ) );
+
# Fix leading zero
if ( strlen( $sha1 ) == 32 && $sha1[0] == '0' ) {
$sha1 = substr( $sha1, 1 );
}
- if( is_null( $row->fa_major_mime ) || $row->fa_major_mime == 'unknown'
+ if ( is_null( $row->fa_major_mime ) || $row->fa_major_mime == 'unknown'
|| is_null( $row->fa_minor_mime ) || $row->fa_minor_mime == 'unknown'
|| is_null( $row->fa_media_type ) || $row->fa_media_type == 'UNKNOWN'
|| is_null( $row->fa_metadata ) ) {
@@ -1624,23 +1755,27 @@ class LocalFileRestoreBatch {
'img_timestamp' => $row->fa_timestamp,
'img_sha1' => $sha1
);
+
// The live (current) version cannot be hidden!
- if( !$this->unsuppress && $row->fa_deleted ) {
+ if ( !$this->unsuppress && $row->fa_deleted ) {
$storeBatch[] = array( $deletedUrl, 'public', $destRel );
$this->cleanupBatch[] = $row->fa_storage_key;
}
} else {
$archiveName = $row->fa_archive_name;
- if( $archiveName == '' ) {
+
+ if ( $archiveName == '' ) {
// This was originally a current version; we
// have to devise a new archive name for it.
// Format is <timestamp of archiving>!<name>
$timestamp = wfTimestamp( TS_UNIX, $row->fa_deleted_timestamp );
+
do {
$archiveName = wfTimestamp( TS_MW, $timestamp ) . '!' . $row->fa_name;
$timestamp++;
} while ( isset( $archiveNames[$archiveName] ) );
}
+
$archiveNames[$archiveName] = true;
$destRel = $this->file->getArchiveRel( $archiveName );
$insertBatch[] = array(
@@ -1663,19 +1798,23 @@ class LocalFileRestoreBatch {
}
$deleteIds[] = $row->fa_id;
- if( !$this->unsuppress && $row->fa_deleted & File::DELETED_FILE ) {
+
+ if ( !$this->unsuppress && $row->fa_deleted & File::DELETED_FILE ) {
// private files can stay where they are
$status->successCount++;
} else {
$storeBatch[] = array( $deletedUrl, 'public', $destRel );
$this->cleanupBatch[] = $row->fa_storage_key;
}
+
$first = false;
}
+
unset( $result );
// Add a warning to the status object for missing IDs
$missingIds = array_diff( $this->ids, $idsPresent );
+
foreach ( $missingIds as $id ) {
$status->error( 'undelete-missing-filearchive', $id );
}
@@ -1692,6 +1831,7 @@ class LocalFileRestoreBatch {
// Store batch returned a critical error -- this usually means nothing was stored
// Stop now and return an error
$this->file->unlock();
+
return $status;
}
@@ -1704,9 +1844,11 @@ class LocalFileRestoreBatch {
if ( $insertCurrent ) {
$dbw->insert( 'image', $insertCurrent, __METHOD__ );
}
+
if ( $insertBatch ) {
$dbw->insert( 'oldimage', $insertBatch, __METHOD__ );
}
+
if ( $deleteIds ) {
$dbw->delete( 'filearchive',
array( 'fa_id IN (' . $dbw->makeList( $deleteIds ) . ')' ),
@@ -1714,8 +1856,8 @@ class LocalFileRestoreBatch {
}
// If store batch is empty (all files are missing), deletion is to be considered successful
- if( $status->successCount > 0 || !$storeBatch ) {
- if( !$exists ) {
+ if ( $status->successCount > 0 || !$storeBatch ) {
+ if ( !$exists ) {
wfDebug( __METHOD__ . " restored {$status->successCount} items, creating a new current\n" );
// Update site_stats
@@ -1729,7 +1871,9 @@ class LocalFileRestoreBatch {
$this->file->purgeHistory();
}
}
+
$this->file->unlock();
+
return $status;
}
@@ -1738,12 +1882,17 @@ class LocalFileRestoreBatch {
*/
function removeNonexistentFiles( $triplets ) {
$files = $filteredTriplets = array();
- foreach( $triplets as $file )
+ foreach ( $triplets as $file )
$files[$file[0]] = $file[0];
+
$result = $this->file->repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
- foreach( $triplets as $file )
- if( $result[$file[0]] )
+
+ foreach ( $triplets as $file ) {
+ if ( $result[$file[0]] ) {
$filteredTriplets[] = $file;
+ }
+ }
+
return $filteredTriplets;
}
@@ -1753,15 +1902,20 @@ class LocalFileRestoreBatch {
function removeNonexistentFromCleanup( $batch ) {
$files = $newBatch = array();
$repo = $this->file->repo;
- foreach( $batch as $file ) {
+
+ foreach ( $batch as $file ) {
$files[$file] = $repo->getVirtualUrl( 'deleted' ) . '/' .
rawurlencode( $repo->getDeletedHashPath( $file ) . $file );
}
$result = $repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
- foreach( $batch as $file )
- if( $result[$file] )
+
+ foreach ( $batch as $file ) {
+ if ( $result[$file] ) {
$newBatch[] = $file;
+ }
+ }
+
return $newBatch;
}
@@ -1773,13 +1927,16 @@ class LocalFileRestoreBatch {
if ( !$this->cleanupBatch ) {
return $this->file->repo->newGood();
}
+
$this->cleanupBatch = $this->removeNonexistentFromCleanup( $this->cleanupBatch );
+
$status = $this->file->repo->cleanupDeletedBatch( $this->cleanupBatch );
+
return $status;
}
}
-#------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
/**
* Helper class for file movement
@@ -1820,29 +1977,35 @@ class LocalFileMoveBatch {
array( 'oi_name' => $this->oldName ),
__METHOD__
);
- while( $row = $this->db->fetchObject( $result ) ) {
+
+ foreach ( $result as $row ) {
$oldName = $row->oi_archive_name;
$bits = explode( '!', $oldName, 2 );
- if( count( $bits ) != 2 ) {
+
+ if ( count( $bits ) != 2 ) {
wfDebug( "Invalid old file name: $oldName \n" );
continue;
}
+
list( $timestamp, $filename ) = $bits;
- if( $this->oldName != $filename ) {
+
+ if ( $this->oldName != $filename ) {
wfDebug( "Invalid old file name: $oldName \n" );
continue;
}
+
$this->oldCount++;
+
// Do we want to add those to oldCount?
- if( $row->oi_deleted & File::DELETED_FILE ) {
+ if ( $row->oi_deleted & File::DELETED_FILE ) {
continue;
}
+
$this->olds[] = array(
"{$archiveBase}/{$this->oldHash}{$oldName}",
"{$archiveBase}/{$this->newHash}{$timestamp}!{$this->newName}"
);
}
- $this->db->freeResult( $result );
}
/**
@@ -1858,19 +2021,23 @@ class LocalFileMoveBatch {
wfDebugLog( 'imagemove', "Renamed {$this->file->name} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
$statusMove = $repo->storeBatch( $triplets, FSRepo::DELETE_SOURCE );
wfDebugLog( 'imagemove', "Moved files for {$this->file->name}: {$statusMove->successCount} successes, {$statusMove->failCount} failures" );
- if( !$statusMove->isOk() ) {
+
+ if ( !$statusMove->isOk() ) {
wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
$this->db->rollback();
}
$status->merge( $statusDb );
$status->merge( $statusMove );
+
return $status;
}
/**
- * Do the database updates and return a new WikiError indicating how many
- * rows where updated.
+ * Do the database updates and return a new FileRepoStatus indicating how
+ * many rows where updated.
+ *
+ * @return FileRepoStatus
*/
function doDBUpdates() {
$repo = $this->file->repo;
@@ -1878,13 +2045,14 @@ class LocalFileMoveBatch {
$dbw = $this->db;
// Update current image
- $dbw->update(
+ $dbw->update(
'image',
array( 'img_name' => $this->newName ),
array( 'img_name' => $this->oldName ),
__METHOD__
);
- if( $dbw->affectedRows() ) {
+
+ if ( $dbw->affectedRows() ) {
$status->successCount++;
} else {
$status->failCount++;
@@ -1895,11 +2063,12 @@ 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__
);
+
$affected = $dbw->affectedRows();
$total = $this->oldCount;
$status->successCount += $affected;
@@ -1910,34 +2079,42 @@ class LocalFileMoveBatch {
/**
* Generate triplets for FSRepo::storeBatch().
- */
+ */
function getMoveTriplets() {
$moves = array_merge( array( $this->cur ), $this->olds );
$triplets = array(); // The format is: (srcUrl, destZone, destUrl)
- foreach( $moves as $move ) {
+
+ foreach ( $moves as $move ) {
// $move: (oldRelativePath, newRelativePath)
$srcUrl = $this->file->repo->getVirtualUrl() . '/public/' . rawurlencode( $move[0] );
$triplets[] = array( $srcUrl, 'public', $move[1] );
wfDebugLog( 'imagemove', "Generated move triplet for {$this->file->name}: {$srcUrl} :: public :: {$move[1]}" );
}
+
return $triplets;
}
/**
* Removes non-existent files from move batch.
- */
+ */
function removeNonexistentFiles( $triplets ) {
$files = array();
- foreach( $triplets as $file )
+
+ foreach ( $triplets as $file ) {
$files[$file[0]] = $file[0];
+ }
+
$result = $this->file->repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
$filteredTriplets = array();
- foreach( $triplets as $file )
- if( $result[$file[0]] ) {
+
+ foreach ( $triplets as $file ) {
+ if ( $result[$file[0]] ) {
$filteredTriplets[] = $file;
} else {
wfDebugLog( 'imagemove', "File {$file[0]} does not exist" );
}
+ }
+
return $filteredTriplets;
}
}
diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php
index 6c4d21a2..02883c53 100644
--- a/includes/filerepo/LocalRepo.php
+++ b/includes/filerepo/LocalRepo.php
@@ -1,12 +1,22 @@
<?php
/**
+ * Local repository that stores files in the local filesystem and registers them
+ * in the wiki's own database.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
+
+/**
* A repository that stores files in the local filesystem and registers them
* in the wiki's own database. This is the most commonly used repository class.
* @ingroup FileRepo
*/
class LocalRepo extends FSRepo {
var $fileFactory = array( 'LocalFile', 'newFromTitle' );
+ var $fileFactoryKey = array( 'LocalFile', 'newFromKey' );
var $oldFileFactory = array( 'OldLocalFile', 'newFromTitle' );
+ var $oldFileFactoryKey = array( 'OldLocalFile', 'newFromKey' );
var $fileFromRowFactory = array( 'LocalFile', 'newFromRow' );
var $oldFileFromRowFactory = array( 'OldLocalFile', 'newFromRow' );
@@ -71,7 +81,7 @@ class LocalRepo extends FSRepo {
/**
* Checks if there is a redirect named as $title
*
- * @param Title $title Title of image
+ * @param $title Title of file
*/
function checkRedirect( $title ) {
global $wgMemc;
@@ -156,9 +166,11 @@ class LocalRepo extends FSRepo {
);
$result = array();
- while ( $row = $res->fetchObject() )
+ foreach ( $res as $row ) {
$result[] = $this->newFileFromRow( $row );
+ }
$res->free();
+
return $result;
}
@@ -189,8 +201,8 @@ class LocalRepo extends FSRepo {
/**
* Invalidates image redirect cache related to that image
*
- * @param Title $title Title of image
- */
+ * @param $title Title of page
+ */
function invalidateImageRedirect( $title ) {
global $wgMemc;
$memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
diff --git a/includes/filerepo/NullRepo.php b/includes/filerepo/NullRepo.php
index 2bc61bde..d5a1ee03 100644
--- a/includes/filerepo/NullRepo.php
+++ b/includes/filerepo/NullRepo.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * File repository with no files.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* File repository with no files, for performance testing
diff --git a/includes/filerepo/OldLocalFile.php b/includes/filerepo/OldLocalFile.php
index 35f3f9f2..9efe998f 100644
--- a/includes/filerepo/OldLocalFile.php
+++ b/includes/filerepo/OldLocalFile.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Old file in the in the oldimage table
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* Class to represent a file in the oldimage table
@@ -30,14 +36,12 @@ class OldLocalFile extends LocalFile {
}
static function newFromKey( $sha1, $repo, $timestamp = false ) {
- # Polymorphic function name to distinguish foreign and local fetches
- $fname = get_class( $this ) . '::' . __FUNCTION__;
-
$conds = array( 'oi_sha1' => $sha1 );
if( $timestamp ) {
$conds['oi_timestamp'] = $timestamp;
}
- $row = $dbr->selectRow( 'oldimage', $this->getCacheFields( 'oi_' ), $conds, $fname );
+ $dbr = $repo->getSlaveDB();
+ $row = $dbr->selectRow( 'oldimage', self::selectFields(), $conds, __METHOD__ );
if( $row ) {
return self::newFromRow( $row, $repo );
} else {
@@ -70,10 +74,10 @@ class OldLocalFile extends LocalFile {
}
/**
- * @param Title $title
- * @param FileRepo $repo
- * @param string $time Timestamp or null to load by archive name
- * @param string $archiveName Archive name or null to load by timestamp
+ * @param $title Title
+ * @param $repo FileRepo
+ * @param $time String: timestamp or null to load by archive name
+ * @param $archiveName String: archive name or null to load by timestamp
*/
function __construct( $title, $repo, $time, $archiveName ) {
parent::__construct( $title, $repo );
@@ -135,7 +139,7 @@ class OldLocalFile extends LocalFile {
}
function getUrlRel() {
- return 'archive/' . $this->getHashPath() . urlencode( $this->getArchiveName() );
+ return 'archive/' . $this->getHashPath() . rawurlencode( $this->getArchiveName() );
}
function upgradeRow() {
@@ -172,8 +176,8 @@ class OldLocalFile extends LocalFile {
}
/**
- * int $field one of DELETED_* bitfield constants
- * for file or revision rows
+ * @param $field Integer: one of DELETED_* bitfield constants
+ * for file or revision rows
* @return bool
*/
function isDeleted( $field ) {
@@ -193,7 +197,8 @@ class OldLocalFile extends LocalFile {
/**
* Determine if the current user is allowed to view a particular
* field of this image file, if it's marked as deleted.
- * @param int $field
+ *
+ * @param $field Integer
* @return bool
*/
function userCan( $field ) {
diff --git a/includes/filerepo/RepoGroup.php b/includes/filerepo/RepoGroup.php
index 1465400c..b9996941 100644
--- a/includes/filerepo/RepoGroup.php
+++ b/includes/filerepo/RepoGroup.php
@@ -1,14 +1,19 @@
<?php
/**
- * @defgroup FileRepo FileRepo
+ * Prioritized list of file repositories
*
* @file
* @ingroup FileRepo
*/
/**
- * @ingroup FileRepo
+ * @defgroup FileRepo FileRepo
+ */
+
+/**
* Prioritized list of file repositories
+ *
+ * @ingroup FileRepo
*/
class RepoGroup {
var $localRepo, $foreignRepos, $reposInitialised = false;
@@ -48,7 +53,9 @@ class RepoGroup {
/**
* Construct a group of file repositories.
- * @param array $data Array of repository info arrays.
+ *
+ * @param $localInfo Associative array for local repo's info
+ * @param $foreignInfo Array of repository info arrays.
* Each info array is an associative array with the 'class' member
* giving the class name. The entire array is passed to the repository
* constructor as the first parameter.
@@ -62,7 +69,8 @@ class RepoGroup {
/**
* Search repositories for an image.
* You can also use wfFindFile() to do this.
- * @param mixed $title Title object or string
+ *
+ * @param $title Mixed: Title object or string
* @param $options Associative array of options:
* time: requested time for an archived image, or false for the
* current version. An image object will be returned which was
@@ -92,10 +100,15 @@ class RepoGroup {
}
}
+ if ( $title->getNamespace() != NS_MEDIA && $title->getNamespace() != NS_FILE ) {
+ throw new MWException( __METHOD__ . ' recieved an Title object with incorrect namespace' );
+ }
+
# Check the cache
if ( empty( $options['ignoreRedirect'] )
&& empty( $options['private'] )
- && empty( $options['bypassCache'] ) )
+ && empty( $options['bypassCache'] )
+ && $title->getNamespace() == NS_FILE )
{
$useCache = true;
$time = isset( $options['time'] ) ? $options['time'] : '';
@@ -224,7 +237,7 @@ class RepoGroup {
if ( !$this->reposInitialised ) {
$this->initialiseRepos();
}
- foreach ( $this->foreignRepos as $key => $repo ) {
+ foreach ( $this->foreignRepos as $repo ) {
if ( $repo->name == $name)
return $repo;
}
@@ -243,8 +256,8 @@ class RepoGroup {
* Call a function for each foreign repo, with the repo object as the
* first parameter.
*
- * @param $callback callback The function to call
- * @param $params array Optional additional parameters to pass to the function
+ * @param $callback Callback: the function to call
+ * @param $params Array: optional additional parameters to pass to the function
*/
function forEachForeignRepo( $callback, $params = array() ) {
foreach( $this->foreignRepos as $repo ) {
@@ -258,7 +271,7 @@ class RepoGroup {
/**
* Does the installation have any foreign repos set up?
- * @return bool
+ * @return Boolean
*/
function hasForeignRepos() {
return (bool)$this->foreignRepos;
diff --git a/includes/filerepo/UnregisteredLocalFile.php b/includes/filerepo/UnregisteredLocalFile.php
index 6f63cb0b..990a218c 100644
--- a/includes/filerepo/UnregisteredLocalFile.php
+++ b/includes/filerepo/UnregisteredLocalFile.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * File without associated database record
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* A file object referring to either a standalone local file, or a file in a
@@ -94,7 +100,7 @@ class UnregisteredLocalFile extends File {
function getURL() {
if ( $this->repo ) {
- return $this->repo->getZoneUrl( 'public' ) . '/' . $this->repo->getHashPath( $this->name ) . urlencode( $this->name );
+ return $this->repo->getZoneUrl( 'public' ) . '/' . $this->repo->getHashPath( $this->name ) . rawurlencode( $this->name );
} else {
return false;
}
diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php
new file mode 100644
index 00000000..9e8fb2c5
--- /dev/null
+++ b/includes/installer/CliInstaller.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * Core installer command line interface.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for the core installer command line interface.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class CliInstaller extends Installer {
+
+ private $optionMap = array(
+ 'dbtype' => 'wgDBtype',
+ 'dbserver' => 'wgDBserver',
+ 'dbname' => 'wgDBname',
+ 'dbuser' => 'wgDBuser',
+ 'dbpass' => 'wgDBpassword',
+ 'dbprefix' => 'wgDBprefix',
+ 'dbtableoptions' => 'wgDBTableOptions',
+ 'dbmysql5' => 'wgDBmysql5',
+ 'dbserver' => 'wgDBserver',
+ 'dbport' => 'wgDBport',
+ 'dbname' => 'wgDBname',
+ 'dbuser' => 'wgDBuser',
+ 'dbpass' => 'wgDBpassword',
+ 'dbschema' => 'wgDBmwschema',
+ 'dbpath' => 'wgSQLiteDataDir',
+ 'scriptpath' => 'wgScriptPath',
+ );
+
+ /**
+ * Constructor.
+ *
+ * @param $siteName
+ * @param $admin
+ * @param $option Array
+ */
+ function __construct( $siteName, $admin = null, array $option = array() ) {
+ global $wgContLang;
+
+ parent::__construct();
+
+ foreach ( $this->optionMap as $opt => $global ) {
+ if ( isset( $option[$opt] ) ) {
+ $GLOBALS[$global] = $option[$opt];
+ $this->setVar( $global, $option[$opt] );
+ }
+ }
+
+ if ( isset( $option['lang'] ) ) {
+ global $wgLang, $wgLanguageCode;
+ $this->setVar( '_UserLang', $option['lang'] );
+ $wgContLang = Language::factory( $option['lang'] );
+ $wgLang = Language::factory( $option['lang'] );
+ $wgLanguageCode = $option['lang'];
+ }
+
+ $this->setVar( 'wgSitename', $siteName );
+
+ $metaNS = $wgContLang->ucfirst( str_replace( ' ', '_', $siteName ) );
+ if ( $metaNS == 'MediaWiki' ) {
+ $metaNS = 'Project';
+ }
+ $this->setVar( 'wgMetaNamespace', $metaNS );
+
+ if ( $admin ) {
+ $this->setVar( '_AdminName', $admin );
+ }
+
+ if ( !isset( $option['installdbuser'] ) ) {
+ $this->setVar( '_InstallUser',
+ $this->getVar( 'wgDBuser' ) );
+ $this->setVar( '_InstallPassword',
+ $this->getVar( 'wgDBpassword' ) );
+ } else {
+ $this->setVar( '_InstallUser',
+ $option['installdbuser'] );
+ $this->setVar( '_InstallPassword',
+ $option['installdbpass'] );
+ }
+
+ if ( isset( $option['pass'] ) ) {
+ $this->setVar( '_AdminPassword', $option['pass'] );
+ }
+ }
+
+ /**
+ * Main entry point.
+ */
+ public function execute() {
+ $vars = Installer::getExistingLocalSettings();
+ if( $vars ) {
+ $this->showStatusMessage(
+ Status::newFatal( "config-localsettings-cli-upgrade" )
+ );
+ }
+
+ $this->performInstallation(
+ array( $this, 'startStage' ),
+ array( $this, 'endStage' )
+ );
+ }
+
+ /**
+ * Write LocalSettings.php to a given path
+ *
+ * @param $path String Full path to write LocalSettings.php to
+ */
+ public function writeConfigurationFile( $path ) {
+ $ls = new LocalSettingsGenerator( $this );
+ $ls->writeFile( "$path/LocalSettings.php" );
+ }
+
+ public function startStage( $step ) {
+ $this->showMessage( "config-install-$step" );
+ }
+
+ public function endStage( $step, $status ) {
+ $this->showStatusMessage( $status );
+ $this->showMessage( 'config-install-step-done' );
+ }
+
+ public function showMessage( $msg /*, ... */ ) {
+ echo $this->getMessageText( func_get_args() ) . "\n";
+ flush();
+ }
+
+ public function showError( $msg /*, ... */ ) {
+ echo "***{$this->getMessageText( func_get_args() )}***\n";
+ flush();
+ }
+
+ /**
+ * @return string
+ */
+ protected function getMessageText( $params ) {
+ $msg = array_shift( $params );
+
+ $text = wfMsgExt( $msg, array( 'parseinline' ), $params );
+
+ $text = preg_replace( '/<a href="(.*?)".*?>(.*?)<\/a>/', '$2 &lt;$1&gt;', $text );
+ return html_entity_decode( strip_tags( $text ), ENT_QUOTES );
+ }
+
+ /**
+ * Dummy
+ */
+ public function showHelpBox( $msg /*, ... */ ) {
+ }
+
+ public function showStatusMessage( Status $status ) {
+ $warnings = array_merge( $status->getWarningsArray(),
+ $status->getErrorsArray() );
+
+ if ( count( $warnings ) !== 0 ) {
+ foreach ( $warnings as $w ) {
+ call_user_func_array( array( $this, 'showMessage' ), $w );
+ }
+ }
+
+ if ( !$status->isOk() ) {
+ echo "\n";
+ exit;
+ }
+ }
+}
diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php
new file mode 100644
index 00000000..0da24f8e
--- /dev/null
+++ b/includes/installer/DatabaseInstaller.php
@@ -0,0 +1,580 @@
+<?php
+/**
+ * DBMS-specific installation helper.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Base class for DBMS-specific installation helper classes.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+abstract class DatabaseInstaller {
+
+ /**
+ * The Installer object.
+ *
+ * TODO: naming this parent is confusing, 'installer' would be clearer.
+ *
+ * @var WebInstaller
+ */
+ public $parent;
+
+ /**
+ * The database connection.
+ *
+ * @var DatabaseBase
+ */
+ public $db = null;
+
+ /**
+ * Internal variables for installation.
+ *
+ * @var array
+ */
+ protected $internalDefaults = array();
+
+ /**
+ * Array of MW configuration globals this class uses.
+ *
+ * @var array
+ */
+ protected $globalNames = array();
+
+ /**
+ * Return the internal name, e.g. 'mysql', or 'sqlite'.
+ */
+ public abstract function getName();
+
+ /**
+ * @return true if the client library is compiled in.
+ */
+ public abstract function isCompiled();
+
+ /**
+ * Get HTML for a web form that configures this database. Configuration
+ * at this time should be the minimum needed to connect and test
+ * whether install or upgrade is required.
+ *
+ * If this is called, $this->parent can be assumed to be a WebInstaller.
+ */
+ public abstract function getConnectForm();
+
+ /**
+ * Set variables based on the request array, assuming it was submitted
+ * via the form returned by getConnectForm(). Validate the connection
+ * settings by attempting to connect with them.
+ *
+ * If this is called, $this->parent can be assumed to be a WebInstaller.
+ *
+ * @return Status
+ */
+ public abstract function submitConnectForm();
+
+ /**
+ * Get HTML for a web form that retrieves settings used for installation.
+ * $this->parent can be assumed to be a WebInstaller.
+ * If the DB type has no settings beyond those already configured with
+ * getConnectForm(), this should return false.
+ */
+ public function getSettingsForm() {
+ return false;
+ }
+
+ /**
+ * Set variables based on the request array, assuming it was submitted via
+ * the form return by getSettingsForm().
+ *
+ * @return Status
+ */
+ public function submitSettingsForm() {
+ return Status::newGood();
+ }
+
+ /**
+ * Open a connection to the database using the administrative user/password
+ * currently defined in the session, without any caching. Returns a status
+ * object. On success, the status object will contain a Database object in
+ * its value member.
+ *
+ * @return Status
+ */
+ public abstract function openConnection();
+
+ /**
+ * Create the database and return a Status object indicating success or
+ * failure.
+ *
+ * @return Status
+ */
+ public abstract function setupDatabase();
+
+ /**
+ * Connect to the database using the administrative user/password currently
+ * defined in the session. Returns a status object. On success, the status
+ * object will contain a Database object in its value member.
+ *
+ * This will return a cached connection if one is available.
+ *
+ * @return Status
+ */
+ public function getConnection() {
+ if ( $this->db ) {
+ return Status::newGood( $this->db );
+ }
+
+ $status = $this->openConnection();
+ if ( $status->isOK() ) {
+ $this->db = $status->value;
+ // Enable autocommit
+ $this->db->clearFlag( DBO_TRX );
+ $this->db->commit();
+ }
+ return $status;
+ }
+
+ /**
+ * Create database tables from scratch.
+ *
+ * @return Status
+ */
+ public function createTables() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $this->db->selectDB( $this->getVar( 'wgDBname' ) );
+
+ if( $this->db->tableExists( 'user' ) ) {
+ $status->warning( 'config-install-tables-exist' );
+ $this->enableLB();
+ return $status;
+ }
+
+ $this->db->setFlag( DBO_DDLMODE ); // For Oracle's handling of schema files
+ $this->db->begin( __METHOD__ );
+
+ $error = $this->db->sourceFile( $this->db->getSchema() );
+ if( $error !== true ) {
+ $this->db->reportQueryError( $error, 0, '', __METHOD__ );
+ $this->db->rollback( __METHOD__ );
+ $status->fatal( 'config-install-tables-failed', $error );
+ } else {
+ $this->db->commit( __METHOD__ );
+ }
+ // Resume normal operations
+ if( $status->isOk() ) {
+ $this->enableLB();
+ }
+ return $status;
+ }
+
+ /**
+ * Create the tables for each extension the user enabled
+ * @return Status
+ */
+ public function createExtensionTables() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $updater = DatabaseUpdater::newForDB( $this->db );
+ $extensionUpdates = $updater->getNewExtensions();
+
+ $ourExtensions = array_map( 'strtolower', $this->getVar( '_Extensions' ) );
+
+ foreach( $ourExtensions as $ext ) {
+ if( isset( $extensionUpdates[$ext] ) ) {
+ $this->db->begin( __METHOD__ );
+ $error = $this->db->sourceFile( $extensionUpdates[$ext] );
+ if( $error !== true ) {
+ $this->db->rollback( __METHOD__ );
+ $status->warning( 'config-install-tables-failed', $error );
+ } else {
+ $this->db->commit( __METHOD__ );
+ }
+ }
+ }
+
+ // Now run updates to create tables for old extensions
+ $updater->doUpdates( array( 'extensions' ) );
+
+ return $status;
+ }
+
+ /**
+ * Get the DBMS-specific options for LocalSettings.php generation.
+ *
+ * @return String
+ */
+ public abstract function getLocalSettings();
+
+ /**
+ * Override this to provide DBMS-specific schema variables, to be
+ * substituted into tables.sql and other schema files.
+ */
+ public function getSchemaVars() {
+ return array();
+ }
+
+ /**
+ * Set appropriate schema variables in the current database connection.
+ *
+ * This should be called after any request data has been imported, but before
+ * any write operations to the database.
+ */
+ public function setupSchemaVars() {
+ $status = $this->getConnection();
+ if ( $status->isOK() ) {
+ $status->value->setSchemaVars( $this->getSchemaVars() );
+ } else {
+ throw new MWException( __METHOD__.': unexpected DB connection error' );
+ }
+ }
+
+ /**
+ * Set up LBFactory so that wfGetDB() etc. works.
+ * We set up a special LBFactory instance which returns the current
+ * installer connection.
+ */
+ public function enableLB() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ throw new MWException( __METHOD__.': unexpected DB connection error' );
+ }
+ LBFactory::setInstance( new LBFactory_Single( array(
+ 'connection' => $status->value ) ) );
+ }
+
+ /**
+ * Perform database upgrades
+ *
+ * @return Boolean
+ */
+ public function doUpgrade() {
+ $this->setupSchemaVars();
+ $this->enableLB();
+
+ $ret = true;
+ ob_start( array( $this, 'outputHandler' ) );
+ try {
+ $up = DatabaseUpdater::newForDB( $this->db );
+ $up->doUpdates();
+ } catch ( MWException $e ) {
+ echo "\nAn error occured:\n";
+ echo $e->getText();
+ $ret = false;
+ }
+ ob_end_flush();
+ return $ret;
+ }
+
+ /**
+ * Allow DB installers a chance to make last-minute changes before installation
+ * occurs. This happens before setupDatabase() or createTables() is called, but
+ * long after the constructor. Helpful for things like modifying setup steps :)
+ */
+ public function preInstall() {
+
+ }
+
+ /**
+ * Allow DB installers a chance to make checks before upgrade.
+ */
+ public function preUpgrade() {
+
+ }
+
+ /**
+ * Get an array of MW configuration globals that will be configured by this class.
+ */
+ public function getGlobalNames() {
+ return $this->globalNames;
+ }
+
+ /**
+ * Construct and initialise parent.
+ * This is typically only called from Installer::getDBInstaller()
+ */
+ public function __construct( $parent ) {
+ $this->parent = $parent;
+ }
+
+ /**
+ * Convenience function.
+ * Check if a named extension is present.
+ *
+ * @see wfDl
+ */
+ protected static function checkExtension( $name ) {
+ wfSuppressWarnings();
+ $compiled = wfDl( $name );
+ wfRestoreWarnings();
+ return $compiled;
+ }
+
+ /**
+ * Get the internationalised name for this DBMS.
+ */
+ public function getReadableName() {
+ return wfMsg( 'config-type-' . $this->getName() );
+ }
+
+ /**
+ * Get a name=>value map of MW configuration globals that overrides.
+ * DefaultSettings.php
+ */
+ public function getGlobalDefaults() {
+ return array();
+ }
+
+ /**
+ * Get a name=>value map of internal variables used during installation.
+ */
+ public function getInternalDefaults() {
+ return $this->internalDefaults;
+ }
+
+ /**
+ * Get a variable, taking local defaults into account.
+ */
+ public function getVar( $var, $default = null ) {
+ $defaults = $this->getGlobalDefaults();
+ $internal = $this->getInternalDefaults();
+ if ( isset( $defaults[$var] ) ) {
+ $default = $defaults[$var];
+ } elseif ( isset( $internal[$var] ) ) {
+ $default = $internal[$var];
+ }
+ return $this->parent->getVar( $var, $default );
+ }
+
+ /**
+ * Convenience alias for $this->parent->setVar()
+ */
+ public function setVar( $name, $value ) {
+ $this->parent->setVar( $name, $value );
+ }
+
+ /**
+ * Get a labelled text box to configure a local variable.
+ */
+ public function getTextBox( $var, $label, $attribs = array(), $helpData = "" ) {
+ $name = $this->getName() . '_' . $var;
+ $value = $this->getVar( $var );
+ if ( !isset( $attribs ) ) {
+ $attribs = array();
+ }
+ return $this->parent->getTextBox( array(
+ 'var' => $var,
+ 'label' => $label,
+ 'attribs' => $attribs,
+ 'controlName' => $name,
+ 'value' => $value,
+ 'help' => $helpData
+ ) );
+ }
+
+ /**
+ * Get a labelled password box to configure a local variable.
+ * Implements password hiding.
+ */
+ public function getPasswordBox( $var, $label, $attribs = array(), $helpData = "" ) {
+ $name = $this->getName() . '_' . $var;
+ $value = $this->getVar( $var );
+ if ( !isset( $attribs ) ) {
+ $attribs = array();
+ }
+ return $this->parent->getPasswordBox( array(
+ 'var' => $var,
+ 'label' => $label,
+ 'attribs' => $attribs,
+ 'controlName' => $name,
+ 'value' => $value,
+ 'help' => $helpData
+ ) );
+ }
+
+ /**
+ * Get a labelled checkbox to configure a local boolean variable.
+ */
+ public function getCheckBox( $var, $label, $attribs = array(), $helpData = "" ) {
+ $name = $this->getName() . '_' . $var;
+ $value = $this->getVar( $var );
+ return $this->parent->getCheckBox( array(
+ 'var' => $var,
+ 'label' => $label,
+ 'attribs' => $attribs,
+ 'controlName' => $name,
+ 'value' => $value,
+ 'help' => $helpData
+ ));
+ }
+
+ /**
+ * Get a set of labelled radio buttons.
+ *
+ * @param $params Array:
+ * Parameters are:
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * itemLabelPrefix: The message name prefix for the item labels (required)
+ * values: List of allowed values (required)
+ * itemAttribs Array of attribute arrays, outer key is the value name (optional)
+ *
+ */
+ public function getRadioSet( $params ) {
+ $params['controlName'] = $this->getName() . '_' . $params['var'];
+ $params['value'] = $this->getVar( $params['var'] );
+ return $this->parent->getRadioSet( $params );
+ }
+
+ /**
+ * Convenience function to set variables based on form data.
+ * Assumes that variables containing "password" in the name are (potentially
+ * fake) passwords.
+ * @param $varNames Array
+ */
+ public function setVarsFromRequest( $varNames ) {
+ return $this->parent->setVarsFromRequest( $varNames, $this->getName() . '_' );
+ }
+
+ /**
+ * Determine whether an existing installation of MediaWiki is present in
+ * the configured administrative connection. Returns true if there is
+ * such a wiki, false if the database doesn't exist.
+ *
+ * Traditionally, this is done by testing for the existence of either
+ * the revision table or the cur table.
+ *
+ * @return Boolean
+ */
+ public function needsUpgrade() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return false;
+ }
+
+ if ( !$this->db->selectDB( $this->getVar( 'wgDBname' ) ) ) {
+ return false;
+ }
+ return $this->db->tableExists( 'cur' ) || $this->db->tableExists( 'revision' );
+ }
+
+ /**
+ * Get a standard install-user fieldset.
+ *
+ * @return String
+ */
+ public function getInstallUserBox() {
+ return
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', array(), wfMsg( 'config-db-install-account' ) ) .
+ $this->getTextBox( '_InstallUser', 'config-db-username', array(), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
+ $this->getPasswordBox( '_InstallPassword', 'config-db-password', array(), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
+ Html::closeElement( 'fieldset' );
+ }
+
+ /**
+ * Submit a standard install user fieldset.
+ */
+ public function submitInstallUserBox() {
+ $this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword' ) );
+ return Status::newGood();
+ }
+
+ /**
+ * Get a standard web-user fieldset
+ * @param $noCreateMsg String: Message to display instead of the creation checkbox.
+ * Set this to false to show a creation checkbox.
+ *
+ * @return String
+ */
+ public function getWebUserBox( $noCreateMsg = false ) {
+ $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
+ $s = Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', array(), wfMsg( 'config-db-web-account' ) ) .
+ $this->getCheckBox(
+ '_SameAccount', 'config-db-web-account-same',
+ array( 'class' => 'hideShowRadio', 'rel' => 'dbOtherAccount' )
+ ) .
+ Html::openElement( 'div', array( 'id' => 'dbOtherAccount', 'style' => $wrapperStyle ) ) .
+ $this->getTextBox( 'wgDBuser', 'config-db-username' ) .
+ $this->getPasswordBox( 'wgDBpassword', 'config-db-password' ) .
+ $this->parent->getHelpBox( 'config-db-web-help' );
+ if ( $noCreateMsg ) {
+ $s .= $this->parent->getWarningBox( wfMsgNoTrans( $noCreateMsg ) );
+ } else {
+ $s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
+ }
+ $s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
+ return $s;
+ }
+
+ /**
+ * Submit the form from getWebUserBox().
+ *
+ * @return Status
+ */
+ public function submitWebUserBox() {
+ $this->setVarsFromRequest(
+ array( 'wgDBuser', 'wgDBpassword', '_SameAccount', '_CreateDBAccount' )
+ );
+
+ if ( $this->getVar( '_SameAccount' ) ) {
+ $this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
+ $this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+ }
+
+ if( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+ return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
+ }
+
+ return Status::newGood();
+ }
+
+ /**
+ * Common function for databases that don't understand the MySQLish syntax of interwiki.sql.
+ *
+ * @return Status
+ */
+ public function populateInterwikiTable() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $this->db->selectDB( $this->getVar( 'wgDBname' ) );
+
+ if( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
+ $status->warning( 'config-install-interwiki-exists' );
+ return $status;
+ }
+ global $IP;
+ wfSuppressWarnings();
+ $rows = file( "$IP/maintenance/interwiki.list",
+ FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
+ wfRestoreWarnings();
+ $interwikis = array();
+ if ( !$rows ) {
+ return Status::newFatal( 'config-install-interwiki-list' );
+ }
+ foreach( $rows as $row ) {
+ $row = preg_replace( '/^\s*([^#]*?)\s*(#.*)?$/', '\\1', $row ); // strip comments - whee
+ if ( $row == "" ) continue;
+ $row .= "||";
+ $interwikis[] = array_combine(
+ array( 'iw_prefix', 'iw_url', 'iw_local', 'iw_api', 'iw_wikiid' ),
+ explode( '|', $row )
+ );
+ }
+ $this->db->insert( 'interwiki', $interwikis, __METHOD__ );
+ return Status::newGood();
+ }
+
+ public function outputHandler( $string ) {
+ return htmlspecialchars( $string );
+ }
+}
diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php
new file mode 100644
index 00000000..79928d1f
--- /dev/null
+++ b/includes/installer/DatabaseUpdater.php
@@ -0,0 +1,574 @@
+<?php
+/**
+ * DBMS-specific updater helper.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+require_once( dirname(__FILE__) . '/../../maintenance/Maintenance.php' );
+
+/*
+ * Class for handling database updates. Roughly based off of updaters.inc, with
+ * a few improvements :)
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+abstract class DatabaseUpdater {
+
+ /**
+ * Array of updates to perform on the database
+ *
+ * @var array
+ */
+ protected $updates = array();
+
+ /**
+ * List of extension-provided database updates
+ * @var array
+ */
+ protected $extensionUpdates = array();
+
+ /**
+ * Used to hold schema files during installation process
+ * @var array
+ */
+ protected $newExtensions = array();
+
+ /**
+ * Handle to the database subclass
+ *
+ * @var DatabaseBase
+ */
+ protected $db;
+
+ protected $shared = false;
+
+ protected $postDatabaseUpdateMaintenance = array(
+ 'DeleteDefaultMessages'
+ );
+
+ /**
+ * Constructor
+ *
+ * @param $db DatabaseBase object to perform updates on
+ * @param $shared bool Whether to perform updates on shared tables
+ * @param $maintenance Maintenance Maintenance object which created us
+ */
+ protected function __construct( DatabaseBase &$db, $shared, Maintenance $maintenance = null ) {
+ $this->db = $db;
+ $this->db->setFlag( DBO_DDLMODE ); // For Oracle's handling of schema files
+ $this->shared = $shared;
+ if ( $maintenance ) {
+ $this->maintenance = $maintenance;
+ } else {
+ $this->maintenance = new FakeMaintenance;
+ }
+ $this->initOldGlobals();
+ $this->loadExtensions();
+ wfRunHooks( 'LoadExtensionSchemaUpdates', array( $this ) );
+ }
+
+ /**
+ * Initialize all of the old globals. One day this should all become
+ * something much nicer
+ */
+ private function initOldGlobals() {
+ global $wgExtNewTables, $wgExtNewFields, $wgExtPGNewFields,
+ $wgExtPGAlteredFields, $wgExtNewIndexes, $wgExtModifiedFields;
+
+ # For extensions only, should be populated via hooks
+ # $wgDBtype should be checked to specifiy the proper file
+ $wgExtNewTables = array(); // table, dir
+ $wgExtNewFields = array(); // table, column, dir
+ $wgExtPGNewFields = array(); // table, column, column attributes; for PostgreSQL
+ $wgExtPGAlteredFields = array(); // table, column, new type, conversion method; for PostgreSQL
+ $wgExtNewIndexes = array(); // table, index, dir
+ $wgExtModifiedFields = array(); // table, index, dir
+ }
+
+ /**
+ * Loads LocalSettings.php, if needed, and initialises everything needed for LoadExtensionSchemaUpdates hook
+ */
+ private function loadExtensions() {
+ if ( !defined( 'MEDIAWIKI_INSTALL' ) ) {
+ return; // already loaded
+ }
+ $vars = Installer::getExistingLocalSettings();
+ if ( !$vars ) {
+ return; // no LocalSettings found
+ }
+ if ( !isset( $vars['wgHooks'] ) && !isset( $vars['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
+ return;
+ }
+ global $wgHooks, $wgAutoloadClasses;
+ $wgHooks['LoadExtensionSchemaUpdates'] = $vars['wgHooks']['LoadExtensionSchemaUpdates'];
+ $wgAutoloadClasses = $wgAutoloadClasses + $vars['wgAutoloadClasses'];
+ }
+
+ /**
+ * @throws MWException
+ * @param DatabaseBase $db
+ * @param bool $shared
+ * @param null $maintenance
+ * @return DatabaseUpdater
+ */
+ public static function newForDB( &$db, $shared = false, $maintenance = null ) {
+ $type = $db->getType();
+ if( in_array( $type, Installer::getDBTypes() ) ) {
+ $class = ucfirst( $type ) . 'Updater';
+ return new $class( $db, $shared, $maintenance );
+ } else {
+ throw new MWException( __METHOD__ . ' called for unsupported $wgDBtype' );
+ }
+ }
+
+ /**
+ * Get a database connection to run updates
+ *
+ * @return DatabaseBase
+ */
+ public function getDB() {
+ return $this->db;
+ }
+
+ /**
+ * Output some text. If we're running from web, escape the text first.
+ *
+ * @param $str String: Text to output
+ */
+ public function output( $str ) {
+ if ( $this->maintenance->isQuiet() ) {
+ return;
+ }
+ global $wgCommandLineMode;
+ if( !$wgCommandLineMode ) {
+ $str = htmlspecialchars( $str );
+ }
+ echo $str;
+ flush();
+ }
+
+ /**
+ * Add a new update coming from an extension. This should be called by
+ * extensions while executing the LoadExtensionSchemaUpdates hook.
+ *
+ * @param $update Array: the update to run. Format is the following:
+ * first item is the callback function, it also can be a
+ * simple string with the name of a function in this class,
+ * following elements are parameters to the function.
+ * Note that callback functions will receive this object as
+ * first parameter.
+ */
+ public function addExtensionUpdate( Array $update ) {
+ $this->extensionUpdates[] = $update;
+ }
+
+ /**
+ * Convenience wrapper for addExtensionUpdate() when adding a new table (which
+ * is the most common usage of updaters in an extension)
+ * @param $tableName String Name of table to create
+ * @param $sqlPath String Full path to the schema file
+ */
+ public function addExtensionTable( $tableName, $sqlPath ) {
+ $this->extensionUpdates[] = array( 'addTable', $tableName, $sqlPath, true );
+ }
+
+ /**
+ * Add a brand new extension to MediaWiki. Used during the initial install
+ * @param $ext String Name of extension
+ * @param $sqlPath String Full path to the schema file
+ */
+ public function addNewExtension( $ext, $sqlPath ) {
+ $this->newExtensions[ strtolower( $ext ) ] = $sqlPath;
+ }
+
+ /**
+ * Get the list of extensions that registered a schema with our DB type
+ * @return array
+ */
+ public function getNewExtensions() {
+ return $this->newExtensions;
+ }
+
+ /**
+ * Get the list of extension-defined updates
+ *
+ * @return Array
+ */
+ protected function getExtensionUpdates() {
+ return $this->extensionUpdates;
+ }
+
+ public function getPostDatabaseUpdateMaintenance() {
+ return $this->postDatabaseUpdateMaintenance;
+ }
+
+ /**
+ * Do all the updates
+ *
+ * @param $what Array: what updates to perform
+ */
+ public function doUpdates( $what = array( 'core', 'extensions', 'purge' ) ) {
+ global $wgVersion;
+
+ $what = array_flip( $what );
+ if ( isset( $what['core'] ) ) {
+ $this->runUpdates( $this->getCoreUpdateList(), false );
+ }
+ if ( isset( $what['extensions'] ) ) {
+ $this->runUpdates( $this->getOldGlobalUpdates(), false );
+ $this->runUpdates( $this->getExtensionUpdates(), true );
+ }
+
+ $this->setAppliedUpdates( $wgVersion, $this->updates );
+
+ if( isset( $what['purge'] ) ) {
+ $this->purgeCache();
+ }
+ if ( isset( $what['core'] ) ) {
+ $this->checkStats();
+ }
+ }
+
+ /**
+ * Helper function for doUpdates()
+ *
+ * @param $updates Array of updates to run
+ * @param $passSelf Boolean: whether to pass this object we calling external
+ * functions
+ */
+ private function runUpdates( array $updates, $passSelf ) {
+ foreach ( $updates as $params ) {
+ $func = array_shift( $params );
+ if( !is_array( $func ) && method_exists( $this, $func ) ) {
+ $func = array( $this, $func );
+ } elseif ( $passSelf ) {
+ array_unshift( $params, $this );
+ }
+ call_user_func_array( $func, $params );
+ flush();
+ }
+ $this->updates = array_merge( $this->updates, $updates );
+ }
+
+ protected function setAppliedUpdates( $version, $updates = array() ) {
+ if( !$this->canUseNewUpdatelog() ) {
+ return;
+ }
+ $key = "updatelist-$version-" . time();
+ $this->db->insert( 'updatelog',
+ array( 'ul_key' => $key, 'ul_value' => serialize( $updates ) ),
+ __METHOD__ );
+ }
+
+ /**
+ * Helper function: check if the given key is present in the updatelog table.
+ * Obviously, only use this for updates that occur after the updatelog table was
+ * created!
+ */
+ public function updateRowExists( $key ) {
+ $row = $this->db->selectRow(
+ 'updatelog',
+ '1',
+ array( 'ul_key' => $key ),
+ __METHOD__
+ );
+ return (bool)$row;
+ }
+
+ /**
+ * Updatelog was changed in 1.17 to have a ul_value column so we can record
+ * more information about what kind of updates we've done (that's what this
+ * class does). Pre-1.17 wikis won't have this column, and really old wikis
+ * might not even have updatelog at all
+ *
+ * @return boolean
+ */
+ protected function canUseNewUpdatelog() {
+ return $this->db->tableExists( 'updatelog' ) &&
+ $this->db->fieldExists( 'updatelog', 'ul_value' );
+ }
+
+ /**
+ * Before 1.17, we used to handle updates via stuff like
+ * $wgExtNewTables/Fields/Indexes. This is nasty :) We refactored a lot
+ * of this in 1.17 but we want to remain back-compatible for a while. So
+ * load up these old global-based things into our update list.
+ */
+ protected function getOldGlobalUpdates() {
+ global $wgExtNewFields, $wgExtNewTables, $wgExtModifiedFields,
+ $wgExtNewIndexes, $wgSharedDB, $wgSharedTables;
+
+ $doUser = $this->shared ?
+ $wgSharedDB && in_array( 'user', $wgSharedTables ) :
+ !$wgSharedDB || !in_array( 'user', $wgSharedTables );
+
+ $updates = array();
+
+ foreach ( $wgExtNewTables as $tableRecord ) {
+ $updates[] = array(
+ 'addTable', $tableRecord[0], $tableRecord[1], true
+ );
+ }
+
+ foreach ( $wgExtNewFields as $fieldRecord ) {
+ if ( $fieldRecord[0] != 'user' || $doUser ) {
+ $updates[] = array(
+ 'addField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2], true
+ );
+ }
+ }
+
+ foreach ( $wgExtNewIndexes as $fieldRecord ) {
+ $updates[] = array(
+ 'addIndex', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2], true
+ );
+ }
+
+ foreach ( $wgExtModifiedFields as $fieldRecord ) {
+ $updates[] = array(
+ 'modifyField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2], true
+ );
+ }
+
+ return $updates;
+ }
+
+ /**
+ * Get an array of updates to perform on the database. Should return a
+ * multi-dimensional array. The main key is the MediaWiki version (1.12,
+ * 1.13...) with the values being arrays of updates, identical to how
+ * updaters.inc did it (for now)
+ *
+ * @return Array
+ */
+ protected abstract function getCoreUpdateList();
+
+ /**
+ * Applies a SQL patch
+ * @param $path String Path to the patch file
+ * @param $isFullPath Boolean Whether to treat $path as a relative or not
+ */
+ protected function applyPatch( $path, $isFullPath = false ) {
+ if ( $isFullPath ) {
+ $this->db->sourceFile( $path );
+ } else {
+ $this->db->sourceFile( $this->db->patchPath( $path ) );
+ }
+ }
+
+ /**
+ * Add a new table to the database
+ * @param $name String Name of the new table
+ * @param $patch String Path to the patch file
+ * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ */
+ protected function addTable( $name, $patch, $fullpath = false ) {
+ if ( $this->db->tableExists( $name ) ) {
+ $this->output( "...$name table already exists.\n" );
+ } else {
+ $this->output( "Creating $name table..." );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "ok\n" );
+ }
+ }
+
+ /**
+ * Add a new field to an existing table
+ * @param $table String Name of the table to modify
+ * @param $field String Name of the new field
+ * @param $patch String Path to the patch file
+ * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ */
+ protected function addField( $table, $field, $patch, $fullpath = false ) {
+ if ( !$this->db->tableExists( $table ) ) {
+ $this->output( "...$table table does not exist, skipping new field patch\n" );
+ } elseif ( $this->db->fieldExists( $table, $field ) ) {
+ $this->output( "...have $field field in $table table.\n" );
+ } else {
+ $this->output( "Adding $field field to table $table..." );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "ok\n" );
+ }
+ }
+
+ /**
+ * Add a new index to an existing table
+ * @param $table String Name of the table to modify
+ * @param $index String Name of the new index
+ * @param $patch String Path to the patch file
+ * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ */
+ protected function addIndex( $table, $index, $patch, $fullpath = false ) {
+ if ( $this->db->indexExists( $table, $index ) ) {
+ $this->output( "...$index key already set on $table table.\n" );
+ } else {
+ $this->output( "Adding $index key to table $table... " );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "ok\n" );
+ }
+ }
+
+ /**
+ * Drop a field from an existing table
+ *
+ * @param $table String Name of the table to modify
+ * @param $field String Name of the old field
+ * @param $patch String Path to the patch file
+ * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ */
+ protected function dropField( $table, $field, $patch, $fullpath = false ) {
+ if ( $this->db->fieldExists( $table, $field ) ) {
+ $this->output( "Table $table contains $field field. Dropping... " );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "ok\n" );
+ } else {
+ $this->output( "...$table table does not contain $field field.\n" );
+ }
+ }
+
+ /**
+ * Drop an index from an existing table
+ *
+ * @param $table String: Name of the table to modify
+ * @param $index String: Name of the old index
+ * @param $patch String: Path to the patch file
+ * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
+ */
+ protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
+ if ( $this->db->indexExists( $table, $index ) ) {
+ $this->output( "Dropping $index from table $table... " );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "ok\n" );
+ } else {
+ $this->output( "...$index key doesn't exist.\n" );
+ }
+ }
+
+ /**
+ * Modify an existing field
+ *
+ * @param $table String: name of the table to which the field belongs
+ * @param $field String: name of the field to modify
+ * @param $patch String: path to the patch file
+ * @param $fullpath Boolean: whether to treat $patch path as a relative or not
+ */
+ public function modifyField( $table, $field, $patch, $fullpath = false ) {
+ if ( !$this->db->tableExists( $table ) ) {
+ $this->output( "...$table table does not exist, skipping modify field patch\n" );
+ } elseif ( !$this->db->fieldExists( $table, $field ) ) {
+ $this->output( "...$field field does not exist in $table table, skipping modify field patch\n" );
+ } else {
+ $this->output( "Modifying $field field of table $table..." );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "ok\n" );
+ }
+ }
+
+ /**
+ * Purge the objectcache table
+ */
+ protected function purgeCache() {
+ # We can't guarantee that the user will be able to use TRUNCATE,
+ # but we know that DELETE is available to us
+ $this->output( "Purging caches..." );
+ $this->db->delete( 'objectcache', '*', __METHOD__ );
+ $this->output( "done.\n" );
+ }
+
+ /**
+ * Check the site_stats table is not properly populated.
+ */
+ protected function checkStats() {
+ $this->output( "Checking site_stats row..." );
+ $row = $this->db->selectRow( 'site_stats', '*', array( 'ss_row_id' => 1 ), __METHOD__ );
+ if ( $row === false ) {
+ $this->output( "data is missing! rebuilding...\n" );
+ } elseif ( isset( $row->site_stats ) && $row->ss_total_pages == -1 ) {
+ $this->output( "missing ss_total_pages, rebuilding...\n" );
+ } else {
+ $this->output( "done.\n" );
+ return;
+ }
+ SiteStatsInit::doAllAndCommit( false );
+ }
+
+ # Common updater functions
+
+ protected function doActiveUsersInit() {
+ $activeUsers = $this->db->selectField( 'site_stats', 'ss_active_users', false, __METHOD__ );
+ if ( $activeUsers == -1 ) {
+ $activeUsers = $this->db->selectField( 'recentchanges',
+ 'COUNT( DISTINCT rc_user_text )',
+ array( 'rc_user != 0', 'rc_bot' => 0, "rc_log_type != 'newusers'" ), __METHOD__
+ );
+ $this->db->update( 'site_stats',
+ array( 'ss_active_users' => intval( $activeUsers ) ),
+ array( 'ss_row_id' => 1 ), __METHOD__, array( 'LIMIT' => 1 )
+ );
+ }
+ $this->output( "...ss_active_users user count set...\n" );
+ }
+
+ protected function doLogUsertextPopulation() {
+ if ( $this->updateRowExists( 'populate log_usertext' ) ) {
+ $this->output( "...log_user_text field already populated.\n" );
+ return;
+ }
+
+ $this->output(
+ "Populating log_user_text field, printing progress markers. For large\n" .
+ "databases, you may want to hit Ctrl-C and do this manually with\n" .
+ "maintenance/populateLogUsertext.php.\n" );
+ $task = new PopulateLogUsertext();
+ $task->execute();
+ $this->output( "Done populating log_user_text field.\n" );
+ }
+
+ protected function doLogSearchPopulation() {
+ if ( $this->updateRowExists( 'populate log_search' ) ) {
+ $this->output( "...log_search table already populated.\n" );
+ return;
+ }
+
+ $this->output(
+ "Populating log_search table, printing progress markers. For large\n" .
+ "databases, you may want to hit Ctrl-C and do this manually with\n" .
+ "maintenance/populateLogSearch.php.\n" );
+ $task = new PopulateLogSearch();
+ $task->execute();
+ $this->output( "Done populating log_search table.\n" );
+ }
+
+ protected function doUpdateTranscacheField() {
+ if ( $this->updateRowExists( 'convert transcache field' ) ) {
+ $this->output( "...transcache tc_time already converted.\n" );
+ return;
+ }
+
+ $this->output( "Converting tc_time from UNIX epoch to MediaWiki timestamp... " );
+ $this->applyPatch( 'patch-tc-timestamp.sql' );
+ $this->output( "ok\n" );
+ }
+
+ protected function doCollationUpdate() {
+ global $wgCategoryCollation;
+ if ( $this->db->selectField(
+ 'categorylinks',
+ 'COUNT(*)',
+ 'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
+ __METHOD__
+ ) == 0 ) {
+ $this->output( "...collations up-to-date.\n" );
+ return;
+ }
+
+ $task = new UpdateCollation();
+ $task->execute();
+ }
+}
diff --git a/includes/installer/Installer.i18n.php b/includes/installer/Installer.i18n.php
new file mode 100644
index 00000000..d6a8a757
--- /dev/null
+++ b/includes/installer/Installer.i18n.php
@@ -0,0 +1,12267 @@
+<?php
+/**
+ * Internationalization file for the install/upgrade process. None of the
+ * messages used here are loaded during normal operations, only during
+ * install and upgrade. So you should not put normal messages here.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+$messages = array();
+
+/** English */
+$messages['en'] = array(
+ 'config-desc' => 'The installer for MediaWiki',
+ 'config-title' => 'MediaWiki $1 installation',
+ 'config-information' => 'Information',
+ 'config-localsettings-upgrade' => "A <code>LocalSettings.php</code> file has been detected.
+To upgrade this installation, please enter the value of <code>\$wgUpgradeKey</code> in the box below.
+You will find it in LocalSettings.php.",
+ 'config-localsettings-cli-upgrade' => 'A LocalSettings.php file has been detected.
+To upgrade this installation, please run update.php instead',
+ 'config-localsettings-key' => 'Upgrade key:',
+ 'config-localsettings-badkey' => 'The key you provided is incorrect.',
+ 'config-upgrade-key-missing' => 'An existing installation of MediaWiki has been detected.
+To upgrade this installation, please put the following line at the bottom of your LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'The existing LocalSettings.php appears to be incomplete.
+The $1 variable is not set.
+Please change LocalSettings.php so that this variable is set, and click "Continue".',
+ 'config-localsettings-connection-error' => 'An error was encountered when connecting to the database using the settings specified in LocalSettings.php or AdminSettings.php. Please fix these settings and try again.
+
+$1',
+ 'config-session-error' => 'Error starting session: $1',
+ 'config-session-expired' => 'Your session data seems to have expired.
+Sessions are configured for a lifetime of $1.
+You can increase this by setting <code>session.gc_maxlifetime</code> in php.ini.
+Restart the installation process.',
+ 'config-no-session' => 'Your session data was lost!
+Check your php.ini and make sure <code>session.save_path</code> is set to an appropriate directory.',
+ 'config-your-language' => 'Your language:',
+ 'config-your-language-help' => 'Select a language to use during the installation process.',
+ 'config-wiki-language' => 'Wiki language:',
+ 'config-wiki-language-help' => 'Select the language that the wiki will predominantly be written in.',
+ 'config-back' => '↠Back',
+ 'config-continue' => 'Continue →',
+ 'config-page-language' => 'Language',
+ 'config-page-welcome' => 'Welcome to MediaWiki!',
+ 'config-page-dbconnect' => 'Connect to database',
+ 'config-page-upgrade' => 'Upgrade existing installation',
+ 'config-page-dbsettings' => 'Database settings',
+ 'config-page-name' => 'Name',
+ 'config-page-options' => 'Options',
+ 'config-page-install' => 'Install',
+ 'config-page-complete' => 'Complete!',
+ 'config-page-restart' => 'Restart installation',
+ 'config-page-readme' => 'Read me',
+ 'config-page-releasenotes' => 'Release notes',
+ 'config-page-copying' => 'Copying',
+ 'config-page-upgradedoc' => 'Upgrading',
+ 'config-page-existingwiki' => 'Existing wiki',
+ 'config-help-restart' => 'Do you want to clear all saved data that you have entered and restart the installation process?',
+ 'config-restart' => 'Yes, restart it',
+ 'config-welcome' => "=== Environmental checks ===
+Basic checks are performed to see if this environment is suitable for MediaWiki installation.
+You should provide the results of these checks if you need help during installation.",
+ 'config-copyright' => "=== Copyright and Terms ===
+
+$1
+
+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 <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online].",
+ 'config-sidebar' => "* [http://www.mediawiki.org MediaWiki home]
+* [http://www.mediawiki.org/wiki/Help:Contents User's Guide]
+* [http://www.mediawiki.org/wiki/Manual:Contents Administrator's Guide]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Read me</doclink>
+* <doclink href=ReleaseNotes>Release notes</doclink>
+* <doclink href=Copying>Copying</doclink>
+* <doclink href=UpgradeDoc>Upgrading</doclink>",
+ 'config-env-good' => 'The environment has been checked.
+You can install MediaWiki.',
+ 'config-env-bad' => 'The environment has been checked.
+You cannot install MediaWiki.',
+ 'config-env-php' => 'PHP $1 is installed.',
+ 'config-env-php-toolow' => 'PHP $1 is installed.
+However, MediaWiki requires PHP $2 or higher.',
+ 'config-unicode-using-utf8' => 'Using Brion Vibber\'s utf8_normalize.so for Unicode normalization.',
+ 'config-unicode-using-intl' => 'Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.',
+ 'config-unicode-pure-php-warning' => "'''Warning''': The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
+If you run a high-traffic site, you should read a little on [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
+ 'config-unicode-update-warning' => "'''Warning''': The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+You should [http://www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
+ 'config-no-db' => 'Could not find a suitable database driver! You need to install a database driver for PHP.
+The following database types are supported: $1.
+
+If you are on shared hosting, ask your hosting provider to install a suitable database driver.
+If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
+If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
+ 'config-no-fts3' => "'''Warning''': SQLite is compiled without the [http://sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+ 'config-register-globals' => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
+'''Disable it if you can.'''
+MediaWiki will work, but your server is exposed to potential security vulnerabilities.",
+ 'config-magic-quotes-runtime' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'''
+This option corrupts data input unpredictably.
+You cannot install or use MediaWiki unless this option is disabled.",
+ 'config-magic-quotes-sybase' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!'''
+This option corrupts data input unpredictably.
+You cannot install or use MediaWiki unless this option is disabled.",
+ 'config-mbstring' => "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!'''
+This option causes errors and may corrupt data unpredictably.
+You cannot install or use MediaWiki unless this option is disabled.",
+ 'config-ze1' => "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] is active!'''
+This option causes horrible bugs with MediaWiki.
+You cannot install or use MediaWiki unless this option is disabled.",
+ 'config-safe-mode' => "'''Warning:''' PHP's [http://www.php.net/features.safe-mode safe mode] is active.
+It may cause problems, particularly if using file uploads and <code>math</code> support.",
+ 'config-xml-bad' => "PHP's XML module is missing.
+MediaWiki requires functions in this module and will not work in this configuration.
+If you're running Mandrake, install the php-xml package.",
+ 'config-pcre' => 'The PCRE support module appears to be missing.
+MediaWiki requires the Perl-compatible regular expression functions to work.',
+ 'config-pcre-no-utf8' => "'''Fatal''': PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
+MediaWiki requires UTF-8 support to function correctly.",
+ 'config-memory-raised' => "PHP's <code>memory_limit</code> is $1, raised to $2.",
+ 'config-memory-bad' => "'''Warning:''' PHP's <code>memory_limit</code> is $1.
+This is probably too low.
+The installation may fail!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] is installed',
+ 'config-apc' => '[http://www.php.net/apc APC] is installed',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] is installed',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is installed',
+ 'config-no-cache' => "'''Warning:''' Could not find [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
+Object caching is not enabled.",
+ 'config-diff3-bad' => 'GNU diff3 not found.',
+ 'config-imagemagick' => 'Found ImageMagick: <code>$1</code>.
+Image thumbnailing will be enabled if you enable uploads.',
+ 'config-gd' => 'Found GD graphics library built-in.
+Image thumbnailing will be enabled if you enable uploads.',
+ 'config-no-scaling' => 'Could not find GD library or ImageMagick.
+Image thumbnailing will be disabled.',
+ 'config-no-uri' => "'''Error:''' Could not determine the current URI.
+Installation aborted.",
+ 'config-uploads-not-safe' => "'''Warning:''' Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.
+Although MediaWiki checks all uploaded files for security threats, it is highly recommended to [http://www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
+ 'config-brokenlibxml' => 'Your system has a combination of PHP and libxml2 versions which is buggy and can cause hidden data corruption in MediaWiki and other web applications.
+Upgrade to PHP 5.2.9 or later and libxml2 2.7.3 or later ([http://bugs.php.net/bug.php?id=45996 bug filed with PHP]).
+Installation aborted.',
+ 'config-using531' => 'MediaWiki cannot be used with PHP $1 due to a bug involving reference parameters to <code>__call()</code>.
+Upgrade to PHP 5.3.2 or higher, or downgrade to PHP 5.3.0 to resolve this.
+Installation aborted.',
+ 'config-suhosin-max-value-length' => "Suhosin is installed and limits the GET parameter length to $1 bytes. MediaWiki's ResourceLoader component will work around this limit, but that will degrade performance. If at all possible, you should set suhosin.get.max_value_length to 1024 or higher in php.ini , and set \$wgResourceLoaderMaxQueryLength to the same value in LocalSettings.php .",
+ 'config-db-type' => 'Database type:',
+ 'config-db-host' => 'Database host:',
+ 'config-db-host-help' => 'If your database server is on different server, enter the host name or IP address here.
+
+If you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.
+
+If you are installing on a Windows server and using MySQL, using "localhost" may not work for the server name. If it does not, try "127.0.0.1" for the local IP address.',
+ 'config-db-host-oracle' => 'Database TNS:',
+ 'config-db-host-oracle-help' => 'Enter a valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; a tnsnames.ora file must be visible to this installation.<br />If you are using client libraries 10g or newer you can also use the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] naming method.',
+ 'config-db-wiki-settings' => 'Identify this wiki',
+ 'config-db-name' => 'Database name:',
+ 'config-db-name-help' => 'Choose a name that identifies your wiki.
+It should not contain spaces.
+
+If you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel.',
+ 'config-db-name-oracle' => 'Database schema:',
+ 'config-db-account-oracle-warn' => "There are three supported scenarios for installing Oracle as database backend:
+
+If you wish to create database account as part of the installation process, please supply an account with SYSDBA role as database account for installation and specify the desired credentials for the web-access account, otherwise you can either create the web-access account manually and supply only that account (if it has required permissions to create the schema objects) or supply two different accounts, one with create privileges and a restricted one for web access.
+
+Script for creating an account with required privileges can be found in \"maintenance/oracle/\" directory of this installation. Keep in mind that using a restricted account will disable all maintenance capabilities with the default account.",
+ 'config-db-install-account' => 'User account for installation',
+ 'config-db-username' => 'Database username:',
+ 'config-db-password' => 'Database password:',
+ 'config-db-password-empty' => 'Please enter a password for the new database user: $1.
+While it may be possible to create users with no passwords, it is not secure.',
+ 'config-db-install-username' => 'Enter the username that will be used to connect to the database during the installation process.
+This is not the username of the MediaWiki account; this is the username for your database.',
+ 'config-db-install-password' => 'Enter the password that will be used to connect to the database during the installation process.
+This is not the password for the MediaWiki account; this is the password for your database.',
+ 'config-db-install-help' => 'Enter the username and password that will be used to connect to the database during the installation process.',
+ 'config-db-account-lock' => 'Use the same username and password during normal operation',
+ 'config-db-wiki-account' => 'User account for normal operation',
+ 'config-db-wiki-help' => 'Enter the username and password that will be used to connect to the database during normal wiki operation.
+If the account does not exist, and the installation account has sufficient privileges, this user account will be created with the minimum privileges required to operate the wiki.',
+ 'config-db-prefix' => 'Database table prefix:',
+ 'config-db-prefix-help' => 'If you need to share one database between multiple wikis, or between MediaWiki and another web application, you may choose to add a prefix to all the table names to avoid conflicts.
+Do not use spaces.
+
+This field is usually left empty.',
+ 'config-db-charset' => 'Database character set',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 backwards-compatible UTF-8',
+ 'config-charset-help' => "'''Warning:''' If you use '''backwards-compatible UTF-8''' on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!
+
+In '''binary mode''', MediaWiki stores UTF-8 text to the database in binary fields.
+This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.
+In '''UTF-8 mode''', MySQL will know what character set your data is in, and can present and convert it appropriately,
+but it will not let you store characters above the [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+ 'config-mysql-old' => 'MySQL $1 or later is required, you have $2.',
+ 'config-db-port' => 'Database port:',
+ 'config-db-schema' => 'Schema for MediaWiki',
+ 'config-db-schema-help' => 'This schema will usually be fine.
+Only change it if you know you need to.',
+ 'config-pg-test-error' => "Cannot connect to database '''$1''': $2",
+ 'config-sqlite-dir' => 'SQLite data directory:',
+ 'config-sqlite-dir-help' => "SQLite stores all data in a single file.
+
+The directory you provide must be writable by the webserver during installation.
+
+It should '''not''' be accessible via the web, this is why we're not putting it where your PHP files are.
+
+The installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.
+That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
+
+Consider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Default tablespace:',
+ 'config-oracle-temp-ts' => 'Temporary tablespace:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki supports the following database systems:
+
+$1
+
+If you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.',
+ 'config-support-mysql' => '* $1 is the primary target for MediaWiki and is best supported ([http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])',
+ 'config-support-postgres' => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
+ 'config-support-sqlite' => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
+ 'config-support-oracle' => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
+ 'config-header-mysql' => 'MySQL settings',
+ 'config-header-postgres' => 'PostgreSQL settings',
+ 'config-header-sqlite' => 'SQLite settings',
+ 'config-header-oracle' => 'Oracle settings',
+ 'config-invalid-db-type' => 'Invalid database type',
+ 'config-missing-db-name' => 'You must enter a value for "Database name"',
+ 'config-missing-db-host' => 'You must enter a value for "Database host"',
+ 'config-missing-db-server-oracle' => 'You must enter a value for "Database TNS"',
+ 'config-invalid-db-server-oracle' => 'Invalid database TNS "$1".
+Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and dots (.).',
+ 'config-invalid-db-name' => 'Invalid database name "$1".
+Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).',
+ 'config-invalid-db-prefix' => 'Invalid database prefix "$1".
+Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).',
+ 'config-connection-error' => '$1.
+
+Check the host, username and password and try again.',
+ 'config-invalid-schema' => 'Invalid schema for MediaWiki "$1".
+Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).',
+ 'config-db-sys-create-oracle' => 'Installer only supports using a SYSDBA account for creating a new account.',
+ 'config-db-sys-user-exists-oracle' => 'User account "$1" already exists. SYSDBA can only be used for creating of a new account!',
+ 'config-postgres-old' => 'PostgreSQL $1 or later is required, you have $2.',
+ 'config-sqlite-name-help' => 'Choose a name that identifies your wiki.
+Do not use spaces or hyphens.
+This will be used for the SQLite data file name.',
+ 'config-sqlite-parent-unwritable-group' => 'Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.
+
+The installer has determined the user your webserver is running as.
+Make the <code><nowiki>$3</nowiki></code> directory writable by it to continue.
+On a Unix/Linux system do:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.
+
+The installer could not determine the user your webserver is running as.
+Make the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.
+On a Unix/Linux system do:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Error creating the data directory "$1".
+Check the location and try again.',
+ 'config-sqlite-dir-unwritable' => 'Unable to write to the directory "$1".
+Change its permissions so that the webserver can write to it, and try again.',
+ 'config-sqlite-connection-error' => '$1.
+
+Check the data directory and database name below and try again.',
+ 'config-sqlite-readonly' => 'The file <code>$1</code> is not writeable.',
+ 'config-sqlite-cant-create-db' => 'Could not create database file <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP is missing FTS3 support, downgrading tables',
+ 'config-can-upgrade' => "There are MediaWiki tables in this database.
+To upgrade them to MediaWiki $1, click '''Continue'''.",
+ 'config-upgrade-done' => "Upgrade complete.
+
+You can now [$1 start using your wiki].
+
+If you want to regenerate your <code>LocalSettings.php</code> file, click the button below.
+This is '''not recommended''' unless you are having problems with your wiki.",
+ 'config-upgrade-done-no-regenerate' => "Upgrade complete.
+
+You can now [$1 start using your wiki].",
+ 'config-regenerate' => 'Regenerate LocalSettings.php →',
+ 'config-show-table-status' => 'SHOW TABLE STATUS query failed!',
+ 'config-unknown-collation' => "'''Warning:''' Database is using unrecognised collation.",
+ 'config-db-web-account' => 'Database account for web access',
+ 'config-db-web-help' => 'Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.',
+ 'config-db-web-account-same' => 'Use the same account as for installation',
+ 'config-db-web-create' => 'Create the account if it does not already exist',
+ 'config-db-web-no-create-privs' => 'The account you specified for installation does not have enough privileges to create an account.
+The account you specify here must already exist.',
+ 'config-mysql-engine' => 'Storage engine:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' is almost always the best option, since it has good concurrency support.
+
+'''MyISAM''' may be faster in single-user or read-only installations.
+MyISAM databases tend to get corrupted more often than InnoDB databases.",
+ 'config-mysql-charset' => 'Database character set:',
+ 'config-mysql-binary' => 'Binary',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "In '''binary mode''', MediaWiki stores UTF-8 text to the database in binary fields.
+This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.
+
+In '''UTF-8 mode''', MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+ 'config-site-name' => 'Name of wiki:',
+ 'config-site-name-help' => "This will appear in the title bar of the browser and in various other places.",
+ 'config-site-name-blank' => 'Enter a site name.',
+ 'config-project-namespace' => 'Project namespace:',
+ 'config-ns-generic' => 'Project',
+ 'config-ns-site-name' => 'Same as the wiki name: $1',
+ 'config-ns-other' => 'Other (specify)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => 'Following Wikipedia\'s example, many wikis keep their policy pages separate from their content pages, in a "\'\'\'project namespace\'\'\'".
+All page titles in this namespace start with a certain prefix, which you can specify here.
+Traditionally, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as "#" or ":".',
+ 'config-ns-invalid' => 'The specified namespace "<nowiki>$1</nowiki>" is invalid.
+Specify a different project namespace.',
+ 'config-ns-conflict' => 'The specified namespace "<nowiki>$1</nowiki>" conflicts with a default MediaWiki namespace.
+Specify a different project namespace.',
+ 'config-admin-box' => 'Administrator account',
+ 'config-admin-name' => 'Your name:',
+ 'config-admin-password' => 'Password:',
+ 'config-admin-password-confirm' => 'Password again:',
+ 'config-admin-help' => 'Enter your preferred username here, for example "Joe Bloggs".
+This is the name you will use to log in to the wiki.',
+ 'config-admin-name-blank' => 'Enter an administrator username.',
+ 'config-admin-name-invalid' => 'The specified username "<nowiki>$1</nowiki>" is invalid.
+Specify a different username.',
+ 'config-admin-password-blank' => 'Enter a password for the administrator account.',
+ 'config-admin-password-same' => 'The password must not be the same as the username.',
+ 'config-admin-password-mismatch' => 'The two passwords you entered do not match.',
+ 'config-admin-email' => 'E-mail address:',
+ 'config-admin-email-help' => 'Enter an e-mail address here to allow you to receive e-mail from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.',
+ 'config-admin-error-user' => 'Internal error when creating an admin with the name "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Internal error when setting a password for the admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'You have entered an invalid e-mail address.',
+ 'config-subscribe' => 'Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].',
+ 'config-subscribe-help' => 'This is a low-volume mailing list used for release announcements, including important security announcements.
+You should subscribe to it and update your MediaWiki installation when new versions come out.',
+ 'config-almost-done' => 'You are almost done!
+You can now skip the remaining configuration and install the wiki right now.',
+ 'config-optional-continue' => 'Ask me more questions.',
+ 'config-optional-skip' => "I'm bored already, just install the wiki.",
+ 'config-profile' => 'User rights profile:',
+ 'config-profile-wiki' => 'Traditional wiki',
+ 'config-profile-no-anon' => 'Account creation required',
+ 'config-profile-fishbowl' => 'Authorized editors only',
+ 'config-profile-private' => 'Private wiki',
+ 'config-profile-help' => "Wikis work best when you let as many people edit them as possible.
+In MediaWiki, it is easy to review the recent changes, and to revert any damage that is done by naive or malicious users.
+
+However, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.
+So you have the choice.
+
+A '''{{int:config-profile-wiki}}''' allows anyone to edit, without even logging in.
+A wiki with '''{{int:config-profile-no-anon}}''' provides extra accountability, but may deter casual contributors.
+
+The '''{{int:config-profile-fishbowl}}''' scenario allows approved users to edit, but the public can view the pages, including history.
+A '''{{int:config-profile-private}}''' only allows approved users to view pages, with the same group allowed to edit.
+
+More complex user rights configurations are available after installation, see the [http://www.mediawiki.org/wiki/Manual:User_rights relevant manual entry].",
+ 'config-license' => 'Copyright and license:',
+ 'config-license-none' => 'No license footer',
+ 'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 or later',
+ 'config-license-pd' => 'Public Domain',
+ 'config-license-cc-choose' => 'Select a custom Creative Commons license',
+ 'config-license-help' => "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free license].
+This helps to create a sense of community ownership and encourages long-term contribution.
+It is not generally necessary for a private or corporate wiki.
+
+If you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose '''Creative Commons Attribution Share Alike'''.
+
+The GNU Free Documentation License was the old license Wikipedia was under.
+It is still a valid license, however, this license has some features which make reuse and interpretation difficult.",
+ 'config-email-settings' => 'E-mail settings',
+ 'config-enable-email' => 'Enable outbound e-mail',
+ 'config-enable-email-help' => "If you want e-mail to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.
+If you do not want any e-mail features, you can disable them here.",
+ 'config-email-user' => 'Enable user-to-user e-mail',
+ 'config-email-user-help' => 'Allow all users to send each other e-mail if they have enabled it in their preferences.',
+ 'config-email-usertalk' => 'Enable user talk page notification',
+ 'config-email-usertalk-help' => 'Allow users to receive notifications on user talk page changes, if they have enabled it in their preferences.',
+ 'config-email-watchlist' => 'Enable watchlist notification',
+ 'config-email-watchlist-help' => 'Allow users to receive notifications about their watched pages if they have enabled it in their preferences.',
+ 'config-email-auth' => 'Enable e-mail authentication',
+ 'config-email-auth-help' => "If this option is enabled, users have to confirm their e-mail address using a link sent to them whenever they set or change it.
+Only authenticated e-mail addresses can receive e-mails from other users or change notification e-mails.
+Setting this option is '''recommended''' for public wikis because of potential abuse of the e-mail features.",
+ 'config-email-sender' => 'Return e-mail address:',
+ 'config-email-sender-help' => 'Enter the e-mail address to use as the return address on outbound e-mail.
+This is where bounces will be sent.
+Many mail servers require at least the domain name part to be valid.',
+ 'config-upload-settings' => 'Images and file uploads',
+ 'config-upload-enable' => 'Enable file uploads',
+ 'config-upload-help' => "File uploads potentially expose your server to security risks.
+For more information, read the [http://www.mediawiki.org/wiki/Manual:Security security section] in the manual.
+
+To enable file uploads, change the mode on the <code>images</code> subdirectory under MediaWiki's root directory so that the web server can write to it.
+Then enable this option.",
+ 'config-upload-deleted' => 'Directory for deleted files:',
+ 'config-upload-deleted-help' => 'Choose a directory in which to archive deleted files.
+Ideally, this should not be accessible from the web.',
+ 'config-logo' => 'Logo URL:',
+ 'config-logo-help' => "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.
+Upload an image of the appropriate size, and enter the URL here.
+
+If you do not want a logo, leave this box blank.",
+ 'config-instantcommons' => 'Enable Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [http://commons.wikimedia.org/ Wikimedia Commons] site.
+In order to do this, MediaWiki requires access to the Internet.
+
+For more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].',
+ 'config-cc-error' => 'The Creative Commons license chooser gave no result.
+Enter the license name manually.',
+ 'config-cc-again' => 'Pick again...',
+ 'config-cc-not-chosen' => 'Choose which Creative Commons license you want and click "proceed".',
+ 'config-advanced-settings' => 'Advanced configuration',
+ 'config-cache-options' => 'Settings for object caching:',
+ 'config-cache-help' => 'Object caching is used to improve the speed of MediaWiki by caching frequently used data.
+Medium to large sites are highly encouraged to enable this, and small sites will see benefits as well.',
+ 'config-cache-none' => 'No caching (no functionality is removed, but speed may be impacted on larger wiki sites)',
+ 'config-cache-accel' => 'PHP object caching (APC, eAccelerator, XCache or WinCache)',
+ 'config-cache-memcached' => 'Use Memcached (requires additional setup and configuration)',
+ 'config-memcached-servers' => 'Memcached servers:',
+ 'config-memcached-help' => 'List of IP addresses to use for Memcached.
+Should specify one per line and specify the port to be used. For example:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'You selected Memcached as your cache type but did not specify any servers.',
+ 'config-memcache-badip' => 'You have entered an invalid IP address for Memcached: $1.',
+ 'config-memcache-noport' => 'You did not specify a port to use for Memcached server: $1.
+If you do not know the port, the default is 11211.',
+ 'config-memcache-badport' => 'Memcached port numbers should be between $1 and $2.',
+ 'config-extensions' => 'Extensions',
+ 'config-extensions-help' => 'The extensions listed above were detected in your <code>./extensions</code> directory.
+
+They may require additional configuration, but you can enable them now',
+ 'config-install-alreadydone' => "'''Warning:''' You seem to have already installed MediaWiki and are trying to install it again.
+Please proceed to the next page.",
+ 'config-install-begin' => 'By pressing "{{int:config-continue}}", you will begin the installation of MediaWiki.
+If you still want to make changes, press back.',
+ 'config-install-step-done' => 'done',
+ 'config-install-step-failed' => 'failed',
+ 'config-install-extensions' => 'Including extensions',
+ 'config-install-database' => 'Setting up database',
+ 'config-install-schema' => 'Creating schema',
+ 'config-install-pg-schema-not-exist' => 'PostgreSQL schema does not exist.',
+ 'config-install-pg-schema-failed' => 'Tables creation failed.
+Make sure that the user "$1" can write to the schema "$2".',
+ 'config-install-pg-commit' => 'Committing changes',
+ 'config-install-pg-plpgsql' => 'Checking for language PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'You need to install the language PL/pgSQL in the database $1',
+ 'config-pg-no-create-privs' => 'The account you specified for installation does not have enough privileges to create an account.',
+ 'config-pg-not-in-role' => 'The account you specified for the web user already exists.
+The account you specified for installation is not a superuser and is not a member of the web user\'s role, so it is unable to create objects owned by the web user.
+
+MediaWiki currently requires that the tables be owned by the web user. Please specify another web account name, or click "back" and specify a suitably privileged install user.',
+ 'config-install-user' => 'Creating database user',
+ 'config-install-user-alreadyexists' => 'User "$1" already exists',
+ 'config-install-user-create-failed' => 'Creating user "$1" failed: $2',
+ 'config-install-user-grant-failed' => 'Granting permission to user "$1" failed: $2',
+ 'config-install-user-missing' => 'The specified user "$1" does not exist.',
+ 'config-install-user-missing-create' => 'The specified user "$1" does not exist.
+Please click the "create account" checkbox below if you want to create it.',
+ 'config-install-tables' => 'Creating tables',
+ 'config-install-tables-exist' => "'''Warning''': MediaWiki tables seem to already exist.
+Skipping creation.",
+ 'config-install-tables-failed' => "'''Error''': Table creation failed with the following error: $1",
+ 'config-install-interwiki' => 'Populating default interwiki table',
+ 'config-install-interwiki-list' => 'Could not read file <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Warning''': The interwiki table seems to already have entries.
+Skipping default list.",
+ 'config-install-stats' => 'Initializing statistics',
+ 'config-install-keys' => 'Generating secret keys',
+ 'config-insecure-keys' => "'''Warning:''' {{PLURAL:$2|A secure key|Secure keys}} ($1) generated during installation {{PLURAL:$2|is|are}} not completely safe. Consider changing {{PLURAL:$2|it|them}} manually.",
+ 'config-install-sysop' => 'Creating administrator user account',
+ 'config-install-subscribe-fail' => 'Unable to subscribe to mediawiki-announce: $1',
+ 'config-install-mainpage' => 'Creating main page with default content',
+ 'config-install-extension-tables' => 'Creating tables for enabled extensions',
+ 'config-install-mainpage-failed' => 'Could not insert main page: $1',
+ 'config-install-done' => "'''Congratulations!'''
+You have successfully installed MediaWiki.
+
+The installer has generated a <code>LocalSettings.php</code> file.
+It contains all your configuration.
+
+You will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.
+
+If the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:
+
+$3
+
+'''Note''': If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.
+
+When that has been done, you can '''[$2 enter your wiki]'''.",
+ 'config-download-localsettings' => 'Download LocalSettings.php',
+ 'config-help' => 'help',
+);
+
+/** Message documentation (Message documentation)
+ * @author Dani
+ * @author EugeneZelenko
+ * @author Kghbln
+ * @author McDutchie
+ * @author Nike
+ * @author Platonides
+ * @author Purodha
+ * @author Raymond
+ * @author Siebrand
+ * @author Umherirrender
+ */
+$messages['qqq'] = array(
+ 'config-desc' => '{{desc}}',
+ 'config-title' => 'Parameters:
+* $1 is the version of MediaWiki that is being installed.',
+ 'config-information' => '{{Identical|Information}}',
+ 'config-localsettings-cli-upgrade' => 'Do not translate the <code>LocalSettings.php</code> and the <code>update.php</code> parts.',
+ 'config-session-error' => 'Parameters:
+* $1 is the error that was encountered with the session.',
+ 'config-session-expired' => 'Parameters:
+* $1 is the configured session lifetime.',
+ 'config-back' => '{{Identical|Back}}',
+ 'config-continue' => '{{Identical|Continue}}',
+ 'config-page-language' => '{{Identical|Language}}',
+ 'config-page-name' => '{{Identical|Name}}',
+ 'config-page-options' => '{{Identical|Options}}',
+ 'config-page-install' => '{{Identical|Install}}',
+ 'config-page-copying' => 'This is a link to the full GPL text',
+ 'config-restart' => 'Button text to confirm the installation procedure has to be restarted.',
+ 'config-env-php' => 'Parameters:
+* $1 is the version of PHP that has been installed.',
+ 'config-no-db-help' => 'Parameters:
+* $1 is comma separated list of supported database types by MediaWiki.',
+ 'config-memory-raised' => 'Parameters:
+* $1 is the configured <code>memory_limit</code>.
+* $2 is the value to which <code>memory_limit</code> was raised.',
+ 'config-memory-bad' => 'Parameters:
+* $1 is the configured <code>memory_limit</code>.',
+ 'config-xcache' => 'Message indicates if this program is available',
+ 'config-apc' => 'Message indicates if this program is available',
+ 'config-eaccel' => 'Message indicates if this program is available',
+ 'config-wincache' => 'Message indicates if this program is available',
+ 'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
+ 'config-db-wiki-settings' => 'This is more acurate: "Enter identifying or distinguishing data for this wiki" since a MySQL database can host tables of several wikis.',
+ 'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
+ 'config-support-mysql' => 'Parameters:
+* $1 - a link to the MySQL home page having the anchor text "MySQL".',
+ 'config-support-postgres' => 'Parameters:
+* $1 - a link to the PostgreSQL home page having the anchor text "PostgreSQL".',
+ 'config-support-sqlite' => 'Parameters:
+* $1 - a link to the SQLite home page having the anchor text "SQLite".',
+ 'config-support-oracle' => 'Parameters:
+* $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
+ 'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
+ 'config-can-upgrade' => 'Should we no use an {{int:xxx}} construct for "continue" ?
+
+Parameters:
+* $1 - Version or Revision indicator.',
+ 'config-show-table-status' => '{{doc-important|"SHOW TABLE STATUS" is a MySQL command. Do not translate this.}}',
+ 'config-ns-generic' => '{{Identical|Project}}',
+ 'config-admin-name' => '{{Identical|Your name}}',
+ 'config-admin-password' => '{{Identical|Password}}',
+ 'config-admin-email' => '{{Identical|E-mail address}}',
+ 'config-subscribe' => 'Used as label for the installer checkbox',
+ 'config-profile-help' => 'Messages referenced:
+* {{msg-mw|config-profile-wiki}}
+* {{msg-mw|config-profile-no-anon}}
+* {{msg-mw|config-profile-fishbowl}}
+* {{msg-mw|config-profile-private}}',
+ 'config-upload-help' => 'The word "mode" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.',
+ 'config-logo-help' => '{{doc-important|For languages with right-to-left script, translate "top left corner" as "top right corner".}}',
+ 'config-cc-not-chosen' => 'Do not translate the <code>"proceed".</code> part.
+This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to klick "proceed" so as to return to the MediaWiki installer page.',
+ 'config-extensions' => '{{Identical|Extension}}',
+ 'config-install-step-done' => '{{Identical|Done}}',
+ 'config-install-pg-schema-failed' => 'Parameters:
+* $1 = database user name (usernames in the database are unrelated to wiki user names)
+* $2 =',
+ 'config-install-user' => 'Message indicates that the user is being created',
+ 'config-install-user-grant-failed' => 'Parameters:
+* $1 is the database username for which granting rights failed
+* $2 is the error message',
+ 'config-install-tables' => 'Message indicates that the tables are being created',
+ 'config-install-interwiki' => 'Message indicates that the interwikitables are being populated',
+ 'config-insecure-keys' => 'Parameters:
+* $1 - A list of names of the secret keys that were generated.
+* $2 - the number of items in the list $1, to be used with PLURAL.',
+ 'config-install-sysop' => 'Message indicates that the administrator user account is being created',
+ 'config-install-subscribe-fail' => '{{doc-important|"mediawiki-announce" is the name of a mailing list and should not be translated.}}',
+ 'config-install-done' => 'Parameters:
+* $1 is the URL to LocalSettings download
+* $2 is a link to the wiki.
+* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.',
+ 'config-download-localsettings' => 'The link text used in the download link in config-install-done.',
+ 'config-help' => 'This is used in help boxes.
+{{Identical|Help}}',
+);
+
+/** Magyar (magázó) (Magyar (magázó))
+ * @author Dani
+ * @author Glanthor Reviol
+ */
+$messages['hu-formal'] = array(
+ 'config-localsettings-upgrade' => "'''Figyelmeztetés''': már létezik a <code>LocalSettings.php</code> fájl.
+A szoftver frissíthető.
+Adja meg a <code>\$wgUpgradeKey</code>-ben található kulcsot a beviteli mezőben",
+ 'config-session-expired' => 'Úgy tűnik, hogy a munkamenetadatok lejártak.
+A munkamenetek élettartama a következőre van beállítva: $1.
+Az érték növelhető a php.ini <code>session.gc_maxlifetime</code> beállításának módosításával.
+Indítsa újra a telepítési folyamatot.',
+ 'config-no-session' => 'Elvesztek a munkamenetadatok!
+Ellenőrizze, hogy a php.ini-ben a <code>session.save_path</code> beállítás a megfelelő könyvtárra mutat-e.',
+ 'config-your-language-help' => 'Válassza ki a telepítési folyamat során használandó nyelvet.',
+ 'config-wiki-language-help' => 'Az a nyelv, amin a wiki tartalmának legnagyobb része íródik.',
+ 'config-page-welcome' => 'Üdvözli a MediaWiki!',
+ 'config-help-restart' => 'Szeretné törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?',
+ 'config-welcome' => '=== Környezet ellenőrzése ===
+Alapvető ellenőrzés, ami megmondja, hogy a környezet alkalmas-e a MediaWiki számára.
+Ha probléma merülne fel a telepítés során, meg kell adnia mások számára az alább megjelenő információkat.',
+ 'config-unicode-pure-php-warning' => "'''Figyelmeztetés''': Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz.
+Ha nagy látogatottságú oldalt üzemeltet, itt találhat információkat [http://www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
+ 'config-register-globals' => "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''
+'''Tiltsa le, ha van rá lehetősége.'''
+A MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
+ 'config-imagemagick' => 'Az ImageMagick megtalálható a rendszeren: <code>$1</code>.
+A bélyegképek készítése engedélyezve lesz, ha engedélyezi a feltöltéseket.',
+ 'config-db-name-help' => 'Válassza ki a wikije azonosítására használt nevet.
+Nem tartalmazhat szóközt vagy kötőjelet.
+
+Ha megosztott webtárhelyet használ, a szolgáltatója vagy egy konkrét adatbázisnevet ad önnek használatra, vagy létrehozhat egyet a vezérlőpulton keresztül.',
+ 'config-db-install-help' => 'Adja meg a felhasználónevet és jelszót, amivel a telepítő csatlakozhat az adatbázishoz.',
+ 'config-db-wiki-help' => 'Adja meg azt a felhasználónevet és jelszót, amivel a wiki fog csatlakozni az adatbázishoz működés közben.
+Ha a fiók nem létezik és a telepítést végző fiók rendelkezik megfelelő jogosultsággal, egy új fiók készül a megadott a névvel, azon minimális jogosultságkörrel, ami a wiki működéséhez szükséges.',
+ 'config-charset-help' => "'''Figyelmezetés:''' Ha a '''visszafelé kompatibilis UTF-8''' beállítást használja MySQL 4.1 vagy újabb verziók esetén, és utána a <code>mysqldump</code> programmal készít róla biztonsági másolatot, az tönkreteheti az összes nem ASCII-karaktert, visszafordíthatatlanul károsítva a másolatokban tárolt adatokat!
+
+'''Bináris''' módban a MediaWiki az UTF-8-ban kódolt szöveget bináris mezőkben tárolja az adatbázisban.
+Ez sokkal hatékonyabb a MySQL UTF-8-módjától, és lehetővé teszi, hogy a teljes Unicode-karakterkészletet használja.
+'''UTF-8-módban''' MySQL tudja, hogy milyen karakterkészlettel van kódolva az adat, megfelelően van megjelenítve és konvertálva, de
+nem használhatja a [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] feletti karaktereket.",
+ 'config-db-schema-help' => 'A fenti sémák általában megfelelőek.
+Csak akkor módosítson rajta, ha szükség van rá.',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Nem lehet létrehozni az adatok tárolásához szükséges <code><nowiki>$1</nowiki></code> könyvtárat, mert a webszerver nem írhat a szülőkönyvtárba (<code><nowiki>$2</nowiki></code>).
+
+A telepítő nem tudta megállapíteni, hogy melyik felhasználói fiókon fut a webszerver.
+A folytatáshoz tegye írhatóvá ezen fiók (és más fiókok!) számára a következő könyvtárat: <code><nowiki>$3</nowiki></code>.
+Unix/Linux rendszereken tedd a következőt:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-ns-other' => 'Más (adja meg)',
+ 'config-admin-name-blank' => 'Adja meg az adminisztrátor felhasználónevét!',
+ 'config-admin-name-invalid' => 'A megadott felhasználónév (<nowiki>$1</nowiki>) érvénytelen.
+Adjon meg egy másik felhasználónevet.',
+ 'config-admin-password-blank' => 'Adja meg az adminisztrátori fiók jelszavát!',
+ 'config-instantcommons-help' => 'Az [http://www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [http://commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.
+A használatához a MediaWikinek internethozzáférésre van szüksége.
+
+A funkcióról és hogy hogyan állítható be más wikik esetén [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.',
+ 'config-install-done' => "'''Gratulálunk!'''
+Sikeresen telepítette a MediaWikit.
+
+A telepítő készített egy <code>LocalSettings.php</code> fájlt.
+Ez tartalmazza az összes beállítást.
+
+[$1 Le kell töltenie], és el kell helyeznie a MediaWiki telepítési könyvtárába (az a könyvtár, ahol az index.php van).
+'''Megjegyzés''': Ha ezt most nem teszi meg, és kilép, a generált fájl nem lesz elérhető a későbbiekben.
+
+Ha ezzel készen van, '''[$2 beléphet a wikibe]'''.",
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ */
+$messages['af'] = array(
+ 'config-desc' => 'Die Installasieprogram vir MediaWiki',
+ 'config-title' => 'Installasie MediaWiki $1',
+ 'config-information' => 'Inligting',
+ 'config-localsettings-key' => 'Opgradeer-sleutel:',
+ 'config-localsettings-badkey' => 'Die sleutel wat u verskaf het is verkeerd.',
+ 'config-session-error' => 'Fout met begin van sessie: $1',
+ 'config-no-session' => "U sessiedata is verlore!
+Kontroleer u php.ini en maak seker dat <code>session.save_path</code> na 'n geldige gids wys.",
+ 'config-your-language' => 'U taal:',
+ 'config-your-language-help' => "Kies 'n taal om tydens die installasieproses te gebruik.",
+ 'config-wiki-language' => 'Wiki se taal:',
+ 'config-wiki-language-help' => 'Kies die taal waarin die wiki hoofsaaklik geskryf sal word.',
+ 'config-back' => '↠Terug',
+ 'config-continue' => 'Gaan voort →',
+ 'config-page-language' => 'Taal',
+ 'config-page-welcome' => 'Welkom by MediaWiki!',
+ 'config-page-dbconnect' => 'Konnekteer na die databasis',
+ 'config-page-upgrade' => "Opgradeer 'n bestaande installasie",
+ 'config-page-dbsettings' => 'Databasis-instellings',
+ 'config-page-name' => 'Naam',
+ 'config-page-options' => 'Opsies',
+ 'config-page-install' => 'Installeer',
+ 'config-page-complete' => 'Voltooi!',
+ 'config-page-restart' => 'Herbegin installasie',
+ 'config-page-readme' => 'Lees my',
+ 'config-page-releasenotes' => 'Vrystellingsnotas',
+ 'config-page-copying' => 'Besig met kopiëring',
+ 'config-page-upgradedoc' => 'Besig met opgradering',
+ 'config-page-existingwiki' => 'Bestaande wiki',
+ 'config-restart' => 'Ja, herbegin dit',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki tuisblad]
+* [http://www.mediawiki.org/wiki/Help:Contents Gebruikershandleiding] (Engelstalig)
+* [http://www.mediawiki.org/wiki/Manual:Contents Administrateurshandleiding] (Engelstalig)
+* [http://www.mediawiki.org/wiki/Manual:FAQ Algemene vrae] (Engelstalig)
+----
+* <doclink href=Readme>Lees my</doclink>
+* <doclink href=ReleaseNotes>Vrystellingsnotas</doclink>
+* <doclink href=Copying>Kopiëring</doclink>
+* <doclink href=UpgradeDoc>Opgradering</doclink>',
+ 'config-env-good' => 'Die omgewing is gekontroleer.
+U kan MediaWiki installeer.',
+ 'config-env-bad' => 'Die omgewing is gekontroleer.
+U kan nie MediaWiki installeer nie.</span>',
+ 'config-env-php' => 'PHP $1 is tans geïnstalleer.',
+ 'config-no-db' => "Kon nie 'n geskikte databasisdrywer vind nie!",
+ 'config-memory-raised' => 'PHP se <code>memory_limit</code> is $1, en is verhoog tot $2.',
+ 'config-memory-bad' => "'''Waarskuwing:''' PHP se <code>memory_limit</code> is $1.
+Dit is waarskynlik te laag.
+Die installasie mag moontlik faal!",
+ 'config-xcache' => '[Http://trac.lighttpd.net/xcache/ XCache] is geïnstalleer',
+ 'config-apc' => '[Http://www.php.net/apc APC] is geïnstalleer',
+ 'config-eaccel' => '[Http://eaccelerator.sourceforge.net/ eAccelerator] is geïnstalleer',
+ 'config-wincache' => '[Http://www.iis.net/download/WinCacheForPhp WinCache] is geïnstalleer',
+ 'config-diff3-bad' => 'GNU diff3 nie gevind nie.',
+ 'config-db-type' => 'Databasistipe:',
+ 'config-db-host' => 'Databasisbediener:',
+ 'config-db-host-oracle' => 'Databasis-TNS:',
+ 'config-db-wiki-settings' => 'Identifiseer hierdie wiki',
+ 'config-db-name' => 'Databasisnaam:',
+ 'config-db-name-oracle' => 'Databasis-skema:',
+ 'config-db-install-account' => 'Gebruiker vir die installasie',
+ 'config-db-username' => 'Databasis gebruikersnaam:',
+ 'config-db-password' => 'Databasis wagwoord:',
+ 'config-db-prefix' => 'Voorvoegsel vir databasistabelle:',
+ 'config-db-charset' => 'Karakterstelsel vir databasis',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-mysql-old' => 'U moet MySQL $1 of later gebruik.
+U gebruik tans $2.',
+ 'config-db-port' => 'Databasispoort:',
+ 'config-db-schema' => 'Skema vir MediaWiki',
+ 'config-sqlite-dir' => 'Gids vir SQLite se data:',
+ 'config-oracle-def-ts' => 'Standaard tabelruimte:',
+ 'config-oracle-temp-ts' => 'Tydelike tabelruimte:',
+ 'config-header-mysql' => 'MySQL-instellings',
+ 'config-header-postgres' => 'PostgreSQL-instellings',
+ 'config-header-sqlite' => 'SQLite-instellings',
+ 'config-header-oracle' => 'Oracle-instellings',
+ 'config-invalid-db-type' => 'Ongeldige databasistipe',
+ 'config-missing-db-name' => 'U moet \'n waarde vir "Databasnaam" verskaf',
+ 'config-sqlite-readonly' => 'Die lêer <code>$1</code> kan nie geskryf word nie.',
+ 'config-sqlite-cant-create-db' => 'Kon nie databasislêer <code>$1</code> skep nie.',
+ 'config-regenerate' => 'Herskep LocalSettings.php →',
+ 'config-show-table-status' => 'Die uitvoer van SHOW TABLE STATUS het gefaal!',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-binary' => 'Binêr',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Naam van die wiki:',
+ 'config-site-name-blank' => "Verskaf 'n naam vir u webwerf.",
+ 'config-project-namespace' => 'Projeknaamruimte:',
+ 'config-ns-generic' => 'Projek',
+ 'config-ns-site-name' => 'Dieselfde as die wiki: $1',
+ 'config-ns-other' => 'Ander (spesifiseer)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-admin-box' => 'Administrateur se gebruiker',
+ 'config-admin-name' => 'U naam:',
+ 'config-admin-password' => 'Wagwoord:',
+ 'config-admin-password-confirm' => 'Wagwoord weer:',
+ 'config-admin-password-blank' => "Verskaf 'n wagwoord vir die administrateur in.",
+ 'config-admin-password-same' => 'Die wagwoord mag nie dieselfde as die gebruikersnaam wees nie.',
+ 'config-admin-password-mismatch' => 'Die twee wagwoorde wat u ingetik het stem nie ooreen nie.',
+ 'config-admin-email' => 'E-posadres:',
+ 'config-optional-continue' => 'Vra my meer vrae.',
+ 'config-optional-skip' => 'Ek is reeds verveeld, installeer maar net die wiki.',
+ 'config-profile-wiki' => 'Tradisionele wiki',
+ 'config-profile-no-anon' => 'Skep van gebruiker is verpligtend',
+ 'config-profile-fishbowl' => 'Slegs vir gemagtigde redaksie',
+ 'config-profile-private' => 'Privaat wiki',
+ 'config-license' => 'Kopiereg en lisensie:',
+ 'config-license-none' => 'Geen lisensie in die onderskrif',
+ 'config-license-pd' => 'Publieke Domein',
+ 'config-license-cc-choose' => "Kies 'n Creative Commons-lisensie",
+ 'config-email-settings' => 'E-posinstellings',
+ 'config-email-sender' => 'E-posadres vir antwoorde:',
+ 'config-upload-settings' => 'Oplaai van beelde en lêer',
+ 'config-upload-enable' => 'Aktiveer die oplaai van lêers',
+ 'config-upload-deleted' => 'Gids vir verwyderde lêers:',
+ 'config-logo' => 'URL vir logo:',
+ 'config-cc-again' => 'Kies weer...',
+ 'config-advanced-settings' => 'Gevorderde konfigurasie',
+ 'config-memcached-servers' => 'Memcached-bedieners:',
+ 'config-extensions' => 'Uitbreidings',
+ 'config-install-step-done' => 'gedoen',
+ 'config-install-step-failed' => 'het misluk',
+ 'config-install-extensions' => 'Insluitende uitbreidings',
+ 'config-install-database' => 'Stel die databasis op',
+ 'config-install-pg-schema-failed' => 'Die skep van tabelle het gefaal.
+Maak seker dat die gebruiker "$1" na skema "$2" mag skryf.',
+ 'config-install-pg-commit' => 'Wysigings word gestoor',
+ 'config-pg-no-plpgsql' => 'U moet die taal PL/pgSQL in die database $1 installeer',
+ 'config-install-user' => 'Besig om die databasisgebruiker te skep',
+ 'config-install-user-grant-failed' => 'Die toekenning van regte aan gebruiker "$1" het gefaal: $2',
+ 'config-install-tables' => 'Skep tabelle',
+ 'config-install-tables-exist' => "'''Waarskuwing''': Dit lyk of MediaWiki se tabelle reeds bestaan.
+Die skep van tabelle word oorgeslaan.",
+ 'config-install-tables-failed' => "'''Fout''': die skep van 'n tabel het gefaal met die volgende fout: $1",
+ 'config-install-interwiki' => 'Besig om data in die interwiki-tabel in te laai',
+ 'config-install-interwiki-list' => 'Kon nie die lêer <code>interwiki.list</code> vind nie.',
+ 'config-install-interwiki-exists' => "'''Waarskuwing''': Die interwiki-tabel bevat reeds inskrywings.
+Die standaardlys word oorgeslaan.",
+ 'config-install-keys' => 'Genereer geheime sleutel',
+ 'config-install-sysop' => "Skep 'n gebruiker vir die administrateur",
+ 'config-install-mainpage' => 'Skep die hoofblad met standaard inhoud',
+ 'config-install-mainpage-failed' => 'Kon nie die hoofblad laai nie: $1',
+ 'config-install-done' => "'''Veels geluk!'''
+U het MediaWiki suksesvol geïnstalleer.
+
+Die installeerder het 'n <code>LocalSettings.php</code> lêer opgestel.
+Dit bevat al u instellings.
+
+U sal dit moet [$1 aflaai] en dit in die hoofgids van u wiki-installasie plaas; in dieselfde gids as index.php.
+'''Let wel''': As u dit nie nou doen nie, sal die gegenereerde konfigurasielêer nie later meer beskikbaar wees nadat u die installasie afgesluit het nie.
+
+As dit gedoen is, kan u '''[u $2 wiki besoek]'''.",
+ 'config-download-localsettings' => 'Laai LocalSettings.php af',
+ 'config-help' => 'hulp',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ */
+$messages['ar'] = array(
+ 'config-type-mysql' => 'ماي إس كيو إل',
+ 'config-type-postgres' => 'بوستجر إس كيو إل',
+ 'config-type-sqlite' => 'إس كيو لايت',
+ 'config-type-oracle' => 'أوراكل',
+);
+
+/** Aramaic (ÜܪܡÜÜ)
+ * @author Basharh
+ */
+$messages['arc'] = array(
+ 'config-information' => 'Üܕ̈ܥܬÜ',
+ 'config-your-language' => 'Ü Ü«Ü¢Ü Ü•ÜÜ ÜŸ:',
+ 'config-wiki-language' => 'Ü Ü«Ü¢Ü Ü•Ü˜ÜÜ©Ü:',
+ 'config-page-language' => 'Ü Ü«Ü¢Ü',
+ 'config-page-name' => 'Ü«Ü¡Ü',
+ 'config-page-options' => 'Ü“Ü’Üܬ̈Ü',
+ 'config-page-install' => 'ܢܨܘܒ',
+ 'config-ns-other-default' => 'ܘÜÜ©Ü Ü•ÜÜ Ü',
+ 'config-admin-box' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü•Ü’ÜªÜ¢Ü',
+ 'config-admin-name' => 'Ü«Ü¡Ü Ü•ÜÜ ÜŸ:',
+ 'config-admin-password' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü:',
+ 'config-admin-password-confirm' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢Ü¬Ü ÜܚܪܬÜ:',
+ 'config-admin-email' => 'Ü¦ÜªÜ«Ü“Ü¢Ü Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ:',
+ 'config-profile-private' => 'ܘÜÜ©Ü Ü¦ÜªÜ¨Ü˜Ü¦ÜÜ',
+ 'config-email-settings' => 'ܛܘÜÜ’ÌˆÜ Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (‪БеларуÑÐºÐ°Ñ (тарашкевіца)‬)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Wizardist
+ * @author Zedlik
+ */
+$messages['be-tarask'] = array(
+ 'config-desc' => 'Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ MediaWiki',
+ 'config-title' => 'УÑталÑваньне MediaWiki $1',
+ 'config-information' => 'ІнфармацыÑ',
+ 'config-localsettings-upgrade' => 'Ð’Ñ‹Ñўлены файл <code>LocalSettings.php</code>.
+Каб абнавіць гÑтае уÑталÑваньне, калі лаÑка, увÑдзіце значÑньне <code>$wgUpgradeKey</code> у полі ніжÑй.
+Яго можна знайÑьці Ñž LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Быў знойдзены файл LocalSettings.php.
+Каб зьмÑніць гÑтае ÑžÑталÑваньне, калі лаÑка, запуÑьціце update.php',
+ 'config-localsettings-key' => 'Ключ палÑпшÑньнÑ:',
+ 'config-localsettings-badkey' => 'Пададзены Вамі ключ зьÑўлÑецца нÑÑлушным',
+ 'config-upgrade-key-missing' => 'Ð’Ñ‹Ñўленае Ñ–Ñнуючае ÑžÑталÑваньне MediaWiki.
+Каб абнавіць гÑтае ÑžÑталÑваньне, калі лаÑка, уÑтаўце наÑтупны радок у канец Вашага LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'ВыглÑдае, што Ñ–Ñнуючы LocalSettings.php зьÑўлÑецца нÑпоўным.
+Ðе ÑžÑÑ‚Ð°Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ Ð¿ÐµÑ€Ð°Ð¼ÐµÐ½Ð½Ð°Ñ $1.
+Калі лаÑка, зьмÑніце LocalSettings.php так, каб была ÑžÑÑ‚Ð°Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ Ð³ÑÑ‚Ð°Ñ Ð¿ÐµÑ€Ð°Ð¼ÐµÐ½Ð½Ð°Ñ, Ñ– націÑьніце «ПрацÑгваць».',
+ 'config-localsettings-connection-error' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· базай зьвеÑтак з выкарыÑтаньнем наладаў, пазначаных у LocalSettings.php ці AdminSettings.php. Калі лаÑка, выпраўце гÑÑ‚Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ Ñ– паÑпрабуйце зноў.
+
+$1',
+ 'config-session-error' => 'Памылка ÑтварÑÐ½ÑŒÐ½Ñ ÑÑÑÑ–Ñ–: $1',
+ 'config-session-expired' => 'СкончыўÑÑ Ñ‚Ñрмін дзеÑÐ½ÑŒÐ½Ñ Ð·ÑŒÐ²ÐµÑтак ÑÑÑÑ–Ñ–.
+СÑÑÑ–Ñ Ð¼Ð°Ðµ абмежаваны Ñ‚Ñрмін у $1.
+Ð’Ñ‹ можаце павÑлічыць Ñго, зьмÑніўшы парамÑтар <code>session.gc_maxlifetime</code> у php.ini.
+ПеразапуÑьціце праграму ÑžÑталÑваньнÑ.',
+ 'config-no-session' => 'ЗьвеÑткі ÑÑÑÑ–Ñ– згубленыÑ!
+Праверце php.ini Ñ– ўпÑўніцеÑÑ, што ÑžÑтаноўлены Ñлушны шлÑÑ… у <code>session.save_path</code>.',
+ 'config-your-language' => 'Ð’Ð°ÑˆÐ°Ñ Ð¼Ð¾Ð²Ð°:',
+ 'config-your-language-help' => 'Выберыце мову Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑталÑваньнÑ.',
+ 'config-wiki-language' => 'Мова вікі:',
+ 'config-wiki-language-help' => 'Выберыце мову, на Ñкой пераважна будзе піÑацца зьмеÑÑ‚ у вікі.',
+ 'config-back' => '↠Ðазад',
+ 'config-continue' => 'Далей →',
+ 'config-page-language' => 'Мова',
+ 'config-page-welcome' => 'Вітаем у MediaWiki!',
+ 'config-page-dbconnect' => 'ПадключÑньне да базы зьвеÑтак',
+ 'config-page-upgrade' => 'Ðбнавіць Ñ–Ñнуючую ÑžÑтаноўку',
+ 'config-page-dbsettings' => 'Ðалады базы зьвеÑтак',
+ 'config-page-name' => 'Ðазва',
+ 'config-page-options' => 'Ðалады',
+ 'config-page-install' => 'УÑталÑваць',
+ 'config-page-complete' => 'Зроблена!',
+ 'config-page-restart' => 'Пачаць уÑталÑваньне зноў',
+ 'config-page-readme' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі',
+ 'config-page-releasenotes' => 'Заўвагі да выпуÑку',
+ 'config-page-copying' => 'КапіÑваньне',
+ 'config-page-upgradedoc' => 'Ðбнаўленьне',
+ 'config-page-existingwiki' => 'ІÑÐ½ÑƒÑŽÑ‡Ð°Ñ Ð²Ñ–ÐºÑ–',
+ 'config-help-restart' => 'Ці жадаеце выдаліць уÑе ÑžÐ²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі Ñ– пачаць працÑÑ ÑƒÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð·Ð½Ð¾Ñž?',
+ 'config-restart' => 'Так, пачаць зноў',
+ 'config-welcome' => '== Праверка аÑÑÑ€Ð¾Ð´Ð·ÑŒÐ´Ð·Ñ ==
+Праверка патрÑÐ±Ð½Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑўніваньнÑ, што гÑтае аÑÑродзьдзе Ñлушнае Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ MediaWiki.
+Вам патрÑбна будзе падаць уÑе вынікі праверкі, калі ÑпатрÑбіцца дапамога Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑталÑваньнÑ.',
+ 'config-copyright' => "== ÐўтарÑкае права Ñ– ўмовы ==
+
+$1
+
+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 <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online].",
+ 'config-sidebar' => '* [http://www.mediawiki.org ХатнÑÑ Ñтаронка MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Даведка Ð´Ð»Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ñž]
+* [http://www.mediawiki.org/wiki/Manual:Contents Даведка Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Ðдказы на чаÑÑ‚Ñ‹Ñ Ð¿Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ–]
+----
+* <doclink href=Readme>Прачытайце</doclink>
+* <doclink href=ReleaseNotes>ПалÑпшÑньні Ñž вÑÑ€ÑÑ–Ñ–</doclink>
+* <doclink href=Copying>КапіÑваньне</doclink>
+* <doclink href=UpgradeDoc>Ðбнаўленьне</doclink>',
+ 'config-env-good' => 'ÐÑÑродзьдзе было праверанае.
+Ð’Ñ‹ можаце ÑžÑталёўваць MediaWiki.',
+ 'config-env-bad' => 'ÐÑÑродзьдзе было праверанае.
+УÑталÑваньне MediaWiki немагчымае.',
+ 'config-env-php' => 'УÑталÑваны PHP $1.',
+ 'config-env-php-toolow' => 'УÑталÑваны PHP $1.
+Ðле MediaWiki патрабуе PHP вÑÑ€ÑÑ–Ñ– $2 ці навейшай.',
+ 'config-unicode-using-utf8' => 'ВыкарыÑтоўваецца бібліÑÑ‚Ñка Unicode-нармалізацыі БраÑна ВібÑра',
+ 'config-unicode-using-intl' => 'ВыкарыÑтоўваецца [http://pecl.php.net/intl intl пашырÑньне з PECL] Ð´Ð»Ñ Unicode-нармалізацыі',
+ 'config-unicode-pure-php-warning' => "'''ПапÑÑ€Ñджаньне''': [http://pecl.php.net/intl ПашырÑньне intl з PECL] — Ð½Ñ Ñлушнае Ð´Ð»Ñ Unicode-нармалізацыі, цÑпер выкарыÑтоўваецца Ð¼Ð°Ñ€ÑƒÐ´Ð½Ð°Ñ PHP-Ñ€ÑалізацыÑ.
+Калі Ñž Ð’Ð°Ñ Ñайт з выÑокай наведваемаÑьцю, раім пачытаць пра [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-нармалізацыю].",
+ 'config-unicode-update-warning' => "'''ПапÑÑ€Ñджаньне''': уÑталÑÐ²Ð°Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ Ð±Ñ–Ð±Ð»Ñ–ÑÑ‚Ñкі Ð´Ð»Ñ Unicode-нармалізацыі выкарыÑтоўвае ÑаÑтарÑлую вÑÑ€ÑÑ–ÑŽ бібліÑÑ‚Ñкі з [http://site.icu-project.org/ праекту ICU].
+Раім [http://www.mediawiki.org/wiki/Unicode_normalization_considerations абнавіць], калі ваш Ñайт будзе працаваць зь Unicode.",
+ 'config-no-db' => 'Ðемагчыма знайÑьці Ñлушны драйвÑÑ€ базы зьвеÑтак!',
+ 'config-no-db-help' => 'Вам Ñ‚Ñ€Ñба ÑžÑталÑваць драйвÑÑ€ базы зьвеÑтак Ð´Ð»Ñ PHP.
+Падтрымліваюцца наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ‚Ñ‹Ð¿Ñ‹ базаў зьвеÑтак: $1.
+
+Калі вы выкарыÑтоўваеце агульны хоÑтынг, запытайцеÑÑ Ñž Ñвайго хоÑтынг-правайдÑра наконт уÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµÐ¼Ð°Ð³Ð° драйвÑÑ€ базы зьвеÑтак.
+Калі Ð’Ñ‹ кампілÑвалі PHP ÑамаÑтойна, пераканфігуруйце Ñ– ÑабÑрыце Ñго з уключаным кліентам базаў зьвеÑтак, напрыклад, <code>./configure --with-mysql</code>.
+Калі Ð’Ñ‹ ÑžÑталёўвалі PHP з Debian/Ubuntu-Ñ€ÑпазытарыÑ, то вам Ñ‚Ñ€Ñба ÑžÑталÑваць дадаткова пакет <code>php5-mysql</code>',
+ 'config-no-fts3' => "'''ПапÑÑ€Ñджаньне''': SQLite Ñтвораны без Ð¼Ð¾Ð´ÑƒÐ»Ñ [http://sqlite.org/fts3.html FTS3], Ð´Ð»Ñ Ð³Ñтага ўнутранага інтÑрфÑйÑу Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ даÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьць пошуку.",
+ 'config-register-globals' => "'''ПапÑÑ€Ñджаньне: ÑƒÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ PHP <code>[http://php.net/register_globals register_globals]</code>.'''
+'''Ðдключыце Ñе, калі можаце.'''
+MediaWiki будзе працаваць, але гÑта панізіць узровень бÑÑьпекі ÑÑрвÑра.",
+ 'config-magic-quotes-runtime' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: ÑƒÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''
+ГÑÑ‚Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ Ð¿Ñуе ўводны паток зьвеÑтак непрадказальным чынам.
+ПрацÑг уÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð°Ð»ÑŒÐ±Ð¾ выкарыÑтаньне MediaWiki без адключÑÐ½ÑŒÐ½Ñ Ð³Ñтай опцыі немагчымыÑ.",
+ 'config-magic-quotes-sybase' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ñ€Ñжым [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] уключаны!'''
+ГÑÑ‚Ñ‹ Ñ€Ñжым шкодзіць ÑƒÐ²Ð°Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі непрадказальным чынам.
+ПрацÑг уÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð°Ð»ÑŒÐ±Ð¾ выкарыÑтаньне MediaWiki немагчымыÑ, пакуль Ñ€Ñжым Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ выключаны.",
+ 'config-mbstring' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ñ€Ñжым [http://www.php.net/manual/en/ref.info.php#mbstring.overload mbstring.func_overload] уключаны!'''
+ГÑÑ‚Ñ‹ Ñ€Ñжым выклікае памылкі Ñ– можа шкодзіць зьвеÑткі непрадказальным чынам.
+ПрацÑг уÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð°Ð»ÑŒÐ±Ð¾ выкарыÑтаньне MediaWiki немагчымыÑ, пакуль Ñ€Ñжым Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ выключаны.",
+ 'config-ze1' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ñ€Ñжым [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] уключаны!'''
+ГÑÑ‚Ð°Ñ Ñ€Ñжым Ñтварае вÑÐ»Ñ–ÐºÑ–Ñ Ð¿Ñ€Ð°Ð±Ð»ÐµÐ¼Ñ‹ Ñž працы MediaWiki.
+ПрацÑг уÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð°Ð»ÑŒÐ±Ð¾ выкарыÑтаньне MediaWiki немагчымыÑ, пакуль Ñ€Ñжым Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ выключаны.",
+ 'config-safe-mode' => "'''ПапÑÑ€Ñджаньне:''' [http://www.php.net/features.safe-mode бÑÑьпечны Ñ€Ñжым] PHP уключаны.
+ГÑта можа выклікаць праблемы, галоўным чынам Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð°Ðº файлаў Ñ– Ñž падтрымцы <code>math</code>.",
+ 'config-xml-bad' => 'ÐÑ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹ модуль XML Ð´Ð»Ñ PHP.
+MediaWiki патрÑÐ±Ð½Ñ‹Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ– з гÑтага модулю, таму MediaWiki Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ працаваць у гÑтай канфігурацыі.
+Калі Ð’Ñ‹ выкарыÑтоўваеце Mandrake, уÑталюйце пакет php-xml.',
+ 'config-pcre' => 'ÐÑ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹ модуль падтрымкі PCRE.
+MediaWiki Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ патрабуюцца функцыі Ñ€ÑгулÑрных выразаў у Ñтылі Perl.',
+ 'config-pcre-no-utf8' => "'''ÐšÑ€Ñ‹Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°''': модуль PCRE Ð´Ð»Ñ PHP ÑкампілÑваны без падтрымкі PCRE_UTF8.
+MediaWiki патрабуе падтрымкі UTF-8 Ð´Ð»Ñ Ñлушнай працы.",
+ 'config-memory-raised' => 'Ðбмежаваньне на даÑтупную Ð´Ð»Ñ PHP памÑць <code>memory_limit</code> было падвышанае з $1 да $2.',
+ 'config-memory-bad' => "'''ПапÑÑ€Ñджаньне:''' памер PHP <code>memory_limit</code> Ñкладае $1.
+Верагодна, гÑта вельмі мала.
+УÑталÑваньне можа быць нÑўдалым!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] уÑталÑваны',
+ 'config-apc' => '[http://www.php.net/apc APC] уÑталÑваны',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] уÑталÑваны',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] уÑталÑваны',
+ 'config-no-cache' => "'''ПапÑÑ€Ñджаньне:''' немагчыма знайÑьці [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] ці [http://www.iis.net/download/WinCacheForPhp WinCache].
+Ðб’ектнае кÑшаваньне Ð½Ñ ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ðµ.",
+ 'config-diff3-bad' => 'GNU diff3 Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹.',
+ 'config-imagemagick' => 'Знойдзены ImageMagick: <code>$1</code>.
+ПаÑÑŒÐ»Ñ ÑžÐºÐ»ÑŽÑ‡ÑÐ½ÑŒÐ½Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð°Ðº будзе ўключанае маштабаваньне выÑваў.',
+ 'config-gd' => 'GD падтрымліваецца ўбудавана.
+ПаÑÑŒÐ»Ñ ÑžÐºÐ»ÑŽÑ‡ÑÐ½ÑŒÐ½Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð°Ðº будзе ўключанае маштабаваньне выÑваў.',
+ 'config-no-scaling' => 'ÐÑ– GD, ні ImageMagick Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹Ñ.
+Маштабаваньне выÑваў будзе адключанае.',
+ 'config-no-uri' => "'''Памылка:''' Ðе магчыма вызначыць цÑперашні URI.
+УÑталÑваньне Ñпыненае.",
+ 'config-uploads-not-safe' => "'''ПапÑÑ€Ñджаньне:''' дырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð°Ðº па змоўчваньні <code>$1</code> ÑƒÑ€Ð°Ð·ÑŒÐ»Ñ–Ð²Ð°Ñ Ð´Ð° Ð²Ñ‹ÐºÐ°Ð½Ð°Ð½ÑŒÐ½Ñ Ð°Ð´Ð²Ð¾Ð»ÑŒÐ½Ð°Ð³Ð° коду.
+Хоць MediaWiki Ñ– правÑрае ÑžÑе файлы перад захаваньнем, вельмі Ñ€ÑкамÑндуецца [http://www.mediawiki.org/wiki/Manual:Security#Upload_security закрыць гÑтую ўразьліваÑьць] перад уключÑньнем магчымаÑьці загрузкі файлаў.",
+ 'config-brokenlibxml' => 'У Вашай ÑÑ‹ÑÑ‚Ñме ÑžÑталÑÐ²Ð°Ð½Ñ‹Ñ PHP Ñ– libxml2 зь неÑумÑшчальнымі вÑÑ€ÑÑ–Ñмі, што можа прывеÑьці да Ð¿Ð°ÑˆÐºÐ¾Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð·ÑŒÐ²ÐµÑтак MediaWiki Ñ– іншых ÑžÑб-даÑтаÑаваньнÑÑž.
+Ðбнавіце PHP да вÑÑ€ÑÑ–Ñ– 5.2.9 ці болей позьнÑй, а libxml2 да 2.7.3 ці болей позьнÑй ([http://bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на Ñайце PHP]).
+УÑталÑваньне перарванае.',
+ 'config-using531' => 'PHP $1 не ÑумÑшчальнае з MediaWiki з-за памылкі Ñž перадачы парамÑтраў па ўказальніку да <code>__call()</code>.
+Ðбнавіце PHP да вÑÑ€ÑÑ–Ñ– 5.3.2 ці болей позьнÑй, ці адкаціце да вÑÑ€ÑÑ–Ñ– 5.3.0 каб гÑта выправіць.
+УÑталÑваньне перарванае.',
+ 'config-db-type' => 'Тып базы зьвеÑтак:',
+ 'config-db-host' => 'ХоÑÑ‚ базы зьвеÑтак:',
+ 'config-db-host-help' => 'Калі ÑÑрвÑÑ€ Вашай базы зьвеÑтак знаходзіцца на іншым ÑÑрвÑры, увÑдзіце тут Ñ–Ð¼Ñ Ñ…Ð¾Ñта ці IP-адраÑ.
+
+Калі Ð’Ñ‹ набываеце shared-хоÑтынг, Ваш хоÑтынг-правайдÑÑ€ муÑіць даць Вам Ñлушнае Ñ–Ð¼Ñ Ñ…Ð¾Ñта базы зьвеÑтак у Ñваёй дакумÑнтацыі.
+
+Калі Ð’Ñ‹ уÑталёўваеце ÑÑрвÑÑ€ Windows з выкарыÑтаньнем MySQL, выкарыÑтаньне «localhost» можа не працаваць Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ñ‹ ÑÑрвÑра. У гÑтым выпадку паÑпрабуйце пазначыць «127.0.0.1» Ð´Ð»Ñ Ð»Ñкальнага IP-адраÑа.',
+ 'config-db-host-oracle' => 'TNS базы зьвеÑтак:',
+ 'config-db-host-oracle-help' => 'УвÑдзіце Ñлушнае [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm лÑкальнае Ñ–Ð¼Ñ Ð·Ð»ÑƒÑ‡ÑньнÑ]; файл tnsnames.ora павінен быць бачным Ð´Ð»Ñ Ð³Ñтага ÑžÑталÑваньнÑ.<br />Калі Ð’Ñ‹ выкарыÑтоўваеце ÐºÐ»Ñ–ÐµÐ½Ñ†ÐºÑ–Ñ Ð±Ñ–Ð±Ð»Ñ–ÑÑ‚Ñкі 10g ці больш новыÑ, Ð’Ñ‹ можаце такÑама выкарыÑтоўваць мÑтад Ð½Ð°Ð´Ð°Ð½ÑŒÐ½Ñ Ð½Ð°Ð·Ð²Ð°Ñž [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm лёгкае злучÑньне].',
+ 'config-db-wiki-settings' => 'ІдÑÐ½Ñ‚Ñ‹Ñ„Ñ–ÐºÐ°Ñ†Ñ‹Ñ Ð³Ñтай вікі',
+ 'config-db-name' => 'Ðазва базы зьвеÑтак:',
+ 'config-db-name-help' => 'Выберыце Ñ–Ð¼Ñ Ð´Ð»Ñ Ð²Ñ‹Ð·Ð½Ð°Ñ‡ÑÐ½ÑŒÐ½Ñ Ð’Ð°ÑˆÐ°Ð¹ вікі.
+Яно Ð½Ñ Ð¼ÑƒÑіць зьмÑшчаць прагалаў.
+
+Калі Ð’Ñ‹ набываеце shared-хоÑтынг, Ваш хоÑтынг-правайдÑÑ€ муÑіць надаць Вам ці пÑўнае Ñ–Ð¼Ñ Ð±Ð°Ð·Ñ‹ зьвеÑтак Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑтаньнÑ, ці магчымаÑьць Ñтвараць базы зьвеÑтак праз кантрольную панÑль.',
+ 'config-db-name-oracle' => 'Схема базы зьвеÑтак:',
+ 'config-db-account-oracle-warn' => 'ІÑнуюць тры ÑцÑнары ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Oracle Ñк базы зьвеÑтак Ð´Ð»Ñ MediaWiki:
+
+Калі Ð’Ñ‹ жадаеце Ñтварыць рахунак базы зьвеÑтак Ñк чаÑтку працÑÑу ÑžÑталÑваньнÑ, калі лаÑка, падайце рахунак з ролÑй SYSDBA Ñк рахунак базы зьвеÑтак Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ñ– пазначце Ð¿Ð°Ð¶Ð°Ð´Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹ рахунку з доÑтупам да ІнтÑрнÑту, у адваротным выпадку Ð’Ñ‹ можаце такÑама Ñтварыць рахунак з доÑтупам да ІнтÑрнÑту ўручную Ñ– падаць толькі гÑÑ‚Ñ‹ рахунак (калі патрабуюцца правы Ð´Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñхемы аб’ектаў) ці падайце два розных рахункі, адзін з правамі на ÑтварÑньне Ñ– адзін з абмежаваньнÑмі Ð´Ð»Ñ Ð´Ð¾Ñтупу да ІнтÑрнÑту.
+
+Скрыпт Ð´Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ з патрабуемымі правамі можна знайÑьці Ñž дырÑкторыі гÑтага ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Â«maintenance/oracle/». ПамÑтайце, што выкарыÑтаньне рахунку з абмежаваньнÑмі адключыць уÑе Ð¿Ð°Ð´Ñ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°ÐµÐ¼Ñ‹Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьці даÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð¿Ð° змоўчваньні.',
+ 'config-db-install-account' => 'Ð†Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ð´Ð»Ñ ÑžÑталÑваньнÑ',
+ 'config-db-username' => 'Ð†Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка базы зьвеÑтак:',
+ 'config-db-password' => 'Пароль базы зьвеÑтак:',
+ 'config-db-password-empty' => 'Калі лаÑка, увÑдзіце пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð°Ð³Ð° карыÑтальніка базы зьвеÑтак: $1.
+Магчыма Ñтварыць карыÑтальніка без паролю, але гÑта небÑÑьпечна.',
+ 'config-db-install-username' => 'УвÑдзіце Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка, Ñкое будзе выкарыÑтоўвацца Ð´Ð»Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· базай зьвеÑтак Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑталÑваньнÑ. ГÑта не назва рахунку MediaWiki; гÑта Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Вашай базы зьвеÑтак.',
+ 'config-db-install-password' => 'УвÑдзіце пароль, Ñкі будзе выкарыÑтоўвацца Ð´Ð»Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· базай зьвеÑтак Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑталÑваньнÑ. ГÑта не пароль рахунку MediaWiki; гÑта пароль Вашай базы зьвеÑтак.',
+ 'config-db-install-help' => 'УвÑдзіце Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– пароль, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ выкарыÑÑ‚Ð°Ð½Ñ‹Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð´Ð° базы зьвеÑтак Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð¿Ñ€Ð°Ñ†ÑÑу ÑžÑталÑваньнÑ.',
+ 'config-db-account-lock' => 'ВыкарыÑтоўваць Ñ‚Ñ‹Ñ Ð¶ Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– пароль паÑÑŒÐ»Ñ ÑžÑталÑваньнÑ',
+ 'config-db-wiki-account' => 'Ð†Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹',
+ 'config-db-wiki-help' => 'УвÑдзіце Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– пароль, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ выкарыÑÑ‚Ð°Ð½Ñ‹Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð´Ð° базы зьвеÑтак Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ (паÑÑŒÐ»Ñ ÑžÑталÑваньнÑ).
+Калі рахунак Ð½Ñ Ñтвораны, а рахунак Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð¼Ð°Ðµ Ð·Ð½Ð°Ñ‡Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹, гÑÑ‚Ñ‹ рахунак будзе Ñтвораны зь мінімальна патрÑбнымі Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ вікі правамі.',
+ 'config-db-prefix' => 'ПрÑÑ„Ñ–ÐºÑ Ñ‚Ð°Ð±Ð»Ñ–Ñ†Ð°Ñž базы зьвеÑтак:',
+ 'config-db-prefix-help' => 'Калі Ð’Ñ‹ разьдзÑлÑеце адну базу зьвеÑтак паміж некалькімі вікі, ці паміж MediaWiki Ñ– іншым вÑб-даÑтаÑаваньнем, можаце вызначыць прÑÑ„Ñ–ÐºÑ Ð½Ð°Ð·Ð²Ð°Ñž табліцаў Ð´Ð»Ñ Ð¿Ð°Ð·ÑŒÐ±ÑÐ³Ð°Ð½ÑŒÐ½Ñ ÐºÐ°Ð½Ñ„Ð»Ñ–ÐºÑ‚Ð°Ñž.
+ПазьбÑгайце прагалаў.
+
+ГÑтае поле звычайна пакідаецца пуÑтым.',
+ 'config-db-charset' => 'Кадаваньне базы зьвеÑтак',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 UTF-8 з адваротнай ÑумÑшчальнаÑьцю',
+ 'config-charset-help' => "'''ПапÑÑ€Ñджаньне:''' калі Ð’Ñ‹ выкарыÑтоўваеце '''UTF-8 з адваротнай ÑумÑшчальнаÑьцю''' на MySQL 4.1+ Ñ– зробіце Ñ€ÑзÑрвовую копію праз <code>mysqldump</code>, ён можа зьнішчыць уÑе не-ASCII-Ñымбалі беÑпаваротна!
+
+У '''бінарным (binary)''' Ñ€Ñжыме MediaWiki захоўвае Ñ‚ÑкÑÑ‚Ñ‹ Ñž UTF-8 у палёх тыпу binary.
+ГÑÑ‚Ñ‹ Ñ€Ñжым болей ÑÑ„Ñктыўны за Ñ€Ñжым MySQL UTF-8 Ñ– дазвалÑе выкарыÑтоўваць увеÑÑŒ абÑÑг ÑымбалÑÑž Unicode.
+У Ñ€Ñжыме '''UTF-8''' MySQL будзе ведаць, у Ñкім кадаваньне Ð’Ñ‹ зьмÑшчаеце зьвеÑткі, Ñ– будзе вÑртаць Ñ–Ñ… у адпаведным кадаваньні,
+але MySQL Ð½Ñ Ð¼Ð¾Ð¶Ð° ўтрымліваць Ñымбалі па-за [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Стандартным шматмоўным плаÑтом] ÑымбалÑÑž Unicode.",
+ 'config-mysql-old' => 'Патрабуецца MySQL $1 ці навейшаÑ, уÑталÑÐ²Ð°Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ $2.',
+ 'config-db-port' => 'Порт базы зьвеÑтак:',
+ 'config-db-schema' => 'Схема Ð´Ð»Ñ MediaWiki',
+ 'config-db-schema-help' => 'ГÑÑ‚Ð°Ñ Ñхема ÑÐ»ÑƒÑˆÐ½Ð°Ñ Ñž большаÑьці выпадкаў.
+ЗьмÑнÑйце Ñе толькі тады, калі Ð’Ñ‹ ведаеце, што гÑта неабходна.',
+ 'config-sqlite-dir' => 'ДырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ Ð·ÑŒÐ²ÐµÑтак SQLite:',
+ 'config-sqlite-dir-help' => "SQLite захоўвае ÑžÑе зьвеÑткі Ñž адзіным файле.
+
+ÐŸÐ°Ð´Ð°Ð´Ð·ÐµÐ½Ð°Ñ Ð’Ð°Ð¼Ñ– дырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ Ð¿Ð°Ð²Ñ–Ð½Ð½Ð° быць даÑтупнай да запіÑу вÑб-ÑÑрвÑрам Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑталÑваньнÑ.
+
+Яна '''нÑ''' муÑіць быць даÑтупнай праз Сеціва, воÑÑŒ чаму мы не захоўваем Ñе Ñž адным меÑцы з файламі PHP.
+
+Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð° Ñтворыць файл <code>.htaccess</code>, але калі ён не выкарыÑтоўваецца, хто заўгодна зможа атрымаць зьвеÑткі з базы зьвеÑтак.
+ГÑта ўключае Ñк Ð¿Ñ€Ñ‹Ð²Ð°Ñ‚Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі ўдзельнікаў (адраÑÑ‹ Ñлектроннай пошты, Ñ…Ñшы паролÑÑž), гÑтак Ñ– Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ– Ñтаронак Ñ– Ñ–Ð½ÑˆÑ‹Ñ Ð·ÑŒÐ²ÐµÑткі, доÑтуп да Ñкіх маецца абмежаваны.
+
+Падумайце над тым, каб зьмÑшчаць базу зьвеÑтак у іншым меÑцы, напрыклад у <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'ПраÑтора табліцаў па змоўчваньні:',
+ 'config-oracle-temp-ts' => 'ЧаÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ñтора табліцаў:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki падтрымлівае наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÑÑ‹ÑÑ‚Ñмы базаў зьвеÑтак:
+
+$1
+
+Калі Ð’Ñ‹ Ð½Ñ Ð±Ð°Ñ‡Ñ‹Ñ†Ðµ ÑÑ‹ÑÑ‚Ñму базаў зьвеÑтак, Ñкую Ð’Ñ‹ Ñпрабуеце выкарыÑтоўваць Ñž ÑьпіÑе ніжÑй, перайдзіце па ÑпаÑылцы інÑтрукцыі, ÑÐºÐ°Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñ–Ñ†Ñ†Ð° ніжÑй, каб уключыць падтрымку.',
+ 'config-support-mysql' => '* $1 зьÑўлÑецца галоўнай мÑтай MediaWiki Ñ– падтрымліваецца лепей за ÑžÑÑ‘ ([http://www.php.net/manual/en/mysql.installation.php Ñк кампілÑваць PHP з падтрымкай MySQL])',
+ 'config-support-postgres' => '* $1 — вÑÐ´Ð¾Ð¼Ð°Ñ ÑÑ‹ÑÑ‚Ñма базы зьвеÑтак з адкрытым кодам, ÑÐºÐ°Ñ Ð·ÑŒÑўлÑецца альтÑрнатывай MySQL ([http://www.php.net/manual/en/pgsql.installation.php Ñк кампілÑваць PHP з падтрымкай PostgreSQL]). Яна можа ўтрымліваць Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÑ–, Ñ– не Ñ€ÑкамÑндуецца выкарыÑтоўваць Ñе Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†ÑƒÑŽÑ‡Ñ‹Ñ… праектаў.',
+ 'config-support-sqlite' => '* $1 — невÑÐ»Ñ–ÐºÐ°Ñ ÑÑ‹ÑÑ‚Ñма базы зьвеÑтак, ÑÐºÐ°Ñ Ð¼Ð°Ðµ вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php Ñк кампілÑваць PHP з падтрымкай SQLite], выкарыÑтоўвае PDO)',
+ 'config-support-oracle' => '* $1 зьÑўлÑецца камÑрцыйнай прафÑÑійнай базай зьвеÑтак. ([http://www.php.net/manual/en/oci8.installation.php Як ÑкампілÑваць PHP з падтрымкай OCI8])',
+ 'config-header-mysql' => 'Ðалады MySQL',
+ 'config-header-postgres' => 'Ðалады PostgreSQL',
+ 'config-header-sqlite' => 'Ðалады SQLite',
+ 'config-header-oracle' => 'Ðалады Oracle',
+ 'config-invalid-db-type' => 'ÐÑÑлушны тып базы зьвеÑтак',
+ 'config-missing-db-name' => 'Ð’Ñ‹ павінны ўвеÑьці значÑньне парамÑтру Â«Ð†Ð¼Ñ Ð±Ð°Ð·Ñ‹ зьвеÑтак»',
+ 'config-missing-db-host' => 'Ð’Ñ‹ павінны ўвеÑьці значÑньне парамÑтру «ХоÑÑ‚ базы зьвеÑтак»',
+ 'config-missing-db-server-oracle' => 'Ð’Ñ‹ павінны ўвеÑьці значÑньне парамÑтру «TNS базы зьвеÑтак»',
+ 'config-invalid-db-server-oracle' => 'ÐÑÑлушнае TNS базы зьвеÑтак «$1».
+Ðазва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), Ñымбалі падкрÑÑьліваньнÑ(_) Ñ– кропкі (.).',
+ 'config-invalid-db-name' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° базы зьвеÑтак «$1».
+Ðазва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), Ñымбалі падкрÑÑьліваньнÑ(_) Ñ– працÑжнікі (-).',
+ 'config-invalid-db-prefix' => 'ÐÑÑлушны прÑÑ„Ñ–ÐºÑ Ð±Ð°Ð·Ñ‹ зьвеÑтак «$1».
+Ðн можа зьмÑшчаць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), Ñымбалі падкрÑÑÑŒÐ»Ñ–Ð²Ð°Ð½ÑŒÐ½Ñ (_) Ñ– працÑжнікі (-).',
+ 'config-connection-error' => '$1.
+
+Праверце хоÑÑ‚, Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– пароль ніжÑй Ñ– паÑпрабуйце зноў.',
+ 'config-invalid-schema' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ñхема Ð´Ð»Ñ MediaWiki «$1».
+ВыкарыÑтоўвайце толькі ASCII-літары (a-z, A-Z), лічбы (0-9) Ñ– Ñымбалі падкрÑÑÑŒÐ»Ñ–Ð²Ð°Ð½ÑŒÐ½Ñ (_).',
+ 'config-db-sys-create-oracle' => 'Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ð´Ñ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ толькі выкарыÑтаньне рахунку SYSDBA Ð´Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ð½Ð¾Ð²Ð°Ð³Ð° рахунку.',
+ 'config-db-sys-user-exists-oracle' => 'Рахунак карыÑтальніка «$1» ужо Ñ–Ñнуе. SYSDBA можа выкарыÑтоўвацца толькі Ð´Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ð½Ð¾Ð²Ñ‹Ñ… рахункаў!',
+ 'config-postgres-old' => 'Патрабуецца PostgreSQL $1 ці навейшаÑ, уÑталÑÐ²Ð°Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ $2.',
+ 'config-sqlite-name-help' => 'Выберыце назву, ÑÐºÐ°Ñ Ð±ÑƒÐ´Ð·Ðµ ідÑнтыфікаваць Вашую вікі.
+Ðе выкарыÑтоўвайце прагалы ці злучкі.
+Ðазва будзе выкарыÑтоўвацца Ñž назьве файла зьвеÑтак SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Ðемагчыма Ñтварыць дырÑкторыю зьвеÑтак <code><nowiki>$1</nowiki></code>, таму што бацькоўÑÐºÐ°Ñ Ð´Ñ‹Ñ€ÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ <code><nowiki>$2</nowiki></code> Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð°Ð´ запіÑаў вÑб-ÑÑрвÑра.
+
+Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ñ‹Ð»Ð° карыÑтальніка, Ñкі запуÑьціў вÑб-ÑÑрвÑÑ€.
+Дазвольце запіÑÑ‹ Ñž дырÑкторыю <code><nowiki>$3</nowiki></code> Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñгу.
+У ÑÑ‹ÑÑ‚Ñме Unix/Linux зрабіце:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Ðемагчыма Ñтварыць дырÑкторыю зьвеÑтак <code><nowiki>$1</nowiki></code>, таму што бацькоўÑÐºÐ°Ñ Ð´Ñ‹Ñ€ÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ <code><nowiki>$2</nowiki></code> Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð°Ð´ запіÑаў вÑб-ÑÑрвÑра.
+
+Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ñ‹Ð»Ð° карыÑтальніка, Ñкі запуÑьціў вÑб-ÑÑрвÑÑ€.
+Дазвольце Ñму (Ñ– іншым) запіÑÑ‹ Ñž дырÑкторыю <code><nowiki>$3</nowiki></code> Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñгу.
+У ÑÑ‹ÑÑ‚Ñме Unix/Linux зрабіце:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Памылка Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ð´Ñ‹Ñ€Ñкторыі «$1».
+Праверце шлÑÑ… Ñ– паÑпрабуйце зноў.',
+ 'config-sqlite-dir-unwritable' => 'Ð—Ð°Ð¿Ñ–Ñ Ñƒ дырÑкторыю «$1» немагчымы.
+ЗьмÑніце налады доÑтупу, каб вÑб-ÑÑрвÑÑ€ меў правы на запіÑ, Ñ– паÑпрабуйце зноў.',
+ 'config-sqlite-connection-error' => '$1.
+
+Праверце дырÑкторыю Ð´Ð»Ñ Ð·ÑŒÐ²ÐµÑтак, назву базы зьвеÑтак Ñ– паÑпрабуйце зноў.',
+ 'config-sqlite-readonly' => 'Файл <code>$1</code> недаÑтупны Ð´Ð»Ñ Ð·Ð°Ð¿Ñ–Ñу.',
+ 'config-sqlite-cant-create-db' => 'Ðемагчыма Ñтварыць файл базы зьвеÑтак <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP бракуе падтрымкі FTS3 — табліцы пагаршаюцца',
+ 'config-can-upgrade' => "У гÑтай базе зьвеÑтак Ñ‘Ñьць табліцы MediaWiki.
+Каб абнавіць Ñ–Ñ… да MediaWiki $1, націÑьніце '''ПрацÑгнуць'''.",
+ 'config-upgrade-done' => "Ðбнаўленьне завершанае.
+
+ЦÑпер Ð’Ñ‹ можаце [$1 пачаць выкарыÑтаньне вікі].
+
+Калі Ð’Ñ‹ жадаеце Ñ€ÑгенÑраваць <code>LocalSettings.php</code>, націÑьніце кнопку ніжÑй.
+ГÑтае дзеÑньне '''не Ñ€ÑкамÑндуецца''', калі Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ праблемаў у працы вікі.",
+ 'config-upgrade-done-no-regenerate' => 'Ðбнаўленьне Ñкончанае.
+
+ЦÑпер Ð’Ñ‹ можаце [$1 пачаць працу з вікі].',
+ 'config-regenerate' => 'РÑгенÑраваць LocalSettings.php →',
+ 'config-show-table-status' => "Запыт 'SHOW TABLE STATUS' не атрымаўÑÑ!",
+ 'config-unknown-collation' => "'''ПапÑÑ€Ñджаньне:''' база зьвеÑтак выкарыÑтоўвае нераÑпазнанае ÑупаÑтаўленьне.",
+ 'config-db-web-account' => 'Рахунак базы зьвеÑтак Ð´Ð»Ñ Ð²Ñб-доÑтупу',
+ 'config-db-web-help' => 'Выберыце Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– пароль, Ñкі выкарыÑтоўваецца вÑб-ÑÑрвÑрам Ð´Ð»Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· ÑÑрвÑрам базы зьвеÑтак, Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ… апÑрацыÑÑž вікі.',
+ 'config-db-web-account-same' => 'ВыкарыÑтоўваць той жа рахунак, што Ð´Ð»Ñ ÑžÑталÑваньнÑ',
+ 'config-db-web-create' => 'Стварыць рахунак, калі ён ÑÑˆÑ‡Ñ Ð½Ðµ Ñ–Ñнуе',
+ 'config-db-web-no-create-privs' => 'Рахунак, Ñкі Ð’Ñ‹ пазначылі Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð½Ñ Ð¼Ð°Ðµ правоў Ð´Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ.
+Рахунак, Ñкі Ð’Ñ‹ пазначылі тут, муÑіць ужо Ñ–Ñнаваць.',
+ 'config-mysql-engine' => 'Рухавік Ñховішча:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' — звычайна найбольш Ñлушны варыÑнт, таму што добра падтрымлівае паралелізм.
+
+'''MyISAM''' можа быць хутчÑйшай у вікі з адным удзельнікам, ці толькі Ð´Ð»Ñ Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ.
+Базы зьвеÑтак на MyISAM вÑÐ´Ð¾Ð¼Ñ‹Ñ Ñ‚Ñ‹Ð¼, што Ñž Ñ–Ñ… зьвеÑткі шкодзÑцца нашмат чаÑьцей за InnoDB.",
+ 'config-mysql-charset' => 'Кадаваньне базы зьвеÑтак:',
+ 'config-mysql-binary' => 'Двайковае',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "У '''двайковым Ñ€Ñжыме''', MediaWiki захоўвае Ñ‚ÑкÑÑ‚ у кадаваньні UTF-8 у базе зьвеÑтак у двайковых палÑÑ….
+ГÑта болей ÑÑ„Ñктыўна за Ñ€Ñжым MySQL UTF-8, Ñ– дазвалÑе Вам выкарыÑтоўваць увеÑÑŒ дыÑпазон ÑымбалÑÑž Unicode.
+
+У '''Ñ€Ñжыме UTF-8''', MySQL ведае, ÑÐºÐ°Ñ Ñ‚Ð°Ð±Ð»Ñ–Ñ†Ñ‹ ÑымбалÑÑž выкарыÑтоўваецца Ñž Вашых зьвеÑтках, Ñ– можа адпаведна прадÑтаўлÑць Ñ– канвÑртаваць Ñ–Ñ…, але гÑта не дазволіць Вам захоўваць Ñымбалі па-за межамі [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыÑпазону].",
+ 'config-site-name' => 'Ðазва вікі:',
+ 'config-site-name-help' => 'Ðазва будзе паказвацца Ñž загалоўку браўзÑра Ñ– Ñž некаторых іншых меÑцах.',
+ 'config-site-name-blank' => 'УвÑдзіце назву Ñайта.',
+ 'config-project-namespace' => 'ПраÑтора назваў праекту:',
+ 'config-ns-generic' => 'Праект',
+ 'config-ns-site-name' => 'Ð¢Ð°ÐºÐ°Ñ Ð¶, Ñк Ñ– назва вікі: $1',
+ 'config-ns-other' => 'Ð†Ð½ÑˆÐ°Ñ (вызначце)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => "Па прыкладу ВікіпÑдыі, ÑˆÐ¼Ð°Ñ‚Ð»Ñ–ÐºÑ–Ñ Ð²Ñ–ÐºÑ– трымаюць улаÑÐ½Ñ‹Ñ Ñтаронкі з правіламі аÑобна ад Ñтаронак Ñа зьмеÑтам, у «'''праÑторы назваў праекту'''».
+УÑе назвы Ñтаронак у гÑтай праÑторы назваў пачынаюцца з прыÑтаўкі, Ñкую Ð’Ñ‹ можаце пазначыць тут.
+Традыцыйна, гÑÑ‚Ð°Ñ Ð¿Ñ€Ñ‹Ñтаўка Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ð½Ð°Ñ Ð°Ð´ назвы вікі, Ñле Ñна Ð½Ñ Ð¼Ð¾Ð¶Ð° ўтрымліваць Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ñымбалі, Ñ‚Ð°ÐºÑ–Ñ Ñк «#» ці «:».",
+ 'config-ns-invalid' => 'ÐŸÐ°Ð´Ð°Ð´Ð·ÐµÐ½Ð°Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð¿Ñ€Ð°Ñтора назваў «<nowiki>$1</nowiki>».
+Падайце іншую праÑтору назваў праекту.',
+ 'config-ns-conflict' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð¿Ñ€Ð°Ñтора назваў «<nowiki>$1</nowiki>» канфліктуе з праÑторай назваў MediaWiki па змоўчваньні.
+Пазначце іншую праÑтору назваў праекту.',
+ 'config-admin-box' => 'Рахунак адмініÑтратара',
+ 'config-admin-name' => 'Вашае імÑ:',
+ 'config-admin-password' => 'Пароль:',
+ 'config-admin-password-confirm' => 'Пароль ÑÑˆÑ‡Ñ Ñ€Ð°Ð·:',
+ 'config-admin-help' => 'УвÑдзіце тут Вашае Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°, напрыклад «Янка Кавалевіч».
+ГÑтае Ñ–Ð¼Ñ Ð±ÑƒÐ´Ð·Ðµ выкарыÑтоўвацца Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ Ñž вікі.',
+ 'config-admin-name-blank' => 'УвÑдзіце Ñ–Ð¼Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратара.',
+ 'config-admin-name-invalid' => 'Пададзенае нÑÑлушнае Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° «<nowiki>$1</nowiki>».
+Падайце іншае Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°.',
+ 'config-admin-password-blank' => 'УвÑдзіце пароль рахунку адмініÑтратара.',
+ 'config-admin-password-same' => 'Пароль Ð½Ñ Ð¼Ð¾Ð¶Ð° быць аднолькавым зь іменем удзельніка.',
+ 'config-admin-password-mismatch' => 'Ð£Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– паролі не Ñупадаюць.',
+ 'config-admin-email' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
+ 'config-admin-email-help' => 'УвÑдзіце тут Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты, каб атрымліваць ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹ ад іншых удзельнікаў вікі, Ñкідваць Ваш пароль Ñ– атрымліваць абвешчаньні пра зьмены Ñтаронак, ÑÐºÑ–Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñцца Ñž Вашым ÑьпіÑе назіраньнÑ. Ð’Ñ‹ можаце пакінуць гÑтае поле пуÑтым.',
+ 'config-admin-error-user' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ адмініÑтратара зь іменем «<nowiki>$1</nowiki>».',
+ 'config-admin-error-password' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑтаноўкі паролю Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратара «<nowiki>$1</nowiki>»: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Ð’Ñ‹ ўвÑлі нÑÑлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+ 'config-subscribe' => 'ПадпіÑацца на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ÑÑŒÐ¿Ñ–Ñ Ñ€Ð°ÑпаўÑÑŽÐ´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð½Ð°Ð²Ñ–Ð½Ð°Ñž пра зьÑўленьне новых вÑÑ€ÑÑ–ÑÑž].',
+ 'config-subscribe-help' => 'ГÑта Ð½Ñ Ð²ÐµÐ»ÑŒÐ¼Ñ– актыўны ÑÑŒÐ¿Ñ–Ñ Ñ€Ð°ÑпаўÑÑŽÐ´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð½Ð°Ð²Ñ–Ð½Ð°Ñž пра зьÑўленьне новых вÑÑ€ÑÑ–ÑÑž, Ñкі ўключаючы Ð²Ð°Ð¶Ð½Ñ‹Ñ Ð½Ð°Ð²Ñ–Ð½Ñ‹ пра бÑÑьпеку.
+Вам неабходна падпіÑацца на Ñго Ñ– абнавіць Вашае ÑžÑталÑваньне MediaWiki, калі зьÑвÑцца Ð½Ð¾Ð²Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–.',
+ 'config-almost-done' => 'Ð’Ñ‹ амаль што Ñкончылі!
+ÐÑÑ‚Ð°Ñ‚Ð½Ñ–Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ можна прапуÑьціць Ñ– пачаць уÑталÑваньне вікі.',
+ 'config-optional-continue' => 'Задаць болей пытаньнÑÑž.',
+ 'config-optional-skip' => 'Хопіць, проÑта ÑžÑталÑваць вікі.',
+ 'config-profile' => 'Профіль правоў удзельніка:',
+ 'config-profile-wiki' => 'Ð¢Ñ€Ð°Ð´Ñ‹Ñ†Ñ‹Ð¹Ð½Ð°Ñ Ð²Ñ–ÐºÑ–',
+ 'config-profile-no-anon' => 'ПатрÑбнае ÑтварÑньне рахунку',
+ 'config-profile-fishbowl' => 'Толькі Ð´Ð»Ñ Ð°ÑžÑ‚Ð°Ñ€Ñ‹Ð·Ð°Ð²Ð°Ð½Ñ‹Ñ… Ñ€Ñдактараў',
+ 'config-profile-private' => 'ÐŸÑ€Ñ‹Ð²Ð°Ñ‚Ð½Ð°Ñ Ð²Ñ–ÐºÑ–',
+ 'config-profile-help' => "Вікі працуюць лепей, калі Ð’Ñ‹ дазвалÑеце Ñк мага большай колькаÑьці людзей Ñ€Ñдагаваць Ñе.
+У MediaWiki вельмі лёгка праглÑдаць Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ Ñ– выпраўлÑць Ð»ÑŽÐ±Ñ‹Ñ Ð¿Ð°ÑˆÐºÐ¾Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ– Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð½ÐµÐ´Ð°Ñьведчанымі ўдзельнікамі альбо вандаламі.
+
+Тым Ð½Ñ Ð¼ÐµÐ½Ñˆ, Ð¼Ð½Ð¾Ð³Ñ–Ñ Ð»Ñ–Ñ‡Ð°Ñ†ÑŒ, што MediaWiki можа быць карыÑнай Ñž шматлікіх іншых ролÑÑ…, Ñ– чаÑта вельмі нÑлёгка раÑтлумачыць уÑім перавагі выкарыÑÑ‚Ð°Ð½ÑŒÐ½Ñ Ñ‚ÑхналёгіÑÑž вікі.
+Таму Вы маеце выбар.
+
+'''{{int:config-profile-wiki}}''' дазвалÑе Ñ€Ñдагаваць уÑім, нават без уваходу Ñž ÑÑ‹ÑÑ‚Ñму.
+Вікі з '''{{int:config-profile-no-anon}}''' дазвалÑе дадатковую адказнаÑьць, але можа адштурхнуць некаторых патÑнцыйных удзельнікаў.
+
+СцÑнар '''{{int:config-profile-fishbowl}}''' дазвалÑе Ñ€Ñдагаваць зацьверджаным удзельнікам, але ÑžÑе могуць праглÑдаць Ñтаронкі Ñ–Ñ… гіÑторыю.
+'''{{int:config-profile-private}}''' дазвалÑе праглÑдаць Ñ– Ñ€Ñдагаваць Ñтаронкі толькі зацьверджаным удзельнікам.
+
+Больш ÑÐºÐ»Ð°Ð´Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹ ўдзельнікаў даÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð¿Ð°ÑÑŒÐ»Ñ ÑžÑталÑваньнÑ, глÑдзіце [http://www.mediawiki.org/wiki/Manual:User_rights адпаведную Ñтаронку дакумÑнтацыі].",
+ 'config-license' => 'ÐўтарÑÐºÑ–Ñ Ð¿Ñ€Ð°Ð²Ñ‹ Ñ– ліцÑнзіÑ:',
+ 'config-license-none' => 'Без інфармацыі пра ліцÑнзію',
+ 'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 ці болей позьнÑÑ',
+ 'config-license-pd' => 'Грамадзкі набытак',
+ 'config-license-cc-choose' => 'Выберыце іншую ліцÑнзію Creative Commons',
+ 'config-license-help' => "Ð¨Ð¼Ð°Ñ‚Ð»Ñ–ÐºÑ–Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ‚Ñ‹Ñ Ð²Ñ–ÐºÑ– разьмÑшчаюць унёÑкі на ўмовах ліцÑнзіі [http://freedomdefined.org/Definition вольнай ліцÑнзіі].
+ГÑта дазвалÑе Ñтвараць ÑÑÐ½Ñ Ñупольнай улаÑнаÑьці Ñ– Ñадзейнічае доўгатÑрміновым унёÑкам.
+ГÑта не неабходна Ð´Ð»Ñ Ð¿Ñ€Ñ‹Ð²Ð°Ñ‚Ð½Ñ‹Ñ… Ñ– карпаратыўных вікі.
+
+Калі Ð’Ñ‹ жадаеце выкарыÑтоўваць Ñ‚ÑкÑÑ‚ з ВікіпÑдыі, Ñ– жадаеце каб ВікіпÑÐ´Ñ‹Ñ Ð¼Ð°Ð³Ð»Ð° прынімаць Ñ‚ÑкÑÑ‚ ÑкапіÑваны з Вашай вікі, Вам неабходна выбраць ліцÑнзію '''Creative Commons Attribution Share Alike'''.
+
+Раней ВікіпÑÐ´Ñ‹Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹Ñтоўвала ліцÑнзію GNU Free Documentation. Яна ÑžÑÑ‘ ÑÑˆÑ‡Ñ Ð´Ð·ÐµÐ¹Ð½Ñ–Ñ‡Ð°Ðµ, але Ñна ўтрымлівае Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð¼Ð¾Ð¼Ð°Ð½Ñ‚Ñ‹, ÑÐºÑ–Ñ ÑžÑкладнÑюць паўторнае выкарыÑтоўваньне Ñ– інтÑрпрÑтацыю матÑрыÑлаў.",
+ 'config-email-settings' => 'Ðалады Ñлектроннай пошты',
+ 'config-enable-email' => 'Дазволіць выходзÑÑ‡Ñ‹Ñ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹',
+ 'config-enable-email-help' => 'Калі Ð’Ñ‹ жадаеце, каб працавала ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð°, неабходна Ñканфігураваць PHP [http://www.php.net/manual/en/mail.configuration.php адпаведным чынам].
+Калі Ð’Ñ‹ не жадаеце выкарыÑтоўваць магчымаÑьці Ñлектроннай пошты, Ð’Ñ‹ можаце Ñе адключыць.',
+ 'config-email-user' => 'Дазволіць Ñлектронную пошту Ð´Ð»Ñ ÑувÑзі паміж удзельнікамі',
+ 'config-email-user-help' => 'Дазволіць уÑім удзельнікам даÑылаць адзін аднаму ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹, калі ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ð°Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьць Ñž Ñ–Ñ… наладах.',
+ 'config-email-usertalk' => 'Уключыць абвÑшчÑньні пра паведамленьні на Ñтаронцы абмеркаваньнÑ',
+ 'config-email-usertalk-help' => 'ДазвалÑе ўдзельнікам атрымліваць абвÑшчÑньні пра зьмены на Ñтаронцы абмеркаваньнÑ, калі гÑÑ‚Ð°Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьць ÑƒÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ñž Ñ–Ñ… наладах.',
+ 'config-email-watchlist' => 'Уключыць абвÑшчÑньні пра зьмены Ñž ÑьпіÑе назіраньнÑ',
+ 'config-email-watchlist-help' => 'ДазвалÑе ўдзельнікам атрымліваць абвÑшчÑньні пра зьмены Ñž Ñ–Ñ… ÑьпіÑе назіраньнÑ, калі гÑÑ‚Ð°Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьць ÑƒÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ñž Ñ–Ñ… наладах.',
+ 'config-email-auth' => 'Уключыць аўтÑнтыфікацыю праз Ñлектронную пошту',
+ 'config-email-auth-help' => "Калі гÑÑ‚Ð°Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьць уключанаÑ, удзельнікі павінны пацьвердзіць Ñ–Ñ… Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты праз ÑпаÑылку, ÑÐºÐ°Ñ Ð´Ð°Ñылаецца ім праз Ñлектронную пошту. Яна даÑылаецца Ñ– Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ адраÑу Ñлектроннай пошты.
+Толькі аўтÑÐ½Ñ‚Ñ‹Ñ„Ñ–ÐºÐ°Ð²Ð°Ð½Ñ‹Ñ Ð°Ð´Ñ€Ð°ÑÑ‹ Ñлектроннай пошты могуць атрымліваць ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹ ад іншых удзельнікаў, ці зьмÑнÑць абвÑшчÑньні даÑÑ‹Ð»Ð°ÐµÐ¼Ñ‹Ñ Ð¿Ñ€Ð°Ð· Ñлектронную пошту.
+УключÑньне гÑтай магчымаÑьці '''Ñ€ÑкамÑндуецца''' Ð´Ð»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ‚Ñ‹Ñ… вікі, з-за магчымых злоўжываньнÑÑž магчымаÑьцÑмі Ñлектроннай пошты.",
+ 'config-email-sender' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты Ð´Ð»Ñ Ð²ÑртаньнÑ:',
+ 'config-email-sender-help' => 'УвÑдзіце Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ð´Ð»Ñ Ð²ÑÑ€Ñ‚Ð°Ð½ÑŒÐ½Ñ Ñž ÑкаÑьці адраÑу даÑылаемых Ñлектронных ліÑтоў.
+Сюды будуць даÑылацца Ð½ÐµÐ°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½Ñ‹Ñ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹.
+Ð¨Ð¼Ð°Ñ‚Ð»Ñ–ÐºÑ–Ñ Ð¿Ð°ÑˆÑ‚Ð¾Ð²Ñ‹Ñ ÑÑрвÑры патрабуюць, каб Ñ…Ð°Ñ†Ñ Ð± назва дамÑну была Ñлушнай.',
+ 'config-upload-settings' => 'Загрузкі выÑваў Ñ– файлаў',
+ 'config-upload-enable' => 'Дазволіць загрузку файлаў',
+ 'config-upload-help' => 'Дазвол загрузкі файлаў можа патÑнцыйна пагражаць бÑÑьпекі ÑÑрвÑра.
+Дадатковую інфармацыю можна атрымаць Ñž [http://www.mediawiki.org/wiki/Manual:Security разьдзеле бÑÑьпекі].
+
+Каб дазволіць загрузку файлаў, зьмÑніце Ñ€Ñжым падкаталёга <code>images</code> у карÑннай дырÑкторыі MediaWiki так, каб ÑžÑб-ÑÑрвÑÑ€ меў доÑтуп на запіÑ.
+Потым дазвольце гÑтую магчымаÑьць.',
+ 'config-upload-deleted' => 'ДырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ Ð´Ð»Ñ Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ… файлаў:',
+ 'config-upload-deleted-help' => 'Выберыце дырÑкторыю, у Ñкой будуць захоўвацца Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹.
+У ідÑальным выпадку, Ñна не павінна мець доÑтупу з ІнтÑрнÑту.',
+ 'config-logo' => 'URL-Ð°Ð´Ñ€Ð°Ñ Ð»Ñгатыпу:',
+ 'config-logo-help' => 'Ðфармленьне MediaWiki па змоўчваньні уключае праÑтору Ð´Ð»Ñ Ð»Ñгатыпу памерам 135×160 пікÑÑлÑÑž у верхнім левым куце.
+Загрузіце выÑву адпаведнага памеру, Ñ– увÑдзіце тут URL-адраÑ.
+
+Калі Ð’Ñ‹ не жадаеце мець ніÑкага лÑгатыпу, пакіньце гÑтае поле пуÑтым.',
+ 'config-instantcommons' => 'Дазволіць Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымаÑьць, ÑÐºÐ°Ñ Ð´Ð°Ð·Ð²Ð°Ð»Ñе вікі выкарыÑтоўваць выÑвы, гукі Ñ– Ñ–Ð½ÑˆÑ‹Ñ Ð¼ÑдыÑ, ÑÐºÑ–Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñцца на Ñайце [http://commons.wikimedia.org/ Wikimedia Commons].
+Каб гÑта зрабіць, MediaWiki патрабуе доÑтупу да ІнтÑрнÑту.
+
+Каб даведацца болей пра гÑтую магчымаÑьць, уключаючы інÑтрукцыю пра тое, Ñк Ñе ÑžÑтанавіць Ñž любой вікі, Ð°ÐºÑ€Ð°Ð¼Ñ Wikimedia Commons, глÑдзіце [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos дакумÑнтацыю].',
+ 'config-cc-error' => 'Выбар ліцÑнзіі Creative Commons Ð½Ñ Ð´Ð°Ñž вынікаў.
+УвÑдзіце назву ліцÑнзіі ўручную.',
+ 'config-cc-again' => 'Выберыце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·â€¦',
+ 'config-cc-not-chosen' => 'Выберыце, Ñкую ліцÑнзію Creative Commons Ð’Ñ‹ жадаеце выкарыÑтоўваць Ñ– націÑьніце «працÑгваць».',
+ 'config-advanced-settings' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
+ 'config-cache-options' => 'Ðалады кÑÑˆÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð°Ð±â€™ÐµÐºÑ‚Ð°Ñž:',
+ 'config-cache-help' => 'КÑшаваньне аб’ектаў павÑлічвае хуткаÑьць працы MediaWiki праз кÑшаваньне зьвеÑтак, ÑÐºÑ–Ñ Ñ‡Ð°Ñта выкарыÑтоўваюцца.
+Вельмі Ñ€ÑкамÑндуем уключыць гÑта Ð´Ð»Ñ ÑÑÑ€Ñдніх Ñ– буйных Ñайтаў, такÑама будзе карыÑна Ð´Ð»Ñ Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ñ… Ñайтаў.',
+ 'config-cache-none' => 'Без кÑÑˆÐ°Ð²Ð°Ð½ÑŒÐ½Ñ (ніÑÐºÑ–Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьці не Ñтрачваюцца, але хуткаÑьць працы буйных Ñайтаў можа зьнізіцца)',
+ 'config-cache-accel' => 'КÑшаваньне аб’ектаў PHP (APC, eAccelerator, XCache ці WinCache)',
+ 'config-cache-memcached' => 'ВыкарыÑтоўваць Memcached (патрабуе дадатковай канфігурацыі)',
+ 'config-memcached-servers' => 'СÑрвÑры memcached:',
+ 'config-memcached-help' => 'Ð¡ÑŒÐ¿Ñ–Ñ IP-адраÑоў, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ выкарыÑтоўвацца Memcached.
+ÐдраÑÑ‹ павінны быць у аÑобным радку з пазначÑньнем порту, Ñкі будзе выкарыÑтоўвацца. Ðапрыклад:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Ð’Ñ‹ выбралі Memcached у ÑкаÑьці тыпу Вашага кÑша, але не пазначылі ніÑкага ÑÑрвÑра',
+ 'config-memcache-badip' => 'Ð’Ñ‹ ўвÑлі нÑÑлушны IP-Ð°Ð´Ñ€Ð°Ñ Ð´Ð»Ñ Memcached: $1',
+ 'config-memcache-noport' => 'Ð’Ñ‹ не пазначылі порт Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð½ÑŒÐ½Ñ ÑÑрвÑрам Memcached: $1.
+Калі Ð’Ñ‹ Ð½Ñ Ð²ÐµÐ´Ð°ÐµÑ†Ðµ порт, то па змоўчваньні выкарыÑтоўваецца 11211',
+ 'config-memcache-badport' => 'Ðумар порту Memcached павінен быць паміж $1 Ñ– $2',
+ 'config-extensions' => 'ПашырÑньні',
+ 'config-extensions-help' => 'ПашырÑньні Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ð²Ñ‹ÑˆÑй, былі Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹Ñ Ñž Вашай дырÑкторыі <code>./extensions</code>.
+
+Яны могуць патрабаваць дадатковых наладаў, але іх можна ўключыць зараз',
+ 'config-install-alreadydone' => "'''ПапÑÑ€Ñджаньне:''' здаецца, што Ð’Ñ‹ ўжо ÑžÑталёўвалі MediaWiki Ñ– Ñпрабуеце зрабіць гÑтай зноў.
+Калі лаÑка, перайдзіце на наÑтупную Ñтаронку.",
+ 'config-install-begin' => 'ПаÑÑŒÐ»Ñ Ð½Ð°Ñ†Ñ–Ñку кнопкі «{{int:config-continue}}» пачнецца ÑžÑталÑваньне MediaWiki.
+Калі Ð’Ñ‹ жадаеце што-небудзь зьмÑніць, націÑьніце кнопку «ВÑрнуцца».',
+ 'config-install-step-done' => 'зроблена',
+ 'config-install-step-failed' => 'не атрымалаÑÑ',
+ 'config-install-extensions' => 'Уключаючы пашырÑньні',
+ 'config-install-database' => 'Ðалада базы зьвеÑтак',
+ 'config-install-pg-schema-not-exist' => 'Схема PostgreSQL не Ñ–Ñнуе',
+ 'config-install-pg-schema-failed' => 'Ðемагчыма Ñтварыць табліцу.
+УпÑўніцеÑÑ, што карыÑтальнік «$1» можа піÑаць у Ñхему «$2».',
+ 'config-install-pg-commit' => 'Захаваньне зьменаў',
+ 'config-install-pg-plpgsql' => 'Праверка падтрымкі мовы PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Вам неабходна ÑžÑталÑваць падтрымку мовы PL/pgSQL у базе зьвеÑтак $1',
+ 'config-pg-no-create-privs' => 'Рахунак, Ñкі Ð’Ñ‹ пазначылі Ð´Ð»Ñ ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð½Ñ Ð¼Ð°Ðµ даÑтаткова правоў Ð´Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ.',
+ 'config-install-user' => 'СтварÑньне карыÑтальніка базы зьвеÑтак',
+ 'config-install-user-alreadyexists' => 'Удзельнік «$1» ужо Ñ–Ñнуе',
+ 'config-install-user-create-failed' => 'Ðемагчыма Ñтварыць ўдзельніка «$1»: $2',
+ 'config-install-user-grant-failed' => 'Ðемагчыма даць правы удзельніку «$1»: $2',
+ 'config-install-tables' => 'СтварÑньне табліцаў',
+ 'config-install-tables-exist' => "'''ПапÑÑ€Ñджаньне''': ВыглÑдае, што табліцы MediaWiki ужо Ñ–Ñнуюць.
+СтварÑньне прапушчанае.",
+ 'config-install-tables-failed' => "'''Памылка''': немагчыма Ñтварыць табліцы з-за наÑтупнай памылкі: $1",
+ 'config-install-interwiki' => 'Запаўненьне табліцы інтÑрвікі па змоўчваньні',
+ 'config-install-interwiki-list' => 'Ðемагчыма знайÑьці файл <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''ПапÑÑ€Ñджаньне''': выглÑдае, што табліца інтÑрвікі ўжо запоўненаÑ.
+Ð¡ÑŒÐ¿Ñ–Ñ Ð¿Ð° змоўчваньні прапушчаны.",
+ 'config-install-stats' => 'ІніцыÑлізацыі ÑтатыÑтыкі',
+ 'config-install-keys' => 'СтварÑньне ÑакрÑтнага ключа',
+ 'config-insecure-keys' => "'''ПапÑÑ€Ñджаньне:''' {{PLURAL:$2|Ключ бÑÑьпекі $1 Ñтвораны|Ключы бÑÑьпекі $1 ÑтвораныÑ}} Ð¿Ð°Ð´Ñ‡Ð°Ñ ÑƒÑталÑваньнÑ, не зьÑўлÑюцца поўнаÑьцю бÑÑьпечнымі. РÑкамÑндуецца зьмÑніць {{PLURAL:$2|Ñго ўручную|Ñ–Ñ… уручную}}.",
+ 'config-install-sysop' => 'СтварÑньне рахунку адмініÑтратара',
+ 'config-install-subscribe-fail' => 'Ðемагчыма падпіÑацца на «mediawiki-announce»',
+ 'config-install-mainpage' => 'СтварÑньне галоўнай Ñтаронкі Ñа зьмеÑтам па змоўчваньні',
+ 'config-install-extension-tables' => 'СтварÑньне табліцаў Ð´Ð»Ñ ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ñ‹Ñ… пашырÑньнÑÑž',
+ 'config-install-mainpage-failed' => 'Ðемагчыма ÑžÑтавіць галоўную Ñтаронку: $1',
+ 'config-install-done' => "'''Віншуем!'''
+Ð’Ñ‹ паÑьпÑхова ÑžÑталÑвалі MediaWiki.
+
+Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ñтварыла файл <code>LocalSettings.php</code>.
+Ðн утрымлівае ÑžÑе Ð’Ð°ÑˆÑ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹.
+
+Вам неабходна загрузіць Ñго Ñ– захаваць у карÑнную дырÑкторыю Вашай вікі (у тую ж Ñамую дырÑкторыю, дзе знаходзіцца index.php). Загрузка павінна пачацца аўтаматычна.
+
+Калі загрузка не пачалаÑÑ, ці Ð’Ñ‹ Ñе адмÑнілі, Ð’Ñ‹ можаце перазапуÑьціць Ñе націÑнуўшы на ÑпаÑылку ніжÑй:
+
+$3
+
+'''Заўвага''': калі Ð’Ñ‹ гÑтага Ð½Ñ Ð·Ñ€Ð¾Ð±Ñ–Ñ†Ðµ зараз, то Ñтвораны файл Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ даÑтупны Вам потым, калі Ð’Ñ‹ выйдзеце з праграмы ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð±ÐµÐ· Ñго загрузкі.
+
+Калі Ð’Ñ‹ гÑта зробіце, Ð’Ñ‹ можаце '''[$2 ўвайÑьці Ñž Вашую вікі]'''.",
+ 'config-download-localsettings' => 'Загрузіць LocalSettings.php',
+ 'config-help' => 'дапамога',
+);
+
+/** Bulgarian (БългарÑки)
+ * @author DCLXVI
+ */
+$messages['bg'] = array(
+ 'config-desc' => 'ИнÑталатор на МедиÑУики',
+ 'config-title' => 'ИнÑталиране на МедиÑУики $1',
+ 'config-information' => 'ИнформациÑ',
+ 'config-localsettings-upgrade' => 'Беше открит файл <code>LocalSettings.php</code>.
+За надграждане на ÑъщеÑтвуващата инÑталациÑ, необходимо е в кутиÑта по-долу да Ñе въведе ÑтойноÑтта на <code>$wgUpgradeKey</code>.
+Тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ðµ налична в LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Беше открит файл LocalSettings.php.
+За надграждане на наличната инÑталациÑ, необходимо е да Ñе Ñтартира update.php',
+ 'config-localsettings-key' => 'Ключ за надграждане:',
+ 'config-localsettings-badkey' => 'ПредоÑтавениÑÑ‚ ключ е неправилен.',
+ 'config-upgrade-key-missing' => 'Беше открита ÑъщеÑтвуваща инÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° МедиÑУики.
+За надграждане на ÑъщеÑтвуващата инÑталациÑ, необходимо е да Ñе поÑтави ÑледниÑÑ‚ ред в ÐºÑ€Ð°Ñ Ð½Ð° файла LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'СъщеÑтвуващиÑÑ‚ файл LocalSettings.php изглежда непълен.
+Променливата $1 не е зададена.
+Ðеобходимо е да Ñе редактира файлът LocalSettings.php и да Ñе зададе променливата, Ñлед което да Ñе натиÑне "Продължаване".',
+ 'config-localsettings-connection-error' => 'Възникна грешка при Ñвързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни чрез данните, поÑочени в LocalSettings.php или AdminSettings.php. Ðеобходимо е да Ñе коригират тези наÑтройки преди повторен опит за Ñвързване.
+
+$1',
+ 'config-session-error' => 'Грешка при Ñъздаване на ÑеÑиÑ: $1',
+ 'config-your-language' => 'ВашиÑÑ‚ език:',
+ 'config-your-language-help' => 'Избиране на език за използване по време на инÑталациÑта.',
+ 'config-wiki-language' => 'Език на уикито:',
+ 'config-wiki-language-help' => 'Избиране на език, на който ще е оÑновното Ñъдържание на уикито.',
+ 'config-back' => '↠Връщане',
+ 'config-continue' => 'Продължаване →',
+ 'config-page-language' => 'Език',
+ 'config-page-welcome' => 'Добре дошли в МедиÑУики!',
+ 'config-page-dbconnect' => 'Свързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни',
+ 'config-page-upgrade' => 'Ðадграждане на ÑъщеÑтвуваща инÑталациÑ',
+ 'config-page-dbsettings' => 'ÐаÑтройки на базата от данни',
+ 'config-page-name' => 'Име',
+ 'config-page-options' => 'ÐаÑтройки',
+ 'config-page-install' => 'ИнÑталиране',
+ 'config-page-complete' => 'Готово!',
+ 'config-page-restart' => 'РеÑтартиране на инÑталациÑта',
+ 'config-page-readme' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñофтуера',
+ 'config-page-releasenotes' => 'Бележки за верÑиÑта',
+ 'config-page-copying' => 'Лицензно Ñпоразумение',
+ 'config-page-upgradedoc' => 'Ðадграждане',
+ 'config-page-existingwiki' => 'СъщеÑтвуващо уики',
+ 'config-help-restart' => 'Ðеобходимо е потвърждение за изтриване на вÑички въведени и Ñъхранени данни и започване отначало на процеÑа по инÑталациÑ.',
+ 'config-restart' => 'Да, започване отначало',
+ 'config-welcome' => '=== Проверка на Ñредата ===
+Извършени бÑха оÑновни проверки, за да Ñе провери дали Ñредата е подходÑща за инÑталиране на МедиÑУики.
+Ðко е необходима помощ по време на инÑталациÑта, резултатите от направените проверки Ñ‚Ñ€Ñбва Ñъщо да бъдат предоÑтавени.',
+ 'config-copyright' => "=== ÐвторÑки права и УÑÐ»Ð¾Ð²Ð¸Ñ ===
+
+$1
+
+Тази програма е Ñвободен Ñофтуер, който може да Ñе Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ð¸/или разпроÑтранÑва Ñпоред ÐžÐ±Ñ‰Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡ÐµÐ½ лиценз на GNU, както е публикуван от Free Software Foundation във верÑÐ¸Ñ Ð½Ð° Лиценза 2 или по-къÑна верÑиÑ.
+
+Тази програма Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще е полезна, но '''без каквито и да е гаранции'''; без дори коÑвена Ð³Ð°Ñ€Ð°Ð½Ñ†Ð¸Ñ Ð·Ð° '''продаваемоÑÑ‚''' или '''прогодноÑÑ‚ за конкретна употреба'''.
+За повече подробноÑти Ñе препоръчва преглеждането на ÐžÐ±Ñ‰Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡ÐµÐ½ лиценз на GNU.
+
+Към програмата Ñ‚Ñ€Ñбва да е приложено <doclink href=Copying>копие на ÐžÐ±Ñ‰Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡ÐµÐ½ лиценз на GNU</doclink>; ако не, можете да пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. или да [http://www.gnu.org/copyleft/gpl.html го прочетете онлайн].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Сайт на МедиÑУики]
+* [http://www.mediawiki.org/wiki/Help:Contents Ðаръчник на потребителÑ]
+* [http://www.mediawiki.org/wiki/Manual:Contents Ðаръчник на админиÑтратора]
+* [http://www.mediawiki.org/wiki/Manual:FAQ ЧЗВ]
+----
+* <doclink href=Readme>ДокументациÑ</doclink>
+* <doclink href=ReleaseNotes>Бележки за верÑиÑта</doclink>
+* <doclink href=Copying>ÐвторÑки права</doclink>
+* <doclink href=UpgradeDoc>ОбновÑване</doclink>',
+ 'config-env-good' => 'Средата беше проверена.
+ИнÑталирането на МедиÑУики е възможно.',
+ 'config-env-bad' => 'Средата беше проверена.
+Ðе е възможна инÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° МедиÑУики.',
+ 'config-env-php' => 'ИнÑталирана е верÑÐ¸Ñ Ð½Ð° PHP $1.',
+ 'config-env-php-toolow' => 'ИнÑталирана е верÑÐ¸Ñ Ð½Ð° PHP $1.
+МедиÑУики изиÑква верÑÐ¸Ñ PHP $2 или по-нова.',
+ 'config-unicode-using-utf8' => 'Използване на utf8_normalize.so от Brion Vibber за Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° Уникод.',
+ 'config-unicode-using-intl' => 'Използване на разширението [http://pecl.php.net/intl intl PECL] за Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° Уникод.',
+ 'config-unicode-pure-php-warning' => "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за ÑправÑне Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñта на Уникод, превключване към по-бавното изпълнение на чиÑÑ‚ PHP.
+Ðко Ñайтът е Ñ Ð³Ð¾Ð»Ñм трафик, препоръчително е запознаването Ñ [http://www.mediawiki.org/wiki/Unicode_normalization_considerations нормализациÑта на Уникод].",
+ 'config-no-db' => 'Ðе може да бъде открит подходÑщ драйвер за база от данни!',
+ 'config-no-fts3' => "'''Предупреждение''': SQLite е компилирана без [http://sqlite.org/fts3.html модула FTS3], затова възможноÑтите за Ñ‚ÑŠÑ€Ñене нÑма да Ñа доÑтъпни.",
+ 'config-register-globals' => "'''Предупреждение: ÐаÑтройката на PHP <code>[http://php.net/register_globals register_globals]</code> е включена.'''
+'''При възможноÑÑ‚ е препоръчително Ñ‚Ñ Ð´Ð° бъде изключена.'''
+МедиÑУики ще работи, но Ñървърът е изложен на евентуални пропуÑки в ÑигурноÑтта.",
+ 'config-magic-quotes-runtime' => "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активирана!'''
+Това може да повреди непредвидимо въвеждането на данните.
+ИнÑталациÑта на МедиÑУики е невъзможна докато тази наÑтройка не бъде изключена.",
+ 'config-magic-quotes-sybase' => "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активирана!'''
+Това може да повреди непредвидимо въвеждането на данните.
+ИнÑталациÑта на МедиÑУики е невъзможна докато тази наÑтройка не бъде изключена.",
+ 'config-mbstring' => "'''Фатално: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активирана!'''
+Това може да повреди непредвидимо въвеждането на данните.
+ИнÑталациÑта на МедиÑУики е невъзможна докато тази наÑтройка не бъде изключена.",
+ 'config-ze1' => "'''Фатално: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] е активирана!'''
+Тази наÑтройка причинÑва ужаÑни грешки в МедиÑУики.
+Ðевъзможно е инÑталирането и използването на МедиÑУики докато тази наÑтройка не бъде изключена.",
+ 'config-safe-mode' => "'''Предупреждение:''' PHP работи в [http://www.php.net/features.safe-mode безопаÑен режим].
+Това може да Ñъздаде проблеми, оÑобено ако качването на файлове е разрешено, както и при поддръжката на <code>math</code>.",
+ 'config-xml-bad' => 'ЛипÑва XML модулът на PHP.
+МедиÑУики Ñе нуждае от нÑкои функции от този модул и нÑма да работи при наличната конфигурациÑ.
+При Mandrake, необходимо е да Ñе инÑталира пакетът php-xml.',
+ 'config-pcre-no-utf8' => "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.
+За да функционира правилно, МедиÑУики изиÑква поддръжка на UTF-8.",
+ 'config-memory-raised' => '<code>memory_limit</code> на PHP е $1, увеличаване до $2.',
+ 'config-memory-bad' => "'''Предупреждение:''' <code>memory_limit</code> на PHP е $1.
+СтойноÑтта вероÑтно е твърде ниÑка.
+Възможно е инÑталациÑта да Ñе провали!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] е инÑталиран',
+ 'config-apc' => '[http://www.php.net/apc APC] е инÑталиран',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] е инÑталиран',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инÑталиран',
+ 'config-no-cache' => "'''Предупреждение:''' Ðе бÑха открити [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC] [http://trac.lighttpd.net/xcache/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
+Обектното кеширане не е включено.",
+ 'config-diff3-bad' => 'GNU diff3 не беше намерен.',
+ 'config-imagemagick' => 'Открит е ImageMagick: <code>$1</code>.
+ПреоразмерÑването на картинки ще бъде включено ако качването на файлове бъде разрешено.',
+ 'config-gd' => 'Открита е вградена графичната библиотека GD.
+Ðко качването на файлове бъде включено, ще бъде включена възможноÑтта за преоразмерÑване на картинки.',
+ 'config-no-scaling' => 'Ðе Ñа открити библиотеките GD или ImageMagick.
+ПреоразмерÑването на картинки ще бъде изключено.',
+ 'config-no-uri' => "'''Грешка:''' Ðе може да Ñе определи Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð°Ð´Ñ€ÐµÑ.
+ИнÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ Ð±ÐµÑˆÐµ прекратена.",
+ 'config-uploads-not-safe' => "'''Предупреждение:''' Папката по подразбиране за качване <code>$1</code> е уÑзвима от изпълнение на зловредни Ñкриптове.
+Въпреки че МедиÑУики извършва проверка за заплахи в ÑигурноÑтта на вÑички качени файлове, Ñилно препоръчително е да Ñе [http://www.mediawiki.org/wiki/Manual:Security#Upload_security затвори тази уÑзвимоÑÑ‚ в ÑигурноÑтта] преди разрешаване за качване на файлове.",
+ 'config-db-type' => 'Тип на базата от данни:',
+ 'config-db-host' => 'ХоÑÑ‚ на базата от данни:',
+ 'config-db-host-help' => 'Ðко базата от данни е на друг Ñървър, в кутиÑта Ñе въвежда името на хоÑта или IP адреÑа.
+
+Ðко Ñе използва Ñподелен уеб хоÑтинг, доÑтавчикът на уÑлугата би Ñ‚Ñ€Ñбвало да е предоÑтавил в документациÑта Ñи ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ñ Ñ…Ð¾ÑÑ‚.
+
+Ðко инÑталациÑта протича на Windows-Ñървър и Ñе използва MySQL, използването на "localhost" може да е неприемливо. Ð’ такива Ñлучаи Ñе използва "127.0.0.1" за локален IP адреÑ.',
+ 'config-db-wiki-settings' => 'Идентифициране на това уики',
+ 'config-db-name' => 'Име на базата от данни:',
+ 'config-db-name-help' => 'Избира Ñе име, което да идентифицира уикито.
+То не Ñ‚Ñ€Ñбва да Ñъдържа интервали.
+
+Ðко Ñе използва Ñподелен хоÑтинг, доÑтавчикът на уÑлугата би Ñ‚Ñ€Ñбвало да е предоÑтавил или име на базата от данни, коÑто да бъде използвана, или да позволÑва Ñъздаването на бази от данни чрез ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ».',
+ 'config-db-name-oracle' => 'Схема на базата от данни:',
+ 'config-db-install-account' => 'ПотребителÑка Ñметка за инÑталациÑта',
+ 'config-db-username' => 'ПотребителÑко име за базата от данни:',
+ 'config-db-password' => 'Парола за базата от данни:',
+ 'config-db-install-username' => 'Въвежда Ñе потребителÑко име, което ще Ñе използва за Ñвързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни по време на процеÑа по инÑталациÑ.
+Това не е потребителÑко име за Ñметка в МедиÑУики; това е потребителÑко име за базата от данни.',
+ 'config-db-install-password' => 'Въвежда Ñе парола, коÑто ще бъде използвана за Ñвързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни по време на инÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑ.
+Това не е парола за Ñметка в МедиÑУики; това е парола за базата от данни.',
+ 'config-db-install-help' => 'Въвеждат Ñе потребителÑко име и парола, които ще бъдат използвани за Ñвързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни по време на инÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑ.',
+ 'config-db-account-lock' => 'Използване на Ñъщото потребителÑко име и парола по време на нормална работа',
+ 'config-db-wiki-account' => 'ПотребителÑка Ñметка за нормална работа',
+ 'config-db-wiki-help' => 'Въвежда Ñе потребителÑко име и парола, които ще Ñе използват при нормалното функциониране на уикито.
+Ðко Ñметката не ÑъщеÑтвува и използваната при инÑталациÑта Ñметка има необходимите права, тази потребителÑка Ñметка ще бъде Ñъздадена Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ð½Ð¸Ñ‚Ðµ необходими права за работа Ñ ÑƒÐ¸ÐºÐ¸Ñ‚Ð¾.',
+ 'config-db-prefix' => 'ПредÑтавка за таблиците в базата от данни:',
+ 'config-db-prefix-help' => 'Ðко е необходимо да Ñе Ñподели базата от данни между нÑколко уикита или между МедиÑУики и друго уеб приложение, може да Ñе добави предÑтавка пред имената на таблиците, за да Ñе избегнат конфликти.
+Ðе Ñе използват интервали.
+
+Това поле обикновено Ñе оÑÑ‚Ð°Ð²Ñ Ð¿Ñ€Ð°Ð·Ð½Ð¾.',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 бинарно',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð° ÑъвеÑтимоÑÑ‚ Ñ UTF-8',
+ 'config-mysql-old' => 'ИзиÑква Ñе MySQL $1 или по-нова верÑиÑ, наличната верÑÐ¸Ñ Ðµ $2.',
+ 'config-db-port' => 'Порт на базата от данни:',
+ 'config-db-schema' => 'Схема за МедиÑУики',
+ 'config-db-schema-help' => 'Схемата по-горе обикновено е коректна.
+Промени Ñе извършват ако наиÑтина е необходимо.',
+ 'config-sqlite-dir' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° данни на SQLite:',
+ 'config-sqlite-dir-help' => "SQLite ÑъхранÑва вÑички данни в един файл.
+
+По време на инÑталациÑта уеб Ñървърът Ñ‚Ñ€Ñбва да има права за пиÑане в поÑочената директориÑ.
+
+Ð¢Ñ '''не Ñ‚Ñ€Ñбва''' да е доÑтъпна през уеб, затова не е там, където Ñа PHP файловете.
+
+ИнÑталаторът ще Ñъхрани заедно Ñ Ð½ÐµÑ Ñ„Ð°Ð¹Ð» <code>.htaccess</code>, но ако този метод пропадне, нÑкой може да придобие даоÑтъп до Ñуровите данни от базата от данни.
+Това включва Ñурови данни за потребителите (адреÑи за е-поща, хеширани пароли), както и изтрити верÑии на Ñтраници и друга чувÑтвителна и Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½ доÑтъп Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ и за уикито.
+
+Базата от данни е препоръчително да Ñе разположи на друго мÑÑто, например в <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-support-info' => 'МедиÑУики поддържа Ñледните ÑиÑтеми за бази от данни:
+
+$1
+
+Ðко не виждате желаната за използване ÑиÑтема в ÑпиÑъка по-долу, Ñледвайте инÑтрукциите за активиране на поддръжка по-горе.',
+ 'config-support-mysql' => '* $1 е най-фобре поддържата ÑиÑтема за база от данни, най-добре поддържана от МедиÑУики ([http://www.php.net/manual/en/mysql.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на MySQL])',
+ 'config-support-postgres' => '* $1 е популÑрна ÑиÑтема за бази от данни Ñ Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½ изходен код, коÑто е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на PostgreSQL]). Възможно е вÑе още да има грешки, затова не Ñе препоръчва да Ñе използва в общодоÑтъпна Ñреда.',
+ 'config-support-sqlite' => '* $1 е лека ÑиÑтема за база от данни, коÑто е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на SQLite], използва PDO)',
+ 'config-support-oracle' => '* $1 е комерÑиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на OCI8])',
+ 'config-header-mysql' => 'ÐаÑтройки за MySQL',
+ 'config-header-postgres' => 'ÐаÑтройки за PostgreSQL',
+ 'config-header-sqlite' => 'ÐаÑтройки за SQLite',
+ 'config-header-oracle' => 'ÐаÑтройки за Oracle',
+ 'config-invalid-db-type' => 'Ðевалиден тип база от данни',
+ 'config-missing-db-name' => 'Ðеобходимо е да Ñе въведе ÑтойноÑÑ‚ за "Име на базата от данни"',
+ 'config-missing-db-host' => 'Ðеобходимо е да Ñе въведе ÑтойноÑÑ‚ за "ХоÑÑ‚ на базата от данни"',
+ 'config-invalid-db-name' => 'Ðевалидно име на базата от данни "$1".
+Използват Ñе Ñамо ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).',
+ 'config-invalid-db-prefix' => 'Ðевалидна предÑтавка за базата от данни "$1".
+Позволени Ñа Ñамо ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).',
+ 'config-connection-error' => '$1.
+
+Ðеобходимо е да Ñе проверÑÑ‚ хоÑÑ‚ÑŠÑ‚, потребителÑкото име и паролата, Ñлед което да Ñе опита отново.',
+ 'config-invalid-schema' => 'Ðевалидна Ñхема за МедиÑУики "$1".
+ДопуÑтими Ñа Ñамо ASCII букви (a-z, A-Z), цифри (0-9) и долни черти (_).',
+ 'config-db-sys-create-oracle' => 'ИнÑталаторът поддържа Ñамо Ñметка SYSDBA за Ñъздаване на нова Ñметка.',
+ 'config-db-sys-user-exists-oracle' => 'ПотребителÑката Ñметка "$1" вече ÑъщеÑтвува. SYSDBA може да Ñе използва Ñамо за Ñъздаване на нова Ñметка!',
+ 'config-postgres-old' => 'ИзиÑква Ñе PostgreSQL $1 или по-нова верÑиÑ, наличната верÑÐ¸Ñ Ðµ $2.',
+ 'config-sqlite-name-help' => 'Избира Ñе име, което да идентифицира уикито.
+Ðе Ñе използват интервали или тирета.
+Това име ще Ñе използва за име на файла за данни на SQLite.',
+ 'config-sqlite-mkdir-error' => 'Грешка при Ñъздаване на директориÑта за данни "$1".
+Проверете меÑтоположението Ñ Ð¸ опитайте отново.',
+ 'config-sqlite-readonly' => 'Файлът <code>$1</code> нÑма права за пиÑане.',
+ 'config-sqlite-cant-create-db' => 'Файлът за базата от данни <code>$1</code> не може да бъде Ñъздаден.',
+ 'config-sqlite-fts3-downgrade' => 'ЛипÑва поддръжката на FTS3 за PHP, извършен беше downgradе на таблиците',
+ 'config-can-upgrade' => "Ð’ базата от данни има таблици за МедиÑУики.
+За надграждането им за MediaWiki $1, натиÑка Ñе '''Продължаване'''.",
+ 'config-upgrade-done' => "ОбновÑването приключи.
+
+Вече е възможно [$1 да използвате уикито].
+
+Ðко е необходимо, възможно е файлът <code>LocalSettings.php</code> да бъде Ñъздаден отново чрез натиÑкане на бутона по-долу.
+Това '''не е препоръчително дейÑтвие''', оÑвен ако не Ñрещате Ð·Ð°Ñ‚Ñ€ÑƒÐ´Ð½ÐµÐ½Ð¸Ñ Ñ ÑƒÐ¸ÐºÐ¸Ñ‚Ð¾.",
+ 'config-upgrade-done-no-regenerate' => 'ОбновÑването приключи.
+
+Вече е възможно [$1 да използвате уикито].',
+ 'config-regenerate' => 'Създаване на LocalSettings.php →',
+ 'config-show-table-status' => 'ЗаÑвката SHOW TABLE STATUS не Ñполучи!',
+ 'config-unknown-collation' => "'''Предупреждение:''' Базата от данни използва неразпозната колациÑ.",
+ 'config-db-web-account' => 'Сметка за уеб доÑтъп до базата от данни',
+ 'config-db-web-help' => 'Избиране на потребителÑко име и парола, които уеб Ñървърът ще използва да Ñе Ñвързва Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни при обичайната работа на уикито.',
+ 'config-db-web-account-same' => 'Използване на Ñъщата Ñметка като при инÑталациÑта.',
+ 'config-db-web-create' => 'Създаване на Ñметката ако вÑе още не ÑъщеÑтвува',
+ 'config-db-web-no-create-privs' => 'ПоÑочената Ñметка за инÑталациÑта не разполага Ñ Ð´Ð¾Ñтатъчно права за Ñъздаване на нова Ñметка.
+Ðеобходимо е поÑочената Ñметка вече да ÑъщеÑтвува.',
+ 'config-mysql-engine' => 'Хранилище на данни:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' почти винаги е най-добрата възможноÑÑ‚ заради навременната Ñи поддръжка.
+
+'''MyISAM''' може да е по-бърза при инÑталации Ñ ÐµÐ´Ð¸Ð½ потребител или Ñамо за четене.
+Базите от данни MyISAM Ñе повреждат по-чеÑто от InnoDB.",
+ 'config-mysql-charset' => 'Ðабор от Ñимволи в базата от данни:',
+ 'config-mysql-binary' => 'Бинарен',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "Ð’ '''бинарен режим''' МедиÑУики ÑъхранÑва текÑтовете в UTF-8 в бинарни полета в базата от данни.
+Това е по-ефективно от UTF-8 режима на MySQL и позволÑва използването на Ð¿ÑŠÐ»Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€ от Ñимволи в Уникод.
+
+Ð’ '''UTF-8 режим''' MySQL ще знае в кой набор от Ñимволи Ñа данните от уикито и ще може да ги показва и Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾ подходÑщ начин, но нÑма да позволÑва Ñкладиране на Ñимволи извън [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes ОÑÐ½Ð¾Ð²Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐµÐ·Ð¸Ñ‡ÐµÐ½ набор].",
+ 'config-site-name' => 'Име на уикито:',
+ 'config-site-name-help' => 'Това име ще Ñе показва в заглавната лента на браузъра и на различни други меÑта.',
+ 'config-site-name-blank' => 'Ðеобходимо е да Ñе въведе име на уикито.',
+ 'config-project-namespace' => 'Именно проÑтранÑтво на проекта:',
+ 'config-ns-generic' => 'Проект',
+ 'config-ns-site-name' => 'Същото като името на уикито: $1',
+ 'config-ns-other' => 'Друго (уточнÑване)',
+ 'config-ns-other-default' => 'МоетоУики',
+ 'config-project-namespace-help' => 'Следвайки примера на УикипедиÑ, много уикита ÑъхранÑват Ñтраниците Ñи Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° в "\'\'\'именно проÑтранÑтво на проекта\'\'\'", отделно от оÑновното Ñъдържание.
+Ð’Ñички Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ñ Ð½Ð° Ñтраниците в това именно проÑтранÑтво започват Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð° предÑтавка, коÑто може да бъде зададена тук.
+Обикновено предÑтавката произлиза от името на уикито, но не може да Ñъдържа Ñимволи като "#" или ":".',
+ 'config-ns-invalid' => 'ПоÑоченото именно проÑтранÑтво "<nowiki>$1</nowiki>" е невалидно.
+Ðеобходимо е да бъде поÑочено друго.',
+ 'config-admin-box' => 'ÐдминиÑтраторÑка Ñметка',
+ 'config-admin-name' => 'ПотребителÑко име:',
+ 'config-admin-password' => 'Парола:',
+ 'config-admin-password-confirm' => 'Парола (повторно):',
+ 'config-admin-help' => 'Въвежда Ñе предпочитаното потребителÑко име, например "Иванчо Иванчев".
+Това ще е потребителÑкото име, което админиÑтраторът ще използва за влизане в уикито.',
+ 'config-admin-name-blank' => 'Ðеобходимо е да бъде въведено потребителÑко име на админиÑтратора.',
+ 'config-admin-name-invalid' => 'ПоÑоченото потребителÑко име "<nowiki>$1</nowiki>" е невалидно.
+Ðеобходимо е да Ñе поÑочи друго.',
+ 'config-admin-password-blank' => 'Ðеовходимо е да Ñе въведе парола за админиÑтраторÑката Ñметка.',
+ 'config-admin-password-same' => 'Паролата не Ñ‚Ñ€Ñбва да е Ñъщата като потребителÑкото име.',
+ 'config-admin-password-mismatch' => 'Двете въведени пароли не Ñъвпадат.',
+ 'config-admin-email' => 'ÐÐ´Ñ€ÐµÑ Ð·Ð° електронна поща:',
+ 'config-admin-email-help' => 'Въвеждането на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща позволÑва получаване на е-пиÑма от другите потребители на уикито, възÑтановÑване на изгубена или забравена парола, оповеÑÑ‚Ñване при промени в Ñтраниците от ÑпиÑъка за наблюдение. Това поле може да бъде оÑтавено празно.',
+ 'config-admin-error-user' => 'Възникна вътрешна грешка при Ñъздаване на админиÑтратор Ñ Ð¸Ð¼ÐµÑ‚Ð¾ "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Възникна вътрешна грешка при задаване на парола за админиÑтратора "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Въведен е невалиден Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща',
+ 'config-subscribe' => 'Ðбониране за [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce пощенÑÐºÐ¸Ñ ÑпиÑък за нови верÑии].',
+ 'config-subscribe-help' => 'Това е пощенÑки ÑпиÑък Ñ Ð¼Ð°Ð»ÐºÐ¾ трафик, който Ñе използва за ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ излизане на нови верÑии, както и за важни проблеми ÑÑŠÑ ÑигурноÑтта.
+Ðбонирането е препоръчително, както и надграждането на инÑталациÑта на МедиÑУики при излизането на нова верÑиÑ.',
+ 'config-almost-done' => 'ИнÑталациÑта е почти готова!
+Възможно е пропуÑкане на оÑтаващата ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸ моментално инÑталиране на уикито.',
+ 'config-optional-continue' => 'Задаване на допълнителни въпроÑи.',
+ 'config-optional-skip' => 'ДоÑтатъчно, инÑталиране на уикито.',
+ 'config-profile' => 'Профил на потребителÑките права:',
+ 'config-profile-wiki' => 'Традиционно уики',
+ 'config-profile-no-anon' => 'Ðеобходимо е Ñъздаване на Ñметка',
+ 'config-profile-fishbowl' => 'Само одобрени редактори',
+ 'config-profile-private' => 'Затворено уики',
+ 'config-profile-help' => "Уикитата функционират най-добре, когато позволÑват на възможно най-много хора да ги редактират.
+Ð’ МедиÑУики леÑно Ñе преглеждат поÑледните промени и Ñе възÑтановÑват пораженип от недобронамерени потребители.
+
+Въпреки това мнозина ÑмÑтат МедиÑУики за полезен Ñофтуер по различни начини и чеÑто е трудно да Ñе убедÑÑ‚ вÑички от предимÑтвата на уики модела.
+Затова Ñе предоÑÑ‚Ð°Ð²Ñ Ð²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ за избор.
+
+Уикитата от типа '''{{int:config-profile-wiki}}''' позволÑват на вÑички потребители да редактират, дори и без региÑтрациÑ.
+Уикитата от типа '''{{int:config-profile-no-anon}}''' позволÑват доÑтъп до Ñтраниците и редактирането им Ñамо Ñлед Ñъздаване на потребителÑка Ñметка.
+
+Уики, което е '''{{int:config-profile-fishbowl}}''' позволÑва на вÑички да преглеждат Ñтраниците, но Ñамо предварително одобрени редактори могат да редактират Ñъдържанието.
+Ð’ '''{{int:config-profile-private}}''' Ñамо предварително одобрени потребители могат да четат и редактират Ñъдържанието.
+
+Детайлно обÑÑнение на конфигурациите на потребителÑките права е доÑтъпно Ñлед инÑталациÑта в [http://www.mediawiki.org/wiki/Manual:User_rights Ðаръчника за потребителÑки права].",
+ 'config-license' => 'ÐвторÑки права и лиценз:',
+ 'config-license-none' => 'Без лиценз',
+ 'config-license-cc-by-sa' => 'Криейтив ÐšÐ¾Ð¼ÑŠÐ½Ñ ÐŸÑ€Ð¸Ð·Ð½Ð°Ð½Ð¸Ðµ-СподелÑне на Ñподеленото',
+ 'config-license-cc-by-nc-sa' => 'Криейтив ÐšÐ¾Ð¼ÑŠÐ½Ñ ÐŸÑ€Ð¸Ð·Ð½Ð°Ð½Ð¸Ðµ-ÐекомерÑиално-СподелÑне на Ñподеленото',
+ 'config-license-gfdl-old' => 'Лиценз за Ñвободна Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° GNU 1.2',
+ 'config-license-gfdl-current' => 'Лиценз за Ñвободна Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° GNU 1.3 или по-нов',
+ 'config-license-pd' => 'ОбщеÑтвено доÑтоÑние',
+ 'config-license-cc-choose' => 'Избиране на друг лиценз от Криейтив КомънÑ',
+ 'config-license-help' => "Много публични уикита поÑтавÑÑ‚ вÑички приноÑи под [http://freedomdefined.org/Definition/Bg Ñвободен лиценз].
+Това помага Ñъздаване на уÑещане за общноÑÑ‚ и наÑърчава дългоÑрочните приноÑи.
+Това не е необходимо за чаÑтни или корпоративни уикита.
+
+Ðко е необходимо да Ñе използват текÑтове от УикипедиÑ, както и Ð£Ð¸ÐºÐ¸Ð¿ÐµÐ´Ð¸Ñ Ð´Ð° може да използва текÑтове от уикито, необходимо е да Ñе избере лиценз '''Криейтив ÐšÐ¾Ð¼ÑŠÐ½Ñ ÐŸÑ€Ð¸Ð·Ð½Ð°Ð½Ð¸Ðµ-СподелÑне на Ñподеленото'''.
+
+Лицензът за Ñвободна Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° GNU е ÑтариÑÑ‚ лиценз на Ñъдържанието на УикипедиÑ.
+Той вÑе още е валиден лиценз, но нÑкои негови уÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€Ð°Ð²ÑÑ‚ по-Ñложни повторното използване и интерпретациÑта.",
+ 'config-email-settings' => 'ÐаÑтройки за е-поща',
+ 'config-enable-email' => 'Разрешаване на изходÑщи е-пиÑма',
+ 'config-enable-email-help' => 'За да работÑÑ‚ възможноÑтите за използване на е-поща, необходимо е [http://www.php.net/manual/en/mail.configuration.php наÑтройките за поща на PHP] да бъдат конфигурирани правилно.
+Ðко нÑма да Ñе използват уÑлугите за е-поща в уикито, те могат да бъдат изключени тук.',
+ 'config-email-user' => 'ПозволÑване на потребителите да Ñи изпращат е-пиÑма през уикито',
+ 'config-email-user-help' => 'ПозволÑване на потребителите да Ñи изпращат е-пиÑма ако Ñа разрешили това в наÑтройките Ñи.',
+ 'config-email-usertalk' => 'ОповеÑÑ‚Ñване при промÑна на потребителÑката беÑеда',
+ 'config-email-usertalk-help' => 'ПозволÑва на потребителите да получават оповеÑÑ‚Ñване при промÑна на беÑедата им, ако това е разрешено в наÑтройките им.',
+ 'config-email-watchlist' => 'ОповеÑÑ‚Ñване за ÑпиÑъка за наблюдение',
+ 'config-email-watchlist-help' => 'ПозволÑва на потребителите да получават оповеÑÑ‚Ñване за техните наблюдавани Ñтраници, ако това е разрешено в наÑтройките им.',
+ 'config-email-auth' => 'Потвърждаване на адреÑа за електронна поща',
+ 'config-email-auth-help' => "Ðко тази наÑтройка е включена, потребителите Ñ‚Ñ€Ñбва да потвърдÑÑ‚ адреÑа Ñи за е-поща чрез препратка, коÑто им Ñе изпраща при наÑтройване или промÑна.
+Само валидните адреÑи могат да получават е-пиÑма от други потребители или да променÑÑ‚ пиÑмата за оповеÑÑ‚Ñване.
+ÐаÑтройването на това е '''препоръчително''' за публични уикита заради потенциални злоупотреби Ñ Ð²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¾Ñтите за електронна поща.",
+ 'config-email-sender' => 'ÐÐ´Ñ€ÐµÑ Ð·Ð° обратна връзка:',
+ 'config-email-sender-help' => 'Въвежда Ñе Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща, който ще Ñе използва за обратен Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¸ изходÑщи е-пиÑма.
+Това е адреÑÑŠÑ‚, на който ще Ñе получават върнатите и неполучени пиÑма.
+Много е-пощенÑки Ñървъри изиÑкват поне домейн името да е валидно.',
+ 'config-upload-settings' => 'Картинки и качване на файлове',
+ 'config-upload-enable' => 'ПозволÑне качването на файлове',
+ 'config-upload-help' => 'Качването на файлове е възможно да доведе до пробели ÑÑŠÑ ÑигурноÑтта на Ñървъра.
+Повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ темата има в [http://www.mediawiki.org/wiki/Manual:Security раздела за ÑигурноÑÑ‚] в Ðаръчника.
+
+За позволÑване качването на файлове, необходимо е уебÑървърът да може да запиÑва в поддиректориÑта на МедиÑУики <code>images</code>.
+След като това уÑловие е изпълнено, функционалноÑтта може да бъде активирана.',
+ 'config-upload-deleted' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° изтритите файлове:',
+ 'config-upload-deleted-help' => 'Избиране на директориÑ, в коÑто ще Ñе Ñкладират изтритите файлове.
+Ð’ най-Ð´Ð¾Ð±Ñ€Ð¸Ñ Ñлучай Ñ‚Ñ Ð½Ðµ Ñ‚Ñ€Ñбва да е доÑтъпна през уеб.',
+ 'config-logo' => 'ÐÐ´Ñ€ÐµÑ Ð½Ð° логото:',
+ 'config-logo-help' => 'Обликът по подразбиране на МедиÑУики вклчва мÑÑто Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¸ 135Ñ…160 пикÑела за лого в Ð³Ð¾Ñ€Ð½Ð¸Ñ Ð»Ñв ъгъл.
+Ðко има наличен файл Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщ размер, неговиÑÑ‚ Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶Ðµ да бъде поÑочен тук.
+
+Ðко не е необходимо лого, полето Ñе оÑÑ‚Ð°Ð²Ñ Ð¿Ñ€Ð°Ð·Ð½Ð¾.',
+ 'config-instantcommons' => 'Включване на Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалноÑÑ‚, коÑто позволÑва на уикитата да използват картинки, звуци и друга медиа от Ñайта на Ð£Ð¸ÐºÐ¸Ð¼ÐµÐ´Ð¸Ñ [http://commons.wikimedia.org/ ОбщомедиÑ].
+За да е възможно това, МедиÑУики изиÑква доÑтъп до Интернет.
+
+Повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° тази функционалноÑÑ‚, както и инÑтрукции за наÑтройване за други уикита, различни от ОбщомедиÑ, е налична в [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos наръчника].',
+ 'config-cc-again' => 'Повторно избиране...',
+ 'config-advanced-settings' => 'Разширена конфигурациÑ',
+ 'config-cache-options' => 'ÐаÑтройки за обектното кеширане:',
+ 'config-cache-help' => 'Обектното кеширане Ñе използва за подобрÑване на ÑкороÑтта на МедиÑУики чрез кеширане на чеÑто използваните данни.
+Силно препоръчително е на Ñредните и големите Ñайтове да включат тази наÑтройка, но малките Ñъщо могат да Ñе възползват от неÑ.',
+ 'config-cache-none' => 'Без кеширане (не Ñе премахва от функционалноÑтта, но това влиÑе на ÑкороÑтта на по-големи уикита)',
+ 'config-cache-accel' => 'PHP обектно кеширане (APC, eAccelerator, XCache или WinCache)',
+ 'config-cache-memcached' => 'Използване на Memcached (изиÑква допълнителни наÑтройки и конфигуриране)',
+ 'config-memcached-servers' => 'Memcached Ñървъри:',
+ 'config-memcached-help' => 'СпиÑък Ñ IP адреÑи за използване за Memcached.
+Ðеобходимо е да бъдат разделени по един на ред, както и да е поÑочен порта. Пример:
+127.0.0.1:11211
+192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Избран е Memcached като Ñкладиращ тип, но не Ñа поÑочени Ñървъри.',
+ 'config-memcache-badip' => 'Беше въведен невалиден IP Ð°Ð´Ñ€ÐµÑ Ð·Ð° Memcached: $1.',
+ 'config-extensions' => 'РазширениÑ',
+ 'config-install-alreadydone' => "'''Предупреждение:''' Изглежда вече Ñте инÑталирали МедиÑУики и Ñе опитвате да го инÑталирате отново.
+Продължете към Ñледващата Ñтраница.",
+ 'config-install-begin' => 'ИнÑталациÑта на МедиÑУики ще започне Ñлед натиÑкане на бутона "{{int:config-continue}}".
+Ðко желаете да направите промени, натиÑнете Връщане.',
+ 'config-install-step-done' => 'готово',
+ 'config-install-step-failed' => 'неуÑпешно',
+ 'config-install-extensions' => 'ДобавÑне на разширениÑта',
+ 'config-install-database' => 'Създаване на базата от данни',
+ 'config-install-pg-schema-not-exist' => 'PostgreSQL Ñхемата не ÑъщеÑтвува',
+ 'config-install-pg-schema-failed' => 'Създаването на таблиците пропадна.
+Ðеобходимо е потребител "$1" да има права за пиÑане в Ñхемата "$2".',
+ 'config-install-pg-plpgsql' => 'ПроверÑване за езика PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Ðеобходимо е да Ñе инÑталира езикът PL/pgSQL в базата от данни $1',
+ 'config-pg-no-create-privs' => 'ПоÑочената Ñметка за инÑталациÑта не притежава доÑтатъчно права за Ñъздаване на Ñметка.',
+ 'config-install-user' => 'Създаване на потребител за базата от данни',
+ 'config-install-user-alreadyexists' => 'Потребител „$1“ вече ÑъщеÑтвува',
+ 'config-install-user-create-failed' => 'Създаването на потребител „$1“ беше неуÑпешно: $2',
+ 'config-install-user-grant-failed' => 'ПредоÑтавÑнето на права на потребител "$1" беше неуÑпешно: $2',
+ 'config-install-tables' => 'Създаване на таблиците',
+ 'config-install-tables-exist' => "'''Предупреждение''': Таблиците за МедиÑУики изглежда вече ÑъщеÑтвуват.
+ПропуÑкане на Ñъздаването им.",
+ 'config-install-tables-failed' => "'''Грешка''': Създаването на таблиците пропадна и върна Ñледната грешка: $1",
+ 'config-install-interwiki' => 'Попълване на таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°Ñ‚Ð° по подразбиране',
+ 'config-install-interwiki-list' => 'Файлът <code>interwiki.list</code> не можа да бъде открит.',
+ 'config-install-interwiki-exists' => "'''Предупреждение''': Таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð° изглежда вече Ñъдържа данни.
+ПропуÑкане на ÑпиÑъка по подразбиране.",
+ 'config-install-stats' => 'Инициализиране на ÑтатиÑтиките',
+ 'config-install-keys' => 'Генериране на таен ключ',
+ 'config-insecure-keys' => "'''Предупреждение:''' {{PLURAL:$2|СигурниÑÑ‚ ключ, Ñъздаден по време на инÑталациÑта, не е напълно надежден|Сигурните ключове, Ñъздадени по време на инÑталациÑта, не Ñа напълно надеждни}} $1 . ОбмиÑлете да {{PLURAL:$2|го|ги}} Ñмените ръчно.",
+ 'config-install-sysop' => 'Създаване на админиÑтраторÑка Ñметка',
+ 'config-install-subscribe-fail' => 'Ðевъзможно беше абонирането за mediawiki-announce',
+ 'config-install-mainpage' => 'Създаване на Ðачалната Ñтраница ÑÑŠÑ Ñъдържание по подразбиране',
+ 'config-install-extension-tables' => 'Създаване на таблици за включените разширениÑ',
+ 'config-install-mainpage-failed' => 'Вмъкването на Ðачалната Ñтраница беше невъзможно: $1',
+ 'config-install-done' => "'''ПоздравлениÑ!'''
+ИнÑталирането на МедиÑУики приключи уÑпешно.
+
+ИнÑталаторът Ñъздаде файл <code>LocalSettings.php</code>.
+Той Ñъдържа вÑичката необходима оÑновна ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ð° уикито.
+
+Ðеобходимо е той да бъде изтеглен и поÑтавен в оÑновната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° уикито (директориÑта, в коÑто е и index.php). ИзтеглÑнето би Ñ‚Ñ€Ñбвало да започне автоматично.
+
+Ðко изтеглÑнето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:
+
+$3
+
+'''Забележка''': Ðко това не бъде извършено Ñега, генерираниÑÑ‚ конфигурационен файл нÑма да е доÑтъпен на по-къÑен етап ако не бъде изтеглен Ñега или инÑталациÑта приключи без изтеглÑнето му.
+
+Когато файлът вече е в оÑновната директориÑ, '''[$2 уикито ще е доÑтъпно на този адреÑ]'''.",
+ 'config-download-localsettings' => 'ИзтеглÑне на LocalSettings.php',
+ 'config-help' => 'помощ',
+);
+
+/** Breton (Brezhoneg)
+ * @author Fohanno
+ * @author Fulup
+ * @author Gwendal
+ * @author Y-M D
+ */
+$messages['br'] = array(
+ 'config-desc' => 'Poellad staliañ MediaWIki',
+ 'config-title' => 'Staliadur MediaWiki $1',
+ 'config-information' => 'Titouroù',
+ 'config-localsettings-upgrade' => 'Kavet ez eus bet ur restr <code>LocalSettings.php</code>.
+Evit hizivaat ar staliadur-se, merkit an talvoud <code>$wgUpgradeKey</code> er voest dindan.
+E gavout a rit e LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Dinoet ez eus bet ur restr LocalSettings.php.
+Evit lakaat ar staliadur-mañ a-live, implijit --upgrade=yes, mar plij.',
+ 'config-localsettings-key' => "Alc'hwez hizivaat :",
+ 'config-localsettings-badkey' => "Direizh eo an alc'hwez merket ganeoc'h",
+ 'config-upgrade-key-missing' => 'Kavet ez eus bet ur staliadur kent eus MediaWiki.
+Evit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => "Diglok e seblant bezañ ar restr LocalSettings.php zo anezhi dija.
+An argemmenn $1 n'eo ket termenet.
+Kemmit LocalSettings.php evit ma vo termenet an argemmenn-se, ha klikit war « Kenderc'hel ».",
+ 'config-localsettings-connection-error' => "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e LocalSettings.php pe AdminSettings.php. Reizhit an arventennoù-se hag esaeit en-dro.
+
+$1",
+ 'config-session-error' => "Fazi e-ser loc'hañ an dalc'h : $1",
+ 'config-no-session' => "Kolle teo bet roadennoù ho talc'h !
+Gwiriit ar restr php.ini ha bezit sur emañ staliet <code>session.save_path</code> en ur c'havlec'h a zere.",
+ 'config-your-language' => 'Ho yezh :',
+ 'config-your-language-help' => 'Dibabit ur yezh da implijout e-pad an argerzh staliañ.',
+ 'config-wiki-language' => 'Yezh ar wiki :',
+ 'config-wiki-language-help' => 'Diuzañ ar yezh a vo implijet ar muiañ er wiki.',
+ 'config-back' => '↠Distreiñ',
+ 'config-continue' => "Kenderc'hel →",
+ 'config-page-language' => 'Yezh',
+ 'config-page-welcome' => 'Degemer mat e MediaWiki !',
+ 'config-page-dbconnect' => "Kevreañ d'an diaz roadennoù",
+ 'config-page-upgrade' => 'Hizivaat ar staliadur a zo dioutañ',
+ 'config-page-dbsettings' => 'Arventennoù an diaz roadennoù',
+ 'config-page-name' => 'Anv',
+ 'config-page-options' => 'Dibarzhioù',
+ 'config-page-install' => 'Staliañ',
+ 'config-page-complete' => 'Graet !',
+ 'config-page-restart' => 'Adlañsañ ar staliadur',
+ 'config-page-readme' => 'Lennit-me',
+ 'config-page-releasenotes' => 'Notennoù stumm',
+ 'config-page-copying' => 'O eilañ',
+ 'config-page-upgradedoc' => 'O hizivaat',
+ 'config-page-existingwiki' => 'Wiki zo anezhañ dija',
+ 'config-help-restart' => "Ha c'hoant hoc'h eus da ziverkañ an holl roadennoù hoc'h eus ebarzhet ha da adlañsañ an argerzh staliañ ?",
+ 'config-restart' => "Ya, adloc'hañ anezhañ",
+ 'config-welcome' => "=== Gwiriadennoù a denn d'an endro ===
+Rekis eo un nebeud gwiriadennoù diazez da welet hag azas eo an endro evit gallout staliañ MediaWiki.
+Dleout a rafec'h merkañ disoc'hoù ar gwiriadennoù-se m'hoc'h eus ezhomm skoazell e-pad ar staliadenn.",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki Degemer]
+* [http://www.mediawiki.org/wiki/Help:Contents Pajenn-stur an implijer]
+* [http://www.mediawiki.org/wiki/Manual:Contents Pajenn-stur ar merour]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAG]',
+ 'config-env-good' => 'Gwiriet eo bet an endro.
+Gallout a rit staliañ MediaWiki.',
+ 'config-env-bad' => "Gwiriet eo bet an endro.
+Ne c'hallit ket staliañ MediaWiki.",
+ 'config-env-php' => 'Staliet eo PHP $1.',
+ 'config-env-php-toolow' => "Staliet eo PHP $1.
+Nemet eo rekis PHP $2 pe nevesoc'h evit MediaWiki.",
+ 'config-unicode-using-utf8' => "Oc'h implijout utf8_normalize.so gant Brion Vibber evit ar reolata Unicode.",
+ 'config-unicode-using-intl' => "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
+ 'config-no-db' => "Ne c'haller ket kavout ur sturier diaz roadennoù dereat !",
+ 'config-ze1' => "'''Fazi diremed : [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mod] zo gweredekaet !'''
+An dibarzh-mañ zo kaoz da zrein euzhus gant MediaWiki.
+Ne c'hallit ket staliañ nag implijout MediaWiki keit ha m'eo gweredekaet an dibarzh-mañ.",
+ 'config-memory-raised' => '<code>memory_limit</code> ar PHP zo $1, kemmet e $2.',
+ 'config-memory-bad' => "'''Diwallit :''' Da $1 emañ arventenn <code>memory_limit</code> PHP.
+Re izel eo moarvat.
+Marteze e c'hwito ar staliadenn !",
+ 'config-xcache' => 'Staliet eo [http://trac.lighttpd.net/xcache/ XCache]',
+ 'config-apc' => 'Staliet eo [http://www.php.net/apc APC]',
+ 'config-eaccel' => 'Staliet eo [http://eaccelerator.sourceforge.net/ eAccelerator]',
+ 'config-wincache' => 'Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]',
+ 'config-diff3-bad' => "N'eo ket bet kavet GNU diff3.",
+ 'config-no-uri' => "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.
+Staliadur nullet.",
+ 'config-db-type' => 'Doare an diaz roadennoù :',
+ 'config-db-host' => 'Anv implijer an diaz roadennoù :',
+ 'config-db-host-oracle' => 'TNS an diaz roadennoù :',
+ 'config-db-wiki-settings' => 'Anavezout ar wiki-mañ',
+ 'config-db-name' => 'Anv an diaz roadennoù :',
+ 'config-db-name-oracle' => 'Brastres diaz roadennoù :',
+ 'config-db-install-account' => 'Kont implijer evit ar staliadur',
+ 'config-db-username' => 'Anv implijer an diaz roadennoù :',
+ 'config-db-password' => 'Ger-tremen an diaz roadennoù :',
+ 'config-db-install-username' => "Ebarzhit an anv implijer a vo implijet da gevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.
+N'eo ket anv implijer ar gont MediaWiki, an anv implijer evit ho tiaz roadennoù eo.",
+ 'config-db-install-password' => "Ebarzhit ar ger-tremen a vo implijet da gevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.
+N'eo ket ar ger-tremen evit ar gont MediaWiki, ar ger-tremen evit ho tiaz roadennoù eo.",
+ 'config-db-install-help' => 'Merkañ anv an implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.',
+ 'config-db-account-lock' => 'Implijout ar memes anv implijer ha ger-tremen e-kerzh oberiadurioù boutin',
+ 'config-db-wiki-account' => 'Kont implijer evit oberiadurioù boutin',
+ 'config-db-prefix' => 'Rakrann taolennoù an diaz roadennoù :',
+ 'config-db-charset' => 'Strobad arouezennoù an diaz roadennoù',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binarel',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 kilkenglotus UTF-8',
+ 'config-mysql-old' => "Rekis eo MySQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
+ 'config-db-port' => 'Porzh an diaz roadennoù :',
+ 'config-db-schema' => 'Brastres evit MediaWiki',
+ 'config-sqlite-dir' => "Kavlec'h roadennoù SQLite :",
+ 'config-oracle-def-ts' => 'Esaouenn stokañ ("tablespace") dre ziouer :',
+ 'config-oracle-temp-ts' => "Esaouenn stokañ (''tablespace'') da c'hortoz :",
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :
+
+$1
+
+Ma ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti, heuilhit an titouroù a-us (s.o. al liammoù) evit gweredekaat ar skorañ.",
+ 'config-support-mysql' => '* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])',
+ 'config-support-postgres' => "* $1 zo ur reizhiad diaz titouroù brudet ha digor hag a c'hall ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php penaos kempunañ PHP gant skor PostgreSQL])",
+ 'config-support-sqlite' => "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
+ 'config-support-oracle' => '* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])',
+ 'config-header-mysql' => 'Arventennoù MySQL',
+ 'config-header-postgres' => 'Arventennoù PostgreSQL',
+ 'config-header-sqlite' => 'Arventennoù SQLite',
+ 'config-header-oracle' => 'Arventennoù Oracle',
+ 'config-invalid-db-type' => 'Direizh eo ar seurt diaz roadennoù',
+ 'config-missing-db-name' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Anv an diaz titouroù"',
+ 'config-missing-db-host' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Ostiz an diaz titouroù"',
+ 'config-missing-db-server-oracle' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Anv TNS an diaz titouroù"',
+ 'config-invalid-db-server-oracle' => 'Direizh eo anv TNS an diaz titouroù "$1".
+Ober hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha pikoù (.).',
+ 'config-invalid-db-name' => 'Direizh eo anv an diaz titouroù "$1".
+Ober hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).',
+ 'config-invalid-db-prefix' => 'Direizh eo rakger an diaz titouroù "$1".
+Ober hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).',
+ 'config-connection-error' => '$1.
+
+Gwiriit anv an ostiz, an anv implijer, ar ger-tremen ha klaskit en-dro.',
+ 'config-invalid-schema' => 'Chema direizh evit MediaWiki "$1".
+Grit hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9) hag arouezennoù islinennañ (_).',
+ 'config-postgres-old' => "Rekis eo PostgreSQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
+ 'config-sqlite-mkdir-error' => 'Ur fazi zo bet e-ser krouiñ ar c\'havlec\'h roadennoù "$1".
+Gwiriañ al lec\'hiadur ha klask en-dro.',
+ 'config-sqlite-readonly' => "N'haller ket skrivañ er restr <code>$1</code>.",
+ 'config-sqlite-cant-create-db' => "N'haller ket krouiñ restr an diaz roadennoù <code>$1</code>.",
+ 'config-upgrade-done-no-regenerate' => 'Hizivadenn kaset da benn.
+
+Gallout a rit [$1 kregiñ da implijout ho wiki].',
+ 'config-regenerate' => 'Adgenel LocalSettings.php →',
+ 'config-show-table-status' => "C'hwitet ar reked SHOW TABLE STATUS !",
+ 'config-db-web-account' => 'Kont an diaz roadennoù evit ar voned Kenrouedad',
+ 'config-db-web-account-same' => 'Ober gant an hevelep kont hag an hini implijet evit ar staliañ',
+ 'config-db-web-create' => "Krouiñ ar gont ma n'eus ket anezhi c'hoazh",
+ 'config-mysql-engine' => 'Lusker stokañ :',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-charset' => 'Strobad arouezennoù an diaz roadennoù :',
+ 'config-mysql-binary' => 'Binarel',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Anv ar wiki :',
+ 'config-site-name-blank' => "Lakait anv ul lec'hienn .",
+ 'config-project-namespace' => 'Esaouenn anv ar raktres :',
+ 'config-ns-generic' => 'Raktres',
+ 'config-ns-site-name' => 'Hevelep anv hag hini ar wiki : $1',
+ 'config-ns-other' => 'All (spisaat)',
+ 'config-ns-other-default' => 'MaWiki',
+ 'config-admin-box' => 'Kont merour',
+ 'config-admin-name' => "Hoc'h anv :",
+ 'config-admin-password' => 'Ger-tremen :',
+ 'config-admin-password-confirm' => 'Adskrivañ ar ger-tremen :',
+ 'config-admin-help' => 'Merkit hoc\'h anv implijer amañ, da skouer "Yann Vlog".
+Hemañ eo an anv a implijot evit kevreañ d\'ar wiki-mañ.',
+ 'config-admin-name-blank' => 'Lakait anv ur merour.',
+ 'config-admin-name-invalid' => 'Direizh eo an anv implijer diferet « <nowiki>$1</nowiki> ».
+Diferit un anv implijer all.',
+ 'config-admin-password-blank' => 'Reiñ ur ger-tremen evit kont ar merour.',
+ 'config-admin-password-same' => "Ne c'hall ket ar ger-tremen bezañ heñvel ouzh anv ar gont.",
+ 'config-admin-password-mismatch' => "Ne glot ket ar gerioù-tremen hoc'h eus merket an eil gant egile.",
+ 'config-admin-email' => "Chomlec'h postel :",
+ 'config-admin-email-help' => "Merkit ur chomlec'h postel amañ evit gallout resev posteloù a-berzh implijerien all eus ar wiki, adderaouekaat ho ker-tremen ha bezañ kelaouet eus ar c'hemmoù degaset d'ar pajennoù zo en ho roll evezhiañ.",
+ 'config-admin-error-user' => 'Fazi diabarzh en ur grouiñ ur merer gant an anv "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Fazi diabarzh o lakaat ur ger-tremen evit ar merour « <nowiki>$1</nowiki> » : <pre>$2</pre>',
+ 'config-admin-error-bademail' => "Ebarzhet hoc'h eus ur chomlec'h postel direizh.",
+ 'config-subscribe' => 'Koumanantit da [https://lists.wikimedia.org/mailman/listinfo/mediawiki-listenn kemennadoù evit ar stummoù nevez].',
+ 'config-almost-done' => "Kazi echu eo !
+Gellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
+ 'config-optional-continue' => "Sevel muioc'h a goulennoù ouzhin.",
+ 'config-optional-skip' => 'Aet on skuizh, staliañ ar wiki hepken.',
+ 'config-profile' => 'Profil ar gwirioù implijer :',
+ 'config-profile-wiki' => 'Wiki hengounel',
+ 'config-profile-no-anon' => 'Krouidigezh ur gont ret',
+ 'config-profile-fishbowl' => 'Embanner aotreet hepken',
+ 'config-profile-private' => 'Wiki prevez',
+ 'config-license' => 'Copyright hag aotre-implijout:',
+ 'config-license-none' => 'Aotre ebet en traoñ pajenn',
+ 'config-license-gfdl-old' => 'Aotre implijout teuliaouiñ frank GNU 1.2',
+ 'config-license-gfdl-current' => "Aotre implijout teuliaouiñ frank GNU 1.3 pe nevesoc'h",
+ 'config-license-pd' => 'Domani foran',
+ 'config-license-cc-choose' => 'Dibabit un aotre-implijout Creative Commons personelaet',
+ 'config-email-settings' => 'Arventennoù ar postel',
+ 'config-enable-email' => 'Gweredekaat ar posteloù a ya kuit',
+ 'config-email-user' => 'Gweredekaat ar posteloù a implijer da implijer',
+ 'config-email-user-help' => "Aotren a ra an holl implijerien da gas posteloù an eil d'egile mard eo bet gweredekaet an arc'hwel ganto en ho penndibaboù.",
+ 'config-email-watchlist' => "Gweredekaat ar c'hemenn listenn evezhiañ",
+ 'config-email-auth' => 'Gweredekaat an dilesadur dre bostel',
+ 'config-email-sender' => "Chomlec'h postel respont :",
+ 'config-email-sender-help' => "Merkit ar chomlec'h postel da vezañ implijet da chomlec'h distreiñ ar posteloù a ya er-maez.
+Di e vo kaset ar posteloù distaolet.
+Niverus eo ar servijerioù postel a c'houlenn da nebeutañ un [http://fr.wikipedia.org/wiki/Nom_de_domaine anv domani] reizh.",
+ 'config-upload-settings' => 'Pellgargañ skeudennoù ha restroù',
+ 'config-upload-enable' => 'Gweredekaat ar pellgargañ restroù',
+ 'config-upload-deleted' => "Kavlec'h evit ar restroù dilamet :",
+ 'config-logo' => 'URL al logo :',
+ 'config-instantcommons' => "Gweredekaat ''InstantCommons''",
+ 'config-cc-again' => 'Dibabit adarre...',
+ 'config-advanced-settings' => 'Kefluniadur araokaet',
+ 'config-cache-accel' => 'Krubuilhañ traezoù PHP (APC, eAccelerator, XCache pe WinCache)',
+ 'config-cache-memcached' => 'Implijout Memcached (en deus ezhomm bezañ staliet ha kefluniet)',
+ 'config-memcached-servers' => 'Servijerioù Memcached :',
+ 'config-memcached-help' => "Roll ar chomlec'hioù IP da implijout evit Memcached.
+Ret eo dispartiañ anezho gant virgulennoù ha diferañ ar porzh da implijout (da skouer : 127.0.0.1:11211, 192.168.1.25:11211).",
+ 'config-extensions' => 'Astennoù',
+ 'config-install-alreadydone' => "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.
+Kit d'ar bajenn war-lerc'h, mar plij.",
+ 'config-install-step-done' => 'graet',
+ 'config-install-step-failed' => "c'hwitet",
+ 'config-install-extensions' => 'En ur gontañ an astennoù',
+ 'config-install-database' => 'Krouiñ an diaz roadennoù',
+ 'config-install-pg-schema-failed' => "C'hwitet eo krouidigezh an taolennoù.
+Gwiriit hag-eñ e c'hall an implijer « $1 » skrivañ er brastres « $2 ».",
+ 'config-install-pg-commit' => "O wiriekaat ar c'hemmoù",
+ 'config-install-pg-plpgsql' => 'O wiriañ ar yezh PL/pgSQL',
+ 'config-pg-no-plpgsql' => "Ret eo deoc'h staliañ ar yezh PL/pgSQL en diaz roadennoù $1",
+ 'config-install-user' => 'O krouiñ an diaz roadennoù implijer',
+ 'config-install-tables' => 'Krouiñ taolennoù',
+ 'config-install-tables-failed' => "'''Fazi :''' c'hwitet eo krouidigezh an daolenn gant ar fazi-mañ : $1",
+ 'config-install-interwiki-list' => "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
+ 'config-install-stats' => 'O sevel ar stadegoù',
+ 'config-install-keys' => "Genel an alc'hwez kuzh",
+ 'config-install-sysop' => 'Krouidigezh kont ar merour',
+ 'config-install-subscribe-fail' => "Ne c'haller ket koumanantiñ da mediawiki-announce",
+ 'config-install-mainpage' => "O krouiñ ar bajenn bennañ gant un endalc'had dre ziouer",
+ 'config-install-mainpage-failed' => "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
+ 'config-download-localsettings' => 'Pellgargañ LocalSettings.php',
+ 'config-help' => 'skoazell',
+);
+
+/** Bosnian (Bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'config-desc' => 'Instalacija za MediaWiki',
+ 'config-title' => 'MediaWiki $1 instalacija',
+ 'config-information' => 'Informacija',
+ 'config-localsettings-upgrade' => 'Otkrivena je datoteka <code>LocalSettings.php</code>.
+Da biste unaprijedili vaš softver, molimo vas upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.
+Naći ćete ga u LocalSettings.php.',
+ 'config-localsettings-key' => 'KljuÄ za nadgradnju:',
+ 'config-session-error' => 'Greška pri pokretanju sesije: $1',
+ 'config-no-session' => 'Vaši podaci sesije su izgubljeni!
+Provjerite vaš php.ini i provjerite da li je <code>session.save_path</code> postavljen na pravilni direktorijum.',
+ 'config-your-language' => 'Vaš jezik:',
+ 'config-your-language-help' => 'Odaberite jezik koji ćete koristiti tokom procesa instalacije.',
+ 'config-wiki-language' => 'Wiki jezik:',
+ 'config-wiki-language-help' => 'Odaberite jezik na kojem će wiki biti najvećim dijelim pisana.',
+ 'config-back' => '↠Nazad',
+ 'config-continue' => 'Nastavi →',
+ 'config-page-language' => 'Jezik',
+ 'config-page-welcome' => 'Dobrodošli u MediaWiki!',
+ 'config-page-dbconnect' => 'Poveži sa bazom podataka',
+ 'config-page-upgrade' => 'Unaprijedi postojeću instalaciju',
+ 'config-page-dbsettings' => 'Postavke baze podataka',
+ 'config-page-name' => 'Naziv',
+ 'config-page-options' => 'Opcije',
+ 'config-page-install' => 'Instaliraj',
+ 'config-page-complete' => 'Završeno!',
+ 'config-page-restart' => 'Ponovi instalaciju ispoÄetka',
+ 'config-page-readme' => 'ProÄitaj me',
+ 'config-page-releasenotes' => 'Bilješke izdanja',
+ 'config-page-copying' => 'Kopiram',
+ 'config-page-upgradedoc' => 'Nadograđujem',
+ 'config-help-restart' => 'Da li želite oÄistiti sve spremljene podatke koje ste unijeli i da zapoÄnete ponovo proces instalacije?',
+ 'config-restart' => 'Da, pokreni ponovo',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki PoÄetna strana]
+* [http://www.mediawiki.org/wiki/Help:Contents VodiÄ za korisnike]
+* [http://www.mediawiki.org/wiki/Manual:Contents VodiÄ za administratore]
+* [http://www.mediawiki.org/wiki/Manual:FAQ NPP]
+----
+* <doclink href=Readme>ProÄitaj me</doclink>
+* <doclink href=ReleaseNotes>Napomene izdanja</doclink>
+* <doclink href=Copying>Kopiranje</doclink>
+* <doclink href=UpgradeDoc>Poboljšavanje</doclink>',
+ 'config-env-good' => 'Okruženje je provjereno.
+Možete instalirati MediaWiki.',
+ 'config-env-php' => 'PHP $1 je instaliran.',
+ 'config-no-db' => 'Nije mogao biti pronađen podgodan drajver za bazu podataka!',
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] je instaliran',
+ 'config-apc' => '[http://www.php.net/apc APC] je instaliran',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] je instaliran',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran',
+ 'config-diff3-bad' => 'GNU diff3 nije pronađen.',
+ 'config-db-name' => 'Naziv baze podataka:',
+ 'config-db-name-oracle' => 'Å ema baze podataka:',
+ 'config-header-mysql' => 'Postavke MySQL',
+ 'config-header-postgres' => 'Postavke PostgreSQL',
+ 'config-header-sqlite' => 'Postavke SQLite',
+ 'config-header-oracle' => 'Postavke Oracle',
+ 'config-invalid-db-type' => 'Nevaljana vrsta baze podataka',
+ 'config-upgrade-done' => "Nadogradnja završena.
+
+Sada možete [$1 poÄeti koristiti vaÅ¡u wiki].
+
+Ako želite regenerisati vašu datoteku <code>LocalSettings.php</code>, kliknite na dugme ispod.
+Ovo '''nije preporuÄeno''' osim ako nemate problema s vaÅ¡om wiki.",
+ 'config-admin-name' => 'Vaše ime:',
+ 'config-admin-password' => 'Å ifra:',
+);
+
+/** Chechen (Ðохчийн)
+ * @author Sasan700
+ */
+$messages['ce'] = array(
+ 'config-no-fts3' => "'''Тергам бе''': SQLite гулйина хуттург йоцуш [http://sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
+);
+
+/** Czech (ÄŒesky) */
+$messages['cs'] = array(
+ 'config-information' => 'Informace',
+ 'config-continue' => 'PokraÄovat →',
+ 'config-page-language' => 'Jazyk',
+ 'config-page-name' => 'Název',
+ 'config-page-options' => 'Nastavení',
+ 'config-page-install' => 'Instalovat',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Věštba',
+ 'config-admin-name' => 'Vaše jméno:',
+ 'config-admin-email' => 'E-mailová adresa:',
+ 'config-email-settings' => 'Nastavení e-mailu',
+ 'config-install-step-failed' => 'selhaly',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author LWChris
+ * @author Purodha
+ * @author The Evil IP address
+ * @author Umherirrender
+ */
+$messages['de'] = array(
+ 'config-desc' => 'Das MediaWiki-Installationsprogramm',
+ 'config-title' => 'Installation von MediaWiki $1',
+ 'config-information' => 'Informationen',
+ 'config-localsettings-upgrade' => 'Eine Datei <code>LocalSettings.php</code> wurde gefunden.
+Um die vorhandene Installation aktualisieren zu können, muss der Wert des Parameters <code>$wgUpgradeKey</code> im folgenden Eingabefeld angegeben werden.
+Der Parameterwert befindet sich in der Datei LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Eine Datei <code>LocalSettings.php</code> wurde gefunden.
+Um die vorhandene Installation zu aktualisieren, muss die Datei <code>update.php</code> ausgeführt werden.',
+ 'config-localsettings-key' => 'Aktualisierungsschlüssel:',
+ 'config-localsettings-badkey' => 'Der angegebene Aktualisierungsschlüssel ist falsch.',
+ 'config-upgrade-key-missing' => 'Eine MediaWiki-Installation wurde gefunden.
+Um die vorhandene Installation aktualisieren zu können, muss die unten angegebene Codezeile in die Datei LocalSettings.php an deren Ende eingefügt werden:
+
+$1',
+ 'config-localsettings-incomplete' => 'Die vorhandene Datei LocalSettings.php scheint unvollständig zu sein.
+Die Variable <code>$1</code> wurde nicht definiert.
+Die Datei LocalSettings.php muss entsprechend geändert werden, so dass sie definiert ist. Klicke danach auf „Weiter“.',
+ 'config-localsettings-connection-error' => 'Beim Verbindungsversuch zur Datenbank ist, unter Verwendung der in den Dateien LocalSettings.php oder AdminSettings.php hinterlegten Einstellungen, ein Fehler aufgetreten. Diese Einstellungen müssen korrigiert werden. Danach kann ein erneuter Versuch unternommen werden.
+
+$1',
+ 'config-session-error' => 'Fehler beim Starten der Sitzung: $1',
+ 'config-session-expired' => 'Die Sitzungsdaten scheinen abgelaufen zu sein.
+Sitzungen sind für einen Zeitraum von $1 konfiguriert.
+Dieser kann durch Anhebung des Parameters <code>session.gc_maxlifetime</code> in der Datei <code>php.ini</code> erhöht werden.
+Den Installationsvorgang erneut starten.',
+ 'config-no-session' => 'Die Sitzungsdaten sind verloren gegangen!
+Die Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt werden, dass der Parameter <code>session.save_path</code> auf das richtige Verzeichnis verweist.',
+ 'config-your-language' => 'Sprache:',
+ 'config-your-language-help' => 'Bitte die Sprache auswählen, die während des Installationsvorgangs verwendet werden soll.',
+ 'config-wiki-language' => 'Sprache des Wikis:',
+ 'config-wiki-language-help' => 'Bitte die Hauptbearbeitungssprache des Wikis auswählen',
+ 'config-back' => '↠Zurück',
+ 'config-continue' => 'Weiter →',
+ 'config-page-language' => 'Sprache',
+ 'config-page-welcome' => 'Willkommen bei MediaWiki!',
+ 'config-page-dbconnect' => 'Mit der Datenbank verbinden',
+ 'config-page-upgrade' => 'Eine vorhandene Installation aktualisieren',
+ 'config-page-dbsettings' => 'Datenbankeinstellungen',
+ 'config-page-name' => 'Name',
+ 'config-page-options' => 'Optionen',
+ 'config-page-install' => 'Installieren',
+ 'config-page-complete' => 'Fertig!',
+ 'config-page-restart' => 'Installationsvorgang erneut starten',
+ 'config-page-readme' => 'Lies mich',
+ 'config-page-releasenotes' => 'Versionsinfos (en)',
+ 'config-page-copying' => 'Kopie der Lizenz',
+ 'config-page-upgradedoc' => 'Aktualisiere',
+ 'config-page-existingwiki' => 'Vorhandenes Wiki',
+ 'config-help-restart' => 'Sollen alle bereits eingegebene Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
+ 'config-restart' => 'Ja, erneut starten',
+ 'config-welcome' => '=== Prüfung der Installationsumgebung ===
+Basisprüfungen werden durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
+Die Ergebnisse dieser Prüfung sollten angegeben werden, sofern während des Installationsvorgangs Hilfe benötigt und erfragt wird.',
+ 'config-copyright' => "=== Lizenz und Nutzungsbedingungen ===
+
+$1
+
+Dieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/ oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
+
+Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
+
+Eine <doclink href=Copying>Kopie der ''GNU General Public License''</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
+ 'config-sidebar' => '* [http://www.mediawiki.org Website von MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Nutzeranleitung]
+* [http://www.mediawiki.org/wiki/Manual:Contents Administratorenanleitung]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Häufig gestellte Fragen]
+----
+* <doclink href=Readme>Lies mich</doclink>
+* <doclink href=ReleaseNotes>Versionsinformationen</doclink>
+* <doclink href=Copying>Lizenzbestimmungen</doclink>
+* <doclink href=UpgradeDoc>Aktualisierung</doclink>',
+ 'config-env-good' => 'Die Installationsumgebung wurde geprüft.
+MediaWiki kann installiert werden.',
+ 'config-env-bad' => 'Die Installationsumgebung wurde geprüft.
+MediaWiki kann nicht installiert werden.',
+ 'config-env-php' => 'PHP $1 ist installiert.',
+ 'config-env-php-toolow' => 'PHP $1 ist installiert.
+Allerdings benötigt MediaWiki PHP $2 oder höher.',
+ 'config-unicode-using-utf8' => 'Zur Unicode-Normalisierung wird Brion Vibbers <code>utf8_normalize.so</code> eingesetzt.',
+ 'config-unicode-using-intl' => 'Zur Unicode-Normalisierung wird die [http://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.',
+ 'config-unicode-pure-php-warning' => "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.
+Sofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
+ 'config-unicode-update-warning' => "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek [http://site.icu-project.org/ des ICU-Projekts].
+Diese sollte [http://www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
+ 'config-no-db' => 'Es konnte kein adäquater Datenbanktreiber gefunden werden!',
+ 'config-no-db-help' => 'Es muss ein Datenbanktreiber für PHP installiert werden.
+Die folgenden Datenbanksysteme werden unterstützt: $1
+
+Sofern ein gemeinschaftlich genutzter Server für das Hosting verwendet wird, muss der Hoster gefragt werden einen adäquaten Datenbanktreiber zu installieren.
+Sofern PHP selbst kompiliert wurde, muss es mit es neu konfiguriert werden, wobei der Datenbankclient zu aktivierten ist. Hierzu kann beispielsweise <code>./configure --with-mysql</code> ausgeführt werden.
+Sofern PHP über die Paketverwaltung einer Debian- oder Ubuntu-Installation installiert wurde, muss das „php5-mysql“-Paket nachinstalliert werden.',
+ 'config-no-fts3' => "'''Warnung:''' SQLite wurde ohne das [http://sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen zur Verfügung stehen.",
+ 'config-register-globals' => "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''
+'''Sie sollte deaktiviert werden, sofern dies möglich ist.'''
+Die MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
+ 'config-magic-quotes-runtime' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> von PHP ist aktiviert!'''
+Diese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.
+MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
+ 'config-magic-quotes-sybase' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!'''
+Diese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.
+MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
+ 'config-mbstring' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> von PHP ist aktiviert!'''
+Diese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.
+MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
+ 'config-ze1' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]</code> von PHP ist aktiviert!'''
+Diese Einstellung führt zu großen Fehlern bei MediaWiki.
+MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
+ 'config-safe-mode' => "'''Warnung:''' Der Funktion <code>[http://www.php.net/features.safe-mode Safe Mode]</code> von PHP ist aktiviert.
+Dies kann zu Problemen führen, insbesondere wenn das Hochladen von Dateien möglich sein, bzw. der Auszeichner <code>math</code> genutzt werden soll.",
+ 'config-xml-bad' => 'Das XML-Modul von PHP fehlt.
+MediaWiki benötigt Funktionen, die dieses Modul bereitstellt und wird in der bestehenden Konfiguration nicht funktionieren.
+Sofern Mandriva genutzt wird, muss noch das „php-xml“-Paket installiert werden.',
+ 'config-pcre' => 'Das PHP-Modul für die PCRE-Unterstützung wurde nicht gefunden.
+MediaWiki benötigt allerdings perl-kompatible reguläre Ausdrücke, um lauffähig zu sein.',
+ 'config-pcre-no-utf8' => "'''Fataler Fehler: Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.'''
+MediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.",
+ 'config-memory-raised' => 'Der PHP-Parameter <code>memory_limit</code> betrug $1 und wurde auf $2 erhöht.',
+ 'config-memory-bad' => "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.
+Dieser Wert ist wahrscheinlich zu niedrig.
+Der Installationsvorgang könnte daher scheitern!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] ist installiert',
+ 'config-apc' => '[http://www.php.net/apc APC] ist installiert',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] ist installiert',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
+ 'config-no-cache' => "'''Warnung:''' [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] konnten nicht gefunden werden.
+Das Objektcaching ist daher nicht aktiviert.",
+ 'config-diff3-bad' => 'GNU diff3 wurde nicht gefunden.',
+ 'config-imagemagick' => 'ImageMagick wurde gefunden: <code>$1</code>.
+Miniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.',
+ 'config-gd' => 'Die im System integrierte GD-Grafikbibliothek wurde gefunden.
+Miniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.',
+ 'config-no-scaling' => 'Weder die GD-Grafikbibliothek noch ImageMagick wurden gefunden.
+Miniaturansichten von Bildern sind daher nicht möglich.',
+ 'config-no-uri' => "'''Fehler:''' Die aktuelle URL konnte nicht ermittelt werden.
+Der Installationsvorgang wurde daher abgebrochen.",
+ 'config-uploads-not-safe' => "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.
+Obwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen diese [http://www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
+ 'config-brokenlibxml' => 'Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.
+PHP muss auf Version 5.2.9 oder später sowie libxml2 auf die Version 2.7.3 oder später aktualisiert werden, um das Problem zu lösen. Installationsabbruch ([http://bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).',
+ 'config-using531' => 'MediaWiki kann nicht zusammen mit PHP $1 verwendet werden. Grund hierfür ist ein Fehler im Zusammenhang mit den Verweisparametern zu <code>__call()</code>.
+PHP muss auf Version 5.3.2 oder höher oder 5.3.0 oder niedriger aktualisiert werden, um das Problem zu beheben.
+Die Installation wurde abgebrochen.',
+ 'config-db-type' => 'Datenbanksystem:',
+ 'config-db-host' => 'Datenbankserver:',
+ 'config-db-host-help' => 'Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.
+
+Sofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den zutreffenden Servernamen in seiner Dokumentation angegeben haben.
+
+Sofern auf einem Windows-Server installiert und MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.',
+ 'config-db-host-oracle' => 'Datenbank-TNS:',
+ 'config-db-host-oracle-help' => 'Einen gültigen [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm „Local Connect“-Namen] angeben. Die „tnsnames.ora“-Datei muss von dieser Installation erkannt werden können.<br />Sofern die Client-Bibliotheken für Version 10g oder neuer verwendet werden, kann auch [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm „Easy Connect“] zur Namensgebung genutzt werden.',
+ 'config-db-wiki-settings' => 'Bitte identifiziere dieses Wiki',
+ 'config-db-name' => 'Datenbankname:',
+ 'config-db-name-help' => 'Bitte einen Namen angeben, mit dem das Wiki identifiziert werden kann.
+Dabei sollten keine Leerzeichen verwendet werden.
+
+Sofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den Datenbanknamen angegeben oder aber die Erstellung einer Datenbank über ein entsprechendes Interface gestattet haben.',
+ 'config-db-name-oracle' => 'Datenbankschema:',
+ 'config-db-account-oracle-warn' => 'Es gibt drei von MediaWiki unterstützte Möglichkeiten Oracle als Datenbank einzurichten:
+
+Sofern das Datenbankbenutzerkonto während des Installationsvorgangs erstellt werden soll, muss ein Datenbankbenutzerkonto mit der SYSDBA-Berechtigung zusammen mit den entsprechenden Anmeldeinformationen angegeben werden, mit dem dann über das Web auf die Datenbank zugegriffen werden kann. Alternativ kann man auch lediglich ein einzelnes manuell angelegtes Datenbankbenutzerkonto angeben, mit dem über das Web auf die Datenbank zugegriffen werden kann, sofern dieses über die Berechtigung zur Erstellung von Datenbankschemen verfügt. Zudem ist es möglich zwei Datenbankbenutzerkonten anzugeben von denen eines die Berechtigung zur Erstellung von Datenbankschemen hat und das andere, um mit ihm über das Web auf die Datenbank zuzugreifen.
+
+Ein Skript zum Anlegen eines Datenbankbenutzerkontos mit den notwendigen Berechtigungen findet man unter dem Pfad „…/maintenance/oracle/“ dieser MediaWiki-Installation. Es ist dabei zu bedenken, dass die Verwendung eines Datenbankbenutzerkontos mit beschränkten Berechtigungen die Nutzung der Wartungsfunktionen für das Standarddatenbankbenutzerkonto deaktiviert.',
+ 'config-db-install-account' => 'Benutzerkonto für die Installation',
+ 'config-db-username' => 'Name des Datenbankbenutzers:',
+ 'config-db-password' => 'Passwort des Datenbankbenutzers:',
+ 'config-db-password-empty' => 'Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1
+Obzwar es möglich ist Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.',
+ 'config-db-install-username' => 'Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.',
+ 'config-db-install-password' => 'Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.',
+ 'config-db-install-help' => 'Benutzername und Passwort, die während des Installationsvorgangs, für die Verbindung mit der Datenbank, genutzt werden sollen, sind nun anzugeben.',
+ 'config-db-account-lock' => 'Derselbe Benutzername und das Passwort müssen während des Normalbetriebs des Wikis verwendet werden.',
+ 'config-db-wiki-account' => 'Benutzerkonto für den normalen Betrieb',
+ 'config-db-wiki-help' => 'Bitte Benutzernamen und Passwort angeben, die der Webserver während des Normalbetriebes dazu verwenden soll, eine Verbindung zum Datenbankserver herzustellen.
+Sofern ein entsprechendes Benutzerkonto nicht vorhanden ist und das Benutzerkonto für den Installationsvorgang über ausreichende Berechtigungen verfügt, wird dieses Benutzerkonto automatisch mit den Mindestberechtigungen zum Normalbetrieb des Wikis angelegt.',
+ 'config-db-prefix' => 'Datenbanktabellenpräfix:',
+ 'config-db-prefix-help' => 'Sofern eine Datenbank für mehrere Wikiinstallationen oder eine Wikiinstallation und eine andere Programminstallation genutzt werden soll, muss ein weiterer Datenbanktabellenpräfix angegeben werden, um Datenbankprobleme zu vermeiden.
+Es können keine Leerzeichen verwendet werden.
+
+Gewöhnlich bleibt dieses Datenfeld leer.',
+ 'config-db-charset' => 'Datenbankzeichensatz',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binär',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 abwärtskompatibles UTF-8',
+ 'config-charset-help' => "'''Warnung:''' Sofern '''abwärtskompatibles UTF-8''' bei MySQL 4.1+ verwendet und anschließend die Datenbank mit <code>mysqldump</code> gesichert wird, könnten alle nicht mit ASCII-codierten Zeichen beschädigt werden, was zu irreversiblen Schäden der Datensicherung führt!
+
+Im '''binären Modus''' speichert MediaWiki UTF-8 Texte in der Datenbank in binär kodierte Datenfelder.
+Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwendung jeglicher Unicode-Zeichen.
+Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,
+allerdings können keine Zeichen außerhalb des [http://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
+ 'config-mysql-old' => 'MySQL $1 oder höher wird benötigt. MySQL $2 ist momentan vorhanden.',
+ 'config-db-port' => 'Datenbankport:',
+ 'config-db-schema' => 'Datenschema für MediaWiki',
+ 'config-db-schema-help' => 'Dieses Datenschema ist in der Regel allgemein verwendbar.
+Nur Änderungen daran vornehmen, sofern es gute Gründe dafür gibt.',
+ 'config-sqlite-dir' => 'SQLite-Datenverzeichnis:',
+ 'config-sqlite-dir-help' => "SQLite speichert alle Daten in einer einzigen Datei.
+
+Das für sie vorgesehene Verzeichnis muss während des Installationsvorgangs beschreibbar sein.
+
+Es sollte '''nicht'' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
+
+Das Installationsprogramm wird mit der Datei zusammen eine zusätzliche <code>.htaccess</code>-Datei erstellen. Sofern dies scheitert, können Dritte auf die Datendatei zugreifen.
+Dies umfasst die Nutzerdaten (E-Mail-Adressen, Passwörter, etc.) wie auch gelöschte Seitenversionen und andere vertrauliche Daten, die im Wiki gespeichert sind.
+
+Es ist daher zu erwägen die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Standardtabellenraum:',
+ 'config-oracle-temp-ts' => 'Temporärer Tabellenraum:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki unterstützt die folgenden Datenbanksysteme:
+
+$1
+
+Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt es oben einen Link zur Anleitung mit Informationen, wie dieses aktiviert werden kann.',
+ 'config-support-mysql' => '* $1 ist das von MediaWiki primär unterstützte Datenbanksystem ([http://www.php.net/manual/en/mysql.installation.php Anleitung zur Kompilierung von PHP mit MySQL-Unterstützung (en)])',
+ 'config-support-postgres' => '* $1 ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung]). Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird.',
+ 'config-support-sqlite' => '* $1 ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))',
+ 'config-support-oracle' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])',
+ 'config-header-mysql' => 'MySQL-Einstellungen',
+ 'config-header-postgres' => 'PostgreSQL-Einstellungen',
+ 'config-header-sqlite' => 'SQLite-Einstellungen',
+ 'config-header-oracle' => 'Oracle-Einstellungen',
+ 'config-invalid-db-type' => 'Unzulässiges Datenbanksystem',
+ 'config-missing-db-name' => 'Bei „Datenbankname“ muss ein Wert angegeben werden.',
+ 'config-missing-db-host' => 'Bei „Datenbankhost“ muss ein Wert angegeben werden.',
+ 'config-missing-db-server-oracle' => 'Für das „Datenbank-TNS“ muss ein Wert eingegeben werden',
+ 'config-invalid-db-server-oracle' => 'Ungültiges Datenbank-TNS „$1“.
+Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9) und Unterstriche (_) und Punkte (.) verwendet werden.',
+ 'config-invalid-db-name' => 'Ungültiger Datenbankname „$1“.
+Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.',
+ 'config-invalid-db-prefix' => 'Ungültiger Datenbanktabellenpräfix „$1“.
+Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.',
+ 'config-connection-error' => '$1.
+
+Bitte unten angegebenen Servernamen, Benutzernamen sowie das Passwort überprüfen und es danach erneut versuchen.',
+ 'config-invalid-schema' => 'Ungültiges Datenschema für MediaWiki „$1“.
+Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9) und Unterstriche (_) verwendet werden.',
+ 'config-db-sys-create-oracle' => 'Das Installationsprogramm unterstützt nur die Verwendung eines Datenbankbenutzerkontos mit SYSDBA-Berechtigung zum Anlegen eines neuen Datenbankbenutzerkontos.',
+ 'config-db-sys-user-exists-oracle' => 'Das Datenbankbenutzerkonto „$1“ ist bereits vorhanden. Ein Datenbankbenutzerkontos mit SYSDBA-Berechtigung kann nur zum Anlegen eines neuen Datenbankbenutzerkontos genutzt werden.',
+ 'config-postgres-old' => 'PostgreSQL $1 oder höher wird benötigt. PostgreSQL $2 ist momentan vorhanden.',
+ 'config-sqlite-name-help' => 'Bitten einen Namen angeben, mit dem das Wiki identifiziert werden kann.
+Dabei bitte keine Leerzeichen oder Bindestriche verwenden.
+Dieser Name wird für die SQLite-Datendateinamen genutzt.',
+ 'config-sqlite-parent-unwritable-group' => 'Das Datenverzeichnis <code><nowiki>$1</nowiki></code> kann nicht erzeugt werden, da das übergeordnete Verzeichnis <code><nowiki>$2</nowiki></code> nicht für den Webserver beschreibbar ist.
+
+Das Installationsprogramm konnte den Benutzer bestimmen, mit dem Webserver ausgeführt wird.
+Schreibzugriff auf das <code><nowiki>$3</nowiki></code>-Verzeichnis muss für diesen ermöglicht werden, um den Installationsvorgang fortsetzen zu können.
+
+Auf einem Unix- oder Linux-System:
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Das Datenverzeichnis <code><nowiki>$1</nowiki></code> kann nicht erzeugt werden, da das übergeordnete Verzeichnis <code><nowiki>$2</nowiki></code> nicht für den Webserver beschreibbar ist.
+
+Das Installationsprogramm konnte den Benutzer bestimmen, mit dem Webserver ausgeführt wird.
+Schreibzugriff auf das <code><nowiki>$3</nowiki></code>-Verzeichnis muss global für diesen und andere Benutzer ermöglicht werden, um den Installationsvorgang fortsetzen zu können.
+
+Auf einem Unix- oder Linux-System:
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Fehler beim Erstellen des Datenverzeichnisses „$1“.
+
+Bitte den Speicherort überprüfen und es danach erneut versuchen.',
+ 'config-sqlite-dir-unwritable' => 'Das Verzeichnis „$1“ ist nicht beschreibbar.
+Bitte die Zugriffsberechtigungen so ändern, dass dieses Verzeichnis für den Webserver beschreibbar ist und es danach erneut versuchen.',
+ 'config-sqlite-connection-error' => '$1.
+
+Bitte unten angegebenes Datenverzeichnis sowie den Datenbanknamen überprüfen und es danach erneut versuchen.',
+ 'config-sqlite-readonly' => 'Die Datei <code>$1</code> ist nicht beschreibbar.',
+ 'config-sqlite-cant-create-db' => 'Die Datenbankdatei <code>$1</code> konnte nicht erzeugt werden.',
+ 'config-sqlite-fts3-downgrade' => 'PHP verfügt nicht über FTS3-Unterstützung. Die Tabellen wurden zurückgestuft.',
+ 'config-can-upgrade' => "Es wurden MediaWiki-Tabellen in dieser Datenbank gefunden.
+Um sie auf MediaWiki $1 zu aktualisieren, bitte auf '''Weiter''' klicken.",
+ 'config-upgrade-done' => "Die Aktualisierung ist abgeschlossen.
+
+Das Wiki kann nun [$1 genutzt werden].
+
+Sofern die Datei <code>LocalSettings.php</code> neu erzeugt werden soll, bitte auf die Schaltfläche unten klicken.
+Dies wird '''nicht empfohlen''', es sei denn, es treten Probleme mit dem Wiki auf.",
+ 'config-upgrade-done-no-regenerate' => 'Die Aktualisierung ist abgeschlossen.
+
+Das Wiki kann nun [$1 genutzt werden].',
+ 'config-regenerate' => 'LocalSettings.php neu erstellen →',
+ 'config-show-table-status' => 'Die Abfrage SHOW TABLE STATUS ist gescheitert!',
+ 'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
+ 'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
+ 'config-db-web-help' => 'Bitte Benutzernamen und Passwort auswählen, die der Webserver während des Normalbetriebes dazu verwenden soll, eine Verbindung zum Datenbankserver herzustellen.',
+ 'config-db-web-account-same' => 'Dasselbe Konto wie während des Installationsvorgangs verwenden',
+ 'config-db-web-create' => 'Sofern nicht bereits vorhanden, muss nun das Konto erstellt werden',
+ 'config-db-web-no-create-privs' => 'Das angegebene und für den Installationsvorgang vorgesehene Konto verfügt nicht über ausreichend Berechtigungen, um ein Konto zu erstellen.
+Das hier angegebene Konto muss bereits vorhanden sein.',
+ 'config-mysql-engine' => 'Speicher-Engine:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.
+
+'''MyISAM''' ist in Einzelnutzerumgebungen sowie bei schreibgeschützten Wikis schneller.
+Bei MyISAM-Datenbanken treten tendenziell häufiger Fehler auf als bei InnoDB-Datenbanken.",
+ 'config-mysql-charset' => 'Datenbankzeichensatz:',
+ 'config-mysql-binary' => 'binär',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "Im '''binären Modus''' speichert MediaWiki UTF-8 Texte in der Datenbank in binär kodierte Datenfelder.
+Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwendung jeglicher Unicode-Zeichen.
+
+Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,
+allerdings können keine Zeichen außerhalb des [http://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
+ 'config-site-name' => 'Name des Wikis:',
+ 'config-site-name-help' => 'Er wird in der Titelleiste des Browsers, wie auch verschiedenen anderen Stellen, genutzt.',
+ 'config-site-name-blank' => 'Sitenamen angeben.',
+ 'config-project-namespace' => 'Name des Projektnamensraums:',
+ 'config-ns-generic' => 'Projekt',
+ 'config-ns-site-name' => 'Entspricht dem Namen des Wikis: $1',
+ 'config-ns-other' => 'Sonstige (bitte angeben)',
+ 'config-ns-other-default' => 'MeinWiki',
+ 'config-project-namespace-help' => "Dem Beispiel von Wikipedia folgend, unterscheiden viele Wikis zwischen den Seiten für Inhalte und denen für Richtlinien. Letztere werden im „'''Projektnamensraum'''“ hinterlegt.
+Alle Seiten dieses Namensraumes verfügen über einen Seitenpräfix, der nun an dieser Stelle angegeben werden kann.
+Traditionell steht dieser Seitenpräfix mit dem Namen des Wikis in einem engen Zusammenhang. Dabei können bestimmte Sonderzeichen wie „#“ oder „:“ nicht verwendet werden.",
+ 'config-ns-invalid' => 'Der angegebene Namensraum „<nowiki>$1</nowiki>“ ist ungültig.
+Bitte einen abweichenden Projektnamensraum angeben.',
+ 'config-ns-conflict' => 'Der angegebene Namensraum „<nowiki>$1</nowiki>“ verursacht Problem mit dem Standardnamensraum von MediaWiki.
+Bitte einen abweichenden Projektnamensraum angeben.',
+ 'config-admin-box' => 'Administratorkonto',
+ 'config-admin-name' => 'Name:',
+ 'config-admin-password' => 'Passwort:',
+ 'config-admin-password-confirm' => 'Passwort wiederholen:',
+ 'config-admin-help' => 'Bitte den bevorzugten Benutzernamen angeben, beispielsweise „Knut Wuchtig“.
+Dies ist der Name, der benötigt wird, um sich im Wiki anzumelden.',
+ 'config-admin-name-blank' => 'Bitte den Benutzernamen für den Administratoren angeben.',
+ 'config-admin-name-invalid' => 'Der angegebene Benutzername „<nowiki>$1</nowiki>“ ist ungültig.
+Bitte einen abweichenden Benutzernamen angeben.',
+ 'config-admin-password-blank' => 'Bitte das Passwort für das Administratorkonto angeben.',
+ 'config-admin-password-same' => 'Das Passwort darf nicht mit dem Benutzernamen übereinstimmen.',
+ 'config-admin-password-mismatch' => 'Die beiden Passwörter stimmen nicht überein.',
+ 'config-admin-email' => 'E-Mail-Adresse:',
+ 'config-admin-email-help' => 'Bitte hier eine E-Mail-Adresse angeben, die den E-Mail-Empfang von anderen Benutzern des Wikis, das Zurücksetzen des Passwortes sowie Benachrichtigungen zu Änderungen an beobachteten Seiten ermöglicht. Diese Feld kann leer gelassen werden.',
+ 'config-admin-error-user' => 'Es ist beim Erstellen des Administrators mit dem Namen „<nowiki>$1</nowiki>“ ein interner Fehler aufgetreten.',
+ 'config-admin-error-password' => 'Es ist beim Setzen des Passworts für den Administrator „<nowiki>$1</nowiki>“ ein interner Fehler aufgetreten: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Es wurde eine ungültige E-Mail-Adresse angegeben',
+ 'config-subscribe' => 'Bitte die Mailingliste [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mitteilungen zu Versionsveröffentlichungen] abonnieren.',
+ 'config-subscribe-help' => 'Es handelt sich hierbei um eine Mailingliste mit wenigen Aussendungen, die für Mitteilungen zu Versionsveröffentlichungen, einschließlich wichtiger Sicherheitsveröffentlichungen, genutzt wird.
+Diese Mailingliste sollte abonniert werden. Zudem sollte die MediaWiki-Installation stets aktualisiert werden, sobald eine neue Programmversion veröffentlicht wurde.',
+ 'config-almost-done' => 'Der Vorgang ist fast abgeschlossen!
+Die verbliebenen Konfigurationseinstellungen können übersprungen und das Wiki umgehend installiert werden.',
+ 'config-optional-continue' => 'Sollen weitere Konfigurationseinstellungen vorgenommen werden?',
+ 'config-optional-skip' => 'Nein, das Wiki soll nun installiert werden.',
+ 'config-profile' => 'Profil der Benutzerberechtigungen:',
+ 'config-profile-wiki' => 'offenes Wiki',
+ 'config-profile-no-anon' => 'Erstellung eines Benutzerkontos erforderlich',
+ 'config-profile-fishbowl' => 'ausschließlich berechtigte Bearbeiter',
+ 'config-profile-private' => 'geschlossenes Wiki',
+ 'config-profile-help' => "Wikis sind am nützlichsten, wenn so viele Menschen als möglich Bearbeitungen vornehmen können.
+Mit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrauchbare Bearbeitungen, beispielsweise von unbedarften oder böswilligen Benutzern, rückgängig zu machen.
+
+Allerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es auch nicht einfach alle Beteiligten vollständig von den Vorteilen des „Wiki-Prinzips†zu überzeugen. Darum ist eine Auswahl möglich.
+
+Ein '''{{int:config-profile-wiki}}''' ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.
+Ein Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, bietet höhere Verantwortlichkeit des Einzelnen für seine Bearbeitungen, könnte allerdings Personen mit gelegentlichen Bearbeitungen abschrecken. Ein Wiki mit '''{{int:config-profile-fishbowl}}''' gestattet es nur ausgewählten Benutzern Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.
+
+Komplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [http://www.mediawiki.org/wiki/Manual:User_rights entsprechenden Anleitung].",
+ 'config-license' => 'Lizenz:',
+ 'config-license-none' => 'Keine Lizenzangabe in der Fußzeile',
+ 'config-license-cc-by-sa' => 'Creative Commons „Namensnennung, Weitergabe unter gleichen Bedingungen“',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons „Namensnennung, nicht kommerziell, Weitergabe unter gleichen Bedingungen“',
+ 'config-license-cc-0' => 'Creative Commons „Zero“',
+ 'config-license-gfdl-old' => 'GNU-Lizenz für freie Dokumentation 1.2',
+ 'config-license-gfdl-current' => 'GNU-Lizenz für freie Dokumentation 1.3 oder höher',
+ 'config-license-pd' => 'Gemeinfreiheit',
+ 'config-license-cc-choose' => 'Eine benutzerdefinierte Creative-Commons-Lizenz auswählen',
+ 'config-license-help' => 'Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz].
+Dies trägt dazu bei ein Gefühl von Gemeinschaft zu schaffen und ermutigt zu längerfristiger Mitarbeit.
+Dahingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.
+
+Sofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die Creative Commons-Lizens „Namensnennung, Weitergabe unter gleichen Bedingungen“ gewählt werden.
+
+Die GNU-Lizenz für freie Dokumentation ist die ehemalige Lizenz der Wikipedia.
+Sie ist noch immer gültig, beinhaltet aber einige Bedingungen, welche die Wiederverwendung und deren Interpretation erschweren.',
+ 'config-email-settings' => 'E-Mail-Einstellungen',
+ 'config-enable-email' => 'Ausgehende E-Mails ermöglichen',
+ 'config-enable-email-help' => 'Sofern die E-Mail-Funktionen genutzt werden sollen, müssen die entsprechenden [http://www.php.net/manual/en/mail.configuration.php PHP-E-Mail-Einstellungen] richtig konfiguriert werden.
+Für den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hier deaktiviert werden.',
+ 'config-email-user' => 'E-Mail-Versand von Benutzer zu Benutzer aktivieren',
+ 'config-email-user-help' => 'Allen Benutzern ermöglichen, sich gegenseitig E-Mails zu schicken, sofern sie es in ihren Einstellungen aktiviert haben.',
+ 'config-email-usertalk' => 'Benachrichtigungen zu Änderungen an Benutzerdiskussionsseiten ermöglichen',
+ 'config-email-usertalk-help' => 'Ermöglicht es Benutzern, Benachrichtigungen zu Änderungen an ihren Benutzerdiskussionsseiten zu erhalten, sofern sie dies in ihren Einstellungen aktiviert haben.',
+ 'config-email-watchlist' => 'Benachrichtigungen zu Änderungen an Seiten auf der Beobachtungsliste ermöglichen',
+ 'config-email-watchlist-help' => 'Ermöglicht es Benutzern, Benachrichtigungen zu Änderungen an Seiten auf ihrer Beobachtungsliste zu erhalten, sofern sie dies in ihren Einstellungen aktiviert haben.',
+ 'config-email-auth' => 'E-Mail-Authentifizierung ermöglichen',
+ 'config-email-auth-help' => "Sofern diese Funktion aktiviert ist, müssen Benutzer ihre E-Mail-Adresse bestätigen, indem sie den Bestätigungslink nutzen, der ihnen immer dann zugesandt wird, wenn sie ihre E-Mail-Adresse angeben oder ändern.
+Nur bestätigte E-Mail-Adressen können Nachrichten von anderen Benutzer oder Benachrichtigungsmitteilungen erhalten.
+Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mailfunktionen, '''empfohlen'''.",
+ 'config-email-sender' => 'E-Mail-Adresse für Antworten:',
+ 'config-email-sender-help' => 'Bitte hier die E-Mail-Adresse angeben, die als Absenderadresse bei ausgehenden E-Mails eingesetzt werden soll.
+Rücklaufende E-Mails werden an diese E-Mail-Adresse gesandt.
+Bei viele E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
+ 'config-upload-settings' => 'Hochladen von Bildern und Dateien',
+ 'config-upload-enable' => 'Das Hochladen von Dateien ermöglichen',
+ 'config-upload-help' => 'Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.
+Weitere Informationen hierzu sollen im [http://www.mediawiki.org/wiki/Manual:Security Abschnitt Sicherheit] der Anleitung gelesen werden.
+
+Um das Hochladen von Dateien zu ermöglichen, muss der Zugriff auf das Unterverzeichnis <code>./images</code> so geändert werden, das es für den Webserver beschreibbar ist.
+Hernach kann diese Option aktiviert werden.',
+ 'config-upload-deleted' => 'Verzeichnis für gelöschte Dateien:',
+ 'config-upload-deleted-help' => 'Bitte ein Verzeichnis auswählen, in dem gelöschte Dateien archiviert werden sollen.
+Idealerweise sollte es nicht über das Internet zugänglich sein.',
+ 'config-logo' => 'URL des Logos:',
+ 'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt, in der oberen linken Ecke, über Platz für eine Logo mit den Maßen 135x160 Pixel.
+Bitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an dieser Stelle angeben.
+
+Sofern kein Logo benötigt wird, kann dieses Datenfeld leer bleiben.',
+ 'config-instantcommons' => '„InstantCommons“ aktivieren',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons InstantCommons] ist eine Funktion, die es Wikis ermöglicht, Bild-, Klang- und andere Mediendateien zu nutzen, die auf der Website [http://commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.
+Um diese Funktion zu nutzen, muss MediaWiki eine Verbindung ins Internet herstellen können.
+
+Weitere Informationen zu dieser Funktion, einschließlich der Anleitung, wie andere Wikis als Wikimedia Commons eingerichtet werden können, gibt es im [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbuch].',
+ 'config-cc-error' => 'Der Creativ-Commons-Lizenzassistent konnte keine Lizenz ermitteln.
+Die Lizenz ist daher jetzt manuell einzugeben.',
+ 'config-cc-again' => 'Erneut auswählen…',
+ 'config-cc-not-chosen' => 'Die gewünschte Creative-Commons-Lizenz auswählen und dann auf „weiter“ klicken.',
+ 'config-advanced-settings' => 'Erweiterte Konfiguration',
+ 'config-cache-options' => 'Einstellungen für die Zwischenspeicherung von Objekten:',
+ 'config-cache-help' => 'Objektcaching wird dazu genutzt die Geschwindigkeit von MediaWiki zu verbessern, indem häufig genutzte Daten zwischengespeichert werden.
+Mittelgroße bis große Wikis werden sehr ermutigt dies zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Vorteile.',
+ 'config-cache-none' => 'Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann die Geschwindigkeit größerer Wikis beeinflusst werden)',
+ 'config-cache-accel' => 'Objektcaching von PHP (APC, eAccelerator, XCache or WinCache)',
+ 'config-cache-memcached' => 'Memchached Cacheserver nutzen (erfordert einen zusätzliche Installationsvorgang mitsamt Konfiguration)',
+ 'config-memcached-servers' => 'Memcached Cacheserver',
+ 'config-memcached-help' => 'Liste der für Memcached nutzbaren IP-Adressen.
+Es sollte eine je Zeile mitsamt des vorgesehenen Ports angegeben werden. Beispiele:
+127.0.0.1:11211
+192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Memcached wurde als Cacheserver ausgewählt. Dabei wurde allerdings kein Server angegeben.',
+ 'config-memcache-badip' => 'Es wurde für Memcached eine ungültige IP-Adresse angegeben: $1',
+ 'config-memcache-noport' => 'Es wurde kein Port zur Nutzung durch den Memcached Cacheserver angegeben: $1
+Sofern der Port unbekannt ist, ist 11211 die Standardangabe.',
+ 'config-memcache-badport' => 'Der Ports für den Memcached Cacheserver sollten zwischen $1 und $2 liegen',
+ 'config-extensions' => 'Erweiterungen',
+ 'config-extensions-help' => 'Die obig angegebenen Erweiterungen wurden im Verzeichnis <code>./extensions</code> gefunden.
+
+Sie könnten zusätzliche Konfigurierung erfordern, können aber bereits jetzt aktiviert werden.',
+ 'config-install-alreadydone' => "'''Warnung:''' Es wurde eine vorhandene MediaWiki-Installation gefunden.
+Es muss daher mit den nächsten Seite weitergemacht werden.",
+ 'config-install-begin' => 'Durch Drücken von „{{int:config-continue}}“ wird die Installation von MediaWiki gestartet.
+Sofern Änderungen vorgenommen werden sollen, kann man auf „Zurück“ klicken.',
+ 'config-install-step-done' => 'erledigt',
+ 'config-install-step-failed' => 'gescheitert',
+ 'config-install-extensions' => 'Einschließlich Erweiterungen',
+ 'config-install-database' => 'Datenbank wird eingerichtet',
+ 'config-install-pg-schema-not-exist' => 'Das PostgesSQL-Schema ist nicht vorhanden',
+ 'config-install-pg-schema-failed' => 'Das Erstellen der Datentabellen ist gescheitert.
+Es muss sichergestellt sein, dass der Benutzer „$1“ Schreibzugriff auf das Datenschema „$2“ hat.',
+ 'config-install-pg-commit' => 'Änderungen anwenden',
+ 'config-install-pg-plpgsql' => 'Suche nach der Datenbanksprache PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Für Datenbank $1 muss die Datenbanksprache PL/pgSQL installiert werden',
+ 'config-pg-no-create-privs' => 'Das für die Installation angegeben Konto verfügt nicht über ausreichende Berechtigungen, um ein Datenbanknutzerkonto zu erstellen.',
+ 'config-install-user' => 'Datenbankbenutzer wird erstellt',
+ 'config-install-user-alreadyexists' => 'Datenbankbenutzer „$1“ ist bereits vorhanden',
+ 'config-install-user-create-failed' => 'Das Anlegen des Datenbankbenutzers „$1“ ist gescheitert: $2',
+ 'config-install-user-grant-failed' => 'Die Gewährung der Berechtigung für Datenbankbenutzer „$1“ ist gescheitert: $2',
+ 'config-install-tables' => 'Datentabellen werden erstellt',
+ 'config-install-tables-exist' => "'''Warnung:''' Es wurden MediaWiki-Datentabellen gefunden.
+Die Erstellung wurde übersprungen.",
+ 'config-install-tables-failed' => "'''Fehler:''' Die Erstellung der Datentabellen ist aufgrund des folgenden Fehlers gescheitert: $1",
+ 'config-install-interwiki' => 'Interwikitabellen werden eingerichtet',
+ 'config-install-interwiki-list' => 'Die Datei <code>interwiki.list</code> konnte nicht gefunden werden.',
+ 'config-install-interwiki-exists' => "'''Warnung:''' Es wurden Interwikitabellen mit Daten gefunden.
+Die Standardliste wird übersprungen.",
+ 'config-install-stats' => 'Initialisierung der Statistiken',
+ 'config-install-keys' => 'Erstellung der Geheimschlüssel',
+ 'config-insecure-keys' => "'''Warnung:''' {{PLURAL:$2|Der Geheimschlüssel|Die Geheimschlüssel}} $1 {{PLURAL:$2|der|die}} während des Installationsvorgangs generiert wurde, ist nicht sehr sicher. {{PLURAL:$2|Er sollte|Sie sollten}} manuell geändert werden.",
+ 'config-install-sysop' => 'Administratorkonto wird erstellt',
+ 'config-install-subscribe-fail' => 'Abonnierung von „mediawiki-announce“ ist gescheitert',
+ 'config-install-mainpage' => 'Erstellung der Hauptseite mit Standardinhalten',
+ 'config-install-extension-tables' => 'Erstellung der Tabellen für die aktivierten Erweiterungen',
+ 'config-install-mainpage-failed' => 'Die Hauptseite konnte nicht erstellt werden: $1',
+ 'config-install-done' => "'''Herzlichen Glückwunsch!'''
+MediaWiki wurde erfolgreich installiert.
+
+Das Installationsprogramm hat die Datei <code>LocalSettings.php</code> erzeugt.
+Sie enthält alle Konfigurationseinstellungen.
+
+Diese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei <code>index.php</code> befindet. Das Herunterladen sollte automatisch gestartet worden sein.
+
+Sofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann der Vorgang durch einen Klick auf untenstehenden Link erneut gestartet werden:
+
+$3
+
+'''Hinweis:''' Sofern das Herunterladen der Konfigurationsdatei nicht jetzt durchgeführt wird, wird sie zu einem späteren Zeitpunkt nach dem Beenden des Installationsprogramms nicht mehr zur Verfügung stehen.
+
+Sobald dies alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''.",
+ 'config-download-localsettings' => 'LocalSettings.php herunterladen',
+ 'config-help' => 'Hilfe',
+);
+
+/** Esperanto (Esperanto)
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'config-your-language' => 'Via lingvo:',
+ 'config-your-language-help' => 'Elekti lingvon uzi dum la instalada procezo.',
+ 'config-wiki-language' => 'Lingvo de la vikio:',
+ 'config-wiki-language-help' => 'Elekti la ĉefe skribotan lingvon de la vikio.',
+ 'config-page-welcome' => 'Bonvenon al MediaWiki!',
+ 'config-page-dbsettings' => 'Agordoj de la datumbazo',
+ 'config-page-name' => 'Nomo',
+ 'config-page-options' => 'Agordoj',
+ 'config-page-install' => 'Instali',
+ 'config-page-complete' => 'Farita!',
+);
+
+/** Spanish (Español)
+ * @author Crazymadlover
+ * @author Danke7
+ * @author Platonides
+ * @author Sanbec
+ * @author Translationista
+ */
+$messages['es'] = array(
+ 'config-desc' => 'El instalador para MediaWiki',
+ 'config-title' => 'MediaWiki $1 instalación',
+ 'config-information' => 'Información',
+ 'config-localsettings-upgrade' => "'''Atención''': Se ha encontrado un fichero de configuración <code>LocalSettings.php</code>.
+Para actualizar MediaWiki mueva <code>LocalSettings.php</code> a un lugar seguro y ejecute de nuevo el instalador.",
+ 'config-session-error' => 'Error comenzando sesión: $1',
+ 'config-session-expired' => 'Tus datos de sesión parecen haber expirado.
+Las sesiones están configuradas por una duración de $1.
+Puedes incrementar esto configurando <code>session.gc_maxlifetime</code> en php.ini.
+Reiniciar el proceso de instalación.',
+ 'config-no-session' => 'Se han perdido los datos de sesión.
+Verifica tu php.ini y comprueba que <code>session.save_path</code> está establecido en un directorio apropiado.',
+ 'config-your-language' => 'Tu idioma:',
+ 'config-your-language-help' => 'Seleccionar un idioma a usar durante el proceso de instalación.',
+ 'config-wiki-language' => 'Idioma del wiki:',
+ 'config-wiki-language-help' => 'Seleccionar el idioma en el que el wiki será escrito predominantemente.',
+ 'config-back' => '↠Atrás',
+ 'config-continue' => 'Continuar →',
+ 'config-page-language' => 'Idioma',
+ 'config-page-welcome' => 'Bienvenido a MediaWiki!',
+ 'config-page-dbconnect' => 'Conectar a la base de datos',
+ 'config-page-upgrade' => 'Actualizar instalación existente',
+ 'config-page-dbsettings' => 'Configuración de la base de datos',
+ 'config-page-name' => 'Nombre',
+ 'config-page-options' => 'Opciones',
+ 'config-page-install' => 'Instalar',
+ 'config-page-complete' => 'Completo!',
+ 'config-page-restart' => 'Reiniciar instalación',
+ 'config-page-readme' => 'Léeme',
+ 'config-page-releasenotes' => 'Notas de la versión',
+ 'config-page-copying' => 'Copiando',
+ 'config-page-upgradedoc' => 'Actualizando',
+ 'config-help-restart' => '¿Deseas borrar todos los datos que has ingresado hasta ahora y reiniciar el proceso de instalación desde el principio?',
+ 'config-restart' => 'Sí, reiniciarlo',
+ 'config-welcome' => '=== Comprobación del entorno ===
+Se realiza comprobacioens básicas para ver si el entorno es adecuado para la instalación de MediaWiki.
+Deberás suministrar los resultados de tales comprobaciones si necesitas ayuda durante la instalación.',
+ 'config-copyright' => "=== Derechos de autor y Términos de uso ===
+
+$1
+
+Este programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefiera).
+
+Este programa es distribuido en la esperanza de que sea útil, pero '''sin cualquier garantía'''; inclusive, sin la garantía implícita de la '''posibilidad de ser comercializado''' o de '''idoneidad para cualquier finalidad específica'''.
+Consulte la licencia *GNU General *Public *License para más detalles.
+
+En conjunto con este programa debe haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; si no la recibió, pídala por escrito a Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html léala en internet].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Página principal de MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Guía del usuario]
+* [http://www.mediawiki.org/wiki/Manual:Contents Guía del administrador]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Preguntas frecuentes]',
+ 'config-env-good' => 'El entorno ha sido comprobado.
+Puedes instalar MediaWiki.',
+ 'config-env-bad' => 'El entorno ha sido comprobado.
+No puedes instalar MediaWiki.',
+ 'config-env-php' => 'PHP $1 está instalado.',
+ 'config-unicode-using-utf8' => 'Usando utf8_normalize.so de Brion Vibber para la normalización Unicode.',
+ 'config-unicode-using-intl' => 'Usando la [http://pecl.php.net/intl extensión intl PECL] para la normalización Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Advertencia''': La [http://*pecl.*php.*net/*intl extensión intl PECL] no está disponible para efectuar la normalización Unicode.
+Si tu web tiene un alto volumen de tráfico, te recomendamos leer acerca de [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalización Unicode].",
+ 'config-unicode-update-warning' => "'''Warning''': La versión instalada del contenedor de normalización Unicode usa una versión anterior de la biblioteca del [http://site.icu-project.org/ proyecto ICU].
+Deberás [http://www.mediawiki.org/wiki/Unicode_normalization_considerations actualizar] si realmente deseas usar Unicode.",
+ 'config-no-db' => 'No fue posible encontrar un controlador adecuado para la base de datos.',
+ 'config-no-db-help' => 'Necesitará instalar un controlador de base de datos para PHP.
+Estos son los tipos de base de datos compatibles: $1.
+
+Si tu web está en un alojamiento compartido, solicita a tu proveedor la instalación de un controlador de base de datos ocmpatible.
+Si has compilado tú mismo(a) el PHP, reconfigúralo con un cliente de base de datos habilitado, por ejemplo mediante <code>./configure --with-mysql</code>.
+Si instalaste el PHP a partir de un paquete Debian o Ubuntu, entonces necesitarás instalar también el módulo php5-mysql.',
+ 'config-no-fts3' => "'''Advertencia''': SQLite está compilado sin el [http://sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
+ 'config-register-globals' => "'''Advertencia: La opción de <code>[http://php.net/register_globals register_globals]</code> de PHP está habilitada.'''
+'''Desactívela si puede.'''
+MediaWiki funcionará, pero tu servidor quedará expuesto a vulnerabilidades de seguridad potenciales.",
+ 'config-magic-quotes-runtime' => "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''
+Esta opción causa la imprevisible corrupción de la entrada de datos.
+No puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
+ 'config-magic-quotes-sybase' => "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''
+Esta opción causa la imprevisible corrupción de la entrada de datos.
+No puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
+ 'config-mbstring' => "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''
+Esta opción causa errores y puede corromper los datos de una forma imprevisible.
+No se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
+ 'config-ze1' => "'''Fatal: ¡La opción [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está activada!'''
+Esta opción causa problemas significativos en MediaWiki.
+No se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
+ 'config-safe-mode' => "'''Advertencia:''' El [http://www.php.net/features.safe-mode modo seguro] de PHP está activado.
+Este modo puede causar problemas, especialmente en la carga de archivosy en compatibilidad con <code>math</code>.",
+ 'config-xml-bad' => 'Falta el módulo XML de PHP.
+MediaWiki necesita funciones en este módulo y no funcionará con esta configuración.
+Si está ejecutando Mandrake, instale el paquete php-xml.',
+ 'config-pcre' => 'Parece faltar el módulo de compatibilidad PCRE.
+MediaWiki necesita que las funciones de expresiones regulares compatibles con Perl estén funcionando.',
+ 'config-memory-raised' => 'el parámetro <code>memory_limit</code> de PHP es $1, aumentada a $2.',
+ 'config-memory-bad' => "'''Advertencia:''' El parámetro <code>memory_limit</code> de PHP es $1.
+Probablemente este valor es demasiado bajo.
+¡La instalación podrá fallar!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] está instalado',
+ 'config-apc' => '[http://www.php.net/apc APC] está instalado',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] está instalado',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
+ 'config-no-cache' => "'''Advertencia:''' No pudo encontrarse [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
+El caché de objetos no está habilitado.",
+ 'config-diff3-bad' => 'GNU diff3 no se encuentra.',
+ 'config-imagemagick' => 'ImageMagick encontrado: <code>$1</code>.
+La miniaturización de imágenes se habilitará si habilitas las cargas.',
+ 'config-gd' => 'Se ha encontrado una biblioteca de gráficos GD integrada.
+La miniaturización de imágenes se habilitará si habilitas las subidas.',
+ 'config-no-scaling' => 'No se ha encontrado ninguma biblioteca GD o ImageMagik.
+Se inhabilitará la miniaturización de imágenes.',
+ 'config-no-uri' => "'''Error:''' No se pudo determinar el URI actual.
+Instalación abortada.",
+ 'config-db-type' => 'Tipo de base de datos',
+ 'config-db-host' => 'Servidor de la base de datos:',
+ 'config-db-wiki-settings' => 'Identifique este wiki',
+ 'config-db-name' => 'Nombre de base de datos:',
+ 'config-db-install-account' => 'Cuenta de usuario para instalación',
+ 'config-db-username' => 'Nombre de usuario de base de datos:',
+ 'config-db-password' => 'contraseña de base de datos:',
+ 'config-db-install-help' => 'Ingresar el nombre de usuario y la contraseña que será usada para conectar a la base de datos durante el proceso de instalación.',
+ 'config-db-account-lock' => 'Usar el mismo nombre de usuario y contraseña durante operación normal',
+ 'config-db-wiki-account' => 'Usar cuenta para operación normal',
+ 'config-db-wiki-help' => 'Introduce el nombre de usuario y la contraseña que serán usados para acceder a la base de datos durante la operación normal del wiki.
+Si esta cuenta no existe y la cuenta de instalación tiene suficientes privilegios, se creará esta cuenta de usuario con los privilegios mínimos necesarios para la operación normal del wiki.',
+ 'config-db-prefix' => 'Prefijo para las tablas de la base de datos:',
+ 'config-db-charset' => 'Conjunto de caracteres de la base de datos',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binario',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 retrocompatible UTF-8',
+ 'config-mysql-old' => 'Se necesita MySQL $1 o una versión más reciente. Tienes la versión $2.',
+ 'config-db-port' => 'Puerto de la base de datos:',
+ 'config-db-schema' => 'Esquema para MediaWiki',
+ 'config-db-schema-help' => 'Normalmente, los esquemas arriba son los correctos.
+Altéralos sólo si tienes la seguridad de que necesitas alterarlos.',
+ 'config-sqlite-dir' => 'Directorio de datos SQLite:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki es compatible con los siguientes sistemas de bases de datos:
+
+$1
+
+Si no encuentras en el listado el sistema de base de datos que estás intentando utilizar, sigue las instrucciones vinculadas arriba para habilitar la compatibilidad.',
+ 'config-support-mysql' => '* $1 es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad ([http://www.php.net/manual/es/mysql.installation.php cómo compilar PHP con compatibilidad MySQL])',
+ 'config-support-postgres' => '* $1 es una popular base de datos de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php cómo compilar PHP con compatibilidad PostgreSQL])',
+ 'config-support-sqlite' => '* $1 es una base de datos ligera con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usa PDO)',
+ 'config-support-oracle' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/oci8.installation.php cómo compilar PHP con compatibilidad con OCI8])',
+ 'config-header-mysql' => 'Configuración de MySQL',
+ 'config-header-postgres' => 'Configuración de PostgreSQL',
+ 'config-header-sqlite' => 'Configuración de SQLite',
+ 'config-header-oracle' => 'Configuración de Oracle',
+ 'config-invalid-db-type' => 'Tipo de base de datos inválida',
+ 'config-missing-db-name' => 'Debes introducir un valor para "Nombre de la base de datos"',
+ 'config-invalid-db-name' => 'El nombre de la base de datos "$1" es inválido.
+Usa sólo caracteres ASCII: letras (a-z, A-Z), guarismos (0-9) y guiones bajos (_).',
+ 'config-invalid-db-prefix' => 'El prefijo de la base de datos "$1" es inválido.
+Use sólo carateres ASCII: letras (a-z, A-Z), guarismos (0-9) y guiones bajos (_).',
+ 'config-connection-error' => '$1.
+
+Verifique el servidor, el nombre de usuario y la contraseña, e intente de nuevo.',
+ 'config-invalid-schema' => 'El esquema de la base de datos "$1" es inválido.
+Use sólo carateres ASCII: letras (a-z, A-Z), guarismos (0-9) y guiones bajos (_).',
+ 'config-postgres-old' => 'Se necesita PostgreSQL $1 o una versión más reciente; tienes la versión $2.',
+ 'config-sqlite-name-help' => 'Elige el nombre que identificará tu wiki.
+No uses espacios o guiones.
+Este nombre será usado como nombre del archivo de datos de SQLite.',
+ 'config-sqlite-mkdir-error' => 'Error al crear el directorio de datos "$1".
+Comprueba la ubicación e inténtalo de nuevo.',
+ 'config-sqlite-dir-unwritable' => 'No se puede escribir en el directorio "$1".
+Modifica los permisos para que el servidor web pueda escribir en él y vuelve a intentarlo.',
+ 'config-sqlite-connection-error' => '$1.
+
+Verifique el directório de datos y el nombre de la base de datos mostrada a continuación e inténtalo nuevamente.',
+ 'config-sqlite-readonly' => 'El archivo <code>$1</code> no se puede escribir.',
+ 'config-sqlite-cant-create-db' => 'No fue posible crear el archivo de la base de datos <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'El PHP no tiene compatibilidad FTS3. actualizando tablas a una versión anterior',
+ 'config-can-upgrade' => "Esta base de datos contiene tablas de MediaWiki.
+Para actualizarlas a MediaWiki $1, haz clic en '''Continuar'''.",
+ 'config-regenerate' => 'Regenerar LocalSettings.php →',
+ 'config-show-table-status' => 'SHOW TABLE STATUS ha fallado!',
+ 'config-unknown-collation' => "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
+ 'config-db-web-account' => 'Cuenta de base de datos para acceso Web',
+ 'config-db-web-help' => 'Elige el usuario y contraseña que el servidor Web usará para conectarse al servidor de la base de datos durante el fincionamiento normal del wiki.',
+ 'config-db-web-account-same' => 'Utilizar la misma cuenta que en la instalación',
+ 'config-db-web-create' => 'Crear la cuenta si no existe',
+ 'config-db-web-no-create-privs' => 'La cuenta que has especificado para la instalación no tiene privilegios suficientes para crear una cuenta.
+La cuenta que especifiques aquí debe existir.',
+ 'config-mysql-engine' => 'Motor de almacenamiento:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' es casi siempre la mejor opción, dado que soporta bien los accesos simultáneos.
+
+'''MyISAM''' es más rápido en instalaciones de usuario único o de sólo lectura.
+Las bases de datos MyISAM tienden a corromperse más a menudo que las bases de datos InnoDB.",
+ 'config-mysql-charset' => 'Conjunto de caracteres de la base de datos:',
+ 'config-mysql-binary' => 'Binario',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Nombre del wiki:',
+ 'config-site-name-help' => 'Esto aparecerá en la barra de título del navegador y en varios otros lugares.',
+ 'config-site-name-blank' => 'Ingresar un nombre de sitio.',
+ 'config-project-namespace' => 'Espacio de nombre de proyecto:',
+ 'config-ns-generic' => 'Proyecto',
+ 'config-ns-site-name' => 'Igual como el nombre del wiki: $1',
+ 'config-ns-other' => 'Otro (especificar)',
+ 'config-ns-other-default' => 'MiWiki',
+ 'config-ns-invalid' => 'El espacio de nombre especificado "<nowiki>$1</nowiki>" no es válido.
+Especifica un espacio de nombre de proyecto diferente.',
+ 'config-admin-box' => 'Cuenta de administrador',
+ 'config-admin-name' => 'Tu nombre:',
+ 'config-admin-password' => 'Contraseña:',
+ 'config-admin-password-confirm' => 'Repita la contraseña:',
+ 'config-admin-help' => 'Escribe aquí el nombre de usuario que desees, como por ejemplo "Pedro Bloggs".
+Este es el nombre que usarás para entrar al wiki.',
+ 'config-admin-name-blank' => 'Introduce un nombre de usuario de administrador.',
+ 'config-admin-name-invalid' => 'El nombre de usuario especificado "<nowiki>$1</nowiki>" no es válido.
+Especifique un nombre de usuario diferente.',
+ 'config-admin-password-blank' => 'Introduzca una contraseña para la cuenta de administrador.',
+ 'config-admin-password-same' => 'La contraseña no debe ser la misma que el nombre de usuario.',
+ 'config-admin-password-mismatch' => 'Las dos contraseñas que ingresaste no coinciden.',
+ 'config-admin-email' => 'Dirección de correo electrónico:',
+ 'config-admin-email-help' => 'Introduce aquí un correo electrónico que te permita recibir mensajes de otros usuarios del wiki, vuelve a configurar tu contraseña y recibe notificaciones de cambios realizados a tus páginas vigiladas.',
+ 'config-admin-error-user' => 'Error interno al crear un administrador con el nombre "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Error interno al establecer una contraseña para el administrador " <nowiki>$1</nowiki> ": <pre>$2</pre>',
+ 'config-subscribe' => 'Suscribirse para recibir [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce avisos de nuevas versiones].',
+ 'config-subscribe-help' => 'Esta es una lista de divulgación de bajo volumen para anuncios de lanzamiento de versiones nuevas, incluyendo anuncios de seguridad importantes.
+Te recomendamos suscribirte y actualizar tu instalación MediaWiki cada vez que se lance una nueva versión.',
+ 'config-almost-done' => '¡Ya casi has terminado!
+Ahora puedes saltarte el resto de pasos e instalar el wiki con valores predeterminados.',
+ 'config-optional-continue' => 'Hazme más preguntas.',
+ 'config-optional-skip' => 'Ya estoy aburrido, sólo instala el wiki.',
+ 'config-profile' => 'Perfil de derechos de usuario:',
+ 'config-profile-wiki' => 'Wiki tradicional',
+ 'config-profile-no-anon' => 'Creación de cuenta requerida',
+ 'config-profile-fishbowl' => 'Sólo editores autorizados',
+ 'config-profile-private' => 'Wiki privado',
+ 'config-license' => 'Copyright and licencia:',
+ 'config-license-none' => 'Pie sin licencia',
+ 'config-license-cc-by-sa' => 'Creative Commons Reconocimiento Compartir Igual',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Reconocimiento Compartir Igual no comercial',
+ 'config-license-gfdl-old' => 'GNU Licencia de Documentación Libre 1.2',
+ 'config-license-gfdl-current' => 'Licencia de documentación libre GNU 1.3 o más reciente',
+ 'config-license-pd' => 'Dominio Público',
+ 'config-license-cc-choose' => 'Selecciona una licencia personalizada de Creative Commons',
+ 'config-email-settings' => 'Configuración de correo electrónico',
+ 'config-enable-email' => 'Activar el envío de e-mails',
+ 'config-enable-email-help' => 'Si quieres que el correo electrónico funcione, la [http://www.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser la correcta.
+Si no quieres la funcionalidad de correo electrónico, puedes desactivarla aquí.',
+ 'config-email-user' => 'Habilitar correo electrónico de usuario a usuario',
+ 'config-email-user-help' => 'Permitir que todos los usuarios intercambien correos electrónicos si lo han activado en sus preferencias.',
+ 'config-email-usertalk' => 'Activar notificaciones de páginas de discusión de usuarios',
+ 'config-email-usertalk-help' => 'Permitir a los usuarios recibir notificaciones de cambios en la página de discusión de usuario, si lo han activado en sus preferencias.',
+ 'config-email-watchlist' => 'Activar notificación de alteraciones a la páginas vigiladas',
+ 'config-email-watchlist-help' => 'Permitir a los usuarios recibir notificaciones de cambios en la páginas que vigilan, si lo han activado en sus preferencias.',
+ 'config-email-auth' => 'Activar autenticación del correo electrónico',
+ 'config-email-sender' => 'Dirección de correo electrónico de retorno:',
+ 'config-email-sender-help' => 'Introduce la dirección de correo electrónico que será usada como dirección de retorno en los mensajes electrónicos de salida.
+Aquí llegarán los correos electrónicos que no lleguen a su destino.
+Muchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.',
+ 'config-upload-settings' => 'Cargas de imágenes y archivos',
+ 'config-upload-enable' => 'Habilitar la subida de archivos',
+ 'config-upload-deleted' => '*Directório para los archivos eliminados:',
+ 'config-upload-deleted-help' => 'Elige un directorio en el que guardar los archivos eliminados.
+Lo ideal es una carpeta no accesible desde la red.',
+ 'config-logo' => 'URL del logo :',
+ 'config-instantcommons' => 'Habilitar Instant Commons',
+ 'config-cc-error' => 'El selector de licencia de Creative Commons no dio resultado.
+Escribe el nombre de la licencia manualmente.',
+ 'config-cc-again' => 'Elegir otra vez...',
+ 'config-cc-not-chosen' => 'Elige la licencia Creative Commons que desees y haz clic en "continuar".',
+ 'config-advanced-settings' => 'Configuración avanzada',
+ 'config-cache-options' => 'Configuración de la caché de objetos:',
+ 'config-cache-help' => 'El almacenamiento en caché de objetos se utiliza para mejorar la velocidad de MediaWiki mediante el almacenamiento en caché los datos usados más frecuentemente.
+A los sitios medianos y grandes se les recomienda que permitirlo. También es beneficioso para los sitios pequeños.',
+ 'config-cache-none' => 'Sin almacenamiento en caché (no se pierde ninguna funcionalidad, pero la velocidad puede resentirse en sitios grandes)',
+ 'config-cache-accel' => 'Almacenamiento en caché de objetos PHP (APC, eAccelerator, XCache o WinCache)',
+ 'config-cache-memcached' => 'Utilizar Memcached (necesita ser instalado y configurado aparte)',
+ 'config-memcached-servers' => 'Servidores Memcached:',
+ 'config-memcached-help' => 'Lista de direcciones IP que serán usadas para Memcached.
+Deben ser separadas por comas y especificar el puerto a utilizar (por ejemplo: 127.0.0.1:11211, 192.168.1.25:11211).',
+ 'config-extensions' => 'Extensiones',
+ 'config-extensions-help' => 'Se ha detectado en tu directorio <code>./extensions</code> las extensiones listadas arriba.
+
+Puede que necesiten configuraciones adicionales, pero puedes habilitarlas ahora.',
+ 'config-install-alreadydone' => "'''Aviso:''' Parece que ya habías instalado MediaWiki y estás intentando instalarlo nuevamente.
+Pasa a la próxima página, por favor.",
+ 'config-install-step-done' => 'hecho',
+ 'config-install-step-failed' => 'falló',
+ 'config-install-extensions' => 'Extensiones inclusive',
+ 'config-install-database' => 'Configurando la base de datos',
+ 'config-install-pg-schema-failed' => 'La creación de las tablas ha fallado.
+Asegúrate de que el usuario "$1" puede escribir en el esquema "$2".',
+ 'config-install-user' => 'Creando el usuario de la base de datos',
+ 'config-install-user-grant-failed' => 'La concesión de permisos para el usuario "$1" ha fallado: $2',
+ 'config-install-tables' => 'Creando tablas',
+ 'config-install-tables-exist' => "'''Advertencia''': Al parecer, las tablas de MediaWiki ya existen. Saltándose su creación.",
+ 'config-install-tables-failed' => "'''Error''': La creación de las tablas falló con el siguiente error: $1",
+ 'config-install-interwiki' => 'Llenando la tabla interwiki predeterminada',
+ 'config-install-interwiki-list' => 'No se pudo encontrar el archivo <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Advertencia''': La tabla de interwikis parece ya contener entradas.
+Se omitirá la lista predeterminada.",
+ 'config-install-keys' => 'Generación de clave secreta',
+ 'config-install-sysop' => 'Creando cuenta de usuario del administrador',
+);
+
+/** Basque (Euskara)
+ * @author An13sa
+ */
+$messages['eu'] = array(
+ 'config-desc' => 'MediaWiki instalatzailea',
+ 'config-title' => 'MediaWiki $1 instalazioa',
+ 'config-information' => 'Informazioa',
+ 'config-session-error' => 'Saio hasierako errorea: $1',
+ 'config-your-language' => 'Zure hizkuntza:',
+ 'config-your-language-help' => 'Aukeratu instalazio prozesuan erabiliko den hizkuntza',
+ 'config-wiki-language' => 'Wiki hizkuntza:',
+ 'config-back' => '↠Atzera',
+ 'config-continue' => 'Jarraitu →',
+ 'config-page-language' => 'Hizkuntza',
+ 'config-page-welcome' => 'Ongi etorri MediaWikira!',
+ 'config-page-dbconnect' => 'Datu-basera konektatu',
+ 'config-page-dbsettings' => 'Datu-basearen ezarpenak',
+ 'config-page-name' => 'Izena',
+ 'config-page-options' => 'Aukerak',
+ 'config-page-install' => 'Instalatu',
+ 'config-page-complete' => 'Bukatua!',
+ 'config-page-restart' => 'Instalazioa berriz hasi',
+ 'config-page-readme' => 'Irakur nazazu',
+ 'config-page-copying' => 'Kopiatzea',
+ 'config-page-upgradedoc' => 'Eguneratu',
+ 'config-restart' => 'Bai, berriz hasi',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki nagusia]
+* [http://www.mediawiki.org/wiki/Help:Contents Erabiltzaileentzako Gida]
+* [http://www.mediawiki.org/wiki/Manual:Contents Administratzaileentzako Gida]
+* [http://www.mediawiki.org/wiki/Manual:FAQ MEG]',
+ 'config-env-php' => 'PHP $1 instalatuta dago.',
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] instalatuta dago',
+ 'config-apc' => '[http://www.php.net/apc APC] instalatuta dago',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] instalatuta dago',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago',
+ 'config-diff3-bad' => 'GNU diff3 ez da aurkitu.',
+ 'config-db-type' => 'Datu-base mota:',
+ 'config-db-wiki-settings' => 'Wiki hau identifikatu',
+ 'config-db-name' => 'Datu-base izena:',
+ 'config-db-username' => 'Datu-base lankide izena:',
+ 'config-db-password' => 'Datu-base pasahitza:',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 bitarra',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-header-mysql' => 'MySQL hobespenak',
+ 'config-header-postgres' => 'PostgreSQL hobespenak',
+ 'config-header-sqlite' => 'SQLite hobespenak',
+ 'config-header-oracle' => 'Oracle hobespenak',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-binary' => 'Bitarra',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Wikiaren izena:',
+ 'config-project-namespace' => 'Proiektuaren izen-tartea:',
+ 'config-ns-generic' => 'Proiektua',
+ 'config-ns-other' => 'Bestelakoa (zehaztu)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-admin-box' => 'Administratzaile kontua',
+ 'config-admin-name' => 'Zure izena:',
+ 'config-admin-password' => 'Pasahitza:',
+ 'config-admin-password-confirm' => 'Pasahitza berriz:',
+ 'config-admin-email' => 'E-posta helbidea:',
+ 'config-profile-wiki' => 'Wiki tradizionala',
+ 'config-profile-private' => 'Wiki pribatua',
+ 'config-license' => 'Copyright eta lizentzia:',
+ 'config-license-pd' => 'Domeinu Askea',
+ 'config-email-settings' => 'E-posta hobespenak',
+ 'config-logo' => 'Logo URL:',
+ 'config-install-step-done' => 'egina',
+);
+
+/** Persian (Ùارسی)
+ * @author Mjbmr
+ */
+$messages['fa'] = array(
+ 'config-your-language' => 'زبان شما:',
+ 'config-wiki-language' => 'زبان ویکی:',
+ 'config-page-language' => 'زبان',
+);
+
+/** Finnish (Suomi)
+ * @author Centerlink
+ * @author Crt
+ * @author Nike
+ * @author Olli
+ * @author Str4nd
+ */
+$messages['fi'] = array(
+ 'config-desc' => 'MediaWiki-asennin',
+ 'config-title' => 'MediaWikin version $1 asennus',
+ 'config-information' => 'Tiedot',
+ 'config-localsettings-upgrade' => '<code>LocalSettings.php</code>-tiedosto on havaittu.
+Syötä kohdan <code>$wgUpgradeKey</code> arvo alla olevaan kenttään päivittääksesi asennuksen.
+Löydät sen LocalSettings.php-tiedostosta.',
+ 'config-session-error' => 'Istunnon aloittaminen epäonnistui: $1',
+ 'config-session-expired' => 'Istuntotietosi näyttävät olevan vanhentuneita.
+Istuntojen elinajaksi on määritelty $1.
+Voit muuttaa tätä asetusta vaihtamalla kohtaa <code>session.gc_maxlifetime</code> php.ini -tiedostossa.
+Käynnistä asennusprosessi uudelleen.',
+ 'config-your-language' => 'Asennuksen kieli',
+ 'config-your-language-help' => 'Valitse kieli, jota haluat käyttää asennuksen ajan.',
+ 'config-wiki-language' => 'Wikin kieli',
+ 'config-wiki-language-help' => 'Valitse kieli, jota wikissä tullaan etupäässä käyttämään.',
+ 'config-back' => '↠Takaisin',
+ 'config-continue' => 'Jatka →',
+ 'config-page-language' => 'Kieli',
+ 'config-page-welcome' => 'Tervetuloa MediaWikiin!',
+ 'config-page-dbconnect' => 'Tietokantaan yhdistäminen',
+ 'config-page-upgrade' => 'Olemassa olevan asennuksen päivitys',
+ 'config-page-dbsettings' => 'Tietokannan asetukset',
+ 'config-page-name' => 'Nimi',
+ 'config-page-options' => 'Asetukset',
+ 'config-page-install' => 'Asenna',
+ 'config-page-complete' => 'Valmis!',
+ 'config-page-restart' => 'Aloita asennus alusta',
+ 'config-page-readme' => 'Lue minut',
+ 'config-page-releasenotes' => 'Julkaisun tiedot',
+ 'config-page-copying' => 'Kopiointi',
+ 'config-page-upgradedoc' => 'Päivittäminen',
+ 'config-help-restart' => 'Haluatko poistaa kaikki annetut tiedot ja aloittaa asennuksen alusta?',
+ 'config-restart' => 'Kyllä',
+ 'config-welcome' => '=== Ympäristön tarkistukset ===
+Varmistetaan MediaWikin asennettavuus tähän ympäristöön.
+Sinun pitäisi antaa näiden tarkistusten tulokset, jos tarvitset apua asennuksen aikana.',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWikin kotisivu]
+* [http://www.mediawiki.org/wiki/Help:Contents Käyttöopas]
+* [http://www.mediawiki.org/wiki/Manual:Contents Hallintaopas]
+* [http://www.mediawiki.org/wiki/Manual:FAQ UKK]',
+ 'config-env-good' => 'Asennusympäristö on tarkastettu.
+Voit asentaa MediaWikin.',
+ 'config-env-bad' => 'Asennusympäristö on tarkastettu.
+Et voi asentaa MediaWikiä.',
+ 'config-env-php' => 'PHP $1 on asennettu.',
+ 'config-no-db' => 'Sopivaa tietokanta-ajuria ei löytynyt!',
+ 'config-no-db-help' => 'Sinun täytyy asentaa tietokanta-ajuri PHP:lle.
+Seuraavat tietokantatyypit on tuettu: $1.
+
+Jos käytät jaettua sivutilaa, kysy palveluntarjoajalta, josko se voisi asentaa sopivan tietokanta-ajurin.
+Jos olet kääntänyt PHP:n itse, asenna se tietokantaohjelman kanssa, esimerkiksi käyttäen koodia <code>./configure --with-mysql</code>.
+Jos olet asentanut PHP:n Debian tai Ubuntu-paketista, sinun täytyy asentaa myös php5-mysql-moduuli.',
+ 'config-safe-mode' => "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.
+Se voi aiheuttaa ongelmia erityisesti tiedostojen tallentamisen ja matemaattisten kaavojen kanssa.",
+ 'config-pcre' => 'PCRE-tukimoduuli puuttuu.
+MediaWiki vaatii toimiakseen Perl-yhteensopivat säännölliset lausekkeet.',
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] on asennettu',
+ 'config-apc' => '[http://www.php.net/apc APC] on asennettu.',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] on asennettu',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] on asennettu',
+ 'config-diff3-bad' => 'GNU diff3:a ei löytynyt.',
+ 'config-db-type' => 'Tietokannan tyyppi',
+ 'config-db-host' => 'Tietokantapalvelin',
+ 'config-db-name' => 'Tietokannan nimi',
+ 'config-db-username' => 'Tietokannan käyttäjätunnus',
+ 'config-db-password' => 'Tietokannan salasana',
+ 'config-db-install-help' => 'Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.',
+ 'config-db-account-lock' => 'Käytä samaa tunnusta ja salasanaa myös asennuksen jälkeen',
+ 'config-db-prefix' => 'Tietokantataulujen etuliite',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0, binääri',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0, UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0, taaksepäin yhteensopiva UTF-8',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-header-mysql' => 'MySQL-asetukset',
+ 'config-header-postgres' => 'PostgreSQL-asetukset',
+ 'config-header-sqlite' => 'SQLite-asetukset',
+ 'config-header-oracle' => 'Oracle-asetukset',
+ 'config-invalid-db-type' => 'Virheellinen tietokantatyyppi',
+ 'config-missing-db-name' => 'Kenttä »Tietokannan nimi» on pakollinen',
+ 'config-invalid-db-name' => 'â€$1†ei kelpaa tietokannan nimeksi.
+Se voi sisältää vain kirjaimia (a-z, A-Z), numeroita (0-9) ja alaviivan (_).',
+ 'config-invalid-db-prefix' => 'â€$1†ei kelpaa tietokannan etuliitteeksi.
+Se voi sisältää vain kirjaimia (a-z, A-Z), numeroita (0-9) ja alaviivan (_).',
+ 'config-postgres-old' => 'MediaWiki tarvitsee PostgreSQL:n version $1 tai uudemman. Nykyinen versio on $2.',
+ 'config-sqlite-name-help' => 'Valitse nimi joka yksilöi tämän wikin.
+Älä käytä välilyöntejä tai viivoja.
+Nimeä käytetään SQlite-tietokannan tiedostonimessä.',
+ 'config-sqlite-dir-unwritable' => 'Hakemistoon â€$1†kirjoittaminen epäonnistui.
+Muuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja koita uudelleen.',
+ 'config-sqlite-readonly' => 'Tiedostoon <code>$1</code> ei voi kirjoittaa.',
+ 'config-sqlite-fts3-downgrade' => 'PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.',
+ 'config-show-table-status' => 'Kysely SHOW TABLE STATUS epäonnistui!',
+ 'config-mysql-engine' => 'Tallennusmoottori',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-binary' => 'Binääri',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Wikin nimi',
+ 'config-project-namespace' => 'Projektinimiavaruus:',
+ 'config-ns-generic' => 'Projekti',
+ 'config-admin-name' => 'Nimesi',
+ 'config-admin-password' => 'Salasana',
+ 'config-admin-password-confirm' => 'Salasana uudelleen',
+ 'config-admin-name-blank' => 'Anna ylläpitäjän käyttäjänimi.',
+ 'config-admin-email' => 'Sähköpostiosoite',
+ 'config-profile-private' => 'Yksityinen wiki',
+ 'config-install-step-done' => 'tehty',
+ 'config-install-step-failed' => 'epäonnistui',
+ 'config-help' => 'ohje',
+);
+
+/** French (Français)
+ * @author Aadri
+ * @author Crochet.david
+ * @author Hashar
+ * @author IAlex
+ * @author Jean-Frédéric
+ * @author McDutchie
+ * @author Peter17
+ * @author Sherbrooke
+ * @author Verdy p
+ * @author Yumeki
+ */
+$messages['fr'] = array(
+ 'config-desc' => 'Le programme d’installation de MediaWiki',
+ 'config-title' => 'Installation de MediaWiki $1',
+ 'config-information' => 'Informations',
+ 'config-localsettings-upgrade' => 'Un fichier <code>LocalSettings.php</code> a été détecté.
+Pour mettre à jour cette installation, veuillez saisir la valeur de <code>$wgUpgradeKey</code> dans le champ ci-dessous.
+Vous la trouverez dans LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Un fichier LocalSettings.php a été détecté.
+Pour mettre à niveau cette installation, veuillez exécuter update.php',
+ 'config-localsettings-key' => 'Clé de mise à jour :',
+ 'config-localsettings-badkey' => 'La clé que vous avez fournie est incorrecte',
+ 'config-upgrade-key-missing' => 'Une installation existante de MediaWiki a été détectée.
+
+Pour mettre à jour cette installation, veuillez ajouter la ligne suivante à la fin de votre fichier LocalSettings.php
+
+$1',
+ 'config-localsettings-incomplete' => 'Le fichier LocalSettings.php existant semble être incomplet.
+La variable $1 n’est pas définie.
+Veuillez modifier LocalSettings.php de sorte que cette variable soit définie, puis cliquer sur « Continuer ».',
+ 'config-localsettings-connection-error' => 'Une erreur est survenue lors de la connexion à la base de données en utilisant la configuration spécifiée dans LocalSettings.php ou AdminSettings.php. Veuillez corriger cette configuration puis réessayer.
+
+$1',
+ 'config-session-error' => 'Erreur lors du démarrage de la session : $1',
+ 'config-session-expired' => "↓Les données de votre session semblent avoir expiré.
+Les sessions sont configurées pour une durée de $1.
+Vous pouvez l'augmenter en configurant <code>session.gc_maxlifetime</code> dans le fichier php.ini.
+Redémarrer le processus d'installation.",
+ 'config-no-session' => 'Les données de votre session ont été perdues !
+Vérifiez votre fichier php.ini et assurez-vous que <code>session.save_path</code> contient le chemin d’un répertoire approprié.',
+ 'config-your-language' => 'Votre langue :',
+ 'config-your-language-help' => "Sélectionnez la langue à utiliser pendant le processus d'installation.",
+ 'config-wiki-language' => 'Langue du wiki :',
+ 'config-wiki-language-help' => 'Sélectionner la langue dans laquelle le wiki sera principalement écrit.',
+ 'config-back' => '↠Retour',
+ 'config-continue' => 'Continuer →',
+ 'config-page-language' => 'Langue',
+ 'config-page-welcome' => 'Bienvenue sur MediaWiki !',
+ 'config-page-dbconnect' => 'Se connecter à la base de données',
+ 'config-page-upgrade' => 'Mettre à jour l’installation existante',
+ 'config-page-dbsettings' => 'Paramètres de la base de données',
+ 'config-page-name' => 'Nom',
+ 'config-page-options' => 'Options',
+ 'config-page-install' => 'Installer',
+ 'config-page-complete' => 'Terminé !',
+ 'config-page-restart' => 'Redémarrer l’installation',
+ 'config-page-readme' => 'Lisez-moi',
+ 'config-page-releasenotes' => 'Notes de version',
+ 'config-page-copying' => 'Copie',
+ 'config-page-upgradedoc' => 'Mise à jour',
+ 'config-page-existingwiki' => 'Wiki existant',
+ 'config-help-restart' => "Voulez-vous effacer toutes les données enregistrées que vous avez entrées et relancer le processus d'installation ?",
+ 'config-restart' => 'Oui, le relancer',
+ 'config-welcome' => "=== Vérifications liées à l’environnement ===
+Des vérifications de base sont effectuées pour voir si cet environnement est adapté à l'installation de MediaWiki.
+Vous devriez indiquer les résultats de ces vérifications si vous avez besoin d’aide lors de l’installation.",
+ 'config-copyright' => "=== Droit d'auteur et conditions ===
+
+$1
+
+Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).
+
+Ce programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commerciabilité''' ou d’'''adéquation à un usage particulier'''.
+Voir la Licence Publique Générale GNU pour plus de détails.
+
+Vous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [http://www.gnu.org/copyleft/gpl.html lisez-le en ligne].",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki Accueil]
+* [http://www.mediawiki.org/wiki/Help:Contents Guide de l’utilisateur]
+* [http://www.mediawiki.org/wiki/Manual:Contents Guide de l’administrateur]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Lisez-moi</doclink>
+* <doclink href=ReleaseNotes>Notes de pblication</doclink>
+* <doclink href=Copying>Copie</doclink>
+* <doclink href=UpgradeDoc>Mise à jour</doclink>',
+ 'config-env-good' => 'L’environnement a été vérifié.
+Vous pouvez installer MediaWiki.',
+ 'config-env-bad' => 'L’environnement a été vérifié.
+vous ne pouvez pas installer MediaWiki.',
+ 'config-env-php' => 'PHP $1 est installé.',
+ 'config-env-php-toolow' => 'PHP $1 est installé.
+Cependant, MediaWiki requiert PHP $2 ou plus haut.',
+ 'config-unicode-using-utf8' => 'Utilisation de utf8_normalize.so par Brion Vibber pour la normalisation Unicode.',
+ 'config-unicode-using-intl' => "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
+ 'config-unicode-pure-php-warning' => "'''Attention''': L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.
+Si vous utilisez un site web très fréquenté, vous devriez lire ceci : [http://www.mediawiki.org/wiki/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
+ 'config-unicode-update-warning' => "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].
+Vous devriez faire une [http://www.mediawiki.org/wiki/Unicode_normalization_considerations mise à jour] (texte en anglais) si l'usage d'Unicode vous semble important.",
+ 'config-no-db' => 'Impossible de trouver un pilote de base de données approprié !',
+ 'config-no-db-help' => "Vous avez besoin d'installer un pilote de base de données pour PHP.
+Les types de base de données suivants sont supportés: $1.
+
+Si vous êtes en hébergement mutualisé, demandez à votre fournisseur d'hébergement pour installer un pilote de base de données appropriée.
+Si vous avez compilé PHP vous-même, reconfigurez-le en activant un client de base de données, par exemple en utilisant <code>./configure --with-mysql</code>.
+Si vous avez installé PHP à partir d'un paquet Debian ou Ubuntu, vous devez également installer le module php5-mysql.",
+ 'config-no-fts3' => "'''Attention :''' SQLite est compilé sans le module [http://sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
+ 'config-register-globals' => "'''Attention : l'option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.'''
+'''Désactivez-la si vous le pouvez.'''
+MediaWiki fonctionnera, mais votre serveur sera exposé à de potentielles failles de sécurité.",
+ 'config-magic-quotes-runtime' => "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] est activé !'''
+Cette option corrompt les données de manière imprévisible.
+Vous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
+ 'config-magic-quotes-sybase' => "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybasee] est activé !'''
+Cette option corrompt les données de manière imprévisible.
+Vous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
+ 'config-mbstring' => "'''Erreur fatale : [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] est activé !'''
+Cette option provoque des erreurs et peut corrompre les données de manière imprévisible.
+Vous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
+ 'config-ze1' => "'''Erreur fatale : [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mod] est activé !'''
+Cette option provoque des bugs horribles avec MediaWiki.
+Vous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
+ 'config-safe-mode' => "'''Attention : le « [http://www.php.net/features.safe-mode safe mode] » est activé !'''
+Ceci peut causer des problèmes, en particulier si vous utilisez le téléversement de fichiers et le support de <code>math</code>.",
+ 'config-xml-bad' => 'Le module XML de PHP est manquant.
+MediaWiki requiert des fonctions de ce module et ne fonctionnera pas avec cette configuration.
+Si vous êtes sous Mandrake, installez le paquet php-xml.',
+ 'config-pcre' => "Le module de support PCRE semble manquer.
+MediaWiki requiert les fonctions d'expression régulière compatible avec Perl.",
+ 'config-pcre-no-utf8' => "'''Erreur fatale''': Le module PCRE de PHP semble être compilé sans le support PCRE_UTF8.
+MédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
+ 'config-memory-raised' => 'Le paramètre <code>memory_limit</code> de PHP était à $1, porté à $2.',
+ 'config-memory-bad' => "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.
+Cette valeur est probablement trop faible.
+Il est possible que l’installation échoue !",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] est installé',
+ 'config-apc' => '[http://www.php.net/apc APC] est installé',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] est installé',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] est installé',
+ 'config-no-cache' => "'''Attention :''' Impossible de trouver [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].
+La mise en cache d'objets n'est pas activée.",
+ 'config-diff3-bad' => 'GNU diff3 introuvable.',
+ 'config-imagemagick' => "ImageMagick trouvé : <code>$1</code>.
+La miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
+ 'config-gd' => "La bibliothèque graphique GD intégrée a été trouvée.
+La miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
+ 'config-no-scaling' => "Impossible de trouver la bibliothèque GD ou ImageMagick.
+La miniaturisation d'images sera désactivé.",
+ 'config-no-uri' => "'''Erreur :''' Impossible de déterminer l'URI du script actuel.
+Installation avortée.",
+ 'config-uploads-not-safe' => "'''Attention:''' Votre répertoire par défaut pour les téléchargements, <code>$1</code>, est vulnérable, car il peut exécuter n'importe quel script.
+Bien que MediaWiki vérifie tous les fichiers téléchargés, il est fortement recommandé de [http://www.mediawiki.org/wiki/Manual:Security#Upload_security fermer cette vulnérabilité de sécurité] (texte en anglais) avant d'activer les téléchargements.",
+ 'config-brokenlibxml' => 'Votre système utilise une combinaison de versions de PHP et libxml2 qui est boguée et peut engendrer des corruptions cachées de données dans MediaWiki et d’autres applications web.
+Veuillez mettre à jour votre système vers PHP 5.2.9 ou plus récent et libxml2 2.7.3 ou plus récent ([http://bugs.php.net/bug.php?id=45996 bogue déposé auprès de PHP]).
+Installation interrompue.',
+ 'config-using531' => 'MediaWiki ne peut pas être utilisé avec PHP $1 à cause d’un bogue affectant les paramètres passés par référence à <code>__call()</code>.
+Veuillez mettre à jour votre système vers PHP 5.3.2 ou plus récent ou revenir à PHP 5.3.0 pour résoudre ce problème.
+Installation interrompue.',
+ 'config-db-type' => 'Type de base de données :',
+ 'config-db-host' => 'Nom d’hôte de la base de données :',
+ 'config-db-host-help' => "Si votre serveur de base de données est sur un serveur différent, saisissez ici son nom d’hôte ou son adresse IP.
+
+Si vous utilisez un hébergement mutualisé, votre hébergeur doit vous avoir fourni le nom d’hôte correct dans sa documentation.
+
+Si vous installez sur un serveur Windows et utilisez MySQL, « localhost » peut ne pas fonctionner comme nom de serveur. S'il ne fonctionne pas, essayez « 127.0.0.1 » comme adresse IP locale.",
+ 'config-db-host-oracle' => 'Nom TNS de la base de données :',
+ 'config-db-host-oracle-help' => 'Entrez un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nom de connexion locale] valide ; un fichier tnsnames.ora doit être visible par cette installation.<br /> Si vous utilisez les bibliothèques clientes version 10g ou plus récentes, vous pouvez également utiliser la méthode de nommage [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identifier ce wiki',
+ 'config-db-name' => 'Nom de la base de données :',
+ 'config-db-name-help' => "Choisissez un nom qui identifie votre wiki.
+Il ne doit pas contenir d'espaces.
+
+Si vous utilisez un hébergement web partagé, votre hébergeur vous fournira un nom spécifique de base de données à utiliser, ou bien vous permet de créer des bases de données via un panneau de contrôle.",
+ 'config-db-name-oracle' => 'Schéma de base de données :',
+ 'config-db-account-oracle-warn' => "Il existe trois scénarios pris en charge pour l’installation d'Oracle comme backend de base :
+
+Si vous souhaitez créer un compte de base de données dans le cadre de la procédure d’installation, veuillez fournir un compte avec le rôle de SYSDBA comme compte de base de données pour l’installation et spécifiez les informations d’identification souhaitées pour le compte d'accès au web, sinon vous pouvez créer le compte d’accès web manuellement et fournir uniquement ce compte (si elle a exigé des autorisations nécessaires pour créer les objets de schéma) ou fournir deux comptes différents, l’un avec les privilèges de créer et une restreinte pour l’accès web.
+
+Un script pour créer un compte avec des privilèges requis peut être trouvé dans le répertoire « entretien/oracle/ » de cette installation. N’oubliez pas que le fait de l’utilisation d’un compte limité désactive toutes les fonctionnalités d’entretien avec le compte par défaut.",
+ 'config-db-install-account' => "Compte d'utilisateur pour l'installation",
+ 'config-db-username' => 'Nom d’utilisateur de la base de données :',
+ 'config-db-password' => 'Mot de passe de la base de données :',
+ 'config-db-password-empty' => "Veuillez entrer un mot de passe pour le nouvel compte de la base de données : $1.
+Bien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
+ 'config-db-install-username' => "Entrez le nom d’utilisateur qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du nom d’utilisateur du compte MediaWiki, mais du nom d’utilisateur pour votre base de données.",
+ 'config-db-install-password' => "Entrez le mot de passe qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.",
+ 'config-db-install-help' => "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le processus d'installation.",
+ 'config-db-account-lock' => "Utiliser le même nom d'utilisateur et le même mot de passe pendant le fonctionnement habituel",
+ 'config-db-wiki-account' => "Compte d'utilisateur pour le fonctionnement habituel",
+ 'config-db-wiki-help' => "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le fonctionnement habituel du wiki.
+Si le compte n'existe pas, et le compte d'installation dispose de privilèges suffisants, ce compte d'utilisateur sera créé avec les privilèges minimum requis pour faire fonctionner le wiki.",
+ 'config-db-prefix' => 'Préfixe des tables de la base de données :',
+ 'config-db-prefix-help' => "Si vous avez besoin de partager une base de données entre plusieurs wikis, ou entre MediaWiki et une autre application Web, vous pouvez choisir d'ajouter un préfixe à tous les noms de table pour éviter les conflits.
+Ne pas utiliser des espaces.
+
+Ce champ est généralement laissé vide.",
+ 'config-db-charset' => 'Jeu de caractères de la base de données',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binaire',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 rétrocompatible UTF-8',
+ 'config-charset-help' => "'''Attention:''' Si vous utilisez ''backwards-compatible UTF-8'' sur MySQL 4.1+, et ensuite sauvegardez la base de données avec <code>mysqldump</code>, cela peut détruire tous les caractères non-ASCII, ce qui rend inutilisable vos copies de sauvegarde de façon irréversible !
+
+En ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.
+En ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
+ 'config-mysql-old' => 'MySQL $1 ou version ultérieure est requis, vous avez $2.',
+ 'config-db-port' => 'Port de la base de données :',
+ 'config-db-schema' => 'Schéma pour MediaWiki',
+ 'config-db-schema-help' => "Les schémas ci-dessus sont généralement corrects.
+Ne les changez que si vous êtes sûr que c'est nécessaire.",
+ 'config-sqlite-dir' => 'Dossier des données SQLite :',
+ 'config-sqlite-dir-help' => "SQLite stocke toutes les données dans un fichier unique.
+
+Le répertoire que vous inscrivez doit être accessible en écriture par le serveur lors de l'installation.
+
+Il '''ne faut pas''' qu'il soit accessible via le web, c'est pourquoi il n'est pas à l'endroit où vos fichiers PHP sont.
+
+L'installateur écrira un fichier <code>.htaccess</code> en même temps, mais s'il y a échec, quelqu'un peut accéder à votre base de données.
+Cela comprend les données des utilisateurs (adresses de courriel, mots de passe hachés) ainsi que des révisions supprimées et d'autres données confidentielles du wiki.
+
+Envisagez de placer la base de données ailleurs, par exemple dans <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => "Espace de stockage (''tablespace'') par défaut :",
+ 'config-oracle-temp-ts' => "Espace de stockage (''tablespace'') temporaire :",
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => "MediaWiki supporte ces systèmes de bases de données :
+
+$1
+
+Si vous ne voyez pas le système de base de données que vous essayez d'utiliser ci-dessous, alors suivez les instructions ci-dessus (voir liens) pour activer le support.",
+ 'config-support-mysql' => '* $1 est le premier choix pour MediaWiki et est mieux pris en charge ([http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])',
+ 'config-support-postgres' => "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support])",
+ 'config-support-sqlite' => '* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)',
+ 'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([Http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
+ 'config-header-mysql' => 'Paramètres de MySQL',
+ 'config-header-postgres' => 'Paramètres de PostgreSQL',
+ 'config-header-sqlite' => 'Paramètres de SQLite',
+ 'config-header-oracle' => 'Paramètres d’Oracle',
+ 'config-invalid-db-type' => 'Type de base de données non valide',
+ 'config-missing-db-name' => 'Vous devez saisir une valeur pour « Nom de la base de données »',
+ 'config-missing-db-host' => "Vous devez entrer une valeur pour « l'hôte de la base de données »",
+ 'config-missing-db-server-oracle' => 'Vous devez saisir une valeur pour le « Nom TNS de la base de données »',
+ 'config-invalid-db-server-oracle' => 'Le nom TNS de la base de données (« $1 ») est invalide.
+Il ne peut contenir que des lettres latines de base (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des points (.).',
+ 'config-invalid-db-name' => 'Nom de la base de données invalide (« $1 »).
+Il ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).',
+ 'config-invalid-db-prefix' => 'Préfixe de la base de données non valide « $1 ».
+Il ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).',
+ 'config-connection-error' => '$1.
+
+Vérifier le nom d’hôte, le nom d’utilisateur et le mot de passe ci-dessous puis réessayer.',
+ 'config-invalid-schema' => 'Schéma invalide pour MediaWiki « $1 ».
+Utilisez seulement des lettres latines (a-z, A-Z), des chiffres (0-9) et des caractères de soulignement (_).',
+ 'config-db-sys-create-oracle' => "L'installateur ne reconnaît que les compte SYSDBA lors de la création d'un nouveau compte.",
+ 'config-db-sys-user-exists-oracle' => 'Le compte « $1 » existe déjà. Un SYSDBA peut seulement servir à créer un nouveau comtpe.',
+ 'config-postgres-old' => 'PostgreSQL $1 ou version ultérieure est requis, vous avez $2.',
+ 'config-sqlite-name-help' => "Choisir un nom qui identifie votre wiki.
+Ne pas utiliser des espaces ou des traits d'union.
+Il sera utilisé pour le fichier de données SQLite.",
+ 'config-sqlite-parent-unwritable-group' => "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.
+
+L'utilisateur du serveur web est connu.
+Rendre le répertoire <nowiki><code>$3</code></nowiki> accessible en écriture pour continuer.
+Sur un système UNIX/Linux, saisir :
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>",
+ 'config-sqlite-parent-unwritable-nogroup' => "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.
+
+L'utilisateur du serveur web est inconnu.
+Rendre le répertoire <nowiki><code>$3</code></nowiki> globalement accessible en écriture pour continuer.
+Sur un système UNIX/Linux, saisir :
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>",
+ 'config-sqlite-mkdir-error' => "Erreur de création du répertoire de données « $1 ».
+Vérifiez l'emplacement et essayez à nouveau.",
+ 'config-sqlite-dir-unwritable' => "Impossible d'écrire dans le répertoire « $1 ».
+Changer les permissions de sorte que le serveur peut y écrire et essayez à nouveau.",
+ 'config-sqlite-connection-error' => '$1.
+
+Vérifier le répertoire des données et le nom de la base de données ci-dessous et réessayer.',
+ 'config-sqlite-readonly' => "Le fichier <code>$1</code> n'est pas accessible en écriture.",
+ 'config-sqlite-cant-create-db' => 'Impossible de créer le fichier de base de données <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP ne vient pas avec FTS3, les tables sont diminuées.',
+ 'config-can-upgrade' => "Il y a des tables MediaWiki dans cette base de données.
+Pour les mettre au niveau de MediaWiki $1, cliquez sur '''Continuer'''.",
+ 'config-upgrade-done' => "Mise à jour complétée.
+
+Vous pouvez maintenant [$1 commencer à utiliser votre wiki].
+
+Si vous souhaitez régénérer votre fichier <code>LocalSettings.php</code>, cliquez sur le bouton ci-dessous.
+Ce '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Mise à jour terminée.
+
+Vous pouvez maintenant [$1 commencer à utiliser votre wiki].',
+ 'config-regenerate' => 'Regénérer LocalSettings.php →',
+ 'config-show-table-status' => 'Échec de la requête SHOW TABLE STATUS !',
+ 'config-unknown-collation' => "'''Attention:''' La base de données effectue un classement alphabétique (''collation'') inconnu.",
+ 'config-db-web-account' => "Compte de la base de données pour l'accès Web",
+ 'config-db-web-help' => "Sélectionnez le nom d'utilisateur et le mot de passe que le serveur web utilisera pour se connecter au serveur de base de données pendant le fonctionnement habituel du wiki.",
+ 'config-db-web-account-same' => "Utilisez le même compte que pour l'installation",
+ 'config-db-web-create' => "Créez le compte s'il n'existe pas déjà",
+ 'config-db-web-no-create-privs' => "Le compte que vous avez spécifié pour l'installation n'a pas de privilèges suffisants pour créer un compte.
+Le compte que vous spécifiez ici doit déjà exister.",
+ 'config-mysql-engine' => 'Moteur de stockage :',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].
+
+'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
+ 'config-mysql-charset' => 'Jeu de caractères de la base de données :',
+ 'config-mysql-binary' => 'Binaire',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données. C'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.
+
+En ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.
+En ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
+ 'config-site-name' => 'Nom du wiki :',
+ 'config-site-name-help' => 'Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.',
+ 'config-site-name-blank' => 'Entrez un nom de site.',
+ 'config-project-namespace' => 'Espace de noms du projet :',
+ 'config-ns-generic' => 'Projet',
+ 'config-ns-site-name' => 'Même nom que le wiki : $1',
+ 'config-ns-other' => 'Autre (préciser)',
+ 'config-ns-other-default' => 'MonWiki',
+ 'config-project-namespace-help' => "Suivant l'exemple de Wikipédia, plusieurs wikis gardent leurs pages de politique séparées de leurs pages de contenu, dans un ''espace de noms'' propre.
+Tous les titres de page de cet espace de noms commence par un préfixe défini, que vous pouvez spécifier ici.
+Traditionnellement, ce préfixe est dérivé du nom du wiki, mais il ne peut contenir des caractères de ponctuation tels que « # » ou « : ».",
+ 'config-ns-invalid' => "L'espace de noms spécifié « <nowiki>$1</nowiki> » n'est pas valide.
+Spécifiez un espace de noms pour le projet.",
+ 'config-ns-conflict' => "L'espace de noms spécifié « <nowiki>$1</nowiki> » est en conflit avec un espace de noms par défaut de MediaWiki.
+Choisir un autre espace de noms.",
+ 'config-admin-box' => 'Compte administrateur',
+ 'config-admin-name' => 'Votre nom :',
+ 'config-admin-password' => 'Mot de passe :',
+ 'config-admin-password-confirm' => 'Saisir à nouveau le mot de passe :',
+ 'config-admin-help' => "Entrez votre nom d'utilisateur préféré ici, par exemple « Jean Blogue ».
+C'est le nom que vous utiliserez pour vous connecter au wiki.",
+ 'config-admin-name-blank' => "Entrez un nom d'administrateur.",
+ 'config-admin-name-invalid' => "Le nom d'utilisateur spécifié « <nowiki>$1</nowiki> » n'est pas valide.
+Indiquez un nom d'utilisateur différent.",
+ 'config-admin-password-blank' => 'Entrez un mot de passe pour le compte administrateur.',
+ 'config-admin-password-same' => "Le mot de passe doit être différent du nom d'utilisateur.",
+ 'config-admin-password-mismatch' => 'Les deux mots de passe que vous avez saisis ne correspondent pas.',
+ 'config-admin-email' => 'Adresse de courriel :',
+ 'config-admin-email-help' => "Entrez une adresse de courriel ici pour vous permettre de recevoir des courriels d'autres utilisateurs du wiki, réinitialiser votre mot de passe, et être informé des modifications apportées aux pages de votre liste de suivi. Vous pouvez laisser ce champ vide.",
+ 'config-admin-error-user' => "Erreur interne lors de la création d'un administrateur avec le nom « <nowiki>$1</nowiki> ».",
+ 'config-admin-error-password' => "Erreur interne lors de l'inscription d'un mot de passe pour l'administrateur « <nowiki>$1</nowiki> » : <pre>$2</pre>",
+ 'config-admin-error-bademail' => 'Vous avez entré une adresse de courriel invalide',
+ 'config-subscribe' => "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions] (la page peut afficher le texte en français).",
+ 'config-subscribe-help' => "Il s'agit d'une liste de diffusion à faible volume utilisée servant à annoncer les nouvelles versions, y compris les versions améliorant la sécurité du logiciel.
+Vous devriez y souscrire et mettre à jour votre version de MediaWiki lorsque de nouvelles versions sont publiées.",
+ 'config-almost-done' => 'Vous avez presque fini !
+Vous pouvez passer la configuration restante et installer immédiatement le wiki.',
+ 'config-optional-continue' => 'Me poser davantage de questions.',
+ 'config-optional-skip' => 'J’en ai assez, installer simplement le wiki.',
+ 'config-profile' => 'Profil des droits d’utilisateurs :',
+ 'config-profile-wiki' => 'Wiki traditionnel',
+ 'config-profile-no-anon' => 'Création de comte requise',
+ 'config-profile-fishbowl' => 'Éditeurs autorisés seulement',
+ 'config-profile-private' => 'Wiki privé',
+ 'config-profile-help' => "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible le modifier.
+Avec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.
+
+Cependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.
+Vous avez donc le choix.
+
+'''{{int:config-profile-wiki}}''' autorise quiconque à modifier, y compris sans s’identifier.
+'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, par l’identification, mais peut rebuter les contributeurs occasionnels.
+
+'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.
+'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir et modifier les pages.
+
+Des configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [http://www.mediawiki.org/wiki/Manual:User_rights page correspondante du manuel].",
+ 'config-license' => "Droits d'auteur et licence :",
+ 'config-license-none' => 'Aucune licence en bas de page',
+ 'config-license-cc-by-sa' => "Creative Commons attribution partage à l'identique",
+ 'config-license-cc-by-nc-sa' => "Creative Commons attribution non commercial partage à l'identique",
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'Licence de documentation libre GNU 1.2',
+ 'config-license-gfdl-current' => 'Licence de documentation libre GNU 1.3 ou plus récent',
+ 'config-license-pd' => 'Domaine public',
+ 'config-license-cc-choose' => 'Sélectionner une licence Creative Commons personnalisée',
+ 'config-license-help' => "Beaucoup de wikis publics mettent l'ensemble des contributions sous [http://freedomdefined.org/Definition/Fr licence libre].
+Cela contribue à créer un sentiment d'appartenance dans leur communauté et encourage les contributions sur le long terme.
+Ce n'est généralement pas nécessaire pour un wiki privé ou d'entreprise.
+
+Si vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia réutilise des textes de votre wiki, vous devriez choisir la [http://creativecommons.org/licenses/by-sa/3.0/deed.fr licence ''Creative Commons Attribution Share Alike''] (CC-by-sa).
+
+Wikipédia a déjà été publié selon les termes de la [http://fr.wikipedia.org/wiki/Licence_de_documentation_libre_GNU ''GNU Free Documentation License''] (GFDL).
+C'est encore une licence valide, mais elle possède des caractéristiques qui rendent difficiles la réutilisation et l'interprétation des textes.",
+ 'config-email-settings' => 'Paramètres de courriel',
+ 'config-enable-email' => 'Activer les courriels sortants',
+ 'config-enable-email-help' => 'Si vous souhaitez utiliser le courriel, vous devez [http://www.php.net/manual/en/mail.configuration.php configurer des paramètres PHP] (texte en anglais).
+Si vous ne voulez pas du service de courriel, vous pouvez le désactiver ici.',
+ 'config-email-user' => 'Activer les courriels de utilisateur à utilisateur',
+ 'config-email-user-help' => "Permet à tous les utilisateurs d'envoyer des courriels à d'autres utilisateurs si cela est activé dans leurs préférences.",
+ 'config-email-usertalk' => 'Activer la notification des pages de discussion des utilisateurs',
+ 'config-email-usertalk-help' => 'Permet aux utilisateurs de recevoir une notification en cas de modification de leurs pages de discussion, si cela est activé dans leurs préférences.',
+ 'config-email-watchlist' => 'Activer la notification de la liste de suivi',
+ 'config-email-watchlist-help' => "Permet aux utilisateurs de recevoir des notifications à propos des pages qu'ils ont en suivi (si cette préférence est activée).",
+ 'config-email-auth' => "Activer l'authentification par courriel",
+ 'config-email-auth-help' => "Si cette option est activée, les utilisateurs doivent confirmer leur adresse de courriel en utilisant l'hyperlien envoyé à chaque fois qu'ils la définissent ou la modifient.
+Seules les adresses authentifiées peuvent recevoir des courriels des autres utilisateurs ou lorsqu'il y a des notifications de modification.
+L'activation de cette option est '''recommandée''' pour les wikis publics en raison d'abus potentiels des fonctionnalités de courriels.",
+ 'config-email-sender' => 'Adresse de courriel de retour :',
+ 'config-email-sender-help' => "Entrez l'adresse de courriel à utiliser comme adresse de retour des courriels sortant.
+Les courriels rejetés y seront envoyés.
+De nombreux serveurs de courriels exigent au moins un [http://fr.wikipedia.org/wiki/Nom_de_domaine nom de domaine] valide.",
+ 'config-upload-settings' => 'Téléchargement des images et des fichiers',
+ 'config-upload-enable' => 'Activer le téléchargement des fichiers',
+ 'config-upload-help' => "Le téléchargement des fichiers expose votre serveur à des risques de sécurité.
+Pour plus d'informations, lire la section [http://www.mediawiki.org/wiki/Manual:Security ''Security''] du manuel d'installation (en anglais).
+
+Pour autoriser le téléchargement des fichiers, modifier le mode du sous-répertoire <code>images</code> qui se situe sous le répertoire racine de MediaWiki.
+Ensuite, activez cette option.",
+ 'config-upload-deleted' => 'Répertoire pour les fichiers supprimés :',
+ 'config-upload-deleted-help' => 'Choisissez un répertoire qui servira à archiver les fichiers supprimés.
+Idéalement, il ne devrait pas être accessible depuis le web.',
+ 'config-logo' => 'URL du logo :',
+ 'config-logo-help' => "L'habillage (''skin'') par défaut de MediaWiki comprend l'espace pour un logo de 135x160 pixels dans le coin supérieur gauche.
+Téléchargez une image de la taille appropriée, et entrez l'URL ici.
+
+Si vous ne voulez pas d'un logo, laissez cette case vide.",
+ 'config-instantcommons' => "Activer ''InstantCommons''",
+ 'config-instantcommons-help' => "[http://www.mediawiki.org/wiki/InstantCommons InstantCommons] est un service qui permet d'utiliser les images, les sons et les autres médias disponibles sur le site [http://commons.wikimedia.org/ Wikimedia Commons].
+Pour se faire, il faut que MediaWiki accède à Internet.
+
+Pour plus d'informations sur ce service, y compris les instructions sur la façon de le configurer pour d'autres wikis que Wikimedia Commons, consultez le [http://mediawiki.org/wiki/Manual:\$wgForeignFileRepos manuel] (en anglais).",
+ 'config-cc-error' => "Le sélection d'une licence ''Creative Commons'' n'a donné aucun résultat.
+Entrez le nom de la licence manuellement.",
+ 'config-cc-again' => 'Choisissez à nouveau...',
+ 'config-cc-not-chosen' => "Choisissez une licence ''Creative Commons'' et cliquez sur « Continuer ».",
+ 'config-advanced-settings' => 'Configuration avancée',
+ 'config-cache-options' => 'Paramètres pour la mise en cache des objets:',
+ 'config-cache-help' => "La mise en cache des objets améliore la vitesse de MediaWiki en mettant en cache les données fréquemment utilisées.
+Les sites de taille moyenne à grande sont fortement encouragés à l'activer. Les petits sites y verront également des avantages.",
+ 'config-cache-none' => 'Aucune mise en cache (aucune fonctionnalité supprimée, mais la vitesse peut changer sur les wikis importants)',
+ 'config-cache-accel' => 'Mise en cache des objets PHP (APC, eAccelerator, XCache ou WinCache)',
+ 'config-cache-memcached' => 'Utiliser Memcached (nécessite une installation et une configuration supplémentaires)',
+ 'config-memcached-servers' => 'serveurs pour Memcached :',
+ 'config-memcached-help' => 'Liste des adresses IP à utiliser pour Memcached.
+Elles doivent être séparés par des virgules et vous devez spécifier le port à utiliser. Par exemple :
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Vous avez sélectionné Memcached comme type de cache, mais ne précisez pas de serveur.',
+ 'config-memcache-badip' => 'Vous avez entré une adresse IP invalide pour Memcached: $1.',
+ 'config-memcache-noport' => "Vous n'avez pas entré un port pour le serveur Memcached : $1.
+Si vous ne le connaissez pas, la valeur par défaut est 11211.",
+ 'config-memcache-badport' => 'Les numéros de port de Memcached sont situés entre $1 et $2.',
+ 'config-extensions' => 'Extensions',
+ 'config-extensions-help' => 'Les extensions énumérées ci-dessus ont été détectées dans votre répertoire <code>./extensions</code>.
+
+Elles peuvent nécessiter une configuration supplémentaire, mais vous pouvez les activer maintenant',
+ 'config-install-alreadydone' => "'''Attention''': Vous semblez avoir déjà installé MediaWiki et tentez de l'installer à nouveau.
+S'il vous plaît, allez à la page suivante.",
+ 'config-install-begin' => "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.
+Si vous voulez apporter des modifications, appuyez sur Retour.",
+ 'config-install-step-done' => 'fait',
+ 'config-install-step-failed' => 'échec',
+ 'config-install-extensions' => 'Inclusion des extensions',
+ 'config-install-database' => 'Création de la base de données',
+ 'config-install-pg-schema-not-exist' => "Le schéma PostgreSQL n'existe pas",
+ 'config-install-pg-schema-failed' => "Échec lors de la création des tables.
+Assurez-vous que l'utilisateur « $1 » peut écrire selon le schéma « $2 ».",
+ 'config-install-pg-commit' => 'Validation des modifications',
+ 'config-install-pg-plpgsql' => 'Vérification du language PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Vous devez installer le langage PL/pgSQL dans la base de données $1',
+ 'config-pg-no-create-privs' => "Le compte que vous avez spécifié pour l'installation n'a pas suffisamment de privilèges pour créer un compte.",
+ 'config-install-user' => "Création d'un utilisateur de la base de données",
+ 'config-install-user-alreadyexists' => "L'utilisateur « $1 » existe déjà.",
+ 'config-install-user-create-failed' => "Échec lors de la création de l'utilisateur « $1 » : $2",
+ 'config-install-user-grant-failed' => "Échec lors de l'ajout de permissions à l'utilisateur « $1 » : $2",
+ 'config-install-tables' => 'Création des tables',
+ 'config-install-tables-exist' => "'''Avertissement:''' Les tables MediaWiki semblent déjà exister.
+Création omise.",
+ 'config-install-tables-failed' => "'''Erreur:''' échec lors de la création de la table avec l'erreur suivante: $1",
+ 'config-install-interwiki' => 'Remplissage par défaut de la table des interwikis',
+ 'config-install-interwiki-list' => 'Impossible de trouver le fichier <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Attention:''' La table des interwikis semble déjà contenir des entrées.
+La liste par défaut ne sera pas inscrite.",
+ 'config-install-stats' => 'Initialisation des statistiques',
+ 'config-install-keys' => 'Génération de la clé secrète',
+ 'config-install-sysop' => 'Création du compte administrateur',
+ 'config-install-subscribe-fail' => "Impossible de s'abonner à mediawiki-announce",
+ 'config-install-mainpage' => 'Création de la page principale avec un contenu par défaut',
+ 'config-install-extension-tables' => 'Création de tables pour les extensions activées',
+ 'config-install-mainpage-failed' => 'Impossible d’insérer la page principale: $1',
+ 'config-install-done' => "'''Félicitations!'''
+Vous avez réussi à installer MediaWiki.
+
+Le programme d'installation a généré <code>LocalSettings.php</code>, un fichier qui contient tous les paramètres de configuration.
+
+Si le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :
+
+$3
+
+'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.
+
+Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
+ 'config-download-localsettings' => 'Télécharger LocalSettings.php',
+ 'config-help' => 'aide',
+);
+
+/** Galician (Galego)
+ * @author Toliño
+ */
+$messages['gl'] = array(
+ 'config-desc' => 'O programa de instalación de MediaWiki',
+ 'config-title' => 'Instalación de MediaWiki $1',
+ 'config-information' => 'Información',
+ 'config-localsettings-upgrade' => 'Detectouse un ficheiro <code>LocalSettings.php</code>.
+Para actualizar esta instalación, introduza o valor de <code>$wgUpgradeKey</code> na caixa.
+Pode atopalo en LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Detectouse un ficheiro LocalSettings.php.
+Para actualizar esta instalación, execute update.php',
+ 'config-localsettings-key' => 'Clave de actualización:',
+ 'config-localsettings-badkey' => 'A clave dada é incorrecta',
+ 'config-upgrade-key-missing' => 'Detectouse unha instalación existente de MediaWiki.
+Para actualizar esta instalación, inclúa esta liña ao final do ficheiro LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'Semella que o ficheiro LocalSettings.php existente está incompleto.
+A variable $1 non está establecida.
+Modifique o ficheiro LocalSettings.php de xeito que a variable quede establecida e prema en "Continuar".',
+ 'config-localsettings-connection-error' => 'Atopouse un erro ao conectar coa base de datos empregando a configuración especificada no ficheiro LocalSettings.php ou no ficheiro AdminSettings.php. Corrixa esta configuración e inténteo de novo.
+
+$1',
+ 'config-session-error' => 'Erro ao iniciar a sesión: $1',
+ 'config-session-expired' => 'Semella que os seus datos da sesión caducaron.
+As sesións están configuradas para unha duración de $1.
+Pode incrementar isto fixando <code>session.gc_maxlifetime</code> en php.ini.
+Reinicie o proceso de instalación.',
+ 'config-no-session' => 'Perdéronse os datos da súa sesión!
+Comprobe o seu php.ini e asegúrese de que en <code>session.save_path</code> está definido un directorio correcto.',
+ 'config-your-language' => 'A súa lingua:',
+ 'config-your-language-help' => 'Seleccione a lingua que se empregará durante o proceso de instalación.',
+ 'config-wiki-language' => 'Lingua do wiki:',
+ 'config-wiki-language-help' => 'Seleccione a lingua que predominará no wiki.',
+ 'config-back' => '↠Volver',
+ 'config-continue' => 'Continuar →',
+ 'config-page-language' => 'Lingua',
+ 'config-page-welcome' => 'Benvido a MediaWiki!',
+ 'config-page-dbconnect' => 'Conectarse á base de datos',
+ 'config-page-upgrade' => 'Actualizar a instalación actual',
+ 'config-page-dbsettings' => 'Configuración da base de datos',
+ 'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opcións',
+ 'config-page-install' => 'Instalar',
+ 'config-page-complete' => 'Completo!',
+ 'config-page-restart' => 'Reiniciar a instalación',
+ 'config-page-readme' => 'Léame',
+ 'config-page-releasenotes' => 'Notas de lanzamento',
+ 'config-page-copying' => 'Copiar',
+ 'config-page-upgradedoc' => 'Actualizar',
+ 'config-page-existingwiki' => 'Wiki existente',
+ 'config-help-restart' => 'Quere eliminar todos os datos gardados e reiniciar o proceso de instalación?',
+ 'config-restart' => 'Si, reiniciala',
+ 'config-welcome' => '=== Comprobación do entorno ===
+Cómpre realizar unhas comprobacións básicas para ver se o entorno é axeitado para a instalación de MediaWiki.
+Deberá proporcionar os resultados destas comprobacións se necesita axuda durante a instalación.',
+ 'config-copyright' => "=== Dereitos de autor e termos de uso ===
+
+$1
+
+Este programa é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.
+
+Este programa distribúese coa esperanza de que poida ser útil, pero '''sen ningunha garantía'''; nin sequera a garantía implícita de '''comercialización''' ou '''adecuación a unha finalidade específica'''.
+Olle a licenza pública xeral GNU para obter máis detalles.
+
+Debería recibir <doclink href=Copying>unha copia da licenza pública xeral GNU</doclink> xunto ao programa; se non é así, escriba á Free Software Foundation, Inc., 51 da rúa Franklin, quinto andar, Boston, MA 02110-1301, Estados Unidos ou [http://www.gnu.org/copyleft/gpl.html lea a licenza en liña].",
+ 'config-sidebar' => '* [http://www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Guía de usuario]
+* [http://www.mediawiki.org/wiki/Manual:Contents Guía de administrador]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Preguntas máis frecuentes]
+----
+* <doclink href=Readme>Léame</doclink>
+* <doclink href=ReleaseNotes>Notas de lanzamento</doclink>
+* <doclink href=Copying>Copia</doclink>
+* <doclink href=UpgradeDoc>Actualización</doclink>',
+ 'config-env-good' => 'Rematou a comprobación do entorno.
+Pode instalar MediaWiki.',
+ 'config-env-bad' => 'Rematou a comprobación do entorno.
+Non pode instalar MediaWiki.',
+ 'config-env-php' => 'Está instalado o PHP $1.',
+ 'config-env-php-toolow' => 'Está instalado o PHP $1.
+Porén, MediaWiki necesita o PHP $2 ou superior.',
+ 'config-unicode-using-utf8' => 'Usando utf8_normalize.so de Brion Vibber para a normalización Unicode.',
+ 'config-unicode-using-intl' => 'Usando a [http://pecl.php.net/intl extensión intl PECL] para a normalización Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Atención:''' A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á implementación lenta de PHP puro.
+Se o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalización Unicode].",
+ 'config-unicode-update-warning' => "'''Atención:''' A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].
+Debería [http://www.mediawiki.org/wiki/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
+ 'config-no-db' => 'Non se puido atopar un controlador axeitado para a base de datos!',
+ 'config-no-db-help' => 'Debe instalar un controlador de base de datos para PHP.
+Os tipos de base de datos soportados son os seguintes: $1.
+
+Se está nun aloxamento compartido, pregunte ao seu provedor de hospedaxe para instalar un controlador de base de datos axeitado.
+Se compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.
+Se instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar o módulo php5-mysql.',
+ 'config-no-fts3' => "'''Atención:''' O SQLite está compilado sen o [http://sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
+ 'config-register-globals' => "'''Atención: A opción PHP <code>[http://php.net/register_globals register_globals]</code> está activada.'''
+'''Desactívea se pode.'''
+MediaWiki funcionará, pero o seu servidor está exposto a potenciais vulnerabilidades de seguridade.",
+ 'config-magic-quotes-runtime' => "'''Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activado!'''
+Esta opción corrompe os datos de entrada de xeito imprevisible.
+Non pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+ 'config-magic-quotes-sybase' => "'''Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activado!'''
+Esta opción corrompe os datos de entrada de xeito imprevisible.
+Non pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+ 'config-mbstring' => "'''Erro fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activado!'''
+Esta opción causa erros e pode corromper os datos de xeito imprevisible.
+Non pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+ 'config-ze1' => "'''Erro fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está activado!'''
+Esta opción causa erros horribles en MediaWiki.
+Non pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+ 'config-safe-mode' => "'''Atención:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está activado.
+Isto pode causar problemas, particularmente se emprega cargas de ficheiros e soporte de <code>math</code>.",
+ 'config-xml-bad' => 'Falta o módulo XML do PHP.
+MediaWiki necesita funcións neste módulo e non funcionará con esta configuración.
+Se está executando o Mandrake, instale o paquete php-xml.',
+ 'config-pcre' => 'Semella que falta o módulo de soporte PCRE.
+MediaWiki necesita que funcionen as expresións regulares compatibles co Perl.',
+ 'config-pcre-no-utf8' => "'''Erro fatal:''' Semella que o módulo PCRE do PHP foi compilado sen o soporte PCRE_UTF8.
+MediaWiki necesita soporte UTF-8 para funcionar correctamente.",
+ 'config-memory-raised' => 'O parámetro <code>memory_limit</code> do PHP é $1. Aumentado a $2.',
+ 'config-memory-bad' => "'''Atención:''' O parámetro <code>memory_limit</code> do PHP é $1.
+Probablemente é un valor baixo de máis.
+A instalación pode fallar!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] está instalado',
+ 'config-apc' => '[http://www.php.net/apc APC] está instalado',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] está instalado',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
+ 'config-no-cache' => "'''Atención:''' Non se puido atopar [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].
+A caché de obxectos está desactivada.",
+ 'config-diff3-bad' => 'GNU diff3 non se atopou.',
+ 'config-imagemagick' => 'ImageMagick atopado: <code>$1</code>.
+As miniaturas de imaxes estarán dispoñibles se activa as cargas.',
+ 'config-gd' => 'Atopouse a biblioteca gráfica GD integrada.
+As miniaturas de imaxes estarán dispoñibles se activa as cargas.',
+ 'config-no-scaling' => 'Non se puido atopar a biblioteca GD ou ImageMagick.
+As miniaturas de imaxes estarán desactivadas.',
+ 'config-no-uri' => "'''Erro:''' Non se puido determinar o URI actual.
+Instalación abortada.",
+ 'config-uploads-not-safe' => "'''Atención:''' O seu directorio por defecto para as cargas, <code>$1</code>, é vulnerable a execucións arbitrarias de escrituras.
+Aínda que MediaWiki comproba todos os ficheiros cargados por se houbese ameazas de seguridade, é amplamente recomendable [http://www.mediawiki.org/wiki/Manual:Security#Upload_security pechar esta vulnerabilidade de seguridade] antes de activar as cargas.",
+ 'config-brokenlibxml' => 'O seu sistema ten unha combinación de versións de PHP e libxml2 que pode ser problemático e causar corrupción de datos en MediaWiki e outras aplicacións web.
+Actualice o sistema á versión 5.2.9 ou posterior do PHP e á 2.7.3 ou posterior de libxml2 ([http://bugs.php.net/bug.php?id=45996 erro presentado co PHP]).
+Instalación abortada.',
+ 'config-using531' => 'O PHP $1 non é compatible con MediaWiki debido a un erro que afecta aos parámetros de referencia de <code>__call()</code>.
+Actualice o sistema á versión 5.3.2 ou posterior do PHP ou volva á versión 5.3.0 do PHP para arranxar o problema.
+Instalación abortada.',
+ 'config-db-type' => 'Tipo de base de datos:',
+ 'config-db-host' => 'Servidor da base de datos:',
+ 'config-db-host-help' => 'Se o servidor da súa base de datos está nun servidor diferente, escriba o nome do servidor ou o enderezo IP aquí.
+
+Se está usando un aloxamento web compartido, o seu provedor de hospedaxe debe darlle o nome de servidor correcto na súa documentación.
+
+Se está a realizar a instalación nun servidor de Windows con MySQL, o nome "localhost" pode non valer como servidor. Se non funcionase, inténteo con "127.0.0.1" como enderezo IP local.',
+ 'config-db-host-oracle' => 'TNS da base de datos:',
+ 'config-db-host-oracle-help' => 'Insira un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nome de conexión local] válido; cómpre que haxa visible un ficheiro tnsnames.ora para esta instalación.<br />Se está a empregar bibliotecas cliente versión 10g ou máis recentes, tamén pode usar o método de atribución de nomes [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identificar o wiki',
+ 'config-db-name' => 'Nome da base de datos:',
+ 'config-db-name-help' => 'Escolla un nome que identifique o seu wiki.
+Non debe conter espazos.
+
+Se está usando un aloxamento web compartido, o seu provedor de hospedaxe daralle un nome específico para a base de datos ou deixaralle crear unha a través do panel de control.',
+ 'config-db-name-oracle' => 'Esquema da base de datos:',
+ 'config-db-account-oracle-warn' => 'Existen tres escenarios soportados para a instalación de Oracle como fin da base de datos:
+
+Se quere crear unha conta para a base de datos como parte do proceso de instalación, proporcione unha conta co papel SYSDBA e especifique as credenciais desexadas para a conta; senón pode crear a conta manualmente e dar só esa conta (se ten os permisos necesarios para crear os obxectos do esquema) ou fornecer dous contas diferentes, unha con privilexios de creación e outra restrinxida para o acceso á web.
+
+A escritura para crear unha conta cos privilexios necesarios atópase no directorio "maintenance/oracle/" desta instalación. Teña en conta que o emprego de contas restrinxidas desactivará todas as operacións de mantemento da conta predeterminada.',
+ 'config-db-install-account' => 'Conta de usuario para a instalación',
+ 'config-db-username' => 'Nome de usuario da base de datos:',
+ 'config-db-password' => 'Contrasinal da base de datos:',
+ 'config-db-password-empty' => 'Introduza un contrasinal para o novo usuario da base de datos: $1.
+Malia que é posible crear usuarios sen contrasinal, esta práctica non é segura.',
+ 'config-db-install-username' => 'Escriba o nome de usuario que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o nome de usuario da conta de MediaWiki, trátase do nome de usuario para a súa base de datos.',
+ 'config-db-install-password' => 'Escriba o contrasinal que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o contrasinal da conta de MediaWiki, trátase do contrasinal para a súa base de datos.',
+ 'config-db-install-help' => 'Introduza o nome de usuario e contrasinal que se usará para conectar á base de datos durante o proceso de instalación.',
+ 'config-db-account-lock' => 'Use o mesmo nome de usuario e contrasinal despois do proceso de instalación',
+ 'config-db-wiki-account' => 'Conta de usuario para despois do proceso de instalación',
+ 'config-db-wiki-help' => 'Introduza o nome de usuario e mais o contrasinal que se usarán para conectar á base de datos durante o funcionamento habitual do wiki.
+Se a conta non existe e a conta de instalación ten privilexios suficientes, esa conta de usuario será creada cos privilexios mínimos necesarios para o funcionamento do wiki.',
+ 'config-db-prefix' => 'Prefixo das táboas da base de datos:',
+ 'config-db-prefix-help' => 'Se necesita compartir unha base de datos entre varios wikis ou entre MediaWiki e outra aplicación web, pode optar por engadir un prefixo a todos os nomes da táboa para evitar conflitos.
+Non utilice espazos.
+
+O normal é que este campo quede baleiro.',
+ 'config-db-charset' => 'Conxunto de caracteres da base de datos',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binario',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 retrocompatible UTF-8',
+ 'config-charset-help' => "'''Atención:''' Se emprega '''backwards-compatible UTF-8''' no MySQL 4.1+ e posteriormente realiza unha copia de seguridade da base de datos con <code>mysqldump</code>, pode destruír todos os caracteres que non sexan ASCII, corrompendo de xeito irreversible as súas copias!
+
+No '''modo binario''', MediaWiki almacena texto UTF-8 na base de datos en campos binarios.
+Isto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.
+No '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,
+pero non lle deixará gardar caracteres por riba do [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
+ 'config-mysql-old' => 'Necesítase MySQL $1 ou posterior; ten a versión $2.',
+ 'config-db-port' => 'Porto da base de datos:',
+ 'config-db-schema' => 'Esquema para MediaWiki',
+ 'config-db-schema-help' => 'O normal é que este esquema sexa correcto.
+Cámbieo soamente se sabe que é necesario.',
+ 'config-sqlite-dir' => 'Directorio de datos SQLite:',
+ 'config-sqlite-dir-help' => "SQLite recolle todos os datos nun ficheiro único.
+
+O servidor web debe ter permisos sobre o directorio para que poida escribir nel durante a instalación.
+
+Ademais, o servidor '''non''' debe ser accesible a través da web, motivo polo que non está no mesmo lugar ca os ficheiros PHP.
+
+Asemade, o programa de instalación escribirá un ficheiro <code>.htaccess</code>, pero se erra alguén pode obter acceso á súa base de datos.
+Isto inclúe datos de usuario (enderezos de correo electrónico, contrasinais codificados), así como revisións borradas e outros datos restrinxidos no wiki.
+
+Considere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/mediawiki/oseuwiki</code>.",
+ 'config-oracle-def-ts' => 'Espazo de táboas por defecto:',
+ 'config-oracle-temp-ts' => 'Espazo de táboas temporal:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki soporta os seguintes sistemas de bases de datos:
+
+$1
+
+Se non ve listado a continuación o sistema de base de datos que intenta usar, siga as instrucións ligadas enriba para activar o soporte.',
+ 'config-support-mysql' => '* $1 é o obxectivo principal para MediaWiki e está mellor soportado ([http://www.php.net/manual/en/mysql.installation.php como compilar o PHP con soporte MySQL])',
+ 'config-support-postgres' => '* $1 é un sistema de base de datos popular e de código aberto como alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar o PHP con soporte PostgreSQL]). É posible que haxa algúns pequenos erros e non se recomenda o seu uso nun entorno de produción.',
+ 'config-support-sqlite' => '* $1 é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)',
+ 'config-support-oracle' => '* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con soporte OCI8])',
+ 'config-header-mysql' => 'Configuración do MySQL',
+ 'config-header-postgres' => 'Configuración do PostgreSQL',
+ 'config-header-sqlite' => 'Configuración do SQLite',
+ 'config-header-oracle' => 'Configuración do Oracle',
+ 'config-invalid-db-type' => 'Tipo de base de datos incorrecto',
+ 'config-missing-db-name' => 'Debe escribir un valor "Nome da base de datos"',
+ 'config-missing-db-host' => 'Debe escribir un valor "Servidor da base de datos"',
+ 'config-missing-db-server-oracle' => 'Debe escribir un valor "TNS da base de datos"',
+ 'config-invalid-db-server-oracle' => 'O TNS da base de datos, "$1", é incorrecto.
+Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e puntos (.).',
+ 'config-invalid-db-name' => 'O nome da base de datos, "$1", é incorrecto.
+Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e guións (-).',
+ 'config-invalid-db-prefix' => 'O prefixo da base de datos, "$1", é incorrecto.
+Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e guións (-).',
+ 'config-connection-error' => '$1.
+
+Comprobe o servidor, nome de usuario e contrasinal que hai a continuación e inténteo de novo.',
+ 'config-invalid-schema' => 'O esquema de MediaWiki, "$1", é incorrecto.
+Só pode conter letras ASCII (a-z, A-Z), números (0-9) e guións baixos (_).',
+ 'config-db-sys-create-oracle' => 'O programa de instalación soamente soporta o emprego de contas SYSDBA como método para crear unha nova conta.',
+ 'config-db-sys-user-exists-oracle' => 'A conta de usuario "$1" xa existe. SYSDBA soamente se pode empregar para a creación dunha nova conta!',
+ 'config-postgres-old' => 'Necesítase PostgreSQL $1 ou posterior; ten a versión $2.',
+ 'config-sqlite-name-help' => 'Escolla un nome que identifique o seu wiki.
+Non utilice espazos ou guións.
+Este nome será utilizado para o ficheiro de datos SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Non se puido crear o directorio de datos <code><nowiki>$1</nowiki></code>, porque o servidor web non pode escribir no directorio pai <code><nowiki>$2</nowiki></code>.
+
+O programa de instalación determinou o usuario que executa o seu servidor web.
+Para continuar, faga que se poida escribir no directorio <code><nowiki>$3</nowiki></code>.
+Nun sistema Unix/Linux cómpre realizar:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Non se puido crear o directorio de datos <code><nowiki>$1</nowiki></code>, porque o servidor web non pode escribir no directorio pai <code><nowiki>$2</nowiki></code>.
+
+O programa de instalación non puido determinar o usuario que executa o seu servidor web.
+Para continuar, faga que se poida escribir globalmente no directorio <code><nowiki>$3</nowiki></code>.
+Nun sistema Unix/Linux cómpre realizar:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Erro ao crear o directorio de datos "$1".
+Comprobe a localización e inténteo de novo.',
+ 'config-sqlite-dir-unwritable' => 'Non se puido escribir o directorio "$1".
+Cambie os permisos para que o servidor poida escribir nel e inténteo de novo.',
+ 'config-sqlite-connection-error' => '$1.
+
+Comprobe o directorio de datos e o nome da base de datos que hai a continuación e inténteo de novo.',
+ 'config-sqlite-readonly' => 'Non se pode escribir no ficheiro <code>$1</code>.',
+ 'config-sqlite-cant-create-db' => 'Non se puido crear o ficheiro da base de datos <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'Falta o soporte FTS3 para o PHP; diminuíndo as táboas',
+ 'config-can-upgrade' => "Existen táboas MediaWiki nesta base de datos.
+Para actualizalas a MediaWiki \$1, prema sobre \"'''Continuar'''\".",
+ 'config-upgrade-done' => "Actualización completada.
+
+Agora pode [$1 comezar a utilizar o seu wiki].
+
+Se quere rexenerar o seu ficheiro <code>LocalSettings.php</code>, prema no botón que aparece a continuación.
+Isto '''non é recomendable''' a menos que estea a ter problemas co seu wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Actualización completada.
+
+Xa pode [$1 comezar a usar o seu wiki].',
+ 'config-regenerate' => 'Rexenerar LocalSettings.php →',
+ 'config-show-table-status' => 'A pescuda SHOW TABLE STATUS fallou!',
+ 'config-unknown-collation' => "'''Atención:''' A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
+ 'config-db-web-account' => 'Conta na base de datos para o acceso á internet',
+ 'config-db-web-help' => 'Seleccione o nome de usuario e contrasinal que o servidor web empregará para se conectar ao servidor da base de datos durante o funcionamento normal do wiki.',
+ 'config-db-web-account-same' => 'Empregar a mesma conta que para a instalación',
+ 'config-db-web-create' => 'Crear a conta se aínda non existe',
+ 'config-db-web-no-create-privs' => 'A conta que especificou para a instalación non ten os privilexios suficientes para crear unha conta.
+A conta que se especifique aquí xa debe existir.',
+ 'config-mysql-engine' => 'Motor de almacenamento:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.
+
+'''MyISAM''' é máis rápido en instalacións de usuario único e de só lectura.
+As bases de datos MyISAM tenden a se corromper máis a miúdo ca as bases de datos InnoDB.",
+ 'config-mysql-charset' => 'Conxunto de caracteres da base de datos:',
+ 'config-mysql-binary' => 'Binario',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "No '''modo binario''', MediaWiki almacena texto UTF-8 na base de datos en campos binarios.
+Isto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.
+
+No '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,
+pero non lle deixará gardar caracteres por riba do [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
+ 'config-site-name' => 'Nome do wiki:',
+ 'config-site-name-help' => 'Isto aparecerá na barra de títulos do navegador e noutros lugares.',
+ 'config-site-name-blank' => 'Escriba o nome do sitio.',
+ 'config-project-namespace' => 'Espazo de nomes do proxecto:',
+ 'config-ns-generic' => 'Proxecto',
+ 'config-ns-site-name' => 'O mesmo nome que o wiki: $1',
+ 'config-ns-other' => 'Outro (especificar)',
+ 'config-ns-other-default' => 'OMeuWiki',
+ 'config-project-namespace-help' => 'Seguindo o exemplo da Wikipedia, moitos wikis manteñen as súas páxinas de políticas separadas das súas páxinas de contido, nun "\'\'\'espazo de nomes do proxecto\'\'\'".
+Todos os títulos presentes neste espazo de nomes comezan cun prefixo determinado, que pode especificar aquí.
+Tradicionalmente, este prefixo deriva do nome do wiki, pero non pode conter caracteres de puntuación como "#" ou ":".',
+ 'config-ns-invalid' => 'O espazo de nomes especificado, "<nowiki>$1</nowiki>", é incorrecto.
+Especifique un espazo de nomes do proxecto diferente.',
+ 'config-ns-conflict' => 'O espazo de nomes especificado, "<nowiki>$1</nowiki>", entra en conflito co espazo de nomes MediaWiki por defecto.
+Especifique un espazo de nomes do proxecto diferente.',
+ 'config-admin-box' => 'Conta de administrador',
+ 'config-admin-name' => 'O seu nome:',
+ 'config-admin-password' => 'Contrasinal:',
+ 'config-admin-password-confirm' => 'Repita o contrasinal:',
+ 'config-admin-help' => 'Escriba o nome de usuario que queira aquí, por exemplo, "Joe Bloggs".
+Este é o nome que usará para acceder ao sistema do wiki.',
+ 'config-admin-name-blank' => 'Escriba un nome de usuario para o administrador.',
+ 'config-admin-name-invalid' => 'O nome de usuario especificado, "<nowiki>$1</nowiki>", é incorrecto.
+Especifique un nome de usuario diferente.',
+ 'config-admin-password-blank' => 'Escriba un contrasinal para a conta de administrador.',
+ 'config-admin-password-same' => 'O contrasinal debe diferir do nome de usuario.',
+ 'config-admin-password-mismatch' => 'Os contrasinais non coinciden.',
+ 'config-admin-email' => 'Enderezo de correo electrónico:',
+ 'config-admin-email-help' => 'Escriba aquí un enderezo de correo electrónico para que poida recibir mensaxes doutros usuarios a través do wiki, restablecer o contrasinal e ser notificado das modificacións feitas nas páxinas presentes na súa lista de vixilancia. Pode deixar este campo en branco.',
+ 'config-admin-error-user' => 'Erro interno ao crear un administrador co nome "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Erro interno ao establecer un contrasinal para o administrador "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Escribiu un enderezo de correo electrónico non válido.',
+ 'config-subscribe' => 'Subscríbase á [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de correo de anuncios sobre lanzamentos].',
+ 'config-subscribe-help' => 'Esta é unha lista de correos de baixo volume usada para anuncios sobre lanzamentos de novas versións, incluíndo avisos de seguridade importantes.
+Debería subscribirse a ela e actualizar a súa instalación MediaWiki cando saian as novas versións.',
+ 'config-almost-done' => 'Xa case rematou!
+Neste paso pode saltar o resto da configuración e instalar o wiki agora mesmo.',
+ 'config-optional-continue' => 'Facédeme máis preguntas.',
+ 'config-optional-skip' => 'Xa estou canso. Instalade o wiki.',
+ 'config-profile' => 'Perfil dos dereitos de usuario:',
+ 'config-profile-wiki' => 'Wiki tradicional',
+ 'config-profile-no-anon' => 'Necesítase a creación dunha conta',
+ 'config-profile-fishbowl' => 'Só os editores autorizados',
+ 'config-profile-private' => 'Wiki privado',
+ 'config-profile-help' => "Os wikis funcionan mellor canta máis xente os edite.
+En MediaWiki, é doado revisar os cambios recentes e reverter calquera dano feito por usuarios novatos ou con malas intencións.
+Porén, moita xente atopa MediaWiki útil nunha ampla variedade de papeis, e ás veces non é fácil convencer a todos dos beneficios que leva consigo o estilo wiki.
+Vostede decide.
+
+O tipo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.
+A opción '''{{int:config-profile-no-anon}}''' proporciona un control maior, pero pode desalentar os colaboradores casuais.
+
+O escenario '''{{int:config-profile-fishbowl}}''' restrinxe a edición aos usuarios aprobados, pero o público pode ollar as páxinas, incluíndo os historiais.
+O tipo '''{{int:config-profile-private}}''' só deixa que os usuarios aprobados vexan e editen as páxinas.
+
+Hai dispoñibles configuracións de dereitos de usuario máis complexas despois da instalación; bótelle un ollo a [http://www.mediawiki.org/wiki/Manual:User_rights esta entrada no manual].",
+ 'config-license' => 'Dereitos de autor e licenza:',
+ 'config-license-none' => 'Sen licenza ao pé',
+ 'config-license-cc-by-sa' => 'Creative Commons recoñecemento compartir igual',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons recoñecemento non comercial compartir igual',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'Licenza de documentación libre de GNU 1.2',
+ 'config-license-gfdl-current' => 'Licenza de documentación libre de GNU 1.3 ou posterior',
+ 'config-license-pd' => 'Dominio público',
+ 'config-license-cc-choose' => 'Seleccione unha licenza Creative Commons personalizada',
+ 'config-license-help' => "Moitos wikis públicos liberan todas as súas contribucións baixo unha [http://freedomdefined.org/Definition/Gl licenza libre].
+Isto axuda a crear un sentido de propiedade na comunidade e anima a seguir contribuíndo durante moito tempo.
+Xeralmente, non é necesario nos wikis privados ou de empresas.
+
+Se quere poder empregar textos da Wikipedia, así como que a Wikipedia poida aceptar textos copiados do seu wiki, escolla a licenza '''Creative Commons recoñecemento compartir igual'''.
+
+A licenza de documentación libre de GNU era a licenza anterior da Wikipedia.
+Malia aínda ser unha licenza válida, esta ten algunhas características que poden facer o reuso e a interpretación difíciles.",
+ 'config-email-settings' => 'Configuración do correo electrónico',
+ 'config-enable-email' => 'Activar os correos electrónicos de saída',
+ 'config-enable-email-help' => 'Se quere que o correo electrónico funcione, cómpre configurar os [http://www.php.net/manual/en/mail.configuration.php parámetros PHP] correctamente.
+Se non quere ningunha característica no correo, pode desactivalas aquí.',
+ 'config-email-user' => 'Activar o intercambio de correos electrónicos entre usuarios',
+ 'config-email-user-help' => 'Permitir que todos os usuarios intercambien correos electrónicos, se o teñen activado nas súas preferencias.',
+ 'config-email-usertalk' => 'Activar a notificación da páxina de conversa de usuario',
+ 'config-email-usertalk-help' => 'Permitir que os usuarios reciban notificacións cando a súa páxina de conversa de usuario sufra modificacións, se o teñen activado nas súas preferencias.',
+ 'config-email-watchlist' => 'Activar a notificación da lista de vixilancia',
+ 'config-email-watchlist-help' => 'Permitir que os usuarios reciban notificacións sobre modificacións nas páxinas que vixían, se o teñen activado nas súas preferencias.',
+ 'config-email-auth' => 'Activar a autenticación do correo electrónico',
+ 'config-email-auth-help' => "Se esta opción está activada, os usuarios teñen que confirmar o seu correo electrónico mediante unha ligazón enviada ao enderezo cando o definan ou o cambien.
+Só os enderezos autenticados poden recibir correos doutros usuarios ou de notificación.
+É '''recomendable''' establecer esta opción nos wikis públicos para evitar abusos potenciais das características do correo.",
+ 'config-email-sender' => 'Enderezo de correo electrónico de retorno:',
+ 'config-email-sender-help' => 'Introduza o enderezo de correo electrónico a usar como enderezo de retorno dos correos de saída.
+Aquí é onde irán parar os correos rexeitados.
+Moitos servidores de correo electrónico esixen que polo menos a parte do nome de dominio sexa válido.',
+ 'config-upload-settings' => 'Imaxes e carga de ficheiros',
+ 'config-upload-enable' => 'Activar a carga de ficheiros',
+ 'config-upload-help' => 'A subida de ficheiros expón potencialmente o servidor a riscos de seguridade.
+Para obter máis información, lea a [http://www.mediawiki.org/wiki/Manual:Security sección de seguridade] no manual.
+
+Para activar a carga de ficheiros, cambie o modo no subdirectorio <code>images</code> que está baixo o directorio raíz de MediaWiki, de xeito que o servidor web poida escribir nel.
+A continuación, active esta opción.',
+ 'config-upload-deleted' => 'Directorio para os ficheiros borrados:',
+ 'config-upload-deleted-help' => 'Escolla un directorio no que arquivar os ficheiros borrados.
+O ideal é que non sexa accesible desde a web.',
+ 'config-logo' => 'URL do logo:',
+ 'config-logo-help' => 'A aparencia de MediaWiki por defecto inclúe espazo para un logo de 135x160 píxeles no recuncho superior esquerdo.
+Cargue unha imaxe do tamaño axeitado e introduza o URL aquí.
+
+Se non quere un logo, deixe esta caixa en branco.',
+ 'config-instantcommons' => 'Activar Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [http://commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].
+Para facer isto, MediaWiki necesita acceso á internet.
+
+Para obter máis información sobre esta característica, incluíndo as instrucións sobre como configuralo para outros wikis que non sexan a Wikimedia Commons, consulte [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos o manual].',
+ 'config-cc-error' => 'A escolla da licenza Creative Commons non deu resultados.
+Escriba o nome da licenza manualmente.',
+ 'config-cc-again' => 'Escolla outra vez...',
+ 'config-cc-not-chosen' => 'Escolla a licenza Creative Commons que desexe e prema en "continuar".',
+ 'config-advanced-settings' => 'Configuración avanzada',
+ 'config-cache-options' => 'Configuración da caché de obxectos:',
+ 'config-cache-help' => 'A caché de obxectos emprégase para mellorar a velocidade de MediaWiki mediante a memorización de datos usados con frecuencia.
+É amplamente recomendable a súa activación nos sitios de tamaño medio e grande; os sitios pequenos obterán tamén beneficios.',
+ 'config-cache-none' => 'Sen caché (non se elimina ningunha funcionalidade, pero pode afectar á velocidade en wikis grandes)',
+ 'config-cache-accel' => 'Caché de obxectos do PHP (APC, eAccelerator, XCache ou WinCache)',
+ 'config-cache-memcached' => 'Empregar o Memcached (necesita unha instalación e configuración adicional)',
+ 'config-memcached-servers' => 'Servidores da memoria caché:',
+ 'config-memcached-help' => 'Lista de enderezos IP para Memcached.
+Debe especificarse un por liña, así como o porto a usar. Por exemplo:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Seleccionou Memcached como o seu tipo de caché, pero non especificou ningún servidor.',
+ 'config-memcache-badip' => 'Escribiu un enderezo IP inválido para Memcached: $1.',
+ 'config-memcache-noport' => 'Non especificou o porto a usar no servidor Memcached: $1.
+Se non sabe o porto, o predeterminado é 11211.',
+ 'config-memcache-badport' => 'Os números de porto Memcached deben estar entre $1 e $2.',
+ 'config-extensions' => 'Extensións',
+ 'config-extensions-help' => 'As extensións anteriores detectáronse no seu directorio <code>./extensions</code>.
+
+Quizais necesite algunha configuración adicional, pero pode activalas agora',
+ 'config-install-alreadydone' => "'''Atención:''' Semella que xa instalou MediaWiki e que o está a instalar de novo.
+Vaia ata a seguinte páxina.",
+ 'config-install-begin' => 'Ao premer en "{{int:config-continue}}", comezará a instalación de MediaWiki.
+Se aínda quere facer algún cambio, volva atrás.',
+ 'config-install-step-done' => 'feito',
+ 'config-install-step-failed' => 'erro',
+ 'config-install-extensions' => 'Incluíndo as extensións',
+ 'config-install-database' => 'Configurando a base de datos',
+ 'config-install-pg-schema-not-exist' => 'O esquema PostgreSQL non existe.',
+ 'config-install-pg-schema-failed' => 'Fallou a creación de táboas.
+Asegúrese de que o usuario "$1" pode escribir no esquema "$2".',
+ 'config-install-pg-commit' => 'Validando os cambios',
+ 'config-install-pg-plpgsql' => 'Comprobación da lingua PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Cómpre instalar a lingua PL/pgSQL na base de datos $1',
+ 'config-pg-no-create-privs' => 'A conta especificada para a instalación non ten os privilexios necesarios para crear unha conta.',
+ 'config-install-user' => 'Creando o usuario da base de datos',
+ 'config-install-user-alreadyexists' => 'O usuario "$1" xa existe',
+ 'config-install-user-create-failed' => 'A creación do usuario "$1" fallou: $2',
+ 'config-install-user-grant-failed' => 'Fallou a concesión de permisos ao usuario "$1": $2',
+ 'config-install-tables' => 'Creando as táboas',
+ 'config-install-tables-exist' => "'''Atención:''' Semella que as táboas de MediaWiki xa existen.
+Saltando a creación.",
+ 'config-install-tables-failed' => "'''Erro:''' Fallou a creación da táboa. Descrición do erro: $1",
+ 'config-install-interwiki' => 'Enchendo a táboa de interwiki por defecto',
+ 'config-install-interwiki-list' => 'Non se puido atopar o ficheiro <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Atención:''' Semella que a táboa de interwiki xa contén entradas.
+Saltando a lista por defecto.",
+ 'config-install-stats' => 'Iniciando as estatísticas',
+ 'config-install-keys' => 'Xerando a clave secreta',
+ 'config-install-sysop' => 'Creando a conta de usuario de administrador',
+ 'config-install-subscribe-fail' => 'Non se puido subscribir á lista mediawiki-announce',
+ 'config-install-mainpage' => 'Creando a páxina principal co contido por defecto',
+ 'config-install-extension-tables' => 'Creando as táboas para as extensións activadas',
+ 'config-install-mainpage-failed' => 'Non se puido inserir a páxina principal: $1',
+ 'config-install-done' => "'''Parabéns!'''
+Instalou correctamente MediaWiki.
+
+O programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.
+Este ficheiro contén toda a súa configuración.
+
+Terá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.
+
+Se non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:
+
+$3
+
+'''Nota:''' Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.
+
+Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
+ 'config-download-localsettings' => 'Descargar o LocalSettings.php',
+ 'config-help' => 'axuda',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'config-desc' => 'S MediaWiki-Inschtallationsprogramm',
+ 'config-title' => 'MediaWiki $1 inschtalliere',
+ 'config-information' => 'Information',
+ 'config-localsettings-upgrade' => "'''Warnig:''' E Datei <code>LocalSettings.php</code> isch gfunde wore.
+Fir d Aktualisierig vu dr däre Inschtallation, gib bitte dr Wärt vum Parameter <code>\$wgUpgradeKey</code> im Fäld unten yy.
+Du findsch dr Wärt in dr Datei LocalSettings.php.",
+ 'config-localsettings-key' => 'Aktualisierigsschlissel:',
+ 'config-localsettings-badkey' => 'Dr Aktualisierigsschlissel, wu du aagee hesch, isch falsch.',
+ 'config-session-error' => 'Fähler bim Starte vu dr Sitzig: $1',
+ 'config-session-expired' => 'D Sitzigsdate sin schyns abgloffe.
+Sitzige sin fir e Zytruum vu $1 konfiguriert.
+Dää cha dur Aalupfe vum Parameter <code>session.gc_maxlifetime</code> in dr Datei <code>php.ini</code> greßer gmacht wäre.
+Dr Inschtallationsvorgang nomol starte.',
+ 'config-no-session' => 'Dyyni Sitzigsdate sin verlore gange!
+D Datei <code>php.ini</code> mueß prieft wäre un s mueß derby sichergstellt wäre, ass dr Parameter <code>session.save_path</code> uf s richtig Verzeichnis verwyyst.',
+ 'config-your-language' => 'Dyy Sproch:',
+ 'config-your-language-help' => 'Bitte d Sproch uuswehle, wu bim Inschtallationsvorgang soll brucht wäre.',
+ 'config-wiki-language' => 'Wikisproch:',
+ 'config-wiki-language-help' => 'Bitte d Sproch uuswehle, wu s Wiki in dr Hauptsach din gschribe wird.',
+ 'config-back' => '↠Zruck',
+ 'config-continue' => 'Wyter →',
+ 'config-page-language' => 'Sproch',
+ 'config-page-welcome' => 'Willchuu bi MediaWiki!',
+ 'config-page-dbconnect' => 'Mit dr Datebank verbinde',
+ 'config-page-upgrade' => 'E Inschtallition, wu s scho het, aktualisiere',
+ 'config-page-dbsettings' => 'Datebankyystellige',
+ 'config-page-name' => 'Name',
+ 'config-page-options' => 'Optione',
+ 'config-page-install' => 'Inschtalliere',
+ 'config-page-complete' => 'Fertig!',
+ 'config-page-restart' => 'Inschtallation nomol aafange',
+ 'config-page-readme' => 'Liis mi',
+ 'config-page-releasenotes' => 'Hiiwys fir d Vereffentlichung',
+ 'config-page-copying' => 'Am Kopiere',
+ 'config-page-upgradedoc' => 'Am Aktualisiere',
+ 'config-help-restart' => 'Witt alli Date, wu Du yygee hesch, lesche un d Inschtallation nomol aafange?',
+ 'config-restart' => 'Jo, nomol aafange',
+ 'config-welcome' => '=== Priefig vu dr Inschtallationsumgäbig ===
+Basispriefige wäre durgfiert zum Feschtstelle, eb d Inschtallationsumgäbig fir d Inschtallation vu MediaWiki geignet isch.
+Du sottsch d Ergebnis vu däre Priefig aagee, wänn Du bi dr Inschtallation Hilf bruchsch.',
+ 'config-copyright' => "=== Copyright un Nutzigsbedingige ===
+
+$1
+
+Des Programm isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.
+
+Des Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber '''ohni jedi Garanti''' un sogar ohni di impliziert Garanti vun ere '''Märtgängigkeit''' oder '''Eignig fir e bstimmte Zwäck'''. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.
+
+E <doclink href=Copying>Kopi vu dr GNU General Public-Lizänz</doclink> sott zämme mit däm Programm verteilt wore syy. Wänn des nit eso isch, cha ne Kopi bi dr Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftli aagforderet oder [http://www.gnu.org/copyleft/gpl.html online gläse] wäre.",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki Websyte vu MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Nutzeraaleitig zue MediaWiki]
+* [http://www.mediawiki.org/wiki/Manual:Contents Adminischtratoreaaleitig zue MediaWiki]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Vilmol gstellti Froge zue MediaWiki]',
+ 'config-env-good' => 'D Inschtallationsumgäbig isch prieft wore.
+Du chasch MediaWiki inschtalliere.',
+ 'config-env-bad' => 'D Inschtallationsumgäbigisch prieft wore.
+Du chasch MediaWiki nit inschtalliere.',
+ 'config-env-php' => 'PHP $1 isch inschtalliert.',
+ 'config-unicode-using-utf8' => 'Fir d Unicode-Normalisierig wird em Brion Vibber syy utf8_normalize.so yygsetzt.',
+ 'config-unicode-using-intl' => 'For d Unicode-Normalisierig wird d [http://pecl.php.net/intl PECL-Erwyterig intl] yygsetzt.',
+ 'config-unicode-pure-php-warning' => "'''Warnig:''' D [http://pecl.php.net/intl PECL-Erwyterig intl] isch fir d Unicode-Normalisierig nit verfiegbar. Wäge däm wird di langsam pure-PHP-Implementierig brucht.
+Wänn Du ne Websyte mit ere große Bsuechrzahl bedrybsch, sottsch e weng ebis läse iber [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-Normalisierig (en)].",
+ 'config-unicode-update-warning' => "'''Warnig:''' Di inschtalliert Version vum Unicode-Normalisierigswrapper verwändet e elteri Version vu dr Bibliothek vum [http://site.icu-project.org/ ICU-Projäkt].
+Du sottsch si [http://www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiere], wänn Dor d Verwändig vu Unicode wichtig isch.",
+ 'config-no-db' => 'S isch kei adäquate Datebanktryyber gfunde wore!',
+ 'config-no-db-help' => 'S mueß e Datebanktryyber fir PHP inschtalliert wäre.
+Die Datebanksyschtem wäre unterstitzt: $1
+
+Wänn Du ne gmeinschaftli gnutzte Server fir s Hosting bruchsch, muesch dr Hoster froge go ne adäquate Datebanktryyber inschtalliere.
+Wänn Du PHP sälber kumpiliert hesch, muesch s nej konfiguriere, dr Datebankclient mueß aktiviert wäre. Doderzue chasch zem Byschpel <code>./configure --with-mysql</code> uusfiere.
+Wänn Du PHP iber d Paketverwaltig vun ere Debian- oder Ubuntu-Inschtallation inschtalliert hesch, muesch s „php5-mysql“-Paket nooinschtalliere.',
+ 'config-no-fts3' => "'''Warnig:''' SQLite isch ohni s [http://sqlite.org/fts3.html FTS3-Modul] kumpiliert wore, s stehn kei Suechfunktione z Verfiegig.",
+ 'config-register-globals' => "'''Warnig: Dr Parameter <code>[http://php.net/register_globals register_globals]</code> vu PHP isch aktiviert.'''
+'''Är sott deaktiviert wäre, wänn des megli isch.'''
+D MediaWiki-Inschtallation lauft einwäg, aber dr Server isch aafällig fi megligi Sicherheitsprobläm.",
+ 'config-magic-quotes-runtime' => "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> vu PHP isch aktiviert!'''
+Die Yystellig fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.
+MediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
+ 'config-magic-quotes-sybase' => "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> vu PHP isch aktiviert!'''
+Die Yystellig fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.
+MediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
+ 'config-mbstring' => "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> vu PHP isch aktiviert!'''
+Die Yystellig verursacht Fähler un fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.
+MediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
+ 'config-ze1' => "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]</code> vu PHP isch aktiviert!'''
+Die Yystellig fiert zue große Fähler bi MediaWiki.
+MediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
+ 'config-safe-mode' => "'''Warnig:''' D Funktion <code>[http://www.php.net/features.safe-mode Safe Mode]</code> vu PHP isch aktiviert.
+Des cha zue Probläm fiere, vor allem wänn s Uffelade vu Dateie soll megli syy bzw. dr Uuszeichner <code>math</code> soll brucht wäre.",
+ 'config-xml-bad' => 'S XML-Modul vu PHP fählt.
+MediaWiki brucht Funktione, wu au des Modul z Verfiegig stellt, un funktioniert in däre Konfiguration nit.
+Wänn Mandriva brucht wird, mueß no s „php-xml“-Paket inschtalliert wäre.',
+ 'config-pcre' => 'S PHP-Modul fir d PCRE-Unterstitzig isch nit gfunde wore.
+MediaWiki brucht aber perl-kompatibli reguläri Uusdruck zum lauffähig syy.',
+ 'config-pcre-no-utf8' => "'''Fatale Fähler: S PHP-Modul PCRE isch schyns ohni PCRE_UTF8-Unterstitzig kompiliert wore.'''
+MediaWiki brucht d UTF-8-Unterstitzi zum fählerfrej lauffähig syy.",
+ 'config-memory-raised' => 'Dr PHP-Parameter <code>memory_limit</code> lyt bi $1 un isch uf $2 uffegsetzt wore.',
+ 'config-memory-bad' => "'''Warnig:''' Dr PHP-Parameter <code>memory_limit</code> lyt bi $1.
+Dää Wärt isch wahrschyns z nider.
+Dr Inschtallationsvorgang chennt wäge däm fählschlaa!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] isch inschtalliert',
+ 'config-apc' => '[http://www.php.net/apc APC] isch inschtalliert',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] isch inschtalliert',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] isch inschtalliert',
+ 'config-no-cache' => "'''Warnig:''' [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] hän nit chenne gfunde wäre.
+S Objäktcaching isch wäge däm nit aktiviert.",
+ 'config-diff3-bad' => 'GNU diff3 isch nit gfunde wore.',
+ 'config-imagemagick' => 'ImageMagick isch gfunde wore: <code>$1</code>.
+Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch.',
+ 'config-help' => 'Hilf',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author YaronSh
+ */
+$messages['he'] = array(
+ 'config-desc' => 'תכנית ההתקנה של מדיה־ויקי',
+ 'config-title' => 'התקנת מדיה־ויקי $1',
+ 'config-information' => 'פרטי×',
+ 'config-localsettings-upgrade' => 'זוהה קובץ <code>LocalSettings.php</code>.
+כדי לשדרג ×ת ההתקנה ×”×–×ת, × × ×œ×”×§×œ×™×“ ×ת הערך של <code>$wgUpgradeKey</code> בתיבה להלן.
+×פשר ×œ×ž×¦×•× ×ותו בקובץ LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'זוהה קובץ LocalSettings.php.
+כדי לשדרג ×ת ההתקנה ×”×–×ת, הריצו ×ת update.php ×•×œ× ×ת הקובץ ×”×–×”.',
+ 'config-localsettings-key' => 'מפתח השדרוג:',
+ 'config-localsettings-badkey' => 'המפתח ×©×”×§×œ×“×ª× ×©×’×•×™',
+ 'config-upgrade-key-missing' => 'זוהתה התקנה קיימת של מדיה־ויקי.
+כדי לשדרג ×ת ההתקנה ×”×–×ת, ×× × ×›×ª×‘×• ×ת השורה ×”×‘× ×‘×ª×—×ª×™×ª קובץ LocalSettings.php שלכ×:
+
+$1',
+ 'config-localsettings-incomplete' => 'נר××” שקובץ LocalSettings.php ×”×§×™×™× ×ינו של×.
+המשתנה $1 ×ינו מוגדר.
+נו לשנות ×ת קובץ LocalSettings.php ×©×œ×›× ×›×š שהמשתנה ×”×–×” ×™×”×™×” מוגדר וללחוץ "המשך".',
+ 'config-localsettings-connection-error' => '×ירעה שגי××” בעת חיבור למסד × ×ª×•× ×™× ×¢× ×”×’×“×¨×•×ª ב־LocalSettings.php ×ו ב־AdminSettings.php. × × ×œ×ª×§×Ÿ ×ת ההגדרות ×”×לו ולנסות שוב.
+
+$1',
+ 'config-session-error' => 'שגי××” ב×תחול שיחה: $1',
+ 'config-session-expired' => 'נר××” שנתוני השיחה ×©×œ×›× ×¤×’×•.
+השיחות מוגדרות להיות תקפות לזמן של $1.
+×פשר להגדיל ×ת ×–×” ב־<code>session.gc_maxlifetime</code> בקובץ php.ini.
+יש להתחיל מחדש ×ת תהליך ההתקנה.',
+ 'config-no-session' => 'נתוני השיחה ×©×œ×›× ×בדו!
+יש לבדוק ×ת קובץ php.ini ×©×œ×›× ×•×œ×•×•×“× ×©×ª×™×§×™×™×” נכונה מוגדרת ב־<code>session.save_path</code>.',
+ 'config-your-language' => 'השפה שלכ×:',
+ 'config-your-language-help' => '× × ×œ×‘×—×•×¨ ×ת השפה שתשמש במהלך ההתקנה.',
+ 'config-wiki-language' => 'שפת הוויקי:',
+ 'config-wiki-language-help' => '× × ×œ×‘×—×•×¨ ×ת השפה העיקרית שבה ייכתב ויקי ×–×”.',
+ 'config-back' => '→ חזרה',
+ 'config-continue' => 'המשך â†',
+ 'config-page-language' => 'שפה',
+ 'config-page-welcome' => '×‘×¨×•×›×™× ×”×‘××™× ×œ×ž×“×™×”Ö¾×•×™×§×™!',
+ 'config-page-dbconnect' => 'התחברות למסד הנתוני×',
+ 'config-page-upgrade' => 'שדרוג התקנה קיימת',
+ 'config-page-dbsettings' => 'הגדרות מסד הנתוני×',
+ 'config-page-name' => 'ש×',
+ 'config-page-options' => '×פשרויות',
+ 'config-page-install' => 'התקנה',
+ 'config-page-complete' => 'הושלמה!',
+ 'config-page-restart' => 'הפעלת ההתקנה מחדש',
+ 'config-page-readme' => 'קר×Ö¾×ותי',
+ 'config-page-releasenotes' => 'הערות גרסה',
+ 'config-page-copying' => 'העתקה',
+ 'config-page-upgradedoc' => 'שדרוג',
+ 'config-page-existingwiki' => 'ויקי קיי×',
+ 'config-help-restart' => '×”×× ×‘×¨×¦×•× ×š לפנות ×ת כל ×”× ×ª×•× ×™× ×©× ×©×ž×¨×• שהוזנו על ידיך ולהתחיל מחדש ×ת תהליך ההתקנה?',
+ 'config-restart' => 'כן, להפעיל מחדש',
+ 'config-welcome' => '=== בדיקות סביבה ===
+בדיקות בסיסיות מתבצעות כדי לבדוק שהסביבה מת×ימה להתקנת מדיה־ויקי.
+יש לתת ×ת תוצ×ות הבדיקות ×”×לו ×× ×ª×–×“×§×§×• לעזרה בזמן ההתקנה.',
+ 'config-copyright' => "=== זכויות ×™×•×¦×¨×™× ×•×ª× ××™× ===
+
+$1
+
+תכנית זו ×”×™× ×ª×›× ×” חופשית; ב×פשרותך להפיצה מחדש ו/×ו לשנות ×ותה על פי תנ××™ הרישיון הציבורי הכללי של GNU כפי ×©×¤×•×¨×¡× ×¢×œ ידי קרן התכנה החופשית; בין ×× ×’×¨×¡×” 2 של הרישיון, ובין ×× (לפי בחירתך) כל גרסה מ×וחרת שלו.
+
+תכנית זו מופצת בתקווה שתהיה מועילה, ×בל '''×‘×œ× ×חריות כלשהי'''; ו×פילו ×œ×œ× ×”×חריות המשתמעת בדבר '''מסחריותה''' ×ו '''הת×מתה למטרה '''מסוימת'''. ×œ×¤×¨×˜×™× × ×•×¡×¤×™×, ניתן לעיין ברישיון הציבורי הכללי של GNU.
+
+לתכנית זו ×מור ×”×™×” להיות מצורף <doclink href=Copying>עותק של הרישיון הציבורי הכללי של GNU</doclink>; ×× ×œ×, עליך לכתוב ל־Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, , MA 02111-1307, USA. ×ו [http://www.gnu.org/copyleft/gpl.html ×œ×§×¨×•× ×ותו דרך ×”×ינטרנט].",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki ×תר הבית של מדיה־ויקי]
+* [http://www.mediawiki.org/wiki/Help:Contents המדריך למשתמשי×]
+* [http://www.mediawiki.org/wiki/Manual:Contents המדריך למנהלי×]
+* [http://www.mediawiki.org/wiki/Manual:FAQ שו״ת]
+----
+* <doclink href=Readme>×§×¨× ×ותי</doclink>
+* <doclink href=ReleaseNotes>הערות גרסה</doclink>
+* <doclink href=Copying>העתקה</doclink>
+* <doclink href=UpgradeDoc>שדרוג</doclink>',
+ 'config-env-good' => 'הסביבה ×©×œ×›× × ×‘×“×§×”.
+×פשר להתקין מדיה־ויקי.',
+ 'config-env-bad' => 'הסביבה ×©×œ×›× × ×‘×“×§×”.
+××™Ö¾×פשר להתקין מדיה־ויקי.',
+ 'config-env-php' => 'מותקנת PHP $1.',
+ 'config-env-php-toolow' => 'מותקנת PHP $1.
+למדיה־ויקי נדרשת PHP $2 ×ו גרסה גבוהה יותר.',
+ 'config-unicode-using-utf8' => 'משתמש ב־normalize.so של בריון ויבר לנרמול יוניקוד.',
+ 'config-unicode-using-intl' => 'משתמש בהרחבת [http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד',
+ 'config-unicode-pure-php-warning' => "'''×זהרה''': [http://pecl.php.net/intl הרחבת intl PECL] ××™× ×” זמינה לטיפול בנרמול יוניקוד. משתמש ×‘×™×™×©×•× PHP טהור ו×טי יותר.
+×× ×–×” ×תר בעל תעבורה גבוהה, כד××™ ×œ×§×¨×•× ×ת המסמך הב×: [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
+ 'config-unicode-update-warning' => "'''×זהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].
+כד××™ [http://www.mediawiki.org/wiki/Unicode_normalization_considerations לעדכן] ×× ×™×© חשוב ×œ×›× ×”×˜×™×¤×•×œ ביוניקוד.",
+ 'config-no-db' => '×œ× × ×ž×¦× ×“×¨×™×™×‘×¨ מסד × ×ª×•× ×™× ×ž×ª××™×.',
+ 'config-no-db-help' => 'יש להתקין דרייבר מסד × ×ª×•× ×™× ×œÖ¾PHP.
+× ×ª×ž×›×™× ×”×¡×•×’×™× ×”×‘××™× ×©×œ מסדי נתוני×: $1.
+
+×× ××ª× ×ž×©×ª×ž×©×™× ×‘×ירוח משותף, בקשו מספק ×”×ירוח ×©×œ×›× ×œ×”×ª×§×™×Ÿ דרייבר מסד × ×ª×•× ×™× ×ž×ª××™×.
+×× ×§×ž×¤×œ×ª× ×ת PHP בעצמכ×, הגדירו ×ותו מחדש והפעילו ×ת לקוח מסד × ×ª×•× ×™× (database client), למשל בעזרת <code>./configure --with-mysql</code>.
+×× ×”×ª×§× ×ª× ×ת PHP מחבילה של דבי×ן ×ו ×ובונטו, יש להתקין ×ת המודול php5-mysql.',
+ 'config-no-fts3' => "'''×זהרה''': SQLite מקומפל ×œ×œ× [http://sqlite.org/fts3.html מודול FTS]. יכולות חיפוש ×œ× ×™×”×™×• זמינות בהתקנה ×”×–×ת.",
+ 'config-register-globals' => "'''×זהרה: ×”×פשרות <code>[http://php.net/register_globals register_globals]</code> של PHP מופעלת.'''
+'''כבו ×ותה ×× ××ª× ×™×›×•×œ×™×.'''
+מדיה־ויקי תעבוד, ×בל השרת ×©×œ×›× ×—×©×•×£ לפגיעות ×בטחה.",
+ 'config-magic-quotes-runtime' => "'''שגי××” סופנית: ×”×פשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] פעילה!'''
+×”×פשרות ×”×–×ת מעוותת ×ת נתוני הקלט ב×ופן בלתי־צפוי.
+×œ× × ×™×ª×Ÿ להתקין ×ת מדיה־ויקי ××œ× ×× ×”×פשרות ×”×–×ת תכובה.",
+ 'config-magic-quotes-sybase' => "'''שגי××” סופנית''': ×”×פשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] פעילה!'''
+×”×פשרות ×”×–×ת מעוותת ×ת נתוני הקלט ב×ופן בלתי־צפוי.
+×œ× × ×™×ª×Ÿ להתקין ×ת מדיה־ויקי ×ו להשתמש בה ××œ× ×× ×”×פשרות ×”×–×ת תכובה.",
+ 'config-mbstring' => "'''שגי××” סופנית''': ×”×פשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''
+×”×פשרות ×”×–×ת גורמת לשגי×ות ומעוותת ×ת נתוני הקלט ב×ופן בלתי־צפוי.
+×œ× × ×™×ª×Ÿ להתקין ×ת מדיה־ויקי ×ו להשתמש בה ××œ× ×× ×”×פשרות ×”×–×ת תכובה.",
+ 'config-ze1' => "'''שגי××” סופנית''': ×”×פשרות [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] פעילה!'''
+×”×פשרות ×”×–×ת גורמת לתקלות מזעזעות במדיה־ויקי.
+×œ× × ×™×ª×Ÿ להתקין ×ת מדיה־ויקי ×ו להשתמש בה ××œ× ×× ×”×פשרות ×”×–×ת תכובה.",
+ 'config-safe-mode' => "'''×זהרה:''' ×”×פשרות [http://www.php.net/features.safe-mode safe mode] של PHP פעילה.
+×”×™× ×™×›×•×œ×” ×œ×’×¨×•× ×œ×‘×¢×™×•×ª, במיוחד ×× ××ª× ×ž×©×ª×ž×©×™× ×‘×”×¢×œ×ת ×§×‘×¦×™× ×ו ב־<code>math</code>.",
+ 'config-xml-bad' => 'מודול XML של PHP חסר.
+מדיה־ויקי דורשת פונקציות של המודול ×•×œ× ×ª×¢×‘×•×“ ×¢× ×”×’×“×¨×•×ª ×›×לו.
+×× ×ž×¢×¨×›×ª ההפעלה ×©×œ×”× ×”×™× Mandrake, התקינו ×ת החבילה php-xml.',
+ 'config-pcre' => 'נר××” שחסרה תמיכה במודול PCRE.
+כדי שמדיה־ויקי תעבוד, נדרשת תמיכה ×‘×‘×™×˜×•×™×™× ×¨×’×•×œ×¨×™×™× ×ª×•×מי Perl.',
+ 'config-pcre-no-utf8' => "'''שגי××” סופנית:''': נר××” שמודול PCRE של PHP מקומפל ×œ×œ× ×ª×ž×™×›×” ב־PCRE_UTF8.
+מדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
+ 'config-memory-raised' => 'ערך ×”×פשרות <code>memory_limit</code> של PHP ×”×•× $1, הועלה ל־$2.',
+ 'config-memory-bad' => "'''×זהרה:''' ערך ×”×פשרות <code>memory_limit</code> של PHP ×”×•× $1.
+×–×” כנר××” נמוך מדי.
+ההתקנה עשויה להיכשל!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] מותקן',
+ 'config-apc' => '[http://www.php.net/apc APC] מותקן',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] מותקן',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] מותקן',
+ 'config-no-cache' => "'''×זהרה:''' ×חת מהתוכנות הב×ות ×œ× × ×ž×¦××”: [http://eaccelerator.sourceforge.net eAccelerator]&rlm;, [http://www.php.net/apc APC]&rlm;, [http://trac.lighttpd.net/xcache/ XCache] ×ו [http://www.iis.net/download/WinCacheForPhp WinCache].
+מטמון ×¢×¦×ž×™× ×œ× ×ž×•×¤×¢×œ.",
+ 'config-diff3-bad' => 'GNU diff3 ×œ× × ×ž×¦×.',
+ 'config-imagemagick' => '× ×ž×¦× ImageMagick&rlm;: <code>$1</code>.
+מזעור תמונות יופעל, ×× ×ª×¤×¢×™×œ×• ×ת ×”×פשרות להעלות קבצי×.',
+ 'config-gd' => 'נמצ××” ספריית הגרפיקה GD המובנית.
+מזעור תמונות יופעל, ×× ×ª×¤×¢×™×œ×• ×ת ×”×פשרות להעלות קבצי×.',
+ 'config-no-scaling' => 'ספריית GD ×ו ImageMagick ×œ× × ×ž×¦×ו.
+מזעור תמונות ×œ× ×™×•×¤×¢×œ.',
+ 'config-no-uri' => "'''שגי××”:''' ××™Ö¾×פשר לזהות ×ת הכתובת הנוכחית.
+ההתקנה בוטלה.",
+ 'config-uploads-not-safe' => "'''×זהרה:''' התיקייה ההתחלתית להעלות <code>$1</code> חשופה להרצת סקריפטי×.
+מדיה־ויקי בודקת ×ת כל ×”×§×‘×¦×™× ×”×ž×•Ö¼×¢×œ×™× ×œ×יומי ×בטחה, מומלץ מ×וד למנוע ×ת [http://www.mediawiki.org/wiki/Manual:Security#Upload_security פרצת ×”×בטחה] ×”×–×ת לפני ש××ª× ×ž×¤×¢×™×œ×™× ×ת ההעל×ות.",
+ 'config-brokenlibxml' => 'במערכת ×©×œ×›× ×™×© שילוב של גרס×ות של PHP ושל libxml2 שחשוף לב××’×™× ×•×™×›×•×œ ×œ×’×¨×•× ×œ×¢×™×•×•×ª × ×ª×•× ×™× × ×¡×ª×¨ במדיה־ויקי וביישומי רשת ×חרי×.
+שדרגו ל־PHP 5.2.9 ×ו לגרסה חדשה יותר ול־libxml2 2.7.3 ×ו גרסה חדשה יותר ([http://bugs.php.net/bug.php?id=45996 ב××’ מתויק ב־PHP]).
+ההתקנה בוטלה.',
+ 'config-using531' => '××™Ö¾×פשר להשתמש במדיה־ויקי ×¢× PHP $1 בגלל ב××’ ×‘×¤×¨×ž×˜×¨×™× ×©×œ הפניות (reference parameters) ל־<span dir="ltr"><code>__call()</code></span>.
+שדרגו ל־PHP 5.3.2 ×ו לגרסה גבוהה יותר כדי לתקן ×ת ×–×” ([http://bugs.php.net/bug.php?id=50394 bug filed with PHP]) ×ו שנמכו ל־PHP 5.3.0 כדי לפתור ×ת הבעיה ×”×–×ת.
+ההתקנה בוטלה.',
+ 'config-db-type' => 'סוג מסד הנתוני×:',
+ 'config-db-host' => 'שרת מסד הנתוני×:',
+ 'config-db-host-help' => '×× ×©×¨×ª מסד ×”× ×ª×•× ×™× ×©×œ×›× × ×ž×¦× ×¢×œ שרת מחשב ×חר, הקלידו ×ת ×©× ×”×ž×—×©×‘ ×ו כתובת ×”Ö¾IP ×›×ן.
+
+×× ××ª× ×ž×©×ª×ž×©×™× ×‘×ירוח משותף, ספק ×”×ירוח ×©×œ×›× ×מור לתת ×œ×›× ×ת ×©× ×”×©×¨×ª הנכון במסמכי×.
+
+×× ××ª× ×ž×ª×§×™× ×™× ×‘×©×¨×ª חלונות ×•×ž×©×ª×ž×©×™× ×‘Ö¾MySQL, השימוש ב־localhost עשוי ×œ× ×œ×¢×‘×•×“. ×× ×”×•× ×œ× ×¢×•×‘×“, נסו ×ת "127.0.0.1" בתור כתובת ×”Ö¾IP המקומית.',
+ 'config-db-host-oracle' => 'TNS של מסד הנתוני×:',
+ 'config-db-host-oracle-help' => 'הקלידו [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ×©× ×—×™×‘×•×¨ מקומי (Local Connect Name)] תקין; הקובץ tnsnames.ora צריך להיות זמין להתקנה ×”×–×ת.<br />
+×× ××ª× ×ž×©×ª×ž×©×™× ×‘Ö¾client libraries 10g ×ו בגרסה חדשה יותר, ××ª× ×™×›×•×œ×™× ×’× ×œ×”×©×ª×ž×© בשיטת מתן השמות [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'זיהוי ויקי זה',
+ 'config-db-name' => '×©× ×ž×¡×“ הנתוני×:',
+ 'config-db-name-help' => 'בחרו ×©× ×©×ž×–×”×” ×ת הוויקי שלכ×.
+×œ× ×¦×¨×™×›×™× ×œ×”×™×•×ª בו רווחי×.
+
+×× ××ª× ×ž×©×ª×ž×©×™× ×‘×ירוח משותף, ספק ×”×ירוח ×©×œ×›× ×™×™×ª×Ÿ ×œ×›× ×©× ×ž×¡×“ × ×ª×•× ×™× ×ž×¡×•×™× ×©×ª×•×›×œ×• להשתמש בו ×ו ×™×פשר ×œ×›× ×œ×™×¦×•×¨ מסד × ×ª×•× ×™× ×“×¨×š לוח בקרה.',
+ 'config-db-name-oracle' => 'סכמה של מסד נתוני×:',
+ 'config-db-account-oracle-warn' => '×§×™×™×ž×™× ×©×œ×•×©×” ×ª×¨×—×™×©×™× × ×ª×ž×›×™× ×¢×‘×•×¨ התקנת ×ורקל בתור מסד הנתוני×:
+
+×× ××ª× ×¨×•×¦×™× ×œ×™×¦×•×¨ חשבון מסד × ×ª×•× ×™× ×›×—×œ×§ מתהליך ההתקנה, × × ×œ×¡×¤×§ חשבון בעל תפקיד SYSDBA בתור חשבון מסד ×”× ×ª×•× ×™× ×¢×‘×•×¨ ההתקנה ולציין ×ת ×”××™×©×•×¨×™× ×”×ž×‘×•×§×©×™× ×¢×‘×•×¨ חשבון הגישה ל×ינטרנט, ×חרת ניתן ליצור ב×ופן ידני ×ת חשבון הגישה ל×ינטרנט, ולספק חשבון ×–×” בלבד (×× ×™×© לו ההרש×ות הדרושות ליצירת עצמי סכמה) ×ו לספק שני חשבונות שוני×, ×חד ×¢× ×”×¨×©×ות יצירה ו×חד מוגבלת עבור גישה ל×ינטרנט.
+
+סקריפט ליצירת חשבון ×¢× ×”×”×¨×©×ות הנדרשות ניתן ×œ×ž×¦×•× ×‘×ª×™×§×™×™×” "<span dir="ltr">maintenance/oracle/</span>" של ההתקנה זו. זכרו ×›×™ שימוש בחשבון מוגבל ×™×’×¨×•× ×œ×”×©×‘×ª×ª כל יכולות תחזוקה ×¢× ×—×©×‘×•×Ÿ בררת המחדל.',
+ 'config-db-install-account' => 'חשבון משתמש להתקנה',
+ 'config-db-username' => '×©× ×”×ž×©×ª×ž×© במסד הנתוני×:',
+ 'config-db-password' => 'הססמה במסד הנתוני×:',
+ 'config-db-password-empty' => '× × ×œ×”×–×™×Ÿ ססמה למשתמש מסד ×”× ×ª×•× ×™× ×”×—×“×©: $1.
+×ף־על־פי ש×פשר ליצור חשבונות ×œ×œ× ×¡×¡×ž×”, ×–×” ×œ× ×ž×ובטח.',
+ 'config-db-install-username' => 'הכניסו ×©× ×ž×©×ª×ž×© שישמש ××ª×›× ×œ×—×™×‘×•×¨ למסד × ×ª×•× ×™× ×‘×ž×”×œ×š ההתקנה.
+זהו ×œ× ×©× ×ž×©×ª×ž×© לחשבון במדיה־ויקי; זהו ×©× ×ž×©×ª×ž×© בשרת מסד נתוני×.',
+ 'config-db-install-password' => 'הקלידו ססמה שתשמש ××ª×›× ×œ×¦×•×¨×š חיבור למסד × ×ª×•× ×™× ×‘×ž×”×œ×š ההתקנה.
+זוהי ×œ× ×¡×¡×ž×” של חשבון במדיה־ויקי; זוהי ססמה לשרת מסד נתוני×.',
+ 'config-db-install-help' => 'הקלידו ×ת ×©× ×”×ž×©×ª×ž×© ו×ת הססמה להתחברות למסד ×”× ×ª×•× ×™× ×‘×ž×”×œ×š ההתקנה.',
+ 'config-db-account-lock' => 'להשתמש ב×ותו ×©× ×”×ž×©×ª×ž×© וב×ותה ססמה בזמן הפעלה רגילה',
+ 'config-db-wiki-account' => 'חשבון משתמש להפעלה רגילה',
+ 'config-db-wiki-help' => 'הקלידו ×ת ×©× ×”×ž×©×ª×ž×© והססמה לחיבור למסד ×”× ×ª×•× ×™× ×‘×ž×”×œ×š פעילות רגילה של הוויקי.
+×× ×”×—×©×‘×•×Ÿ ×ינו ×§×™×™× ×•×œ×—×©×‘×•×Ÿ שבו מתבצעת ההתקנה יש הרש×ות מספיקות, החשבון ×”×–×” ייווצר ×¢× ×”×”×¨×©×ות המזעריות הנחוצות להפעלת הוויקי.',
+ 'config-db-prefix' => 'תחילית לטבל×ות של מסד × ×ª×•× ×™× (database table prefix):',
+ 'config-db-prefix-help' => '×× ××ª× ×¦×¨×™×›×™× ×œ×©×ª×£ מסד × ×ª×•× ×™× ×חד בין ×תרי ויקי ×©×•× ×™× ×ו בין מדיה־ויקי ×•×™×™×©×•× ×•×‘ ×חר, תוכלו לבחור להוסיף תחילית וכל שמות הטבל×ות כדי להימנע מהתנגשויות.
+×ל תשתמשו ברווחי×.
+
+השדה ×”×–×” בדרך כלל ×מור להיות ריק.',
+ 'config-db-charset' => 'קבוצת ×”×ª×•×•×™× (character set) של מסד הנתוני×',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 backwards-compatible UTF-8',
+ 'config-charset-help' => "'''×זהרה:''' ×× ××ª× ×ž×©×ª×ž×©×™× ×‘Ö¾'''backwards-compatible UTF-8''' ב־<span dir=\"ltr\">MySQL 4.1+</span>, ×•×ž×’×‘×™× ×ת מסד ×”× ×ª×•× ×™× ×‘×מצעות <code>mysqldump</code>, ×–×” יכול להרוס ×ת כל תווי ×”Ö¾ASCII ויהרוס ב×ופן בלתי־הפיך ×ת ×”×’×™×‘×•×™×™× ×©×œ×›×!
+
+ב'''מצב בינרי''' (binary mode) מדיה־ויקי שומרת טקסט UTF-8 במסד ×”× ×ª×•× ×™× ×‘×©×“×•×ª בינריי×.
+×–×” יעיל יותר ממצב UTF-8 של MySQL ומ×פשר ×œ×›× ×œ×”×©×ª×ž×© בכל הטווח של תווי יוניקוד.
+ב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת ×”×ª×•×•×™× (character set) של הטקסט ×©×œ×›× ×•×™×¦×™×’ וימיר ×ותו בהת××, ×בל ×œ× ×™×פשר ×œ×›× ×œ×©×ž×•×¨ ×ª×•×•×™× ×©××™× × × ×ž×¦××™× ×‘×˜×•×•×— הרב־לשוני הבסיסי ([http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
+ 'config-mysql-old' => 'נדרשת גרסה $1 של MySQL ×ו גרסה חדשה יותר. הגרסה הנוכחית ×©×œ×›× ×”×™× $2.',
+ 'config-db-port' => 'פִּתְחַת מסד ×”× ×ª×•× ×™× (database port):',
+ 'config-db-schema' => 'סכמה למדיה־ויקי',
+ 'config-db-schema-help' => 'הסְכֵמָה הב××” בדרך כלל מת×ימה.
+שנו ×ותה רק ×× ××ª× ×™×•×“×¢×™× ×©××ª× ×—×™×™×‘×™×.',
+ 'config-sqlite-dir' => 'תיקיית × ×ª×•× ×™× (data directory) של SQLite:',
+ 'config-sqlite-dir-help' => 'SQLite שומר ×ת כל ×”× ×ª×•× ×™× ×‘×§×•×‘×¥ ×חד.
+
+לשרת הווב צריכה להיות הרש××” לכתוב לתיקייה ש××ª× ×ž×’×“×™×¨×™×.
+
+×”×™× ×œ× ×¦×¨×™×›×” נגישה ×œ×›×•×œ× ×“×¨×š ×”×ינטרנט – בגלל ×–×” ×יננו ×©×ž×™× ×ותה ב×ותו ×ž×§×•× ×¢× ×§×•×‘×¦×™ ×”Ö¾PHP.
+
+תוכנת ההתקנה תכתוב קובץ <span dir="ltr"><code>.htaccess</code></span> יחד ×ִתו, ×בל ×× ×–×” ייכשל, מישהו יוכל להשיג גישה למסד ×”× ×ª×•× ×™× ×©×œ×›×. ×©× × ×ž×¦× ×ž×™×“×¢ מפורש של ×ž×©×ª×ž×©×™× (כתובות דו×״ל, ססמ×ות מגובבות) ×•×’× ×’×¨×¡×ות מחוקות של ×“×¤×™× ×•×ž×™×“×¢ מוגבל ×חר.
+
+כד××™ לשקול ×œ×©×™× ×ת מסד ×”× ×ª×•× ×™× ×‘×ž×§×•× ×חר לגמרי, למשל ב־<span dir="ltr"><code>/var/lib/mediawiki/yourwik</code></span>.',
+ 'config-oracle-def-ts' => 'מרחב טבל×ות לפי בררת מחדל (default tablespace):',
+ 'config-oracle-temp-ts' => 'מרחב טבל×ות זמני (temporary tablespace):',
+ 'config-support-info' => 'מדיה־ויקי תומכת במערכות מסדי ×”× ×ª×•× ×™× ×”×‘×ות:
+
+$1
+
+×× ××™× ×›× ×¨×•××™× ×ת מסד ×”× ×ª×•× ×™× ×©×œ×›× ×‘×¨×©×™×ž×”, עקבו ×חר ההור×ות המקושרות לעיל כדי להפעיל ×ת התמיכה.',
+ 'config-support-mysql' => '* $1 ×”×•× ×”×™×¢×“ העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])',
+ 'config-support-postgres' => '$1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× × ×¤×•×¥ בקוד פתוח ×•×”×•× × ×¤×•×¥ בתור חלופה ל־MySQL (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). ייתכן שיש בתצורה ×”×–×ת ב××’×™× ×ž×¡×•×™×ž×™× ×•×”×™× ×œ× ×ž×•×ž×œ×¦×ª לסביבות מבצעיות.',
+ 'config-support-sqlite' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×§×œ×™×œ ×¢× ×ª×ž×™×›×” טובה מ×וד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)',
+ 'config-support-oracle' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×¢×¡×§×™ מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
+ 'config-header-mysql' => 'הגדרות MySQL',
+ 'config-header-postgres' => 'הגדרות PostgreSQL',
+ 'config-header-sqlite' => 'הגדרות SQLite',
+ 'config-header-oracle' => 'הגדרות Oracle',
+ 'config-invalid-db-type' => 'סוג מסד ×”× ×ª×•× ×™× ×©×’×•×™',
+ 'config-missing-db-name' => 'עליך להזין ערך עבור "×©× ×ž×¡×“ הנתוני×"',
+ 'config-missing-db-host' => 'יש להכניס ערך לשדה "שרת מסד הנתוני×"',
+ 'config-missing-db-server-oracle' => 'יש להכניס ערך לשדה "TNS של מסד הנתוני×"',
+ 'config-invalid-db-server-oracle' => '"$1" ×”×•× TNS בלתי תקין.
+יש להשתמש רק ב×ותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9), ×§×•×•×™× ×ª×—×ª×™×™× (_) ונקודות (.).',
+ 'config-invalid-db-name' => '"$1" ×”×•× ×©× ×ž×¡×“ × ×ª×•× ×™× ×‘×œ×ª×™ תקין.
+יש להשתמש רק ב×ותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9), ×§×•×•×™× ×ª×—×ª×™×™× (_) ×•×ž×™× ×•×¡×™× (-).',
+ 'config-invalid-db-prefix' => '"$1" ×”×™× ×ª×—×™×œ×™×ª מסד × ×ª×•× ×™× ×‘×œ×ª×™ תקינה.
+יש להשתמש רק ב×ותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9), ×§×•×•×™× ×ª×—×ª×™×™× (_) ×•×ž×™× ×•×¡×™× (-).',
+ 'config-connection-error' => '$1.
+
+בדקו ×ת ×©× ×”×©×¨×ª, ×ת ×©× ×”×ž×©×ª×ž×© ו×ת הססמה ונסו שוב.',
+ 'config-invalid-schema' => '"$1" ×”×™× ×¡×›×ž×” ×œ× ×ª×§×™× ×” עבור מדיה־ויקי.
+יש להשתמש רק ב×ותיות ASCII&rlm; (a עד z&rlm;, A עד Z), סְפָרוֹת (0 עד 9) ×•×§×•×•×™× ×ª×—×ª×™×™× (_).',
+ 'config-db-sys-create-oracle' => 'תוכנית ההתקנה תומכת רק בשימוש בחשבון SYSDBA ליצירת חשבון חדש.',
+ 'config-db-sys-user-exists-oracle' => 'חשבון המשתמש "$1" כבר קיי×. SYSDBA יכול לשמש רק ליצירת חשבון חדש!',
+ 'config-postgres-old' => 'נדרש PostgreSQL $1 ×ו גרסה חדשה יותר, הגרסה הנוכחית ×©×œ×›× ×”×™× $2.',
+ 'config-sqlite-name-help' => 'בחרו ×‘×©× ×©×ž×–×”×” ×ת הוויקי שלכ×.
+×ל תשתמשו ×‘×¨×•×•×—×™× ×ו במינוסי×.
+×–×” ×™×”×™×” ×©× ×§×•×‘×¥ ×”× ×ª×•× ×™× ×œÖ¾SQLite.',
+ 'config-sqlite-parent-unwritable-group' => '×œ× × ×™×ª×Ÿ ליצור ×ת תיקיית ×”× ×ª×•× ×™× <code><nowiki>$1</nowiki></code>, ×›×™ לשָ×רַת הווב ×ין הרש×ות לכתוב לתיקיית ×”×× <code><nowiki>$2</nowiki></code> .
+
+תוכנת ההתקנה זיהתה ×ת החשבון שתחתיו רץ שרת הווב שלכ×.
+×פשרו לשָ×רַת הווב לכתוב לתיקייה <code><nowiki>$3</nowiki></code>.
+במערכת Unix/Linux כִתבו:
+
+<div dir="ltr"><pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre></div>',
+ 'config-sqlite-parent-unwritable-nogroup' => '×œ× × ×™×ª×Ÿ ליצור ×ת תיקיית ×”× ×ª×•× ×™× <code><nowiki>$1</nowiki></code>, ×›×™ לשָ×רַת הווב ×ין הרש×ות לכתוב לתיקיית ×”×× <code><nowiki>$2</nowiki></code> .
+
+תוכנת ההתקנה ×œ× ×–×™×”×ª×” ×ת החשבון שתחתיו רץ שרת הווב שלכ×.
+×פשרו לכל החשבונות לכתוב לתיקייה <code><nowiki>$3</nowiki></code> כדי להמשיך.
+במערכת Unix/Linux כִתבו:
+
+<div dir="ltr"><pre>cd $2
+mkdir $3
+chmod a+w $3</pre></div>',
+ 'config-sqlite-mkdir-error' => '×ירעה שגי××” בעת יצירת תיקיית ×”× ×ª×•× ×™× "$1".
+× × ×œ×‘×“×•×§ ×ת ×”×ž×™×§×•× ×•×œ× ×¡×•×ª שוב.',
+ 'config-sqlite-dir-unwritable' => '××™Ö¾×פשר לכתוב לתיקייה "$1".
+שנו ×ת ההרש×ות שלה כך ששרת הווב יוכל לכתוב ×ליה ונסו שוב.',
+ 'config-sqlite-connection-error' => '$1.
+
+בִדקו ×ת תיקיית ×”× ×ª×•× ×™× ×ת ×©× ×ž×¡×ª ×”× ×ª×•× ×™× ×œ×”×œ×Ÿ ונסו שוב.',
+ 'config-sqlite-readonly' => '×œ× × ×™×ª×Ÿ לכתוב ×ל הקובץ <code>$1</code>.',
+ 'config-sqlite-cant-create-db' => '×œ× × ×™×ª×Ÿ ליצור ×ת קובץ מסד ×”× ×ª×•× ×™× <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'ב־PHP חסרה תמיכה ב־FTS3, יבתצע שנמוך טבל×ות',
+ 'config-can-upgrade' => "יש טבל×ות מדיה־ויקי במסד הנתוני×.
+כדי לשדרג ×ותן למדיה־ויקי $1, לחצו '''המשך'''.",
+ 'config-upgrade-done' => "השדרוג הושל×.
+
+עכשיו ×פשר [$1 להשתמש בוויקי שלכ×].
+
+×× ×ª×¨×¦×• ליצור מחדש ×ת קובץ ×”Ö¾<code>LocalSettings.php</code> שלכ×, לחצו על הכפתור להלן.
+×–×” '''×œ× ×ž×•×ž×œ×¥''', ××œ× ×× ×›×Ÿ יש ×œ×›× ×‘×¢×™×•×ª ×¢× ×”×•×•×™×§×™ שלכ×.",
+ 'config-upgrade-done-no-regenerate' => 'השדרוג הושל×.
+
+עכשיו ×פשר [$1 להתחיל להשתמש בוויקי שלכ×].',
+ 'config-regenerate' => 'לחולל מחדש ×ת LocalSettings.php â†',
+ 'config-show-table-status' => 'ש×ילתת SHOW TABLE STATUS נכשלה!',
+ 'config-unknown-collation' => "'''×זהרה:''' מסד ×”× ×ª×•× ×™× ×ž×©×ª×ž×© בשיטת מיון ש××™× ×” מוּכּרת.",
+ 'config-db-web-account' => 'חשבון במסד ×”× ×ª×•× ×™× ×œ×’×™×©×” מהרשת',
+ 'config-db-web-help' => 'לבחור ×ת ×©× ×”×ž×©×ª×ž×© ו×ת הססמה ששרת הווב ישתמש בו להתחברות לשרת מסד ×”× ×ª×•× ×™× ×‘×–×ž×Ÿ פעילות רגילה של הוויקי.',
+ 'config-db-web-account-same' => 'להשתמש ב×ותו חשבון כמו עבור ההתקנה',
+ 'config-db-web-create' => 'ליצור חשבון ×× ×”×•× ×ינו ×§×™×™× ×›×‘×¨.',
+ 'config-db-web-no-create-privs' => 'לחשבון ×©×”×§×œ×“×ª× ×œ×”×ª×§× ×” ×ין מספיק הרש×ות ליצירת חשבות.
+החשבון ש××ª× ×ž×§×œ×™×“×™× ×›×ן צריך להיות קיי×.',
+ 'config-mysql-engine' => 'מנגנון ×”×חסון:',
+ 'config-mysql-engine-help' => "'''InnoDB''' ×”×•× ×›×ž×¢×˜ תמיד ×”×פשרות הטובה ביותר, ×›×™ במנוע ×”×–×” יש תמיכה טובה ביותר בעיבוד מקבילי.
+
+'''MyISAM''' עשוי להיות בהתקנות שמיועדות למשתמש ×חד ולהתקנות לקרי××” בלבד.
+מסדי × ×ª×•× ×™× ×¢× MyISAM × ×•×˜×™× ×œ×”×™×”×¨×¡ ×œ×¢×ª×™× ×§×¨×•×‘×•×ª יותר מ×שר מסדי × ×ª×•× ×™× ×¢× InnoDB.",
+ 'config-mysql-charset' => 'ערכת הקידוד של מסד הנתוני×:',
+ 'config-mysql-binary' => 'בינרי',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "ב'''מצב בינרי''' (binary mode) מדיה־ויקי שומרת טקסט UTF-8 במסד ×”× ×ª×•× ×™× ×‘×©×“×•×ª בינריי×.
+×–×” יעיל יותר ממצב UTF-8 של MySQL ומ×פשר ×œ×›× ×œ×”×©×ª×ž×© בכל הטווח של תווי יוניקוד.
+
+ב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת ×”×ª×•×•×™× (character set) של הטקסט ×©×œ×›× ×•×™×¦×™×’ וימיר ×ותו בהת××, ×בל ×œ× ×™×פשר ×œ×›× ×œ×©×ž×•×¨ ×ª×•×•×™× ×©××™× × × ×ž×¦××™× ×‘×˜×•×•×— הרב־לשוני הבסיסי ([http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
+ 'config-site-name' => '×©× ×”×•×•×™×§×™:',
+ 'config-site-name-help' => '×–×” יופיע בשורת הכותרת של הדפדפן ובמקומות ×¨×‘×™× ×חרי×.',
+ 'config-site-name-blank' => '× × ×œ×”×–×™×Ÿ ×©× ×œ×תר.',
+ 'config-project-namespace' => 'מרחב שמות לדפי מיז×:',
+ 'config-ns-generic' => 'מיז×',
+ 'config-ns-site-name' => '×–×”×” ×œ×©× ×”×•×•×™×§×™: $1',
+ 'config-ns-other' => '×חר (לציין)',
+ 'config-ns-other-default' => 'הוויקי־שלי',
+ 'config-project-namespace-help' => "בהת×× ×œ×“×•×’×ž×” של ויקיפדיה, ×תרי ויקי ×¨×‘×™× ×©×•×ž×¨×™× ×¢×œ דפי המדיניות ×©×œ×”× ×‘× ×¤×¨×“ מדפי התוכן ×©×œ×”× ×‘\"'''מרחב השמות של המיז×'''\" (\"'''project namespace'''\").
+כל שמות ×”×“×¤×™× ×‘×ž×¨×—×‘ השמות ×”×–×” × ×¤×ª×—×™× ×‘×ª×—×™×œ×™×ª מסוימת ש××ª× ×™×›×•×œ×™× ×œ×”×’×“×™×¨ ×›×ן.
+ב×ופן מסורתי התחילית ×”×–×ת מבוססת על ×©× ×”×•×•×™×§×™, ×בל ×ינו יכול להכיל תווי פיסוק כגון \"#\" ×ו \":\".",
+ 'config-ns-invalid' => 'מרחב השמות "<nowiki>$1</nowiki>" ×ינו תקין.
+הקלידו ×©× ×חר למרחב השמות של המיז×.',
+ 'config-ns-conflict' => 'מרחב השמות ×©×”×’×“×¨×ª× "<nowiki>$1</nowiki>" מתנגש ×¢× ×ž×¨×—×‘ שמות מובנה של מדיה־ויקי.
+הגדירו מרחב שמות ×ž×™×–× ×©×•× ×”.',
+ 'config-admin-box' => 'חשבון מפעיל',
+ 'config-admin-name' => 'שמכ×:',
+ 'config-admin-password' => 'ססמה:',
+ 'config-admin-password-confirm' => 'הססמה שוב:',
+ 'config-admin-help' => 'הקלידו ×›×ן ×ת ×©× ×”×ž×©×ª×ž×©, למשל "שקד לוי" ×ו "Joe Bloggs".
+×–×” ×”×©× ×©×™×©×ž×© ××ª×›× ×›×“×™ להיכנס לוויקי.',
+ 'config-admin-name-blank' => '× × ×œ×”×–×™×Ÿ ×ת ×©× ×”×ž×©×ª×ž×© של המפעיל.',
+ 'config-admin-name-invalid' => '×©× ×”×ž×©×ª×ž×© שהוקלד "<nowiki>$1</nowiki>" ×ינו תקין.
+הקלידו ×©× ×ž×©×ª×ž×© ×חר.',
+ 'config-admin-password-blank' => 'הקלידו ססמה לחשבון המפעיל.',
+ 'config-admin-password-same' => 'הססמה ×œ× ×™×›×•×œ×” להיות ×–×”×” ×œ×©× ×”×ž×©×ª×ž×©.',
+ 'config-admin-password-mismatch' => 'שתי הססמ×ות שהוזנו ×ינן מת×ימות.',
+ 'config-admin-email' => 'כתובת הדו×״ל:',
+ 'config-admin-email-help' => 'הקלידו כתובת דו×״ל שת×פשר ×œ×›× ×œ×§×‘×œ ×ž×›×ª×‘×™× ×ž×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×•×•×™×§×™, ל×תחל ×ת הססמה, ולקבל הודעות על ×©×™× ×•×™×™× ×‘×“×¤×™× ×‘×¨×©×™×ž×ª המעקב שלכ×. ×פשר להש×יר ×ת השדה ×”×–×” ריק.',
+ 'config-admin-error-user' => 'שגי××” פנימית ביצירת מפעיל ×‘×©× "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'שגי××” פנימית בהגדרת ססמה עבור המפעיל "<nowiki>$1</nowiki>"&rlm;: <pre>$2</pre>',
+ 'config-admin-error-bademail' => '×”×›× ×¡×ª× ×›×ª×•×‘×ª דו×״ל ×œ× ×ª×§×™× ×”.',
+ 'config-subscribe' => '×œ×”×™×¨×©× ×œ[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה ×¢× ×”×•×“×¢×•×ª על גרס×ות חדשות].',
+ 'config-subscribe-help' => 'זוהי רשימת תפוצה ×¢× ×”×•×“×¢×•×ª מעטות שמשמשת להודעות על הוצ×ת גרס×ות, כולל עדכוני ×בטחה חשובי×.
+מומלץ ×œ×”×™×¨×©× ×ליה ולעדכן ×ת מדיה־ויקי ×›×שר יוצ×ות גרס×ות חדשות.',
+ 'config-almost-done' => 'כמעט סיימת×!
+×פשר לדלג על ש×ר ההגדרות ולהתקין ×ת הוויקי כבר עכשיו.',
+ 'config-optional-continue' => 'הצגת ש×לות נוספות.',
+ 'config-optional-skip' => '×ž×©×¢×ž× ×œ×™, תתקינו לי כבר ×ת הוויקי ×”×–×”.',
+ 'config-profile' => 'תסריט הרש×ות משתמשי×:',
+ 'config-profile-wiki' => 'ויקי מסורתי',
+ 'config-profile-no-anon' => 'נדרשת יצירת חשבון',
+ 'config-profile-fishbowl' => '×¢×•×¨×›×™× ×ž×•×¨×©×™× ×‘×œ×‘×“',
+ 'config-profile-private' => 'ויקי פרטי',
+ 'config-profile-help' => "×תרי ויקי ×¢×•×‘×“×™× ×”×›×™ טוב ×›×שר ××ª× ×ž××¤×©×¨×™× ×œ×›×ž×” שיותר ×× ×©×™× ×œ×¢×¨×•×š ×ות×.
+במדיה־ויקי קל לסקור ×ת ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×•×œ×©×—×–×¨ כל נזק ×©×¢×•×©×™× ×ž×©×ª×ž×©×™× ×ª×ž×™×ž×™× ×ו משחיתי×.
+
+×¢× ×–×ת, ×× ×©×™× ×©×•× ×™× ×ž×¦×ו למדיה־ויקי ×©×™×ž×•×©×™× ×ž×’×•Ö¼×•× ×™× ×•×œ×¢×ª×™× ×œ× ×§×œ לשכנע ×ת ×›×•×œ× ×‘×™×ª×¨×•× ×•×ª של \"דרך הוויקי\" המסורתית. ולכן יש ×œ×›× ×‘×¨×¨×”.
+
+ב×תר '''{{int:config-profile-wiki}}''' – ×œ×›×•×œ× ×™×© הרש××” לערוך, ×פילו בלי להיכנס לחשבון.
+ב×תר וויקי מסוג '''{{int:config-profile-no-anon}}''' יש ביטחון גדול יותר, ×בל הגדרה ×›×–×ת יכולה להרתיע ×ª×•×¨×ž×™× ×ž×–×“×ž× ×™×.
+
+בתסריט '''{{int:config-profile-fishbowl}}''' רק ×ž×©×ª×ž×©×™× ×©×§×™×‘×œ×• ×ישור ×™×›×•×œ×™× ×œ×¢×¨×•×š, ×בל כל ×”×’×•×œ×©×™× ×™×›×•×œ×™× ×œ×§×¨×•× ×ת ×”×“×¤×™× ×•×ת גרס××•×ª×™×”× ×”×§×•×“×ž×•×ª.
+ב'''{{int:config-profile-private}}''' רק ×ž×©×ª×ž×©×™× ×©×§×™×‘×œ×• ×ישור ×™×›×•×œ×™× ×œ×§×¨×•× ×•×œ×¢×¨×•×š דפי×.
+
+הגדרות מורכבות של הרש×ות ×פשריות ×חרי ההתקנה, ר׳ ×ת [http://www.mediawiki.org/wiki/Manual:User_rights הפרק על ×”× ×•×©× ×”×–×” בספר ההדרכה].",
+ 'config-license' => 'זכויות ×™×•×¦×¨×™× ×•×¨×™×©×™×•×Ÿ:',
+ 'config-license-none' => '×œ×œ× ×›×•×ª×¨×ª תחתית ×¢× ×¨×™×©×™×•×Ÿ',
+ 'config-license-cc-by-sa' => 'קרי×ייטיב קומונז–ייחוס–שיתוף ×–×”×”',
+ 'config-license-cc-by-nc-sa' => 'קרי×ייטיב קומונז ×™×™×—×•×¡â€“×œ×œ× ×©×™×ž×•×© מסחרי–שיתוף ×–×”×”',
+ 'config-license-cc-0' => 'Creative Commons ×פס',
+ 'config-license-gfdl-old' => 'רישיון חופשי ×œ×ž×¡×ž×›×™× ×©×œ גנו, גרסה 1.2',
+ 'config-license-gfdl-current' => 'רישיון חופשי ×œ×ž×¡×ž×›×™× ×©×œ גנו, גרסה 1.3 ×ו גרסה מ×וחרת יותר',
+ 'config-license-pd' => 'נחלת הכלל',
+ 'config-license-cc-choose' => 'בחרו רישיון קרי×ייטיב קומונז מות×× ×ישית',
+ 'config-license-help' => "×תרי ויקי ×¦×™×‘×•×¨×™×™× ×¨×‘×™× ×ž×¤×¨×¡×ž×™× ×ת כל התרומות תחת [http://freedomdefined.org/Definition רישיון חופשי].
+×–×” עוזר ליצור תחושה של בעלות קהילתית ומעודד תרומה ל×ורך זמן.
+×–×” בדרך כלל ×œ× × ×—×•×¥ ל×תר ויקי פרטי ×ו בחברה מסחרית.
+
+×× ××ª× ×¨×•×¦×™× ×פשרות להשתמש בטקסט מוויקיפדיה ו××ª× ×¨×•×¦×™× ×©×•×•×™×§×™×¤×“×™×” תוכל לקבל ×¢×•×ª×§×™× ×©×œ ×˜×§×¡×˜×™× ×ž×”×•×•×™×§×™ שלכ×, כד××™ ×œ×›× ×œ×‘×—×•×¨ ב'''רישיון קרי×ייטיב קומונז ייחוס–שיתוף ×–×”×”''' (CC-BY-SA).
+
+הרישיון החופשי ×œ×ž×¡×ž×›×™× ×©×œ גנו ×”×•× ×”×¨×™×©×™×•×Ÿ שבו ויקיפדיה השתמשה בעבר (GNU FDL ×ו GFDL).
+×”×•× ×¢×“×™×™×Ÿ תקין, ×בל יש בו תכונות מסוימות שמקשות על שימוש חוזר ועל פרשנות.",
+ 'config-email-settings' => 'הגדרות דו×״ל',
+ 'config-enable-email' => 'להפעיל דו×״ל יוצ×',
+ 'config-enable-email-help' => '×× ××ª× ×¨×•×¦×™× ×©×“×•×״ל יעבוד, [http://www.php.net/manual/en/mail.configuration.php ×פשרויות הדו×״ל של PHP] צריכות להיות מוגדרות נכון.
+×× ××™× ×›× ×¨×•×¦×™× ×œ×”×¤×¢×™×œ ×©×•× ×פשרויות דו×״ל, כבו ×ותן ×›×ן ועכשיו.',
+ 'config-email-user' => 'ל×פשר שליחת דו×״ל ממשתמש למשתמש',
+ 'config-email-user-help' => 'ל×פשר לכל ×”×ž×©×ª×ž×©×™× ×œ×©×œ×•×— ×חד לשני דו×״ל ×× ×”× ×”×¤×¢×™×œ×• ×ת ×–×” בהעדפות שלה×.',
+ 'config-email-usertalk' => 'ל×פשר הודעות על דף שיחת משתמש',
+ 'config-email-usertalk-help' => 'ל×פשר ×œ×ž×©×ª×ž×©×™× ×œ×§×‘×œ הודעות על ×©×™× ×•×™×™× ×‘×“×¤×™ המשתמש שלה×, ×× ×”× ×”×¤×¢×™×œ×• ×ת ×–×” בהעדפות שלה×.',
+ 'config-email-watchlist' => 'הפעלת התרעה על רשימת המעקב',
+ 'config-email-watchlist-help' => 'ל×פשר ×œ×ž×©×ª×ž×©×™× ×œ×§×‘×œ הודעות על ×”×“×¤×™× ×‘×¨×©×™×ž×ª המעקב ×©×œ×”× ×× ×”× ×”×¤×¢×™×œ×• ×ת ×–×” בהעדפות שלה×.',
+ 'config-email-auth' => 'הפעלת התרעה בדו×״ל',
+ 'config-email-auth-help' => "×× ×”×פשרות ×”×–×ת מופעלת, ×ž×©×ª×ž×©×™× ×™×¦×˜×¨×›×• ל×שר ×ת כתובת הדו×״ל ×©×œ×”× ×‘×מצעות קישור שיישלח ××œ×™×”× ×‘×›×œ ×¤×¢× ×©×”× ×™×’×“×™×¨×• ×ו ישנו ×ותה.
+רק כתובות דו×״ל מ×ושרות יכולות לקבלת דו×״ל ×ž×ž×©×ª×ž×©×™× ××—×¨×™× ×ו ×ž×›×ª×‘×™× ×¢× ×”×•×“×¢×•×ª על שינויי×.
+'''מומלץ''' להגדיר ×ת ×”×פשרות ×”×–×ת ל×תרי ויקי ×¦×™×‘×•×¨×™×™× ×›×™ ×פשר לעשות שימוש לרעה בתכונות הדו×״ל.",
+ 'config-email-sender' => 'כתובת דו×״ל לתשובות:',
+ 'config-email-sender-help' => 'הכניסו ×ת כתובת הדו×״ל שתשמש ככתובת לתשובה לכל הדו×ר היוצ×.
+×œ×©× ×™×™×©×œ×—×• תגובות שגי××” (bounce).
+שרתי דו×״ל ×¨×‘×™× ×“×•×¨×©×™× ×©×œ×¤×—×•×ª החלק של ×”×ž×ª×—× ×™×”×™×” תקין.',
+ 'config-upload-settings' => 'העל×ת ×§×‘×¦×™× ×•×ª×ž×•× ×•×ª',
+ 'config-upload-enable' => '×פשור העל×ת קבצי×',
+ 'config-upload-help' => 'העל×ות ×§×‘×¦×™× ×—×•×©×¤×•×ª ×ת השרת ×©×œ×›× ×œ×¡×™×›×•× ×™ ×בטחה.
+למידע נוסף, קִר×ו ×ת [http://www.mediawiki.org/wiki/Manual:Security חלק ×”×בטחה] בספר ההדרכה.
+
+כדי להפעיל העל×ת ×§×‘×¦×™× ×©× ×• ×ת ההרש×ות של התיקייה <code>images</code> תחת תיקיית השורש של מדיה־ויקי כך ששרת הווב יוכל לכתוב ×ליה.
+×–×” מפעיל ×ת ×”×פשרות ×”×–×ת.',
+ 'config-upload-deleted' => 'תיקיית ×”×§×‘×¦×™× ×©× ×ž×—×§×•:',
+ 'config-upload-deleted-help' => 'בחרו ×ת התיקייה ל×רכוב ×§×‘×¦×™× ×ž×—×•×§×™×.
+כד××™ שזה ×œ× ×™×”×™×” נגיש לכל ×”×¢×•×œ× ×“×¨×š הרשת.',
+ 'config-logo' => 'כתובת הסמל:',
+ 'config-logo-help' => 'המר××” ההתחלתי של מדיה־ויקי מכיל ×ž×§×•× ×œ×¡×ž×œ של 135 על 160 ×¤×™×§×¡×œ×™× ×‘×¤×™× ×” השמ×לית העליונה (ימנית עבור שפות שנכתבות מימין לשמ×ל).
+יש להעלות תמונה בגודל מת××™× ×•×œ×”×›× ×™×¡ ×ת הכתובת ×›×ן.
+
+×× ××™× ×›× ×¨×•×¦×™× ×¡×ž×œ, הש×ירו ×ת התיבה ×”×–×ת ריקה.',
+ 'config-instantcommons' => 'להפעיל ×ת Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] ×”×™× ×ª×›×•× ×” שמ×פשרת ל×תרי ויקי להשתמש בתמונות, ×‘×¦×œ×™×œ×™× ×•×‘×ž×“×™×” ×חרת שנמצ×ת ב×תר [http://commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).
+כדי לעשות ×ת ×–×”, מדיה־ויקי צריך לגשת ל×ינטרנט.
+
+למידע נוסף על התכונה ×”×–×ת, כולל הור×ות ×יך להפעיל ×ת ×–×” ל×תרי ויקי ש××™× × ×•×™×§×™×©×™×ª×•×£, ר׳ [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos ×ת ספר ההדרכה].',
+ 'config-cc-error' => 'בורר רישיונות קרי×ייטיב קומונז ×œ× ×”×—×–×™×¨ ×©×•× ×ª×•×¦××”.
+הקלידו ×ת ×©× ×”×¨×™×©×™×•×Ÿ ידנית.',
+ 'config-cc-again' => '× × ×œ×‘×—×•×¨ שוב...',
+ 'config-cc-not-chosen' => 'בחרו ב××™×–×” רישיון קרי×ייטיב קומונז להשתמש ולחצו "המשך".',
+ 'config-advanced-settings' => 'הגדרות מתקדמות',
+ 'config-cache-options' => 'הגדרות למטמון ×¢×¦×ž×™× (object caching):',
+ 'config-cache-help' => 'מטמון ×¢×¦×ž×™× ×ž×©×ž×© לשיפור המהירות של מדיה־ויקי על־ידי שמירה של × ×ª×•× ×™× ×©×”×©×™×ž×•×© ×‘×”× × ×¤×•×¥ במטמון.
+ל××ª×¨×™× ×‘×™× ×•× ×™×™× ×•×’×“×•×œ×™× ×›×“××™ מ×וד להפעיל ×ת ×–×”, ×•×’× ××ª×¨×™× ×§×˜× ×™× ×™×™×”× ×• מזה.',
+ 'config-cache-none' => '×œ×œ× ×ž×˜×ž×•×Ÿ (×©×•× ×™×›×•×œ×ª ××™× ×” מוסרת, ×בל ×”×‘×™×¦×•×¢×™× ×‘××ª×¨×™× ×’×“×•×œ×™× ×™×™×¤×’×¢×•)',
+ 'config-cache-accel' => 'מטמון ×¢×¦×ž×™× (object caching) של PHP&rlm; (APC&rlm;, eAccelerator&rlm;, XCache ×ו WinCache)',
+ 'config-cache-memcached' => 'להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)',
+ 'config-memcached-servers' => 'שרתי Memcached:',
+ 'config-memcached-help' => 'רשימת כתובות IP ש־Memcached ישתמש בהן.
+יש ×œ×¨×©×•× ×›×ª×•×‘×ª ×חת בכל שורה ולציין ×ת הפִּתְחָה (port), למשל:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'בחרת ב־Memcached בתתור סוג המטמון שלכ×, ×בל ×œ× ×”×’×“×¨×ª× ×©×•× ×©×¨×ª.',
+ 'config-memcache-badip' => '×”×§×œ×“×ª× ×›×ª×•×‘×ª IP בלתי תקינה ל־Memcached&lrm;: $1.',
+ 'config-memcache-noport' => '×œ× ×”×’×“×¨×ª× ×¤×ª×—×” לשימוש שרת Memcached&rlm;: $1.
+×× ××™× ×›× ×™×•×“×¢×™× ×ת מספר הפתחה, בררת המחדל ×”×™× 11211.',
+ 'config-memcache-badport' => 'מספרי פתחה של Memcached ×¦×¨×™×›×™× ×œ×”×™×•×ª בין $1 ל־$2',
+ 'config-extensions' => 'הרחבות',
+ 'config-extensions-help' => 'ההרחבות ברשימה לעיל התגלו בתיקיית <span dir="ltr"><code>./extensions</code></span> שלכ×.
+
+ייתכן שזה ידרוש הגדרות נוספות, ×בל תוכלו להפעיל ×ותן עכשיו.',
+ 'config-install-alreadydone' => "'''×זהרה:''' נר××” שכבר ×”×ª×§× ×ª× ×ת מדיה־ויקי ו××ª× ×ž× ×¡×™× ×œ×”×ª×§×™×Ÿ ×ותה שוב.
+×× ×” התקדמו לדף הב×.",
+ 'config-install-begin' => 'כשתלחצו על "{{int:config-continue}}", תתחילו ×ת ההתקנה של מדיה־ויקי.
+×× ××ª× ×¢×“×™×™×Ÿ ×¨×•×¦×™× ×œ×©× ×•×ª משהו, לחצו על "הקוד×".',
+ 'config-install-step-done' => 'בוצע',
+ 'config-install-step-failed' => 'נכשל',
+ 'config-install-extensions' => 'כולל הרחבות',
+ 'config-install-database' => 'הקמת מסד נתוני×',
+ 'config-install-pg-schema-not-exist' => 'סכמה של PostgreSQL ××™× ×” קיימת',
+ 'config-install-pg-schema-failed' => 'יצירת טבל×ות נכשלה.
+וד×ו ×›×™ המשתמש "$1" יכול לכתוב לסכמה "$2".',
+ 'config-install-pg-commit' => 'שמירת שינויי×',
+ 'config-install-pg-plpgsql' => 'בדיקת שפת PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'צריך להתקין ×ת שפת PL/pgSQL במסד ×”× ×ª×•× ×™× $1',
+ 'config-pg-no-create-privs' => 'לחשבון ×©×”×’×“×¨×ª× ×œ×”×ª×§× ×” ×ין מספיק הרש×ות ליצירת חשבון.',
+ 'config-install-user' => 'יצירת חשבון במסד נתוני×',
+ 'config-install-user-alreadyexists' => 'המשתמש "$1" כבר קיי×',
+ 'config-install-user-create-failed' => 'יצירת משתמש "$1" נכשלה: $2',
+ 'config-install-user-grant-failed' => 'מתן הרש×ות למשתמש "$1" נכשל: $2',
+ 'config-install-tables' => 'יצירת טבל×ות',
+ 'config-install-tables-exist' => "'''×זהרה:''' נר××” שטבל×ות מדיה־ויקי כבר קיימות.
+מדלג על יצירתן.",
+ 'config-install-tables-failed' => "'''שגי××”:''' יצירת הטבלה נכשלה ×¢× ×”×©×’×™××” הב××”: $1",
+ 'config-install-interwiki' => '×כלוס טבלת בינוויקי התחלתית',
+ 'config-install-interwiki-list' => 'קרי×ת הקובץ <code>interwiki.list</code> ×œ× ×”×¦×œ×™×—×”.',
+ 'config-install-interwiki-exists' => "'''×זהרה:''': נר××” שבטבלת הבינוויקי כבר יש רשומות.
+מדלג על הרשומה ההתחלתית.",
+ 'config-install-stats' => '×תחול סטטיסטיקות',
+ 'config-install-keys' => 'יצירת מפתחות סודיי×',
+ 'config-install-sysop' => 'יצירת חשבון מפעיל',
+ 'config-install-subscribe-fail' => '×”×¨×™×©×•× ×œÖ¾mediawiki-announce ×œ× ×”×¦×œ×™×—',
+ 'config-install-mainpage' => 'יצירת דף ר×שי ×¢× ×ª×•×›×Ÿ לפי בררת מחדל.',
+ 'config-install-extension-tables' => 'יצירת טבל×ות להרחבות מופעלות',
+ 'config-install-mainpage-failed' => '×œ× ×”×¦×œ×™×—×” הכנסת דף ר×שי: $1.',
+ 'config-install-done' => "'''מזל טוב!'''
+×”×ª×§× ×ª× ×‘×”×¦×œ×—×” ×ת מדיה־ויקי.
+
+תוכנת ההתקנה יצרה ×ת הקובץ <code>LocalSettings.php</code>.
+×”×•× ×ž×›×™×œ ×ת כל ההגדרות שלכ×.
+
+תצטרכו להוריד ×ותו ×•×œ×©×™× ×ותו בבסיס ההתקנה של הוויקי ×©×œ×›× (×ות התיקייה שבה × ×ž×¦× ×”×§×•×‘×¥ index.php). ההורדה הייתה ×מורה להתחיל ב×ופן ×וטומטי.
+
+×× ×”×”×•×¨×“×” ×œ× ×”×ª×—×™×œ×”, ×× ×× ×‘×™×˜×œ×ª× ×ותה, ×פשר להתחיל ×ותה מחדש בלחיצה על הקישור הב×:
+
+$3
+
+'''שימו לב''': ×× ×œ× ×ª×¢×©×• ×–×ת עכשיו, קובץ ההגדרות המחולל ×œ× ×™×”×™×” זמין ×œ×›× ×©×•×‘.
+
+×חרי שתעשו ×ת ×–×”, תוכלו '''[$2 להיכנס לוויקי שלכ×]'''.",
+ 'config-download-localsettings' => 'הורדת LocalSettings.php',
+ 'config-help' => 'עזרה',
+);
+
+/** Upper Sorbian (Hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'config-desc' => 'Instalaciski program za MediaWiki',
+ 'config-title' => 'Instalacija MediaWiki $1',
+ 'config-information' => 'Informacije',
+ 'config-localsettings-upgrade' => 'Dataja <code>LocalSettings.php</code> je so wotkryła.
+Zo by tutu instalaciju aktualizował, zapodaj prošu hódnotu za parameter <code>$wgUpgradeKey</code> do slědowaceho pola.
+Namakaš tón parameter w dataji LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Dataja LocalSettings.php bu wotkryta.
+Zo by tutu instalaciju aktualizował, wuwjedźće update.php',
+ 'config-localsettings-key' => 'Aktualizaciski kluÄ:',
+ 'config-localsettings-badkey' => 'KluÄ, kotryž sy podaÅ‚, je wopak',
+ 'config-upgrade-key-missing' => 'Eksistowaca instalacija MediaWiki je so wotkryła.
+Zo by tutu instalaciju aktualizował, staj prošu slědowacu linku deleka w dataji LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'Zda so, zo eksistwoaca dataja LocalSettings.php je njedospołna.
+Wariabla $1 njeje nastajena.
+Prošu změń dataju LocalSettings.php, zo by so tuta wariabla nastajiła a klikń na "Dale".',
+ 'config-localsettings-connection-error' => 'Při zwjazowanju z datowej banku z pomocu nastajenjow podatych w LocalSettings.php abo AdminSettings.php je zmylk wustupił. Prošu skoriguj tute nastajenja a spytaj hišće raz.
+
+$1',
+ 'config-session-error' => 'Zmylk při startowanju posedźenja: $1',
+ 'config-session-expired' => 'Zda so, zo twoje posedźenske daty su spadnjene.
+Posedźenja su za Äas žiwjenja $1 skonfigurowane.
+Móžeš jón přez nastajenje <code>session.gc_maxlifetime</code> w php.ini powyšić.
+Startuj instalaciski proces znowa.',
+ 'config-no-session' => 'Twoje posedźenske daty su so zhubili!
+Skontroluj swój php.ini a zawěsć, zo <code>session.save_path</code> je na prawy zapis nastajeny.',
+ 'config-your-language' => 'Twoja rÄ›Ä:',
+ 'config-your-language-help' => 'Wubjer rÄ›Ä, kotraž ma so za instalaciski proces wužiwać.',
+ 'config-wiki-language' => 'WikirÄ›Ä:',
+ 'config-wiki-language-help' => 'Wubjer rÄ›Ä, w kotrejž wiki ma so zwjetÅ¡a pisać.',
+ 'config-back' => '↠Wróćo',
+ 'config-continue' => 'Dale →',
+ 'config-page-language' => 'RÄ›Ä',
+ 'config-page-welcome' => 'Witaj do MediaWiki!',
+ 'config-page-dbconnect' => 'Z datowej banku zwjazać',
+ 'config-page-upgrade' => 'Eksistowacu instalaciju aktualizować',
+ 'config-page-dbsettings' => 'Nastajenja datoweje banki',
+ 'config-page-name' => 'Mjeno',
+ 'config-page-options' => 'Opcije',
+ 'config-page-install' => 'Instalować',
+ 'config-page-complete' => 'DokónÄeny!',
+ 'config-page-restart' => 'Instalaciju znowa startować',
+ 'config-page-readme' => 'ÄŒitaj mje',
+ 'config-page-releasenotes' => 'Wersijowe informacije',
+ 'config-page-copying' => 'Kopěrowanje',
+ 'config-page-upgradedoc' => 'Aktualizowanje',
+ 'config-page-existingwiki' => 'Eksistowacy wiki',
+ 'config-help-restart' => 'Chceš wšě składowane daty hašeć, kotrež sy zapodał a instalaciski proces znowa startować?',
+ 'config-restart' => 'Haj, znowa startować',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki Startowa strona MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Nawod za wužiwarjow]
+* [http://www.mediawiki.org/wiki/Manual:Contents Nawod za administratorow]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Huste prašenja]
+----
+* <doclink href=Readme>ÄŒitaj mje</doclink>
+* <doclink href=ReleaseNotes>Wersijowe informacije</doclink>
+* <doclink href=Copying>Licencne postajenja</doclink>
+* <doclink href=UpgradeDoc>Aktualizacija</doclink>',
+ 'config-env-good' => 'Wokolina je so skontrolowała.
+Móžeš MediaWiki instalować.',
+ 'config-env-bad' => 'Wokolina je so skontrolowała.
+Njemóžeš MediaWiki instalować.',
+ 'config-env-php' => 'PHP $1 je instalowany.',
+ 'config-env-php-toolow' => 'PHP $1 je instalowany.
+Ale MediaWiki wužaduje sej PHP $2 abo wyši.',
+ 'config-unicode-using-utf8' => 'Za normalizaciju Unicode so utf8_normalize.so Briona Vibbera wužiwa.',
+ 'config-unicode-using-intl' => 'Za normalizaciju Unicode so [http://pecl.php.net/intl PECL-rozšěrjenje intl] wužiwa.',
+ 'config-no-db' => 'Njeda so přihódny ćěrjak datoweje banki namakać!',
+ 'config-no-fts3' => "'''Warnowanje''': SQLite je so bjez [http://sqlite.org/fts3.html FTS3-modula] kompilował, pytanske funkcije njebudu k dispoziciji stać.",
+ 'config-register-globals' => "'''Warnowanje: Funkcija <code>[http://php.net/register_globals register_globals]</code> PHP je zmóžnjena.'''
+'''Znjemóžń ju, jeli móžeš.'''
+MediaWiki budźe fungować, ale twój serwer je potencielnym wěstotnym njedostatkam wustajeny.",
+ 'config-ze1' => "'''Chutny zmylk: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] je aktiwny!'''
+Tuta opcija zawinuje grawěrowace zmylki při MediaWiki.
+Njemóžeš MediaWiki instalować abo wužiwać, chibazo tuta opcija je znjemóžnjena.",
+ 'config-safe-mode' => "'''Warnowanje:''' [http://www.php.net/features.safe-mode wěsty modus] PHP je aktiwny.
+To móže problemy zawinować, předewšěm, jeli so datajowe nahraća a podpěra <code>math</code> wužiwaja.",
+ 'config-xml-bad' => 'XML-modul za PHP faluje.
+MediaWiki trjeba funkcije w tutym modulu a njebudźe w tutej konfiguraciji fungować.
+Jeli wužiwaš Mandrake, instaluj paket php-xml.',
+ 'config-memory-raised' => 'PHP-parameter <code>memory_limit</code> je $1, je so na hódnotu $2 zwyšił.',
+ 'config-memory-bad' => "'''Warnowanje:''' PHP-parameter <code>memory_limit</code> ma hódnotu $1,
+To je najskerje přeniske.
+Instalacija móhła so njeporadźić!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] je instalowany',
+ 'config-apc' => '[http://www.php.net/apc APC] je instalowany',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] je instalowany',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] je instalowany',
+ 'config-diff3-bad' => 'GNU diff3 njenamakany.',
+ 'config-no-uri' => "'''Zmylk:''' Aktualny URI njeda so postajić.
+Instalacija bu přetorhnjena.",
+ 'config-db-type' => 'Typ datoweje banki:',
+ 'config-db-host' => 'Serwer datoweje banki:',
+ 'config-db-host-oracle' => 'Datowa banka TNS:',
+ 'config-db-wiki-settings' => 'Tutón wiki identifikować',
+ 'config-db-name' => 'Mjeno datoweje banki:',
+ 'config-db-name-oracle' => 'Å ema datoweje banki:',
+ 'config-db-install-account' => 'Wužiwarske konto za instalaciju',
+ 'config-db-username' => 'Wužiwarske mjeno datoweje banki:',
+ 'config-db-password' => 'Hesło datoweje banki:',
+ 'config-db-password-empty' => 'Prošu zapodaj hesło za noweho wužiwarja datoweje banki: $1.
+Byrnjež było móžno wužiwarjow bjez hesłow wutworić, njeje to wěste.',
+ 'config-db-install-username' => 'Zapodaj wužiwarske mjeno, kotrež budźe so za zwisk z datowej banku za instalaciski proces wužiwać.
+To njeje wužiwarske mjeno konta MediaWiki; to je wužiwarske mjeno za twoju datowu banku.',
+ 'config-db-install-password' => 'Zapodaj hesło, kotrež budźe so za zwisk z datowej banku za instalaciski proces wužiwać.
+To njeje hesło konta MediaWiki; to je hesło za twoju datowu banku.',
+ 'config-db-install-help' => 'Zapodaj wužiwarske mjeno a hesło, kotrejž měłoj so za zwisk z datowej banku za instalaciski proces wužiwać.',
+ 'config-db-account-lock' => 'Samsne wužiwarske mjeno a hesło za normalnu operaciju wužiwać',
+ 'config-db-wiki-account' => 'Wužiwarske konto za normalnu operaciju',
+ 'config-db-prefix' => 'Tabelowy prefiks datoweje banki:',
+ 'config-db-charset' => 'Znamješkowa sadźba datoweje banki',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binarny',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 wróćokompatibelny UTF-8',
+ 'config-mysql-old' => 'MySQL $1 abo nowši trěbny, maš $2.',
+ 'config-db-port' => 'Port datoweje banki:',
+ 'config-db-schema' => 'Å ema za MediaWiki',
+ 'config-db-schema-help' => 'Tuta šema da so zwjetša derje wužiwać.
+Změń ju jenož, jeli su pÅ™eswÄ›dÄiwe pÅ™iÄiny za to.',
+ 'config-sqlite-dir' => 'Zapis SQLite-datow:',
+ 'config-oracle-def-ts' => 'Standardny tabelowy rum:',
+ 'config-oracle-temp-ts' => 'Nachwilny tabelowy rum:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju PHP z MySQL-podpěru])',
+ 'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpěru PostgreSQL])',
+ 'config-header-mysql' => 'Nastajenja MySQL',
+ 'config-header-postgres' => 'Nastajenja PostgreSQL',
+ 'config-header-sqlite' => 'Nastajenja SQLite',
+ 'config-header-oracle' => 'Nastajenja Oracle',
+ 'config-invalid-db-type' => 'Njepłaćiwy typ datoweje banki',
+ 'config-missing-db-name' => 'Dyrbiš hódnotu za "Mjeno datoweje banki" zapodać',
+ 'config-missing-db-host' => 'Dyrbiš hódnotu za "Database host" zapodać',
+ 'config-missing-db-server-oracle' => 'Dyrbiš hódnotu za "Database TNS" zapodać',
+ 'config-invalid-db-server-oracle' => 'Njepłaćiwa datowa banka TNS "$1".
+Wužij jenož pismiki ASCII (a-z, A-Z), liÄby (0-9), podsmužki (_) a dypki (.).',
+ 'config-invalid-db-name' => 'Njepłaćiwe mjeno "$1" datoweje banki.
+Wužij jenož pismiki ASCII (a-z, A-Z), liÄby (0-9),a podsmužki (_) a wjazawki (-).',
+ 'config-invalid-db-prefix' => 'Njepłaćiwy prefiks "$1" datoweje banki.
+Wužij jenož pismiki ASCII (a-z, A-Z), liÄby (0-9), podsmužki (_) a wjazawki (-).',
+ 'config-connection-error' => '$1.
+
+Skontroluj serwer, wužiwarske a hesło a spytaj hišće raz.',
+ 'config-invalid-schema' => 'Njepłaćiwe šema za MediaWiki "$1".
+Wužij jenož pismiki ASCII (a-z, A-Z), liÄby (0-9) a podsmužki (_).',
+ 'config-db-sys-create-oracle' => 'Instalaciski program podpěruje jenož wužiwanje SYSDBA-konta za zakoženje noweho konta.',
+ 'config-db-sys-user-exists-oracle' => 'Wužiwarske konto "$1" hižo eksistuje. SYSDBA hodźi so jenož za załoženje noweho konta wužiwać!',
+ 'config-postgres-old' => 'PostgreSQL $1 abo nowši trěbny, maš $2.',
+ 'config-sqlite-name-help' => 'Wubjer mjeno, kotrež twój wiki identifikuje.
+Njewužij mjezery abo wjazawki.
+To budźe so za mjeno dataje SQLite-datow wužiwać.',
+ 'config-sqlite-mkdir-error' => 'Zmylk při wutworjenju datoweho zapisa "$1".
+Skontroluj městno a spytaj hišće raz.',
+ 'config-sqlite-dir-unwritable' => 'Njeje móžno do zapisa "$1" pisać.
+Změń jeho prawa, tak zo webserwer móže do njeho pisać a spytaj hišće raz.',
+ 'config-sqlite-connection-error' => '$1.
+
+Skontroluj datowy zapis a mjeno datoweje banki kaj spytaj hišće raz.',
+ 'config-sqlite-readonly' => 'Do dataje <code>$1</code> njeda so pisać.',
+ 'config-sqlite-cant-create-db' => 'Dataja <code>$1</code> datoweje banki njeda so wutworić.',
+ 'config-sqlite-fts3-downgrade' => 'PHP wo podpěrje FTS3 k dispoziciji njesteji, table so znižuja',
+ 'config-can-upgrade' => "Su tabele MediaWiki w tutej datowej bance.
+Zo by je na MediaWiki $1 aktualizował, klikń na '''Dale'''.",
+ 'config-upgrade-done-no-regenerate' => 'Aktualizacija dokónÄena.
+
+Móžeš nětko [$1 swój wiki wužiwać].',
+ 'config-regenerate' => 'LocalSettings.php znowa wutworić →',
+ 'config-show-table-status' => 'Naprašowanje SHOW TABLE STATUS je so njeporadźiło!',
+ 'config-unknown-collation' => "'''Warnowanje:''' Datowa banka njeznatu kolaciju wužiwa.",
+ 'config-db-web-account' => 'Konto datoweje banki za webpřistup',
+ 'config-db-web-help' => 'wubjer wužiwarske mjeno a hesło, kotrejž webserwer budźe wužiwać, zo by z serwerom datoweje banki za wšědnu operaciju zwjazać',
+ 'config-db-web-account-same' => 'Samsne konto kaž za instalaciju wužiwać',
+ 'config-db-web-create' => 'Załož konto, jeli hišće njeeksistuje.',
+ 'config-db-web-no-create-privs' => 'Konto, kotrež sy za instalaciju podał, nima dosć woprawnjenjow, zo by konto wutworiło.
+Konto, kotrež tu podawaće, dyrbi hižo eksistować.',
+ 'config-mysql-engine' => 'Składowanska mašina:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-charset' => 'Znamješkowa sadźba datoweje banki:',
+ 'config-mysql-binary' => 'Binarny',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Mjeno wikija:',
+ 'config-site-name-help' => 'To zjewi so w titulowej lejstwje wobhladaka kaž tež na wšelakich druhich městnach.',
+ 'config-site-name-blank' => 'Zapodaj sydłowe mjeno.',
+ 'config-project-namespace' => 'Mjenowy rum projekta:',
+ 'config-ns-generic' => 'Projekt',
+ 'config-ns-site-name' => 'Samsne kaž wikimjeno: $1',
+ 'config-ns-other' => 'Druhe (podać)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-ns-invalid' => 'Podaty mjenowy rum "<nowiki>$1</nowiki>" je njepłaćiwy.
+Podaj druhi projektowy mjenowy rum.',
+ 'config-ns-conflict' => 'Podaty mjenowy rum "<nowiki>$1</nowiki>" je w konflikće ze standardnym mjenjowym rumom MediaWiki.
+Podaj druhi projektowy mjenowy rum.',
+ 'config-admin-box' => 'Administratorowe konto',
+ 'config-admin-name' => 'Twoje mjeno:',
+ 'config-admin-password' => 'Hesło:',
+ 'config-admin-password-confirm' => 'Hesło wospjetować:',
+ 'config-admin-help' => 'Zapodaj swoje preferowane wužiwarske mjeno, na přikład "Jurij Serb".
+To je mjeno, kotrež budźeš wužiwać, zo by so do wikija přizjewił.',
+ 'config-admin-name-blank' => 'Zapodaj administratorowe wužiwarske mjeno.',
+ 'config-admin-name-invalid' => 'Podate wužiwarske mjeno "<nowiki>$1</nowiki>" je njepłaćiwe.
+Podaj druhe wužiwarske mjeno.',
+ 'config-admin-password-blank' => 'Zapodaj hesło za administratorowe konto.',
+ 'config-admin-password-same' => 'Hesło dyrbi so wot wužiwarskeho mjena rozeznać.',
+ 'config-admin-password-mismatch' => 'Wobě hesle, kotrejž sy zapodał, njejstej jenakej.',
+ 'config-admin-email' => 'E-mejlowa adresa:',
+ 'config-admin-email-help' => 'Zapodaj tu e-mejlowu adresu, zo by přijimanje e-mejlow wot druhich wužiwarjow w tutym wikiju zmóžnił, swoje hesło wróćo stajił a zdźělenki wo změnach na swojich wobkedźbowanych stronach dostał.',
+ 'config-admin-error-user' => 'Interny zmylk při wutworjenju administratora z mjenom "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Interny zmylk při nastajenju hesła za administratora "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Sy njepłaćiwu e-mejlowu adresu zapodał.',
+ 'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rozesyłansku lisćinu wo připowědźenjach nowych wersijow ].abonować',
+ 'config-almost-done' => 'Sy skoro hotowy!
+MóžeÅ¡ nÄ›tko zbytnu konfiguraciju pÅ™eskoÄić a wiki hnydom instalować.',
+ 'config-optional-continue' => 'Dalše prašenja?',
+ 'config-optional-skip' => 'Instaluj nětko wiki.',
+ 'config-profile' => 'Profil wužiwarskich prawow:',
+ 'config-profile-wiki' => 'Tradicionelny wiki',
+ 'config-profile-no-anon' => 'Załoženje konto je trěbne',
+ 'config-profile-fishbowl' => 'Jenož awtorizowani wobdźěłarjo',
+ 'config-profile-private' => 'Priwatny wiki',
+ 'config-license' => 'Awtorske prawo a licenca:',
+ 'config-license-none' => 'Žane licencne podaća w nohowej lince',
+ 'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons "Zero"',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 abo nowša',
+ 'config-license-pd' => 'Powšitkownosći přistupny',
+ 'config-license-cc-choose' => 'Swójsku licencu Creative Commons wubrać',
+ 'config-email-settings' => 'E-mejlowe nastajenja',
+ 'config-enable-email' => 'Wuchadźace e-mejlki zmóžnić',
+ 'config-enable-email-help' => 'Jeli chceš e-mejl wužiwać, dyrbja so [http://www.php.net/manual/en/mail.configuration.php e-mejlowe nastajenja PHP] prawje konfigurować.
+Jeli nochceš e-mejlowe funkcije wužiwać, móžeš je tu znjemóžnić.',
+ 'config-email-user' => 'E-mejl mjez wužiwarjemi zmóžnić',
+ 'config-email-user-help' => 'Wšěm wužiwarjam dowolić, jednomu druhemu e-mejlki pósłać, jeli su tutu funkciju w swojich nastajenjach zmóžnili.',
+ 'config-email-usertalk' => 'Zdźělenja za wužiwarske diskusijne strony zmóžnić',
+ 'config-email-usertalk-help' => 'Wužiwarjam dowolić zdźělenki wo změnach na wužiwarskich diskusijnych stronach dóstać, jeli woni su to w swojich nastajenjach zmóžnili.',
+ 'config-email-watchlist' => 'Zdźělenja za wobkedźbowanki zmóžnić',
+ 'config-email-watchlist-help' => 'Wužiwarjam dowolić zdźělenki wo jich wobked´bowanych stronach dóstać, jeli woni su to w swojich nastajenjach zmóžnili.',
+ 'config-email-auth' => 'E-mejlowu awtentifikaciju zmóžnić',
+ 'config-email-sender' => 'E-mejlowa adresa za wotmołwy:',
+ 'config-upload-settings' => 'Wobrazy a nahraća datajow',
+ 'config-upload-enable' => 'Nahraće datajow zmóžnić',
+ 'config-upload-deleted' => 'Zapis za zhašane dataje:',
+ 'config-upload-deleted-help' => 'Wubjer zapis, w kotrymž zhašene dataje maja so archiwować.
+Idealnje tón njeměł z weba přistupny być.',
+ 'config-logo' => 'URL loga:',
+ 'config-instantcommons' => 'Instant commons zmóžnić',
+ 'config-cc-error' => 'Pytanje za licencu Creative Commons njeje žadyn wuslědk přinjesło.
+Zapodaj licencne mjeno manuelnje.',
+ 'config-cc-again' => 'Zaso wubrać...',
+ 'config-cc-not-chosen' => 'Wubjer licencu Creative Commons a klikń na "dale".',
+ 'config-advanced-settings' => 'Rozšěrjena konfiguraćija',
+ 'config-cache-options' => 'Nastajenja za objektowe pufrowanje:',
+ 'config-cache-none' => 'Žane pufrowanje (žana funkcionalnosć so njewotstronja, ale spěšnosć móže so na wjetšich wikijowych sydłach wobwliwować)',
+ 'config-cache-accel' => 'Objektowe pufrowanje PHP (APC, eAccelerator, XCache abo WinCache)',
+ 'config-cache-memcached' => 'Memcached wužiwać (wužaduje sej přidatnu instalaciju a konfiguraciju)',
+ 'config-memcached-servers' => 'Serwery memcached:',
+ 'config-memcached-help' => 'Lisćina IP-adresow, kotrež maja so za Memcached wužiwać.
+Kóžda linka měła jenož jednu IP-adresu a port, kotryž ma so wužiwać, wobsahować. Na přikład:
+127.0.0.1:11211
+192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Sy Memcached jako swój pufrowakowy typ wubrał, ale njejsy žane serwery podał',
+ 'config-memcache-badip' => 'Sy njepłaćiwu IP-adresu za Memcached zapodał: $1',
+ 'config-memcache-noport' => 'Njejsy žadyn port za wužiwanje serwera Memcached podał: $1.
+Jeli port njewěš, standard je 11211.',
+ 'config-memcache-badport' => 'Portowe ÄisÅ‚a za Memcached mÄ›li mjez $1 a $2 być',
+ 'config-extensions' => 'Rozšěrjenja',
+ 'config-extensions-help' => 'Rozšěrjenja podate horjeka buchu w twojim zapisu <code>./extensions</code> namakane.
+
+To móže sej přidatnu konfiguraciju wužadać, ale móžeš je nětko zmóžnić.',
+ 'config-install-alreadydone' => "'''Warnowanje:''' Zda so, zo sy hižo MediaWiki instalował a pospytuješ jón znowa instalować.
+ProÅ¡u pokroÄuj z pÅ™ichodnej stronu.",
+ 'config-install-begin' => 'Přez kliknjenje na "{{int:config-continue}}" budźe so instalacija MediaWiki startować.
+Jeli hišće chceš něšto změnić, klikń na "Wróćo".',
+ 'config-install-step-done' => 'dokónÄene',
+ 'config-install-step-failed' => 'njeporadźiło',
+ 'config-install-extensions' => 'Inkluziwnje rozšěrjenja',
+ 'config-install-database' => 'Datowa banka so připrawja',
+ 'config-install-pg-schema-not-exist' => 'Å ema PostgreSQL njeeksistuje',
+ 'config-install-pg-schema-failed' => 'Wutworjenje tabelow je so njeporadźiło.
+Zawěsć, zo wužiwar "$1" móže do šemy "$2" pisać.',
+ 'config-install-pg-commit' => 'Změny so wotesyłaja',
+ 'config-install-pg-plpgsql' => 'Pruwowanje za rÄ›Äu PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'DyrbiÅ¡ rÄ›Ä PL/pgSQL w datowej bance $1 instalować',
+ 'config-pg-no-create-privs' => 'Konto, kotrež sy za instalaciju podał, nima dosahace prawa za wutworjenje konta.',
+ 'config-install-user' => 'Tworjenje wužiwarja datoweje banki',
+ 'config-install-user-alreadyexists' => 'Wužiwar "$1" hižo eksistuje',
+ 'config-install-user-create-failed' => 'Wutworjenje wužiwarja "$1" je so njeporadźiło: $2',
+ 'config-install-user-grant-failed' => 'Prawo njeda so wužiwarjej "$1" dać: $2',
+ 'config-install-tables' => 'Tworjenje tabelow',
+ 'config-install-tables-exist' => "'''Warnowanje''': Zda so, zo tabele MediaWiki hižo eksistuja.
+Wutworjenje so přeskakuje.",
+ 'config-install-tables-failed' => "'''Zmylk''': Wutworjenje tabele je so slědowaceho zmylka dla njeporadźiło: $1",
+ 'config-install-interwiki' => 'Standardna tabela interwikijow so pjelni',
+ 'config-install-interwiki-list' => '<code>interwiki.list</code> njeda so namakać.',
+ 'config-install-interwiki-exists' => "'''Warnowanje''': Zda so, zo tabela interwikjow hižo zapiski wobsahuje.
+Standardna lisćina sp přeskakuje.",
+ 'config-install-stats' => 'Statistika so inicializuje',
+ 'config-install-keys' => 'Tworjenje tajneho kluÄa',
+ 'config-install-sysop' => 'Tworjenje administratoroweho wužiwarskeho konta',
+ 'config-install-subscribe-fail' => 'Abonowanje "mediawiki-announce" njemóžno',
+ 'config-install-mainpage' => 'HÅ‚owna strona so ze standardnym wobsahom wutworja',
+ 'config-install-extension-tables' => 'Tabele za zmóžnjene rozšěrjenja so tworja',
+ 'config-install-mainpage-failed' => 'Powěsć njeda so zasunyć: $1',
+ 'config-download-localsettings' => 'LocalSettings.php sćahnyć',
+ 'config-help' => 'pomoc',
+);
+
+/** Hungarian (Magyar)
+ * @author Dani
+ * @author Glanthor Reviol
+ */
+$messages['hu'] = array(
+ 'config-desc' => 'A MediaWiki telepítője',
+ 'config-title' => 'A MediaWiki $1 telepítése',
+ 'config-information' => 'Információ',
+ 'config-localsettings-upgrade' => 'Már létezik a <code>LocalSettings.php</code> fájl.
+A telepített szoftver frissítéséhez írd be az alábbi mezőbe a <code>$wgUpgradeKey</code> beállítás értékét, melyet a LocalSettings.php nevű fájlban találhatsz meg.',
+ 'config-localsettings-key' => 'Frissítési kulcs:',
+ 'config-localsettings-badkey' => 'A megadott kulcs érvénytelen.',
+ 'config-localsettings-connection-error' => 'Nem sikerült csatlakozni az adatbázishoz a LocalSettings.php-ben vagy az AdminSettings.php-ben megadott adatokkal. Ellenőrizd a beállításokat, majd próbáld újra.
+
+$1',
+ 'config-session-error' => 'Nem sikerült elindítani a munkamenetet: $1',
+ 'config-session-expired' => 'Úgy tűnik, hogy a munkamenetadatok lejártak.
+A munkamenetek élettartama a következőre van beállítva: $1.
+Az érték növelhető a php.ini <code>session.gc_maxlifetime</code> beállításának módosításával.
+Indítsd újra a telepítési folyamatot.',
+ 'config-no-session' => 'Elvesztek a munkamenetadatok!
+Ellenőrizd, hogy a php.ini-ben a <code>session.save_path</code> a megfelelő könyvtárra mutat-e.',
+ 'config-your-language' => 'Nyelv:',
+ 'config-your-language-help' => 'A telepítési folyamat során használandó nyelv.',
+ 'config-wiki-language' => 'A wiki nyelve:',
+ 'config-wiki-language-help' => 'Az a nyelv, amin a wiki tartalmának legnagyobb része íródik.',
+ 'config-back' => '↠Vissza',
+ 'config-continue' => 'Folytatás →',
+ 'config-page-language' => 'Nyelv',
+ 'config-page-welcome' => 'Üdvözöl a MediaWiki!',
+ 'config-page-dbconnect' => 'Kapcsolódás az adatbázishoz',
+ 'config-page-upgrade' => 'Telepített változat frissítése',
+ 'config-page-dbsettings' => 'Adatbázis-beállítások',
+ 'config-page-name' => 'Név',
+ 'config-page-options' => 'Beállítások',
+ 'config-page-install' => 'Telepítés',
+ 'config-page-complete' => 'Kész!',
+ 'config-page-restart' => 'Telepítés újraindítása',
+ 'config-page-readme' => 'Tudnivalók',
+ 'config-page-releasenotes' => 'Kiadási megjegyzések',
+ 'config-page-copying' => 'Másolás',
+ 'config-page-upgradedoc' => 'Frissítés',
+ 'config-page-existingwiki' => 'Létező wiki',
+ 'config-help-restart' => 'Szeretnéd törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?',
+ 'config-restart' => 'Igen, újraindítás',
+ 'config-welcome' => '=== A környezet ellenőrzése ===
+Néhány alapvető ellenőrzés lett végrehajtva, ami meghatározza, hogy ez a környezet alkalmas-e a MediaWiki telepítésére.
+Ha telepítéssel kapcsolatos segítségre van szükséged, add meg ezen ellenőrzések eredményét.',
+ 'config-copyright' => "=== Licenc és feltételek ===
+
+$1
+
+Ez a program szabad szoftver; terjeszthető illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 2-es, akár (tetszőleges) későbbi változata szerint.
+
+Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb '''garancia nélkül''', az '''eladhatóságra''' vagy '''valamely célra való alkalmazhatóságra''' való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz.
+
+A felhasználónak a programmal együtt meg kell kapnia a <doclink href=Copying>GNU General Public License egy példányát</doclink>; ha mégsem kapta meg, akkor írjon a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. címre, vagy [http://www.gnu.org/copyleft/gpl.html tekintse meg online].",
+ 'config-sidebar' => '* [http://www.mediawiki.org A MediaWiki honlapja]
+* [http://www.mediawiki.org/wiki/Help:Contents Felhasználói kézikönyv]
+* [http://www.mediawiki.org/wiki/Manual:Contents Útmutató adminisztrátoroknak]
+* [http://www.mediawiki.org/wiki/Manual:FAQ GyIK]
+----
+* <doclink href=Readme>Ismertető</doclink>
+* <doclink href=ReleaseNotes>Kiadási megjegyzések</doclink>
+* <doclink href=Copying>Másolás</doclink>
+* <doclink href=UpgradeDoc>Frissítés</doclink>',
+ 'config-env-good' => 'A környezet ellenőrzése befejeződött.
+A MediaWiki telepíthető.',
+ 'config-env-bad' => 'A környezet ellenőrzése befejeződött.
+A MediaWiki nem telepíthető.',
+ 'config-env-php' => 'A PHP verziója: $1',
+ 'config-env-php-toolow' => 'PHP $1 van telepítve,
+azonban a MediaWikinek PHP $2, vagy újabb szükséges.',
+ 'config-unicode-using-utf8' => 'A rendszer Unicode normalizálására Brion Vibber utf8_normalize.so könyvtárát használja.',
+ 'config-unicode-using-intl' => 'A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.',
+ 'config-unicode-pure-php-warning' => "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.
+Ha nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [http://www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
+ 'config-no-db' => 'Nem sikerült egyetlen használható adatbázismeghajtót sem találni.',
+ 'config-no-fts3' => "'''Figyelmeztetés''': Az SQLite [http://sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
+ 'config-register-globals' => "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''
+'''Tiltsd le, ha van rá lehetőséged.'''
+A MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
+ 'config-magic-quotes-runtime' => "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktív!'''
+Ez a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.
+A MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
+ 'config-magic-quotes-sybase' => "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] aktív!'''
+Ez a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.
+A MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
+ 'config-mbstring' => "'''Kritikus hiba: az [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime mbstring.func_overload] aktív!'''
+Ez a beállítás hibákat okoz és kiszámíthatatlanul károsíthatja bevitt adatokat.
+A MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
+ 'config-ze1' => "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] aktív!'''
+Ez a beállítás borzalmas hibákat okoz a MediaWiki futása során.
+A MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
+ 'config-xml-bad' => 'A PHP XML-modulja hiányzik.
+Egyes MediaWiki-funkciók, melyek ezt a modult igénylik, nem fognak működni ilyen beállítások mellett.
+Ha Madrake-et futtatsz, telepítsd a php-xml csomagot.',
+ 'config-pcre' => 'Úgy tűnik, hogy a PCRE támogató modul hiányzik.
+A MediaWikinek Perl-kompatibilis reguláriskifejezés-függvényekre van szüksége a működéshez.',
+ 'config-memory-raised' => 'A PHP <code>memory_limit</code> beállításának értéke: $1. Meg lett növelve a következő értékre: $2.',
+ 'config-memory-bad' => "'''Figyelmeztetés:''' A PHP <code>memory_limit</code> beállításának értéke $1.
+Ez az érték valószínűleg túl kevés, a telepítés sikertelen lehet.",
+ 'config-xcache' => 'Az [http://trac.lighttpd.net/xcache/ XCache] telepítve van',
+ 'config-apc' => 'Az [http://www.php.net/apc APC] telepítve van',
+ 'config-eaccel' => 'Az [http://eaccelerator.sourceforge.net/ eAccelerator] telepítve van',
+ 'config-wincache' => 'A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van',
+ 'config-no-cache' => "'''Figyelmeztetés:''' Nem található [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] és [http://www.iis.net/download/WinCacheForPhp WinCache] sem.
+Az objektum-gyorsítótárazás nem lesz engedélyezve.",
+ 'config-diff3-bad' => 'GNU diff3 nem található.',
+ 'config-imagemagick' => 'Az ImageMagick megtalálható a rendszeren: <code>$1</code>.
+A bélyegképek készítése engedélyezve lesz a feltöltések engedélyezése esetén.',
+ 'config-gd' => 'A GD grafikai könyvtár elérhető.
+Bélyegképek készítése működni fog, miután engedélyezted a fájlfeltöltést.',
+ 'config-no-scaling' => 'Nem található a GD könyvtár és az ImageMagick.
+A bélyegképek készítése le lesz tiltva.',
+ 'config-no-uri' => "'''Hiba:''' Nem sikerült megállapítani a jelenlegi URI-t.
+Telepítés megszakítva.",
+ 'config-uploads-not-safe' => "'''Figyelmeztetés:''' a feltöltésekhez használt alapértelmezett könyvtárban (<code>$1</code>) tetszőleges külső szkript futtatható.
+Habár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott a [http://www.mediawiki.org/wiki/Manual:Security#Upload_security a sérülékenység megszüntetése].",
+ 'config-db-type' => 'Adatbázis típusa:',
+ 'config-db-host' => 'Adatbázis hosztneve:',
+ 'config-db-host-help' => 'Ha az adatbázisszerver másik szerveren található, add meg a hosztnevét vagy az IP-címét.
+
+Ha megosztott webtárhelyet használsz, a szolgáltató dokumentációjában megtalálható a helyes hosztnév.
+
+Ha Windows-alapú szerverre telepítesz, és MySQL-t használsz, a „localhost†nem biztos, hogy működni fog. Ha így van, próbáld meg a „127.0.0.1†helyi IP-cím használatát.',
+ 'config-db-host-oracle' => 'Adatbázis TNS:',
+ 'config-db-wiki-settings' => 'A wiki azonosítása',
+ 'config-db-name' => 'Adatbázisnév:',
+ 'config-db-name-help' => 'Válassz egy nevet a wiki azonosítására.
+Ne tartalmazzon szóközt.
+
+Ha megosztott webtárhelyet használsz, a szolgáltatód vagy egy konkrét adatbázisnevet ad neked használatra, vagy te magad hozhatsz létre adatbázisokat a vezérlőpulton keresztül.',
+ 'config-db-name-oracle' => 'Adatbázisséma:',
+ 'config-db-install-account' => 'A telepítéshez használt felhasználói fiók adatai',
+ 'config-db-username' => 'Felhasználónév:',
+ 'config-db-password' => 'Jelszó:',
+ 'config-db-install-username' => 'Ãrd be az adatbázisrendszerhez való csatlakozáshoz használt felhasználónevet.
+Ez nem a MediaWiki fiók felhasználóneve; ez az adatbázisrendszeren használt felhasználóneved.',
+ 'config-db-install-password' => 'Ãrd be az adatbázisrendszerhez való csatlakozáshoz használt jelszót.
+Ez nem a MediaWiki-fiók jelszava; ez az adatbázisrendszeren használt jelszavad.',
+ 'config-db-install-help' => 'Add meg a felhasználónevet és jelszót, amivel a telepítő csatlakozhat az adatbázishoz.',
+ 'config-db-account-lock' => 'Ãltalános működés során is ezen információk használata',
+ 'config-db-wiki-account' => 'Ãltalános működéshez használt felhasználói adatok',
+ 'config-db-wiki-help' => 'Add meg azt a felhasználónevet és jelszót, amivel a wiki fog csatlakozni az adatbázishoz működés közben.
+Ha a fiók nem létezik és a telepítést végző fiók rendelkezik megfelelő jogosultsággal, egy új fiók készül a megadott a névvel, azon minimális jogosultságkörrel, ami a wiki működéséhez szükséges.',
+ 'config-db-prefix' => 'Adatbázistáblák nevének előtagja:',
+ 'config-db-prefix-help' => 'Ha egyetlen adatbázison osztozik több wiki, vagy a MediaWiki és más webalkalmazás, választhatsz egy előtagot a táblaneveknek, hogy megelőzd a konfliktusokat.
+Ne használj szóközöket.
+
+A mezőt általában üresen kell hagyni.',
+ 'config-db-charset' => 'Az adatbázis karakterkészlete',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0, bináris',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0, visszafelé kompatibilis UTF-8',
+ 'config-charset-help' => "'''Figyelmezetés:''' Ha a '''visszafelé kompatibilis UTF-8''' beállítást használod MySQL 4.1 vagy újabb verziók esetén, és utána a <code>mysqldump</code> programmal készítesz róla biztonsági másolatot, az tönkreteheti az összes nem ASCII-karaktert, visszafordíthatatlanul károsítva a másolatokban tárolt adatokat!
+
+'''Bináris''' módban a MediaWiki az UTF-8-ban kódolt szöveget bináris mezőkben tárolja az adatbázisban.
+Ez sokkal hatékonyabb a MySQL UTF-8-módjától, és lehetővé teszi, hogy a teljes Unicode-karakterkészletet használd.
+'''UTF-8-módban''' MySQL tudja, hogy milyen karakterkészlettel van kódolva az adat, és megfelelően tárolja és konvertálja, de
+nem használhatod a [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] feletti karaktereket.",
+ 'config-mysql-old' => 'A MySQL $1 vagy újabb verziója szükséges, a rendszeren $2 van.',
+ 'config-db-port' => 'Adatbázisport:',
+ 'config-db-schema' => 'MediaWiki-séma',
+ 'config-db-schema-help' => 'A fenti sémák általában megfelelőek.
+Csak akkor módosíts rajtuk, ha tudod, hogy szükséges.',
+ 'config-sqlite-dir' => 'SQLite-adatkönyvtár:',
+ 'config-oracle-def-ts' => 'Alapértelmezett táblatér:',
+ 'config-oracle-temp-ts' => 'Ideiglenes táblatér:',
+ 'config-support-info' => 'A MediaWiki a következő adatbázisrendszereket támogatja:
+
+$1
+
+Ha az alábbi listán nem találod azt a rendszert, melyet használni szeretnél, a fenti linken található instrukciókat követve engedélyezheted a támogatását.',
+ 'config-support-mysql' => '* A $1 a MediaWiki elsődleges célpontja, így a legjobban támogatott ([http://www.php.net/manual/en/mysql.installation.php Hogyan fordítható a PHP MySQL-támogatással])',
+ 'config-support-postgres' => '* A $1 népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni.',
+ 'config-support-sqlite' => '* Az $1 egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)',
+ 'config-support-oracle' => '* Az $1 kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])',
+ 'config-header-mysql' => 'MySQL-beállítások',
+ 'config-header-postgres' => 'PostgreSQL-beállítások',
+ 'config-header-sqlite' => 'SQLite-beállítások',
+ 'config-header-oracle' => 'Oracle-beállítások',
+ 'config-invalid-db-type' => 'Érvénytelen adatbázistípus',
+ 'config-missing-db-name' => 'Meg kell adnod az „adatbázis nevétâ€',
+ 'config-missing-db-server-oracle' => 'Meg kell adnod az „Adatbázis TNS†értékét',
+ 'config-invalid-db-server-oracle' => 'Érvénytelen adatbázis TNS: „$1â€
+Csak ASCII betűk (a-z, A-Z), számok (0-9), alulvonás (_) és pont (.) használható.',
+ 'config-invalid-db-name' => 'Érvénytelen adatbázisnév: „$1â€.
+Csak ASCII-karakterek (a-z, A-Z), számok (0-9), alulvonás (_) és kötőjel (-) használható.',
+ 'config-invalid-db-prefix' => 'Érvénytelen adatbázisnév-elÅ‘tag: „$1â€.
+Csak ASCII-karakterek (a-z, A-Z), számok (0-9), alulvonás (_) és kötőjel (-) használható.',
+ 'config-connection-error' => '$1.
+
+Ellenőrizd a hosztot, felhasználónevet és jelszót, majd próbáld újra.',
+ 'config-invalid-schema' => 'Érvénytelen MediaWiki-séma: „$1â€.
+Csak ASCII-karakterek (a-z, A-Z), számok (0-9) és alulvonás (_) használható.',
+ 'config-db-sys-create-oracle' => 'A telepítő csak a SYSDBA fiókkal tud új felhasználói fiókot létrehozni.',
+ 'config-db-sys-user-exists-oracle' => 'Már létezik „$1†nevű felhasználói fiók. A SYSDBA csak új fiók létrehozására használható!',
+ 'config-postgres-old' => 'A PostgreSQL $1 vagy újabb verziója szükséges, a rendszeren $2 van.',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Nem lehet létrehozni az adatok tárolásához szükséges <code><nowiki>$1</nowiki></code> könyvtárat, mert a webszerver nem írhat a szülőkönyvtárba (<code><nowiki>$2</nowiki></code>).
+
+A telepítő nem tudta megállapíteni, hogy melyik felhasználói fiókon fut a webszerver.
+A folytatáshoz tedd írhatóvá ezen fiók (és más fiókok!) számára a következő könyvtárat: <code><nowiki>$3</nowiki></code>.
+Unix/Linux rendszereken tedd a következőt:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Nem sikerült létrehozni a következÅ‘ adatkönyvtárat: „$1â€.
+Ellenőrizd a helyet, majd próbáld újra.',
+ 'config-sqlite-dir-unwritable' => 'Nem sikerült írni a következÅ‘ könyvtárba: „$1â€.
+Módosítsd a jogosultságokat úgy, hogy a webszerver tudjon oda írni, majd próbáld újra.',
+ 'config-sqlite-connection-error' => '$1.
+
+Ellenőrizd az adatkönyvtárat és az adatbázisnevet, majd próbáld újra.',
+ 'config-sqlite-readonly' => 'A következő fájl nem írható: <code>$1</code>.',
+ 'config-regenerate' => 'LocalSettings.php elkészítése újra →',
+ 'config-show-table-status' => 'A SHOW TABLE STATUS lekérdezés nem sikerült!',
+ 'config-unknown-collation' => "'''Figyelmeztetés:''' az adatbázis ismeretlen egybevetést használ.",
+ 'config-db-web-account' => 'A webes hozzáférésnél használt adatbázisfiók',
+ 'config-db-web-help' => 'Add meg azt a felhasználónevet és jelszót, amit a webszerver a wiki általános működése során használ a csatlakozáshoz.',
+ 'config-db-web-account-same' => 'Ezen fiók használata a telepítéshez is',
+ 'config-db-web-create' => 'Fiók létrehozása, ha még nem létezik.',
+ 'config-mysql-engine' => 'Tárolómotor:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "A legtöbb esetben az '''InnoDB''' a legjobb választás, mivel megfelelően támogatja a párhuzamosságot.
+
+A '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható környezetekben, azonban a MyISAM-adatbázisok sokkal gyakrabban sérülnek meg, mint az InnoDB-adatbázisok.",
+ 'config-mysql-charset' => 'Adatbázis karakterkészlete:',
+ 'config-mysql-binary' => 'Bináris',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "'''Bináris módban''' a MediaWiki az UTF-8-as szövegeket bináris mezőkben tárolja az adatbázisban.
+Ez sokkal hatékonyabb a MySQL UTF-8-as módjánál, és lehetővé teszi a teljes Unicode-karakterkészlet használatát.
+
+'''UTF-8-as módban''' a MySQL tudni fogja,hogy az adatok milyen karakterkészlettel rendelkeznek, és megfelelően átalakítja őket, azonban nem tárolhatóak olyan karakterek, melyek a [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
+ 'config-site-name' => 'A wiki neve:',
+ 'config-site-name-help' => 'A böngésző címsorában és még számos más helyen jelenik meg.',
+ 'config-site-name-blank' => 'Add meg az oldal nevét.',
+ 'config-project-namespace' => 'Projektnévtér:',
+ 'config-ns-generic' => 'Projekt',
+ 'config-ns-site-name' => 'Ugyanaz, mint a wiki neve: $1',
+ 'config-ns-other' => 'Más (meg kell adni)',
+ 'config-ns-other-default' => 'SajátWiki',
+ 'config-project-namespace-help' => "A Wikipédia példáját követve számos wiki elkülöníti egy '''projekt névtérbe''' az irányelveit a tartalommal rendelkező lapoktól
+Az ebben a névtérben található lapok nevei egy előtaggal kezdődnek, amit itt adhatsz meg.
+Ãltalában az elÅ‘tag a wiki nevébÅ‘l származik, de nem tartalmazhat írásjeleket, például „#â€-t vagy „:â€-t.",
+ 'config-admin-box' => 'Adminisztrátori fiók',
+ 'config-admin-name' => 'Név:',
+ 'config-admin-password' => 'Jelszó:',
+ 'config-admin-password-confirm' => 'Jelszó újra:',
+ 'config-admin-help' => 'Ãrd be a kívánt felhasználónevet, például „Kovács Jánosâ€.
+Ezzel a névvel fogsz majd bejelentkezni a wikibe.',
+ 'config-admin-name-blank' => 'Add meg az adminisztrátor felhasználónevét!',
+ 'config-admin-name-invalid' => 'A megadott felhasználónév (<nowiki>$1</nowiki>) érvénytelen.
+Adj meg egy másik felhasználónevet.',
+ 'config-admin-password-blank' => 'Add meg az adminisztrátori fiók jelszavát!',
+ 'config-admin-password-same' => 'A jelszó nem lehet ugyanaz, mint a felhasználónév.',
+ 'config-admin-password-mismatch' => 'A megadott jelszavak nem egyeznek.',
+ 'config-admin-email' => 'E-mail cím:',
+ 'config-admin-email-help' => 'Add meg az e-mail címedet, hogy más felhasználók küldhessenek e-maileket a wikin keresztül, új jelszót tudj kérni, és értesülhess a figyelőlistádon lévő lapokon történt változásokról. Üresen is hagyhatod ezt a mezőt.',
+ 'config-subscribe-help' => 'Ez egy alacsony forgalmú levelezőlista, ahol a kiadásokkal kapcsolatos bejelentések jelennek meg, a fontos biztonsági javításokkal együtt.
+Ajánlott feliratkozni rá, és frissíteni a MediaWikit, ha új verzió jön ki.',
+ 'config-almost-done' => 'Már majdnem kész!
+A további konfigurációt kihagyhatod, és most azonnal elindíthatod a wiki telepítését.',
+ 'config-optional-continue' => 'További információk megadása.',
+ 'config-optional-skip' => 'Épp elég volt, települjön a wiki!',
+ 'config-profile' => 'Felhasználói jogosultságok profilja:',
+ 'config-profile-wiki' => 'Hagyományos wiki',
+ 'config-profile-no-anon' => 'Felhasználói fiók létrehozása szükséges',
+ 'config-profile-fishbowl' => 'Csak engedélyezett szerkesztők',
+ 'config-profile-private' => 'Privát wiki',
+ 'config-profile-help' => "A wikik akkor működnek a legjobban, ha minél több felhasználó számára engedélyezett a szerkesztés.
+A MediaWikiben könnyű ellenőrizni a legutóbbi változtatásokat,és visszaállítani a naiv vagy káros felhasználók által okozott károkat.
+
+A MediaWiki azonban számos helyzetben hasznos lehet, és néha nem könnyű mindenkit meggyőzni a wiki előnyeiről.
+Választhatsz!
+
+'''{{int:config-profile-wiki}}kben''' bárki szerkeszthet, akár bejelentkezés nélkül is. A '''{{int:config-profile-no-anon}}''' beállítás további biztonságot nyújt, azonban elijesztheti az alkalmi szerkesztőket.
+
+Lehetőség van arra is, hogy '''{{lc:{{int:config-profile-fishbowl}}}}''' módosíthassák a lapokat, de a nyilvánosság ekkor megtekintheti a lapokat és azok laptörténetét is. '''{{int:config-profile-private}}''' esetén csak az engedélyezett szerkesztők tekinthetik meg a lapokat, és ugyanez a csoport szerkeszthet.
+
+Telepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [http://www.mediawiki.org/wiki/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].",
+ 'config-license' => 'Szerzői jog és licenc:',
+ 'config-license-none' => 'Nincs licencjelzés',
+ 'config-license-cc-by-sa' => 'Creative Commons Nevezd meg! - Ãgy add tovább!',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Nevezd meg! - Ne add el! - Ãgy add tovább!',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'GNU Szabad Dokumentációs Licenc 1.2',
+ 'config-license-gfdl-current' => 'GNU Szabad Dokumentációs Licenc 1.3 vagy újabb',
+ 'config-license-pd' => 'Közkincs',
+ 'config-license-cc-choose' => 'Creative Commons-licenc választása',
+ 'config-license-help' => "A legtöbb wiki [http://freedomdefined.org/Definition szabad licenc] alatt teszi közzé a szerkesztéseit.
+Ez erősíti a közösségi tulajdon érzését, és elősegíti a hosszú távú közreműködést.
+Ãltalában szükségtelen magán- vagy vállalati wiki esetén.
+
+Ha a Wikipédiáról szeretnél szövegeket másolni, és a Wikipédián felhasználhassák a wikidben található szöveget, akkor a '''Creative Commons Nevezd meg! - Ãgy add tovább!''' lehetÅ‘séget válaszd.
+
+A GNU Szabad Dokumentációs Licenc a Wikipédia korábbi licence.
+Még ma is érvényes, azonban van néhány tulajdonsága, amely nehezíti az újrafelhasználást és az értelmezését.",
+ 'config-email-settings' => 'E-mail beállítások',
+ 'config-enable-email' => 'Kimenő e-mailek engedélyezése',
+ 'config-enable-email-help' => 'E-mailek küldéséhez [http://www.php.net/manual/en/mail.configuration.php a PHP mail beállításait] megfelelően meg kell adni.
+Ha nem akarsz semmilyen e-mailes funkciót használni, itt tilthatod le őket.',
+ 'config-email-sender' => 'Válaszcím:',
+ 'config-upload-settings' => 'Képek és fájlok feltöltése',
+ 'config-upload-enable' => 'Fájlfeltöltés engedélyezése',
+ 'config-upload-deleted' => 'Törölt fájlok könyvtára:',
+ 'config-logo' => 'A logó URL-címe:',
+ 'config-instantcommons' => 'Instant Commons engedélyezése',
+ 'config-instantcommons-help' => 'Az [http://www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [http://commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.
+A használatához a MediaWikinek internethozzáférésre van szüksége.
+
+A funkcióról és hogy hogyan állítható be más wikik esetén [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhatsz további információkat.',
+ 'config-cc-again' => 'Válassz újra…',
+ 'config-advanced-settings' => 'Haladó beállítások',
+ 'config-cache-options' => 'Objektum-gyorsítótárazás beállításai:',
+ 'config-cache-none' => 'Nincs gyorsítótárazás (minden funkció működik, de nagyobb wiki esetében lassabb működést eredményezhet)',
+ 'config-cache-accel' => 'PHP-objektumok gyorsítótárazása (APC, eAccelerator, XCache or WinCache)',
+ 'config-cache-memcached' => 'Memcached használata (további telepítés és konfigurálás szükséges)',
+ 'config-memcached-servers' => 'Memcached-szerverek:',
+ 'config-memcached-help' => 'Azon IP-címek listája, melyeket a Memcached használhat.
+Vesszővel kell elválasztani őket, és meg kell adni a portot is. Például:
+ 127.0.0.1:11211
+ 192.168.1.25:11211',
+ 'config-extensions' => 'Kiterjesztések',
+ 'config-install-step-done' => 'kész',
+ 'config-install-step-failed' => 'sikertelen',
+ 'config-install-extensions' => 'Kiterjesztések beillesztése',
+ 'config-install-database' => 'Adatbázis felállítása',
+ 'config-install-user' => 'Adatbázis-felhasználó létrehozása',
+ 'config-install-tables' => 'Táblák létrehozása',
+ 'config-install-tables-exist' => "'''Figyelmeztetés''': úgy tűnik, hogy a MediaWiki táblái már léteznek.
+Létrehozás kihagyása.",
+ 'config-install-tables-failed' => "'''Hiba''': a tábla létrehozása nem sikerült a következő miatt: $1",
+ 'config-install-interwiki' => 'Alapértelmezett nyelvközihivatkozás-tábla feltöltése',
+ 'config-install-interwiki-list' => 'Az <code>interwiki.list</code> fájl nem található.',
+ 'config-install-stats' => 'Statisztika inicializálása',
+ 'config-install-keys' => 'Titkos kulcsok generálása',
+ 'config-insecure-keys' => "'''Figyelmeztetés:''' A telepítés során generált $1 {{PLURAL:$2|biztonsági kulcs|biztonsági kulcsok}} nem teljesen $1 {{PLURAL:$2|biztonságos|biztonságosak}}. Érdemes {{PLURAL:$2||őket}} manuálisan megváltoztatni.",
+ 'config-install-sysop' => 'Az adminisztrátor felhasználói fiókjának létrehozása',
+ 'config-install-subscribe-fail' => 'Nem sikerült feliratkozni a mediawiki-announce levelezőlistára',
+ 'config-install-mainpage' => 'Kezdőlap létrehozása az alapértelmezett tartalommal',
+ 'config-install-extension-tables' => 'Táblák létrehozása az engedélyezett kiterjesztésekhez',
+ 'config-install-mainpage-failed' => 'Nemsikerült létrehozni a kezdőlapot: $1',
+ 'config-install-done' => "'''Gratulálunk!'''
+A MediaWiki telepítése sikeresen befejeződött.
+
+A telepítő elkészítette a <code>LocalSettings.php</code> fájlt, amely tartalmazza az összes beállítást.
+
+Ezt le kell tölteni, majd elhelyezni a wiki telepítési könyvtárába (az a könyvtár, ahol az index.php is található).
+
+A letöltés automatikusan elindul. Ha mégsem indulna el, vagy megszakítottad, az alábbi linkre kattintva újra letöltheted:
+
+$3
+
+'''Megjegyzés''': Ha ezt most nem teszed meg, és kilépsz a telepítésből, az elkészített konfigurációs fájlt nem tudod elérni a későbbiekben.
+
+Ha végeztél a fájl elhelyezésével, '''[$2 beléphetsz a wikibe]'''.",
+ 'config-download-localsettings' => 'LocalSettings.php letöltése',
+ 'config-help' => 'segítség',
+);
+
+/** Interlingua (Interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'config-desc' => 'Le installator de MediaWiki',
+ 'config-title' => 'Installation de MediaWiki $1',
+ 'config-information' => 'Information',
+ 'config-localsettings-upgrade' => 'Un file <code>LocalSettings.php</code> ha essite detegite.
+Pro actualisar iste installation, per favor entra le valor de <code>$wgUpgradeKey</code> in le quadro hic infra.
+Iste se trova in LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Un file LocalSettings.php file ha essite detegite.
+Pro actualisar iste installation, per favor executa upgrade.php.',
+ 'config-localsettings-key' => 'Clave de actualisation:',
+ 'config-localsettings-badkey' => 'Le clave que tu forniva es incorrecte',
+ 'config-upgrade-key-missing' => 'Un installation existente de MediaWiki ha essite detegite.
+Pro actualisar iste installation, es necessari adjunger le sequente linea al fin del file LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'Le file LocalSettings.php existente pare esser incomplete.
+Le variabile $1 non es definite.
+Per favor cambia LocalSettings.php de sorta que iste variabile es definite, e clicca "Continuar".',
+ 'config-localsettings-connection-error' => 'Un error esseva incontrate durante le connexion al base de datos usante le configurationes specificate in LocalSettings.php o AdminSettings.php. Per favor repara iste configurationes e tenta lo de novo.
+
+$1',
+ 'config-session-error' => 'Error al comenciamento del session: $1',
+ 'config-session-expired' => 'Le datos de tu session pare haber expirate.
+Le sessiones es configurate pro un duration de $1.
+Tu pote augmentar isto per definir <code>session.gc_maxlifetime</code> in php.ini.
+Reinitia le processo de installation.',
+ 'config-no-session' => 'Le datos de tu session es perdite!
+Verifica tu php.ini e assecura te que un directorio appropriate es definite in <code>session.save_path</code>.',
+ 'config-your-language' => 'Tu lingua:',
+ 'config-your-language-help' => 'Selige un lingua a usar durante le processo de installation.',
+ 'config-wiki-language' => 'Lingua del wiki:',
+ 'config-wiki-language-help' => 'Selige le lingua in que le wiki essera predominantemente scribite.',
+ 'config-back' => '↠Retro',
+ 'config-continue' => 'Continuar →',
+ 'config-page-language' => 'Lingua',
+ 'config-page-welcome' => 'Benvenite a MediaWiki!',
+ 'config-page-dbconnect' => 'Connecter al base de datos',
+ 'config-page-upgrade' => 'Actualisar le installation existente',
+ 'config-page-dbsettings' => 'Configuration del base de datos',
+ 'config-page-name' => 'Nomine',
+ 'config-page-options' => 'Optiones',
+ 'config-page-install' => 'Installar',
+ 'config-page-complete' => 'Complete!',
+ 'config-page-restart' => 'Reinitiar installation',
+ 'config-page-readme' => 'Lege me',
+ 'config-page-releasenotes' => 'Notas del version',
+ 'config-page-copying' => 'Copiar',
+ 'config-page-upgradedoc' => 'Actualisar',
+ 'config-page-existingwiki' => 'Wiki existente',
+ 'config-help-restart' => 'Vole tu rader tote le datos salveguardate que tu ha entrate e reinitiar le processo de installation?',
+ 'config-restart' => 'Si, reinitia lo',
+ 'config-welcome' => '=== Verificationes del ambiente ===
+Verificationes de base es exequite pro determinar si iste ambiente es apte pro le installation de MediaWiki.
+Tu deberea indicar le resultatos de iste verificationes si tu ha besonio de adjuta durante le installation.',
+ 'config-copyright' => "=== Copyright and Terms ===
+
+$1
+
+Iste programma es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.
+
+Iste programma es distribuite in le sperantia que illo sia utile, ma '''sin garantia''', sin mesmo le implicite garantia de '''commercialisation''' o '''aptitude pro un proposito particular'''.
+Vide le Licentia Public General de GNU pro plus detalios.
+
+Vos deberea haber recipite <doclink href=Copying>un exemplar del Licentia Public General de GNU</doclink> con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/copyleft/gpl.html lege lo in linea].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Pagina principal de MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Guida pro usatores]
+* [http://www.mediawiki.org/wiki/Manual:Contents Guida pro administratores]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Lege me</doclink>
+* <doclink href=ReleaseNotes>Notas de iste version</doclink>
+* <doclink href=Copying>Conditiones de copia</doclink>
+* <doclink href=UpgradeDoc>Actualisation</doclink>',
+ 'config-env-good' => 'Le ambiente ha essite verificate.
+Tu pote installar MediaWiki.',
+ 'config-env-bad' => 'Le ambiente ha essite verificate.
+Tu non pote installar MediaWiki.',
+ 'config-env-php' => 'PHP $1 es installate.',
+ 'config-env-php-toolow' => 'PHP $1 es installate.
+Nonobstante, MediaWiki require PHP $2 o plus recente.',
+ 'config-unicode-using-utf8' => 'utf8_normalize.so per Brion Vibber es usate pro le normalisation Unicode.',
+ 'config-unicode-using-intl' => 'Le [http://pecl.php.net/intl extension PECL intl] es usate pro le normalisation Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Aviso''': Le [http://pecl.php.net/intl extension PECL intl] non es disponibile pro exequer le normalisation Unicode; le systema recurre al implementation lente in PHP pur.
+Si tu sito ha un alte volumine de traffico, tu deberea informar te un poco super le [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalisation Unicode].",
+ 'config-unicode-update-warning' => "'''Aviso''': Le version installate del bibliotheca inveloppante pro normalisation Unicode usa un version ancian del bibliotheca del [http://site.icu-project.org/ projecto ICU].
+Tu deberea [http://www.mediawiki.org/wiki/Unicode_normalization_considerations actualisar lo] si le uso de Unicode importa a te.",
+ 'config-no-db' => 'Non poteva trovar un driver appropriate pro le base de datos!',
+ 'config-no-db-help' => 'Tu debe installar un driver de base de datos pro PHP.
+Le sequente typos de base de datos es supportate: $1.
+
+Si tu sito usa un servitor partite (shared hosting), demanda a tu providitor de installar un driver de base de datos appropriate.
+Si tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo usante <code>./configure --with-mysql</code>.
+Si tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe installar equalmente le modulo php5-mysql.',
+ 'config-no-fts3' => "'''Attention''': SQLite es compilate sin [http://sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.",
+ 'config-register-globals' => "'''Attention: le option <code>[http://php.net/register_globals register_globals]</code> de PHP es activate.'''
+'''Disactiva lo si tu pote.'''
+MediaWiki functionara, ma tu servitor es exponite a potential vulnerabilitates de securitate.",
+ 'config-magic-quotes-runtime' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] es active!'''
+Iste option corrumpe le entrata de datos imprevisibilemente.
+Tu non pote installar o usar MediaWiki si iste option non es disactivate.",
+ 'config-magic-quotes-sybase' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] es active!'''
+Iste option corrumpe le entrata de datos imprevisibilemente.
+Tu non pote installar o usar MediaWiki si iste option non es disactivate.",
+ 'config-mbstring' => "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''
+Iste option causa errores e pote corrumper datos imprevisibilemente.
+Tu non pote installar o usar MediaWiki si iste option non es disactivate.",
+ 'config-ze1' => "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] es active!'''
+Iste option causa horribile defectos con MediaWiki.
+Tu non pote installar o usar MediaWiki si iste option non es disactivate.",
+ 'config-safe-mode' => "'''Aviso:''' Le [http://www.php.net/features.safe-mode modo secur] de PHP es active.
+Isto pote causar problemas, particularmente si es usate le incargamento de files e le supporto de <code>math</code>.",
+ 'config-xml-bad' => 'Le modulo XML de PHP es mancante.
+MediaWiki require functiones de iste modulo e non functionara in iste configuration.
+Si tu usa Mandrake, installa le pacchetto php-xml.',
+ 'config-pcre' => 'Le modulo de supporto PCRE pare esser mancante.
+MediaWiki require le functiones de expression regular compatibile con Perl pro poter functionar.',
+ 'config-pcre-no-utf8' => "'''Fatal''': Le modulo PCRE de PHP pare haber essite compilate sin supporto de PCRE_UTF8.
+MediaWiki require supporto de UTF-8 pro functionar correctemente.",
+ 'config-memory-raised' => 'Le <code>memory_limit</code> de PHP es $1, elevate a $2.',
+ 'config-memory-bad' => "'''Aviso:''' Le <code>memory_limit</code> de PHP es $1.
+Isto es probabilemente troppo basse.
+Le installation pote faller!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] es installate',
+ 'config-apc' => '[http://www.php.net/apc APC] es installate',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] es installate',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] es installate',
+ 'config-no-cache' => "'''Aviso:''' Non poteva trovar [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
+Le cache de objectos non es activate.",
+ 'config-diff3-bad' => 'GNU diff3 non trovate.',
+ 'config-imagemagick' => 'ImageMagick trovate: <code>$1</code>.
+Le miniaturas de imagines essera activate si tu activa le incargamento de files.',
+ 'config-gd' => 'Le bibliotheca graphic GD se trova integrate in le systema.
+Le miniaturas de imagines essera activate si tu activa le incargamento de files.',
+ 'config-no-scaling' => 'Non poteva trovar le bibliotheca GD ni ImageMagick.
+Le miniaturas de imagines essera disactivate.',
+ 'config-no-uri' => "'''Error:''' Non poteva determinar le URI actual.
+Installation abortate.",
+ 'config-uploads-not-safe' => "'''Aviso:''' Le directorio predefinite pro files incargate <code>$1</code> es vulnerabile al execution arbitrari de scripts.
+Ben que MediaWiki verifica tote le files incargate contra le menacias de securitate, il es altemente recommendate [http://www.mediawiki.org/wiki/Manual:Security#Upload_security remediar iste vulnerabilitate de securitate] ante de activar le incargamento de files.",
+ 'config-brokenlibxml' => 'Vostre systema ha un combination de versiones de PHP e libxml2 que es defectuose e pote causar corruption celate de datos in MediaWiki e altere applicationes web.
+Actualisa a PHP 5.2.9 o plus recente e libxml2 2.7.3 o plus recente ([http://bugs.php.net/bug.php?id=45996 problema reportate presso PHP]).
+Installation abortate.',
+ 'config-using531' => 'MediaWiki non pote esser usate con PHP $1 a causa de un defecto concernente parametros de referentia a <code>__call()</code>.
+Actualisa a PHP 5.3.2 o plus recente, o retrograda a PHP 5.3.0 pro remediar isto.
+Installation abortate.',
+ 'config-db-type' => 'Typo de base de datos:',
+ 'config-db-host' => 'Servitor de base de datos:',
+ 'config-db-host-help' => 'Si tu servitor de base de datos es in un altere servitor, entra hic le nomine o adresse IP del servitor.
+
+Si tu usa un servitor web usate in commun, tu providitor deberea dar te le correcte nomine de servitor in su documentation.
+
+Si tu face le installation in un servitor Windows e usa MySQL, le nomine "localhost" possibilemente non functiona como nomine de servitor. Si non, essaya "127.0.0.1", i.e. le adresse IP local.',
+ 'config-db-host-oracle' => 'TNS del base de datos:',
+ 'config-db-host-oracle-help' => 'Entra un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nomine Local Connect] valide; un file tnsnames.ora debe esser visibile a iste installation.<br />Si tu usa bibliothecas de cliente 10g o plus recente, tu pote anque usar le methodo de nomination [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identificar iste wiki',
+ 'config-db-name' => 'Nomine del base de datos:',
+ 'config-db-name-help' => 'Selige un nomine que identifica tu wiki.
+Illo non pote continer spatios.
+
+Si tu usa un servitor web usate in commun, tu providitor te fornira le nomine specific de un base de datos a usar, o te permitte crear un base de datos via un pannello de controlo.',
+ 'config-db-name-oracle' => 'Schema del base de datos:',
+ 'config-db-account-oracle-warn' => 'Il ha tres scenarios supportate pro le installation de Oracle como le base de datos de iste systema:
+
+Si tu vole crear un conto del base de datos como parte del processo de installation, per favor specifica un conto con le rolo SYSDBA como le conto del base de datos pro installation, e specifica le nomine e contrasigno desirate pro le conto de accesso per web. Alteremente tu pote crear le conto de accesso per web manualmente e specificar solmente iste conto (si illo ha le permissiones requisite pro crear le objectos de schema) o specifica duo contos differente, un con privilegios de creation e un conto restringite pro accesso per web.
+
+Un script pro crear un conto con le privilegios requisite se trova in le directorio "maintenance/oracle/" de iste installation. Non oblida que le uso de un conto restringite disactiva tote le capacitates de mantenentia in le conto predefinite.',
+ 'config-db-install-account' => 'Conto de usator pro installation',
+ 'config-db-username' => 'Nomine de usator del base de datos:',
+ 'config-db-password' => 'Contrasigno del base de datos:',
+ 'config-db-password-empty' => 'Per favor entra un contrasigno pro le nove usator del base de datos: $1.
+Ben que il es possibile crear usatores sin contrasigno, isto non es secur.',
+ 'config-db-install-username' => 'Entra le nomine de usator que essera usate pro connecter al base de datos durante le processo de installation. Isto non es le nomine de usator del conto MediaWiki; isto es le nomine de usator pro tu base de datos.',
+ 'config-db-install-password' => 'Entra le contrasigno que essera usate pro connecter al base de datos durante le processo de installation. Isto non es le contrasigno del conto MediaWiki; isto es le contrasigno pro tu base de datos.',
+ 'config-db-install-help' => 'Entra le nomine de usator e contrasigno que essera usate pro connecter al base de datos durante le processo de installation.',
+ 'config-db-account-lock' => 'Usar le mesme nomine de usator e contrasigno durante le operation normal',
+ 'config-db-wiki-account' => 'Conto de usator pro operation normal',
+ 'config-db-wiki-help' => 'Entra le nomine de usator e contrasigno que essera usate pro connecter al base de datos durante le operation normal del wiki.
+Si le conto non existe, e si le conto de installation possede sufficiente privilegios, iste conto de usator essera create con le minime privilegios necessari pro operar le wiki.',
+ 'config-db-prefix' => 'Prefixo de tabella del base de datos:',
+ 'config-db-prefix-help' => 'Si il es necessari usar un base de datos in commun inter multiple wikis, o inter MediaWiki e un altere application web, tu pote optar pro adder un prefixo a tote le nomines de tabella pro evitar conflictos.
+Non usa spatios.
+
+Iste campo usualmente resta vacue.',
+ 'config-db-charset' => 'Codification de characteres in le base de datos',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binari',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 retrocompatibile UTF-8',
+ 'config-charset-help' => "'''Aviso:''' Si tu usa '''UTF-8 retrocompatibile''' sur MySQL 4.1+, e postea face un copia de reserva del base de datos con <code>mysqldump</code>, tote le characteres non ASCII pote esser destruite, resultante in corruption irreversibile de tu copias de reserva!
+
+In '''modo binari''', MediaWiki immagazina texto in UTF-8 in le base de datos in campos binari.
+Isto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres de Unicode.
+In '''modo UTF-8''', MySQL sapera in qual codification de characteres tu datos es, e pote presentar e converter lo appropriatemente,
+ma non te permittera immagazinar characteres supra le [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
+ 'config-mysql-old' => 'MySQL $1 o plus recente es requirite, tu ha $2.',
+ 'config-db-port' => 'Porto de base de datos:',
+ 'config-db-schema' => 'Schema pro MediaWiki',
+ 'config-db-schema-help' => 'Iste schema es generalmente correcte.
+Solmente cambia lo si tu es secur que es necessari.',
+ 'config-sqlite-dir' => 'Directorio pro le datos de SQLite:',
+ 'config-sqlite-dir-help' => "SQLite immagazina tote le datos in un sol file.
+
+Le directorio que tu forni debe permitter le accesso de scriptura al servitor web durante le installation.
+
+Illo '''non''' debe esser accessibile via web. Pro isto, nos non lo pone ubi tu files PHP es.
+
+Le installator scribera un file <code>.htaccess</code> insimul a illo, ma si isto falli, alcuno pote ganiar accesso directe a tu base de datos.
+Isto include le crude datos de usator (adresses de e-mail, contrasignos codificate) assi como versiones delite e altere datos restringite super le wiki.
+
+Considera poner le base de datos in un loco completemente differente, per exemplo in <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Spatio de tabellas predefinite:',
+ 'config-oracle-temp-ts' => 'Spatio de tabellas temporari:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki supporta le sequente systemas de base de datos:
+
+$1
+
+Si tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.',
+ 'config-support-mysql' => '* $1 es le systema primari pro MediaWiki e le melio supportate ([http://www.php.net/manual/en/mysql.installation.php como compilar PHP con supporto de MySQL])',
+ 'config-support-postgres' => '* $1 es un systema de base de datos popular e open source, alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP con supporto de PostgreSQL]). Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production.',
+ 'config-support-sqlite' => '* $1 es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)',
+ 'config-support-oracle' => '* $1 es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])',
+ 'config-header-mysql' => 'Configuration de MySQL',
+ 'config-header-postgres' => 'Configuration de PostgreSQL',
+ 'config-header-sqlite' => 'Configuration de SQLite',
+ 'config-header-oracle' => 'Configuration de Oracle',
+ 'config-invalid-db-type' => 'Typo de base de datos invalide',
+ 'config-missing-db-name' => 'Tu debe entrar un valor pro "Nomine de base de datos"',
+ 'config-missing-db-host' => 'Tu debe entrar un valor pro "Host del base de datos"',
+ 'config-missing-db-server-oracle' => 'You must enter a value for "TNS del base de datos"',
+ 'config-invalid-db-server-oracle' => 'TNS de base de datos "$1" invalide.
+Usa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e punctos (.).',
+ 'config-invalid-db-name' => 'Nomine de base de datos "$1" invalide.
+Usa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e tractos de union (-).',
+ 'config-invalid-db-prefix' => 'Prefixo de base de datos "$1" invalide.
+Usa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e tractos de union (-).',
+ 'config-connection-error' => '$1.
+
+Verifica le servitor, nomine de usator e contrasigno hic infra e reproba.',
+ 'config-invalid-schema' => 'Schema invalide pro MediaWiki "$1".
+Usa solmente litteras ASCII (a-z, A-Z), numeros (0-9) e characteres de sublineamento (_).',
+ 'config-db-sys-create-oracle' => 'Le installator supporta solmente le uso de un conto SYSDBA pro le creation de un nove conto.',
+ 'config-db-sys-user-exists-oracle' => 'Le conto de usator "$1" ja existe. SYSDBA pote solmente esser usate pro le creation de un nove conto!',
+ 'config-postgres-old' => 'PostgreSQL $1 o plus recente es requirite, tu ha $2.',
+ 'config-sqlite-name-help' => 'Selige un nomine que identifica tu wiki.
+Non usar spatios o tractos de union.
+Isto essera usate pro le nomine del file de datos de SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Impossibile crear le directorio de datos <code><nowiki>$1</nowiki></code>, proque le directorio superjacente <code><nowiki>$2</nowiki></code> non concede le accesso de scriptura al servitor web.
+
+Le installator ha determinate le usator sub que le servitor web es executate.
+Concede le accesso de scriptura in le directorio <code><nowiki>$3</nowiki></code> a iste usator pro continuar.
+In un systema Unix/Linux:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Impossibile crear le directorio de datos <code><nowiki>$1</nowiki></code>, proque le directorio superjacente <code><nowiki>$2</nowiki></code> non concede le accesso de scriptura al servitor web.
+
+Le installator non poteva determinar le usator sub que le servitor web es executate.
+Concede le accesso de scriptura in le directorio <code><nowiki>$3</nowiki></code> a iste usator (e alteres!) pro continuar.
+In un systema Unix/Linux:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Error al creation del directorio de datos "$1".
+Verifica le loco e reproba.',
+ 'config-sqlite-dir-unwritable' => 'Impossibile scriber in le directorio "$1".
+Cambia su permissiones de sorta que le servitor web pote scriber in illo, e reproba.',
+ 'config-sqlite-connection-error' => '$1.
+
+Verifica le directorio de datos e le nomine de base de datos hic infra e reproba.',
+ 'config-sqlite-readonly' => 'Le file <code>$1</code> non es accessibile pro scriptura.',
+ 'config-sqlite-cant-create-db' => 'Non poteva crear le file de base de datos <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP non ha supporto pro FTS3. Le tabellas es retrogradate.',
+ 'config-can-upgrade' => "Il ha tabellas MediaWiki in iste base de datos.
+Pro actualisar los a MediaWiki $1, clicca super '''Continuar'''.",
+ 'config-upgrade-done' => "Actualisation complete.
+
+Tu pote ora [$1 comenciar a usar tu wiki].
+
+Si tu vole regenerar tu file <code>LocalSettings.php</code>, clicca super le button hic infra.
+Isto '''non es recommendate''' si tu non ha problemas con tu wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Actualisation complete.
+
+Tu pote ora [$1 comenciar a usar tu wiki].',
+ 'config-regenerate' => 'Regenerar LocalSettings.php →',
+ 'config-show-table-status' => 'Le consulta SHOW TABLE STATUS falleva!',
+ 'config-unknown-collation' => "'''Aviso:''' Le base de datos usa un collation non recognoscite.",
+ 'config-db-web-account' => 'Conto de base de datos pro accesso via web',
+ 'config-db-web-help' => 'Selige le nomine de usator e contrasigno que le servitor web usara pro connecter al servitor de base de datos, durante le operation ordinari del wiki.',
+ 'config-db-web-account-same' => 'Usar le mesme conto que pro le installation',
+ 'config-db-web-create' => 'Crear le conto si illo non jam existe',
+ 'config-db-web-no-create-privs' => 'Le conto que tu specificava pro installation non ha sufficiente privilegios pro crear un conto.
+Le conto que tu specifica hic debe jam exister.',
+ 'config-mysql-engine' => 'Motor de immagazinage:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' es quasi sempre le melior option, post que illo ha bon supporto pro simultaneitate.
+
+'''MyISAM''' pote esser plus rapide in installationes a usator singule o a lectura solmente.
+Le bases de datos MyISAM tende a esser corrumpite plus frequentemente que le base de datos InnoDB.",
+ 'config-mysql-charset' => 'Codification de characteres in le base de datos:',
+ 'config-mysql-binary' => 'Binari',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "In '''modo binari''', MediaWiki immagazina le texto UTF-8 in le base de datos in campos binari.
+Isto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.
+
+In '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
+ 'config-site-name' => 'Nomine del wiki:',
+ 'config-site-name-help' => 'Isto apparera in le barra de titulo del navigator e in varie altere locos.',
+ 'config-site-name-blank' => 'Entra un nomine de sito.',
+ 'config-project-namespace' => 'Spatio de nomines del projecto:',
+ 'config-ns-generic' => 'Projecto',
+ 'config-ns-site-name' => 'Mesme nomine que le wiki: $1',
+ 'config-ns-other' => 'Altere (specifica)',
+ 'config-ns-other-default' => 'MiWiki',
+ 'config-project-namespace-help' => 'Sequente le exemplo de Wikipedia, multe wikis tene lor paginas de politica separate de lor paginas de contento, in un "\'\'\'spatio de nomines de projecto\'\'\'".
+Tote le titulos de pagina in iste spatio de nomines comencia con un certe prefixo, le qual tu pote specificar hic.
+Traditionalmente, iste prefixo deriva del nomine del wiki, ma illo non pote continer characteres de punctuation como "#" o ":".',
+ 'config-ns-invalid' => 'Le spatio de nomines specificate "<nowiki>$1</nowiki>" es invalide.
+Specifica un altere spatio de nomines de projecto.',
+ 'config-ns-conflict' => 'Le spatio de nomines specificate "<nowiki>$1</nowiki>" conflige con un spatio de nomines predefinite de MediaWiki.
+Specifica un altere spatio de nomines pro le projecto.',
+ 'config-admin-box' => 'Conto de administrator',
+ 'config-admin-name' => 'Tu nomine:',
+ 'config-admin-password' => 'Contrasigno:',
+ 'config-admin-password-confirm' => 'Repete contrasigno:',
+ 'config-admin-help' => 'Entra hic tu nomine de usator preferite, per exemplo "Julio Cesare".
+Isto es le nomine que tu usara pro aperir session in le wiki.',
+ 'config-admin-name-blank' => 'Entra un nomine de usator pro administrator.',
+ 'config-admin-name-invalid' => 'Le nomine de usator specificate "<nowiki>$1</nowiki>" es invalide.
+Specifica un altere nomine de usator.',
+ 'config-admin-password-blank' => 'Entra un contrasigno pro le conto de administrator.',
+ 'config-admin-password-same' => 'Le contrasigno non pote esser le mesme que le nomine de usator.',
+ 'config-admin-password-mismatch' => 'Le duo contrasignos que tu scribeva non es identic.',
+ 'config-admin-email' => 'Adresse de e-mail:',
+ 'config-admin-email-help' => 'Entra un adresse de e-mail hic pro permitter le reception de e-mail ab altere usatores del wiki, pro poter reinitialisar tu contrasigno, e pro reciper notification de cambios a paginas in tu observatorio. Iste campo pote esser lassate vacue.',
+ 'config-admin-error-user' => 'Error interne durante le creation de un administrator con le nomine "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Error interne durante le definition de un contrasigno pro le administrator "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Tu ha entrate un adresse de e-mail invalide',
+ 'config-subscribe' => 'Subscribe al [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de diffusion pro annuncios de nove versiones].',
+ 'config-subscribe-help' => 'Isto es un lista de e-mail a basse volumine pro annuncios de nove versiones, includente importante annuncios de securitate.
+Tu deberea subscriber a illo e actualisar tu installation de MediaWiki quando nove versiones es editate.',
+ 'config-almost-done' => 'Tu ha quasi finite!
+Tu pote ora saltar le configuration remanente e installar le wiki immediatemente.',
+ 'config-optional-continue' => 'Pone me plus questiones.',
+ 'config-optional-skip' => 'Isto me es jam tediose. Simplemente installa le wiki.',
+ 'config-profile' => 'Profilo de derectos de usator:',
+ 'config-profile-wiki' => 'Wiki traditional',
+ 'config-profile-no-anon' => 'Creation de conto obligatori',
+ 'config-profile-fishbowl' => 'Modificatores autorisate solmente',
+ 'config-profile-private' => 'Wiki private',
+ 'config-profile-help' => "Le wikis functiona melio si tu permitte a tante personas como possibile de modificar los.
+In MediaWiki, il es facile revider le modificationes recente, e reverter omne damno facite per usatores naive o malitiose.
+
+Nonobstante, multes ha trovate MediaWiki utile in un grande varietate de rolos, e alcun vices il non es facile convincer omnes del beneficios del principio wiki.
+Dunque, a te le option.
+
+Un '''{{int:config-profile-wiki}}''' permitte a omnes de modificar, sin mesmo aperir un session.
+Un wiki con '''{{int:config-profile-no-anon}}''' attribue additional responsabilitate, ma pote dissuader contributores occasional.
+
+Le scenario '''{{int:config-profile-fishbowl}}''' permitte al usatores approbate de modificar, ma le publico pote vider le paginas, includente lor historia.
+Un '''{{int:config-profile-private}}''' permitte solmente al usatores approbate de vider le paginas e de modificar los.
+
+Configurationes de derectos de usator plus complexe es disponibile post installation, vide le [http://www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].",
+ 'config-license' => 'Copyright e licentia:',
+ 'config-license-none' => 'Nulle licentia in pede de paginas',
+ 'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'Licentia GNU pro Documentation Libere 1.2',
+ 'config-license-gfdl-current' => 'Licentia GNU pro Documentation Libere 1.3 o plus recente',
+ 'config-license-pd' => 'Dominio public',
+ 'config-license-cc-choose' => 'Seliger un licentia Creative Commons personalisate',
+ 'config-license-help' => "Multe wikis public pone tote le contributiones sub un [http://freedomdefined.org/Definition/Ia?uselang=ia licentia libere].
+Isto adjuta a crear un senso de proprietate communitari e incoragia le contribution in longe termino.
+Isto non es generalmente necessari pro un wiki private o de interprisa.
+
+Si tu vole poter usar texto de Wikipedia, e si tu vole que Wikipedia pote acceptar texto copiate de tu wiki, tu debe seliger '''Creative Commons Attribution Share Alike'''.
+
+Le Licentia GNU pro Documentation Libere esseva le ancian licentia de publication de Wikipedia.
+Iste licentia continua a esser valide, ma illo ha alcun characteristicas que rende le re-uso e interpretation difficile.",
+ 'config-email-settings' => 'Configuration de e-mail',
+ 'config-enable-email' => 'Activar le e-mail sortiente',
+ 'config-enable-email-help' => 'Si tu vole que e-mail functiona, [http://www.php.net/manual/en/mail.configuration.php le optiones de e-mail de PHP] debe esser configurate correctemente.
+Si tu non vole functiones de e-mail, tu pote disactivar los hic.',
+ 'config-email-user' => 'Activar le e-mail de usator a usator',
+ 'config-email-user-help' => 'Permitter a tote le usatores de inviar e-mail inter se, si illes lo ha activate in lor preferentias.',
+ 'config-email-usertalk' => 'Activar notification de cambios in paginas de discussion de usatores',
+ 'config-email-usertalk-help' => 'Permitter al usatores de reciper notification de modificationes in lor paginas de discussion personal, si illes lo ha activate in lor preferentias.',
+ 'config-email-watchlist' => 'Activar notification de observatorio',
+ 'config-email-watchlist-help' => 'Permitter al usatores de reciper notification super lor paginas sub observation, si illes lo ha activate in lor preferentias.',
+ 'config-email-auth' => 'Activar authentication de e-mail',
+ 'config-email-auth-help' => "Si iste option es activate, le usatores debe confirmar lor adresse de e-mail usante un ligamine inviate a illes, quandocunque illes lo defini o cambia.
+Solmente le adresses de e-mail authenticate pote reciper e-mail de altere usatores o alterar le e-mails de notification.
+Es '''recommendate''' activar iste option pro wikis public a causa de abuso potential del functionalitate de e-mail.",
+ 'config-email-sender' => 'Adresse de e-mail de retorno:',
+ 'config-email-sender-help' => 'Entra le adresse de e-mail a usar como adresse de retorno in e-mail sortiente.
+Hic es recipite le notificationes de non-livration.
+Multe servitores de e-mail require que al minus le parte de nomine de dominio sia valide.',
+ 'config-upload-settings' => 'Incargamento de imagines e files',
+ 'config-upload-enable' => 'Activar le incargamento de files',
+ 'config-upload-help' => 'Le incargamento de files potentialmente expone tu servitor a riscos de securitate.
+Pro plus information, lege le [http://www.mediawiki.org/wiki/Manual:Security section de securitate] in le manual.
+
+Pro activar le incargamento de files, cambia le modo in le subdirectorio <code>images</code> sub le directorio-radice de MediaWiki de sorta que le servitor web pote scriber in illo.
+Postea activa iste option.',
+ 'config-upload-deleted' => 'Directorio pro files delite:',
+ 'config-upload-deleted-help' => 'Selige un directorio in le qual archivar le files delite.
+Idealmente, isto non debe esser accessibile ab le web.',
+ 'config-logo' => 'URL del logotypo:',
+ 'config-logo-help' => 'Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixeles in le angulo superior sinistre.
+Incarga un imagine con le dimensiones appropriate, e entra le URL hic.
+
+Si tu non vole un logotypo, lassa iste quadro vacue.',
+ 'config-instantcommons' => 'Activar "Instant Commons"',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [http://commons.wikimedia.org/ Wikimedia Commons].
+Pro poter facer isto, MediaWiki require accesso a Internet.
+
+Pro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos le manual].',
+ 'config-cc-error' => 'Le selector de licentia Creative Commons non dava un resultato.
+Entra le nomine del licentia manualmente.',
+ 'config-cc-again' => 'Selige de novo…',
+ 'config-cc-not-chosen' => 'Selige le licentia Creative Commons que tu prefere e clicca "proceder".',
+ 'config-advanced-settings' => 'Configuration avantiate',
+ 'config-cache-options' => 'Configuration del cache de objectos:',
+ 'config-cache-help' => 'Le cache de objectos es usate pro meliorar le rapiditate de MediaWiki per immagazinar le datos frequentemente usate.
+Le sitos medie o grande es multo incoragiate de activar isto, ma anque le sitos parve percipera le beneficios.',
+ 'config-cache-none' => 'Nulle cache (nulle functionalitate es removite, ma le rapiditate pote diminuer in grande sitos wiki)',
+ 'config-cache-accel' => 'Cache de objectos de PHP (APC, eAccelerator, XCache o WinCache)',
+ 'config-cache-memcached' => 'Usar Memcached (require additional installation e configuration)',
+ 'config-memcached-servers' => 'Servitores Memcached:',
+ 'config-memcached-help' => 'Lista de adresses IP a usar pro Memcached.
+Debe specificar un per linea e specificar le porto a usar. Per exemplo:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Tu seligeva Memcached como typo de cache ma non specificava alcun servitores',
+ 'config-memcache-badip' => 'Tu ha entrate un adresse IP invalide pro Memcached: $1',
+ 'config-memcache-noport' => 'Tu non specificava un porto a usar pro le servitor Memcached: $1.
+Si tu non cognosce le porto, le standard es 11211',
+ 'config-memcache-badport' => 'Le numeros de porto de Memcached debe esser inter $1 e $2',
+ 'config-extensions' => 'Extensiones',
+ 'config-extensions-help' => 'Le extensiones listate hic supra esseva detegite in tu directorio <code>./extensions</code>.
+
+Istes pote requirer additional configuration, ma tu pote activar los ora.',
+ 'config-install-alreadydone' => "'''Aviso:''' Il pare que tu ha jam installate MediaWiki e tenta installar lo de novo.
+Per favor continua al proxime pagina.",
+ 'config-install-begin' => 'Un clic sur "{{int:config-continue}}" comencia le installation de MediaWiki.
+Pro facer alterationes, clicca sur "Retro".',
+ 'config-install-step-done' => 'finite',
+ 'config-install-step-failed' => 'fallite',
+ 'config-install-extensions' => 'Include le extensiones',
+ 'config-install-database' => 'Configura le base de datos',
+ 'config-install-pg-schema-not-exist' => 'Iste schema de PostgreSQL non existe',
+ 'config-install-pg-schema-failed' => 'Le creation del tabellas falleva.
+Assecura te que le usator "$1" pote scriber in le schema "$2".',
+ 'config-install-pg-commit' => 'Committer cambiamentos',
+ 'config-install-pg-plpgsql' => 'Verifica le presentia del linguage PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Es necessari installar le linguage PL/pgSQL in le base de datos $1',
+ 'config-pg-no-create-privs' => 'Le conto que tu specificava pro installation non ha sufficiente privilegios pro crear un conto.',
+ 'config-install-user' => 'Crea usator pro base de datos',
+ 'config-install-user-alreadyexists' => 'Le usator "$1" ja existe',
+ 'config-install-user-create-failed' => 'Le creation del usator "$1" ha fallite: $2',
+ 'config-install-user-grant-failed' => 'Le concession de permission al usator "$1" falleva: $2',
+ 'config-install-tables' => 'Crea tabellas',
+ 'config-install-tables-exist' => "'''Aviso''': Il pare que le tabellas de MediaWiki jam existe.
+Le creation es saltate.",
+ 'config-install-tables-failed' => "'''Error''': Le creation del tabellas falleva con le sequente error: $1",
+ 'config-install-interwiki' => 'Plena le tabella interwiki predefinite',
+ 'config-install-interwiki-list' => 'Non poteva trovar le file <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Aviso''': Le tabella interwiki pare jam haber entratas.
+Le lista predefinite es saltate.",
+ 'config-install-stats' => 'Initialisation del statisticas',
+ 'config-install-keys' => 'Genera clave secrete',
+ 'config-install-sysop' => 'Crea conto de usator pro administrator',
+ 'config-install-subscribe-fail' => 'Impossibile subscriber a mediawiki-announce',
+ 'config-install-mainpage' => 'Crea pagina principal con contento predefinite',
+ 'config-install-extension-tables' => 'Creation de tabellas pro le extensiones activate',
+ 'config-install-mainpage-failed' => 'Non poteva inserer le pagina principal: $1',
+ 'config-install-done' => "'''Felicitationes!'''
+Tu ha installate MediaWiki con successo.
+
+Le installator ha generate un file <code>LocalSettings.php</code>.
+Iste contine tote le configuration.
+
+Es necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).
+Le discargamento debe haber comenciate automaticamente.
+
+Si le discargamento non ha comenciate, o si illo esseva cancellate, es possibile recomenciar le discargamento con un clic sur le ligamine sequente:
+
+$3
+
+'''Nota''': Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.
+
+Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
+ 'config-download-localsettings' => 'Discargar LocalSettings.php',
+ 'config-help' => 'adjuta',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Farras
+ * @author IvanLanin
+ * @author Reedy
+ */
+$messages['id'] = array(
+ 'config-desc' => 'Penginstal untuk MediaWiki',
+ 'config-title' => 'Instalasi MediaWiki $1',
+ 'config-information' => 'Informasi',
+ 'config-localsettings-upgrade' => 'Berkas <code>LocalSettings.php</code> sudah ada.
+Untuk memutakhirkan instalasi ini, masukkan nilai <code>$wgUpgradeKey</code> dalam kotak yang tersedia di bawah ini.
+Anda dapat menemukan nilai tersebut dalam LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Berkas LocalSettings.php terdeteksi.
+Untuk meningkatkan versi, sertakan pilihan --upgrade=yes.',
+ 'config-localsettings-key' => 'Kunci pemutakhiran:',
+ 'config-localsettings-badkey' => 'Kunci yang Anda berikan tidak benar',
+ 'config-upgrade-key-missing' => 'Suatu instalasi MediaWiki telah terdeteksi.
+Untuk memutakhirkan instalasi ini, silakan masukkan baris berikut di bagian bawah LocalSettings.php Anda:
+
+$1',
+ 'config-localsettings-incomplete' => 'LocalSettings.php yang ada tampaknya tidak lengkap.
+Variabel $1 tidak diatur.
+Silakan ubah LocalSettings.php untuk mengatur variabel ini dan klik "Lanjutkan".',
+ 'config-localsettings-connection-error' => 'Timbul galat saat menghubungkan ke basis data dengan menggunakan setelan yang ditentukan di LocalSettings.php atau AdminSettings.php. Harap perbaiki setelan ini dan coba lagi.
+
+$1',
+ 'config-session-error' => 'Kesalahan sesi mulai: $1',
+ 'config-session-expired' => 'Data sesi tampaknya telah kedaluwarsa.
+Sesi dikonfigurasi untuk berlaku selama $1.
+Anda dapat menaikkannya dengan menetapkan <code>session.gc_maxlifetime</code> dalam php.ini.
+Ulangi proses instalasi.',
+ 'config-no-session' => 'Data sesi Anda hilang!
+Cek php.ini Anda dan pastikan bahwa <code>session.save_path</code> diatur ke direktori yang sesuai.',
+ 'config-your-language' => 'Bahasa Anda:',
+ 'config-your-language-help' => 'Pilih bahasa yang akan digunakan selama proses instalasi.',
+ 'config-wiki-language' => 'Bahasa wiki:',
+ 'config-wiki-language-help' => 'Pilih bahasa yang akan digunakan tulisan-tulisan wiki.',
+ 'config-back' => '↠Kembali',
+ 'config-continue' => 'Lanjut →',
+ 'config-page-language' => 'Bahasa',
+ 'config-page-welcome' => 'Selamat datang di MediaWiki',
+ 'config-page-dbconnect' => 'Hubungkan ke basis data',
+ 'config-page-upgrade' => 'Perbarui instalasi yang ada',
+ 'config-page-dbsettings' => 'Pengaturan basis data',
+ 'config-page-name' => 'Nama',
+ 'config-page-options' => 'Pilihan',
+ 'config-page-install' => 'Instal',
+ 'config-page-complete' => 'Selesai!',
+ 'config-page-restart' => 'Ulangi instalasi',
+ 'config-page-readme' => 'Baca saya',
+ 'config-page-releasenotes' => 'Catatan pelepasan',
+ 'config-page-copying' => 'Menyalin',
+ 'config-page-upgradedoc' => 'Memerbarui',
+ 'config-page-existingwiki' => 'Wiki yang ada',
+ 'config-help-restart' => 'Apakah Anda ingin menghapus semua data tersimpan yang telah Anda masukkan dan mengulang proses instalasi?',
+ 'config-restart' => 'Ya, nyalakan ulang',
+ 'config-welcome' => '=== Pengecekan lingkungan ===
+Pengecekan dasar dilakukan untuk melihat apakah lingkungan ini memadai untuk instalasi MediaWiki.
+Anda harus memberikan hasil pemeriksaan ini jika Anda memerlukan bantuan selama instalasi.',
+ 'config-copyright' => "=== Hak cipta dan persyaratan ===
+
+\$1
+
+Program ini adalah perangkat lunak bebas; Anda dapat mendistribusikan dan/atau memodifikasi di bawah persyaratan GNU General Public License seperti yang diterbitkan oleh Free Software Foundation; baik versi 2 lisensi, atau (sesuai pilihan Anda) versi yang lebih baru.
+
+Program ini didistribusikan dengan harapan bahwa itu akan berguna, tetapi '''tanpa jaminan apa pun'''; bahkan tanpa jaminan tersirat untuk '''dapat diperjualbelikan ''' atau '''sesuai untuk tujuan tertentu'''.
+Lihat GNU General Public License untuk lebih jelasnya.
+
+Anda seharusnya telah menerima <doclink href=\"Copying\">salinan dari GNU General Public License</doclink> bersama dengan program ini; jika tidak, kirimkan surat untuk Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. atau [http://www.gnu.org/copyleft/gpl.html baca versi daring].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Halaman utama MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Panduan Pengguna]
+* [http://www.mediawiki.org/wiki/Manual:Contents Panduan Pengurus]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Pertanyaan yang Sering Diajukan]',
+ 'config-env-good' => 'Kondisi telah diperiksa.
+Anda dapat menginstal MediaWiki.',
+ 'config-env-bad' => 'Kondisi telah diperiksa.
+Anda tidak dapat menginstal MediaWiki.',
+ 'config-env-php' => 'PHP $1 diinstal.',
+ 'config-unicode-using-utf8' => 'Menggunakan utf8_normalize.so Brion Vibber untuk normalisasi Unicode.',
+ 'config-unicode-using-intl' => 'Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.
+Jika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalisasi Unicode].",
+ 'config-unicode-update-warning' => "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].
+Anda harus [http://www.mediawiki.org/wiki/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
+ 'config-no-db' => 'Tidak dapat menemukan pengandar basis data yang sesuai!',
+ 'config-no-db-help' => 'Anda perlu menginstal pengandar basis data untuk PHP.
+Jenis basis data yang didukung: $1.
+
+Jika Anda menggunakan inang bersama, mintalah penyedia inang Anda untuk menginstal pengandar basis data yang cocok.
+Jika Anda mengompilasi sendiri PHP, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.
+Jika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal modul php5-mysql.',
+ 'config-no-fts3' => "'''Peringatan''': SQLite dikompilasi tanpa [http://sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
+ 'config-register-globals' => "'''Peringatan: Opsi <code>[http://php.net/register_globals register_globals]</code> PHP diaktifkan.'''
+'''Nonaktifkan kalau bisa.'''
+MediaWiki akan bekerja, tetapi server Anda memiliki potensi kerentanan keamanan.",
+ 'config-magic-quotes-runtime' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktif!'''
+Pilihan ini dapat merusak masukan data secara tidak terduga.
+Anda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
+ 'config-magic-quotes-sybase' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic_quotes_sybase magic_quotes_sybase] aktif!'''
+Pilihan ini dapat merusak masukan data secara tidak terduga.
+Anda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
+ 'config-mbstring' => "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] aktif!'' '
+Pilihan ini dapat menyebabkan kesalahan dan kerusakan data yang tidak terduga.
+Anda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
+ 'config-ze1' => "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] aktif!'''
+Pilihan ini dapat menyebabkan bug yang mengerikan pada MediaWiki.
+Anda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
+ 'config-safe-mode' => "''' Peringatan:''' [http://www.php.net/features.safe-mode Mode aman] PHP aktif.
+Hal ini akan menyebabkan masalah, terutama jika menggunakan pengunggahan berkas dan dukungan <code>math</code>.",
+ 'config-xml-bad' => 'Modul XML PHP hilang.
+MediaWiki membutuhkan fungsi dalam modul ini dan tidak akan bekerja dalam konfigurasi ini.
+Jika Anda menggunakan Mandrake, instal paket php-xml.',
+ 'config-pcre' => 'Modul pendukung PCRE tampaknya hilang.
+MediaWiki memerlukan fungsi persamaan reguler kompatibel Perl untuk bekerja.',
+ 'config-pcre-no-utf8' => "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.
+MediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.",
+ 'config-memory-raised' => '<code>memory_limit</code> PHP adalah $1, dinaikkan ke $2.',
+ 'config-memory-bad' => "'''Peringatan:''' <code>memory_limit</code> PHP adalah $1.
+Ini terlalu rendah.
+Instalasi terancam gagal!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] telah diinstal',
+ 'config-apc' => '[http://www.php.net/apc APC] telah diinstal',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] telah diinstal',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal',
+ 'config-no-cache' => "'''Peringatan:''' Tidak dapat menemukan [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache], atau [http://www.iis.net/download/WinCacheForPhp WinCache]. Pinggahan obyek tidak dinonaktifkan.",
+ 'config-diff3-bad' => 'GNU diff3 tidak ditemukan.',
+ 'config-imagemagick' => 'ImageMagick ditemukan: <code>$1</code> .
+Pembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.',
+ 'config-gd' => 'Pustaka grafis GD terpasang ditemukan.
+Pembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.',
+ 'config-no-scaling' => 'Pustaka GD atau ImageMagick tidak ditemukan.
+Pembuatan gambar mini dinonaktifkan.',
+ 'config-no-uri' => "'''Kesalahan:''' URI saat ini tidak dapat ditentukan.
+Instalasi dibatalkan.",
+ 'config-uploads-not-safe' => "'''Peringatan:''' Direktori bawaan pengunggahan <code>$1</code> Anda rentan terhadap eksekusi skrip yang sewenang-wenang.
+Meskipun MediaWiki memeriksa semua berkas unggahan untuk ancaman keamanan, sangat dianjurkan untuk [http://www.mediawiki.org/wiki/Manual:Security#Upload_security menutup kerentanan keamanan ini] sebelum mengaktifkan pengunggahan.",
+ 'config-brokenlibxml' => 'Sistem Anda memiliki kombinasi versi PHP dan libxml2 yang memiliki bug dan dapat menyebabkan kerusakan data tersembunyi pada MediaWiki dan aplikasi web lain.
+Mutakhirkan ke PHP 5.2.9 atau yang lebih baru dan libxml2 2.7.3 atau yang lebih baru ([http://bugs.php.net/bug.php?id=45996 arsip bug di PHP]).
+Instalasi dibatalkan.',
+ 'config-using531' => 'PHP $1 tidak kompatibel dengan MediaWiki karena bug yang melibatkan parameter referensi untuk <code>__call()</code> .
+Tingkatkan ke PHP 5.3.2 atau yang lebih baru, atau turunkan ke PHP versi 5.3.0 untuk memperbaiki ini ([http://bugs.php.net/bug.php?id=50394 arsip bug di PHP]).
+Instalasi dibatalkan.',
+ 'config-db-type' => 'Jenis basis data:',
+ 'config-db-host' => 'Inang basis data:',
+ 'config-db-host-help' => 'Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.
+
+Jika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.
+
+Jika Anda menginstal pada server Windows dan menggunakan MySQL, "localhost" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba "127.0.0.1" untuk alamat IP lokal.',
+ 'config-db-host-oracle' => 'TNS basis data:',
+ 'config-db-host-oracle-help' => 'Masukkan [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] yang sah; berkas tnsnames.ora harus dapat diakses oleh instalasi ini.<br />Jika Anda menggunakan pustaka klien 10g atau lebih baru, Anda juga dapat menggunakan metode penamaan [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identifikasi wiki ini',
+ 'config-db-name' => 'Nama basis data:',
+ 'config-db-name-help' => 'Pilih nama yang mengidentifikasikan wiki Anda.
+Nama tersebut tidak boleh mengandung spasi.
+
+Jika Anda menggunakan inang web bersama, penyedia inang Anda dapat memberikan Anda nama basis data khusus untuk digunakan atau mengizinkan Anda membuat basis data melalui panel kontrol.',
+ 'config-db-name-oracle' => 'Skema basis data:',
+ 'config-db-install-account' => 'Akun pengguna untuk instalasi',
+ 'config-db-username' => 'Nama pengguna basis data:',
+ 'config-db-password' => 'Kata sandi basis data:',
+ 'config-db-install-username' => 'Masukkan nama pengguna yang akan digunakan untuk terhubung ke basis data selama proses instalasi.
+Ini bukan nama pengguna akun MediaWiki, melainkan nama pengguna untuk basis data Anda.',
+ 'config-db-install-password' => 'Masukkan sandi yang akan digunakan untuk terhubung ke basis data selama proses instalasi.
+Ini bukan sandi untuk akun MediaWiki, melainkan sandi untuk basis data Anda.',
+ 'config-db-install-help' => 'Masukkan nama pengguna dan sandi yang akan digunakan untuk terhubung ke basis data pada saat proses instalasi.',
+ 'config-db-account-lock' => 'Gunakan nama pengguna dan kata sandi yang sama selama operasi normal',
+ 'config-db-wiki-account' => 'Akun pengguna untuk operasi normal',
+ 'config-db-wiki-help' => 'Masukkan nama pengguna dan sandi yang akan digunakan untuk terhubung ke basis data wiki selama operasi normal.
+Jika akun tidak ada, akun instalasi memiliki hak yang memadai, akun pengguna ini akan dibuat dengan hak akses minimum yang diperlukan untuk mengoperasikan wiki.',
+ 'config-db-prefix' => 'Prefiks tabel basis data:',
+ 'config-db-prefix-help' => 'Jika Anda perlu berbagi satu basis data di antara beberapa wiki, atau antara MediaWiki dan aplikasi web lain, Anda dapat memilih untuk menambahkan prefiks terhadap semua nama tabel demi menghindari konflik.
+Jangan gunakan spasi.
+
+Prefiks ini biasanya dibiarkan kosong.',
+ 'config-db-charset' => 'Set karakter basis data',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 biner',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'UTF-8 yang kompatibel balik dengan MySQL 4.0',
+ 'config-charset-help' => "'''Peringatan:''' Jika Anda menggunakan '''UTF-8 kompatibel balik''' pada MySQL 4.1+, dan kemudian mencadangkan basis data dengan <code>mysqldump</code>, proses itu mungkin menghancurkan semua karakter non-ASCII dan merusak cadangan Anda tanpa dapat dikembalikan!
+
+Dalam '''modus biner''', MediaWiki menyimpan teks UTF-8 ke basis data dalam bidang biner.
+Ini lebih efisien dibandingkan modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan berbagai karakter Unicode.
+Dalam '''modus UTF-8''', MySQL akan tahu apa set karakter data anda dan dapat menyajikan dan mengubahnya denga tepat, namun tidak akan mengizinkan Anda menyimpan karakter di atas [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+ 'config-mysql-old' => 'MySQL $1 atau versi terbaru diperlukan, Anda menggunakan $2.',
+ 'config-db-port' => 'Porta basis data:',
+ 'config-db-schema' => 'Skema untuk MediaWiki',
+ 'config-db-schema-help' => 'Skema di atas biasanya benar.
+Ubah hanya jika Anda tahu Anda perlu mengubahnya.',
+ 'config-sqlite-dir' => 'Direktori data SQLite:',
+ 'config-sqlite-dir-help' => "SQLite menyimpan semua data dalam satu berkas.
+
+Direktori yang Anda berikan harus dapat ditulisi oleh server web selama instalasi.
+
+Direktori itu '''tidak''' boleh dapat diakses melalui web, inilah sebabnya kami tidak menempatkannya bersama dengan berkas PHP lain.
+
+Penginstal akan membuat berkas <code>.htaccess</code> bersamaan dengan itu, tetapi jika gagal, orang dapat memperoleh akses ke basis data mentah Anda.
+Itu termasuk data mentah pengguna (alamat surel, hash sandi) serta revisi yang dihapus dan data lainnya yang dibatasi pada wiki.
+
+Pertimbangkan untuk menempatkan basis data di tempat lain, misalnya di <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Tablespace bawaan:',
+ 'config-oracle-temp-ts' => 'Tablespace sementara:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki mendukung sistem basis data berikut:
+
+$1
+
+Jika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.',
+ 'config-support-mysql' => '* $1 adalah target utama MediaWiki dan memiliki dukungan terbaik ([http://www.php.net/manual/en/mysql.installation.php cara mengompilasi PHP dengan dukungan MySQL])',
+ 'config-support-postgres' => '* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL])',
+ 'config-support-sqlite' => '* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)',
+ 'config-support-oracle' => '* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])',
+ 'config-header-mysql' => 'Pengaturan MySQL',
+ 'config-header-postgres' => 'Pengaturan PostgreSQL',
+ 'config-header-sqlite' => 'Pengaturan SQLite',
+ 'config-header-oracle' => 'Pengaturan Oracle',
+ 'config-invalid-db-type' => 'Jenis basis data tidak sah',
+ 'config-missing-db-name' => 'Anda harus memasukkan nilai untuk "Nama basis data"',
+ 'config-missing-db-host' => 'Anda harus memasukkan nilai untuk "Inang basis data"',
+ 'config-missing-db-server-oracle' => 'Anda harus memasukkan nilai untuk "TNS basis data"',
+ 'config-invalid-db-server-oracle' => 'TNS basis data "$1" tidak sah.
+Gunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan titik (.).',
+ 'config-invalid-db-name' => 'Nama basis data "$1" tidak sah.
+Gunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan tanda hubung (-).',
+ 'config-invalid-db-prefix' => 'Prefiks basis data "$1" tidak sah.
+Gunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan tanda hubung (-).',
+ 'config-connection-error' => '$1.
+
+Periksa nama inang, pengguna, dan sandi di bawah ini dan coba lagi.',
+ 'config-invalid-schema' => 'Skema MediaWiki "$1" tidak sah.
+Gunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), dan garis bawah (_).',
+ 'config-postgres-old' => 'PostgreSQL $1 atau versi terbaru diperlukan, Anda menggunakan $2.',
+ 'config-sqlite-name-help' => 'Pilih nama yang mengidentifikasi wiki Anda.
+Jangan gunakan spasi atau tanda hubung.
+Nama ini akan digunakan untuk nama berkas data SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Tidak dapat membuat direktori data <code><nowiki>$1</nowiki></code>, karena direktori induk <code><nowiki>$2</nowiki></code> tidak bisa ditulisi oleh server web.
+
+Penginstal telah menentukan pengguna yang menjalankan server web Anda.
+Buat direktori <code><nowiki>$3</nowiki></code> menjadi dapat ditulisi olehnya.
+Pada sistem Unix/Linux lakukan hal berikut:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Tidak dapat membuat direktori data <code><nowiki>$1</nowiki></code>, karena direktori induk <code><nowiki>$2</nowiki></code> tidak bisa ditulisi oleh server web.
+
+Penginstal tidak dapat menentukan pengguna yang menjalankan server web Anda.
+Buat direktori <code><nowiki>$3</nowiki></code> menjadi dapat ditulisi oleh semua orang.
+Pada sistem Unix/Linux lakukan hal berikut:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Kesalahan saat membuat direktori data "$1".
+Periksa lokasi dan coba lagi.',
+ 'config-sqlite-dir-unwritable' => 'Tidak dapat menulisi direktori "$1".
+Ubah hak akses direktori sehingga server web dapat menulis ke sana, dan coba lagi.',
+ 'config-sqlite-connection-error' => '$1.
+
+Periksa direktori data dan nama basis data di bawah dan coba lagi.',
+ 'config-sqlite-readonly' => 'Berkas <code>$1</code> tidak dapat ditulisi.',
+ 'config-sqlite-cant-create-db' => 'Tidak dapat membuat berkas basis data <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP tidak memiliki dukungan FTS3, tabel dituruntarafkan.',
+ 'config-can-upgrade' => "Ada tabel MediaWiki di basis dataini.
+Untuk memperbaruinya ke MediaWiki $1, klik '''Lanjut'''.",
+ 'config-upgrade-done' => "Pemutakhiran selesai.
+
+Anda sekarang dapat [$1 mulai menggunakan wiki Anda].
+
+Jika Anda ingin membuat ulang berkas <code>LocalSettings.php</code>, klik tombol di bawah ini.
+Tindakan ini '''tidak dianjurkan''' kecuali jika Anda mengalami masalah dengan wiki Anda.",
+ 'config-upgrade-done-no-regenerate' => 'Pemutakhiran selesai.
+
+Anda sekarang dapat [$1 mulai menggunakan wiki Anda].',
+ 'config-regenerate' => 'Regenerasi LocalSettings.php →',
+ 'config-show-table-status' => 'Kueri SHOW TABLE STATUS gagal!',
+ 'config-unknown-collation' => "'''Peringatan:''' basis data menggunakan kolasi yang tidak dikenal.",
+ 'config-db-web-account' => 'Akun basis data untuk akses web',
+ 'config-db-web-help' => 'Masukkan nama pengguna dan sandi yang akan digunakan server web untuk terhubung ke server basis data saat operasi normal wiki.',
+ 'config-db-web-account-same' => 'Gunakan akun yang sama seperti untuk instalasi',
+ 'config-db-web-create' => 'Buat akun jika belum ada',
+ 'config-db-web-no-create-privs' => 'Akun Anda berikan untuk instalasi tidak memiliki hak yang cukup untuk membuat akun.
+Akun yang Anda berikan harus sudah ada.',
+ 'config-mysql-engine' => 'Mesin penyimpanan:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' hampir selalu merupakan pilihan terbaik karena memiliki dukungan konkurensi yang baik.
+
+'''MyISAM''' mungkin lebih cepat dalam instalasi pengguna-tunggal atau hanya-baca.
+Basis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
+ 'config-mysql-charset' => 'Set karakter basis data:',
+ 'config-mysql-binary' => 'Biner',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "Dalam '''modus biner''', MediaWiki menyimpan teks UTF-8 untuk basis data dalam bidang biner.
+Ini lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.
+
+Dalam '''modus UTF-8''', MySQL akan tahu apa set karakter data dan dapat menampilkan dan mengubahnya sesuai keperluan, tetapi tidak akan mengizinkan Anda menyimpan karakter di atas [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+ 'config-site-name' => 'Nama wiki:',
+ 'config-site-name-help' => 'Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.',
+ 'config-site-name-blank' => 'Masukkan nama situs.',
+ 'config-project-namespace' => 'Ruang nama proyek:',
+ 'config-ns-generic' => 'Proyek',
+ 'config-ns-site-name' => 'Sama seperti nama wiki: $1',
+ 'config-ns-other' => 'Lainnya (sebutkan)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => 'Mengikuti contoh Wikipedia, banyak wiki menyimpan halaman kebijakan mereka terpisah dari halaman konten mereka, dalam "\'\'\'ruang nama proyek\'\'\'".
+Semua judul halaman dalam ruang nama ini diawali dengan prefiks tertentu yang dapat Anda tetapkan di sini.
+Biasanya, prefiks ini berasal dari nama wiki, tetapi tidak dapat berisi karakter tanda baca seperti "#" atau ":".',
+ 'config-ns-invalid' => 'Ruang nama "<nowiki>$1</nowiki>" yang ditentukan tidak sah.
+Berikan ruang nama proyek lain.',
+ 'config-admin-box' => 'Akun pengurus',
+ 'config-admin-name' => 'Nama Anda:',
+ 'config-admin-password' => 'Kata sandi:',
+ 'config-admin-password-confirm' => 'Kata sandi lagi:',
+ 'config-admin-help' => 'Masukkan nama pengguna pilihan Anda di sini, misalnya "Udin Wiki".
+Ini adalah nama yang akan Anda gunakan untuk masuk ke wiki.',
+ 'config-admin-name-blank' => 'Masukkan nama pengguna pengurus.',
+ 'config-admin-name-invalid' => 'Nama pengguna "<nowiki>$1</nowiki>" yang diberikan tidak sah.
+Berikan nama pengguna lain.',
+ 'config-admin-password-blank' => 'Masukkan kata sandi untuk akun pengurus.',
+ 'config-admin-password-same' => 'Kata sandi harus tidak sama seperti nama pengguna.',
+ 'config-admin-password-mismatch' => 'Dua kata sandi yang Anda masukkan tidak cocok.',
+ 'config-admin-email' => 'Alamat surel:',
+ 'config-admin-email-help' => 'Masukkan alamat surel untuk memungkinkan Anda menerima surel dari pengguna lain, menyetel ulang sandi, dan mendapat pemberitahuan tentang perubahan atas daftar pantauan Anda.',
+ 'config-admin-error-user' => 'Kesalahan internal saat membuat admin dengan nama "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Kesalahan internal saat membuat sandi untuk admin "<nowiki>$1</nowiki>":<pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Anda memasukkan alamat surel yang tidak sah',
+ 'config-subscribe' => 'Berlangganan ke [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce milis pengumuman rilis].',
+ 'config-subscribe-help' => 'Ini adalah milis bervolume rendah yang digunakan untuk pengumuman rilis, termasuk pengumuman keamanan penting.
+Anda sebaiknya berlangganan dan memperbarui instalasi MediaWiki saat versi baru keluar.',
+ 'config-almost-done' => 'Anda hampir selesai!
+Anda sekarang dapat melewati sisa konfigurasi dan menginstal wiki sekarang.',
+ 'config-optional-continue' => 'Berikan saya pertanyaan lagi.',
+ 'config-optional-skip' => 'Saya sudah bosan, instal saja wikinya.',
+ 'config-profile' => 'Profil hak pengguna:',
+ 'config-profile-wiki' => 'Wiki tradisional',
+ 'config-profile-no-anon' => 'Pembuatan akun diperlukan',
+ 'config-profile-fishbowl' => 'Khusus penyunting terdaftar',
+ 'config-profile-private' => 'Wiki pribadi',
+ 'config-profile-help' => "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting.
+Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.
+
+Namun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki.
+Jadi, Anda yang menentukan.
+
+'''{{int:config-profil-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk.
+'''{{int:config-profil-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mencegah kontributor biasa.
+
+'''{{int:config-profil-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.
+'''{{int:config-profil-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.
+
+Konfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [http://www.mediawiki.org/wiki/Manual:User_rights/id entri manual terkait].",
+ 'config-license' => 'Hak cipta dan lisensi:',
+ 'config-license-none' => 'Tidak ada lisensi',
+ 'config-license-cc-by-sa' => 'Creative Commons Atribusi Berbagi Serupa',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Atribusi Non-Komersial Berbagi Serupa',
+ 'config-license-gfdl-old' => 'Lisensi Dokumentasi Bebas GNU 1.2',
+ 'config-license-gfdl-current' => 'Lisensi Dokumentasi Bebas GNU 1.3 atau versi terbaru',
+ 'config-license-pd' => 'Domain Umum',
+ 'config-license-cc-choose' => 'Pilih lisensi Creative Commons kustom',
+ 'config-license-help' => "Banyak wiki publik meletakkan semua kontribusi di bawah [http://freedomdefined.org/Definition lisensi bebas].
+Hal ini membantu untuk menciptakan rasa kepemilikan komunitas dan mendorong kontribusi jangka panjang.
+Ini umumnya tidak diperlukan untuk wiki pribadi atau perusahaan.
+
+Jika Anda ingin dapat menggunakan teks dari Wikipedia dan Anda ingin Wikipedia untuk dapat menerima teks yang disalin dari wiki Anda, Anda harus memilih'''Creative Commons Attribution Share Alike'''.
+
+GNU Free Documentation License adalah lisensi sebelumnya dari Wikipedia.
+Lisensi ini masih sah, namun memiliki beberapa fitur yang menyulitkan pemakaian ulang dan interpretasi.",
+ 'config-email-settings' => 'Pengaturan surel',
+ 'config-enable-email' => 'Aktifkan surel keluar',
+ 'config-enable-email-help' => 'Jika Anda ingin mengaktifkan surel, [http://www.php.net/manual/en/mail.configuration.php setelah surel PHP] perlu dikonfigurasi dengan benar.
+Jika Anda tidak perlu fitur surel, Anda dapat menonaktifkannya di sini.',
+ 'config-email-user' => 'Aktifkan surel antarpengguna',
+ 'config-email-user-help' => 'Memungkinkan semua pengguna untuk saling berkirim surel jika mereka mengaktifkan pilihan tersebut dalam preferensi mereka.',
+ 'config-email-usertalk' => 'Aktifkan pemberitahuan perubahan halaman pembicaraan pengguna',
+ 'config-email-usertalk-help' => 'Memungkinkan pengguna untuk menerima pemberitahuan tentang perubahan halaman pembicaraan pengguna, jika pilihan tersebut telah diaktifkan dalam preferensi mereka.',
+ 'config-email-watchlist' => 'Aktifkan pemberitahuan daftar pantau',
+ 'config-email-watchlist-help' => 'Memungkinkan pengguna untuk menerima pemberitahuan tentang perubahan halaman yang ada dalam daftar pantauan mereka, jika pilihan tersebut telah diaktifkan dalam preferensi mereka.',
+ 'config-email-auth' => 'Aktifkan otentikasi surel',
+ 'config-email-auth-help' => "Jika opsi ini diaktifkan, pengguna harus mengonfirmasi alamat surel dengan menggunakan pranala yang dikirim kepadanya setiap kali mereka mengatur atau mengubahnya.
+Hanya alamat surel yang dikonfirmasi yang dapat menerima surel dari pengguna lain atau surel pemberitahuan perubahan.
+Penetapan opsi ini '''direkomendasikan''' untuk wiki publik karena adanya potensi penyalahgunaan fitur surel.",
+ 'config-email-sender' => 'Alamat surel balasan:',
+ 'config-email-sender-help' => 'Masukkan alamat surel untuk digunakan sebagai alamat pengirim pada surel keluar.
+Alamat ini akan menerima pentalan.
+Banyak server surel mensyaratkan paling tidak bagian nama domain yang sah.',
+ 'config-upload-settings' => 'Pengunggahan gambar dan berkas',
+ 'config-upload-enable' => 'Aktifkan pengunggahan berkas',
+ 'config-upload-help' => 'Pengunggahan berkas berpotensi memaparkan server Anda dengan risiko keamanan.
+Untuk informasi lebih lanjut, baca [http://www.mediawiki.org/wiki/Manual:Security/id manual keamanan].
+
+Untuk mengaktifkan pengunggahan berkas, ubah modus subdirektori <code>images</code> di bawah direktori akar MediaWiki agar server web dapat menulis ke sana.
+Kemudian aktifkan opsi ini.',
+ 'config-upload-deleted' => 'Direktori untuk berkas terhapus:',
+ 'config-upload-deleted-help' => 'Pilih direktori tempat mengarsipkan berkas yang dihapus.
+Idealnya, direktori ini tidak boleh dapat diakses dari web.',
+ 'config-logo' => 'URL logo:',
+ 'config-logo-help' => 'Kulit bawaan MediaWiki memberikan ruang untuk logo ukuran 135x160 pixel di sudut kiri atas.
+Unggah gambar dengan ukuran yang sesuai, lalu masukkan URL di sini.
+
+Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.',
+ 'config-instantcommons' => 'Aktifkan Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] adalah fitur yang memungkinkan wiki untuk menggunakan gambar, suara, dan media lain dari [http://commons.wikimedia.org/ Wikimedia Commons].
+Untuk melakukannya, MediaWiki memerlukan akses ke Internet.
+
+Untuk informasi lebih lanjut tentang fitur ini, termasuk petunjuk tentang cara untuk mengatur untuk wiki selain Wikimedia Commons, baca [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos manual].',
+ 'config-cc-error' => 'Pemilih lisensi Creative Commons tidak memberikan hasil.
+Masukkan nama lisensi secara manual.',
+ 'config-cc-again' => 'Pilih lagi...',
+ 'config-cc-not-chosen' => 'Pilih lisensi Creative Commons yang Anda inginkan dan klik "lanjutkan".',
+ 'config-advanced-settings' => 'Konfigurasi lebih lanjut',
+ 'config-cache-options' => 'Pengaturan untuk penyinggahan objek:',
+ 'config-cache-help' => 'Penyinggahan objek digunakan untuk meningkatkan kecepatan MediaWiki dengan menyinggahkan data yang sering digunakan.
+Situs berukuran sedang hingga besar sangat dianjurkan untuk mengaktifkan fitur ini, dan situs kecil juga akan merasakan manfaatnya.',
+ 'config-cache-none' => 'Tidak ada penyinggahan (tidak ada fungsi yang dibuang, tetapi kecepatan dapat terpengaruh pada situs wiki yang besar)',
+ 'config-cache-accel' => 'Penyinggahan objek PHP (APC, eAccelerator, XCache atau WinCache)',
+ 'config-cache-memcached' => 'Gunakan Memcached (memerlukan setup dan konfigurasi tambahan)',
+ 'config-memcached-servers' => 'Server Memcached:',
+ 'config-memcached-help' => 'Daftar alamat IP yang digunakan untuk Memcached.
+Harus dipisahkan dengan koma dan sebutkan port yang akan digunakan (contoh: 127.0.0.1:11211, 192.168.1.25:11211).',
+ 'config-extensions' => 'Ekstensi',
+ 'config-extensions-help' => 'Ekstensi yang tercantum di atas terdeteksi di direktori <code>./extensions</code>.
+
+Ekstensi tersebut mungkin memerlukan konfigurasi tambahan, tetapi Anda dapat mengaktifkannya sekarang.',
+ 'config-install-alreadydone' => "'''Peringatan:''' Anda tampaknya telah menginstal MediaWiki dan mencoba untuk menginstalnya lagi.
+Lanjutkan ke halaman berikutnya.",
+ 'config-install-step-done' => 'selesai',
+ 'config-install-step-failed' => 'gagal',
+ 'config-install-extensions' => 'Termasuk ekstensi',
+ 'config-install-database' => 'Mendirikan basis data',
+ 'config-install-pg-schema-failed' => 'Pembuatan tabel gagal.
+Pastikan bahwa pengguna "$1" dapat menulis ke skema "$2".',
+ 'config-install-pg-commit' => 'Melakukan perubahan',
+ 'config-install-pg-plpgsql' => 'Memeriksa bahasa PL / pgSQL',
+ 'config-pg-no-plpgsql' => 'Anda perlu menginstal bahasa PL/pgSQL pada basis data $1',
+ 'config-install-user' => 'Membuat pengguna basis data',
+ 'config-install-user-grant-failed' => 'Memberikan izin untuk pengguna "$1" gagal: $2',
+ 'config-install-tables' => 'Membuat tabel',
+ 'config-install-tables-exist' => "'''Peringatan''': Tabel MediaWiki sepertinya sudah ada.
+Melompati pembuatan.",
+ 'config-install-tables-failed' => "'''Kesalahan''': Pembuatan tabel gagal dengan kesalahan berikut: $1",
+ 'config-install-interwiki' => 'Mengisi tabel bawaan antarwiki',
+ 'config-install-interwiki-list' => 'Tidak dapat menemukan berkas <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Peringatan''': Tabel antarwiki tampaknya sudah memiliki entri.
+Mengabaikan daftar bawaan.",
+ 'config-install-keys' => 'Menciptakan kunci rahasia',
+ 'config-install-sysop' => 'Membuat akun pengguna pengurus',
+ 'config-install-subscribe-fail' => 'Tidak dapat berlangganan mediawiki-announce',
+ 'config-install-mainpage' => 'Membuat halaman utama dengan konten bawaan',
+ 'config-install-mainpage-failed' => 'Tidak dapat membuat halaman utama: $1',
+ 'config-install-done' => "'''Selamat!'''
+Anda telah berhasil menginstal MediaWiki.
+
+Penginstal telah membuat berkas <code>LocalSettings.php</code>.
+Berkas itu berisi semua konfigurasi Anda.
+
+Anda perlu [$1 mengunduhnya] dan meletakkannya di basis instalasi wiki (direktori yang sama dengan index.php).
+'''Catatan''': Jika Anda tidak melakukannya sekarang, berkas konfigurasi yang dihasilkan ini tidak akan tersedia lagi setelah Anda keluar instalasi tanpa mengunduhnya.
+
+Setelah melakukannya, Anda dapat '''[$2 memasuki wiki Anda]'''.",
+ 'config-download-localsettings' => 'Unduh LocalSettings.php',
+ 'config-help' => 'bantuan',
+);
+
+/** Igbo (Igbo)
+ * @author Ukabia
+ */
+$messages['ig'] = array(
+ 'config-admin-password' => 'Okwúngáfè:',
+ 'config-admin-password-confirm' => 'Okwúngáfè mgbe ozor:',
+);
+
+/** Italian (Italiano)
+ * @author Beta16
+ */
+$messages['it'] = array(
+ 'config-information' => 'Informazioni',
+ 'config-back' => '↠Indietro',
+ 'config-continue' => 'Continua →',
+ 'config-page-language' => 'Lingua',
+ 'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opzioni',
+ 'config-page-install' => 'Installa',
+ 'config-page-complete' => 'Completa!',
+ 'config-page-readme' => 'Leggimi',
+ 'config-page-releasenotes' => 'Note di versione',
+);
+
+/** Japanese (日本語)
+ * @author Aphaia
+ * @author Iwai.masaharu
+ * @author Mizusumashi
+ * @author Ohgi
+ * @author Whym
+ * @author Yanajin66
+ * @author é’å­å®ˆæ­Œ
+ */
+$messages['ja'] = array(
+ 'config-desc' => 'MediaWikiã®ãŸã‚ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ©ãƒ¼',
+ 'config-title' => 'MediaWiki $1ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«',
+ 'config-information' => '情報',
+ 'config-localsettings-upgrade' => '<code>LocalSettings.php</code>ファイルãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚
+アップグレードã™ã‚‹ãŸã‚ã€ãƒœãƒƒã‚¯ã‚¹ä¸­ã®<code>$wgUpgradeKey</code>ã®å€¤ã‚’入力ã—ã¦ãã ã•ã„。
+LocalSettings.phpã®ä¸­ã«ãã‚Œã¯ã‚ã‚‹ã§ã—ょã†ã€‚',
+ 'config-localsettings-key' => 'アップグレードキー:',
+ 'config-localsettings-badkey' => '与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ãŒé–“é•ã£ã¦ã„ã¾ã™',
+ 'config-localsettings-incomplete' => 'ç¾åœ¨ã®LocalSettings.phpã¯ä¸å®Œå…¨ã§ã‚るよã†ã§ã™ã€‚
+変数$1ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。
+LocalSettings.phpを変更ã—ã¦ã“ã®å¤‰æ•°ã‚’設定ã—ã¦ã€ã€Ž{{int:Config-continue}}ã€ã‚’押ã—ã¦ãã ã•ã„。',
+ 'config-session-error' => 'セッションã®é–‹å§‹ã‚¨ãƒ©ãƒ¼ï¼š$1',
+ 'config-session-expired' => 'セッションã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚ŒãŸã‚ˆã†ã§ã™ã€‚
+セッションã®æœ‰åŠ¹æœŸé–“ã¯$1ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
+php.iniã®<code>session.gc_maxlifetime</code>を設定ã™ã‚‹ã“ã¨ã§ã€ã“ã®å•é¡Œã‚’改善ã§ãã¾ã™ã€‚
+インストール作業をå†èµ·å‹•ã•ã›ã¦ãã ã•ã„。',
+ 'config-no-session' => 'セッションã®ãƒ‡ãƒ¼ã‚¿ãŒæ失ã—ã¾ã—ãŸï¼
+php.iniを確èªã—ã€<code>session.save_path</code>ãŒé©åˆ‡ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¨­å®šã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確ã‹ã‚ã¦ä¸‹ã•ã„。',
+ 'config-your-language' => 'ã‚ãªãŸã®è¨€èªžï¼š',
+ 'config-your-language-help' => 'インストール作業中ã«åˆ©ç”¨ã™ã‚‹è¨€èªžã‚’é¸ã‚“ã§ä¸‹ã•ã„。',
+ 'config-wiki-language' => 'ウィキã®è¨€èªžï¼š',
+ 'config-wiki-language-help' => 'ãã®ã‚¦ã‚£ã‚­ã§ä¸»ã«æ›¸ãè¾¼ã¾ã‚Œã‚‹è¨€èªžã‚’é¸ã‚“ã§ä¸‹ã•ã„。',
+ 'config-back' => 'â†æˆ»ã‚‹',
+ 'config-continue' => '続行→',
+ 'config-page-language' => '言語',
+ 'config-page-welcome' => 'MediaWikiã¸ã‚ˆã†ã“ãï¼',
+ 'config-page-dbconnect' => 'データベースã¸æŽ¥ç¶š',
+ 'config-page-upgrade' => '既存ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’æ›´æ–°',
+ 'config-page-dbsettings' => 'データベースã®è¨­å®š',
+ 'config-page-name' => 'åå‰',
+ 'config-page-options' => 'オプション',
+ 'config-page-install' => 'インストール',
+ 'config-page-complete' => '完了ï¼',
+ 'config-page-restart' => 'インストールをå†èµ·å‹•',
+ 'config-page-readme' => 'リードミー',
+ 'config-page-releasenotes' => 'リリースノート',
+ 'config-page-copying' => 'コピー',
+ 'config-page-upgradedoc' => 'æ›´æ–°',
+ 'config-page-existingwiki' => '既存ã®ã‚¦ã‚£ã‚­',
+ 'config-help-restart' => '入力ã•ã‚ŒãŸå…¨ã¦ä¿å­˜ãƒ‡ãƒ¼ã‚¿ã‚’消去ã—ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä½œæ¥­ã‚’å†èµ·å‹•ã—ã¾ã™ã‹ï¼Ÿ',
+ 'config-restart' => 'ã¯ã„ã€å†èµ·å‹•ã—ã¾ã™',
+ 'config-welcome' => '=== 環境ã®ç¢ºèª ===
+基本的ãªç¢ºèªã§ã¯ã€ã“ã®ç’°å¢ƒãŒMediaWikiã®å°Žå…¥ã«é©ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¾ã™ã€‚
+インストール中ã«å¿…è¦ã«ãªã£ãŸã¨ãã€ã“ã®ç¢ºèªçµæžœã‚’利用ã—ã¦ä¸‹ã•ã„。',
+ 'config-copyright' => '=== 著作権ãŠã‚ˆã³è¦ç´„ ===
+$1
+
+ã“ã®ä½œå“ã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚ã‚ãªãŸã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ã®ç™ºè¡Œã™ã‚‹GNU一般公衆利用許諾書 (GNU General Public License)(ãƒãƒ¼ã‚¸ãƒ§ãƒ³2ã€ã¾ãŸã¯ãれ以é™ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ï¼‰ã®è¦ç´„ã«ã‚‚ã¨ã¥ãã€ã“ã®ãƒ©ã‚¤ãƒ–ラリã®å†é…布や改変をã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ã“ã®ä½œå“ã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€å•†ç”¨ã‚ã‚‹ã„ã¯ç‰¹å®šã®ç›®çš„ã«é©ã™ã‚‹ã‹ã©ã†ã‹ã‚‚å«ã‚ã¦ã€æš—黙的ã«ã‚‚ã€ä¸€åˆ‡ä¿è¨¼ã•ã‚Œã¾ã›ã‚“。
+詳ã—ãã¯ã€GNU一般公衆利用許諾書をã”覧下ã•ã„。
+
+ã‚ãªãŸã¯ã“ã®ãƒ—ログラムã¨å…±ã«ã€<doclink href=Copying>GNU一般公衆利用許諾契約書ã®è¤‡è£½</doclink>を一部å—ã‘å–ã£ãŸã¯ãšã§ã™ã€‚ã‚‚ã—å—ã‘å–ã£ã¦ã„ãªã‘ã‚Œã°ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£(宛先㯠the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)ã¾ã§è«‹æ±‚ã—ã¦ãã ã•ã„。',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWikiã®ãƒ›ãƒ¼ãƒ ]
+* [http://www.mediawiki.org/wiki/Help:Contents 利用者å‘ã‘案内]
+* [http://www.mediawiki.org/wiki/Manual:Contents 管ç†è€…å‘ã‘案内]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>ãŠèª­ã¿ãã ã•ã„</doclink>
+* <doclink href=ReleaseNotes>リリースノート</doclink>
+* <doclink href=Copying>コピー</doclink>
+* <doclink href=UpgradeDoc>アップグレード</doclink>',
+ 'config-env-good' => '環境ã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
+MediaWikiをインストール出æ¥ã¾ã™ã€‚',
+ 'config-env-bad' => '環境ãŒç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
+MediaWikiをインストール出æ¥ã¾ã›ã‚“。',
+ 'config-env-php' => 'PHP $1ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+ 'config-unicode-using-utf8' => 'Unicodeæ­£è¦åŒ–ã«ã€Brion Vibberã®utf8_normalize.soを利用。',
+ 'config-unicode-using-intl' => 'Unicodeæ­£è¦åŒ–ã«[http://pecl.php.net/intl intl PECL 拡張機能]を利用。',
+ 'config-unicode-pure-php-warning' => "'''警告''':Unicodeæ­£è¦åŒ–ã®å‡¦ç†ã« [http://pecl.php.net/intl intl PECL 拡張機能]ã§ã¯ãªãã€ãƒ”ュア PHP ãªå®Ÿè£…を用ã„ã¦ã„ã¾ã™ã€‚ã“ã®å‡¦ç†ã¯é…ã„ã§ã™ã€‚
+高トラフィックã®ã‚µã‚¤ãƒˆã‚’é‹å–¶ã™ã‚‹å ´åˆã¯ã€[http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicodeæ­£è¦åŒ–ã«é–¢ã™ã‚‹ãƒšãƒ¼ã‚¸]ã‚’ãŠèª­ã¿ä¸‹ã•ã„。",
+ 'config-unicode-update-warning' => "'''警告''':Unicodeæ­£è¦åŒ–ラッパーã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã€[http://site.icu-project.org/ ICUプロジェクト]ã®ãƒ©ã‚¤ãƒ–ラリã®å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã„ã¾ã™ã€‚
+Unicodeã‚’å°‘ã—ã§ã‚‚利用ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãªã‚‰ã€[http://www.mediawiki.org/wiki/Unicode_normalization_considerations æ›´æ–°]ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚",
+ 'config-no-db' => 'é©åˆ‡ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸï¼',
+ 'config-no-db-help' => 'PHPã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã‚’インストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+以下ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç¨®é¡žãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ï¼š$1。
+
+共有ホスト上ã®å ´åˆã€ãƒ›ã‚¹ãƒˆå…ƒã«é©åˆ‡ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã‚’インストールã™ã‚‹ã‚ˆã†ã«ä¾é ¼ã—ã¦ãã ã•ã„。
+PHPを自分自身ã§ã‚³ãƒ³ãƒ‘イルã—ãŸå ´åˆã€<code>./configure --with-mysql</code>ãªã©ã‚’利用ã—ã¦ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚’有効化ã™ã‚‹è¨­å®šã‚’ã—ã¦ãã ã•ã„。
+Debianã‚‚ã—ãã¯Ubuntuパッケージã‹ã‚‰PHPをインストールã—ãŸå ´åˆã€php5-mysqlモジュールもインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'config-no-fts3' => "'''警告''':SQLiteã¯[http://sqlite.org/fts3.html FTS3]モジュール以外ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ãŠã‚Šã€æ¤œç´¢æ©Ÿèƒ½ã¯ã“ã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§åˆ©ç”¨ä¸å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚",
+ 'config-register-globals' => "'''警告:PHPã®<code>[http://php.net/register_globals register_globals]</code>オプションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚'''
+'''å¯èƒ½ãªã‚‰ç„¡åŠ¹åŒ–ã—ã¦ãã ã•ã„。'''
+MediaWikiã¯å‹•ä½œã—ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ã€æ½œåœ¨çš„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è„†å¼±æ€§ã‚’露呈ã—ã¾ã™ã€‚",
+ 'config-magic-quotes-runtime' => "'''致命的エラー:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
+ã“ã®ã‚ªãƒ—ションã¯ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿å…¥åŠ›ã‚’破壊ã—ã¾ã™ã€‚
+ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
+ 'config-magic-quotes-sybase' => "'''致命的エラー:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
+ã“ã®ã‚ªãƒ—ションã¯ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿å…¥åŠ›ã‚’破壊ã—ã¾ã™ã€‚
+ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
+ 'config-mbstring' => "'''致命的エラー:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
+ã“ã®ã‚ªãƒ—ションã¯ã€ã‚¨ãƒ©ãƒ¼ã‚’引ãèµ·ã“ã—ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿å…¥åŠ›ã‚’破壊ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
+ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
+ 'config-ze1' => "'''致命的エラー:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
+ã“ã®ã‚ªãƒ—ションã¯ã€MediaWikiã«ãŠã„ã¦æ·±åˆ»ãªãƒã‚°ã‚’引ãèµ·ã“ã—ã¾ã™ã€‚
+ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
+ 'config-safe-mode' => "'''警告:'''PHPã®[http://www.php.net/features.safe-mode セーフモード]ãŒæœ‰åŠ¹ã§ã™ã€‚
+特ã«ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロード<code>math</code>ã®ã‚µãƒãƒ¼ãƒˆã«ãŠã„ã¦ã€å•é¡ŒãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚",
+ 'config-xml-bad' => 'PHPã®XMLモジュールãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
+MediaWikiã¯ã€ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®é–¢æ•°ã‚’å¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®æ§‹æˆã§ã¯å‹•ä½œã—ã¾ã›ã‚“。
+Mandrakeを実行ã—ã¦ã„ã‚‹å ´åˆã€php-xmlパッケージをインストールã—ã¦ãã ã•ã„。',
+ 'config-pcre' => 'PCREをサãƒãƒ¼ãƒˆã—ã¦ã„るモジュールãŒä¸è¶³ã—ã¦ã„るよã†ã§ã™ã€‚
+MediaWikiã¯ã€Perl互æ›ã®æ­£è¦è¡¨ç¾é–¢æ•°ã®å‹•ä½œãŒå¿…è¦ã§ã™ã€‚',
+ 'config-pcre-no-utf8' => "'''致命的エラー''': PHPã®PCREãŒPCRE_UTF8サãƒãƒ¼ãƒˆç„¡ã—ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã™ã€‚
+MediaWikiã«ã¯UTF-8サãƒãƒ¼ãƒˆã®é–¢æ•°ãŒå¿…è¦ã§ã™ã€‚",
+ 'config-memory-raised' => 'PHPã®<code>memory_limit</code>ã¯$1ã§ã€$2ã«å¼•ã上ã’られã¾ã—ãŸã€‚',
+ 'config-memory-bad' => "'''警告:'''PHPã®<code>memory_limit</code>ã¯$1ã§ã™ã€‚
+ã“ã‚Œã¯ã€éžå¸¸ã«é…ã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
+インストールãŒå¤±æ•—ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ï¼",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
+ 'config-apc' => '[http://www.php.net/apc APC]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
+ 'config-no-cache' => "'''警告:'''[http://eaccelerator.sourceforge.net eAccelerator]ã€[http://www.php.net/apc APC]ã€[http://trac.lighttpd.net/xcache/ XCache]ã‚ã‚‹ã„ã¯[http://www.iis.net/download/WinCacheForPhp WinCache]ã®ã„ãšã‚Œã‚‚見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+オブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¾ã›ã‚“。",
+ 'config-diff3-bad' => 'GNU diff3ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
+ 'config-imagemagick' => 'ImageMagickãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼š<code>$1</code>。
+アップロードãŒæœ‰åŠ¹ãªã‚‰ã€ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚',
+ 'config-gd' => 'GDç”»åƒãƒ©ã‚¤ãƒ–ラリãŒå†…蔵ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
+アップロードãŒæœ‰åŠ¹ãªã‚‰ã€ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚',
+ 'config-no-scaling' => 'GDライブラリもImageMagickも見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ç”Ÿæˆã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚',
+ 'config-no-uri' => "'''エラー:'''ç¾åœ¨ã®URIを決定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+インストールã¯ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚",
+ 'config-uploads-not-safe' => "'''警告:'''アップロードã®æ—¢å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª<code>$1</code>ãŒã€ä»»æ„ã®ã‚¹ã‚¯ãƒªãƒ—ト実行ã«é–¢ã—ã¦è„†å¼±æ€§ãŒã‚ã‚Šã¾ã™ã€‚
+MediaWikiã¯ã‚¢ãƒƒãƒ—ロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®è„…å¨ã‚’確èªã—ã¾ã™ãŒã€ã‚¢ãƒƒãƒ—ロードを有効化ã™ã‚‹ã¾ãˆã«ã€[http://www.mediawiki.org/wiki/Manual:Security#Upload_security ã“ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®è„†å¼±æ€§ã‚’é–‰ã˜ã‚‹]ã“ã¨ãŒå¼·ã推奨ã•ã‚Œã¾ã™ã€‚",
+ 'config-brokenlibxml' => 'ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ä½¿ã‚ã‚Œã¦ã„ã‚‹PHPã¨libxml2ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã“ã®çµ„ã¿åˆã‚ã›ã«ã¯ãƒã‚°ãŒã‚ã‚Šã¾ã™ã€‚具体的ã«ã¯ã€MediaWikiã‚„ãã®ä»–ã®ã‚¦ã‚§ãƒ–アプリケーションã§hiddenデータãŒç ´æã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
+PHPã‚’5.2.9ã‹ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã€libxml2ã‚’2.7.3ã‹ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„([http://bugs.php.net/bug.php?id=45996 PHPã§ã®ãƒã‚°æƒ…å ±])。
+インストールを終了ã—ã¾ã™ã€‚',
+ 'config-using531' => 'PHP$1ã¯<code>__call()</code>ã®å¼•æ•°å‚ç…§ã«é–¢ã™ã‚‹ãƒã‚°ã®ãŸã‚ã€MediaWikiã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。
+PHP5.3.2以é™ã«æ›´æ–°ã™ã‚‹ã‹ã€ã“ã®([http://bugs.php.net/bug.php?id=50394 PHPã«æ出ã•ã‚ŒãŸãƒã‚°])を修正ã™ã‚‹ãŸã‚ã«PHP5.3.0ã¸æˆ»ã—ã¦ãã ã•ã„。
+インストールã¯ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚',
+ 'config-db-type' => 'データベースã®ç¨®é¡žï¼š',
+ 'config-db-host' => 'データベースã®ãƒ›ã‚¹ãƒˆï¼š',
+ 'config-db-host-help' => 'データベースサーãƒãƒ¼ãŒç•°ãªã£ãŸã‚µãƒ¼ãƒãƒ¼ä¸Šã«ã‚ã‚‹å ´åˆã€ãƒ›ã‚¹ãƒˆåã¾ãŸã¯IPアドレスをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
+
+ã‚‚ã—ã€å…±æœ‰ã•ã‚ŒãŸã‚¦ã‚§ãƒ–ホスティングを使用ã—ã¦ã„ã‚‹å ´åˆã€ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°ãƒ»ãƒ—ロãƒã‚¤ãƒ€ã¯æ­£ç¢ºãªãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ã‚’解説ã—ã¦ã„ã‚‹ã¯ãšã§ã™ã€‚
+
+Windowsã§MySQLを使用ã—ã¦ã„ã‚‹å ´åˆã«ã€ã€Œlocalhostã€ã¯ã€ã‚µãƒ¼ãƒãƒ¼åã¨ã—ã¦ã¯ã†ã¾ãåƒã‹ãªã„ã§ã—ょã†ã€‚ã‚‚ã—ãã®ã‚ˆã†ãªå ´åˆã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«IPアドレスã¨ã—ã¦ã€Œ127.0.0.1ã€ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„。',
+ 'config-db-host-oracle' => 'データベースTNS:',
+ 'config-db-host-oracle-help' => '有効ãª[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続å]を入力ã—ã¦ãã ã•ã„。tnsnames.oraファイルã¯ã€ã“ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¯¾ã—ã¦è¡¨ç¤ºã•ã‚Œã¦ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ã€<br />ã‚‚ã—クライアントライブラリ10gã‚‚ã—ãã¯ãれ以上を使用ã—ã¦ã„ã‚‹å ´åˆã€ãƒ¡ã‚½ãƒƒãƒ‰ã®åå‰ã‚’[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易接続]ã§åˆ©ç”¨ã§ãã¾ã™ã€‚',
+ 'config-db-wiki-settings' => 'ã“ã®ã‚¦ã‚£ã‚­ã‚’識別',
+ 'config-db-name' => 'データベースå:',
+ 'config-db-name-help' => 'ã“ã®ã‚¦ã‚£ã‚­ã‚’識別ã™ã‚‹åå‰ã‚’é¸ã‚“ã§ä¸‹ã•ã„。
+スペースをå«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+
+共有ウェブホストを利用ã—ã¦ã„ã‚‹å ´åˆã€ãƒ›ã‚¹ãƒˆãƒ»ãƒ—ロãƒã‚¤ãƒ€ãƒ¼ã¯ç‰¹å®šã®åˆ©ç”¨å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã‚’æä¾›ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ç®¡ç†ãƒ‘ãƒãƒ«ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’作æˆã§ãるよã†ã«ã—ã¦ã„ã‚‹ã§ã—ょã†ã€‚',
+ 'config-db-name-oracle' => 'データベースã®ã‚¹ã‚­ãƒ¼ãƒžï¼š',
+ 'config-db-install-account' => 'インストールã®ãŸã‚ã®åˆ©ç”¨è€…アカウント',
+ 'config-db-username' => 'データベースã®åˆ©ç”¨è€…å:',
+ 'config-db-password' => 'データベースã®ãƒ‘スワード:',
+ 'config-db-install-username' => 'インストール中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ä½¿ã†ãƒ¦ãƒ¼ã‚¶åを入力ã—ã¦ãã ã•ã„。ã“れ㯠MediaWiki アカウントã®ãƒ¦ãƒ¼ã‚¶å (利用者å) ã®ã“ã¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã®ãƒ¦ãƒ¼ã‚¶åã§ã™ã€‚',
+ 'config-db-install-password' => 'インストール中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ä½¿ã†ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。ã“れ㯠MediaWiki アカウントパスワードã®ã“ã¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã®ãƒ‘スワードã§ã™ã€‚',
+ 'config-db-install-help' => 'インストール作業中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã®åˆ©ç”¨è€…åã¨ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。',
+ 'config-db-account-lock' => 'インストール作業終了後もåŒã˜åˆ©ç”¨è€…åã¨ãƒ‘スワードを使用ã™ã‚‹',
+ 'config-db-wiki-account' => 'インストール作業終了後ã®åˆ©ç”¨è€…アカウント',
+ 'config-db-wiki-help' => '通常ã®ã‚¦ã‚£ã‚­æ“作中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æŽ¥ç¶šã™ã‚‹æ™‚ã«åˆ©ç”¨ã™ã‚‹åˆ©ç”¨è€…åã¨ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。
+アカウントãŒãªã„ãŒã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«å分ãªæ¨©é™ãŒã‚ã‚Œã°ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã€ã‚¦ã‚£ã‚­ã‚’æ“作ã™ã‚‹ã†ãˆã§æœ€å°é™ã®æ¨©é™ã‚’æŒã£ãŸçŠ¶æ…‹ã§ä½œæˆã•ã‚Œã¾ã™ã€‚',
+ 'config-db-prefix' => 'データベーステーブルã®æŽ¥é ­è¾žï¼š',
+ 'config-db-prefix-help' => 'データベースを複数ã®ã‚¦ã‚£ã‚­é–“ã€ã‚‚ã—ãã¯MediaWikiã¨ä»–ã®ã‚¦ã‚§ãƒ–アプリケーションã§å…±æœ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã€è¡çªã‚’é¿ã‘ã‚‹ãŸã‚ã«ã€ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルåã«æŽ¥é ­è¾žã‚’ã¤ã‘ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+スペースã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。
+
+ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯ã€é€šå¸¸ã¯ç©ºã®ã¾ã¾ã§ã™ã€‚',
+ 'config-db-charset' => 'データベースã®æ–‡å­—セット',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0ãƒã‚¤ãƒŠãƒª',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 下ä½äº’æ›UTF-8',
+ 'config-charset-help' => "'''警告:'''MySQL 4.1+ã§'''下ä½äº’æ›UTF-8'''を使用ã—ã€ãã®å¾Œ<code>mysqldump</code>ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®éžASCII文字ãŒç ´å£Šã•ã‚Œã€ä¸å¯é€†çš„ã«ãƒãƒƒãƒ—アップãŒå£Šã‚Œã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+'''ãƒã‚¤ãƒŠãƒªãƒ¼ç³»å¼'''ã§ã¯ã€MediaWikiã¯ã€UTF-8テキストをã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒã‚¤ãƒŠãƒªãƒ¼ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«æ ¼ç´ã—ã¾ã™ã€‚
+ã“ã‚Œã¯ã€MySQLã®UTF-8å½¢å¼ã‚ˆã‚ŠåŠ¹çŽ‡çš„ã§ã€ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰æ–‡å­—ã®å…¨ç¯„囲を利用ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
+'''UTF-8å½¢å¼'''ã§ã¯ã€MySQLã¯ã€ãªã‚“ã®æ–‡å­—集åˆãŒãƒ‡ãƒ¼ã‚¿ã®ãªã‹ã«å«ã¾ã‚Œã¦ã„ã‚‹ã‹ã‚’知りã€ãã‚Œã«å¯¾ã—ã¦é©åˆ‡ãªæ示ã¨å¤‰æ›ã‚’ã™ã‚‹ã§ã—ょã†ãŒã€
+[http://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語é¢]ã®å¤–ã«ã‚る文字を格ç´ã§ãるよã†ã«ã¯ãªã‚Šã¾ã›ã‚“。",
+ 'config-mysql-old' => 'MySQLã®$1以é™ãŒè¦æ±‚ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚ãªãŸã®æ‰€æœ‰ã®ã‚‚ã®ã¯$2ã§ã™ã€‚',
+ 'config-db-port' => 'データベースãƒãƒ¼ãƒˆ:',
+ 'config-db-schema' => 'メディアウィキã®å›³å¼',
+ 'config-db-schema-help' => '上ã®å›³å¼ã¯å¸¸ã«æ­£ç¢ºã§ã™ã€‚
+å¿…è¦ã§ã‚ã‚‹å ´åˆã®ã¿ã€å¤‰æ›´ã—ã¦ãã ã•ã„。',
+ 'config-sqlite-dir' => 'SQLiteã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª:',
+ 'config-sqlite-dir-help' => 'SQLiteã¯å˜ä¸€ã®ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã—ã¦ã„ã¾ã™ã€‚
+
+ã‚ãªãŸãŒä¾›çµ¦ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ™‚ã«ã‚¦ã‚§ãƒ–サーãƒãƒ¼ã«ã‚ˆã£ã¦æ›¸ãè¾¼ã¿å¯èƒ½ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。
+
+ウェブを通ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½"ä¸å¯èƒ½"ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。ã“ã‚Œã¯ã‚ãªãŸã®PHPファイルã®ã‚る所ã«é…ç½®ä¸èƒ½ãªç†ç”±ã§ã™ã€‚
+
+インストーラーã¯å…±ã«<code>.htaccess</code>ファイルを書ã込むã“ã¨ã§ã—ょã†ã€‚ã—ã‹ã—ã€ä¾‹ãˆå¤±æ•—ã—ã¦ã‚‚誰ã‹ãŒã‚ãªãŸã®ç”Ÿã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã¨ãªã‚‹ã§ã—ょã†ã€‚
+
+例ãˆã°<code>/var/lib/mediawiki/yourwiki</code>ã®ã‚ˆã†ã«ã€å…¨ãé•ã†å ´æ‰€ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’é…ç½®ã™ã‚‹ã“ã¨ã‚’考ãˆã¦ãã ã•ã„。',
+ 'config-oracle-def-ts' => '既定ã®ãƒ†ãƒ¼ãƒ–ル領域:',
+ 'config-oracle-temp-ts' => '一時的ãªãƒ†ãƒ¼ãƒ–ル領域:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'メディアウィキã¯æ¬¡ã®ã‚ˆã†ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã‚’サãƒãƒ¼ãƒˆã™ã‚‹:
+
+$1
+
+ã‚‚ã—ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ãŒä¸å¯è¦–ã§ã‚ã‚‹ãªã‚‰ã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãƒªã‚¹ãƒˆåŒ–ã•ã‚ŒãŸã‚‚ã®ã‚’使用ã—ã¦ã¿ã¦ãã ã•ã„。å¯èƒ½ãªã‚µãƒãƒ¼ãƒˆã®æŒ‡ç¤ºã«å¾“ã£ã¦ãã ã•ã„。',
+ 'config-support-mysql' => '* $1ã¯MediaWikiã®ä¸»è¦ãªå¯¾è±¡ã§ã€ã‚‚ã£ã¨ã‚‚サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ï¼ˆ[http://www.php.net/manual/en/mysql.installation.php MySQLã®ã‚µãƒãƒ¼ãƒˆä¸‹ã§PHPをコンパイルã™ã‚‹æ–¹æ³•])',
+ 'config-support-postgres' => '* $1ã¯ã€MySQLã®ä»£æ›¿ã¨ã—ã¦ã€äººæ°—ã®ã‚るオープンソースデータベースシステムã§ã™ï¼ˆ[http://www.php.net/manual/en/pgsql.installation.php PostgreSQLã®ã‚µãƒãƒ¼ãƒˆä¸‹ã§PHPをコンパイルã™ã‚‹æ–¹æ³•])',
+ 'config-support-sqlite' => '* $1ã¯ã€è‰¯ãサãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã€è»½é‡ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã§ã™ã€‚([http://www.php.net/manual/en/pdo.installation.php SQLiteã®ã‚µãƒãƒ¼ãƒˆä¸‹ã§PHPをコンパイルã™ã‚‹æ–¹æ³•]ã€PDOを使用)',
+ 'config-support-oracle' => '* $1ã¯å•†æ¥­ä¼æ¥­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã™ã€‚([http://www.php.net/manual/en/oci8.installation.php OCI8サãƒãƒ¼ãƒˆãªPHPをコンパイルã™ã‚‹æ–¹æ³•])',
+ 'config-header-mysql' => 'MySQLã®è¨­å®š',
+ 'config-header-postgres' => 'PostgreSQLã®è¨­å®š',
+ 'config-header-sqlite' => 'SQLiteã®è¨­å®š',
+ 'config-header-oracle' => 'Oracleã®è¨­å®š',
+ 'config-invalid-db-type' => 'ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç¨®é¡ž',
+ 'config-missing-db-name' => '「データベースåã€ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™',
+ 'config-missing-db-server-oracle' => '「データベースTNSã€ã«å€¤ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™',
+ 'config-invalid-db-server-oracle' => 'ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹TNS「$1ã€ã§ã™ã€‚
+アスキー文字(a-z, A-Z)ã€æ•°å­—(0-9)ãŠã‚ˆã³ã‚¢ãƒ³ãƒ€ãƒ¼ãƒãƒ¼(_)ã¨ãƒ‰ãƒƒãƒˆ(.)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+ 'config-invalid-db-name' => '無効ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å "$1"。
+アスキー文字(a-z, A-Z)ã€æ•°å­—(0-9)ã€ã‚¢ãƒ³ãƒ€ãƒ¼ãƒãƒ¼(_)ã€ãƒã‚¤ãƒ•ãƒ³(-)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+ 'config-invalid-db-prefix' => 'データベースã®æŽ¥é ­èªž "$1" ãŒç„¡åŠ¹ã§ã™ã€‚
+アスキー文字(a-z, A-Z)ã€æ•°å­—(0-9)ã€ä¸‹ç·š(_)ã€ãƒã‚¤ãƒ•ãƒ³(-)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+ 'config-connection-error' => '$1。
+
+以下ã®ãƒ›ã‚¹ãƒˆåã€ãƒ¦ãƒ¼ã‚¶åã€ãƒ‘スワードをãƒã‚§ãƒƒã‚¯ã—ã¦ã€å†åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。',
+ 'config-invalid-schema' => 'メディアウィキ"$1"ã«ãŠã‘る無効ãªå›³å¼ã§ã™ã€‚
+アスキー文字(a-z, A-Z)ã€æ•°å­—(0-9)ã€ä¸‹ç·š(_)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+ 'config-postgres-old' => 'PostgreSQLã®$1ã‚ã‚‹ã„ã¯ãれ以é™ãŒå¿…è¦ã§ã€ã„ã¾ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯$2ã§ã™ã€‚',
+ 'config-sqlite-name-help' => 'ã‚ãªãŸã®ã‚¦ã‚§ã‚­ã¨åŒä¸€æ€§ã®ã‚ã‚‹åå‰ã‚’é¸ã‚“ã§ãã ã•ã„。
+空白ãŠã‚ˆã³ãƒã‚¤ãƒ•ãƒ³ã¯ä½¿ç”¨ã—ãªã„ã§ãã ã•ã„。
+SQLiteã®ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«åã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚',
+ 'config-sqlite-parent-unwritable-group' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作æˆã§ãã¾ã›ã‚“。親ディレクトリ<code><nowiki>$2</nowiki></code>ã¯ã€ã‚¦ã‚§ãƒ–サーãƒã‹ã‚‰æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+
+インストール機能ã¯ã€å®Ÿè¡Œã—ã¦ã„るウェブサーãƒã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’特定ã—ã¾ã—ãŸã€‚
+続行ã™ã‚‹ã«ã¯ã€<code><nowiki>$3</nowiki></code>ディレクトリを書ãè¾¼ã¿å¯èƒ½ã«ã—ã¦ãã ã•ã„。
+Unixã‚ã‚‹ã„ã¯Linux上ã§ã¯ã€ä»¥ä¸‹ã‚’実行ã—ã¦ãã ã•ã„:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作æˆã§ãã¾ã›ã‚“。親ディレクトリ<code><nowiki>$2</nowiki></code>ã¯ã€ã‚¦ã‚§ãƒ–サーãƒã‹ã‚‰æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+
+インストール機能ã¯ã€å®Ÿè¡Œã—ã¦ã„るウェブサーãƒã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+続行ã™ã‚‹ã«ã¯ã€<code><nowiki>$3</nowiki></code>ディレクトリをã€ã‚¦ã‚§ãƒ–サーãƒï¼ˆã¨ä»–ã®ãƒ¦ãƒ¼ã‚¶ï¼ï¼‰ã‹ã‚‰ã‚°ãƒ­ãƒ¼ãƒãƒ«ã«æ›¸ãè¾¼ã¿å‡ºæ¥ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。
+Unixã‚ã‚‹ã„ã¯Linux上ã§ã¯ã€ä»¥ä¸‹ã‚’実行ã—ã¦ãã ã•ã„:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'データディレクトリー"$1"を作æˆã—ãŸã“ã¨ã«ã‚ˆã‚‹ã‚¨ãƒ©ãƒ¼ã€‚
+場所をãƒã‚§ãƒƒã‚¯ã—ã¦ã€å†åº¦è©¦ã—ã¦ãã ã•ã„。',
+ 'config-sqlite-dir-unwritable' => 'ディレクトリー"$1"を書ã込むã“ã¨ãŒã§ãã¾ã›ã‚“。
+パーミッションを変更ã™ã‚Œã°ã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ãŒæ›¸ãè¾¼ã¿å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚å†åº¦è©¦ã—ã¦ãã ã•ã„。',
+ 'config-sqlite-connection-error' => '$1。
+
+以下ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã€å†åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。',
+ 'config-sqlite-readonly' => 'ファイル<code>$1</code>ã¯æ›¸ãè¾¼ã¿ä¸èƒ½ã§ã™ã€‚',
+ 'config-sqlite-cant-create-db' => 'データベースファイル<code>$1</code>を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+ 'config-sqlite-fts3-downgrade' => 'PHPã¯FTS3ã®ã‚µãƒãƒ¼ãƒˆã€ãƒ†ãƒ¼ãƒ–ルã®ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ãŒç„¡åŠ¹ã§ã™ã€‚',
+ 'config-can-upgrade' => 'ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¦ã‚£ã‚­ãƒ†ãƒ¼ãƒ–ルãŒå­˜åœ¨ã—ã¾ã™ã€‚
+ãれらをメディアウィキ$1ã«ã‚¢ãƒƒãƒ—グレードã™ã‚‹ãŸã‚ã«ã€Œç¶šè¡Œã€ã‚’クリックã—ã¦ãã ã•ã„。',
+ 'config-upgrade-done' => "æ›´æ–°ã¯å®Œäº†ã—ã¾ã—ãŸã€‚
+
+[$1 ウィキを使ã„始ã‚ã‚‹]ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ã‚‚ã—ã€<code>LocalSettings.php</code>ファイルをå†ç”Ÿæˆã—ãŸã„ã®ãªã‚‰ã°ã€ä¸‹ã®ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。
+ウィキã«å•é¡ŒãŒãªã„ã®ã§ã‚ã‚Œã°ã€ã“ã‚Œã¯'''推奨ã•ã‚Œã¾ã›ã‚“'''。",
+ 'config-upgrade-done-no-regenerate' => 'アップグレードãŒå®Œäº†ã—ã¾ã—ãŸã€‚
+
+[$1 ウィキã®ä½¿ç”¨ã‚’開始]ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
+ 'config-regenerate' => 'LocalSettings.phpã‚’å†ç”Ÿæˆâ†’',
+ 'config-show-table-status' => 'SHOW TABLE STATUSクエリーãŒå¤±æ•—ã—ã¾ã—ãŸï¼',
+ 'config-unknown-collation' => "'''警告:''' データベースã¯èªè­˜ã•ã‚Œãªã„ç…§åˆã‚’使用ã—ã¦ã„ã¾ã™ã€‚",
+ 'config-db-web-account' => 'ウェブアクセスã®ãŸã‚ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ',
+ 'config-db-web-help' => 'ウィキã®å…ƒæ¥ã®æ“作中ã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ãŒãƒ‡ãƒ¼ã‚¿ãƒ¼ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æŽ¥ç¶šã§ãるよã†ã«ã€ãƒ¦ãƒ¼ã‚¶åã¨ãƒ‘スワードをé¸æŠžã—ã¦ãã ã•ã„。',
+ 'config-db-web-account-same' => 'インストールã®ãŸã‚ã«åŒã˜ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’使用ã—ã¦ãã ã•ã„',
+ 'config-db-web-create' => 'æ—¢ã«å­˜åœ¨ã—ã¦ã„ãªã„ã®ã§ã‚ã‚Œã°ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ã¦ãã ã•ã„',
+ 'config-db-web-no-create-privs' => 'ã‚ãªãŸãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®ãŸã‚ã«å®šç¾©ã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã®ãŸã‚ã®ç‰¹æ¨©ã¨ã—ã¦ã¯ä¸å……分ã§ã™ã€‚
+ã‚ãªãŸãŒã“ã“ã§ç‰¹å®šã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã™ã§ã«å­˜åœ¨ã—ã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。',
+ 'config-mysql-engine' => 'ストレージエンジン:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB'''ã¯ã€ä¸¦è¡Œå‡¦ç†ã®ã‚µãƒãƒ¼ãƒˆã«å„ªã‚Œã¦ã„ã‚‹ã®ã§ã€ã»ã¨ã‚“ã©ã®å ´åˆã«ãŠã„ã¦æœ€è‰¯ã®é¸æŠžè‚¢ã§ã™ã€‚
+
+'''MyISAM'''ã¯ã€åˆ©ç”¨è€…ãŒ1人ã®å ´åˆã€ã‚ã‚‹ã„ã¯èª­ã¿è¾¼ã¿å°‚用ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å ´åˆã«ã€ã‚ˆã‚Šå‡¦ç†ãŒæ—©ããªã‚‹ã§ã—ょã†ã€‚
+ãŸã ã—ã€MyISAMã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯ã€InnoDBより高頻度ã§ç ´æã™ã‚‹å‚¾å‘ãŒã‚ã‚Šã¾ã™ã€‚",
+ 'config-mysql-charset' => 'データベースã®æ–‡å­—セット:',
+ 'config-mysql-binary' => 'ãƒã‚¤ãƒŠãƒª',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "'''ãƒã‚¤ãƒŠãƒªãƒ¼ç³»å¼'''ã§ã¯ã€MediaWikiã¯ã€UTF-8テキストをã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒã‚¤ãƒŠãƒªãƒ¼ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«æ ¼ç´ã—ã¾ã™ã€‚
+ã“ã‚Œã¯ã€MySQLã®UTF-8å½¢å¼ã‚ˆã‚ŠåŠ¹çŽ‡çš„ã§ã€ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰æ–‡å­—ã®å…¨ç¯„囲を利用ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
+
+'''UTF-8å½¢å¼'''ã§ã¯ã€MySQLã¯ã€ãªã‚“ã®æ–‡å­—集åˆãŒãƒ‡ãƒ¼ã‚¿ã®ãªã‹ã«å«ã¾ã‚Œã¦ã„ã‚‹ã‹ã‚’知りã€ãã‚Œã«å¯¾ã—ã¦é©åˆ‡ãªæ示ã¨å¤‰æ›ã‚’ã™ã‚‹ã§ã—ょã†ãŒã€
+[http://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語é¢]ã®å¤–ã«ã‚る文字を格ç´ã§ãるよã†ã«ã¯ãªã‚Šã¾ã›ã‚“。",
+ 'config-site-name' => 'ウィキã®åå‰ï¼š',
+ 'config-site-name-help' => 'ã“ã®äº‹è±¡ã¯ãƒ–ラウザã®ã‚¿ã‚¤ãƒˆãƒ«ãƒãƒ¼ã¨ä»–ã®æ§˜ã€…ãªå ´æ‰€ã«ãŠã„ã¦å‡ºç¾ã™ã‚‹ã€‚',
+ 'config-site-name-blank' => 'サイトåを入力ã—ã¦ãã ã•ã„。',
+ 'config-project-namespace' => 'プロジェクトåå‰ç©ºé–“:',
+ 'config-ns-generic' => 'プロジェクト',
+ 'config-ns-site-name' => 'ウィキåã¨åŒã˜ï¼š$1',
+ 'config-ns-other' => 'ãã®ä»–(特化ã•ã‚ŒãŸã‚‚ã®)',
+ 'config-ns-other-default' => 'マイウィキ',
+ 'config-project-namespace-help' => "ウィキペディアã®ä¾‹ã«å¾“ãˆã°ã€å¤šãã®ã‚¦ã‚£ã‚­ã¯ã€Œ'''プロジェクトã®åå‰ç©ºé–“'''ã€ã«ãŠã„ã¦ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ãƒšãƒ¼ã‚¸ã¨ã¯åˆ†é›¢ã—ãŸç‹¬è‡ªã®ãƒãƒªã‚·ãƒ¼ãƒšãƒ¼ã‚¸ã‚’æŒã¤ã€‚
+ä¼çµ±çš„ã«ã¯ã“ã®æŽ¥é ­è¾žã¯ã‚¦ã‚£ã‚­ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ´¾ç”Ÿã•ã‚Œã‚‹ã€‚ã—ã‹ã—ã€\"#\" ã‚„ \":\"ã®ã‚ˆã†ãªå¥åˆ‡ã‚Šè¨˜å·ã¯å«ã‚“ã§ã„ãªã„。",
+ 'config-ns-invalid' => '"<nowiki>$1</nowiki>"ã®ã‚ˆã†ã«æŒ‡å®šã•ã‚ŒãŸåå‰ç©ºé–“ã¯ç„¡åŠ¹ã§ã™ã€‚
+é•ã†ãƒ—ロジェクトåå‰ç©ºé–“を指定ã—ã¦ãã ã•ã„。',
+ 'config-admin-box' => '管ç†ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ',
+ 'config-admin-name' => 'åå‰ï¼š',
+ 'config-admin-password' => 'パスワード:',
+ 'config-admin-password-confirm' => 'パスワードã®å†å…¥åŠ›ï¼š',
+ 'config-admin-help' => 'ã“ã“ã«ã‚ãªãŸã®å¸Œæœ›ã™ã‚‹ãƒ¦ãƒ¼ã‚¶åを入力ã—ã¦ãã ã•ã„(例ãˆã°"Joe Bloggs"ãªã©ï¼‰ã€‚
+ã“ã®åå‰ã§ã“ã®ã‚¦ã‚£ã‚­ã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚',
+ 'config-admin-name-blank' => '管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶åを入力ã—ã¦ãã ã•ã„。',
+ 'config-admin-name-invalid' => '指定ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶å "<nowiki>$1</nowiki>" ã¯ç„¡åŠ¹ã§ã™ã€‚
+別ã®ãƒ¦ãƒ¼ã‚¶åを指定ã—ã¦ãã ã•ã„。',
+ 'config-admin-password-blank' => '管ç†è€…アカウントã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。',
+ 'config-admin-password-same' => 'ユーザåã¨åŒã˜ãƒ‘スワードã¯ä½¿ãˆã¾ã›ã‚“。',
+ 'config-admin-password-mismatch' => '入力ã•ã‚ŒãŸäºŒã¤ã®ãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。',
+ 'config-admin-email' => 'Eメールアドレス:',
+ 'config-admin-email-help' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。他ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã®å—ã‘å–ã‚Šã¨ã€ãƒ‘スワードã®ãƒªã‚»ãƒƒãƒˆã€ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã«ç™»éŒ²ã—ãŸãƒšãƒ¼ã‚¸ã®æ›´æ–°é€šçŸ¥ã«ç”¨ã„られã¾ã™ã€‚',
+ 'config-admin-error-user' => '"<nowiki>$1</nowiki>"ã¨ã„ã†åå‰ã®ç®¡ç†è€…を作æˆã™ã‚‹éš›ã«å†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+ 'config-admin-error-password' => '管ç†è€…"<nowiki>$1</nowiki>"ã®ãƒ‘スワードを設定ã™ã‚‹éš›ã«å†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ: <pre>$2</pre>',
+ 'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知ã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ]を購読ã™ã‚‹ã€‚',
+ 'config-subscribe-help' => 'ã“ã‚Œã¯ã€ãƒªãƒªãƒ¼ã‚¹ã®å‘ŠçŸ¥ï¼ˆé‡è¦ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã«é–¢ã™ã‚‹æ¡ˆå†…ã‚’å«ã‚€ï¼‰ã«ä½¿ã‚れるã€ä½Žå®¹é‡ã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã§ã™ã€‚
+ã“ã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã‚’購読ã—ã¦ã€æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå‡ºãŸå ´åˆã«MediaWikiã‚’æ›´æ–°ã—ã¦ãã ã•ã„。',
+ 'config-almost-done' => 'ã‚ãªãŸã¯ã»ã¨ã‚“ã©å®Œç’§ã§ã™ï¼
+設定を残ã™ã“ã¨ã‚’ã¯ã¶ã„ã¦ã€ä»Šã™ãã«ã‚¦ã‚£ã‚­ã‚’インストールã§ãã¾ã™ã€‚',
+ 'config-optional-continue' => 'ç§ã«ã‚‚ã£ã¨è³ªå•ã—ã¦ãã ã•ã„。',
+ 'config-optional-skip' => 'ã™ã§ã«é£½ãã¦ã—ã¾ã£ãŸã€ã‚¦ã‚£ã‚­ã‚’インストールã™ã‚‹ã ã‘ã§ã™ã€‚',
+ 'config-profile' => 'æ­£ã—ã„プロフィールã®ãƒ¦ãƒ¼ã‚¶:',
+ 'config-profile-wiki' => 'ä¼çµ±çš„ãªã‚¦ã‚£ã‚­',
+ 'config-profile-no-anon' => 'アカウントã®ä½œæˆãŒå¿…è¦',
+ 'config-profile-fishbowl' => '承èªã•ã‚ŒãŸç·¨é›†è€…ã®ã¿',
+ 'config-profile-private' => 'éžå…¬é–‹ã‚¦ã‚£ã‚­',
+ 'config-profile-help' => "ウィキã¯ã€ãŸãã•ã‚“ã®äººãŒå¯èƒ½ãªé™ã‚Šãã®ã‚¦ã‚£ã‚­ã‚’編集ã§ãã‚‹ã¨ãã€æœ€ã‚‚優れãŸåƒãã‚’ã—ã¾ã™ã€‚
+MediaWikiã§ã¯ã€æœ€è¿‘ã®æ›´æ–°ã‚’確èªã—ã€ç¥žçµŒè³ªãªã€ã‚‚ã—ãã¯æ‚ªæ„ã‚’æŒã£ãŸåˆ©ç”¨è€…ã‹ã‚‰ã®æ害を差ã—戻ã™ã“ã¨ãŒã€ç°¡å˜ã«ã§ãã¾ã™ã€‚
+
+ã—ã‹ã—一方ã§ã€MediaWikiã¯ã€ã•ã‚‰ã«æ§˜ã€…ãªå½¢æ…‹ã§ã‚‚ã®åˆ©ç”¨ã‚‚優れã¦ã„ã‚‹ã¨è¨€ã‚ã‚Œã¦ã„ã¾ã™ã€‚ã¾ãŸã€æ™‚ã«ã¯ã€ã™ã¹ã¦ã®äººã«ã‚¦ã‚£ã‚­æ‰‹æ³•ã®åˆ©ç‚¹ã‚’説得ã•ã›ã‚‹ã®ã¯å®¹æ˜“ã§ã¯ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+ãã“ã§ã€é¸æŠžè‚¢ãŒã‚ã‚Šã¾ã™ã€‚
+
+'''{{int:config-profile-wiki}}'''ã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã‚’ã›ãšã¨ã‚‚ã€èª°ã§ã‚‚編集ãŒå¯èƒ½ãªã‚‚ã®ã§ã™ã€‚
+'''{{int:config-profile-no-anon}}'''ãªã‚¦ã‚£ã‚­ã¯ã€å„編集ã«å¯¾ã—ã¦ã‚ˆã‚Šå¼·ã„説明責任を付与ã—ã¾ã™ãŒã€æ°—軽ãªæŠ•ç¨¿ã‚’阻害ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+'''{{int:config-profile-fishbowl}}'''ã®ã‚¦ã‚£ã‚­ã¯ã€æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ã¯ç·¨é›†ã§ãã€ä¸€æ–¹ã€ä¸€èˆ¬ã®äººã¯ãƒšãƒ¼ã‚¸ï¼ˆã¨ãã®å±¥æ­´ï¼‰ã®é–²è¦§ãŒå¯èƒ½ã§ã™ã€‚
+'''{{int:config-profile-private}}'''ã¯ã€æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ãŒãƒšãƒ¼ã‚¸ã‚’閲覧å¯èƒ½ã§ã€ãã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒç·¨é›†å¯èƒ½ã§ã™ã€‚
+
+より複雑ãªåˆ©ç”¨è€…権é™ã®è¨­å®šã¯ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«å¾Œã«è¨­å®šå¯èƒ½ã§ã™ã€‚詳細ã¯[http://www.mediawiki.org/wiki/Manual:User_rights 関連ã™ã‚‹ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«]ã‚’ã”覧ãã ã•ã„。",
+ 'config-license' => '著作権ã¨ãƒ©ã‚¤ã‚»ãƒ³ã‚¹:',
+ 'config-license-none' => 'ライセンスã®ãƒ•ãƒƒã‚¿ãƒ¼ã‚’付ã‘ãªã„',
+ 'config-license-cc-by-sa' => 'クリエイティブ・コモンズ 表示-継承',
+ 'config-license-cc-by-nc-sa' => 'クリエイティブ・コモンズ 表示-éžå–¶åˆ©-継承',
+ 'config-license-gfdl-old' => 'GNUフリー文書利用許諾契約書 1.2',
+ 'config-license-gfdl-current' => 'GNUフリー文書利用許諾契約書 1.3 ã¾ãŸã¯ãれ以é™',
+ 'config-license-pd' => 'パブリック・ドメイン',
+ 'config-license-cc-choose' => 'ãã®ä»–ã®ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–・コモンズ・ライセンスをé¸æŠžã™ã‚‹',
+ 'config-license-help' => "多ãã®å…¬é–‹ã‚¦ã‚£ã‚­ã§ã¯ã€ã™ã¹ã¦ã®å¯„稿物ãŒ[http://freedomdefined.org/Definition フリーライセンス]ã®å…ƒã«ç½®ã‹ã‚Œã¦ã„ã¾ã™ã€‚
+ã“ã†ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã«ã‚ˆã‚‹å…±æœ‰ã®æ„Ÿè¦šãŒç”Ÿã¾ã‚Œã€é•·æœŸçš„ãªå¯„稿ãŒä¿ƒã•ã‚Œã¾ã™ã€‚
+ç§çš„ウィキやä¼æ¥­ã®ã‚¦ã‚£ã‚­ã§ã¯ã€é€šå¸¸ã€ãƒ•ãƒªãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。
+
+ウィキペディアã«ã‚るテキストをã‚ãªãŸã®ã‚¦ã‚£ã‚­ã§åˆ©ç”¨ã—ã€é€†ã«ã‚ãªãŸã®ã‚¦ã‚£ã‚­ã«ã‚るテキストをウィキペディアã«è¤‡è£½ã™ã‚‹ã“ã¨ã‚’許å¯ã—ãŸã„å ´åˆã«ã¯ã€'''クリエイティブ・コモンズ 表示-継承'''ã‚’é¸æŠžã™ã‚‹ã¹ãã§ã™ã€‚
+
+GNUフリー文書利用許諾契約書ã¯ã‚¦ã‚£ã‚­ãƒšãƒ‡ã‚£ã‚¢ãŒæŽ¡ç”¨ã—ã¦ã„ãŸå¤ã„ライセンスã§ã™ã€‚
+今も有効ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã¯ã‚ã‚Šã¾ã™ãŒã€å†åˆ©ç”¨ã‚„解釈を難ã—ãã™ã‚‹æ¡é …ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚",
+ 'config-email-settings' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã®è¨­å®š',
+ 'config-enable-email' => 'é›»å­ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã®æœ‰åŠ¹',
+ 'config-enable-email-help' => "ã‚‚ã—ã€é›»å­ãƒ¡ãƒ¼ãƒ«ã®ä½œå‹•ã‚’欲ã™ã‚‹ãªã‚‰ã°ã€[http://www.php.net/manual/en/mail.configuration.php PHP's mail settings]ã®ãƒšãƒ¼ã‚¸ãŒæ­£ç¢ºã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚る。
+ã‚‚ã—ã€é›»å­ãƒ¡ãƒ¼ãƒ«ã«é–¢ã™ã‚‹ã„ã‹ãªã‚‹æ©Ÿèƒ½ã‚’欲ã—ãªã„ã®ã§ã‚ã‚Œã°ã€ã“ã“ã§ç„¡åŠ¹ã«ã§ãã¾ã™ã€‚",
+ 'config-email-user' => 'ユーザ間åŒå£«ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã®è¨±å¯',
+ 'config-email-user-help' => '設定ã«ãŠã„ã¦æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãŒãŠäº’ã„ã«é›»å­ãƒ¡ãƒ¼ãƒ«ã®ã‚„ã‚Šã¨ã‚Šã‚’è¡Œã†ã“ã¨ã‚’許å¯ã™ã‚‹ã€‚',
+ 'config-email-usertalk' => 'ユーザã®ãƒˆãƒ¼ã‚¯ãƒšãƒ¼ã‚¸ã«ãŠã‘る通知を有効ã«ã™ã‚‹',
+ 'config-email-usertalk-help' => '設定ã§æœ‰åŠ¹ã«ã—ã¦ã„ã‚‹ãªã‚‰ã°ã€ãƒ¦ãƒ¼ã‚¶ã®ãƒˆãƒ¼ã‚¯ãƒšãƒ¼ã‚¸ã®å¤‰æ›´ã®é€šçŸ¥ã‚’å—ã‘ã‚‹ã“ã¨ã‚’ユーザã«è¨±å¯ã™ã‚‹ã€‚',
+ 'config-email-watchlist' => 'ウォッãƒãƒªã‚¹ãƒˆã®é€šçŸ¥ã‚’有効ã«ã™ã‚‹',
+ 'config-email-watchlist-help' => '設定ã§æœ‰åŠ¹ã«ã—ã¦ã„ã‚‹ãªã‚‰ã°ã€é–²è¦§ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã«é–¢ã™ã‚‹é€šçŸ¥ã‚’å—ã‘å–ã‚‹ã“ã¨ã‚’ユーザã«è¨±å¯ã™ã‚‹ã€‚',
+ 'config-email-auth' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã®èªè¨¼ã‚’有効ã«ã™ã‚‹',
+ 'config-email-auth-help' => "ã“ã®é¸æŠžè‚¢ãŒæœ‰åŠ¹åŒ–ã•ã‚Œã‚‹ã¨ã€åˆ©ç”¨è€…ãŒé›»å­ãƒ¡ãƒ¼ãƒ«ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã‚ã‚‹ã„ã¯å¤‰æ›´ã—ãŸã¨ãã«é€ä¿¡ã•ã‚Œã‚‹ãƒªãƒ³ã‚¯ã«ã‚ˆã‚Šã€ãã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’確èªã—ãªã‘ã‚Œã°ãªã‚‰ãªããªã‚Šã¾ã™ã€‚
+èªè¨¼æ¸ˆã¿ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã ã‘ãŒã€ä»–ã®åˆ©ç”¨è€…ã‹ã‚‰ã®ãƒ¡ãƒ¼ãƒ«ã‚„ã€å¤‰æ›´é€šçŸ¥ã®ãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+公開ウィキã§ã¯ã€ãƒ¡ãƒ¼ãƒ«æ©Ÿèƒ½ã«ã‚ˆã‚‹æ½œåœ¨çš„ãªä¸æ­£åˆ©ç”¨ã®é˜²æ­¢ã®ãŸã‚ã€ã“ã®é¸æŠžè‚¢ã‚’設定ã™ã‚‹ã“ã¨ãŒ'''推奨'''ã•ã‚Œã¾ã™ã€‚",
+ 'config-email-sender' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’è¿”ã™:',
+ 'config-email-sender-help' => 'é€ä¿¡ãƒ¡ãƒ¼ãƒ«ã®è¿”信アドレスã¨ã—ã¦åˆ©ç”¨ã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
+宛先ä¸æ˜Žã®å ´åˆã€ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ãã®é€šçŸ¥ãŒé€ä¿¡ã•ã‚Œã¾ã™ã€‚
+多ãã®ãƒ¡ãƒ¼ãƒ«ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã€å°‘ãªãã¨ã‚‚ドメインåã®ä¸€éƒ¨ãŒæœ‰åŠ¹ã§ã‚ã‚‹ã“ã¨ãŒå¿…è¦ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+ 'config-upload-settings' => 'ç”»åƒãŠã‚ˆã³ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロード',
+ 'config-upload-enable' => 'ファイルã®ã‚¢ãƒƒãƒ—ロードを有効ã«ã™ã‚‹',
+ 'config-upload-help' => 'ファイルã®ã‚¢ãƒƒãƒ—ロードã¯æ½œåœ¨çš„ã«ã‚ãªãŸã®ã‚µãƒ¼ãƒã«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å±é™ºã‚’ã•ã‚‰ã—ã¾ã™ã€‚
+æ›´ãªã‚‹æƒ…å ±ã®ãŸã‚ã«ã€ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã®[http://www.mediawiki.org/wiki/Manual:Security security section] を読むã“ã¨ã‚’ã™ã™ã‚ã¾ã™ã€‚
+
+ファイルã®ã‚¢ãƒƒãƒ—ロードをå¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¦ã‚£ã‚­ã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®<code>images</code>サブディレクトリã®ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚¦ã‚§ãƒ–サーãƒã¯ãã“ã«æ›¸ãè¾¼ã¿ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚
+ãã—ã¦ã€ã“ã®ã‚ªãƒ—ションを有効ã«ã—ã¦ãã ã•ã„。',
+ 'config-upload-deleted' => '削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ãŸã‚ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª:',
+ 'config-upload-deleted-help' => '削除ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ã“ã‚ŒãŒã‚¦ã‚§ãƒ–ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã“ã¨ãŒç†æƒ³ã§ã™ã€‚',
+ 'config-logo' => 'ロゴã®URL:',
+ 'config-logo-help' => 'メディアウィキã®åˆæœŸã®ã‚¹ã‚­ãƒ³ã¯æœ€ä¸Šéƒ¨å·¦è§’ã«ã‚ã‚‹135x160ピクセルã®ãƒ­ã‚´ã®ãŸã‚ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚
+é©åˆ‡ãªã‚µã‚¤ã‚ºã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’アップロードã—ã€ã“ã“ã«URLを入力ã—ã¦ãã ã•ã„。
+
+ã‚‚ã—ã€ãƒ­ã‚´ã‚’望ã¾ãªã„ãªã‚‰ã°ã€ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’空白状態ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。',
+ 'config-instantcommons' => 'InstantCommons機能を有効ã«ã™ã‚‹',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons InstantCommons]ã¯ã€[http://commons.wikimedia.org/ ウィキメディア・コモンズ]ã®ã‚µã‚¤ãƒˆã§è¦‹ã¤ã‹ã£ãŸç”»åƒã‚„音声ã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ウィキ上ã§åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹æ©Ÿèƒ½ã§ã™ã€‚
+ã“れを有効化ã™ã‚‹ã«ã¯ã€MediaWikiã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã§ããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
+
+ウィキメディアコモンズ以外ã®ã‚¦ã‚£ã‚­ã‚’åŒã˜ã‚ˆã†ã«è¨­å®šã™ã‚‹æ–¹æ³•ãªã©ã€ã“ã®æ©Ÿèƒ½ã«é–¢ã™ã‚‹è©³ç´°ãªæƒ…å ±ã¯ã€[http://mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]ã‚’ã”覧ãã ã•ã„。',
+ 'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスã®é¸æŠžå™¨ã‹ã‚‰çµæžœãŒå¾—られã¾ã›ã‚“ã§ã—ãŸã€‚
+ライセンスã®åå‰ã‚’手動ã§å…¥åŠ›ã—ã¦ãã ã•ã„。',
+ 'config-cc-again' => 'ã‚‚ã†ä¸€åº¦é¸æŠžã—ã¦ãã ã•ã„...',
+ 'config-cc-not-chosen' => 'ã‚ãªãŸã®æ±‚ã‚るクリエイティブコモンズã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’é¸ã‚“ã§ã€"続行"をクリックã—ã¦ãã ã•ã„。',
+ 'config-advanced-settings' => '高度ãªè¨­å®š',
+ 'config-cache-options' => 'オブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã®è¨­å®š:',
+ 'config-cache-help' => 'オブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯ã€ä½¿ç”¨ã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’é »ç¹ã«ã‚­ãƒ£ãƒƒã‚·ãƒ³ã‚°ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã€ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¦ã‚£ã‚­ã®ã‚¹ãƒ”ード改善ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚
+中〜大サイトã«ãŠã„ã¦ã¯ã€ã“れを有効ã«ã™ã‚‹ãŸã‚ã«å¤§å¤‰æœ›ã¾ã—ã„ã“ã¨ã§ã™ã€‚ã¾ãŸå°ã•ãªã‚µã‚¤ãƒˆã«ãŠã„ã¦ã‚‚åŒæ§˜ãªåˆ©ç‚¹ã‚’ã‚‚ãŸã‚‰ã™ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚',
+ 'config-cache-none' => 'キャッシングã—ãªã„(機能ã¯å–り払ã‚ã‚Œã¾ã™ã€ã—ã‹ã‚‚より大ããªã‚¦ã‚£ã‚­ã‚µã‚¤ãƒˆä¸Šã§ã‚¹ãƒ”ードã®å•é¡ŒãŒç™ºç”Ÿã—ã¾ã™)',
+ 'config-cache-accel' => 'PHPオブジェクトキャッシング(APCã€eAcceleratorã€XCacheã‚ã‚‹ã„ã¯WinCache)',
+ 'config-cache-memcached' => 'Memcachedを使用(追加ã®è¨­å®šãŒå¿…è¦ã§ã™ï¼‰',
+ 'config-memcached-servers' => 'メモリをキャッシュã•ã‚ŒãŸã‚µãƒ¼ãƒ:',
+ 'config-memcached-help' => 'Memcachedを使用ã™ã‚‹IPアドレスã®ä¸€è¦§ã€‚
+カンマ区切りã§ã€åˆ©ç”¨ã™ã‚‹ç‰¹å®šã®ãƒãƒ¼ãƒˆã®æŒ‡å®šãŒå¿…è¦ã§ã™ã€‚例:
+127.0.0.1:11211
+192.168.1.25:1234',
+ 'config-extensions' => '拡張機能',
+ 'config-extensions-help' => '<code>./extensions</code>ディレクトリ内ã§ã€ä¸Šè¨˜ãƒªã‚¹ãƒˆã®æ‹¡å¼µæ©Ÿèƒ½ãŒç™ºè¦‹ã•ã‚Œã¾ã—ãŸã€‚
+
+ã“れらã¯æ›´ã«å¤šãã®è¨­å®šã‚’è¦æ±‚ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€ä»Šã“れらを有効ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
+ 'config-install-alreadydone' => "'''警告:''' æ—¢ã«MediaWikiãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿ã§ã€å†ã³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ç›´ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+次ã®ãƒšãƒ¼ã‚¸ã¸é€²ã‚“ã§ãã ã•ã„。",
+ 'config-install-begin' => '「{{int:config-continue}}ã€ã‚’押ã™ã¨ã€MediaWikiã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’開始ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+変更ã—ãŸã„設定ãŒã‚ã‚Œã°ã€ã€Œ{{int:Config-back}}ã€ã‚’押ã—ã¦ãã ã•ã„。',
+ 'config-install-step-done' => '実行',
+ 'config-install-step-failed' => '失敗ã—ãŸ',
+ 'config-install-extensions' => '拡張機能をå«ã‚€',
+ 'config-install-database' => 'データベースã®æ§‹ç¯‰',
+ 'config-install-pg-schema-failed' => 'テーブルã®ä½œæˆã«å¤±æ•—ã—ãŸã€‚
+ユーザ"$1"ãŒå›³å¼"$2"ã«æ›¸ãè¾¼ã¿ãŒã§ãるよã†ã«ã—ã¦ãã ã•ã„。',
+ 'config-install-pg-commit' => '変更をé€ä¿¡',
+ 'config-install-user' => 'データベースユーザを作æˆã™ã‚‹',
+ 'config-install-user-grant-failed' => 'ユーザー「$1ã€ã«è¨±å¯ã‚’与ãˆã‚‹ã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸã€‚:$2',
+ 'config-install-tables' => 'テーブルã®ä½œæˆ',
+ 'config-install-tables-exist' => "'''警告''':MediaWikiテーブルãŒã€ã™ã§ã«å­˜åœ¨ã—ã¦ã„るよã†ã§ã™ã€‚
+作æˆã‚’飛ã°ã—ã¾ã™ã€‚",
+ 'config-install-tables-failed' => "'''エラー''':テーブルã®ä½œæˆãŒã€æ¬¡ã®ã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—ãŸï¼š$1",
+ 'config-install-interwiki' => '既定ã®ã‚¦ã‚£ã‚­é–“テーブルを導入ã—ã¦ã„ã¾ã™',
+ 'config-install-interwiki-list' => 'ファイル<code>interwiki.list</code>を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+ 'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„るよã†ã§ã™ã€‚
+既定ã®ãƒ†ãƒ¼ãƒ–ルを無視ã—ã¾ã™ã€‚",
+ 'config-install-keys' => '秘密éµã‚’生æˆã™ã‚‹',
+ 'config-install-sysop' => '管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã™ã‚‹',
+ 'config-install-mainpage' => '既定ã®æŽ¥ç¶šã§ãƒ¡ã‚¤ãƒ³ãƒšãƒ¼ã‚¸ã‚’作æˆ',
+ 'config-install-mainpage-failed' => 'メインページを挿入ã§ãã¾ã›ã‚“ã§ã—ãŸ:$1',
+ 'config-install-done' => "'''ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ï¼'''
+MediaWikiã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚
+
+<code>LocalSettings.php</code>ファイルãŒç”Ÿæˆã•ã‚Œã¾ã—ãŸã€‚
+ã™ã¹ã¦ã®è¨­å®šãŒãã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+
+ãれをダウンロードã—ã€ã‚¦ã‚£ã‚­ã‚’インストールã—ãŸåŸºæº–ディレクトリー(index.phpã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ï¼‰ã«ç½®ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ダウンロードã¯è‡ªå‹•çš„ã«é–‹å§‹ã—ã¦ã„ã‚‹ã¯ãšã§ã™ã€‚
+
+ダウンロードãŒé–‹å§‹ã—ã¦ã„ãªã„å ´åˆã€ã¾ãŸãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’キャンセルã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’å†é–‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼š
+
+$3
+
+'''注æ„''': ã‚‚ã—ã€ã“れを今ã—ãªã‘ã‚Œã°ã€ã¤ã¾ã‚Šã€ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã›ãšã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’終了ã—ãŸå ´åˆã€ã“ã®ç”Ÿæˆã•ã‚ŒãŸè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯åˆ©ç”¨ã•ã‚Œã¾ã›ã‚“。
+
+ãれを完了ã™ã‚Œã°ã€'''[$2 ウィキã«å…¥ã‚‹]'''ã“ã¨ãŒã§ãã¾ã™ã€‚",
+ 'config-download-localsettings' => 'LocalSettings.phpをダウンロード',
+ 'config-help' => 'ヘルプ',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author គីមស៊្រុន
+ */
+$messages['km'] = array(
+ 'config-your-language' => 'ភាសារបស់អ្នក៖',
+ 'config-your-language-help' => 'ជ្រើសយកភាសាដើម្បីប្រើក្នុងពáŸáž›ážáŸ†áž›áž¾áž„។',
+ 'config-wiki-language' => 'ភាសាវិគី៖',
+ 'config-wiki-language-help' => 'ជ្រើសរើសភាសាដែលវិគីនáŸáŸ‡áž”្រើជាចំបង។',
+ 'config-back' => '↠ážáŸ’រលប់ក្រោយ',
+ 'config-continue' => 'បន្ហ→',
+ 'config-page-language' => 'ភាសា',
+ 'config-page-welcome' => 'មáŸážŒáž¶ážœáž·áž‚ីសូមស្វាគមនáŸ!',
+ 'config-page-dbconnect' => 'ភ្ជាប់ទៅមូលដ្ឋានទិន្ននáŸáž™',
+ 'config-page-name' => 'ឈ្មោះ',
+ 'config-page-options' => 'ជំរើស',
+ 'config-page-install' => 'ážáŸ†áž›áž¾áž„',
+ 'config-page-complete' => 'បញ្ចប់!',
+ 'config-page-restart' => 'ážáŸ†áž›áž¾áž„ឡើងវិញ',
+ 'config-help' => 'ជំនួយ',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'config-desc' => 'Et Projramm för Mediwiki opzesäze.',
+ 'config-title' => 'MediaWiki $1 opsäze',
+ 'config-information' => 'Enfomazjuhn',
+ 'config-localsettings-upgrade' => 'De Dattei <code lang="en">LocalSettings.php</code> es ald doh.
+De Projramme vum Wiki künne op der neußte Shtand jebraat wääde:
+Donn doför dä Wäät vum <code lang="en">$wgUpgradeKey</code> en dat heh Feld enjävve.
+Do fenggs_et en dä Dattei <code lang="en">LocalSettings.php</code> om ẞööver.',
+ 'config-localsettings-cli-upgrade' => 'En Dattei <code lang="en">LocalSettings.php</code> es jefonge woode.
+Öm et Wiki_Projramm op ene neue Shtand ze bränge, donn <code lang="en">update.php</code> oproofe.',
+ 'config-localsettings-key' => 'Der Schlößel för et Projramm op ene neue Schtand ze bränge:',
+ 'config-localsettings-badkey' => 'Dinge Schlößel paß nit.',
+ 'config-upgrade-key-missing' => 'Mer han jefonge, dat MediaWiki ald enschtalleed es.
+Üm de Projramme un Daate o der neue Schtand bränge ze künne, dunn aan et Engk vun dä Dattei <code lang="en">LocalSettings.php</code> op dämm ẞööver:
+
+$1
+
+aanhange.',
+ 'config-localsettings-incomplete' => 'Mer han en Dattei <code lang="en">LocalSettings.php:</code> jefonge, ävver di schingk nit kumplätt ze sin.
+De Varijable <code lang="en">$1</code> es nit jesatz.
+Bes esu joot, un donn di Dattei esu aanpaße, dat se jesaz ea, un dann donn op „{{int:config-continue}}“ klecke.',
+ 'config-localsettings-connection-error' => 'Ene Fähler es opjetrodde wi mer en Verbendung noh de Datebangk opmaache wullte met dä Enshtellunge uß dä Dattei <code lang="en">LocalSettings</code> udder uß dä Dattei <code lang="en">LocalSettings</code> un et hät nit jeflupp. Bes esu joot un dat repareere un versöhg et dann norr_ens.
+
+$1',
+ 'config-session-error' => 'Ene Fähler es opjetrodde beim Aanmelde för en Sezung: $1',
+ 'config-session-expired' => 'De Daate för Ding Setzung sinn wall övverholld of afjeloufe.
+De Setzungunge sin esu enjeshtallt, nit mieh wi $1 ze doore.
+Dat kanns De verlängere, endämm dat De de <code lang="en">session.gc_maxlifetime</code> en dä Dattei <code>php.ini</code> jrüüßer määß.
+Don dat Projramm för et Opsäze norr_ens aanschmiiße.',
+ 'config-no-session' => 'De Daate för Ding Setzung sinn verschött jejange.
+Donn en dä Dattei <code>php.ini</code> nohloore, ov dä <code lang="en">session.save_path</code> op e zopaß Verzeijschneß zeisch.',
+ 'config-your-language' => 'Ding Shprooch:',
+ 'config-your-language-help' => 'Donn heh di Shprooch ußsöhke, di dat Enshtallzjuhnsprojramm kalle sull.',
+ 'config-wiki-language' => 'Dem Wiki sing Shprooch:',
+ 'config-wiki-language-help' => 'Donn heh di Shprooch ußsöhke, di et Wiki shtandattmääßesch kalle sull.',
+ 'config-back' => '↠Retuur',
+ 'config-continue' => 'Wigger →',
+ 'config-page-language' => 'Shprooch',
+ 'config-page-welcome' => 'Wellkumme beim MediaWiki!',
+ 'config-page-dbconnect' => 'Met dä Daatebangk Verbenge',
+ 'config-page-upgrade' => 'En Inshtallzjuhn op der neuste Shtand bränge',
+ 'config-page-dbsettings' => 'Parrameeter för de Daatebangk',
+ 'config-page-name' => 'Name',
+ 'config-page-options' => 'Ennställunge',
+ 'config-page-install' => 'Opsäzze',
+ 'config-page-complete' => 'Fäädesch!',
+ 'config-page-restart' => 'Et Opsäze norr_ens neu aanfange',
+ 'config-page-readme' => 'Donn mesch lässe! (<i lang="en">read me</i>)',
+ 'config-page-releasenotes' => 'Henwies för heh di Version vum Projramm (<i lang="en">Release notes</i>)',
+ 'config-page-copying' => 'Ben aam Kopeere',
+ 'config-page-upgradedoc' => 'Ben op der neuste Stand aam bränge',
+ 'config-page-existingwiki' => 'Mer han ald e Wiki!',
+ 'config-help-restart' => 'Wells De all Ding enjejovve Sachee fottjeschmesse han, un dä janze Vörjang vun fürre aan neu aanfange?',
+ 'config-restart' => 'Joh, neu aanfange!',
+ 'config-welcome' => '=== Ömjevong Prööfe ===
+Mer maache en Aanzal jrundlääje Prövunge, öm erus ze fenge, ov di Ömjevong heh paß, för Mediawiki opzesäze.
+Wann de Hölp bem Opsäze bruchs, donn wigger ssare, wat erus kohm, wat heh shteiht.',
+ 'config-copyright' => "=== Urhävverrääsch un Lizänzbedengunge ===
+
+\$1
+
+Dat Projramm heh es frei, mer kann et wiggerjävve un verdeijle un och verändere ungger dä Bedengunge vun de GNU <i lang=\"en\">General Public License</i> (Alljemeine öffentlesche Lizänz) wi se vun de <i lang=\"en\">Free Software Foundation</i> (de Shteftung för frei Projramme) veröffentlesch woode es. Dobei kanns De Der de Version 2 vun dä Lizanz ußsöhke, udder jeede Version donoh, wi et Der jefällt.
+
+Dat Projramm weed wigger jejovve met dä Hoffnung, dat et jät nöz, ävver '''ohne Jarrantie''', sujaa ohne de onußjeshproche Jarantie, '''verkoufbaa''' ze sin, udder '''för öhnds_ene beshtemmpte Zweck ze bruche''' ze sin.
+Liß de GNU <i lang=\"en\">General Public License</i> sellver, öm mieh ze erfahre.
+
+Do sullts en <doclink href=Copying>Kopie vun dä alljemene öffentlesche Lizänz vun dä GNU</doclink> (<i lang=\"en\">GNU General Public License</i>) zosamme met heh däm Projramm krääje han. Wann dat nit esu es, schrief aan de <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA</i>. udder [http://www.gnu.org/copyleft/gpl.html liß se online övver et Internet].",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki sing Hompäjdsch]
+* [http://www.mediawiki.org/wiki/Help:Contents Handbooch för Aanwender]
+* [http://www.mediawiki.org/wiki/Manual:Contents Handbooch för Administratore un Wiki_Köbesse]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Öff jeshtallte Froore met Antwoote]
+----
+* <doclink href=Readme>Liß Mesch! (<i lang="en">Read me</i>)</doclink>
+* <doclink href=ReleaseNotes><i lang="en">Release notes</i> Övver heh di Projrammversion</doclink>
+* <doclink href=Copying><i lang="en">Copying</i> — Lizänzbeshtemmunge</doclink>
+* <doclink href=UpgradeDoc><i lang="en">Upgrading</i> — Ob en neu Projrammversion jonn</doclink>',
+ 'config-env-good' => 'De Ömjävung es jeprööf.
+Do kanns MediaWiki opsäze.',
+ 'config-env-bad' => 'De Ömjävung es jeprööf.
+Do kanns MediaWiki nit opsäze.',
+ 'config-env-php' => 'PHP $1 es doh.',
+ 'config-env-php-toolow' => 'PHP $1 es enshtalleert.
+Ävver MediaWiki bruch PHP $2 udder hühter.',
+ 'config-unicode-using-utf8' => 'För et <i lang="en">Unicode</i>-Nommaliseere dom_mer däm <i lang="en">Brion Vibber</i> sing Projramm <code lang="en">utf8_normalize.so</code> nämme.',
+ 'config-unicode-using-intl' => 'För et <i lang="en">Unicode</i>-Nommaliseere dom_mer dä [http://pecl.php.net/intl Zohsaz <code lang="en">intl</code> uss em <code lang="en">PECL</code>] nämme.',
+ 'config-unicode-pure-php-warning' => '\'\'\'Opjepaß:\'\'\' Mer kunnte dä [http://pecl.php.net/intl Zohsaz <code lang="en">intl</code> uss em <code lang="en">PECL</code>] för et <i lang="en">Unicode</i>-Nommaliseere nit fenge. Dröm nämme mer dat eijfache, ävver ärsh lahme, <i lang="en">PHP</i>-Projrammshtöck doför.
+För jruuße Wikis met vill Metmaachere doht Üsch die Sigg övver et [http://www.mediawiki.org/wiki/Unicode_normalization_considerations <i lang="en">Unicode</i>-Nommaliseere] (es op Änglesch) aanloore.',
+ 'config-unicode-update-warning' => "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.
+Doht di [http://www.mediawiki.org/wiki/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
+ 'config-no-db' => 'Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.',
+ 'config-no-db-help' => 'Mer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.
+Mer künne met heh dä Daatebangke ömjonn: $1.
+
+Wann De nit om eijene Rääshner bes, moß De Dinge <i lang="en">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.
+Wann de PHP sellver övversaz häs, donn ene Zohjang för en Daatebangk enbenge, för e Beishpell met: <code lang="en">./configure --with-mysql</code> op ene <i lang="en">command shell</i>.
+Wann De PHP uss enem <i lang="en">Debian</i> udder <i lang="en">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang="en">php5-mysql</code> op Dinge Räschner bränge.',
+ 'config-no-fts3' => "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [http://sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
+ 'config-register-globals' => "'''Opjepaß:''' dem PHP singe Schallder <code lang=\"en\">[http://php.net/register_globals register_globals]</code> es enjeschalldt.
+'''Donn dä ußmaache, wann De kann.'''
+MediaWiki löp och esu, dä künnt ävver Sesherheitslöcke opmaache, di mer noch nit jefonge un eruß jemaat hät.",
+ 'config-magic-quotes-runtime' => "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> es enjeschalldt.
+Dä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.
+Domet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.
+Dat heiß, mer moß en affschallde, söns jeiht nix.",
+ 'config-magic-quotes-sybase' => "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> es enjeschalldt.
+Dä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.
+Domet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.
+Dat heiß, mer moß en affschallde, söns jeiht nix.",
+ 'config-mbstring' => "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> es enjeschalldt.
+Dat sorresch för Fähler un kann enjejovve Daate esu kapott maach, dat doh draan nix mieh ze repareere es.
+Domet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.
+Dat heiß, mer moß en affschallde, söns jeiht nix.",
+ 'config-ze1' => "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]</code> es enjeschalldt.
+Dat sorresch för schräcklejje Fähler em MediaWiki.
+Dat kam_mer domet nit ennreeshte un och nit loufe lohße.
+Dat heiß, mer moß en affschallde, söns jeiht nix.",
+ 'config-safe-mode' => "'''Opjepaß:''' Dem PHP singe <code lang=\"en\">[http://www.php.net/features.safe-mode safe mode]</code> es aanjeschalldt. Dat kann Ärjer maache, besönders beim Datteie Huhlaade bei de Ongershtözung för <code lang=\"en\">math</code>-Befähle.",
+ 'config-xml-bad' => 'Dem PHP sing XML-Modul es nit ze fenge.
+MediaWiki bruch Funxjohne en däm Modul un deiht et esu nit.
+Wann De <i lang="en">Mandrake</i> aam loufehäs, donn dat Pakätt <code lang="en">php-xml</code> enstalleere.',
+ 'config-pcre' => 'Dem PHP sing Modul för <i lang="en">PCRE</i> schingk ze fähle.
+MediaWiki deiht et nit ohne de Funxjohne för de <i lang="en">Perl-compatible regular expressions</i>.',
+ 'config-pcre-no-utf8' => "'''Dä:''' Et PHP-Modul <i lang=\"en\">PCRE</i> schingk ohne de <i lang=\"en\">PCRE_UTF8</i>-Aandeile övversaz ze sin.
+MediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
+ 'config-memory-raised' => 'Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang="en">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.',
+ 'config-memory-bad' => "'''Opjepaß:''' Dem PHP singe Parameeter <code lang=\"en\">memory_limit</code> es \$1.
+Dat es wall ze winnisch.
+Et Enreeschte kunnt doh draan kappott jon!",
+ 'config-xcache' => 'Dä <code lang="en">[http://trac.lighttpd.net/xcache/ XCache]</code> es ennjeresht.',
+ 'config-apc' => 'Dä <code lang="en">[http://www.php.net/apc APC]</code> es ennjeresht.',
+ 'config-eaccel' => 'Dä <code lang="en">[http://eaccelerator.sourceforge.net/ eAccelerator]</code> es ennjeresht.',
+ 'config-wincache' => 'Dä <code lang="en">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> es ennjeresht.',
+ 'config-no-cache' => '\'\'\'Opjepaß:\'\'\' Mer kunnte dä <code lang="en">[http://eaccelerator.sourceforge.net eAccelerator]</code>, dä <code lang="en">[http://www.php.net/apc APC]</code>, dä <code lang="en">[http://trac.lighttpd.net/xcache/ XCache]</code> un dä <code lang="en">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> nit fenge.
+Et <i lang="en">object caching</i> es nit müjjelesh un ußjeschalldt.',
+ 'config-diff3-bad' => 'Mer han <i lang="en">GNU</i> <code lang="en">diff3</code> nit jefonge.',
+ 'config-imagemagick' => 'Mer han <i lang="en">ImageMagick</i> jefonge: <code>$1</code>.
+Et Ömrääschne en Minni-Beldsche weed müjjelesch sin, wann De et Belder Huhlaade zohlöhß.',
+ 'config-gd' => 'Mer han de ennjeboute GD-Jrafik-Projramm-Biblijotheek jefonge.
+Et Ömrääschne en Minni-Beldsche weed müjjelesch sin, wann De et Belder Huhlaade zohlöhß.',
+ 'config-no-scaling' => 'Mer han weeder de GD-Jrafik-Projramm-Biblijotheek, noch <i lang="en">ImageMagick</i> jefonge.
+Et Ömrääschne en Minni-Beldsche weed ußjeschalldt.',
+ 'config-no-uri' => "'''Fähler:''' Mer kunnte der aktoälle <i lang=\"en\">URI</i> nit erusfenge.
+Et Enreeschte es domet heh aam Engk.",
+ 'config-uploads-not-safe' => "'''Opjepaß:''' Uß däm jewöhnlijje Verzeichnes för de huhjelaade Datteie, dat es <code>$1</code>, künnte öhnzwällsche Skrepte un Projramme ußjeföhrt wääde. Och wann MediaWiki de huhjelaade Datteie prööf, dat kein bekannte Risike dren sin, sullt mer doch dat [http://www.mediawiki.org/wiki/Manual:Security#Upload_security Sesherheitsloch] zoh maache, ih dat mer et Dattei Huhlaade zohlöht.",
+ 'config-brokenlibxml' => 'Op Dingem Rääschner loufe Versione vun PHP un <code lang="en">libxml2</code> zosamme, di ävver nit zosamme paßße, un de Daate em MediaWiki un ander Web_Aanwändunge [http://bugs.php.net/bug.php?id=45996 bug kapott maache].
+Jangk op PHP 5.2.9 udder dohnoh un op <code lang="en">libxml2</code> 2.7.3 udder dohnoh.
+Heh jeihd et nit wigger.',
+ 'config-using531' => 'MediaWiki läuf nit met PHP $1 zosamme wääje enem [http://bugs.php.net/bug.php?id=50394 Fähler em Zosammehang met Parrameetere för <code lang="en">__call()</code>].
+Jangk op de Version 5.3.2 vum <i lang="en">PHP</i> ov dohnoh, udder op de Version 5.3.0 udder dovöör, öm dat Problem ze ömjonn.
+Heh jeiht et nit wigger.',
+ 'config-db-type' => 'De Zoot Daatebangk:',
+ 'config-db-host' => 'Dä Name vun däm Rääschner met dä Daatebangk:',
+ 'config-db-host-help' => 'Wann Dinge ẞööver för de Daatebangk ob enem andere Rääschner es, donn heh dämm singe Name udder <i lang="en">IP</i>-Addräß enjävve.
+
+Wann De ob enem Meetẞööver beß, weet Der Dinge Provaider odder däm sing Dokemäntazjuhn saare, wat De endraare moß.
+
+Wann De ob enem ẞööver onger <i lang="en">Windows</i> am enshtalleere bes un en <i lang="en">MySQL</i>-Daatebangk häs, künnd_et sin, dat „<code lang="en">localhost</code>“ nit douch för der Name vum ẞööver. Wann dad-esu es, versöhg et ens met „<code lang="en">127.0.0.1</code>“ als <i lang="en">IP</i>-Addräß vum eije Rääschner.',
+ 'config-db-host-oracle' => 'Dä Daatebangk ier <i lang="en" title="Transparent Network Substrate">TNS</i>:',
+ 'config-db-host-oracle-help' => 'Donn ene jöltije [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm „<i lang="en">Local Connect</i>“-Name] aanjävve. De Dattei „<code lang="en">tnsnames.ora</code>“ moß för heh dat Projamm seschbaa un ze Lässe sin.<br />Wann heh de Projamm_Biblijoteeke für de Aanwänderprojramme för de Version 10g udder neuer enjesaz wääde, kam_mer och et [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm „<i lang="en">Easy Connect</i>“] jenumme wääde för der Name ze verjävve.',
+ 'config-db-wiki-settings' => 'De Daate vum Wiki',
+ 'config-db-name' => 'Dä Name vun dä Daatebangk:',
+ 'config-db-name-help' => 'Jiff ene Name aan, dä för Ding Wiki passe deiht.
+Doh sullte kei Zweschrereum un kein Stresche dren sin.
+
+Wann De nit op Dingem eije Rääschner bes, künnt et sin, dat Dinge Provaider Der extra ene beshtemmpte Name för de Daatebangk jejovve hät, uffr dat de dä drom froore moß udder dat De de Daatebangke övver e Fommulaa selver enreeschte moß.',
+ 'config-db-name-oracle' => 'Schema för de Daatebangk:',
+ 'config-db-account-oracle-warn' => 'Mer han drei Aate, wi mer <i lang="en">Oracle</i> als Daatebangk aanbenge künne.
+
+Wann De ene neue Zohjang op de Daatenbangk met Naame un Paßwoot mem Projramm för et Opsäze aanlääje wells, dann jif ene Zohjang met däm Rääsch „<i lang="en">SYSDBA</i>“ aan, dä et alld jitt, un jif däm di Daate aan för dä neue Zohjang aanzelääje.
+Do kanns och dä neue Zohjang vun Hand aanlääje un heh beim Opsäze nur dää aanjävve — wann dä dat Rääsch hät, en de Daatebangk Schema_Objäkte aanzelääje.
+Udder De jiß zwei ongerscheidlijje Zohjäng op de Daatenbangk aan, woh eine vun dat Rääsch zom Aanlääje hät un dä andere moß dat nit un es för der nomaale Bedrief zohshtändesch.
+
+En Skrep, wat ene Zohjang op de Daatenbangk aanlääsch met all dä nüüdejje Rääschde, fengks De em Verzeishneß <code lang="en">maintenance/oracle/</code> vun Dingem MediaWiki. Donn draan dengke, dat ene Zohjang met beschrängkte Rääschde all di Müjjeleschkeite för et Waade un Repareere nit hät, di de jewöhnlejje Zoot Zohjang met sesh brängk.',
+ 'config-db-install-account' => 'Der Zohjang för en Enreeschte',
+ 'config-db-username' => 'Dä Name vun däm Aanwender för dä Zohjref op de Daatebangk:',
+ 'config-db-password' => 'Et Paßwoot vun däm Aanwender för dä Zohjref op de Daatebangk:',
+ 'config-db-password-empty' => 'Jiv e Paßwoot aan, för dä neue Aanwender för dä Zohjref op de Daatebangk, $1.
+Ed es zwa müjjelesch, Aanwender för dä Zohjref op de Daatebangk der ohne e Paßwoot aanzelääje,
+ävver dat wöhr en schwere Jevah för de Sescherheit vum Wiki.',
+ 'config-db-install-username' => 'Jiv ene Name aan för dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere.
+Dat es keine Metmaacher_Name em Wiki — heh dä Name es alleins en der Daatebangk bikannt.',
+ 'config-db-install-password' => 'Jiv e Paßwoot aan för dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere.
+Dat es kei Paßwoot för ene Metmaacher em Wiki — et es alleins en der Daatebangk bikannt.',
+ 'config-db-install-help' => 'Donn dä Name un et Paßwoot vun däm Aanwänder för der Zohjreff op de Daatebangk jäz för et Enreeshte aanjävve.',
+ 'config-db-account-lock' => 'Donn dersälve Name un et sälve Paßwoot för der nomaale Bedrief vum Wiki bruche',
+ 'config-db-wiki-account' => 'Dä Name vun däm Aanwender för dä Zohjref op de Daatebangk em nomaale Bedrief:',
+ 'config-db-wiki-help' => 'Jiv ene Name un e Paßwoot aan, för dä Aanwender för dä Zohjref op de Daatebangk, wann et wiki nommaal aam Loufe es.
+Wan et dä Name en der Daatebangk noch it jit, un dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere
+jenooch Beräschtijunge hät, läät dä heh dä Aanwender en der Daatebangk aan un jidd_em di Rääschde, di dä nüüdesch hät, ävver nit mieh.',
+ 'config-db-prefix' => 'Vörsaz för de Name vun de Tabälle en de Daatebangk:',
+ 'config-db-prefix-help' => 'Wann ein Daatebangk för mieh wi ein Wiki udder e Wiki uns söns jät zosamme jebruch weed, dann kam_mer noch jet vör de Tabälle ier Name säze. Esu ene Vörsaz sull dubblte Tabällename vermeide hälfe.
+Donn kein Zwescheräum enjävve!
+
+Jewöhnlesch bliev dat Feld heh ävver läddesch.',
+ 'config-db-charset' => 'Dä Daatebangk iere Zeishesaz',
+ 'config-charset-mysql5-binary' => 'MySQL (4.1 udder 5.0) binär',
+ 'config-charset-mysql5' => 'MySQL (4.1 udder 5.0) UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 röckwääts kompatibel UTF-8',
+ 'config-charset-help' => "''' Opjepaß:'''
+Wann De et '''röckwääts kompatibel UTF-8 Fommaat''' nemmps, met dem <i lang=\"en\">MySQL</i> singe Version4.1 udder hüüter, dann künnt dat all di Zeishe kappott maache, die nit em <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> sen, un domet all ding Sesherungskopieje kapott maache, wat mer nieh mieh retuur krijje kann.
+
+Beim Shpeishere em '''binäre Fomaat''' deiht MediaWiki de Täxte, di em UTF-8 Fommaat kumme, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.
+Dat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeishe met faßzehallde.
+
+Beim Shpeishere em '''UTF-8 Fomaat''' deiht et <i lang=\"en\">MySQL</i> der Zeishesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,
+allerdengs künne kein Zeishe ußerhalv vum [http://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Shprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeshpeishert wääde.",
+ 'config-mysql-old' => 'Mer bruche <i lang="en">MySQL</i> $1 udder neuer. Em Momang es <i lang="en">MySQL</i> $2 aam Loufe.',
+ 'config-db-port' => 'De Pooz-Nommer (<i lang="en">port</i>) för de Daatebangk:',
+ 'config-db-schema' => 'Et Schema en de Datebangk för MediaWiki:',
+ 'config-db-schema-help' => 'För jewöhnlesch es dat Schema en Odenong.
+Donn bloß jät draan ändere, wann De sescher weiß, dat dat nüüdesch es.',
+ 'config-sqlite-dir' => 'Dem <i lang="en">SQLite</i> sing Daateverzeishnes:',
+ 'config-sqlite-dir-help' => '<i lang="en">SQLite</i> hät all sing Daate zosamme en en einzel Dattei.
+
+En dat Verzeishneß, wat De aanjiß, moß dat Web_ẞööver_Projramm beim Opsäze eren schriive dörrve.
+
+Dat Verzeishneß sullt \'\'\'nit\'\'\' övver et Web zohjänglesch sin, dröm dom_mer et nit dohen, woh de <i lang="en">PHP</i>-Datteije sin.
+
+Mer donn beim Opsäze zwa uß Vöörssh en <code lang="en">.htaccess</code> Dattei dobei, ävver wann di nit werrek, künnte Lück vun ußerhallef aan Ding Daatebangk_Dattei eraan kumme.
+Doh shtonn Saache dren, wi de Addräße för de Metmaacher ier <i lang="en">e-mail</i> un de verschlößelte Paßwööter un de vershtoche un de fottjeschmeße Sigge un ander Saache ussem Wiki, di mer nit öffentlesch maache darref.
+
+Donn Ding Daatebangk et beß janz woh anders hen, noh <code lang="en">/var/lib/mediawiki/\'\'wikiname\'\'</code> för e Beishpell.',
+ 'config-oracle-def-ts' => 'Tabälleroum för der Shtandattjebruch:',
+ 'config-oracle-temp-ts' => 'Tabälleroum för der Jebruch zweschedorsh:',
+ 'config-type-mysql' => '<i lang="en">MySQL</i>',
+ 'config-type-postgres' => '<i lang="en">PostgreSQL</i>',
+ 'config-type-sqlite' => '<i lang="en">SQLite</i>',
+ 'config-type-oracle' => '<i lang="en">Oracle</i>',
+ 'config-support-info' => 'MediaWiki kann met heh dä Daatebangk_Süßteeme zosamme jonn:
+
+$1
+
+Wann dat Daatebangk_Süßteem, wat De nämme wells, onge nit dobei es, dann donn desch aan di Aanleidonge hallde, di bovve verlengk sen, öm et op Dingem ẞööver singem Süßteem müjjelesh ze maache, se aan et Loufe ze krijje.',
+ 'config-support-mysql' => '* <i lang="en">$1</i> es dat vum MediaWiki et eets ongershtöz Daatebangksüßteem ([http://www.php.net/manual/de/mysql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang="en">MySQL</i> dobei, op Deutsch])',
+ 'config-support-postgres' => '* <i lang="en">$1</i> es e bikannt Daatebangksüßteem met offe Quälltäxde, un en och en Wahl nävve <i lang="en">MySQL</i> ([http://www.php.net/manual/de/pgsql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang="en">PostgreSQL</i> dobei, op Deutsch]) Et sinn_er ävver paa klein Fählershe bekannt, um kunne dat em Momang för et reschtijje Werke nit emfähle.',
+ 'config-support-sqlite' => '* <i lang="en">$1</i> es e eijfach Daatebangksüßteem, wat joot ongershtöz weed. ([http://www.php.net/manual/de/pdo.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">SQLite</i> dobei, op Deutsch])',
+ 'config-support-oracle' => '* <i lang="en">$1</i> es e jeschäfflesch Daatebangksüßteem för Ferme. ([http://www.php.net/manual/de/oci8.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">OCI8</i> dobei, op Deutsch])',
+ 'config-header-mysql' => 'De Enshtällunge för de <i lang="en">MySQL</i> Daatebangk',
+ 'config-header-postgres' => 'De Enshtällunge för de <i lang="en">PostgreSQL</i> Daatebangk',
+ 'config-header-sqlite' => 'De Enshtällunge för de <i lang="en">SQLite</i> Daatebangk',
+ 'config-header-oracle' => 'De Enshtällunge för de <i lang="en">Oracle</i> Daatebangk',
+ 'config-invalid-db-type' => 'Dat es en onjöltijje Zoot Daatebangk.',
+ 'config-missing-db-name' => 'Do moß jät enjävve för dä Name vun dä Daatebangk.',
+ 'config-missing-db-host' => 'Do moß jät enjävve för dä Name vun däm Rääschner met dä Daatebangk.',
+ 'config-missing-db-server-oracle' => 'Do moß jät enjävve för dä Daatebangk ier <i lang="en" title="Transparent Network Substrate">TNS</i>.',
+ 'config-invalid-db-server-oracle' => 'Dä Daatebangk ier <i lang="en" title="Transparent Network Substrate">TNS</i> kann nit „$1“ sin, dat es esu nit jöltesch.
+Döh dörve bloß <i lang="en" title="American Standard Code for Information Interchange">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstreshe (_), un Punkte (.) dren vörkumme.',
+ 'config-invalid-db-name' => 'Dä Daatebangk iere Name kann nit „$1“ sin, dä es esu nit jöltesch.
+Döh dörve bloß <i lang="en" title="American Standard Code for Information Interchange">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstresh (_), un Bendeshtresh (-) dren vörkumme.',
+ 'config-invalid-db-prefix' => 'Dä Vörsaz för de Name vun de Tabälle en de Daatebangk kann nit „$1“ sin, dä es esu nit jöltesch.
+Döh dörve bloß <i lang="en" title="American Standard Code for Information Interchange">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstreshe (_), un Bendeshtreshe (-) dren vörkumme.',
+ 'config-connection-error' => '$1.
+
+Donn de Name för dä Rääschner, vun däm Aanwender för dä Zohjref op de Daatebangk, un et Paßwoot prööfe, repareere, un dann versöhg et norr_ens.',
+ 'config-invalid-schema' => 'Dat Schema för MediaWiki kann nit „$1“ sin, dä Name wöhr esu nit jöltesch.
+Döh dörve bloß <i lang="en" title="American Standard Code for Information Interchange">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), un Ongerstreshe (_) dren vörkumme.',
+ 'config-db-sys-create-oracle' => 'Dat Projramm för MediaWiki opzesäze kann bloß <i lang="en">SYSDBA</i> bruche för ene neue Zohjang zor Daatebangk enzereeschte!',
+ 'config-db-sys-user-exists-oracle' => 'Dä Aanwender „$1“ för dä Zohjref op de Daatebangk jidd_et ald. <i lang="en">SYSDBA</i> kam_mer bloß bruche, för ene neue Zohjang enzereeschte!',
+ 'config-postgres-old' => 'Mer bruche <i lang="en">PostgreSQL</i> $1 udder neuer. Em Momang es <i lang="en">PostgreSQL</i> $2 aam Loufe.',
+ 'config-sqlite-name-help' => 'Söhk enen Name uß, dä Ding Wiki beschrief.
+Donn kein Bendeschresch un Zweschräum en däm Name bruche.
+Dä Name weed för der Dateiname för de <i lang="en">SQLite</i> Daatebangk jenumme.',
+ 'config-sqlite-parent-unwritable-group' => 'Mer kunnte dat Verzeischneß för de Daate, <code lang="en"><nowiki>$1</nowiki></code>, nit enreeschte, weil dat Projramm fö dä Web_ẞööver en dat Verzeischneß doh drövver, <code><nowiki>$2</nowiki></code>, nix erin donn darref.
+
+Mer han dä Name vun däm Zohjang op et Süßteem eruß jefonge, onger dämm dat Web_ẞööver_Projramm läuf. Jez moß De bloß doför sorrje, dat dä en dat Verzeischneß <code><nowiki>$3</nowiki></code> schrieve kann, öm heh wigger maache ze künne.
+Ob enem Süßteem met <i lang="en">Unix</i>- oder <i lang="en">Linux</i> jeiht dat esu:
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Mer kunnte dat Verzeischneß för de Daate, <code lang="en"><nowiki>$1</nowiki></code>, nit enreeschte, weil dat Projramm fö dä Web_ẞööver en dat Verzeischneß doh drövver, <code><nowiki>$2</nowiki></code>, nix erin donn darref.
+
+Mer han dä Name vun däm Zohjang op et Süßteem nit eruß fenge künne, onger dämm dat Web_ẞööver_Projramm läuf. Jez moß De bloß doför sorrje, dat dä en dat Verzeischneß <code><nowiki>$3</nowiki></code> schrieve kann, öm heh wigger maache ze künne. Wann De dä Name och nit weiß, maach, dat jeeder_ein doh schrieve kann.
+Ob enem Süßteem met <i lang="en">Unix</i>- oder <i lang="en">Linux</i> jeiht dat esu:
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Ene Fähler es opjetrodde beim Aanlääje vum Daate_Verzeishneß „$1“.
+Don dä Plaz för et Shpeishere prööfe un Repareere, dann versöhg et norr_ens.',
+ 'config-sqlite-dir-unwritable' => 'Mer künne nit en dat Verzeishneß „$1“ schrieeve
+Donn dohvun de Zohjreffs_Rääschde esu verändere, dat der Webßööver doh dren schrieeve kann, un dann versöhg et norr_ens.',
+ 'config-sqlite-connection-error' => '$1.
+
+Donn onge dat Verzeishnes un der Name vun der Daatebangk prööfe un repareere, un dann versöhg_et norr-ens.',
+ 'config-sqlite-readonly' => 'En di Dattei <code lang="en">$1</code> künne mer nit schrieve.',
+ 'config-sqlite-cant-create-db' => 'Mer kunnte di Dattei <code lang="en">$1</code> för de Daatebangk nit aanlääje.',
+ 'config-sqlite-fts3-downgrade' => 'Dat PHP heh hät kein Ongershtözong för FTS3, dröm donn mer de Daatebangktabälle eronger shtoofe.',
+ 'config-can-upgrade' => 'Et sinn-er ald Daatebangktabelle vum MediaWiki en dä Daatebangk.
+Öm di op der Shtand vum MediaWiki $1 ze bränge, donn jäz op „{{int:config-continue}}“ klecke.',
+ 'config-upgrade-done' => "Alles es jäz om neue Shtand.
+
+Mer kann dat Wiki jäz [\$1 bruche].
+
+Wann De Ding Dattei <code lang=\"en\">LocalSettings.php</code> neu schrieve wells, donn onge op dä Knopp klicke.
+Dat dom_mer ävver '''nit vörschlonn'''em Jääjedeil, ußer, wann et Probleme mem Wiki jitt.",
+ 'config-upgrade-done-no-regenerate' => 'Alles es jäz om neue Shtand.
+
+Mer kann dat Wiki jäz [$1 bruche].',
+ 'config-regenerate' => 'Donn de Dattei <code lang="en">LocalSettings.php</code> neu opsäze →',
+ 'config-show-table-status' => 'Et Kommando <code lang="en">SHOW TABLE STATUS</code> aan de Daatebangk es donävve jejange!',
+ 'config-unknown-collation' => "'''Opjepaß:''' De Daatabangk deiht en onbikannte Reijefollsch bruche, för Booshtaabe un Zeishe ze verjliishe un ze zotteere.",
+ 'config-db-web-account' => 'Dä Zohjang zor Daatebangk fö et Wiki',
+ 'config-db-web-help' => 'Donn ene Name un e Paßwoot för der Zohjang zor Daatebangk för et Wiki em nomaale Bedrief aanjävve.',
+ 'config-db-web-account-same' => 'Donn dersällve Zohjang nämme, wi heh beim Opsäze.',
+ 'config-db-web-create' => 'Donn dä Zohjang aanlääje, wann dä noch nit doh es.',
+ 'config-db-web-no-create-privs' => 'Dä Zohjang för et Opsäze es nit berääschtesch, ene ander Zohjan enzereeschte.
+Dä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!',
+ 'config-mysql-engine' => 'De Zoot udder et Fommaat vun de Tabälle:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' es fö jewöhnlesch et beß, weil vill Zohjreffe op eijmohl joot ongershtöz wääde.
+
+'''MyISAM''' es flöcker op Rääschnere met bloß einem Minsch draan, un bei Wikis, di mer bloß lässe un nit schrieeve kann.
+MyISAM-Daatebangke han em Schnett mieh Fähler un jon flöcker kappott, wi InnoDB-Daatebangke.",
+ 'config-mysql-charset' => 'Dä Daatebangk iere Zeishesaz:',
+ 'config-mysql-binary' => 'binär',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "Beim Shpeishere em '''binäre Fomaat''' deiht MediaWiki de Täxte, di em UTF-8 Fommaat kumme, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.
+Dat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeishe met faßzehallde.
+
+Beim Shpeishere em '''UTF-8 Fomaat''' deiht et <i lang=\"en\">MySQL</i> der Zeishesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,
+allerdengs künne kein Zeishe ußerhalv vum [http://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Shprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeshpeishert wääde.",
+ 'config-site-name' => 'Däm Wiki singe Name:',
+ 'config-site-name-help' => 'Dä douch em Tittel vun de Brauserfinstere un aan ätlije andere Shtälle op.',
+ 'config-site-name-blank' => 'Donn ene Name för di Sait aanjävve.',
+ 'config-project-namespace' => 'Dä Name för et Appachtemang övver et Projäk:',
+ 'config-ns-generic' => 'Projäk',
+ 'config-ns-site-name' => 'Et sällve wi däm Wiki singe Name: $1',
+ 'config-ns-other' => 'Andere (jiff aan wälshe)',
+ 'config-ns-other-default' => 'MingWiki',
+ 'config-project-namespace-help' => "Noh dämm Vörbeld vun de Wikipeedija, donn vill Wikis dänne ier Sigge övver et Wiki un sing Rääjelle vun dä Sigge mem Enhald vum Wiki tränne, un en enem extra Appachtemang för et „'''Projäk'''“ afflääje.
+Sigge en däm Appachtemang fange all med enem beshtemmpte Vörsaz aan, däm Name vum Appachtemang, un dä moß De heh faßlääje.
+Dä Name kann beshtemmpte Zeiche nit enthallde, wi „#“ un „:“ un et es Tradizjuhn, dat hä vum Name vum Wiki her kütt.",
+ 'config-ns-invalid' => 'Dat aanjejovve Appachtemang „<nowiki>$1</nowiki>“ es nit jöltesch.
+Nemm ene andere Name för däm Wiki sing eije Appachtemang.',
+ 'config-ns-conflict' => 'Dat aanjejovve Appachtemang „<nowiki>$1</nowiki>“ kütt ald als Standatt-Appachtemang em MediaWiki vör.
+Nemm ene andere Name för däm Wiki sing eije Appachtemang.',
+ 'config-admin-box' => 'Der Zohjang för der eezte Wiki_Köbes',
+ 'config-admin-name' => 'Metmaacher_Name:',
+ 'config-admin-password' => 'Et Paßwoot:',
+ 'config-admin-password-confirm' => 'Norrens dat Paßwoot:',
+ 'config-admin-help' => 'Jif Dinge leevste Name als Metmaacher för Desch aan, för e Beishpell „Schmitzens Pitter“
+— Dat weed dä Name wääde, met dämm De Desch enlogge deihs.',
+ 'config-admin-name-blank' => 'Jiv ene Metmaacher_Name en för dä Wiki-Köbes.',
+ 'config-admin-name-invalid' => '„<nowiki>$1</nowiki>“ es keine jöltijje Metmaacher_Name.
+Jiv ene joode Name en!',
+ 'config-admin-password-blank' => 'Do mos_e Paßwoot för dä Wiki_Köbes aanjävve!',
+ 'config-admin-password-same' => 'Dat Paßwoot un dä Name dörve nit ejaal sin!',
+ 'config-admin-password-mismatch' => 'Di Paßwööter sin ongerscheidlesh!',
+ 'config-admin-email' => 'Addräß för de <i lang="en">e-mail</i>:',
+ 'config-admin-email-help' => 'Jiv heh di Adräß för de <i lang="en">e-mail</i> aan, woh De <i lang="en">e-mail</i> vun ander Metmaacher uss_em Wiki hen krijje wells, di et Der müjjelesh määt, Ding Paßwoot automatetsch truusche ze lohße, un woh Nohreeshte övver veränderte Sigge op Dinge Oppaßleß hen jescheck wääde sulle.
+De kanns dat Fäld ävver och läddesch lohße.',
+ 'config-admin-error-user' => 'Beim Enreeshte vum Zohjang för dä Wiki_Köbes „<nowiki>$1</nowiki>“ es ene Fähler em Wiki opjetrodde.',
+ 'config-admin-error-password' => 'Beim Paßwoot-Säze för dä Wiki_Köbes „<nowiki>$1</nowiki>“ es ene Fähler em Wiki opjetrodde.: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Do häs_en onjöltijje Addräß för de <i lang="en">e-mail</i> aanjejovve.',
+ 'config-subscribe' => 'Donn de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce <i lang="en">e-mail</i>-Leß met de Aanköndijunge vum MediaWiki] abonnere.',
+ 'config-subscribe-help' => 'Do kumme bloß winnish Meddeilunge un di jonn övver neu Versiohne vom MediaWiki un weeshtejje Saache vun däm sing Sesherheit.
+Do sullts se abbonneere, un Ding MediWiki_Projramme op der neue Shtand bränge, wann neu Version eruß kumme.',
+ 'config-almost-done' => 'Do bes beinah dorsh!
+Do künnts jez der Räß vun de einzel Enshtellunge övverjonn, un et Wiki tiräktemang fäädesch opsäze.',
+ 'config-optional-continue' => 'Wells De noch mieh Frore jeshtallt krijje un noch mieh Enshtällunge maache?',
+ 'config-optional-skip' => 'Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.',
+ 'config-profile' => 'Enshtällunge för de Metmaacher ier Rääschte:',
+ 'config-profile-wiki' => 'E tradizjonäll offe Wiki',
+ 'config-profile-no-anon' => 'Schriever möße enlogge',
+ 'config-profile-fishbowl' => 'Bloß ußdröcklesch zohjelohße Schriever',
+ 'config-profile-private' => 'E jeschloße Privat_Wiki',
+ 'config-profile-help' => "Wikis loufe et beß, wam_mer esu vill Lück wi müjjelesch draan metmaache un schrieve löht.
+Met MediaWiki es et ejfach, de neuste Änderunge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.
+
+Bloß, mänsh eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leish, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.
+Esu häß De de Wahl:
+
+'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne enzelogge.
+
+'''{{int:config-profile-no-anon}}''', dat sorsh för mieh seeshbaa Verantwootlishkeite, künnt ävver zohfällije Methellefer verschrecke.
+
+'''{{int:config-profile-fishbowl}}''' löht nor de ußjesöhk Metmaacher schrieve, ävver de janze Öffentleshkeit kann et lässe un süht och de ällder Versione, un wat wää wann draan jedonn hät.
+
+'''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.
+
+Noch ander un un opwändijere Enshtellunge för de Rääschte sin müjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [http://www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.",
+ 'config-license' => 'Urhävverrääsch un Lizänz:',
+ 'config-license-none' => 'Kein Fooßreih övver de Lizänz',
+ 'config-license-cc-by-sa' => '<i lang="en">Creative Commons</i> Der Name moß jenannt sin, et Wiggerjävve es zohjelohße onger dersellve Bedengunge',
+ 'config-license-cc-by-nc-sa' => '<i lang="en">Creative Commons</i> Nit för e Jeschäff ze maache, et Wiggerjävve es zohjelohße unger dersellve Bedengunge',
+ 'config-license-cc-0' => '<i lang="en">Creative Commons</i> „Noll“',
+ 'config-license-gfdl-old' => 'De <i lang="en">GNU</i>-Lizänz för frei Dokemäntazjuhne Version 1.2',
+ 'config-license-gfdl-current' => 'De <i lang="en">GNU</i>-Lizänz för frei Dokemäntazjuhne, Version 1.3 udder en späädere',
+ 'config-license-pd' => 'Allmende (jemeinfrei, <i lang="en">public domain</i>)',
+ 'config-license-cc-choose' => 'En <i lang="en">Creative Commons</i> Lizänz, sellver ußjesöhk:',
+ 'config-license-help' => "Ättlijje öffentleje Wikis donn iehr Beidrääsh onger en [http://freedomdefined.org/Definition frei Lizänz] shtelle.
+Dat hellef, e Jeföhl vun Jemeinsamkeid opzeboue, un op lange Seesh emmer wider Beidrääsch ze krijje.
+Dat es nit onbedengk nüüdesh för e Jeschäffs- udder Privaat_Wiki.
+
+Wä Stöcke uß de Wikipedia bruche well, un han well, dat de Wikipedia uss_em eije Wiki jät övvernämme kann, sullt mer „'''<i lang=\"en\">Creative Commons</i>, dem Schriever singe Name moß jenannt wääde, un Wiggerjävve zoh dersellve Bedengunge es zohjelohße'''“ ußwähle.
+
+De su jenannte '''<i lang=\"en\">GNU Free Documentation License</i>''' (de freije Lizänz för Dokemäntazjuhne vun dä GNU) sen de ahle Lizänzbedenonge vun de Wikipedia. Se es emmer noch in Odenong un jöltesch, ävver se hädd e paa Eijeschaffte, die et Wiggerjävve, et widder Verwände un et Ußlääje schwieeresch maache.",
+ 'config-email-settings' => 'Enschtellunge för de <i lang="en">e-mail</i>',
+ 'config-enable-email' => 'De <i lang="en">e-mail</i> noh druße zohlohße',
+ 'config-enable-email-help' => 'Sulle <i lang="en">e-mails</i> zohjelohße sin, moß mer, domet et noher flupp, de [http://www.php.net/manual/en/mail.configuration.php Enschtellunge em PHP för de <i lang="en">e-mails</i>] zopaß jemaat han.
+Wann kein <i lang="en">e-mails</i> nüüdesch sin, kam_mer se heh afschallde.',
+ 'config-email-user' => '<i lang="en">e-mails</i> zwesche de Metmaacher zohlohße',
+ 'config-email-user-help' => 'Määt et müjjelesch, dat sesch de Metmaacher jääjesiggesch <i lang="en">e-mails</i> schecke künne, wann se dat en iehre eije Enschtellunge och enjeschalldt han.',
+ 'config-email-usertalk' => '<i lang="en">e-mails</i> mem Bescheid zohlohße, dat einem sing Klaafsigg verändert woodt',
+ 'config-email-usertalk-help' => 'Maach et müjjelesch, dat Metmaaacher en iere Enstellunge <i lang="en">e-mails</i> mem Bescheid zohlohße, dat einem sing Klaafsigg verändert woodt.',
+ 'config-email-watchlist' => 'Nohreeschte övver Änderonge aan Sigg op de Opaßleßte zohlohße',
+ 'config-email-watchlist-help' => 'Lohß Metmaacher Nohreeshte övver de Sigge op dänne iehr Oppaßleß krijje, wann se et en iehre Enschtellonge ußjewählt han.',
+ 'config-email-auth' => 'Donn de Övverprööfung för Zohjangsberääschtejunge övver de <i lang="en">e-mail</i> zohlohße',
+ 'config-email-auth-help' => 'Wann dat aanjeschald es, möße Metmaacher, di iehr Adräß för de <i lang="en">e-mail</i> neu aanjävve udder ändere, di Addräß övver ene Lengk beschtäätejje, dä se met de <i lang="en">e-mail</i> jescheck krijje.
+Bloß aan esu beschtääteschte Adräße deiht et Wiki <i lang="en">e-mails</i> schecke, Di künne vun annder Metmaachere kumme, udder vum Wiki sellver, wann en Sigg en däm Metmaacher singe Oppaßleß verändert woode es.
+Mer \'\'\'schlonn vör, dat aanzeschallde\'\'\' för öffentlesch Wikis, weil sönß zoh leisch Driß mem Wiki singe <i lang="en">e-mail</i> jemaat wääde künnt.',
+ 'config-email-sender' => 'De Adräß för de Antwoote op <i lang="en">e-mails</i>:',
+ 'config-email-sender-help' => 'Jiff de Adräß för de <i lang="en">e-mail</i> en, woh Antwoote ob em Wiki singe <i lang="en">e-mails</i> hen jonn sulle.
+Dat es och de Adräß, woh de <i lang="en">e-mails</i> met Fählermäldonge hen jon.
+Vill ẞöövere för de <i lang="en">e-mail</i> welle winnischßdens ene jöltijje Domain en dä Adräß han.',
+ 'config-upload-settings' => 'Belder un Datteie huh laade',
+ 'config-upload-enable' => 'Belder un Datteie huh laade zohlohße',
+ 'config-upload-help' => 'Datteije huh ze laade künnt e Risiko för dem ẞööver singe Sescherheit sin.
+Mieh doh drövver kam_mer em [http://www.mediawiki.org/wiki/Manual:Security Kapitel övver de Sescherheit] em Handbooch lässe.
+
+Öm et Huhlaade zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß <code lang="en">images</code> em MediaWiki singem Houpverzeischneß esu enshtälle, dat et Webßööverprojramm doh Datteije un Verzeischneße eren schrieve kann.
+Donoh donn heh di Saach zohlohße.',
+ 'config-upload-deleted' => 'Dat Verzeishneß för fottjeschmeße Datteije:',
+ 'config-upload-deleted-help' => 'Söhk e Verzeijschneß uß för de fottjeschmeße Datteije vum Wiki dren afzelääje.
+Et bäß es, wam_mer vum <i lang="en">world wide web</i> doh nit drahn kumme kann.',
+ 'config-logo' => 'Dem Wiki singem Logo sing <i lang="en">URL</i>:',
+ 'config-logo-help' => 'De Schtandart_Bedeen_Bovverfläsch vum MediaWiki hät e Logo bovve en der Eck met 135x160 Pixele.
+Donn e zopaß Logo huh laade, un donn däm sing URL heh endraare.
+
+Wells De kei Logo han, draach heh nix en.',
+ 'config-instantcommons' => 'Donn <i lang="en">InstantCommons</i> zohlohße.',
+ 'config-instantcommons-help' => '<i lang="en">[http://www.mediawiki.org/wiki/InstantCommons InstantCommons]</i> es en Eijeschaff, di et för Wikis müjjelesch määt, Belder, Tondatteie un ander Meedijedatteie enzebenge, di op dä Webßait vun de <i lang="en">[http://commons.wikimedia.org/ Wikimedia Commons]</i> ongerjebraat sin. Öm dat noze ze künne, moß dä ẞööver vum MediaWiki en Verbendung nohm Internet opnämme künne.
+
+Mieh Aanjaabe doh drövver un en Aanleidung, wi mer och ander Wikis ußer de <i lang="en">Wikimedia Commons</i> doför enreeschte kann, fengk mer em [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbooch].',
+ 'config-cc-error' => 'Et Ußsöhke övver de <i lang="en">Creative Commons</i> iehr Projramm zum Lizänzbeshtemme hät nix jebraat.
+Donn de Lizänz sellver beshtemme.',
+ 'config-cc-again' => 'Noch ens neu ußsöhke&nbsp;…',
+ 'config-cc-not-chosen' => 'Söhk uß, wat för en Lizänz vun de <i lang="en">Creative Commons</i> De han wells, un donn dann op „<i lang="en">proceed</i>“ klecke.',
+ 'config-advanced-settings' => 'Fottjeschredde Enshtellunge',
+ 'config-cache-options' => 'Enshtällunge för et Faßhallde vun Objäkte em Zweschsheisher:',
+ 'config-cache-help' => 'Objäkte em Zwescheshpeisher faßhallde, dat heiß öff jebruchte Daate en der <i lang="en">cache</i> donn, bruche mer, öm MediaWiki flöcker ze maache,
+Meddlere un jruuße Wiki-ẞaits sullte dat onbedengk ußnoze, un och bei klein Wikis weed mer et jood merke.',
+ 'config-cache-none' => 'Keine Zweschshpeijsher (Et jeid_em Wiki nix verloore, ußer velleish Schnälleshkeid wann vill loss es)',
+ 'config-cache-accel' => 'Ene Objäk<i lang="en">cache</i> vum PHP (<i lang="en">APC</i>, <i lang="en">eAccelerator</i>, <i lang="en">XCache</i>, udder <i lang="en">WinCache</i>)',
+ 'config-cache-memcached' => 'Donn der <code lang="en">memcached</code> ẞööver nämme (Määt extra Enshtellunge un Opsäze nüüdesch)',
+ 'config-memcached-servers' => 'De <code lang="en">memcached</code> ßöövere:',
+ 'config-memcached-help' => 'Donn de Leß aanhjävve, met de <i lang="en">IP</i>-Addräße för der <code lang="en">memcached</code> ẞööver ze bruche.
+Se sullte ein pro Reih opjeschrevve sin, un en Pooz (<i lang="en">port</i>) ier Nommer han, För e Beishpell, esu:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Do häss der <code lang="en">memcached</code> als Dinge Zoot vun Zwescheshpeijscher aanjejovve, ävver nit eine ẞööver doför.',
+ 'config-memcache-badip' => 'Do häss en onjöltijje <i lang="en">IP</i>-Addräß för der <code lang="en">memcached</code> ẞööver aanjejovve: $1.',
+ 'config-memcache-noport' => 'Do has kein Pooz (<code lang="en">port</code>) Nommer aanjejovve för mem <code lang="en">memcached</code> ẞööver ze bruche: $1.
+Wann De di Nommer nit weiß, der Shtandatt es 11211.',
+ 'config-memcache-badport' => 'Dem <code lang="en">memcached</code> ẞööver singe Pooz (<code lang="en">port</code>) Nommere sullte zwesche $1 un $2 sin.',
+ 'config-extensions' => 'Projramm-Zosätz (<i lang="en">extensions</i>)',
+ 'config-extensions-help' => 'Di bovve opjeleß Zohsazprojramme för et MediaWiki sin em Verzeischneß <code lang="en">./extensions</code> ald ze fenge.
+
+Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellunge bruche.',
+ 'config-install-alreadydone' => "'''Opjepaß:'''
+Et sühd esu uß, wi wann De MediaWiki ald enshtalleet hätß, un wöhrs aam Versöhke, dat norr_ens ze donn.
+Jang wigger op de näähßte Sigg.",
+ 'config-install-begin' => 'Wann De op „{{int:config-continue}}“ klecks, jeiht de Enshtallazjuhn vum MediaWiki loßß.
+Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.',
+ 'config-install-step-done' => 'jedonn',
+ 'config-install-step-failed' => 'donävve jejange',
+ 'config-install-extensions' => 'Zohsazprojramme enjeschloße',
+ 'config-install-database' => 'Ben de Daatebangk aam ennreeschte.',
+ 'config-install-pg-schema-not-exist' => 'Dat Scheema för <i lang="en">PostgreSQL</i> es nit doh.',
+ 'config-install-pg-schema-failed' => 'Et Tabälle-Opsäze es donävve jejange.
+Donn doför sorrje, dat dä Daatebangk-Aanwänder „$1“ en dämm Daatebangkscheema „$2“ schrieve kann.',
+ 'config-install-pg-commit' => 'Ben de Änderonge aam ennbränge.',
+ 'config-install-pg-plpgsql' => 'Ben noh dä Daatebangkshprooch <code lang="en">PL/pgSQL</code> aam söhke.',
+ 'config-pg-no-plpgsql' => 'Do moß de Daatebangkshprooch <code lang="en">PL/pgSQL</code> en dä Daatebangk $1 enreeschte.',
+ 'config-pg-no-create-privs' => 'Dä Daatebangk-Aanwänder för et Enreeschte hät nit jenooch Rääschde, öm ene andere Daatebangk-Aanwänder en dä Daatebangk aanzelääje.',
+ 'config-install-user' => 'Ben unse Daatebangk-Aanwänder en de Daatebangk am aanlääje.',
+ 'config-install-user-alreadyexists' => 'Dä Aanwender „$1“ för dä Zohjref op de Daatebangk kann nit aanjelaat wääde, et jidd_en alld.',
+ 'config-install-user-create-failed' => 'Dä Aanwender „$1“ för dä Zohjref op de Daatebangk kunnt nit aanjelaat wääde, wäje: <code lang="en">$2</code>',
+ 'config-install-user-grant-failed' => 'Däm Daatebangk-Aanwänder sing Beräschtijunge ze säze däät nit fluppe wääje: $2',
+ 'config-install-tables' => 'Ben de Daatebangk-Tabälle aam aanlääje.',
+ 'config-install-tables-exist' => "'''Opjepaß''': Et schingk, dem MediaWiki sing Tabälle sin alt doh.
+Doh dom_mer nix aanlääje.",
+ 'config-install-tables-failed' => "'''Fähler''': De Tabälle kunnte nit aanjelaat wääde, wääje: $1",
+ 'config-install-interwiki' => 'Ben de Engerwiki-Tabäll met de shtandattmääßejje Daate aam fölle.',
+ 'config-install-interwiki-list' => 'Mer kunnte de Dattei <code lang="en">interwiki.list</code> nit fenge.',
+ 'config-install-interwiki-exists' => "'''Opjepaß''': En der Engewiki-Tabäll schingk alt jät dren ze shtonn.
+Doh dom_mer nix dobei.",
+ 'config-install-stats' => 'De Shtatestek-Zahle wääde op Aanfang jeshtallt.',
+ 'config-install-keys' => 'Jeheime Schlößel wääde opjebout.',
+ 'config-insecure-keys' => "'''Opjepaß:''' {{PLURAL:$2|Ene jeheime Schlößel|Jeheim Schlößele|Keine jeheime Schlößel}} ($1) {{PLURAL:$2|es|sin|es}} automattesch aanjelaat woode. {{PLURAL:$2|Dä es|Di sin|Hä es}} ävver nit onbedengk janz sescher. Övverlääsch Der, {{PLURAL:$2|dä|di|en}} norr_ens vun Hand ze ändere.",
+ 'config-install-sysop' => 'Dä Zohjang för der Wiki-Köbes weed aanjelaat.',
+ 'config-install-subscribe-fail' => 'Mer künne de <i lang="en">e-mail</i>-Leß <code lang="en">mediawiki-announce</code> nit abonneere.',
+ 'config-install-mainpage' => 'Ben de Houpsigg med enem shtandatmääßeje Enhald aam aanlääje',
+ 'config-install-extension-tables' => 'Ben Datebangk-Tabälle för de Zohsazprojramme aam ennreschte',
+ 'config-install-mainpage-failed' => 'Kunnt de Houpsigg nit afshpeishere: $1',
+ 'config-install-done' => "'''Jlöckwonsch!'''
+MediaWiki es jetz enstalleet.
+
+Et Projramm zom Enreeschte hät en Dattei <code lang=\"en\">LocalSettings.php</code> aanjelaat.
+Doh sin de Enstellunge vum Wiki dren.
+
+Do weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei <code lang=\"en\">index.php</code> dren litt. Dat Erongerlaade sullt automattesch aanjefange han.
+
+Wann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:
+
+\$3
+
+'''Opjepaß''': Wann De dat jez nit deihß es Alles verschött wat De jemaat häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.
+
+Wann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[\$2 en Ding Wiki jonn]'''.",
+ 'config-download-localsettings' => 'Donn de Dattei <code lang="en">LocalSettings.php</code> eronger laade',
+ 'config-help' => 'Hölp',
+);
+
+/** Kurdish (Latin) (Kurdî (Latin))
+ * @author George Animal
+ */
+$messages['ku-latn'] = array(
+ 'config-page-language' => 'Ziman',
+ 'config-page-name' => 'Nav',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'config-desc' => 'Den Installatiounsprogramm vu MediaWiki',
+ 'config-title' => 'MediaWiki $1 Installatioun',
+ 'config-information' => 'Informatioun',
+ 'config-localsettings-upgrade' => "'''Opgepasst''': E Fichier <code>LocalSettings.php</code> gouf fonnt.
+Är Software kann aktualiséiert ginn, setzt w.e.g. de Wäert vum <code>\$wgUpgradeKey</code> an d'Këscht.
+Dir fannt en am LocalSettings.php.",
+ 'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
+ 'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
+ 'config-session-error' => 'Feeler beim Starte vun der Sessioun: $1',
+ 'config-your-language' => 'Är Sprooch',
+ 'config-your-language-help' => 'Sicht déi Sprooch eraus déi Dir während der Installatioun benotze wëllt',
+ 'config-wiki-language' => 'Sprooch vun der Wiki:',
+ 'config-wiki-language-help' => "Sicht d'Sprooch eraus an där d'Wiki haaptsächlech geschriwwe gëtt.",
+ 'config-back' => '↠Zréck',
+ 'config-continue' => 'Weider →',
+ 'config-page-language' => 'Sprooch',
+ 'config-page-welcome' => 'Wëllkomm bäi MediaWiki!',
+ 'config-page-dbconnect' => 'Mat der Datebank verbannen',
+ 'config-page-upgrade' => 'Eng Installatioun déi besteet aktualiséieren',
+ 'config-page-dbsettings' => 'Astellunge vun der Datebank',
+ 'config-page-name' => 'Numm',
+ 'config-page-options' => 'Optiounen',
+ 'config-page-install' => 'Installéieren',
+ 'config-page-complete' => 'Fäerdeg!',
+ 'config-page-restart' => 'Installatioun neistarten',
+ 'config-page-readme' => 'Liest dëst',
+ 'config-page-releasenotes' => 'Informatiounen zur Versioun',
+ 'config-page-copying' => 'Kopéieren',
+ 'config-page-upgradedoc' => 'Aktualiséieren',
+ 'config-page-existingwiki' => 'Wiki déi et gëtt',
+ 'config-help-restart' => 'Wëllt dir all gespäichert Donnéeë läschen déi dir bis elo aginn hutt an den Installatiounsprozess nei starten?',
+ 'config-restart' => 'Jo, neistarten',
+ 'config-welcome' => "=== Iwwerpréifung vum Installatiounsenvironnement ===
+Et gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.
+Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef braucht.",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki Haaptsäit]
+* [http://www.mediawiki.org/wiki/Help:Contents Benotzerguide]
+* [http://www.mediawiki.org/wiki/Manual:Contents Guide fir Administrateuren]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Liest dëst</doclink>
+* <doclink href=ReleaseNotes>Informatioune vun der aktueller Versioun</doclink>
+* <doclink href=Copying>Lizenzbedingungen</doclink>
+* <doclink href=UpgradeDoc>Aktualisatioun</doclink>',
+ 'config-env-good' => 'Den Environement gouf nogekuckt.
+Dir kënnt MediaWiki installéieren.',
+ 'config-env-bad' => 'Den Environnement gouf iwwerpréift.
+Dir kënnt MediWiki net installéieren.',
+ 'config-env-php' => 'PHP $1 ass installéiert.',
+ 'config-unicode-using-utf8' => "Fir d'Unicode-Normalisatioun gëtt dem Brion Vibber säin <code>utf8_normalize.so</code> benotzt.",
+ 'config-no-db' => 'Et konnt kee passenden Datebank-Driver fonnt ginn!',
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] ass installéiert',
+ 'config-apc' => '[http://www.php.net/apc APC] ass installéiert',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] ass installéiert',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert',
+ 'config-diff3-bad' => 'GNU diff3 gouf net fonnt.',
+ 'config-no-uri' => "'''Feeler:''' Déi aktuell URI konnt net festgestallt ginn.
+Installatioun ofgebrach.",
+ 'config-db-type' => 'Datebanktyp:',
+ 'config-db-host-oracle' => 'Datebank-TNS:',
+ 'config-db-wiki-settings' => 'Dës Wiki identifizéieren',
+ 'config-db-name' => 'Numm vun der Datebank:',
+ 'config-db-name-oracle' => 'Datebankschema:',
+ 'config-db-install-account' => "Benotzerkont fir d'Installatioun",
+ 'config-db-username' => 'Datebank-Benotzernumm:',
+ 'config-db-password' => 'Passwuert vun der Datebank:',
+ 'config-db-install-help' => 'Gitt de Benotzernumm an Passwuert an dat wàhrend der Installatioun benotzt gëtt fir sech mat der Datebank ze verbannen.',
+ 'config-db-account-lock' => 'De selwechte Benotzernumm a Passwuert fir déi normal Operatioune benotzen',
+ 'config-db-wiki-account' => 'Benotzerkont fir normal Operatiounen',
+ 'config-db-wiki-help' => "Gitt de Benotzernumm an d'Passwuert an dat benotzt wäert gi fir sech bei den normale Wiki-Operatiounen mat der Datebank ze connectéieren.
+Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, gëtt dëse Benotzerkont opgemaach mat dem Minimum vu Rechter déi gebraucht gi fir dës Wiki bedreiwen ze kënnen.",
+ 'config-db-charset' => 'Zeechesaz (character set) vun der Datebank',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binair',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-mysql-old' => 'MySQL $1 oder eng méi nei Versioun gëtt gebraucht, Dir hutt $2.',
+ 'config-db-port' => 'Port vun der Datebank:',
+ 'config-db-schema' => 'Schema fir MediaWiki',
+ 'config-db-schema-help' => "D'Schemaen hei driwwer si gewéinlech korrekt.
+Ännert se nëmme wann Dir wësst datt et néideg ass.",
+ 'config-sqlite-dir' => 'Repertoire vun den SQLite-Donnéeën',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-header-mysql' => 'MySQL-Astellungen',
+ 'config-header-postgres' => 'PostgreSQL-Astellungen',
+ 'config-header-sqlite' => 'SQLite-Astellungen',
+ 'config-header-oracle' => 'Oracle-Astellungen',
+ 'config-invalid-db-type' => 'Net valabelen Datebank-Typ',
+ 'config-missing-db-name' => 'Dir musst en Numm fir de Wäert "Numm vun der Datebank" uginn',
+ 'config-missing-db-server-oracle' => 'Dir musst e Wäert fir "Datebank-TNS" uginn',
+ 'config-db-sys-user-exists-oracle' => 'De Benotzerkont "$1" gëtt et schonn. SYSDBA kann nëmme benotzt gi fir en neie Benotzerkont opzemaachen.',
+ 'config-postgres-old' => 'PostgreSQL $1 oder eng méi nei Versioun gëtt gebraucht, Dir hutt $2.',
+ 'config-sqlite-name-help' => 'Sicht en Numm deen Är wiki identifizéiert.
+Benotzt keng Espacen a Bindestrécher.
+E gëtt fir den Numm vum SQLite Date-Fichier benotzt.',
+ 'config-sqlite-readonly' => 'An de Fichier <code>$1</code> Kann net geschriwwe ginn.',
+ 'config-sqlite-cant-create-db' => 'Den Datebank-Fichier <code>$1</code> konnt net ugeluecht ginn.',
+ 'config-db-web-account' => 'Datebankkont fir den Accès iwwer de Web',
+ 'config-db-web-account-same' => 'Dee selwechte Kont wéi bei der Installatioun benotzen',
+ 'config-db-web-create' => 'De Kont uleeë wann et e net scho gëtt',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-binary' => 'binär',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Numm vun der Wiki:',
+ 'config-site-name-help' => 'Dësen daucht an der Titelleescht vum Browser an op verschiddenen anere Plazen op.',
+ 'config-site-name-blank' => 'Gitt den Numm vum Site un.',
+ 'config-project-namespace' => 'Projet Nummraum:',
+ 'config-ns-generic' => 'Projet',
+ 'config-ns-site-name' => 'Deeselwechte wéi den Numm vun der Wiki: $1',
+ 'config-ns-other' => 'Anerer (spezifizéieren)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-admin-box' => 'Administrateurs-Kont',
+ 'config-admin-name' => 'Ären Numm:',
+ 'config-admin-password' => 'Passwuert:',
+ 'config-admin-password-confirm' => 'Passwuert confirméieren:',
+ 'config-admin-name-blank' => 'Gitt e Benotzernumm fir den Administrateur an.',
+ 'config-admin-name-invalid' => 'De spezifizéierte Benotzernumm "<nowiki>$1</nowiki>" ass net valabel.
+Spezifizéiert en anere Benotzernumm.',
+ 'config-admin-password-blank' => 'Gitt e Passwuert fir den Adminstateur-Kont an.',
+ 'config-admin-password-same' => "D'Passwuert däerf net dat selwecht si wéi de Benotzernumm.",
+ 'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi dir aginn stëmmen net iwwerteneen.',
+ 'config-admin-email' => 'E-Mailadress:',
+ 'config-admin-error-user' => 'Interne Feeler beim uleeë vun engem Administrateur mam Numm "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Interne Feeler beim Setze vum Passwuert fir den Admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Dir hutt eng E-Mailadress aginn déi net valabel ass',
+ 'config-subscribe' => "Sech op d'[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ukënnegunge vun neie Versiounen] abonnéieren.",
+ 'config-almost-done' => "Dir sidd bal fäerdeg!
+Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki elo direkt installéieren.",
+ 'config-optional-continue' => 'Stellt mir méi Froen.',
+ 'config-optional-skip' => "Ech hunn es genuch, installéier just d'Wiki.",
+ 'config-profile' => 'Profil vun de Benotzerrechter:',
+ 'config-profile-wiki' => 'Traditionell Wiki',
+ 'config-profile-no-anon' => 'Uleeë vun engem Benotzerkont verlaangt',
+ 'config-profile-fishbowl' => 'Nëmmen autoriséiert Editeuren',
+ 'config-profile-private' => 'Privat Wiki',
+ 'config-license' => 'Copyright a Lizenz:',
+ 'config-license-none' => 'Keng Lizenz ënnen op der Säit',
+ 'config-license-pd' => 'Ëffentlechen Domaine',
+ 'config-email-settings' => 'E-Mail-Astellungen',
+ 'config-enable-email' => 'E-Mailen déi no bausse ginn aschalten',
+ 'config-email-user' => 'Benotzer-op-Benotzer E-Mail aschalten',
+ 'config-email-usertalk' => 'Benoriichtege bäi Ännerung vun der Benotzerdiskussiounssäit aschalten',
+ 'config-email-watchlist' => 'Benoriichtigung vun der Iwwerwaachungslëscht aschalten',
+ 'config-email-auth' => 'E-Mail-Authentifizéierung aschalten',
+ 'config-email-sender' => 'E-Mailadress fir Äntwerten:',
+ 'config-upload-settings' => 'Eropgeluede Biller a Fichieren',
+ 'config-upload-enable' => 'Eropluede vu Fichieren aschalten',
+ 'config-upload-deleted' => 'Repertoire fir geläschte Fichieren:',
+ 'config-logo' => 'URL vum Logo:',
+ 'config-cc-again' => 'Nach eng kéier eraussichen...',
+ 'config-advanced-settings' => 'Erweidert Astellungen',
+ 'config-extensions' => 'Erweiderungen',
+ 'config-install-step-done' => 'fäerdeg',
+ 'config-install-step-failed' => 'huet net fonctionnéiert',
+ 'config-install-extensions' => 'Mat den Ereiderungen',
+ 'config-install-database' => 'Datebank gëtt installéiert',
+ 'config-pg-no-plpgsql' => "Fir d'Datebank $1 muss d'Datebanksprooch PL/pgSQL installéiert ginn",
+ 'config-install-user' => 'Datebank Benotzer uleeën',
+ 'config-install-user-alreadyexists' => 'De Benotzer "$1" gëtt et schonn!',
+ 'config-install-user-create-failed' => 'D\'Opmaache vum Benotzer "$1" huet net fonctionnéiert: $2',
+ 'config-install-tables' => 'Tabelle ginn ugeluecht',
+ 'config-install-interwiki' => 'Standard Interwiki-Tabell gëtt ausgefëllt',
+ 'config-install-interwiki-list' => 'De Fichier <code>interwiki.list</code> gouf net fonnt.',
+ 'config-install-stats' => 'Initialisatioun vun de Statistiken',
+ 'config-install-keys' => 'Generéiere vum Geheimschlëssel',
+ 'config-install-sysop' => 'Administrateur Benotzerkont gëtt ugeluecht',
+);
+
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+ 'config-session-error' => 'Hadisoana teo am-panombohana ny fidirana : $1',
+ 'config-your-language' => 'Ny fiteninao :',
+ 'config-wiki-language' => "Fiteny ho ampiasain'ny wiki :",
+ 'config-back' => '↠Miverina',
+ 'config-continue' => 'Manohy →',
+ 'config-page-language' => 'Fiteny',
+ 'config-page-welcome' => "Tonga soa eto amin'i MediaWiki !",
+ 'config-page-dbconnect' => "Hiditra eo amin'i banky angona",
+ 'config-page-name' => 'Anarana',
+ 'config-page-readme' => 'Vakio aho',
+ 'config-page-copying' => 'Hala-tahaka',
+ 'config-page-upgradedoc' => 'Fanavaozina',
+ 'config-page-existingwiki' => 'Wiki efa misy',
+ 'config-help-restart' => "Tianao hofafana avokoa ve ny data voaangona natsofokao ary hamerina ny fizotran'ny fametrahana ?",
+ 'config-restart' => 'Eny, avereno atao',
+ 'config-db-username' => "Anaram-pikamban'ny banky angona :",
+ 'config-db-password' => "Tenimiafin'ny banky angona :",
+ 'config-header-mysql' => "Parametatr'i MySQL",
+ 'config-header-sqlite' => "Parametatr'i SQLite",
+ 'config-header-oracle' => "Parametatr'i Oracle",
+ 'config-mysql-innodb' => 'innoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-ns-generic' => 'Tetikasa',
+ 'config-ns-other' => 'Hafa (lazao)',
+ 'config-admin-name' => 'Ny anaranao :',
+ 'config-admin-password' => 'Tenimiafina :',
+ 'config-admin-email' => 'Adiresy imailaka :',
+ 'config-profile-wiki' => 'Wiki tsotra',
+ 'config-profile-no-anon' => 'Mila mamorona kaonty',
+ 'config-profile-fishbowl' => 'Mpanova mahazo alalana ihany',
+ 'config-profile-private' => 'Wiki tsy sarababem-bahoaka',
+ 'config-license' => 'Zom-pamorona ary lisansa :',
+ 'config-license-none' => 'Tsy misy lisansa any an-tongom-pejy',
+ 'config-email-user' => 'Avela mifandefa imailaka ny mpikambana',
+ 'config-email-user-help' => "Hahafahan'ny mpikambana mifandefa imailaka raha omen'ny mpikambana alalana ao amin'ny safidiny.",
+ 'config-upload-deleted' => "Petra-drakitra ho an'ny rakitra voafafa :",
+ 'config-extensions' => 'Fanitarana',
+ 'config-install-step-done' => 'vita',
+ 'config-install-step-failed' => 'hadisoana',
+ 'config-install-user' => "Famoronana mpapiasan'ny banky angona",
+ 'config-install-tables' => 'Famoronana tabilao',
+ 'config-install-stats' => 'Fanombohana ny statistika',
+ 'config-install-keys' => 'Fanamboarana lakile miafina$',
+ 'config-help' => 'fanoroana',
+);
+
+/** Macedonian (МакедонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'config-desc' => 'ИнÑталатор на МедијаВики',
+ 'config-title' => 'ИнÑталатор на МедијаВики $1',
+ 'config-information' => 'Информации',
+ 'config-localsettings-upgrade' => 'ВоÑтановена е податотека <code>LocalSettings.php</code>.
+За да ја надградите инÑталцијава, внеÑете ја вредноÑта на <code>$wgUpgradeKey</code> во полето подолу.
+Тоа е го најдете во LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Утврдено е приÑуÑтвото на податотеката „LocalSettings.php“.
+За да ја надградите инÑталацијата, пуштете ја „update.php“ намеÑто горенаведената.',
+ 'config-localsettings-key' => 'Ðадградбен клуч:',
+ 'config-localsettings-badkey' => 'Клучот што го наведовте е погрешен',
+ 'config-upgrade-key-missing' => 'ВоÑтановена е поÑтоечка инÑталација на МедијаВики.
+За да ја надградите, вметнете го Ñледниов ред на дното од вашата Ñтраница LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'ПоÑтоечката Ñтраница LocalSettings.php е нецелоÑна.
+Ðе е поÑтавена променливата $1.
+Изменете ја Ñтраницата LocalSettings.php така што ќе Ñ Ð·Ð°Ð´Ð°Ð´ÐµÑ‚Ðµ вредноÑÑ‚ на променливата, па ÑтиÑнете на „Продолжи“.',
+ 'config-localsettings-connection-error' => 'Се појави грешка при поврзувањето Ñо базата кориÑтејќи ги поÑтавките назначени во LocalSettings.php или AdminSettings.php. ИÑправете ги овие поÑтавки и обидете Ñе повторно.
+
+$1',
+ 'config-session-error' => 'Грешка при започнување на ÑеÑијата: $1',
+ 'config-session-expired' => 'Вашите ÑеÑиÑки податоци иÑтекоа.
+ПоÑтавките на ÑеÑиите траат $1.
+Ðивниот рок можете да го зголемите Ñо задавање на <code>session.gc_maxlifetime</code> во php.ini.
+Почнете ја инÑталацијата одново.',
+ 'config-no-session' => 'Вашите ÑеÑиÑки податоци Ñе изгубени!
+Погледајте во php.ini дали <code>session.save_path</code> е поÑтавен во правилна папка.',
+ 'config-your-language' => 'Вашиот јазик:',
+ 'config-your-language-help' => 'Одберете на кој јазик да Ñе одвива инÑталацијата.',
+ 'config-wiki-language' => 'Јазик на викито:',
+ 'config-wiki-language-help' => 'Одберете на кој јазик ќе бидат Ñодржините на викито.',
+ 'config-back' => '↠Ðазад',
+ 'config-continue' => 'Продолжи →',
+ 'config-page-language' => 'Јазик',
+ 'config-page-welcome' => 'Добредојдовте на МедијаВики!',
+ 'config-page-dbconnect' => 'Поврзување Ñо базата',
+ 'config-page-upgrade' => 'Ðадградба на поÑтоечката инÑталација',
+ 'config-page-dbsettings' => 'Ðагодувања на базата',
+ 'config-page-name' => 'Ðазив',
+ 'config-page-options' => 'ПоÑтавки',
+ 'config-page-install' => 'ИнÑталирај',
+ 'config-page-complete' => 'Готово!',
+ 'config-page-restart' => 'Пушти ја инÑталацијата одново',
+ 'config-page-readme' => 'Прочитај ме',
+ 'config-page-releasenotes' => 'Белешки за изданието',
+ 'config-page-copying' => 'Копирање',
+ 'config-page-upgradedoc' => 'Ðадградба',
+ 'config-page-existingwiki' => 'ПоÑтоечко вики',
+ 'config-help-restart' => 'Дали Ñакате да ги иÑчиÑтите Ñите зачувани податоци што ги внеÑовте и да ја започнете инÑталацијата одново?',
+ 'config-restart' => 'Да, почни одново',
+ 'config-welcome' => '=== Environmental checks ===
+Се вршат оÑновни проверки за да Ñе воÑтанови дали околината е погодна за инÑталирање на МедијаВики.
+Ðко ви затреба помош при инÑталацијата, ќе треба да ги наведете резултатите од овие проверки.',
+ 'config-copyright' => "=== ÐвторÑки права и уÑлови ===
+
+$1
+
+Ова е Ñлободна програмÑка опрема (free software); можете да го редиÑтрибуирате и/или менувате ÑоглаÑно уÑловите на ГÐУ-овата општа јавна лиценца (GNU General Public License) на Фондацијата за Ñлободна програмÑка опрема (Free Software Foundation); верзија 2 или било која понова верзија на лиценцата (по ваш избор).
+
+Овој програм Ñе нуди Ñо надеж дека ќе биде кориÑен, но '''без никаква гаранција'''; дури ни подразбраната гаранција за '''продажна ÑпоÑобноÑÑ‚''' или '''погодноÑÑ‚ за определена цел'''.
+Повеќе информации ќе најдете во текÑтот на ГÐУ-овата општа јавна лиценца.
+
+Би требало да имате добиено <doclink href=Copying>примерок од ГÐУ-овата општа јавна лиценца</doclink> заедно Ñо програмов; ако немате добиено, тогаш пишете ни на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. или [http://www.gnu.org/copyleft/gpl.html прочитајте ја тука].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Домашна Ñтраница на МедијаВики]
+* [http://www.mediawiki.org/wiki/Help:Contents Водич за кориÑници]
+* [http://www.mediawiki.org/wiki/Manual:Contents Водич за админиÑтратори]
+* [http://www.mediawiki.org/wiki/Manual:FAQ ЧПП]
+----
+* <doclink href=Readme>Прочитај ме</doclink>
+* <doclink href=ReleaseNotes>Белешки за изданието</doclink>
+* <doclink href=Copying>Копирање</doclink>
+* <doclink href=UpgradeDoc>Ðадградување</doclink>',
+ 'config-env-good' => 'Околината е проверена.
+Можете да го инÑталирате МедијаВики.',
+ 'config-env-bad' => 'Околината е проверена.
+Ðе можете да го инÑталирате МедијаВики.',
+ 'config-env-php' => 'PHP $1 е инÑталиран.',
+ 'config-env-php-toolow' => 'PHP $1 е инÑталиран.
+Меѓутоа, МедијаВики бара PHP $2 или поново.',
+ 'config-unicode-using-utf8' => 'Со utf8_normalize.so за уникодна нормализација од Брајон Вибер (Brion Vibber).',
+ 'config-unicode-using-intl' => 'Со додатокот [http://pecl.php.net/intl intl PECL] за уникодна нормализација.',
+ 'config-unicode-pure-php-warning' => "'''Предупредување''': Додатокот [http://pecl.php.net/intl intl PECL] не е доÑтапен за врши уникодна нормализација, враќајќи Ñе на бавна примена на чиÑÑ‚ PHP.
+
+Ðко имате виÑокопрометно мрежно меÑто, тогаш ќе треба да прочитате повеќе за [http://www.mediawiki.org/wiki/Unicode_normalization_considerations уникодната нормализација].",
+ 'config-unicode-update-warning' => "'''Предупредување''': ИнÑталираната верзија на обвивката за уникодна нормализација кориÑти поÑтара верзија на библиотеката на [http://site.icu-project.org/ проектот ICU].
+За да кориÑтите Уникод, ќе треба да направите [http://www.mediawiki.org/wiki/Unicode_normalization_considerations надградба].",
+ 'config-no-db' => 'Ðе можев да пронајдам Ñоодветен двигател за базата на податоци!',
+ 'config-no-db-help' => 'Ќе треба да инÑталирате двигател за базата на податоци за PHP.
+Поддржани Ñе Ñледниве типови на бази: $1.
+
+Ðко Ñте на заедничко (Ñподелено) вдомување, побарајте му на вдомителот да инÑталира Ñоодветен двигател за базата.
+Ðко вие Ñамите го ÑоÑтавивте ова PHP, Ñменете ги поÑтавките така што ќе овозможите клиент на базата - на пр. Ñо кодот <code>./configure --with-mysql</code>.
+Ðко инÑталиравте PHP од пакет на Debian или Ubuntu, тогаш ќе треба да го инÑталирате и модулот php5-mysql.',
+ 'config-no-fts3' => "'''Предупредување''': SQLite iе ÑоÑтавен без модулот [http://sqlite.org/fts3.html FTS3] - за оваа база нема да има можноÑÑ‚ за пребарување.",
+ 'config-register-globals' => "'''Предупредување: МожноÑта <code>[http://php.net/register_globals register_globals]</code> за PHP е овозможена.'''
+'''Оневозможете ја ако е можно.'''
+МедијаВики ќе работи, но опÑлужувачот ви е изложен на безбедноÑни ризици.",
+ 'config-magic-quotes-runtime' => "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активно!'''
+Оваа можноÑÑ‚ непредвидливо го раÑипува вноÑот на податоци.
+Оваа можноÑÑ‚ мора да е иÑклучена. Во Ñпротивно нема да можете да го инÑталирате и кориÑтите МедијаВики.",
+ 'config-magic-quotes-sybase' => "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активно!'''
+Оваа можноÑÑ‚ непредвидливо го раÑипува вноÑот на податоци.
+Оваа можноÑÑ‚ мора да е иÑклучена. Во Ñпротивно нема да можете да го инÑталирате и кориÑтите МедијаВики.",
+ 'config-mbstring' => "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''
+Оваа можноÑÑ‚ предизвикува грешки и може непредвидиво да го раÑипува вноÑот на податоци.
+Оваа можноÑÑ‚ мора да е иÑклучена. Во Ñпротивно нема да можете да го инÑталирате и кориÑтите МедијаВики.",
+ 'config-ze1' => "'''Кобно: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] е активно!'''
+Оваа можноÑÑ‚ предизвикува ужаÑни грешки во МедијаВики.
+Оваа можноÑÑ‚ мора да е иÑклучена. Во Ñпротивно нема да можете да го инÑталирате и кориÑтите МедијаВики.",
+ 'config-safe-mode' => "'''Предупредување:''' [http://www.php.net/features.safe-mode безбедниот режим] на PHP е активен.
+Ова може да предизвика проблеми, оÑобено ако кориÑтите подигања и поддршка за <code>math</code>.",
+ 'config-xml-bad' => 'XML-модулот за PHP недоÑтаÑува.
+МедијаВики има потреба од функции во овој модул и нема да работи Ñо овие поÑтавки.
+Ðко работите Ñо Mandrake, инÑталирајте го php-xml пакетот.',
+ 'config-pcre' => 'ÐедоÑтаÑува модулот за поддршка на PCRE.
+МедијаВики не може да работи без функции за регуларни изрази Ñоодветни на Perl.',
+ 'config-pcre-no-utf8' => "'''Фатално''': PCRE-модулот на PHP е ÑоÑтавен без поддршка за PCRE_UTF8.
+МедијаВики бара поддршка за UTF-8 за да може да работи правилно.",
+ 'config-memory-raised' => '<code>memory_limit</code> за PHP изнеÑува $1, зголемен на $2.',
+ 'config-memory-bad' => "'''Предупредување:''' <code>memory_limit</code> за PHP изнеÑува $1.
+Ова е веројатно премалку.
+ИнÑталацијата може да не уÑпее!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] е инÑталиран',
+ 'config-apc' => '[http://www.php.net/apc APC] е инÑталиран',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] е инÑталиран',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инÑталиран',
+ 'config-no-cache' => "'''Предупредување:''' Ðе можев да го најдам [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
+Кеширањето на објекти не е овозможено.",
+ 'config-diff3-bad' => 'GNU diff3 не е пронајден.',
+ 'config-imagemagick' => 'Пронајден е ImageMagick: <code>$1</code>.
+Ðко овозможите подигање, тогаш ќе биде овозможена минијатуризација на Ñликите.',
+ 'config-gd' => 'Утврдив дека има вградена GD графичка библиотека.
+Ðко овозможите подигање, тогаш ќе биде овозможена минијатураизација на Ñликите.',
+ 'config-no-scaling' => 'Ðе можев да пронајдам GD-библиотека или ImageMagick.
+Минијатуризацијата на Ñликите ќе биде оневозможена.',
+ 'config-no-uri' => "'''Грешка:''' Ðе можев да го утврдам тековниот URI.
+ИнÑталацијата е откажана.",
+ 'config-uploads-not-safe' => "'''Предупредување:''' Вашата матична папка за подигање <code>$1</code> е подложна на извршување (пуштање) на произволни Ñкрипти.
+Иако МедијаВики врши безбедноÑни проверки на Ñите подигнати податотеки, ве Ñоветуваме [http://www.mediawiki.org/wiki/Manual:Security#Upload_security да ја затворите оваа безбедноÑна дупка] пред да овозможите подигање.",
+ 'config-brokenlibxml' => 'Вашиот ÑиÑтем има комбинација од PHP и libxml2 верзии и затоа има грешки и може да предизвика Ñкриено раÑипување на податоците кај МедијаВики и други мрежни програми.
+Ðадградете го на PHP 5.2.9 и libxml2 2.7.3 или нивни понови верзии! ПРЕКИÐУВÐÐœ ([http://bugs.php.net/bug.php?id=45996 грешката е заведена во PHP]).',
+ 'config-using531' => 'МедијаВики не може да Ñе кориÑти Ñо PHP $1 поради грешка кај упатните параметри за <code>__call()</code>.
+За да го решите проблемот, надградете го на PHP 5.3.2 или понова верзија, или пак кориÑтете го поÑтариот PHP 5.3.0.',
+ 'config-db-type' => 'Тип на база:',
+ 'config-db-host' => 'Домаќин на базата:',
+ 'config-db-host-help' => 'Ðко вашата база е на друг опÑлужувач, тогаш тука внеÑете го името на домаќинот илиу IP-адреÑата.
+
+Ðко кориÑтите заедничко (Ñподелено) вдомување, тогаш вашиот вдомител треба да го доде точното име на домаќинот и неговата документација.
+
+Ðко инÑталирате на опÑлужувач на Windows и кориÑтите MySQL, можноÑта „localhost“ може да не функционира за опÑлужувачкото име. Во тој Ñлучај, обидете Ñе Ñо внеÑување на „127.0.0.1“ како локална IP-адреÑа',
+ 'config-db-host-oracle' => 'TNS на базата:',
+ 'config-db-host-oracle-help' => 'ВнеÑете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm локално име за поврзување]. Ðа оваа инÑталација мора да Ñ Ð±Ð¸Ð´Ðµ видлива податотеката tnsnames.ora.<br />Ðко кориÑтите клиентÑки библиотеки 10g или понови, тогаш можете да го кориÑтите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Идентификувај го викиво',
+ 'config-db-name' => 'Име на базата:',
+ 'config-db-name-help' => 'Одберете име што ќе го претÑтавува вашето вики.
+Името не Ñмее да Ñодржи празни меÑта.
+
+Ðко кориÑтите заедничко (Ñподелено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за кориÑтење, или пак ќе ви даде да Ñоздавате бази преку контролната табла.',
+ 'config-db-name-oracle' => 'Шема на базата:',
+ 'config-db-account-oracle-warn' => 'ПоÑтојат три поддржани Ñценарија за инÑталирање на Oracle како базен уÑлужник:
+
+Ðко Ñакате да Ñоздадете Ñметка на базата како дел од поÑтапката за инÑталација, наведете Ñметка Ñо SYSDBA-улога како Ñметка за базата што ќе Ñе инÑталира и наведете ги Ñаканите податоци за Ñметката за мрежен приÑтап. Во друг Ñлучај, можете да Ñоздадете Ñметка за мрежен приÑтап рачно и да ја наведете Ñамо таа Ñметка (ако има дозволи за Ñоздавање на шематÑки објекти) или пак да наведете две различни Ñметки, една Ñо привилегии за Ñоздавање, а друга (ограничена) за мрежен приÑтап.
+
+Скриптата за Ñоздавање Ñметка Ñо задолжителни привилегии ќе ја најдете во папката „maintenance/oracle/“ од оваа инÑталација. Имајте на ум дека ако кориÑтите ограничена Ñметка ќе ги оневозможите Ñите функции за одржување Ñо оÑновната Ñметка.',
+ 'config-db-install-account' => 'КориÑничка Ñмета за инÑталација',
+ 'config-db-username' => 'КориÑничко име за базата:',
+ 'config-db-password' => 'Лозинка за базата:',
+ 'config-db-password-empty' => 'ВнеÑете лозинка за новиот кориÑник на базата: $1.
+Иако може да Ñе Ñоздаваат кориÑници без лозинка, тоа не е безбедно.',
+ 'config-db-install-username' => 'ВнеÑете кориÑничко име што ќе Ñе кориÑти за поврзување Ñо базата во текот на инÑталацијата. Ова не е кориÑничкото име од Ñметката на МедијаВики, туку поÑебно кориÑничко име за вашата база на податоци.',
+ 'config-db-install-password' => 'ВнеÑете клозинка што ќе Ñе кориÑти за поврзување Ñо базата во текот на инÑталацијата. Ова не е лозинката од Ñметката на МедијаВики, туку поÑебна лозинка за вашата база на податоци.',
+ 'config-db-install-help' => 'ВнеÑете го кориÑничкото име и лозинката што ќе Ñе кориÑти за поврзување Ñо базата на податоци во текот на инÑталацијата.',
+ 'config-db-account-lock' => 'КориÑти го иÑтото кориÑничко име и лозинка за редовна работа',
+ 'config-db-wiki-account' => 'КориÑничко име за редовна работа',
+ 'config-db-wiki-help' => 'ВнеÑете кориÑничко име и лозинка што ќе Ñе кориÑтат за поврзување Ñо базата на податоци во текот на редовната работа Ñо викито.
+Ðко Ñметката не поÑтои, а инÑталационата Ñметка има доволно привилегии, тогаш оваа кориÑничка Ñметка ќе биде Ñоздадена Ñо минималните привилегии потребни за работа Ñо викито.',
+ 'config-db-prefix' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð½Ð° табелата на базата:',
+ 'config-db-prefix-help' => 'Ðко треба да делите една база на податоци Ñо повеќе викија, или Ñо МедијаВики и друг мрежен програм, тогаш можете да додадете Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð½Ð° Ñите називи на табелите за да Ñпречите проблематични Ñитуации.
+Ðе кориÑтете празни проÑтори.
+
+Ова поле обично Ñе оÑтава празно.',
+ 'config-db-charset' => 'Збир знаци за базата',
+ 'config-charset-mysql5-binary' => 'Бинарен за MySQL 4.1/5.0',
+ 'config-charset-mysql5' => 'UTF-8 за MySQL 4.1/5.0',
+ 'config-charset-mysql4' => 'Ðазадно-Ñоодветен UTF-8 за MySQL 4.0',
+ 'config-charset-help' => "'''ПРЕДУПРЕДУВÐЊЕ:''' Ðко кориÑтите '''назадно-Ñоодветен UTF-8''' во MySQL 4.1+, а потоа направите резервен примерок на базата Ñо <code>mysqldump</code>, ова може да ги опуÑтоши Ñите не-ASCII знаци, и Ñо тоа неповратно да ја раÑипе целата зачувана резерва!
+
+Во '''бинарен режим''', во базата МедијаВики го Ñкладира UTF-8 текÑтот во бинарни полиња.
+Ова е поефиканÑно отколку UTF-8 режимот на MySQL бидејќи ви овозможува да го кориÑтите целиот Ñпектар на уникодни знаци.
+Во '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може Ñоодветно да ги претÑтави и претвори,
+но нема да ви дозволи да Ñкладирате знаци над [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes ОÑновната повеќејазична рамнина].",
+ 'config-mysql-old' => 'Се бара MySQL $1 или поново, а вие имате $2.',
+ 'config-db-port' => 'Порта на базата:',
+ 'config-db-schema' => 'Шема за МедијаВики',
+ 'config-db-schema-help' => 'Оваа шема обично по правило ќе работи нормално.
+Сменете ја Ñамо ако знаете дека треба да Ñе Ñмени.',
+ 'config-sqlite-dir' => 'Папка на SQLite-податоци:',
+ 'config-sqlite-dir-help' => "SQLite ги Ñкладира Ñите податоци во една податотека.
+
+Папката што ќе ја наведете мора да е запиÑлива од мрежниот опÑлужувач во текот на инÑталацијата.
+
+Таа '''не''' Ñмее да биде доÑтапна преку интернет, и затоа не ја Ñтаваме кајшто ви Ñе наоѓаат PHP-податотеките.
+
+ИнÑталаторот воедно ќе Ñоздаде податотека <code>.htaccess</code>, но ако таа не функционира како што треба, тогаш некој ќе може да ви влезе во вашата необработена (Ñирова) база на податоци.
+Тука Ñпаѓаат необработени кориÑнички податоци (е-поштенÑки адреÑи, хеширани лозинки) како и избришани ревизии и други податоци за викито до кои Ñе има ограничен приÑтап.
+
+Се препорачува целата база да ја ÑмеÑтите некаде, како на пр. <code>/var/lib/mediawiki/вашетовики</code>.",
+ 'config-oracle-def-ts' => 'Стандарден таблеарен проÑтор:',
+ 'config-oracle-temp-ts' => 'Привремен табеларен проÑтор:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'МедијаВики ги поддржува Ñледниве ÑиÑтеми на бази на податоци:
+
+$1
+
+Ðко ÑиÑтемот што Ñакате да го кориÑтите не е наведен подолу, тогаш проÑледете ја горенаведената врÑка Ñо инÑтрукции за да овозможите поддршка за тој ÑиÑтем.',
+ 'config-support-mysql' => '* $1 е главната цел на МедијаВики и најдобро Ñе поддржува ([http://www.php.net/manual/en/mysql.installation.php како Ñе ÑоÑтавува PHP Ñо поддршка за MySQL])',
+ 'config-support-postgres' => '* $1 е популарен ÑиÑтем на бази на податоци Ñо отворен код кој претÑтавува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да ÑоÑтавите PHP Ñо поддршка за PostgreSQL]). Може Ñè уште да има некои грешки. па затоа не Ñе препорачува за употреба во производна Ñредина.',
+ 'config-support-sqlite' => '* $1 е леÑен ÑиÑтем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да ÑоÑтавите PHP Ñо поддршка за SQLite], кориÑти PDO)',
+ 'config-support-oracle' => '* $1 е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да ÑоÑтавите PHP Ñо поддршка за OCI8])',
+ 'config-header-mysql' => 'Ðагодувања на MySQL',
+ 'config-header-postgres' => 'Ðагодувања на PostgreSQL',
+ 'config-header-sqlite' => 'Ðагодувања на SQLite',
+ 'config-header-oracle' => 'Ðагодувања на Oracle',
+ 'config-invalid-db-type' => 'Ðеважечки тип на база',
+ 'config-missing-db-name' => 'Мора да внеÑете значење за параметарот „Име на базата“',
+ 'config-missing-db-host' => 'Мора да внеÑете вредноÑÑ‚ за „Домаќин на базата на податоци“',
+ 'config-missing-db-server-oracle' => 'Мора да внеÑете вредноÑÑ‚ за „TNS на базата“',
+ 'config-invalid-db-server-oracle' => 'Ðеважечки TNS „$1“ за базата.
+КориÑтете Ñамо знаци по ASCII - букви (a-z, A-Z), бројки (0-9), долни црти (_) и точки (.).',
+ 'config-invalid-db-name' => 'Ðеважечко име на базата „$1“.
+КориÑтете Ñамо ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).',
+ 'config-invalid-db-prefix' => 'Ðеважечки Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð·Ð° базата „$1“.
+КориÑтете Ñамо ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).',
+ 'config-connection-error' => '$1.
+
+Проверете го долунаведениот домаќин, кориÑничко име и лозинка и обидете Ñе повторно.',
+ 'config-invalid-schema' => 'Ðеважечка шема за МедијаВики „$1“.
+КориÑтете Ñамо букви, бројки и долни црти.',
+ 'config-db-sys-create-oracle' => 'ИнÑталаторот поддржува Ñамо употреба на SYSDBA-Ñметка за Ñоздавање на нова Ñметка.',
+ 'config-db-sys-user-exists-oracle' => 'КориÑничката Ñметка „$1“ веќе поÑтои. SYSDBA Ñлужи Ñамо за Ñоздавање на нова Ñметка!',
+ 'config-postgres-old' => 'Се бара PostgreSQL $1 или поново, а вие имате $2.',
+ 'config-sqlite-name-help' => 'Одберете име кое ќе го претÑтавува вашето вики.
+Ðе кориÑтете празни проÑтори и црти.
+Ова ќе Ñе кориÑти за податотечното име на SQLite-податоците.',
+ 'config-sqlite-parent-unwritable-group' => 'Ðе можам да ја Ñоздадам папката <code><nowiki>$1</nowiki></code> бидејќи мрежниот опÑлужувач не може да запише во матичната папка <code><nowiki>$2</nowiki></code>.
+
+ИнÑталаторот го утврди кориÑникот под кој работи вашиот мрежен опÑлужувач.
+За да продолжите, намеÑтете да може да запишува во папката <code><nowiki>$3</nowiki></code>.
+Ðа Unix/Linux ÑиÑтем направете го Ñледново:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Ðе можам да ја Ñоздадам папката <code><nowiki>$1</nowiki></code> бидејќи мрежниот опÑлужувач не може да запише во матичната папка <code><nowiki>$2</nowiki></code>.
+
+ИнÑталаторот не можеше го утврди кориÑникот под кој работи вашиот мрежен опÑлужувач.
+За да продолжите, намеÑтете тој (и други!) да може глобално да запишува во папката <code><nowiki>$3</nowiki></code>
+Ðа Unix/Linux ÑиÑтем направете го Ñледново:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Грешка при Ñоздавањето на податочната папка „$1“.
+Проверете каде Ñе наоѓа и обидете Ñе повторно.',
+ 'config-sqlite-dir-unwritable' => 'Ðе можам да запишам во папката „$1“.
+Во дозволите за неа, овозможете му на мрежниот опÑлужувач да запишува во неа и обидете Ñе повторно.',
+ 'config-sqlite-connection-error' => '$1.
+
+Проверете ја податочната папка и името на базата, и обидете Ñе повторно.',
+ 'config-sqlite-readonly' => 'Податотеката <code>$1</code> е незапиÑлива.',
+ 'config-sqlite-cant-create-db' => 'Ðе можев да ја Ñоздадам податотеката <code>$1</code> за базата.',
+ 'config-sqlite-fts3-downgrade' => 'PHP нема поддршка за FTS3 — ја поништувам надградбата за табелите',
+ 'config-can-upgrade' => "Во оваа база има табели на МедијаВики.
+За да ги надградите на МедијаВики $1, кликнете на '''Продолжи'''.",
+ 'config-upgrade-done' => "Ðадградбата заврши.
+
+Сега можете да [$1 почнете да го кориÑтите вашето вики].
+
+Ðко Ñакате да ја преÑоздадете вашата податотека <code>LocalSettings.php</code>, тогаш кликнете на копчето подолу.
+Ова '''не Ñе препорачува''' оÑвен во Ñлучај на проблеми Ñо викито.",
+ 'config-upgrade-done-no-regenerate' => 'Ðадградбата заврши.
+
+Сега можете да [$1 почнете да го кориÑтите викито].',
+ 'config-regenerate' => 'ПреÑоздај LocalSettings.php →',
+ 'config-show-table-status' => 'Барањето SHOW TABLE STATUS не уÑпеа!',
+ 'config-unknown-collation' => "'''Предупредување:''' Базата кориÑни непрепознаена упатна Ñпоредба.",
+ 'config-db-web-account' => 'Сметка на базата за мрежен приÑтап',
+ 'config-db-web-help' => 'Одберете кориÑничко име и лозинка што ќе ги кориÑти мрежниот опÑлужувач за поврзување Ñо опÑлужувачот на базта на податоци во текот на редовната работа Ñо викито.',
+ 'config-db-web-account-same' => 'КориÑти ја иÑтата Ñметка од инÑталацијата',
+ 'config-db-web-create' => 'Создај ја Ñметката ако веќе не поÑтои',
+ 'config-db-web-no-create-privs' => 'Сметката што ја назначивте за инÑталација нема доволно привилегии за да може да Ñоздаде Ñметка.
+Тука мора да назначите поÑтоечка Ñметка.',
+ 'config-mysql-engine' => 'Складишен погон:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' речиÑи Ñекогаш е најдобар избор, бидејќи има добра поддршка за едновременоÑÑ‚.
+
+'''MyISAM''' може да е побрз кај инÑталациите наменети за Ñамо еден кориÑник или незапиÑни инÑталации (Ñамо читање).
+Базите на податоци од MyISAM почеÑто Ñе раÑипуваат од базите на InnoDB.",
+ 'config-mysql-charset' => 'Збир знаци за базата:',
+ 'config-mysql-binary' => 'Бинарен',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "Во '''бинарен режим''', во базата на податоци МедијаВики Ñкладира UTF-8 текÑÑ‚ во бинарни полиња.
+Ова е поефикаÑно отколку TF-8 режимот на MySQL, и ви овозможува да ја кориÑтите целата палета на уникодни знаци.
+
+Во '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може Ñоодветно да ги претÑтави и претвори, но нема да ви дозволи да Ñкладиратезнаци над [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes ОÑновната повеќејазична рамнина].",
+ 'config-site-name' => 'Име на викито:',
+ 'config-site-name-help' => 'Ова ќе Ñе појавува во заглавната лента на прелиÑтувачот и на разни други меÑта.',
+ 'config-site-name-blank' => 'ВнеÑете име на мрежното меÑто.',
+ 'config-project-namespace' => 'Проектен именÑки проÑтор:',
+ 'config-ns-generic' => 'Проект',
+ 'config-ns-site-name' => 'ИÑто име како викито: $1',
+ 'config-ns-other' => 'Друго (наведете)',
+ 'config-ns-other-default' => 'МоеВики',
+ 'config-project-namespace-help' => "По примерот на Википедија, многу викија ги чуваат Ñтраниците Ñо правила на поÑебно меÑто од Ñамите Ñодржини, Ñ‚.е. во „'''проектен именÑки проÑтор'''“.
+Сите наÑлови на Ñтраниците во овој именÑки проÑтор почнуваат Ñо извеÑен префикÑ, којшто можете да го укажете тука.
+По традиција префикÑот произлегува од името на викито, но не Ñмее да Ñодржи интерпункциÑки знаци како „#“ или „:“.",
+ 'config-ns-invalid' => 'Ðазначениот именÑки проÑтор „<nowiki>$1</nowiki>“ е неважечки.
+Ðазначете друг проектен именÑки проÑтор.',
+ 'config-ns-conflict' => 'Ðаведениот именÑки проÑтор „<nowiki>$1</nowiki>“ Ñе коÑи Ñо оÑновниот именÑки проÑтор на МедијаВики.
+Ðаведете друг именÑки проÑтор за проектот.',
+ 'config-admin-box' => 'ÐдминиÑтратоÑка Ñметка',
+ 'config-admin-name' => 'Вашето име:',
+ 'config-admin-password' => 'Лозинка:',
+ 'config-admin-password-confirm' => 'Пак лозинката:',
+ 'config-admin-help' => 'Тука внеÑете го вашето кориÑничко име, на пр. „Петар ПетровÑки“.
+Ова име ќеÑе кориÑти за најава во викито.',
+ 'config-admin-name-blank' => 'ВнеÑете админиÑтраторÑко кориÑничко име.',
+ 'config-admin-name-invalid' => 'Ðазначенотго кориÑничко име „<nowiki>$1</nowiki>“ е неважечко.
+Ðазначете друго.',
+ 'config-admin-password-blank' => 'ВнеÑете лозинка за админиÑтраторÑката Ñметка',
+ 'config-admin-password-same' => 'Лозинката не може да биде иÑта Ñо кориÑничкото име.',
+ 'config-admin-password-mismatch' => 'Лозинките што ги внеÑовте не Ñе Ñовпаѓаат.',
+ 'config-admin-email' => 'Е-поштенÑка адреÑа:',
+ 'config-admin-email-help' => 'Тука внеÑете е-поштенÑка адреÑа за да можете да добивате е-пошта од други кориÑници на викито, да ја менувате лозинката, и да бидете извеÑтувани за промени во Ñтраниците на вашиот ÑпиÑок на набљудувања. Можете и да го оÑтавите празно.',
+ 'config-admin-error-user' => 'Се појави внатрешна грешка при Ñоздавањето на админиÑтраторот Ñо име „<nowiki>$1</nowiki>“.',
+ 'config-admin-error-password' => 'Се појави внатрешна грешка при задавање на лозинката за админиÑтраторот „<nowiki>$1</nowiki>“: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'ВнеÑовте неважечка е-поштенÑка адреÑа',
+ 'config-subscribe' => 'Претплатете Ñе на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release поштенÑкиот ÑпиÑок за извеÑтувања].',
+ 'config-subscribe-help' => 'Ова е ниÑкопрометен поштенÑки ÑпиÑок кој Ñе кориÑти за Ñоопштувања во врÑка Ñо изданија, вклучувајќи важни безбедноÑни Ñоопштенија.
+Треба да Ñе претплатите и да ја надградувате вашата инÑталација на МедијаВики кога излегуваат нови верзии.',
+ 'config-almost-done' => 'Уште малку Ñте готови!
+Сега можете да ги преÑкокнете преоÑтанатите поÑтавувања и веднаш да го инÑталирате викито.',
+ 'config-optional-continue' => 'ПоÑтави ми повеќе прашања.',
+ 'config-optional-skip' => 'Веќе ми здоÑади, дај Ñамо инÑталирај го викито.',
+ 'config-profile' => 'Профил на кориÑнички права:',
+ 'config-profile-wiki' => 'Традиционално вики',
+ 'config-profile-no-anon' => 'Задолжително отворање Ñметка',
+ 'config-profile-fishbowl' => 'Само овлаÑтени уредници',
+ 'config-profile-private' => 'Приватно вики',
+ 'config-profile-help' => "Викијата функционираат најдобро кога имаат што повеќе уредници.
+Во МедијаВики леÑно Ñе проверуваат Ñкорешните промени, и леÑно Ñе иÑправа (технички: „враќа“) штетата направена од неупатени или злонамерни кориÑници.
+
+Многумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е леÑно да убедите некого во предноÑтите на вики-концептот.
+Значи имате избор.
+
+'''{{int:config-profile-wiki}}''' — Ñекој може да го уредува, дури и без најавување.
+Ðко имате вики Ñо '''задолжително отворање на Ñметка''', тогаш добивате повеќе контрола, но ова може даги одврати Ñпонтаните учеÑници.
+
+'''{{int:config-profile-fishbowl}}''' — може да уредуваат Ñамо уредници што имаат добиено дозвола за тоа, но јавноÑта може да ги гледа Ñтраниците, вклучувајќи ја нивната иÑторија.
+'''{{int:config-profile-private}}''' — Ñтраниците Ñе видливи и уредливи Ñамо за овлаÑтени кориÑници.
+
+По инÑталацијата имате на избор и поÑложени кориÑнички права и поÑтавки. Погледајте во [http://www.mediawiki.org/wiki/Manual:User_rights прирачникот].",
+ 'config-license' => 'ÐвторÑки права и лиценца:',
+ 'config-license-none' => 'Без подножје за лиценца',
+ 'config-license-cc-by-sa' => 'Creative Commons ÐаведиИзвор СподелиПодИÑтиУÑлови',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons ÐаведиИзвор-Ðекомерцијално-СподелиПодИÑтиУÑлови',
+ 'config-license-cc-0' => 'Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ Ðула',
+ 'config-license-gfdl-old' => 'ГÐУ-ова лиценца за Ñлободна документација 1.2',
+ 'config-license-gfdl-current' => 'ГÐУ-ова лиценца за Ñлободна документација 1.3 или понова',
+ 'config-license-pd' => 'Јавен домен',
+ 'config-license-cc-choose' => 'Одберете друга Creative Commons лиценца по ваш избор',
+ 'config-license-help' => "Многу јавни викија ги Ñтаваат Ñите придонеÑи под [http://freedomdefined.org/Definition Ñлободна лиценца].
+Со ова Ñе Ñоздава атмоÑфера на општа ÑопÑтвеноÑÑ‚ и поттикнува долгорочно учеÑтво.
+Ова не е неопходно за викија на поединечни физички или правни лица.
+
+Ðко Ñакате да кориÑтите текÑÑ‚ од Википедија, и Ñакате Википедија да прифаќа текÑÑ‚ прекопиран од вашето вики, тогаш треба да ја одберете лиценцата '''Creative Commons ÐаведиИзвор СподелиПодИÑтиУÑлови'''.
+
+ГÐУ-овата лиценца за Ñлободна документација е Ñтарата лиценца на Википедија.
+Оваа лиценца Ñè уште важи, но има некои оÑобеноÑти што значително го отежнуваат толкувањето на иÑкориÑтувањето на Ñодржините вон Викимедија.",
+ 'config-email-settings' => 'Ðагодувања за е-пошта',
+ 'config-enable-email' => 'Овозможи излезна е-пошта',
+ 'config-enable-email-help' => 'Ðко Ñакате да работи е-поштата, [http://www.php.net/manual/en/mail.configuration.php поштенÑките нагодувања на PHP] треба да Ñе правилно намеÑтени.
+Ðко воопшто не Ñакате никакви функции за е-пошта, тогаш можете да ги оневозможите тука.',
+ 'config-email-user' => 'Овозможи е-пошта од кориÑник до кориÑник',
+ 'config-email-user-help' => 'Дозволи Ñите кориÑници да можат да Ñи праќаат е-пошта ако ја имаат овозможено во нагодувањата.',
+ 'config-email-usertalk' => 'Овозможи извеÑтувања за промени во кориÑнички Ñтраници за разговор',
+ 'config-email-usertalk-help' => 'Овозможи кориÑниците да добиваат извеÑтувања за промени во нивните кориÑнички Ñтраници за разговор ако ги имаат овозможено во нагодувањата.',
+ 'config-email-watchlist' => 'Овозможи извеÑтувања за ÑпиÑок на набљудувања',
+ 'config-email-watchlist-help' => 'Овозможи кориÑниците да добиваат извеÑтувања за нивните набљудувани Ñтраници ако ги имаат овозможено во нагодувањата.',
+ 'config-email-auth' => 'Овозможи потврдување на е-пошта',
+ 'config-email-auth-help' => "Ðко оваа можноÑÑ‚ е вклучена, тогаш кориÑниците ќе мора да ја потврдат нивната е-поштенÑка адреÑа преку врÑка иÑпратена до нив кога ја укажуваат или менуваат е-поштенÑката адреÑа.
+Само кориÑници Ñо потврдена е-пошта можат да добиваат е-пошта од други кориÑници или да ги менуваат пиÑмата за извеÑтување.
+Оваа можноÑÑ‚ е '''препорачана''' за јавни викија поради можни злоупотреби на е-поштенÑката функција.",
+ 'config-email-sender' => 'Повратна е-поштенÑка адреÑа:',
+ 'config-email-sender-help' => 'ВнеÑете ја е-поштенÑката адреÑа што ќе Ñе кориÑти како повратна адреÑа за излезна е-пошта.
+Таму ќе Ñе иÑпраќаат вратените (непримени) пиÑма.
+Многу поштенÑки опÑлужувачи бараат барем делот за доменÑко име да биде важечки.',
+ 'config-upload-settings' => 'Подигање на Ñлики и податотеки',
+ 'config-upload-enable' => 'Овозможи подигање на податотеки',
+ 'config-upload-help' => 'Подигањето на податотеки потенцијално го изложуваат вашиот опÑлужувач на безбедноÑни ризици.
+За повеќе информации, прочитајте го [http://www.mediawiki.org/wiki/Manual:Security поглавието за безбедноÑÑ‚] во прирачникот.
+
+За да овозможите подигање на податотеки, Ñменете го режимот на потпапката <code>images</code> во оÑновната папка на МедијаВики, за да му овозможите на мрежниот опÑлужувач да запишува во неа.
+Потоа овозможете ја оваа функција.',
+ 'config-upload-deleted' => 'Папка за избришаните податотеки:',
+ 'config-upload-deleted-help' => 'Одберете во која папка да Ñе архивираат избришаните податотеки.
+Ðајдобро би било ако таа не е доÑтапна преку интернет.',
+ 'config-logo' => 'URL за логото:',
+ 'config-logo-help' => 'Матичното руво на МедијаВики има проÑтор за лого од 135x160 пикÑели во горниот лев агол.
+Подигнете Ñлика Ñо Ñоодветна големина, и тука внеÑете ја URL-адреÑата.
+
+Ðко не Ñакате да имате лого, тогаш оÑтавете го ова поле празно.',
+ 'config-instantcommons' => 'Овозможи Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да кориÑтат Ñлики, звучни запиÑи и други мултимедијални Ñодржини од [http://commons.wikimedia.org/ Заедничката Ризница].
+За да може ова да работи, МедијаВики бара приÑтап до интернет.
+
+За повеќе информации за оваа функција и напатÑтвија за нејзино поÑтавување на вики (Ñите други оÑвен Ризницата), коноÑултирајте го [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].',
+ 'config-cc-error' => 'Изборникот на Creative Commons лиценца не даде резултати.
+ВнеÑете го името на лиценцата рачно.',
+ 'config-cc-again' => 'Одберете повторно...',
+ 'config-cc-not-chosen' => 'Одберете ја Ñаканата Creative Commons лиценца и кликнете на „продолжи“.',
+ 'config-advanced-settings' => 'Ðапредни нагодувања',
+ 'config-cache-options' => 'Ðагодувања за кеширање на објекти:',
+ 'config-cache-help' => 'Кеширањето на објекти Ñе кориÑти за зголемување на брзината на МедијаВики Ñо кеширање на чеÑто употребуваните податоци.
+Ова многу Ñе препорачува на Ñредни до големи викија, но од тоа ќе имаат полза и малите викија.',
+ 'config-cache-none' => 'Без кеширање (не Ñе оÑтранува ниедна функција, но може да влијае на брзината кај поголеми викија)',
+ 'config-cache-accel' => 'Кеширање на PHP-објекти (APC, eAccelerator, XCache или WinCache)',
+ 'config-cache-memcached' => 'КориÑти Memcached (бара дополнително поÑтавување и нагодување)',
+ 'config-memcached-servers' => 'Memcached-опÑлужувачи:',
+ 'config-memcached-help' => 'СпиÑок на IP-адреÑи за употреба во Memcached.
+Треба да Ñе наведе по една во Ñекој ред, како и портата што ќе Ñе кориÑти. Ðа пример:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Го одбравте Memcached како ваш ваш тип на Ñкришно памтење (кеш), но не наведовте опÑлужувач(и)',
+ 'config-memcache-badip' => 'ВнеÑовте неважечка IP-адреÑа за Memcached: $1',
+ 'config-memcache-noport' => 'Ðе ја наведовте портата за опÑлужувачот на Memcached: $1.
+Ðко не знаете која порта треба да Ñе кориÑти, оÑновната е 11211',
+ 'config-memcache-badport' => 'Бројките за портата на Memcached треба да бидат помеѓу $1 и $2',
+ 'config-extensions' => 'Додатоци',
+ 'config-extensions-help' => 'Во вашата папка <code>./extensions</code> беа воÑтановени горенаведените додатоци.
+
+За ова може да треба дополнително нагодување, но можете да ги овозможите Ñега',
+ 'config-install-alreadydone' => "'''Предупредување:''' Изгледа дека веќе го имате инÑталирано МедијаВики и Ñега Ñакате да го инÑталирате повторно.
+Продолжете на Ñледната Ñтраница.",
+ 'config-install-begin' => 'СтиÑкајќи на „{{int:config-continue}}“ ќе ја започнете инÑталацијата на МедијаВики.
+Ðко Ñакате да направите измени во доÑегашното, ÑтиÑнете на „Ðазад“.',
+ 'config-install-step-done' => 'готово',
+ 'config-install-step-failed' => 'не уÑпеа',
+ 'config-install-extensions' => 'Вклучувам додатоци',
+ 'config-install-database' => 'Ја поÑтавувам базата на податоци',
+ 'config-install-pg-schema-not-exist' => 'PostgreSQL-шемата не поÑтои',
+ 'config-install-pg-schema-failed' => 'Создавањето натабелите не уÑпеа.
+Проверете дали кориÑникот „$1“ може да запишува во шемата „$2“.',
+ 'config-install-pg-commit' => 'Спроведување на промени',
+ 'config-install-pg-plpgsql' => 'Проверувам јазик PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Ќе треба да го инÑталирате јазикот PL/pgSQL во базата $1',
+ 'config-pg-no-create-privs' => 'Сметката што ја наведовте за инÑталацијата нема доволно привилегии за да Ñоздаде друга Ñметка.',
+ 'config-install-user' => 'Создавам кориÑник за базата',
+ 'config-install-user-alreadyexists' => 'КориÑникот „$1“ веќе поÑтои',
+ 'config-install-user-create-failed' => 'Создавањето на кориÑникот „$1“ не уÑпеа: $2',
+ 'config-install-user-grant-failed' => 'Доделувањето на дозвола на кориÑникот „$1“ не уÑпеа: $2',
+ 'config-install-tables' => 'Создавам табели',
+ 'config-install-tables-exist' => "'''Предупредување''': Изгледа дека табелите за МедијаВики веќе поÑтојат.
+Го преÑкокнувам Ñоздавањето.",
+ 'config-install-tables-failed' => "'''Грешка''': Создавањето на табелата не уÑпеа поради Ñледнава грешка: $1",
+ 'config-install-interwiki' => 'Ги пополнувам оÑновно-зададените интервики-табели',
+ 'config-install-interwiki-list' => 'Ðе можев да ја пронајдам податотеката <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Предупредување''': Табелата Ñо интервикија веќе Ñодржи Ñтавки.
+Го преÑкокнувам оÑновно-зададениот ÑпиÑок.",
+ 'config-install-stats' => 'Ги подготвувам ÑтатиÑтиките',
+ 'config-install-keys' => 'Создавам таен клуч',
+ 'config-insecure-keys' => "'''Предупредување:''' {{PLURAL:$2|БезбедноÑниот клуч $1 Ñоздаден во текот на инÑталацијата не е ÑоÑем безбеден|БезбедноÑните клучеви $1 Ñоздадени во текот на инÑталацијата не Ñе ÑоÑем безбедни}}. Ви препорачуваме да {{PLURAL:$2|го|ги}} Ñмените рачно.",
+ 'config-install-sysop' => 'Создавање на админиÑтраторÑка кориÑничка Ñметка',
+ 'config-install-subscribe-fail' => 'Ðе можам да ве претплатам на објавите на МедијаВики',
+ 'config-install-mainpage' => 'Создавам главна Ñтраница Ñо Ñтандардна Ñодржина',
+ 'config-install-extension-tables' => 'Изработка на табели за овозможени додатоци',
+ 'config-install-mainpage-failed' => 'Ðе можев да вметнам главна Ñтраница: $1',
+ 'config-install-done' => "'''ЧеÑтитаме!'''
+УÑпешно го инÑталиравте МедијаВики.
+
+ИнÑталаторот Ñоздаде податотека <code>LocalSettings.php</code>.
+Таму Ñе Ñодржат Ñите ваши нагодувања.
+
+Ќе треба да ја преземете и да ја Ñтавите во оÑновата на инÑталацијата (иÑтата папка во која Ñе наоѓа index.php). Преземањето треба да е започнато автоматÑки.
+
+Ðко не ви е понудено преземање, или пак ако Ñте го откажале, можете да го почнете одново ÑтиÑкајќи на Ñледнава врÑка:
+
+$3
+
+'''Ðапомена''': Ðко ова не го направите Ñега, податотеката Ñо поÑтавки повеќе нема да биде на доÑтапна.
+
+Откога ќе завршите Ñо тоа, можете да '''[$2 влезете на вашето вики]'''.",
+ 'config-download-localsettings' => 'Преземи го LocalSettings.php',
+ 'config-help' => 'помош',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ */
+$messages['ml'] = array(
+ 'config-desc' => 'മീഡിയവികàµà´•à´¿ ഇൻസàµà´±àµà´±àµ‹à´³àµ¼',
+ 'config-title' => 'മീഡിയവികàµà´•à´¿ $1 ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ»',
+ 'config-information' => 'വിവരങàµà´™àµ¾',
+ 'config-localsettings-upgrade' => "'''അറിയിപàµà´ªàµ''': ഒരൠ<code>LocalSettings.php</code> ഫയൽ കാണàµà´¨àµà´¨àµ.
+സോഫàµà´±àµà´±àµâ€Œà´µàµ‡àµ¼ à´…à´ªàµâ€Œà´—àµà´°àµ‡à´¡àµ ചെയàµà´¯àµà´• സാദàµà´§àµà´¯à´®à´¾à´£àµ.
+ദയവായി പെടàµà´Ÿà´¿à´¯à´¿àµ½ <code>\$wgUpgradeKey</code> à´Žà´¨àµà´¨à´¤à´¿à´¨àµà´±àµ† വില നൽകàµà´•.",
+ 'config-localsettings-key' => 'à´…à´ªàµâ€Œà´—àµà´°àµ‡à´¡àµ ചാവി:',
+ 'config-localsettings-badkey' => 'താങàµà´•àµ¾ നൽകിയ ചാവി തെറàµà´±à´¾à´£àµ',
+ 'config-session-error' => 'സെഷൻ à´¤àµà´Ÿà´™àµà´™àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµ: $1',
+ 'config-your-language' => 'താങàµà´•à´³àµà´Ÿàµ† ഭാഷ:',
+ 'config-your-language-help' => 'ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» à´ªàµà´°à´•àµà´°à´¿à´¯à´¯à´¿àµ½ ഉപയോഗികàµà´•àµ‡à´£àµà´Ÿ ഭാഷ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•.',
+ 'config-wiki-language' => 'വികàµà´•à´¿ ഭാഷ:',
+ 'config-wiki-language-help' => 'വികàµà´•à´¿à´¯à´¿àµ½ à´ªàµà´°à´§à´¾à´¨à´®à´¾à´¯à´¿ ഉപയോഗികàµà´•àµ‡à´£àµà´Ÿ ഭാഷ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•.',
+ 'config-back' => '↠പിനàµà´¨à´¿à´²àµ‡à´¯àµà´•àµà´•àµ',
+ 'config-continue' => 'à´¤àµà´Ÿà´°àµà´• →',
+ 'config-page-language' => 'ഭാഷ',
+ 'config-page-welcome' => 'മീഡിയവികàµà´•à´¿à´¯à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´¸àµà´µà´¾à´—തം!',
+ 'config-page-dbconnect' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•',
+ 'config-page-upgrade' => 'നിലവിലàµà´³àµà´³ ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» à´…à´ªàµâ€Œà´—àµà´°àµ‡à´¡àµ ചെയàµà´¯àµà´•',
+ 'config-page-dbsettings' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾',
+ 'config-page-name' => 'പേരàµ',
+ 'config-page-options' => 'à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
+ 'config-page-install' => 'ഇൻസàµà´±àµà´±àµ‹àµ¾',
+ 'config-page-complete' => 'സമàµà´ªàµ‚ർണàµà´£à´‚!',
+ 'config-page-restart' => 'ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» à´…à´Ÿà´šàµà´š ശേഷം à´ªàµà´¨àµ¼à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+ 'config-page-readme' => 'ഇതൠവായികàµà´•àµ‚',
+ 'config-page-releasenotes' => 'à´ªàµà´°à´•à´¾à´¶à´¨ à´•àµà´±à´¿à´ªàµà´ªàµà´•àµ¾',
+ 'config-page-copying' => 'പകർതàµà´¤àµ½',
+ 'config-page-upgradedoc' => 'à´…à´ªàµâ€Œà´—àµà´°àµ‡à´¡à´¿à´™àµ',
+ 'config-help-restart' => 'ഇതàµà´µà´°àµ† ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯ à´Žà´²àµà´²à´¾à´µà´¿à´µà´°à´™àµà´™à´³àµà´‚ ഒഴിവാകàµà´•à´¾à´¨àµà´‚ ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» à´ªàµà´°à´•àµà´°à´¿à´¯ നിർതàµà´¤à´¿-വീണàµà´Ÿàµà´®à´¾à´°à´‚à´­à´¿à´•àµà´•à´¾à´¨àµà´‚ താങàµà´•à´³à´¾à´—àµà´°à´¹à´¿à´•àµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ‹?',
+ 'config-restart' => 'അതെ, à´ªàµà´¨àµ¼à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+ 'config-sidebar' => '* [http://www.mediawiki.org മീഡിയവികàµà´•à´¿ à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾]
+* [http://www.mediawiki.org/wiki/Help:Contents ഉപയോകàµà´¤àµƒà´¸à´¹à´¾à´¯à´¿]
+* [http://www.mediawiki.org/wiki/Manual:Contents കാരàµà´¯à´¨à´¿àµ¼à´µà´¹à´£à´¸à´¹à´¾à´¯à´¿]
+* [http://www.mediawiki.org/wiki/Manual:FAQ പതിവàµà´šàµ‹à´¦àµà´¯à´™àµà´™àµ¾]',
+ 'config-env-php' => 'പി.à´Žà´šàµà´šàµ.പി. $1 ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
+ 'config-no-db' => 'à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®à´¾à´¯ ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´¡àµà´°àµˆà´µàµ¼ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´²!',
+ 'config-memory-raised' => 'പി.à´Žà´šàµà´šàµ.പി.à´¯àµà´Ÿàµ† <code>memory_limit</code> $1 ആണàµ, $2 ആയി ഉയർതàµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'config-memory-bad' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:''' പി.à´Žà´šàµà´šàµ.പി.à´¯àµà´Ÿàµ† <code>memory_limit</code> $1 ആണàµ.
+ഇതൠമികàµà´•à´µà´¾à´±àµà´‚ വളരെ à´•àµà´±à´µà´¾à´£àµ.
+ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ‡à´•àµà´•à´¾à´‚!",
+ 'config-db-type' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ തരം:',
+ 'config-db-host' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ ഹോസàµà´±àµà´±àµ:',
+ 'config-db-name' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸à´¿à´¨àµà´±àµ† പേരàµ:',
+ 'config-db-name-oracle' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´¸àµà´•àµ€à´®:',
+ 'config-db-install-account' => 'ഇൻസàµà´±àµà´±à´²àµ‡à´·à´¨àµà´³àµà´³ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚',
+ 'config-db-username' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
+ 'config-db-password' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
+ 'config-mysql-old' => 'മൈഎസàµâ€Œà´•àµà´¯àµ‚എൽ $1 അഥവാ അതിലàµà´‚ à´ªàµà´¤à´¿à´¯à´¤àµ ആവശàµà´¯à´®à´¾à´£àµ, താങàµà´•à´³àµà´Ÿàµ† പകàµà´•àµ½ ഉളàµà´³à´¤àµ $2 ആണàµ.',
+ 'config-db-port' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ പോർടàµà´Ÿàµ:',
+ 'config-db-schema' => 'മീഡിയവികàµà´•à´¿à´¯àµà´•àµà´•à´¾à´¯àµà´³àµà´³ à´¸àµà´•àµ€à´®',
+ 'config-support-info' => 'മീഡിയവികàµà´•à´¿ താഴെ പറയàµà´¨àµà´¨ ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സിസàµà´±àµà´±à´‚സൠപിനàµà´¤àµà´£à´¯àµà´•àµà´•àµà´¨àµà´¨àµ:
+
+$1
+
+താങàµà´•àµ¾ ഉപയോഗികàµà´•à´¾à´¨à´¾à´—àµà´°à´¹à´¿à´•àµà´•àµà´¨àµà´¨ ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സിസàµà´±àµà´±à´‚ പടàµà´Ÿà´¿à´•à´¯à´¿à´²à´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½, ദയവായി പിനàµà´¤àµà´£ സജàµà´œà´®à´¾à´•àµà´•à´¾à´¨à´¾à´¯à´¿ à´®àµà´•à´³à´¿àµ½ നൽകിയിടàµà´Ÿàµà´³àµà´³ ലിങàµà´•à´¿à´²àµ† നിർദàµà´¦àµ‡à´¶à´™àµà´™àµ¾ ചെയàµà´¯àµà´•.',
+ 'config-header-mysql' => 'മൈഎസàµâ€Œà´•àµà´¯àµ‚എൽ സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾',
+ 'config-invalid-db-type' => 'അസാധàµà´µà´¾à´¯ ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ തരം',
+ 'config-missing-db-name' => '"ഡേറàµà´±à´¾à´¬àµ‡à´¸à´¿à´¨àµà´±àµ† പേരി"നൠഒരൠവില നിർബനàµà´§à´®à´¾à´¯àµà´‚ നൽകിയിരികàµà´•à´£à´‚',
+ 'config-connection-error' => '$1.
+
+താഴെ നൽകിയിരികàµà´•àµà´¨àµà´¨ ഹോസàµà´±àµà´±àµ, ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚, രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´Žà´¨àµà´¨à´¿à´µ പരിശോധിചàµà´šàµ വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
+ 'config-regenerate' => 'LocalSettings.php à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´• →',
+ 'config-mysql-engine' => 'à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ എൻജിൻ:',
+ 'config-site-name' => 'വികàµà´•à´¿à´¯àµà´Ÿàµ† പേരàµ:',
+ 'config-site-name-help' => 'ഇതൠബàµà´°àµ—സറിനàµà´±àµ† ടൈറàµà´±à´¿àµ½ ബാറിലàµà´‚ മറàµà´±à´¨àµ‡à´•à´‚ ഇടങàµà´™à´³à´¿à´²àµà´‚ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.',
+ 'config-site-name-blank' => 'സൈറàµà´±à´¿à´¨àµà´±àµ† പേരൠനൽകàµà´•.',
+ 'config-project-namespace' => 'പദàµà´§à´¤à´¿ നാമമേഖല:',
+ 'config-ns-generic' => 'പദàµà´§à´¤à´¿',
+ 'config-ns-site-name' => 'വികàµà´•à´¿à´¯àµà´Ÿàµ† പേരൠതനàµà´¨àµ†: $1',
+ 'config-ns-other' => 'ഇതരം (à´µàµà´¯à´•àµà´¤à´®à´¾à´•àµà´•àµà´•)',
+ 'config-ns-other-default' => 'à´Žà´¨àµà´±àµ†â€Œà´µà´¿à´•àµà´•à´¿',
+ 'config-admin-box' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• à´…à´‚à´—à´¤àµà´µà´‚',
+ 'config-admin-name' => 'താങàµà´•à´³àµà´Ÿàµ† പേരàµ:',
+ 'config-admin-password' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
+ 'config-admin-password-confirm' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´’à´°à´¿à´•àµà´•àµ½à´•àµà´•àµ‚à´Ÿà´¿:',
+ 'config-admin-help' => 'ഇവിടെ താങàµà´•à´³àµà´Ÿàµ† ഇചàµà´›à´¾à´¨àµà´¸à´°à´£à´®àµà´³àµà´³ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നൽകàµà´•, ഉദാഹരണം "ശശി കൊടàµà´Ÿà´¾à´°à´¤àµà´¤à´¿àµ½".
+à´ˆ പേരായിരികàµà´•à´£à´‚ വികàµà´•à´¿à´¯à´¿àµ½ à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•à´¾àµ» താങàµà´•àµ¾ ഉപയോഗികàµà´•àµ‡à´£àµà´Ÿà´¤àµ.',
+ 'config-admin-name-blank' => 'ഒരൠകാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നൽകàµà´•.',
+ 'config-admin-name-invalid' => 'നൽകിയിടàµà´Ÿàµà´³àµà´³ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ "<nowiki>$1</nowiki>" അസാധàµà´µà´¾à´£àµ.
+മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നൽകàµà´•.',
+ 'config-admin-password-blank' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´³àµà´³ രഹസàµà´¯à´µà´¾à´•àµà´•àµ നൽകàµà´•.',
+ 'config-admin-password-same' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµà´‚ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´µàµà´‚ à´’à´¨àµà´¨à´¾à´•à´°àµà´¤àµ.',
+ 'config-admin-password-mismatch' => 'താങàµà´•àµ¾ നൽകിയ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ à´°à´£àµà´Ÿàµà´‚ തമàµà´®à´¿àµ½ യോജികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
+ 'config-admin-email' => 'ഇമെയിൽ വിലാസം:',
+ 'config-admin-error-user' => '"<nowiki>$1</nowiki>" à´Žà´¨àµà´¨ പേരിലàµà´³àµà´³ കാരàµà´¯à´¨à´¿àµ¼à´µà´¹à´£ à´…à´‚à´—à´¤àµà´µ നിർമàµà´®à´¿à´¤à´¿à´¯àµà´•àµà´•à´¿à´Ÿàµ† ആനàµà´¤à´°à´¿à´•à´®à´¾à´¯ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿.',
+ 'config-admin-error-password' => '"<nowiki>$1</nowiki>" à´Žà´¨àµà´¨ പേരിലàµà´³àµà´³ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµ രഹസàµà´¯à´µà´¾à´•àµà´•àµ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´ªàµà´ªàµ‹àµ¾ ആനàµà´¤à´°à´¿à´•à´®à´¾à´¯ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿: <pre>$2</pre>',
+ 'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce à´ªàµà´°à´•à´¾à´¶à´¨ അറിയിപàµà´ªàµ മെയിലിങൠലിസàµà´±àµà´±à´¿àµ½] വരികàµà´•à´¾à´°à´¾à´•àµà´•.',
+ 'config-subscribe-help' => 'à´ªàµà´±à´¤àµà´¤à´¿à´±à´•àµà´•àµ½ അറിയിപàµà´ªàµà´•à´³àµà´‚, à´ªàµà´°à´§à´¾à´¨ à´¸àµà´°à´•àµà´·à´¾ അറിയിപàµà´ªàµà´•à´³àµà´‚ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨ വളരെ à´Žà´´àµà´¤àµà´¤àµà´•à´³àµŠà´¨àµà´¨àµà´‚ ഉണàµà´Ÿà´¾à´•à´¾à´±à´¿à´²àµà´²à´¾à´¤àµà´¤ മെയിലിങൠലിസàµà´±àµà´±àµ ആണിതàµ.
+à´ªàµà´¤à´¿à´¯ പതിപàµà´ªàµà´•àµ¾ à´ªàµà´±à´¤àµà´¤àµ വരàµà´¨àµà´¨à´¤à´¨àµà´¸à´°à´¿à´šàµà´šàµ അവയെകàµà´•àµà´±à´¿à´šàµà´šà´±à´¿à´¯à´¾à´¨àµà´‚ മീഡിയവികàµà´•à´¿ ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» à´ªàµà´¤àµà´•àµà´•à´¾à´¨àµà´‚ ഇതിനàµà´±àµ† വരികàµà´•à´¾à´°àµ»/വരികàµà´•à´¾à´°à´¿ ആവàµà´•.',
+ 'config-almost-done' => 'മികàµà´•à´µà´¾à´±àµà´‚ പൂർതàµà´¤à´¿à´¯à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ!
+ബാകàµà´•à´¿à´¯àµà´³àµà´³à´µ അവഗണിചàµà´šàµ വികàµà´•à´¿ ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¯à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+ 'config-optional-continue' => 'കൂടàµà´¤àµ½ ചോദàµà´¯à´™àµà´™àµ¾ ചോദികàµà´•àµ‚.',
+ 'config-optional-skip' => 'ഞാൻ മടàµà´¤àµà´¤àµ, ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¤àµ തീർകàµà´•àµ.',
+ 'config-profile-wiki' => 'പരമàµà´ªà´°à´¾à´—à´¤ വികàµà´•à´¿',
+ 'config-profile-no-anon' => 'à´…à´‚à´—à´¤àµà´µ സൃഷàµà´Ÿà´¿ ചെയàµà´¯àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ',
+ 'config-profile-fishbowl' => 'à´…à´¨àµà´µà´¾à´¦à´®àµà´³àµà´³à´µàµ¼ മാതàµà´°à´‚ തിരàµà´¤àµà´¤àµà´•',
+ 'config-profile-private' => 'à´¸àµà´µà´•à´¾à´°àµà´¯ വികàµà´•à´¿',
+ 'config-license' => 'പകർപàµà´ªà´µà´•à´¾à´¶à´µàµà´‚ à´…à´¨àµà´®à´¤à´¿à´¯àµà´‚:',
+ 'config-license-cc-by-sa' => 'à´•àµà´°à´¿à´¯àµ‡à´±àµà´±àµ€à´µàµ കോമൺസൠആടàµà´°à´¿à´¬àµà´¯àµ‚ഷൻ ഷെയർ എലൈകàµ',
+ 'config-license-cc-by-nc-sa' => 'à´•àµà´°à´¿à´¯àµ‡à´±àµà´±àµ€à´µàµ കോമൺസൠആടàµà´°à´¿à´¬àµà´¯àµ‚ഷൻ നോൺ-കൊമേഴàµà´¸àµà´¯àµ½ ഷെയർ എലൈകàµ',
+ 'config-license-gfdl-old' => 'à´—àµà´¨àµ‚ à´¸àµà´µà´¤à´¨àµà´¤àµà´° à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´£à´¾à´¨àµà´®à´¤à´¿ 1.2',
+ 'config-license-gfdl-current' => 'à´—àµà´¨àµ‚ à´¸àµà´µà´¤à´¨àµà´¤àµà´° à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´£à´¾à´¨àµà´®à´¤à´¿ 1.3 അഥവാ à´ªàµà´¤à´¿à´¯à´¤àµ',
+ 'config-license-pd' => 'പൊതൠസഞàµà´šà´¯à´‚',
+ 'config-email-settings' => 'ഇമെയിൽ സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾',
+ 'config-enable-email-help' => "ഇമെയിൽ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•à´£à´®àµ†à´™àµà´•à´¿àµ½, [http://www.php.net/manual/en/mail.configuration.php PHP's മെയിൽ സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾] ശരിയായി à´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ.
+ഇമെയിൽ സൗകരàµà´¯à´‚ ആവശàµà´¯à´®à´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½, ഇവിടെതàµà´¤à´¨àµà´¨àµ† അതൠനിർജàµà´œàµ€à´µà´®à´¾à´•àµà´•à´¾à´‚.",
+ 'config-email-user' => 'ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ ഇമെയിൽ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´¸à´œàµà´œà´®à´¾à´•àµà´•àµà´•',
+ 'config-email-user-help' => 'à´¸àµà´µà´¨àµà´¤à´‚ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½ ഇമെയിൽ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµ† മറàµà´±àµà´³àµà´³à´µàµ¼à´•àµà´•àµ ഇമെയിൽ അയയàµà´•àµà´•à´¾àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•.',
+ 'config-email-usertalk' => 'ഉപയോകàµà´¤àµƒà´¸à´‚വാദം താളിൽ മാറàµà´±à´™àµà´™à´³àµà´£àµà´Ÿà´¾à´¯à´¾àµ½ അറിയികàµà´•àµà´•',
+ 'config-email-watchlist' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯à´¿àµ½ മാറàµà´±à´‚ വനàµà´¨à´¾àµ½ അറിയികàµà´•àµà´•',
+ 'config-email-auth' => 'ഇമെയിലിനàµà´±àµ† സാധàµà´¤à´¾à´ªà´°à´¿à´¶àµ‹à´§à´¨ സജàµà´œà´®à´¾à´•àµà´•àµà´•',
+ 'config-email-sender' => 'മറàµà´ªà´Ÿà´¿à´¯àµà´•àµà´•àµà´³àµà´³ ഇമെയിൽ വിലാസം:',
+ 'config-upload-settings' => 'à´šà´¿à´¤àµà´°à´™àµà´™à´³àµà´‚ à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµ½',
+ 'config-upload-enable' => 'à´ªàµà´°à´®à´¾à´£ à´…à´ªàµâ€Œà´²àµ‹à´¡àµà´•àµ¾ സജàµà´œà´®à´¾à´•àµà´•àµà´•',
+ 'config-upload-deleted' => 'മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഫയലàµà´•àµ¾à´•àµà´•àµà´³àµà´³ ഡയറകàµà´±àµà´±à´±à´¿:',
+ 'config-logo' => 'ലോഗോയàµà´Ÿàµ† യൂ.ആർ.എൽ.:',
+ 'config-logo-help' => 'മീഡിയവികàµà´•à´¿à´¯à´¿àµ½ à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ ദൃശàµà´¯à´°àµ‚പതàµà´¤à´¿àµ½ 135x160 പികàµà´¸à´²àµà´³àµà´³ ലോഗോ à´®àµà´•à´³à´¿àµ½ ഇടതൠമൂലയിൽ കാണാം.
+à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®à´¾à´¯ വലിപàµà´ªà´®àµà´³àµà´³ ഒരൠചിതàµà´°à´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµ, അതിനàµà´±àµ† യൂ.ആർ.എൽ. ഇവിടെ നൽകàµà´•.
+
+താങàµà´•àµ¾à´•àµà´•àµ ലോഗോ ആവശàµà´¯à´®à´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½, à´ˆ പെടàµà´Ÿà´¿ ശൂനàµà´¯à´®à´¾à´¯à´¿à´Ÿàµà´•.',
+ 'config-cc-again' => 'à´’à´¨àµà´¨àµà´•àµ‚à´Ÿà´¿ à´Žà´Ÿàµà´•àµà´•àµ‚...',
+ 'config-advanced-settings' => 'വിപàµà´²àµ€à´•àµƒà´¤ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾',
+ 'config-extensions' => 'à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™àµ¾',
+ 'config-install-step-done' => 'ചെയàµà´¤àµ à´•à´´à´¿à´žàµà´žàµ',
+ 'config-install-step-failed' => 'പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ',
+ 'config-install-extensions' => 'à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´¨àµà´¨àµ',
+ 'config-install-database' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സജàµà´œà´®à´¾à´•àµà´•àµà´¨àµà´¨àµ',
+ 'config-install-pg-commit' => 'മാറàµà´±à´™àµà´™àµ¾ à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+ 'config-install-user' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨àµ',
+ 'config-install-sysop' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨àµ',
+ 'config-install-mainpage' => 'à´¸àµà´µà´¾à´­à´¾à´µà´¿à´• ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤àµ‹à´Ÿàµà´•àµ‚à´Ÿà´¿ à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨àµ',
+ 'config-install-mainpage-failed' => 'à´ªàµà´°à´§à´¾à´¨ താൾ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²: $1',
+ 'config-install-done' => "'''അഭിനനàµà´¦à´¨à´™àµà´™àµ¾!'''
+താങàµà´•àµ¾ വിജയകരമായി മീഡിയവികàµà´•à´¿ ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+
+ഇൻസàµà´±àµà´±àµ‹à´³àµ¼ ഒരൠ<code>LocalSettings.php</code> ഫയൽ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.
+അതിൽ താങàµà´•à´³àµà´Ÿàµ† à´Žà´²àµà´²à´¾ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³àµà´®àµà´£àµà´Ÿàµ.
+
+താങàµà´•àµ¾ അതൠ[$1 à´Žà´Ÿàµà´¤àµà´¤àµ] താങàµà´•à´³àµà´Ÿàµ† വികàµà´•à´¿ ഇൻസàµà´±àµà´±à´²àµ‡à´·à´¨àµà´±àµ† à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨ ഡയറകàµà´±àµà´±à´±à´¿à´¯à´¿àµ½ ഇടàµà´• (index.php à´•à´¿à´Ÿà´•àµà´•àµà´¨àµà´¨ അതേ ഡയറകàµà´±àµà´±à´±à´¿).
+'''à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•''': ഇതൠഇപàµà´ªàµ‹àµ¾ ചെയàµà´¤à´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½, സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ കോൺഫിഗറേഷൻ ഫയൽ à´Žà´Ÿàµà´•àµà´•à´¾à´¤àµ† ഇൻസàµà´±àµà´±à´²àµ‡à´·àµ» à´ªàµà´°à´•àµà´°à´¿à´¯à´¯à´¿àµ½ നിനàµà´¨àµ à´ªàµà´±à´¤àµà´¤à´¿à´±à´™àµà´™à´¿à´¯à´¾àµ½ പിനàµà´¨àµ€à´Ÿàµ ലഭàµà´¯à´®à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¿à´²àµà´².
+
+ചെയàµà´¤à´¶àµ‡à´·à´‚, താങàµà´•àµ¾à´•àµà´•àµ '''[$2 വികàµà´•à´¿à´¯à´¿àµ½ à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•à´¾à´‚]'''.",
+);
+
+/** Mongolian (Монгол)
+ * @author Chinneeb
+ */
+$messages['mn'] = array(
+ 'config-page-language' => 'Ð¥Ñл',
+);
+
+/** Erzya (ЭрзÑнь)
+ * @author Botuzhaleny-sodamo
+ */
+$messages['myv'] = array(
+ 'config-page-language' => 'Кель',
+ 'config-page-name' => 'ЛемезÑ',
+ 'config-page-readme' => 'Ловномак',
+ 'config-admin-name' => 'Леметь:',
+ 'config-admin-password' => 'Совамо валот:',
+ 'config-admin-password-confirm' => 'Совамо валот одов:',
+ 'config-admin-email' => 'Е-Ñёрма паргот:',
+ 'config-install-step-done' => 'теезь',
+);
+
+/** Dutch (Nederlands)
+ * @author Catrope
+ * @author McDutchie
+ * @author Purodha
+ * @author SPQRobin
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'config-desc' => 'Het installatieprogramma voor MediaWiki',
+ 'config-title' => 'Installatie MediaWiki $1',
+ 'config-information' => 'Informatie',
+ 'config-localsettings-upgrade' => 'Er is een bestaand instellingenbestand <code>LocalSettings.php</code> gevonden.
+Voer de waarde van <code>$wgUpgradeKey</code> in in onderstaande invoerveld om deze installatie bij te werken.
+De instelling is terug te vinden in LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Het bestand LocalSettings.php is al aanwezig.
+Voer update.php uit om deze installatie bij te werken.',
+ 'config-localsettings-key' => 'Upgradesleutel:',
+ 'config-localsettings-badkey' => 'De sleutel die u hebt opgegeven is onjuist',
+ 'config-upgrade-key-missing' => 'Er is een bestaande installatie van MediaWiki aangetroffen.
+Plaats de volgende regel onderaan uw LocalSettings.php om deze installatie bij te werken:
+
+$1',
+ 'config-localsettings-incomplete' => 'De bestaande inhoud van LocalSettings.php lijkt incompleet.
+De variabele $1 is niet ingesteld.
+Wijzig LocalSettings.php zodat deze variabele is ingesteld en klik op "Doorgaan".',
+ 'config-localsettings-connection-error' => 'Er is een fout opgetreden tijdens het verbinden van de database met de instellingen uit LocalSettings.php of AdminSettings.php. Los het probleem met de instellingen op en probeer het daarna opnieuw.
+
+$1',
+ 'config-session-error' => 'Fout bij het begin van de sessie: $1',
+ 'config-session-expired' => 'Uw sessiegegevens zijn verlopen.
+Sessies zijn ingesteld om een levensduur van $1 te hebben.
+U kunt deze wijzigen via de instelling <code>session.gc_maxlifetime</code> in php.ini.
+Begin het installatieproces opnieuw.',
+ 'config-no-session' => 'Uw sessiegegevens zijn verloren gegaan.
+Controleer uw php.ini en zorg dat er een juiste map is ingesteld voor <code>session.save_path</code>.',
+ 'config-your-language' => 'Uw taal:',
+ 'config-your-language-help' => 'Selecteer een taal om tijdens het installatieproces te gebruiken.',
+ 'config-wiki-language' => 'Wikitaal:',
+ 'config-wiki-language-help' => 'Selecteer de taal waar de wiki voornamelijk in wordt geschreven.',
+ 'config-back' => '↠Terug',
+ 'config-continue' => 'Doorgaan →',
+ 'config-page-language' => 'Taal',
+ 'config-page-welcome' => 'Welkom bij MediaWiki!',
+ 'config-page-dbconnect' => 'Verbinding maken met database',
+ 'config-page-upgrade' => 'Bestaande installatie bijwerken',
+ 'config-page-dbsettings' => 'Databaseinstellingen',
+ 'config-page-name' => 'Naam',
+ 'config-page-options' => 'Opties',
+ 'config-page-install' => 'Installeren',
+ 'config-page-complete' => 'Afgerond!',
+ 'config-page-restart' => 'Installatie herstarten',
+ 'config-page-readme' => 'Lees mij',
+ 'config-page-releasenotes' => 'Release notes',
+ 'config-page-copying' => 'Kopiëren',
+ 'config-page-upgradedoc' => 'Bijwerken',
+ 'config-page-existingwiki' => 'Bestaande wiki',
+ 'config-help-restart' => 'Wilt u alle opgeslagen gegevens die u hebt ingevoerd wissen en het installatieproces opnieuw starten?',
+ 'config-restart' => 'Ja, opnieuw starten',
+ 'config-welcome' => '=== Controle ongeving ===
+Er worden een aantal basale controles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.
+Als u hulp nodig hebt bij de installatie, lever deze gegevens dan ook aan.',
+ 'config-copyright' => "=== Auteursrechten en voorwaarden ===
+
+$1
+
+Dit programma is vrije software. U mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar uw keuze - enige latere versie.
+
+Dit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.
+Zie de GNU General Public License voor meer informatie.
+
+Samen met dit programma hoort u een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [http://www.gnu.org/copyleft/gpl.html lees de licentie online].",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki thuispagina]
+* [http://www.mediawiki.org/wiki/Help:Contents Gebruikershandleiding] (Engelstalig)
+* [http://www.mediawiki.org/wiki/Manual:Contents Beheerdershandleiding] (Engelstalig)
+* [http://www.mediawiki.org/wiki/Manual:FAQ Veel gestelde vragen] (Engelstalig)
+----
+* <doclink href=Readme>Leesmij</doclink> (Engelstalig)
+* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)
+* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)
+* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)',
+ 'config-env-good' => 'De omgeving is gecontroleerd.
+U kunt MediaWiki installeren.',
+ 'config-env-bad' => 'De omgeving is gecontroleerd.
+U kunt MediaWiki niet installeren.',
+ 'config-env-php' => 'PHP $1 is op dit moment geïnstalleerd.',
+ 'config-env-php-toolow' => 'PHP $1 is geïnstalleerd.
+MediaWiki heeft PHP $2 of hoger nodig om correct te kunnen werken.',
+ 'config-unicode-using-utf8' => 'Voor Unicode-normalisatie wordt utf8_normalize.so van Brion Vibber gebruikt.',
+ 'config-unicode-using-intl' => 'Voor Unicode-normalisatie wordt de [http://pecl.php.net/intl PECL-extensie intl] gebruikt.',
+ 'config-unicode-pure-php-warning' => "'''Waarschuwing''': De [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicode-normalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.
+Als u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisatie].",
+ 'config-unicode-update-warning' => "'''Waarschuwing''': De geïnstalleerde versie van de Unicode-normalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].
+U moet [http://www.mediawiki.org/wiki/Unicode_normalization_considerations bijwerken] als Unicode voor u van belang is.",
+ 'config-no-db' => 'Er kon geen geschikte databasedriver geladen worden!',
+ 'config-no-db-help' => 'U moet een databasedriver installeren voor PHP.
+De volgende databases worden ondersteund: $1.
+
+Als u op een gedeelde omgeving zit, vraag dan aan uw hostingprovider een geschikte databasedriver te installeren.
+Als u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.
+Als u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.',
+ 'config-no-fts3' => "'''Waarschuwing''': SQLite is gecompileerd zonder de module [http://sqlite.org/fts3.html FTS3]; er zijn geen zoekfuncties niet beschikbaar.",
+ 'config-register-globals' => "'''Waarschuwing: De PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''
+'''Schakel deze uit als dat mogelijk is.'''
+MediaWiki kan ermee werken, maar uw server is dan meer kwetsbaar voor beveiligingslekken.",
+ 'config-magic-quotes-runtime' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''
+Deze instelling zorgt voor gegevenscorruptie.
+U kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-magic-quotes-sybase' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''
+Deze instelling zorgt voor gegevenscorruptie.
+U kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-mbstring' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''
+Deze instelling zorgt voor gegevenscorruptie.
+U kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-ze1' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] is actief!'''
+Deze instelling zorgt voor grote problemen in MediaWiki.
+U kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-safe-mode' => "'''Waarschuwing:'''
+'''PHP's [http://www.php.net/features.safe-mode veilige modus] is actief.'''
+Dit kan problemen veroorzaken, vooral bij het uploaden van bestanden en ondersteuning van <code>math</code>.",
+ 'config-xml-bad' => 'De XML-module van PHP ontbreekt.
+MediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.
+Als u gebruik maakt van Mandrake, installeer dan het package php-xml.',
+ 'config-pcre' => 'De ondersteuningsmodule PCRE lijkt te missen.
+MediaWiki vereist dat de met Perl compatibele reguliere expressies werken.',
+ 'config-pcre-no-utf8' => "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.
+MediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
+ 'config-memory-raised' => "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
+ 'config-memory-bad' => "'''Waarschuwing:''' PHP's <code>memory_limit</code> is $1.
+Dit is waarschijnlijk te laag.
+De installatie kan mislukken!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] is op dit moment geïnstalleerd',
+ 'config-apc' => '[http://www.php.net/apc APC] is op dit moment geïnstalleerd',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] is op dit moment geïnstalleerd',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd',
+ 'config-no-cache' => "'''Waarschuwing:''' [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC] of [http://trac.lighttpd.net/ xcache / XCache] is niet aangetroffen.
+Het cachen van objecten is niet ingeschakeld.",
+ 'config-diff3-bad' => 'GNU diff3 niet aangetroffen.',
+ 'config-imagemagick' => 'ImageMagick aangetroffen: <code>$1</code>.
+Het aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als u uploaden inschakelt.',
+ 'config-gd' => 'Ingebouwde GD grafische bibliotheek aangetroffen.
+Het aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als u uploaden inschakelt.',
+ 'config-no-scaling' => 'De GD-bibliotheek en ImageMagick zijn niet aangetroffen.
+Het maken van miniaturen van afbeeldingen wordt uitgeschakeld.',
+ 'config-no-uri' => "'''Fout:''' de huidige URI kon niet vastgesteld worden.
+De installatie is afgebroken.",
+ 'config-uploads-not-safe' => "'''Waarschuwing:''' uw uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.
+Hoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [http://www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
+ 'config-brokenlibxml' => 'Uw systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.
+Upgrade naar PHP 5.2.9 of hoger en libxml2 2.7.3 of hoger! De installatie wordt afgebroken ([http://bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).',
+ 'config-using531' => 'PHP $1 is niet compatibel met MediaWiki vanwege een fout met betrekking tot referentieparameters met <code>__call()</code>.
+Werk uw PHP bij naar PHP 5.3.2 of hoger of werk bij naar de lagere versie PHP 5.3.0 om dit op te lossen.
+De installatie wordt afgebroken.',
+ 'config-db-type' => 'Databasetype:',
+ 'config-db-host' => 'Databasehost:',
+ 'config-db-host-help' => 'Als uw databaseserver een andere server is, voer dan de hostnaam of het IP-adres hier in.
+
+Als u gebruik maakt van gedeelde webhosting, hoort uw provider u de juiste hostnaam te hebben verstrekt.
+
+Als u MediaWiki op een Windowsserver installeert en MySQL gebruikt, dan werkt "localhost" mogelijk niet als servernaam.
+Als het inderdaad niet werkt, probeer dan "127.0.0.1" te gebruiken als lokaal IP-adres.',
+ 'config-db-host-oracle' => 'Database-TNS:',
+ 'config-db-host-oracle-help' => 'Voer een geldige [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] in; een tnsnames.ora-bestand moet zichtbaar zijn voor deze installatie.<br />Als u gebruik maakt van clientlibraries 10g of een latere versie, kunt u ook gebruik maken van de naamgevingsmethode [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identificeer deze wiki',
+ 'config-db-name' => 'Databasenaam:',
+ 'config-db-name-help' => 'Kies een naam die uw wiki identificeert.
+Er mogen geen spaties gebruikt worden.
+Als u gebruik maakt van gedeelde webhosting, dan hoort uw provider ofwel u een te gebruiken databasenaam gegeven te hebben, of u aangegeven te hebben hoe u databases kunt aanmaken.',
+ 'config-db-name-oracle' => 'Databaseschema:',
+ 'config-db-account-oracle-warn' => 'Er zijn drie ondersteunde scenario\'s voor het installeren van Oracle als databasebackend:
+
+Als u een databasegebruiker wilt aanmaken als onderdeel van het installatieproces, geef dan de gegevens op van een databasegebruiker in met de rol SYSDBA voor de installatie en voer de gewenste aanmeldgegevens in voor de gebruiker met webtoegang. U kunt ook de gebruiker met webtoegang handmatig aanmaken en alleen van die gebruiker de aanmeldgegevens opgeven als deze de vereiste rechten heeft om schemaobjecten aan te maken. Als laatste is het mogelijk om aanmeldgegevens van twee verschillende gebruikers op te geven; een met de rechten om schemaobjecten aan te maken, en een met alleen webtoegang.
+
+Een script voor het aanmaken van een gebruiker met de vereiste rechten is te vinden in de map "maintenance/oracle/" van deze installatie. Onthoud dat het gebruiken van een gebruiker met beperkte rechten alle mogelijkheden om beheerscripts uit te voeren met de standaard gebruiker onmogelijk maakt.',
+ 'config-db-install-account' => 'Gebruiker voor installatie',
+ 'config-db-username' => 'Gebruikersnaam voor database:',
+ 'config-db-password' => 'Wachtwoord voor database:',
+ 'config-db-password-empty' => 'Voer een wachtwoord in voor de nieuwe databasegebruiker: $1.
+Hoewel het wellicht mogelijk is gebruikers aan te maken zonder wachtwoord, is dit niet veilig.',
+ 'config-db-install-username' => 'Voer de gebruikersnaam in die gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet de gebruikersnaam van de MediaWikigebruiker. Dit is de gebruikersnaam voor de database.',
+ 'config-db-install-password' => 'Voer het wachtwoord in dat gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet het wachtwoord van de MediaWikigebruiker. Dit is het wachtwoord voor de database.',
+ 'config-db-install-help' => 'Voer de gebruikersnaam en het wachtwoord in die worden gebruikt voor de databaseverbinding tijdens het installatieproces.',
+ 'config-db-account-lock' => 'Dezelfde gebruiker en wachwoord gebruiken na de installatie',
+ 'config-db-wiki-account' => 'Gebruiker voor na de installatie',
+ 'config-db-wiki-help' => 'Selecteer de gebruikersnaam en het wachtwoord die gebruikt worden om verbinding te maken met de database na de installatie.
+Als de gebruiker niet bestaat en de gebruiker die tijdens de installatie gebruikt wordt voldoende rechten heeft, wordt deze gebruiker aangemaakt met de minimaal benodigde rechten voor het laten werken van de wiki.',
+ 'config-db-prefix' => 'Databasetabelvoorvoegsel:',
+ 'config-db-prefix-help' => "Als u een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere applicatie, dan kunt u ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.
+Gebruik geen spaties.
+
+Dit veld wordt meestal leeg gelaten.",
+ 'config-db-charset' => 'Tekenset voor de database',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binair',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 UTF-8-compatibel',
+ 'config-charset-help' => "'''Waarschuwing:''' als u '''achterwaarts compatibel met UTF-8''' gebruikt met MySQL 4.1+ en een back-up van de database maakt met <code>mysqldump</code>, dan kunnen alle niet-ASCII-tekens in uw back-ups onherstelbaar beschadigd raken.
+
+In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.
+Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledige reeks Unicode-tekens te gebruiken.
+In '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.
+Het is dat niet mogelijk tekens op te slaan die de \"[http://nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
+ 'config-mysql-old' => 'U moet MySQL $1 of later gebruiken.
+U gebruikt $2.',
+ 'config-db-port' => 'Databasepoort:',
+ 'config-db-schema' => 'Schema voor MediaWiki',
+ 'config-db-schema-help' => 'Dit schema klopt meestal.
+Wijzig het alleen als u weet dat dit nodig is.',
+ 'config-sqlite-dir' => 'Gegevensmap voor SQLite:',
+ 'config-sqlite-dir-help' => "SQLite slaat alle gegevens op in een enkel bestand.
+
+De map die u opgeeft moet schrijfbaar zijn voor de webserver tijdens de installatie.
+
+Deze mag '''niet toegankelijk''' zijn via het web en het bestand mag dus niet tussen de PHP-bestanden staan.
+
+Het installatieprogramma schrijft het bestand <code>.htaccess</code> weg met het databasebestand, maar als dat niet werkt kan iemand zich toegang tot het ruwe databasebestand verschaffen.
+Ook de gebruikersgegevens (e-mailsadressen, wachtwoordhashes) en verwijderde versies en overige gegevens met beperkte toegang via MediaWiki zijn dan onbeschermd.
+
+Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld in <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Standaard tablespace:',
+ 'config-oracle-temp-ts' => 'Tijdelijke tablespace:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki ondersteunt de volgende databasesystemen:
+
+$1
+
+Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.',
+ 'config-support-mysql' => '* $1 is het primaire databasesysteem voor voor MediaWiki en wordt het best ondersteund ([http://www.php.net/manual/en/mysql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor MySQL])',
+ 'config-support-postgres' => '* $1 is een populair open source databasesysteem als alternatief voor MySQL ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL])',
+ 'config-support-sqlite' => '* $1 is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)',
+ 'config-support-oracle' => '* $1 is een commerciële data voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).',
+ 'config-header-mysql' => 'MySQL-instellingen',
+ 'config-header-postgres' => 'PostgreSQL-instellingen',
+ 'config-header-sqlite' => 'SQLite-instellingen',
+ 'config-header-oracle' => 'Oracle-instellingen',
+ 'config-invalid-db-type' => 'Ongeldig databasetype',
+ 'config-missing-db-name' => 'U moet een waarde ingeven voor "Databasenaam"',
+ 'config-missing-db-host' => 'U moet een waarde invoeren voor "Databaseserver"',
+ 'config-missing-db-server-oracle' => 'U moet een waarde voor "Database-TNS" ingeven',
+ 'config-invalid-db-server-oracle' => 'Ongeldige database-TMS "$1".
+Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
+ 'config-invalid-db-name' => 'Ongeldige databasenaam "$1".
+Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).',
+ 'config-invalid-db-prefix' => 'Ongeldig databasevoorvoegsel "$1".
+Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).',
+ 'config-connection-error' => '$1.
+
+Controleer de host, gebruikersnaam en wachtwoord hieronder in en probeer het opnieuw.',
+ 'config-invalid-schema' => 'Ongeldig schema voor MediaWiki "$1".
+Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
+ 'config-db-sys-create-oracle' => 'Het installatieprogramma biedt alleen de mogelijkheid een nieuwe gebruiker aan te maken met de SYSDBA-gebruiker.',
+ 'config-db-sys-user-exists-oracle' => 'De gebruiker "$1" bestaat al. SYSDBA kan alleen gebruikt worden voor het aanmaken van een nieuwe gebruiker!',
+ 'config-postgres-old' => 'PostgreSQL $1 of hoger is vereist.
+U gebruikt $2.',
+ 'config-sqlite-name-help' => 'Kies een naam die uw wiki identificeert.
+Gebruik geen spaties of koppeltekens.
+Deze naam wordt gebruikt voor het gegevensbestands van SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Het was niet mogelijk de gegevensmap <code><nowiki>$1</nowiki></code> te maken omdat in de bovenliggende map <code><nowiki>$2</nowiki></code> niet geschreven mag worden door de webserver.
+
+Het installatieprogramma heeft vast kunnen stellen onder welke gebruiker de webserver draait.
+Maak de map <code><nowiki>$3</nowiki></code> beschrijfbaar om door te kunnen gaan.
+Voer op een Linux-systeem de volgende opdrachten uit:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Het was niet mogelijk de gegevensmap <code><nowiki>$1</nowiki></code> te maken omdat in de bovenliggende map <code><nowiki>$2</nowiki></code> niet geschreven mag worden door de webserver.
+
+Het installatieprogramma heeft niet vast kunnen stellen onder welke gebruiker de webserver draait.
+Maak de map <code><nowiki>$3</nowiki></code> beschrijfbaar voor de webserver (en anderen!) om door te kunnen gaan.
+Voer op een Linux-systeem de volgende opdrachten uit:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Er is een fout opgetreden bij het aanmaken van de gegevensmap "$1".
+Controleer de locatie en probeer het opnieuw.',
+ 'config-sqlite-dir-unwritable' => 'Het was niet mogelijk in de map "$1" te schrijven.
+Wijzig de rechten zodat de webserver erin kan schrijven en probeer het opnieuw.',
+ 'config-sqlite-connection-error' => '$1.
+
+Controleer de map voor gegevens en de databasenaam hieronder en probeer het opnieuw.',
+ 'config-sqlite-readonly' => 'Het bestand <code>$1</code> kan niet geschreven worden.',
+ 'config-sqlite-cant-create-db' => 'Het was niet mogelijk het databasebestand <code>$1</code> aan te maken.',
+ 'config-sqlite-fts3-downgrade' => 'PHP heeft geen ondersteuning voor FTS3.
+De tabellen worden gedowngrade.',
+ 'config-can-upgrade' => "Er staan al tabellen voor MediaWiki in deze database.
+Klik op '''Doorgaan''' om ze bij te werken naar MediaWiki $1.",
+ 'config-upgrade-done' => "Het bijwerken is afgerond.
+
+Uw kunt [$1 uw wiki nu gebruiken].
+
+Als u uw <code>LocalSettings.php</code> opnieuw wilt aanmaken, klik dan op de knop hieronder.
+Dit is '''niet aan te raden''' tenzij u problemen hebt met uw wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
+
+U kunt u [$1 uw wiki gebruiken].',
+ 'config-regenerate' => 'LocalSettings.php opnieuw aanmaken →',
+ 'config-show-table-status' => 'Het uitvoeren van SHOW TABLE STATUS is mislukt!',
+ 'config-unknown-collation' => "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
+ 'config-db-web-account' => 'Databasegebruiker voor webtoegang',
+ 'config-db-web-help' => 'Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.',
+ 'config-db-web-account-same' => 'Dezelfde gebruiker gebruiken als voor de installatie',
+ 'config-db-web-create' => 'Maak de gebruiker aan als deze nog niet bestaat',
+ 'config-db-web-no-create-privs' => 'De gebruiker die u hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.
+De gebruiker die u hier opgeeft moet al bestaan.',
+ 'config-mysql-engine' => 'Opslagmethode:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.
+
+'''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.
+MyISAM-databases raken vaker corrupt dan InnoDB-databases.",
+ 'config-mysql-charset' => 'Tekenset voor de database:',
+ 'config-mysql-binary' => 'Binair',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.
+Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledige reeks Unicode-tekens te gebruiken.
+
+In '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.
+Het is dat niet mogelijk tekens op te slaan die de \"[http://nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
+ 'config-site-name' => 'Naam van de wiki:',
+ 'config-site-name-help' => 'Deze naam verschijnt in de titelbalk van browsers en op andere plaatsen.',
+ 'config-site-name-blank' => 'Geef een naam op voor de site.',
+ 'config-project-namespace' => 'Projectnaamruimte:',
+ 'config-ns-generic' => 'Project',
+ 'config-ns-site-name' => 'Zelfde als de wiki: $1',
+ 'config-ns-other' => 'Andere (geen aan welke)',
+ 'config-ns-other-default' => 'MijnWiki',
+ 'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt aangeven.
+Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
+ 'config-ns-invalid' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
+Geef een andere naamruimte op.',
+ 'config-ns-conflict' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
+Geef een andere naam op voor de projectnaamruimte.',
+ 'config-admin-box' => 'Beheerdersgebruiker',
+ 'config-admin-name' => 'Uw naam:',
+ 'config-admin-password' => 'Wachtwoord:',
+ 'config-admin-password-confirm' => 'Wachtwoord opnieuw:',
+ 'config-admin-help' => 'Voer de gebruikersnaam hier in, bijvoorbeeld "Jan Jansen".
+Dit is de naam die wordt gebruikt om aan de melden bij de wiki.',
+ 'config-admin-name-blank' => 'Geef een gebruikersnaam op voor de beheerder.',
+ 'config-admin-name-invalid' => 'De opgegeven gebruikersnaam "<nowiki>$1</nowiki>" is ongeldig.
+Kies een andere gebruikersnaam.',
+ 'config-admin-password-blank' => 'Voer een wachtwoord voor de beheerder in.',
+ 'config-admin-password-same' => 'Het wachtwoord mag niet hetzelfde zijn als de gebruikersnaam.',
+ 'config-admin-password-mismatch' => 'De twee door u ingevoerde wachtwoorden komen niet overeen.',
+ 'config-admin-email' => 'E-mailadres:',
+ 'config-admin-email-help' => "Voer hier een e-mailadres in om e-mail te kunnen ontvangen van andere gebruikers op de wiki, uw wachtwoord opnieuw in te kunnen stellen en op de hoogte te worden gehouden van wijzigingen van pagina's op uw volglijst.",
+ 'config-admin-error-user' => 'Interne fout bij het aanmaken van een beheerder met de naam "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Interne fout bij het instellen van een wachtwoord voor de bejeerder "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'U hebt een ongeldig e-mailadres opgegeven',
+ 'config-subscribe' => 'Abonneren op de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailinglijst releaseaankondigen].',
+ 'config-subscribe-help' => 'Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.
+Abonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.',
+ 'config-almost-done' => 'U bent bijna klaar!
+Als u wilt kunt u de overige instellingen overslaan en de wiki nu installeren.',
+ 'config-optional-continue' => 'Stel me meer vragen.',
+ 'config-optional-skip' => 'Laat dat maar, installeer gewoon de wiki.',
+ 'config-profile' => 'Gebruikersrechtenprofiel:',
+ 'config-profile-wiki' => 'Traditionele wiki',
+ 'config-profile-no-anon' => 'Gebruiker aanmaken verplicht',
+ 'config-profile-fishbowl' => 'Alleen voor geautoriseerde bewerkers',
+ 'config-profile-private' => 'Privéwiki',
+ 'config-profile-help' => "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.
+In MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.
+
+Daarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.
+Daarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:
+
+Een '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.
+Een wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.
+
+Het scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.
+In een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.
+
+Meer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [http://www.mediawiki.org/wiki/Manual:User_rights handleiding].",
+ 'config-license' => 'Auteursrechten en licentie:',
+ 'config-license-none' => 'Geen licentie in de voettekst',
+ 'config-license-cc-by-sa' => 'Creative Commons Naamsvermelding-Gelijk delen',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Naamsvermelding-Niet Commercieel-Gelijk delen',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 of hoger',
+ 'config-license-pd' => 'Publiek domein',
+ 'config-license-cc-choose' => 'Een Creative Commons-licentie selecteren',
+ 'config-license-help' => "In veel openbare wiki's zijn alle bijdragen beschikbaar onder een [http://freedomdefined.org/Definition vrije licentie].
+Dit helpt bij het creëren van een gevoel van gemeenschappelijk eigendom en stimuleert bijdragen op lange termijn.
+Dit is over het algemeen niet nodig is voor een particuliere of zakelijke wiki.
+
+Als u teksten uit Wikipedia wilt kunnen gebruiken en u wilt het mogelijk maken teksten uit uw wiki naar Wikipedia te kopiëren, kies dan de licentie '''Creative Commons Naamsvermelding-Gelijk delen'''.
+
+De GNU Free Documentation License was de oude licentie voor inhoud uit Wikipedia.
+Dit is nog steeds een geldige licentie, maar deze licentie heeft een aantal eigenschappen die hergebruik en interpretatie lastig kunnen maken.",
+ 'config-email-settings' => 'E-mailinstellingen',
+ 'config-enable-email' => 'Uitgaande e-mail inschakelen',
+ 'config-enable-email-help' => "Als u wilt dat e-mailen mogelijk is, dan moeten [http://www.php.net/manual/en/mail.configuration.php PHP's e-mailinstellingen] correct zijn.
+Als u niet wilt dat e-mailen mogelijk is, dan kunt u de instellingen hier uitschakelen.",
+ 'config-email-user' => 'E-mail tussen gebruikers inschakelen',
+ 'config-email-user-help' => 'Gebruikers toestaan e-mail aan elkaar te verzenden als dit in de voorkeuren is ingesteld.',
+ 'config-email-usertalk' => 'Gebruikersoverlegnotificatie inschakelen',
+ 'config-email-usertalk-help' => 'Gebruikers toestaan notificaties te ontvangen bij wijzigingen op de eigen overlegpagina als dit in de voorkeuren is ingesteld',
+ 'config-email-watchlist' => 'Volglijstnotificatie inschakelen',
+ 'config-email-watchlist-help' => "Gebruikers toestaan notificaties te ontvangen bij wijzigingen van pagina's op hun volglijst als dit in de voorkeuren is ingesteld",
+ 'config-email-auth' => 'E-mailbevestiging inschakelen',
+ 'config-email-auth-help' => "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die ze per e-mail wordt toegezonden.
+Alleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.
+Het inschakelen van deze instelling is '''aan te raden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
+ 'config-email-sender' => 'E-mailadres voor antwoorden:',
+ 'config-email-sender-help' => 'Voer het e-mailadres in dat u wilt gebruiken als antwoordadres voor uitgaande e-mail.
+Als een e-mail niet bezorgd kan worden, wordt dat op dit e-mailadres gemeld.
+Veel mailservers vereisen dat tenminste het domein bestaat.',
+ 'config-upload-settings' => 'Afbeeldingen en bestanden uploaden',
+ 'config-upload-enable' => 'Uploaden van bestanden inschakelen',
+ 'config-upload-help' => "Het uploaden van bestanden stelt uw server mogelijk bloot aan beveiligingsrisico's.
+Er is meer [http://www.mediawiki.org/wiki/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.
+
+Om het bestandsuploads mogelijk te maken kunt u de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.
+Daarmee wordt deze functie ingeschakeld.",
+ 'config-upload-deleted' => 'Map voor verwijderde bestanden:',
+ 'config-upload-deleted-help' => 'Kies een map waarin verwijderde bestanden gearchiveerd kunnen worden.
+Idealiter is deze map niet via het web te benaderen.',
+ 'config-logo' => 'URL voor logo:',
+ 'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels in de linker bovenhoek.
+Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
+
+Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.',
+ 'config-instantcommons' => 'Instant Commons inschakelen',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [http://commons.wikimedia.org/ Wikimedia Commons].
+Hiervoor heeft MediaWiki toegang nodig tot Internet.
+
+Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s dan Wikimedia Commons is te vinden in de [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos handleiding].',
+ 'config-cc-error' => 'De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.
+Voer de licentie handmatig in.',
+ 'config-cc-again' => 'Opnieuw kiezen...',
+ 'config-cc-not-chosen' => 'Kies alstublieft de Creative Commons-licentie die u wilt gebruiken en klik op "doorgaan".',
+ 'config-advanced-settings' => 'Gevorderde instellingen',
+ 'config-cache-options' => 'Instellingen voor het cachen van objecten:',
+ 'config-cache-help' => 'Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.
+Middelgrote tot grote websites wordt geadviseerd dit in te schakelen en ook kleine sites merken de voordelen.',
+ 'config-cache-none' => 'Niets cachen.
+Er gaat geen functionaliteit verloren, maar dit kan invloed hebben op de snelheid.',
+ 'config-cache-accel' => 'Cachen van objecten via PHP (APC, eAccelerator, XCache of WinCache)',
+ 'config-cache-memcached' => 'Memcached gebruiken (dit vereist aanvullende instellingen)',
+ 'config-memcached-servers' => 'Memcachedservers:',
+ 'config-memcached-help' => 'Lijst met IP-adressen te gebruiken voor Memcached.
+Eén IP-adres per regel met een poortnummer.
+Bijvoorbeeld:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'U hebt Memcached geselecteerd als uw cache, maar u hebt geen servers opgegeven.',
+ 'config-memcache-badip' => 'U hebt een ongeldig IP-adres ingevoerd voor Memcached: $1.',
+ 'config-memcache-noport' => 'U hebt geen poort opgegeven voor de Memcachedserver: $1.
+De standaardpoort is 11211.',
+ 'config-memcache-badport' => 'Poortnummers voor Memcached moeten tussen $1 en $2 liggen.',
+ 'config-extensions' => 'Uitbreidingen',
+ 'config-extensions-help' => 'De bovenstaande uitbreidingen zijn aangetroffen in de map <code>./extensions</code>.
+
+Mogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen nu inschakelen.',
+ 'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
+Ga alstublieft door naar de volgende pagina.",
+ 'config-install-begin' => 'Als u nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
+Als u nog wijzigingen wilt maken, klik dan op "Terug".',
+ 'config-install-step-done' => 'Afgerond',
+ 'config-install-step-failed' => 'Mislukt',
+ 'config-install-extensions' => 'Inclusief uitbreidingen',
+ 'config-install-database' => 'Database inrichten',
+ 'config-install-pg-schema-not-exist' => 'Het schema voor PostgreSQL bestaat niet',
+ 'config-install-pg-schema-failed' => 'Het aanmaken van de tabellen is mislukt.
+Zorg dat de gebruiker "$1" in het schema "$2" mag schrijven.',
+ 'config-install-pg-commit' => 'Wijzigingen worden doorgevoerd',
+ 'config-install-pg-plpgsql' => 'Controle op de taal PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'U moet de taal PL/pgSQL installeren in de database $1',
+ 'config-pg-no-create-privs' => 'De gebruiker die u hebt opgegeven door de installatie heeft niet voldoende rechten om een gebruiker aan te maken.',
+ 'config-install-user' => 'Databasegebruiker aan het aanmaken',
+ 'config-install-user-alreadyexists' => 'Gebruiker "$1" bestaat al',
+ 'config-install-user-create-failed' => 'Het aanmaken van de gebruiker "$1" is mislukt: $2',
+ 'config-install-user-grant-failed' => 'Het geven van rechten aan gebruiker "$1" is mislukt: $2',
+ 'config-install-tables' => 'Tabellen aanmaken',
+ 'config-install-tables-exist' => "'''Waarschuwing''': de MediaWiki-tabellen lijken al te bestaan.
+Het aanmaken wordt overgeslagen.",
+ 'config-install-tables-failed' => "'''Fout''': het aanmaken van een tabel is mislukt met de volgende foutmelding: $1",
+ 'config-install-interwiki' => 'Bezig met het vullen van de interwikitabel',
+ 'config-install-interwiki-list' => 'Het bestand <code>interwiki.list</code> is niet aangetroffen',
+ 'config-install-interwiki-exists' => "'''Waarschuwing''': de interwikitabel heeft al inhoud.
+De standaardlijst wordt overgeslagen.",
+ 'config-install-stats' => 'Statistieken initialiseren',
+ 'config-install-keys' => 'Geheime sleutel aanmaken',
+ 'config-install-sysop' => 'Gebruiker voor beheerder aanmaken',
+ 'config-install-subscribe-fail' => 'Het is niet mogelijk te abonneren op mediawiki-announce',
+ 'config-install-mainpage' => 'Hoofdpagina aanmaken met standaard inhoud',
+ 'config-install-extension-tables' => 'Tabellen voor ingeschakelde uitbreidingen worden aangemaakt',
+ 'config-install-mainpage-failed' => 'Het was niet mogelijk de hoofdpagina in te voegen: $1',
+ 'config-install-done' => "'''Gefeliciteerd!'''
+U hebt MediaWiki met geïnstalleerd.
+
+Het installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.
+Dit bevat al uw instellingen.
+
+U moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten; in dezelfde map als index.php.
+De download moet u automatisch zijn aangeboden.
+
+Als de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande verwijzing te klikken:
+
+$3
+
+'''Let op''': als u dit niet nu doet, dan het is bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.
+
+Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]'''.",
+ 'config-download-localsettings' => 'LocalSettings.php downloaden',
+ 'config-help' => 'hulp',
+);
+
+/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
+ * @author Nghtwlkr
+ */
+$messages['nn'] = array(
+ 'config-your-language' => 'Språket ditt:',
+ 'config-wiki-language' => 'Wikispråk:',
+ 'config-back' => '↠Attende',
+ 'config-continue' => 'Hald fram →',
+ 'config-page-language' => 'Språk',
+ 'config-memory-raised' => 'PHPs <code>memory_limit</code> er $1, auka til $2.',
+ 'config-memory-bad' => "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.
+Dette er sannsynlegvis for lågt.
+Installasjonen kan mislukkast!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] er innstallert',
+ 'config-apc' => '[http://www.php.net/apc APC] er innstallert',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] er innstallert',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] er installert',
+ 'config-db-name' => 'Databasenamn:',
+ 'config-db-username' => 'Databasebrukarnamn:',
+ 'config-db-password' => 'Databasepassord:',
+ 'config-db-charset' => 'Databaseteiknsett',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binær',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 bakoverkompatibel UTF-8',
+ 'config-mysql-old' => 'MySQL $1 eller seinare krevst, du har $2.',
+ 'config-db-port' => 'Databaseport:',
+ 'config-db-schema' => 'Skjema for MediaWiki',
+ 'config-header-mysql' => 'MySQL-innstillingar',
+ 'config-header-postgres' => 'PostgreSQL-innstillingar',
+ 'config-header-sqlite' => 'SQLite-innstillingar',
+ 'config-header-oracle' => 'Oracle-innstillingar',
+ 'config-invalid-db-type' => 'Ugyldig databasetype',
+ 'config-invalid-db-name' => 'Ugyldig databasenamn «$1».
+Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
+ 'config-invalid-db-prefix' => 'Ugyldig databaseprefiks «$1».
+Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
+ 'config-invalid-schema' => 'Ugyldig skjema for MediaWiki «$1».
+Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
+ 'config-postgres-old' => 'PostgreSQL $1 eller seinare krevst, du har $2.',
+ 'config-email-settings' => 'E-postinnstillingar',
+ 'config-logo' => 'Logo-URL:',
+);
+
+/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
+ * @author Jon Harald Søby
+ * @author Nghtwlkr
+ */
+$messages['no'] = array(
+ 'config-desc' => 'Installasjonsprogrammet for MediaWiki',
+ 'config-title' => 'Installasjon av MediaWiki $1',
+ 'config-information' => 'Informasjon',
+ 'config-localsettings-upgrade' => "'''Advarsel''': En <code>LocalSettings.php</code>-fil har blitt oppdaget.
+Programvaren kan oppgraderes.
+Flytt <code>LocalSettings.php</code> til et trygt sted og kjør installasjonsprogrammet på nytt.",
+ 'config-session-error' => 'Feil under oppstart av økt: $1',
+ 'config-session-expired' => 'Dine øktdata ser ut til å ha utløpt.
+Økter er konfigurert for en levetid på $1.
+Du kan øke dette ved å sette <code>session.gc_maxlifetime</code> i php.ini.
+Start installasjonsprosessen på nytt.',
+ 'config-no-session' => 'Dine øktdata ble tapt!
+Sjekk din php.ini og sørg for at <code>session.save_path</code> er satt til en passende mappe.',
+ 'config-your-language' => 'Ditt språk:',
+ 'config-your-language-help' => 'Velg et språk å bruke under installasjonsprosessen.',
+ 'config-wiki-language' => 'Wikispråk:',
+ 'config-wiki-language-help' => 'Velg språket som wikien hovedsakelig vil bli skrevet i.',
+ 'config-back' => '↠Tilbake',
+ 'config-continue' => 'Fortsett →',
+ 'config-page-language' => 'Språk',
+ 'config-page-welcome' => 'Velkommen til MediaWiki!',
+ 'config-page-dbconnect' => 'Koble til database',
+ 'config-page-upgrade' => 'Oppgrader eksisterende innstallasjon',
+ 'config-page-dbsettings' => 'Databaseinnstillinger',
+ 'config-page-name' => 'Navn',
+ 'config-page-options' => 'Valg',
+ 'config-page-install' => 'Innstaller',
+ 'config-page-complete' => 'Ferdig!',
+ 'config-page-restart' => 'Start installasjonen på nytt',
+ 'config-page-readme' => 'Les meg',
+ 'config-page-releasenotes' => 'Utgivelsesnotat',
+ 'config-page-copying' => 'Kopiering',
+ 'config-page-upgradedoc' => 'Oppgradering',
+ 'config-help-restart' => 'Ønsker du å fjerne alle lagrede data som du har skrevet inn og starte installasjonsprosessen på nytt?',
+ 'config-restart' => 'Ja, start på nytt',
+ 'config-welcome' => '=== Miljøsjekker ===
+Grunnleggende sjekker utføres for å se om dette miljøet er egnet for en MediaWiki-installasjon.
+Du bør oppgi resultatene fra disse sjekkene om du trenger hjelp under installasjonen.',
+ 'config-copyright' => "=== Opphavsrett og vilkår ===
+
+$1
+
+MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
+
+Dette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.
+Se GNU General Public License for flere detaljer.
+
+Du skal ha mottatt <doclink href=Copying>en kopi av GNU General Public License</doclink> sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [http://www.gnu.org/copyleft/gpl.html les det på nettet].",
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWiki hjem]
+* [http://www.mediawiki.org/wiki/Help:Contents Brukerguide]
+* [http://www.mediawiki.org/wiki/Manual:Contents Administratorguide]
+* [http://www.mediawiki.org/wiki/Manual:FAQ OSS]',
+ 'config-env-good' => 'Miljøet har blitt sjekket.
+Du kan installere MediaWiki.',
+ 'config-env-bad' => 'Miljøet har blitt sjekket.
+Du kan installere MediaWiki.',
+ 'config-env-php' => 'PHP $1 er innstallert.',
+ 'config-unicode-using-utf8' => 'Bruker Brion Vibbers utf8_normalize.so for Unicode-normalisering.',
+ 'config-unicode-using-intl' => 'Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.',
+ 'config-unicode-pure-php-warning' => "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen.
+Om du kjører et høy trafikksnettsted bør du lese litt om [http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisering].",
+ 'config-unicode-update-warning' => "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.
+Du bør [http://www.mediawiki.org/wiki/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
+ 'config-no-db' => 'Fant ikke en passende databasedriver!',
+ 'config-no-db-help' => 'Du må installere en databasedriver for PHP.
+Følgende databasetyper er støttet: $1.
+
+Om du er på delt tjener, spør din tjenerleverandør om å installere en passende databasedriver.
+Om du kompilerte PHP selv, rekonfigirer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.
+Om du installerte PHP fra en Debian eller Ubuntu-pakke må du også installere modulen php5-mysql.',
+ 'config-no-fts3' => "'''Advarsel''': SQLite er kompilert uten [http://sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
+ 'config-register-globals' => "'''Advarsel: PHPs <code>[http://php.net/register_globals register_globals]</code>-alternativ er aktivert.'''
+'''Deaktiver det om du kan.'''
+MediaWiki vil fungere, men tjeneren din er utsatt for potensielle sikkerhetssårbarheter.",
+ 'config-magic-quotes-runtime' => "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''
+Dette alternativet ødelegger inndata på en uforutsigbar måte.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-magic-quotes-sybase' => "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''
+Dette alternativet ødelegger inndata på en uforutsigbar måte.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-mbstring' => "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''
+Dette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-ze1' => "'''Kritisk: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] er aktiv!'''
+Dette alternativet fører til horrible feil med MediaWiki.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-safe-mode' => "'''Advarsel:''' PHPs [http://www.php.net/features.safe-mode safe mode] er aktiv.
+Det kan føre til problem, spesielt hvis du bruker støtte for filopplastinger og <code>math</code>.",
+ 'config-xml-bad' => 'PHPs XML-modul mangler.
+MediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.
+Hvis du kjører Mandrak, installer pakken php-xml.',
+ 'config-pcre' => 'PCRE-støttemodulen ser ut til å mangle.
+MediaWiki krever funksjonene for de Perl-kompatible regulære uttrykkene for å virke.',
+ 'config-memory-raised' => 'PHPs <code>memory_limit</code> er $1, økt til $2.',
+ 'config-memory-bad' => "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.
+Dette er sannsynligvis for lavt.
+Installasjonen kan mislykkes!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] er innstallert',
+ 'config-apc' => '[http://www.php.net/apc APC] er innstallert',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] er innstallert',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] er installert',
+ 'config-no-cache' => "'''Advarsel:''' Kunne ikke finne [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].
+Objekthurtiglagring er ikke aktivert.",
+ 'config-diff3-bad' => 'GNU diff3 ikke funnet.',
+ 'config-imagemagick' => 'Fant ImageMagick: <code>$1</code>.
+Bildeminiatyrisering vil aktiveres om du aktiverer opplastinger.',
+ 'config-gd' => 'Fant innebygd GD-grafikkbibliotek.
+Bildeminiatyrisering vil aktiveres om du aktiverer opplastinger.',
+ 'config-no-scaling' => 'Kunne ikke finne GD-bibliotek eller ImageMagick.
+Bildeminiatyrisering vil være deaktivert.',
+ 'config-no-uri' => "'''Feil:''' Kunne ikke bestemme gjeldende URI.
+Installasjon avbrutt.",
+ 'config-uploads-not-safe' => "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.
+Selv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [http://www.mediawiki.org/wiki/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
+ 'config-db-type' => 'Databasetype:',
+ 'config-db-host' => 'Databasevert:',
+ 'config-db-host-help' => 'Hvis databasetjeneren er på en annen tjener, skriv inn vertsnavnet eller IP-adressen her.
+
+Hvis du bruker en delt nettvert bør verten din oppgi det korrekte vertsnavnet i deres dokumentasjon.
+
+Hvis du installerer på en Windowstjener og bruker MySQL kan det hende at «localhost» ikke virker som tjenernavnet. Hvis ikke, prøv «127.0.0.1» for den lokale IP-adressen.',
+ 'config-db-host-oracle' => 'Database TNS:',
+ 'config-db-host-oracle-help' => 'Skriv inn et gyldig [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; en tnsnames.ora-fil må være synlig for installasjonsprosessen.<br />Hvis du bruker klientbibliotek 10g eller nyere kan du også bruke navngivingsmetoden [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identifiser denne wikien',
+ 'config-db-name' => 'Databasenavn:',
+ 'config-db-name-help' => 'Velg et navn som identifiserer wikien din.
+Det bør ikke inneholde mellomrom eller bindestreker.
+
+Hvis du bruker en delt nettvert vil verten din enten gi deg et spesifikt databasenavn å bruke, eller la deg opprette databaser via kontrollpanelet.',
+ 'config-db-name-oracle' => 'Databaseskjema:',
+ 'config-db-install-account' => 'Brukerkonto for installasjon',
+ 'config-db-username' => 'Databasebrukernavn:',
+ 'config-db-password' => 'Databasepassord:',
+ 'config-db-install-help' => 'Skriv inn brukernavnet og passordet som vil bli brukt for å koble til databasen under installasjonsprosessen.',
+ 'config-db-account-lock' => 'Bruk det samme brukernavnet og passordet under normal drift',
+ 'config-db-wiki-account' => 'Brukerkonto for normal drift',
+ 'config-db-wiki-help' => 'Skriv inn brukernavnet og passordet som vil bli brukt til å koble til databasen under normal wikidrift.
+Hvis kontoen ikke finnes, og installasjonskontoen har tilstrekkelige privilegier, vil denne brukerkontoen bli opprettet med et minimum av privilegier, tilstrekkelig for å operere wikien.',
+ 'config-db-prefix' => 'Databasetabellprefiks:',
+ 'config-db-prefix-help' => 'Hvis du trenger å dele en database mellom flere wikier, eller mellom MediaWiki og andre nettapplikasjoner, kan du velge å legge til et prefiks til alle tabellnavnene for å unngå konflikter.
+Ikke bruk mellomrom eller bindestreker.
+
+Dette feltet er vanligvis tomt.',
+ 'config-db-charset' => 'Databasetegnsett',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binær',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 bakoverkompatibel UTF-8',
+ 'config-charset-help' => "'''Advarsel:''' Hvis du bruker '''bakoverkompatibel UTF-8''' på MySQL 4.1+, og deretter sikkerhetskopierer databasen med <code>mysqldump</code> kan det ødelegge alle ikke-ASCII tegn og irreversibelt ødelegge dine sikkerhetskopier!
+
+I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.
+Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.
+I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
+men det vil ikke la deg lagre tegn over «[http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
+ 'config-mysql-old' => 'MySQL $1 eller senere kreves, du har $2.',
+ 'config-db-port' => 'Databaseport:',
+ 'config-db-schema' => 'Skjema for MediaWiki',
+ 'config-db-schema-help' => 'Ovennevnte skjema er som regel riktig.
+Bare endre dem hvis du vet at du trenger det.',
+ 'config-sqlite-dir' => 'SQLite datamappe:',
+ 'config-sqlite-dir-help' => "SQLite lagrer alle data i en enkelt fil.
+
+Mappen du oppgir må være skrivbar for nettjeneren under installasjonen.
+
+Den bør '''ikke''' være tilgjengelig fra nettet, dette er grunnen til at vi ikke legger det der PHP-filene dine er.
+
+Installasjonsprogrammet vil skrive en <code>.htaccess</code>-fil sammen med det, men om det mislykkes kan noen få tilgang til din råe database. Dette inkluderer rå brukerdata (e-postadresser, hashede passord) samt slettede revisjoner og andre begrensede data på wikien.
+
+Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Standard tabellrom:',
+ 'config-oracle-temp-ts' => 'Midlertidig tabellrom:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki støtter følgende databasesystem:
+
+$1
+
+Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg instruksjonene det er lenket til over for å aktivere støtte.',
+ 'config-support-mysql' => '* $1 er det primære målet for MediaWiki og er best støttet ([http://www.php.net/manual/en/mysql.installation.php hvordan kompilere PHP med MySQL-støtte])',
+ 'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte])',
+ 'config-support-sqlite' => '* $1 er et lettvekts-databasesystem som er veldig godt støttet. ([http://www.php.net/manual/en/pdo.installation.php hvordan kompilere PHP med SQLite-støtte], bruker PDO)',
+ 'config-support-oracle' => '* $1 er en kommersiell bedriftsdatabase. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])',
+ 'config-header-mysql' => 'MySQL-innstillinger',
+ 'config-header-postgres' => 'PostgreSQL-innstillinger',
+ 'config-header-sqlite' => 'SQLite-innstillinger',
+ 'config-header-oracle' => 'Oracle-innstillinger',
+ 'config-invalid-db-type' => 'Ugyldig databasetype',
+ 'config-missing-db-name' => 'Du må skrive inn en verdi for «Databasenavn»',
+ 'config-missing-db-server-oracle' => 'Du må skrive inn en verdi for «Database TNS»',
+ 'config-invalid-db-server-oracle' => 'Ugyldig database-TNS «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_) og punktum (.).',
+ 'config-invalid-db-name' => 'Ugyldig databasenavn «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_).',
+ 'config-invalid-db-prefix' => 'Ugyldig databaseprefiks «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_).',
+ 'config-connection-error' => '$1.
+
+Sjekk verten, brukernavnet og passordet nedenfor og prøv igjen.',
+ 'config-invalid-schema' => 'Ugyldig skjema for MediaWiki «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_).',
+ 'config-postgres-old' => 'PostgreSQL $1 eller senere kreves, du har $2.',
+ 'config-sqlite-name-help' => 'Velg et navn som identifiserer wikien din.
+Ikke bruk mellomrom eller bindestreker.
+Dette vil bli brukt til SQLite-datafilnavnet.',
+ 'config-sqlite-parent-unwritable-group' => 'Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.
+
+Installasjonsprogrammet har bestemt brukeren nettjeneren din kjører som.
+Gjør <code><nowiki>$3</nowiki></code>-mappen skrivbar for denne for å fortsette.
+På et Unix/Linux-system, gjør:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.
+
+Installasjonsprogrammet kunne ikke bestemme brukeren nettjeneren din kjører som.
+Gjør <code><nowiki>$3</nowiki></code>-mappen globalt skrivbar for denne (og andre!) for å fortsette.
+På et Unix/Linux-system, gjør:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Feil under oppretting av datamappen «$1».
+Sjekk plasseringen og prøv igjen.',
+ 'config-sqlite-dir-unwritable' => 'Kan ikke skrive til mappen «$1».
+Endre dens tilganger slik at nettjeneren kan skrive til den og prøv igjen.',
+ 'config-sqlite-connection-error' => '$1.
+
+Sjekk datamappen og databasenavnet nedenfor og prøv igjen.',
+ 'config-sqlite-readonly' => 'Filen <code>$1</code> er ikke skrivbar.',
+ 'config-sqlite-cant-create-db' => 'Kunne ikke opprette databasefilen <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP mangler FTS3-støtte, nedgraderer tabeller',
+ 'config-can-upgrade' => "Det er MediaWiki-tabeller i denne databasen.
+For å oppgradere dem til MediaWiki $1, klikk '''Fortsett'''.",
+ 'config-upgrade-done' => "Oppgradering fullført.
+
+Du kan nå [$1 begynne å bruke wikien din].
+
+Hvis du ønsker å regenerere <code>LocalSettings.php</code>-filen din, klikk på knappen nedenfor.
+Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
+ 'config-regenerate' => 'Regenerer LocalSettings.php →',
+ 'config-show-table-status' => 'SHOW TABLE STATUS etterspørselen mislyktes!',
+ 'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
+ 'config-db-web-account' => 'Databasekonto for nettilgang',
+ 'config-db-web-help' => 'Velg brukernavnet og passordet som nettjeneren skal bruke for å koble til databasetjeneren under ordinær drift av wikien.',
+ 'config-db-web-account-same' => 'Bruk samme konto som for installasjonen',
+ 'config-db-web-create' => 'Opprett kontoen om den ikke finnes allerede',
+ 'config-db-web-no-create-privs' => 'Kontoen du oppga for installasjonen har ikke nok privilegier til å opprette en konto.
+Kontoen du oppgir her må finnes allerede.',
+ 'config-mysql-engine' => 'Lagringsmotor:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' er nesten alltid det beste alternativet siden den har god støtte for samtidighet («concurrency»).
+
+'''MyISAM''' kan være raskere i enbruker- eller les-bare-installasjoner.
+MyISAM-databaser har en tendens til å bli ødelagt oftere enn InnoDB-databaser.",
+ 'config-mysql-charset' => 'Databasetegnsett:',
+ 'config-mysql-binary' => 'Binær',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.
+Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.
+
+I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
+men det vil ikke la deg lagre tegn over «[http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
+ 'config-site-name' => 'Navn på wiki:',
+ 'config-site-name-help' => 'Dette vil vises i tittellinjen i nettleseren og diverse andre steder.',
+ 'config-site-name-blank' => 'Skriv inn et nettstedsnavn.',
+ 'config-project-namespace' => 'Prosjektnavnerom:',
+ 'config-ns-generic' => 'Prosjekt',
+ 'config-ns-site-name' => 'Samme som wikinavnet: $1',
+ 'config-ns-other' => 'Annet (spesifiser)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => "Etter Wikipedias eksempel holder mange wikier deres sider med retningslinjer atskilt fra sine innholdssider, i et «'''prosjektnavnerom'''».
+Alle sidetitler i dette navnerommet starter med et gitt prefiks som du kan angi her.
+Tradisjonelt er dette prefikset avledet fra navnet på wikien, men det kan ikke innholde punkttegn som «#» eller «:».",
+ 'config-ns-invalid' => 'Det angitte navnerommet «<nowiki>$1</nowiki>» er ugyldig.
+Angi et annet prosjektnavnerom.',
+ 'config-admin-box' => 'Administratorkonto',
+ 'config-admin-name' => 'Ditt navn:',
+ 'config-admin-password' => 'Passord:',
+ 'config-admin-password-confirm' => 'Passord igjen:',
+ 'config-admin-help' => 'Skriv inn ditt ønskede brukernavn her, for eksempel «Joe Bloggs».
+Dette er navnet du vil bruke for å logge inn på denne wikien.',
+ 'config-admin-name-blank' => 'Skriv inn et administratorbrukernavn.',
+ 'config-admin-name-invalid' => 'Det angitte brukernavnet «<nowiki>$1</nowiki>» er ugyldig.
+Angi et annet brukernavn.',
+ 'config-admin-password-blank' => 'Skriv inn et passord for administratorkontoen.',
+ 'config-admin-password-same' => 'Passordet skal ikke være det samme som brukernavnet.',
+ 'config-admin-password-mismatch' => 'De to passordene du skrev inn samsvarte ikke.',
+ 'config-admin-email' => 'E-postadresse:',
+ 'config-admin-email-help' => 'Skriv inn en e-postadresse her for at du skal kunne motta e-post fra andre brukere på wikien, tilbakestille passordet ditt, og bli varslet om endringer på sider på overvåkningslisten din.',
+ 'config-admin-error-user' => 'Intern feil ved opprettelse av en admin med navnet «<nowiki>$1</nowiki>».',
+ 'config-admin-error-password' => 'Intern feil ved opprettelse av passord for admin «<nowiki>$1</nowiki>»: <pre>$2</pre>',
+ 'config-subscribe' => 'Abonner på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlisten for utgivelsesannonseringer].',
+ 'config-subscribe-help' => 'Dette er en lav-volums e-postliste brukt til utgivelsesannonseringer, herunder viktige sikkerhetsannonseringer.
+Du bør abonnere på den og oppdatere MediaWikiinstallasjonen din når nye versjoner kommer ut.',
+ 'config-almost-done' => 'Du er nesten ferdig!
+Du kan hoppe over de resterende konfigurasjonene og installere wikien nå.',
+ 'config-optional-continue' => 'Spør meg flere spørsmål.',
+ 'config-optional-skip' => 'Jeg er lei, bare installer wikien.',
+ 'config-profile' => 'Brukerrettighetsprofil:',
+ 'config-profile-wiki' => 'Tradisjonell wiki',
+ 'config-profile-no-anon' => 'Kontoopprettelse påkrevd',
+ 'config-profile-fishbowl' => 'Kun autoriserte bidragsytere',
+ 'config-profile-private' => 'Privat wiki',
+ 'config-profile-help' => "Wikier fungerer best når du lar så mange mennesker som mulig redigere den.
+I MediaWiki er det lett å revidere siste endringer og tilbakestille eventuell skade som er gjort av naive eller ondsinnede brukere.
+
+Imidlertid har mange funnet at MediaWiki er nyttig i mange roller, og av og til er det ikke lett å overbevise alle om fordelene med wikimåten.
+SÃ¥ du har valget.
+
+En '''{{int:config-profile-wiki}}''' tillater alle å redigere, selv uten å logge inn.
+En wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men kan avskrekke tilfeldige bidragsytere.
+
+'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.
+En '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, den samme gruppen som får lov til å redigere dem.
+
+Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [http://www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].",
+ 'config-license' => 'Opphavsrett og lisens:',
+ 'config-license-cc-by-sa' => 'Creative Commons Navngivelse Del på samme vilkår',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 eller nyere',
+ 'config-license-pd' => 'Offentlig rom',
+ 'config-license-cc-choose' => 'Velg en egendefinert Creative Commons-lisens',
+ 'config-email-settings' => 'E-postinnstillinger',
+ 'config-enable-email' => 'Aktiver utgående e-post',
+ 'config-enable-email-help' => 'Hvis du vil at e-post skal virke må [http://www.php.net/manual/en/mail.configuration.php PHPs e-postinnstillinger] bli konfigurert riktig.
+Hvis du ikke ønsker noen e-postfunksjoner kan du deaktivere dem her.',
+ 'config-email-user' => 'Aktiver e-post mellom brukere',
+ 'config-email-user-help' => 'Tillat alle brukere å sende hverandre e-post hvis de har aktivert det i deres innstillinger.',
+ 'config-email-usertalk' => 'Aktiver brukerdiskusjonssidevarsler',
+ 'config-email-usertalk-help' => 'Tillat brukere å motta varsler ved endringer på deres brukerdiskusjonsside hvis de har aktivert dette i deres innstillinger.',
+ 'config-email-watchlist' => 'Aktiver overvåkningslistevarsler',
+ 'config-email-watchlist-help' => 'Tillat brukere å motta varsler ved endringer på deres overvåkede sider hvis de har aktivert dette i deres innstillinger.',
+ 'config-email-auth' => 'Aktiver e-postautentisering',
+ 'config-email-auth-help' => "Om dette alternativet er aktivert må brukere bekrefte sin e-postadresse ved å bruke en lenke som blir sendt til dem når de setter eller endrer adressen sin.
+Kun autentiserte e-postadresser kan motta e-post fra andre brukere eller endringsvarsel.
+Å sette dette valget er '''anbefalt''' for offentlige wikier på grunn av potensiell misbruk av e-postfunksjonene.",
+ 'config-email-sender' => 'Svar-e-postadresse:',
+ 'config-email-sender-help' => 'Skriv inn e-postadressen som skal brukes som svar-adresse ved utgående e-post.
+Det er hit returmeldinger vil bli sendt.
+Mange e-posttjenere krever at minst domenenavnet må være gyldig.',
+ 'config-upload-settings' => 'Bilde- og filopplastinger',
+ 'config-upload-enable' => 'Aktiver filopplastinger',
+ 'config-upload-help' => 'Filopplastinger kan potensielt utsette tjeneren din for sikkerhetsrisikoer.
+For mer informasjon, les [http://www.mediawiki.org/wiki/Manual:Security sikkerhetsseksjonen] i manualen.
+
+For å aktivere filopplastinger, endre modusen i <code>images</code>-undermappen i MediaWikis rotmappe slik at nettjeneren kan skrive til den.
+Aktiver så dette alternativet.',
+ 'config-upload-deleted' => 'Mappe for slettede filer:',
+ 'config-upload-deleted-help' => 'Velg en mappe for å arkivere slettede filer.
+Ideelt burde ikke denne være tilgjengelig for nettet.',
+ 'config-logo' => 'Logo-URL:',
+ 'config-logo-help' => 'MediaWikis standarddrakt inkluderer plass til en 135x160 pikslers logo i øvre venstre hjørne.
+Last opp et bilde i passende størrelse og skriv inn nettadressen her.
+
+Hvis du ikke ønsker en logo, la denne boksen være tom.',
+ 'config-instantcommons' => 'Aktiver Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [http://commons.wikimedia.org/ Wikimedia Commons].
+For å gjøre dette krever MediaWiki tilgang til internett.
+
+For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man setter opp dette for andre wikier enn Wikimedia Commons, konsulter [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos manualen].',
+ 'config-cc-again' => 'Velg igjen...',
+ 'config-cc-not-chosen' => 'Velg hvilken Creative Commons-lisens du ønsker og klikk «fortsett».',
+ 'config-advanced-settings' => 'Avansert konfigurasjon',
+ 'config-extensions' => 'Utvidelser',
+ 'config-install-step-done' => 'ferdig',
+ 'config-install-step-failed' => 'mislyktes',
+ 'config-install-extensions' => 'Inkludert utvidelser',
+ 'config-install-database' => 'Setter opp database',
+ 'config-install-user' => 'Oppretter databasebruker',
+ 'config-install-tables' => 'Oppretter tabeller',
+);
+
+/** Polish (Polski)
+ * @author Holek
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'config-desc' => 'Instalator MediaWiki',
+ 'config-title' => 'Instalacja MediaWiki $1',
+ 'config-information' => 'Informacja',
+ 'config-localsettings-upgrade' => 'Plik <code>LocalSettings.php</code> istnieje.
+Aby oprogramowanie zostało zaktualizowane musisz wstawić wartość <code>$wgUpgradeKey</code> w poniższe pole.
+Odnajdziesz jÄ… w LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Wykryto obecność pliku LocalSettings.php.
+Do wykonania aktualizacji instalacji należy dodać opcję --upgrade=yes.',
+ 'config-localsettings-key' => 'Klucz aktualizacji',
+ 'config-localsettings-badkey' => 'Podany klucz jest nieprawidłowy',
+ 'config-upgrade-key-missing' => 'Wykryto zainstalowane wcześniej MediaWiki.
+Jeśli chcesz je zaktualizować dodaj na koniec pliku LocalSettings.php poniższą linię tekstu.
+
+$1',
+ 'config-localsettings-incomplete' => 'IstniejÄ…cy plik LocalSettings.php wyglÄ…da na niekompletny.
+Brak wartości zmiennej $1.
+ZmieÅ„ plik LocalSettings.php, tak by zawieraÅ‚ deklaracjÄ™ wartoÅ›ci tej zmiennej, a nastÄ™pnie kliknij „Dalejâ€.',
+ 'config-localsettings-connection-error' => 'Wystąpił błąd podczas łączenia z bazą danych z wykorzystaniem danych z LocalSettings.php lub AdminSettings.php.
+Popraw ustawienia i spróbuj ponownie.
+
+$1',
+ 'config-session-error' => 'Błąd uruchomienia sesji – $1',
+ 'config-session-expired' => 'Wygląda na to, że Twoja sesja wygasła.
+Czas życia sesji został skonfigurowany na $1.
+Możesz go wydłużyć zmieniając <code>session.gc_maxlifetime</code> w pliku php.ini.
+Uruchom ponownie proces instalacji.',
+ 'config-no-session' => 'Dane sesji zostały utracone.
+Sprawdź plik php.ini i upewnij się, że <code>session.save_path</code> wskazuje na odpowiedni katalog.',
+ 'config-your-language' => 'Język',
+ 'config-your-language-help' => 'Wybierz język używany podczas procesu instalacji.',
+ 'config-wiki-language' => 'Język wiki',
+ 'config-wiki-language-help' => 'Wybierz język, w którym będzie tworzona większość treści wiki',
+ 'config-back' => '↠Wstecz',
+ 'config-continue' => 'Dalej →',
+ 'config-page-language' => 'Język',
+ 'config-page-welcome' => 'Witamy w MediaWiki!',
+ 'config-page-dbconnect' => 'Połączenie z bazą danych',
+ 'config-page-upgrade' => 'Uaktualnienie istniejÄ…cej instalacji',
+ 'config-page-dbsettings' => 'Ustawienia bazy danych',
+ 'config-page-name' => 'Nazwa',
+ 'config-page-options' => 'Opcje',
+ 'config-page-install' => 'Instaluj',
+ 'config-page-complete' => 'Zakończono!',
+ 'config-page-restart' => 'Ponowne uruchomienie instalacji',
+ 'config-page-readme' => 'Podstawowe informacje',
+ 'config-page-releasenotes' => 'Informacje o wersji',
+ 'config-page-copying' => 'Kopiowanie',
+ 'config-page-upgradedoc' => 'Uaktualnienie',
+ 'config-page-existingwiki' => 'IstniejÄ…ca wiki',
+ 'config-help-restart' => 'Czy chcesz usunąć wszystkie zapisane dane, które podałeś i uruchomić ponownie proces instalacji?',
+ 'config-restart' => 'Tak, zacznij od nowa',
+ 'config-welcome' => '=== Sprawdzenie środowiska instalacji ===
+Wykonywane są podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
+Jeśli potrzebujesz pomocy podczas instalacji załącz wyniki tych testów.',
+ 'config-copyright' => "=== Prawa autorskie i warunki użytkowania ===
+
+$1
+
+To oprogramowanie jest wolne; możesz je rozprowadzać dalej i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (według Twojego wyboru) którejś z późniejszych jej wersji.
+
+Niniejsze oprogramowanie jest rozpowszechniane w nadziei, że będzie użyteczne, ale '''bez żadnej gwarancji'''; nawet bez domniemanej gwarancji '''handlowej''' lub '''przydatności do określonego celu'''.
+Zobacz treść licencji GNU General Public License, aby uzyskać więcej szczegółów.
+
+Razem z oprogramowaniem powinieneś otrzymać <doclink href=Copying>kopię licencji GNU General Public License</doclink>. Jeśli jej nie otrzymałeś, napisz do Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. lub [http://www.gnu.org/copyleft/gpl.html przeczytaj ją online].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Strona domowa MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Podręcznik użytkownika]
+* [http://www.mediawiki.org/wiki/Manual:Contents Podręcznik administratora]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Odpowiedzi na często zadawane pytania]
+----
+* <doclink href=Readme>Przeczytaj to</doclink>
+* <doclink href=ReleaseNotes>Informacje o tej wersji</doclink>
+* <doclink href=Copying>Kopiowanie</doclink>
+* <doclink href=UpgradeDoc>Aktualizacja</doclink>',
+ 'config-env-good' => 'Środowisko oprogramowania zostało sprawdzone.
+Możesz teraz zainstalować MediaWiki.',
+ 'config-env-bad' => 'Środowisko oprogramowania zostało sprawdzone.
+Nie możesz zainstalować MediaWiki.',
+ 'config-env-php' => 'Zainstalowane jest PHP w wersji $1.',
+ 'config-unicode-using-utf8' => 'Korzystanie z normalizacji Unicode utf8_normalize.so napisanej przez Brion Vibbera.',
+ 'config-unicode-using-intl' => 'Korzystanie z [http://pecl.php.net/intl rozszerzenia intl PECL] do normalizacji Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Uwaga!''' [http://pecl.php.net/intl Rozszerzenie intl PECL] do obsługi normalizacji Unicode nie jest dostępne. Użyta zostanie mało wydajna zwykła implementacja w PHP.
+Jeśli prowadzisz stronę o dużym natężeniu ruchu, powinieneś zapoznać się z informacjami o [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalizacji Unicode].",
+ 'config-unicode-update-warning' => "'''Uwaga''' – zainstalowana wersja normalizacji Unicode korzysta z nieaktualnej biblioteki [http://site.icu-project.org/ projektu ICU].
+Powinieneś [http://www.mediawiki.org/wiki/Unicode_normalization_considerations zrobić aktualizację] jeśli chcesz korzystać w pełni z Unicode.",
+ 'config-no-db' => 'Nie można odnaleźć właściwego sterownika bazy danych!',
+ 'config-no-db-help' => 'Należy zainstalować sterownik bazy danych dla PHP.
+Obsługiwane są następujące typy baz danych: $1.
+
+Jeżeli korzystasz ze współdzielonego hostingu, zwróć się do administratora o zainstalowanie odpowiedniego sterownika bazy danych.
+Jeśli skompilowałeś PHP samodzielnie, skonfiguruj je ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia
+<code>./configure --with-mysql</code>.
+Jeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować moduł php5-mysql.',
+ 'config-no-fts3' => "'''Uwaga''' – SQLite został skompilowany bez [http://sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.",
+ 'config-register-globals' => "'''Uwaga – w konfiguracji PHP włączona jest opcja <code>[http://php.net/register_globals register_globals]</code>.'''
+'''Jeśli możesz, wyłącz ją.'''
+MediaWiki będzie działać, ale Twój serwer może być narażony potencjalnymi lukami w zabezpieczeniach.",
+ 'config-magic-quotes-runtime' => "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''
+Ta opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.
+Zainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
+ 'config-magic-quotes-sybase' => "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''
+Ta opcja powoduje nieprzewidywalne uszkodzenia wprowadzanych danych.
+Zainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
+ 'config-mbstring' => "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''
+Ta opcja powoduje błędy i może wywołać nieprzewidywalne uszkodzenia wprowadzanych danych.
+Zainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
+ 'config-ze1' => "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''
+Ta opcja powoduje okropne błędy podczas korzystania z MediaWiki.
+Zainstalować lub korzystać z MediaWiki można wyłącznie wtedy, gdy ta opcja jest wyłączona.",
+ 'config-safe-mode' => "'''Ostrzeżenie''' – uaktywniono [http://www.php.net/features.safe-mode tryb awaryjny] PHP.
+Opcja ta może powodować problemy, szczególnie w przypadku korzystania z przesyłania plików i używania znacznika <code>math</code>.",
+ 'config-xml-bad' => 'Brak modułu XML dla PHP.
+MediaWiki wymaga funkcji z tego modułu i nie może działać w tej konfiguracji.
+Jeśli korzystasz z Mandrake, zainstaluj pakiet php-xml.',
+ 'config-pcre' => 'Wygląda na to, że brak modułu PCRE.
+MediaWiki do pracy wymaga funkcji obsługi wyrażeń regularnych kompatybilnej z Perlem.',
+ 'config-pcre-no-utf8' => "'''BÅ‚Ä…d krytyczny''' – wydaje siÄ™, że moduÅ‚ PCRE w PHP zostaÅ‚ skompilowany bez wsparcia dla UTFâ€8.
+MediaWiki wymaga wsparcia dla UTFâ€8 do prawidÅ‚owego dziaÅ‚ania.",
+ 'config-memory-raised' => 'PHP <code>memory_limit</code> było ustawione na $1, zostanie zwiększone do $2.',
+ 'config-memory-bad' => "'''Uwaga:''' PHP <code>memory_limit</code> jest ustawione na $1.
+To jest prawdopodobnie zbyt mało.
+Instalacja może się nie udać!",
+ 'config-xcache' => '[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany',
+ 'config-apc' => '[Http://www.php.net/apc APC] jest zainstalowany',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] jest zainstalowany',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany',
+ 'config-no-cache' => "'''Uwaga:''' Nie można odnaleźć [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] lub [http://www.iis.net/download/WinCacheForPhp WinCache].
+Buforowanie obiektów nie będzie możliwe.",
+ 'config-diff3-bad' => 'Nie znaleziono GNU diff3.',
+ 'config-imagemagick' => 'Odnaleziono ImageMagick <code>$1</code>.
+Miniatury grafik będą generowane jeśli włączysz przesyłanie plików.',
+ 'config-gd' => 'Odnaleziono wbudowanÄ… bibliotekÄ™ graficznÄ… GD.
+Miniatury grafik będą generowane jeśli włączysz przesyłanie plików.',
+ 'config-no-scaling' => 'Nie można odnaleźć biblioteki GD lub ImageMagick.
+Tworzenie miniatur grafik będzie wyłączone.',
+ 'config-no-uri' => "'''Błąd.''' Nie można określić aktualnego URI.
+Instalacja została przerwana.",
+ 'config-uploads-not-safe' => "'''Uwaga''' – domyślny katalog do którego zapisywane są przesyłane pliki <code>$1</code> jest podatny na wykonanie dowolnego skryptu.
+Chociaż MediaWiki sprawdza wszystkie przesłane pliki pod kątem bezpieczeństwa, zaleca się jednak, aby [http://www.mediawiki.org/wiki/Manual:Security#Upload_security zamknąć tę lukę w zabezpieczeniach] przed włączeniem przesyłania plików.",
+ 'config-brokenlibxml' => 'Twój system jest kombinacją wersji PHP i libxml2, które zawierają błędy mogące powodować ukryte uszkodzenia danych w MediaWiki i innych aplikacjach sieci web.
+Wykonaj aktualizację PHP do wersji 5.2.9 lub późniejszej oraz libxml2 do wersji 2.7.3 lub późniejszej ([http://bugs.php.net/bug.php?id=45996 błąd w PHP]).
+Instalacja została przerwana.',
+ 'config-using531' => 'PHP $1 nie współpracuje poprawnie z MediaWiki z powodu błędu dotyczącego referencyjnych argumentów funkcji <code>__call()</code>.
+Uaktualnij do PHP 5.3.2 lub nowszego. Możesz również cofnąć wersję do PHP 5.3.0 aby naprawić ten błąd ([http://bugs.php.net/bug.php?id=50394 błąd w PHP]).
+Instalacja została przerwana.',
+ 'config-db-type' => 'Typ bazy danych',
+ 'config-db-host' => 'Adres serwera bazy danych',
+ 'config-db-host-help' => 'Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.
+
+Jeśli korzystasz ze współdzielonego hostingu, operator serwera powinien podać Ci prawidłową nazwę serwera w swojej dokumentacji.
+
+Jeśli instalujesz oprogramowanie na serwerze Windowsowym i korzystasz z MySQL, użycie „localhost†może nie zadziałać jako nazwa hosta. Jeśli wystąpi ten problem użyj „127.0.0.1†jako lokalnego adresu IP.',
+ 'config-db-host-oracle' => 'TNS bazy danych',
+ 'config-db-host-oracle-help' => 'Wprowadź prawidłową [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nazwę połączenia lokalnego]. Plik „tnsnames.ora†musi być widoczny dla instalatora.<br />Jeśli używasz biblioteki klienckiej 10g lub nowszej możesz również skorzystać z metody nazw [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm łatwego łączenia].',
+ 'config-db-wiki-settings' => 'Zidentyfikuj tÄ™ wiki',
+ 'config-db-name' => 'Nazwa bazy danych',
+ 'config-db-name-help' => 'Wybierz nazwę, która zidentyfikuje Twoją wiki.
+Nie może ona zawierać spacji.
+
+Jeśli korzystasz ze współdzielonego hostingu, dostawca usługi hostingowej może wymagać użycia konkretnej nazwy bazy danych lub pozwalać na tworzenie baz danych za pośrednictwem panelu użytkownika.',
+ 'config-db-name-oracle' => 'Schemat bazy danych',
+ 'config-db-install-account' => 'Konto użytkownika dla instalatora',
+ 'config-db-username' => 'Nazwa użytkownika bazy danych',
+ 'config-db-password' => 'Hasło bazy danych',
+ 'config-db-install-username' => 'Wprowadź nazwę użytkownika, który będzie używany do łączenia się z bazą danych podczas procesu instalacji.
+Nie jest to nazwa konta MediaWiki, a użytkownika bazy danych.',
+ 'config-db-install-password' => 'Wprowadź hasło, które będzie wykorzystywane do łączenia się z bazą danych w procesie instalacji.
+To nie jest hasło konta MediaWiki, lecz hasło do bazy danych.',
+ 'config-db-install-help' => 'Podaj nazwę użytkownika i jego hasło, które zostaną użyte do połączenia z bazą danych w czasie procesu instalacji.',
+ 'config-db-account-lock' => 'Użyj tej samej nazwy użytkownika i hasła w czasie normalnej pracy.',
+ 'config-db-wiki-account' => 'Konto użytkownika do normalnej pracy',
+ 'config-db-prefix' => 'Przedrostek tabel bazy danych',
+ 'config-db-charset' => 'Zestaw znaków bazy danych',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binarny',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 kompatybilny wstecz UTF-8',
+ 'config-mysql-old' => 'Wymagany jest MySQL $1 lub nowszy; korzystasz z $2.',
+ 'config-db-port' => 'Port bazy danych',
+ 'config-db-schema' => 'Schemat dla MediaWiki',
+ 'config-db-schema-help' => 'Ten schemat jest zazwyczaj właściwy.
+Zmień go wyłącznie jeśli jesteś pewien, że powinieneś.',
+ 'config-sqlite-dir' => 'Katalog danych SQLite',
+ 'config-oracle-def-ts' => 'Domyślna przestrzeń tabel',
+ 'config-oracle-temp-ts' => 'Przestrzeń tabel tymczasowych',
+ 'config-support-info' => 'MediaWiki może współpracować z następującymi systemami baz danych:
+
+$1
+
+Jeśli system baz danych, z którego chcesz skorzystać nie jest wymieniony, postępuj zgodnie z instrukcjami aby móc z niego skorzystać.',
+ 'config-support-mysql' => '* $1 jest domyślną bazą danych dla MediaWiki i jest najlepiej wspierane ([http://www.php.net/manual/en/mysql.installation.php jak skompilować PHP ze wsparciem dla MySQL])',
+ 'config-support-postgres' => '* $1 jest popularnym systemem baz danych z otwartym kodem; jest alternatywą dla MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak skompilować PHP ze wsparciem dla PostgreSQL])',
+ 'config-support-sqlite' => '* $1 jest lekkim systemem bazy danych, który jest bardzo dobrze wspierany. ([http://www.php.net/manual/en/pdo.installation.php Jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)',
+ 'config-support-oracle' => '* $1 jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])',
+ 'config-header-mysql' => 'Ustawienia MySQL',
+ 'config-header-postgres' => 'Ustawienia PostgreSQL',
+ 'config-header-sqlite' => 'Ustawienia SQLite',
+ 'config-header-oracle' => 'Ustawienia Oracle',
+ 'config-invalid-db-type' => 'Nieprawidłowy typ bazy danych',
+ 'config-missing-db-name' => 'Należy wpisać wartość w polu „Nazwa bazy danychâ€',
+ 'config-missing-db-host' => 'Musisz wpisać wartość w polu „Serwer bazy danychâ€',
+ 'config-missing-db-server-oracle' => 'Należy wpisać wartość w polu „Baza danych TNSâ€',
+ 'config-invalid-db-server-oracle' => 'NieprawidÅ‚owa baza danych TNS „$1â€.
+Używaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) i kropek (.).',
+ 'config-invalid-db-name' => 'NieprawidÅ‚owa nazwa bazy danych „$1â€.
+Używaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).',
+ 'config-invalid-db-prefix' => 'NieprawidÅ‚owy prefiks bazy danych „$1â€.
+Używaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).',
+ 'config-connection-error' => '$1.
+
+Sprawdź adres serwera, nazwę użytkownika i hasło, a następnie spróbuj ponownie.',
+ 'config-invalid-schema' => 'NieprawidÅ‚owy schemat dla MediaWiki „$1â€.
+Używaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9) i podkreślenia (_).',
+ 'config-postgres-old' => 'Wymagany jest PostgreSQL $1 lub nowszy; korzystasz z $2.',
+ 'config-sqlite-name-help' => 'Wybierz nazwę, która będzie identyfikować Twoją wiki.
+Nie wolno używać spacji ani myślników.
+Zostanie ona użyta jako nazwa pliku danych SQLite.',
+ 'config-sqlite-mkdir-error' => 'BÅ‚Ä…d podczas tworzenia katalogu dla danych „$1â€.
+Sprawdź lokalizację i spróbuj ponownie.',
+ 'config-sqlite-dir-unwritable' => 'Nie można zapisać do katalogu „$1â€.
+Zmień uprawnienia dostępu do katalogu tak, aby serwer WWW mógł pisać do niego, a następnie spróbuj ponownie.',
+ 'config-sqlite-connection-error' => '$1.
+
+Sprawdź katalog danych oraz nazwę bazy danych, a następnie spróbuj ponownie.',
+ 'config-sqlite-readonly' => 'Plik <code>$1</code> nie jest zapisywalny.',
+ 'config-sqlite-cant-create-db' => 'Nie można utworzyć pliku bazy danych <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'Brak wsparcia FTS3 dla PHP. Tabele zostały cofnięte',
+ 'config-can-upgrade' => "W bazie danych są już tabele MediaWiki.
+Aby uaktualnić je do MediaWiki $1, kliknij '''Dalej'''.",
+ 'config-upgrade-done-no-regenerate' => 'Aktualizacja zakończona.
+
+Możesz wreszcie [$1 zacząć korzystać ze swojej wiki].',
+ 'config-regenerate' => 'Ponowne generowanie LocalSettings.php →',
+ 'config-show-table-status' => 'Zapytanie „SHOW TABLE STATUS†nie powiodło się!',
+ 'config-unknown-collation' => "'''Uwaga''' – bazy danych używa nierozpoznanej metody porównywania.",
+ 'config-db-web-account' => 'Konto bazy danych dla dostępu przez WWW',
+ 'config-db-web-help' => 'Wybierz nazwę użytkownika i hasło, z których korzystać będzie serwer WWW do łączenia się z serwerem baz danych, podczas zwykłej pracy z wiki.',
+ 'config-db-web-account-same' => 'Użyj tego samego konta, co dla instalacji',
+ 'config-db-web-create' => 'Utwórz konto, jeśli jeszcze nie istnieje',
+ 'config-db-web-no-create-privs' => 'Konto podane do wykonania instalacji nie ma wystarczających uprawnień, aby utworzyć nowe konto.
+Konto, które wskazałeś tutaj musi już istnieć.',
+ 'config-mysql-engine' => 'Silnik przechowywania',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-charset' => 'Zestaw znaków bazy danych',
+ 'config-mysql-binary' => 'binarny',
+ 'config-mysql-utf8' => 'UTFâ€8',
+ 'config-site-name' => 'Nazwa wiki',
+ 'config-site-name-help' => 'Ten napis pojawi się w pasku tytułowym przeglądarki oraz w różnych innych miejscach.',
+ 'config-site-name-blank' => 'Wprowadź nazwę witryny.',
+ 'config-project-namespace' => 'Przestrzeń nazw projektu',
+ 'config-ns-generic' => 'Projekt',
+ 'config-ns-site-name' => 'Taka sama jak nazwa wiki $1',
+ 'config-ns-other' => 'Inna (należy określić)',
+ 'config-ns-other-default' => 'MojaWiki',
+ 'config-ns-invalid' => 'Podana przestrzeń nazw „<nowiki>$1</nowiki>†jest nieprawidłowa.
+Podaj inną przestrzeń nazw projektu.',
+ 'config-admin-box' => 'Konto administratora',
+ 'config-admin-name' => 'Administrator',
+ 'config-admin-password' => 'Hasło',
+ 'config-admin-password-confirm' => 'Hasło powtórnie',
+ 'config-admin-help' => 'Wprowadź preferowanÄ… nazwÄ™ użytkownika, na przykÅ‚ad „Jan Kowalskiâ€.
+Tej nazwy będziesz używać do logowania się do wiki.',
+ 'config-admin-name-blank' => 'Wpisz nazwę użytkownika, który będzie administratorem.',
+ 'config-admin-name-invalid' => 'Podana nazwa użytkownika „<nowiki>$1</nowiki>†jest nieprawidłowa.
+Podaj innÄ… nazwÄ™.',
+ 'config-admin-password-blank' => 'Wprowadź hasło dla konta administratora.',
+ 'config-admin-password-same' => 'Hasło nie może być takie samo jak nazwa użytkownika.',
+ 'config-admin-password-mismatch' => 'Wprowadzone dwa hasła różnią się między sobą.',
+ 'config-admin-email' => 'Adres eâ€mail',
+ 'config-admin-email-help' => 'Wpisz adres eâ€mail, aby mieć możliwość odbierania eâ€maili od innych użytkowników na wiki, zresetowania hasÅ‚a oraz otrzymywania powiadomieÅ„ o zmianach na stronach z listy obserwowanych.',
+ 'config-admin-error-user' => 'BÅ‚Ä…d wewnÄ™trzny podczas tworzenia konta administratora o nazwie „<nowiki>$1</nowiki>â€.',
+ 'config-admin-error-password' => 'WewnÄ™trzny bÅ‚Ä…d podczas ustawiania hasÅ‚a dla administratora „<nowiki>$1</nowiki>â€: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'WpisaÅ‚eÅ› nieprawidÅ‚owy adres eâ€mail',
+ 'config-subscribe' => 'Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłaszaniami o nowych wersjach].',
+ 'config-subscribe-help' => 'Jest to lista o małej liczbie wiadomości, wykorzystywana do przesyłania informacji o udostępnieniu nowej wersji oraz istotnych sprawach dotyczących bezpieczeństwa.
+Powinieneś zapisać się na tę listę i aktualizować zainstalowane oprogramowanie MediaWiki gdy pojawia się nowa wersja.',
+ 'config-almost-done' => 'To już prawie koniec!
+Możesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.',
+ 'config-optional-continue' => 'Zadaj mi więcej pytań.',
+ 'config-optional-skip' => 'Jestem już znudzony, po prostu zainstaluj wiki.',
+ 'config-profile' => 'Profil uprawnień użytkowników',
+ 'config-profile-wiki' => 'Tradycyjne wiki',
+ 'config-profile-no-anon' => 'Wymagane utworzenie konta',
+ 'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
+ 'config-profile-private' => 'Prywatna wiki',
+ 'config-license' => 'Prawa autorskie i licencja',
+ 'config-license-none' => 'Brak stopki z licencjÄ…',
+ 'config-license-cc-by-sa' => 'Creative Commons – za uznaniem autora, na tych samych zasadach',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons – za uznaniem autora, bez użycia komercyjnego, na tych samych zasadach',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 lub późniejsza',
+ 'config-license-pd' => 'Domena publiczna',
+ 'config-license-cc-choose' => 'Wybierz własną licencję Creative Commons',
+ 'config-email-settings' => 'Ustawienia e-maili',
+ 'config-enable-email' => 'Włącz wychodzące wiadomości e–mail',
+ 'config-email-user' => 'WÅ‚Ä…cz możliwość przesyÅ‚ania eâ€maili pomiÄ™dzy użytkownikami',
+ 'config-email-user-help' => 'Zezwalaj użytkownikom na wysyÅ‚anie wzajemnie eâ€maili, jeÅ›li bÄ™dÄ… mieć wÅ‚Ä…czonÄ… tÄ™ funkcjÄ™ w swoich preferencjach.',
+ 'config-email-usertalk' => 'Włącz powiadamianie o zmianach na stronie dyskusji użytkownika',
+ 'config-email-usertalk-help' => 'Pozwól użytkownikom otrzymywać powiadomienia o zmianach na stronie dyskusji użytkownika, jeśli będą mieć włączoną tę funkcję w swoich preferencjach.',
+ 'config-email-watchlist' => 'WÅ‚Ä…cz powiadomienie o zmianach stron obserwowanych',
+ 'config-email-watchlist-help' => 'Pozwól użytkownikom otrzymywać powiadomienia o zmianach na stronach obserwowanych, jeśli będą mieć włączoną tę funkcję w swoich preferencjach.',
+ 'config-email-auth' => 'WÅ‚Ä…cz uwierzytelnianie eâ€mailem',
+ 'config-email-sender' => 'Zwrotny adres eâ€mail',
+ 'config-upload-settings' => 'Przesyłanie obrazków i plików',
+ 'config-upload-enable' => 'Włącz przesyłanie plików na serwer',
+ 'config-upload-deleted' => 'Katalog dla usuniętych plików',
+ 'config-upload-deleted-help' => 'Wybierz katalog, w którym będzie archiwum usuniętych plików.
+Najlepiej, aby nie był on dostępny z internetu.',
+ 'config-logo' => 'Adres URL logo',
+ 'config-instantcommons' => 'WÅ‚Ä…cz Instant Commons',
+ 'config-cc-error' => 'Wybieranie licencji Creative Commons nie dało wyniku.
+Wpisz nazwę licencji ręcznie.',
+ 'config-cc-again' => 'Wybierz jeszcze raz...',
+ 'config-cc-not-chosen' => 'Wybierz którÄ… chcesz licencjÄ™ Creative Commons i kliknij „Dalejâ€.',
+ 'config-advanced-settings' => 'Konfiguracja zaawansowana',
+ 'config-cache-options' => 'Ustawienia buforowania obiektów',
+ 'config-cache-none' => 'Brak buforowania (wszystkie funkcje będą działać, ale mogą wystąpić kłopoty z wydajnością na dużych witrynach wiki)',
+ 'config-cache-accel' => 'Buforowania obiektów PHP (APC, eAccelerator, XCache lub WinCache)',
+ 'config-cache-memcached' => 'Użyj Memcached (wymaga dodatkowej instalacji i konfiguracji)',
+ 'config-memcached-servers' => 'Serwery Memcached:',
+ 'config-memcached-help' => 'Lista adresów IP do wykorzystania przez Memcached.
+Adresy powinny być umieszczane po jednym w linii i określać również wykorzystywany port. Na przykład:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-extensions' => 'Rozszerzenia',
+ 'config-install-alreadydone' => "'''Uwaga''' – wydaje się, że MediaWiki jest już zainstalowane, a obecnie próbujesz zainstalować je ponownie.
+Przejdź do następnej strony.",
+ 'config-install-step-done' => 'gotowe',
+ 'config-install-step-failed' => 'nieudane',
+ 'config-install-extensions' => 'WÅ‚Ä…cznie z rozszerzeniami',
+ 'config-install-database' => 'Konfigurowanie bazy danych',
+ 'config-install-pg-schema-failed' => 'Utworzenie tabel nie powiodło się.
+Upewnij siÄ™, że użytkownik „$1†może zapisywać do schematu „$2â€.',
+ 'config-install-pg-commit' => 'Zatwierdzanie zmian',
+ 'config-pg-no-plpgsql' => 'Musisz zainstalować język PL/pgSQL w bazie danych $1',
+ 'config-install-user' => 'Tworzenie użytkownika bazy danych',
+ 'config-install-user-grant-failed' => 'Przyznanie uprawnień użytkownikowi „$1†nie powiodło się – $2',
+ 'config-install-tables' => 'Tworzenie tabel',
+ 'config-install-tables-exist' => "'''Uwaga''' – wygląda na to, że tabele MediaWiki już istnieją.
+Pomijam tworzenie tabel.",
+ 'config-install-tables-failed' => "'''Błąd''' – tworzenie tabeli nie powiodło się z powodu błędu – $1",
+ 'config-install-interwiki' => 'Wypełnianie tabeli domyślnymi interwiki',
+ 'config-install-interwiki-list' => 'Nie można odnaleźć pliku <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Uwaga''' – wygląda na to, że tabela interwiki ma już jakieś wpisy.
+Tworzenie domyślnej listy pominięto.",
+ 'config-install-keys' => 'Generowanie tajnego klucza',
+ 'config-install-sysop' => 'Tworzenie konta administratora',
+ 'config-install-subscribe-fail' => 'Nie można zapisać na listę „mediawiki-announce“',
+ 'config-install-mainpage' => 'Tworzenie strony głównej z domyślną zawartością',
+ 'config-install-mainpage-failed' => 'Nie udało się wstawić strony głównej – $1',
+ 'config-download-localsettings' => 'Pobierz LocalSettings.php',
+ 'config-help' => 'pomoc',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Dragonòt
+ * @author Krinkle
+ */
+$messages['pms'] = array(
+ 'config-desc' => "L'instalador për mediaWiki",
+ 'config-title' => 'Anstalassion ëd MediaWiki $1',
+ 'config-information' => 'Anformassion',
+ 'config-localsettings-upgrade' => "A l'é stàit trovà n'archivi <code>LocalSettings.php</code>.
+Për agiorné cost'anstalassion, ch'a anserissa ël valor ëd <code>\$wgUpgradeKey</code> ant la casela sì-sota.
+A la trovrà an LocalSetting.php.",
+ 'config-localsettings-key' => "Ciav d'agiornament:",
+ 'config-session-error' => 'Eror an fasend parte la session: $1',
+ 'config-session-expired' => "Ij sò dat ëd session a smijo scadù.
+Le session a son configurà për na durà ëd $1.
+A peul aumenté sòn an ampostand <code>session.gc_maxlifetime</code> an php.ini.
+Ch'a anandia torna ël process d'instalassion.",
+ 'config-no-session' => "Ij sò dat ëd session a son përdù!
+Ch'a contròla sò php.ini e ch'as sigura che <code>session.save_path</code> a sia ampostà ant ël dossié giust.",
+ 'config-your-language' => 'Toa lenga:',
+ 'config-your-language-help' => "Selessioné na lenga da dovré durant ël process d'instalassion.",
+ 'config-wiki-language' => 'Lenga dla Wiki:',
+ 'config-wiki-language-help' => 'Selession-a la lenga dont la wiki a sarà prevalentement scrivùa.',
+ 'config-back' => '↠André',
+ 'config-continue' => 'Continua →',
+ 'config-page-language' => 'Lenga',
+ 'config-page-welcome' => 'Bin ëvnù a MediaWiki!',
+ 'config-page-dbconnect' => 'Coleghesse a la base ëd dàit',
+ 'config-page-upgrade' => "Agiorné l'instalassion esistenta",
+ 'config-page-dbsettings' => 'Ampostassion dla base ëd dàit',
+ 'config-page-name' => 'Nòm',
+ 'config-page-options' => 'Opsion',
+ 'config-page-install' => 'Instala',
+ 'config-page-complete' => 'Completa!',
+ 'config-page-restart' => "Fé torna parte l'instalassion",
+ 'config-page-readme' => 'Lesme',
+ 'config-page-releasenotes' => 'Nòte ëd publicassion',
+ 'config-page-copying' => 'Copié',
+ 'config-page-upgradedoc' => 'Agiorné',
+ 'config-help-restart' => "Veul-lo scancelé tùit ij dat salvà ch'a l'ha anserì e anandié torna ël process d'instalassion?",
+ 'config-restart' => 'É!, felo torna parte',
+ 'config-welcome' => "=== Contròj d'ambient ===
+Dle verìfiche ëd base a son fàite për vëdde se st'ambient a va bin për l'instalassion ëd MediaWiki.
+S'a l'ha da manca d'agiut durant l'anstalassion, a dovrìa fornì j'arzultà dë sti contròj.",
+ 'config-copyright' => "=== Drit d'Autor e Condission ===
+
+$1
+
+Cost-sì a l'é un programa lìber e a gràtis: a peul ridistribuilo e/o modifichelo sota le condission dla licensa pùblica general GNU com publicà da la Free Software Foundation; la version 2 dla Licensa, o (a toa sèrnìa) qualsëssìa version pi recenta.
+
+Cost programa a l'é distribuì ant la speransa ch'a sia ùtil, ma '''sensa gnun-e garansìe'''; sensa gnanca la garansia implìssita ëd '''comersiabilità''' o '''d'esse adat a un but particolar'''.
+
+A dovrìa avèj arseivù <doclink href=Copying>na còpia ëd la licensa pùblica general GNU</doclink> ansema a sto programa; dësnò, ch'a scriva a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA opura [http://www.gnu.org/copyleft/gpl.html ch'a la lesa an linia].",
+ 'config-sidebar' => "* [http://www.mediawiki.org Intrada MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Guida dl'Utent]
+* [http://www.mediawiki.org/wiki/Manual:Contents Guida dl'Aministrator]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Soens an ciamo]",
+ 'config-env-good' => "L'ambient a l'é stàit controlà.
+It peule instalé MediaWiki.",
+ 'config-env-bad' => "L'ambient a l'é stàit controlà.
+It peule pa instalé MediaWiki.",
+ 'config-env-php' => "PHP $1 a l'é instalà.",
+ 'config-unicode-using-utf8' => 'As deuvra utf8_normalize.so ëd Brion Vibber për la normalisassion Unicode.',
+ 'config-unicode-using-intl' => "As deuvra l'[http://pecl.php.net/intl estension intl PECL] për la normalisassion Unicode.",
+ 'config-unicode-pure-php-warning' => "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.
+S'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalisassion Unicode].",
+ 'config-unicode-update-warning' => "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].
+A dovrìa fé n'[http://www.mediawiki.org/wiki/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
+ 'config-no-db' => 'Impossìbil tové un pilòta ëd base ëd dàit bon!',
+ 'config-no-db-help' => "A dev instalé un pilòta ëd base ëd dàit për PHP.
+A son mantnùe le sòrt ëd base ëd dàit sì-dapress: $1.
+
+S'a l'é ospità ëd fasson partagià, ch'a ciama al fornidor d'ospitalità d'instalé un pilòta ëd base ëd dàit adat.
+S'a l'ha compilà chiel-midem PHP, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.
+S'a l'ha instalà PHP da un pachet Debian o Ubuntu, antlora a dev ëdcò instalé ël mòdul php5-mysql.",
+ 'config-no-fts3' => "'''Avis''': SQLite a l'é compilà sensa ël mòdul [http://sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
+ 'config-register-globals' => "'''Avis: L'opsion <code>[http://php.net/register_globals register_globals]</code> ëd PHP a l'é abilità.'''
+'''Ch'a la disabìlita s'a peul.'''
+MediaWiki a marcërà, ma sò servent a l'é espòst a 'd possìbij vunerabilità ëd sicurëssa.",
+ 'config-magic-quotes-runtime' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] a l'é ativ!'''
+Costa opsion a danegia ij dat d'intrada an manera pa prevedìbil.
+A peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
+ 'config-magic-quotes-sybase' => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] a l'é ativ!'''
+Costa opsion a danegia ij dat d'intrada an manera pa prevedìbil.
+A peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
+ 'config-mbstring' => "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] a l'é ativ!'''
+Costa opsion a càusa d'eror e a peul danegié ij dat d'intrada an manera pa prevedìbil.
+A peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
+ 'config-ze1' => "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] a l'é ativ!'''
+Costa opsion a càusa dij bigat afros con MediaWiki.
+A peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
+ 'config-safe-mode' => "'''Avis:''' [http://www.php.net/features.safe-mode Safe mode] ëd PHP a l'é ativ.
+A peul causé ëd problema, dzortut s'as deuvro ël cariament d'archivi e ël manteniment ëd <code>math</code>.",
+ 'config-xml-bad' => "Mòdul XML ed PHP mancant.
+MediaWiki a l'ha da manca dle funsion an sto mòdul e a travajërà pa an costa configurassion.
+S'a fa giré mandrake, ch'a instala ël pachet php-xml.",
+ 'config-pcre' => "A smija che ël mòdul d'apògg PCRE a sia mancant.
+MediaWiki a l'ha da manca dle funsion d'espression regolar Perl-compatìbij për marcé.",
+ 'config-memory-raised' => "<code>memory_limit</code> ëd PHP a l'é $1, aussà a $2.",
+ 'config-memory-bad' => "'''Avis:''' <code>memory_limit</code> ëd PHP a l'é $1.
+Sossì a l'é probabilment tròp bass.
+L'instalassion a peul falì!",
+ 'config-xcache' => "[http://trac.lighttpd.net/xcache/ XCache] a l'é instalà",
+ 'config-apc' => "[http://www.php.net/apc APC] a l'é instalà",
+ 'config-eaccel' => "[http://eaccelerator.sourceforge.net/ eAccelerator] a l'é instalà",
+ 'config-wincache' => "[http://www.iis.net/download/WinCacheForPhp WinCache] a l'é instalà",
+ 'config-no-cache' => "'''Avis:''' As treuva pa [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache]. Ël buté d'oget an memòria local a l'é pa abilità.",
+ 'config-diff3-bad' => 'GNU diff3 pa trovà.',
+ 'config-imagemagick' => "Trovà ImageMagick: <code>$1</code>.
+La miniaturisassion ëd figure a sarà abilità s'it abìlite le carie.",
+ 'config-gd' => "Trovà la librarìa gràfica antëgrà GD.
+La miniaturisassion ëd figure a sarà abilità s'a abìlita ij cariament.",
+ 'config-no-scaling' => 'As treuva pa la librarìa GD o ImageMagick.
+La miniaturisassion ëd figure a sarà disabilità.',
+ 'config-no-uri' => "'''Eror:''' As peul pa determiné l'URI corenta.
+Instalassion abortìa.",
+ 'config-uploads-not-safe' => "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.
+Bele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [http://www.mediawiki.org/wiki/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
+ 'config-db-type' => 'Sòrt ëd base ëd dàit:',
+ 'config-db-host' => 'Ospitant ëd la base ëd dàit:',
+ 'config-db-host-help' => "Se sò servent ëd base ëd dàit a l'é su un servent diferent, ch'a anseriss ambelessì ël nòm dl'ospitant o l'adrëssa IP.
+
+S'a deuvra n'ospitalità partagià, sò fornidor d'ospitalità a dovrìa deje ël nòm dl'ospitant giust ant soa documentassion.
+
+Se a anstala su un servent Windows e a deuvra MySQL, dovré \"localhost\" a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva \"127.0.0.1\" com adrëssa IP local.",
+ 'config-db-host-oracle' => 'TNS dla base ëd dàit:',
+ 'config-db-host-oracle-help' => "Anserì un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nòm ëd conession local] bon; n'archivi tnsnames.ora a dev esse visìbil da costa anstalassion..<br />S'a deuvra le librarìe cliente 10g o pi neuve a peul ëdcò dovré ël métod ëd nominassion [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+ 'config-db-wiki-settings' => 'Identìfica sta wiki',
+ 'config-db-name' => 'Nòm dla base ëd dàit:',
+ 'config-db-name-help' => "Ch'a serna un nòm ch'a identìfica soa wiki.
+A dovrìa conten-e gnun ëspassi o tratin.
+
+S'a deuvra n'ospitalità partagià, sò fornidor ëd l'ospitalità a-j darà un nòm ëd base ëd dàit specìfich da dovré, o a lassrà ch'a lo crea via un panel ëd contròl.",
+ 'config-db-name-oracle' => 'Schema dla base ëd dàit:',
+ 'config-db-install-account' => "Cont d'utent për l'instalassion.",
+ 'config-db-username' => "Nòm d'utent dla base ëd dàit:",
+ 'config-db-password' => 'Ciav dla base ëd dàit:',
+ 'config-db-install-help' => "Ch'a anserissa lë stranòm d'utent e la ciav che a saran dovrà për coleghesse a la base ëd dàit durant ël process d'instalassion.",
+ 'config-db-account-lock' => "Dovré ij midem stranòm d'utent e ciav durant j'operassion normaj",
+ 'config-db-wiki-account' => "Cont d'utent për j'operassion normaj",
+ 'config-db-wiki-help' => "Ch'a anseriss lë stranòm d'utent e la ciav che a saran dovrà për coleghesse a la base ëd dàit durant j'operassion normaj dla wiki.
+S'ël cont a esist pa, e ël cont d'instalassion a l'ha ij privilegi ch'a-i van, sto cont utent a sarà creà con ij privilegi mìnin për fé marcé la wiki.",
+ 'config-db-prefix' => 'Prefiss dle tàule dla base ëd dàit:',
+ 'config-db-prefix-help' => "S'a l'ha dabzògn ëd partagé na base ëd dàit an tra vàire wiki, o tra MediaWiki e n'àutra aplicassion dl'aragnà, a peul serne ëd gionté un prefiss a tùit ij nòm ëd le tàule për evité ëd conflit.
+Ch'a deuvra ni dë spassi ni ëd tratin.
+
+Cost camp a l'é lassà normalment veuid.",
+ 'config-db-charset' => 'Ansema dij caràter dla base ëd dàit',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binari',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => "MySQL 4.0 compatìbil a l'andaré con UTF-8",
+ 'config-charset-help' => "'''Avis:''' S'a deuvra '''UTF-8 compatìbil a l'andaré''' su MySQL 4.1+, e peui a fa na còpia con <code>mysqldump</code>, a podrìa scancelé tùit ij caràter nen-ASCII, dësbland sensa speranse soe còpie!
+
+An '''manera binaria''', MediaWiki a memorisa ël test UTF-8 an dij camp binari ant la base ëd dàit.
+Sossì a l'é pi eficient che la manera UTF-8 ëd MySQL, e a përmët ëd dovré tut l'ansema ëd caràter Unicode.
+An '''manera UTF-8''', MySQL a arconòss an che ansema ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassrà pa memorisé ij caràter dzora al [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghe ëd base].",
+ 'config-mysql-old' => "A-i é da manca ëd MySQL $1 o pi recent, chiel a l'ha $2.",
+ 'config-db-port' => 'Porta dla base ëd dàit:',
+ 'config-db-schema' => 'Schema për MediaWiki',
+ 'config-db-schema-help' => "Jë schema sì-dzora a son normalment giust.
+Ch'a-j cangia mach s'a sa ch'a n'ha da manca.",
+ 'config-sqlite-dir' => 'Dossié dij dat SQLite:',
+ 'config-sqlite-dir-help' => "SQLite a memorisa tùit ij dat ant n'archivi ùnich.
+
+Ël dossié che chiel a forniss a dev esse scrivìbil dal servent durant l'instalassion.
+
+A dovrìa '''pa''' esse acessìbil da l'aragnà, sossì a l'é për sòn ch'i l'oma pa butalo andova a-i son ij sò file PHP.
+
+L'instalador a scriverà n'archivi <code>.htaccess</code> ansema con chiel, ma se lòn a faliss quaidun a peul intré an soa base ëd dàit originaria.
+Lòn a comprend ij dat brut ëd l'utent (adrëssa ëd pòsta eletrònica, ciav tërbola) e ëdcò le revision scancelà e d'àutri dat segret ëd la wiki.
+
+Ch'a consìdera ëd buté la base ëd dàit tuta antrega da n'àutra part, për esempi an <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Spassi dla tàula dë stàndard:',
+ 'config-oracle-temp-ts' => 'Spassi dla tàula temporani:',
+ 'config-support-info' => "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:
+
+$1
+
+S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré, antlora va andaré a j'istrussion dl'anliura sì-dzora për abilité ël manteniment.",
+ 'config-support-mysql' => "* $1 e l'é l'obietiv primari për MediaWiki e a l'é mej mantnù ([http://www.php.net/manual/en/mysql.installation.php com compilé PHP con ël manteniment MySQL])",
+ 'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL])",
+ 'config-support-sqlite' => "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
+ 'config-support-oracle' => "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
+ 'config-header-mysql' => 'Ampostassion MySQL',
+ 'config-header-postgres' => 'Ampostassion PostgreSQL',
+ 'config-header-sqlite' => 'Ampostassion SQLite',
+ 'config-header-oracle' => 'Ampostassion Oracle',
+ 'config-invalid-db-type' => 'Sòrt ëd ëd base ëd dàit pa bon-a',
+ 'config-missing-db-name' => 'A dev buteje un valor për "Nòm ëd la base ëd dàit"',
+ 'config-missing-db-server-oracle' => 'A dev buteje un valor për "TNS ëd la base ëd dat"',
+ 'config-invalid-db-server-oracle' => 'TNS ëd la base ëd dat pa bon "$1".
+Dovré mach dle litre ASCII (a-z, A-Z), nùmer (0-9), sotlignadure (_) e pontin (.).',
+ 'config-invalid-db-name' => 'Nòm ëd la base ëd dàit pa bon "$1".
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).',
+ 'config-invalid-db-prefix' => 'Prefiss dla base ëd dàit pa bon "$1".
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).',
+ 'config-connection-error' => "$1.
+
+Controla l'ospitant, lë stranòm d'utent e la ciav sì-sota e prové torna.",
+ 'config-invalid-schema' => 'Schema pa bon për MediaWiki "$1".
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).',
+ 'config-postgres-old' => "A-i é da manca ëd PostgreSQL $1 o pi recent, chiel a l'ha $2.",
+ 'config-sqlite-name-help' => "Serne un nòm ch'a identìfica soa wiki.
+Dovré nì dë spassi nì ëd tratin.
+Sòn a sarà dovrà për ël nòm ëd l'archivi ëd dat SQLite.",
+ 'config-sqlite-parent-unwritable-group' => "As peul pa creesse ël dossié ëd dat <code><nowiki>$1</nowiki></code>, përchè ël dossié a mont <code><nowiki>$2</nowiki></code> a l'é pa scrivìbil dal servent.
+
+L'instalador a l'ha determinà sota che utent a gira sò servent.
+Fé an manera che ël dossié <code><nowiki>$3</nowiki></code> a sia scrivìbil da chiel për continué.
+Su un sistema Unix/Linux buté:
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>",
+ 'config-sqlite-parent-unwritable-nogroup' => "As peul pa creesse ël dossié ëd dat <code><nowiki>$1</nowiki></code>, përchè ël dossié a mont <code><nowiki>$2</nowiki></code> a l'é pa scrivìbil dal servent.
+
+L'instalador a peul pa determiné l'utent sota ël qual a gira sò servent.
+Fé an manera che ël dossié <code><nowiki>$3</nowiki></code> a sia scrivìbil globalment da chiel (e da d'àutri) për continué.
+Su un sistema Unix/Linux buté:
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>",
+ 'config-sqlite-mkdir-error' => 'Eror an creand ël dossié ëd dat "$1".
+Ch\'a contròla la locassion e ch\'a preuva torna.',
+ 'config-sqlite-dir-unwritable' => 'As peul pa scrivse an sël dossié "$1".
+Modifiché ij sò përmess an manera che ël servent a peula scrivje ansima, e prové torna.',
+ 'config-sqlite-connection-error' => '$1.
+
+Controlé ël dossié ëd dat e ël nòm ëd la base ëd dàit ambelessì-sota e prové torna.',
+ 'config-sqlite-readonly' => "L'archivi <code>$1</code> a l'é nen scrivìbil.",
+ 'config-sqlite-cant-create-db' => "As peul pa cresse l'archivi ëd base ëd dàit <code>$1</code>.",
+ 'config-sqlite-fts3-downgrade' => "PHP a l'ha pa ël supòrt ëd FTS3, le tàule a son degradà",
+ 'config-can-upgrade' => "A-i é dle tàule MediaWiki an costa base ëd dàit.
+Për agiorneje a MediaWiki $1, ch'a sgnaca su '''Continué'''.",
+ 'config-upgrade-done' => "Agiornament completà.
+
+Adess a peule [$1 ancaminé a dovré soa wiki].
+
+S'a veul generé torna sò archivi <code>LocalSettings.php</code>, ch'a sgnaca ël boton sì-sota.
+Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki.",
+ 'config-regenerate' => 'Generé torna LocalSettings.php →',
+ 'config-show-table-status' => 'Arcesta SHOW TABLE STATUS falìa!',
+ 'config-unknown-collation' => "'''Avis:''' La base ëd dàit a deuvra na classificassion pa arconossùa.",
+ 'config-db-web-account' => "Cont dla base ëd dàit për l'acess a l'aragnà",
+ 'config-db-web-help' => "Ch'a selession-a lë stranòm d'utent e la ciav che ël servent ëd l'aragnà a dovrërà për coleghesse al servent dle base ëd dàit, durant j'operassion ordinarie dla wiki.",
+ 'config-db-web-account-same' => "Ch'a deuvra ël midem cont com për l'istalassion",
+ 'config-db-web-create' => "Crea ël cont se a esist pa anco'",
+ 'config-db-web-no-create-privs' => "Ël cont ch'a l'ha specificà për l'instalassion a l'ha pa basta 'd privilegi për creé un cont.
+Ël cont ch'a spessìfica ambelessì a dev già esiste.",
+ 'config-mysql-engine' => 'Motor ëd memorisassion:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' a l'é scasi sempe la mej opsion, da già ch'a l'ha un bon manteniment dla concorensa.
+
+'''MyISAM''' a peul esse pi lest an instalassion për n'utent sol o mach an letura.
+La base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit InnoDB.",
+ 'config-mysql-charset' => 'Ansem ëd caràter dla base ëd dàit:',
+ 'config-mysql-binary' => 'Binari',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "An '''manera binaria''', MediaWiki a memorisa ël test UTF-8 ant la base ëd dàit an camp binari.
+Sòn a l'é pi eficient che la manera UTF-8 ëd MySQL, e a-j përmët ëd dovré l'ansema antregh ëd caràter Unicode.
+
+An '''manera UTF-8''', MySQL a conossrà an che ansem ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassa pa memorisé ij caràter ëdzora al [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
+ 'config-site-name' => 'Nòm ëd la wiki:',
+ 'config-site-name-help' => "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
+ 'config-site-name-blank' => "Ch'a buta un nòm ëd sit.",
+ 'config-project-namespace' => 'Spassi nominal dël proget:',
+ 'config-ns-generic' => 'Proget',
+ 'config-ns-site-name' => 'Midem com ël nom dla wiki: $1',
+ 'config-ns-other' => 'Àutr (specìfica)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => "Andasend daré a l'esempi ëd Wikipedia, vàire wiki a manten-o soe pàgine ëd regolament separà da soe pàgine ëd contnù, ant në \"'''spassi nominal ëd proget'''\".
+Tùit ij tìtoj ëd pàgina ant cost ëspassi nominal a parto con un sert prefiss, che a peul specifiché ambelessì.
+Tradissionalment, sto prefiss a l'é derivà dal nòm ëd la wiki, ma a peul pa conten-e caràter ëd pontegiatura coma \"#\" o \":\".",
+ 'config-ns-invalid' => 'Lë spassi nominal specificà "<nowiki>$1</nowiki>" a l\'é pa bon.
+Specìfica në spassi nominal ëd proget diferent.',
+ 'config-admin-box' => "Cont ëd l'Aministrator",
+ 'config-admin-name' => 'Tò nòm:',
+ 'config-admin-password' => 'Ciav:',
+ 'config-admin-password-confirm' => 'Buté torna la ciav:',
+ 'config-admin-help' => "Ch'a butà ambelessì tò stranòm d'utent preferì, për esempi \"Gioann Scriv\".
+Cost-sì a l'é lë stranòm ch'a dovrërà për intré ant la wiki.",
+ 'config-admin-name-blank' => "Ch'a anserissa në stranòm d'aministrator.",
+ 'config-admin-name-invalid' => 'Ël nòm utent specificà "<nowiki>$1</nowiki>" a l\'é pa bon.
+Specìfica un nòm utent diferent.',
+ 'config-admin-password-blank' => "Ch'a anserissa na ciav për ël cont d'aministrator.",
+ 'config-admin-password-same' => "La ciav a dev nen esse l'istessa ëd lë stranòm d'utent.",
+ 'config-admin-password-mismatch' => "Le doe ciav che a l'ha scrivù a son diferente antra 'd lor.",
+ 'config-admin-email' => 'Adrëssa ëd pòsta eletrònica:',
+ 'config-admin-email-help' => "Ch'a anserissa ambelessì n'adrëssa ëd pòsta eletrònica për përmëtt-je d'arsèive ëd mëssagi da d'àutri utent an sla wiki, riamposté soa ciav, e esse anformà ëd camgiament a le pàgine ch'a ten sot-euj.",
+ 'config-admin-error-user' => 'Eror antern an creand n\'aministrator con lë stranòm "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Eror antern an ampostand na ciav për l\'admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-subscribe' => "Ch'a sot-scriva la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista ëd discussion ëd j'anonsi ëd publicassion].",
+ 'config-subscribe-help' => "Costa a l'é na lista ëd discussion a bass tràfich dovrà për j'anonsi ëd publicassion, comprèis d'amportant anonsi ëd sicurëssa.
+A dovrìa sot-ëscrivla e agiorné soa instalassion mediaWiki quand che ëd version neuve a rivo.",
+ 'config-almost-done' => "A l'ha bele che fàit!
+A peul adess sauté la configurassion rimanenta e instalé dlongh la wiki.",
+ 'config-optional-continue' => "Ciameme d'àutre chestion.",
+ 'config-optional-skip' => 'I son già anojà, instala mach la wiki.',
+ 'config-profile' => "Profil dij drit d'utent:",
+ 'config-profile-wiki' => 'Wiki tradissional',
+ 'config-profile-no-anon' => 'A venta creé un cont',
+ 'config-profile-fishbowl' => 'Mach editor autorisà',
+ 'config-profile-private' => 'Wiki privà',
+ 'config-profile-help' => "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.
+An MediaWiki, a l'é bel fé revisioné ij cambi recent, e buté andré minca dann che a sia fàit da utent noviss o malissios.
+
+An tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.
+Parèj a l'ha doe possibilità.
+
+Un '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
+Na wiki con '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contribudor casuaj.
+
+Ël senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.
+Un '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.
+
+Configurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [http://www.mediawiki.org/wiki/Manual:User_rights pàgina a pòsta dël manual].",
+ 'config-license' => "Drit d'autor e licensa",
+ 'config-license-none' => 'Gnun-a licensa an nòta an bass',
+ 'config-license-cc-by-sa' => 'Creative Commons atribussion an part uguaj',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons atribussion nen comersial an part uguaj',
+ 'config-license-gfdl-old' => 'Licensa ëd documentassion lìbera GNU 1.2',
+ 'config-license-gfdl-current' => 'Licensa ëd documentassion lìbera GNU 1.3 o pi recenta',
+ 'config-license-pd' => 'Domini Pùblich',
+ 'config-license-cc-choose' => 'Selessioné na licensa Creative Commons përsonalisà',
+ 'config-license-help' => "Vàire wiki pùbliche a buto tute le contribussion sota na [http://freedomdefined.org/Definition licensa lìbera]. Sòn a giuta a creé un sens d'apartenensa a la comunità e a ancoragia ëd contribussion ëd longa durà.
+A l'é generalment nen necessari për na wiki privà o d'asienda.
+
+S'a veul podèj dovré dij test da Wikipedia, e a veul che Wikipedia a aceta dij test copià da soa wiki, a dovrìa serne '''Creative Commons Attribution Share Alike'''.
+
+La GNU Free Documentation License a l'era la veja licensa dont sota a-i era Wikipedia.
+A l'é anco' na licensa bon-a, an tùit ij cas, sta licensa a l'ha chèich funsion ch'a rendo difìcij l'utilisassion e l'antërpretassion.",
+ 'config-email-settings' => 'Ampostassion ëd pòsta eletrònica',
+ 'config-enable-email' => 'Abilité ij mëssagi ëd pòsta eletrònica an surtìa',
+ 'config-enable-email-help' => "S'a veul che la pòsta eletrònica a marcia, j'[http://www.php.net/manual/en/mail.configuration.php ampostassion ëd pòsta eletrònica PHP] a devo esse configurà për da bin.
+S'a veul pa 'd funsion ëd pòsta eletrònica, a dev disabiliteje ambelessì.",
+ 'config-email-user' => 'Abilité ij mëssagi ëd pòsta eletrònica da utent a utent',
+ 'config-email-user-help' => "A përmët a tùit j'utent ëd mandesse ëd mëssagi ëd pòsta eletrònica se lor a l'han abilità sòn an soe preferense.",
+ 'config-email-usertalk' => "Abilité notìfica dle pàgine ëd discussion dj'utent",
+ 'config-email-usertalk-help' => "A përmët a j'utent d'arsèive na notìfica dle modìfiche dle pàgine ëd discussion d'utent, s'a l'han abilitalo ant soe preferense.",
+ 'config-email-watchlist' => "Abilité la notìfica ëd lòn ch'as ten sot euj",
+ 'config-email-watchlist-help' => "A përmët a j'utent d'arsèive dle notificassion a propòsit dle pàgine ch'a ten-o sot euj s'a l'han abilitalo ant soe preferense.",
+ 'config-email-auth' => "Abilité l'autenticassion për pòsta eletrònica",
+ 'config-email-auth-help' => "Se st'opsion a l'é abilità, j'utent a devo confirmé soe adrësse ëd pòsta eletrònica an dovrand un colegament mandà a lor quand ch'a l'han ampostala o cambiala.
+Mach j'adrësse ëd pòsta eletrònica autenticà a peulo arsèive ëd mëssagi da j'àutri utent o cangé adrëssa ëd notìfica.
+Amposté st'opsion a l'é '''arcomandà''' për le wiki pùbliche a càusa ëd possìbij abus ëd le funsion ëd pòsta eletrònica.",
+ 'config-email-sender' => 'Adrëssa ëd pòsta eletrònica ëd ritorn:',
+ 'config-email-sender-help' => "Ch'a anserissa l'adrëssa ëd pòsta eletrònica da dovré com adrëssa d'artorn dij mëssagi an surtìa.
+Ambelessì a l'é andova j'arspòste a saran mandà.
+Motobin ëd servent ëd pòsta a ciamo che almanch la part dël nòm ëd domini a sia bon-a.",
+ 'config-upload-settings' => 'Cariament ëd figure e archivi',
+ 'config-upload-enable' => "Abilité ël cariament d'archivi",
+ 'config-upload-help' => "Carié d'archivi potensialment a espon sò servent a d'arzigh ëd sicurëssa.
+Per pi d'anformassion, ch'a lesa la [http://www.mediawiki.org/wiki/Manual:Security session ëd sicurëssa] d'ës manual.
+
+Për abilité ël cariament d'archivi, ch'a modìfica la manera dël sot-dossié dle <code>figure</code> sota al dossié rèis ëd MediaWiki an manera che ël servent dl'aragnà a peussa scrivlo.
+Peui ch'a abìlita costa opsion.",
+ 'config-upload-deleted' => "Dossié për j'archivi scancelà:",
+ 'config-upload-deleted-help' => "ch'a serna un dossié andova goerné j'archivi scancelà.
+Idealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
+ 'config-logo' => 'Anliura dla marca:',
+ 'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin ant ël canton an àut a snista.
+Ch'a dëscaria na figura ëd la dimension aproprià, e ch'a anserissa l'anliura ambelessì.
+
+S'a veul gnun-e marche, ch'a lassa ës camp bianch.",
+ 'config-instantcommons' => 'Abìlita Instant Commons',
+ 'config-instantcommons-help' => "[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [http://commons.wikimedia.org/ Wikimedia Commons].
+Për dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.
+
+Për pi d'anformassion su sta funsion, comprèise j'istrussion ëd com ampostela për wiki diferente da Wikimedia Commons, ch'a consulta [http://mediawiki.org/wiki/Manual:\$wgForeignFileRepos ël manual].",
+ 'config-cc-error' => "La selession ëd la licensa Creative Commons a l'ha dàit gnun arzultà.
+Ch'a anserissa ël nòm dla licensa a man.",
+ 'config-cc-again' => 'Torna cheuje...',
+ 'config-cc-not-chosen' => 'Sern che licensa Creative Commons it veule e sgnaca "anans".',
+ 'config-advanced-settings' => 'Configurassion avansà',
+ 'config-cache-options' => "Ampostassion për la memorisassion local d'oget:",
+ 'config-cache-help' => "La memorisassion loca d'oget a l'é dovrà për amelioré l'andi ëd MediaWiki an butant an local dij dat dovrà 'd soens.
+Ij sit da mesan a gròss a son motobin ancoragià a abilité sòn, e ij sit cit a l'avran ëdcò dij benefissi.",
+ 'config-cache-none' => "Gnun-a memorisassion local (gnun-a funsionalità gavà, ma l'andi a peul esse anfluensà an sij sit ëd wiki gròsse)",
+ 'config-cache-accel' => "Memorisassion local d'oget PHP (APC, eAccelerator, XCache o WinCache)",
+ 'config-cache-memcached' => "Dovré Memcached (a ciama n'ampostassion e na configurassion adissionaj)",
+ 'config-memcached-servers' => 'Servent Memcached:',
+ 'config-memcached-help' => "Lista d'adrësse IP da dovré për Memcached.
+A dovrìa esse separà con dle vìrgole e specifiché la pòrta da dovré (për esempi: 127.0.0.1:11211, 192.168.1.25:11211).",
+ 'config-extensions' => 'Estension',
+ 'config-extensions-help' => "J'estension listà dì-sota a son ëstàite trovà ant sò dossié <code>./extensions</code>.
+
+A peulo avèj da manca ëd configurassion adissionaj, ma a peul abiliteje adess",
+ 'config-install-alreadydone' => "'''Avis''' A smija ch'a l'abie già instalà MediaWiki e ch'a preuva a instalelo torna.
+Për piasì, ch'a vada a la pàgina ch'a-i ven.",
+ 'config-install-step-done' => 'fàit',
+ 'config-install-step-failed' => 'falì',
+ 'config-install-extensions' => "Comprende j'estension",
+ 'config-install-database' => 'Creassion ëd la base ëd dàit',
+ 'config-install-pg-schema-failed' => 'Creassion dle tàule falìa.
+Sigurte che l\'utent "$1" a peussa scrive lë schema "$2".',
+ 'config-install-user' => "Creassion ëd n'utent ëd la base ëd dàit",
+ 'config-install-user-grant-failed' => 'Falì a dé ij përmess a l\'utent "$1": $2',
+ 'config-install-tables' => 'Creassion dle tàule',
+ 'config-install-tables-exist' => "'''Avis''': A smija che le tàule ëd mediaWiki a esisto già.
+Sauté la creassion.",
+ 'config-install-tables-failed' => "'''Eror''': Creassion ëd le tàule falìa con l'eror sì-dapress: $1",
+ 'config-install-interwiki' => "Ampiniment dë stàndard ëd le tàule dj'anliure interwiki",
+ 'config-install-interwiki-list' => "As peul pa trovesse l'archivi <code>interwiki.list</code>.",
+ 'config-install-interwiki-exists' => "'''Avis''': La tàula interwiki a smija ch'a l'abia già dj'element.
+Për stàndard, la lista a sarà sautà.",
+ 'config-install-keys' => 'Generassion ëd la ciav segreta',
+ 'config-install-sysop' => "Creassion dël cont ëd l'utent aministrator",
+ 'config-install-done' => "'''Congratulassion!'''
+A l'ha instalà për da bin mediaWiki.
+
+L'instalador a l'ha generà n'archivi <code>LocalSettings.php</code>.
+A conten tuta soa configurassion.
+
+A dovrà [$1 dëscarielo] e butelo ant la bas ëd l'instalassion ëd soa wiki (ël midem dossié d'index.php).
+'''Nòta''': S'a lo fa nen adess, cost archivi ëd configurassion generà a sarà pa disponìbil për chiel pi tard s'a chita l'instalassion sensa dëscarielo.
+
+Quand che a l'é stàit fàit, a peul '''[$2 intré an soa wiki]'''.",
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'config-your-language' => 'Ø³ØªØ§Ø³Û Ú˜Ø¨Ù‡:',
+ 'config-wiki-language' => 'د ويکي ژبه:',
+ 'config-page-language' => 'ژبه',
+ 'config-page-welcome' => 'Ù…Ûډياويکي ته ÚšÙ‡ راغلاست!',
+ 'config-page-name' => 'نوم',
+ 'config-page-install' => 'لګول',
+ 'config-page-complete' => 'بشپړ!',
+ 'config-env-php' => 'د $1 PHP نصب شو.',
+);
+
+/** Portuguese (Português)
+ * @author Crazymadlover
+ * @author Hamilton Abreu
+ * @author Platonides
+ * @author SandroHc
+ * @author Waldir
+ */
+$messages['pt'] = array(
+ 'config-desc' => 'O instalador do MediaWiki',
+ 'config-title' => 'Instalação MediaWiki $1',
+ 'config-information' => 'Informação',
+ 'config-localsettings-upgrade' => 'Foi detectado um ficheiro <code>LocalSettings.php</code>.
+Para actualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
+Encontra este valor no LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Foi detectada a existência de um ficheiro LocalSettings.php.
+Para actualizar esta instalação execute o update.php, por favor.',
+ 'config-localsettings-key' => 'Chave de actualização:',
+ 'config-localsettings-badkey' => 'A chave que forneceu está incorreta.',
+ 'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
+Para actualizar esta instalação, por favor coloque a seguinte linha no final do seu LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'O ficheiro LocalSettings.php existente parece estar incompleto.
+A variável $1 não está definida.
+Por favor defina esta variável no LocalSettings.php e clique "Continuar".',
+ 'config-localsettings-connection-error' => 'Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no LocalSettings.php ou AdminSettings.php. Por favor corrija essas configurações e tente novamente.
+
+$1',
+ 'config-session-error' => 'Erro ao iniciar a sessão: $1',
+ 'config-session-expired' => 'Os seus dados de sessão parecem ter expirado.
+As sessões estão configuradas para uma duração de $1.
+Pode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.
+Reinicie o processo de instalação.',
+ 'config-no-session' => 'Os seus dados de sessão foram perdidos!
+Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um directório apropriado.',
+ 'config-your-language' => 'A sua língua:',
+ 'config-your-language-help' => 'Seleccione a língua que será usada durante o processo de instalação.',
+ 'config-wiki-language' => 'Língua da wiki:',
+ 'config-wiki-language-help' => 'Seleccione a língua que será predominante na wiki.',
+ 'config-back' => '↠Voltar',
+ 'config-continue' => 'Continuar →',
+ 'config-page-language' => 'Língua',
+ 'config-page-welcome' => 'Bem-vindo(a) ao MediaWiki!',
+ 'config-page-dbconnect' => 'Ligar à base de dados',
+ 'config-page-upgrade' => 'Actualizar a instalação existente',
+ 'config-page-dbsettings' => 'Configurações da base de dados',
+ 'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opções',
+ 'config-page-install' => 'Instalar',
+ 'config-page-complete' => 'Terminado!',
+ 'config-page-restart' => 'Reiniciar a instalação',
+ 'config-page-readme' => 'Leia-me',
+ 'config-page-releasenotes' => 'Notas de lançamento',
+ 'config-page-copying' => 'A copiar',
+ 'config-page-upgradedoc' => 'A actualizar',
+ 'config-page-existingwiki' => 'Wiki existente',
+ 'config-help-restart' => 'Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?',
+ 'config-restart' => 'Sim, reiniciar',
+ 'config-welcome' => '=== Verificações do ambiente ===
+São realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.
+Se necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.',
+ 'config-copyright' => "=== Direitos de autor e Termos de uso ===
+
+$1
+
+Este programa é 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.
+
+Este programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.
+Consulte a licença GNU General Public License para mais detalhes.
+
+Em conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
+ 'config-sidebar' => '* [http://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents/pt Ajuda]
+* [http://www.mediawiki.org/wiki/Manual:Contents/pt Manual técnico]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Leia-me</doclink>
+* <doclink href=ReleaseNotes>Notas de lançamento</doclink>
+* <doclink href=Copying>Cópia</doclink>
+* <doclink href=UpgradeDoc>Atualização</doclink>',
+ 'config-env-good' => 'O ambiente foi verificado.
+Pode instalar o MediaWiki.',
+ 'config-env-bad' => 'O ambiente foi verificado.
+Não pode instalar o MediaWiki.',
+ 'config-env-php' => 'O PHP $1 está instalado.',
+ 'config-env-php-toolow' => 'O PHP $1 está instalado.
+No entanto, o MediaWiki requer o PHP $2 ou superior.',
+ 'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, por Brian Viper, para a normalização Unicode.',
+ 'config-unicode-using-intl' => 'A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efectuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.
+Se o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [http://www.mediawiki.org/wiki/Unicode_normalization_considerations/pt normalização Unicode].",
+ 'config-unicode-update-warning' => "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projecto ICU].
+Devia [http://www.mediawiki.org/wiki/Unicode_normalization_considerations actualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
+ 'config-no-db' => "Não foi possível encontrar um controlador ''(driver)'' apropriado para a base de dados!",
+ 'config-no-db-help' => "Precisa de instalar um controlador ''(driver)'' de base de dados para o PHP.
+São suportadas as seguintes bases de dados: $1.
+
+Se o seu site está alojado num servidor partilhado, peça ao fornecedor do alojamento para instalar um controlador de base de dados apropriado.
+Se fez a compilação do PHP você mesmo, reconfigure-o com um cliente de base de dados activado, usando, por exemplo, <code>./configure --with-mysql</code>.
+Se instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também o módulo php5-mysql.",
+ 'config-no-fts3' => "'''Aviso''': O SQLite foi compilado sem o módulo [http://sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
+ 'config-register-globals' => "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está activada.'''
+'''Desactive-a, se puder.'''
+O MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
+ 'config-magic-quotes-runtime' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''
+Esta opção causa corrupção dos dados de entrada, de uma forma imprevisível.
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
+ 'config-magic-quotes-sybase' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''
+Esta opção causa corrupção dos dados de entrada, de uma forma imprevisível.
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
+ 'config-mbstring' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''
+Esta opção causa erros e pode corromper os dados de uma forma imprevisível.
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
+ 'config-ze1' => "'''Fatal: A opção [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está activada!'''
+Esta opção causa problemas significativos no MediaWiki.
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
+ 'config-safe-mode' => "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está activo.
+Este modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
+ 'config-xml-bad' => 'Falta o módulo XML do PHP.
+O MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.
+Se está a executar o Mandrake, instale o pacote php-xml.',
+ 'config-pcre' => 'Parece faltar o módulo de suporte PCRE.
+Para funcionar, o MediaWiki necessita das funções de expressões regulares compatíveis com Perl.',
+ 'config-pcre-no-utf8' => "'''Fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.
+O MediaWiki necessita do suporte UTF-8 para funcionar correctamente.",
+ 'config-memory-raised' => 'A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.',
+ 'config-memory-bad' => "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.
+Isto é provavelmente demasiado baixo.
+A instalação poderá falhar!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] instalada',
+ 'config-apc' => '[http://www.php.net/apc APC] instalada',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] instalado',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalada',
+ 'config-no-cache' => "'''Aviso:''' Não foram encontrados [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] nem [http://www.iis.net/download/WinCacheForPhp WinCache].
+A cache de objectos não será activada.",
+ 'config-diff3-bad' => 'O GNU diff3 não foi encontrado.',
+ 'config-imagemagick' => 'Foi encontrado o ImageMagick: <code>$1</code>.
+Se possibilitar uploads, a miniaturização de imagens será activada.',
+ 'config-gd' => 'Foi encontrada a biblioteca gráfica GD.
+Se possibilitar uploads, a miniaturização de imagens será activada.',
+ 'config-no-scaling' => 'Não foi encontrada a biblioteca gráfica GD nem o ImageMagick.
+A miniaturização de imagens será desactivada.',
+ 'config-no-uri' => "'''Erro:''' Não foi possível determinar a URI actual.
+A instalação foi abortada.",
+ 'config-uploads-not-safe' => "'''Aviso:''' O directório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.
+Embora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [http://www.mediawiki.org/wiki/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
+ 'config-brokenlibxml' => 'O seu sistema tem uma combinação de versões de PHP e libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e outras aplicações da internet.
+Actualize para o PHP versão 5.2.9 ou posterior e libxml2 versão 2.7.3 ou posterior ([http://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).
+Instalação interrompida.',
+ 'config-using531' => 'O MediaWiki não pode ser usado com o PHP $1 devido a um problema que envolve parâmetros de referência para <code>__call()</code>.
+Para resolver este problema, actualize o PHP para a versão 5.3.2 ou posterior, ou reverta-o para a 5.3.0.
+Instalação interrompida.',
+ 'config-db-type' => 'Tipo da base de dados:',
+ 'config-db-host' => 'Servidor da base de dados:',
+ 'config-db-host-help' => 'Se a base de dados estiver num servidor separado, introduza aqui o nome ou o endereço IP desse servidor.
+
+Se estiver a usar um servidor partilhado, o fornecedor do alojamento deve ter-lhe fornecido o nome do servidor na documentação.
+
+Se está a fazer a instalação num servidor Windows com MySQL, usar como nome do servidor "localhost" poderá não funcionar. Se não funcionar, tente usar "127.0.0.1" como endereço IP local.',
+ 'config-db-host-oracle' => 'TNS (Transparent Network Substrate) da base de dados:',
+ 'config-db-host-oracle-help' => 'Introduza um [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome Local de Ligação] válido; tem de estar visível para esta instalação um ficheiro tnsnames.ora.<br />Se está a usar bibliotecas cliente versão 10g ou posterior, também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Ligação Fácil] de atribuição do nome.',
+ 'config-db-wiki-settings' => 'Identifique esta wiki',
+ 'config-db-name' => 'Nome da base de dados:',
+ 'config-db-name-help' => 'Escolha um nome para identificar a sua wiki.
+O nome não deve conter espaços.
+
+Se estiver a usar um servidor partilhado, o fornecedor do alojamento deve poder fornecer-lhe o nome de uma base de dados que possa usar, ou permite-lhe criar bases de dados através de um painel de controle.',
+ 'config-db-name-oracle' => "Esquema ''(schema)'' da base de dados:",
+ 'config-db-account-oracle-warn' => "Há três cenários suportados na instalação do servidor de base de dados Oracle:
+
+Se pretende criar a conta de acesso pela internet na base de dados durante o processo de instalação, forneça como conta para a instalação uma conta com o papel de SYSDBA na base de dados e especifique as credenciais desejadas para a conta de acesso pela internet. Se não pretende criar a conta de acesso pela internet durante a instalação, pode criá-la manualmente e fornecer só essa conta para a instalação (se ela tiver as permissões necessárias para criar os objectos do esquema ''(schema)''). A terceira alternativa é fornecer duas contas diferentes; uma com privilégios de criação e outra com privilégios limitados para o acesso pela internet.
+
+Existe um script para criação de uma conta com os privilégios necessários no directório \"maintenance/oracle/\" desta instalação. Mantenha em mente que usar uma conta com privilégios limitados impossibilita todas as operações de manutenção com a conta padrão.",
+ 'config-db-install-account' => 'Conta do utilizador para a instalação',
+ 'config-db-username' => 'Nome do utilizador da base de dados:',
+ 'config-db-password' => 'Palavra-chave do utilizador da base de dados:',
+ 'config-db-password-empty' => 'Introduza a palavra-chave do novo utilizador da base de dados: $1.
+Embora seja possível criar utilizadores sem palavra-chave, fazê-lo não é seguro.',
+ 'config-db-install-username' => 'Introduza o nome de utilizador que será usado para aceder à base de dados durante o processo de instalação. Este utilizador não é o do MediaWiki; é o utilizador da base de dados.',
+ 'config-db-install-password' => 'Introduza a palavra-chave do utilizador que será usado para aceder à base de dados durante o processo de instalação. Esta palavra-chave não é a do utilizador do MediaWiki; é a palavra-chave do utilizador da base de dados.',
+ 'config-db-install-help' => 'Introduza o nome de utilizador e a palavra-chave que serão usados para aceder à base de dados durante o processo de instalação.',
+ 'config-db-account-lock' => 'Usar o mesmo nome de utilizador e palavra-chave durante a operação normal',
+ 'config-db-wiki-account' => 'Conta de utilizador para a operação normal',
+ 'config-db-wiki-help' => 'Introduza o nome de utilizador e a palavra-chave que serão usados para aceder à base de dados durante a operação normal da wiki.
+Se o utilizador não existir na base de dados, mas a conta de instalação tiver privilégios suficientes, o utilizador que introduzir será criado na base de dados com os privilégios mínimos necessários para a operação normal da wiki.',
+ 'config-db-prefix' => 'Prefixo para as tabelas da base de dados:',
+ 'config-db-prefix-help' => 'Se necessitar de partilhar uma só base de dados entre várias wikis, ou entre o MediaWiki e outra aplicação, pode escolher adicionar um prefixo ao nome de todas as tabelas desta instalação, para evitar conflitos.
+Não use espaços.
+
+Normalmente, este campo deve ficar vazio.',
+ 'config-db-charset' => 'Conjunto de caracteres da base de dados',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 backwards-compatible UTF-8',
+ 'config-charset-help' => "'''Aviso:''' Se usar '''backwards-compatible UTF-8''' (\"UTF-8 compatível com versões anteriores\") no MySQL 4.1+, e depois fizer cópias de segurança da base de dados usando <code>mysqldump</code>, poderá destruir todos os caracteres que não fazem parte do conjunto ASCII, corrompendo assim, de forma irreversível, as suas cópias de segurança!
+
+No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.
+Isto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.
+No modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,
+mas não lhe permitirá armazenar caracteres acima do [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
+ 'config-mysql-old' => 'É necessário o MySQL $1 ou posterior; tem a versão $2.',
+ 'config-db-port' => 'Porta da base de dados:',
+ 'config-db-schema' => "Esquema ''(schema)'' do MediaWiki",
+ 'config-db-schema-help' => 'Normalmente, este esquema ("schema") estará correcto.
+Altere-o só se souber que precisa de o fazer.',
+ 'config-sqlite-dir' => 'Directório de dados do SQLite:',
+ 'config-sqlite-dir-help' => "O SQLite armazena todos os dados num único ficheiro.
+
+Durante a instalação, o servidor de internet precisa de ter permissão de escrita no directório que especificar.
+
+Este directório '''não''' deve poder ser acedido directamente da internet, por isso está a ser colocado onde estão os seus ficheiros PHP.
+
+Juntamente com o directório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso directo à base de dados.
+Isto inclui acesso aos dados dos utilizadores (endereços de correio electrónico, palavras-chave encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.
+
+Considere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
+ 'config-oracle-def-ts' => 'Tablespace padrão:',
+ 'config-oracle-temp-ts' => 'Tablespace temporário:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'O MediaWiki suporta as seguintes plataformas de base de dados:
+
+$1
+
+Se a plataforma que pretende usar não está listada abaixo, siga as instruções nos links acima para activar o suporte.',
+ 'config-support-mysql' => '* $1 é a plataforma primária do MediaWiki e a melhor suportada ([http://www.php.net/manual/en/mysql.installation.php como compilar PHP com suporte MySQL])',
+ 'config-support-postgres' => '* $1 é uma plataforma de base de dados comum, de fonte aberta, alternativa ao MySQL. ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP com suporte PostgreSQL])',
+ 'config-support-sqlite' => '* $1 é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte SQLite], usa PDO)',
+ 'config-support-oracle' => '* $1 é uma base de dados de uma empresa comercial. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
+ 'config-header-mysql' => 'Definições MySQL',
+ 'config-header-postgres' => 'Definições PostgreSQL',
+ 'config-header-sqlite' => 'Definições SQLite',
+ 'config-header-oracle' => 'Definições Oracle',
+ 'config-invalid-db-type' => 'O tipo de base de dados é inválido',
+ 'config-missing-db-name' => 'Tem de introduzir um valor para "Nome da base de dados"',
+ 'config-missing-db-host' => 'Tem de introduzir um valor para "Servidor da base de dados"',
+ 'config-missing-db-server-oracle' => 'Tem de introduzir um valor para "TNS da base de dados"',
+ 'config-invalid-db-server-oracle' => 'O TNS da base de dados, "$1", é inválido.
+Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.',
+ 'config-invalid-db-name' => 'O nome da base de dados, "$1", é inválido.
+Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.',
+ 'config-invalid-db-prefix' => 'O prefixo da base de dados, "$1", é inválido.
+Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.',
+ 'config-connection-error' => '$1.
+
+Verifique o servidor, o nome do utilizador e a palavra-chave abaixo e tente novamente.',
+ 'config-invalid-schema' => "O esquema ''(schema)'' do MediaWiki, \"\$1\", é inválido.
+Use só letras (a-z, A-Z), algarismos (0-9) e sublinhados (_) dos caracteres ASCII.",
+ 'config-db-sys-create-oracle' => 'O instalador só permite criar uma conta nova usando uma conta SYSDBA.',
+ 'config-db-sys-user-exists-oracle' => 'A conta "$1" já existe. A conta SYSDBA só pode criar uma conta nova!',
+ 'config-postgres-old' => 'É necessário o PostgreSQL $1 ou posterior; tem a versão $2.',
+ 'config-sqlite-name-help' => 'Escolha o nome que identificará a sua wiki.
+Não use espaços ou hífens.
+Este nome será usado como nome do ficheiro de dados do SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Não é possível criar o directório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no directório que o contém <code><nowiki>$2</nowiki></code>.
+
+O instalador determinou em que nome de utilizador o seu servidor de internet está a correr.
+Para continuar, configure o directório <code><nowiki>$3</nowiki></code> para poder ser escrito por este utilizador.
+Para fazê-lo em sistemas Unix ou Linux, use:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Não é possível criar o directório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no directório que o contém <code><nowiki>$2</nowiki></code>.
+
+Não foi possível determinar em que nome de utilizador o seu servidor de internet está a correr.
+Para continuar, configure o directório <code><nowiki>$3</nowiki></code> para que este possa ser globalmente escrito por esse utilizador (e por outros!).
+Para fazê-lo em sistemas Unix ou Linux, use:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Ocorreu um erro ao criar o directório de dados "$1".
+Verifique a localização e tente novamente.',
+ 'config-sqlite-dir-unwritable' => 'Não foi possível escrever no directório "$1".
+Altere as permissões para que ele possa ser escrito pelo servidor de internet e tente novamente.',
+ 'config-sqlite-connection-error' => '$1.
+
+Verifique o directório de dados e o nome da base de dados abaixo e tente novamente.',
+ 'config-sqlite-readonly' => 'Não é possivel escrever no ficheiro <code>$1</code>.',
+ 'config-sqlite-cant-create-db' => 'Não foi possível criar o ficheiro da base de dados <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'O PHP não tem suporte FTS3; a reverter o esquema das tabelas para o anterior',
+ 'config-can-upgrade' => "Esta base de dados contém tabelas do MediaWiki.
+Para actualizá-las para o MediaWiki $1, clique '''Continuar'''.",
+ 'config-upgrade-done' => "Actualização terminada.
+
+Agora pode [$1 começar a usar a sua wiki].
+
+Se quiser regenerar o seu ficheiro <code>LocalSettings.php</code>, clique o botão abaixo.
+Esta operação '''não é recomendada''' a menos que esteja a ter problemas com a sua wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Actualização terminada.
+
+Agora pode [$1 começar a usar a sua wiki].',
+ 'config-regenerate' => 'Regenerar o LocalSettings.php →',
+ 'config-show-table-status' => 'A consulta SHOW TABLE STATUS falhou!',
+ 'config-unknown-collation' => "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
+ 'config-db-web-account' => 'Conta na base de dados para acesso pela internet',
+ 'config-db-web-help' => 'Seleccione o nome de utilizador e a palavra-chave que o servidor de internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.',
+ 'config-db-web-account-same' => 'Usar a mesma conta usada na instalação',
+ 'config-db-web-create' => 'Criar a conta se ainda não existir',
+ 'config-db-web-no-create-privs' => 'A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.
+A conta que especificar aqui já tem de existir.',
+ 'config-mysql-engine' => 'Motor de armazenamento:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' é quase sempre a melhor opção, porque suporta bem acessos simultâneos ''(concurrency)''.
+
+'''MyISAM''' pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.
+As bases de dados MyISAM tendem a ficar corrompidas com maior frequência do que as bases de dados InnoDB.",
+ 'config-mysql-charset' => 'Conjunto de caracteres da base de dados:',
+ 'config-mysql-binary' => 'Binary',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.
+Isto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.
+
+No modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,
+mas não lhe permitirá armazenar caracteres acima do [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
+ 'config-site-name' => 'Nome da wiki:',
+ 'config-site-name-help' => 'Este nome aparecerá no título da janela do seu browser e em vários outros sítios.',
+ 'config-site-name-blank' => 'Introduza o nome do site.',
+ 'config-project-namespace' => 'Espaço nominal do projecto:',
+ 'config-ns-generic' => 'Projecto',
+ 'config-ns-site-name' => 'O mesmo que o nome da wiki: $1',
+ 'config-ns-other' => 'Outro (especifique)',
+ 'config-ns-other-default' => 'AMinhaWiki',
+ 'config-project-namespace-help' => 'Seguindo o exemplo da Wikipedia, muitas wikis mantêm as páginas das suas normas e políticas, separadas das páginas de conteúdo, num "\'\'\'espaço nominal do projecto\'\'\'".
+Todos os nomes das páginas neste espaço nominal começam com um determinado prefixo, que pode especificar aqui.
+Tradicionalmente, este prefixo deriva do nome da wiki, mas não pode conter caracteres de pontuação, como "#" ou ":".',
+ 'config-ns-invalid' => 'O espaço nominal especificado "<nowiki>$1</nowiki>" é inválido.
+Introduza um espaço nominal de projecto diferente.',
+ 'config-ns-conflict' => 'O espaço nominal que especificou, "<nowiki>$1</nowiki>", cria um conflito com um dos espaços nominais padrão do MediaWiki.
+Especifique um espaço nominal do projecto diferente.',
+ 'config-admin-box' => 'Conta de administrador',
+ 'config-admin-name' => 'O seu nome:',
+ 'config-admin-password' => 'Palavra-chave:',
+ 'config-admin-password-confirm' => 'Repita a palavra-chave:',
+ 'config-admin-help' => 'Introduza aqui o seu nome de utilizador preferido, por exemplo, "João Beltrão".
+Este é o nome que irá utilizar para entrar na wiki.',
+ 'config-admin-name-blank' => 'Introduza um nome de utilizador para administrador.',
+ 'config-admin-name-invalid' => 'O nome de utilizador especificado "<nowiki>$1</nowiki>" é inválido.
+Introduza um nome de utilizador diferente.',
+ 'config-admin-password-blank' => 'Introduza uma palavra-chave para a conta de administrador.',
+ 'config-admin-password-same' => 'A palavra-chave tem de ser diferente do nome de utilizador.',
+ 'config-admin-password-mismatch' => 'As duas palavras-chave que introduziu não coincidem.',
+ 'config-admin-email' => 'Correio electrónico:',
+ 'config-admin-email-help' => 'Introduza aqui um correio electrónico que lhe permita receber mensagens de outros utilizadores da wiki, reiniciar a sua palavra-chave e receber notificações de alterações às suas páginas vigiadas. Pode deixar o campo vazio.',
+ 'config-admin-error-user' => 'Ocorreu um erro interno ao criar um administrador com o nome "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Ocorreu um erro interno ao definir uma palavra-chave para o administrador "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Introduziu um correio electrónico inválido',
+ 'config-subscribe' => 'Subscreva a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de divulgação de anúncios de lançamento].',
+ 'config-subscribe-help' => 'Esta é uma lista de divulgação de baixo volume para anúncios de lançamento de versões novas, incluindo anúncios de segurança importantes.
+Deve subscrevê-la e actualizar a sua instalação MediaWiki quando são lançadas versões novas.',
+ 'config-almost-done' => 'Está quase a terminar!
+Agora pode saltar as configurações restantes e instalar já a wiki.',
+ 'config-optional-continue' => 'Faz-me mais perguntas.',
+ 'config-optional-skip' => 'Já estou aborrecido, instala lá a wiki.',
+ 'config-profile' => 'Perfil de permissões:',
+ 'config-profile-wiki' => 'Wiki tradicional',
+ 'config-profile-no-anon' => 'Criação de conta exigida',
+ 'config-profile-fishbowl' => 'Somente utilizadores autorizados',
+ 'config-profile-private' => 'Wiki privada',
+ 'config-profile-help' => "As wikis funcionam melhor quando se deixa tantas pessoas editá-las quanto possível.
+No MediaWiki, é fácil rever as alterações recentes e reverter quaisquer estragos causados por utilizadores novatos ou maliciosos.
+
+No entanto, muitas pessoas consideram o MediaWiki útil de variadas formas e nem sempre é fácil convencer todas as pessoas dos benefícios desta filosofia wiki.
+Por isso pode optar.
+
+Uma '''{{int:config-profile-wiki}}''' permite que todos a editem, sem sequer necessitar de autenticação.
+Uma wiki com '''{{int:config-profile-no-anon}}''' atribui mais responsabilidade, mas pode afastar os colaboradores ocasionais.
+
+Um cenário '''{{int:config-profile-fishbowl}}''' permite que os utilizadores aprovados editem, mas que o público visione as páginas, incluindo o historial das mesmas.
+Uma '''{{int:config-profile-private}}''' só permite que os utilizadores aprovados visionem as páginas e as editem.
+
+Após a instalação, estarão disponíveis mais configurações de privilégios. Consulte [http://www.mediawiki.org/wiki/Manual:User_rights a entrada relevante no Manual].",
+ 'config-license' => 'Direitos de autor e licença:',
+ 'config-license-none' => 'Sem rodapé com a licença',
+ 'config-license-cc-by-sa' => 'Atribuição - Partilha nos Mesmos Termos, da Creative Commons',
+ 'config-license-cc-by-nc-sa' => 'Atribuição - Uso Não-Comercial - Partilha nos Mesmos Termos, da Creative Commons',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 ou posterior',
+ 'config-license-pd' => 'Domínio Público',
+ 'config-license-cc-choose' => 'Seleccione uma licença personalizada da Creative Commons',
+ 'config-license-help' => 'Muitas wikis de acesso público licenciam todas as colaborações com uma [http://freedomdefined.org/Definition licença livre].
+Isto ajuda a criar um sentido de propriedade da comunidade e encoraja as colaborações a longo prazo.
+Tal não é geralmente necessário nas wikis privadas ou corporativas.
+
+Se pretende que seja possível usar textos da Wikipédia na sua wiki e que seja possível a Wikipédia aceitar textos copiados da sua wiki, deve escolher a licença Atribuição - Partilha nos Mesmos Termos, da Creative Commons.
+
+A licença GNU Free Documentation License era a anterior licença da Wikipédia.
+Embora ainda seja uma licença válida, ela tem certas características que tornam o reuso e a interpretação difíceis.',
+ 'config-email-settings' => 'Definições do correio electrónico',
+ 'config-enable-email' => 'Activar mensagens electrónicas de saída',
+ 'config-enable-email-help' => 'Se quer que o correio electrónico funcione, as [http://www.php.net/manual/en/mail.configuration.php definições de correio electrónico do PHP] têm de estar configuradas correctamente.
+Se não pretende viabilizar qualquer funcionalidade de correio electrónico, pode desactivá-lo aqui.',
+ 'config-email-user' => 'Activar mensagens electrónicas entre utilizadores',
+ 'config-email-user-help' => 'Permitir que todos os utilizadores troquem entre si mensagens de correio electrónico, se tiverem activado esta funcionalidade nas suas preferências.',
+ 'config-email-usertalk' => 'Activar notificações de alterações à página de discussão dos utilizadores',
+ 'config-email-usertalk-help' => 'Permitir que os utilizadores recebam notificações de alterações à sua página de discussão, se tiverem activado esta funcionalidade nas suas preferências.',
+ 'config-email-watchlist' => 'Activar notificação de alterações às páginas vigiadas',
+ 'config-email-watchlist-help' => 'Permitir que os utilizadores recebam notificações de alterações às suas páginas vigiadas, se tiverem activado esta funcionalidade nas suas preferências.',
+ 'config-email-auth' => 'Activar autenticação do correio electrónico',
+ 'config-email-auth-help' => "Se esta opção for activada, os utilizadores têm de confirmar o seu endereço de correio electrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.
+Só os endereços de correio electrónico autenticados podem receber mensagens electrónicas dos outros utilizadores ou alterar as mensagens de notificação.
+É '''recomendado''' que esta opção seja activada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio electrónico.",
+ 'config-email-sender' => 'Endereço de correio electrónico de retorno:',
+ 'config-email-sender-help' => 'Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.
+É para este endereço que serão enviadas as mensagens que não podem ser entregues.
+Muitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\',
+ 'config-upload-settings' => 'Upload de imagens e ficheiros',
+ 'config-upload-enable' => 'Possibilitar o upload de ficheiros',
+ 'config-upload-help' => 'O upload de ficheiros expõe o seu servidor a riscos de segurança.
+Para mais informações, leia a [http://www.mediawiki.org/wiki/Manual:Security secção sobre segurança] do Manual Técnico.
+
+Para permitir o upload de ficheiros, altere as permissões do subdirectório <code>images</code> no directório de raiz do MediaWik para que o servidor de internet possa escrever nele.
+Depois active esta opção.',
+ 'config-upload-deleted' => 'Directório para os ficheiros apagados:',
+ 'config-upload-deleted-help' => 'Escolha um directório onde serão arquivados os ficheiros apagados.
+O ideal é que este directório não possa ser directamente acedido a partir da internet.',
+ 'config-logo' => 'URL do logótipo:',
+ 'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 pixels no canto superior esquerdo.
+Faça o upload de uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
+
+Se não pretende usar um logótipo, deixe este campo em branco.',
+ 'config-instantcommons' => 'Activar a funcionalidade Instant Commons',
+ 'config-instantcommons-help' => 'O [http://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [http://commons.wikimedia.org/ Wikimedia Commons].
+Para poder usá-los, o MediaWiki necessita de acesso à internet.
+
+Para mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos Manual Técnico].',
+ 'config-cc-error' => 'O auxiliar de escolha de licenças da Creative Commons não produziu resultados.
+Introduza o nome da licença manualmente.',
+ 'config-cc-again' => 'Escolha outra vez...',
+ 'config-cc-not-chosen' => 'Escolha a licença da Creative Commons que pretende e clique "continuar".',
+ 'config-advanced-settings' => 'Configuração avançada',
+ 'config-cache-options' => 'Definições da cache de objectos:',
+ 'config-cache-help' => 'A cache de objectos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.
+Sites de tamanho médio ou grande são altamente encorajados a activar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.',
+ 'config-cache-none' => 'Sem cache (não é removida nenhuma funcionalidade, mas a velocidade de operação pode ser afectada nas wikis grandes)',
+ 'config-cache-accel' => 'Cache de objectos do PHP (APC, eAccelerator, XCache ou WinCache)',
+ 'config-cache-memcached' => 'Usar Memcached (requer instalação e configurações adicionais)',
+ 'config-memcached-servers' => 'Servidores Memcached:',
+ 'config-memcached-help' => 'Lista de endereços IP que serão usados para o Memcached.
+Deve-se colocar um por linha e indicar a porta a utilizar. Por exemplo:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Seleccionou o Memcached como tipo de chache, mas não especificou nenhum servidor.',
+ 'config-memcache-badip' => 'Introduziu um endereço IP inválido para o Memcached: $1.',
+ 'config-memcache-noport' => 'Não especificou a porta a usar para o servidor Memcached: $1.
+Se não sabe qual é a porta, a predefinida é a 11211.',
+ 'config-memcache-badport' => 'Os números das portas do Memcached devem estar entre $1 e $2.',
+ 'config-extensions' => 'Extensões',
+ 'config-extensions-help' => 'Foi detectada a existência das extensões listadas acima, no seu directório <code>./extensions</code>.
+
+Estas talvez necessitem de configurações adicionais, mas pode activá-las agora',
+ 'config-install-alreadydone' => "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.
+Passe para a próxima página, por favor.",
+ 'config-install-begin' => 'Ao clicar "{{int:config-continue}}", vai iniciar a instalação do MediaWiki.
+Se quiser fazer mais alterações, clique Voltar.',
+ 'config-install-step-done' => 'terminado',
+ 'config-install-step-failed' => 'falhou',
+ 'config-install-extensions' => 'A incluir as extensões',
+ 'config-install-database' => 'A preparar a base de dados',
+ 'config-install-pg-schema-not-exist' => "O esquema ''(schema)'' PostgreSQL não existe",
+ 'config-install-pg-schema-failed' => 'A criação das tabelas falhou.
+Certifique-se de que o utilizador "$1" pode escrever no esquema \'\'(schema)\'\' "$2".',
+ 'config-install-pg-commit' => 'A gravar as alterações',
+ 'config-install-pg-plpgsql' => 'A verificar a presença da linguagem PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'É preciso instalar a linguagem PL/pgSQL na base de dados $1',
+ 'config-pg-no-create-privs' => 'A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.',
+ 'config-install-user' => 'A criar o utilizador da base de dados',
+ 'config-install-user-alreadyexists' => 'O utilizador "$1" já existe',
+ 'config-install-user-create-failed' => 'A criação do utilizador "$1" falhou: $2',
+ 'config-install-user-grant-failed' => 'A atribuição das permissões ao utilizador "$1" falhou: $2',
+ 'config-install-tables' => 'A criar as tabelas',
+ 'config-install-tables-exist' => "'''Aviso''': As tabelas do MediaWiki parecem já existir.
+A criação das tabelas será saltada.",
+ 'config-install-tables-failed' => "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
+ 'config-install-interwiki' => 'A preencher a tabela padrão de interwikis',
+ 'config-install-interwiki-list' => 'Não foi possível encontrar o ficheiro <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Aviso''': A tabela de interwikis parece já conter entradas.
+O preenchimento padrão desta tabela será saltado.",
+ 'config-install-stats' => 'A inicializar as estatísticas',
+ 'config-install-keys' => 'A gerar a chave secreta',
+ 'config-install-sysop' => 'A criar a conta de administrador',
+ 'config-install-subscribe-fail' => 'Não foi possível subscrever a lista mediawiki-announce',
+ 'config-install-mainpage' => 'A criar a página principal com o conteúdo padrão.',
+ 'config-install-extension-tables' => 'A criar as tabelas das extensões activadas',
+ 'config-install-mainpage-failed' => 'Não foi possível inserir a página principal: $1',
+ 'config-install-done' => "'''Parabéns!'''
+Terminou a instalação do MediaWiki.
+
+O instalador gerou um ficheiro <code>LocalSettings.php</code>.
+Este ficheiro contém todas as configurações.
+
+Precisa de fazer o download do ficheiro e colocá-lo no directório de raiz da sua instalação (o mesmo directório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.
+
+Se o download não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando o link abaixo:
+
+$3
+
+'''Nota''': Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.
+
+Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
+ 'config-download-localsettings' => 'Download do LocalSettings.php',
+ 'config-help' => 'ajuda',
+);
+
+/** Brazilian Portuguese (Português do Brasil)
+ * @author Giro720
+ * @author Gustavo
+ * @author Marcionunes
+ */
+$messages['pt-br'] = array(
+ 'config-desc' => 'O instalador do MediaWiki',
+ 'config-title' => 'Instalação MediaWiki $1',
+ 'config-information' => 'Informações',
+ 'config-localsettings-upgrade' => "'''Aviso''': Foi detetada a existência de um arquivo <code>LocalSettings.php</code>.
+É possível atualizar o seu software.
+Mova o <code>LocalSettings.php</code> para um lugar seguro e execute o instalador novamente, por favor.",
+ 'config-localsettings-cli-upgrade' => 'Foi detectado um arquivo LocalSettings.php.
+Para atualizar esta instalação, por favor, use: --upgrade=yes.',
+ 'config-localsettings-key' => 'Chave de atualização:',
+ 'config-localsettings-badkey' => 'A senha inserida está incorreta.',
+ 'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
+Para atualizar esta instalação, por favor, coloque a seguinte linha na parte inferior do seu LocalSettings.php:
+
+$ 1',
+ 'config-session-error' => 'Erro ao iniciar a sessão: $1',
+ 'config-session-expired' => 'Os seus dados de sessão parecem ter expirado.
+As sessões estão configuradas para uma duração de $1.
+Você pode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.
+Reinicie o processo de instalação.',
+ 'config-no-session' => 'Os seus dados de sessão foram perdidos!
+Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.',
+ 'config-your-language' => 'A sua língua:',
+ 'config-your-language-help' => 'Selecione a língua que será usada durante o processo de instalação.',
+ 'config-wiki-language' => 'Língua da wiki:',
+ 'config-wiki-language-help' => 'Selecione a língua que será predominante na wiki.',
+ 'config-back' => '↠Voltar',
+ 'config-continue' => 'Continuar →',
+ 'config-page-language' => 'Língua',
+ 'config-page-welcome' => 'Bem-vindo(a) ao MediaWiki!',
+ 'config-page-dbconnect' => 'Ligar à base de dados',
+ 'config-page-upgrade' => 'Atualizar a instalação existente',
+ 'config-page-dbsettings' => 'Configurações da base de dados',
+ 'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opções',
+ 'config-page-install' => 'Instalar',
+ 'config-page-complete' => 'Terminado!',
+ 'config-page-restart' => 'Reiniciar a instalação',
+ 'config-page-readme' => 'Leia-me',
+ 'config-page-releasenotes' => 'Notas de lançamento',
+ 'config-page-copying' => 'Copiando',
+ 'config-page-upgradedoc' => 'Atualizando',
+ 'config-help-restart' => 'Deseja limpar todos os dados salvos que você introduziu e reiniciar o processo de instalação?',
+ 'config-restart' => 'Sim, reiniciar',
+ 'config-welcome' => '=== Verificações do ambiente ===
+São realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.
+Você deverá fornecer os resultados destas verificações se você precisar de ajuda durante a instalação.',
+ 'config-copyright' => "=== Direitos autorais e Termos de uso ===
+
+$1
+
+Este programa é software livre; você 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.
+
+Este programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.
+Consulte a licença GNU General Public License para mais detalhes.
+
+Em conjunto com este programa você deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
+ 'config-sidebar' => '* [http://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents/pt Ajuda]
+* [http://www.mediawiki.org/wiki/Manual:Contents/pt Manual técnico]
+* [http://www.mediawiki.org/wiki/Manual:FAQ FAQ]',
+ 'config-env-good' => 'O ambiente foi verificado.
+Você pode instalar o MediaWiki.',
+ 'config-env-bad' => 'O ambiente foi verificado.
+Você não pode instalar o MediaWiki.',
+ 'config-env-php' => 'O PHP $1 está instalado.',
+ 'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, de Brian Viper, para a normalização Unicode.',
+ 'config-unicode-using-intl' => 'Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
+ 'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode.
+Se o seu site tem um alto volume de tráfego, devia informar-se um pouco sobre a [http://www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].",
+ 'config-no-db' => 'Não foi possível encontrar um driver de banco de dados adequado!',
+ 'config-no-db-help' => 'Você precisa instalar um driver de banco de dados para PHP.
+Os seguintes tipos de banco de dados são suportados: $1.
+
+Se você estiver em hospedagem compartilhada, pergunte ao seu provedor de hospedagem para instalar um driver de banco de dados apropriado.
+Se você compilou o PHP você mesmo, reconfigurá-lo com um cliente de banco de dados habilitado, por exemplo, usando <code>./configure --with-mysql</code>.
+Se você instalou o PHP de um Debian ou Ubuntu package, então você também precisa instalar o módulo php5-mysql.',
+ 'config-no-fts3' => "' ' 'Aviso' ' ': O SQLite foi compilado sem o módulo [http://sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
+ 'config-register-globals' => "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''
+' ' 'Desative-a, se puder.'''
+O MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
+ 'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logotipo de 135x160 pixels no canto superior esquerdo.
+Faça o upload de uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
+
+Se você não pretende usar um logotipo, deixe este campo em branco.',
+);
+
+/** Romanian (Română)
+ * @author Stelistcristi
+ */
+$messages['ro'] = array(
+ 'config-session-error' => 'Eroare la pornirea sesiunii: $1',
+ 'config-your-language' => 'Limba ta:',
+ 'config-your-language-help' => 'Alege o limbă pentru a o utiliza în timpul procesului de instalare.',
+ 'config-wiki-language' => 'Limbă wiki:',
+ 'config-wiki-language-help' => 'Alege limba în care wiki-ul va fi scris predominant.',
+ 'config-back' => '↠Înapoi',
+ 'config-continue' => 'Continuă →',
+ 'config-page-language' => 'Limbă',
+ 'config-page-welcome' => 'Bun venit la MediaWiki!',
+ 'config-page-dbconnect' => 'Conectează la baza de date',
+ 'config-page-upgrade' => 'Extinde instalarea existentă',
+ 'config-page-dbsettings' => 'Setări ale bazei de date',
+ 'config-page-name' => 'Nume',
+ 'config-page-options' => 'Opţiuni',
+ 'config-page-install' => 'Instalare',
+ 'config-page-restart' => 'ReporneÅŸte instalarea',
+ 'config-page-readme' => 'Citeşte-mă',
+ 'config-page-releasenotes' => 'Note de lansare',
+ 'config-db-type' => 'Tipul bazei de date:',
+ 'config-db-host' => 'Gazdă bază de date:',
+ 'config-header-mysql' => 'Setările MySQL',
+ 'config-header-sqlite' => 'Setări SQLite',
+ 'config-header-oracle' => 'Setări Oracle',
+ 'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de dateâ€',
+ 'config-ns-generic' => 'Proiect',
+ 'config-admin-password' => 'Parolă:',
+);
+
+/** Russian (РуÑÑкий)
+ * @author DCamer
+ * @author Eleferen
+ * @author Krinkle
+ * @author MaxSem
+ * @author Yuriy Apostol
+ * @author ÐлекÑандр Сигачёв
+ * @author Сrower
+ */
+$messages['ru'] = array(
+ 'config-desc' => 'ИнÑталлÑтор MediaWiki',
+ 'config-title' => 'УÑтановка MediaWiki $1',
+ 'config-information' => 'ИнформациÑ',
+ 'config-localsettings-upgrade' => 'Обнаружен файл <code>LocalSettings.php</code>.
+Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтой уÑтановки, пожалуйÑта, введите значение <code>$wgUpgradeKey</code>.
+Его можно найти в файле LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => 'Обнаружен файл LocalSettings.php.
+Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтой уÑтановки, пожалуйÑта, запуÑтите update.php',
+ 'config-localsettings-key' => 'Ключ обновлениÑ:',
+ 'config-localsettings-badkey' => 'Вы указали неправильный ключ',
+ 'config-upgrade-key-missing' => 'Обнаружена ÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ MediaWiki.
+Чтобы обновить обнаруженную уÑтановку, пожалуйÑта, добавьте Ñледующую Ñтроку в конец вашего файла LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'Похоже, что ÑущеÑтвующий файл LocalSettings.php не ÑвлÑетÑÑ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼Ð¸.
+Ðе уÑтановлена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $1.
+ПожалуйÑта, измените LocalSettings.php так, чтобы значение Ñтой переменной было задано, затем нажмите «Продолжить».',
+ 'config-localsettings-connection-error' => 'Произошла ошибка при подключении к базе данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ наÑтроек, указанных в LocalSettings.php или AdminSettings.php. ПожалуйÑта, иÑправьте Ñти наÑтройки и повторите попытку.
+
+$1',
+ 'config-session-error' => 'Ошибка при запуÑке ÑеÑÑии: $1',
+ 'config-session-expired' => 'Ваша ÑеÑÑÐ¸Ñ Ð¸Ñтекла.
+СеÑÑии наÑтроены на длительноÑÑ‚ÑŒ $1.
+Вы её можете увеличить, изменив <code>session.gc_maxlifetime</code> в php.ini.
+ПерезапуÑтите процеÑÑ ÑƒÑтановки.',
+ 'config-no-session' => 'Данные ÑеÑÑии потерÑны!
+Проверьте ваш php.ini и убедитеÑÑŒ, что <code>session.save_path</code> уÑтановлен в ÑоответÑтвующий каталог.',
+ 'config-your-language' => 'Ваш Ñзык:',
+ 'config-your-language-help' => 'Выберите Ñзык, на котором будет проиÑходить процеÑÑ ÑƒÑтановки.',
+ 'config-wiki-language' => 'Язык, который будет иÑпользовать вики:',
+ 'config-wiki-language-help' => 'Выберите Ñзык, на котором будут отображатьÑÑ Ð²Ð¸ÐºÐ¸.',
+ 'config-back' => '↠Ðазад',
+ 'config-continue' => 'Далее →',
+ 'config-page-language' => 'Язык',
+ 'config-page-welcome' => 'Добро пожаловать в MediaWiki!',
+ 'config-page-dbconnect' => 'Подключение к базе данных',
+ 'config-page-upgrade' => 'Обновление ÑущеÑтвующей уÑтановки',
+ 'config-page-dbsettings' => 'ÐаÑтройки базы данных',
+ 'config-page-name' => 'Ðазвание',
+ 'config-page-options' => 'ÐаÑтройки',
+ 'config-page-install' => 'УÑтановка',
+ 'config-page-complete' => 'Готово!',
+ 'config-page-restart' => 'Ðачать уÑтановку заново',
+ 'config-page-readme' => 'Прочти менÑ',
+ 'config-page-releasenotes' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ верÑии',
+ 'config-page-copying' => 'ЛицензиÑ',
+ 'config-page-upgradedoc' => 'Обновление',
+ 'config-page-existingwiki' => 'СущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð²Ð¸ÐºÐ¸',
+ 'config-help-restart' => 'Ð’Ñ‹ хотите удалить вÑе Ñохранённые данные, которые вы ввели, и запуÑтить процеÑÑ ÑƒÑтановки заново?',
+ 'config-restart' => 'Да, начать заново',
+ 'config-welcome' => '=== Проверка Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ===
+ПроводÑÑ‚ÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ‹Ðµ проверки Ñ Ñ†ÐµÐ»ÑŒÑŽ определить, подходит ли Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема Ð´Ð»Ñ ÑƒÑтановки MediaWiki.
+Укажите результаты Ñтих проверок при обращении за помощью Ñ ÑƒÑтановкой.',
+ 'config-copyright' => "=== ÐвторÑкие права и уÑÐ»Ð¾Ð²Ð¸Ñ ===
+
+$1
+
+MediaWiki ÑвлÑетÑÑ Ñвободным программным обеÑпечением, которое вы можете раÑпроÑтранÑÑ‚ÑŒ и/или изменÑÑ‚ÑŒ в ÑоответÑтвии Ñ ÑƒÑловиÑми лицензии GNU General Public License, опубликованной фондом Ñвободного программного обеÑпечениÑ; второй верÑии, либо любой более поздней верÑии.
+
+MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она будет полезной, но '''без каких-либо гарантий''', даже без подразумеваемых гарантий '''коммерчеÑкой ценноÑти''' или '''пригодноÑти Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð¾Ð¹ цели'''. См. лицензию GNU General Public License Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации.
+
+Ð’Ñ‹ должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вмеÑте Ñ Ñтой программой, еÑли нет, то напишите Free Software Foundation, Inc., по адреÑу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Сайт MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents/ru Справка Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹]
+* [http://www.mediawiki.org/wiki/Manual:Contents/ru Справка Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов]
+* [http://www.mediawiki.org/wiki/Manual:FAQ/ru FAQ]
+----
+* <doclink href=Readme>Readme-файл</doclink>
+* <doclink href=ReleaseNotes>Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ выпуÑке</doclink>
+* <doclink href=Copying>ЛицензиÑ</doclink>
+* <doclink href=UpgradeDoc>Обновление</doclink>',
+ 'config-env-good' => 'Проверка внешней Ñреды была уÑпешно проведена.
+Ð’Ñ‹ можете уÑтановить MediaWiki.',
+ 'config-env-bad' => 'Была проведена проверка внешней Ñреды.
+Ð’Ñ‹ не можете уÑтановить MediaWiki.',
+ 'config-env-php' => 'УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ PHP: $1.',
+ 'config-env-php-toolow' => 'Ðайден PHP $1, тогда как MediaWiki требуетÑÑ PHP верÑии $2 или выше.',
+ 'config-unicode-using-utf8' => 'ИÑпользовать Brion Vibber utf8_normalize.so Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Юникода.',
+ 'config-unicode-using-intl' => 'Будет иÑпользовано [http://pecl.php.net/intl раÑширение «intl» Ð´Ð»Ñ PECL] Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Юникода.',
+ 'config-unicode-pure-php-warning' => "'''Внимание!''': [http://pecl.php.net/intl международное раÑширение PECL] недоÑтупно Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Юникода, будет иÑпользоватьÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° чиÑтом PHP.
+ЕÑли ваш Ñайт работает под выÑокой нагрузкой, вам Ñледует больше узнать о [http://www.mediawiki.org/wiki/Unicode_normalization_considerations нормализации Юникода].",
+ 'config-unicode-update-warning' => "'''Предупреждение''': уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¾Ð±Ñ‘Ñ€Ñ‚ÐºÐ¸ нормализации Юникода иÑпользует Ñтарую верÑию библиотеки [http://site.icu-project.org/ проекта ICU].
+Ð’Ñ‹ должны [http://www.mediawiki.org/wiki/Unicode_normalization_considerations обновить верÑию], еÑли хотите полноценно иÑпользовать Юникод.",
+ 'config-no-db' => 'Ðе найдено поддержки баз данных!',
+ 'config-no-db-help' => 'Вам необходимо уÑтановить драйвера базы данных Ð´Ð»Ñ PHP.
+ПоддерживаютÑÑ Ñледующие типы баз данных: $1.
+
+ЕÑли вы иÑпользуете виртуальный хоÑтинг, обратитеÑÑŒ к Ñвоему хоÑтинг-провайдеру Ñ Ð¿Ñ€Ð¾Ñьбой уÑтановить подходÑщий драйвер базы данных.
+ЕÑли вы Ñкомпилировали PHP Ñами, Ñконфигурируйте его Ñнова Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ клиентом базы данных, например, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <code>./configure --with-mysql</code>.
+ЕÑли вы уÑтановили PHP из пакетов Debian или Ubuntu, то вам также необходимо уÑтановить модуль php5-mysql.',
+ 'config-no-fts3' => "'''Внимание''': SQLite Ñобран без Ð¼Ð¾Ð´ÑƒÐ»Ñ [http://sqlite.org/fts3.html FTS3] — поиÑк не будет работать Ð´Ð»Ñ Ñтой базы данных.",
+ 'config-register-globals' => "'''Внимание: PHP-Ð¾Ð¿Ñ†Ð¸Ñ <code>[http://php.net/register_globals register_globals]</code> включена.'''
+'''Отключите её, еÑли Ñто возможно.'''
+MediaWiki будет работать, но Ñто Ñнизит безопаÑноÑÑ‚ÑŒ Ñервера и увеличит риÑк Ð¿Ñ€Ð¾Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¸Ð·Ð²Ð½Ðµ.",
+ 'config-magic-quotes-runtime' => "'''Проблема: включена Ð¾Ð¿Ñ†Ð¸Ñ PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''
+Это приводит к непредÑказуемой порче вводимых данных.
+УÑтановка и иÑпользование MediaWiki без Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции невозможно.",
+ 'config-magic-quotes-sybase' => "'''Проблема: включена Ð¾Ð¿Ñ†Ð¸Ñ PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''
+Это приводит к непредÑказуемой порче вводимых данных.
+УÑтановка и иÑпользование MediaWiki без Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции невозможно.",
+ 'config-mbstring' => "'''Проблема: включена Ð¾Ð¿Ñ†Ð¸Ñ PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''
+Это приводит к ошибкам и непредÑказуемой порче вводимых данных.
+УÑтановка и иÑпользование MediaWiki без Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции невозможно.",
+ 'config-ze1' => "'''Проблема: включена Ð¾Ð¿Ñ†Ð¸Ñ PHP [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''
+Это приводит к катаÑтрофичеÑким ÑбоÑм в MediaWiki.
+УÑтановка и иÑпользование MediaWiki без Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции невозможно.",
+ 'config-safe-mode' => "'''Предупреждение:''' PHP работает в [http://www.php.net/features.safe-mode «безопаÑном режиме»].
+Это может привеÑти к проблемам, оÑобенно Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¾Ð¹ файлов и вÑтавкой математичеÑких формул.",
+ 'config-xml-bad' => 'XML-модуль РÐР отÑутÑтвует.
+MediaWiki не будет работать в Ñтой конфигурации, так как требуетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð» Ñтого модулÑ.
+ЕÑли вы работаете в Mandrake, уÑтановите PHP XML-пакет.',
+ 'config-pcre' => 'Модуль поддержки PCRE не найден.
+Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ MediaWiki требуетÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° Perl-ÑовмеÑтимых регулÑрных выражений.',
+ 'config-pcre-no-utf8' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°'''. Модуль PCRE Ð´Ð»Ñ PHP, похоже, Ñобран без поддержки PCRE_UTF8.
+MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы.",
+ 'config-memory-raised' => 'Ограничение на доÑтупную PHP памÑÑ‚ÑŒ (<code>memory_limit</code>) поднÑто Ñ $1 до $2.',
+ 'config-memory-bad' => "'''Внимание:''' размер PHP <code>memory_limit</code> ÑоÑтавлÑет $1.
+ВероÑтно, Ñтого Ñлишком мало.
+УÑтановка может потерпеть неудачу!",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] уÑтановлен',
+ 'config-apc' => '[http://www.php.net/apc APC] уÑтановлен',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] уÑтановлен',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] уÑтановлен',
+ 'config-no-cache' => "'''Внимание:''' Ðе найдены [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
+КÑширование объектов будет отключено.",
+ 'config-diff3-bad' => 'GNU diff3 не найден.',
+ 'config-imagemagick' => 'Обнаружен ImageMagick: <code>$1</code>.
+Возможно отображение миниатюр изображений, еÑли вы разрешите закачки файлов.',
+ 'config-gd' => 'Ðайдена вÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° GD.
+ВозможноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€ изображений будет включена, еÑли вы включите их загрузку.',
+ 'config-no-scaling' => 'Ðе удалоÑÑŒ найти вÑтроенную библиотеку GD или ImageMagick.
+ВозможноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€ изображений будет отключена.',
+ 'config-no-uri' => "'''Ошибка:''' Ðе могу определить текущий URI.
+УÑтановка прервана.",
+ 'config-uploads-not-safe' => "'''Внимание:''' директориÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº (<code>$1</code>) уÑзвима к выполнению произвольных Ñкриптов.
+Ð¥Ð¾Ñ‚Ñ MediaWiki проверÑет вÑе загружаемые файлы на наличие угроз, наÑтоÑтельно рекомендуетÑÑ [http://www.mediawiki.org/wiki/Manual:Security#Upload_security закрыть данную уÑзвимоÑÑ‚ÑŒ] перед включением загрузки файлов.",
+ 'config-brokenlibxml' => 'Ð’ вашей ÑиÑтеме имеетÑÑ Ñочетание верÑий PHP и libxml2, могущее привеÑти к Ñкрытым повреждениÑм данных в MediaWiki и других веб-приложениÑÑ….
+Обновите PHP до верÑии 5.2.9 или Ñтарше и libxml2 до 2.7.3 или Ñтарше ([http://bugs.php.net/bug.php?id=45996 ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± ошибке]).
+УÑтановка прервана.',
+ 'config-using531' => 'PHP $1 не ÑовмеÑтим Ñ MediaWiki из-за ошибки Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸-ÑÑылками при вызовах <code>__call()</code>.
+ОбновитеÑÑŒ до PHP 5.3.2 и выше, или откатитеÑÑŒ до PHP 5.3.0, чтобы избежать Ñтой проблемы.
+УÑтановка прервана.',
+ 'config-db-type' => 'Тип базы данных:',
+ 'config-db-host' => 'ХоÑÑ‚ базы данных:',
+ 'config-db-host-help' => 'ЕÑли Ñервер базы данных находитÑÑ Ð½Ð° другом Ñервере, введите здеÑÑŒ его Ð¸Ð¼Ñ Ñ…Ð¾Ñта или IP-адреÑ.
+
+ЕÑли вы иÑпользуете виртуальный хоÑтинг, ваш провайдер должен указать правильное Ð¸Ð¼Ñ Ñ…Ð¾Ñта в Ñвоей документации.
+
+ЕÑли вы уÑтанавливаете ÑиÑтему на Ñервере под Windows и иÑпользуете MySQL, Ð¸Ð¼Ñ Ñервера «localhost» может не работать. Ð’ Ñтом Ñлучае попробуйте указать «127.0.0.1».',
+ 'config-db-host-oracle' => 'TNS базы данных:',
+ 'config-db-host-oracle-help' => 'Введите дейÑтвительный [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файл tnsnames.ora должен быть видимым Ð´Ð»Ñ Ñтой инÑталлÑции. <br />При иÑпользовании клиентÑких библиотек верÑии 10g и Ñтарше также возможно иÑпользовать метод Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñтой вики',
+ 'config-db-name' => 'Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных:',
+ 'config-db-name-help' => 'Выберите название-идентификатор Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ вики.
+Оно не должно Ñодержать пробелов.
+
+ЕÑли вы иÑпользуете виртуальный хоÑтинг, провайдер или выдаÑÑ‚ вам конкретное Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных, или позволит Ñоздавать базы данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ панели управлениÑ.',
+ 'config-db-name-oracle' => 'Схема базы данных:',
+ 'config-db-account-oracle-warn' => 'ПоддерживаютÑÑ Ñ‚Ñ€Ð¸ ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ ÑƒÑтановки Oracle в качеÑтве базы данных:
+
+ЕÑли вы хотите Ñоздать учётную запиÑÑŒ базы данных в процеÑÑе уÑтановки, пожалуйÑта, укажите учётную запиÑÑŒ роли SYSDBA Ð´Ð»Ñ ÑƒÑтановки и укажите желаемые Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи Ñ Ð²ÐµÐ±-доÑтупом. вы также можете учётную запиÑÑŒ Ñ Ð²ÐµÐ±-доÑтупом вручную и указать только её (еÑли у неё еÑÑ‚ÑŒ необходимые Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° Ñоздание объектов Ñхемы) или указать две учётные запиÑи, одну Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð², а другую Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми Ð´Ð»Ñ Ð²ÐµÐ±-доÑтупа.
+
+Сценарий Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ð¼Ð¸ привилегиÑми можно найти в папке «maintenance/oracle/» Ñтой программы уÑтановки. Имейте в виду, что иÑпользование ограниченной учётной запиÑи приведёт к отключению вÑех возможноÑтей обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи по умолчанию.',
+ 'config-db-install-account' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ð´Ð»Ñ ÑƒÑтановки',
+ 'config-db-username' => 'Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð°Ð·Ñ‹ данных:',
+ 'config-db-password' => 'Пароль базы данных:',
+ 'config-db-password-empty' => 'ПожалуйÑта, введите пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð°Ð·Ñ‹ данных «$1».
+Ð¥Ð¾Ñ‚Ñ Ð¸ возможно Ñоздание пользователей без паролей, Ñто небезопаÑно.',
+ 'config-db-install-username' => 'Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных в процеÑÑе уÑтановки.
+Это не Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ MediaWiki, Ñто Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных.',
+ 'config-db-install-password' => 'Введите пароль, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных в процеÑÑе уÑтановки.
+Это не пароль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ MediaWiki, Ñто пароль Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных.',
+ 'config-db-install-help' => 'Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа уÑтановки.',
+ 'config-db-account-lock' => 'ИÑпользовать то же Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð¹ работы',
+ 'config-db-wiki-account' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð¹ работы',
+ 'config-db-wiki-help' => 'Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð¹ работы вики.
+ЕÑли такой учётной запиÑи не ÑущеÑтвует, а уÑÑ‚Ð°Ð½Ð¾Ð²Ð¾Ñ‡Ð½Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ имеет доÑтаточно привилегий, то Ð¾Ð±Ñ‹Ñ‡Ð½Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ будет Ñоздана Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾ необходимыми Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ вики привилегиÑми.',
+ 'config-db-prefix' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ† базы данных:',
+ 'config-db-prefix-help' => 'ЕÑли вам нужно делить одну базу данных между неÑколькими вики, или между MediaWiki и другими веб-приложениÑми, вы можете добавить Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ Ð²Ñех имён таблиц.
+Ðе иÑпользуйте пробелы.
+
+Это поле обычно оÑтаётÑÑ Ð¿ÑƒÑтым.',
+ 'config-db-charset' => 'Ðабор Ñимволов базы данных',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 бинарнаÑ',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 обратно ÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ñ UTF-8',
+ 'config-charset-help' => "'''Внимание.''' ЕÑли вы иÑпользуете '''обратно ÑовмеÑтый UTF-8''' на MySQL 4.1+ и Ñоздаёте резервные копии базы данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <code>mysqldump</code>, то вÑе не-ASCII Ñимволы могут быть иÑкажены, а Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¾ÐºÐ°Ð¶ÐµÑ‚ÑÑ Ð½ÐµÐ³Ð¾Ð´Ð½Ð¾Ð¹!
+
+Ð’ '''бинарном режиме''' MediaWiki хранит юникодный текÑÑ‚ в базе в виде двоичных полей.
+Это более Ñффективно, чем MySQL в режиме UTF-8, позволÑет иÑпользовать полный набор Ñимволов Юникода.
+Ð’ '''режиме UTF-8''' MySQL будет знать к какому набору Ñимволу отноÑÑÑ‚ÑÑ Ð²Ð°ÑˆÐ¸ данные, Ñможет предÑтавлÑÑ‚ÑŒ и преобразовать их надлежащим образом (буква РокажетÑÑ Ð¿Ñ€Ð¸ Ñортировке поÑле буквы Е, а не поÑле буквы Я, как в бинарном режиме),
+но не позволит вам ÑохранÑÑ‚ÑŒ Ñимволы, выходÑщие за пределы [http://ru.wikipedia.org/wiki/Символы,_предÑтавленные_в_Юникоде#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D0.B0.D1.8F_.D0.BC.D0.BD.D0.BE.D0.B3.D0.BE.D1.8F.D0.B7.D1.8B.D0.BA.D0.BE.D0.B2.D0.B0.D1.8F_.D0.BF.D0.BB.D0.BE.D1.81.D0.BA.D0.BE.D1.81.D1.82.D1.8C BMP].",
+ 'config-mysql-old' => 'Ðеобходим MySQL $1 или более позднÑÑ Ð²ÐµÑ€ÑиÑ. У Ð²Ð°Ñ ÑƒÑтановлен MySQL $2.',
+ 'config-db-port' => 'Порт базы данных:',
+ 'config-db-schema' => 'Схема Ð´Ð»Ñ MediaWiki',
+ 'config-db-schema-help' => 'Эта Ñхема обычно работают хорошо.
+ИзменÑйте её только еÑли знаете, что вам Ñто нужно.',
+ 'config-sqlite-dir' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… SQLite:',
+ 'config-sqlite-dir-help' => "SQLite хранит вÑе данные в одном файле.
+
+ДиректориÑ, которую вы должны указать, должна быть доÑтупна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи веб-Ñервером во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки.
+
+Она '''не должна''' быть доÑтупна через Интернет, поÑтому не должна Ñовпадать Ñ Ñ‚Ð¾Ð¹, где хранÑÑ‚ÑÑ PHP файлы.
+
+УÑтановщик запишет в Ñту директорию файл <code>.htaccess</code>, но еÑли Ñто не Ñработает, кто-нибудь может получить доÑтуп ко вÑей базе данных.
+Ð’ Ñтой базе находитÑÑ Ð² том чиÑле и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пользователÑÑ… (адреÑа Ñлектронной почты, Ñ…Ñши паролей), а также удалённые Ñтраницы и другие Ñекретные данные о вики.
+
+По возможноÑти, раÑположите базу данных где-нибудь в Ñтороне, например, в <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'ПроÑтранÑтво таблиц по умолчанию:',
+ 'config-oracle-temp-ts' => 'Временное проÑтранÑтво таблиц:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-support-info' => 'MediaWiki поддерживает Ñледующие СУБД:
+
+$1
+
+ЕÑли вы не видите Ñвоей ÑиÑтемы Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в Ñтом ÑпиÑке, Ñледуйте инÑтрукциÑм, на которые еÑÑ‚ÑŒ ÑÑылка выше, чтобы получить поддержку.',
+ 'config-support-mysql' => '* $1 — оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð±Ð°Ð·Ð° данных Ð´Ð»Ñ MediaWiki, и лучше поддерживаетÑÑ ([http://www.php.net/manual/en/mysql.installation.php инÑтрукциÑ, как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ MySQL])',
+ 'config-support-postgres' => '* $1 — популÑÑ€Ð½Ð°Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð¡Ð£Ð‘Ð”, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php инÑтрукциÑ, как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ PostgreSQL]). Могут вÑтречатьÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ðµ неиÑправленные ошибки, не рекомендуетÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² рабочей ÑиÑтеме.',
+ 'config-support-sqlite' => '* $1 — Ñто легковеÑÐ½Ð°Ñ ÑиÑтема баз данных, Ð¸Ð¼ÐµÑŽÑ‰Ð°Ñ Ð¾Ñ‡ÐµÐ½ÑŒ хорошую поддержку. ([http://www.php.net/manual/en/pdo.installation.php инÑтрукциÑ, как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ SQLite], работающей поÑредÑтвом PDO)',
+ 'config-support-oracle' => '* $1 — Ñто коммерчеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных маÑштаба предприÑтиÑ. ([http://www.php.net/manual/en/oci8.installation.php Как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ OCI8])',
+ 'config-header-mysql' => 'ÐаÑтройки MySQL',
+ 'config-header-postgres' => 'ÐаÑтройки PostgreSQL',
+ 'config-header-sqlite' => 'ÐаÑтройки SQLite',
+ 'config-header-oracle' => 'ÐаÑтройки Oracle',
+ 'config-invalid-db-type' => 'Ðеверный тип базы данных',
+ 'config-missing-db-name' => 'Ð’Ñ‹ должны ввеÑти значение параметра Â«Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных»',
+ 'config-missing-db-host' => 'Ðеобходимо ввеÑти значение параметра «Сервер базы данных»',
+ 'config-missing-db-server-oracle' => 'Вы должны заполнить поле «TNS базы данных»',
+ 'config-invalid-db-server-oracle' => 'Ðеверное Ð¸Ð¼Ñ TNS базы данных «$1».
+ИÑпользуйте только Ñимволы ASCII (a-z, A-Z), цифры (0-9), знаки Ð¿Ð¾Ð´Ñ‡Ñ‘Ñ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (_) и точки (.).',
+ 'config-invalid-db-name' => 'Ðеверное Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных «$1».
+ИÑпользуйте только ASCII-Ñимволы (a-z, A-Z), цифры (0-9), знак Ð¿Ð¾Ð´Ñ‡Ñ‘Ñ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (_) и дефиÑ(-).',
+ 'config-invalid-db-prefix' => 'Ðеверный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð±Ð°Ð·Ñ‹ данных «$1».
+ИÑпользуйте только буквы ASCII (a-z, A-Z), цифры (0-9), знак Ð¿Ð¾Ð´Ñ‡Ñ‘Ñ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (_) и Ð´ÐµÑ„Ð¸Ñ (-).',
+ 'config-connection-error' => '$1.
+
+Проверьте хоÑÑ‚, Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль и попробуйте ещё раз.',
+ 'config-invalid-schema' => 'ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ñхема Ð´Ð»Ñ MediaWiki «$1».
+ИÑпользуйте только ASCII Ñимволы (a-z, A-Z), цифры(0-9) и знаки подчёркиваниÑ(_).',
+ 'config-db-sys-create-oracle' => 'Программа уÑтановки поддерживает только иÑпользование SYSDBA Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ учётной запиÑи.',
+ 'config-db-sys-user-exists-oracle' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ «$1». SYSDBA может иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ учётной запиÑи!',
+ 'config-postgres-old' => 'Ðеобходим PostgreSQL $1 или более позднÑÑ Ð²ÐµÑ€ÑиÑ. У Ð²Ð°Ñ ÑƒÑтановлен PostgreSQL $2.',
+ 'config-sqlite-name-help' => 'Выберите имÑ-идентификатор Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ вики.
+Ðе иÑпользуйте дефиÑÑ‹ и пробелы.
+Эта Ñтрока будет иÑпользоватьÑÑ Ð² имени файла SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Ðе удалоÑÑŒ Ñоздать директорию данных <nowiki><code>$1</code></nowiki>, так как у веб-Ñервера нет прав запиÑи в родительÑкую директорию <nowiki><code>$2</code></nowiki>.
+
+УÑтановщик определил пользователÑ, под которым работает веб-Ñервер.
+Сделайте директорию <nowiki><code>$3</code></nowiki> доÑтупной Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи и продолжите.
+Ð’ Unix/Linux ÑиÑтеме выполните:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Ðе удалоÑÑŒ Ñоздать директорию Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… <code><nowiki>$1</nowiki></code>, так как у веб-Ñервера нет прав на запиÑÑŒ в родительÑкую директорию <code><nowiki>$2</nowiki></code>.
+
+Программа уÑтановки не Ñмогла определить пользователÑ, под которым работает веб-Ñервер.
+Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñделайте каталог <code><nowiki>$3</nowiki></code> глобально доÑтупным Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Ñерверу (и другим).
+Ð’ Unix/Linux Ñделайте:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Ошибка при Ñоздании директории Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… «$1».
+Проверьте раÑположение и повторите попытку.',
+ 'config-sqlite-dir-unwritable' => 'Ðевозможно произвеÑти запиÑÑŒ в каталог «$1».
+Измените наÑтройки доÑтупа так, чтобы веб-Ñервер мог запиÑывать в Ñтот каталог, и попробуйте ещё раз.',
+ 'config-sqlite-connection-error' => '$1.
+
+Проверьте название базы данных и директорию Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ и попробуйте ещё раз.',
+ 'config-sqlite-readonly' => 'Файл <code>$1</code> недоÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи.',
+ 'config-sqlite-cant-create-db' => 'Ðе удаётÑÑ Ñоздать файл базы данных <code>$1</code> .',
+ 'config-sqlite-fts3-downgrade' => 'У PHP отÑутÑтвует поддержка FTS3 — ÑбраÑываем таблицы',
+ 'config-can-upgrade' => "В базе данных найдены таблицы MediaWiki.
+Чтобы обновить их до MediaWiki $1, нажмите на кнопку '''«Продолжить»'''.",
+ 'config-upgrade-done' => "Обновление завершено.
+
+Теперь вы можете [$1 начать иÑпользовать вики].
+
+ЕÑли вы хотите повторно Ñоздать файл <code>LocalSettings.php</code>, нажмите на кнопку ниже.
+Это дейÑтвие '''не рекомендуетÑÑ''', еÑли у Ð²Ð°Ñ Ð½Ðµ возникло проблем при уÑтановке.",
+ 'config-upgrade-done-no-regenerate' => 'Обновление завершено.
+
+Теперь вы можете [$1 начать работу Ñ Ð²Ð¸ÐºÐ¸].',
+ 'config-regenerate' => 'Создать LocalSettings.php заново →',
+ 'config-show-table-status' => 'Ð—Ð°Ð¿Ñ€Ð¾Ñ Â«SHOW TABLE STATUS» не выполнен!',
+ 'config-unknown-collation' => "'''Внимание:''' База данных иÑпользует нераÑпознанные правила Ñортировки.",
+ 'config-db-web-account' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ð´Ð»Ñ Ð´Ð¾Ñтупа к базе данных из веб-Ñервера',
+ 'config-db-web-help' => 'Выберите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль, которые веб-Ñервер будет иÑпользовать Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу базы данных при обычной работе вики.',
+ 'config-db-web-account-same' => 'ИÑпользовать ту же учётную запиÑÑŒ, что и Ð´Ð»Ñ ÑƒÑтановки',
+ 'config-db-web-create' => 'Создать учётную запиÑÑŒ, еÑли она ещё не ÑущеÑтвует',
+ 'config-db-web-no-create-privs' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ ÑƒÑтановки, не обладает доÑтаточными правами Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи.
+Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð·Ð´ÐµÑÑŒ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже должна ÑущеÑтвовать.',
+ 'config-mysql-engine' => 'Движок базы данных:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' почти вÑегда предпочтительнее, так как он лучше ÑправлÑетÑÑ Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ð¼ доÑтупом.
+
+'''MyISAM''' может оказатьÑÑ Ð±Ñ‹Ñтрее Ð´Ð»Ñ Ð²Ð¸ÐºÐ¸ Ñ Ð¾Ð´Ð½Ð¸Ð¼ пользователем или Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¼ количеÑтвом поÑтупающих правок, однако базы данных на нём портÑÑ‚ÑÑ Ñ‡Ð°Ñ‰Ðµ, чем на InnoDB.",
+ 'config-mysql-charset' => 'Ðабор Ñимволов (ÐºÐ¾Ð´Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°) базы данных:',
+ 'config-mysql-binary' => 'Двоичный',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "Ð’ '''двоичном режиме''' MediaWiki хранит UTF-8 текÑÑ‚ в бинарных полÑÑ… базы данных.
+Это более Ñффективно, чем ''UTF-8 режим'' MySQL, и позволÑет иÑпользовать полный набор Ñимволов Unicode.
+
+Ð’ '''режиме UTF-8''' MySQL будет знать в какой кодировке находÑÑ‚ÑÑ Ð’Ð°ÑˆÐ¸ данные и может отображать и преобразовывать их ÑоответÑтвующим образом, но Ñто не позволит вам хранить Ñимволы выше [http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой МногоÑзыковой ПлоÑкоÑти].",
+ 'config-site-name' => 'Ðазвание вики:',
+ 'config-site-name-help' => 'Ðазвание будет отображатьÑÑ Ð² заголовке окна браузера и в некоторых других меÑтах вики.',
+ 'config-site-name-blank' => 'Введите название Ñайта.',
+ 'config-project-namespace' => 'ПроÑтранÑтво имён проекта:',
+ 'config-ns-generic' => 'Проект',
+ 'config-ns-site-name' => 'То же, что Ð¸Ð¼Ñ Ð²Ð¸ÐºÐ¸: $1',
+ 'config-ns-other' => 'Другое (укажите)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => "Ð¡Ð»ÐµÐ´ÑƒÑ Ð¿Ñ€Ð¸Ð¼ÐµÑ€Ñƒ Википедии, многие вики хранÑÑ‚ Ñвои Ñтраницы правил отдельно от Ñтраниц оÑновного ÑодержаниÑ, в так называемом '''«проÑтранÑтве имён проекта»'''.
+Ð’Ñе Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñтраниц в Ñтом проÑтранÑтве имён начинаетÑÑ Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ префикÑа, который вы можете задать здеÑÑŒ.
+Обычно, Ñтот Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¾Ð¸Ñходит от имени вики, но он не может Ñодержать знаки препинаниÑ, Ñимволы «#» или «:».",
+ 'config-ns-invalid' => 'Указанное проÑтранÑтво имён <nowiki>$1</nowiki> недопуÑтимо.
+Укажите другое проÑтранÑтво имён проекта.',
+ 'config-ns-conflict' => 'Указанное проÑтранÑтво имён «<nowiki>$1</nowiki>» конфликтует Ñо Ñтандартным проÑтранÑтвом имён MediaWiki.
+Укажите другое проÑтранÑтво имён проекта.',
+ 'config-admin-box' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ админиÑтратора',
+ 'config-admin-name' => 'ИмÑ:',
+ 'config-admin-password' => 'Пароль:',
+ 'config-admin-password-confirm' => 'Пароль ещё раз:',
+ 'config-admin-help' => 'Введите ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð·Ð´ÐµÑÑŒ, например, «Иван Иванов».
+Это Ð¸Ð¼Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в вики.',
+ 'config-admin-name-blank' => 'Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора.',
+ 'config-admin-name-invalid' => 'Указанное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Â«<nowiki>$1</nowiki>» недопуÑтимо.
+Укажите другое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ.',
+ 'config-admin-password-blank' => 'Введите пароль Ð´Ð»Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи админиÑтратора.',
+ 'config-admin-password-same' => 'Пароль не должен быть таким же, как Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ.',
+ 'config-admin-password-mismatch' => 'Введённые вами пароли не Ñовпадают.',
+ 'config-admin-email' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты:',
+ 'config-admin-email-help' => 'Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, чтобы получать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ других пользователей вики, иметь возможноÑÑ‚ÑŒ воÑÑтановить пароль, а также получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± изменениÑÑ… Ñтраниц из ÑпиÑка наблюдениÑ. Ð’Ñ‹ можете оÑтавить Ñто поле пуÑтым.',
+ 'config-admin-error-user' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при Ñоздании учётной запиÑи админиÑтратора Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «<nowiki>$1</nowiki>».',
+ 'config-admin-error-password' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при уÑтановке Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи админиÑтратора «<nowiki>$1</nowiki>»: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Ð’Ñ‹ ввели неправильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
+ 'config-subscribe' => 'ПодпиÑатьÑÑ Ð½Ð° [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce раÑÑылку новоÑтей о поÑвлении новых верÑий MediaWiki].',
+ 'config-subscribe-help' => 'Это ÑпиÑок раÑÑылки Ñ Ð¼Ð°Ð»Ñ‹Ð¼ чиÑлом Ñообщений, иÑпользуетÑÑ Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ñа новых выпуÑков и Ñообщений о проблемах Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑтью.
+Вам Ñледует подпиÑатьÑÑ Ð½Ð° него и обновлÑÑ‚ÑŒ движок MediaWiki, по мере выхода новых верÑий.',
+ 'config-almost-done' => 'Вы почти у цели!
+ОÑтальные наÑтройки можно пропуÑтить и приÑтупить к уÑтановке вики.',
+ 'config-optional-continue' => 'ПроизвеÑти тонкую наÑтройку',
+ 'config-optional-skip' => 'Хватит, уÑтановить вики',
+ 'config-profile' => 'Профиль прав прользователей:',
+ 'config-profile-wiki' => 'Ð¢Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð²Ð¸ÐºÐ¸',
+ 'config-profile-no-anon' => 'ТребуетÑÑ Ñоздание учётной запиÑи',
+ 'config-profile-fishbowl' => 'Только Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… редакторов',
+ 'config-profile-private' => 'Ð—Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²Ð¸ÐºÐ¸',
+ 'config-profile-help' => "Вики-Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð»ÑƒÑ‡ÑˆÐµ вÑего работает, когда вы позволÑете редактировать Ñайт макÑимально широкому кругу лиц.
+Ð’ MediaWiki легко проÑмотреть поÑледних изменений и, при необходимоÑти, откатить любой ущерб Ñделанный злоумышленниками или наивными пользователÑми.
+
+Однако, движок MediaWiki можно иÑпользовать и иными ÑпоÑобами, и не далеко не вÑех удаётÑÑ ÑƒÐ±ÐµÐ´Ð¸Ñ‚ÑŒ в преимущеÑтвах открытой вики-работы.
+Так что в Ð²Ð°Ñ ÐµÑÑ‚ÑŒ выбор.
+
+ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ '''«{{int:config-profile-wiki}}»''' позволÑет вÑем править Ñтраницы даже не региÑтрируÑÑÑŒ на Ñайте. ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ '''{{int:config-profile-no-anon}}''' обеÑпечивает дополнительный учёт, но может отÑечь Ñлучайных учаÑтников.
+
+Сценарий '''«{{int:config-profile-fishbowl}}»''' разрешает редактирование только определённым учаÑтникам, но общедоÑтупным оÑтаётÑÑ Ð¿Ñ€Ð¾Ñмотр Ñтраниц, в том чиÑле проÑмотр иÑтории изменениÑ. Ð’ режиме '''«{{int:config-profile-private}}»''' проÑмотр Ñтраниц разрешён только определённым пользователÑм, какаÑ-то их чаÑÑ‚ÑŒ может иметь также права на редактирование.
+
+Более Ñложные Ñхемы Ñ€Ð°Ð·Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² можно наÑтроить поÑле уÑтановки, Ñм. [http://www.mediawiki.org/wiki/Manual:User_rights ÑоответÑтвующее руководÑтво].",
+ 'config-license' => 'ÐвторÑкие права и лицензии:',
+ 'config-license-none' => 'Ðе указывать лицензию в колонтитуле внизу Ñтраницы',
+ 'config-license-cc-by-sa' => 'Creative Commons Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ â€” Ñ Ñохранением уÑловий',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-license-gfdl-current' => 'GNU Free Documentation License 1.3 или более поздней верÑии',
+ 'config-license-pd' => 'ОбщеÑтвенное доÑтоÑние',
+ 'config-license-cc-choose' => 'Выберите одну из лицензий Creative Commons',
+ 'config-license-help' => "Многие общедоÑтупные вики разрешают иÑпользовать Ñвои материалы на уÑловиÑÑ… [http://freedomdefined.org/Definition/Ru Ñвободных лицензий].
+Это помогает Ñозданию чувÑтва общноÑти, Ñтимулирует долгоÑрочное учаÑтие.
+Ðо в Ñтом нет необходимоÑти Ð´Ð»Ñ Ñ‡Ð°Ñтных или корпоративных вики.
+
+ЕÑли вы хотите иÑпользовать текÑÑ‚Ñ‹ из Википедии или хотите, что в Википедию можно было копировать текÑÑ‚Ñ‹ из вашей вики, вам Ñледует выбрать '''Creative Commons Attribution Share Alike'''.
+
+GNU Free Documentation License раньше была оÑновной лицензией Википедии.
+Она вÑе ещё иÑпользуетÑÑ, однако, она имеет некоторые оÑобенноÑти, оÑложнÑющие повторное иÑпользование и интерпретацию её материалов.",
+ 'config-email-settings' => 'ÐаÑтройки Ñлектронной почты',
+ 'config-enable-email' => 'Включить иÑходÑщие e-mail',
+ 'config-enable-email-help' => 'ЕÑли вы хотите, чтобы ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° работала, необходимо выполнить [http://www.php.net/manual/en/mail.configuration.php ÑоответÑтвующие наÑтройки PHP].
+ЕÑли вы не хотите иÑпользовать возможноÑти Ñлектронной почты в вики, вы можете её отключить.',
+ 'config-email-user' => 'Включить Ñлектронную почту от учаÑтника к учаÑтнику',
+ 'config-email-user-help' => 'Разрешить вÑем пользователÑм отправлÑÑ‚ÑŒ друг другу Ñлектронные пиÑьма, еÑли выÑтавлена ÑоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð½Ð°Ñтройка в профиле.',
+ 'config-email-usertalk' => 'Включить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ о ÑообщениÑÑ… на их Ñтранице обÑуждениÑ',
+ 'config-email-usertalk-help' => 'Разрешить пользователÑм получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± изменениÑÑ… Ñвоих Ñтраниц обÑуждениÑ, еÑли они разрешат Ñто в Ñвоих наÑтройках.',
+ 'config-email-watchlist' => 'Включить уведомление на Ñлектронную почту об изменении ÑпиÑка наблюдениÑ',
+ 'config-email-watchlist-help' => 'Разрешить пользователÑм получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± отÑлеживаемых ими Ñтраницах, еÑли они разрешили Ñто в Ñвоих наÑтройках.',
+ 'config-email-auth' => 'Включить аутентификацию через Ñлектронную почту',
+ 'config-email-auth-help' => "ЕÑли Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, пользователи должны подтвердить Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð¿Ð¾ ÑÑылке, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÑетÑÑ Ð½Ð° e-mail. Подтверждение требуетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз при Ñмене Ñлектронного Ñщика в наÑтройках пользователÑ.
+Только прошедшие проверку подлинноÑти адреÑа Ñлектронной почты, могут получать Ñлектронные пиÑьма от других пользователей или изменÑÑ‚ÑŒ уведомлениÑ, отправлÑемые по Ñлектронной почте.
+Включение Ñтой опции '''рекомендуетÑÑ''' Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ñ… вики в целÑÑ… преÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ñ… злоупотреблений возможноÑÑ‚Ñми Ñлектронной почты.",
+ 'config-email-sender' => 'Обратный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:',
+ 'config-email-sender-help' => 'Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве обратного адреÑа иÑходÑщей Ñлектронной почты.
+Ðа него будут отправлÑÑ‚ÑŒÑÑ Ð¾Ñ‚ÐºÐ°Ð·Ñ‹.
+Многие почтовые Ñерверы требуют, чтобы по крайней мере доменное Ð¸Ð¼Ñ Ð² нём было правильным.',
+ 'config-upload-settings' => 'Загрузка изображений и файлов',
+ 'config-upload-enable' => 'Разрешить загрузку файлов',
+ 'config-upload-help' => 'Разрешение загрузки файлов, потенциально, может привеÑти к угрозе безопаÑноÑти Ñервера.
+Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации, прочтите в руководÑтве [http://www.mediawiki.org/wiki/Manual:Security раздел, поÑвÑщённый безопаÑноÑти].
+
+Чтобы разрешить загрузку файлов, необходимо изменить права на каталог <code>images</code>, в корневой директории MediaWiki так, чтобы веб-Ñервер мог запиÑывать в него файлы.
+Затем включите Ñту опцию.',
+ 'config-upload-deleted' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ñ… файлов:',
+ 'config-upload-deleted-help' => 'Выберите каталог, в котором будут хранитьÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ñ‹ удалённых файлов.
+Ð’ идеальном Ñлучае, в Ñтот каталог не должно быть доÑтупа из Ñети Интернет.',
+ 'config-logo' => 'URL логотипа:',
+ 'config-logo-help' => 'Тема по умолчанию Ð´Ð»Ñ MediaWiki включает проÑтранÑтво Ð´Ð»Ñ Ð»Ð¾Ð³Ð¾Ñ‚Ð¸Ð¿Ð° размером 135x160 в левом верхнем углу.
+Загрузите изображение ÑоответÑтвующего размера, и введите его URL здеÑÑŒ.
+
+ЕÑли вам не нужен логотип, оÑтавьте Ñто поле пуÑтым.',
+ 'config-instantcommons' => 'Включить Instant Commons',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons Instant Commons] — Ñто функциÑ, позволÑÑŽÑ‰Ð°Ñ Ð¸Ñпользовать изображениÑ, звуки и другие медиафайлы Ñ Ð’Ð¸ÐºÐ¸Ñклада ([http://commons.wikimedia.org/ Wikimedia Commons]).
+Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñтой функции MediaWiki необходим доÑтуп к Интернету.
+
+Дополнительную информацию об Instant Commons, в том чиÑле ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾ том, как её наÑтроить Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… вики, отличных от ВикиÑклада, можно найти в [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos руководÑтве].',
+ 'config-cc-error' => 'Механизм выбора лицензии Creative Commons не вернул результата.
+Введите название лицензии вручную.',
+ 'config-cc-again' => 'Выберите ещё раз…',
+ 'config-cc-not-chosen' => 'Выберите, какую лицензию Creative Commons Ð’Ñ‹ хотите иÑпользовать, и нажмите кнопку "Продолжить".',
+ 'config-advanced-settings' => 'Дополнительные наÑтройки',
+ 'config-cache-options' => 'Параметры кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²:',
+ 'config-cache-help' => 'КÑширование объектов иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÑкороÑти MediaWiki путем кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñто иÑпользуемых данных.
+Ð”Ð»Ñ Ñредних и больших Ñайтов кеширование наÑтоÑтельно рекомендуетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒ, а Ð´Ð»Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ñ… Ñайтов кеширование может показать преимущеÑтво.',
+ 'config-cache-none' => 'Без кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (никакой функционал не терÑетÑÑ, но крупные вики-Ñайты могут работать медленнее)',
+ 'config-cache-accel' => 'PHP кÑширование объектов (APC, eAccelerator, XCache или WinCache)',
+ 'config-cache-memcached' => 'ИÑпользовать Memcached (требует дополнительной наÑтройки)',
+ 'config-memcached-servers' => 'Сервера Memcached:',
+ 'config-memcached-help' => 'СпиÑок IP-адреÑов, иÑпользуемых Memcached.
+ПеречиÑлите по одному адреÑу на Ñтроку Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ портов. Ðапример:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Ð’Ñ‹ выбрали тип кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Memcached, но не задали адреÑа Ñерверов.',
+ 'config-memcache-badip' => 'Ð’Ñ‹ ввели неверный IP-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Memcached: $1.',
+ 'config-memcache-noport' => 'Ðе указан порт Ð´Ð»Ñ Ñервера Memcached: $1.
+ЕÑли вы не знаете порт, по умолчанию иÑпользуетÑÑ 11211.',
+ 'config-memcache-badport' => 'Ðомера портов Memcached должны лежать в пределах от $1 до $2.',
+ 'config-extensions' => 'РаÑширениÑ',
+ 'config-extensions-help' => 'РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ MediaWiki, перечиÑленные выше, были найдены в каталоге <code>./extensions</code>.
+
+Они могут потребовать дополнительные наÑтройки, но их можно включить прÑмо ÑейчаÑ',
+ 'config-install-alreadydone' => "'''Предупреждение:''' Ð’Ñ‹, кажетÑÑ, уже уÑтанавливали MediaWiki и пытаетеÑÑŒ произвеÑти повторную уÑтановку.
+ПожалуйÑта, перейдите на Ñледующую Ñтраницу.",
+ 'config-install-begin' => 'Ðажав «{{int:config-continue}}», вы начнёте уÑтановку MediaWiki.
+ЕÑли вы хотите внеÑти изменениÑ, нажмите «Ðазад».',
+ 'config-install-step-done' => 'выполнено',
+ 'config-install-step-failed' => 'не удалоÑÑŒ',
+ 'config-install-extensions' => 'Ð’ том чиÑле раÑширениÑ',
+ 'config-install-database' => 'ÐаÑтройка базы данных',
+ 'config-install-pg-schema-not-exist' => 'Схемы PostgreSQL не ÑущеÑтвует',
+ 'config-install-pg-schema-failed' => 'Ðе удалоÑÑŒ Ñоздать таблицы.
+УбедитеÑÑŒ в том, что пользователь «$1» может пиÑать в Ñхему «$2».',
+ 'config-install-pg-commit' => 'ВнеÑение изменений',
+ 'config-install-pg-plpgsql' => 'Проверка Ñзыка PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Вам необходимо уÑтановить поддержку Ñзыка PL/pgSQL Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных $1',
+ 'config-pg-no-create-privs' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ ÑƒÑтановки, не обладает доÑтаточными привилегиÑми Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи.',
+ 'config-install-user' => 'Создание базы данных пользователей',
+ 'config-install-user-alreadyexists' => 'УчаÑтник «$1» уже ÑущеÑтвует',
+ 'config-install-user-create-failed' => 'Ðе получилоÑÑŒ Ñоздать учаÑтника «$1»: $2',
+ 'config-install-user-grant-failed' => 'Ошибка предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² пользователю «$1»: $2',
+ 'config-install-tables' => 'Создание таблиц',
+ 'config-install-tables-exist' => "'''Предупреждение''': таблицы MediaWiki, возможно, уже ÑущеÑтвуют.
+ПропуÑк повторного ÑозданиÑ.",
+ 'config-install-tables-failed' => "'''Ошибка''': Таблица не может быть Ñоздана из-за ошибки: $1",
+ 'config-install-interwiki' => 'Заполнение таблицы интервики значениÑми по умолчанию',
+ 'config-install-interwiki-list' => 'Ðе удалоÑÑŒ найти файл <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Предупреждение''': в интервики-таблице, кажетÑÑ, уже еÑÑ‚ÑŒ запиÑи.
+Создание Ñтандартного ÑпиÑка, пропущено.",
+ 'config-install-stats' => 'СтатиÑтика инициализации',
+ 'config-install-keys' => 'Создание Ñекретного ключа',
+ 'config-insecure-keys' => "'''Предупреждение.''' {{PLURAL:$2|Ключ безопаÑноÑти $1, Ñозданный во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки, недоÑтаточно надёжен|Ключи безопаÑноÑти $1, Ñозданные во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки, недоÑтаточно надёжны}}. РаÑÑмотрите возможноÑÑ‚ÑŒ {{PLURAL:$2|его|их}} Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ.",
+ 'config-install-sysop' => 'Создание учётной запиÑи админиÑтратора',
+ 'config-install-subscribe-fail' => 'Ðе удаётÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑатьÑÑ Ð½Ð° mediawiki-announce',
+ 'config-install-mainpage' => 'Создание главной Ñтраницы Ñ Ñодержимым по умолчанию',
+ 'config-install-extension-tables' => 'Создание таблиц Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ñ‹Ñ… раÑширений',
+ 'config-install-mainpage-failed' => 'Ðе удаётÑÑ Ð²Ñтавить главную Ñтраницу: $1',
+ 'config-install-done' => "'''ПоздравлÑем!'''
+Ð’Ñ‹ уÑпешно уÑтановили MediaWiki.
+
+Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки был Ñоздан файл <code>LocalSettings.php</code>.
+Он Ñодержит вÑÑŽ конфигурации вики.
+
+Вам необходимо Ñкачать его и положить в корневую директорию вашей вики (ту же директорию, где находитÑÑ Ñ„Ð°Ð¹Ð» index.php). Его загрузка должна начатьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.
+
+ЕÑли автоматичеÑÐºÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° не началаÑÑŒ или вы её отменили, вы можете Ñкачать по ÑÑылке ниже:
+
+$3
+
+'''Примечание''': ЕÑли вы не Ñделаете Ñтого ÑейчаÑ, то Ñгенерированный файл конфигурации не будет доÑтупен вам в дальнейшем, еÑли вы выйдете из уÑтановки, не ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ñ ÐµÐ³Ð¾.
+
+По окончании дейÑтвий, опиÑанных выше, вы Ñможете '''[$2 войти в вашу вики]'''.",
+ 'config-download-localsettings' => 'Загрузить LocalSettings.php',
+ 'config-help' => 'Ñправка',
+);
+
+/** Slovenian (SlovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'config-desc' => 'Namestitveni program za MediaWiki',
+ 'config-title' => 'Namestitev MediaWiki $1',
+ 'config-information' => 'Informacije',
+ 'config-your-language' => 'Vaš jezik:',
+ 'config-back' => '↠Nazaj',
+ 'config-continue' => 'Nadaljuj →',
+ 'config-page-language' => 'Jezik',
+ 'config-page-welcome' => 'Dobrodošli na MediaWiki!',
+ 'config-page-name' => 'Ime',
+ 'config-page-options' => 'Možnosti',
+ 'config-page-install' => 'Namesti',
+ 'config-page-complete' => 'KonÄano!',
+ 'config-page-readme' => 'Beri me',
+ 'config-page-copying' => 'Kopiranje',
+ 'config-page-upgradedoc' => 'Nadgrajevanje',
+ 'config-db-name' => 'Ime zbirke podatkov:',
+ 'config-db-username' => 'Uporabniško ime zbirke podatkov:',
+ 'config-db-password' => 'Geslo zbirke podatkov:',
+ 'config-admin-password' => 'Geslo:',
+);
+
+/** Serbian Cyrillic ekavian (‪СрпÑки (ћирилица)‬) */
+$messages['sr-ec'] = array(
+ 'config-continue' => 'ÐаÑтави →',
+ 'config-page-language' => 'Језик',
+);
+
+/** Swedish (Svenska)
+ * @author WikiPhoenix
+ */
+$messages['sv'] = array(
+ 'config-desc' => 'Installationsprogram för MediaWiki',
+ 'config-title' => 'Installation av MediaWiki $1',
+ 'config-information' => 'Information',
+ 'config-localsettings-key' => 'Uppgraderingsnyckel:',
+ 'config-localsettings-badkey' => 'Nyckeln du angav är inkorrekt.',
+ 'config-session-error' => 'Fel vid uppstart av session: $1',
+ 'config-your-language' => 'Ditt språk:',
+ 'config-your-language-help' => 'Välj ett språk som ska användas under installationen.',
+ 'config-wiki-language' => 'Wikispråk:',
+ 'config-wiki-language-help' => 'Välj det språk som wikin främst kommer att skrivas i.',
+ 'config-back' => '↠Tillbaka',
+ 'config-continue' => 'Fortsätt →',
+ 'config-page-language' => 'Språk',
+ 'config-page-welcome' => 'Välkommen till MediaWiki!',
+ 'config-page-dbconnect' => 'Anslut till databas',
+ 'config-page-upgrade' => 'Uppgradera existerande installation',
+ 'config-page-dbsettings' => 'Databasinställningar',
+ 'config-page-name' => 'Namn',
+ 'config-page-options' => 'Alternativ',
+ 'config-page-install' => 'Installera',
+ 'config-page-complete' => 'Slutfört!',
+ 'config-page-restart' => 'Starta om installationen',
+ 'config-page-readme' => 'Läs mig',
+ 'config-page-releasenotes' => 'Utgivningsanteckningar',
+ 'config-page-copying' => 'Kopiering',
+ 'config-page-upgradedoc' => 'Uppgradering',
+ 'config-help-restart' => 'Vill du rensa all sparad data som du har skrivit in och starta om installationen?',
+ 'config-restart' => 'Ja, starta om',
+ 'config-sidebar' => '* [http://www.mediawiki.org MediaWikis hemsida]
+* [http://www.mediawiki.org/wiki/Help:Contents Användarguide]
+* [http://www.mediawiki.org/wiki/Manual:Contents Administratörguide]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Frågor och svar]
+----
+* <doclink href=Readme>Läs mig</doclink>
+* <doclink href=ReleaseNotes>Utgivningsanteckningar</doclink>
+* <doclink href=Copying>Kopiering</doclink>
+* <doclink href=UpgradeDoc>Uppgradering</doclink>',
+ 'config-env-good' => 'Miljön har kontrollerats.
+Du kan installera MediaWiki.',
+ 'config-env-bad' => 'Miljön har kontrollerats.
+Du kan inte installera MediaWiki.',
+ 'config-env-php' => 'PHP $1 är installerad.',
+ 'config-env-php-toolow' => 'PHP $1 är installerad.
+MediaWiki kräver PHP $2 eller högre.',
+ 'config-header-mysql' => 'MySQL-inställningar',
+ 'config-header-postgres' => 'PostgreSQL-inställningar',
+ 'config-header-sqlite' => 'SQLite-inställningar',
+ 'config-header-oracle' => 'Oracle-inställningar',
+ 'config-invalid-db-type' => 'Ogiltig databastyp',
+ 'config-missing-db-name' => 'Du måste ange ett värde för "Databasnamn"',
+ 'config-missing-db-host' => 'Du måste ange ett värde för "Databasvärd"',
+ 'config-invalid-db-name' => '"$1" är ett ogiltigt databasnamn.
+Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
+ 'config-invalid-db-prefix' => '"$1" är ett ogiltigt databasprefix.
+Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
+ 'config-connection-error' => '$1.
+
+Kontrollera värden, användarnamnet och lösenordet nedan och försök igen',
+ 'config-invalid-schema' => '"$1" är ett ogiltigt schema för MediaWiki.
+Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
+);
+
+/** Tamil (தமிழà¯)
+ * @author TRYPPN
+ */
+$messages['ta'] = array(
+ 'config-information' => 'தகவலà¯',
+ 'config-your-language' => 'தஙà¯à®•à®³à®¤à¯ மொழி:',
+ 'config-back' => '↠மà¯à®¨à¯à®¤à¯ˆà®¯',
+ 'config-continue' => 'தொடரவà¯à®®à¯ →',
+ 'config-page-language' => 'மொழி',
+ 'config-page-name' => 'பெயரà¯',
+ 'config-page-options' => 'விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'config-desc' => 'మీడియావికీ కొరకై à°¸à±à°¥à°¾à°ªà°•à°¿',
+ 'config-title' => 'మీడియావికీ $1à°¸à±à°¥à°¾à°ªà°¨',
+ 'config-information' => 'సమాచారం',
+ 'config-your-language' => 'మీ భాష:',
+ 'config-wiki-language' => 'వికీ భాష:',
+ 'config-back' => '↠వెనకà±à°•à°¿',
+ 'config-continue' => 'కొనసాగించౠ→',
+ 'config-page-language' => 'భాష',
+ 'config-page-welcome' => 'మీడియావికీకి à°¸à±à°µà°¾à°—తం!',
+ 'config-page-dbsettings' => 'డాటాబేసౠఅమరికలà±',
+ 'config-page-name' => 'పేరà±',
+ 'config-page-options' => 'ఎంపికలà±',
+ 'config-page-install' => 'à°¸à±à°¥à°¾à°ªà°¿à°‚à°šà±',
+ 'config-page-complete' => 'పూరà±à°¤à°¯à±à°¯à°¿à°‚ది!',
+ 'config-page-readme' => 'ననà±à°¨à± చదవండి',
+ 'config-page-releasenotes' => 'విడà±à°¦à°² విశేషాలà±',
+ 'config-db-type' => 'డాటాబేసౠరకం:',
+ 'config-db-name' => 'డాటాబేసౠపేరà±:',
+ 'config-db-install-account' => 'à°¸à±à°¥à°¾à°ªà°¨à°•à°¿ వాడà±à°•à°°à°¿ ఖాతా',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-header-mysql' => 'MySQL అమరికలà±',
+ 'config-header-postgres' => 'PostgreSQL అమరికలà±',
+ 'config-header-sqlite' => 'SQLite అమరికలà±',
+ 'config-header-oracle' => 'Oracle అమరికలà±',
+ 'config-invalid-db-type' => 'తపà±à°ªà±à°¡à± డాటాబేసౠరకం',
+ 'config-connection-error' => '$1.
+
+à°•à±à°°à°¿à°‚ది హోసà±à°Ÿà±, వాడà±à°•à°°à°¿à°ªà±‡à°°à± మరియౠసంకేతపదాలనౠఒకసారి సరిచూసà±à°•à±à°¨à°¿ à°…à°ªà±à°ªà±à°¡à± à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'వికీ యొకà±à°• పేరà±:',
+ 'config-ns-other' => 'ఇతర (ఇవà±à°µà°‚à°¡à°¿)',
+ 'config-admin-name' => 'మీ పేరà±:',
+ 'config-admin-password' => 'సంకేతపదం:',
+ 'config-admin-password-confirm' => 'సంకేతపదం మళà±à°³à±€:',
+ 'config-admin-email' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
+ 'config-profile-wiki' => 'సంపà±à°°à°¦à°¾à°¯ వికీ',
+ 'config-profile-no-anon' => 'ఖాతా సృషà±à°Ÿà°¿à°‚పౠతపà±à°ªà°¨à°¿à°¸à°°à°¿',
+ 'config-profile-private' => 'అంతరంగిక వికీ',
+ 'config-license' => 'కాపీహకà±à°•à±à°²à± మరియౠలైసెనà±à°¸à±:',
+ 'config-license-pd' => 'సారà±à°µà°œà°¨à±€à°¨à°‚',
+ 'config-email-settings' => 'à°ˆ-మెయిలౠఅమరికలà±',
+ 'config-upload-deleted' => 'తొలగించిన దసà±à°¤à±à°°à°¾à°² కొరకౠసంచయం:',
+ 'config-install-step-done' => 'పూరà±à°¤à°¯à°¿à°‚ది',
+ 'config-install-step-failed' => 'విఫలమైంది',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ * @author Sky Harbor
+ */
+$messages['tl'] = array(
+ 'config-desc' => 'Ang instalador para sa MediaWiki',
+ 'config-title' => 'Instalasyong $1 ng MediaWiki',
+ 'config-information' => 'Kabatiran',
+ 'config-localsettings-key' => 'Susi ng pagsasapanahon:',
+ 'config-localsettings-badkey' => 'Hindi tama ang susing ibinigay mo.',
+ 'config-session-error' => 'Kamalian sa pagsisimula ng sesyon: $1',
+ 'config-no-session' => 'Nawala ang iyong datos ng sesyon!
+Suriin ang iyong php.ini at tiyakin na ang <code>session.save_path</code> ay nakatakda sa angkop na direktoryo.',
+ 'config-your-language' => 'Ang wika mo:',
+ 'config-your-language-help' => 'Pumili ng isang wikang gagamitin habang isinasagawa ang pagtatalaga.',
+ 'config-wiki-language' => 'Wika ng Wiki:',
+ 'config-wiki-language-help' => 'Piliin ang wika kung saan mangingibabaw na isusulat ang wiki.',
+ 'config-back' => '↠Bumalik',
+ 'config-continue' => 'Magpatuloy →',
+ 'config-page-language' => 'Wika',
+ 'config-page-welcome' => 'Maligayang pagdating sa MediaWiki!',
+ 'config-page-dbconnect' => 'Umugnay sa kalipunan ng datos',
+ 'config-page-upgrade' => 'Itaas ng uri ang umiiral na pagkakatalaga',
+ 'config-page-dbsettings' => 'Mga katakdaan ng kalipunan ng datos',
+ 'config-page-name' => 'Pangalan',
+ 'config-page-options' => 'Mga mapipili',
+ 'config-page-install' => 'Italaga',
+ 'config-page-complete' => 'Buo na!',
+ 'config-page-restart' => 'Simulan muli ang pag-iinstala',
+ 'config-page-readme' => 'Basahin ako',
+ 'config-page-releasenotes' => 'Pakawalan ang mga tala',
+ 'config-page-copying' => 'Kinokopya',
+ 'config-page-upgradedoc' => 'Itinataas ang uri',
+ 'config-page-existingwiki' => 'Umiiral na wiki',
+ 'config-help-restart' => 'Nais mo bang hawiin ang lahat ng nasagip na datong ipinasok mo at muling simulan ang proseso ng pagluluklok?',
+ 'config-restart' => 'Oo, muling simulan ito',
+ 'config-welcome' => '=== Pagsusuring pangkapaligiran ===
+Isinasagawa ang payak na mga pagsusuri upang makita kung ang kapaligirang ito ay angkop para sa pagluluklok ng MediaWiki.
+Dapat mong ibigay ang mga kinalabasan ng mga pagsusuring ito kung kailangan mo ng tulong habang nagluluklok.',
+ 'config-copyright' => "=== Karapatang-ari at Tadhana ===
+
+$1
+
+Ang programang ito ay malayang software; maaari mo itong ipamahagi at/o baguhin sa ilalim ng mga tadhana ng Pangkalahatang Pampublikong Lisensiyang GNU ayon sa pagkakalathala ng Free Software Foundation; na maaaring bersyong 2 ng Lisensiya, o (kung nais mo) anumang susunod na bersyon.
+
+Ipinamamahagi ang programang ito na umaasang magiging gamitin, subaliut '''walang anumang katiyakan'''; na walang pahiwatig ng '''pagiging mabenta''' o '''kaangkupan para sa isang tiyak na layunin'''.
+Tingnan ang Pangkalahatang Pampublikong Lisensiyang GNU para sa mas maraming detalye.
+
+Dapat nakatanggap ka ng <doclink href=Copying>isang sipi ng Pangkalahatang Pampublikong Lisensiyang GNU</doclink> kasama ng programang ito; kung hindi, sumulat sa Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/licenses//gpl.html basahin ito sa Internet].",
+ 'config-sidebar' => '* [http://www.mediawiki.org Tahanan ng MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents Gabay ng Tagagamit]
+* [http://www.mediawiki.org/wiki/Manual:Contents Gabay ng Tagapangasiwa]
+* [http://www.mediawiki.org/wiki/Manual:FAQ Mga Malimit Itanong]
+----
+* <doclink href=Readme>Basahin ako</doclink>
+* <doclink href=ReleaseNotes>Mga tala ng paglalabas</doclink>
+* <doclink href=Copying>Pagkopya</doclink>
+* <doclink href=UpgradeDoc>Pagsasapanahon</doclink>',
+ 'config-env-good' => 'Nasuri na ang kapaligiran.
+Mailuluklok mo ang MediaWiki.',
+ 'config-env-bad' => 'Nasuri na ang kapaligiran.
+Hindi mo mailuklok ang MediaWiki.',
+ 'config-env-php' => 'Naitalaga ang PHP na $1.',
+ 'config-env-php-toolow' => 'Naitalaga ang PHP $1.
+Subalit, nangangailangan ang MediaWiki ng PHP $2 o mas mataas pa.',
+ 'config-unicode-using-utf8' => 'Ginagamit ang utf8_normalize.so ni Brion Vibber para sa pagpapanormal ng Unikodigo.',
+ 'config-unicode-using-intl' => 'Ginagamit ang [http://pecl.php.net/intl intl dugtong na PECL] para sa pagsasanormal ng Unikodigo.',
+ 'config-no-db' => 'Hindi matagpuan ang isang angkop na drayber ng kalipunan ng datos!',
+ 'config-memory-raised' => 'Ang <code>hangganan_ng_alaala</code> ng PHP ay $1, itinaas sa $2.',
+ 'config-memory-bad' => "'''Babala:''' Ang <code>hangganan_ng_alaala</code> ng PHP ay $1.
+Ito ay maaaring napakababa.
+Maaaring mabigo ang pagluluklok!",
+ 'config-xcache' => 'Ininstala na ang [http://trac.lighttpd.net/xcache/ XCache]',
+ 'config-apc' => 'Ininstala na ang [http://www.php.net/apc APC]',
+ 'config-eaccel' => 'Ininstala na ang [http://eaccelerator.sourceforge.net/ eAccelerator]',
+ 'config-wincache' => 'Ininstala na ang [http://www.iis.net/download/WinCacheForPhp WinCache]',
+ 'config-no-cache' => "'''Babala:''' Hindi mahanap ang [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://trac.lighttpd.net/xcache/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
+Hindi pinapagana ang pagbabaon ng mga bagay.",
+ 'config-diff3-bad' => 'Hindi natagpuan ang GNU diff3.',
+ 'config-imagemagick' => 'Natagpuan ang ImageMagick: <code>$1</code>.
+Papaganahin ang pagkakagyat ng larawan kapag pinagana mo ang mga pagkakargang paitaas.',
+ 'config-no-scaling' => 'Hindi matagpuan ang aklatang GD o ImageMagick.
+Hindi papaganahin ang pagkakagyat ng larawan.',
+ 'config-no-uri' => "'''Kamalian:''' Hindi matukoy ang kasalukuyang URI.
+Pinigilan ang pag-iinstala.",
+ 'config-db-type' => 'Uri ng kalipunan ng datos:',
+ 'config-db-host' => 'Tagapagpasinaya ng kalipunan ng datos:',
+ 'config-db-host-oracle' => 'TNS ng kalipunan ng dato:',
+ 'config-db-wiki-settings' => 'Kilalanin ang wiking ito',
+ 'config-db-name' => 'Pangalan ng kalipunan ng dato:',
+ 'config-db-install-account' => 'Akawnt ng tagagamit para sa pagluluklok',
+ 'config-db-username' => 'Pangalang pangtagagamit ng kalipunan ng dato:',
+ 'config-db-password' => 'Hudyat sa kalipunan ng dato:',
+ 'config-db-install-help' => 'Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.',
+ 'config-db-account-lock' => 'Gamitin ang gayun ding pangalan ng tagagamit at hudyat habang nasa normal na operasyon',
+ 'config-db-wiki-account' => 'Akawnt ng tagagamit para sa pangkaraniwang pagpapaandar',
+ 'config-db-prefix' => 'Unlapi ng talahanayan ng kalipunan ng dato:',
+ 'config-db-charset' => 'Pangkat ng panitik ng kalipunan ng dato',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binaryo',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 paurong-kabagay UTF-8',
+ 'config-mysql-old' => 'Hindi kailangan ang MySQL na $1 o mas bago, mayroon kang $2.',
+ 'config-db-port' => 'Daungan ng kalipunan ng dato:',
+ 'config-db-schema' => 'Panukala para sa MediaWiki',
+ 'config-db-schema-help' => 'Ang nasa itaas na panukala ay pangkaraniwang magiging maayos.
+Baguhin lamang ito kung alam mong kinakailangan.',
+ 'config-sqlite-dir' => 'Direktoryo ng dato ng SQLite:',
+ 'config-oracle-def-ts' => 'Likas na nakatakdang puwang ng talahanayan:',
+ 'config-oracle-temp-ts' => 'Pansamantalang puwang ng talahanayan:',
+ 'config-header-mysql' => 'Mga katakdaan ng MySQL',
+ 'config-header-postgres' => 'Mga katakdaan ng PostgreSQL',
+ 'config-header-sqlite' => 'Mga katakdaan ng SQLite',
+ 'config-header-oracle' => 'Mga katakdaan ng Oracle',
+ 'config-invalid-db-type' => 'Hindi tanggap na uri ng kalipunan ng dato',
+ 'config-missing-db-name' => 'Dapat kang magpasok ng isang halaga para sa "pangalan ng Kalipunan ng Dao"',
+ 'config-invalid-db-name' => 'Hindi tanggap na pangalan ng kalipunan ng dato na "$1".
+Gumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), mga salangguhit (_) at mga gitling (-).',
+ 'config-invalid-db-prefix' => 'Hindi tanggap na unlapi ng kalipunan ng dato na "$1".
+Gamitin lamang ang mga titik na ASCII (a-z, A-Z), mga bilang (0-9), mga salangguhit (_) at mga gitling (-).',
+ 'config-postgres-old' => 'Kailangan ang PostgreSQL $1 o mas bago, mayroon kang $2.',
+ 'config-sqlite-readonly' => 'Ang talaksang <code>$1</code> ay hindi maisusulat.',
+ 'config-sqlite-cant-create-db' => 'Hindi malikha ang talaksang <code>$1</code> ng kalipunan ng dato.',
+ 'config-sqlite-fts3-downgrade' => 'Nawawala ang suportang FTS3 ng PHP, ibinababa ang uri ng mga talahanayan',
+ 'config-regenerate' => 'Muling likhain ang LocalSettings.php →',
+ 'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!',
+ 'config-db-web-account' => 'Akawnt ng kalipunan ng dato para sa pagpunta sa web',
+ 'config-db-web-help' => 'Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.',
+ 'config-db-web-account-same' => 'Gamitin ang gayun din akawnt katulad ng sa pagluluklok',
+ 'config-db-web-create' => 'Likhain ang akawnt kung hindi pa ito umiiral',
+ 'config-mysql-engine' => 'Makinang imbakan:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-charset' => 'Pangkat ng panitik ng kalipunan ng dato:',
+ 'config-mysql-binary' => 'Binaryo',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Pangalan ng wiki:',
+ 'config-site-name-help' => "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
+ 'config-site-name-blank' => 'Magpasok ng isang pangalan ng sityo.',
+ 'config-project-namespace' => 'Puwang na pampangalan ng proyekto:',
+ 'config-ns-generic' => 'Proyekto',
+ 'config-ns-site-name' => 'Katulad ng sa pangalan ng wiki: $1',
+ 'config-ns-other' => 'Iba pa (tukuyin)',
+ 'config-ns-other-default' => 'Wiki Ko',
+ 'config-admin-box' => 'Akawnt ng tagapangasiwa',
+ 'config-admin-name' => 'Pangalan mo:',
+ 'config-admin-password' => 'Hudyat:',
+ 'config-admin-password-confirm' => 'Hudyat uli:',
+ 'config-admin-name-blank' => 'Magpasok ng isang pangalan ng tagagamit na tagapangasiwa.',
+ 'config-admin-name-invalid' => 'Ang tinukoy na pangalan ng tagagamit na "<nowiki>$1</nowiki>" ay hindi tanggap.
+Tumukoy ng ibang pangalan ng tagagamit.',
+ 'config-admin-password-blank' => 'Magpasok ng isang hudyat para sa akawnt ng tagapangasiwa.',
+ 'config-admin-password-same' => 'Ang hudyat ay hindi dapat na katulad ng pangalan ng tagagamit.',
+ 'config-admin-password-mismatch' => 'Hindi magkatugma ang ipinasok mong dalawang mga hudyat.',
+ 'config-admin-email' => 'Tirahan ng e-liham:',
+ 'config-admin-error-user' => 'Panloob na kamalian kapag nililikha ang isang tagapangasiwa na may pangalang "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Panloob na kamalian kapag nagtatakda ng isang hudyat na para sa tagapangasiwang "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-subscribe' => 'Tumanggap mula sa [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce talaan ng mga pinadadalhan ng mga nilalabas na mga pabatid].',
+ 'config-almost-done' => 'Halos tapos ka na!
+Maaari mo ngayong laktawan ang natitira pang pag-aayos at iluklok na ang wiki ngayon.',
+ 'config-optional-continue' => 'Magtanong sa akin ng marami pang mga tanong.',
+ 'config-optional-skip' => 'Naiinip na ako, basta iluklok na lang ang wiki.',
+ 'config-profile' => 'Balangkas ng mga karapatan ng tagagamit:',
+ 'config-profile-wiki' => 'Tradisyonal na wiki',
+ 'config-profile-no-anon' => 'Kailangan ang paglikha ng akawnt',
+ 'config-profile-fishbowl' => 'Pinahintulutang mga patnugot lamang',
+ 'config-profile-private' => 'Pribadong wiki',
+ 'config-license' => 'Karapatang-ari at lisensiya:',
+ 'config-license-none' => 'Walang talababa ng lisensiya',
+ 'config-license-cc-by-sa' => 'Malikhaing Pangkaraniwang Pagtukoy Pamamahaging Magkatulad',
+ 'config-license-cc-by-nc-sa' => 'Malikhaing Pangkaraniwang Pagtukoy Hindi-Pangkalakal Pamamahaging Magkatulad',
+ 'config-license-gfdl-old' => 'Lisensiya ng Malayang Dokumenstasyon 1.2 ng GNU',
+ 'config-license-gfdl-current' => 'Lisensiya ng Malayang Dokumenstasyon 1.3 ng GNU o mas bago',
+ 'config-license-pd' => 'Nasasakupan ng Madla',
+ 'config-license-cc-choose' => 'Pumili ng isang pasadyang Lisensiya ng Malikhaing mga Pangkaraniwan',
+ 'config-email-settings' => 'Mga katakdaan ng e-liham',
+ 'config-enable-email' => 'Paganahin ang palabas na e-liham',
+ 'config-email-user' => 'Paganahin ang tagagamit-sa-tagagamit na e-liham',
+ 'config-email-user-help' => 'Payagan ang lahat ng mga tagagamit na magpadala ng e-liham sa bawat isa kapag pinagana nila ito sa kanilang mga nais.',
+ 'config-email-usertalk' => 'Paganahin ang pabatid na pampahina ng usapan ng tagagamit',
+ 'config-email-usertalk-help' => 'Payagan ang mga tagagamit na tumanggap ng mga pabatid sa mga pagbabago ng pahina ng usapan ng tagagamit, kapag pinagana nila ito sa kanilang mga nais.',
+ 'config-email-watchlist' => 'Paganahin ang pabatid ng talaan ng bantayan',
+ 'config-email-watchlist-help' => 'Payagan ang mga tagagamit na tumanggap ng mga pabatid tungkol sa kanilang binabantayang mga pahina kapag pinagana nila ito sa kanilang mga nais.',
+ 'config-email-auth' => 'Paganahin ang pagpapatunay ng e-liham',
+ 'config-email-sender' => 'Pabalik na tirahan ng e-liham:',
+ 'config-upload-settings' => 'Mga pagkakarga ng mga larawan at talaksan',
+ 'config-upload-enable' => 'Paganahin ang pagkakarga ng talaksan',
+ 'config-upload-deleted' => 'Direktoryo para sa binurang mga talaksan:',
+ 'config-upload-deleted-help' => 'Pumili ng isang direktoryong pagsusupnayan ng naburang mga talaksan.
+Ideyal na dapat itong hindi mapupuntahan mula sa web.',
+ 'config-logo' => 'URL ng logo:',
+ 'config-instantcommons' => 'Paganahin ang Mga Pangkaraniwang Biglaan',
+ 'config-cc-error' => 'Hindi nagbigay ng resulta ang pampili ng lisensiya ng Malikhaing Pangkaraniwan.
+Ipasok na kinakamay ang pangalan ng lisensiya.',
+ 'config-cc-again' => 'Pumili uli...',
+ 'config-cc-not-chosen' => 'Piliin kung anong lisensiya ng Malikhaing mga Pangkaraniwan ang nais mo at pindutin ang "magpatuloy".',
+ 'config-advanced-settings' => 'Mas masulong na pagkakaayos',
+ 'config-cache-options' => 'Mga katakdaan para sa pagtatago ng bagay:',
+ 'config-memcached-servers' => 'Mga tagapaghaing itinago sa alaala:',
+ 'config-memcache-needservers' => 'Pinili mo ang Memcached bilang uri mo ng taguan ngunit hindi tumukoy ng anumang mga tagapaghain.',
+ 'config-memcache-badip' => 'Nagpasok ka ng isang hindi tanggap na tirahan ng IP para sa Memcached: $1.',
+ 'config-memcache-noport' => 'Hindi ka tumukoy ng isang daungan na gagamitin para sa tagapaghain ng Memcached: $1.
+Kung hindi mo alam ang daungan, ang likas na nakatakda ay 11211.',
+ 'config-memcache-badport' => 'Ang bilang ng daungan ng Memcached ay dapat na nasa pagitan ng $1 at $2.',
+ 'config-extensions' => 'Mga dugtong',
+ 'config-install-step-done' => 'nagawa na',
+ 'config-install-step-failed' => 'nabigo',
+ 'config-install-extensions' => 'Isinasama ang mga karugtong',
+ 'config-install-database' => 'Inihahanda ang kalipunan ng dato',
+ 'config-install-pg-schema-failed' => 'Nabigo ang paglikha ng mga talahanayan.
+Tiyakin na ang tagagamit na "$1" ay maaaring makasulat sa balangkas na "$2".',
+ 'config-install-pg-commit' => 'Isinasagawa ang mga pagbabago',
+ 'config-install-pg-plpgsql' => 'Sumusuri ng wikang PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Kailangan mong magtalaga ng wikang PL/pgSQL sa loob ng kalipunan ng datong $1',
+ 'config-pg-no-create-privs' => 'Ang tinukoy mong akawnt para sa pagtatalaga ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.',
+ 'config-install-user' => 'Nililikha ang tagagamit ng kalipunan ng dato',
+ 'config-install-user-alreadyexists' => 'Umiiral na ang tagagamit na "$1"',
+ 'config-install-user-create-failed' => 'Nabigo ang paglikha ng tagagamit na "$1": $2',
+ 'config-install-user-grant-failed' => 'Nabigo ang pagbibigay ng pahintulot sa tagagamit na "$1": $2',
+ 'config-install-tables' => 'Nililikha ang mga talahanayan',
+ 'config-install-tables-exist' => "'''Babala''': Tila umiiral na ang mga talahanayan ng MediaWiki.
+Nilalaktawan ang paglikha.",
+ 'config-install-tables-failed' => "'''Kamalian''': Nabigo ang paglikha ng talahanayan na may sumusunod na kamalian: $1",
+ 'config-install-interwiki' => 'Nilalagyan ng laman ang likas na nakatakdang talahanayan ng interwiki',
+ 'config-install-interwiki-list' => 'Hindi matagpuan ang talaksang <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Babala''': Tila may mga laman na ang talahanayan ng interwiki.
+Nilalaktawan ang likas na nakatakdang talaan.",
+ 'config-install-stats' => 'Sinisimulan ang estadistika',
+ 'config-install-keys' => 'Ginagawa ang lihim na susi',
+ 'config-install-sysop' => 'Nililikha ang akawnt ng tagagamit na tagapangasiwa',
+ 'config-install-subscribe-fail' => 'Hindi nagawang sumipi mula sa mediawiki-announce',
+ 'config-install-mainpage' => 'Nililikha ang pangunahing pahina na may likas na nakatakdang nilalaman',
+ 'config-install-extension-tables' => 'Nililikha ang mga talahanayan para sa pinagaganang mga dugtong',
+ 'config-install-mainpage-failed' => 'Hindi maisingit ang pangunahing pahina: $1',
+ 'config-install-done' => "'''Maligayang bati!'''
+Matagumpay mong nailuklok ang MediaWiki.
+
+Ang tagapagluklok ay nakagawa ng isang talaksan ng <code>LocalSettings.php</code>.
+Naglalaman ito ng lahat ng iyong mga pagsasaayos.
+
+Kailangan mo itong ikargang paibaba at ilagay ito sa lipon ng iyong pagluluklok ng wiki (katulad ng direktoryo ng index.php). Ang pagkakargang paibaba ay dapat na kusang magsimula.
+
+Kung ang pagkakargang paibaba ay hindi inialok, o kung hindi mo ito itinuloy, maaari mong muling simulan ang pagkakargang paibaba sa pamamagitan ng pagpindot sa kawing na nasa ibaba:
+
+$3
+
+'''Paunawa''': Kapag hindi mo ito ginawa ngayon, ang nagawang talaksang ito ng pagkakaayos ay hindi mo na makukuha mamaya kapag lumabas ka mula sa pagluluklok na hindi ikinakarga itong paibaba.
+
+Kapag nagawa na iyan, maaari ka nang '''[$2 pumasok sa wiki mo]'''.",
+ 'config-download-localsettings' => 'Ikargang paibaba ang LocalSettings.php',
+ 'config-help' => 'saklolo',
+);
+
+/** Ukrainian (УкраїнÑька)
+ * @author Ahonc
+ * @author Alex Khimich
+ * @author Diemon.ukr
+ * @author ТеÑÑ‚
+ */
+$messages['uk'] = array(
+ 'config-desc' => 'ІнÑталÑтор MediaWiki',
+ 'config-title' => 'Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ MediaWiki $1',
+ 'config-information' => 'ІнформаціÑ',
+ 'config-localsettings-upgrade' => "'''Увага''': було виÑвлено файл <code>LocalSettings.php</code>.
+Ваше програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути оновлено.
+Будь-лаÑка, переміÑÑ‚Ñ–Ñ‚ÑŒ файл <code>LocalSettings.php</code> в іншу безпечну директорію, а потім знову запуÑÑ‚Ñ–Ñ‚ÑŒ програму уÑтановки.",
+ 'config-session-error' => 'Помилка початку ÑеÑÑ–Ñ—: $1',
+ 'config-your-language' => 'Ваша мова:',
+ 'config-your-language-help' => 'Оберіть мову Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² процеÑÑ– уÑтановки.',
+ 'config-wiki-language' => 'Мова Ð´Ð»Ñ Ð²Ñ–ÐºÑ–:',
+ 'config-wiki-language-help' => 'Виберіть мову, Ñкою буде відображатиÑÑ Ð²Ñ–ÐºÑ–.',
+ 'config-back' => '↠Ðазад',
+ 'config-continue' => 'Далі →',
+ 'config-page-language' => 'Мова',
+ 'config-page-welcome' => 'ЛаÑкаво проÑимо на MediaWiki!',
+ 'config-page-dbconnect' => 'ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних',
+ 'config-page-upgrade' => 'ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ñнуючої уÑтановки',
+ 'config-page-dbsettings' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних',
+ 'config-page-name' => 'Ðазва',
+ 'config-page-options' => 'Параметри',
+ 'config-page-install' => 'УÑтановка',
+ 'config-page-complete' => 'Готово!',
+ 'config-page-restart' => 'ПерезапуÑтити уÑтановку',
+ 'config-page-readme' => 'Прочитай мене',
+ 'config-page-releasenotes' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ верÑÑ–ÑŽ',
+ 'config-page-copying' => 'КопіюваннÑ',
+ 'config-page-upgradedoc' => 'ОновленнÑ',
+ 'config-help-restart' => 'Ви бажаєте видалити вÑÑ– введені та збережені вами дані Ñ– запуÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑƒÑтановки Ñпочатку?',
+ 'config-restart' => 'Так, перезапуÑтити уÑтановку',
+ 'config-welcome' => '=== Перевірка Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ ===
+ПроводÑÑ‚ÑŒÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ– перевірки, щоб виÑвити, чи можлива уÑтановка MediaWiki у даній ÑиÑтемі.
+Вкажіть результати цих перевірок при зверненні за допомогою під Ñ‡Ð°Ñ ÑƒÑтановки.',
+ 'config-sidebar' => '* [http://www.mediawiki.org Сайт MediaWiki]
+* [http://www.mediawiki.org/wiki/Help:Contents/uk Керівництво кориÑтувача]
+* [http://www.mediawiki.org/wiki/Manual:Contents/uk Керівництво адмініÑтратора]
+* [http://www.mediawiki.org/wiki/Manual:FAQ/uk FAQ]',
+ 'config-env-good' => 'Перевірку Ñередовища уÑпішно завершено.
+Ви можете вÑтановити MediaWiki.',
+ 'config-env-bad' => 'Було проведено перевірку Ñередовища. Ви не можете вÑтановити MediaWiki.',
+ 'config-env-php' => 'Ð’Ñтановлено верÑÑ–ÑŽ PHP: $1.',
+ 'config-unicode-using-utf8' => 'ВикориÑтовувати utf8_normalize.so Брайона Віббера Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— Юнікоду.',
+ 'config-unicode-using-intl' => 'ВикориÑтовувати [http://pecl.php.net/intl міжнародне Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PECL] Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— Юнікоду.',
+ 'config-unicode-pure-php-warning' => "'''Увага''': [http://pecl.php.net/intl міжнародне Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PECL] не може провеÑти нормалізацію Юнікоду.
+Якщо ваш Ñайт має виÑокий трафік, вам варто почитати про [http://www.mediawiki.org/wiki/Unicode_normalization_considerations нормалізацію Юнікоду].",
+ 'config-no-db' => 'Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідний драйвер бази даних!',
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache] вÑтановлено',
+ 'config-apc' => '[http://www.php.net/apc APC] вÑтановлено',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] вÑтановлено',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] вÑтановлено',
+ 'config-db-type' => 'Тип бази даних:',
+ 'config-db-host' => 'ХоÑÑ‚ бази даних:',
+ 'config-db-name' => 'Ðазва бази даних:',
+ 'config-db-password' => 'Пароль бази даних:',
+ 'config-db-charset' => 'ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних',
+ 'config-db-port' => 'Порт бази даних:',
+ 'config-invalid-db-type' => 'Ðевірний тип бази даних',
+ 'config-invalid-db-name' => 'ÐеприпуÑтима назва бази даних "$1".
+ВикориÑтовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреÑÐ»ÐµÐ½Ð½Ñ (_) Ñ– дефіÑи (-).',
+ 'config-invalid-db-prefix' => 'ÐеприпуÑтимий Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð±Ð°Ð·Ð¸ даних "$1".
+ВикориÑтовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреÑÐ»ÐµÐ½Ð½Ñ (_) Ñ– дефіÑи (-).',
+ 'config-sqlite-cant-create-db' => 'Ðе вдалоÑÑ Ñтворити файл бази даних <code>$1</code>.',
+ 'config-db-web-create' => 'Створити обліковий запиÑ, Ñкщо його ще не Ñ–Ñнує',
+ 'config-mysql-charset' => 'ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних:',
+ 'config-mysql-binary' => 'Двійкове',
+ 'config-site-name' => 'Ðазва вікі:',
+ 'config-site-name-blank' => 'Введіть назву Ñайту.',
+ 'config-project-namespace' => 'ПроÑÑ‚Ñ–Ñ€ назв проекту:',
+ 'config-ns-generic' => 'Проект',
+ 'config-admin-name' => "Ваше ім'Ñ:",
+ 'config-admin-password' => 'Пароль:',
+ 'config-admin-password-confirm' => 'Пароль ще раз:',
+ 'config-admin-password-mismatch' => 'Два введені вами паролі не збігаютьÑÑ.',
+ 'config-admin-email' => 'ÐдреÑа електронної пошти:',
+ 'config-license' => 'ÐвторÑькі права Ñ– ліцензіÑ:',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-gfdl-old' => 'GNU Free Documentation License 1.2',
+ 'config-email-settings' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти',
+ 'config-upload-enable' => 'Дозволити Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²',
+ 'config-upload-deleted' => 'Каталог Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ… файлів:',
+ 'config-cc-again' => 'Виберіть знову ...',
+ 'config-extensions' => 'РозширеннÑ',
+ 'config-install-step-done' => 'виконано',
+ 'config-install-step-failed' => 'не вдалоÑÑ',
+ 'config-install-interwiki-list' => 'Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл <code>interwiki.list</code>.',
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'config-admin-name' => '×ײַער × ×ָמען:',
+);
+
+/** Simplified Chinese (‪中文(简体)‬)
+ * @author Hydra
+ * @author PhiLiP
+ * @author 阿pp
+ */
+$messages['zh-hans'] = array(
+ 'config-desc' => 'MediaWiki安装程åº',
+ 'config-title' => 'MediaWiki $1é…ç½®',
+ 'config-information' => 'ä¿¡æ¯',
+ 'config-localsettings-upgrade' => '已检测到<code>LocalSettings.php</code>文件。è¦å‡çº§è¯¥é…置,请在下é¢çš„框中输入<code>$wgUpgradeKey</code>的值。您å¯ä»¥åœ¨LocalSettings.php中找到它。',
+ 'config-localsettings-cli-upgrade' => '已检测到LocalSettings.php文件。è¦å‡çº§è¯¥é…置,请使用--upgrade=yes选项。',
+ 'config-localsettings-key' => 'å‡çº§å¯†é’¥ï¼š',
+ 'config-localsettings-badkey' => '您æ供的密钥ä¸æ­£ç¡®ã€‚',
+ 'config-upgrade-key-missing' => '检测到MediaWikiçš„é…置已ç»å­˜åœ¨ã€‚è‹¥è¦å‡çº§è¯¥é…置,请将下é¢ä¸€è¡Œæ–‡æœ¬æ·»åŠ åˆ°LocalSettings.php的底部:
+
+$1',
+ 'config-localsettings-incomplete' => '当å‰çš„LocalSettings.phpå¯èƒ½å¹¶ä¸å®Œæ•´ï¼Œå› ä¸ºå˜é‡$1没有设置。请在LocalSettings.php设置该å˜é‡ï¼Œå¹¶å•å‡»â€œç»§ç»­â€ã€‚',
+ 'config-localsettings-connection-error' => '在使用LocalSettings.php或AdminSettings.php中指定的设置连接数æ®åº“æ—¶å‘生错误。请修å¤ç›¸åº”设置并é‡è¯•ã€‚
+
+$1',
+ 'config-session-error' => 'å¯åŠ¨ä¼šè¯å‡ºé”™ï¼š$1',
+ 'config-session-expired' => '您的会è¯æ•°æ®å¯èƒ½å·²ç»è¿‡æœŸï¼Œå½“å‰ä¼šè¯çš„使用期é™è¢«è®¾å®šä¸º$1。您å¯ä»¥åœ¨php.ini中设置<code>session.gc_maxlifetime</code>æ¥å»¶é•¿æ­¤æœŸé™ï¼Œå¹¶é‡æ–°å¯åŠ¨æœ¬é…置程åºã€‚',
+ 'config-no-session' => '您的会è¯æ•°æ®ä¸¢å¤±äº†ï¼è¯·æ£€æŸ¥php.ini并确ä¿<code>session.save_path</code>被设置为适当的目录。',
+ 'config-your-language' => '您使用的语言:',
+ 'config-your-language-help' => '选择在安装过程中使用的语言。',
+ 'config-wiki-language' => 'Wiki使用的语言:',
+ 'config-wiki-language-help' => '选择将è¦å®‰è£…çš„wiki在多数情况下使用的语言。',
+ 'config-back' => '↠åŽé€€',
+ 'config-continue' => '继续 →',
+ 'config-page-language' => '语言',
+ 'config-page-welcome' => '欢迎使用MediaWikiï¼',
+ 'config-page-dbconnect' => '连接到数æ®åº“',
+ 'config-page-upgrade' => 'å‡çº§å½“å‰é…ç½®',
+ 'config-page-dbsettings' => 'æ•°æ®åº“设置',
+ 'config-page-name' => 'å称',
+ 'config-page-options' => '选项',
+ 'config-page-install' => '安装',
+ 'config-page-complete' => '完æˆï¼',
+ 'config-page-restart' => 'é‡æ–°å¼€å§‹å®‰è£…',
+ 'config-page-readme' => '自述',
+ 'config-page-releasenotes' => 'å‘布说明',
+ 'config-page-copying' => 'å¤åˆ¶',
+ 'config-page-upgradedoc' => 'æ›´æ–°',
+ 'config-page-existingwiki' => '已有wiki',
+ 'config-help-restart' => '是å¦è¦æ¸…除所有已输入且ä¿å­˜çš„æ•°æ®ï¼Œå¹¶é‡æ–°å¯åŠ¨å®‰è£…过程å—?',
+ 'config-restart' => '是的,é‡å¯å§',
+ 'config-welcome' => '=== 环境检查 ===
+对当å‰çŽ¯å¢ƒæ˜¯å¦é€‚åˆå®‰è£…MediaWiki作基本的检查。如果您在安装过程中需è¦å¸®åŠ©ï¼Œè¯·æ供这些检查的结果。',
+ 'config-copyright' => "=== 版æƒå’Œæ¡æ¬¾ ===
+
+\$1
+
+本程åºä¸ºè‡ªç”±è½¯ä»¶ï¼›æ‚¨å¯ä¾æ®è‡ªç”±è½¯ä»¶åŸºé‡‘会所å‘表的GNU通用公共授æƒæ¡æ¬¾è§„定,就本程åºå†ä¸ºå‘布与ï¼æˆ–修改;无论您ä¾æ®çš„是本授æƒçš„第二版或(您自行选择的)任一日åŽå‘行的版本。
+
+本程åºæ˜¯åŸºäºŽä½¿ç”¨ç›®çš„而加以å‘布,然而'''ä¸è´Ÿä»»ä½•æ‹…ä¿è´£ä»»''';亦无对'''适售性'''或'''特定目的适用性'''所为的默示性担ä¿ã€‚详情请å‚ç…§GNU通用公共授æƒã€‚
+
+您应已收到附éšäºŽæœ¬ç¨‹åºçš„<doclink href=\"Copying\">GNU通用公共授æƒçš„副本</doclink>;如果没有,请写信至自由软件基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在线阅读]。",
+ 'config-sidebar' => '* [http://www.mediawiki.org/wiki/MediaWiki/zh-hans MediaWiki首页]
+* [http://www.mediawiki.org/wiki/Help:Contents/zh-hans 用户帮助]
+* [http://www.mediawiki.org/wiki/Manual:Contents 管ç†å‘˜å¸®åŠ©]
+* [http://www.mediawiki.org/wiki/Manual:FAQ/zh-hans 常è§é—®é¢˜è§£ç­”]',
+ 'config-env-good' => '环境检查已ç»å®Œæˆã€‚您å¯ä»¥å®‰è£…MediaWiki。',
+ 'config-env-bad' => '环境检查已ç»å®Œæˆã€‚您ä¸èƒ½å®‰è£…MediaWiki。',
+ 'config-env-php' => 'PHP $1已安装。',
+ 'config-unicode-using-utf8' => '使用Brion Vibber的utf8_normalize.so实现Unicode正常化。',
+ 'config-unicode-using-intl' => '使用[http://pecl.php.net/intl intl PECL扩展]实现Unicode正常化。',
+ 'config-unicode-pure-php-warning' => "'''警告''':[http://pecl.php.net/intl intl PECL扩展]无法处ç†Unicode正常化,故åªèƒ½é€€è€Œé‡‡ç”¨è¿è¡Œè¾ƒæ…¢çš„纯PHP实现的方法。如果您è¿è¡Œç€ä¸€ä¸ªé«˜æµé‡çš„站点,请å‚阅[http://www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正常化]一文。",
+ 'config-unicode-update-warning' => "'''警告''':Unicode正常化å°è£…器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需è¦ä½¿ç”¨Unicode,请将其[http://www.mediawiki.org/wiki/Unicode_normalization_considerations å‡çº§]。",
+ 'config-no-db' => '找ä¸åˆ°åˆé€‚çš„æ•°æ®åº“驱动ï¼',
+ 'config-no-db-help' => '您需è¦ä¸ºPHP安装数æ®åº“驱动。MediaWiki支æŒä¸‹åˆ—æ•°æ®åº“类型:$1
+
+如果您正在使用共享主机,请让您的主机æ供商为您安装适当的数æ®åº“驱动。
+如果PHP由您自行编译,请将其é‡æ–°é…置以å¯ç”¨æ•°æ®åº“客户端,例如使用<code>./configure --with-mysql</code>。
+如果PHP是您通过Debian或Ubuntu包安装的,那么您还需è¦å®‰è£…php5-mysql模å—。',
+ 'config-no-fts3' => "'''警告''':已编译的SQLiteä¸åŒ…å«[http://sqlite.org/fts3.html FTS3模å—],åŽå°æœç´¢åŠŸèƒ½å°†ä¸å¯ç”¨ã€‚",
+ 'config-register-globals' => "'''警告:PHPçš„<code>[http://php.net/register_globals register_globals]</code>选项被å¯ç”¨ã€‚请尽é‡ç¦ç”¨è¯¥åŠŸèƒ½ï¼Œ'''虽然ä¸ä¼šå½±å“MediaWikiçš„è¿è¡Œï¼Œä½†æ‚¨çš„æœåŠ¡å™¨ä¼šè¢«æš´éœ²ç»™æ½œåœ¨çš„安全æ¼æ´žã€‚",
+ 'config-magic-quotes-runtime' => "'''致命错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被å¯ç”¨ï¼'''
+此选项会无法预测地破å输入的数æ®ï¼Œè¯·å°†å…¶ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
+ 'config-magic-quotes-sybase' => "'''致命错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]被å¯ç”¨ï¼'''
+此选项会无法预测地破å输入的数æ®ï¼Œè¯·å°†å…¶ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
+ 'config-mbstring' => "'''致命错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]被å¯ç”¨ï¼'''
+此选项会导致错误并ä¸å¯é¢„测地破åæ•°æ®ï¼Œè¯·å°†å…¶ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
+ 'config-ze1' => "'''致命错误:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]被å¯ç”¨ï¼'''
+此选项将导致MediaWiki出现æžå…¶ä¸¥é‡çš„故障,请将其ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
+ 'config-safe-mode' => "'''警告:'''PHPçš„[http://www.php.net/features.safe-mode 安全模å¼]å·²å¯ç”¨ã€‚它å¯èƒ½ä¼šå¯¼è‡´ä¸€äº›é—®é¢˜ï¼Œå°¤å…¶åœ¨å¯¹æ–‡ä»¶ä¸Šä¼ å’Œæ•°å­¦å…¬å¼<code>math</code>的支æŒæ–¹é¢ã€‚",
+ 'config-xml-bad' => '缺少PHPçš„XML模å—。MediaWiki需è¦ä½¿ç”¨è¯¥æ¨¡å—æ供的函数,在当å‰é…置下将无法工作。如果您正在使用Mandrake Linux,请安装php-xml包。',
+ 'config-pcre' => 'å¯èƒ½ç¼ºå°‘PCRE的支æŒæ¨¡å—。MediaWikiçš„è¿è¡Œéœ€è¦å…¼å®¹äºŽPerl的正则表达å¼å‡½æ•°ã€‚',
+ 'config-pcre-no-utf8' => "'''致命错误''':PHPçš„PCRE模å—在编译时å¯èƒ½æ²¡æœ‰åŒ…å«PCRE_UTF8支æŒã€‚MediaWiki需è¦UTF-8支æŒæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚",
+ 'config-memory-raised' => 'PHP的内存使用上é™<code>memory_limit</code>为$1,自动æå‡åˆ°$2。',
+ 'config-memory-bad' => "'''警告:'''PHP的内存使用上é™<code>memory_limit</code>为$1。该设定å¯èƒ½è¿‡ä½Žï¼Œå¹¶å¯¼è‡´å®‰è£…失败ï¼",
+ 'config-xcache' => '[http://trac.lighttpd.net/xcache/ XCache]已安装',
+ 'config-apc' => '[http://www.php.net/apc APC]已安装',
+ 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator]已安装',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]已安装',
+ 'config-no-cache' => "'''警告:'''找ä¸åˆ°[http://eaccelerator.sourceforge.net eAccelerator]ã€[http://www.php.net/apc APC]ã€[http://trac.lighttpd.net/xcache/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],无法å¯ç”¨å¯¹è±¡ç¼“存。
+Object caching is not enabled.",
+ 'config-diff3-bad' => '找ä¸åˆ°GNU diff3。',
+ 'config-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你å¯ç”¨äº†ä¸Šä¼ åŠŸèƒ½ï¼Œç¼©ç•¥å›¾åŠŸèƒ½ä¹Ÿå°†è¢«å¯ç”¨ã€‚',
+ 'config-gd' => '已找到内建的GD图形库。如果你å¯ç”¨äº†ä¸Šä¼ åŠŸèƒ½ï¼Œç¼©ç•¥å›¾åŠŸèƒ½ä¹Ÿå°†è¢«å¯ç”¨ã€‚',
+ 'config-no-scaling' => '找ä¸åˆ°GD库或ImageMagick。缩略图功能将ä¸å¯ç”¨ã€‚',
+ 'config-no-uri' => "'''错误:'''无法确定当å‰çš„URI。安装已中断。",
+ 'config-uploads-not-safe' => "'''警告:'''您的默认上传目录<code>$1</code>存在å…许执行任æ„脚本的æ¼æ´žã€‚尽管MediaWiki会对所有已上传的文件进行安全检查,但我们ä»ç„¶å¼ºçƒˆå»ºè®®æ‚¨åœ¨å¯ç”¨ä¸Šä¼ åŠŸèƒ½å‰[http://www.mediawiki.org/wiki/Manual:Security#Upload_security 关闭该安全æ¼æ´ž]。",
+ 'config-brokenlibxml' => '您的系统安装的PHPå’Œlibxml2版本组åˆå­˜åœ¨æ•…障,并å¯èƒ½åœ¨MediaWiki和其他web应用程åºä¸­é€ æˆéšè—çš„æ•°æ®æŸå。请将PHPå‡çº§åˆ°5.2.9或以上,libxml2å‡çº§åˆ°2.7.3或以上([http://bugs.php.net/bug.php?id=45996 PHP的故障报告])。安装已中断。',
+ 'config-using531' => '由于函数<code>__call()</code>的引用å‚数存在故障,PHP $1å’ŒMediaWiki无法兼容。请å‡çº§åˆ°PHP 5.3.2或以上版本,或é™çº§åˆ°PHP 5.3.0以修å¤è¯¥é—®é¢˜ï¼ˆ[http://bugs.php.net/bug.php?id=50394 PHP的故障报告])。安装已中断。',
+ 'config-db-type' => 'æ•°æ®åº“类型:',
+ 'config-db-host' => 'æ•°æ®åº“主机:',
+ 'config-db-host-help' => '如果您的数æ®åº“ä½äºŽå¦ä¸€å°æœåŠ¡å™¨ä¸Šï¼Œåœ¨æ­¤è¾“入主机å或IP地å€ã€‚
+
+如果您使用的是共享web主机,您的主机æ供商应会在他们的文档中给出正确的主机å称。
+
+如果您使用了WindowsæœåŠ¡å™¨å’ŒMySQLæ•°æ®åº“,使用“localhostâ€å¯èƒ½æ— æ³•è¯†åˆ«åˆ°æœ¬åœ°æœåŠ¡å™¨ã€‚如果是这样的è¯ï¼Œè¯·å°è¯•æŒ‡å®šæœ¬åœ°æœåŠ¡å™¨çš„IP地å€ä¸ºâ€œ127.0.0.1â€ã€‚',
+ 'config-db-host-oracle' => 'æ•°æ®åº“é€æ˜Žç½‘络底层(TNS):',
+ 'config-db-host-oracle-help' => '请输入åˆæ³•çš„[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地连接å],并确ä¿tnsnames.ora文件对本安装程åºå¯è§ã€‚<br />如果您使用的客户端库为10g或更新的版本,您还å¯ä»¥ä½¿ç”¨[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 简å•è¿žæŽ¥å方法](easy connect naming method)。',
+ 'config-db-wiki-settings' => '标识本wiki',
+ 'config-db-name' => 'æ•°æ®åº“å称:',
+ 'config-db-name-help' => '请输入一个å¯ä»¥æ ‡è¯†æ‚¨çš„wikiçš„å称。请勿使用空格。
+
+如果您正在使用共享web主机,您的主机æ供商或会给您指定一个数æ®åº“å称,或会让您通过控制é¢æ¿åˆ›å»ºæ•°æ®åº“。',
+ 'config-db-name-oracle' => 'æ•°æ®åº“模å¼ï¼š',
+ 'config-db-install-account' => '用于安装的用户å¸å·',
+ 'config-db-username' => 'æ•°æ®åº“用户å:',
+ 'config-db-password' => 'æ•°æ®åº“密ç ï¼š',
+ 'config-db-install-username' => '请输入在安装过程中用于连接数æ®åº“的用户å。请勿输入MediaWikiå¸å·çš„用户å,请输入您数æ®åº“的用户å。',
+ 'config-db-install-password' => '请输入在安装过程中用于连接数æ®åº“的密ç ã€‚请勿输入MediaWikiå¸å·çš„密ç ï¼Œè¯·è¾“入您数æ®åº“的密ç ã€‚',
+ 'config-db-install-help' => '请输入在安装过程中用于连接数æ®åº“的用户å和密ç ã€‚',
+ 'config-db-account-lock' => '在普通æ“作中使用相åŒçš„用户å和密ç ',
+ 'config-db-wiki-account' => '用于普通æ“作的用户å¸å·',
+ 'config-db-wiki-help' => '输入在普通的wikiæ“作中(安装完æˆåŽï¼‰å°†ç”¨äºŽè¿žæŽ¥æ•°æ®åº“的用户å和密ç ã€‚如果该å¸å·å¹¶ä¸å­˜åœ¨ï¼Œè€Œå®‰è£…å¸å·å…·æœ‰è¶³å¤Ÿçš„æƒé™ï¼Œè¯¥ç”¨æˆ·å¸å·ä¼šè¢«è‡ªåŠ¨åˆ›å»ºï¼Œå¹¶è¢«èµ‹äºˆè¶³ä»¥è¿è¡Œæ­¤wiki的最低æƒé™ã€‚',
+ 'config-db-prefix' => 'æ•°æ®åº“表å‰ç¼€ï¼š',
+ 'config-db-prefix-help' => '如果您需è¦åœ¨å¤šä¸ªwiki之间(或在MediaWiki与其他web应用程åºä¹‹é—´ï¼‰å…±äº«ä¸€ä¸ªæ•°æ®åº“,您å¯ä»¥é€šè¿‡æ·»åŠ å‰ç¼€çš„æ–¹å¼æ¥é¿å…出现表å称的冲çªã€‚请勿使用空格。
+
+此字段通常å¯ç•™ç©ºã€‚',
+ 'config-db-charset' => 'æ•°æ®åº“字符集',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 二进制',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 UTF-8(å‘åŽå…¼å®¹ï¼‰',
+ 'config-charset-help' => "'''警告:'''如果您在MySQL 4.1+中使用'''å‘åŽå…¼å®¹çš„UTF-8'''字符集,并在之åŽä½¿ç”¨<code>mysqldump</code>备份了数æ®åº“,则å¯èƒ½æŸå所有的éžASCII字符,从而ä¸å¯é€†åœ°ç ´å您的备份ï¼
+
+在'''二进制模å¼'''下,MediaWiki会将UTF-8ç¼–ç çš„文本存于数æ®åº“的二进制字段中。相对于MySQLçš„UTF-8模å¼ï¼Œè¿™ç§æ–¹æ³•æ•ˆçŽ‡æ›´é«˜ï¼Œå¹¶å…许您使用全范围的Unicode字符。
+
+在'''UTF-8模å¼'''下,MySQL将知é“您数æ®ä½¿ç”¨çš„字符集,并能适当地æ供和转æ¢å†…容。但这样åšæ‚¨å°†æ— æ³•åœ¨æ•°æ®åº“中存储[http://zh.wikipedia.org/wiki/基本多文ç§å¹³é¢ 基本多文ç§å¹³é¢]以外的字符。",
+ 'config-mysql-old' => '需è¦MySQL $1或更新的版本,您的版本为$2。',
+ 'config-db-port' => 'æ•°æ®åº“端å£ï¼š',
+ 'config-db-schema' => 'MediaWikiçš„æ•°æ®åº“模å¼',
+ 'config-db-schema-help' => '上述数æ®åº“模å¼çš„设置通常是正确的。请在有此需求时æ‰æ›´æ”¹å®ƒä»¬ã€‚',
+ 'config-sqlite-dir' => 'SQLiteæ•°æ®ç›®å½•ï¼š',
+ 'config-sqlite-dir-help' => "SQLite会将所有的数æ®å­˜å‚¨äºŽå•ä¸€æ–‡ä»¶ä¸­ã€‚
+
+您所æ供的目录必须在安装过程中对网页æœåŠ¡å™¨å¯å†™ã€‚
+
+该目录'''ä¸åº”'''å…许通过web访问,因此我们ä¸ä¼šå°†æ•°æ®æ–‡ä»¶å’ŒPHP文件放在一起。
+
+安装程åºåœ¨åˆ›å»ºæ•°æ®æ–‡ä»¶æ—¶ï¼Œäº¦ä¼šåœ¨ç›¸åŒç›®å½•ä¸‹åˆ›å»º<code>.htaccess</code>以控制æƒé™ã€‚å‡è‹¥æ­¤ç­‰æŽ§åˆ¶å¤±æ•ˆï¼Œåˆ™å¯èƒ½ä¼šå°†æ‚¨çš„æ•°æ®æ–‡ä»¶æš´éœ²äºŽå…¬å…±ç©ºé—´ï¼Œè®©ä»–人å¯ä»¥èŽ·å–用户数æ®ï¼ˆç”µå­é‚®ä»¶åœ°å€ã€æ‚凑åŽçš„密ç ï¼‰ã€è¢«åˆ é™¤çš„版本以åŠå…¶ä»–在wiki上被é™åˆ¶è®¿é—®çš„æ•°æ®ã€‚
+
+请考虑将数æ®åº“统一放置在æŸå¤„,如<code>/var/lib/mediawiki/yourwiki</code>下。",
+ 'config-oracle-def-ts' => '默认表空间:',
+ 'config-oracle-temp-ts' => '临时表空间:',
+ 'config-support-info' => 'MediaWiki支æŒä»¥ä¸‹æ•°æ®åº“系统:
+
+$1
+
+如果您在下é¢åˆ—出的数æ®åº“系统中没有找到您希望使用的系统,请根æ®ä¸Šæ–¹é“¾å‘的指引å¯ç”¨æ”¯æŒã€‚',
+ 'config-support-mysql' => '* $1是MediaWiki的首选数æ®åº“,对它的支æŒæœ€ä¸ºå®Œå¤‡ï¼ˆ[http://www.php.net/manual/en/mysql.installation.php 如何将对MySQL的支æŒç¼–译进PHP中])',
+ 'config-support-postgres' => '* $1是一ç§æµè¡Œçš„å¼€æºæ•°æ®åº“系统,å¯ä½œä¸ºMySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支æŒç¼–译进PHP中])',
+ 'config-support-sqlite' => '* $1是一ç§è½»é‡çº§çš„æ•°æ®åº“系统,能被良好地支æŒã€‚([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支æŒç¼–译进PHP中],须使用PDO)',
+ 'config-support-oracle' => '* $1是一ç§å•†ç”¨ä¼ä¸šçº§çš„æ•°æ®åº“。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支æŒç¼–译进PHP中])',
+ 'config-header-mysql' => 'MySQL设置',
+ 'config-header-postgres' => 'PostgreSQL设置',
+ 'config-header-sqlite' => 'SQLite设置',
+ 'config-header-oracle' => 'Oracle设置',
+ 'config-invalid-db-type' => '无效的数æ®åº“类型',
+ 'config-missing-db-name' => '您必须为“数æ®åº“å称â€è¾“入内容',
+ 'config-missing-db-host' => '您必须为“数æ®åº“主机â€è¾“入内容',
+ 'config-missing-db-server-oracle' => '您必须为“数æ®åº“é€æ˜Žç½‘络底层(TNS)â€è¾“入内容',
+ 'config-invalid-db-server-oracle' => '无效的数æ®åº“TNS“$1â€ã€‚请åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•°å­—(0-9)ã€ä¸‹åˆ’线(_)和点å·ï¼ˆ.)。',
+ 'config-invalid-db-name' => '无效的数æ®åº“å称“$1â€ã€‚请åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•°å­—(0-9)ã€ä¸‹åˆ’线(_)和连字å·ï¼ˆ-)。',
+ 'config-invalid-db-prefix' => '无效的数æ®åº“å‰ç¼€â€œ$1â€ã€‚请åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•°å­—(0-9)ã€ä¸‹åˆ’线(_)和连字å·ï¼ˆ-)。',
+ 'config-connection-error' => '$1。
+
+请检查下列的主机ã€ç”¨æˆ·å和密ç è®¾ç½®åŽé‡è¯•ã€‚',
+ 'config-invalid-schema' => '无效的MediaWikiæ•°æ®åº“模å¼â€œ$1â€ã€‚请åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•°å­—(0-9)和下划线(_)。',
+ 'config-postgres-old' => '需è¦PostgreSQL $1或更新的版本,您的版本为$2。',
+ 'config-sqlite-name-help' => '请为您的wiki指定一个用于标识的å称。请勿使用空格或连字å·ï¼Œè¯¥å称将被用作SQLiteçš„æ•°æ®æ–‡ä»¶å。',
+ 'config-sqlite-parent-unwritable-group' => '由于父目录<code><nowiki>$2</nowiki></code>对网页æœåŠ¡å™¨ä¸å¯å†™ï¼Œæ— æ³•åˆ›å»ºæ•°æ®ç›®å½•<code><nowiki>$1</nowiki></code>。
+
+安装程åºå·²ç¡®å®šæ‚¨ç½‘页æœåŠ¡å™¨æ‰€ä½¿ç”¨çš„用户。请将<code><nowiki>$3</nowiki></code>目录设为对该用户å¯å†™ä»¥ç»§ç»­å®‰è£…过程。在Unix/Linux系统中,您å¯ä»¥é€è¡Œè¾“入下列命令:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => '由于父目录<code><nowiki>$2</nowiki></code>对网页æœåŠ¡å™¨ä¸å¯å†™ï¼Œæ— æ³•åˆ›å»ºæ•°æ®ç›®å½•<code><nowiki>$1</nowiki></code>。
+
+安装程åºæ— æ³•ç¡®å®šæ‚¨ç½‘页æœåŠ¡å™¨æ‰€ä½¿ç”¨çš„用户。请将<code><nowiki>$3</nowiki></code>目录设为全局å¯å†™ï¼ˆå¯¹æ‰€æœ‰ç”¨æˆ·ï¼‰ä»¥ç»§ç»­å®‰è£…过程。在Unix/Linux系统中,您å¯ä»¥é€è¡Œè¾“入下列命令:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => '创建数æ®ç›®å½•â€œ$1â€æ—¶å‘生错误。请检查路径åŽé‡è¯•ã€‚',
+ 'config-sqlite-dir-unwritable' => '无法写入目录“$1â€ã€‚请修改该目录的æƒé™ï¼Œä½¿å…¶å¯¹ç½‘页æœåŠ¡å™¨å¯å†™åŽé‡è¯•ã€‚',
+ 'config-sqlite-connection-error' => '$1。
+
+请检查下列的数æ®ç›®å½•å’Œæ•°æ®åº“å称åŽé‡è¯•ã€‚',
+ 'config-sqlite-readonly' => '文件<code>$1</code>ä¸å¯å†™ã€‚',
+ 'config-sqlite-cant-create-db' => '无法创建数æ®æ–‡ä»¶<code>$1</code>。',
+ 'config-sqlite-fts3-downgrade' => 'PHP缺少FTS3支æŒï¼Œæ­£åœ¨é™çº§æ•°æ®è¡¨',
+ 'config-can-upgrade' => "在数æ®åº“中å‘现了MediaWikiçš„æ•°æ®è¡¨ã€‚è¦å°†å®ƒä»¬å‡çº§è‡³MediaWiki $1,请点击'''继续'''。",
+ 'config-upgrade-done' => "å‡çº§å®Œæˆã€‚
+
+现在您å¯ä»¥[$1 开始使用您的wiki]了。
+
+如果您需è¦é‡æ–°ç”Ÿæˆ<code>LocalSettings.php</code>文件,请点击下é¢çš„按钮。除éžæ‚¨çš„wiki出现了问题,我们'''ä¸æŽ¨è'''您执行此æ“作。",
+ 'config-upgrade-done-no-regenerate' => 'å‡çº§å®Œæˆã€‚
+
+现在您å¯ä»¥[$1 开始使用您的wiki]了。',
+ 'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
+ 'config-show-table-status' => '查询SHOW TABLE STATUS失败ï¼',
+ 'config-unknown-collation' => "'''警告:'''æ•°æ®åº“使用了无法识别的整ç†ã€‚",
+ 'config-db-web-account' => '供网页访问使用的数æ®åº“å¸å·',
+ 'config-db-web-help' => '请指定在wiki执行普通æ“作时,网页æœåŠ¡å™¨ç”¨äºŽè¿žæŽ¥æ•°æ®åº“æœåŠ¡å™¨çš„用户å和密ç ã€‚',
+ 'config-db-web-account-same' => '使用和安装程åºç›¸åŒçš„å¸å·',
+ 'config-db-web-create' => '如果å¸å·ä¸å­˜åœ¨ï¼Œåˆ™è‡ªåŠ¨åˆ›å»º',
+ 'config-db-web-no-create-privs' => '您指定给安装程åºçš„å¸å·ç¼ºå°‘创建å¸å·çš„æƒé™ï¼Œå› æ­¤æ‚¨æŒ‡å®šçš„å¸å·å¿…须已ç»å­˜åœ¨ã€‚',
+ 'config-mysql-engine' => '存储引擎:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB'''通常是最佳选项,因为它对并å‘æ“作有ç€è‰¯å¥½çš„支æŒã€‚
+
+'''MyISAM'''在å•ç”¨æˆ·æˆ–åªè¯»çŽ¯å¢ƒä¸‹å¯èƒ½ä¼šæœ‰æ›´å¿«çš„性能表现。但MyISAMæ•°æ®åº“出错的概率一般è¦å¤§äºŽInnoDBæ•°æ®åº“。",
+ 'config-mysql-charset' => 'æ•°æ®åº“字符集:',
+ 'config-mysql-binary' => '二进制',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "在'''二进制模å¼'''下,MediaWiki会将UTF-8ç¼–ç çš„文本存于数æ®åº“的二进制字段中。相对于MySQLçš„UTF-8模å¼ï¼Œè¿™ç§æ–¹æ³•æ•ˆçŽ‡æ›´é«˜ï¼Œå¹¶å…许您使用全范围的Unicode字符。
+
+在'''UTF-8模å¼'''下,MySQL将知é“您数æ®ä½¿ç”¨çš„字符集,并能适当地æ供和转æ¢å†…容。但这样åšæ‚¨å°†æ— æ³•åœ¨æ•°æ®åº“中存储[http://zh.wikipedia.org/wiki/基本多文ç§å¹³é¢ 基本多文ç§å¹³é¢]以外的字符。",
+ 'config-site-name' => 'Wikiçš„å称:',
+ 'config-site-name-help' => '填入的内容会出现在æµè§ˆå™¨çš„标题æ ä»¥åŠå…¶ä»–多处ä½ç½®ä¸­ã€‚',
+ 'config-site-name-blank' => '输入网站的å称。',
+ 'config-project-namespace' => '项目å字空间:',
+ 'config-ns-generic' => '项目',
+ 'config-ns-site-name' => '与wikiå称相åŒï¼š$1',
+ 'config-ns-other' => '其他(自定义)',
+ 'config-ns-other-default' => '我的Wiki',
+ 'config-project-namespace-help' => "ä¾å¾ªç»´åŸºç™¾ç§‘å½¢æˆçš„惯例,许多wiki将他们的方针页é¢å­˜æ”¾åœ¨ä¸Žå†…容页é¢ä¸åŒçš„“'''项目å字空间'''â€ä¸­ã€‚所有ä½äºŽè¯¥å字空间下的页é¢æ ‡é¢˜éƒ½ä¼šè¢«å† ä»¥å›ºå®šçš„å‰ç¼€ï¼Œæ‚¨å¯ä»¥åœ¨æ­¤å¤„指定这一å‰ç¼€ã€‚传统上,这一å‰ç¼€åº”与wiki的命åä¿æŒä¸€è‡´ï¼Œä½†è¯·å‹¿åœ¨å…¶ä¸­ä½¿ç”¨æ ‡ç‚¹ç¬¦å·ï¼Œå¦‚“#â€æˆ–“:â€ã€‚",
+ 'config-ns-invalid' => '指定的å字空间“<nowiki>$1</nowiki>â€æ— æ•ˆï¼Œè¯·ä¸ºé¡¹ç›®å字空间指定其他å称。',
+ 'config-admin-box' => '管ç†å‘˜å¸å·',
+ 'config-admin-name' => '您的å字:',
+ 'config-admin-password' => '密ç ï¼š',
+ 'config-admin-password-confirm' => '确认密ç ï¼š',
+ 'config-admin-help' => '在此输入您想使用的用户å,例如“乔帮主â€ã€‚您将使用该å称登录本wiki。',
+ 'config-admin-name-blank' => '输入管ç†å‘˜çš„用户å。',
+ 'config-admin-name-invalid' => '指定的用户å“<nowiki>$1</nowiki>â€æ— æ•ˆï¼Œè¯·æŒ‡å®šå…¶ä»–用户å。',
+ 'config-admin-password-blank' => '输入管ç†å‘˜å¸å·çš„密ç ã€‚',
+ 'config-admin-password-same' => '密ç ä¸èƒ½å’Œç”¨æˆ·å相åŒã€‚',
+ 'config-admin-password-mismatch' => '两次输入的密ç å¹¶ä¸ç›¸åŒã€‚',
+ 'config-admin-email' => '电å­é‚®ä»¶åœ°å€ï¼š',
+ 'config-admin-email-help' => '在此输入电å­é‚®ä»¶åœ°å€ï¼Œè¿™æ ·æ‚¨å°†å¯ä»¥æ”¶åˆ°æœ¬wiki上的其他用户å‘æ¥çš„电å­é‚®ä»¶ï¼Œå¯ä»¥é‡ç½®æ‚¨çš„密ç ï¼Œå¹¶èƒ½åœ¨ç›‘视列表中的页é¢è¢«æ›´æ”¹æ—¶æ”¶åˆ°é‚®ä»¶é€šçŸ¥ã€‚',
+ 'config-admin-error-user' => '在创建用户å为“<nowiki>$1</nowiki>â€çš„管ç†å‘˜å¸å·æ—¶å‘生内部错误。',
+ 'config-admin-error-password' => '在为管ç†å‘˜â€œ<nowiki>$1</nowiki>â€è®¾ç½®å¯†ç æ—¶å‘生内部错误:<pre>$2</pre>',
+ 'config-admin-error-bademail' => '您输入了无效的电å­é‚®ä»¶åœ°å€ã€‚',
+ 'config-subscribe' => '订阅[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce å‘行公告邮件列表]。',
+ 'config-subscribe-help' => '此低æµé‡çš„邮件列表仅用于å‘行公告,其中包括é‡è¦å®‰å…¨å…¬å‘Šã€‚请订阅该列表以便在新的版本推出时å‡çº§æ‚¨çš„MediaWiki。',
+ 'config-almost-done' => '您几乎已ç»å®Œæˆäº†ï¼çŽ°åœ¨æ‚¨å¯ä»¥è·³è¿‡å‰©ä¸‹çš„é…ç½®æµç¨‹å¹¶ç«‹å³å®‰è£…wiki。',
+ 'config-optional-continue' => '多问我一些问题å§ã€‚',
+ 'config-optional-skip' => '我已ç»ä¸è€çƒ¦äº†ï¼Œèµ¶ç´§å®‰è£…我的wiki。',
+ 'config-profile' => '用户æƒé™é…置:',
+ 'config-profile-wiki' => '传统wiki',
+ 'config-profile-no-anon' => '需è¦æ³¨å†Œå¸å·',
+ 'config-profile-fishbowl' => '编辑å—é™',
+ 'config-profile-private' => 'éžå…¬å¼€wiki',
+ 'config-profile-help' => "如果您å…许尽é‡å¤šçš„人编写wiki,网站上的内容会更加丰富。在MediaWiki中,您å¯ä»¥è½»æ¾åœ°å®¡æŸ¥æœ€è¿‘更改,并轻易回退掉新手或破å者造æˆçš„æŸå®³ã€‚
+
+然而,许多人觉得让MediaWiki存在多ç§è§’色将更加好用;åŒæ—¶ï¼Œè¦è¯´æœæ‰€æœ‰äººéƒ½æ„¿ä»¥wikiçš„æ–¹å¼ä½œè´¡çŒ®å¹¶éžä¸€ä»¶æ˜“事。因此,您å¯ä»¥æœ‰ä»¥ä¸‹é€‰æ‹©ï¼š
+
+'''{{int:config-profile-wiki}}'''å…许包括未登录用户在内的所有人编辑。'''{{int:config-profile-no-anon}}'''çš„wiki需è¦é¢å¤–的注册æµç¨‹ï¼Œè¿™æœ‰å¯èƒ½ä¼šé˜»ç¢éšæ„贡献者。
+
+'''{{int:config-profile-fishbowl}}'''模å¼åªå…许获批准的用户编辑,但对公众开放页é¢æµè§ˆï¼ˆåŒ…括历å²è®°å½•ï¼‰ã€‚'''{{int:config-profile-private}}'''则åªå…许获批准的用户æµè§ˆã€ç¼–辑页é¢ã€‚
+
+安装完æˆåŽï¼Œæ‚¨è¿˜å¯ä»¥å¯¹ç”¨æˆ·æƒé™è¿›è¡Œæ›´å¤šã€æ›´å¤æ‚çš„é…置,å‚è§[http://www.mediawiki.org/wiki/Manual:User_rights 相关的使用手册]。",
+ 'config-license' => '版æƒå’Œè®¸å¯è¯ï¼š',
+ 'config-license-none' => '页脚无许å¯è¯',
+ 'config-license-cc-by-sa' => '知识共享署å-相åŒæ–¹å¼åˆ†äº«',
+ 'config-license-cc-by-nc-sa' => '知识共享署å-éžå•†ä¸šæ€§ä½¿ç”¨-相åŒæ–¹å¼å…±äº«',
+ 'config-license-gfdl-old' => 'GNU自由文档许å¯è¯ 1.2',
+ 'config-license-gfdl-current' => 'GNU自由文档许å¯è¯ 1.3或更高版本',
+ 'config-license-pd' => '公有领域',
+ 'config-license-cc-choose' => '选择自定义的知识共享许å¯è¯',
+ 'config-license-help' => "许多公共wiki会以[http://freedomdefined.org/Definition 自由许å¯è¯]çš„æ–¹å¼é‡Šæ”¾å‡ºç¼–者的所有贡献。这有助于构建社区的主人ç¿æ„识,并能鼓励长期贡献。对于éžå…¬å…±wiki或公å¸wiki,这并éžå¿…è¦æ¡ä»¶ã€‚
+
+如果您希望使用æ¥è‡ªç»´åŸºç™¾ç§‘的内容,并希望维基百科能接å—å¤åˆ¶è‡ªæ‚¨çš„wiki的内容,请选择'''知识共享署å-相åŒæ–¹å¼å…±äº«'''。
+
+GNU自由文档许å¯è¯æ˜¯ç»´åŸºç™¾ç§‘曾ç»ä½¿ç”¨è¿‡çš„许å¯è¯ï¼Œå¹¶è¿„今有效。然而,该许å¯è¯çš„一些特性会增加é‡ç”¨æˆ–演绎内容的难度。",
+ 'config-email-settings' => '电å­é‚®ä»¶è®¾ç½®',
+ 'config-enable-email' => 'å¯ç”¨å‡ºç«™ç”µå­é‚®ä»¶',
+ 'config-enable-email-help' => '如果您希望使用电å­é‚®ä»¶åŠŸèƒ½ï¼Œè¯·æ­£ç¡®é…ç½®[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您ä¸éœ€è¦ä»»ä½•ç”µå­é‚®ä»¶åŠŸèƒ½ï¼Œè¯·åœ¨æ­¤å¤„ç¦ç”¨å®ƒã€‚',
+ 'config-email-user' => 'å¯ç”¨ç”¨æˆ·åˆ°ç”¨æˆ·çš„电å­é‚®ä»¶',
+ 'config-email-user-help' => 'å…许所有用户互å‘邮件,å‡è‹¥ä»–们å¯ç”¨äº†è¯¥åŠŸèƒ½ã€‚',
+ 'config-email-usertalk' => 'å¯ç”¨ç”¨æˆ·è®¨è®ºé¡µé€šçŸ¥',
+ 'config-email-usertalk-help' => 'å…许用户收到用户讨论页被修改的通知,å‡è‹¥ä»–们å¯ç”¨äº†è¯¥åŠŸèƒ½ã€‚',
+ 'config-email-watchlist' => 'å¯ç”¨ç›‘视列表通知',
+ 'config-email-watchlist-help' => 'å…许用户收到与其监视列表有关的通知,å‡è‹¥ä»–们å¯ç”¨äº†è¯¥åŠŸèƒ½ã€‚',
+ 'config-email-auth' => 'å¯ç”¨ç”µå­é‚®ä»¶èº«ä»½éªŒè¯',
+ 'config-email-auth-help' => "如果å¯ç”¨æ­¤é€‰é¡¹ï¼Œåœ¨ç”¨æˆ·è®¾ç½®æˆ–修改电å­é‚®ä»¶åœ°å€æ—¶ï¼Œå°±ä¼šæ”¶åˆ°ä¸€å°é‚®ä»¶ï¼Œå†…å«ç¡®è®¤ç”µå­åœ°å€çš„链接。åªæœ‰ç»è¿‡èº«ä»½éªŒè¯çš„电å­é‚®ä»¶åœ°å€ï¼Œæ‰èƒ½æ”¶åˆ°æ¥è‡ªå…¶ä»–用户的电å­é‚®ä»¶ï¼Œæˆ–任何修改通知的邮件。'''建议'''公开wikiå¯ç”¨æœ¬é€‰é¡¹ï¼Œä»¥é˜²å¯¹ç”µå­é‚®ä»¶åŠŸèƒ½çš„滥用。",
+ 'config-email-sender' => '回å¤ç”µå­é‚®ä»¶åœ°å€ï¼š',
+ 'config-email-sender-help' => '输入è¦ç”¨æ¥å‘é€å‡ºç«™ç”µå­é‚®ä»¶çš„地å€ï¼Œè¯¥åœ°å€å°†ä¼šæ”¶åˆ°è¢«æ‹’收的邮件。许多邮件æœåŠ¡å™¨è¦æ±‚域å部分必须有效。',
+ 'config-upload-settings' => '图åƒå’Œæ–‡ä»¶ä¸Šä¼ ',
+ 'config-upload-enable' => 'å¯ç”¨æ–‡ä»¶ä¸Šä¼ ',
+ 'config-upload-help' => '文件上传å¯èƒ½ä¼šå°†æ‚¨çš„æœåŠ¡å™¨æš´éœ²åœ¨å®‰å…¨é£Žé™©ä¸‹ã€‚有关更多的信æ¯ï¼Œè¯·å‚阅手册的[http://www.mediawiki.org/wiki/Manual:Security 安全部分]。
+
+è¦å¯ç”¨æ–‡ä»¶ä¸Šä¼ ï¼Œè¯·å…ˆå°†MediaWiki根目录下的<code>images</code>å­ç›®å½•æ›´æ”¹ä¸ºå¯¹webæœåŠ¡å™¨å¯å†™ï¼Œç„¶åŽå†å¯ç”¨æ­¤é€‰é¡¹ã€‚',
+ 'config-upload-deleted' => '已删除文件的目录:',
+ 'config-upload-deleted-help' => '指定用于存放被删除文件的目录。ç†æƒ³æƒ…况下,该目录ä¸åº”能通过web访问。',
+ 'config-logo' => '标志URL:',
+ 'config-logo-help' => '在MediaWiki的默认外观中,左上角部ä½æœ‰ä¸€å—135x160åƒç´ çš„区域å¯ç”¨äºŽå±•ç¤ºç«™ç‚¹çš„标志。请上传一幅相应大å°çš„图åƒï¼Œå¹¶åœ¨æ­¤è¾“å…¥URL。
+
+如果您ä¸å¸Œæœ›ä½¿ç”¨æ ‡å¿—,请将本处留空。',
+ 'config-instantcommons' => 'å¯ç”¨å³æ—¶å…±äº«èµ„æº',
+ 'config-instantcommons-help' => '[http://www.mediawiki.org/wiki/InstantCommons å³æ—¶å…±äº«èµ„æº]å¯ä»¥è®©wiki使用æ¥è‡ª[http://commons.wikimedia.org/ 维基共享资æº]网站的图åƒã€éŸ³é¢‘和其他媒体文件。è¦å¯ç”¨è¯¥åŠŸèƒ½ï¼ŒMediaWiki必须能够访问互è”网。
+
+有关此功能的详细信æ¯ï¼ŒåŒ…括如何将其他wiki网站设为具有类似共享功能的方法,请å‚考[http://mediawiki.org/wiki/Manual:$wgForeignFileRepos 手册]。',
+ 'config-cc-error' => '知识共享许å¯è¯æŒ‘选器无法找到结果,请手动输入许å¯è¯çš„å称。',
+ 'config-cc-again' => 'é‡æ–°æŒ‘选……',
+ 'config-cc-not-chosen' => '选择您希望使用的知识共享许å¯è¯ï¼Œå¹¶ç‚¹å‡»â€œç»§ç»­â€ã€‚',
+ 'config-advanced-settings' => '高级设置',
+ 'config-cache-options' => '对象缓存设置:',
+ 'config-cache-help' => '对象缓存å¯é€šè¿‡ç¼“存频ç¹ä½¿ç”¨çš„æ•°æ®æ¥æ高MediaWiki的速度。高度推è中到大型的网站å¯ç”¨è¯¥åŠŸèƒ½ï¼Œå°åž‹ç½‘站亦能从其中å—益。',
+ 'config-cache-none' => '无缓存(ä¸å½±å“功能,但对较大型的wiki网站会有速度影å“)',
+ 'config-cache-accel' => 'PHP对象缓存(APCã€eAcceleratorã€XCache或WinCache)',
+ 'config-cache-memcached' => '使用Memcached(需è¦å¦å¤–安装并é…置)',
+ 'config-memcached-servers' => 'MemcachedæœåŠ¡å™¨ï¼š',
+ 'config-memcached-help' => '用于Memcachedçš„IP地å€åˆ—表。请以åŠè§’逗å·åˆ†å‰²ï¼Œå¹¶æŒ‡å®šè¦ä½¿ç”¨çš„端å£ï¼ˆä¾‹å¦‚:127.0.0.1:11211, 192.168.1.25:11211)。',
+ 'config-extensions' => '扩展',
+ 'config-extensions-help' => '已在您的<code>./extensions</code>目录中å‘现下列扩展。
+
+您å¯èƒ½è¦å¯¹å®ƒä»¬è¿›è¡Œé¢å¤–çš„é…置,但您现在å¯ä»¥å¯ç”¨å®ƒä»¬ã€‚',
+ 'config-install-alreadydone' => "'''警告:'''您似乎已ç»å®‰è£…了MediaWiki,并试图é‡æ–°å®‰è£…它。请å‰å¾€ä¸‹ä¸€ä¸ªé¡µé¢ã€‚",
+ 'config-install-begin' => '点击继续åŽï¼Œæ‚¨å°†å¼€å§‹å®‰è£…MediaWiki。如果您还想对é…置作一些修改,请点击åŽé€€ã€‚',
+ 'config-install-step-done' => '完æˆ',
+ 'config-install-step-failed' => '失败',
+ 'config-install-extensions' => '正在å¯ç”¨æ‰©å±•',
+ 'config-install-database' => '正在é…置数æ®åº“',
+ 'config-install-pg-schema-not-exist' => 'PostgreSQL 架构ä¸å­˜åœ¨',
+ 'config-install-pg-schema-failed' => '创建数æ®è¡¨å¤±è´¥ã€‚请确ä¿ç”¨æˆ·â€œ$1â€æ‹¥æœ‰å†™å…¥æ¨¡å¼â€œ$2â€çš„æƒé™ã€‚',
+ 'config-install-pg-commit' => '正在æ交更改',
+ 'config-install-pg-plpgsql' => '正在检查PL/pgSQL语言',
+ 'config-pg-no-plpgsql' => '您需è¦ä¸ºæ•°æ®åº“$1安装PL/pgSQL语言',
+ 'config-pg-no-create-privs' => '为安装程åºæŒ‡å®šçš„å¸å·ç¼ºå°‘创建å¸å·çš„æƒé™ã€‚',
+ 'config-install-user' => '正在创建数æ®åº“用户',
+ 'config-install-user-grant-failed' => '授予用户“$1â€æƒé™å¤±è´¥ï¼š$2',
+ 'config-install-tables' => '正在创建数æ®è¡¨',
+ 'config-install-tables-exist' => "'''警告''':MediaWikiçš„æ•°æ®è¡¨ä¼¼ä¹Žå·²ç»å­˜åœ¨ï¼Œè·³è¿‡åˆ›å»ºã€‚",
+ 'config-install-tables-failed' => "'''错误''':创建数æ®è¡¨å‡ºé”™ï¼Œä¸‹ä¸ºé”™è¯¯ä¿¡æ¯ï¼š$1",
+ 'config-install-interwiki' => '正在填充默认的跨wikiæ•°æ®è¡¨',
+ 'config-install-interwiki-list' => '找ä¸åˆ°æ–‡ä»¶<code>interwiki.list</code>。',
+ 'config-install-interwiki-exists' => "'''警告''':跨wikiæ•°æ®è¡¨ä¼¼ä¹Žå·²æœ‰å†…容,跳过默认列表。",
+ 'config-install-stats' => 'åˆå§‹åŒ–统计',
+ 'config-install-keys' => '正在生æˆå¯†é’¥',
+ 'config-install-sysop' => '正在创建管ç†å‘˜ç”¨æˆ·å¸å·',
+ 'config-install-subscribe-fail' => '无法订阅mediawiki-announce',
+ 'config-install-mainpage' => '正在创建显示默认内容的首页',
+ 'config-install-extension-tables' => '正在为已å¯ç”¨æ‰©å±•åˆ›å»ºæ•°æ®è¡¨',
+ 'config-install-mainpage-failed' => '无法æ’入首页:$1',
+ 'config-install-done' => "'''æ­å–œï¼'''
+您已ç»æˆåŠŸåœ°å®‰è£…了MediaWiki。
+
+安装程åºå·²ç»ç”Ÿæˆäº†<code>LocalSettings.php</code>文件,其中包å«äº†æ‚¨æ‰€æœ‰çš„é…置。
+
+您需è¦ä¸‹è½½è¯¥æ–‡ä»¶ï¼Œå¹¶å°†å…¶æ”¾åœ¨æ‚¨wiki的根目录(index.phpçš„åŒçº§ç›®å½•ï¼‰ä¸­ã€‚ç¨åŽä¸‹è½½å°†è‡ªåŠ¨å¼€å§‹ã€‚
+
+如果æµè§ˆå™¨æ²¡æœ‰æ示您下载,或者您å–消了下载,您å¯ä»¥ç‚¹å‡»ä¸‹é¢çš„链接é‡æ–°å¼€å§‹ä¸‹è½½ï¼š
+
+$3
+
+'''注æ„''':如果您现在ä¸å®Œæˆæœ¬æ­¥éª¤ï¼Œè€Œæ˜¯æ²¡æœ‰ä¸‹è½½ä¾¿é€€å‡ºäº†å®‰è£…过程,此åŽæ‚¨å°†æ— æ³•èŽ·å¾—自动生æˆçš„é…置文件。
+
+当本步骤完æˆåŽï¼Œæ‚¨å¯ä»¥ '''[$2 进入您的wiki]'''。",
+ 'config-download-localsettings' => '下载LocalSettings.php',
+ 'config-help' => '帮助',
+);
+
+/** Traditional Chinese (‪中文(ç¹é«”)‬)
+ * @author Mark85296341
+ */
+$messages['zh-hant'] = array(
+ 'config-information' => '資訊',
+ 'config-your-language' => '您的語言:',
+ 'config-your-language-help' => 'é¸æ“‡ä¸€å€‹è¦ä½¿ç”¨çš„語言在安è£éŽç¨‹ä¸­ã€‚',
+ 'config-wiki-language' => 'Wiki 語言:',
+ 'config-back' => 'â†è¿”回',
+ 'config-continue' => '繼續→',
+ 'config-page-language' => '語言',
+ 'config-page-welcome' => '歡迎您來到 MediaWikiï¼',
+ 'config-page-dbconnect' => '連接到資料庫',
+ 'config-page-upgrade' => 'å‡ç´šç¾æœ‰çš„安è£',
+ 'config-page-dbsettings' => '資料庫設定',
+ 'config-page-name' => 'å稱',
+ 'config-page-options' => 'é¸é …',
+ 'config-page-install' => '安è£',
+ 'config-page-complete' => '完æˆï¼',
+ 'config-page-restart' => 'é‡æ–°å®‰è£',
+ 'config-page-readme' => '讀我',
+ 'config-page-copying' => '複製',
+ 'config-page-upgradedoc' => 'å‡ç´š',
+ 'config-restart' => '是的,é‡æ–°å•Ÿå‹•',
+ 'config-db-type' => '資料庫類型:',
+ 'config-db-host' => '資料庫主機:',
+ 'config-db-host-oracle' => '資料庫的 TNS:',
+ 'config-db-wiki-settings' => '識別這個 Wiki',
+ 'config-db-name' => '資料庫å稱:',
+ 'config-db-name-oracle' => '資料庫架構:',
+ 'config-db-username' => '資料庫使用者å稱:',
+ 'config-db-password' => '資料庫密碼:',
+ 'config-sqlite-dir' => 'SQLite 的資料目錄:',
+ 'config-header-mysql' => 'MySQL 的設定',
+ 'config-header-sqlite' => 'SQLite 的設定',
+ 'config-header-oracle' => '甲骨文設定',
+ 'config-invalid-db-type' => '無效的資料庫類型',
+ 'config-db-web-create' => '建立帳號,如果它ä¸å­˜åœ¨',
+ 'config-mysql-charset' => '資料庫字符集:',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name-blank' => '輸入站點å稱。',
+ 'config-ns-other' => '其他(請註明)',
+ 'config-admin-password' => '密碼:',
+ 'config-admin-password-confirm' => 'å†æ¬¡è¼¸å…¥å¯†ç¢¼ï¼š',
+ 'config-admin-name-blank' => '輸入管ç†å“¡çš„使用者å稱。',
+ 'config-admin-password-blank' => '輸入管ç†å“¡å¸³è™Ÿå¯†ç¢¼ã€‚',
+ 'config-admin-password-same' => '密碼ä¸èƒ½èˆ‡ä½¿ç”¨è€…å稱相åŒã€‚',
+ 'config-admin-email' => 'E-mail 地å€ï¼š',
+ 'config-admin-error-bademail' => '你輸入了一個無效的電å­éƒµä»¶åœ°å€ã€‚',
+ 'config-license' => '版權和許å¯è­‰ï¼š',
+ 'config-license-pd' => '公共領域',
+ 'config-email-settings' => 'E-mail 設定',
+ 'config-email-auth' => '啟用電å­éƒµä»¶èªè­‰',
+ 'config-email-sender' => '返回電å­éƒµä»¶åœ°å€ï¼š',
+ 'config-upload-settings' => '圖片和檔案上傳',
+ 'config-upload-enable' => '啟用檔案上傳',
+ 'config-cc-again' => 'é‡æ–°é¸å–......',
+ 'config-advanced-settings' => '進階é…ç½®',
+ 'config-extensions' => '擴充套件',
+ 'config-install-step-done' => '完æˆ',
+ 'config-install-step-failed' => '失敗',
+ 'config-install-pg-commit' => 'æ交更改',
+ 'config-help' => '說明',
+);
+
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
new file mode 100644
index 00000000..6da4f100
--- /dev/null
+++ b/includes/installer/Installer.php
@@ -0,0 +1,1511 @@
+<?php
+/**
+ * Base code for MediaWiki installer.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * This documentation group collects source code files with deployment functionality.
+ *
+ * @defgroup Deployment Deployment
+ */
+
+/**
+ * Base installer class.
+ *
+ * This class provides the base for installation and update functionality
+ * for both MediaWiki core and extensions.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+abstract class Installer {
+
+ // This is the absolute minimum PHP version we can support
+ const MINIMUM_PHP_VERSION = '5.2.3';
+
+ /**
+ * @var array
+ */
+ protected $settings;
+
+ /**
+ * Cached DB installer instances, access using getDBInstaller().
+ *
+ * @var array
+ */
+ protected $dbInstallers = array();
+
+ /**
+ * Minimum memory size in MB.
+ *
+ * @var integer
+ */
+ protected $minMemorySize = 50;
+
+ /**
+ * Cached Title, used by parse().
+ *
+ * @var Title
+ */
+ protected $parserTitle;
+
+ /**
+ * Cached ParserOptions, used by parse().
+ *
+ * @var ParserOptions
+ */
+ protected $parserOptions;
+
+ /**
+ * Known database types. These correspond to the class names <type>Installer,
+ * and are also MediaWiki database types valid for $wgDBtype.
+ *
+ * To add a new type, create a <type>Installer class and a Database<type>
+ * class, and add a config-type-<type> message to MessagesEn.php.
+ *
+ * @var array
+ */
+ protected static $dbTypes = array(
+ 'mysql',
+ 'postgres',
+ 'oracle',
+ 'sqlite',
+ );
+
+ /**
+ * A list of environment check methods called by doEnvironmentChecks().
+ * These may output warnings using showMessage(), and/or abort the
+ * installation process by returning false.
+ *
+ * @var array
+ */
+ protected $envChecks = array(
+ 'envCheckDB',
+ 'envCheckRegisterGlobals',
+ 'envCheckBrokenXML',
+ 'envCheckPHP531',
+ 'envCheckMagicQuotes',
+ 'envCheckMagicSybase',
+ 'envCheckMbstring',
+ 'envCheckZE1',
+ 'envCheckSafeMode',
+ 'envCheckXML',
+ 'envCheckPCRE',
+ 'envCheckMemory',
+ 'envCheckCache',
+ 'envCheckDiff3',
+ 'envCheckGraphics',
+ 'envCheckPath',
+ 'envCheckExtension',
+ 'envCheckShellLocale',
+ 'envCheckUploadsDirectory',
+ 'envCheckLibicu',
+ 'envCheckSuhosinMaxValueLength',
+ );
+
+ /**
+ * MediaWiki configuration globals that will eventually be passed through
+ * to LocalSettings.php. The names only are given here, the defaults
+ * typically come from DefaultSettings.php.
+ *
+ * @var array
+ */
+ protected $defaultVarNames = array(
+ 'wgSitename',
+ 'wgPasswordSender',
+ 'wgLanguageCode',
+ 'wgRightsIcon',
+ 'wgRightsText',
+ 'wgRightsUrl',
+ 'wgMainCacheType',
+ 'wgEnableEmail',
+ 'wgEnableUserEmail',
+ 'wgEnotifUserTalk',
+ 'wgEnotifWatchlist',
+ 'wgEmailAuthentication',
+ 'wgDBtype',
+ 'wgDiff3',
+ 'wgImageMagickConvertCommand',
+ 'IP',
+ 'wgScriptPath',
+ 'wgScriptExtension',
+ 'wgMetaNamespace',
+ 'wgDeletedDirectory',
+ 'wgEnableUploads',
+ 'wgLogo',
+ 'wgShellLocale',
+ 'wgSecretKey',
+ 'wgUseInstantCommons',
+ 'wgUpgradeKey',
+ 'wgDefaultSkin',
+ 'wgResourceLoaderMaxQueryLength',
+ );
+
+ /**
+ * Variables that are stored alongside globals, and are used for any
+ * configuration of the installation process aside from the MediaWiki
+ * configuration. Map of names to defaults.
+ *
+ * @var array
+ */
+ protected $internalDefaults = array(
+ '_UserLang' => 'en',
+ '_Environment' => false,
+ '_CompiledDBs' => array(),
+ '_SafeMode' => false,
+ '_RaiseMemory' => false,
+ '_UpgradeDone' => false,
+ '_InstallDone' => false,
+ '_Caches' => array(),
+ '_InstallPassword' => '',
+ '_SameAccount' => true,
+ '_CreateDBAccount' => false,
+ '_NamespaceType' => 'site-name',
+ '_AdminName' => '', // will be set later, when the user selects language
+ '_AdminPassword' => '',
+ '_AdminPassword2' => '',
+ '_AdminEmail' => '',
+ '_Subscribe' => false,
+ '_SkipOptional' => 'continue',
+ '_RightsProfile' => 'wiki',
+ '_LicenseCode' => 'none',
+ '_CCDone' => false,
+ '_Extensions' => array(),
+ '_MemCachedServers' => '',
+ '_UpgradeKeySupplied' => false,
+ '_ExistingDBSettings' => false,
+ );
+
+ /**
+ * The actual list of installation steps. This will be initialized by getInstallSteps()
+ *
+ * @var array
+ */
+ private $installSteps = array();
+
+ /**
+ * Extra steps for installation, for things like DatabaseInstallers to modify
+ *
+ * @var array
+ */
+ protected $extraInstallSteps = array();
+
+ /**
+ * Known object cache types and the functions used to test for their existence.
+ *
+ * @var array
+ */
+ protected $objectCaches = array(
+ 'xcache' => 'xcache_get',
+ 'apc' => 'apc_fetch',
+ 'eaccel' => 'eaccelerator_get',
+ 'wincache' => 'wincache_ucache_get'
+ );
+
+ /**
+ * User rights profiles.
+ *
+ * @var array
+ */
+ public $rightsProfiles = array(
+ 'wiki' => array(),
+ 'no-anon' => array(
+ '*' => array( 'edit' => false )
+ ),
+ 'fishbowl' => array(
+ '*' => array(
+ 'createaccount' => false,
+ 'edit' => false,
+ ),
+ ),
+ 'private' => array(
+ '*' => array(
+ 'createaccount' => false,
+ 'edit' => false,
+ 'read' => false,
+ ),
+ ),
+ );
+
+ /**
+ * License types.
+ *
+ * @var array
+ */
+ public $licenses = array(
+ 'cc-by-sa' => array(
+ 'url' => 'http://creativecommons.org/licenses/by-sa/3.0/',
+ 'icon' => '{$wgStylePath}/common/images/cc-by-sa.png',
+ ),
+ 'cc-by-nc-sa' => array(
+ 'url' => 'http://creativecommons.org/licenses/by-nc-sa/3.0/',
+ 'icon' => '{$wgStylePath}/common/images/cc-by-nc-sa.png',
+ ),
+ 'cc-0' => array(
+ 'url' => 'https://creativecommons.org/publicdomain/zero/1.0/',
+ 'icon' => '{$wgStylePath}/common/images/cc-0.png',
+ ),
+ 'pd' => array(
+ 'url' => 'http://creativecommons.org/licenses/publicdomain/',
+ 'icon' => '{$wgStylePath}/common/images/public-domain.png',
+ ),
+ 'gfdl-old' => array(
+ 'url' => 'http://www.gnu.org/licenses/old-licenses/fdl-1.2.html',
+ 'icon' => '{$wgStylePath}/common/images/gnu-fdl.png',
+ ),
+ 'gfdl-current' => array(
+ 'url' => 'http://www.gnu.org/copyleft/fdl.html',
+ 'icon' => '{$wgStylePath}/common/images/gnu-fdl.png',
+ ),
+ 'none' => array(
+ 'url' => '',
+ 'icon' => '',
+ 'text' => ''
+ ),
+ 'cc-choose' => array(
+ // Details will be filled in by the selector.
+ 'url' => '',
+ 'icon' => '',
+ 'text' => '',
+ ),
+ );
+
+ /**
+ * URL to mediawiki-announce subscription
+ */
+ protected $mediaWikiAnnounceUrl = 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
+
+ /**
+ * Supported language codes for Mailman
+ */
+ protected $mediaWikiAnnounceLanguages = array(
+ 'ca', 'cs', 'da', 'de', 'en', 'es', 'et', 'eu', 'fi', 'fr', 'hr', 'hu',
+ 'it', 'ja', 'ko', 'lt', 'nl', 'no', 'pl', 'pt', 'pt-br', 'ro', 'ru',
+ 'sl', 'sr', 'sv', 'tr', 'uk'
+ );
+
+ /**
+ * UI interface for displaying a short message
+ * The parameters are like parameters to wfMsg().
+ * The messages will be in wikitext format, which will be converted to an
+ * output format such as HTML or text before being sent to the user.
+ */
+ public abstract function showMessage( $msg /*, ... */ );
+
+ /**
+ * Same as showMessage(), but for displaying errors
+ */
+ public abstract function showError( $msg /*, ... */ );
+
+ /**
+ * Show a message to the installing user by using a Status object
+ * @param $status Status
+ */
+ public abstract function showStatusMessage( Status $status );
+
+ /**
+ * Constructor, always call this from child classes.
+ */
+ public function __construct() {
+ global $wgExtensionMessagesFiles, $wgUser, $wgHooks;
+
+ // Disable the i18n cache and LoadBalancer
+ Language::getLocalisationCache()->disableBackend();
+ LBFactory::disableBackend();
+
+ // Load the installer's i18n file.
+ $wgExtensionMessagesFiles['MediawikiInstaller'] =
+ dirname( __FILE__ ) . '/Installer.i18n.php';
+
+ // Having a user with id = 0 safeguards us from DB access via User::loadOptions().
+ $wgUser = User::newFromId( 0 );
+
+ $this->settings = $this->internalDefaults;
+
+ foreach ( $this->defaultVarNames as $var ) {
+ $this->settings[$var] = $GLOBALS[$var];
+ }
+
+ foreach ( self::getDBTypes() as $type ) {
+ $installer = $this->getDBInstaller( $type );
+
+ if ( !$installer->isCompiled() ) {
+ continue;
+ }
+
+ $defaults = $installer->getGlobalDefaults();
+
+ foreach ( $installer->getGlobalNames() as $var ) {
+ if ( isset( $defaults[$var] ) ) {
+ $this->settings[$var] = $defaults[$var];
+ } else {
+ $this->settings[$var] = $GLOBALS[$var];
+ }
+ }
+ }
+
+ $this->parserTitle = Title::newFromText( 'Installer' );
+ $this->parserOptions = new ParserOptions; // language will be wrong :(
+ $this->parserOptions->setEditSection( false );
+ }
+
+ /**
+ * Get a list of known DB types.
+ */
+ public static function getDBTypes() {
+ return self::$dbTypes;
+ }
+
+ /**
+ * Do initial checks of the PHP environment. Set variables according to
+ * the observed environment.
+ *
+ * It's possible that this may be called under the CLI SAPI, not the SAPI
+ * that the wiki will primarily run under. In that case, the subclass should
+ * initialise variables such as wgScriptPath, before calling this function.
+ *
+ * Under the web subclass, it can already be assumed that PHP 5+ is in use
+ * and that sessions are working.
+ *
+ * @return Status
+ */
+ public function doEnvironmentChecks() {
+ $phpVersion = phpversion();
+ if( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
+ $this->showMessage( 'config-env-php', $phpVersion );
+ $good = true;
+ } else {
+ $this->showMessage( 'config-env-php-toolow', $phpVersion, self::MINIMUM_PHP_VERSION );
+ $good = false;
+ }
+
+ if( $good ) {
+ foreach ( $this->envChecks as $check ) {
+ $status = $this->$check();
+ if ( $status === false ) {
+ $good = false;
+ }
+ }
+ }
+
+ $this->setVar( '_Environment', $good );
+
+ return $good ? Status::newGood() : Status::newFatal( 'config-env-bad' );
+ }
+
+ /**
+ * Set a MW configuration variable, or internal installer configuration variable.
+ *
+ * @param $name String
+ * @param $value Mixed
+ */
+ public function setVar( $name, $value ) {
+ $this->settings[$name] = $value;
+ }
+
+ /**
+ * Get an MW configuration variable, or internal installer configuration variable.
+ * The defaults come from $GLOBALS (ultimately DefaultSettings.php).
+ * Installer variables are typically prefixed by an underscore.
+ *
+ * @param $name String
+ * @param $default Mixed
+ *
+ * @return mixed
+ */
+ public function getVar( $name, $default = null ) {
+ if ( !isset( $this->settings[$name] ) ) {
+ return $default;
+ } else {
+ return $this->settings[$name];
+ }
+ }
+
+ /**
+ * Get an instance of DatabaseInstaller for the specified DB type.
+ *
+ * @param $type Mixed: DB installer for which is needed, false to use default.
+ *
+ * @return DatabaseInstaller
+ */
+ public function getDBInstaller( $type = false ) {
+ if ( !$type ) {
+ $type = $this->getVar( 'wgDBtype' );
+ }
+
+ $type = strtolower( $type );
+
+ if ( !isset( $this->dbInstallers[$type] ) ) {
+ $class = ucfirst( $type ). 'Installer';
+ $this->dbInstallers[$type] = new $class( $this );
+ }
+
+ return $this->dbInstallers[$type];
+ }
+
+ /**
+ * Determine if LocalSettings.php exists. If it does, return its variables,
+ * merged with those from AdminSettings.php, as an array.
+ *
+ * @return Array
+ */
+ public static function getExistingLocalSettings() {
+ global $IP;
+
+ wfSuppressWarnings();
+ $_lsExists = file_exists( "$IP/LocalSettings.php" );
+ wfRestoreWarnings();
+
+ if( !$_lsExists ) {
+ return false;
+ }
+ unset($_lsExists);
+
+ require( "$IP/includes/DefaultSettings.php" );
+ require( "$IP/LocalSettings.php" );
+ if ( file_exists( "$IP/AdminSettings.php" ) ) {
+ require( "$IP/AdminSettings.php" );
+ }
+ return get_defined_vars();
+ }
+
+ /**
+ * Get a fake password for sending back to the user in HTML.
+ * This is a security mechanism to avoid compromise of the password in the
+ * event of session ID compromise.
+ *
+ * @param $realPassword String
+ *
+ * @return string
+ */
+ public function getFakePassword( $realPassword ) {
+ return str_repeat( '*', strlen( $realPassword ) );
+ }
+
+ /**
+ * Set a variable which stores a password, except if the new value is a
+ * fake password in which case leave it as it is.
+ *
+ * @param $name String
+ * @param $value Mixed
+ */
+ public function setPassword( $name, $value ) {
+ if ( !preg_match( '/^\*+$/', $value ) ) {
+ $this->setVar( $name, $value );
+ }
+ }
+
+ /**
+ * On POSIX systems return the primary group of the webserver we're running under.
+ * On other systems just returns null.
+ *
+ * This is used to advice the user that he should chgrp his mw-config/data/images directory as the
+ * webserver user before he can install.
+ *
+ * Public because SqliteInstaller needs it, and doesn't subclass Installer.
+ *
+ * @return mixed
+ */
+ public static function maybeGetWebserverPrimaryGroup() {
+ if ( !function_exists( 'posix_getegid' ) || !function_exists( 'posix_getpwuid' ) ) {
+ # I don't know this, this isn't UNIX.
+ return null;
+ }
+
+ # posix_getegid() *not* getmygid() because we want the group of the webserver,
+ # not whoever owns the current script.
+ $gid = posix_getegid();
+ $getpwuid = posix_getpwuid( $gid );
+ $group = $getpwuid['name'];
+
+ return $group;
+ }
+
+ /**
+ * Convert wikitext $text to HTML.
+ *
+ * This is potentially error prone since many parser features require a complete
+ * installed MW database. The solution is to just not use those features when you
+ * write your messages. This appears to work well enough. Basic formatting and
+ * external links work just fine.
+ *
+ * But in case a translator decides to throw in a #ifexist or internal link or
+ * whatever, this function is guarded to catch the attempted DB access and to present
+ * some fallback text.
+ *
+ * @param $text String
+ * @param $lineStart Boolean
+ * @return String
+ */
+ public function parse( $text, $lineStart = false ) {
+ global $wgParser;
+
+ try {
+ $out = $wgParser->parse( $text, $this->parserTitle, $this->parserOptions, $lineStart );
+ $html = $out->getText();
+ } catch ( DBAccessError $e ) {
+ $html = '<!--DB access attempted during parse--> ' . htmlspecialchars( $text );
+
+ if ( !empty( $this->debug ) ) {
+ $html .= "<!--\n" . $e->getTraceAsString() . "\n-->";
+ }
+ }
+
+ return $html;
+ }
+
+ public function getParserOptions() {
+ return $this->parserOptions;
+ }
+
+ public function disableLinkPopups() {
+ $this->parserOptions->setExternalLinkTarget( false );
+ }
+
+ public function restoreLinkPopups() {
+ global $wgExternalLinkTarget;
+ $this->parserOptions->setExternalLinkTarget( $wgExternalLinkTarget );
+ }
+
+ /**
+ * Install step which adds a row to the site_stats table with appropriate
+ * initial values.
+ */
+ public function populateSiteStats( DatabaseInstaller $installer ) {
+ $status = $installer->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $status->value->insert( 'site_stats', array(
+ 'ss_row_id' => 1,
+ 'ss_total_views' => 0,
+ 'ss_total_edits' => 0,
+ 'ss_good_articles' => 0,
+ 'ss_total_pages' => 0,
+ 'ss_users' => 0,
+ 'ss_admins' => 0,
+ 'ss_images' => 0 ),
+ __METHOD__, 'IGNORE' );
+ return Status::newGood();
+ }
+
+ /**
+ * Exports all wg* variables stored by the installer into global scope.
+ */
+ public function exportVars() {
+ foreach ( $this->settings as $name => $value ) {
+ if ( substr( $name, 0, 2 ) == 'wg' ) {
+ $GLOBALS[$name] = $value;
+ }
+ }
+ }
+
+ /**
+ * Environment check for DB types.
+ */
+ protected function envCheckDB() {
+ global $wgLang;
+
+ $compiledDBs = array();
+ $allNames = array();
+
+ foreach ( self::getDBTypes() as $name ) {
+ $db = $this->getDBInstaller( $name );
+ $readableName = wfMsg( 'config-type-' . $name );
+
+ if ( $db->isCompiled() ) {
+ $compiledDBs[] = $name;
+ }
+ $allNames[] = $readableName;
+ }
+
+ $this->setVar( '_CompiledDBs', $compiledDBs );
+
+ if ( !$compiledDBs ) {
+ $this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
+ // FIXME: this only works for the web installer!
+ return false;
+ }
+
+ // Check for FTS3 full-text search module
+ $sqlite = $this->getDBInstaller( 'sqlite' );
+ if ( $sqlite->isCompiled() ) {
+ if( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
+ $this->showMessage( 'config-no-fts3' );
+ }
+ }
+ }
+
+ /**
+ * Environment check for register_globals.
+ */
+ protected function envCheckRegisterGlobals() {
+ if( wfIniGetBool( "magic_quotes_runtime" ) ) {
+ $this->showMessage( 'config-register-globals' );
+ }
+ }
+
+ /**
+ * Some versions of libxml+PHP break < and > encoding horribly
+ */
+ protected function envCheckBrokenXML() {
+ $test = new PhpXmlBugTester();
+ if ( !$test->ok ) {
+ $this->showError( 'config-brokenlibxml' );
+ return false;
+ }
+ }
+
+ /**
+ * Test PHP (probably 5.3.1, but it could regress again) to make sure that
+ * reference parameters to __call() are not converted to null
+ */
+ protected function envCheckPHP531() {
+ $test = new PhpRefCallBugTester;
+ $test->execute();
+ if ( !$test->ok ) {
+ $this->showError( 'config-using531', phpversion() );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for magic_quotes_runtime.
+ */
+ protected function envCheckMagicQuotes() {
+ if( wfIniGetBool( "magic_quotes_runtime" ) ) {
+ $this->showError( 'config-magic-quotes-runtime' );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for magic_quotes_sybase.
+ */
+ protected function envCheckMagicSybase() {
+ if ( wfIniGetBool( 'magic_quotes_sybase' ) ) {
+ $this->showError( 'config-magic-quotes-sybase' );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for mbstring.func_overload.
+ */
+ protected function envCheckMbstring() {
+ if ( wfIniGetBool( 'mbstring.func_overload' ) ) {
+ $this->showError( 'config-mbstring' );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for zend.ze1_compatibility_mode.
+ */
+ protected function envCheckZE1() {
+ if ( wfIniGetBool( 'zend.ze1_compatibility_mode' ) ) {
+ $this->showError( 'config-ze1' );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for safe_mode.
+ */
+ protected function envCheckSafeMode() {
+ if ( wfIniGetBool( 'safe_mode' ) ) {
+ $this->setVar( '_SafeMode', true );
+ $this->showMessage( 'config-safe-mode' );
+ }
+ }
+
+ /**
+ * Environment check for the XML module.
+ */
+ protected function envCheckXML() {
+ if ( !function_exists( "utf8_encode" ) ) {
+ $this->showError( 'config-xml-bad' );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for the PCRE module.
+ */
+ protected function envCheckPCRE() {
+ if ( !function_exists( 'preg_match' ) ) {
+ $this->showError( 'config-pcre' );
+ return false;
+ }
+ wfSuppressWarnings();
+ $regexd = preg_replace( '/[\x{0430}-\x{04FF}]/iu', '', '-ÐБВГД-' );
+ wfRestoreWarnings();
+ if ( $regexd != '--' ) {
+ $this->showError( 'config-pcre-no-utf8' );
+ return false;
+ }
+ }
+
+ /**
+ * Environment check for available memory.
+ */
+ protected function envCheckMemory() {
+ $limit = ini_get( 'memory_limit' );
+
+ if ( !$limit || $limit == -1 ) {
+ return true;
+ }
+
+ $n = wfShorthandToInteger( $limit );
+
+ if( $n < $this->minMemorySize * 1024 * 1024 ) {
+ $newLimit = "{$this->minMemorySize}M";
+
+ if( ini_set( "memory_limit", $newLimit ) === false ) {
+ $this->showMessage( 'config-memory-bad', $limit );
+ } else {
+ $this->showMessage( 'config-memory-raised', $limit, $newLimit );
+ $this->setVar( '_RaiseMemory', true );
+ }
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Environment check for compiled object cache types.
+ */
+ protected function envCheckCache() {
+ $caches = array();
+ foreach ( $this->objectCaches as $name => $function ) {
+ if ( function_exists( $function ) ) {
+ $caches[$name] = true;
+ }
+ }
+
+ if ( !$caches ) {
+ $this->showMessage( 'config-no-cache' );
+ }
+
+ $this->setVar( '_Caches', $caches );
+ }
+
+ /**
+ * Search for GNU diff3.
+ */
+ protected function envCheckDiff3() {
+ $names = array( "gdiff3", "diff3", "diff3.exe" );
+ $versionInfo = array( '$1 --version 2>&1', 'GNU diffutils' );
+
+ $diff3 = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+
+ if ( $diff3 ) {
+ $this->setVar( 'wgDiff3', $diff3 );
+ } else {
+ $this->setVar( 'wgDiff3', false );
+ $this->showMessage( 'config-diff3-bad' );
+ }
+ }
+
+ /**
+ * Environment check for ImageMagick and GD.
+ */
+ protected function envCheckGraphics() {
+ $names = array( wfIsWindows() ? 'convert.exe' : 'convert' );
+ $convert = self::locateExecutableInDefaultPaths( $names, array( '$1 -version', 'ImageMagick' ) );
+
+ $this->setVar( 'wgImageMagickConvertCommand', '' );
+ if ( $convert ) {
+ $this->setVar( 'wgImageMagickConvertCommand', $convert );
+ $this->showMessage( 'config-imagemagick', $convert );
+ return true;
+ } elseif ( function_exists( 'imagejpeg' ) ) {
+ $this->showMessage( 'config-gd' );
+ return true;
+ } else {
+ $this->showMessage( 'config-no-scaling' );
+ }
+ }
+
+ /**
+ * Environment check for setting $IP and $wgScriptPath.
+ */
+ protected function envCheckPath() {
+ global $IP;
+ $IP = dirname( dirname( dirname( __FILE__ ) ) );
+
+ $this->setVar( 'IP', $IP );
+
+ // PHP_SELF isn't available sometimes, such as when PHP is CGI but
+ // cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
+ // to get the path to the current script... hopefully it's reliable. SIGH
+ if ( !empty( $_SERVER['PHP_SELF'] ) ) {
+ $path = $_SERVER['PHP_SELF'];
+ } elseif ( !empty( $_SERVER['SCRIPT_NAME'] ) ) {
+ $path = $_SERVER['SCRIPT_NAME'];
+ } elseif ( $this->getVar( 'wgScriptPath' ) ) {
+ // Some kind soul has set it for us already (e.g. debconf)
+ return true;
+ } else {
+ $this->showError( 'config-no-uri' );
+ return false;
+ }
+
+ $uri = preg_replace( '{^(.*)/(mw-)?config.*$}', '$1', $path );
+ $this->setVar( 'wgScriptPath', $uri );
+ }
+
+ /**
+ * Environment check for setting the preferred PHP file extension.
+ */
+ protected function envCheckExtension() {
+ // FIXME: detect this properly
+ if ( defined( 'MW_INSTALL_PHP5_EXT' ) ) {
+ $ext = 'php5';
+ } else {
+ $ext = 'php';
+ }
+ $this->setVar( 'wgScriptExtension', ".$ext" );
+ }
+
+ /**
+ * TODO: document
+ */
+ protected function envCheckShellLocale() {
+ $os = php_uname( 's' );
+ $supported = array( 'Linux', 'SunOS', 'HP-UX', 'Darwin' ); # Tested these
+
+ if ( !in_array( $os, $supported ) ) {
+ return true;
+ }
+
+ # Get a list of available locales.
+ $ret = false;
+ $lines = wfShellExec( '/usr/bin/locale -a', $ret );
+
+ if ( $ret ) {
+ return true;
+ }
+
+ $lines = wfArrayMap( 'trim', explode( "\n", $lines ) );
+ $candidatesByLocale = array();
+ $candidatesByLang = array();
+
+ foreach ( $lines as $line ) {
+ if ( $line === '' ) {
+ continue;
+ }
+
+ if ( !preg_match( '/^([a-zA-Z]+)(_[a-zA-Z]+|)\.(utf8|UTF-8)(@[a-zA-Z_]*|)$/i', $line, $m ) ) {
+ continue;
+ }
+
+ list( $all, $lang, $territory, $charset, $modifier ) = $m;
+
+ $candidatesByLocale[$m[0]] = $m;
+ $candidatesByLang[$lang][] = $m;
+ }
+
+ # Try the current value of LANG.
+ if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
+ $this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
+ return true;
+ }
+
+ # Try the most common ones.
+ $commonLocales = array( 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' );
+ foreach ( $commonLocales as $commonLocale ) {
+ if ( isset( $candidatesByLocale[$commonLocale] ) ) {
+ $this->setVar( 'wgShellLocale', $commonLocale );
+ return true;
+ }
+ }
+
+ # Is there an available locale in the Wiki's language?
+ $wikiLang = $this->getVar( 'wgLanguageCode' );
+
+ if ( isset( $candidatesByLang[$wikiLang] ) ) {
+ $m = reset( $candidatesByLang[$wikiLang] );
+ $this->setVar( 'wgShellLocale', $m[0] );
+ return true;
+ }
+
+ # Are there any at all?
+ if ( count( $candidatesByLocale ) ) {
+ $m = reset( $candidatesByLocale );
+ $this->setVar( 'wgShellLocale', $m[0] );
+ return true;
+ }
+
+ # Give up.
+ return true;
+ }
+
+ /**
+ * TODO: document
+ */
+ protected function envCheckUploadsDirectory() {
+ global $IP, $wgServer;
+
+ $dir = $IP . '/images/';
+ $url = $wgServer . $this->getVar( 'wgScriptPath' ) . '/images/';
+ $safe = !$this->dirIsExecutable( $dir, $url );
+
+ if ( $safe ) {
+ return true;
+ } else {
+ $this->showMessage( 'config-uploads-not-safe', $dir );
+ }
+ }
+
+ /**
+ * Checks if suhosin.get.max_value_length is set, and if so, sets
+ * $wgResourceLoaderMaxQueryLength to that value in the generated
+ * LocalSettings file
+ */
+ protected function envCheckSuhosinMaxValueLength() {
+ $maxValueLength = ini_get( 'suhosin.get.max_value_length' );
+ if ( $maxValueLength > 0 ) {
+ $this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
+ } else {
+ $maxValueLength = -1;
+ }
+ $this->setVar( 'wgResourceLoaderMaxQueryLength', $maxValueLength );
+ }
+
+ /**
+ * Convert a hex string representing a Unicode code point to that code point.
+ * @param $c String
+ * @return string
+ */
+ protected function unicodeChar( $c ) {
+ $c = hexdec($c);
+ if ($c <= 0x7F) {
+ return chr($c);
+ } else if ($c <= 0x7FF) {
+ return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
+ } else if ($c <= 0xFFFF) {
+ return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
+ . chr(0x80 | $c & 0x3F);
+ } else if ($c <= 0x10FFFF) {
+ return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
+ . chr(0x80 | $c >> 6 & 0x3F)
+ . chr(0x80 | $c & 0x3F);
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
+ * Check the libicu version
+ */
+ protected function envCheckLibicu() {
+ $utf8 = function_exists( 'utf8_normalize' );
+ $intl = function_exists( 'normalizer_normalize' );
+
+ /**
+ * This needs to be updated something that the latest libicu
+ * will properly normalize. This normalization was found at
+ * http://www.unicode.org/versions/Unicode5.2.0/#Character_Additions
+ * Note that we use the hex representation to create the code
+ * points in order to avoid any Unicode-destroying during transit.
+ */
+ $not_normal_c = $this->unicodeChar("FA6C");
+ $normal_c = $this->unicodeChar("242EE");
+
+ $useNormalizer = 'php';
+ $needsUpdate = false;
+
+ /**
+ * We're going to prefer the pecl extension here unless
+ * utf8_normalize is more up to date.
+ */
+ if( $utf8 ) {
+ $useNormalizer = 'utf8';
+ $utf8 = utf8_normalize( $not_normal_c, UNORM_NFC );
+ if ( $utf8 !== $normal_c ) $needsUpdate = true;
+ }
+ if( $intl ) {
+ $useNormalizer = 'intl';
+ $intl = normalizer_normalize( $not_normal_c, Normalizer::FORM_C );
+ if ( $intl !== $normal_c ) $needsUpdate = true;
+ }
+
+ // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', 'config-unicode-using-intl'
+ if( $useNormalizer === 'php' ) {
+ $this->showMessage( 'config-unicode-pure-php-warning' );
+ } else {
+ $this->showMessage( 'config-unicode-using-' . $useNormalizer );
+ if( $needsUpdate ) {
+ $this->showMessage( 'config-unicode-update-warning' );
+ }
+ }
+ }
+
+ /**
+ * Get an array of likely places we can find executables. Check a bunch
+ * of known Unix-like defaults, as well as the PATH environment variable
+ * (which should maybe make it work for Windows?)
+ *
+ * @return Array
+ */
+ protected static function getPossibleBinPaths() {
+ return array_merge(
+ array( '/usr/bin', '/usr/local/bin', '/opt/csw/bin',
+ '/usr/gnu/bin', '/usr/sfw/bin', '/sw/bin', '/opt/local/bin' ),
+ explode( PATH_SEPARATOR, getenv( 'PATH' ) )
+ );
+ }
+
+ /**
+ * Search a path for any of the given executable names. Returns the
+ * executable name if found. Also checks the version string returned
+ * by each executable.
+ *
+ * Used only by environment checks.
+ *
+ * @param $path String: path to search
+ * @param $names Array of executable names
+ * @param $versionInfo Boolean false or array with two members:
+ * 0 => Command to run for version check, with $1 for the full executable name
+ * 1 => String to compare the output with
+ *
+ * If $versionInfo is not false, only executables with a version
+ * matching $versionInfo[1] will be returned.
+ */
+ public static function locateExecutable( $path, $names, $versionInfo = false ) {
+ if ( !is_array( $names ) ) {
+ $names = array( $names );
+ }
+
+ foreach ( $names as $name ) {
+ $command = $path . DIRECTORY_SEPARATOR . $name;
+
+ wfSuppressWarnings();
+ $file_exists = file_exists( $command );
+ wfRestoreWarnings();
+
+ if ( $file_exists ) {
+ if ( !$versionInfo ) {
+ return $command;
+ }
+
+ $file = str_replace( '$1', wfEscapeShellArg( $command ), $versionInfo[0] );
+ if ( strstr( wfShellExec( $file ), $versionInfo[1] ) !== false ) {
+ return $command;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Same as locateExecutable(), but checks in getPossibleBinPaths() by default
+ * @see locateExecutable()
+ */
+ public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
+ foreach( self::getPossibleBinPaths() as $path ) {
+ $exe = self::locateExecutable( $path, $names, $versionInfo );
+ if( $exe !== false ) {
+ return $exe;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks if scripts located in the given directory can be executed via the given URL.
+ *
+ * Used only by environment checks.
+ */
+ public function dirIsExecutable( $dir, $url ) {
+ $scriptTypes = array(
+ 'php' => array(
+ "<?php echo 'ex' . 'ec';",
+ "#!/var/env php5\n<?php echo 'ex' . 'ec';",
+ ),
+ );
+
+ // it would be good to check other popular languages here, but it'll be slow.
+
+ wfSuppressWarnings();
+
+ foreach ( $scriptTypes as $ext => $contents ) {
+ foreach ( $contents as $source ) {
+ $file = 'exectest.' . $ext;
+
+ if ( !file_put_contents( $dir . $file, $source ) ) {
+ break;
+ }
+
+ try {
+ $text = Http::get( $url . $file, array( 'timeout' => 3 ) );
+ }
+ catch( MWException $e ) {
+ // Http::get throws with allow_url_fopen = false and no curl extension.
+ $text = null;
+ }
+ unlink( $dir . $file );
+
+ if ( $text == 'exec' ) {
+ wfRestoreWarnings();
+ return $ext;
+ }
+ }
+ }
+
+ wfRestoreWarnings();
+
+ return false;
+ }
+
+ /**
+ * ParserOptions are constructed before we determined the language, so fix it
+ */
+ public function setParserLanguage( $lang ) {
+ $this->parserOptions->setTargetLanguage( $lang );
+ $this->parserOptions->setUserLang( $lang->getCode() );
+ }
+
+ /**
+ * Overridden by WebInstaller to provide lastPage parameters.
+ */
+ protected function getDocUrl( $page ) {
+ return "{$_SERVER['PHP_SELF']}?page=" . urlencode( $page );
+ }
+
+ /**
+ * Finds extensions that follow the format /extensions/Name/Name.php,
+ * and returns an array containing the value for 'Name' for each found extension.
+ *
+ * @return array
+ */
+ public function findExtensions() {
+ if( $this->getVar( 'IP' ) === null ) {
+ return false;
+ }
+
+ $exts = array();
+ $dir = $this->getVar( 'IP' ) . '/extensions';
+ $dh = opendir( $dir );
+
+ while ( ( $file = readdir( $dh ) ) !== false ) {
+ if( file_exists( "$dir/$file/$file.php" ) ) {
+ $exts[] = $file;
+ }
+ }
+
+ return $exts;
+ }
+
+ /**
+ * Installs the auto-detected extensions.
+ *
+ * @return Status
+ */
+ protected function includeExtensions() {
+ global $IP;
+ $exts = $this->getVar( '_Extensions' );
+ $IP = $this->getVar( 'IP' );
+
+ /**
+ * We need to include DefaultSettings before including extensions to avoid
+ * warnings about unset variables. However, the only thing we really
+ * want here is $wgHooks['LoadExtensionSchemaUpdates']. This won't work
+ * if the extension has hidden hook registration in $wgExtensionFunctions,
+ * but we're not opening that can of worms
+ * @see https://bugzilla.wikimedia.org/show_bug.cgi?id=26857
+ */
+ global $wgAutoloadClasses;
+ require( "$IP/includes/DefaultSettings.php" );
+
+ foreach( $exts as $e ) {
+ require_once( $IP . '/extensions' . "/$e/$e.php" );
+ }
+
+ $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
+ $wgHooks['LoadExtensionSchemaUpdates'] : array();
+
+ // Unset everyone else's hooks. Lord knows what someone might be doing
+ // in ParserFirstCallInit (see bug 27171)
+ $GLOBALS['wgHooks'] = array( 'LoadExtensionSchemaUpdates' => $hooksWeWant );
+
+ return Status::newGood();
+ }
+
+ /**
+ * Get an array of install steps. Should always be in the format of
+ * array(
+ * 'name' => 'someuniquename',
+ * 'callback' => array( $obj, 'method' ),
+ * )
+ * There must be a config-install-$name message defined per step, which will
+ * be shown on install.
+ *
+ * @param $installer DatabaseInstaller so we can make callbacks
+ * @return array
+ */
+ protected function getInstallSteps( DatabaseInstaller $installer ) {
+ $coreInstallSteps = array(
+ array( 'name' => 'database', 'callback' => array( $installer, 'setupDatabase' ) ),
+ array( 'name' => 'tables', 'callback' => array( $installer, 'createTables' ) ),
+ array( 'name' => 'interwiki', 'callback' => array( $installer, 'populateInterwikiTable' ) ),
+ array( 'name' => 'stats', 'callback' => array( $this, 'populateSiteStats' ) ),
+ array( 'name' => 'keys', 'callback' => array( $this, 'generateKeys' ) ),
+ array( 'name' => 'sysop', 'callback' => array( $this, 'createSysop' ) ),
+ array( 'name' => 'mainpage', 'callback' => array( $this, 'createMainpage' ) ),
+ );
+
+ // Build the array of install steps starting from the core install list,
+ // then adding any callbacks that wanted to attach after a given step
+ foreach( $coreInstallSteps as $step ) {
+ $this->installSteps[] = $step;
+ if( isset( $this->extraInstallSteps[ $step['name'] ] ) ) {
+ $this->installSteps = array_merge(
+ $this->installSteps,
+ $this->extraInstallSteps[ $step['name'] ]
+ );
+ }
+ }
+
+ // Prepend any steps that want to be at the beginning
+ if( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
+ $this->installSteps = array_merge(
+ $this->extraInstallSteps['BEGINNING'],
+ $this->installSteps
+ );
+ }
+
+ // Extensions should always go first, chance to tie into hooks and such
+ if( count( $this->getVar( '_Extensions' ) ) ) {
+ array_unshift( $this->installSteps,
+ array( 'name' => 'extensions', 'callback' => array( $this, 'includeExtensions' ) )
+ );
+ $this->installSteps[] = array(
+ 'name' => 'extension-tables',
+ 'callback' => array( $installer, 'createExtensionTables' )
+ );
+ }
+ return $this->installSteps;
+ }
+
+ /**
+ * Actually perform the installation.
+ *
+ * @param $startCB Array A callback array for the beginning of each step
+ * @param $endCB Array A callback array for the end of each step
+ *
+ * @return Array of Status objects
+ */
+ public function performInstallation( $startCB, $endCB ) {
+ $installResults = array();
+ $installer = $this->getDBInstaller();
+ $installer->preInstall();
+ $steps = $this->getInstallSteps( $installer );
+ foreach( $steps as $stepObj ) {
+ $name = $stepObj['name'];
+ call_user_func_array( $startCB, array( $name ) );
+
+ // Perform the callback step
+ $status = call_user_func( $stepObj['callback'], $installer );
+
+ // Output and save the results
+ call_user_func( $endCB, $name, $status );
+ $installResults[$name] = $status;
+
+ // If we've hit some sort of fatal, we need to bail.
+ // Callback already had a chance to do output above.
+ if( !$status->isOk() ) {
+ break;
+ }
+ }
+ if( $status->isOk() ) {
+ $this->setVar( '_InstallDone', true );
+ }
+ return $installResults;
+ }
+
+ /**
+ * Generate $wgSecretKey. Will warn if we had to use mt_rand() instead of
+ * /dev/urandom
+ *
+ * @return Status
+ */
+ public function generateKeys() {
+ $keys = array( 'wgSecretKey' => 64 );
+ if ( strval( $this->getVar( 'wgUpgradeKey' ) ) === '' ) {
+ $keys['wgUpgradeKey'] = 16;
+ }
+ return $this->doGenerateKeys( $keys );
+ }
+
+ /**
+ * Generate a secret value for variables using either
+ * /dev/urandom or mt_rand(). Produce a warning in the later case.
+ *
+ * @param $keys Array
+ * @return Status
+ */
+ protected function doGenerateKeys( $keys ) {
+ $status = Status::newGood();
+
+ wfSuppressWarnings();
+ $file = fopen( "/dev/urandom", "r" );
+ wfRestoreWarnings();
+
+ foreach ( $keys as $name => $length ) {
+ if ( $file ) {
+ $secretKey = bin2hex( fread( $file, $length / 2 ) );
+ } else {
+ $secretKey = '';
+
+ for ( $i = 0; $i < $length / 8; $i++ ) {
+ $secretKey .= dechex( mt_rand( 0, 0x7fffffff ) );
+ }
+ }
+
+ $this->setVar( $name, $secretKey );
+ }
+
+ if ( $file ) {
+ fclose( $file );
+ } else {
+ $names = array_keys ( $keys );
+ $names = preg_replace( '/^(.*)$/', '\$$1', $names );
+ global $wgLang;
+ $status->warning( 'config-insecure-keys', $wgLang->listToText( $names ), count( $names ) );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Create the first user account, grant it sysop and bureaucrat rights
+ *
+ * @return Status
+ */
+ protected function createSysop() {
+ $name = $this->getVar( '_AdminName' );
+ $user = User::newFromName( $name );
+
+ if ( !$user ) {
+ // We should've validated this earlier anyway!
+ return Status::newFatal( 'config-admin-error-user', $name );
+ }
+
+ if ( $user->idForName() == 0 ) {
+ $user->addToDatabase();
+
+ try {
+ $user->setPassword( $this->getVar( '_AdminPassword' ) );
+ } catch( PasswordError $pwe ) {
+ return Status::newFatal( 'config-admin-error-password', $name, $pwe->getMessage() );
+ }
+
+ $user->addGroup( 'sysop' );
+ $user->addGroup( 'bureaucrat' );
+ if( $this->getVar( '_AdminEmail' ) ) {
+ $user->setEmail( $this->getVar( '_AdminEmail' ) );
+ }
+ $user->saveSettings();
+
+ // Update user count
+ $ssUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
+ $ssUpdate->doUpdate();
+ }
+ $status = Status::newGood();
+
+ if( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
+ $this->subscribeToMediaWikiAnnounce( $status );
+ }
+
+ return $status;
+ }
+
+ private function subscribeToMediaWikiAnnounce( Status $s ) {
+ $params = array(
+ 'email' => $this->getVar( '_AdminEmail' ),
+ 'language' => 'en',
+ 'digest' => 0
+ );
+
+ // Mailman doesn't support as many languages as we do, so check to make
+ // sure their selected language is available
+ $myLang = $this->getVar( '_UserLang' );
+ if( in_array( $myLang, $this->mediaWikiAnnounceLanguages ) ) {
+ $myLang = $myLang == 'pt-br' ? 'pt_BR' : $myLang; // rewrite to Mailman's pt_BR
+ $params['language'] = $myLang;
+ }
+
+ $res = MWHttpRequest::factory( $this->mediaWikiAnnounceUrl,
+ array( 'method' => 'POST', 'postData' => $params ) )->execute();
+ if( !$res->isOK() ) {
+ $s->warning( 'config-install-subscribe-fail', $res->getMessage() );
+ }
+ }
+
+ /**
+ * Insert Main Page with default content.
+ *
+ * @return Status
+ */
+ protected function createMainpage( DatabaseInstaller $installer ) {
+ $status = Status::newGood();
+ try {
+ $article = new Article( Title::newMainPage() );
+ $article->doEdit( wfMsgForContent( 'mainpagetext' ) . "\n\n" .
+ wfMsgForContent( 'mainpagedocfooter' ),
+ '',
+ EDIT_NEW,
+ false,
+ User::newFromName( 'MediaWiki default' ) );
+ } catch (MWException $e) {
+ //using raw, because $wgShowExceptionDetails can not be set yet
+ $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Override the necessary bits of the config to run an installation.
+ */
+ public static function overrideConfig() {
+ define( 'MW_NO_SESSION', 1 );
+
+ // Don't access the database
+ $GLOBALS['wgUseDatabaseMessages'] = false;
+ // Debug-friendly
+ $GLOBALS['wgShowExceptionDetails'] = true;
+ // Don't break forms
+ $GLOBALS['wgExternalLinkTarget'] = '_blank';
+
+ // Extended debugging
+ $GLOBALS['wgShowSQLErrors'] = true;
+ $GLOBALS['wgShowDBErrorBacktrace'] = true;
+
+ // Allow multiple ob_flush() calls
+ $GLOBALS['wgDisableOutputCompression'] = true;
+
+ // Use a sensible cookie prefix (not my_wiki)
+ $GLOBALS['wgCookiePrefix'] = 'mw_installer';
+
+ // Some of the environment checks make shell requests, remove limits
+ $GLOBALS['wgMaxShellMemory'] = 0;
+ }
+
+ /**
+ * Add an installation step following the given step.
+ *
+ * @param $callback Array A valid installation callback array, in this form:
+ * array( 'name' => 'some-unique-name', 'callback' => array( $obj, 'function' ) );
+ * @param $findStep String the step to find. Omit to put the step at the beginning
+ */
+ public function addInstallStep( $callback, $findStep = 'BEGINNING' ) {
+ $this->extraInstallSteps[$findStep][] = $callback;
+ }
+}
diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php
new file mode 100644
index 00000000..04926c9b
--- /dev/null
+++ b/includes/installer/LocalSettingsGenerator.php
@@ -0,0 +1,349 @@
+<?php
+/**
+ * Generator for LocalSettings.php file.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for generating LocalSettings.php file.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class LocalSettingsGenerator {
+
+ private $extensions = array();
+ private $values = array();
+ private $groupPermissions = array();
+ private $dbSettings = '';
+ private $safeMode = false;
+
+ /**
+ * @var Installer
+ */
+ private $installer;
+
+ /**
+ * Constructor.
+ *
+ * @param $installer Installer subclass
+ */
+ public function __construct( Installer $installer ) {
+ $this->installer = $installer;
+
+ $this->extensions = $installer->getVar( '_Extensions' );
+
+ $db = $installer->getDBInstaller( $installer->getVar( 'wgDBtype' ) );
+
+ $confItems = array_merge(
+ array(
+ 'wgScriptPath', 'wgScriptExtension',
+ 'wgPasswordSender', 'wgImageMagickConvertCommand', 'wgShellLocale',
+ 'wgLanguageCode', 'wgEnableEmail', 'wgEnableUserEmail', 'wgDiff3',
+ 'wgEnotifUserTalk', 'wgEnotifWatchlist', 'wgEmailAuthentication',
+ 'wgDBtype', 'wgSecretKey', 'wgRightsUrl', 'wgSitename', 'wgRightsIcon',
+ 'wgRightsText', 'wgRightsCode', 'wgMainCacheType', 'wgEnableUploads',
+ 'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
+ 'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
+ 'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength'
+ ),
+ $db->getGlobalNames()
+ );
+
+ $unescaped = array( 'wgRightsIcon' );
+ $boolItems = array(
+ 'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
+ 'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
+ );
+
+ foreach( $confItems as $c ) {
+ $val = $installer->getVar( $c );
+
+ if( in_array( $c, $boolItems ) ) {
+ $val = wfBoolToStr( $val );
+ }
+
+ if ( !in_array( $c, $unescaped ) ) {
+ $val = self::escapePhpString( $val );
+ }
+
+ $this->values[$c] = $val;
+ }
+
+ $this->dbSettings = $db->getLocalSettings();
+ $this->safeMode = $installer->getVar( '_SafeMode' );
+ $this->values['wgEmergencyContact'] = $this->values['wgPasswordSender'];
+ }
+
+ /**
+ * For $wgGroupPermissions, set a given ['group']['permission'] value.
+ * @param $group String Group name
+ * @param $rightsArr Array An array of permissions, in the form of:
+ * array( 'right' => true, 'right2' => false )
+ */
+ public function setGroupRights( $group, $rightsArr ) {
+ $this->groupPermissions[$group] = $rightsArr;
+ }
+
+ /**
+ * Returns the escaped version of a string of php code.
+ *
+ * @param $string String
+ *
+ * @return String
+ */
+ public static function escapePhpString( $string ) {
+ if ( is_array( $string ) || is_object( $string ) ) {
+ return false;
+ }
+
+ return strtr(
+ $string,
+ array(
+ "\n" => "\\n",
+ "\r" => "\\r",
+ "\t" => "\\t",
+ "\\" => "\\\\",
+ "\$" => "\\\$",
+ "\"" => "\\\""
+ )
+ );
+ }
+
+ /**
+ * Return the full text of the generated LocalSettings.php file,
+ * including the extensions
+ *
+ * @return String
+ */
+ public function getText() {
+ $localSettings = $this->getDefaultText();
+
+ if( count( $this->extensions ) ) {
+ $localSettings .= "
+# Enabled Extensions. Most extensions are enabled by including the base extension file here
+# but check specific extension documentation for more details
+# The following extensions were automatically enabled:\n";
+
+ foreach( $this->extensions as $extName ) {
+ $encExtName = self::escapePhpString( $extName );
+ $localSettings .= "require( \"extensions/$encExtName/$encExtName.php\" );\n";
+ }
+ }
+
+ $localSettings .= "\n\n# End of automatically generated settings.
+# Add more configuration options below.\n\n";
+
+ return $localSettings;
+ }
+
+ /**
+ * Write the generated LocalSettings to a file
+ *
+ * @param $fileName String Full path to filename to write to
+ */
+ public function writeFile( $fileName ) {
+ file_put_contents( $fileName, $this->getText() );
+ }
+
+ /**
+ * @return String
+ */
+ private function buildMemcachedServerList() {
+ $servers = $this->values['_MemCachedServers'];
+
+ if( !$servers ) {
+ return 'array()';
+ } else {
+ $ret = 'array( ';
+ $servers = explode( ',', $servers );
+
+ foreach( $servers as $srv ) {
+ $srv = trim( $srv );
+ $ret .= "'$srv', ";
+ }
+
+ return rtrim( $ret, ', ' ) . ' )';
+ }
+ }
+
+ /**
+ * @return String
+ */
+ private function getDefaultText() {
+ if( !$this->values['wgImageMagickConvertCommand'] ) {
+ $this->values['wgImageMagickConvertCommand'] = '/usr/bin/convert';
+ $magic = '#';
+ } else {
+ $magic = '';
+ }
+
+ if( !$this->values['wgShellLocale'] ) {
+ $this->values['wgShellLocale'] = 'en_US.UTF-8';
+ $locale = '#';
+ } else {
+ $locale = '';
+ }
+
+ $rightsUrl = $this->values['wgRightsUrl'] ? '' : '#';
+ $hashedUploads = $this->safeMode ? '' : '#';
+ $metaNamespace = '';
+ if( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
+ $metaNamespace = "\$wgMetaNamespace = \"{$this->values['wgMetaNamespace']}\";\n";
+ }
+
+ $groupRights = '';
+ if( $this->groupPermissions ) {
+ $groupRights .= "# The following permissions were set based on your choice in the installer\n";
+ foreach( $this->groupPermissions as $group => $rightArr ) {
+ $group = self::escapePhpString( $group );
+ foreach( $rightArr as $right => $perm ) {
+ $right = self::escapePhpString( $right );
+ $groupRights .= "\$wgGroupPermissions['$group']['$right'] = " .
+ wfBoolToStr( $perm ) . ";\n";
+ }
+ }
+ }
+
+ switch( $this->values['wgMainCacheType'] ) {
+ case 'anything':
+ case 'db':
+ case 'memcached':
+ case 'accel':
+ $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType']);
+ break;
+ case 'none':
+ default:
+ $cacheType = 'CACHE_NONE';
+ }
+
+ $mcservers = $this->buildMemcachedServerList();
+ return "<?php
+# This file was automatically generated by the MediaWiki {$GLOBALS['wgVersion']}
+# installer. If you make manual changes, please keep track in case you
+# need to recreate them later.
+#
+# See includes/DefaultSettings.php for all configurable settings
+# and their default values, but don't forget to make changes in _this_
+# file, not there.
+#
+# Further documentation for configuration settings may be found at:
+# http://www.mediawiki.org/wiki/Manual:Configuration_settings
+
+# Protect against web entry
+if ( !defined( 'MEDIAWIKI' ) ) {
+ exit;
+}
+
+## Uncomment this to disable output compression
+# \$wgDisableOutputCompression = true;
+
+\$wgSitename = \"{$this->values['wgSitename']}\";
+{$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:
+## http://www.mediawiki.org/wiki/Manual:Short_URL
+\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
+\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
+
+## The relative URL path to the skins directory
+\$wgStylePath = \"\$wgScriptPath/skins\";
+
+## The relative URL path to the logo. Make sure you change this from the default,
+## or else you'll overwrite your logo when you upgrade!
+\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
+
+## UPO means: this is also a user preference option
+
+\$wgEnableEmail = {$this->values['wgEnableEmail']};
+\$wgEnableUserEmail = {$this->values['wgEnableUserEmail']}; # UPO
+
+\$wgEmergencyContact = \"{$this->values['wgEmergencyContact']}\";
+\$wgPasswordSender = \"{$this->values['wgPasswordSender']}\";
+
+\$wgEnotifUserTalk = {$this->values['wgEnotifUserTalk']}; # UPO
+\$wgEnotifWatchlist = {$this->values['wgEnotifWatchlist']}; # UPO
+\$wgEmailAuthentication = {$this->values['wgEmailAuthentication']};
+
+## Database settings
+\$wgDBtype = \"{$this->values['wgDBtype']}\";
+\$wgDBserver = \"{$this->values['wgDBserver']}\";
+\$wgDBname = \"{$this->values['wgDBname']}\";
+\$wgDBuser = \"{$this->values['wgDBuser']}\";
+\$wgDBpassword = \"{$this->values['wgDBpassword']}\";
+
+{$this->dbSettings}
+
+## Shared memory settings
+\$wgMainCacheType = $cacheType;
+\$wgMemCachedServers = $mcservers;
+
+## To enable image uploads, make sure the 'images' directory
+## is writable, then set this to true:
+\$wgEnableUploads = {$this->values['wgEnableUploads']};
+{$magic}\$wgUseImageMagick = true;
+{$magic}\$wgImageMagickConvertCommand = \"{$this->values['wgImageMagickConvertCommand']}\";
+
+# InstantCommons allows wiki to use images from http://commons.wikimedia.org
+\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
+
+## If you use ImageMagick (or any other shell command) on a
+## Linux server, this will need to be set to the name of an
+## available UTF-8 locale
+{$locale}\$wgShellLocale = \"{$this->values['wgShellLocale']}\";
+
+## If you want to use image uploads under safe mode,
+## create the directories images/archive, images/thumb and
+## images/temp, and make them all writable. Then uncomment
+## this, if it's not already uncommented:
+{$hashedUploads}\$wgHashedUploadDirectory = false;
+
+## If you have the appropriate support software installed
+## you can enable inline LaTeX equations:
+\$wgUseTeX = false;
+
+## Set \$wgCacheDirectory to a writable directory on the web server
+## to make your wiki go slightly faster. The directory should not
+## be publically accessible from the web.
+#\$wgCacheDirectory = \"\$IP/cache\";
+
+# Site language code, should be one of ./languages/Language(.*).php
+\$wgLanguageCode = \"{$this->values['wgLanguageCode']}\";
+
+\$wgSecretKey = \"{$this->values['wgSecretKey']}\";
+
+# Site upgrade key. Must be set to a string (default provided) to turn on the
+# web installer while LocalSettings.php is in place
+\$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
+
+## Default skin: you can change the default skin. Use the internal symbolic
+## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
+\$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
+
+## For attaching licensing metadata to pages, and displaying an
+## appropriate copyright notice / icon. GNU Free Documentation
+## License and Creative Commons licenses are supported so far.
+{$rightsUrl}\$wgEnableCreativeCommonsRdf = true;
+\$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
+\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
+\$wgRightsText = \"{$this->values['wgRightsText']}\";
+\$wgRightsIcon = \"{$this->values['wgRightsIcon']}\";
+# \$wgRightsCode = \"{$this->values['wgRightsCode']}\"; # Not yet used
+
+# Path to the GNU diff3 utility. Used for conflict resolution.
+\$wgDiff3 = \"{$this->values['wgDiff3']}\";
+
+{$groupRights}
+
+# Query string length limit for ResourceLoader. You should only set this if
+# your web server has a query string length limit (then set it to that limit),
+# or if you have suhosin.get.max_value_length set in php.ini (then set it to
+# that value)
+\$wgResourceLoaderMaxQueryLength = {$this->values['wgResourceLoaderMaxQueryLength']};
+";
+ }
+
+}
diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php
new file mode 100644
index 00000000..2fe16dcf
--- /dev/null
+++ b/includes/installer/MysqlInstaller.php
@@ -0,0 +1,589 @@
+<?php
+/**
+ * MySQL-specific installer.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for setting up the MediaWiki database using MySQL.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class MysqlInstaller extends DatabaseInstaller {
+
+ protected $globalNames = array(
+ 'wgDBserver',
+ 'wgDBname',
+ 'wgDBuser',
+ 'wgDBpassword',
+ 'wgDBprefix',
+ 'wgDBTableOptions',
+ 'wgDBmysql5',
+ );
+
+ protected $internalDefaults = array(
+ '_MysqlEngine' => 'InnoDB',
+ '_MysqlCharset' => 'binary',
+ '_InstallUser' => 'root',
+ );
+
+ public $supportedEngines = array( 'InnoDB', 'MyISAM' );
+
+ public $minimumVersion = '4.0.14';
+
+ public $webUserPrivs = array(
+ 'DELETE',
+ 'INSERT',
+ 'SELECT',
+ 'UPDATE',
+ 'CREATE TEMPORARY TABLES',
+ );
+
+ public function getName() {
+ return 'mysql';
+ }
+
+ public function __construct( $parent ) {
+ parent::__construct( $parent );
+ }
+
+ public function isCompiled() {
+ return self::checkExtension( 'mysql' );
+ }
+
+ public function getGlobalDefaults() {
+ return array();
+ }
+
+ public function getConnectForm() {
+ return
+ $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+ $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
+ $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array(), $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
+ Html::closeElement( 'fieldset' ) .
+ $this->getInstallUserBox();
+ }
+
+ public function submitConnectForm() {
+ // Get variables from the request.
+ $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBprefix' ) );
+
+ // Validate them.
+ $status = Status::newGood();
+ if ( !strlen( $newValues['wgDBserver'] ) ) {
+ $status->fatal( 'config-missing-db-host' );
+ }
+ if ( !strlen( $newValues['wgDBname'] ) ) {
+ $status->fatal( 'config-missing-db-name' );
+ } elseif ( !preg_match( '/^[a-z0-9_-]+$/i', $newValues['wgDBname'] ) ) {
+ $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
+ }
+ if ( !preg_match( '/^[a-z0-9_-]*$/i', $newValues['wgDBprefix'] ) ) {
+ $status->fatal( 'config-invalid-db-prefix', $newValues['wgDBprefix'] );
+ }
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // Submit user box
+ $status = $this->submitInstallUserBox();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // Try to connect
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ // Check version
+ $version = $conn->getServerVersion();
+ if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
+ return Status::newFatal( 'config-mysql-old', $this->minimumVersion, $version );
+ }
+
+ return $status;
+ }
+
+ public function openConnection() {
+ $status = Status::newGood();
+ try {
+ $db = new DatabaseMysql(
+ $this->getVar( 'wgDBserver' ),
+ $this->getVar( '_InstallUser' ),
+ $this->getVar( '_InstallPassword' ),
+ false,
+ false,
+ 0,
+ $this->getVar( 'wgDBprefix' )
+ );
+ $status->value = $db;
+ } catch ( DBConnectionError $e ) {
+ $status->fatal( 'config-connection-error', $e->getMessage() );
+ }
+ return $status;
+ }
+
+ public function preUpgrade() {
+ global $wgDBuser, $wgDBpassword;
+
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ $this->parent->showStatusError( $status );
+ return;
+ }
+ $conn = $status->value;
+ $conn->selectDB( $this->getVar( 'wgDBname' ) );
+
+ # Determine existing default character set
+ if ( $conn->tableExists( "revision" ) ) {
+ $revision = $conn->buildLike( $this->getVar( 'wgDBprefix' ) . 'revision' );
+ $res = $conn->query( "SHOW TABLE STATUS $revision", __METHOD__ );
+ $row = $conn->fetchObject( $res );
+ if ( !$row ) {
+ $this->parent->showMessage( 'config-show-table-status' );
+ $existingSchema = false;
+ $existingEngine = false;
+ } else {
+ if ( preg_match( '/^latin1/', $row->Collation ) ) {
+ $existingSchema = 'mysql4';
+ } elseif ( preg_match( '/^utf8/', $row->Collation ) ) {
+ $existingSchema = 'utf8';
+ } elseif ( preg_match( '/^binary/', $row->Collation ) ) {
+ $existingSchema = 'binary';
+ } else {
+ $existingSchema = false;
+ $this->parent->showMessage( 'config-unknown-collation' );
+ }
+ if ( isset( $row->Engine ) ) {
+ $existingEngine = $row->Engine;
+ } else {
+ $existingEngine = $row->Type;
+ }
+ }
+ } else {
+ $existingSchema = false;
+ $existingEngine = false;
+ }
+
+ if ( $existingSchema && $existingSchema != $this->getVar( '_MysqlCharset' ) ) {
+ $this->setVar( '_MysqlCharset', $existingSchema );
+ }
+ if ( $existingEngine && $existingEngine != $this->getVar( '_MysqlEngine' ) ) {
+ $this->setVar( '_MysqlEngine', $existingEngine );
+ }
+
+ # Normal user and password are selected after this step, so for now
+ # just copy these two
+ $wgDBuser = $this->getVar( '_InstallUser' );
+ $wgDBpassword = $this->getVar( '_InstallPassword' );
+ }
+
+ /**
+ * Get a list of storage engines that are available and supported
+ */
+ public function getEngines() {
+ $engines = array( 'InnoDB', 'MyISAM' );
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $engines;
+ }
+ $conn = $status->value;
+
+ $version = $conn->getServerVersion();
+ if ( version_compare( $version, "4.1.2", "<" ) ) {
+ // No SHOW ENGINES in this version
+ return $engines;
+ }
+
+ $engines = array();
+ $res = $conn->query( 'SHOW ENGINES', __METHOD__ );
+ foreach ( $res as $row ) {
+ if ( $row->Support == 'YES' || $row->Support == 'DEFAULT' ) {
+ $engines[] = $row->Engine;
+ }
+ }
+ $engines = array_intersect( $this->supportedEngines, $engines );
+ return $engines;
+ }
+
+ /**
+ * Get a list of character sets that are available and supported
+ */
+ public function getCharsets() {
+ $status = $this->getConnection();
+ $mysql5 = array( 'binary', 'utf8' );
+ $mysql4 = array( 'mysql4' );
+ if ( !$status->isOK() ) {
+ return $mysql5;
+ }
+ if ( version_compare( $status->value->getServerVersion(), '4.1.0', '>=' ) ) {
+ return $mysql5;
+ }
+ return $mysql4;
+ }
+
+ /**
+ * Return true if the install user can create accounts
+ */
+ public function canCreateAccounts() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return false;
+ }
+ $conn = $status->value;
+
+ // Check version, need INFORMATION_SCHEMA and CREATE USER
+ if ( version_compare( $conn->getServerVersion(), '5.0.2', '<' ) ) {
+ return false;
+ }
+
+ // Get current account name
+ $currentName = $conn->selectField( '', 'CURRENT_USER()', '', __METHOD__ );
+ $parts = explode( '@', $currentName );
+ if ( count( $parts ) != 2 ) {
+ return false;
+ }
+ $quotedUser = $conn->addQuotes( $parts[0] ) .
+ '@' . $conn->addQuotes( $parts[1] );
+
+ // The user needs to have INSERT on mysql.* to be able to CREATE USER
+ // The grantee will be double-quoted in this query, as required
+ $res = $conn->select( 'INFORMATION_SCHEMA.USER_PRIVILEGES', '*',
+ array( 'GRANTEE' => $quotedUser ), __METHOD__ );
+ $insertMysql = false;
+ $grantOptions = array_flip( $this->webUserPrivs );
+ foreach ( $res as $row ) {
+ if ( $row->PRIVILEGE_TYPE == 'INSERT' ) {
+ $insertMysql = true;
+ }
+ if ( $row->IS_GRANTABLE ) {
+ unset( $grantOptions[$row->PRIVILEGE_TYPE] );
+ }
+ }
+
+ // Check for DB-specific privs for mysql.*
+ if ( !$insertMysql ) {
+ $row = $conn->selectRow( 'INFORMATION_SCHEMA.SCHEMA_PRIVILEGES', '*',
+ array(
+ 'GRANTEE' => $quotedUser,
+ 'TABLE_SCHEMA' => 'mysql',
+ 'PRIVILEGE_TYPE' => 'INSERT',
+ ), __METHOD__ );
+ if ( $row ) {
+ $insertMysql = true;
+ }
+ }
+
+ if ( !$insertMysql ) {
+ return false;
+ }
+
+ // Check for DB-level grant options
+ $res = $conn->select( 'INFORMATION_SCHEMA.SCHEMA_PRIVILEGES', '*',
+ array(
+ 'GRANTEE' => $quotedUser,
+ 'IS_GRANTABLE' => 1,
+ ), __METHOD__ );
+ foreach ( $res as $row ) {
+ $regex = $conn->likeToRegex( $row->TABLE_SCHEMA );
+ if ( preg_match( $regex, $this->getVar( 'wgDBname' ) ) ) {
+ unset( $grantOptions[$row->PRIVILEGE_TYPE] );
+ }
+ }
+ if ( count( $grantOptions ) ) {
+ // Can't grant everything
+ return false;
+ }
+ return true;
+ }
+
+ public function getSettingsForm() {
+ if ( $this->canCreateAccounts() ) {
+ $noCreateMsg = false;
+ } else {
+ $noCreateMsg = 'config-db-web-no-create-privs';
+ }
+ $s = $this->getWebUserBox( $noCreateMsg );
+
+ // Do engine selector
+ $engines = $this->getEngines();
+ // If the current default engine is not supported, use an engine that is
+ if ( !in_array( $this->getVar( '_MysqlEngine' ), $engines ) ) {
+ $this->setVar( '_MysqlEngine', reset( $engines ) );
+ }
+ if ( count( $engines ) >= 2 ) {
+ $s .= $this->getRadioSet( array(
+ 'var' => '_MysqlEngine',
+ 'label' => 'config-mysql-engine',
+ 'itemLabelPrefix' => 'config-mysql-',
+ 'values' => $engines
+ ));
+ $s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
+ }
+
+ // If the current default charset is not supported, use a charset that is
+ $charsets = $this->getCharsets();
+ if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
+ $this->setVar( '_MysqlCharset', reset( $charsets ) );
+ }
+
+ // Do charset selector
+ if ( count( $charsets ) >= 2 ) {
+ $s .= $this->getRadioSet( array(
+ 'var' => '_MysqlCharset',
+ 'label' => 'config-mysql-charset',
+ 'itemLabelPrefix' => 'config-mysql-',
+ 'values' => $charsets
+ ));
+ $s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
+ }
+
+ return $s;
+ }
+
+ public function submitSettingsForm() {
+ $this->setVarsFromRequest( array( '_MysqlEngine', '_MysqlCharset' ) );
+ $status = $this->submitWebUserBox();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // Validate the create checkbox
+ $canCreate = $this->canCreateAccounts();
+ if ( !$canCreate ) {
+ $this->setVar( '_CreateDBAccount', false );
+ $create = false;
+ } else {
+ $create = $this->getVar( '_CreateDBAccount' );
+ }
+
+ if ( !$create ) {
+ // Test the web account
+ try {
+ new DatabaseMysql(
+ $this->getVar( 'wgDBserver' ),
+ $this->getVar( 'wgDBuser' ),
+ $this->getVar( 'wgDBpassword' ),
+ false,
+ false,
+ 0,
+ $this->getVar( 'wgDBprefix' )
+ );
+ } catch ( DBConnectionError $e ) {
+ return Status::newFatal( 'config-connection-error', $e->getMessage() );
+ }
+ }
+
+ // Validate engines and charsets
+ // This is done pre-submit already so it's just for security
+ $engines = $this->getEngines();
+ if ( !in_array( $this->getVar( '_MysqlEngine' ), $engines ) ) {
+ $this->setVar( '_MysqlEngine', reset( $engines ) );
+ }
+ $charsets = $this->getCharsets();
+ if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
+ $this->setVar( '_MysqlCharset', reset( $charsets ) );
+ }
+ return Status::newGood();
+ }
+
+ public function preInstall() {
+ # Add our user callback to installSteps, right before the tables are created.
+ $callback = array(
+ 'name' => 'user',
+ 'callback' => array( $this, 'setupUser' ),
+ );
+ $this->parent->addInstallStep( $callback, 'tables' );
+ }
+
+ public function setupDatabase() {
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+ $dbName = $this->getVar( 'wgDBname' );
+ if( !$conn->selectDB( $dbName ) ) {
+ $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+ $conn->selectDB( $dbName );
+ }
+ $this->setupSchemaVars();
+ return $status;
+ }
+
+ public function setupUser() {
+ $dbUser = $this->getVar( 'wgDBuser' );
+ if( $dbUser == $this->getVar( '_InstallUser' ) ) {
+ return Status::newGood();
+ }
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ $this->setupSchemaVars();
+ $dbName = $this->getVar( 'wgDBname' );
+ $this->db->selectDB( $dbName );
+ $server = $this->getVar( 'wgDBserver' );
+ $password = $this->getVar( 'wgDBpassword' );
+ $grantableNames = array();
+
+ if ( $this->getVar( '_CreateDBAccount' ) ) {
+ // Before we blindly try to create a user that already has access,
+ try { // first attempt to connect to the database
+ new DatabaseMysql(
+ $server,
+ $dbUser,
+ $password,
+ false,
+ false,
+ 0,
+ $this->getVar( 'wgDBprefix' )
+ );
+ $grantableNames[] = $this->buildFullUserName( $dbUser, $server );
+ $tryToCreate = false;
+ } catch ( DBConnectionError $e ) {
+ $tryToCreate = true;
+ }
+ } else {
+ $grantableNames[] = $this->buildFullUserName( $dbUser, $server );
+ $tryToCreate = false;
+ }
+
+ if( $tryToCreate ) {
+ $createHostList = array($server,
+ 'localhost',
+ 'localhost.localdomain',
+ '%'
+ );
+
+ $createHostList = array_unique( $createHostList );
+ $escPass = $this->db->addQuotes( $password );
+
+ foreach( $createHostList as $host ) {
+ $fullName = $this->buildFullUserName( $dbUser, $host );
+ if( !$this->userDefinitelyExists( $dbUser, $host ) ) {
+ try{
+ $this->db->begin();
+ $this->db->query( "CREATE USER $fullName IDENTIFIED BY $escPass", __METHOD__ );
+ $this->db->commit();
+ $grantableNames[] = $fullName;
+ } catch( DBQueryError $dqe ) {
+ if( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
+ // User (probably) already exists
+ $this->db->rollback();
+ $status->warning( 'config-install-user-alreadyexists', $dbUser );
+ $grantableNames[] = $fullName;
+ break;
+ } else {
+ // If we couldn't create for some bizzare reason and the
+ // user probably doesn't exist, skip the grant
+ $this->db->rollback();
+ $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() );
+ }
+ }
+ } else {
+ $status->warning( 'config-install-user-alreadyexists', $dbUser );
+ $grantableNames[] = $fullName;
+ break;
+ }
+ }
+ }
+
+ // Try to grant to all the users we know exist or we were able to create
+ $escPass = $this->db->addQuotes( $password );
+ $dbAllTables = $this->db->addIdentifierQuotes( $dbName ) . '.*';
+ foreach( $grantableNames as $name ) {
+ try {
+ $this->db->begin();
+ $this->db->query( "GRANT ALL PRIVILEGES ON $dbAllTables TO $name", __METHOD__ );
+ $this->db->commit();
+ } catch( DBQueryError $dqe ) {
+ $this->db->rollback();
+ $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * Return a formal 'User'@'Host' username for use in queries
+ * @param $name String Username, quotes will be added
+ * @param $host String Hostname, quotes will be added
+ * @return String
+ */
+ private function buildFullUserName( $name, $host ) {
+ return $this->db->addQuotes( $name ) . '@' . $this->db->addQuotes( $host );
+ }
+
+ /**
+ * Try to see if the user account exists. Our "superuser" may not have
+ * access to mysql.user, so false means "no" or "maybe"
+ * @param $host String Hostname to check
+ * @param $user String Username to check
+ * @return boolean
+ */
+ private function userDefinitelyExists( $host, $user ) {
+ try {
+ $res = $this->db->selectRow( 'mysql.user', array( 'Host', 'User' ),
+ array( 'Host' => $host, 'User' => $user ), __METHOD__ );
+ return (bool)$res;
+ } catch( DBQueryError $dqe ) {
+ return false;
+ }
+
+ }
+
+ /**
+ * Return any table options to be applied to all tables that don't
+ * override them.
+ *
+ * @return String
+ */
+ protected function getTableOptions() {
+ $options = array();
+ if ( $this->getVar( '_MysqlEngine' ) !== null ) {
+ $options[] = "ENGINE=" . $this->getVar( '_MysqlEngine' );
+ }
+ if ( $this->getVar( '_MysqlCharset' ) !== null ) {
+ $options[] = 'DEFAULT CHARSET=' . $this->getVar( '_MysqlCharset' );
+ }
+ return implode( ', ', $options );
+ }
+
+ /**
+ * Get variables to substitute into tables.sql and the SQL patch files.
+ */
+ public function getSchemaVars() {
+ return array(
+ 'wgDBTableOptions' => $this->getTableOptions(),
+ 'wgDBname' => $this->getVar( 'wgDBname' ),
+ 'wgDBuser' => $this->getVar( 'wgDBuser' ),
+ 'wgDBpassword' => $this->getVar( 'wgDBpassword' ),
+ );
+ }
+
+ public function getLocalSettings() {
+ $dbmysql5 = wfBoolToStr( $this->getVar( 'wgDBmysql5', true ) );
+ $prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
+ $tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
+ return
+"# MySQL specific settings
+\$wgDBprefix = \"{$prefix}\";
+
+# MySQL table options to use during installation or update
+\$wgDBTableOptions = \"{$tblOpts}\";
+
+# Experimental charset support for MySQL 4.1/5.0.
+\$wgDBmysql5 = {$dbmysql5};";
+ }
+}
diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php
new file mode 100644
index 00000000..9bbda5db
--- /dev/null
+++ b/includes/installer/MysqlUpdater.php
@@ -0,0 +1,832 @@
+<?php
+/**
+ * MySQL-specific updater.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Mysql update list and mysql-specific update functions.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class MysqlUpdater extends DatabaseUpdater {
+
+ protected function getCoreUpdateList() {
+ return array(
+ // 1.2
+ array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
+ array( 'doInterwikiUpdate' ),
+ array( 'doIndexUpdate' ),
+ array( 'addTable', 'hitcounter', 'patch-hitcounter.sql' ),
+ array( 'addField', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ),
+
+ // 1.3
+ array( 'addField', 'user', 'user_real_name', 'patch-user-realname.sql' ),
+ array( 'addTable', 'querycache', 'patch-querycache.sql' ),
+ array( 'addTable', 'objectcache', 'patch-objectcache.sql' ),
+ array( 'addTable', 'categorylinks', 'patch-categorylinks.sql' ),
+ array( 'doOldLinksUpdate' ),
+ array( 'doFixAncientImagelinks' ),
+ array( 'addField', 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ),
+
+ // 1.4
+ array( 'addIndex', 'image', 'PRIMARY', 'patch-image_name_primary.sql' ),
+ array( 'addField', 'recentchanges', 'rc_id', 'patch-rc_id.sql' ),
+ array( 'addField', 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ),
+ array( 'addTable', 'logging', 'patch-logging.sql' ),
+ array( 'addField', 'user', 'user_token', 'patch-user_token.sql' ),
+ array( 'addField', 'watchlist', 'wl_notificationtimestamp', 'patch-email-notification.sql' ),
+ array( 'doWatchlistUpdate' ),
+ array( 'dropField', 'user', 'user_emailauthenticationtimestamp', 'patch-email-authentication.sql' ),
+
+ // 1.5
+ array( 'doSchemaRestructuring' ),
+ array( 'addField', 'logging', 'log_params', 'patch-log_params.sql' ),
+ array( 'checkBin', 'logging', 'log_title', 'patch-logging-title.sql', ),
+ array( 'addField', 'archive', 'ar_rev_id', 'patch-archive-rev_id.sql' ),
+ array( 'addField', 'page', 'page_len', 'patch-page_len.sql' ),
+ array( 'dropField', 'revision', 'inverse_timestamp', 'patch-inverse_timestamp.sql' ),
+ array( 'addField', 'revision', 'rev_text_id', 'patch-rev_text_id.sql' ),
+ array( 'addField', 'revision', 'rev_deleted', 'patch-rev_deleted.sql' ),
+ array( 'addField', 'image', 'img_width', 'patch-img_width.sql' ),
+ array( 'addField', 'image', 'img_metadata', 'patch-img_metadata.sql' ),
+ array( 'addField', 'user', 'user_email_token', 'patch-user_email_token.sql' ),
+ array( 'addField', 'archive', 'ar_text_id', 'patch-archive-text_id.sql' ),
+ array( 'doNamespaceSize' ),
+ array( 'addField', 'image', 'img_media_type', 'patch-img_media_type.sql' ),
+ array( 'doPagelinksUpdate' ),
+ array( 'dropField', 'image', 'img_type', 'patch-drop_img_type.sql' ),
+ array( 'doUserUniqueUpdate' ),
+ array( 'doUserGroupsUpdate' ),
+ array( 'addField', 'site_stats', 'ss_total_pages', 'patch-ss_total_articles.sql' ),
+ array( 'addTable', 'user_newtalk', 'patch-usernewtalk2.sql' ),
+ array( 'addTable', 'transcache', 'patch-transcache.sql' ),
+ array( 'addField', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ),
+ array( 'addTable', 'trackbacks', 'patch-trackbacks.sql' ),
+
+ // 1.6
+ array( 'doWatchlistNull' ),
+ array( 'addIndex', 'logging', 'times', 'patch-logging-times-index.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ),
+ array( 'doPageRandomUpdate' ),
+ array( 'addField', 'user', 'user_registration', 'patch-user_registration.sql' ),
+ array( 'doTemplatelinksUpdate' ),
+ array( 'addTable', 'externallinks', 'patch-externallinks.sql' ),
+ array( 'addTable', 'job', 'patch-job.sql' ),
+ array( 'addField', 'site_stats', 'ss_images', 'patch-ss_images.sql' ),
+ array( 'addTable', 'langlinks', 'patch-langlinks.sql' ),
+ array( 'addTable', 'querycache_info', 'patch-querycacheinfo.sql' ),
+ array( 'addTable', 'filearchive', 'patch-filearchive.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ),
+ array( 'addIndex', 'recentchanges', 'rc_ns_usertext', 'patch-recentchanges-utindex.sql' ),
+ array( 'addIndex', 'recentchanges', 'rc_user_text', 'patch-rc_user_text-index.sql' ),
+
+ // 1.9
+ array( 'addField', 'user', 'user_newpass_time', 'patch-user_newpass_time.sql' ),
+ array( 'addTable', 'redirect', 'patch-redirect.sql' ),
+ array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
+ array( 'doBacklinkingIndicesUpdate' ),
+ array( 'addField', 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ),
+ array( 'addField', 'user', 'user_editcount', 'patch-user_editcount.sql' ),
+
+ // 1.10
+ array( 'doRestrictionsUpdate' ),
+ array( 'addField', 'logging', 'log_id', 'patch-log_id.sql' ),
+ array( 'addField', 'revision', 'rev_parent_id', 'patch-rev_parent_id.sql' ),
+ array( 'addField', 'page_restrictions', 'pr_id', 'patch-page_restrictions_sortkey.sql' ),
+ array( 'addField', 'revision', 'rev_len', 'patch-rev_len.sql' ),
+ array( 'addField', 'recentchanges', 'rc_deleted', 'patch-rc_deleted.sql' ),
+ array( 'addField', 'logging', 'log_deleted', 'patch-log_deleted.sql' ),
+ array( 'addField', 'archive', 'ar_deleted', 'patch-ar_deleted.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_deleted', 'patch-ipb_deleted.sql' ),
+ array( 'addField', 'filearchive', 'fa_deleted', 'patch-fa_deleted.sql' ),
+ array( 'addField', 'archive', 'ar_len', 'patch-ar_len.sql' ),
+
+ // 1.11
+ array( 'addField', 'ipblocks', 'ipb_block_email', 'patch-ipb_emailban.sql' ),
+ array( 'doCategorylinksIndicesUpdate' ),
+ array( 'addField', 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql' ),
+ array( 'addIndex', 'archive', 'usertext_timestamp', 'patch-archive-user-index.sql' ),
+ array( 'addIndex', 'image', 'img_usertext_timestamp', 'patch-image-user-index.sql' ),
+ array( 'addIndex', 'oldimage', 'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ),
+ array( 'addField', 'archive', 'ar_page_id', 'patch-archive-page_id.sql' ),
+ array( 'addField', 'image', 'img_sha1', 'patch-img_sha1.sql' ),
+
+ // 1.12
+ array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ),
+
+ // 1.13
+ array( 'addField', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ),
+ array( 'addTable', 'page_props', 'patch-page_props.sql' ),
+ array( 'addTable', 'updatelog', 'patch-updatelog.sql' ),
+ array( 'addTable', 'category', 'patch-category.sql' ),
+ array( 'doCategoryPopulation' ),
+ array( 'addField', 'archive', 'ar_parent_id', 'patch-ar_parent_id.sql' ),
+ array( 'addField', 'user_newtalk', 'user_last_timestamp', 'patch-user_last_timestamp.sql' ),
+ array( 'doPopulateParentId' ),
+ array( 'checkBin', 'protected_titles', 'pt_title', 'patch-pt_title-encoding.sql', ),
+ array( 'doMaybeProfilingMemoryUpdate' ),
+ array( 'doFilearchiveIndicesUpdate' ),
+
+ // 1.14
+ array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
+ array( 'doActiveUsersInit' ),
+ array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
+
+ // 1.15
+ array( 'doUniquePlTlIl' ),
+ array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+ array( 'addTable', 'tag_summary', 'patch-change_tag.sql' ),
+ array( 'addTable', 'valid_tag', 'patch-change_tag.sql' ),
+
+ // 1.16
+ array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+ array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+ array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
+ array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
+ array( 'doLogSearchPopulation' ),
+ array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+ array( 'addTable', 'external_user', 'patch-external_user.sql' ),
+ array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
+ array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
+ array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
+ array( 'doUpdateTranscacheField' ),
+ array( 'renameEuWikiId' ),
+ array( 'doUpdateMimeMinorField' ),
+ array( 'doPopulateRevLen' ),
+
+ // 1.17
+ array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+ array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
+ array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
+ array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
+ array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
+ array( 'dropIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
+ array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
+ array( 'doClFieldsUpdate' ),
+ array( 'doCollationUpdate' ),
+ array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+ array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+ array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
+ array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
+ array( 'doLangLinksLengthUpdate' ),
+ );
+ }
+
+ /**
+ * 1.4 betas were missing the 'binary' marker from logging.log_title,
+ * which causes a collation mismatch error on joins in MySQL 4.1.
+ *
+ * @param $table String: table name
+ * @param $field String: field name to check
+ * @param $patchFile String: path to the patch to correct the field
+ */
+ protected function checkBin( $table, $field, $patchFile ) {
+ $tableName = $this->db->tableName( $table );
+ $res = $this->db->query( "SELECT $field FROM $tableName LIMIT 0", __METHOD__ );
+ $flags = explode( ' ', mysql_field_flags( $res->result, 0 ) );
+
+ if ( in_array( 'binary', $flags ) ) {
+ $this->output( "...$table table has correct $field encoding.\n" );
+ } else {
+ $this->output( "Fixing $field encoding on $table table... " );
+ $this->applyPatch( $patchFile );
+ $this->output( "done.\n" );
+ }
+ }
+
+ /**
+ * Check whether an index contain a field
+ *
+ * @param $table String: table name
+ * @param $index String: index name to check
+ * @param $field String: field that should be in the index
+ * @return Boolean
+ */
+ protected function indexHasField( $table, $index, $field ) {
+ $info = $this->db->indexInfo( $table, $index, __METHOD__ );
+ if ( $info ) {
+ foreach ( $info as $row ) {
+ if ( $row->Column_name == $field ) {
+ $this->output( "...index $index on table $table includes field $field\n" );
+ return true;
+ }
+ }
+ }
+ $this->output( "...index $index on table $table has no field $field; adding\n" );
+ return false;
+ }
+
+ /**
+ * Check that interwiki table exists; if it doesn't source it
+ */
+ protected function doInterwikiUpdate() {
+ global $IP;
+
+ if ( $this->db->tableExists( "interwiki" ) ) {
+ $this->output( "...already have interwiki table\n" );
+ return;
+ }
+
+ $this->output( 'Creating interwiki table...' );
+ $this->applyPatch( 'patch-interwiki.sql' );
+ $this->output( "ok\n" );
+ $this->output( 'Adding default interwiki definitions...' );
+ $this->applyPatch( "$IP/maintenance/interwiki.sql", true );
+ $this->output( "done.\n" );
+ }
+
+ /**
+ * Check that proper indexes are in place
+ */
+ protected function doIndexUpdate() {
+ $meta = $this->db->fieldInfo( 'recentchanges', 'rc_timestamp' );
+ if ( $meta->isMultipleKey() ) {
+ $this->output( "...indexes seem up to 20031107 standards\n" );
+ return;
+ }
+
+ $this->output( "Updating indexes to 20031107..." );
+ $this->applyPatch( 'patch-indexes.sql', true );
+ $this->output( "done.\n" );
+ }
+
+ protected function doOldLinksUpdate() {
+ $cl = $this->maintenance->runChild( 'ConvertLinks' );
+ $cl->execute();
+ }
+
+ protected function doFixAncientImagelinks() {
+ $info = $this->db->fieldInfo( 'imagelinks', 'il_from' );
+ if ( !$info || $info->type() !== 'string' ) {
+ $this->output( "...il_from OK\n" );
+ return;
+ }
+
+ $this->output( "Fixing ancient broken imagelinks table.\n" );
+ $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this.\n" );
+ $this->applyPatch( 'patch-fix-il_from.sql' );
+ $this->output( "done.\n" );
+ }
+
+ /**
+ * Check if we need to add talk page rows to the watchlist
+ */
+ function doWatchlistUpdate() {
+ $talk = $this->db->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', __METHOD__ );
+ $nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ );
+ if ( $talk == $nontalk ) {
+ $this->output( "...watchlist talk page rows already present\n" );
+ return;
+ }
+
+ $this->output( "Adding missing watchlist talk page rows... " );
+ $this->db->insertSelect( 'watchlist', 'watchlist',
+ array(
+ 'wl_user' => 'wl_user',
+ 'wl_namespace' => 'wl_namespace | 1',
+ 'wl_title' => 'wl_title',
+ 'wl_notificationtimestamp' => 'wl_notificationtimestamp'
+ ), array( 'NOT (wl_namespace & 1)' ), __METHOD__, 'IGNORE' );
+ $this->output( "done.\n" );
+ }
+
+ function doSchemaRestructuring() {
+ if ( $this->db->tableExists( 'page' ) ) {
+ $this->output( "...page table already exists.\n" );
+ return;
+ }
+
+ $this->output( "...converting from cur/old to page/revision/text DB structure.\n" );
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......checking for duplicate entries.\n" );
+
+ list ( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
+
+ $rows = $this->db->query( "SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
+ FROM $cur GROUP BY cur_title, cur_namespace HAVING c>1", __METHOD__ );
+
+ if ( $rows->numRows() > 0 ) {
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......<b>Found duplicate entries</b>\n" );
+ $this->output( sprintf( "<b> %-60s %3s %5s</b>\n", 'Title', 'NS', 'Count' ) );
+ $duplicate = array();
+ foreach ( $rows as $row ) {
+ if ( ! isset( $duplicate[$row->cur_namespace] ) ) {
+ $duplicate[$row->cur_namespace] = array();
+ }
+ $duplicate[$row->cur_namespace][] = $row->cur_title;
+ $this->output( sprintf( " %-60s %3s %5s\n", $row->cur_title, $row->cur_namespace, $row->c ) );
+ }
+ $sql = "SELECT cur_title, cur_namespace, cur_id, cur_timestamp FROM $cur WHERE ";
+ $firstCond = true;
+ foreach ( $duplicate as $ns => $titles ) {
+ if ( $firstCond ) {
+ $firstCond = false;
+ } else {
+ $sql .= ' OR ';
+ }
+ $sql .= "( cur_namespace = {$ns} AND cur_title in (";
+ $first = true;
+ foreach ( $titles as $t ) {
+ if ( $first ) {
+ $sql .= $this->db->addQuotes( $t );
+ $first = false;
+ } else {
+ $sql .= ', ' . $this->db->addQuotes( $t );
+ }
+ }
+ $sql .= ") ) \n";
+ }
+ # By sorting descending, the most recent entry will be the first in the list.
+ # All following entries will be deleted by the next while-loop.
+ $sql .= 'ORDER BY cur_namespace, cur_title, cur_timestamp DESC';
+
+ $rows = $this->db->query( $sql, __METHOD__ );
+
+ $prev_title = $prev_namespace = false;
+ $deleteId = array();
+
+ foreach ( $rows as $row ) {
+ if ( $prev_title == $row->cur_title && $prev_namespace == $row->cur_namespace ) {
+ $deleteId[] = $row->cur_id;
+ }
+ $prev_title = $row->cur_title;
+ $prev_namespace = $row->cur_namespace;
+ }
+ $sql = "DELETE FROM $cur WHERE cur_id IN ( " . join( ',', $deleteId ) . ')';
+ $this->db->query( $sql, __METHOD__ );
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......<b>Deleted</b> " . $this->db->affectedRows() . " records.\n" );
+ }
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......Creating tables.\n" );
+ $this->db->query( "CREATE TABLE $page (
+ page_id int(8) unsigned NOT NULL auto_increment,
+ page_namespace int NOT NULL,
+ page_title varchar(255) binary NOT NULL,
+ page_restrictions tinyblob NOT NULL,
+ page_counter bigint(20) unsigned NOT NULL default '0',
+ page_is_redirect tinyint(1) unsigned NOT NULL default '0',
+ page_is_new tinyint(1) unsigned NOT NULL default '0',
+ page_random real unsigned NOT NULL,
+ page_touched char(14) binary NOT NULL default '',
+ page_latest int(8) unsigned NOT NULL,
+ page_len int(8) unsigned NOT NULL,
+
+ PRIMARY KEY page_id (page_id),
+ UNIQUE INDEX name_title (page_namespace,page_title),
+ INDEX (page_random),
+ INDEX (page_len)
+ ) ENGINE=InnoDB", __METHOD__ );
+ $this->db->query( "CREATE TABLE $revision (
+ rev_id int(8) unsigned NOT NULL auto_increment,
+ rev_page int(8) unsigned NOT NULL,
+ rev_comment tinyblob NOT NULL,
+ rev_user int(5) unsigned NOT NULL default '0',
+ rev_user_text varchar(255) binary NOT NULL default '',
+ rev_timestamp char(14) binary NOT NULL default '',
+ rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
+ rev_deleted tinyint(1) unsigned NOT NULL default '0',
+ rev_len int(8) unsigned,
+ rev_parent_id int(8) unsigned default NULL,
+ PRIMARY KEY rev_page_id (rev_page, rev_id),
+ UNIQUE INDEX rev_id (rev_id),
+ INDEX rev_timestamp (rev_timestamp),
+ INDEX page_timestamp (rev_page,rev_timestamp),
+ INDEX user_timestamp (rev_user,rev_timestamp),
+ INDEX usertext_timestamp (rev_user_text,rev_timestamp)
+ ) ENGINE=InnoDB", __METHOD__ );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......Locking tables.\n" );
+ $this->db->query( "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", __METHOD__ );
+
+ $maxold = intval( $this->db->selectField( 'old', 'max(old_id)', '', __METHOD__ ) );
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......maxold is {$maxold}\n" );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ global $wgLegacySchemaConversion;
+ if ( $wgLegacySchemaConversion ) {
+ // Create HistoryBlobCurStub entries.
+ // Text will be pulled from the leftover 'cur' table at runtime.
+ $this->output( "......Moving metadata from cur; using blob references to text in cur table.\n" );
+ $cur_text = "concat('O:18:\"historyblobcurstub\":1:{s:6:\"mCurId\";i:',cur_id,';}')";
+ $cur_flags = "'object'";
+ } else {
+ // Copy all cur text in immediately: this may take longer but avoids
+ // having to keep an extra table around.
+ $this->output( "......Moving text from cur.\n" );
+ $cur_text = 'cur_text';
+ $cur_flags = "''";
+ }
+ $this->db->query( "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, old_user_text,
+ old_timestamp, old_minor_edit, old_flags)
+ SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags
+ FROM $cur", __METHOD__ );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......Setting up revision table.\n" );
+ $this->db->query( "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, rev_user_text, rev_timestamp,
+ rev_minor_edit)
+ SELECT old_id, cur_id, old_comment, old_user, old_user_text,
+ old_timestamp, old_minor_edit
+ FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", __METHOD__ );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......Setting up page table.\n" );
+ $this->db->query( "INSERT INTO $page (page_id, page_namespace, page_title, page_restrictions, page_counter,
+ page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len)
+ SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
+ cur_random, cur_touched, rev_id, LENGTH(cur_text)
+ FROM $cur,$revision
+ WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", __METHOD__ );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......Unlocking tables.\n" );
+ $this->db->query( "UNLOCK TABLES", __METHOD__ );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "......Renaming old.\n" );
+ $this->db->query( "ALTER TABLE $old RENAME TO $text", __METHOD__ );
+
+ $this->output( wfTimestamp( TS_DB ) );
+ $this->output( "...done.\n" );
+ }
+
+ protected function doNamespaceSize() {
+ $tables = array(
+ 'page' => 'page',
+ 'archive' => 'ar',
+ 'recentchanges' => 'rc',
+ 'watchlist' => 'wl',
+ 'querycache' => 'qc',
+ 'logging' => 'log',
+ );
+ foreach ( $tables as $table => $prefix ) {
+ $field = $prefix . '_namespace';
+
+ $tablename = $this->db->tableName( $table );
+ $result = $this->db->query( "SHOW COLUMNS FROM $tablename LIKE '$field'", __METHOD__ );
+ $info = $this->db->fetchObject( $result );
+
+ if ( substr( $info->Type, 0, 3 ) == 'int' ) {
+ $this->output( "...$field is already a full int ($info->Type).\n" );
+ } else {
+ $this->output( "Promoting $field from $info->Type to int... " );
+ $this->db->query( "ALTER TABLE $tablename MODIFY $field int NOT NULL", __METHOD__ );
+ $this->output( "done.\n" );
+ }
+ }
+ }
+
+ protected function doPagelinksUpdate() {
+ if ( $this->db->tableExists( 'pagelinks' ) ) {
+ $this->output( "...already have pagelinks table.\n" );
+ return;
+ }
+
+ $this->output( "Converting links and brokenlinks tables to pagelinks... " );
+ $this->applyPatch( 'patch-pagelinks.sql' );
+ $this->output( "done.\n" );
+
+ global $wgContLang;
+ foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
+ if ( $ns == 0 ) {
+ continue;
+ }
+
+ $this->output( "Cleaning up broken links for namespace $ns... " );
+
+ $pagelinks = $this->db->tableName( 'pagelinks' );
+ $name = $wgContLang->getNsText( $ns );
+ $prefix = $this->db->strencode( $name );
+ $likeprefix = str_replace( '_', '\\_', $prefix );
+
+ $sql = "UPDATE $pagelinks
+ SET pl_namespace=$ns,
+ pl_title=TRIM(LEADING '$prefix:' FROM pl_title)
+ WHERE pl_namespace=0
+ AND pl_title LIKE '$likeprefix:%'";
+
+ $this->db->query( $sql, __METHOD__ );
+ $this->output( "done.\n" );
+ }
+ }
+
+ protected function doUserUniqueUpdate() {
+ $duper = new UserDupes( $this->db, array( $this, 'output' ) );
+ if ( $duper->hasUniqueIndex() ) {
+ $this->output( "...already have unique user_name index.\n" );
+ return;
+ }
+
+ if ( !$duper->clearDupes() ) {
+ $this->output( "WARNING: This next step will probably fail due to unfixed duplicates...\n" );
+ }
+ $this->output( "Adding unique index on user_name... " );
+ $this->applyPatch( 'patch-user_nameindex.sql' );
+ $this->output( "done.\n" );
+ }
+
+ protected function doUserGroupsUpdate() {
+ if ( $this->db->tableExists( 'user_groups' ) ) {
+ $info = $this->db->fieldInfo( 'user_groups', 'ug_group' );
+ if ( $info->type() == 'int' ) {
+ $oldug = $this->db->tableName( 'user_groups' );
+ $newug = $this->db->tableName( 'user_groups_bogus' );
+ $this->output( "user_groups table exists but is in bogus intermediate format. Renaming to $newug... " );
+ $this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ );
+ $this->output( "ok\n" );
+
+ $this->output( "Re-adding fresh user_groups table... " );
+ $this->applyPatch( 'patch-user_groups.sql' );
+ $this->output( "ok\n" );
+
+ $this->output( "***\n" );
+ $this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
+ $this->output( "*** table. Old 1.5 alpha versions did some pretty funky stuff...\n" );
+ $this->output( "***\n" );
+ } else {
+ $this->output( "...user_groups table exists and is in current format.\n" );
+ }
+ return;
+ }
+
+ $this->output( "Adding user_groups table... " );
+ $this->applyPatch( 'patch-user_groups.sql' );
+ $this->output( "ok\n" );
+
+ if ( !$this->db->tableExists( 'user_rights' ) ) {
+ if ( $this->db->fieldExists( 'user', 'user_rights' ) ) {
+ $this->output( "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion..." );
+ $this->db->applyPatch( 'patch-user_rights.sql' );
+ $this->output( "ok\n" );
+ } else {
+ $this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
+ $this->output( "*** You may need to manually configure some sysops by manipulating\n" );
+ $this->output( "*** the user_groups table.\n" );
+ return;
+ }
+ }
+
+ $this->output( "Converting user_rights table to user_groups... " );
+ $result = $this->db->select( 'user_rights',
+ array( 'ur_user', 'ur_rights' ),
+ array( "ur_rights != ''" ),
+ __METHOD__ );
+
+ foreach ( $result as $row ) {
+ $groups = array_unique(
+ array_map( 'trim',
+ explode( ',', $row->ur_rights ) ) );
+
+ foreach ( $groups as $group ) {
+ $this->db->insert( 'user_groups',
+ array(
+ 'ug_user' => $row->ur_user,
+ 'ug_group' => $group ),
+ __METHOD__ );
+ }
+ }
+ $this->output( "done.\n" );
+ }
+
+ /**
+ * Make sure wl_notificationtimestamp can be NULL,
+ * and update old broken items.
+ */
+ protected function doWatchlistNull() {
+ $info = $this->db->fieldInfo( 'watchlist', 'wl_notificationtimestamp' );
+ if ( $info->isNullable() ) {
+ $this->output( "...wl_notificationtimestamp is already nullable.\n" );
+ return;
+ }
+
+ $this->output( "Making wl_notificationtimestamp nullable... " );
+ $this->applyPatch( 'patch-watchlist-null.sql' );
+ $this->output( "done.\n" );
+ }
+
+ /**
+ * Set page_random field to a random value where it is equals to 0.
+ *
+ * @see bug 3946
+ */
+ protected function doPageRandomUpdate() {
+ $page = $this->db->tableName( 'page' );
+ $this->db->query( "UPDATE $page SET page_random = RAND() WHERE page_random = 0", __METHOD__ );
+ $rows = $this->db->affectedRows();
+
+ if( $rows ) {
+ $this->output( "Set page_random to a random value on $rows rows where it was set to 0\n" );
+ } else {
+ $this->output( "...no page_random rows needed to be set\n" );
+ }
+ }
+
+ protected function doTemplatelinksUpdate() {
+ if ( $this->db->tableExists( 'templatelinks' ) ) {
+ $this->output( "...templatelinks table already exists\n" );
+ return;
+ }
+
+ $this->output( "Creating templatelinks table...\n" );
+ $this->applyPatch( 'patch-templatelinks.sql' );
+ $this->output( "Populating...\n" );
+ if ( wfGetLB()->getServerCount() > 1 ) {
+ // Slow, replication-friendly update
+ $res = $this->db->select( 'pagelinks', array( 'pl_from', 'pl_namespace', 'pl_title' ),
+ array( 'pl_namespace' => NS_TEMPLATE ), __METHOD__ );
+ $count = 0;
+ foreach ( $res as $row ) {
+ $count = ( $count + 1 ) % 100;
+ if ( $count == 0 ) {
+ wfWaitForSlaves( 10 );
+ }
+ $this->db->insert( 'templatelinks',
+ array(
+ 'tl_from' => $row->pl_from,
+ 'tl_namespace' => $row->pl_namespace,
+ 'tl_title' => $row->pl_title,
+ ), __METHOD__
+ );
+
+ }
+ } else {
+ // Fast update
+ $this->db->insertSelect( 'templatelinks', 'pagelinks',
+ array(
+ 'tl_from' => 'pl_from',
+ 'tl_namespace' => 'pl_namespace',
+ 'tl_title' => 'pl_title'
+ ), array(
+ 'pl_namespace' => 10
+ ), __METHOD__
+ );
+ }
+ $this->output( "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n" );
+ }
+
+ protected function doBacklinkingIndicesUpdate() {
+ if ( !$this->indexHasField( 'pagelinks', 'pl_namespace', 'pl_from' ) ||
+ !$this->indexHasField( 'templatelinks', 'tl_namespace', 'tl_from' ) ||
+ !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' ) )
+ {
+ $this->applyPatch( 'patch-backlinkindexes.sql' );
+ $this->output( "...backlinking indices updated\n" );
+ }
+ }
+
+ /**
+ * Adding page_restrictions table, obsoleting page.page_restrictions.
+ * Migrating old restrictions to new table
+ * -- Andrew Garrett, January 2007.
+ */
+ protected function doRestrictionsUpdate() {
+ if ( $this->db->tableExists( 'page_restrictions' ) ) {
+ $this->output( "...page_restrictions table already exists.\n" );
+ return;
+ }
+
+ $this->output( "Creating page_restrictions table..." );
+ $this->applyPatch( 'patch-page_restrictions.sql' );
+ $this->applyPatch( 'patch-page_restrictions_sortkey.sql' );
+ $this->output( "done.\n" );
+
+ $this->output( "Migrating old restrictions to new table...\n" );
+ $task = $this->maintenance->runChild( 'UpdateRestrictions' );
+ $task->execute();
+ }
+
+ protected function doCategorylinksIndicesUpdate() {
+ if ( !$this->indexHasField( 'categorylinks', 'cl_sortkey', 'cl_from' ) ) {
+ $this->applyPatch( 'patch-categorylinksindex.sql' );
+ $this->output( "...categorylinks indices updated\n" );
+ }
+ }
+
+ protected function doCategoryPopulation() {
+ if ( $this->updateRowExists( 'populate category' ) ) {
+ $this->output( "...category table already populated.\n" );
+ return;
+ }
+
+ $this->output(
+ "Populating category table, printing progress markers. " .
+ "For large databases, you\n" .
+ "may want to hit Ctrl-C and do this manually with maintenance/\n" .
+ "populateCategory.php.\n"
+ );
+ $task = $this->maintenance->runChild( 'PopulateCategory' );
+ $task->execute();
+ $this->output( "Done populating category table.\n" );
+ }
+
+ protected function doPopulateParentId() {
+ if ( $this->updateRowExists( 'populate rev_parent_id' ) ) {
+ $this->output( "...rev_parent_id column already populated.\n" );
+ return;
+ }
+
+ $task = $this->maintenance->runChild( 'PopulateParentId' );
+ $task->execute();
+ }
+
+ protected function doMaybeProfilingMemoryUpdate() {
+ if ( !$this->db->tableExists( 'profiling' ) ) {
+ // Simply ignore
+ } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory' ) ) {
+ $this->output( "...profiling table has pf_memory field.\n" );
+ } else {
+ $this->output( "Adding pf_memory field to table profiling..." );
+ $this->applyPatch( 'patch-profiling-memory.sql' );
+ $this->output( "done.\n" );
+ }
+ }
+
+ protected function doFilearchiveIndicesUpdate() {
+ $info = $this->db->indexInfo( 'filearchive', 'fa_user_timestamp', __METHOD__ );
+ if ( !$info ) {
+ $this->output( "Updating filearchive indices..." );
+ $this->applyPatch( 'patch-filearchive-user-index.sql' );
+ $this->output( "done.\n" );
+ }
+ }
+
+ protected function doUniquePlTlIl() {
+ $info = $this->db->indexInfo( 'pagelinks', 'pl_namespace' );
+ if ( is_array( $info ) && !$info[0]->Non_unique ) {
+ $this->output( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
+ return;
+ }
+
+ $this->output( "Making pl_namespace, tl_namespace and il_to indices UNIQUE... " );
+ $this->applyPatch( 'patch-pl-tl-il-unique.sql' );
+ $this->output( "done.\n" );
+ }
+
+ protected function renameEuWikiId() {
+ if ( $this->db->fieldExists( 'external_user', 'eu_local_id' ) ) {
+ $this->output( "...eu_wiki_id already renamed to eu_local_id.\n" );
+ return;
+ }
+
+ $this->output( "Renaming eu_wiki_id -> eu_local_id... " );
+ $this->applyPatch( 'patch-eu_local_id.sql' );
+ $this->output( "done.\n" );
+ }
+
+ protected function doUpdateMimeMinorField() {
+ if ( $this->updateRowExists( 'mime_minor_length' ) ) {
+ $this->output( "...*_mime_minor fields are already long enough.\n" );
+ return;
+ }
+
+ $this->output( "Altering all *_mime_minor fields to 100 bytes in size ... " );
+ $this->applyPatch( 'patch-mime_minor_length.sql' );
+ $this->output( "done.\n" );
+ }
+
+ protected function doPopulateRevLen() {
+ if ( $this->updateRowExists( 'populate rev_len' ) ) {
+ $this->output( "...rev_len column already populated.\n" );
+ return;
+ }
+
+ $task = $this->maintenance->runChild( 'PopulateRevisionLength' );
+ $task->execute();
+ }
+
+ protected function doClFieldsUpdate() {
+ if ( $this->updateRowExists( 'cl_fields_update' ) ) {
+ $this->output( "...categorylinks up-to-date.\n" );
+ return;
+ }
+
+ $this->output( 'Updating categorylinks (again)...' );
+ $this->applyPatch( 'patch-categorylinks-better-collation2.sql' );
+ $this->output( "done.\n" );
+ }
+
+ protected function doLangLinksLengthUpdate() {
+ $langlinks = $this->db->tableName( 'langlinks' );
+ $res = $this->db->query( "SHOW COLUMNS FROM $langlinks LIKE 'll_lang'" );
+ $row = $this->db->fetchObject( $res );
+
+ if ( $row && $row->Type == "varbinary(10)" ) {
+ $this->output( 'Updating length of ll_lang in langlinks...' );
+ $this->applyPatch( 'patch-langlinks-ll_lang-20.sql' );
+ $this->output( "done.\n" );
+ } else {
+ $this->output( "...ll_lang is up-to-date.\n" );
+ }
+ }
+}
diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php
new file mode 100644
index 00000000..8c3e40e1
--- /dev/null
+++ b/includes/installer/OracleInstaller.php
@@ -0,0 +1,279 @@
+<?php
+/**
+ * Oracle-specific installer.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for setting up the MediaWiki database using Oracle.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class OracleInstaller extends DatabaseInstaller {
+
+ protected $globalNames = array(
+ 'wgDBserver',
+ 'wgDBname',
+ 'wgDBuser',
+ 'wgDBpassword',
+ 'wgDBprefix',
+ );
+
+ protected $internalDefaults = array(
+ '_OracleDefTS' => 'USERS',
+ '_OracleTempTS' => 'TEMP',
+ '_InstallUser' => 'SYSDBA',
+ );
+
+ public $minimumVersion = '9.0.1'; // 9iR1
+
+ protected $connError = null;
+
+ public function getName() {
+ return 'oracle';
+ }
+
+ public function isCompiled() {
+ return self::checkExtension( 'oci8' );
+ }
+
+ public function getConnectForm() {
+ if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
+ $this->parent->setVar( 'wgDBserver', '' );
+ }
+ return
+ $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+ $this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) .
+ $this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) .
+ $this->getTextBox( '_OracleTempTS', 'config-oracle-temp-ts', array(), $this->parent->getHelpBox( 'config-db-oracle-help' ) ) .
+ Html::closeElement( 'fieldset' ) .
+ $this->parent->getWarningBox( wfMsg( 'config-db-account-oracle-warn' ) ).
+ $this->getInstallUserBox().
+ $this->getWebUserBox();
+ }
+
+ public function submitInstallUserBox() {
+ parent::submitInstallUserBox();
+ $this->parent->setVar( '_InstallDBname', $this->getVar( '_InstallUser' ) );
+ return Status::newGood();
+ }
+
+ public function submitConnectForm() {
+ // Get variables from the request
+ $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBprefix', 'wgDBuser', 'wgDBpassword' ) );
+ $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
+
+ // Validate them
+ $status = Status::newGood();
+ if ( !strlen( $newValues['wgDBserver'] ) ) {
+ $status->fatal( 'config-missing-db-server-oracle' );
+ } elseif ( !preg_match( '/^[a-zA-Z0-9_\.]+$/', $newValues['wgDBserver'] ) ) {
+ $status->fatal( 'config-invalid-db-server-oracle', $newValues['wgDBserver'] );
+ }
+ if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBprefix'] ) ) {
+ $status->fatal( 'config-invalid-schema', $newValues['wgDBprefix'] );
+ }
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // Submit user box
+ $status = $this->submitInstallUserBox();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // Try to connect trough multiple scenarios
+ // Scenario 1: Install with a manually created account
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ if ( $this->connError == 28009 ) {
+ // _InstallUser seems to be a SYSDBA
+ // Scenario 2: Create user with SYSDBA and install with new user
+ $status = $this->submitWebUserBox();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $status = $this->openSYSDBAConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ if ( !$this->getVar( '_CreateDBAccount' ) ) {
+ $status->fatal('config-db-sys-create-oracle');
+ }
+ } else {
+ return $status;
+ }
+ } else {
+ // check for web user credentials
+ // Scenario 3: Install with a priviliged user but use a restricted user
+ $statusIS3 = $this->submitWebUserBox();
+ if ( !$statusIS3->isOK() ) {
+ return $statusIS3;
+ }
+ }
+ $conn = $status->value;
+
+ // Check version
+ $version = $conn->getServerVersion();
+ if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
+ return Status::newFatal( 'config-oracle-old', $this->minimumVersion, $version );
+ }
+
+ return $status;
+ }
+
+ public function openConnection() {
+ $status = Status::newGood();
+ try {
+ $db = new DatabaseOracle(
+ $this->getVar( 'wgDBserver' ),
+ $this->getVar( '_InstallUser' ),
+ $this->getVar( '_InstallPassword' ),
+ $this->getVar( '_InstallDBname' ),
+ 0,
+ $this->getVar( 'wgDBprefix' )
+ );
+ $status->value = $db;
+ } catch ( DBConnectionError $e ) {
+ $this->connError = $e->db->lastErrno();
+ $status->fatal( 'config-connection-error', $e->getMessage() );
+ }
+ return $status;
+ }
+
+ public function openSYSDBAConnection() {
+ $status = Status::newGood();
+ try {
+ $db = new DatabaseOracle(
+ $this->getVar( 'wgDBserver' ),
+ $this->getVar( '_InstallUser' ),
+ $this->getVar( '_InstallPassword' ),
+ $this->getVar( '_InstallDBname' ),
+ DBO_SYSDBA,
+ $this->getVar( 'wgDBprefix' )
+ );
+ $status->value = $db;
+ } catch ( DBConnectionError $e ) {
+ $this->connError = $e->db->lastErrno();
+ $status->fatal( 'config-connection-error', $e->getMessage() );
+ }
+ return $status;
+ }
+
+ public function needsUpgrade() {
+ $tempDBname = $this->getVar( 'wgDBname' );
+ $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
+ $retVal = parent::needsUpgrade();
+ $this->parent->setVar( 'wgDBname', $tempDBname );
+ return $retVal;
+ }
+
+ public function preInstall() {
+ # Add our user callback to installSteps, right before the tables are created.
+ $callback = array(
+ 'name' => 'user',
+ 'callback' => array( $this, 'setupUser' )
+ );
+ $this->parent->addInstallStep( $callback, 'database' );
+ }
+
+
+ public function setupDatabase() {
+ $status = Status::newGood();
+ return $status;
+ }
+
+ public function setupUser() {
+ global $IP;
+
+ if ( !$this->getVar( '_CreateDBAccount' ) ) {
+ return Status::newGood();
+ }
+
+ // normaly only SYSDBA users can create accounts
+ $status = $this->openSYSDBAConnection();
+ if ( !$status->isOK() ) {
+ if ( $this->connError == 1031 ) {
+ // insufficient privileges (looks like a normal user)
+ $status = $this->openConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ } else {
+ return $status;
+ }
+ }
+ $this->db = $status->value;
+ $this->setupSchemaVars();
+
+ if ( !$this->db->selectDB( $this->getVar( 'wgDBuser' ) ) ) {
+ $this->db->setFlag( DBO_DDLMODE );
+ $error = $this->db->sourceFile( "$IP/maintenance/oracle/user.sql" );
+ if ( $error !== true || !$this->db->selectDB( $this->getVar( 'wgDBuser' ) ) ) {
+ $status->fatal( 'config-install-user-failed', $this->getVar( 'wgDBuser' ), $error );
+ }
+ } elseif ( $this->db->getFlag( DBO_SYSDBA ) ) {
+ $status->fatal( 'config-db-sys-user-exists-oracle', $this->getVar( 'wgDBuser' ) );
+ }
+
+ if ($status->isOK()) {
+ // user created or already existing, switching back to a normal connection
+ // as the new user has all needed privileges to setup the rest of the schema
+ // i will be using that user as _InstallUser from this point on
+ $this->parent->setVar( '_InstallUser', $this->getVar( 'wgDBuser' ) );
+ $this->parent->setVar( '_InstallPassword', $this->getVar( 'wgDBpassword' ) );
+ $this->parent->setVar( '_InstallDBname', $this->getVar( 'wgDBuser' ) );
+ $status = $this->getConnection();
+ }
+
+ return $status;
+ }
+
+ /**
+ * Overload: after this action field info table has to be rebuilt
+ */
+ public function createTables() {
+ $this->setupSchemaVars();
+ $this->db->selectDB( $this->getVar( 'wgDBuser' ) );
+ $this->db->setFlag( DBO_DDLMODE );
+ $status = parent::createTables();
+ $this->db->clearFlag( DBO_DDLMODE );
+
+ $this->db->query( 'BEGIN fill_wiki_info; END;' );
+
+ return $status;
+ }
+
+ public function getSchemaVars() {
+ $varNames = array(
+ # These variables are used by maintenance/oracle/user.sql
+ '_OracleDefTS',
+ '_OracleTempTS',
+ 'wgDBuser',
+ 'wgDBpassword',
+
+ # These are used by tables.sql
+ 'wgDBprefix',
+ );
+ $vars = array();
+ foreach ( $varNames as $name ) {
+ $vars[$name] = $this->getVar( $name );
+ }
+ return $vars;
+ }
+
+ public function getLocalSettings() {
+ $prefix = $this->getVar( 'wgDBprefix' );
+ return
+"# Oracle specific settings
+\$wgDBprefix = \"{$prefix}\";
+";
+ }
+
+}
diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php
new file mode 100644
index 00000000..4d85924e
--- /dev/null
+++ b/includes/installer/OracleUpdater.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Oracle-specific updater.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for handling updates to Oracle databases.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class OracleUpdater extends DatabaseUpdater {
+ protected function getCoreUpdateList() {
+ return array(
+ // 1.16
+ array( 'doNamespaceDefaults' ),
+ array( 'doFKRenameDeferr' ),
+ array( 'doFunctions17' ),
+ array( 'doSchemaUpgrade17' ),
+ array( 'doInsertPage0' ),
+ );
+ }
+
+ /**
+ * MySQL uses datatype defaults for NULL inserted into NOT NULL fields
+ * In namespace case that results into insert of 0 which is default namespace
+ * Oracle inserts NULL, so namespace fields should have a default value
+ */
+ protected function doNamespaceDefaults() {
+ $this->output( "Altering namespace fields with default value ... " );
+ $meta = $this->db->fieldInfo( 'page', 'page_namespace' );
+ if ( $meta->defaultValue() != null ) {
+ $this->output( "defaults seem to present on namespace fields\n" );
+ return;
+ }
+
+ $this->applyPatch( 'patch_namespace_defaults.sql', false );
+ $this->output( "ok\n" );
+ }
+
+ /**
+ * Uniform FK names + deferrable state
+ */
+ protected function doFKRenameDeferr() {
+ $this->output( "Altering foreign keys ... " );
+ $meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' );
+ $row = $meta->fetchRow();
+ if ( $row && $row['cnt'] > 0 ) {
+ $this->output( "at least one FK is deferrable, considering up to date\n" );
+ return;
+ }
+
+ $this->applyPatch( 'patch_fk_rename_deferred.sql', false );
+ $this->output( "ok\n" );
+ }
+
+ /**
+ * Recreate functions to 17 schema layout
+ */
+ protected function doFunctions17() {
+ $this->output( "Recreating functions ... " );
+ $this->applyPatch( 'patch_create_17_functions.sql', false );
+ $this->output( "ok\n" );
+ }
+
+ /**
+ * Schema upgrade 16->17
+ * there are no incremental patches prior to this
+ */
+ protected function doSchemaUpgrade17() {
+ $this->output( "Updating schema to 17 ... " );
+ // check if iwlinks table exists which was added in 1.17
+ if ( $this->db->tableExists( $this->db->tableName( 'iwlinks' ) ) ) {
+ $this->output( "schema seem to be up to date.\n" );
+ return;
+ }
+ $this->applyPatch( 'patch_16_17_schema_changes.sql', false );
+ $this->output( "ok\n" );
+ }
+
+ /**
+ * Insert page (page_id = 0) to prevent FK constraint violation
+ */
+ protected function doInsertPage0() {
+ $this->output( "Inserting page 0 if missing ... " );
+ $row = array(
+ 'page_id' => 0,
+ 'page_namespace' => 0,
+ 'page_title' => ' ',
+ 'page_counter' => 0,
+ 'page_is_redirect' => 0,
+ 'page_is_new' => 0,
+ 'page_random' => 0,
+ 'page_touched' => $this->db->timestamp(),
+ 'page_latest' => 0,
+ 'page_len' => 0
+ );
+ $this->db->insert( 'page', $row, 'OracleUpdater:doInserPage0', array( 'IGNORE' ) );
+ $this->output( "ok\n" );
+ }
+
+ /**
+ * Overload: after this action field info table has to be rebuilt
+ */
+ public function doUpdates( $what = array( 'core', 'extensions', 'purge' ) ) {
+ parent::doUpdates( $what );
+
+ $this->db->query( 'BEGIN fill_wiki_info; END;' );
+ }
+
+}
diff --git a/includes/installer/PhpBugTests.php b/includes/installer/PhpBugTests.php
new file mode 100644
index 00000000..9cafd150
--- /dev/null
+++ b/includes/installer/PhpBugTests.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Classes for self-contained tests for known bugs in 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
+ * @defgroup PHPBugTests
+ * @ingroup PHPBugTests
+ */
+
+/**
+ * Test for PHP+libxml2 bug which breaks XML input subtly with certain versions.
+ * Known fixed with PHP 5.2.9 + libxml2-2.7.3
+ * @see http://bugs.php.net/bug.php?id=45996
+ * @ingroup PHPBugTests
+ */
+class PhpXmlBugTester {
+ private $parsedData = '';
+ public $ok = false;
+ public function __construct() {
+ $charData = '<b>c</b>';
+ $xml = '<a>' . htmlspecialchars( $charData ) . '</a>';
+
+ $parser = xml_parser_create();
+ xml_set_character_data_handler( $parser, array( $this, 'chardata' ) );
+ $parsedOk = xml_parse( $parser, $xml, true );
+ $this->ok = $parsedOk && ( $this->parsedData == $charData );
+ }
+ public function chardata( $parser, $data ) {
+ $this->parsedData .= $data;
+ }
+}
+
+/**
+ * Test for PHP bug #50394 (PHP 5.3.x conversion to null only, not 5.2.x)
+ * @see http://bugs.php.net/bug.php?id=45996
+ * @ingroup PHPBugTests
+ */
+class PhpRefCallBugTester {
+ public $ok = false;
+
+ function __call( $name, $args ) {
+ $old = error_reporting( E_ALL & ~E_WARNING );
+ call_user_func_array( array( $this, 'checkForBrokenRef' ), $args );
+ error_reporting( $old );
+ }
+
+ function checkForBrokenRef( &$var ) {
+ if ( $var ) {
+ $this->ok = true;
+ }
+ }
+
+ function execute() {
+ $var = true;
+ call_user_func_array( array( $this, 'foo' ), array( &$var ) );
+ }
+}
diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php
new file mode 100644
index 00000000..20575b62
--- /dev/null
+++ b/includes/installer/PostgresInstaller.php
@@ -0,0 +1,601 @@
+<?php
+/**
+ * PostgreSQL-specific installer.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for setting up the MediaWiki database using Postgres.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class PostgresInstaller extends DatabaseInstaller {
+
+ protected $globalNames = array(
+ 'wgDBserver',
+ 'wgDBport',
+ 'wgDBname',
+ 'wgDBuser',
+ 'wgDBpassword',
+ 'wgDBmwschema',
+ );
+
+ protected $internalDefaults = array(
+ '_InstallUser' => 'postgres',
+ );
+
+ var $minimumVersion = '8.3';
+ var $maxRoleSearchDepth = 5;
+
+ protected $pgConns = array();
+
+ function getName() {
+ return 'postgres';
+ }
+
+ public function isCompiled() {
+ return self::checkExtension( 'pgsql' );
+ }
+
+ function getConnectForm() {
+ return
+ $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+ $this->getTextBox( 'wgDBport', 'config-db-port' ) .
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+ $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
+ $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
+ Html::closeElement( 'fieldset' ) .
+ $this->getInstallUserBox();
+ }
+
+ function submitConnectForm() {
+ // Get variables from the request
+ $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBport',
+ 'wgDBname', 'wgDBmwschema' ) );
+
+ // Validate them
+ $status = Status::newGood();
+ if ( !strlen( $newValues['wgDBname'] ) ) {
+ $status->fatal( 'config-missing-db-name' );
+ } elseif ( !preg_match( '/^[a-zA-Z0-9_]+$/', $newValues['wgDBname'] ) ) {
+ $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
+ }
+ if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
+ $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
+ }
+
+ // Submit user box
+ if ( $status->isOK() ) {
+ $status->merge( $this->submitInstallUserBox() );
+ }
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ $status = $this->getPgConnection( 'create-db' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ // Check version
+ $version = $conn->getServerVersion();
+ if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
+ return Status::newFatal( 'config-postgres-old', $this->minimumVersion, $version );
+ }
+
+ $this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
+ $this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+ return Status::newGood();
+ }
+
+ public function getConnection() {
+ $status = $this->getPgConnection( 'create-tables' );
+ if ( $status->isOK() ) {
+ $this->db = $status->value;
+ }
+ return $status;
+ }
+
+ public function openConnection() {
+ return $this->openPgConnection( 'create-tables' );
+ }
+
+ /**
+ * Open a PG connection with given parameters
+ * @param $user User name
+ * @param $password Password
+ * @param $dbName Database name
+ * @return Status
+ */
+ protected function openConnectionWithParams( $user, $password, $dbName ) {
+ $status = Status::newGood();
+ try {
+ $GLOBALS['wgDBport'] = $this->getVar( 'wgDBport' );
+ $db = new DatabasePostgres(
+ $this->getVar( 'wgDBserver' ),
+ $user,
+ $password,
+ $dbName);
+ $status->value = $db;
+ } catch ( DBConnectionError $e ) {
+ $status->fatal( 'config-connection-error', $e->getMessage() );
+ }
+ return $status;
+ }
+
+ /**
+ * Get a special type of connection
+ * @param $type See openPgConnection() for details.
+ * @return Status
+ */
+ protected function getPgConnection( $type ) {
+ if ( isset( $this->pgConns[$type] ) ) {
+ return Status::newGood( $this->pgConns[$type] );
+ }
+ $status = $this->openPgConnection( $type );
+
+ if ( $status->isOK() ) {
+ $conn = $status->value;
+ $conn->clearFlag( DBO_TRX );
+ $conn->commit();
+ $this->pgConns[$type] = $conn;
+ }
+ return $status;
+ }
+
+ /**
+ * Get a connection of a specific PostgreSQL-specific type. Connections
+ * of a given type are cached.
+ *
+ * PostgreSQL lacks cross-database operations, so after the new database is
+ * created, you need to make a separate connection to connect to that
+ * database and add tables to it.
+ *
+ * New tables are owned by the user that creates them, and MediaWiki's
+ * PostgreSQL support has always assumed that the table owner will be
+ * $wgDBuser. So before we create new tables, we either need to either
+ * connect as the other user or to execute a SET ROLE command. Using a
+ * separate connection for this allows us to avoid accidental cross-module
+ * dependencies.
+ *
+ * @param $type The type of connection to get:
+ * - create-db: A connection for creating DBs, suitable for pre-
+ * installation.
+ * - create-schema: A connection to the new DB, for creating schemas and
+ * other similar objects in the new DB.
+ * - create-tables: A connection with a role suitable for creating tables.
+ *
+ * @return A Status object. On success, a connection object will be in the
+ * value member.
+ */
+ protected function openPgConnection( $type ) {
+ switch ( $type ) {
+ case 'create-db':
+ return $this->openConnectionToAnyDB(
+ $this->getVar( '_InstallUser' ),
+ $this->getVar( '_InstallPassword' ) );
+ case 'create-schema':
+ return $this->openConnectionWithParams(
+ $this->getVar( '_InstallUser' ),
+ $this->getVar( '_InstallPassword' ),
+ $this->getVar( 'wgDBname' ) );
+ case 'create-tables':
+ $status = $this->openPgConnection( 'create-schema' );
+ if ( $status->isOK() ) {
+ $conn = $status->value;
+ $safeRole = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
+ $conn->query( "SET ROLE $safeRole" );
+ }
+ return $status;
+ default:
+ throw new MWException( "Invalid special connection type: \"$type\"" );
+ }
+ }
+
+ public function openConnectionToAnyDB( $user, $password ) {
+ $dbs = array(
+ 'template1',
+ 'postgres',
+ );
+ if ( !in_array( $this->getVar( 'wgDBname' ), $dbs ) ) {
+ array_unshift( $dbs, $this->getVar( 'wgDBname' ) );
+ }
+ $status = Status::newGood();
+ foreach ( $dbs as $db ) {
+ try {
+ $GLOBALS['wgDBport'] = $this->getVar( 'wgDBport' );
+ $conn = new DatabasePostgres(
+ $this->getVar( 'wgDBserver' ),
+ $user,
+ $password,
+ $db );
+ } catch ( DBConnectionError $error ) {
+ $conn = false;
+ $status->fatal( 'config-pg-test-error', $db,
+ $error->getMessage() );
+ }
+ if ( $conn !== false ) {
+ break;
+ }
+ }
+ if ( $conn !== false ) {
+ return Status::newGood( $conn );
+ } else {
+ return $status;
+ }
+ }
+
+ protected function getInstallUserPermissions() {
+ $status = $this->getPgConnection( 'create-db' );
+ if ( !$status->isOK() ) {
+ return false;
+ }
+ $conn = $status->value;
+ $superuser = $this->getVar( '_InstallUser' );
+
+ $row = $conn->selectRow( '"pg_catalog"."pg_roles"', '*',
+ array( 'rolname' => $superuser ), __METHOD__ );
+ return $row;
+ }
+
+ protected function canCreateAccounts() {
+ $perms = $this->getInstallUserPermissions();
+ if ( !$perms ) {
+ return false;
+ }
+ return $perms->rolsuper === 't' || $perms->rolcreaterole === 't';
+ }
+
+ protected function isSuperUser() {
+ $perms = $this->getInstallUserPermissions();
+ if ( !$perms ) {
+ return false;
+ }
+ return $perms->rolsuper === 't';
+ }
+
+ public function getSettingsForm() {
+ if ( $this->canCreateAccounts() ) {
+ $noCreateMsg = false;
+ } else {
+ $noCreateMsg = 'config-db-web-no-create-privs';
+ }
+ $s = $this->getWebUserBox( $noCreateMsg );
+
+ return $s;
+ }
+
+ public function submitSettingsForm() {
+ $status = $this->submitWebUserBox();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ $same = $this->getVar( 'wgDBuser' ) === $this->getVar( '_InstallUser' );
+
+ if ( $same ) {
+ $exists = true;
+ } else {
+ // Check if the web user exists
+ // Connect to the database with the install user
+ $status = $this->getPgConnection( 'create-db' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $exists = $status->value->roleExists( $this->getVar( 'wgDBuser' ) );
+ }
+
+ // Validate the create checkbox
+ if ( $this->canCreateAccounts() && !$same && !$exists ) {
+ $create = $this->getVar( '_CreateDBAccount' );
+ } else {
+ $this->setVar( '_CreateDBAccount', false );
+ $create = false;
+ }
+
+ if ( !$create && !$exists ) {
+ if ( $this->canCreateAccounts() ) {
+ $msg = 'config-install-user-missing-create';
+ } else {
+ $msg = 'config-install-user-missing';
+ }
+ return Status::newFatal( $msg, $this->getVar( 'wgDBuser' ) );
+ }
+
+ if ( !$exists ) {
+ // No more checks to do
+ return Status::newGood();
+ }
+
+ // Existing web account. Test the connection.
+ $status = $this->openConnectionToAnyDB(
+ $this->getVar( 'wgDBuser' ),
+ $this->getVar( 'wgDBpassword' ) );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // The web user is conventionally the table owner in PostgreSQL
+ // installations. Make sure the install user is able to create
+ // objects on behalf of the web user.
+ if ( $same || $this->canCreateObjectsForWebUser() ) {
+ return Status::newGood();
+ } else {
+ return Status::newFatal( 'config-pg-not-in-role' );
+ }
+ }
+
+ /**
+ * Returns true if the install user is able to create objects owned
+ * by the web user, false otherwise.
+ */
+ protected function canCreateObjectsForWebUser() {
+ if ( $this->isSuperUser() ) {
+ return true;
+ }
+
+ $status = $this->getPgConnection( 'create-db' );
+ if ( !$status->isOK() ) {
+ return false;
+ }
+ $conn = $status->value;
+ $installerId = $conn->selectField( '"pg_catalog"."pg_roles"', 'oid',
+ array( 'rolname' => $this->getVar( '_InstallUser' ) ), __METHOD__ );
+ $webId = $conn->selectField( '"pg_catalog"."pg_roles"', 'oid',
+ array( 'rolname' => $this->getVar( 'wgDBuser' ) ), __METHOD__ );
+
+ return $this->isRoleMember( $conn, $installerId, $webId, $this->maxRoleSearchDepth );
+ }
+
+ /**
+ * Recursive helper for canCreateObjectsForWebUser().
+ * @param $conn Database object
+ * @param $targetMember Role ID of the member to look for
+ * @param $group Role ID of the group to look for
+ * @param $maxDepth Maximum recursive search depth
+ */
+ protected function isRoleMember( $conn, $targetMember, $group, $maxDepth ) {
+ if ( $targetMember === $group ) {
+ // A role is always a member of itself
+ return true;
+ }
+ // Get all members of the given group
+ $res = $conn->select( '"pg_catalog"."pg_auth_members"', array( 'member' ),
+ array( 'roleid' => $group ), __METHOD__ );
+ foreach ( $res as $row ) {
+ if ( $row->member == $targetMember ) {
+ // Found target member
+ return true;
+ }
+ // Recursively search each member of the group to see if the target
+ // is a member of it, up to the given maximum depth.
+ if ( $maxDepth > 0 ) {
+ if ( $this->isRoleMember( $conn, $targetMember, $row->member, $maxDepth - 1 ) ) {
+ // Found member of member
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public function preInstall() {
+ $commitCB = array(
+ 'name' => 'pg-commit',
+ 'callback' => array( $this, 'commitChanges' ),
+ );
+ $plpgCB = array(
+ 'name' => 'pg-plpgsql',
+ 'callback' => array( $this, 'setupPLpgSQL' ),
+ );
+ $schemaCB = array(
+ 'name' => 'schema',
+ 'callback' => array( $this, 'setupSchema' )
+ );
+ $this->parent->addInstallStep( $commitCB, 'interwiki' );
+ $this->parent->addInstallStep( $plpgCB, 'database' );
+ $this->parent->addInstallStep( $schemaCB, 'database' );
+ if( $this->getVar( '_CreateDBAccount' ) ) {
+ $this->parent->addInstallStep( array(
+ 'name' => 'user',
+ 'callback' => array( $this, 'setupUser' ),
+ ) );
+ }
+ }
+
+ function setupDatabase() {
+ $status = $this->getPgConnection( 'create-db' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ $dbName = $this->getVar( 'wgDBname' );
+ $schema = $this->getVar( 'wgDBmwschema' );
+ $user = $this->getVar( 'wgDBuser' );
+ $safeschema = $conn->addIdentifierQuotes( $schema );
+ $safeuser = $conn->addIdentifierQuotes( $user );
+
+ $exists = $conn->selectField( '"pg_catalog"."pg_database"', '1',
+ array( 'datname' => $dbName ), __METHOD__ );
+ if ( !$exists ) {
+ $safedb = $conn->addIdentifierQuotes( $dbName );
+ $conn->query( "CREATE DATABASE $safedb", __METHOD__ );
+ }
+ return Status::newGood();
+ }
+
+ function setupSchema() {
+ // Get a connection to the target database
+ $status = $this->getPgConnection( 'create-schema' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ // Create the schema if necessary
+ $schema = $this->getVar( 'wgDBmwschema' );
+ $safeschema = $conn->addIdentifierQuotes( $schema );
+ $safeuser = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
+ if( !$conn->schemaExists( $schema ) ) {
+ try {
+ $conn->query( "CREATE SCHEMA $safeschema AUTHORIZATION $safeuser" );
+ } catch ( DBQueryError $e ) {
+ return Status::newFatal( 'config-install-pg-schema-failed',
+ $this->getVar( '_InstallUser' ), $schema );
+ }
+ }
+
+ // If we created a user, alter it now to search the new schema by default
+ if ( $this->getVar( '_CreateDBAccount' ) ) {
+ $conn->query( "ALTER ROLE $safeuser SET search_path = $safeschema, public",
+ __METHOD__ );
+ }
+
+ // Select the new schema in the current connection
+ $conn->query( "SET search_path = $safeschema" );
+ return Status::newGood();
+ }
+
+ function commitChanges() {
+ $this->db->query( 'COMMIT' );
+ return Status::newGood();
+ }
+
+ function setupUser() {
+ if ( !$this->getVar( '_CreateDBAccount' ) ) {
+ return Status::newGood();
+ }
+
+ $status = $this->getPgConnection( 'create-db' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ $schema = $this->getVar( 'wgDBmwschema' );
+ $safeuser = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
+ $safepass = $conn->addQuotes( $this->getVar( 'wgDBpassword' ) );
+ $safeschema = $conn->addIdentifierQuotes( $schema );
+
+ // Check if the user already exists
+ $userExists = $conn->roleExists( $this->getVar( 'wgDBuser' ) );
+ if ( !$userExists ) {
+ // Create the user
+ try {
+ $sql = "CREATE ROLE $safeuser NOCREATEDB LOGIN PASSWORD $safepass";
+
+ // If the install user is not a superuser, we need to make the install
+ // user a member of the new user's group, so that the install user will
+ // be able to create a schema and other objects on behalf of the new user.
+ if ( !$this->isSuperUser() ) {
+ $sql .= ' ROLE' . $conn->addIdentifierQuotes( $this->getVar( '_InstallUser' ) );
+ }
+
+ $conn->query( $sql, __METHOD__ );
+ } catch ( DBQueryError $e ) {
+ return Status::newFatal( 'config-install-user-create-failed',
+ $this->getVar( 'wgDBuser' ), $e->getMessage() );
+ }
+ }
+
+ return Status::newGood();
+ }
+
+ function getLocalSettings() {
+ $port = $this->getVar( 'wgDBport' );
+ $schema = $this->getVar( 'wgDBmwschema' );
+ return
+"# Postgres specific settings
+\$wgDBport = \"{$port}\";
+\$wgDBmwschema = \"{$schema}\";";
+ }
+
+ public function preUpgrade() {
+ global $wgDBuser, $wgDBpassword;
+
+ # Normal user and password are selected after this step, so for now
+ # just copy these two
+ $wgDBuser = $this->getVar( '_InstallUser' );
+ $wgDBpassword = $this->getVar( '_InstallPassword' );
+ }
+
+ public function createTables() {
+ $schema = $this->getVar( 'wgDBmwschema' );
+
+ $status = $this->getConnection();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ if( $conn->tableExists( 'user' ) ) {
+ $status->warning( 'config-install-tables-exist' );
+ return $status;
+ }
+
+ $conn->begin( __METHOD__ );
+
+ if( !$conn->schemaExists( $schema ) ) {
+ $status->fatal( 'config-install-pg-schema-not-exist' );
+ return $status;
+ }
+ $error = $conn->sourceFile( $conn->getSchema() );
+ if( $error !== true ) {
+ $conn->reportQueryError( $error, 0, '', __METHOD__ );
+ $conn->rollback( __METHOD__ );
+ $status->fatal( 'config-install-tables-failed', $error );
+ } else {
+ $conn->commit( __METHOD__ );
+ }
+ // Resume normal operations
+ if( $status->isOk() ) {
+ $this->enableLB();
+ }
+ return $status;
+ }
+
+ public function setupPLpgSQL() {
+ // Connect as the install user, since it owns the database and so is
+ // the user that needs to run "CREATE LANGAUGE"
+ $status = $this->getPgConnection( 'create-schema' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ $conn = $status->value;
+
+ $exists = $conn->selectField( '"pg_catalog"."pg_language"', 1,
+ array( 'lanname' => 'plpgsql' ), __METHOD__ );
+ if ( $exists ) {
+ // Already exists, nothing to do
+ return Status::newGood();
+ }
+
+ // plpgsql is not installed, but if we have a pg_pltemplate table, we
+ // should be able to create it
+ $exists = $conn->selectField(
+ array( '"pg_catalog"."pg_class"', '"pg_catalog"."pg_namespace"' ),
+ 1,
+ array(
+ 'pg_namespace.oid=relnamespace',
+ 'nspname' => 'pg_catalog',
+ 'relname' => 'pg_pltemplate',
+ ),
+ __METHOD__ );
+ if ( $exists ) {
+ try {
+ $conn->query( 'CREATE LANGUAGE plpgsql' );
+ } catch ( DBQueryError $e ) {
+ return Status::newFatal( 'config-pg-no-plpgsql', $this->getVar( 'wgDBname' ) );
+ }
+ } else {
+ return Status::newFatal( 'config-pg-no-plpgsql', $this->getVar( 'wgDBname' ) );
+ }
+ return Status::newGood();
+ }
+}
diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php
new file mode 100644
index 00000000..272638ce
--- /dev/null
+++ b/includes/installer/PostgresUpdater.php
@@ -0,0 +1,628 @@
+<?php
+/**
+ * PostgreSQL-specific updater.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for handling updates to Postgres databases.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+
+class PostgresUpdater extends DatabaseUpdater {
+
+ /**
+ * @todo FIXME: Postgres should use sequential updates like Mysql, Sqlite
+ * and everybody else. It never got refactored like it should've.
+ */
+ protected function getCoreUpdateList() {
+ return array(
+ # new sequences
+ array( 'addSequence', 'logging_log_id_seq' ),
+ array( 'addSequence', 'page_restrictions_pr_id_seq' ),
+
+ # renamed sequences
+ array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq' ),
+ array( 'renameSequence', 'rev_rev_id_val', 'revision_rev_id_seq' ),
+ array( 'renameSequence', 'text_old_id_val', 'text_old_id_seq' ),
+ array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq' ),
+ array( 'renameSequence', 'rc_rc_id_seq', 'recentchanges_rc_id_seq' ),
+ array( 'renameSequence', 'log_log_id_seq', 'logging_log_id_seq' ),
+ array( 'renameSequence', 'pr_id_val', 'page_restrictions_pr_id_seq' ),
+
+ # new tables
+ array( 'addTable', 'category', 'patch-category.sql' ),
+ array( 'addTable', 'page', 'patch-page.sql' ),
+ array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ),
+ array( 'addTable', 'page_props', 'patch-page_props.sql' ),
+ array( 'addTable', 'page_restrictions', 'patch-page_restrictions.sql' ),
+ array( 'addTable', 'profiling', 'patch-profiling.sql' ),
+ array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ),
+ array( 'addTable', 'redirect', 'patch-redirect.sql' ),
+ array( 'addTable', 'updatelog', 'patch-updatelog.sql' ),
+ array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+ array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+ array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ),
+ array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+ array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+ array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+ array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+ array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+ array( 'addTable', 'msg_resource_links','patch-msg_resource_links.sql' ),
+ array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+
+ # Needed before new field
+ array( 'convertArchive2' ),
+
+ # new fields
+ array( 'addPgField', 'archive', 'ar_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'archive', 'ar_len', 'INTEGER' ),
+ array( 'addPgField', 'archive', 'ar_page_id', 'INTEGER' ),
+ array( 'addPgField', 'archive', 'ar_parent_id', 'INTEGER' ),
+ array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix', "TEXT NOT NULL DEFAULT ''"),
+ array( 'addPgField', 'categorylinks', 'cl_collation', "TEXT NOT NULL DEFAULT 0"),
+ array( 'addPgField', 'categorylinks', 'cl_type', "TEXT NOT NULL DEFAULT 'page'"),
+ array( 'addPgField', 'image', 'img_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'ipblocks', 'ipb_allow_usertalk', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'ipblocks', 'ipb_anon_only', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'ipblocks', 'ipb_by_text', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'ipblocks', 'ipb_block_email', 'SMALLINT NOT NULL DEFAULT 0' ),
+ 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', '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')" ),
+ array( 'addPgField', 'logging', 'log_params', 'TEXT' ),
+ array( 'addPgField', 'mwuser', 'user_editcount', 'INTEGER' ),
+ array( 'addPgField', 'mwuser', 'user_newpass_time', 'TIMESTAMPTZ' ),
+ array( 'addPgField', 'oldimage', 'oi_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'oldimage', 'oi_major_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
+ array( 'addPgField', 'oldimage', 'oi_media_type', 'TEXT' ),
+ array( 'addPgField', 'oldimage', 'oi_metadata', "BYTEA NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'oldimage', 'oi_minor_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
+ array( 'addPgField', 'oldimage', 'oi_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'page_restrictions', 'pr_id', "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
+ array( 'addPgField', 'profiling', 'pf_memory', 'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'recentchanges', 'rc_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'recentchanges', 'rc_log_action', 'TEXT' ),
+ array( 'addPgField', 'recentchanges', 'rc_log_type', 'TEXT' ),
+ array( 'addPgField', 'recentchanges', 'rc_logid', 'INTEGER NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'recentchanges', 'rc_new_len', 'INTEGER' ),
+ array( 'addPgField', 'recentchanges', 'rc_old_len', 'INTEGER' ),
+ array( 'addPgField', 'recentchanges', 'rc_params', 'TEXT' ),
+ array( 'addPgField', 'redirect', 'rd_interwiki', 'TEXT NULL' ),
+ array( 'addPgField', 'redirect', 'rd_fragment', 'TEXT NULL' ),
+ array( 'addPgField', 'revision', 'rev_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'revision', 'rev_len', 'INTEGER' ),
+ array( 'addPgField', 'revision', 'rev_parent_id', 'INTEGER DEFAULT NULL' ),
+ array( 'addPgField', 'site_stats', 'ss_active_users', "INTEGER DEFAULT '-1'" ),
+ array( 'addPgField', 'user_newtalk', 'user_last_timestamp', 'TIMESTAMPTZ' ),
+ array( 'addPgField', 'logging', 'log_user_text', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'logging', 'log_page', 'INTEGER' ),
+ array( 'addPgField', 'interwiki', 'iw_api', "TEXT NOT NULL DEFAULT ''"),
+ array( 'addPgField', 'interwiki', 'iw_wikiid', "TEXT NOT NULL DEFAULT ''"),
+
+ # type changes
+ array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ),
+ array( 'changeField', 'archive', 'ar_minor_edit', 'smallint', 'ar_minor_edit::smallint DEFAULT 0' ),
+ array( 'changeField', 'filearchive', 'fa_deleted', 'smallint', '' ),
+ array( 'changeField', 'filearchive', 'fa_height', 'integer', '' ),
+ array( 'changeField', 'filearchive', 'fa_metadata', 'bytea', "decode(fa_metadata,'escape')" ),
+ array( 'changeField', 'filearchive', 'fa_size', 'integer', '' ),
+ array( 'changeField', 'filearchive', 'fa_width', 'integer', '' ),
+ array( 'changeField', 'filearchive', 'fa_storage_group', 'text', '' ),
+ array( 'changeField', 'filearchive', 'fa_storage_key', 'text', '' ),
+ array( 'changeField', 'image', 'img_metadata', 'bytea', "decode(img_metadata,'escape')" ),
+ array( 'changeField', 'image', 'img_size', 'integer', '' ),
+ array( 'changeField', 'image', 'img_width', 'integer', '' ),
+ array( 'changeField', 'image', 'img_height', 'integer', '' ),
+ array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint DEFAULT 0' ),
+ array( 'changeField', 'interwiki', 'iw_trans', 'smallint', 'iw_trans::smallint DEFAULT 0' ),
+ array( 'changeField', 'ipblocks', 'ipb_auto', 'smallint', 'ipb_auto::smallint DEFAULT 0' ),
+ array( 'changeField', 'ipblocks', 'ipb_anon_only', 'smallint', "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ),
+ array( 'changeField', 'ipblocks', 'ipb_create_account', 'smallint', "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ),
+ array( 'changeField', 'ipblocks', 'ipb_enable_autoblock', 'smallint', "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ),
+ array( 'changeField', 'ipblocks', 'ipb_block_email', 'smallint', "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ),
+ array( 'changeField', 'ipblocks', 'ipb_address', 'text', 'ipb_address::text' ),
+ array( 'changeField', 'ipblocks', 'ipb_deleted', 'smallint', 'ipb_deleted::smallint DEFAULT 0' ),
+ array( 'changeField', 'math', 'math_inputhash', 'bytea', "decode(math_inputhash,'escape')" ),
+ array( 'changeField', 'math', 'math_outputhash', 'bytea', "decode(math_outputhash,'escape')" ),
+ array( 'changeField', 'mwuser', 'user_token', 'text', '' ),
+ array( 'changeField', 'mwuser', 'user_email_token', 'text', '' ),
+ array( 'changeField', 'objectcache', 'keyname', 'text', '' ),
+ array( 'changeField', 'oldimage', 'oi_height', 'integer', '' ),
+ array( 'changeField', 'oldimage', 'oi_metadata', 'bytea', "decode(img_metadata,'escape')" ),
+ array( 'changeField', 'oldimage', 'oi_size', 'integer', '' ),
+ array( 'changeField', 'oldimage', 'oi_width', 'integer', '' ),
+ array( 'changeField', 'page', 'page_is_redirect', 'smallint', 'page_is_redirect::smallint DEFAULT 0' ),
+ array( 'changeField', 'page', 'page_is_new', 'smallint', 'page_is_new::smallint DEFAULT 0' ),
+ array( 'changeField', 'querycache', 'qc_value', 'integer', '' ),
+ array( 'changeField', 'querycachetwo', 'qcc_value', 'integer', '' ),
+ array( 'changeField', 'recentchanges', 'rc_bot', 'smallint', 'rc_bot::smallint DEFAULT 0' ),
+ array( 'changeField', 'recentchanges', 'rc_deleted', 'smallint', '' ),
+ array( 'changeField', 'recentchanges', 'rc_minor', 'smallint', 'rc_minor::smallint DEFAULT 0' ),
+ array( 'changeField', 'recentchanges', 'rc_new', 'smallint', 'rc_new::smallint DEFAULT 0' ),
+ array( 'changeField', 'recentchanges', 'rc_type', 'smallint', 'rc_type::smallint DEFAULT 0' ),
+ array( 'changeField', 'recentchanges', 'rc_patrolled', 'smallint', 'rc_patrolled::smallint DEFAULT 0' ),
+ array( 'changeField', 'revision', 'rev_deleted', 'smallint', 'rev_deleted::smallint DEFAULT 0' ),
+ array( 'changeField', 'revision', 'rev_minor_edit', 'smallint', 'rev_minor_edit::smallint DEFAULT 0' ),
+ array( 'changeField', 'templatelinks', 'tl_namespace', 'smallint', 'tl_namespace::smallint' ),
+ array( 'changeField', 'user_newtalk', 'user_ip', 'text', 'host(user_ip)' ),
+
+ # null changes
+ array( 'changeNullableField', 'oldimage', 'oi_bits', 'NULL' ),
+ array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ),
+ array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
+ array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
+
+ array( 'checkOiDeleted' ),
+
+ # New indexes
+ array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
+ array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
+ 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)' ),
+ array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ),
+ array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
+ array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
+ array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ),
+ array( 'addPgIndex', 'logging', 'logging_user_type_time', '(log_user, log_type, log_timestamp)' ),
+ array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
+ array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ),
+
+ array( 'checkOiNameConstraint' ),
+ array( 'checkPageDeletedTrigger' ),
+ array( 'checkRcCurIdNullable' ),
+ array( 'checkPagelinkUniqueIndex' ),
+ array( 'checkRevUserFkey' ),
+ array( 'checkIpbAdress' ),
+ array( 'checkIwlPrefix' ),
+
+ # All FK columns should be deferred
+ array( 'changeFkeyDeferrable', 'archive', 'ar_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'categorylinks', 'cl_from', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'externallinks', 'el_from', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'filearchive', 'fa_deleted_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'filearchive', 'fa_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'image', 'img_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ 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', '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' ),
+ array( 'changeFkeyDeferrable', 'oldimage', 'oi_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'pagelinks', 'pl_from', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'page_props', 'pp_page', 'page (page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'recentchanges', 'rc_cur_id', 'page(page_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'recentchanges', 'rc_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'redirect', 'rd_from', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'revision', 'rev_page', 'page (page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'revision', 'rev_user', 'mwuser(user_id) ON DELETE RESTRICT' ),
+ array( 'changeFkeyDeferrable', 'templatelinks', 'tl_from', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'trackbacks', 'tb_page', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'user_groups', 'ug_user', 'mwuser(user_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'user_newtalk', 'user_id', 'mwuser(user_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'user_properties', 'up_user', 'mwuser(user_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'watchlist', 'wl_user', 'mwuser(user_id) ON DELETE CASCADE' ),
+
+ # end
+ array( 'tsearchFixes' ),
+ );
+ }
+
+ protected function getOldGlobalUpdates() {
+ global $wgExtNewTables, $wgExtPGNewFields, $wgExtPGAlteredFields, $wgExtNewIndexes;
+
+ $updates = array();
+
+ # Add missing extension tables
+ foreach ( $wgExtNewTables as $tableRecord ) {
+ $updates[] = array(
+ 'addTable', $tableRecord[0], $tableRecord[1], true
+ );
+ }
+
+ # Add missing extension fields
+ foreach ( $wgExtPGNewFields as $fieldRecord ) {
+ $updates[] = array(
+ 'addPgField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
+ }
+
+ # Change altered columns
+ foreach ( $wgExtPGAlteredFields as $fieldRecord ) {
+ $updates[] = array(
+ 'changeField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
+ }
+
+ # Add missing extension indexes
+ foreach ( $wgExtNewIndexes as $fieldRecord ) {
+ $updates[] = array(
+ 'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
+ }
+
+ return $updates;
+ }
+
+ protected function describeTable( $table ) {
+ global $wgDBmwschema;
+ $q = <<<END
+SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
+ WHERE pg_class.relnamespace = pg_namespace.oid
+ AND attrelid=pg_class.oid AND attnum > 0
+ AND relname=%s AND nspname=%s
+END;
+ $res = $this->db->query( sprintf( $q,
+ $this->db->addQuotes( $table ),
+ $this->db->addQuotes( $wgDBmwschema ) ) );
+ if ( !$res ) {
+ return null;
+ }
+
+ $cols = array();
+ foreach ( $res as $r ) {
+ $cols[] = array(
+ "name" => $r[0],
+ "ord" => $r[1],
+ );
+ }
+ return $cols;
+ }
+
+ function describeIndex( $idx ) {
+ global $wgDBmwschema;
+
+ // first fetch the key (which is a list of columns ords) and
+ // the table the index applies to (an oid)
+ $q = <<<END
+SELECT indkey, indrelid FROM pg_namespace, pg_class, pg_index
+ WHERE nspname=%s
+ AND pg_class.relnamespace = pg_namespace.oid
+ AND relname=%s
+ AND indexrelid=pg_class.oid
+END;
+ $res = $this->db->query(
+ sprintf(
+ $q,
+ $this->db->addQuotes( $wgDBmwschema ),
+ $this->db->addQuotes( $idx )
+ )
+ );
+ if ( !$res ) {
+ return null;
+ }
+ if ( !( $r = $this->db->fetchRow( $res ) ) ) {
+ return null;
+ }
+
+ $indkey = $r[0];
+ $relid = intval( $r[1] );
+ $indkeys = explode( ' ', $indkey );
+
+ $colnames = array();
+ foreach ( $indkeys as $rid ) {
+ $query = <<<END
+SELECT attname FROM pg_class, pg_attribute
+ WHERE attrelid=$relid
+ AND attnum=%d
+ AND attrelid=pg_class.oid
+END;
+ $r2 = $this->db->query( sprintf( $query, $rid ) );
+ if ( !$r2 ) {
+ return null;
+ }
+ if ( !( $row2 = $this->db->fetchRow( $r2 ) ) ) {
+ return null;
+ }
+ $colnames[] = $row2[0];
+ }
+
+ return $colnames;
+ }
+
+ function fkeyDeltype( $fkey ) {
+ global $wgDBmwschema;
+ $q = <<<END
+SELECT confdeltype FROM pg_constraint, pg_namespace
+ WHERE connamespace=pg_namespace.oid
+ AND nspname=%s
+ AND conname=%s;
+END;
+ $r = $this->db->query(
+ sprintf(
+ $q,
+ $this->db->addQuotes( $wgDBmwschema ),
+ $this->db->addQuotes( $fkey )
+ )
+ );
+ if ( !( $row = $this->db->fetchRow( $r ) ) ) {
+ return null;
+ }
+ return $row[0];
+ }
+
+ function ruleDef( $table, $rule ) {
+ global $wgDBmwschema;
+ $q = <<<END
+SELECT definition FROM pg_rules
+ WHERE schemaname = %s
+ AND tablename = %s
+ AND rulename = %s
+END;
+ $r = $this->db->query(
+ sprintf(
+ $q,
+ $this->db->addQuotes( $wgDBmwschema ),
+ $this->db->addQuotes( $table ),
+ $this->db->addQuotes( $rule )
+ )
+ );
+ $row = $this->db->fetchRow( $r );
+ if ( !$row ) {
+ return null;
+ }
+ $d = $row[0];
+ return $d;
+ }
+
+ protected function addSequence( $ns ) {
+ if ( !$this->db->sequenceExists( $ns ) ) {
+ $this->output( "Creating sequence $ns\n" );
+ $this->db->query( "CREATE SEQUENCE $ns" );
+ }
+ }
+
+ protected function renameSequence( $old, $new ) {
+ if ( $this->db->sequenceExists( $old ) ) {
+ $this->output( "Renaming sequence $old to $new\n" );
+ $this->db->query( "ALTER SEQUENCE $old RENAME TO $new" );
+ }
+ }
+
+ protected function renameTable( $old, $new ) {
+ if ( $this->db->tableExists( $old ) ) {
+ $this->output( "Renaming table $old to $new\n" );
+ $old = $this->db->addQuotes( $old );
+ $this->db->query( "ALTER TABLE $old RENAME TO $new" );
+ }
+ }
+
+ protected function addPgField( $table, $field, $type ) {
+ $fi = $this->db->fieldInfo( $table, $field );
+ if ( !is_null( $fi ) ) {
+ $this->output( "... column '$table.$field' already exists\n" );
+ return;
+ } else {
+ $this->output( "Adding column '$table.$field'\n" );
+ $this->db->query( "ALTER TABLE $table ADD $field $type" );
+ }
+ }
+
+ protected function changeField( $table, $field, $newtype, $default ) {
+ $fi = $this->db->fieldInfo( $table, $field );
+ if ( is_null( $fi ) ) {
+ $this->output( "... error: expected column $table.$field to exist\n" );
+ exit( 1 );
+ }
+
+ if ( $fi->type() === $newtype )
+ $this->output( "... column '$table.$field' is already of type '$newtype'\n" );
+ else {
+ $this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" );
+ $sql = "ALTER TABLE $table ALTER $field TYPE $newtype";
+ if ( strlen( $default ) ) {
+ $res = array();
+ if ( preg_match( '/DEFAULT (.+)/', $default, $res ) ) {
+ $sqldef = "ALTER TABLE $table ALTER $field SET DEFAULT $res[1]";
+ $this->db->query( $sqldef );
+ $default = preg_replace( '/\s*DEFAULT .+/', '', $default );
+ }
+ $sql .= " USING $default";
+ }
+ $sql .= ";\nCOMMIT;\n";
+ $this->db->query( $sql );
+ }
+ }
+
+ protected function changeNullableField( $table, $field, $null ) {
+ $fi = $this->db->fieldInfo( $table, $field );
+ if ( is_null( $fi ) ) {
+ $this->output( "... error: expected column $table.$field to exist\n" );
+ exit( 1 );
+ }
+ if ( $fi->isNullable() ) {
+ # # It's NULL - does it need to be NOT NULL?
+ if ( 'NOT NULL' === $null ) {
+ $this->output( "Changing '$table.$field' to not allow NULLs\n" );
+ $this->db->query( "ALTER TABLE $table ALTER $field SET NOT NULL" );
+ } else {
+ $this->output( "... column '$table.$field' is already set as NULL\n" );
+ }
+ } else {
+ # # It's NOT NULL - does it need to be NULL?
+ if ( 'NULL' === $null ) {
+ $this->output( "Changing '$table.$field' to allow NULLs\n" );
+ $this->db->query( "ALTER TABLE $table ALTER $field DROP NOT NULL" );
+ }
+ else {
+ $this->output( "... column '$table.$field' is already set as NOT NULL\n" );
+ }
+ }
+ }
+
+ public function addPgIndex( $table, $index, $type ) {
+ if ( $this->db->indexExists( $table, $index ) ) {
+ $this->output( "... index '$index' on table '$table' already exists\n" );
+ } else {
+ $this->output( "Creating index '$index' on table '$table' $type\n" );
+ $this->db->query( "CREATE INDEX $index ON $table $type" );
+ }
+ }
+
+ public function addPgExtIndex( $table, $index, $type ) {
+ if ( $this->db->indexExists( $table, $index ) ) {
+ $this->output( "... index '$index' on table '$table' already exists\n" );
+ } else {
+ $this->output( "Creating index '$index' on table '$table'\n" );
+ if ( preg_match( '/^\(/', $type ) ) {
+ $this->db->query( "CREATE INDEX $index ON $table $type" );
+ } else {
+ $this->applyPatch( $type, true );
+ }
+ }
+ }
+
+ protected function changeFkeyDeferrable( $table, $field, $clause ) {
+ $fi = $this->db->fieldInfo( $table, $field );
+ if ( is_null( $fi ) ) {
+ $this->output( "WARNING! Column '$table.$field' does not exist but it should! Please report this.\n" );
+ return;
+ }
+ if ( $fi->is_deferred() && $fi->is_deferrable() ) {
+ return;
+ }
+ $this->output( "Altering column '$table.$field' to be DEFERRABLE INITIALLY DEFERRED\n" );
+ $conname = $fi->conname();
+ $command = "ALTER TABLE $table DROP CONSTRAINT $conname";
+ $this->db->query( $command );
+ $command = "ALTER TABLE $table ADD CONSTRAINT $conname FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
+ $this->db->query( $command );
+ }
+
+ protected function convertArchive2() {
+ if ( $this->db->tableExists( "archive2" ) ) {
+ $this->output( "Converting 'archive2' back to normal archive table\n" );
+ if ( $this->db->ruleExists( 'archive', 'archive_insert' ) ) {
+ $this->output( "Dropping rule 'archive_insert'\n" );
+ $this->db->query( 'DROP RULE archive_insert ON archive' );
+ }
+ if ( $this->db->ruleExists( 'archive', 'archive_delete' ) ) {
+ $this->output( "Dropping rule 'archive_delete'\n" );
+ $this->db->query( 'DROP RULE archive_delete ON archive' );
+ }
+ $this->applyPatch( 'patch-remove-archive2.sql' );
+ } else {
+ $this->output( "... obsolete table 'archive2' does not exist\n" );
+ }
+ }
+
+ protected function checkOiDeleted() {
+ if ( $this->db->fieldInfo( 'oldimage', 'oi_deleted' )->type() !== 'smallint' ) {
+ $this->output( "Changing 'oldimage.oi_deleted' to type 'smallint'\n" );
+ $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT" );
+ $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" );
+ $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0" );
+ } else {
+ $this->output( "... column 'oldimage.oi_deleted' is already of type 'smallint'\n" );
+ }
+ }
+
+ protected function checkOiNameConstraint() {
+ if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascaded" ) ) {
+ $this->output( "... table 'oldimage' has correct cascading delete/update foreign key to image\n" );
+ } else {
+ if ( $this->db->hasConstraint( "oldimage_oi_name_fkey" ) ) {
+ $this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" );
+ }
+ if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascade" ) ) {
+ $this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" );
+ }
+ $this->output( "Making foreign key on table 'oldimage' (to image) a cascade delete/update\n" );
+ $this->db->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " .
+ "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE" );
+ }
+ }
+
+ protected function checkPageDeletedTrigger() {
+ if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) {
+ $this->output( "Adding function and trigger 'page_deleted' to table 'page'\n" );
+ $this->applyPatch( 'patch-page_deleted.sql' );
+ } else {
+ $this->output( "... table 'page' has 'page_deleted' trigger\n" );
+ }
+ }
+
+ protected function checkRcCurIdNullable(){
+ $fi = $this->db->fieldInfo( 'recentchanges', 'rc_cur_id' );
+ if ( !$fi->isNullable() ) {
+ $this->output( "Removing NOT NULL constraint from 'recentchanges.rc_cur_id'\n" );
+ $this->applyPatch( 'patch-rc_cur_id-not-null.sql' );
+ } else {
+ $this->output( "... column 'recentchanges.rc_cur_id' has a NOT NULL constraint\n" );
+ }
+ }
+
+ protected function checkPagelinkUniqueIndex() {
+ $pu = $this->describeIndex( 'pagelink_unique' );
+ if ( !is_null( $pu ) && ( $pu[0] != 'pl_from' || $pu[1] != 'pl_namespace' || $pu[2] != 'pl_title' ) ) {
+ $this->output( "Dropping obsolete version of index 'pagelink_unique index'\n" );
+ $this->db->query( 'DROP INDEX pagelink_unique' );
+ $pu = null;
+ } else {
+ $this->output( "... obsolete version of index 'pagelink_unique index' does not exist\n" );
+ }
+
+ if ( is_null( $pu ) ) {
+ $this->output( "Creating index 'pagelink_unique index'\n" );
+ $this->db->query( 'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' );
+ } else {
+ $this->output( "... index 'pagelink_unique_index' already exists\n" );
+ }
+ }
+
+ protected function checkRevUserFkey() {
+ if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
+ $this->output( "... constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
+ } else {
+ $this->output( "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT\n" );
+ $this->applyPatch( 'patch-revision_rev_user_fkey.sql' );
+ }
+ }
+
+ protected function checkIpbAdress() {
+ if ( $this->db->indexExists( 'ipblocks', 'ipb_address' ) ) {
+ $this->output( "Removing deprecated index 'ipb_address'...\n" );
+ $this->db->query( 'DROP INDEX ipb_address' );
+ }
+ if ( $this->db->indexExists( 'ipblocks', 'ipb_address_unique' ) ) {
+ $this->output( "... have ipb_address_unique\n" );
+ } else {
+ $this->output( "Adding ipb_address_unique index\n" );
+ $this->applyPatch( 'patch-ipb_address_unique.sql' );
+ }
+ }
+
+ protected function checkIwlPrefix() {
+ if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
+ $this->output( "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'...\n" );
+ $this->applyPatch( 'patch-rename-iwl_prefix.sql' );
+ }
+ }
+
+ protected function tsearchFixes() {
+ # Tweak the page_title tsearch2 trigger to filter out slashes
+ # This is create or replace, so harmless to call if not needed
+ $this->applyPatch( 'patch-ts2pagetitle.sql' );
+
+ # If the server is 8.3 or higher, rewrite the tsearch2 triggers
+ # in case they have the old 'default' versions
+ # Gather version numbers in case we need them
+ if ( $this->db->getServerVersion() >= 8.3 ) {
+ $this->applyPatch( 'patch-tsearch2funcs.sql' );
+ }
+ }
+}
diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php
new file mode 100644
index 00000000..2edb3d9b
--- /dev/null
+++ b/includes/installer/SqliteInstaller.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * Sqlite-specific installer.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for setting up the MediaWiki database using SQLLite.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class SqliteInstaller extends DatabaseInstaller {
+
+ protected $globalNames = array(
+ 'wgDBname',
+ 'wgSQLiteDataDir',
+ );
+
+ public function getName() {
+ return 'sqlite';
+ }
+
+ public function isCompiled() {
+ return self::checkExtension( 'pdo_sqlite' );
+ }
+
+ public function getGlobalDefaults() {
+ if ( isset( $_SERVER['DOCUMENT_ROOT'] ) ) {
+ $path = str_replace(
+ array( '/', '\\' ),
+ DIRECTORY_SEPARATOR,
+ dirname( $_SERVER['DOCUMENT_ROOT'] ) . '/data'
+ );
+ return array( 'wgSQLiteDataDir' => $path );
+ } else {
+ return array();
+ }
+ }
+
+ public function getConnectForm() {
+ return $this->getTextBox( 'wgSQLiteDataDir', 'config-sqlite-dir', array(), $this->parent->getHelpBox( 'config-sqlite-dir-help' ) ) .
+ $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-sqlite-name-help' ) );
+ }
+
+ /*
+ * Safe wrapper for PHP's realpath() that fails gracefully if it's unable to canonicalize the path.
+ */
+ private static function realpath( $path ) {
+ $result = realpath( $path );
+ if ( !$result ) {
+ return $path;
+ }
+ return $result;
+ }
+
+ public function submitConnectForm() {
+ $this->setVarsFromRequest( array( 'wgSQLiteDataDir', 'wgDBname' ) );
+
+ # Try realpath() if the directory already exists
+ $dir = self::realpath( $this->getVar( 'wgSQLiteDataDir' ) );
+ $result = self::dataDirOKmaybeCreate( $dir, true /* create? */ );
+ if ( $result->isOK() )
+ {
+ # Try expanding again in case we've just created it
+ $dir = self::realpath( $dir );
+ $this->setVar( 'wgSQLiteDataDir', $dir );
+ }
+ return $result;
+ }
+
+ private static function dataDirOKmaybeCreate( $dir, $create = false ) {
+ if ( !is_dir( $dir ) ) {
+ if ( !is_writable( dirname( $dir ) ) ) {
+ $webserverGroup = Installer::maybeGetWebserverPrimaryGroup();
+ if ( $webserverGroup !== null ) {
+ return Status::newFatal( 'config-sqlite-parent-unwritable-group', $dir, dirname( $dir ), basename( $dir ), $webserverGroup );
+ } else {
+ return Status::newFatal( 'config-sqlite-parent-unwritable-nogroup', $dir, dirname( $dir ), basename( $dir ) );
+ }
+ }
+
+ # Called early on in the installer, later we just want to sanity check
+ # if it's still writable
+ if ( $create ) {
+ wfSuppressWarnings();
+ $ok = wfMkdirParents( $dir, 0700 );
+ wfRestoreWarnings();
+ if ( !$ok ) {
+ return Status::newFatal( 'config-sqlite-mkdir-error', $dir );
+ }
+ # Put a .htaccess file in in case the user didn't take our advice
+ file_put_contents( "$dir/.htaccess", "Deny from all\n" );
+ }
+ }
+ if ( !is_writable( $dir ) ) {
+ return Status::newFatal( 'config-sqlite-dir-unwritable', $dir );
+ }
+
+ # We haven't blown up yet, fall through
+ return Status::newGood();
+ }
+
+ public function openConnection() {
+ global $wgSQLiteDataDir;
+
+ $status = Status::newGood();
+ $dir = $this->getVar( 'wgSQLiteDataDir' );
+ $dbName = $this->getVar( 'wgDBname' );
+ try {
+ # FIXME: need more sensible constructor parameters, e.g. single associative array
+ # Setting globals kind of sucks
+ $wgSQLiteDataDir = $dir;
+ $db = new DatabaseSqlite( false, false, false, $dbName );
+ $status->value = $db;
+ } catch ( DBConnectionError $e ) {
+ $status->fatal( 'config-sqlite-connection-error', $e->getMessage() );
+ }
+ return $status;
+ }
+
+ public function needsUpgrade() {
+ $dir = $this->getVar( 'wgSQLiteDataDir' );
+ $dbName = $this->getVar( 'wgDBname' );
+ // Don't create the data file yet
+ if ( !file_exists( DatabaseSqlite::generateFileName( $dir, $dbName ) ) ) {
+ return false;
+ }
+
+ // If the data file exists, look inside it
+ return parent::needsUpgrade();
+ }
+
+ public function setupDatabase() {
+ $dir = $this->getVar( 'wgSQLiteDataDir' );
+
+ # Sanity check. We checked this before but maybe someone deleted the
+ # data dir between then and now
+ $dir_status = self::dataDirOKmaybeCreate( $dir, false /* create? */ );
+ if ( !$dir_status->isOK() ) {
+ return $dir_status;
+ }
+
+ $db = $this->getVar( 'wgDBname' );
+ $file = DatabaseSqlite::generateFileName( $dir, $db );
+ if ( file_exists( $file ) ) {
+ if ( !is_writable( $file ) ) {
+ return Status::newFatal( 'config-sqlite-readonly', $file );
+ }
+ } else {
+ if ( file_put_contents( $file, '' ) === false ) {
+ return Status::newFatal( 'config-sqlite-cant-create-db', $file );
+ }
+ }
+ // nuke the unused settings for clarity
+ $this->setVar( 'wgDBserver', '' );
+ $this->setVar( 'wgDBuser', '' );
+ $this->setVar( 'wgDBpassword', '' );
+ $this->setupSchemaVars();
+ return $this->getConnection();
+ }
+
+ public function createTables() {
+ $status = parent::createTables();
+ return $this->setupSearchIndex( $status );
+ }
+
+ public function setupSearchIndex( &$status ) {
+ global $IP;
+
+ $module = DatabaseSqlite::getFulltextSearchModule();
+ $fts3tTable = $this->db->checkForEnabledSearch();
+ if ( $fts3tTable && !$module ) {
+ $status->warning( 'config-sqlite-fts3-downgrade' );
+ $this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
+ } elseif ( !$fts3tTable && $module == 'FTS3' ) {
+ $this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );
+ }
+ return $status;
+ }
+
+ public function getLocalSettings() {
+ $dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
+ return
+"# SQLite-specific settings
+\$wgSQLiteDataDir = \"{$dir}\";";
+ }
+}
diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php
new file mode 100644
index 00000000..d1a6c20b
--- /dev/null
+++ b/includes/installer/SqliteUpdater.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Sqlite-specific updater.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for handling updates to Sqlite databases.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class SqliteUpdater extends DatabaseUpdater {
+
+ protected function getCoreUpdateList() {
+ return array(
+ // 1.14
+ array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
+ array( 'doActiveUsersInit' ),
+ array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
+ array( 'sqliteInitialIndexes' ),
+
+ // 1.15
+ array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+ array( 'addTable', 'tag_summary', 'patch-change_tag.sql' ),
+ array( 'addTable', 'valid_tag', 'patch-change_tag.sql' ),
+
+ // 1.16
+ array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+ array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+ array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
+ array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
+ array( 'doLogSearchPopulation' ),
+ array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+ array( 'addTable', 'external_user', 'patch-external_user.sql' ),
+ array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
+ array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
+ array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
+ array( 'doUpdateTranscacheField' ),
+ array( 'sqliteSetupSearchindex' ),
+
+ // 1.17
+ array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+ array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
+ array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
+ array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
+ array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
+ array( 'dropIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
+ array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
+ array( 'doCollationUpdate' ),
+ array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+ array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+ );
+ }
+
+ protected function sqliteInitialIndexes() {
+ // initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
+ if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name' ) ) {
+ $this->output( "...have initial indexes\n" );
+ return;
+ }
+ $this->output( "Adding initial indexes..." );
+ $this->applyPatch( 'initial-indexes.sql' );
+ $this->output( "done\n" );
+ }
+
+ protected function sqliteSetupSearchindex() {
+ $module = DatabaseSqlite::getFulltextSearchModule();
+ $fts3tTable = $this->updateRowExists( 'fts3' );
+ if ( $fts3tTable && !$module ) {
+ $this->output( '...PHP is missing FTS3 support, downgrading tables...' );
+ $this->applyPatch( 'searchindex-no-fts.sql' );
+ $this->output( "done\n" );
+ } elseif ( !$fts3tTable && $module == 'FTS3' ) {
+ $this->output( '...adding FTS3 search capabilities...' );
+ $this->applyPatch( 'searchindex-fts3.sql' );
+ $this->output( "done\n" );
+ } else {
+ $this->output( "...fulltext search table appears to be in order.\n" );
+ }
+ }
+}
diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php
new file mode 100644
index 00000000..b75db74e
--- /dev/null
+++ b/includes/installer/WebInstaller.php
@@ -0,0 +1,1034 @@
+<?php
+/**
+ * Core installer web interface.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for the core installer web interface.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class WebInstaller extends Installer {
+
+ /**
+ * @var WebInstallerOutput
+ */
+ public $output;
+
+ /**
+ * WebRequest object.
+ *
+ * @var WebRequest
+ */
+ public $request;
+
+ /**
+ * Cached session array.
+ *
+ * @var array
+ */
+ protected $session;
+
+ /**
+ * Captured PHP error text. Temporary.
+ * @var array
+ */
+ protected $phpErrors;
+
+ /**
+ * The main sequence of page names. These will be displayed in turn.
+ * To add one:
+ * * Add it here
+ * * Add a config-page-<name> message
+ * * Add a WebInstaller_<name> class
+ * @var array
+ */
+ public $pageSequence = array(
+ 'Language',
+ 'ExistingWiki',
+ 'Welcome',
+ 'DBConnect',
+ 'Upgrade',
+ 'DBSettings',
+ 'Name',
+ 'Options',
+ 'Install',
+ 'Complete',
+ );
+
+ /**
+ * Out of sequence pages, selectable by the user at any time.
+ * @var array
+ */
+ protected $otherPages = array(
+ 'Restart',
+ 'Readme',
+ 'ReleaseNotes',
+ 'Copying',
+ 'UpgradeDoc', // Can't use Upgrade due to Upgrade step
+ );
+
+ /**
+ * Array of pages which have declared that they have been submitted, have validated
+ * their input, and need no further processing.
+ * @var array
+ */
+ protected $happyPages;
+
+ /**
+ * List of "skipped" pages. These are pages that will automatically continue
+ * to the next page on any GET request. To avoid breaking the "back" button,
+ * they need to be skipped during a back operation.
+ * @var array
+ */
+ protected $skippedPages;
+
+ /**
+ * Flag indicating that session data may have been lost.
+ * @var bool
+ */
+ public $showSessionWarning = false;
+
+ /**
+ * Numeric index of the page we're on
+ * @var int
+ */
+ protected $tabIndex = 1;
+
+ /**
+ * Name of the page we're on
+ * @var string
+ */
+ protected $currentPageName;
+
+ /**
+ * Constructor.
+ *
+ * @param $request WebRequest
+ */
+ public function __construct( WebRequest $request ) {
+ parent::__construct();
+ $this->output = new WebInstallerOutput( $this );
+ $this->request = $request;
+
+ // Add parser hooks
+ global $wgParser;
+ $wgParser->setHook( 'downloadlink', array( $this, 'downloadLinkHook' ) );
+ $wgParser->setHook( 'doclink', array( $this, 'docLink' ) );
+ }
+
+ /**
+ * Main entry point.
+ *
+ * @param $session Array: initial session array
+ *
+ * @return Array: new session array
+ */
+ public function execute( array $session ) {
+ $this->session = $session;
+
+ if ( isset( $session['settings'] ) ) {
+ $this->settings = $session['settings'] + $this->settings;
+ }
+
+ $this->exportVars();
+ $this->setupLanguage();
+
+ if( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
+ && $this->request->getVal( 'localsettings' ) )
+ {
+ $this->request->response()->header( 'Content-type: application/x-httpd-php' );
+ $this->request->response()->header(
+ 'Content-Disposition: attachment; filename="LocalSettings.php"'
+ );
+
+ $ls = new LocalSettingsGenerator( $this );
+ $rightsProfile = $this->rightsProfiles[$this->getVar( '_RightsProfile' )];
+ foreach( $rightsProfile as $group => $rightsArr ) {
+ $ls->setGroupRights( $group, $rightsArr );
+ }
+ echo $ls->getText();
+ return $this->session;
+ }
+
+ $cssDir = $this->request->getVal( 'css' );
+ if( $cssDir ) {
+ $cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
+ $this->request->response()->header( 'Content-type: text/css' );
+ echo $this->output->getCSS( $cssDir );
+ return $this->session;
+ }
+
+ if ( isset( $session['happyPages'] ) ) {
+ $this->happyPages = $session['happyPages'];
+ } else {
+ $this->happyPages = array();
+ }
+
+ if ( isset( $session['skippedPages'] ) ) {
+ $this->skippedPages = $session['skippedPages'];
+ } else {
+ $this->skippedPages = array();
+ }
+
+ $lowestUnhappy = $this->getLowestUnhappy();
+
+ # Special case for Creative Commons partner chooser box.
+ if ( $this->request->getVal( 'SubmitCC' ) ) {
+ $page = $this->getPageByName( 'Options' );
+ $this->output->useShortHeader();
+ $this->output->allowFrames();
+ $page->submitCC();
+ return $this->finish();
+ }
+
+ if ( $this->request->getVal( 'ShowCC' ) ) {
+ $page = $this->getPageByName( 'Options' );
+ $this->output->useShortHeader();
+ $this->output->allowFrames();
+ $this->output->addHTML( $page->getCCDoneBox() );
+ return $this->finish();
+ }
+
+ # Get the page name.
+ $pageName = $this->request->getVal( 'page' );
+
+ if ( in_array( $pageName, $this->otherPages ) ) {
+ # Out of sequence
+ $pageId = false;
+ $page = $this->getPageByName( $pageName );
+ } else {
+ # Main sequence
+ if ( !$pageName || !in_array( $pageName, $this->pageSequence ) ) {
+ $pageId = $lowestUnhappy;
+ } else {
+ $pageId = array_search( $pageName, $this->pageSequence );
+ }
+
+ # If necessary, move back to the lowest-numbered unhappy page
+ if ( $pageId > $lowestUnhappy ) {
+ $pageId = $lowestUnhappy;
+ if ( $lowestUnhappy == 0 ) {
+ # Knocked back to start, possible loss of session data.
+ $this->showSessionWarning = true;
+ }
+ }
+
+ $pageName = $this->pageSequence[$pageId];
+ $page = $this->getPageByName( $pageName );
+ }
+
+ # If a back button was submitted, go back without submitting the form data.
+ if ( $this->request->wasPosted() && $this->request->getBool( 'submit-back' ) ) {
+ if ( $this->request->getVal( 'lastPage' ) ) {
+ $nextPage = $this->request->getVal( 'lastPage' );
+ } elseif ( $pageId !== false ) {
+ # Main sequence page
+ # Skip the skipped pages
+ $nextPageId = $pageId;
+
+ do {
+ $nextPageId--;
+ $nextPage = $this->pageSequence[$nextPageId];
+ } while( isset( $this->skippedPages[$nextPage] ) );
+ } else {
+ $nextPage = $this->pageSequence[$lowestUnhappy];
+ }
+
+ $this->output->redirect( $this->getUrl( array( 'page' => $nextPage ) ) );
+ return $this->finish();
+ }
+
+ # Execute the page.
+ $this->currentPageName = $page->getName();
+ $this->startPageWrapper( $pageName );
+
+ $result = $page->execute();
+
+ $this->endPageWrapper();
+
+ if ( $result == 'skip' ) {
+ # Page skipped without explicit submission.
+ # Skip it when we click "back" so that we don't just go forward again.
+ $this->skippedPages[$pageName] = true;
+ $result = 'continue';
+ } else {
+ unset( $this->skippedPages[$pageName] );
+ }
+
+ # If it was posted, the page can request a continue to the next page.
+ if ( $result === 'continue' && !$this->output->headerDone() ) {
+ if ( $pageId !== false ) {
+ $this->happyPages[$pageId] = true;
+ }
+
+ $lowestUnhappy = $this->getLowestUnhappy();
+
+ if ( $this->request->getVal( 'lastPage' ) ) {
+ $nextPage = $this->request->getVal( 'lastPage' );
+ } elseif ( $pageId !== false ) {
+ $nextPage = $this->pageSequence[$pageId + 1];
+ } else {
+ $nextPage = $this->pageSequence[$lowestUnhappy];
+ }
+
+ if ( array_search( $nextPage, $this->pageSequence ) > $lowestUnhappy ) {
+ $nextPage = $this->pageSequence[$lowestUnhappy];
+ }
+
+ $this->output->redirect( $this->getUrl( array( 'page' => $nextPage ) ) );
+ }
+
+ return $this->finish();
+ }
+
+ /**
+ * Find the next page in sequence that hasn't been completed
+ * @return int
+ */
+ public function getLowestUnhappy() {
+ if ( count( $this->happyPages ) == 0 ) {
+ return 0;
+ } else {
+ return max( array_keys( $this->happyPages ) ) + 1;
+ }
+ }
+
+ /**
+ * Start the PHP session. This may be called before execute() to start the PHP session.
+ */
+ public function startSession() {
+ if( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
+ // Done already
+ return true;
+ }
+
+ $this->phpErrors = array();
+ set_error_handler( array( $this, 'errorHandler' ) );
+ session_start();
+ restore_error_handler();
+
+ if ( $this->phpErrors ) {
+ $this->showError( 'config-session-error', $this->phpErrors[0] );
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Get a hash of data identifying this MW installation.
+ *
+ * This is used by mw-config/index.php to prevent multiple installations of MW
+ * on the same cookie domain from interfering with each other.
+ */
+ public function getFingerprint() {
+ // Get the base URL of the installation
+ $url = $this->request->getFullRequestURL();
+ if ( preg_match( '!^(.*\?)!', $url, $m) ) {
+ // Trim query string
+ $url = $m[1];
+ }
+ if ( preg_match( '!^(.*)/[^/]*/[^/]*$!', $url, $m ) ) {
+ // This... seems to try to get the base path from
+ // the /mw-config/index.php. Kinda scary though?
+ $url = $m[1];
+ }
+ return md5( serialize( array(
+ 'local path' => dirname( dirname( __FILE__ ) ),
+ 'url' => $url,
+ 'version' => $GLOBALS['wgVersion']
+ ) ) );
+ }
+
+ /**
+ * Show an error message in a box. Parameters are like wfMsg().
+ */
+ public function showError( $msg /*...*/ ) {
+ $args = func_get_args();
+ array_shift( $args );
+ $args = array_map( 'htmlspecialchars', $args );
+ $msg = wfMsgReal( $msg, $args, false, false, false );
+ $this->output->addHTML( $this->getErrorBox( $msg ) );
+ }
+
+ /**
+ * Temporary error handler for session start debugging.
+ */
+ public function errorHandler( $errno, $errstr ) {
+ $this->phpErrors[] = $errstr;
+ }
+
+ /**
+ * Clean up from execute()
+ *
+ * @return array
+ */
+ public function finish() {
+ $this->output->output();
+
+ $this->session['happyPages'] = $this->happyPages;
+ $this->session['skippedPages'] = $this->skippedPages;
+ $this->session['settings'] = $this->settings;
+
+ return $this->session;
+ }
+
+ /**
+ * We're restarting the installation, reset the session, happyPages, etc
+ */
+ public function reset() {
+ $this->session = array();
+ $this->happyPages = array();
+ $this->settings = array();
+ }
+
+ /**
+ * Get a URL for submission back to the same script.
+ *
+ * @param $query: Array
+ * @return string
+ */
+ public function getUrl( $query = array() ) {
+ $url = $this->request->getRequestURL();
+ # Remove existing query
+ $url = preg_replace( '/\?.*$/', '', $url );
+
+ if ( $query ) {
+ $url .= '?' . wfArrayToCGI( $query );
+ }
+
+ return $url;
+ }
+
+ /**
+ * Get a WebInstallerPage by name.
+ *
+ * @param $pageName String
+ * @return WebInstallerPage
+ */
+ public function getPageByName( $pageName ) {
+ // Totally lame way to force autoload of WebInstallerPage.php
+ class_exists( 'WebInstallerPage' );
+
+ $pageClass = 'WebInstaller_' . $pageName;
+
+ return new $pageClass( $this );
+ }
+
+ /**
+ * Get a session variable.
+ *
+ * @param $name String
+ * @param $default
+ */
+ public function getSession( $name, $default = null ) {
+ if ( !isset( $this->session[$name] ) ) {
+ return $default;
+ } else {
+ return $this->session[$name];
+ }
+ }
+
+ /**
+ * Set a session variable.
+ * @param $name String key for the variable
+ * @param $value Mixed
+ */
+ public function setSession( $name, $value ) {
+ $this->session[$name] = $value;
+ }
+
+ /**
+ * Get the next tabindex attribute value.
+ * @return int
+ */
+ public function nextTabIndex() {
+ return $this->tabIndex++;
+ }
+
+ /**
+ * Initializes language-related variables.
+ */
+ public function setupLanguage() {
+ global $wgLang, $wgContLang, $wgLanguageCode;
+
+ if ( $this->getSession( 'test' ) === null && !$this->request->wasPosted() ) {
+ $wgLanguageCode = $this->getAcceptLanguage();
+ $wgLang = $wgContLang = Language::factory( $wgLanguageCode );
+ $this->setVar( 'wgLanguageCode', $wgLanguageCode );
+ $this->setVar( '_UserLang', $wgLanguageCode );
+ } else {
+ $wgLanguageCode = $this->getVar( 'wgLanguageCode' );
+ $wgLang = Language::factory( $this->getVar( '_UserLang' ) );
+ $wgContLang = Language::factory( $wgLanguageCode );
+ }
+ }
+
+ /**
+ * Retrieves MediaWiki language from Accept-Language HTTP header.
+ *
+ * @return string
+ */
+ public function getAcceptLanguage() {
+ global $wgLanguageCode, $wgRequest;
+
+ $mwLanguages = Language::getLanguageNames();
+ $headerLanguages = array_keys( $wgRequest->getAcceptLang() );
+
+ foreach ( $headerLanguages as $lang ) {
+ if ( isset( $mwLanguages[$lang] ) ) {
+ return $lang;
+ }
+ }
+
+ return $wgLanguageCode;
+ }
+
+ /**
+ * Called by execute() before page output starts, to show a page list.
+ *
+ * @param $currentPageName String
+ */
+ private function startPageWrapper( $currentPageName ) {
+ $s = "<div class=\"config-page-wrapper\">\n";
+ $s .= "<div class=\"config-page\">\n";
+ $s .= "<div class=\"config-page-list\"><ul>\n";
+ $lastHappy = -1;
+
+ foreach ( $this->pageSequence as $id => $pageName ) {
+ $happy = !empty( $this->happyPages[$id] );
+ $s .= $this->getPageListItem(
+ $pageName,
+ $happy || $lastHappy == $id - 1,
+ $currentPageName
+ );
+
+ if ( $happy ) {
+ $lastHappy = $id;
+ }
+ }
+
+ $s .= "</ul><br/><ul>\n";
+ $s .= $this->getPageListItem( 'Restart', true, $currentPageName );
+ $s .= "</ul></div>\n"; // end list pane
+ $s .= Html::element( 'h2', array(),
+ wfMsg( 'config-page-' . strtolower( $currentPageName ) ) );
+
+ $this->output->addHTMLNoFlush( $s );
+ }
+
+ /**
+ * Get a list item for the page list.
+ *
+ * @param $pageName String
+ * @param $enabled Boolean
+ * @param $currentPageName String
+ *
+ * @return string
+ */
+ private function getPageListItem( $pageName, $enabled, $currentPageName ) {
+ $s = "<li class=\"config-page-list-item\">";
+ $name = wfMsg( 'config-page-' . strtolower( $pageName ) );
+
+ if ( $enabled ) {
+ $query = array( 'page' => $pageName );
+
+ if ( !in_array( $pageName, $this->pageSequence ) ) {
+ if ( in_array( $currentPageName, $this->pageSequence ) ) {
+ $query['lastPage'] = $currentPageName;
+ }
+
+ $link = Html::element( 'a',
+ array(
+ 'href' => $this->getUrl( $query )
+ ),
+ $name
+ );
+ } else {
+ $link = htmlspecialchars( $name );
+ }
+
+ if ( $pageName == $currentPageName ) {
+ $s .= "<span class=\"config-page-current\">$link</span>";
+ } else {
+ $s .= $link;
+ }
+ } else {
+ $s .= Html::element( 'span',
+ array(
+ 'class' => 'config-page-disabled'
+ ),
+ $name
+ );
+ }
+
+ $s .= "</li>\n";
+
+ return $s;
+ }
+
+ /**
+ * Output some stuff after a page is finished.
+ */
+ private function endPageWrapper() {
+ $this->output->addHTMLNoFlush(
+ "<div class=\"visualClear\"></div>\n" .
+ "</div>\n" .
+ "<div class=\"visualClear\"></div>\n" .
+ "</div>" );
+ }
+
+ /**
+ * Get HTML for an error box with an icon.
+ *
+ * @param $text String: wikitext, get this with wfMsgNoTrans()
+ */
+ public function getErrorBox( $text ) {
+ return $this->getInfoBox( $text, 'critical-32.png', 'config-error-box' );
+ }
+
+ /**
+ * Get HTML for a warning box with an icon.
+ *
+ * @param $text String: wikitext, get this with wfMsgNoTrans()
+ */
+ public function getWarningBox( $text ) {
+ return $this->getInfoBox( $text, 'warning-32.png', 'config-warning-box' );
+ }
+
+ /**
+ * Get HTML for an info box with an icon.
+ *
+ * @param $text String: wikitext, get this with wfMsgNoTrans()
+ * @param $icon String: icon name, file in skins/common/images
+ * @param $class String: additional class name to add to the wrapper div
+ */
+ public function getInfoBox( $text, $icon = 'info-32.png', $class = false ) {
+ $s =
+ "<div class=\"config-info $class\">\n" .
+ "<div class=\"config-info-left\">\n" .
+ Html::element( 'img',
+ array(
+ 'src' => '../skins/common/images/' . $icon,
+ 'alt' => wfMsg( 'config-information' ),
+ )
+ ) . "\n" .
+ "</div>\n" .
+ "<div class=\"config-info-right\">\n" .
+ $this->parse( $text, true ) . "\n" .
+ "</div>\n" .
+ "<div style=\"clear: left;\"></div>\n" .
+ "</div>\n";
+ return $s;
+ }
+
+ /**
+ * Get small text indented help for a preceding form field.
+ * Parameters like wfMsg().
+ */
+ public function getHelpBox( $msg /*, ... */ ) {
+ $args = func_get_args();
+ array_shift( $args );
+ $args = array_map( 'htmlspecialchars', $args );
+ $text = wfMsgReal( $msg, $args, false, false, false );
+ $html = htmlspecialchars( $text );
+ $html = $this->parse( $text, true );
+
+ return "<div class=\"mw-help-field-container\">\n" .
+ "<span class=\"mw-help-field-hint\">" . wfMsgHtml( 'config-help' ) . "</span>\n" .
+ "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
+ "</div>\n";
+ }
+
+ /**
+ * Output a help box.
+ * @param $msg String key for wfMsg()
+ */
+ public function showHelpBox( $msg /*, ... */ ) {
+ $args = func_get_args();
+ $html = call_user_func_array( array( $this, 'getHelpBox' ), $args );
+ $this->output->addHTML( $html );
+ }
+
+ /**
+ * Show a short informational message.
+ * Output looks like a list.
+ *
+ * @param $msg string
+ */
+ public function showMessage( $msg /*, ... */ ) {
+ $args = func_get_args();
+ array_shift( $args );
+ $html = '<div class="config-message">' .
+ $this->parse( wfMsgReal( $msg, $args, false, false, false ) ) .
+ "</div>\n";
+ $this->output->addHTML( $html );
+ }
+
+ /**
+ * @param $status Status
+ */
+ public function showStatusMessage( Status $status ) {
+ $text = $status->getWikiText();
+ $this->output->addWikiText(
+ "<div class=\"config-message\">\n" .
+ $text .
+ "</div>"
+ );
+ }
+
+ /**
+ * Label a control by wrapping a config-input div around it and putting a
+ * label before it.
+ */
+ public function label( $msg, $forId, $contents, $helpData = "" ) {
+ if ( strval( $msg ) == '' ) {
+ $labelText = '&#160;';
+ } else {
+ $labelText = wfMsgHtml( $msg );
+ }
+
+ $attributes = array( 'class' => 'config-label' );
+
+ if ( $forId ) {
+ $attributes['for'] = $forId;
+ }
+
+ return
+ "<div class=\"config-block\">\n" .
+ " <div class=\"config-block-label\">\n" .
+ Xml::tags( 'label',
+ $attributes,
+ $labelText ) . "\n" .
+ $helpData .
+ " </div>\n" .
+ " <div class=\"config-block-elements\">\n" .
+ $contents .
+ " </div>\n" .
+ "</div>\n";
+ }
+
+ /**
+ * Get a labelled text box to configure a variable.
+ *
+ * @param $params Array
+ * Parameters are:
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
+ * controlName: The name for the input element (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
+ */
+ public function getTextBox( $params ) {
+ if ( !isset( $params['controlName'] ) ) {
+ $params['controlName'] = 'config_' . $params['var'];
+ }
+
+ if ( !isset( $params['value'] ) ) {
+ $params['value'] = $this->getVar( $params['var'] );
+ }
+
+ if ( !isset( $params['attribs'] ) ) {
+ $params['attribs'] = array();
+ }
+ if ( !isset( $params['help'] ) ) {
+ $params['help'] = "";
+ }
+ return
+ $this->label(
+ $params['label'],
+ $params['controlName'],
+ Xml::input(
+ $params['controlName'],
+ 30, // intended to be overridden by CSS
+ $params['value'],
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'class' => 'config-input-text',
+ 'tabindex' => $this->nextTabIndex()
+ )
+ ),
+ $params['help']
+ );
+ }
+
+ /**
+ * Get a labelled textarea to configure a variable
+ *
+ * @param $params Array
+ * Parameters are:
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
+ * controlName: The name for the input element (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
+ */
+ public function getTextArea( $params ) {
+ if ( !isset( $params['controlName'] ) ) {
+ $params['controlName'] = 'config_' . $params['var'];
+ }
+
+ if ( !isset( $params['value'] ) ) {
+ $params['value'] = $this->getVar( $params['var'] );
+ }
+
+ if ( !isset( $params['attribs'] ) ) {
+ $params['attribs'] = array();
+ }
+ if ( !isset( $params['help'] ) ) {
+ $params['help'] = "";
+ }
+ return
+ $this->label(
+ $params['label'],
+ $params['controlName'],
+ Xml::textarea(
+ $params['controlName'],
+ $params['value'],
+ 30,
+ 5,
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'class' => 'config-input-text',
+ 'tabindex' => $this->nextTabIndex()
+ )
+ ),
+ $params['help']
+ );
+ }
+
+ /**
+ * Get a labelled password box to configure a variable.
+ *
+ * Implements password hiding
+ * @param $params Array
+ * Parameters are:
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
+ * controlName: The name for the input element (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
+ */
+ public function getPasswordBox( $params ) {
+ if ( !isset( $params['value'] ) ) {
+ $params['value'] = $this->getVar( $params['var'] );
+ }
+
+ if ( !isset( $params['attribs'] ) ) {
+ $params['attribs'] = array();
+ }
+
+ $params['value'] = $this->getFakePassword( $params['value'] );
+ $params['attribs']['type'] = 'password';
+
+ return $this->getTextBox( $params );
+ }
+
+ /**
+ * Get a labelled checkbox to configure a boolean variable.
+ *
+ * @param $params Array
+ * Parameters are:
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
+ * controlName: The name for the input element (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
+ */
+ public function getCheckBox( $params ) {
+ if ( !isset( $params['controlName'] ) ) {
+ $params['controlName'] = 'config_' . $params['var'];
+ }
+
+ if ( !isset( $params['value'] ) ) {
+ $params['value'] = $this->getVar( $params['var'] );
+ }
+
+ if ( !isset( $params['attribs'] ) ) {
+ $params['attribs'] = array();
+ }
+ if ( !isset( $params['help'] ) ) {
+ $params['help'] = "";
+ }
+ if( isset( $params['rawtext'] ) ) {
+ $labelText = $params['rawtext'];
+ } else {
+ $labelText = $this->parse( wfMsg( $params['label'] ) );
+ }
+
+ return
+ "<div class=\"config-input-check\">\n" .
+ $params['help'] .
+ "<label>\n" .
+ Xml::check(
+ $params['controlName'],
+ $params['value'],
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'tabindex' => $this->nextTabIndex(),
+ )
+ ) .
+ $labelText . "\n" .
+ "</label>\n" .
+ "</div>\n";
+ }
+
+ /**
+ * Get a set of labelled radio buttons.
+ *
+ * @param $params Array
+ * Parameters are:
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * itemLabelPrefix: The message name prefix for the item labels (required)
+ * values: List of allowed values (required)
+ * itemAttribs Array of attribute arrays, outer key is the value name (optional)
+ * commonAttribs Attribute array applied to all items
+ * controlName: The name for the input element (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
+ */
+ public function getRadioSet( $params ) {
+ if ( !isset( $params['controlName'] ) ) {
+ $params['controlName'] = 'config_' . $params['var'];
+ }
+
+ if ( !isset( $params['value'] ) ) {
+ $params['value'] = $this->getVar( $params['var'] );
+ }
+
+ if ( !isset( $params['label'] ) ) {
+ $label = '';
+ } else {
+ $label = $params['label'];
+ }
+ if ( !isset( $params['help'] ) ) {
+ $params['help'] = "";
+ }
+ $s = "<ul>\n";
+ foreach ( $params['values'] as $value ) {
+ $itemAttribs = array();
+
+ if ( isset( $params['commonAttribs'] ) ) {
+ $itemAttribs = $params['commonAttribs'];
+ }
+
+ if ( isset( $params['itemAttribs'][$value] ) ) {
+ $itemAttribs = $params['itemAttribs'][$value] + $itemAttribs;
+ }
+
+ $checked = $value == $params['value'];
+ $id = $params['controlName'] . '_' . $value;
+ $itemAttribs['id'] = $id;
+ $itemAttribs['tabindex'] = $this->nextTabIndex();
+
+ $s .=
+ '<li>' .
+ Xml::radio( $params['controlName'], $value, $checked, $itemAttribs ) .
+ '&#160;' .
+ Xml::tags( 'label', array( 'for' => $id ), $this->parse(
+ wfMsgNoTrans( $params['itemLabelPrefix'] . strtolower( $value ) )
+ ) ) .
+ "</li>\n";
+ }
+
+ $s .= "</ul>\n";
+
+ return $this->label( $label, $params['controlName'], $s, $params['help'] );
+ }
+
+ /**
+ * Output an error or warning box using a Status object.
+ */
+ public function showStatusBox( $status ) {
+ if( !$status->isGood() ) {
+ $text = $status->getWikiText();
+
+ if( $status->isOk() ) {
+ $box = $this->getWarningBox( $text );
+ } else {
+ $box = $this->getErrorBox( $text );
+ }
+
+ $this->output->addHTML( $box );
+ }
+ }
+
+ /**
+ * Convenience function to set variables based on form data.
+ * Assumes that variables containing "password" in the name are (potentially
+ * fake) passwords.
+ *
+ * @param $varNames Array
+ * @param $prefix String: the prefix added to variables to obtain form names
+ */
+ public function setVarsFromRequest( $varNames, $prefix = 'config_' ) {
+ $newValues = array();
+
+ foreach ( $varNames as $name ) {
+ $value = trim( $this->request->getVal( $prefix . $name ) );
+ $newValues[$name] = $value;
+
+ if ( $value === null ) {
+ // Checkbox?
+ $this->setVar( $name, false );
+ } else {
+ if ( stripos( $name, 'password' ) !== false ) {
+ $this->setPassword( $name, $value );
+ } else {
+ $this->setVar( $name, $value );
+ }
+ }
+ }
+
+ return $newValues;
+ }
+
+ /**
+ * Helper for Installer::docLink()
+ */
+ protected function getDocUrl( $page ) {
+ $url = "{$_SERVER['PHP_SELF']}?page=" . urlencode( $page );
+
+ if ( in_array( $this->currentPageName, $this->pageSequence ) ) {
+ $url .= '&lastPage=' . urlencode( $this->currentPageName );
+ }
+
+ return $url;
+ }
+
+ /**
+ * Extension tag hook for a documentation link.
+ */
+ public function docLink( $linkText, $attribs, $parser ) {
+ $url = $this->getDocUrl( $attribs['href'] );
+ return '<a href="' . htmlspecialchars( $url ) . '">' .
+ htmlspecialchars( $linkText ) .
+ '</a>';
+ }
+
+ /**
+ * Helper for "Download LocalSettings" link on WebInstall_Complete
+ * @return String Html for download link
+ */
+ public function downloadLinkHook( $text, $attribs, $parser ) {
+ $img = Html::element( 'img', array(
+ 'src' => '../skins/common/images/download-32.png',
+ 'width' => '32',
+ 'height' => '32',
+ ) );
+ $anchor = Html::rawElement( 'a',
+ array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
+ $img . ' ' . wfMsgHtml( 'config-download-localsettings' ) );
+ return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
+ }
+}
diff --git a/includes/installer/WebInstallerOutput.php b/includes/installer/WebInstallerOutput.php
new file mode 100644
index 00000000..cb708d13
--- /dev/null
+++ b/includes/installer/WebInstallerOutput.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * Output handler for the web installer.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Output class modelled on OutputPage.
+ *
+ * I've opted to use a distinct class rather than derive from OutputPage here in
+ * the interests of separation of concerns: if we used a subclass, there would be
+ * quite a lot of things you could do in OutputPage that would break the installer,
+ * that wouldn't be immediately obvious.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+class WebInstallerOutput {
+ /**
+ * The WebInstaller object this WebInstallerOutput is used by.
+ *
+ * @var WebInstaller
+ */
+ public $parent;
+
+ /**
+ * Buffered contents that haven't been output yet
+ * @var String
+ */
+ private $contents = '';
+
+ /**
+ * Has the header (or short header) been output?
+ * @var bool
+ */
+ private $headerDone = false;
+
+ public $redirectTarget;
+
+ /**
+ * Does the current page need to allow being used as a frame?
+ * If not, X-Frame-Options will be output to forbid it.
+ *
+ * @var bool
+ */
+ public $allowFrames = false;
+
+ /**
+ * Whether to use the limited header (used during CC license callbacks)
+ * @var bool
+ */
+ private $useShortHeader = false;
+
+ /**
+ * Constructor.
+ *
+ * @param $parent WebInstaller
+ */
+ public function __construct( WebInstaller $parent ) {
+ $this->parent = $parent;
+ }
+
+ public function addHTML( $html ) {
+ $this->contents .= $html;
+ $this->flush();
+ }
+
+ public function addWikiText( $text ) {
+ $this->addHTML( $this->parent->parse( $text ) );
+ }
+
+ public function addHTMLNoFlush( $html ) {
+ $this->contents .= $html;
+ }
+
+ public function redirect( $url ) {
+ if ( $this->headerDone ) {
+ throw new MWException( __METHOD__ . ' called after sending headers' );
+ }
+ $this->redirectTarget = $url;
+ }
+
+ public function output() {
+ $this->flush();
+ $this->outputFooter();
+ }
+
+ /**
+ * Get the raw vector CSS, flipping if needed
+ * @param $dir String 'ltr' or 'rtl'
+ * @return String
+ */
+ public function getCSS( $dir ) {
+ $skinDir = dirname( dirname( dirname( __FILE__ ) ) ) . '/skins';
+ $vectorCssFile = "$skinDir/vector/screen.css";
+ $configCssFile = "$skinDir/common/config.css";
+ $css = '';
+ wfSuppressWarnings();
+ $vectorCss = file_get_contents( $vectorCssFile );
+ $configCss = file_get_contents( $configCssFile );
+ wfRestoreWarnings();
+ if( !$vectorCss || !$configCss ) {
+ $css = "/** Your webserver cannot read $vectorCssFile or $configCssFile, please check file permissions */";
+ }
+
+ $css .= str_replace( 'images/', '../skins/vector/images/', $vectorCss ) . "\n" . str_replace( 'images/', '../skins/common/images/', $configCss );
+ if( $dir == 'rtl' ) {
+ $css = CSSJanus::transform( $css, true );
+ }
+ return $css;
+ }
+
+ /**
+ * URL for index.php?css=foobar
+ * @return String
+ */
+ private function getCssUrl( ) {
+ return $_SERVER['PHP_SELF'] . '?css=' . $this->getDir();
+ }
+
+ public function useShortHeader( $use = true ) {
+ $this->useShortHeader = $use;
+ }
+
+ public function allowFrames( $allow = true ) {
+ $this->allowFrames = $allow;
+ }
+
+ public function flush() {
+ if ( !$this->headerDone ) {
+ $this->outputHeader();
+ }
+ if ( !$this->redirectTarget && strlen( $this->contents ) ) {
+ echo $this->contents;
+ flush();
+ $this->contents = '';
+ }
+ }
+
+ public function getDir() {
+ global $wgLang;
+ if( !is_object( $wgLang ) || !$wgLang->isRtl() )
+ return 'ltr';
+ else
+ return 'rtl';
+ }
+
+ public function getLanguageCode() {
+ global $wgLang;
+ if( !is_object( $wgLang ) )
+ return 'en';
+ else
+ return $wgLang->getCode();
+ }
+
+ public function getHeadAttribs() {
+ return array(
+ 'dir' => $this->getDir(),
+ 'lang' => $this->getLanguageCode(),
+ );
+ }
+
+ /**
+ * Get whether the header has been output
+ * @return bool
+ */
+ public function headerDone() {
+ return $this->headerDone;
+ }
+
+ public function outputHeader() {
+ $this->headerDone = true;
+ $dbTypes = $this->parent->getDBTypes();
+
+ $this->parent->request->response()->header( 'Content-Type: text/html; charset=utf-8' );
+ if (!$this->allowFrames) {
+ $this->parent->request->response()->header( 'X-Frame-Options: DENY' );
+ }
+ if ( $this->redirectTarget ) {
+ $this->parent->request->response()->header( 'Location: '.$this->redirectTarget );
+ return;
+ }
+
+ if ( $this->useShortHeader ) {
+ $this->outputShortHeader();
+ return;
+ }
+
+?>
+<?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
+<head>
+ <meta name="robots" content="noindex, nofollow" />
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+ <title><?php $this->outputTitle(); ?></title>
+ <?php echo Html::linkedStyle( '../skins/common/shared.css' ) . "\n"; ?>
+ <?php echo Html::linkedStyle( $this->getCssUrl() ) . "\n"; ?>
+ <?php echo Html::inlineScript( "var dbTypes = " . Xml::encodeJsVar( $dbTypes ) ) . "\n"; ?>
+ <?php echo $this->getJQuery() . "\n"; ?>
+ <?php echo Html::linkedScript( '../skins/common/config.js' ) . "\n"; ?>
+</head>
+
+<?php echo Html::openElement( 'body', array( 'class' => $this->getDir() ) ) . "\n"; ?>
+<div id="mw-page-base"></div>
+<div id="mw-head-base"></div>
+<div id="content">
+<div id="bodyContent">
+
+<h1><?php $this->outputTitle(); ?></h1>
+<?php
+ }
+
+ public function outputFooter() {
+ if ( $this->useShortHeader ) {
+?>
+</body></html>
+<?php
+ return;
+ }
+?>
+
+</div></div>
+
+
+<div id="mw-panel">
+ <div class="portal" id="p-logo">
+ <a style="background-image: url(../skins/common/images/mediawiki.png);"
+ href="http://www.mediawiki.org/"
+ title="Main Page"></a>
+ </div>
+ <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
+ <div class="portal"><div class="body">
+<?php
+ echo $this->parent->parse( wfMsgNoTrans( 'config-sidebar' ), true );
+?>
+ </div></div>
+</div>
+
+</body>
+</html>
+<?php
+ }
+
+ public function outputShortHeader() {
+?>
+<?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
+<head>
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+ <meta name="robots" content="noindex, nofollow" />
+ <title><?php $this->outputTitle(); ?></title>
+ <?php echo Html::linkedStyle( $this->getCssUrl() ) . "\n"; ?>
+ <?php echo $this->getJQuery(); ?>
+ <?php echo Html::linkedScript( '../skins/common/config.js' ); ?>
+</head>
+
+<body style="background-image: none">
+<?php
+ }
+
+ public function outputTitle() {
+ global $wgVersion;
+ echo htmlspecialchars( wfMsg( 'config-title', $wgVersion ) );
+ }
+
+ public function getJQuery() {
+ return Html::linkedScript( "../resources/jquery/jquery.js" );
+ }
+}
diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php
new file mode 100644
index 00000000..5c30182b
--- /dev/null
+++ b/includes/installer/WebInstallerPage.php
@@ -0,0 +1,1238 @@
+<?php
+/**
+ * Base code for web installer pages.
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Abstract class to define pages for the web installer.
+ *
+ * @ingroup Deployment
+ * @since 1.17
+ */
+abstract class WebInstallerPage {
+
+ /**
+ * The WebInstaller object this WebInstallerPage belongs to.
+ *
+ * @var WebInstaller
+ */
+ public $parent;
+
+ public abstract function execute();
+
+ /**
+ * Constructor.
+ *
+ * @param $parent WebInstaller
+ */
+ public function __construct( WebInstaller $parent ) {
+ $this->parent = $parent;
+ }
+
+ public function addHTML( $html ) {
+ $this->parent->output->addHTML( $html );
+ }
+
+ public function startForm() {
+ $this->addHTML(
+ "<div class=\"config-section\">\n" .
+ Html::openElement(
+ 'form',
+ array(
+ 'method' => 'post',
+ 'action' => $this->parent->getUrl( array( 'page' => $this->getName() ) )
+ )
+ ) . "\n"
+ );
+ }
+
+ public function endForm( $continue = 'continue', $back = 'back' ) {
+ $s = "<div class=\"config-submit\">\n";
+ $id = $this->getId();
+
+ if ( $id === false ) {
+ $s .= Html::hidden( 'lastPage', $this->parent->request->getVal( 'lastPage' ) );
+ }
+
+ if ( $continue ) {
+ // Fake submit button for enter keypress (bug 26267)
+ $s .= Xml::submitButton( wfMsg( "config-$continue" ),
+ array( 'name' => "enter-$continue", 'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
+ }
+
+ if ( $back ) {
+ $s .= Xml::submitButton( wfMsg( "config-$back" ),
+ array(
+ 'name' => "submit-$back",
+ 'tabindex' => $this->parent->nextTabIndex()
+ ) ) . "\n";
+ }
+
+ if ( $continue ) {
+ $s .= Xml::submitButton( wfMsg( "config-$continue" ),
+ array(
+ 'name' => "submit-$continue",
+ 'tabindex' => $this->parent->nextTabIndex(),
+ ) ) . "\n";
+ }
+
+ $s .= "</div></form></div>\n";
+ $this->addHTML( $s );
+ }
+
+ public function getName() {
+ return str_replace( 'WebInstaller_', '', get_class( $this ) );
+ }
+
+ protected function getId() {
+ return array_search( $this->getName(), $this->parent->pageSequence );
+ }
+
+ public function getVar( $var ) {
+ return $this->parent->getVar( $var );
+ }
+
+ public function setVar( $name, $value ) {
+ $this->parent->setVar( $name, $value );
+ }
+
+ /**
+ * Get the starting tags of a fieldset.
+ *
+ * @param $legend String: message name
+ */
+ protected function getFieldsetStart( $legend ) {
+ return "\n<fieldset><legend>" . wfMsgHtml( $legend ) . "</legend>\n";
+ }
+
+ /**
+ * Get the end tag of a fieldset.
+ */
+ protected function getFieldsetEnd() {
+ return "</fieldset>\n";
+ }
+
+ /**
+ * Opens a textarea used to display the progress of a long operation
+ */
+ protected function startLiveBox() {
+ $this->addHTML(
+ '<div id="config-spinner" style="display:none;"><img src="../skins/common/images/ajax-loader.gif" /></div>' .
+ '<script>jQuery( "#config-spinner" ).show();</script>' .
+ '<textarea id="config-live-log" name="LiveLog" rows="10" cols="30" readonly="readonly">'
+ );
+ $this->parent->output->flush();
+ }
+
+ /**
+ * Opposite to startLiveBox()
+ */
+ protected function endLiveBox() {
+ $this->addHTML( '</textarea>
+<script>jQuery( "#config-spinner" ).hide()</script>' );
+ $this->parent->output->flush();
+ }
+}
+
+class WebInstaller_Language extends WebInstallerPage {
+
+ public function execute() {
+ global $wgLang;
+ $r = $this->parent->request;
+ $userLang = $r->getVal( 'UserLang' );
+ $contLang = $r->getVal( 'ContLang' );
+
+ $lifetime = intval( ini_get( 'session.gc_maxlifetime' ) );
+ if ( !$lifetime ) {
+ $lifetime = 1440; // PHP default
+ }
+
+ if ( $r->wasPosted() ) {
+ # Do session test
+ if ( $this->parent->getSession( 'test' ) === null ) {
+ $requestTime = $r->getVal( 'LanguageRequestTime' );
+ if ( !$requestTime ) {
+ // The most likely explanation is that the user was knocked back
+ // from another page on POST due to session expiry
+ $msg = 'config-session-expired';
+ } elseif ( time() - $requestTime > $lifetime ) {
+ $msg = 'config-session-expired';
+ } else {
+ $msg = 'config-no-session';
+ }
+ $this->parent->showError( $msg, $wgLang->formatTimePeriod( $lifetime ) );
+ } else {
+ $languages = Language::getLanguageNames();
+ if ( isset( $languages[$userLang] ) ) {
+ $this->setVar( '_UserLang', $userLang );
+ }
+ if ( isset( $languages[$contLang] ) ) {
+ $this->setVar( 'wgLanguageCode', $contLang );
+ }
+ return 'continue';
+ }
+ } elseif ( $this->parent->showSessionWarning ) {
+ # The user was knocked back from another page to the start
+ # This probably indicates a session expiry
+ $this->parent->showError( 'config-session-expired', $wgLang->formatTimePeriod( $lifetime ) );
+ }
+
+ $this->parent->setSession( 'test', true );
+
+ if ( !isset( $languages[$userLang] ) ) {
+ $userLang = $this->getVar( '_UserLang', 'en' );
+ }
+ if ( !isset( $languages[$contLang] ) ) {
+ $contLang = $this->getVar( 'wgLanguageCode', 'en' );
+ }
+ $this->startForm();
+ $s = Html::hidden( 'LanguageRequestTime', time() ) .
+ $this->getLanguageSelector( 'UserLang', 'config-your-language', $userLang, $this->parent->getHelpBox( 'config-your-language-help' ) ) .
+ $this->getLanguageSelector( 'ContLang', 'config-wiki-language', $contLang, $this->parent->getHelpBox( 'config-wiki-language-help' ) );
+ $this->addHTML( $s );
+ $this->endForm( 'continue', false );
+ }
+
+ /**
+ * Get a <select> for selecting languages.
+ */
+ public function getLanguageSelector( $name, $label, $selectedCode ) {
+ global $wgDummyLanguageCodes;
+ $s = Html::openElement( 'select', array( 'id' => $name, 'name' => $name ) ) . "\n";
+
+ $languages = Language::getLanguageNames();
+ ksort( $languages );
+ $dummies = array_flip( $wgDummyLanguageCodes );
+ foreach ( $languages as $code => $lang ) {
+ if ( isset( $dummies[$code] ) ) continue;
+ $s .= "\n" . Xml::option( "$code - $lang", $code, $code == $selectedCode );
+ }
+ $s .= "\n</select>\n";
+ return $this->parent->label( $label, $name, $s );
+ }
+
+}
+
+class WebInstaller_ExistingWiki extends WebInstallerPage {
+ public function execute() {
+ // If there is no LocalSettings.php, continue to the installer welcome page
+ $vars = Installer::getExistingLocalSettings();
+ if ( !$vars ) {
+ return 'skip';
+ }
+
+ // Check if the upgrade key supplied to the user has appeared in LocalSettings.php
+ if ( $vars['wgUpgradeKey'] !== false
+ && $this->getVar( '_UpgradeKeySupplied' )
+ && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey'] )
+ {
+ // It's there, so the user is authorized
+ $status = $this->handleExistingUpgrade( $vars );
+ if ( $status->isOK() ) {
+ return 'skip';
+ } else {
+ $this->startForm();
+ $this->parent->showStatusBox( $status );
+ $this->endForm( 'continue' );
+ return 'output';
+ }
+ }
+
+ // If there is no $wgUpgradeKey, tell the user to add one to LocalSettings.php
+ if ( $vars['wgUpgradeKey'] === false ) {
+ if ( $this->getVar( 'wgUpgradeKey', false ) === false ) {
+ $secretKey = $this->getVar( 'wgSecretKey' ); // preserve $wgSecretKey
+ $this->parent->generateKeys();
+ $this->setVar( 'wgSecretKey', $secretKey );
+ $this->setVar( '_UpgradeKeySupplied', true );
+ }
+ $this->startForm();
+ $this->addHTML( $this->parent->getInfoBox(
+ wfMsgNoTrans( 'config-upgrade-key-missing',
+ "<pre>\$wgUpgradeKey = '" . $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )
+ ) );
+ $this->endForm( 'continue' );
+ return 'output';
+ }
+
+ // If there is an upgrade key, but it wasn't supplied, prompt the user to enter it
+
+ $r = $this->parent->request;
+ if ( $r->wasPosted() ) {
+ $key = $r->getText( 'config_wgUpgradeKey' );
+ if( !$key || $key !== $vars['wgUpgradeKey'] ) {
+ $this->parent->showError( 'config-localsettings-badkey' );
+ $this->showKeyForm();
+ return 'output';
+ }
+ // Key was OK
+ $status = $this->handleExistingUpgrade( $vars );
+ if ( $status->isOK() ) {
+ return 'continue';
+ } else {
+ $this->parent->showStatusBox( $status );
+ $this->showKeyForm();
+ return 'output';
+ }
+ } else {
+ $this->showKeyForm();
+ return 'output';
+ }
+ }
+
+ /**
+ * Show the "enter key" form
+ */
+ protected function showKeyForm() {
+ $this->startForm();
+ $this->addHTML(
+ $this->parent->getInfoBox( wfMsgNoTrans( 'config-localsettings-upgrade' ) ).
+ '<br />' .
+ $this->parent->getTextBox( array(
+ 'var' => 'wgUpgradeKey',
+ 'label' => 'config-localsettings-key',
+ 'attribs' => array( 'autocomplete' => 'off' ),
+ ) )
+ );
+ $this->endForm( 'continue' );
+ }
+
+ protected function importVariables( $names, $vars ) {
+ $status = Status::newGood();
+ foreach ( $names as $name ) {
+ if ( !isset( $vars[$name] ) ) {
+ $status->fatal( 'config-localsettings-incomplete', $name );
+ }
+ $this->setVar( $name, $vars[$name] );
+ }
+ return $status;
+ }
+
+ /**
+ * Initiate an upgrade of the existing database
+ * @param $vars Variables from LocalSettings.php and AdminSettings.php
+ * @return Status
+ */
+ protected function handleExistingUpgrade( $vars ) {
+ // Check $wgDBtype
+ if ( !isset( $vars['wgDBtype'] ) || !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
+ return Status::newFatal( 'config-localsettings-connection-error', '' );
+ }
+
+ // Set the relevant variables from LocalSettings.php
+ $requiredVars = array( 'wgDBtype' );
+ $status = $this->importVariables( $requiredVars , $vars );
+ $installer = $this->parent->getDBInstaller();
+ $status->merge( $this->importVariables( $installer->getGlobalNames(), $vars ) );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ if ( isset( $vars['wgDBadminuser'] ) ) {
+ $this->setVar( '_InstallUser', $vars['wgDBadminuser'] );
+ } else {
+ $this->setVar( '_InstallUser', $vars['wgDBuser'] );
+ }
+ if ( isset( $vars['wgDBadminpassword'] ) ) {
+ $this->setVar( '_InstallPassword', $vars['wgDBadminpassword'] );
+ } else {
+ $this->setVar( '_InstallPassword', $vars['wgDBpassword'] );
+ }
+
+ // Test the database connection
+ $status = $installer->getConnection();
+ if ( !$status->isOK() ) {
+ // Adjust the error message to explain things correctly
+ $status->replaceMessage( 'config-connection-error',
+ 'config-localsettings-connection-error' );
+ return $status;
+ }
+
+ // All good
+ $this->setVar( '_ExistingDBSettings', true );
+ return $status;
+ }
+}
+
+class WebInstaller_Welcome extends WebInstallerPage {
+
+ public function execute() {
+ if ( $this->parent->request->wasPosted() ) {
+ if ( $this->getVar( '_Environment' ) ) {
+ return 'continue';
+ }
+ }
+ $this->parent->output->addWikiText( wfMsgNoTrans( 'config-welcome' ) );
+ $status = $this->parent->doEnvironmentChecks();
+ if ( $status->isGood() ) {
+ $this->parent->output->addHTML( '<span class="success-message">' .
+ wfMsgHtml( 'config-env-good' ) . '</span>' );
+ $this->parent->output->addWikiText( wfMsgNoTrans( 'config-copyright',
+ SpecialVersion::getCopyrightAndAuthorList() ) );
+ $this->startForm();
+ $this->endForm();
+ } else {
+ $this->parent->showStatusMessage( $status );
+ }
+ }
+
+}
+
+class WebInstaller_DBConnect extends WebInstallerPage {
+
+ public function execute() {
+ if ( $this->getVar( '_ExistingDBSettings' ) ) {
+ return 'skip';
+ }
+
+ $r = $this->parent->request;
+ if ( $r->wasPosted() ) {
+ $status = $this->submit();
+
+ if ( $status->isGood() ) {
+ $this->setVar( '_UpgradeDone', false );
+ return 'continue';
+ } else {
+ $this->parent->showStatusBox( $status );
+ }
+ }
+
+ $this->startForm();
+
+ $types = "<ul class=\"config-settings-block\">\n";
+ $settings = '';
+ $defaultType = $this->getVar( 'wgDBtype' );
+
+ $dbSupport = '';
+ foreach( $this->parent->getDBTypes() as $type ) {
+ $link = DatabaseBase::newFromType( $type )->getSoftwareLink();
+ $dbSupport .= wfMsgNoTrans( "config-support-$type", $link ) . "\n";
+ }
+ $this->addHTML( $this->parent->getInfoBox(
+ wfMsg( 'config-support-info', $dbSupport ) ) );
+
+ foreach ( $this->parent->getVar( '_CompiledDBs' ) as $type ) {
+ $installer = $this->parent->getDBInstaller( $type );
+ $types .=
+ '<li>' .
+ Xml::radioLabel(
+ $installer->getReadableName(),
+ 'DBType',
+ $type,
+ "DBType_$type",
+ $type == $defaultType,
+ array( 'class' => 'dbRadio', 'rel' => "DB_wrapper_$type" )
+ ) .
+ "</li>\n";
+
+ $settings .=
+ Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type, 'class' => 'dbWrapper' ) ) .
+ Html::element( 'h3', array(), wfMsg( 'config-header-' . $type ) ) .
+ $installer->getConnectForm() .
+ "</div>\n";
+ }
+ $types .= "</ul><br clear=\"left\"/>\n";
+
+ $this->addHTML(
+ $this->parent->label( 'config-db-type', false, $types ) .
+ $settings
+ );
+
+ $this->endForm();
+ }
+
+ public function submit() {
+ $r = $this->parent->request;
+ $type = $r->getVal( 'DBType' );
+ $this->setVar( 'wgDBtype', $type );
+ $installer = $this->parent->getDBInstaller( $type );
+ if ( !$installer ) {
+ return Status::newFatal( 'config-invalid-db-type' );
+ }
+ return $installer->submitConnectForm();
+ }
+
+}
+
+class WebInstaller_Upgrade extends WebInstallerPage {
+
+ public function execute() {
+ if ( $this->getVar( '_UpgradeDone' ) ) {
+ // Allow regeneration of LocalSettings.php, unless we are working
+ // from a pre-existing LocalSettings.php file and we want to avoid
+ // leaking its contents
+ if ( $this->parent->request->wasPosted() && !$this->getVar( '_ExistingDBSettings' ) ) {
+ // Done message acknowledged
+ return 'continue';
+ } else {
+ // Back button click
+ // Show the done message again
+ // Make them click back again if they want to do the upgrade again
+ $this->showDoneMessage();
+ return 'output';
+ }
+ }
+
+ // wgDBtype is generally valid here because otherwise the previous page
+ // (connect) wouldn't have declared its happiness
+ $type = $this->getVar( 'wgDBtype' );
+ $installer = $this->parent->getDBInstaller( $type );
+
+ if ( !$installer->needsUpgrade() ) {
+ return 'skip';
+ }
+
+ if ( $this->parent->request->wasPosted() ) {
+ $installer->preUpgrade();
+
+ $this->startLiveBox();
+ $result = $installer->doUpgrade();
+ $this->endLiveBox();
+
+ if ( $result ) {
+ // If they're going to possibly regenerate LocalSettings, we
+ // need to create the upgrade/secret keys. Bug 26481
+ if( !$this->getVar( '_ExistingDBSettings' ) ) {
+ $this->parent->generateKeys();
+ }
+ $this->setVar( '_UpgradeDone', true );
+ $this->showDoneMessage();
+ return 'output';
+ }
+ }
+
+ $this->startForm();
+ $this->addHTML( $this->parent->getInfoBox(
+ wfMsgNoTrans( 'config-can-upgrade', $GLOBALS['wgVersion'] ) ) );
+ $this->endForm();
+ }
+
+ public function showDoneMessage() {
+ $this->startForm();
+ $regenerate = !$this->getVar( '_ExistingDBSettings' );
+ if ( $regenerate ) {
+ $msg = 'config-upgrade-done';
+ } else {
+ $msg = 'config-upgrade-done-no-regenerate';
+ }
+ $this->parent->disableLinkPopups();
+ $this->addHTML(
+ $this->parent->getInfoBox(
+ wfMsgNoTrans( $msg,
+ $GLOBALS['wgServer'] .
+ $this->getVar( 'wgScriptPath' ) . '/index' .
+ $this->getVar( 'wgScriptExtension' )
+ ), 'tick-32.png'
+ )
+ );
+ $this->parent->restoreLinkPopups();
+ $this->endForm( $regenerate ? 'regenerate' : false, false );
+ }
+
+}
+
+class WebInstaller_DBSettings extends WebInstallerPage {
+
+ public function execute() {
+ $installer = $this->parent->getDBInstaller( $this->getVar( 'wgDBtype' ) );
+
+ $r = $this->parent->request;
+ if ( $r->wasPosted() ) {
+ $status = $installer->submitSettingsForm();
+ if ( $status === false ) {
+ return 'skip';
+ } elseif ( $status->isGood() ) {
+ return 'continue';
+ } else {
+ $this->parent->showStatusBox( $status );
+ }
+ }
+
+ $form = $installer->getSettingsForm();
+ if ( $form === false ) {
+ return 'skip';
+ }
+
+ $this->startForm();
+ $this->addHTML( $form );
+ $this->endForm();
+ }
+
+}
+
+class WebInstaller_Name extends WebInstallerPage {
+
+ public function execute() {
+ $r = $this->parent->request;
+ if ( $r->wasPosted() ) {
+ if ( $this->submit() ) {
+ return 'continue';
+ }
+ }
+
+ $this->startForm();
+
+ // Encourage people to not name their site 'MediaWiki' by blanking the
+ // field. I think that was the intent with the original $GLOBALS['wgSitename']
+ // but these two always were the same so had the effect of making the
+ // installer forget $wgSitename when navigating back to this page.
+ if ( $this->getVar( 'wgSitename' ) == 'MediaWiki' ) {
+ $this->setVar( 'wgSitename', '' );
+ }
+
+ // Set wgMetaNamespace to something valid before we show the form.
+ // $wgMetaNamespace defaults to $wgSiteName which is 'MediaWiki'
+ $metaNS = $this->getVar( 'wgMetaNamespace' );
+ $this->setVar( 'wgMetaNamespace', wfMsgForContent( 'config-ns-other-default' ) );
+
+ $this->addHTML(
+ $this->parent->getTextBox( array(
+ 'var' => 'wgSitename',
+ 'label' => 'config-site-name',
+ 'help' => $this->parent->getHelpBox( 'config-site-name-help' )
+ ) ) .
+ $this->parent->getRadioSet( array(
+ 'var' => '_NamespaceType',
+ 'label' => 'config-project-namespace',
+ 'itemLabelPrefix' => 'config-ns-',
+ 'values' => array( 'site-name', 'generic', 'other' ),
+ 'commonAttribs' => array( 'class' => 'enableForOther', 'rel' => 'config_wgMetaNamespace' ),
+ 'help' => $this->parent->getHelpBox( 'config-project-namespace-help' )
+ ) ) .
+ $this->parent->getTextBox( array(
+ 'var' => 'wgMetaNamespace',
+ 'label' => '', //TODO: Needs a label?
+ 'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' ),
+
+ ) ) .
+ $this->getFieldSetStart( 'config-admin-box' ) .
+ $this->parent->getTextBox( array(
+ 'var' => '_AdminName',
+ 'label' => 'config-admin-name',
+ 'help' => $this->parent->getHelpBox( 'config-admin-help' )
+ ) ) .
+ $this->parent->getPasswordBox( array(
+ 'var' => '_AdminPassword',
+ 'label' => 'config-admin-password',
+ ) ) .
+ $this->parent->getPasswordBox( array(
+ 'var' => '_AdminPassword2',
+ 'label' => 'config-admin-password-confirm'
+ ) ) .
+ $this->parent->getTextBox( array(
+ 'var' => '_AdminEmail',
+ 'label' => 'config-admin-email',
+ 'help' => $this->parent->getHelpBox( 'config-admin-email-help' )
+ ) ) .
+ $this->parent->getCheckBox( array(
+ 'var' => '_Subscribe',
+ 'label' => 'config-subscribe',
+ 'help' => $this->parent->getHelpBox( 'config-subscribe-help' )
+ ) ) .
+ $this->getFieldSetEnd() .
+ $this->parent->getInfoBox( wfMsg( 'config-almost-done' ) ) .
+ $this->parent->getRadioSet( array(
+ 'var' => '_SkipOptional',
+ 'itemLabelPrefix' => 'config-optional-',
+ 'values' => array( 'continue', 'skip' )
+ ) )
+ );
+
+ // Restore the default value
+ $this->setVar( 'wgMetaNamespace', $metaNS );
+
+ $this->endForm();
+ return 'output';
+ }
+
+ public function submit() {
+ $retVal = true;
+ $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
+ '_AdminName', '_AdminPassword', '_AdminPassword2', '_AdminEmail',
+ '_Subscribe', '_SkipOptional', 'wgMetaNamespace' ) );
+
+ // Validate site name
+ if ( strval( $this->getVar( 'wgSitename' ) ) === '' ) {
+ $this->parent->showError( 'config-site-name-blank' );
+ $retVal = false;
+ }
+
+ // Fetch namespace
+ $nsType = $this->getVar( '_NamespaceType' );
+ if ( $nsType == 'site-name' ) {
+ $name = $this->getVar( 'wgSitename' );
+ // Sanitize for namespace
+ // This algorithm should match the JS one in WebInstallerOutput.php
+ $name = preg_replace( '/[\[\]\{\}|#<>%+? ]/', '_', $name );
+ $name = str_replace( '&', '&amp;', $name );
+ $name = preg_replace( '/__+/', '_', $name );
+ $name = ucfirst( trim( $name, '_' ) );
+ } elseif ( $nsType == 'generic' ) {
+ $name = wfMsg( 'config-ns-generic' );
+ } else { // other
+ $name = $this->getVar( 'wgMetaNamespace' );
+ }
+
+ // Validate namespace
+ if ( strpos( $name, ':' ) !== false ) {
+ $good = false;
+ } else {
+ // Title-style validation
+ $title = Title::newFromText( $name );
+ if ( !$title ) {
+ $good = $nsType == 'site-name';
+ } else {
+ $name = $title->getDBkey();
+ $good = true;
+ }
+ }
+ if ( !$good ) {
+ $this->parent->showError( 'config-ns-invalid', $name );
+ $retVal = false;
+ }
+
+ // Make sure it won't conflict with any existing namespaces
+ global $wgContLang;
+ $nsIndex = $wgContLang->getNsIndex( $name );
+ if( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
+ $this->parent->showError( 'config-ns-conflict', $name );
+ $retVal = false;
+ }
+
+ $this->setVar( 'wgMetaNamespace', $name );
+
+ // Validate username for creation
+ $name = $this->getVar( '_AdminName' );
+ if ( strval( $name ) === '' ) {
+ $this->parent->showError( 'config-admin-name-blank' );
+ $cname = $name;
+ $retVal = false;
+ } else {
+ $cname = User::getCanonicalName( $name, 'creatable' );
+ if ( $cname === false ) {
+ $this->parent->showError( 'config-admin-name-invalid', $name );
+ $retVal = false;
+ } else {
+ $this->setVar( '_AdminName', $cname );
+ }
+ }
+
+ // Validate password
+ $msg = false;
+ $valid = false;
+ $pwd = $this->getVar( '_AdminPassword' );
+ $user = User::newFromName( $cname );
+ $valid = $user && $user->getPasswordValidity( $pwd );
+ if ( strval( $pwd ) === '' ) {
+ # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
+ # This message is more specific and helpful.
+ $msg = 'config-admin-password-blank';
+ } elseif ( $pwd !== $this->getVar( '_AdminPassword2' ) ) {
+ $msg = 'config-admin-password-mismatch';
+ } elseif ( $valid !== true ) {
+ # As of writing this will only catch the username being e.g. 'FOO' and
+ # the password 'foo'
+ $msg = $valid;
+ }
+ if ( $msg !== false ) {
+ call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
+ $this->setVar( '_AdminPassword', '' );
+ $this->setVar( '_AdminPassword2', '' );
+ $retVal = false;
+ }
+
+ // Validate e-mail if provided
+ $email = $this->getVar( '_AdminEmail' );
+ if( $email && !User::isValidEmailAddr( $email ) ) {
+ $this->parent->showError( 'config-admin-error-bademail' );
+ $retVal = false;
+ }
+
+ return $retVal;
+ }
+
+}
+
+class WebInstaller_Options extends WebInstallerPage {
+
+ public function execute() {
+ if ( $this->getVar( '_SkipOptional' ) == 'skip' ) {
+ return 'skip';
+ }
+ if ( $this->parent->request->wasPosted() ) {
+ if ( $this->submit() ) {
+ return 'continue';
+ }
+ }
+
+ $emailwrapperStyle = $this->getVar( 'wgEnableEmail' ) ? '' : 'display: none';
+ $this->startForm();
+ $this->addHTML(
+ # User Rights
+ $this->parent->getRadioSet( array(
+ 'var' => '_RightsProfile',
+ 'label' => 'config-profile',
+ 'itemLabelPrefix' => 'config-profile-',
+ 'values' => array_keys( $this->parent->rightsProfiles ),
+ ) ) .
+ $this->parent->getInfoBox( wfMsgNoTrans( 'config-profile-help' ) ) .
+
+ # Licensing
+ $this->parent->getRadioSet( array(
+ 'var' => '_LicenseCode',
+ 'label' => 'config-license',
+ 'itemLabelPrefix' => 'config-license-',
+ 'values' => array_keys( $this->parent->licenses ),
+ 'commonAttribs' => array( 'class' => 'licenseRadio' ),
+ ) ) .
+ $this->getCCChooser() .
+ $this->parent->getHelpBox( 'config-license-help' ) .
+
+ # E-mail
+ $this->getFieldSetStart( 'config-email-settings' ) .
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgEnableEmail',
+ 'label' => 'config-enable-email',
+ 'attribs' => array( 'class' => 'showHideRadio', 'rel' => 'emailwrapper' ),
+ ) ) .
+ $this->parent->getHelpBox( 'config-enable-email-help' ) .
+ "<div id=\"emailwrapper\" style=\"$emailwrapperStyle\">" .
+ $this->parent->getTextBox( array(
+ 'var' => 'wgPasswordSender',
+ 'label' => 'config-email-sender'
+ ) ) .
+ $this->parent->getHelpBox( 'config-email-sender-help' ) .
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgEnableUserEmail',
+ 'label' => 'config-email-user',
+ ) ) .
+ $this->parent->getHelpBox( 'config-email-user-help' ) .
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgEnotifUserTalk',
+ 'label' => 'config-email-usertalk',
+ ) ) .
+ $this->parent->getHelpBox( 'config-email-usertalk-help' ) .
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgEnotifWatchlist',
+ 'label' => 'config-email-watchlist',
+ ) ) .
+ $this->parent->getHelpBox( 'config-email-watchlist-help' ) .
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgEmailAuthentication',
+ 'label' => 'config-email-auth',
+ ) ) .
+ $this->parent->getHelpBox( 'config-email-auth-help' ) .
+ "</div>" .
+ $this->getFieldSetEnd()
+ );
+
+ $extensions = $this->parent->findExtensions();
+
+ if( $extensions ) {
+ $extHtml = $this->getFieldSetStart( 'config-extensions' );
+
+ foreach( $extensions as $ext ) {
+ $extHtml .= $this->parent->getCheckBox( array(
+ 'var' => "ext-$ext",
+ 'rawtext' => $ext,
+ ) );
+ }
+
+ $extHtml .= $this->parent->getHelpBox( 'config-extensions-help' ) .
+ $this->getFieldSetEnd();
+ $this->addHTML( $extHtml );
+ }
+
+ // Having / in paths in Windows looks funny :)
+ $this->setVar( 'wgDeletedDirectory',
+ str_replace(
+ '/', DIRECTORY_SEPARATOR,
+ $this->getVar( 'wgDeletedDirectory' )
+ )
+ );
+
+ $uploadwrapperStyle = $this->getVar( 'wgEnableUploads' ) ? '' : 'display: none';
+ $this->addHTML(
+ # Uploading
+ $this->getFieldSetStart( 'config-upload-settings' ) .
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgEnableUploads',
+ 'label' => 'config-upload-enable',
+ 'attribs' => array( 'class' => 'showHideRadio', 'rel' => 'uploadwrapper' ),
+ 'help' => $this->parent->getHelpBox( 'config-upload-help' )
+ ) ) .
+ '<div id="uploadwrapper" style="' . $uploadwrapperStyle . '">' .
+ $this->parent->getTextBox( array(
+ 'var' => 'wgDeletedDirectory',
+ 'label' => 'config-upload-deleted',
+ 'help' => $this->parent->getHelpBox( 'config-upload-deleted-help' )
+ ) ) .
+ '</div>' .
+ $this->parent->getTextBox( array(
+ 'var' => 'wgLogo',
+ 'label' => 'config-logo',
+ 'help' => $this->parent->getHelpBox( 'config-logo-help' )
+ ) )
+ );
+ $this->addHTML(
+ $this->parent->getCheckBox( array(
+ 'var' => 'wgUseInstantCommons',
+ 'label' => 'config-instantcommons',
+ 'help' => $this->parent->getHelpBox( 'config-instantcommons-help' )
+ ) ) .
+ $this->getFieldSetEnd()
+ );
+
+ $caches = array( 'none' );
+ if( count( $this->getVar( '_Caches' ) ) ) {
+ $caches[] = 'accel';
+ }
+ $caches[] = 'memcached';
+
+ $this->addHTML(
+ # Advanced settings
+ $this->getFieldSetStart( 'config-advanced-settings' ) .
+ # Object cache settings
+ $this->parent->getRadioSet( array(
+ 'var' => 'wgMainCacheType',
+ 'label' => 'config-cache-options',
+ 'itemLabelPrefix' => 'config-cache-',
+ 'values' => $caches,
+ 'value' => 'none',
+ ) ) .
+ $this->parent->getHelpBox( 'config-cache-help' ) .
+ '<div id="config-memcachewrapper">' .
+ $this->parent->getTextArea( array(
+ 'var' => '_MemCachedServers',
+ 'label' => 'config-memcached-servers',
+ 'help' => $this->parent->getHelpBox( 'config-memcached-help' )
+ ) ) .
+ '</div>' .
+ $this->getFieldSetEnd()
+ );
+ $this->endForm();
+ }
+
+ public function getCCPartnerUrl() {
+ global $wgServer;
+ $exitUrl = $wgServer . $this->parent->getUrl( array(
+ 'page' => 'Options',
+ 'SubmitCC' => 'indeed',
+ 'config__LicenseCode' => 'cc',
+ 'config_wgRightsUrl' => '[license_url]',
+ 'config_wgRightsText' => '[license_name]',
+ 'config_wgRightsIcon' => '[license_button]',
+ ) );
+ $styleUrl = $wgServer . dirname( dirname( $this->parent->getUrl() ) ) .
+ '/skins/common/config-cc.css';
+ $iframeUrl = 'http://creativecommons.org/license/?' .
+ wfArrayToCGI( array(
+ 'partner' => 'MediaWiki',
+ 'exit_url' => $exitUrl,
+ 'lang' => $this->getVar( '_UserLang' ),
+ 'stylesheet' => $styleUrl,
+ ) );
+ return $iframeUrl;
+ }
+
+ public function getCCChooser() {
+ $iframeAttribs = array(
+ 'class' => 'config-cc-iframe',
+ 'name' => 'config-cc-iframe',
+ 'id' => 'config-cc-iframe',
+ 'frameborder' => 0,
+ 'width' => '100%',
+ 'height' => '100%',
+ );
+ if ( $this->getVar( '_CCDone' ) ) {
+ $iframeAttribs['src'] = $this->parent->getUrl( array( 'ShowCC' => 'yes' ) );
+ } else {
+ $iframeAttribs['src'] = $this->getCCPartnerUrl();
+ }
+ $wrapperStyle = ($this->getVar('_LicenseCode') == 'cc-choose') ? '' : 'display: none';
+
+ return
+ "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
+ Html::element( 'iframe', $iframeAttribs, '', false /* not short */ ) .
+ "</div>\n";
+ }
+
+ public function getCCDoneBox() {
+ $js = "parent.document.getElementById('config-cc-wrapper').style.height = '$1';";
+ // If you change this height, also change it in config.css
+ $expandJs = str_replace( '$1', '54em', $js );
+ $reduceJs = str_replace( '$1', '70px', $js );
+ return
+ '<p>'.
+ Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
+ '&#160;&#160;' .
+ htmlspecialchars( $this->getVar( 'wgRightsText' ) ) .
+ "</p>\n" .
+ "<p style=\"text-align: center\">" .
+ Html::element( 'a',
+ array(
+ 'href' => $this->getCCPartnerUrl(),
+ 'onclick' => $expandJs,
+ ),
+ wfMsg( 'config-cc-again' )
+ ) .
+ "</p>\n" .
+ "<script type=\"text/javascript\">\n" .
+ # Reduce the wrapper div height
+ htmlspecialchars( $reduceJs ) .
+ "\n" .
+ "</script>\n";
+ }
+
+ public function submitCC() {
+ $newValues = $this->parent->setVarsFromRequest(
+ array( 'wgRightsUrl', 'wgRightsText', 'wgRightsIcon' ) );
+ if ( count( $newValues ) != 3 ) {
+ $this->parent->showError( 'config-cc-error' );
+ return;
+ }
+ $this->setVar( '_CCDone', true );
+ $this->addHTML( $this->getCCDoneBox() );
+ }
+
+ public function submit() {
+ $this->parent->setVarsFromRequest( array( '_RightsProfile', '_LicenseCode',
+ 'wgEnableEmail', 'wgPasswordSender', 'wgEnableUploads', 'wgLogo',
+ 'wgEnableUserEmail', 'wgEnotifUserTalk', 'wgEnotifWatchlist',
+ 'wgEmailAuthentication', 'wgMainCacheType', '_MemCachedServers',
+ 'wgUseInstantCommons' ) );
+
+ if ( !in_array( $this->getVar( '_RightsProfile' ),
+ array_keys( $this->parent->rightsProfiles ) ) )
+ {
+ reset( $this->parent->rightsProfiles );
+ $this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
+ }
+
+ $code = $this->getVar( '_LicenseCode' );
+ if ( $code == 'cc-choose' ) {
+ if ( !$this->getVar( '_CCDone' ) ) {
+ $this->parent->showError( 'config-cc-not-chosen' );
+ return false;
+ }
+ } elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
+ $entry = $this->parent->licenses[$code];
+ if ( isset( $entry['text'] ) ) {
+ $this->setVar( 'wgRightsText', $entry['text'] );
+ } else {
+ $this->setVar( 'wgRightsText', wfMsg( 'config-license-' . $code ) );
+ }
+ $this->setVar( 'wgRightsUrl', $entry['url'] );
+ $this->setVar( 'wgRightsIcon', $entry['icon'] );
+ } else {
+ $this->setVar( 'wgRightsText', '' );
+ $this->setVar( 'wgRightsUrl', '' );
+ $this->setVar( 'wgRightsIcon', '' );
+ }
+
+ $extsAvailable = $this->parent->findExtensions();
+ $extsToInstall = array();
+ foreach( $extsAvailable as $ext ) {
+ if( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
+ $extsToInstall[] = $ext;
+ }
+ }
+ $this->parent->setVar( '_Extensions', $extsToInstall );
+
+ if( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+ $memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
+ if( !$memcServers ) {
+ $this->parent->showError( 'config-memcache-needservers' );
+ return false;
+ }
+
+ foreach( $memcServers as $server ) {
+ $memcParts = explode( ":", $server );
+ if( !IP::isValid( $memcParts[0] ) ) {
+ $this->parent->showError( 'config-memcache-badip', $memcParts[0] );
+ return false;
+ } elseif( !isset( $memcParts[1] ) ) {
+ $this->parent->showError( 'config-memcache-noport', $memcParts[0] );
+ return false;
+ } elseif( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
+ $this->parent->showError( 'config-memcache-badport', 1, 65535 );
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+}
+
+class WebInstaller_Install extends WebInstallerPage {
+
+ public function execute() {
+ if( $this->getVar( '_UpgradeDone' ) ) {
+ return 'skip';
+ } elseif( $this->getVar( '_InstallDone' ) ) {
+ return 'continue';
+ } elseif( $this->parent->request->wasPosted() ) {
+ $this->startForm();
+ $this->addHTML("<ul>");
+ $results = $this->parent->performInstallation(
+ array( $this, 'startStage'),
+ array( $this, 'endStage' )
+ );
+ $this->addHTML("</ul>");
+ // PerformInstallation bails on a fatal, so make sure the last item
+ // completed before giving 'next.' Likewise, only provide back on failure
+ $lastStep = end( $results );
+ $continue = $lastStep->isOK() ? 'continue' : false;
+ $back = $lastStep->isOK() ? false : 'back';
+ $this->endForm( $continue, $back );
+ } else {
+ $this->startForm();
+ $this->addHTML( $this->parent->getInfoBox( wfMsgNoTrans( 'config-install-begin' ) ) );
+ $this->endForm();
+ }
+ return true;
+ }
+
+ public function startStage( $step ) {
+ $this->addHTML( "<li>" . wfMsgHtml( "config-install-$step" ) . wfMsg( 'ellipsis') );
+ if ( $step == 'extension-tables' ) {
+ $this->startLiveBox();
+ }
+ }
+
+ public function endStage( $step, $status ) {
+ if ( $step == 'extension-tables' ) {
+ $this->endLiveBox();
+ }
+ $msg = $status->isOk() ? 'config-install-step-done' : 'config-install-step-failed';
+ $html = wfMsgHtml( 'word-separator' ) . wfMsgHtml( $msg );
+ if ( !$status->isOk() ) {
+ $html = "<span class=\"error\">$html</span>";
+ }
+ $this->addHTML( $html . "</li>\n" );
+ if( !$status->isGood() ) {
+ $this->parent->showStatusBox( $status );
+ }
+ }
+
+}
+
+class WebInstaller_Complete extends WebInstallerPage {
+
+ public function execute() {
+ // Pop up a dialog box, to make it difficult for the user to forget
+ // to download the file
+ $lsUrl = $GLOBALS['wgServer'] . $this->parent->getURL( array( 'localsettings' => 1 ) );
+ if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) {
+ // JS appears the only method that works consistently with IE7+
+ $this->addHtml( "\n<script type=\"" . $GLOBALS['wgJsMimeType'] . '">jQuery( document ).ready( function() { document.location='
+ . Xml::encodeJsVar( $lsUrl) . "; } );</script>\n" );
+ } else {
+ $this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
+ }
+
+ $this->startForm();
+ $this->parent->disableLinkPopups();
+ $this->addHTML(
+ $this->parent->getInfoBox(
+ wfMsgNoTrans( 'config-install-done',
+ $lsUrl,
+ $GLOBALS['wgServer'] .
+ $this->getVar( 'wgScriptPath' ) . '/index' .
+ $this->getVar( 'wgScriptExtension' ),
+ '<downloadlink/>'
+ ), 'tick-32.png'
+ )
+ );
+ $this->parent->restoreLinkPopups();
+ $this->endForm( false, false );
+ }
+}
+
+class WebInstaller_Restart extends WebInstallerPage {
+
+ public function execute() {
+ $r = $this->parent->request;
+ if ( $r->wasPosted() ) {
+ $really = $r->getVal( 'submit-restart' );
+ if ( $really ) {
+ $this->parent->reset();
+ }
+ return 'continue';
+ }
+
+ $this->startForm();
+ $s = $this->parent->getWarningBox( wfMsgNoTrans( 'config-help-restart' ) );
+ $this->addHTML( $s );
+ $this->endForm( 'restart' );
+ }
+
+}
+
+abstract class WebInstaller_Document extends WebInstallerPage {
+
+ protected abstract function getFileName();
+
+ public function execute() {
+ $text = $this->getFileContents();
+ $text = $this->formatTextFile( $text );
+ $this->parent->output->addWikiText( $text );
+ $this->startForm();
+ $this->endForm( false );
+ }
+
+ public function getFileContents() {
+ return file_get_contents( dirname( __FILE__ ) . '/../../' . $this->getFileName() );
+ }
+
+ protected function formatTextFile( $text ) {
+ // Use Unix line endings, escape some wikitext stuff
+ $text = str_replace( array( '<', '{{', '[[', "\r" ),
+ array( '&lt;', '&#123;&#123;', '&#91;&#91;', '' ), $text );
+ // join word-wrapped lines into one
+ do {
+ $prev = $text;
+ $text = preg_replace( "/\n([\\*#\t])([^\n]*?)\n([^\n#\\*:]+)/", "\n\\1\\2 \\3", $text );
+ } while ( $text != $prev );
+ // Replace tab indents with colons
+ $text = preg_replace( '/^\t\t/m', '::', $text );
+ $text = preg_replace( '/^\t/m', ':', $text );
+ // turn (bug nnnn) into links
+ $text = preg_replace_callback('/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
+ // add links to manual to every global variable mentioned
+ $text = preg_replace_callback('/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
+ return $text;
+ }
+
+ private function replaceBugLinks( $matches ) {
+ return '<span class="config-plainlink">[https://bugzilla.wikimedia.org/' .
+ $matches[1] . ' bug ' . $matches[1] . ']</span>';
+ }
+
+ private function replaceConfigLinks( $matches ) {
+ return '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:' .
+ $matches[1] . ' ' . $matches[1] . ']</span>';
+ }
+
+}
+
+class WebInstaller_Readme extends WebInstaller_Document {
+ protected function getFileName() { return 'README'; }
+}
+
+class WebInstaller_ReleaseNotes extends WebInstaller_Document {
+ protected function getFileName() { return 'RELEASE-NOTES'; }
+}
+
+class WebInstaller_UpgradeDoc extends WebInstaller_Document {
+ protected function getFileName() { return 'UPGRADE'; }
+}
+
+class WebInstaller_Copying extends WebInstaller_Document {
+ protected function getFileName() { return 'COPYING'; }
+}
+
diff --git a/includes/DoubleRedirectJob.php b/includes/job/DoubleRedirectJob.php
index 0857408a..3b4b0188 100644
--- a/includes/DoubleRedirectJob.php
+++ b/includes/job/DoubleRedirectJob.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Job to fix double redirects after moving a page
+ *
+ * @file
+ * @ingroup JobQueue
+ */
/**
* Job to fix double redirects after moving a page
diff --git a/includes/EmaillingJob.php b/includes/job/EmaillingJob.php
index 380c8982..89b74a41 100644
--- a/includes/EmaillingJob.php
+++ b/includes/job/EmaillingJob.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Old job for notification emails.
+ *
+ * @file
+ * @ingroup JobQueue
+ */
/**
* Old job used for sending single notification emails;
@@ -7,13 +13,12 @@
* @ingroup JobQueue
*/
class EmaillingJob extends Job {
-
function __construct( $title, $params, $id = 0 ) {
parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
}
function run() {
- userMailer(
+ UserMailer::send(
$this->params['to'],
$this->params['from'],
$this->params['subj'],
diff --git a/includes/EnotifNotifyJob.php b/includes/job/EnotifNotifyJob.php
index f7178d0f..5d2a08ea 100644
--- a/includes/EnotifNotifyJob.php
+++ b/includes/job/EnotifNotifyJob.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Job for notification emails.
+ *
+ * @file
+ * @ingroup JobQueue
+ */
/**
* Job for email notification mails
diff --git a/includes/JobQueue.php b/includes/job/JobQueue.php
index 4ab5eac6..8eec8215 100644
--- a/includes/JobQueue.php
+++ b/includes/job/JobQueue.php
@@ -1,5 +1,8 @@
<?php
/**
+ * Job queue base code
+ *
+ * @file
* @defgroup JobQueue JobQueue
*/
@@ -35,13 +38,6 @@ abstract class Job {
*------------------------------------------------------------------------*/
/**
- * @deprecated use LinksUpdate::queueRecursiveJobs()
- */
- /**
- * static function queueLinksJobs( $titles ) {}
- */
-
- /**
* Pop a job of a certain type. This tries less hard than pop() to
* actually find a job; it may be adversely affected by concurrent job
* runners.
@@ -76,7 +72,8 @@ abstract class Job {
$namespace = $row->job_namespace;
$dbkey = $row->job_title;
$title = Title::makeTitleSafe( $namespace, $dbkey );
- $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
+ $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
+ $row->job_id );
$dbw->delete( 'job', $job->insertFields(), __METHOD__ );
$dbw->commit();
@@ -120,7 +117,6 @@ abstract class Job {
return false;
}
}
- $offset = $row->job_id;
// Try to delete it from the master
$dbw = wfGetDB( DB_MASTER );
@@ -221,12 +217,12 @@ abstract class Job {
* @param $jobs array of Job objects
*/
static function batchInsert( $jobs ) {
- if( !count( $jobs ) ) {
+ if ( !count( $jobs ) ) {
return;
}
$dbw = wfGetDB( DB_MASTER );
$rows = array();
- foreach( $jobs as $job ) {
+ foreach ( $jobs as $job ) {
$rows[] = $job->insertFields();
if ( count( $rows ) >= 50 ) {
# Do a small transaction to avoid slave lag
@@ -236,11 +232,40 @@ abstract class Job {
$rows = array();
}
}
- if ( $rows ) {
+ if ( $rows ) { // last chunk
$dbw->begin();
$dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
$dbw->commit();
}
+ wfIncrStats( 'job-insert', count( $jobs ) );
+ }
+
+ /**
+ * Insert a group of jobs into the queue.
+ *
+ * Same as batchInsert() but does not commit and can thus
+ * be rolled-back as part of a larger transaction. However,
+ * large batches of jobs can cause slave lag.
+ *
+ * @param $jobs array of Job objects
+ */
+ static function safeBatchInsert( $jobs ) {
+ if ( !count( $jobs ) ) {
+ return;
+ }
+ $dbw = wfGetDB( DB_MASTER );
+ $rows = array();
+ foreach ( $jobs as $job ) {
+ $rows[] = $job->insertFields();
+ if ( count( $rows ) >= 500 ) {
+ $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+ $rows = array();
+ }
+ }
+ if ( $rows ) { // last chunk
+ $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+ }
+ wfIncrStats( 'job-insert', count( $jobs ) );
}
/*-------------------------------------------------------------------------
@@ -260,6 +285,7 @@ abstract class Job {
/**
* Insert a single job into the queue.
+ * @return bool true on success
*/
function insert() {
$fields = $this->insertFields();
@@ -272,7 +298,7 @@ abstract class Job {
return;
}
}
- $dbw->insert( 'job', $fields, __METHOD__ );
+ return $dbw->insert( 'job', $fields, __METHOD__ );
}
protected function insertFields() {
diff --git a/includes/RefreshLinksJob.php b/includes/job/RefreshLinksJob.php
index aba18362..cc91fa81 100644
--- a/includes/RefreshLinksJob.php
+++ b/includes/job/RefreshLinksJob.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Job to update links for a given title.
+ *
+ * @file
+ * @ingroup JobQueue
+ */
/**
* Background job to update links for a given title.
@@ -93,6 +99,8 @@ class RefreshLinksJob2 extends Job {
$jobs[] = new RefreshLinksJob( $title, '' );
}
Job::batchInsert( $jobs );
+
+ wfProfileOut( __METHOD__ );
return true;
}
# Re-parse each page that transcludes this page and update their tracking links...
diff --git a/includes/job/UploadFromUrlJob.php b/includes/job/UploadFromUrlJob.php
new file mode 100644
index 00000000..63166ef9
--- /dev/null
+++ b/includes/job/UploadFromUrlJob.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This job is in fact an interface to UploadFromUrl, which is designed such
+ * that it does not require any globals. If it does, fix it elsewhere, do not
+ * add globals in here.
+ *
+ * @ingroup JobQueue
+ */
+class UploadFromUrlJob extends Job {
+ const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
+
+ public $upload;
+ protected $user;
+
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'uploadFromUrl', $title, $params, $id );
+ }
+
+ public function run() {
+ # Initialize this object and the upload object
+ $this->upload = new UploadFromUrl();
+ $this->upload->initialize(
+ $this->title->getText(),
+ $this->params['url'],
+ false
+ );
+ $this->user = User::newFromName( $this->params['userName'] );
+
+ # Fetch the file
+ $status = $this->upload->fetchFile();
+ if ( !$status->isOk() ) {
+ $this->leaveMessage( $status );
+ return true;
+ }
+
+ # Verify upload
+ $result = $this->upload->verifyUpload();
+ if ( $result['status'] != UploadBase::OK ) {
+ $status = $this->upload->convertVerifyErrorToStatus( $result );
+ $this->leaveMessage( $status );
+ return true;
+ }
+
+ # Check warnings
+ if ( !$this->params['ignoreWarnings'] ) {
+ $warnings = $this->upload->checkWarnings();
+ if ( $warnings ) {
+ wfSetupSession( $this->params['sessionId'] );
+
+ if ( $this->params['leaveMessage'] ) {
+ $this->user->leaveUserMessage(
+ wfMsg( 'upload-warning-subj' ),
+ wfMsg( 'upload-warning-msg',
+ $this->params['sessionKey'],
+ $this->params['url'] )
+ );
+ } else {
+ $this->storeResultInSession( 'Warning',
+ 'warnings', $warnings );
+ }
+
+ # Stash the upload in the session
+ $this->upload->stashSession( $this->params['sessionKey'] );
+ session_write_close();
+
+ return true;
+ }
+ }
+
+ # Perform the upload
+ $status = $this->upload->performUpload(
+ $this->params['comment'],
+ $this->params['pageText'],
+ $this->params['watch'],
+ $this->user
+ );
+ $this->leaveMessage( $status );
+ return true;
+
+ }
+
+ /**
+ * Leave a message on the user talk page or in the session according to
+ * $params['leaveMessage'].
+ *
+ * @param $status Status
+ */
+ protected function leaveMessage( $status ) {
+ if ( $this->params['leaveMessage'] ) {
+ if ( $status->isGood() ) {
+ $this->user->leaveUserMessage( wfMsg( 'upload-success-subj' ),
+ wfMsg( 'upload-success-msg',
+ $this->upload->getTitle()->getText(),
+ $this->params['url']
+ ) );
+ } else {
+ $this->user->leaveUserMessage( wfMsg( 'upload-failure-subj' ),
+ wfMsg( 'upload-failure-msg',
+ $status->getWikiText(),
+ $this->params['url']
+ ) );
+ }
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ if ( $status->isOk() ) {
+ $this->storeResultInSession( 'Success',
+ 'filename', $this->upload->getLocalFile()->getName() );
+ } else {
+ $this->storeResultInSession( 'Failure',
+ 'errors', $status->getErrorsArray() );
+ }
+ session_write_close();
+ }
+ }
+
+ /**
+ * Store a result in the session data. Note that the caller is responsible
+ * for appropriate session_start and session_write_close calls.
+ *
+ * @param $result String: the result (Success|Warning|Failure)
+ * @param $dataKey String: the key of the extra data
+ * @param $dataValue Mixed: the extra data itself
+ */
+ protected function storeResultInSession( $result, $dataKey, $dataValue ) {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $session['result'] = $result;
+ $session[$dataKey] = $dataValue;
+ }
+
+ /**
+ * Initialize the session data. Sets the intial result to queued.
+ */
+ public function initializeSessionData() {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $$session['result'] = 'Queued';
+ }
+
+ public static function &getSessionData( $key ) {
+ if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
+ $_SESSION[self::SESSION_KEYNAME][$key] = array();
+ }
+ return $_SESSION[self::SESSION_KEYNAME][$key];
+ }
+}
diff --git a/includes/json/FormatJson.php b/includes/json/FormatJson.php
index 6db4a23f..b7049aeb 100644
--- a/includes/json/FormatJson.php
+++ b/includes/json/FormatJson.php
@@ -1,32 +1,60 @@
<?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
+ *
+ * @file
*/
-if( !(defined( 'MEDIAWIKI' ) ) ) {
+
+if ( !defined( 'MEDIAWIKI' ) ) {
die( 1 );
}
-class FormatJson{
- public static function encode($value, $isHtml=false){
+require_once dirname( __FILE__ ) . '/Services_JSON.php';
+
+class FormatJson {
+
+ /**
+ * Returns the JSON representation of a value.
+ *
+ * @param $value Mixed: the value being encoded. Can be any type except a resource.
+ * @param $isHtml Boolean
+ *
+ * @return string
+ */
+ public static function encode( $value, $isHtml = false ) {
// Some versions of PHP have a broken json_encode, see PHP bug
// 46944. Test encoding an affected character (U+20000) to
// avoid this.
- if (!function_exists('json_encode') || $isHtml || strtolower(json_encode("\xf0\xa0\x80\x80")) != '\ud840\udc00') {
+ if ( !function_exists( 'json_encode' ) || $isHtml || strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '\ud840\udc00' ) {
$json = new Services_JSON();
- return $json->encode($value, $isHtml) ;
+ return $json->encode( $value, $isHtml );
} else {
- return json_encode($value);
+ return json_encode( $value );
}
}
- public static function decode( $value, $assoc=false ){
- if (!function_exists('json_decode') ) {
- $json = new Services_JSON();
- $jsonDec = $json->decode( $value );
+
+ /**
+ * Decodes a JSON string.
+ *
+ * @param $value String: the json string being decoded.
+ * @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
+ *
+ * @return Mixed: the value encoded in json in appropriate PHP type.
+ * Values true, false and null (case-insensitive) are returned as true, false
+ * and &null; respectively. &null; is returned if the json cannot be
+ * decoded or if the encoded data is deeper than the recursion limit.
+ */
+ public static function decode( $value, $assoc = false ) {
+ if ( !function_exists( 'json_decode' ) ) {
if( $assoc )
- $jsonDec = wfObjectToArray( $jsonDec );
+ $json = new Services_JSON( SERVICES_JSON_LOOSE_TYPE );
+ else
+ $json = new Services_JSON();
+ $jsonDec = $json->decode( $value );
return $jsonDec;
} else {
return json_decode( $value, $assoc );
}
}
+
}
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
index 588ece9c..5b4e0503 100644
--- a/includes/json/Services_JSON.php
+++ b/includes/json/Services_JSON.php
@@ -45,12 +45,13 @@
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
+* @file
* @ingroup API
* @author Michal Migurski <mike-json@teczno.com>
* @author Matt Knapp <mdknapp[at]gmail[dot]com>
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
* @copyright 2005 Michal Migurski
-* @version CVS: $Id: Services_JSON.php 79562 2011-01-04 06:15:54Z tstarling $
+* @version CVS: $Id: Services_JSON.php 90492 2011-06-20 22:39:10Z reedy $
* @license http://www.opensource.org/licenses/bsd-license.php
* @see http://pear.php.net/pepr/pepr-proposal-show.php?id=198
*/
@@ -118,7 +119,7 @@ class Services_JSON
/**
* constructs a new JSON instance
*
- * @param int $use object behavior flags; combine with boolean-OR
+ * @param $use Integer: object behavior flags; combine with boolean-OR
*
* possible values:
* - SERVICES_JSON_LOOSE_TYPE: loose typing.
@@ -131,7 +132,7 @@ class Services_JSON
* bubble up with an error, so all return values
* from encode() should be checked with isError()
*/
- function Services_JSON($use = 0)
+ function __construct($use = 0)
{
$this->use = $use;
}
@@ -156,8 +157,8 @@ class Services_JSON
* provides a slower PHP-only method for installations
* that lack the multibye string extension.
*
- * @param string $utf16 UTF-16 character
- * @return string UTF-8 character
+ * @param $utf16 String: UTF-16 character
+ * @return String: UTF-8 character
* @access private
*/
function utf162utf8($utf16)
@@ -211,8 +212,8 @@ class Services_JSON
* provides a slower PHP-only method for installations
* that lack the multibye string extension.
*
- * @param string $utf8 UTF-8 character
- * @return string UTF-16 character
+ * @param $utf8 String: UTF-8 character
+ * @return String: UTF-16 character
* @access private
*/
function utf82utf16($utf8)
@@ -265,11 +266,11 @@ class Services_JSON
/**
* encodes an arbitrary variable into JSON format
*
- * @param mixed $var any number, boolean, string, array, or object to be encoded.
+ * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
* see argument 1 to Services_JSON() above for array-parsing behavior.
* if var is a strng, note that encode() always expects it
* to be in ASCII or UTF-8 format!
- * @param bool $pretty pretty-print output with indents and newlines
+ * @param $pretty Boolean: pretty-print output with indents and newlines
*
* @return mixed JSON string representation of input var or an error if a problem occurs
* @access public
@@ -285,7 +286,7 @@ class Services_JSON
/**
* encodes an arbitrary variable into JSON format
*
- * @param mixed $var any number, boolean, string, array, or object to be encoded.
+ * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
* see argument 1 to Services_JSON() above for array-parsing behavior.
* if var is a strng, note that encode() always expects it
* to be in ASCII or UTF-8 format!
@@ -431,7 +432,7 @@ class Services_JSON
$this->indent--;
foreach($properties as $property) {
- if(Services_JSON::isError($property)) {
+ if($this->isError($property)) {
return $property;
}
}
@@ -445,7 +446,7 @@ class Services_JSON
$this->indent--;
foreach($elements as $element) {
- if(Services_JSON::isError($element)) {
+ if($this->isError($element)) {
return $element;
}
}
@@ -462,7 +463,7 @@ class Services_JSON
$this->indent--;
foreach($properties as $property) {
- if(Services_JSON::isError($property)) {
+ if($this->isError($property)) {
return $property;
}
}
@@ -479,17 +480,17 @@ class Services_JSON
/**
* array-walking function for use in generating JSON-formatted name-value pairs
*
- * @param string $name name of key to use
- * @param mixed $value reference to an array element to be encoded
+ * @param $name String: name of key to use
+ * @param $value Mixed: reference to an array element to be encoded
*
- * @return string JSON-formatted name-value pair, like '"name":value'
+ * @return String: JSON-formatted name-value pair, like '"name":value'
* @access private
*/
function name_value($name, $value)
{
$encoded_value = $this->encode2($value);
- if(Services_JSON::isError($encoded_value)) {
+ if($this->isError($encoded_value)) {
return $encoded_value;
}
@@ -499,9 +500,9 @@ class Services_JSON
/**
* reduce a string by removing leading and trailing comments and whitespace
*
- * @param $str string string value to strip of comments and whitespace
+ * @param $str String: string value to strip of comments and whitespace
*
- * @return string string value stripped of comments and whitespace
+ * @return String: string value stripped of comments and whitespace
* @access private
*/
function reduce_string($str)
@@ -526,7 +527,7 @@ class Services_JSON
/**
* decodes a JSON string into appropriate variable
*
- * @param string $str JSON-formatted string
+ * @param $str String: JSON-formatted string
*
* @return mixed number, boolean, string, array, or object
* corresponding to given JSON input string.
@@ -869,7 +870,12 @@ if (class_exists('PEAR_Error')) {
function Services_JSON_Error($message = 'unknown error', $code = null,
$mode = null, $options = null, $userinfo = null)
{
-
+ $this->message = $message;
+ }
+
+ function __toString()
+ {
+ return $this->message;
}
}
}
diff --git a/includes/libs/CSSJanus.php b/includes/libs/CSSJanus.php
new file mode 100644
index 00000000..aa04bc49
--- /dev/null
+++ b/includes/libs/CSSJanus.php
@@ -0,0 +1,323 @@
+<?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
+ *
+ */
+
+/**
+ * This is a PHP port of CSSJanus, a utility that transforms CSS style sheets
+ * written for LTR to RTL.
+ *
+ * The original Python version of CSSJanus is Copyright 2008 by Google Inc. and
+ * is distributed under the Apache license.
+ *
+ * Original code: http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus.py
+ * License of original code: http://code.google.com/p/cssjanus/source/browse/trunk/LICENSE
+ * @author Roan Kattouw
+ *
+ */
+class CSSJanus {
+ // Patterns defined as null are built dynamically by buildPatterns()
+ private static $patterns = array(
+ 'tmpToken' => '`TMP`',
+ 'nonAscii' => '[\200-\377]',
+ 'unicode' => '(?:(?:\\[0-9a-f]{1,6})(?:\r\n|\s)?)',
+ 'num' => '(?:[0-9]*\.[0-9]+|[0-9]+)',
+ 'unit' => '(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)',
+ 'body_selector' => 'body\s*{\s*',
+ 'direction' => 'direction\s*:\s*',
+ 'escape' => null,
+ 'nmstart' => null,
+ 'nmchar' => null,
+ 'ident' => null,
+ 'quantity' => null,
+ 'possibly_negative_quantity' => null,
+ 'color' => null,
+ 'url_special_chars' => '[!#$%&*-~]',
+ 'valid_after_uri_chars' => '[\'\"]?\s*',
+ 'url_chars' => null,
+ 'lookahead_not_open_brace' => null,
+ 'lookahead_not_closing_paren' => null,
+ 'lookahead_for_closing_paren' => null,
+ 'lookbehind_not_letter' => '(?<![a-zA-Z])',
+ 'chars_within_selector' => '[^\}]*?',
+ 'noflip_annotation' => '\/\*\s*@noflip\s*\*\/',
+ 'noflip_single' => null,
+ 'noflip_class' => null,
+ 'comment' => '/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//',
+ 'direction_ltr' => null,
+ 'direction_rtl' => null,
+ 'left' => null,
+ 'right' => null,
+ 'left_in_url' => null,
+ 'right_in_url' => null,
+ 'ltr_in_url' => null,
+ 'rtl_in_url' => null,
+ 'cursor_east' => null,
+ 'cursor_west' => null,
+ 'four_notation_quantity' => null,
+ 'four_notation_color' => null,
+ 'bg_horizontal_percentage' => null,
+ 'bg_horizontal_percentage_x' => null,
+ );
+
+ /**
+ * Build patterns we can't define above because they depend on other patterns.
+ */
+ private static function buildPatterns() {
+ if ( !is_null( self::$patterns['escape'] ) ) {
+ // Patterns have already been built
+ return;
+ }
+
+ $patterns =& self::$patterns;
+ $patterns['escape'] = "(?:{$patterns['unicode']}|\\[^\r\n\f0-9a-f])";
+ $patterns['nmstart'] = "(?:[_a-z]|{$patterns['nonAscii']}|{$patterns['escape']})";
+ $patterns['nmchar'] = "(?:[_a-z0-9-]|{$patterns['nonAscii']}|{$patterns['escape']})";
+ $patterns['ident'] = "-?{$patterns['nmstart']}{$patterns['nmchar']}*";
+ $patterns['quantity'] = "{$patterns['num']}(?:\s*{$patterns['unit']}|{$patterns['ident']})?";
+ $patterns['possibly_negative_quantity'] = "((?:-?{$patterns['quantity']})|(?:inherit|auto))";
+ $patterns['color'] = "(#?{$patterns['nmchar']}+)";
+ $patterns['url_chars'] = "(?:{$patterns['url_special_chars']}|{$patterns['nonAscii']}|{$patterns['escape']})*";
+ $patterns['lookahead_not_open_brace'] = "(?!({$patterns['nmchar']}|\r?\n|\s|#|\:|\.|\,|\+|>)*?{)";
+ $patterns['lookahead_not_closing_paren'] = "(?!{$patterns['url_chars']}?{$patterns['valid_after_uri_chars']}\))";
+ $patterns['lookahead_for_closing_paren'] = "(?={$patterns['url_chars']}?{$patterns['valid_after_uri_chars']}\))";
+ $patterns['noflip_single'] = "/({$patterns['noflip_annotation']}{$patterns['lookahead_not_open_brace']}[^;}]+;?)/i";
+ $patterns['noflip_class'] = "/({$patterns['noflip_annotation']}{$patterns['chars_within_selector']}})/i";
+ $patterns['direction_ltr'] = "/({$patterns['direction']})ltr/i";
+ $patterns['direction_rtl'] = "/({$patterns['direction']})rtl/i";
+ $patterns['left'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
+ $patterns['right'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
+ $patterns['left_in_url'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_for_closing_paren']}/i";
+ $patterns['right_in_url'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_for_closing_paren']}/i";
+ $patterns['ltr_in_url'] = "/{$patterns['lookbehind_not_letter']}(ltr){$patterns['lookahead_for_closing_paren']}/i";
+ $patterns['rtl_in_url'] = "/{$patterns['lookbehind_not_letter']}(rtl){$patterns['lookahead_for_closing_paren']}/i";
+ $patterns['cursor_east'] = "/{$patterns['lookbehind_not_letter']}([ns]?)e-resize/";
+ $patterns['cursor_west'] = "/{$patterns['lookbehind_not_letter']}([ns]?)w-resize/";
+ $patterns['four_notation_quantity'] = "/{$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}/i";
+ $patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}/i";
+ // The two regexes below are parenthesized differently then in the original implementation to make the
+ // callback's job more straightforward
+ $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)({$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
+ $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)({$patterns['num']})(%)/";
+ }
+
+ /**
+ * Transform an LTR stylesheet to RTL
+ * @param $css String: stylesheet to transform
+ * @param $swapLtrRtlInURL Boolean: If true, swap 'ltr' and 'rtl' in URLs
+ * @param $swapLeftRightInURL Boolean: If true, swap 'left' and 'right' in URLs
+ * @return Transformed stylesheet
+ */
+ public static function transform( $css, $swapLtrRtlInURL = false, $swapLeftRightInURL = false ) {
+ // We wrap tokens in ` , not ~ like the original implementation does.
+ // This was done because ` is not a legal character in CSS and can only
+ // occur in URLs, where we escape it to %60 before inserting our tokens.
+ $css = str_replace( '`', '%60', $css );
+
+ self::buildPatterns();
+
+ // Tokenize single line rules with /* @noflip */
+ $noFlipSingle = new CSSJanus_Tokenizer( self::$patterns['noflip_single'], '`NOFLIP_SINGLE`' );
+ $css = $noFlipSingle->tokenize( $css );
+
+ // Tokenize class rules with /* @noflip */
+ $noFlipClass = new CSSJanus_Tokenizer( self::$patterns['noflip_class'], '`NOFLIP_CLASS`' );
+ $css = $noFlipClass->tokenize( $css );
+
+ // Tokenize comments
+ $comments = new CSSJanus_Tokenizer( self::$patterns['comment'], '`C`' );
+ $css = $comments->tokenize( $css );
+
+ // LTR->RTL fixes start here
+ $css = self::fixDirection( $css );
+ if ( $swapLtrRtlInURL ) {
+ $css = self::fixLtrRtlInURL( $css );
+ }
+
+ if ( $swapLeftRightInURL ) {
+ $css = self::fixLeftRightInURL( $css );
+ }
+ $css = self::fixLeftAndRight( $css );
+ $css = self::fixCursorProperties( $css );
+ $css = self::fixFourPartNotation( $css );
+ $css = self::fixBackgroundPosition( $css );
+
+ // Detokenize stuff we tokenized before
+ $css = $comments->detokenize( $css );
+ $css = $noFlipClass->detokenize( $css );
+ $css = $noFlipSingle->detokenize( $css );
+
+ return $css;
+ }
+
+ /**
+ * Replace direction: ltr; with direction: rtl; and vice versa.
+ *
+ * The original implementation only does this inside body selectors
+ * and misses "body\n{\ndirection:ltr;\n}". This function does not have
+ * these problems.
+ *
+ * See http://code.google.com/p/cssjanus/issues/detail?id=15 and
+ * TODO: URL
+ */
+ private static function fixDirection( $css ) {
+ $css = preg_replace( self::$patterns['direction_ltr'],
+ '$1' . self::$patterns['tmpToken'], $css );
+ $css = preg_replace( self::$patterns['direction_rtl'], '$1ltr', $css );
+ $css = str_replace( self::$patterns['tmpToken'], 'rtl', $css );
+
+ return $css;
+ }
+
+ /**
+ * Replace 'ltr' with 'rtl' and vice versa in background URLs
+ */
+ private static function fixLtrRtlInURL( $css ) {
+ $css = preg_replace( self::$patterns['ltr_in_url'], self::$patterns['tmpToken'], $css );
+ $css = preg_replace( self::$patterns['rtl_in_url'], 'ltr', $css );
+ $css = str_replace( self::$patterns['tmpToken'], 'rtl', $css );
+
+ return $css;
+ }
+
+ /**
+ * Replace 'left' with 'right' and vice versa in background URLs
+ */
+ private static function fixLeftRightInURL( $css ) {
+ $css = preg_replace( self::$patterns['left_in_url'], self::$patterns['tmpToken'], $css );
+ $css = preg_replace( self::$patterns['right_in_url'], 'left', $css );
+ $css = str_replace( self::$patterns['tmpToken'], 'right', $css );
+
+ return $css;
+ }
+
+ /**
+ * Flip rules like left: , padding-right: , etc.
+ */
+ private static function fixLeftAndRight( $css ) {
+ $css = preg_replace( self::$patterns['left'], self::$patterns['tmpToken'], $css );
+ $css = preg_replace( self::$patterns['right'], 'left', $css );
+ $css = str_replace( self::$patterns['tmpToken'], 'right', $css );
+
+ return $css;
+ }
+
+ /**
+ * Flip East and West in rules like cursor: nw-resize;
+ */
+ private static function fixCursorProperties( $css ) {
+ $css = preg_replace( self::$patterns['cursor_east'],
+ '$1' . self::$patterns['tmpToken'], $css );
+ $css = preg_replace( self::$patterns['cursor_west'], '$1e-resize', $css );
+ $css = str_replace( self::$patterns['tmpToken'], 'w-resize', $css );
+
+ return $css;
+ }
+
+ /**
+ * Swap the second and fourth parts in four-part notation rules like
+ * padding: 1px 2px 3px 4px;
+ *
+ * Unlike the original implementation, this function doesn't suffer from
+ * the bug where whitespace is not preserved when flipping four-part rules
+ * and four-part color rules with multiple whitespace characters between
+ * colors are not recognized.
+ * See http://code.google.com/p/cssjanus/issues/detail?id=16
+ */
+ private static function fixFourPartNotation( $css ) {
+ $css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$7$4$5$6$3', $css );
+ $css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4', $css );
+
+ return $css;
+ }
+
+ /**
+ * Flip horizontal background percentages.
+ */
+ private static function fixBackgroundPosition( $css ) {
+ $css = preg_replace_callback( self::$patterns['bg_horizontal_percentage'],
+ array( 'self', 'calculateNewBackgroundPosition' ), $css );
+ $css = preg_replace_callback( self::$patterns['bg_horizontal_percentage_x'],
+ array( 'self', 'calculateNewBackgroundPosition' ), $css );
+
+ return $css;
+ }
+
+ /**
+ * Callback for calculateNewBackgroundPosition()
+ */
+ private static function calculateNewBackgroundPosition( $matches ) {
+ return $matches[1] . ( 100 - $matches[2] ) . $matches[3];
+ }
+}
+
+/**
+ * Utility class used by CSSJanus that tokenizes and untokenizes things we want
+ * to protect from being janused.
+ * @author Roan Kattouw
+ */
+class CSSJanus_Tokenizer {
+ private $regex, $token;
+ private $originals;
+
+ /**
+ * Constructor
+ * @param $regex string Regular expression whose matches to replace by a token.
+ * @param $token string Token
+ */
+ public function __construct( $regex, $token ) {
+ $this->regex = $regex;
+ $this->token = $token;
+ $this->originals = array();
+ }
+
+ /**
+ * Replace all occurrences of $regex in $str with a token and remember
+ * the original strings.
+ * @param $str String to tokenize
+ * @return string Tokenized string
+ */
+ public function tokenize( $str ) {
+ return preg_replace_callback( $this->regex, array( $this, 'tokenizeCallback' ), $str );
+ }
+
+ private function tokenizeCallback( $matches ) {
+ $this->originals[] = $matches[0];
+ return $this->token;
+ }
+
+ /**
+ * Replace tokens with their originals. If multiple strings were tokenized, it's important they be
+ * detokenized in exactly the SAME ORDER.
+ * @param $str String: previously run through tokenize()
+ * @return string Original string
+ */
+ public function detokenize( $str ) {
+ // PHP has no function to replace only the first occurrence or to
+ // replace occurrences of the same string with different values,
+ // so we use preg_replace_callback() even though we don't really need a regex
+ return preg_replace_callback( '/' . preg_quote( $this->token, '/' ) . '/',
+ array( $this, 'detokenizeCallback' ), $str );
+ }
+
+ private function detokenizeCallback( $matches ) {
+ $retval = current( $this->originals );
+ next( $this->originals );
+
+ return $retval;
+ }
+}
diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php
new file mode 100644
index 00000000..c0e78112
--- /dev/null
+++ b/includes/libs/CSSMin.php
@@ -0,0 +1,214 @@
+<?php
+/*
+ * Copyright 2010 Wikimedia Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * 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
+ * @author Trevor Parscal <tparscal@wikimedia.org>
+ * @copyright Copyright 2010 Wikimedia Foundation
+ * @license http://www.apache.org/licenses/LICENSE-2.0
+ */
+class CSSMin {
+
+ /* Constants */
+
+ /**
+ * Maximum file size to still qualify for in-line embedding as a data-URI
+ *
+ * 24,576 is used because Internet Explorer has a 32,768 byte limit for data URIs,
+ * which when base64 encoded will result in a 1/3 increase in size.
+ */
+ const EMBED_SIZE_LIMIT = 24576;
+ const URL_REGEX = 'url\(\s*[\'"]?(?P<file>[^\?\)\'"]*)(?P<query>\??[^\)\'"]*)[\'"]?\s*\)';
+
+ /* Protected Static Members */
+
+ /** @var array List of common image files extensions and mime-types */
+ protected static $mimeTypes = array(
+ 'gif' => 'image/gif',
+ 'jpe' => 'image/jpeg',
+ 'jpeg' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'png' => 'image/png',
+ 'tif' => 'image/tiff',
+ 'tiff' => 'image/tiff',
+ 'xbm' => 'image/x-xbitmap',
+ );
+
+ /* Static Methods */
+
+ /**
+ * Gets a list of local file paths which are referenced in a CSS style sheet
+ *
+ * @param $source string CSS data to remap
+ * @param $path string File path where the source was read from (optional)
+ * @return array List of local file references
+ */
+ public static function getLocalFileReferences( $source, $path = null ) {
+ $files = array();
+ $rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER;
+ if ( preg_match_all( '/' . self::URL_REGEX . '/', $source, $matches, $rFlags ) ) {
+ foreach ( $matches as $match ) {
+ $file = ( isset( $path )
+ ? rtrim( $path, '/' ) . '/'
+ : '' ) . "{$match['file'][0]}";
+
+ // Only proceed if we can access the file
+ if ( !is_null( $path ) && file_exists( $file ) ) {
+ $files[] = $file;
+ }
+ }
+ }
+ return $files;
+ }
+
+ protected static function getMimeType( $file ) {
+ $realpath = realpath( $file );
+ // Try a couple of different ways to get the mime-type of a file, in order of
+ // preference
+ if (
+ $realpath
+ && function_exists( 'finfo_file' )
+ && function_exists( 'finfo_open' )
+ && defined( 'FILEINFO_MIME_TYPE' )
+ ) {
+ // As of PHP 5.3, this is how you get the mime-type of a file; it uses the Fileinfo
+ // PECL extension
+ return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
+ } else if ( function_exists( 'mime_content_type' ) ) {
+ // Before this was deprecated in PHP 5.3, this was how you got the mime-type of a file
+ return mime_content_type( $file );
+ } else {
+ // Worst-case scenario has happened, use the file extension to infer the mime-type
+ $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
+ if ( isset( self::$mimeTypes[$ext] ) ) {
+ return self::$mimeTypes[$ext];
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Remaps CSS URL paths and automatically embeds data URIs for URL rules
+ * preceded by an /* @embed * / comment
+ *
+ * @param $source string CSS data to remap
+ * @param $local string File path where the source was read from
+ * @param $remote string URL path to the file
+ * @param $embed ???
+ * @return string Remapped CSS data
+ */
+ public static function remap( $source, $local, $remote, $embed = true ) {
+ $pattern = '/((?P<embed>\s*\/\*\s*\@embed\s*\*\/)(?P<pre>[^\;\}]*))?' .
+ self::URL_REGEX . '(?P<post>[^;]*)[\;]?/';
+ $offset = 0;
+ while ( preg_match( $pattern, $source, $match, PREG_OFFSET_CAPTURE, $offset ) ) {
+ // Skip fully-qualified URLs and data URIs
+ $urlScheme = parse_url( $match['file'][0], PHP_URL_SCHEME );
+ if ( $urlScheme ) {
+ // Move the offset to the end of the match, leaving it alone
+ $offset = $match[0][1] + strlen( $match[0][0] );
+ continue;
+ }
+ // URLs with absolute paths like /w/index.php need to be expanded
+ // to absolute URLs but otherwise left alone
+ if ( $match['file'][0] !== '' && $match['file'][0][0] === '/' ) {
+ // Replace the file path with an expanded URL
+ $source = substr_replace( $source, wfExpandUrl( $match['file'][0] ),
+ $match['file'][1], strlen( $match['file'][0] )
+ );
+ // Move the offset to the end of the match, leaving it alone
+ $offset = $match[0][1] + strlen( $match[0][0] );
+ continue;
+ }
+ // Shortcuts
+ $embed = $match['embed'][0];
+ $pre = $match['pre'][0];
+ $post = $match['post'][0];
+ $query = $match['query'][0];
+ $url = "{$remote}/{$match['file'][0]}";
+ $file = "{$local}/{$match['file'][0]}";
+ // bug 27052 - Guard against double slashes, because foo//../bar
+ // apparently resolves to foo/bar on (some?) clients
+ $url = preg_replace( '#([^:])//+#', '\1/', $url );
+ $replacement = false;
+ if ( $local !== false && file_exists( $file ) ) {
+ // Add version parameter as a time-stamp in ISO 8601 format,
+ // using Z for the timezone, meaning GMT
+ $url .= '?' . gmdate( 'Y-m-d\TH:i:s\Z', round( filemtime( $file ), -2 ) );
+ // Embedding requires a bit of extra processing, so let's skip that if we can
+ if ( $embed ) {
+ $type = self::getMimeType( $file );
+ // Detect when URLs were preceeded with embed tags, and also verify file size is
+ // below the limit
+ if (
+ $type
+ && $match['embed'][1] > 0
+ && filesize( $file ) < self::EMBED_SIZE_LIMIT
+ ) {
+ // Strip off any trailing = symbols (makes browsers freak out)
+ $data = base64_encode( file_get_contents( $file ) );
+ // Build 2 CSS properties; one which uses a base64 encoded data URI in place
+ // of the @embed comment to try and retain line-number integrity, and the
+ // other with a remapped an versioned URL and an Internet Explorer hack
+ // making it ignored in all browsers that support data URIs
+ $replacement = "{$pre}url(data:{$type};base64,{$data}){$post};";
+ $replacement .= "{$pre}url({$url}){$post}!ie;";
+ }
+ }
+ if ( $replacement === false ) {
+ // Assume that all paths are relative to $remote, and make them absolute
+ $replacement = "{$embed}{$pre}url({$url}){$post};";
+ }
+ } else if ( $local === false ) {
+ // Assume that all paths are relative to $remote, and make them absolute
+ $replacement = "{$embed}{$pre}url({$url}{$query}){$post};";
+ }
+ if ( $replacement !== false ) {
+ // Perform replacement on the source
+ $source = substr_replace(
+ $source, $replacement, $match[0][1], strlen( $match[0][0] )
+ );
+ // Move the offset to the end of the replacement in the source
+ $offset = $match[0][1] + strlen( $replacement );
+ continue;
+ }
+ // Move the offset to the end of the match, leaving it alone
+ $offset = $match[0][1] + strlen( $match[0][0] );
+ }
+ return $source;
+ }
+
+ /**
+ * Removes whitespace from CSS data
+ *
+ * @param $css string CSS data to minify
+ * @return string Minified CSS data
+ */
+ public static function minify( $css ) {
+ return trim(
+ str_replace(
+ array( '; ', ': ', ' {', '{ ', ', ', '} ', ';}' ),
+ array( ';', ':', '{', '{', ',', '}', '}' ),
+ preg_replace( array( '/\s+/', '/\/\*.*?\*\//s' ), array( ' ', '' ), $css )
+ )
+ );
+ }
+}
diff --git a/includes/IEContentAnalyzer.php b/includes/libs/IEContentAnalyzer.php
index df4d36f0..a2ef1a09 100644
--- a/includes/IEContentAnalyzer.php
+++ b/includes/libs/IEContentAnalyzer.php
@@ -323,11 +323,11 @@ class IEContentAnalyzer {
* Get the MIME types from getMimesFromData(), but convert the result from IE's
* idiosyncratic private types into something other apps will understand.
*
- * @param string $fileName The file name (unused at present)
- * @param string $chunk The first 256 bytes of the file
- * @param string $proposed The MIME type proposed by the server
+ * @param $fileName String: the file name (unused at present)
+ * @param $chunk String: the first 256 bytes of the file
+ * @param $proposed String: the MIME type proposed by the server
*
- * @return array Map of IE version to detected mime type
+ * @return Array: map of IE version to detected mime type
*/
public function getRealMimesFromData( $fileName, $chunk, $proposed ) {
$types = $this->getMimesFromData( $fileName, $chunk, $proposed );
@@ -359,11 +359,11 @@ class IEContentAnalyzer {
/**
* Get the untranslated MIME types for all known versions
*
- * @param string $fileName The file name (unused at present)
- * @param string $chunk The first 256 bytes of the file
- * @param string $proposed The MIME type proposed by the server
+ * @param $fileName String: the file name (unused at present)
+ * @param $chunk String: the first 256 bytes of the file
+ * @param $proposed String: the MIME type proposed by the server
*
- * @return array Map of IE version to detected mime type
+ * @return Array: map of IE version to detected mime type
*/
public function getMimesFromData( $fileName, $chunk, $proposed ) {
$types = array();
diff --git a/includes/libs/IEUrlExtension.php b/includes/libs/IEUrlExtension.php
new file mode 100644
index 00000000..100454d4
--- /dev/null
+++ b/includes/libs/IEUrlExtension.php
@@ -0,0 +1,247 @@
+<?php
+
+/**
+ * Internet Explorer derives a cache filename from a URL, and then in certain
+ * circumstances, uses the extension of the resulting file to determine the
+ * content type of the data, ignoring the Content-Type header.
+ *
+ * This can be a problem, especially when non-HTML content is sent by MediaWiki,
+ * and Internet Explorer interprets it as HTML, exposing an XSS vulnerability.
+ *
+ * Usually the script filename (e.g. api.php) is present in the URL, and this
+ * makes Internet Explorer think the extension is a harmless script extension.
+ * But Internet Explorer 6 and earlier allows the script extension to be
+ * obscured by encoding the dot as "%2E".
+ *
+ * This class contains functions which help in detecting and dealing with this
+ * situation.
+ *
+ * Checking the URL for a bad extension is somewhat complicated due to the fact
+ * that CGI doesn't provide a standard method to determine the URL. Instead it
+ * is necessary to pass a subset of $_SERVER variables, which we then attempt
+ * to use to guess parts of the URL.
+ */
+class IEUrlExtension {
+ /**
+ * Check a subset of $_SERVER (or the whole of $_SERVER if you like)
+ * to see if it indicates that the request was sent with a bad file
+ * extension. Returns true if the request should be denied or modified,
+ * false otherwise. The relevant $_SERVER elements are:
+ *
+ * - SERVER_SOFTWARE
+ * - REQUEST_URI
+ * - QUERY_STRING
+ * - PATH_INFO
+ *
+ * If the a variable is unset in $_SERVER, it should be unset in $vars.
+ *
+ * @param $vars A subset of $_SERVER.
+ * @param $extWhitelist Extensions which are allowed, assumed harmless.
+ */
+ public static function areServerVarsBad( $vars, $extWhitelist = array() ) {
+ // Check QUERY_STRING or REQUEST_URI
+ if ( isset( $vars['SERVER_SOFTWARE'] )
+ && isset( $vars['REQUEST_URI'] )
+ && self::haveUndecodedRequestUri( $vars['SERVER_SOFTWARE'] ) )
+ {
+ $urlPart = $vars['REQUEST_URI'];
+ } elseif ( isset( $vars['QUERY_STRING'] ) ) {
+ $urlPart = $vars['QUERY_STRING'];
+ } else {
+ $urlPart = '';
+ }
+
+ if ( self::isUrlExtensionBad( $urlPart, $extWhitelist ) ) {
+ return true;
+ }
+
+ // Some servers have PATH_INFO but not REQUEST_URI, so we check both
+ // to be on the safe side.
+ if ( isset( $vars['PATH_INFO'] )
+ && self::isUrlExtensionBad( $vars['PATH_INFO'], $extWhitelist ) )
+ {
+ return true;
+ }
+
+ // All checks passed
+ return false;
+ }
+
+ /**
+ * Given a right-hand portion of a URL, determine whether IE would detect
+ * a potentially harmful file extension.
+ *
+ * @param $urlPart The right-hand portion of a URL
+ * @param $extWhitelist An array of file extensions which may occur in this
+ * URL, and which should be allowed.
+ * @return bool
+ */
+ public static function isUrlExtensionBad( $urlPart, $extWhitelist = array() ) {
+ if ( strval( $urlPart ) === '' ) {
+ return false;
+ }
+
+ $extension = self::findIE6Extension( $urlPart );
+ if ( strval( $extension ) === '' ) {
+ // No extension or empty extension
+ return false;
+ }
+
+ if ( in_array( $extension, array( 'php', 'php5' ) ) ) {
+ // Script extension, OK
+ return false;
+ }
+ if ( in_array( $extension, $extWhitelist ) ) {
+ // Whitelisted extension
+ return false;
+ }
+
+ if ( !preg_match( '/^[a-zA-Z0-9_-]+$/', $extension ) ) {
+ // Non-alphanumeric extension, unlikely to be registered.
+ //
+ // The regex above is known to match all registered file extensions
+ // in a default Windows XP installation. It's important to allow
+ // extensions with ampersands and percent signs, since that reduces
+ // the number of false positives substantially.
+ return false;
+ }
+
+ // Possibly bad extension
+ return true;
+ }
+
+ /**
+ * Returns a variant of $url which will pass isUrlExtensionBad() but has the
+ * same GET parameters, or false if it can't figure one out.
+ */
+ public static function fixUrlForIE6( $url, $extWhitelist = array() ) {
+ $questionPos = strpos( $url, '?' );
+ if ( $questionPos === false ) {
+ $beforeQuery = $url . '?';
+ $query = '';
+ } elseif ( $questionPos === strlen( $url ) - 1 ) {
+ $beforeQuery = $url;
+ $query = '';
+ } else {
+ $beforeQuery = substr( $url, 0, $questionPos + 1 );
+ $query = substr( $url, $questionPos + 1 );
+ }
+
+ // Multiple question marks cause problems. Encode the second and
+ // subsequent question mark.
+ $query = str_replace( '?', '%3E', $query );
+ // Append an invalid path character so that IE6 won't see the end of the
+ // query string as an extension
+ $query .= '&*';
+ // Put the URL back together
+ $url = $beforeQuery . $query;
+ if ( self::isUrlExtensionBad( $url, $extWhitelist ) ) {
+ // Avoid a redirect loop
+ return false;
+ }
+ return $url;
+ }
+
+ /**
+ * Determine what extension IE6 will infer from a certain query string.
+ * If the URL has an extension before the question mark, IE6 will use
+ * that and ignore the query string, but per the comment at
+ * isPathInfoBad() we don't have a reliable way to determine the URL,
+ * so isPathInfoBad() just passes in the query string for $url.
+ * All entry points have safe extensions (php, php5) anyway, so
+ * checking the query string is possibly overly paranoid but never
+ * insecure.
+ *
+ * The criteria for finding an extension are as follows:
+ * - a possible extension is a dot followed by one or more characters not
+ * in <>\"/:|?.#
+ * - if we find a possible extension followed by the end of the string or
+ * a #, that's our extension
+ * - if we find a possible extension followed by a ?, that's our extension
+ * - UNLESS it's exe, dll or cgi, in which case we ignore it and continue
+ * searching for another possible extension
+ * - if we find a possible extension followed by a dot or another illegal
+ * character, we ignore it and continue searching
+ *
+ * @param $url string URL
+ * @return mixed Detected extension (string), or false if none found
+ */
+ public static function findIE6Extension( $url ) {
+ $pos = 0;
+ $hashPos = strpos( $url, '#' );
+ if ( $hashPos !== false ) {
+ $urlLength = $hashPos;
+ } else {
+ $urlLength = strlen( $url );
+ }
+ $remainingLength = $urlLength;
+ while ( $remainingLength > 0 ) {
+ // Skip ahead to the next dot
+ $pos += strcspn( $url, '.', $pos, $remainingLength );
+ if ( $pos >= $urlLength ) {
+ // End of string, we're done
+ return false;
+ }
+
+ // We found a dot. Skip past it
+ $pos++;
+ $remainingLength = $urlLength - $pos;
+
+ // Check for illegal characters in our prospective extension,
+ // or for another dot
+ $nextPos = $pos + strcspn( $url, "<>\\\"/:|?*.", $pos, $remainingLength );
+ if ( $nextPos >= $urlLength ) {
+ // No illegal character or next dot
+ // We have our extension
+ return substr( $url, $pos, $urlLength - $pos );
+ }
+ if ( $url[$nextPos] === '?' ) {
+ // We've found a legal extension followed by a question mark
+ // If the extension is NOT exe, dll or cgi, return it
+ $extension = substr( $url, $pos, $nextPos - $pos );
+ if ( strcasecmp( $extension, 'exe' ) && strcasecmp( $extension, 'dll' ) &&
+ strcasecmp( $extension, 'cgi' ) )
+ {
+ return $extension;
+ }
+ // Else continue looking
+ }
+ // We found an illegal character or another dot
+ // Skip to that character and continue the loop
+ $pos = $nextPos + 1;
+ $remainingLength = $urlLength - $pos;
+ }
+ return false;
+ }
+
+ /**
+ * When passed the value of $_SERVER['SERVER_SOFTWARE'], this function
+ * returns true if that server is known to have a REQUEST_URI variable
+ * with %2E not decoded to ".". On such a server, it is possible to detect
+ * whether the script filename has been obscured.
+ *
+ * The function returns false if the server is not known to have this
+ * behaviour. Microsoft IIS in particular is known to decode escaped script
+ * filenames.
+ *
+ * SERVER_SOFTWARE typically contains either a plain string such as "Zeus",
+ * or a specification in the style of a User-Agent header, such as
+ * "Apache/1.3.34 (Unix) mod_ssl/2.8.25 OpenSSL/0.9.8a PHP/4.4.2"
+ *
+ * @param $serverSoftware
+ * @return bool
+ *
+ */
+ public static function haveUndecodedRequestUri( $serverSoftware ) {
+ static $whitelist = array(
+ 'Apache',
+ 'Zeus',
+ 'LiteSpeed' );
+ if ( preg_match( '/^(.*?)($|\/| )/', $serverSoftware, $m ) ) {
+ return in_array( $m[1], $whitelist );
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/includes/libs/JavaScriptMinifier.php b/includes/libs/JavaScriptMinifier.php
new file mode 100644
index 00000000..a991d915
--- /dev/null
+++ b/includes/libs/JavaScriptMinifier.php
@@ -0,0 +1,579 @@
+<?php
+/**
+ * JavaScript Minifier
+ *
+ * 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 */
+ /* Parsing states.
+ * The state machine is only necessary to decide whether to parse a slash as division
+ * operator or as regexp literal.
+ * States are named after the next expected item. We only distinguish states when the
+ * distinction is relevant for our purpose.
+ */
+ const STATEMENT = 0;
+ const CONDITION = 1;
+ const PROPERTY_ASSIGNMENT = 2;
+ const EXPRESSION = 3;
+ const EXPRESSION_NO_NL = 4; // only relevant for semicolon insertion
+ const EXPRESSION_OP = 5;
+ const EXPRESSION_FUNC = 6;
+ const EXPRESSION_TERNARY = 7; // used to determine the role of a colon
+ const EXPRESSION_TERNARY_OP = 8;
+ const EXPRESSION_TERNARY_FUNC = 9;
+ const PAREN_EXPRESSION = 10; // expression which is not on the top level
+ const PAREN_EXPRESSION_OP = 11;
+ const PAREN_EXPRESSION_FUNC = 12;
+ const PROPERTY_EXPRESSION = 13; // expression which is within an object literal
+ const PROPERTY_EXPRESSION_OP = 14;
+ const PROPERTY_EXPRESSION_FUNC = 15;
+
+ /* Token types */
+ const TYPE_UN_OP = 1; // unary operators
+ const TYPE_INCR_OP = 2; // ++ and --
+ const TYPE_BIN_OP = 3; // binary operators
+ const TYPE_ADD_OP = 4; // + and - which can be either unary or binary ops
+ const TYPE_HOOK = 5; // ?
+ const TYPE_COLON = 6; // :
+ const TYPE_COMMA = 7; // ,
+ const TYPE_SEMICOLON = 8; // ;
+ const TYPE_BRACE_OPEN = 9; // {
+ const TYPE_BRACE_CLOSE = 10; // }
+ const TYPE_PAREN_OPEN = 11; // ( and [
+ const TYPE_PAREN_CLOSE = 12; // ) and ]
+ const TYPE_RETURN = 13; // keywords: break, continue, return, throw
+ const TYPE_IF = 14; // keywords: catch, for, with, switch, while, if
+ const TYPE_DO = 15; // keywords: case, var, finally, else, do, try
+ const TYPE_FUNC = 16; // keywords: function
+ const TYPE_LITERAL = 17; // all literals, identifiers and unrecognised tokens
+
+ // Sanity limit to avoid excessive memory usage
+ const STACK_LIMIT = 1000;
+
+ /* Static functions */
+
+ /**
+ * Returns minified JavaScript code.
+ *
+ * NOTE: $maxLineLength isn't a strict maximum. Longer lines will be produced when
+ * literals (e.g. quoted strings) longer than $maxLineLength are encountered
+ * or when required to guard against semicolon insertion.
+ *
+ * @param $s String JavaScript code to minify
+ * @param $statementsOnOwnLine Bool Whether to put each statement on its own line
+ * @param $maxLineLength Int Maximum length of a single line, or -1 for no maximum.
+ * @return String Minified code
+ */
+ public static function minify( $s, $statementsOnOwnLine = false, $maxLineLength = 1000 ) {
+ // First we declare a few tables that contain our parsing rules
+
+ // $opChars : characters, which can be combined without whitespace in between them
+ $opChars = array(
+ '!' => true,
+ '"' => true,
+ '%' => true,
+ '&' => true,
+ "'" => true,
+ '(' => true,
+ ')' => true,
+ '*' => true,
+ '+' => true,
+ ',' => true,
+ '-' => true,
+ '.' => true,
+ '/' => true,
+ ':' => true,
+ ';' => true,
+ '<' => true,
+ '=' => true,
+ '>' => true,
+ '?' => true,
+ '[' => true,
+ ']' => true,
+ '^' => true,
+ '{' => true,
+ '|' => true,
+ '}' => true,
+ '~' => true
+ );
+
+ // $tokenTypes : maps keywords and operators to their corresponding token type
+ $tokenTypes = array(
+ '!' => self::TYPE_UN_OP,
+ '~' => self::TYPE_UN_OP,
+ 'delete' => self::TYPE_UN_OP,
+ 'new' => self::TYPE_UN_OP,
+ 'typeof' => self::TYPE_UN_OP,
+ 'void' => self::TYPE_UN_OP,
+ '++' => self::TYPE_INCR_OP,
+ '--' => self::TYPE_INCR_OP,
+ '!=' => self::TYPE_BIN_OP,
+ '!==' => self::TYPE_BIN_OP,
+ '%' => self::TYPE_BIN_OP,
+ '%=' => self::TYPE_BIN_OP,
+ '&' => self::TYPE_BIN_OP,
+ '&&' => self::TYPE_BIN_OP,
+ '&=' => self::TYPE_BIN_OP,
+ '*' => self::TYPE_BIN_OP,
+ '*=' => self::TYPE_BIN_OP,
+ '+=' => self::TYPE_BIN_OP,
+ '-=' => self::TYPE_BIN_OP,
+ '.' => self::TYPE_BIN_OP,
+ '/' => self::TYPE_BIN_OP,
+ '/=' => self::TYPE_BIN_OP,
+ '<' => self::TYPE_BIN_OP,
+ '<<' => self::TYPE_BIN_OP,
+ '<<=' => self::TYPE_BIN_OP,
+ '<=' => self::TYPE_BIN_OP,
+ '=' => self::TYPE_BIN_OP,
+ '==' => self::TYPE_BIN_OP,
+ '===' => self::TYPE_BIN_OP,
+ '>' => self::TYPE_BIN_OP,
+ '>=' => self::TYPE_BIN_OP,
+ '>>' => self::TYPE_BIN_OP,
+ '>>=' => self::TYPE_BIN_OP,
+ '>>>' => self::TYPE_BIN_OP,
+ '>>>=' => self::TYPE_BIN_OP,
+ '^' => self::TYPE_BIN_OP,
+ '^=' => self::TYPE_BIN_OP,
+ '|' => self::TYPE_BIN_OP,
+ '|=' => self::TYPE_BIN_OP,
+ '||' => self::TYPE_BIN_OP,
+ 'in' => self::TYPE_BIN_OP,
+ 'instanceof' => self::TYPE_BIN_OP,
+ '+' => self::TYPE_ADD_OP,
+ '-' => self::TYPE_ADD_OP,
+ '?' => self::TYPE_HOOK,
+ ':' => self::TYPE_COLON,
+ ',' => self::TYPE_COMMA,
+ ';' => self::TYPE_SEMICOLON,
+ '{' => self::TYPE_BRACE_OPEN,
+ '}' => self::TYPE_BRACE_CLOSE,
+ '(' => self::TYPE_PAREN_OPEN,
+ '[' => self::TYPE_PAREN_OPEN,
+ ')' => self::TYPE_PAREN_CLOSE,
+ ']' => self::TYPE_PAREN_CLOSE,
+ 'break' => self::TYPE_RETURN,
+ 'continue' => self::TYPE_RETURN,
+ 'return' => self::TYPE_RETURN,
+ 'throw' => self::TYPE_RETURN,
+ 'catch' => self::TYPE_IF,
+ 'for' => self::TYPE_IF,
+ 'if' => self::TYPE_IF,
+ 'switch' => self::TYPE_IF,
+ 'while' => self::TYPE_IF,
+ 'with' => self::TYPE_IF,
+ 'case' => self::TYPE_DO,
+ 'do' => self::TYPE_DO,
+ 'else' => self::TYPE_DO,
+ 'finally' => self::TYPE_DO,
+ 'try' => self::TYPE_DO,
+ 'var' => self::TYPE_DO,
+ 'function' => self::TYPE_FUNC
+ );
+
+ // $goto : This is the main table for our state machine. For every state/token pair
+ // the following state is defined. When no rule exists for a given pair,
+ // the state is left unchanged.
+ $goto = array(
+ self::STATEMENT => array(
+ self::TYPE_UN_OP => self::EXPRESSION,
+ self::TYPE_INCR_OP => self::EXPRESSION,
+ self::TYPE_ADD_OP => self::EXPRESSION,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+ self::TYPE_RETURN => self::EXPRESSION_NO_NL,
+ self::TYPE_IF => self::CONDITION,
+ self::TYPE_FUNC => self::CONDITION,
+ self::TYPE_LITERAL => self::EXPRESSION_OP
+ ),
+ self::CONDITION => array(
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+ ),
+ self::PROPERTY_ASSIGNMENT => array(
+ self::TYPE_COLON => self::PROPERTY_EXPRESSION,
+ self::TYPE_BRACE_OPEN => self::STATEMENT
+ ),
+ self::EXPRESSION => array(
+ self::TYPE_SEMICOLON => self::STATEMENT,
+ self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+ self::TYPE_FUNC => self::EXPRESSION_FUNC,
+ self::TYPE_LITERAL => self::EXPRESSION_OP
+ ),
+ self::EXPRESSION_NO_NL => array(
+ self::TYPE_SEMICOLON => self::STATEMENT,
+ self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+ self::TYPE_FUNC => self::EXPRESSION_FUNC,
+ self::TYPE_LITERAL => self::EXPRESSION_OP
+ ),
+ self::EXPRESSION_OP => array(
+ self::TYPE_BIN_OP => self::EXPRESSION,
+ self::TYPE_ADD_OP => self::EXPRESSION,
+ self::TYPE_HOOK => self::EXPRESSION_TERNARY,
+ self::TYPE_COLON => self::STATEMENT,
+ self::TYPE_COMMA => self::EXPRESSION,
+ self::TYPE_SEMICOLON => self::STATEMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+ ),
+ self::EXPRESSION_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::STATEMENT
+ ),
+ self::EXPRESSION_TERNARY => array(
+ self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+ self::TYPE_FUNC => self::EXPRESSION_TERNARY_FUNC,
+ self::TYPE_LITERAL => self::EXPRESSION_TERNARY_OP
+ ),
+ self::EXPRESSION_TERNARY_OP => array(
+ self::TYPE_BIN_OP => self::EXPRESSION_TERNARY,
+ self::TYPE_ADD_OP => self::EXPRESSION_TERNARY,
+ self::TYPE_HOOK => self::EXPRESSION_TERNARY,
+ self::TYPE_COMMA => self::EXPRESSION_TERNARY,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+ ),
+ self::EXPRESSION_TERNARY_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::STATEMENT
+ ),
+ self::PAREN_EXPRESSION => array(
+ self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+ self::TYPE_FUNC => self::PAREN_EXPRESSION_FUNC,
+ self::TYPE_LITERAL => self::PAREN_EXPRESSION_OP
+ ),
+ self::PAREN_EXPRESSION_OP => array(
+ self::TYPE_BIN_OP => self::PAREN_EXPRESSION,
+ self::TYPE_ADD_OP => self::PAREN_EXPRESSION,
+ self::TYPE_HOOK => self::PAREN_EXPRESSION,
+ self::TYPE_COLON => self::PAREN_EXPRESSION,
+ self::TYPE_COMMA => self::PAREN_EXPRESSION,
+ self::TYPE_SEMICOLON => self::PAREN_EXPRESSION,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+ ),
+ self::PAREN_EXPRESSION_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::STATEMENT
+ ),
+ self::PROPERTY_EXPRESSION => array(
+ self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+ self::TYPE_FUNC => self::PROPERTY_EXPRESSION_FUNC,
+ self::TYPE_LITERAL => self::PROPERTY_EXPRESSION_OP
+ ),
+ self::PROPERTY_EXPRESSION_OP => array(
+ self::TYPE_BIN_OP => self::PROPERTY_EXPRESSION,
+ self::TYPE_ADD_OP => self::PROPERTY_EXPRESSION,
+ self::TYPE_HOOK => self::PROPERTY_EXPRESSION,
+ self::TYPE_COMMA => self::PROPERTY_ASSIGNMENT,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+ ),
+ self::PROPERTY_EXPRESSION_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::STATEMENT
+ )
+ );
+
+ // $push : This table contains the rules for when to push a state onto the stack.
+ // The pushed state is the state to return to when the corresponding
+ // closing token is found
+ $push = array(
+ self::STATEMENT => array(
+ self::TYPE_BRACE_OPEN => self::STATEMENT,
+ self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+ ),
+ self::CONDITION => array(
+ self::TYPE_PAREN_OPEN => self::STATEMENT
+ ),
+ self::PROPERTY_ASSIGNMENT => array(
+ self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT
+ ),
+ self::EXPRESSION => array(
+ self::TYPE_BRACE_OPEN => self::EXPRESSION_OP,
+ self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+ ),
+ self::EXPRESSION_NO_NL => array(
+ self::TYPE_BRACE_OPEN => self::EXPRESSION_OP,
+ self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+ ),
+ self::EXPRESSION_OP => array(
+ self::TYPE_HOOK => self::EXPRESSION,
+ self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+ ),
+ self::EXPRESSION_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::EXPRESSION_OP
+ ),
+ self::EXPRESSION_TERNARY => array(
+ self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP,
+ self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP
+ ),
+ self::EXPRESSION_TERNARY_OP => array(
+ self::TYPE_HOOK => self::EXPRESSION_TERNARY,
+ self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP
+ ),
+ self::EXPRESSION_TERNARY_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP
+ ),
+ self::PAREN_EXPRESSION => array(
+ self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP,
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP
+ ),
+ self::PAREN_EXPRESSION_OP => array(
+ self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP
+ ),
+ self::PAREN_EXPRESSION_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP
+ ),
+ self::PROPERTY_EXPRESSION => array(
+ self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP,
+ self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
+ ),
+ self::PROPERTY_EXPRESSION_OP => array(
+ self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
+ ),
+ self::PROPERTY_EXPRESSION_FUNC => array(
+ self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP
+ )
+ );
+
+ // $pop : Rules for when to pop a state from the stack
+ $pop = array(
+ self::STATEMENT => array( self::TYPE_BRACE_CLOSE => true ),
+ self::PROPERTY_ASSIGNMENT => array( self::TYPE_BRACE_CLOSE => true ),
+ self::EXPRESSION => array( self::TYPE_BRACE_CLOSE => true ),
+ self::EXPRESSION_NO_NL => array( self::TYPE_BRACE_CLOSE => true ),
+ self::EXPRESSION_OP => array( self::TYPE_BRACE_CLOSE => true ),
+ self::EXPRESSION_TERNARY_OP => array( self::TYPE_COLON => true ),
+ self::PAREN_EXPRESSION => array( self::TYPE_PAREN_CLOSE => true ),
+ self::PAREN_EXPRESSION_OP => array( self::TYPE_PAREN_CLOSE => true ),
+ self::PROPERTY_EXPRESSION => array( self::TYPE_BRACE_CLOSE => true ),
+ self::PROPERTY_EXPRESSION_OP => array( self::TYPE_BRACE_CLOSE => true )
+ );
+
+ // $semicolon : Rules for when a semicolon insertion is appropriate
+ $semicolon = array(
+ self::EXPRESSION_NO_NL => array(
+ self::TYPE_UN_OP => true,
+ self::TYPE_INCR_OP => true,
+ self::TYPE_ADD_OP => true,
+ self::TYPE_BRACE_OPEN => true,
+ self::TYPE_PAREN_OPEN => true,
+ self::TYPE_RETURN => true,
+ self::TYPE_IF => true,
+ self::TYPE_DO => true,
+ self::TYPE_FUNC => true,
+ self::TYPE_LITERAL => true
+ ),
+ self::EXPRESSION_OP => array(
+ self::TYPE_UN_OP => true,
+ self::TYPE_INCR_OP => true,
+ self::TYPE_BRACE_OPEN => true,
+ self::TYPE_RETURN => true,
+ self::TYPE_IF => true,
+ self::TYPE_DO => true,
+ self::TYPE_FUNC => true,
+ self::TYPE_LITERAL => true
+ )
+ );
+
+ // Rules for when newlines should be inserted if
+ // $statementsOnOwnLine is enabled.
+ // $newlineBefore is checked before switching state,
+ // $newlineAfter is checked after
+ $newlineBefore = array(
+ self::STATEMENT => array(
+ self::TYPE_BRACE_CLOSE => true,
+ ),
+ );
+ $newlineAfter = array(
+ self::STATEMENT => array(
+ self::TYPE_BRACE_OPEN => true,
+ self::TYPE_PAREN_CLOSE => true,
+ self::TYPE_SEMICOLON => true,
+ ),
+ );
+
+ // $divStates : Contains all states that can be followed by a division operator
+ $divStates = array(
+ self::EXPRESSION_OP => true,
+ self::EXPRESSION_TERNARY_OP => true,
+ self::PAREN_EXPRESSION_OP => true,
+ self::PROPERTY_EXPRESSION_OP => true
+ );
+
+ // Here's where the minifying takes place: Loop through the input, looking for tokens
+ // and output them to $out, taking actions to the above defined rules when appropriate.
+ $out = '';
+ $pos = 0;
+ $length = strlen( $s );
+ $lineLength = 0;
+ $newlineFound = true;
+ $state = self::STATEMENT;
+ $stack = array();
+ $last = ';'; // Pretend that we have seen a semicolon yet
+ while( $pos < $length ) {
+ // First, skip over any whitespace and multiline comments, recording whether we
+ // found any newline character
+ $skip = strspn( $s, " \t\n\r\xb\xc", $pos );
+ if( !$skip ) {
+ $ch = $s[$pos];
+ if( $ch === '/' && substr( $s, $pos, 2 ) === '/*' ) {
+ // Multiline comment. Search for the end token or EOT.
+ $end = strpos( $s, '*/', $pos + 2 );
+ $skip = $end === false ? $length - $pos : $end - $pos + 2;
+ }
+ }
+ if( $skip ) {
+ // The semicolon insertion mechanism needs to know whether there was a newline
+ // between two tokens, so record it now.
+ if( !$newlineFound && strcspn( $s, "\r\n", $pos, $skip ) !== $skip ) {
+ $newlineFound = true;
+ }
+ $pos += $skip;
+ continue;
+ }
+ // Handle C++-style comments and html comments, which are treated as single line
+ // comments by the browser, regardless of whether the end tag is on the same line.
+ // Handle --> the same way, but only if it's at the beginning of the line
+ if( ( $ch === '/' && substr( $s, $pos, 2 ) === '//' )
+ || ( $ch === '<' && substr( $s, $pos, 4 ) === '<!--' )
+ || ( $ch === '-' && $newlineFound && substr( $s, $pos, 3 ) === '-->' )
+ ) {
+ $pos += strcspn( $s, "\r\n", $pos );
+ continue;
+ }
+
+ // Find out which kind of token we're handling. $end will point past the end of it.
+ $end = $pos + 1;
+ // Handle string literals
+ if( $ch === "'" || $ch === '"' ) {
+ // Search to the end of the string literal, skipping over backslash escapes
+ $search = $ch . '\\';
+ do{
+ $end += strcspn( $s, $search, $end ) + 2;
+ } while( $end - 2 < $length && $s[$end - 2] === '\\' );
+ $end--;
+ // We have to distinguish between regexp literals and division operators
+ // A division operator is only possible in certain states
+ } elseif( $ch === '/' && !isset( $divStates[$state] ) ) {
+ // Regexp literal, search to the end, skipping over backslash escapes and
+ // character classes
+ for( ; ; ) {
+ do{
+ $end += strcspn( $s, '/[\\', $end ) + 2;
+ } while( $end - 2 < $length && $s[$end - 2] === '\\' );
+ $end--;
+ if( $end - 1 >= $length || $s[$end - 1] === '/' ) {
+ break;
+ }
+ do{
+ $end += strcspn( $s, ']\\', $end ) + 2;
+ } while( $end - 2 < $length && $s[$end - 2] === '\\' );
+ $end--;
+ };
+ // Search past the regexp modifiers (gi)
+ while( $end < $length && ctype_alpha( $s[$end] ) ) {
+ $end++;
+ }
+ } elseif(
+ ctype_digit( $ch )
+ || ( $ch === '.' && $pos + 1 < $length && ctype_digit( $s[$pos + 1] ) )
+ ) {
+ // Numeric literal. Search for the end of it, but don't care about [+-]exponent
+ // at the end, as the results of "numeric [+-] numeric" and "numeric" are
+ // identical to our state machine.
+ $end += strspn( $s, '0123456789ABCDEFabcdefXx.', $end );
+ while( $s[$end - 1] === '.' ) {
+ // Special case: When a numeric ends with a dot, we have to check the
+ // literal for proper syntax
+ $decimal = strspn( $s, '0123456789', $pos, $end - $pos - 1 );
+ if( $decimal === $end - $pos - 1 ) {
+ break;
+ } else {
+ $end--;
+ }
+ }
+ } elseif( isset( $opChars[$ch] ) ) {
+ // Punctuation character. Search for the longest matching operator.
+ while(
+ $end < $length
+ && isset( $tokenTypes[substr( $s, $pos, $end - $pos + 1 )] )
+ ) {
+ $end++;
+ }
+ } else {
+ // Identifier or reserved word. Search for the end by excluding whitespace and
+ // punctuation.
+ $end += strcspn( $s, " \t\n.;,=<>+-{}()[]?:*/%'\"!&|^~\xb\xc\r", $end );
+ }
+
+ // Now get the token type from our type array
+ $token = substr( $s, $pos, $end - $pos ); // so $end - $pos == strlen( $token )
+ $type = isset( $tokenTypes[$token] ) ? $tokenTypes[$token] : self::TYPE_LITERAL;
+
+ if( $newlineFound && isset( $semicolon[$state][$type] ) ) {
+ // This token triggers the semicolon insertion mechanism of javascript. While we
+ // could add the ; token here ourselves, keeping the newline has a few advantages.
+ $out .= "\n";
+ $state = self::STATEMENT;
+ $lineLength = 0;
+ } elseif( $maxLineLength > 0 && $lineLength + $end - $pos > $maxLineLength &&
+ !isset( $semicolon[$state][$type] ) && $type !== self::TYPE_INCR_OP )
+ {
+ // This line would get too long if we added $token, so add a newline first.
+ // Only do this if it won't trigger semicolon insertion and if it won't
+ // put a postfix increment operator on its own line, which is illegal in js.
+ $out .= "\n";
+ $lineLength = 0;
+ // Check, whether we have to separate the token from the last one with whitespace
+ } elseif( !isset( $opChars[$last] ) && !isset( $opChars[$ch] ) ) {
+ $out .= ' ';
+ $lineLength++;
+ // Don't accidentally create ++, -- or // tokens
+ } elseif( $last === $ch && ( $ch === '+' || $ch === '-' || $ch === '/' ) ) {
+ $out .= ' ';
+ $lineLength++;
+ }
+
+ $out .= $token;
+ $lineLength += $end - $pos; // += strlen( $token )
+ $last = $s[$end - 1];
+ $pos = $end;
+ $newlineFound = false;
+
+ // Output a newline after the token if required
+ // This is checked before AND after switching state
+ $newlineAdded = false;
+ if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineBefore[$state][$type] ) ) {
+ $out .= "\n";
+ $lineLength = 0;
+ $newlineAdded = true;
+ }
+
+ // Now that we have output our token, transition into the new state.
+ if( isset( $push[$state][$type] ) && count( $stack ) < self::STACK_LIMIT ) {
+ $stack[] = $push[$state][$type];
+ }
+ if( $stack && isset( $pop[$state][$type] ) ) {
+ $state = array_pop( $stack );
+ } elseif( isset( $goto[$state][$type] ) ) {
+ $state = $goto[$state][$type];
+ }
+
+ // Check for newline insertion again
+ if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
+ $out .= "\n";
+ $lineLength = 0;
+ }
+ }
+ return $out;
+ }
+}
diff --git a/includes/libs/README b/includes/libs/README
new file mode 100644
index 00000000..85e3db3c
--- /dev/null
+++ b/includes/libs/README
@@ -0,0 +1,4 @@
+The classes in this directory ./includes/libs are considered standalone
+from the remainder of the MediaWiki codebase. They do not call on any other
+portions of MediaWiki code, and can be used in other projects without
+dependency issues.
diff --git a/includes/api/ApiFormatYaml_spyc.php b/includes/libs/spyc.php
index 30f860dd..bc92e869 100644
--- a/includes/api/ApiFormatYaml_spyc.php
+++ b/includes/libs/spyc.php
@@ -1,6 +1,8 @@
<?php
/**
* Spyc -- A Simple PHP YAML Class
+ *
+ * @file
* @version 0.2.3 -- 2006-02-04
* @author Chris Wanstrath <chris@ozmm.org>
* @see http://spyc.sourceforge.net/
@@ -33,10 +35,10 @@ class Spyc {
* Indent's default is 2 spaces, wordwrap's default is 40 characters. And
* you can turn off wordwrap by passing in 0.
*
- * @return string
* @param $array Array: PHP array
* @param $indent Integer: Pass in false to use the default, which is 2
* @param $wordwrap Integer: Pass in 0 for no wordwrap, false for default (40)
+ * @return String
*/
public static function YAMLDump( $array, $indent = false, $wordwrap = false ) {
$spyc = new Spyc;
@@ -57,13 +59,12 @@ class Spyc {
* Indent's default is 2 spaces, wordwrap's default is 40 characters. And
* you can turn off wordwrap by passing in 0.
*
- * @public
- * @return string
* @param $array Array: PHP array
* @param $indent Integer: Pass in false to use the default, which is 2
* @param $wordwrap Integer: Pass in 0 for no wordwrap, false for default (40)
+ * @return String
*/
- function dump( $array, $indent = false, $wordwrap = false ) {
+ public function dump( $array, $indent = false, $wordwrap = false ) {
// Dumps to some very clean YAML. We'll have to add some more features
// and options soon. And better support for folding.
@@ -92,12 +93,16 @@ class Spyc {
/**** Private Properties ****/
+ /**
+ * Unused variables, but just commented rather than deleting
+ * to save altering the library
private $_haveRefs;
private $_allNodes;
private $_lastIndent;
private $_lastNode;
private $_inBlock;
private $_isInline;
+ **/
private $_dumpIndent;
private $_dumpWordWrap;
@@ -105,10 +110,11 @@ class Spyc {
/**
* Attempts to convert a key / value array item to YAML
- * @return string
- * @param $key The name of the key
- * @param $value The value of the item
- * @param $indent The indent of the current node
+ *
+ * @param $key Mixed: the name of the key
+ * @param $value Mixed: the value of the item
+ * @param $indent Integer: the indent of the current node
+ * @return String
*/
private function _yamlize( $key, $value, $indent ) {
if ( is_array( $value ) ) {
@@ -128,9 +134,10 @@ class Spyc {
/**
* Attempts to convert an array to YAML
- * @return string
- * @param $array The array you want to convert
- * @param $indent The indent of the current level
+ *
+ * @param $array Array: the array you want to convert
+ * @param $indent Integer: the indent of the current level
+ * @return String
*/
private function _yamlizeArray( $array, $indent ) {
if ( is_array( $array ) ) {
@@ -140,15 +147,16 @@ class Spyc {
}
return $string;
} else {
- return false;
+ return false;
}
}
/**
* Find out whether a string needs to be output as a literal rather than in plain style.
* Added by Roan Kattouw 13-03-2008
- * @param $value The string to check
- * @return bool
+ *
+ * @param $value String: the string to check
+ * @return Boolean
*/
function _needLiteral( $value ) {
// Check whether the string contains # or : or begins with any of:
@@ -163,17 +171,18 @@ class Spyc {
/**
* Returns YAML from a key and a value
- * @return string
- * @param $key The name of the key
- * @param $value The value of the item
- * @param $indent The indent of the current node
+ *
+ * @param $key Mixed: the name of the key
+ * @param $value Mixed: the value of the item
+ * @param $indent Integer: the indent of the current node
+ * @return String
*/
private function _dumpNode( $key, $value, $indent ) {
// do some folding here, for blocks
if ( $this->_needLiteral( $value ) ) {
$value = $this->_doLiteralBlock( $value, $indent );
} else {
- $value = $this->_doFolding( $value, $indent );
+ $value = $this->_doFolding( $value, $indent );
}
$spaces = str_repeat( ' ', $indent );
@@ -185,9 +194,9 @@ class Spyc {
else
$string = $spaces . "-\n";
} else {
- if ($key == '*') //bug 21922 - Quote asterix used as keys
+ if ( $key == '*' ) // bug 21922 - Quote asterix used as keys
$key = "'*'";
-
+
// It's mapped
if ( $value !== '' && !is_null( $value ) )
$string = $spaces . $key . ': ' . $value . "\n";
@@ -199,9 +208,10 @@ class Spyc {
/**
* Creates a literal block for dumping
- * @return string
- * @param $value
- * @param $indent int The value of the indent
+ *
+ * @param $value String
+ * @param $indent Integer: the value of the indent
+ * @return String
*/
private function _doLiteralBlock( $value, $indent ) {
$exploded = explode( "\n", $value );
@@ -216,8 +226,10 @@ class Spyc {
/**
* Folds a string of text, if necessary
- * @return string
- * @param $value The string you wish to fold
+ *
+ * @param $value String: the string you wish to fold
+ * @param $indent Integer: the indent of the current node
+ * @return String
*/
private function _doFolding( $value, $indent ) {
// Don't do anything if wordwrap is set to 0
diff --git a/includes/media/BMP.php b/includes/media/BMP.php
index 39b29744..de836b59 100644
--- a/includes/media/BMP.php
+++ b/includes/media/BMP.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Handler for Microsoft's bitmap format
+ *
* @file
* @ingroup Media
*/
@@ -17,7 +19,7 @@ class BmpHandler extends BitmapHandler {
}
// Render files as PNG
- function getThumbType( $text, $mime ) {
+ function getThumbType( $text, $mime, $params = null ) {
return array( 'png', 'image/png' );
}
diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php
index 870e2126..f5f7ba6d 100644
--- a/includes/media/Bitmap.php
+++ b/includes/media/Bitmap.php
@@ -1,10 +1,14 @@
<?php
/**
+ * Generic handler for bitmap images
+ *
* @file
* @ingroup Media
*/
/**
+ * Generic handler for bitmap images
+ *
* @ingroup Media
*/
class BitmapHandler extends ImageHandler {
@@ -18,15 +22,6 @@ class BitmapHandler extends ImageHandler {
$srcWidth = $image->getWidth( $params['page'] );
$srcHeight = $image->getHeight( $params['page'] );
- # Don't thumbnail an image so big that it will fill hard drives and send servers into swap
- # JPEG has the handy property of allowing thumbnailing without full decompression, so we make
- # an exception for it.
- if ( $mimeType !== 'image/jpeg' &&
- $this->getImageArea( $image, $srcWidth, $srcHeight ) > $wgMaxImageArea )
- {
- return false;
- }
-
# Don't make an image bigger than the source
$params['physicalWidth'] = $params['width'];
$params['physicalHeight'] = $params['height'];
@@ -34,13 +29,25 @@ class BitmapHandler extends ImageHandler {
if ( $params['physicalWidth'] >= $srcWidth ) {
$params['physicalWidth'] = $srcWidth;
$params['physicalHeight'] = $srcHeight;
- return true;
+ # Skip scaling limit checks if no scaling is required
+ if ( !$image->mustRender() )
+ return true;
+ }
+
+ # Don't thumbnail an image so big that it will fill hard drives and send servers into swap
+ # JPEG has the handy property of allowing thumbnailing without full decompression, so we make
+ # an exception for it.
+ # FIXME: This actually only applies to ImageMagick
+ if ( $mimeType !== 'image/jpeg' &&
+ $srcWidth * $srcHeight > $wgMaxImageArea )
+ {
+ return false;
}
return true;
}
-
-
+
+
// Function that returns the number of pixels to be thumbnailed.
// Intended for animated GIFs to multiply by the number of frames.
function getImageArea( $image, $width, $height ) {
@@ -48,36 +55,48 @@ class BitmapHandler extends ImageHandler {
}
function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
- global $wgUseImageMagick, $wgImageMagickConvertCommand, $wgImageMagickTempDir;
+ global $wgUseImageMagick;
global $wgCustomConvertCommand, $wgUseImageResize;
- global $wgSharpenParameter, $wgSharpenReductionThreshold;
- global $wgMaxAnimatedGifArea;
if ( !$this->normaliseParams( $image, $params ) ) {
return new TransformParameterError( $params );
}
- $physicalWidth = $params['physicalWidth'];
- $physicalHeight = $params['physicalHeight'];
- $clientWidth = $params['width'];
- $clientHeight = $params['height'];
- $comment = isset( $params['descriptionUrl'] ) ? "File source: ". $params['descriptionUrl'] : '';
- $srcWidth = $image->getWidth();
- $srcHeight = $image->getHeight();
- $mimeType = $image->getMimeType();
- $srcPath = $image->getPath();
- $retval = 0;
- wfDebug( __METHOD__.": creating {$physicalWidth}x{$physicalHeight} thumbnail at $dstPath\n" );
+ # Create a parameter array to pass to the scaler
+ $scalerParams = array(
+ # The size to which the image will be resized
+ 'physicalWidth' => $params['physicalWidth'],
+ 'physicalHeight' => $params['physicalHeight'],
+ 'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
+ # The size of the image on the page
+ 'clientWidth' => $params['width'],
+ 'clientHeight' => $params['height'],
+ # Comment as will be added to the EXIF of the thumbnail
+ 'comment' => isset( $params['descriptionUrl'] ) ?
+ "File source: {$params['descriptionUrl']}" : '',
+ # Properties of the original image
+ 'srcWidth' => $image->getWidth(),
+ 'srcHeight' => $image->getHeight(),
+ 'mimeType' => $image->getMimeType(),
+ 'srcPath' => $image->getPath(),
+ 'dstPath' => $dstPath,
+ );
+
+ wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} thumbnail at $dstPath\n" );
+
+ if ( !$image->mustRender() &&
+ $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
+ && $scalerParams['physicalHeight'] == $scalerParams['srcHeight'] ) {
- if ( !$image->mustRender() && $physicalWidth == $srcWidth && $physicalHeight == $srcHeight ) {
# normaliseParams (or the user) wants us to return the unscaled image
- wfDebug( __METHOD__.": returning unscaled image\n" );
- return new ThumbnailImage( $image, $image->getURL(), $clientWidth, $clientHeight, $srcPath );
+ wfDebug( __METHOD__ . ": returning unscaled image\n" );
+ return $this->getClientScalingThumbnailImage( $image, $scalerParams );
}
+ # Determine scaler type
if ( !$dstPath ) {
- // No output path available, client side scaling only
+ # No output path available, client side scaling only
$scaler = 'client';
- } elseif( !$wgUseImageResize ) {
+ } elseif ( !$wgUseImageResize ) {
$scaler = 'client';
} elseif ( $wgUseImageMagick ) {
$scaler = 'im';
@@ -88,166 +107,289 @@ class BitmapHandler extends ImageHandler {
} else {
$scaler = 'client';
}
- wfDebug( __METHOD__.": scaler $scaler\n" );
+ wfDebug( __METHOD__ . ": scaler $scaler\n" );
if ( $scaler == 'client' ) {
# Client-side image scaling, use the source URL
# Using the destination URL in a TRANSFORM_LATER request would be incorrect
- return new ThumbnailImage( $image, $image->getURL(), $clientWidth, $clientHeight, $srcPath );
+ return $this->getClientScalingThumbnailImage( $image, $scalerParams );
}
if ( $flags & self::TRANSFORM_LATER ) {
- wfDebug( __METHOD__.": Transforming later per flags.\n" );
- return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
+ wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
+ return new ThumbnailImage( $image, $dstUrl, $scalerParams['clientWidth'],
+ $scalerParams['clientHeight'], $dstPath );
}
+ # Try to make a target path for the thumbnail
if ( !wfMkdirParents( dirname( $dstPath ) ) ) {
- wfDebug( __METHOD__.": Unable to create thumbnail destination directory, falling back to client scaling\n" );
- return new ThumbnailImage( $image, $image->getURL(), $clientWidth, $clientHeight, $srcPath );
- }
-
- if ( $scaler == 'im' ) {
- # use ImageMagick
-
- $quality = '';
- $sharpen = '';
- $scene = false;
- $animation = '';
- if ( $mimeType == 'image/jpeg' ) {
- $quality = "-quality 80"; // 80%
- # Sharpening, see bug 6193
- if ( ( $physicalWidth + $physicalHeight ) / ( $srcWidth + $srcHeight ) < $wgSharpenReductionThreshold ) {
- $sharpen = "-sharpen " . wfEscapeShellArg( $wgSharpenParameter );
- }
- } elseif ( $mimeType == 'image/png' ) {
- $quality = "-quality 95"; // zlib 9, adaptive filtering
- } elseif( $mimeType == 'image/gif' ) {
- if( $srcWidth * $srcHeight > $wgMaxAnimatedGifArea ) {
- // Extract initial frame only; we're so big it'll
- // be a total drag. :P
- $scene = 0;
- } else {
- // Coalesce is needed to scale animated GIFs properly (bug 1017).
- $animation = ' -coalesce ';
+ wfDebug( __METHOD__ . ": Unable to create thumbnail destination directory, falling back to client scaling\n" );
+ return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+ }
+
+ switch ( $scaler ) {
+ case 'im':
+ $err = $this->transformImageMagick( $image, $scalerParams );
+ break;
+ case 'custom':
+ $err = $this->transformCustom( $image, $scalerParams );
+ break;
+ case 'gd':
+ default:
+ $err = $this->transformGd( $image, $scalerParams );
+ break;
+ }
+
+ # Remove the file if a zero-byte thumbnail was created, or if there was an error
+ $removed = $this->removeBadFile( $dstPath, (bool)$err );
+ if ( $err ) {
+ # transform returned MediaTransforError
+ return $err;
+ } elseif ( $removed ) {
+ # Thumbnail was zero-byte and had to be removed
+ return new MediaTransformError( 'thumbnail_error',
+ $scalerParams['clientWidth'], $scalerParams['clientHeight'] );
+ } else {
+ return new ThumbnailImage( $image, $dstUrl, $scalerParams['clientWidth'],
+ $scalerParams['clientHeight'], $dstPath );
+ }
+ }
+
+ /**
+ * Get a ThumbnailImage that respresents an image that will be scaled
+ * client side
+ *
+ * @param $image File File associated with this thumbnail
+ * @param $params array Array with scaler params
+ * @return ThumbnailImage
+ */
+ protected function getClientScalingThumbnailImage( $image, $params ) {
+ return new ThumbnailImage( $image, $image->getURL(),
+ $params['clientWidth'], $params['clientHeight'], $params['srcPath'] );
+ }
+
+ /**
+ * Transform an image using ImageMagick
+ *
+ * @param $image File File associated with this thumbnail
+ * @param $params array Array with scaler params
+ *
+ * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+ */
+ protected function transformImageMagick( $image, $params ) {
+ # use ImageMagick
+ global $wgSharpenReductionThreshold, $wgSharpenParameter,
+ $wgMaxAnimatedGifArea,
+ $wgImageMagickTempDir, $wgImageMagickConvertCommand;
+
+ $quality = '';
+ $sharpen = '';
+ $scene = false;
+ $animation_pre = '';
+ $animation_post = '';
+ $decoderHint = '';
+ if ( $params['mimeType'] == 'image/jpeg' ) {
+ $quality = "-quality 80"; // 80%
+ # Sharpening, see bug 6193
+ if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
+ / ( $params['srcWidth'] + $params['srcHeight'] )
+ < $wgSharpenReductionThreshold ) {
+ $sharpen = "-sharpen " . wfEscapeShellArg( $wgSharpenParameter );
+ }
+ // JPEG decoder hint to reduce memory, available since IM 6.5.6-2
+ $decoderHint = "-define jpeg:size={$params['physicalDimensions']}";
+
+ } elseif ( $params['mimeType'] == 'image/png' ) {
+ $quality = "-quality 95"; // zlib 9, adaptive filtering
+
+ } elseif ( $params['mimeType'] == 'image/gif' ) {
+ if ( $this->getImageArea( $image, $params['srcWidth'],
+ $params['srcHeight'] ) > $wgMaxAnimatedGifArea ) {
+ // Extract initial frame only; we're so big it'll
+ // be a total drag. :P
+ $scene = 0;
+
+ } elseif ( $this->isAnimatedImage( $image ) ) {
+ // Coalesce is needed to scale animated GIFs properly (bug 1017).
+ $animation_pre = '-coalesce';
+ // We optimize the output, but -optimize is broken,
+ // use optimizeTransparency instead (bug 11822)
+ if ( version_compare( $this->getMagickVersion(), "6.3.5" ) >= 0 ) {
+ $animation_post = '-fuzz 5% -layers optimizeTransparency +map';
}
}
+ }
- if ( strval( $wgImageMagickTempDir ) !== '' ) {
- $tempEnv = 'MAGICK_TMPDIR=' . wfEscapeShellArg( $wgImageMagickTempDir ) . ' ';
- } else {
- $tempEnv = '';
- }
+ // Use one thread only, to avoid deadlock bugs on OOM
+ $env = array( 'OMP_NUM_THREADS' => 1 );
+ if ( strval( $wgImageMagickTempDir ) !== '' ) {
+ $env['MAGICK_TMPDIR'] = $wgImageMagickTempDir;
+ }
- # Specify white background color, will be used for transparent images
- # in Internet Explorer/Windows instead of default black.
-
- # Note, we specify "-size {$physicalWidth}" and NOT "-size {$physicalWidth}x{$physicalHeight}".
- # It seems that ImageMagick has a bug wherein it produces thumbnails of
- # the wrong size in the second case.
-
- $cmd =
- $tempEnv .
- wfEscapeShellArg( $wgImageMagickConvertCommand ) .
- " {$quality} -background white -size {$physicalWidth} ".
- wfEscapeShellArg( $this->escapeMagickInput( $srcPath, $scene ) ) .
- $animation .
- // For the -resize option a "!" is needed to force exact size,
- // or ImageMagick may decide your ratio is wrong and slice off
- // a pixel.
- " -thumbnail " . wfEscapeShellArg( "{$physicalWidth}x{$physicalHeight}!" ) .
- // Add the source url as a comment to the thumb.
- " -set comment " . wfEscapeShellArg( $this->escapeMagickProperty( $comment ) ) .
- " -depth 8 $sharpen " .
- wfEscapeShellArg( $this->escapeMagickOutput( $dstPath ) ) . " 2>&1";
- wfDebug( __METHOD__.": running ImageMagick: $cmd\n" );
- wfProfileIn( 'convert' );
- $err = wfShellExec( $cmd, $retval );
- wfProfileOut( 'convert' );
- } elseif( $scaler == 'custom' ) {
- # Use a custom convert command
- # Variables: %s %d %w %h
- $src = wfEscapeShellArg( $srcPath );
- $dst = wfEscapeShellArg( $dstPath );
- $cmd = $wgCustomConvertCommand;
- $cmd = str_replace( '%s', $src, str_replace( '%d', $dst, $cmd ) ); # Filenames
- $cmd = str_replace( '%h', $physicalHeight, str_replace( '%w', $physicalWidth, $cmd ) ); # Size
- wfDebug( __METHOD__.": Running custom convert command $cmd\n" );
- wfProfileIn( 'convert' );
- $err = wfShellExec( $cmd, $retval );
- wfProfileOut( 'convert' );
- } else /* $scaler == 'gd' */ {
- # Use PHP's builtin GD library functions.
- #
- # First find out what kind of file this is, and select the correct
- # input routine for this.
-
- $typemap = array(
- 'image/gif' => array( 'imagecreatefromgif', 'palette', 'imagegif' ),
- 'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor', array( __CLASS__, 'imageJpegWrapper' ) ),
- 'image/png' => array( 'imagecreatefrompng', 'bits', 'imagepng' ),
- 'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', 'imagewbmp' ),
- 'image/xbm' => array( 'imagecreatefromxbm', 'palette', 'imagexbm' ),
- );
- if( !isset( $typemap[$mimeType] ) ) {
- $err = 'Image type not supported';
- wfDebug( "$err\n" );
- $errMsg = wfMsg ( 'thumbnail_image-type' );
- return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $errMsg );
- }
- list( $loader, $colorStyle, $saveType ) = $typemap[$mimeType];
+ $cmd =
+ wfEscapeShellArg( $wgImageMagickConvertCommand ) .
+ // Specify white background color, will be used for transparent images
+ // in Internet Explorer/Windows instead of default black.
+ " {$quality} -background white" .
+ " {$decoderHint} " .
+ wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
+ " {$animation_pre}" .
+ // For the -thumbnail option a "!" is needed to force exact size,
+ // or ImageMagick may decide your ratio is wrong and slice off
+ // a pixel.
+ " -thumbnail " . wfEscapeShellArg( "{$params['physicalDimensions']}!" ) .
+ // Add the source url as a comment to the thumb, but don't add the flag if there's no comment
+ ( $params['comment'] !== ''
+ ? " -set comment " . wfEscapeShellArg( $this->escapeMagickProperty( $params['comment'] ) )
+ : '' ) .
+ " -depth 8 $sharpen" .
+ " {$animation_post} " .
+ wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) ) . " 2>&1";
+
+ wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
+ wfProfileIn( 'convert' );
+ $retval = 0;
+ $err = wfShellExec( $cmd, $retval, $env );
+ wfProfileOut( 'convert' );
- if( !function_exists( $loader ) ) {
- $err = "Incomplete GD library configuration: missing function $loader";
- wfDebug( "$err\n" );
- $errMsg = wfMsg ( 'thumbnail_gd-library', $loader );
- return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $errMsg );
- }
+ if ( $retval !== 0 ) {
+ $this->logErrorForExternalProcess( $retval, $err, $cmd );
+ return $this->getMediaTransformError( $params, $err );
+ }
- if ( !file_exists( $srcPath ) ) {
- $err = "File seems to be missing: $srcPath";
- wfDebug( "$err\n" );
- $errMsg = wfMsg ( 'thumbnail_image-missing', $srcPath );
- return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $errMsg );
- }
+ return false; # No error
+ }
- $src_image = call_user_func( $loader, $srcPath );
- $dst_image = imagecreatetruecolor( $physicalWidth, $physicalHeight );
-
- // Initialise the destination image to transparent instead of
- // the default solid black, to support PNG and GIF transparency nicely
- $background = imagecolorallocate( $dst_image, 0, 0, 0 );
- imagecolortransparent( $dst_image, $background );
- imagealphablending( $dst_image, false );
-
- if( $colorStyle == 'palette' ) {
- // Don't resample for paletted GIF images.
- // It may just uglify them, and completely breaks transparency.
- imagecopyresized( $dst_image, $src_image,
- 0,0,0,0,
- $physicalWidth, $physicalHeight, imagesx( $src_image ), imagesy( $src_image ) );
- } else {
- imagecopyresampled( $dst_image, $src_image,
- 0,0,0,0,
- $physicalWidth, $physicalHeight, imagesx( $src_image ), imagesy( $src_image ) );
- }
+ /**
+ * Transform an image using a custom command
+ *
+ * @param $image File File associated with this thumbnail
+ * @param $params array Array with scaler params
+ *
+ * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+ */
+ protected function transformCustom( $image, $params ) {
+ # Use a custom convert command
+ global $wgCustomConvertCommand;
+
+ # Variables: %s %d %w %h
+ $src = wfEscapeShellArg( $params['srcPath'] );
+ $dst = wfEscapeShellArg( $params['dstPath'] );
+ $cmd = $wgCustomConvertCommand;
+ $cmd = str_replace( '%s', $src, str_replace( '%d', $dst, $cmd ) ); # Filenames
+ $cmd = str_replace( '%h', $params['physicalHeight'],
+ str_replace( '%w', $params['physicalWidth'], $cmd ) ); # Size
+ wfDebug( __METHOD__ . ": Running custom convert command $cmd\n" );
+ wfProfileIn( 'convert' );
+ $retval = 0;
+ $err = wfShellExec( $cmd, $retval );
+ wfProfileOut( 'convert' );
- imagesavealpha( $dst_image, true );
+ if ( $retval !== 0 ) {
+ $this->logErrorForExternalProcess( $retval, $err, $cmd );
+ return $this->getMediaTransformError( $params, $err );
+ }
+ return false; # No error
+ }
- call_user_func( $saveType, $dst_image, $dstPath );
- imagedestroy( $dst_image );
- imagedestroy( $src_image );
- $retval = 0;
+ /**
+ * Log an error that occured in an external process
+ *
+ * @param $retval int
+ * @param $err int
+ * @param $cmd string
+ */
+ protected function logErrorForExternalProcess( $retval, $err, $cmd ) {
+ wfDebugLog( 'thumbnail',
+ sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
+ wfHostname(), $retval, trim( $err ), $cmd ) );
+ }
+ /**
+ * Get a MediaTransformError with error 'thumbnail_error'
+ *
+ * @param $params array Parameter array as passed to the transform* functions
+ * @param $errMsg string Error message
+ * @return MediaTransformError
+ */
+ protected function getMediaTransformError( $params, $errMsg ) {
+ return new MediaTransformError( 'thumbnail_error', $params['clientWidth'],
+ $params['clientHeight'], $errMsg );
+ }
+
+ /**
+ * Transform an image using the built in GD library
+ *
+ * @param $image File File associated with this thumbnail
+ * @param $params array Array with scaler params
+ *
+ * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+ */
+ protected function transformGd( $image, $params ) {
+ # Use PHP's builtin GD library functions.
+ #
+ # First find out what kind of file this is, and select the correct
+ # input routine for this.
+
+ $typemap = array(
+ 'image/gif' => array( 'imagecreatefromgif', 'palette', 'imagegif' ),
+ 'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor', array( __CLASS__, 'imageJpegWrapper' ) ),
+ 'image/png' => array( 'imagecreatefrompng', 'bits', 'imagepng' ),
+ 'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', 'imagewbmp' ),
+ 'image/xbm' => array( 'imagecreatefromxbm', 'palette', 'imagexbm' ),
+ );
+ if ( !isset( $typemap[$params['mimeType']] ) ) {
+ $err = 'Image type not supported';
+ wfDebug( "$err\n" );
+ $errMsg = wfMsg ( 'thumbnail_image-type' );
+ return $this->getMediaTransformError( $params, $errMsg );
+ }
+ list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
+
+ if ( !function_exists( $loader ) ) {
+ $err = "Incomplete GD library configuration: missing function $loader";
+ wfDebug( "$err\n" );
+ $errMsg = wfMsg ( 'thumbnail_gd-library', $loader );
+ return $this->getMediaTransformError( $params, $errMsg );
+ }
+
+ if ( !file_exists( $params['srcPath'] ) ) {
+ $err = "File seems to be missing: {$params['srcPath']}";
+ wfDebug( "$err\n" );
+ $errMsg = wfMsg ( 'thumbnail_image-missing', $params['srcPath'] );
+ return $this->getMediaTransformError( $params, $errMsg );
}
- $removed = $this->removeBadFile( $dstPath, $retval );
- if ( $retval != 0 || $removed ) {
- wfDebugLog( 'thumbnail',
- sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
- wfHostname(), $retval, trim($err), $cmd ) );
- return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err );
+ $src_image = call_user_func( $loader, $params['srcPath'] );
+ $dst_image = imagecreatetruecolor( $params['physicalWidth'],
+ $params['physicalHeight'] );
+
+ // Initialise the destination image to transparent instead of
+ // the default solid black, to support PNG and GIF transparency nicely
+ $background = imagecolorallocate( $dst_image, 0, 0, 0 );
+ imagecolortransparent( $dst_image, $background );
+ imagealphablending( $dst_image, false );
+
+ if ( $colorStyle == 'palette' ) {
+ // Don't resample for paletted GIF images.
+ // It may just uglify them, and completely breaks transparency.
+ imagecopyresized( $dst_image, $src_image,
+ 0, 0, 0, 0,
+ $params['physicalWidth'], $params['physicalHeight'],
+ imagesx( $src_image ), imagesy( $src_image ) );
} else {
- return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
+ imagecopyresampled( $dst_image, $src_image,
+ 0, 0, 0, 0,
+ $params['physicalWidth'], $params['physicalHeight'],
+ imagesx( $src_image ), imagesy( $src_image ) );
}
+
+ imagesavealpha( $dst_image, true );
+
+ call_user_func( $saveType, $dst_image, $params['dstPath'] );
+ imagedestroy( $dst_image );
+ imagedestroy( $src_image );
+
+ return false; # No error
}
/**
@@ -267,14 +409,14 @@ class BitmapHandler extends ImageHandler {
}
/**
- * Escape a string for ImageMagick's input filenames. See ExpandFilenames()
+ * Escape a string for ImageMagick's input filenames. See ExpandFilenames()
* and GetPathComponent() in magick/utility.c.
*
* This won't work with an initial ~ or @, so input files should be prefixed
- * with the directory name.
+ * with the directory name.
*
* Glob character unescaping is broken in ImageMagick before 6.6.1-5, but
- * it's broken in a way that doesn't involve trying to convert every file
+ * it's broken in a way that doesn't involve trying to convert every file
* in a directory, so we're better off escaping and waiting for the bugfix
* to filter down to users.
*
@@ -285,7 +427,7 @@ class BitmapHandler extends ImageHandler {
# Die on initial metacharacters (caller should prepend path)
$firstChar = substr( $path, 0, 1 );
if ( $firstChar === '~' || $firstChar === '@' ) {
- throw new MWException( __METHOD__.': cannot escape this path name' );
+ throw new MWException( __METHOD__ . ': cannot escape this path name' );
}
# Escape glob chars
@@ -295,7 +437,7 @@ class BitmapHandler extends ImageHandler {
}
/**
- * Escape a string for ImageMagick's output filename. See
+ * Escape a string for ImageMagick's output filename. See
* InterpretImageFilename() in magick/image.c.
*/
function escapeMagickOutput( $path, $scene = false ) {
@@ -304,7 +446,7 @@ class BitmapHandler extends ImageHandler {
}
/**
- * Armour a string against ImageMagick's GetPathComponent(). This is a
+ * Armour a string against ImageMagick's GetPathComponent(). This is a
* helper function for escapeMagickInput() and escapeMagickOutput().
*
* @param $path string The file path
@@ -318,11 +460,11 @@ class BitmapHandler extends ImageHandler {
// OK, it's a drive letter
// ImageMagick has a similar exception, see IsMagickConflict()
} else {
- throw new MWException( __METHOD__.': unexpected colon character in path name' );
+ throw new MWException( __METHOD__ . ': unexpected colon character in path name' );
}
}
- # If there are square brackets, add a do-nothing scene specification
+ # If there are square brackets, add a do-nothing scene specification
# to force a literal interpretation
if ( $scene === false ) {
if ( strpos( $path, '[' ) !== false ) {
@@ -334,6 +476,33 @@ class BitmapHandler extends ImageHandler {
return $path;
}
+ /**
+ * Retrieve the version of the installed ImageMagick
+ * You can use PHPs version_compare() to use this value
+ * Value is cached for one hour.
+ * @return String representing the IM version.
+ */
+ protected function getMagickVersion() {
+ global $wgMemc;
+
+ $cache = $wgMemc->get( "imagemagick-version" );
+ if ( !$cache ) {
+ global $wgImageMagickConvertCommand;
+ $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
+ wfDebug( __METHOD__ . ": Running convert -version\n" );
+ $retval = '';
+ $return = wfShellExec( $cmd, $retval );
+ $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
+ if ( $x != 1 ) {
+ wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+ return null;
+ }
+ $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
+ return $matches[1];
+ }
+ return $cache;
+ }
+
static function imageJpegWrapper( $dst_image, $thumbPath ) {
imageinterlace( $dst_image );
imagejpeg( $dst_image, $thumbPath, 95 );
@@ -342,7 +511,7 @@ class BitmapHandler extends ImageHandler {
function getMetadata( $image, $filename ) {
global $wgShowEXIF;
- if( $wgShowEXIF && file_exists( $filename ) ) {
+ if ( $wgShowEXIF && file_exists( $filename ) ) {
$exif = new Exif( $filename );
$data = $exif->getFilteredData();
if ( $data ) {
@@ -370,12 +539,14 @@ class BitmapHandler extends ImageHandler {
# Special value indicating that there is no EXIF data in the file
return true;
}
- $exif = @unserialize( $metadata );
+ wfSuppressWarnings();
+ $exif = unserialize( $metadata );
+ wfRestoreWarnings();
if ( !isset( $exif['MEDIAWIKI_EXIF_VERSION'] ) ||
$exif['MEDIAWIKI_EXIF_VERSION'] != Exif::version() )
{
# Wrong version
- wfDebug( __METHOD__.": wrong version\n" );
+ wfDebug( __METHOD__ . ": wrong version\n" );
return false;
}
return true;
@@ -391,9 +562,9 @@ class BitmapHandler extends ImageHandler {
function visibleMetadataFields() {
$fields = array();
$lines = explode( "\n", wfMsgForContent( 'metadata-fields' ) );
- foreach( $lines as $line ) {
+ foreach ( $lines as $line ) {
$matches = array();
- if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
+ if ( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
$fields[] = $matches[1];
}
}
diff --git a/includes/media/Bitmap_ClientOnly.php b/includes/media/Bitmap_ClientOnly.php
index 9801f9be..9f6f7b33 100644
--- a/includes/media/Bitmap_ClientOnly.php
+++ b/includes/media/Bitmap_ClientOnly.php
@@ -1,5 +1,19 @@
<?php
+/**
+ * Handler for bitmap images that will be resized by clients
+ *
+ * @file
+ * @ingroup Media
+ */
+/**
+ * Handler for bitmap images that will be resized by clients.
+ *
+ * This is not used by default but can be assigned to some image types
+ * using $wgMediaHandlers.
+ *
+ * @ingroup Media
+ */
class BitmapHandler_ClientOnly extends BitmapHandler {
function normaliseParams( $image, &$params ) {
return ImageHandler::normaliseParams( $image, $params );
diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php
index 38c16c21..cc3f1db5 100644
--- a/includes/media/DjVu.php
+++ b/includes/media/DjVu.php
@@ -1,10 +1,14 @@
<?php
/**
+ * Handler for DjVu images
+ *
* @file
* @ingroup Media
*/
/**
+ * Handler for DjVu images
+ *
* @ingroup Media
*/
class DjVuHandler extends ImageHandler {
@@ -104,6 +108,7 @@ class DjVuHandler extends ImageHandler {
$cmd .= ' > ' . wfEscapeShellArg($dstPath) . ') 2>&1';
wfProfileIn( 'ddjvu' );
wfDebug( __METHOD__.": $cmd\n" );
+ $retval = '';
$err = wfShellExec( $cmd, $retval );
wfProfileOut( 'ddjvu' );
@@ -181,7 +186,7 @@ class DjVuHandler extends ImageHandler {
return $this->getDjVuImage( $image, $path )->getImageSize();
}
- function getThumbType( $ext, $mime ) {
+ function getThumbType( $ext, $mime, $params = null ) {
global $wgDjvuOutputExtension;
static $mime;
if ( !isset( $mime ) ) {
diff --git a/includes/media/GIF.php b/includes/media/GIF.php
index dbe5f813..c4ede331 100644
--- a/includes/media/GIF.php
+++ b/includes/media/GIF.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Handler for GIF images.
+ *
* @file
* @ingroup Media
*/
@@ -12,7 +14,7 @@
class GIFHandler extends BitmapHandler {
function getMetadata( $image, $filename ) {
- if ( !isset($image->parsedGIFMetadata) ) {
+ if ( !isset( $image->parsedGIFMetadata ) ) {
try {
$image->parsedGIFMetadata = GIFMetadataExtractor::getMetadata( $filename );
} catch( Exception $e ) {
@@ -22,7 +24,7 @@ class GIFHandler extends BitmapHandler {
}
}
- return serialize($image->parsedGIFMetadata);
+ return serialize( $image->parsedGIFMetadata );
}
@@ -39,22 +41,41 @@ class GIFHandler extends BitmapHandler {
return $width * $height;
}
}
+
+ function isAnimatedImage( $image ) {
+ $ser = $image->getMetadata();
+ if ($ser) {
+ $metadata = unserialize($ser);
+ if( $metadata['frameCount'] > 1 ) return true;
+ }
+ return false;
+ }
function getMetadataType( $image ) {
return 'parsed-gif';
}
+ function isMetadataValid( $image, $metadata ) {
+ wfSuppressWarnings();
+ $data = unserialize( $metadata );
+ wfRestoreWarnings();
+ return (boolean) $data;
+ }
+
function getLongDesc( $image ) {
- global $wgUser, $wgLang;
- $sk = $wgUser->getSkin();
-
- $metadata = @unserialize($image->getMetadata());
+ global $wgLang;
+
+ $original = parent::getLongDesc( $image );
+
+ wfSuppressWarnings();
+ $metadata = unserialize($image->getMetadata());
+ wfRestoreWarnings();
- if (!$metadata) return parent::getLongDesc( $image );
+ if (!$metadata || $metadata['frameCount'] <= 1)
+ return $original;
$info = array();
- $info[] = $image->getMimeType();
- $info[] = $sk->formatSize( $image->getSize() );
+ $info[] = $original;
if ($metadata['looped'])
$info[] = wfMsgExt( 'file-info-gif-looped', 'parseinline' );
@@ -65,8 +86,6 @@ class GIFHandler extends BitmapHandler {
if ($metadata['duration'])
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
- $infoString = $wgLang->commaList( $info );
-
- return "($infoString)";
+ return $wgLang->commaList( $info );
}
}
diff --git a/includes/media/GIFMetadataExtractor.php b/includes/media/GIFMetadataExtractor.php
index fac9012b..bc1a4804 100644
--- a/includes/media/GIFMetadataExtractor.php
+++ b/includes/media/GIFMetadataExtractor.php
@@ -1,12 +1,21 @@
<?php
/**
- * GIF frame counter.
- * Originally written in Perl by Steve Sanbeg.
- * Ported to PHP by Andrew Garrett
- * Deliberately not using MWExceptions to avoid external dependencies, encouraging
- * redistribution.
- */
+ * GIF frame counter.
+ *
+ * Originally written in Perl by Steve Sanbeg.
+ * Ported to PHP by Andrew Garrett
+ * Deliberately not using MWExceptions to avoid external dependencies, encouraging
+ * redistribution.
+ *
+ * @file
+ * @ingroup Media
+ */
+/**
+ * GIF frame counter.
+ *
+ * @ingroup Media
+ */
class GIFMetadataExtractor {
static $gif_frame_sep;
static $gif_extension_sep;
diff --git a/includes/media/Generic.php b/includes/media/Generic.php
index 8a4d7054..fa4e731a 100644
--- a/includes/media/Generic.php
+++ b/includes/media/Generic.php
@@ -1,6 +1,7 @@
<?php
/**
* Media-handling base classes and generic functionality
+ *
* @file
* @ingroup Media
*/
@@ -72,7 +73,7 @@ abstract class MediaHandler {
* can't be determined.
*
* @param $image File: the image object, or false if there isn't one
- * @param $fileName String: the filename
+ * @param $path String: the filename
* @return Array
*/
abstract function getImageSize( $image, $path );
@@ -80,7 +81,8 @@ abstract class MediaHandler {
/**
* Get handler-specific metadata which will be saved in the img_metadata field.
*
- * @param $image File: the image object, or false if there isn't one
+ * @param $image File: the image object, or false if there isn't one.
+ * Warning, File::getPropsFromPath might pass an (object)array() instead (!)
* @param $path String: the filename
* @return String
*/
@@ -139,7 +141,7 @@ abstract class MediaHandler {
* Get the thumbnail extension and MIME type for a given source MIME type
* @return array thumbnail extension and MIME type
*/
- function getThumbType( $ext, $mime ) {
+ function getThumbType( $ext, $mime, $params = null ) {
return array( $ext, $mime );
}
@@ -161,6 +163,10 @@ abstract class MediaHandler {
*/
function pageCount( $file ) { return false; }
/**
+ * The material is vectorized and thus scaling is lossless
+ */
+ function isVectorized( $file ) { return false; }
+ /**
* False if the handler is disabled for all files
*/
function isEnabled() { return true; }
@@ -235,8 +241,8 @@ abstract class MediaHandler {
function getShortDesc( $file ) {
global $wgLang;
- $nbytes = '(' . wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $file->getSize() ) ) . ')';
+ $nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
+ $wgLang->formatNum( $file->getSize() ) );
return "$nbytes";
}
@@ -250,8 +256,8 @@ abstract class MediaHandler {
static function getGeneralShortDesc( $file ) {
global $wgLang;
- $nbytes = '(' . wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $file->getSize() ) ) . ')';
+ $nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
+ $wgLang->formatNum( $file->getSize() ) );
return "$nbytes";
}
@@ -273,6 +279,20 @@ abstract class MediaHandler {
function parserTransformHook( $parser, $file ) {}
/**
+ * File validation hook called on upload.
+ *
+ * If the file at the given local path is not valid, or its MIME type does not
+ * match the handler class, a Status object should be returned containing
+ * relevant errors.
+ *
+ * @param $fileName The local path to the file.
+ * @return Status object
+ */
+ function verifyUpload( $fileName ) {
+ return Status::newGood();
+ }
+
+ /**
* Check for zero-sized thumbnails. These can be generated when
* no disk space is available or some other error occurs
*
@@ -357,9 +377,19 @@ abstract class ImageHandler extends MediaHandler {
if ( !isset( $params['width'] ) ) {
return false;
}
+
if ( !isset( $params['page'] ) ) {
$params['page'] = 1;
+ } else {
+ if ( $params['page'] > $image->pageCount() ) {
+ $params['page'] = $image->pageCount();
+ }
+
+ if ( $params['page'] < 1 ) {
+ $params['page'] = 1;
+ }
}
+
$srcWidth = $image->getWidth( $params['page'] );
$srcHeight = $image->getHeight( $params['page'] );
if ( isset( $params['height'] ) && $params['height'] != -1 ) {
@@ -386,6 +416,9 @@ abstract class ImageHandler extends MediaHandler {
*
* @param $width Integer: specified width (input/output)
* @param $height Integer: height (output only)
+ * @param $srcWidth Integer: width of the source image
+ * @param $srcHeight Integer: height of the source image
+ * @param $mimeType Unused
* @return false to indicate that an error should be returned to the user.
*/
function validateThumbParams( &$width, &$height, $srcWidth, $srcHeight, $mimeType ) {
@@ -424,6 +457,10 @@ abstract class ImageHandler extends MediaHandler {
return $gis;
}
+ function isAnimatedImage( $image ) {
+ return false;
+ }
+
function getShortDesc( $file ) {
global $wgLang;
$nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
diff --git a/includes/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php
index a3fcc96e..c441f06c 100644
--- a/includes/MediaTransformOutput.php
+++ b/includes/media/MediaTransformOutput.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Base class for the output of file transformation methods.
+ *
* @file
* @ingroup Media
*/
@@ -34,7 +36,7 @@ abstract class MediaTransformOutput {
}
/**
- * @return string Destination file path (local filesystem)
+ * @return String: destination file path (local filesystem)
*/
function getPath() {
return $this->path;
@@ -43,7 +45,7 @@ abstract class MediaTransformOutput {
/**
* Fetch HTML for this transform output
*
- * @param array $options Associative array of options. Boolean options
+ * @param $options Associative array of options. Boolean options
* should be indicated with a value of true for true, and false or
* absent for false.
*
@@ -103,12 +105,17 @@ abstract class MediaTransformOutput {
* @ingroup Media
*/
class ThumbnailImage extends MediaTransformOutput {
+
/**
- * @param string $path Filesystem path to the thumb
- * @param string $url URL path to the thumb
+ * @param $file File object
+ * @param $url String: URL path to the thumb
+ * @param $width Integer: file's width
+ * @param $height Integer: file's height
+ * @param $path String: filesystem path to the thumb
+ * @param $page Integer: page number, for multipage files
* @private
*/
- function ThumbnailImage( $file, $url, $width, $height, $path = false, $page = false ) {
+ function __construct( $file, $url, $width, $height, $path = false, $page = false ) {
$this->file = $file;
$this->url = $url;
# These should be integers when they get here.
@@ -124,7 +131,7 @@ class ThumbnailImage extends MediaTransformOutput {
* Return HTML <img ... /> tag for the thumbnail, will include
* width and height attributes and a blank alt text (as required).
*
- * @param array $options Associative array of options. Boolean options
+ * @param $options Associative array of options. Boolean options
* should be indicated with a value of true for true, and false or
* absent for false.
*
@@ -133,16 +140,16 @@ class ThumbnailImage extends MediaTransformOutput {
* desc-link Boolean, show a description link
* file-link Boolean, show a file download link
* valign vertical-align property, if the output is an inline element
- * img-class Class applied to the <img> tag, if there is such a tag
+ * img-class Class applied to the \<img\> tag, if there is such a tag
* desc-query String, description link query params
* custom-url-link Custom URL to link to
* custom-title-link Custom Title object to link to
+ * custom target-link Value of the target attribute, for custom-target-link
*
* For images, desc-link and file-link are implemented as a click-through. For
* sounds and videos, they may be displayed in other ways.
*
* @return string
- * @public
*/
function toHtml( $options = array() ) {
if ( count( func_get_args() ) == 2 ) {
@@ -158,6 +165,9 @@ class ThumbnailImage extends MediaTransformOutput {
if ( !empty( $options['title'] ) ) {
$linkAttribs['title'] = $options['title'];
}
+ if ( !empty( $options['custom-target-link'] ) ) {
+ $linkAttribs['target'] = $options['custom-target-link'];
+ }
} elseif ( !empty( $options['custom-title-link'] ) ) {
$title = $options['custom-title-link'];
$linkAttribs = array(
@@ -211,10 +221,10 @@ class MediaTransformError extends MediaTransformOutput {
}
function toHtml( $options = array() ) {
- return "<table class=\"MediaTransformError\" style=\"" .
- "width: {$this->width}px; height: {$this->height}px;\"><tr><td>" .
+ return "<div class=\"MediaTransformError\" style=\"" .
+ "width: {$this->width}px; height: {$this->height}px; display:inline-block;\">" .
$this->htmlMsg .
- "</td></tr></table>";
+ "</div>";
}
function toText() {
@@ -238,8 +248,8 @@ class MediaTransformError extends MediaTransformOutput {
class TransformParameterError extends MediaTransformError {
function __construct( $params ) {
parent::__construct( 'thumbnail_error',
- max( isset( $params['width'] ) ? $params['width'] : 0, 180 ),
- max( isset( $params['height'] ) ? $params['height'] : 0, 180 ),
+ max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
+ max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
wfMsg( 'thumbnail_invalid_params' ) );
}
}
diff --git a/includes/media/PNG.php b/includes/media/PNG.php
new file mode 100644
index 00000000..5197282c
--- /dev/null
+++ b/includes/media/PNG.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Handler for PNG images.
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for PNG images.
+ *
+ * @ingroup Media
+ */
+class PNGHandler extends BitmapHandler {
+
+ function getMetadata( $image, $filename ) {
+ if ( !isset($image->parsedPNGMetadata) ) {
+ try {
+ $image->parsedPNGMetadata = PNGMetadataExtractor::getMetadata( $filename );
+ } catch( Exception $e ) {
+ // Broken file?
+ wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
+ return '0';
+ }
+ }
+
+ return serialize($image->parsedPNGMetadata);
+
+ }
+
+ function formatMetadata( $image ) {
+ return false;
+ }
+
+ function isAnimatedImage( $image ) {
+ $ser = $image->getMetadata();
+ if ($ser) {
+ $metadata = unserialize($ser);
+ if( $metadata['frameCount'] > 1 ) return true;
+ }
+ return false;
+ }
+
+ function getMetadataType( $image ) {
+ return 'parsed-png';
+ }
+
+ function isMetadataValid( $image, $metadata ) {
+ wfSuppressWarnings();
+ $data = unserialize( $metadata );
+ wfRestoreWarnings();
+ return (boolean) $data;
+ }
+ function getLongDesc( $image ) {
+ global $wgLang;
+ $original = parent::getLongDesc( $image );
+
+ wfSuppressWarnings();
+ $metadata = unserialize($image->getMetadata());
+ wfRestoreWarnings();
+
+ if( !$metadata || $metadata['frameCount'] <= 0 )
+ return $original;
+
+ $info = array();
+ $info[] = $original;
+
+ if ($metadata['loopCount'] == 0)
+ $info[] = wfMsgExt( 'file-info-png-looped', 'parseinline' );
+ elseif ($metadata['loopCount'] > 1)
+ $info[] = wfMsgExt( 'file-info-png-repeat', 'parseinline', $metadata['loopCount'] );
+
+ if ($metadata['frameCount'] > 0)
+ $info[] = wfMsgExt( 'file-info-png-frames', 'parseinline', $metadata['frameCount'] );
+
+ if ($metadata['duration'])
+ $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
+
+ return $wgLang->commaList( $info );
+ }
+
+}
diff --git a/includes/media/PNGMetadataExtractor.php b/includes/media/PNGMetadataExtractor.php
new file mode 100644
index 00000000..6a931e6c
--- /dev/null
+++ b/includes/media/PNGMetadataExtractor.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * PNG frame counter.
+ * Slightly derived from GIFMetadataExtractor.php
+ * Deliberately not using MWExceptions to avoid external dependencies, encouraging
+ * redistribution.
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * PNG frame counter.
+ *
+ * @ingroup Media
+ */
+class PNGMetadataExtractor {
+ static $png_sig;
+ static $CRC_size;
+
+ static function getMetadata( $filename ) {
+ self::$png_sig = pack( "C8", 137, 80, 78, 71, 13, 10, 26, 10 );
+ self::$CRC_size = 4;
+
+ $frameCount = 0;
+ $loopCount = 1;
+ $duration = 0.0;
+
+ if (!$filename)
+ throw new Exception( __METHOD__ . ": No file name specified" );
+ elseif ( !file_exists($filename) || is_dir($filename) )
+ throw new Exception( __METHOD__ . ": File $filename does not exist" );
+
+ $fh = fopen( $filename, 'r' );
+
+ if (!$fh) {
+ throw new Exception( __METHOD__ . ": Unable to open file $filename" );
+ }
+
+ // Check for the PNG header
+ $buf = fread( $fh, 8 );
+ if ( $buf != self::$png_sig ) {
+ throw new Exception( __METHOD__ . ": Not a valid PNG file; header: $buf" );
+ }
+
+ // Read chunks
+ while( !feof( $fh ) ) {
+ $buf = fread( $fh, 4 );
+ if( !$buf ) {
+ throw new Exception( __METHOD__ . ": Read error" );
+ }
+ $chunk_size = unpack( "N", $buf);
+ $chunk_size = $chunk_size[1];
+
+ $chunk_type = fread( $fh, 4 );
+ if( !$chunk_type ) {
+ throw new Exception( __METHOD__ . ": Read error" );
+ }
+
+ if ( $chunk_type == "acTL" ) {
+ $buf = fread( $fh, $chunk_size );
+ if( !$buf ) {
+ throw new Exception( __METHOD__ . ": Read error" );
+ }
+
+ $actl = unpack( "Nframes/Nplays", $buf );
+ $frameCount = $actl['frames'];
+ $loopCount = $actl['plays'];
+ } elseif ( $chunk_type == "fcTL" ) {
+ $buf = fread( $fh, $chunk_size );
+ if( !$buf ) {
+ throw new Exception( __METHOD__ . ": Read error" );
+ }
+ $buf = substr( $buf, 20 );
+
+ $fctldur = unpack( "ndelay_num/ndelay_den", $buf );
+ if( $fctldur['delay_den'] == 0 ) $fctldur['delay_den'] = 100;
+ if( $fctldur['delay_num'] ) {
+ $duration += $fctldur['delay_num'] / $fctldur['delay_den'];
+ }
+ } elseif ( ( $chunk_type == "IDAT" || $chunk_type == "IEND" ) && $frameCount == 0 ) {
+ // Not a valid animated image. No point in continuing.
+ break;
+ } elseif ( $chunk_type == "IEND" ) {
+ break;
+ } else {
+ fseek( $fh, $chunk_size, SEEK_CUR );
+ }
+ fseek( $fh, self::$CRC_size, SEEK_CUR );
+ }
+ fclose( $fh );
+
+ if( $loopCount > 1 ) {
+ $duration *= $loopCount;
+ }
+
+ return array(
+ 'frameCount' => $frameCount,
+ 'loopCount' => $loopCount,
+ 'duration' => $duration
+ );
+
+ }
+}
diff --git a/includes/media/SVG.php b/includes/media/SVG.php
index 4cc66fb1..9a8484f1 100644
--- a/includes/media/SVG.php
+++ b/includes/media/SVG.php
@@ -1,13 +1,19 @@
<?php
/**
+ * Handler for SVG images.
+ *
* @file
* @ingroup Media
*/
/**
+ * Handler for SVG images.
+ *
* @ingroup Media
*/
class SvgHandler extends ImageHandler {
+ const SVG_METADATA_VERSION = 2;
+
function isEnabled() {
global $wgSVGConverters, $wgSVGConverter;
if ( !isset( $wgSVGConverters[$wgSVGConverter] ) ) {
@@ -22,6 +28,22 @@ class SvgHandler extends ImageHandler {
return true;
}
+ function isVectorized( $file ) {
+ return true;
+ }
+
+ function isAnimatedImage( $file ) {
+ # TODO: detect animated SVGs
+ $metadata = $file->getMetadata();
+ if ( $metadata ) {
+ $metadata = $this->unpackMetadata( $metadata );
+ if( isset( $metadata['animated'] ) ) {
+ return $metadata['animated'];
+ }
+ }
+ return false;
+ }
+
function normaliseParams( $image, &$params ) {
global $wgSVGMaxSize;
if ( !parent::normaliseParams( $image, $params ) ) {
@@ -57,7 +79,7 @@ class SvgHandler extends ImageHandler {
return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
wfMsg( 'thumbnail_dest_directory' ) );
}
-
+
$status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
if( $status === true ) {
return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
@@ -65,7 +87,7 @@ class SvgHandler extends ImageHandler {
return $status; // MediaTransformError
}
}
-
+
/*
* Transform an SVG file to PNG
* This function can be called outside of thumbnail contexts
@@ -78,6 +100,7 @@ class SvgHandler extends ImageHandler {
public function rasterize( $srcPath, $dstPath, $width, $height ) {
global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
$err = false;
+ $retval = '';
if ( isset( $wgSVGConverters[$wgSVGConverter] ) ) {
$cmd = str_replace(
array( '$path/', '$width', '$height', '$input', '$output' ),
@@ -102,11 +125,19 @@ class SvgHandler extends ImageHandler {
return true;
}
- function getImageSize( $image, $path ) {
- return wfGetSVGsize( $path );
+ function getImageSize( $file, $path, $metadata = false ) {
+ if ( $metadata === false ) {
+ $metadata = $file->getMetaData();
+ }
+ $metadata = $this->unpackMetaData( $metadata );
+
+ if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) {
+ return array( $metadata['width'], $metadata['height'], 'SVG',
+ "width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" );
+ }
}
- function getThumbType( $ext, $mime ) {
+ function getThumbType( $ext, $mime, $params = null ) {
return array( 'png', 'image/png' );
}
@@ -117,4 +148,84 @@ class SvgHandler extends ImageHandler {
$wgLang->formatNum( $file->getHeight() ),
$wgLang->formatSize( $file->getSize() ) );
}
+
+ function getMetadata( $file, $filename ) {
+ try {
+ $metadata = SVGMetadataExtractor::getMetadata( $filename );
+ } catch( Exception $e ) {
+ // Broken file?
+ wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
+ return '0';
+ }
+ $metadata['version'] = self::SVG_METADATA_VERSION;
+ return serialize( $metadata );
+ }
+
+ function unpackMetadata( $metadata ) {
+ $unser = @unserialize( $metadata );
+ if ( isset( $unser['version'] ) && $unser['version'] == self::SVG_METADATA_VERSION ) {
+ return $unser;
+ } else {
+ return false;
+ }
+ }
+
+ function getMetadataType( $image ) {
+ return 'parsed-svg';
+ }
+
+ function isMetadataValid( $image, $metadata ) {
+ return $this->unpackMetadata( $metadata ) !== false;
+ }
+
+ function visibleMetadataFields() {
+ $fields = array( 'title', 'description', 'animated' );
+ return $fields;
+ }
+
+ function formatMetadata( $file ) {
+ $result = array(
+ 'visible' => array(),
+ 'collapsed' => array()
+ );
+ $metadata = $file->getMetadata();
+ if ( !$metadata ) {
+ return false;
+ }
+ $metadata = $this->unpackMetadata( $metadata );
+ if ( !$metadata ) {
+ return false;
+ }
+ unset( $metadata['version'] );
+ unset( $metadata['metadata'] ); /* non-formatted XML */
+
+ /* TODO: add a formatter
+ $format = new FormatSVG( $metadata );
+ $formatted = $format->getFormattedData();
+ */
+
+ // Sort fields into visible and collapsed
+ $visibleFields = $this->visibleMetadataFields();
+
+ // Rename fields to be compatible with exif, so that
+ // the labels for these fields work.
+ $conversion = array( 'width' => 'imagewidth',
+ 'height' => 'imagelength',
+ 'description' => 'imagedescription',
+ 'title' => 'objectname',
+ );
+ foreach ( $metadata as $name => $value ) {
+ $tag = strtolower( $name );
+ if ( isset( $conversion[$tag] ) ) {
+ $tag = $conversion[$tag];
+ }
+ self::addMeta( $result,
+ in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
+ 'exif',
+ $tag,
+ $value
+ );
+ }
+ return $result;
+ }
}
diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php
new file mode 100644
index 00000000..66ae1edf
--- /dev/null
+++ b/includes/media/SVGMetadataExtractor.php
@@ -0,0 +1,313 @@
+<?php
+/**
+ * SVGMetadataExtractor.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 Media
+ * @author Derk-Jan Hartman <hartman _at_ videolan d0t org>
+ * @author Brion Vibber
+ * @copyright Copyright © 2010-2010 Brion Vibber, Derk-Jan Hartman
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
+ */
+
+class SVGMetadataExtractor {
+ static function getMetadata( $filename ) {
+ $svg = new SVGReader( $filename );
+ return $svg->getMetadata();
+ }
+}
+
+class SVGReader {
+ const DEFAULT_WIDTH = 512;
+ const DEFAULT_HEIGHT = 512;
+ const NS_SVG = 'http://www.w3.org/2000/svg';
+
+ private $reader = null;
+ private $mDebug = false;
+ private $metadata = Array();
+
+ /**
+ * Constructor
+ *
+ * Creates an SVGReader drawing from the source provided
+ * @param $source String: URI from which to read
+ */
+ function __construct( $source ) {
+ global $wgSVGMetadataCutoff;
+ $this->reader = new XMLReader();
+
+ // Don't use $file->getSize() since file object passed to SVGHandler::getMetadata is bogus.
+ $size = filesize( $source );
+ if ( $size === false ) {
+ throw new MWException( "Error getting filesize of SVG." );
+ }
+
+ if ( $size > $wgSVGMetadataCutoff ) {
+ $this->debug( "SVG is $size bytes, which is bigger than $wgSVGMetadataCutoff. Truncating." );
+ $contents = file_get_contents( $source, false, null, -1, $wgSVGMetadataCutoff );
+ if ($contents === false) {
+ throw new MWException( 'Error reading SVG file.' );
+ }
+ $this->reader->XML( $contents, null, LIBXML_NOERROR | LIBXML_NOWARNING );
+ } else {
+ $this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING );
+ }
+
+ $this->metadata['width'] = self::DEFAULT_WIDTH;
+ $this->metadata['height'] = self::DEFAULT_HEIGHT;
+
+ // Because we cut off the end of the svg making an invalid one. Complicated
+ // try catch thing to make sure warnings get restored. Seems like there should
+ // be a better way.
+ wfSuppressWarnings();
+ try {
+ $this->read();
+ } catch( Exception $e ) {
+ wfRestoreWarnings();
+ throw $e;
+ }
+ wfRestoreWarnings();
+ }
+
+ /*
+ * @return Array with the known metadata
+ */
+ public function getMetadata() {
+ return $this->metadata;
+ }
+
+ /*
+ * Read the SVG
+ */
+ public function read() {
+ $keepReading = $this->reader->read();
+
+ /* Skip until first element */
+ while( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
+ $keepReading = $this->reader->read();
+ }
+
+ if ( $this->reader->localName != 'svg' || $this->reader->namespaceURI != self::NS_SVG ) {
+ throw new MWException( "Expected <svg> tag, got ".
+ $this->reader->localName . " in NS " . $this->reader->namespaceURI );
+ }
+ $this->debug( "<svg> tag is correct." );
+ $this->handleSVGAttribs();
+
+ $exitDepth = $this->reader->depth;
+ $keepReading = $this->reader->read();
+ while ( $keepReading ) {
+ $tag = $this->reader->localName;
+ $type = $this->reader->nodeType;
+ $isSVG = ($this->reader->namespaceURI == self::NS_SVG);
+
+ $this->debug( "$tag" );
+
+ if ( $isSVG && $tag == 'svg' && $type == XmlReader::END_ELEMENT && $this->reader->depth <= $exitDepth ) {
+ break;
+ } elseif ( $isSVG && $tag == 'title' ) {
+ $this->readField( $tag, 'title' );
+ } elseif ( $isSVG && $tag == 'desc' ) {
+ $this->readField( $tag, 'description' );
+ } elseif ( $isSVG && $tag == 'metadata' && $type == XmlReader::ELEMENT ) {
+ $this->readXml( $tag, 'metadata' );
+ } elseif ( $tag !== '#text' ) {
+ $this->debug( "Unhandled top-level XML tag $tag" );
+
+ if ( !isset( $this->metadata['animated'] ) ) {
+ // Recurse into children of current tag, looking for animation.
+ $this->animateFilter( $tag );
+ }
+ }
+
+ // Goto next element, which is sibling of current (Skip children).
+ $keepReading = $this->reader->next();
+ }
+
+ return true;
+ }
+
+ /*
+ * Read a textelement from an element
+ *
+ * @param String $name of the element that we are reading from
+ * @param String $metafield that we will fill with the result
+ */
+ private function readField( $name, $metafield=null ) {
+ $this->debug ( "Read field $metafield" );
+ if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+ return;
+ }
+ $keepReading = $this->reader->read();
+ while( $keepReading ) {
+ if( $this->reader->localName == $name && $this->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
+ break;
+ } elseif( $this->reader->nodeType == XmlReader::TEXT ){
+ $this->metadata[$metafield] = trim( $this->reader->value );
+ }
+ $keepReading = $this->reader->read();
+ }
+ }
+
+ /*
+ * Read an XML snippet from an element
+ *
+ * @param String $metafield that we will fill with the result
+ */
+ private function readXml( $metafield=null ) {
+ $this->debug ( "Read top level metadata" );
+ if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+ return;
+ }
+ // TODO: find and store type of xml snippet. metadata['metadataType'] = "rdf"
+ $this->metadata[$metafield] = trim( $this->reader->readInnerXML() );
+ $this->reader->next();
+ }
+
+ /*
+ * Filter all children, looking for animate elements
+ *
+ * @param String $name of the element that we are reading from
+ */
+ private function animateFilter( $name ) {
+ $this->debug ( "animate filter" );
+ if( $this->reader->nodeType != XmlReader::ELEMENT ) {
+ return;
+ }
+ $exitDepth = $this->reader->depth;
+ $keepReading = $this->reader->read();
+ while( $keepReading ) {
+ if( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
+ && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
+ break;
+ } elseif ( $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::ELEMENT ) {
+ switch( $this->reader->localName ) {
+ case 'animate':
+ case 'set':
+ case 'animateMotion':
+ case 'animateColor':
+ case 'animateTransform':
+ $this->debug( "HOUSTON WE HAVE ANIMATION" );
+ $this->metadata['animated'] = true;
+ break;
+ }
+ }
+ $keepReading = $this->reader->read();
+ }
+ }
+
+ private function throwXmlError( $err ) {
+ $this->debug( "FAILURE: $err" );
+ wfDebug( "SVGReader XML error: $err\n" );
+ }
+
+ private function debug( $data ) {
+ if( $this->mDebug ) {
+ wfDebug( "SVGReader: $data\n" );
+ }
+ }
+
+ private function warn( $data ) {
+ wfDebug( "SVGReader: $data\n" );
+ }
+
+ private function notice( $data ) {
+ wfDebug( "SVGReader WARN: $data\n" );
+ }
+
+ /*
+ * Parse the attributes of an SVG element
+ *
+ * The parser has to be in the start element of <svg>
+ */
+ private function handleSVGAttribs( ) {
+ $defaultWidth = self::DEFAULT_WIDTH;
+ $defaultHeight = self::DEFAULT_HEIGHT;
+ $aspect = 1.0;
+ $width = null;
+ $height = null;
+
+ if( $this->reader->getAttribute('viewBox') ) {
+ // min-x min-y width height
+ $viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute('viewBox') ) );
+ if( count( $viewBox ) == 4 ) {
+ $viewWidth = $this->scaleSVGUnit( $viewBox[2] );
+ $viewHeight = $this->scaleSVGUnit( $viewBox[3] );
+ if( $viewWidth > 0 && $viewHeight > 0 ) {
+ $aspect = $viewWidth / $viewHeight;
+ $defaultHeight = $defaultWidth / $aspect;
+ }
+ }
+ }
+ if( $this->reader->getAttribute('width') ) {
+ $width = $this->scaleSVGUnit( $this->reader->getAttribute('width'), $defaultWidth );
+ }
+ if( $this->reader->getAttribute('height') ) {
+ $height = $this->scaleSVGUnit( $this->reader->getAttribute('height'), $defaultHeight );
+ }
+
+ if( !isset( $width ) && !isset( $height ) ) {
+ $width = $defaultWidth;
+ $height = $width / $aspect;
+ } elseif( isset( $width ) && !isset( $height ) ) {
+ $height = $width / $aspect;
+ } elseif( isset( $height ) && !isset( $width ) ) {
+ $width = $height * $aspect;
+ }
+
+ if( $width > 0 && $height > 0 ) {
+ $this->metadata['width'] = intval( round( $width ) );
+ $this->metadata['height'] = intval( round( $height ) );
+ }
+ }
+
+ /**
+ * Return a rounded pixel equivalent for a labeled CSS/SVG length.
+ * http://www.w3.org/TR/SVG11/coords.html#UnitIdentifiers
+ *
+ * @param $length String: CSS/SVG length.
+ * @param $viewportSize: Float optional scale for percentage units...
+ * @return float: length in pixels
+ */
+ static function scaleSVGUnit( $length, $viewportSize=512 ) {
+ static $unitLength = array(
+ 'px' => 1.0,
+ 'pt' => 1.25,
+ 'pc' => 15.0,
+ 'mm' => 3.543307,
+ 'cm' => 35.43307,
+ 'in' => 90.0,
+ 'em' => 16.0, // fake it?
+ 'ex' => 12.0, // fake it?
+ '' => 1.0, // "User units" pixels by default
+ );
+ $matches = array();
+ if( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
+ $length = floatval( $matches[1] );
+ $unit = $matches[2];
+ if( $unit == '%' ) {
+ return $length * 0.01 * $viewportSize;
+ } else {
+ return $length * $unitLength[$unit];
+ }
+ } else {
+ // Assume pixels
+ return floatval( $length );
+ }
+ }
+}
diff --git a/includes/media/Tiff.php b/includes/media/Tiff.php
index 9d3fbb78..8773201f 100644
--- a/includes/media/Tiff.php
+++ b/includes/media/Tiff.php
@@ -1,10 +1,14 @@
<?php
/**
+ * Handler for Tiff images.
+ *
* @file
* @ingroup Media
*/
/**
+ * Handler for Tiff images.
+ *
* @ingroup Media
*/
class TiffHandler extends BitmapHandler {
@@ -26,7 +30,7 @@ class TiffHandler extends BitmapHandler {
return true;
}
- function getThumbType( $ext, $mime ) {
+ function getThumbType( $ext, $mime, $params = null ) {
global $wgTiffThumbnailType;
return $wgTiffThumbnailType;
}
diff --git a/includes/memcached-client.php b/includes/memcached-client.php
index 3b0ae90d..53f0324f 100644
--- a/includes/memcached-client.php
+++ b/includes/memcached-client.php
@@ -1,40 +1,41 @@
<?php
-//
-// +---------------------------------------------------------------------------+
-// | memcached client, PHP |
-// +---------------------------------------------------------------------------+
-// | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net> |
-// | All rights reserved. |
-// | |
-// | Redistribution and use in source and binary forms, with or without |
-// | modification, are permitted provided that the following conditions |
-// | are met: |
-// | |
-// | 1. Redistributions of source code must retain the above copyright |
-// | notice, this list of conditions and the following disclaimer. |
-// | 2. Redistributions in binary form must reproduce the above copyright |
-// | notice, this list of conditions and the following disclaimer in the |
-// | documentation and/or other materials provided with the distribution. |
-// | |
-// | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
-// | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
-// | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
-// | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
-// | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
-// | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-// +---------------------------------------------------------------------------+
-// | Author: Ryan T. Dean <rtdean@cytherianage.net> |
-// | Heavily influenced by the Perl memcached client by Brad Fitzpatrick. |
-// | Permission granted by Brad Fitzpatrick for relicense of ported Perl |
-// | client logic under 2-clause BSD license. |
-// +---------------------------------------------------------------------------+
-//
-// $TCAnet$
-//
+/**
+ * +---------------------------------------------------------------------------+
+ * | memcached client, PHP |
+ * +---------------------------------------------------------------------------+
+ * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net> |
+ * | All rights reserved. |
+ * | |
+ * | Redistribution and use in source and binary forms, with or without |
+ * | modification, are permitted provided that the following conditions |
+ * | are met: |
+ * | |
+ * | 1. Redistributions of source code must retain the above copyright |
+ * | notice, this list of conditions and the following disclaimer. |
+ * | 2. Redistributions in binary form must reproduce the above copyright |
+ * | notice, this list of conditions and the following disclaimer in the |
+ * | documentation and/or other materials provided with the distribution. |
+ * | |
+ * | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
+ * | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
+ * | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
+ * | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
+ * | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
+ * | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
+ * | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ * +---------------------------------------------------------------------------+
+ * | Author: Ryan T. Dean <rtdean@cytherianage.net> |
+ * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick. |
+ * | Permission granted by Brad Fitzpatrick for relicense of ported Perl |
+ * | client logic under 2-clause BSD license. |
+ * +---------------------------------------------------------------------------+
+ *
+ * @file
+ * $TCAnet$
+ */
/**
* This is the PHP client for memcached - a distributed memory cache daemon.
@@ -239,17 +240,17 @@ class MWMemcached {
/**
* Memcache initializer
*
- * @param array $args Associative array of settings
+ * @param $args Array Associative array of settings
*
* @return mixed
*/
public function __construct( $args ) {
global $wgMemCachedTimeout;
- $this->set_servers( @$args['servers'] );
- $this->_debug = @$args['debug'];
+ $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
+ $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
$this->stats = array();
- $this->_compress_threshold = @$args['compress_threshold'];
- $this->_persistant = array_key_exists( 'persistant', $args ) ? ( @$args['persistant'] ) : false;
+ $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
+ $this->_persistant = isset( $args['persistant'] ) ? $args['persistant'] : false;
$this->_compress_enable = true;
$this->_have_zlib = function_exists( 'gzcompress' );
@@ -270,11 +271,15 @@ class MWMemcached {
* Adds a key/value to the memcache server if one isn't already set with
* that key
*
- * @param string $key Key to set with data
- * @param mixed $val Value to store
- * @param integer $exp (optional) Time to expire data at
+ * @param $key String: key to set with data
+ * @param $val Mixed: value to store
+ * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+ * to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
+ * longer must be the timestamp of the time at which the mapping should expire. It
+ * is safe to use timestamps in all cases, regardless of exipration
+ * eg: strtotime("+3 hour")
*
- * @return boolean
+ * @return Boolean
*/
public function add( $key, $val, $exp = 0 ) {
return $this->_set( 'add', $key, $val, $exp );
@@ -284,12 +289,12 @@ class MWMemcached {
// {{{ decr()
/**
- * Decriment a value stored on the memcache server
+ * Decrease a value stored on the memcache server
*
- * @param string $key Key to decriment
- * @param integer $amt (optional) Amount to decriment
+ * @param $key String: key to decrease
+ * @param $amt Integer: (optional) amount to decrease
*
- * @return mixed FALSE on failure, value on success
+ * @return Mixed: FALSE on failure, value on success
*/
public function decr( $key, $amt = 1 ) {
return $this->_incrdecr( 'decr', $key, $amt );
@@ -301,10 +306,10 @@ class MWMemcached {
/**
* Deletes a key from the server, optionally after $time
*
- * @param string $key Key to delete
- * @param integer $time (optional) How long to wait before deleting
+ * @param $key String: key to delete
+ * @param $time Integer: (optional) how long to wait before deleting
*
- * @return boolean TRUE on success, FALSE on failure
+ * @return Boolean: TRUE on success, FALSE on failure
*/
public function delete( $key, $time = 0 ) {
if ( !$this->_active ) {
@@ -318,7 +323,11 @@ class MWMemcached {
$key = is_array( $key ) ? $key[1] : $key;
- @$this->stats['delete']++;
+ if ( isset( $this->stats['delete'] ) ) {
+ $this->stats['delete']++;
+ } else {
+ $this->stats['delete'] = 1;
+ }
$cmd = "delete $key $time\r\n";
if( !$this->_safe_fwrite( $sock, $cmd, strlen( $cmd ) ) ) {
$this->_dead_sock( $sock );
@@ -356,7 +365,7 @@ class MWMemcached {
/**
* Enable / Disable compression
*
- * @param boolean $enable TRUE to enable, FALSE to disable
+ * @param $enable Boolean: TRUE to enable, FALSE to disable
*/
public function enable_compress( $enable ) {
$this->_compress_enable = $enable;
@@ -378,9 +387,9 @@ class MWMemcached {
/**
* Retrieves the value associated with the key from the memcache server
*
- * @param string $key Key to retrieve
+ * @param $key Mixed: key to retrieve
*
- * @return mixed
+ * @return Mixed
*/
public function get( $key ) {
wfProfileIn( __METHOD__ );
@@ -401,7 +410,11 @@ class MWMemcached {
return false;
}
- @$this->stats['get']++;
+ if ( isset( $this->stats['get'] ) ) {
+ $this->stats['get']++;
+ } else {
+ $this->stats['get'] = 1;
+ }
$cmd = "get $key\r\n";
if ( !$this->_safe_fwrite( $sock, $cmd, strlen( $cmd ) ) ) {
@@ -429,16 +442,20 @@ class MWMemcached {
/**
* Get multiple keys from the server(s)
*
- * @param array $keys Keys to retrieve
+ * @param $keys Array: keys to retrieve
*
- * @return array
+ * @return Array
*/
public function get_multi( $keys ) {
if ( !$this->_active ) {
return false;
}
- @$this->stats['get_multi']++;
+ if ( isset( $this->stats['get_multi'] ) ) {
+ $this->stats['get_multi']++;
+ } else {
+ $this->stats['get_multi'] = 1;
+ }
$sock_keys = array();
foreach ( $keys as $key ) {
@@ -490,10 +507,12 @@ class MWMemcached {
/**
* Increments $key (optionally) by $amt
*
- * @param string $key Key to increment
- * @param integer $amt (optional) amount to increment
+ * @param $key String: key to increment
+ * @param $amt Integer: (optional) amount to increment
*
- * @return integer New key value?
+ * @return Integer: null if the key does not exist yet (this does NOT
+ * create new mappings if the key does not exist). If the key does
+ * exist, this returns the new value for that key.
*/
public function incr( $key, $amt = 1 ) {
return $this->_incrdecr( 'incr', $key, $amt );
@@ -505,11 +524,15 @@ class MWMemcached {
/**
* Overwrites an existing value for key; only works if key is already set
*
- * @param string $key Key to set value as
- * @param mixed $value Value to store
- * @param integer $exp (optional) Experiation time
+ * @param $key String: key to set value as
+ * @param $value Mixed: value to store
+ * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+ * to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
+ * longer must be the timestamp of the time at which the mapping should expire. It
+ * is safe to use timestamps in all cases, regardless of exipration
+ * eg: strtotime("+3 hour")
*
- * @return boolean
+ * @return Boolean
*/
public function replace( $key, $value, $exp = 0 ) {
return $this->_set( 'replace', $key, $value, $exp );
@@ -528,13 +551,12 @@ class MWMemcached {
* with a \n. This is with the PHP flag auto_detect_line_endings set
* to falase (the default).
*
- * @param resource $sock Socket to send command on
- * @param string $cmd Command to run
+ * @param $sock Ressource: socket to send command on
+ * @param $cmd String: command to run
*
- * @return array Output array
- * @access public
+ * @return Array: output array
*/
- function run_command( $sock, $cmd ) {
+ public function run_command( $sock, $cmd ) {
if ( !is_resource( $sock ) ) {
return array();
}
@@ -563,11 +585,15 @@ class MWMemcached {
* Unconditionally sets a key to a given value in the memcache. Returns true
* if set successfully.
*
- * @param string $key Key to set value as
- * @param mixed $value Value to set
- * @param integer $exp (optional) Experiation time
+ * @param $key String: key to set value as
+ * @param $value Mixed: value to set
+ * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+ * to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
+ * longer must be the timestamp of the time at which the mapping should expire. It
+ * is safe to use timestamps in all cases, regardless of exipration
+ * eg: strtotime("+3 hour")
*
- * @return boolean TRUE on success
+ * @return Boolean: TRUE on success
*/
public function set( $key, $value, $exp = 0 ) {
return $this->_set( 'set', $key, $value, $exp );
@@ -579,7 +605,7 @@ class MWMemcached {
/**
* Sets the compression threshold
*
- * @param integer $thresh Threshold to compress if larger than
+ * @param $thresh Integer: threshold to compress if larger than
*/
public function set_compress_threshold( $thresh ) {
$this->_compress_threshold = $thresh;
@@ -591,7 +617,7 @@ class MWMemcached {
/**
* Sets the debug flag
*
- * @param boolean $dbg TRUE for debugging, FALSE otherwise
+ * @param $dbg Boolean: TRUE for debugging, FALSE otherwise
*
* @see MWMemcached::__construct
*/
@@ -605,7 +631,7 @@ class MWMemcached {
/**
* Sets the server list to distribute key gets and puts between
*
- * @param array $list Array of servers to connect to
+ * @param $list Array of servers to connect to
*
* @see MWMemcached::__construct()
*/
@@ -624,8 +650,8 @@ class MWMemcached {
/**
* Sets the timeout for new connections
*
- * @param integer $seconds Number of seconds
- * @param integer $microseconds Number of microseconds
+ * @param $seconds Integer: number of seconds
+ * @param $microseconds Integer: number of microseconds
*/
public function set_timeout( $seconds, $microseconds ) {
$this->_timeout_seconds = $seconds;
@@ -640,7 +666,7 @@ class MWMemcached {
/**
* Close the specified socket
*
- * @param string $sock Socket to close
+ * @param $sock String: socket to close
*
* @access private
*/
@@ -656,8 +682,8 @@ class MWMemcached {
/**
* Connects $sock to $host, timing out after $timeout
*
- * @param integer $sock Socket to connect
- * @param string $host Host:IP to connect to
+ * @param $sock Integer: socket to connect
+ * @param $host String: Host:IP to connect to
*
* @return boolean
* @access private
@@ -668,11 +694,13 @@ class MWMemcached {
$timeout = $this->_connect_timeout;
$errno = $errstr = null;
for( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+ wfSuppressWarnings();
if ( $this->_persistant == 1 ) {
- $sock = @pfsockopen( $ip, $port, $errno, $errstr, $timeout );
+ $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
} else {
- $sock = @fsockopen( $ip, $port, $errno, $errstr, $timeout );
+ $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
}
+ wfRestoreWarnings();
}
if ( !$sock ) {
if ( $this->_debug ) {
@@ -693,7 +721,7 @@ class MWMemcached {
/**
* Marks a host as dead until 30-40 seconds in the future
*
- * @param string $sock Socket to mark as dead
+ * @param $sock String: socket to mark as dead
*
* @access private
*/
@@ -703,7 +731,8 @@ class MWMemcached {
}
function _dead_host( $host ) {
- @list( $ip, /* $port */) = explode( ':', $host );
+ $parts = explode( ':', $host );
+ $ip = $parts[0];
$this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
$this->_host_dead[$host] = $this->_host_dead[$ip];
unset( $this->_cache_sock[$host] );
@@ -715,10 +744,10 @@ class MWMemcached {
/**
* get_sock
*
- * @param string $key Key to retrieve value for;
+ * @param $key String: key to retrieve value for;
*
- * @return mixed resource on success, false on failure
- * @access private
+ * @return Mixed: resource on success, false on failure
+ * @access private
*/
function get_sock( $key ) {
if ( !$this->_active ) {
@@ -764,12 +793,12 @@ class MWMemcached {
// {{{ _hashfunc()
/**
- * Creates a hash integer based on the $key
+ * Creates a hash integer based on the $key
*
- * @param string $key Key to hash
+ * @param $key String: key to hash
*
- * @return integer Hash value
- * @access private
+ * @return Integer: hash value
+ * @access private
*/
function _hashfunc( $key ) {
# Hash function must on [0,0x7ffffff]
@@ -784,12 +813,12 @@ class MWMemcached {
/**
* Perform increment/decriment on $key
*
- * @param string $cmd Command to perform
- * @param string $key Key to perform it on
- * @param integer $amt Amount to adjust
+ * @param $cmd String: command to perform
+ * @param $key String: key to perform it on
+ * @param $amt Integer: amount to adjust
*
- * @return integer New value of $key
- * @access private
+ * @return Integer: new value of $key
+ * @access private
*/
function _incrdecr( $cmd, $key, $amt = 1 ) {
if ( !$this->_active ) {
@@ -802,7 +831,11 @@ class MWMemcached {
}
$key = is_array( $key ) ? $key[1] : $key;
- @$this->stats[$cmd]++;
+ if ( isset( $this->stats[$cmd] ) ) {
+ $this->stats[$cmd]++;
+ } else {
+ $this->stats[$cmd] = 1;
+ }
if ( !$this->_safe_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
return $this->_dead_sock( $sock );
}
@@ -821,10 +854,10 @@ class MWMemcached {
/**
* Load items into $ret from $sock
*
- * @param resource $sock Socket to read from
- * @param array $ret Returned values
+ * @param $sock Ressource: socket to read from
+ * @param $ret Array: returned values
*
- * @access private
+ * @access private
*/
function _load_items( $sock, &$ret ) {
while ( 1 ) {
@@ -844,7 +877,11 @@ class MWMemcached {
}
$offset += $n;
$bneed -= $n;
- @$ret[$rkey] .= $data;
+ if ( isset( $ret[$rkey] ) ) {
+ $ret[$rkey] .= $data;
+ } else {
+ $ret[$rkey] = $data;
+ }
}
if ( $offset != $len + 2 ) {
@@ -881,13 +918,17 @@ class MWMemcached {
/**
* Performs the requested storage operation to the memcache server
*
- * @param string $cmd Command to perform
- * @param string $key Key to act on
- * @param mixed $val What we need to store
- * @param integer $exp When it should expire
+ * @param $cmd String: command to perform
+ * @param $key String: key to act on
+ * @param $val Mixed: what we need to store
+ * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+ * to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
+ * longer must be the timestamp of the time at which the mapping should expire. It
+ * is safe to use timestamps in all cases, regardless of exipration
+ * eg: strtotime("+3 hour")
*
- * @return boolean
- * @access private
+ * @return Boolean
+ * @access private
*/
function _set( $cmd, $key, $val, $exp ) {
if ( !$this->_active ) {
@@ -899,7 +940,11 @@ class MWMemcached {
return false;
}
- @$this->stats[$cmd]++;
+ if ( isset( $this->stats[$cmd] ) ) {
+ $this->stats[$cmd]++;
+ } else {
+ $this->stats[$cmd] = 1;
+ }
$flags = 0;
@@ -949,10 +994,10 @@ class MWMemcached {
/**
* Returns the socket for the host
*
- * @param string $host Host:IP to get socket for
+ * @param $host String: Host:IP to get socket for
*
- * @return mixed IO Stream or false
- * @access private
+ * @return Mixed: IO Stream or false
+ * @access private
*/
function sock_to_host( $host ) {
if ( isset( $this->_cache_sock[$host] ) ) {
@@ -987,7 +1032,7 @@ class MWMemcached {
/**
* Write to a stream, timing out after the correct amount of time
*
- * @return bool false on failure, true on success
+ * @return Boolean: false on failure, true on success
*/
/*
function _safe_fwrite( $f, $buf, $len = false ) {
diff --git a/includes/mime.info b/includes/mime.info
index 63b38f5a..3a32f5d9 100644
--- a/includes/mime.info
+++ b/includes/mime.info
@@ -16,9 +16,10 @@ image/x-icon [BITMAP]
image/x-rgb [BITMAP]
image/x-portable-pixmap [BITMAP]
image/x-portable-graymap image/x-portable-greymap [BITMAP]
-image/x-bmp image/bmp application/x-bmp application/bmp [BITMAP]
+image/x-bmp image/x-ms-bmp image/bmp application/x-bmp application/bmp [BITMAP]
image/x-photoshop image/psd image/x-psd image/photoshop [BITMAP]
image/vnd.djvu image/x.djvu image/x-djvu [BITMAP]
+image/webp [BITMAP]
image/svg+xml application/svg+xml application/svg image/svg [DRAWING]
application/postscript [DRAWING]
@@ -27,18 +28,23 @@ application/x-tex [DRAWING]
application/x-dia-diagram [DRAWING]
-audio/mp3 audio/mpeg3 audio/mpeg [AUDIO]
+audio/mpeg audio/mp3 audio/mpeg3 [AUDIO]
audio/wav audio/x-wav audio/wave [AUDIO]
audio/midi audio/mid [AUDIO]
audio/basic [AUDIO]
+audio/ogg [AUDIO]
audio/x-aiff [AUDIO]
audio/x-pn-realaudio [AUDIO]
audio/x-realaudio [AUDIO]
+audio/webm [AUDIO]
+audio/x-matroska [AUDIO]
video/mpeg application/mpeg [VIDEO]
video/ogg [VIDEO]
video/x-sgi-video [VIDEO]
video/x-flv [VIDEO]
+video/webm [VIDEO]
+video/x-matroska [VIDEO]
application/ogg application/x-ogg audio/ogg audio/x-ogg video/ogg video/x-ogg [MULTIMEDIA]
@@ -60,6 +66,7 @@ application/x-gzip [ARCHIVE]
application/x-bzip [ARCHIVE]
application/x-tar [ARCHIVE]
application/x-stuffit [ARCHIVE]
+application/x-opc+zip [ARCHIVE]
text/javascript application/x-javascript application/x-ecmascript text/ecmascript [EXECUTABLE]
@@ -77,3 +84,22 @@ application/vnd.ms-excel [OFFICE]
application/vnd.ms-powerpoint [OFFICE]
application/x-director [OFFICE]
text/rtf [OFFICE]
+
+application/vnd.openxmlformats-officedocument.wordprocessingml.document [OFFICE]
+application/vnd.openxmlformats-officedocument.wordprocessingml.template [OFFICE]
+application/vnd.ms-word.document.macroEnabled.12 [OFFICE]
+application/vnd.ms-word.template.macroEnabled.12 [OFFICE]
+application/vnd.openxmlformats-officedocument.presentationml.template [OFFICE]
+application/vnd.openxmlformats-officedocument.presentationml.slideshow [OFFICE]
+application/vnd.openxmlformats-officedocument.presentationml.presentation [OFFICE]
+application/vnd.ms-powerpoint.addin.macroEnabled.12 [OFFICE]
+application/vnd.ms-powerpoint.presentation.macroEnabled.12 [OFFICE]
+application/vnd.ms-powerpoint.presentation.macroEnabled.12 [OFFICE]
+application/vnd.ms-powerpoint.slideshow.macroEnabled.12 [OFFICE]
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet [OFFICE]
+application/vnd.openxmlformats-officedocument.spreadsheetml.template [OFFICE]
+application/vnd.ms-excel.sheet.macroEnabled.12 [OFFICE]
+application/vnd.ms-excel.template.macroEnabled.12 [OFFICE]
+application/vnd.ms-excel.addin.macroEnabled.12 [OFFICE]
+application/vnd.ms-excel.sheet.binary.macroEnabled.12 [OFFICE]
+
diff --git a/includes/mime.types b/includes/mime.types
index bd57cd40..bf8c6dd1 100644
--- a/includes/mime.types
+++ b/includes/mime.types
@@ -2,10 +2,10 @@ application/andrew-inset ez
application/mac-binhex40 hqx
application/mac-compactpro cpt
application/mathml+xml mathml
-application/msword doc docx docm dot dotx dotm
+application/msword doc dot
application/octet-stream bin dms lha lzh exe class so dll
application/oda oda
-application/ogg ogg ogm
+application/ogg ogx ogg ogm ogv oga spx
application/pdf pdf
application/postscript ai eps ps
application/rdf+xml rdf
@@ -13,8 +13,8 @@ application/smil smi smil
application/srgs gram
application/srgs+xml grxml
application/vnd.mif mif
-application/vnd.ms-excel xls xlsx xlsb xlam xltx xltm
-application/vnd.ms-powerpoint ppt pptm pptx pot potx potm ppsm ppam
+application/vnd.ms-excel xls xlt xla
+application/vnd.ms-powerpoint ppt pot pps ppa
application/vnd.wap.wbxml wbxml
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
@@ -63,10 +63,12 @@ application/x-rar rar
audio/basic au snd
audio/midi mid midi kar
audio/mpeg mpga mp2 mp3
-audio/ogg ogg
+audio/ogg oga ogg spx
+audio/webm webm
audio/x-aiff aif aiff aifc
+audio/x-matroska mka mkv
audio/x-mpegurl m3u
-audio/x-ogg ogg
+audio/x-ogg oga ogg spx
audio/x-pn-realaudio ram rm
audio/x-pn-realaudio-plugin rpm
audio/x-realaudio ra
@@ -78,13 +80,15 @@ image/cgm cgm
image/gif gif
image/ief ief
image/jpeg jpeg jpg jpe
-image/png png
+image/png png apng
image/svg+xml svg
image/tiff tiff tif
image/vnd.djvu djvu djv
image/vnd.wap.wbmp wbmp
+image/webp webp
image/x-cmu-raster ras
image/x-icon ico
+image/x-ms-bmp bmp
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
@@ -110,12 +114,14 @@ text/vnd.wap.wmlscript wmls
text/xml xml xsl xslt rss rdf
text/x-setext etx
video/mpeg mpeg mpg mpe
-video/ogg ogm ogg
+video/ogg ogv ogm ogg
video/quicktime qt mov
video/vnd.mpegurl mxu
+video/webm webm
video/x-flv flv
+video/x-matroska mkv mka
video/x-msvideo avi
-video/x-ogg ogm ogg
+video/x-ogg ogv ogm ogg
video/x-sgi-movie movie
x-conference/x-cooltalk ice
application/vnd.oasis.opendocument.text odt
@@ -133,4 +139,24 @@ application/vnd.oasis.opendocument.image-template oti
application/vnd.oasis.opendocument.formula odf
application/vnd.oasis.opendocument.formula-template otf
application/vnd.oasis.opendocument.text-master odm
-application/vnd.oasis.opendocument.text-web oth \ No newline at end of file
+application/vnd.oasis.opendocument.text-web oth
+application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
+application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
+application/vnd.ms-word.document.macroEnabled.12 docm
+application/vnd.ms-word.template.macroEnabled.12 dotm
+application/vnd.openxmlformats-officedocument.presentationml.template potx
+application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
+application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
+application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
+application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
+application/vnd.ms-powerpoint.presentation.macroEnabled.12 potm
+application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
+application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
+application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
+application/vnd.ms-excel.template.macroEnabled.12 xltm
+application/vnd.ms-excel.addin.macroEnabled.12 xlam
+application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
+model/vnd.dwfx+xps dwfx
+application/vnd.ms-xpsdocument xps
+application/x-opc+zip docx dotx docm dotm potx ppsx pptx ppam pptm potm ppsm xlsx xltx xlsm xltm xlam xlsb dwfx xps
diff --git a/includes/normal/CleanUpTest.php b/includes/normal/CleanUpTest.php
index d14bcad1..549a0406 100644
--- a/includes/normal/CleanUpTest.php
+++ b/includes/normal/CleanUpTest.php
@@ -1,21 +1,28 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
+/**
+ * Tests for UtfNormal::cleanUp() function.
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
if( php_sapi_name() != 'cli' ) {
@@ -29,7 +36,14 @@ if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
#ini_set( 'memory_limit', '40M' );
-require_once 'PHPUnit/Framework.php';
+require_once( 'PHPUnit/Runner/Version.php' );
+if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
+ # PHPUnit 3.5.0 introduced a nice autoloader based on class name
+ require_once( 'PHPUnit/Autoload.php' );
+} else {
+ # Keep the old pre PHPUnit 3.5.0 behaviour for compatibility
+ require_once 'PHPUnit/Framework.php';
+}
require_once 'PHPUnit/TextUI/TestRunner.php';
require_once 'UtfNormal.php';
@@ -85,7 +99,6 @@ class CleanUpTest extends PHPUnit_Framework_TestCase {
*/
function XtestAllChars() {
$rep = UTF8_REPLACEMENT;
- global $utfCanonicalComp, $utfCanonicalDecomp;
for( $i = 0x0; $i < UNICODE_MAX; $i++ ) {
$char = codepointToUtf8( $i );
$clean = UtfNormal::cleanUp( $char );
@@ -97,7 +110,7 @@ class CleanUpTest extends PHPUnit_Framework_TestCase {
($i > 0x001f && $i < UNICODE_SURROGATE_FIRST) ||
($i > UNICODE_SURROGATE_LAST && $i < 0xfffe ) ||
($i > 0xffff && $i <= UNICODE_MAX ) ) {
- if( isset( $utfCanonicalComp[$char] ) || isset( $utfCanonicalDecomp[$char] ) ) {
+ if( isset( UtfNormal::$utfCanonicalComp[$char] ) || isset( UtfNormal::$utfCanonicalDecomp[$char] ) ) {
$comp = UtfNormal::NFC( $char );
$this->assertEquals(
bin2hex( $comp ),
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
index eb137574..f2ec460e 100644
--- a/includes/normal/RandomTest.php
+++ b/includes/normal/RandomTest.php
@@ -1,29 +1,29 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* Test feeds random 16-byte strings to both the pure PHP and ICU-based
* UtfNormal::cleanUp() code paths, and checks to see if there's a
* difference. Will run forever until it finds one or you kill it.
*
+ * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
- * @access private
*/
if( php_sapi_name() != 'cli' ) {
diff --git a/includes/normal/Utf8Case.php b/includes/normal/Utf8Case.php
index 9734a922..89b1a892 100644
--- a/includes/normal/Utf8Case.php
+++ b/includes/normal/Utf8Case.php
@@ -1,19 +1,20 @@
<?php
/**
- * Simple 1:1 upper/lowercase switching arrays for utf-8 text
- * Won't get context-sensitive things yet
+ * Simple 1:1 upper/lowercase switching arrays for utf-8 text.
+ * Won't get context-sensitive things yet.
*
* Hack for bugs in ucfirst() and company
*
* These are pulled from memcached if possible, as this is faster than filling
* up a big array manually.
+ *
+ * @file
* @ingroup Language
*/
-/*
+/**
* Translation array to get upper case character
*/
-
$wikiUpperChars = array(
'a' => 'A',
'b' => 'B',
@@ -1048,7 +1049,7 @@ $wikiUpperChars = array(
'ð‘' => 'ð§'
);
-/*
+/**
* Translation array to get lower case character
*/
$wikiLowerChars = array(
diff --git a/includes/normal/Utf8CaseGenerate.php b/includes/normal/Utf8CaseGenerate.php
index 22994ba4..8dbff1db 100644
--- a/includes/normal/Utf8CaseGenerate.php
+++ b/includes/normal/Utf8CaseGenerate.php
@@ -1,32 +1,30 @@
<?php
-# Copyright (C) 2004,2008 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
- * This script generates Utf8Case.inc from the Unicode Character Database
+ * This script generates Utf8Case.php from the Unicode Character Database
* and supplementary files.
*
+ * Copyright © 2004,2008 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
- * @access private
*/
-/** */
-
if( php_sapi_name() != 'cli' ) {
die( "Run me from the command line please.\n" );
}
@@ -67,23 +65,24 @@ if( $out ) {
$outLowerChars = escapeArray( $wikiLowerChars );
$outdata = "<" . "?php
/**
- * Simple 1:1 upper/lowercase switching arrays for utf-8 text
- * Won't get context-sensitive things yet
+ * Simple 1:1 upper/lowercase switching arrays for utf-8 text.
+ * Won't get context-sensitive things yet.
*
* Hack for bugs in ucfirst() and company
*
* These are pulled from memcached if possible, as this is faster than filling
* up a big array manually.
+ *
+ * @file
* @ingroup Language
*/
-/*
+/**
* Translation array to get upper case character
*/
-
\$wikiUpperChars = $outUpperChars;
-/*
+/**
* Translation array to get lower case character
*/
\$wikiLowerChars = $outLowerChars;\n";
diff --git a/includes/normal/Utf8Test.php b/includes/normal/Utf8Test.php
index 4c78b3db..53108bc4 100644
--- a/includes/normal/Utf8Test.php
+++ b/includes/normal/Utf8Test.php
@@ -1,28 +1,28 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* Runs the UTF-8 decoder test at:
* http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
*
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
- * @access private
*/
/** */
@@ -30,6 +30,7 @@ require_once 'UtfNormalUtil.php';
require_once 'UtfNormal.php';
mb_internal_encoding( "utf-8" );
+$verbose = false;
#$verbose = true;
if( php_sapi_name() != 'cli' ) {
die( "Run me from the command line please.\n" );
@@ -39,7 +40,7 @@ $in = fopen( "UTF-8-test.txt", "rt" );
if( !$in ) {
print "Couldn't open UTF-8-test.txt -- can't run tests.\n";
print "If necessary, manually download this file. It can be obtained at\n";
- print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt";
+ print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
exit(-1);
}
@@ -55,7 +56,7 @@ while( false !== ( $line = fgets( $in ) ) ) {
if( !$columns ) {
print "Something seems to be wrong; couldn't extract line length.\n";
print "Check that UTF-8-test.txt was downloaded correctly from\n";
- print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt";
+ print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
exit(-1);
}
@@ -102,10 +103,10 @@ while( false !== ( $line = fgets( $in ) ) ) {
if( in_array( $test, $longTests ) ) {
$line = fgets( $in );
for( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
- testLine( $test, $line, $total, $success, $failed );
+ testLine( $test, $line, $total, $success, $failed, $columns, $exceptions, $verbose );
}
} else {
- testLine( $test, $line, $total, $success, $failed );
+ testLine( $test, $line, $total, $success, $failed, $columns, $exceptions, $verbose );
}
}
}
@@ -120,7 +121,7 @@ echo "UTF-8 DECODER TEST SUCCESS!\n";
exit (0);
-function testLine( $test, $line, &$total, &$success, &$failed ) {
+function testLine( $test, $line, &$total, &$success, &$failed, $columns, $exceptions, $verbose ) {
$stripped = $line;
UtfNormal::quickisNFCVerify( $stripped );
@@ -130,10 +131,8 @@ function testLine( $test, $line, &$total, &$success, &$failed ) {
$len = strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
}
- global $columns;
$ok = $same ^ ($test >= 3 );
- global $exceptions;
$ok ^= in_array( $test, $exceptions );
$ok &= ($columns == $len);
@@ -144,7 +143,7 @@ function testLine( $test, $line, &$total, &$success, &$failed ) {
} else {
$failed++;
}
- global $verbose;
+
if( $verbose || !$ok ) {
print str_replace( "\n", "$len\n", $stripped );
}
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
index e1352fdb..116fb8f0 100644
--- a/includes/normal/UtfNormal.php
+++ b/includes/normal/UtfNormal.php
@@ -1,38 +1,35 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
+/**
+ * Unicode normalization routines
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
/**
* @defgroup UtfNormal UtfNormal
*/
-/** */
require_once dirname(__FILE__).'/UtfNormalUtil.php';
-global $utfCombiningClass, $utfCanonicalComp, $utfCanonicalDecomp;
-$utfCombiningClass = null;
-$utfCanonicalComp = null;
-$utfCanonicalDecomp = null;
-
-# Load compatibility decompositions on demand if they are needed.
-global $utfCompatibilityDecomp;
-$utfCompatibilityDecomp = null;
-
/**
* For using the ICU wrapper
*/
@@ -45,6 +42,7 @@ define( 'UNORM_NFKC', 5 );
define( 'UNORM_FCD', 6 );
define( 'NORMALIZE_ICU', function_exists( 'utf8_normalize' ) );
+define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
/**
* Unicode normalization routines for working with UTF-8 strings.
@@ -61,6 +59,15 @@ define( 'NORMALIZE_ICU', function_exists( 'utf8_normalize' ) );
* @ingroup UtfNormal
*/
class UtfNormal {
+ static $utfCombiningClass = null;
+ static $utfCanonicalComp = null;
+ static $utfCanonicalDecomp = null;
+
+ # Load compatibility decompositions on demand if they are needed.
+ static $utfCompatibilityDecomp = null;
+
+ static $utfCheckNFC;
+
/**
* The ultimate convenience function! Clean up invalid UTF-8 sequences,
* and convert to normal form C, canonical composition.
@@ -73,17 +80,29 @@ class UtfNormal {
*/
static function cleanUp( $string ) {
if( NORMALIZE_ICU ) {
- # We exclude a few chars that ICU would not.
- $string = preg_replace(
- '/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
- UTF8_REPLACEMENT,
- $string );
- $string = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $string );
- $string = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $string );
+ $string = self::replaceForNativeNormalize( $string );
# UnicodeString constructor fails if the string ends with a
# head byte. Add a junk char at the end, we'll strip it off.
return rtrim( utf8_normalize( $string . "\x01", UNORM_NFC ), "\x01" );
+ } elseif( NORMALIZE_INTL ) {
+ $string = self::replaceForNativeNormalize( $string );
+ $norm = normalizer_normalize( $string, Normalizer::FORM_C );
+ if( $norm === null || $norm === false ) {
+ # normalizer_normalize will either return false or null
+ # (depending on which doc you read) if invalid utf8 string.
+ # quickIsNFCVerify cleans up invalid sequences.
+
+ if( UtfNormal::quickIsNFCVerify( $string ) ) {
+ # if that's true, the string is actually already normal.
+ return $string;
+ } else {
+ # Now we are valid but non-normal
+ return normalizer_normalize( $string, Normalizer::FORM_C );
+ }
+ } else {
+ return $norm;
+ }
} elseif( UtfNormal::quickIsNFCVerify( $string ) ) {
# Side effect -- $string has had UTF-8 errors cleaned up.
return $string;
@@ -101,7 +120,9 @@ class UtfNormal {
* @return string a UTF-8 string in normal form C
*/
static function toNFC( $string ) {
- if( NORMALIZE_ICU )
+ if( NORMALIZE_INTL )
+ return normalizer_normalize( $string, Normalizer::FORM_C );
+ elseif( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFC );
elseif( UtfNormal::quickIsNFC( $string ) )
return $string;
@@ -117,7 +138,9 @@ class UtfNormal {
* @return string a UTF-8 string in normal form D
*/
static function toNFD( $string ) {
- if( NORMALIZE_ICU )
+ if( NORMALIZE_INTL )
+ return normalizer_normalize( $string, Normalizer::FORM_D );
+ elseif( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFD );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
return UtfNormal::NFD( $string );
@@ -134,7 +157,9 @@ class UtfNormal {
* @return string a UTF-8 string in normal form KC
*/
static function toNFKC( $string ) {
- if( NORMALIZE_ICU )
+ if( NORMALIZE_INTL )
+ return normalizer_normalize( $string, Normalizer::FORM_KC );
+ elseif( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFKC );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
return UtfNormal::NFKC( $string );
@@ -151,7 +176,9 @@ class UtfNormal {
* @return string a UTF-8 string in normal form KD
*/
static function toNFKD( $string ) {
- if( NORMALIZE_ICU )
+ if( NORMALIZE_INTL )
+ return normalizer_normalize( $string, Normalizer::FORM_KD );
+ elseif( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFKD );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
return UtfNormal::NFKD( $string );
@@ -164,8 +191,7 @@ class UtfNormal {
* @private
*/
static function loadData() {
- global $utfCombiningClass;
- if( !isset( $utfCombiningClass ) ) {
+ if( !isset( self::$utfCombiningClass ) ) {
require_once( dirname(__FILE__) . '/UtfNormalData.inc' );
}
}
@@ -182,7 +208,6 @@ class UtfNormal {
if( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
UtfNormal::loadData();
- global $utfCheckNFC, $utfCombiningClass;
$len = strlen( $string );
for( $i = 0; $i < $len; $i++ ) {
$c = $string{$i};
@@ -199,11 +224,11 @@ class UtfNormal {
$c = substr( $string, $i, 2 );
$i++;
}
- if( isset( $utfCheckNFC[$c] ) ) {
+ if( isset( self::$utfCheckNFC[$c] ) ) {
# If it's NO or MAYBE, bail and do the slow check.
return false;
}
- if( isset( $utfCombiningClass[$c] ) ) {
+ if( isset( self::$utfCombiningClass[$c] ) ) {
# Combining character? We might have to do sorting, at least.
return false;
}
@@ -229,9 +254,8 @@ class UtfNormal {
if( !isset( $checkit ) ) {
# Load/build some scary lookup tables...
UtfNormal::loadData();
- global $utfCheckNFC, $utfCombiningClass;
- $utfCheckOrCombining = array_merge( $utfCheckNFC, $utfCombiningClass );
+ $utfCheckOrCombining = array_merge( self::$utfCheckNFC, self::$utfCombiningClass );
# Head bytes for sequences which we should do further validity checks
$checkit = array_flip( array_map( 'chr',
@@ -295,7 +319,8 @@ class UtfNormal {
$len = $chunk + 1; # Counting down is faster. I'm *so* sorry.
for( $i = -1; --$len; ) {
- if( $remaining = $tailBytes[$c = $str{++$i}] ) {
+ $remaining = $tailBytes[$c = $str{++$i}];
+ if( $remaining ) {
# UTF-8 head byte!
$sequence = $head = $c;
do {
@@ -446,9 +471,9 @@ class UtfNormal {
*/
static function NFD( $string ) {
UtfNormal::loadData();
- global $utfCanonicalDecomp;
+
return UtfNormal::fastCombiningSort(
- UtfNormal::fastDecompose( $string, $utfCanonicalDecomp ) );
+ UtfNormal::fastDecompose( $string, self::$utfCanonicalDecomp ) );
}
/**
@@ -466,12 +491,11 @@ class UtfNormal {
* @private
*/
static function NFKD( $string ) {
- global $utfCompatibilityDecomp;
- if( !isset( $utfCompatibilityDecomp ) ) {
+ if( !isset( self::$utfCompatibilityDecomp ) ) {
require_once( 'UtfNormalDataK.inc' );
}
- return UtfNormal::fastCombiningSort(
- UtfNormal::fastDecompose( $string, $utfCompatibilityDecomp ) );
+ return self::fastCombiningSort(
+ self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
}
@@ -546,7 +570,6 @@ class UtfNormal {
*/
static function fastCombiningSort( $string ) {
UtfNormal::loadData();
- global $utfCombiningClass;
$len = strlen( $string );
$out = '';
$combiners = array();
@@ -565,8 +588,8 @@ class UtfNormal {
$c = substr( $string, $i, 2 );
$i++;
}
- if( isset( $utfCombiningClass[$c] ) ) {
- $lastClass = $utfCombiningClass[$c];
+ if( isset( self::$utfCombiningClass[$c] ) ) {
+ $lastClass = self::$utfCombiningClass[$c];
if( isset( $combiners[$lastClass] ) ) {
$combiners[$lastClass] .= $c;
} else {
@@ -599,7 +622,6 @@ class UtfNormal {
*/
static function fastCompose( $string ) {
UtfNormal::loadData();
- global $utfCanonicalComp, $utfCombiningClass;
$len = strlen( $string );
$out = '';
$lastClass = -1;
@@ -631,14 +653,14 @@ class UtfNormal {
}
$pair = $startChar . $c;
if( $n > 0x80 ) {
- if( isset( $utfCombiningClass[$c] ) ) {
+ if( isset( self::$utfCombiningClass[$c] ) ) {
# A combining char; see what we can do with it
- $class = $utfCombiningClass[$c];
+ $class = self::$utfCombiningClass[$c];
if( !empty( $startChar ) &&
$lastClass < $class &&
$class > 0 &&
- isset( $utfCanonicalComp[$pair] ) ) {
- $startChar = $utfCanonicalComp[$pair];
+ isset( self::$utfCanonicalComp[$pair] ) ) {
+ $startChar = self::$utfCanonicalComp[$pair];
$class = 0;
} else {
$combining .= $c;
@@ -650,8 +672,8 @@ class UtfNormal {
}
# New start char
if( $lastClass == 0 ) {
- if( isset( $utfCanonicalComp[$pair] ) ) {
- $startChar = $utfCanonicalComp[$pair];
+ if( isset( self::$utfCanonicalComp[$pair] ) ) {
+ $startChar = self::$utfCanonicalComp[$pair];
$lastHangul = 0;
continue;
}
@@ -737,4 +759,20 @@ class UtfNormal {
}
return $out;
}
+ /**
+ * Function to replace some characters that we don't want
+ * but most of the native normalize functions keep.
+ *
+ * @param $string String The string
+ * @return String String with the character codes replaced.
+ */
+ private static function replaceForNativeNormalize( $string ) {
+ $string = preg_replace(
+ '/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
+ UTF8_REPLACEMENT,
+ $string );
+ $string = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $string );
+ $string = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $string );
+ return $string;
+ }
}
diff --git a/includes/normal/UtfNormalBench.php b/includes/normal/UtfNormalBench.php
index 1bcd8334..2229dbb4 100644
--- a/includes/normal/UtfNormalBench.php
+++ b/includes/normal/UtfNormalBench.php
@@ -1,30 +1,29 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* Approximate benchmark for some basic operations.
*
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
- * @access private
*/
-/** */
if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
dl( 'php_utfnormal.so' );
}
@@ -86,11 +85,10 @@ function benchTime(){
}
function benchmarkForm( &$u, &$data, $form ) {
- global $utfCanonicalDecomp;
#$start = benchTime();
for( $i = 0; $i < BENCH_CYCLES; $i++ ) {
$start = benchTime();
- $out = $u->$form( $data, $utfCanonicalDecomp );
+ $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
$deltas[] = (benchTime() - $start);
}
#$delta = (benchTime() - $start) / BENCH_CYCLES;
diff --git a/includes/normal/UtfNormalData.inc b/includes/normal/UtfNormalData.inc
index 46a93947..1d6b4680 100644
--- a/includes/normal/UtfNormalData.inc
+++ b/includes/normal/UtfNormalData.inc
@@ -2,11 +2,12 @@
/**
* This file was automatically generated -- do not edit!
* Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
*/
-/** */
-global $utfCombiningClass, $utfCanonicalComp, $utfCanonicalDecomp, $utfCheckNFC;
-$utfCombiningClass = unserialize( 'a:594:{s:2:"Ì€";i:230;s:2:"Ì";i:230;s:2:"Ì‚";i:230;s:2:"̃";i:230;s:2:"Ì„";i:230;s:2:"Ì…";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"ÌŠ";i:230;s:2:"Ì‹";i:230;s:2:"ÌŒ";i:230;s:2:"Ì";i:230;s:2:"ÌŽ";i:230;s:2:"Ì";i:230;s:2:"Ì";i:230;s:2:"Ì‘";i:230;s:2:"Ì’";i:230;s:2:"Ì“";i:230;s:2:"Ì”";i:230;s:2:"Ì•";i:232;s:2:"Ì–";i:220;s:2:"Ì—";i:220;s:2:"̘";i:220;s:2:"Ì™";i:220;s:2:"Ìš";i:232;s:2:"Ì›";i:216;s:2:"Ìœ";i:220;s:2:"Ì";i:220;s:2:"Ìž";i:220;s:2:"ÌŸ";i:220;s:2:"Ì ";i:220;s:2:"Ì¡";i:202;s:2:"Ì¢";i:202;s:2:"Ì£";i:220;s:2:"̤";i:220;s:2:"Ì¥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"Ì©";i:220;s:2:"̪";i:220;s:2:"Ì«";i:220;s:2:"̬";i:220;s:2:"Ì­";i:220;s:2:"Ì®";i:220;s:2:"̯";i:220;s:2:"Ì°";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"Ì´";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"Ì·";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"Ì»";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"Ì¿";i:230;s:2:"Í€";i:230;s:2:"Í";i:230;s:2:"Í‚";i:230;s:2:"̓";i:230;s:2:"Í„";i:230;s:2:"Í…";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"ÍŠ";i:230;s:2:"Í‹";i:230;s:2:"ÍŒ";i:230;s:2:"Í";i:220;s:2:"ÍŽ";i:220;s:2:"Í";i:230;s:2:"Í‘";i:230;s:2:"Í’";i:230;s:2:"Í“";i:220;s:2:"Í”";i:220;s:2:"Í•";i:220;s:2:"Í–";i:220;s:2:"Í—";i:230;s:2:"͘";i:232;s:2:"Í™";i:220;s:2:"Íš";i:220;s:2:"Í›";i:230;s:2:"Íœ";i:233;s:2:"Í";i:234;s:2:"Íž";i:234;s:2:"ÍŸ";i:233;s:2:"Í ";i:234;s:2:"Í¡";i:234;s:2:"Í¢";i:233;s:2:"Í£";i:230;s:2:"ͤ";i:230;s:2:"Í¥";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"Í©";i:230;s:2:"ͪ";i:230;s:2:"Í«";i:230;s:2:"ͬ";i:230;s:2:"Í­";i:230;s:2:"Í®";i:230;s:2:"ͯ";i:230;s:2:"Òƒ";i:230;s:2:"Ò„";i:230;s:2:"Ò…";i:230;s:2:"Ò†";i:230;s:2:"Ò‡";i:230;s:2:"Ö‘";i:220;s:2:"Ö’";i:230;s:2:"Ö“";i:230;s:2:"Ö”";i:230;s:2:"Ö•";i:230;s:2:"Ö–";i:220;s:2:"Ö—";i:230;s:2:"Ö˜";i:230;s:2:"Ö™";i:230;s:2:"Öš";i:222;s:2:"Ö›";i:220;s:2:"Öœ";i:230;s:2:"Ö";i:230;s:2:"Öž";i:230;s:2:"ÖŸ";i:230;s:2:"Ö ";i:230;s:2:"Ö¡";i:230;s:2:"Ö¢";i:220;s:2:"Ö£";i:220;s:2:"Ö¤";i:220;s:2:"Ö¥";i:220;s:2:"Ö¦";i:220;s:2:"Ö§";i:220;s:2:"Ö¨";i:230;s:2:"Ö©";i:230;s:2:"Öª";i:220;s:2:"Ö«";i:230;s:2:"Ö¬";i:230;s:2:"Ö­";i:222;s:2:"Ö®";i:228;s:2:"Ö¯";i:230;s:2:"Ö°";i:10;s:2:"Ö±";i:11;s:2:"Ö²";i:12;s:2:"Ö³";i:13;s:2:"Ö´";i:14;s:2:"Öµ";i:15;s:2:"Ö¶";i:16;s:2:"Ö·";i:17;s:2:"Ö¸";i:18;s:2:"Ö¹";i:19;s:2:"Öº";i:19;s:2:"Ö»";i:20;s:2:"Ö¼";i:21;s:2:"Ö½";i:22;s:2:"Ö¿";i:23;s:2:"×";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"×…";i:220;s:2:"ׇ";i:18;s:2:"Ø";i:230;s:2:"Ø‘";i:230;s:2:"Ø’";i:230;s:2:"Ø“";i:230;s:2:"Ø”";i:230;s:2:"Ø•";i:230;s:2:"Ø–";i:230;s:2:"Ø—";i:230;s:2:"ؘ";i:30;s:2:"Ø™";i:31;s:2:"Øš";i:32;s:2:"Ù‹";i:27;s:2:"ÙŒ";i:28;s:2:"Ù";i:29;s:2:"ÙŽ";i:30;s:2:"Ù";i:31;s:2:"Ù";i:32;s:2:"Ù‘";i:33;s:2:"Ù’";i:34;s:2:"Ù“";i:230;s:2:"Ù”";i:230;s:2:"Ù•";i:220;s:2:"Ù–";i:220;s:2:"Ù—";i:230;s:2:"Ù˜";i:230;s:2:"Ù™";i:230;s:2:"Ùš";i:230;s:2:"Ù›";i:230;s:2:"Ùœ";i:220;s:2:"Ù";i:230;s:2:"Ùž";i:230;s:2:"Ù°";i:35;s:2:"Û–";i:230;s:2:"Û—";i:230;s:2:"Û˜";i:230;s:2:"Û™";i:230;s:2:"Ûš";i:230;s:2:"Û›";i:230;s:2:"Ûœ";i:230;s:2:"ÛŸ";i:230;s:2:"Û ";i:230;s:2:"Û¡";i:230;s:2:"Û¢";i:230;s:2:"Û£";i:220;s:2:"Û¤";i:230;s:2:"Û§";i:230;s:2:"Û¨";i:230;s:2:"Ûª";i:220;s:2:"Û«";i:230;s:2:"Û¬";i:230;s:2:"Û­";i:220;s:2:"Ü‘";i:36;s:2:"Ü°";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"Ü´";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"Ü·";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"Ü»";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"Ü¿";i:230;s:2:"Ý€";i:230;s:2:"Ý";i:230;s:2:"Ý‚";i:220;s:2:"݃";i:230;s:2:"Ý„";i:220;s:2:"Ý…";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"ÝŠ";i:230;s:2:"ß«";i:230;s:2:"߬";i:230;s:2:"ß­";i:230;s:2:"ß®";i:230;s:2:"߯";i:230;s:2:"ß°";i:230;s:2:"ß±";i:230;s:2:"ß²";i:220;s:2:"ß³";i:230;s:3:"à –";i:230;s:3:"à —";i:230;s:3:"à ˜";i:230;s:3:"à ™";i:230;s:3:"à ›";i:230;s:3:"à œ";i:230;s:3:"à ";i:230;s:3:"à ž";i:230;s:3:"à Ÿ";i:230;s:3:"à  ";i:230;s:3:"à ¡";i:230;s:3:"à ¢";i:230;s:3:"à £";i:230;s:3:"à ¥";i:230;s:3:"à ¦";i:230;s:3:"à §";i:230;s:3:"à ©";i:230;s:3:"à ª";i:230;s:3:"à «";i:230;s:3:"à ¬";i:230;s:3:"à ­";i:230;s:3:"़";i:7;s:3:"à¥";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"à§";i:9;s:3:"਼";i:7;s:3:"à©";i:9;s:3:"઼";i:7;s:3:"à«";i:9;s:3:"଼";i:7;s:3:"à­";i:9;s:3:"à¯";i:9;s:3:"à±";i:9;s:3:"ౕ";i:84;s:3:"à±–";i:91;s:3:"಼";i:7;s:3:"à³";i:9;s:3:"àµ";i:9;s:3:"à·Š";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"á‚";i:220;s:3:"áŸ";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"áŸ";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"á© ";i:9;s:3:"᩵";i:230;s:3:"᩶";i:230;s:3:"á©·";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"á©»";i:230;s:3:"᩼";i:230;s:3:"á©¿";i:220;s:3:"᬴";i:7;s:3:"á­„";i:9;s:3:"á­«";i:230;s:3:"á­¬";i:220;s:3:"á­­";i:230;s:3:"á­®";i:230;s:3:"á­¯";i:230;s:3:"á­°";i:230;s:3:"á­±";i:230;s:3:"á­²";i:230;s:3:"á­³";i:230;s:3:"᮪";i:9;s:3:"á°·";i:7;s:3:"á³";i:230;s:3:"᳑";i:230;s:3:"á³’";i:230;s:3:"á³”";i:1;s:3:"᳕";i:220;s:3:"á³–";i:220;s:3:"á³—";i:220;s:3:"᳘";i:220;s:3:"á³™";i:220;s:3:"᳚";i:230;s:3:"á³›";i:230;s:3:"᳜";i:220;s:3:"á³";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"á³ ";i:230;s:3:"á³¢";i:1;s:3:"á³£";i:1;s:3:"᳤";i:1;s:3:"á³¥";i:1;s:3:"᳦";i:1;s:3:"᳧";i:1;s:3:"᳨";i:1;s:3:"á³­";i:220;s:3:"á·€";i:230;s:3:"á·";i:230;s:3:"á·‚";i:220;s:3:"á·ƒ";i:230;s:3:"á·„";i:230;s:3:"á·…";i:230;s:3:"á·†";i:230;s:3:"á·‡";i:230;s:3:"á·ˆ";i:230;s:3:"á·‰";i:230;s:3:"á·Š";i:220;s:3:"á·‹";i:230;s:3:"á·Œ";i:230;s:3:"á·";i:234;s:3:"á·Ž";i:214;s:3:"á·";i:220;s:3:"á·";i:202;s:3:"á·‘";i:230;s:3:"á·’";i:230;s:3:"á·“";i:230;s:3:"á·”";i:230;s:3:"á·•";i:230;s:3:"á·–";i:230;s:3:"á·—";i:230;s:3:"á·˜";i:230;s:3:"á·™";i:230;s:3:"á·š";i:230;s:3:"á·›";i:230;s:3:"á·œ";i:230;s:3:"á·";i:230;s:3:"á·ž";i:230;s:3:"á·Ÿ";i:230;s:3:"á· ";i:230;s:3:"á·¡";i:230;s:3:"á·¢";i:230;s:3:"á·£";i:230;s:3:"á·¤";i:230;s:3:"á·¥";i:230;s:3:"á·¦";i:230;s:3:"á·½";i:220;s:3:"á·¾";i:230;s:3:"á·¿";i:220;s:3:"âƒ";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"â³°";i:230;s:3:"â³±";i:230;s:3:"â· ";i:230;s:3:"â·¡";i:230;s:3:"â·¢";i:230;s:3:"â·£";i:230;s:3:"â·¤";i:230;s:3:"â·¥";i:230;s:3:"â·¦";i:230;s:3:"â·§";i:230;s:3:"â·¨";i:230;s:3:"â·©";i:230;s:3:"â·ª";i:230;s:3:"â·«";i:230;s:3:"â·¬";i:230;s:3:"â·­";i:230;s:3:"â·®";i:230;s:3:"â·¯";i:230;s:3:"â·°";i:230;s:3:"â·±";i:230;s:3:"â·²";i:230;s:3:"â·³";i:230;s:3:"â·´";i:230;s:3:"â·µ";i:230;s:3:"â·¶";i:230;s:3:"â··";i:230;s:3:"â·¸";i:230;s:3:"â·¹";i:230;s:3:"â·º";i:230;s:3:"â·»";i:230;s:3:"â·¼";i:230;s:3:"â·½";i:230;s:3:"â·¾";i:230;s:3:"â·¿";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"ã‚™";i:8;s:3:"ã‚š";i:8;s:3:"꙯";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"ê›°";i:230;s:3:"ê›±";i:230;s:3:"ê †";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"꧀";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"ê«";i:230;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"ð‡½";i:220;s:4:"ð¨";i:220;s:4:"ð¨";i:230;s:4:"ð¨¸";i:230;s:4:"ð¨¹";i:1;s:4:"ð¨º";i:220;s:4:"ð¨¿";i:9;s:4:"ð‘‚¹";i:9;s:4:"𑂺";i:7;s:4:"ð…¥";i:216;s:4:"ð…¦";i:216;s:4:"ð…§";i:1;s:4:"ð…¨";i:1;s:4:"ð…©";i:1;s:4:"ð…­";i:226;s:4:"ð…®";i:216;s:4:"ð…¯";i:216;s:4:"ð…°";i:216;s:4:"ð…±";i:216;s:4:"ð…²";i:216;s:4:"ð…»";i:220;s:4:"ð…¼";i:220;s:4:"ð…½";i:220;s:4:"ð…¾";i:220;s:4:"ð…¿";i:220;s:4:"ð†€";i:220;s:4:"ð†";i:220;s:4:"ð†‚";i:220;s:4:"ð†…";i:230;s:4:"ð††";i:230;s:4:"ð†‡";i:230;s:4:"ð†ˆ";i:230;s:4:"ð†‰";i:230;s:4:"ð†Š";i:220;s:4:"ð†‹";i:220;s:4:"ð†ª";i:230;s:4:"ð†«";i:230;s:4:"ð†¬";i:230;s:4:"ð†­";i:230;s:4:"ð‰‚";i:230;s:4:"ð‰ƒ";i:230;s:4:"ð‰„";i:230;}' );
-$utfCanonicalComp = unserialize( 'a:1868:{s:3:"AÌ€";s:2:"À";s:3:"AÌ";s:2:"Ã";s:3:"AÌ‚";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"AÌŠ";s:2:"Ã…";s:3:"Ç";s:2:"Ç";s:3:"EÌ€";s:2:"È";s:3:"EÌ";s:2:"É";s:3:"EÌ‚";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"IÌ€";s:2:"ÃŒ";s:3:"IÌ";s:2:"Ã";s:3:"IÌ‚";s:2:"ÃŽ";s:3:"Ï";s:2:"Ã";s:3:"Ñ";s:2:"Ñ";s:3:"OÌ€";s:2:"Ã’";s:3:"OÌ";s:2:"Ó";s:3:"OÌ‚";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"UÌ€";s:2:"Ù";s:3:"UÌ";s:2:"Ú";s:3:"UÌ‚";s:2:"Û";s:3:"Ü";s:2:"Ãœ";s:3:"YÌ";s:2:"Ã";s:3:"aÌ€";s:2:"à";s:3:"aÌ";s:2:"á";s:3:"aÌ‚";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"aÌŠ";s:2:"Ã¥";s:3:"ç";s:2:"ç";s:3:"eÌ€";s:2:"è";s:3:"eÌ";s:2:"é";s:3:"eÌ‚";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"iÌ€";s:2:"ì";s:3:"iÌ";s:2:"í";s:3:"iÌ‚";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"oÌ€";s:2:"ò";s:3:"oÌ";s:2:"ó";s:3:"oÌ‚";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"uÌ€";s:2:"ù";s:3:"uÌ";s:2:"ú";s:3:"uÌ‚";s:2:"û";s:3:"ü";s:2:"ü";s:3:"yÌ";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"AÌ„";s:2:"Ä€";s:3:"aÌ„";s:2:"Ä";s:3:"Ă";s:2:"Ä‚";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ä„";s:3:"ą";s:2:"Ä…";s:3:"CÌ";s:2:"Ć";s:3:"cÌ";s:2:"ć";s:3:"CÌ‚";s:2:"Ĉ";s:3:"cÌ‚";s:2:"ĉ";s:3:"Ċ";s:2:"ÄŠ";s:3:"ċ";s:2:"Ä‹";s:3:"CÌŒ";s:2:"ÄŒ";s:3:"cÌŒ";s:2:"Ä";s:3:"DÌŒ";s:2:"ÄŽ";s:3:"dÌŒ";s:2:"Ä";s:3:"EÌ„";s:2:"Ä’";s:3:"eÌ„";s:2:"Ä“";s:3:"Ĕ";s:2:"Ä”";s:3:"ĕ";s:2:"Ä•";s:3:"Ė";s:2:"Ä–";s:3:"ė";s:2:"Ä—";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"Ä™";s:3:"EÌŒ";s:2:"Äš";s:3:"eÌŒ";s:2:"Ä›";s:3:"GÌ‚";s:2:"Äœ";s:3:"gÌ‚";s:2:"Ä";s:3:"Ğ";s:2:"Äž";s:3:"ğ";s:2:"ÄŸ";s:3:"Ġ";s:2:"Ä ";s:3:"ġ";s:2:"Ä¡";s:3:"Ģ";s:2:"Ä¢";s:3:"ģ";s:2:"Ä£";s:3:"HÌ‚";s:2:"Ĥ";s:3:"hÌ‚";s:2:"Ä¥";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"Ä©";s:3:"IÌ„";s:2:"Ī";s:3:"iÌ„";s:2:"Ä«";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"Ä­";s:3:"Į";s:2:"Ä®";s:3:"į";s:2:"į";s:3:"İ";s:2:"Ä°";s:3:"JÌ‚";s:2:"Ä´";s:3:"jÌ‚";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"Ä·";s:3:"LÌ";s:2:"Ĺ";s:3:"lÌ";s:2:"ĺ";s:3:"Ļ";s:2:"Ä»";s:3:"ļ";s:2:"ļ";s:3:"LÌŒ";s:2:"Ľ";s:3:"lÌŒ";s:2:"ľ";s:3:"NÌ";s:2:"Ń";s:3:"nÌ";s:2:"Å„";s:3:"Ņ";s:2:"Å…";s:3:"ņ";s:2:"ņ";s:3:"NÌŒ";s:2:"Ň";s:3:"nÌŒ";s:2:"ň";s:3:"OÌ„";s:2:"ÅŒ";s:3:"oÌ„";s:2:"Å";s:3:"Ŏ";s:2:"ÅŽ";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å";s:3:"oÌ‹";s:2:"Å‘";s:3:"RÌ";s:2:"Å”";s:3:"rÌ";s:2:"Å•";s:3:"Ŗ";s:2:"Å–";s:3:"ŗ";s:2:"Å—";s:3:"RÌŒ";s:2:"Ř";s:3:"rÌŒ";s:2:"Å™";s:3:"SÌ";s:2:"Åš";s:3:"sÌ";s:2:"Å›";s:3:"SÌ‚";s:2:"Åœ";s:3:"sÌ‚";s:2:"Å";s:3:"Ş";s:2:"Åž";s:3:"ş";s:2:"ÅŸ";s:3:"SÌŒ";s:2:"Å ";s:3:"sÌŒ";s:2:"Å¡";s:3:"Ţ";s:2:"Å¢";s:3:"ţ";s:2:"Å£";s:3:"TÌŒ";s:2:"Ť";s:3:"tÌŒ";s:2:"Å¥";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"Å©";s:3:"UÌ„";s:2:"Ū";s:3:"uÌ„";s:2:"Å«";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"Å­";s:3:"UÌŠ";s:2:"Å®";s:3:"uÌŠ";s:2:"ů";s:3:"UÌ‹";s:2:"Å°";s:3:"uÌ‹";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"WÌ‚";s:2:"Å´";s:3:"wÌ‚";s:2:"ŵ";s:3:"YÌ‚";s:2:"Ŷ";s:3:"yÌ‚";s:2:"Å·";s:3:"Ÿ";s:2:"Ÿ";s:3:"ZÌ";s:2:"Ź";s:3:"zÌ";s:2:"ź";s:3:"Ż";s:2:"Å»";s:3:"ż";s:2:"ż";s:3:"ZÌŒ";s:2:"Ž";s:3:"zÌŒ";s:2:"ž";s:3:"OÌ›";s:2:"Æ ";s:3:"oÌ›";s:2:"Æ¡";s:3:"UÌ›";s:2:"Ư";s:3:"uÌ›";s:2:"Æ°";s:3:"AÌŒ";s:2:"Ç";s:3:"aÌŒ";s:2:"ÇŽ";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç";s:3:"OÌŒ";s:2:"Ç‘";s:3:"oÌŒ";s:2:"Ç’";s:3:"UÌŒ";s:2:"Ç“";s:3:"uÌŒ";s:2:"Ç”";s:4:"Ǖ";s:2:"Ç•";s:4:"ǖ";s:2:"Ç–";s:4:"ÃœÌ";s:2:"Ç—";s:4:"üÌ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ç™";s:4:"ǚ";s:2:"Çš";s:4:"Ǜ";s:2:"Ç›";s:4:"ǜ";s:2:"Çœ";s:4:"Ǟ";s:2:"Çž";s:4:"ǟ";s:2:"ÇŸ";s:4:"Ǡ";s:2:"Ç ";s:4:"ǡ";s:2:"Ç¡";s:4:"Ǣ";s:2:"Ç¢";s:4:"ǣ";s:2:"Ç£";s:3:"GÌŒ";s:2:"Ǧ";s:3:"gÌŒ";s:2:"ǧ";s:3:"KÌŒ";s:2:"Ǩ";s:3:"kÌŒ";s:2:"Ç©";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"Ç«";s:4:"Ǭ";s:2:"Ǭ";s:4:"Ç«Ì„";s:2:"Ç­";s:4:"Æ·ÌŒ";s:2:"Ç®";s:4:"Ê’ÌŒ";s:2:"ǯ";s:3:"jÌŒ";s:2:"Ç°";s:3:"GÌ";s:2:"Ç´";s:3:"gÌ";s:2:"ǵ";s:3:"NÌ€";s:2:"Ǹ";s:3:"nÌ€";s:2:"ǹ";s:4:"Ã…Ì";s:2:"Ǻ";s:4:"Ã¥Ì";s:2:"Ç»";s:4:"ÆÌ";s:2:"Ǽ";s:4:"æÌ";s:2:"ǽ";s:4:"ØÌ";s:2:"Ǿ";s:4:"øÌ";s:2:"Ç¿";s:3:"AÌ";s:2:"È€";s:3:"aÌ";s:2:"È";s:3:"AÌ‘";s:2:"È‚";s:3:"aÌ‘";s:2:"ȃ";s:3:"EÌ";s:2:"È„";s:3:"eÌ";s:2:"È…";s:3:"EÌ‘";s:2:"Ȇ";s:3:"eÌ‘";s:2:"ȇ";s:3:"IÌ";s:2:"Ȉ";s:3:"iÌ";s:2:"ȉ";s:3:"IÌ‘";s:2:"ÈŠ";s:3:"iÌ‘";s:2:"È‹";s:3:"OÌ";s:2:"ÈŒ";s:3:"oÌ";s:2:"È";s:3:"OÌ‘";s:2:"ÈŽ";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È";s:3:"rÌ";s:2:"È‘";s:3:"RÌ‘";s:2:"È’";s:3:"rÌ‘";s:2:"È“";s:3:"UÌ";s:2:"È”";s:3:"uÌ";s:2:"È•";s:3:"UÌ‘";s:2:"È–";s:3:"uÌ‘";s:2:"È—";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"È™";s:3:"Ț";s:2:"Èš";s:3:"ț";s:2:"È›";s:3:"HÌŒ";s:2:"Èž";s:3:"hÌŒ";s:2:"ÈŸ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"È©";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"È«";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"È­";s:3:"Ȯ";s:2:"È®";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"È°";s:4:"ȱ";s:2:"ȱ";s:3:"YÌ„";s:2:"Ȳ";s:3:"yÌ„";s:2:"ȳ";s:2:"Ì€";s:2:"Í€";s:2:"Ì";s:2:"Í";s:2:"Ì“";s:2:"̓";s:4:"̈Ì";s:2:"Í„";s:2:"ʹ";s:2:"Í´";s:1:";";s:2:";";s:4:"¨Ì";s:2:"Î…";s:4:"ΑÌ";s:2:"Ά";s:2:"·";s:2:"·";s:4:"ΕÌ";s:2:"Έ";s:4:"ΗÌ";s:2:"Ή";s:4:"ΙÌ";s:2:"Ί";s:4:"ΟÌ";s:2:"ÎŒ";s:4:"Î¥Ì";s:2:"ÎŽ";s:4:"ΩÌ";s:2:"Î";s:4:"ÏŠÌ";s:2:"Î";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"αÌ";s:2:"ά";s:4:"εÌ";s:2:"έ";s:4:"ηÌ";s:2:"ή";s:4:"ιÌ";s:2:"ί";s:4:"Ï‹Ì";s:2:"ΰ";s:4:"ϊ";s:2:"ÏŠ";s:4:"ϋ";s:2:"Ï‹";s:4:"οÌ";s:2:"ÏŒ";s:4:"Ï…Ì";s:2:"Ï";s:4:"ωÌ";s:2:"ÏŽ";s:4:"Ï’Ì";s:2:"Ï“";s:4:"ϔ";s:2:"Ï”";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ð";s:4:"ГÌ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"КÌ";s:2:"ÐŒ";s:4:"Ѝ";s:2:"Ð";s:4:"Ў";s:2:"ÐŽ";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"Ñ";s:4:"ё";s:2:"Ñ‘";s:4:"гÌ";s:2:"Ñ“";s:4:"ї";s:2:"Ñ—";s:4:"кÌ";s:2:"Ñœ";s:4:"ѝ";s:2:"Ñ";s:4:"ў";s:2:"Ñž";s:4:"Ñ´Ì";s:2:"Ѷ";s:4:"ѵÌ";s:2:"Ñ·";s:4:"Ӂ";s:2:"Ó";s:4:"ӂ";s:2:"Ó‚";s:4:"Ð̆";s:2:"Ó";s:4:"ӑ";s:2:"Ó‘";s:4:"Ð̈";s:2:"Ó’";s:4:"ӓ";s:2:"Ó“";s:4:"Ӗ";s:2:"Ó–";s:4:"ӗ";s:2:"Ó—";s:4:"Ӛ";s:2:"Óš";s:4:"ӛ";s:2:"Ó›";s:4:"Ӝ";s:2:"Óœ";s:4:"ӝ";s:2:"Ó";s:4:"Ӟ";s:2:"Óž";s:4:"ӟ";s:2:"ÓŸ";s:4:"Ӣ";s:2:"Ó¢";s:4:"ӣ";s:2:"Ó£";s:4:"Ӥ";s:2:"Ó¤";s:4:"ӥ";s:2:"Ó¥";s:4:"Ӧ";s:2:"Ó¦";s:4:"ӧ";s:2:"Ó§";s:4:"Ӫ";s:2:"Óª";s:4:"ӫ";s:2:"Ó«";s:4:"Ӭ";s:2:"Ó¬";s:4:"Ñ̈";s:2:"Ó­";s:4:"Ӯ";s:2:"Ó®";s:4:"ӯ";s:2:"Ó¯";s:4:"Ӱ";s:2:"Ó°";s:4:"ӱ";s:2:"Ó±";s:4:"Ӳ";s:2:"Ó²";s:4:"ӳ";s:2:"Ó³";s:4:"Ӵ";s:2:"Ó´";s:4:"ӵ";s:2:"Óµ";s:4:"Ӹ";s:2:"Ó¸";s:4:"ӹ";s:2:"Ó¹";s:4:"آ";s:2:"Ø¢";s:4:"أ";s:2:"Ø£";s:4:"ÙˆÙ”";s:2:"ؤ";s:4:"إ";s:2:"Ø¥";s:4:"ÙŠÙ”";s:2:"ئ";s:4:"Û•Ù”";s:2:"Û€";s:4:"ÛÙ”";s:2:"Û‚";s:4:"Û’Ù”";s:2:"Û“";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"à­ˆ";s:6:"ୋ";s:3:"à­‹";s:6:"ୌ";s:3:"à­Œ";s:6:"ஔ";s:3:"à®”";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"à³€";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"à·š";s:6:"à·™à·";s:3:"à·œ";s:6:"ෝ";s:3:"à·";s:6:"ෞ";s:3:"à·ž";s:6:"ཱི";s:3:"ཱི";s:6:"ཱུ";s:3:"ཱུ";s:6:"ཱྀ";s:3:"à¾";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"á¬á¬µ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"á­€";s:6:"ᭁ";s:3:"á­";s:6:"ᭃ";s:3:"á­ƒ";s:3:"AÌ¥";s:3:"Ḁ";s:3:"aÌ¥";s:3:"á¸";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"BÌ£";s:3:"Ḅ";s:3:"bÌ£";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"ÇÌ";s:3:"Ḉ";s:4:"çÌ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"DÌ£";s:3:"Ḍ";s:3:"dÌ£";s:3:"á¸";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"á¸";s:3:"ḑ";s:3:"ḑ";s:3:"DÌ­";s:3:"Ḓ";s:3:"dÌ­";s:3:"ḓ";s:4:"Ä’Ì€";s:3:"Ḕ";s:4:"Ä“Ì€";s:3:"ḕ";s:4:"Ä’Ì";s:3:"Ḗ";s:4:"Ä“Ì";s:3:"ḗ";s:3:"EÌ­";s:3:"Ḙ";s:3:"eÌ­";s:3:"ḙ";s:3:"EÌ°";s:3:"Ḛ";s:3:"eÌ°";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"á¸";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"GÌ„";s:3:"Ḡ";s:3:"gÌ„";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"HÌ£";s:3:"Ḥ";s:3:"hÌ£";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"HÌ®";s:3:"Ḫ";s:3:"hÌ®";s:3:"ḫ";s:3:"IÌ°";s:3:"Ḭ";s:3:"iÌ°";s:3:"ḭ";s:4:"ÃÌ";s:3:"Ḯ";s:4:"ïÌ";s:3:"ḯ";s:3:"KÌ";s:3:"Ḱ";s:3:"kÌ";s:3:"ḱ";s:3:"KÌ£";s:3:"Ḳ";s:3:"kÌ£";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"LÌ£";s:3:"Ḷ";s:3:"lÌ£";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"LÌ­";s:3:"Ḽ";s:3:"lÌ­";s:3:"ḽ";s:3:"MÌ";s:3:"Ḿ";s:3:"mÌ";s:3:"ḿ";s:3:"Ṁ";s:3:"á¹€";s:3:"ṁ";s:3:"á¹";s:3:"MÌ£";s:3:"Ṃ";s:3:"mÌ£";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"á¹…";s:3:"NÌ£";s:3:"Ṇ";s:3:"nÌ£";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"NÌ­";s:3:"Ṋ";s:3:"nÌ­";s:3:"ṋ";s:4:"ÕÌ";s:3:"Ṍ";s:4:"õÌ";s:3:"á¹";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"á¹";s:4:"Ṑ";s:3:"á¹";s:4:"ÅÌ€";s:3:"ṑ";s:4:"ÅŒÌ";s:3:"á¹’";s:4:"ÅÌ";s:3:"ṓ";s:3:"PÌ";s:3:"á¹”";s:3:"pÌ";s:3:"ṕ";s:3:"Ṗ";s:3:"á¹–";s:3:"ṗ";s:3:"á¹—";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"á¹™";s:3:"RÌ£";s:3:"Ṛ";s:3:"rÌ£";s:3:"á¹›";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"á¹";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"á¹ ";s:3:"ṡ";s:3:"ṡ";s:3:"SÌ£";s:3:"á¹¢";s:3:"sÌ£";s:3:"á¹£";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"á¹¥";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"TÌ£";s:3:"Ṭ";s:3:"tÌ£";s:3:"á¹­";s:3:"Ṯ";s:3:"á¹®";s:3:"ṯ";s:3:"ṯ";s:3:"TÌ­";s:3:"á¹°";s:3:"tÌ­";s:3:"á¹±";s:3:"Ṳ";s:3:"á¹²";s:3:"ṳ";s:3:"á¹³";s:3:"UÌ°";s:3:"á¹´";s:3:"uÌ°";s:3:"á¹µ";s:3:"UÌ­";s:3:"Ṷ";s:3:"uÌ­";s:3:"á¹·";s:4:"ŨÌ";s:3:"Ṹ";s:4:"Å©Ì";s:3:"á¹¹";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"á¹»";s:3:"Ṽ";s:3:"á¹¼";s:3:"ṽ";s:3:"á¹½";s:3:"VÌ£";s:3:"á¹¾";s:3:"vÌ£";s:3:"ṿ";s:3:"WÌ€";s:3:"Ẁ";s:3:"wÌ€";s:3:"áº";s:3:"WÌ";s:3:"Ẃ";s:3:"wÌ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"WÌ£";s:3:"Ẉ";s:3:"wÌ£";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"áº";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"áº";s:3:"zÌ‚";s:3:"ẑ";s:3:"ZÌ£";s:3:"Ẓ";s:3:"zÌ£";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"wÌŠ";s:3:"ẘ";s:3:"yÌŠ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"AÌ£";s:3:"Ạ";s:3:"aÌ£";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"ÂÌ";s:3:"Ấ";s:4:"âÌ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ä‚Ì";s:3:"Ắ";s:4:"ăÌ";s:3:"ắ";s:4:"Ä‚Ì€";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"EÌ£";s:3:"Ẹ";s:3:"eÌ£";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"ÊÌ";s:3:"Ế";s:4:"êÌ";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"á»";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"á»…";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"IÌ£";s:3:"Ị";s:3:"iÌ£";s:3:"ị";s:3:"OÌ£";s:3:"Ọ";s:3:"oÌ£";s:3:"á»";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"á»";s:4:"ÔÌ";s:3:"á»";s:4:"ôÌ";s:3:"ố";s:4:"Ồ";s:3:"á»’";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"á»”";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"á»–";s:4:"ỗ";s:3:"á»—";s:5:"Ộ";s:3:"Ộ";s:5:"á»Ì‚";s:3:"á»™";s:4:"Æ Ì";s:3:"Ớ";s:4:"Æ¡Ì";s:3:"á»›";s:4:"Ờ";s:3:"Ờ";s:4:"Æ¡Ì€";s:3:"á»";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"á» ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"Æ¡Ì£";s:3:"ợ";s:3:"UÌ£";s:3:"Ụ";s:3:"uÌ£";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"ƯÌ";s:3:"Ứ";s:4:"Æ°Ì";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"Æ°Ì€";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"á»­";s:4:"Ữ";s:3:"á»®";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"á»°";s:4:"Æ°Ì£";s:3:"á»±";s:3:"YÌ€";s:3:"Ỳ";s:3:"yÌ€";s:3:"ỳ";s:3:"YÌ£";s:3:"á»´";s:3:"yÌ£";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"á»·";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"á¼€";s:4:"ἁ";s:3:"á¼";s:5:"ἂ";s:3:"ἂ";s:5:"á¼Ì€";s:3:"ἃ";s:5:"á¼€Ì";s:3:"ἄ";s:5:"á¼Ì";s:3:"á¼…";s:5:"ἆ";s:3:"ἆ";s:5:"á¼Í‚";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"ἈÌ";s:3:"Ἄ";s:5:"ἉÌ";s:3:"á¼";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"á¼";s:4:"ἑ";s:3:"ἑ";s:5:"á¼Ì€";s:3:"á¼’";s:5:"ἓ";s:3:"ἓ";s:5:"á¼Ì";s:3:"á¼”";s:5:"ἑÌ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"á¼™";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"á¼›";s:5:"ἘÌ";s:3:"Ἔ";s:5:"á¼™Ì";s:3:"á¼";s:4:"ἠ";s:3:"á¼ ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"á¼¢";s:5:"ἣ";s:3:"á¼£";s:5:"á¼ Ì";s:3:"ἤ";s:5:"ἡÌ";s:3:"á¼¥";s:5:"á¼ Í‚";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"ἨÌ";s:3:"Ἤ";s:5:"ἩÌ";s:3:"á¼­";s:5:"Ἦ";s:3:"á¼®";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"á¼°";s:4:"ἱ";s:3:"á¼±";s:5:"á¼°Ì€";s:3:"á¼²";s:5:"ἳ";s:3:"á¼³";s:5:"á¼°Ì";s:3:"á¼´";s:5:"á¼±Ì";s:3:"á¼µ";s:5:"á¼°Í‚";s:3:"ἶ";s:5:"ἷ";s:3:"á¼·";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"á¼¹";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"á¼»";s:5:"ἸÌ";s:3:"á¼¼";s:5:"á¼¹Ì";s:3:"á¼½";s:5:"Ἶ";s:3:"á¼¾";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"á½€";s:4:"ὁ";s:3:"á½";s:5:"ὂ";s:3:"ὂ";s:5:"á½Ì€";s:3:"ὃ";s:5:"á½€Ì";s:3:"ὄ";s:5:"á½Ì";s:3:"á½…";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"ὈÌ";s:3:"Ὄ";s:5:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"á½";s:4:"Ï…Ì”";s:3:"ὑ";s:5:"á½Ì€";s:3:"á½’";s:5:"ὓ";s:3:"ὓ";s:5:"á½Ì";s:3:"á½”";s:5:"ὑÌ";s:3:"ὕ";s:5:"á½Í‚";s:3:"á½–";s:5:"ὗ";s:3:"á½—";s:4:"Ὑ";s:3:"á½™";s:5:"Ὓ";s:3:"á½›";s:5:"á½™Ì";s:3:"á½";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"á½ ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"á½¢";s:5:"ὣ";s:3:"á½£";s:5:"á½ Ì";s:3:"ὤ";s:5:"ὡÌ";s:3:"á½¥";s:5:"á½ Í‚";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"ὨÌ";s:3:"Ὤ";s:5:"ὩÌ";s:3:"á½­";s:5:"Ὦ";s:3:"á½®";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"á½°";s:2:"ά";s:3:"á½±";s:4:"ὲ";s:3:"á½²";s:2:"έ";s:3:"á½³";s:4:"ὴ";s:3:"á½´";s:2:"ή";s:3:"á½µ";s:4:"ὶ";s:3:"ὶ";s:2:"ί";s:3:"á½·";s:4:"ὸ";s:3:"ὸ";s:2:"ÏŒ";s:3:"á½¹";s:4:"Ï…Ì€";s:3:"ὺ";s:2:"Ï";s:3:"á½»";s:4:"ὼ";s:3:"á½¼";s:2:"ÏŽ";s:3:"á½½";s:5:"ᾀ";s:3:"á¾€";s:5:"á¼Í…";s:3:"á¾";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"á¼…Í…";s:3:"á¾…";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"á¼Í…";s:3:"á¾";s:5:"ᾎ";s:3:"ᾎ";s:5:"á¼Í…";s:3:"á¾";s:5:"á¼ Í…";s:3:"á¾";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"á¾’";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"á¾”";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"á¾–";s:5:"ᾗ";s:3:"á¾—";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"á¾™";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"á¾›";s:5:"ᾜ";s:3:"ᾜ";s:5:"á¼­Í…";s:3:"á¾";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"á½ Í…";s:3:"á¾ ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"á¾¢";s:5:"ᾣ";s:3:"á¾£";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"á¾¥";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"á½­Í…";s:3:"á¾­";s:5:"ᾮ";s:3:"á¾®";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"á¾°";s:4:"ᾱ";s:3:"á¾±";s:5:"á½°Í…";s:3:"á¾²";s:4:"ᾳ";s:3:"á¾³";s:4:"ᾴ";s:3:"á¾´";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"á¾·";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"á¾¹";s:4:"Ὰ";s:3:"Ὰ";s:2:"Ά";s:3:"á¾»";s:4:"ᾼ";s:3:"á¾¼";s:2:"ι";s:3:"á¾¾";s:4:"῁";s:3:"á¿";s:5:"á½´Í…";s:3:"á¿‚";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"á¿„";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:2:"Έ";s:3:"Έ";s:4:"Ὴ";s:3:"á¿Š";s:2:"Ή";s:3:"á¿‹";s:4:"ῌ";s:3:"á¿Œ";s:5:"῍";s:3:"á¿";s:5:"᾿Ì";s:3:"á¿Ž";s:5:"῏";s:3:"á¿";s:4:"ῐ";s:3:"á¿";s:4:"ῑ";s:3:"á¿‘";s:4:"ÏŠÌ€";s:3:"á¿’";s:2:"Î";s:3:"á¿“";s:4:"ῖ";s:3:"á¿–";s:4:"ÏŠÍ‚";s:3:"á¿—";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"á¿™";s:4:"Ὶ";s:3:"á¿š";s:2:"Ί";s:3:"á¿›";s:5:"῝";s:3:"á¿";s:5:"῾Ì";s:3:"á¿ž";s:5:"῟";s:3:"á¿Ÿ";s:4:"ῠ";s:3:"á¿ ";s:4:"Ï…Ì„";s:3:"á¿¡";s:4:"Ï‹Ì€";s:3:"á¿¢";s:2:"ΰ";s:3:"á¿£";s:4:"ÏÌ“";s:3:"ῤ";s:4:"ÏÌ”";s:3:"á¿¥";s:4:"Ï…Í‚";s:3:"ῦ";s:4:"Ï‹Í‚";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"á¿©";s:4:"Ὺ";s:3:"Ὺ";s:2:"ÎŽ";s:3:"á¿«";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"á¿­";s:2:"Î…";s:3:"á¿®";s:1:"`";s:3:"`";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ÏŽÍ…";s:3:"á¿´";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"á¿·";s:4:"Ὸ";s:3:"Ὸ";s:2:"ÎŒ";s:3:"Ό";s:4:"Ὼ";s:3:"Ὼ";s:2:"Î";s:3:"á¿»";s:4:"ῼ";s:3:"ῼ";s:2:"´";s:3:"´";s:3:" ";s:3:" ";s:3:" ";s:3:"â€";s:2:"Ω";s:3:"Ω";s:1:"K";s:3:"K";s:2:"Ã…";s:3:"â„«";s:5:"â†Ì¸";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"â‡Ì¸";s:3:"â‡";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"â‡";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"â‰";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"â‰Ì¸";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"âŠ";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"â‹ ";s:5:"⋡";s:3:"â‹¡";s:5:"⋢";s:3:"â‹¢";s:5:"⋣";s:3:"â‹£";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"â‹«";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"â‹­";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:6:"ã‹ã‚™";s:3:"ãŒ";s:6:"ãã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ã‘ã‚™";s:3:"ã’";s:6:"ã“ã‚™";s:3:"ã”";s:6:"ã•ã‚™";s:3:"ã–";s:6:"ã—ã‚™";s:3:"ã˜";s:6:"ã™ã‚™";s:3:"ãš";s:6:"ã›ã‚™";s:3:"ãœ";s:6:"ãã‚™";s:3:"ãž";s:6:"ãŸã‚™";s:3:"ã ";s:6:"ã¡ã‚™";s:3:"ã¢";s:6:"ã¤ã‚™";s:3:"ã¥";s:6:"ã¦ã‚™";s:3:"ã§";s:6:"ã¨ã‚™";s:3:"ã©";s:6:"ã¯ã‚™";s:3:"ã°";s:6:"ã¯ã‚š";s:3:"ã±";s:6:"ã²ã‚™";s:3:"ã³";s:6:"ã²ã‚š";s:3:"ã´";s:6:"ãµã‚™";s:3:"ã¶";s:6:"ãµã‚š";s:3:"ã·";s:6:"ã¸ã‚™";s:3:"ã¹";s:6:"ã¸ã‚š";s:3:"ãº";s:6:"ã»ã‚™";s:3:"ã¼";s:6:"ã»ã‚š";s:3:"ã½";s:6:"ã†ã‚™";s:3:"ã‚”";s:6:"ã‚ã‚™";s:3:"ã‚ž";s:6:"ã‚«ã‚™";s:3:"ガ";s:6:"ã‚­ã‚™";s:3:"ã‚®";s:6:"グ";s:3:"ã‚°";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ã‚´";s:6:"ザ";s:3:"ザ";s:6:"ã‚·ã‚™";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ã‚¿ã‚™";s:3:"ダ";s:6:"ãƒã‚™";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"ãƒã‚™";s:3:"ãƒ";s:6:"ãƒã‚š";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ãƒ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:3:"豈";s:3:"豈";s:3:"æ›´";s:3:"ï¤";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"å¥";s:3:"句";s:3:"龜";s:3:"ï«Ž";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"å–‡";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:4:"懶";s:3:"癩";s:3:"癩";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"ï¤";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"é‚";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"æ´›";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"çž";s:3:"珞";s:3:"è½";s:3:"落";s:3:"é…ª";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"åµ";s:3:"卵";s:3:"欄";s:3:"ï¤";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"åµ";s:3:"嵐";s:3:"æ¿«";s:3:"濫";s:3:"è—";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"è Ÿ";s:3:"蠟";s:3:"廊";s:4:"廊";s:3:"朗";s:4:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"å‹ž";s:3:"勞";s:3:"æ“„";s:3:"擄";s:3:"æ«“";s:3:"櫓";s:3:"çˆ";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"è€";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:4:"虜";s:3:"è·¯";s:3:"路";s:3:"露";s:3:"露";s:3:"é­¯";s:3:"魯";s:3:"é·º";s:3:"鷺";s:3:"碌";s:4:"ð¯¥";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"è‰";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"è«–";s:3:"ï¥";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"ç± ";s:3:"籠";s:3:"è¾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"é›·";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"å±¢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"æ·š";s:3:"ï¥";s:3:"æ¼";s:3:"漏";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"ï¥";s:3:"陋";s:3:"陋";s:3:"å‹’";s:3:"勒";s:3:"è‚‹";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"è±";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"æ‹";s:3:"拏";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:4:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"ç•°";s:4:"異";s:3:"北";s:4:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"ä¸";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"ç´¢";s:3:"索";s:3:"åƒ";s:3:"參";s:3:"å¡ž";s:3:"塞";s:3:"çœ";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:4:"殺";s:3:"è¾°";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"è‹¥";s:4:"若";s:3:"掠";s:3:"掠";s:3:"ç•¥";s:3:"略";s:3:"亮";s:3:"亮";s:3:"å…©";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"æ¢";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"è«’";s:3:"諒";s:3:"é‡";s:3:"量";s:3:"勵";s:3:"勵";s:3:"å‘‚";s:3:"呂";s:3:"女";s:3:"ï¦";s:3:"廬";s:3:"廬";s:3:"æ—…";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"é–­";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"æ­·";s:3:"歷";s:3:"è½¢";s:3:"ï¦";s:3:"å¹´";s:3:"年";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"ï¦";s:3:"æ’š";s:3:"撚";s:3:"æ¼£";s:3:"漣";s:3:"ç…‰";s:3:"煉";s:3:"ç’‰";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"ç·´";s:3:"練";s:3:"è¯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"è“®";s:3:"蓮";s:3:"連";s:3:"連";s:3:"éŠ";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"ï¦";s:3:"å’½";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"æ»";s:3:"捻";s:3:"æ®®";s:3:"殮";s:3:"ç°¾";s:3:"簾";s:3:"çµ";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"ç‘©";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"è†";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"éˆ";s:3:"靈";s:3:"é ˜";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"å°¿";s:3:"尿";s:3:"æ–™";s:3:"料";s:3:"燎";s:3:"燎";s:3:"療";s:3:"ï§";s:3:"蓼";s:3:"蓼";s:3:"é¼";s:3:"遼";s:3:"é¾";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"æ»";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"æµ";s:4:"流";s:3:"溜";s:3:"溜";s:3:"ç‰";s:3:"琉";s:3:"ç•™";s:3:"ï§";s:3:"ç¡«";s:3:"硫";s:3:"ç´";s:3:"ï§";s:3:"é¡ž";s:3:"ï§";s:3:"å…­";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"å´™";s:3:"崙";s:3:"æ·ª";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"æ…„";s:3:"慄";s:3:"æ —";s:3:"栗";s:3:"隆";s:3:"隆";s:3:"利";s:3:"ï§";s:3:"å";s:3:"吏";s:3:"å±¥";s:3:"履";s:3:"易";s:3:"易";s:3:"æŽ";s:3:"李";s:3:"梨";s:3:"梨";s:3:"æ³¥";s:3:"泥";s:3:"ç†";s:3:"理";s:3:"ç—¢";s:3:"痢";s:3:"ç½¹";s:3:"罹";s:3:"è£";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"å";s:3:"吝";s:3:"ç‡";s:3:"燐";s:3:"ç’˜";s:3:"璘";s:3:"è—º";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"é±—";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"æž—";s:3:"林";s:3:"æ·‹";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"ç«‹";s:3:"立";s:3:"笠";s:3:"笠";s:3:"ç²’";s:3:"粒";s:3:"ç‹€";s:3:"狀";s:3:"ç‚™";s:3:"炙";s:3:"è­˜";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:4:"ð¯¡";s:3:"度";s:3:"ï¨";s:3:"æ‹“";s:3:"拓";s:3:"ç³–";s:3:"糖";s:3:"å®…";s:3:"宅";s:3:"æ´ž";s:3:"洞";s:3:"æš´";s:3:"暴";s:3:"è¼»";s:3:"輻";s:3:"è¡Œ";s:3:"行";s:3:"é™";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"å…€";s:3:"兀";s:3:"å—€";s:3:"ï¨";s:3:"å¡š";s:3:"塚";s:3:"æ™´";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"ç¦";s:4:"福";s:3:"é–";s:3:"靖";s:3:"ç²¾";s:3:"ï¨";s:3:"ç¾½";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"ä¾®";s:4:"侮";s:3:"僧";s:4:"僧";s:3:"å…";s:4:"免";s:3:"勉";s:4:"勉";s:3:"勤";s:4:"勤";s:3:"å‘";s:4:"卑";s:3:"å–";s:3:"喝";s:3:"嘆";s:4:"嘆";s:3:"器";s:3:"器";s:3:"å¡€";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"å±®";s:4:"屮";s:3:"æ‚”";s:4:"悔";s:3:"æ…¨";s:3:"慨";s:3:"憎";s:4:"憎";s:3:"懲";s:4:"懲";s:3:"æ•";s:4:"敏";s:3:"æ—¢";s:3:"ï©‚";s:3:"æš‘";s:4:"ð¯£";s:3:"梅";s:4:"梅";s:3:"æµ·";s:4:"ð¯¤";s:3:"渚";s:3:"渚";s:3:"æ¼¢";s:3:"漢";s:3:"ç…®";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"ç¢";s:3:"ï©Š";s:3:"碑";s:3:"ï©‹";s:3:"社";s:3:"ï©Œ";s:3:"祉";s:3:"ï©";s:3:"祈";s:3:"ï©Ž";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:4:"祖";s:3:"ç¥";s:3:"ï©‘";s:3:"ç¦";s:3:"ï©’";s:3:"禎";s:3:"ï©“";s:3:"ç©€";s:4:"穀";s:3:"çª";s:3:"ï©•";s:3:"節";s:3:"節";s:3:"縉";s:3:"縉";s:3:"ç¹";s:3:"ï©™";s:3:"ç½²";s:3:"ï©š";s:3:"者";s:4:"者";s:3:"臭";s:3:"ï©œ";s:3:"艹";s:3:"ï©ž";s:3:"è‘—";s:4:"著";s:3:"è¤";s:3:"ï© ";s:3:"視";s:3:"視";s:3:"è¬";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"è´ˆ";s:3:"ï«";s:3:"辶";s:3:"辶";s:3:"難";s:3:"難";s:3:"響";s:3:"ï«Š";s:3:"é »";s:3:"ï«Œ";s:3:"æµ";s:3:"ï©«";s:4:"𤋮";s:3:"𤋮";s:3:"舘";s:3:"ï©­";s:3:"並";s:3:"ï©°";s:3:"况";s:4:"况";s:3:"å…¨";s:3:"全";s:3:"ä¾€";s:3:"侀";s:3:"å……";s:3:"ï©´";s:3:"冀";s:3:"冀";s:3:"勇";s:4:"勇";s:3:"勺";s:4:"勺";s:3:"å••";s:3:"啕";s:3:"å–™";s:4:"喙";s:3:"å—¢";s:3:"ï©»";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"ï©¿";s:3:"å©¢";s:3:"婢";s:3:"嬨";s:3:"ïª";s:3:"å»’";s:3:"廒";s:3:"å»™";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"å¾­";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"æ…Ž";s:4:"慎";s:3:"愈";s:3:"愈";s:3:"æ… ";s:3:"慠";s:3:"戴";s:3:"戴";s:3:"æ„";s:3:"ïª";s:3:"æœ";s:3:"搜";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"ïª";s:3:"望";s:4:"望";s:3:"æ–";s:3:"杖";s:3:"æ­¹";s:3:"歹";s:3:"æ»›";s:3:"滛";s:3:"滋";s:4:"滋";s:3:"瀞";s:4:"瀞";s:3:"瞧";s:3:"ïª";s:3:"爵";s:4:"爵";s:3:"犯";s:3:"犯";s:3:"瑱";s:4:"瑱";s:3:"甆";s:3:"甆";s:3:"ç”»";s:3:"画";s:3:"ç˜";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"ç››";s:3:"盛";s:3:"ç›´";s:4:"直";s:3:"çŠ";s:4:"睊";s:3:"ç€";s:3:"着";s:3:"磌";s:4:"ð¯¥";s:3:"窱";s:3:"窱";s:3:"ç±»";s:3:"类";s:3:"çµ›";s:3:"絛";s:3:"ç¼¾";s:3:"缾";s:3:"è’";s:3:"荒";s:3:"è¯";s:3:"華";s:3:"è¹";s:4:"蝹";s:3:"è¥";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"調";s:3:"調";s:3:"è«‹";s:3:"請";s:3:"è«­";s:4:"ð¯§";s:3:"變";s:4:"變";s:3:"輸";s:4:"輸";s:3:"é²";s:3:"遲";s:3:"醙";s:3:"ï«„";s:3:"鉶";s:3:"ï«…";s:3:"陼";s:3:"陼";s:3:"韛";s:3:"韛";s:3:"é ‹";s:4:"頋";s:3:"鬒";s:4:"鬒";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«";s:4:"ð£•";s:3:"ï«‘";s:3:"ã®";s:4:"㮝";s:3:"䀘";s:3:"ï«“";s:3:"䀹";s:4:"䀹";s:4:"𥉉";s:3:"ï«•";s:4:"ð¥³";s:3:"ï«–";s:4:"𧻓";s:3:"ï«—";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"ï«™";s:8:"𑂚";s:4:"ð‘‚š";s:8:"𑂜";s:4:"ð‘‚œ";s:8:"𑂫";s:4:"ð‘‚«";s:3:"丽";s:4:"丽";s:3:"丸";s:4:"ð¯ ";s:3:"ä¹";s:4:"乁";s:4:"ð „¢";s:4:"𠄢";s:3:"ä½ ";s:4:"你";s:3:"ä¾»";s:4:"侻";s:3:"倂";s:4:"倂";s:3:"åº";s:4:"偺";s:3:"å‚™";s:4:"備";s:3:"åƒ";s:4:"像";s:3:"ã’ž";s:4:"㒞";s:4:"𠘺";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"ð¯ ";s:3:"å…·";s:4:"具";s:4:"𠔜";s:4:"𠔜";s:3:"ã’¹";s:4:"㒹";s:3:"å…§";s:4:"內";s:3:"å†";s:4:"再";s:4:"ð •‹";s:4:"𠕋";s:3:"冗";s:4:"冗";s:3:"冤";s:4:"冤";s:3:"仌";s:4:"仌";s:3:"冬";s:4:"冬";s:4:"𩇟";s:4:"𩇟";s:3:"凵";s:4:"ð¯ ";s:3:"刃";s:4:"刃";s:3:"ã“Ÿ";s:4:"㓟";s:3:"刻";s:4:"刻";s:3:"剆";s:4:"剆";s:3:"割";s:4:"割";s:3:"剷";s:4:"剷";s:3:"㔕";s:4:"㔕";s:3:"包";s:4:"包";s:3:"匆";s:4:"匆";s:3:"å‰";s:4:"卉";s:3:"åš";s:4:"博";s:3:"å³";s:4:"即";s:3:"å½";s:4:"卽";s:3:"å¿";s:4:"卿";s:4:"𠨬";s:4:"𠨬";s:3:"ç°";s:4:"灰";s:3:"åŠ";s:4:"及";s:3:"åŸ";s:4:"叟";s:4:"ð ­£";s:4:"𠭣";s:3:"å«";s:4:"叫";s:3:"å±";s:4:"叱";s:3:"å†";s:4:"吆";s:3:"å’ž";s:4:"咞";s:3:"å¸";s:4:"吸";s:3:"呈";s:4:"呈";s:3:"周";s:4:"周";s:3:"å’¢";s:4:"咢";s:3:"哶";s:4:"ð¯¡";s:3:"å”";s:4:"唐";s:3:"å•“";s:4:"啓";s:3:"å•£";s:4:"啣";s:3:"å–„";s:4:"善";s:3:"å–«";s:4:"喫";s:3:"å–³";s:4:"喳";s:3:"å—‚";s:4:"嗂";s:3:"圖";s:4:"圖";s:3:"圗";s:4:"ð¯¡";s:3:"噑";s:4:"噑";s:3:"å™´";s:4:"ð¯¡";s:3:"壮";s:4:"壮";s:3:"城";s:4:"城";s:3:"埴";s:4:"埴";s:3:"å ";s:4:"堍";s:3:"åž‹";s:4:"型";s:3:"å ²";s:4:"堲";s:3:"å ±";s:4:"報";s:3:"墬";s:4:"墬";s:4:"𡓤";s:4:"𡓤";s:3:"売";s:4:"売";s:3:"壷";s:4:"壷";s:3:"夆";s:4:"夆";s:3:"多";s:4:"ð¯¡";s:3:"夢";s:4:"夢";s:3:"奢";s:4:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:3:"姬";s:4:"姬";s:3:"娛";s:4:"娛";s:3:"娧";s:4:"娧";s:3:"姘";s:4:"姘";s:3:"婦";s:4:"婦";s:3:"ã›®";s:4:"㛮";s:3:"㛼";s:4:"㛼";s:3:"嬈";s:4:"嬈";s:3:"嬾";s:4:"嬾";s:4:"𡧈";s:4:"𡧈";s:3:"寃";s:4:"寃";s:3:"寘";s:4:"寘";s:3:"寳";s:4:"寳";s:4:"𡬘";s:4:"𡬘";s:3:"寿";s:4:"寿";s:3:"å°†";s:4:"将";s:3:"当";s:4:"当";s:3:"å°¢";s:4:"尢";s:3:"ãž";s:4:"㞁";s:3:"å± ";s:4:"屠";s:3:"å³€";s:4:"峀";s:3:"å²";s:4:"岍";s:4:"ð¡·¤";s:4:"𡷤";s:3:"嵃";s:4:"嵃";s:4:"ð¡·¦";s:4:"𡷦";s:3:"åµ®";s:4:"嵮";s:3:"嵫";s:4:"嵫";s:3:"åµ¼";s:4:"嵼";s:3:"å·¡";s:4:"ð¯¢";s:3:"å·¢";s:4:"巢";s:3:"ã ¯";s:4:"㠯";s:3:"å·½";s:4:"巽";s:3:"帨";s:4:"帨";s:3:"帽";s:4:"帽";s:3:"幩";s:4:"幩";s:3:"ã¡¢";s:4:"㡢";s:4:"𢆃";s:4:"𢆃";s:3:"㡼";s:4:"㡼";s:3:"庰";s:4:"庰";s:3:"庳";s:4:"庳";s:3:"庶";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"ð¯¢";s:4:"𢌱";s:4:"𢌱";s:3:"èˆ";s:4:"舁";s:3:"å¼¢";s:4:"弢";s:3:"㣇";s:4:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:3:"å½¢";s:4:"形";s:3:"彫";s:4:"彫";s:3:"㣣";s:4:"㣣";s:3:"徚";s:4:"徚";s:3:"å¿";s:4:"ð¯¢";s:3:"å¿—";s:4:"志";s:3:"忹";s:4:"忹";s:3:"æ‚";s:4:"悁";s:3:"㤺";s:4:"㤺";s:3:"㤜";s:4:"㤜";s:4:"𢛔";s:4:"𢛔";s:3:"惇";s:4:"惇";s:3:"æ…ˆ";s:4:"慈";s:3:"æ…Œ";s:4:"慌";s:3:"æ…º";s:4:"慺";s:3:"憲";s:4:"憲";s:3:"憤";s:4:"憤";s:3:"憯";s:4:"憯";s:3:"懞";s:4:"懞";s:3:"æˆ";s:4:"成";s:3:"戛";s:4:"戛";s:3:"æ‰";s:4:"扝";s:3:"抱";s:4:"抱";s:3:"æ‹”";s:4:"拔";s:3:"æ";s:4:"捐";s:4:"𢬌";s:4:"𢬌";s:3:"挽";s:4:"挽";s:3:"拼";s:4:"拼";s:3:"æ¨";s:4:"捨";s:3:"掃";s:4:"掃";s:3:"æ¤";s:4:"揤";s:4:"𢯱";s:4:"𢯱";s:3:"æ¢";s:4:"搢";s:3:"æ…";s:4:"揅";s:3:"掩";s:4:"ð¯£";s:3:"㨮";s:4:"㨮";s:3:"æ‘©";s:4:"摩";s:3:"摾";s:4:"摾";s:3:"æ’";s:4:"撝";s:3:"æ‘·";s:4:"摷";s:3:"㩬";s:4:"㩬";s:3:"敬";s:4:"敬";s:4:"𣀊";s:4:"𣀊";s:3:"æ—£";s:4:"旣";s:3:"書";s:4:"書";s:3:"晉";s:4:"ð¯£";s:3:"㬙";s:4:"㬙";s:3:"㬈";s:4:"ð¯£";s:3:"㫤";s:4:"㫤";s:3:"冒";s:4:"冒";s:3:"冕";s:4:"冕";s:3:"最";s:4:"最";s:3:"æšœ";s:4:"暜";s:3:"è‚­";s:4:"肭";s:3:"ä™";s:4:"䏙";s:3:"朡";s:4:"朡";s:3:"æž";s:4:"杞";s:3:"æ“";s:4:"杓";s:4:"ð£ƒ";s:4:"ð¯£";s:3:"ã­‰";s:4:"㭉";s:3:"柺";s:4:"柺";s:3:"æž…";s:4:"枅";s:3:"æ¡’";s:4:"桒";s:4:"𣑭";s:4:"𣑭";s:3:"梎";s:4:"梎";s:3:"æ Ÿ";s:4:"栟";s:3:"椔";s:4:"椔";s:3:"楂";s:4:"楂";s:3:"榣";s:4:"榣";s:3:"槪";s:4:"槪";s:3:"檨";s:4:"檨";s:4:"𣚣";s:4:"𣚣";s:3:"æ«›";s:4:"櫛";s:3:"ã°˜";s:4:"㰘";s:3:"次";s:4:"次";s:4:"𣢧";s:4:"𣢧";s:3:"æ­”";s:4:"歔";s:3:"㱎";s:4:"㱎";s:3:"æ­²";s:4:"歲";s:3:"殟";s:4:"殟";s:3:"æ®»";s:4:"殻";s:4:"ð£ª";s:4:"𣪍";s:4:"ð¡´‹";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:3:"汎";s:4:"汎";s:4:"𣲼";s:4:"𣲼";s:3:"沿";s:4:"沿";s:3:"æ³";s:4:"泍";s:3:"汧";s:4:"汧";s:3:"æ´–";s:4:"洖";s:3:"æ´¾";s:4:"派";s:3:"浩";s:4:"浩";s:3:"浸";s:4:"浸";s:3:"涅";s:4:"涅";s:4:"𣴞";s:4:"𣴞";s:3:"æ´´";s:4:"洴";s:3:"港";s:4:"港";s:3:"æ¹®";s:4:"湮";s:3:"ã´³";s:4:"㴳";s:3:"滇";s:4:"滇";s:4:"𣻑";s:4:"ð¯¤";s:3:"æ·¹";s:4:"淹";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"ð¯¤";s:4:"𣾎";s:4:"𣾎";s:3:"濆";s:4:"濆";s:3:"瀹";s:4:"瀹";s:3:"瀛";s:4:"瀛";s:3:"㶖";s:4:"㶖";s:3:"çŠ";s:4:"灊";s:3:"ç½";s:4:"災";s:3:"ç·";s:4:"灷";s:3:"ç‚­";s:4:"炭";s:4:"𠔥";s:4:"𠔥";s:3:"ç……";s:4:"煅";s:4:"𤉣";s:4:"ð¯¤";s:3:"熜";s:4:"熜";s:4:"𤎫";s:4:"𤎫";s:3:"爨";s:4:"爨";s:3:"ç‰";s:4:"牐";s:4:"𤘈";s:4:"𤘈";s:3:"犀";s:4:"犀";s:3:"犕";s:4:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:3:"çº";s:4:"獺";s:3:"王";s:4:"王";s:3:"㺬";s:4:"㺬";s:3:"玥";s:4:"玥";s:3:"㺸";s:4:"㺸";s:3:"瑇";s:4:"瑇";s:3:"ç‘œ";s:4:"瑜";s:3:"ç’…";s:4:"璅";s:3:"ç“Š";s:4:"瓊";s:3:"ã¼›";s:4:"㼛";s:3:"甤";s:4:"甤";s:4:"𤰶";s:4:"𤰶";s:3:"甾";s:4:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"𢆟";s:4:"𢆟";s:3:"ç˜";s:4:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"ð¥„";s:4:"𥁄";s:3:"㿼";s:4:"㿼";s:3:"䀈";s:4:"䀈";s:4:"𥃳";s:4:"ð¯¥";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:3:"眞";s:4:"眞";s:3:"真";s:4:"真";s:3:"çž‹";s:4:"瞋";s:3:"ä†";s:4:"䁆";s:3:"ä‚–";s:4:"䂖";s:4:"ð¥";s:4:"ð¯¥";s:3:"ç¡Ž";s:4:"硎";s:3:"䃣";s:4:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:3:"秫";s:4:"秫";s:3:"䄯";s:4:"䄯";s:3:"ç©Š";s:4:"穊";s:3:"ç©";s:4:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:3:"ç«®";s:4:"竮";s:3:"䈂";s:4:"䈂";s:4:"𥮫";s:4:"𥮫";s:3:"篆";s:4:"篆";s:3:"築";s:4:"築";s:3:"䈧";s:4:"䈧";s:4:"𥲀";s:4:"𥲀";s:3:"ç³’";s:4:"糒";s:3:"䊠";s:4:"䊠";s:3:"糨";s:4:"糨";s:3:"ç³£";s:4:"糣";s:3:"ç´€";s:4:"紀";s:4:"𥾆";s:4:"𥾆";s:3:"çµ£";s:4:"絣";s:3:"äŒ";s:4:"䌁";s:3:"ç·‡";s:4:"緇";s:3:"縂";s:4:"縂";s:3:"ç¹…";s:4:"繅";s:3:"䌴";s:4:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:3:"ä™";s:4:"䍙";s:4:"𦋙";s:4:"𦋙";s:3:"罺";s:4:"罺";s:4:"𦌾";s:4:"𦌾";s:3:"羕";s:4:"羕";s:3:"翺";s:4:"翺";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:3:"è ";s:4:"聠";s:4:"𦖨";s:4:"𦖨";s:3:"è°";s:4:"聰";s:4:"ð£Ÿ";s:4:"𣍟";s:3:"ä•";s:4:"ð¯¦";s:3:"育";s:4:"育";s:3:"脃";s:4:"脃";s:3:"ä‹";s:4:"䐋";s:3:"脾";s:4:"脾";s:3:"媵";s:4:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:3:"舄";s:4:"舄";s:3:"辞";s:4:"ð¯¦";s:3:"ä‘«";s:4:"䑫";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"ð¯¦";s:3:"èŠ";s:4:"芝";s:3:"劳";s:4:"劳";s:3:"花";s:4:"花";s:3:"芳";s:4:"芳";s:3:"芽";s:4:"芽";s:3:"苦";s:4:"苦";s:4:"𦬼";s:4:"𦬼";s:3:"èŒ";s:4:"茝";s:3:"è£";s:4:"荣";s:3:"莭";s:4:"莭";s:3:"茣";s:4:"茣";s:3:"莽";s:4:"ð¯¦";s:3:"è§";s:4:"菧";s:3:"è“";s:4:"荓";s:3:"èŠ";s:4:"菊";s:3:"èŒ";s:4:"菌";s:3:"èœ";s:4:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:3:"䔫";s:4:"䔫";s:3:"蓱";s:4:"蓱";s:3:"蓳";s:4:"蓳";s:3:"è”–";s:4:"蔖";s:4:"ð§Š";s:4:"𧏊";s:3:"蕤";s:4:"蕤";s:4:"𦼬";s:4:"𦼬";s:3:"ä•";s:4:"䕝";s:3:"ä•¡";s:4:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:3:"ä•«";s:4:"䕫";s:3:"è™";s:4:"虐";s:3:"虧";s:4:"虧";s:3:"虩";s:4:"虩";s:3:"èš©";s:4:"蚩";s:3:"蚈";s:4:"蚈";s:3:"蜎";s:4:"蜎";s:3:"蛢";s:4:"蛢";s:3:"蜨";s:4:"蜨";s:3:"è«";s:4:"蝫";s:3:"螆";s:4:"螆";s:3:"ä——";s:4:"䗗";s:3:"蟡";s:4:"蟡";s:3:"è ";s:4:"ð¯§";s:3:"ä—¹";s:4:"䗹";s:3:"è¡ ";s:4:"衠";s:3:"è¡£";s:4:"衣";s:4:"𧙧";s:4:"𧙧";s:3:"裗";s:4:"裗";s:3:"裞";s:4:"裞";s:3:"䘵";s:4:"䘵";s:3:"裺";s:4:"裺";s:3:"ã’»";s:4:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:3:"äš¾";s:4:"ð¯§";s:3:"䛇";s:4:"䛇";s:3:"誠";s:4:"ð¯§";s:3:"豕";s:4:"豕";s:4:"𧲨";s:4:"𧲨";s:3:"貫";s:4:"貫";s:3:"è³";s:4:"賁";s:3:"è´›";s:4:"贛";s:3:"èµ·";s:4:"起";s:4:"𧼯";s:4:"𧼯";s:4:"ð  „";s:4:"𠠄";s:3:"è·‹";s:4:"跋";s:3:"趼";s:4:"趼";s:3:"è·°";s:4:"跰";s:4:"𠣞";s:4:"ð¯§";s:3:"è»”";s:4:"軔";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:3:"é‚”";s:4:"邔";s:3:"郱";s:4:"郱";s:3:"é„‘";s:4:"鄑";s:4:"𨜮";s:4:"𨜮";s:3:"é„›";s:4:"鄛";s:3:"鈸";s:4:"鈸";s:3:"é‹—";s:4:"鋗";s:3:"鋘";s:4:"鋘";s:3:"鉼";s:4:"鉼";s:3:"é¹";s:4:"鏹";s:3:"é•";s:4:"鐕";s:4:"𨯺";s:4:"𨯺";s:3:"é–‹";s:4:"開";s:3:"䦕";s:4:"䦕";s:3:"é–·";s:4:"閷";s:4:"𨵷";s:4:"𨵷";s:3:"䧦";s:4:"䧦";s:3:"雃";s:4:"雃";s:3:"嶲";s:4:"嶲";s:3:"霣";s:4:"霣";s:4:"ð©……";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:3:"ä©®";s:4:"䩮";s:3:"䩶";s:4:"䩶";s:3:"韠";s:4:"韠";s:4:"ð©Š";s:4:"𩐊";s:3:"䪲";s:4:"䪲";s:4:"ð©’–";s:4:"𩒖";s:3:"é ©";s:4:"頩";s:4:"ð©–¶";s:4:"ð¯¨";s:3:"飢";s:4:"飢";s:3:"䬳";s:4:"䬳";s:3:"餩";s:4:"餩";s:3:"馧";s:4:"馧";s:3:"駂";s:4:"駂";s:3:"駾";s:4:"駾";s:3:"䯎";s:4:"䯎";s:4:"𩬰";s:4:"𩬰";s:3:"é±€";s:4:"鱀";s:3:"é³½";s:4:"鳽";s:3:"䳎";s:4:"ð¯¨";s:3:"ä³­";s:4:"䳭";s:3:"鵧";s:4:"ð¯¨";s:4:"𪃎";s:4:"ð¯¨";s:3:"䳸";s:4:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:3:"麻";s:4:"麻";s:3:"äµ–";s:4:"䵖";s:3:"黹";s:4:"黹";s:3:"黾";s:4:"黾";s:3:"é¼…";s:4:"鼅";s:3:"é¼";s:4:"鼏";s:3:"é¼–";s:4:"鼖";s:3:"é¼»";s:4:"鼻";s:4:"𪘀";s:4:"ð¯¨";}' );
-$utfCanonicalDecomp = unserialize( 'a:2049:{s:2:"À";s:3:"AÌ€";s:2:"Ã";s:3:"AÌ";s:2:"Â";s:3:"AÌ‚";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Ã…";s:3:"AÌŠ";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"EÌ€";s:2:"É";s:3:"EÌ";s:2:"Ê";s:3:"EÌ‚";s:2:"Ë";s:3:"Ë";s:2:"ÃŒ";s:3:"IÌ€";s:2:"Ã";s:3:"IÌ";s:2:"ÃŽ";s:3:"IÌ‚";s:2:"Ã";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ã’";s:3:"OÌ€";s:2:"Ó";s:3:"OÌ";s:2:"Ô";s:3:"OÌ‚";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"UÌ€";s:2:"Ú";s:3:"UÌ";s:2:"Û";s:3:"UÌ‚";s:2:"Ãœ";s:3:"Ü";s:2:"Ã";s:3:"YÌ";s:2:"à";s:3:"aÌ€";s:2:"á";s:3:"aÌ";s:2:"â";s:3:"aÌ‚";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"Ã¥";s:3:"aÌŠ";s:2:"ç";s:3:"ç";s:2:"è";s:3:"eÌ€";s:2:"é";s:3:"eÌ";s:2:"ê";s:3:"eÌ‚";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"iÌ€";s:2:"í";s:3:"iÌ";s:2:"î";s:3:"iÌ‚";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"oÌ€";s:2:"ó";s:3:"oÌ";s:2:"ô";s:3:"oÌ‚";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"uÌ€";s:2:"ú";s:3:"uÌ";s:2:"û";s:3:"uÌ‚";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"yÌ";s:2:"ÿ";s:3:"ÿ";s:2:"Ä€";s:3:"AÌ„";s:2:"Ä";s:3:"aÌ„";s:2:"Ä‚";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ä„";s:3:"Ą";s:2:"Ä…";s:3:"ą";s:2:"Ć";s:3:"CÌ";s:2:"ć";s:3:"cÌ";s:2:"Ĉ";s:3:"CÌ‚";s:2:"ĉ";s:3:"cÌ‚";s:2:"ÄŠ";s:3:"Ċ";s:2:"Ä‹";s:3:"ċ";s:2:"ÄŒ";s:3:"CÌŒ";s:2:"Ä";s:3:"cÌŒ";s:2:"ÄŽ";s:3:"DÌŒ";s:2:"Ä";s:3:"dÌŒ";s:2:"Ä’";s:3:"EÌ„";s:2:"Ä“";s:3:"eÌ„";s:2:"Ä”";s:3:"Ĕ";s:2:"Ä•";s:3:"ĕ";s:2:"Ä–";s:3:"Ė";s:2:"Ä—";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"Ä™";s:3:"ę";s:2:"Äš";s:3:"EÌŒ";s:2:"Ä›";s:3:"eÌŒ";s:2:"Äœ";s:3:"GÌ‚";s:2:"Ä";s:3:"gÌ‚";s:2:"Äž";s:3:"Ğ";s:2:"ÄŸ";s:3:"ğ";s:2:"Ä ";s:3:"Ġ";s:2:"Ä¡";s:3:"ġ";s:2:"Ä¢";s:3:"Ģ";s:2:"Ä£";s:3:"ģ";s:2:"Ĥ";s:3:"HÌ‚";s:2:"Ä¥";s:3:"hÌ‚";s:2:"Ĩ";s:3:"Ĩ";s:2:"Ä©";s:3:"ĩ";s:2:"Ī";s:3:"IÌ„";s:2:"Ä«";s:3:"iÌ„";s:2:"Ĭ";s:3:"Ĭ";s:2:"Ä­";s:3:"ĭ";s:2:"Ä®";s:3:"Į";s:2:"į";s:3:"į";s:2:"Ä°";s:3:"İ";s:2:"Ä´";s:3:"JÌ‚";s:2:"ĵ";s:3:"jÌ‚";s:2:"Ķ";s:3:"Ķ";s:2:"Ä·";s:3:"ķ";s:2:"Ĺ";s:3:"LÌ";s:2:"ĺ";s:3:"lÌ";s:2:"Ä»";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"LÌŒ";s:2:"ľ";s:3:"lÌŒ";s:2:"Ń";s:3:"NÌ";s:2:"Å„";s:3:"nÌ";s:2:"Å…";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"NÌŒ";s:2:"ň";s:3:"nÌŒ";s:2:"ÅŒ";s:3:"OÌ„";s:2:"Å";s:3:"oÌ„";s:2:"ÅŽ";s:3:"Ŏ";s:2:"Å";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å‘";s:3:"oÌ‹";s:2:"Å”";s:3:"RÌ";s:2:"Å•";s:3:"rÌ";s:2:"Å–";s:3:"Ŗ";s:2:"Å—";s:3:"ŗ";s:2:"Ř";s:3:"RÌŒ";s:2:"Å™";s:3:"rÌŒ";s:2:"Åš";s:3:"SÌ";s:2:"Å›";s:3:"sÌ";s:2:"Åœ";s:3:"SÌ‚";s:2:"Å";s:3:"sÌ‚";s:2:"Åž";s:3:"Ş";s:2:"ÅŸ";s:3:"ş";s:2:"Å ";s:3:"SÌŒ";s:2:"Å¡";s:3:"sÌŒ";s:2:"Å¢";s:3:"Ţ";s:2:"Å£";s:3:"ţ";s:2:"Ť";s:3:"TÌŒ";s:2:"Å¥";s:3:"tÌŒ";s:2:"Ũ";s:3:"Ũ";s:2:"Å©";s:3:"ũ";s:2:"Ū";s:3:"UÌ„";s:2:"Å«";s:3:"uÌ„";s:2:"Ŭ";s:3:"Ŭ";s:2:"Å­";s:3:"ŭ";s:2:"Å®";s:3:"UÌŠ";s:2:"ů";s:3:"uÌŠ";s:2:"Å°";s:3:"UÌ‹";s:2:"ű";s:3:"uÌ‹";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Å´";s:3:"WÌ‚";s:2:"ŵ";s:3:"wÌ‚";s:2:"Ŷ";s:3:"YÌ‚";s:2:"Å·";s:3:"yÌ‚";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"ZÌ";s:2:"ź";s:3:"zÌ";s:2:"Å»";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"ZÌŒ";s:2:"ž";s:3:"zÌŒ";s:2:"Æ ";s:3:"OÌ›";s:2:"Æ¡";s:3:"oÌ›";s:2:"Ư";s:3:"UÌ›";s:2:"Æ°";s:3:"uÌ›";s:2:"Ç";s:3:"AÌŒ";s:2:"ÇŽ";s:3:"aÌŒ";s:2:"Ç";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç‘";s:3:"OÌŒ";s:2:"Ç’";s:3:"oÌŒ";s:2:"Ç“";s:3:"UÌŒ";s:2:"Ç”";s:3:"uÌŒ";s:2:"Ç•";s:5:"Ǖ";s:2:"Ç–";s:5:"ǖ";s:2:"Ç—";s:5:"ÜÌ";s:2:"ǘ";s:5:"üÌ";s:2:"Ç™";s:5:"Ǚ";s:2:"Çš";s:5:"ǚ";s:2:"Ç›";s:5:"Ǜ";s:2:"Çœ";s:5:"ǜ";s:2:"Çž";s:5:"Ǟ";s:2:"ÇŸ";s:5:"ǟ";s:2:"Ç ";s:5:"Ǡ";s:2:"Ç¡";s:5:"ǡ";s:2:"Ç¢";s:4:"Ǣ";s:2:"Ç£";s:4:"ǣ";s:2:"Ǧ";s:3:"GÌŒ";s:2:"ǧ";s:3:"gÌŒ";s:2:"Ǩ";s:3:"KÌŒ";s:2:"Ç©";s:3:"kÌŒ";s:2:"Ǫ";s:3:"Ǫ";s:2:"Ç«";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"Ç­";s:5:"ǭ";s:2:"Ç®";s:4:"Æ·ÌŒ";s:2:"ǯ";s:4:"Ê’ÌŒ";s:2:"Ç°";s:3:"jÌŒ";s:2:"Ç´";s:3:"GÌ";s:2:"ǵ";s:3:"gÌ";s:2:"Ǹ";s:3:"NÌ€";s:2:"ǹ";s:3:"nÌ€";s:2:"Ǻ";s:5:"AÌŠÌ";s:2:"Ç»";s:5:"aÌŠÌ";s:2:"Ǽ";s:4:"ÆÌ";s:2:"ǽ";s:4:"æÌ";s:2:"Ǿ";s:4:"ØÌ";s:2:"Ç¿";s:4:"øÌ";s:2:"È€";s:3:"AÌ";s:2:"È";s:3:"aÌ";s:2:"È‚";s:3:"AÌ‘";s:2:"ȃ";s:3:"aÌ‘";s:2:"È„";s:3:"EÌ";s:2:"È…";s:3:"eÌ";s:2:"Ȇ";s:3:"EÌ‘";s:2:"ȇ";s:3:"eÌ‘";s:2:"Ȉ";s:3:"IÌ";s:2:"ȉ";s:3:"iÌ";s:2:"ÈŠ";s:3:"IÌ‘";s:2:"È‹";s:3:"iÌ‘";s:2:"ÈŒ";s:3:"OÌ";s:2:"È";s:3:"oÌ";s:2:"ÈŽ";s:3:"OÌ‘";s:2:"È";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È‘";s:3:"rÌ";s:2:"È’";s:3:"RÌ‘";s:2:"È“";s:3:"rÌ‘";s:2:"È”";s:3:"UÌ";s:2:"È•";s:3:"uÌ";s:2:"È–";s:3:"UÌ‘";s:2:"È—";s:3:"uÌ‘";s:2:"Ș";s:3:"Ș";s:2:"È™";s:3:"ș";s:2:"Èš";s:3:"Ț";s:2:"È›";s:3:"ț";s:2:"Èž";s:3:"HÌŒ";s:2:"ÈŸ";s:3:"hÌŒ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"È©";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"È«";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"È­";s:5:"ȭ";s:2:"È®";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"È°";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"YÌ„";s:2:"ȳ";s:3:"yÌ„";s:2:"Í€";s:2:"Ì€";s:2:"Í";s:2:"Ì";s:2:"̓";s:2:"Ì“";s:2:"Í„";s:4:"̈Ì";s:2:"Í´";s:2:"ʹ";s:2:";";s:1:";";s:2:"Î…";s:4:"¨Ì";s:2:"Ά";s:4:"ΑÌ";s:2:"·";s:2:"·";s:2:"Έ";s:4:"ΕÌ";s:2:"Ή";s:4:"ΗÌ";s:2:"Ί";s:4:"ΙÌ";s:2:"ÎŒ";s:4:"ΟÌ";s:2:"ÎŽ";s:4:"Î¥Ì";s:2:"Î";s:4:"ΩÌ";s:2:"Î";s:6:"ϊÌ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"αÌ";s:2:"έ";s:4:"εÌ";s:2:"ή";s:4:"ηÌ";s:2:"ί";s:4:"ιÌ";s:2:"ΰ";s:6:"ϋÌ";s:2:"ÏŠ";s:4:"ϊ";s:2:"Ï‹";s:4:"ϋ";s:2:"ÏŒ";s:4:"οÌ";s:2:"Ï";s:4:"Ï…Ì";s:2:"ÏŽ";s:4:"ωÌ";s:2:"Ï“";s:4:"Ï’Ì";s:2:"Ï”";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ð";s:4:"Ё";s:2:"Ѓ";s:4:"ГÌ";s:2:"Ї";s:4:"Ї";s:2:"ÐŒ";s:4:"КÌ";s:2:"Ð";s:4:"Ѝ";s:2:"ÐŽ";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"Ñ";s:4:"ѐ";s:2:"Ñ‘";s:4:"ё";s:2:"Ñ“";s:4:"гÌ";s:2:"Ñ—";s:4:"ї";s:2:"Ñœ";s:4:"кÌ";s:2:"Ñ";s:4:"ѝ";s:2:"Ñž";s:4:"ў";s:2:"Ѷ";s:4:"Ñ´Ì";s:2:"Ñ·";s:4:"ѵÌ";s:2:"Ó";s:4:"Ӂ";s:2:"Ó‚";s:4:"ӂ";s:2:"Ó";s:4:"Ð̆";s:2:"Ó‘";s:4:"ӑ";s:2:"Ó’";s:4:"Ð̈";s:2:"Ó“";s:4:"ӓ";s:2:"Ó–";s:4:"Ӗ";s:2:"Ó—";s:4:"ӗ";s:2:"Óš";s:4:"Ӛ";s:2:"Ó›";s:4:"ӛ";s:2:"Óœ";s:4:"Ӝ";s:2:"Ó";s:4:"ӝ";s:2:"Óž";s:4:"Ӟ";s:2:"ÓŸ";s:4:"ӟ";s:2:"Ó¢";s:4:"Ӣ";s:2:"Ó£";s:4:"ӣ";s:2:"Ó¤";s:4:"Ӥ";s:2:"Ó¥";s:4:"ӥ";s:2:"Ó¦";s:4:"Ӧ";s:2:"Ó§";s:4:"ӧ";s:2:"Óª";s:4:"Ӫ";s:2:"Ó«";s:4:"ӫ";s:2:"Ó¬";s:4:"Ӭ";s:2:"Ó­";s:4:"Ñ̈";s:2:"Ó®";s:4:"Ӯ";s:2:"Ó¯";s:4:"ӯ";s:2:"Ó°";s:4:"Ӱ";s:2:"Ó±";s:4:"ӱ";s:2:"Ó²";s:4:"Ӳ";s:2:"Ó³";s:4:"ӳ";s:2:"Ó´";s:4:"Ӵ";s:2:"Óµ";s:4:"ӵ";s:2:"Ó¸";s:4:"Ӹ";s:2:"Ó¹";s:4:"ӹ";s:2:"Ø¢";s:4:"آ";s:2:"Ø£";s:4:"أ";s:2:"ؤ";s:4:"ÙˆÙ”";s:2:"Ø¥";s:4:"إ";s:2:"ئ";s:4:"ÙŠÙ”";s:2:"Û€";s:4:"Û•Ù”";s:2:"Û‚";s:4:"ÛÙ”";s:2:"Û“";s:4:"Û’Ù”";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"à¥";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"à§";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"à©™";s:6:"ਖ਼";s:3:"à©š";s:6:"ਗ਼";s:3:"à©›";s:6:"ਜ਼";s:3:"à©ž";s:6:"ਫ਼";s:3:"à­ˆ";s:6:"ୈ";s:3:"à­‹";s:6:"ୋ";s:3:"à­Œ";s:6:"ୌ";s:3:"à­œ";s:6:"ଡ଼";s:3:"à­";s:6:"ଢ଼";s:3:"à®”";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"à³€";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"à·š";s:6:"ේ";s:3:"à·œ";s:6:"à·™à·";s:3:"à·";s:9:"à·™à·à·Š";s:3:"à·ž";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"à½";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"à¾";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"à¾";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"à¾à¾µ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"á¬á¬µ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"á­€";s:6:"ᭀ";s:3:"á­";s:6:"ᭁ";s:3:"á­ƒ";s:6:"ᭃ";s:3:"Ḁ";s:3:"AÌ¥";s:3:"á¸";s:3:"aÌ¥";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"BÌ£";s:3:"ḅ";s:3:"bÌ£";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"ÇÌ";s:3:"ḉ";s:5:"çÌ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"DÌ£";s:3:"á¸";s:3:"dÌ£";s:3:"Ḏ";s:3:"Ḏ";s:3:"á¸";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"DÌ­";s:3:"ḓ";s:3:"dÌ­";s:3:"Ḕ";s:5:"EÌ„Ì€";s:3:"ḕ";s:5:"eÌ„Ì€";s:3:"Ḗ";s:5:"EÌ„Ì";s:3:"ḗ";s:5:"eÌ„Ì";s:3:"Ḙ";s:3:"EÌ­";s:3:"ḙ";s:3:"eÌ­";s:3:"Ḛ";s:3:"EÌ°";s:3:"ḛ";s:3:"eÌ°";s:3:"Ḝ";s:5:"Ḝ";s:3:"á¸";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"GÌ„";s:3:"ḡ";s:3:"gÌ„";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"HÌ£";s:3:"ḥ";s:3:"hÌ£";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"HÌ®";s:3:"ḫ";s:3:"hÌ®";s:3:"Ḭ";s:3:"IÌ°";s:3:"ḭ";s:3:"iÌ°";s:3:"Ḯ";s:5:"ÏÌ";s:3:"ḯ";s:5:"ïÌ";s:3:"Ḱ";s:3:"KÌ";s:3:"ḱ";s:3:"kÌ";s:3:"Ḳ";s:3:"KÌ£";s:3:"ḳ";s:3:"kÌ£";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"LÌ£";s:3:"ḷ";s:3:"lÌ£";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"LÌ­";s:3:"ḽ";s:3:"lÌ­";s:3:"Ḿ";s:3:"MÌ";s:3:"ḿ";s:3:"mÌ";s:3:"á¹€";s:3:"Ṁ";s:3:"á¹";s:3:"ṁ";s:3:"Ṃ";s:3:"MÌ£";s:3:"ṃ";s:3:"mÌ£";s:3:"Ṅ";s:3:"Ṅ";s:3:"á¹…";s:3:"ṅ";s:3:"Ṇ";s:3:"NÌ£";s:3:"ṇ";s:3:"nÌ£";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"NÌ­";s:3:"ṋ";s:3:"nÌ­";s:3:"Ṍ";s:5:"ÕÌ";s:3:"á¹";s:5:"õÌ";s:3:"Ṏ";s:5:"Ṏ";s:3:"á¹";s:5:"ṏ";s:3:"á¹";s:5:"OÌ„Ì€";s:3:"ṑ";s:5:"oÌ„Ì€";s:3:"á¹’";s:5:"OÌ„Ì";s:3:"ṓ";s:5:"oÌ„Ì";s:3:"á¹”";s:3:"PÌ";s:3:"ṕ";s:3:"pÌ";s:3:"á¹–";s:3:"Ṗ";s:3:"á¹—";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"á¹™";s:3:"ṙ";s:3:"Ṛ";s:3:"RÌ£";s:3:"á¹›";s:3:"rÌ£";s:3:"Ṝ";s:5:"Ṝ";s:3:"á¹";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"á¹ ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"á¹¢";s:3:"SÌ£";s:3:"á¹£";s:3:"sÌ£";s:3:"Ṥ";s:5:"SÌ̇";s:3:"á¹¥";s:5:"sÌ̇";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"TÌ£";s:3:"á¹­";s:3:"tÌ£";s:3:"á¹®";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"á¹°";s:3:"TÌ­";s:3:"á¹±";s:3:"tÌ­";s:3:"á¹²";s:3:"Ṳ";s:3:"á¹³";s:3:"ṳ";s:3:"á¹´";s:3:"UÌ°";s:3:"á¹µ";s:3:"uÌ°";s:3:"Ṷ";s:3:"UÌ­";s:3:"á¹·";s:3:"uÌ­";s:3:"Ṹ";s:5:"ŨÌ";s:3:"á¹¹";s:5:"ũÌ";s:3:"Ṻ";s:5:"Ṻ";s:3:"á¹»";s:5:"ṻ";s:3:"á¹¼";s:3:"Ṽ";s:3:"á¹½";s:3:"ṽ";s:3:"á¹¾";s:3:"VÌ£";s:3:"ṿ";s:3:"vÌ£";s:3:"Ẁ";s:3:"WÌ€";s:3:"áº";s:3:"wÌ€";s:3:"Ẃ";s:3:"WÌ";s:3:"ẃ";s:3:"wÌ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"WÌ£";s:3:"ẉ";s:3:"wÌ£";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"áº";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"áº";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"ẑ";s:3:"zÌ‚";s:3:"Ẓ";s:3:"ZÌ£";s:3:"ẓ";s:3:"zÌ£";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"wÌŠ";s:3:"ẙ";s:3:"yÌŠ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"AÌ£";s:3:"ạ";s:3:"aÌ£";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"AÌ‚Ì";s:3:"ấ";s:5:"aÌ‚Ì";s:3:"Ầ";s:5:"AÌ‚Ì€";s:3:"ầ";s:5:"aÌ‚Ì€";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"ĂÌ";s:3:"ắ";s:5:"ăÌ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"EÌ£";s:3:"ẹ";s:3:"eÌ£";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"EÌ‚Ì";s:3:"ế";s:5:"eÌ‚Ì";s:3:"Ề";s:5:"EÌ‚Ì€";s:3:"á»";s:5:"eÌ‚Ì€";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"á»…";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"IÌ£";s:3:"ị";s:3:"iÌ£";s:3:"Ọ";s:3:"OÌ£";s:3:"á»";s:3:"oÌ£";s:3:"Ỏ";s:3:"Ỏ";s:3:"á»";s:3:"ỏ";s:3:"á»";s:5:"OÌ‚Ì";s:3:"ố";s:5:"oÌ‚Ì";s:3:"á»’";s:5:"OÌ‚Ì€";s:3:"ồ";s:5:"oÌ‚Ì€";s:3:"á»”";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"á»–";s:5:"Ỗ";s:3:"á»—";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"á»™";s:5:"ộ";s:3:"Ớ";s:5:"OÌ›Ì";s:3:"á»›";s:5:"oÌ›Ì";s:3:"Ờ";s:5:"Ờ";s:3:"á»";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"á» ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"UÌ£";s:3:"ụ";s:3:"uÌ£";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"UÌ›Ì";s:3:"ứ";s:5:"uÌ›Ì";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"á»­";s:5:"ử";s:3:"á»®";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"á»°";s:5:"Ự";s:3:"á»±";s:5:"ự";s:3:"Ỳ";s:3:"YÌ€";s:3:"ỳ";s:3:"yÌ€";s:3:"á»´";s:3:"YÌ£";s:3:"ỵ";s:3:"yÌ£";s:3:"Ỷ";s:3:"Ỷ";s:3:"á»·";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"á¼€";s:4:"ἀ";s:3:"á¼";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἀÌ";s:3:"á¼…";s:6:"ἁÌ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"ἈÌ";s:3:"á¼";s:6:"ἉÌ";s:3:"Ἆ";s:6:"Ἆ";s:3:"á¼";s:6:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"á¼’";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"á¼”";s:6:"ἐÌ";s:3:"ἕ";s:6:"ἑÌ";s:3:"Ἐ";s:4:"Ἐ";s:3:"á¼™";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"á¼›";s:6:"Ἓ";s:3:"Ἔ";s:6:"ἘÌ";s:3:"á¼";s:6:"ἙÌ";s:3:"á¼ ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"á¼¢";s:6:"ἢ";s:3:"á¼£";s:6:"ἣ";s:3:"ἤ";s:6:"ἠÌ";s:3:"á¼¥";s:6:"ἡÌ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"ἨÌ";s:3:"á¼­";s:6:"ἩÌ";s:3:"á¼®";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"á¼°";s:4:"ἰ";s:3:"á¼±";s:4:"ἱ";s:3:"á¼²";s:6:"ἲ";s:3:"á¼³";s:6:"ἳ";s:3:"á¼´";s:6:"ἰÌ";s:3:"á¼µ";s:6:"ἱÌ";s:3:"ἶ";s:6:"ἶ";s:3:"á¼·";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"á¼¹";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"á¼»";s:6:"Ἳ";s:3:"á¼¼";s:6:"ἸÌ";s:3:"á¼½";s:6:"ἹÌ";s:3:"á¼¾";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"á½€";s:4:"ὀ";s:3:"á½";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὀÌ";s:3:"á½…";s:6:"ὁÌ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"ὈÌ";s:3:"á½";s:6:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"ὑ";s:4:"Ï…Ì”";s:3:"á½’";s:6:"Ï…Ì“Ì€";s:3:"ὓ";s:6:"ὓ";s:3:"á½”";s:6:"Ï…Ì“Ì";s:3:"ὕ";s:6:"Ï…Ì”Ì";s:3:"á½–";s:6:"Ï…Ì“Í‚";s:3:"á½—";s:6:"ὗ";s:3:"á½™";s:4:"Ὑ";s:3:"á½›";s:6:"Ὓ";s:3:"á½";s:6:"ὙÌ";s:3:"Ὗ";s:6:"Ὗ";s:3:"á½ ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"á½¢";s:6:"ὢ";s:3:"á½£";s:6:"ὣ";s:3:"ὤ";s:6:"ὠÌ";s:3:"á½¥";s:6:"ὡÌ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"ὨÌ";s:3:"á½­";s:6:"ὩÌ";s:3:"á½®";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"á½°";s:4:"ὰ";s:3:"á½±";s:4:"αÌ";s:3:"á½²";s:4:"ὲ";s:3:"á½³";s:4:"εÌ";s:3:"á½´";s:4:"ὴ";s:3:"á½µ";s:4:"ηÌ";s:3:"ὶ";s:4:"ὶ";s:3:"á½·";s:4:"ιÌ";s:3:"ὸ";s:4:"ὸ";s:3:"á½¹";s:4:"οÌ";s:3:"ὺ";s:4:"Ï…Ì€";s:3:"á½»";s:4:"Ï…Ì";s:3:"á½¼";s:4:"ὼ";s:3:"á½½";s:4:"ωÌ";s:3:"á¾€";s:6:"ᾀ";s:3:"á¾";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ἀÌÍ…";s:3:"á¾…";s:8:"ἁÌÍ…";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ἈÌÍ…";s:3:"á¾";s:8:"ἉÌÍ…";s:3:"ᾎ";s:8:"ᾎ";s:3:"á¾";s:8:"ᾏ";s:3:"á¾";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"á¾’";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"á¾”";s:8:"ἠÌÍ…";s:3:"ᾕ";s:8:"ἡÌÍ…";s:3:"á¾–";s:8:"ᾖ";s:3:"á¾—";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"á¾™";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"á¾›";s:8:"ᾛ";s:3:"ᾜ";s:8:"ἨÌÍ…";s:3:"á¾";s:8:"ἩÌÍ…";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"á¾ ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"á¾¢";s:8:"ᾢ";s:3:"á¾£";s:8:"ᾣ";s:3:"ᾤ";s:8:"ὠÌÍ…";s:3:"á¾¥";s:8:"ὡÌÍ…";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ὨÌÍ…";s:3:"á¾­";s:8:"ὩÌÍ…";s:3:"á¾®";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"á¾°";s:4:"ᾰ";s:3:"á¾±";s:4:"ᾱ";s:3:"á¾²";s:6:"ᾲ";s:3:"á¾³";s:4:"ᾳ";s:3:"á¾´";s:6:"αÌÍ…";s:3:"ᾶ";s:4:"ᾶ";s:3:"á¾·";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"á¾¹";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"á¾»";s:4:"ΑÌ";s:3:"á¾¼";s:4:"ᾼ";s:3:"á¾¾";s:2:"ι";s:3:"á¿";s:4:"῁";s:3:"á¿‚";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"á¿„";s:6:"ηÌÍ…";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"ΕÌ";s:3:"á¿Š";s:4:"Ὴ";s:3:"á¿‹";s:4:"ΗÌ";s:3:"á¿Œ";s:4:"ῌ";s:3:"á¿";s:5:"῍";s:3:"á¿Ž";s:5:"᾿Ì";s:3:"á¿";s:5:"῏";s:3:"á¿";s:4:"ῐ";s:3:"á¿‘";s:4:"ῑ";s:3:"á¿’";s:6:"ῒ";s:3:"á¿“";s:6:"ϊÌ";s:3:"á¿–";s:4:"ῖ";s:3:"á¿—";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"á¿™";s:4:"Ῑ";s:3:"á¿š";s:4:"Ὶ";s:3:"á¿›";s:4:"ΙÌ";s:3:"á¿";s:5:"῝";s:3:"á¿ž";s:5:"῾Ì";s:3:"á¿Ÿ";s:5:"῟";s:3:"á¿ ";s:4:"ῠ";s:3:"á¿¡";s:4:"Ï…Ì„";s:3:"á¿¢";s:6:"ῢ";s:3:"á¿£";s:6:"ϋÌ";s:3:"ῤ";s:4:"ÏÌ“";s:3:"á¿¥";s:4:"ÏÌ”";s:3:"ῦ";s:4:"Ï…Í‚";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"á¿©";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"á¿«";s:4:"Î¥Ì";s:3:"Ῥ";s:4:"Ῥ";s:3:"á¿­";s:4:"῭";s:3:"á¿®";s:4:"¨Ì";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"á¿´";s:6:"ωÌÍ…";s:3:"ῶ";s:4:"ῶ";s:3:"á¿·";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"ΟÌ";s:3:"Ὼ";s:4:"Ὼ";s:3:"á¿»";s:4:"ΩÌ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:"â€";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"â„«";s:3:"AÌŠ";s:3:"↚";s:5:"â†Ì¸";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"â‡";s:5:"â‡Ì¸";s:3:"⇎";s:5:"⇎";s:3:"â‡";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"â‰";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"â‰Ì¸";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"âŠ";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"â‹ ";s:5:"⋠";s:3:"â‹¡";s:5:"⋡";s:3:"â‹¢";s:5:"⋢";s:3:"â‹£";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"â‹«";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"â‹­";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"â«œ";s:5:"â«Ì¸";s:3:"ãŒ";s:6:"ã‹ã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ãã‚™";s:3:"ã’";s:6:"ã‘ã‚™";s:3:"ã”";s:6:"ã“ã‚™";s:3:"ã–";s:6:"ã•ã‚™";s:3:"ã˜";s:6:"ã—ã‚™";s:3:"ãš";s:6:"ã™ã‚™";s:3:"ãœ";s:6:"ã›ã‚™";s:3:"ãž";s:6:"ãã‚™";s:3:"ã ";s:6:"ãŸã‚™";s:3:"ã¢";s:6:"ã¡ã‚™";s:3:"ã¥";s:6:"ã¤ã‚™";s:3:"ã§";s:6:"ã¦ã‚™";s:3:"ã©";s:6:"ã¨ã‚™";s:3:"ã°";s:6:"ã¯ã‚™";s:3:"ã±";s:6:"ã¯ã‚š";s:3:"ã³";s:6:"ã²ã‚™";s:3:"ã´";s:6:"ã²ã‚š";s:3:"ã¶";s:6:"ãµã‚™";s:3:"ã·";s:6:"ãµã‚š";s:3:"ã¹";s:6:"ã¸ã‚™";s:3:"ãº";s:6:"ã¸ã‚š";s:3:"ã¼";s:6:"ã»ã‚™";s:3:"ã½";s:6:"ã»ã‚š";s:3:"ã‚”";s:6:"ã†ã‚™";s:3:"ã‚ž";s:6:"ã‚ã‚™";s:3:"ガ";s:6:"ã‚«ã‚™";s:3:"ã‚®";s:6:"ã‚­ã‚™";s:3:"ã‚°";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ã‚´";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ã‚·ã‚™";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ã‚¿ã‚™";s:3:"ヂ";s:6:"ãƒã‚™";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"ãƒ";s:6:"ãƒã‚™";s:3:"パ";s:6:"ãƒã‚š";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ãƒ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"ï¤";s:3:"æ›´";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"å¥";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"å–‡";s:3:"奈";s:3:"奈";s:3:"ï¤";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"ï¤";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"é‚";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"æ´›";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"çž";s:3:"落";s:3:"è½";s:3:"酪";s:3:"é…ª";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"åµ";s:3:"ï¤";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"åµ";s:3:"濫";s:3:"æ¿«";s:3:"藍";s:3:"è—";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"è Ÿ";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"å‹ž";s:3:"擄";s:3:"æ“„";s:3:"櫓";s:3:"æ«“";s:3:"爐";s:3:"çˆ";s:3:"盧";s:3:"盧";s:3:"老";s:3:"è€";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"è·¯";s:3:"露";s:3:"露";s:3:"魯";s:3:"é­¯";s:3:"鷺";s:3:"é·º";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"è‰";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"ï¥";s:3:"è«–";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"ç± ";s:3:"聾";s:3:"è¾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"é›·";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"å±¢";s:3:"樓";s:3:"樓";s:3:"ï¥";s:3:"æ·š";s:3:"漏";s:3:"æ¼";s:3:"ï¥";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"å‹’";s:3:"肋";s:3:"è‚‹";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"è±";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"æ‹";s:3:"樂";s:3:"樂";s:3:"ï¥";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"ç•°";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"ä¸";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"ç´¢";s:3:"參";s:3:"åƒ";s:3:"塞";s:3:"å¡ž";s:3:"省";s:3:"çœ";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"è¾°";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"è‹¥";s:3:"掠";s:3:"掠";s:3:"略";s:3:"ç•¥";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"å…©";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"æ¢";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"è«’";s:3:"量";s:3:"é‡";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"å‘‚";s:3:"ï¦";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"æ—…";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"é–­";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"æ­·";s:3:"ï¦";s:3:"è½¢";s:3:"年";s:3:"å¹´";s:3:"ï¦";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"撚";s:3:"æ’š";s:3:"漣";s:3:"æ¼£";s:3:"煉";s:3:"ç…‰";s:3:"璉";s:3:"ç’‰";s:3:"秊";s:3:"秊";s:3:"練";s:3:"ç·´";s:3:"聯";s:3:"è¯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"è“®";s:3:"連";s:3:"連";s:3:"鍊";s:3:"éŠ";s:3:"列";s:3:"列";s:3:"ï¦";s:3:"劣";s:3:"咽";s:3:"å’½";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"æ»";s:3:"殮";s:3:"æ®®";s:3:"簾";s:3:"ç°¾";s:3:"獵";s:3:"çµ";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"ç‘©";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"è†";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"éˆ";s:3:"領";s:3:"é ˜";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"å°¿";s:3:"料";s:3:"æ–™";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"ï§";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"é¼";s:3:"龍";s:3:"é¾";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"æ»";s:3:"柳";s:3:"柳";s:3:"流";s:3:"æµ";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"ç‰";s:3:"ï§";s:3:"ç•™";s:3:"硫";s:3:"ç¡«";s:3:"ï§";s:3:"ç´";s:3:"ï§";s:3:"é¡ž";s:3:"六";s:3:"å…­";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"å´™";s:3:"淪";s:3:"æ·ª";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"æ…„";s:3:"栗";s:3:"æ —";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"ï§";s:3:"利";s:3:"吏";s:3:"å";s:3:"履";s:3:"å±¥";s:3:"易";s:3:"易";s:3:"李";s:3:"æŽ";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"æ³¥";s:3:"理";s:3:"ç†";s:3:"痢";s:3:"ç—¢";s:3:"罹";s:3:"ç½¹";s:3:"裏";s:3:"è£";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"å";s:3:"燐";s:3:"ç‡";s:3:"璘";s:3:"ç’˜";s:3:"藺";s:3:"è—º";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"é±—";s:3:"麟";s:3:"麟";s:3:"林";s:3:"æž—";s:3:"淋";s:3:"æ·‹";s:3:"臨";s:3:"臨";s:3:"立";s:3:"ç«‹";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"ç²’";s:3:"狀";s:3:"ç‹€";s:3:"炙";s:3:"ç‚™";s:3:"識";s:3:"è­˜";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"ï¨";s:3:"度";s:3:"拓";s:3:"æ‹“";s:3:"糖";s:3:"ç³–";s:3:"宅";s:3:"å®…";s:3:"洞";s:3:"æ´ž";s:3:"暴";s:3:"æš´";s:3:"輻";s:3:"è¼»";s:3:"行";s:3:"è¡Œ";s:3:"降";s:3:"é™";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"å…€";s:3:"ï¨";s:3:"å—€";s:3:"ï¨";s:3:"å¡š";s:3:"晴";s:3:"æ™´";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"ç¦";s:3:"靖";s:3:"é–";s:3:"ï¨";s:3:"ç²¾";s:3:"羽";s:3:"ç¾½";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"ä¾®";s:3:"僧";s:3:"僧";s:3:"免";s:3:"å…";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"å‘";s:3:"喝";s:3:"å–";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"å¡€";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"å±®";s:3:"悔";s:3:"æ‚”";s:3:"慨";s:3:"æ…¨";s:3:"憎";s:3:"憎";s:3:"ï©€";s:3:"懲";s:3:"ï©";s:3:"æ•";s:3:"ï©‚";s:3:"æ—¢";s:3:"暑";s:3:"æš‘";s:3:"ï©„";s:3:"梅";s:3:"ï©…";s:3:"æµ·";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"æ¼¢";s:3:"煮";s:3:"ç…®";s:3:"爫";s:3:"爫";s:3:"ï©Š";s:3:"ç¢";s:3:"ï©‹";s:3:"碑";s:3:"ï©Œ";s:3:"社";s:3:"ï©";s:3:"祉";s:3:"ï©Ž";s:3:"祈";s:3:"ï©";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:3:"ï©‘";s:3:"ç¥";s:3:"ï©’";s:3:"ç¦";s:3:"ï©“";s:3:"禎";s:3:"ï©”";s:3:"ç©€";s:3:"ï©•";s:3:"çª";s:3:"ï©–";s:3:"節";s:3:"ï©—";s:3:"ç·´";s:3:"縉";s:3:"縉";s:3:"ï©™";s:3:"ç¹";s:3:"ï©š";s:3:"ç½²";s:3:"ï©›";s:3:"者";s:3:"ï©œ";s:3:"臭";s:3:"ï©";s:3:"艹";s:3:"ï©ž";s:3:"艹";s:3:"ï©Ÿ";s:3:"è‘—";s:3:"ï© ";s:3:"è¤";s:3:"ï©¡";s:3:"視";s:3:"ï©¢";s:3:"è¬";s:3:"ï©£";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"ï©¥";s:3:"è´ˆ";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"ï©©";s:3:"響";s:3:"頻";s:3:"é »";s:3:"ï©«";s:3:"æµ";s:3:"𤋮";s:4:"𤋮";s:3:"ï©­";s:3:"舘";s:3:"ï©°";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"å…¨";s:3:"侀";s:3:"ä¾€";s:3:"ï©´";s:3:"å……";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"ï©·";s:3:"勺";s:3:"喝";s:3:"å–";s:3:"啕";s:3:"å••";s:3:"喙";s:3:"å–™";s:3:"ï©»";s:3:"å—¢";s:3:"塚";s:3:"å¡š";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"ï©¿";s:3:"奔";s:3:"婢";s:3:"å©¢";s:3:"ïª";s:3:"嬨";s:3:"廒";s:3:"å»’";s:3:"廙";s:3:"å»™";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"å¾­";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"æ…Ž";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"æ… ";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"ïª";s:3:"æ„";s:3:"搜";s:3:"æœ";s:3:"ïª";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"晴";s:3:"æ™´";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"æ–";s:3:"歹";s:3:"æ­¹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"æµ";s:3:"滛";s:3:"æ»›";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"æ¼¢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"ç…®";s:3:"ïª";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"ç”»";s:3:"瘝";s:3:"ç˜";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"ç››";s:3:"直";s:3:"ç›´";s:3:"睊";s:3:"çŠ";s:3:"着";s:3:"ç€";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"ç±»";s:3:"絛";s:3:"çµ›";s:3:"練";s:3:"ç·´";s:3:"缾";s:3:"ç¼¾";s:3:"者";s:3:"者";s:3:"荒";s:3:"è’";s:3:"華";s:3:"è¯";s:3:"蝹";s:3:"è¹";s:3:"襁";s:3:"è¥";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"è«‹";s:3:"謁";s:3:"è¬";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"è«­";s:3:"謹";s:3:"謹";s:3:"ï«€";s:3:"變";s:3:"ï«";s:3:"è´ˆ";s:3:"ï«‚";s:3:"輸";s:3:"遲";s:3:"é²";s:3:"ï«„";s:3:"醙";s:3:"ï«…";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"é–";s:3:"韛";s:3:"韛";s:3:"ï«Š";s:3:"響";s:3:"ï«‹";s:3:"é ‹";s:3:"ï«Œ";s:3:"é »";s:3:"ï«";s:3:"鬒";s:3:"ï«Ž";s:3:"龜";s:3:"ï«";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«‘";s:4:"ð£•";s:3:"ï«’";s:3:"ã®";s:3:"ï«“";s:3:"䀘";s:3:"ï«”";s:3:"䀹";s:3:"ï«•";s:4:"𥉉";s:3:"ï«–";s:4:"ð¥³";s:3:"ï«—";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"ï«™";s:3:"龎";s:3:"ï¬";s:4:"×™Ö´";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"ש×";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּ×";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"×Ö·";s:3:"אָ";s:4:"×Ö¸";s:3:"אּ";s:4:"×Ö¼";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"×’Ö¼";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"×”Ö¼";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"×–Ö¼";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"×™Ö¼";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"×›Ö¼";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"ï­€";s:4:"× Ö¼";s:3:"ï­";s:4:"סּ";s:3:"ï­ƒ";s:4:"×£Ö¼";s:3:"ï­„";s:4:"פּ";s:3:"ï­†";s:4:"צּ";s:3:"ï­‡";s:4:"קּ";s:3:"ï­ˆ";s:4:"רּ";s:3:"ï­‰";s:4:"שּ";s:3:"ï­Š";s:4:"תּ";s:3:"ï­‹";s:4:"וֹ";s:3:"ï­Œ";s:4:"בֿ";s:3:"ï­";s:4:"×›Ö¿";s:3:"ï­Ž";s:4:"פֿ";s:4:"ð‘‚š";s:8:"𑂚";s:4:"ð‘‚œ";s:8:"𑂜";s:4:"ð‘‚«";s:8:"𑂫";s:4:"ð…ž";s:8:"ð…—ð…¥";s:4:"ð…Ÿ";s:8:"ð…˜ð…¥";s:4:"ð… ";s:12:"ð…˜ð…¥ð…®";s:4:"ð…¡";s:12:"ð…˜ð…¥ð…¯";s:4:"ð…¢";s:12:"ð…˜ð…¥ð…°";s:4:"ð…£";s:12:"ð…˜ð…¥ð…±";s:4:"ð…¤";s:12:"ð…˜ð…¥ð…²";s:4:"ð†»";s:8:"ð†¹ð…¥";s:4:"ð†¼";s:8:"ð†ºð…¥";s:4:"ð†½";s:12:"ð†¹ð…¥ð…®";s:4:"ð†¾";s:12:"ð†ºð…¥ð…®";s:4:"ð†¿";s:12:"ð†¹ð…¥ð…¯";s:4:"ð‡€";s:12:"ð†ºð…¥ð…¯";s:4:"丽";s:3:"丽";s:4:"ð¯ ";s:3:"丸";s:4:"乁";s:3:"ä¹";s:4:"𠄢";s:4:"ð „¢";s:4:"你";s:3:"ä½ ";s:4:"侮";s:3:"ä¾®";s:4:"侻";s:3:"ä¾»";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"åº";s:4:"備";s:3:"å‚™";s:4:"僧";s:3:"僧";s:4:"像";s:3:"åƒ";s:4:"㒞";s:3:"ã’ž";s:4:"ð¯ ";s:4:"𠘺";s:4:"免";s:3:"å…";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"具";s:3:"å…·";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"ã’¹";s:4:"內";s:3:"å…§";s:4:"再";s:3:"å†";s:4:"𠕋";s:4:"ð •‹";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"ð¯ ";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"ã“Ÿ";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"å‰";s:4:"卑";s:3:"å‘";s:4:"博";s:3:"åš";s:4:"即";s:3:"å³";s:4:"卽";s:3:"å½";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"ç°";s:4:"及";s:3:"åŠ";s:4:"叟";s:3:"åŸ";s:4:"𠭣";s:4:"ð ­£";s:4:"叫";s:3:"å«";s:4:"叱";s:3:"å±";s:4:"吆";s:3:"å†";s:4:"咞";s:3:"å’ž";s:4:"吸";s:3:"å¸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"å’¢";s:4:"ð¯¡";s:3:"哶";s:4:"唐";s:3:"å”";s:4:"啓";s:3:"å•“";s:4:"啣";s:3:"å•£";s:4:"善";s:3:"å–„";s:4:"善";s:3:"å–„";s:4:"喙";s:3:"å–™";s:4:"喫";s:3:"å–«";s:4:"喳";s:3:"å–³";s:4:"嗂";s:3:"å—‚";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"ð¯¡";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"ð¯¡";s:3:"å™´";s:4:"ð¯¡";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"å ";s:4:"型";s:3:"åž‹";s:4:"堲";s:3:"å ²";s:4:"報";s:3:"å ±";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"ð¯¡";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"ã›®";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"å°†";s:4:"当";s:3:"当";s:4:"尢";s:3:"å°¢";s:4:"㞁";s:3:"ãž";s:4:"屠";s:3:"å± ";s:4:"屮";s:3:"å±®";s:4:"峀";s:3:"å³€";s:4:"岍";s:3:"å²";s:4:"𡷤";s:4:"ð¡·¤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"ð¡·¦";s:4:"嵮";s:3:"åµ®";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"åµ¼";s:4:"ð¯¢";s:3:"å·¡";s:4:"巢";s:3:"å·¢";s:4:"㠯";s:3:"ã ¯";s:4:"巽";s:3:"å·½";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"ã¡¢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"ð¯¢";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"èˆ";s:4:"弢";s:3:"å¼¢";s:4:"弢";s:3:"å¼¢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"å½¢";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"ð¯¢";s:3:"å¿";s:4:"志";s:3:"å¿—";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"æ‚";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"æ‚”";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"æ…ˆ";s:4:"慌";s:3:"æ…Œ";s:4:"慎";s:3:"æ…Ž";s:4:"慌";s:3:"æ…Œ";s:4:"慺";s:3:"æ…º";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"æˆ";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"æ‰";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"æ‹”";s:4:"捐";s:3:"æ";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"æ¨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"æ¤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"æ¢";s:4:"揅";s:3:"æ…";s:4:"ð¯£";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"æ‘©";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"æ’";s:4:"摷";s:3:"æ‘·";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"æ•";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"æ—£";s:4:"書";s:3:"書";s:4:"ð¯£";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"ð¯£";s:3:"æš‘";s:4:"ð¯£";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"æšœ";s:4:"肭";s:3:"è‚­";s:4:"䏙";s:3:"ä™";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"æž";s:4:"杓";s:3:"æ“";s:4:"ð¯£";s:4:"ð£ƒ";s:4:"㭉";s:3:"ã­‰";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"æž…";s:4:"桒";s:3:"æ¡’";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"æ Ÿ";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"ã®";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"æ«›";s:4:"㰘";s:3:"ã°˜";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"æ­”";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"æ­²";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"æ®»";s:4:"𣪍";s:4:"ð£ª";s:4:"𡴋";s:4:"ð¡´‹";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"æ³";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"æ´–";s:4:"派";s:3:"æ´¾";s:4:"ð¯¤";s:3:"æµ·";s:4:"流";s:3:"æµ";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"æ´´";s:4:"港";s:3:"港";s:4:"湮";s:3:"æ¹®";s:4:"㴳";s:3:"ã´³";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"ð¯¤";s:4:"𣻑";s:4:"淹";s:3:"æ·¹";s:4:"ð¯¤";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"çŠ";s:4:"災";s:3:"ç½";s:4:"灷";s:3:"ç·";s:4:"炭";s:3:"ç‚­";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"ç……";s:4:"ð¯¤";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"ç‰";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"çº";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"ç‘œ";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"ç’…";s:4:"瓊";s:3:"ç“Š";s:4:"㼛";s:3:"ã¼›";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"ç•°";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"ç˜";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"ð¥„";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"ç›´";s:4:"ð¯¥";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"çŠ";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"çž‹";s:4:"䁆";s:3:"ä†";s:4:"䂖";s:3:"ä‚–";s:4:"ð¯¥";s:4:"ð¥";s:4:"硎";s:3:"ç¡Ž";s:4:"ð¯¥";s:3:"碌";s:4:"ð¯¥";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"ç¦";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"ç©€";s:4:"穊";s:3:"ç©Š";s:4:"穏";s:3:"ç©";s:4:"𥥼";s:4:"𥥼";s:4:"ð¯¥";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"ç«®";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"ç³’";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"ç³£";s:4:"紀";s:3:"ç´€";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"çµ£";s:4:"䌁";s:3:"äŒ";s:4:"緇";s:3:"ç·‡";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"ç¹…";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"ä™";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"è ";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"è°";s:4:"𣍟";s:4:"ð£Ÿ";s:4:"ð¯¦";s:3:"ä•";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"ä‹";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"èˆ";s:4:"舄";s:3:"舄";s:4:"ð¯¦";s:3:"辞";s:4:"䑫";s:3:"ä‘«";s:4:"ð¯¦";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"芝";s:3:"èŠ";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"è‹¥";s:4:"茝";s:3:"èŒ";s:4:"荣";s:3:"è£";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"ð¯¦";s:3:"莽";s:4:"菧";s:3:"è§";s:4:"著";s:3:"è‘—";s:4:"荓";s:3:"è“";s:4:"菊";s:3:"èŠ";s:4:"菌";s:3:"èŒ";s:4:"菜";s:3:"èœ";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"è”–";s:4:"𧏊";s:4:"ð§Š";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"ä•";s:4:"䕡";s:3:"ä•¡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"ä•«";s:4:"虐";s:3:"è™";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"èš©";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"è¹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"è«";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"ä——";s:4:"蟡";s:3:"蟡";s:4:"ð¯§";s:3:"è ";s:4:"䗹";s:3:"ä—¹";s:4:"衠";s:3:"è¡ ";s:4:"衣";s:3:"è¡£";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"ã’»";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"ð¯§";s:3:"äš¾";s:4:"䛇";s:3:"䛇";s:4:"ð¯§";s:3:"誠";s:4:"ð¯§";s:3:"è«­";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"è³";s:4:"贛";s:3:"è´›";s:4:"起";s:3:"èµ·";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"ð  „";s:4:"跋";s:3:"è·‹";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"è·°";s:4:"ð¯§";s:4:"𠣞";s:4:"軔";s:3:"è»”";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"é‚”";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"é„‘";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"é„›";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"é‹—";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"é¹";s:4:"鐕";s:3:"é•";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"é–‹";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"é–·";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"ð©……";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"ä©®";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"ð©Š";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"ð©’–";s:4:"頋";s:3:"é ‹";s:4:"頋";s:3:"é ‹";s:4:"頩";s:3:"é ©";s:4:"ð¯¨";s:4:"ð©–¶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"é±€";s:4:"鳽";s:3:"é³½";s:4:"ð¯¨";s:3:"䳎";s:4:"䳭";s:3:"ä³­";s:4:"ð¯¨";s:3:"鵧";s:4:"ð¯¨";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"äµ–";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"é¼…";s:4:"鼏";s:3:"é¼";s:4:"鼖";s:3:"é¼–";s:4:"鼻";s:3:"é¼»";s:4:"ð¯¨";s:4:"𪘀";}' );
-$utfCheckNFC = unserialize( 'a:1221:{s:2:"Í€";s:1:"N";s:2:"Í";s:1:"N";s:2:"̓";s:1:"N";s:2:"Í„";s:1:"N";s:2:"Í´";s:1:"N";s:2:";";s:1:"N";s:2:"·";s:1:"N";s:3:"क़";s:1:"N";s:3:"ख़";s:1:"N";s:3:"ग़";s:1:"N";s:3:"ज़";s:1:"N";s:3:"ड़";s:1:"N";s:3:"à¥";s:1:"N";s:3:"फ़";s:1:"N";s:3:"य़";s:1:"N";s:3:"ড়";s:1:"N";s:3:"à§";s:1:"N";s:3:"য়";s:1:"N";s:3:"ਲ਼";s:1:"N";s:3:"ਸ਼";s:1:"N";s:3:"à©™";s:1:"N";s:3:"à©š";s:1:"N";s:3:"à©›";s:1:"N";s:3:"à©ž";s:1:"N";s:3:"à­œ";s:1:"N";s:3:"à­";s:1:"N";s:3:"གྷ";s:1:"N";s:3:"à½";s:1:"N";s:3:"དྷ";s:1:"N";s:3:"བྷ";s:1:"N";s:3:"ཛྷ";s:1:"N";s:3:"ཀྵ";s:1:"N";s:3:"ཱི";s:1:"N";s:3:"ཱུ";s:1:"N";s:3:"ྲྀ";s:1:"N";s:3:"ླྀ";s:1:"N";s:3:"à¾";s:1:"N";s:3:"ྒྷ";s:1:"N";s:3:"à¾";s:1:"N";s:3:"ྡྷ";s:1:"N";s:3:"ྦྷ";s:1:"N";s:3:"ྫྷ";s:1:"N";s:3:"ྐྵ";s:1:"N";s:3:"á½±";s:1:"N";s:3:"á½³";s:1:"N";s:3:"á½µ";s:1:"N";s:3:"á½·";s:1:"N";s:3:"á½¹";s:1:"N";s:3:"á½»";s:1:"N";s:3:"á½½";s:1:"N";s:3:"á¾»";s:1:"N";s:3:"á¾¾";s:1:"N";s:3:"Έ";s:1:"N";s:3:"á¿‹";s:1:"N";s:3:"á¿“";s:1:"N";s:3:"á¿›";s:1:"N";s:3:"á¿£";s:1:"N";s:3:"á¿«";s:1:"N";s:3:"á¿®";s:1:"N";s:3:"`";s:1:"N";s:3:"Ό";s:1:"N";s:3:"á¿»";s:1:"N";s:3:"´";s:1:"N";s:3:" ";s:1:"N";s:3:"â€";s:1:"N";s:3:"Ω";s:1:"N";s:3:"K";s:1:"N";s:3:"â„«";s:1:"N";s:3:"〈";s:1:"N";s:3:"〉";s:1:"N";s:3:"â«œ";s:1:"N";s:3:"豈";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"車";s:1:"N";s:3:"賈";s:1:"N";s:3:"滑";s:1:"N";s:3:"串";s:1:"N";s:3:"句";s:1:"N";s:3:"龜";s:1:"N";s:3:"龜";s:1:"N";s:3:"契";s:1:"N";s:3:"金";s:1:"N";s:3:"喇";s:1:"N";s:3:"奈";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"癩";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"螺";s:1:"N";s:3:"裸";s:1:"N";s:3:"邏";s:1:"N";s:3:"樂";s:1:"N";s:3:"洛";s:1:"N";s:3:"烙";s:1:"N";s:3:"珞";s:1:"N";s:3:"落";s:1:"N";s:3:"酪";s:1:"N";s:3:"駱";s:1:"N";s:3:"亂";s:1:"N";s:3:"卵";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"爛";s:1:"N";s:3:"蘭";s:1:"N";s:3:"鸞";s:1:"N";s:3:"嵐";s:1:"N";s:3:"濫";s:1:"N";s:3:"藍";s:1:"N";s:3:"襤";s:1:"N";s:3:"拉";s:1:"N";s:3:"臘";s:1:"N";s:3:"蠟";s:1:"N";s:3:"廊";s:1:"N";s:3:"朗";s:1:"N";s:3:"浪";s:1:"N";s:3:"狼";s:1:"N";s:3:"郎";s:1:"N";s:3:"來";s:1:"N";s:3:"冷";s:1:"N";s:3:"勞";s:1:"N";s:3:"擄";s:1:"N";s:3:"櫓";s:1:"N";s:3:"爐";s:1:"N";s:3:"盧";s:1:"N";s:3:"老";s:1:"N";s:3:"蘆";s:1:"N";s:3:"虜";s:1:"N";s:3:"路";s:1:"N";s:3:"露";s:1:"N";s:3:"魯";s:1:"N";s:3:"鷺";s:1:"N";s:3:"碌";s:1:"N";s:3:"祿";s:1:"N";s:3:"綠";s:1:"N";s:3:"菉";s:1:"N";s:3:"錄";s:1:"N";s:3:"鹿";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"壟";s:1:"N";s:3:"弄";s:1:"N";s:3:"籠";s:1:"N";s:3:"聾";s:1:"N";s:3:"牢";s:1:"N";s:3:"磊";s:1:"N";s:3:"賂";s:1:"N";s:3:"雷";s:1:"N";s:3:"壘";s:1:"N";s:3:"屢";s:1:"N";s:3:"樓";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"漏";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"陋";s:1:"N";s:3:"勒";s:1:"N";s:3:"肋";s:1:"N";s:3:"凜";s:1:"N";s:3:"凌";s:1:"N";s:3:"稜";s:1:"N";s:3:"綾";s:1:"N";s:3:"菱";s:1:"N";s:3:"陵";s:1:"N";s:3:"讀";s:1:"N";s:3:"拏";s:1:"N";s:3:"樂";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"丹";s:1:"N";s:3:"寧";s:1:"N";s:3:"怒";s:1:"N";s:3:"率";s:1:"N";s:3:"異";s:1:"N";s:3:"北";s:1:"N";s:3:"磻";s:1:"N";s:3:"便";s:1:"N";s:3:"復";s:1:"N";s:3:"不";s:1:"N";s:3:"泌";s:1:"N";s:3:"數";s:1:"N";s:3:"索";s:1:"N";s:3:"參";s:1:"N";s:3:"塞";s:1:"N";s:3:"省";s:1:"N";s:3:"葉";s:1:"N";s:3:"說";s:1:"N";s:3:"殺";s:1:"N";s:3:"辰";s:1:"N";s:3:"沈";s:1:"N";s:3:"拾";s:1:"N";s:3:"若";s:1:"N";s:3:"掠";s:1:"N";s:3:"略";s:1:"N";s:3:"亮";s:1:"N";s:3:"兩";s:1:"N";s:3:"凉";s:1:"N";s:3:"梁";s:1:"N";s:3:"糧";s:1:"N";s:3:"良";s:1:"N";s:3:"諒";s:1:"N";s:3:"量";s:1:"N";s:3:"勵";s:1:"N";s:3:"呂";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"廬";s:1:"N";s:3:"旅";s:1:"N";s:3:"濾";s:1:"N";s:3:"礪";s:1:"N";s:3:"閭";s:1:"N";s:3:"驪";s:1:"N";s:3:"麗";s:1:"N";s:3:"黎";s:1:"N";s:3:"力";s:1:"N";s:3:"曆";s:1:"N";s:3:"歷";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"年";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"撚";s:1:"N";s:3:"漣";s:1:"N";s:3:"煉";s:1:"N";s:3:"璉";s:1:"N";s:3:"秊";s:1:"N";s:3:"練";s:1:"N";s:3:"聯";s:1:"N";s:3:"輦";s:1:"N";s:3:"蓮";s:1:"N";s:3:"連";s:1:"N";s:3:"鍊";s:1:"N";s:3:"列";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"咽";s:1:"N";s:3:"烈";s:1:"N";s:3:"裂";s:1:"N";s:3:"說";s:1:"N";s:3:"廉";s:1:"N";s:3:"念";s:1:"N";s:3:"捻";s:1:"N";s:3:"殮";s:1:"N";s:3:"簾";s:1:"N";s:3:"獵";s:1:"N";s:3:"令";s:1:"N";s:3:"囹";s:1:"N";s:3:"寧";s:1:"N";s:3:"嶺";s:1:"N";s:3:"怜";s:1:"N";s:3:"玲";s:1:"N";s:3:"瑩";s:1:"N";s:3:"羚";s:1:"N";s:3:"聆";s:1:"N";s:3:"鈴";s:1:"N";s:3:"零";s:1:"N";s:3:"靈";s:1:"N";s:3:"領";s:1:"N";s:3:"例";s:1:"N";s:3:"禮";s:1:"N";s:3:"醴";s:1:"N";s:3:"隸";s:1:"N";s:3:"惡";s:1:"N";s:3:"了";s:1:"N";s:3:"僚";s:1:"N";s:3:"寮";s:1:"N";s:3:"尿";s:1:"N";s:3:"料";s:1:"N";s:3:"樂";s:1:"N";s:3:"燎";s:1:"N";s:3:"ï§";s:1:"N";s:3:"蓼";s:1:"N";s:3:"遼";s:1:"N";s:3:"龍";s:1:"N";s:3:"暈";s:1:"N";s:3:"阮";s:1:"N";s:3:"劉";s:1:"N";s:3:"杻";s:1:"N";s:3:"柳";s:1:"N";s:3:"流";s:1:"N";s:3:"溜";s:1:"N";s:3:"琉";s:1:"N";s:3:"ï§";s:1:"N";s:3:"硫";s:1:"N";s:3:"ï§";s:1:"N";s:3:"ï§";s:1:"N";s:3:"六";s:1:"N";s:3:"戮";s:1:"N";s:3:"陸";s:1:"N";s:3:"倫";s:1:"N";s:3:"崙";s:1:"N";s:3:"淪";s:1:"N";s:3:"輪";s:1:"N";s:3:"律";s:1:"N";s:3:"慄";s:1:"N";s:3:"栗";s:1:"N";s:3:"率";s:1:"N";s:3:"隆";s:1:"N";s:3:"ï§";s:1:"N";s:3:"吏";s:1:"N";s:3:"履";s:1:"N";s:3:"易";s:1:"N";s:3:"李";s:1:"N";s:3:"梨";s:1:"N";s:3:"泥";s:1:"N";s:3:"理";s:1:"N";s:3:"痢";s:1:"N";s:3:"罹";s:1:"N";s:3:"裏";s:1:"N";s:3:"裡";s:1:"N";s:3:"里";s:1:"N";s:3:"離";s:1:"N";s:3:"匿";s:1:"N";s:3:"溺";s:1:"N";s:3:"吝";s:1:"N";s:3:"燐";s:1:"N";s:3:"璘";s:1:"N";s:3:"藺";s:1:"N";s:3:"隣";s:1:"N";s:3:"鱗";s:1:"N";s:3:"麟";s:1:"N";s:3:"林";s:1:"N";s:3:"淋";s:1:"N";s:3:"臨";s:1:"N";s:3:"立";s:1:"N";s:3:"笠";s:1:"N";s:3:"粒";s:1:"N";s:3:"狀";s:1:"N";s:3:"炙";s:1:"N";s:3:"識";s:1:"N";s:3:"什";s:1:"N";s:3:"茶";s:1:"N";s:3:"刺";s:1:"N";s:3:"切";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"拓";s:1:"N";s:3:"糖";s:1:"N";s:3:"宅";s:1:"N";s:3:"洞";s:1:"N";s:3:"暴";s:1:"N";s:3:"輻";s:1:"N";s:3:"行";s:1:"N";s:3:"降";s:1:"N";s:3:"見";s:1:"N";s:3:"廓";s:1:"N";s:3:"兀";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"晴";s:1:"N";s:3:"凞";s:1:"N";s:3:"猪";s:1:"N";s:3:"益";s:1:"N";s:3:"礼";s:1:"N";s:3:"神";s:1:"N";s:3:"祥";s:1:"N";s:3:"福";s:1:"N";s:3:"靖";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"羽";s:1:"N";s:3:"蘒";s:1:"N";s:3:"諸";s:1:"N";s:3:"逸";s:1:"N";s:3:"都";s:1:"N";s:3:"飯";s:1:"N";s:3:"飼";s:1:"N";s:3:"館";s:1:"N";s:3:"鶴";s:1:"N";s:3:"侮";s:1:"N";s:3:"僧";s:1:"N";s:3:"免";s:1:"N";s:3:"勉";s:1:"N";s:3:"勤";s:1:"N";s:3:"卑";s:1:"N";s:3:"喝";s:1:"N";s:3:"嘆";s:1:"N";s:3:"器";s:1:"N";s:3:"塀";s:1:"N";s:3:"墨";s:1:"N";s:3:"層";s:1:"N";s:3:"屮";s:1:"N";s:3:"悔";s:1:"N";s:3:"慨";s:1:"N";s:3:"憎";s:1:"N";s:3:"ï©€";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©‚";s:1:"N";s:3:"暑";s:1:"N";s:3:"ï©„";s:1:"N";s:3:"ï©…";s:1:"N";s:3:"渚";s:1:"N";s:3:"漢";s:1:"N";s:3:"煮";s:1:"N";s:3:"爫";s:1:"N";s:3:"ï©Š";s:1:"N";s:3:"ï©‹";s:1:"N";s:3:"ï©Œ";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©Ž";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©‘";s:1:"N";s:3:"ï©’";s:1:"N";s:3:"ï©“";s:1:"N";s:3:"ï©”";s:1:"N";s:3:"ï©•";s:1:"N";s:3:"ï©–";s:1:"N";s:3:"ï©—";s:1:"N";s:3:"縉";s:1:"N";s:3:"ï©™";s:1:"N";s:3:"ï©š";s:1:"N";s:3:"ï©›";s:1:"N";s:3:"ï©œ";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©ž";s:1:"N";s:3:"ï©Ÿ";s:1:"N";s:3:"ï© ";s:1:"N";s:3:"ï©¡";s:1:"N";s:3:"ï©¢";s:1:"N";s:3:"ï©£";s:1:"N";s:3:"賓";s:1:"N";s:3:"ï©¥";s:1:"N";s:3:"辶";s:1:"N";s:3:"逸";s:1:"N";s:3:"難";s:1:"N";s:3:"ï©©";s:1:"N";s:3:"頻";s:1:"N";s:3:"ï©«";s:1:"N";s:3:"𤋮";s:1:"N";s:3:"ï©­";s:1:"N";s:3:"ï©°";s:1:"N";s:3:"况";s:1:"N";s:3:"全";s:1:"N";s:3:"侀";s:1:"N";s:3:"ï©´";s:1:"N";s:3:"冀";s:1:"N";s:3:"勇";s:1:"N";s:3:"ï©·";s:1:"N";s:3:"喝";s:1:"N";s:3:"啕";s:1:"N";s:3:"喙";s:1:"N";s:3:"ï©»";s:1:"N";s:3:"塚";s:1:"N";s:3:"墳";s:1:"N";s:3:"奄";s:1:"N";s:3:"ï©¿";s:1:"N";s:3:"婢";s:1:"N";s:3:"ïª";s:1:"N";s:3:"廒";s:1:"N";s:3:"廙";s:1:"N";s:3:"彩";s:1:"N";s:3:"徭";s:1:"N";s:3:"惘";s:1:"N";s:3:"慎";s:1:"N";s:3:"愈";s:1:"N";s:3:"憎";s:1:"N";s:3:"慠";s:1:"N";s:3:"懲";s:1:"N";s:3:"戴";s:1:"N";s:3:"ïª";s:1:"N";s:3:"搜";s:1:"N";s:3:"ïª";s:1:"N";s:3:"ïª";s:1:"N";s:3:"晴";s:1:"N";s:3:"朗";s:1:"N";s:3:"望";s:1:"N";s:3:"杖";s:1:"N";s:3:"歹";s:1:"N";s:3:"殺";s:1:"N";s:3:"流";s:1:"N";s:3:"滛";s:1:"N";s:3:"滋";s:1:"N";s:3:"漢";s:1:"N";s:3:"瀞";s:1:"N";s:3:"煮";s:1:"N";s:3:"ïª";s:1:"N";s:3:"爵";s:1:"N";s:3:"犯";s:1:"N";s:3:"猪";s:1:"N";s:3:"瑱";s:1:"N";s:3:"甆";s:1:"N";s:3:"画";s:1:"N";s:3:"瘝";s:1:"N";s:3:"瘟";s:1:"N";s:3:"益";s:1:"N";s:3:"盛";s:1:"N";s:3:"直";s:1:"N";s:3:"睊";s:1:"N";s:3:"着";s:1:"N";s:3:"磌";s:1:"N";s:3:"窱";s:1:"N";s:3:"節";s:1:"N";s:3:"类";s:1:"N";s:3:"絛";s:1:"N";s:3:"練";s:1:"N";s:3:"缾";s:1:"N";s:3:"者";s:1:"N";s:3:"荒";s:1:"N";s:3:"華";s:1:"N";s:3:"蝹";s:1:"N";s:3:"襁";s:1:"N";s:3:"覆";s:1:"N";s:3:"視";s:1:"N";s:3:"調";s:1:"N";s:3:"諸";s:1:"N";s:3:"請";s:1:"N";s:3:"謁";s:1:"N";s:3:"諾";s:1:"N";s:3:"諭";s:1:"N";s:3:"謹";s:1:"N";s:3:"ï«€";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«‚";s:1:"N";s:3:"遲";s:1:"N";s:3:"ï«„";s:1:"N";s:3:"ï«…";s:1:"N";s:3:"陼";s:1:"N";s:3:"難";s:1:"N";s:3:"靖";s:1:"N";s:3:"韛";s:1:"N";s:3:"ï«Š";s:1:"N";s:3:"ï«‹";s:1:"N";s:3:"ï«Œ";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«Ž";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«‘";s:1:"N";s:3:"ï«’";s:1:"N";s:3:"ï«“";s:1:"N";s:3:"ï«”";s:1:"N";s:3:"ï«•";s:1:"N";s:3:"ï«–";s:1:"N";s:3:"ï«—";s:1:"N";s:3:"齃";s:1:"N";s:3:"ï«™";s:1:"N";s:3:"ï¬";s:1:"N";s:3:"ײַ";s:1:"N";s:3:"שׁ";s:1:"N";s:3:"שׂ";s:1:"N";s:3:"שּׁ";s:1:"N";s:3:"שּׂ";s:1:"N";s:3:"אַ";s:1:"N";s:3:"אָ";s:1:"N";s:3:"אּ";s:1:"N";s:3:"בּ";s:1:"N";s:3:"גּ";s:1:"N";s:3:"דּ";s:1:"N";s:3:"הּ";s:1:"N";s:3:"וּ";s:1:"N";s:3:"זּ";s:1:"N";s:3:"טּ";s:1:"N";s:3:"יּ";s:1:"N";s:3:"ךּ";s:1:"N";s:3:"כּ";s:1:"N";s:3:"לּ";s:1:"N";s:3:"מּ";s:1:"N";s:3:"ï­€";s:1:"N";s:3:"ï­";s:1:"N";s:3:"ï­ƒ";s:1:"N";s:3:"ï­„";s:1:"N";s:3:"ï­†";s:1:"N";s:3:"ï­‡";s:1:"N";s:3:"ï­ˆ";s:1:"N";s:3:"ï­‰";s:1:"N";s:3:"ï­Š";s:1:"N";s:3:"ï­‹";s:1:"N";s:3:"ï­Œ";s:1:"N";s:3:"ï­";s:1:"N";s:3:"ï­Ž";s:1:"N";s:4:"ð…ž";s:1:"N";s:4:"ð…Ÿ";s:1:"N";s:4:"ð… ";s:1:"N";s:4:"ð…¡";s:1:"N";s:4:"ð…¢";s:1:"N";s:4:"ð…£";s:1:"N";s:4:"ð…¤";s:1:"N";s:4:"ð†»";s:1:"N";s:4:"ð†¼";s:1:"N";s:4:"ð†½";s:1:"N";s:4:"ð†¾";s:1:"N";s:4:"ð†¿";s:1:"N";s:4:"ð‡€";s:1:"N";s:4:"丽";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"乁";s:1:"N";s:4:"𠄢";s:1:"N";s:4:"你";s:1:"N";s:4:"侮";s:1:"N";s:4:"侻";s:1:"N";s:4:"倂";s:1:"N";s:4:"偺";s:1:"N";s:4:"備";s:1:"N";s:4:"僧";s:1:"N";s:4:"像";s:1:"N";s:4:"㒞";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"免";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"具";s:1:"N";s:4:"𠔜";s:1:"N";s:4:"㒹";s:1:"N";s:4:"內";s:1:"N";s:4:"再";s:1:"N";s:4:"𠕋";s:1:"N";s:4:"冗";s:1:"N";s:4:"冤";s:1:"N";s:4:"仌";s:1:"N";s:4:"冬";s:1:"N";s:4:"况";s:1:"N";s:4:"𩇟";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"刃";s:1:"N";s:4:"㓟";s:1:"N";s:4:"刻";s:1:"N";s:4:"剆";s:1:"N";s:4:"割";s:1:"N";s:4:"剷";s:1:"N";s:4:"㔕";s:1:"N";s:4:"勇";s:1:"N";s:4:"勉";s:1:"N";s:4:"勤";s:1:"N";s:4:"勺";s:1:"N";s:4:"包";s:1:"N";s:4:"匆";s:1:"N";s:4:"北";s:1:"N";s:4:"卉";s:1:"N";s:4:"卑";s:1:"N";s:4:"博";s:1:"N";s:4:"即";s:1:"N";s:4:"卽";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"𠨬";s:1:"N";s:4:"灰";s:1:"N";s:4:"及";s:1:"N";s:4:"叟";s:1:"N";s:4:"𠭣";s:1:"N";s:4:"叫";s:1:"N";s:4:"叱";s:1:"N";s:4:"吆";s:1:"N";s:4:"咞";s:1:"N";s:4:"吸";s:1:"N";s:4:"呈";s:1:"N";s:4:"周";s:1:"N";s:4:"咢";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"唐";s:1:"N";s:4:"啓";s:1:"N";s:4:"啣";s:1:"N";s:4:"善";s:1:"N";s:4:"善";s:1:"N";s:4:"喙";s:1:"N";s:4:"喫";s:1:"N";s:4:"喳";s:1:"N";s:4:"嗂";s:1:"N";s:4:"圖";s:1:"N";s:4:"嘆";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"噑";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"壮";s:1:"N";s:4:"城";s:1:"N";s:4:"埴";s:1:"N";s:4:"堍";s:1:"N";s:4:"型";s:1:"N";s:4:"堲";s:1:"N";s:4:"報";s:1:"N";s:4:"墬";s:1:"N";s:4:"𡓤";s:1:"N";s:4:"売";s:1:"N";s:4:"壷";s:1:"N";s:4:"夆";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"夢";s:1:"N";s:4:"奢";s:1:"N";s:4:"𡚨";s:1:"N";s:4:"𡛪";s:1:"N";s:4:"姬";s:1:"N";s:4:"娛";s:1:"N";s:4:"娧";s:1:"N";s:4:"姘";s:1:"N";s:4:"婦";s:1:"N";s:4:"㛮";s:1:"N";s:4:"㛼";s:1:"N";s:4:"嬈";s:1:"N";s:4:"嬾";s:1:"N";s:4:"嬾";s:1:"N";s:4:"𡧈";s:1:"N";s:4:"寃";s:1:"N";s:4:"寘";s:1:"N";s:4:"寧";s:1:"N";s:4:"寳";s:1:"N";s:4:"𡬘";s:1:"N";s:4:"寿";s:1:"N";s:4:"将";s:1:"N";s:4:"当";s:1:"N";s:4:"尢";s:1:"N";s:4:"㞁";s:1:"N";s:4:"屠";s:1:"N";s:4:"屮";s:1:"N";s:4:"峀";s:1:"N";s:4:"岍";s:1:"N";s:4:"𡷤";s:1:"N";s:4:"嵃";s:1:"N";s:4:"𡷦";s:1:"N";s:4:"嵮";s:1:"N";s:4:"嵫";s:1:"N";s:4:"嵼";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"巢";s:1:"N";s:4:"㠯";s:1:"N";s:4:"巽";s:1:"N";s:4:"帨";s:1:"N";s:4:"帽";s:1:"N";s:4:"幩";s:1:"N";s:4:"㡢";s:1:"N";s:4:"𢆃";s:1:"N";s:4:"㡼";s:1:"N";s:4:"庰";s:1:"N";s:4:"庳";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"廊";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"舁";s:1:"N";s:4:"弢";s:1:"N";s:4:"弢";s:1:"N";s:4:"㣇";s:1:"N";s:4:"𣊸";s:1:"N";s:4:"𦇚";s:1:"N";s:4:"形";s:1:"N";s:4:"彫";s:1:"N";s:4:"㣣";s:1:"N";s:4:"徚";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"志";s:1:"N";s:4:"忹";s:1:"N";s:4:"悁";s:1:"N";s:4:"㤺";s:1:"N";s:4:"㤜";s:1:"N";s:4:"悔";s:1:"N";s:4:"𢛔";s:1:"N";s:4:"惇";s:1:"N";s:4:"慈";s:1:"N";s:4:"慌";s:1:"N";s:4:"慎";s:1:"N";s:4:"慌";s:1:"N";s:4:"慺";s:1:"N";s:4:"憎";s:1:"N";s:4:"憲";s:1:"N";s:4:"憤";s:1:"N";s:4:"憯";s:1:"N";s:4:"懞";s:1:"N";s:4:"懲";s:1:"N";s:4:"懶";s:1:"N";s:4:"成";s:1:"N";s:4:"戛";s:1:"N";s:4:"扝";s:1:"N";s:4:"抱";s:1:"N";s:4:"拔";s:1:"N";s:4:"捐";s:1:"N";s:4:"𢬌";s:1:"N";s:4:"挽";s:1:"N";s:4:"拼";s:1:"N";s:4:"捨";s:1:"N";s:4:"掃";s:1:"N";s:4:"揤";s:1:"N";s:4:"𢯱";s:1:"N";s:4:"搢";s:1:"N";s:4:"揅";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㨮";s:1:"N";s:4:"摩";s:1:"N";s:4:"摾";s:1:"N";s:4:"撝";s:1:"N";s:4:"摷";s:1:"N";s:4:"㩬";s:1:"N";s:4:"敏";s:1:"N";s:4:"敬";s:1:"N";s:4:"𣀊";s:1:"N";s:4:"旣";s:1:"N";s:4:"書";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㬙";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㫤";s:1:"N";s:4:"冒";s:1:"N";s:4:"冕";s:1:"N";s:4:"最";s:1:"N";s:4:"暜";s:1:"N";s:4:"肭";s:1:"N";s:4:"䏙";s:1:"N";s:4:"朗";s:1:"N";s:4:"望";s:1:"N";s:4:"朡";s:1:"N";s:4:"杞";s:1:"N";s:4:"杓";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㭉";s:1:"N";s:4:"柺";s:1:"N";s:4:"枅";s:1:"N";s:4:"桒";s:1:"N";s:4:"梅";s:1:"N";s:4:"𣑭";s:1:"N";s:4:"梎";s:1:"N";s:4:"栟";s:1:"N";s:4:"椔";s:1:"N";s:4:"㮝";s:1:"N";s:4:"楂";s:1:"N";s:4:"榣";s:1:"N";s:4:"槪";s:1:"N";s:4:"檨";s:1:"N";s:4:"𣚣";s:1:"N";s:4:"櫛";s:1:"N";s:4:"㰘";s:1:"N";s:4:"次";s:1:"N";s:4:"𣢧";s:1:"N";s:4:"歔";s:1:"N";s:4:"㱎";s:1:"N";s:4:"歲";s:1:"N";s:4:"殟";s:1:"N";s:4:"殺";s:1:"N";s:4:"殻";s:1:"N";s:4:"𣪍";s:1:"N";s:4:"𡴋";s:1:"N";s:4:"𣫺";s:1:"N";s:4:"汎";s:1:"N";s:4:"𣲼";s:1:"N";s:4:"沿";s:1:"N";s:4:"泍";s:1:"N";s:4:"汧";s:1:"N";s:4:"洖";s:1:"N";s:4:"派";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"流";s:1:"N";s:4:"浩";s:1:"N";s:4:"浸";s:1:"N";s:4:"涅";s:1:"N";s:4:"𣴞";s:1:"N";s:4:"洴";s:1:"N";s:4:"港";s:1:"N";s:4:"湮";s:1:"N";s:4:"㴳";s:1:"N";s:4:"滋";s:1:"N";s:4:"滇";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"淹";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"𣾎";s:1:"N";s:4:"濆";s:1:"N";s:4:"瀹";s:1:"N";s:4:"瀞";s:1:"N";s:4:"瀛";s:1:"N";s:4:"㶖";s:1:"N";s:4:"灊";s:1:"N";s:4:"災";s:1:"N";s:4:"灷";s:1:"N";s:4:"炭";s:1:"N";s:4:"𠔥";s:1:"N";s:4:"煅";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"熜";s:1:"N";s:4:"𤎫";s:1:"N";s:4:"爨";s:1:"N";s:4:"爵";s:1:"N";s:4:"牐";s:1:"N";s:4:"𤘈";s:1:"N";s:4:"犀";s:1:"N";s:4:"犕";s:1:"N";s:4:"𤜵";s:1:"N";s:4:"𤠔";s:1:"N";s:4:"獺";s:1:"N";s:4:"王";s:1:"N";s:4:"㺬";s:1:"N";s:4:"玥";s:1:"N";s:4:"㺸";s:1:"N";s:4:"㺸";s:1:"N";s:4:"瑇";s:1:"N";s:4:"瑜";s:1:"N";s:4:"瑱";s:1:"N";s:4:"璅";s:1:"N";s:4:"瓊";s:1:"N";s:4:"㼛";s:1:"N";s:4:"甤";s:1:"N";s:4:"𤰶";s:1:"N";s:4:"甾";s:1:"N";s:4:"𤲒";s:1:"N";s:4:"異";s:1:"N";s:4:"𢆟";s:1:"N";s:4:"瘐";s:1:"N";s:4:"𤾡";s:1:"N";s:4:"𤾸";s:1:"N";s:4:"𥁄";s:1:"N";s:4:"㿼";s:1:"N";s:4:"䀈";s:1:"N";s:4:"直";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"𥃲";s:1:"N";s:4:"𥄙";s:1:"N";s:4:"𥄳";s:1:"N";s:4:"眞";s:1:"N";s:4:"真";s:1:"N";s:4:"真";s:1:"N";s:4:"睊";s:1:"N";s:4:"䀹";s:1:"N";s:4:"瞋";s:1:"N";s:4:"䁆";s:1:"N";s:4:"䂖";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"硎";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"䃣";s:1:"N";s:4:"𥘦";s:1:"N";s:4:"祖";s:1:"N";s:4:"𥚚";s:1:"N";s:4:"𥛅";s:1:"N";s:4:"福";s:1:"N";s:4:"秫";s:1:"N";s:4:"䄯";s:1:"N";s:4:"穀";s:1:"N";s:4:"穊";s:1:"N";s:4:"穏";s:1:"N";s:4:"𥥼";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"𥪧";s:1:"N";s:4:"竮";s:1:"N";s:4:"䈂";s:1:"N";s:4:"𥮫";s:1:"N";s:4:"篆";s:1:"N";s:4:"築";s:1:"N";s:4:"䈧";s:1:"N";s:4:"𥲀";s:1:"N";s:4:"糒";s:1:"N";s:4:"䊠";s:1:"N";s:4:"糨";s:1:"N";s:4:"糣";s:1:"N";s:4:"紀";s:1:"N";s:4:"𥾆";s:1:"N";s:4:"絣";s:1:"N";s:4:"䌁";s:1:"N";s:4:"緇";s:1:"N";s:4:"縂";s:1:"N";s:4:"繅";s:1:"N";s:4:"䌴";s:1:"N";s:4:"𦈨";s:1:"N";s:4:"𦉇";s:1:"N";s:4:"䍙";s:1:"N";s:4:"𦋙";s:1:"N";s:4:"罺";s:1:"N";s:4:"𦌾";s:1:"N";s:4:"羕";s:1:"N";s:4:"翺";s:1:"N";s:4:"者";s:1:"N";s:4:"𦓚";s:1:"N";s:4:"𦔣";s:1:"N";s:4:"聠";s:1:"N";s:4:"𦖨";s:1:"N";s:4:"聰";s:1:"N";s:4:"𣍟";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"育";s:1:"N";s:4:"脃";s:1:"N";s:4:"䐋";s:1:"N";s:4:"脾";s:1:"N";s:4:"媵";s:1:"N";s:4:"𦞧";s:1:"N";s:4:"𦞵";s:1:"N";s:4:"𣎓";s:1:"N";s:4:"𣎜";s:1:"N";s:4:"舁";s:1:"N";s:4:"舄";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"䑫";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"芝";s:1:"N";s:4:"劳";s:1:"N";s:4:"花";s:1:"N";s:4:"芳";s:1:"N";s:4:"芽";s:1:"N";s:4:"苦";s:1:"N";s:4:"𦬼";s:1:"N";s:4:"若";s:1:"N";s:4:"茝";s:1:"N";s:4:"荣";s:1:"N";s:4:"莭";s:1:"N";s:4:"茣";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"菧";s:1:"N";s:4:"著";s:1:"N";s:4:"荓";s:1:"N";s:4:"菊";s:1:"N";s:4:"菌";s:1:"N";s:4:"菜";s:1:"N";s:4:"𦰶";s:1:"N";s:4:"𦵫";s:1:"N";s:4:"𦳕";s:1:"N";s:4:"䔫";s:1:"N";s:4:"蓱";s:1:"N";s:4:"蓳";s:1:"N";s:4:"蔖";s:1:"N";s:4:"𧏊";s:1:"N";s:4:"蕤";s:1:"N";s:4:"𦼬";s:1:"N";s:4:"䕝";s:1:"N";s:4:"䕡";s:1:"N";s:4:"𦾱";s:1:"N";s:4:"𧃒";s:1:"N";s:4:"䕫";s:1:"N";s:4:"虐";s:1:"N";s:4:"虜";s:1:"N";s:4:"虧";s:1:"N";s:4:"虩";s:1:"N";s:4:"蚩";s:1:"N";s:4:"蚈";s:1:"N";s:4:"蜎";s:1:"N";s:4:"蛢";s:1:"N";s:4:"蝹";s:1:"N";s:4:"蜨";s:1:"N";s:4:"蝫";s:1:"N";s:4:"螆";s:1:"N";s:4:"䗗";s:1:"N";s:4:"蟡";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"䗹";s:1:"N";s:4:"衠";s:1:"N";s:4:"衣";s:1:"N";s:4:"𧙧";s:1:"N";s:4:"裗";s:1:"N";s:4:"裞";s:1:"N";s:4:"䘵";s:1:"N";s:4:"裺";s:1:"N";s:4:"㒻";s:1:"N";s:4:"𧢮";s:1:"N";s:4:"𧥦";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"䛇";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"變";s:1:"N";s:4:"豕";s:1:"N";s:4:"𧲨";s:1:"N";s:4:"貫";s:1:"N";s:4:"賁";s:1:"N";s:4:"贛";s:1:"N";s:4:"起";s:1:"N";s:4:"𧼯";s:1:"N";s:4:"𠠄";s:1:"N";s:4:"跋";s:1:"N";s:4:"趼";s:1:"N";s:4:"跰";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"軔";s:1:"N";s:4:"輸";s:1:"N";s:4:"𨗒";s:1:"N";s:4:"𨗭";s:1:"N";s:4:"邔";s:1:"N";s:4:"郱";s:1:"N";s:4:"鄑";s:1:"N";s:4:"𨜮";s:1:"N";s:4:"鄛";s:1:"N";s:4:"鈸";s:1:"N";s:4:"鋗";s:1:"N";s:4:"鋘";s:1:"N";s:4:"鉼";s:1:"N";s:4:"鏹";s:1:"N";s:4:"鐕";s:1:"N";s:4:"𨯺";s:1:"N";s:4:"開";s:1:"N";s:4:"䦕";s:1:"N";s:4:"閷";s:1:"N";s:4:"𨵷";s:1:"N";s:4:"䧦";s:1:"N";s:4:"雃";s:1:"N";s:4:"嶲";s:1:"N";s:4:"霣";s:1:"N";s:4:"𩅅";s:1:"N";s:4:"𩈚";s:1:"N";s:4:"䩮";s:1:"N";s:4:"䩶";s:1:"N";s:4:"韠";s:1:"N";s:4:"𩐊";s:1:"N";s:4:"䪲";s:1:"N";s:4:"𩒖";s:1:"N";s:4:"頋";s:1:"N";s:4:"頋";s:1:"N";s:4:"頩";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"飢";s:1:"N";s:4:"䬳";s:1:"N";s:4:"餩";s:1:"N";s:4:"馧";s:1:"N";s:4:"駂";s:1:"N";s:4:"駾";s:1:"N";s:4:"䯎";s:1:"N";s:4:"𩬰";s:1:"N";s:4:"鬒";s:1:"N";s:4:"鱀";s:1:"N";s:4:"鳽";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"䳭";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"䳸";s:1:"N";s:4:"𪄅";s:1:"N";s:4:"𪈎";s:1:"N";s:4:"𪊑";s:1:"N";s:4:"麻";s:1:"N";s:4:"䵖";s:1:"N";s:4:"黹";s:1:"N";s:4:"黾";s:1:"N";s:4:"鼅";s:1:"N";s:4:"鼏";s:1:"N";s:4:"鼖";s:1:"N";s:4:"鼻";s:1:"N";s:4:"ð¯¨";s:1:"N";s:2:"Ì€";s:1:"M";s:2:"Ì";s:1:"M";s:2:"Ì‚";s:1:"M";s:2:"̃";s:1:"M";s:2:"Ì„";s:1:"M";s:2:"̆";s:1:"M";s:2:"̇";s:1:"M";s:2:"̈";s:1:"M";s:2:"̉";s:1:"M";s:2:"ÌŠ";s:1:"M";s:2:"Ì‹";s:1:"M";s:2:"ÌŒ";s:1:"M";s:2:"Ì";s:1:"M";s:2:"Ì‘";s:1:"M";s:2:"Ì“";s:1:"M";s:2:"Ì”";s:1:"M";s:2:"Ì›";s:1:"M";s:2:"Ì£";s:1:"M";s:2:"̤";s:1:"M";s:2:"Ì¥";s:1:"M";s:2:"̦";s:1:"M";s:2:"̧";s:1:"M";s:2:"̨";s:1:"M";s:2:"Ì­";s:1:"M";s:2:"Ì®";s:1:"M";s:2:"Ì°";s:1:"M";s:2:"̱";s:1:"M";s:2:"̸";s:1:"M";s:2:"Í‚";s:1:"M";s:2:"Í…";s:1:"M";s:2:"Ù“";s:1:"M";s:2:"Ù”";s:1:"M";s:2:"Ù•";s:1:"M";s:3:"़";s:1:"M";s:3:"া";s:1:"M";s:3:"ৗ";s:1:"M";s:3:"ା";s:1:"M";s:3:"à­–";s:1:"M";s:3:"à­—";s:1:"M";s:3:"ா";s:1:"M";s:3:"ௗ";s:1:"M";s:3:"à±–";s:1:"M";s:3:"ೂ";s:1:"M";s:3:"ೕ";s:1:"M";s:3:"à³–";s:1:"M";s:3:"à´¾";s:1:"M";s:3:"ൗ";s:1:"M";s:3:"à·Š";s:1:"M";s:3:"à·";s:1:"M";s:3:"à·Ÿ";s:1:"M";s:3:"ီ";s:1:"M";s:3:"á…¡";s:1:"M";s:3:"á…¢";s:1:"M";s:3:"á…£";s:1:"M";s:3:"á…¤";s:1:"M";s:3:"á…¥";s:1:"M";s:3:"á…¦";s:1:"M";s:3:"á…§";s:1:"M";s:3:"á…¨";s:1:"M";s:3:"á…©";s:1:"M";s:3:"á…ª";s:1:"M";s:3:"á…«";s:1:"M";s:3:"á…¬";s:1:"M";s:3:"á…­";s:1:"M";s:3:"á…®";s:1:"M";s:3:"á…¯";s:1:"M";s:3:"á…°";s:1:"M";s:3:"á…±";s:1:"M";s:3:"á…²";s:1:"M";s:3:"á…³";s:1:"M";s:3:"á…´";s:1:"M";s:3:"á…µ";s:1:"M";s:3:"ᆨ";s:1:"M";s:3:"ᆩ";s:1:"M";s:3:"ᆪ";s:1:"M";s:3:"ᆫ";s:1:"M";s:3:"ᆬ";s:1:"M";s:3:"ᆭ";s:1:"M";s:3:"ᆮ";s:1:"M";s:3:"ᆯ";s:1:"M";s:3:"ᆰ";s:1:"M";s:3:"ᆱ";s:1:"M";s:3:"ᆲ";s:1:"M";s:3:"ᆳ";s:1:"M";s:3:"ᆴ";s:1:"M";s:3:"ᆵ";s:1:"M";s:3:"ᆶ";s:1:"M";s:3:"ᆷ";s:1:"M";s:3:"ᆸ";s:1:"M";s:3:"ᆹ";s:1:"M";s:3:"ᆺ";s:1:"M";s:3:"ᆻ";s:1:"M";s:3:"ᆼ";s:1:"M";s:3:"ᆽ";s:1:"M";s:3:"ᆾ";s:1:"M";s:3:"ᆿ";s:1:"M";s:3:"ᇀ";s:1:"M";s:3:"á‡";s:1:"M";s:3:"ᇂ";s:1:"M";s:3:"ᬵ";s:1:"M";s:3:"ã‚™";s:1:"M";s:3:"ã‚š";s:1:"M";s:4:"𑂺";s:1:"M";}' );
+
+UtfNormal::$utfCombiningClass = unserialize( 'a:501:{s:2:"Ì€";i:230;s:2:"Ì";i:230;s:2:"Ì‚";i:230;s:2:"̃";i:230;s:2:"Ì„";i:230;s:2:"Ì…";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"ÌŠ";i:230;s:2:"Ì‹";i:230;s:2:"ÌŒ";i:230;s:2:"Ì";i:230;s:2:"ÌŽ";i:230;s:2:"Ì";i:230;s:2:"Ì";i:230;s:2:"Ì‘";i:230;s:2:"Ì’";i:230;s:2:"Ì“";i:230;s:2:"Ì”";i:230;s:2:"Ì•";i:232;s:2:"Ì–";i:220;s:2:"Ì—";i:220;s:2:"̘";i:220;s:2:"Ì™";i:220;s:2:"Ìš";i:232;s:2:"Ì›";i:216;s:2:"Ìœ";i:220;s:2:"Ì";i:220;s:2:"Ìž";i:220;s:2:"ÌŸ";i:220;s:2:"Ì ";i:220;s:2:"Ì¡";i:202;s:2:"Ì¢";i:202;s:2:"Ì£";i:220;s:2:"̤";i:220;s:2:"Ì¥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"Ì©";i:220;s:2:"̪";i:220;s:2:"Ì«";i:220;s:2:"̬";i:220;s:2:"Ì­";i:220;s:2:"Ì®";i:220;s:2:"̯";i:220;s:2:"Ì°";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"Ì´";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"Ì·";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"Ì»";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"Ì¿";i:230;s:2:"Í€";i:230;s:2:"Í";i:230;s:2:"Í‚";i:230;s:2:"̓";i:230;s:2:"Í„";i:230;s:2:"Í…";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"ÍŠ";i:230;s:2:"Í‹";i:230;s:2:"ÍŒ";i:230;s:2:"Í";i:220;s:2:"ÍŽ";i:220;s:2:"Í";i:230;s:2:"Í‘";i:230;s:2:"Í’";i:230;s:2:"Í“";i:220;s:2:"Í”";i:220;s:2:"Í•";i:220;s:2:"Í–";i:220;s:2:"Í—";i:230;s:2:"͘";i:232;s:2:"Í™";i:220;s:2:"Íš";i:220;s:2:"Í›";i:230;s:2:"Íœ";i:233;s:2:"Í";i:234;s:2:"Íž";i:234;s:2:"ÍŸ";i:233;s:2:"Í ";i:234;s:2:"Í¡";i:234;s:2:"Í¢";i:233;s:2:"Í£";i:230;s:2:"ͤ";i:230;s:2:"Í¥";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"Í©";i:230;s:2:"ͪ";i:230;s:2:"Í«";i:230;s:2:"ͬ";i:230;s:2:"Í­";i:230;s:2:"Í®";i:230;s:2:"ͯ";i:230;s:2:"Òƒ";i:230;s:2:"Ò„";i:230;s:2:"Ò…";i:230;s:2:"Ò†";i:230;s:2:"Ò‡";i:230;s:2:"Ö‘";i:220;s:2:"Ö’";i:230;s:2:"Ö“";i:230;s:2:"Ö”";i:230;s:2:"Ö•";i:230;s:2:"Ö–";i:220;s:2:"Ö—";i:230;s:2:"Ö˜";i:230;s:2:"Ö™";i:230;s:2:"Öš";i:222;s:2:"Ö›";i:220;s:2:"Öœ";i:230;s:2:"Ö";i:230;s:2:"Öž";i:230;s:2:"ÖŸ";i:230;s:2:"Ö ";i:230;s:2:"Ö¡";i:230;s:2:"Ö¢";i:220;s:2:"Ö£";i:220;s:2:"Ö¤";i:220;s:2:"Ö¥";i:220;s:2:"Ö¦";i:220;s:2:"Ö§";i:220;s:2:"Ö¨";i:230;s:2:"Ö©";i:230;s:2:"Öª";i:220;s:2:"Ö«";i:230;s:2:"Ö¬";i:230;s:2:"Ö­";i:222;s:2:"Ö®";i:228;s:2:"Ö¯";i:230;s:2:"Ö°";i:10;s:2:"Ö±";i:11;s:2:"Ö²";i:12;s:2:"Ö³";i:13;s:2:"Ö´";i:14;s:2:"Öµ";i:15;s:2:"Ö¶";i:16;s:2:"Ö·";i:17;s:2:"Ö¸";i:18;s:2:"Ö¹";i:19;s:2:"Öº";i:19;s:2:"Ö»";i:20;s:2:"Ö¼";i:21;s:2:"Ö½";i:22;s:2:"Ö¿";i:23;s:2:"×";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"×…";i:220;s:2:"ׇ";i:18;s:2:"Ø";i:230;s:2:"Ø‘";i:230;s:2:"Ø’";i:230;s:2:"Ø“";i:230;s:2:"Ø”";i:230;s:2:"Ø•";i:230;s:2:"Ø–";i:230;s:2:"Ø—";i:230;s:2:"ؘ";i:30;s:2:"Ø™";i:31;s:2:"Øš";i:32;s:2:"Ù‹";i:27;s:2:"ÙŒ";i:28;s:2:"Ù";i:29;s:2:"ÙŽ";i:30;s:2:"Ù";i:31;s:2:"Ù";i:32;s:2:"Ù‘";i:33;s:2:"Ù’";i:34;s:2:"Ù“";i:230;s:2:"Ù”";i:230;s:2:"Ù•";i:220;s:2:"Ù–";i:220;s:2:"Ù—";i:230;s:2:"Ù˜";i:230;s:2:"Ù™";i:230;s:2:"Ùš";i:230;s:2:"Ù›";i:230;s:2:"Ùœ";i:220;s:2:"Ù";i:230;s:2:"Ùž";i:230;s:2:"Ù°";i:35;s:2:"Û–";i:230;s:2:"Û—";i:230;s:2:"Û˜";i:230;s:2:"Û™";i:230;s:2:"Ûš";i:230;s:2:"Û›";i:230;s:2:"Ûœ";i:230;s:2:"ÛŸ";i:230;s:2:"Û ";i:230;s:2:"Û¡";i:230;s:2:"Û¢";i:230;s:2:"Û£";i:220;s:2:"Û¤";i:230;s:2:"Û§";i:230;s:2:"Û¨";i:230;s:2:"Ûª";i:220;s:2:"Û«";i:230;s:2:"Û¬";i:230;s:2:"Û­";i:220;s:2:"Ü‘";i:36;s:2:"Ü°";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"Ü´";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"Ü·";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"Ü»";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"Ü¿";i:230;s:2:"Ý€";i:230;s:2:"Ý";i:230;s:2:"Ý‚";i:220;s:2:"݃";i:230;s:2:"Ý„";i:220;s:2:"Ý…";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"ÝŠ";i:230;s:2:"ß«";i:230;s:2:"߬";i:230;s:2:"ß­";i:230;s:2:"ß®";i:230;s:2:"߯";i:230;s:2:"ß°";i:230;s:2:"ß±";i:230;s:2:"ß²";i:220;s:2:"ß³";i:230;s:3:"़";i:7;s:3:"à¥";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"à§";i:9;s:3:"਼";i:7;s:3:"à©";i:9;s:3:"઼";i:7;s:3:"à«";i:9;s:3:"଼";i:7;s:3:"à­";i:9;s:3:"à¯";i:9;s:3:"à±";i:9;s:3:"ౕ";i:84;s:3:"à±–";i:91;s:3:"಼";i:7;s:3:"à³";i:9;s:3:"àµ";i:9;s:3:"à·Š";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"á‚";i:220;s:3:"áŸ";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"áŸ";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"᬴";i:7;s:3:"á­„";i:9;s:3:"á­«";i:230;s:3:"á­¬";i:220;s:3:"á­­";i:230;s:3:"á­®";i:230;s:3:"á­¯";i:230;s:3:"á­°";i:230;s:3:"á­±";i:230;s:3:"á­²";i:230;s:3:"á­³";i:230;s:3:"᮪";i:9;s:3:"á°·";i:7;s:3:"á·€";i:230;s:3:"á·";i:230;s:3:"á·‚";i:220;s:3:"á·ƒ";i:230;s:3:"á·„";i:230;s:3:"á·…";i:230;s:3:"á·†";i:230;s:3:"á·‡";i:230;s:3:"á·ˆ";i:230;s:3:"á·‰";i:230;s:3:"á·Š";i:220;s:3:"á·‹";i:230;s:3:"á·Œ";i:230;s:3:"á·";i:234;s:3:"á·Ž";i:214;s:3:"á·";i:220;s:3:"á·";i:202;s:3:"á·‘";i:230;s:3:"á·’";i:230;s:3:"á·“";i:230;s:3:"á·”";i:230;s:3:"á·•";i:230;s:3:"á·–";i:230;s:3:"á·—";i:230;s:3:"á·˜";i:230;s:3:"á·™";i:230;s:3:"á·š";i:230;s:3:"á·›";i:230;s:3:"á·œ";i:230;s:3:"á·";i:230;s:3:"á·ž";i:230;s:3:"á·Ÿ";i:230;s:3:"á· ";i:230;s:3:"á·¡";i:230;s:3:"á·¢";i:230;s:3:"á·£";i:230;s:3:"á·¤";i:230;s:3:"á·¥";i:230;s:3:"á·¦";i:230;s:3:"á·¾";i:230;s:3:"á·¿";i:220;s:3:"âƒ";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"â· ";i:230;s:3:"â·¡";i:230;s:3:"â·¢";i:230;s:3:"â·£";i:230;s:3:"â·¤";i:230;s:3:"â·¥";i:230;s:3:"â·¦";i:230;s:3:"â·§";i:230;s:3:"â·¨";i:230;s:3:"â·©";i:230;s:3:"â·ª";i:230;s:3:"â·«";i:230;s:3:"â·¬";i:230;s:3:"â·­";i:230;s:3:"â·®";i:230;s:3:"â·¯";i:230;s:3:"â·°";i:230;s:3:"â·±";i:230;s:3:"â·²";i:230;s:3:"â·³";i:230;s:3:"â·´";i:230;s:3:"â·µ";i:230;s:3:"â·¶";i:230;s:3:"â··";i:230;s:3:"â·¸";i:230;s:3:"â·¹";i:230;s:3:"â·º";i:230;s:3:"â·»";i:230;s:3:"â·¼";i:230;s:3:"â·½";i:230;s:3:"â·¾";i:230;s:3:"â·¿";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"ã‚™";i:8;s:3:"ã‚š";i:8;s:3:"꙯";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"ê †";i:9;s:3:"꣄";i:9;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"ð‡½";i:220;s:4:"ð¨";i:220;s:4:"ð¨";i:230;s:4:"ð¨¸";i:230;s:4:"ð¨¹";i:1;s:4:"ð¨º";i:220;s:4:"ð¨¿";i:9;s:4:"ð…¥";i:216;s:4:"ð…¦";i:216;s:4:"ð…§";i:1;s:4:"ð…¨";i:1;s:4:"ð…©";i:1;s:4:"ð…­";i:226;s:4:"ð…®";i:216;s:4:"ð…¯";i:216;s:4:"ð…°";i:216;s:4:"ð…±";i:216;s:4:"ð…²";i:216;s:4:"ð…»";i:220;s:4:"ð…¼";i:220;s:4:"ð…½";i:220;s:4:"ð…¾";i:220;s:4:"ð…¿";i:220;s:4:"ð†€";i:220;s:4:"ð†";i:220;s:4:"ð†‚";i:220;s:4:"ð†…";i:230;s:4:"ð††";i:230;s:4:"ð†‡";i:230;s:4:"ð†ˆ";i:230;s:4:"ð†‰";i:230;s:4:"ð†Š";i:220;s:4:"ð†‹";i:220;s:4:"ð†ª";i:230;s:4:"ð†«";i:230;s:4:"ð†¬";i:230;s:4:"ð†­";i:230;s:4:"ð‰‚";i:230;s:4:"ð‰ƒ";i:230;s:4:"ð‰„";i:230;}' );
+UtfNormal::$utfCanonicalComp = unserialize( 'a:1862:{s:3:"AÌ€";s:2:"À";s:3:"AÌ";s:2:"Ã";s:3:"AÌ‚";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"AÌŠ";s:2:"Ã…";s:3:"Ç";s:2:"Ç";s:3:"EÌ€";s:2:"È";s:3:"EÌ";s:2:"É";s:3:"EÌ‚";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"IÌ€";s:2:"ÃŒ";s:3:"IÌ";s:2:"Ã";s:3:"IÌ‚";s:2:"ÃŽ";s:3:"Ï";s:2:"Ã";s:3:"Ñ";s:2:"Ñ";s:3:"OÌ€";s:2:"Ã’";s:3:"OÌ";s:2:"Ó";s:3:"OÌ‚";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"UÌ€";s:2:"Ù";s:3:"UÌ";s:2:"Ú";s:3:"UÌ‚";s:2:"Û";s:3:"Ü";s:2:"Ãœ";s:3:"YÌ";s:2:"Ã";s:3:"aÌ€";s:2:"à";s:3:"aÌ";s:2:"á";s:3:"aÌ‚";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"aÌŠ";s:2:"Ã¥";s:3:"ç";s:2:"ç";s:3:"eÌ€";s:2:"è";s:3:"eÌ";s:2:"é";s:3:"eÌ‚";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"iÌ€";s:2:"ì";s:3:"iÌ";s:2:"í";s:3:"iÌ‚";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"oÌ€";s:2:"ò";s:3:"oÌ";s:2:"ó";s:3:"oÌ‚";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"uÌ€";s:2:"ù";s:3:"uÌ";s:2:"ú";s:3:"uÌ‚";s:2:"û";s:3:"ü";s:2:"ü";s:3:"yÌ";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"AÌ„";s:2:"Ä€";s:3:"aÌ„";s:2:"Ä";s:3:"Ă";s:2:"Ä‚";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ä„";s:3:"ą";s:2:"Ä…";s:3:"CÌ";s:2:"Ć";s:3:"cÌ";s:2:"ć";s:3:"CÌ‚";s:2:"Ĉ";s:3:"cÌ‚";s:2:"ĉ";s:3:"Ċ";s:2:"ÄŠ";s:3:"ċ";s:2:"Ä‹";s:3:"CÌŒ";s:2:"ÄŒ";s:3:"cÌŒ";s:2:"Ä";s:3:"DÌŒ";s:2:"ÄŽ";s:3:"dÌŒ";s:2:"Ä";s:3:"EÌ„";s:2:"Ä’";s:3:"eÌ„";s:2:"Ä“";s:3:"Ĕ";s:2:"Ä”";s:3:"ĕ";s:2:"Ä•";s:3:"Ė";s:2:"Ä–";s:3:"ė";s:2:"Ä—";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"Ä™";s:3:"EÌŒ";s:2:"Äš";s:3:"eÌŒ";s:2:"Ä›";s:3:"GÌ‚";s:2:"Äœ";s:3:"gÌ‚";s:2:"Ä";s:3:"Ğ";s:2:"Äž";s:3:"ğ";s:2:"ÄŸ";s:3:"Ġ";s:2:"Ä ";s:3:"ġ";s:2:"Ä¡";s:3:"Ģ";s:2:"Ä¢";s:3:"ģ";s:2:"Ä£";s:3:"HÌ‚";s:2:"Ĥ";s:3:"hÌ‚";s:2:"Ä¥";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"Ä©";s:3:"IÌ„";s:2:"Ī";s:3:"iÌ„";s:2:"Ä«";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"Ä­";s:3:"Į";s:2:"Ä®";s:3:"į";s:2:"į";s:3:"İ";s:2:"Ä°";s:3:"JÌ‚";s:2:"Ä´";s:3:"jÌ‚";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"Ä·";s:3:"LÌ";s:2:"Ĺ";s:3:"lÌ";s:2:"ĺ";s:3:"Ļ";s:2:"Ä»";s:3:"ļ";s:2:"ļ";s:3:"LÌŒ";s:2:"Ľ";s:3:"lÌŒ";s:2:"ľ";s:3:"NÌ";s:2:"Ń";s:3:"nÌ";s:2:"Å„";s:3:"Ņ";s:2:"Å…";s:3:"ņ";s:2:"ņ";s:3:"NÌŒ";s:2:"Ň";s:3:"nÌŒ";s:2:"ň";s:3:"OÌ„";s:2:"ÅŒ";s:3:"oÌ„";s:2:"Å";s:3:"Ŏ";s:2:"ÅŽ";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å";s:3:"oÌ‹";s:2:"Å‘";s:3:"RÌ";s:2:"Å”";s:3:"rÌ";s:2:"Å•";s:3:"Ŗ";s:2:"Å–";s:3:"ŗ";s:2:"Å—";s:3:"RÌŒ";s:2:"Ř";s:3:"rÌŒ";s:2:"Å™";s:3:"SÌ";s:2:"Åš";s:3:"sÌ";s:2:"Å›";s:3:"SÌ‚";s:2:"Åœ";s:3:"sÌ‚";s:2:"Å";s:3:"Ş";s:2:"Åž";s:3:"ş";s:2:"ÅŸ";s:3:"SÌŒ";s:2:"Å ";s:3:"sÌŒ";s:2:"Å¡";s:3:"Ţ";s:2:"Å¢";s:3:"ţ";s:2:"Å£";s:3:"TÌŒ";s:2:"Ť";s:3:"tÌŒ";s:2:"Å¥";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"Å©";s:3:"UÌ„";s:2:"Ū";s:3:"uÌ„";s:2:"Å«";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"Å­";s:3:"UÌŠ";s:2:"Å®";s:3:"uÌŠ";s:2:"ů";s:3:"UÌ‹";s:2:"Å°";s:3:"uÌ‹";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"WÌ‚";s:2:"Å´";s:3:"wÌ‚";s:2:"ŵ";s:3:"YÌ‚";s:2:"Ŷ";s:3:"yÌ‚";s:2:"Å·";s:3:"Ÿ";s:2:"Ÿ";s:3:"ZÌ";s:2:"Ź";s:3:"zÌ";s:2:"ź";s:3:"Ż";s:2:"Å»";s:3:"ż";s:2:"ż";s:3:"ZÌŒ";s:2:"Ž";s:3:"zÌŒ";s:2:"ž";s:3:"OÌ›";s:2:"Æ ";s:3:"oÌ›";s:2:"Æ¡";s:3:"UÌ›";s:2:"Ư";s:3:"uÌ›";s:2:"Æ°";s:3:"AÌŒ";s:2:"Ç";s:3:"aÌŒ";s:2:"ÇŽ";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç";s:3:"OÌŒ";s:2:"Ç‘";s:3:"oÌŒ";s:2:"Ç’";s:3:"UÌŒ";s:2:"Ç“";s:3:"uÌŒ";s:2:"Ç”";s:4:"Ǖ";s:2:"Ç•";s:4:"ǖ";s:2:"Ç–";s:4:"ÃœÌ";s:2:"Ç—";s:4:"üÌ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ç™";s:4:"ǚ";s:2:"Çš";s:4:"Ǜ";s:2:"Ç›";s:4:"ǜ";s:2:"Çœ";s:4:"Ǟ";s:2:"Çž";s:4:"ǟ";s:2:"ÇŸ";s:4:"Ǡ";s:2:"Ç ";s:4:"ǡ";s:2:"Ç¡";s:4:"Ǣ";s:2:"Ç¢";s:4:"ǣ";s:2:"Ç£";s:3:"GÌŒ";s:2:"Ǧ";s:3:"gÌŒ";s:2:"ǧ";s:3:"KÌŒ";s:2:"Ǩ";s:3:"kÌŒ";s:2:"Ç©";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"Ç«";s:4:"Ǭ";s:2:"Ǭ";s:4:"Ç«Ì„";s:2:"Ç­";s:4:"Æ·ÌŒ";s:2:"Ç®";s:4:"Ê’ÌŒ";s:2:"ǯ";s:3:"jÌŒ";s:2:"Ç°";s:3:"GÌ";s:2:"Ç´";s:3:"gÌ";s:2:"ǵ";s:3:"NÌ€";s:2:"Ǹ";s:3:"nÌ€";s:2:"ǹ";s:4:"Ã…Ì";s:2:"Ǻ";s:4:"Ã¥Ì";s:2:"Ç»";s:4:"ÆÌ";s:2:"Ǽ";s:4:"æÌ";s:2:"ǽ";s:4:"ØÌ";s:2:"Ǿ";s:4:"øÌ";s:2:"Ç¿";s:3:"AÌ";s:2:"È€";s:3:"aÌ";s:2:"È";s:3:"AÌ‘";s:2:"È‚";s:3:"aÌ‘";s:2:"ȃ";s:3:"EÌ";s:2:"È„";s:3:"eÌ";s:2:"È…";s:3:"EÌ‘";s:2:"Ȇ";s:3:"eÌ‘";s:2:"ȇ";s:3:"IÌ";s:2:"Ȉ";s:3:"iÌ";s:2:"ȉ";s:3:"IÌ‘";s:2:"ÈŠ";s:3:"iÌ‘";s:2:"È‹";s:3:"OÌ";s:2:"ÈŒ";s:3:"oÌ";s:2:"È";s:3:"OÌ‘";s:2:"ÈŽ";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È";s:3:"rÌ";s:2:"È‘";s:3:"RÌ‘";s:2:"È’";s:3:"rÌ‘";s:2:"È“";s:3:"UÌ";s:2:"È”";s:3:"uÌ";s:2:"È•";s:3:"UÌ‘";s:2:"È–";s:3:"uÌ‘";s:2:"È—";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"È™";s:3:"Ț";s:2:"Èš";s:3:"ț";s:2:"È›";s:3:"HÌŒ";s:2:"Èž";s:3:"hÌŒ";s:2:"ÈŸ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"È©";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"È«";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"È­";s:3:"Ȯ";s:2:"È®";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"È°";s:4:"ȱ";s:2:"ȱ";s:3:"YÌ„";s:2:"Ȳ";s:3:"yÌ„";s:2:"ȳ";s:2:"Ì€";s:2:"Í€";s:2:"Ì";s:2:"Í";s:2:"Ì“";s:2:"̓";s:4:"̈Ì";s:2:"Í„";s:2:"ʹ";s:2:"Í´";s:1:";";s:2:";";s:4:"¨Ì";s:2:"Î…";s:4:"ΑÌ";s:2:"Ά";s:2:"·";s:2:"·";s:4:"ΕÌ";s:2:"Έ";s:4:"ΗÌ";s:2:"Ή";s:4:"ΙÌ";s:2:"Ί";s:4:"ΟÌ";s:2:"ÎŒ";s:4:"Î¥Ì";s:2:"ÎŽ";s:4:"ΩÌ";s:2:"Î";s:4:"ÏŠÌ";s:2:"Î";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"αÌ";s:2:"ά";s:4:"εÌ";s:2:"έ";s:4:"ηÌ";s:2:"ή";s:4:"ιÌ";s:2:"ί";s:4:"Ï‹Ì";s:2:"ΰ";s:4:"ϊ";s:2:"ÏŠ";s:4:"ϋ";s:2:"Ï‹";s:4:"οÌ";s:2:"ÏŒ";s:4:"Ï…Ì";s:2:"Ï";s:4:"ωÌ";s:2:"ÏŽ";s:4:"Ï’Ì";s:2:"Ï“";s:4:"ϔ";s:2:"Ï”";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ð";s:4:"ГÌ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"КÌ";s:2:"ÐŒ";s:4:"Ѝ";s:2:"Ð";s:4:"Ў";s:2:"ÐŽ";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"Ñ";s:4:"ё";s:2:"Ñ‘";s:4:"гÌ";s:2:"Ñ“";s:4:"ї";s:2:"Ñ—";s:4:"кÌ";s:2:"Ñœ";s:4:"ѝ";s:2:"Ñ";s:4:"ў";s:2:"Ñž";s:4:"Ñ´Ì";s:2:"Ѷ";s:4:"ѵÌ";s:2:"Ñ·";s:4:"Ӂ";s:2:"Ó";s:4:"ӂ";s:2:"Ó‚";s:4:"Ð̆";s:2:"Ó";s:4:"ӑ";s:2:"Ó‘";s:4:"Ð̈";s:2:"Ó’";s:4:"ӓ";s:2:"Ó“";s:4:"Ӗ";s:2:"Ó–";s:4:"ӗ";s:2:"Ó—";s:4:"Ӛ";s:2:"Óš";s:4:"ӛ";s:2:"Ó›";s:4:"Ӝ";s:2:"Óœ";s:4:"ӝ";s:2:"Ó";s:4:"Ӟ";s:2:"Óž";s:4:"ӟ";s:2:"ÓŸ";s:4:"Ӣ";s:2:"Ó¢";s:4:"ӣ";s:2:"Ó£";s:4:"Ӥ";s:2:"Ó¤";s:4:"ӥ";s:2:"Ó¥";s:4:"Ӧ";s:2:"Ó¦";s:4:"ӧ";s:2:"Ó§";s:4:"Ӫ";s:2:"Óª";s:4:"ӫ";s:2:"Ó«";s:4:"Ӭ";s:2:"Ó¬";s:4:"Ñ̈";s:2:"Ó­";s:4:"Ӯ";s:2:"Ó®";s:4:"ӯ";s:2:"Ó¯";s:4:"Ӱ";s:2:"Ó°";s:4:"ӱ";s:2:"Ó±";s:4:"Ӳ";s:2:"Ó²";s:4:"ӳ";s:2:"Ó³";s:4:"Ӵ";s:2:"Ó´";s:4:"ӵ";s:2:"Óµ";s:4:"Ӹ";s:2:"Ó¸";s:4:"ӹ";s:2:"Ó¹";s:4:"آ";s:2:"Ø¢";s:4:"أ";s:2:"Ø£";s:4:"ÙˆÙ”";s:2:"ؤ";s:4:"إ";s:2:"Ø¥";s:4:"ÙŠÙ”";s:2:"ئ";s:4:"Û•Ù”";s:2:"Û€";s:4:"ÛÙ”";s:2:"Û‚";s:4:"Û’Ù”";s:2:"Û“";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"à­ˆ";s:6:"ୋ";s:3:"à­‹";s:6:"ୌ";s:3:"à­Œ";s:6:"ஔ";s:3:"à®”";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"à³€";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"à·š";s:6:"à·™à·";s:3:"à·œ";s:6:"ෝ";s:3:"à·";s:6:"ෞ";s:3:"à·ž";s:6:"ཱི";s:3:"ཱི";s:6:"ཱུ";s:3:"ཱུ";s:6:"ཱྀ";s:3:"à¾";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"á¬á¬µ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"á­€";s:6:"ᭁ";s:3:"á­";s:6:"ᭃ";s:3:"á­ƒ";s:3:"AÌ¥";s:3:"Ḁ";s:3:"aÌ¥";s:3:"á¸";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"BÌ£";s:3:"Ḅ";s:3:"bÌ£";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"ÇÌ";s:3:"Ḉ";s:4:"çÌ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"DÌ£";s:3:"Ḍ";s:3:"dÌ£";s:3:"á¸";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"á¸";s:3:"ḑ";s:3:"ḑ";s:3:"DÌ­";s:3:"Ḓ";s:3:"dÌ­";s:3:"ḓ";s:4:"Ä’Ì€";s:3:"Ḕ";s:4:"Ä“Ì€";s:3:"ḕ";s:4:"Ä’Ì";s:3:"Ḗ";s:4:"Ä“Ì";s:3:"ḗ";s:3:"EÌ­";s:3:"Ḙ";s:3:"eÌ­";s:3:"ḙ";s:3:"EÌ°";s:3:"Ḛ";s:3:"eÌ°";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"á¸";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"GÌ„";s:3:"Ḡ";s:3:"gÌ„";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"HÌ£";s:3:"Ḥ";s:3:"hÌ£";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"HÌ®";s:3:"Ḫ";s:3:"hÌ®";s:3:"ḫ";s:3:"IÌ°";s:3:"Ḭ";s:3:"iÌ°";s:3:"ḭ";s:4:"ÃÌ";s:3:"Ḯ";s:4:"ïÌ";s:3:"ḯ";s:3:"KÌ";s:3:"Ḱ";s:3:"kÌ";s:3:"ḱ";s:3:"KÌ£";s:3:"Ḳ";s:3:"kÌ£";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"LÌ£";s:3:"Ḷ";s:3:"lÌ£";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"LÌ­";s:3:"Ḽ";s:3:"lÌ­";s:3:"ḽ";s:3:"MÌ";s:3:"Ḿ";s:3:"mÌ";s:3:"ḿ";s:3:"Ṁ";s:3:"á¹€";s:3:"ṁ";s:3:"á¹";s:3:"MÌ£";s:3:"Ṃ";s:3:"mÌ£";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"á¹…";s:3:"NÌ£";s:3:"Ṇ";s:3:"nÌ£";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"NÌ­";s:3:"Ṋ";s:3:"nÌ­";s:3:"ṋ";s:4:"ÕÌ";s:3:"Ṍ";s:4:"õÌ";s:3:"á¹";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"á¹";s:4:"Ṑ";s:3:"á¹";s:4:"ÅÌ€";s:3:"ṑ";s:4:"ÅŒÌ";s:3:"á¹’";s:4:"ÅÌ";s:3:"ṓ";s:3:"PÌ";s:3:"á¹”";s:3:"pÌ";s:3:"ṕ";s:3:"Ṗ";s:3:"á¹–";s:3:"ṗ";s:3:"á¹—";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"á¹™";s:3:"RÌ£";s:3:"Ṛ";s:3:"rÌ£";s:3:"á¹›";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"á¹";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"á¹ ";s:3:"ṡ";s:3:"ṡ";s:3:"SÌ£";s:3:"á¹¢";s:3:"sÌ£";s:3:"á¹£";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"á¹¥";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"TÌ£";s:3:"Ṭ";s:3:"tÌ£";s:3:"á¹­";s:3:"Ṯ";s:3:"á¹®";s:3:"ṯ";s:3:"ṯ";s:3:"TÌ­";s:3:"á¹°";s:3:"tÌ­";s:3:"á¹±";s:3:"Ṳ";s:3:"á¹²";s:3:"ṳ";s:3:"á¹³";s:3:"UÌ°";s:3:"á¹´";s:3:"uÌ°";s:3:"á¹µ";s:3:"UÌ­";s:3:"Ṷ";s:3:"uÌ­";s:3:"á¹·";s:4:"ŨÌ";s:3:"Ṹ";s:4:"Å©Ì";s:3:"á¹¹";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"á¹»";s:3:"Ṽ";s:3:"á¹¼";s:3:"ṽ";s:3:"á¹½";s:3:"VÌ£";s:3:"á¹¾";s:3:"vÌ£";s:3:"ṿ";s:3:"WÌ€";s:3:"Ẁ";s:3:"wÌ€";s:3:"áº";s:3:"WÌ";s:3:"Ẃ";s:3:"wÌ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"WÌ£";s:3:"Ẉ";s:3:"wÌ£";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"áº";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"áº";s:3:"zÌ‚";s:3:"ẑ";s:3:"ZÌ£";s:3:"Ẓ";s:3:"zÌ£";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"wÌŠ";s:3:"ẘ";s:3:"yÌŠ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"AÌ£";s:3:"Ạ";s:3:"aÌ£";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"ÂÌ";s:3:"Ấ";s:4:"âÌ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ä‚Ì";s:3:"Ắ";s:4:"ăÌ";s:3:"ắ";s:4:"Ä‚Ì€";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"EÌ£";s:3:"Ẹ";s:3:"eÌ£";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"ÊÌ";s:3:"Ế";s:4:"êÌ";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"á»";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"á»…";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"IÌ£";s:3:"Ị";s:3:"iÌ£";s:3:"ị";s:3:"OÌ£";s:3:"Ọ";s:3:"oÌ£";s:3:"á»";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"á»";s:4:"ÔÌ";s:3:"á»";s:4:"ôÌ";s:3:"ố";s:4:"Ồ";s:3:"á»’";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"á»”";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"á»–";s:4:"ỗ";s:3:"á»—";s:5:"Ộ";s:3:"Ộ";s:5:"á»Ì‚";s:3:"á»™";s:4:"Æ Ì";s:3:"Ớ";s:4:"Æ¡Ì";s:3:"á»›";s:4:"Ờ";s:3:"Ờ";s:4:"Æ¡Ì€";s:3:"á»";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"á» ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"Æ¡Ì£";s:3:"ợ";s:3:"UÌ£";s:3:"Ụ";s:3:"uÌ£";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"ƯÌ";s:3:"Ứ";s:4:"Æ°Ì";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"Æ°Ì€";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"á»­";s:4:"Ữ";s:3:"á»®";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"á»°";s:4:"Æ°Ì£";s:3:"á»±";s:3:"YÌ€";s:3:"Ỳ";s:3:"yÌ€";s:3:"ỳ";s:3:"YÌ£";s:3:"á»´";s:3:"yÌ£";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"á»·";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"á¼€";s:4:"ἁ";s:3:"á¼";s:5:"ἂ";s:3:"ἂ";s:5:"á¼Ì€";s:3:"ἃ";s:5:"á¼€Ì";s:3:"ἄ";s:5:"á¼Ì";s:3:"á¼…";s:5:"ἆ";s:3:"ἆ";s:5:"á¼Í‚";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"ἈÌ";s:3:"Ἄ";s:5:"ἉÌ";s:3:"á¼";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"á¼";s:4:"ἑ";s:3:"ἑ";s:5:"á¼Ì€";s:3:"á¼’";s:5:"ἓ";s:3:"ἓ";s:5:"á¼Ì";s:3:"á¼”";s:5:"ἑÌ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"á¼™";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"á¼›";s:5:"ἘÌ";s:3:"Ἔ";s:5:"á¼™Ì";s:3:"á¼";s:4:"ἠ";s:3:"á¼ ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"á¼¢";s:5:"ἣ";s:3:"á¼£";s:5:"á¼ Ì";s:3:"ἤ";s:5:"ἡÌ";s:3:"á¼¥";s:5:"á¼ Í‚";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"ἨÌ";s:3:"Ἤ";s:5:"ἩÌ";s:3:"á¼­";s:5:"Ἦ";s:3:"á¼®";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"á¼°";s:4:"ἱ";s:3:"á¼±";s:5:"á¼°Ì€";s:3:"á¼²";s:5:"ἳ";s:3:"á¼³";s:5:"á¼°Ì";s:3:"á¼´";s:5:"á¼±Ì";s:3:"á¼µ";s:5:"á¼°Í‚";s:3:"ἶ";s:5:"ἷ";s:3:"á¼·";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"á¼¹";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"á¼»";s:5:"ἸÌ";s:3:"á¼¼";s:5:"á¼¹Ì";s:3:"á¼½";s:5:"Ἶ";s:3:"á¼¾";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"á½€";s:4:"ὁ";s:3:"á½";s:5:"ὂ";s:3:"ὂ";s:5:"á½Ì€";s:3:"ὃ";s:5:"á½€Ì";s:3:"ὄ";s:5:"á½Ì";s:3:"á½…";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"ὈÌ";s:3:"Ὄ";s:5:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"á½";s:4:"Ï…Ì”";s:3:"ὑ";s:5:"á½Ì€";s:3:"á½’";s:5:"ὓ";s:3:"ὓ";s:5:"á½Ì";s:3:"á½”";s:5:"ὑÌ";s:3:"ὕ";s:5:"á½Í‚";s:3:"á½–";s:5:"ὗ";s:3:"á½—";s:4:"Ὑ";s:3:"á½™";s:5:"Ὓ";s:3:"á½›";s:5:"á½™Ì";s:3:"á½";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"á½ ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"á½¢";s:5:"ὣ";s:3:"á½£";s:5:"á½ Ì";s:3:"ὤ";s:5:"ὡÌ";s:3:"á½¥";s:5:"á½ Í‚";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"ὨÌ";s:3:"Ὤ";s:5:"ὩÌ";s:3:"á½­";s:5:"Ὦ";s:3:"á½®";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"á½°";s:2:"ά";s:3:"á½±";s:4:"ὲ";s:3:"á½²";s:2:"έ";s:3:"á½³";s:4:"ὴ";s:3:"á½´";s:2:"ή";s:3:"á½µ";s:4:"ὶ";s:3:"ὶ";s:2:"ί";s:3:"á½·";s:4:"ὸ";s:3:"ὸ";s:2:"ÏŒ";s:3:"á½¹";s:4:"Ï…Ì€";s:3:"ὺ";s:2:"Ï";s:3:"á½»";s:4:"ὼ";s:3:"á½¼";s:2:"ÏŽ";s:3:"á½½";s:5:"ᾀ";s:3:"á¾€";s:5:"á¼Í…";s:3:"á¾";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"á¼…Í…";s:3:"á¾…";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"á¼Í…";s:3:"á¾";s:5:"ᾎ";s:3:"ᾎ";s:5:"á¼Í…";s:3:"á¾";s:5:"á¼ Í…";s:3:"á¾";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"á¾’";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"á¾”";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"á¾–";s:5:"ᾗ";s:3:"á¾—";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"á¾™";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"á¾›";s:5:"ᾜ";s:3:"ᾜ";s:5:"á¼­Í…";s:3:"á¾";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"á½ Í…";s:3:"á¾ ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"á¾¢";s:5:"ᾣ";s:3:"á¾£";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"á¾¥";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"á½­Í…";s:3:"á¾­";s:5:"ᾮ";s:3:"á¾®";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"á¾°";s:4:"ᾱ";s:3:"á¾±";s:5:"á½°Í…";s:3:"á¾²";s:4:"ᾳ";s:3:"á¾³";s:4:"ᾴ";s:3:"á¾´";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"á¾·";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"á¾¹";s:4:"Ὰ";s:3:"Ὰ";s:2:"Ά";s:3:"á¾»";s:4:"ᾼ";s:3:"á¾¼";s:2:"ι";s:3:"á¾¾";s:4:"῁";s:3:"á¿";s:5:"á½´Í…";s:3:"á¿‚";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"á¿„";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:2:"Έ";s:3:"Έ";s:4:"Ὴ";s:3:"á¿Š";s:2:"Ή";s:3:"á¿‹";s:4:"ῌ";s:3:"á¿Œ";s:5:"῍";s:3:"á¿";s:5:"᾿Ì";s:3:"á¿Ž";s:5:"῏";s:3:"á¿";s:4:"ῐ";s:3:"á¿";s:4:"ῑ";s:3:"á¿‘";s:4:"ÏŠÌ€";s:3:"á¿’";s:2:"Î";s:3:"á¿“";s:4:"ῖ";s:3:"á¿–";s:4:"ÏŠÍ‚";s:3:"á¿—";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"á¿™";s:4:"Ὶ";s:3:"á¿š";s:2:"Ί";s:3:"á¿›";s:5:"῝";s:3:"á¿";s:5:"῾Ì";s:3:"á¿ž";s:5:"῟";s:3:"á¿Ÿ";s:4:"ῠ";s:3:"á¿ ";s:4:"Ï…Ì„";s:3:"á¿¡";s:4:"Ï‹Ì€";s:3:"á¿¢";s:2:"ΰ";s:3:"á¿£";s:4:"ÏÌ“";s:3:"ῤ";s:4:"ÏÌ”";s:3:"á¿¥";s:4:"Ï…Í‚";s:3:"ῦ";s:4:"Ï‹Í‚";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"á¿©";s:4:"Ὺ";s:3:"Ὺ";s:2:"ÎŽ";s:3:"á¿«";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"á¿­";s:2:"Î…";s:3:"á¿®";s:1:"`";s:3:"`";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ÏŽÍ…";s:3:"á¿´";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"á¿·";s:4:"Ὸ";s:3:"Ὸ";s:2:"ÎŒ";s:3:"Ό";s:4:"Ὼ";s:3:"Ὼ";s:2:"Î";s:3:"á¿»";s:4:"ῼ";s:3:"ῼ";s:2:"´";s:3:"´";s:3:" ";s:3:" ";s:3:" ";s:3:"â€";s:2:"Ω";s:3:"Ω";s:1:"K";s:3:"K";s:2:"Ã…";s:3:"â„«";s:5:"â†Ì¸";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"â‡Ì¸";s:3:"â‡";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"â‡";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"â‰";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"â‰Ì¸";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"âŠ";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"â‹ ";s:5:"⋡";s:3:"â‹¡";s:5:"⋢";s:3:"â‹¢";s:5:"⋣";s:3:"â‹£";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"â‹«";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"â‹­";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:6:"ã‹ã‚™";s:3:"ãŒ";s:6:"ãã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ã‘ã‚™";s:3:"ã’";s:6:"ã“ã‚™";s:3:"ã”";s:6:"ã•ã‚™";s:3:"ã–";s:6:"ã—ã‚™";s:3:"ã˜";s:6:"ã™ã‚™";s:3:"ãš";s:6:"ã›ã‚™";s:3:"ãœ";s:6:"ãã‚™";s:3:"ãž";s:6:"ãŸã‚™";s:3:"ã ";s:6:"ã¡ã‚™";s:3:"ã¢";s:6:"ã¤ã‚™";s:3:"ã¥";s:6:"ã¦ã‚™";s:3:"ã§";s:6:"ã¨ã‚™";s:3:"ã©";s:6:"ã¯ã‚™";s:3:"ã°";s:6:"ã¯ã‚š";s:3:"ã±";s:6:"ã²ã‚™";s:3:"ã³";s:6:"ã²ã‚š";s:3:"ã´";s:6:"ãµã‚™";s:3:"ã¶";s:6:"ãµã‚š";s:3:"ã·";s:6:"ã¸ã‚™";s:3:"ã¹";s:6:"ã¸ã‚š";s:3:"ãº";s:6:"ã»ã‚™";s:3:"ã¼";s:6:"ã»ã‚š";s:3:"ã½";s:6:"ã†ã‚™";s:3:"ã‚”";s:6:"ã‚ã‚™";s:3:"ã‚ž";s:6:"ã‚«ã‚™";s:3:"ガ";s:6:"ã‚­ã‚™";s:3:"ã‚®";s:6:"グ";s:3:"ã‚°";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ã‚´";s:6:"ザ";s:3:"ザ";s:6:"ã‚·ã‚™";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ã‚¿ã‚™";s:3:"ダ";s:6:"ãƒã‚™";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"ãƒã‚™";s:3:"ãƒ";s:6:"ãƒã‚š";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ãƒ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:3:"豈";s:3:"豈";s:3:"æ›´";s:3:"ï¤";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"å¥";s:3:"句";s:3:"龜";s:3:"ï«Ž";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"å–‡";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:4:"懶";s:3:"癩";s:3:"癩";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"ï¤";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"é‚";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"æ´›";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"çž";s:3:"珞";s:3:"è½";s:3:"落";s:3:"é…ª";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"åµ";s:3:"卵";s:3:"欄";s:3:"ï¤";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"åµ";s:3:"嵐";s:3:"æ¿«";s:3:"濫";s:3:"è—";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"è Ÿ";s:3:"蠟";s:3:"廊";s:4:"廊";s:3:"朗";s:4:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"å‹ž";s:3:"勞";s:3:"æ“„";s:3:"擄";s:3:"æ«“";s:3:"櫓";s:3:"çˆ";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"è€";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:4:"虜";s:3:"è·¯";s:3:"路";s:3:"露";s:3:"露";s:3:"é­¯";s:3:"魯";s:3:"é·º";s:3:"鷺";s:3:"碌";s:4:"ð¯¥";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"è‰";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"è«–";s:3:"ï¥";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"ç± ";s:3:"籠";s:3:"è¾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"é›·";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"å±¢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"æ·š";s:3:"ï¥";s:3:"æ¼";s:3:"漏";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"ï¥";s:3:"陋";s:3:"陋";s:3:"å‹’";s:3:"勒";s:3:"è‚‹";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"è±";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"æ‹";s:3:"拏";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:4:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"ç•°";s:4:"異";s:3:"北";s:4:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"ä¸";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"ç´¢";s:3:"索";s:3:"åƒ";s:3:"參";s:3:"å¡ž";s:3:"塞";s:3:"çœ";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:4:"殺";s:3:"è¾°";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"è‹¥";s:4:"若";s:3:"掠";s:3:"掠";s:3:"ç•¥";s:3:"略";s:3:"亮";s:3:"亮";s:3:"å…©";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"æ¢";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"è«’";s:3:"諒";s:3:"é‡";s:3:"量";s:3:"勵";s:3:"勵";s:3:"å‘‚";s:3:"呂";s:3:"女";s:3:"ï¦";s:3:"廬";s:3:"廬";s:3:"æ—…";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"é–­";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"æ­·";s:3:"歷";s:3:"è½¢";s:3:"ï¦";s:3:"å¹´";s:3:"年";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"ï¦";s:3:"æ’š";s:3:"撚";s:3:"æ¼£";s:3:"漣";s:3:"ç…‰";s:3:"煉";s:3:"ç’‰";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"ç·´";s:3:"練";s:3:"è¯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"è“®";s:3:"蓮";s:3:"連";s:3:"連";s:3:"éŠ";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"ï¦";s:3:"å’½";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"æ»";s:3:"捻";s:3:"æ®®";s:3:"殮";s:3:"ç°¾";s:3:"簾";s:3:"çµ";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"ç‘©";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"è†";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"éˆ";s:3:"靈";s:3:"é ˜";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"å°¿";s:3:"尿";s:3:"æ–™";s:3:"料";s:3:"燎";s:3:"燎";s:3:"療";s:3:"ï§";s:3:"蓼";s:3:"蓼";s:3:"é¼";s:3:"遼";s:3:"é¾";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"æ»";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"æµ";s:4:"流";s:3:"溜";s:3:"溜";s:3:"ç‰";s:3:"琉";s:3:"ç•™";s:3:"ï§";s:3:"ç¡«";s:3:"硫";s:3:"ç´";s:3:"ï§";s:3:"é¡ž";s:3:"ï§";s:3:"å…­";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"å´™";s:3:"崙";s:3:"æ·ª";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"æ…„";s:3:"慄";s:3:"æ —";s:3:"栗";s:3:"隆";s:3:"隆";s:3:"利";s:3:"ï§";s:3:"å";s:3:"吏";s:3:"å±¥";s:3:"履";s:3:"易";s:3:"易";s:3:"æŽ";s:3:"李";s:3:"梨";s:3:"梨";s:3:"æ³¥";s:3:"泥";s:3:"ç†";s:3:"理";s:3:"ç—¢";s:3:"痢";s:3:"ç½¹";s:3:"罹";s:3:"è£";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"å";s:3:"吝";s:3:"ç‡";s:3:"燐";s:3:"ç’˜";s:3:"璘";s:3:"è—º";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"é±—";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"æž—";s:3:"林";s:3:"æ·‹";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"ç«‹";s:3:"立";s:3:"笠";s:3:"笠";s:3:"ç²’";s:3:"粒";s:3:"ç‹€";s:3:"狀";s:3:"ç‚™";s:3:"炙";s:3:"è­˜";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:4:"ð¯¡";s:3:"度";s:3:"ï¨";s:3:"æ‹“";s:3:"拓";s:3:"ç³–";s:3:"糖";s:3:"å®…";s:3:"宅";s:3:"æ´ž";s:3:"洞";s:3:"æš´";s:3:"暴";s:3:"è¼»";s:3:"輻";s:3:"è¡Œ";s:3:"行";s:3:"é™";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"å…€";s:3:"兀";s:3:"å—€";s:3:"ï¨";s:3:"å¡š";s:3:"塚";s:3:"æ™´";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"ç¦";s:4:"福";s:3:"é–";s:3:"靖";s:3:"ç²¾";s:3:"ï¨";s:3:"ç¾½";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"ä¾®";s:4:"侮";s:3:"僧";s:4:"僧";s:3:"å…";s:4:"免";s:3:"勉";s:4:"勉";s:3:"勤";s:4:"勤";s:3:"å‘";s:4:"卑";s:3:"å–";s:3:"喝";s:3:"嘆";s:4:"嘆";s:3:"器";s:3:"器";s:3:"å¡€";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"å±®";s:4:"屮";s:3:"æ‚”";s:4:"悔";s:3:"æ…¨";s:3:"慨";s:3:"憎";s:4:"憎";s:3:"懲";s:4:"懲";s:3:"æ•";s:4:"敏";s:3:"æ—¢";s:3:"ï©‚";s:3:"æš‘";s:4:"ð¯£";s:3:"梅";s:4:"梅";s:3:"æµ·";s:4:"ð¯¤";s:3:"渚";s:3:"渚";s:3:"æ¼¢";s:3:"漢";s:3:"ç…®";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"ç¢";s:3:"ï©Š";s:3:"碑";s:3:"ï©‹";s:3:"社";s:3:"ï©Œ";s:3:"祉";s:3:"ï©";s:3:"祈";s:3:"ï©Ž";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:4:"祖";s:3:"ç¥";s:3:"ï©‘";s:3:"ç¦";s:3:"ï©’";s:3:"禎";s:3:"ï©“";s:3:"ç©€";s:4:"穀";s:3:"çª";s:3:"ï©•";s:3:"節";s:3:"節";s:3:"縉";s:3:"縉";s:3:"ç¹";s:3:"ï©™";s:3:"ç½²";s:3:"ï©š";s:3:"者";s:4:"者";s:3:"臭";s:3:"ï©œ";s:3:"艹";s:3:"ï©ž";s:3:"è‘—";s:4:"著";s:3:"è¤";s:3:"ï© ";s:3:"視";s:3:"視";s:3:"è¬";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"è´ˆ";s:3:"ï«";s:3:"辶";s:3:"辶";s:3:"難";s:3:"難";s:3:"響";s:3:"ï«Š";s:3:"é »";s:3:"ï«Œ";s:3:"並";s:3:"ï©°";s:3:"况";s:4:"况";s:3:"å…¨";s:3:"全";s:3:"ä¾€";s:3:"侀";s:3:"å……";s:3:"ï©´";s:3:"冀";s:3:"冀";s:3:"勇";s:4:"勇";s:3:"勺";s:4:"勺";s:3:"å••";s:3:"啕";s:3:"å–™";s:4:"喙";s:3:"å—¢";s:3:"ï©»";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"ï©¿";s:3:"å©¢";s:3:"婢";s:3:"嬨";s:3:"ïª";s:3:"å»’";s:3:"廒";s:3:"å»™";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"å¾­";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"æ…Ž";s:4:"慎";s:3:"愈";s:3:"愈";s:3:"æ… ";s:3:"慠";s:3:"戴";s:3:"戴";s:3:"æ„";s:3:"ïª";s:3:"æœ";s:3:"搜";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"ïª";s:3:"望";s:4:"望";s:3:"æ–";s:3:"杖";s:3:"æ­¹";s:3:"歹";s:3:"æ»›";s:3:"滛";s:3:"滋";s:4:"滋";s:3:"瀞";s:4:"瀞";s:3:"瞧";s:3:"ïª";s:3:"爵";s:4:"爵";s:3:"犯";s:3:"犯";s:3:"瑱";s:4:"瑱";s:3:"甆";s:3:"甆";s:3:"ç”»";s:3:"画";s:3:"ç˜";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"ç››";s:3:"盛";s:3:"ç›´";s:4:"直";s:3:"çŠ";s:4:"睊";s:3:"ç€";s:3:"着";s:3:"磌";s:4:"ð¯¥";s:3:"窱";s:3:"窱";s:3:"ç±»";s:3:"类";s:3:"çµ›";s:3:"絛";s:3:"ç¼¾";s:3:"缾";s:3:"è’";s:3:"荒";s:3:"è¯";s:3:"華";s:3:"è¹";s:4:"蝹";s:3:"è¥";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"調";s:3:"調";s:3:"è«‹";s:3:"請";s:3:"è«­";s:4:"ð¯§";s:3:"變";s:4:"變";s:3:"輸";s:4:"輸";s:3:"é²";s:3:"遲";s:3:"醙";s:3:"ï«„";s:3:"鉶";s:3:"ï«…";s:3:"陼";s:3:"陼";s:3:"韛";s:3:"韛";s:3:"é ‹";s:4:"頋";s:3:"鬒";s:4:"鬒";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«";s:4:"ð£•";s:3:"ï«‘";s:3:"ã®";s:4:"㮝";s:3:"䀘";s:3:"ï«“";s:3:"䀹";s:4:"䀹";s:4:"𥉉";s:3:"ï«•";s:4:"ð¥³";s:3:"ï«–";s:4:"𧻓";s:3:"ï«—";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"ï«™";s:3:"丽";s:4:"丽";s:3:"丸";s:4:"ð¯ ";s:3:"ä¹";s:4:"乁";s:4:"ð „¢";s:4:"𠄢";s:3:"ä½ ";s:4:"你";s:3:"ä¾»";s:4:"侻";s:3:"倂";s:4:"倂";s:3:"åº";s:4:"偺";s:3:"å‚™";s:4:"備";s:3:"åƒ";s:4:"像";s:3:"ã’ž";s:4:"㒞";s:4:"𠘺";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"ð¯ ";s:3:"å…·";s:4:"具";s:4:"𠔜";s:4:"𠔜";s:3:"ã’¹";s:4:"㒹";s:3:"å…§";s:4:"內";s:3:"å†";s:4:"再";s:4:"ð •‹";s:4:"𠕋";s:3:"冗";s:4:"冗";s:3:"冤";s:4:"冤";s:3:"仌";s:4:"仌";s:3:"冬";s:4:"冬";s:4:"𩇟";s:4:"𩇟";s:3:"凵";s:4:"ð¯ ";s:3:"刃";s:4:"刃";s:3:"ã“Ÿ";s:4:"㓟";s:3:"刻";s:4:"刻";s:3:"剆";s:4:"剆";s:3:"割";s:4:"割";s:3:"剷";s:4:"剷";s:3:"㔕";s:4:"㔕";s:3:"包";s:4:"包";s:3:"匆";s:4:"匆";s:3:"å‰";s:4:"卉";s:3:"åš";s:4:"博";s:3:"å³";s:4:"即";s:3:"å½";s:4:"卽";s:3:"å¿";s:4:"卿";s:4:"𠨬";s:4:"𠨬";s:3:"ç°";s:4:"灰";s:3:"åŠ";s:4:"及";s:3:"åŸ";s:4:"叟";s:4:"ð ­£";s:4:"𠭣";s:3:"å«";s:4:"叫";s:3:"å±";s:4:"叱";s:3:"å†";s:4:"吆";s:3:"å’ž";s:4:"咞";s:3:"å¸";s:4:"吸";s:3:"呈";s:4:"呈";s:3:"周";s:4:"周";s:3:"å’¢";s:4:"咢";s:3:"哶";s:4:"ð¯¡";s:3:"å”";s:4:"唐";s:3:"å•“";s:4:"啓";s:3:"å•£";s:4:"啣";s:3:"å–„";s:4:"善";s:3:"å–«";s:4:"喫";s:3:"å–³";s:4:"喳";s:3:"å—‚";s:4:"嗂";s:3:"圖";s:4:"圖";s:3:"圗";s:4:"ð¯¡";s:3:"噑";s:4:"噑";s:3:"å™´";s:4:"ð¯¡";s:3:"壮";s:4:"壮";s:3:"城";s:4:"城";s:3:"埴";s:4:"埴";s:3:"å ";s:4:"堍";s:3:"åž‹";s:4:"型";s:3:"å ²";s:4:"堲";s:3:"å ±";s:4:"報";s:3:"墬";s:4:"墬";s:4:"𡓤";s:4:"𡓤";s:3:"売";s:4:"売";s:3:"壷";s:4:"壷";s:3:"夆";s:4:"夆";s:3:"多";s:4:"ð¯¡";s:3:"夢";s:4:"夢";s:3:"奢";s:4:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:3:"姬";s:4:"姬";s:3:"娛";s:4:"娛";s:3:"娧";s:4:"娧";s:3:"姘";s:4:"姘";s:3:"婦";s:4:"婦";s:3:"ã›®";s:4:"㛮";s:3:"㛼";s:4:"㛼";s:3:"嬈";s:4:"嬈";s:3:"嬾";s:4:"嬾";s:4:"𡧈";s:4:"𡧈";s:3:"寃";s:4:"寃";s:3:"寘";s:4:"寘";s:3:"寳";s:4:"寳";s:4:"𡬘";s:4:"𡬘";s:3:"寿";s:4:"寿";s:3:"å°†";s:4:"将";s:3:"当";s:4:"当";s:3:"å°¢";s:4:"尢";s:3:"ãž";s:4:"㞁";s:3:"å± ";s:4:"屠";s:3:"å³€";s:4:"峀";s:3:"å²";s:4:"岍";s:4:"ð¡·¤";s:4:"𡷤";s:3:"嵃";s:4:"嵃";s:4:"ð¡·¦";s:4:"𡷦";s:3:"åµ®";s:4:"嵮";s:3:"嵫";s:4:"嵫";s:3:"åµ¼";s:4:"嵼";s:3:"å·¡";s:4:"ð¯¢";s:3:"å·¢";s:4:"巢";s:3:"ã ¯";s:4:"㠯";s:3:"å·½";s:4:"巽";s:3:"帨";s:4:"帨";s:3:"帽";s:4:"帽";s:3:"幩";s:4:"幩";s:3:"ã¡¢";s:4:"㡢";s:4:"𢆃";s:4:"𢆃";s:3:"㡼";s:4:"㡼";s:3:"庰";s:4:"庰";s:3:"庳";s:4:"庳";s:3:"庶";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"ð¯¢";s:4:"𢌱";s:4:"𢌱";s:3:"èˆ";s:4:"舁";s:3:"å¼¢";s:4:"弢";s:3:"㣇";s:4:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:3:"å½¢";s:4:"形";s:3:"彫";s:4:"彫";s:3:"㣣";s:4:"㣣";s:3:"徚";s:4:"徚";s:3:"å¿";s:4:"ð¯¢";s:3:"å¿—";s:4:"志";s:3:"忹";s:4:"忹";s:3:"æ‚";s:4:"悁";s:3:"㤺";s:4:"㤺";s:3:"㤜";s:4:"㤜";s:4:"𢛔";s:4:"𢛔";s:3:"惇";s:4:"惇";s:3:"æ…ˆ";s:4:"慈";s:3:"æ…Œ";s:4:"慌";s:3:"æ…º";s:4:"慺";s:3:"憲";s:4:"憲";s:3:"憤";s:4:"憤";s:3:"憯";s:4:"憯";s:3:"懞";s:4:"懞";s:3:"æˆ";s:4:"成";s:3:"戛";s:4:"戛";s:3:"æ‰";s:4:"扝";s:3:"抱";s:4:"抱";s:3:"æ‹”";s:4:"拔";s:3:"æ";s:4:"捐";s:4:"𢬌";s:4:"𢬌";s:3:"挽";s:4:"挽";s:3:"拼";s:4:"拼";s:3:"æ¨";s:4:"捨";s:3:"掃";s:4:"掃";s:3:"æ¤";s:4:"揤";s:4:"𢯱";s:4:"𢯱";s:3:"æ¢";s:4:"搢";s:3:"æ…";s:4:"揅";s:3:"掩";s:4:"ð¯£";s:3:"㨮";s:4:"㨮";s:3:"æ‘©";s:4:"摩";s:3:"摾";s:4:"摾";s:3:"æ’";s:4:"撝";s:3:"æ‘·";s:4:"摷";s:3:"㩬";s:4:"㩬";s:3:"敬";s:4:"敬";s:4:"𣀊";s:4:"𣀊";s:3:"æ—£";s:4:"旣";s:3:"書";s:4:"書";s:3:"晉";s:4:"ð¯£";s:3:"㬙";s:4:"㬙";s:3:"㬈";s:4:"ð¯£";s:3:"㫤";s:4:"㫤";s:3:"冒";s:4:"冒";s:3:"冕";s:4:"冕";s:3:"最";s:4:"最";s:3:"æšœ";s:4:"暜";s:3:"è‚­";s:4:"肭";s:3:"ä™";s:4:"䏙";s:3:"朡";s:4:"朡";s:3:"æž";s:4:"杞";s:3:"æ“";s:4:"杓";s:4:"ð£ƒ";s:4:"ð¯£";s:3:"ã­‰";s:4:"㭉";s:3:"柺";s:4:"柺";s:3:"æž…";s:4:"枅";s:3:"æ¡’";s:4:"桒";s:4:"𣑭";s:4:"𣑭";s:3:"梎";s:4:"梎";s:3:"æ Ÿ";s:4:"栟";s:3:"椔";s:4:"椔";s:3:"楂";s:4:"楂";s:3:"榣";s:4:"榣";s:3:"槪";s:4:"槪";s:3:"檨";s:4:"檨";s:4:"𣚣";s:4:"𣚣";s:3:"æ«›";s:4:"櫛";s:3:"ã°˜";s:4:"㰘";s:3:"次";s:4:"次";s:4:"𣢧";s:4:"𣢧";s:3:"æ­”";s:4:"歔";s:3:"㱎";s:4:"㱎";s:3:"æ­²";s:4:"歲";s:3:"殟";s:4:"殟";s:3:"æ®»";s:4:"殻";s:4:"ð£ª";s:4:"𣪍";s:4:"ð¡´‹";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:3:"汎";s:4:"汎";s:4:"𣲼";s:4:"𣲼";s:3:"沿";s:4:"沿";s:3:"æ³";s:4:"泍";s:3:"汧";s:4:"汧";s:3:"æ´–";s:4:"洖";s:3:"æ´¾";s:4:"派";s:3:"浩";s:4:"浩";s:3:"浸";s:4:"浸";s:3:"涅";s:4:"涅";s:4:"𣴞";s:4:"𣴞";s:3:"æ´´";s:4:"洴";s:3:"港";s:4:"港";s:3:"æ¹®";s:4:"湮";s:3:"ã´³";s:4:"㴳";s:3:"滇";s:4:"滇";s:4:"𣻑";s:4:"ð¯¤";s:3:"æ·¹";s:4:"淹";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"ð¯¤";s:4:"𣾎";s:4:"𣾎";s:3:"濆";s:4:"濆";s:3:"瀹";s:4:"瀹";s:3:"瀛";s:4:"瀛";s:3:"㶖";s:4:"㶖";s:3:"çŠ";s:4:"灊";s:3:"ç½";s:4:"災";s:3:"ç·";s:4:"灷";s:3:"ç‚­";s:4:"炭";s:4:"𠔥";s:4:"𠔥";s:3:"ç……";s:4:"煅";s:4:"𤉣";s:4:"ð¯¤";s:3:"熜";s:4:"熜";s:4:"𤎫";s:4:"𤎫";s:3:"爨";s:4:"爨";s:3:"ç‰";s:4:"牐";s:4:"𤘈";s:4:"𤘈";s:3:"犀";s:4:"犀";s:3:"犕";s:4:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:3:"çº";s:4:"獺";s:3:"王";s:4:"王";s:3:"㺬";s:4:"㺬";s:3:"玥";s:4:"玥";s:3:"㺸";s:4:"㺸";s:3:"瑇";s:4:"瑇";s:3:"ç‘œ";s:4:"瑜";s:3:"ç’…";s:4:"璅";s:3:"ç“Š";s:4:"瓊";s:3:"ã¼›";s:4:"㼛";s:3:"甤";s:4:"甤";s:4:"𤰶";s:4:"𤰶";s:3:"甾";s:4:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"𢆟";s:4:"𢆟";s:3:"ç˜";s:4:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"ð¥„";s:4:"𥁄";s:3:"㿼";s:4:"㿼";s:3:"䀈";s:4:"䀈";s:4:"𥃳";s:4:"ð¯¥";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:3:"眞";s:4:"眞";s:3:"真";s:4:"真";s:3:"çž‹";s:4:"瞋";s:3:"ä†";s:4:"䁆";s:3:"ä‚–";s:4:"䂖";s:4:"ð¥";s:4:"ð¯¥";s:3:"ç¡Ž";s:4:"硎";s:3:"䃣";s:4:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:3:"秫";s:4:"秫";s:3:"䄯";s:4:"䄯";s:3:"ç©Š";s:4:"穊";s:3:"ç©";s:4:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:3:"ç«®";s:4:"竮";s:3:"䈂";s:4:"䈂";s:4:"𥮫";s:4:"𥮫";s:3:"篆";s:4:"篆";s:3:"築";s:4:"築";s:3:"䈧";s:4:"䈧";s:4:"𥲀";s:4:"𥲀";s:3:"ç³’";s:4:"糒";s:3:"䊠";s:4:"䊠";s:3:"糨";s:4:"糨";s:3:"ç³£";s:4:"糣";s:3:"ç´€";s:4:"紀";s:4:"𥾆";s:4:"𥾆";s:3:"çµ£";s:4:"絣";s:3:"äŒ";s:4:"䌁";s:3:"ç·‡";s:4:"緇";s:3:"縂";s:4:"縂";s:3:"ç¹…";s:4:"繅";s:3:"䌴";s:4:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:3:"ä™";s:4:"䍙";s:4:"𦋙";s:4:"𦋙";s:3:"罺";s:4:"罺";s:4:"𦌾";s:4:"𦌾";s:3:"羕";s:4:"羕";s:3:"翺";s:4:"翺";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:3:"è ";s:4:"聠";s:4:"𦖨";s:4:"𦖨";s:3:"è°";s:4:"聰";s:4:"ð£Ÿ";s:4:"𣍟";s:3:"ä•";s:4:"ð¯¦";s:3:"育";s:4:"育";s:3:"脃";s:4:"脃";s:3:"ä‹";s:4:"䐋";s:3:"脾";s:4:"脾";s:3:"媵";s:4:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:3:"舄";s:4:"舄";s:3:"辞";s:4:"ð¯¦";s:3:"ä‘«";s:4:"䑫";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"ð¯¦";s:3:"èŠ";s:4:"芝";s:3:"劳";s:4:"劳";s:3:"花";s:4:"花";s:3:"芳";s:4:"芳";s:3:"芽";s:4:"芽";s:3:"苦";s:4:"苦";s:4:"𦬼";s:4:"𦬼";s:3:"èŒ";s:4:"茝";s:3:"è£";s:4:"荣";s:3:"莭";s:4:"莭";s:3:"茣";s:4:"茣";s:3:"莽";s:4:"ð¯¦";s:3:"è§";s:4:"菧";s:3:"è“";s:4:"荓";s:3:"èŠ";s:4:"菊";s:3:"èŒ";s:4:"菌";s:3:"èœ";s:4:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:3:"䔫";s:4:"䔫";s:3:"蓱";s:4:"蓱";s:3:"蓳";s:4:"蓳";s:3:"è”–";s:4:"蔖";s:4:"ð§Š";s:4:"𧏊";s:3:"蕤";s:4:"蕤";s:4:"𦼬";s:4:"𦼬";s:3:"ä•";s:4:"䕝";s:3:"ä•¡";s:4:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:3:"ä•«";s:4:"䕫";s:3:"è™";s:4:"虐";s:3:"虧";s:4:"虧";s:3:"虩";s:4:"虩";s:3:"èš©";s:4:"蚩";s:3:"蚈";s:4:"蚈";s:3:"蜎";s:4:"蜎";s:3:"蛢";s:4:"蛢";s:3:"蜨";s:4:"蜨";s:3:"è«";s:4:"蝫";s:3:"螆";s:4:"螆";s:3:"ä——";s:4:"䗗";s:3:"蟡";s:4:"蟡";s:3:"è ";s:4:"ð¯§";s:3:"ä—¹";s:4:"䗹";s:3:"è¡ ";s:4:"衠";s:3:"è¡£";s:4:"衣";s:4:"𧙧";s:4:"𧙧";s:3:"裗";s:4:"裗";s:3:"裞";s:4:"裞";s:3:"䘵";s:4:"䘵";s:3:"裺";s:4:"裺";s:3:"ã’»";s:4:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:3:"äš¾";s:4:"ð¯§";s:3:"䛇";s:4:"䛇";s:3:"誠";s:4:"ð¯§";s:3:"豕";s:4:"豕";s:4:"𧲨";s:4:"𧲨";s:3:"貫";s:4:"貫";s:3:"è³";s:4:"賁";s:3:"è´›";s:4:"贛";s:3:"èµ·";s:4:"起";s:4:"𧼯";s:4:"𧼯";s:4:"ð  „";s:4:"𠠄";s:3:"è·‹";s:4:"跋";s:3:"趼";s:4:"趼";s:3:"è·°";s:4:"跰";s:4:"𠣞";s:4:"ð¯§";s:3:"è»”";s:4:"軔";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:3:"é‚”";s:4:"邔";s:3:"郱";s:4:"郱";s:3:"é„‘";s:4:"鄑";s:4:"𨜮";s:4:"𨜮";s:3:"é„›";s:4:"鄛";s:3:"鈸";s:4:"鈸";s:3:"é‹—";s:4:"鋗";s:3:"鋘";s:4:"鋘";s:3:"鉼";s:4:"鉼";s:3:"é¹";s:4:"鏹";s:3:"é•";s:4:"鐕";s:4:"𨯺";s:4:"𨯺";s:3:"é–‹";s:4:"開";s:3:"䦕";s:4:"䦕";s:3:"é–·";s:4:"閷";s:4:"𨵷";s:4:"𨵷";s:3:"䧦";s:4:"䧦";s:3:"雃";s:4:"雃";s:3:"嶲";s:4:"嶲";s:3:"霣";s:4:"霣";s:4:"ð©……";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:3:"ä©®";s:4:"䩮";s:3:"䩶";s:4:"䩶";s:3:"韠";s:4:"韠";s:4:"ð©Š";s:4:"𩐊";s:3:"䪲";s:4:"䪲";s:4:"ð©’–";s:4:"𩒖";s:3:"é ©";s:4:"頩";s:4:"ð©–¶";s:4:"ð¯¨";s:3:"飢";s:4:"飢";s:3:"䬳";s:4:"䬳";s:3:"餩";s:4:"餩";s:3:"馧";s:4:"馧";s:3:"駂";s:4:"駂";s:3:"駾";s:4:"駾";s:3:"䯎";s:4:"䯎";s:4:"𩬰";s:4:"𩬰";s:3:"é±€";s:4:"鱀";s:3:"é³½";s:4:"鳽";s:3:"䳎";s:4:"ð¯¨";s:3:"ä³­";s:4:"䳭";s:3:"鵧";s:4:"ð¯¨";s:4:"𪃎";s:4:"ð¯¨";s:3:"䳸";s:4:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:3:"麻";s:4:"麻";s:3:"äµ–";s:4:"䵖";s:3:"黹";s:4:"黹";s:3:"黾";s:4:"黾";s:3:"é¼…";s:4:"鼅";s:3:"é¼";s:4:"鼏";s:3:"é¼–";s:4:"鼖";s:3:"é¼»";s:4:"鼻";s:4:"𪘀";s:4:"ð¯¨";}' );
+UtfNormal::$utfCanonicalDecomp = unserialize( 'a:2043:{s:2:"À";s:3:"AÌ€";s:2:"Ã";s:3:"AÌ";s:2:"Â";s:3:"AÌ‚";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Ã…";s:3:"AÌŠ";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"EÌ€";s:2:"É";s:3:"EÌ";s:2:"Ê";s:3:"EÌ‚";s:2:"Ë";s:3:"Ë";s:2:"ÃŒ";s:3:"IÌ€";s:2:"Ã";s:3:"IÌ";s:2:"ÃŽ";s:3:"IÌ‚";s:2:"Ã";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ã’";s:3:"OÌ€";s:2:"Ó";s:3:"OÌ";s:2:"Ô";s:3:"OÌ‚";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"UÌ€";s:2:"Ú";s:3:"UÌ";s:2:"Û";s:3:"UÌ‚";s:2:"Ãœ";s:3:"Ü";s:2:"Ã";s:3:"YÌ";s:2:"à";s:3:"aÌ€";s:2:"á";s:3:"aÌ";s:2:"â";s:3:"aÌ‚";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"Ã¥";s:3:"aÌŠ";s:2:"ç";s:3:"ç";s:2:"è";s:3:"eÌ€";s:2:"é";s:3:"eÌ";s:2:"ê";s:3:"eÌ‚";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"iÌ€";s:2:"í";s:3:"iÌ";s:2:"î";s:3:"iÌ‚";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"oÌ€";s:2:"ó";s:3:"oÌ";s:2:"ô";s:3:"oÌ‚";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"uÌ€";s:2:"ú";s:3:"uÌ";s:2:"û";s:3:"uÌ‚";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"yÌ";s:2:"ÿ";s:3:"ÿ";s:2:"Ä€";s:3:"AÌ„";s:2:"Ä";s:3:"aÌ„";s:2:"Ä‚";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ä„";s:3:"Ą";s:2:"Ä…";s:3:"ą";s:2:"Ć";s:3:"CÌ";s:2:"ć";s:3:"cÌ";s:2:"Ĉ";s:3:"CÌ‚";s:2:"ĉ";s:3:"cÌ‚";s:2:"ÄŠ";s:3:"Ċ";s:2:"Ä‹";s:3:"ċ";s:2:"ÄŒ";s:3:"CÌŒ";s:2:"Ä";s:3:"cÌŒ";s:2:"ÄŽ";s:3:"DÌŒ";s:2:"Ä";s:3:"dÌŒ";s:2:"Ä’";s:3:"EÌ„";s:2:"Ä“";s:3:"eÌ„";s:2:"Ä”";s:3:"Ĕ";s:2:"Ä•";s:3:"ĕ";s:2:"Ä–";s:3:"Ė";s:2:"Ä—";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"Ä™";s:3:"ę";s:2:"Äš";s:3:"EÌŒ";s:2:"Ä›";s:3:"eÌŒ";s:2:"Äœ";s:3:"GÌ‚";s:2:"Ä";s:3:"gÌ‚";s:2:"Äž";s:3:"Ğ";s:2:"ÄŸ";s:3:"ğ";s:2:"Ä ";s:3:"Ġ";s:2:"Ä¡";s:3:"ġ";s:2:"Ä¢";s:3:"Ģ";s:2:"Ä£";s:3:"ģ";s:2:"Ĥ";s:3:"HÌ‚";s:2:"Ä¥";s:3:"hÌ‚";s:2:"Ĩ";s:3:"Ĩ";s:2:"Ä©";s:3:"ĩ";s:2:"Ī";s:3:"IÌ„";s:2:"Ä«";s:3:"iÌ„";s:2:"Ĭ";s:3:"Ĭ";s:2:"Ä­";s:3:"ĭ";s:2:"Ä®";s:3:"Į";s:2:"į";s:3:"į";s:2:"Ä°";s:3:"İ";s:2:"Ä´";s:3:"JÌ‚";s:2:"ĵ";s:3:"jÌ‚";s:2:"Ķ";s:3:"Ķ";s:2:"Ä·";s:3:"ķ";s:2:"Ĺ";s:3:"LÌ";s:2:"ĺ";s:3:"lÌ";s:2:"Ä»";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"LÌŒ";s:2:"ľ";s:3:"lÌŒ";s:2:"Ń";s:3:"NÌ";s:2:"Å„";s:3:"nÌ";s:2:"Å…";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"NÌŒ";s:2:"ň";s:3:"nÌŒ";s:2:"ÅŒ";s:3:"OÌ„";s:2:"Å";s:3:"oÌ„";s:2:"ÅŽ";s:3:"Ŏ";s:2:"Å";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å‘";s:3:"oÌ‹";s:2:"Å”";s:3:"RÌ";s:2:"Å•";s:3:"rÌ";s:2:"Å–";s:3:"Ŗ";s:2:"Å—";s:3:"ŗ";s:2:"Ř";s:3:"RÌŒ";s:2:"Å™";s:3:"rÌŒ";s:2:"Åš";s:3:"SÌ";s:2:"Å›";s:3:"sÌ";s:2:"Åœ";s:3:"SÌ‚";s:2:"Å";s:3:"sÌ‚";s:2:"Åž";s:3:"Ş";s:2:"ÅŸ";s:3:"ş";s:2:"Å ";s:3:"SÌŒ";s:2:"Å¡";s:3:"sÌŒ";s:2:"Å¢";s:3:"Ţ";s:2:"Å£";s:3:"ţ";s:2:"Ť";s:3:"TÌŒ";s:2:"Å¥";s:3:"tÌŒ";s:2:"Ũ";s:3:"Ũ";s:2:"Å©";s:3:"ũ";s:2:"Ū";s:3:"UÌ„";s:2:"Å«";s:3:"uÌ„";s:2:"Ŭ";s:3:"Ŭ";s:2:"Å­";s:3:"ŭ";s:2:"Å®";s:3:"UÌŠ";s:2:"ů";s:3:"uÌŠ";s:2:"Å°";s:3:"UÌ‹";s:2:"ű";s:3:"uÌ‹";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Å´";s:3:"WÌ‚";s:2:"ŵ";s:3:"wÌ‚";s:2:"Ŷ";s:3:"YÌ‚";s:2:"Å·";s:3:"yÌ‚";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"ZÌ";s:2:"ź";s:3:"zÌ";s:2:"Å»";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"ZÌŒ";s:2:"ž";s:3:"zÌŒ";s:2:"Æ ";s:3:"OÌ›";s:2:"Æ¡";s:3:"oÌ›";s:2:"Ư";s:3:"UÌ›";s:2:"Æ°";s:3:"uÌ›";s:2:"Ç";s:3:"AÌŒ";s:2:"ÇŽ";s:3:"aÌŒ";s:2:"Ç";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç‘";s:3:"OÌŒ";s:2:"Ç’";s:3:"oÌŒ";s:2:"Ç“";s:3:"UÌŒ";s:2:"Ç”";s:3:"uÌŒ";s:2:"Ç•";s:5:"Ǖ";s:2:"Ç–";s:5:"ǖ";s:2:"Ç—";s:5:"ÜÌ";s:2:"ǘ";s:5:"üÌ";s:2:"Ç™";s:5:"Ǚ";s:2:"Çš";s:5:"ǚ";s:2:"Ç›";s:5:"Ǜ";s:2:"Çœ";s:5:"ǜ";s:2:"Çž";s:5:"Ǟ";s:2:"ÇŸ";s:5:"ǟ";s:2:"Ç ";s:5:"Ǡ";s:2:"Ç¡";s:5:"ǡ";s:2:"Ç¢";s:4:"Ǣ";s:2:"Ç£";s:4:"ǣ";s:2:"Ǧ";s:3:"GÌŒ";s:2:"ǧ";s:3:"gÌŒ";s:2:"Ǩ";s:3:"KÌŒ";s:2:"Ç©";s:3:"kÌŒ";s:2:"Ǫ";s:3:"Ǫ";s:2:"Ç«";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"Ç­";s:5:"ǭ";s:2:"Ç®";s:4:"Æ·ÌŒ";s:2:"ǯ";s:4:"Ê’ÌŒ";s:2:"Ç°";s:3:"jÌŒ";s:2:"Ç´";s:3:"GÌ";s:2:"ǵ";s:3:"gÌ";s:2:"Ǹ";s:3:"NÌ€";s:2:"ǹ";s:3:"nÌ€";s:2:"Ǻ";s:5:"AÌŠÌ";s:2:"Ç»";s:5:"aÌŠÌ";s:2:"Ǽ";s:4:"ÆÌ";s:2:"ǽ";s:4:"æÌ";s:2:"Ǿ";s:4:"ØÌ";s:2:"Ç¿";s:4:"øÌ";s:2:"È€";s:3:"AÌ";s:2:"È";s:3:"aÌ";s:2:"È‚";s:3:"AÌ‘";s:2:"ȃ";s:3:"aÌ‘";s:2:"È„";s:3:"EÌ";s:2:"È…";s:3:"eÌ";s:2:"Ȇ";s:3:"EÌ‘";s:2:"ȇ";s:3:"eÌ‘";s:2:"Ȉ";s:3:"IÌ";s:2:"ȉ";s:3:"iÌ";s:2:"ÈŠ";s:3:"IÌ‘";s:2:"È‹";s:3:"iÌ‘";s:2:"ÈŒ";s:3:"OÌ";s:2:"È";s:3:"oÌ";s:2:"ÈŽ";s:3:"OÌ‘";s:2:"È";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È‘";s:3:"rÌ";s:2:"È’";s:3:"RÌ‘";s:2:"È“";s:3:"rÌ‘";s:2:"È”";s:3:"UÌ";s:2:"È•";s:3:"uÌ";s:2:"È–";s:3:"UÌ‘";s:2:"È—";s:3:"uÌ‘";s:2:"Ș";s:3:"Ș";s:2:"È™";s:3:"ș";s:2:"Èš";s:3:"Ț";s:2:"È›";s:3:"ț";s:2:"Èž";s:3:"HÌŒ";s:2:"ÈŸ";s:3:"hÌŒ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"È©";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"È«";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"È­";s:5:"ȭ";s:2:"È®";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"È°";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"YÌ„";s:2:"ȳ";s:3:"yÌ„";s:2:"Í€";s:2:"Ì€";s:2:"Í";s:2:"Ì";s:2:"̓";s:2:"Ì“";s:2:"Í„";s:4:"̈Ì";s:2:"Í´";s:2:"ʹ";s:2:";";s:1:";";s:2:"Î…";s:4:"¨Ì";s:2:"Ά";s:4:"ΑÌ";s:2:"·";s:2:"·";s:2:"Έ";s:4:"ΕÌ";s:2:"Ή";s:4:"ΗÌ";s:2:"Ί";s:4:"ΙÌ";s:2:"ÎŒ";s:4:"ΟÌ";s:2:"ÎŽ";s:4:"Î¥Ì";s:2:"Î";s:4:"ΩÌ";s:2:"Î";s:6:"ϊÌ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"αÌ";s:2:"έ";s:4:"εÌ";s:2:"ή";s:4:"ηÌ";s:2:"ί";s:4:"ιÌ";s:2:"ΰ";s:6:"ϋÌ";s:2:"ÏŠ";s:4:"ϊ";s:2:"Ï‹";s:4:"ϋ";s:2:"ÏŒ";s:4:"οÌ";s:2:"Ï";s:4:"Ï…Ì";s:2:"ÏŽ";s:4:"ωÌ";s:2:"Ï“";s:4:"Ï’Ì";s:2:"Ï”";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ð";s:4:"Ё";s:2:"Ѓ";s:4:"ГÌ";s:2:"Ї";s:4:"Ї";s:2:"ÐŒ";s:4:"КÌ";s:2:"Ð";s:4:"Ѝ";s:2:"ÐŽ";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"Ñ";s:4:"ѐ";s:2:"Ñ‘";s:4:"ё";s:2:"Ñ“";s:4:"гÌ";s:2:"Ñ—";s:4:"ї";s:2:"Ñœ";s:4:"кÌ";s:2:"Ñ";s:4:"ѝ";s:2:"Ñž";s:4:"ў";s:2:"Ѷ";s:4:"Ñ´Ì";s:2:"Ñ·";s:4:"ѵÌ";s:2:"Ó";s:4:"Ӂ";s:2:"Ó‚";s:4:"ӂ";s:2:"Ó";s:4:"Ð̆";s:2:"Ó‘";s:4:"ӑ";s:2:"Ó’";s:4:"Ð̈";s:2:"Ó“";s:4:"ӓ";s:2:"Ó–";s:4:"Ӗ";s:2:"Ó—";s:4:"ӗ";s:2:"Óš";s:4:"Ӛ";s:2:"Ó›";s:4:"ӛ";s:2:"Óœ";s:4:"Ӝ";s:2:"Ó";s:4:"ӝ";s:2:"Óž";s:4:"Ӟ";s:2:"ÓŸ";s:4:"ӟ";s:2:"Ó¢";s:4:"Ӣ";s:2:"Ó£";s:4:"ӣ";s:2:"Ó¤";s:4:"Ӥ";s:2:"Ó¥";s:4:"ӥ";s:2:"Ó¦";s:4:"Ӧ";s:2:"Ó§";s:4:"ӧ";s:2:"Óª";s:4:"Ӫ";s:2:"Ó«";s:4:"ӫ";s:2:"Ó¬";s:4:"Ӭ";s:2:"Ó­";s:4:"Ñ̈";s:2:"Ó®";s:4:"Ӯ";s:2:"Ó¯";s:4:"ӯ";s:2:"Ó°";s:4:"Ӱ";s:2:"Ó±";s:4:"ӱ";s:2:"Ó²";s:4:"Ӳ";s:2:"Ó³";s:4:"ӳ";s:2:"Ó´";s:4:"Ӵ";s:2:"Óµ";s:4:"ӵ";s:2:"Ó¸";s:4:"Ӹ";s:2:"Ó¹";s:4:"ӹ";s:2:"Ø¢";s:4:"آ";s:2:"Ø£";s:4:"أ";s:2:"ؤ";s:4:"ÙˆÙ”";s:2:"Ø¥";s:4:"إ";s:2:"ئ";s:4:"ÙŠÙ”";s:2:"Û€";s:4:"Û•Ù”";s:2:"Û‚";s:4:"ÛÙ”";s:2:"Û“";s:4:"Û’Ù”";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"à¥";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"à§";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"à©™";s:6:"ਖ਼";s:3:"à©š";s:6:"ਗ਼";s:3:"à©›";s:6:"ਜ਼";s:3:"à©ž";s:6:"ਫ਼";s:3:"à­ˆ";s:6:"ୈ";s:3:"à­‹";s:6:"ୋ";s:3:"à­Œ";s:6:"ୌ";s:3:"à­œ";s:6:"ଡ଼";s:3:"à­";s:6:"ଢ଼";s:3:"à®”";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"à³€";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"à·š";s:6:"ේ";s:3:"à·œ";s:6:"à·™à·";s:3:"à·";s:9:"à·™à·à·Š";s:3:"à·ž";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"à½";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"à¾";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"à¾";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"à¾à¾µ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"á¬á¬µ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"á­€";s:6:"ᭀ";s:3:"á­";s:6:"ᭁ";s:3:"á­ƒ";s:6:"ᭃ";s:3:"Ḁ";s:3:"AÌ¥";s:3:"á¸";s:3:"aÌ¥";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"BÌ£";s:3:"ḅ";s:3:"bÌ£";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"ÇÌ";s:3:"ḉ";s:5:"çÌ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"DÌ£";s:3:"á¸";s:3:"dÌ£";s:3:"Ḏ";s:3:"Ḏ";s:3:"á¸";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"DÌ­";s:3:"ḓ";s:3:"dÌ­";s:3:"Ḕ";s:5:"EÌ„Ì€";s:3:"ḕ";s:5:"eÌ„Ì€";s:3:"Ḗ";s:5:"EÌ„Ì";s:3:"ḗ";s:5:"eÌ„Ì";s:3:"Ḙ";s:3:"EÌ­";s:3:"ḙ";s:3:"eÌ­";s:3:"Ḛ";s:3:"EÌ°";s:3:"ḛ";s:3:"eÌ°";s:3:"Ḝ";s:5:"Ḝ";s:3:"á¸";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"GÌ„";s:3:"ḡ";s:3:"gÌ„";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"HÌ£";s:3:"ḥ";s:3:"hÌ£";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"HÌ®";s:3:"ḫ";s:3:"hÌ®";s:3:"Ḭ";s:3:"IÌ°";s:3:"ḭ";s:3:"iÌ°";s:3:"Ḯ";s:5:"ÏÌ";s:3:"ḯ";s:5:"ïÌ";s:3:"Ḱ";s:3:"KÌ";s:3:"ḱ";s:3:"kÌ";s:3:"Ḳ";s:3:"KÌ£";s:3:"ḳ";s:3:"kÌ£";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"LÌ£";s:3:"ḷ";s:3:"lÌ£";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"LÌ­";s:3:"ḽ";s:3:"lÌ­";s:3:"Ḿ";s:3:"MÌ";s:3:"ḿ";s:3:"mÌ";s:3:"á¹€";s:3:"Ṁ";s:3:"á¹";s:3:"ṁ";s:3:"Ṃ";s:3:"MÌ£";s:3:"ṃ";s:3:"mÌ£";s:3:"Ṅ";s:3:"Ṅ";s:3:"á¹…";s:3:"ṅ";s:3:"Ṇ";s:3:"NÌ£";s:3:"ṇ";s:3:"nÌ£";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"NÌ­";s:3:"ṋ";s:3:"nÌ­";s:3:"Ṍ";s:5:"ÕÌ";s:3:"á¹";s:5:"õÌ";s:3:"Ṏ";s:5:"Ṏ";s:3:"á¹";s:5:"ṏ";s:3:"á¹";s:5:"OÌ„Ì€";s:3:"ṑ";s:5:"oÌ„Ì€";s:3:"á¹’";s:5:"OÌ„Ì";s:3:"ṓ";s:5:"oÌ„Ì";s:3:"á¹”";s:3:"PÌ";s:3:"ṕ";s:3:"pÌ";s:3:"á¹–";s:3:"Ṗ";s:3:"á¹—";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"á¹™";s:3:"ṙ";s:3:"Ṛ";s:3:"RÌ£";s:3:"á¹›";s:3:"rÌ£";s:3:"Ṝ";s:5:"Ṝ";s:3:"á¹";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"á¹ ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"á¹¢";s:3:"SÌ£";s:3:"á¹£";s:3:"sÌ£";s:3:"Ṥ";s:5:"SÌ̇";s:3:"á¹¥";s:5:"sÌ̇";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"TÌ£";s:3:"á¹­";s:3:"tÌ£";s:3:"á¹®";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"á¹°";s:3:"TÌ­";s:3:"á¹±";s:3:"tÌ­";s:3:"á¹²";s:3:"Ṳ";s:3:"á¹³";s:3:"ṳ";s:3:"á¹´";s:3:"UÌ°";s:3:"á¹µ";s:3:"uÌ°";s:3:"Ṷ";s:3:"UÌ­";s:3:"á¹·";s:3:"uÌ­";s:3:"Ṹ";s:5:"ŨÌ";s:3:"á¹¹";s:5:"ũÌ";s:3:"Ṻ";s:5:"Ṻ";s:3:"á¹»";s:5:"ṻ";s:3:"á¹¼";s:3:"Ṽ";s:3:"á¹½";s:3:"ṽ";s:3:"á¹¾";s:3:"VÌ£";s:3:"ṿ";s:3:"vÌ£";s:3:"Ẁ";s:3:"WÌ€";s:3:"áº";s:3:"wÌ€";s:3:"Ẃ";s:3:"WÌ";s:3:"ẃ";s:3:"wÌ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"WÌ£";s:3:"ẉ";s:3:"wÌ£";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"áº";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"áº";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"ẑ";s:3:"zÌ‚";s:3:"Ẓ";s:3:"ZÌ£";s:3:"ẓ";s:3:"zÌ£";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"wÌŠ";s:3:"ẙ";s:3:"yÌŠ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"AÌ£";s:3:"ạ";s:3:"aÌ£";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"AÌ‚Ì";s:3:"ấ";s:5:"aÌ‚Ì";s:3:"Ầ";s:5:"AÌ‚Ì€";s:3:"ầ";s:5:"aÌ‚Ì€";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"ĂÌ";s:3:"ắ";s:5:"ăÌ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"EÌ£";s:3:"ẹ";s:3:"eÌ£";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"EÌ‚Ì";s:3:"ế";s:5:"eÌ‚Ì";s:3:"Ề";s:5:"EÌ‚Ì€";s:3:"á»";s:5:"eÌ‚Ì€";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"á»…";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"IÌ£";s:3:"ị";s:3:"iÌ£";s:3:"Ọ";s:3:"OÌ£";s:3:"á»";s:3:"oÌ£";s:3:"Ỏ";s:3:"Ỏ";s:3:"á»";s:3:"ỏ";s:3:"á»";s:5:"OÌ‚Ì";s:3:"ố";s:5:"oÌ‚Ì";s:3:"á»’";s:5:"OÌ‚Ì€";s:3:"ồ";s:5:"oÌ‚Ì€";s:3:"á»”";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"á»–";s:5:"Ỗ";s:3:"á»—";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"á»™";s:5:"ộ";s:3:"Ớ";s:5:"OÌ›Ì";s:3:"á»›";s:5:"oÌ›Ì";s:3:"Ờ";s:5:"Ờ";s:3:"á»";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"á» ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"UÌ£";s:3:"ụ";s:3:"uÌ£";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"UÌ›Ì";s:3:"ứ";s:5:"uÌ›Ì";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"á»­";s:5:"ử";s:3:"á»®";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"á»°";s:5:"Ự";s:3:"á»±";s:5:"ự";s:3:"Ỳ";s:3:"YÌ€";s:3:"ỳ";s:3:"yÌ€";s:3:"á»´";s:3:"YÌ£";s:3:"ỵ";s:3:"yÌ£";s:3:"Ỷ";s:3:"Ỷ";s:3:"á»·";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"á¼€";s:4:"ἀ";s:3:"á¼";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἀÌ";s:3:"á¼…";s:6:"ἁÌ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"ἈÌ";s:3:"á¼";s:6:"ἉÌ";s:3:"Ἆ";s:6:"Ἆ";s:3:"á¼";s:6:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"á¼’";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"á¼”";s:6:"ἐÌ";s:3:"ἕ";s:6:"ἑÌ";s:3:"Ἐ";s:4:"Ἐ";s:3:"á¼™";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"á¼›";s:6:"Ἓ";s:3:"Ἔ";s:6:"ἘÌ";s:3:"á¼";s:6:"ἙÌ";s:3:"á¼ ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"á¼¢";s:6:"ἢ";s:3:"á¼£";s:6:"ἣ";s:3:"ἤ";s:6:"ἠÌ";s:3:"á¼¥";s:6:"ἡÌ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"ἨÌ";s:3:"á¼­";s:6:"ἩÌ";s:3:"á¼®";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"á¼°";s:4:"ἰ";s:3:"á¼±";s:4:"ἱ";s:3:"á¼²";s:6:"ἲ";s:3:"á¼³";s:6:"ἳ";s:3:"á¼´";s:6:"ἰÌ";s:3:"á¼µ";s:6:"ἱÌ";s:3:"ἶ";s:6:"ἶ";s:3:"á¼·";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"á¼¹";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"á¼»";s:6:"Ἳ";s:3:"á¼¼";s:6:"ἸÌ";s:3:"á¼½";s:6:"ἹÌ";s:3:"á¼¾";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"á½€";s:4:"ὀ";s:3:"á½";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὀÌ";s:3:"á½…";s:6:"ὁÌ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"ὈÌ";s:3:"á½";s:6:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"ὑ";s:4:"Ï…Ì”";s:3:"á½’";s:6:"Ï…Ì“Ì€";s:3:"ὓ";s:6:"ὓ";s:3:"á½”";s:6:"Ï…Ì“Ì";s:3:"ὕ";s:6:"Ï…Ì”Ì";s:3:"á½–";s:6:"Ï…Ì“Í‚";s:3:"á½—";s:6:"ὗ";s:3:"á½™";s:4:"Ὑ";s:3:"á½›";s:6:"Ὓ";s:3:"á½";s:6:"ὙÌ";s:3:"Ὗ";s:6:"Ὗ";s:3:"á½ ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"á½¢";s:6:"ὢ";s:3:"á½£";s:6:"ὣ";s:3:"ὤ";s:6:"ὠÌ";s:3:"á½¥";s:6:"ὡÌ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"ὨÌ";s:3:"á½­";s:6:"ὩÌ";s:3:"á½®";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"á½°";s:4:"ὰ";s:3:"á½±";s:4:"αÌ";s:3:"á½²";s:4:"ὲ";s:3:"á½³";s:4:"εÌ";s:3:"á½´";s:4:"ὴ";s:3:"á½µ";s:4:"ηÌ";s:3:"ὶ";s:4:"ὶ";s:3:"á½·";s:4:"ιÌ";s:3:"ὸ";s:4:"ὸ";s:3:"á½¹";s:4:"οÌ";s:3:"ὺ";s:4:"Ï…Ì€";s:3:"á½»";s:4:"Ï…Ì";s:3:"á½¼";s:4:"ὼ";s:3:"á½½";s:4:"ωÌ";s:3:"á¾€";s:6:"ᾀ";s:3:"á¾";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ἀÌÍ…";s:3:"á¾…";s:8:"ἁÌÍ…";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ἈÌÍ…";s:3:"á¾";s:8:"ἉÌÍ…";s:3:"ᾎ";s:8:"ᾎ";s:3:"á¾";s:8:"ᾏ";s:3:"á¾";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"á¾’";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"á¾”";s:8:"ἠÌÍ…";s:3:"ᾕ";s:8:"ἡÌÍ…";s:3:"á¾–";s:8:"ᾖ";s:3:"á¾—";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"á¾™";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"á¾›";s:8:"ᾛ";s:3:"ᾜ";s:8:"ἨÌÍ…";s:3:"á¾";s:8:"ἩÌÍ…";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"á¾ ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"á¾¢";s:8:"ᾢ";s:3:"á¾£";s:8:"ᾣ";s:3:"ᾤ";s:8:"ὠÌÍ…";s:3:"á¾¥";s:8:"ὡÌÍ…";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ὨÌÍ…";s:3:"á¾­";s:8:"ὩÌÍ…";s:3:"á¾®";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"á¾°";s:4:"ᾰ";s:3:"á¾±";s:4:"ᾱ";s:3:"á¾²";s:6:"ᾲ";s:3:"á¾³";s:4:"ᾳ";s:3:"á¾´";s:6:"αÌÍ…";s:3:"ᾶ";s:4:"ᾶ";s:3:"á¾·";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"á¾¹";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"á¾»";s:4:"ΑÌ";s:3:"á¾¼";s:4:"ᾼ";s:3:"á¾¾";s:2:"ι";s:3:"á¿";s:4:"῁";s:3:"á¿‚";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"á¿„";s:6:"ηÌÍ…";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"ΕÌ";s:3:"á¿Š";s:4:"Ὴ";s:3:"á¿‹";s:4:"ΗÌ";s:3:"á¿Œ";s:4:"ῌ";s:3:"á¿";s:5:"῍";s:3:"á¿Ž";s:5:"᾿Ì";s:3:"á¿";s:5:"῏";s:3:"á¿";s:4:"ῐ";s:3:"á¿‘";s:4:"ῑ";s:3:"á¿’";s:6:"ῒ";s:3:"á¿“";s:6:"ϊÌ";s:3:"á¿–";s:4:"ῖ";s:3:"á¿—";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"á¿™";s:4:"Ῑ";s:3:"á¿š";s:4:"Ὶ";s:3:"á¿›";s:4:"ΙÌ";s:3:"á¿";s:5:"῝";s:3:"á¿ž";s:5:"῾Ì";s:3:"á¿Ÿ";s:5:"῟";s:3:"á¿ ";s:4:"ῠ";s:3:"á¿¡";s:4:"Ï…Ì„";s:3:"á¿¢";s:6:"ῢ";s:3:"á¿£";s:6:"ϋÌ";s:3:"ῤ";s:4:"ÏÌ“";s:3:"á¿¥";s:4:"ÏÌ”";s:3:"ῦ";s:4:"Ï…Í‚";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"á¿©";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"á¿«";s:4:"Î¥Ì";s:3:"Ῥ";s:4:"Ῥ";s:3:"á¿­";s:4:"῭";s:3:"á¿®";s:4:"¨Ì";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"á¿´";s:6:"ωÌÍ…";s:3:"ῶ";s:4:"ῶ";s:3:"á¿·";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"ΟÌ";s:3:"Ὼ";s:4:"Ὼ";s:3:"á¿»";s:4:"ΩÌ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:"â€";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"â„«";s:3:"AÌŠ";s:3:"↚";s:5:"â†Ì¸";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"â‡";s:5:"â‡Ì¸";s:3:"⇎";s:5:"⇎";s:3:"â‡";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"â‰";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"â‰Ì¸";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"âŠ";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"â‹ ";s:5:"⋠";s:3:"â‹¡";s:5:"⋡";s:3:"â‹¢";s:5:"⋢";s:3:"â‹£";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"â‹«";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"â‹­";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"â«œ";s:5:"â«Ì¸";s:3:"ãŒ";s:6:"ã‹ã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ãã‚™";s:3:"ã’";s:6:"ã‘ã‚™";s:3:"ã”";s:6:"ã“ã‚™";s:3:"ã–";s:6:"ã•ã‚™";s:3:"ã˜";s:6:"ã—ã‚™";s:3:"ãš";s:6:"ã™ã‚™";s:3:"ãœ";s:6:"ã›ã‚™";s:3:"ãž";s:6:"ãã‚™";s:3:"ã ";s:6:"ãŸã‚™";s:3:"ã¢";s:6:"ã¡ã‚™";s:3:"ã¥";s:6:"ã¤ã‚™";s:3:"ã§";s:6:"ã¦ã‚™";s:3:"ã©";s:6:"ã¨ã‚™";s:3:"ã°";s:6:"ã¯ã‚™";s:3:"ã±";s:6:"ã¯ã‚š";s:3:"ã³";s:6:"ã²ã‚™";s:3:"ã´";s:6:"ã²ã‚š";s:3:"ã¶";s:6:"ãµã‚™";s:3:"ã·";s:6:"ãµã‚š";s:3:"ã¹";s:6:"ã¸ã‚™";s:3:"ãº";s:6:"ã¸ã‚š";s:3:"ã¼";s:6:"ã»ã‚™";s:3:"ã½";s:6:"ã»ã‚š";s:3:"ã‚”";s:6:"ã†ã‚™";s:3:"ã‚ž";s:6:"ã‚ã‚™";s:3:"ガ";s:6:"ã‚«ã‚™";s:3:"ã‚®";s:6:"ã‚­ã‚™";s:3:"ã‚°";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ã‚´";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ã‚·ã‚™";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ã‚¿ã‚™";s:3:"ヂ";s:6:"ãƒã‚™";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"ãƒ";s:6:"ãƒã‚™";s:3:"パ";s:6:"ãƒã‚š";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ãƒ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"ï¤";s:3:"æ›´";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"å¥";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"å–‡";s:3:"奈";s:3:"奈";s:3:"ï¤";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"ï¤";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"é‚";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"æ´›";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"çž";s:3:"落";s:3:"è½";s:3:"酪";s:3:"é…ª";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"åµ";s:3:"ï¤";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"åµ";s:3:"濫";s:3:"æ¿«";s:3:"藍";s:3:"è—";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"è Ÿ";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"å‹ž";s:3:"擄";s:3:"æ“„";s:3:"櫓";s:3:"æ«“";s:3:"爐";s:3:"çˆ";s:3:"盧";s:3:"盧";s:3:"老";s:3:"è€";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"è·¯";s:3:"露";s:3:"露";s:3:"魯";s:3:"é­¯";s:3:"鷺";s:3:"é·º";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"è‰";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"ï¥";s:3:"è«–";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"ç± ";s:3:"聾";s:3:"è¾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"é›·";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"å±¢";s:3:"樓";s:3:"樓";s:3:"ï¥";s:3:"æ·š";s:3:"漏";s:3:"æ¼";s:3:"ï¥";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"å‹’";s:3:"肋";s:3:"è‚‹";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"è±";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"æ‹";s:3:"樂";s:3:"樂";s:3:"ï¥";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"ç•°";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"ä¸";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"ç´¢";s:3:"參";s:3:"åƒ";s:3:"塞";s:3:"å¡ž";s:3:"省";s:3:"çœ";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"è¾°";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"è‹¥";s:3:"掠";s:3:"掠";s:3:"略";s:3:"ç•¥";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"å…©";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"æ¢";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"è«’";s:3:"量";s:3:"é‡";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"å‘‚";s:3:"ï¦";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"æ—…";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"é–­";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"æ­·";s:3:"ï¦";s:3:"è½¢";s:3:"年";s:3:"å¹´";s:3:"ï¦";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"撚";s:3:"æ’š";s:3:"漣";s:3:"æ¼£";s:3:"煉";s:3:"ç…‰";s:3:"璉";s:3:"ç’‰";s:3:"秊";s:3:"秊";s:3:"練";s:3:"ç·´";s:3:"聯";s:3:"è¯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"è“®";s:3:"連";s:3:"連";s:3:"鍊";s:3:"éŠ";s:3:"列";s:3:"列";s:3:"ï¦";s:3:"劣";s:3:"咽";s:3:"å’½";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"æ»";s:3:"殮";s:3:"æ®®";s:3:"簾";s:3:"ç°¾";s:3:"獵";s:3:"çµ";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"ç‘©";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"è†";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"éˆ";s:3:"領";s:3:"é ˜";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"å°¿";s:3:"料";s:3:"æ–™";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"ï§";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"é¼";s:3:"龍";s:3:"é¾";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"æ»";s:3:"柳";s:3:"柳";s:3:"流";s:3:"æµ";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"ç‰";s:3:"ï§";s:3:"ç•™";s:3:"硫";s:3:"ç¡«";s:3:"ï§";s:3:"ç´";s:3:"ï§";s:3:"é¡ž";s:3:"六";s:3:"å…­";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"å´™";s:3:"淪";s:3:"æ·ª";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"æ…„";s:3:"栗";s:3:"æ —";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"ï§";s:3:"利";s:3:"吏";s:3:"å";s:3:"履";s:3:"å±¥";s:3:"易";s:3:"易";s:3:"李";s:3:"æŽ";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"æ³¥";s:3:"理";s:3:"ç†";s:3:"痢";s:3:"ç—¢";s:3:"罹";s:3:"ç½¹";s:3:"裏";s:3:"è£";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"å";s:3:"燐";s:3:"ç‡";s:3:"璘";s:3:"ç’˜";s:3:"藺";s:3:"è—º";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"é±—";s:3:"麟";s:3:"麟";s:3:"林";s:3:"æž—";s:3:"淋";s:3:"æ·‹";s:3:"臨";s:3:"臨";s:3:"立";s:3:"ç«‹";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"ç²’";s:3:"狀";s:3:"ç‹€";s:3:"炙";s:3:"ç‚™";s:3:"識";s:3:"è­˜";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"ï¨";s:3:"度";s:3:"拓";s:3:"æ‹“";s:3:"糖";s:3:"ç³–";s:3:"宅";s:3:"å®…";s:3:"洞";s:3:"æ´ž";s:3:"暴";s:3:"æš´";s:3:"輻";s:3:"è¼»";s:3:"行";s:3:"è¡Œ";s:3:"降";s:3:"é™";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"å…€";s:3:"ï¨";s:3:"å—€";s:3:"ï¨";s:3:"å¡š";s:3:"晴";s:3:"æ™´";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"ç¦";s:3:"靖";s:3:"é–";s:3:"ï¨";s:3:"ç²¾";s:3:"羽";s:3:"ç¾½";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"ä¾®";s:3:"僧";s:3:"僧";s:3:"免";s:3:"å…";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"å‘";s:3:"喝";s:3:"å–";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"å¡€";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"å±®";s:3:"悔";s:3:"æ‚”";s:3:"慨";s:3:"æ…¨";s:3:"憎";s:3:"憎";s:3:"ï©€";s:3:"懲";s:3:"ï©";s:3:"æ•";s:3:"ï©‚";s:3:"æ—¢";s:3:"暑";s:3:"æš‘";s:3:"ï©„";s:3:"梅";s:3:"ï©…";s:3:"æµ·";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"æ¼¢";s:3:"煮";s:3:"ç…®";s:3:"爫";s:3:"爫";s:3:"ï©Š";s:3:"ç¢";s:3:"ï©‹";s:3:"碑";s:3:"ï©Œ";s:3:"社";s:3:"ï©";s:3:"祉";s:3:"ï©Ž";s:3:"祈";s:3:"ï©";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:3:"ï©‘";s:3:"ç¥";s:3:"ï©’";s:3:"ç¦";s:3:"ï©“";s:3:"禎";s:3:"ï©”";s:3:"ç©€";s:3:"ï©•";s:3:"çª";s:3:"ï©–";s:3:"節";s:3:"ï©—";s:3:"ç·´";s:3:"縉";s:3:"縉";s:3:"ï©™";s:3:"ç¹";s:3:"ï©š";s:3:"ç½²";s:3:"ï©›";s:3:"者";s:3:"ï©œ";s:3:"臭";s:3:"ï©";s:3:"艹";s:3:"ï©ž";s:3:"艹";s:3:"ï©Ÿ";s:3:"è‘—";s:3:"ï© ";s:3:"è¤";s:3:"ï©¡";s:3:"視";s:3:"ï©¢";s:3:"è¬";s:3:"ï©£";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"ï©¥";s:3:"è´ˆ";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"ï©©";s:3:"響";s:3:"頻";s:3:"é »";s:3:"ï©°";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"å…¨";s:3:"侀";s:3:"ä¾€";s:3:"ï©´";s:3:"å……";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"ï©·";s:3:"勺";s:3:"喝";s:3:"å–";s:3:"啕";s:3:"å••";s:3:"喙";s:3:"å–™";s:3:"ï©»";s:3:"å—¢";s:3:"塚";s:3:"å¡š";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"ï©¿";s:3:"奔";s:3:"婢";s:3:"å©¢";s:3:"ïª";s:3:"嬨";s:3:"廒";s:3:"å»’";s:3:"廙";s:3:"å»™";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"å¾­";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"æ…Ž";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"æ… ";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"ïª";s:3:"æ„";s:3:"搜";s:3:"æœ";s:3:"ïª";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"晴";s:3:"æ™´";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"æ–";s:3:"歹";s:3:"æ­¹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"æµ";s:3:"滛";s:3:"æ»›";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"æ¼¢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"ç…®";s:3:"ïª";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"ç”»";s:3:"瘝";s:3:"ç˜";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"ç››";s:3:"直";s:3:"ç›´";s:3:"睊";s:3:"çŠ";s:3:"着";s:3:"ç€";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"ç±»";s:3:"絛";s:3:"çµ›";s:3:"練";s:3:"ç·´";s:3:"缾";s:3:"ç¼¾";s:3:"者";s:3:"者";s:3:"荒";s:3:"è’";s:3:"華";s:3:"è¯";s:3:"蝹";s:3:"è¹";s:3:"襁";s:3:"è¥";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"è«‹";s:3:"謁";s:3:"è¬";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"è«­";s:3:"謹";s:3:"謹";s:3:"ï«€";s:3:"變";s:3:"ï«";s:3:"è´ˆ";s:3:"ï«‚";s:3:"輸";s:3:"遲";s:3:"é²";s:3:"ï«„";s:3:"醙";s:3:"ï«…";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"é–";s:3:"韛";s:3:"韛";s:3:"ï«Š";s:3:"響";s:3:"ï«‹";s:3:"é ‹";s:3:"ï«Œ";s:3:"é »";s:3:"ï«";s:3:"鬒";s:3:"ï«Ž";s:3:"龜";s:3:"ï«";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«‘";s:4:"ð£•";s:3:"ï«’";s:3:"ã®";s:3:"ï«“";s:3:"䀘";s:3:"ï«”";s:3:"䀹";s:3:"ï«•";s:4:"𥉉";s:3:"ï«–";s:4:"ð¥³";s:3:"ï«—";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"ï«™";s:3:"龎";s:3:"ï¬";s:4:"×™Ö´";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"ש×";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּ×";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"×Ö·";s:3:"אָ";s:4:"×Ö¸";s:3:"אּ";s:4:"×Ö¼";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"×’Ö¼";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"×”Ö¼";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"×–Ö¼";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"×™Ö¼";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"×›Ö¼";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"ï­€";s:4:"× Ö¼";s:3:"ï­";s:4:"סּ";s:3:"ï­ƒ";s:4:"×£Ö¼";s:3:"ï­„";s:4:"פּ";s:3:"ï­†";s:4:"צּ";s:3:"ï­‡";s:4:"קּ";s:3:"ï­ˆ";s:4:"רּ";s:3:"ï­‰";s:4:"שּ";s:3:"ï­Š";s:4:"תּ";s:3:"ï­‹";s:4:"וֹ";s:3:"ï­Œ";s:4:"בֿ";s:3:"ï­";s:4:"×›Ö¿";s:3:"ï­Ž";s:4:"פֿ";s:4:"ð…ž";s:8:"ð…—ð…¥";s:4:"ð…Ÿ";s:8:"ð…˜ð…¥";s:4:"ð… ";s:12:"ð…˜ð…¥ð…®";s:4:"ð…¡";s:12:"ð…˜ð…¥ð…¯";s:4:"ð…¢";s:12:"ð…˜ð…¥ð…°";s:4:"ð…£";s:12:"ð…˜ð…¥ð…±";s:4:"ð…¤";s:12:"ð…˜ð…¥ð…²";s:4:"ð†»";s:8:"ð†¹ð…¥";s:4:"ð†¼";s:8:"ð†ºð…¥";s:4:"ð†½";s:12:"ð†¹ð…¥ð…®";s:4:"ð†¾";s:12:"ð†ºð…¥ð…®";s:4:"ð†¿";s:12:"ð†¹ð…¥ð…¯";s:4:"ð‡€";s:12:"ð†ºð…¥ð…¯";s:4:"丽";s:3:"丽";s:4:"ð¯ ";s:3:"丸";s:4:"乁";s:3:"ä¹";s:4:"𠄢";s:4:"ð „¢";s:4:"你";s:3:"ä½ ";s:4:"侮";s:3:"ä¾®";s:4:"侻";s:3:"ä¾»";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"åº";s:4:"備";s:3:"å‚™";s:4:"僧";s:3:"僧";s:4:"像";s:3:"åƒ";s:4:"㒞";s:3:"ã’ž";s:4:"ð¯ ";s:4:"𠘺";s:4:"免";s:3:"å…";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"具";s:3:"å…·";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"ã’¹";s:4:"內";s:3:"å…§";s:4:"再";s:3:"å†";s:4:"𠕋";s:4:"ð •‹";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"ð¯ ";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"ã“Ÿ";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"å‰";s:4:"卑";s:3:"å‘";s:4:"博";s:3:"åš";s:4:"即";s:3:"å³";s:4:"卽";s:3:"å½";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"ç°";s:4:"及";s:3:"åŠ";s:4:"叟";s:3:"åŸ";s:4:"𠭣";s:4:"ð ­£";s:4:"叫";s:3:"å«";s:4:"叱";s:3:"å±";s:4:"吆";s:3:"å†";s:4:"咞";s:3:"å’ž";s:4:"吸";s:3:"å¸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"å’¢";s:4:"ð¯¡";s:3:"哶";s:4:"唐";s:3:"å”";s:4:"啓";s:3:"å•“";s:4:"啣";s:3:"å•£";s:4:"善";s:3:"å–„";s:4:"善";s:3:"å–„";s:4:"喙";s:3:"å–™";s:4:"喫";s:3:"å–«";s:4:"喳";s:3:"å–³";s:4:"嗂";s:3:"å—‚";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"ð¯¡";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"ð¯¡";s:3:"å™´";s:4:"ð¯¡";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"å ";s:4:"型";s:3:"åž‹";s:4:"堲";s:3:"å ²";s:4:"報";s:3:"å ±";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"ð¯¡";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"ã›®";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"å°†";s:4:"当";s:3:"当";s:4:"尢";s:3:"å°¢";s:4:"㞁";s:3:"ãž";s:4:"屠";s:3:"å± ";s:4:"屮";s:3:"å±®";s:4:"峀";s:3:"å³€";s:4:"岍";s:3:"å²";s:4:"𡷤";s:4:"ð¡·¤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"ð¡·¦";s:4:"嵮";s:3:"åµ®";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"åµ¼";s:4:"ð¯¢";s:3:"å·¡";s:4:"巢";s:3:"å·¢";s:4:"㠯";s:3:"ã ¯";s:4:"巽";s:3:"å·½";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"ã¡¢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"ð¯¢";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"èˆ";s:4:"弢";s:3:"å¼¢";s:4:"弢";s:3:"å¼¢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"å½¢";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"ð¯¢";s:3:"å¿";s:4:"志";s:3:"å¿—";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"æ‚";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"æ‚”";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"æ…ˆ";s:4:"慌";s:3:"æ…Œ";s:4:"慎";s:3:"æ…Ž";s:4:"慌";s:3:"æ…Œ";s:4:"慺";s:3:"æ…º";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"æˆ";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"æ‰";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"æ‹”";s:4:"捐";s:3:"æ";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"æ¨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"æ¤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"æ¢";s:4:"揅";s:3:"æ…";s:4:"ð¯£";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"æ‘©";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"æ’";s:4:"摷";s:3:"æ‘·";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"æ•";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"æ—£";s:4:"書";s:3:"書";s:4:"ð¯£";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"ð¯£";s:3:"æš‘";s:4:"ð¯£";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"æšœ";s:4:"肭";s:3:"è‚­";s:4:"䏙";s:3:"ä™";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"æž";s:4:"杓";s:3:"æ“";s:4:"ð¯£";s:4:"ð£ƒ";s:4:"㭉";s:3:"ã­‰";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"æž…";s:4:"桒";s:3:"æ¡’";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"æ Ÿ";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"ã®";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"æ«›";s:4:"㰘";s:3:"ã°˜";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"æ­”";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"æ­²";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"æ®»";s:4:"𣪍";s:4:"ð£ª";s:4:"𡴋";s:4:"ð¡´‹";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"æ³";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"æ´–";s:4:"派";s:3:"æ´¾";s:4:"ð¯¤";s:3:"æµ·";s:4:"流";s:3:"æµ";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"æ´´";s:4:"港";s:3:"港";s:4:"湮";s:3:"æ¹®";s:4:"㴳";s:3:"ã´³";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"ð¯¤";s:4:"𣻑";s:4:"淹";s:3:"æ·¹";s:4:"ð¯¤";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"çŠ";s:4:"災";s:3:"ç½";s:4:"灷";s:3:"ç·";s:4:"炭";s:3:"ç‚­";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"ç……";s:4:"ð¯¤";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"ç‰";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"çº";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"ç‘œ";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"ç’…";s:4:"瓊";s:3:"ç“Š";s:4:"㼛";s:3:"ã¼›";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"ç•°";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"ç˜";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"ð¥„";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"ç›´";s:4:"ð¯¥";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"çŠ";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"çž‹";s:4:"䁆";s:3:"ä†";s:4:"䂖";s:3:"ä‚–";s:4:"ð¯¥";s:4:"ð¥";s:4:"硎";s:3:"ç¡Ž";s:4:"ð¯¥";s:3:"碌";s:4:"ð¯¥";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"ç¦";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"ç©€";s:4:"穊";s:3:"ç©Š";s:4:"穏";s:3:"ç©";s:4:"𥥼";s:4:"𥥼";s:4:"ð¯¥";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"ç«®";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"ç³’";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"ç³£";s:4:"紀";s:3:"ç´€";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"çµ£";s:4:"䌁";s:3:"äŒ";s:4:"緇";s:3:"ç·‡";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"ç¹…";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"ä™";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"è ";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"è°";s:4:"𣍟";s:4:"ð£Ÿ";s:4:"ð¯¦";s:3:"ä•";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"ä‹";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"èˆ";s:4:"舄";s:3:"舄";s:4:"ð¯¦";s:3:"辞";s:4:"䑫";s:3:"ä‘«";s:4:"ð¯¦";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"芝";s:3:"èŠ";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"è‹¥";s:4:"茝";s:3:"èŒ";s:4:"荣";s:3:"è£";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"ð¯¦";s:3:"莽";s:4:"菧";s:3:"è§";s:4:"著";s:3:"è‘—";s:4:"荓";s:3:"è“";s:4:"菊";s:3:"èŠ";s:4:"菌";s:3:"èŒ";s:4:"菜";s:3:"èœ";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"è”–";s:4:"𧏊";s:4:"ð§Š";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"ä•";s:4:"䕡";s:3:"ä•¡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"ä•«";s:4:"虐";s:3:"è™";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"èš©";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"è¹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"è«";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"ä——";s:4:"蟡";s:3:"蟡";s:4:"ð¯§";s:3:"è ";s:4:"䗹";s:3:"ä—¹";s:4:"衠";s:3:"è¡ ";s:4:"衣";s:3:"è¡£";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"ã’»";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"ð¯§";s:3:"äš¾";s:4:"䛇";s:3:"䛇";s:4:"ð¯§";s:3:"誠";s:4:"ð¯§";s:3:"è«­";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"è³";s:4:"贛";s:3:"è´›";s:4:"起";s:3:"èµ·";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"ð  „";s:4:"跋";s:3:"è·‹";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"è·°";s:4:"ð¯§";s:4:"𠣞";s:4:"軔";s:3:"è»”";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"é‚”";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"é„‘";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"é„›";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"é‹—";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"é¹";s:4:"鐕";s:3:"é•";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"é–‹";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"é–·";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"ð©……";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"ä©®";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"ð©Š";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"ð©’–";s:4:"頋";s:3:"é ‹";s:4:"頋";s:3:"é ‹";s:4:"頩";s:3:"é ©";s:4:"ð¯¨";s:4:"ð©–¶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"é±€";s:4:"鳽";s:3:"é³½";s:4:"ð¯¨";s:3:"䳎";s:4:"䳭";s:3:"ä³­";s:4:"ð¯¨";s:3:"鵧";s:4:"ð¯¨";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"äµ–";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"é¼…";s:4:"鼏";s:3:"é¼";s:4:"鼖";s:3:"é¼–";s:4:"鼻";s:3:"é¼»";s:4:"ð¯¨";s:4:"𪘀";}' );
+UtfNormal::$utfCheckNFC = unserialize( 'a:1217:{s:2:"Í€";s:1:"N";s:2:"Í";s:1:"N";s:2:"̓";s:1:"N";s:2:"Í„";s:1:"N";s:2:"Í´";s:1:"N";s:2:";";s:1:"N";s:2:"·";s:1:"N";s:3:"क़";s:1:"N";s:3:"ख़";s:1:"N";s:3:"ग़";s:1:"N";s:3:"ज़";s:1:"N";s:3:"ड़";s:1:"N";s:3:"à¥";s:1:"N";s:3:"फ़";s:1:"N";s:3:"य़";s:1:"N";s:3:"ড়";s:1:"N";s:3:"à§";s:1:"N";s:3:"য়";s:1:"N";s:3:"ਲ਼";s:1:"N";s:3:"ਸ਼";s:1:"N";s:3:"à©™";s:1:"N";s:3:"à©š";s:1:"N";s:3:"à©›";s:1:"N";s:3:"à©ž";s:1:"N";s:3:"à­œ";s:1:"N";s:3:"à­";s:1:"N";s:3:"གྷ";s:1:"N";s:3:"à½";s:1:"N";s:3:"དྷ";s:1:"N";s:3:"བྷ";s:1:"N";s:3:"ཛྷ";s:1:"N";s:3:"ཀྵ";s:1:"N";s:3:"ཱི";s:1:"N";s:3:"ཱུ";s:1:"N";s:3:"ྲྀ";s:1:"N";s:3:"ླྀ";s:1:"N";s:3:"à¾";s:1:"N";s:3:"ྒྷ";s:1:"N";s:3:"à¾";s:1:"N";s:3:"ྡྷ";s:1:"N";s:3:"ྦྷ";s:1:"N";s:3:"ྫྷ";s:1:"N";s:3:"ྐྵ";s:1:"N";s:3:"á½±";s:1:"N";s:3:"á½³";s:1:"N";s:3:"á½µ";s:1:"N";s:3:"á½·";s:1:"N";s:3:"á½¹";s:1:"N";s:3:"á½»";s:1:"N";s:3:"á½½";s:1:"N";s:3:"á¾»";s:1:"N";s:3:"á¾¾";s:1:"N";s:3:"Έ";s:1:"N";s:3:"á¿‹";s:1:"N";s:3:"á¿“";s:1:"N";s:3:"á¿›";s:1:"N";s:3:"á¿£";s:1:"N";s:3:"á¿«";s:1:"N";s:3:"á¿®";s:1:"N";s:3:"`";s:1:"N";s:3:"Ό";s:1:"N";s:3:"á¿»";s:1:"N";s:3:"´";s:1:"N";s:3:" ";s:1:"N";s:3:"â€";s:1:"N";s:3:"Ω";s:1:"N";s:3:"K";s:1:"N";s:3:"â„«";s:1:"N";s:3:"〈";s:1:"N";s:3:"〉";s:1:"N";s:3:"â«œ";s:1:"N";s:3:"豈";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"車";s:1:"N";s:3:"賈";s:1:"N";s:3:"滑";s:1:"N";s:3:"串";s:1:"N";s:3:"句";s:1:"N";s:3:"龜";s:1:"N";s:3:"龜";s:1:"N";s:3:"契";s:1:"N";s:3:"金";s:1:"N";s:3:"喇";s:1:"N";s:3:"奈";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"癩";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"螺";s:1:"N";s:3:"裸";s:1:"N";s:3:"邏";s:1:"N";s:3:"樂";s:1:"N";s:3:"洛";s:1:"N";s:3:"烙";s:1:"N";s:3:"珞";s:1:"N";s:3:"落";s:1:"N";s:3:"酪";s:1:"N";s:3:"駱";s:1:"N";s:3:"亂";s:1:"N";s:3:"卵";s:1:"N";s:3:"ï¤";s:1:"N";s:3:"爛";s:1:"N";s:3:"蘭";s:1:"N";s:3:"鸞";s:1:"N";s:3:"嵐";s:1:"N";s:3:"濫";s:1:"N";s:3:"藍";s:1:"N";s:3:"襤";s:1:"N";s:3:"拉";s:1:"N";s:3:"臘";s:1:"N";s:3:"蠟";s:1:"N";s:3:"廊";s:1:"N";s:3:"朗";s:1:"N";s:3:"浪";s:1:"N";s:3:"狼";s:1:"N";s:3:"郎";s:1:"N";s:3:"來";s:1:"N";s:3:"冷";s:1:"N";s:3:"勞";s:1:"N";s:3:"擄";s:1:"N";s:3:"櫓";s:1:"N";s:3:"爐";s:1:"N";s:3:"盧";s:1:"N";s:3:"老";s:1:"N";s:3:"蘆";s:1:"N";s:3:"虜";s:1:"N";s:3:"路";s:1:"N";s:3:"露";s:1:"N";s:3:"魯";s:1:"N";s:3:"鷺";s:1:"N";s:3:"碌";s:1:"N";s:3:"祿";s:1:"N";s:3:"綠";s:1:"N";s:3:"菉";s:1:"N";s:3:"錄";s:1:"N";s:3:"鹿";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"壟";s:1:"N";s:3:"弄";s:1:"N";s:3:"籠";s:1:"N";s:3:"聾";s:1:"N";s:3:"牢";s:1:"N";s:3:"磊";s:1:"N";s:3:"賂";s:1:"N";s:3:"雷";s:1:"N";s:3:"壘";s:1:"N";s:3:"屢";s:1:"N";s:3:"樓";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"漏";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"陋";s:1:"N";s:3:"勒";s:1:"N";s:3:"肋";s:1:"N";s:3:"凜";s:1:"N";s:3:"凌";s:1:"N";s:3:"稜";s:1:"N";s:3:"綾";s:1:"N";s:3:"菱";s:1:"N";s:3:"陵";s:1:"N";s:3:"讀";s:1:"N";s:3:"拏";s:1:"N";s:3:"樂";s:1:"N";s:3:"ï¥";s:1:"N";s:3:"丹";s:1:"N";s:3:"寧";s:1:"N";s:3:"怒";s:1:"N";s:3:"率";s:1:"N";s:3:"異";s:1:"N";s:3:"北";s:1:"N";s:3:"磻";s:1:"N";s:3:"便";s:1:"N";s:3:"復";s:1:"N";s:3:"不";s:1:"N";s:3:"泌";s:1:"N";s:3:"數";s:1:"N";s:3:"索";s:1:"N";s:3:"參";s:1:"N";s:3:"塞";s:1:"N";s:3:"省";s:1:"N";s:3:"葉";s:1:"N";s:3:"說";s:1:"N";s:3:"殺";s:1:"N";s:3:"辰";s:1:"N";s:3:"沈";s:1:"N";s:3:"拾";s:1:"N";s:3:"若";s:1:"N";s:3:"掠";s:1:"N";s:3:"略";s:1:"N";s:3:"亮";s:1:"N";s:3:"兩";s:1:"N";s:3:"凉";s:1:"N";s:3:"梁";s:1:"N";s:3:"糧";s:1:"N";s:3:"良";s:1:"N";s:3:"諒";s:1:"N";s:3:"量";s:1:"N";s:3:"勵";s:1:"N";s:3:"呂";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"廬";s:1:"N";s:3:"旅";s:1:"N";s:3:"濾";s:1:"N";s:3:"礪";s:1:"N";s:3:"閭";s:1:"N";s:3:"驪";s:1:"N";s:3:"麗";s:1:"N";s:3:"黎";s:1:"N";s:3:"力";s:1:"N";s:3:"曆";s:1:"N";s:3:"歷";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"年";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"撚";s:1:"N";s:3:"漣";s:1:"N";s:3:"煉";s:1:"N";s:3:"璉";s:1:"N";s:3:"秊";s:1:"N";s:3:"練";s:1:"N";s:3:"聯";s:1:"N";s:3:"輦";s:1:"N";s:3:"蓮";s:1:"N";s:3:"連";s:1:"N";s:3:"鍊";s:1:"N";s:3:"列";s:1:"N";s:3:"ï¦";s:1:"N";s:3:"咽";s:1:"N";s:3:"烈";s:1:"N";s:3:"裂";s:1:"N";s:3:"說";s:1:"N";s:3:"廉";s:1:"N";s:3:"念";s:1:"N";s:3:"捻";s:1:"N";s:3:"殮";s:1:"N";s:3:"簾";s:1:"N";s:3:"獵";s:1:"N";s:3:"令";s:1:"N";s:3:"囹";s:1:"N";s:3:"寧";s:1:"N";s:3:"嶺";s:1:"N";s:3:"怜";s:1:"N";s:3:"玲";s:1:"N";s:3:"瑩";s:1:"N";s:3:"羚";s:1:"N";s:3:"聆";s:1:"N";s:3:"鈴";s:1:"N";s:3:"零";s:1:"N";s:3:"靈";s:1:"N";s:3:"領";s:1:"N";s:3:"例";s:1:"N";s:3:"禮";s:1:"N";s:3:"醴";s:1:"N";s:3:"隸";s:1:"N";s:3:"惡";s:1:"N";s:3:"了";s:1:"N";s:3:"僚";s:1:"N";s:3:"寮";s:1:"N";s:3:"尿";s:1:"N";s:3:"料";s:1:"N";s:3:"樂";s:1:"N";s:3:"燎";s:1:"N";s:3:"ï§";s:1:"N";s:3:"蓼";s:1:"N";s:3:"遼";s:1:"N";s:3:"龍";s:1:"N";s:3:"暈";s:1:"N";s:3:"阮";s:1:"N";s:3:"劉";s:1:"N";s:3:"杻";s:1:"N";s:3:"柳";s:1:"N";s:3:"流";s:1:"N";s:3:"溜";s:1:"N";s:3:"琉";s:1:"N";s:3:"ï§";s:1:"N";s:3:"硫";s:1:"N";s:3:"ï§";s:1:"N";s:3:"ï§";s:1:"N";s:3:"六";s:1:"N";s:3:"戮";s:1:"N";s:3:"陸";s:1:"N";s:3:"倫";s:1:"N";s:3:"崙";s:1:"N";s:3:"淪";s:1:"N";s:3:"輪";s:1:"N";s:3:"律";s:1:"N";s:3:"慄";s:1:"N";s:3:"栗";s:1:"N";s:3:"率";s:1:"N";s:3:"隆";s:1:"N";s:3:"ï§";s:1:"N";s:3:"吏";s:1:"N";s:3:"履";s:1:"N";s:3:"易";s:1:"N";s:3:"李";s:1:"N";s:3:"梨";s:1:"N";s:3:"泥";s:1:"N";s:3:"理";s:1:"N";s:3:"痢";s:1:"N";s:3:"罹";s:1:"N";s:3:"裏";s:1:"N";s:3:"裡";s:1:"N";s:3:"里";s:1:"N";s:3:"離";s:1:"N";s:3:"匿";s:1:"N";s:3:"溺";s:1:"N";s:3:"吝";s:1:"N";s:3:"燐";s:1:"N";s:3:"璘";s:1:"N";s:3:"藺";s:1:"N";s:3:"隣";s:1:"N";s:3:"鱗";s:1:"N";s:3:"麟";s:1:"N";s:3:"林";s:1:"N";s:3:"淋";s:1:"N";s:3:"臨";s:1:"N";s:3:"立";s:1:"N";s:3:"笠";s:1:"N";s:3:"粒";s:1:"N";s:3:"狀";s:1:"N";s:3:"炙";s:1:"N";s:3:"識";s:1:"N";s:3:"什";s:1:"N";s:3:"茶";s:1:"N";s:3:"刺";s:1:"N";s:3:"切";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"拓";s:1:"N";s:3:"糖";s:1:"N";s:3:"宅";s:1:"N";s:3:"洞";s:1:"N";s:3:"暴";s:1:"N";s:3:"輻";s:1:"N";s:3:"行";s:1:"N";s:3:"降";s:1:"N";s:3:"見";s:1:"N";s:3:"廓";s:1:"N";s:3:"兀";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"晴";s:1:"N";s:3:"凞";s:1:"N";s:3:"猪";s:1:"N";s:3:"益";s:1:"N";s:3:"礼";s:1:"N";s:3:"神";s:1:"N";s:3:"祥";s:1:"N";s:3:"福";s:1:"N";s:3:"靖";s:1:"N";s:3:"ï¨";s:1:"N";s:3:"羽";s:1:"N";s:3:"蘒";s:1:"N";s:3:"諸";s:1:"N";s:3:"逸";s:1:"N";s:3:"都";s:1:"N";s:3:"飯";s:1:"N";s:3:"飼";s:1:"N";s:3:"館";s:1:"N";s:3:"鶴";s:1:"N";s:3:"侮";s:1:"N";s:3:"僧";s:1:"N";s:3:"免";s:1:"N";s:3:"勉";s:1:"N";s:3:"勤";s:1:"N";s:3:"卑";s:1:"N";s:3:"喝";s:1:"N";s:3:"嘆";s:1:"N";s:3:"器";s:1:"N";s:3:"塀";s:1:"N";s:3:"墨";s:1:"N";s:3:"層";s:1:"N";s:3:"屮";s:1:"N";s:3:"悔";s:1:"N";s:3:"慨";s:1:"N";s:3:"憎";s:1:"N";s:3:"ï©€";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©‚";s:1:"N";s:3:"暑";s:1:"N";s:3:"ï©„";s:1:"N";s:3:"ï©…";s:1:"N";s:3:"渚";s:1:"N";s:3:"漢";s:1:"N";s:3:"煮";s:1:"N";s:3:"爫";s:1:"N";s:3:"ï©Š";s:1:"N";s:3:"ï©‹";s:1:"N";s:3:"ï©Œ";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©Ž";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©‘";s:1:"N";s:3:"ï©’";s:1:"N";s:3:"ï©“";s:1:"N";s:3:"ï©”";s:1:"N";s:3:"ï©•";s:1:"N";s:3:"ï©–";s:1:"N";s:3:"ï©—";s:1:"N";s:3:"縉";s:1:"N";s:3:"ï©™";s:1:"N";s:3:"ï©š";s:1:"N";s:3:"ï©›";s:1:"N";s:3:"ï©œ";s:1:"N";s:3:"ï©";s:1:"N";s:3:"ï©ž";s:1:"N";s:3:"ï©Ÿ";s:1:"N";s:3:"ï© ";s:1:"N";s:3:"ï©¡";s:1:"N";s:3:"ï©¢";s:1:"N";s:3:"ï©£";s:1:"N";s:3:"賓";s:1:"N";s:3:"ï©¥";s:1:"N";s:3:"辶";s:1:"N";s:3:"逸";s:1:"N";s:3:"難";s:1:"N";s:3:"ï©©";s:1:"N";s:3:"頻";s:1:"N";s:3:"ï©°";s:1:"N";s:3:"况";s:1:"N";s:3:"全";s:1:"N";s:3:"侀";s:1:"N";s:3:"ï©´";s:1:"N";s:3:"冀";s:1:"N";s:3:"勇";s:1:"N";s:3:"ï©·";s:1:"N";s:3:"喝";s:1:"N";s:3:"啕";s:1:"N";s:3:"喙";s:1:"N";s:3:"ï©»";s:1:"N";s:3:"塚";s:1:"N";s:3:"墳";s:1:"N";s:3:"奄";s:1:"N";s:3:"ï©¿";s:1:"N";s:3:"婢";s:1:"N";s:3:"ïª";s:1:"N";s:3:"廒";s:1:"N";s:3:"廙";s:1:"N";s:3:"彩";s:1:"N";s:3:"徭";s:1:"N";s:3:"惘";s:1:"N";s:3:"慎";s:1:"N";s:3:"愈";s:1:"N";s:3:"憎";s:1:"N";s:3:"慠";s:1:"N";s:3:"懲";s:1:"N";s:3:"戴";s:1:"N";s:3:"ïª";s:1:"N";s:3:"搜";s:1:"N";s:3:"ïª";s:1:"N";s:3:"ïª";s:1:"N";s:3:"晴";s:1:"N";s:3:"朗";s:1:"N";s:3:"望";s:1:"N";s:3:"杖";s:1:"N";s:3:"歹";s:1:"N";s:3:"殺";s:1:"N";s:3:"流";s:1:"N";s:3:"滛";s:1:"N";s:3:"滋";s:1:"N";s:3:"漢";s:1:"N";s:3:"瀞";s:1:"N";s:3:"煮";s:1:"N";s:3:"ïª";s:1:"N";s:3:"爵";s:1:"N";s:3:"犯";s:1:"N";s:3:"猪";s:1:"N";s:3:"瑱";s:1:"N";s:3:"甆";s:1:"N";s:3:"画";s:1:"N";s:3:"瘝";s:1:"N";s:3:"瘟";s:1:"N";s:3:"益";s:1:"N";s:3:"盛";s:1:"N";s:3:"直";s:1:"N";s:3:"睊";s:1:"N";s:3:"着";s:1:"N";s:3:"磌";s:1:"N";s:3:"窱";s:1:"N";s:3:"節";s:1:"N";s:3:"类";s:1:"N";s:3:"絛";s:1:"N";s:3:"練";s:1:"N";s:3:"缾";s:1:"N";s:3:"者";s:1:"N";s:3:"荒";s:1:"N";s:3:"華";s:1:"N";s:3:"蝹";s:1:"N";s:3:"襁";s:1:"N";s:3:"覆";s:1:"N";s:3:"視";s:1:"N";s:3:"調";s:1:"N";s:3:"諸";s:1:"N";s:3:"請";s:1:"N";s:3:"謁";s:1:"N";s:3:"諾";s:1:"N";s:3:"諭";s:1:"N";s:3:"謹";s:1:"N";s:3:"ï«€";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«‚";s:1:"N";s:3:"遲";s:1:"N";s:3:"ï«„";s:1:"N";s:3:"ï«…";s:1:"N";s:3:"陼";s:1:"N";s:3:"難";s:1:"N";s:3:"靖";s:1:"N";s:3:"韛";s:1:"N";s:3:"ï«Š";s:1:"N";s:3:"ï«‹";s:1:"N";s:3:"ï«Œ";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«Ž";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«";s:1:"N";s:3:"ï«‘";s:1:"N";s:3:"ï«’";s:1:"N";s:3:"ï«“";s:1:"N";s:3:"ï«”";s:1:"N";s:3:"ï«•";s:1:"N";s:3:"ï«–";s:1:"N";s:3:"ï«—";s:1:"N";s:3:"齃";s:1:"N";s:3:"ï«™";s:1:"N";s:3:"ï¬";s:1:"N";s:3:"ײַ";s:1:"N";s:3:"שׁ";s:1:"N";s:3:"שׂ";s:1:"N";s:3:"שּׁ";s:1:"N";s:3:"שּׂ";s:1:"N";s:3:"אַ";s:1:"N";s:3:"אָ";s:1:"N";s:3:"אּ";s:1:"N";s:3:"בּ";s:1:"N";s:3:"גּ";s:1:"N";s:3:"דּ";s:1:"N";s:3:"הּ";s:1:"N";s:3:"וּ";s:1:"N";s:3:"זּ";s:1:"N";s:3:"טּ";s:1:"N";s:3:"יּ";s:1:"N";s:3:"ךּ";s:1:"N";s:3:"כּ";s:1:"N";s:3:"לּ";s:1:"N";s:3:"מּ";s:1:"N";s:3:"ï­€";s:1:"N";s:3:"ï­";s:1:"N";s:3:"ï­ƒ";s:1:"N";s:3:"ï­„";s:1:"N";s:3:"ï­†";s:1:"N";s:3:"ï­‡";s:1:"N";s:3:"ï­ˆ";s:1:"N";s:3:"ï­‰";s:1:"N";s:3:"ï­Š";s:1:"N";s:3:"ï­‹";s:1:"N";s:3:"ï­Œ";s:1:"N";s:3:"ï­";s:1:"N";s:3:"ï­Ž";s:1:"N";s:4:"ð…ž";s:1:"N";s:4:"ð…Ÿ";s:1:"N";s:4:"ð… ";s:1:"N";s:4:"ð…¡";s:1:"N";s:4:"ð…¢";s:1:"N";s:4:"ð…£";s:1:"N";s:4:"ð…¤";s:1:"N";s:4:"ð†»";s:1:"N";s:4:"ð†¼";s:1:"N";s:4:"ð†½";s:1:"N";s:4:"ð†¾";s:1:"N";s:4:"ð†¿";s:1:"N";s:4:"ð‡€";s:1:"N";s:4:"丽";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"乁";s:1:"N";s:4:"𠄢";s:1:"N";s:4:"你";s:1:"N";s:4:"侮";s:1:"N";s:4:"侻";s:1:"N";s:4:"倂";s:1:"N";s:4:"偺";s:1:"N";s:4:"備";s:1:"N";s:4:"僧";s:1:"N";s:4:"像";s:1:"N";s:4:"㒞";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"免";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"具";s:1:"N";s:4:"𠔜";s:1:"N";s:4:"㒹";s:1:"N";s:4:"內";s:1:"N";s:4:"再";s:1:"N";s:4:"𠕋";s:1:"N";s:4:"冗";s:1:"N";s:4:"冤";s:1:"N";s:4:"仌";s:1:"N";s:4:"冬";s:1:"N";s:4:"况";s:1:"N";s:4:"𩇟";s:1:"N";s:4:"ð¯ ";s:1:"N";s:4:"刃";s:1:"N";s:4:"㓟";s:1:"N";s:4:"刻";s:1:"N";s:4:"剆";s:1:"N";s:4:"割";s:1:"N";s:4:"剷";s:1:"N";s:4:"㔕";s:1:"N";s:4:"勇";s:1:"N";s:4:"勉";s:1:"N";s:4:"勤";s:1:"N";s:4:"勺";s:1:"N";s:4:"包";s:1:"N";s:4:"匆";s:1:"N";s:4:"北";s:1:"N";s:4:"卉";s:1:"N";s:4:"卑";s:1:"N";s:4:"博";s:1:"N";s:4:"即";s:1:"N";s:4:"卽";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"𠨬";s:1:"N";s:4:"灰";s:1:"N";s:4:"及";s:1:"N";s:4:"叟";s:1:"N";s:4:"𠭣";s:1:"N";s:4:"叫";s:1:"N";s:4:"叱";s:1:"N";s:4:"吆";s:1:"N";s:4:"咞";s:1:"N";s:4:"吸";s:1:"N";s:4:"呈";s:1:"N";s:4:"周";s:1:"N";s:4:"咢";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"唐";s:1:"N";s:4:"啓";s:1:"N";s:4:"啣";s:1:"N";s:4:"善";s:1:"N";s:4:"善";s:1:"N";s:4:"喙";s:1:"N";s:4:"喫";s:1:"N";s:4:"喳";s:1:"N";s:4:"嗂";s:1:"N";s:4:"圖";s:1:"N";s:4:"嘆";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"噑";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"壮";s:1:"N";s:4:"城";s:1:"N";s:4:"埴";s:1:"N";s:4:"堍";s:1:"N";s:4:"型";s:1:"N";s:4:"堲";s:1:"N";s:4:"報";s:1:"N";s:4:"墬";s:1:"N";s:4:"𡓤";s:1:"N";s:4:"売";s:1:"N";s:4:"壷";s:1:"N";s:4:"夆";s:1:"N";s:4:"ð¯¡";s:1:"N";s:4:"夢";s:1:"N";s:4:"奢";s:1:"N";s:4:"𡚨";s:1:"N";s:4:"𡛪";s:1:"N";s:4:"姬";s:1:"N";s:4:"娛";s:1:"N";s:4:"娧";s:1:"N";s:4:"姘";s:1:"N";s:4:"婦";s:1:"N";s:4:"㛮";s:1:"N";s:4:"㛼";s:1:"N";s:4:"嬈";s:1:"N";s:4:"嬾";s:1:"N";s:4:"嬾";s:1:"N";s:4:"𡧈";s:1:"N";s:4:"寃";s:1:"N";s:4:"寘";s:1:"N";s:4:"寧";s:1:"N";s:4:"寳";s:1:"N";s:4:"𡬘";s:1:"N";s:4:"寿";s:1:"N";s:4:"将";s:1:"N";s:4:"当";s:1:"N";s:4:"尢";s:1:"N";s:4:"㞁";s:1:"N";s:4:"屠";s:1:"N";s:4:"屮";s:1:"N";s:4:"峀";s:1:"N";s:4:"岍";s:1:"N";s:4:"𡷤";s:1:"N";s:4:"嵃";s:1:"N";s:4:"𡷦";s:1:"N";s:4:"嵮";s:1:"N";s:4:"嵫";s:1:"N";s:4:"嵼";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"巢";s:1:"N";s:4:"㠯";s:1:"N";s:4:"巽";s:1:"N";s:4:"帨";s:1:"N";s:4:"帽";s:1:"N";s:4:"幩";s:1:"N";s:4:"㡢";s:1:"N";s:4:"𢆃";s:1:"N";s:4:"㡼";s:1:"N";s:4:"庰";s:1:"N";s:4:"庳";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"廊";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"舁";s:1:"N";s:4:"弢";s:1:"N";s:4:"弢";s:1:"N";s:4:"㣇";s:1:"N";s:4:"𣊸";s:1:"N";s:4:"𦇚";s:1:"N";s:4:"形";s:1:"N";s:4:"彫";s:1:"N";s:4:"㣣";s:1:"N";s:4:"徚";s:1:"N";s:4:"ð¯¢";s:1:"N";s:4:"志";s:1:"N";s:4:"忹";s:1:"N";s:4:"悁";s:1:"N";s:4:"㤺";s:1:"N";s:4:"㤜";s:1:"N";s:4:"悔";s:1:"N";s:4:"𢛔";s:1:"N";s:4:"惇";s:1:"N";s:4:"慈";s:1:"N";s:4:"慌";s:1:"N";s:4:"慎";s:1:"N";s:4:"慌";s:1:"N";s:4:"慺";s:1:"N";s:4:"憎";s:1:"N";s:4:"憲";s:1:"N";s:4:"憤";s:1:"N";s:4:"憯";s:1:"N";s:4:"懞";s:1:"N";s:4:"懲";s:1:"N";s:4:"懶";s:1:"N";s:4:"成";s:1:"N";s:4:"戛";s:1:"N";s:4:"扝";s:1:"N";s:4:"抱";s:1:"N";s:4:"拔";s:1:"N";s:4:"捐";s:1:"N";s:4:"𢬌";s:1:"N";s:4:"挽";s:1:"N";s:4:"拼";s:1:"N";s:4:"捨";s:1:"N";s:4:"掃";s:1:"N";s:4:"揤";s:1:"N";s:4:"𢯱";s:1:"N";s:4:"搢";s:1:"N";s:4:"揅";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㨮";s:1:"N";s:4:"摩";s:1:"N";s:4:"摾";s:1:"N";s:4:"撝";s:1:"N";s:4:"摷";s:1:"N";s:4:"㩬";s:1:"N";s:4:"敏";s:1:"N";s:4:"敬";s:1:"N";s:4:"𣀊";s:1:"N";s:4:"旣";s:1:"N";s:4:"書";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㬙";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㫤";s:1:"N";s:4:"冒";s:1:"N";s:4:"冕";s:1:"N";s:4:"最";s:1:"N";s:4:"暜";s:1:"N";s:4:"肭";s:1:"N";s:4:"䏙";s:1:"N";s:4:"朗";s:1:"N";s:4:"望";s:1:"N";s:4:"朡";s:1:"N";s:4:"杞";s:1:"N";s:4:"杓";s:1:"N";s:4:"ð¯£";s:1:"N";s:4:"㭉";s:1:"N";s:4:"柺";s:1:"N";s:4:"枅";s:1:"N";s:4:"桒";s:1:"N";s:4:"梅";s:1:"N";s:4:"𣑭";s:1:"N";s:4:"梎";s:1:"N";s:4:"栟";s:1:"N";s:4:"椔";s:1:"N";s:4:"㮝";s:1:"N";s:4:"楂";s:1:"N";s:4:"榣";s:1:"N";s:4:"槪";s:1:"N";s:4:"檨";s:1:"N";s:4:"𣚣";s:1:"N";s:4:"櫛";s:1:"N";s:4:"㰘";s:1:"N";s:4:"次";s:1:"N";s:4:"𣢧";s:1:"N";s:4:"歔";s:1:"N";s:4:"㱎";s:1:"N";s:4:"歲";s:1:"N";s:4:"殟";s:1:"N";s:4:"殺";s:1:"N";s:4:"殻";s:1:"N";s:4:"𣪍";s:1:"N";s:4:"𡴋";s:1:"N";s:4:"𣫺";s:1:"N";s:4:"汎";s:1:"N";s:4:"𣲼";s:1:"N";s:4:"沿";s:1:"N";s:4:"泍";s:1:"N";s:4:"汧";s:1:"N";s:4:"洖";s:1:"N";s:4:"派";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"流";s:1:"N";s:4:"浩";s:1:"N";s:4:"浸";s:1:"N";s:4:"涅";s:1:"N";s:4:"𣴞";s:1:"N";s:4:"洴";s:1:"N";s:4:"港";s:1:"N";s:4:"湮";s:1:"N";s:4:"㴳";s:1:"N";s:4:"滋";s:1:"N";s:4:"滇";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"淹";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"𣾎";s:1:"N";s:4:"濆";s:1:"N";s:4:"瀹";s:1:"N";s:4:"瀞";s:1:"N";s:4:"瀛";s:1:"N";s:4:"㶖";s:1:"N";s:4:"灊";s:1:"N";s:4:"災";s:1:"N";s:4:"灷";s:1:"N";s:4:"炭";s:1:"N";s:4:"𠔥";s:1:"N";s:4:"煅";s:1:"N";s:4:"ð¯¤";s:1:"N";s:4:"熜";s:1:"N";s:4:"𤎫";s:1:"N";s:4:"爨";s:1:"N";s:4:"爵";s:1:"N";s:4:"牐";s:1:"N";s:4:"𤘈";s:1:"N";s:4:"犀";s:1:"N";s:4:"犕";s:1:"N";s:4:"𤜵";s:1:"N";s:4:"𤠔";s:1:"N";s:4:"獺";s:1:"N";s:4:"王";s:1:"N";s:4:"㺬";s:1:"N";s:4:"玥";s:1:"N";s:4:"㺸";s:1:"N";s:4:"㺸";s:1:"N";s:4:"瑇";s:1:"N";s:4:"瑜";s:1:"N";s:4:"瑱";s:1:"N";s:4:"璅";s:1:"N";s:4:"瓊";s:1:"N";s:4:"㼛";s:1:"N";s:4:"甤";s:1:"N";s:4:"𤰶";s:1:"N";s:4:"甾";s:1:"N";s:4:"𤲒";s:1:"N";s:4:"異";s:1:"N";s:4:"𢆟";s:1:"N";s:4:"瘐";s:1:"N";s:4:"𤾡";s:1:"N";s:4:"𤾸";s:1:"N";s:4:"𥁄";s:1:"N";s:4:"㿼";s:1:"N";s:4:"䀈";s:1:"N";s:4:"直";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"𥃲";s:1:"N";s:4:"𥄙";s:1:"N";s:4:"𥄳";s:1:"N";s:4:"眞";s:1:"N";s:4:"真";s:1:"N";s:4:"真";s:1:"N";s:4:"睊";s:1:"N";s:4:"䀹";s:1:"N";s:4:"瞋";s:1:"N";s:4:"䁆";s:1:"N";s:4:"䂖";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"硎";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"䃣";s:1:"N";s:4:"𥘦";s:1:"N";s:4:"祖";s:1:"N";s:4:"𥚚";s:1:"N";s:4:"𥛅";s:1:"N";s:4:"福";s:1:"N";s:4:"秫";s:1:"N";s:4:"䄯";s:1:"N";s:4:"穀";s:1:"N";s:4:"穊";s:1:"N";s:4:"穏";s:1:"N";s:4:"𥥼";s:1:"N";s:4:"ð¯¥";s:1:"N";s:4:"𥪧";s:1:"N";s:4:"竮";s:1:"N";s:4:"䈂";s:1:"N";s:4:"𥮫";s:1:"N";s:4:"篆";s:1:"N";s:4:"築";s:1:"N";s:4:"䈧";s:1:"N";s:4:"𥲀";s:1:"N";s:4:"糒";s:1:"N";s:4:"䊠";s:1:"N";s:4:"糨";s:1:"N";s:4:"糣";s:1:"N";s:4:"紀";s:1:"N";s:4:"𥾆";s:1:"N";s:4:"絣";s:1:"N";s:4:"䌁";s:1:"N";s:4:"緇";s:1:"N";s:4:"縂";s:1:"N";s:4:"繅";s:1:"N";s:4:"䌴";s:1:"N";s:4:"𦈨";s:1:"N";s:4:"𦉇";s:1:"N";s:4:"䍙";s:1:"N";s:4:"𦋙";s:1:"N";s:4:"罺";s:1:"N";s:4:"𦌾";s:1:"N";s:4:"羕";s:1:"N";s:4:"翺";s:1:"N";s:4:"者";s:1:"N";s:4:"𦓚";s:1:"N";s:4:"𦔣";s:1:"N";s:4:"聠";s:1:"N";s:4:"𦖨";s:1:"N";s:4:"聰";s:1:"N";s:4:"𣍟";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"育";s:1:"N";s:4:"脃";s:1:"N";s:4:"䐋";s:1:"N";s:4:"脾";s:1:"N";s:4:"媵";s:1:"N";s:4:"𦞧";s:1:"N";s:4:"𦞵";s:1:"N";s:4:"𣎓";s:1:"N";s:4:"𣎜";s:1:"N";s:4:"舁";s:1:"N";s:4:"舄";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"䑫";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"芝";s:1:"N";s:4:"劳";s:1:"N";s:4:"花";s:1:"N";s:4:"芳";s:1:"N";s:4:"芽";s:1:"N";s:4:"苦";s:1:"N";s:4:"𦬼";s:1:"N";s:4:"若";s:1:"N";s:4:"茝";s:1:"N";s:4:"荣";s:1:"N";s:4:"莭";s:1:"N";s:4:"茣";s:1:"N";s:4:"ð¯¦";s:1:"N";s:4:"菧";s:1:"N";s:4:"著";s:1:"N";s:4:"荓";s:1:"N";s:4:"菊";s:1:"N";s:4:"菌";s:1:"N";s:4:"菜";s:1:"N";s:4:"𦰶";s:1:"N";s:4:"𦵫";s:1:"N";s:4:"𦳕";s:1:"N";s:4:"䔫";s:1:"N";s:4:"蓱";s:1:"N";s:4:"蓳";s:1:"N";s:4:"蔖";s:1:"N";s:4:"𧏊";s:1:"N";s:4:"蕤";s:1:"N";s:4:"𦼬";s:1:"N";s:4:"䕝";s:1:"N";s:4:"䕡";s:1:"N";s:4:"𦾱";s:1:"N";s:4:"𧃒";s:1:"N";s:4:"䕫";s:1:"N";s:4:"虐";s:1:"N";s:4:"虜";s:1:"N";s:4:"虧";s:1:"N";s:4:"虩";s:1:"N";s:4:"蚩";s:1:"N";s:4:"蚈";s:1:"N";s:4:"蜎";s:1:"N";s:4:"蛢";s:1:"N";s:4:"蝹";s:1:"N";s:4:"蜨";s:1:"N";s:4:"蝫";s:1:"N";s:4:"螆";s:1:"N";s:4:"䗗";s:1:"N";s:4:"蟡";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"䗹";s:1:"N";s:4:"衠";s:1:"N";s:4:"衣";s:1:"N";s:4:"𧙧";s:1:"N";s:4:"裗";s:1:"N";s:4:"裞";s:1:"N";s:4:"䘵";s:1:"N";s:4:"裺";s:1:"N";s:4:"㒻";s:1:"N";s:4:"𧢮";s:1:"N";s:4:"𧥦";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"䛇";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"變";s:1:"N";s:4:"豕";s:1:"N";s:4:"𧲨";s:1:"N";s:4:"貫";s:1:"N";s:4:"賁";s:1:"N";s:4:"贛";s:1:"N";s:4:"起";s:1:"N";s:4:"𧼯";s:1:"N";s:4:"𠠄";s:1:"N";s:4:"跋";s:1:"N";s:4:"趼";s:1:"N";s:4:"跰";s:1:"N";s:4:"ð¯§";s:1:"N";s:4:"軔";s:1:"N";s:4:"輸";s:1:"N";s:4:"𨗒";s:1:"N";s:4:"𨗭";s:1:"N";s:4:"邔";s:1:"N";s:4:"郱";s:1:"N";s:4:"鄑";s:1:"N";s:4:"𨜮";s:1:"N";s:4:"鄛";s:1:"N";s:4:"鈸";s:1:"N";s:4:"鋗";s:1:"N";s:4:"鋘";s:1:"N";s:4:"鉼";s:1:"N";s:4:"鏹";s:1:"N";s:4:"鐕";s:1:"N";s:4:"𨯺";s:1:"N";s:4:"開";s:1:"N";s:4:"䦕";s:1:"N";s:4:"閷";s:1:"N";s:4:"𨵷";s:1:"N";s:4:"䧦";s:1:"N";s:4:"雃";s:1:"N";s:4:"嶲";s:1:"N";s:4:"霣";s:1:"N";s:4:"𩅅";s:1:"N";s:4:"𩈚";s:1:"N";s:4:"䩮";s:1:"N";s:4:"䩶";s:1:"N";s:4:"韠";s:1:"N";s:4:"𩐊";s:1:"N";s:4:"䪲";s:1:"N";s:4:"𩒖";s:1:"N";s:4:"頋";s:1:"N";s:4:"頋";s:1:"N";s:4:"頩";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"飢";s:1:"N";s:4:"䬳";s:1:"N";s:4:"餩";s:1:"N";s:4:"馧";s:1:"N";s:4:"駂";s:1:"N";s:4:"駾";s:1:"N";s:4:"䯎";s:1:"N";s:4:"𩬰";s:1:"N";s:4:"鬒";s:1:"N";s:4:"鱀";s:1:"N";s:4:"鳽";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"䳭";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"ð¯¨";s:1:"N";s:4:"䳸";s:1:"N";s:4:"𪄅";s:1:"N";s:4:"𪈎";s:1:"N";s:4:"𪊑";s:1:"N";s:4:"麻";s:1:"N";s:4:"䵖";s:1:"N";s:4:"黹";s:1:"N";s:4:"黾";s:1:"N";s:4:"鼅";s:1:"N";s:4:"鼏";s:1:"N";s:4:"鼖";s:1:"N";s:4:"鼻";s:1:"N";s:4:"ð¯¨";s:1:"N";s:2:"Ì€";s:1:"M";s:2:"Ì";s:1:"M";s:2:"Ì‚";s:1:"M";s:2:"̃";s:1:"M";s:2:"Ì„";s:1:"M";s:2:"̆";s:1:"M";s:2:"̇";s:1:"M";s:2:"̈";s:1:"M";s:2:"̉";s:1:"M";s:2:"ÌŠ";s:1:"M";s:2:"Ì‹";s:1:"M";s:2:"ÌŒ";s:1:"M";s:2:"Ì";s:1:"M";s:2:"Ì‘";s:1:"M";s:2:"Ì“";s:1:"M";s:2:"Ì”";s:1:"M";s:2:"Ì›";s:1:"M";s:2:"Ì£";s:1:"M";s:2:"̤";s:1:"M";s:2:"Ì¥";s:1:"M";s:2:"̦";s:1:"M";s:2:"̧";s:1:"M";s:2:"̨";s:1:"M";s:2:"Ì­";s:1:"M";s:2:"Ì®";s:1:"M";s:2:"Ì°";s:1:"M";s:2:"̱";s:1:"M";s:2:"̸";s:1:"M";s:2:"Í‚";s:1:"M";s:2:"Í…";s:1:"M";s:2:"Ù“";s:1:"M";s:2:"Ù”";s:1:"M";s:2:"Ù•";s:1:"M";s:3:"़";s:1:"M";s:3:"া";s:1:"M";s:3:"ৗ";s:1:"M";s:3:"ା";s:1:"M";s:3:"à­–";s:1:"M";s:3:"à­—";s:1:"M";s:3:"ா";s:1:"M";s:3:"ௗ";s:1:"M";s:3:"à±–";s:1:"M";s:3:"ೂ";s:1:"M";s:3:"ೕ";s:1:"M";s:3:"à³–";s:1:"M";s:3:"à´¾";s:1:"M";s:3:"ൗ";s:1:"M";s:3:"à·Š";s:1:"M";s:3:"à·";s:1:"M";s:3:"à·Ÿ";s:1:"M";s:3:"ီ";s:1:"M";s:3:"á…¡";s:1:"M";s:3:"á…¢";s:1:"M";s:3:"á…£";s:1:"M";s:3:"á…¤";s:1:"M";s:3:"á…¥";s:1:"M";s:3:"á…¦";s:1:"M";s:3:"á…§";s:1:"M";s:3:"á…¨";s:1:"M";s:3:"á…©";s:1:"M";s:3:"á…ª";s:1:"M";s:3:"á…«";s:1:"M";s:3:"á…¬";s:1:"M";s:3:"á…­";s:1:"M";s:3:"á…®";s:1:"M";s:3:"á…¯";s:1:"M";s:3:"á…°";s:1:"M";s:3:"á…±";s:1:"M";s:3:"á…²";s:1:"M";s:3:"á…³";s:1:"M";s:3:"á…´";s:1:"M";s:3:"á…µ";s:1:"M";s:3:"ᆨ";s:1:"M";s:3:"ᆩ";s:1:"M";s:3:"ᆪ";s:1:"M";s:3:"ᆫ";s:1:"M";s:3:"ᆬ";s:1:"M";s:3:"ᆭ";s:1:"M";s:3:"ᆮ";s:1:"M";s:3:"ᆯ";s:1:"M";s:3:"ᆰ";s:1:"M";s:3:"ᆱ";s:1:"M";s:3:"ᆲ";s:1:"M";s:3:"ᆳ";s:1:"M";s:3:"ᆴ";s:1:"M";s:3:"ᆵ";s:1:"M";s:3:"ᆶ";s:1:"M";s:3:"ᆷ";s:1:"M";s:3:"ᆸ";s:1:"M";s:3:"ᆹ";s:1:"M";s:3:"ᆺ";s:1:"M";s:3:"ᆻ";s:1:"M";s:3:"ᆼ";s:1:"M";s:3:"ᆽ";s:1:"M";s:3:"ᆾ";s:1:"M";s:3:"ᆿ";s:1:"M";s:3:"ᇀ";s:1:"M";s:3:"á‡";s:1:"M";s:3:"ᇂ";s:1:"M";s:3:"ᬵ";s:1:"M";s:3:"ã‚™";s:1:"M";s:3:"ã‚š";s:1:"M";}' );
diff --git a/includes/normal/UtfNormalDataK.inc b/includes/normal/UtfNormalDataK.inc
index ad1b4bf2..9d30f282 100644
--- a/includes/normal/UtfNormalDataK.inc
+++ b/includes/normal/UtfNormalDataK.inc
@@ -2,8 +2,9 @@
/**
* This file was automatically generated -- do not edit!
* Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
*/
-/** */
-global $utfCompatibilityDecomp;
-$utfCompatibilityDecomp = unserialize( 'a:5516:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" Ì„";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" Ì";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1â„4";s:2:"½";s:5:"1â„2";s:2:"¾";s:5:"3â„4";s:2:"À";s:3:"AÌ€";s:2:"Ã";s:3:"AÌ";s:2:"Â";s:3:"AÌ‚";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Ã…";s:3:"AÌŠ";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"EÌ€";s:2:"É";s:3:"EÌ";s:2:"Ê";s:3:"EÌ‚";s:2:"Ë";s:3:"Ë";s:2:"ÃŒ";s:3:"IÌ€";s:2:"Ã";s:3:"IÌ";s:2:"ÃŽ";s:3:"IÌ‚";s:2:"Ã";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ã’";s:3:"OÌ€";s:2:"Ó";s:3:"OÌ";s:2:"Ô";s:3:"OÌ‚";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"UÌ€";s:2:"Ú";s:3:"UÌ";s:2:"Û";s:3:"UÌ‚";s:2:"Ãœ";s:3:"Ü";s:2:"Ã";s:3:"YÌ";s:2:"à";s:3:"aÌ€";s:2:"á";s:3:"aÌ";s:2:"â";s:3:"aÌ‚";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"Ã¥";s:3:"aÌŠ";s:2:"ç";s:3:"ç";s:2:"è";s:3:"eÌ€";s:2:"é";s:3:"eÌ";s:2:"ê";s:3:"eÌ‚";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"iÌ€";s:2:"í";s:3:"iÌ";s:2:"î";s:3:"iÌ‚";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"oÌ€";s:2:"ó";s:3:"oÌ";s:2:"ô";s:3:"oÌ‚";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"uÌ€";s:2:"ú";s:3:"uÌ";s:2:"û";s:3:"uÌ‚";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"yÌ";s:2:"ÿ";s:3:"ÿ";s:2:"Ä€";s:3:"AÌ„";s:2:"Ä";s:3:"aÌ„";s:2:"Ä‚";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ä„";s:3:"Ą";s:2:"Ä…";s:3:"ą";s:2:"Ć";s:3:"CÌ";s:2:"ć";s:3:"cÌ";s:2:"Ĉ";s:3:"CÌ‚";s:2:"ĉ";s:3:"cÌ‚";s:2:"ÄŠ";s:3:"Ċ";s:2:"Ä‹";s:3:"ċ";s:2:"ÄŒ";s:3:"CÌŒ";s:2:"Ä";s:3:"cÌŒ";s:2:"ÄŽ";s:3:"DÌŒ";s:2:"Ä";s:3:"dÌŒ";s:2:"Ä’";s:3:"EÌ„";s:2:"Ä“";s:3:"eÌ„";s:2:"Ä”";s:3:"Ĕ";s:2:"Ä•";s:3:"ĕ";s:2:"Ä–";s:3:"Ė";s:2:"Ä—";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"Ä™";s:3:"ę";s:2:"Äš";s:3:"EÌŒ";s:2:"Ä›";s:3:"eÌŒ";s:2:"Äœ";s:3:"GÌ‚";s:2:"Ä";s:3:"gÌ‚";s:2:"Äž";s:3:"Ğ";s:2:"ÄŸ";s:3:"ğ";s:2:"Ä ";s:3:"Ġ";s:2:"Ä¡";s:3:"ġ";s:2:"Ä¢";s:3:"Ģ";s:2:"Ä£";s:3:"ģ";s:2:"Ĥ";s:3:"HÌ‚";s:2:"Ä¥";s:3:"hÌ‚";s:2:"Ĩ";s:3:"Ĩ";s:2:"Ä©";s:3:"ĩ";s:2:"Ī";s:3:"IÌ„";s:2:"Ä«";s:3:"iÌ„";s:2:"Ĭ";s:3:"Ĭ";s:2:"Ä­";s:3:"ĭ";s:2:"Ä®";s:3:"Į";s:2:"į";s:3:"į";s:2:"Ä°";s:3:"İ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ä´";s:3:"JÌ‚";s:2:"ĵ";s:3:"jÌ‚";s:2:"Ķ";s:3:"Ķ";s:2:"Ä·";s:3:"ķ";s:2:"Ĺ";s:3:"LÌ";s:2:"ĺ";s:3:"lÌ";s:2:"Ä»";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"LÌŒ";s:2:"ľ";s:3:"lÌŒ";s:2:"Ä¿";s:3:"L·";s:2:"Å€";s:3:"l·";s:2:"Ń";s:3:"NÌ";s:2:"Å„";s:3:"nÌ";s:2:"Å…";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"NÌŒ";s:2:"ň";s:3:"nÌŒ";s:2:"ʼn";s:3:"ʼn";s:2:"ÅŒ";s:3:"OÌ„";s:2:"Å";s:3:"oÌ„";s:2:"ÅŽ";s:3:"Ŏ";s:2:"Å";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å‘";s:3:"oÌ‹";s:2:"Å”";s:3:"RÌ";s:2:"Å•";s:3:"rÌ";s:2:"Å–";s:3:"Ŗ";s:2:"Å—";s:3:"ŗ";s:2:"Ř";s:3:"RÌŒ";s:2:"Å™";s:3:"rÌŒ";s:2:"Åš";s:3:"SÌ";s:2:"Å›";s:3:"sÌ";s:2:"Åœ";s:3:"SÌ‚";s:2:"Å";s:3:"sÌ‚";s:2:"Åž";s:3:"Ş";s:2:"ÅŸ";s:3:"ş";s:2:"Å ";s:3:"SÌŒ";s:2:"Å¡";s:3:"sÌŒ";s:2:"Å¢";s:3:"Ţ";s:2:"Å£";s:3:"ţ";s:2:"Ť";s:3:"TÌŒ";s:2:"Å¥";s:3:"tÌŒ";s:2:"Ũ";s:3:"Ũ";s:2:"Å©";s:3:"ũ";s:2:"Ū";s:3:"UÌ„";s:2:"Å«";s:3:"uÌ„";s:2:"Ŭ";s:3:"Ŭ";s:2:"Å­";s:3:"ŭ";s:2:"Å®";s:3:"UÌŠ";s:2:"ů";s:3:"uÌŠ";s:2:"Å°";s:3:"UÌ‹";s:2:"ű";s:3:"uÌ‹";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Å´";s:3:"WÌ‚";s:2:"ŵ";s:3:"wÌ‚";s:2:"Ŷ";s:3:"YÌ‚";s:2:"Å·";s:3:"yÌ‚";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"ZÌ";s:2:"ź";s:3:"zÌ";s:2:"Å»";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"ZÌŒ";s:2:"ž";s:3:"zÌŒ";s:2:"Å¿";s:1:"s";s:2:"Æ ";s:3:"OÌ›";s:2:"Æ¡";s:3:"oÌ›";s:2:"Ư";s:3:"UÌ›";s:2:"Æ°";s:3:"uÌ›";s:2:"Ç„";s:4:"DZÌŒ";s:2:"Ç…";s:4:"DzÌŒ";s:2:"dž";s:4:"dzÌŒ";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"ÇŠ";s:2:"NJ";s:2:"Ç‹";s:2:"Nj";s:2:"ÇŒ";s:2:"nj";s:2:"Ç";s:3:"AÌŒ";s:2:"ÇŽ";s:3:"aÌŒ";s:2:"Ç";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç‘";s:3:"OÌŒ";s:2:"Ç’";s:3:"oÌŒ";s:2:"Ç“";s:3:"UÌŒ";s:2:"Ç”";s:3:"uÌŒ";s:2:"Ç•";s:5:"Ǖ";s:2:"Ç–";s:5:"ǖ";s:2:"Ç—";s:5:"ÜÌ";s:2:"ǘ";s:5:"üÌ";s:2:"Ç™";s:5:"Ǚ";s:2:"Çš";s:5:"ǚ";s:2:"Ç›";s:5:"Ǜ";s:2:"Çœ";s:5:"ǜ";s:2:"Çž";s:5:"Ǟ";s:2:"ÇŸ";s:5:"ǟ";s:2:"Ç ";s:5:"Ǡ";s:2:"Ç¡";s:5:"ǡ";s:2:"Ç¢";s:4:"Ǣ";s:2:"Ç£";s:4:"ǣ";s:2:"Ǧ";s:3:"GÌŒ";s:2:"ǧ";s:3:"gÌŒ";s:2:"Ǩ";s:3:"KÌŒ";s:2:"Ç©";s:3:"kÌŒ";s:2:"Ǫ";s:3:"Ǫ";s:2:"Ç«";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"Ç­";s:5:"ǭ";s:2:"Ç®";s:4:"Æ·ÌŒ";s:2:"ǯ";s:4:"Ê’ÌŒ";s:2:"Ç°";s:3:"jÌŒ";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ç´";s:3:"GÌ";s:2:"ǵ";s:3:"gÌ";s:2:"Ǹ";s:3:"NÌ€";s:2:"ǹ";s:3:"nÌ€";s:2:"Ǻ";s:5:"AÌŠÌ";s:2:"Ç»";s:5:"aÌŠÌ";s:2:"Ǽ";s:4:"ÆÌ";s:2:"ǽ";s:4:"æÌ";s:2:"Ǿ";s:4:"ØÌ";s:2:"Ç¿";s:4:"øÌ";s:2:"È€";s:3:"AÌ";s:2:"È";s:3:"aÌ";s:2:"È‚";s:3:"AÌ‘";s:2:"ȃ";s:3:"aÌ‘";s:2:"È„";s:3:"EÌ";s:2:"È…";s:3:"eÌ";s:2:"Ȇ";s:3:"EÌ‘";s:2:"ȇ";s:3:"eÌ‘";s:2:"Ȉ";s:3:"IÌ";s:2:"ȉ";s:3:"iÌ";s:2:"ÈŠ";s:3:"IÌ‘";s:2:"È‹";s:3:"iÌ‘";s:2:"ÈŒ";s:3:"OÌ";s:2:"È";s:3:"oÌ";s:2:"ÈŽ";s:3:"OÌ‘";s:2:"È";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È‘";s:3:"rÌ";s:2:"È’";s:3:"RÌ‘";s:2:"È“";s:3:"rÌ‘";s:2:"È”";s:3:"UÌ";s:2:"È•";s:3:"uÌ";s:2:"È–";s:3:"UÌ‘";s:2:"È—";s:3:"uÌ‘";s:2:"Ș";s:3:"Ș";s:2:"È™";s:3:"ș";s:2:"Èš";s:3:"Ț";s:2:"È›";s:3:"ț";s:2:"Èž";s:3:"HÌŒ";s:2:"ÈŸ";s:3:"hÌŒ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"È©";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"È«";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"È­";s:5:"ȭ";s:2:"È®";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"È°";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"YÌ„";s:2:"ȳ";s:3:"yÌ„";s:2:"Ê°";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"Ê´";s:2:"ɹ";s:2:"ʵ";s:2:"É»";s:2:"ʶ";s:2:"Ê";s:2:"Ê·";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"Ë™";s:3:" ̇";s:2:"Ëš";s:3:" ÌŠ";s:2:"Ë›";s:3:" ̨";s:2:"Ëœ";s:3:" ̃";s:2:"Ë";s:3:" Ì‹";s:2:"Ë ";s:2:"É£";s:2:"Ë¡";s:1:"l";s:2:"Ë¢";s:1:"s";s:2:"Ë£";s:1:"x";s:2:"ˤ";s:2:"Ê•";s:2:"Í€";s:2:"Ì€";s:2:"Í";s:2:"Ì";s:2:"̓";s:2:"Ì“";s:2:"Í„";s:4:"̈Ì";s:2:"Í´";s:2:"ʹ";s:2:"ͺ";s:3:" Í…";s:2:";";s:1:";";s:2:"΄";s:3:" Ì";s:2:"Î…";s:5:" ̈Ì";s:2:"Ά";s:4:"ΑÌ";s:2:"·";s:2:"·";s:2:"Έ";s:4:"ΕÌ";s:2:"Ή";s:4:"ΗÌ";s:2:"Ί";s:4:"ΙÌ";s:2:"ÎŒ";s:4:"ΟÌ";s:2:"ÎŽ";s:4:"Î¥Ì";s:2:"Î";s:4:"ΩÌ";s:2:"Î";s:6:"ϊÌ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"αÌ";s:2:"έ";s:4:"εÌ";s:2:"ή";s:4:"ηÌ";s:2:"ί";s:4:"ιÌ";s:2:"ΰ";s:6:"ϋÌ";s:2:"ÏŠ";s:4:"ϊ";s:2:"Ï‹";s:4:"ϋ";s:2:"ÏŒ";s:4:"οÌ";s:2:"Ï";s:4:"Ï…Ì";s:2:"ÏŽ";s:4:"ωÌ";s:2:"Ï";s:2:"β";s:2:"Ï‘";s:2:"θ";s:2:"Ï’";s:2:"Î¥";s:2:"Ï“";s:4:"Î¥Ì";s:2:"Ï”";s:4:"Ϋ";s:2:"Ï•";s:2:"φ";s:2:"Ï–";s:2:"Ï€";s:2:"Ï°";s:2:"κ";s:2:"ϱ";s:2:"Ï";s:2:"ϲ";s:2:"Ï‚";s:2:"Ï´";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ð";s:4:"Ё";s:2:"Ѓ";s:4:"ГÌ";s:2:"Ї";s:4:"Ї";s:2:"ÐŒ";s:4:"КÌ";s:2:"Ð";s:4:"Ѝ";s:2:"ÐŽ";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"Ñ";s:4:"ѐ";s:2:"Ñ‘";s:4:"ё";s:2:"Ñ“";s:4:"гÌ";s:2:"Ñ—";s:4:"ї";s:2:"Ñœ";s:4:"кÌ";s:2:"Ñ";s:4:"ѝ";s:2:"Ñž";s:4:"ў";s:2:"Ѷ";s:4:"Ñ´Ì";s:2:"Ñ·";s:4:"ѵÌ";s:2:"Ó";s:4:"Ӂ";s:2:"Ó‚";s:4:"ӂ";s:2:"Ó";s:4:"Ð̆";s:2:"Ó‘";s:4:"ӑ";s:2:"Ó’";s:4:"Ð̈";s:2:"Ó“";s:4:"ӓ";s:2:"Ó–";s:4:"Ӗ";s:2:"Ó—";s:4:"ӗ";s:2:"Óš";s:4:"Ӛ";s:2:"Ó›";s:4:"ӛ";s:2:"Óœ";s:4:"Ӝ";s:2:"Ó";s:4:"ӝ";s:2:"Óž";s:4:"Ӟ";s:2:"ÓŸ";s:4:"ӟ";s:2:"Ó¢";s:4:"Ӣ";s:2:"Ó£";s:4:"ӣ";s:2:"Ó¤";s:4:"Ӥ";s:2:"Ó¥";s:4:"ӥ";s:2:"Ó¦";s:4:"Ӧ";s:2:"Ó§";s:4:"ӧ";s:2:"Óª";s:4:"Ӫ";s:2:"Ó«";s:4:"ӫ";s:2:"Ó¬";s:4:"Ӭ";s:2:"Ó­";s:4:"Ñ̈";s:2:"Ó®";s:4:"Ӯ";s:2:"Ó¯";s:4:"ӯ";s:2:"Ó°";s:4:"Ӱ";s:2:"Ó±";s:4:"ӱ";s:2:"Ó²";s:4:"Ӳ";s:2:"Ó³";s:4:"ӳ";s:2:"Ó´";s:4:"Ӵ";s:2:"Óµ";s:4:"ӵ";s:2:"Ó¸";s:4:"Ӹ";s:2:"Ó¹";s:4:"ӹ";s:2:"Ö‡";s:4:"Õ¥Ö‚";s:2:"Ø¢";s:4:"آ";s:2:"Ø£";s:4:"أ";s:2:"ؤ";s:4:"ÙˆÙ”";s:2:"Ø¥";s:4:"إ";s:2:"ئ";s:4:"ÙŠÙ”";s:2:"Ùµ";s:4:"اٴ";s:2:"Ù¶";s:4:"وٴ";s:2:"Ù·";s:4:"Û‡Ù´";s:2:"Ù¸";s:4:"يٴ";s:2:"Û€";s:4:"Û•Ù”";s:2:"Û‚";s:4:"ÛÙ”";s:2:"Û“";s:4:"Û’Ù”";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"à¥";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"à§";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"à©™";s:6:"ਖ਼";s:3:"à©š";s:6:"ਗ਼";s:3:"à©›";s:6:"ਜ਼";s:3:"à©ž";s:6:"ਫ਼";s:3:"à­ˆ";s:6:"ୈ";s:3:"à­‹";s:6:"ୋ";s:3:"à­Œ";s:6:"ୌ";s:3:"à­œ";s:6:"ଡ଼";s:3:"à­";s:6:"ଢ଼";s:3:"à®”";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"à³€";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"à·š";s:6:"ේ";s:3:"à·œ";s:6:"à·™à·";s:3:"à·";s:9:"à·™à·à·Š";s:3:"à·ž";s:6:"ෞ";s:3:"ำ";s:6:"à¹à¸²";s:3:"ຳ";s:6:"à»àº²";s:3:"ໜ";s:6:"ຫນ";s:3:"à»";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"གྷ";s:6:"གྷ";s:3:"à½";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"à¾";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"à¾";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"à¾à¾µ";s:3:"ဦ";s:6:"ဦ";s:3:"ჼ";s:3:"ნ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"á¬á¬µ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"á­€";s:6:"ᭀ";s:3:"á­";s:6:"ᭁ";s:3:"á­ƒ";s:6:"ᭃ";s:3:"á´¬";s:1:"A";s:3:"á´­";s:2:"Æ";s:3:"á´®";s:1:"B";s:3:"á´°";s:1:"D";s:3:"á´±";s:1:"E";s:3:"á´²";s:2:"ÆŽ";s:3:"á´³";s:1:"G";s:3:"á´´";s:1:"H";s:3:"á´µ";s:1:"I";s:3:"á´¶";s:1:"J";s:3:"á´·";s:1:"K";s:3:"á´¸";s:1:"L";s:3:"á´¹";s:1:"M";s:3:"á´º";s:1:"N";s:3:"á´¼";s:1:"O";s:3:"á´½";s:2:"È¢";s:3:"á´¾";s:1:"P";s:3:"á´¿";s:1:"R";s:3:"áµ€";s:1:"T";s:3:"áµ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"É";s:3:"áµ…";s:2:"É‘";s:3:"ᵆ";s:3:"á´‚";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"É™";s:3:"ᵋ";s:2:"É›";s:3:"ᵌ";s:2:"Éœ";s:3:"áµ";s:1:"g";s:3:"áµ";s:1:"k";s:3:"áµ";s:1:"m";s:3:"ᵑ";s:2:"Å‹";s:3:"áµ’";s:1:"o";s:3:"ᵓ";s:2:"É”";s:3:"áµ”";s:3:"á´–";s:3:"ᵕ";s:3:"á´—";s:3:"áµ–";s:1:"p";s:3:"áµ—";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"áµ™";s:3:"á´";s:3:"ᵚ";s:2:"ɯ";s:3:"áµ›";s:1:"v";s:3:"ᵜ";s:3:"á´¥";s:3:"áµ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"áµ ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"áµ¢";s:1:"i";s:3:"áµ£";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"áµ¥";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"Ï";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"É’";s:3:"ᶜ";s:1:"c";s:3:"á¶";s:2:"É•";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"Éœ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ÉŸ";s:3:"ᶢ";s:2:"É¡";s:3:"ᶣ";s:2:"É¥";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"É©";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"áµ»";s:3:"ᶨ";s:2:"Ê";s:3:"ᶩ";s:2:"É­";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ÊŸ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"É°";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"É´";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"Ê‚";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"Æ«";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ÊŠ";s:3:"ᶸ";s:3:"á´œ";s:3:"ᶹ";s:2:"Ê‹";s:3:"ᶺ";s:2:"ÊŒ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"Ê";s:3:"ᶽ";s:2:"Ê‘";s:3:"ᶾ";s:2:"Ê’";s:3:"ᶿ";s:2:"θ";s:3:"Ḁ";s:3:"AÌ¥";s:3:"á¸";s:3:"aÌ¥";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"BÌ£";s:3:"ḅ";s:3:"bÌ£";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"ÇÌ";s:3:"ḉ";s:5:"çÌ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"DÌ£";s:3:"á¸";s:3:"dÌ£";s:3:"Ḏ";s:3:"Ḏ";s:3:"á¸";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"DÌ­";s:3:"ḓ";s:3:"dÌ­";s:3:"Ḕ";s:5:"EÌ„Ì€";s:3:"ḕ";s:5:"eÌ„Ì€";s:3:"Ḗ";s:5:"EÌ„Ì";s:3:"ḗ";s:5:"eÌ„Ì";s:3:"Ḙ";s:3:"EÌ­";s:3:"ḙ";s:3:"eÌ­";s:3:"Ḛ";s:3:"EÌ°";s:3:"ḛ";s:3:"eÌ°";s:3:"Ḝ";s:5:"Ḝ";s:3:"á¸";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"GÌ„";s:3:"ḡ";s:3:"gÌ„";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"HÌ£";s:3:"ḥ";s:3:"hÌ£";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"HÌ®";s:3:"ḫ";s:3:"hÌ®";s:3:"Ḭ";s:3:"IÌ°";s:3:"ḭ";s:3:"iÌ°";s:3:"Ḯ";s:5:"ÏÌ";s:3:"ḯ";s:5:"ïÌ";s:3:"Ḱ";s:3:"KÌ";s:3:"ḱ";s:3:"kÌ";s:3:"Ḳ";s:3:"KÌ£";s:3:"ḳ";s:3:"kÌ£";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"LÌ£";s:3:"ḷ";s:3:"lÌ£";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"LÌ­";s:3:"ḽ";s:3:"lÌ­";s:3:"Ḿ";s:3:"MÌ";s:3:"ḿ";s:3:"mÌ";s:3:"á¹€";s:3:"Ṁ";s:3:"á¹";s:3:"ṁ";s:3:"Ṃ";s:3:"MÌ£";s:3:"ṃ";s:3:"mÌ£";s:3:"Ṅ";s:3:"Ṅ";s:3:"á¹…";s:3:"ṅ";s:3:"Ṇ";s:3:"NÌ£";s:3:"ṇ";s:3:"nÌ£";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"NÌ­";s:3:"ṋ";s:3:"nÌ­";s:3:"Ṍ";s:5:"ÕÌ";s:3:"á¹";s:5:"õÌ";s:3:"Ṏ";s:5:"Ṏ";s:3:"á¹";s:5:"ṏ";s:3:"á¹";s:5:"OÌ„Ì€";s:3:"ṑ";s:5:"oÌ„Ì€";s:3:"á¹’";s:5:"OÌ„Ì";s:3:"ṓ";s:5:"oÌ„Ì";s:3:"á¹”";s:3:"PÌ";s:3:"ṕ";s:3:"pÌ";s:3:"á¹–";s:3:"Ṗ";s:3:"á¹—";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"á¹™";s:3:"ṙ";s:3:"Ṛ";s:3:"RÌ£";s:3:"á¹›";s:3:"rÌ£";s:3:"Ṝ";s:5:"Ṝ";s:3:"á¹";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"á¹ ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"á¹¢";s:3:"SÌ£";s:3:"á¹£";s:3:"sÌ£";s:3:"Ṥ";s:5:"SÌ̇";s:3:"á¹¥";s:5:"sÌ̇";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"TÌ£";s:3:"á¹­";s:3:"tÌ£";s:3:"á¹®";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"á¹°";s:3:"TÌ­";s:3:"á¹±";s:3:"tÌ­";s:3:"á¹²";s:3:"Ṳ";s:3:"á¹³";s:3:"ṳ";s:3:"á¹´";s:3:"UÌ°";s:3:"á¹µ";s:3:"uÌ°";s:3:"Ṷ";s:3:"UÌ­";s:3:"á¹·";s:3:"uÌ­";s:3:"Ṹ";s:5:"ŨÌ";s:3:"á¹¹";s:5:"ũÌ";s:3:"Ṻ";s:5:"Ṻ";s:3:"á¹»";s:5:"ṻ";s:3:"á¹¼";s:3:"Ṽ";s:3:"á¹½";s:3:"ṽ";s:3:"á¹¾";s:3:"VÌ£";s:3:"ṿ";s:3:"vÌ£";s:3:"Ẁ";s:3:"WÌ€";s:3:"áº";s:3:"wÌ€";s:3:"Ẃ";s:3:"WÌ";s:3:"ẃ";s:3:"wÌ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"WÌ£";s:3:"ẉ";s:3:"wÌ£";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"áº";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"áº";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"ẑ";s:3:"zÌ‚";s:3:"Ẓ";s:3:"ZÌ£";s:3:"ẓ";s:3:"zÌ£";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"wÌŠ";s:3:"ẙ";s:3:"yÌŠ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"Ạ";s:3:"AÌ£";s:3:"ạ";s:3:"aÌ£";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"AÌ‚Ì";s:3:"ấ";s:5:"aÌ‚Ì";s:3:"Ầ";s:5:"AÌ‚Ì€";s:3:"ầ";s:5:"aÌ‚Ì€";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"ĂÌ";s:3:"ắ";s:5:"ăÌ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"EÌ£";s:3:"ẹ";s:3:"eÌ£";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"EÌ‚Ì";s:3:"ế";s:5:"eÌ‚Ì";s:3:"Ề";s:5:"EÌ‚Ì€";s:3:"á»";s:5:"eÌ‚Ì€";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"á»…";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"IÌ£";s:3:"ị";s:3:"iÌ£";s:3:"Ọ";s:3:"OÌ£";s:3:"á»";s:3:"oÌ£";s:3:"Ỏ";s:3:"Ỏ";s:3:"á»";s:3:"ỏ";s:3:"á»";s:5:"OÌ‚Ì";s:3:"ố";s:5:"oÌ‚Ì";s:3:"á»’";s:5:"OÌ‚Ì€";s:3:"ồ";s:5:"oÌ‚Ì€";s:3:"á»”";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"á»–";s:5:"Ỗ";s:3:"á»—";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"á»™";s:5:"ộ";s:3:"Ớ";s:5:"OÌ›Ì";s:3:"á»›";s:5:"oÌ›Ì";s:3:"Ờ";s:5:"Ờ";s:3:"á»";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"á» ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"UÌ£";s:3:"ụ";s:3:"uÌ£";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"UÌ›Ì";s:3:"ứ";s:5:"uÌ›Ì";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"á»­";s:5:"ử";s:3:"á»®";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"á»°";s:5:"Ự";s:3:"á»±";s:5:"ự";s:3:"Ỳ";s:3:"YÌ€";s:3:"ỳ";s:3:"yÌ€";s:3:"á»´";s:3:"YÌ£";s:3:"ỵ";s:3:"yÌ£";s:3:"Ỷ";s:3:"Ỷ";s:3:"á»·";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"á¼€";s:4:"ἀ";s:3:"á¼";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἀÌ";s:3:"á¼…";s:6:"ἁÌ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"ἈÌ";s:3:"á¼";s:6:"ἉÌ";s:3:"Ἆ";s:6:"Ἆ";s:3:"á¼";s:6:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"á¼’";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"á¼”";s:6:"ἐÌ";s:3:"ἕ";s:6:"ἑÌ";s:3:"Ἐ";s:4:"Ἐ";s:3:"á¼™";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"á¼›";s:6:"Ἓ";s:3:"Ἔ";s:6:"ἘÌ";s:3:"á¼";s:6:"ἙÌ";s:3:"á¼ ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"á¼¢";s:6:"ἢ";s:3:"á¼£";s:6:"ἣ";s:3:"ἤ";s:6:"ἠÌ";s:3:"á¼¥";s:6:"ἡÌ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"ἨÌ";s:3:"á¼­";s:6:"ἩÌ";s:3:"á¼®";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"á¼°";s:4:"ἰ";s:3:"á¼±";s:4:"ἱ";s:3:"á¼²";s:6:"ἲ";s:3:"á¼³";s:6:"ἳ";s:3:"á¼´";s:6:"ἰÌ";s:3:"á¼µ";s:6:"ἱÌ";s:3:"ἶ";s:6:"ἶ";s:3:"á¼·";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"á¼¹";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"á¼»";s:6:"Ἳ";s:3:"á¼¼";s:6:"ἸÌ";s:3:"á¼½";s:6:"ἹÌ";s:3:"á¼¾";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"á½€";s:4:"ὀ";s:3:"á½";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὀÌ";s:3:"á½…";s:6:"ὁÌ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"ὈÌ";s:3:"á½";s:6:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"ὑ";s:4:"Ï…Ì”";s:3:"á½’";s:6:"Ï…Ì“Ì€";s:3:"ὓ";s:6:"ὓ";s:3:"á½”";s:6:"Ï…Ì“Ì";s:3:"ὕ";s:6:"Ï…Ì”Ì";s:3:"á½–";s:6:"Ï…Ì“Í‚";s:3:"á½—";s:6:"ὗ";s:3:"á½™";s:4:"Ὑ";s:3:"á½›";s:6:"Ὓ";s:3:"á½";s:6:"ὙÌ";s:3:"Ὗ";s:6:"Ὗ";s:3:"á½ ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"á½¢";s:6:"ὢ";s:3:"á½£";s:6:"ὣ";s:3:"ὤ";s:6:"ὠÌ";s:3:"á½¥";s:6:"ὡÌ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"ὨÌ";s:3:"á½­";s:6:"ὩÌ";s:3:"á½®";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"á½°";s:4:"ὰ";s:3:"á½±";s:4:"αÌ";s:3:"á½²";s:4:"ὲ";s:3:"á½³";s:4:"εÌ";s:3:"á½´";s:4:"ὴ";s:3:"á½µ";s:4:"ηÌ";s:3:"ὶ";s:4:"ὶ";s:3:"á½·";s:4:"ιÌ";s:3:"ὸ";s:4:"ὸ";s:3:"á½¹";s:4:"οÌ";s:3:"ὺ";s:4:"Ï…Ì€";s:3:"á½»";s:4:"Ï…Ì";s:3:"á½¼";s:4:"ὼ";s:3:"á½½";s:4:"ωÌ";s:3:"á¾€";s:6:"ᾀ";s:3:"á¾";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ἀÌÍ…";s:3:"á¾…";s:8:"ἁÌÍ…";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ἈÌÍ…";s:3:"á¾";s:8:"ἉÌÍ…";s:3:"ᾎ";s:8:"ᾎ";s:3:"á¾";s:8:"ᾏ";s:3:"á¾";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"á¾’";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"á¾”";s:8:"ἠÌÍ…";s:3:"ᾕ";s:8:"ἡÌÍ…";s:3:"á¾–";s:8:"ᾖ";s:3:"á¾—";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"á¾™";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"á¾›";s:8:"ᾛ";s:3:"ᾜ";s:8:"ἨÌÍ…";s:3:"á¾";s:8:"ἩÌÍ…";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"á¾ ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"á¾¢";s:8:"ᾢ";s:3:"á¾£";s:8:"ᾣ";s:3:"ᾤ";s:8:"ὠÌÍ…";s:3:"á¾¥";s:8:"ὡÌÍ…";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ὨÌÍ…";s:3:"á¾­";s:8:"ὩÌÍ…";s:3:"á¾®";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"á¾°";s:4:"ᾰ";s:3:"á¾±";s:4:"ᾱ";s:3:"á¾²";s:6:"ᾲ";s:3:"á¾³";s:4:"ᾳ";s:3:"á¾´";s:6:"αÌÍ…";s:3:"ᾶ";s:4:"ᾶ";s:3:"á¾·";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"á¾¹";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"á¾»";s:4:"ΑÌ";s:3:"á¾¼";s:4:"ᾼ";s:3:"á¾½";s:3:" Ì“";s:3:"á¾¾";s:2:"ι";s:3:"᾿";s:3:" Ì“";s:3:"á¿€";s:3:" Í‚";s:3:"á¿";s:5:" ̈͂";s:3:"á¿‚";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"á¿„";s:6:"ηÌÍ…";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"ΕÌ";s:3:"á¿Š";s:4:"Ὴ";s:3:"á¿‹";s:4:"ΗÌ";s:3:"á¿Œ";s:4:"ῌ";s:3:"á¿";s:5:" Ì“Ì€";s:3:"á¿Ž";s:5:" Ì“Ì";s:3:"á¿";s:5:" Ì“Í‚";s:3:"á¿";s:4:"ῐ";s:3:"á¿‘";s:4:"ῑ";s:3:"á¿’";s:6:"ῒ";s:3:"á¿“";s:6:"ϊÌ";s:3:"á¿–";s:4:"ῖ";s:3:"á¿—";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"á¿™";s:4:"Ῑ";s:3:"á¿š";s:4:"Ὶ";s:3:"á¿›";s:4:"ΙÌ";s:3:"á¿";s:5:" ̔̀";s:3:"á¿ž";s:5:" Ì”Ì";s:3:"á¿Ÿ";s:5:" ̔͂";s:3:"á¿ ";s:4:"ῠ";s:3:"á¿¡";s:4:"Ï…Ì„";s:3:"á¿¢";s:6:"ῢ";s:3:"á¿£";s:6:"ϋÌ";s:3:"ῤ";s:4:"ÏÌ“";s:3:"á¿¥";s:4:"ÏÌ”";s:3:"ῦ";s:4:"Ï…Í‚";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"á¿©";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"á¿«";s:4:"Î¥Ì";s:3:"Ῥ";s:4:"Ῥ";s:3:"á¿­";s:5:" ̈̀";s:3:"á¿®";s:5:" ̈Ì";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"á¿´";s:6:"ωÌÍ…";s:3:"ῶ";s:4:"ῶ";s:3:"á¿·";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"ΟÌ";s:3:"Ὼ";s:4:"Ὼ";s:3:"á¿»";s:4:"ΩÌ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:3:" Ì";s:3:"῾";s:3:" Ì”";s:3:" ";s:1:" ";s:3:"â€";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"â€";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" Ì…";s:3:"â‡";s:2:"??";s:3:"âˆ";s:2:"?!";s:3:"â‰";s:2:"!?";s:3:"â—";s:12:"′′′′";s:3:"âŸ";s:1:" ";s:3:"â°";s:1:"0";s:3:"â±";s:1:"i";s:3:"â´";s:1:"4";s:3:"âµ";s:1:"5";s:3:"â¶";s:1:"6";s:3:"â·";s:1:"7";s:3:"â¸";s:1:"8";s:3:"â¹";s:1:"9";s:3:"âº";s:1:"+";s:3:"â»";s:3:"−";s:3:"â¼";s:1:"=";s:3:"â½";s:1:"(";s:3:"â¾";s:1:")";s:3:"â¿";s:1:"n";s:3:"â‚€";s:1:"0";s:3:"â‚";s:1:"1";s:3:"â‚‚";s:1:"2";s:3:"₃";s:1:"3";s:3:"â‚„";s:1:"4";s:3:"â‚…";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"â‚Š";s:1:"+";s:3:"â‚‹";s:3:"−";s:3:"â‚Œ";s:1:"=";s:3:"â‚";s:1:"(";s:3:"â‚Ž";s:1:")";s:3:"â‚";s:1:"a";s:3:"â‚‘";s:1:"e";s:3:"â‚’";s:1:"o";s:3:"â‚“";s:1:"x";s:3:"â‚”";s:2:"É™";s:3:"₨";s:2:"Rs";s:3:"â„€";s:3:"a/c";s:3:"â„";s:3:"a/s";s:3:"â„‚";s:1:"C";s:3:"℃";s:3:"°C";s:3:"â„…";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Æ";s:3:"℉";s:3:"°F";s:3:"â„Š";s:1:"g";s:3:"â„‹";s:1:"H";s:3:"â„Œ";s:1:"H";s:3:"â„";s:1:"H";s:3:"â„Ž";s:1:"h";s:3:"â„";s:2:"ħ";s:3:"â„";s:1:"I";s:3:"â„‘";s:1:"I";s:3:"â„’";s:1:"L";s:3:"â„“";s:1:"l";s:3:"â„•";s:1:"N";s:3:"â„–";s:2:"No";s:3:"â„™";s:1:"P";s:3:"â„š";s:1:"Q";s:3:"â„›";s:1:"R";s:3:"â„œ";s:1:"R";s:3:"â„";s:1:"R";s:3:"â„ ";s:2:"SM";s:3:"â„¡";s:3:"TEL";s:3:"â„¢";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"Ω";s:2:"Ω";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"â„«";s:3:"AÌŠ";s:3:"ℬ";s:1:"B";s:3:"â„­";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"â„°";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"â„´";s:1:"o";s:3:"ℵ";s:2:"×";s:3:"ℶ";s:2:"ב";s:3:"â„·";s:2:"×’";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"â„»";s:3:"FAX";s:3:"ℼ";s:2:"Ï€";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"â„¿";s:2:"Π";s:3:"â…€";s:3:"∑";s:3:"â……";s:1:"D";s:3:"â…†";s:1:"d";s:3:"â…‡";s:1:"e";s:3:"â…ˆ";s:1:"i";s:3:"â…‰";s:1:"j";s:3:"â…";s:5:"1â„7";s:3:"â…‘";s:5:"1â„9";s:3:"â…’";s:6:"1â„10";s:3:"â…“";s:5:"1â„3";s:3:"â…”";s:5:"2â„3";s:3:"â…•";s:5:"1â„5";s:3:"â…–";s:5:"2â„5";s:3:"â…—";s:5:"3â„5";s:3:"â…˜";s:5:"4â„5";s:3:"â…™";s:5:"1â„6";s:3:"â…š";s:5:"5â„6";s:3:"â…›";s:5:"1â„8";s:3:"â…œ";s:5:"3â„8";s:3:"â…";s:5:"5â„8";s:3:"â…ž";s:5:"7â„8";s:3:"â…Ÿ";s:4:"1â„";s:3:"â… ";s:1:"I";s:3:"â…¡";s:2:"II";s:3:"â…¢";s:3:"III";s:3:"â…£";s:2:"IV";s:3:"â…¤";s:1:"V";s:3:"â…¥";s:2:"VI";s:3:"â…¦";s:3:"VII";s:3:"â…§";s:4:"VIII";s:3:"â…¨";s:2:"IX";s:3:"â…©";s:1:"X";s:3:"â…ª";s:2:"XI";s:3:"â…«";s:3:"XII";s:3:"â…¬";s:1:"L";s:3:"â…­";s:1:"C";s:3:"â…®";s:1:"D";s:3:"â…¯";s:1:"M";s:3:"â…°";s:1:"i";s:3:"â…±";s:2:"ii";s:3:"â…²";s:3:"iii";s:3:"â…³";s:2:"iv";s:3:"â…´";s:1:"v";s:3:"â…µ";s:2:"vi";s:3:"â…¶";s:3:"vii";s:3:"â…·";s:4:"viii";s:3:"â…¸";s:2:"ix";s:3:"â…¹";s:1:"x";s:3:"â…º";s:2:"xi";s:3:"â…»";s:3:"xii";s:3:"â…¼";s:1:"l";s:3:"â…½";s:1:"c";s:3:"â…¾";s:1:"d";s:3:"â…¿";s:1:"m";s:3:"↉";s:5:"0â„3";s:3:"↚";s:5:"â†Ì¸";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"â‡";s:5:"â‡Ì¸";s:3:"⇎";s:5:"⇎";s:3:"â‡";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"â‰";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"â‰Ì¸";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"âŠ";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"â‹ ";s:5:"⋠";s:3:"â‹¡";s:5:"⋡";s:3:"â‹¢";s:5:"⋢";s:3:"â‹£";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"â‹«";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"â‹­";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"â‘ ";s:1:"1";s:3:"â‘¡";s:1:"2";s:3:"â‘¢";s:1:"3";s:3:"â‘£";s:1:"4";s:3:"⑤";s:1:"5";s:3:"â‘¥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"â‘©";s:2:"10";s:3:"⑪";s:2:"11";s:3:"â‘«";s:2:"12";s:3:"⑬";s:2:"13";s:3:"â‘­";s:2:"14";s:3:"â‘®";s:2:"15";s:3:"⑯";s:2:"16";s:3:"â‘°";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"â‘´";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"â‘·";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"â‘»";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"â‘¿";s:4:"(12)";s:3:"â’€";s:4:"(13)";s:3:"â’";s:4:"(14)";s:3:"â’‚";s:4:"(15)";s:3:"â’ƒ";s:4:"(16)";s:3:"â’„";s:4:"(17)";s:3:"â’…";s:4:"(18)";s:3:"â’†";s:4:"(19)";s:3:"â’‡";s:4:"(20)";s:3:"â’ˆ";s:2:"1.";s:3:"â’‰";s:2:"2.";s:3:"â’Š";s:2:"3.";s:3:"â’‹";s:2:"4.";s:3:"â’Œ";s:2:"5.";s:3:"â’";s:2:"6.";s:3:"â’Ž";s:2:"7.";s:3:"â’";s:2:"8.";s:3:"â’";s:2:"9.";s:3:"â’‘";s:3:"10.";s:3:"â’’";s:3:"11.";s:3:"â’“";s:3:"12.";s:3:"â’”";s:3:"13.";s:3:"â’•";s:3:"14.";s:3:"â’–";s:3:"15.";s:3:"â’—";s:3:"16.";s:3:"â’˜";s:3:"17.";s:3:"â’™";s:3:"18.";s:3:"â’š";s:3:"19.";s:3:"â’›";s:3:"20.";s:3:"â’œ";s:3:"(a)";s:3:"â’";s:3:"(b)";s:3:"â’ž";s:3:"(c)";s:3:"â’Ÿ";s:3:"(d)";s:3:"â’ ";s:3:"(e)";s:3:"â’¡";s:3:"(f)";s:3:"â’¢";s:3:"(g)";s:3:"â’£";s:3:"(h)";s:3:"â’¤";s:3:"(i)";s:3:"â’¥";s:3:"(j)";s:3:"â’¦";s:3:"(k)";s:3:"â’§";s:3:"(l)";s:3:"â’¨";s:3:"(m)";s:3:"â’©";s:3:"(n)";s:3:"â’ª";s:3:"(o)";s:3:"â’«";s:3:"(p)";s:3:"â’¬";s:3:"(q)";s:3:"â’­";s:3:"(r)";s:3:"â’®";s:3:"(s)";s:3:"â’¯";s:3:"(t)";s:3:"â’°";s:3:"(u)";s:3:"â’±";s:3:"(v)";s:3:"â’²";s:3:"(w)";s:3:"â’³";s:3:"(x)";s:3:"â’´";s:3:"(y)";s:3:"â’µ";s:3:"(z)";s:3:"â’¶";s:1:"A";s:3:"â’·";s:1:"B";s:3:"â’¸";s:1:"C";s:3:"â’¹";s:1:"D";s:3:"â’º";s:1:"E";s:3:"â’»";s:1:"F";s:3:"â’¼";s:1:"G";s:3:"â’½";s:1:"H";s:3:"â’¾";s:1:"I";s:3:"â’¿";s:1:"J";s:3:"â“€";s:1:"K";s:3:"â“";s:1:"L";s:3:"â“‚";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"â“„";s:1:"O";s:3:"â“…";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"â“Š";s:1:"U";s:3:"â“‹";s:1:"V";s:3:"â“Œ";s:1:"W";s:3:"â“";s:1:"X";s:3:"â“Ž";s:1:"Y";s:3:"â“";s:1:"Z";s:3:"â“";s:1:"a";s:3:"â“‘";s:1:"b";s:3:"â“’";s:1:"c";s:3:"â““";s:1:"d";s:3:"â“”";s:1:"e";s:3:"â“•";s:1:"f";s:3:"â“–";s:1:"g";s:3:"â“—";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"â“™";s:1:"j";s:3:"â“š";s:1:"k";s:3:"â“›";s:1:"l";s:3:"â“œ";s:1:"m";s:3:"â“";s:1:"n";s:3:"â“ž";s:1:"o";s:3:"â“Ÿ";s:1:"p";s:3:"â“ ";s:1:"q";s:3:"â“¡";s:1:"r";s:3:"â“¢";s:1:"s";s:3:"â“£";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"â“¥";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"â“©";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"â©´";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"â«œ";s:5:"â«Ì¸";s:3:"â±¼";s:1:"j";s:3:"â±½";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"æ¯";s:3:"⻳";s:3:"龟";s:3:"â¼€";s:3:"一";s:3:"â¼";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"ä¹™";s:3:"â¼…";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"å„¿";s:3:"⼊";s:3:"å…¥";s:3:"⼋";s:3:"å…«";s:3:"⼌";s:3:"冂";s:3:"â¼";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"â¼";s:3:"几";s:3:"â¼";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"â¼’";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"â¼”";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"â¼–";s:3:"匸";s:3:"â¼—";s:3:"å";s:3:"⼘";s:3:"åœ";s:3:"â¼™";s:3:"å©";s:3:"⼚";s:3:"厂";s:3:"â¼›";s:3:"厶";s:3:"⼜";s:3:"åˆ";s:3:"â¼";s:3:"å£";s:3:"⼞";s:3:"å›—";s:3:"⼟";s:3:"土";s:3:"â¼ ";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"â¼¢";s:3:"夊";s:3:"â¼£";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"â¼¥";s:3:"女";s:3:"⼦";s:3:"å­";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"å°";s:3:"⼪";s:3:"å°¢";s:3:"⼫";s:3:"å°¸";s:3:"⼬";s:3:"å±®";s:3:"â¼­";s:3:"å±±";s:3:"â¼®";s:3:"å·›";s:3:"⼯";s:3:"å·¥";s:3:"â¼°";s:3:"å·±";s:3:"â¼±";s:3:"å·¾";s:3:"â¼²";s:3:"å¹²";s:3:"â¼³";s:3:"幺";s:3:"â¼´";s:3:"广";s:3:"â¼µ";s:3:"å»´";s:3:"⼶";s:3:"廾";s:3:"â¼·";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"â¼¹";s:3:"å½";s:3:"⼺";s:3:"彡";s:3:"â¼»";s:3:"å½³";s:3:"â¼¼";s:3:"心";s:3:"â¼½";s:3:"戈";s:3:"â¼¾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"â½€";s:3:"支";s:3:"â½";s:3:"æ”´";s:3:"⽂";s:3:"æ–‡";s:3:"⽃";s:3:"æ–—";s:3:"⽄";s:3:"æ–¤";s:3:"â½…";s:3:"æ–¹";s:3:"⽆";s:3:"æ— ";s:3:"⽇";s:3:"æ—¥";s:3:"⽈";s:3:"æ›°";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"æ­¢";s:3:"â½";s:3:"æ­¹";s:3:"⽎";s:3:"殳";s:3:"â½";s:3:"毋";s:3:"â½";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"â½’";s:3:"æ°";s:3:"⽓";s:3:"æ°”";s:3:"â½”";s:3:"æ°´";s:3:"⽕";s:3:"ç«";s:3:"â½–";s:3:"爪";s:3:"â½—";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"â½™";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"â½›";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"â½";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"â½ ";s:3:"ç“œ";s:3:"⽡";s:3:"瓦";s:3:"â½¢";s:3:"甘";s:3:"â½£";s:3:"生";s:3:"⽤";s:3:"用";s:3:"â½¥";s:3:"ç”°";s:3:"⽦";s:3:"ç–‹";s:3:"⽧";s:3:"ç–’";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"çš®";s:3:"⽫";s:3:"çš¿";s:3:"⽬";s:3:"ç›®";s:3:"â½­";s:3:"矛";s:3:"â½®";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"â½°";s:3:"示";s:3:"â½±";s:3:"禸";s:3:"â½²";s:3:"禾";s:3:"â½³";s:3:"ç©´";s:3:"â½´";s:3:"ç«‹";s:3:"â½µ";s:3:"竹";s:3:"⽶";s:3:"ç±³";s:3:"â½·";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"â½¹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"â½»";s:3:"ç¾½";s:3:"â½¼";s:3:"è€";s:3:"â½½";s:3:"而";s:3:"â½¾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"â¾€";s:3:"è¿";s:3:"â¾";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"â¾…";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"è™";s:3:"â¾";s:3:"虫";s:3:"⾎";s:3:"è¡€";s:3:"â¾";s:3:"è¡Œ";s:3:"â¾";s:3:"è¡£";s:3:"⾑";s:3:"襾";s:3:"â¾’";s:3:"見";s:3:"⾓";s:3:"角";s:3:"â¾”";s:3:"言";s:3:"⾕";s:3:"è°·";s:3:"â¾–";s:3:"豆";s:3:"â¾—";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"â¾™";s:3:"è²";s:3:"⾚";s:3:"赤";s:3:"â¾›";s:3:"èµ°";s:3:"⾜";s:3:"足";s:3:"â¾";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"è¾›";s:3:"â¾ ";s:3:"è¾°";s:3:"⾡";s:3:"è¾µ";s:3:"â¾¢";s:3:"é‚‘";s:3:"â¾£";s:3:"é…‰";s:3:"⾤";s:3:"釆";s:3:"â¾¥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"é•·";s:3:"⾨";s:3:"é–€";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"éš¹";s:3:"⾬";s:3:"雨";s:3:"â¾­";s:3:"é‘";s:3:"â¾®";s:3:"éž";s:3:"⾯";s:3:"é¢";s:3:"â¾°";s:3:"é©";s:3:"â¾±";s:3:"韋";s:3:"â¾²";s:3:"韭";s:3:"â¾³";s:3:"音";s:3:"â¾´";s:3:"é ";s:3:"â¾µ";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"â¾·";s:3:"食";s:3:"⾸";s:3:"首";s:3:"â¾¹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"â¾»";s:3:"骨";s:3:"â¾¼";s:3:"高";s:3:"â¾½";s:3:"é«Ÿ";s:3:"â¾¾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"â¿€";s:3:"鬲";s:3:"â¿";s:3:"鬼";s:3:"â¿‚";s:3:"é­š";s:3:"⿃";s:3:"é³¥";s:3:"â¿„";s:3:"é¹µ";s:3:"â¿…";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"é»";s:3:"â¿Š";s:3:"黑";s:3:"â¿‹";s:3:"黹";s:3:"â¿Œ";s:3:"黽";s:3:"â¿";s:3:"鼎";s:3:"â¿Ž";s:3:"鼓";s:3:"â¿";s:3:"é¼ ";s:3:"â¿";s:3:"é¼»";s:3:"â¿‘";s:3:"齊";s:3:"â¿’";s:3:"é½’";s:3:"â¿“";s:3:"é¾";s:3:"â¿”";s:3:"龜";s:3:"â¿•";s:3:"é¾ ";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"å";s:3:"〹";s:3:"å„";s:3:"〺";s:3:"å…";s:3:"ãŒ";s:6:"ã‹ã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ãã‚™";s:3:"ã’";s:6:"ã‘ã‚™";s:3:"ã”";s:6:"ã“ã‚™";s:3:"ã–";s:6:"ã•ã‚™";s:3:"ã˜";s:6:"ã—ã‚™";s:3:"ãš";s:6:"ã™ã‚™";s:3:"ãœ";s:6:"ã›ã‚™";s:3:"ãž";s:6:"ãã‚™";s:3:"ã ";s:6:"ãŸã‚™";s:3:"ã¢";s:6:"ã¡ã‚™";s:3:"ã¥";s:6:"ã¤ã‚™";s:3:"ã§";s:6:"ã¦ã‚™";s:3:"ã©";s:6:"ã¨ã‚™";s:3:"ã°";s:6:"ã¯ã‚™";s:3:"ã±";s:6:"ã¯ã‚š";s:3:"ã³";s:6:"ã²ã‚™";s:3:"ã´";s:6:"ã²ã‚š";s:3:"ã¶";s:6:"ãµã‚™";s:3:"ã·";s:6:"ãµã‚š";s:3:"ã¹";s:6:"ã¸ã‚™";s:3:"ãº";s:6:"ã¸ã‚š";s:3:"ã¼";s:6:"ã»ã‚™";s:3:"ã½";s:6:"ã»ã‚š";s:3:"ã‚”";s:6:"ã†ã‚™";s:3:"ã‚›";s:4:" ã‚™";s:3:"ã‚œ";s:4:" ã‚š";s:3:"ã‚ž";s:6:"ã‚ã‚™";s:3:"ã‚Ÿ";s:6:"より";s:3:"ガ";s:6:"ã‚«ã‚™";s:3:"ã‚®";s:6:"ã‚­ã‚™";s:3:"ã‚°";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ã‚´";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ã‚·ã‚™";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ã‚¿ã‚™";s:3:"ヂ";s:6:"ãƒã‚™";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"ãƒ";s:6:"ãƒã‚™";s:3:"パ";s:6:"ãƒã‚š";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ãƒ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"á„€";s:3:"ㄲ";s:3:"á„";s:3:"ㄳ";s:3:"ᆪ";s:3:"ã„´";s:3:"á„‚";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ã„·";s:3:"ᄃ";s:3:"ㄸ";s:3:"á„„";s:3:"ㄹ";s:3:"á„…";s:3:"ㄺ";s:3:"ᆰ";s:3:"ã„»";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ã„¿";s:3:"ᆵ";s:3:"ã…€";s:3:"á„š";s:3:"ã…";s:3:"ᄆ";s:3:"ã…‚";s:3:"ᄇ";s:3:"ã…ƒ";s:3:"ᄈ";s:3:"ã…„";s:3:"á„¡";s:3:"ã……";s:3:"ᄉ";s:3:"ã…†";s:3:"á„Š";s:3:"ã…‡";s:3:"á„‹";s:3:"ã…ˆ";s:3:"á„Œ";s:3:"ã…‰";s:3:"á„";s:3:"ã…Š";s:3:"á„Ž";s:3:"ã…‹";s:3:"á„";s:3:"ã…Œ";s:3:"á„";s:3:"ã…";s:3:"á„‘";s:3:"ã…Ž";s:3:"á„’";s:3:"ã…";s:3:"á…¡";s:3:"ã…";s:3:"á…¢";s:3:"ã…‘";s:3:"á…£";s:3:"ã…’";s:3:"á…¤";s:3:"ã…“";s:3:"á…¥";s:3:"ã…”";s:3:"á…¦";s:3:"ã…•";s:3:"á…§";s:3:"ã…–";s:3:"á…¨";s:3:"ã…—";s:3:"á…©";s:3:"ã…˜";s:3:"á…ª";s:3:"ã…™";s:3:"á…«";s:3:"ã…š";s:3:"á…¬";s:3:"ã…›";s:3:"á…­";s:3:"ã…œ";s:3:"á…®";s:3:"ã…";s:3:"á…¯";s:3:"ã…ž";s:3:"á…°";s:3:"ã…Ÿ";s:3:"á…±";s:3:"ã… ";s:3:"á…²";s:3:"ã…¡";s:3:"á…³";s:3:"ã…¢";s:3:"á…´";s:3:"ã…£";s:3:"á…µ";s:3:"ã…¤";s:3:"á… ";s:3:"ã…¥";s:3:"á„”";s:3:"ã…¦";s:3:"á„•";s:3:"ã…§";s:3:"ᇇ";s:3:"ã…¨";s:3:"ᇈ";s:3:"ã…©";s:3:"ᇌ";s:3:"ã…ª";s:3:"ᇎ";s:3:"ã…«";s:3:"ᇓ";s:3:"ã…¬";s:3:"ᇗ";s:3:"ã…­";s:3:"ᇙ";s:3:"ã…®";s:3:"á„œ";s:3:"ã…¯";s:3:"á‡";s:3:"ã…°";s:3:"ᇟ";s:3:"ã…±";s:3:"á„";s:3:"ã…²";s:3:"á„ž";s:3:"ã…³";s:3:"á„ ";s:3:"ã…´";s:3:"á„¢";s:3:"ã…µ";s:3:"á„£";s:3:"ã…¶";s:3:"ᄧ";s:3:"ã…·";s:3:"á„©";s:3:"ã…¸";s:3:"á„«";s:3:"ã…¹";s:3:"ᄬ";s:3:"ã…º";s:3:"á„­";s:3:"ã…»";s:3:"á„®";s:3:"ã…¼";s:3:"ᄯ";s:3:"ã…½";s:3:"ᄲ";s:3:"ã…¾";s:3:"ᄶ";s:3:"ã…¿";s:3:"á…€";s:3:"ㆀ";s:3:"á…‡";s:3:"ã†";s:3:"á…Œ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"á…—";s:3:"ㆅ";s:3:"á…˜";s:3:"ㆆ";s:3:"á…™";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ã†";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"å››";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"ä¹™";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"ä¸";s:3:"ã†";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(á„€)";s:3:"ãˆ";s:5:"(á„‚)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(á„…)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(á„‹)";s:3:"㈈";s:5:"(á„Œ)";s:3:"㈉";s:5:"(á„Ž)";s:3:"㈊";s:5:"(á„)";s:3:"㈋";s:5:"(á„)";s:3:"㈌";s:5:"(á„‘)";s:3:"ãˆ";s:5:"(á„’)";s:3:"㈎";s:8:"(가)";s:3:"ãˆ";s:8:"(á„‚á…¡)";s:3:"ãˆ";s:8:"(다)";s:3:"㈑";s:8:"(á„…á…¡)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(á„‹á…¡)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(á„Žá…¡)";s:3:"㈘";s:8:"(á„á…¡)";s:3:"㈙";s:8:"(á„á…¡)";s:3:"㈚";s:8:"(á„‘á…¡)";s:3:"㈛";s:8:"(á„’á…¡)";s:3:"㈜";s:8:"(주)";s:3:"ãˆ";s:17:"(오전)";s:3:"㈞";s:14:"(á„‹á…©á„’á…®)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(å››)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(å…­)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(å…«)";s:3:"㈨";s:5:"(ä¹)";s:3:"㈩";s:5:"(å)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(ç«)";s:3:"㈬";s:5:"(æ°´)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(æ—¥)";s:3:"㈱";s:5:"(æ ª)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(å)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(ç¥)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(å­¦)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(ä¼)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(å”)";s:3:"㉀";s:5:"(祭)";s:3:"ã‰";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"å•";s:3:"㉅";s:3:"å¹¼";s:3:"㉆";s:3:"æ–‡";s:3:"㉇";s:3:"ç®";s:3:"ã‰";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"ã‰";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"á„€";s:3:"㉡";s:3:"á„‚";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"á„…";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"á„‹";s:3:"㉨";s:3:"á„Œ";s:3:"㉩";s:3:"á„Ž";s:3:"㉪";s:3:"á„";s:3:"㉫";s:3:"á„";s:3:"㉬";s:3:"á„‘";s:3:"㉭";s:3:"á„’";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"á„‚á…¡";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"á„…á…¡";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"á„‹á…¡";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"á„Žá…¡";s:3:"㉸";s:6:"á„á…¡";s:3:"㉹";s:6:"á„á…¡";s:3:"㉺";s:6:"á„‘á…¡";s:3:"㉻";s:6:"á„’á…¡";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"á„‹á…®";s:3:"㊀";s:3:"一";s:3:"ãŠ";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"å››";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"å…­";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"å…«";s:3:"㊈";s:3:"ä¹";s:3:"㊉";s:3:"å";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"ç«";s:3:"㊌";s:3:"æ°´";s:3:"ãŠ";s:3:"木";s:3:"㊎";s:3:"金";s:3:"ãŠ";s:3:"土";s:3:"ãŠ";s:3:"æ—¥";s:3:"㊑";s:3:"æ ª";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"å";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"ç¥";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"ç”·";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"é©";s:3:"ãŠ";s:3:"優";s:3:"㊞";s:3:"å°";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"é …";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"æ­£";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"å·¦";s:3:"㊨";s:3:"å³";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"å®—";s:3:"㊫";s:3:"å­¦";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"ä¼";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"å”";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"ã‹€";s:4:"1月";s:3:"ã‹";s:4:"2月";s:3:"ã‹‚";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"ã‹„";s:4:"5月";s:3:"ã‹…";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"ã‹Š";s:5:"11月";s:3:"ã‹‹";s:5:"12月";s:3:"ã‹Œ";s:2:"Hg";s:3:"ã‹";s:3:"erg";s:3:"ã‹Ž";s:2:"eV";s:3:"ã‹";s:3:"LTD";s:3:"ã‹";s:3:"ã‚¢";s:3:"ã‹‘";s:3:"イ";s:3:"ã‹’";s:3:"ウ";s:3:"ã‹“";s:3:"エ";s:3:"ã‹”";s:3:"オ";s:3:"ã‹•";s:3:"ã‚«";s:3:"ã‹–";s:3:"ã‚­";s:3:"ã‹—";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"ã‹™";s:3:"コ";s:3:"ã‹š";s:3:"サ";s:3:"ã‹›";s:3:"ã‚·";s:3:"ã‹œ";s:3:"ス";s:3:"ã‹";s:3:"ã‚»";s:3:"ã‹ž";s:3:"ソ";s:3:"ã‹Ÿ";s:3:"ã‚¿";s:3:"ã‹ ";s:3:"ãƒ";s:3:"ã‹¡";s:3:"ツ";s:3:"ã‹¢";s:3:"テ";s:3:"ã‹£";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"ã‹¥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ãƒ";s:3:"㋨";s:3:"ノ";s:3:"ã‹©";s:3:"ãƒ";s:3:"㋪";s:3:"ヒ";s:3:"ã‹«";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"ã‹­";s:3:"ホ";s:3:"ã‹®";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"ã‹°";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"ã‹´";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"ã‹·";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"ã‹»";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"ã‚¢ãƒã‚šãƒ¼ãƒˆ";s:3:"ãŒ";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インãƒ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"ãŒ";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"ãŒ";s:12:"ガンマ";s:3:"ãŒ";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローãƒ";s:3:"㌜";s:9:"ケース";s:3:"ãŒ";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンãƒãƒ¼ãƒ ";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センãƒ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ãƒã‚¤ãƒ„";s:3:"㌫";s:18:"ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ";s:3:"㌬";s:12:"ãƒã‚šãƒ¼ãƒ„";s:3:"㌭";s:15:"ãƒã‚™ãƒ¼ãƒ¬ãƒ«";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"ã€";s:15:"ポンド";s:3:"ã";s:9:"ホール";s:3:"ã‚";s:9:"ホーン";s:3:"ãƒ";s:12:"マイクロ";s:3:"ã„";s:9:"マイル";s:3:"ã…";s:9:"マッãƒ";s:3:"ã†";s:9:"マルク";s:3:"ã‡";s:15:"マンション";s:3:"ãˆ";s:12:"ミクロン";s:3:"ã‰";s:6:"ミリ";s:3:"ãŠ";s:18:"ミリãƒã‚™ãƒ¼ãƒ«";s:3:"ã‹";s:9:"メガ";s:3:"ãŒ";s:15:"メガトン";s:3:"ã";s:12:"メートル";s:3:"ãŽ";s:12:"ヤード";s:3:"ã";s:9:"ヤール";s:3:"ã";s:9:"ユアン";s:3:"ã‘";s:12:"リットル";s:3:"ã’";s:6:"リラ";s:3:"ã“";s:12:"ルピー";s:3:"ã”";s:15:"ルーブル";s:3:"ã•";s:6:"レム";s:3:"ã–";s:18:"レントゲン";s:3:"ã—";s:9:"ワット";s:3:"ã˜";s:4:"0点";s:3:"ã™";s:4:"1点";s:3:"ãš";s:4:"2点";s:3:"ã›";s:4:"3点";s:3:"ãœ";s:4:"4点";s:3:"ã";s:4:"5点";s:3:"ãž";s:4:"6点";s:3:"ãŸ";s:4:"7点";s:3:"ã ";s:4:"8点";s:3:"ã¡";s:4:"9点";s:3:"ã¢";s:5:"10点";s:3:"ã£";s:5:"11点";s:3:"ã¤";s:5:"12点";s:3:"ã¥";s:5:"13点";s:3:"ã¦";s:5:"14点";s:3:"ã§";s:5:"15点";s:3:"ã¨";s:5:"16点";s:3:"ã©";s:5:"17点";s:3:"ãª";s:5:"18点";s:3:"ã«";s:5:"19点";s:3:"ã¬";s:5:"20点";s:3:"ã­";s:5:"21点";s:3:"ã®";s:5:"22点";s:3:"ã¯";s:5:"23点";s:3:"ã°";s:5:"24点";s:3:"ã±";s:3:"hPa";s:3:"ã²";s:2:"da";s:3:"ã³";s:2:"AU";s:3:"ã´";s:3:"bar";s:3:"ãµ";s:2:"oV";s:3:"ã¶";s:2:"pc";s:3:"ã·";s:2:"dm";s:3:"ã¸";s:3:"dm2";s:3:"ã¹";s:3:"dm3";s:3:"ãº";s:2:"IU";s:3:"ã»";s:6:"å¹³æˆ";s:3:"ã¼";s:6:"昭和";s:3:"ã½";s:6:"大正";s:3:"ã¾";s:6:"明治";s:3:"ã¿";s:12:"æ ªå¼ä¼šç¤¾";s:3:"㎀";s:2:"pA";s:3:"ãŽ";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"ãŽ";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"ãŽ";s:2:"kg";s:3:"ãŽ";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"ãŽ";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"ã€";s:3:"kΩ";s:3:"ã";s:3:"MΩ";s:3:"ã‚";s:4:"a.m.";s:3:"ãƒ";s:2:"Bq";s:3:"ã„";s:2:"cc";s:3:"ã…";s:2:"cd";s:3:"ã†";s:6:"C∕kg";s:3:"ã‡";s:3:"Co.";s:3:"ãˆ";s:2:"dB";s:3:"ã‰";s:2:"Gy";s:3:"ãŠ";s:2:"ha";s:3:"ã‹";s:2:"HP";s:3:"ãŒ";s:2:"in";s:3:"ã";s:2:"KK";s:3:"ãŽ";s:2:"KM";s:3:"ã";s:2:"kt";s:3:"ã";s:2:"lm";s:3:"ã‘";s:2:"ln";s:3:"ã’";s:3:"log";s:3:"ã“";s:2:"lx";s:3:"ã”";s:2:"mb";s:3:"ã•";s:3:"mil";s:3:"ã–";s:3:"mol";s:3:"ã—";s:2:"PH";s:3:"ã˜";s:4:"p.m.";s:3:"ã™";s:3:"PPM";s:3:"ãš";s:2:"PR";s:3:"ã›";s:2:"sr";s:3:"ãœ";s:2:"Sv";s:3:"ã";s:2:"Wb";s:3:"ãž";s:5:"V∕m";s:3:"ãŸ";s:5:"A∕m";s:3:"ã ";s:4:"1æ—¥";s:3:"ã¡";s:4:"2æ—¥";s:3:"ã¢";s:4:"3æ—¥";s:3:"ã£";s:4:"4æ—¥";s:3:"ã¤";s:4:"5æ—¥";s:3:"ã¥";s:4:"6æ—¥";s:3:"ã¦";s:4:"7æ—¥";s:3:"ã§";s:4:"8æ—¥";s:3:"ã¨";s:4:"9æ—¥";s:3:"ã©";s:5:"10æ—¥";s:3:"ãª";s:5:"11æ—¥";s:3:"ã«";s:5:"12æ—¥";s:3:"ã¬";s:5:"13æ—¥";s:3:"ã­";s:5:"14æ—¥";s:3:"ã®";s:5:"15æ—¥";s:3:"ã¯";s:5:"16æ—¥";s:3:"ã°";s:5:"17æ—¥";s:3:"ã±";s:5:"18æ—¥";s:3:"ã²";s:5:"19æ—¥";s:3:"ã³";s:5:"20æ—¥";s:3:"ã´";s:5:"21æ—¥";s:3:"ãµ";s:5:"22æ—¥";s:3:"ã¶";s:5:"23æ—¥";s:3:"ã·";s:5:"24æ—¥";s:3:"ã¸";s:5:"25æ—¥";s:3:"ã¹";s:5:"26æ—¥";s:3:"ãº";s:5:"27æ—¥";s:3:"ã»";s:5:"28æ—¥";s:3:"ã¼";s:5:"29æ—¥";s:3:"ã½";s:5:"30æ—¥";s:3:"ã¾";s:5:"31æ—¥";s:3:"ã¿";s:3:"gal";s:3:"ê°";s:3:"ê¯";s:3:"豈";s:3:"豈";s:3:"ï¤";s:3:"æ›´";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"å¥";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"å–‡";s:3:"奈";s:3:"奈";s:3:"ï¤";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"ï¤";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"é‚";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"æ´›";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"çž";s:3:"落";s:3:"è½";s:3:"酪";s:3:"é…ª";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"åµ";s:3:"ï¤";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"åµ";s:3:"濫";s:3:"æ¿«";s:3:"藍";s:3:"è—";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"è Ÿ";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"å‹ž";s:3:"擄";s:3:"æ“„";s:3:"櫓";s:3:"æ«“";s:3:"爐";s:3:"çˆ";s:3:"盧";s:3:"盧";s:3:"老";s:3:"è€";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"è·¯";s:3:"露";s:3:"露";s:3:"魯";s:3:"é­¯";s:3:"鷺";s:3:"é·º";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"è‰";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"ï¥";s:3:"è«–";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"ç± ";s:3:"聾";s:3:"è¾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"é›·";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"å±¢";s:3:"樓";s:3:"樓";s:3:"ï¥";s:3:"æ·š";s:3:"漏";s:3:"æ¼";s:3:"ï¥";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"å‹’";s:3:"肋";s:3:"è‚‹";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"è±";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"æ‹";s:3:"樂";s:3:"樂";s:3:"ï¥";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"ç•°";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"ä¸";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"ç´¢";s:3:"參";s:3:"åƒ";s:3:"塞";s:3:"å¡ž";s:3:"省";s:3:"çœ";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"è¾°";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"è‹¥";s:3:"掠";s:3:"掠";s:3:"略";s:3:"ç•¥";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"å…©";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"æ¢";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"è«’";s:3:"量";s:3:"é‡";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"å‘‚";s:3:"ï¦";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"æ—…";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"é–­";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"æ­·";s:3:"ï¦";s:3:"è½¢";s:3:"年";s:3:"å¹´";s:3:"ï¦";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"撚";s:3:"æ’š";s:3:"漣";s:3:"æ¼£";s:3:"煉";s:3:"ç…‰";s:3:"璉";s:3:"ç’‰";s:3:"秊";s:3:"秊";s:3:"練";s:3:"ç·´";s:3:"聯";s:3:"è¯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"è“®";s:3:"連";s:3:"連";s:3:"鍊";s:3:"éŠ";s:3:"列";s:3:"列";s:3:"ï¦";s:3:"劣";s:3:"咽";s:3:"å’½";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"æ»";s:3:"殮";s:3:"æ®®";s:3:"簾";s:3:"ç°¾";s:3:"獵";s:3:"çµ";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"ç‘©";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"è†";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"éˆ";s:3:"領";s:3:"é ˜";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"å°¿";s:3:"料";s:3:"æ–™";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"ï§";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"é¼";s:3:"龍";s:3:"é¾";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"æ»";s:3:"柳";s:3:"柳";s:3:"流";s:3:"æµ";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"ç‰";s:3:"ï§";s:3:"ç•™";s:3:"硫";s:3:"ç¡«";s:3:"ï§";s:3:"ç´";s:3:"ï§";s:3:"é¡ž";s:3:"六";s:3:"å…­";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"å´™";s:3:"淪";s:3:"æ·ª";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"æ…„";s:3:"栗";s:3:"æ —";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"ï§";s:3:"利";s:3:"吏";s:3:"å";s:3:"履";s:3:"å±¥";s:3:"易";s:3:"易";s:3:"李";s:3:"æŽ";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"æ³¥";s:3:"理";s:3:"ç†";s:3:"痢";s:3:"ç—¢";s:3:"罹";s:3:"ç½¹";s:3:"裏";s:3:"è£";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"å";s:3:"燐";s:3:"ç‡";s:3:"璘";s:3:"ç’˜";s:3:"藺";s:3:"è—º";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"é±—";s:3:"麟";s:3:"麟";s:3:"林";s:3:"æž—";s:3:"淋";s:3:"æ·‹";s:3:"臨";s:3:"臨";s:3:"立";s:3:"ç«‹";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"ç²’";s:3:"狀";s:3:"ç‹€";s:3:"炙";s:3:"ç‚™";s:3:"識";s:3:"è­˜";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"ï¨";s:3:"度";s:3:"拓";s:3:"æ‹“";s:3:"糖";s:3:"ç³–";s:3:"宅";s:3:"å®…";s:3:"洞";s:3:"æ´ž";s:3:"暴";s:3:"æš´";s:3:"輻";s:3:"è¼»";s:3:"行";s:3:"è¡Œ";s:3:"降";s:3:"é™";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"å…€";s:3:"ï¨";s:3:"å—€";s:3:"ï¨";s:3:"å¡š";s:3:"晴";s:3:"æ™´";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"ç¦";s:3:"靖";s:3:"é–";s:3:"ï¨";s:3:"ç²¾";s:3:"羽";s:3:"ç¾½";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"ä¾®";s:3:"僧";s:3:"僧";s:3:"免";s:3:"å…";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"å‘";s:3:"喝";s:3:"å–";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"å¡€";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"å±®";s:3:"悔";s:3:"æ‚”";s:3:"慨";s:3:"æ…¨";s:3:"憎";s:3:"憎";s:3:"ï©€";s:3:"懲";s:3:"ï©";s:3:"æ•";s:3:"ï©‚";s:3:"æ—¢";s:3:"暑";s:3:"æš‘";s:3:"ï©„";s:3:"梅";s:3:"ï©…";s:3:"æµ·";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"æ¼¢";s:3:"煮";s:3:"ç…®";s:3:"爫";s:3:"爫";s:3:"ï©Š";s:3:"ç¢";s:3:"ï©‹";s:3:"碑";s:3:"ï©Œ";s:3:"社";s:3:"ï©";s:3:"祉";s:3:"ï©Ž";s:3:"祈";s:3:"ï©";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:3:"ï©‘";s:3:"ç¥";s:3:"ï©’";s:3:"ç¦";s:3:"ï©“";s:3:"禎";s:3:"ï©”";s:3:"ç©€";s:3:"ï©•";s:3:"çª";s:3:"ï©–";s:3:"節";s:3:"ï©—";s:3:"ç·´";s:3:"縉";s:3:"縉";s:3:"ï©™";s:3:"ç¹";s:3:"ï©š";s:3:"ç½²";s:3:"ï©›";s:3:"者";s:3:"ï©œ";s:3:"臭";s:3:"ï©";s:3:"艹";s:3:"ï©ž";s:3:"艹";s:3:"ï©Ÿ";s:3:"è‘—";s:3:"ï© ";s:3:"è¤";s:3:"ï©¡";s:3:"視";s:3:"ï©¢";s:3:"è¬";s:3:"ï©£";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"ï©¥";s:3:"è´ˆ";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"ï©©";s:3:"響";s:3:"頻";s:3:"é »";s:3:"ï©«";s:3:"æµ";s:3:"𤋮";s:4:"𤋮";s:3:"ï©­";s:3:"舘";s:3:"ï©°";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"å…¨";s:3:"侀";s:3:"ä¾€";s:3:"ï©´";s:3:"å……";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"ï©·";s:3:"勺";s:3:"喝";s:3:"å–";s:3:"啕";s:3:"å••";s:3:"喙";s:3:"å–™";s:3:"ï©»";s:3:"å—¢";s:3:"塚";s:3:"å¡š";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"ï©¿";s:3:"奔";s:3:"婢";s:3:"å©¢";s:3:"ïª";s:3:"嬨";s:3:"廒";s:3:"å»’";s:3:"廙";s:3:"å»™";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"å¾­";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"æ…Ž";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"æ… ";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"ïª";s:3:"æ„";s:3:"搜";s:3:"æœ";s:3:"ïª";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"晴";s:3:"æ™´";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"æ–";s:3:"歹";s:3:"æ­¹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"æµ";s:3:"滛";s:3:"æ»›";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"æ¼¢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"ç…®";s:3:"ïª";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"ç”»";s:3:"瘝";s:3:"ç˜";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"ç››";s:3:"直";s:3:"ç›´";s:3:"睊";s:3:"çŠ";s:3:"着";s:3:"ç€";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"ç±»";s:3:"絛";s:3:"çµ›";s:3:"練";s:3:"ç·´";s:3:"缾";s:3:"ç¼¾";s:3:"者";s:3:"者";s:3:"荒";s:3:"è’";s:3:"華";s:3:"è¯";s:3:"蝹";s:3:"è¹";s:3:"襁";s:3:"è¥";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"è«‹";s:3:"謁";s:3:"è¬";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"è«­";s:3:"謹";s:3:"謹";s:3:"ï«€";s:3:"變";s:3:"ï«";s:3:"è´ˆ";s:3:"ï«‚";s:3:"輸";s:3:"遲";s:3:"é²";s:3:"ï«„";s:3:"醙";s:3:"ï«…";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"é–";s:3:"韛";s:3:"韛";s:3:"ï«Š";s:3:"響";s:3:"ï«‹";s:3:"é ‹";s:3:"ï«Œ";s:3:"é »";s:3:"ï«";s:3:"鬒";s:3:"ï«Ž";s:3:"龜";s:3:"ï«";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«‘";s:4:"ð£•";s:3:"ï«’";s:3:"ã®";s:3:"ï«“";s:3:"䀘";s:3:"ï«”";s:3:"䀹";s:3:"ï«•";s:4:"𥉉";s:3:"ï«–";s:4:"ð¥³";s:3:"ï«—";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"ï«™";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"ï¬";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"Õ´Õ¶";s:3:"ﬔ";s:4:"Õ´Õ¥";s:3:"ﬕ";s:4:"Õ´Õ«";s:3:"ﬖ";s:4:"Õ¾Õ¶";s:3:"ﬗ";s:4:"Õ´Õ­";s:3:"ï¬";s:4:"×™Ö´";s:3:"ײַ";s:4:"ײַ";s:3:"ﬠ";s:2:"×¢";s:3:"ﬡ";s:2:"×";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"×”";s:3:"ﬤ";s:2:"×›";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"×";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"שׁ";s:4:"ש×";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּ×";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"×Ö·";s:3:"אָ";s:4:"×Ö¸";s:3:"אּ";s:4:"×Ö¼";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"×’Ö¼";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"×”Ö¼";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"×–Ö¼";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"×™Ö¼";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"×›Ö¼";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"ï­€";s:4:"× Ö¼";s:3:"ï­";s:4:"סּ";s:3:"ï­ƒ";s:4:"×£Ö¼";s:3:"ï­„";s:4:"פּ";s:3:"ï­†";s:4:"צּ";s:3:"ï­‡";s:4:"קּ";s:3:"ï­ˆ";s:4:"רּ";s:3:"ï­‰";s:4:"שּ";s:3:"ï­Š";s:4:"תּ";s:3:"ï­‹";s:4:"וֹ";s:3:"ï­Œ";s:4:"בֿ";s:3:"ï­";s:4:"×›Ö¿";s:3:"ï­Ž";s:4:"פֿ";s:3:"ï­";s:4:"×ל";s:3:"ï­";s:2:"Ù±";s:3:"ï­‘";s:2:"Ù±";s:3:"ï­’";s:2:"Ù»";s:3:"ï­“";s:2:"Ù»";s:3:"ï­”";s:2:"Ù»";s:3:"ï­•";s:2:"Ù»";s:3:"ï­–";s:2:"Ù¾";s:3:"ï­—";s:2:"Ù¾";s:3:"ï­˜";s:2:"Ù¾";s:3:"ï­™";s:2:"Ù¾";s:3:"ï­š";s:2:"Ú€";s:3:"ï­›";s:2:"Ú€";s:3:"ï­œ";s:2:"Ú€";s:3:"ï­";s:2:"Ú€";s:3:"ï­ž";s:2:"Ùº";s:3:"ï­Ÿ";s:2:"Ùº";s:3:"ï­ ";s:2:"Ùº";s:3:"ï­¡";s:2:"Ùº";s:3:"ï­¢";s:2:"Ù¿";s:3:"ï­£";s:2:"Ù¿";s:3:"ï­¤";s:2:"Ù¿";s:3:"ï­¥";s:2:"Ù¿";s:3:"ï­¦";s:2:"Ù¹";s:3:"ï­§";s:2:"Ù¹";s:3:"ï­¨";s:2:"Ù¹";s:3:"ï­©";s:2:"Ù¹";s:3:"ï­ª";s:2:"Ú¤";s:3:"ï­«";s:2:"Ú¤";s:3:"ï­¬";s:2:"Ú¤";s:3:"ï­­";s:2:"Ú¤";s:3:"ï­®";s:2:"Ú¦";s:3:"ï­¯";s:2:"Ú¦";s:3:"ï­°";s:2:"Ú¦";s:3:"ï­±";s:2:"Ú¦";s:3:"ï­²";s:2:"Ú„";s:3:"ï­³";s:2:"Ú„";s:3:"ï­´";s:2:"Ú„";s:3:"ï­µ";s:2:"Ú„";s:3:"ï­¶";s:2:"Úƒ";s:3:"ï­·";s:2:"Úƒ";s:3:"ï­¸";s:2:"Úƒ";s:3:"ï­¹";s:2:"Úƒ";s:3:"ï­º";s:2:"Ú†";s:3:"ï­»";s:2:"Ú†";s:3:"ï­¼";s:2:"Ú†";s:3:"ï­½";s:2:"Ú†";s:3:"ï­¾";s:2:"Ú‡";s:3:"ï­¿";s:2:"Ú‡";s:3:"ﮀ";s:2:"Ú‡";s:3:"ï®";s:2:"Ú‡";s:3:"ﮂ";s:2:"Ú";s:3:"ﮃ";s:2:"Ú";s:3:"ﮄ";s:2:"ÚŒ";s:3:"ï®…";s:2:"ÚŒ";s:3:"ﮆ";s:2:"ÚŽ";s:3:"ﮇ";s:2:"ÚŽ";s:3:"ﮈ";s:2:"Úˆ";s:3:"ﮉ";s:2:"Úˆ";s:3:"ﮊ";s:2:"Ú˜";s:3:"ﮋ";s:2:"Ú˜";s:3:"ﮌ";s:2:"Ú‘";s:3:"ï®";s:2:"Ú‘";s:3:"ﮎ";s:2:"Ú©";s:3:"ï®";s:2:"Ú©";s:3:"ï®";s:2:"Ú©";s:3:"ﮑ";s:2:"Ú©";s:3:"ï®’";s:2:"Ú¯";s:3:"ﮓ";s:2:"Ú¯";s:3:"ï®”";s:2:"Ú¯";s:3:"ﮕ";s:2:"Ú¯";s:3:"ï®–";s:2:"Ú³";s:3:"ï®—";s:2:"Ú³";s:3:"ﮘ";s:2:"Ú³";s:3:"ï®™";s:2:"Ú³";s:3:"ﮚ";s:2:"Ú±";s:3:"ï®›";s:2:"Ú±";s:3:"ﮜ";s:2:"Ú±";s:3:"ï®";s:2:"Ú±";s:3:"ﮞ";s:2:"Úº";s:3:"ﮟ";s:2:"Úº";s:3:"ï® ";s:2:"Ú»";s:3:"ﮡ";s:2:"Ú»";s:3:"ﮢ";s:2:"Ú»";s:3:"ﮣ";s:2:"Ú»";s:3:"ﮤ";s:4:"Û•Ù”";s:3:"ﮥ";s:4:"Û•Ù”";s:3:"ﮦ";s:2:"Û";s:3:"ﮧ";s:2:"Û";s:3:"ﮨ";s:2:"Û";s:3:"ﮩ";s:2:"Û";s:3:"ﮪ";s:2:"Ú¾";s:3:"ﮫ";s:2:"Ú¾";s:3:"ﮬ";s:2:"Ú¾";s:3:"ï®­";s:2:"Ú¾";s:3:"ï®®";s:2:"Û’";s:3:"ﮯ";s:2:"Û’";s:3:"ï®°";s:4:"Û’Ù”";s:3:"ï®±";s:4:"Û’Ù”";s:3:"ﯓ";s:2:"Ú­";s:3:"ﯔ";s:2:"Ú­";s:3:"ﯕ";s:2:"Ú­";s:3:"ﯖ";s:2:"Ú­";s:3:"ﯗ";s:2:"Û‡";s:3:"ﯘ";s:2:"Û‡";s:3:"ﯙ";s:2:"Û†";s:3:"ﯚ";s:2:"Û†";s:3:"ﯛ";s:2:"Ûˆ";s:3:"ﯜ";s:2:"Ûˆ";s:3:"ï¯";s:4:"Û‡Ù´";s:3:"ﯞ";s:2:"Û‹";s:3:"ﯟ";s:2:"Û‹";s:3:"ﯠ";s:2:"Û…";s:3:"ﯡ";s:2:"Û…";s:3:"ﯢ";s:2:"Û‰";s:3:"ﯣ";s:2:"Û‰";s:3:"ﯤ";s:2:"Û";s:3:"ﯥ";s:2:"Û";s:3:"ﯦ";s:2:"Û";s:3:"ﯧ";s:2:"Û";s:3:"ﯨ";s:2:"Ù‰";s:3:"ﯩ";s:2:"Ù‰";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ÙŠÙ”Û•";s:3:"ﯭ";s:6:"ÙŠÙ”Û•";s:3:"ﯮ";s:6:"ÙŠÙ”Ùˆ";s:3:"ﯯ";s:6:"ÙŠÙ”Ùˆ";s:3:"ﯰ";s:6:"ÙŠÙ”Û‡";s:3:"ﯱ";s:6:"ÙŠÙ”Û‡";s:3:"ﯲ";s:6:"ÙŠÙ”Û†";s:3:"ﯳ";s:6:"ÙŠÙ”Û†";s:3:"ﯴ";s:6:"ÙŠÙ”Ûˆ";s:3:"ﯵ";s:6:"ÙŠÙ”Ûˆ";s:3:"ﯶ";s:6:"ÙŠÙ”Û";s:3:"ﯷ";s:6:"ÙŠÙ”Û";s:3:"ﯸ";s:6:"ÙŠÙ”Û";s:3:"ﯹ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯺ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯻ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯼ";s:2:"ÛŒ";s:3:"ﯽ";s:2:"ÛŒ";s:3:"ﯾ";s:2:"ÛŒ";s:3:"ﯿ";s:2:"ÛŒ";s:3:"ï°€";s:6:"ئج";s:3:"ï°";s:6:"ئح";s:3:"ï°‚";s:6:"ÙŠÙ”Ù…";s:3:"ï°ƒ";s:6:"ÙŠÙ”Ù‰";s:3:"ï°„";s:6:"ÙŠÙ”ÙŠ";s:3:"ï°…";s:4:"بج";s:3:"ï°†";s:4:"بح";s:3:"ï°‡";s:4:"بخ";s:3:"ï°ˆ";s:4:"بم";s:3:"ï°‰";s:4:"بى";s:3:"ï°Š";s:4:"بي";s:3:"ï°‹";s:4:"تج";s:3:"ï°Œ";s:4:"تح";s:3:"ï°";s:4:"تخ";s:3:"ï°Ž";s:4:"تم";s:3:"ï°";s:4:"تى";s:3:"ï°";s:4:"تي";s:3:"ï°‘";s:4:"ثج";s:3:"ï°’";s:4:"ثم";s:3:"ï°“";s:4:"ثى";s:3:"ï°”";s:4:"ثي";s:3:"ï°•";s:4:"جح";s:3:"ï°–";s:4:"جم";s:3:"ï°—";s:4:"حج";s:3:"ï°˜";s:4:"حم";s:3:"ï°™";s:4:"خج";s:3:"ï°š";s:4:"خح";s:3:"ï°›";s:4:"خم";s:3:"ï°œ";s:4:"سج";s:3:"ï°";s:4:"سح";s:3:"ï°ž";s:4:"سخ";s:3:"ï°Ÿ";s:4:"سم";s:3:"ï° ";s:4:"صح";s:3:"ï°¡";s:4:"صم";s:3:"ï°¢";s:4:"ضج";s:3:"ï°£";s:4:"ضح";s:3:"ï°¤";s:4:"ضخ";s:3:"ï°¥";s:4:"ضم";s:3:"ï°¦";s:4:"طح";s:3:"ï°§";s:4:"طم";s:3:"ï°¨";s:4:"ظم";s:3:"ï°©";s:4:"عج";s:3:"ï°ª";s:4:"عم";s:3:"ï°«";s:4:"غج";s:3:"ï°¬";s:4:"غم";s:3:"ï°­";s:4:"Ùج";s:3:"ï°®";s:4:"ÙØ­";s:3:"ï°¯";s:4:"ÙØ®";s:3:"ï°°";s:4:"ÙÙ…";s:3:"ï°±";s:4:"ÙÙ‰";s:3:"ï°²";s:4:"ÙÙŠ";s:3:"ï°³";s:4:"قح";s:3:"ï°´";s:4:"قم";s:3:"ï°µ";s:4:"قى";s:3:"ï°¶";s:4:"قي";s:3:"ï°·";s:4:"كا";s:3:"ï°¸";s:4:"كج";s:3:"ï°¹";s:4:"كح";s:3:"ï°º";s:4:"كخ";s:3:"ï°»";s:4:"كل";s:3:"ï°¼";s:4:"كم";s:3:"ï°½";s:4:"كى";s:3:"ï°¾";s:4:"كي";s:3:"ï°¿";s:4:"لج";s:3:"ï±€";s:4:"لح";s:3:"ï±";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ï±…";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ï±";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ï±";s:4:"نى";s:3:"ï±";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ï±’";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ï±”";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ï±–";s:4:"يح";s:3:"ï±—";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ï±™";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ï±›";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ï±";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ÙÙ‘";s:3:"ï± ";s:5:" ÙŽÙ‘";s:3:"ﱡ";s:5:" ÙÙ‘";s:3:"ï±¢";s:5:" ÙÙ‘";s:3:"ï±£";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ï±¥";s:6:"ئز";s:3:"ﱦ";s:6:"ÙŠÙ”Ù…";s:3:"ﱧ";s:6:"ÙŠÙ”Ù†";s:3:"ﱨ";s:6:"ÙŠÙ”Ù‰";s:3:"ﱩ";s:6:"ÙŠÙ”ÙŠ";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ï±­";s:4:"بن";s:3:"ï±®";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ï±°";s:4:"تر";s:3:"ï±±";s:4:"تز";s:3:"ï±²";s:4:"تم";s:3:"ï±³";s:4:"تن";s:3:"ï±´";s:4:"تى";s:3:"ï±µ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ï±·";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ï±¹";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ï±»";s:4:"ثي";s:3:"ï±¼";s:4:"ÙÙ‰";s:3:"ï±½";s:4:"ÙÙŠ";s:3:"ï±¾";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ï²€";s:4:"كا";s:3:"ï²";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ï²…";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ï²";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ï²";s:4:"ني";s:3:"ï²";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ï²’";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ï²”";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ï²–";s:4:"يي";s:3:"ï²—";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ï²™";s:6:"ئخ";s:3:"ﲚ";s:6:"ÙŠÙ”Ù…";s:3:"ï²›";s:6:"ÙŠÙ”Ù‡";s:3:"ﲜ";s:4:"بج";s:3:"ï²";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ï² ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ï²¢";s:4:"تح";s:3:"ï²£";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ï²¥";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ï²­";s:4:"سج";s:3:"ï²®";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ï²°";s:4:"سم";s:3:"ï²±";s:4:"صح";s:3:"ï²²";s:4:"صخ";s:3:"ï²³";s:4:"صم";s:3:"ï²´";s:4:"ضج";s:3:"ï²µ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ï²·";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ï²¹";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ï²»";s:4:"عم";s:3:"ï²¼";s:4:"غج";s:3:"ï²½";s:4:"غم";s:3:"ï²¾";s:4:"Ùج";s:3:"ﲿ";s:4:"ÙØ­";s:3:"ï³€";s:4:"ÙØ®";s:3:"ï³";s:4:"ÙÙ…";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ï³…";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ï³";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ï³";s:4:"مح";s:3:"ï³";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ï³’";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ï³”";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ï³–";s:4:"نه";s:3:"ï³—";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ï³™";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ï³›";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ï³";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ÙŠÙ”Ù…";s:3:"ï³ ";s:6:"ÙŠÙ”Ù‡";s:3:"ﳡ";s:4:"بم";s:3:"ï³¢";s:4:"به";s:3:"ï³£";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ï³¥";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ï³­";s:4:"لم";s:3:"ï³®";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ï³°";s:4:"يم";s:3:"ï³±";s:4:"يه";s:3:"ï³²";s:6:"Ù€ÙŽÙ‘";s:3:"ï³³";s:6:"Ù€ÙÙ‘";s:3:"ï³´";s:6:"Ù€ÙÙ‘";s:3:"ï³µ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ï³·";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ï³¹";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ï³»";s:4:"سى";s:3:"ï³¼";s:4:"سي";s:3:"ï³½";s:4:"شى";s:3:"ï³¾";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ï´€";s:4:"حي";s:3:"ï´";s:4:"جى";s:3:"ï´‚";s:4:"جي";s:3:"ï´ƒ";s:4:"خى";s:3:"ï´„";s:4:"خي";s:3:"ï´…";s:4:"صى";s:3:"ï´†";s:4:"صي";s:3:"ï´‡";s:4:"ضى";s:3:"ï´ˆ";s:4:"ضي";s:3:"ï´‰";s:4:"شج";s:3:"ï´Š";s:4:"شح";s:3:"ï´‹";s:4:"شخ";s:3:"ï´Œ";s:4:"شم";s:3:"ï´";s:4:"شر";s:3:"ï´Ž";s:4:"سر";s:3:"ï´";s:4:"صر";s:3:"ï´";s:4:"ضر";s:3:"ï´‘";s:4:"طى";s:3:"ï´’";s:4:"طي";s:3:"ï´“";s:4:"عى";s:3:"ï´”";s:4:"عي";s:3:"ï´•";s:4:"غى";s:3:"ï´–";s:4:"غي";s:3:"ï´—";s:4:"سى";s:3:"ï´˜";s:4:"سي";s:3:"ï´™";s:4:"شى";s:3:"ï´š";s:4:"شي";s:3:"ï´›";s:4:"حى";s:3:"ï´œ";s:4:"حي";s:3:"ï´";s:4:"جى";s:3:"ï´ž";s:4:"جي";s:3:"ï´Ÿ";s:4:"خى";s:3:"ï´ ";s:4:"خي";s:3:"ï´¡";s:4:"صى";s:3:"ï´¢";s:4:"صي";s:3:"ï´£";s:4:"ضى";s:3:"ï´¤";s:4:"ضي";s:3:"ï´¥";s:4:"شج";s:3:"ï´¦";s:4:"شح";s:3:"ï´§";s:4:"شخ";s:3:"ï´¨";s:4:"شم";s:3:"ï´©";s:4:"شر";s:3:"ï´ª";s:4:"سر";s:3:"ï´«";s:4:"صر";s:3:"ï´¬";s:4:"ضر";s:3:"ï´­";s:4:"شج";s:3:"ï´®";s:4:"شح";s:3:"ï´¯";s:4:"شخ";s:3:"ï´°";s:4:"شم";s:3:"ï´±";s:4:"سه";s:3:"ï´²";s:4:"شه";s:3:"ï´³";s:4:"طم";s:3:"ï´´";s:4:"سج";s:3:"ï´µ";s:4:"سح";s:3:"ï´¶";s:4:"سخ";s:3:"ï´·";s:4:"شج";s:3:"ï´¸";s:4:"شح";s:3:"ï´¹";s:4:"شخ";s:3:"ï´º";s:4:"طم";s:3:"ï´»";s:4:"ظم";s:3:"ï´¼";s:4:"اً";s:3:"ï´½";s:4:"اً";s:3:"ïµ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ïµ’";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ïµ”";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ïµ–";s:6:"تمح";s:3:"ïµ—";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ïµ™";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ïµ›";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ïµ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ïµ ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ïµ¢";s:6:"سمم";s:3:"ïµ£";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ïµ¥";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ïµ­";s:6:"شمم";s:3:"ïµ®";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ïµ°";s:6:"ضخم";s:3:"ïµ±";s:6:"طمح";s:3:"ïµ²";s:6:"طمح";s:3:"ïµ³";s:6:"طمم";s:3:"ïµ´";s:6:"طمي";s:3:"ïµµ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ïµ·";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ïµ¹";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ïµ»";s:6:"غمى";s:3:"ïµ¼";s:6:"Ùخم";s:3:"ïµ½";s:6:"Ùخم";s:3:"ïµ¾";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ï¶";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ï¶";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ï¶";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ï¶";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ï·€";s:6:"مجي";s:3:"ï·";s:6:"Ùمي";s:3:"ï·‚";s:6:"بحي";s:3:"ï·ƒ";s:6:"كمم";s:3:"ï·„";s:6:"عجم";s:3:"ï·…";s:6:"صمم";s:3:"ï·†";s:6:"سخي";s:3:"ï·‡";s:6:"نجي";s:3:"ï·°";s:6:"صلے";s:3:"ï·±";s:6:"قلے";s:3:"ï·²";s:8:"الله";s:3:"ï·³";s:8:"اكبر";s:3:"ï·´";s:8:"محمد";s:3:"ï·µ";s:8:"صلعم";s:3:"ï·¶";s:8:"رسول";s:3:"ï··";s:8:"عليه";s:3:"ï·¸";s:8:"وسلم";s:3:"ï·¹";s:6:"صلى";s:3:"ï·º";s:33:"صلى الله عليه وسلم";s:3:"ï·»";s:15:"جل جلاله";s:3:"ï·¼";s:8:"ریال";s:3:"ï¸";s:1:",";s:3:"︑";s:3:"ã€";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"ã€";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"ï¹€";s:3:"〉";s:3:"ï¹";s:3:"「";s:3:"﹂";s:3:"ã€";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"ã€";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" Ì…";s:3:"﹊";s:3:" Ì…";s:3:"﹋";s:3:" Ì…";s:3:"﹌";s:3:" Ì…";s:3:"ï¹";s:1:"_";s:3:"﹎";s:1:"_";s:3:"ï¹";s:1:"_";s:3:"ï¹";s:1:",";s:3:"﹑";s:3:"ã€";s:3:"ï¹’";s:1:".";s:3:"ï¹”";s:1:";";s:3:"﹕";s:1:":";s:3:"ï¹–";s:1:"?";s:3:"ï¹—";s:1:"!";s:3:"﹘";s:3:"—";s:3:"ï¹™";s:1:"(";s:3:"﹚";s:1:")";s:3:"ï¹›";s:1:"{";s:3:"﹜";s:1:"}";s:3:"ï¹";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"ï¹ ";s:1:"&";s:3:"﹡";s:1:"*";s:3:"ï¹¢";s:1:"+";s:3:"ï¹£";s:1:"-";s:3:"﹤";s:1:"<";s:3:"ï¹¥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ï¹°";s:3:" Ù‹";s:3:"ï¹±";s:4:"ـً";s:3:"ï¹²";s:3:" ÙŒ";s:3:"ï¹´";s:3:" Ù";s:3:"ﹶ";s:3:" ÙŽ";s:3:"ï¹·";s:4:"Ù€ÙŽ";s:3:"ﹸ";s:3:" Ù";s:3:"ï¹¹";s:4:"Ù€Ù";s:3:"ﹺ";s:3:" Ù";s:3:"ï¹»";s:4:"Ù€Ù";s:3:"ï¹¼";s:3:" Ù‘";s:3:"ï¹½";s:4:"ـّ";s:3:"ï¹¾";s:3:" Ù’";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"Ø¡";s:3:"ïº";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ÙˆÙ”";s:3:"ﺆ";s:4:"ÙˆÙ”";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ÙŠÙ”";s:3:"ﺊ";s:4:"ÙŠÙ”";s:3:"ﺋ";s:4:"ÙŠÙ”";s:3:"ﺌ";s:4:"ÙŠÙ”";s:3:"ïº";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ïº";s:2:"ب";s:3:"ïº";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"Ø©";s:3:"ﺔ";s:2:"Ø©";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"Ø«";s:3:"ﺚ";s:2:"Ø«";s:3:"ﺛ";s:2:"Ø«";s:3:"ﺜ";s:2:"Ø«";s:3:"ïº";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"Ø­";s:3:"ﺢ";s:2:"Ø­";s:3:"ﺣ";s:2:"Ø­";s:3:"ﺤ";s:2:"Ø­";s:3:"ﺥ";s:2:"Ø®";s:3:"ﺦ";s:2:"Ø®";s:3:"ﺧ";s:2:"Ø®";s:3:"ﺨ";s:2:"Ø®";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"Ø°";s:3:"ﺬ";s:2:"Ø°";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"Ø´";s:3:"ﺶ";s:2:"Ø´";s:3:"ﺷ";s:2:"Ø´";s:3:"ﺸ";s:2:"Ø´";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ï»";s:2:"Ø·";s:3:"ﻂ";s:2:"Ø·";s:3:"ﻃ";s:2:"Ø·";s:3:"ﻄ";s:2:"Ø·";s:3:"ï»…";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ï»";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ï»";s:2:"غ";s:3:"ï»";s:2:"غ";s:3:"ﻑ";s:2:"Ù";s:3:"ï»’";s:2:"Ù";s:3:"ﻓ";s:2:"Ù";s:3:"ï»”";s:2:"Ù";s:3:"ﻕ";s:2:"Ù‚";s:3:"ï»–";s:2:"Ù‚";s:3:"ï»—";s:2:"Ù‚";s:3:"ﻘ";s:2:"Ù‚";s:3:"ï»™";s:2:"Ùƒ";s:3:"ﻚ";s:2:"Ùƒ";s:3:"ï»›";s:2:"Ùƒ";s:3:"ﻜ";s:2:"Ùƒ";s:3:"ï»";s:2:"Ù„";s:3:"ﻞ";s:2:"Ù„";s:3:"ﻟ";s:2:"Ù„";s:3:"ï» ";s:2:"Ù„";s:3:"ﻡ";s:2:"Ù…";s:3:"ﻢ";s:2:"Ù…";s:3:"ﻣ";s:2:"Ù…";s:3:"ﻤ";s:2:"Ù…";s:3:"ﻥ";s:2:"Ù†";s:3:"ﻦ";s:2:"Ù†";s:3:"ﻧ";s:2:"Ù†";s:3:"ﻨ";s:2:"Ù†";s:3:"ﻩ";s:2:"Ù‡";s:3:"ﻪ";s:2:"Ù‡";s:3:"ﻫ";s:2:"Ù‡";s:3:"ﻬ";s:2:"Ù‡";s:3:"ï»­";s:2:"Ùˆ";s:3:"ï»®";s:2:"Ùˆ";s:3:"ﻯ";s:2:"Ù‰";s:3:"ï»°";s:2:"Ù‰";s:3:"ï»±";s:2:"ÙŠ";s:3:"ﻲ";s:2:"ÙŠ";s:3:"ﻳ";s:2:"ÙŠ";s:3:"ï»´";s:2:"ÙŠ";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ï»·";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ï»»";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"ï¼";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"ï¼…";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"\'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"ï¼";s:1:"-";s:3:".";s:1:".";s:3:"ï¼";s:1:"/";s:3:"ï¼";s:1:"0";s:3:"1";s:1:"1";s:3:"ï¼’";s:1:"2";s:3:"3";s:1:"3";s:3:"ï¼”";s:1:"4";s:3:"5";s:1:"5";s:3:"ï¼–";s:1:"6";s:3:"ï¼—";s:1:"7";s:3:"8";s:1:"8";s:3:"ï¼™";s:1:"9";s:3:":";s:1:":";s:3:"ï¼›";s:1:";";s:3:"<";s:1:"<";s:3:"ï¼";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"ï¼ ";s:1:"@";s:3:"A";s:1:"A";s:3:"ï¼¢";s:1:"B";s:3:"ï¼£";s:1:"C";s:3:"D";s:1:"D";s:3:"ï¼¥";s:1:"E";s:3:"F";s:1:"F";s:3:"G";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"ï¼­";s:1:"M";s:3:"ï¼®";s:1:"N";s:3:"O";s:1:"O";s:3:"ï¼°";s:1:"P";s:3:"ï¼±";s:1:"Q";s:3:"ï¼²";s:1:"R";s:3:"ï¼³";s:1:"S";s:3:"ï¼´";s:1:"T";s:3:"ï¼µ";s:1:"U";s:3:"V";s:1:"V";s:3:"ï¼·";s:1:"W";s:3:"X";s:1:"X";s:3:"ï¼¹";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"ï¼»";s:1:"[";s:3:"ï¼¼";s:1:"\\";s:3:"ï¼½";s:1:"]";s:3:"ï¼¾";s:1:"^";s:3:"_";s:1:"_";s:3:"ï½€";s:1:"`";s:3:"ï½";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"ï½…";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"ï½";s:1:"m";s:3:"n";s:1:"n";s:3:"ï½";s:1:"o";s:3:"ï½";s:1:"p";s:3:"q";s:1:"q";s:3:"ï½’";s:1:"r";s:3:"s";s:1:"s";s:3:"ï½”";s:1:"t";s:3:"u";s:1:"u";s:3:"ï½–";s:1:"v";s:3:"ï½—";s:1:"w";s:3:"x";s:1:"x";s:3:"ï½™";s:1:"y";s:3:"z";s:1:"z";s:3:"ï½›";s:1:"{";s:3:"|";s:1:"|";s:3:"ï½";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"ï½ ";s:3:"⦆";s:3:"。";s:3:"。";s:3:"ï½¢";s:3:"「";s:3:"ï½£";s:3:"ã€";s:3:"、";s:3:"ã€";s:3:"ï½¥";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ァ";s:3:"ã‚¡";s:3:"ィ";s:3:"ã‚£";s:3:"ゥ";s:3:"ã‚¥";s:3:"ェ";s:3:"ェ";s:3:"ォ";s:3:"ã‚©";s:3:"ャ";s:3:"ャ";s:3:"ï½­";s:3:"ュ";s:3:"ï½®";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ï½°";s:3:"ー";s:3:"ï½±";s:3:"ã‚¢";s:3:"ï½²";s:3:"イ";s:3:"ï½³";s:3:"ウ";s:3:"ï½´";s:3:"エ";s:3:"ï½µ";s:3:"オ";s:3:"カ";s:3:"ã‚«";s:3:"ï½·";s:3:"ã‚­";s:3:"ク";s:3:"ク";s:3:"ï½¹";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"ï½»";s:3:"サ";s:3:"ï½¼";s:3:"ã‚·";s:3:"ï½½";s:3:"ス";s:3:"ï½¾";s:3:"ã‚»";s:3:"ソ";s:3:"ソ";s:3:"ï¾€";s:3:"ã‚¿";s:3:"ï¾";s:3:"ãƒ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ï¾…";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ãƒ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ãƒ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ï¾";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"ï¾";s:3:"マ";s:3:"ï¾";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"ï¾’";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ï¾”";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ï¾–";s:3:"ヨ";s:3:"ï¾—";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ï¾™";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ï¾›";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ï¾";s:3:"ン";s:3:"゙";s:3:"ã‚™";s:3:"゚";s:3:"ã‚š";s:3:"ï¾ ";s:3:"á… ";s:3:"ᄀ";s:3:"á„€";s:3:"ï¾¢";s:3:"á„";s:3:"ï¾£";s:3:"ᆪ";s:3:"ᄂ";s:3:"á„‚";s:3:"ï¾¥";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ᄃ";s:3:"ᄃ";s:3:"ᄄ";s:3:"á„„";s:3:"ᄅ";s:3:"á„…";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ï¾­";s:3:"ᆳ";s:3:"ï¾®";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ï¾°";s:3:"á„š";s:3:"ï¾±";s:3:"ᄆ";s:3:"ï¾²";s:3:"ᄇ";s:3:"ï¾³";s:3:"ᄈ";s:3:"ï¾´";s:3:"á„¡";s:3:"ï¾µ";s:3:"ᄉ";s:3:"ᄊ";s:3:"á„Š";s:3:"ï¾·";s:3:"á„‹";s:3:"ᄌ";s:3:"á„Œ";s:3:"ï¾¹";s:3:"á„";s:3:"ᄎ";s:3:"á„Ž";s:3:"ï¾»";s:3:"á„";s:3:"ï¾¼";s:3:"á„";s:3:"ï¾½";s:3:"á„‘";s:3:"ï¾¾";s:3:"á„’";s:3:"ï¿‚";s:3:"á…¡";s:3:"ᅢ";s:3:"á…¢";s:3:"ï¿„";s:3:"á…£";s:3:"ï¿…";s:3:"á…¤";s:3:"ᅥ";s:3:"á…¥";s:3:"ᅦ";s:3:"á…¦";s:3:"ï¿Š";s:3:"á…§";s:3:"ï¿‹";s:3:"á…¨";s:3:"ï¿Œ";s:3:"á…©";s:3:"ï¿";s:3:"á…ª";s:3:"ï¿Ž";s:3:"á…«";s:3:"ï¿";s:3:"á…¬";s:3:"ï¿’";s:3:"á…­";s:3:"ï¿“";s:3:"á…®";s:3:"ï¿”";s:3:"á…¯";s:3:"ï¿•";s:3:"á…°";s:3:"ï¿–";s:3:"á…±";s:3:"ï¿—";s:3:"á…²";s:3:"ï¿š";s:3:"á…³";s:3:"ï¿›";s:3:"á…´";s:3:"ï¿œ";s:3:"á…µ";s:3:"ï¿ ";s:2:"¢";s:3:"ï¿¡";s:2:"£";s:3:"ï¿¢";s:2:"¬";s:3:"ï¿£";s:3:" Ì„";s:3:"¦";s:2:"¦";s:3:"ï¿¥";s:2:"Â¥";s:3:"₩";s:3:"â‚©";s:3:"│";s:3:"│";s:3:"ï¿©";s:3:"â†";s:3:"↑";s:3:"↑";s:3:"ï¿«";s:3:"→";s:3:"↓";s:3:"↓";s:3:"ï¿­";s:3:"â– ";s:3:"ï¿®";s:3:"â—‹";s:4:"ð‘‚š";s:8:"𑂚";s:4:"ð‘‚œ";s:8:"𑂜";s:4:"ð‘‚«";s:8:"𑂫";s:4:"ð…ž";s:8:"ð…—ð…¥";s:4:"ð…Ÿ";s:8:"ð…˜ð…¥";s:4:"ð… ";s:12:"ð…˜ð…¥ð…®";s:4:"ð…¡";s:12:"ð…˜ð…¥ð…¯";s:4:"ð…¢";s:12:"ð…˜ð…¥ð…°";s:4:"ð…£";s:12:"ð…˜ð…¥ð…±";s:4:"ð…¤";s:12:"ð…˜ð…¥ð…²";s:4:"ð†»";s:8:"ð†¹ð…¥";s:4:"ð†¼";s:8:"ð†ºð…¥";s:4:"ð†½";s:12:"ð†¹ð…¥ð…®";s:4:"ð†¾";s:12:"ð†ºð…¥ð…®";s:4:"ð†¿";s:12:"ð†¹ð…¥ð…¯";s:4:"ð‡€";s:12:"ð†ºð…¥ð…¯";s:4:"ð€";s:1:"A";s:4:"ð";s:1:"B";s:4:"ð‚";s:1:"C";s:4:"ðƒ";s:1:"D";s:4:"ð„";s:1:"E";s:4:"ð…";s:1:"F";s:4:"ð†";s:1:"G";s:4:"ð‡";s:1:"H";s:4:"ðˆ";s:1:"I";s:4:"ð‰";s:1:"J";s:4:"ðŠ";s:1:"K";s:4:"ð‹";s:1:"L";s:4:"ðŒ";s:1:"M";s:4:"ð";s:1:"N";s:4:"ðŽ";s:1:"O";s:4:"ð";s:1:"P";s:4:"ð";s:1:"Q";s:4:"ð‘";s:1:"R";s:4:"ð’";s:1:"S";s:4:"ð“";s:1:"T";s:4:"ð”";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð–";s:1:"W";s:4:"ð—";s:1:"X";s:4:"ð˜";s:1:"Y";s:4:"ð™";s:1:"Z";s:4:"ðš";s:1:"a";s:4:"ð›";s:1:"b";s:4:"ðœ";s:1:"c";s:4:"ð";s:1:"d";s:4:"ðž";s:1:"e";s:4:"ðŸ";s:1:"f";s:4:"ð ";s:1:"g";s:4:"ð¡";s:1:"h";s:4:"ð¢";s:1:"i";s:4:"ð£";s:1:"j";s:4:"ð¤";s:1:"k";s:4:"ð¥";s:1:"l";s:4:"ð¦";s:1:"m";s:4:"ð§";s:1:"n";s:4:"ð¨";s:1:"o";s:4:"ð©";s:1:"p";s:4:"ðª";s:1:"q";s:4:"ð«";s:1:"r";s:4:"ð¬";s:1:"s";s:4:"ð­";s:1:"t";s:4:"ð®";s:1:"u";s:4:"ð¯";s:1:"v";s:4:"ð°";s:1:"w";s:4:"ð±";s:1:"x";s:4:"ð²";s:1:"y";s:4:"ð³";s:1:"z";s:4:"ð´";s:1:"A";s:4:"ðµ";s:1:"B";s:4:"ð¶";s:1:"C";s:4:"ð·";s:1:"D";s:4:"ð¸";s:1:"E";s:4:"ð¹";s:1:"F";s:4:"ðº";s:1:"G";s:4:"ð»";s:1:"H";s:4:"ð¼";s:1:"I";s:4:"ð½";s:1:"J";s:4:"ð¾";s:1:"K";s:4:"ð¿";s:1:"L";s:4:"ð‘€";s:1:"M";s:4:"ð‘";s:1:"N";s:4:"ð‘‚";s:1:"O";s:4:"ð‘ƒ";s:1:"P";s:4:"ð‘„";s:1:"Q";s:4:"ð‘…";s:1:"R";s:4:"ð‘†";s:1:"S";s:4:"ð‘‡";s:1:"T";s:4:"ð‘ˆ";s:1:"U";s:4:"ð‘‰";s:1:"V";s:4:"ð‘Š";s:1:"W";s:4:"ð‘‹";s:1:"X";s:4:"ð‘Œ";s:1:"Y";s:4:"ð‘";s:1:"Z";s:4:"ð‘Ž";s:1:"a";s:4:"ð‘";s:1:"b";s:4:"ð‘";s:1:"c";s:4:"ð‘‘";s:1:"d";s:4:"ð‘’";s:1:"e";s:4:"ð‘“";s:1:"f";s:4:"ð‘”";s:1:"g";s:4:"ð‘–";s:1:"i";s:4:"ð‘—";s:1:"j";s:4:"ð‘˜";s:1:"k";s:4:"ð‘™";s:1:"l";s:4:"ð‘š";s:1:"m";s:4:"ð‘›";s:1:"n";s:4:"ð‘œ";s:1:"o";s:4:"ð‘";s:1:"p";s:4:"ð‘ž";s:1:"q";s:4:"ð‘Ÿ";s:1:"r";s:4:"ð‘ ";s:1:"s";s:4:"ð‘¡";s:1:"t";s:4:"ð‘¢";s:1:"u";s:4:"ð‘£";s:1:"v";s:4:"ð‘¤";s:1:"w";s:4:"ð‘¥";s:1:"x";s:4:"ð‘¦";s:1:"y";s:4:"ð‘§";s:1:"z";s:4:"ð‘¨";s:1:"A";s:4:"ð‘©";s:1:"B";s:4:"ð‘ª";s:1:"C";s:4:"ð‘«";s:1:"D";s:4:"ð‘¬";s:1:"E";s:4:"ð‘­";s:1:"F";s:4:"ð‘®";s:1:"G";s:4:"ð‘¯";s:1:"H";s:4:"ð‘°";s:1:"I";s:4:"ð‘±";s:1:"J";s:4:"ð‘²";s:1:"K";s:4:"ð‘³";s:1:"L";s:4:"ð‘´";s:1:"M";s:4:"ð‘µ";s:1:"N";s:4:"ð‘¶";s:1:"O";s:4:"ð‘·";s:1:"P";s:4:"ð‘¸";s:1:"Q";s:4:"ð‘¹";s:1:"R";s:4:"ð‘º";s:1:"S";s:4:"ð‘»";s:1:"T";s:4:"ð‘¼";s:1:"U";s:4:"ð‘½";s:1:"V";s:4:"ð‘¾";s:1:"W";s:4:"ð‘¿";s:1:"X";s:4:"ð’€";s:1:"Y";s:4:"ð’";s:1:"Z";s:4:"ð’‚";s:1:"a";s:4:"ð’ƒ";s:1:"b";s:4:"ð’„";s:1:"c";s:4:"ð’…";s:1:"d";s:4:"ð’†";s:1:"e";s:4:"ð’‡";s:1:"f";s:4:"ð’ˆ";s:1:"g";s:4:"ð’‰";s:1:"h";s:4:"ð’Š";s:1:"i";s:4:"ð’‹";s:1:"j";s:4:"ð’Œ";s:1:"k";s:4:"ð’";s:1:"l";s:4:"ð’Ž";s:1:"m";s:4:"ð’";s:1:"n";s:4:"ð’";s:1:"o";s:4:"ð’‘";s:1:"p";s:4:"ð’’";s:1:"q";s:4:"ð’“";s:1:"r";s:4:"ð’”";s:1:"s";s:4:"ð’•";s:1:"t";s:4:"ð’–";s:1:"u";s:4:"ð’—";s:1:"v";s:4:"ð’˜";s:1:"w";s:4:"ð’™";s:1:"x";s:4:"ð’š";s:1:"y";s:4:"ð’›";s:1:"z";s:4:"ð’œ";s:1:"A";s:4:"ð’ž";s:1:"C";s:4:"ð’Ÿ";s:1:"D";s:4:"ð’¢";s:1:"G";s:4:"ð’¥";s:1:"J";s:4:"ð’¦";s:1:"K";s:4:"ð’©";s:1:"N";s:4:"ð’ª";s:1:"O";s:4:"ð’«";s:1:"P";s:4:"ð’¬";s:1:"Q";s:4:"ð’®";s:1:"S";s:4:"ð’¯";s:1:"T";s:4:"ð’°";s:1:"U";s:4:"ð’±";s:1:"V";s:4:"ð’²";s:1:"W";s:4:"ð’³";s:1:"X";s:4:"ð’´";s:1:"Y";s:4:"ð’µ";s:1:"Z";s:4:"ð’¶";s:1:"a";s:4:"ð’·";s:1:"b";s:4:"ð’¸";s:1:"c";s:4:"ð’¹";s:1:"d";s:4:"ð’»";s:1:"f";s:4:"ð’½";s:1:"h";s:4:"ð’¾";s:1:"i";s:4:"ð’¿";s:1:"j";s:4:"ð“€";s:1:"k";s:4:"ð“";s:1:"l";s:4:"ð“‚";s:1:"m";s:4:"ð“ƒ";s:1:"n";s:4:"ð“…";s:1:"p";s:4:"ð“†";s:1:"q";s:4:"ð“‡";s:1:"r";s:4:"ð“ˆ";s:1:"s";s:4:"ð“‰";s:1:"t";s:4:"ð“Š";s:1:"u";s:4:"ð“‹";s:1:"v";s:4:"ð“Œ";s:1:"w";s:4:"ð“";s:1:"x";s:4:"ð“Ž";s:1:"y";s:4:"ð“";s:1:"z";s:4:"ð“";s:1:"A";s:4:"ð“‘";s:1:"B";s:4:"ð“’";s:1:"C";s:4:"ð““";s:1:"D";s:4:"ð“”";s:1:"E";s:4:"ð“•";s:1:"F";s:4:"ð“–";s:1:"G";s:4:"ð“—";s:1:"H";s:4:"ð“˜";s:1:"I";s:4:"ð“™";s:1:"J";s:4:"ð“š";s:1:"K";s:4:"ð“›";s:1:"L";s:4:"ð“œ";s:1:"M";s:4:"ð“";s:1:"N";s:4:"ð“ž";s:1:"O";s:4:"ð“Ÿ";s:1:"P";s:4:"ð“ ";s:1:"Q";s:4:"ð“¡";s:1:"R";s:4:"ð“¢";s:1:"S";s:4:"ð“£";s:1:"T";s:4:"ð“¤";s:1:"U";s:4:"ð“¥";s:1:"V";s:4:"ð“¦";s:1:"W";s:4:"ð“§";s:1:"X";s:4:"ð“¨";s:1:"Y";s:4:"ð“©";s:1:"Z";s:4:"ð“ª";s:1:"a";s:4:"ð“«";s:1:"b";s:4:"ð“¬";s:1:"c";s:4:"ð“­";s:1:"d";s:4:"ð“®";s:1:"e";s:4:"ð“¯";s:1:"f";s:4:"ð“°";s:1:"g";s:4:"ð“±";s:1:"h";s:4:"ð“²";s:1:"i";s:4:"ð“³";s:1:"j";s:4:"ð“´";s:1:"k";s:4:"ð“µ";s:1:"l";s:4:"ð“¶";s:1:"m";s:4:"ð“·";s:1:"n";s:4:"ð“¸";s:1:"o";s:4:"ð“¹";s:1:"p";s:4:"ð“º";s:1:"q";s:4:"ð“»";s:1:"r";s:4:"ð“¼";s:1:"s";s:4:"ð“½";s:1:"t";s:4:"ð“¾";s:1:"u";s:4:"ð“¿";s:1:"v";s:4:"ð”€";s:1:"w";s:4:"ð”";s:1:"x";s:4:"ð”‚";s:1:"y";s:4:"ð”ƒ";s:1:"z";s:4:"ð”„";s:1:"A";s:4:"ð”…";s:1:"B";s:4:"ð”‡";s:1:"D";s:4:"ð”ˆ";s:1:"E";s:4:"ð”‰";s:1:"F";s:4:"ð”Š";s:1:"G";s:4:"ð”";s:1:"J";s:4:"ð”Ž";s:1:"K";s:4:"ð”";s:1:"L";s:4:"ð”";s:1:"M";s:4:"ð”‘";s:1:"N";s:4:"ð”’";s:1:"O";s:4:"ð”“";s:1:"P";s:4:"ð””";s:1:"Q";s:4:"ð”–";s:1:"S";s:4:"ð”—";s:1:"T";s:4:"ð”˜";s:1:"U";s:4:"ð”™";s:1:"V";s:4:"ð”š";s:1:"W";s:4:"ð”›";s:1:"X";s:4:"ð”œ";s:1:"Y";s:4:"ð”ž";s:1:"a";s:4:"ð”Ÿ";s:1:"b";s:4:"ð” ";s:1:"c";s:4:"ð”¡";s:1:"d";s:4:"ð”¢";s:1:"e";s:4:"ð”£";s:1:"f";s:4:"ð”¤";s:1:"g";s:4:"ð”¥";s:1:"h";s:4:"ð”¦";s:1:"i";s:4:"ð”§";s:1:"j";s:4:"ð”¨";s:1:"k";s:4:"ð”©";s:1:"l";s:4:"ð”ª";s:1:"m";s:4:"ð”«";s:1:"n";s:4:"ð”¬";s:1:"o";s:4:"ð”­";s:1:"p";s:4:"ð”®";s:1:"q";s:4:"ð”¯";s:1:"r";s:4:"ð”°";s:1:"s";s:4:"ð”±";s:1:"t";s:4:"ð”²";s:1:"u";s:4:"ð”³";s:1:"v";s:4:"ð”´";s:1:"w";s:4:"ð”µ";s:1:"x";s:4:"ð”¶";s:1:"y";s:4:"ð”·";s:1:"z";s:4:"ð”¸";s:1:"A";s:4:"ð”¹";s:1:"B";s:4:"ð”»";s:1:"D";s:4:"ð”¼";s:1:"E";s:4:"ð”½";s:1:"F";s:4:"ð”¾";s:1:"G";s:4:"ð•€";s:1:"I";s:4:"ð•";s:1:"J";s:4:"ð•‚";s:1:"K";s:4:"ð•ƒ";s:1:"L";s:4:"ð•„";s:1:"M";s:4:"ð•†";s:1:"O";s:4:"ð•Š";s:1:"S";s:4:"ð•‹";s:1:"T";s:4:"ð•Œ";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð•Ž";s:1:"W";s:4:"ð•";s:1:"X";s:4:"ð•";s:1:"Y";s:4:"ð•’";s:1:"a";s:4:"ð•“";s:1:"b";s:4:"ð•”";s:1:"c";s:4:"ð••";s:1:"d";s:4:"ð•–";s:1:"e";s:4:"ð•—";s:1:"f";s:4:"ð•˜";s:1:"g";s:4:"ð•™";s:1:"h";s:4:"ð•š";s:1:"i";s:4:"ð•›";s:1:"j";s:4:"ð•œ";s:1:"k";s:4:"ð•";s:1:"l";s:4:"ð•ž";s:1:"m";s:4:"ð•Ÿ";s:1:"n";s:4:"ð• ";s:1:"o";s:4:"ð•¡";s:1:"p";s:4:"ð•¢";s:1:"q";s:4:"ð•£";s:1:"r";s:4:"ð•¤";s:1:"s";s:4:"ð•¥";s:1:"t";s:4:"ð•¦";s:1:"u";s:4:"ð•§";s:1:"v";s:4:"ð•¨";s:1:"w";s:4:"ð•©";s:1:"x";s:4:"ð•ª";s:1:"y";s:4:"ð•«";s:1:"z";s:4:"ð•¬";s:1:"A";s:4:"ð•­";s:1:"B";s:4:"ð•®";s:1:"C";s:4:"ð•¯";s:1:"D";s:4:"ð•°";s:1:"E";s:4:"ð•±";s:1:"F";s:4:"ð•²";s:1:"G";s:4:"ð•³";s:1:"H";s:4:"ð•´";s:1:"I";s:4:"ð•µ";s:1:"J";s:4:"ð•¶";s:1:"K";s:4:"ð•·";s:1:"L";s:4:"ð•¸";s:1:"M";s:4:"ð•¹";s:1:"N";s:4:"ð•º";s:1:"O";s:4:"ð•»";s:1:"P";s:4:"ð•¼";s:1:"Q";s:4:"ð•½";s:1:"R";s:4:"ð•¾";s:1:"S";s:4:"ð•¿";s:1:"T";s:4:"ð–€";s:1:"U";s:4:"ð–";s:1:"V";s:4:"ð–‚";s:1:"W";s:4:"ð–ƒ";s:1:"X";s:4:"ð–„";s:1:"Y";s:4:"ð–…";s:1:"Z";s:4:"ð–†";s:1:"a";s:4:"ð–‡";s:1:"b";s:4:"ð–ˆ";s:1:"c";s:4:"ð–‰";s:1:"d";s:4:"ð–Š";s:1:"e";s:4:"ð–‹";s:1:"f";s:4:"ð–Œ";s:1:"g";s:4:"ð–";s:1:"h";s:4:"ð–Ž";s:1:"i";s:4:"ð–";s:1:"j";s:4:"ð–";s:1:"k";s:4:"ð–‘";s:1:"l";s:4:"ð–’";s:1:"m";s:4:"ð–“";s:1:"n";s:4:"ð–”";s:1:"o";s:4:"ð–•";s:1:"p";s:4:"ð––";s:1:"q";s:4:"ð–—";s:1:"r";s:4:"ð–˜";s:1:"s";s:4:"ð–™";s:1:"t";s:4:"ð–š";s:1:"u";s:4:"ð–›";s:1:"v";s:4:"ð–œ";s:1:"w";s:4:"ð–";s:1:"x";s:4:"ð–ž";s:1:"y";s:4:"ð–Ÿ";s:1:"z";s:4:"ð– ";s:1:"A";s:4:"ð–¡";s:1:"B";s:4:"ð–¢";s:1:"C";s:4:"ð–£";s:1:"D";s:4:"ð–¤";s:1:"E";s:4:"ð–¥";s:1:"F";s:4:"ð–¦";s:1:"G";s:4:"ð–§";s:1:"H";s:4:"ð–¨";s:1:"I";s:4:"ð–©";s:1:"J";s:4:"ð–ª";s:1:"K";s:4:"ð–«";s:1:"L";s:4:"ð–¬";s:1:"M";s:4:"ð–­";s:1:"N";s:4:"ð–®";s:1:"O";s:4:"ð–¯";s:1:"P";s:4:"ð–°";s:1:"Q";s:4:"ð–±";s:1:"R";s:4:"ð–²";s:1:"S";s:4:"ð–³";s:1:"T";s:4:"ð–´";s:1:"U";s:4:"ð–µ";s:1:"V";s:4:"ð–¶";s:1:"W";s:4:"ð–·";s:1:"X";s:4:"ð–¸";s:1:"Y";s:4:"ð–¹";s:1:"Z";s:4:"ð–º";s:1:"a";s:4:"ð–»";s:1:"b";s:4:"ð–¼";s:1:"c";s:4:"ð–½";s:1:"d";s:4:"ð–¾";s:1:"e";s:4:"ð–¿";s:1:"f";s:4:"ð—€";s:1:"g";s:4:"ð—";s:1:"h";s:4:"ð—‚";s:1:"i";s:4:"ð—ƒ";s:1:"j";s:4:"ð—„";s:1:"k";s:4:"ð—…";s:1:"l";s:4:"ð—†";s:1:"m";s:4:"ð—‡";s:1:"n";s:4:"ð—ˆ";s:1:"o";s:4:"ð—‰";s:1:"p";s:4:"ð—Š";s:1:"q";s:4:"ð—‹";s:1:"r";s:4:"ð—Œ";s:1:"s";s:4:"ð—";s:1:"t";s:4:"ð—Ž";s:1:"u";s:4:"ð—";s:1:"v";s:4:"ð—";s:1:"w";s:4:"ð—‘";s:1:"x";s:4:"ð—’";s:1:"y";s:4:"ð—“";s:1:"z";s:4:"ð—”";s:1:"A";s:4:"ð—•";s:1:"B";s:4:"ð—–";s:1:"C";s:4:"ð——";s:1:"D";s:4:"ð—˜";s:1:"E";s:4:"ð—™";s:1:"F";s:4:"ð—š";s:1:"G";s:4:"ð—›";s:1:"H";s:4:"ð—œ";s:1:"I";s:4:"ð—";s:1:"J";s:4:"ð—ž";s:1:"K";s:4:"ð—Ÿ";s:1:"L";s:4:"ð— ";s:1:"M";s:4:"ð—¡";s:1:"N";s:4:"ð—¢";s:1:"O";s:4:"ð—£";s:1:"P";s:4:"ð—¤";s:1:"Q";s:4:"ð—¥";s:1:"R";s:4:"ð—¦";s:1:"S";s:4:"ð—§";s:1:"T";s:4:"ð—¨";s:1:"U";s:4:"ð—©";s:1:"V";s:4:"ð—ª";s:1:"W";s:4:"ð—«";s:1:"X";s:4:"ð—¬";s:1:"Y";s:4:"ð—­";s:1:"Z";s:4:"ð—®";s:1:"a";s:4:"ð—¯";s:1:"b";s:4:"ð—°";s:1:"c";s:4:"ð—±";s:1:"d";s:4:"ð—²";s:1:"e";s:4:"ð—³";s:1:"f";s:4:"ð—´";s:1:"g";s:4:"ð—µ";s:1:"h";s:4:"ð—¶";s:1:"i";s:4:"ð—·";s:1:"j";s:4:"ð—¸";s:1:"k";s:4:"ð—¹";s:1:"l";s:4:"ð—º";s:1:"m";s:4:"ð—»";s:1:"n";s:4:"ð—¼";s:1:"o";s:4:"ð—½";s:1:"p";s:4:"ð—¾";s:1:"q";s:4:"ð—¿";s:1:"r";s:4:"ð˜€";s:1:"s";s:4:"ð˜";s:1:"t";s:4:"ð˜‚";s:1:"u";s:4:"ð˜ƒ";s:1:"v";s:4:"ð˜„";s:1:"w";s:4:"ð˜…";s:1:"x";s:4:"ð˜†";s:1:"y";s:4:"ð˜‡";s:1:"z";s:4:"ð˜ˆ";s:1:"A";s:4:"ð˜‰";s:1:"B";s:4:"ð˜Š";s:1:"C";s:4:"ð˜‹";s:1:"D";s:4:"ð˜Œ";s:1:"E";s:4:"ð˜";s:1:"F";s:4:"ð˜Ž";s:1:"G";s:4:"ð˜";s:1:"H";s:4:"ð˜";s:1:"I";s:4:"ð˜‘";s:1:"J";s:4:"ð˜’";s:1:"K";s:4:"ð˜“";s:1:"L";s:4:"ð˜”";s:1:"M";s:4:"ð˜•";s:1:"N";s:4:"ð˜–";s:1:"O";s:4:"ð˜—";s:1:"P";s:4:"ð˜˜";s:1:"Q";s:4:"ð˜™";s:1:"R";s:4:"ð˜š";s:1:"S";s:4:"ð˜›";s:1:"T";s:4:"ð˜œ";s:1:"U";s:4:"ð˜";s:1:"V";s:4:"ð˜ž";s:1:"W";s:4:"ð˜Ÿ";s:1:"X";s:4:"ð˜ ";s:1:"Y";s:4:"ð˜¡";s:1:"Z";s:4:"ð˜¢";s:1:"a";s:4:"ð˜£";s:1:"b";s:4:"ð˜¤";s:1:"c";s:4:"ð˜¥";s:1:"d";s:4:"ð˜¦";s:1:"e";s:4:"ð˜§";s:1:"f";s:4:"ð˜¨";s:1:"g";s:4:"ð˜©";s:1:"h";s:4:"ð˜ª";s:1:"i";s:4:"ð˜«";s:1:"j";s:4:"ð˜¬";s:1:"k";s:4:"ð˜­";s:1:"l";s:4:"ð˜®";s:1:"m";s:4:"ð˜¯";s:1:"n";s:4:"ð˜°";s:1:"o";s:4:"ð˜±";s:1:"p";s:4:"ð˜²";s:1:"q";s:4:"ð˜³";s:1:"r";s:4:"ð˜´";s:1:"s";s:4:"ð˜µ";s:1:"t";s:4:"ð˜¶";s:1:"u";s:4:"ð˜·";s:1:"v";s:4:"ð˜¸";s:1:"w";s:4:"ð˜¹";s:1:"x";s:4:"ð˜º";s:1:"y";s:4:"ð˜»";s:1:"z";s:4:"ð˜¼";s:1:"A";s:4:"ð˜½";s:1:"B";s:4:"ð˜¾";s:1:"C";s:4:"ð˜¿";s:1:"D";s:4:"ð™€";s:1:"E";s:4:"ð™";s:1:"F";s:4:"ð™‚";s:1:"G";s:4:"ð™ƒ";s:1:"H";s:4:"ð™„";s:1:"I";s:4:"ð™…";s:1:"J";s:4:"ð™†";s:1:"K";s:4:"ð™‡";s:1:"L";s:4:"ð™ˆ";s:1:"M";s:4:"ð™‰";s:1:"N";s:4:"ð™Š";s:1:"O";s:4:"ð™‹";s:1:"P";s:4:"ð™Œ";s:1:"Q";s:4:"ð™";s:1:"R";s:4:"ð™Ž";s:1:"S";s:4:"ð™";s:1:"T";s:4:"ð™";s:1:"U";s:4:"ð™‘";s:1:"V";s:4:"ð™’";s:1:"W";s:4:"ð™“";s:1:"X";s:4:"ð™”";s:1:"Y";s:4:"ð™•";s:1:"Z";s:4:"ð™–";s:1:"a";s:4:"ð™—";s:1:"b";s:4:"ð™˜";s:1:"c";s:4:"ð™™";s:1:"d";s:4:"ð™š";s:1:"e";s:4:"ð™›";s:1:"f";s:4:"ð™œ";s:1:"g";s:4:"ð™";s:1:"h";s:4:"ð™ž";s:1:"i";s:4:"ð™Ÿ";s:1:"j";s:4:"ð™ ";s:1:"k";s:4:"ð™¡";s:1:"l";s:4:"ð™¢";s:1:"m";s:4:"ð™£";s:1:"n";s:4:"ð™¤";s:1:"o";s:4:"ð™¥";s:1:"p";s:4:"ð™¦";s:1:"q";s:4:"ð™§";s:1:"r";s:4:"ð™¨";s:1:"s";s:4:"ð™©";s:1:"t";s:4:"ð™ª";s:1:"u";s:4:"ð™«";s:1:"v";s:4:"ð™¬";s:1:"w";s:4:"ð™­";s:1:"x";s:4:"ð™®";s:1:"y";s:4:"ð™¯";s:1:"z";s:4:"ð™°";s:1:"A";s:4:"ð™±";s:1:"B";s:4:"ð™²";s:1:"C";s:4:"ð™³";s:1:"D";s:4:"ð™´";s:1:"E";s:4:"ð™µ";s:1:"F";s:4:"ð™¶";s:1:"G";s:4:"ð™·";s:1:"H";s:4:"ð™¸";s:1:"I";s:4:"ð™¹";s:1:"J";s:4:"ð™º";s:1:"K";s:4:"ð™»";s:1:"L";s:4:"ð™¼";s:1:"M";s:4:"ð™½";s:1:"N";s:4:"ð™¾";s:1:"O";s:4:"ð™¿";s:1:"P";s:4:"ðš€";s:1:"Q";s:4:"ðš";s:1:"R";s:4:"ðš‚";s:1:"S";s:4:"ðšƒ";s:1:"T";s:4:"ðš„";s:1:"U";s:4:"ðš…";s:1:"V";s:4:"ðš†";s:1:"W";s:4:"ðš‡";s:1:"X";s:4:"ðšˆ";s:1:"Y";s:4:"ðš‰";s:1:"Z";s:4:"ðšŠ";s:1:"a";s:4:"ðš‹";s:1:"b";s:4:"ðšŒ";s:1:"c";s:4:"ðš";s:1:"d";s:4:"ðšŽ";s:1:"e";s:4:"ðš";s:1:"f";s:4:"ðš";s:1:"g";s:4:"ðš‘";s:1:"h";s:4:"ðš’";s:1:"i";s:4:"ðš“";s:1:"j";s:4:"ðš”";s:1:"k";s:4:"ðš•";s:1:"l";s:4:"ðš–";s:1:"m";s:4:"ðš—";s:1:"n";s:4:"ðš˜";s:1:"o";s:4:"ðš™";s:1:"p";s:4:"ðšš";s:1:"q";s:4:"ðš›";s:1:"r";s:4:"ðšœ";s:1:"s";s:4:"ðš";s:1:"t";s:4:"ðšž";s:1:"u";s:4:"ðšŸ";s:1:"v";s:4:"ðš ";s:1:"w";s:4:"ðš¡";s:1:"x";s:4:"ðš¢";s:1:"y";s:4:"ðš£";s:1:"z";s:4:"ðš¤";s:2:"ı";s:4:"ðš¥";s:2:"È·";s:4:"ðš¨";s:2:"Α";s:4:"ðš©";s:2:"Î’";s:4:"ðšª";s:2:"Γ";s:4:"ðš«";s:2:"Δ";s:4:"ðš¬";s:2:"Ε";s:4:"ðš­";s:2:"Ζ";s:4:"ðš®";s:2:"Η";s:4:"ðš¯";s:2:"Θ";s:4:"ðš°";s:2:"Ι";s:4:"ðš±";s:2:"Κ";s:4:"ðš²";s:2:"Λ";s:4:"ðš³";s:2:"Îœ";s:4:"ðš´";s:2:"Î";s:4:"ðšµ";s:2:"Ξ";s:4:"ðš¶";s:2:"Ο";s:4:"ðš·";s:2:"Π";s:4:"ðš¸";s:2:"Ρ";s:4:"ðš¹";s:2:"Θ";s:4:"ðšº";s:2:"Σ";s:4:"ðš»";s:2:"Τ";s:4:"ðš¼";s:2:"Î¥";s:4:"ðš½";s:2:"Φ";s:4:"ðš¾";s:2:"Χ";s:4:"ðš¿";s:2:"Ψ";s:4:"ð›€";s:2:"Ω";s:4:"ð›";s:3:"∇";s:4:"ð›‚";s:2:"α";s:4:"ð›ƒ";s:2:"β";s:4:"ð›„";s:2:"γ";s:4:"ð›…";s:2:"δ";s:4:"ð›†";s:2:"ε";s:4:"ð›‡";s:2:"ζ";s:4:"ð›ˆ";s:2:"η";s:4:"ð›‰";s:2:"θ";s:4:"ð›Š";s:2:"ι";s:4:"ð›‹";s:2:"κ";s:4:"ð›Œ";s:2:"λ";s:4:"ð›";s:2:"μ";s:4:"ð›Ž";s:2:"ν";s:4:"ð›";s:2:"ξ";s:4:"ð›";s:2:"ο";s:4:"ð›‘";s:2:"Ï€";s:4:"ð›’";s:2:"Ï";s:4:"ð›“";s:2:"Ï‚";s:4:"ð›”";s:2:"σ";s:4:"ð›•";s:2:"Ï„";s:4:"ð›–";s:2:"Ï…";s:4:"ð›—";s:2:"φ";s:4:"ð›˜";s:2:"χ";s:4:"ð›™";s:2:"ψ";s:4:"ð›š";s:2:"ω";s:4:"ð››";s:3:"∂";s:4:"ð›œ";s:2:"ε";s:4:"ð›";s:2:"θ";s:4:"ð›ž";s:2:"κ";s:4:"ð›Ÿ";s:2:"φ";s:4:"ð› ";s:2:"Ï";s:4:"ð›¡";s:2:"Ï€";s:4:"ð›¢";s:2:"Α";s:4:"ð›£";s:2:"Î’";s:4:"ð›¤";s:2:"Γ";s:4:"ð›¥";s:2:"Δ";s:4:"ð›¦";s:2:"Ε";s:4:"ð›§";s:2:"Ζ";s:4:"ð›¨";s:2:"Η";s:4:"ð›©";s:2:"Θ";s:4:"ð›ª";s:2:"Ι";s:4:"ð›«";s:2:"Κ";s:4:"ð›¬";s:2:"Λ";s:4:"ð›­";s:2:"Îœ";s:4:"ð›®";s:2:"Î";s:4:"ð›¯";s:2:"Ξ";s:4:"ð›°";s:2:"Ο";s:4:"ð›±";s:2:"Π";s:4:"ð›²";s:2:"Ρ";s:4:"ð›³";s:2:"Θ";s:4:"ð›´";s:2:"Σ";s:4:"ð›µ";s:2:"Τ";s:4:"ð›¶";s:2:"Î¥";s:4:"ð›·";s:2:"Φ";s:4:"ð›¸";s:2:"Χ";s:4:"ð›¹";s:2:"Ψ";s:4:"ð›º";s:2:"Ω";s:4:"ð›»";s:3:"∇";s:4:"ð›¼";s:2:"α";s:4:"ð›½";s:2:"β";s:4:"ð›¾";s:2:"γ";s:4:"ð›¿";s:2:"δ";s:4:"ðœ€";s:2:"ε";s:4:"ðœ";s:2:"ζ";s:4:"ðœ‚";s:2:"η";s:4:"ðœƒ";s:2:"θ";s:4:"ðœ„";s:2:"ι";s:4:"ðœ…";s:2:"κ";s:4:"ðœ†";s:2:"λ";s:4:"ðœ‡";s:2:"μ";s:4:"ðœˆ";s:2:"ν";s:4:"ðœ‰";s:2:"ξ";s:4:"ðœŠ";s:2:"ο";s:4:"ðœ‹";s:2:"Ï€";s:4:"ðœŒ";s:2:"Ï";s:4:"ðœ";s:2:"Ï‚";s:4:"ðœŽ";s:2:"σ";s:4:"ðœ";s:2:"Ï„";s:4:"ðœ";s:2:"Ï…";s:4:"ðœ‘";s:2:"φ";s:4:"ðœ’";s:2:"χ";s:4:"ðœ“";s:2:"ψ";s:4:"ðœ”";s:2:"ω";s:4:"ðœ•";s:3:"∂";s:4:"ðœ–";s:2:"ε";s:4:"ðœ—";s:2:"θ";s:4:"ðœ˜";s:2:"κ";s:4:"ðœ™";s:2:"φ";s:4:"ðœš";s:2:"Ï";s:4:"ðœ›";s:2:"Ï€";s:4:"ðœœ";s:2:"Α";s:4:"ðœ";s:2:"Î’";s:4:"ðœž";s:2:"Γ";s:4:"ðœŸ";s:2:"Δ";s:4:"ðœ ";s:2:"Ε";s:4:"ðœ¡";s:2:"Ζ";s:4:"ðœ¢";s:2:"Η";s:4:"ðœ£";s:2:"Θ";s:4:"ðœ¤";s:2:"Ι";s:4:"ðœ¥";s:2:"Κ";s:4:"ðœ¦";s:2:"Λ";s:4:"ðœ§";s:2:"Îœ";s:4:"ðœ¨";s:2:"Î";s:4:"ðœ©";s:2:"Ξ";s:4:"ðœª";s:2:"Ο";s:4:"ðœ«";s:2:"Π";s:4:"ðœ¬";s:2:"Ρ";s:4:"ðœ­";s:2:"Θ";s:4:"ðœ®";s:2:"Σ";s:4:"ðœ¯";s:2:"Τ";s:4:"ðœ°";s:2:"Î¥";s:4:"ðœ±";s:2:"Φ";s:4:"ðœ²";s:2:"Χ";s:4:"ðœ³";s:2:"Ψ";s:4:"ðœ´";s:2:"Ω";s:4:"ðœµ";s:3:"∇";s:4:"ðœ¶";s:2:"α";s:4:"ðœ·";s:2:"β";s:4:"ðœ¸";s:2:"γ";s:4:"ðœ¹";s:2:"δ";s:4:"ðœº";s:2:"ε";s:4:"ðœ»";s:2:"ζ";s:4:"ðœ¼";s:2:"η";s:4:"ðœ½";s:2:"θ";s:4:"ðœ¾";s:2:"ι";s:4:"ðœ¿";s:2:"κ";s:4:"ð€";s:2:"λ";s:4:"ð";s:2:"μ";s:4:"ð‚";s:2:"ν";s:4:"ðƒ";s:2:"ξ";s:4:"ð„";s:2:"ο";s:4:"ð…";s:2:"Ï€";s:4:"ð†";s:2:"Ï";s:4:"ð‡";s:2:"Ï‚";s:4:"ðˆ";s:2:"σ";s:4:"ð‰";s:2:"Ï„";s:4:"ðŠ";s:2:"Ï…";s:4:"ð‹";s:2:"φ";s:4:"ðŒ";s:2:"χ";s:4:"ð";s:2:"ψ";s:4:"ðŽ";s:2:"ω";s:4:"ð";s:3:"∂";s:4:"ð";s:2:"ε";s:4:"ð‘";s:2:"θ";s:4:"ð’";s:2:"κ";s:4:"ð“";s:2:"φ";s:4:"ð”";s:2:"Ï";s:4:"ð•";s:2:"Ï€";s:4:"ð–";s:2:"Α";s:4:"ð—";s:2:"Î’";s:4:"ð˜";s:2:"Γ";s:4:"ð™";s:2:"Δ";s:4:"ðš";s:2:"Ε";s:4:"ð›";s:2:"Ζ";s:4:"ðœ";s:2:"Η";s:4:"ð";s:2:"Θ";s:4:"ðž";s:2:"Ι";s:4:"ðŸ";s:2:"Κ";s:4:"ð ";s:2:"Λ";s:4:"ð¡";s:2:"Îœ";s:4:"ð¢";s:2:"Î";s:4:"ð£";s:2:"Ξ";s:4:"ð¤";s:2:"Ο";s:4:"ð¥";s:2:"Π";s:4:"ð¦";s:2:"Ρ";s:4:"ð§";s:2:"Θ";s:4:"ð¨";s:2:"Σ";s:4:"ð©";s:2:"Τ";s:4:"ðª";s:2:"Î¥";s:4:"ð«";s:2:"Φ";s:4:"ð¬";s:2:"Χ";s:4:"ð­";s:2:"Ψ";s:4:"ð®";s:2:"Ω";s:4:"ð¯";s:3:"∇";s:4:"ð°";s:2:"α";s:4:"ð±";s:2:"β";s:4:"ð²";s:2:"γ";s:4:"ð³";s:2:"δ";s:4:"ð´";s:2:"ε";s:4:"ðµ";s:2:"ζ";s:4:"ð¶";s:2:"η";s:4:"ð·";s:2:"θ";s:4:"ð¸";s:2:"ι";s:4:"ð¹";s:2:"κ";s:4:"ðº";s:2:"λ";s:4:"ð»";s:2:"μ";s:4:"ð¼";s:2:"ν";s:4:"ð½";s:2:"ξ";s:4:"ð¾";s:2:"ο";s:4:"ð¿";s:2:"Ï€";s:4:"ðž€";s:2:"Ï";s:4:"ðž";s:2:"Ï‚";s:4:"ðž‚";s:2:"σ";s:4:"ðžƒ";s:2:"Ï„";s:4:"ðž„";s:2:"Ï…";s:4:"ðž…";s:2:"φ";s:4:"ðž†";s:2:"χ";s:4:"ðž‡";s:2:"ψ";s:4:"ðžˆ";s:2:"ω";s:4:"ðž‰";s:3:"∂";s:4:"ðžŠ";s:2:"ε";s:4:"ðž‹";s:2:"θ";s:4:"ðžŒ";s:2:"κ";s:4:"ðž";s:2:"φ";s:4:"ðžŽ";s:2:"Ï";s:4:"ðž";s:2:"Ï€";s:4:"ðž";s:2:"Α";s:4:"ðž‘";s:2:"Î’";s:4:"ðž’";s:2:"Γ";s:4:"ðž“";s:2:"Δ";s:4:"ðž”";s:2:"Ε";s:4:"ðž•";s:2:"Ζ";s:4:"ðž–";s:2:"Η";s:4:"ðž—";s:2:"Θ";s:4:"ðž˜";s:2:"Ι";s:4:"ðž™";s:2:"Κ";s:4:"ðžš";s:2:"Λ";s:4:"ðž›";s:2:"Îœ";s:4:"ðžœ";s:2:"Î";s:4:"ðž";s:2:"Ξ";s:4:"ðžž";s:2:"Ο";s:4:"ðžŸ";s:2:"Π";s:4:"ðž ";s:2:"Ρ";s:4:"ðž¡";s:2:"Θ";s:4:"ðž¢";s:2:"Σ";s:4:"ðž£";s:2:"Τ";s:4:"ðž¤";s:2:"Î¥";s:4:"ðž¥";s:2:"Φ";s:4:"ðž¦";s:2:"Χ";s:4:"ðž§";s:2:"Ψ";s:4:"ðž¨";s:2:"Ω";s:4:"ðž©";s:3:"∇";s:4:"ðžª";s:2:"α";s:4:"ðž«";s:2:"β";s:4:"ðž¬";s:2:"γ";s:4:"ðž­";s:2:"δ";s:4:"ðž®";s:2:"ε";s:4:"ðž¯";s:2:"ζ";s:4:"ðž°";s:2:"η";s:4:"ðž±";s:2:"θ";s:4:"ðž²";s:2:"ι";s:4:"ðž³";s:2:"κ";s:4:"ðž´";s:2:"λ";s:4:"ðžµ";s:2:"μ";s:4:"ðž¶";s:2:"ν";s:4:"ðž·";s:2:"ξ";s:4:"ðž¸";s:2:"ο";s:4:"ðž¹";s:2:"Ï€";s:4:"ðžº";s:2:"Ï";s:4:"ðž»";s:2:"Ï‚";s:4:"ðž¼";s:2:"σ";s:4:"ðž½";s:2:"Ï„";s:4:"ðž¾";s:2:"Ï…";s:4:"ðž¿";s:2:"φ";s:4:"ðŸ€";s:2:"χ";s:4:"ðŸ";s:2:"ψ";s:4:"ðŸ‚";s:2:"ω";s:4:"ðŸƒ";s:3:"∂";s:4:"ðŸ„";s:2:"ε";s:4:"ðŸ…";s:2:"θ";s:4:"ðŸ†";s:2:"κ";s:4:"ðŸ‡";s:2:"φ";s:4:"ðŸˆ";s:2:"Ï";s:4:"ðŸ‰";s:2:"Ï€";s:4:"ðŸŠ";s:2:"Ïœ";s:4:"ðŸ‹";s:2:"Ï";s:4:"ðŸŽ";s:1:"0";s:4:"ðŸ";s:1:"1";s:4:"ðŸ";s:1:"2";s:4:"ðŸ‘";s:1:"3";s:4:"ðŸ’";s:1:"4";s:4:"ðŸ“";s:1:"5";s:4:"ðŸ”";s:1:"6";s:4:"ðŸ•";s:1:"7";s:4:"ðŸ–";s:1:"8";s:4:"ðŸ—";s:1:"9";s:4:"ðŸ˜";s:1:"0";s:4:"ðŸ™";s:1:"1";s:4:"ðŸš";s:1:"2";s:4:"ðŸ›";s:1:"3";s:4:"ðŸœ";s:1:"4";s:4:"ðŸ";s:1:"5";s:4:"ðŸž";s:1:"6";s:4:"ðŸŸ";s:1:"7";s:4:"ðŸ ";s:1:"8";s:4:"ðŸ¡";s:1:"9";s:4:"ðŸ¢";s:1:"0";s:4:"ðŸ£";s:1:"1";s:4:"ðŸ¤";s:1:"2";s:4:"ðŸ¥";s:1:"3";s:4:"ðŸ¦";s:1:"4";s:4:"ðŸ§";s:1:"5";s:4:"ðŸ¨";s:1:"6";s:4:"ðŸ©";s:1:"7";s:4:"ðŸª";s:1:"8";s:4:"ðŸ«";s:1:"9";s:4:"ðŸ¬";s:1:"0";s:4:"ðŸ­";s:1:"1";s:4:"ðŸ®";s:1:"2";s:4:"ðŸ¯";s:1:"3";s:4:"ðŸ°";s:1:"4";s:4:"ðŸ±";s:1:"5";s:4:"ðŸ²";s:1:"6";s:4:"ðŸ³";s:1:"7";s:4:"ðŸ´";s:1:"8";s:4:"ðŸµ";s:1:"9";s:4:"ðŸ¶";s:1:"0";s:4:"ðŸ·";s:1:"1";s:4:"ðŸ¸";s:1:"2";s:4:"ðŸ¹";s:1:"3";s:4:"ðŸº";s:1:"4";s:4:"ðŸ»";s:1:"5";s:4:"ðŸ¼";s:1:"6";s:4:"ðŸ½";s:1:"7";s:4:"ðŸ¾";s:1:"8";s:4:"ðŸ¿";s:1:"9";s:4:"🄀";s:2:"0.";s:4:"ðŸ„";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"ðŸ„";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"ðŸ„";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄱";s:1:"B";s:4:"🄽";s:1:"N";s:4:"🄿";s:1:"P";s:4:"🅂";s:1:"S";s:4:"🅆";s:1:"W";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"ðŸ…";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"ðŸ†";s:2:"DJ";s:4:"🈀";s:6:"ã»ã‹";s:4:"ðŸˆ";s:3:"手";s:4:"🈑";s:3:"å­—";s:4:"🈒";s:3:"åŒ";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"ç„¡";s:4:"🈛";s:3:"æ–™";s:4:"🈜";s:3:"å‰";s:4:"ðŸˆ";s:3:"後";s:4:"🈞";s:3:"å†";s:4:"🈟";s:3:"æ–°";s:4:"🈠";s:3:"åˆ";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"å¹";s:4:"🈦";s:3:"æ¼”";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"æ•";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"éŠ";s:4:"🈬";s:3:"å·¦";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"å³";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"èµ°";s:4:"🈱";s:3:"打";s:4:"🉀";s:9:"〔本〕";s:4:"ðŸ‰";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔å‹ã€•";s:4:"🉈";s:9:"〔敗〕";s:4:"丽";s:3:"丽";s:4:"ð¯ ";s:3:"丸";s:4:"乁";s:3:"ä¹";s:4:"𠄢";s:4:"ð „¢";s:4:"你";s:3:"ä½ ";s:4:"侮";s:3:"ä¾®";s:4:"侻";s:3:"ä¾»";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"åº";s:4:"備";s:3:"å‚™";s:4:"僧";s:3:"僧";s:4:"像";s:3:"åƒ";s:4:"㒞";s:3:"ã’ž";s:4:"ð¯ ";s:4:"𠘺";s:4:"免";s:3:"å…";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"具";s:3:"å…·";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"ã’¹";s:4:"內";s:3:"å…§";s:4:"再";s:3:"å†";s:4:"𠕋";s:4:"ð •‹";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"ð¯ ";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"ã“Ÿ";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"å‰";s:4:"卑";s:3:"å‘";s:4:"博";s:3:"åš";s:4:"即";s:3:"å³";s:4:"卽";s:3:"å½";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"ç°";s:4:"及";s:3:"åŠ";s:4:"叟";s:3:"åŸ";s:4:"𠭣";s:4:"ð ­£";s:4:"叫";s:3:"å«";s:4:"叱";s:3:"å±";s:4:"吆";s:3:"å†";s:4:"咞";s:3:"å’ž";s:4:"吸";s:3:"å¸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"å’¢";s:4:"ð¯¡";s:3:"哶";s:4:"唐";s:3:"å”";s:4:"啓";s:3:"å•“";s:4:"啣";s:3:"å•£";s:4:"善";s:3:"å–„";s:4:"善";s:3:"å–„";s:4:"喙";s:3:"å–™";s:4:"喫";s:3:"å–«";s:4:"喳";s:3:"å–³";s:4:"嗂";s:3:"å—‚";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"ð¯¡";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"ð¯¡";s:3:"å™´";s:4:"ð¯¡";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"å ";s:4:"型";s:3:"åž‹";s:4:"堲";s:3:"å ²";s:4:"報";s:3:"å ±";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"ð¯¡";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"ã›®";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"å°†";s:4:"当";s:3:"当";s:4:"尢";s:3:"å°¢";s:4:"㞁";s:3:"ãž";s:4:"屠";s:3:"å± ";s:4:"屮";s:3:"å±®";s:4:"峀";s:3:"å³€";s:4:"岍";s:3:"å²";s:4:"𡷤";s:4:"ð¡·¤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"ð¡·¦";s:4:"嵮";s:3:"åµ®";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"åµ¼";s:4:"ð¯¢";s:3:"å·¡";s:4:"巢";s:3:"å·¢";s:4:"㠯";s:3:"ã ¯";s:4:"巽";s:3:"å·½";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"ã¡¢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"ð¯¢";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"èˆ";s:4:"弢";s:3:"å¼¢";s:4:"弢";s:3:"å¼¢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"å½¢";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"ð¯¢";s:3:"å¿";s:4:"志";s:3:"å¿—";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"æ‚";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"æ‚”";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"æ…ˆ";s:4:"慌";s:3:"æ…Œ";s:4:"慎";s:3:"æ…Ž";s:4:"慌";s:3:"æ…Œ";s:4:"慺";s:3:"æ…º";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"æˆ";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"æ‰";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"æ‹”";s:4:"捐";s:3:"æ";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"æ¨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"æ¤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"æ¢";s:4:"揅";s:3:"æ…";s:4:"ð¯£";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"æ‘©";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"æ’";s:4:"摷";s:3:"æ‘·";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"æ•";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"æ—£";s:4:"書";s:3:"書";s:4:"ð¯£";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"ð¯£";s:3:"æš‘";s:4:"ð¯£";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"æšœ";s:4:"肭";s:3:"è‚­";s:4:"䏙";s:3:"ä™";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"æž";s:4:"杓";s:3:"æ“";s:4:"ð¯£";s:4:"ð£ƒ";s:4:"㭉";s:3:"ã­‰";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"æž…";s:4:"桒";s:3:"æ¡’";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"æ Ÿ";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"ã®";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"æ«›";s:4:"㰘";s:3:"ã°˜";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"æ­”";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"æ­²";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"æ®»";s:4:"𣪍";s:4:"ð£ª";s:4:"𡴋";s:4:"ð¡´‹";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"æ³";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"æ´–";s:4:"派";s:3:"æ´¾";s:4:"ð¯¤";s:3:"æµ·";s:4:"流";s:3:"æµ";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"æ´´";s:4:"港";s:3:"港";s:4:"湮";s:3:"æ¹®";s:4:"㴳";s:3:"ã´³";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"ð¯¤";s:4:"𣻑";s:4:"淹";s:3:"æ·¹";s:4:"ð¯¤";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"çŠ";s:4:"災";s:3:"ç½";s:4:"灷";s:3:"ç·";s:4:"炭";s:3:"ç‚­";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"ç……";s:4:"ð¯¤";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"ç‰";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"çº";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"ç‘œ";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"ç’…";s:4:"瓊";s:3:"ç“Š";s:4:"㼛";s:3:"ã¼›";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"ç•°";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"ç˜";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"ð¥„";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"ç›´";s:4:"ð¯¥";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"çŠ";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"çž‹";s:4:"䁆";s:3:"ä†";s:4:"䂖";s:3:"ä‚–";s:4:"ð¯¥";s:4:"ð¥";s:4:"硎";s:3:"ç¡Ž";s:4:"ð¯¥";s:3:"碌";s:4:"ð¯¥";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"ç¦";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"ç©€";s:4:"穊";s:3:"ç©Š";s:4:"穏";s:3:"ç©";s:4:"𥥼";s:4:"𥥼";s:4:"ð¯¥";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"ç«®";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"ç³’";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"ç³£";s:4:"紀";s:3:"ç´€";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"çµ£";s:4:"䌁";s:3:"äŒ";s:4:"緇";s:3:"ç·‡";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"ç¹…";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"ä™";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"è ";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"è°";s:4:"𣍟";s:4:"ð£Ÿ";s:4:"ð¯¦";s:3:"ä•";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"ä‹";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"èˆ";s:4:"舄";s:3:"舄";s:4:"ð¯¦";s:3:"辞";s:4:"䑫";s:3:"ä‘«";s:4:"ð¯¦";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"芝";s:3:"èŠ";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"è‹¥";s:4:"茝";s:3:"èŒ";s:4:"荣";s:3:"è£";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"ð¯¦";s:3:"莽";s:4:"菧";s:3:"è§";s:4:"著";s:3:"è‘—";s:4:"荓";s:3:"è“";s:4:"菊";s:3:"èŠ";s:4:"菌";s:3:"èŒ";s:4:"菜";s:3:"èœ";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"è”–";s:4:"𧏊";s:4:"ð§Š";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"ä•";s:4:"䕡";s:3:"ä•¡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"ä•«";s:4:"虐";s:3:"è™";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"èš©";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"è¹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"è«";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"ä——";s:4:"蟡";s:3:"蟡";s:4:"ð¯§";s:3:"è ";s:4:"䗹";s:3:"ä—¹";s:4:"衠";s:3:"è¡ ";s:4:"衣";s:3:"è¡£";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"ã’»";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"ð¯§";s:3:"äš¾";s:4:"䛇";s:3:"䛇";s:4:"ð¯§";s:3:"誠";s:4:"ð¯§";s:3:"è«­";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"è³";s:4:"贛";s:3:"è´›";s:4:"起";s:3:"èµ·";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"ð  „";s:4:"跋";s:3:"è·‹";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"è·°";s:4:"ð¯§";s:4:"𠣞";s:4:"軔";s:3:"è»”";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"é‚”";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"é„‘";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"é„›";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"é‹—";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"é¹";s:4:"鐕";s:3:"é•";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"é–‹";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"é–·";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"ð©……";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"ä©®";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"ð©Š";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"ð©’–";s:4:"頋";s:3:"é ‹";s:4:"頋";s:3:"é ‹";s:4:"頩";s:3:"é ©";s:4:"ð¯¨";s:4:"ð©–¶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"é±€";s:4:"鳽";s:3:"é³½";s:4:"ð¯¨";s:3:"䳎";s:4:"䳭";s:3:"ä³­";s:4:"ð¯¨";s:3:"鵧";s:4:"ð¯¨";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"äµ–";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"é¼…";s:4:"鼏";s:3:"é¼";s:4:"鼖";s:3:"é¼–";s:4:"鼻";s:3:"é¼»";s:4:"ð¯¨";s:4:"𪘀";}' );
+
+UtfNormal::$utfCompatibilityDecomp = unserialize( 'a:5405:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" Ì„";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" Ì";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1â„4";s:2:"½";s:5:"1â„2";s:2:"¾";s:5:"3â„4";s:2:"À";s:3:"AÌ€";s:2:"Ã";s:3:"AÌ";s:2:"Â";s:3:"AÌ‚";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Ã…";s:3:"AÌŠ";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"EÌ€";s:2:"É";s:3:"EÌ";s:2:"Ê";s:3:"EÌ‚";s:2:"Ë";s:3:"Ë";s:2:"ÃŒ";s:3:"IÌ€";s:2:"Ã";s:3:"IÌ";s:2:"ÃŽ";s:3:"IÌ‚";s:2:"Ã";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ã’";s:3:"OÌ€";s:2:"Ó";s:3:"OÌ";s:2:"Ô";s:3:"OÌ‚";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"UÌ€";s:2:"Ú";s:3:"UÌ";s:2:"Û";s:3:"UÌ‚";s:2:"Ãœ";s:3:"Ü";s:2:"Ã";s:3:"YÌ";s:2:"à";s:3:"aÌ€";s:2:"á";s:3:"aÌ";s:2:"â";s:3:"aÌ‚";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"Ã¥";s:3:"aÌŠ";s:2:"ç";s:3:"ç";s:2:"è";s:3:"eÌ€";s:2:"é";s:3:"eÌ";s:2:"ê";s:3:"eÌ‚";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"iÌ€";s:2:"í";s:3:"iÌ";s:2:"î";s:3:"iÌ‚";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"oÌ€";s:2:"ó";s:3:"oÌ";s:2:"ô";s:3:"oÌ‚";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"uÌ€";s:2:"ú";s:3:"uÌ";s:2:"û";s:3:"uÌ‚";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"yÌ";s:2:"ÿ";s:3:"ÿ";s:2:"Ä€";s:3:"AÌ„";s:2:"Ä";s:3:"aÌ„";s:2:"Ä‚";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ä„";s:3:"Ą";s:2:"Ä…";s:3:"ą";s:2:"Ć";s:3:"CÌ";s:2:"ć";s:3:"cÌ";s:2:"Ĉ";s:3:"CÌ‚";s:2:"ĉ";s:3:"cÌ‚";s:2:"ÄŠ";s:3:"Ċ";s:2:"Ä‹";s:3:"ċ";s:2:"ÄŒ";s:3:"CÌŒ";s:2:"Ä";s:3:"cÌŒ";s:2:"ÄŽ";s:3:"DÌŒ";s:2:"Ä";s:3:"dÌŒ";s:2:"Ä’";s:3:"EÌ„";s:2:"Ä“";s:3:"eÌ„";s:2:"Ä”";s:3:"Ĕ";s:2:"Ä•";s:3:"ĕ";s:2:"Ä–";s:3:"Ė";s:2:"Ä—";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"Ä™";s:3:"ę";s:2:"Äš";s:3:"EÌŒ";s:2:"Ä›";s:3:"eÌŒ";s:2:"Äœ";s:3:"GÌ‚";s:2:"Ä";s:3:"gÌ‚";s:2:"Äž";s:3:"Ğ";s:2:"ÄŸ";s:3:"ğ";s:2:"Ä ";s:3:"Ġ";s:2:"Ä¡";s:3:"ġ";s:2:"Ä¢";s:3:"Ģ";s:2:"Ä£";s:3:"ģ";s:2:"Ĥ";s:3:"HÌ‚";s:2:"Ä¥";s:3:"hÌ‚";s:2:"Ĩ";s:3:"Ĩ";s:2:"Ä©";s:3:"ĩ";s:2:"Ī";s:3:"IÌ„";s:2:"Ä«";s:3:"iÌ„";s:2:"Ĭ";s:3:"Ĭ";s:2:"Ä­";s:3:"ĭ";s:2:"Ä®";s:3:"Į";s:2:"į";s:3:"į";s:2:"Ä°";s:3:"İ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ä´";s:3:"JÌ‚";s:2:"ĵ";s:3:"jÌ‚";s:2:"Ķ";s:3:"Ķ";s:2:"Ä·";s:3:"ķ";s:2:"Ĺ";s:3:"LÌ";s:2:"ĺ";s:3:"lÌ";s:2:"Ä»";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"LÌŒ";s:2:"ľ";s:3:"lÌŒ";s:2:"Ä¿";s:3:"L·";s:2:"Å€";s:3:"l·";s:2:"Ń";s:3:"NÌ";s:2:"Å„";s:3:"nÌ";s:2:"Å…";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"NÌŒ";s:2:"ň";s:3:"nÌŒ";s:2:"ʼn";s:3:"ʼn";s:2:"ÅŒ";s:3:"OÌ„";s:2:"Å";s:3:"oÌ„";s:2:"ÅŽ";s:3:"Ŏ";s:2:"Å";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å‘";s:3:"oÌ‹";s:2:"Å”";s:3:"RÌ";s:2:"Å•";s:3:"rÌ";s:2:"Å–";s:3:"Ŗ";s:2:"Å—";s:3:"ŗ";s:2:"Ř";s:3:"RÌŒ";s:2:"Å™";s:3:"rÌŒ";s:2:"Åš";s:3:"SÌ";s:2:"Å›";s:3:"sÌ";s:2:"Åœ";s:3:"SÌ‚";s:2:"Å";s:3:"sÌ‚";s:2:"Åž";s:3:"Ş";s:2:"ÅŸ";s:3:"ş";s:2:"Å ";s:3:"SÌŒ";s:2:"Å¡";s:3:"sÌŒ";s:2:"Å¢";s:3:"Ţ";s:2:"Å£";s:3:"ţ";s:2:"Ť";s:3:"TÌŒ";s:2:"Å¥";s:3:"tÌŒ";s:2:"Ũ";s:3:"Ũ";s:2:"Å©";s:3:"ũ";s:2:"Ū";s:3:"UÌ„";s:2:"Å«";s:3:"uÌ„";s:2:"Ŭ";s:3:"Ŭ";s:2:"Å­";s:3:"ŭ";s:2:"Å®";s:3:"UÌŠ";s:2:"ů";s:3:"uÌŠ";s:2:"Å°";s:3:"UÌ‹";s:2:"ű";s:3:"uÌ‹";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Å´";s:3:"WÌ‚";s:2:"ŵ";s:3:"wÌ‚";s:2:"Ŷ";s:3:"YÌ‚";s:2:"Å·";s:3:"yÌ‚";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"ZÌ";s:2:"ź";s:3:"zÌ";s:2:"Å»";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"ZÌŒ";s:2:"ž";s:3:"zÌŒ";s:2:"Å¿";s:1:"s";s:2:"Æ ";s:3:"OÌ›";s:2:"Æ¡";s:3:"oÌ›";s:2:"Ư";s:3:"UÌ›";s:2:"Æ°";s:3:"uÌ›";s:2:"Ç„";s:4:"DZÌŒ";s:2:"Ç…";s:4:"DzÌŒ";s:2:"dž";s:4:"dzÌŒ";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"ÇŠ";s:2:"NJ";s:2:"Ç‹";s:2:"Nj";s:2:"ÇŒ";s:2:"nj";s:2:"Ç";s:3:"AÌŒ";s:2:"ÇŽ";s:3:"aÌŒ";s:2:"Ç";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç‘";s:3:"OÌŒ";s:2:"Ç’";s:3:"oÌŒ";s:2:"Ç“";s:3:"UÌŒ";s:2:"Ç”";s:3:"uÌŒ";s:2:"Ç•";s:5:"Ǖ";s:2:"Ç–";s:5:"ǖ";s:2:"Ç—";s:5:"ÜÌ";s:2:"ǘ";s:5:"üÌ";s:2:"Ç™";s:5:"Ǚ";s:2:"Çš";s:5:"ǚ";s:2:"Ç›";s:5:"Ǜ";s:2:"Çœ";s:5:"ǜ";s:2:"Çž";s:5:"Ǟ";s:2:"ÇŸ";s:5:"ǟ";s:2:"Ç ";s:5:"Ǡ";s:2:"Ç¡";s:5:"ǡ";s:2:"Ç¢";s:4:"Ǣ";s:2:"Ç£";s:4:"ǣ";s:2:"Ǧ";s:3:"GÌŒ";s:2:"ǧ";s:3:"gÌŒ";s:2:"Ǩ";s:3:"KÌŒ";s:2:"Ç©";s:3:"kÌŒ";s:2:"Ǫ";s:3:"Ǫ";s:2:"Ç«";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"Ç­";s:5:"ǭ";s:2:"Ç®";s:4:"Æ·ÌŒ";s:2:"ǯ";s:4:"Ê’ÌŒ";s:2:"Ç°";s:3:"jÌŒ";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ç´";s:3:"GÌ";s:2:"ǵ";s:3:"gÌ";s:2:"Ǹ";s:3:"NÌ€";s:2:"ǹ";s:3:"nÌ€";s:2:"Ǻ";s:5:"AÌŠÌ";s:2:"Ç»";s:5:"aÌŠÌ";s:2:"Ǽ";s:4:"ÆÌ";s:2:"ǽ";s:4:"æÌ";s:2:"Ǿ";s:4:"ØÌ";s:2:"Ç¿";s:4:"øÌ";s:2:"È€";s:3:"AÌ";s:2:"È";s:3:"aÌ";s:2:"È‚";s:3:"AÌ‘";s:2:"ȃ";s:3:"aÌ‘";s:2:"È„";s:3:"EÌ";s:2:"È…";s:3:"eÌ";s:2:"Ȇ";s:3:"EÌ‘";s:2:"ȇ";s:3:"eÌ‘";s:2:"Ȉ";s:3:"IÌ";s:2:"ȉ";s:3:"iÌ";s:2:"ÈŠ";s:3:"IÌ‘";s:2:"È‹";s:3:"iÌ‘";s:2:"ÈŒ";s:3:"OÌ";s:2:"È";s:3:"oÌ";s:2:"ÈŽ";s:3:"OÌ‘";s:2:"È";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È‘";s:3:"rÌ";s:2:"È’";s:3:"RÌ‘";s:2:"È“";s:3:"rÌ‘";s:2:"È”";s:3:"UÌ";s:2:"È•";s:3:"uÌ";s:2:"È–";s:3:"UÌ‘";s:2:"È—";s:3:"uÌ‘";s:2:"Ș";s:3:"Ș";s:2:"È™";s:3:"ș";s:2:"Èš";s:3:"Ț";s:2:"È›";s:3:"ț";s:2:"Èž";s:3:"HÌŒ";s:2:"ÈŸ";s:3:"hÌŒ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"È©";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"È«";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"È­";s:5:"ȭ";s:2:"È®";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"È°";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"YÌ„";s:2:"ȳ";s:3:"yÌ„";s:2:"Ê°";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"Ê´";s:2:"ɹ";s:2:"ʵ";s:2:"É»";s:2:"ʶ";s:2:"Ê";s:2:"Ê·";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"Ë™";s:3:" ̇";s:2:"Ëš";s:3:" ÌŠ";s:2:"Ë›";s:3:" ̨";s:2:"Ëœ";s:3:" ̃";s:2:"Ë";s:3:" Ì‹";s:2:"Ë ";s:2:"É£";s:2:"Ë¡";s:1:"l";s:2:"Ë¢";s:1:"s";s:2:"Ë£";s:1:"x";s:2:"ˤ";s:2:"Ê•";s:2:"Í€";s:2:"Ì€";s:2:"Í";s:2:"Ì";s:2:"̓";s:2:"Ì“";s:2:"Í„";s:4:"̈Ì";s:2:"Í´";s:2:"ʹ";s:2:"ͺ";s:3:" Í…";s:2:";";s:1:";";s:2:"΄";s:3:" Ì";s:2:"Î…";s:5:" ̈Ì";s:2:"Ά";s:4:"ΑÌ";s:2:"·";s:2:"·";s:2:"Έ";s:4:"ΕÌ";s:2:"Ή";s:4:"ΗÌ";s:2:"Ί";s:4:"ΙÌ";s:2:"ÎŒ";s:4:"ΟÌ";s:2:"ÎŽ";s:4:"Î¥Ì";s:2:"Î";s:4:"ΩÌ";s:2:"Î";s:6:"ϊÌ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"αÌ";s:2:"έ";s:4:"εÌ";s:2:"ή";s:4:"ηÌ";s:2:"ί";s:4:"ιÌ";s:2:"ΰ";s:6:"ϋÌ";s:2:"ÏŠ";s:4:"ϊ";s:2:"Ï‹";s:4:"ϋ";s:2:"ÏŒ";s:4:"οÌ";s:2:"Ï";s:4:"Ï…Ì";s:2:"ÏŽ";s:4:"ωÌ";s:2:"Ï";s:2:"β";s:2:"Ï‘";s:2:"θ";s:2:"Ï’";s:2:"Î¥";s:2:"Ï“";s:4:"Î¥Ì";s:2:"Ï”";s:4:"Ϋ";s:2:"Ï•";s:2:"φ";s:2:"Ï–";s:2:"Ï€";s:2:"Ï°";s:2:"κ";s:2:"ϱ";s:2:"Ï";s:2:"ϲ";s:2:"Ï‚";s:2:"Ï´";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ð";s:4:"Ё";s:2:"Ѓ";s:4:"ГÌ";s:2:"Ї";s:4:"Ї";s:2:"ÐŒ";s:4:"КÌ";s:2:"Ð";s:4:"Ѝ";s:2:"ÐŽ";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"Ñ";s:4:"ѐ";s:2:"Ñ‘";s:4:"ё";s:2:"Ñ“";s:4:"гÌ";s:2:"Ñ—";s:4:"ї";s:2:"Ñœ";s:4:"кÌ";s:2:"Ñ";s:4:"ѝ";s:2:"Ñž";s:4:"ў";s:2:"Ѷ";s:4:"Ñ´Ì";s:2:"Ñ·";s:4:"ѵÌ";s:2:"Ó";s:4:"Ӂ";s:2:"Ó‚";s:4:"ӂ";s:2:"Ó";s:4:"Ð̆";s:2:"Ó‘";s:4:"ӑ";s:2:"Ó’";s:4:"Ð̈";s:2:"Ó“";s:4:"ӓ";s:2:"Ó–";s:4:"Ӗ";s:2:"Ó—";s:4:"ӗ";s:2:"Óš";s:4:"Ӛ";s:2:"Ó›";s:4:"ӛ";s:2:"Óœ";s:4:"Ӝ";s:2:"Ó";s:4:"ӝ";s:2:"Óž";s:4:"Ӟ";s:2:"ÓŸ";s:4:"ӟ";s:2:"Ó¢";s:4:"Ӣ";s:2:"Ó£";s:4:"ӣ";s:2:"Ó¤";s:4:"Ӥ";s:2:"Ó¥";s:4:"ӥ";s:2:"Ó¦";s:4:"Ӧ";s:2:"Ó§";s:4:"ӧ";s:2:"Óª";s:4:"Ӫ";s:2:"Ó«";s:4:"ӫ";s:2:"Ó¬";s:4:"Ӭ";s:2:"Ó­";s:4:"Ñ̈";s:2:"Ó®";s:4:"Ӯ";s:2:"Ó¯";s:4:"ӯ";s:2:"Ó°";s:4:"Ӱ";s:2:"Ó±";s:4:"ӱ";s:2:"Ó²";s:4:"Ӳ";s:2:"Ó³";s:4:"ӳ";s:2:"Ó´";s:4:"Ӵ";s:2:"Óµ";s:4:"ӵ";s:2:"Ó¸";s:4:"Ӹ";s:2:"Ó¹";s:4:"ӹ";s:2:"Ö‡";s:4:"Õ¥Ö‚";s:2:"Ø¢";s:4:"آ";s:2:"Ø£";s:4:"أ";s:2:"ؤ";s:4:"ÙˆÙ”";s:2:"Ø¥";s:4:"إ";s:2:"ئ";s:4:"ÙŠÙ”";s:2:"Ùµ";s:4:"اٴ";s:2:"Ù¶";s:4:"وٴ";s:2:"Ù·";s:4:"Û‡Ù´";s:2:"Ù¸";s:4:"يٴ";s:2:"Û€";s:4:"Û•Ù”";s:2:"Û‚";s:4:"ÛÙ”";s:2:"Û“";s:4:"Û’Ù”";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"à¥";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"à§";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"à©™";s:6:"ਖ਼";s:3:"à©š";s:6:"ਗ਼";s:3:"à©›";s:6:"ਜ਼";s:3:"à©ž";s:6:"ਫ਼";s:3:"à­ˆ";s:6:"ୈ";s:3:"à­‹";s:6:"ୋ";s:3:"à­Œ";s:6:"ୌ";s:3:"à­œ";s:6:"ଡ଼";s:3:"à­";s:6:"ଢ଼";s:3:"à®”";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"à³€";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"à·š";s:6:"ේ";s:3:"à·œ";s:6:"à·™à·";s:3:"à·";s:9:"à·™à·à·Š";s:3:"à·ž";s:6:"ෞ";s:3:"ำ";s:6:"à¹à¸²";s:3:"ຳ";s:6:"à»àº²";s:3:"ໜ";s:6:"ຫນ";s:3:"à»";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"གྷ";s:6:"གྷ";s:3:"à½";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"à¾";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"à¾";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"à¾à¾µ";s:3:"ဦ";s:6:"ဦ";s:3:"ჼ";s:3:"ნ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"á¬á¬µ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"á­€";s:6:"ᭀ";s:3:"á­";s:6:"ᭁ";s:3:"á­ƒ";s:6:"ᭃ";s:3:"á´¬";s:1:"A";s:3:"á´­";s:2:"Æ";s:3:"á´®";s:1:"B";s:3:"á´°";s:1:"D";s:3:"á´±";s:1:"E";s:3:"á´²";s:2:"ÆŽ";s:3:"á´³";s:1:"G";s:3:"á´´";s:1:"H";s:3:"á´µ";s:1:"I";s:3:"á´¶";s:1:"J";s:3:"á´·";s:1:"K";s:3:"á´¸";s:1:"L";s:3:"á´¹";s:1:"M";s:3:"á´º";s:1:"N";s:3:"á´¼";s:1:"O";s:3:"á´½";s:2:"È¢";s:3:"á´¾";s:1:"P";s:3:"á´¿";s:1:"R";s:3:"áµ€";s:1:"T";s:3:"áµ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"É";s:3:"áµ…";s:2:"É‘";s:3:"ᵆ";s:3:"á´‚";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"É™";s:3:"ᵋ";s:2:"É›";s:3:"ᵌ";s:2:"Éœ";s:3:"áµ";s:1:"g";s:3:"áµ";s:1:"k";s:3:"áµ";s:1:"m";s:3:"ᵑ";s:2:"Å‹";s:3:"áµ’";s:1:"o";s:3:"ᵓ";s:2:"É”";s:3:"áµ”";s:3:"á´–";s:3:"ᵕ";s:3:"á´—";s:3:"áµ–";s:1:"p";s:3:"áµ—";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"áµ™";s:3:"á´";s:3:"ᵚ";s:2:"ɯ";s:3:"áµ›";s:1:"v";s:3:"ᵜ";s:3:"á´¥";s:3:"áµ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"áµ ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"áµ¢";s:1:"i";s:3:"áµ£";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"áµ¥";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"Ï";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"É’";s:3:"ᶜ";s:1:"c";s:3:"á¶";s:2:"É•";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"Éœ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ÉŸ";s:3:"ᶢ";s:2:"É¡";s:3:"ᶣ";s:2:"É¥";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"É©";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"áµ»";s:3:"ᶨ";s:2:"Ê";s:3:"ᶩ";s:2:"É­";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ÊŸ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"É°";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"É´";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"Ê‚";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"Æ«";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ÊŠ";s:3:"ᶸ";s:3:"á´œ";s:3:"ᶹ";s:2:"Ê‹";s:3:"ᶺ";s:2:"ÊŒ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"Ê";s:3:"ᶽ";s:2:"Ê‘";s:3:"ᶾ";s:2:"Ê’";s:3:"ᶿ";s:2:"θ";s:3:"Ḁ";s:3:"AÌ¥";s:3:"á¸";s:3:"aÌ¥";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"BÌ£";s:3:"ḅ";s:3:"bÌ£";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"ÇÌ";s:3:"ḉ";s:5:"çÌ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"DÌ£";s:3:"á¸";s:3:"dÌ£";s:3:"Ḏ";s:3:"Ḏ";s:3:"á¸";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"DÌ­";s:3:"ḓ";s:3:"dÌ­";s:3:"Ḕ";s:5:"EÌ„Ì€";s:3:"ḕ";s:5:"eÌ„Ì€";s:3:"Ḗ";s:5:"EÌ„Ì";s:3:"ḗ";s:5:"eÌ„Ì";s:3:"Ḙ";s:3:"EÌ­";s:3:"ḙ";s:3:"eÌ­";s:3:"Ḛ";s:3:"EÌ°";s:3:"ḛ";s:3:"eÌ°";s:3:"Ḝ";s:5:"Ḝ";s:3:"á¸";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"GÌ„";s:3:"ḡ";s:3:"gÌ„";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"HÌ£";s:3:"ḥ";s:3:"hÌ£";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"HÌ®";s:3:"ḫ";s:3:"hÌ®";s:3:"Ḭ";s:3:"IÌ°";s:3:"ḭ";s:3:"iÌ°";s:3:"Ḯ";s:5:"ÏÌ";s:3:"ḯ";s:5:"ïÌ";s:3:"Ḱ";s:3:"KÌ";s:3:"ḱ";s:3:"kÌ";s:3:"Ḳ";s:3:"KÌ£";s:3:"ḳ";s:3:"kÌ£";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"LÌ£";s:3:"ḷ";s:3:"lÌ£";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"LÌ­";s:3:"ḽ";s:3:"lÌ­";s:3:"Ḿ";s:3:"MÌ";s:3:"ḿ";s:3:"mÌ";s:3:"á¹€";s:3:"Ṁ";s:3:"á¹";s:3:"ṁ";s:3:"Ṃ";s:3:"MÌ£";s:3:"ṃ";s:3:"mÌ£";s:3:"Ṅ";s:3:"Ṅ";s:3:"á¹…";s:3:"ṅ";s:3:"Ṇ";s:3:"NÌ£";s:3:"ṇ";s:3:"nÌ£";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"NÌ­";s:3:"ṋ";s:3:"nÌ­";s:3:"Ṍ";s:5:"ÕÌ";s:3:"á¹";s:5:"õÌ";s:3:"Ṏ";s:5:"Ṏ";s:3:"á¹";s:5:"ṏ";s:3:"á¹";s:5:"OÌ„Ì€";s:3:"ṑ";s:5:"oÌ„Ì€";s:3:"á¹’";s:5:"OÌ„Ì";s:3:"ṓ";s:5:"oÌ„Ì";s:3:"á¹”";s:3:"PÌ";s:3:"ṕ";s:3:"pÌ";s:3:"á¹–";s:3:"Ṗ";s:3:"á¹—";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"á¹™";s:3:"ṙ";s:3:"Ṛ";s:3:"RÌ£";s:3:"á¹›";s:3:"rÌ£";s:3:"Ṝ";s:5:"Ṝ";s:3:"á¹";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"á¹ ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"á¹¢";s:3:"SÌ£";s:3:"á¹£";s:3:"sÌ£";s:3:"Ṥ";s:5:"SÌ̇";s:3:"á¹¥";s:5:"sÌ̇";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"TÌ£";s:3:"á¹­";s:3:"tÌ£";s:3:"á¹®";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"á¹°";s:3:"TÌ­";s:3:"á¹±";s:3:"tÌ­";s:3:"á¹²";s:3:"Ṳ";s:3:"á¹³";s:3:"ṳ";s:3:"á¹´";s:3:"UÌ°";s:3:"á¹µ";s:3:"uÌ°";s:3:"Ṷ";s:3:"UÌ­";s:3:"á¹·";s:3:"uÌ­";s:3:"Ṹ";s:5:"ŨÌ";s:3:"á¹¹";s:5:"ũÌ";s:3:"Ṻ";s:5:"Ṻ";s:3:"á¹»";s:5:"ṻ";s:3:"á¹¼";s:3:"Ṽ";s:3:"á¹½";s:3:"ṽ";s:3:"á¹¾";s:3:"VÌ£";s:3:"ṿ";s:3:"vÌ£";s:3:"Ẁ";s:3:"WÌ€";s:3:"áº";s:3:"wÌ€";s:3:"Ẃ";s:3:"WÌ";s:3:"ẃ";s:3:"wÌ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"WÌ£";s:3:"ẉ";s:3:"wÌ£";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"áº";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"áº";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"ẑ";s:3:"zÌ‚";s:3:"Ẓ";s:3:"ZÌ£";s:3:"ẓ";s:3:"zÌ£";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"wÌŠ";s:3:"ẙ";s:3:"yÌŠ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"Ạ";s:3:"AÌ£";s:3:"ạ";s:3:"aÌ£";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"AÌ‚Ì";s:3:"ấ";s:5:"aÌ‚Ì";s:3:"Ầ";s:5:"AÌ‚Ì€";s:3:"ầ";s:5:"aÌ‚Ì€";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"ĂÌ";s:3:"ắ";s:5:"ăÌ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"EÌ£";s:3:"ẹ";s:3:"eÌ£";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"EÌ‚Ì";s:3:"ế";s:5:"eÌ‚Ì";s:3:"Ề";s:5:"EÌ‚Ì€";s:3:"á»";s:5:"eÌ‚Ì€";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"á»…";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"IÌ£";s:3:"ị";s:3:"iÌ£";s:3:"Ọ";s:3:"OÌ£";s:3:"á»";s:3:"oÌ£";s:3:"Ỏ";s:3:"Ỏ";s:3:"á»";s:3:"ỏ";s:3:"á»";s:5:"OÌ‚Ì";s:3:"ố";s:5:"oÌ‚Ì";s:3:"á»’";s:5:"OÌ‚Ì€";s:3:"ồ";s:5:"oÌ‚Ì€";s:3:"á»”";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"á»–";s:5:"Ỗ";s:3:"á»—";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"á»™";s:5:"ộ";s:3:"Ớ";s:5:"OÌ›Ì";s:3:"á»›";s:5:"oÌ›Ì";s:3:"Ờ";s:5:"Ờ";s:3:"á»";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"á» ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"UÌ£";s:3:"ụ";s:3:"uÌ£";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"UÌ›Ì";s:3:"ứ";s:5:"uÌ›Ì";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"á»­";s:5:"ử";s:3:"á»®";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"á»°";s:5:"Ự";s:3:"á»±";s:5:"ự";s:3:"Ỳ";s:3:"YÌ€";s:3:"ỳ";s:3:"yÌ€";s:3:"á»´";s:3:"YÌ£";s:3:"ỵ";s:3:"yÌ£";s:3:"Ỷ";s:3:"Ỷ";s:3:"á»·";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"á¼€";s:4:"ἀ";s:3:"á¼";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἀÌ";s:3:"á¼…";s:6:"ἁÌ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"ἈÌ";s:3:"á¼";s:6:"ἉÌ";s:3:"Ἆ";s:6:"Ἆ";s:3:"á¼";s:6:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"á¼’";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"á¼”";s:6:"ἐÌ";s:3:"ἕ";s:6:"ἑÌ";s:3:"Ἐ";s:4:"Ἐ";s:3:"á¼™";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"á¼›";s:6:"Ἓ";s:3:"Ἔ";s:6:"ἘÌ";s:3:"á¼";s:6:"ἙÌ";s:3:"á¼ ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"á¼¢";s:6:"ἢ";s:3:"á¼£";s:6:"ἣ";s:3:"ἤ";s:6:"ἠÌ";s:3:"á¼¥";s:6:"ἡÌ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"ἨÌ";s:3:"á¼­";s:6:"ἩÌ";s:3:"á¼®";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"á¼°";s:4:"ἰ";s:3:"á¼±";s:4:"ἱ";s:3:"á¼²";s:6:"ἲ";s:3:"á¼³";s:6:"ἳ";s:3:"á¼´";s:6:"ἰÌ";s:3:"á¼µ";s:6:"ἱÌ";s:3:"ἶ";s:6:"ἶ";s:3:"á¼·";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"á¼¹";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"á¼»";s:6:"Ἳ";s:3:"á¼¼";s:6:"ἸÌ";s:3:"á¼½";s:6:"ἹÌ";s:3:"á¼¾";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"á½€";s:4:"ὀ";s:3:"á½";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὀÌ";s:3:"á½…";s:6:"ὁÌ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"ὈÌ";s:3:"á½";s:6:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"ὑ";s:4:"Ï…Ì”";s:3:"á½’";s:6:"Ï…Ì“Ì€";s:3:"ὓ";s:6:"ὓ";s:3:"á½”";s:6:"Ï…Ì“Ì";s:3:"ὕ";s:6:"Ï…Ì”Ì";s:3:"á½–";s:6:"Ï…Ì“Í‚";s:3:"á½—";s:6:"ὗ";s:3:"á½™";s:4:"Ὑ";s:3:"á½›";s:6:"Ὓ";s:3:"á½";s:6:"ὙÌ";s:3:"Ὗ";s:6:"Ὗ";s:3:"á½ ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"á½¢";s:6:"ὢ";s:3:"á½£";s:6:"ὣ";s:3:"ὤ";s:6:"ὠÌ";s:3:"á½¥";s:6:"ὡÌ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"ὨÌ";s:3:"á½­";s:6:"ὩÌ";s:3:"á½®";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"á½°";s:4:"ὰ";s:3:"á½±";s:4:"αÌ";s:3:"á½²";s:4:"ὲ";s:3:"á½³";s:4:"εÌ";s:3:"á½´";s:4:"ὴ";s:3:"á½µ";s:4:"ηÌ";s:3:"ὶ";s:4:"ὶ";s:3:"á½·";s:4:"ιÌ";s:3:"ὸ";s:4:"ὸ";s:3:"á½¹";s:4:"οÌ";s:3:"ὺ";s:4:"Ï…Ì€";s:3:"á½»";s:4:"Ï…Ì";s:3:"á½¼";s:4:"ὼ";s:3:"á½½";s:4:"ωÌ";s:3:"á¾€";s:6:"ᾀ";s:3:"á¾";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ἀÌÍ…";s:3:"á¾…";s:8:"ἁÌÍ…";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ἈÌÍ…";s:3:"á¾";s:8:"ἉÌÍ…";s:3:"ᾎ";s:8:"ᾎ";s:3:"á¾";s:8:"ᾏ";s:3:"á¾";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"á¾’";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"á¾”";s:8:"ἠÌÍ…";s:3:"ᾕ";s:8:"ἡÌÍ…";s:3:"á¾–";s:8:"ᾖ";s:3:"á¾—";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"á¾™";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"á¾›";s:8:"ᾛ";s:3:"ᾜ";s:8:"ἨÌÍ…";s:3:"á¾";s:8:"ἩÌÍ…";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"á¾ ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"á¾¢";s:8:"ᾢ";s:3:"á¾£";s:8:"ᾣ";s:3:"ᾤ";s:8:"ὠÌÍ…";s:3:"á¾¥";s:8:"ὡÌÍ…";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ὨÌÍ…";s:3:"á¾­";s:8:"ὩÌÍ…";s:3:"á¾®";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"á¾°";s:4:"ᾰ";s:3:"á¾±";s:4:"ᾱ";s:3:"á¾²";s:6:"ᾲ";s:3:"á¾³";s:4:"ᾳ";s:3:"á¾´";s:6:"αÌÍ…";s:3:"ᾶ";s:4:"ᾶ";s:3:"á¾·";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"á¾¹";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"á¾»";s:4:"ΑÌ";s:3:"á¾¼";s:4:"ᾼ";s:3:"á¾½";s:3:" Ì“";s:3:"á¾¾";s:2:"ι";s:3:"᾿";s:3:" Ì“";s:3:"á¿€";s:3:" Í‚";s:3:"á¿";s:5:" ̈͂";s:3:"á¿‚";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"á¿„";s:6:"ηÌÍ…";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"ΕÌ";s:3:"á¿Š";s:4:"Ὴ";s:3:"á¿‹";s:4:"ΗÌ";s:3:"á¿Œ";s:4:"ῌ";s:3:"á¿";s:5:" Ì“Ì€";s:3:"á¿Ž";s:5:" Ì“Ì";s:3:"á¿";s:5:" Ì“Í‚";s:3:"á¿";s:4:"ῐ";s:3:"á¿‘";s:4:"ῑ";s:3:"á¿’";s:6:"ῒ";s:3:"á¿“";s:6:"ϊÌ";s:3:"á¿–";s:4:"ῖ";s:3:"á¿—";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"á¿™";s:4:"Ῑ";s:3:"á¿š";s:4:"Ὶ";s:3:"á¿›";s:4:"ΙÌ";s:3:"á¿";s:5:" ̔̀";s:3:"á¿ž";s:5:" Ì”Ì";s:3:"á¿Ÿ";s:5:" ̔͂";s:3:"á¿ ";s:4:"ῠ";s:3:"á¿¡";s:4:"Ï…Ì„";s:3:"á¿¢";s:6:"ῢ";s:3:"á¿£";s:6:"ϋÌ";s:3:"ῤ";s:4:"ÏÌ“";s:3:"á¿¥";s:4:"ÏÌ”";s:3:"ῦ";s:4:"Ï…Í‚";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"á¿©";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"á¿«";s:4:"Î¥Ì";s:3:"Ῥ";s:4:"Ῥ";s:3:"á¿­";s:5:" ̈̀";s:3:"á¿®";s:5:" ̈Ì";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"á¿´";s:6:"ωÌÍ…";s:3:"ῶ";s:4:"ῶ";s:3:"á¿·";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"ΟÌ";s:3:"Ὼ";s:4:"Ὼ";s:3:"á¿»";s:4:"ΩÌ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:3:" Ì";s:3:"῾";s:3:" Ì”";s:3:" ";s:1:" ";s:3:"â€";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"â€";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" Ì…";s:3:"â‡";s:2:"??";s:3:"âˆ";s:2:"?!";s:3:"â‰";s:2:"!?";s:3:"â—";s:12:"′′′′";s:3:"âŸ";s:1:" ";s:3:"â°";s:1:"0";s:3:"â±";s:1:"i";s:3:"â´";s:1:"4";s:3:"âµ";s:1:"5";s:3:"â¶";s:1:"6";s:3:"â·";s:1:"7";s:3:"â¸";s:1:"8";s:3:"â¹";s:1:"9";s:3:"âº";s:1:"+";s:3:"â»";s:3:"−";s:3:"â¼";s:1:"=";s:3:"â½";s:1:"(";s:3:"â¾";s:1:")";s:3:"â¿";s:1:"n";s:3:"â‚€";s:1:"0";s:3:"â‚";s:1:"1";s:3:"â‚‚";s:1:"2";s:3:"₃";s:1:"3";s:3:"â‚„";s:1:"4";s:3:"â‚…";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"â‚Š";s:1:"+";s:3:"â‚‹";s:3:"−";s:3:"â‚Œ";s:1:"=";s:3:"â‚";s:1:"(";s:3:"â‚Ž";s:1:")";s:3:"â‚";s:1:"a";s:3:"â‚‘";s:1:"e";s:3:"â‚’";s:1:"o";s:3:"â‚“";s:1:"x";s:3:"â‚”";s:2:"É™";s:3:"₨";s:2:"Rs";s:3:"â„€";s:3:"a/c";s:3:"â„";s:3:"a/s";s:3:"â„‚";s:1:"C";s:3:"℃";s:3:"°C";s:3:"â„…";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Æ";s:3:"℉";s:3:"°F";s:3:"â„Š";s:1:"g";s:3:"â„‹";s:1:"H";s:3:"â„Œ";s:1:"H";s:3:"â„";s:1:"H";s:3:"â„Ž";s:1:"h";s:3:"â„";s:2:"ħ";s:3:"â„";s:1:"I";s:3:"â„‘";s:1:"I";s:3:"â„’";s:1:"L";s:3:"â„“";s:1:"l";s:3:"â„•";s:1:"N";s:3:"â„–";s:2:"No";s:3:"â„™";s:1:"P";s:3:"â„š";s:1:"Q";s:3:"â„›";s:1:"R";s:3:"â„œ";s:1:"R";s:3:"â„";s:1:"R";s:3:"â„ ";s:2:"SM";s:3:"â„¡";s:3:"TEL";s:3:"â„¢";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"Ω";s:2:"Ω";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"â„«";s:3:"AÌŠ";s:3:"ℬ";s:1:"B";s:3:"â„­";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"â„°";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"â„´";s:1:"o";s:3:"ℵ";s:2:"×";s:3:"ℶ";s:2:"ב";s:3:"â„·";s:2:"×’";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"â„»";s:3:"FAX";s:3:"ℼ";s:2:"Ï€";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"â„¿";s:2:"Π";s:3:"â…€";s:3:"∑";s:3:"â……";s:1:"D";s:3:"â…†";s:1:"d";s:3:"â…‡";s:1:"e";s:3:"â…ˆ";s:1:"i";s:3:"â…‰";s:1:"j";s:3:"â…“";s:5:"1â„3";s:3:"â…”";s:5:"2â„3";s:3:"â…•";s:5:"1â„5";s:3:"â…–";s:5:"2â„5";s:3:"â…—";s:5:"3â„5";s:3:"â…˜";s:5:"4â„5";s:3:"â…™";s:5:"1â„6";s:3:"â…š";s:5:"5â„6";s:3:"â…›";s:5:"1â„8";s:3:"â…œ";s:5:"3â„8";s:3:"â…";s:5:"5â„8";s:3:"â…ž";s:5:"7â„8";s:3:"â…Ÿ";s:4:"1â„";s:3:"â… ";s:1:"I";s:3:"â…¡";s:2:"II";s:3:"â…¢";s:3:"III";s:3:"â…£";s:2:"IV";s:3:"â…¤";s:1:"V";s:3:"â…¥";s:2:"VI";s:3:"â…¦";s:3:"VII";s:3:"â…§";s:4:"VIII";s:3:"â…¨";s:2:"IX";s:3:"â…©";s:1:"X";s:3:"â…ª";s:2:"XI";s:3:"â…«";s:3:"XII";s:3:"â…¬";s:1:"L";s:3:"â…­";s:1:"C";s:3:"â…®";s:1:"D";s:3:"â…¯";s:1:"M";s:3:"â…°";s:1:"i";s:3:"â…±";s:2:"ii";s:3:"â…²";s:3:"iii";s:3:"â…³";s:2:"iv";s:3:"â…´";s:1:"v";s:3:"â…µ";s:2:"vi";s:3:"â…¶";s:3:"vii";s:3:"â…·";s:4:"viii";s:3:"â…¸";s:2:"ix";s:3:"â…¹";s:1:"x";s:3:"â…º";s:2:"xi";s:3:"â…»";s:3:"xii";s:3:"â…¼";s:1:"l";s:3:"â…½";s:1:"c";s:3:"â…¾";s:1:"d";s:3:"â…¿";s:1:"m";s:3:"↚";s:5:"â†Ì¸";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"â‡";s:5:"â‡Ì¸";s:3:"⇎";s:5:"⇎";s:3:"â‡";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"â‰";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"â‰Ì¸";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"âŠ";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"â‹ ";s:5:"⋠";s:3:"â‹¡";s:5:"⋡";s:3:"â‹¢";s:5:"⋢";s:3:"â‹£";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"â‹«";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"â‹­";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"â‘ ";s:1:"1";s:3:"â‘¡";s:1:"2";s:3:"â‘¢";s:1:"3";s:3:"â‘£";s:1:"4";s:3:"⑤";s:1:"5";s:3:"â‘¥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"â‘©";s:2:"10";s:3:"⑪";s:2:"11";s:3:"â‘«";s:2:"12";s:3:"⑬";s:2:"13";s:3:"â‘­";s:2:"14";s:3:"â‘®";s:2:"15";s:3:"⑯";s:2:"16";s:3:"â‘°";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"â‘´";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"â‘·";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"â‘»";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"â‘¿";s:4:"(12)";s:3:"â’€";s:4:"(13)";s:3:"â’";s:4:"(14)";s:3:"â’‚";s:4:"(15)";s:3:"â’ƒ";s:4:"(16)";s:3:"â’„";s:4:"(17)";s:3:"â’…";s:4:"(18)";s:3:"â’†";s:4:"(19)";s:3:"â’‡";s:4:"(20)";s:3:"â’ˆ";s:2:"1.";s:3:"â’‰";s:2:"2.";s:3:"â’Š";s:2:"3.";s:3:"â’‹";s:2:"4.";s:3:"â’Œ";s:2:"5.";s:3:"â’";s:2:"6.";s:3:"â’Ž";s:2:"7.";s:3:"â’";s:2:"8.";s:3:"â’";s:2:"9.";s:3:"â’‘";s:3:"10.";s:3:"â’’";s:3:"11.";s:3:"â’“";s:3:"12.";s:3:"â’”";s:3:"13.";s:3:"â’•";s:3:"14.";s:3:"â’–";s:3:"15.";s:3:"â’—";s:3:"16.";s:3:"â’˜";s:3:"17.";s:3:"â’™";s:3:"18.";s:3:"â’š";s:3:"19.";s:3:"â’›";s:3:"20.";s:3:"â’œ";s:3:"(a)";s:3:"â’";s:3:"(b)";s:3:"â’ž";s:3:"(c)";s:3:"â’Ÿ";s:3:"(d)";s:3:"â’ ";s:3:"(e)";s:3:"â’¡";s:3:"(f)";s:3:"â’¢";s:3:"(g)";s:3:"â’£";s:3:"(h)";s:3:"â’¤";s:3:"(i)";s:3:"â’¥";s:3:"(j)";s:3:"â’¦";s:3:"(k)";s:3:"â’§";s:3:"(l)";s:3:"â’¨";s:3:"(m)";s:3:"â’©";s:3:"(n)";s:3:"â’ª";s:3:"(o)";s:3:"â’«";s:3:"(p)";s:3:"â’¬";s:3:"(q)";s:3:"â’­";s:3:"(r)";s:3:"â’®";s:3:"(s)";s:3:"â’¯";s:3:"(t)";s:3:"â’°";s:3:"(u)";s:3:"â’±";s:3:"(v)";s:3:"â’²";s:3:"(w)";s:3:"â’³";s:3:"(x)";s:3:"â’´";s:3:"(y)";s:3:"â’µ";s:3:"(z)";s:3:"â’¶";s:1:"A";s:3:"â’·";s:1:"B";s:3:"â’¸";s:1:"C";s:3:"â’¹";s:1:"D";s:3:"â’º";s:1:"E";s:3:"â’»";s:1:"F";s:3:"â’¼";s:1:"G";s:3:"â’½";s:1:"H";s:3:"â’¾";s:1:"I";s:3:"â’¿";s:1:"J";s:3:"â“€";s:1:"K";s:3:"â“";s:1:"L";s:3:"â“‚";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"â“„";s:1:"O";s:3:"â“…";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"â“Š";s:1:"U";s:3:"â“‹";s:1:"V";s:3:"â“Œ";s:1:"W";s:3:"â“";s:1:"X";s:3:"â“Ž";s:1:"Y";s:3:"â“";s:1:"Z";s:3:"â“";s:1:"a";s:3:"â“‘";s:1:"b";s:3:"â“’";s:1:"c";s:3:"â““";s:1:"d";s:3:"â“”";s:1:"e";s:3:"â“•";s:1:"f";s:3:"â“–";s:1:"g";s:3:"â“—";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"â“™";s:1:"j";s:3:"â“š";s:1:"k";s:3:"â“›";s:1:"l";s:3:"â“œ";s:1:"m";s:3:"â“";s:1:"n";s:3:"â“ž";s:1:"o";s:3:"â“Ÿ";s:1:"p";s:3:"â“ ";s:1:"q";s:3:"â“¡";s:1:"r";s:3:"â“¢";s:1:"s";s:3:"â“£";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"â“¥";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"â“©";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"â©´";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"â«œ";s:5:"â«Ì¸";s:3:"â±¼";s:1:"j";s:3:"â±½";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"æ¯";s:3:"⻳";s:3:"龟";s:3:"â¼€";s:3:"一";s:3:"â¼";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"ä¹™";s:3:"â¼…";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"å„¿";s:3:"⼊";s:3:"å…¥";s:3:"⼋";s:3:"å…«";s:3:"⼌";s:3:"冂";s:3:"â¼";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"â¼";s:3:"几";s:3:"â¼";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"â¼’";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"â¼”";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"â¼–";s:3:"匸";s:3:"â¼—";s:3:"å";s:3:"⼘";s:3:"åœ";s:3:"â¼™";s:3:"å©";s:3:"⼚";s:3:"厂";s:3:"â¼›";s:3:"厶";s:3:"⼜";s:3:"åˆ";s:3:"â¼";s:3:"å£";s:3:"⼞";s:3:"å›—";s:3:"⼟";s:3:"土";s:3:"â¼ ";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"â¼¢";s:3:"夊";s:3:"â¼£";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"â¼¥";s:3:"女";s:3:"⼦";s:3:"å­";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"å°";s:3:"⼪";s:3:"å°¢";s:3:"⼫";s:3:"å°¸";s:3:"⼬";s:3:"å±®";s:3:"â¼­";s:3:"å±±";s:3:"â¼®";s:3:"å·›";s:3:"⼯";s:3:"å·¥";s:3:"â¼°";s:3:"å·±";s:3:"â¼±";s:3:"å·¾";s:3:"â¼²";s:3:"å¹²";s:3:"â¼³";s:3:"幺";s:3:"â¼´";s:3:"广";s:3:"â¼µ";s:3:"å»´";s:3:"⼶";s:3:"廾";s:3:"â¼·";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"â¼¹";s:3:"å½";s:3:"⼺";s:3:"彡";s:3:"â¼»";s:3:"å½³";s:3:"â¼¼";s:3:"心";s:3:"â¼½";s:3:"戈";s:3:"â¼¾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"â½€";s:3:"支";s:3:"â½";s:3:"æ”´";s:3:"⽂";s:3:"æ–‡";s:3:"⽃";s:3:"æ–—";s:3:"⽄";s:3:"æ–¤";s:3:"â½…";s:3:"æ–¹";s:3:"⽆";s:3:"æ— ";s:3:"⽇";s:3:"æ—¥";s:3:"⽈";s:3:"æ›°";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"æ­¢";s:3:"â½";s:3:"æ­¹";s:3:"⽎";s:3:"殳";s:3:"â½";s:3:"毋";s:3:"â½";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"â½’";s:3:"æ°";s:3:"⽓";s:3:"æ°”";s:3:"â½”";s:3:"æ°´";s:3:"⽕";s:3:"ç«";s:3:"â½–";s:3:"爪";s:3:"â½—";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"â½™";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"â½›";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"â½";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"â½ ";s:3:"ç“œ";s:3:"⽡";s:3:"瓦";s:3:"â½¢";s:3:"甘";s:3:"â½£";s:3:"生";s:3:"⽤";s:3:"用";s:3:"â½¥";s:3:"ç”°";s:3:"⽦";s:3:"ç–‹";s:3:"⽧";s:3:"ç–’";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"çš®";s:3:"⽫";s:3:"çš¿";s:3:"⽬";s:3:"ç›®";s:3:"â½­";s:3:"矛";s:3:"â½®";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"â½°";s:3:"示";s:3:"â½±";s:3:"禸";s:3:"â½²";s:3:"禾";s:3:"â½³";s:3:"ç©´";s:3:"â½´";s:3:"ç«‹";s:3:"â½µ";s:3:"竹";s:3:"⽶";s:3:"ç±³";s:3:"â½·";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"â½¹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"â½»";s:3:"ç¾½";s:3:"â½¼";s:3:"è€";s:3:"â½½";s:3:"而";s:3:"â½¾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"â¾€";s:3:"è¿";s:3:"â¾";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"â¾…";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"è™";s:3:"â¾";s:3:"虫";s:3:"⾎";s:3:"è¡€";s:3:"â¾";s:3:"è¡Œ";s:3:"â¾";s:3:"è¡£";s:3:"⾑";s:3:"襾";s:3:"â¾’";s:3:"見";s:3:"⾓";s:3:"角";s:3:"â¾”";s:3:"言";s:3:"⾕";s:3:"è°·";s:3:"â¾–";s:3:"豆";s:3:"â¾—";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"â¾™";s:3:"è²";s:3:"⾚";s:3:"赤";s:3:"â¾›";s:3:"èµ°";s:3:"⾜";s:3:"足";s:3:"â¾";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"è¾›";s:3:"â¾ ";s:3:"è¾°";s:3:"⾡";s:3:"è¾µ";s:3:"â¾¢";s:3:"é‚‘";s:3:"â¾£";s:3:"é…‰";s:3:"⾤";s:3:"釆";s:3:"â¾¥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"é•·";s:3:"⾨";s:3:"é–€";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"éš¹";s:3:"⾬";s:3:"雨";s:3:"â¾­";s:3:"é‘";s:3:"â¾®";s:3:"éž";s:3:"⾯";s:3:"é¢";s:3:"â¾°";s:3:"é©";s:3:"â¾±";s:3:"韋";s:3:"â¾²";s:3:"韭";s:3:"â¾³";s:3:"音";s:3:"â¾´";s:3:"é ";s:3:"â¾µ";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"â¾·";s:3:"食";s:3:"⾸";s:3:"首";s:3:"â¾¹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"â¾»";s:3:"骨";s:3:"â¾¼";s:3:"高";s:3:"â¾½";s:3:"é«Ÿ";s:3:"â¾¾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"â¿€";s:3:"鬲";s:3:"â¿";s:3:"鬼";s:3:"â¿‚";s:3:"é­š";s:3:"⿃";s:3:"é³¥";s:3:"â¿„";s:3:"é¹µ";s:3:"â¿…";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"é»";s:3:"â¿Š";s:3:"黑";s:3:"â¿‹";s:3:"黹";s:3:"â¿Œ";s:3:"黽";s:3:"â¿";s:3:"鼎";s:3:"â¿Ž";s:3:"鼓";s:3:"â¿";s:3:"é¼ ";s:3:"â¿";s:3:"é¼»";s:3:"â¿‘";s:3:"齊";s:3:"â¿’";s:3:"é½’";s:3:"â¿“";s:3:"é¾";s:3:"â¿”";s:3:"龜";s:3:"â¿•";s:3:"é¾ ";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"å";s:3:"〹";s:3:"å„";s:3:"〺";s:3:"å…";s:3:"ãŒ";s:6:"ã‹ã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ãã‚™";s:3:"ã’";s:6:"ã‘ã‚™";s:3:"ã”";s:6:"ã“ã‚™";s:3:"ã–";s:6:"ã•ã‚™";s:3:"ã˜";s:6:"ã—ã‚™";s:3:"ãš";s:6:"ã™ã‚™";s:3:"ãœ";s:6:"ã›ã‚™";s:3:"ãž";s:6:"ãã‚™";s:3:"ã ";s:6:"ãŸã‚™";s:3:"ã¢";s:6:"ã¡ã‚™";s:3:"ã¥";s:6:"ã¤ã‚™";s:3:"ã§";s:6:"ã¦ã‚™";s:3:"ã©";s:6:"ã¨ã‚™";s:3:"ã°";s:6:"ã¯ã‚™";s:3:"ã±";s:6:"ã¯ã‚š";s:3:"ã³";s:6:"ã²ã‚™";s:3:"ã´";s:6:"ã²ã‚š";s:3:"ã¶";s:6:"ãµã‚™";s:3:"ã·";s:6:"ãµã‚š";s:3:"ã¹";s:6:"ã¸ã‚™";s:3:"ãº";s:6:"ã¸ã‚š";s:3:"ã¼";s:6:"ã»ã‚™";s:3:"ã½";s:6:"ã»ã‚š";s:3:"ã‚”";s:6:"ã†ã‚™";s:3:"ã‚›";s:4:" ã‚™";s:3:"ã‚œ";s:4:" ã‚š";s:3:"ã‚ž";s:6:"ã‚ã‚™";s:3:"ã‚Ÿ";s:6:"より";s:3:"ガ";s:6:"ã‚«ã‚™";s:3:"ã‚®";s:6:"ã‚­ã‚™";s:3:"ã‚°";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ã‚´";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ã‚·ã‚™";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ã‚¿ã‚™";s:3:"ヂ";s:6:"ãƒã‚™";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"ãƒ";s:6:"ãƒã‚™";s:3:"パ";s:6:"ãƒã‚š";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ãƒ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"á„€";s:3:"ㄲ";s:3:"á„";s:3:"ㄳ";s:3:"ᆪ";s:3:"ã„´";s:3:"á„‚";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ã„·";s:3:"ᄃ";s:3:"ㄸ";s:3:"á„„";s:3:"ㄹ";s:3:"á„…";s:3:"ㄺ";s:3:"ᆰ";s:3:"ã„»";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ã„¿";s:3:"ᆵ";s:3:"ã…€";s:3:"á„š";s:3:"ã…";s:3:"ᄆ";s:3:"ã…‚";s:3:"ᄇ";s:3:"ã…ƒ";s:3:"ᄈ";s:3:"ã…„";s:3:"á„¡";s:3:"ã……";s:3:"ᄉ";s:3:"ã…†";s:3:"á„Š";s:3:"ã…‡";s:3:"á„‹";s:3:"ã…ˆ";s:3:"á„Œ";s:3:"ã…‰";s:3:"á„";s:3:"ã…Š";s:3:"á„Ž";s:3:"ã…‹";s:3:"á„";s:3:"ã…Œ";s:3:"á„";s:3:"ã…";s:3:"á„‘";s:3:"ã…Ž";s:3:"á„’";s:3:"ã…";s:3:"á…¡";s:3:"ã…";s:3:"á…¢";s:3:"ã…‘";s:3:"á…£";s:3:"ã…’";s:3:"á…¤";s:3:"ã…“";s:3:"á…¥";s:3:"ã…”";s:3:"á…¦";s:3:"ã…•";s:3:"á…§";s:3:"ã…–";s:3:"á…¨";s:3:"ã…—";s:3:"á…©";s:3:"ã…˜";s:3:"á…ª";s:3:"ã…™";s:3:"á…«";s:3:"ã…š";s:3:"á…¬";s:3:"ã…›";s:3:"á…­";s:3:"ã…œ";s:3:"á…®";s:3:"ã…";s:3:"á…¯";s:3:"ã…ž";s:3:"á…°";s:3:"ã…Ÿ";s:3:"á…±";s:3:"ã… ";s:3:"á…²";s:3:"ã…¡";s:3:"á…³";s:3:"ã…¢";s:3:"á…´";s:3:"ã…£";s:3:"á…µ";s:3:"ã…¤";s:3:"á… ";s:3:"ã…¥";s:3:"á„”";s:3:"ã…¦";s:3:"á„•";s:3:"ã…§";s:3:"ᇇ";s:3:"ã…¨";s:3:"ᇈ";s:3:"ã…©";s:3:"ᇌ";s:3:"ã…ª";s:3:"ᇎ";s:3:"ã…«";s:3:"ᇓ";s:3:"ã…¬";s:3:"ᇗ";s:3:"ã…­";s:3:"ᇙ";s:3:"ã…®";s:3:"á„œ";s:3:"ã…¯";s:3:"á‡";s:3:"ã…°";s:3:"ᇟ";s:3:"ã…±";s:3:"á„";s:3:"ã…²";s:3:"á„ž";s:3:"ã…³";s:3:"á„ ";s:3:"ã…´";s:3:"á„¢";s:3:"ã…µ";s:3:"á„£";s:3:"ã…¶";s:3:"ᄧ";s:3:"ã…·";s:3:"á„©";s:3:"ã…¸";s:3:"á„«";s:3:"ã…¹";s:3:"ᄬ";s:3:"ã…º";s:3:"á„­";s:3:"ã…»";s:3:"á„®";s:3:"ã…¼";s:3:"ᄯ";s:3:"ã…½";s:3:"ᄲ";s:3:"ã…¾";s:3:"ᄶ";s:3:"ã…¿";s:3:"á…€";s:3:"ㆀ";s:3:"á…‡";s:3:"ã†";s:3:"á…Œ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"á…—";s:3:"ㆅ";s:3:"á…˜";s:3:"ㆆ";s:3:"á…™";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ã†";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"å››";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"ä¹™";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"ä¸";s:3:"ã†";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(á„€)";s:3:"ãˆ";s:5:"(á„‚)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(á„…)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(á„‹)";s:3:"㈈";s:5:"(á„Œ)";s:3:"㈉";s:5:"(á„Ž)";s:3:"㈊";s:5:"(á„)";s:3:"㈋";s:5:"(á„)";s:3:"㈌";s:5:"(á„‘)";s:3:"ãˆ";s:5:"(á„’)";s:3:"㈎";s:8:"(가)";s:3:"ãˆ";s:8:"(á„‚á…¡)";s:3:"ãˆ";s:8:"(다)";s:3:"㈑";s:8:"(á„…á…¡)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(á„‹á…¡)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(á„Žá…¡)";s:3:"㈘";s:8:"(á„á…¡)";s:3:"㈙";s:8:"(á„á…¡)";s:3:"㈚";s:8:"(á„‘á…¡)";s:3:"㈛";s:8:"(á„’á…¡)";s:3:"㈜";s:8:"(주)";s:3:"ãˆ";s:17:"(오전)";s:3:"㈞";s:14:"(á„‹á…©á„’á…®)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(å››)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(å…­)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(å…«)";s:3:"㈨";s:5:"(ä¹)";s:3:"㈩";s:5:"(å)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(ç«)";s:3:"㈬";s:5:"(æ°´)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(æ—¥)";s:3:"㈱";s:5:"(æ ª)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(å)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(ç¥)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(å­¦)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(ä¼)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(å”)";s:3:"㉀";s:5:"(祭)";s:3:"ã‰";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"ã‰";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"ã‰";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"á„€";s:3:"㉡";s:3:"á„‚";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"á„…";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"á„‹";s:3:"㉨";s:3:"á„Œ";s:3:"㉩";s:3:"á„Ž";s:3:"㉪";s:3:"á„";s:3:"㉫";s:3:"á„";s:3:"㉬";s:3:"á„‘";s:3:"㉭";s:3:"á„’";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"á„‚á…¡";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"á„…á…¡";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"á„‹á…¡";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"á„Žá…¡";s:3:"㉸";s:6:"á„á…¡";s:3:"㉹";s:6:"á„á…¡";s:3:"㉺";s:6:"á„‘á…¡";s:3:"㉻";s:6:"á„’á…¡";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"á„‹á…®";s:3:"㊀";s:3:"一";s:3:"ãŠ";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"å››";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"å…­";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"å…«";s:3:"㊈";s:3:"ä¹";s:3:"㊉";s:3:"å";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"ç«";s:3:"㊌";s:3:"æ°´";s:3:"ãŠ";s:3:"木";s:3:"㊎";s:3:"金";s:3:"ãŠ";s:3:"土";s:3:"ãŠ";s:3:"æ—¥";s:3:"㊑";s:3:"æ ª";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"å";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"ç¥";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"ç”·";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"é©";s:3:"ãŠ";s:3:"優";s:3:"㊞";s:3:"å°";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"é …";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"æ­£";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"å·¦";s:3:"㊨";s:3:"å³";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"å®—";s:3:"㊫";s:3:"å­¦";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"ä¼";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"å”";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"ã‹€";s:4:"1月";s:3:"ã‹";s:4:"2月";s:3:"ã‹‚";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"ã‹„";s:4:"5月";s:3:"ã‹…";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"ã‹Š";s:5:"11月";s:3:"ã‹‹";s:5:"12月";s:3:"ã‹Œ";s:2:"Hg";s:3:"ã‹";s:3:"erg";s:3:"ã‹Ž";s:2:"eV";s:3:"ã‹";s:3:"LTD";s:3:"ã‹";s:3:"ã‚¢";s:3:"ã‹‘";s:3:"イ";s:3:"ã‹’";s:3:"ウ";s:3:"ã‹“";s:3:"エ";s:3:"ã‹”";s:3:"オ";s:3:"ã‹•";s:3:"ã‚«";s:3:"ã‹–";s:3:"ã‚­";s:3:"ã‹—";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"ã‹™";s:3:"コ";s:3:"ã‹š";s:3:"サ";s:3:"ã‹›";s:3:"ã‚·";s:3:"ã‹œ";s:3:"ス";s:3:"ã‹";s:3:"ã‚»";s:3:"ã‹ž";s:3:"ソ";s:3:"ã‹Ÿ";s:3:"ã‚¿";s:3:"ã‹ ";s:3:"ãƒ";s:3:"ã‹¡";s:3:"ツ";s:3:"ã‹¢";s:3:"テ";s:3:"ã‹£";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"ã‹¥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ãƒ";s:3:"㋨";s:3:"ノ";s:3:"ã‹©";s:3:"ãƒ";s:3:"㋪";s:3:"ヒ";s:3:"ã‹«";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"ã‹­";s:3:"ホ";s:3:"ã‹®";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"ã‹°";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"ã‹´";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"ã‹·";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"ã‹»";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"ã‚¢ãƒã‚šãƒ¼ãƒˆ";s:3:"ãŒ";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インãƒ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"ãŒ";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"ãŒ";s:12:"ガンマ";s:3:"ãŒ";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローãƒ";s:3:"㌜";s:9:"ケース";s:3:"ãŒ";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンãƒãƒ¼ãƒ ";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センãƒ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ãƒã‚¤ãƒ„";s:3:"㌫";s:18:"ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ";s:3:"㌬";s:12:"ãƒã‚šãƒ¼ãƒ„";s:3:"㌭";s:15:"ãƒã‚™ãƒ¼ãƒ¬ãƒ«";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"ã€";s:15:"ポンド";s:3:"ã";s:9:"ホール";s:3:"ã‚";s:9:"ホーン";s:3:"ãƒ";s:12:"マイクロ";s:3:"ã„";s:9:"マイル";s:3:"ã…";s:9:"マッãƒ";s:3:"ã†";s:9:"マルク";s:3:"ã‡";s:15:"マンション";s:3:"ãˆ";s:12:"ミクロン";s:3:"ã‰";s:6:"ミリ";s:3:"ãŠ";s:18:"ミリãƒã‚™ãƒ¼ãƒ«";s:3:"ã‹";s:9:"メガ";s:3:"ãŒ";s:15:"メガトン";s:3:"ã";s:12:"メートル";s:3:"ãŽ";s:12:"ヤード";s:3:"ã";s:9:"ヤール";s:3:"ã";s:9:"ユアン";s:3:"ã‘";s:12:"リットル";s:3:"ã’";s:6:"リラ";s:3:"ã“";s:12:"ルピー";s:3:"ã”";s:15:"ルーブル";s:3:"ã•";s:6:"レム";s:3:"ã–";s:18:"レントゲン";s:3:"ã—";s:9:"ワット";s:3:"ã˜";s:4:"0点";s:3:"ã™";s:4:"1点";s:3:"ãš";s:4:"2点";s:3:"ã›";s:4:"3点";s:3:"ãœ";s:4:"4点";s:3:"ã";s:4:"5点";s:3:"ãž";s:4:"6点";s:3:"ãŸ";s:4:"7点";s:3:"ã ";s:4:"8点";s:3:"ã¡";s:4:"9点";s:3:"ã¢";s:5:"10点";s:3:"ã£";s:5:"11点";s:3:"ã¤";s:5:"12点";s:3:"ã¥";s:5:"13点";s:3:"ã¦";s:5:"14点";s:3:"ã§";s:5:"15点";s:3:"ã¨";s:5:"16点";s:3:"ã©";s:5:"17点";s:3:"ãª";s:5:"18点";s:3:"ã«";s:5:"19点";s:3:"ã¬";s:5:"20点";s:3:"ã­";s:5:"21点";s:3:"ã®";s:5:"22点";s:3:"ã¯";s:5:"23点";s:3:"ã°";s:5:"24点";s:3:"ã±";s:3:"hPa";s:3:"ã²";s:2:"da";s:3:"ã³";s:2:"AU";s:3:"ã´";s:3:"bar";s:3:"ãµ";s:2:"oV";s:3:"ã¶";s:2:"pc";s:3:"ã·";s:2:"dm";s:3:"ã¸";s:3:"dm2";s:3:"ã¹";s:3:"dm3";s:3:"ãº";s:2:"IU";s:3:"ã»";s:6:"å¹³æˆ";s:3:"ã¼";s:6:"昭和";s:3:"ã½";s:6:"大正";s:3:"ã¾";s:6:"明治";s:3:"ã¿";s:12:"æ ªå¼ä¼šç¤¾";s:3:"㎀";s:2:"pA";s:3:"ãŽ";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"ãŽ";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"ãŽ";s:2:"kg";s:3:"ãŽ";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"ãŽ";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"ã€";s:3:"kΩ";s:3:"ã";s:3:"MΩ";s:3:"ã‚";s:4:"a.m.";s:3:"ãƒ";s:2:"Bq";s:3:"ã„";s:2:"cc";s:3:"ã…";s:2:"cd";s:3:"ã†";s:6:"C∕kg";s:3:"ã‡";s:3:"Co.";s:3:"ãˆ";s:2:"dB";s:3:"ã‰";s:2:"Gy";s:3:"ãŠ";s:2:"ha";s:3:"ã‹";s:2:"HP";s:3:"ãŒ";s:2:"in";s:3:"ã";s:2:"KK";s:3:"ãŽ";s:2:"KM";s:3:"ã";s:2:"kt";s:3:"ã";s:2:"lm";s:3:"ã‘";s:2:"ln";s:3:"ã’";s:3:"log";s:3:"ã“";s:2:"lx";s:3:"ã”";s:2:"mb";s:3:"ã•";s:3:"mil";s:3:"ã–";s:3:"mol";s:3:"ã—";s:2:"PH";s:3:"ã˜";s:4:"p.m.";s:3:"ã™";s:3:"PPM";s:3:"ãš";s:2:"PR";s:3:"ã›";s:2:"sr";s:3:"ãœ";s:2:"Sv";s:3:"ã";s:2:"Wb";s:3:"ãž";s:5:"V∕m";s:3:"ãŸ";s:5:"A∕m";s:3:"ã ";s:4:"1æ—¥";s:3:"ã¡";s:4:"2æ—¥";s:3:"ã¢";s:4:"3æ—¥";s:3:"ã£";s:4:"4æ—¥";s:3:"ã¤";s:4:"5æ—¥";s:3:"ã¥";s:4:"6æ—¥";s:3:"ã¦";s:4:"7æ—¥";s:3:"ã§";s:4:"8æ—¥";s:3:"ã¨";s:4:"9æ—¥";s:3:"ã©";s:5:"10æ—¥";s:3:"ãª";s:5:"11æ—¥";s:3:"ã«";s:5:"12æ—¥";s:3:"ã¬";s:5:"13æ—¥";s:3:"ã­";s:5:"14æ—¥";s:3:"ã®";s:5:"15æ—¥";s:3:"ã¯";s:5:"16æ—¥";s:3:"ã°";s:5:"17æ—¥";s:3:"ã±";s:5:"18æ—¥";s:3:"ã²";s:5:"19æ—¥";s:3:"ã³";s:5:"20æ—¥";s:3:"ã´";s:5:"21æ—¥";s:3:"ãµ";s:5:"22æ—¥";s:3:"ã¶";s:5:"23æ—¥";s:3:"ã·";s:5:"24æ—¥";s:3:"ã¸";s:5:"25æ—¥";s:3:"ã¹";s:5:"26æ—¥";s:3:"ãº";s:5:"27æ—¥";s:3:"ã»";s:5:"28æ—¥";s:3:"ã¼";s:5:"29æ—¥";s:3:"ã½";s:5:"30æ—¥";s:3:"ã¾";s:5:"31æ—¥";s:3:"ã¿";s:3:"gal";s:3:"ê°";s:3:"ê¯";s:3:"豈";s:3:"豈";s:3:"ï¤";s:3:"æ›´";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"å¥";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"å–‡";s:3:"奈";s:3:"奈";s:3:"ï¤";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"ï¤";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"é‚";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"æ´›";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"çž";s:3:"落";s:3:"è½";s:3:"酪";s:3:"é…ª";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"åµ";s:3:"ï¤";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"åµ";s:3:"濫";s:3:"æ¿«";s:3:"藍";s:3:"è—";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"è Ÿ";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"å‹ž";s:3:"擄";s:3:"æ“„";s:3:"櫓";s:3:"æ«“";s:3:"爐";s:3:"çˆ";s:3:"盧";s:3:"盧";s:3:"老";s:3:"è€";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"è·¯";s:3:"露";s:3:"露";s:3:"魯";s:3:"é­¯";s:3:"鷺";s:3:"é·º";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"è‰";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"ï¥";s:3:"è«–";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"ç± ";s:3:"聾";s:3:"è¾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"é›·";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"å±¢";s:3:"樓";s:3:"樓";s:3:"ï¥";s:3:"æ·š";s:3:"漏";s:3:"æ¼";s:3:"ï¥";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"å‹’";s:3:"肋";s:3:"è‚‹";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"è±";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"æ‹";s:3:"樂";s:3:"樂";s:3:"ï¥";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"ç•°";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"ä¸";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"ç´¢";s:3:"參";s:3:"åƒ";s:3:"塞";s:3:"å¡ž";s:3:"省";s:3:"çœ";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"è¾°";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"è‹¥";s:3:"掠";s:3:"掠";s:3:"略";s:3:"ç•¥";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"å…©";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"æ¢";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"è«’";s:3:"量";s:3:"é‡";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"å‘‚";s:3:"ï¦";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"æ—…";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"é–­";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"æ­·";s:3:"ï¦";s:3:"è½¢";s:3:"年";s:3:"å¹´";s:3:"ï¦";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"撚";s:3:"æ’š";s:3:"漣";s:3:"æ¼£";s:3:"煉";s:3:"ç…‰";s:3:"璉";s:3:"ç’‰";s:3:"秊";s:3:"秊";s:3:"練";s:3:"ç·´";s:3:"聯";s:3:"è¯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"è“®";s:3:"連";s:3:"連";s:3:"鍊";s:3:"éŠ";s:3:"列";s:3:"列";s:3:"ï¦";s:3:"劣";s:3:"咽";s:3:"å’½";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"æ»";s:3:"殮";s:3:"æ®®";s:3:"簾";s:3:"ç°¾";s:3:"獵";s:3:"çµ";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"ç‘©";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"è†";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"éˆ";s:3:"領";s:3:"é ˜";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"å°¿";s:3:"料";s:3:"æ–™";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"ï§";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"é¼";s:3:"龍";s:3:"é¾";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"æ»";s:3:"柳";s:3:"柳";s:3:"流";s:3:"æµ";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"ç‰";s:3:"ï§";s:3:"ç•™";s:3:"硫";s:3:"ç¡«";s:3:"ï§";s:3:"ç´";s:3:"ï§";s:3:"é¡ž";s:3:"六";s:3:"å…­";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"å´™";s:3:"淪";s:3:"æ·ª";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"æ…„";s:3:"栗";s:3:"æ —";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"ï§";s:3:"利";s:3:"吏";s:3:"å";s:3:"履";s:3:"å±¥";s:3:"易";s:3:"易";s:3:"李";s:3:"æŽ";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"æ³¥";s:3:"理";s:3:"ç†";s:3:"痢";s:3:"ç—¢";s:3:"罹";s:3:"ç½¹";s:3:"裏";s:3:"è£";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"å";s:3:"燐";s:3:"ç‡";s:3:"璘";s:3:"ç’˜";s:3:"藺";s:3:"è—º";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"é±—";s:3:"麟";s:3:"麟";s:3:"林";s:3:"æž—";s:3:"淋";s:3:"æ·‹";s:3:"臨";s:3:"臨";s:3:"立";s:3:"ç«‹";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"ç²’";s:3:"狀";s:3:"ç‹€";s:3:"炙";s:3:"ç‚™";s:3:"識";s:3:"è­˜";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"ï¨";s:3:"度";s:3:"拓";s:3:"æ‹“";s:3:"糖";s:3:"ç³–";s:3:"宅";s:3:"å®…";s:3:"洞";s:3:"æ´ž";s:3:"暴";s:3:"æš´";s:3:"輻";s:3:"è¼»";s:3:"行";s:3:"è¡Œ";s:3:"降";s:3:"é™";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"å…€";s:3:"ï¨";s:3:"å—€";s:3:"ï¨";s:3:"å¡š";s:3:"晴";s:3:"æ™´";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"ç¦";s:3:"靖";s:3:"é–";s:3:"ï¨";s:3:"ç²¾";s:3:"羽";s:3:"ç¾½";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"ä¾®";s:3:"僧";s:3:"僧";s:3:"免";s:3:"å…";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"å‘";s:3:"喝";s:3:"å–";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"å¡€";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"å±®";s:3:"悔";s:3:"æ‚”";s:3:"慨";s:3:"æ…¨";s:3:"憎";s:3:"憎";s:3:"ï©€";s:3:"懲";s:3:"ï©";s:3:"æ•";s:3:"ï©‚";s:3:"æ—¢";s:3:"暑";s:3:"æš‘";s:3:"ï©„";s:3:"梅";s:3:"ï©…";s:3:"æµ·";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"æ¼¢";s:3:"煮";s:3:"ç…®";s:3:"爫";s:3:"爫";s:3:"ï©Š";s:3:"ç¢";s:3:"ï©‹";s:3:"碑";s:3:"ï©Œ";s:3:"社";s:3:"ï©";s:3:"祉";s:3:"ï©Ž";s:3:"祈";s:3:"ï©";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:3:"ï©‘";s:3:"ç¥";s:3:"ï©’";s:3:"ç¦";s:3:"ï©“";s:3:"禎";s:3:"ï©”";s:3:"ç©€";s:3:"ï©•";s:3:"çª";s:3:"ï©–";s:3:"節";s:3:"ï©—";s:3:"ç·´";s:3:"縉";s:3:"縉";s:3:"ï©™";s:3:"ç¹";s:3:"ï©š";s:3:"ç½²";s:3:"ï©›";s:3:"者";s:3:"ï©œ";s:3:"臭";s:3:"ï©";s:3:"艹";s:3:"ï©ž";s:3:"艹";s:3:"ï©Ÿ";s:3:"è‘—";s:3:"ï© ";s:3:"è¤";s:3:"ï©¡";s:3:"視";s:3:"ï©¢";s:3:"è¬";s:3:"ï©£";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"ï©¥";s:3:"è´ˆ";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"ï©©";s:3:"響";s:3:"頻";s:3:"é »";s:3:"ï©°";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"å…¨";s:3:"侀";s:3:"ä¾€";s:3:"ï©´";s:3:"å……";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"ï©·";s:3:"勺";s:3:"喝";s:3:"å–";s:3:"啕";s:3:"å••";s:3:"喙";s:3:"å–™";s:3:"ï©»";s:3:"å—¢";s:3:"塚";s:3:"å¡š";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"ï©¿";s:3:"奔";s:3:"婢";s:3:"å©¢";s:3:"ïª";s:3:"嬨";s:3:"廒";s:3:"å»’";s:3:"廙";s:3:"å»™";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"å¾­";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"æ…Ž";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"æ… ";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"ïª";s:3:"æ„";s:3:"搜";s:3:"æœ";s:3:"ïª";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"晴";s:3:"æ™´";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"æ–";s:3:"歹";s:3:"æ­¹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"æµ";s:3:"滛";s:3:"æ»›";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"æ¼¢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"ç…®";s:3:"ïª";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"ç”»";s:3:"瘝";s:3:"ç˜";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"ç››";s:3:"直";s:3:"ç›´";s:3:"睊";s:3:"çŠ";s:3:"着";s:3:"ç€";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"ç±»";s:3:"絛";s:3:"çµ›";s:3:"練";s:3:"ç·´";s:3:"缾";s:3:"ç¼¾";s:3:"者";s:3:"者";s:3:"荒";s:3:"è’";s:3:"華";s:3:"è¯";s:3:"蝹";s:3:"è¹";s:3:"襁";s:3:"è¥";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"è«‹";s:3:"謁";s:3:"è¬";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"è«­";s:3:"謹";s:3:"謹";s:3:"ï«€";s:3:"變";s:3:"ï«";s:3:"è´ˆ";s:3:"ï«‚";s:3:"輸";s:3:"遲";s:3:"é²";s:3:"ï«„";s:3:"醙";s:3:"ï«…";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"é–";s:3:"韛";s:3:"韛";s:3:"ï«Š";s:3:"響";s:3:"ï«‹";s:3:"é ‹";s:3:"ï«Œ";s:3:"é »";s:3:"ï«";s:3:"鬒";s:3:"ï«Ž";s:3:"龜";s:3:"ï«";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«‘";s:4:"ð£•";s:3:"ï«’";s:3:"ã®";s:3:"ï«“";s:3:"䀘";s:3:"ï«”";s:3:"䀹";s:3:"ï«•";s:4:"𥉉";s:3:"ï«–";s:4:"ð¥³";s:3:"ï«—";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"ï«™";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"ï¬";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"Õ´Õ¶";s:3:"ﬔ";s:4:"Õ´Õ¥";s:3:"ﬕ";s:4:"Õ´Õ«";s:3:"ﬖ";s:4:"Õ¾Õ¶";s:3:"ﬗ";s:4:"Õ´Õ­";s:3:"ï¬";s:4:"×™Ö´";s:3:"ײַ";s:4:"ײַ";s:3:"ﬠ";s:2:"×¢";s:3:"ﬡ";s:2:"×";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"×”";s:3:"ﬤ";s:2:"×›";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"×";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"שׁ";s:4:"ש×";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּ×";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"×Ö·";s:3:"אָ";s:4:"×Ö¸";s:3:"אּ";s:4:"×Ö¼";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"×’Ö¼";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"×”Ö¼";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"×–Ö¼";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"×™Ö¼";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"×›Ö¼";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"ï­€";s:4:"× Ö¼";s:3:"ï­";s:4:"סּ";s:3:"ï­ƒ";s:4:"×£Ö¼";s:3:"ï­„";s:4:"פּ";s:3:"ï­†";s:4:"צּ";s:3:"ï­‡";s:4:"קּ";s:3:"ï­ˆ";s:4:"רּ";s:3:"ï­‰";s:4:"שּ";s:3:"ï­Š";s:4:"תּ";s:3:"ï­‹";s:4:"וֹ";s:3:"ï­Œ";s:4:"בֿ";s:3:"ï­";s:4:"×›Ö¿";s:3:"ï­Ž";s:4:"פֿ";s:3:"ï­";s:4:"×ל";s:3:"ï­";s:2:"Ù±";s:3:"ï­‘";s:2:"Ù±";s:3:"ï­’";s:2:"Ù»";s:3:"ï­“";s:2:"Ù»";s:3:"ï­”";s:2:"Ù»";s:3:"ï­•";s:2:"Ù»";s:3:"ï­–";s:2:"Ù¾";s:3:"ï­—";s:2:"Ù¾";s:3:"ï­˜";s:2:"Ù¾";s:3:"ï­™";s:2:"Ù¾";s:3:"ï­š";s:2:"Ú€";s:3:"ï­›";s:2:"Ú€";s:3:"ï­œ";s:2:"Ú€";s:3:"ï­";s:2:"Ú€";s:3:"ï­ž";s:2:"Ùº";s:3:"ï­Ÿ";s:2:"Ùº";s:3:"ï­ ";s:2:"Ùº";s:3:"ï­¡";s:2:"Ùº";s:3:"ï­¢";s:2:"Ù¿";s:3:"ï­£";s:2:"Ù¿";s:3:"ï­¤";s:2:"Ù¿";s:3:"ï­¥";s:2:"Ù¿";s:3:"ï­¦";s:2:"Ù¹";s:3:"ï­§";s:2:"Ù¹";s:3:"ï­¨";s:2:"Ù¹";s:3:"ï­©";s:2:"Ù¹";s:3:"ï­ª";s:2:"Ú¤";s:3:"ï­«";s:2:"Ú¤";s:3:"ï­¬";s:2:"Ú¤";s:3:"ï­­";s:2:"Ú¤";s:3:"ï­®";s:2:"Ú¦";s:3:"ï­¯";s:2:"Ú¦";s:3:"ï­°";s:2:"Ú¦";s:3:"ï­±";s:2:"Ú¦";s:3:"ï­²";s:2:"Ú„";s:3:"ï­³";s:2:"Ú„";s:3:"ï­´";s:2:"Ú„";s:3:"ï­µ";s:2:"Ú„";s:3:"ï­¶";s:2:"Úƒ";s:3:"ï­·";s:2:"Úƒ";s:3:"ï­¸";s:2:"Úƒ";s:3:"ï­¹";s:2:"Úƒ";s:3:"ï­º";s:2:"Ú†";s:3:"ï­»";s:2:"Ú†";s:3:"ï­¼";s:2:"Ú†";s:3:"ï­½";s:2:"Ú†";s:3:"ï­¾";s:2:"Ú‡";s:3:"ï­¿";s:2:"Ú‡";s:3:"ﮀ";s:2:"Ú‡";s:3:"ï®";s:2:"Ú‡";s:3:"ﮂ";s:2:"Ú";s:3:"ﮃ";s:2:"Ú";s:3:"ﮄ";s:2:"ÚŒ";s:3:"ï®…";s:2:"ÚŒ";s:3:"ﮆ";s:2:"ÚŽ";s:3:"ﮇ";s:2:"ÚŽ";s:3:"ﮈ";s:2:"Úˆ";s:3:"ﮉ";s:2:"Úˆ";s:3:"ﮊ";s:2:"Ú˜";s:3:"ﮋ";s:2:"Ú˜";s:3:"ﮌ";s:2:"Ú‘";s:3:"ï®";s:2:"Ú‘";s:3:"ﮎ";s:2:"Ú©";s:3:"ï®";s:2:"Ú©";s:3:"ï®";s:2:"Ú©";s:3:"ﮑ";s:2:"Ú©";s:3:"ï®’";s:2:"Ú¯";s:3:"ﮓ";s:2:"Ú¯";s:3:"ï®”";s:2:"Ú¯";s:3:"ﮕ";s:2:"Ú¯";s:3:"ï®–";s:2:"Ú³";s:3:"ï®—";s:2:"Ú³";s:3:"ﮘ";s:2:"Ú³";s:3:"ï®™";s:2:"Ú³";s:3:"ﮚ";s:2:"Ú±";s:3:"ï®›";s:2:"Ú±";s:3:"ﮜ";s:2:"Ú±";s:3:"ï®";s:2:"Ú±";s:3:"ﮞ";s:2:"Úº";s:3:"ﮟ";s:2:"Úº";s:3:"ï® ";s:2:"Ú»";s:3:"ﮡ";s:2:"Ú»";s:3:"ﮢ";s:2:"Ú»";s:3:"ﮣ";s:2:"Ú»";s:3:"ﮤ";s:4:"Û•Ù”";s:3:"ﮥ";s:4:"Û•Ù”";s:3:"ﮦ";s:2:"Û";s:3:"ﮧ";s:2:"Û";s:3:"ﮨ";s:2:"Û";s:3:"ﮩ";s:2:"Û";s:3:"ﮪ";s:2:"Ú¾";s:3:"ﮫ";s:2:"Ú¾";s:3:"ﮬ";s:2:"Ú¾";s:3:"ï®­";s:2:"Ú¾";s:3:"ï®®";s:2:"Û’";s:3:"ﮯ";s:2:"Û’";s:3:"ï®°";s:4:"Û’Ù”";s:3:"ï®±";s:4:"Û’Ù”";s:3:"ﯓ";s:2:"Ú­";s:3:"ﯔ";s:2:"Ú­";s:3:"ﯕ";s:2:"Ú­";s:3:"ﯖ";s:2:"Ú­";s:3:"ﯗ";s:2:"Û‡";s:3:"ﯘ";s:2:"Û‡";s:3:"ﯙ";s:2:"Û†";s:3:"ﯚ";s:2:"Û†";s:3:"ﯛ";s:2:"Ûˆ";s:3:"ﯜ";s:2:"Ûˆ";s:3:"ï¯";s:4:"Û‡Ù´";s:3:"ﯞ";s:2:"Û‹";s:3:"ﯟ";s:2:"Û‹";s:3:"ﯠ";s:2:"Û…";s:3:"ﯡ";s:2:"Û…";s:3:"ﯢ";s:2:"Û‰";s:3:"ﯣ";s:2:"Û‰";s:3:"ﯤ";s:2:"Û";s:3:"ﯥ";s:2:"Û";s:3:"ﯦ";s:2:"Û";s:3:"ﯧ";s:2:"Û";s:3:"ﯨ";s:2:"Ù‰";s:3:"ﯩ";s:2:"Ù‰";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ÙŠÙ”Û•";s:3:"ﯭ";s:6:"ÙŠÙ”Û•";s:3:"ﯮ";s:6:"ÙŠÙ”Ùˆ";s:3:"ﯯ";s:6:"ÙŠÙ”Ùˆ";s:3:"ﯰ";s:6:"ÙŠÙ”Û‡";s:3:"ﯱ";s:6:"ÙŠÙ”Û‡";s:3:"ﯲ";s:6:"ÙŠÙ”Û†";s:3:"ﯳ";s:6:"ÙŠÙ”Û†";s:3:"ﯴ";s:6:"ÙŠÙ”Ûˆ";s:3:"ﯵ";s:6:"ÙŠÙ”Ûˆ";s:3:"ﯶ";s:6:"ÙŠÙ”Û";s:3:"ﯷ";s:6:"ÙŠÙ”Û";s:3:"ﯸ";s:6:"ÙŠÙ”Û";s:3:"ﯹ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯺ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯻ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯼ";s:2:"ÛŒ";s:3:"ﯽ";s:2:"ÛŒ";s:3:"ﯾ";s:2:"ÛŒ";s:3:"ﯿ";s:2:"ÛŒ";s:3:"ï°€";s:6:"ئج";s:3:"ï°";s:6:"ئح";s:3:"ï°‚";s:6:"ÙŠÙ”Ù…";s:3:"ï°ƒ";s:6:"ÙŠÙ”Ù‰";s:3:"ï°„";s:6:"ÙŠÙ”ÙŠ";s:3:"ï°…";s:4:"بج";s:3:"ï°†";s:4:"بح";s:3:"ï°‡";s:4:"بخ";s:3:"ï°ˆ";s:4:"بم";s:3:"ï°‰";s:4:"بى";s:3:"ï°Š";s:4:"بي";s:3:"ï°‹";s:4:"تج";s:3:"ï°Œ";s:4:"تح";s:3:"ï°";s:4:"تخ";s:3:"ï°Ž";s:4:"تم";s:3:"ï°";s:4:"تى";s:3:"ï°";s:4:"تي";s:3:"ï°‘";s:4:"ثج";s:3:"ï°’";s:4:"ثم";s:3:"ï°“";s:4:"ثى";s:3:"ï°”";s:4:"ثي";s:3:"ï°•";s:4:"جح";s:3:"ï°–";s:4:"جم";s:3:"ï°—";s:4:"حج";s:3:"ï°˜";s:4:"حم";s:3:"ï°™";s:4:"خج";s:3:"ï°š";s:4:"خح";s:3:"ï°›";s:4:"خم";s:3:"ï°œ";s:4:"سج";s:3:"ï°";s:4:"سح";s:3:"ï°ž";s:4:"سخ";s:3:"ï°Ÿ";s:4:"سم";s:3:"ï° ";s:4:"صح";s:3:"ï°¡";s:4:"صم";s:3:"ï°¢";s:4:"ضج";s:3:"ï°£";s:4:"ضح";s:3:"ï°¤";s:4:"ضخ";s:3:"ï°¥";s:4:"ضم";s:3:"ï°¦";s:4:"طح";s:3:"ï°§";s:4:"طم";s:3:"ï°¨";s:4:"ظم";s:3:"ï°©";s:4:"عج";s:3:"ï°ª";s:4:"عم";s:3:"ï°«";s:4:"غج";s:3:"ï°¬";s:4:"غم";s:3:"ï°­";s:4:"Ùج";s:3:"ï°®";s:4:"ÙØ­";s:3:"ï°¯";s:4:"ÙØ®";s:3:"ï°°";s:4:"ÙÙ…";s:3:"ï°±";s:4:"ÙÙ‰";s:3:"ï°²";s:4:"ÙÙŠ";s:3:"ï°³";s:4:"قح";s:3:"ï°´";s:4:"قم";s:3:"ï°µ";s:4:"قى";s:3:"ï°¶";s:4:"قي";s:3:"ï°·";s:4:"كا";s:3:"ï°¸";s:4:"كج";s:3:"ï°¹";s:4:"كح";s:3:"ï°º";s:4:"كخ";s:3:"ï°»";s:4:"كل";s:3:"ï°¼";s:4:"كم";s:3:"ï°½";s:4:"كى";s:3:"ï°¾";s:4:"كي";s:3:"ï°¿";s:4:"لج";s:3:"ï±€";s:4:"لح";s:3:"ï±";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ï±…";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ï±";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ï±";s:4:"نى";s:3:"ï±";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ï±’";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ï±”";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ï±–";s:4:"يح";s:3:"ï±—";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ï±™";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ï±›";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ï±";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ÙÙ‘";s:3:"ï± ";s:5:" ÙŽÙ‘";s:3:"ﱡ";s:5:" ÙÙ‘";s:3:"ï±¢";s:5:" ÙÙ‘";s:3:"ï±£";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ï±¥";s:6:"ئز";s:3:"ﱦ";s:6:"ÙŠÙ”Ù…";s:3:"ﱧ";s:6:"ÙŠÙ”Ù†";s:3:"ﱨ";s:6:"ÙŠÙ”Ù‰";s:3:"ﱩ";s:6:"ÙŠÙ”ÙŠ";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ï±­";s:4:"بن";s:3:"ï±®";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ï±°";s:4:"تر";s:3:"ï±±";s:4:"تز";s:3:"ï±²";s:4:"تم";s:3:"ï±³";s:4:"تن";s:3:"ï±´";s:4:"تى";s:3:"ï±µ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ï±·";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ï±¹";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ï±»";s:4:"ثي";s:3:"ï±¼";s:4:"ÙÙ‰";s:3:"ï±½";s:4:"ÙÙŠ";s:3:"ï±¾";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ï²€";s:4:"كا";s:3:"ï²";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ï²…";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ï²";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ï²";s:4:"ني";s:3:"ï²";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ï²’";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ï²”";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ï²–";s:4:"يي";s:3:"ï²—";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ï²™";s:6:"ئخ";s:3:"ﲚ";s:6:"ÙŠÙ”Ù…";s:3:"ï²›";s:6:"ÙŠÙ”Ù‡";s:3:"ﲜ";s:4:"بج";s:3:"ï²";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ï² ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ï²¢";s:4:"تح";s:3:"ï²£";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ï²¥";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ï²­";s:4:"سج";s:3:"ï²®";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ï²°";s:4:"سم";s:3:"ï²±";s:4:"صح";s:3:"ï²²";s:4:"صخ";s:3:"ï²³";s:4:"صم";s:3:"ï²´";s:4:"ضج";s:3:"ï²µ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ï²·";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ï²¹";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ï²»";s:4:"عم";s:3:"ï²¼";s:4:"غج";s:3:"ï²½";s:4:"غم";s:3:"ï²¾";s:4:"Ùج";s:3:"ﲿ";s:4:"ÙØ­";s:3:"ï³€";s:4:"ÙØ®";s:3:"ï³";s:4:"ÙÙ…";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ï³…";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ï³";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ï³";s:4:"مح";s:3:"ï³";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ï³’";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ï³”";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ï³–";s:4:"نه";s:3:"ï³—";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ï³™";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ï³›";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ï³";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ÙŠÙ”Ù…";s:3:"ï³ ";s:6:"ÙŠÙ”Ù‡";s:3:"ﳡ";s:4:"بم";s:3:"ï³¢";s:4:"به";s:3:"ï³£";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ï³¥";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ï³­";s:4:"لم";s:3:"ï³®";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ï³°";s:4:"يم";s:3:"ï³±";s:4:"يه";s:3:"ï³²";s:6:"Ù€ÙŽÙ‘";s:3:"ï³³";s:6:"Ù€ÙÙ‘";s:3:"ï³´";s:6:"Ù€ÙÙ‘";s:3:"ï³µ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ï³·";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ï³¹";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ï³»";s:4:"سى";s:3:"ï³¼";s:4:"سي";s:3:"ï³½";s:4:"شى";s:3:"ï³¾";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ï´€";s:4:"حي";s:3:"ï´";s:4:"جى";s:3:"ï´‚";s:4:"جي";s:3:"ï´ƒ";s:4:"خى";s:3:"ï´„";s:4:"خي";s:3:"ï´…";s:4:"صى";s:3:"ï´†";s:4:"صي";s:3:"ï´‡";s:4:"ضى";s:3:"ï´ˆ";s:4:"ضي";s:3:"ï´‰";s:4:"شج";s:3:"ï´Š";s:4:"شح";s:3:"ï´‹";s:4:"شخ";s:3:"ï´Œ";s:4:"شم";s:3:"ï´";s:4:"شر";s:3:"ï´Ž";s:4:"سر";s:3:"ï´";s:4:"صر";s:3:"ï´";s:4:"ضر";s:3:"ï´‘";s:4:"طى";s:3:"ï´’";s:4:"طي";s:3:"ï´“";s:4:"عى";s:3:"ï´”";s:4:"عي";s:3:"ï´•";s:4:"غى";s:3:"ï´–";s:4:"غي";s:3:"ï´—";s:4:"سى";s:3:"ï´˜";s:4:"سي";s:3:"ï´™";s:4:"شى";s:3:"ï´š";s:4:"شي";s:3:"ï´›";s:4:"حى";s:3:"ï´œ";s:4:"حي";s:3:"ï´";s:4:"جى";s:3:"ï´ž";s:4:"جي";s:3:"ï´Ÿ";s:4:"خى";s:3:"ï´ ";s:4:"خي";s:3:"ï´¡";s:4:"صى";s:3:"ï´¢";s:4:"صي";s:3:"ï´£";s:4:"ضى";s:3:"ï´¤";s:4:"ضي";s:3:"ï´¥";s:4:"شج";s:3:"ï´¦";s:4:"شح";s:3:"ï´§";s:4:"شخ";s:3:"ï´¨";s:4:"شم";s:3:"ï´©";s:4:"شر";s:3:"ï´ª";s:4:"سر";s:3:"ï´«";s:4:"صر";s:3:"ï´¬";s:4:"ضر";s:3:"ï´­";s:4:"شج";s:3:"ï´®";s:4:"شح";s:3:"ï´¯";s:4:"شخ";s:3:"ï´°";s:4:"شم";s:3:"ï´±";s:4:"سه";s:3:"ï´²";s:4:"شه";s:3:"ï´³";s:4:"طم";s:3:"ï´´";s:4:"سج";s:3:"ï´µ";s:4:"سح";s:3:"ï´¶";s:4:"سخ";s:3:"ï´·";s:4:"شج";s:3:"ï´¸";s:4:"شح";s:3:"ï´¹";s:4:"شخ";s:3:"ï´º";s:4:"طم";s:3:"ï´»";s:4:"ظم";s:3:"ï´¼";s:4:"اً";s:3:"ï´½";s:4:"اً";s:3:"ïµ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ïµ’";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ïµ”";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ïµ–";s:6:"تمح";s:3:"ïµ—";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ïµ™";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ïµ›";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ïµ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ïµ ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ïµ¢";s:6:"سمم";s:3:"ïµ£";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ïµ¥";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ïµ­";s:6:"شمم";s:3:"ïµ®";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ïµ°";s:6:"ضخم";s:3:"ïµ±";s:6:"طمح";s:3:"ïµ²";s:6:"طمح";s:3:"ïµ³";s:6:"طمم";s:3:"ïµ´";s:6:"طمي";s:3:"ïµµ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ïµ·";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ïµ¹";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ïµ»";s:6:"غمى";s:3:"ïµ¼";s:6:"Ùخم";s:3:"ïµ½";s:6:"Ùخم";s:3:"ïµ¾";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ï¶";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ï¶";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ï¶";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ï¶";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ï·€";s:6:"مجي";s:3:"ï·";s:6:"Ùمي";s:3:"ï·‚";s:6:"بحي";s:3:"ï·ƒ";s:6:"كمم";s:3:"ï·„";s:6:"عجم";s:3:"ï·…";s:6:"صمم";s:3:"ï·†";s:6:"سخي";s:3:"ï·‡";s:6:"نجي";s:3:"ï·°";s:6:"صلے";s:3:"ï·±";s:6:"قلے";s:3:"ï·²";s:8:"الله";s:3:"ï·³";s:8:"اكبر";s:3:"ï·´";s:8:"محمد";s:3:"ï·µ";s:8:"صلعم";s:3:"ï·¶";s:8:"رسول";s:3:"ï··";s:8:"عليه";s:3:"ï·¸";s:8:"وسلم";s:3:"ï·¹";s:6:"صلى";s:3:"ï·º";s:33:"صلى الله عليه وسلم";s:3:"ï·»";s:15:"جل جلاله";s:3:"ï·¼";s:8:"ریال";s:3:"ï¸";s:1:",";s:3:"︑";s:3:"ã€";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"ã€";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"ï¹€";s:3:"〉";s:3:"ï¹";s:3:"「";s:3:"﹂";s:3:"ã€";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"ã€";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" Ì…";s:3:"﹊";s:3:" Ì…";s:3:"﹋";s:3:" Ì…";s:3:"﹌";s:3:" Ì…";s:3:"ï¹";s:1:"_";s:3:"﹎";s:1:"_";s:3:"ï¹";s:1:"_";s:3:"ï¹";s:1:",";s:3:"﹑";s:3:"ã€";s:3:"ï¹’";s:1:".";s:3:"ï¹”";s:1:";";s:3:"﹕";s:1:":";s:3:"ï¹–";s:1:"?";s:3:"ï¹—";s:1:"!";s:3:"﹘";s:3:"—";s:3:"ï¹™";s:1:"(";s:3:"﹚";s:1:")";s:3:"ï¹›";s:1:"{";s:3:"﹜";s:1:"}";s:3:"ï¹";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"ï¹ ";s:1:"&";s:3:"﹡";s:1:"*";s:3:"ï¹¢";s:1:"+";s:3:"ï¹£";s:1:"-";s:3:"﹤";s:1:"<";s:3:"ï¹¥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ï¹°";s:3:" Ù‹";s:3:"ï¹±";s:4:"ـً";s:3:"ï¹²";s:3:" ÙŒ";s:3:"ï¹´";s:3:" Ù";s:3:"ﹶ";s:3:" ÙŽ";s:3:"ï¹·";s:4:"Ù€ÙŽ";s:3:"ﹸ";s:3:" Ù";s:3:"ï¹¹";s:4:"Ù€Ù";s:3:"ﹺ";s:3:" Ù";s:3:"ï¹»";s:4:"Ù€Ù";s:3:"ï¹¼";s:3:" Ù‘";s:3:"ï¹½";s:4:"ـّ";s:3:"ï¹¾";s:3:" Ù’";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"Ø¡";s:3:"ïº";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ÙˆÙ”";s:3:"ﺆ";s:4:"ÙˆÙ”";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ÙŠÙ”";s:3:"ﺊ";s:4:"ÙŠÙ”";s:3:"ﺋ";s:4:"ÙŠÙ”";s:3:"ﺌ";s:4:"ÙŠÙ”";s:3:"ïº";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ïº";s:2:"ب";s:3:"ïº";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"Ø©";s:3:"ﺔ";s:2:"Ø©";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"Ø«";s:3:"ﺚ";s:2:"Ø«";s:3:"ﺛ";s:2:"Ø«";s:3:"ﺜ";s:2:"Ø«";s:3:"ïº";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"Ø­";s:3:"ﺢ";s:2:"Ø­";s:3:"ﺣ";s:2:"Ø­";s:3:"ﺤ";s:2:"Ø­";s:3:"ﺥ";s:2:"Ø®";s:3:"ﺦ";s:2:"Ø®";s:3:"ﺧ";s:2:"Ø®";s:3:"ﺨ";s:2:"Ø®";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"Ø°";s:3:"ﺬ";s:2:"Ø°";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"Ø´";s:3:"ﺶ";s:2:"Ø´";s:3:"ﺷ";s:2:"Ø´";s:3:"ﺸ";s:2:"Ø´";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ï»";s:2:"Ø·";s:3:"ﻂ";s:2:"Ø·";s:3:"ﻃ";s:2:"Ø·";s:3:"ﻄ";s:2:"Ø·";s:3:"ï»…";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ï»";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ï»";s:2:"غ";s:3:"ï»";s:2:"غ";s:3:"ﻑ";s:2:"Ù";s:3:"ï»’";s:2:"Ù";s:3:"ﻓ";s:2:"Ù";s:3:"ï»”";s:2:"Ù";s:3:"ﻕ";s:2:"Ù‚";s:3:"ï»–";s:2:"Ù‚";s:3:"ï»—";s:2:"Ù‚";s:3:"ﻘ";s:2:"Ù‚";s:3:"ï»™";s:2:"Ùƒ";s:3:"ﻚ";s:2:"Ùƒ";s:3:"ï»›";s:2:"Ùƒ";s:3:"ﻜ";s:2:"Ùƒ";s:3:"ï»";s:2:"Ù„";s:3:"ﻞ";s:2:"Ù„";s:3:"ﻟ";s:2:"Ù„";s:3:"ï» ";s:2:"Ù„";s:3:"ﻡ";s:2:"Ù…";s:3:"ﻢ";s:2:"Ù…";s:3:"ﻣ";s:2:"Ù…";s:3:"ﻤ";s:2:"Ù…";s:3:"ﻥ";s:2:"Ù†";s:3:"ﻦ";s:2:"Ù†";s:3:"ﻧ";s:2:"Ù†";s:3:"ﻨ";s:2:"Ù†";s:3:"ﻩ";s:2:"Ù‡";s:3:"ﻪ";s:2:"Ù‡";s:3:"ﻫ";s:2:"Ù‡";s:3:"ﻬ";s:2:"Ù‡";s:3:"ï»­";s:2:"Ùˆ";s:3:"ï»®";s:2:"Ùˆ";s:3:"ﻯ";s:2:"Ù‰";s:3:"ï»°";s:2:"Ù‰";s:3:"ï»±";s:2:"ÙŠ";s:3:"ﻲ";s:2:"ÙŠ";s:3:"ﻳ";s:2:"ÙŠ";s:3:"ï»´";s:2:"ÙŠ";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ï»·";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ï»»";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"ï¼";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"ï¼…";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"\'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"ï¼";s:1:"-";s:3:".";s:1:".";s:3:"ï¼";s:1:"/";s:3:"ï¼";s:1:"0";s:3:"1";s:1:"1";s:3:"ï¼’";s:1:"2";s:3:"3";s:1:"3";s:3:"ï¼”";s:1:"4";s:3:"5";s:1:"5";s:3:"ï¼–";s:1:"6";s:3:"ï¼—";s:1:"7";s:3:"8";s:1:"8";s:3:"ï¼™";s:1:"9";s:3:":";s:1:":";s:3:"ï¼›";s:1:";";s:3:"<";s:1:"<";s:3:"ï¼";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"ï¼ ";s:1:"@";s:3:"A";s:1:"A";s:3:"ï¼¢";s:1:"B";s:3:"ï¼£";s:1:"C";s:3:"D";s:1:"D";s:3:"ï¼¥";s:1:"E";s:3:"F";s:1:"F";s:3:"G";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"ï¼­";s:1:"M";s:3:"ï¼®";s:1:"N";s:3:"O";s:1:"O";s:3:"ï¼°";s:1:"P";s:3:"ï¼±";s:1:"Q";s:3:"ï¼²";s:1:"R";s:3:"ï¼³";s:1:"S";s:3:"ï¼´";s:1:"T";s:3:"ï¼µ";s:1:"U";s:3:"V";s:1:"V";s:3:"ï¼·";s:1:"W";s:3:"X";s:1:"X";s:3:"ï¼¹";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"ï¼»";s:1:"[";s:3:"ï¼¼";s:1:"\\";s:3:"ï¼½";s:1:"]";s:3:"ï¼¾";s:1:"^";s:3:"_";s:1:"_";s:3:"ï½€";s:1:"`";s:3:"ï½";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"ï½…";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"ï½";s:1:"m";s:3:"n";s:1:"n";s:3:"ï½";s:1:"o";s:3:"ï½";s:1:"p";s:3:"q";s:1:"q";s:3:"ï½’";s:1:"r";s:3:"s";s:1:"s";s:3:"ï½”";s:1:"t";s:3:"u";s:1:"u";s:3:"ï½–";s:1:"v";s:3:"ï½—";s:1:"w";s:3:"x";s:1:"x";s:3:"ï½™";s:1:"y";s:3:"z";s:1:"z";s:3:"ï½›";s:1:"{";s:3:"|";s:1:"|";s:3:"ï½";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"ï½ ";s:3:"⦆";s:3:"。";s:3:"。";s:3:"ï½¢";s:3:"「";s:3:"ï½£";s:3:"ã€";s:3:"、";s:3:"ã€";s:3:"ï½¥";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ァ";s:3:"ã‚¡";s:3:"ィ";s:3:"ã‚£";s:3:"ゥ";s:3:"ã‚¥";s:3:"ェ";s:3:"ェ";s:3:"ォ";s:3:"ã‚©";s:3:"ャ";s:3:"ャ";s:3:"ï½­";s:3:"ュ";s:3:"ï½®";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ï½°";s:3:"ー";s:3:"ï½±";s:3:"ã‚¢";s:3:"ï½²";s:3:"イ";s:3:"ï½³";s:3:"ウ";s:3:"ï½´";s:3:"エ";s:3:"ï½µ";s:3:"オ";s:3:"カ";s:3:"ã‚«";s:3:"ï½·";s:3:"ã‚­";s:3:"ク";s:3:"ク";s:3:"ï½¹";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"ï½»";s:3:"サ";s:3:"ï½¼";s:3:"ã‚·";s:3:"ï½½";s:3:"ス";s:3:"ï½¾";s:3:"ã‚»";s:3:"ソ";s:3:"ソ";s:3:"ï¾€";s:3:"ã‚¿";s:3:"ï¾";s:3:"ãƒ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ï¾…";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ãƒ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ãƒ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ï¾";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"ï¾";s:3:"マ";s:3:"ï¾";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"ï¾’";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ï¾”";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ï¾–";s:3:"ヨ";s:3:"ï¾—";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ï¾™";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ï¾›";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ï¾";s:3:"ン";s:3:"゙";s:3:"ã‚™";s:3:"゚";s:3:"ã‚š";s:3:"ï¾ ";s:3:"á… ";s:3:"ᄀ";s:3:"á„€";s:3:"ï¾¢";s:3:"á„";s:3:"ï¾£";s:3:"ᆪ";s:3:"ᄂ";s:3:"á„‚";s:3:"ï¾¥";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ᄃ";s:3:"ᄃ";s:3:"ᄄ";s:3:"á„„";s:3:"ᄅ";s:3:"á„…";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ï¾­";s:3:"ᆳ";s:3:"ï¾®";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ï¾°";s:3:"á„š";s:3:"ï¾±";s:3:"ᄆ";s:3:"ï¾²";s:3:"ᄇ";s:3:"ï¾³";s:3:"ᄈ";s:3:"ï¾´";s:3:"á„¡";s:3:"ï¾µ";s:3:"ᄉ";s:3:"ᄊ";s:3:"á„Š";s:3:"ï¾·";s:3:"á„‹";s:3:"ᄌ";s:3:"á„Œ";s:3:"ï¾¹";s:3:"á„";s:3:"ᄎ";s:3:"á„Ž";s:3:"ï¾»";s:3:"á„";s:3:"ï¾¼";s:3:"á„";s:3:"ï¾½";s:3:"á„‘";s:3:"ï¾¾";s:3:"á„’";s:3:"ï¿‚";s:3:"á…¡";s:3:"ᅢ";s:3:"á…¢";s:3:"ï¿„";s:3:"á…£";s:3:"ï¿…";s:3:"á…¤";s:3:"ᅥ";s:3:"á…¥";s:3:"ᅦ";s:3:"á…¦";s:3:"ï¿Š";s:3:"á…§";s:3:"ï¿‹";s:3:"á…¨";s:3:"ï¿Œ";s:3:"á…©";s:3:"ï¿";s:3:"á…ª";s:3:"ï¿Ž";s:3:"á…«";s:3:"ï¿";s:3:"á…¬";s:3:"ï¿’";s:3:"á…­";s:3:"ï¿“";s:3:"á…®";s:3:"ï¿”";s:3:"á…¯";s:3:"ï¿•";s:3:"á…°";s:3:"ï¿–";s:3:"á…±";s:3:"ï¿—";s:3:"á…²";s:3:"ï¿š";s:3:"á…³";s:3:"ï¿›";s:3:"á…´";s:3:"ï¿œ";s:3:"á…µ";s:3:"ï¿ ";s:2:"¢";s:3:"ï¿¡";s:2:"£";s:3:"ï¿¢";s:2:"¬";s:3:"ï¿£";s:3:" Ì„";s:3:"¦";s:2:"¦";s:3:"ï¿¥";s:2:"Â¥";s:3:"₩";s:3:"â‚©";s:3:"│";s:3:"│";s:3:"ï¿©";s:3:"â†";s:3:"↑";s:3:"↑";s:3:"ï¿«";s:3:"→";s:3:"↓";s:3:"↓";s:3:"ï¿­";s:3:"â– ";s:3:"ï¿®";s:3:"â—‹";s:4:"ð…ž";s:8:"ð…—ð…¥";s:4:"ð…Ÿ";s:8:"ð…˜ð…¥";s:4:"ð… ";s:12:"ð…˜ð…¥ð…®";s:4:"ð…¡";s:12:"ð…˜ð…¥ð…¯";s:4:"ð…¢";s:12:"ð…˜ð…¥ð…°";s:4:"ð…£";s:12:"ð…˜ð…¥ð…±";s:4:"ð…¤";s:12:"ð…˜ð…¥ð…²";s:4:"ð†»";s:8:"ð†¹ð…¥";s:4:"ð†¼";s:8:"ð†ºð…¥";s:4:"ð†½";s:12:"ð†¹ð…¥ð…®";s:4:"ð†¾";s:12:"ð†ºð…¥ð…®";s:4:"ð†¿";s:12:"ð†¹ð…¥ð…¯";s:4:"ð‡€";s:12:"ð†ºð…¥ð…¯";s:4:"ð€";s:1:"A";s:4:"ð";s:1:"B";s:4:"ð‚";s:1:"C";s:4:"ðƒ";s:1:"D";s:4:"ð„";s:1:"E";s:4:"ð…";s:1:"F";s:4:"ð†";s:1:"G";s:4:"ð‡";s:1:"H";s:4:"ðˆ";s:1:"I";s:4:"ð‰";s:1:"J";s:4:"ðŠ";s:1:"K";s:4:"ð‹";s:1:"L";s:4:"ðŒ";s:1:"M";s:4:"ð";s:1:"N";s:4:"ðŽ";s:1:"O";s:4:"ð";s:1:"P";s:4:"ð";s:1:"Q";s:4:"ð‘";s:1:"R";s:4:"ð’";s:1:"S";s:4:"ð“";s:1:"T";s:4:"ð”";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð–";s:1:"W";s:4:"ð—";s:1:"X";s:4:"ð˜";s:1:"Y";s:4:"ð™";s:1:"Z";s:4:"ðš";s:1:"a";s:4:"ð›";s:1:"b";s:4:"ðœ";s:1:"c";s:4:"ð";s:1:"d";s:4:"ðž";s:1:"e";s:4:"ðŸ";s:1:"f";s:4:"ð ";s:1:"g";s:4:"ð¡";s:1:"h";s:4:"ð¢";s:1:"i";s:4:"ð£";s:1:"j";s:4:"ð¤";s:1:"k";s:4:"ð¥";s:1:"l";s:4:"ð¦";s:1:"m";s:4:"ð§";s:1:"n";s:4:"ð¨";s:1:"o";s:4:"ð©";s:1:"p";s:4:"ðª";s:1:"q";s:4:"ð«";s:1:"r";s:4:"ð¬";s:1:"s";s:4:"ð­";s:1:"t";s:4:"ð®";s:1:"u";s:4:"ð¯";s:1:"v";s:4:"ð°";s:1:"w";s:4:"ð±";s:1:"x";s:4:"ð²";s:1:"y";s:4:"ð³";s:1:"z";s:4:"ð´";s:1:"A";s:4:"ðµ";s:1:"B";s:4:"ð¶";s:1:"C";s:4:"ð·";s:1:"D";s:4:"ð¸";s:1:"E";s:4:"ð¹";s:1:"F";s:4:"ðº";s:1:"G";s:4:"ð»";s:1:"H";s:4:"ð¼";s:1:"I";s:4:"ð½";s:1:"J";s:4:"ð¾";s:1:"K";s:4:"ð¿";s:1:"L";s:4:"ð‘€";s:1:"M";s:4:"ð‘";s:1:"N";s:4:"ð‘‚";s:1:"O";s:4:"ð‘ƒ";s:1:"P";s:4:"ð‘„";s:1:"Q";s:4:"ð‘…";s:1:"R";s:4:"ð‘†";s:1:"S";s:4:"ð‘‡";s:1:"T";s:4:"ð‘ˆ";s:1:"U";s:4:"ð‘‰";s:1:"V";s:4:"ð‘Š";s:1:"W";s:4:"ð‘‹";s:1:"X";s:4:"ð‘Œ";s:1:"Y";s:4:"ð‘";s:1:"Z";s:4:"ð‘Ž";s:1:"a";s:4:"ð‘";s:1:"b";s:4:"ð‘";s:1:"c";s:4:"ð‘‘";s:1:"d";s:4:"ð‘’";s:1:"e";s:4:"ð‘“";s:1:"f";s:4:"ð‘”";s:1:"g";s:4:"ð‘–";s:1:"i";s:4:"ð‘—";s:1:"j";s:4:"ð‘˜";s:1:"k";s:4:"ð‘™";s:1:"l";s:4:"ð‘š";s:1:"m";s:4:"ð‘›";s:1:"n";s:4:"ð‘œ";s:1:"o";s:4:"ð‘";s:1:"p";s:4:"ð‘ž";s:1:"q";s:4:"ð‘Ÿ";s:1:"r";s:4:"ð‘ ";s:1:"s";s:4:"ð‘¡";s:1:"t";s:4:"ð‘¢";s:1:"u";s:4:"ð‘£";s:1:"v";s:4:"ð‘¤";s:1:"w";s:4:"ð‘¥";s:1:"x";s:4:"ð‘¦";s:1:"y";s:4:"ð‘§";s:1:"z";s:4:"ð‘¨";s:1:"A";s:4:"ð‘©";s:1:"B";s:4:"ð‘ª";s:1:"C";s:4:"ð‘«";s:1:"D";s:4:"ð‘¬";s:1:"E";s:4:"ð‘­";s:1:"F";s:4:"ð‘®";s:1:"G";s:4:"ð‘¯";s:1:"H";s:4:"ð‘°";s:1:"I";s:4:"ð‘±";s:1:"J";s:4:"ð‘²";s:1:"K";s:4:"ð‘³";s:1:"L";s:4:"ð‘´";s:1:"M";s:4:"ð‘µ";s:1:"N";s:4:"ð‘¶";s:1:"O";s:4:"ð‘·";s:1:"P";s:4:"ð‘¸";s:1:"Q";s:4:"ð‘¹";s:1:"R";s:4:"ð‘º";s:1:"S";s:4:"ð‘»";s:1:"T";s:4:"ð‘¼";s:1:"U";s:4:"ð‘½";s:1:"V";s:4:"ð‘¾";s:1:"W";s:4:"ð‘¿";s:1:"X";s:4:"ð’€";s:1:"Y";s:4:"ð’";s:1:"Z";s:4:"ð’‚";s:1:"a";s:4:"ð’ƒ";s:1:"b";s:4:"ð’„";s:1:"c";s:4:"ð’…";s:1:"d";s:4:"ð’†";s:1:"e";s:4:"ð’‡";s:1:"f";s:4:"ð’ˆ";s:1:"g";s:4:"ð’‰";s:1:"h";s:4:"ð’Š";s:1:"i";s:4:"ð’‹";s:1:"j";s:4:"ð’Œ";s:1:"k";s:4:"ð’";s:1:"l";s:4:"ð’Ž";s:1:"m";s:4:"ð’";s:1:"n";s:4:"ð’";s:1:"o";s:4:"ð’‘";s:1:"p";s:4:"ð’’";s:1:"q";s:4:"ð’“";s:1:"r";s:4:"ð’”";s:1:"s";s:4:"ð’•";s:1:"t";s:4:"ð’–";s:1:"u";s:4:"ð’—";s:1:"v";s:4:"ð’˜";s:1:"w";s:4:"ð’™";s:1:"x";s:4:"ð’š";s:1:"y";s:4:"ð’›";s:1:"z";s:4:"ð’œ";s:1:"A";s:4:"ð’ž";s:1:"C";s:4:"ð’Ÿ";s:1:"D";s:4:"ð’¢";s:1:"G";s:4:"ð’¥";s:1:"J";s:4:"ð’¦";s:1:"K";s:4:"ð’©";s:1:"N";s:4:"ð’ª";s:1:"O";s:4:"ð’«";s:1:"P";s:4:"ð’¬";s:1:"Q";s:4:"ð’®";s:1:"S";s:4:"ð’¯";s:1:"T";s:4:"ð’°";s:1:"U";s:4:"ð’±";s:1:"V";s:4:"ð’²";s:1:"W";s:4:"ð’³";s:1:"X";s:4:"ð’´";s:1:"Y";s:4:"ð’µ";s:1:"Z";s:4:"ð’¶";s:1:"a";s:4:"ð’·";s:1:"b";s:4:"ð’¸";s:1:"c";s:4:"ð’¹";s:1:"d";s:4:"ð’»";s:1:"f";s:4:"ð’½";s:1:"h";s:4:"ð’¾";s:1:"i";s:4:"ð’¿";s:1:"j";s:4:"ð“€";s:1:"k";s:4:"ð“";s:1:"l";s:4:"ð“‚";s:1:"m";s:4:"ð“ƒ";s:1:"n";s:4:"ð“…";s:1:"p";s:4:"ð“†";s:1:"q";s:4:"ð“‡";s:1:"r";s:4:"ð“ˆ";s:1:"s";s:4:"ð“‰";s:1:"t";s:4:"ð“Š";s:1:"u";s:4:"ð“‹";s:1:"v";s:4:"ð“Œ";s:1:"w";s:4:"ð“";s:1:"x";s:4:"ð“Ž";s:1:"y";s:4:"ð“";s:1:"z";s:4:"ð“";s:1:"A";s:4:"ð“‘";s:1:"B";s:4:"ð“’";s:1:"C";s:4:"ð““";s:1:"D";s:4:"ð“”";s:1:"E";s:4:"ð“•";s:1:"F";s:4:"ð“–";s:1:"G";s:4:"ð“—";s:1:"H";s:4:"ð“˜";s:1:"I";s:4:"ð“™";s:1:"J";s:4:"ð“š";s:1:"K";s:4:"ð“›";s:1:"L";s:4:"ð“œ";s:1:"M";s:4:"ð“";s:1:"N";s:4:"ð“ž";s:1:"O";s:4:"ð“Ÿ";s:1:"P";s:4:"ð“ ";s:1:"Q";s:4:"ð“¡";s:1:"R";s:4:"ð“¢";s:1:"S";s:4:"ð“£";s:1:"T";s:4:"ð“¤";s:1:"U";s:4:"ð“¥";s:1:"V";s:4:"ð“¦";s:1:"W";s:4:"ð“§";s:1:"X";s:4:"ð“¨";s:1:"Y";s:4:"ð“©";s:1:"Z";s:4:"ð“ª";s:1:"a";s:4:"ð“«";s:1:"b";s:4:"ð“¬";s:1:"c";s:4:"ð“­";s:1:"d";s:4:"ð“®";s:1:"e";s:4:"ð“¯";s:1:"f";s:4:"ð“°";s:1:"g";s:4:"ð“±";s:1:"h";s:4:"ð“²";s:1:"i";s:4:"ð“³";s:1:"j";s:4:"ð“´";s:1:"k";s:4:"ð“µ";s:1:"l";s:4:"ð“¶";s:1:"m";s:4:"ð“·";s:1:"n";s:4:"ð“¸";s:1:"o";s:4:"ð“¹";s:1:"p";s:4:"ð“º";s:1:"q";s:4:"ð“»";s:1:"r";s:4:"ð“¼";s:1:"s";s:4:"ð“½";s:1:"t";s:4:"ð“¾";s:1:"u";s:4:"ð“¿";s:1:"v";s:4:"ð”€";s:1:"w";s:4:"ð”";s:1:"x";s:4:"ð”‚";s:1:"y";s:4:"ð”ƒ";s:1:"z";s:4:"ð”„";s:1:"A";s:4:"ð”…";s:1:"B";s:4:"ð”‡";s:1:"D";s:4:"ð”ˆ";s:1:"E";s:4:"ð”‰";s:1:"F";s:4:"ð”Š";s:1:"G";s:4:"ð”";s:1:"J";s:4:"ð”Ž";s:1:"K";s:4:"ð”";s:1:"L";s:4:"ð”";s:1:"M";s:4:"ð”‘";s:1:"N";s:4:"ð”’";s:1:"O";s:4:"ð”“";s:1:"P";s:4:"ð””";s:1:"Q";s:4:"ð”–";s:1:"S";s:4:"ð”—";s:1:"T";s:4:"ð”˜";s:1:"U";s:4:"ð”™";s:1:"V";s:4:"ð”š";s:1:"W";s:4:"ð”›";s:1:"X";s:4:"ð”œ";s:1:"Y";s:4:"ð”ž";s:1:"a";s:4:"ð”Ÿ";s:1:"b";s:4:"ð” ";s:1:"c";s:4:"ð”¡";s:1:"d";s:4:"ð”¢";s:1:"e";s:4:"ð”£";s:1:"f";s:4:"ð”¤";s:1:"g";s:4:"ð”¥";s:1:"h";s:4:"ð”¦";s:1:"i";s:4:"ð”§";s:1:"j";s:4:"ð”¨";s:1:"k";s:4:"ð”©";s:1:"l";s:4:"ð”ª";s:1:"m";s:4:"ð”«";s:1:"n";s:4:"ð”¬";s:1:"o";s:4:"ð”­";s:1:"p";s:4:"ð”®";s:1:"q";s:4:"ð”¯";s:1:"r";s:4:"ð”°";s:1:"s";s:4:"ð”±";s:1:"t";s:4:"ð”²";s:1:"u";s:4:"ð”³";s:1:"v";s:4:"ð”´";s:1:"w";s:4:"ð”µ";s:1:"x";s:4:"ð”¶";s:1:"y";s:4:"ð”·";s:1:"z";s:4:"ð”¸";s:1:"A";s:4:"ð”¹";s:1:"B";s:4:"ð”»";s:1:"D";s:4:"ð”¼";s:1:"E";s:4:"ð”½";s:1:"F";s:4:"ð”¾";s:1:"G";s:4:"ð•€";s:1:"I";s:4:"ð•";s:1:"J";s:4:"ð•‚";s:1:"K";s:4:"ð•ƒ";s:1:"L";s:4:"ð•„";s:1:"M";s:4:"ð•†";s:1:"O";s:4:"ð•Š";s:1:"S";s:4:"ð•‹";s:1:"T";s:4:"ð•Œ";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð•Ž";s:1:"W";s:4:"ð•";s:1:"X";s:4:"ð•";s:1:"Y";s:4:"ð•’";s:1:"a";s:4:"ð•“";s:1:"b";s:4:"ð•”";s:1:"c";s:4:"ð••";s:1:"d";s:4:"ð•–";s:1:"e";s:4:"ð•—";s:1:"f";s:4:"ð•˜";s:1:"g";s:4:"ð•™";s:1:"h";s:4:"ð•š";s:1:"i";s:4:"ð•›";s:1:"j";s:4:"ð•œ";s:1:"k";s:4:"ð•";s:1:"l";s:4:"ð•ž";s:1:"m";s:4:"ð•Ÿ";s:1:"n";s:4:"ð• ";s:1:"o";s:4:"ð•¡";s:1:"p";s:4:"ð•¢";s:1:"q";s:4:"ð•£";s:1:"r";s:4:"ð•¤";s:1:"s";s:4:"ð•¥";s:1:"t";s:4:"ð•¦";s:1:"u";s:4:"ð•§";s:1:"v";s:4:"ð•¨";s:1:"w";s:4:"ð•©";s:1:"x";s:4:"ð•ª";s:1:"y";s:4:"ð•«";s:1:"z";s:4:"ð•¬";s:1:"A";s:4:"ð•­";s:1:"B";s:4:"ð•®";s:1:"C";s:4:"ð•¯";s:1:"D";s:4:"ð•°";s:1:"E";s:4:"ð•±";s:1:"F";s:4:"ð•²";s:1:"G";s:4:"ð•³";s:1:"H";s:4:"ð•´";s:1:"I";s:4:"ð•µ";s:1:"J";s:4:"ð•¶";s:1:"K";s:4:"ð•·";s:1:"L";s:4:"ð•¸";s:1:"M";s:4:"ð•¹";s:1:"N";s:4:"ð•º";s:1:"O";s:4:"ð•»";s:1:"P";s:4:"ð•¼";s:1:"Q";s:4:"ð•½";s:1:"R";s:4:"ð•¾";s:1:"S";s:4:"ð•¿";s:1:"T";s:4:"ð–€";s:1:"U";s:4:"ð–";s:1:"V";s:4:"ð–‚";s:1:"W";s:4:"ð–ƒ";s:1:"X";s:4:"ð–„";s:1:"Y";s:4:"ð–…";s:1:"Z";s:4:"ð–†";s:1:"a";s:4:"ð–‡";s:1:"b";s:4:"ð–ˆ";s:1:"c";s:4:"ð–‰";s:1:"d";s:4:"ð–Š";s:1:"e";s:4:"ð–‹";s:1:"f";s:4:"ð–Œ";s:1:"g";s:4:"ð–";s:1:"h";s:4:"ð–Ž";s:1:"i";s:4:"ð–";s:1:"j";s:4:"ð–";s:1:"k";s:4:"ð–‘";s:1:"l";s:4:"ð–’";s:1:"m";s:4:"ð–“";s:1:"n";s:4:"ð–”";s:1:"o";s:4:"ð–•";s:1:"p";s:4:"ð––";s:1:"q";s:4:"ð–—";s:1:"r";s:4:"ð–˜";s:1:"s";s:4:"ð–™";s:1:"t";s:4:"ð–š";s:1:"u";s:4:"ð–›";s:1:"v";s:4:"ð–œ";s:1:"w";s:4:"ð–";s:1:"x";s:4:"ð–ž";s:1:"y";s:4:"ð–Ÿ";s:1:"z";s:4:"ð– ";s:1:"A";s:4:"ð–¡";s:1:"B";s:4:"ð–¢";s:1:"C";s:4:"ð–£";s:1:"D";s:4:"ð–¤";s:1:"E";s:4:"ð–¥";s:1:"F";s:4:"ð–¦";s:1:"G";s:4:"ð–§";s:1:"H";s:4:"ð–¨";s:1:"I";s:4:"ð–©";s:1:"J";s:4:"ð–ª";s:1:"K";s:4:"ð–«";s:1:"L";s:4:"ð–¬";s:1:"M";s:4:"ð–­";s:1:"N";s:4:"ð–®";s:1:"O";s:4:"ð–¯";s:1:"P";s:4:"ð–°";s:1:"Q";s:4:"ð–±";s:1:"R";s:4:"ð–²";s:1:"S";s:4:"ð–³";s:1:"T";s:4:"ð–´";s:1:"U";s:4:"ð–µ";s:1:"V";s:4:"ð–¶";s:1:"W";s:4:"ð–·";s:1:"X";s:4:"ð–¸";s:1:"Y";s:4:"ð–¹";s:1:"Z";s:4:"ð–º";s:1:"a";s:4:"ð–»";s:1:"b";s:4:"ð–¼";s:1:"c";s:4:"ð–½";s:1:"d";s:4:"ð–¾";s:1:"e";s:4:"ð–¿";s:1:"f";s:4:"ð—€";s:1:"g";s:4:"ð—";s:1:"h";s:4:"ð—‚";s:1:"i";s:4:"ð—ƒ";s:1:"j";s:4:"ð—„";s:1:"k";s:4:"ð—…";s:1:"l";s:4:"ð—†";s:1:"m";s:4:"ð—‡";s:1:"n";s:4:"ð—ˆ";s:1:"o";s:4:"ð—‰";s:1:"p";s:4:"ð—Š";s:1:"q";s:4:"ð—‹";s:1:"r";s:4:"ð—Œ";s:1:"s";s:4:"ð—";s:1:"t";s:4:"ð—Ž";s:1:"u";s:4:"ð—";s:1:"v";s:4:"ð—";s:1:"w";s:4:"ð—‘";s:1:"x";s:4:"ð—’";s:1:"y";s:4:"ð—“";s:1:"z";s:4:"ð—”";s:1:"A";s:4:"ð—•";s:1:"B";s:4:"ð—–";s:1:"C";s:4:"ð——";s:1:"D";s:4:"ð—˜";s:1:"E";s:4:"ð—™";s:1:"F";s:4:"ð—š";s:1:"G";s:4:"ð—›";s:1:"H";s:4:"ð—œ";s:1:"I";s:4:"ð—";s:1:"J";s:4:"ð—ž";s:1:"K";s:4:"ð—Ÿ";s:1:"L";s:4:"ð— ";s:1:"M";s:4:"ð—¡";s:1:"N";s:4:"ð—¢";s:1:"O";s:4:"ð—£";s:1:"P";s:4:"ð—¤";s:1:"Q";s:4:"ð—¥";s:1:"R";s:4:"ð—¦";s:1:"S";s:4:"ð—§";s:1:"T";s:4:"ð—¨";s:1:"U";s:4:"ð—©";s:1:"V";s:4:"ð—ª";s:1:"W";s:4:"ð—«";s:1:"X";s:4:"ð—¬";s:1:"Y";s:4:"ð—­";s:1:"Z";s:4:"ð—®";s:1:"a";s:4:"ð—¯";s:1:"b";s:4:"ð—°";s:1:"c";s:4:"ð—±";s:1:"d";s:4:"ð—²";s:1:"e";s:4:"ð—³";s:1:"f";s:4:"ð—´";s:1:"g";s:4:"ð—µ";s:1:"h";s:4:"ð—¶";s:1:"i";s:4:"ð—·";s:1:"j";s:4:"ð—¸";s:1:"k";s:4:"ð—¹";s:1:"l";s:4:"ð—º";s:1:"m";s:4:"ð—»";s:1:"n";s:4:"ð—¼";s:1:"o";s:4:"ð—½";s:1:"p";s:4:"ð—¾";s:1:"q";s:4:"ð—¿";s:1:"r";s:4:"ð˜€";s:1:"s";s:4:"ð˜";s:1:"t";s:4:"ð˜‚";s:1:"u";s:4:"ð˜ƒ";s:1:"v";s:4:"ð˜„";s:1:"w";s:4:"ð˜…";s:1:"x";s:4:"ð˜†";s:1:"y";s:4:"ð˜‡";s:1:"z";s:4:"ð˜ˆ";s:1:"A";s:4:"ð˜‰";s:1:"B";s:4:"ð˜Š";s:1:"C";s:4:"ð˜‹";s:1:"D";s:4:"ð˜Œ";s:1:"E";s:4:"ð˜";s:1:"F";s:4:"ð˜Ž";s:1:"G";s:4:"ð˜";s:1:"H";s:4:"ð˜";s:1:"I";s:4:"ð˜‘";s:1:"J";s:4:"ð˜’";s:1:"K";s:4:"ð˜“";s:1:"L";s:4:"ð˜”";s:1:"M";s:4:"ð˜•";s:1:"N";s:4:"ð˜–";s:1:"O";s:4:"ð˜—";s:1:"P";s:4:"ð˜˜";s:1:"Q";s:4:"ð˜™";s:1:"R";s:4:"ð˜š";s:1:"S";s:4:"ð˜›";s:1:"T";s:4:"ð˜œ";s:1:"U";s:4:"ð˜";s:1:"V";s:4:"ð˜ž";s:1:"W";s:4:"ð˜Ÿ";s:1:"X";s:4:"ð˜ ";s:1:"Y";s:4:"ð˜¡";s:1:"Z";s:4:"ð˜¢";s:1:"a";s:4:"ð˜£";s:1:"b";s:4:"ð˜¤";s:1:"c";s:4:"ð˜¥";s:1:"d";s:4:"ð˜¦";s:1:"e";s:4:"ð˜§";s:1:"f";s:4:"ð˜¨";s:1:"g";s:4:"ð˜©";s:1:"h";s:4:"ð˜ª";s:1:"i";s:4:"ð˜«";s:1:"j";s:4:"ð˜¬";s:1:"k";s:4:"ð˜­";s:1:"l";s:4:"ð˜®";s:1:"m";s:4:"ð˜¯";s:1:"n";s:4:"ð˜°";s:1:"o";s:4:"ð˜±";s:1:"p";s:4:"ð˜²";s:1:"q";s:4:"ð˜³";s:1:"r";s:4:"ð˜´";s:1:"s";s:4:"ð˜µ";s:1:"t";s:4:"ð˜¶";s:1:"u";s:4:"ð˜·";s:1:"v";s:4:"ð˜¸";s:1:"w";s:4:"ð˜¹";s:1:"x";s:4:"ð˜º";s:1:"y";s:4:"ð˜»";s:1:"z";s:4:"ð˜¼";s:1:"A";s:4:"ð˜½";s:1:"B";s:4:"ð˜¾";s:1:"C";s:4:"ð˜¿";s:1:"D";s:4:"ð™€";s:1:"E";s:4:"ð™";s:1:"F";s:4:"ð™‚";s:1:"G";s:4:"ð™ƒ";s:1:"H";s:4:"ð™„";s:1:"I";s:4:"ð™…";s:1:"J";s:4:"ð™†";s:1:"K";s:4:"ð™‡";s:1:"L";s:4:"ð™ˆ";s:1:"M";s:4:"ð™‰";s:1:"N";s:4:"ð™Š";s:1:"O";s:4:"ð™‹";s:1:"P";s:4:"ð™Œ";s:1:"Q";s:4:"ð™";s:1:"R";s:4:"ð™Ž";s:1:"S";s:4:"ð™";s:1:"T";s:4:"ð™";s:1:"U";s:4:"ð™‘";s:1:"V";s:4:"ð™’";s:1:"W";s:4:"ð™“";s:1:"X";s:4:"ð™”";s:1:"Y";s:4:"ð™•";s:1:"Z";s:4:"ð™–";s:1:"a";s:4:"ð™—";s:1:"b";s:4:"ð™˜";s:1:"c";s:4:"ð™™";s:1:"d";s:4:"ð™š";s:1:"e";s:4:"ð™›";s:1:"f";s:4:"ð™œ";s:1:"g";s:4:"ð™";s:1:"h";s:4:"ð™ž";s:1:"i";s:4:"ð™Ÿ";s:1:"j";s:4:"ð™ ";s:1:"k";s:4:"ð™¡";s:1:"l";s:4:"ð™¢";s:1:"m";s:4:"ð™£";s:1:"n";s:4:"ð™¤";s:1:"o";s:4:"ð™¥";s:1:"p";s:4:"ð™¦";s:1:"q";s:4:"ð™§";s:1:"r";s:4:"ð™¨";s:1:"s";s:4:"ð™©";s:1:"t";s:4:"ð™ª";s:1:"u";s:4:"ð™«";s:1:"v";s:4:"ð™¬";s:1:"w";s:4:"ð™­";s:1:"x";s:4:"ð™®";s:1:"y";s:4:"ð™¯";s:1:"z";s:4:"ð™°";s:1:"A";s:4:"ð™±";s:1:"B";s:4:"ð™²";s:1:"C";s:4:"ð™³";s:1:"D";s:4:"ð™´";s:1:"E";s:4:"ð™µ";s:1:"F";s:4:"ð™¶";s:1:"G";s:4:"ð™·";s:1:"H";s:4:"ð™¸";s:1:"I";s:4:"ð™¹";s:1:"J";s:4:"ð™º";s:1:"K";s:4:"ð™»";s:1:"L";s:4:"ð™¼";s:1:"M";s:4:"ð™½";s:1:"N";s:4:"ð™¾";s:1:"O";s:4:"ð™¿";s:1:"P";s:4:"ðš€";s:1:"Q";s:4:"ðš";s:1:"R";s:4:"ðš‚";s:1:"S";s:4:"ðšƒ";s:1:"T";s:4:"ðš„";s:1:"U";s:4:"ðš…";s:1:"V";s:4:"ðš†";s:1:"W";s:4:"ðš‡";s:1:"X";s:4:"ðšˆ";s:1:"Y";s:4:"ðš‰";s:1:"Z";s:4:"ðšŠ";s:1:"a";s:4:"ðš‹";s:1:"b";s:4:"ðšŒ";s:1:"c";s:4:"ðš";s:1:"d";s:4:"ðšŽ";s:1:"e";s:4:"ðš";s:1:"f";s:4:"ðš";s:1:"g";s:4:"ðš‘";s:1:"h";s:4:"ðš’";s:1:"i";s:4:"ðš“";s:1:"j";s:4:"ðš”";s:1:"k";s:4:"ðš•";s:1:"l";s:4:"ðš–";s:1:"m";s:4:"ðš—";s:1:"n";s:4:"ðš˜";s:1:"o";s:4:"ðš™";s:1:"p";s:4:"ðšš";s:1:"q";s:4:"ðš›";s:1:"r";s:4:"ðšœ";s:1:"s";s:4:"ðš";s:1:"t";s:4:"ðšž";s:1:"u";s:4:"ðšŸ";s:1:"v";s:4:"ðš ";s:1:"w";s:4:"ðš¡";s:1:"x";s:4:"ðš¢";s:1:"y";s:4:"ðš£";s:1:"z";s:4:"ðš¤";s:2:"ı";s:4:"ðš¥";s:2:"È·";s:4:"ðš¨";s:2:"Α";s:4:"ðš©";s:2:"Î’";s:4:"ðšª";s:2:"Γ";s:4:"ðš«";s:2:"Δ";s:4:"ðš¬";s:2:"Ε";s:4:"ðš­";s:2:"Ζ";s:4:"ðš®";s:2:"Η";s:4:"ðš¯";s:2:"Θ";s:4:"ðš°";s:2:"Ι";s:4:"ðš±";s:2:"Κ";s:4:"ðš²";s:2:"Λ";s:4:"ðš³";s:2:"Îœ";s:4:"ðš´";s:2:"Î";s:4:"ðšµ";s:2:"Ξ";s:4:"ðš¶";s:2:"Ο";s:4:"ðš·";s:2:"Π";s:4:"ðš¸";s:2:"Ρ";s:4:"ðš¹";s:2:"Θ";s:4:"ðšº";s:2:"Σ";s:4:"ðš»";s:2:"Τ";s:4:"ðš¼";s:2:"Î¥";s:4:"ðš½";s:2:"Φ";s:4:"ðš¾";s:2:"Χ";s:4:"ðš¿";s:2:"Ψ";s:4:"ð›€";s:2:"Ω";s:4:"ð›";s:3:"∇";s:4:"ð›‚";s:2:"α";s:4:"ð›ƒ";s:2:"β";s:4:"ð›„";s:2:"γ";s:4:"ð›…";s:2:"δ";s:4:"ð›†";s:2:"ε";s:4:"ð›‡";s:2:"ζ";s:4:"ð›ˆ";s:2:"η";s:4:"ð›‰";s:2:"θ";s:4:"ð›Š";s:2:"ι";s:4:"ð›‹";s:2:"κ";s:4:"ð›Œ";s:2:"λ";s:4:"ð›";s:2:"μ";s:4:"ð›Ž";s:2:"ν";s:4:"ð›";s:2:"ξ";s:4:"ð›";s:2:"ο";s:4:"ð›‘";s:2:"Ï€";s:4:"ð›’";s:2:"Ï";s:4:"ð›“";s:2:"Ï‚";s:4:"ð›”";s:2:"σ";s:4:"ð›•";s:2:"Ï„";s:4:"ð›–";s:2:"Ï…";s:4:"ð›—";s:2:"φ";s:4:"ð›˜";s:2:"χ";s:4:"ð›™";s:2:"ψ";s:4:"ð›š";s:2:"ω";s:4:"ð››";s:3:"∂";s:4:"ð›œ";s:2:"ε";s:4:"ð›";s:2:"θ";s:4:"ð›ž";s:2:"κ";s:4:"ð›Ÿ";s:2:"φ";s:4:"ð› ";s:2:"Ï";s:4:"ð›¡";s:2:"Ï€";s:4:"ð›¢";s:2:"Α";s:4:"ð›£";s:2:"Î’";s:4:"ð›¤";s:2:"Γ";s:4:"ð›¥";s:2:"Δ";s:4:"ð›¦";s:2:"Ε";s:4:"ð›§";s:2:"Ζ";s:4:"ð›¨";s:2:"Η";s:4:"ð›©";s:2:"Θ";s:4:"ð›ª";s:2:"Ι";s:4:"ð›«";s:2:"Κ";s:4:"ð›¬";s:2:"Λ";s:4:"ð›­";s:2:"Îœ";s:4:"ð›®";s:2:"Î";s:4:"ð›¯";s:2:"Ξ";s:4:"ð›°";s:2:"Ο";s:4:"ð›±";s:2:"Π";s:4:"ð›²";s:2:"Ρ";s:4:"ð›³";s:2:"Θ";s:4:"ð›´";s:2:"Σ";s:4:"ð›µ";s:2:"Τ";s:4:"ð›¶";s:2:"Î¥";s:4:"ð›·";s:2:"Φ";s:4:"ð›¸";s:2:"Χ";s:4:"ð›¹";s:2:"Ψ";s:4:"ð›º";s:2:"Ω";s:4:"ð›»";s:3:"∇";s:4:"ð›¼";s:2:"α";s:4:"ð›½";s:2:"β";s:4:"ð›¾";s:2:"γ";s:4:"ð›¿";s:2:"δ";s:4:"ðœ€";s:2:"ε";s:4:"ðœ";s:2:"ζ";s:4:"ðœ‚";s:2:"η";s:4:"ðœƒ";s:2:"θ";s:4:"ðœ„";s:2:"ι";s:4:"ðœ…";s:2:"κ";s:4:"ðœ†";s:2:"λ";s:4:"ðœ‡";s:2:"μ";s:4:"ðœˆ";s:2:"ν";s:4:"ðœ‰";s:2:"ξ";s:4:"ðœŠ";s:2:"ο";s:4:"ðœ‹";s:2:"Ï€";s:4:"ðœŒ";s:2:"Ï";s:4:"ðœ";s:2:"Ï‚";s:4:"ðœŽ";s:2:"σ";s:4:"ðœ";s:2:"Ï„";s:4:"ðœ";s:2:"Ï…";s:4:"ðœ‘";s:2:"φ";s:4:"ðœ’";s:2:"χ";s:4:"ðœ“";s:2:"ψ";s:4:"ðœ”";s:2:"ω";s:4:"ðœ•";s:3:"∂";s:4:"ðœ–";s:2:"ε";s:4:"ðœ—";s:2:"θ";s:4:"ðœ˜";s:2:"κ";s:4:"ðœ™";s:2:"φ";s:4:"ðœš";s:2:"Ï";s:4:"ðœ›";s:2:"Ï€";s:4:"ðœœ";s:2:"Α";s:4:"ðœ";s:2:"Î’";s:4:"ðœž";s:2:"Γ";s:4:"ðœŸ";s:2:"Δ";s:4:"ðœ ";s:2:"Ε";s:4:"ðœ¡";s:2:"Ζ";s:4:"ðœ¢";s:2:"Η";s:4:"ðœ£";s:2:"Θ";s:4:"ðœ¤";s:2:"Ι";s:4:"ðœ¥";s:2:"Κ";s:4:"ðœ¦";s:2:"Λ";s:4:"ðœ§";s:2:"Îœ";s:4:"ðœ¨";s:2:"Î";s:4:"ðœ©";s:2:"Ξ";s:4:"ðœª";s:2:"Ο";s:4:"ðœ«";s:2:"Π";s:4:"ðœ¬";s:2:"Ρ";s:4:"ðœ­";s:2:"Θ";s:4:"ðœ®";s:2:"Σ";s:4:"ðœ¯";s:2:"Τ";s:4:"ðœ°";s:2:"Î¥";s:4:"ðœ±";s:2:"Φ";s:4:"ðœ²";s:2:"Χ";s:4:"ðœ³";s:2:"Ψ";s:4:"ðœ´";s:2:"Ω";s:4:"ðœµ";s:3:"∇";s:4:"ðœ¶";s:2:"α";s:4:"ðœ·";s:2:"β";s:4:"ðœ¸";s:2:"γ";s:4:"ðœ¹";s:2:"δ";s:4:"ðœº";s:2:"ε";s:4:"ðœ»";s:2:"ζ";s:4:"ðœ¼";s:2:"η";s:4:"ðœ½";s:2:"θ";s:4:"ðœ¾";s:2:"ι";s:4:"ðœ¿";s:2:"κ";s:4:"ð€";s:2:"λ";s:4:"ð";s:2:"μ";s:4:"ð‚";s:2:"ν";s:4:"ðƒ";s:2:"ξ";s:4:"ð„";s:2:"ο";s:4:"ð…";s:2:"Ï€";s:4:"ð†";s:2:"Ï";s:4:"ð‡";s:2:"Ï‚";s:4:"ðˆ";s:2:"σ";s:4:"ð‰";s:2:"Ï„";s:4:"ðŠ";s:2:"Ï…";s:4:"ð‹";s:2:"φ";s:4:"ðŒ";s:2:"χ";s:4:"ð";s:2:"ψ";s:4:"ðŽ";s:2:"ω";s:4:"ð";s:3:"∂";s:4:"ð";s:2:"ε";s:4:"ð‘";s:2:"θ";s:4:"ð’";s:2:"κ";s:4:"ð“";s:2:"φ";s:4:"ð”";s:2:"Ï";s:4:"ð•";s:2:"Ï€";s:4:"ð–";s:2:"Α";s:4:"ð—";s:2:"Î’";s:4:"ð˜";s:2:"Γ";s:4:"ð™";s:2:"Δ";s:4:"ðš";s:2:"Ε";s:4:"ð›";s:2:"Ζ";s:4:"ðœ";s:2:"Η";s:4:"ð";s:2:"Θ";s:4:"ðž";s:2:"Ι";s:4:"ðŸ";s:2:"Κ";s:4:"ð ";s:2:"Λ";s:4:"ð¡";s:2:"Îœ";s:4:"ð¢";s:2:"Î";s:4:"ð£";s:2:"Ξ";s:4:"ð¤";s:2:"Ο";s:4:"ð¥";s:2:"Π";s:4:"ð¦";s:2:"Ρ";s:4:"ð§";s:2:"Θ";s:4:"ð¨";s:2:"Σ";s:4:"ð©";s:2:"Τ";s:4:"ðª";s:2:"Î¥";s:4:"ð«";s:2:"Φ";s:4:"ð¬";s:2:"Χ";s:4:"ð­";s:2:"Ψ";s:4:"ð®";s:2:"Ω";s:4:"ð¯";s:3:"∇";s:4:"ð°";s:2:"α";s:4:"ð±";s:2:"β";s:4:"ð²";s:2:"γ";s:4:"ð³";s:2:"δ";s:4:"ð´";s:2:"ε";s:4:"ðµ";s:2:"ζ";s:4:"ð¶";s:2:"η";s:4:"ð·";s:2:"θ";s:4:"ð¸";s:2:"ι";s:4:"ð¹";s:2:"κ";s:4:"ðº";s:2:"λ";s:4:"ð»";s:2:"μ";s:4:"ð¼";s:2:"ν";s:4:"ð½";s:2:"ξ";s:4:"ð¾";s:2:"ο";s:4:"ð¿";s:2:"Ï€";s:4:"ðž€";s:2:"Ï";s:4:"ðž";s:2:"Ï‚";s:4:"ðž‚";s:2:"σ";s:4:"ðžƒ";s:2:"Ï„";s:4:"ðž„";s:2:"Ï…";s:4:"ðž…";s:2:"φ";s:4:"ðž†";s:2:"χ";s:4:"ðž‡";s:2:"ψ";s:4:"ðžˆ";s:2:"ω";s:4:"ðž‰";s:3:"∂";s:4:"ðžŠ";s:2:"ε";s:4:"ðž‹";s:2:"θ";s:4:"ðžŒ";s:2:"κ";s:4:"ðž";s:2:"φ";s:4:"ðžŽ";s:2:"Ï";s:4:"ðž";s:2:"Ï€";s:4:"ðž";s:2:"Α";s:4:"ðž‘";s:2:"Î’";s:4:"ðž’";s:2:"Γ";s:4:"ðž“";s:2:"Δ";s:4:"ðž”";s:2:"Ε";s:4:"ðž•";s:2:"Ζ";s:4:"ðž–";s:2:"Η";s:4:"ðž—";s:2:"Θ";s:4:"ðž˜";s:2:"Ι";s:4:"ðž™";s:2:"Κ";s:4:"ðžš";s:2:"Λ";s:4:"ðž›";s:2:"Îœ";s:4:"ðžœ";s:2:"Î";s:4:"ðž";s:2:"Ξ";s:4:"ðžž";s:2:"Ο";s:4:"ðžŸ";s:2:"Π";s:4:"ðž ";s:2:"Ρ";s:4:"ðž¡";s:2:"Θ";s:4:"ðž¢";s:2:"Σ";s:4:"ðž£";s:2:"Τ";s:4:"ðž¤";s:2:"Î¥";s:4:"ðž¥";s:2:"Φ";s:4:"ðž¦";s:2:"Χ";s:4:"ðž§";s:2:"Ψ";s:4:"ðž¨";s:2:"Ω";s:4:"ðž©";s:3:"∇";s:4:"ðžª";s:2:"α";s:4:"ðž«";s:2:"β";s:4:"ðž¬";s:2:"γ";s:4:"ðž­";s:2:"δ";s:4:"ðž®";s:2:"ε";s:4:"ðž¯";s:2:"ζ";s:4:"ðž°";s:2:"η";s:4:"ðž±";s:2:"θ";s:4:"ðž²";s:2:"ι";s:4:"ðž³";s:2:"κ";s:4:"ðž´";s:2:"λ";s:4:"ðžµ";s:2:"μ";s:4:"ðž¶";s:2:"ν";s:4:"ðž·";s:2:"ξ";s:4:"ðž¸";s:2:"ο";s:4:"ðž¹";s:2:"Ï€";s:4:"ðžº";s:2:"Ï";s:4:"ðž»";s:2:"Ï‚";s:4:"ðž¼";s:2:"σ";s:4:"ðž½";s:2:"Ï„";s:4:"ðž¾";s:2:"Ï…";s:4:"ðž¿";s:2:"φ";s:4:"ðŸ€";s:2:"χ";s:4:"ðŸ";s:2:"ψ";s:4:"ðŸ‚";s:2:"ω";s:4:"ðŸƒ";s:3:"∂";s:4:"ðŸ„";s:2:"ε";s:4:"ðŸ…";s:2:"θ";s:4:"ðŸ†";s:2:"κ";s:4:"ðŸ‡";s:2:"φ";s:4:"ðŸˆ";s:2:"Ï";s:4:"ðŸ‰";s:2:"Ï€";s:4:"ðŸŠ";s:2:"Ïœ";s:4:"ðŸ‹";s:2:"Ï";s:4:"ðŸŽ";s:1:"0";s:4:"ðŸ";s:1:"1";s:4:"ðŸ";s:1:"2";s:4:"ðŸ‘";s:1:"3";s:4:"ðŸ’";s:1:"4";s:4:"ðŸ“";s:1:"5";s:4:"ðŸ”";s:1:"6";s:4:"ðŸ•";s:1:"7";s:4:"ðŸ–";s:1:"8";s:4:"ðŸ—";s:1:"9";s:4:"ðŸ˜";s:1:"0";s:4:"ðŸ™";s:1:"1";s:4:"ðŸš";s:1:"2";s:4:"ðŸ›";s:1:"3";s:4:"ðŸœ";s:1:"4";s:4:"ðŸ";s:1:"5";s:4:"ðŸž";s:1:"6";s:4:"ðŸŸ";s:1:"7";s:4:"ðŸ ";s:1:"8";s:4:"ðŸ¡";s:1:"9";s:4:"ðŸ¢";s:1:"0";s:4:"ðŸ£";s:1:"1";s:4:"ðŸ¤";s:1:"2";s:4:"ðŸ¥";s:1:"3";s:4:"ðŸ¦";s:1:"4";s:4:"ðŸ§";s:1:"5";s:4:"ðŸ¨";s:1:"6";s:4:"ðŸ©";s:1:"7";s:4:"ðŸª";s:1:"8";s:4:"ðŸ«";s:1:"9";s:4:"ðŸ¬";s:1:"0";s:4:"ðŸ­";s:1:"1";s:4:"ðŸ®";s:1:"2";s:4:"ðŸ¯";s:1:"3";s:4:"ðŸ°";s:1:"4";s:4:"ðŸ±";s:1:"5";s:4:"ðŸ²";s:1:"6";s:4:"ðŸ³";s:1:"7";s:4:"ðŸ´";s:1:"8";s:4:"ðŸµ";s:1:"9";s:4:"ðŸ¶";s:1:"0";s:4:"ðŸ·";s:1:"1";s:4:"ðŸ¸";s:1:"2";s:4:"ðŸ¹";s:1:"3";s:4:"ðŸº";s:1:"4";s:4:"ðŸ»";s:1:"5";s:4:"ðŸ¼";s:1:"6";s:4:"ðŸ½";s:1:"7";s:4:"ðŸ¾";s:1:"8";s:4:"ðŸ¿";s:1:"9";s:4:"丽";s:3:"丽";s:4:"ð¯ ";s:3:"丸";s:4:"乁";s:3:"ä¹";s:4:"𠄢";s:4:"ð „¢";s:4:"你";s:3:"ä½ ";s:4:"侮";s:3:"ä¾®";s:4:"侻";s:3:"ä¾»";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"åº";s:4:"備";s:3:"å‚™";s:4:"僧";s:3:"僧";s:4:"像";s:3:"åƒ";s:4:"㒞";s:3:"ã’ž";s:4:"ð¯ ";s:4:"𠘺";s:4:"免";s:3:"å…";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"具";s:3:"å…·";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"ã’¹";s:4:"內";s:3:"å…§";s:4:"再";s:3:"å†";s:4:"𠕋";s:4:"ð •‹";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"ð¯ ";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"ã“Ÿ";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"å‰";s:4:"卑";s:3:"å‘";s:4:"博";s:3:"åš";s:4:"即";s:3:"å³";s:4:"卽";s:3:"å½";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"ç°";s:4:"及";s:3:"åŠ";s:4:"叟";s:3:"åŸ";s:4:"𠭣";s:4:"ð ­£";s:4:"叫";s:3:"å«";s:4:"叱";s:3:"å±";s:4:"吆";s:3:"å†";s:4:"咞";s:3:"å’ž";s:4:"吸";s:3:"å¸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"å’¢";s:4:"ð¯¡";s:3:"哶";s:4:"唐";s:3:"å”";s:4:"啓";s:3:"å•“";s:4:"啣";s:3:"å•£";s:4:"善";s:3:"å–„";s:4:"善";s:3:"å–„";s:4:"喙";s:3:"å–™";s:4:"喫";s:3:"å–«";s:4:"喳";s:3:"å–³";s:4:"嗂";s:3:"å—‚";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"ð¯¡";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"ð¯¡";s:3:"å™´";s:4:"ð¯¡";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"å ";s:4:"型";s:3:"åž‹";s:4:"堲";s:3:"å ²";s:4:"報";s:3:"å ±";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"ð¯¡";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"ã›®";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"å°†";s:4:"当";s:3:"当";s:4:"尢";s:3:"å°¢";s:4:"㞁";s:3:"ãž";s:4:"屠";s:3:"å± ";s:4:"屮";s:3:"å±®";s:4:"峀";s:3:"å³€";s:4:"岍";s:3:"å²";s:4:"𡷤";s:4:"ð¡·¤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"ð¡·¦";s:4:"嵮";s:3:"åµ®";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"åµ¼";s:4:"ð¯¢";s:3:"å·¡";s:4:"巢";s:3:"å·¢";s:4:"㠯";s:3:"ã ¯";s:4:"巽";s:3:"å·½";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"ã¡¢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"ð¯¢";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"èˆ";s:4:"弢";s:3:"å¼¢";s:4:"弢";s:3:"å¼¢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"å½¢";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"ð¯¢";s:3:"å¿";s:4:"志";s:3:"å¿—";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"æ‚";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"æ‚”";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"æ…ˆ";s:4:"慌";s:3:"æ…Œ";s:4:"慎";s:3:"æ…Ž";s:4:"慌";s:3:"æ…Œ";s:4:"慺";s:3:"æ…º";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"æˆ";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"æ‰";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"æ‹”";s:4:"捐";s:3:"æ";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"æ¨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"æ¤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"æ¢";s:4:"揅";s:3:"æ…";s:4:"ð¯£";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"æ‘©";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"æ’";s:4:"摷";s:3:"æ‘·";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"æ•";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"æ—£";s:4:"書";s:3:"書";s:4:"ð¯£";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"ð¯£";s:3:"æš‘";s:4:"ð¯£";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"æšœ";s:4:"肭";s:3:"è‚­";s:4:"䏙";s:3:"ä™";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"æž";s:4:"杓";s:3:"æ“";s:4:"ð¯£";s:4:"ð£ƒ";s:4:"㭉";s:3:"ã­‰";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"æž…";s:4:"桒";s:3:"æ¡’";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"æ Ÿ";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"ã®";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"æ«›";s:4:"㰘";s:3:"ã°˜";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"æ­”";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"æ­²";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"æ®»";s:4:"𣪍";s:4:"ð£ª";s:4:"𡴋";s:4:"ð¡´‹";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"æ³";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"æ´–";s:4:"派";s:3:"æ´¾";s:4:"ð¯¤";s:3:"æµ·";s:4:"流";s:3:"æµ";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"æ´´";s:4:"港";s:3:"港";s:4:"湮";s:3:"æ¹®";s:4:"㴳";s:3:"ã´³";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"ð¯¤";s:4:"𣻑";s:4:"淹";s:3:"æ·¹";s:4:"ð¯¤";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"çŠ";s:4:"災";s:3:"ç½";s:4:"灷";s:3:"ç·";s:4:"炭";s:3:"ç‚­";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"ç……";s:4:"ð¯¤";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"ç‰";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"çº";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"ç‘œ";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"ç’…";s:4:"瓊";s:3:"ç“Š";s:4:"㼛";s:3:"ã¼›";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"ç•°";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"ç˜";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"ð¥„";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"ç›´";s:4:"ð¯¥";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"çŠ";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"çž‹";s:4:"䁆";s:3:"ä†";s:4:"䂖";s:3:"ä‚–";s:4:"ð¯¥";s:4:"ð¥";s:4:"硎";s:3:"ç¡Ž";s:4:"ð¯¥";s:3:"碌";s:4:"ð¯¥";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"ç¦";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"ç©€";s:4:"穊";s:3:"ç©Š";s:4:"穏";s:3:"ç©";s:4:"𥥼";s:4:"𥥼";s:4:"ð¯¥";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"ç«®";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"ç³’";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"ç³£";s:4:"紀";s:3:"ç´€";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"çµ£";s:4:"䌁";s:3:"äŒ";s:4:"緇";s:3:"ç·‡";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"ç¹…";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"ä™";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"è ";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"è°";s:4:"𣍟";s:4:"ð£Ÿ";s:4:"ð¯¦";s:3:"ä•";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"ä‹";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"èˆ";s:4:"舄";s:3:"舄";s:4:"ð¯¦";s:3:"辞";s:4:"䑫";s:3:"ä‘«";s:4:"ð¯¦";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"芝";s:3:"èŠ";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"è‹¥";s:4:"茝";s:3:"èŒ";s:4:"荣";s:3:"è£";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"ð¯¦";s:3:"莽";s:4:"菧";s:3:"è§";s:4:"著";s:3:"è‘—";s:4:"荓";s:3:"è“";s:4:"菊";s:3:"èŠ";s:4:"菌";s:3:"èŒ";s:4:"菜";s:3:"èœ";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"è”–";s:4:"𧏊";s:4:"ð§Š";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"ä•";s:4:"䕡";s:3:"ä•¡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"ä•«";s:4:"虐";s:3:"è™";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"èš©";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"è¹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"è«";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"ä——";s:4:"蟡";s:3:"蟡";s:4:"ð¯§";s:3:"è ";s:4:"䗹";s:3:"ä—¹";s:4:"衠";s:3:"è¡ ";s:4:"衣";s:3:"è¡£";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"ã’»";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"ð¯§";s:3:"äš¾";s:4:"䛇";s:3:"䛇";s:4:"ð¯§";s:3:"誠";s:4:"ð¯§";s:3:"è«­";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"è³";s:4:"贛";s:3:"è´›";s:4:"起";s:3:"èµ·";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"ð  „";s:4:"跋";s:3:"è·‹";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"è·°";s:4:"ð¯§";s:4:"𠣞";s:4:"軔";s:3:"è»”";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"é‚”";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"é„‘";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"é„›";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"é‹—";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"é¹";s:4:"鐕";s:3:"é•";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"é–‹";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"é–·";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"ð©……";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"ä©®";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"ð©Š";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"ð©’–";s:4:"頋";s:3:"é ‹";s:4:"頋";s:3:"é ‹";s:4:"頩";s:3:"é ©";s:4:"ð¯¨";s:4:"ð©–¶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"é±€";s:4:"鳽";s:3:"é³½";s:4:"ð¯¨";s:3:"䳎";s:4:"䳭";s:3:"ä³­";s:4:"ð¯¨";s:3:"鵧";s:4:"ð¯¨";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"äµ–";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"é¼…";s:4:"鼏";s:3:"é¼";s:4:"鼖";s:3:"é¼–";s:4:"鼻";s:3:"é¼»";s:4:"ð¯¨";s:4:"𪘀";}' );
diff --git a/includes/normal/UtfNormalDefines.php b/includes/normal/UtfNormalDefines.php
index 419f6f8c..d759c64c 100644
--- a/includes/normal/UtfNormalDefines.php
+++ b/includes/normal/UtfNormalDefines.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Some constant definitions for the unicode normalization module
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
define( 'UNICODE_HANGUL_FIRST', 0xac00 );
define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
diff --git a/includes/normal/UtfNormalGenerate.php b/includes/normal/UtfNormalGenerate.php
index 3b1e9e73..a5e2885a 100644
--- a/includes/normal/UtfNormalGenerate.php
+++ b/includes/normal/UtfNormalGenerate.php
@@ -1,32 +1,30 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* This script generates UniNormalData.inc from the Unicode Character Database
* and supplementary files.
*
+ * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
- * @access private
*/
-/** */
-
if( php_sapi_name() != 'cli' ) {
die( "Run me from the command line please.\n" );
}
@@ -175,13 +173,14 @@ if( $out ) {
/**
* This file was automatically generated -- do not edit!
* Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
*/
-/** */
-global \$utfCombiningClass, \$utfCanonicalComp, \$utfCanonicalDecomp, \$utfCheckNFC;
-\$utfCombiningClass = unserialize( '$serCombining' );
-\$utfCanonicalComp = unserialize( '$serComp' );
-\$utfCanonicalDecomp = unserialize( '$serCanon' );
-\$utfCheckNFC = unserialize( '$serCheckNFC' );
+
+UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
+UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
+UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
+UtfNormal::\$utfCheckNFC = unserialize( '$serCheckNFC' );
\n";
fputs( $out, $outdata );
fclose( $out );
@@ -199,10 +198,11 @@ if( $out ) {
/**
* This file was automatically generated -- do not edit!
* Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
*/
-/** */
-global \$utfCompatibilityDecomp;
-\$utfCompatibilityDecomp = unserialize( '$serCompat' );
+
+UtfNormal::\$utfCompatibilityDecomp = unserialize( '$serCompat' );
\n";
fputs( $out, $outdata );
fclose( $out );
diff --git a/includes/normal/UtfNormalTest.php b/includes/normal/UtfNormalTest.php
index ee1da4d0..f78775ce 100644
--- a/includes/normal/UtfNormalTest.php
+++ b/includes/normal/UtfNormalTest.php
@@ -1,29 +1,30 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* Implements the conformance test at:
* http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
*/
-/** */
$verbose = true;
#define( 'PRETTY_UTF8', true );
@@ -87,7 +88,7 @@ while( false !== ( $line = fgets( $in ) ) ) {
$testedChars[$columns[1]] = true;
$total++;
- if( testNormals( $normalizer, $columns, $comment ) ) {
+ if( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
$success++;
} else {
$failure++;
@@ -119,7 +120,7 @@ while( false !== ($line = fgets( $in ) ) ) {
}
if( empty( $testedChars[$char] ) ) {
$total++;
- if( testInvariant( $normalizer, $char, $desc ) ) {
+ if( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
$success++;
} else {
$failure++;
@@ -154,17 +155,16 @@ function reportResults( &$total, &$success, &$failure ) {
return $ok;
}
-function testNormals( &$u, $c, $comment, $reportFailure = false ) {
+function testNormals( &$u, $c, $comment, $verbose, $reportFailure = false ) {
$result = testNFC( $u, $c, $comment, $reportFailure );
$result = testNFD( $u, $c, $comment, $reportFailure ) && $result;
$result = testNFKC( $u, $c, $comment, $reportFailure ) && $result;
$result = testNFKD( $u, $c, $comment, $reportFailure ) && $result;
$result = testCleanUp( $u, $c, $comment, $reportFailure ) && $result;
- global $verbose;
if( $verbose && !$result && !$reportFailure ) {
print $comment;
- testNormals( $u, $c, $comment, true );
+ testNormals( $u, $c, $comment, $verbose, true );
}
return $result;
}
@@ -232,16 +232,16 @@ function testNFKD( &$u, $c, $comment, $verbose ) {
return $result;
}
-function testInvariant( &$u, $char, $desc, $reportFailure = false ) {
+function testInvariant( &$u, $char, $desc, $verbose, $reportFailure = false ) {
$result = verbosify( $char, $u->toNFC( $char ), 1, 'NFC', $reportFailure );
$result = verbosify( $char, $u->toNFD( $char ), 1, 'NFD', $reportFailure ) && $result;
$result = verbosify( $char, $u->toNFKC( $char ), 1, 'NFKC', $reportFailure ) && $result;
$result = verbosify( $char, $u->toNFKD( $char ), 1, 'NFKD', $reportFailure ) && $result;
$result = verbosify( $char, $u->cleanUp( $char ), 1, 'cleanUp', $reportFailure ) && $result;
- global $verbose;
+
if( $verbose && !$result && !$reportFailure ) {
print $desc;
- testInvariant( $u, $char, $desc, true );
+ testInvariant( $u, $char, $desc, $verbose, true );
}
return $result;
}
diff --git a/includes/normal/UtfNormalTest2.php b/includes/normal/UtfNormalTest2.php
new file mode 100644
index 00000000..fafd5475
--- /dev/null
+++ b/includes/normal/UtfNormalTest2.php
@@ -0,0 +1,239 @@
+#!/usr/bin/php
+<?php
+/**
+ * Other tests for the unicode normalization module
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+if( php_sapi_name() != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
+// From http://unicode.org/Public/UNIDATA/NormalizationTest.txt
+$file = "NormalizationTest.txt";
+
+// Anything after this character is a comment
+define ( 'COMMENT', '#' );
+
+// Semicolons are used to separate the columns
+define ( 'SEPARATOR', ';' );
+
+$f = fopen($file, "r");
+
+/**
+ * The following section will be used for testing different normalization methods.
+ * - Pure PHP
+ ~ no assertion errors
+ ~ 6.25 minutes
+
+ * - php_utfnormal.so or intl extension: both are wrappers around
+ libicu so we list the version of libicu when making the
+ comparison
+
+ * - libicu Ubuntu 3.8.1-3ubuntu1.1 php 5.2.6-3ubuntu4.5
+ ~ 2200 assertion errors
+ ~ 5 seconds
+ ~ output: http://paste2.org/p/921566
+
+ * - libicu Ubuntu 4.2.1-3 php 5.3.2-1ubuntu4.2
+ ~ 1384 assertion errors
+ ~ 15 seconds
+ ~ output: http://paste2.org/p/921435
+
+ * - libicu Debian 4.4.1-5 php 5.3.2-1ubuntu4.2
+ ~ no assertion errors
+ ~ 13 seconds
+
+ * - Tests comparing pure PHP output with libicu output were added
+ later and slow down the runtime.
+ */
+
+require_once("./UtfNormal.php");
+function normalize_form_c($c) { return UtfNormal::toNFC($c); }
+function normalize_form_d($c) { return UtfNormal::toNFD($c); }
+function normalize_form_kc($c) { return UtfNormal::toNFKC($c); }
+function normalize_form_kd($c) { return UtfNormal::toNFKD($c); }
+
+/**
+ * This set of functions is only useful if youve added a param to the
+ * following functions to force pure PHP usage. I decided not to
+ * commit that code since might produce a slowdown in the UTF
+ * normalization code just for the sake of these tests. -- hexmode
+ */
+function normalize_form_c_php($c) { return UtfNormal::toNFC($c, "php"); }
+function normalize_form_d_php($c) { return UtfNormal::toNFD($c, "php"); }
+function normalize_form_kc_php($c) { return UtfNormal::toNFKC($c, "php"); }
+function normalize_form_kd_php($c) { return UtfNormal::toNFKD($c, "php"); }
+
+assert_options(ASSERT_ACTIVE, 1);
+assert_options(ASSERT_WARNING, 0);
+assert_options(ASSERT_QUIET_EVAL, 1);
+assert_options(ASSERT_CALLBACK, 'my_assert');
+
+function my_assert( $file, $line, $code ) {
+ global $col, $lineNo;
+ echo "Assertion that '$code' failed on line $lineNo ($col[5])\n";
+}
+
+$count = 0;
+$lineNo = 0;
+if( $f !== false ) {
+ while( ( $col = getRow( $f ) ) !== false ) {
+ $lineNo++;
+
+ if(count($col) == 6) {
+ $count++;
+ if( $count % 100 === 0 ) echo "Count: $count\n";
+ } else {
+ continue;
+ }
+
+ # verify that the pure PHP version is correct
+ $NFCc1 = normalize_form_c($col[0]);
+ $NFCc1p = normalize_form_c_php($col[0]);
+ assert('$NFCc1 === $NFCc1p');
+ $NFCc2 = normalize_form_c($col[1]);
+ $NFCc2p = normalize_form_c_php($col[1]);
+ assert('$NFCc2 === $NFCc2p');
+ $NFCc3 = normalize_form_c($col[2]);
+ $NFCc3p = normalize_form_c_php($col[2]);
+ assert('$NFCc3 === $NFCc3p');
+ $NFCc4 = normalize_form_c($col[3]);
+ $NFCc4p = normalize_form_c_php($col[3]);
+ assert('$NFCc4 === $NFCc4p');
+ $NFCc5 = normalize_form_c($col[4]);
+ $NFCc5p = normalize_form_c_php($col[4]);
+ assert('$NFCc5 === $NFCc5p');
+
+ $NFDc1 = normalize_form_d($col[0]);
+ $NFDc1p = normalize_form_d_php($col[0]);
+ assert('$NFDc1 === $NFDc1p');
+ $NFDc2 = normalize_form_d($col[1]);
+ $NFDc2p = normalize_form_d_php($col[1]);
+ assert('$NFDc2 === $NFDc2p');
+ $NFDc3 = normalize_form_d($col[2]);
+ $NFDc3p = normalize_form_d_php($col[2]);
+ assert('$NFDc3 === $NFDc3p');
+ $NFDc4 = normalize_form_d($col[3]);
+ $NFDc4p = normalize_form_d_php($col[3]);
+ assert('$NFDc4 === $NFDc4p');
+ $NFDc5 = normalize_form_d($col[4]);
+ $NFDc5p = normalize_form_d_php($col[4]);
+ assert('$NFDc5 === $NFDc5p');
+
+ $NFKDc1 = normalize_form_kd($col[0]);
+ $NFKDc1p = normalize_form_kd_php($col[0]);
+ assert('$NFKDc1 === $NFKDc1p');
+ $NFKDc2 = normalize_form_kd($col[1]);
+ $NFKDc2p = normalize_form_kd_php($col[1]);
+ assert('$NFKDc2 === $NFKDc2p');
+ $NFKDc3 = normalize_form_kd($col[2]);
+ $NFKDc3p = normalize_form_kd_php($col[2]);
+ assert('$NFKDc3 === $NFKDc3p');
+ $NFKDc4 = normalize_form_kd($col[3]);
+ $NFKDc4p = normalize_form_kd_php($col[3]);
+ assert('$NFKDc4 === $NFKDc4p');
+ $NFKDc5 = normalize_form_kd($col[4]);
+ $NFKDc5p = normalize_form_kd_php($col[4]);
+ assert('$NFKDc5 === $NFKDc5p');
+
+ $NFKCc1 = normalize_form_kc($col[0]);
+ $NFKCc1p = normalize_form_kc_php($col[0]);
+ assert('$NFKCc1 === $NFKCc1p');
+ $NFKCc2 = normalize_form_kc($col[1]);
+ $NFKCc2p = normalize_form_kc_php($col[1]);
+ assert('$NFKCc2 === $NFKCc2p');
+ $NFKCc3 = normalize_form_kc($col[2]);
+ $NFKCc3p = normalize_form_kc_php($col[2]);
+ assert('$NFKCc3 === $NFKCc3p');
+ $NFKCc4 = normalize_form_kc($col[3]);
+ $NFKCc4p = normalize_form_kc_php($col[3]);
+ assert('$NFKCc4 === $NFKCc4p');
+ $NFKCc5 = normalize_form_kc($col[4]);
+ $NFKCc5p = normalize_form_kc_php($col[4]);
+ assert('$NFKCc5 === $NFKCc5p');
+
+ # c2 == NFC(c1) == NFC(c2) == NFC(c3)
+ assert('$col[1] === $NFCc1');
+ assert('$col[1] === $NFCc2');
+ assert('$col[1] === $NFCc3');
+
+ # c4 == NFC(c4) == NFC(c5)
+ assert('$col[3] === $NFCc4');
+ assert('$col[3] === $NFCc5');
+
+ # c3 == NFD(c1) == NFD(c2) == NFD(c3)
+ assert('$col[2] === $NFDc1');
+ assert('$col[2] === $NFDc2');
+ assert('$col[2] === $NFDc3');
+
+ # c5 == NFD(c4) == NFD(c5)
+ assert('$col[4] === $NFDc4');
+ assert('$col[4] === $NFDc5');
+
+ # c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
+ assert('$col[3] === $NFKCc1');
+ assert('$col[3] === $NFKCc2');
+ assert('$col[3] === $NFKCc3');
+ assert('$col[3] === $NFKCc4');
+ assert('$col[3] === $NFKCc5');
+
+ # c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
+ assert('$col[4] === $NFKDc1');
+ assert('$col[4] === $NFKDc2');
+ assert('$col[4] === $NFKDc3');
+ assert('$col[4] === $NFKDc4');
+ assert('$col[4] === $NFKDc5');
+ }
+}
+echo "done.\n";
+
+// Compare against http://en.wikipedia.org/wiki/UTF-8#Description
+function unichr($c) {
+ if ($c <= 0x7F) {
+ return chr($c);
+ } else if ($c <= 0x7FF) {
+ return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
+ } else if ($c <= 0xFFFF) {
+ return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
+ . chr(0x80 | $c & 0x3F);
+ } else if ($c <= 0x10FFFF) {
+ return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
+ . chr(0x80 | $c >> 6 & 0x3F)
+ . chr(0x80 | $c & 0x3F);
+ } else {
+ return false;
+ }
+}
+
+function unistr($c) {
+ return implode("", array_map("unichr", array_map("hexdec", explode(" ", $c))));
+}
+
+function getRow( $f ) {
+ $row = fgets( $f );
+ if( $row === false ) return false;
+ $row = rtrim($row);
+ $pos = strpos( $row, COMMENT );
+ $pos2 = strpos( $row, ")" );
+ if( $pos === 0 ) return array($row);
+ $c = "";
+
+ if( $pos ) {
+ if($pos2) $c = substr( $row, $pos2 + 2 );
+ else $c = substr( $row, $pos );
+ $row = substr( $row, 0, $pos );
+ }
+
+ $ret = array();
+ foreach( explode( SEPARATOR, $row ) as $ent ) {
+ if( trim( $ent ) !== "" ) {
+ $ret[] = unistr($ent);
+ }
+ }
+ $ret[] = $c;
+
+ return $ret;
+}
diff --git a/includes/normal/UtfNormalUtil.php b/includes/normal/UtfNormalUtil.php
index d772a203..0c78e5ec 100644
--- a/includes/normal/UtfNormalUtil.php
+++ b/includes/normal/UtfNormalUtil.php
@@ -1,31 +1,30 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
* Some of these functions are adapted from places in MediaWiki.
* Should probably merge them for consistency.
*
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup UtfNormal
- * @public
*/
-/** */
require_once dirname(__FILE__).'/UtfNormalDefines.php';
/**
diff --git a/includes/parser/CoreLinkFunctions.php b/includes/parser/CoreLinkFunctions.php
index d6d11880..913ec22b 100644
--- a/includes/parser/CoreLinkFunctions.php
+++ b/includes/parser/CoreLinkFunctions.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Link functions provided by MediaWiki core; experimental
+ *
+ * @file
+ */
/**
* Various core link functions, registered in Parser::firstCallInit()
diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php
index 8abcc04f..94949221 100644
--- a/includes/parser/CoreParserFunctions.php
+++ b/includes/parser/CoreParserFunctions.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Parser functions provided by MediaWiki core
+ *
+ * @file
+ */
/**
* Various core parser functions, registered in Parser::firstCallInit()
@@ -11,7 +16,7 @@ class CoreParserFunctions {
# Syntax for arguments (see self::setFunctionHook):
# "name for lookup in localized magic words array",
# function callback,
- # optional SFH_NO_HASH to omit the hash from calls (e.g. {{int:...}
+ # optional SFH_NO_HASH to omit the hash from calls (e.g. {{int:...}}
# instead of {{#int:...}})
$parser->setFunctionHook( 'int', array( __CLASS__, 'intFunction' ), SFH_NO_HASH );
@@ -81,7 +86,7 @@ class CoreParserFunctions {
static function intFunction( $parser, $part1 = '' /*, ... */ ) {
if ( strval( $part1 ) !== '' ) {
$args = array_slice( func_get_args(), 2 );
- $message = wfMsgGetKey( $part1, true, false, false );
+ $message = wfMsgGetKey( $part1, true, $parser->getOptions()->getUserLang(), false );
$message = wfMsgReplaceArgs( $message, $args );
$message = $parser->replaceVariables( $message ); // like $wgMessageCache->transform()
return $message;
@@ -95,7 +100,7 @@ class CoreParserFunctions {
$date = trim( $date );
- $pref = $parser->mOptions->getDateFormat();
+ $pref = $parser->getOptions()->getDateFormat();
// Specify a different default date format other than the the normal default
// iff the user has 'default' for their setting
@@ -124,8 +129,37 @@ class CoreParserFunctions {
return wfUrlencode( str_replace( ' ', '_', self::ns( $parser, $part1 ) ) );
}
- static function urlencode( $parser, $s = '' ) {
- return urlencode( $s );
+ /**
+ * urlencodes a string according to one of three patterns: (bug 22474)
+ *
+ * By default (for HTTP "query" strings), spaces are encoded as '+'.
+ * Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
+ * For links to "wiki"s, or similar software, spaces are encoded as '_',
+ *
+ * @param $parser Parser object
+ * @param $s String: The text to encode.
+ * @param $arg String (optional): The type of encoding.
+ */
+ static function urlencode( $parser, $s = '', $arg = null ) {
+ static $magicWords = null;
+ if ( is_null( $magicWords ) ) {
+ $magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) );
+ }
+ switch( $magicWords->matchStartToEnd( $arg ) ) {
+
+ // Encode as though it's a wiki page, '_' for ' '.
+ case 'url_wiki':
+ return wfUrlencode( str_replace( ' ', '_', $s ) );
+
+ // Encode for an HTTP Path, '%20' for ' '.
+ case 'url_path':
+ return rawurlencode( $s );
+
+ // Encode for HTTP query, '+' for ' '.
+ case 'url_query':
+ default:
+ return urlencode( $s );
+ }
}
static function lcfirst( $parser, $s = '' ) {
@@ -214,7 +248,7 @@ class CoreParserFunctions {
$user = User::newFromName( $user );
if ( $user ) {
$gender = $user->getOption( 'gender' );
- } elseif ( $parser->mOptions->getInterfaceMessage() ) {
+ } elseif ( $parser->getOptions()->getInterfaceMessage() ) {
global $wgUser;
$gender = $wgUser->getOption( 'gender' );
}
@@ -553,17 +587,14 @@ class CoreParserFunctions {
}
static function anchorencode( $parser, $text ) {
- $a = urlencode( $text );
- $a = strtr( $a, array( '%' => '.', '+' => '_' ) );
- # leave colons alone, however
- $a = str_replace( '.3A', ':', $a );
- return $a;
+ return substr( $parser->guessSectionNameFromWikiText( $text ), 1);
}
static function special( $parser, $text ) {
- $title = SpecialPage::getTitleForAlias( $text );
- if ( $title ) {
- return $title->getPrefixedText();
+ list( $page, $subpage ) = SpecialPage::resolveAliasWithSubpage( $text );
+ if ( $page ) {
+ $title = SpecialPage::getTitleFor( $page, $subpage );
+ return $title;
} else {
return wfMsgForContent( 'nosuchspecialpage' );
}
@@ -579,7 +610,7 @@ class CoreParserFunctions {
return '';
else
return( '<span class="error">' .
- wfMsg( 'duplicate-defaultsort',
+ wfMsgForContent( 'duplicate-defaultsort',
htmlspecialchars( $old ),
htmlspecialchars( $text ) ) .
'</span>' );
@@ -602,7 +633,6 @@ class CoreParserFunctions {
* Parser function to extension tag adaptor
*/
public static function tagObj( $parser, $frame, $args ) {
- $xpath = false;
if ( !count( $args ) ) {
return '';
}
@@ -617,7 +647,7 @@ class CoreParserFunctions {
$stripList = $parser->getStripList();
if ( !in_array( $tagName, $stripList ) ) {
return '<span class="error">' .
- wfMsg( 'unknown_extension_tag', $tagName ) .
+ wfMsgForContent( 'unknown_extension_tag', $tagName ) .
'</span>';
}
diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php
index 7cc8260e..33f3c824 100644
--- a/includes/parser/CoreTagHooks.php
+++ b/includes/parser/CoreTagHooks.php
@@ -1,5 +1,14 @@
<?php
+/**
+ * Tag hooks provided by MediaWiki core
+ *
+ * @file
+ */
+/**
+ * Various tag hooks, registered in Parser::firstCallInit()
+ * @ingroup Parser
+ */
class CoreTagHooks {
static function register( $parser ) {
global $wgRawHtml, $wgUseTeX;
@@ -40,7 +49,7 @@ class CoreTagHooks {
static function math( $content, $attributes, $parser ) {
global $wgContLang;
- return $wgContLang->armourMath( MathRenderer::renderMath( $content, $attributes ) );
+ return $wgContLang->armourMath( MathRenderer::renderMath( $content, $attributes, $parser->getOptions() ) );
}
static function gallery( $content, $attributes, $parser ) {
diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php
index 602bcff3..cf510171 100644
--- a/includes/parser/DateFormatter.php
+++ b/includes/parser/DateFormatter.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Date formatter
+ *
+ * @file
+ */
/**
* Date formatter, recognises dates in plain text and formats them accoding to user preferences.
@@ -29,7 +34,7 @@ class DateFormatter
/**
* @todo document
*/
- function DateFormatter() {
+ function __construct() {
global $wgContLang;
$this->monthNames = $this->getMonthRegex();
@@ -116,6 +121,7 @@ class DateFormatter
/**
* @param $preference String: User preference
* @param $text String: Text to reformat
+ * @param $options Array: can contain 'linked' and/or 'match-whole'
*/
function reformat( $preference, $text, $options = array('linked') ) {
@@ -265,7 +271,7 @@ class DateFormatter
$isoBits[] = $bits['y'];
$isoBits[] = $bits['m'];
$isoBits[] = $bits['d'];
- $isoDate = implode( '-', $isoBits );;
+ $isoDate = implode( '-', $isoBits );
// Output is not strictly HTML (it's wikitext), but <span> is whitelisted.
$text = Html::rawElement( 'span',
diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php
index 4f382a4f..19313b80 100644
--- a/includes/parser/LinkHolderArray.php
+++ b/includes/parser/LinkHolderArray.php
@@ -1,5 +1,13 @@
<?php
-
+/**
+ * Holder of replacement pairs for wiki links
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Parser
+ */
class LinkHolderArray {
var $internals = array(), $interwikis = array();
var $size = 0;
@@ -99,7 +107,7 @@ class LinkHolderArray {
function getStubThreshold() {
global $wgUser;
if ( !isset( $this->stubThreshold ) ) {
- $this->stubThreshold = $wgUser->getOption('stubthreshold');
+ $this->stubThreshold = $wgUser->getStubThreshold();
}
return $this->stubThreshold;
}
@@ -132,7 +140,7 @@ class LinkHolderArray {
global $wgContLang;
$colours = array();
- $sk = $this->parent->getOptions()->getSkin();
+ $sk = $this->parent->getOptions()->getSkin( $this->parent->mTitle );
$linkCache = LinkCache::singleton();
$output = $this->parent->getOutput();
@@ -144,12 +152,13 @@ class LinkHolderArray {
# Sort by namespace
ksort( $this->internals );
+ $linkcolour_ids = array();
+
# Generate query
$query = false;
$current = null;
foreach ( $this->internals as $ns => $entries ) {
- foreach ( $entries as $index => $entry ) {
- $key = "$ns:$index";
+ foreach ( $entries as $entry ) {
$title = $entry['title'];
$pdbk = $entry['pdbk'];
@@ -162,16 +171,19 @@ class LinkHolderArray {
# Check if it's a static known link, e.g. interwiki
if ( $title->isAlwaysKnown() ) {
$colours[$pdbk] = '';
+ } elseif ( $ns == NS_SPECIAL ) {
+ $colours[$pdbk] = 'new';
} elseif ( ( $id = $linkCache->getGoodLinkID( $pdbk ) ) != 0 ) {
$colours[$pdbk] = $sk->getLinkColour( $title, $threshold );
$output->addLink( $title, $id );
+ $linkcolour_ids[$id] = $pdbk;
} elseif ( $linkCache->isBadLink( $pdbk ) ) {
$colours[$pdbk] = 'new';
} else {
# Not in the link cache, add it to the query
if ( !isset( $current ) ) {
$current = $ns;
- $query = "SELECT page_id, page_namespace, page_title, page_is_redirect, page_len";
+ $query = "SELECT page_id, page_namespace, page_title, page_is_redirect, page_len, page_latest";
$query .= " FROM $page WHERE (page_namespace=$ns AND page_title IN(";
} elseif ( $current != $ns ) {
$current = $ns;
@@ -191,11 +203,10 @@ class LinkHolderArray {
# Fetch data and form into an associative array
# non-existent = broken
- $linkcolour_ids = array();
- while ( $s = $dbr->fetchObject($res) ) {
+ foreach ( $res as $s ) {
$title = Title::makeTitle( $s->page_namespace, $s->page_title );
$pdbk = $title->getPrefixedDBkey();
- $linkCache->addGoodLinkObj( $s->page_id, $title, $s->page_len, $s->page_is_redirect );
+ $linkCache->addGoodLinkObj( $s->page_id, $title, $s->page_len, $s->page_is_redirect, $s->page_latest );
$output->addLink( $title, $s->page_id );
# FIXME: convoluted data flow
# The redirect status and length is passed to getLinkColour via the LinkCache
@@ -205,6 +216,8 @@ class LinkHolderArray {
$linkcolour_ids[$s->page_id] = $pdbk;
}
unset( $res );
+ }
+ if ( count($linkcolour_ids) ) {
//pass an array of page_ids to an extension
wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
}
@@ -265,10 +278,12 @@ class LinkHolderArray {
wfProfileIn( __METHOD__ );
# Make interwiki link HTML
- $sk = $this->parent->getOptions()->getSkin();
+ $sk = $this->parent->getOptions()->getSkin( $this->parent->mTitle );
+ $output = $this->parent->getOutput();
$replacePairs = array();
foreach( $this->interwikis as $key => $link ) {
$replacePairs[$key] = $sk->link( $link['title'], $link['text'] );
+ $output->addInterwikiLink( $link['title'] );
}
$replacer = new HashtableReplacer( $replacePairs, 1 );
@@ -288,30 +303,52 @@ class LinkHolderArray {
$variantMap = array(); // maps $pdbkey_Variant => $keys (of link holders)
$output = $this->parent->getOutput();
$linkCache = LinkCache::singleton();
- $sk = $this->parent->getOptions()->getSkin();
+ $sk = $this->parent->getOptions()->getSkin( $this->parent->mTitle );
$threshold = $this->getStubThreshold();
-
- // Add variants of links to link batch
+ $titlesToBeConverted = '';
+ $titlesAttrs = array();
+
+ // Concatenate titles to a single string, thus we only need auto convert the
+ // single string to all variants. This would improve parser's performance
+ // significantly.
foreach ( $this->internals as $ns => $entries ) {
foreach ( $entries as $index => $entry ) {
- $key = "$ns:$index";
$pdbk = $entry['pdbk'];
- $title = $entry['title'];
- $titleText = $title->getText();
-
- // generate all variants of the link title text
- $allTextVariants = $wgContLang->convertLinkToAllVariants($titleText);
-
- // if link was not found (in first query), add all variants to query
- if ( !isset($colours[$pdbk]) ){
- foreach($allTextVariants as $textVariant){
- if($textVariant != $titleText){
- $variantTitle = Title::makeTitle( $ns, $textVariant );
- if(is_null($variantTitle)) continue;
- $linkBatch->addObj( $variantTitle );
- $variantMap[$variantTitle->getPrefixedDBkey()][] = $key;
- }
+ // we only deal with new links (in its first query)
+ if ( !isset( $colours[$pdbk] ) ) {
+ $title = $entry['title'];
+ $titleText = $title->getText();
+ $titlesAttrs[] = array(
+ 'ns' => $ns,
+ 'key' => "$ns:$index",
+ 'titleText' => $titleText,
+ );
+ // separate titles with \0 because it would never appears
+ // in a valid title
+ $titlesToBeConverted .= $titleText . "\0";
+ }
+ }
+ }
+
+ // Now do the conversion and explode string to text of titles
+ $titlesAllVariants = $wgContLang->autoConvertToAllVariants( $titlesToBeConverted );
+ $allVariantsName = array_keys( $titlesAllVariants );
+ foreach ( $titlesAllVariants as &$titlesVariant ) {
+ $titlesVariant = explode( "\0", $titlesVariant );
+ }
+ $l = count( $titlesAttrs );
+ // Then add variants of links to link batch
+ for ( $i = 0; $i < $l; $i ++ ) {
+ foreach ( $allVariantsName as $variantName ) {
+ $textVariant = $titlesAllVariants[$variantName][$i];
+ extract( $titlesAttrs[$i] );
+ if($textVariant != $titleText){
+ $variantTitle = Title::makeTitle( $ns, $textVariant );
+ if( is_null( $variantTitle ) ) {
+ continue;
}
+ $linkBatch->addObj( $variantTitle );
+ $variantMap[$variantTitle->getPrefixedDBkey()][] = $titlesAttrs[$i]['key'];
}
}
}
@@ -320,7 +357,7 @@ class LinkHolderArray {
$categoryMap = array(); // maps $category_variant => $category (dbkeys)
$varCategories = array(); // category replacements oldDBkey => newDBkey
foreach( $output->getCategoryLinks() as $category ){
- $variants = $wgContLang->convertLinkToAllVariants($category);
+ $variants = $wgContLang->autoConvertToAllVariants( $category );
foreach($variants as $variant){
if($variant != $category){
$variantTitle = Title::newFromDBkey( Title::makeName(NS_CATEGORY,$variant) );
@@ -343,7 +380,7 @@ class LinkHolderArray {
$linkcolour_ids = array();
// for each found variants, figure out link holders and replace
- while ( $s = $dbr->fetchObject($varRes) ) {
+ foreach ( $varRes as $s ) {
$variantTitle = Title::makeTitle( $s->page_namespace, $s->page_title );
$varPdbk = $variantTitle->getPrefixedDBkey();
@@ -403,8 +440,9 @@ class LinkHolderArray {
/**
* Replace <!--LINK--> link placeholders with plain text of links
* (not HTML-formatted).
- * @param string $text
- * @return string
+ *
+ * @param $text String
+ * @return String
*/
function replaceText( $text ) {
wfProfileIn( __METHOD__ );
@@ -419,7 +457,9 @@ class LinkHolderArray {
}
/**
- * @param array $matches
+ * Callback for replaceText()
+ *
+ * @param $matches Array
* @return string
* @private
*/
diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index 4f672f5b..4a3aa03b 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -17,15 +17,17 @@
* <pre>
* There are five main entry points into the Parser class:
* parse()
- * produces HTML output
+ * produces HTML output
* preSaveTransform().
- * produces altered wiki markup.
+ * produces altered wiki markup.
* preprocess()
- * removes HTML comments and expands templates
- * cleanSig()
- * Cleans a signature before saving it to preferences
+ * removes HTML comments and expands templates
+ * cleanSig() / cleanSigInSig()
+ * Cleans a signature before saving it to preferences
* extractSections()
- * Extracts sections from an article for section editing
+ * Extracts sections from an article for section editing
+ * getPreloadText()
+ * Removes <noinclude> sections, and <includeonly> tags.
*
* Globals used:
* objects: $wgLang, $wgContLang
@@ -43,8 +45,7 @@
*
* @ingroup Parser
*/
-class Parser
-{
+class Parser {
/**
* Update this version number when the ParserOutput format
* changes in an incompatible way, so the parser cache
@@ -63,7 +64,7 @@ class Parser
const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F]+)
\\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sx';
- // State constants for the definition list colon extraction
+ # State constants for the definition list colon extraction
const COLON_STATE_TEXT = 0;
const COLON_STATE_TAG = 1;
const COLON_STATE_TAGSTART = 2;
@@ -73,27 +74,25 @@ class Parser
const COLON_STATE_COMMENTDASH = 6;
const COLON_STATE_COMMENTDASHDASH = 7;
- // Flags for preprocessToDom
+ # Flags for preprocessToDom
const PTD_FOR_INCLUSION = 1;
- // Allowed values for $this->mOutputType
- // Parameter to startExternalParse().
- const OT_HTML = 1;
- const OT_WIKI = 2;
- const OT_PREPROCESS = 3;
+ # Allowed values for $this->mOutputType
+ # Parameter to startExternalParse().
+ const OT_HTML = 1; # like parse()
+ const OT_WIKI = 2; # like preSaveTransform()
+ const OT_PREPROCESS = 3; # like preprocess()
const OT_MSG = 3;
+ const OT_PLAIN = 4; # like extractSections() - portions of the original are returned unchanged.
- // Marker Suffix needs to be accessible staticly.
+ # Marker Suffix needs to be accessible staticly.
const MARKER_SUFFIX = "-QINU\x7f";
- /**#@+
- * @private
- */
# Persistent:
- var $mTagHooks, $mTransparentTagHooks, $mFunctionHooks, $mFunctionSynonyms, $mVariables,
- $mSubstWords, $mImageParams, $mImageParamsMagicArray, $mStripList, $mMarkerIndex,
- $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols, $mDefaultStripList,
- $mVarCache, $mConf, $mFunctionTagHooks;
+ var $mTagHooks, $mTransparentTagHooks, $mFunctionHooks, $mFunctionSynonyms, $mVariables;
+ var $mSubstWords, $mImageParams, $mImageParamsMagicArray, $mStripList, $mMarkerIndex;
+ var $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols, $mDefaultStripList;
+ var $mVarCache, $mConf, $mFunctionTagHooks;
# Cleared with clearState():
@@ -101,21 +100,19 @@ class Parser
var $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
var $mLinkHolders, $mLinkID;
var $mIncludeSizes, $mPPNodeCount, $mDefaultSort;
- var $mTplExpandCache; // empty-frame expansion cache
+ var $mTplExpandCache; # empty-frame expansion cache
var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
- var $mExpensiveFunctionCount; // number of expensive parser function calls
+ var $mExpensiveFunctionCount; # number of expensive parser function calls
# Temporary
# These are variables reset at least once per parse regardless of $clearState
- var $mOptions, // ParserOptions object
- $mTitle, // Title context, used for self-link rendering and similar things
- $mOutputType, // Output type, one of the OT_xxx constants
- $ot, // Shortcut alias, see setOutputType()
- $mRevisionId, // ID to display in {{REVISIONID}} tags
- $mRevisionTimestamp, // The timestamp of the specified revision ID
- $mRevIdForTs; // The revision ID which was used to fetch the timestamp
-
- /**#@-*/
+ var $mOptions; # ParserOptions object
+ var $mTitle; # Title context, used for self-link rendering and similar things
+ var $mOutputType; # Output type, one of the OT_xxx constants
+ var $ot; # Shortcut alias, see setOutputType()
+ var $mRevisionId; # ID to display in {{REVISIONID}} tags
+ var $mRevisionTimestamp; # The timestamp of the specified revision ID
+ var $mRevIdForTs; # The revision ID which was used to fetch the timestamp
/**
* Constructor
@@ -132,12 +129,12 @@ class Parser
$this->mDefaultStripList = $this->mStripList = array();
$this->mUrlProtocols = wfUrlProtocols();
$this->mExtLinkBracketedRegex = '/\[(\b(' . wfUrlProtocols() . ')'.
- '[^][<>"\\x00-\\x20\\x7F]+) *([^\]\\x0a\\x0d]*?)\]/S';
+ '[^][<>"\\x00-\\x20\\x7F]+) *([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/S';
$this->mVarCache = array();
if ( isset( $conf['preprocessorClass'] ) ) {
$this->mPreprocessorClass = $conf['preprocessorClass'];
} elseif ( extension_loaded( 'domxml' ) ) {
- // PECL extension that conflicts with the core DOM extension (bug 13770)
+ # PECL extension that conflicts with the core DOM extension (bug 13770)
wfDebug( "Warning: you have the obsolete domxml extension for PHP. Please remove it!\n" );
$this->mPreprocessorClass = 'Preprocessor_Hash';
} elseif ( extension_loaded( 'dom' ) ) {
@@ -191,6 +188,7 @@ class Parser
$this->firstCallInit();
}
$this->mOutput = new ParserOutput;
+ $this->mOptions->registerWatcher( array( $this->mOutput, 'recordOption' ) );
$this->mAutonumber = 0;
$this->mLastSection = '';
$this->mDTopen = false;
@@ -213,7 +211,7 @@ class Parser
* Must not consist of all title characters, or else it will change
* the behaviour of <nowiki> in a link.
*/
- #$this->mUniqPrefix = "\x07UNIQ" . Parser::getRandomString();
+ # $this->mUniqPrefix = "\x07UNIQ" . Parser::getRandomString();
# Changed to \x7f to allow XML double-parsing -- TS
$this->mUniqPrefix = "\x7fUNIQ" . self::getRandomString();
@@ -242,51 +240,6 @@ class Parser
wfProfileOut( __METHOD__ );
}
- function setOutputType( $ot ) {
- $this->mOutputType = $ot;
- // Shortcut alias
- $this->ot = array(
- 'html' => $ot == self::OT_HTML,
- 'wiki' => $ot == self::OT_WIKI,
- 'pre' => $ot == self::OT_PREPROCESS,
- );
- }
-
- /**
- * Set the context title
- */
- function setTitle( $t ) {
- if ( !$t || $t instanceof FakeTitle ) {
- $t = Title::newFromText( 'NO TITLE' );
- }
-
- if ( strval( $t->getFragment() ) !== '' ) {
- # Strip the fragment to avoid various odd effects
- $this->mTitle = clone $t;
- $this->mTitle->setFragment( '' );
- } else {
- $this->mTitle = $t;
- }
- }
-
- /**
- * Accessor for mUniqPrefix.
- *
- * @public
- */
- function uniqPrefix() {
- if( !isset( $this->mUniqPrefix ) ) {
- // @todo Fixme: this is probably *horribly wrong*
- // LanguageConverter seems to want $wgParser's uniqPrefix, however
- // if this is called for a parser cache hit, the parser may not
- // have ever been initialized in the first place.
- // Not really sure what the heck is supposed to be going on here.
- return '';
- //throw new MWException( "Accessing uninitialized mUniqPrefix" );
- }
- return $this->mUniqPrefix;
- }
-
/**
* Convert wikitext to HTML
* Do not call this function recursively.
@@ -310,16 +263,16 @@ class Parser
wfProfileIn( __METHOD__ );
wfProfileIn( $fname );
+ $this->mOptions = $options;
if ( $clearState ) {
$this->clearState();
}
- $this->mOptions = $options;
- $this->setTitle( $title ); // Page title has to be set for the pre-processor
+ $this->setTitle( $title ); # Page title has to be set for the pre-processor
$oldRevisionId = $this->mRevisionId;
$oldRevisionTimestamp = $this->mRevisionTimestamp;
- if( $revid !== null ) {
+ if ( $revid !== null ) {
$this->mRevisionId = $revid;
$this->mRevisionTimestamp = null;
}
@@ -335,12 +288,12 @@ class Parser
$fixtags = array(
# french spaces, last one Guillemet-left
# only if there is something before the space
- '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&nbsp;\\2',
+ '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;\\2',
# french spaces, Guillemet-right
- '/(\\302\\253) /' => '\\1&nbsp;',
- '/&nbsp;(!\s*important)/' => ' \\1', #Beware of CSS magic word !important, bug #11874.
+ '/(\\302\\253) /' => '\\1&#160;',
+ '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
);
- $text = preg_replace( array_keys($fixtags), array_values($fixtags), $text );
+ $text = preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
$text = $this->doBlockLevels( $text, $linestart );
@@ -364,18 +317,11 @@ class Parser
}
/**
- * A page get its title converted except:
- * a) Language conversion is globally disabled
- * b) Title convert is globally disabled
- * c) The page is a redirect page
- * d) User request with a "linkconvert" set to "no"
- * e) A "nocontentconvert" magic word has been set
- * f) A "notitleconvert" magic word has been set
- * g) User sets "noconvertlink" in his/her preference
- *
- * Note that if a user tries to set a title in a conversion
- * rule but content conversion was not done, then the parser
- * won't pick it up. This is probably expected behavior.
+ * A converted title will be provided in the output object if title and
+ * content conversion are enabled, the article text does not contain
+ * a conversion-suppressing double-underscore tag, and no
+ * {{DISPLAYTITLE:...}} is present. DISPLAYTITLE takes precedence over
+ * automatic link conversion.
*/
if ( !( $wgDisableLangConversion
|| $wgDisableTitleConversion
@@ -401,14 +347,13 @@ class Parser
$uniq_prefix = $this->mUniqPrefix;
$matches = array();
$elements = array_keys( $this->mTransparentTagHooks );
- $text = self::extractTagsAndParams( $elements, $text, $matches, $uniq_prefix );
+ $text = $this->extractTagsAndParams( $elements, $text, $matches, $uniq_prefix );
- foreach( $matches as $marker => $data ) {
+ foreach ( $matches as $marker => $data ) {
list( $element, $content, $params, $tag ) = $data;
$tagName = strtolower( $element );
- if( isset( $this->mTransparentTagHooks[$tagName] ) ) {
- $output = call_user_func_array( $this->mTransparentTagHooks[$tagName],
- array( $content, $params, $this ) );
+ if ( isset( $this->mTransparentTagHooks[$tagName] ) ) {
+ $output = call_user_func_array( $this->mTransparentTagHooks[$tagName], array( $content, $params, $this ) );
} else {
$output = $tag;
}
@@ -418,7 +363,7 @@ class Parser
$text = Sanitizer::normalizeCharReferences( $text );
- if ( ( $wgUseTidy && $this->mOptions->mTidy ) || $wgAlwaysUseTidy ) {
+ if ( ( $wgUseTidy && $this->mOptions->getTidy() ) || $wgAlwaysUseTidy ) {
$text = MWTidy::tidy( $text );
} else {
# attempt to sanitize at least some nesting problems
@@ -460,7 +405,7 @@ class Parser
$PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/$wgExpensiveParserFunctionLimit\n";
$limitReport =
"NewPP limit report\n" .
- "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->mMaxPPNodeCount}\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".
$PFreport;
@@ -484,7 +429,7 @@ class Parser
* If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
*
* @param $text String: text extension wants to have parsed
- * @param PPFrame $frame: The frame to use for expanding any template variables
+ * @param $frame PPFrame: The frame to use for expanding any template variables
*/
function recursiveTagParse( $text, $frame=false ) {
wfProfileIn( __METHOD__ );
@@ -499,13 +444,13 @@ class Parser
* Expand templates and variables in the text, producing valid, static wikitext.
* Also removes comments.
*/
- function preprocess( $text, $title, $options, $revid = null ) {
+ function preprocess( $text, Title $title, ParserOptions $options, $revid = null ) {
wfProfileIn( __METHOD__ );
+ $this->mOptions = $options;
$this->clearState();
$this->setOutputType( self::OT_PREPROCESS );
- $this->mOptions = $options;
$this->setTitle( $title );
- if( $revid !== null ) {
+ if ( $revid !== null ) {
$this->mRevisionId = $revid;
}
wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -517,20 +462,146 @@ class Parser
}
/**
+ * Process the wikitext for the ?preload= feature. (bug 5210)
+ *
+ * <noinclude>, <includeonly> etc. are parsed as for template transclusion,
+ * comments, templates, arguments, tags hooks and parser functions are untouched.
+ */
+ public function getPreloadText( $text, Title $title, ParserOptions $options ) {
+ # Parser (re)initialisation
+ $this->mOptions = $options;
+ $this->clearState();
+ $this->setOutputType( self::OT_PLAIN );
+ $this->setTitle( $title );
+
+ $flags = PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES;
+ $dom = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
+ $text = $this->getPreprocessor()->newFrame()->expand( $dom, $flags );
+ $text = $this->mStripState->unstripBoth( $text );
+ return $text;
+ }
+
+ /**
* Get a random string
*
* @private
* @static
*/
- function getRandomString() {
- return dechex(mt_rand(0, 0x7fffffff)) . dechex(mt_rand(0, 0x7fffffff));
+ static private function getRandomString() {
+ return dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) );
+ }
+
+ /**
+ * Accessor for mUniqPrefix.
+ *
+ * @return String
+ */
+ public function uniqPrefix() {
+ if ( !isset( $this->mUniqPrefix ) ) {
+ # @todo Fixme: this is probably *horribly wrong*
+ # LanguageConverter seems to want $wgParser's uniqPrefix, however
+ # if this is called for a parser cache hit, the parser may not
+ # have ever been initialized in the first place.
+ # Not really sure what the heck is supposed to be going on here.
+ return '';
+ # throw new MWException( "Accessing uninitialized mUniqPrefix" );
+ }
+ return $this->mUniqPrefix;
+ }
+
+ /**
+ * Set the context title
+ */
+ function setTitle( $t ) {
+ if ( !$t || $t instanceof FakeTitle ) {
+ $t = Title::newFromText( 'NO TITLE' );
+ }
+
+ if ( strval( $t->getFragment() ) !== '' ) {
+ # Strip the fragment to avoid various odd effects
+ $this->mTitle = clone $t;
+ $this->mTitle->setFragment( '' );
+ } else {
+ $this->mTitle = $t;
+ }
+ }
+
+ /**
+ * Accessor for the Title object
+ *
+ * @return Title object
+ */
+ function getTitle() {
+ return $this->mTitle;
+ }
+
+ /**
+ * Accessor/mutator for the Title object
+ *
+ * @param $x New Title object or null to just get the current one
+ * @return Title object
+ */
+ function Title( $x = null ) {
+ return wfSetVar( $this->mTitle, $x );
+ }
+
+ /**
+ * Set the output type
+ *
+ * @param $ot Integer: new value
+ */
+ function setOutputType( $ot ) {
+ $this->mOutputType = $ot;
+ # Shortcut alias
+ $this->ot = array(
+ 'html' => $ot == self::OT_HTML,
+ 'wiki' => $ot == self::OT_WIKI,
+ 'pre' => $ot == self::OT_PREPROCESS,
+ 'plain' => $ot == self::OT_PLAIN,
+ );
}
- function &getTitle() { return $this->mTitle; }
- function getOptions() { return $this->mOptions; }
- function getRevisionId() { return $this->mRevisionId; }
- function getOutput() { return $this->mOutput; }
- function nextLinkID() { return $this->mLinkID++; }
+ /**
+ * Accessor/mutator for the output type
+ *
+ * @param $x New value or null to just get the current one
+ * @return Integer
+ */
+ function OutputType( $x = null ) {
+ return wfSetVar( $this->mOutputType, $x );
+ }
+
+ /**
+ * Get the ParserOutput object
+ *
+ * @return ParserOutput object
+ */
+ function getOutput() {
+ return $this->mOutput;
+ }
+
+ /**
+ * Get the ParserOptions object
+ *
+ * @return ParserOptions object
+ */
+ function getOptions() {
+ return $this->mOptions;
+ }
+
+ /**
+ * Accessor/mutator for the ParserOptions object
+ *
+ * @param $x New value or null to just get the current one
+ * @return Current ParserOptions object
+ */
+ function Options( $x = null ) {
+ return wfSetVar( $this->mOptions, $x );
+ }
+
+ function nextLinkID() {
+ return $this->mLinkID++;
+ }
function getFunctionLang() {
global $wgLang, $wgContLang;
@@ -545,6 +616,8 @@ class Parser
/**
* Get a preprocessor object
+ *
+ * @return Preprocessor instance
*/
function getPreprocessor() {
if ( !isset( $this->mPreprocessor ) ) {
@@ -567,12 +640,13 @@ class Parser
*
* @param $elements list of element names. Comments are always extracted.
* @param $text Source text string.
+ * @param $matches Out parameter, Array: extracted tags
* @param $uniq_prefix
+ * @return String: stripped text
*
- * @public
* @static
*/
- function extractTagsAndParams($elements, $text, &$matches, $uniq_prefix = ''){
+ public function extractTagsAndParams( $elements, $text, &$matches, $uniq_prefix = '' ) {
static $n = 1;
$stripped = '';
$matches = array();
@@ -583,40 +657,40 @@ class Parser
while ( $text != '' ) {
$p = preg_split( $start, $text, 2, PREG_SPLIT_DELIM_CAPTURE );
$stripped .= $p[0];
- if( count( $p ) < 5 ) {
+ if ( count( $p ) < 5 ) {
break;
}
- if( count( $p ) > 5 ) {
- // comment
+ if ( count( $p ) > 5 ) {
+ # comment
$element = $p[4];
$attributes = '';
$close = '';
$inside = $p[5];
} else {
- // tag
+ # tag
$element = $p[1];
$attributes = $p[2];
$close = $p[3];
$inside = $p[4];
}
- $marker = "$uniq_prefix-$element-" . sprintf('%08X', $n++) . self::MARKER_SUFFIX;
+ $marker = "$uniq_prefix-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX;
$stripped .= $marker;
if ( $close === '/>' ) {
- // Empty element tag, <tag />
+ # Empty element tag, <tag />
$content = null;
$text = $inside;
$tail = null;
} else {
- if( $element === '!--' ) {
+ if ( $element === '!--' ) {
$end = '/(-->)/';
} else {
$end = "/(<\\/$element\\s*>)/i";
}
$q = preg_split( $end, $inside, 2, PREG_SPLIT_DELIM_CAPTURE );
$content = $q[0];
- if( count( $q ) < 3 ) {
+ if ( count( $q ) < 3 ) {
# No end tag -- let it run out to the end of the text.
$tail = '';
$text = '';
@@ -644,7 +718,7 @@ class Parser
/**
* @deprecated use replaceVariables
*/
- function strip( $text, $state, $stripcomments = false , $dontstrip = array () ) {
+ function strip( $text, $state, $stripcomments = false , $dontstrip = array() ) {
return $text;
}
@@ -704,34 +778,35 @@ class Parser
*
* @private
*/
- function doTableStuff ( $text ) {
+ function doTableStuff( $text ) {
wfProfileIn( __METHOD__ );
-
+
$lines = StringUtils::explode( "\n", $text );
$out = '';
- $td_history = array (); // Is currently a td tag open?
- $last_tag_history = array (); // Save history of last lag activated (td, th or caption)
- $tr_history = array (); // Is currently a tr tag open?
- $tr_attributes = array (); // history of tr attributes
- $has_opened_tr = array(); // Did this table open a <tr> element?
- $indent_level = 0; // indent level of the table
+ $td_history = array(); # Is currently a td tag open?
+ $last_tag_history = array(); # Save history of last lag activated (td, th or caption)
+ $tr_history = array(); # Is currently a tr tag open?
+ $tr_attributes = array(); # history of tr attributes
+ $has_opened_tr = array(); # Did this table open a <tr> element?
+ $indent_level = 0; # indent level of the table
foreach ( $lines as $outLine ) {
$line = trim( $outLine );
- if( $line == '' ) { // empty line, go to next line
+ if ( $line === '' ) { # empty line, go to next line
$out .= $outLine."\n";
continue;
}
+
$first_character = $line[0];
$matches = array();
if ( preg_match( '/^(:*)\{\|(.*)$/', $line , $matches ) ) {
- // First check if we are starting a new table
+ # First check if we are starting a new table
$indent_level = strlen( $matches[1] );
$attributes = $this->mStripState->unstripBoth( $matches[2] );
- $attributes = Sanitizer::fixTagAttributes ( $attributes , 'table' );
+ $attributes = Sanitizer::fixTagAttributes( $attributes , 'table' );
$outLine = str_repeat( '<dl><dd>' , $indent_level ) . "<table{$attributes}>";
array_push( $td_history , false );
@@ -739,156 +814,152 @@ class Parser
array_push( $tr_history , false );
array_push( $tr_attributes , '' );
array_push( $has_opened_tr , false );
- } else if ( count ( $td_history ) == 0 ) {
- // Don't do any of the following
+ } elseif ( count( $td_history ) == 0 ) {
+ # Don't do any of the following
$out .= $outLine."\n";
continue;
- } else if ( substr ( $line , 0 , 2 ) === '|}' ) {
- // We are ending a table
- $line = '</table>' . substr ( $line , 2 );
- $last_tag = array_pop ( $last_tag_history );
+ } elseif ( substr( $line , 0 , 2 ) === '|}' ) {
+ # We are ending a table
+ $line = '</table>' . substr( $line , 2 );
+ $last_tag = array_pop( $last_tag_history );
- if ( !array_pop ( $has_opened_tr ) ) {
+ if ( !array_pop( $has_opened_tr ) ) {
$line = "<tr><td></td></tr>{$line}";
}
- if ( array_pop ( $tr_history ) ) {
+ if ( array_pop( $tr_history ) ) {
$line = "</tr>{$line}";
}
- if ( array_pop ( $td_history ) ) {
+ if ( array_pop( $td_history ) ) {
$line = "</{$last_tag}>{$line}";
}
- array_pop ( $tr_attributes );
+ array_pop( $tr_attributes );
$outLine = $line . str_repeat( '</dd></dl>' , $indent_level );
- } else if ( substr ( $line , 0 , 2 ) === '|-' ) {
- // Now we have a table row
+ } elseif ( substr( $line , 0 , 2 ) === '|-' ) {
+ # Now we have a table row
$line = preg_replace( '#^\|-+#', '', $line );
- // Whats after the tag is now only attributes
+ # Whats after the tag is now only attributes
$attributes = $this->mStripState->unstripBoth( $line );
$attributes = Sanitizer::fixTagAttributes( $attributes, 'tr' );
array_pop( $tr_attributes );
array_push( $tr_attributes, $attributes );
$line = '';
- $last_tag = array_pop ( $last_tag_history );
- array_pop ( $has_opened_tr );
- array_push ( $has_opened_tr , true );
+ $last_tag = array_pop( $last_tag_history );
+ array_pop( $has_opened_tr );
+ array_push( $has_opened_tr , true );
- if ( array_pop ( $tr_history ) ) {
+ if ( array_pop( $tr_history ) ) {
$line = '</tr>';
}
- if ( array_pop ( $td_history ) ) {
+ if ( array_pop( $td_history ) ) {
$line = "</{$last_tag}>{$line}";
}
$outLine = $line;
- array_push ( $tr_history , false );
- array_push ( $td_history , false );
- array_push ( $last_tag_history , '' );
- }
- else if ( $first_character === '|' || $first_character === '!' || substr ( $line , 0 , 2 ) === '|+' ) {
- // This might be cell elements, td, th or captions
- if ( substr ( $line , 0 , 2 ) === '|+' ) {
+ array_push( $tr_history , false );
+ array_push( $td_history , false );
+ array_push( $last_tag_history , '' );
+ } elseif ( $first_character === '|' || $first_character === '!' || substr( $line , 0 , 2 ) === '|+' ) {
+ # This might be cell elements, td, th or captions
+ if ( substr( $line , 0 , 2 ) === '|+' ) {
$first_character = '+';
- $line = substr ( $line , 1 );
+ $line = substr( $line , 1 );
}
- $line = substr ( $line , 1 );
+ $line = substr( $line , 1 );
if ( $first_character === '!' ) {
- $line = str_replace ( '!!' , '||' , $line );
+ $line = str_replace( '!!' , '||' , $line );
}
- // Split up multiple cells on the same line.
- // FIXME : This can result in improper nesting of tags processed
- // by earlier parser steps, but should avoid splitting up eg
- // attribute values containing literal "||".
+ # Split up multiple cells on the same line.
+ # FIXME : This can result in improper nesting of tags processed
+ # by earlier parser steps, but should avoid splitting up eg
+ # attribute values containing literal "||".
$cells = StringUtils::explodeMarkup( '||' , $line );
$outLine = '';
- // Loop through each table cell
- foreach ( $cells as $cell )
- {
+ # Loop through each table cell
+ foreach ( $cells as $cell ) {
$previous = '';
- if ( $first_character !== '+' )
- {
- $tr_after = array_pop ( $tr_attributes );
- if ( !array_pop ( $tr_history ) ) {
+ if ( $first_character !== '+' ) {
+ $tr_after = array_pop( $tr_attributes );
+ if ( !array_pop( $tr_history ) ) {
$previous = "<tr{$tr_after}>\n";
}
- array_push ( $tr_history , true );
- array_push ( $tr_attributes , '' );
- array_pop ( $has_opened_tr );
- array_push ( $has_opened_tr , true );
+ array_push( $tr_history , true );
+ array_push( $tr_attributes , '' );
+ array_pop( $has_opened_tr );
+ array_push( $has_opened_tr , true );
}
- $last_tag = array_pop ( $last_tag_history );
+ $last_tag = array_pop( $last_tag_history );
- if ( array_pop ( $td_history ) ) {
- $previous = "</{$last_tag}>{$previous}";
+ if ( array_pop( $td_history ) ) {
+ $previous = "</{$last_tag}>\n{$previous}";
}
if ( $first_character === '|' ) {
$last_tag = 'td';
- } else if ( $first_character === '!' ) {
+ } elseif ( $first_character === '!' ) {
$last_tag = 'th';
- } else if ( $first_character === '+' ) {
+ } elseif ( $first_character === '+' ) {
$last_tag = 'caption';
} else {
$last_tag = '';
}
- array_push ( $last_tag_history , $last_tag );
+ array_push( $last_tag_history , $last_tag );
- // A cell could contain both parameters and data
- $cell_data = explode ( '|' , $cell , 2 );
+ # A cell could contain both parameters and data
+ $cell_data = explode( '|' , $cell , 2 );
- // Bug 553: Note that a '|' inside an invalid link should not
- // be mistaken as delimiting cell parameters
+ # Bug 553: Note that a '|' inside an invalid link should not
+ # be mistaken as delimiting cell parameters
if ( strpos( $cell_data[0], '[[' ) !== false ) {
$cell = "{$previous}<{$last_tag}>{$cell}";
- } else if ( count ( $cell_data ) == 1 )
+ } elseif ( count( $cell_data ) == 1 ) {
$cell = "{$previous}<{$last_tag}>{$cell_data[0]}";
- else {
+ } else {
$attributes = $this->mStripState->unstripBoth( $cell_data[0] );
$attributes = Sanitizer::fixTagAttributes( $attributes , $last_tag );
$cell = "{$previous}<{$last_tag}{$attributes}>{$cell_data[1]}";
}
$outLine .= $cell;
- array_push ( $td_history , true );
+ array_push( $td_history , true );
}
}
$out .= $outLine . "\n";
}
- // Closing open td, tr && table
- while ( count ( $td_history ) > 0 )
- {
- if ( array_pop ( $td_history ) ) {
+ # Closing open td, tr && table
+ while ( count( $td_history ) > 0 ) {
+ if ( array_pop( $td_history ) ) {
$out .= "</td>\n";
}
- if ( array_pop ( $tr_history ) ) {
+ if ( array_pop( $tr_history ) ) {
$out .= "</tr>\n";
}
- if ( !array_pop ( $has_opened_tr ) ) {
+ if ( !array_pop( $has_opened_tr ) ) {
$out .= "<tr><td></td></tr>\n" ;
}
$out .= "</table>\n";
}
- // Remove trailing line-ending (b/c)
+ # Remove trailing line-ending (b/c)
if ( substr( $out, -1 ) === "\n" ) {
$out = substr( $out, 0, -1 );
}
- // special case: don't return empty table
- if( $out === "<table>\n<tr><td></td></tr>\n</table>" ) {
+ # special case: don't return empty table
+ if ( $out === "<table>\n<tr><td></td></tr>\n</table>" ) {
$out = '';
}
@@ -914,29 +985,29 @@ class Parser
return $text ;
}
- // if $frame is provided, then use $frame for replacing any variables
- if ($frame) {
- // use frame depth to infer how include/noinclude tags should be handled
- // depth=0 means this is the top-level document; otherwise it's an included document
- if( !$frame->depth )
+ # if $frame is provided, then use $frame for replacing any variables
+ if ( $frame ) {
+ # use frame depth to infer how include/noinclude tags should be handled
+ # depth=0 means this is the top-level document; otherwise it's an included document
+ if ( !$frame->depth ) {
$flag = 0;
- else
+ } else {
$flag = Parser::PTD_FOR_INCLUSION;
+ }
$dom = $this->preprocessToDom( $text, $flag );
$text = $frame->expand( $dom );
- }
- // if $frame is not provided, then use old-style replaceVariables
- else {
+ } else {
+ # if $frame is not provided, then use old-style replaceVariables
$text = $this->replaceVariables( $text );
}
$text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ), false, array_keys( $this->mTransparentTagHooks ) );
wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState ) );
- // Tables need to come after variable replacement for things to work
- // properly; putting them before other transformations should keep
- // exciting things like link expansions from showing up in surprising
- // places.
+ # Tables need to come after variable replacement for things to work
+ # properly; putting them before other transformations should keep
+ # exciting things like link expansions from showing up in surprising
+ # places.
$text = $this->doTableStuff( $text );
$text = preg_replace( '/(^|\n)-----*/', '\\1<hr />', $text );
@@ -944,17 +1015,17 @@ class Parser
$text = $this->doDoubleUnderscore( $text );
$text = $this->doHeadings( $text );
- if( $this->mOptions->getUseDynamicDates() ) {
+ if ( $this->mOptions->getUseDynamicDates() ) {
$df = DateFormatter::getInstance();
$text = $df->reformat( $this->mOptions->getDateFormat(), $text );
}
- $text = $this->doAllQuotes( $text );
$text = $this->replaceInternalLinks( $text );
+ $text = $this->doAllQuotes( $text );
$text = $this->replaceExternalLinks( $text );
# replaceInternalLinks may sometimes leave behind
# absolute URLs, which have to be masked to hide them from replaceExternalLinks
- $text = str_replace($this->mUniqPrefix.'NOPARSE', '', $text);
+ $text = str_replace( $this->mUniqPrefix.'NOPARSE', '', $text );
$text = $this->doMagicLinks( $text );
$text = $this->formatHeadings( $text, $origText, $isMain );
@@ -976,7 +1047,7 @@ class Parser
$urlChar = self::EXT_LINK_URL_CLASS;
$text = preg_replace_callback(
'!(?: # Start cases
- (<a.*?</a>) | # m[1]: Skip link text
+ (<a[ \t\r\n>].*?</a>) | # m[1]: Skip link text
(<.*?>) | # m[2]: Skip stuff inside HTML elements' . "
(\\b(?:$prots)$urlChar+) | # m[3]: Free external links" . '
(?:RFC|PMID)\s+([0-9]+) | # m[4]: RFC or PMID, capture number
@@ -1002,7 +1073,6 @@ class Parser
return $this->makeFreeExternalLink( $m[0] );
} elseif ( isset( $m[4] ) && $m[4] !== '' ) {
# RFC or PMID
- $CssClass = '';
if ( substr( $m[0], 0, 3 ) === 'RFC' ) {
$keyword = 'RFC';
$urlmsg = 'rfcurl';
@@ -1015,10 +1085,10 @@ class Parser
$id = $m[4];
} else {
throw new MWException( __METHOD__.': unrecognised match type "' .
- substr($m[0], 0, 20 ) . '"' );
+ substr( $m[0], 0, 20 ) . '"' );
}
- $url = wfMsg( $urlmsg, $id);
- $sk = $this->mOptions->getSkin();
+ $url = wfMsgForContent( $urlmsg, $id);
+ $sk = $this->mOptions->getSkin( $this->mTitle );
$la = $sk->getExternalLinkAttributes( "external $CssClass" );
return "<a href=\"{$url}\"{$la}>{$keyword} {$id}</a>";
} elseif ( isset( $m[5] ) && $m[5] !== '' ) {
@@ -1047,16 +1117,16 @@ class Parser
global $wgContLang;
wfProfileIn( __METHOD__ );
- $sk = $this->mOptions->getSkin();
+ $sk = $this->mOptions->getSkin( $this->mTitle );
$trail = '';
# The characters '<' and '>' (which were escaped by
# removeHTMLtags()) should not be included in
# URLs, per RFC 2396.
$m2 = array();
- if (preg_match('/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE)) {
- $trail = substr($url, $m2[0][1]) . $trail;
- $url = substr($url, 0, $m2[0][1]);
+ if ( preg_match( '/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE ) ) {
+ $trail = substr( $url, $m2[0][1] ) . $trail;
+ $url = substr( $url, 0, $m2[0][1] );
}
# Move trailing punctuation to $trail
@@ -1118,7 +1188,7 @@ class Parser
foreach ( $lines as $line ) {
$outtext .= $this->doQuotes( $line ) . "\n";
}
- $outtext = substr($outtext, 0,-1);
+ $outtext = substr( $outtext, 0,-1 );
wfProfileOut( __METHOD__ );
return $outtext;
}
@@ -1128,89 +1198,84 @@ class Parser
*/
public function doQuotes( $text ) {
$arr = preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
- if ( count( $arr ) == 1 )
+ if ( count( $arr ) == 1 ) {
return $text;
- else
- {
+ } else {
# First, do some preliminary work. This may shift some apostrophes from
# being mark-up to being text. It also counts the number of occurrences
# of bold and italics mark-ups.
- $i = 0;
$numbold = 0;
$numitalics = 0;
- foreach ( $arr as $r )
- {
- if ( ( $i % 2 ) == 1 )
- {
+ for ( $i = 0; $i < count( $arr ); $i++ ) {
+ if ( ( $i % 2 ) == 1 ) {
# If there are ever four apostrophes, assume the first is supposed to
# be text, and the remaining three constitute mark-up for bold text.
- if ( strlen( $arr[$i] ) == 4 )
- {
+ if ( strlen( $arr[$i] ) == 4 ) {
$arr[$i-1] .= "'";
$arr[$i] = "'''";
- }
- # If there are more than 5 apostrophes in a row, assume they're all
- # text except for the last 5.
- else if ( strlen( $arr[$i] ) > 5 )
- {
+ } elseif ( strlen( $arr[$i] ) > 5 ) {
+ # If there are more than 5 apostrophes in a row, assume they're all
+ # text except for the last 5.
$arr[$i-1] .= str_repeat( "'", strlen( $arr[$i] ) - 5 );
$arr[$i] = "'''''";
}
# Count the number of occurrences of bold and italics mark-ups.
# We are not counting sequences of five apostrophes.
- if ( strlen( $arr[$i] ) == 2 ) { $numitalics++; }
- else if ( strlen( $arr[$i] ) == 3 ) { $numbold++; }
- else if ( strlen( $arr[$i] ) == 5 ) { $numitalics++; $numbold++; }
+ if ( strlen( $arr[$i] ) == 2 ) {
+ $numitalics++;
+ } elseif ( strlen( $arr[$i] ) == 3 ) {
+ $numbold++;
+ } elseif ( strlen( $arr[$i] ) == 5 ) {
+ $numitalics++;
+ $numbold++;
+ }
}
- $i++;
}
# If there is an odd number of both bold and italics, it is likely
# that one of the bold ones was meant to be an apostrophe followed
# by italics. Which one we cannot know for certain, but it is more
# likely to be one that has a single-letter word before it.
- if ( ( $numbold % 2 == 1 ) && ( $numitalics % 2 == 1 ) )
- {
+ if ( ( $numbold % 2 == 1 ) && ( $numitalics % 2 == 1 ) ) {
$i = 0;
$firstsingleletterword = -1;
$firstmultiletterword = -1;
$firstspace = -1;
- foreach ( $arr as $r )
- {
- if ( ( $i % 2 == 1 ) and ( strlen( $r ) == 3 ) )
- {
- $x1 = substr ($arr[$i-1], -1);
- $x2 = substr ($arr[$i-1], -2, 1);
- if ($x1 === ' ') {
- if ($firstspace == -1) $firstspace = $i;
- } else if ($x2 === ' ') {
- if ($firstsingleletterword == -1) $firstsingleletterword = $i;
+ foreach ( $arr as $r ) {
+ if ( ( $i % 2 == 1 ) and ( strlen( $r ) == 3 ) ) {
+ $x1 = substr( $arr[$i-1], -1 );
+ $x2 = substr( $arr[$i-1], -2, 1 );
+ if ( $x1 === ' ' ) {
+ if ( $firstspace == -1 ) {
+ $firstspace = $i;
+ }
+ } elseif ( $x2 === ' ') {
+ if ( $firstsingleletterword == -1 ) {
+ $firstsingleletterword = $i;
+ }
} else {
- if ($firstmultiletterword == -1) $firstmultiletterword = $i;
+ if ( $firstmultiletterword == -1 ) {
+ $firstmultiletterword = $i;
+ }
}
}
$i++;
}
# If there is a single-letter word, use it!
- if ($firstsingleletterword > -1)
- {
- $arr [ $firstsingleletterword ] = "''";
- $arr [ $firstsingleletterword-1 ] .= "'";
- }
- # If not, but there's a multi-letter word, use that one.
- else if ($firstmultiletterword > -1)
- {
- $arr [ $firstmultiletterword ] = "''";
- $arr [ $firstmultiletterword-1 ] .= "'";
- }
- # ... otherwise use the first one that has neither.
- # (notice that it is possible for all three to be -1 if, for example,
- # there is only one pentuple-apostrophe in the line)
- else if ($firstspace > -1)
- {
- $arr [ $firstspace ] = "''";
- $arr [ $firstspace-1 ] .= "'";
+ if ( $firstsingleletterword > -1 ) {
+ $arr[$firstsingleletterword] = "''";
+ $arr[$firstsingleletterword-1] .= "'";
+ } elseif ( $firstmultiletterword > -1 ) {
+ # If not, but there's a multi-letter word, use that one.
+ $arr[$firstmultiletterword] = "''";
+ $arr[$firstmultiletterword-1] .= "'";
+ } elseif ( $firstspace > -1 ) {
+ # ... otherwise use the first one that has neither.
+ # (notice that it is possible for all three to be -1 if, for example,
+ # there is only one pentuple-apostrophe in the line)
+ $arr[$firstspace] = "''";
+ $arr[$firstspace-1] .= "'";
}
}
@@ -1219,71 +1284,70 @@ class Parser
$buffer = '';
$state = '';
$i = 0;
- foreach ($arr as $r)
- {
- if (($i % 2) == 0)
- {
- if ($state === 'both')
+ foreach ( $arr as $r ) {
+ if ( ( $i % 2 ) == 0 ) {
+ if ( $state === 'both' ) {
$buffer .= $r;
- else
+ } else {
$output .= $r;
- }
- else
- {
- if (strlen ($r) == 2)
- {
- if ($state === 'i')
- { $output .= '</i>'; $state = ''; }
- else if ($state === 'bi')
- { $output .= '</i>'; $state = 'b'; }
- else if ($state === 'ib')
- { $output .= '</b></i><b>'; $state = 'b'; }
- else if ($state === 'both')
- { $output .= '<b><i>'.$buffer.'</i>'; $state = 'b'; }
- else # $state can be 'b' or ''
- { $output .= '<i>'; $state .= 'i'; }
- }
- else if (strlen ($r) == 3)
- {
- if ($state === 'b')
- { $output .= '</b>'; $state = ''; }
- else if ($state === 'bi')
- { $output .= '</i></b><i>'; $state = 'i'; }
- else if ($state === 'ib')
- { $output .= '</b>'; $state = 'i'; }
- else if ($state === 'both')
- { $output .= '<i><b>'.$buffer.'</b>'; $state = 'i'; }
- else # $state can be 'i' or ''
- { $output .= '<b>'; $state .= 'b'; }
}
- else if (strlen ($r) == 5)
- {
- if ($state === 'b')
- { $output .= '</b><i>'; $state = 'i'; }
- else if ($state === 'i')
- { $output .= '</i><b>'; $state = 'b'; }
- else if ($state === 'bi')
- { $output .= '</i></b>'; $state = ''; }
- else if ($state === 'ib')
- { $output .= '</b></i>'; $state = ''; }
- else if ($state === 'both')
- { $output .= '<i><b>'.$buffer.'</b></i>'; $state = ''; }
- else # ($state == '')
- { $buffer = ''; $state = 'both'; }
+ } else {
+ if ( strlen( $r ) == 2 ) {
+ if ( $state === 'i' ) {
+ $output .= '</i>'; $state = '';
+ } elseif ( $state === 'bi' ) {
+ $output .= '</i>'; $state = 'b';
+ } elseif ( $state === 'ib' ) {
+ $output .= '</b></i><b>'; $state = 'b';
+ } elseif ( $state === 'both' ) {
+ $output .= '<b><i>'.$buffer.'</i>'; $state = 'b';
+ } else { # $state can be 'b' or ''
+ $output .= '<i>'; $state .= 'i';
+ }
+ } elseif ( strlen( $r ) == 3 ) {
+ if ( $state === 'b' ) {
+ $output .= '</b>'; $state = '';
+ } elseif ( $state === 'bi' ) {
+ $output .= '</i></b><i>'; $state = 'i';
+ } elseif ( $state === 'ib' ) {
+ $output .= '</b>'; $state = 'i';
+ } elseif ( $state === 'both' ) {
+ $output .= '<i><b>'.$buffer.'</b>'; $state = 'i';
+ } else { # $state can be 'i' or ''
+ $output .= '<b>'; $state .= 'b';
+ }
+ } elseif ( strlen( $r ) == 5 ) {
+ if ( $state === 'b' ) {
+ $output .= '</b><i>'; $state = 'i';
+ } elseif ( $state === 'i' ) {
+ $output .= '</i><b>'; $state = 'b';
+ } elseif ( $state === 'bi' ) {
+ $output .= '</i></b>'; $state = '';
+ } elseif ( $state === 'ib' ) {
+ $output .= '</b></i>'; $state = '';
+ } elseif ( $state === 'both' ) {
+ $output .= '<i><b>'.$buffer.'</b></i>'; $state = '';
+ } else { # ($state == '')
+ $buffer = ''; $state = 'both';
+ }
}
}
$i++;
}
# Now close all remaining tags. Notice that the order is important.
- if ($state === 'b' || $state === 'ib')
+ if ( $state === 'b' || $state === 'ib' ) {
$output .= '</b>';
- if ($state === 'i' || $state === 'bi' || $state === 'ib')
+ }
+ if ( $state === 'i' || $state === 'bi' || $state === 'ib' ) {
$output .= '</i>';
- if ($state === 'bi')
+ }
+ if ( $state === 'bi' ) {
$output .= '</b>';
+ }
# There might be lonely ''''', so make sure we have a buffer
- if ($state === 'both' && $buffer)
+ if ( $state === 'both' && $buffer ) {
$output .= '<b><i>'.$buffer.'</i></b>';
+ }
return $output;
}
}
@@ -1300,7 +1364,7 @@ class Parser
global $wgContLang;
wfProfileIn( __METHOD__ );
- $sk = $this->mOptions->getSkin();
+ $sk = $this->mOptions->getSkin( $this->mTitle );
$bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
$s = array_shift( $bits );
@@ -1316,9 +1380,9 @@ class Parser
# removeHTMLtags()) should not be included in
# URLs, per RFC 2396.
$m2 = array();
- if (preg_match('/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE)) {
- $text = substr($url, $m2[0][1]) . ' ' . $text;
- $url = substr($url, 0, $m2[0][1]);
+ if ( preg_match( '/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE ) ) {
+ $text = substr( $url, $m2[0][1] ) . ' ' . $text;
+ $url = substr( $url, 0, $m2[0][1] );
}
# If the link text is an image URL, replace it with an <img> tag
@@ -1331,12 +1395,12 @@ class Parser
$dtrail = '';
# Set linktype for CSS - if URL==text, link is essentially free
- $linktype = ($text === $url) ? 'free' : 'text';
+ $linktype = ( $text === $url ) ? 'free' : 'text';
# No link text, e.g. [http://domain.tld/some.link]
if ( $text == '' ) {
# Autonumber if allowed. See bug #5918
- if ( strpos( wfUrlProtocols(), substr($protocol, 0, strpos($protocol, ':')) ) !== false ) {
+ if ( strpos( wfUrlProtocols(), substr( $protocol, 0, strpos( $protocol, ':' ) ) ) !== false ) {
$langObj = $this->getFunctionLang();
$text = '[' . $langObj->formatNum( ++$this->mAutonumber ) . ']';
$linktype = 'autonumber';
@@ -1351,13 +1415,13 @@ class Parser
list( $dtrail, $trail ) = Linker::splitTrail( $trail );
}
- $text = $wgContLang->markNoConversion($text);
+ $text = $wgContLang->markNoConversion( $text );
$url = Sanitizer::cleanUrl( $url );
# Use the encoded URL
# This means that users can paste URLs directly into the text
- # Funny characters like &ouml; aren't valid in URLs anyway
+ # Funny characters like ö aren't valid in URLs anyway
# This was changed in August 2004
$s .= $sk->makeExternalLink( $url, $text, false, $linktype,
$this->getExternalLinkAttribs( $url ) ) . $dtrail . $trail;
@@ -1379,15 +1443,15 @@ class Parser
* (depending on configuration, namespace, and the URL's domain) and/or a
* target attribute (depending on configuration).
*
- * @param string $url Optional URL, to extract the domain from for rel =>
+ * @param $url String: optional URL, to extract the domain from for rel =>
* nofollow if appropriate
- * @return array Associative array of HTML attributes
+ * @return Array: associative array of HTML attributes
*/
function getExternalLinkAttribs( $url = false ) {
$attribs = array();
global $wgNoFollowLinks, $wgNoFollowNsExceptions;
$ns = $this->mTitle->getNamespace();
- if( $wgNoFollowLinks && !in_array($ns, $wgNoFollowNsExceptions) ) {
+ if ( $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions ) ) {
$attribs['rel'] = 'nofollow';
global $wgNoFollowDomainExceptions;
@@ -1395,8 +1459,7 @@ class Parser
$bits = wfParseUrl( $url );
if ( is_array( $bits ) && isset( $bits['host'] ) ) {
foreach ( $wgNoFollowDomainExceptions as $domain ) {
- if( substr( $bits['host'], -strlen( $domain ) )
- == $domain ) {
+ if ( substr( $bits['host'], -strlen( $domain ) ) == $domain ) {
unset( $attribs['rel'] );
break;
}
@@ -1413,9 +1476,10 @@ class Parser
/**
* Replace unusual URL escape codes with their equivalent characters
- * @param string
- * @return string
- * @static
+ *
+ * @param $url String
+ * @return String
+ *
* @todo This can merge genuinely required bits in the path or query string,
* breaking legit URLs. A proper fix would treat the various parts of
* the URL differently; as a workaround, just use the output for
@@ -1429,18 +1493,16 @@ class Parser
/**
* Callback function used in replaceUnusualEscapes().
* Replaces unusual URL escape codes with their equivalent character
- * @static
- * @private
*/
private static function replaceUnusualEscapesCallback( $matches ) {
$char = urldecode( $matches[0] );
$ord = ord( $char );
- // Is it an unsafe or HTTP reserved character according to RFC 1738?
+ # Is it an unsafe or HTTP reserved character according to RFC 1738?
if ( $ord > 32 && $ord < 127 && strpos( '<>"#{}|\^~[]`;/?', $char ) === false ) {
- // No, shouldn't be escaped
+ # No, shouldn't be escaped
return $char;
} else {
- // Yes, leave it escaped
+ # Yes, leave it escaped
return $matches[0];
}
}
@@ -1451,21 +1513,21 @@ class Parser
* @private
*/
function maybeMakeExternalImage( $url ) {
- $sk = $this->mOptions->getSkin();
+ $sk = $this->mOptions->getSkin( $this->mTitle );
$imagesfrom = $this->mOptions->getAllowExternalImagesFrom();
- $imagesexception = !empty($imagesfrom);
+ $imagesexception = !empty( $imagesfrom );
$text = false;
# $imagesfrom could be either a single string or an array of strings, parse out the latter
- if( $imagesexception && is_array( $imagesfrom ) ) {
+ if ( $imagesexception && is_array( $imagesfrom ) ) {
$imagematch = false;
- foreach( $imagesfrom as $match ) {
- if( strpos( $url, $match ) === 0 ) {
+ foreach ( $imagesfrom as $match ) {
+ if ( strpos( $url, $match ) === 0 ) {
$imagematch = true;
break;
}
}
- } elseif( $imagesexception ) {
- $imagematch = (strpos( $url, $imagesfrom ) === 0);
+ } elseif ( $imagesexception ) {
+ $imagematch = ( strpos( $url, $imagesfrom ) === 0 );
} else {
$imagematch = false;
}
@@ -1476,14 +1538,15 @@ class Parser
$text = $sk->makeExternalImage( $url );
}
}
- if( !$text && $this->mOptions->getEnableImageWhitelist()
+ if ( !$text && $this->mOptions->getEnableImageWhitelist()
&& preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
$whitelist = explode( "\n", wfMsgForContent( 'external_image_whitelist' ) );
- foreach( $whitelist as $entry ) {
+ foreach ( $whitelist as $entry ) {
# Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
- if( strpos( $entry, '#' ) === 0 || $entry === '' )
+ if ( strpos( $entry, '#' ) === 0 || $entry === '' ) {
continue;
- if( preg_match( '/' . str_replace( '/', '\\/', $entry ) . '/i', $url ) ) {
+ }
+ if ( preg_match( '/' . str_replace( '/', '\\/', $entry ) . '/i', $url ) ) {
# Image matches a whitelist entry
$text = $sk->makeExternalImage( $url );
break;
@@ -1495,7 +1558,7 @@ class Parser
/**
* Process [[ ]] wikilinks
- * @return processed text
+ * @return String: processed text
*
* @private
*/
@@ -1526,12 +1589,12 @@ class Parser
$e1_img = "/^([{$tc}]+)\\|(.*)\$/sD";
}
- $sk = $this->mOptions->getSkin();
+ $sk = $this->mOptions->getSkin( $this->mTitle );
$holders = new LinkHolderArray( $this );
- #split the entire text string on occurences of [[
+ # split the entire text string on occurences of [[
$a = StringUtils::explode( '[[', ' ' . $s );
- #get the first element (all text up to first [[), and remove the space we added
+ # get the first element (all text up to first [[), and remove the space we added
$s = $a->current();
$a->next();
$line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void"
@@ -1545,7 +1608,7 @@ class Parser
$e2 = wfMsgForContent( 'linkprefix' );
}
- if( is_null( $this->mTitle ) ) {
+ if ( is_null( $this->mTitle ) ) {
wfProfileOut( __METHOD__.'-setup' );
wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__.": \$this->mTitle is null\n" );
@@ -1563,10 +1626,10 @@ class Parser
$prefix = '';
}
- if($wgContLang->hasVariants()) {
- $selflink = $wgContLang->convertLinkToAllVariants($this->mTitle->getPrefixedText());
+ if ( $wgContLang->hasVariants() ) {
+ $selflink = $wgContLang->autoConvertToAllVariants( $this->mTitle->getPrefixedText() );
} else {
- $selflink = array($this->mTitle->getPrefixedText());
+ $selflink = array( $this->mTitle->getPrefixedText() );
}
$useSubpages = $this->areSubpagesAllowed();
wfProfileOut( __METHOD__.'-setup' );
@@ -1590,7 +1653,7 @@ class Parser
$prefix='';
}
# first link
- if($first_prefix) {
+ if ( $first_prefix ) {
$prefix = $first_prefix;
$first_prefix = false;
}
@@ -1610,25 +1673,25 @@ class Parser
# Still some problems for cases where the ] is meant to be outside punctuation,
# and no image is in sight. See bug 2095.
#
- if( $text !== '' &&
+ if ( $text !== '' &&
substr( $m[3], 0, 1 ) === ']' &&
- strpos($text, '[') !== false
+ strpos( $text, '[' ) !== false
)
{
$text .= ']'; # so that replaceExternalLinks($text) works later
$m[3] = substr( $m[3], 1 );
}
# fix up urlencoded title texts
- if( strpos( $m[1], '%' ) !== false ) {
+ if ( strpos( $m[1], '%' ) !== false ) {
# Should anchors '#' also be rejected?
- $m[1] = str_replace( array('<', '>'), array('&lt;', '&gt;'), urldecode($m[1]) );
+ $m[1] = str_replace( array('<', '>'), array('&lt;', '&gt;'), urldecode( $m[1] ) );
}
$trail = $m[3];
- } elseif( preg_match($e1_img, $line, $m) ) { # Invalid, but might be an image with a link in its caption
+ } elseif ( preg_match( $e1_img, $line, $m ) ) { # Invalid, but might be an image with a link in its caption
$might_be_img = true;
$text = $m[2];
if ( strpos( $m[1], '%' ) !== false ) {
- $m[1] = urldecode($m[1]);
+ $m[1] = urldecode( $m[1] );
}
$trail = "";
} else { # Invalid form; output directly
@@ -1655,8 +1718,8 @@ class Parser
$link = $m[1];
}
- $noforce = (substr( $m[1], 0, 1 ) !== ':');
- if (!$noforce) {
+ $noforce = ( substr( $m[1], 0, 1 ) !== ':' );
+ if ( !$noforce ) {
# Strip off leading ':'
$link = substr( $link, 1 );
}
@@ -1676,10 +1739,10 @@ class Parser
if ( $might_be_img ) { # if this is actually an invalid link
wfProfileIn( __METHOD__."-might_be_img" );
- if ( $ns == NS_FILE && $noforce ) { #but might be an image
+ if ( $ns == NS_FILE && $noforce ) { # but might be an image
$found = false;
while ( true ) {
- #look at the next 'line' to see if we can close it there
+ # look at the next 'line' to see if we can close it there
$a->next();
$next_line = $a->current();
if ( $next_line === false || $next_line === null ) {
@@ -1693,24 +1756,24 @@ class Parser
$trail = $m[2];
break;
} elseif ( count( $m ) == 2 ) {
- #if there's exactly one ]] that's fine, we'll keep looking
+ # if there's exactly one ]] that's fine, we'll keep looking
$text .= "[[{$m[0]}]]{$m[1]}";
} else {
- #if $next_line is invalid too, we need look no further
+ # if $next_line is invalid too, we need look no further
$text .= '[[' . $next_line;
break;
}
}
if ( !$found ) {
# we couldn't find the end of this imageLink, so output it raw
- #but don't ignore what might be perfectly normal links in the text we've examined
+ # but don't ignore what might be perfectly normal links in the text we've examined
$holders->merge( $this->replaceInternalLinks2( $text ) );
$s .= "{$prefix}[[$link|$text";
# note: no $trail, because without an end, there *is* no trail
wfProfileOut( __METHOD__."-might_be_img" );
continue;
}
- } else { #it's not an image, so output it raw
+ } else { # it's not an image, so output it raw
$s .= "{$prefix}[[$link|$text";
# note: no $trail, because without an end, there *is* no trail
wfProfileOut( __METHOD__."-might_be_img" );
@@ -1720,7 +1783,14 @@ class Parser
}
$wasblank = ( $text == '' );
- if ( $wasblank ) $text = $link;
+ if ( $wasblank ) {
+ $text = $link;
+ } else {
+ # Bug 4598 madness. Handle the quotes only if they come from the alternate part
+ # [[Lista d''e paise d''o munno]] -> <a href="">Lista d''e paise d''o munno</a>
+ # [[Criticism of Harry Potter|Criticism of ''Harry Potter'']] -> <a href="Criticism of Harry Potter">Criticism of <i>Harry Potter</i></a>
+ $text = $this->doQuotes($text);
+ }
# Link not escaped by : , create the various objects
if ( $noforce ) {
@@ -1729,8 +1799,8 @@ class Parser
wfProfileIn( __METHOD__."-interwiki" );
if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && $wgContLang->getLanguageName( $iw ) ) {
$this->mOutput->addLanguageLink( $nt->getFullText() );
- $s = rtrim($s . $prefix);
- $s .= trim($trail, "\n") == '' ? '': $prefix . $trail;
+ $s = rtrim( $s . $prefix );
+ $s .= trim( $trail, "\n" ) == '' ? '': $prefix . $trail;
wfProfileOut( __METHOD__."-interwiki" );
continue;
}
@@ -1749,7 +1819,7 @@ class Parser
# recursively parse links inside the image caption
# actually, this will parse them in any other parameters, too,
# but it might be hard to fix that, and it doesn't matter ATM
- $text = $this->replaceExternalLinks($text);
+ $text = $this->replaceExternalLinks( $text );
$holders->merge( $this->replaceInternalLinks2( $text ) );
}
# cloak any absolute URLs inside the image markup, so replaceExternalLinks() won't touch them
@@ -1765,7 +1835,7 @@ class Parser
if ( $ns == NS_CATEGORY ) {
wfProfileIn( __METHOD__."-category" );
- $s = rtrim($s . "\n"); # bug 87
+ $s = rtrim( $s . "\n" ); # bug 87
if ( $wasblank ) {
$sortkey = $this->getDefaultSort();
@@ -1781,7 +1851,7 @@ class Parser
* Strip the whitespace Category links produce, see bug 87
* @todo We might want to use trim($tmp, "\n") here.
*/
- $s .= trim($prefix . $trail, "\n") == '' ? '': $prefix . $trail;
+ $s .= trim( $prefix . $trail, "\n" ) == '' ? '': $prefix . $trail;
wfProfileOut( __METHOD__."-category" );
continue;
@@ -1789,8 +1859,8 @@ class Parser
}
# Self-link checking
- if( $nt->getFragment() === '' && $ns != NS_SPECIAL ) {
- if( in_array( $nt->getPrefixedText(), $selflink, true ) ) {
+ if ( $nt->getFragment() === '' && $ns != NS_SPECIAL ) {
+ if ( in_array( $nt->getPrefixedText(), $selflink, true ) ) {
$s .= $prefix . $sk->makeSelfLinkObj( $nt, $text, '', $trail );
continue;
}
@@ -1798,7 +1868,7 @@ class Parser
# NS_MEDIA is a pseudo-namespace for linking directly to a file
# FIXME: Should do batch file existence checks, see comment below
- if( $ns == NS_MEDIA ) {
+ if ( $ns == NS_MEDIA ) {
wfProfileIn( __METHOD__."-media" );
# Give extensions a chance to select the file revision for us
$skip = $time = false;
@@ -1821,7 +1891,7 @@ class Parser
#
# FIXME: isAlwaysKnown() can be expensive for file links; we should really do
# batch file existence checks for NS_FILE and NS_MEDIA
- if( $iw == '' && $nt->isAlwaysKnown() ) {
+ if ( $iw == '' && $nt->isAlwaysKnown() ) {
$this->mOutput->addLink( $nt );
$s .= $this->makeKnownLinkHolder( $nt, $text, '', $trail, $prefix );
} else {
@@ -1853,17 +1923,17 @@ class Parser
* breaking URLs in the following text without breaking trails on the
* wiki links, it's been made into a horrible function.
*
- * @param Title $nt
- * @param string $text
- * @param string $query
- * @param string $trail
- * @param string $prefix
- * @return string HTML-wikitext mix oh yuck
+ * @param $nt Title
+ * @param $text String
+ * @param $query String
+ * @param $trail String
+ * @param $prefix String
+ * @return String: HTML-wikitext mix oh yuck
*/
function makeKnownLinkHolder( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
list( $inside, $trail ) = Linker::splitTrail( $trail );
- $sk = $this->mOptions->getSkin();
- // FIXME: use link() instead of deprecated makeKnownLinkObj()
+ $sk = $this->mOptions->getSkin( $this->mTitle );
+ # FIXME: use link() instead of deprecated makeKnownLinkObj()
$link = $sk->makeKnownLinkObj( $nt, $text, $query, $inside, $prefix );
return $this->armorLinks( $link ) . $trail;
}
@@ -1875,8 +1945,8 @@ class Parser
* Not needed quite as much as it used to be since free links are a bit
* more sensible these days. But bracketed links are still an issue.
*
- * @param string more-or-less HTML
- * @return string less-or-more HTML with NOPARSE bits
+ * @param $text String: more-or-less HTML
+ * @return String: less-or-more HTML with NOPARSE bits
*/
function armorLinks( $text ) {
return preg_replace( '/\b(' . wfUrlProtocols() . ')/',
@@ -1885,7 +1955,7 @@ class Parser
/**
* Return true if subpage links should be expanded on this page.
- * @return bool
+ * @return Boolean
*/
function areSubpagesAllowed() {
# Some namespaces don't allow subpages
@@ -1894,12 +1964,13 @@ class Parser
/**
* Handle link to subpage if necessary
- * @param string $target the source of the link
- * @param string &$text the link text, modified as necessary
+ *
+ * @param $target String: the source of the link
+ * @param &$text String: the link text, modified as necessary
* @return string the full name of the link
* @private
*/
- function maybeDoSubpageLink($target, &$text) {
+ function maybeDoSubpageLink( $target, &$text ) {
return Linker::normalizeSubpageLink( $this->mTitle, $target, $text );
}
@@ -1907,7 +1978,7 @@ class Parser
* Used by doBlockLevels()
* @private
*/
- /* private */ function closeParagraph() {
+ function closeParagraph() {
$result = '';
if ( $this->mLastSection != '' ) {
$result = '</' . $this->mLastSection . ">\n";
@@ -1916,42 +1987,64 @@ class Parser
$this->mLastSection = '';
return $result;
}
- # getCommon() returns the length of the longest common substring
- # of both arguments, starting at the beginning of both.
- #
- /* private */ function getCommon( $st1, $st2 ) {
+
+ /**
+ * getCommon() returns the length of the longest common substring
+ * of both arguments, starting at the beginning of both.
+ * @private
+ */
+ function getCommon( $st1, $st2 ) {
$fl = strlen( $st1 );
$shorter = strlen( $st2 );
- if ( $fl < $shorter ) { $shorter = $fl; }
+ if ( $fl < $shorter ) {
+ $shorter = $fl;
+ }
for ( $i = 0; $i < $shorter; ++$i ) {
- if ( $st1{$i} != $st2{$i} ) { break; }
+ if ( $st1{$i} != $st2{$i} ) {
+ break;
+ }
}
return $i;
}
- # These next three functions open, continue, and close the list
- # element appropriate to the prefix character passed into them.
- #
- /* private */ function openList( $char ) {
+
+ /**
+ * These next three functions open, continue, and close the list
+ * element appropriate to the prefix character passed into them.
+ * @private
+ */
+ function openList( $char ) {
$result = $this->closeParagraph();
- if ( '*' === $char ) { $result .= '<ul><li>'; }
- elseif ( '#' === $char ) { $result .= '<ol><li>'; }
- elseif ( ':' === $char ) { $result .= '<dl><dd>'; }
- elseif ( ';' === $char ) {
+ if ( '*' === $char ) {
+ $result .= '<ul><li>';
+ } elseif ( '#' === $char ) {
+ $result .= '<ol><li>';
+ } elseif ( ':' === $char ) {
+ $result .= '<dl><dd>';
+ } elseif ( ';' === $char ) {
$result .= '<dl><dt>';
$this->mDTopen = true;
+ } else {
+ $result = '<!-- ERR 1 -->';
}
- else { $result = '<!-- ERR 1 -->'; }
return $result;
}
- /* private */ function nextItem( $char ) {
- if ( '*' === $char || '#' === $char ) { return '</li><li>'; }
- elseif ( ':' === $char || ';' === $char ) {
+ /**
+ * TODO: document
+ * @param $char String
+ * @private
+ */
+ function nextItem( $char ) {
+ if ( '*' === $char || '#' === $char ) {
+ return '</li><li>';
+ } elseif ( ':' === $char || ';' === $char ) {
$close = '</dd>';
- if ( $this->mDTopen ) { $close = '</dt>'; }
+ if ( $this->mDTopen ) {
+ $close = '</dt>';
+ }
if ( ';' === $char ) {
$this->mDTopen = true;
return $close . '<dt>';
@@ -1963,18 +2056,26 @@ class Parser
return '<!-- ERR 2 -->';
}
- /* private */ function closeList( $char ) {
- if ( '*' === $char ) { $text = '</li></ul>'; }
- elseif ( '#' === $char ) { $text = '</li></ol>'; }
- elseif ( ':' === $char ) {
+ /**
+ * TODO: document
+ * @param $char String
+ * @private
+ */
+ function closeList( $char ) {
+ if ( '*' === $char ) {
+ $text = '</li></ul>';
+ } elseif ( '#' === $char ) {
+ $text = '</li></ol>';
+ } elseif ( ':' === $char ) {
if ( $this->mDTopen ) {
$this->mDTopen = false;
$text = '</dt></dl>';
} else {
$text = '</dd></dl>';
}
+ } else {
+ return '<!-- ERR 3 -->';
}
- else { return '<!-- ERR 3 -->'; }
return $text."\n";
}
/**#@-*/
@@ -1982,7 +2083,8 @@ class Parser
/**
* Make lists from lines starting with ':', '*', '#', etc. (DBL)
*
- * @param $linestart bool whether or not this is at the start of a line.
+ * @param $text String
+ * @param $linestart Boolean: whether or not this is at the start of a line.
* @private
* @return string the lists rendered as HTML
*/
@@ -2007,24 +2109,24 @@ class Parser
$linestart = true;
continue;
}
- // * = ul
- // # = ol
- // ; = dt
- // : = dd
+ # * = ul
+ # # = ol
+ # ; = dt
+ # : = dd
$lastPrefixLength = strlen( $lastPrefix );
- $preCloseMatch = preg_match('/<\\/pre/i', $oLine );
- $preOpenMatch = preg_match('/<pre/i', $oLine );
- // If not in a <pre> element, scan for and figure out what prefixes are there.
+ $preCloseMatch = preg_match( '/<\\/pre/i', $oLine );
+ $preOpenMatch = preg_match( '/<pre/i', $oLine );
+ # If not in a <pre> element, scan for and figure out what prefixes are there.
if ( !$this->mInPre ) {
# Multiple prefixes may abut each other for nested lists.
$prefixLength = strspn( $oLine, '*#:;' );
$prefix = substr( $oLine, 0, $prefixLength );
# eh?
- // ; and : are both from definition-lists, so they're equivalent
- // for the purposes of determining whether or not we need to open/close
- // elements.
+ # ; and : are both from definition-lists, so they're equivalent
+ # for the purposes of determining whether or not we need to open/close
+ # elements.
$prefix2 = str_replace( ';', ':', $prefix );
$t = substr( $oLine, $prefixLength );
$this->mInPre = (bool)$preOpenMatch;
@@ -2036,7 +2138,7 @@ class Parser
}
# List generation
- if( $prefixLength && $lastPrefix === $prefix2 ) {
+ if ( $prefixLength && $lastPrefix === $prefix2 ) {
# Same as the last item, so no need to deal with nesting or opening stuff
$output .= $this->nextItem( substr( $prefix, -1 ) );
$paragraphStack = false;
@@ -2047,37 +2149,37 @@ class Parser
# So we check for : in the remainder text to split up the
# title and definition, without b0rking links.
$term = $t2 = '';
- if ($this->findColonNoLinks($t, $term, $t2) !== false) {
+ if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
$t = $t2;
$output .= $term . $this->nextItem( ':' );
}
}
- } elseif( $prefixLength || $lastPrefixLength ) {
- // We need to open or close prefixes, or both.
+ } elseif ( $prefixLength || $lastPrefixLength ) {
+ # We need to open or close prefixes, or both.
# Either open or close a level...
$commonPrefixLength = $this->getCommon( $prefix, $lastPrefix );
$paragraphStack = false;
- // Close all the prefixes which aren't shared.
- while( $commonPrefixLength < $lastPrefixLength ) {
+ # Close all the prefixes which aren't shared.
+ while ( $commonPrefixLength < $lastPrefixLength ) {
$output .= $this->closeList( $lastPrefix[$lastPrefixLength-1] );
--$lastPrefixLength;
}
- // Continue the current prefix if appropriate.
+ # Continue the current prefix if appropriate.
if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
$output .= $this->nextItem( $prefix[$commonPrefixLength-1] );
}
- // Open prefixes where appropriate.
+ # Open prefixes where appropriate.
while ( $prefixLength > $commonPrefixLength ) {
$char = substr( $prefix, $commonPrefixLength, 1 );
$output .= $this->openList( $char );
if ( ';' === $char ) {
# FIXME: This is dupe of code above
- if ($this->findColonNoLinks($t, $term, $t2) !== false) {
+ if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
$t = $t2;
$output .= $term . $this->nextItem( ':' );
}
@@ -2087,11 +2189,11 @@ class Parser
$lastPrefix = $prefix2;
}
- // If we have no prefixes, go to paragraph mode.
- if( 0 == $prefixLength ) {
+ # If we have no prefixes, go to paragraph mode.
+ if ( 0 == $prefixLength ) {
wfProfileIn( __METHOD__."-paragraph" );
# No prefix (not in list)--go to paragraph mode
- // XXX: use a stack for nestable elements like span, table and div
+ # XXX: use a stack for nestable elements like span, table and div
$openmatch = preg_match('/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
$closematch = preg_match(
'/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
@@ -2103,29 +2205,25 @@ class Parser
if ( $preOpenMatch and !$preCloseMatch ) {
$this->mInPre = true;
}
- if ( $closematch ) {
- $inBlockElem = false;
- } else {
- $inBlockElem = true;
- }
- } else if ( !$inBlockElem && !$this->mInPre ) {
- if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' or trim($t) != '' ) ) {
- // pre
- if ($this->mLastSection !== 'pre') {
+ $inBlockElem = !$closematch;
+ } elseif ( !$inBlockElem && !$this->mInPre ) {
+ if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) ) {
+ # pre
+ if ( $this->mLastSection !== 'pre' ) {
$paragraphStack = false;
$output .= $this->closeParagraph().'<pre>';
$this->mLastSection = 'pre';
}
$t = substr( $t, 1 );
} else {
- // paragraph
- if ( trim($t) == '' ) {
+ # paragraph
+ if ( trim( $t ) === '' ) {
if ( $paragraphStack ) {
$output .= $paragraphStack.'<br />';
$paragraphStack = false;
$this->mLastSection = 'p';
} else {
- if ($this->mLastSection !== 'p' ) {
+ if ( $this->mLastSection !== 'p' ) {
$output .= $this->closeParagraph();
$this->mLastSection = '';
$paragraphStack = '<p>';
@@ -2138,7 +2236,7 @@ class Parser
$output .= $paragraphStack;
$paragraphStack = false;
$this->mLastSection = 'p';
- } else if ($this->mLastSection !== 'p') {
+ } elseif ( $this->mLastSection !== 'p' ) {
$output .= $this->closeParagraph().'<p>';
$this->mLastSection = 'p';
}
@@ -2147,11 +2245,11 @@ class Parser
}
wfProfileOut( __METHOD__."-paragraph" );
}
- // somewhere above we forget to get out of pre block (bug 785)
- if($preCloseMatch && $this->mInPre) {
+ # somewhere above we forget to get out of pre block (bug 785)
+ if ( $preCloseMatch && $this->mInPre ) {
$this->mInPre = false;
}
- if ($paragraphStack === false) {
+ if ( $paragraphStack === false ) {
$output .= $t."\n";
}
}
@@ -2171,31 +2269,32 @@ class Parser
/**
* Split up a string on ':', ignoring any occurences inside tags
* to prevent illegal overlapping.
- * @param string $str the string to split
- * @param string &$before set to everything before the ':'
- * @param string &$after set to everything after the ':'
- * return string the position of the ':', or false if none found
+ *
+ * @param $str String: the string to split
+ * @param &$before String: set to everything before the ':'
+ * @param &$after String: set to everything after the ':'
+ * return String: the position of the ':', or false if none found
*/
- function findColonNoLinks($str, &$before, &$after) {
+ function findColonNoLinks( $str, &$before, &$after ) {
wfProfileIn( __METHOD__ );
$pos = strpos( $str, ':' );
- if( $pos === false ) {
- // Nothing to find!
+ if ( $pos === false ) {
+ # Nothing to find!
wfProfileOut( __METHOD__ );
return false;
}
$lt = strpos( $str, '<' );
- if( $lt === false || $lt > $pos ) {
- // Easy; no tag nesting to worry about
+ if ( $lt === false || $lt > $pos ) {
+ # Easy; no tag nesting to worry about
$before = substr( $str, 0, $pos );
$after = substr( $str, $pos+1 );
wfProfileOut( __METHOD__ );
return $pos;
}
- // Ugly state machine to walk through avoiding tags.
+ # Ugly state machine to walk through avoiding tags.
$state = self::COLON_STATE_TEXT;
$stack = 0;
$len = strlen( $str );
@@ -2203,67 +2302,67 @@ class Parser
$c = $str{$i};
switch( $state ) {
- // (Using the number is a performance hack for common cases)
- case 0: // self::COLON_STATE_TEXT:
+ # (Using the number is a performance hack for common cases)
+ case 0: # self::COLON_STATE_TEXT:
switch( $c ) {
case "<":
- // Could be either a <start> tag or an </end> tag
+ # Could be either a <start> tag or an </end> tag
$state = self::COLON_STATE_TAGSTART;
break;
case ":":
- if( $stack == 0 ) {
- // We found it!
+ if ( $stack == 0 ) {
+ # We found it!
$before = substr( $str, 0, $i );
$after = substr( $str, $i + 1 );
wfProfileOut( __METHOD__ );
return $i;
}
- // Embedded in a tag; don't break it.
+ # Embedded in a tag; don't break it.
break;
default:
- // Skip ahead looking for something interesting
+ # Skip ahead looking for something interesting
$colon = strpos( $str, ':', $i );
- if( $colon === false ) {
- // Nothing else interesting
+ if ( $colon === false ) {
+ # Nothing else interesting
wfProfileOut( __METHOD__ );
return false;
}
$lt = strpos( $str, '<', $i );
- if( $stack === 0 ) {
- if( $lt === false || $colon < $lt ) {
- // We found it!
+ if ( $stack === 0 ) {
+ if ( $lt === false || $colon < $lt ) {
+ # We found it!
$before = substr( $str, 0, $colon );
$after = substr( $str, $colon + 1 );
wfProfileOut( __METHOD__ );
return $i;
}
}
- if( $lt === false ) {
- // Nothing else interesting to find; abort!
- // We're nested, but there's no close tags left. Abort!
+ if ( $lt === false ) {
+ # Nothing else interesting to find; abort!
+ # We're nested, but there's no close tags left. Abort!
break 2;
}
- // Skip ahead to next tag start
+ # Skip ahead to next tag start
$i = $lt;
$state = self::COLON_STATE_TAGSTART;
}
break;
- case 1: // self::COLON_STATE_TAG:
- // In a <tag>
+ case 1: # self::COLON_STATE_TAG:
+ # In a <tag>
switch( $c ) {
case ">":
$stack++;
$state = self::COLON_STATE_TEXT;
break;
case "/":
- // Slash may be followed by >?
+ # Slash may be followed by >?
$state = self::COLON_STATE_TAGSLASH;
break;
default:
- // ignore
+ # ignore
}
break;
- case 2: // self::COLON_STATE_TAGSTART:
+ case 2: # self::COLON_STATE_TAGSTART:
switch( $c ) {
case "/":
$state = self::COLON_STATE_CLOSETAG;
@@ -2272,18 +2371,18 @@ class Parser
$state = self::COLON_STATE_COMMENT;
break;
case ">":
- // Illegal early close? This shouldn't happen D:
+ # Illegal early close? This shouldn't happen D:
$state = self::COLON_STATE_TEXT;
break;
default:
$state = self::COLON_STATE_TAG;
}
break;
- case 3: // self::COLON_STATE_CLOSETAG:
- // In a </tag>
- if( $c === ">" ) {
+ case 3: # self::COLON_STATE_CLOSETAG:
+ # In a </tag>
+ if ( $c === ">" ) {
$stack--;
- if( $stack < 0 ) {
+ if ( $stack < 0 ) {
wfDebug( __METHOD__.": Invalid input; too many close tags\n" );
wfProfileOut( __METHOD__ );
return false;
@@ -2292,28 +2391,28 @@ class Parser
}
break;
case self::COLON_STATE_TAGSLASH:
- if( $c === ">" ) {
- // Yes, a self-closed tag <blah/>
+ if ( $c === ">" ) {
+ # Yes, a self-closed tag <blah/>
$state = self::COLON_STATE_TEXT;
} else {
- // Probably we're jumping the gun, and this is an attribute
+ # Probably we're jumping the gun, and this is an attribute
$state = self::COLON_STATE_TAG;
}
break;
- case 5: // self::COLON_STATE_COMMENT:
- if( $c === "-" ) {
+ case 5: # self::COLON_STATE_COMMENT:
+ if ( $c === "-" ) {
$state = self::COLON_STATE_COMMENTDASH;
}
break;
case self::COLON_STATE_COMMENTDASH:
- if( $c === "-" ) {
+ if ( $c === "-" ) {
$state = self::COLON_STATE_COMMENTDASHDASH;
} else {
$state = self::COLON_STATE_COMMENT;
}
break;
case self::COLON_STATE_COMMENTDASHDASH:
- if( $c === ">" ) {
+ if ( $c === ">" ) {
$state = self::COLON_STATE_TEXT;
} else {
$state = self::COLON_STATE_COMMENT;
@@ -2323,8 +2422,9 @@ class Parser
throw new MWException( "State machine error in " . __METHOD__ );
}
}
- if( $stack > 0 ) {
+ if ( $stack > 0 ) {
wfDebug( __METHOD__.": Invalid input; not enough close tags (stack $stack, state $state)\n" );
+ wfProfileOut( __METHOD__ );
return false;
}
wfProfileOut( __METHOD__ );
@@ -2337,8 +2437,8 @@ class Parser
* @private
*/
function getVariableValue( $index, $frame=false ) {
- global $wgContLang, $wgSitename, $wgServer, $wgServerName;
- global $wgScriptPath, $wgStylePath;
+ global $wgContLang, $wgSitename, $wgServer;
+ global $wgArticlePath, $wgScriptPath, $wgStylePath;
/**
* Some of these require message or data lookups and can be
@@ -2442,7 +2542,7 @@ class Parser
$value = wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getBaseText() ) );
break;
case 'talkpagename':
- if( $this->mTitle->canTalk() ) {
+ if ( $this->mTitle->canTalk() ) {
$talkPage = $this->mTitle->getTalkPage();
$value = wfEscapeWikiText( $talkPage->getPrefixedText() );
} else {
@@ -2450,7 +2550,7 @@ class Parser
}
break;
case 'talkpagenamee':
- if( $this->mTitle->canTalk() ) {
+ if ( $this->mTitle->canTalk() ) {
$talkPage = $this->mTitle->getTalkPage();
$value = $talkPage->getPrefixedUrl();
} else {
@@ -2466,62 +2566,69 @@ class Parser
$value = $subjPage->getPrefixedUrl();
break;
case 'revisionid':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision...\n" );
$value = $this->mRevisionId;
break;
case 'revisionday':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned. This is for null edits.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONDAY}} used, setting vary-revision...\n" );
$value = intval( substr( $this->getRevisionTimestamp(), 6, 2 ) );
break;
case 'revisionday2':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned. This is for null edits.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONDAY2}} used, setting vary-revision...\n" );
$value = substr( $this->getRevisionTimestamp(), 6, 2 );
break;
case 'revisionmonth':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned. This is for null edits.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONMONTH}} used, setting vary-revision...\n" );
+ $value = substr( $this->getRevisionTimestamp(), 4, 2 );
+ break;
+ case 'revisionmonth1':
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
+ $this->mOutput->setFlag( 'vary-revision' );
+ wfDebug( __METHOD__ . ": {{REVISIONMONTH1}} used, setting vary-revision...\n" );
$value = intval( substr( $this->getRevisionTimestamp(), 4, 2 ) );
break;
case 'revisionyear':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned. This is for null edits.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONYEAR}} used, setting vary-revision...\n" );
$value = substr( $this->getRevisionTimestamp(), 0, 4 );
break;
case 'revisiontimestamp':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned. This is for null edits.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONTIMESTAMP}} used, setting vary-revision...\n" );
$value = $this->getRevisionTimestamp();
break;
case 'revisionuser':
- // Let the edit saving system know we should parse the page
- // *after* a revision ID has been assigned. This is for null edits.
+ # Let the edit saving system know we should parse the page
+ # *after* a revision ID has been assigned. This is for null edits.
$this->mOutput->setFlag( 'vary-revision' );
wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
$value = $this->getRevisionUser();
break;
case 'namespace':
- $value = str_replace('_',' ',$wgContLang->getNsText( $this->mTitle->getNamespace() ) );
+ $value = str_replace( '_',' ',$wgContLang->getNsText( $this->mTitle->getNamespace() ) );
break;
case 'namespacee':
$value = wfUrlencode( $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
break;
case 'talkspace':
- $value = $this->mTitle->canTalk() ? str_replace('_',' ',$this->mTitle->getTalkNsText()) : '';
+ $value = $this->mTitle->canTalk() ? str_replace( '_',' ',$this->mTitle->getTalkNsText() ) : '';
break;
case 'talkspacee':
$value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
@@ -2545,8 +2652,8 @@ class Parser
$value = $wgContLang->formatNum( gmdate( 'H', $ts ), true );
break;
case 'currentweek':
- // @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
- // int to remove the padding
+ # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
+ # int to remove the padding
$value = $wgContLang->formatNum( (int)gmdate( 'W', $ts ) );
break;
case 'currentdow':
@@ -2565,8 +2672,8 @@ class Parser
$value = $wgContLang->formatNum( $localHour, true );
break;
case 'localweek':
- // @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
- // int to remove the padding
+ # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
+ # int to remove the padding
$value = $wgContLang->formatNum( (int)$localWeek );
break;
case 'localdow':
@@ -2588,7 +2695,7 @@ class Parser
$value = $wgContLang->formatNum( SiteStats::pages() );
break;
case 'numberofadmins':
- $value = $wgContLang->formatNum( SiteStats::numberingroup('sysop') );
+ $value = $wgContLang->formatNum( SiteStats::numberingroup( 'sysop' ) );
break;
case 'numberofedits':
$value = $wgContLang->formatNum( SiteStats::edits() );
@@ -2605,12 +2712,17 @@ class Parser
case 'currentversion':
$value = SpecialVersion::getVersion();
break;
+ case 'articlepath':
+ return $wgArticlePath;
case 'sitename':
return $wgSitename;
case 'server':
return $wgServer;
case 'servername':
- return $wgServerName;
+ wfSuppressWarnings(); # May give an E_WARNING in PHP < 5.3.3
+ $serverName = parse_url( $wgServer, PHP_URL_HOST );
+ wfRestoreWarnings();
+ return $serverName ? $serverName : $wgServer;
case 'scriptpath':
return $wgScriptPath;
case 'stylepath':
@@ -2618,14 +2730,15 @@ class Parser
case 'directionmark':
return $wgContLang->getDirMark();
case 'contentlanguage':
- global $wgContLanguageCode;
- return $wgContLanguageCode;
+ global $wgLanguageCode;
+ return $wgLanguageCode;
default:
$ret = null;
- if ( wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) ) )
+ if ( wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) ) ) {
return $ret;
- else
+ } else {
return null;
+ }
}
if ( $index )
@@ -2635,7 +2748,7 @@ class Parser
}
/**
- * initialise the magic variables (like CURRENTMONTHNAME) and substitution modifiers
+ * initialise the magic variables (like CURRENTMONTHNAME) and substitution modifiers
*
* @private
*/
@@ -2653,8 +2766,8 @@ class Parser
* Preprocess some wikitext and return the document tree.
* This is the ghost of replace_variables().
*
- * @param string $text The text to parse
- * @param integer flags Bitwise combination of:
+ * @param $text String: The text to parse
+ * @param $flags Integer: bitwise combination of:
* self::PTD_FOR_INCLUSION Handle <noinclude>/<includeonly> as if the text is being
* included. Default is to assume a direct page view.
*
@@ -2671,12 +2784,12 @@ class Parser
*
* @private
*/
- function preprocessToDom ( $text, $flags = 0 ) {
+ function preprocessToDom( $text, $flags = 0 ) {
$dom = $this->getPreprocessor()->preprocessToObj( $text, $flags );
return $dom;
}
- /*
+ /**
* Return a three-element array: leading whitespace, string contents, trailing whitespace
*/
public static function splitWhitespace( $s ) {
@@ -2702,11 +2815,11 @@ class Parser
* self::OT_PREPROCESS: templates but not extension tags
* self::OT_HTML: all templates and extension tags
*
- * @param string $tex The text to transform
- * @param PPFrame $frame Object describing the arguments passed to the template.
+ * @param $text String: the text to transform
+ * @param $frame PPFrame Object describing the arguments passed to the template.
* Arguments may also be provided as an associative array, as was the usual case before MW1.12.
* Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
- * @param bool $argsOnly Only do argument (triple-brace) expansion, not double-brace expansion
+ * @param $argsOnly Boolean: only do argument (triple-brace) expansion, not double-brace expansion
* @private
*/
function replaceVariables( $text, $frame = false, $argsOnly = false ) {
@@ -2720,7 +2833,7 @@ class Parser
$frame = $this->getPreprocessor()->newFrame();
} elseif ( !( $frame instanceof PPFrame ) ) {
wfDebug( __METHOD__." called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
- $frame = $this->getPreprocessor()->newCustomFrame($frame);
+ $frame = $this->getPreprocessor()->newCustomFrame( $frame );
}
$dom = $this->preprocessToDom( $text );
@@ -2731,11 +2844,11 @@ class Parser
return $text;
}
- /// Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
+ # Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
static function createAssocArgs( $args ) {
$assocArgs = array();
$index = 1;
- foreach( $args as $arg ) {
+ foreach ( $args as $arg ) {
$eqpos = strpos( $arg, '=' );
if ( $eqpos === false ) {
$assocArgs[$index++] = $arg;
@@ -2758,15 +2871,22 @@ class Parser
* Warn the user when a parser limitation is reached
* Will warn at most once the user per limitation type
*
- * @param string $limitationType, should be one of:
- * 'expensive-parserfunction' (corresponding messages: 'expensive-parserfunction-warning', 'expensive-parserfunction-category')
- * 'post-expand-template-argument' (corresponding messages: 'post-expand-template-argument-warning', 'post-expand-template-argument-category')
- * 'post-expand-template-inclusion' (corresponding messages: 'post-expand-template-inclusion-warning', 'post-expand-template-inclusion-category')
- * @params int $current, $max When an explicit limit has been
+ * @param $limitationType String: should be one of:
+ * 'expensive-parserfunction' (corresponding messages:
+ * 'expensive-parserfunction-warning',
+ * 'expensive-parserfunction-category')
+ * 'post-expand-template-argument' (corresponding messages:
+ * 'post-expand-template-argument-warning',
+ * 'post-expand-template-argument-category')
+ * 'post-expand-template-inclusion' (corresponding messages:
+ * 'post-expand-template-inclusion-warning',
+ * 'post-expand-template-inclusion-category')
+ * @param $current Current value
+ * @param $max Maximum allowed, when an explicit limit has been
* exceeded, provide the values (optional)
*/
function limitationWarn( $limitationType, $current=null, $max=null) {
- //does no harm if $current and $max are present but are unnecessary for the message
+ # does no harm if $current and $max are present but are unnecessary for the message
$warning = wfMsgExt( "$limitationType-warning", array( 'parsemag', 'escape' ), $current, $max );
$this->mOutput->addWarning( $warning );
$this->addTrackingCategory( "$limitationType-category" );
@@ -2776,12 +2896,12 @@ class Parser
* Return the text of a template, after recursively
* replacing any variables or templates within the template.
*
- * @param array $piece The parts of the template
+ * @param $piece Array: the parts of the template
* $piece['title']: the title, i.e. the part before the |
* $piece['parts']: the parameter array
* $piece['lineStart']: whether the brace was at the start of a line
- * @param PPFrame The current frame, contains template arguments
- * @return string the text of the template
+ * @param $frame PPFrame The current frame, contains template arguments
+ * @return String: the text of the template
* @private
*/
function braceSubstitution( $piece, $frame ) {
@@ -2810,7 +2930,7 @@ class Parser
$originalTitle = $part1;
# $args is a list of argument nodes, starting from index 0, not including $part1
- $args = (null == $piece['parts']) ? array() : $piece['parts'];
+ $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
wfProfileOut( __METHOD__.'-setup' );
# SUBST
@@ -2846,8 +2966,9 @@ class Parser
$id = $this->mVariables->matchStartToEnd( $part1 );
if ( $id !== false ) {
$text = $this->getVariableValue( $id, $frame );
- if (MagicWord::getCacheTTL($id)>-1)
- $this->mOutput->mContainsOldMagic = true;
+ if ( MagicWord::getCacheTTL( $id ) > -1 ) {
+ $this->mOutput->updateCacheExpiry( MagicWord::getCacheTTL( $id ) );
+ }
$found = true;
}
}
@@ -2928,8 +3049,8 @@ class Parser
unset( $result[0] );
}
- // Extract flags into the local scope
- // This allows callers to set flags such as nowiki, found, etc.
+ # Extract flags into the local scope
+ # This allows callers to set flags such as nowiki, found, etc.
extract( $result );
} else {
$text = $result;
@@ -2950,21 +3071,23 @@ class Parser
# Split the title into page and subpage
$subpage = '';
$part1 = $this->maybeDoSubpageLink( $part1, $subpage );
- if ($subpage !== '') {
+ if ( $subpage !== '' ) {
$ns = $this->mTitle->getNamespace();
}
$title = Title::newFromText( $part1, $ns );
if ( $title ) {
$titleText = $title->getPrefixedText();
# Check for language variants if the template is not found
- if($wgContLang->hasVariants() && $title->getArticleID() == 0){
+ if ( $wgContLang->hasVariants() && $title->getArticleID() == 0 ) {
$wgContLang->findVariantLink( $part1, $title, true );
}
# Do recursion depth check
$limit = $this->mOptions->getMaxTemplateDepth();
if ( $frame->depth >= $limit ) {
$found = true;
- $text = '<span class="error">' . wfMsgForContent( 'parser-template-recursion-depth-warning', $limit ) . '</span>';
+ $text = '<span class="error">'
+ . wfMsgForContent( 'parser-template-recursion-depth-warning', $limit )
+ . '</span>';
}
}
}
@@ -2973,15 +3096,18 @@ class Parser
if ( !$found && $title ) {
wfProfileIn( __METHOD__ . '-loadtpl' );
if ( !$title->isExternal() ) {
- if ( $title->getNamespace() == NS_SPECIAL && $this->mOptions->getAllowSpecialInclusion() && $this->ot['html'] ) {
+ if ( $title->getNamespace() == NS_SPECIAL
+ && $this->mOptions->getAllowSpecialInclusion()
+ && $this->ot['html'] )
+ {
$text = SpecialPage::capturePath( $title );
if ( is_string( $text ) ) {
$found = true;
$isHTML = true;
$this->disableCache();
}
- } else if ( $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces ) ) {
- $found = false; //access denied
+ } elseif ( $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces ) ) {
+ $found = false; # access denied
wfDebug( __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey() );
} else {
list( $text, $title ) = $this->getTemplateDom( $title );
@@ -2997,13 +3123,13 @@ class Parser
$found = true;
}
} elseif ( $title->isTrans() ) {
- // Interwiki transclusion
+ # Interwiki transclusion
if ( $this->ot['html'] && !$forceRawInterwiki ) {
$text = $this->interwikiTransclude( $title, 'render' );
$isHTML = true;
} else {
$text = $this->interwikiTransclude( $title, 'raw' );
- // Preprocess it like a template
+ # Preprocess it like a template
$text = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
$isChildObj = true;
}
@@ -3058,22 +3184,31 @@ class Parser
# immediately preceding headings
if ( $isHTML ) {
$text = "\n\n" . $this->insertStripItem( $text );
- }
- # Escape nowiki-style return values
- elseif ( $nowiki && ( $this->ot['html'] || $this->ot['pre'] ) ) {
+ } elseif ( $nowiki && ( $this->ot['html'] || $this->ot['pre'] ) ) {
+ # Escape nowiki-style return values
$text = wfEscapeWikiText( $text );
- }
- # Bug 529: if the template begins with a table or block-level
- # element, it should be treated as beginning a new line.
- # This behaviour is somewhat controversial.
- elseif ( is_string( $text ) && !$piece['lineStart'] && preg_match('/^(?:{\\||:|;|#|\*)/', $text)) /*}*/{
+ } elseif ( is_string( $text )
+ && !$piece['lineStart']
+ && preg_match( '/^(?:{\\||:|;|#|\*)/', $text ) )
+ {
+ # Bug 529: if the template begins with a table or block-level
+ # element, it should be treated as beginning a new line.
+ # This behaviour is somewhat controversial.
$text = "\n" . $text;
}
if ( is_string( $text ) && !$this->incrementIncludeSize( 'post-expand', strlen( $text ) ) ) {
# Error, oversize inclusion
- $text = "[[$originalTitle]]" .
- $this->insertStripItem( '<!-- WARNING: template omitted, post-expand include size too large -->' );
+ if ( $titleText !== false ) {
+ # Make a working, properly escaped link if possible (bug 23588)
+ $text = "[[:$titleText]]";
+ } else {
+ # This will probably not be a working link, but at least it may
+ # provide some hint of where the problem is
+ preg_replace( '/^:/', '', $originalTitle );
+ $text = "[[:$originalTitle]]";
+ }
+ $text .= $this->insertStripItem( '<!-- WARNING: template omitted, post-expand include size too large -->' );
$this->limitationWarn( 'post-expand-template-inclusion' );
}
@@ -3104,7 +3239,7 @@ class Parser
return array( $this->mTplDomCache[$titleText], $title );
}
- // Cache miss, go to the database
+ # Cache miss, go to the database
list( $text, $title ) = $this->fetchTemplateAndTitle( $title );
if ( $text === false ) {
@@ -3115,9 +3250,9 @@ class Parser
$dom = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
$this->mTplDomCache[ $titleText ] = $dom;
- if (! $title->equals($cacheTitle)) {
+ if ( !$title->equals( $cacheTitle ) ) {
$this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
- array( $title->getNamespace(),$cdb = $title->getDBkey() );
+ array( $title->getNamespace(), $cdb = $title->getDBkey() );
}
return array( $dom, $title );
@@ -3127,7 +3262,7 @@ class Parser
* Fetch the unparsed text of a template and register a reference to it.
*/
function fetchTemplateAndTitle( $title ) {
- $templateCb = $this->mOptions->getTemplateCallback();
+ $templateCb = $this->mOptions->getTemplateCallback(); # Defaults to Parser::statelessFetchTemplate()
$stuff = call_user_func( $templateCb, $title, $this );
$text = $stuff['text'];
$finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
@@ -3136,11 +3271,11 @@ class Parser
$this->mOutput->addTemplate( $dep['title'], $dep['page_id'], $dep['rev_id'] );
}
}
- return array($text,$finalTitle);
+ return array( $text, $finalTitle );
}
function fetchTemplate( $title ) {
- $rv = $this->fetchTemplateAndTitle($title);
+ $rv = $this->fetchTemplateAndTitle( $title );
return $rv[0];
}
@@ -3153,13 +3288,13 @@ class Parser
$finalTitle = $title;
$deps = array();
- // Loop to fetch the article, with up to 1 redirect
+ # Loop to fetch the article, with up to 1 redirect
for ( $i = 0; $i < 2 && is_object( $title ); $i++ ) {
# Give extensions a chance to select the revision instead
- $id = false; // Assume current
+ $id = false; # Assume current
wfRunHooks( 'BeforeParserFetchTemplateAndtitle', array( $parser, &$title, &$skip, &$id ) );
- if( $skip ) {
+ if ( $skip ) {
$text = false;
$deps[] = array(
'title' => $title,
@@ -3169,8 +3304,8 @@ class Parser
}
$rev = $id ? Revision::newFromId( $id ) : Revision::newFromTitle( $title );
$rev_id = $rev ? $rev->getId() : 0;
- // If there is no current revision, there is no page
- if( $id === false && !$rev ) {
+ # If there is no current revision, there is no page
+ if ( $id === false && !$rev ) {
$linkCache = LinkCache::singleton();
$linkCache->addBadLinkObj( $title );
}
@@ -3180,13 +3315,13 @@ class Parser
'page_id' => $title->getArticleID(),
'rev_id' => $rev_id );
- if( $rev ) {
+ if ( $rev ) {
$text = $rev->getText();
- } elseif( $title->getNamespace() == NS_MEDIAWIKI ) {
+ } elseif ( $title->getNamespace() == NS_MEDIAWIKI ) {
global $wgContLang;
$message = $wgContLang->lcfirst( $title->getText() );
$text = wfMsgForContentNoTrans( $message );
- if( wfEmptyMsg( $message, $text ) ) {
+ if ( wfEmptyMsg( $message, $text ) ) {
$text = false;
break;
}
@@ -3196,7 +3331,7 @@ class Parser
if ( $text === false ) {
break;
}
- // Redirect?
+ # Redirect?
$finalTitle = $title;
$title = Title::newFromRedirect( $text );
}
@@ -3212,35 +3347,39 @@ class Parser
function interwikiTransclude( $title, $action ) {
global $wgEnableScaryTranscluding;
- if (!$wgEnableScaryTranscluding)
- return wfMsg('scarytranscludedisabled');
+ if ( !$wgEnableScaryTranscluding ) {
+ return wfMsgForContent('scarytranscludedisabled');
+ }
$url = $title->getFullUrl( "action=$action" );
- if (strlen($url) > 255)
- return wfMsg('scarytranscludetoolong');
- return $this->fetchScaryTemplateMaybeFromCache($url);
+ if ( strlen( $url ) > 255 ) {
+ return wfMsgForContent( 'scarytranscludetoolong' );
+ }
+ return $this->fetchScaryTemplateMaybeFromCache( $url );
}
- function fetchScaryTemplateMaybeFromCache($url) {
+ function fetchScaryTemplateMaybeFromCache( $url ) {
global $wgTranscludeCacheExpiry;
- $dbr = wfGetDB(DB_SLAVE);
+ $dbr = wfGetDB( DB_SLAVE );
$tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry );
- $obj = $dbr->selectRow('transcache', array('tc_time', 'tc_contents'),
- array('tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) );
- if ($obj) {
+ $obj = $dbr->selectRow( 'transcache', array('tc_time', 'tc_contents' ),
+ array( 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) );
+ if ( $obj ) {
return $obj->tc_contents;
}
- $text = Http::get($url);
- if (!$text)
- return wfMsg('scarytranscludefailed', $url);
+ $text = Http::get( $url );
+ if ( !$text ) {
+ return wfMsgForContent( 'scarytranscludefailed', $url );
+ }
- $dbw = wfGetDB(DB_MASTER);
- $dbw->replace('transcache', array('tc_url'), array(
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace( 'transcache', array('tc_url'), array(
'tc_url' => $url,
'tc_time' => $dbw->timestamp( time() ),
- 'tc_contents' => $text));
+ 'tc_contents' => $text)
+ );
return $text;
}
@@ -3294,21 +3433,19 @@ class Parser
* Return the text to be used for a given extension tag.
* This is the ghost of strip().
*
- * @param array $params Associative array of parameters:
+ * @param $params Associative array of parameters:
* name PPNode for the tag name
* attr PPNode for unparsed text where tag attributes are thought to be
* attributes Optional associative array of parsed attributes
* inner Contents of extension element
* noClose Original text did not have a close tag
- * @param PPFrame $frame
+ * @param $frame PPFrame
*/
function extensionSubstitution( $params, $frame ) {
- global $wgRawHtml, $wgContLang;
-
$name = $frame->expand( $params['name'] );
$attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
$content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
- $marker = "{$this->mUniqPrefix}-$name-" . sprintf('%08X', $this->mMarkerIndex++) . self::MARKER_SUFFIX;
+ $marker = "{$this->mUniqPrefix}-$name-" . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
$isFunctionTag = isset( $this->mFunctionTagHooks[strtolower($name)] ) &&
( $this->ot['html'] || $this->ot['pre'] );
@@ -3324,27 +3461,27 @@ class Parser
$attributes = $attributes + $params['attributes'];
}
- if( isset( $this->mTagHooks[$name] ) ) {
+ if ( isset( $this->mTagHooks[$name] ) ) {
# Workaround for PHP bug 35229 and similar
if ( !is_callable( $this->mTagHooks[$name] ) ) {
throw new MWException( "Tag hook for $name is not callable\n" );
}
$output = call_user_func_array( $this->mTagHooks[$name],
array( $content, $attributes, $this, $frame ) );
- } elseif( isset( $this->mFunctionTagHooks[$name] ) ) {
+ } elseif ( isset( $this->mFunctionTagHooks[$name] ) ) {
list( $callback, $flags ) = $this->mFunctionTagHooks[$name];
- if( !is_callable( $callback ) )
+ if ( !is_callable( $callback ) ) {
throw new MWException( "Tag hook for $name is not callable\n" );
+ }
- $output = call_user_func_array( $callback,
- array( &$this, $frame, $content, $attributes ) );
+ $output = call_user_func_array( $callback, array( &$this, $frame, $content, $attributes ) );
} else {
$output = '<span class="error">Invalid tag extension name: ' .
htmlspecialchars( $name ) . '</span>';
}
if ( is_array( $output ) ) {
- // Extract flags to local scope (to override $markerType)
+ # Extract flags to local scope (to override $markerType)
$flags = $output;
$output = $flags[0];
unset( $flags[0] );
@@ -3368,7 +3505,7 @@ class Parser
}
}
- if( $markerType === 'none' ) {
+ if ( $markerType === 'none' ) {
return $output;
} elseif ( $markerType === 'nowiki' ) {
$this->mStripState->nowiki->setPair( $marker, $output );
@@ -3383,9 +3520,9 @@ class Parser
/**
* Increment an include size counter
*
- * @param string $type The type of expansion
- * @param integer $size The size of the text
- * @return boolean False if this inclusion would take it over the maximum, true otherwise
+ * @param $type String: the type of expansion
+ * @param $size Integer: the size of the text
+ * @return Boolean: false if this inclusion would take it over the maximum, true otherwise
*/
function incrementIncludeSize( $type, $size ) {
if ( $this->mIncludeSizes[$type] + $size > $this->mOptions->getMaxIncludeSize( $type ) ) {
@@ -3399,12 +3536,12 @@ class Parser
/**
* Increment the expensive function count
*
- * @return boolean False if the limit has been exceeded
+ * @return Boolean: false if the limit has been exceeded
*/
function incrementExpensiveFunctionCount() {
global $wgExpensiveParserFunctionLimit;
$this->mExpensiveFunctionCount++;
- if($this->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit) {
+ if ( $this->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit ) {
return true;
}
return false;
@@ -3417,20 +3554,20 @@ class Parser
function doDoubleUnderscore( $text ) {
wfProfileIn( __METHOD__ );
- // The position of __TOC__ needs to be recorded
+ # The position of __TOC__ needs to be recorded
$mw = MagicWord::get( 'toc' );
- if( $mw->match( $text ) ) {
+ if ( $mw->match( $text ) ) {
$this->mShowToc = true;
$this->mForceTocPosition = true;
- // Set a placeholder. At the end we'll fill it in with the TOC.
+ # Set a placeholder. At the end we'll fill it in with the TOC.
$text = $mw->replace( '<!--MWTOC-->', $text, 1 );
- // Only keep the first one.
+ # Only keep the first one.
$text = $mw->replace( '', $text );
}
- // Now match and remove the rest of them
+ # Now match and remove the rest of them
$mwa = MagicWord::getDoubleUnderscoreArray();
$this->mDoubleUnderscores = $mwa->matchAndRemove( $text );
@@ -3441,21 +3578,25 @@ class Parser
$this->mShowToc = false;
}
if ( isset( $this->mDoubleUnderscores['hiddencat'] ) && $this->mTitle->getNamespace() == NS_CATEGORY ) {
- $this->mOutput->setProperty( 'hiddencat', 'y' );
$this->addTrackingCategory( 'hidden-category-category' );
}
# (bug 8068) Allow control over whether robots index a page.
#
# FIXME (bug 14899): __INDEX__ always overrides __NOINDEX__ here! This
# is not desirable, the last one on the page should win.
- if( isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex() ) {
+ if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex() ) {
$this->mOutput->setIndexPolicy( 'noindex' );
$this->addTrackingCategory( 'noindex-category' );
}
- if( isset( $this->mDoubleUnderscores['index'] ) && $this->mTitle->canUseNoindex() ){
+ if ( isset( $this->mDoubleUnderscores['index'] ) && $this->mTitle->canUseNoindex() ) {
$this->mOutput->setIndexPolicy( 'index' );
$this->addTrackingCategory( 'index-category' );
}
+
+ # Cache all double underscores in the database
+ foreach ( $this->mDoubleUnderscores as $key => $val ) {
+ $this->mOutput->setProperty( $key, '' );
+ }
wfProfileOut( __METHOD__ );
return $text;
@@ -3464,14 +3605,17 @@ class Parser
/**
* Add a tracking category, getting the title from a system message,
* or print a debug message if the title is invalid.
- * @param $msg String message key
- * @return Bool whether the addition was successful
+ *
+ * @param $msg String: message key
+ * @return Boolean: whether the addition was successful
*/
- protected function addTrackingCategory( $msg ){
+ protected function addTrackingCategory( $msg ) {
$cat = wfMsgForContent( $msg );
# Allow tracking categories to be disabled by setting them to "-"
- if( $cat === '-' ) return false;
+ if ( $cat === '-' ) {
+ return false;
+ }
$containerCategory = Title::makeTitleSafe( NS_CATEGORY, $cat );
if ( $containerCategory ) {
@@ -3493,25 +3637,21 @@ class Parser
* It loops through all headlines, collects the necessary data, then splits up the
* string and re-inserts the newly formatted headlines.
*
- * @param string $text
- * @param string $origText Original, untouched wikitext
- * @param boolean $isMain
+ * @param $text String
+ * @param $origText String: original, untouched wikitext
+ * @param $isMain Boolean
* @private
*/
function formatHeadings( $text, $origText, $isMain=true ) {
global $wgMaxTocLevel, $wgContLang, $wgHtml5, $wgExperimentalHtmlIds;
$doNumberHeadings = $this->mOptions->getNumberHeadings();
- $showEditLink = $this->mOptions->getEditSection();
-
- // Do not call quickUserCan unless necessary
- if( $showEditLink && !$this->mTitle->quickUserCan( 'edit' ) ) {
- $showEditLink = 0;
- }
-
+
# Inhibit editsection links if requested in the page
- if ( isset( $this->mDoubleUnderscores['noeditsection'] ) || $this->mOptions->getIsPrintable() ) {
+ if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
$showEditLink = 0;
+ } else {
+ $showEditLink = $this->mOptions->getEditSection();
}
# Get all headlines for numbering them and adding funky stuff like [edit]
@@ -3522,7 +3662,7 @@ class Parser
# if there are fewer than 4 headlines in the article, do not show TOC
# unless it's been explicitly enabled.
$enoughToc = $this->mShowToc &&
- (($numMatches >= 4) || $this->mForceTocPosition);
+ ( ( $numMatches >= 4 ) || $this->mForceTocPosition );
# Allow user to stipulate that a page should have a "new section"
# link added via __NEWSECTIONLINK__
@@ -3544,7 +3684,7 @@ class Parser
}
# We need this to perform operations on the HTML
- $sk = $this->mOptions->getSkin();
+ $sk = $this->mOptions->getSkin( $this->mTitle );
# headline counter
$headlineCount = 0;
@@ -3557,7 +3697,6 @@ class Parser
$head = array();
$sublevelCount = array();
$levelCount = array();
- $toclevel = 0;
$level = 0;
$prevlevel = 0;
$toclevel = 0;
@@ -3571,23 +3710,23 @@ class Parser
$node = $root->getFirstChild();
$byteOffset = 0;
$tocraw = array();
+ $refers = array();
- foreach( $matches[3] as $headline ) {
+ foreach ( $matches[3] as $headline ) {
$isTemplate = false;
$titleText = false;
$sectionIndex = false;
$numbering = '';
$markerMatches = array();
- if (preg_match("/^$markerRegex/", $headline, $markerMatches)) {
+ if ( preg_match("/^$markerRegex/", $headline, $markerMatches ) ) {
$serial = $markerMatches[1];
list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
- $isTemplate = ($titleText != $baseTitleText);
- $headline = preg_replace("/^$markerRegex/", "", $headline);
+ $isTemplate = ( $titleText != $baseTitleText );
+ $headline = preg_replace( "/^$markerRegex/", "", $headline );
}
- if( $toclevel ) {
+ if ( $toclevel ) {
$prevlevel = $level;
- $prevtoclevel = $toclevel;
}
$level = $matches[1][$headlineCount];
@@ -3595,30 +3734,30 @@ class Parser
# Increase TOC level
$toclevel++;
$sublevelCount[$toclevel] = 0;
- if( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel<$wgMaxTocLevel ) {
$prevtoclevel = $toclevel;
$toc .= $sk->tocIndent();
$numVisible++;
}
- }
- elseif ( $level < $prevlevel && $toclevel > 1 ) {
+ } elseif ( $level < $prevlevel && $toclevel > 1 ) {
# Decrease TOC level, find level to jump to
- for ($i = $toclevel; $i > 0; $i--) {
+ for ( $i = $toclevel; $i > 0; $i-- ) {
if ( $levelCount[$i] == $level ) {
# Found last matching level
$toclevel = $i;
break;
- }
- elseif ( $levelCount[$i] < $level ) {
+ } elseif ( $levelCount[$i] < $level ) {
# Found first matching level below current level
$toclevel = $i + 1;
break;
}
}
- if( $i == 0 ) $toclevel = 1;
- if( $toclevel<$wgMaxTocLevel ) {
- if($prevtoclevel < $wgMaxTocLevel) {
+ if ( $i == 0 ) {
+ $toclevel = 1;
+ }
+ if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $prevtoclevel < $wgMaxTocLevel ) {
# Unindent only if the previous toc level was shown :p
$toc .= $sk->tocUnindent( $prevtoclevel - $toclevel );
$prevtoclevel = $toclevel;
@@ -3626,10 +3765,9 @@ class Parser
$toc .= $sk->tocLineEnd();
}
}
- }
- else {
+ } else {
# No change in level, end TOC line
- if( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel<$wgMaxTocLevel ) {
$toc .= $sk->tocLineEnd();
}
}
@@ -3640,8 +3778,8 @@ class Parser
@$sublevelCount[$toclevel]++;
$dot = 0;
for( $i = 1; $i <= $toclevel; $i++ ) {
- if( !empty( $sublevelCount[$i] ) ) {
- if( $dot ) {
+ if ( !empty( $sublevelCount[$i] ) ) {
+ if ( $dot ) {
$numbering .= '.';
}
$numbering .= $wgContLang->formatNum( $sublevelCount[$i] );
@@ -3662,15 +3800,14 @@ class Parser
# Strip out HTML (other than plain <sup> and <sub>: bug 8393)
$tocline = preg_replace(
array( '#<(?!/?(sup|sub)).*?'.'>#', '#<(/?(sup|sub)).*?'.'>#' ),
- array( '', '<$1>'),
+ array( '', '<$1>' ),
$safeHeadline
);
$tocline = trim( $tocline );
# For the anchor, strip out HTML-y stuff period
$safeHeadline = preg_replace( '/<.*?'.'>/', '', $safeHeadline );
- $safeHeadline = preg_replace( '/[ _]+/', ' ', $safeHeadline );
- $safeHeadline = trim( $safeHeadline );
+ $safeHeadline = Sanitizer::normalizeSectionNameWhitespace( $safeHeadline );
# Save headline for section edit hint before it's escaped
$headlineHint = $safeHeadline;
@@ -3700,9 +3837,10 @@ class Parser
'noninitial' );
}
- # HTML names must be case-insensitively unique (bug 10721). FIXME:
- # Does this apply to Unicode characters? Because we aren't
- # handling those here.
+ # HTML names must be case-insensitively unique (bug 10721).
+ # This does not apply to Unicode characters per
+ # http://dev.w3.org/html5/spec/infrastructure.html#case-sensitivity-and-string-comparison
+ # FIXME: We may be changing them depending on the current locale.
$arrayKey = strtolower( $safeHeadline );
if ( $legacyHeadline === false ) {
$legacyArrayKey = false;
@@ -3723,7 +3861,7 @@ class Parser
}
# Don't number the heading if it is the only one (looks silly)
- if( $doNumberHeadings && count( $matches[3] ) > 1) {
+ if ( $doNumberHeadings && count( $matches[3] ) > 1) {
# the two are different if the line contains a link
$headline = $numbering . ' ' . $headline;
}
@@ -3737,9 +3875,9 @@ class Parser
if ( $legacyHeadline !== false && $refers[$legacyArrayKey] > 1 ) {
$legacyAnchor .= '_' . $refers[$legacyArrayKey];
}
- if( $enoughToc && ( !isset($wgMaxTocLevel) || $toclevel<$wgMaxTocLevel ) ) {
- $toc .= $sk->tocLine($anchor, $tocline,
- $numbering, $toclevel, ($isTemplate ? false : $sectionIndex));
+ if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) {
+ $toc .= $sk->tocLine( $anchor, $tocline,
+ $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) );
}
# Add the section to the section tree
@@ -3747,8 +3885,9 @@ class Parser
while ( $node && !$isTemplate ) {
if ( $node->getName() === 'h' ) {
$bits = $node->splitHeading();
- if ( $bits['i'] == $sectionIndex )
+ if ( $bits['i'] == $sectionIndex ) {
break;
+ }
}
$byteOffset += mb_strlen( $this->mStripState->unstripBoth(
$frame->expand( $node, PPFrame::RECOVER_ORIG ) ) );
@@ -3759,20 +3898,20 @@ class Parser
'level' => $level,
'line' => $tocline,
'number' => $numbering,
- 'index' => ($isTemplate ? 'T-' : '' ) . $sectionIndex,
+ 'index' => ( $isTemplate ? 'T-' : '' ) . $sectionIndex,
'fromtitle' => $titleText,
'byteoffset' => ( $isTemplate ? null : $byteOffset ),
'anchor' => $anchor,
);
# give headline the correct <h#> tag
- if( $showEditLink && $sectionIndex !== false ) {
- if( $isTemplate ) {
+ if ( $showEditLink && $sectionIndex !== false ) {
+ if ( $isTemplate ) {
# Put a T flag in the section identifier, to indicate to extractSections()
# that sections inside <includeonly> should be counted.
- $editlink = $sk->doEditSectionLink(Title::newFromText( $titleText ), "T-$sectionIndex");
+ $editlink = $sk->doEditSectionLink( Title::newFromText( $titleText ), "T-$sectionIndex", null, $this->mOptions->getUserLang() );
} else {
- $editlink = $sk->doEditSectionLink($this->mTitle, $sectionIndex, $headlineHint);
+ $editlink = $sk->doEditSectionLink( $this->mTitle, $sectionIndex, $headlineHint, $this->mOptions->getUserLang() );
}
} else {
$editlink = '';
@@ -3787,15 +3926,15 @@ class Parser
$this->setOutputType( $oldType );
# Never ever show TOC if no headers
- if( $numVisible < 1 ) {
+ if ( $numVisible < 1 ) {
$enoughToc = false;
}
- if( $enoughToc ) {
- if( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) {
+ if ( $enoughToc ) {
+ if ( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) {
$toc .= $sk->tocUnindent( $prevtoclevel - 1 );
}
- $toc = $sk->tocList( $toc );
+ $toc = $sk->tocList( $toc, $this->mOptions->getUserLang() );
$this->mOutput->setTOCHTML( $toc );
}
@@ -3808,8 +3947,8 @@ class Parser
$blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
$i = 0;
- foreach( $blocks as $block ) {
- if( $showEditLink && $headlineCount > 0 && $i == 0 && $block !== "\n" ) {
+ foreach ( $blocks as $block ) {
+ if ( $showEditLink && $headlineCount > 0 && $i == 0 && $block !== "\n" ) {
# This is the [edit] link that appears for the top block of text when
# section editing is enabled
@@ -3818,17 +3957,17 @@ class Parser
# $full .= $sk->editSectionLink(0);
}
$full .= $block;
- if( $enoughToc && !$i && $isMain && !$this->mForceTocPosition ) {
+ if ( $enoughToc && !$i && $isMain && !$this->mForceTocPosition ) {
# Top anchor now in skin
$full = $full.$toc;
}
- if( !empty( $head[$i] ) ) {
+ if ( !empty( $head[$i] ) ) {
$full .= $head[$i];
}
$i++;
}
- if( $this->mForceTocPosition ) {
+ if ( $this->mForceTocPosition ) {
return str_replace( '<!--MWTOC-->', $toc, $full );
} else {
return $full;
@@ -3836,108 +3975,17 @@ class Parser
}
/**
- * Merge $tree2 into $tree1 by replacing the section with index
- * $section in $tree1 and its descendants with the sections in $tree2.
- * Note that in the returned section tree, only the 'index' and
- * 'byteoffset' fields are guaranteed to be correct.
- * @param $tree1 array Section tree from ParserOutput::getSectons()
- * @param $tree2 array Section tree
- * @param $section int Section index
- * @param $title Title Title both section trees come from
- * @param $len2 int Length of the original wikitext for $tree2
- * @return array Merged section tree
- */
- public static function mergeSectionTrees( $tree1, $tree2, $section, $title, $len2 ) {
- global $wgContLang;
- $newTree = array();
- $targetLevel = false;
- $merged = false;
- $lastLevel = 1;
- $nextIndex = 1;
- $numbering = array( 0 );
- $titletext = $title->getPrefixedDBkey();
- foreach ( $tree1 as $s ) {
- if ( $targetLevel !== false ) {
- if ( $s['level'] <= $targetLevel )
- // We've skipped enough
- $targetLevel = false;
- else
- continue;
- }
- if ( $s['index'] != $section ||
- $s['fromtitle'] != $titletext ) {
- self::incrementNumbering( $numbering,
- $s['toclevel'], $lastLevel );
-
- // Rewrite index, byteoffset and number
- if ( $s['fromtitle'] == $titletext ) {
- $s['index'] = $nextIndex++;
- if ( $merged )
- $s['byteoffset'] += $len2;
- }
- $s['number'] = implode( '.', array_map(
- array( $wgContLang, 'formatnum' ),
- $numbering ) );
- $lastLevel = $s['toclevel'];
- $newTree[] = $s;
- } else {
- // We're at $section
- // Insert sections from $tree2 here
- foreach ( $tree2 as $s2 ) {
- // Rewrite the fields in $s2
- // before inserting it
- $s2['toclevel'] += $s['toclevel'] - 1;
- $s2['level'] += $s['level'] - 1;
- $s2['index'] = $nextIndex++;
- $s2['byteoffset'] += $s['byteoffset'];
-
- self::incrementNumbering( $numbering,
- $s2['toclevel'], $lastLevel );
- $s2['number'] = implode( '.', array_map(
- array( $wgContLang, 'formatnum' ),
- $numbering ) );
- $lastLevel = $s2['toclevel'];
- $newTree[] = $s2;
- }
- // Skip all descendants of $section in $tree1
- $targetLevel = $s['level'];
- $merged = true;
- }
- }
- return $newTree;
- }
-
- /**
- * Increment a section number. Helper function for mergeSectionTrees()
- * @param $number array Array representing a section number
- * @param $level int Current TOC level (depth)
- * @param $lastLevel int Level of previous TOC entry
- */
- private static function incrementNumbering( &$number, $level, $lastLevel ) {
- if ( $level > $lastLevel )
- $number[$level - 1] = 1;
- else if ( $level < $lastLevel ) {
- foreach ( $number as $key => $unused )
- if ( $key >= $level )
- unset( $number[$key] );
- $number[$level - 1]++;
- } else
- $number[$level - 1]++;
- }
-
- /**
* Transform wiki markup when saving a page by doing \r\n -> \n
* conversion, substitting signatures, {{subst:}} templates, etc.
*
- * @param string $text the text to transform
- * @param Title &$title the Title object for the current article
- * @param User $user the User object describing the current user
- * @param ParserOptions $options parsing options
- * @param bool $clearState whether to clear the parser state first
- * @return string the altered wiki markup
- * @public
+ * @param $text String: the text to transform
+ * @param $title Title: the Title object for the current article
+ * @param $user User: the User object describing the current user
+ * @param $options ParserOptions: parsing options
+ * @param $clearState Boolean: whether to clear the parser state first
+ * @return String: the altered wiki markup
*/
- function preSaveTransform( $text, Title $title, $user, $options, $clearState = true ) {
+ public function preSaveTransform( $text, Title $title, $user, $options, $clearState = true ) {
$this->mOptions = $options;
$this->setTitle( $title );
$this->setOutputType( self::OT_WIKI );
@@ -3962,13 +4010,11 @@ class Parser
function pstPass2( $text, $user ) {
global $wgContLang, $wgLocaltimezone;
- /* Note: This is the timestamp saved as hardcoded wikitext to
- * the database, we use $wgContLang here in order to give
- * everyone the same signature and use the default one rather
- * than the one selected in each user's preferences.
- *
- * (see also bug 12815)
- */
+ # Note: This is the timestamp saved as hardcoded wikitext to
+ # the database, we use $wgContLang here in order to give
+ # everyone the same signature and use the default one rather
+ # than the one selected in each user's preferences.
+ # (see also bug 12815)
$ts = $this->mOptions->getTimestamp();
if ( isset( $wgLocaltimezone ) ) {
$tz = $wgLocaltimezone;
@@ -3982,13 +4028,14 @@ class Parser
$ts = date( 'YmdHis', $unixts );
$tzMsg = date( 'T', $unixts ); # might vary on DST changeover!
- /* Allow translation of timezones trough wiki. date() can return
- * whatever crap the system uses, localised or not, so we cannot
- * ship premade translations.
- */
+ # Allow translation of timezones through wiki. date() can return
+ # whatever crap the system uses, localised or not, so we cannot
+ # ship premade translations.
$key = 'timezone-' . strtolower( trim( $tzMsg ) );
$value = wfMsgForContent( $key );
- if ( !wfEmptyMsg( $key, $value ) ) $tzMsg = $value;
+ if ( !wfEmptyMsg( $key, $value ) ) {
+ $tzMsg = $value;
+ }
date_default_timezone_set( $oldtz );
@@ -3998,6 +4045,9 @@ class Parser
# Because mOutputType is OT_WIKI, this will only process {{subst:xxx}} type tags
$text = $this->replaceVariables( $text );
+ # This works almost by chance, as the replaceVariables are done before the getUserSig(),
+ # which may corrupt this parser instance via its wfMsgExt( parsemag ) call-
+
# Signatures
$sigText = $this->getUserSig( $user );
$text = strtr( $text, array(
@@ -4007,7 +4057,6 @@ class Parser
) );
# Context links: [[|name]] and [[name (context)|]]
- #
global $wgLegalTitleChars;
$tc = "[$wgLegalTitleChars]";
$nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
@@ -4045,7 +4094,10 @@ class Parser
* If you have pre-fetched the nickname or the fancySig option, you can
* specify them here to save a database query.
*
- * @param User $user
+ * @param $user User
+ * @param $nickname String: nickname to use or false to use user's default nickname
+ * @param $fancySig Boolean: whether the nicknname is the complete signature
+ * or null to use default value
* @return string
*/
function getUserSig( &$user, $nickname = false, $fancySig = null ) {
@@ -4053,21 +4105,22 @@ class Parser
$username = $user->getName();
- // If not given, retrieve from the user object.
+ # If not given, retrieve from the user object.
if ( $nickname === false )
$nickname = $user->getOption( 'nickname' );
- if ( is_null( $fancySig ) )
+ if ( is_null( $fancySig ) ) {
$fancySig = $user->getBoolOption( 'fancysig' );
+ }
$nickname = $nickname == null ? $username : $nickname;
- if( mb_strlen( $nickname ) > $wgMaxSigChars ) {
+ if ( mb_strlen( $nickname ) > $wgMaxSigChars ) {
$nickname = $username;
wfDebug( __METHOD__ . ": $username has overlong signature.\n" );
- } elseif( $fancySig !== false ) {
+ } elseif ( $fancySig !== false ) {
# Sig. might contain markup; validate this
- if( $this->validateSig( $nickname ) !== false ) {
+ if ( $this->validateSig( $nickname ) !== false ) {
# Validated; clean up (if needed) and return it
return $this->cleanSig( $nickname, true );
} else {
@@ -4077,7 +4130,7 @@ class Parser
}
}
- // Make sure nickname doesnt get a sig in a sig
+ # Make sure nickname doesnt get a sig in a sig
$nickname = $this->cleanSigInSig( $nickname );
# If we're still here, make it a link to the user page
@@ -4093,7 +4146,7 @@ class Parser
/**
* Check that the user's signature contains no bad XML
*
- * @param string $text
+ * @param $text String
* @return mixed An expanded string, or false if invalid.
*/
function validateSig( $text ) {
@@ -4106,16 +4159,16 @@ class Parser
* 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures @see cleanSigInSig
* 2) Substitute all transclusions
*
- * @param string $text
+ * @param $text String
* @param $parsing Whether we're cleaning (preferences save) or parsing
- * @return string Signature text
+ * @return String: signature text
*/
function cleanSig( $text, $parsing = false ) {
if ( !$parsing ) {
global $wgTitle;
+ $this->mOptions = new ParserOptions;
$this->clearState();
$this->setTitle( $wgTitle );
- $this->mOptions = new ParserOptions;
$this->setOutputType = self::OT_PREPROCESS;
}
@@ -4145,8 +4198,9 @@ class Parser
/**
* Strip ~~~, ~~~~ and ~~~~~ out of signatures
- * @param string $text
- * @return string Signature text with /~{3,5}/ removed
+ *
+ * @param $text String
+ * @return String: signature text with /~{3,5}/ removed
*/
function cleanSigInSig( $text ) {
$text = preg_replace( '/~{3,5}/', '', $text );
@@ -4156,9 +4210,8 @@ class Parser
/**
* Set up some variables which are usually set up in parse()
* so that an external function can call some class members with confidence
- * @public
*/
- function startExternalParse( &$title, $options, $outputType, $clearState = true ) {
+ public function startExternalParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
$this->setTitle( $title );
$this->mOptions = $options;
$this->setOutputType( $outputType );
@@ -4170,12 +4223,11 @@ class Parser
/**
* Wrapper for preprocess()
*
- * @param string $text the text to preprocess
- * @param ParserOptions $options options
- * @return string
- * @public
+ * @param $text String: the text to preprocess
+ * @param $options ParserOptions: options
+ * @return String
*/
- function transformMsg( $text, $options ) {
+ public function transformMsg( $text, $options ) {
global $wgTitle;
static $executing = false;
@@ -4185,34 +4237,37 @@ class Parser
}
$executing = true;
- wfProfileIn(__METHOD__);
- $text = $this->preprocess( $text, $wgTitle, $options );
+ wfProfileIn( __METHOD__ );
+ $title = $wgTitle;
+ if ( !$title ) {
+ # It's not uncommon having a null $wgTitle in scripts. See r80898
+ # Create a ghost title in such case
+ $title = Title::newFromText( 'Dwimmerlaik' );
+ }
+ $text = $this->preprocess( $text, $title, $options );
$executing = false;
- wfProfileOut(__METHOD__);
+ wfProfileOut( __METHOD__ );
return $text;
}
/**
* Create an HTML-style tag, e.g. <yourtag>special text</yourtag>
* The callback should have the following form:
- * function myParserHook( $text, $params, &$parser ) { ... }
+ * function myParserHook( $text, $params, $parser ) { ... }
*
* Transform and return $text. Use $parser for any required context, e.g. use
* $parser->getTitle() and $parser->getOptions() not $wgTitle or $wgOut->mParserOptions
*
- * @public
- *
- * @param mixed $tag The tag to use, e.g. 'hook' for <hook>
- * @param mixed $callback The callback function (and object) to use for the tag
- *
+ * @param $tag Mixed: the tag to use, e.g. 'hook' for <hook>
+ * @param $callback Mixed: the callback function (and object) to use for the tag
* @return The old value of the mTagHooks array associated with the hook
*/
- function setHook( $tag, $callback ) {
+ public function setHook( $tag, $callback ) {
$tag = strtolower( $tag );
$oldVal = isset( $this->mTagHooks[$tag] ) ? $this->mTagHooks[$tag] : null;
$this->mTagHooks[$tag] = $callback;
- if( !in_array( $tag, $this->mStripList ) ) {
+ if ( !in_array( $tag, $this->mStripList ) ) {
$this->mStripList[] = $tag;
}
@@ -4251,11 +4306,9 @@ class Parser
* nowiki Wiki markup in the return value should be escaped
* isHTML The returned text is HTML, armour it against wikitext transformation
*
- * @public
- *
- * @param string $id The magic word ID
- * @param mixed $callback The callback function (and object) to use
- * @param integer $flags a combination of the following flags:
+ * @param $id String: The magic word ID
+ * @param $callback Mixed: the callback function (and object) to use
+ * @param $flags Integer: a combination of the following flags:
* SFH_NO_HASH No leading hash, i.e. {{plural:...}} instead of {{#if:...}}
*
* SFH_OBJECT_ARGS Pass the template arguments as PPNode objects instead of text. This
@@ -4279,7 +4332,7 @@ class Parser
*
* @return The old callback function for this name, if any
*/
- function setFunctionHook( $id, $callback, $flags = 0 ) {
+ public function setFunctionHook( $id, $callback, $flags = 0 ) {
global $wgContLang;
$oldVal = isset( $this->mFunctionHooks[$id] ) ? $this->mFunctionHooks[$id][0] : null;
@@ -4287,7 +4340,7 @@ class Parser
# Add to function cache
$mw = MagicWord::get( $id );
- if( !$mw )
+ if ( !$mw )
throw new MWException( __METHOD__.'() expecting a magic word identifier.' );
$synonyms = $mw->getSynonyms();
@@ -4314,7 +4367,7 @@ class Parser
/**
* Get all registered function hook identifiers
*
- * @return array
+ * @return Array
*/
function getFunctionHooks() {
return array_keys( $this->mFunctionHooks );
@@ -4331,7 +4384,7 @@ class Parser
$this->mFunctionTagHooks[$tag] : null;
$this->mFunctionTagHooks[$tag] = array( $callback, $flags );
- if( !in_array( $tag, $this->mStripList ) ) {
+ if ( !in_array( $tag, $this->mStripList ) ) {
$this->mStripList[] = $tag;
}
@@ -4351,8 +4404,9 @@ class Parser
/**
* Replace <!--LINK--> link placeholders with plain text of links
* (not HTML-formatted).
- * @param string $text
- * @return string
+ *
+ * @param $text String
+ * @return String
*/
function replaceLinkHoldersText( $text ) {
return $this->mLinkHolders->replaceText( $text );
@@ -4375,22 +4429,27 @@ class Parser
$ig->setParser( $this );
$ig->setHideBadImages();
$ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) );
- $ig->useSkin( $this->mOptions->getSkin() );
+ $ig->useSkin( $this->mOptions->getSkin( $this->mTitle ) );
$ig->mRevisionId = $this->mRevisionId;
- if( isset( $params['caption'] ) ) {
+ if ( isset( $params['showfilename'] ) ) {
+ $ig->setShowFilename( true );
+ } else {
+ $ig->setShowFilename( false );
+ }
+ if ( isset( $params['caption'] ) ) {
$caption = $params['caption'];
$caption = htmlspecialchars( $caption );
$caption = $this->replaceInternalLinks( $caption );
$ig->setCaptionHtml( $caption );
}
- if( isset( $params['perrow'] ) ) {
+ if ( isset( $params['perrow'] ) ) {
$ig->setPerRow( $params['perrow'] );
}
- if( isset( $params['widths'] ) ) {
+ if ( isset( $params['widths'] ) ) {
$ig->setWidths( $params['widths'] );
}
- if( isset( $params['heights'] ) ) {
+ if ( isset( $params['heights'] ) ) {
$ig->setHeights( $params['heights'] );
}
@@ -4407,11 +4466,12 @@ class Parser
continue;
}
- if ( strpos( $matches[0], '%' ) !== false )
+ if ( strpos( $matches[0], '%' ) !== false ) {
$matches[1] = urldecode( $matches[1] );
- $tp = Title::newFromText( $matches[1]/*, NS_FILE*/ );
+ }
+ $tp = Title::newFromText( $matches[1] );
$nt =& $tp;
- if( is_null( $nt ) ) {
+ if ( is_null( $nt ) ) {
# Bogus title. Ignore these so we don't bomb out later.
continue;
}
@@ -4440,7 +4500,7 @@ class Parser
$handlerClass = '';
}
if ( !isset( $this->mImageParams[$handlerClass] ) ) {
- // Initialise static lists
+ # Initialise static lists
static $internalParamNames = array(
'horizAlign' => array( 'left', 'right', 'center', 'none' ),
'vertAlign' => array( 'baseline', 'sub', 'super', 'top', 'text-top', 'middle',
@@ -4459,7 +4519,7 @@ class Parser
}
}
- // Add handler params
+ # Add handler params
$paramMap = $internalParamMap;
if ( $handler ) {
$handlerParamMap = $handler->getParamMap();
@@ -4475,9 +4535,10 @@ class Parser
/**
* Parse image options text and use it to make an image
- * @param Title $title
- * @param string $options
- * @param LinkHolderArray $holders
+ *
+ * @param $title Title
+ * @param $options String
+ * @param $holders LinkHolderArray
*/
function makeImage( $title, $options, $holders = false ) {
# Check if the options text is of the form "options|alt text"
@@ -4506,7 +4567,7 @@ class Parser
# * text-bottom
$parts = StringUtils::explode( "|", $options );
- $sk = $this->mOptions->getSkin();
+ $sk = $this->mOptions->getSkin( $this->mTitle );
# Give extensions a chance to select the file revision for us
$skip = $time = $descQuery = false;
@@ -4517,7 +4578,6 @@ class Parser
}
# Get the file
- $imagename = $title->getDBkey();
$file = wfFindFile( $title, array( 'time' => $time ) );
# Get parameter map
$handler = $file ? $file->getHandler() : false;
@@ -4528,15 +4588,15 @@ class Parser
$caption = '';
$params = array( 'frame' => array(), 'handler' => array(),
'horizAlign' => array(), 'vertAlign' => array() );
- foreach( $parts as $part ) {
+ foreach ( $parts as $part ) {
$part = trim( $part );
list( $magicName, $value ) = $mwArray->matchVariableStartToEnd( $part );
$validated = false;
- if( isset( $paramMap[$magicName] ) ) {
+ if ( isset( $paramMap[$magicName] ) ) {
list( $type, $paramName ) = $paramMap[$magicName];
- // Special case; width and height come in one variable together
- if( $type === 'handler' && $paramName === 'width' ) {
+ # Special case; width and height come in one variable together
+ if ( $type === 'handler' && $paramName === 'width' ) {
$m = array();
# (bug 13500) In both cases (width/height and width only),
# permit trailing "px" for backward compatibility.
@@ -4557,7 +4617,7 @@ class Parser
$params[$type]['width'] = $width;
$validated = true;
}
- } // else no validation -- bug 13436
+ } # else no validation -- bug 13436
} else {
if ( $type === 'handler' ) {
# Validate handler parameter
@@ -4567,9 +4627,9 @@ class Parser
switch( $paramName ) {
case 'manualthumb':
case 'alt':
- // @todo Fixme: possibly check validity here for
- // manualthumb? downstream behavior seems odd with
- // missing manual thumbs.
+ # @todo Fixme: possibly check validity here for
+ # manualthumb? downstream behavior seems odd with
+ # missing manual thumbs.
$validated = true;
$value = $this->stripAltText( $value, $holders );
break;
@@ -4584,6 +4644,9 @@ class Parser
if ( preg_match( "/^($prots)$chars+$/", $value, $m ) ) {
$paramName = 'link-url';
$this->mOutput->addExternalLink( $value );
+ if ( $this->mOptions->getExternalLinkTarget() ) {
+ $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
+ }
$validated = true;
}
} else {
@@ -4597,7 +4660,7 @@ class Parser
}
break;
default:
- // Most other things appear to be empty or numeric...
+ # Most other things appear to be empty or numeric...
$validated = ( $value === false || is_numeric( trim( $value ) ) );
}
}
@@ -4670,7 +4733,7 @@ class Parser
wfRunHooks( 'ParserMakeImageParams', array( $title, $file, &$params ) );
# Linker does the rest
- $ret = $sk->makeImageLink2( $title, $file, $params['frame'], $params['handler'], $time, $descQuery );
+ $ret = $sk->makeImageLink2( $title, $file, $params['frame'], $params['handler'], $time, $descQuery, $this->mOptions->getThumbSize() );
# Give the handler a chance to modify the parser object
if ( $handler ) {
@@ -4705,15 +4768,17 @@ class Parser
*/
function disableCache() {
wfDebug( "Parser output marked as uncacheable.\n" );
- $this->mOutput->mCacheTime = -1;
+ $this->mOutput->setCacheTime( -1 ); // old style, for compatibility
+ $this->mOutput->updateCacheExpiry( 0 ); // new style, for consistency
}
- /**#@+
+ /**
* Callback from the Sanitizer for expanding items found in HTML attribute
* values, so they can be safely tested and escaped.
- * @param string $text
- * @param PPFrame $frame
- * @return string
+ *
+ * @param $text String
+ * @param $frame PPFrame
+ * @return String
* @private
*/
function attributeStripCallback( &$text, $frame = false ) {
@@ -4722,22 +4787,12 @@ class Parser
return $text;
}
- /**#@-*/
-
- /**#@+
- * Accessor/mutator
- */
- function Title( $x = null ) { return wfSetVar( $this->mTitle, $x ); }
- function Options( $x = null ) { return wfSetVar( $this->mOptions, $x ); }
- function OutputType( $x = null ) { return wfSetVar( $this->mOutputType, $x ); }
- /**#@-*/
-
- /**#@+
+ /**
* Accessor
*/
- function getTags() { return array_merge( array_keys($this->mTransparentTagHooks), array_keys( $this->mTagHooks ) ); }
- /**#@-*/
-
+ function getTags() {
+ return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ) );
+ }
/**
* Break wikitext input into sections, and either pull or replace
@@ -4745,8 +4800,8 @@ class Parser
*
* External callers should use the getSection and replaceSection methods.
*
- * @param string $text Page wikitext
- * @param string $section A section identifier string of the form:
+ * @param $text String: Page wikitext
+ * @param $section String: a section identifier string of the form:
* <flag1> - <flag2> - ... - <section number>
*
* Currently the only recognised flag is "T", which means the target section number
@@ -4759,21 +4814,21 @@ class Parser
* pull the given section along with its lower-level subsections. If the section is
* not found, $mode=get will return $newtext, and $mode=replace will return $text.
*
- * @param string $mode One of "get" or "replace"
- * @param string $newText Replacement text for section data.
- * @return string for "get", the extracted section text.
- * for "replace", the whole page with the section replaced.
+ * @param $mode String: one of "get" or "replace"
+ * @param $newText String: replacement text for section data.
+ * @return String: for "get", the extracted section text.
+ * for "replace", the whole page with the section replaced.
*/
private function extractSections( $text, $section, $mode, $newText='' ) {
global $wgTitle;
- $this->clearState();
- $this->setTitle( $wgTitle ); // not generally used but removes an ugly failure mode
$this->mOptions = new ParserOptions;
- $this->setOutputType( self::OT_WIKI );
+ $this->clearState();
+ $this->setTitle( $wgTitle ); # not generally used but removes an ugly failure mode
+ $this->setOutputType( self::OT_PLAIN );
$outText = '';
$frame = $this->getPreprocessor()->newFrame();
- // Process section extraction flags
+ # Process section extraction flags
$flags = 0;
$sectionParts = explode( '-', $section );
$sectionIndex = array_pop( $sectionParts );
@@ -4782,23 +4837,23 @@ class Parser
$flags |= self::PTD_FOR_INCLUSION;
}
}
- // Preprocess the text
+ # Preprocess the text
$root = $this->preprocessToDom( $text, $flags );
- // <h> nodes indicate section breaks
- // They can only occur at the top level, so we can find them by iterating the root's children
+ # <h> nodes indicate section breaks
+ # They can only occur at the top level, so we can find them by iterating the root's children
$node = $root->getFirstChild();
- // Find the target section
+ # Find the target section
if ( $sectionIndex == 0 ) {
- // Section zero doesn't nest, level=big
+ # Section zero doesn't nest, level=big
$targetLevel = 1000;
} else {
- while ( $node ) {
- if ( $node->getName() === 'h' ) {
- $bits = $node->splitHeading();
+ while ( $node ) {
+ if ( $node->getName() === 'h' ) {
+ $bits = $node->splitHeading();
if ( $bits['i'] == $sectionIndex ) {
- $targetLevel = $bits['level'];
+ $targetLevel = $bits['level'];
break;
}
}
@@ -4810,7 +4865,7 @@ class Parser
}
if ( !$node ) {
- // Not found
+ # Not found
if ( $mode === 'get' ) {
return $newText;
} else {
@@ -4818,7 +4873,7 @@ class Parser
}
}
- // Find the end of the section, including nested sections
+ # Find the end of the section, including nested sections
do {
if ( $node->getName() === 'h' ) {
$bits = $node->splitHeading();
@@ -4833,13 +4888,13 @@ class Parser
$node = $node->getNextSibling();
} while ( $node );
- // Write out the remainder (in replace mode only)
+ # Write out the remainder (in replace mode only)
if ( $mode === 'replace' ) {
- // Output the replacement text
- // Add two newlines on -- trailing whitespace in $newText is conventionally
- // stripped by the editor, so we need both newlines to restore the paragraph gap
- // Only add trailing whitespace if there is newText
- if($newText != "") {
+ # Output the replacement text
+ # Add two newlines on -- trailing whitespace in $newText is conventionally
+ # stripped by the editor, so we need both newlines to restore the paragraph gap
+ # Only add trailing whitespace if there is newText
+ if ( $newText != "" ) {
$outText .= $newText . "\n\n";
}
@@ -4850,7 +4905,7 @@ class Parser
}
if ( is_string( $outText ) ) {
- // Re-insert stripped tags
+ # Re-insert stripped tags
$outText = rtrim( $this->mStripState->unstripBoth( $outText ) );
}
@@ -4864,20 +4919,38 @@ class Parser
*
* If a section contains subsections, these are also returned.
*
- * @param string $text text to look in
- * @param string $section section identifier
- * @param string $deftext default to return if section is not found
+ * @param $text String: text to look in
+ * @param $section String: section identifier
+ * @param $deftext String: default to return if section is not found
* @return string text of the requested section
*/
public function getSection( $text, $section, $deftext='' ) {
return $this->extractSections( $text, $section, "get", $deftext );
}
+ /**
+ * This function returns $oldtext after the content of the section
+ * specified by $section has been replaced with $text.
+ *
+ * @param $text String: former text of the article
+ * @param $section Numeric: section identifier
+ * @param $text String: replacing text
+ * #return String: modified text
+ */
public function replaceSection( $oldtext, $section, $text ) {
return $this->extractSections( $oldtext, $section, "replace", $text );
}
/**
+ * Get the ID of the revision we are parsing
+ *
+ * @return Mixed: integer or null
+ */
+ function getRevisionId() {
+ return $this->mRevisionId;
+ }
+
+ /**
* Get the timestamp associated with the current revision, adjusted for
* the default server-local timestamp
*/
@@ -4889,18 +4962,18 @@ class Parser
$timestamp = $dbr->selectField( 'revision', 'rev_timestamp',
array( 'rev_id' => $this->mRevisionId ), __METHOD__ );
- // Normalize timestamp to internal MW format for timezone processing.
- // This has the added side-effect of replacing a null value with
- // the current time, which gives us more sensible behavior for
- // previews.
+ # Normalize timestamp to internal MW format for timezone processing.
+ # This has the added side-effect of replacing a null value with
+ # the current time, which gives us more sensible behavior for
+ # previews.
$timestamp = wfTimestamp( TS_MW, $timestamp );
- // The cryptic '' timezone parameter tells to use the site-default
- // timezone offset instead of the user settings.
- //
- // Since this value will be saved into the parser cache, served
- // to other users, and potentially even used inside links and such,
- // it needs to be consistent for all visitors.
+ # The cryptic '' timezone parameter tells to use the site-default
+ # timezone offset instead of the user settings.
+ #
+ # Since this value will be saved into the parser cache, served
+ # to other users, and potentially even used inside links and such,
+ # it needs to be consistent for all visitors.
$this->mRevisionTimestamp = $wgContLang->userAdjust( $timestamp, '' );
wfProfileOut( __METHOD__ );
@@ -4910,11 +4983,13 @@ class Parser
/**
* Get the name of the user that edited the last revision
+ *
+ * @return String: user name
*/
function getRevisionUser() {
- // if this template is subst: the revision id will be blank,
- // so just use the current user's name
- if( $this->mRevisionId ) {
+ # if this template is subst: the revision id will be blank,
+ # so just use the current user's name
+ if ( $this->mRevisionId ) {
$revision = Revision::newFromId( $this->mRevisionId );
$revuser = $revision->getUserText();
} else {
@@ -4931,23 +5006,24 @@ class Parser
*/
public function setDefaultSort( $sort ) {
$this->mDefaultSort = $sort;
+ $this->mOutput->setProperty( 'defaultsort', $sort );
}
/**
* Accessor for $mDefaultSort
- * Will use the title/prefixed title if none is set
+ * Will use the empty string if none is set.
+ *
+ * This value is treated as a prefix, so the
+ * empty string is equivalent to sorting by
+ * page name.
*
* @return string
*/
public function getDefaultSort() {
- global $wgCategoryPrefixedDefaultSortkey;
- if( $this->mDefaultSort !== false ) {
+ if ( $this->mDefaultSort !== false ) {
return $this->mDefaultSort;
- } elseif ($this->mTitle->getNamespace() == NS_CATEGORY ||
- !$wgCategoryPrefixedDefaultSortkey) {
- return $this->mTitle->getText();
} else {
- return $this->mTitle->getPrefixedText();
+ return '';
}
}
@@ -4969,19 +5045,23 @@ class Parser
public function guessSectionNameFromWikiText( $text ) {
# Strip out wikitext links(they break the anchor)
$text = $this->stripSectionName( $text );
- $headline = Sanitizer::decodeCharReferences( $text );
- # strip out HTML
- $headline = StringUtils::delimiterReplace( '<', '>', '', $headline );
- $headline = trim( $headline );
- $sectionanchor = '#' . urlencode( str_replace( ' ', '_', $headline ) );
- $replacearray = array(
- '%3A' => ':',
- '%' => '.'
- );
- return str_replace(
- array_keys( $replacearray ),
- array_values( $replacearray ),
- $sectionanchor );
+ $text = Sanitizer::normalizeSectionNameWhitespace( $text );
+ return '#' . Sanitizer::escapeId( $text, 'noninitial' );
+ }
+
+ /**
+ * Same as guessSectionNameFromWikiText(), but produces legacy anchors
+ * instead. For use in redirects, since IE6 interprets Redirect: headers
+ * as something other than UTF-8 (apparently?), resulting in breakage.
+ *
+ * @param $text String: The section name
+ * @return string An anchor
+ */
+ public function guessLegacySectionNameFromWikiText( $text ) {
+ # Strip out wikitext links(they break the anchor)
+ $text = $this->stripSectionName( $text );
+ $text = Sanitizer::normalizeSectionNameWhitespace( $text );
+ return '#' . Sanitizer::escapeId( $text, array( 'noninitial', 'legacy' ) );
}
/**
@@ -4994,42 +5074,38 @@ class Parser
* to create valid section anchors by mimicing the output of the
* parser when headings are parsed.
*
- * @param $text string Text string to be stripped of wikitext
+ * @param $text String: text string to be stripped of wikitext
* for use in a Section anchor
* @return Filtered text string
*/
public function stripSectionName( $text ) {
# Strip internal link markup
- $text = preg_replace('/\[\[:?([^[|]+)\|([^[]+)\]\]/','$2',$text);
- $text = preg_replace('/\[\[:?([^[]+)\|?\]\]/','$1',$text);
+ $text = preg_replace( '/\[\[:?([^[|]+)\|([^[]+)\]\]/', '$2', $text );
+ $text = preg_replace( '/\[\[:?([^[]+)\|?\]\]/', '$1', $text );
# Strip external link markup (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( '/\[(?:' . wfUrlProtocols() . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
# Parse wikitext quotes (italics & bold)
- $text = $this->doQuotes($text);
+ $text = $this->doQuotes( $text );
# Strip HTML tags
$text = StringUtils::delimiterReplace( '<', '>', '', $text );
return $text;
}
- function srvus( $text ) {
- return $this->testSrvus( $text, $this->mOutputType );
- }
-
/**
* strip/replaceVariables/unstrip for preprocessor regression testing
*/
- function testSrvus( $text, $title, $options, $outputType = self::OT_HTML ) {
+ function testSrvus( $text, $title, ParserOptions $options, $outputType = self::OT_HTML ) {
+ $this->mOptions = $options;
$this->clearState();
- if ( ! ( $title instanceof Title ) ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
$this->mTitle = $title;
- $this->mOptions = $options;
$this->setOutputType( $outputType );
$text = $this->replaceVariables( $text );
$text = $this->mStripState->unstripBoth( $text );
@@ -5039,14 +5115,14 @@ class Parser
function testPst( $text, $title, $options ) {
global $wgUser;
- if ( ! ( $title instanceof Title ) ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
return $this->preSaveTransform( $text, $title, $wgUser, $options );
}
function testPreprocess( $text, $title, $options ) {
- if ( ! ( $title instanceof Title ) ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
return $this->testSrvus( $text, $title, $options, self::OT_PREPROCESS );
@@ -5080,11 +5156,13 @@ class Parser
$data = array();
$data['text'] = $text;
- // First, find all strip markers, and store their
- // data in an array.
+ # First, find all strip markers, and store their
+ # data in an array.
$stripState = new StripState;
$pos = 0;
- while( ( $start_pos = strpos( $text, $this->mUniqPrefix, $pos ) ) && ( $end_pos = strpos( $text, self::MARKER_SUFFIX, $pos ) ) ) {
+ while ( ( $start_pos = strpos( $text, $this->mUniqPrefix, $pos ) )
+ && ( $end_pos = strpos( $text, self::MARKER_SUFFIX, $pos ) ) )
+ {
$end_pos += strlen( self::MARKER_SUFFIX );
$marker = substr( $text, $start_pos, $end_pos-$start_pos );
@@ -5103,17 +5181,17 @@ class Parser
}
$data['stripstate'] = $stripState;
- // Now, find all of our links, and store THEIR
- // data in an array! :)
+ # Now, find all of our links, and store THEIR
+ # data in an array! :)
$links = array( 'internal' => array(), 'interwiki' => array() );
$pos = 0;
- // Internal links
- while( ( $start_pos = strpos( $text, '<!--LINK ', $pos ) ) ) {
+ # Internal links
+ while ( ( $start_pos = strpos( $text, '<!--LINK ', $pos ) ) ) {
list( $ns, $trail ) = explode( ':', substr( $text, $start_pos + strlen( '<!--LINK ' ) ), 2 );
- $ns = trim($ns);
- if (empty( $links['internal'][$ns] )) {
+ $ns = trim( $ns );
+ if ( empty( $links['internal'][$ns] ) ) {
$links['internal'][$ns] = array();
}
@@ -5124,8 +5202,8 @@ class Parser
$pos = 0;
- // Interwiki links
- while( ( $start_pos = strpos( $text, '<!--IWLINK ', $pos ) ) ) {
+ # Interwiki links
+ while ( ( $start_pos = strpos( $text, '<!--IWLINK ', $pos ) ) ) {
$data = substr( $text, $start_pos );
$key = trim( substr( $data, 0, strpos( $data, '-->' ) ) );
$links['interwiki'][] = $this->mLinkHolders->interwiki[$key];
@@ -5137,22 +5215,29 @@ class Parser
return $data;
}
- function unserialiseHalfParsedText( $data, $intPrefix = null /* Unique identifying prefix */ ) {
- if (!$intPrefix)
- $intPrefix = $this->getRandomString();
+ /**
+ * TODO: document
+ * @param $data Array
+ * @param $intPrefix String unique identifying prefix
+ * @return String
+ */
+ function unserialiseHalfParsedText( $data, $intPrefix = null ) {
+ if ( !$intPrefix ) {
+ $intPrefix = self::getRandomString();
+ }
- // First, extract the strip state.
+ # First, extract the strip state.
$stripState = $data['stripstate'];
$this->mStripState->general->merge( $stripState->general );
$this->mStripState->nowiki->merge( $stripState->nowiki );
- // Now, extract the text, and renumber links
+ # Now, extract the text, and renumber links
$text = $data['text'];
$links = $data['linkholder'];
- // Internal...
- foreach( $links['internal'] as $ns => $nsLinks ) {
- foreach( $nsLinks as $key => $entry ) {
+ # Internal...
+ foreach ( $links['internal'] as $ns => $nsLinks ) {
+ foreach ( $nsLinks as $key => $entry ) {
$newKey = $intPrefix . '-' . $key;
$this->mLinkHolders->internals[$ns][$newKey] = $entry;
@@ -5160,15 +5245,15 @@ class Parser
}
}
- // Interwiki...
- foreach( $links['interwiki'] as $key => $entry ) {
+ # Interwiki...
+ foreach ( $links['interwiki'] as $key => $entry ) {
$newKey = "$intPrefix-$key";
$this->mLinkHolders->interwikis[$newKey] = $entry;
$text = str_replace( "<!--IWLINK $key-->", "<!--IWLINK $newKey-->", $text );
}
- // Should be good to go.
+ # Should be good to go.
return $text;
}
}
diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php
index 524d6be5..1e028ae5 100644
--- a/includes/parser/ParserCache.php
+++ b/includes/parser/ParserCache.php
@@ -1,9 +1,18 @@
<?php
/**
+ * Cache for outputs of the PHP parser
+ *
+ * @file
+ */
+
+/**
* @ingroup Cache Parser
* @todo document
*/
class ParserCache {
+ private $mMemc;
+ const try116cache = false; /* Only useful $wgParserCacheExpireTime after updating to 1.17 */
+
/**
* Get an instance of this object
*/
@@ -20,49 +29,119 @@ class ParserCache {
* Setup a cache pathway with a given back-end storage mechanism.
* May be a memcached client or a BagOStuff derivative.
*
- * @param object $memCached
+ * @param $memCached Object
*/
function __construct( $memCached ) {
+ if ( !$memCached ) {
+ throw new MWException( "Tried to create a ParserCache with an invalid memcached" );
+ }
$this->mMemc = $memCached;
}
- function getKey( $article, $popts ) {
+ protected function getParserOutputKey( $article, $hash ) {
global $wgRequest;
- if( $popts instanceof User ) // It used to be getKey( &$article, &$user )
- $popts = ParserOptions::newFromUser( $popts );
-
- $user = $popts->mUser;
- $printable = ( $popts->getIsPrintable() ) ? '!printable=1' : '';
- $hash = $user->getPageRenderingHash();
- if( !$article->mTitle->quickUserCan( 'edit' ) ) {
- // section edit links are suppressed even if the user has them on
- $edit = '!edit=0';
- } else {
- $edit = '';
- }
+ // idhash seem to mean 'page id' + 'rendering hash' (r3710)
$pageid = $article->getID();
$renderkey = (int)($wgRequest->getVal('action') == 'render');
- $key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}{$edit}{$printable}" );
+
+ $key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
return $key;
}
+ protected function getOptionsKey( $article ) {
+ $pageid = $article->getID();
+ return wfMemcKey( 'pcache', 'idoptions', "{$pageid}" );
+ }
+
+ /**
+ * Provides an E-Tag suitable for the whole page. Note that $article
+ * is just the main wikitext. The E-Tag has to be unique to the whole
+ * page, even if the article itself is the same, so it uses the
+ * complete set of user options. We don't want to use the preference
+ * of a different user on a message just because it wasn't used in
+ * $article. For example give a Chinese interface to a user with
+ * English preferences. That's why we take into account *all* user
+ * options. (r70809 CR)
+ */
function getETag( $article, $popts ) {
- return 'W/"' . $this->getKey($article, $popts) . "--" . $article->mTouched. '"';
+ return 'W/"' . $this->getParserOutputKey( $article,
+ $popts->optionsHash( ParserOptions::legacyOptions() ) ) .
+ "--" . $article->getTouched() . '"';
}
- function getDirty( $article, $popts ) {
- $key = $this->getKey( $article, $popts );
- wfDebug( "Trying parser cache $key\n" );
- $value = $this->mMemc->get( $key );
+ /**
+ * Retrieve the ParserOutput from ParserCache, even if it's outdated.
+ */
+ public function getDirty( $article, $popts ) {
+ $value = $this->get( $article, $popts, true );
return is_object( $value ) ? $value : false;
}
- function get( $article, $popts ) {
+ /**
+ * Used to provide a unique id for the PoolCounter.
+ * It would be preferable to have this code in get()
+ * instead of having Article looking in our internals.
+ */
+ public function getKey( $article, $popts, $useOutdated = true ) {
+ global $wgCacheEpoch;
+
+ if( $popts instanceof User ) {
+ wfWarn( "Use of outdated prototype ParserCache::getKey( &\$article, &\$user )\n" );
+ $popts = ParserOptions::newFromUser( $popts );
+ }
+
+ // Determine the options which affect this article
+ $optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ) );
+ if ( $optionsKey != false ) {
+ if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
+ wfIncrStats( "pcache_miss_expired" );
+ $cacheTime = $optionsKey->getCacheTime();
+ wfDebug( "Parser options key expired, touched " . $article->getTouched() . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
+ return false;
+ }
+
+ $usedOptions = $optionsKey->mUsedOptions;
+ wfDebug( "Parser cache options found.\n" );
+ } else {
+ if ( !$useOutdated && !self::try116cache ) {
+ return false;
+ }
+ $usedOptions = ParserOptions::legacyOptions();
+ }
+
+ return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions ) );
+ }
+
+ /**
+ * Retrieve the ParserOutput from ParserCache.
+ * false if not found or outdated.
+ */
+ public function get( $article, $popts, $useOutdated = false ) {
global $wgCacheEpoch;
wfProfileIn( __METHOD__ );
- $value = $this->getDirty( $article, $popts );
+ $canCache = $article->checkTouched();
+ if ( !$canCache ) {
+ // It's a redirect now
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $touched = $article->getTouched();
+
+ $parserOutputKey = $this->getKey( $article, $popts, $useOutdated );
+ if ( $parserOutputKey === false ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $value = $this->mMemc->get( $parserOutputKey );
+ if ( self::try116cache && !$value && strpos( $value, '*' ) !== -1 ) {
+ wfDebug( "New format parser cache miss.\n" );
+ $parserOutputKey = $this->getParserOutputKey( $article, $popts->optionsHash( ParserOptions::legacyOptions() ) );
+ $value = $this->mMemc->get( $parserOutputKey );
+ }
if ( !$value ) {
wfDebug( "Parser cache miss.\n" );
wfIncrStats( "pcache_miss_absent" );
@@ -71,18 +150,11 @@ class ParserCache {
}
wfDebug( "Found.\n" );
- # Invalid if article has changed since the cache was made
- $canCache = $article->checkTouched();
- $cacheTime = $value->getCacheTime();
- $touched = $article->mTouched;
- if ( !$canCache || $value->expired( $touched ) ) {
- if ( !$canCache ) {
- wfIncrStats( "pcache_miss_invalid" );
- wfDebug( "Invalid cached redirect, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
- } else {
- wfIncrStats( "pcache_miss_expired" );
- wfDebug( "Key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
- }
+
+ if ( !$useOutdated && $value->expired( $touched ) ) {
+ wfIncrStats( "pcache_miss_expired" );
+ $cacheTime = $value->getCacheTime();
+ wfDebug( "ParserOutput key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
$value = false;
} else {
if ( isset( $value->mTimestamp ) ) {
@@ -95,31 +167,37 @@ class ParserCache {
return $value;
}
- function save( $parserOutput, $article, $popts ){
- global $wgParserCacheExpireTime;
- $key = $this->getKey( $article, $popts );
- if( $parserOutput->getCacheTime() != -1 ) {
+ public function save( $parserOutput, $article, $popts ) {
+ $expire = $parserOutput->getCacheExpiry();
+ if( $expire > 0 ) {
$now = wfTimestampNow();
+
+ $optionsKey = new CacheTime;
+ $optionsKey->mUsedOptions = $parserOutput->getUsedOptions();
+ $optionsKey->updateCacheExpiry( $expire );
+
+ $optionsKey->setCacheTime( $now );
$parserOutput->setCacheTime( $now );
+ $optionsKey->setContainsOldMagic( $parserOutput->containsOldMagic() );
+
+ $parserOutputKey = $this->getParserOutputKey( $article, $popts->optionsHash( $optionsKey->mUsedOptions ) );
+
// Save the timestamp so that we don't have to load the revision row on view
$parserOutput->mTimestamp = $article->getTimestamp();
- $parserOutput->mText .= "\n<!-- Saved in parser cache with key $key and timestamp $now -->\n";
- wfDebug( "Saved in parser cache with key $key and timestamp $now\n" );
+ $parserOutput->mText .= "\n<!-- Saved in parser cache with key $parserOutputKey and timestamp $now -->\n";
+ wfDebug( "Saved in parser cache with key $parserOutputKey and timestamp $now\n" );
- if( $parserOutput->containsOldMagic() ){
- $expire = 3600; # 1 hour
- } else {
- $expire = $wgParserCacheExpireTime;
- }
- $this->mMemc->set( $key, $parserOutput, $expire );
+ // Save the parser output
+ $this->mMemc->set( $parserOutputKey, $parserOutput, $expire );
+ // ...and its pointer
+ $this->mMemc->set( $this->getOptionsKey( $article ), $optionsKey, $expire );
} else {
wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" );
}
}
-
}
diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php
index 985bba28..9d8b3e4f 100644
--- a/includes/parser/ParserOptions.php
+++ b/includes/parser/ParserOptions.php
@@ -1,5 +1,11 @@
<?php
-
+/**
+ * Options for the PHP parser
+ *
+ * @file
+ * @ingroup Parser
+ */
+
/**
* Set options of the Parser
* @todo document
@@ -29,43 +35,61 @@ class ParserOptions {
var $mEnableLimitReport; # Enable limit report in an HTML comment on output
var $mTimestamp; # Timestamp used for {{CURRENTDAY}} etc.
var $mExternalLinkTarget; # Target attribute for external links
+ var $mMath; # User math preference (as integer)
+ var $mUserLang; # Language code of the User language.
+ var $mThumbSize; # Thumb size preferred by the user.
+ var $mCleanSignatures; #
var $mUser; # Stored user object, just used to initialise the skin
var $mIsPreview; # Parsing the page for a "preview" operation
var $mIsSectionPreview; # Parsing the page for a "preview" operation on a single section
var $mIsPrintable; # Parsing the printable version of the page
+ var $mExtraKey = ''; # Extra key that should be present in the caching key.
+
+ protected $onAccessCallback = null;
+
function getUseDynamicDates() { return $this->mUseDynamicDates; }
function getInterwikiMagic() { return $this->mInterwikiMagic; }
function getAllowExternalImages() { return $this->mAllowExternalImages; }
function getAllowExternalImagesFrom() { return $this->mAllowExternalImagesFrom; }
function getEnableImageWhitelist() { return $this->mEnableImageWhitelist; }
- function getEditSection() { return $this->mEditSection; }
- function getNumberHeadings() { return $this->mNumberHeadings; }
+ function getEditSection() { $this->optionUsed('editsection');
+ return $this->mEditSection; }
+ function getNumberHeadings() { $this->optionUsed('numberheadings');
+ return $this->mNumberHeadings; }
function getAllowSpecialInclusion() { return $this->mAllowSpecialInclusion; }
function getTidy() { return $this->mTidy; }
function getInterfaceMessage() { return $this->mInterfaceMessage; }
function getTargetLanguage() { return $this->mTargetLanguage; }
function getMaxIncludeSize() { return $this->mMaxIncludeSize; }
function getMaxPPNodeCount() { return $this->mMaxPPNodeCount; }
+ function getMaxPPExpandDepth() { return $this->mMaxPPExpandDepth; }
function getMaxTemplateDepth() { return $this->mMaxTemplateDepth; }
function getRemoveComments() { return $this->mRemoveComments; }
function getTemplateCallback() { return $this->mTemplateCallback; }
function getEnableLimitReport() { return $this->mEnableLimitReport; }
function getCleanSignatures() { return $this->mCleanSignatures; }
function getExternalLinkTarget() { return $this->mExternalLinkTarget; }
+ function getMath() { $this->optionUsed('math');
+ return $this->mMath; }
+ function getThumbSize() { $this->optionUsed('thumbsize');
+ return $this->mThumbSize; }
+
function getIsPreview() { return $this->mIsPreview; }
function getIsSectionPreview() { return $this->mIsSectionPreview; }
- function getIsPrintable() { return $this->mIsPrintable; }
+ function getIsPrintable() { $this->optionUsed('printable');
+ return $this->mIsPrintable; }
- function getSkin() {
+ function getSkin( $title = null ) {
if ( !isset( $this->mSkin ) ) {
- $this->mSkin = $this->mUser->getSkin();
+ $this->mSkin = $this->mUser->getSkin( $title );
}
return $this->mSkin;
}
function getDateFormat() {
+ $this->optionUsed('dateformat');
if ( !isset( $this->mDateFormat ) ) {
$this->mDateFormat = $this->mUser->getDatePreference();
}
@@ -79,6 +103,16 @@ class ParserOptions {
return $this->mTimestamp;
}
+ /**
+ * You shouldn't use this. Really. $parser->getFunctionLang() is all you need.
+ * Using this fragments the cache and is discouraged. Yes, {{int: }} uses this,
+ * producing inconsistent tables (Bug 14404).
+ */
+ function getUserLang() {
+ $this->optionUsed('userlang');
+ return $this->mUserLang;
+ }
+
function setUseDynamicDates( $x ) { return wfSetVar( $this->mUseDynamicDates, $x ); }
function setInterwikiMagic( $x ) { return wfSetVar( $this->mInterwikiMagic, $x ); }
function setAllowExternalImages( $x ) { return wfSetVar( $this->mAllowExternalImages, $x ); }
@@ -101,17 +135,30 @@ class ParserOptions {
function setTimestamp( $x ) { return wfSetVar( $this->mTimestamp, $x ); }
function setCleanSignatures( $x ) { return wfSetVar( $this->mCleanSignatures, $x ); }
function setExternalLinkTarget( $x ) { return wfSetVar( $this->mExternalLinkTarget, $x ); }
+ function setMath( $x ) { return wfSetVar( $this->mMath, $x ); }
+ function setUserLang( $x ) { return wfSetVar( $this->mUserLang, $x ); }
+ function setThumbSize( $x ) { return wfSetVar( $this->mThumbSize, $x ); }
+
function setIsPreview( $x ) { return wfSetVar( $this->mIsPreview, $x ); }
function setIsSectionPreview( $x ) { return wfSetVar( $this->mIsSectionPreview, $x ); }
function setIsPrintable( $x ) { return wfSetVar( $this->mIsPrintable, $x ); }
+ /**
+ * Extra key that should be present in the parser cache key.
+ */
+ function addExtraKey( $key ) {
+ $this->mExtraKey .= '!' . $key;
+ }
+
function __construct( $user = null ) {
$this->initialiseFromUser( $user );
}
/**
* Get parser options
- * @static
+ *
+ * @param $user User object
+ * @return ParserOptions object
*/
static function newFromUser( $user ) {
return new ParserOptions( $user );
@@ -122,7 +169,7 @@ class ParserOptions {
global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages;
global $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion, $wgMaxArticleSize;
global $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth, $wgCleanSignatures;
- global $wgExternalLinkTarget;
+ global $wgExternalLinkTarget, $wgLang;
wfProfileIn( __METHOD__ );
@@ -161,9 +208,131 @@ class ParserOptions {
$this->mEnableLimitReport = false;
$this->mCleanSignatures = $wgCleanSignatures;
$this->mExternalLinkTarget = $wgExternalLinkTarget;
+ $this->mMath = $user->getOption( 'math' );
+ $this->mUserLang = $wgLang->getCode();
+ $this->mThumbSize = $user->getOption( 'thumbsize' );
+
$this->mIsPreview = false;
$this->mIsSectionPreview = false;
+ $this->mIsPrintable = false;
wfProfileOut( __METHOD__ );
}
+
+ /**
+ * Registers a callback for tracking which ParserOptions which are used.
+ * This is a private API with the parser.
+ */
+ function registerWatcher( $callback ) {
+ $this->onAccessCallback = $callback;
+ }
+
+ /**
+ * Called when an option is accessed.
+ */
+ protected function optionUsed( $optionName ) {
+ if ( $this->onAccessCallback ) {
+ call_user_func( $this->onAccessCallback, $optionName );
+ }
+ }
+
+ /**
+ * Returns the full array of options that would have been used by
+ * in 1.16.
+ * Used to get the old parser cache entries when available.
+ */
+ public static function legacyOptions() {
+ global $wgUseDynamicDates;
+ $legacyOpts = array( 'math', 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' );
+ if ( $wgUseDynamicDates ) {
+ $legacyOpts[] = 'dateformat';
+ }
+ return $legacyOpts;
+ }
+
+ /**
+ * Generate a hash string with the values set on these ParserOptions
+ * for the keys given in the array.
+ * This will be used as part of the hash key for the parser cache,
+ * so users sharign the options with vary for the same page share
+ * the same cached data safely.
+ *
+ * Replaces User::getPageRenderingHash()
+ *
+ * Extensions which require it should install 'PageRenderingHash' hook,
+ * which will give them a chance to modify this key based on their own
+ * settings.
+ *
+ * @since 1.17
+ * @return \string Page rendering hash
+ */
+ public function optionsHash( $forOptions ) {
+ global $wgContLang, $wgRenderHashAppend;
+
+ $confstr = '';
+
+ if ( in_array( 'math', $forOptions ) )
+ $confstr .= $this->mMath;
+ else
+ $confstr .= '*';
+
+
+ // Space assigned for the stubthreshold but unused
+ // since it disables the parser cache, its value will always
+ // be 0 when this function is called by parsercache.
+ // The conditional is here to avoid a confusing 0
+ if ( true || in_array( 'stubthreshold', $forOptions ) )
+ $confstr .= '!0' ;
+ else
+ $confstr .= '!*' ;
+
+ if ( in_array( 'dateformat', $forOptions ) )
+ $confstr .= '!' . $this->getDateFormat();
+
+ if ( in_array( 'numberheadings', $forOptions ) )
+ $confstr .= '!' . ( $this->mNumberHeadings ? '1' : '' );
+ else
+ $confstr .= '!*';
+
+ if ( in_array( 'userlang', $forOptions ) )
+ $confstr .= '!' . $this->mUserLang;
+ else
+ $confstr .= '!*';
+
+ if ( in_array( 'thumbsize', $forOptions ) )
+ $confstr .= '!' . $this->mThumbSize;
+ else
+ $confstr .= '!*';
+
+ // add in language specific options, if any
+ // FIXME: This is just a way of retrieving the url/user preferred variant
+ $confstr .= $wgContLang->getExtraHashOptions();
+
+ // Since the skin could be overloading link(), it should be
+ // included here but in practice, none of our skins do that.
+ // $confstr .= "!" . $this->mSkin->getSkinName();
+
+ $confstr .= $wgRenderHashAppend;
+
+ if ( !in_array( 'editsection', $forOptions ) ) {
+ $confstr .= '!*';
+ } elseif ( !$this->mEditSection ) {
+ $confstr .= '!edit=0';
+ }
+
+ if ( $this->mIsPrintable && in_array( 'printable', $forOptions ) )
+ $confstr .= '!printable=1';
+
+ if ( $this->mExtraKey != '' )
+ $confstr .= $this->mExtraKey;
+
+ // Give a chance for extensions to modify the hash, if they have
+ // extra options or other effects on the parser cache.
+ wfRunHooks( 'PageRenderingHash', array( &$confstr ) );
+
+ // Make it a valid memcached key fragment
+ $confstr = str_replace( ' ', '_', $confstr );
+
+ return $confstr;
+ }
}
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index ea5840e6..1e4765db 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -1,34 +1,131 @@
<?php
/**
+ * Output of the PHP parser
+ *
+ * @file
+ * @ingroup Parser
+ */
+
+/**
* @todo document
* @ingroup Parser
*/
-class ParserOutput
+
+class CacheTime {
+ var $mVersion = Parser::VERSION, # Compatibility check
+ $mCacheTime = '', # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
+ $mCacheExpiry = null, # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
+ $mContainsOldMagic; # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
+
+ function getCacheTime() { return $this->mCacheTime; }
+
+ function containsOldMagic() { return $this->mContainsOldMagic; }
+ function setContainsOldMagic( $com ) { return wfSetVar( $this->mContainsOldMagic, $com ); }
+
+ /**
+ * setCacheTime() sets the timestamp expressing when the page has been rendered.
+ * This doesn not control expiry, see updateCacheExpiry() for that!
+ */
+ function setCacheTime( $t ) { return wfSetVar( $this->mCacheTime, $t ); }
+
+
+ /**
+ * Sets the number of seconds after which this object should expire.
+ * This value is used with the ParserCache.
+ * If called with a value greater than the value provided at any previous call,
+ * the new call has no effect. The value returned by getCacheExpiry is smaller
+ * or equal to the smallest number that was provided as an argument to
+ * updateCacheExpiry().
+ */
+ function updateCacheExpiry( $seconds ) {
+ $seconds = (int)$seconds;
+
+ if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds )
+ $this->mCacheExpiry = $seconds;
+
+ // hack: set old-style marker for uncacheable entries.
+ if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 )
+ $this->mCacheTime = -1;
+ }
+
+ /**
+ * Returns the number of seconds after which this object should expire.
+ * This method is used by ParserCache to determine how long the ParserOutput can be cached.
+ * The timestamp of expiry can be calculated by adding getCacheExpiry() to getCacheTime().
+ * The value returned by getCacheExpiry is smaller or equal to the smallest number
+ * that was provided to a call of updateCacheExpiry(), and smaller or equal to the
+ * value of $wgParserCacheExpireTime.
+ */
+ function getCacheExpiry() {
+ global $wgParserCacheExpireTime;
+
+ if ( $this->mCacheTime < 0 ) return 0; // old-style marker for "not cachable"
+
+ $expire = $this->mCacheExpiry;
+
+ if ( $expire === null )
+ $expire = $wgParserCacheExpireTime;
+ else
+ $expire = min( $expire, $wgParserCacheExpireTime );
+
+ if( $this->containsOldMagic() ) { //compatibility hack
+ $expire = min( $expire, 3600 ); # 1 hour
+ }
+
+ if ( $expire <= 0 ) return 0; // not cachable
+ else return $expire;
+ }
+
+
+ function isCacheable() {
+ return $this->getCacheExpiry() > 0;
+ }
+
+ /**
+ * Return true if this cached output object predates the global or
+ * per-article cache invalidation timestamps, or if it comes from
+ * an incompatible older version.
+ *
+ * @param $touched String: the affected article's last touched timestamp
+ * @return Boolean
+ */
+ public function expired( $touched ) {
+ global $wgCacheEpoch;
+ return !$this->isCacheable() || // parser says it's uncacheable
+ $this->getCacheTime() < $touched ||
+ $this->getCacheTime() <= $wgCacheEpoch ||
+ $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
+ !isset( $this->mVersion ) ||
+ version_compare( $this->mVersion, Parser::VERSION, "lt" );
+ }
+}
+
+class ParserOutput extends CacheTime
{
var $mText, # The output text
$mLanguageLinks, # List of the full text of language links, in the order they appear
$mCategories, # Map of category names to sort keys
- $mContainsOldMagic, # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
$mTitleText, # title text of the chosen language variant
- $mCacheTime = '', # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
- $mVersion = Parser::VERSION, # Compatibility check
$mLinks = array(), # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken.
$mTemplates = array(), # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
$mTemplateIds = array(), # 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken.
$mImages = array(), # DB keys of the images used, in the array key only
$mExternalLinks = array(), # External link URLs, in the key only
+ $mInterwikiLinks = array(), # 2-D map of prefix/DBK (in keys only) for the inline interwiki links in the document.
$mNewSection = false, # Show a new section link?
$mHideNewSection = false, # Hide the new section link?
$mNoGallery = false, # No gallery on category page? (__NOGALLERY__)
$mHeadItems = array(), # Items to put in the <head> section
+ $mModules = array(), # Modules to be loaded by the resource loader
$mOutputHooks = array(), # Hook tags as per $wgParserOutputHooks
$mWarnings = array(), # Warning text to be returned to the user. Wikitext formatted, in the key only
$mSections = array(), # Table of contents
$mProperties = array(), # Name/value pairs to be cached in the DB
$mTOCHTML = ''; # HTML of the TOC
private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change.
+ private $mAccessedOptions = null; # List of ParserOptions (stored in the keys)
- function ParserOutput( $text = '', $languageLinks = array(), $categoryLinks = array(),
+ function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(),
$containsOldMagic = false, $titletext = '' )
{
$this->mText = $text;
@@ -40,9 +137,9 @@ class ParserOutput
function getText() { return $this->mText; }
function &getLanguageLinks() { return $this->mLanguageLinks; }
+ function getInterwikiLinks() { return $this->mInterwikiLinks; }
function getCategoryLinks() { return array_keys( $this->mCategories ); }
function &getCategories() { return $this->mCategories; }
- function getCacheTime() { return $this->mCacheTime; }
function getTitleText() { return $this->mTitleText; }
function getSections() { return $this->mSections; }
function &getLinks() { return $this->mLinks; }
@@ -51,18 +148,17 @@ class ParserOutput
function &getExternalLinks() { return $this->mExternalLinks; }
function getNoGallery() { return $this->mNoGallery; }
function getHeadItems() { return $this->mHeadItems; }
+ function getModules() { return $this->mModules; }
function getSubtitle() { return $this->mSubtitle; }
function getOutputHooks() { return (array)$this->mOutputHooks; }
function getWarnings() { return array_keys( $this->mWarnings ); }
function getIndexPolicy() { return $this->mIndexPolicy; }
function getTOCHTML() { return $this->mTOCHTML; }
- function containsOldMagic() { return $this->mContainsOldMagic; }
function setText( $text ) { return wfSetVar( $this->mText, $text ); }
function setLanguageLinks( $ll ) { return wfSetVar( $this->mLanguageLinks, $ll ); }
function setCategoryLinks( $cl ) { return wfSetVar( $this->mCategories, $cl ); }
- function setContainsOldMagic( $com ) { return wfSetVar( $this->mContainsOldMagic, $com ); }
- function setCacheTime( $t ) { return wfSetVar( $this->mCacheTime, $t ); }
+
function setTitleText( $t ) { return wfSetVar( $this->mTitleText, $t ); }
function setSections( $toc ) { return wfSetVar( $this->mSections, $toc ); }
function setIndexPolicy( $policy ) { return wfSetVar( $this->mIndexPolicy, $policy ); }
@@ -96,9 +192,16 @@ class ParserOutput
$this->mExternalLinks[$url] = 1;
}
+ /**
+ * Record a local or interwiki inline link for saving in future link tables.
+ *
+ * @param $title Title object
+ * @param $id Mixed: optional known page_id so we can skip the lookup
+ */
function addLink( $title, $id = null ) {
if ( $title->isExternal() ) {
// Don't record interwikis in pagelinks
+ $this->addInterwikiLink( $title );
return;
}
$ns = $title->getNamespace();
@@ -139,23 +242,20 @@ class ParserOutput
}
$this->mTemplateIds[$ns][$dbk] = $rev_id; // For versioning
}
-
+
/**
- * Return true if this cached output object predates the global or
- * per-article cache invalidation timestamps, or if it comes from
- * an incompatible older version.
- *
- * @param string $touched the affected article's last touched timestamp
- * @return bool
- * @public
+ * @param $title Title object, must be an interwiki link
+ * @throws MWException if given invalid input
*/
- function expired( $touched ) {
- global $wgCacheEpoch;
- return $this->getCacheTime() == -1 || // parser says it's uncacheable
- $this->getCacheTime() < $touched ||
- $this->getCacheTime() <= $wgCacheEpoch ||
- !isset( $this->mVersion ) ||
- version_compare( $this->mVersion, Parser::VERSION, "lt" );
+ function addInterwikiLink( $title ) {
+ $prefix = $title->getInterwiki();
+ if( $prefix == '' ) {
+ throw new MWException( 'Non-interwiki link passed, internal parser error.' );
+ }
+ if (!isset($this->mInterwikiLinks[$prefix])) {
+ $this->mInterwikiLinks[$prefix] = array();
+ }
+ $this->mInterwikiLinks[$prefix][$title->getDBkey()] = 1;
}
/**
@@ -170,22 +270,27 @@ class ParserOutput
$this->mHeadItems[] = $section;
}
}
+
+ function addModules( $modules ) {
+ $this->mModules = array_merge( $this->mModules, (array) $modules );
+ }
/**
* Override the title to be used for display
* -- this is assumed to have been validated
* (check equal normalisation, etc.)
*
- * @param string $text Desired title text
+ * @param $text String: desired title text
*/
public function setDisplayTitle( $text ) {
$this->setTitleText( $text );
+ $this->setProperty( 'displaytitle', $text );
}
/**
* Get the title to be used for display
*
- * @return string
+ * @return String
*/
public function getDisplayTitle() {
$t = $this->getTitleText( );
@@ -223,4 +328,25 @@ class ParserOutput
}
return $this->mProperties;
}
+
+
+ /**
+ * Returns the options from its ParserOptions which have been taken
+ * into account to produce this output or false if not available.
+ * @return mixed Array/false
+ */
+ public function getUsedOptions() {
+ if ( !isset( $this->mAccessedOptions ) ) {
+ return false;
+ }
+ return array_keys( $this->mAccessedOptions );
+ }
+
+ /**
+ * Callback passed by the Parser to the ParserOptions to keep track of which options are used.
+ * @access private
+ */
+ function recordOption( $option ) {
+ $this->mAccessedOptions[$option] = true;
+ }
}
diff --git a/includes/parser/Parser_DiffTest.php b/includes/parser/Parser_DiffTest.php
index 608c883a..c6dd76e5 100644
--- a/includes/parser/Parser_DiffTest.php
+++ b/includes/parser/Parser_DiffTest.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Fake parser that output the difference of two different parsers
+ *
+ * @file
+ */
/**
* @ingroup Parser
@@ -8,14 +13,13 @@ class Parser_DiffTest
var $parsers, $conf;
var $shortOutput = false;
- var $dfUniqPrefix;
+ var $dtUniqPrefix;
function __construct( $conf ) {
if ( !isset( $conf['parsers'] ) ) {
throw new MWException( __METHOD__ . ': no parsers specified' );
}
$this->conf = $conf;
- $this->dtUniqPrefix = "\x7fUNIQ" . Parser::getRandomString();
}
function init() {
@@ -102,14 +106,18 @@ class Parser_DiffTest
function setFunctionHook( $id, $callback, $flags = 0 ) {
$this->init();
- foreach ( $this->parsers as $i => $parser ) {
+ foreach ( $this->parsers as $parser ) {
$parser->setFunctionHook( $id, $callback, $flags );
}
}
function onClearState( &$parser ) {
// hack marker prefixes to get identical output
- $parser->mUniqPrefix = $this->dtUniqPrefix;
+ if ( !isset( $this->dtUniqPrefix ) ) {
+ $this->dtUniqPrefix = $parser->uniqPrefix();
+ } else {
+ $parser->mUniqPrefix = $this->dtUniqPrefix;
+ }
return true;
}
}
diff --git a/includes/parser/Parser_LinkHooks.php b/includes/parser/Parser_LinkHooks.php
index 2b306933..7c17ce4e 100644
--- a/includes/parser/Parser_LinkHooks.php
+++ b/includes/parser/Parser_LinkHooks.php
@@ -1,5 +1,11 @@
<?php
/**
+ * Modified version of the PHP parser with hooks for wiki links; experimental
+ *
+ * @file
+ */
+
+/**
* Parser with LinkHooks experiment
* @ingroup Parser
*/
@@ -78,9 +84,9 @@ class Parser_LinkHooks extends Parser
*
* @public
*
- * @param integer|string $ns The Namespace ID or regex pattern if SLH_PATTERN is set
- * @param mixed $callback The callback function (and object) to use
- * @param integer $flags a combination of the following flags:
+ * @param $ns Integer or String: the Namespace ID or regex pattern if SLH_PATTERN is set
+ * @param $callback Mixed: the callback function (and object) to use
+ * @param $flags Integer: a combination of the following flags:
* SLH_PATTERN Use a regex link pattern rather than a namespace
*
* @return The old callback function for this name, if any
@@ -111,8 +117,6 @@ class Parser_LinkHooks extends Parser
* @private
*/
function replaceInternalLinks2( &$s ) {
- global $wgContLang;
-
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__.'-setup' );
@@ -128,7 +132,6 @@ class Parser_LinkHooks extends Parser
$titleRegex = "/^([{$tc}]+)$/sD";
}
- $sk = $this->mOptions->getSkin();
$holders = new LinkHolderArray( $this );
if( is_null( $this->mTitle ) ) {
@@ -136,13 +139,7 @@ class Parser_LinkHooks extends Parser
wfProfileOut( __METHOD__.'-setup' );
throw new MWException( __METHOD__.": \$this->mTitle is null\n" );
}
- $nottalk = !$this->mTitle->isTalkPage();
-
- if($wgContLang->hasVariants()) {
- $selflink = $wgContLang->convertLinkToAllVariants($this->mTitle->getPrefixedText());
- } else {
- $selflink = array($this->mTitle->getPrefixedText());
- }
+
wfProfileOut( __METHOD__.'-setup' );
$offset = 0;
@@ -268,9 +265,10 @@ class Parser_LinkHooks extends Parser
if( $return === false ) {
# False (no link) was returned, output plain wikitext
# Build it again as the hook is allowed to modify $paramText
- return isset($paramText) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
+ $return = isset($paramText) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
}
# Content was returned, return it
+ wfProfileOut( __METHOD__ );
return $return;
}
diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php
index 9c417d23..c31f37bf 100644
--- a/includes/parser/Preprocessor.php
+++ b/includes/parser/Preprocessor.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Interfaces for preprocessors
+ *
+ * @file
+ */
/**
* @ingroup Parser
@@ -13,6 +18,9 @@ interface Preprocessor {
/** Create a new custom frame for programmatic use of parameter replacement as used in some extensions */
function newCustomFrame( $args );
+ /** Create a new custom node for programmatic use of parameter replacement as used in some extensions */
+ function newPartNodeArray( $values );
+
/** Preprocess text to a PPNode */
function preprocessToObj( $text, $flags = 0 );
}
diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php
index 673ac241..2b635f7c 100644
--- a/includes/parser/Preprocessor_DOM.php
+++ b/includes/parser/Preprocessor_DOM.php
@@ -1,5 +1,11 @@
<?php
-
+/**
+ * Preprocessor using PHP's dom extension
+ *
+ * @file
+ * @ingroup Parser
+ */
+
/**
* @ingroup Parser
*/
@@ -29,6 +35,30 @@ class Preprocessor_DOM implements Preprocessor {
return new PPCustomFrame_DOM( $this, $args );
}
+ function newPartNodeArray( $values ) {
+ //NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
+ $xml = "";
+ $xml .= "<list>";
+
+ foreach ( $values as $k => $val ) {
+
+ if ( is_int( $k ) ) {
+ $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) ."</value></part>";
+ } else {
+ $xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
+ }
+ }
+
+ $xml .= "</list>";
+
+ $dom = new DOMDocument();
+ $dom->loadXML( $xml );
+ $root = $dom->documentElement;
+
+ $node = new PPNode_DOM( $root->childNodes );
+ return $node;
+ }
+
function memCheck() {
if ( $this->memoryLimit === false ) {
return;
@@ -45,8 +75,8 @@ class Preprocessor_DOM implements Preprocessor {
* Preprocess some wikitext and return the document tree.
* This is the ghost of Parser::replace_variables().
*
- * @param string $text The text to parse
- * @param integer flags Bitwise combination of:
+ * @param $text String: the text to parse
+ * @param $flags Integer: bitwise combination of:
* Parser::PTD_FOR_INCLUSION Handle <noinclude>/<includeonly> as if the text is being
* included. Default is to assume a direct page view.
*
@@ -443,7 +473,7 @@ class Preprocessor_DOM implements Preprocessor {
$count = $piece->count;
$equalsLength = strspn( $revText, '=', strlen( $text ) - $searchStart );
if ( $equalsLength > 0 ) {
- if ( $i - $equalsLength == $piece->startPos ) {
+ if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
// Replicate the doHeadings behaviour /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
@@ -481,9 +511,7 @@ class Preprocessor_DOM implements Preprocessor {
// another heading. Infinite loops are avoided because the next iteration MUST
// hit the heading open case above, which unconditionally increments the
// input pointer.
- }
-
- elseif ( $found == 'open' ) {
+ } elseif ( $found == 'open' ) {
# count opening brace characters
$count = strspn( $text, $curChar, $i );
@@ -506,9 +534,7 @@ class Preprocessor_DOM implements Preprocessor {
$accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
}
$i += $count;
- }
-
- elseif ( $found == 'close' ) {
+ } elseif ( $found == 'close' ) {
$piece = $stack->top;
# lets check if there are enough characters for closing brace
$maxCount = $piece->count;
@@ -516,7 +542,6 @@ class Preprocessor_DOM implements Preprocessor {
# check for maximum matching characters (if there are 5 closing
# characters, we will probably need only 3 - depending on the rules)
- $matchingCount = 0;
$rule = $rules[$piece->open];
if ( $count > $rule['max'] ) {
# The specified maximum exists in the callback array, unless the caller
@@ -561,7 +586,7 @@ class Preprocessor_DOM implements Preprocessor {
$element = "<$name$attr>";
$element .= "<title>$title</title>";
$argIndex = 1;
- foreach ( $parts as $partIndex => $part ) {
+ foreach ( $parts as $part ) {
if ( isset( $part->eqpos ) ) {
$argName = substr( $part->out, 0, $part->eqpos );
$argValue = substr( $part->out, $part->eqpos + 1 );
@@ -822,7 +847,7 @@ class PPFrame_DOM implements PPFrame {
/**
* Construct a new preprocessor frame.
- * @param Preprocessor $preprocessor The parent preprocessor
+ * @param $preprocessor Preprocessor: The parent preprocessor
*/
function __construct( $preprocessor ) {
$this->preprocessor = $preprocessor;
@@ -877,12 +902,12 @@ class PPFrame_DOM implements PPFrame {
return $root;
}
- if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->mMaxPPNodeCount )
+ if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() )
{
return '<span class="error">Node-count limit exceeded</span>';
}
- if ( $expansionDepth > $this->parser->mOptions->mMaxPPExpandDepth ) {
+ if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
return '<span class="error">Expansion depth limit exceeded</span>';
}
wfProfileIn( __METHOD__ );
@@ -932,7 +957,9 @@ class PPFrame_DOM implements PPFrame {
$iteratorStack[$level] = false;
}
- if ( $contextNode instanceof PPNode_DOM ) $contextNode = $contextNode->node;
+ if ( $contextNode instanceof PPNode_DOM ) {
+ $contextNode = $contextNode->node;
+ }
$newIterator = false;
@@ -951,7 +978,7 @@ class PPFrame_DOM implements PPFrame {
$titles = $xpath->query( 'title', $contextNode );
$title = $titles->item( 0 );
$parts = $xpath->query( 'part', $contextNode );
- if ( $flags & self::NO_TEMPLATES ) {
+ if ( $flags & PPFrame::NO_TEMPLATES ) {
$newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $title, $parts );
} else {
$lineStart = $contextNode->getAttribute( 'lineStart' );
@@ -972,7 +999,7 @@ class PPFrame_DOM implements PPFrame {
$titles = $xpath->query( 'title', $contextNode );
$title = $titles->item( 0 );
$parts = $xpath->query( 'part', $contextNode );
- if ( $flags & self::NO_ARGS ) {
+ if ( $flags & PPFrame::NO_ARGS ) {
$newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $title, $parts );
} else {
$params = array(
@@ -990,13 +1017,13 @@ class PPFrame_DOM implements PPFrame {
# Remove it in HTML, pre+remove and STRIP_COMMENTS modes
if ( $this->parser->ot['html']
|| ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
- || ( $flags & self::STRIP_COMMENTS ) )
+ || ( $flags & PPFrame::STRIP_COMMENTS ) )
{
$out .= '';
}
# Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
# Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && ! ( $flags & self::RECOVER_COMMENTS ) ) {
+ elseif ( $this->parser->ot['wiki'] && ! ( $flags & PPFrame::RECOVER_COMMENTS ) ) {
$out .= $this->parser->insertStripItem( $contextNode->textContent );
}
# Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1008,7 +1035,7 @@ class PPFrame_DOM implements PPFrame {
# OT_WIKI will only respect <ignore> in substed templates.
# The other output types respect it unless NO_IGNORE is set.
# extractSections() sets NO_IGNORE and so never respects it.
- if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & self::NO_IGNORE ) ) {
+ if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
$out .= $contextNode->textContent;
} else {
$out .= '';
@@ -1112,7 +1139,9 @@ class PPFrame_DOM implements PPFrame {
$first = true;
$s = '';
foreach ( $args as $root ) {
- if ( $root instanceof PPNode_DOM ) $root = $root->node;
+ if ( $root instanceof PPNode_DOM ) {
+ $root = $root->node;
+ }
if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
$root = array( $root );
}
@@ -1136,9 +1165,11 @@ class PPFrame_DOM implements PPFrame {
$args = array_slice( func_get_args(), 1 );
$out = array();
$first = true;
- if ( $root instanceof PPNode_DOM ) $root = $root->node;
foreach ( $args as $root ) {
+ if ( $root instanceof PPNode_DOM ) {
+ $root = $root->node;
+ }
if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
$root = array( $root );
}
@@ -1163,7 +1194,9 @@ class PPFrame_DOM implements PPFrame {
$first = true;
foreach ( $args as $root ) {
- if ( $root instanceof PPNode_DOM ) $root = $root->node;
+ if ( $root instanceof PPNode_DOM ) {
+ $root = $root->node;
+ }
if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
$root = array( $root );
}
@@ -1239,7 +1272,8 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
var $numberedExpansionCache, $namedExpansionCache;
function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
- PPFrame_DOM::__construct( $preprocessor );
+ parent::__construct( $preprocessor );
+
$this->parent = $parent;
$this->numberedArgs = $numberedArgs;
$this->namedArgs = $namedArgs;
@@ -1310,7 +1344,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
}
if ( !isset( $this->numberedExpansionCache[$index] ) ) {
# No trimming for unnamed arguments
- $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], self::STRIP_COMMENTS );
+ $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
}
return $this->numberedExpansionCache[$index];
}
@@ -1322,7 +1356,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
if ( !isset( $this->namedExpansionCache[$name] ) ) {
# Trim named arguments post-expand, for backwards compatibility
$this->namedExpansionCache[$name] = trim(
- $this->parent->expand( $this->namedArgs[$name], self::STRIP_COMMENTS ) );
+ $this->parent->expand( $this->namedArgs[$name], PPFrame::STRIP_COMMENTS ) );
}
return $this->namedExpansionCache[$name];
}
@@ -1351,7 +1385,7 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
var $args;
function __construct( $preprocessor, $args ) {
- PPFrame_DOM::__construct( $preprocessor );
+ parent::__construct( $preprocessor );
$this->args = $args;
}
diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php
index c5d69685..6cb2febc 100644
--- a/includes/parser/Preprocessor_Hash.php
+++ b/includes/parser/Preprocessor_Hash.php
@@ -1,5 +1,11 @@
<?php
-
+/**
+ * Preprocessor using PHP arrays
+ *
+ * @file
+ * @ingroup Parser
+ */
+
/**
* Differences from DOM schema:
* * attribute nodes are children
@@ -23,12 +29,39 @@ class Preprocessor_Hash implements Preprocessor {
return new PPCustomFrame_Hash( $this, $args );
}
+ function newPartNodeArray( $values ) {
+ $list = array();
+
+ foreach ( $values as $k => $val ) {
+ $partNode = new PPNode_Hash_Tree( 'part' );
+ $nameNode = new PPNode_Hash_Tree( 'name' );
+
+ if ( is_int( $k ) ) {
+ $nameNode->addChild( new PPNode_Hash_Attr( 'index', $k ) );
+ $partNode->addChild( $nameNode );
+ } else {
+ $nameNode->addChild( new PPNode_Hash_Text( $k ) );
+ $partNode->addChild( $nameNode );
+ $partNode->addChild( new PPNode_Hash_Text( '=' ) );
+ }
+
+ $valueNode = new PPNode_Hash_Tree( 'value' );
+ $valueNode->addChild( new PPNode_Hash_Text( $val ) );
+ $partNode->addChild( $valueNode );
+
+ $list[] = $partNode;
+ }
+
+ $node = new PPNode_Hash_Array( $list );
+ return $node;
+ }
+
/**
* Preprocess some wikitext and return the document tree.
* This is the ghost of Parser::replace_variables().
*
- * @param string $text The text to parse
- * @param integer flags Bitwise combination of:
+ * @param $text String: the text to parse
+ * @param $flags Integer: bitwise combination of:
* Parser::PTD_FOR_INCLUSION Handle <noinclude>/<includeonly> as if the text is being
* included. Default is to assume a direct page view.
*
@@ -401,7 +434,7 @@ class Preprocessor_Hash implements Preprocessor {
$count = $piece->count;
$equalsLength = strspn( $revText, '=', strlen( $text ) - $searchStart );
if ( $equalsLength > 0 ) {
- if ( $i - $equalsLength == $piece->startPos ) {
+ if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
// Replicate the doHeadings behaviour /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
@@ -479,7 +512,6 @@ class Preprocessor_Hash implements Preprocessor {
# check for maximum matching characters (if there are 5 closing
# characters, we will probably need only 3 - depending on the rules)
- $matchingCount = 0;
$rule = $rules[$piece->open];
if ( $count > $rule['max'] ) {
# The specified maximum exists in the callback array, unless the caller
@@ -526,7 +558,7 @@ class Preprocessor_Hash implements Preprocessor {
$titleNode->lastChild = $titleAccum->lastNode;
$element->addChild( $titleNode );
$argIndex = 1;
- foreach ( $parts as $partIndex => $part ) {
+ foreach ( $parts as $part ) {
if ( isset( $part->eqpos ) ) {
// Find equals
$lastNode = false;
@@ -647,7 +679,7 @@ class Preprocessor_Hash implements Preprocessor {
// Cache
if ($cacheable) {
- $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );;
+ $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
$wgMemc->set( $cacheKey, $cacheValue, 86400 );
wfProfileOut( __METHOD__.'-cache-miss' );
wfProfileOut( __METHOD__.'-cacheable' );
@@ -804,7 +836,7 @@ class PPFrame_Hash implements PPFrame {
/**
* Construct a new preprocessor frame.
- * @param Preprocessor $preprocessor The parent preprocessor
+ * @param $preprocessor Preprocessor: the parent preprocessor
*/
function __construct( $preprocessor ) {
$this->preprocessor = $preprocessor;
@@ -826,7 +858,6 @@ class PPFrame_Hash implements PPFrame {
$title = $this->title;
}
if ( $args !== false ) {
- $xpath = false;
if ( $args instanceof PPNode_Hash_Array ) {
$args = $args->value;
} elseif ( !is_array( $args ) ) {
@@ -855,11 +886,11 @@ class PPFrame_Hash implements PPFrame {
return $root;
}
- if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->mMaxPPNodeCount )
+ if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() )
{
return '<span class="error">Node-count limit exceeded</span>';
}
- if ( $expansionDepth > $this->parser->mOptions->mMaxPPExpandDepth ) {
+ if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
return '<span class="error">Expansion depth limit exceeded</span>';
}
++$expansionDepth;
@@ -915,7 +946,7 @@ class PPFrame_Hash implements PPFrame {
if ( $contextNode->name == 'template' ) {
# Double-brace expansion
$bits = $contextNode->splitTemplate();
- if ( $flags & self::NO_TEMPLATES ) {
+ if ( $flags & PPFrame::NO_TEMPLATES ) {
$newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $bits['title'], $bits['parts'] );
} else {
$ret = $this->parser->braceSubstitution( $bits, $this );
@@ -928,7 +959,7 @@ class PPFrame_Hash implements PPFrame {
} elseif ( $contextNode->name == 'tplarg' ) {
# Triple-brace expansion
$bits = $contextNode->splitTemplate();
- if ( $flags & self::NO_ARGS ) {
+ if ( $flags & PPFrame::NO_ARGS ) {
$newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $bits['title'], $bits['parts'] );
} else {
$ret = $this->parser->argSubstitution( $bits, $this );
@@ -943,13 +974,13 @@ class PPFrame_Hash implements PPFrame {
# Remove it in HTML, pre+remove and STRIP_COMMENTS modes
if ( $this->parser->ot['html']
|| ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
- || ( $flags & self::STRIP_COMMENTS ) )
+ || ( $flags & PPFrame::STRIP_COMMENTS ) )
{
$out .= '';
}
# Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
# Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && ! ( $flags & self::RECOVER_COMMENTS ) ) {
+ elseif ( $this->parser->ot['wiki'] && ! ( $flags & PPFrame::RECOVER_COMMENTS ) ) {
$out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
}
# Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -961,7 +992,7 @@ class PPFrame_Hash implements PPFrame {
# OT_WIKI will only respect <ignore> in substed templates.
# The other output types respect it unless NO_IGNORE is set.
# extractSections() sets NO_IGNORE and so never respects it.
- if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & self::NO_IGNORE ) ) {
+ if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
$out .= $contextNode->firstChild->value;
} else {
//$out .= '';
@@ -1186,7 +1217,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
var $numberedExpansionCache, $namedExpansionCache;
function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
- PPFrame_Hash::__construct( $preprocessor );
+ parent::__construct( $preprocessor );
+
$this->parent = $parent;
$this->numberedArgs = $numberedArgs;
$this->namedArgs = $namedArgs;
@@ -1257,7 +1289,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
}
if ( !isset( $this->numberedExpansionCache[$index] ) ) {
# No trimming for unnamed arguments
- $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], self::STRIP_COMMENTS );
+ $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
}
return $this->numberedExpansionCache[$index];
}
@@ -1269,7 +1301,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
if ( !isset( $this->namedExpansionCache[$name] ) ) {
# Trim named arguments post-expand, for backwards compatibility
$this->namedExpansionCache[$name] = trim(
- $this->parent->expand( $this->namedArgs[$name], self::STRIP_COMMENTS ) );
+ $this->parent->expand( $this->namedArgs[$name], PPFrame::STRIP_COMMENTS ) );
}
return $this->namedExpansionCache[$name];
}
@@ -1298,7 +1330,7 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
var $args;
function __construct( $preprocessor, $args ) {
- PPFrame_Hash::__construct( $preprocessor );
+ parent::__construct( $preprocessor );
$this->args = $args;
}
diff --git a/includes/parser/Tidy.php b/includes/parser/Tidy.php
index 95f83621..38f22fd8 100644
--- a/includes/parser/Tidy.php
+++ b/includes/parser/Tidy.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * HTML validation and correction
+ *
+ * @file
+ */
/**
* Class to interact with HTML tidy
@@ -16,8 +21,8 @@ class MWTidy {
* If tidy isn't able to correct the markup, the original will be
* returned in all its glory with a warning comment appended.
*
- * @param string $text Hideous HTML input
- * @return string Corrected HTML output
+ * @param $text String: hideous HTML input
+ * @return String: corrected HTML output
*/
public static function tidy( $text ) {
global $wgTidyInternal;
@@ -26,9 +31,6 @@ class MWTidy {
' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>'.
'<head><title>test</title></head><body>'.$text.'</body></html>';
- # Tidy is known to clobber tabs; convert them to entities
- $wrappedtext = str_replace( "\t", '&#9;', $wrappedtext );
-
if( $wgTidyInternal ) {
$correctedtext = self::execInternalTidy( $wrappedtext );
} else {
@@ -39,9 +41,6 @@ class MWTidy {
return $text . "\n<!-- Tidy found serious XHTML errors -->\n";
}
- # Convert the tabs back from entities
- $correctedtext = str_replace( '&#9;', "\t", $correctedtext );
-
return $correctedtext;
}
@@ -71,7 +70,7 @@ class MWTidy {
* @param $text String: HTML to check
* @param $stderr Boolean: Whether to read from STDERR rather than STDOUT
* @param &$retval Exit code (-1 on internal error)
- * @retrun mixed String or null
+ * @return mixed String or null
*/
private static function execExternalTidy( $text, $stderr = false, &$retval = null ) {
global $wgTidyConf, $wgTidyBin, $wgTidyOpts;
@@ -119,15 +118,13 @@ class MWTidy {
$retval = -1;
}
- wfProfileOut( __METHOD__ );
-
if( !$stderr && $cleansource == '' && $text != '' ) {
// Some kind of error happened, so we couldn't get the corrected text.
// Just give up; we'll use the source text and append a warning.
- return null;
- } else {
- return $cleansource;
+ $cleansource = null;
}
+ wfProfileOut( __METHOD__ );
+ return $cleansource;
}
/**
@@ -137,7 +134,7 @@ class MWTidy {
* 'pear install tidy' should be able to compile the extension module.
*/
private static function execInternalTidy( $text, $stderr = false, &$retval = null ) {
- global $wgTidyConf, $IP, $wgDebugTidy;
+ global $wgTidyConf, $wgDebugTidy;
wfProfileIn( __METHOD__ );
$tidy = new tidy;
@@ -145,6 +142,7 @@ class MWTidy {
if( $stderr ) {
$retval = $tidy->getStatus();
+ wfProfileOut( __METHOD__ );
return $tidy->errorBuffer;
} else {
$tidy->cleanRepair();
diff --git a/includes/proxy_check.php b/includes/proxy_check.php
index 61995fea..2bc46c0d 100644
--- a/includes/proxy_check.php
+++ b/includes/proxy_check.php
@@ -1,6 +1,8 @@
<?php
/**
* Command line script to check for an open proxy at a specified location
+ *
+ * @file
*/
if( php_sapi_name() != 'cli' ) {
diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php
new file mode 100644
index 00000000..c18022a4
--- /dev/null
+++ b/includes/resourceloader/ResourceLoader.php
@@ -0,0 +1,740 @@
+<?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
+ * @author Roan Kattouw
+ * @author Trevor Parscal
+ */
+
+/**
+ * Dynamic JavaScript and CSS resource loading system.
+ *
+ * Most of the documention is on the MediaWiki documentation wiki starting at:
+ * http://www.mediawiki.org/wiki/ResourceLoader
+ */
+class ResourceLoader {
+
+ /* Protected Static Members */
+ protected static $filterCacheVersion = 2;
+
+ /** Array: List of module name/ResourceLoaderModule object pairs */
+ protected $modules = array();
+ /** Associative array mapping module name to info associative array */
+ protected $moduleInfos = array();
+
+ /* Protected Methods */
+
+ /**
+ * Loads information stored in the database about modules.
+ *
+ * This method grabs modules dependencies from the database and updates modules
+ * objects.
+ *
+ * This is not inside the module code because it is much faster to
+ * request all of the information at once than it is to have each module
+ * requests its own information. This sacrifice of modularity yields a substantial
+ * performance improvement.
+ *
+ * @param $modules Array: List of module names to preload information for
+ * @param $context ResourceLoaderContext: Context to load the information within
+ */
+ public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
+ if ( !count( $modules ) ) {
+ return; // or else Database*::select() will explode, plus it's cheaper!
+ }
+ $dbr = wfGetDB( DB_SLAVE );
+ $skin = $context->getSkin();
+ $lang = $context->getLanguage();
+
+ // Get file dependency information
+ $res = $dbr->select( 'module_deps', array( 'md_module', 'md_deps' ), array(
+ 'md_module' => $modules,
+ 'md_skin' => $context->getSkin()
+ ), __METHOD__
+ );
+
+ // Set modules' dependencies
+ $modulesWithDeps = array();
+ foreach ( $res as $row ) {
+ $this->getModule( $row->md_module )->setFileDependencies( $skin,
+ FormatJson::decode( $row->md_deps, true )
+ );
+ $modulesWithDeps[] = $row->md_module;
+ }
+
+ // Register the absence of a dependency row too
+ foreach ( array_diff( $modules, $modulesWithDeps ) as $name ) {
+ $this->getModule( $name )->setFileDependencies( $skin, array() );
+ }
+
+ // Get message blob mtimes. Only do this for modules with messages
+ $modulesWithMessages = array();
+ foreach ( $modules as $name ) {
+ if ( count( $this->getModule( $name )->getMessages() ) ) {
+ $modulesWithMessages[] = $name;
+ }
+ }
+ $modulesWithoutMessages = array_flip( $modules ); // Will be trimmed down by the loop below
+ if ( count( $modulesWithMessages ) ) {
+ $res = $dbr->select( 'msg_resource', array( 'mr_resource', 'mr_timestamp' ), array(
+ 'mr_resource' => $modulesWithMessages,
+ 'mr_lang' => $lang
+ ), __METHOD__
+ );
+ foreach ( $res as $row ) {
+ $this->getModule( $row->mr_resource )->setMsgBlobMtime( $lang, $row->mr_timestamp );
+ unset( $modulesWithoutMessages[$row->mr_resource] );
+ }
+ }
+ foreach ( array_keys( $modulesWithoutMessages ) as $name ) {
+ $this->getModule( $name )->setMsgBlobMtime( $lang, 0 );
+ }
+ }
+
+ /**
+ * Runs JavaScript or CSS data through a filter, caching the filtered result for future calls.
+ *
+ * Available filters are:
+ * - minify-js \see JavaScriptMinifier::minify
+ * - minify-css \see CSSMin::minify
+ *
+ * If $data is empty, only contains whitespace or the filter was unknown,
+ * $data is returned unmodified.
+ *
+ * @param $filter String: Name of filter to run
+ * @param $data String: Text to filter, such as JavaScript or CSS text
+ * @return String: Filtered data, or a comment containing an error message
+ */
+ protected function filter( $filter, $data ) {
+ global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
+ wfProfileIn( __METHOD__ );
+
+ // For empty/whitespace-only data or for unknown filters, don't perform
+ // any caching or processing
+ if ( trim( $data ) === ''
+ || !in_array( $filter, array( 'minify-js', 'minify-css' ) ) )
+ {
+ wfProfileOut( __METHOD__ );
+ return $data;
+ }
+
+ // Try for cache hit
+ // Use CACHE_ANYTHING since filtering is very slow compared to DB queries
+ $key = wfMemcKey( 'resourceloader', 'filter', $filter, md5( $data ) );
+ $cache = wfGetCache( CACHE_ANYTHING );
+ $cacheEntry = $cache->get( $key );
+ if ( is_string( $cacheEntry ) ) {
+ wfProfileOut( __METHOD__ );
+ return $cacheEntry;
+ }
+
+ // Run the filter - we've already verified one of these will work
+ try {
+ switch ( $filter ) {
+ case 'minify-js':
+ $result = JavaScriptMinifier::minify( $data,
+ $wgResourceLoaderMinifierStatementsOnOwnLine,
+ $wgResourceLoaderMinifierMaxLineLength
+ );
+ break;
+ case 'minify-css':
+ $result = CSSMin::minify( $data );
+ break;
+ }
+
+ // Save filtered text to Memcached
+ $cache->set( $key, $result );
+ } catch ( Exception $exception ) {
+ // Return exception as a comment
+ $result = "/*\n{$exception->__toString()}\n*/\n";
+ }
+
+ wfProfileOut( __METHOD__ );
+
+ return $result;
+ }
+
+ /* Methods */
+
+ /**
+ * Registers core modules and runs registration hooks.
+ */
+ public function __construct() {
+ global $IP, $wgResourceModules;
+
+ wfProfileIn( __METHOD__ );
+
+ // Register core modules
+ $this->register( include( "$IP/resources/Resources.php" ) );
+ // Register extension modules
+ wfRunHooks( 'ResourceLoaderRegisterModules', array( &$this ) );
+ $this->register( $wgResourceModules );
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Registers a module with the ResourceLoader system.
+ *
+ * @param $name Mixed: Name of module as a string or List of name/object pairs as an array
+ * @param $info Module info array. For backwards compatibility with 1.17alpha,
+ * this may also be a ResourceLoaderModule object. Optional when using
+ * multiple-registration calling style.
+ * @throws MWException: If a duplicate module registration is attempted
+ * @throws MWException: If a module name contains illegal characters (pipes or commas)
+ * @throws MWException: If something other than a ResourceLoaderModule is being registered
+ * @return Boolean: False if there were any errors, in which case one or more modules were not
+ * registered
+ */
+ public function register( $name, $info = null ) {
+ wfProfileIn( __METHOD__ );
+
+ // Allow multiple modules to be registered in one call
+ if ( is_array( $name ) ) {
+ foreach ( $name as $key => $value ) {
+ $this->register( $key, $value );
+ }
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ // Disallow duplicate registrations
+ if ( isset( $this->moduleInfos[$name] ) ) {
+ // A module has already been registered by this name
+ throw new MWException(
+ 'ResourceLoader duplicate registration error. ' .
+ 'Another module has already been registered as ' . $name
+ );
+ }
+
+ // Check $name for illegal characters
+ if ( preg_match( '/[|,]/', $name ) ) {
+ throw new MWException( "ResourceLoader module name '$name' is invalid. Names may not contain pipes (|) or commas (,)" );
+ }
+
+ // Attach module
+ if ( is_object( $info ) ) {
+ // Old calling convention
+ // Validate the input
+ if ( !( $info instanceof ResourceLoaderModule ) ) {
+ throw new MWException( 'ResourceLoader invalid module error. ' .
+ 'Instances of ResourceLoaderModule expected.' );
+ }
+
+ $this->moduleInfos[$name] = array( 'object' => $info );
+ $info->setName( $name );
+ $this->modules[$name] = $info;
+ } else {
+ // New calling convention
+ $this->moduleInfos[$name] = $info;
+ }
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Get a list of module names
+ *
+ * @return Array: List of module names
+ */
+ public function getModuleNames() {
+ return array_keys( $this->moduleInfos );
+ }
+
+ /**
+ * Get the ResourceLoaderModule object for a given module name.
+ *
+ * @param $name String: Module name
+ * @return Mixed: ResourceLoaderModule if module has been registered, null otherwise
+ */
+ public function getModule( $name ) {
+ if ( !isset( $this->modules[$name] ) ) {
+ if ( !isset( $this->moduleInfos[$name] ) ) {
+ // No such module
+ return null;
+ }
+ // Construct the requested object
+ $info = $this->moduleInfos[$name];
+ if ( isset( $info['object'] ) ) {
+ // Object given in info array
+ $object = $info['object'];
+ } else {
+ if ( !isset( $info['class'] ) ) {
+ $class = 'ResourceLoaderFileModule';
+ } else {
+ $class = $info['class'];
+ }
+ $object = new $class( $info );
+ }
+ $object->setName( $name );
+ $this->modules[$name] = $object;
+ }
+
+ return $this->modules[$name];
+ }
+
+ /**
+ * Outputs a response to a resource load-request, including a content-type header.
+ *
+ * @param $context ResourceLoaderContext: Context in which a response should be formed
+ */
+ public function respond( ResourceLoaderContext $context ) {
+ global $wgResourceLoaderMaxage, $wgCacheEpoch;
+
+ // Buffer output to catch warnings. Normally we'd use ob_clean() on the
+ // top-level output buffer to clear warnings, but that breaks when ob_gzhandler
+ // is used: ob_clean() will clear the GZIP header in that case and it won't come
+ // back for subsequent output, resulting in invalid GZIP. So we have to wrap
+ // the whole thing in our own output buffer to be sure the active buffer
+ // doesn't use ob_gzhandler.
+ // See http://bugs.php.net/bug.php?id=36514
+ ob_start();
+
+ wfProfileIn( __METHOD__ );
+ $exceptions = '';
+
+ // Split requested modules into two groups, modules and missing
+ $modules = array();
+ $missing = array();
+ foreach ( $context->getModules() as $name ) {
+ if ( isset( $this->moduleInfos[$name] ) ) {
+ $modules[$name] = $this->getModule( $name );
+ } else {
+ $missing[] = $name;
+ }
+ }
+
+ // If a version wasn't specified we need a shorter expiry time for updates
+ // to propagate to clients quickly
+ if ( is_null( $context->getVersion() ) ) {
+ $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
+ $smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
+ }
+ // If a version was specified we can use a longer expiry time since changing
+ // version numbers causes cache misses
+ else {
+ $maxage = $wgResourceLoaderMaxage['versioned']['client'];
+ $smaxage = $wgResourceLoaderMaxage['versioned']['server'];
+ }
+
+ // Preload information needed to the mtime calculation below
+ try {
+ $this->preloadModuleInfo( array_keys( $modules ), $context );
+ } catch( Exception $e ) {
+ // Add exception to the output as a comment
+ $exceptions .= "/*\n{$e->__toString()}\n*/\n";
+ }
+
+ wfProfileIn( __METHOD__.'-getModifiedTime' );
+
+ $private = false;
+ // To send Last-Modified and support If-Modified-Since, we need to detect
+ // the last modified time
+ $mtime = wfTimestamp( TS_UNIX, $wgCacheEpoch );
+ foreach ( $modules as $module ) {
+ try {
+ // Bypass Squid and other shared caches if the request includes any private modules
+ if ( $module->getGroup() === 'private' ) {
+ $private = true;
+ }
+ // Calculate maximum modified time
+ $mtime = max( $mtime, $module->getModifiedTime( $context ) );
+ } catch ( Exception $e ) {
+ // Add exception to the output as a comment
+ $exceptions .= "/*\n{$e->__toString()}\n*/\n";
+ }
+ }
+
+ wfProfileOut( __METHOD__.'-getModifiedTime' );
+
+ if ( $context->getOnly() === 'styles' ) {
+ header( 'Content-Type: text/css; charset=utf-8' );
+ } else {
+ header( 'Content-Type: text/javascript; charset=utf-8' );
+ }
+ header( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $mtime ) );
+ if ( $context->getDebug() ) {
+ // Do not cache debug responses
+ header( 'Cache-Control: private, no-cache, must-revalidate' );
+ header( 'Pragma: no-cache' );
+ } else {
+ if ( $private ) {
+ header( "Cache-Control: private, max-age=$maxage" );
+ $exp = $maxage;
+ } else {
+ header( "Cache-Control: public, max-age=$maxage, s-maxage=$smaxage" );
+ $exp = min( $maxage, $smaxage );
+ }
+ header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) );
+ }
+
+ // If there's an If-Modified-Since header, respond with a 304 appropriately
+ // Some clients send "timestamp;length=123". Strip the part after the first ';'
+ // so we get a valid timestamp.
+ $ims = $context->getRequest()->getHeader( 'If-Modified-Since' );
+ if ( $ims !== false ) {
+ $imsTS = strtok( $ims, ';' );
+ if ( $mtime <= wfTimestamp( TS_UNIX, $imsTS ) ) {
+ // There's another bug in ob_gzhandler (see also the comment at
+ // the top of this function) that causes it to gzip even empty
+ // responses, meaning it's impossible to produce a truly empty
+ // response (because the gzip header is always there). This is
+ // a problem because 304 responses have to be completely empty
+ // per the HTTP spec, and Firefox behaves buggily when they're not.
+ // See also http://bugs.php.net/bug.php?id=51579
+ // To work around this, we tear down all output buffering before
+ // sending the 304.
+ // On some setups, ob_get_level() doesn't seem to go down to zero
+ // no matter how often we call ob_get_clean(), so instead of doing
+ // the more intuitive while ( ob_get_level() > 0 ) ob_get_clean();
+ // we have to be safe here and avoid an infinite loop.
+ for ( $i = 0; $i < ob_get_level(); $i++ ) {
+ ob_end_clean();
+ }
+
+ header( 'HTTP/1.0 304 Not Modified' );
+ header( 'Status: 304 Not Modified' );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+ }
+
+ // Generate a response
+ $response = $this->makeModuleResponse( $context, $modules, $missing );
+
+ // Prepend comments indicating exceptions
+ $response = $exceptions . $response;
+
+ // Capture any PHP warnings from the output buffer and append them to the
+ // response in a comment if we're in debug mode.
+ if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
+ $response = "/*\n$warnings\n*/\n" . $response;
+ }
+
+ // Remove the output buffer and output the response
+ ob_end_clean();
+ echo $response;
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Generates code for a response
+ *
+ * @param $context ResourceLoaderContext: Context in which to generate a response
+ * @param $modules Array: List of module objects keyed by module name
+ * @param $missing Array: List of unavailable modules (optional)
+ * @return String: Response data
+ */
+ public function makeModuleResponse( ResourceLoaderContext $context,
+ array $modules, $missing = array() )
+ {
+ $out = '';
+ $exceptions = '';
+ if ( $modules === array() && $missing === array() ) {
+ return '/* No modules requested. Max made me put this here */';
+ }
+
+ wfProfileIn( __METHOD__ );
+ // Pre-fetch blobs
+ if ( $context->shouldIncludeMessages() ) {
+ try {
+ $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
+ } catch ( Exception $e ) {
+ // Add exception to the output as a comment
+ $exceptions .= "/*\n{$e->__toString()}\n*/\n";
+ }
+ } else {
+ $blobs = array();
+ }
+
+ // Generate output
+ foreach ( $modules as $name => $module ) {
+ wfProfileIn( __METHOD__ . '-' . $name );
+ try {
+ // Scripts
+ $scripts = '';
+ if ( $context->shouldIncludeScripts() ) {
+ // bug 27054: Append semicolon to prevent weird bugs
+ // caused by files not terminating their statements right
+ $scripts .= $module->getScript( $context ) . ";\n";
+ }
+
+ // Styles
+ $styles = array();
+ if ( $context->shouldIncludeStyles() ) {
+ $styles = $module->getStyles( $context );
+ }
+
+ // Messages
+ $messagesBlob = isset( $blobs[$name] ) ? $blobs[$name] : '{}';
+
+ // Append output
+ switch ( $context->getOnly() ) {
+ case 'scripts':
+ $out .= $scripts;
+ break;
+ case 'styles':
+ $out .= self::makeCombinedStyles( $styles );
+ break;
+ case 'messages':
+ $out .= self::makeMessageSetScript( new XmlJsCode( $messagesBlob ) );
+ break;
+ default:
+ // Minify CSS before embedding in mediaWiki.loader.implement call
+ // (unless in debug mode)
+ if ( !$context->getDebug() ) {
+ foreach ( $styles as $media => $style ) {
+ $styles[$media] = $this->filter( 'minify-css', $style );
+ }
+ }
+ $out .= self::makeLoaderImplementScript( $name, $scripts, $styles,
+ new XmlJsCode( $messagesBlob ) );
+ break;
+ }
+ } catch ( Exception $e ) {
+ // Add exception to the output as a comment
+ $exceptions .= "/*\n{$e->__toString()}\n*/\n";
+
+ // Register module as missing
+ $missing[] = $name;
+ unset( $modules[$name] );
+ }
+ wfProfileOut( __METHOD__ . '-' . $name );
+ }
+
+ // Update module states
+ if ( $context->shouldIncludeScripts() ) {
+ // Set the state of modules loaded as only scripts to ready
+ if ( count( $modules ) && $context->getOnly() === 'scripts'
+ && !isset( $modules['startup'] ) )
+ {
+ $out .= self::makeLoaderStateScript(
+ array_fill_keys( array_keys( $modules ), 'ready' ) );
+ }
+ // Set the state of modules which were requested but unavailable as missing
+ if ( is_array( $missing ) && count( $missing ) ) {
+ $out .= self::makeLoaderStateScript( array_fill_keys( $missing, 'missing' ) );
+ }
+ }
+
+ if ( !$context->getDebug() ) {
+ if ( $context->getOnly() === 'styles' ) {
+ $out = $this->filter( 'minify-css', $out );
+ } else {
+ $out = $this->filter( 'minify-js', $out );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $exceptions . $out;
+ }
+
+ /* Static Methods */
+
+ /**
+ * Returns JS code to call to mediaWiki.loader.implement for a module with
+ * given properties.
+ *
+ * @param $name Module name
+ * @param $scripts Array: List of JavaScript code snippets to be executed after the
+ * module is loaded
+ * @param $styles Array: List of CSS strings keyed by media type
+ * @param $messages Mixed: List of messages associated with this module. May either be an
+ * associative array mapping message key to value, or a JSON-encoded message blob containing
+ * the same data, wrapped in an XmlJsCode object.
+ */
+ public static function makeLoaderImplementScript( $name, $scripts, $styles, $messages ) {
+ if ( is_array( $scripts ) ) {
+ $scripts = implode( $scripts, "\n" );
+ }
+ return Xml::encodeJsCall(
+ 'mediaWiki.loader.implement',
+ array(
+ $name,
+ new XmlJsCode( "function( $, mw ) {{$scripts}}" ),
+ (object)$styles,
+ (object)$messages
+ ) );
+ }
+
+ /**
+ * Returns JS code which, when called, will register a given list of messages.
+ *
+ * @param $messages Mixed: Either an associative array mapping message key to value, or a
+ * JSON-encoded message blob containing the same data, wrapped in an XmlJsCode object.
+ */
+ public static function makeMessageSetScript( $messages ) {
+ return Xml::encodeJsCall( 'mediaWiki.messages.set', array( (object)$messages ) );
+ }
+
+ /**
+ * Combines an associative array mapping media type to CSS into a
+ * single stylesheet with @media blocks.
+ *
+ * @param $styles Array: List of CSS strings keyed by media type
+ */
+ public static function makeCombinedStyles( array $styles ) {
+ $out = '';
+ foreach ( $styles as $media => $style ) {
+ // Transform the media type based on request params and config
+ // The way that this relies on $wgRequest to propagate request params is slightly evil
+ $media = OutputPage::transformCssMedia( $media );
+
+ if ( $media === null ) {
+ // Skip
+ } else if ( $media === '' || $media == 'all' ) {
+ // Don't output invalid or frivolous @media statements
+ $out .= "$style\n";
+ } else {
+ $out .= "@media $media {\n" . str_replace( "\n", "\n\t", "\t" . $style ) . "\n}\n";
+ }
+ }
+ return $out;
+ }
+
+ /**
+ * Returns a JS call to mediaWiki.loader.state, which sets the state of a
+ * module or modules to a given value. Has two calling conventions:
+ *
+ * - ResourceLoader::makeLoaderStateScript( $name, $state ):
+ * Set the state of a single module called $name to $state
+ *
+ * - ResourceLoader::makeLoaderStateScript( array( $name => $state, ... ) ):
+ * Set the state of modules with the given names to the given states
+ */
+ public static function makeLoaderStateScript( $name, $state = null ) {
+ if ( is_array( $name ) ) {
+ return Xml::encodeJsCall( 'mediaWiki.loader.state', array( $name ) );
+ } else {
+ return Xml::encodeJsCall( 'mediaWiki.loader.state', array( $name, $state ) );
+ }
+ }
+
+ /**
+ * Returns JS code which calls the script given by $script. The script will
+ * be called with local variables name, version, dependencies and group,
+ * which will have values corresponding to $name, $version, $dependencies
+ * and $group as supplied.
+ *
+ * @param $name String: Module name
+ * @param $version Integer: Module version number as a timestamp
+ * @param $dependencies Array: List of module names on which this module depends
+ * @param $group String: Group which the module is in.
+ * @param $script String: JavaScript code
+ */
+ public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $script ) {
+ $script = str_replace( "\n", "\n\t", trim( $script ) );
+ return Xml::encodeJsCall(
+ "( function( name, version, dependencies, group ) {\n\t$script\n} )",
+ array( $name, $version, $dependencies, $group ) );
+ }
+
+ /**
+ * Returns JS code which calls mediaWiki.loader.register with the given
+ * parameters. Has three calling conventions:
+ *
+ * - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group ):
+ * Register a single module.
+ *
+ * - ResourceLoader::makeLoaderRegisterScript( array( $name1, $name2 ) ):
+ * Register modules with the given names.
+ *
+ * - ResourceLoader::makeLoaderRegisterScript( array(
+ * array( $name1, $version1, $dependencies1, $group1 ),
+ * array( $name2, $version2, $dependencies1, $group2 ),
+ * ...
+ * ) ):
+ * Registers modules with the given names and parameters.
+ *
+ * @param $name String: Module name
+ * @param $version Integer: Module version number as a timestamp
+ * @param $dependencies Array: List of module names on which this module depends
+ * @param $group String: group which the module is in.
+ */
+ public static function makeLoaderRegisterScript( $name, $version = null,
+ $dependencies = null, $group = null )
+ {
+ if ( is_array( $name ) ) {
+ return Xml::encodeJsCall( 'mediaWiki.loader.register', array( $name ) );
+ } else {
+ $version = (int) $version > 1 ? (int) $version : 1;
+ return Xml::encodeJsCall( 'mediaWiki.loader.register',
+ array( $name, $version, $dependencies, $group ) );
+ }
+ }
+
+ /**
+ * Returns JS code which runs given JS code if the client-side framework is
+ * present.
+ *
+ * @param $script String: JavaScript code
+ */
+ public static function makeLoaderConditionalScript( $script ) {
+ $script = str_replace( "\n", "\n\t", trim( $script ) );
+ return "if ( window.mediaWiki ) {\n\t$script\n}\n";
+ }
+
+ /**
+ * Returns JS code which will set the MediaWiki configuration array to
+ * the given value.
+ *
+ * @param $configuration Array: List of configuration values keyed by variable name
+ */
+ public static function makeConfigSetScript( array $configuration ) {
+ return Xml::encodeJsCall( 'mediaWiki.config.set', array( $configuration ) );
+ }
+
+ /**
+ * Convert an array of module names to a packed query string.
+ *
+ * For example, array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' )
+ * becomes 'foo.bar,baz|bar.baz,quux'
+ * @param $modules array of module names (strings)
+ * @return string Packed query string
+ */
+ public static function makePackedModulesString( $modules ) {
+ $groups = array(); // array( prefix => array( suffixes ) )
+ foreach ( $modules as $module ) {
+ $pos = strrpos( $module, '.' );
+ $prefix = $pos === false ? '' : substr( $module, 0, $pos );
+ $suffix = $pos === false ? $module : substr( $module, $pos + 1 );
+ $groups[$prefix][] = $suffix;
+ }
+
+ $arr = array();
+ foreach ( $groups as $prefix => $suffixes ) {
+ $p = $prefix === '' ? '' : $prefix . '.';
+ $arr[] = $p . implode( ',', $suffixes );
+ }
+ return implode( '|', $arr );
+ }
+
+ /**
+ * Determine whether debug mode was requested
+ * Order of priority is 1) request param, 2) cookie, 3) $wg setting
+ * @return bool
+ */
+ public static function inDebugMode() {
+ global $wgRequest, $wgResourceLoaderDebug;
+ static $retval = null;
+ if ( !is_null( $retval ) )
+ return $retval;
+ return $retval = $wgRequest->getFuzzyBool( 'debug',
+ $wgRequest->getCookie( 'resourceLoaderDebug', '', $wgResourceLoaderDebug ) );
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php
new file mode 100644
index 00000000..bf059b46
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderContext.php
@@ -0,0 +1,176 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Object passed around to modules which contains information about the state
+ * of a specific loader request
+ */
+class ResourceLoaderContext {
+
+ /* Protected Members */
+
+ protected $resourceLoader;
+ protected $request;
+ protected $modules;
+ protected $language;
+ protected $direction;
+ protected $skin;
+ protected $user;
+ protected $debug;
+ protected $only;
+ protected $version;
+ protected $hash;
+
+ /* Methods */
+
+ public function __construct( ResourceLoader $resourceLoader, WebRequest $request ) {
+ global $wgDefaultSkin, $wgResourceLoaderDebug;
+
+ $this->resourceLoader = $resourceLoader;
+ $this->request = $request;
+
+ // Interpret request
+ // List of modules
+ $modules = $request->getVal( 'modules' );
+ $this->modules = $modules ? self::expandModuleNames( $modules ) : array();
+ // Various parameters
+ $this->skin = $request->getVal( 'skin' );
+ $this->user = $request->getVal( 'user' );
+ $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
+ $this->only = $request->getVal( 'only' );
+ $this->version = $request->getVal( 'version' );
+
+ if ( !$this->skin ) {
+ $this->skin = $wgDefaultSkin;
+ }
+ }
+
+ /**
+ * Expand a string of the form jquery.foo,bar|jquery.ui.baz,quux to
+ * an array of module names like array( 'jquery.foo', 'jquery.bar',
+ * 'jquery.ui.baz', 'jquery.ui.quux' )
+ * @param $modules String Packed module name list
+ * @return array of module names
+ */
+ public static function expandModuleNames( $modules ) {
+ $retval = array();
+ $exploded = explode( '|', $modules );
+ foreach ( $exploded as $group ) {
+ if ( strpos( $group, ',' ) === false ) {
+ // This is not a set of modules in foo.bar,baz notation
+ // but a single module
+ $retval[] = $group;
+ } else {
+ // This is a set of modules in foo.bar,baz notation
+ $pos = strrpos( $group, '.' );
+ if ( $pos === false ) {
+ // Prefixless modules, i.e. without dots
+ $retval = explode( ',', $group );
+ } else {
+ // We have a prefix and a bunch of suffixes
+ $prefix = substr( $group, 0, $pos ); // 'foo'
+ $suffixes = explode( ',', substr( $group, $pos + 1 ) ); // array( 'bar', 'baz' )
+ foreach ( $suffixes as $suffix ) {
+ $retval[] = "$prefix.$suffix";
+ }
+ }
+ }
+ }
+ return $retval;
+ }
+
+ public function getResourceLoader() {
+ return $this->resourceLoader;
+ }
+
+ public function getRequest() {
+ return $this->request;
+ }
+
+ public function getModules() {
+ return $this->modules;
+ }
+
+ public function getLanguage() {
+ if ( $this->language === null ) {
+ global $wgLang;
+ $this->language = $this->request->getVal( 'lang' );
+ if ( !$this->language ) {
+ $this->language = $wgLang->getCode();
+ }
+ }
+ return $this->language;
+ }
+
+ public function getDirection() {
+ if ( $this->direction === null ) {
+ $this->direction = $this->request->getVal( 'dir' );
+ if ( !$this->direction ) {
+ global $wgContLang;
+ $this->direction = $wgContLang->getDir();
+ }
+ }
+ return $this->direction;
+ }
+
+ public function getSkin() {
+ return $this->skin;
+ }
+
+ public function getUser() {
+ return $this->user;
+ }
+
+ public function getDebug() {
+ return $this->debug;
+ }
+
+ public function getOnly() {
+ return $this->only;
+ }
+
+ public function getVersion() {
+ return $this->version;
+ }
+
+ public function shouldIncludeScripts() {
+ return is_null( $this->only ) || $this->only === 'scripts';
+ }
+
+ public function shouldIncludeStyles() {
+ return is_null( $this->only ) || $this->only === 'styles';
+ }
+
+ public function shouldIncludeMessages() {
+ return is_null( $this->only ) || $this->only === 'messages';
+ }
+
+ public function getHash() {
+ if ( !isset( $this->hash ) ) {
+ $this->hash = implode( '|', array(
+ $this->getLanguage(), $this->getDirection(), $this->skin, $this->user,
+ $this->debug, $this->only, $this->version
+ ) );
+ }
+ return $this->hash;
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php
new file mode 100644
index 00000000..44967a2e
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderFileModule.php
@@ -0,0 +1,509 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * ResourceLoader module based on local JavaScript/CSS files.
+ */
+class ResourceLoaderFileModule extends ResourceLoaderModule {
+
+ /* Protected Members */
+
+ /** String: Local base path, see __construct() */
+ protected $localBasePath = '';
+ /** String: Remote base path, see __construct() */
+ protected $remoteBasePath = '';
+ /**
+ * Array: List of paths to JavaScript files to always include
+ * @example array( [file-path], [file-path], ... )
+ */
+ protected $scripts = array();
+ /**
+ * Array: List of JavaScript files to include when using a specific language
+ * @example array( [language-code] => array( [file-path], [file-path], ... ), ... )
+ */
+ protected $languageScripts = array();
+ /**
+ * Array: List of JavaScript files to include when using a specific skin
+ * @example array( [skin-name] => array( [file-path], [file-path], ... ), ... )
+ */
+ protected $skinScripts = array();
+ /**
+ * Array: List of paths to JavaScript files to include in debug mode
+ * @example array( [skin-name] => array( [file-path], [file-path], ... ), ... )
+ */
+ protected $debugScripts = array();
+ /**
+ * Array: List of paths to JavaScript files to include in the startup module
+ * @example array( [file-path], [file-path], ... )
+ */
+ protected $loaderScripts = array();
+ /**
+ * Array: List of paths to CSS files to always include
+ * @example array( [file-path], [file-path], ... )
+ */
+ protected $styles = array();
+ /**
+ * Array: List of paths to CSS files to include when using specific skins
+ * @example array( [file-path], [file-path], ... )
+ */
+ protected $skinStyles = array();
+ /**
+ * Array: List of modules this module depends on
+ * @example array( [file-path], [file-path], ... )
+ */
+ protected $dependencies = array();
+ /**
+ * Array: List of message keys used by this module
+ * @example array( [message-key], [message-key], ... )
+ */
+ protected $messages = array();
+ /** String: Name of group to load this module in */
+ protected $group;
+ /** Boolean: Link to raw files in debug mode */
+ protected $debugRaw = true;
+ /**
+ * Array: Cache for mtime
+ * @example array( [hash] => [mtime], [hash] => [mtime], ... )
+ */
+ protected $modifiedTime = array();
+ /**
+ * Array: Place where readStyleFile() tracks file dependencies
+ * @example array( [file-path], [file-path], ... )
+ */
+ protected $localFileRefs = array();
+
+ /* Methods */
+
+ /**
+ * Constructs a new module from an options array.
+ *
+ * @param $options Array: List of options; if not given or empty, an empty module will be
+ * constructed
+ * @param $localBasePath String: Base path to prepend to all local paths in $options. Defaults
+ * to $IP
+ * @param $remoteBasePath String: Base path to prepend to all remote paths in $options. Defaults
+ * to $wgScriptPath
+ *
+ * @example $options
+ * array(
+ * // Base path to prepend to all local paths in $options. Defaults to $IP
+ * 'localBasePath' => [base path],
+ * // Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath
+ * 'remoteBasePath' => [base path],
+ * // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
+ * 'remoteExtPath' => [base path],
+ * // Scripts to always include
+ * 'scripts' => [file path string or array of file path strings],
+ * // Scripts to include in specific language contexts
+ * 'languageScripts' => array(
+ * [language code] => [file path string or array of file path strings],
+ * ),
+ * // Scripts to include in specific skin contexts
+ * 'skinScripts' => array(
+ * [skin name] => [file path string or array of file path strings],
+ * ),
+ * // Scripts to include in debug contexts
+ * 'debugScripts' => [file path string or array of file path strings],
+ * // Scripts to include in the startup module
+ * 'loaderScripts' => [file path string or array of file path strings],
+ * // Modules which must be loaded before this module
+ * 'dependencies' => [modile name string or array of module name strings],
+ * // Styles to always load
+ * 'styles' => [file path string or array of file path strings],
+ * // Styles to include in specific skin contexts
+ * 'skinStyles' => array(
+ * [skin name] => [file path string or array of file path strings],
+ * ),
+ * // Messages to always load
+ * 'messages' => [array of message key strings],
+ * // Group which this module should be loaded together with
+ * 'group' => [group name string],
+ * )
+ */
+ public function __construct( $options = array(), $localBasePath = null,
+ $remoteBasePath = null )
+ {
+ global $IP, $wgScriptPath;
+ $this->localBasePath = $localBasePath === null ? $IP : $localBasePath;
+ $this->remoteBasePath = $remoteBasePath === null ? $wgScriptPath : $remoteBasePath;
+
+ if ( isset( $options['remoteExtPath'] ) ) {
+ global $wgExtensionAssetsPath;
+ $this->remoteBasePath = $wgExtensionAssetsPath . '/' . $options['remoteExtPath'];
+ }
+
+ foreach ( $options as $member => $option ) {
+ switch ( $member ) {
+ // Lists of file paths
+ case 'scripts':
+ case 'debugScripts':
+ case 'loaderScripts':
+ case 'styles':
+ $this->{$member} = (array) $option;
+ break;
+ // Collated lists of file paths
+ case 'languageScripts':
+ case 'skinScripts':
+ case 'skinStyles':
+ if ( !is_array( $option ) ) {
+ throw new MWException(
+ "Invalid collated file path list error. " .
+ "'$option' given, array expected."
+ );
+ }
+ foreach ( $option as $key => $value ) {
+ if ( !is_string( $key ) ) {
+ throw new MWException(
+ "Invalid collated file path list key error. " .
+ "'$key' given, string expected."
+ );
+ }
+ $this->{$member}[$key] = (array) $value;
+ }
+ break;
+ // Lists of strings
+ case 'dependencies':
+ case 'messages':
+ $this->{$member} = (array) $option;
+ break;
+ // Single strings
+ case 'group':
+ case 'localBasePath':
+ case 'remoteBasePath':
+ $this->{$member} = (string) $option;
+ break;
+ // Single booleans
+ case 'debugRaw':
+ $this->{$member} = (bool) $option;
+ break;
+ }
+ }
+ // Make sure the remote base path is a complete valid url
+ $this->remoteBasePath = wfExpandUrl( $this->remoteBasePath );
+ }
+
+ /**
+ * Gets all scripts for a given context concatenated together.
+ *
+ * @param $context ResourceLoaderContext: Context in which to generate script
+ * @return String: JavaScript code for $context
+ */
+ public function getScript( ResourceLoaderContext $context ) {
+ $files = array_merge(
+ $this->scripts,
+ self::tryForKey( $this->languageScripts, $context->getLanguage() ),
+ self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' )
+ );
+ if ( $context->getDebug() ) {
+ $files = array_merge( $files, $this->debugScripts );
+ if ( $this->debugRaw ) {
+ $script = '';
+ foreach ( $files as $file ) {
+ $path = $this->getRemotePath( $file );
+ $script .= "\n\t" . Xml::encodeJsCall( 'mediaWiki.loader.load', array( $path ) );
+ }
+ return $script;
+ }
+ }
+ return $this->readScriptFiles( $files );
+ }
+
+ /**
+ * Gets loader script.
+ *
+ * @return String: JavaScript code to be added to startup module
+ */
+ public function getLoaderScript() {
+ if ( count( $this->loaderScripts ) == 0 ) {
+ return false;
+ }
+ return $this->readScriptFiles( $this->loaderScripts );
+ }
+
+ /**
+ * Gets all styles for a given context concatenated together.
+ *
+ * @param $context ResourceLoaderContext: Context in which to generate styles
+ * @return String: CSS code for $context
+ */
+ public function getStyles( ResourceLoaderContext $context ) {
+ // Merge general styles and skin specific styles, retaining media type collation
+ $styles = $this->readStyleFiles( $this->styles, $this->getFlip( $context ) );
+ $skinStyles = $this->readStyleFiles(
+ self::tryForKey( $this->skinStyles, $context->getSkin(), 'default' ),
+ $this->getFlip( $context )
+ );
+
+ foreach ( $skinStyles as $media => $style ) {
+ if ( isset( $styles[$media] ) ) {
+ $styles[$media] .= $style;
+ } else {
+ $styles[$media] = $style;
+ }
+ }
+ // Collect referenced files
+ $this->localFileRefs = array_unique( $this->localFileRefs );
+ // If the list has been modified since last time we cached it, update the cache
+ if ( $this->localFileRefs !== $this->getFileDependencies( $context->getSkin() ) ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace( 'module_deps',
+ array( array( 'md_module', 'md_skin' ) ), array(
+ 'md_module' => $this->getName(),
+ 'md_skin' => $context->getSkin(),
+ 'md_deps' => FormatJson::encode( $this->localFileRefs ),
+ )
+ );
+ }
+ return $styles;
+ }
+
+ /**
+ * Gets list of message keys used by this module.
+ *
+ * @return Array: List of message keys
+ */
+ public function getMessages() {
+ return $this->messages;
+ }
+
+ /**
+ * Gets the name of the group this module should be loaded in.
+ *
+ * @return String: Group name
+ */
+ public function getGroup() {
+ return $this->group;
+ }
+
+ /**
+ * Gets list of names of modules this module depends on.
+ *
+ * @return Array: List of module names
+ */
+ public function getDependencies() {
+ return $this->dependencies;
+ }
+
+ /**
+ * Get the last modified timestamp of this module.
+ *
+ * Last modified timestamps are calculated from the highest last modified
+ * timestamp of this module's constituent files as well as the files it
+ * depends on. This function is context-sensitive, only performing
+ * calculations on files relevant to the given language, skin and debug
+ * mode.
+ *
+ * @param $context ResourceLoaderContext: Context in which to calculate
+ * the modified time
+ * @return Integer: UNIX timestamp
+ * @see ResourceLoaderModule::getFileDependencies
+ */
+ public function getModifiedTime( ResourceLoaderContext $context ) {
+ if ( isset( $this->modifiedTime[$context->getHash()] ) ) {
+ return $this->modifiedTime[$context->getHash()];
+ }
+ wfProfileIn( __METHOD__ );
+
+ $files = array();
+
+ // Flatten style files into $files
+ $styles = self::collateFilePathListByOption( $this->styles, 'media', 'all' );
+ foreach ( $styles as $styleFiles ) {
+ $files = array_merge( $files, $styleFiles );
+ }
+ $skinFiles = self::tryForKey(
+ self::collateFilePathListByOption( $this->skinStyles, 'media', 'all' ),
+ $context->getSkin(),
+ 'default'
+ );
+ foreach ( $skinFiles as $styleFiles ) {
+ $files = array_merge( $files, $styleFiles );
+ }
+
+ // Final merge, this should result in a master list of dependent files
+ $files = array_merge(
+ $files,
+ $this->scripts,
+ $context->getDebug() ? $this->debugScripts : array(),
+ self::tryForKey( $this->languageScripts, $context->getLanguage() ),
+ self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
+ $this->loaderScripts
+ );
+ $files = array_map( array( $this, 'getLocalPath' ), $files );
+ // File deps need to be treated separately because they're already prefixed
+ $files = array_merge( $files, $this->getFileDependencies( $context->getSkin() ) );
+
+ // If a module is nothing but a list of dependencies, we need to avoid
+ // giving max() an empty array
+ if ( count( $files ) === 0 ) {
+ wfProfileOut( __METHOD__ );
+ return $this->modifiedTime[$context->getHash()] = 1;
+ }
+
+ wfProfileIn( __METHOD__.'-filemtime' );
+ $filesMtime = max( array_map( 'filemtime', $files ) );
+ wfProfileOut( __METHOD__.'-filemtime' );
+ $this->modifiedTime[$context->getHash()] = max(
+ $filesMtime,
+ $this->getMsgBlobMtime( $context->getLanguage() ) );
+
+ wfProfileOut( __METHOD__ );
+ return $this->modifiedTime[$context->getHash()];
+ }
+
+ /* Protected Members */
+
+ protected function getLocalPath( $path ) {
+ return "{$this->localBasePath}/$path";
+ }
+
+ protected function getRemotePath( $path ) {
+ return "{$this->remoteBasePath}/$path";
+ }
+
+ /**
+ * Collates file paths by option (where provided).
+ *
+ * @param $list Array: List of file paths in any combination of index/path
+ * or path/options pairs
+ * @param $option String: option name
+ * @param $default Mixed: default value if the option isn't set
+ * @return Array: List of file paths, collated by $option
+ */
+ protected static function collateFilePathListByOption( array $list, $option, $default ) {
+ $collatedFiles = array();
+ foreach ( (array) $list as $key => $value ) {
+ if ( is_int( $key ) ) {
+ // File name as the value
+ if ( !isset( $collatedFiles[$default] ) ) {
+ $collatedFiles[$default] = array();
+ }
+ $collatedFiles[$default][] = $value;
+ } else if ( is_array( $value ) ) {
+ // File name as the key, options array as the value
+ $optionValue = isset( $value[$option] ) ? $value[$option] : $default;
+ if ( !isset( $collatedFiles[$optionValue] ) ) {
+ $collatedFiles[$optionValue] = array();
+ }
+ $collatedFiles[$optionValue][] = $key;
+ }
+ }
+ return $collatedFiles;
+ }
+
+ /**
+ * Gets a list of element that match a key, optionally using a fallback key.
+ *
+ * @param $list Array: List of lists to select from
+ * @param $key String: Key to look for in $map
+ * @param $fallback String: Key to look for in $list if $key doesn't exist
+ * @return Array: List of elements from $map which matched $key or $fallback,
+ * or an empty list in case of no match
+ */
+ protected static function tryForKey( array $list, $key, $fallback = null ) {
+ if ( isset( $list[$key] ) && is_array( $list[$key] ) ) {
+ return $list[$key];
+ } else if ( is_string( $fallback )
+ && isset( $list[$fallback] )
+ && is_array( $list[$fallback] ) )
+ {
+ return $list[$fallback];
+ }
+ return array();
+ }
+
+ /**
+ * Gets the contents of a list of JavaScript files.
+ *
+ * @param $scripts Array: List of file paths to scripts to read, remap and concetenate
+ * @return String: Concatenated and remapped JavaScript data from $scripts
+ */
+ protected function readScriptFiles( array $scripts ) {
+ if ( empty( $scripts ) ) {
+ return '';
+ }
+ $js = '';
+ foreach ( array_unique( $scripts ) as $fileName ) {
+ $localPath = $this->getLocalPath( $fileName );
+ $contents = file_get_contents( $localPath );
+ if ( $contents === false ) {
+ throw new MWException( __METHOD__.": script file not found: \"$localPath\"" );
+ }
+ $js .= $contents . "\n";
+ }
+ return $js;
+ }
+
+ /**
+ * Gets the contents of a list of CSS files.
+ *
+ * @param $styles Array: List of file paths to styles to read, remap and concetenate
+ * @return Array: List of concatenated and remapped CSS data from $styles,
+ * keyed by media type
+ */
+ protected function readStyleFiles( array $styles, $flip ) {
+ if ( empty( $styles ) ) {
+ return array();
+ }
+ $styles = self::collateFilePathListByOption( $styles, 'media', 'all' );
+ foreach ( $styles as $media => $files ) {
+ $uniqueFiles = array_unique( $files );
+ $styles[$media] = implode(
+ "\n",
+ array_map(
+ array( $this, 'readStyleFile' ),
+ $uniqueFiles,
+ array_fill( 0, count( $uniqueFiles ), $flip )
+ )
+ );
+ }
+ return $styles;
+ }
+
+ /**
+ * Reads a style file.
+ *
+ * This method can be used as a callback for array_map()
+ *
+ * @param $path String: File path of script file to read
+ * @return String: CSS data in script file
+ */
+ protected function readStyleFile( $path, $flip ) {
+ $localPath = $this->getLocalPath( $path );
+ $style = file_get_contents( $localPath );
+ if ( $style === false ) {
+ throw new MWException( __METHOD__.": style file not found: \"$localPath\"" );
+ }
+ if ( $flip ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ $dir = $this->getLocalPath( dirname( $path ) );
+ $remoteDir = $this->getRemotePath( dirname( $path ) );
+ // Get and register local file references
+ $this->localFileRefs = array_merge(
+ $this->localFileRefs,
+ CSSMin::getLocalFileReferences( $style, $dir ) );
+ return CSSMin::remap(
+ $style, $dir, $remoteDir, true
+ );
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php
new file mode 100644
index 00000000..77d230c9
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderModule.php
@@ -0,0 +1,239 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Abstraction for resource loader modules, with name registration and maxage functionality.
+ */
+abstract class ResourceLoaderModule {
+
+ /* Protected Members */
+
+ protected $name = null;
+
+ // In-object cache for file dependencies
+ protected $fileDeps = array();
+ // In-object cache for message blob mtime
+ protected $msgBlobMtime = array();
+
+ /* Methods */
+
+ /**
+ * Get this module's name. This is set when the module is registered
+ * with ResourceLoader::register()
+ *
+ * @return Mixed: Name (string) or null if no name was set
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * Set this module's name. This is called by ResourceLodaer::register()
+ * when registering the module. Other code should not call this.
+ *
+ * @param $name String: Name
+ */
+ public function setName( $name ) {
+ $this->name = $name;
+ }
+
+ /**
+ * Get whether CSS for this module should be flipped
+ */
+ public function getFlip( $context ) {
+ return $context->getDirection() === 'rtl';
+ }
+
+ /**
+ * Get all JS for this module for a given language and skin.
+ * Includes all relevant JS except loader scripts.
+ *
+ * @param $context ResourceLoaderContext: Context object
+ * @return String: JavaScript code
+ */
+ public function getScript( ResourceLoaderContext $context ) {
+ // Stub, override expected
+ return '';
+ }
+
+ /**
+ * Get all CSS for this module for a given skin.
+ *
+ * @param $context ResourceLoaderContext: Context object
+ * @return Array: List of CSS strings keyed by media type
+ */
+ public function getStyles( ResourceLoaderContext $context ) {
+ // Stub, override expected
+ return '';
+ }
+
+ /**
+ * Get the messages needed for this module.
+ *
+ * To get a JSON blob with messages, use MessageBlobStore::get()
+ *
+ * @return Array: List of message keys. Keys may occur more than once
+ */
+ public function getMessages() {
+ // Stub, override expected
+ return array();
+ }
+
+ /**
+ * Get the group this module is in.
+ *
+ * @return String: Group name
+ */
+ public function getGroup() {
+ // Stub, override expected
+ return null;
+ }
+
+ /**
+ * Get the loader JS for this module, if set.
+ *
+ * @return Mixed: JavaScript loader code as a string or boolean false if no custom loader set
+ */
+ public function getLoaderScript() {
+ // Stub, override expected
+ return false;
+ }
+
+ /**
+ * Get a list of modules this module depends on.
+ *
+ * Dependency information is taken into account when loading a module
+ * on the client side. When adding a module on the server side,
+ * dependency information is NOT taken into account and YOU are
+ * responsible for adding dependent modules as well. If you don't do
+ * this, the client side loader will send a second request back to the
+ * server to fetch the missing modules, which kind of defeats the
+ * purpose of the resource loader.
+ *
+ * To add dependencies dynamically on the client side, use a custom
+ * loader script, see getLoaderScript()
+ * @return Array: List of module names as strings
+ */
+ public function getDependencies() {
+ // Stub, override expected
+ return array();
+ }
+
+ /**
+ * Get the files this module depends on indirectly for a given skin.
+ * Currently these are only image files referenced by the module's CSS.
+ *
+ * @param $skin String: Skin name
+ * @return Array: List of files
+ */
+ public function getFileDependencies( $skin ) {
+ // Try in-object cache first
+ if ( isset( $this->fileDeps[$skin] ) ) {
+ return $this->fileDeps[$skin];
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $deps = $dbr->selectField( 'module_deps', 'md_deps', array(
+ 'md_module' => $this->getName(),
+ 'md_skin' => $skin,
+ ), __METHOD__
+ );
+ if ( !is_null( $deps ) ) {
+ $this->fileDeps[$skin] = (array) FormatJson::decode( $deps, true );
+ } else {
+ $this->fileDeps[$skin] = array();
+ }
+ return $this->fileDeps[$skin];
+ }
+
+ /**
+ * Set preloaded file dependency information. Used so we can load this
+ * information for all modules at once.
+ * @param $skin String: Skin name
+ * @param $deps Array: Array of file names
+ */
+ public function setFileDependencies( $skin, $deps ) {
+ $this->fileDeps[$skin] = $deps;
+ }
+
+ /**
+ * Get the last modification timestamp of the message blob for this
+ * module in a given language.
+ * @param $lang String: Language code
+ * @return Integer: UNIX timestamp, or 0 if no blob found
+ */
+ public function getMsgBlobMtime( $lang ) {
+ if ( !isset( $this->msgBlobMtime[$lang] ) ) {
+ if ( !count( $this->getMessages() ) )
+ return 0;
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $msgBlobMtime = $dbr->selectField( 'msg_resource', 'mr_timestamp', array(
+ 'mr_resource' => $this->getName(),
+ 'mr_lang' => $lang
+ ), __METHOD__
+ );
+ $this->msgBlobMtime[$lang] = $msgBlobMtime ? wfTimestamp( TS_UNIX, $msgBlobMtime ) : 0;
+ }
+ return $this->msgBlobMtime[$lang];
+ }
+
+ /**
+ * Set a preloaded message blob last modification timestamp. Used so we
+ * can load this information for all modules at once.
+ * @param $lang String: Language code
+ * @param $mtime Integer: UNIX timestamp or 0 if there is no such blob
+ */
+ public function setMsgBlobMtime( $lang, $mtime ) {
+ $this->msgBlobMtime[$lang] = $mtime;
+ }
+
+ /* Abstract Methods */
+
+ /**
+ * Get this module's last modification timestamp for a given
+ * combination of language, skin and debug mode flag. This is typically
+ * the highest of each of the relevant components' modification
+ * timestamps. Whenever anything happens that changes the module's
+ * contents for these parameters, the mtime should increase.
+ *
+ * @param $context ResourceLoaderContext: Context object
+ * @return Integer: UNIX timestamp
+ */
+ public function getModifiedTime( ResourceLoaderContext $context ) {
+ // 0 would mean now
+ return 1;
+ }
+
+ /**
+ * Check whether this module is known to be empty. If a child class
+ * has an easy and cheap way to determine that this module is
+ * definitely going to be empty, it should override this method to
+ * return true in that case. Callers may optimize the request for this
+ * module away if this function returns true.
+ * @param $context ResourceLoaderContext: Context object
+ * @return Boolean
+ */
+ public function isKnownEmpty( ResourceLoaderContext $context ) {
+ return false;
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php
new file mode 100644
index 00000000..977d16bb
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderSiteModule.php
@@ -0,0 +1,63 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Module for site customizations
+ */
+class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
+
+ /* Protected Methods */
+
+ /**
+ * Gets list of pages used by this module
+ *
+ * @return Array: List of pages
+ */
+ protected function getPages( ResourceLoaderContext $context ) {
+ global $wgHandheldStyle;
+
+ $pages = array(
+ 'MediaWiki:Common.js' => array( 'type' => 'script' ),
+ 'MediaWiki:Common.css' => array( 'type' => 'style' ),
+ 'MediaWiki:' . ucfirst( $context->getSkin() ) . '.js' => array( 'type' => 'script' ),
+ 'MediaWiki:' . ucfirst( $context->getSkin() ) . '.css' => array( 'type' => 'style' ),
+ 'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
+ );
+ if ( $wgHandheldStyle ) {
+ $pages['MediaWiki:Handheld.css'] = array(
+ 'type' => 'style',
+ 'media' => 'handheld' );
+ }
+ return $pages;
+ }
+
+ /* Methods */
+
+ /**
+ * Gets group name
+ *
+ * @return String: Name of group
+ */
+ public function getGroup() {
+ return 'site';
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php
new file mode 100644
index 00000000..2a3ba343
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -0,0 +1,225 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+class ResourceLoaderStartUpModule extends ResourceLoaderModule {
+
+ /* Protected Members */
+
+ protected $modifiedTime = array();
+
+ /* Protected Methods */
+
+ protected function getConfig( $context ) {
+ global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
+ $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
+ $wgVariantArticlePath, $wgActionPaths, $wgUseAjax, $wgVersion,
+ $wgEnableAPI, $wgEnableWriteAPI, $wgDBname, $wgEnableMWSuggest,
+ $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
+ $wgResourceLoaderMaxQueryLength;
+
+ // Pre-process information
+ $separatorTransTable = $wgContLang->separatorTransformTable();
+ $separatorTransTable = $separatorTransTable ? $separatorTransTable : array();
+ $compactSeparatorTransTable = array(
+ implode( "\t", array_keys( $separatorTransTable ) ),
+ implode( "\t", $separatorTransTable ),
+ );
+ $digitTransTable = $wgContLang->digitTransformTable();
+ $digitTransTable = $digitTransTable ? $digitTransTable : array();
+ $compactDigitTransTable = array(
+ implode( "\t", array_keys( $digitTransTable ) ),
+ implode( "\t", $digitTransTable ),
+ );
+ $mainPage = Title::newMainPage();
+
+ // Build list of variables
+ $vars = array(
+ 'wgLoadScript' => $wgLoadScript,
+ 'debug' => $context->getDebug(),
+ 'skin' => $context->getSkin(),
+ 'stylepath' => $wgStylePath,
+ 'wgUrlProtocols' => wfUrlProtocols(),
+ 'wgArticlePath' => $wgArticlePath,
+ 'wgScriptPath' => $wgScriptPath,
+ 'wgScriptExtension' => $wgScriptExtension,
+ 'wgScript' => $wgScript,
+ 'wgVariantArticlePath' => $wgVariantArticlePath,
+ 'wgActionPaths' => $wgActionPaths,
+ 'wgServer' => $wgServer,
+ 'wgUserLanguage' => $context->getLanguage(),
+ 'wgContentLanguage' => $wgContLang->getCode(),
+ 'wgVersion' => $wgVersion,
+ 'wgEnableAPI' => $wgEnableAPI,
+ 'wgEnableWriteAPI' => $wgEnableWriteAPI,
+ 'wgSeparatorTransformTable' => $compactSeparatorTransTable,
+ 'wgDigitTransformTable' => $compactDigitTransTable,
+ 'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
+ 'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
+ 'wgNamespaceIds' => $wgContLang->getNamespaceIds(),
+ 'wgSiteName' => $wgSitename,
+ 'wgFileExtensions' => array_values( $wgFileExtensions ),
+ 'wgDBname' => $wgDBname,
+ 'wgExtensionAssetsPath' => $wgExtensionAssetsPath,
+ 'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
+ );
+ if ( $wgContLang->hasVariants() ) {
+ $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
+ }
+ if ( $wgUseAjax && $wgEnableMWSuggest ) {
+ $vars['wgMWSuggestTemplate'] = SearchEngine::getMWSuggestTemplate();
+ }
+
+ wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
+
+ return $vars;
+ }
+
+ /**
+ * Gets registration code for all modules
+ *
+ * @param $context ResourceLoaderContext object
+ * @return String: JavaScript code for registering all modules with the client loader
+ */
+ public static function getModuleRegistrations( ResourceLoaderContext $context ) {
+ global $wgCacheEpoch;
+ wfProfileIn( __METHOD__ );
+
+ $out = '';
+ $registrations = array();
+ $resourceLoader = $context->getResourceLoader();
+ foreach ( $resourceLoader->getModuleNames() as $name ) {
+ $module = $resourceLoader->getModule( $name );
+ // Support module loader scripts
+ $loader = $module->getLoaderScript();
+ if ( $loader !== false ) {
+ $deps = $module->getDependencies();
+ $group = $module->getGroup();
+ $version = wfTimestamp( TS_ISO_8601_BASIC,
+ round( $module->getModifiedTime( $context ), -2 ) );
+ $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $loader );
+ }
+ // Automatically register module
+ else {
+ $mtime = max( $module->getModifiedTime( $context ), wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
+ // Modules without dependencies or a group pass two arguments (name, timestamp) to
+ // mediaWiki.loader.register()
+ if ( !count( $module->getDependencies() && $module->getGroup() === null ) ) {
+ $registrations[] = array( $name, $mtime );
+ }
+ // Modules with dependencies but no group pass three arguments
+ // (name, timestamp, dependencies) to mediaWiki.loader.register()
+ else if ( $module->getGroup() === null ) {
+ $registrations[] = array(
+ $name, $mtime, $module->getDependencies() );
+ }
+ // Modules with dependencies pass four arguments (name, timestamp, dependencies, group)
+ // to mediaWiki.loader.register()
+ else {
+ $registrations[] = array(
+ $name, $mtime, $module->getDependencies(), $module->getGroup() );
+ }
+ }
+ }
+ $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
+
+ wfProfileOut( __METHOD__ );
+ return $out;
+ }
+
+ /* Methods */
+
+ public function getScript( ResourceLoaderContext $context ) {
+ global $IP, $wgLoadScript;
+
+ $out = file_get_contents( "$IP/resources/startup.js" );
+ if ( $context->getOnly() === 'scripts' ) {
+ // Build load query for jquery and mediawiki modules
+ $query = array(
+ 'modules' => implode( '|', array( 'jquery', 'mediawiki' ) ),
+ 'only' => 'scripts',
+ 'lang' => $context->getLanguage(),
+ 'skin' => $context->getSkin(),
+ 'debug' => $context->getDebug() ? 'true' : 'false',
+ 'version' => wfTimestamp( TS_ISO_8601_BASIC, round( max(
+ $context->getResourceLoader()->getModule( 'jquery' )->getModifiedTime( $context ),
+ $context->getResourceLoader()->getModule( 'mediawiki' )->getModifiedTime( $context )
+ ), -2 ) )
+ );
+ // Ensure uniform query order
+ ksort( $query );
+
+ // Startup function
+ $configuration = $this->getConfig( $context );
+ $registrations = self::getModuleRegistrations( $context );
+ $out .= "var startUp = function() {\n" .
+ "\t$registrations\n" .
+ "\t" . Xml::encodeJsCall( 'mediaWiki.config.set', array( $configuration ) ) .
+ "};\n";
+
+ // Conditional script injection
+ $scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) );
+ $out .= "if ( isCompatible() ) {\n" .
+ "\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
+ "}\n" .
+ "delete isCompatible;";
+ }
+
+ return $out;
+ }
+
+ public function getModifiedTime( ResourceLoaderContext $context ) {
+ global $IP, $wgCacheEpoch;
+
+ $hash = $context->getHash();
+ if ( isset( $this->modifiedTime[$hash] ) ) {
+ return $this->modifiedTime[$hash];
+ }
+
+ // Call preloadModuleInfo() on ALL modules as we're about
+ // to call getModifiedTime() on all of them
+ $loader = $context->getResourceLoader();
+ $loader->preloadModuleInfo( $loader->getModuleNames(), $context );
+
+ $this->modifiedTime[$hash] = filemtime( "$IP/resources/startup.js" );
+ // ATTENTION!: Because of the line above, this is not going to cause
+ // infinite recursion - think carefully before making changes to this
+ // code!
+ $time = wfTimestamp( TS_UNIX, $wgCacheEpoch );
+ foreach ( $loader->getModuleNames() as $name ) {
+ $module = $loader->getModule( $name );
+ $time = max( $time, $module->getModifiedTime( $context ) );
+ }
+ return $this->modifiedTime[$hash] = $time;
+ }
+
+ public function getFlip( $context ) {
+ global $wgContLang;
+
+ return $wgContLang->getDir() !== $context->getDirection();
+ }
+
+ /* Methods */
+
+ public function getGroup() {
+ return 'startup';
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php
new file mode 100644
index 00000000..c7186653
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderUserModule.php
@@ -0,0 +1,50 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Module for user customizations
+ */
+class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
+
+ /* Protected Methods */
+
+ protected function getPages( ResourceLoaderContext $context ) {
+ if ( $context->getUser() ) {
+ $username = $context->getUser();
+ return array(
+ "User:$username/common.js" => array( 'type' => 'script' ),
+ "User:$username/" . $context->getSkin() . '.js' =>
+ array( 'type' => 'script' ),
+ "User:$username/common.css" => array( 'type' => 'style' ),
+ "User:$username/" . $context->getSkin() . '.css' =>
+ array( 'type' => 'style' ),
+ );
+ }
+ return array();
+ }
+
+ /* Methods */
+
+ public function getGroup() {
+ return 'user';
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
new file mode 100644
index 00000000..ae654b8f
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
@@ -0,0 +1,121 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Module for user preference customizations
+ */
+class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
+
+ /* Protected Members */
+
+ protected $modifiedTime = array();
+
+ /* Methods */
+
+ public function getModifiedTime( ResourceLoaderContext $context ) {
+ $hash = $context->getHash();
+ if ( isset( $this->modifiedTime[$hash] ) ) {
+ return $this->modifiedTime[$hash];
+ }
+
+ global $wgUser;
+
+ if ( $context->getUser() === $wgUser->getName() ) {
+ return $this->modifiedTime[$hash] = $wgUser->getTouched();
+ } else {
+ return 1;
+ }
+ }
+
+ /**
+ * Fetch the context's user options, or if it doesn't match current user,
+ * the default options.
+ *
+ * @param $context ResourceLoaderContext: Context object
+ * @return Array: List of user options keyed by option name
+ */
+ protected function contextUserOptions( ResourceLoaderContext $context ) {
+ global $wgUser;
+
+ // Verify identity -- this is a private module
+ if ( $context->getUser() === $wgUser->getName() ) {
+ return $wgUser->getOptions();
+ } else {
+ return User::getDefaultOptions();
+ }
+ }
+
+ public function getScript( ResourceLoaderContext $context ) {
+ return Xml::encodeJsCall( 'mediaWiki.user.options.set',
+ array( $this->contextUserOptions( $context ) ) );
+ }
+
+ public function getStyles( ResourceLoaderContext $context ) {
+ global $wgAllowUserCssPrefs;
+
+ if ( $wgAllowUserCssPrefs ) {
+ $options = $this->contextUserOptions( $context );
+
+ // Build CSS rules
+ $rules = array();
+ if ( $options['underline'] < 2 ) {
+ $rules[] = "a { text-decoration: " .
+ ( $options['underline'] ? 'underline' : 'none' ) . "; }";
+ }
+ if ( $options['highlightbroken'] ) {
+ $rules[] = "a.new, #quickbar a.new { color: #ba0000; }\n";
+ } else {
+ $rules[] = "a.new, #quickbar a.new, a.stub, #quickbar a.stub { color: inherit; }";
+ $rules[] = "a.new:after, #quickbar a.new:after { content: '?'; color: #ba0000; }";
+ $rules[] = "a.stub:after, #quickbar a.stub:after { content: '!'; color: #772233; }";
+ }
+ if ( $options['justify'] ) {
+ $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
+ }
+ if ( !$options['showtoc'] ) {
+ $rules[] = "#toc { display: none; }\n";
+ }
+ if ( !$options['editsection'] ) {
+ $rules[] = ".editsection { display: none; }\n";
+ }
+ if ( $options['editfont'] !== 'default' ) {
+ $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
+ }
+ $style = implode( "\n", $rules );
+ if ( $this->getFlip( $context ) ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ return array( 'all' => $style );
+ }
+ return array();
+ }
+
+ public function getFlip( $context ) {
+ global $wgContLang;
+
+ return $wgContLang->getDir() !== $context->getDirection();
+ }
+
+ public function getGroup() {
+ return 'private';
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php
new file mode 100644
index 00000000..93e66eb0
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderWikiModule.php
@@ -0,0 +1,171 @@
+<?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
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+defined( 'MEDIAWIKI' ) || die( 1 );
+
+/**
+ * Abstraction for resource loader modules which pull from wiki pages
+ *
+ * This can only be used for wiki pages in the MediaWiki and User namespaces,
+ * because of its dependence on the functionality of
+ * Title::isValidCssJsSubpage.
+ */
+abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
+
+ /* Protected Members */
+
+ // In-object cache for title mtimes
+ protected $titleMtimes = array();
+
+ /* Abstract Protected Methods */
+
+ abstract protected function getPages( ResourceLoaderContext $context );
+
+ /* Protected Methods */
+
+ protected function getContent( $title ) {
+ if ( $title->getNamespace() === NS_MEDIAWIKI ) {
+ $dbkey = $title->getDBkey();
+ return wfEmptyMsg( $dbkey ) ? '' : wfMsgExt( $dbkey, 'content' );
+ }
+ if ( !$title->isCssJsSubpage() ) {
+ return null;
+ }
+ $revision = Revision::newFromTitle( $title );
+ if ( !$revision ) {
+ return null;
+ }
+ return $revision->getRawText();
+ }
+
+ /* Methods */
+
+ public function getScript( ResourceLoaderContext $context ) {
+ $scripts = '';
+ foreach ( $this->getPages( $context ) as $titleText => $options ) {
+ if ( $options['type'] !== 'script' ) {
+ continue;
+ }
+ $title = Title::newFromText( $titleText );
+ if ( !$title ) {
+ continue;
+ }
+ $script = $this->getContent( $title );
+ if ( strval( $script ) !== '' ) {
+ if ( strpos( $titleText, '*/' ) === false ) {
+ $scripts .= "/* $titleText */\n";
+ }
+ $scripts .= $script . "\n";
+ }
+ }
+ return $scripts;
+ }
+
+ public function getStyles( ResourceLoaderContext $context ) {
+ global $wgScriptPath;
+
+ $styles = array();
+ foreach ( $this->getPages( $context ) as $titleText => $options ) {
+ if ( $options['type'] !== 'style' ) {
+ continue;
+ }
+ $title = Title::newFromText( $titleText );
+ if ( !$title ) {
+ continue;
+ }
+ $media = isset( $options['media'] ) ? $options['media'] : 'all';
+ $style = $this->getContent( $title );
+ if ( strval( $style ) === '' ) {
+ continue;
+ }
+ if ( $this->getFlip( $context ) ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ $style = CSSMin::remap( $style, false, $wgScriptPath, true );
+ if ( !isset( $styles[$media] ) ) {
+ $styles[$media] = '';
+ }
+ if ( strpos( $titleText, '*/' ) === false ) {
+ $styles[$media] .= "/* $titleText */\n";
+ }
+ $styles[$media] .= $style . "\n";
+ }
+ return $styles;
+ }
+
+ public function getModifiedTime( ResourceLoaderContext $context ) {
+ $modifiedTime = 1; // wfTimestamp() interprets 0 as "now"
+ $mtimes = $this->getTitleMtimes( $context );
+ if ( count( $mtimes ) ) {
+ $modifiedTime = max( $modifiedTime, max( $mtimes ) );
+ }
+ return $modifiedTime;
+ }
+
+ public function isKnownEmpty( ResourceLoaderContext $context ) {
+ return count( $this->getTitleMtimes( $context ) ) == 0;
+ }
+
+ /**
+ * @param $context ResourceLoaderContext
+ * @return bool
+ */
+ public function getFlip( $context ) {
+ global $wgContLang;
+
+ return $wgContLang->getDir() !== $context->getDirection();
+ }
+
+ /**
+ * Get the modification times of all titles that would be loaded for
+ * a given context.
+ * @param $context ResourceLoaderContext: Context object
+ * @return array( prefixed DB key => UNIX timestamp ), nonexistent titles are dropped
+ */
+ protected function getTitleMtimes( ResourceLoaderContext $context ) {
+ $hash = $context->getHash();
+ if ( isset( $this->titleMtimes[$hash] ) ) {
+ return $this->titleMtimes[$hash];
+ }
+
+ $this->titleMtimes[$hash] = array();
+ $batch = new LinkBatch;
+ foreach ( $this->getPages( $context ) as $titleText => $options ) {
+ $batch->addObj( Title::newFromText( $titleText ) );
+ }
+
+ if ( !$batch->isEmpty() ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'page',
+ array( 'page_namespace', 'page_title', 'page_touched' ),
+ $batch->constructSet( 'page', $dbr ),
+ __METHOD__
+ );
+ foreach ( $res as $row ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ $this->titleMtimes[$hash][$title->getPrefixedDBkey()] =
+ wfTimestamp( TS_UNIX, $row->page_touched );
+ }
+ }
+ return $this->titleMtimes[$hash];
+ }
+}
diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php
new file mode 100644
index 00000000..00afb053
--- /dev/null
+++ b/includes/revisiondelete/RevisionDelete.php
@@ -0,0 +1,690 @@
+<?php
+/**
+ * List for revision table items
+ */
+class RevDel_RevisionList extends RevDel_List {
+ var $currentRevId;
+ var $type = 'revision';
+ var $idField = 'rev_id';
+ var $dateField = 'rev_timestamp';
+ var $authorIdField = 'rev_user';
+ var $authorNameField = 'rev_user_text';
+
+ public function doQuery( $db ) {
+ $ids = array_map( 'intval', $this->ids );
+ return $db->select( array('revision','page'), '*',
+ array(
+ 'rev_page' => $this->title->getArticleID(),
+ 'rev_id' => $ids,
+ 'rev_page = page_id'
+ ),
+ __METHOD__,
+ array( 'ORDER BY' => 'rev_id DESC' )
+ );
+ }
+
+ public function newItem( $row ) {
+ return new RevDel_RevisionItem( $this, $row );
+ }
+
+ public function getCurrent() {
+ if ( is_null( $this->currentRevId ) ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $this->currentRevId = $dbw->selectField(
+ 'page', 'page_latest', $this->title->pageCond(), __METHOD__ );
+ }
+ return $this->currentRevId;
+ }
+
+ public function getSuppressBit() {
+ return Revision::DELETED_RESTRICTED;
+ }
+
+ public function doPreCommitUpdates() {
+ $this->title->invalidateCache();
+ return Status::newGood();
+ }
+
+ public function doPostCommitUpdates() {
+ $this->title->purgeSquid();
+ // Extensions that require referencing previous revisions may need this
+ wfRunHooks( 'ArticleRevisionVisibilitySet', array( &$this->title ) );
+ return Status::newGood();
+ }
+}
+
+/**
+ * Item class for a revision table row
+ */
+class RevDel_RevisionItem extends RevDel_Item {
+ var $revision;
+
+ public function __construct( $list, $row ) {
+ parent::__construct( $list, $row );
+ $this->revision = new Revision( $row );
+ }
+
+ public function canView() {
+ return $this->revision->userCan( Revision::DELETED_RESTRICTED );
+ }
+
+ public function canViewContent() {
+ return $this->revision->userCan( Revision::DELETED_TEXT );
+ }
+
+ public function getBits() {
+ return $this->revision->mDeleted;
+ }
+
+ public function setBits( $bits ) {
+ $dbw = wfGetDB( DB_MASTER );
+ // Update revision table
+ $dbw->update( 'revision',
+ array( 'rev_deleted' => $bits ),
+ array(
+ 'rev_id' => $this->revision->getId(),
+ 'rev_page' => $this->revision->getPage(),
+ 'rev_deleted' => $this->getBits()
+ ),
+ __METHOD__
+ );
+ if ( !$dbw->affectedRows() ) {
+ // Concurrent fail!
+ return false;
+ }
+ // Update recentchanges table
+ $dbw->update( 'recentchanges',
+ array(
+ 'rc_deleted' => $bits,
+ 'rc_patrolled' => 1
+ ),
+ array(
+ 'rc_this_oldid' => $this->revision->getId(), // condition
+ // non-unique timestamp index
+ 'rc_timestamp' => $dbw->timestamp( $this->revision->getTimestamp() ),
+ ),
+ __METHOD__
+ );
+ return true;
+ }
+
+ public function isDeleted() {
+ return $this->revision->isDeleted( Revision::DELETED_TEXT );
+ }
+
+ public function isHideCurrentOp( $newBits ) {
+ return ( $newBits & Revision::DELETED_TEXT )
+ && $this->list->getCurrent() == $this->getId();
+ }
+
+ /**
+ * Get the HTML link to the revision text.
+ * Overridden by RevDel_ArchiveItem.
+ */
+ protected function getRevisionLink() {
+ global $wgLang;
+ $date = $wgLang->timeanddate( $this->revision->getTimestamp(), true );
+ if ( $this->isDeleted() && !$this->canViewContent() ) {
+ return $date;
+ }
+ return $this->special->skin->link(
+ $this->list->title,
+ $date,
+ array(),
+ array(
+ 'oldid' => $this->revision->getId(),
+ 'unhide' => 1
+ )
+ );
+ }
+
+ /**
+ * Get the HTML link to the diff.
+ * Overridden by RevDel_ArchiveItem
+ */
+ protected function getDiffLink() {
+ if ( $this->isDeleted() && !$this->canViewContent() ) {
+ return wfMsgHtml('diff');
+ } else {
+ return
+ $this->special->skin->link(
+ $this->list->title,
+ wfMsgHtml('diff'),
+ array(),
+ array(
+ 'diff' => $this->revision->getId(),
+ 'oldid' => 'prev',
+ 'unhide' => 1
+ ),
+ array(
+ 'known',
+ 'noclasses'
+ )
+ );
+ }
+ }
+
+ public function getHTML() {
+ $difflink = $this->getDiffLink();
+ $revlink = $this->getRevisionLink();
+ $userlink = $this->special->skin->revUserLink( $this->revision );
+ $comment = $this->special->skin->revComment( $this->revision );
+ if ( $this->isDeleted() ) {
+ $revlink = "<span class=\"history-deleted\">$revlink</span>";
+ }
+ return "<li>($difflink) $revlink $userlink $comment</li>";
+ }
+}
+
+/**
+ * List for archive table items, i.e. revisions deleted via action=delete
+ */
+class RevDel_ArchiveList extends RevDel_RevisionList {
+ var $type = 'archive';
+ var $idField = 'ar_timestamp';
+ var $dateField = 'ar_timestamp';
+ var $authorIdField = 'ar_user';
+ var $authorNameField = 'ar_user_text';
+
+ public function doQuery( $db ) {
+ $timestamps = array();
+ foreach ( $this->ids as $id ) {
+ $timestamps[] = $db->timestamp( $id );
+ }
+ return $db->select( 'archive', '*',
+ array(
+ 'ar_namespace' => $this->title->getNamespace(),
+ 'ar_title' => $this->title->getDBkey(),
+ 'ar_timestamp' => $timestamps
+ ),
+ __METHOD__,
+ array( 'ORDER BY' => 'ar_timestamp DESC' )
+ );
+ }
+
+ public function newItem( $row ) {
+ return new RevDel_ArchiveItem( $this, $row );
+ }
+
+ public function doPreCommitUpdates() {
+ return Status::newGood();
+ }
+
+ public function doPostCommitUpdates() {
+ return Status::newGood();
+ }
+}
+
+/**
+ * Item class for a archive table row
+ */
+class RevDel_ArchiveItem extends RevDel_RevisionItem {
+ public function __construct( $list, $row ) {
+ RevDel_Item::__construct( $list, $row );
+ $this->revision = Revision::newFromArchiveRow( $row,
+ array( 'page' => $this->list->title->getArticleId() ) );
+ }
+
+ public function getId() {
+ # Convert DB timestamp to MW timestamp
+ return $this->revision->getTimestamp();
+ }
+
+ public function setBits( $bits ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'archive',
+ array( 'ar_deleted' => $bits ),
+ array( 'ar_namespace' => $this->list->title->getNamespace(),
+ 'ar_title' => $this->list->title->getDBkey(),
+ // use timestamp for index
+ 'ar_timestamp' => $this->row->ar_timestamp,
+ 'ar_rev_id' => $this->row->ar_rev_id,
+ 'ar_deleted' => $this->getBits()
+ ),
+ __METHOD__ );
+ return (bool)$dbw->affectedRows();
+ }
+
+ protected function getRevisionLink() {
+ global $wgLang;
+ $undelete = SpecialPage::getTitleFor( 'Undelete' );
+ $date = $wgLang->timeanddate( $this->revision->getTimestamp(), true );
+ if ( $this->isDeleted() && !$this->canViewContent() ) {
+ return $date;
+ }
+ return $this->special->skin->link( $undelete, $date, array(),
+ array(
+ 'target' => $this->list->title->getPrefixedText(),
+ 'timestamp' => $this->revision->getTimestamp()
+ ) );
+ }
+
+ protected function getDiffLink() {
+ if ( $this->isDeleted() && !$this->canViewContent() ) {
+ return wfMsgHtml( 'diff' );
+ }
+ $undelete = SpecialPage::getTitleFor( 'Undelete' );
+ return $this->special->skin->link( $undelete, wfMsgHtml('diff'), array(),
+ array(
+ 'target' => $this->list->title->getPrefixedText(),
+ 'diff' => 'prev',
+ 'timestamp' => $this->revision->getTimestamp()
+ ) );
+ }
+}
+
+/**
+ * List for oldimage table items
+ */
+class RevDel_FileList extends RevDel_List {
+ var $type = 'oldimage';
+ var $idField = 'oi_archive_name';
+ var $dateField = 'oi_timestamp';
+ var $authorIdField = 'oi_user';
+ var $authorNameField = 'oi_user_text';
+ var $storeBatch, $deleteBatch, $cleanupBatch;
+
+ public function doQuery( $db ) {
+ $archiveNames = array();
+ foreach( $this->ids as $timestamp ) {
+ $archiveNames[] = $timestamp . '!' . $this->title->getDBkey();
+ }
+ return $db->select( 'oldimage', '*',
+ array(
+ 'oi_name' => $this->title->getDBkey(),
+ 'oi_archive_name' => $archiveNames
+ ),
+ __METHOD__,
+ array( 'ORDER BY' => 'oi_timestamp DESC' )
+ );
+ }
+
+ public function newItem( $row ) {
+ return new RevDel_FileItem( $this, $row );
+ }
+
+ public function clearFileOps() {
+ $this->deleteBatch = array();
+ $this->storeBatch = array();
+ $this->cleanupBatch = array();
+ }
+
+ public function doPreCommitUpdates() {
+ $status = Status::newGood();
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ if ( $this->storeBatch ) {
+ $status->merge( $repo->storeBatch( $this->storeBatch, FileRepo::OVERWRITE_SAME ) );
+ }
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+ if ( $this->deleteBatch ) {
+ $status->merge( $repo->deleteBatch( $this->deleteBatch ) );
+ }
+ if ( !$status->isOK() ) {
+ // Running cleanupDeletedBatch() after a failed storeBatch() with the DB already
+ // modified (but destined for rollback) causes data loss
+ return $status;
+ }
+ if ( $this->cleanupBatch ) {
+ $status->merge( $repo->cleanupDeletedBatch( $this->cleanupBatch ) );
+ }
+ return $status;
+ }
+
+ public function doPostCommitUpdates() {
+ $file = wfLocalFile( $this->title );
+ $file->purgeCache();
+ $file->purgeDescription();
+ return Status::newGood();
+ }
+
+ public function getSuppressBit() {
+ return File::DELETED_RESTRICTED;
+ }
+}
+
+/**
+ * Item class for an oldimage table row
+ */
+class RevDel_FileItem extends RevDel_Item {
+ var $file;
+
+ public function __construct( $list, $row ) {
+ parent::__construct( $list, $row );
+ $this->file = RepoGroup::singleton()->getLocalRepo()->newFileFromRow( $row );
+ }
+
+ public function getId() {
+ $parts = explode( '!', $this->row->oi_archive_name );
+ return $parts[0];
+ }
+
+ public function canView() {
+ return $this->file->userCan( File::DELETED_RESTRICTED );
+ }
+
+ public function canViewContent() {
+ return $this->file->userCan( File::DELETED_FILE );
+ }
+
+ public function getBits() {
+ return $this->file->getVisibility();
+ }
+
+ public function setBits( $bits ) {
+ # Queue the file op
+ # FIXME: move to LocalFile.php
+ if ( $this->isDeleted() ) {
+ if ( $bits & File::DELETED_FILE ) {
+ # Still deleted
+ } else {
+ # Newly undeleted
+ $key = $this->file->getStorageKey();
+ $srcRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
+ $this->list->storeBatch[] = array(
+ $this->file->repo->getVirtualUrl( 'deleted' ) . '/' . $srcRel,
+ 'public',
+ $this->file->getRel()
+ );
+ $this->list->cleanupBatch[] = $key;
+ }
+ } elseif ( $bits & File::DELETED_FILE ) {
+ # Newly deleted
+ $key = $this->file->getStorageKey();
+ $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
+ $this->list->deleteBatch[] = array( $this->file->getRel(), $dstRel );
+ }
+
+ # Do the database operations
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'oldimage',
+ array( 'oi_deleted' => $bits ),
+ array(
+ 'oi_name' => $this->row->oi_name,
+ 'oi_timestamp' => $this->row->oi_timestamp,
+ 'oi_deleted' => $this->getBits()
+ ),
+ __METHOD__
+ );
+ return (bool)$dbw->affectedRows();
+ }
+
+ public function isDeleted() {
+ return $this->file->isDeleted( File::DELETED_FILE );
+ }
+
+ /**
+ * Get the link to the file.
+ * Overridden by RevDel_ArchivedFileItem.
+ */
+ protected function getLink() {
+ global $wgLang, $wgUser;
+ $date = $wgLang->timeanddate( $this->file->getTimestamp(), true );
+ if ( $this->isDeleted() ) {
+ # Hidden files...
+ if ( !$this->canViewContent() ) {
+ $link = $date;
+ } else {
+ $link = $this->special->skin->link(
+ $this->special->getTitle(),
+ $date, array(),
+ array(
+ 'target' => $this->list->title->getPrefixedText(),
+ 'file' => $this->file->getArchiveName(),
+ 'token' => $wgUser->editToken( $this->file->getArchiveName() )
+ )
+ );
+ }
+ return '<span class="history-deleted">' . $link . '</span>';
+ } else {
+ # Regular files...
+ return Xml::element( 'a', array( 'href' => $this->file->getUrl() ), $date );
+ }
+ }
+ /**
+ * Generate a user tool link cluster if the current user is allowed to view it
+ * @return string HTML
+ */
+ protected function getUserTools() {
+ if( $this->file->userCan( Revision::DELETED_USER ) ) {
+ $link = $this->special->skin->userLink( $this->file->user, $this->file->user_text ) .
+ $this->special->skin->userToolLinks( $this->file->user, $this->file->user_text );
+ } else {
+ $link = wfMsgHtml( 'rev-deleted-user' );
+ }
+ if( $this->file->isDeleted( Revision::DELETED_USER ) ) {
+ return '<span class="history-deleted">' . $link . '</span>';
+ }
+ return $link;
+ }
+
+ /**
+ * Wrap and format the file's comment block, if the current
+ * user is allowed to view it.
+ *
+ * @return string HTML
+ */
+ protected function getComment() {
+ if( $this->file->userCan( File::DELETED_COMMENT ) ) {
+ $block = $this->special->skin->commentBlock( $this->file->description );
+ } else {
+ $block = ' ' . wfMsgHtml( 'rev-deleted-comment' );
+ }
+ if( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
+ return "<span class=\"history-deleted\">$block</span>";
+ }
+ return $block;
+ }
+
+ public function getHTML() {
+ global $wgLang;
+ $data =
+ wfMsg(
+ 'widthheight',
+ $wgLang->formatNum( $this->file->getWidth() ),
+ $wgLang->formatNum( $this->file->getHeight() )
+ ) .
+ ' (' .
+ wfMsgExt( 'nbytes', 'parsemag', $wgLang->formatNum( $this->file->getSize() ) ) .
+ ')';
+
+ return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
+ $data . ' ' . $this->getComment(). '</li>';
+ }
+}
+
+/**
+ * List for filearchive table items
+ */
+class RevDel_ArchivedFileList extends RevDel_FileList {
+ var $type = 'filearchive';
+ var $idField = 'fa_id';
+ var $dateField = 'fa_timestamp';
+ var $authorIdField = 'fa_user';
+ var $authorNameField = 'fa_user_text';
+
+ public function doQuery( $db ) {
+ $ids = array_map( 'intval', $this->ids );
+ return $db->select( 'filearchive', '*',
+ array(
+ 'fa_name' => $this->title->getDBkey(),
+ 'fa_id' => $ids
+ ),
+ __METHOD__,
+ array( 'ORDER BY' => 'fa_id DESC' )
+ );
+ }
+
+ public function newItem( $row ) {
+ return new RevDel_ArchivedFileItem( $this, $row );
+ }
+}
+
+/**
+ * Item class for a filearchive table row
+ */
+class RevDel_ArchivedFileItem extends RevDel_FileItem {
+ public function __construct( $list, $row ) {
+ RevDel_Item::__construct( $list, $row );
+ $this->file = ArchivedFile::newFromRow( $row );
+ }
+
+ public function getId() {
+ return $this->row->fa_id;
+ }
+
+ public function setBits( $bits ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'filearchive',
+ array( 'fa_deleted' => $bits ),
+ array(
+ 'fa_id' => $this->row->fa_id,
+ 'fa_deleted' => $this->getBits(),
+ ),
+ __METHOD__
+ );
+ return (bool)$dbw->affectedRows();
+ }
+
+ protected function getLink() {
+ global $wgLang, $wgUser;
+ $date = $wgLang->timeanddate( $this->file->getTimestamp(), true );
+ $undelete = SpecialPage::getTitleFor( 'Undelete' );
+ $key = $this->file->getKey();
+ # Hidden files...
+ if( !$this->canViewContent() ) {
+ $link = $date;
+ } else {
+ $link = $this->special->skin->link( $undelete, $date, array(),
+ array(
+ 'target' => $this->list->title->getPrefixedText(),
+ 'file' => $key,
+ 'token' => $wgUser->editToken( $key )
+ )
+ );
+ }
+ if( $this->isDeleted() ) {
+ $link = '<span class="history-deleted">' . $link . '</span>';
+ }
+ return $link;
+ }
+}
+
+/**
+ * List for logging table items
+ */
+class RevDel_LogList extends RevDel_List {
+ var $type = 'logging';
+ var $idField = 'log_id';
+ var $dateField = 'log_timestamp';
+ var $authorIdField = 'log_user';
+ var $authorNameField = 'log_user_text';
+
+ public function doQuery( $db ) {
+ $ids = array_map( 'intval', $this->ids );
+ return $db->select( 'logging', '*',
+ array( 'log_id' => $ids ),
+ __METHOD__,
+ array( 'ORDER BY' => 'log_id DESC' )
+ );
+ }
+
+ public function newItem( $row ) {
+ return new RevDel_LogItem( $this, $row );
+ }
+
+ public function getSuppressBit() {
+ return Revision::DELETED_RESTRICTED;
+ }
+
+ public function getLogAction() {
+ return 'event';
+ }
+
+ public function getLogParams( $params ) {
+ return array(
+ implode( ',', $params['ids'] ),
+ "ofield={$params['oldBits']}",
+ "nfield={$params['newBits']}"
+ );
+ }
+}
+
+/**
+ * Item class for a logging table row
+ */
+class RevDel_LogItem extends RevDel_Item {
+ public function canView() {
+ return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED );
+ }
+
+ public function canViewContent() {
+ return true; // none
+ }
+
+ public function getBits() {
+ return $this->row->log_deleted;
+ }
+
+ public function setBits( $bits ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'recentchanges',
+ array(
+ 'rc_deleted' => $bits,
+ 'rc_patrolled' => 1
+ ),
+ array(
+ 'rc_logid' => $this->row->log_id,
+ 'rc_timestamp' => $this->row->log_timestamp // index
+ ),
+ __METHOD__
+ );
+ $dbw->update( 'logging',
+ array( 'log_deleted' => $bits ),
+ array(
+ 'log_id' => $this->row->log_id,
+ 'log_deleted' => $this->getBits()
+ ),
+ __METHOD__
+ );
+ return (bool)$dbw->affectedRows();
+ }
+
+ public function getHTML() {
+ global $wgLang;
+
+ $date = htmlspecialchars( $wgLang->timeanddate( $this->row->log_timestamp ) );
+ $paramArray = LogPage::extractParams( $this->row->log_params );
+ $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title );
+
+ // Log link for this page
+ $loglink = $this->special->skin->link(
+ SpecialPage::getTitleFor( 'Log' ),
+ wfMsgHtml( 'log' ),
+ array(),
+ array( 'page' => $title->getPrefixedText() )
+ );
+ // Action text
+ if( !$this->canView() ) {
+ $action = '<span class="history-deleted">' . wfMsgHtml('rev-deleted-event') . '</span>';
+ } else {
+ $action = LogPage::actionText( $this->row->log_type, $this->row->log_action, $title,
+ $this->special->skin, $paramArray, true, true );
+ if( $this->row->log_deleted & LogPage::DELETED_ACTION )
+ $action = '<span class="history-deleted">' . $action . '</span>';
+ }
+ // User links
+ $userLink = $this->special->skin->userLink( $this->row->log_user,
+ User::WhoIs( $this->row->log_user ) );
+ if( LogEventsList::isDeleted($this->row,LogPage::DELETED_USER) ) {
+ $userLink = '<span class="history-deleted">' . $userLink . '</span>';
+ }
+ // Comment
+ $comment = $wgLang->getDirMark() . $this->special->skin->commentBlock( $this->row->log_comment );
+ if( LogEventsList::isDeleted($this->row,LogPage::DELETED_COMMENT) ) {
+ $comment = '<span class="history-deleted">' . $comment . '</span>';
+ }
+ return "<li>($loglink) $date $userLink $action $comment</li>";
+ }
+}
diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php
new file mode 100644
index 00000000..073c25ba
--- /dev/null
+++ b/includes/revisiondelete/RevisionDeleteAbstracts.php
@@ -0,0 +1,454 @@
+<?php
+
+/**
+ * Abstract base class for a list of deletable items
+ */
+abstract class RevDel_List {
+ var $special, $title, $ids, $res, $current;
+ var $type = null; // override this
+ var $idField = null; // override this
+ var $dateField = false; // override this
+ var $authorIdField = false; // override this
+ var $authorNameField = false; // override this
+
+ /**
+ * @param $special The parent SpecialPage
+ * @param $title The target title
+ * @param $ids Array of IDs
+ */
+ public function __construct( $special, $title, $ids ) {
+ $this->special = $special;
+ $this->title = $title;
+ $this->ids = $ids;
+ }
+
+ /**
+ * Get the internal type name of this list. Equal to the table name.
+ */
+ public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * Get the DB field name associated with the ID list
+ */
+ public function getIdField() {
+ return $this->idField;
+ }
+
+ /**
+ * Get the DB field name storing timestamps
+ */
+ public function getTimestampField() {
+ return $this->dateField;
+ }
+
+ /**
+ * Get the DB field name storing user ids
+ */
+ public function getAuthorIdField() {
+ return $this->authorIdField;
+ }
+
+ /**
+ * Get the DB field name storing user names
+ */
+ public function getAuthorNameField() {
+ return $this->authorNameField;
+ }
+ /**
+ * Set the visibility for the revisions in this list. Logging and
+ * transactions are done here.
+ *
+ * @param $params Associative array of parameters. Members are:
+ * value: The integer value to set the visibility to
+ * comment: The log comment.
+ * @return Status
+ */
+ public function setVisibility( $params ) {
+ $bitPars = $params['value'];
+ $comment = $params['comment'];
+
+ $this->res = false;
+ $dbw = wfGetDB( DB_MASTER );
+ $this->doQuery( $dbw );
+ $dbw->begin();
+ $status = Status::newGood();
+ $missing = array_flip( $this->ids );
+ $this->clearFileOps();
+ $idsForLog = array();
+ $authorIds = $authorIPs = array();
+
+ for ( $this->reset(); $this->current(); $this->next() ) {
+ $item = $this->current();
+ unset( $missing[ $item->getId() ] );
+
+ $oldBits = $item->getBits();
+ // Build the actual new rev_deleted bitfield
+ $newBits = SpecialRevisionDelete::extractBitfield( $bitPars, $oldBits );
+
+ if ( $oldBits == $newBits ) {
+ $status->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
+ $status->failCount++;
+ continue;
+ } elseif ( $oldBits == 0 && $newBits != 0 ) {
+ $opType = 'hide';
+ } elseif ( $oldBits != 0 && $newBits == 0 ) {
+ $opType = 'show';
+ } else {
+ $opType = 'modify';
+ }
+
+ if ( $item->isHideCurrentOp( $newBits ) ) {
+ // Cannot hide current version text
+ $status->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
+ $status->failCount++;
+ continue;
+ }
+ if ( !$item->canView() ) {
+ // Cannot access this revision
+ $msg = ($opType == 'show') ?
+ 'revdelete-show-no-access' : 'revdelete-modify-no-access';
+ $status->error( $msg, $item->formatDate(), $item->formatTime() );
+ $status->failCount++;
+ continue;
+ }
+ // Cannot just "hide from Sysops" without hiding any fields
+ if( $newBits == Revision::DELETED_RESTRICTED ) {
+ $status->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
+ $status->failCount++;
+ continue;
+ }
+
+ // Update the revision
+ $ok = $item->setBits( $newBits );
+
+ if ( $ok ) {
+ $idsForLog[] = $item->getId();
+ $status->successCount++;
+ if( $item->getAuthorId() > 0 ) {
+ $authorIds[] = $item->getAuthorId();
+ } else if( IP::isIPAddress( $item->getAuthorName() ) ) {
+ $authorIPs[] = $item->getAuthorName();
+ }
+ } else {
+ $status->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
+ $status->failCount++;
+ }
+ }
+
+ // Handle missing revisions
+ foreach ( $missing as $id => $unused ) {
+ $status->error( 'revdelete-modify-missing', $id );
+ $status->failCount++;
+ }
+
+ if ( $status->successCount == 0 ) {
+ $status->ok = false;
+ $dbw->rollback();
+ return $status;
+ }
+
+ // Save success count
+ $successCount = $status->successCount;
+
+ // Move files, if there are any
+ $status->merge( $this->doPreCommitUpdates() );
+ if ( !$status->isOK() ) {
+ // Fatal error, such as no configured archive directory
+ $dbw->rollback();
+ return $status;
+ }
+
+ // Log it
+ $this->updateLog( array(
+ 'title' => $this->title,
+ 'count' => $successCount,
+ 'newBits' => $newBits,
+ 'oldBits' => $oldBits,
+ 'comment' => $comment,
+ 'ids' => $idsForLog,
+ 'authorIds' => $authorIds,
+ 'authorIPs' => $authorIPs
+ ) );
+ $dbw->commit();
+
+ // Clear caches
+ $status->merge( $this->doPostCommitUpdates() );
+ return $status;
+ }
+
+ /**
+ * Reload the list data from the master DB. This can be done after setVisibility()
+ * to allow $item->getHTML() to show the new data.
+ */
+ function reloadFromMaster() {
+ $dbw = wfGetDB( DB_MASTER );
+ $this->res = $this->doQuery( $dbw );
+ }
+
+ /**
+ * Record a log entry on the action
+ * @param $params Associative array of parameters:
+ * newBits: The new value of the *_deleted bitfield
+ * oldBits: The old value of the *_deleted bitfield.
+ * title: The target title
+ * ids: The ID list
+ * comment: The log comment
+ * authorsIds: The array of the user IDs of the offenders
+ * authorsIPs: The array of the IP/anon user offenders
+ */
+ protected function updateLog( $params ) {
+ // Get the URL param's corresponding DB field
+ $field = RevisionDeleter::getRelationType( $this->getType() );
+ if( !$field ) {
+ throw new MWException( "Bad log URL param type!" );
+ }
+ // Put things hidden from sysops in the oversight log
+ if ( ( $params['newBits'] | $params['oldBits'] ) & $this->getSuppressBit() ) {
+ $logType = 'suppress';
+ } else {
+ $logType = 'delete';
+ }
+ // Add params for effected page and ids
+ $logParams = $this->getLogParams( $params );
+ // Actually add the deletion log entry
+ $log = new LogPage( $logType );
+ $logid = $log->addEntry( $this->getLogAction(), $params['title'],
+ $params['comment'], $logParams );
+ // Allow for easy searching of deletion log items for revision/log items
+ $log->addRelations( $field, $params['ids'], $logid );
+ $log->addRelations( 'target_author_id', $params['authorIds'], $logid );
+ $log->addRelations( 'target_author_ip', $params['authorIPs'], $logid );
+ }
+
+ /**
+ * Get the log action for this list type
+ */
+ public function getLogAction() {
+ return 'revision';
+ }
+
+ /**
+ * Get log parameter array.
+ * @param $params Associative array of log parameters, same as updateLog()
+ * @return array
+ */
+ public function getLogParams( $params ) {
+ return array(
+ $this->getType(),
+ implode( ',', $params['ids'] ),
+ "ofield={$params['oldBits']}",
+ "nfield={$params['newBits']}"
+ );
+ }
+
+ /**
+ * Initialise the current iteration pointer
+ */
+ protected function initCurrent() {
+ $row = $this->res->current();
+ if ( $row ) {
+ $this->current = $this->newItem( $row );
+ } else {
+ $this->current = false;
+ }
+ }
+
+ /**
+ * Start iteration. This must be called before current() or next().
+ * @return First list item
+ */
+ public function reset() {
+ if ( !$this->res ) {
+ $this->res = $this->doQuery( wfGetDB( DB_SLAVE ) );
+ } else {
+ $this->res->rewind();
+ }
+ $this->initCurrent();
+ return $this->current;
+ }
+
+ /**
+ * Get the current list item, or false if we are at the end
+ */
+ public function current() {
+ return $this->current;
+ }
+
+ /**
+ * Move the iteration pointer to the next list item, and return it.
+ */
+ public function next() {
+ $this->res->next();
+ $this->initCurrent();
+ return $this->current;
+ }
+
+ /**
+ * Get the number of items in the list.
+ */
+ public function length() {
+ if( !$this->res ) {
+ return 0;
+ } else {
+ return $this->res->numRows();
+ }
+ }
+
+ /**
+ * Clear any data structures needed for doPreCommitUpdates() and doPostCommitUpdates()
+ * STUB
+ */
+ public function clearFileOps() {
+ }
+
+ /**
+ * A hook for setVisibility(): do batch updates pre-commit.
+ * STUB
+ * @return Status
+ */
+ public function doPreCommitUpdates() {
+ return Status::newGood();
+ }
+
+ /**
+ * A hook for setVisibility(): do any necessary updates post-commit.
+ * STUB
+ * @return Status
+ */
+ public function doPostCommitUpdates() {
+ return Status::newGood();
+ }
+
+ /**
+ * Create an item object from a DB result row
+ * @param $row stdclass
+ */
+ abstract public function newItem( $row );
+
+ /**
+ * Do the DB query to iterate through the objects.
+ * @param $db Database object to use for the query
+ */
+ abstract public function doQuery( $db );
+
+ /**
+ * Get the integer value of the flag used for suppression
+ */
+ abstract public function getSuppressBit();
+}
+
+/**
+ * Abstract base class for deletable items
+ */
+abstract class RevDel_Item {
+ /** The parent SpecialPage */
+ var $special;
+
+ /** The parent RevDel_List */
+ var $list;
+
+ /** The DB result row */
+ var $row;
+
+ /**
+ * @param $list RevDel_List
+ * @param $row DB result row
+ */
+ public function __construct( $list, $row ) {
+ $this->special = $list->special;
+ $this->list = $list;
+ $this->row = $row;
+ }
+
+ /**
+ * Get the ID, as it would appear in the ids URL parameter
+ */
+ public function getId() {
+ $field = $this->list->getIdField();
+ return $this->row->$field;
+ }
+
+ /**
+ * Get the date, formatted with $wgLang
+ */
+ public function formatDate() {
+ global $wgLang;
+ return $wgLang->date( $this->getTimestamp() );
+ }
+
+ /**
+ * Get the time, formatted with $wgLang
+ */
+ public function formatTime() {
+ global $wgLang;
+ return $wgLang->time( $this->getTimestamp() );
+ }
+
+ /**
+ * Get the timestamp in MW 14-char form
+ */
+ public function getTimestamp() {
+ $field = $this->list->getTimestampField();
+ return wfTimestamp( TS_MW, $this->row->$field );
+ }
+
+ /**
+ * Get the author user ID
+ */
+ public function getAuthorId() {
+ $field = $this->list->getAuthorIdField();
+ return intval( $this->row->$field );
+ }
+
+ /**
+ * Get the author user name
+ */
+ public function getAuthorName() {
+ $field = $this->list->getAuthorNameField();
+ return strval( $this->row->$field );
+ }
+
+ /**
+ * Returns true if the item is "current", and the operation to set the given
+ * bits can't be executed for that reason
+ * STUB
+ */
+ public function isHideCurrentOp( $newBits ) {
+ return false;
+ }
+
+ /**
+ * Returns true if the current user can view the item
+ */
+ abstract public function canView();
+
+ /**
+ * Returns true if the current user can view the item text/file
+ */
+ abstract public function canViewContent();
+
+ /**
+ * Get the current deletion bitfield value
+ */
+ abstract public function getBits();
+
+ /**
+ * Get the HTML of the list item. Should be include <li></li> tags.
+ * This is used to show the list in HTML form, by the special page.
+ */
+ abstract public function getHTML();
+
+ /**
+ * Set the visibility of the item. This should do any necessary DB queries.
+ *
+ * The DB update query should have a condition which forces it to only update
+ * if the value in the DB matches the value fetched earlier with the SELECT.
+ * If the update fails because it did not match, the function should return
+ * false. This prevents concurrency problems.
+ *
+ * @return boolean success
+ */
+ abstract public function setBits( $newBits );
+}
diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php
new file mode 100644
index 00000000..d47fcecf
--- /dev/null
+++ b/includes/revisiondelete/RevisionDeleter.php
@@ -0,0 +1,270 @@
+<?php
+/**
+ * Revision/log/file deletion backend
+ *
+ * @file
+ */
+
+/**
+ * Temporary b/c interface, collection of static functions.
+ * @ingroup SpecialPage
+ */
+class RevisionDeleter {
+ /**
+ * Checks for a change in the bitfield for a certain option and updates the
+ * provided array accordingly.
+ *
+ * @param $desc String: description to add to the array if the option was
+ * enabled / disabled.
+ * @param $field Integer: the bitmask describing the single option.
+ * @param $diff Integer: the xor of the old and new bitfields.
+ * @param $new Integer: the new bitfield
+ * @param $arr Array: the array to update.
+ */
+ protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
+ if( $diff & $field ) {
+ $arr[ ( $new & $field ) ? 0 : 1 ][] = $desc;
+ }
+ }
+
+ /**
+ * Gets an array of message keys describing the changes made to the visibility
+ * of the revision. If the resulting array is $arr, then $arr[0] will contain an
+ * array of strings describing the items that were hidden, $arr[2] will contain
+ * an array of strings describing the items that were unhidden, and $arr[3] will
+ * contain an array with a single string, which can be one of "applied
+ * restrictions to sysops", "removed restrictions from sysops", or null.
+ *
+ * @param $n Integer: the new bitfield.
+ * @param $o Integer: the old bitfield.
+ * @return An array as described above.
+ */
+ protected static function getChanges( $n, $o ) {
+ $diff = $n ^ $o;
+ $ret = array( 0 => array(), 1 => array(), 2 => array() );
+ // Build bitfield changes in language
+ self::checkItem( 'revdelete-content',
+ Revision::DELETED_TEXT, $diff, $n, $ret );
+ self::checkItem( 'revdelete-summary',
+ Revision::DELETED_COMMENT, $diff, $n, $ret );
+ self::checkItem( 'revdelete-uname',
+ Revision::DELETED_USER, $diff, $n, $ret );
+ // Restriction application to sysops
+ if( $diff & Revision::DELETED_RESTRICTED ) {
+ if( $n & Revision::DELETED_RESTRICTED )
+ $ret[2][] = 'revdelete-restricted';
+ else
+ $ret[2][] = 'revdelete-unrestricted';
+ }
+ return $ret;
+ }
+
+ /**
+ * Gets a log message to describe the given revision visibility change. This
+ * message will be of the form "[hid {content, edit summary, username}];
+ * [unhid {...}][applied restrictions to sysops] for $count revisions: $comment".
+ *
+ * @param $count Integer: The number of effected revisions.
+ * @param $nbitfield Integer: The new bitfield for the revision.
+ * @param $obitfield Integer: The old bitfield for the revision.
+ * @param $isForLog Boolean
+ * @param $forContent Boolean
+ */
+ public static function getLogMessage( $count, $nbitfield, $obitfield, $isForLog = false, $forContent = false ) {
+ global $wgLang, $wgContLang;
+
+ $lang = $forContent ? $wgContLang : $wgLang;
+ $msgFunc = $forContent ? "wfMsgForContent" : "wfMsg";
+
+ $changes = self::getChanges( $nbitfield, $obitfield );
+ array_walk($changes, 'RevisionDeleter::expandMessageArray', $forContent);
+
+ $changesText = array();
+
+ if( count( $changes[0] ) ) {
+ $changesText[] = $msgFunc( 'revdelete-hid', $lang->commaList( $changes[0] ) );
+ }
+ if( count( $changes[1] ) ) {
+ $changesText[] = $msgFunc( 'revdelete-unhid', $lang->commaList( $changes[1] ) );
+ }
+
+ $s = $lang->semicolonList( $changesText );
+ if( count( $changes[2] ) ) {
+ $s .= $s ? ' (' . $changes[2][0] . ')' : ' ' . $changes[2][0];
+ }
+
+ $msg = $isForLog ? 'logdelete-log-message' : 'revdelete-log-message';
+ return wfMsgExt( $msg, $forContent ? array( 'parsemag', 'content' ) : array( 'parsemag' ), $s, $lang->formatNum($count) );
+ }
+
+ private static function expandMessageArray(& $msg, $key, $forContent) {
+ if ( is_array ($msg) ) {
+ array_walk($msg, 'RevisionDeleter::expandMessageArray', $forContent);
+ } else {
+ if ( $forContent ) {
+ $msg = wfMsgForContent($msg);
+ } else {
+ $msg = wfMsg($msg);
+ }
+ }
+ }
+
+ // Get DB field name for URL param...
+ // Future code for other things may also track
+ // other types of revision-specific changes.
+ // @returns string One of log_id/rev_id/fa_id/ar_timestamp/oi_archive_name
+ public static function getRelationType( $typeName ) {
+ if ( isset( SpecialRevisionDelete::$deprecatedTypeMap[$typeName] ) ) {
+ $typeName = SpecialRevisionDelete::$deprecatedTypeMap[$typeName];
+ }
+ if ( isset( SpecialRevisionDelete::$allowedTypes[$typeName] ) ) {
+ $class = SpecialRevisionDelete::$allowedTypes[$typeName]['list-class'];
+ $list = new $class( null, null, null );
+ return $list->getIdField();
+ } else {
+ return null;
+ }
+ }
+
+ // Checks if a revision still exists in the revision table.
+ // If it doesn't, returns the corresponding ar_timestamp field
+ // so that this key can be used instead.
+ public static function checkRevisionExistence( $title, $revid ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $exists = $dbr->selectField( 'revision', '1',
+ array( 'rev_id' => $revid ), __METHOD__ );
+
+ if ( $exists ) {
+ return true;
+ }
+
+ $timestamp = $dbr->selectField( 'archive', 'ar_timestamp',
+ array( 'ar_namespace' => $title->getNamespace(),
+ 'ar_title' => $title->getDBkey(),
+ 'ar_rev_id' => $revid ), __METHOD__ );
+
+ return $timestamp;
+ }
+
+ // Creates utility links for log entries.
+ public static function getLogLinks( $title, $paramArray, $skin, $messages ) {
+ global $wgLang;
+
+ if( count($paramArray) >= 2 ) {
+ // Different revision types use different URL params...
+ $originalKey = $key = $paramArray[0];
+ // $paramArray[1] is a CSV of the IDs
+ $Ids = explode( ',', $paramArray[1] );
+
+ $revert = array();
+
+ // For if undeleted revisions are found amidst deleted ones.
+ $undeletedRevisions = array();
+
+ // This is not going to work if some revs are deleted and some
+ // aren't.
+ if ($key == 'revision') {
+ foreach( $Ids as $k => $id ) {
+ $existResult =
+ self::checkRevisionExistence( $title, $id );
+
+ if ($existResult !== true) {
+ $key = 'archive';
+ $Ids[$k] = $existResult;
+ } else {
+ // Undeleted revision amidst deleted ones
+ unset($Ids[$k]);
+ $undeletedRevisions[] = $id;
+ }
+ }
+
+ if ( $key == $originalKey ) {
+ $Ids = $undeletedRevisions;
+ $undeletedRevisions = array();
+ }
+ }
+
+ // Diff link for single rev deletions
+ if( count($Ids) == 1 && !count($undeletedRevisions) ) {
+ // Live revision diffs...
+ if( in_array( $key, array( 'oldid', 'revision' ) ) ) {
+ $revert[] = $skin->link(
+ $title,
+ $messages['diff'],
+ array(),
+ array(
+ 'diff' => intval( $Ids[0] ),
+ 'unhide' => 1
+ ),
+ array( 'known', 'noclasses' )
+ );
+ // Deleted revision diffs...
+ } else if( in_array( $key, array( 'artimestamp','archive' ) ) ) {
+ $revert[] = $skin->link(
+ SpecialPage::getTitleFor( 'Undelete' ),
+ $messages['diff'],
+ array(),
+ array(
+ 'target' => $title->getPrefixedDBKey(),
+ 'diff' => 'prev',
+ 'timestamp' => $Ids[0]
+ ),
+ array( 'known', 'noclasses' )
+ );
+ }
+ }
+
+ // View/modify link...
+ if ( count($undeletedRevisions) ) {
+ // FIXME THIS IS A HORRIBLE HORRIBLE HACK AND SHOULD DIE
+ // It's not possible to pass a list of both deleted and
+ // undeleted revisions to SpecialRevisionDelete, so we're
+ // stuck with two links. See bug 23363.
+ $restoreLinks = array();
+
+ $restoreLinks[] = $skin->link(
+ SpecialPage::getTitleFor( 'Revisiondelete' ),
+ $messages['revdel-restore-visible'],
+ array(),
+ array(
+ 'target' => $title->getPrefixedText(),
+ 'type' => $originalKey,
+ 'ids' => implode(',', $undeletedRevisions),
+ ),
+ array( 'known', 'noclasses' )
+ );
+
+ $restoreLinks[] = $skin->link(
+ SpecialPage::getTitleFor( 'Revisiondelete' ),
+ $messages['revdel-restore-deleted'],
+ array(),
+ array(
+ 'target' => $title->getPrefixedText(),
+ 'type' => $key,
+ 'ids' => implode(',', $Ids),
+ ),
+ array( 'known', 'noclasses' )
+ );
+
+ $revert[] = $messages['revdel-restore'] . ' [' .
+ $wgLang->pipeList( $restoreLinks ) . ']';
+ } else {
+ $revert[] = $skin->link(
+ SpecialPage::getTitleFor( 'Revisiondelete' ),
+ $messages['revdel-restore'],
+ array(),
+ array(
+ 'target' => $title->getPrefixedText(),
+ 'type' => $key,
+ 'ids' => implode(',', $Ids),
+ ),
+ array( 'known', 'noclasses' )
+ );
+ }
+
+ // Pipe links
+ return wfMsg( 'parentheses', $wgLang->pipeList( $revert ) );
+ }
+ return '';
+ }
+} \ No newline at end of file
diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php
index f4ca700d..17482da2 100644
--- a/includes/search/SearchEngine.php
+++ b/includes/search/SearchEngine.php
@@ -1,12 +1,16 @@
<?php
/**
- * @defgroup Search Search
+ * Basic search engine
*
* @file
* @ingroup Search
*/
/**
+ * @defgroup Search Search
+ */
+
+/**
* Contain a class for special pages
* @ingroup Search
*/
@@ -18,6 +22,14 @@ class SearchEngine {
var $namespaces = array( NS_MAIN );
var $showRedirects = false;
+ function __construct($db = null) {
+ if ( $db ) {
+ $this->db = $db;
+ } else {
+ $this->db = wfGetDB( DB_SLAVE );
+ }
+ }
+
/**
* Perform a full text search query and return a result set.
* If title searches are not supported or disabled, return null.
@@ -41,12 +53,12 @@ class SearchEngine {
function searchTitle( $term ) {
return null;
}
-
+
/** If this search backend can list/unlist redirects */
function acceptListRedirects() {
return true;
}
-
+
/**
* When overridden in derived class, performs database-specific conversions
* on text to be used for searching or updating search index.
@@ -56,7 +68,10 @@ class SearchEngine {
* @return string
*/
public function normalizeText( $string ) {
- return $string;
+ global $wgContLang;
+
+ // Some languages such as Chinese require word segmentation
+ return $wgContLang->segmentByWord( $string );
}
/**
@@ -66,7 +81,7 @@ class SearchEngine {
function transformSearchTerm( $term ) {
return $term;
}
-
+
/**
* If an exact title match can be found, or a very slightly close match,
* return the title. If no match, returns NULL.
@@ -76,41 +91,53 @@ class SearchEngine {
*/
public static function getNearMatch( $searchterm ) {
$title = self::getNearMatchInternal( $searchterm );
-
+
wfRunHooks( 'SearchGetNearMatchComplete', array( $searchterm, &$title ) );
return $title;
}
/**
+ * Do a near match (see SearchEngine::getNearMatch) and wrap it into a
+ * SearchResultSet.
+ *
+ * @param $searchterm string
+ * @return SearchResultSet
+ */
+ public static function getNearMatchResultSet( $searchterm ) {
+ return new SearchNearMatchResultSet( self::getNearMatch( $searchterm ) );
+ }
+
+ /**
* Really find the title match.
*/
private static function getNearMatchInternal( $searchterm ) {
global $wgContLang;
- $allSearchTerms = array($searchterm);
+ $allSearchTerms = array( $searchterm );
if ( $wgContLang->hasVariants() ) {
- $allSearchTerms = array_merge($allSearchTerms,$wgContLang->convertLinkToAllVariants($searchterm));
+ $allSearchTerms = array_merge( $allSearchTerms, $wgContLang->autoConvertToAllVariants( $searchterm ) );
}
- if( !wfRunHooks( 'SearchGetNearMatchBefore', array( $allSearchTerms, &$titleResult ) ) ) {
+ $titleResult = null;
+ if ( !wfRunHooks( 'SearchGetNearMatchBefore', array( $allSearchTerms, &$titleResult ) ) ) {
return $titleResult;
}
- foreach($allSearchTerms as $term) {
+ foreach ( $allSearchTerms as $term ) {
# Exact match? No need to look further.
$title = Title::newFromText( $term );
- if (is_null($title))
+ if ( is_null( $title ) )
return null;
if ( $title->getNamespace() == NS_SPECIAL || $title->isExternal() || $title->exists() ) {
return $title;
}
-
+
# See if it still otherwise has content is some sane sense
$article = MediaWiki::articleFromTitle( $title );
- if( $article->hasViewableContent() ) {
+ if ( $article->hasViewableContent() ) {
return $title;
}
@@ -136,14 +163,14 @@ class SearchEngine {
}
# Now try Word-Caps-Breaking-At-Word-Breaks, for hyphenated names etc
- $title = Title::newFromText( $wgContLang->ucwordbreaks($term) );
+ $title = Title::newFromText( $wgContLang->ucwordbreaks( $term ) );
if ( $title && $title->exists() ) {
return $title;
}
// Give hooks a chance at better match variants
$title = null;
- if( !wfRunHooks( 'SearchGetNearMatch', array( $term, &$title ) ) ) {
+ if ( !wfRunHooks( 'SearchGetNearMatch', array( $term, &$title ) ) ) {
return $title;
}
}
@@ -151,7 +178,7 @@ class SearchEngine {
$title = Title::newFromText( $searchterm );
# Entering an IP address goes to the contributions page
- if ( ( $title->getNamespace() == NS_USER && User::isIP($title->getText() ) )
+ if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
|| User::isIP( trim( $searchterm ) ) ) {
return SpecialPage::getTitleFor( 'Contributions', $title->getDBkey() );
}
@@ -165,22 +192,22 @@ class SearchEngine {
# Go to images that exist even if there's no local page.
# There may have been a funny upload, or it may be on a shared
# file repository such as Wikimedia Commons.
- if( $title->getNamespace() == NS_FILE ) {
+ if ( $title->getNamespace() == NS_FILE ) {
$image = wfFindFile( $title );
- if( $image ) {
+ if ( $image ) {
return $title;
}
}
# MediaWiki namespace? Page may be "implied" if not customized.
# Just return it, with caps forced as the message system likes it.
- if( $title->getNamespace() == NS_MEDIAWIKI ) {
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
return Title::makeTitle( NS_MEDIAWIKI, $wgContLang->ucfirst( $title->getText() ) );
}
# Quoted term? Try without the quotes...
$matches = array();
- if( preg_match( '/^"([^"]+)"$/', $searchterm, $matches ) ) {
+ if ( preg_match( '/^"([^"]+)"$/', $searchterm, $matches ) ) {
return SearchEngine::getNearMatch( $matches[1] );
}
@@ -219,28 +246,28 @@ class SearchEngine {
*
* @param $query String
*/
- function replacePrefixes( $query ){
+ function replacePrefixes( $query ) {
global $wgContLang;
$parsed = $query;
- if( strpos($query,':') === false ) { // nothing to do
+ if ( strpos( $query, ':' ) === false ) { // nothing to do
wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
return $parsed;
}
-
- $allkeyword = wfMsgForContent('searchall').":";
- if( strncmp($query, $allkeyword, strlen($allkeyword)) == 0 ){
+
+ $allkeyword = wfMsgForContent( 'searchall' ) . ":";
+ if ( strncmp( $query, $allkeyword, strlen( $allkeyword ) ) == 0 ) {
$this->namespaces = null;
- $parsed = substr($query,strlen($allkeyword));
- } else if( strpos($query,':') !== false ) {
- $prefix = substr($query,0,strpos($query,':'));
- $index = $wgContLang->getNsIndex($prefix);
- if($index !== false){
- $this->namespaces = array($index);
- $parsed = substr($query,strlen($prefix)+1);
+ $parsed = substr( $query, strlen( $allkeyword ) );
+ } else if ( strpos( $query, ':' ) !== false ) {
+ $prefix = substr( $query, 0, strpos( $query, ':' ) );
+ $index = $wgContLang->getNsIndex( $prefix );
+ if ( $index !== false ) {
+ $this->namespaces = array( $index );
+ $parsed = substr( $query, strlen( $prefix ) + 1 );
}
}
- if(trim($parsed) == '')
+ if ( trim( $parsed ) == '' )
$parsed = $query; // prefix was the whole query
wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
@@ -255,16 +282,16 @@ class SearchEngine {
public static function searchableNamespaces() {
global $wgContLang;
$arr = array();
- foreach( $wgContLang->getNamespaces() as $ns => $name ) {
- if( $ns >= NS_MAIN ) {
+ foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
+ if ( $ns >= NS_MAIN ) {
$arr[$ns] = $name;
}
}
-
+
wfRunHooks( 'SearchableNamespaces', array( &$arr ) );
return $arr;
}
-
+
/**
* Extract default namespaces to search from the given user's
* settings, returning a list of index numbers.
@@ -274,78 +301,78 @@ class SearchEngine {
*/
public static function userNamespaces( $user ) {
global $wgSearchEverythingOnlyLoggedIn;
-
+
// get search everything preference, that can be set to be read for logged-in users
$searcheverything = false;
- if( ( $wgSearchEverythingOnlyLoggedIn && $user->isLoggedIn() )
+ if ( ( $wgSearchEverythingOnlyLoggedIn && $user->isLoggedIn() )
|| !$wgSearchEverythingOnlyLoggedIn )
- $searcheverything = $user->getOption('searcheverything');
-
- // searcheverything overrides other options
- if( $searcheverything )
- return array_keys(SearchEngine::searchableNamespaces());
-
+ $searcheverything = $user->getOption( 'searcheverything' );
+
+ // searcheverything overrides other options
+ if ( $searcheverything )
+ return array_keys( SearchEngine::searchableNamespaces() );
+
$arr = Preferences::loadOldSearchNs( $user );
$searchableNamespaces = SearchEngine::searchableNamespaces();
-
- $arr = array_intersect( $arr, array_keys($searchableNamespaces) ); // Filter
-
+
+ $arr = array_intersect( $arr, array_keys( $searchableNamespaces ) ); // Filter
+
return $arr;
}
-
+
/**
* Find snippet highlight settings for a given user
*
* @param $user User
- * @return Array contextlines, contextchars
+ * @return Array contextlines, contextchars
*/
- public static function userHighlightPrefs( &$user ){
- //$contextlines = $user->getOption( 'contextlines', 5 );
- //$contextchars = $user->getOption( 'contextchars', 50 );
+ public static function userHighlightPrefs( &$user ) {
+ // $contextlines = $user->getOption( 'contextlines', 5 );
+ // $contextchars = $user->getOption( 'contextchars', 50 );
$contextlines = 2; // Hardcode this. Old defaults sucked. :)
$contextchars = 75; // same as above.... :P
- return array($contextlines, $contextchars);
+ return array( $contextlines, $contextchars );
}
-
+
/**
* An array of namespaces indexes to be searched by default
- *
- * @return Array
+ *
+ * @return Array
*/
- public static function defaultNamespaces(){
+ public static function defaultNamespaces() {
global $wgNamespacesToBeSearchedDefault;
-
- return array_keys($wgNamespacesToBeSearchedDefault, true);
+
+ return array_keys( $wgNamespacesToBeSearchedDefault, true );
}
-
+
/**
* Get a list of namespace names useful for showing in tooltips
* and preferences
*
* @param $namespaces Array
*/
- public static function namespacesAsText( $namespaces ){
+ public static function namespacesAsText( $namespaces ) {
global $wgContLang;
-
- $formatted = array_map( array($wgContLang,'getFormattedNsText'), $namespaces );
- foreach( $formatted as $key => $ns ){
- if ( empty($ns) )
+
+ $formatted = array_map( array( $wgContLang, 'getFormattedNsText' ), $namespaces );
+ foreach ( $formatted as $key => $ns ) {
+ if ( empty( $ns ) )
$formatted[$key] = wfMsg( 'blanknamespace' );
}
return $formatted;
}
-
+
/**
* Return the help namespaces to be shown on Special:Search
- *
- * @return Array
+ *
+ * @return Array
*/
public static function helpNamespaces() {
global $wgNamespacesToBeSearchedHelp;
-
+
return array_keys( $wgNamespacesToBeSearchedHelp, true );
}
-
+
/**
* Return a 'cleaned up' search string
*
@@ -364,14 +391,15 @@ class SearchEngine {
*/
public static function create() {
global $wgSearchType;
- $dbr = wfGetDB( DB_SLAVE );
- if( $wgSearchType ) {
+ $dbr = null;
+ if ( $wgSearchType ) {
$class = $wgSearchType;
} else {
+ $dbr = wfGetDB( DB_SLAVE );
$class = $dbr->getSearchEngine();
}
$search = new $class( $dbr );
- $search->setLimitOffset(0,0);
+ $search->setLimitOffset( 0, 0 );
return $search;
}
@@ -399,34 +427,34 @@ class SearchEngine {
function updateTitle( $id, $title ) {
// no-op
}
-
+
/**
* Get OpenSearch suggestion template
- *
+ *
* @return String
*/
public static function getOpenSearchTemplate() {
- global $wgOpenSearchTemplate, $wgServer, $wgScriptPath;
- if( $wgOpenSearchTemplate ) {
+ global $wgOpenSearchTemplate, $wgServer;
+ if ( $wgOpenSearchTemplate ) {
return $wgOpenSearchTemplate;
- } else {
+ } else {
$ns = implode( '|', SearchEngine::defaultNamespaces() );
- if( !$ns ) $ns = "0";
- return $wgServer . $wgScriptPath . '/api.php?action=opensearch&search={searchTerms}&namespace='.$ns;
+ if ( !$ns ) $ns = "0";
+ return $wgServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
}
}
-
+
/**
- * Get internal MediaWiki Suggest template
- *
+ * Get internal MediaWiki Suggest template
+ *
* @return String
*/
public static function getMWSuggestTemplate() {
- global $wgMWSuggestTemplate, $wgServer, $wgScriptPath;
- if($wgMWSuggestTemplate)
+ global $wgMWSuggestTemplate, $wgServer;
+ if ( $wgMWSuggestTemplate )
return $wgMWSuggestTemplate;
- else
- return $wgServer . $wgScriptPath . '/api.php?action=opensearch&search={searchTerms}&namespace={namespaces}&suggest';
+ else
+ return $wgServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace={namespaces}&suggest';
}
}
@@ -486,27 +514,27 @@ class SearchResultSet {
/**
* @return String: suggested query, null if none
*/
- function getSuggestionQuery(){
+ function getSuggestionQuery() {
return null;
}
/**
* @return String: HTML highlighted suggested query, '' if none
*/
- function getSuggestionSnippet(){
+ function getSuggestionSnippet() {
return '';
}
-
+
/**
* Return information about how and from where the results were fetched,
- * should be useful for diagnostics and debugging
+ * should be useful for diagnostics and debugging
*
* @return String
*/
function getInfo() {
return null;
}
-
+
/**
* Return a result set of hits on other (multiple) wikis associated with this one
*
@@ -515,7 +543,7 @@ class SearchResultSet {
function getInterwikiResults() {
return null;
}
-
+
/**
* Check if there are results on other wikis
*
@@ -524,7 +552,6 @@ class SearchResultSet {
function hasInterwikiResults() {
return $this->getInterwikiResults() != null;
}
-
/**
* Fetches next search result, or false.
@@ -558,20 +585,27 @@ class SqlSearchResultSet extends SearchResultSet {
}
function numRows() {
+ if ( $this->mResultSet === false )
+ return false;
+
return $this->mResultSet->numRows();
}
function next() {
- if ($this->mResultSet === false )
+ if ( $this->mResultSet === false )
return false;
$row = $this->mResultSet->fetchObject();
- if ($row === false)
+ if ( $row === false )
return false;
- return new SearchResult($row);
+
+ return SearchResult::newFromRow( $row );
}
function free() {
+ if ( $this->mResultSet === false )
+ return false;
+
$this->mResultSet->free();
}
}
@@ -580,7 +614,7 @@ class SqlSearchResultSet extends SearchResultSet {
* @ingroup Search
*/
class SearchResultTooMany {
- ## Some search engines may bail out if too many matches are found
+ # # Some search engines may bail out if too many matches are found
}
@@ -594,32 +628,78 @@ class SearchResult {
var $mRevision = null;
var $mImage = null;
- function __construct( $row ) {
- $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title );
- if( !is_null($this->mTitle) ){
+ /**
+ * Return a new SearchResult and initializes it with a title.
+ *
+ * @param $title Title
+ * @return SearchResult
+ */
+ public static function newFromTitle( $title ) {
+ $result = new self();
+ $result->initFromTitle( $title );
+ return $result;
+ }
+ /**
+ * Return a new SearchResult and initializes it with a row.
+ *
+ * @param $row object
+ * @return SearchResult
+ */
+ public static function newFromRow( $row ) {
+ $result = new self();
+ $result->initFromRow( $row );
+ return $result;
+ }
+
+ public function __construct( $row = null ) {
+ if ( !is_null( $row ) ) {
+ // Backwards compatibility with pre-1.17 callers
+ $this->initFromRow( $row );
+ }
+ }
+
+ /**
+ * Initialize from a database row. Makes a Title and passes that to
+ * initFromTitle.
+ *
+ * @param $row object
+ */
+ protected function initFromRow( $row ) {
+ $this->initFromTitle( Title::makeTitle( $row->page_namespace, $row->page_title ) );
+ }
+
+ /**
+ * Initialize from a Title and if possible initializes a corresponding
+ * Revision and File.
+ *
+ * @param $title Title
+ */
+ protected function initFromTitle( $title ) {
+ $this->mTitle = $title;
+ if ( !is_null( $this->mTitle ) ) {
$this->mRevision = Revision::newFromTitle( $this->mTitle );
- if( $this->mTitle->getNamespace() === NS_FILE )
+ if ( $this->mTitle->getNamespace() === NS_FILE )
$this->mImage = wfFindFile( $this->mTitle );
}
}
-
+
/**
* Check if this is result points to an invalid title
*
* @return Boolean
*/
- function isBrokenTitle(){
- if( is_null($this->mTitle) )
+ function isBrokenTitle() {
+ if ( is_null( $this->mTitle ) )
return true;
return false;
}
-
+
/**
* Check if target page is missing, happens when index is out of date
- *
+ *
* @return Boolean
*/
- function isMissingRevision(){
+ function isMissingRevision() {
return !$this->mRevision && !$this->mImage;
}
@@ -640,36 +720,36 @@ class SearchResult {
/**
* Lazy initialization of article text from DB
*/
- protected function initText(){
- if( !isset($this->mText) ){
- if($this->mRevision != null)
+ protected function initText() {
+ if ( !isset( $this->mText ) ) {
+ if ( $this->mRevision != null )
$this->mText = $this->mRevision->getText();
else // TODO: can we fetch raw wikitext for commons images?
$this->mText = '';
-
+
}
}
-
+
/**
* @param $terms Array: terms to highlight
- * @return String: highlighted text snippet, null (and not '') if not supported
+ * @return String: highlighted text snippet, null (and not '') if not supported
*/
- function getTextSnippet($terms){
+ function getTextSnippet( $terms ) {
global $wgUser, $wgAdvancedSearchHighlighting;
$this->initText();
- list($contextlines,$contextchars) = SearchEngine::userHighlightPrefs($wgUser);
+ list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
$h = new SearchHighlighter();
- if( $wgAdvancedSearchHighlighting )
+ if ( $wgAdvancedSearchHighlighting )
return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
else
return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
}
-
+
/**
* @param $terms Array: terms to highlight
* @return String: highlighted title, '' if not supported
*/
- function getTitleSnippet($terms){
+ function getTitleSnippet( $terms ) {
return '';
}
@@ -677,46 +757,46 @@ class SearchResult {
* @param $terms Array: terms to highlight
* @return String: highlighted redirect name (redirect to this page), '' if none or not supported
*/
- function getRedirectSnippet($terms){
+ function getRedirectSnippet( $terms ) {
return '';
}
/**
* @return Title object for the redirect to this page, null if none or not supported
*/
- function getRedirectTitle(){
+ function getRedirectTitle() {
return null;
}
/**
* @return string highlighted relevant section name, null if none or not supported
*/
- function getSectionSnippet(){
+ function getSectionSnippet() {
return '';
}
/**
* @return Title object (pagename+fragment) for the section, null if none or not supported
*/
- function getSectionTitle(){
+ function getSectionTitle() {
return null;
}
/**
* @return String: timestamp
*/
- function getTimestamp(){
- if( $this->mRevision )
+ function getTimestamp() {
+ if ( $this->mRevision )
return $this->mRevision->getTimestamp();
- else if( $this->mImage )
+ else if ( $this->mImage )
return $this->mImage->getTimestamp();
- return '';
+ return '';
}
/**
* @return Integer: number of words
*/
- function getWordCount(){
+ function getWordCount() {
$this->initText();
return str_word_count( $this->mText );
}
@@ -724,38 +804,63 @@ class SearchResult {
/**
* @return Integer: size in bytes
*/
- function getByteSize(){
+ function getByteSize() {
$this->initText();
return strlen( $this->mText );
}
-
+
/**
* @return Boolean if hit has related articles
*/
- function hasRelated(){
+ function hasRelated() {
return false;
}
-
+
/**
* @return String: interwiki prefix of the title (return iw even if title is broken)
*/
- function getInterwikiPrefix(){
+ function getInterwikiPrefix() {
return '';
}
}
+/**
+ * A SearchResultSet wrapper for SearchEngine::getNearMatch
+ */
+class SearchNearMatchResultSet extends SearchResultSet {
+ private $fetched = false;
+ /**
+ * @param $match mixed Title if matched, else null
+ */
+ public function __construct( $match ) {
+ $this->result = $match;
+ }
+ public function hasResult() {
+ return (bool)$this->result;
+ }
+ public function numRows() {
+ return $this->hasResults() ? 1 : 0;
+ }
+ public function next() {
+ if ( $this->fetched || !$this->result ) {
+ return false;
+ }
+ $this->fetched = true;
+ return SearchResult::newFromTitle( $this->result );
+ }
+}
/**
* Highlight bits of wikitext
- *
+ *
* @ingroup Search
*/
-class SearchHighlighter {
+class SearchHighlighter {
var $mCleanWikitext = true;
-
- function SearchHighlighter($cleanupWikitext = true){
+
+ function __construct( $cleanupWikitext = true ) {
$this->mCleanWikitext = $cleanupWikitext;
}
-
+
/**
* Default implementation of wikitext highlighting
*
@@ -766,23 +871,23 @@ class SearchHighlighter {
* @return String
*/
public function highlightText( $text, $terms, $contextlines, $contextchars ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
global $wgSearchHighlightBoundaries;
$fname = __METHOD__;
-
- if($text == '')
+
+ if ( $text == '' )
return '';
-
+
// spli text into text + templates/links/tables
$spat = "/(\\{\\{)|(\\[\\[[^\\]:]+:)|(\n\\{\\|)";
// first capture group is for detecting nested templates/links/tables/references
$endPatterns = array(
1 => '/(\{\{)|(\}\})/', // template
2 => '/(\[\[)|(\]\])/', // image
- 3 => "/(\n\\{\\|)|(\n\\|\\})/"); // table
-
+ 3 => "/(\n\\{\\|)|(\n\\|\\})/" ); // table
+
// FIXME: this should prolly be a hook or something
- if(function_exists('wfCite')){
+ if ( function_exists( 'wfCite' ) ) {
$spat .= '|(<ref>)'; // references via cite extension
$endPatterns[4] = '/(<ref>)|(<\/ref>)/';
}
@@ -791,213 +896,215 @@ class SearchHighlighter {
$otherExt = array(); // other extracts
wfProfileIn( "$fname-split" );
$start = 0;
- $textLen = strlen($text);
+ $textLen = strlen( $text );
$count = 0; // sequence number to maintain ordering
- while( $start < $textLen ){
+ while ( $start < $textLen ) {
// find start of template/image/table
- if( preg_match( $spat, $text, $matches, PREG_OFFSET_CAPTURE, $start ) ){
- $epat = '';
- foreach($matches as $key => $val){
- if($key > 0 && $val[1] != -1){
- if($key == 2){
+ if ( preg_match( $spat, $text, $matches, PREG_OFFSET_CAPTURE, $start ) ) {
+ $epat = '';
+ foreach ( $matches as $key => $val ) {
+ if ( $key > 0 && $val[1] != - 1 ) {
+ if ( $key == 2 ) {
// see if this is an image link
- $ns = substr($val[0],2,-1);
- if( $wgContLang->getNsIndex($ns) != NS_FILE )
+ $ns = substr( $val[0], 2, - 1 );
+ if ( $wgContLang->getNsIndex( $ns ) != NS_FILE )
break;
-
+
}
$epat = $endPatterns[$key];
- $this->splitAndAdd( $textExt, $count, substr( $text, $start, $val[1] - $start ) );
+ $this->splitAndAdd( $textExt, $count, substr( $text, $start, $val[1] - $start ) );
$start = $val[1];
break;
}
}
- if( $epat ){
+ if ( $epat ) {
// find end (and detect any nested elements)
- $level = 0;
+ $level = 0;
$offset = $start + 1;
$found = false;
- while( preg_match( $epat, $text, $endMatches, PREG_OFFSET_CAPTURE, $offset ) ){
- if( array_key_exists(2,$endMatches) ){
+ while ( preg_match( $epat, $text, $endMatches, PREG_OFFSET_CAPTURE, $offset ) ) {
+ if ( array_key_exists( 2, $endMatches ) ) {
// found end
- if($level == 0){
- $len = strlen($endMatches[2][0]);
+ if ( $level == 0 ) {
+ $len = strlen( $endMatches[2][0] );
$off = $endMatches[2][1];
- $this->splitAndAdd( $otherExt, $count,
+ $this->splitAndAdd( $otherExt, $count,
substr( $text, $start, $off + $len - $start ) );
$start = $off + $len;
$found = true;
break;
- } else{
+ } else {
// end of nested element
$level -= 1;
}
- } else{
+ } else {
// nested
$level += 1;
}
- $offset = $endMatches[0][1] + strlen($endMatches[0][0]);
+ $offset = $endMatches[0][1] + strlen( $endMatches[0][0] );
}
- if( ! $found ){
+ if ( ! $found ) {
// couldn't find appropriate closing tag, skip
- $this->splitAndAdd( $textExt, $count, substr( $text, $start, strlen($matches[0][0]) ) );
- $start += strlen($matches[0][0]);
+ $this->splitAndAdd( $textExt, $count, substr( $text, $start, strlen( $matches[0][0] ) ) );
+ $start += strlen( $matches[0][0] );
}
continue;
}
}
// else: add as text extract
- $this->splitAndAdd( $textExt, $count, substr($text,$start) );
+ $this->splitAndAdd( $textExt, $count, substr( $text, $start ) );
break;
}
-
+
$all = $textExt + $otherExt; // these have disjunct key sets
-
+
wfProfileOut( "$fname-split" );
-
+
// prepare regexps
- foreach( $terms as $index => $term ) {
+ foreach ( $terms as $index => $term ) {
// manually do upper/lowercase stuff for utf-8 since PHP won't do it
- if(preg_match('/[\x80-\xff]/', $term) ){
- $terms[$index] = preg_replace_callback('/./us',array($this,'caseCallback'),$terms[$index]);
+ if ( preg_match( '/[\x80-\xff]/', $term ) ) {
+ $terms[$index] = preg_replace_callback( '/./us', array( $this, 'caseCallback' ), $terms[$index] );
} else {
$terms[$index] = $term;
}
}
$anyterm = implode( '|', $terms );
- $phrase = implode("$wgSearchHighlightBoundaries+", $terms );
+ $phrase = implode( "$wgSearchHighlightBoundaries+", $terms );
// FIXME: a hack to scale contextchars, a correct solution
// would be to have contextchars actually be char and not byte
// length, and do proper utf-8 substrings and lengths everywhere,
// but PHP is making that very hard and unclean to implement :(
- $scale = strlen($anyterm) / mb_strlen($anyterm);
+ $scale = strlen( $anyterm ) / mb_strlen( $anyterm );
$contextchars = intval( $contextchars * $scale );
-
+
$patPre = "(^|$wgSearchHighlightBoundaries)";
- $patPost = "($wgSearchHighlightBoundaries|$)";
-
- $pat1 = "/(".$phrase.")/ui";
- $pat2 = "/$patPre(".$anyterm.")$patPost/ui";
-
+ $patPost = "($wgSearchHighlightBoundaries|$)";
+
+ $pat1 = "/(" . $phrase . ")/ui";
+ $pat2 = "/$patPre(" . $anyterm . ")$patPost/ui";
+
wfProfileIn( "$fname-extract" );
-
+
$left = $contextlines;
$snippets = array();
- $offsets = array();
-
+ $offsets = array();
+
// show beginning only if it contains all words
$first = 0;
$firstText = '';
- foreach($textExt as $index => $line){
- if(strlen($line)>0 && $line[0] != ';' && $line[0] != ':'){
+ foreach ( $textExt as $index => $line ) {
+ if ( strlen( $line ) > 0 && $line[0] != ';' && $line[0] != ':' ) {
$firstText = $this->extract( $line, 0, $contextchars * $contextlines );
$first = $index;
break;
}
}
- if( $firstText ){
+ if ( $firstText ) {
$succ = true;
// check if first text contains all terms
- foreach($terms as $term){
- if( ! preg_match("/$patPre".$term."$patPost/ui", $firstText) ){
+ foreach ( $terms as $term ) {
+ if ( ! preg_match( "/$patPre" . $term . "$patPost/ui", $firstText ) ) {
$succ = false;
break;
}
}
- if( $succ ){
+ if ( $succ ) {
$snippets[$first] = $firstText;
- $offsets[$first] = 0;
+ $offsets[$first] = 0;
}
}
- if( ! $snippets ) {
- // match whole query on text
- $this->process($pat1, $textExt, $left, $contextchars, $snippets, $offsets);
+ if ( ! $snippets ) {
+ // match whole query on text
+ $this->process( $pat1, $textExt, $left, $contextchars, $snippets, $offsets );
// match whole query on templates/tables/images
- $this->process($pat1, $otherExt, $left, $contextchars, $snippets, $offsets);
+ $this->process( $pat1, $otherExt, $left, $contextchars, $snippets, $offsets );
// match any words on text
- $this->process($pat2, $textExt, $left, $contextchars, $snippets, $offsets);
+ $this->process( $pat2, $textExt, $left, $contextchars, $snippets, $offsets );
// match any words on templates/tables/images
- $this->process($pat2, $otherExt, $left, $contextchars, $snippets, $offsets);
-
- ksort($snippets);
+ $this->process( $pat2, $otherExt, $left, $contextchars, $snippets, $offsets );
+
+ ksort( $snippets );
}
-
+
// add extra chars to each snippet to make snippets constant size
- $extended = array();
- if( count( $snippets ) == 0){
+ $extended = array();
+ if ( count( $snippets ) == 0 ) {
// couldn't find the target words, just show beginning of article
- $targetchars = $contextchars * $contextlines;
- $snippets[$first] = '';
- $offsets[$first] = 0;
- } else{
- // if begin of the article contains the whole phrase, show only that !!
- if( array_key_exists($first,$snippets) && preg_match($pat1,$snippets[$first])
- && $offsets[$first] < $contextchars * 2 ){
- $snippets = array ($first => $snippets[$first]);
+ if ( array_key_exists( $first, $all ) ) {
+ $targetchars = $contextchars * $contextlines;
+ $snippets[$first] = '';
+ $offsets[$first] = 0;
}
-
+ } else {
+ // if begin of the article contains the whole phrase, show only that !!
+ if ( array_key_exists( $first, $snippets ) && preg_match( $pat1, $snippets[$first] )
+ && $offsets[$first] < $contextchars * 2 ) {
+ $snippets = array ( $first => $snippets[$first] );
+ }
+
// calc by how much to extend existing snippets
- $targetchars = intval( ($contextchars * $contextlines) / count ( $snippets ) );
- }
+ $targetchars = intval( ( $contextchars * $contextlines ) / count ( $snippets ) );
+ }
- foreach($snippets as $index => $line){
+ foreach ( $snippets as $index => $line ) {
$extended[$index] = $line;
- $len = strlen($line);
- if( $len < $targetchars - 20 ){
+ $len = strlen( $line );
+ if ( $len < $targetchars - 20 ) {
// complete this line
- if($len < strlen( $all[$index] )){
- $extended[$index] = $this->extract( $all[$index], $offsets[$index], $offsets[$index]+$targetchars, $offsets[$index]);
+ if ( $len < strlen( $all[$index] ) ) {
+ $extended[$index] = $this->extract( $all[$index], $offsets[$index], $offsets[$index] + $targetchars, $offsets[$index] );
$len = strlen( $extended[$index] );
}
-
+
// add more lines
$add = $index + 1;
- while( $len < $targetchars - 20
- && array_key_exists($add,$all)
- && !array_key_exists($add,$snippets) ){
+ while ( $len < $targetchars - 20
+ && array_key_exists( $add, $all )
+ && !array_key_exists( $add, $snippets ) ) {
$offsets[$add] = 0;
- $tt = "\n".$this->extract( $all[$add], 0, $targetchars - $len, $offsets[$add] );
+ $tt = "\n" . $this->extract( $all[$add], 0, $targetchars - $len, $offsets[$add] );
$extended[$add] = $tt;
$len += strlen( $tt );
- $add++;
+ $add++;
}
- }
+ }
}
-
- //$snippets = array_map('htmlspecialchars', $extended);
+
+ // $snippets = array_map('htmlspecialchars', $extended);
$snippets = $extended;
- $last = -1;
+ $last = - 1;
$extract = '';
- foreach($snippets as $index => $line){
- if($last == -1)
+ foreach ( $snippets as $index => $line ) {
+ if ( $last == - 1 )
$extract .= $line; // first line
- elseif($last+1 == $index && $offsets[$last]+strlen($snippets[$last]) >= strlen($all[$last]))
- $extract .= " ".$line; // continous lines
+ elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) )
+ $extract .= " " . $line; // continous lines
else
$extract .= '<b> ... </b>' . $line;
$last = $index;
}
- if( $extract )
+ if ( $extract )
$extract .= '<b> ... </b>';
-
+
$processed = array();
- foreach($terms as $term){
- if( ! isset($processed[$term]) ){
- $pat3 = "/$patPre(".$term.")$patPost/ui"; // highlight word
+ foreach ( $terms as $term ) {
+ if ( ! isset( $processed[$term] ) ) {
+ $pat3 = "/$patPre(" . $term . ")$patPost/ui"; // highlight word
$extract = preg_replace( $pat3,
"\\1<span class='searchmatch'>\\2</span>\\3", $extract );
$processed[$term] = true;
}
}
-
+
wfProfileOut( "$fname-extract" );
-
+
return $extract;
}
-
+
/**
* Split text into lines and add it to extracts array
*
@@ -1005,28 +1112,28 @@ class SearchHighlighter {
* @param $count Integer
* @param $text String
*/
- function splitAndAdd(&$extracts, &$count, $text){
- $split = explode( "\n", $this->mCleanWikitext? $this->removeWiki($text) : $text );
- foreach($split as $line){
- $tt = trim($line);
- if( $tt )
+ function splitAndAdd( &$extracts, &$count, $text ) {
+ $split = explode( "\n", $this->mCleanWikitext ? $this->removeWiki( $text ) : $text );
+ foreach ( $split as $line ) {
+ $tt = trim( $line );
+ if ( $tt )
$extracts[$count++] = $tt;
}
}
-
+
/**
* Do manual case conversion for non-ascii chars
*
* @param $matches Array
*/
- function caseCallback($matches){
+ function caseCallback( $matches ) {
global $wgContLang;
- if( strlen($matches[0]) > 1 ){
- return '['.$wgContLang->lc($matches[0]).$wgContLang->uc($matches[0]).']';
+ if ( strlen( $matches[0] ) > 1 ) {
+ return '[' . $wgContLang->lc( $matches[0] ) . $wgContLang->uc( $matches[0] ) . ']';
} else
return $matches[0];
}
-
+
/**
* Extract part of the text from start to end, but by
* not chopping up words
@@ -1035,29 +1142,27 @@ class SearchHighlighter {
* @param $end Integer
* @param $posStart Integer: (out) actual start position
* @param $posEnd Integer: (out) actual end position
- * @return String
+ * @return String
*/
- function extract($text, $start, $end, &$posStart = null, &$posEnd = null ){
- global $wgContLang;
-
- if( $start != 0)
+ function extract( $text, $start, $end, &$posStart = null, &$posEnd = null ) {
+ if ( $start != 0 )
$start = $this->position( $text, $start, 1 );
- if( $end >= strlen($text) )
- $end = strlen($text);
+ if ( $end >= strlen( $text ) )
+ $end = strlen( $text );
else
$end = $this->position( $text, $end );
-
- if(!is_null($posStart))
+
+ if ( !is_null( $posStart ) )
$posStart = $start;
- if(!is_null($posEnd))
+ if ( !is_null( $posEnd ) )
$posEnd = $end;
-
- if($end > $start)
- return substr($text, $start, $end-$start);
+
+ if ( $end > $start )
+ return substr( $text, $start, $end - $start );
else
return '';
- }
-
+ }
+
/**
* Find a nonletter near a point (index) in the text
*
@@ -1066,117 +1171,117 @@ class SearchHighlighter {
* @param $offset Integer: offset to found index
* @return Integer: nearest nonletter index, or beginning of utf8 char if none
*/
- function position($text, $point, $offset=0 ){
+ function position( $text, $point, $offset = 0 ) {
$tolerance = 10;
$s = max( 0, $point - $tolerance );
- $l = min( strlen($text), $point + $tolerance ) - $s;
+ $l = min( strlen( $text ), $point + $tolerance ) - $s;
$m = array();
- if( preg_match('/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/', substr($text,$s,$l), $m, PREG_OFFSET_CAPTURE ) ){
+ if ( preg_match( '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/', substr( $text, $s, $l ), $m, PREG_OFFSET_CAPTURE ) ) {
return $m[0][1] + $s + $offset;
- } else{
+ } else {
// check if point is on a valid first UTF8 char
$char = ord( $text[$point] );
- while( $char >= 0x80 && $char < 0xc0 ) {
+ while ( $char >= 0x80 && $char < 0xc0 ) {
// skip trailing bytes
$point++;
- if($point >= strlen($text))
- return strlen($text);
+ if ( $point >= strlen( $text ) )
+ return strlen( $text );
$char = ord( $text[$point] );
}
return $point;
-
+
}
}
-
+
/**
* Search extracts for a pattern, and return snippets
*
* @param $pattern String: regexp for matching lines
- * @param $extracts Array: extracts to search
+ * @param $extracts Array: extracts to search
* @param $linesleft Integer: number of extracts to make
* @param $contextchars Integer: length of snippet
* @param $out Array: map for highlighted snippets
* @param $offsets Array: map of starting points of snippets
* @protected
*/
- function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ){
- if($linesleft == 0)
+ function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
+ if ( $linesleft == 0 )
return; // nothing to do
- foreach($extracts as $index => $line){
- if( array_key_exists($index,$out) )
+ foreach ( $extracts as $index => $line ) {
+ if ( array_key_exists( $index, $out ) )
continue; // this line already highlighted
-
+
$m = array();
if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) )
continue;
-
+
$offset = $m[0][1];
- $len = strlen($m[0][0]);
- if($offset + $len < $contextchars)
- $begin = 0;
- elseif( $len > $contextchars)
+ $len = strlen( $m[0][0] );
+ if ( $offset + $len < $contextchars )
+ $begin = 0;
+ elseif ( $len > $contextchars )
$begin = $offset;
else
- $begin = $offset + intval( ($len - $contextchars) / 2 );
-
+ $begin = $offset + intval( ( $len - $contextchars ) / 2 );
+
$end = $begin + $contextchars;
-
+
$posBegin = $begin;
// basic snippet from this line
- $out[$index] = $this->extract($line,$begin,$end,$posBegin);
+ $out[$index] = $this->extract( $line, $begin, $end, $posBegin );
$offsets[$index] = $posBegin;
- $linesleft--;
- if($linesleft == 0)
+ $linesleft--;
+ if ( $linesleft == 0 )
return;
}
}
-
- /**
+
+ /**
* Basic wikitext removal
* @protected
*/
- function removeWiki($text) {
+ function removeWiki( $text ) {
$fname = __METHOD__;
wfProfileIn( $fname );
-
- //$text = preg_replace("/'{2,5}/", "", $text);
- //$text = preg_replace("/\[[a-z]+:\/\/[^ ]+ ([^]]+)\]/", "\\2", $text);
- //$text = preg_replace("/\[\[([^]|]+)\]\]/", "\\1", $text);
- //$text = preg_replace("/\[\[([^]]+\|)?([^|]]+)\]\]/", "\\2", $text);
- //$text = preg_replace("/\\{\\|(.*?)\\|\\}/", "", $text);
- //$text = preg_replace("/\\[\\[[A-Za-z_-]+:([^|]+?)\\]\\]/", "", $text);
- $text = preg_replace("/\\{\\{([^|]+?)\\}\\}/", "", $text);
- $text = preg_replace("/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text);
- $text = preg_replace("/\\[\\[([^|]+?)\\]\\]/", "\\1", $text);
- $text = preg_replace_callback("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", array($this,'linkReplace'), $text);
- //$text = preg_replace("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", "\\2", $text);
- $text = preg_replace("/<\/?[^>]+>/", "", $text);
- $text = preg_replace("/'''''/", "", $text);
- $text = preg_replace("/('''|<\/?[iIuUbB]>)/", "", $text);
- $text = preg_replace("/''/", "", $text);
-
+
+ // $text = preg_replace("/'{2,5}/", "", $text);
+ // $text = preg_replace("/\[[a-z]+:\/\/[^ ]+ ([^]]+)\]/", "\\2", $text);
+ // $text = preg_replace("/\[\[([^]|]+)\]\]/", "\\1", $text);
+ // $text = preg_replace("/\[\[([^]]+\|)?([^|]]+)\]\]/", "\\2", $text);
+ // $text = preg_replace("/\\{\\|(.*?)\\|\\}/", "", $text);
+ // $text = preg_replace("/\\[\\[[A-Za-z_-]+:([^|]+?)\\]\\]/", "", $text);
+ $text = preg_replace( "/\\{\\{([^|]+?)\\}\\}/", "", $text );
+ $text = preg_replace( "/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text );
+ $text = preg_replace( "/\\[\\[([^|]+?)\\]\\]/", "\\1", $text );
+ $text = preg_replace_callback( "/\\[\\[([^|]+\\|)(.*?)\\]\\]/", array( $this, 'linkReplace' ), $text );
+ // $text = preg_replace("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", "\\2", $text);
+ $text = preg_replace( "/<\/?[^>]+>/", "", $text );
+ $text = preg_replace( "/'''''/", "", $text );
+ $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text );
+ $text = preg_replace( "/''/", "", $text );
+
wfProfileOut( $fname );
return $text;
}
-
+
/**
* callback to replace [[target|caption]] kind of links, if
* the target is category or image, leave it
*
* @param $matches Array
*/
- function linkReplace($matches){
- $colon = strpos( $matches[1], ':' );
- if( $colon === false )
+ function linkReplace( $matches ) {
+ $colon = strpos( $matches[1], ':' );
+ if ( $colon === false )
return $matches[2]; // replace with caption
global $wgContLang;
$ns = substr( $matches[1], 0, $colon );
- $index = $wgContLang->getNsIndex($ns);
- if( $index !== false && ($index == NS_FILE || $index == NS_CATEGORY) )
- return $matches[0]; // return the whole thing
+ $index = $wgContLang->getNsIndex( $ns );
+ if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) )
+ return $matches[0]; // return the whole thing
else
return $matches[2];
-
+
}
/**
@@ -1190,11 +1295,11 @@ class SearchHighlighter {
* @return String
*/
public function highlightSimple( $text, $terms, $contextlines, $contextchars ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
$fname = __METHOD__;
$lines = explode( "\n", $text );
-
+
$terms = implode( '|', $terms );
$max = intval( $contextchars ) + 1;
$pat1 = "/(.*)($terms)(.{0,$max})/i";
@@ -1213,7 +1318,7 @@ class SearchHighlighter {
continue;
}
--$contextlines;
- $pre = $wgContLang->truncate( $m[1], -$contextchars );
+ $pre = $wgContLang->truncate( $m[1], - $contextchars );
if ( count( $m ) < 3 ) {
$post = '';
@@ -1231,10 +1336,10 @@ class SearchHighlighter {
$extract .= "${line}\n";
}
wfProfileOut( "$fname-extract" );
-
+
return $extract;
}
-
+
}
/**
diff --git a/includes/search/SearchIBM_DB2.php b/includes/search/SearchIBM_DB2.php
index d7587186..8cedd6f2 100644
--- a/includes/search/SearchIBM_DB2.php
+++ b/includes/search/SearchIBM_DB2.php
@@ -1,23 +1,25 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
+ * IBM DB2 search engine
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Search
*/
@@ -27,8 +29,13 @@
* @ingroup Search
*/
class SearchIBM_DB2 extends SearchEngine {
+
+ /**
+ * Creates an instance of this class
+ * @param $db DatabaseIbm_db2: database object
+ */
function __construct($db) {
- $this->db = $db;
+ parent::__construct( $db );
}
/**
@@ -102,8 +109,8 @@ class SearchIBM_DB2 extends SearchEngine {
/**
* Construct the full SQL query to do the search.
* The guts shoulds be constructed in queryMain()
- * @param string $filteredTerm String
- * @param bool $fulltext Boolean
+ * @param $filteredTerm String
+ * @param $fulltext Boolean
*/
function getQuery( $filteredTerm, $fulltext ) {
return $this->queryLimit($this->queryMain($filteredTerm, $fulltext) . ' ' .
@@ -125,8 +132,8 @@ class SearchIBM_DB2 extends SearchEngine {
/**
* Get the base part of the search query.
*
- * @param string $filteredTerm String
- * @param bool $fulltext Boolean
+ * @param $filteredTerm String
+ * @param $fulltext Boolean
* @return String
*/
function queryMain( $filteredTerm, $fulltext ) {
diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php
new file mode 100644
index 00000000..8b850fae
--- /dev/null
+++ b/includes/search/SearchMssql.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * Mssql 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
+ */
+
+/**
+ * Search engine hook base class for Mssql (ConText).
+ * @ingroup Search
+ */
+class SearchMssql extends SearchEngine {
+
+ /**
+ * Creates an instance of this class
+ * @param $db DatabaseMssql: database object
+ */
+ function __construct( $db ) {
+ parent::__construct( $db );
+ }
+
+ /**
+ * Perform a full text search query and return a result set.
+ *
+ * @param $term String: raw search term
+ * @return MssqlSearchResultSet
+ * @access public
+ */
+ function searchText( $term ) {
+ $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+ return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
+ }
+
+ /**
+ * Perform a title-only search query and return a result set.
+ *
+ * @param $term String: raw search term
+ * @return MssqlSearchResultSet
+ * @access public
+ */
+ function searchTitle( $term ) {
+ $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
+ return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
+ }
+
+
+ /**
+ * Return a partial WHERE clause to exclude redirects, if so set
+ *
+ * @return String
+ * @private
+ */
+ function queryRedirect() {
+ if ( $this->showRedirects ) {
+ return '';
+ } else {
+ return 'AND page_is_redirect=0';
+ }
+ }
+
+ /**
+ * Return a partial WHERE clause to limit the search to the given namespaces
+ *
+ * @return String
+ * @private
+ */
+ function queryNamespaces() {
+ $namespaces = implode( ',', $this->namespaces );
+ if ( $namespaces == '' ) {
+ $namespaces = '0';
+ }
+ return 'AND page_namespace IN (' . $namespaces . ')';
+ }
+
+ /**
+ * Return a LIMIT clause to limit results on the query.
+ *
+ * @return String
+ * @private
+ */
+ function queryLimit( $sql ) {
+ return $this->db->limitResult( $sql, $this->limit, $this->offset );
+ }
+
+ /**
+ * Does not do anything for generic search engine
+ * subclasses may define this though
+ *
+ * @return String
+ * @private
+ */
+ function queryRanking( $filteredTerm, $fulltext ) {
+ return ' ORDER BY ftindex.[RANK] DESC'; // return ' ORDER BY score(1)';
+ }
+
+ /**
+ * Construct the full SQL query to do the search.
+ * The guts shoulds be constructed in queryMain()
+ *
+ * @param $filteredTerm String
+ * @param $fulltext Boolean
+ * @private
+ */
+ function getQuery( $filteredTerm, $fulltext ) {
+ return $this->queryLimit( $this->queryMain( $filteredTerm, $fulltext ) . ' ' .
+ $this->queryRedirect() . ' ' .
+ $this->queryNamespaces() . ' ' .
+ $this->queryRanking( $filteredTerm, $fulltext ) . ' ' );
+ }
+
+
+ /**
+ * Picks which field to index on, depending on what type of query.
+ *
+ * @param $fulltext Boolean
+ * @return string
+ */
+ function getIndexField( $fulltext ) {
+ return $fulltext ? 'si_text' : 'si_title';
+ }
+
+ /**
+ * Get the base part of the search query.
+ *
+ * @param $filteredTerm String
+ * @param $fulltext Boolean
+ * @return String
+ * @private
+ */
+ function queryMain( $filteredTerm, $fulltext ) {
+ $match = $this->parseQuery( $filteredTerm, $fulltext );
+ $page = $this->db->tableName( 'page' );
+ $searchindex = $this->db->tableName( 'searchindex' );
+
+ return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
+ "FROM $page,FREETEXTTABLE($searchindex , $match, LANGUAGE 'English') as ftindex " .
+ 'WHERE page_id=ftindex.[KEY] ';
+ }
+
+ /** @todo document */
+ function parseQuery( $filteredText, $fulltext ) {
+ global $wgContLang;
+ $lc = SearchEngine::legalSearchChars();
+ $this->searchTerms = array();
+
+ # FIXME: This doesn't handle parenthetical expressions.
+ $m = array();
+ $q = array();
+
+ if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+ $filteredText, $m, PREG_SET_ORDER ) ) {
+ foreach ( $m as $terms ) {
+ $q[] = $terms[1] . $wgContLang->normalizeForSearch( $terms[2] );
+
+ if ( !empty( $terms[3] ) ) {
+ $regexp = preg_quote( $terms[3], '/' );
+ if ( $terms[4] )
+ $regexp .= "[0-9A-Za-z_]+";
+ } else {
+ $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
+ }
+ $this->searchTerms[] = $regexp;
+ }
+ }
+
+ $searchon = $this->db->strencode( join( ',', $q ) );
+ $field = $this->getIndexField( $fulltext );
+ return "$field, '$searchon'";
+ }
+
+ /**
+ * Create or update the search index record for the given page.
+ * Title and text should be pre-processed.
+ *
+ * @param $id Integer
+ * @param $title String
+ * @param $text String
+ */
+ function update( $id, $title, $text ) {
+ // We store the column data as UTF-8 byte order marked binary stream
+ // because we are invoking the plain text IFilter on it so that, and we want it
+ // to properly decode the stream as UTF-8. SQL doesn't support UTF8 as a data type
+ // but the indexer will correctly handle it by this method. Since all we are doing
+ // is passing this data to the indexer and never retrieving it via PHP, this will save space
+ $table = $this->db->tableName( 'searchindex' );
+ $utf8bom = '0xEFBBBF';
+ $si_title = $utf8bom . bin2hex( $title );
+ $si_text = $utf8bom . bin2hex( $text );
+ $sql = "DELETE FROM $table WHERE si_page = $id;";
+ $sql .= "INSERT INTO $table (si_page, si_title, si_text) VALUES ($id, $si_title, $si_text)";
+ return $this->db->query( $sql, 'SearchMssql::update' );
+ }
+
+ /**
+ * Update a search index record's title only.
+ * Title should be pre-processed.
+ *
+ * @param $id Integer
+ * @param $title String
+ */
+ function updateTitle( $id, $title ) {
+ $table = $this->db->tableName( 'searchindex' );
+
+ // see update for why we are using the utf8bom
+ $utf8bom = '0xEFBBBF';
+ $si_title = $utf8bom . bin2hex( $title );
+ $sql = "DELETE FROM $table WHERE si_page = $id;";
+ $sql .= "INSERT INTO $table (si_page, si_title, si_text) VALUES ($id, $si_title, 0x00)";
+ return $this->db->query( $sql, 'SearchMssql::updateTitle' );
+ }
+}
+
+/**
+ * @ingroup Search
+ */
+class MssqlSearchResultSet extends SearchResultSet {
+ function __construct( $resultSet, $terms ) {
+ $this->mResultSet = $resultSet;
+ $this->mTerms = $terms;
+ }
+
+ function termMatches() {
+ return $this->mTerms;
+ }
+
+ function numRows() {
+ return $this->mResultSet->numRows();
+ }
+
+ function next() {
+ $row = $this->mResultSet->fetchObject();
+ if ( $row === false )
+ return false;
+ return new SearchResult( $row );
+ }
+}
+
+
diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php
index 0c238be8..b92682ad 100644
--- a/includes/search/SearchMySQL.php
+++ b/includes/search/SearchMySQL.php
@@ -1,23 +1,25 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
+ * MySQL search engine
+ *
+ * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Search
*/
@@ -30,9 +32,12 @@ class SearchMySQL extends SearchEngine {
var $strictMatching = true;
static $mMinSearchLength;
- /** @todo document */
+ /**
+ * Creates an instance of this class
+ * @param $db DatabaseMysql: database object
+ */
function __construct( $db ) {
- $this->db = $db;
+ parent::__construct( $db );
}
/**
@@ -325,8 +330,7 @@ class SearchMySQL extends SearchEngine {
wfProfileIn( __METHOD__ );
- // Some languages such as Chinese require word segmentation
- $out = $wgContLang->wordSegmentation( $string );
+ $out = parent::normalizeText( $string );
// MySQL fulltext index doesn't grok utf-8, so we
// need to fold cases and convert to hex
@@ -401,7 +405,7 @@ class SearchMySQL extends SearchEngine {
* @ingroup Search
*/
class MySQLSearchResultSet extends SqlSearchResultSet {
- function MySQLSearchResultSet( $resultSet, $terms, $totalHits=null ) {
+ function __construct( $resultSet, $terms, $totalHits=null ) {
parent::__construct( $resultSet, $terms );
$this->mTotalHits = $totalHits;
}
@@ -409,4 +413,4 @@ class MySQLSearchResultSet extends SqlSearchResultSet {
function getTotalHits() {
return $this->mTotalHits;
}
-} \ No newline at end of file
+}
diff --git a/includes/search/SearchMySQL4.php b/includes/search/SearchMySQL4.php
deleted file mode 100644
index 3e2bb2d1..00000000
--- a/includes/search/SearchMySQL4.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * @file
- * @ingroup Search
- */
-
-/**
- * Search engine hook for MySQL 4+
- * This class retained for backwards compatibility...
- * The meat's been moved to SearchMySQL, since the 3.x variety is gone.
- * @ingroup Search
- * @deprecated
- */
-class SearchMySQL4 extends SearchMySQL {
- /* whee */
-}
diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php
index e4c5deee..15c386ce 100644
--- a/includes/search/SearchOracle.php
+++ b/includes/search/SearchOracle.php
@@ -1,23 +1,25 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
+ * Oracle search engine
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Search
*/
@@ -54,9 +56,13 @@ class SearchOracle extends SearchEngine {
'TRSYN' => 1,
'TT' => 1,
'WITHIN' => 1);
-
+
+ /**
+ * Creates an instance of this class
+ * @param $db DatabasePostgres: database object
+ */
function __construct($db) {
- $this->db = $db;
+ parent::__construct( $db );
}
/**
@@ -240,16 +246,24 @@ class SearchOracle extends SearchEngine {
'si_title' => $title,
'si_text' => $text
), 'SearchOracle::update' );
- $dbw->query("CALL ctx_ddl.sync_index('si_text_idx')");
- $dbw->query("CALL ctx_ddl.sync_index('si_title_idx')");
+
+ // Sync the index
+ // We need to specify the DB name (i.e. user/schema) here so that
+ // it can work from the installer, where
+ // ALTER SESSION SET CURRENT_SCHEMA = ...
+ // was used.
+ $dbw->query( "CALL ctx_ddl.sync_index(" .
+ $dbw->addQuotes( $dbw->getDBname() . '.' . trim( $dbw->tableName( 'si_text_idx' ), '"' ) ) . ")" );
+ $dbw->query( "CALL ctx_ddl.sync_index(" .
+ $dbw->addQuotes( $dbw->getDBname() . '.' . trim( $dbw->tableName( 'si_title_idx' ), '"' ) ) . ")" );
}
/**
* Update a search index record's title only.
* Title should be pre-processed.
*
- * @param int $id
- * @param string $title
+ * @param $id Integer
+ * @param $title String
*/
function updateTitle($id, $title) {
$dbw = wfGetDB(DB_MASTER);
diff --git a/includes/search/SearchPostgres.php b/includes/search/SearchPostgres.php
index 0006fa82..9d6d1539 100644
--- a/includes/search/SearchPostgres.php
+++ b/includes/search/SearchPostgres.php
@@ -1,23 +1,25 @@
<?php
-# Copyright (C) 2006-2007 Greg Sabino Mullane <greg@turnstep.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
+ * PostgreSQL search engine
+ *
+ * Copyright © 2006-2007 Greg Sabino Mullane <greg@turnstep.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Search
*/
@@ -27,9 +29,12 @@
* @ingroup Search
*/
class SearchPostgres extends SearchEngine {
-
+ /**
+ * Creates an instance of this class
+ * @param $db DatabaseSqlite: database object
+ */
function __construct( $db ) {
- $this->db = $db;
+ parent::__construct( $db );
}
/**
@@ -129,24 +134,21 @@ class SearchPostgres extends SearchEngine {
/**
* Construct the full SQL query to do the search.
- * @param $filteredTerm String
+ * @param $term String
* @param $fulltext String
+ * @param $colname
*/
function searchQuery( $term, $fulltext, $colname ) {
- global $wgDBversion;
+ $postgresVersion = $this->db->getServerVersion();
- if ( !isset( $wgDBversion ) ) {
- $this->db->getServerVersion();
- $wgDBversion = $this->db->numeric_version;
- }
- $prefix = $wgDBversion < 8.3 ? "'default'," : '';
+ $prefix = $postgresVersion < 8.3 ? "'default'," : '';
# Get the SQL fragment for the given term
$searchstring = $this->parseQuery( $term );
## We need a separate query here so gin does not complain about empty searches
$SQL = "SELECT to_tsquery($prefix $searchstring)";
- $res = $this->db->doQuery($SQL);
+ $res = $this->db->query($SQL);
if (!$res) {
## TODO: Better output (example to catch: one 'two)
die ("Sorry, that was not a valid search string. Please go back and try again");
@@ -166,8 +168,8 @@ class SearchPostgres extends SearchEngine {
}
}
- $rankscore = $wgDBversion > 8.2 ? 5 : 1;
- $rank = $wgDBversion < 8.3 ? 'rank' : 'ts_rank';
+ $rankscore = $postgresVersion > 8.2 ? 5 : 1;
+ $rank = $postgresVersion < 8.3 ? 'rank' : 'ts_rank';
$query = "SELECT page_id, page_namespace, page_title, ".
"$rank($fulltext, to_tsquery($prefix $searchstring), $rankscore) AS score ".
"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
@@ -204,7 +206,7 @@ class SearchPostgres extends SearchEngine {
$SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN ".
"(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
" ORDER BY rev_text_id DESC OFFSET 1)";
- $this->db->doQuery($SQL);
+ $this->db->query($SQL);
return true;
}
diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php
index fb55efec..6accc31b 100644
--- a/includes/search/SearchSqlite.php
+++ b/includes/search/SearchSqlite.php
@@ -1,22 +1,22 @@
<?php
-# SQLite search backend, based upon SearchMysql
-#
-# 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
-
/**
+ * SQLite search backend, based upon SearchMysql
+ *
+ * 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
*/
@@ -26,15 +26,12 @@
* @ingroup Search
*/
class SearchSqlite extends SearchEngine {
- // Cached because SearchUpdate keeps recreating our class
- private static $fulltextSupported = null;
-
/**
* Creates an instance of this class
* @param $db DatabaseSqlite: database object
*/
function __construct( $db ) {
- $this->db = $db;
+ parent::__construct( $db );
}
/**
@@ -42,18 +39,11 @@ class SearchSqlite extends SearchEngine {
* @return Boolean
*/
function fulltextSearchSupported() {
- if ( self::$fulltextSupported === null ) {
- self::$fulltextSupported = $this->db->selectField(
- 'updatelog',
- 'ul_key',
- array( 'ul_key' => 'fts3' ),
- __METHOD__ ) !== false;
- }
- return self::$fulltextSupported;
+ return $this->db->checkForEnabledSearch();
}
- /**
- * Parse the user's query and transform it into an SQL fragment which will
+ /**
+ * Parse the user's query and transform it into an SQL fragment which will
* become part of a WHERE clause
*/
function parseQuery( $filteredText, $fulltext ) {
@@ -67,7 +57,7 @@ class SearchSqlite extends SearchEngine {
$filteredText, $m, PREG_SET_ORDER ) ) {
foreach( $m as $bits ) {
@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
-
+
if( $nonQuoted != '' ) {
$term = $nonQuoted;
$quote = '';
@@ -86,7 +76,7 @@ class SearchSqlite extends SearchEngine {
} else {
$variants = array( $term );
}
-
+
// The low-level search index does some processing on input to work
// around problems with minimum lengths and encoding in MySQL's
// fulltext engine.
@@ -94,12 +84,12 @@ class SearchSqlite extends SearchEngine {
$strippedVariants = array_map(
array( $wgContLang, 'normalizeForSearch' ),
$variants );
-
+
// Some languages such as Chinese force all variants to a canonical
// form when stripping to the low-level search index, so to be sure
// let's check our variants list for unique items after stripping.
$strippedVariants = array_unique( $strippedVariants );
-
+
$searchon .= $modifier;
if( count( $strippedVariants) > 1 )
$searchon .= '(';
@@ -114,7 +104,7 @@ class SearchSqlite extends SearchEngine {
}
if( count( $strippedVariants) > 1 )
$searchon .= ')';
-
+
// Match individual terms or quoted phrase in result highlighting...
// Note that variants will be introduced in a later stage for highlighting!
$regexp = $this->regexTerm( $term, $wildcard );
@@ -129,10 +119,10 @@ class SearchSqlite extends SearchEngine {
$field = $this->getIndexField( $fulltext );
return " $field MATCH '$searchon' ";
}
-
+
function regexTerm( $string, $wildcard ) {
global $wgContLang;
-
+
$regex = preg_quote( $string, '/' );
if( $wgContLang->hasWordBreaks() ) {
if( $wildcard ) {
@@ -172,7 +162,7 @@ class SearchSqlite extends SearchEngine {
function searchTitle( $term ) {
return $this->searchInternal( $term, false );
}
-
+
protected function searchInternal( $term, $fulltext ) {
global $wgCountTotalSearchHits, $wgContLang;
@@ -182,7 +172,7 @@ class SearchSqlite extends SearchEngine {
$filteredTerm = $this->filter( $wgContLang->lc( $term ) );
$resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) );
-
+
$total = null;
if( $wgCountTotalSearchHits ) {
$totalResult = $this->db->query( $this->getCountQuery( $filteredTerm, $fulltext ) );
@@ -192,7 +182,7 @@ class SearchSqlite extends SearchEngine {
}
$totalResult->free();
}
-
+
return new SqliteSearchResultSet( $resultSet, $this->searchTerms, $total );
}
@@ -226,7 +216,7 @@ class SearchSqlite extends SearchEngine {
/**
* Returns a query with limit for number of results set.
- * @param $sql String:
+ * @param $sql String:
* @return String
*/
function limitResult( $sql ) {
@@ -246,7 +236,7 @@ class SearchSqlite extends SearchEngine {
$this->queryNamespaces()
);
}
-
+
/**
* Picks which field to index on, depending on what type of query.
* @param $fulltext Boolean
@@ -300,7 +290,7 @@ class SearchSqlite extends SearchEngine {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'searchindex', array( 'rowid' => $id ), __METHOD__ );
-
+
$dbw->insert( 'searchindex',
array(
'rowid' => $id,
@@ -333,7 +323,7 @@ class SearchSqlite extends SearchEngine {
* @ingroup Search
*/
class SqliteSearchResultSet extends SqlSearchResultSet {
- function SqliteSearchResultSet( $resultSet, $terms, $totalHits=null ) {
+ function __construct( $resultSet, $terms, $totalHits=null ) {
parent::__construct( $resultSet, $terms );
$this->mTotalHits = $totalHits;
}
@@ -341,4 +331,4 @@ class SqliteSearchResultSet extends SqlSearchResultSet {
function getTotalHits() {
return $this->mTotalHits;
}
-} \ No newline at end of file
+}
diff --git a/includes/search/SearchUpdate.php b/includes/search/SearchUpdate.php
index e30c70e6..5262faa4 100644
--- a/includes/search/SearchUpdate.php
+++ b/includes/search/SearchUpdate.php
@@ -1,6 +1,16 @@
<?php
/**
+ * Search index updater
+ *
* See deferred.txt
+ *
+ * @file
+ * @ingroup Search
+ */
+
+/**
+ * Database independant search index updater
+ *
* @ingroup Search
*/
class SearchUpdate {
@@ -8,7 +18,7 @@ class SearchUpdate {
/* private */ var $mId = 0, $mNamespace, $mTitle, $mText;
/* private */ var $mTitleWords;
- function SearchUpdate( $id, $title, $text = false ) {
+ function __construct( $id, $title, $text = false ) {
$nt = Title::newFromText( $title );
if( $nt ) {
$this->mId = $id;
@@ -29,23 +39,23 @@ class SearchUpdate {
if( $wgDisableSearchUpdate || !$this->mId ) {
return false;
}
- $fname = 'SearchUpdate::doUpdate';
- wfProfileIn( $fname );
+
+ wfProfileIn( __METHOD__ );
$search = SearchEngine::create();
$lc = SearchEngine::legalSearchChars() . '&#;';
if( $this->mText === false ) {
$search->updateTitle($this->mId,
- Title::indexTitle( $this->mNamespace, $this->mTitle ));
- wfProfileOut( $fname );
+ $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
+ wfProfileOut( __METHOD__ );
return;
}
# Language-specific strip/conversion
$text = $wgContLang->normalizeForSearch( $this->mText );
- wfProfileIn( $fname.'-regexps' );
+ wfProfileIn( __METHOD__ . '-regexps' );
$text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
$text = preg_replace( "/(^|\\n)==\\s*([^\\n]+)\\s*==(\\s)/sD",
@@ -92,20 +102,21 @@ class SearchUpdate {
# Strip wiki '' and '''
$text = preg_replace( "/''[']*/", " ", $text );
- wfProfileOut( "$fname-regexps" );
+ wfProfileOut( __METHOD__ . '-regexps' );
wfRunHooks( 'SearchUpdate', array( $this->mId, $this->mNamespace, $this->mTitle, &$text ) );
# Perform the actual update
- $search->update($this->mId, Title::indexTitle( $this->mNamespace, $this->mTitle ),
- $text);
+ $search->update($this->mId, $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ),
+ $search->normalizeText( $text ) );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
}
}
/**
* Placeholder class
+ *
* @ingroup Search
*/
class SearchUpdateMyISAM extends SearchUpdate {
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
index 7d907fb5..f016ab92 100644
--- a/includes/specials/SpecialActiveusers.php
+++ b/includes/specials/SpecialActiveusers.php
@@ -1,37 +1,40 @@
<?php
-# Copyright (C) 2008 Aaron Schulz
-#
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
+/**
+ * Implements Special:Activeusers
+ *
+ * Copyright © 2008 Aaron Schulz
+ *
+ * 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
+ */
/**
* This class is used to get a list of active users. The ones with specials
* rights (sysop, bureaucrat, developer) will have them displayed
* next to their names.
*
- * @file
* @ingroup SpecialPage
*/
class ActiveUsersPager extends UsersPager {
function __construct( $group = null ) {
- global $wgRequest, $wgRCMaxAge;
- $this->RCMaxAge = ceil( $wgRCMaxAge / ( 3600 * 24 ) ); // Constant
-
+ global $wgRequest, $wgActiveUserDays;
+ $this->RCMaxAge = $wgActiveUserDays;
$un = $wgRequest->getText( 'username' );
$this->requestedUser = '';
if ( $un != '' ) {
@@ -40,15 +43,15 @@ class ActiveUsersPager extends UsersPager {
$this->requestedUser = $username->getText();
}
}
-
+
$this->setupOptions();
-
+
parent::__construct();
}
public function setupOptions() {
global $wgRequest;
-
+
$this->opts = new FormOptions();
$this->opts->add( 'hidebots', false, FormOptions::BOOL );
@@ -57,10 +60,12 @@ class ActiveUsersPager extends UsersPager {
$this->opts->fetchValuesFromRequest( $wgRequest );
$this->groups = array();
- if ($this->opts->getValue('hidebots') == 1)
+ if ( $this->opts->getValue( 'hidebots' ) == 1 ) {
$this->groups['bot'] = true;
- if ($this->opts->getValue('hidesysops') == 1)
+ }
+ if ( $this->opts->getValue( 'hidesysops' ) == 1 ) {
$this->groups['sysop'] = true;
+ }
}
function getIndexField() {
@@ -72,7 +77,8 @@ class ActiveUsersPager extends UsersPager {
$conds = array( 'rc_user > 0' ); // Users - no anons
$conds[] = 'ipb_deleted IS NULL'; // don't show hidden names
$conds[] = "rc_log_type IS NULL OR rc_log_type != 'newusers'";
-
+ $conds[] = "rc_timestamp >= '{$dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 )}'";
+
if( $this->requestedUser != '' ) {
$conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
}
@@ -101,14 +107,15 @@ class ActiveUsersPager extends UsersPager {
function formatRow( $row ) {
global $wgLang;
$userName = $row->user_name;
-
+
$ulinks = $this->getSkin()->userLink( $row->user_id, $userName );
$ulinks .= $this->getSkin()->userToolLinks( $row->user_id, $userName );
$list = array();
foreach( self::getGroups( $row->user_id ) as $group ) {
- if (isset($this->groups[$group]))
+ if ( isset( $this->groups[$group] ) ) {
return;
+ }
$list[] = self::buildGroupLink( $group );
}
$groups = $wgLang->commaList( $list );
@@ -126,14 +133,14 @@ class ActiveUsersPager extends UsersPager {
}
function getPageHeader() {
- global $wgScript, $wgRequest;
+ global $wgScript;
$self = $this->getTitle();
- $limit = $this->mLimit ? Xml::hidden( 'limit', $this->mLimit ) : '';
+ $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
- $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
+ $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
$out .= Xml::fieldset( wfMsg( 'activeusers' ) ) . "\n";
- $out .= Xml::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
+ $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
$out .= Xml::inputLabel( wfMsg( 'activeusers-from' ), 'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
@@ -141,10 +148,10 @@ class ActiveUsersPager extends UsersPager {
$out .= Xml::checkLabel( wfMsg('activeusers-hidesysops'), 'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
- $out .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n";# Submit button and form bottom
+ $out .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n";# Submit button and form bottom
$out .= Xml::closeElement( 'fieldset' );
$out .= Xml::closeElement( 'form' );
-
+
return $out;
}
}
@@ -157,7 +164,7 @@ class SpecialActiveUsers extends SpecialPage {
/**
* Constructor
*/
- public function __construct() {
+ public function __construct() {
parent::__construct( 'Activeusers' );
}
@@ -167,18 +174,19 @@ class SpecialActiveUsers extends SpecialPage {
* @param $par Mixed: parameter passed to the page or null
*/
public function execute( $par ) {
- global $wgOut, $wgLang, $wgRCMaxAge;
+ global $wgOut, $wgLang, $wgActiveUserDays;
$this->setHeaders();
+ $this->outputHeader();
$up = new ActiveUsersPager();
# getBody() first to check, if empty
$usersbody = $up->getBody();
- $s = Html::rawElement( 'div', array( 'class' => 'mw-activeusers-intro' ),
- wfMsgExt( 'activeusers-intro', array( 'parsemag', 'escape' ), $wgLang->formatNum( ceil( $wgRCMaxAge / 86400 ) ) )
- );
+ $s = Html::rawElement( 'div', array( 'class' => 'mw-activeusers-intro' ),
+ wfMsgExt( 'activeusers-intro', array( 'parsemag', 'escape' ), $wgLang->formatNum( $wgActiveUserDays ) )
+ );
$s .= $up->getPageHeader();
if( $usersbody ) {
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
index 1745bf6c..296c6f50 100644
--- a/includes/specials/SpecialAllmessages.php
+++ b/includes/specials/SpecialAllmessages.php
@@ -1,6 +1,29 @@
<?php
/**
+ * Implements Special:Allmessages
+ *
+ * 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
+ */
+
+/**
* Use this special page to get a list of the MediaWiki system messages.
+ *
* @file
* @ingroup SpecialPage
*/
@@ -58,7 +81,7 @@ class SpecialAllmessages extends SpecialPage {
$out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-allmessages-form' ) ) .
Xml::fieldset( wfMsg( 'allmessages-filter-legend' ) ) .
- Xml::hidden( 'title', $this->getTitle() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
'<tr>
<td class="mw-label">' .
@@ -77,19 +100,19 @@ class SpecialAllmessages extends SpecialPage {
'filter',
'unmodified',
'mw-allmessages-form-filter-unmodified',
- ( $this->filter == 'unmodified' ? true : false )
+ ( $this->filter == 'unmodified' )
) .
Xml::radioLabel( wfMsg( 'allmessages-filter-all' ),
'filter',
'all',
'mw-allmessages-form-filter-all',
- ( $this->filter == 'all' ? true : false )
+ ( $this->filter == 'all' )
) .
Xml::radioLabel( wfMsg( 'allmessages-filter-modified' ),
'filter',
'modified',
'mw-allmessages-form-filter-modified',
- ( $this->filter == 'modified' ? true : false )
+ ( $this->filter == 'modified' )
) .
"</td>\n
</tr>
@@ -101,7 +124,7 @@ class SpecialAllmessages extends SpecialPage {
Xml::openElement( 'select', array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' ) );
foreach( $languages as $lang => $name ) {
- $selected = $lang == $this->langCode ? true : false;
+ $selected = $lang == $this->langCode;
$out .= Xml::option( $lang . ' - ' . $name, $lang, $selected ) . "\n";
}
$out .= Xml::closeElement( 'select' ) .
@@ -134,10 +157,7 @@ class AllmessagesTablePager extends TablePager {
$this->mPage = $page;
$this->mConds = $conds;
$this->mDefaultDirection = true; // always sort ascending
- // We want to have an option for people to view *all* the messages,
- // so they can use Ctrl+F to search them. 5000 is the maximum that
- // will get through WebRequest::getLimitOffset().
- $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 => wfMsg('limitall') );
+ $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
global $wgLang, $wgContLang, $wgRequest;
@@ -182,8 +202,8 @@ class AllmessagesTablePager extends TablePager {
// Normalise message names so they look like page titles
$messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
- wfProfileIn( __METHOD__ );
+ wfProfileOut( __METHOD__ );
return $messageNames;
}
@@ -207,7 +227,7 @@ class AllmessagesTablePager extends TablePager {
$pageFlags = $talkFlags = array();
- while( $s = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $s ) {
if( $s->page_namespace == NS_MEDIAWIKI ) {
if( $this->foreign ) {
$title = explode( '/', $s->page_title );
@@ -223,7 +243,6 @@ class AllmessagesTablePager extends TablePager {
$talkFlags[$s->page_title] = true;
}
}
- $dbr->freeResult( $res );
wfProfileOut( __METHOD__ . '-db' );
@@ -327,7 +346,7 @@ class AllmessagesTablePager extends TablePager {
$s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
$formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
if ( $formatted == '' ) {
- $formatted = '&nbsp;';
+ $formatted = '&#160;';
}
$s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
. "</tr>\n";
@@ -375,43 +394,4 @@ class AllmessagesTablePager extends TablePager {
return '';
}
}
-/* Overloads the relevant methods of the real ResultsWrapper so it
- * doesn't go anywhere near an actual database.
- */
-class FakeResultWrapper extends ResultWrapper {
-
- var $result = array();
- var $db = null; // And it's going to stay that way :D
- var $pos = 0;
- var $currentRow = null;
- function __construct( $array ){
- $this->result = $array;
- }
-
- function numRows() {
- return count( $this->result );
- }
-
- function fetchRow() {
- $this->currentRow = $this->result[$this->pos++];
- return $this->currentRow;
- }
-
- function seek( $row ) {
- $this->pos = $row;
- }
-
- function free() {}
-
- // Callers want to be able to access fields with $this->fieldName
- function fetchObject(){
- $this->currentRow = $this->result[$this->pos++];
- return (object)$this->currentRow;
- }
-
- function rewind() {
- $this->pos = 0;
- $this->currentRow = null;
- }
-}
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
index 19816dcd..5fa1aa47 100644
--- a/includes/specials/SpecialAllpages.php
+++ b/includes/specials/SpecialAllpages.php
@@ -1,7 +1,29 @@
<?php
-
/**
* Implements Special:Allpages
+ *
+ * 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
+ */
+
+/**
+ * Implements Special:Allpages
+ *
* @ingroup SpecialPage
*/
class SpecialAllpages extends IncludableSpecialPage {
@@ -32,8 +54,8 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* Entry point : initialise variables and call subfunctions.
+ *
* @param $par String: becomes "FOO" when called like Special:Allpages/FOO (default NULL)
- * @param $specialPage See the SpecialPage object.
*/
function execute( $par ) {
global $wgRequest, $wgOut, $wgContLang;
@@ -66,9 +88,10 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* HTML for the top form
- * @param integer $namespace A namespace constant (default NS_MAIN).
- * @param string $from dbKey we are starting listing at.
- * @param string $to dbKey we are ending listing at.
+ *
+ * @param $namespace Integer: a namespace constant (default NS_MAIN).
+ * @param $from String: dbKey we are starting listing at.
+ * @param $to String: dbKey we are ending listing at.
*/
function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '' ) {
global $wgScript;
@@ -76,7 +99,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
- $out .= Xml::hidden( 'title', $t->getPrefixedText() );
+ $out .= Html::hidden( 'title', $t->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
$out .= Xml::element( 'legend', null, wfMsg( 'allpages' ) );
$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
@@ -113,7 +136,9 @@ class SpecialAllpages extends IncludableSpecialPage {
}
/**
- * @param integer $namespace (default NS_MAIN)
+ * @param $namespace Integer (default NS_MAIN)
+ * @param $from String: list all pages from this name
+ * @param $to String: list all pages to this name
*/
function showToplevel( $namespace = NS_MAIN, $from = '', $to = '' ) {
global $wgOut;
@@ -164,7 +189,8 @@ class SpecialAllpages extends IncludableSpecialPage {
array ('LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC')
);
- if( $s = $dbr->fetchObject( $res ) ) {
+ $s = $dbr->fetchObject( $res );
+ if( $s ) {
array_push( $lines, $s->page_title );
} else {
// Final chunk, but ended prematurely. Go back and find the end.
@@ -174,7 +200,8 @@ class SpecialAllpages extends IncludableSpecialPage {
array_push( $lines, $endTitle );
$done = true;
}
- if( $s = $res->fetchObject() ) {
+ $s = $res->fetchObject();
+ if( $s ) {
array_push( $lines, $s->page_title );
$lastTitle = $s->page_title;
} else {
@@ -234,9 +261,10 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* Show a line of "ABC to DEF" ranges of articles
- * @param string $inpoint Lower limit of pagenames
- * @param string $outpout Upper limit of pagenames
- * @param integer $namespace (Default NS_MAIN)
+ *
+ * @param $inpoint String: lower limit of pagenames
+ * @param $outpoint String: upper limit of pagenames
+ * @param $namespace Integer (Default NS_MAIN)
*/
function showline( $inpoint, $outpoint, $namespace = NS_MAIN ) {
global $wgContLang;
@@ -258,9 +286,9 @@ class SpecialAllpages extends IncludableSpecialPage {
}
/**
- * @param integer $namespace (Default NS_MAIN)
- * @param string $from list all pages from this name (default FALSE)
- * @param string $to list all pages to this name (default FALSE)
+ * @param $namespace Integer (Default NS_MAIN)
+ * @param $from String: list all pages from this name (default FALSE)
+ * @param $to String: list all pages to this name (default FALSE)
*/
function showChunk( $namespace = NS_MAIN, $from = false, $to = false ) {
global $wgOut, $wgUser, $wgContLang, $wgLang;
@@ -280,7 +308,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$namespace = NS_MAIN;
} else {
list( $namespace, $fromKey, $from ) = $fromList;
- list( $namespace2, $toKey, $to ) = $toList;
+ list( , $toKey, $to ) = $toList;
$dbr = wfGetDB( DB_SLAVE );
$conds = array(
@@ -316,7 +344,7 @@ class SpecialAllpages extends IncludableSpecialPage {
if( $n % 3 == 0 ) {
$out .= '<tr>';
}
- $out .= "<td width=\"33%\">$link</td>";
+ $out .= "<td style=\"width:33%\">$link</td>";
$n++;
if( $n % 3 == 0 ) {
$out .= "</tr>\n";
@@ -437,8 +465,8 @@ class SpecialAllpages extends IncludableSpecialPage {
}
/**
- * @param int $ns the namespace of the article
- * @param string $text the name of the article
+ * @param $ns Integer: the namespace of the article
+ * @param $text String: the name of the article
* @return array( int namespace, string dbkey, string pagename ) or NULL on error
* @static (sort of)
* @access private
diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php
index 92192435..2d5047d2 100644
--- a/includes/specials/SpecialAncientpages.php
+++ b/includes/specials/SpecialAncientpages.php
@@ -1,11 +1,29 @@
<?php
/**
+ * Implements Special:Ancientpages
+ *
+ * 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
*/
/**
* Implements Special:Ancientpages
+ *
* @ingroup SpecialPage
*/
class AncientPagesPage extends QueryPage {
@@ -21,28 +39,10 @@ class AncientPagesPage extends QueryPage {
function isSyndicated() { return false; }
function getSQL() {
- global $wgDBtype;
$db = wfGetDB( DB_SLAVE );
$page = $db->tableName( 'page' );
$revision = $db->tableName( 'revision' );
-
- switch ($wgDBtype) {
- case 'mysql':
- $epoch = 'UNIX_TIMESTAMP(rev_timestamp)';
- break;
- case 'ibm_db2':
- // TODO implement proper conversion to a Unix epoch
- $epoch = 'rev_timestamp';
- break;
- case 'oracle':
- $epoch = '((trunc(rev_timestamp) - to_date(\'19700101\',\'YYYYMMDD\')) * 86400)';
- break;
- case 'sqlite':
- $epoch = 'rev_timestamp';
- break;
- default:
- $epoch = 'EXTRACT(epoch FROM rev_timestamp)';
- }
+ $epoch = $db->unixTimestamp( 'rev_timestamp' );
return
"SELECT 'Ancientpages' as type,
diff --git a/includes/specials/SpecialBlankpage.php b/includes/specials/SpecialBlankpage.php
index e1fadd02..aaa45a80 100644
--- a/includes/specials/SpecialBlankpage.php
+++ b/includes/specials/SpecialBlankpage.php
@@ -1,5 +1,27 @@
<?php
/**
+ * Implements Special:Blankpage
+ *
+ * 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
+ */
+
+/**
* Special page designed for basic benchmarking of
* MediaWiki since it doesn't really do much.
*
diff --git a/includes/specials/SpecialBlockip.php b/includes/specials/SpecialBlockip.php
index 16720dd1..28a0f3f1 100644
--- a/includes/specials/SpecialBlockip.php
+++ b/includes/specials/SpecialBlockip.php
@@ -1,52 +1,78 @@
<?php
/**
- * Constructor for Special:Blockip page
+ * Implements Special:Blockip
+ *
+ * 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
*/
/**
- * Constructor
+ * A special page that allows users with 'block' right to block users from
+ * editing pages and other actions
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialBlockip( $par ) {
- global $wgUser, $wgOut, $wgRequest;
+class IPBlockForm extends SpecialPage {
+ var $BlockAddress, $BlockExpiry, $BlockReason, $BlockReasonList, $BlockOther, $BlockAnonOnly, $BlockCreateAccount,
+ $BlockEnableAutoblock, $BlockEmail, $BlockHideName, $BlockAllowUsertalk, $BlockReblock;
+ // The maximum number of edits a user can have and still be hidden
+ const HIDEUSER_CONTRIBLIMIT = 1000;
- # Can't block when the database is locked
- if( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
- # Permission check
- if( !$wgUser->isAllowed( 'block' ) ) {
- $wgOut->permissionRequired( 'block' );
- return;
+ public function __construct() {
+ parent::__construct( 'Blockip', 'block' );
}
- $ipb = new IPBlockForm( $par );
+ public function execute( $par ) {
+ global $wgUser, $wgOut, $wgRequest;
- $action = $wgRequest->getVal( 'action' );
- if( 'success' == $action ) {
- $ipb->showSuccess();
- } elseif( $wgRequest->wasPosted() && 'submit' == $action &&
- $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- $ipb->doSubmit();
- } else {
- $ipb->showForm( '' );
- }
-}
+ # Can't block when the database is locked
+ if( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
+ # Permission check
+ if( !$this->userCanExecute( $wgUser ) ) {
+ $wgOut->permissionRequired( 'block' );
+ return;
+ }
-/**
- * Form object for the Special:Blockip page.
- *
- * @ingroup SpecialPage
- */
-class IPBlockForm {
- var $BlockAddress, $BlockExpiry, $BlockReason;
- // The maximum number of edits a user can have and still be hidden
- const HIDEUSER_CONTRIBLIMIT = 1000;
+ $this->setup( $par );
+
+ # bug 15810: blocked admins should have limited access here
+ if ( $wgUser->isBlocked() ) {
+ $status = IPBlockForm::checkUnblockSelf( $this->BlockAddress );
+ if ( $status !== true ) {
+ throw new ErrorPageError( 'badaccess', $status );
+ }
+ }
- public function __construct( $par ) {
+ $action = $wgRequest->getVal( 'action' );
+ if( 'success' == $action ) {
+ $this->showSuccess();
+ } elseif( $wgRequest->wasPosted() && 'submit' == $action &&
+ $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
+ $this->doSubmit();
+ } else {
+ $this->showForm( '' );
+ }
+ }
+
+ private function setup( $par ) {
global $wgRequest, $wgUser, $wgBlockAllowsUTEdit;
$this->BlockAddress = $wgRequest->getVal( 'wpBlockAddress', $wgRequest->getVal( 'ip', $par ) );
@@ -105,7 +131,7 @@ class IPBlockForm {
$msg = wfMsgReal( $key, $err );
$wgOut->setSubtitle( wfMsgHtml( 'formerror' ) );
$wgOut->addHTML( Xml::tags( 'p', array( 'class' => 'error' ), $msg ) );
- } elseif( $this->BlockAddress ) {
+ } elseif( $this->BlockAddress !== null ) {
# Get other blocks, i.e. from GlobalBlocking or TorBlock extension
wfRunHooks( 'OtherBlockLogLink', array( &$otherBlockedMsgs, $this->BlockAddress ) );
@@ -149,7 +175,7 @@ class IPBlockForm {
# Username/IP is blocked already locally
if( $alreadyBlocked ) {
- $wgOut->addWikiMsg( 'ipb-needreblock', $this->BlockAddress );
+ $wgOut->wrapWikiMsg( "<div class='mw-ipb-needreblock'>\n$1\n</div>", array( 'ipb-needreblock', $this->BlockAddress ) );
}
$scBlockExpiryOptions = wfMsgForContent( 'ipboptions' );
@@ -163,16 +189,15 @@ class IPBlockForm {
list( $show, $value ) = explode( ':', $option );
$show = htmlspecialchars( $show );
$value = htmlspecialchars( $value );
- $blockExpiryFormOptions .= Xml::option( $show, $value, $this->BlockExpiry === $value ? true : false ) . "\n";
+ $blockExpiryFormOptions .= Xml::option( $show, $value, $this->BlockExpiry === $value ) . "\n";
}
$reasonDropDown = Xml::listDropDown( 'wpBlockReasonList',
wfMsgForContent( 'ipbreason-dropdown' ),
wfMsgForContent( 'ipbreasonotherlist' ), $this->BlockReasonList, 'wpBlockDropDown', 4 );
- global $wgStylePath, $wgStyleVersion;
+ $wgOut->addModules( 'mediawiki.legacy.block' );
$wgOut->addHTML(
- Xml::tags( 'script', array( 'type' => 'text/javascript', 'src' => "$wgStylePath/common/block.js?$wgStyleVersion" ), '' ) .
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $titleObj->getLocalURL( 'action=submit' ), 'id' => 'blockip' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'blockip-legend' ) ) .
@@ -242,7 +267,7 @@ class IPBlockForm {
</td>
</tr>
<tr id='wpAnonOnlyRow'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg( 'ipbanononly' ),
'wpAnonOnly', 'wpAnonOnly', $this->BlockAnonOnly,
@@ -250,7 +275,7 @@ class IPBlockForm {
</td>
</tr>
<tr id='wpCreateAccountRow'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg( 'ipbcreateaccount' ),
'wpCreateAccount', 'wpCreateAccount', $this->BlockCreateAccount,
@@ -258,7 +283,7 @@ class IPBlockForm {
</td>
</tr>
<tr id='wpEnableAutoblockRow'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg( 'ipbenableautoblock' ),
'wpEnableAutoblock', 'wpEnableAutoblock', $this->BlockEnableAutoblock,
@@ -270,7 +295,7 @@ class IPBlockForm {
if( self::canBlockEmail( $wgUser ) ) {
$wgOut->addHTML("
<tr id='wpEnableEmailBan'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg( 'ipbemailban' ),
'wpEmailBan', 'wpEmailBan', $this->BlockEmail,
@@ -284,7 +309,7 @@ class IPBlockForm {
if( $wgUser->isAllowed( 'hideuser' ) ) {
$wgOut->addHTML("
<tr id='wpEnableHideUser'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'><strong>" .
Xml::checkLabel( wfMsg( 'ipbhidename' ),
'wpHideName', 'wpHideName', $this->BlockHideName,
@@ -299,7 +324,7 @@ class IPBlockForm {
if( $wgUser->isLoggedIn() ) {
$wgOut->addHTML("
<tr id='wpEnableWatchUser'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg( 'ipbwatchuser' ),
'wpWatchUser', 'wpWatchUser', $this->BlockWatchUser,
@@ -314,7 +339,7 @@ class IPBlockForm {
if( $wgBlockAllowsUTEdit ){
$wgOut->addHTML("
<tr id='wpAllowUsertalkRow'>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg( 'ipballowusertalk' ),
'wpAllowUsertalk', 'wpAllowUsertalk', $this->BlockAllowUsertalk,
@@ -326,18 +351,18 @@ class IPBlockForm {
$wgOut->addHTML("
<tr>
- <td style='padding-top: 1em'>&nbsp;</td>
+ <td style='padding-top: 1em'>&#160;</td>
<td class='mw-submit' style='padding-top: 1em'>" .
Xml::submitButton( wfMsg( $alreadyBlocked ? 'ipb-change-block' : 'ipbsubmit' ),
- array( 'name' => 'wpBlock', 'tabindex' => '13', 'accesskey' => 's' ) ) . "
+ array( 'name' => 'wpBlock', 'tabindex' => '13' )
+ + $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'blockip-block' ) ). "
</td>
</tr>" .
Xml::closeElement( 'table' ) .
- Xml::hidden( 'wpEditToken', $wgUser->editToken() ) .
- ( $alreadyBlocked ? Xml::hidden( 'wpChangeBlock', 1 ) : "" ) .
+ Html::hidden( 'wpEditToken', $wgUser->editToken() ) .
+ ( $alreadyBlocked ? Html::hidden( 'wpChangeBlock', 1 ) : "" ) .
Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' ) .
- Xml::tags( 'script', array( 'type' => 'text/javascript' ), 'updateBlockOptions()' ) . "\n"
+ Xml::closeElement( 'form' )
);
$wgOut->addHTML( $this->getConvenienceLinks() );
@@ -353,13 +378,39 @@ class IPBlockForm {
/**
* Can we do an email block?
- * @param User $user The sysop wanting to make a block
- * @return boolean
+ * @param $user User: the sysop wanting to make a block
+ * @return Boolean
*/
public static function canBlockEmail( $user ) {
global $wgEnableUserEmail, $wgSysopEmailBans;
return ( $wgEnableUserEmail && $wgSysopEmailBans && $user->isAllowed( 'blockemail' ) );
}
+
+ /**
+ * bug 15810: blocked admins should not be able to block/unblock
+ * others, and probably shouldn't be able to unblock themselves
+ * either.
+ * @param $user User, Int or String
+ */
+ public static function checkUnblockSelf( $user ) {
+ global $wgUser;
+ if ( is_int( $user ) ) {
+ $user = User::newFromId( $user );
+ } elseif ( is_string( $user ) ) {
+ $user = User::newFromName( $user );
+ }
+ if( $user instanceof User && $user->getId() == $wgUser->getId() ) {
+ # User is trying to unblock themselves
+ if ( $wgUser->isAllowed( 'unblockself' ) ) {
+ return true;
+ } else {
+ return 'ipbnounblockself';
+ }
+ } else {
+ # User is trying to block/unblock someone else
+ return 'ipbblocked';
+ }
+ }
/**
* Backend block code.
@@ -382,7 +433,7 @@ class IPBlockForm {
$matches = array();
if( preg_match( "/^($rxIP4)\\/(\\d{1,2})$/", $this->BlockAddress, $matches ) ) {
# IPv4
- if( $wgSysopRangeBans ) {
+ if( $wgSysopRangeBans && $wgBlockCIDRLimit['IPv4'] != 32 ) {
if( !IP::isIPv4( $this->BlockAddress ) || $matches[2] > 32 ) {
return array( 'ip_range_invalid' );
} elseif ( $matches[2] < $wgBlockCIDRLimit['IPv4'] ) {
@@ -395,7 +446,7 @@ class IPBlockForm {
}
} elseif( preg_match( "/^($rxIP6)\\/(\\d{1,3})$/", $this->BlockAddress, $matches ) ) {
# IPv6
- if( $wgSysopRangeBans ) {
+ if( $wgSysopRangeBans && $wgBlockCIDRLimit['IPv6'] != 128 ) {
if( !IP::isIPv6( $this->BlockAddress ) || $matches[2] > 128 ) {
return array( 'ip_range_invalid' );
} elseif( $matches[2] < $wgBlockCIDRLimit['IPv6'] ) {
@@ -410,7 +461,7 @@ class IPBlockForm {
# Username block
if( $wgSysopUserBans ) {
$user = User::newFromName( $this->BlockAddress );
- if( !is_null( $user ) && $user->getId() ) {
+ if( $user instanceof User && $user->getId() ) {
# Use canonical name
$userId = $user->getId();
$this->BlockAddress = $user->getName();
@@ -642,7 +693,7 @@ class IPBlockForm {
);
// Add suppression block entries if allowed
- if( $wgUser->isAllowed( 'hideuser' ) ) {
+ if( $wgUser->isAllowed( 'suppressionlog' ) ) {
LogEventsList::showLogExtract( $out, 'suppress', $title->getPrefixedText(), '',
array(
'lim' => 10,
@@ -759,32 +810,20 @@ class IPBlockForm {
* @return string
*/
private function getBlockListLink( $skin ) {
- $list = SpecialPage::getTitleFor( 'Ipblocklist' );
- $query = array();
-
- if( $this->BlockAddress ) {
- $addr = strtr( $this->BlockAddress, '_', ' ' );
- $message = wfMsg( 'ipb-blocklist-addr', $addr );
- $query['ip'] = $this->BlockAddress;
- } else {
- $message = wfMsg( 'ipb-blocklist' );
- }
-
return $skin->linkKnown(
- $list,
- htmlspecialchars( $message ),
- array(),
- $query
+ SpecialPage::getTitleFor( 'Ipblocklist' ),
+ wfMsg( 'ipb-blocklist' )
);
}
/**
* Block a list of selected users
- * @param array $users
- * @param string $reason
- * @param string $tag replaces user pages
- * @param string $talkTag replaces user talk pages
- * @returns array, list of html-safe usernames
+ *
+ * @param $users Array
+ * @param $reason String
+ * @param $tag String: replaces user pages
+ * @param $talkTag String: replaces user talk pages
+ * @return Array: list of html-safe usernames
*/
public static function doMassUserBlock( $users, $reason = '', $tag = '', $talkTag = '' ) {
global $wgUser;
diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php
index f222e3c6..f5131f5f 100644
--- a/includes/specials/SpecialBlockme.php
+++ b/includes/specials/SpecialBlockme.php
@@ -1,37 +1,59 @@
<?php
/**
+ * Implements Special:Blockme
+ *
+ * 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
*/
/**
+ * A special page called by proxy_check.php to block open proxies
*
+ * @ingroup SpecialPage
*/
-function wfSpecialBlockme() {
- global $wgRequest, $wgBlockOpenProxies, $wgOut, $wgProxyKey;
-
- $ip = wfGetIP();
+class SpecialBlockme extends UnlistedSpecialPage {
- if( !$wgBlockOpenProxies || $wgRequest->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
- $wgOut->addWikiMsg( 'proxyblocker-disabled' );
- return;
+ function __construct() {
+ parent::__construct( 'Blockme' );
}
- $blockerName = wfMsg( "proxyblocker" );
- $reason = wfMsg( "proxyblockreason" );
-
- $u = User::newFromName( $blockerName );
- $id = $u->idForName();
- if ( !$id ) {
- $u = User::newFromName( $blockerName );
- $u->addToDatabase();
- $u->setPassword( bin2hex( mt_rand(0, 0x7fffffff ) ) );
- $u->saveSettings();
- $id = $u->getID();
- }
+ function execute( $par ) {
+ global $wgRequest, $wgOut, $wgBlockOpenProxies, $wgProxyKey;
+
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $ip = wfGetIP();
+ if( !$wgBlockOpenProxies || $wgRequest->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
+ $wgOut->addWikiMsg( 'proxyblocker-disabled' );
+ return;
+ }
- $block = new Block( $ip, 0, $id, $reason, wfTimestampNow() );
- $block->insert();
+ $user = User::newFromName( wfMsgForContent( 'proxyblocker' ) );
+ if ( !$user->isLoggedIn() ) {
+ $user->addToDatabase();
+ }
+ $id = $user->getId();
+ $reason = wfMsg( 'proxyblockreason' );
- $wgOut->addWikiMsg( "proxyblocksuccess" );
+ $block = new Block( $ip, 0, $id, $reason, wfTimestampNow() );
+ $block->insert();
+
+ $wgOut->addWikiMsg( 'proxyblocksuccess' );
+ }
}
diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php
index 8ee5467a..67fb5404 100644
--- a/includes/specials/SpecialBooksources.php
+++ b/includes/specials/SpecialBooksources.php
@@ -1,4 +1,25 @@
<?php
+/**
+ * Implements Special:Booksources
+ *
+ * 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
+ */
/**
* Special page outputs information on sourcing a book with a particular ISBN
@@ -35,7 +56,7 @@ class SpecialBookSources extends SpecialPage {
$wgOut->addHTML( $this->makeForm() );
if( strlen( $this->isbn ) > 0 ) {
if( !self::isValidISBN( $this->isbn ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1</div>", 'booksources-invalid-isbn' );
+ $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
}
$this->showList();
}
@@ -48,7 +69,6 @@ class SpecialBookSources extends SpecialPage {
public static function isValidISBN( $isbn ) {
$isbn = self::cleanIsbn( $isbn );
$sum = 0;
- $check = -1;
if( strlen( $isbn ) == 13 ) {
for( $i = 0; $i < 12; $i++ ) {
if($i % 2 == 0) {
@@ -78,7 +98,6 @@ class SpecialBookSources extends SpecialPage {
return false;
}
-
/**
* Trim ISBN and remove characters which aren't required
*
@@ -99,9 +118,9 @@ class SpecialBookSources extends SpecialPage {
$title = self::getTitleFor( 'Booksources' );
$form = '<fieldset><legend>' . wfMsgHtml( 'booksources-search-legend' ) . '</legend>';
$form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
- $form .= Xml::hidden( 'title', $title->getPrefixedText() );
+ $form .= Html::hidden( 'title', $title->getPrefixedText() );
$form .= '<p>' . Xml::inputLabel( wfMsg( 'booksources-isbn' ), 'isbn', 'isbn', 20, $this->isbn );
- $form .= '&nbsp;' . Xml::submitButton( wfMsg( 'booksources-go' ) ) . '</p>';
+ $form .= '&#160;' . Xml::submitButton( wfMsg( 'booksources-go' ) ) . '</p>';
$form .= Xml::closeElement( 'form' );
$form .= '</fieldset>';
return $form;
@@ -147,6 +166,6 @@ class SpecialBookSources extends SpecialPage {
*/
private function makeListItem( $label, $url ) {
$url = str_replace( '$1', $this->isbn, $url );
- return '<li><a href="' . htmlspecialchars( $url ) . '">' . htmlspecialchars( $label ) . '</a></li>';
+ return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
}
}
diff --git a/includes/specials/SpecialBrokenRedirects.php b/includes/specials/SpecialBrokenRedirects.php
index b6ae2ada..98b02126 100644
--- a/includes/specials/SpecialBrokenRedirects.php
+++ b/includes/specials/SpecialBrokenRedirects.php
@@ -1,12 +1,30 @@
<?php
/**
+ * Implements Special:Brokenredirects
+ *
+ * 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
*/
/**
- * A special page listing redirects to non existent page. Those should be
+ * A special page listing redirects tonon existent page. Those should be
* fixed to point to an existing page.
+ *
* @ingroup SpecialPage
*/
class BrokenRedirectsPage extends PageQueryPage {
@@ -61,7 +79,7 @@ class BrokenRedirectsPage extends PageQueryPage {
// $toObj may very easily be false if the $result list is cached
if ( !is_object( $toObj ) ) {
- return '<s>' . $skin->link( $fromObj ) . '</s>';
+ return '<del>' . $skin->link( $fromObj ) . '</del>';
}
$from = $skin->linkKnown(
diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php
index eb49fdbc..c2dd40cd 100644
--- a/includes/specials/SpecialCategories.php
+++ b/includes/specials/SpecialCategories.php
@@ -1,29 +1,57 @@
<?php
/**
+ * Implements Special:Categories
+ *
+ * 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
*/
-function wfSpecialCategories( $par=null ) {
- global $wgOut, $wgRequest;
+/**
+ * @ingroup SpecialPage
+ */
+class SpecialCategories extends SpecialPage {
+
+ function __construct() {
+ parent::__construct( 'Categories' );
+ }
+
+ function execute( $par ) {
+ global $wgOut, $wgRequest;
+
+ $this->setHeaders();
+ $this->outputHeader();
+ $wgOut->allowClickjacking();
- if( $par == '' ) {
- $from = $wgRequest->getText( 'from' );
- } else {
- $from = $par;
+ $from = $wgRequest->getText( 'from', $par );
+
+ $cap = new CategoryPager( $from );
+ $cap->doQuery();
+
+ $wgOut->addHTML(
+ Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
+ wfMsgExt( 'categoriespagetext', array( 'parse' ), $cap->getNumRows() ) .
+ $cap->getStartForm( $from ) .
+ $cap->getNavigationBar() .
+ '<ul>' . $cap->getBody() . '</ul>' .
+ $cap->getNavigationBar() .
+ Html::closeElement( 'div' )
+ );
}
- $wgOut->allowClickjacking();
- $cap = new CategoryPager( $from );
- $cap->doQuery();
- $wgOut->addHTML(
- XML::openElement( 'div', array('class' => 'mw-spcontent') ) .
- wfMsgExt( 'categoriespagetext', array( 'parse' ), $cap->getNumRows() ) .
- $cap->getStartForm( $from ) .
- $cap->getNavigationBar() .
- '<ul>' . $cap->getBody() . '</ul>' .
- $cap->getNavigationBar() .
- XML::closeElement( 'div' )
- );
}
/**
@@ -77,7 +105,7 @@ class CategoryPager extends AlphabeticPager {
$this->mResult->rewind();
- while ( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_CATEGORY, $row->cat_title ) );
}
$batch->execute();
@@ -100,7 +128,7 @@ class CategoryPager extends AlphabeticPager {
return
Xml::tags( 'form', array( 'method' => 'get', 'action' => $wgScript ),
- Xml::hidden( 'title', $t->getPrefixedText() ) .
+ Html::hidden( 'title', $t->getPrefixedText() ) .
Xml::fieldset( wfMsg( 'categories' ),
Xml::inputLabel( wfMsg( 'categoriesfrom' ),
'from', 'from', 20, $from ) .
diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php
new file mode 100644
index 00000000..4650fc94
--- /dev/null
+++ b/includes/specials/SpecialComparePages.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ * Implements Special:ComparePages
+ *
+ * Copyright © 2010 Derk-Jan Hartman <hartman@videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Implements Special:ComparePages
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialComparePages extends SpecialPage {
+
+ // Stored objects
+ protected $opts, $skin;
+
+ // Some internal settings
+ protected $showNavigation = false;
+
+ public function __construct() {
+ parent::__construct( 'ComparePages' );
+ }
+
+ protected function setup( $par ) {
+ global $wgRequest, $wgUser;
+
+ // Options
+ $opts = new FormOptions();
+ $this->opts = $opts; // bind
+ $opts->add( 'page1', '' );
+ $opts->add( 'page2', '' );
+ $opts->add( 'rev1', '' );
+ $opts->add( 'rev2', '' );
+ $opts->add( 'action', '' );
+
+ // Set values
+ $opts->fetchValuesFromRequest( $wgRequest );
+
+ $title1 = Title::newFromText( $opts->getValue( 'page1' ) );
+ $title2 = Title::newFromText( $opts->getValue( 'page2' ) );
+
+ if( $title1 && $title1->exists() && $opts->getValue( 'rev1' ) == '' ) {
+ $pda = new Article( $title1 );
+ $pdi = $pda->getID();
+ $pdLastRevision = Revision::loadFromPageId( wfGetDB( DB_SLAVE ), $pdi );
+ $opts->setValue( 'rev1', $pdLastRevision->getId() );
+ } elseif ( $opts->getValue( 'rev1' ) != '' ) {
+ $pdrev = Revision::newFromId( $opts->getValue( 'rev1' ) );
+ if( $pdrev ) $opts->setValue( 'page1', $pdrev->getTitle()->getPrefixedText() );
+ }
+ if( $title2 && $title2->exists() && $opts->getValue( 'rev2' ) == '' ) {
+ $pda = new Article( $title2 );
+ $pdi = $pda->getID();
+ $pdLastRevision = Revision::loadFromPageId( wfGetDB( DB_SLAVE ), $pdi );
+ $opts->setValue('rev2', $pdLastRevision->getId() );
+ } elseif ( $opts->getValue( 'rev2' ) != '' ) {
+ $pdrev = Revision::newFromId( $opts->getValue( 'rev2' ) );
+ if( $pdrev ) $opts->setValue( 'page2', $pdrev->getTitle()->getPrefixedText() );
+ }
+
+ // Store some objects
+ $this->skin = $wgUser->getSkin();
+ }
+
+ /**
+ * Show a form for filtering namespace and username
+ *
+ * @param $par String
+ * @return String
+ */
+ public function execute( $par ) {
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $this->setup( $par );
+
+ // Settings
+ $this->form();
+
+ if( $this->opts->getValue( 'rev1' ) && $this->opts->getValue( 'rev2' ) ) {
+ $de = new DifferenceEngine( null,
+ $this->opts->getValue( 'rev1' ),
+ $this->opts->getValue( 'rev2' ),
+ null, // rcid
+ ( $this->opts->getValue( 'action' ) == 'purge' ),
+ false );
+ $de->showDiffPage( true );
+ }
+ }
+
+ protected function form() {
+ global $wgOut, $wgScript;
+
+ // Consume values
+ $page1 = $this->opts->consumeValue( 'page1' );
+ $page2 = $this->opts->consumeValue( 'page2' );
+ $rev1 = $this->opts->consumeValue( 'rev1' );
+ $rev2 = $this->opts->consumeValue( 'rev2' );
+
+ // Store query values in hidden fields so that form submission doesn't lose them
+ $hidden = array();
+ foreach ( $this->opts->getUnconsumedValues() as $key => $value ) {
+ $hidden[] = Html::hidden( $key, $value );
+ }
+ $hidden = implode( "\n", $hidden );
+
+ $form = Html::openElement( 'form', array( 'action' => $wgScript ) ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+ Xml::fieldset( wfMsg( 'compare-selector' ) ) .
+ Html::openElement( 'table', array( 'id' => 'mw-diff-table', 'style' => 'width:100%' ) ) .
+ "<tr>
+ <td class='mw-label' style='width:10%'>" .
+ Html::element( 'label', array( 'for' => 'page1' ), wfMsg( 'compare-page1' ) ) .
+ "</td>
+ <td class='mw-input' style='width:40%'>" .
+ Html::input( 'page1', $page1, 'text', array( 'size' => 40, 'id' => 'page1' ) ) .
+ "</td>
+ <td class='mw-label' style='width:10%'>" .
+ Html::element( 'label', array( 'for' => 'page2' ), wfMsg( 'compare-page2' ) ) .
+ "</td>
+ <td class='mw-input' style='width:40%'>" .
+ Html::input( 'page2', $page2, 'text', array( 'size' => 40, 'id' => 'page2' ) ) .
+ "</td>
+ </tr>" .
+ "<tr>
+ <td class='mw-label'>" .
+ Html::element( 'label', array( 'for' => 'rev1' ), wfMsg( 'compare-rev1' ) ) .
+ "</td>
+ <td class='mw-input'>" .
+ Html::input( 'rev1', $rev1, 'text', array( 'size' => 8, 'id' => 'rev1' ) ) .
+ "</td>
+ <td class='mw-label'>" .
+ Html::element( 'label', array( 'for' => 'rev2' ), wfMsg( 'compare-rev2' ) ) .
+ "</td>
+ <td class='mw-input'>" .
+ Html::input( 'rev2', $rev2, 'text', array( 'size' => 8, 'id' => 'rev2' ) ) .
+ "</td>
+ </tr>" .
+ "<tr> <td></td>
+ <td class='mw-submit' colspan='3'>" .
+ Xml::submitButton( wfMsg( 'compare-submit' ) ) .
+ "</td>
+ </tr>" .
+ Html::closeElement( 'table' ) .
+ Html::closeElement( 'fieldset' ) .
+ $hidden .
+ Html::closeElement( 'form' );
+
+ $wgOut->addHTML( $form );
+ }
+}
diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php
index 372a574c..e556a60b 100644
--- a/includes/specials/SpecialConfirmemail.php
+++ b/includes/specials/SpecialConfirmemail.php
@@ -1,4 +1,25 @@
<?php
+/**
+ * Implements Special:Confirmemail and Special:Invalidateemail
+ *
+ * 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
+ */
/**
* Special page allows users to request email confirmation message, and handles
@@ -25,6 +46,12 @@ class EmailConfirmation extends UnlistedSpecialPage {
function execute( $code ) {
global $wgUser, $wgOut;
$this->setHeaders();
+
+ if ( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
+
if( empty( $code ) ) {
if( $wgUser->isLoggedIn() ) {
if( User::isValidEmailAddr( $wgUser->getEmail() ) ) {
@@ -54,11 +81,11 @@ class EmailConfirmation extends UnlistedSpecialPage {
function showRequestForm() {
global $wgOut, $wgUser, $wgLang, $wgRequest;
if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getText( 'token' ) ) ) {
- $ok = $wgUser->sendConfirmationMail();
- if ( WikiError::isError( $ok ) ) {
- $wgOut->addWikiMsg( 'confirmemail_sendfailed', $ok->toString() );
- } else {
+ $status = $wgUser->sendConfirmationMail();
+ if ( $status->isGood() ) {
$wgOut->addWikiMsg( 'confirmemail_sent' );
+ } else {
+ $wgOut->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
}
} else {
if( $wgUser->isEmailConfirmed() ) {
@@ -71,11 +98,11 @@ class EmailConfirmation extends UnlistedSpecialPage {
$wgOut->addWikiMsg( 'emailauthenticated', $time, $d, $t );
}
if( $wgUser->isEmailConfirmationPending() ) {
- $wgOut->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1</div>", 'confirmemail_pending' );
+ $wgOut->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
}
$wgOut->addWikiMsg( 'confirmemail_text' );
$form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
- $form .= Xml::hidden( 'token', $wgUser->editToken() );
+ $form .= Html::hidden( 'token', $wgUser->editToken() );
$form .= Xml::submitButton( wfMsg( 'confirmemail_send' ) );
$form .= Xml::closeElement( 'form' );
$wgOut->addHTML( $form );
@@ -121,6 +148,13 @@ class EmailInvalidation extends UnlistedSpecialPage {
function execute( $code ) {
$this->setHeaders();
+
+ if ( wfReadOnly() ) {
+ global $wgOut;
+ $wgOut->readOnlyPage();
+ return;
+ }
+
$this->attemptInvalidate( $code );
}
diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php
index b5d6107a..cee01a7f 100644
--- a/includes/specials/SpecialContributions.php
+++ b/includes/specials/SpecialContributions.php
@@ -1,10 +1,32 @@
<?php
/**
- * Special:Contributions, show user contributions in a paged list
+ * Implements Special:Contributions
+ *
+ * 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
*/
-
+
+/**
+ * Special:Contributions, show user contributions in a paged list
+ *
+ * @ingroup SpecialPage
+ */
+
class SpecialContributions extends SpecialPage {
public function __construct() {
@@ -12,7 +34,7 @@ class SpecialContributions extends SpecialPage {
}
public function execute( $par ) {
- global $wgUser, $wgOut, $wgLang, $wgRequest;
+ global $wgUser, $wgOut, $wgRequest;
$this->setHeaders();
$this->outputHeader();
@@ -34,6 +56,8 @@ class SpecialContributions extends SpecialPage {
$this->opts['contribs'] = 'newbie';
}
+ $this->opts['deletedOnly'] = $wgRequest->getBool( 'deletedOnly' );
+
if( !strlen( $target ) ) {
$wgOut->addHTML( $this->getForm() );
return;
@@ -41,6 +65,7 @@ class SpecialContributions extends SpecialPage {
$this->opts['limit'] = $wgRequest->getInt( 'limit', $wgUser->getOption('rclimit') );
$this->opts['target'] = $target;
+ $this->opts['topOnly'] = $wgRequest->getBool( 'topOnly' );
$nt = Title::makeTitleSafe( NS_USER, $target );
if( !$nt ) {
@@ -64,10 +89,10 @@ class SpecialContributions extends SpecialPage {
$this->opts['namespace'] = '';
}
- $this->opts['tagfilter'] = (string) $wgRequest->getVal( 'tagfilter' );
-
+ $this->opts['tagFilter'] = (string) $wgRequest->getVal( 'tagFilter' );
+
// Allows reverts to have the bot flag in recent changes. It is just here to
- // be passed in the form at the top of the page
+ // be passed in the form at the top of the page
if( $wgUser->isAllowed( 'markbotedits' ) && $wgRequest->getBool( 'bot' ) ) {
$this->opts['bot'] = '1';
}
@@ -81,7 +106,7 @@ class SpecialContributions extends SpecialPage {
$this->opts['year'] = $wgRequest->getIntOrNull( 'year' );
$this->opts['month'] = $wgRequest->getIntOrNull( 'month' );
}
-
+
// Add RSS/atom links
$this->setSyndicated();
$feedType = $wgRequest->getVal( 'feed' );
@@ -93,7 +118,14 @@ class SpecialContributions extends SpecialPage {
$wgOut->addHTML( $this->getForm() );
- $pager = new ContribsPager( $target, $this->opts['namespace'], $this->opts['year'], $this->opts['month'] );
+ $pager = new ContribsPager( array(
+ 'target' => $target,
+ 'namespace' => $this->opts['namespace'],
+ 'year' => $this->opts['year'],
+ 'month' => $this->opts['month'],
+ 'deletedOnly' => $this->opts['deletedOnly'],
+ 'topOnly' => $this->opts['topOnly'],
+ ) );
if( !$pager->getNumRows() ) {
$wgOut->addWikiMsg( 'nocontribs', $target );
} else {
@@ -132,7 +164,7 @@ class SpecialContributions extends SpecialPage {
}
}
}
-
+
protected function setSyndicated() {
global $wgOut;
$wgOut->setSyndicated( true );
@@ -141,8 +173,8 @@ class SpecialContributions extends SpecialPage {
/**
* Generates the subheading with links
- * @param Title $nt @see Title object for the target
- * @param integer $id User ID for the target
+ * @param $nt Title object for the target
+ * @param $id Integer: User ID for the target
* @return String: appropriately-escaped HTML to be output literally
* @todo Fixme: almost the same as getSubTitle in SpecialDeletedContributions.php. Could be combined.
*/
@@ -169,12 +201,12 @@ class SpecialContributions extends SpecialPage {
wfMsgHtml( 'change-blocklink' )
);
$tools[] = $sk->linkKnown( # Unblock link
- SpecialPage::getTitleFor( 'BlockList' ),
+ SpecialPage::getTitleFor( 'Ipblocklist' ),
wfMsgHtml( 'unblocklink' ),
array(),
array(
'action' => 'unblock',
- 'ip' => $nt->getDBkey()
+ 'ip' => $nt->getDBkey()
)
);
}
@@ -196,6 +228,14 @@ class SpecialContributions extends SpecialPage {
)
);
}
+ # Uploads
+ $tools[] = $sk->linkKnown(
+ SpecialPage::getTitleFor( 'Listfiles' ),
+ wfMsgHtml( 'sp-contributions-uploads' ),
+ array(),
+ array( 'user' => $nt->getText() )
+ );
+
# Other logs link
$tools[] = $sk->linkKnown(
SpecialPage::getTitleFor( 'Log' ),
@@ -236,7 +276,9 @@ class SpecialContributions extends SpecialPage {
'lim' => 1,
'showIfEmpty' => false,
'msgKey' => array(
- 'sp-contributions-blocked-notice',
+ $userObj->isAnon() ?
+ 'sp-contributions-blocked-notice-anon' :
+ 'sp-contributions-blocked-notice',
$nt->getText() # Support GENDER in 'sp-contributions-blocked-notice'
),
'offset' => '' # don't use $wgRequest parameter offset
@@ -258,99 +300,103 @@ class SpecialContributions extends SpecialPage {
/**
* Generates the namespace selector form with hidden attributes.
- * @param $this->opts Array: the options to be included.
+ * @return String: HTML fragment
*/
protected function getForm() {
global $wgScript;
-
+
$this->opts['title'] = $this->getTitle()->getPrefixedText();
if( !isset( $this->opts['target'] ) ) {
$this->opts['target'] = '';
} else {
$this->opts['target'] = str_replace( '_' , ' ' , $this->opts['target'] );
}
-
+
if( !isset( $this->opts['namespace'] ) ) {
$this->opts['namespace'] = '';
}
-
+
if( !isset( $this->opts['contribs'] ) ) {
$this->opts['contribs'] = 'user';
}
-
+
if( !isset( $this->opts['year'] ) ) {
$this->opts['year'] = '';
}
-
+
if( !isset( $this->opts['month'] ) ) {
$this->opts['month'] = '';
}
-
+
if( $this->opts['contribs'] == 'newbie' ) {
$this->opts['target'] = '';
}
- if( !isset( $this->opts['tagfilter'] ) ) {
- $this->opts['tagfilter'] = '';
+ if( !isset( $this->opts['tagFilter'] ) ) {
+ $this->opts['tagFilter'] = '';
}
-
- $f = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
- # Add hidden params for tracking
+
+ if( !isset( $this->opts['topOnly'] ) ) {
+ $this->opts['topOnly'] = false;
+ }
+
+ $f = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+
+ # Add hidden params for tracking except for parameters in $skipParameters
+ $skipParameters = array( 'namespace', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly' );
foreach ( $this->opts as $name => $value ) {
- if( in_array( $name, array( 'namespace', 'target', 'contribs', 'year', 'month' ) ) ) {
+ if( in_array( $name, $skipParameters ) ) {
continue;
}
- $f .= "\t" . Xml::hidden( $name, $value ) . "\n";
+ $f .= "\t" . Html::hidden( $name, $value ) . "\n";
}
- $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
-
- $f .= '<fieldset>' .
- Xml::element( 'legend', array(), wfMsg( 'sp-contributions-search' ) ) .
- Xml::radioLabel( wfMsgExt( 'sp-contributions-newbies', array( 'parsemag' ) ),
- 'contribs', 'newbie' , 'newbie', $this->opts['contribs'] == 'newbie' ? true : false ) . '<br />' .
- Xml::radioLabel( wfMsgExt( 'sp-contributions-username', array( 'parsemag' ) ),
- 'contribs' , 'user', 'user', $this->opts['contribs'] == 'user' ? true : false ) . ' ' .
+ $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagFilter'] );
+
+ $f .= Xml::fieldset( wfMsg( 'sp-contributions-search' ) ) .
+ Xml::radioLabel( wfMsgExt( 'sp-contributions-newbies', array( 'parsemag' ) ),
+ 'contribs', 'newbie' , 'newbie', $this->opts['contribs'] == 'newbie' ) . '<br />' .
+ Xml::radioLabel( wfMsgExt( 'sp-contributions-username', array( 'parsemag' ) ),
+ 'contribs' , 'user', 'user', $this->opts['contribs'] == 'user' ) . ' ' .
Html::input( 'target', $this->opts['target'], 'text', array(
'size' => '20',
'required' => ''
) + ( $this->opts['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
- '<span style="white-space: nowrap">' .
- Xml::label( wfMsg( 'namespace' ), 'namespace' ) . ' ' .
- Xml::namespaceSelector( $this->opts['namespace'], '' ) .
- '</span>' .
- ( $tagFilter ? Xml::tags( 'p', null, implode( '&nbsp;', $tagFilter ) ) : '' ) .
- Xml::openElement( 'p' ) .
- '<span style="white-space: nowrap">' .
- Xml::dateMenu( $this->opts['year'], $this->opts['month'] ) .
- '</span>' . ' ' .
- Xml::submitButton( wfMsg( 'sp-contributions-submit' ) ) .
- Xml::closeElement( 'p' );
-
+ Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+ Xml::label( wfMsg( 'namespace' ), 'namespace' ) . ' ' .
+ Xml::namespaceSelector( $this->opts['namespace'], '' )
+ ) .
+ Xml::checkLabel( wfMsg( 'history-show-deleted' ),
+ 'deletedOnly', 'mw-show-deleted-only', $this->opts['deletedOnly'] ) . '<br />' .
+ Xml::tags( 'p', null, Xml::checkLabel( wfMsg( 'sp-contributions-toponly' ),
+ 'topOnly', 'mw-show-top-only', $this->opts['topOnly'] ) ) .
+ ( $tagFilter ? Xml::tags( 'p', null, implode( '&#160;', $tagFilter ) ) : '' ) .
+ Html::rawElement( 'p', array( 'style' => 'white-space: nowrap' ),
+ Xml::dateMenu( $this->opts['year'], $this->opts['month'] ) . ' ' .
+ Xml::submitButton( wfMsg( 'sp-contributions-submit' ) )
+ ) . ' ';
$explain = wfMsgExt( 'sp-contributions-explain', 'parseinline' );
- if( !wfEmptyMsg( 'sp-contributions-explain', $explain ) )
+ if( !wfEmptyMsg( 'sp-contributions-explain', $explain ) ) {
$f .= "<p id='mw-sp-contributions-explain'>{$explain}</p>";
-
- $f .= '</fieldset>' .
+ }
+ $f .= Xml::closeElement('fieldset' ) .
Xml::closeElement( 'form' );
return $f;
}
-
+
/**
* Output a subscription feed listing recent edits to this page.
- * @param string $type
+ * @param $type String
*/
protected function feed( $type ) {
- global $wgRequest, $wgFeed, $wgFeedClasses, $wgFeedLimit;
+ global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgOut;
if( !$wgFeed ) {
- global $wgOut;
$wgOut->addWikiMsg( 'feed-unavailable' );
return;
}
if( !isset( $wgFeedClasses[$type] ) ) {
- global $wgOut;
$wgOut->addWikiMsg( 'feed-invalid' );
return;
}
@@ -360,19 +406,26 @@ class SpecialContributions extends SpecialPage {
wfMsgExt( 'tagline', 'parsemag' ),
$this->getTitle()->getFullUrl() . "/" . urlencode($this->opts['target'])
);
-
+
// Already valid title
$nt = Title::makeTitleSafe( NS_USER, $this->opts['target'] );
$target = $this->opts['target'] == 'newbies' ? 'newbies' : $nt->getText();
-
- $pager = new ContribsPager( $target, $this->opts['namespace'],
- $this->opts['year'], $this->opts['month'], $this->opts['tagfilter'] );
+
+ $pager = new ContribsPager( array(
+ 'target' => $target,
+ 'namespace' => $this->opts['namespace'],
+ 'year' => $this->opts['year'],
+ 'month' => $this->opts['month'],
+ 'tagFilter' => $this->opts['tagFilter'],
+ 'deletedOnly' => $this->opts['deletedOnly'],
+ 'topOnly' => $this->opts['topOnly'],
+ ) );
$pager->mLimit = min( $this->opts['limit'], $wgFeedLimit );
$feed->outHeader();
if( $pager->getNumRows() > 0 ) {
- while( $row = $pager->mResult->fetchObject() ) {
+ foreach ( $pager->mResult as $row ) {
$feed->outItem( $this->feedItem( $row ) );
}
}
@@ -380,10 +433,10 @@ class SpecialContributions extends SpecialPage {
}
protected function feedTitle() {
- global $wgContLanguageCode, $wgSitename;
+ global $wgLanguageCode, $wgSitename;
$page = SpecialPage::getPage( 'Contributions' );
$desc = $page->getDescription();
- return "$wgSitename - $desc [$wgContLanguageCode]";
+ return "$wgSitename - $desc [$wgLanguageCode]";
}
protected function feedItem( $row ) {
@@ -413,7 +466,7 @@ class SpecialContributions extends SpecialPage {
protected function feedItemDesc( $revision ) {
if( $revision ) {
return '<p>' . htmlspecialchars( $revision->getUserText() ) . wfMsgForContent( 'colon-separator' ) .
- htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
+ htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
"</p>\n<hr />\n<div>" .
nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>";
}
@@ -431,7 +484,7 @@ class ContribsPager extends ReverseChronologicalPager {
var $namespace = '', $mDb;
var $preventClickjacking = false;
- function __construct( $target, $namespace = false, $year = false, $month = false, $tagFilter = false ) {
+ function __construct( $options ) {
parent::__construct();
$msgs = array( 'uctop', 'diff', 'newarticle', 'rollbacklink', 'diff', 'hist', 'rev-delundel', 'pipe-separator' );
@@ -440,10 +493,15 @@ class ContribsPager extends ReverseChronologicalPager {
$this->messages[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
}
- $this->target = $target;
- $this->namespace = $namespace;
- $this->tagFilter = $tagFilter;
+ $this->target = isset( $options['target'] ) ? $options['target'] : '';
+ $this->namespace = isset( $options['namespace'] ) ? $options['namespace'] : '';
+ $this->tagFilter = isset( $options['tagFilter'] ) ? $options['tagFilter'] : false;
+
+ $this->deletedOnly = !empty( $options['deletedOnly'] );
+ $this->topOnly = !empty( $options['topOnly'] );
+ $year = isset( $options['year'] ) ? $options['year'] : false;
+ $month = isset( $options['month'] ) ? $options['month'] : false;
$this->getDateCond( $year, $month );
$this->mDb = wfGetDB( DB_SLAVE, 'contributions' );
@@ -458,7 +516,7 @@ class ContribsPager extends ReverseChronologicalPager {
function getQueryInfo() {
global $wgUser;
list( $tables, $index, $userCond, $join_cond ) = $this->getUserCond();
-
+
$conds = array_merge( $userCond, $this->getNamespaceCond() );
// Paranoia: avoid brute force searches (bug 17342)
if( !$wgUser->isAllowed( 'deletedhistory' ) ) {
@@ -468,12 +526,12 @@ class ContribsPager extends ReverseChronologicalPager {
' != ' . Revision::SUPPRESSED_USER;
}
$join_cond['page'] = array( 'INNER JOIN', 'page_id=rev_page' );
-
+
$queryInfo = array(
'tables' => $tables,
'fields' => array(
'page_namespace', 'page_title', 'page_is_new', 'page_latest', 'page_is_redirect',
- 'page_len','rev_id', 'rev_page', 'rev_text_id', 'rev_timestamp', 'rev_comment',
+ 'page_len','rev_id', 'rev_page', 'rev_text_id', 'rev_timestamp', 'rev_comment',
'rev_minor_edit', 'rev_user', 'rev_user_text', 'rev_parent_id', 'rev_deleted'
),
'conds' => $conds,
@@ -510,6 +568,12 @@ class ContribsPager extends ReverseChronologicalPager {
$condition['rev_user_text'] = $this->target;
$index = 'usertext_timestamp';
}
+ if( $this->deletedOnly ) {
+ $condition[] = "rev_deleted != '0'";
+ }
+ if( $this->topOnly ) {
+ $condition[] = "rev_id = page_latest";
+ }
return array( $tables, $index, $condition, $join_conds );
}
@@ -552,7 +616,6 @@ class ContribsPager extends ReverseChronologicalPager {
$classes = array();
$page = Title::newFromRow( $row );
- $page->resetArticleId( $row->rev_page ); // use process cache
$link = $sk->link(
$page,
htmlspecialchars( $page->getPrefixedText() ),
@@ -560,7 +623,7 @@ class ContribsPager extends ReverseChronologicalPager {
$page->isRedirect() ? array( 'redirect' => 'no' ) : array()
);
# Mark current revisions
- $difftext = $topmarktext = '';
+ $topmarktext = '';
if( $row->rev_id == $row->page_latest ) {
$topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
# Add rollback link
@@ -594,15 +657,18 @@ class ContribsPager extends ReverseChronologicalPager {
$comment = $wgContLang->getDirMark() . $sk->revComment( $rev, false, true );
$date = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->rev_timestamp ), true );
- if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
- $d = '<span class="history-deleted">' . $date . '</span>';
- } else {
+ if( $rev->userCan( Revision::DELETED_TEXT ) ) {
$d = $sk->linkKnown(
$page,
htmlspecialchars($date),
array(),
array( 'oldid' => intval( $row->rev_id ) )
);
+ } else {
+ $d = htmlspecialchars( $date );
+ }
+ if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $d = '<span class="history-deleted">' . $d . '</span>';
}
if( $this->target == 'newbies' ) {
@@ -645,7 +711,7 @@ class ContribsPager extends ReverseChronologicalPager {
$diffHistLinks = '(' . $difftext . $this->messages['pipe-separator'] . $histlink . ')';
$ret = "{$del}{$d} {$diffHistLinks} {$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
-
+
# Denote if username is redacted for this edit
if( $rev->isDeleted( Revision::DELETED_USER ) ) {
$ret .= " <strong>" . wfMsgHtml('rev-deleted-user-contribs') . "</strong>";
@@ -674,6 +740,17 @@ class ContribsPager extends ReverseChronologicalPager {
return $this->mDb;
}
+ /**
+ * Overwrite Pager function and return a helpful comment
+ */
+ function getSqlComment() {
+ if ( $this->namespace || $this->deletedOnly ) {
+ return 'contributions page filtered for namespace or RevisionDeleted edits'; // potentially slow, see CR r58153
+ } else {
+ return 'contributions page unfiltered';
+ }
+ }
+
protected function preventClickjacking() {
$this->preventClickjacking = true;
}
diff --git a/includes/specials/SpecialDeadendpages.php b/includes/specials/SpecialDeadendpages.php
index a8416c97..dfa053aa 100644
--- a/includes/specials/SpecialDeadendpages.php
+++ b/includes/specials/SpecialDeadendpages.php
@@ -1,10 +1,29 @@
<?php
/**
+ * Implements Special:Deadenpages
+ *
+ * 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
*/
/**
+ * A special page that list pages that contain no link to other pages
+ *
* @ingroup SpecialPage
*/
class DeadendPagesPage extends PageQueryPage {
diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php
index 8884bb22..92e22586 100644
--- a/includes/specials/SpecialDeletedContributions.php
+++ b/includes/specials/SpecialDeletedContributions.php
@@ -1,5 +1,27 @@
<?php
/**
+ * Implements Special:DeletedContributions
+ *
+ * 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
+ */
+
+/**
* Implements Special:DeletedContributions to display archived revisions
* @ingroup SpecialPage
*/
@@ -258,7 +280,7 @@ class DeletedContributionsPage extends SpecialPage {
return;
}
- global $wgOut, $wgLang, $wgRequest;
+ global $wgOut, $wgRequest;
$wgOut->setPageTitle( wfMsgExt( 'deletedcontributions-title', array( 'parsemag' ) ) );
@@ -328,8 +350,8 @@ class DeletedContributionsPage extends SpecialPage {
/**
* Generates the subheading with links
- * @param Title $nt @see Title object for the target
- * @param integer $id User ID for the target
+ * @param $nt Title object for the target
+ * @param $id Integer: User ID for the target
* @return String: appropriately-escaped HTML to be output literally
* @todo Fixme: almost the same as contributionsSub in SpecialContributions.php. Could be combined.
*/
@@ -445,7 +467,7 @@ class DeletedContributionsPage extends SpecialPage {
* @param $options Array: the options to be included.
*/
function getForm( $options ) {
- global $wgScript, $wgRequest;
+ global $wgScript;
$options['title'] = SpecialPage::getTitleFor( 'DeletedContributions' )->getPrefixedText();
if ( !isset( $options['target'] ) ) {
@@ -472,7 +494,7 @@ class DeletedContributionsPage extends SpecialPage {
if ( in_array( $name, array( 'namespace', 'target', 'contribs' ) ) ) {
continue;
}
- $f .= "\t" . Xml::hidden( $name, $value ) . "\n";
+ $f .= "\t" . Html::hidden( $name, $value ) . "\n";
}
$f .= Xml::openElement( 'fieldset' ) .
diff --git a/includes/specials/SpecialDisambiguations.php b/includes/specials/SpecialDisambiguations.php
index 1941112a..3e706189 100644
--- a/includes/specials/SpecialDisambiguations.php
+++ b/includes/specials/SpecialDisambiguations.php
@@ -1,10 +1,29 @@
<?php
/**
+ * Implements Special:Disambiguations
+ *
+ * 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
*/
/**
+ * A special page that lists pages containing links to disambiguations pages
+ *
* @ingroup SpecialPage
*/
class DisambiguationsPage extends PageQueryPage {
@@ -22,6 +41,8 @@ class DisambiguationsPage extends PageQueryPage {
}
function getSQL() {
+ global $wgContentNamespaces;
+
$dbr = wfGetDB( DB_SLAVE );
$dMsgText = wfMsgForContent('disambiguationspage');
@@ -48,11 +69,9 @@ class DisambiguationsPage extends PageQueryPage {
'page_namespace' => $disPageObj->getNamespace(), 'page_title' => $disPageObj->getDBkey()),
__METHOD__ );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$linkBatch->addObj( Title::makeTitle( NS_TEMPLATE, $row->pl_title ));
}
-
- $dbr->freeResult( $res );
}
$set = $linkBatch->constructSet( 'lb.tl', $dbr );
@@ -64,12 +83,18 @@ class DisambiguationsPage extends PageQueryPage {
list( $page, $pagelinks, $templatelinks) = $dbr->tableNamesN( 'page', 'pagelinks', 'templatelinks' );
+ if ( $wgContentNamespaces ) {
+ $nsclause = 'IN (' . $dbr->makeList( $wgContentNamespaces ) . ')';
+ } else {
+ $nsclause = '= ' . NS_MAIN;
+ }
+
$sql = "SELECT 'Disambiguations' AS \"type\", pb.page_namespace AS namespace,"
." pb.page_title AS title, la.pl_from AS value"
." FROM {$templatelinks} AS lb, {$page} AS pb, {$pagelinks} AS la, {$page} AS pa"
." WHERE $set" # disambiguation template(s)
.' AND pa.page_id = la.pl_from'
- .' AND pa.page_namespace = ' . NS_MAIN # Limit to just articles in the main namespace
+ .' AND pa.page_namespace ' . $nsclause
.' AND pb.page_id = lb.tl_from'
.' AND pb.page_namespace = la.pl_namespace'
.' AND pb.page_title = la.pl_title'
diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php
index 893fee9e..c7f63210 100644
--- a/includes/specials/SpecialDoubleRedirects.php
+++ b/includes/specials/SpecialDoubleRedirects.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:DoubleRedirects
+ *
+ * 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
*/
@@ -7,6 +24,7 @@
/**
* A special page listing redirects to redirecting page.
* The software will automatically not follow double redirects, to prevent loops.
+ *
* @ingroup SpecialPage
*/
class DoubleRedirectsPage extends PageQueryPage {
@@ -70,11 +88,10 @@ class DoubleRedirectsPage extends PageQueryPage {
$res = $dbr->query( $sql, $fname );
if ( $res ) {
$result = $dbr->fetchObject( $res );
- $dbr->freeResult( $res );
}
}
if ( !$result ) {
- return '<s>' . $skin->link( $titleA, null, array(), array( 'redirect' => 'no' ) ) . '</s>';
+ return '<del>' . $skin->link( $titleA, null, array(), array( 'redirect' => 'no' ) ) . '</del>';
}
$titleB = Title::makeTitle( $result->nsb, $result->tb );
diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php
index 48088ded..61271227 100644
--- a/includes/specials/SpecialEmailuser.php
+++ b/includes/specials/SpecialEmailuser.php
@@ -1,329 +1,303 @@
<?php
/**
+ * Implements Special:Emailuser
+ *
+ * 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
*/
/**
- * Constructor for Special:Emailuser.
+ * A special page that allows users to send e-mails to other users
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialEmailuser( $par ) {
- global $wgRequest, $wgUser, $wgOut;
-
- if ( !EmailUserForm::userEmailEnabled() ) {
- $wgOut->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
- return;
- }
-
- $action = $wgRequest->getVal( 'action' );
- $target = isset($par) ? $par : $wgRequest->getVal( 'target' );
- $targetUser = EmailUserForm::validateEmailTarget( $target );
+class SpecialEmailUser extends UnlistedSpecialPage {
+ protected $mTarget;
- if ( !( $targetUser instanceof User ) ) {
- $wgOut->showErrorPage( $targetUser.'title', $targetUser.'text' );
- return;
+ public function __construct(){
+ parent::__construct( 'Emailuser' );
}
- $form = new EmailUserForm( $targetUser,
- $wgRequest->getText( 'wpText' ),
- $wgRequest->getText( 'wpSubject' ),
- $wgRequest->getBool( 'wpCCMe' ) );
- if ( $action == 'success' ) {
- $form->showSuccess();
- return;
+ protected function getFormFields(){
+ global $wgUser;
+ return array(
+ 'From' => array(
+ 'type' => 'info',
+ 'raw' => 1,
+ 'default' => $wgUser->getSkin()->link(
+ $wgUser->getUserPage(),
+ htmlspecialchars( $wgUser->getName() )
+ ),
+ 'label-message' => 'emailfrom',
+ 'id' => 'mw-emailuser-sender',
+ ),
+ 'To' => array(
+ 'type' => 'info',
+ 'raw' => 1,
+ 'default' => $wgUser->getSkin()->link(
+ $this->mTargetObj->getUserPage(),
+ htmlspecialchars( $this->mTargetObj->getName() )
+ ),
+ 'label-message' => 'emailto',
+ 'id' => 'mw-emailuser-recipient',
+ ),
+ 'Target' => array(
+ 'type' => 'hidden',
+ 'default' => $this->mTargetObj->getName(),
+ ),
+ 'Subject' => array(
+ 'type' => 'text',
+ 'default' => wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ) ),
+ 'label-message' => 'emailsubject',
+ 'maxlength' => 200,
+ 'size' => 60,
+ 'required' => 1,
+ ),
+ 'Text' => array(
+ 'type' => 'textarea',
+ 'rows' => 20,
+ 'cols' => 80,
+ 'label-message' => 'emailmessage',
+ 'required' => 1,
+ ),
+ 'CCMe' => array(
+ 'type' => 'check',
+ 'label-message' => 'emailccme',
+ 'default' => $wgUser->getBoolOption( 'ccmeonemails' ),
+ ),
+ );
}
-
- $error = EmailUserForm::getPermissionsError( $wgUser, $wgRequest->getVal( 'wpEditToken' ) );
- if ( $error ) {
+
+ public function execute( $par ) {
+ global $wgRequest, $wgOut, $wgUser;
+
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $this->mTarget = is_null( $par )
+ ? $wgRequest->getVal( 'wpTarget', $wgRequest->getVal( 'target', '' ) )
+ : $par;
+
+ $ret = self::getTarget( $this->mTarget );
+ if( $ret instanceof User ){
+ $this->mTargetObj = $ret;
+ } else {
+ $wgOut->showErrorPage( "{$ret}title", "{$ret}text" );
+ return false;
+ }
+
+ $error = self::getPermissionsError( $wgUser, $wgRequest->getVal( 'wpEditToken' ) );
switch ( $error ) {
+ case null:
+ # Wahey!
+ break;
+ case 'badaccess':
+ $wgOut->permissionRequired( 'sendemail' );
+ return;
case 'blockedemailuser':
$wgOut->blockedPage();
return;
case 'actionthrottledtext':
$wgOut->rateLimited();
return;
- case 'sessionfailure':
- $form->showForm();
- return;
case 'mailnologin':
- $wgOut->showErrorPage( 'mailnologin', 'mailnologintext' );
+ case 'usermaildisabled':
+ $wgOut->showErrorPage( $error, "{$error}text" );
return;
default:
- // It's a hook error
+ # It's a hook error
list( $title, $msg, $params ) = $error;
$wgOut->showErrorPage( $title, $msg, $params );
return;
-
}
- }
-
- if ( "submit" == $action && $wgRequest->wasPosted() ) {
- $result = $form->doSubmit();
- if ( !is_null( $result ) ) {
- $wgOut->addHTML( wfMsg( "usermailererror" ) .
- ' ' . htmlspecialchars( $result->getMessage() ) );
- } else {
- $titleObj = SpecialPage::getTitleFor( "Emailuser" );
- $encTarget = wfUrlencode( $form->getTarget()->getName() );
- $wgOut->redirect( $titleObj->getFullURL( "target={$encTarget}&action=success" ) );
- }
- } else {
- $form->showForm();
- }
-}
-
-/**
- * Implements the Special:Emailuser web interface, and invokes userMailer for sending the email message.
- * @ingroup SpecialPage
- */
-class EmailUserForm {
-
- var $target;
- var $text, $subject;
- var $cc_me; // Whether user requested to be sent a separate copy of their email.
-
- /**
- * @param User $target
- */
- function EmailUserForm( $target, $text, $subject, $cc_me ) {
- $this->target = $target;
- $this->text = $text;
- $this->subject = $subject;
- $this->cc_me = $cc_me;
- }
-
- function showForm() {
- global $wgOut, $wgUser;
- $skin = $wgUser->getSkin();
-
- $wgOut->setPagetitle( wfMsg( "emailpage" ) );
- $wgOut->addWikiMsg( "emailpagetext" );
-
- if ( $this->subject === "" ) {
- $this->subject = wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ) );
- }
-
- $titleObj = SpecialPage::getTitleFor( "Emailuser" );
- $action = $titleObj->getLocalURL( "target=" .
- urlencode( $this->target->getName() ) . "&action=submit" );
-
- $wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'emailuser' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsgExt( 'email-legend', 'parsemag' ) ) .
- Xml::openElement( 'table', array( 'class' => 'mw-emailuser-table' ) ) .
- "<tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'emailfrom' ), 'emailfrom' ) .
- "</td>
- <td class='mw-input' id='mw-emailuser-sender'>" .
- $skin->link( $wgUser->getUserPage(), htmlspecialchars( $wgUser->getName() ) ) .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'emailto' ), 'emailto' ) .
- "</td>
- <td class='mw-input' id='mw-emailuser-recipient'>" .
- $skin->link( $this->target->getUserPage(), htmlspecialchars( $this->target->getName() ) ) .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'emailsubject' ), 'wpSubject' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::input( 'wpSubject', 60, $this->subject, array( 'type' => 'text', 'maxlength' => 200 ) ) .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'emailmessage' ), 'wpText' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::textarea( 'wpText', $this->text, 80, 20, array( 'id' => 'wpText' ) ) .
- "</td>
- </tr>
- <tr>
- <td></td>
- <td class='mw-input'>" .
- Xml::checkLabel( wfMsg( 'emailccme' ), 'wpCCMe', 'wpCCMe', $wgUser->getBoolOption( 'ccmeonemails' ) ) .
- "</td>
- </tr>
- <tr>
- <td></td>
- <td class='mw-submit'>" .
- Xml::submitButton( wfMsg( 'emailsend' ), array( 'name' => 'wpSend', 'accesskey' => 's' ) ) .
- "</td>
- </tr>" .
- Xml::hidden( 'wpEditToken', $wgUser->editToken() ) .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' )
- );
- }
-
- /*
- * Really send a mail. Permissions should have been checked using
- * EmailUserForm::getPermissionsError. It is probably also a good idea to
- * check the edit token and ping limiter in advance.
- */
- function doSubmit() {
- global $wgUser, $wgUserEmailUseReplyTo, $wgSiteName;
-
- $to = new MailAddress( $this->target );
- $from = new MailAddress( $wgUser );
- $subject = $this->subject;
-
- // Add a standard footer and trim up trailing newlines
- $this->text = rtrim($this->text) . "\n\n-- \n" . wfMsgExt( 'emailuserfooter',
- array( 'content', 'parsemag' ), array( $from->name, $to->name ) );
+ $form = new HTMLForm( $this->getFormFields() );
+ $form->addPreText( wfMsgExt( 'emailpagetext', 'parseinline' ) );
+ $form->setSubmitText( wfMsg( 'emailsend' ) );
+ $form->setTitle( $this->getTitle() );
+ $form->setSubmitCallback( array( __CLASS__, 'submit' ) );
+ $form->setWrapperLegend( wfMsgExt( 'email-legend', 'parsemag' ) );
+ $form->loadData();
- if( wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$this->text ) ) ) {
-
- if( $wgUserEmailUseReplyTo ) {
- // Put the generic wiki autogenerated address in the From:
- // header and reserve the user for Reply-To.
- //
- // This is a bit ugly, but will serve to differentiate
- // wiki-borne mails from direct mails and protects against
- // SPF and bounce problems with some mailers (see below).
- global $wgPasswordSender;
- $mailFrom = new MailAddress( $wgPasswordSender );
- $replyTo = $from;
- } else {
- // Put the sending user's e-mail address in the From: header.
- //
- // This is clean-looking and convenient, but has issues.
- // One is that it doesn't as clearly differentiate the wiki mail
- // from "directly" sent mails.
- //
- // Another is that some mailers (like sSMTP) will use the From
- // address as the envelope sender as well. For open sites this
- // can cause mails to be flunked for SPF violations (since the
- // wiki server isn't an authorized sender for various users'
- // domains) as well as creating a privacy issue as bounces
- // containing the recipient's e-mail address may get sent to
- // the sending user.
- $mailFrom = $from;
- $replyTo = null;
- }
-
- $mailResult = UserMailer::send( $to, $mailFrom, $subject, $this->text, $replyTo );
-
- if( WikiError::isError( $mailResult ) ) {
- return $mailResult;
-
- } else {
-
- // if the user requested a copy of this mail, do this now,
- // unless they are emailing themselves, in which case one copy of the message is sufficient.
- if ($this->cc_me && $to != $from) {
- $cc_subject = wfMsg('emailccsubject', $this->target->getName(), $subject);
- if( wfRunHooks( 'EmailUser', array( &$from, &$from, &$cc_subject, &$this->text ) ) ) {
- $ccResult = UserMailer::send( $from, $from, $cc_subject, $this->text );
- if( WikiError::isError( $ccResult ) ) {
- // At this stage, the user's CC mail has failed, but their
- // original mail has succeeded. It's unlikely, but still, what to do?
- // We can either show them an error, or we can say everything was fine,
- // or we can say we sort of failed AND sort of succeeded. Of these options,
- // simply saying there was an error is probably best.
- return $ccResult;
- }
- }
- }
-
- wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $this->text ) );
- return;
- }
+ if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ){
+ return false;
}
- }
-
- function showSuccess( &$user = null ) {
- global $wgOut;
- if ( is_null($user) )
- $user = $this->target;
-
- $wgOut->setPagetitle( wfMsg( "emailsent" ) );
- $wgOut->addWikiMsg( 'emailsenttext' );
-
- $wgOut->returnToMain( false, $user->getUserPage() );
- }
-
- function getTarget() {
- return $this->target;
- }
-
- static function userEmailEnabled() {
- global $wgEnableEmail, $wgEnableUserEmail;
- return $wgEnableEmail && $wgEnableUserEmail;
+ $wgOut->setPagetitle( wfMsg( 'emailpage' ) );
+ $result = $form->show();
+ if( $result === true || ( $result instanceof Status && $result->isGood() ) ){
+ $wgOut->setPagetitle( wfMsg( 'emailsent' ) );
+ $wgOut->addWikiMsg( 'emailsenttext' );
+ $wgOut->returnToMain( false, $this->mTargetObj->getUserPage() );
+ }
}
- static function validateEmailTarget ( $target ) {
- if ( $target == "" ) {
+
+ /**
+ * Validate target User
+ *
+ * @param $target String: target user name
+ * @return User object on success or a string on error
+ */
+ public static function getTarget( $target ) {
+ if ( $target == '' ) {
wfDebug( "Target is empty.\n" );
- return "notarget";
- }
-
- $nt = Title::newFromURL( $target );
- if ( is_null( $nt ) ) {
- wfDebug( "Target is invalid title.\n" );
- return "notarget";
+ return 'notarget';
}
-
- $nu = User::newFromName( $nt->getText() );
+
+ $nu = User::newFromName( $target );
if( !$nu instanceof User || !$nu->getId() ) {
wfDebug( "Target is invalid user.\n" );
- return "notarget";
+ return 'notarget';
} else if ( !$nu->isEmailConfirmed() ) {
wfDebug( "User has no valid email.\n" );
- return "noemail";
+ return 'noemail';
} else if ( !$nu->canReceiveEmail() ) {
wfDebug( "User does not allow user emails.\n" );
- return "nowikiemail";
+ return 'nowikiemail';
}
-
+
return $nu;
}
- static function getPermissionsError ( $user, $editToken ) {
- if( !$user->canSendEmail() ) {
- wfDebug( "User can't send.\n" );
- // FIXME: this is also the error if user is in a group
- // that is not allowed to send e-mail (no right
- // 'sendemail'). Error messages should probably
- // be more fine grained.
- return "mailnologin";
+
+ /**
+ * Check whether a user is allowed to send email
+ *
+ * @param $user User object
+ * @param $editToken String: edit token
+ * @return null on success or string on error
+ */
+ public static function getPermissionsError( $user, $editToken ) {
+ global $wgEnableEmail, $wgEnableUserEmail;
+ if( !$wgEnableEmail || !$wgEnableUserEmail ){
+ return 'usermaildisabled';
+ }
+
+ if( !$user->isAllowed( 'sendemail' ) ) {
+ return 'badaccess';
}
+ if( !$user->isEmailConfirmed() ){
+ return 'mailnologin';
+ }
+
if( $user->isBlockedFromEmailuser() ) {
wfDebug( "User is blocked from sending e-mail.\n" );
return "blockedemailuser";
}
-
+
if( $user->pingLimiter( 'emailuser' ) ) {
- wfDebug( "Ping limiter triggered.\n" );
+ wfDebug( "Ping limiter triggered.\n" );
return 'actionthrottledtext';
}
-
- $hookErr = null;
+
+ $hookErr = false;
+ wfRunHooks( 'UserCanSendEmail', array( &$user, &$hookErr ) );
wfRunHooks( 'EmailUserPermissionsErrors', array( $user, $editToken, &$hookErr ) );
-
- if ($hookErr) {
+ if ( $hookErr ) {
return $hookErr;
}
+
+ return null;
+ }
+
+ /**
+ * Really send a mail. Permissions should have been checked using
+ * getPermissionsError(). It is probably also a good
+ * idea to check the edit token and ping limiter in advance.
+ *
+ * @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 ) {
+ global $wgUser, $wgUserEmailUseReplyTo;
+
+ $target = self::getTarget( $data['Target'] );
+ if( !$target instanceof User ){
+ return wfMsgExt( $target . 'text', 'parse' );
+ }
+ $to = new MailAddress( $target );
+ $from = new MailAddress( $wgUser );
+ $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 )
+ );
+
+ $error = '';
+ if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
+ return $error;
+ }
- if( !$user->matchEditToken( $editToken ) ) {
- wfDebug( "Matching edit token failed.\n" );
- return 'sessionfailure';
+ if( $wgUserEmailUseReplyTo ) {
+ // Put the generic wiki autogenerated address in the From:
+ // header and reserve the user for Reply-To.
+ //
+ // This is a bit ugly, but will serve to differentiate
+ // wiki-borne mails from direct mails and protects against
+ // SPF and bounce problems with some mailers (see below).
+ global $wgPasswordSender, $wgPasswordSenderName;
+ $mailFrom = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
+ $replyTo = $from;
+ } else {
+ // Put the sending user's e-mail address in the From: header.
+ //
+ // This is clean-looking and convenient, but has issues.
+ // One is that it doesn't as clearly differentiate the wiki mail
+ // from "directly" sent mails.
+ //
+ // Another is that some mailers (like sSMTP) will use the From
+ // address as the envelope sender as well. For open sites this
+ // can cause mails to be flunked for SPF violations (since the
+ // wiki server isn't an authorized sender for various users'
+ // domains) as well as creating a privacy issue as bounces
+ // containing the recipient's e-mail address may get sent to
+ // the sending user.
+ $mailFrom = $from;
+ $replyTo = null;
+ }
+
+ $status = UserMailer::send( $to, $mailFrom, $subject, $text, $replyTo );
+
+ if( !$status->isGood() ) {
+ return $status;
+ } else {
+ // if the user requested a copy of this mail, do this now,
+ // 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
+ );
+ wfRunHooks( 'EmailUserCC', array( &$from, &$from, &$cc_subject, &$text ) );
+ $ccStatus = UserMailer::send( $from, $from, $cc_subject, $text );
+ $status->merge( $ccStatus );
+ }
+
+ wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $text ) );
+ return $status;
}
- }
-
- static function newFromURL( $target, $text, $subject, $cc_me )
- {
- $nt = Title::newFromURL( $target );
- $nu = User::newFromName( $nt->getText() );
- return new EmailUserForm( $nu, $text, $subject, $cc_me );
}
}
diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php
index b9a44d48..eaed2393 100644
--- a/includes/specials/SpecialExport.php
+++ b/includes/specials/SpecialExport.php
@@ -1,56 +1,64 @@
<?php
-# Copyright (C) 2003-2008 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
/**
+ * Implements Special:Export
+ *
+ * Copyright © 2003-2008 Brion Vibber <brion@pobox.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
* @ingroup SpecialPage
*/
+/**
+ * A special page that allows users to export pages in a XML file
+ *
+ * @ingroup SpecialPage
+ */
class SpecialExport extends SpecialPage {
-
+
private $curonly, $doExport, $pageLinkDepth, $templates;
private $images;
-
+
public function __construct() {
parent::__construct( 'Export' );
}
-
+
public function execute( $par ) {
global $wgOut, $wgRequest, $wgSitename, $wgExportAllowListContributors;
global $wgExportAllowHistory, $wgExportMaxHistory, $wgExportMaxLinkDepth;
- global $wgExportFromNamespaces;
-
+ global $wgExportFromNamespaces, $wgUser;
+
$this->setHeaders();
$this->outputHeader();
-
+
// Set some variables
$this->curonly = true;
$this->doExport = false;
$this->templates = $wgRequest->getCheck( 'templates' );
$this->images = $wgRequest->getCheck( 'images' ); // Doesn't do anything yet
$this->pageLinkDepth = $this->validateLinkDepth(
- $wgRequest->getIntOrNull( 'pagelink-depth' ) );
+ $wgRequest->getIntOrNull( 'pagelink-depth' )
+ );
$nsindex = '';
-
+
if ( $wgRequest->getCheck( 'addcat' ) ) {
$page = $wgRequest->getText( 'pages' );
$catname = $wgRequest->getText( 'catname' );
-
+
if ( $catname !== '' && $catname !== null && $catname !== false ) {
$t = Title::makeTitleSafe( NS_MAIN, $catname );
if ( $t ) {
@@ -67,7 +75,7 @@ class SpecialExport extends SpecialPage {
else if( $wgRequest->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
$page = $wgRequest->getText( 'pages' );
$nsindex = $wgRequest->getText( 'nsindex', '' );
-
+
if ( strval( $nsindex ) !== '' ) {
/**
* Same implementation as above, so same @todo
@@ -80,11 +88,13 @@ class SpecialExport extends SpecialPage {
$page = $wgRequest->getText( 'pages' );
$this->curonly = $wgRequest->getCheck( 'curonly' );
$rawOffset = $wgRequest->getVal( 'offset' );
+
if( $rawOffset ) {
$offset = wfTimestamp( TS_MW, $rawOffset );
} else {
$offset = null;
}
+
$limit = $wgRequest->getInt( 'limit' );
$dir = $wgRequest->getVal( 'dir' );
$history = array(
@@ -93,6 +103,7 @@ class SpecialExport extends SpecialPage {
'limit' => $wgExportMaxHistory,
);
$historyCheck = $wgRequest->getCheck( 'history' );
+
if ( $this->curonly ) {
$history = WikiExporter::CURRENT;
} elseif ( !$historyCheck ) {
@@ -106,93 +117,101 @@ class SpecialExport extends SpecialPage {
$history['dir'] = 'desc';
}
}
-
+
if( $page != '' ) $this->doExport = true;
} else {
- // Default to current-only for GET requests
+ // Default to current-only for GET requests.
$page = $wgRequest->getText( 'pages', $par );
$historyCheck = $wgRequest->getCheck( 'history' );
+
if( $historyCheck ) {
$history = WikiExporter::FULL;
} else {
$history = WikiExporter::CURRENT;
}
-
+
if( $page != '' ) $this->doExport = true;
}
-
+
if( !$wgExportAllowHistory ) {
// Override
$history = WikiExporter::CURRENT;
}
-
+
$list_authors = $wgRequest->getCheck( 'listauthors' );
if ( !$this->curonly || !$wgExportAllowListContributors ) $list_authors = false ;
-
+
if ( $this->doExport ) {
$wgOut->disable();
+
// Cancel output buffering and gzipping if set
// This should provide safer streaming for pages with history
wfResetOutputBuffers();
- header( "Content-type: application/xml; charset=utf-8" );
+ $wgRequest->response()->header( "Content-type: application/xml; charset=utf-8" );
+
if( $wgRequest->getCheck( 'wpDownload' ) ) {
// Provide a sane filename suggestion
$filename = urlencode( $wgSitename . '-' . wfTimestampNow() . '.xml' );
$wgRequest->response()->header( "Content-disposition: attachment;filename={$filename}" );
}
+
$this->doExport( $page, $history, $list_authors );
+
return;
}
-
+
$wgOut->addWikiMsg( 'exporttext' );
-
+
$form = Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalUrl( 'action=submit' ) ) );
- $form .= Xml::inputLabel( wfMsg( 'export-addcattext' ) , 'catname', 'catname', 40 ) . '&nbsp;';
+ $form .= Xml::inputLabel( wfMsg( 'export-addcattext' ) , 'catname', 'catname', 40 ) . '&#160;';
$form .= Xml::submitButton( wfMsg( 'export-addcat' ), array( 'name' => 'addcat' ) ) . '<br />';
-
+
if ( $wgExportFromNamespaces ) {
- $form .= Xml::namespaceSelector( $nsindex, null, 'nsindex', wfMsg( 'export-addnstext' ) ) . '&nbsp;';
+ $form .= Xml::namespaceSelector( $nsindex, null, 'nsindex', wfMsg( 'export-addnstext' ) ) . '&#160;';
$form .= Xml::submitButton( wfMsg( 'export-addns' ), array( 'name' => 'addns' ) ) . '<br />';
}
-
+
$form .= Xml::element( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ), $page, false );
$form .= '<br />';
-
+
if( $wgExportAllowHistory ) {
$form .= Xml::checkLabel( wfMsg( 'exportcuronly' ), 'curonly', 'curonly', true ) . '<br />';
} else {
$wgOut->addHTML( wfMsgExt( 'exportnohistory', 'parse' ) );
}
+
$form .= Xml::checkLabel( wfMsg( 'export-templates' ), 'templates', 'wpExportTemplates', false ) . '<br />';
+
if( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
$form .= Xml::inputLabel( wfMsg( 'export-pagelinks' ), 'pagelink-depth', 'pagelink-depth', 20, 0 ) . '<br />';
}
// Enable this when we can do something useful exporting/importing image information. :)
//$form .= Xml::checkLabel( wfMsg( 'export-images' ), 'images', 'wpExportImages', false ) . '<br />';
$form .= Xml::checkLabel( wfMsg( 'export-download' ), 'wpDownload', 'wpDownload', true ) . '<br />';
-
- $form .= Xml::submitButton( wfMsg( 'export-submit' ), array( 'accesskey' => 's' ) );
+
+ $form .= Xml::submitButton( wfMsg( 'export-submit' ), $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'export' ) );
$form .= Xml::closeElement( 'form' );
+
$wgOut->addHTML( $form );
}
-
- private function userCanOverrideExportDepth() {
- global $wgUser;
+ private function userCanOverrideExportDepth() {
+ global $wgUser;
return $wgUser->isAllowed( 'override-export-depth' );
}
-
+
/**
* Do the actual page exporting
- * @param string $page User input on what page(s) to export
- * @param mixed $history one of the WikiExporter history export constants
+ *
+ * @param $page String: user input on what page(s) to export
+ * @param $history Mixed: one of the WikiExporter history export constants
+ * @param $list_authors Boolean: Whether to add distinct author list (when
+ * not returning full history)
*/
private function doExport( $page, $history, $list_authors ) {
- global $wgExportMaxHistory;
-
$pageSet = array(); // Inverted index of all pages to look up
-
+
// Split up and normalize input
foreach( explode( "\n", $page ) as $pageName ) {
$pageName = trim( $pageName );
@@ -202,32 +221,33 @@ class SpecialExport extends SpecialPage {
$pageSet[$title->getPrefixedText()] = true;
}
}
-
+
// Set of original pages to pass on to further manipulation...
$inputPages = array_keys( $pageSet );
-
+
// Look up any linked pages if asked...
if( $this->templates ) {
$pageSet = $this->getTemplates( $inputPages, $pageSet );
}
-
- if( $linkDepth = $this->pageLinkDepth ) {
+ $linkDepth = $this->pageLinkDepth;
+ if( $linkDepth ) {
$pageSet = $this->getPageLinks( $inputPages, $pageSet, $linkDepth );
}
-
+
/*
// Enable this when we can do something useful exporting/importing image information. :)
if( $this->images ) ) {
$pageSet = $this->getImages( $inputPages, $pageSet );
}
*/
-
+
$pages = array_keys( $pageSet );
// Normalize titles to the same format and remove dupes, see bug 17374
foreach( $pages as $k => $v ) {
$pages[$k] = str_replace( " ", "_", $v );
}
+
$pages = array_unique( $pages );
/* Ok, let's get to it... */
@@ -240,15 +260,17 @@ class SpecialExport extends SpecialPage {
$lb = wfGetLBFactory()->newMainLB();
$db = $lb->getConnection( DB_SLAVE );
$buffer = WikiExporter::STREAM;
-
+
// This might take a while... :D
wfSuppressWarnings();
set_time_limit(0);
wfRestoreWarnings();
}
+
$exporter = new WikiExporter( $db, $history, $buffer );
$exporter->list_authors = $list_authors;
$exporter->openStream();
+
foreach( $pages as $page ) {
/*
if( $wgExportMaxHistory && !$this->curonly ) {
@@ -266,11 +288,12 @@ class SpecialExport extends SpecialPage {
$title = Title::newFromText( $page );
if( is_null( $title ) ) continue; #TODO: perhaps output an <error> tag or something.
if( !$title->userCanRead() ) continue; #TODO: perhaps output an <error> tag or something.
-
+
$exporter->pageByTitle( $title );
}
-
+
$exporter->closeStream();
+
if( $lb ) {
$lb->closeAll();
}
@@ -278,52 +301,59 @@ class SpecialExport extends SpecialPage {
private function getPagesFromCategory( $title ) {
global $wgContLang;
-
+
$name = $title->getDBkey();
-
+
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( array('page', 'categorylinks' ),
- array( 'page_namespace', 'page_title' ),
- array('cl_from=page_id', 'cl_to' => $name ),
- __METHOD__, array('LIMIT' => '5000'));
-
+ $res = $dbr->select(
+ array( 'page', 'categorylinks' ),
+ array( 'page_namespace', 'page_title' ),
+ array( 'cl_from=page_id', 'cl_to' => $name ),
+ __METHOD__,
+ array( 'LIMIT' => '5000' )
+ );
+
$pages = array();
- while ( $row = $dbr->fetchObject( $res ) ) {
+
+ foreach ( $res as $row ) {
$n = $row->page_title;
if ($row->page_namespace) {
$ns = $wgContLang->getNsText( $row->page_namespace );
$n = $ns . ':' . $n;
}
-
+
$pages[] = $n;
}
- $dbr->freeResult($res);
-
return $pages;
}
-
+
private function getPagesFromNamespace( $nsindex ) {
global $wgContLang;
-
+
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'page', array('page_namespace', 'page_title'),
- array('page_namespace' => $nsindex),
- __METHOD__, array('LIMIT' => '5000') );
-
+ $res = $dbr->select(
+ 'page',
+ array( 'page_namespace', 'page_title' ),
+ array( 'page_namespace' => $nsindex ),
+ __METHOD__,
+ array( 'LIMIT' => '5000' )
+ );
+
$pages = array();
- while ( $row = $dbr->fetchObject( $res ) ) {
+
+ foreach ( $res as $row ) {
$n = $row->page_title;
- if ($row->page_namespace) {
+
+ if ( $row->page_namespace ) {
$ns = $wgContLang->getNsText( $row->page_namespace );
$n = $ns . ':' . $n;
}
-
+
$pages[] = $n;
}
- $dbr->freeResult($res);
-
return $pages;
}
+
/**
* Expand a list of pages to include templates used in those pages.
* @param $inputPages array, list of titles to look up
@@ -332,24 +362,28 @@ class SpecialExport extends SpecialPage {
*/
private function getTemplates( $inputPages, $pageSet ) {
return $this->getLinks( $inputPages, $pageSet,
- 'templatelinks',
- array( 'tl_namespace AS namespace', 'tl_title AS title' ),
- array( 'page_id=tl_from' ) );
+ 'templatelinks',
+ array( 'tl_namespace AS namespace', 'tl_title AS title' ),
+ array( 'page_id=tl_from' )
+ );
}
-
+
/**
* Validate link depth setting, if available.
*/
private function validateLinkDepth( $depth ) {
- global $wgExportMaxLinkDepth, $wgExportMaxLinkDepthLimit;
+ global $wgExportMaxLinkDepth;
+
if( $depth < 0 ) {
return 0;
}
+
if ( !$this->userCanOverrideExportDepth() ) {
if( $depth > $wgExportMaxLinkDepth ) {
return $wgExportMaxLinkDepth;
}
}
+
/*
* There's a HARD CODED limit of 5 levels of recursion here to prevent a
* crazy-big export from being done by someone setting the depth
@@ -357,58 +391,73 @@ class SpecialExport extends SpecialPage {
*/
return intval( min( $depth, 5 ) );
}
-
+
/** Expand a list of pages to include pages linked to from that page. */
private function getPageLinks( $inputPages, $pageSet, $depth ) {
- for( $depth=$depth; $depth>0; --$depth ) {
- $pageSet = $this->getLinks( $inputPages, $pageSet, 'pagelinks',
- array( 'pl_namespace AS namespace', 'pl_title AS title' ),
- array( 'page_id=pl_from' ) );
+ for(; $depth > 0; --$depth ) {
+ $pageSet = $this->getLinks(
+ $inputPages, $pageSet, 'pagelinks',
+ array( 'pl_namespace AS namespace', 'pl_title AS title' ),
+ array( 'page_id=pl_from' )
+ );
$inputPages = array_keys( $pageSet );
}
+
return $pageSet;
}
-
+
/**
* Expand a list of pages to include images used in those pages.
+ *
* @param $inputPages array, list of titles to look up
* @param $pageSet array, associative array indexed by titles for output
+ *
* @return array associative array index by titles
*/
private function getImages( $inputPages, $pageSet ) {
- return $this->getLinks( $inputPages, $pageSet,
- 'imagelinks',
- array( NS_FILE . ' AS namespace', 'il_to AS title' ),
- array( 'page_id=il_from' ) );
+ return $this->getLinks(
+ $inputPages,
+ $pageSet,
+ 'imagelinks',
+ array( NS_FILE . ' AS namespace', 'il_to AS title' ),
+ array( 'page_id=il_from' )
+ );
}
-
+
/**
* Expand a list of pages to include items used in those pages.
- * @private
*/
private function getLinks( $inputPages, $pageSet, $table, $fields, $join ) {
$dbr = wfGetDB( DB_SLAVE );
+
foreach( $inputPages as $page ) {
$title = Title::newFromText( $page );
+
if( $title ) {
$pageSet[$title->getPrefixedText()] = true;
/// @todo Fixme: May or may not be more efficient to batch these
/// by namespace when given multiple input pages.
$result = $dbr->select(
- array( 'page', $table ),
- $fields,
- array_merge( $join,
- array(
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() ) ),
- __METHOD__ );
+ array( 'page', $table ),
+ $fields,
+ array_merge(
+ $join,
+ array(
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ )
+ ),
+ __METHOD__
+ );
+
foreach( $result as $row ) {
$template = Title::makeTitle( $row->namespace, $row->title );
$pageSet[$template->getPrefixedText()] = true;
}
}
}
+
return $pageSet;
}
-}
-
+
+} \ No newline at end of file
diff --git a/includes/specials/SpecialFewestrevisions.php b/includes/specials/SpecialFewestrevisions.php
index 65d76a65..c265ed38 100644
--- a/includes/specials/SpecialFewestrevisions.php
+++ b/includes/specials/SpecialFewestrevisions.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:Fewestrevisions
+ *
+ * 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
*/
diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php
index 0ed7020a..172e92ad 100644
--- a/includes/specials/SpecialFileDuplicateSearch.php
+++ b/includes/specials/SpecialFileDuplicateSearch.php
@@ -1,24 +1,37 @@
<?php
/**
- * A special page to search for files by hash value as defined in the
- * img_sha1 field in the image table
+ * Implements Special:FileDuplicateSearch
+ *
+ * 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
- *
* @author Raimond Spekking, based on Special:MIMESearch by Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
/**
* Searches the database for files of the requested hash, comparing this with the
* 'img_sha1' field in the image table.
+ *
* @ingroup SpecialPage
*/
class FileDuplicateSearchPage extends QueryPage {
var $hash, $filename;
- function FileDuplicateSearchPage( $hash, $filename ) {
+ function __construct( $hash, $filename ) {
$this->hash = $hash;
$this->filename = $filename;
}
@@ -72,7 +85,7 @@ function wfSpecialFileDuplicateSearch( $par = null ) {
$hash = '';
$filename = isset( $par ) ? $par : $wgRequest->getText( 'filename' );
- $title = Title::newFromText( $filename );
+ $title = Title::makeTitleSafe( NS_FILE, $filename );
if( $title && $title->getText() != '' ) {
$dbr = wfGetDB( DB_SLAVE );
$image = $dbr->tableName( 'image' );
@@ -83,13 +96,12 @@ function wfSpecialFileDuplicateSearch( $par = null ) {
if( $row !== false ) {
$hash = $row[0];
}
- $dbr->freeResult( $res );
}
# Create the input form
$wgOut->addHTML(
Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
- Xml::hidden( 'title', SpecialPage::getTitleFor( 'FileDuplicateSearch' )->getPrefixedDbKey() ) .
+ Html::hidden( 'title', SpecialPage::getTitleFor( 'FileDuplicateSearch' )->getPrefixedDbKey() ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'fileduplicatesearch-legend' ) ) .
Xml::inputLabel( wfMsg( 'fileduplicatesearch-filename' ), 'filename', 'filename', 50, $filename ) . ' ' .
diff --git a/includes/specials/SpecialFilepath.php b/includes/specials/SpecialFilepath.php
index 8bc1c68b..8bb0890c 100644
--- a/includes/specials/SpecialFilepath.php
+++ b/includes/specials/SpecialFilepath.php
@@ -1,53 +1,81 @@
<?php
/**
+ * Implements Special:Filepath
+ *
+ * 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
*/
-function wfSpecialFilepath( $par ) {
- global $wgRequest, $wgOut;
+/**
+ * A special page that redirects to the URL of a given file
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialFilepath extends SpecialPage {
- $file = isset( $par ) ? $par : $wgRequest->getText( 'file' );
+ function __construct() {
+ parent::__construct( 'Filepath' );
+ }
- $title = Title::makeTitleSafe( NS_FILE, $file );
+ function execute( $par ) {
+ global $wgRequest, $wgOut;
- if ( ! $title instanceof Title || $title->getNamespace() != NS_FILE ) {
- $cform = new FilepathForm( $title );
- $cform->execute();
- } else {
- $file = wfFindFile( $title );
- if ( $file && $file->exists() ) {
- $wgOut->redirect( $file->getURL() );
- } else {
- $wgOut->setStatusCode( 404 );
- $cform = new FilepathForm( $title );
- $cform->execute();
- }
- }
-}
+ $this->setHeaders();
+ $this->outputHeader();
-/**
- * @ingroup SpecialPage
- */
-class FilepathForm {
- var $mTitle;
+ $file = !is_null( $par ) ? $par : $wgRequest->getText( 'file' );
- function FilepathForm( &$title ) {
- $this->mTitle =& $title;
+ $title = Title::makeTitleSafe( NS_FILE, $file );
+
+ if ( ! $title instanceof Title || $title->getNamespace() != NS_FILE ) {
+ $this->showForm( $title );
+ } else {
+ $file = wfFindFile( $title );
+ if ( $file && $file->exists() ) {
+ $url = $file->getURL();
+ $width = $wgRequest->getInt( 'width', -1 );
+ $height = $wgRequest->getInt( 'height', -1 );
+ if ( $width != -1 ) {
+ $mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
+ if ( $mto && !$mto->isError() ) {
+ $url = $mto->getURL();
+ }
+ }
+ $wgOut->redirect( $url );
+ } else {
+ $wgOut->setStatusCode( 404 );
+ $this->showForm( $title );
+ }
+ }
}
- function execute() {
+ function showForm( $title ) {
global $wgOut, $wgScript;
$wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'specialfilepath' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsg( 'filepath' ) ) .
- Xml::hidden( 'title', SpecialPage::getTitleFor( 'Filepath' )->getPrefixedText() ) .
- Xml::inputLabel( wfMsg( 'filepath-page' ), 'file', 'file', 25, is_object( $this->mTitle ) ? $this->mTitle->getText() : '' ) . ' ' .
+ Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'specialfilepath' ) ) .
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', null, wfMsg( 'filepath' ) ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ Xml::inputLabel( wfMsg( 'filepath-page' ), 'file', 'file', 25, is_object( $title ) ? $title->getText() : '' ) . ' ' .
Xml::submitButton( wfMsg( 'filepath-submit' ) ) . "\n" .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' )
+ Html::closeElement( 'fieldset' ) .
+ Html::closeElement( 'form' )
);
}
}
diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php
index 248709a8..7d1cf0dd 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -1,7 +1,8 @@
<?php
/**
- * MediaWiki page data importer
- * Copyright (C) 2003,2005 Brion Vibber <brion@pobox.com>
+ * Implements Special:Import
+ *
+ * Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -23,6 +24,11 @@
* @ingroup SpecialPage
*/
+/**
+ * MediaWiki page data importer
+ *
+ * @ingroup SpecialPage
+ */
class SpecialImport extends SpecialPage {
private $interwiki = false;
@@ -51,7 +57,6 @@ class SpecialImport extends SpecialPage {
$this->outputHeader();
if ( wfReadOnly() ) {
- global $wgOut;
$wgOut->readOnlyPage();
return;
}
@@ -97,7 +102,7 @@ class SpecialImport extends SpecialPage {
$this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $wgRequest->getIntOrNull( 'pagelink-depth' );
if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'editToken' ) ) ) {
- $source = new WikiErrorMsg( 'import-token-mismatch' );
+ $source = Status::newFatal( 'import-token-mismatch' );
} elseif ( $sourceName == 'upload' ) {
$isUpload = true;
if( $wgUser->isAllowed( 'importupload' ) ) {
@@ -111,7 +116,7 @@ class SpecialImport extends SpecialPage {
}
$this->interwiki = $wgRequest->getVal( 'interwiki' );
if ( !in_array( $this->interwiki, $wgImportSources ) ) {
- $source = new WikiErrorMsg( "import-invalid-interwiki" );
+ $source = Status::newFatal( "import-invalid-interwiki" );
} else {
$this->history = $wgRequest->getCheck( 'interwikiHistory' );
$this->frompage = $wgRequest->getText( "frompage" );
@@ -124,30 +129,35 @@ class SpecialImport extends SpecialPage {
$this->pageLinkDepth );
}
} else {
- $source = new WikiErrorMsg( "importunknownsource" );
+ $source = Status::newFatal( "importunknownsource" );
}
- if( WikiError::isError( $source ) ) {
- $wgOut->wrapWikiMsg( '<p class="error">$1</p>', array( 'importfailed', $source->getMessage() ) );
+ if( !$source->isGood() ) {
+ $wgOut->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
} else {
$wgOut->addWikiMsg( "importstart" );
- $importer = new WikiImporter( $source );
+ $importer = new WikiImporter( $source->value );
if( !is_null( $this->namespace ) ) {
$importer->setTargetNamespace( $this->namespace );
}
$reporter = new ImportReporter( $importer, $isUpload, $this->interwiki , $this->logcomment);
+ $exception = false;
$reporter->open();
- $result = $importer->doImport();
- $resultCount = $reporter->close();
+ try {
+ $importer->doImport();
+ } catch ( MWException $e ) {
+ $exception = $e;
+ }
+ $result = $reporter->close();
- if( WikiError::isError( $result ) ) {
+ if ( $exception ) {
# No source or XML parse error
- $wgOut->wrapWikiMsg( '<p class="error">$1</p>', array( 'importfailed', $result->getMessage() ) );
- } elseif( WikiError::isError( $resultCount ) ) {
+ $wgOut->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $exception->getMessage() ) );
+ } elseif( !$result->isGood() ) {
# Zero revisions
- $wgOut->wrapWikiMsg( '<p class="error">$1</p>', array( 'importfailed', $resultCount->getMessage() ) );
+ $wgOut->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $result->getWikiText() ) );
} else {
# Success!
$wgOut->addWikiMsg( 'importsuccess' );
@@ -157,7 +167,7 @@ class SpecialImport extends SpecialPage {
}
private function showForm() {
- global $wgUser, $wgOut, $wgRequest, $wgImportSources, $wgExportMaxLinkDepth;
+ global $wgUser, $wgOut, $wgImportSources, $wgExportMaxLinkDepth;
$action = $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) );
@@ -167,8 +177,8 @@ class SpecialImport extends SpecialPage {
Xml::fieldset( wfMsg( 'import-upload' ) ).
Xml::openElement( 'form', array( 'enctype' => 'multipart/form-data', 'method' => 'post',
'action' => $action, 'id' => 'mw-import-upload-form' ) ) .
- Xml::hidden( 'action', 'submit' ) .
- Xml::hidden( 'source', 'upload' ) .
+ Html::hidden( 'action', 'submit' ) .
+ Html::hidden( 'source', 'upload' ) .
Xml::openElement( 'table', array( 'id' => 'mw-import-table' ) ) .
"<tr>
@@ -195,7 +205,7 @@ class SpecialImport extends SpecialPage {
"</td>
</tr>" .
Xml::closeElement( 'table' ).
- Xml::hidden( 'editToken', $wgUser->editToken() ) .
+ Html::hidden( 'editToken', $wgUser->editToken() ) .
Xml::closeElement( 'form' ) .
Xml::closeElement( 'fieldset' )
);
@@ -223,9 +233,9 @@ class SpecialImport extends SpecialPage {
Xml::fieldset( wfMsg( 'importinterwiki' ) ) .
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'mw-import-interwiki-form' ) ) .
wfMsgExt( 'import-interwiki-text', array( 'parse' ) ) .
- Xml::hidden( 'action', 'submit' ) .
- Xml::hidden( 'source', 'interwiki' ) .
- Xml::hidden( 'editToken', $wgUser->editToken() ) .
+ Html::hidden( 'action', 'submit' ) .
+ Html::hidden( 'source', 'interwiki' ) .
+ Html::hidden( 'editToken', $wgUser->editToken() ) .
Xml::openElement( 'table', array( 'id' => 'mw-import-table' ) ) .
"<tr>
<td class='mw-label'>" .
@@ -280,7 +290,7 @@ class SpecialImport extends SpecialPage {
<td>
</td>
<td class='mw-submit'>" .
- Xml::submitButton( wfMsg( 'import-interwiki-submit' ), array( 'accesskey' => 's' ) ) .
+ Xml::submitButton( wfMsg( 'import-interwiki-submit' ), $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'import' ) ) .
"</td>
</tr>" .
Xml::closeElement( 'table' ).
@@ -297,9 +307,15 @@ class SpecialImport extends SpecialPage {
*/
class ImportReporter {
private $reason=false;
+ private $mOriginalLogCallback = null;
+ private $mOriginalPageOutCallback = null;
+ private $mLogItemCount = 0;
function __construct( $importer, $upload, $interwiki , $reason=false ) {
- $importer->setPageOutCallback( array( $this, 'reportPage' ) );
+ $this->mOriginalPageOutCallback =
+ $importer->setPageOutCallback( array( $this, 'reportPage' ) );
+ $this->mOriginalLogCallback =
+ $importer->setLogItemCallback( array( $this, 'reportLogItem' ) );
$this->mPageCount = 0;
$this->mIsUpload = $upload;
$this->mInterwiki = $interwiki;
@@ -310,9 +326,19 @@ class ImportReporter {
global $wgOut;
$wgOut->addHTML( "<ul>\n" );
}
+
+ function reportLogItem( /* ... */ ) {
+ $this->mLogItemCount++;
+ if ( is_callable( $this->mOriginalLogCallback ) ) {
+ call_user_func_array( $this->mOriginalLogCallback, func_get_args() );
+ }
+ }
- function reportPage( $title, $origTitle, $revisionCount, $successCount ) {
+ function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
global $wgOut, $wgUser, $wgLang, $wgContLang;
+
+ $args = func_get_args();
+ call_user_func_array( $this->mOriginalPageOutCallback, $args );
$skin = $wgUser->getSkin();
@@ -362,13 +388,18 @@ class ImportReporter {
}
function close() {
- global $wgOut;
- if( $this->mPageCount == 0 ) {
+ global $wgOut, $wgLang;
+
+ if ( $this->mLogItemCount > 0 ) {
+ $msg = wfMsgExt( 'imported-log-entries', 'parseinline',
+ $wgLang->formatNum( $this->mLogItemCount ) );
+ $wgOut->addHTML( Xml::tags( 'li', null, $msg ) );
+ } elseif( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
$wgOut->addHTML( "</ul>\n" );
- return new WikiErrorMsg( "importnopages" );
+ return Status::newFatal( 'importnopages' );
}
$wgOut->addHTML( "</ul>\n" );
- return $this->mPageCount;
+ return Status::newGood( $this->mPageCount );
}
}
diff --git a/includes/specials/SpecialIpblocklist.php b/includes/specials/SpecialIpblocklist.php
index dfdcf1a7..24d7f008 100644
--- a/includes/specials/SpecialIpblocklist.php
+++ b/includes/specials/SpecialIpblocklist.php
@@ -1,103 +1,134 @@
<?php
/**
+ * Implements Special:ipblocklist
+ *
+ * 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
*/
/**
- * @param $ip part of title: Special:Ipblocklist/<ip>.
- * @todo document
+ * A special page that lists existing blocks and allows users with the 'block'
+ * permission to remove blocks
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialIpblocklist( $ip = '' ) {
- global $wgUser, $wgOut, $wgRequest;
- $ip = $wgRequest->getVal( 'ip', $ip );
- $ip = trim( $wgRequest->getVal( 'wpUnblockAddress', $ip ) );
- $id = $wgRequest->getVal( 'id' );
- $reason = $wgRequest->getText( 'wpUnblockReason' );
- $action = $wgRequest->getText( 'action' );
- $successip = $wgRequest->getVal( 'successip' );
-
- $ipu = new IPUnblockForm( $ip, $id, $reason );
-
- if( $action == 'unblock' ) {
- # Check permissions
- if( !$wgUser->isAllowed( 'block' ) ) {
- $wgOut->permissionRequired( 'block' );
- return;
- }
- # Check for database lock
- if( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
- # Show unblock form
- $ipu->showForm( '' );
- } elseif( $action == 'submit' && $wgRequest->wasPosted()
- && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- # Check permissions
- if( !$wgUser->isAllowed( 'block' ) ) {
- $wgOut->permissionRequired( 'block' );
- return;
- }
- # Check for database lock
- if( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
- # Remove blocks and redirect user to success page
- $ipu->doSubmit();
- } elseif( $action == 'success' ) {
- # Inform the user of a successful unblock
- # (No need to check permissions or locks here,
- # if something was done, then it's too late!)
- if ( substr( $successip, 0, 1) == '#' ) {
- // A block ID was unblocked
- $ipu->showList( $wgOut->parse( wfMsg( 'unblocked-id', $successip ) ) );
- } else {
- // A username/IP was unblocked
- $ipu->showList( $wgOut->parse( wfMsg( 'unblocked', $successip ) ) );
- }
- } else {
- # Just show the block list
- $ipu->showList( '' );
+class IPUnblockForm extends SpecialPage {
+ var $ip, $reason, $id;
+ var $hideuserblocks, $hidetempblocks, $hideaddressblocks;
+
+ function __construct() {
+ parent::__construct( 'Ipblocklist' );
}
-}
+ /**
+ * Main execution point
+ *
+ * @param $ip part of title: Special:Ipblocklist/<ip>.
+ */
+ function execute( $ip ) {
+ global $wgUser, $wgOut, $wgRequest;
-/**
- * implements Special:ipblocklist GUI
- * @ingroup SpecialPage
- */
-class IPUnblockForm {
- var $ip, $reason, $id;
+ $this->setHeaders();
+ $this->outputHeader();
- function IPUnblockForm( $ip, $id, $reason ) {
- global $wgRequest;
- $this->ip = strtr( $ip, '_', ' ' );
- $this->id = $id;
- $this->reason = $reason;
+ $ip = $wgRequest->getVal( 'ip', $ip );
+ $this->ip = trim( $wgRequest->getVal( 'wpUnblockAddress', $ip ) );
+ $this->id = $wgRequest->getVal( 'id' );
+ $this->reason = $wgRequest->getText( 'wpUnblockReason' );
$this->hideuserblocks = $wgRequest->getBool( 'hideuserblocks' );
$this->hidetempblocks = $wgRequest->getBool( 'hidetempblocks' );
$this->hideaddressblocks = $wgRequest->getBool( 'hideaddressblocks' );
+
+ $action = $wgRequest->getText( 'action' );
+ $successip = $wgRequest->getVal( 'successip' );
+
+ if( $action == 'unblock' || $action == 'submit' && $wgRequest->wasPosted() ) {
+ # Check permissions
+ if( !$wgUser->isAllowed( 'block' ) ) {
+ $wgOut->permissionRequired( 'block' );
+ return;
+ }
+ # Check for database lock
+ if( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
+
+ # bug 15810: blocked admins should have limited access here
+ if ( $wgUser->isBlocked() ) {
+ if ( $this->id ) {
+ # This doesn't pick up on autoblocks, but admins
+ # should have the ipblock-exempt permission anyway
+ $block = Block::newFromID( $this->id );
+ $user = User::newFromName( $block->mAddress );
+ } else {
+ $user = User::newFromName( $this->ip );
+ }
+ $status = IPBlockForm::checkUnblockSelf( $user );
+ if ( $status !== true ) {
+ throw new ErrorPageError( 'badaccess', $status );
+ }
+ }
+
+ if( $action == 'unblock' ){
+ # Show unblock form
+ $this->showForm( '' );
+ } elseif( $action == 'submit'
+ && $wgRequest->wasPosted()
+ && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) )
+ {
+ # Remove blocks and redirect user to success page
+ $this->doSubmit();
+ }
+
+ } elseif( $action == 'success' ) {
+ # Inform the user of a successful unblock
+ # (No need to check permissions or locks here,
+ # if something was done, then it's too late!)
+ if ( substr( $successip, 0, 1) == '#' ) {
+ // A block ID was unblocked
+ $this->showList( $wgOut->parse( wfMsg( 'unblocked-id', $successip ) ) );
+ } else {
+ // A username/IP was unblocked
+ $this->showList( $wgOut->parse( wfMsg( 'unblocked', $successip ) ) );
+ }
+ } else {
+ # Just show the block list
+ $this->showList( '' );
+ }
}
/**
* Generates the unblock form
+ *
* @param $err string: error message
* @return $out string: HTML form
*/
function showForm( $err ) {
global $wgOut, $wgUser, $wgSysopUserBans;
- $wgOut->setPagetitle( wfMsg( 'unblockip' ) );
$wgOut->addWikiMsg( 'unblockiptext' );
- $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
- $action = $titleObj->getLocalURL( "action=submit" );
+ $action = $this->getTitle()->getLocalURL( 'action=submit' );
- if ( $err != "" ) {
- $wgOut->setSubtitle( wfMsg( "formerror" ) );
- $wgOut->addWikiText( Xml::tags( 'span', array( 'class' => 'error' ), $err ) . "\n" );
+ if ( $err != '' ) {
+ $wgOut->setSubtitle( wfMsg( 'formerror' ) );
+ $wgOut->addWikiText( Html::rawElement( 'span', array( 'class' => 'error' ), $err ) . "\n" );
}
$addressPart = false;
@@ -106,7 +137,7 @@ class IPUnblockForm {
if ( $block ) {
$encName = htmlspecialchars( $block->getRedactedName() );
$encId = $this->id;
- $addressPart = $encName . Xml::hidden( 'id', $encId );
+ $addressPart = $encName . Html::hidden( 'id', $encId );
$ipa = wfMsgHtml( $wgSysopUserBans ? 'ipadressorusername' : 'ipaddress' );
}
}
@@ -116,10 +147,10 @@ class IPUnblockForm {
}
$wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'unblockip' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsg( 'ipb-unblock' ) ) .
- Xml::openElement( 'table', array( 'id' => 'mw-unblock-table' ) ).
+ Html::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'unblockip' ) ) .
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', null, wfMsg( 'ipb-unblock' ) ) .
+ Html::openElement( 'table', array( 'id' => 'mw-unblock-table' ) ).
"<tr>
<td class='mw-label'>
{$ipa}
@@ -137,15 +168,15 @@ class IPUnblockForm {
"</td>
</tr>
<tr>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-submit'>" .
Xml::submitButton( wfMsg( 'ipusubmit' ), array( 'name' => 'wpBlock', 'tabindex' => '3' ) ) .
"</td>
</tr>" .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::hidden( 'wpEditToken', $wgUser->editToken() ) .
- Xml::closeElement( 'form' ) . "\n"
+ Html::closeElement( 'table' ) .
+ Html::closeElement( 'fieldset' ) .
+ Html::hidden( 'wpEditToken', $wgUser->editToken() ) .
+ Html::closeElement( 'form' ) . "\n"
);
}
@@ -162,34 +193,35 @@ class IPUnblockForm {
* case it contains the range $ip is part of.
* @return array array(message key, parameters) on failure, empty array on success
*/
-
- static function doUnblock(&$id, &$ip, &$reason, &$range = null, $blocker=null) {
+ public static function doUnblock( &$id, &$ip, &$reason, &$range = null, $blocker = null ) {
if ( $id ) {
$block = Block::newFromID( $id );
if ( !$block ) {
- return array('ipb_cant_unblock', htmlspecialchars($id));
+ return array( 'ipb_cant_unblock', htmlspecialchars( $id ) );
}
$ip = $block->getRedactedName();
} else {
- $block = new Block();
$ip = trim( $ip );
if ( substr( $ip, 0, 1 ) == "#" ) {
$id = substr( $ip, 1 );
$block = Block::newFromID( $id );
if( !$block ) {
- return array('ipb_cant_unblock', htmlspecialchars($id));
+ return array( 'ipb_cant_unblock', htmlspecialchars( $id ) );
}
$ip = $block->getRedactedName();
} else {
+ # FIXME: do proper sanitisation/cleanup here
+ $ip = str_replace( '_', ' ', $ip );
+
$block = Block::newFromDB( $ip );
if ( !$block ) {
- return array('ipb_cant_unblock', htmlspecialchars($id));
+ return array( 'ipb_cant_unblock', htmlspecialchars( $id ) );
}
if( $block->mRangeStart != $block->mRangeEnd && !strstr( $ip, "/" ) ) {
/* If the specified IP is a single address, and the block is
* a range block, don't unblock the range. */
$range = $block->mAddress;
- return array('ipb_blocked_as_range', $ip, $range);
+ return array( 'ipb_blocked_as_range', $ip, $range );
}
}
}
@@ -198,13 +230,13 @@ class IPUnblockForm {
# If the name was hidden and the blocking user cannot hide
# names, then don't allow any block removals...
- if( $blocker && $block->mHideName && !$blocker->isAllowed('hideuser') ) {
- return array('ipb_cant_unblock', htmlspecialchars($id));
+ if( $blocker && $block->mHideName && !$blocker->isAllowed( 'hideuser' ) ) {
+ return array( 'ipb_cant_unblock', htmlspecialchars( $id ) );
}
# Delete block
if ( !$block->delete() ) {
- return array('ipb_cant_unblock', htmlspecialchars($id));
+ return array( 'ipb_cant_unblock', htmlspecialchars( $id ) );
}
# Unset _deleted fields as needed
@@ -220,23 +252,23 @@ class IPUnblockForm {
function doSubmit() {
global $wgOut, $wgUser;
- $retval = self::doUnblock($this->id, $this->ip, $this->reason, $range, $wgUser);
- if( !empty($retval) ) {
- $key = array_shift($retval);
- $this->showForm(wfMsgReal($key, $retval));
+
+ $retval = self::doUnblock( $this->id, $this->ip, $this->reason, $range, $wgUser );
+ if( !empty( $retval ) ) {
+ $key = array_shift( $retval );
+ $this->showForm( wfMsgReal( $key, $retval ) );
return;
}
+
# Report to the user
- $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
- $success = $titleObj->getFullURL( "action=success&successip=" . urlencode( $this->ip ) );
+ $success = $this->getTitle()->getFullURL( 'action=success&successip=' . urlencode( $this->ip ) );
$wgOut->redirect( $success );
}
function showList( $msg ) {
global $wgOut, $wgUser;
- $wgOut->setPagetitle( wfMsg( "ipblocklist" ) );
- if ( $msg != "" ) {
+ if ( $msg != '' ) {
$wgOut->setSubtitle( $msg );
}
@@ -246,7 +278,6 @@ class IPUnblockForm {
}
$conds = array();
- $matches = array();
// Is user allowed to see all the blocks?
if ( !$wgUser->isAllowed( 'hideuser' ) )
$conds['ipb_deleted'] = 0;
@@ -255,25 +286,26 @@ class IPUnblockForm {
} elseif ( substr( $this->ip, 0, 1 ) == '#' ) {
$conds['ipb_id'] = substr( $this->ip, 1 );
// Single IPs
- } elseif ( IP::isIPAddress($this->ip) && strpos($this->ip,'/') === false ) {
- if( $iaddr = IP::toHex($this->ip) ) {
+ } elseif ( IP::isIPAddress( $this->ip ) && strpos( $this->ip, '/' ) === false ) {
+ $iaddr = IP::toHex( $this->ip );
+ if( $iaddr ) {
# Only scan ranges which start in this /16, this improves search speed
# Blocks should not cross a /16 boundary.
$range = substr( $iaddr, 0, 4 );
// Fixme -- encapsulate this sort of query-building.
$dbr = wfGetDB( DB_SLAVE );
- $encIp = $dbr->addQuotes( IP::sanitizeIP($this->ip) );
+ $encIp = $dbr->addQuotes( IP::sanitizeIP( $this->ip ) );
$encAddr = $dbr->addQuotes( $iaddr );
$conds[] = "(ipb_address = $encIp) OR
(ipb_range_start" . $dbr->buildLike( $range, $dbr->anyString() ) . " AND
ipb_range_start <= $encAddr
AND ipb_range_end >= $encAddr)";
} else {
- $conds['ipb_address'] = IP::sanitizeIP($this->ip);
+ $conds['ipb_address'] = IP::sanitizeIP( $this->ip );
}
$conds['ipb_auto'] = 0;
// IP range
- } elseif ( IP::isIPAddress($this->ip) ) {
+ } elseif ( IP::isIPAddress( $this->ip ) ) {
$conds['ipb_address'] = Block::normaliseRange( $this->ip );
$conds['ipb_auto'] = 0;
} else {
@@ -315,7 +347,7 @@ class IPUnblockForm {
if ( $pager->getNumRows() ) {
$wgOut->addHTML(
$pager->getNavigationBar() .
- Xml::tags( 'ul', null, $pager->getBody() ) .
+ Html::rawElement( 'ul', null, $pager->getBody() ) .
$pager->getNavigationBar()
);
} elseif ( $this->ip != '') {
@@ -338,7 +370,7 @@ class IPUnblockForm {
}
function searchForm() {
- global $wgScript, $wgRequest, $wgLang;
+ global $wgScript, $wgLang;
$showhide = array( wfMsg( 'show' ), wfMsg( 'hide' ) );
$nondefaults = array();
@@ -365,30 +397,32 @@ class IPUnblockForm {
$hl = $wgLang->pipeList( $links );
return
- Xml::tags( 'form', array( 'action' => $wgScript ),
- Xml::hidden( 'title', SpecialPage::getTitleFor( 'Ipblocklist' )->getPrefixedDbKey() ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsg( 'ipblocklist-legend' ) ) .
+ Html::rawElement( 'form', array( 'action' => $wgScript ),
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+ Html::openElement( 'fieldset' ) .
+ Html::element( 'legend', null, wfMsg( 'ipblocklist-legend' ) ) .
Xml::inputLabel( wfMsg( 'ipblocklist-username' ), 'ip', 'ip', /* size */ false, $this->ip ) .
- '&nbsp;' .
+ '&#160;' .
Xml::submitButton( wfMsg( 'ipblocklist-submit' ) ) . '<br />' .
$hl .
- Xml::closeElement( 'fieldset' )
+ Html::closeElement( 'fieldset' )
);
}
/**
* Makes change an option link which carries all the other options
+ *
* @param $title see Title
- * @param $override
- * @param $options
+ * @param $override Array: special query string options, will override the
+ * ones in $options
+ * @param $options Array: query string options
+ * @param $active Boolean: whether to display the link in bold
*/
function makeOptionsLink( $title, $override, $options, $active = false ) {
global $wgUser;
$sk = $wgUser->getSkin();
$params = $override + $options;
- $ipblocklist = SpecialPage::getTitleFor( 'Ipblocklist' );
- return $sk->link( $ipblocklist, htmlspecialchars( $title ),
+ return $sk->link( $this->getTitle(), htmlspecialchars( $title ),
( $active ? array( 'style'=>'font-weight: bold;' ) : array() ), $params, array( 'known' ) );
}
@@ -453,11 +487,10 @@ class IPUnblockForm {
$line = wfMsgReplaceArgs( $msg['blocklistline'], array( $formattedTime, $blocker, $target, $properties ) );
- $unblocklink = '';
$changeblocklink = '';
$toolLinks = '';
if ( $wgUser->isAllowed( 'block' ) ) {
- $unblocklink = $sk->link( SpecialPage::getTitleFor( 'Ipblocklist' ),
+ $unblocklink = $sk->link( $this->getTitle(),
$msg['unblocklink'],
array(),
array( 'action' => 'unblock', 'id' => $block->mId ),
@@ -513,7 +546,7 @@ class IPBlocklistPager extends ReverseChronologicalPager {
# Faster way
# Usernames and titles are in fact related by a simple substitution of space -> underscore
# The last few lines of Title::secureAndSplit() tell the story.
- while ( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$name = str_replace( ' ', '_', $row->ipb_by_text );
$lb->add( NS_USER, $name );
$lb->add( NS_USER_TALK, $name );
diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php
index 70b2257a..9dee9d5a 100644
--- a/includes/specials/SpecialLinkSearch.php
+++ b/includes/specials/SpecialLinkSearch.php
@@ -1,11 +1,27 @@
<?php
/**
+ * Implements Special:LinkSearch
+ *
+ * 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
- *
* @author Brion Vibber
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
+
/**
* Special:LinkSearch to search the external-links table.
@@ -13,7 +29,7 @@
function wfSpecialLinkSearch( $par ) {
list( $limit, $offset ) = wfCheckLimits();
- global $wgOut, $wgRequest, $wgUrlProtocols, $wgMiserMode, $wgLang;
+ global $wgOut, $wgUrlProtocols, $wgMiserMode, $wgLang;
$target = $GLOBALS['wgRequest']->getVal( 'target', $par );
$namespace = $GLOBALS['wgRequest']->getIntorNull( 'namespace', null );
@@ -44,19 +60,18 @@ function wfSpecialLinkSearch( $par ) {
$protocol = '';
}
- $wgOut->allowClickjacking();
-
$self = Title::makeTitle( NS_SPECIAL, 'Linksearch' );
-
+
+ $wgOut->allowClickjacking();
$wgOut->addWikiMsg( 'linksearch-text', '<nowiki>' . $wgLang->commaList( $wgUrlProtocols ) . '</nowiki>' );
- $s = Xml::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $GLOBALS['wgScript'] ) ) .
- Xml::hidden( 'title', $self->getPrefixedDbKey() ) .
+ $s = Xml::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $GLOBALS['wgScript'] ) ) .
+ Html::hidden( 'title', $self->getPrefixedDbKey() ) .
'<fieldset>' .
Xml::element( 'legend', array(), wfMsg( 'linksearch' ) ) .
Xml::inputLabel( wfMsg( 'linksearch-pat' ), 'target', 'target', 50, $target ) . ' ';
if ( !$wgMiserMode ) {
$s .= Xml::label( wfMsg( 'linksearch-ns' ), 'namespace' ) . ' ' .
- XML::namespaceSelector( $namespace, '' );
+ Xml::namespaceSelector( $namespace, '' );
}
$s .= Xml::submitButton( wfMsg( 'linksearch-ok' ) ) .
'</fieldset>' .
@@ -73,6 +88,9 @@ function wfSpecialLinkSearch( $par ) {
}
}
+/**
+ * @ingroup SpecialPage
+ */
class LinkSearchPage extends QueryPage {
function setParams( $params ) {
$this->mQuery = $params['query'];
@@ -98,8 +116,9 @@ class LinkSearchPage extends QueryPage {
$field = 'el_index';
$rv = LinkFilter::makeLikeArray( $query , $prot );
if ($rv === false) {
- //makeLike doesn't handle wildcard in IP, so we'll have to munge here.
+ // LinkFilter doesn't handle wildcard in IP, so we'll have to munge here.
if (preg_match('/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/', $query)) {
+ $dbr = wfGetDB( DB_SLAVE );
$rv = array( $prot . rtrim($query, " \t*"), $dbr->anyString() );
$field = 'el_to';
}
@@ -162,7 +181,7 @@ class LinkSearchPage extends QueryPage {
*/
function doQuery( $offset, $limit, $shownavigation=true ) {
global $wgOut;
- list( $this->mMungedQuery, $clause ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
+ list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
if( $this->mMungedQuery === false ) {
$wgOut->addWikiMsg( 'linksearch-error' );
} else {
diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php
index b9332422..350e833b 100644
--- a/includes/specials/SpecialListfiles.php
+++ b/includes/specials/SpecialListfiles.php
@@ -1,16 +1,30 @@
<?php
/**
+ * Implements Special:Listfiles
+ *
+ * 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
*/
-
-/**
- *
- */
-function wfSpecialListfiles() {
+
+function wfSpecialListfiles( $par = null ) {
global $wgOut;
- $pager = new ImageListPager;
+ $pager = new ImageListPager( $par );
$limit = $pager->getForm();
$body = $pager->getBody();
@@ -24,21 +38,32 @@ function wfSpecialListfiles() {
class ImageListPager extends TablePager {
var $mFieldNames = null;
var $mQueryConds = array();
-
- function __construct() {
+ var $mUserName = null;
+
+ function __construct( $par = null ) {
global $wgRequest, $wgMiserMode;
if ( $wgRequest->getText( 'sort', 'img_date' ) == 'img_date' ) {
$this->mDefaultDirection = true;
} else {
$this->mDefaultDirection = false;
}
+
+ $userName = $wgRequest->getText( 'user', $par );
+ if ( $userName ) {
+ $nt = Title::newFromText( $userName, NS_USER );
+ if ( !is_null( $nt ) ) {
+ $this->mUserName = $nt->getText();
+ $this->mQueryConds['img_user_text'] = $this->mUserName;
+ }
+ }
+
$search = $wgRequest->getText( 'ilsearch' );
if ( $search != '' && !$wgMiserMode ) {
$nt = Title::newFromURL( $search );
- if( $nt ) {
+ if ( $nt ) {
$dbr = wfGetDB( DB_SLAVE );
- $this->mQueryConds = array( 'LOWER(img_name)' . $dbr->buildLike( $dbr->anyString(),
- strtolower( $nt->getDBkey() ), $dbr->anyString() ) );
+ $this->mQueryConds[] = 'LOWER(img_name)' . $dbr->buildLike( $dbr->anyString(),
+ strtolower( $nt->getDBkey() ), $dbr->anyString() );
}
}
@@ -49,6 +74,7 @@ class ImageListPager extends TablePager {
if ( !$this->mFieldNames ) {
global $wgMiserMode;
$this->mFieldNames = array(
+ 'thumb' => wfMsg( 'listfiles_thumb' ),
'img_timestamp' => wfMsg( 'listfiles_date' ),
'img_name' => wfMsg( 'listfiles_name' ),
'img_user_text' => wfMsg( 'listfiles_user' ),
@@ -63,7 +89,11 @@ class ImageListPager extends TablePager {
}
function isFieldSortable( $field ) {
- static $sortable = array( 'img_timestamp', 'img_name', 'img_size' );
+ static $sortable = array( 'img_timestamp', 'img_name' );
+ if ( $field == 'img_size' ) {
+ # No index for both img_size and img_user_text
+ return !isset( $this->mQueryConds['img_user_text'] );
+ }
return in_array( $field, $sortable );
}
@@ -71,6 +101,7 @@ class ImageListPager extends TablePager {
$tables = array( 'image' );
$fields = array_keys( $this->getFieldNames() );
$fields[] = 'img_user';
+ $fields[array_search('thumb', $fields)] = 'img_name as thumb';
$options = $join_conds = array();
# Depends on $wgMiserMode
@@ -78,9 +109,11 @@ class ImageListPager extends TablePager {
$tables[] = 'oldimage';
# Need to rewrite this one
- foreach ( $fields as &$field )
- if ( $field == 'count' )
+ foreach ( $fields as &$field ) {
+ if ( $field == 'count' ) {
$field = 'COUNT(oi_archive_name) as count';
+ }
+ }
unset( $field );
$dbr = wfGetDB( DB_SLAVE );
@@ -110,7 +143,7 @@ class ImageListPager extends TablePager {
if ( $this->mResult->numRows() ) {
$lb = new LinkBatch;
$this->mResult->seek( 0 );
- while ( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
if ( $row->img_user ) {
$lb->add( NS_USER, str_replace( ' ', '_', $row->img_user_text ) );
}
@@ -124,14 +157,18 @@ class ImageListPager extends TablePager {
function formatValue( $field, $value ) {
global $wgLang;
switch ( $field ) {
+ case 'thumb':
+ $file = wfLocalFile( $value );
+ $thumb = $file->transform( array( 'width' => 180 ) );
+ return $thumb->toHtml( array( 'desc-link' => true ) );
case 'img_timestamp':
return htmlspecialchars( $wgLang->timeanddate( $value, true ) );
case 'img_name':
static $imgfile = null;
if ( $imgfile === null ) $imgfile = wfMsg( 'imgfile' );
- $name = $this->mCurrentRow->img_name;
- $link = $this->getSkin()->linkKnown( Title::makeTitle( NS_FILE, $name ), $value );
+ $filePage = Title::makeTitle( NS_FILE, $value );
+ $link = $this->getSkin()->linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
$image = wfLocalFile( $value );
$url = $image->getURL();
$download = Xml::element('a', array( 'href' => $url ), $imgfile );
@@ -158,21 +195,26 @@ class ImageListPager extends TablePager {
function getForm() {
global $wgRequest, $wgScript, $wgMiserMode;
$search = $wgRequest->getText( 'ilsearch' );
-
- $s = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsg( 'listfiles' ) ) .
- Xml::tags( 'label', null, wfMsgHtml( 'table_pager_limit', $this->getLimitSelect() ) );
-
+ $inputForm = array();
+ $inputForm['table_pager_limit_label'] = $this->getLimitSelect();
if ( !$wgMiserMode ) {
- $s .= "<br />\n" .
- Xml::inputLabel( wfMsg( 'listfiles_search_for' ), 'ilsearch', 'mw-ilsearch', 20, $search );
+ $inputForm['listfiles_search_for'] = Html::input( 'ilsearch', $search, 'text', array(
+ 'size' => '40',
+ 'maxlength' => '255',
+ 'id' => 'mw-ilsearch',
+ ) );
}
- $s .= ' ' .
- Xml::submitButton( wfMsg( 'table_pager_limit_submit' ) ) ."\n" .
- $this->getHiddenFields( array( 'limit', 'ilsearch' ) ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' ) . "\n";
+ $inputForm['username'] = Html::input( 'user', $this->mUserName, 'text', array(
+ 'size' => '40',
+ 'maxlength' => '255',
+ 'id' => 'mw-listfiles-user',
+ ) );
+ $s = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
+ Xml::fieldset( wfMsg( 'listfiles' ) ) .
+ Xml::buildForm( $inputForm, 'table_pager_limit_submit' ) .
+ $this->getHiddenFields( array( 'limit', 'ilsearch', 'user' ) ) .
+ Html::closeElement( 'fieldset' ) .
+ Html::closeElement( 'form' ) . "\n";
return $s;
}
@@ -187,4 +229,25 @@ class ImageListPager extends TablePager {
function getSortHeaderClass() {
return 'listfiles_sort ' . parent::getSortHeaderClass();
}
+
+ function getPagingQueries() {
+ $queries = parent::getPagingQueries();
+ if ( !is_null( $this->mUserName ) ) {
+ # Append the username to the query string
+ foreach ( $queries as &$query ) {
+ $query['user'] = $this->mUserName;
+ }
+ }
+ return $queries;
+ }
+
+ function getDefaultQuery() {
+ $queries = parent::getDefaultQuery();
+ if ( !isset( $queries['user'] )
+ && !is_null( $this->mUserName ) )
+ {
+ $queries['user'] = $this->mUserName;
+ }
+ return $queries;
+ }
}
diff --git a/includes/specials/SpecialListgrouprights.php b/includes/specials/SpecialListgrouprights.php
index 83724a4f..910ffd08 100644
--- a/includes/specials/SpecialListgrouprights.php
+++ b/includes/specials/SpecialListgrouprights.php
@@ -1,4 +1,25 @@
<?php
+/**
+ * Implements Special:Listgrouprights
+ *
+ * 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
+ */
/**
* This special page lists all defined user groups and the associated rights.
@@ -24,10 +45,9 @@ class SpecialListGroupRights extends SpecialPage {
* Show the special page
*/
public function execute( $par ) {
- global $wgOut, $wgImplicitGroups, $wgMessageCache;
+ global $wgOut, $wgImplicitGroups;
global $wgGroupPermissions, $wgRevokePermissions, $wgAddGroups, $wgRemoveGroups;
global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
- $wgMessageCache->loadAllMessages();
$this->setHeaders();
$this->outputHeader();
@@ -40,8 +60,23 @@ class SpecialListGroupRights extends SpecialPage {
'</tr>'
);
- foreach( $wgGroupPermissions as $group => $permissions ) {
- $groupname = ( $group == '*' ) ? 'all' : $group; // Replace * with a more descriptive groupname
+ $allGroups = array_unique( array_merge(
+ array_keys( $wgGroupPermissions ),
+ array_keys( $wgRevokePermissions ),
+ array_keys( $wgAddGroups ),
+ array_keys( $wgRemoveGroups ),
+ array_keys( $wgGroupsAddToSelf ),
+ array_keys( $wgGroupsRemoveFromSelf )
+ ) );
+ asort( $allGroups );
+
+ foreach ( $allGroups as $group ) {
+ $permissions = isset( $wgGroupPermissions[$group] )
+ ? $wgGroupPermissions[$group]
+ : array();
+ $groupname = ( $group == '*' ) // Replace * with a more descriptive groupname
+ ? 'all'
+ : $group;
$msg = wfMsg( 'group-' . $groupname );
if ( wfEmptyMsg( 'group-' . $groupname, $msg ) || $msg == '' ) {
@@ -59,11 +94,11 @@ class SpecialListGroupRights extends SpecialPage {
if( $group == '*' ) {
// Do not make a link for the generic * group
- $grouppage = htmlspecialchars($groupnameLocalized);
+ $grouppage = htmlspecialchars( $groupnameLocalized );
} else {
$grouppage = $this->skin->link(
Title::newFromText( $grouppageLocalized ),
- htmlspecialchars($groupnameLocalized)
+ htmlspecialchars( $groupnameLocalized )
);
}
@@ -95,16 +130,15 @@ class SpecialListGroupRights extends SpecialPage {
$addgroupsSelf = isset( $wgGroupsAddToSelf[$group] ) ? $wgGroupsAddToSelf[$group] : array();
$removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] ) ? $wgGroupsRemoveFromSelf[$group] : array();
- $wgOut->addHTML(
- '<tr>
- <td>' .
- $grouppage . $grouplink .
- '</td>
- <td>' .
+ $id = $group == '*' ? false : Sanitizer::escapeId( $group );
+ $wgOut->addHTML( Html::rawElement( 'tr', array( 'id' => $id ),
+ "
+ <td>$grouppage$grouplink</td>
+ <td>" .
self::formatPermissions( $permissions, $revoke, $addgroups, $removegroups, $addgroupsSelf, $removegroupsSelf ) .
'</td>
- </tr>'
- );
+ '
+ ) );
}
$wgOut->addHTML(
Xml::closeElement( 'table' ) . "\n<br /><hr />\n"
diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php
index bf594070..315047da 100644
--- a/includes/specials/SpecialListredirects.php
+++ b/includes/specials/SpecialListredirects.php
@@ -1,11 +1,27 @@
<?php
/**
+ * Implements Special:Listredirects
+ *
+ * Copyright © 2006 Rob Church
+ *
+ * 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
- *
* @author Rob Church <robchur@gmail.com>
- * @copyright © 2006 Rob Church
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
/**
@@ -49,10 +65,10 @@ class ListredirectsPage extends QueryPage {
$targetLink = $skin->link( $target );
return "$rd_link $arr $targetLink";
} else {
- return "<s>$rd_link</s>";
+ return "<del>$rd_link</del>";
}
} else {
- return "<s>$rd_link</s>";
+ return "<del>$rd_link</del>";
}
}
}
diff --git a/includes/specials/SpecialListusers.php b/includes/specials/SpecialListusers.php
index bdb59980..abc0363a 100644
--- a/includes/specials/SpecialListusers.php
+++ b/includes/specials/SpecialListusers.php
@@ -1,27 +1,26 @@
<?php
-
-# Copyright (C) 2004 Brion Vibber, lcrocker, Tim Starling,
-# Domas Mituzas, Ashar Voultoiz, Jens Frank, Zhengzhu.
-#
-# © 2006 Rob Church <robchur@gmail.com>
-#
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
/**
+ * Implements Special:Listusers
+ *
+ * Copyright © 2004 Brion Vibber, lcrocker, Tim Starling,
+ * Domas Mituzas, Ashar Voultoiz, Jens Frank, Zhengzhu,
+ * 2006 Rob Church <robchur@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
* @ingroup SpecialPage
*/
@@ -120,16 +119,18 @@ class UsersPager extends AlphabeticPager {
function formatRow( $row ) {
global $wgLang;
+ if ($row->user_id == 0) #Bug 16487
+ return '';
+
$userPage = Title::makeTitle( NS_USER, $row->user_name );
$name = $this->getSkin()->link( $userPage, htmlspecialchars( $userPage->getText() ) );
- if( $row->numgroups > 1 || ( $this->requestedGroup && $row->numgroups == 1 ) ) {
+ $groups_list = self::getGroups( $row->user_id );
+ if( count( $groups_list ) > 0 ) {
$list = array();
- foreach( self::getGroups( $row->user_id ) as $group )
+ foreach( $groups_list as $group )
$list[] = self::buildGroupLink( $group );
$groups = $wgLang->commaList( $list );
- } elseif( $row->numgroups == 1 ) {
- $groups = self::buildGroupLink( $row->singlegroup );
} else {
$groups = '';
}
@@ -166,7 +167,7 @@ class UsersPager extends AlphabeticPager {
}
$this->mResult->rewind();
$batch = new LinkBatch;
- while ( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
}
$batch->execute();
@@ -175,13 +176,13 @@ class UsersPager extends AlphabeticPager {
}
function getPageHeader( ) {
- global $wgScript, $wgRequest;
+ global $wgScript;
$self = $this->getTitle();
# Form tag
$out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
Xml::fieldset( wfMsg( 'listusers' ) ) .
- Xml::hidden( 'title', $self->getPrefixedDbKey() );
+ Html::hidden( 'title', $self->getPrefixedDbKey() );
# Username field
$out .= Xml::label( wfMsg( 'listusersfrom' ), 'offset' ) . ' ' .
@@ -195,14 +196,14 @@ class UsersPager extends AlphabeticPager {
$out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
$out .= Xml::closeElement( 'select' ) . '<br />';
$out .= Xml::checkLabel( wfMsg('listusers-editsonly'), 'editsOnly', 'editsOnly', $this->editsOnly );
- $out .= '&nbsp;';
+ $out .= '&#160;';
$out .= Xml::checkLabel( wfMsg('listusers-creationsort'), 'creationSort', 'creationSort', $this->creationSort );
$out .= '<br />';
wfRunHooks( 'SpecialListusersHeaderForm', array( $this, &$out ) );
# Submit button and form bottom
- $out .= Xml::hidden( 'limit', $this->mLimit );
+ $out .= Html::hidden( 'limit', $this->mLimit );
$out .= Xml::submitButton( wfMsg( 'allpagessubmit' ) );
wfRunHooks( 'SpecialListusersHeader', array( $this, &$out ) );
$out .= Xml::closeElement( 'fieldset' ) .
@@ -269,13 +270,13 @@ class UsersPager extends AlphabeticPager {
* $par string (optional) A group to list users from
*/
function wfSpecialListusers( $par = null ) {
- global $wgRequest, $wgOut;
+ global $wgOut;
$up = new UsersPager($par);
# getBody() first to check, if empty
$usersbody = $up->getBody();
- $s = XML::openElement( 'div', array('class' => 'mw-spcontent') );
+ $s = Xml::openElement( 'div', array('class' => 'mw-spcontent') );
$s .= $up->getPageHeader();
if( $usersbody ) {
$s .= $up->getNavigationBar();
@@ -284,6 +285,6 @@ function wfSpecialListusers( $par = null ) {
} else {
$s .= '<p>' . wfMsgHTML('listusers-noresult') . '</p>';
};
- $s .= XML::closeElement( 'div' );
+ $s .= Xml::closeElement( 'div' );
$wgOut->addHTML( $s );
}
diff --git a/includes/specials/SpecialLockdb.php b/includes/specials/SpecialLockdb.php
index 8c701dd6..aad3cea4 100644
--- a/includes/specials/SpecialLockdb.php
+++ b/includes/specials/SpecialLockdb.php
@@ -1,97 +1,108 @@
<?php
/**
+ * Implements Special:Lockdb
+ *
+ * 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
*/
/**
- * Constructor
+ * A form to make the database readonly (eg for maintenance purposes).
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialLockdb() {
- global $wgUser, $wgOut, $wgRequest;
+class SpecialLockdb extends SpecialPage {
+ var $reason = '';
- if( !$wgUser->isAllowed( 'siteadmin' ) ) {
- $wgOut->permissionRequired( 'siteadmin' );
- return;
+ public function __construct() {
+ parent::__construct( 'Lockdb', 'siteadmin' );
}
- # If the lock file isn't writable, we can do sweet bugger all
- global $wgReadOnlyFile;
- if( !is_writable( dirname( $wgReadOnlyFile ) ) ) {
- DBLockForm::notWritable();
- return;
- }
+ public function execute( $par ) {
+ global $wgUser, $wgOut, $wgRequest;
- $action = $wgRequest->getVal( 'action' );
- $f = new DBLockForm();
+ $this->setHeaders();
- if ( 'success' == $action ) {
- $f->showSuccess();
- } else if ( 'submit' == $action && $wgRequest->wasPosted() &&
- $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- $f->doSubmit();
- } else {
- $f->showForm( '' );
- }
-}
+ if( !$wgUser->isAllowed( 'siteadmin' ) ) {
+ $wgOut->permissionRequired( 'siteadmin' );
+ return;
+ }
-/**
- * A form to make the database readonly (eg for maintenance purposes).
- * @ingroup SpecialPage
- */
-class DBLockForm {
- var $reason = '';
+ $this->outputHeader();
- function DBLockForm() {
- global $wgRequest;
- $this->reason = $wgRequest->getText( 'wpLockReason' );
+ # If the lock file isn't writable, we can do sweet bugger all
+ global $wgReadOnlyFile;
+ if( !is_writable( dirname( $wgReadOnlyFile ) ) ) {
+ self::notWritable();
+ return;
+ }
+
+ $action = $wgRequest->getVal( 'action' );
+ $this->reason = $wgRequest->getVal( 'wpLockReason', '' );
+
+ if ( $action == 'success' ) {
+ $this->showSuccess();
+ } else if ( $action == 'submit' && $wgRequest->wasPosted() &&
+ $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
+ $this->doSubmit();
+ } else {
+ $this->showForm();
+ }
}
- function showForm( $err ) {
+ private function showForm( $err = '' ) {
global $wgOut, $wgUser;
- $wgOut->setPagetitle( wfMsg( 'lockdb' ) );
$wgOut->addWikiMsg( 'lockdbtext' );
- if ( $err != "" ) {
+ if ( $err != '' ) {
$wgOut->setSubtitle( wfMsg( 'formerror' ) );
$wgOut->addHTML( '<p class="error">' . htmlspecialchars( $err ) . "</p>\n" );
}
- $lc = htmlspecialchars( wfMsg( 'lockconfirm' ) );
- $lb = htmlspecialchars( wfMsg( 'lockbtn' ) );
- $elr = htmlspecialchars( wfMsg( 'enterlockreason' ) );
- $titleObj = SpecialPage::getTitleFor( 'Lockdb' );
- $action = $titleObj->escapeLocalURL( 'action=submit' );
- $reason = htmlspecialchars( $this->reason );
- $token = htmlspecialchars( $wgUser->editToken() );
-
- $wgOut->addHTML( <<<HTML
-<form id="lockdb" method="post" action="{$action}">
-{$elr}:
-<textarea name="wpLockReason" rows="10" cols="60" wrap="virtual">{$reason}</textarea>
-<table border="0">
+
+ $wgOut->addHTML(
+ Html::openElement( 'form', array( 'id' => 'lockdb', 'method' => 'POST',
+ 'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) ). "\n" .
+ wfMsgHtml( 'enterlockreason' ) . ":\n" .
+ Html::textarea( 'wpLockReason', $this->reason, array( 'rows' => 4 ) ). "
+<table>
<tr>
- <td align="right">
- <input type="checkbox" name="wpLockConfirm" />
+ " . Html::openElement( 'td', array( 'style' => 'text-align:right' ) ) . "
+ " . Html::input( 'wpLockConfirm', null, 'checkbox' ) . "
</td>
- <td align="left">{$lc}</td>
+ " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) .
+ wfMsgHtml( 'lockconfirm' ) . "</td>
</tr>
<tr>
- <td>&nbsp;</td>
- <td align="left">
- <input type="submit" name="wpLock" value="{$lb}" />
+ <td>&#160;</td>
+ " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) . "
+ " . Html::input( 'wpLock', wfMsg( 'lockbtn' ), 'submit' ) . "
</td>
</tr>
-</table>
-<input type="hidden" name="wpEditToken" value="{$token}" />
-</form>
-HTML
-);
+</table>\n" .
+ Html::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n" .
+ Html::closeElement( 'form' )
+ );
}
- function doSubmit() {
- global $wgOut, $wgUser, $wgLang, $wgRequest;
+ private function doSubmit() {
+ global $wgOut, $wgUser, $wgContLang, $wgRequest;
global $wgReadOnlyFile;
if ( ! $wgRequest->getCheck( 'wpLockConfirm' ) ) {
@@ -109,14 +120,13 @@ HTML
}
fwrite( $fp, $this->reason );
fwrite( $fp, "\n<p>(by " . $wgUser->getName() . " at " .
- $wgLang->timeanddate( wfTimestampNow() ) . ")</p>\n" );
+ $wgContLang->timeanddate( wfTimestampNow() ) . ")</p>\n" );
fclose( $fp );
- $titleObj = SpecialPage::getTitleFor( 'Lockdb' );
- $wgOut->redirect( $titleObj->getFullURL( 'action=success' ) );
+ $wgOut->redirect( $this->getTitle()->getFullURL( 'action=success' ) );
}
- function showSuccess() {
+ private function showSuccess() {
global $wgOut;
$wgOut->setPagetitle( wfMsg( 'lockdb' ) );
diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php
index d1ccc8c4..a2af8de5 100644
--- a/includes/specials/SpecialLog.php
+++ b/includes/specials/SpecialLog.php
@@ -1,86 +1,127 @@
<?php
-# Copyright (C) 2008 Aaron Schulz
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
+ * Implements Special:Log
+ *
+ * Copyright © 2008 Aaron Schulz
+ *
+ * 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
*/
/**
- * constructor
+ * A special page that lists log entries
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialLog( $par = '' ) {
- global $wgRequest, $wgOut, $wgUser, $wgLogTypes;
-
- # Get parameters
- $parms = explode( '/', ($par = ( $par !== null ) ? $par : '' ) );
- $symsForAll = array( '*', 'all' );
- if ( $parms[0] != '' && ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) ) ) {
- $type = $par;
- $user = $wgRequest->getText( 'user' );
- } else if ( count( $parms ) == 2 ) {
- $type = $parms[0];
- $user = $parms[1];
- } else {
- $type = $wgRequest->getVal( 'type' );
- $user = ( $par != '' ) ? $par : $wgRequest->getText( 'user' );
+class SpecialLog extends SpecialPage {
+
+ public function __construct() {
+ parent::__construct( 'Log' );
}
- $title = $wgRequest->getText( 'page' );
- $pattern = $wgRequest->getBool( 'pattern' );
- $y = $wgRequest->getIntOrNull( 'year' );
- $m = $wgRequest->getIntOrNull( 'month' );
- $tagFilter = $wgRequest->getVal( 'tagfilter' );
- # Don't let the user get stuck with a certain date
- $skip = $wgRequest->getText( 'offset' ) || $wgRequest->getText( 'dir' ) == 'prev';
- if( $skip ) {
- $y = '';
- $m = '';
+
+ public function execute( $par ) {
+ global $wgRequest;
+
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $opts = new FormOptions;
+ $opts->add( 'type', '' );
+ $opts->add( 'user', '' );
+ $opts->add( 'page', '' );
+ $opts->add( 'pattern', false );
+ $opts->add( 'year', null, FormOptions::INTNULL );
+ $opts->add( 'month', null, FormOptions::INTNULL );
+ $opts->add( 'tagfilter', '' );
+ $opts->add( 'offset', '' );
+ $opts->add( 'dir', '' );
+ $opts->add( 'offender', '' );
+
+ // Set values
+ $opts->fetchValuesFromRequest( $wgRequest );
+ if ( $par ) {
+ $this->parseParams( $opts, (string)$par );
+ }
+
+ # Don't let the user get stuck with a certain date
+ if ( $opts->getValue( 'offset' ) || $opts->getValue( 'dir' ) == 'prev' ) {
+ $opts->setValue( 'year', '' );
+ $opts->setValue( 'month', '' );
+ }
+
+ # Handle type-specific inputs
+ $qc = array();
+ if ( $opts->getValue( 'type' ) == 'suppress' ) {
+ $offender = User::newFromName( $opts->getValue( 'offender' ), false );
+ if ( $offender && $offender->getId() > 0 ) {
+ $qc = array( 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() );
+ } elseif ( $offender && IP::isIPAddress( $offender->getName() ) ) {
+ $qc = array( 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() );
+ }
+ }
+
+ $this->show( $opts, $qc );
}
- # Handle type-specific inputs
- $qc = array();
- if( $type == 'suppress' ) {
- $offender = User::newFromName( $wgRequest->getVal('offender'), false );
- if( $offender && $offender->getId() > 0 ) {
- $qc = array( 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() );
- } else if( $offender && IP::isIPAddress( $offender->getName() ) ) {
- $qc = array( 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() );
+
+ private function parseParams( FormOptions $opts, $par ) {
+ global $wgLogTypes;
+
+ # Get parameters
+ $parms = explode( '/', ($par = ( $par !== null ) ? $par : '' ) );
+ $symsForAll = array( '*', 'all' );
+ if ( $parms[0] != '' && ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) ) ) {
+ $opts->setValue( 'type', $par );
+ } elseif ( count( $parms ) == 2 ) {
+ $opts->setValue( 'type', $parms[0] );
+ $opts->setValue( 'user', $parms[1] );
+ } elseif ( $par != '' ) {
+ $opts->setValue( 'user', $par );
}
}
- # Create a LogPager item to get the results and a LogEventsList item to format them...
- $loglist = new LogEventsList( $wgUser->getSkin(), $wgOut, 0 );
- $pager = new LogPager( $loglist, $type, $user, $title, $pattern, $qc, $y, $m, $tagFilter );
- # Set title and add header
- $loglist->showHeader( $pager->getType() );
- # Show form options
- $loglist->showOptions( $pager->getType(), $pager->getUser(), $pager->getPage(), $pager->getPattern(),
- $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $tagFilter );
- # Insert list
- $logBody = $pager->getBody();
- if( $logBody ) {
- $wgOut->addHTML(
- $pager->getNavigationBar() .
- $loglist->beginLogEventsList() .
- $logBody .
- $loglist->endLogEventsList() .
- $pager->getNavigationBar()
- );
- } else {
- $wgOut->addWikiMsg( 'logempty' );
+
+ private function show( FormOptions $opts, array $extraConds ) {
+ global $wgOut, $wgUser;
+
+ # Create a LogPager item to get the results and a LogEventsList item to format them...
+ $loglist = new LogEventsList( $wgUser->getSkin(), $wgOut, 0 );
+ $pager = new LogPager( $loglist, $opts->getValue( 'type' ), $opts->getValue( 'user' ),
+ $opts->getValue( 'page' ), $opts->getValue( 'pattern' ), $extraConds, $opts->getValue( 'year' ),
+ $opts->getValue( 'month' ), $opts->getValue( 'tagfilter' ) );
+
+ # Set title and add header
+ $loglist->showHeader( $pager->getType() );
+
+ # Show form options
+ $loglist->showOptions( $pager->getType(), $pager->getUser(), $pager->getPage(), $pager->getPattern(),
+ $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $opts->getValue( 'tagfilter' ) );
+
+ # Insert list
+ $logBody = $pager->getBody();
+ if ( $logBody ) {
+ $wgOut->addHTML(
+ $pager->getNavigationBar() .
+ $loglist->beginLogEventsList() .
+ $logBody .
+ $loglist->endLogEventsList() .
+ $pager->getNavigationBar()
+ );
+ } else {
+ $wgOut->addWikiMsg( 'logempty' );
+ }
}
}
diff --git a/includes/specials/SpecialLonelypages.php b/includes/specials/SpecialLonelypages.php
index 90da25fd..0788037f 100644
--- a/includes/specials/SpecialLonelypages.php
+++ b/includes/specials/SpecialLonelypages.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:Lonelypaages
+ *
+ * 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
*/
@@ -7,6 +24,7 @@
/**
* A special page looking for articles with no article linking to them,
* thus being lonely.
+ *
* @ingroup SpecialPage
*/
class LonelyPagesPage extends PageQueryPage {
diff --git a/includes/specials/SpecialLongpages.php b/includes/specials/SpecialLongpages.php
index be16a029..cd0f3090 100644
--- a/includes/specials/SpecialLongpages.php
+++ b/includes/specials/SpecialLongpages.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:Longpages
+ *
+ * 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
*/
diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php
index dafe003e..79683a35 100644
--- a/includes/specials/SpecialMIMEsearch.php
+++ b/includes/specials/SpecialMIMEsearch.php
@@ -1,13 +1,25 @@
<?php
/**
- * A special page to search for files by MIME type as defined in the
- * img_major_mime and img_minor_mime fields in the image table
+ * Implements Special:MIMESearch
+ *
+ * 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
- *
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
/**
@@ -18,7 +30,7 @@
class MIMEsearchPage extends QueryPage {
var $major, $minor;
- function MIMEsearchPage( $major, $minor ) {
+ function __construct( $major, $minor ) {
$this->major = $major;
$this->minor = $minor;
}
@@ -95,7 +107,7 @@ function wfSpecialMIMEsearch( $par = null ) {
$wgOut->addHTML(
Xml::openElement( 'form', array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => SpecialPage::getTitleFor( 'MIMEsearch' )->getLocalUrl() ) ) .
Xml::openElement( 'fieldset' ) .
- Xml::hidden( 'title', SpecialPage::getTitleFor( 'MIMEsearch' )->getPrefixedText() ) .
+ Html::hidden( 'title', SpecialPage::getTitleFor( 'MIMEsearch' )->getPrefixedText() ) .
Xml::element( 'legend', null, wfMsg( 'mimesearch' ) ) .
Xml::inputLabel( wfMsg( 'mimetype' ), 'mime', 'mime', 20, $mime ) . ' ' .
Xml::submitButton( wfMsg( 'ilsubmit' ) ) .
diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php
index 1b4ef30c..43b4ef6a 100644
--- a/includes/specials/SpecialMergeHistory.php
+++ b/includes/specials/SpecialMergeHistory.php
@@ -1,34 +1,42 @@
<?php
/**
- * Special page allowing users with the appropriate permissions to
- * merge article histories, with some restrictions
+ * Implements Special:MergeHistory
+ *
+ * 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
*/
/**
- * Constructor
- */
-function wfSpecialMergehistory( $par ) {
- global $wgRequest;
-
- $form = new MergehistoryForm( $wgRequest, $par );
- $form->execute();
-}
-
-/**
- * The HTML form for Special:MergeHistory, which allows users with the appropriate
- * permissions to view and restore deleted content.
+ * Special page allowing users with the appropriate permissions to
+ * merge article histories, with some restrictions
+ *
* @ingroup SpecialPage
*/
-class MergehistoryForm {
+class SpecialMergeHistory extends SpecialPage {
var $mAction, $mTarget, $mDest, $mTimestamp, $mTargetID, $mDestID, $mComment;
var $mTargetObj, $mDestObj;
- function MergehistoryForm( $request, $par = "" ) {
- global $wgUser;
+ public function __construct() {
+ parent::__construct( 'MergeHistory', 'mergehistory' );
+ }
+ private function loadRequestParams( $request ) {
+ global $wgUser;
$this->mAction = $request->getVal( 'action' );
$this->mTarget = $request->getVal( 'target' );
$this->mDest = $request->getVal( 'dest' );
@@ -51,7 +59,6 @@ class MergehistoryForm {
$this->mTargetObj = null;
$this->mDestObj = null;
}
-
$this->preCacheMessages();
}
@@ -62,14 +69,27 @@ class MergehistoryForm {
function preCacheMessages() {
// Precache various messages
if( !isset( $this->message ) ) {
- $this->message['last'] = wfMsgExt( 'last', array( 'escape') );
+ $this->message['last'] = wfMsgExt( 'last', array( 'escape' ) );
}
}
- function execute() {
- global $wgOut;
+ function execute( $par ) {
+ global $wgOut, $wgRequest, $wgUser;
+
+ if ( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
+
+ if( !$this->userCanExecute( $wgUser ) ) {
+ $this->displayRestrictionError();
+ return;
+ }
+
+ $this->loadRequestParams( $wgRequest );
- $wgOut->setPagetitle( wfMsgHtml( "mergehistory" ) );
+ $this->setHeaders();
+ $this->outputHeader();
if( $this->mTargetID && $this->mDestID && $this->mAction=="submit" && $this->mMerge ) {
return $this->merge();
@@ -122,10 +142,9 @@ class MergehistoryForm {
'<fieldset>' .
Xml::element( 'legend', array(),
wfMsg( 'mergehistory-box' ) ) .
- Xml::hidden( 'title',
- SpecialPage::getTitleFor( 'Mergehistory' )->getPrefixedDbKey() ) .
- Xml::hidden( 'submitted', '1' ) .
- Xml::hidden( 'mergepoint', $this->mTimestamp ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+ Html::hidden( 'submitted', '1' ) .
+ Html::hidden( 'mergepoint', $this->mTimestamp ) .
Xml::openElement( 'table' ) .
"<tr>
<td>".Xml::label( wfMsg( 'mergehistory-from' ), 'target' )."</td>
@@ -142,7 +161,7 @@ class MergehistoryForm {
}
private function showHistory() {
- global $wgLang, $wgUser, $wgOut;
+ global $wgUser, $wgOut;
$this->sk = $wgUser->getSkin();
@@ -154,7 +173,7 @@ class MergehistoryForm {
$revisions = new MergeHistoryPager( $this, array(), $this->mTargetObj, $this->mDestObj );
$haveRevisions = $revisions && $revisions->getNumRows() > 0;
- $titleObj = SpecialPage::getTitleFor( "Mergehistory" );
+ $titleObj = $this->getTitle();
$action = $titleObj->getLocalURL( array( 'action' => 'submit' ) );
# Start the form here
$top = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'merge' ) );
@@ -177,7 +196,7 @@ class MergehistoryForm {
"</td>
</tr>
<tr>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-submit'>" .
Xml::submitButton( wfMsg( 'mergehistory-submit' ), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
"</td>
@@ -206,11 +225,11 @@ class MergehistoryForm {
# When we submit, go by page ID to avoid some nasty but unlikely collisions.
# Such would happen if a page was renamed after the form loaded, but before submit
- $misc = Xml::hidden( 'targetID', $this->mTargetObj->getArticleID() );
- $misc .= Xml::hidden( 'destID', $this->mDestObj->getArticleID() );
- $misc .= Xml::hidden( 'target', $this->mTarget );
- $misc .= Xml::hidden( 'dest', $this->mDest );
- $misc .= Xml::hidden( 'wpEditToken', $wgUser->editToken() );
+ $misc = Html::hidden( 'targetID', $this->mTargetObj->getArticleID() );
+ $misc .= Html::hidden( 'destID', $this->mDestObj->getArticleID() );
+ $misc .= Html::hidden( 'target', $this->mTarget );
+ $misc .= Html::hidden( 'dest', $this->mDest );
+ $misc .= Html::hidden( 'wpEditToken', $wgUser->editToken() );
$misc .= Xml::closeElement( 'form' );
$wgOut->addHTML( $misc );
@@ -419,7 +438,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
$batch = new LinkBatch();
# Give some pointers to make (last) links
$this->mForm->prevId = array();
- while( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_USER, $row->rev_user_text ) );
$batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->rev_user_text ) );
@@ -440,7 +459,6 @@ class MergeHistoryPager extends ReverseChronologicalPager {
}
function formatRow( $row ) {
- $block = new Block;
return $this->mForm->formatRevisionRow( $row );
}
diff --git a/includes/specials/SpecialMostcategories.php b/includes/specials/SpecialMostcategories.php
index 1ba05626..124f0bd5 100644
--- a/includes/specials/SpecialMostcategories.php
+++ b/includes/specials/SpecialMostcategories.php
@@ -1,15 +1,32 @@
<?php
/**
+ * Implements Special:Mostcategories
+ *
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason
+ *
+ * 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
- *
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
/**
- * implements Special:Mostcategories
+ * A special page that list pages that have highest category count
+ *
* @ingroup SpecialPage
*/
class MostcategoriesPage extends QueryPage {
diff --git a/includes/specials/SpecialMostimages.php b/includes/specials/SpecialMostimages.php
index 5cc100ba..411a281b 100644
--- a/includes/specials/SpecialMostimages.php
+++ b/includes/specials/SpecialMostimages.php
@@ -1,15 +1,32 @@
<?php
/**
+ * Implements Special:Mostimages
+ *
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason
+ *
+ * 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
- *
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
/**
- * implements Special:Mostimages
+ * A special page page that list most used images
+ *
* @ingroup SpecialPage
*/
class MostimagesPage extends ImageQueryPage {
@@ -36,7 +53,7 @@ class MostimagesPage extends ImageQueryPage {
function getCellHtml( $row ) {
global $wgLang;
- return wfMsgExt( 'nlinks', array( 'parsemag', 'escape' ),
+ return wfMsgExt( 'nimagelinks', array( 'parsemag', 'escape' ),
$wgLang->formatNum( $row->value ) ) . '<br />';
}
diff --git a/includes/specials/SpecialMostlinked.php b/includes/specials/SpecialMostlinked.php
index f112ae17..c731588a 100644
--- a/includes/specials/SpecialMostlinked.php
+++ b/includes/specials/SpecialMostlinked.php
@@ -1,20 +1,34 @@
<?php
/**
+ * Implements Special:Mostlinked
+ *
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason, 2006 Rob Church
+ *
+ * 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
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @author Rob Church <robchur@gmail.com>
*/
/**
* A special page to show pages ordered by the number of pages linking to them.
- * Implements Special:Mostlinked
*
* @ingroup SpecialPage
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @author Rob Church <robchur@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @copyright © 2006 Rob Church
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class MostlinkedPage extends QueryPage {
@@ -59,8 +73,9 @@ class MostlinkedPage extends QueryPage {
function preprocessResults( $db, $res ) {
if( $db->numRows( $res ) > 0 ) {
$linkBatch = new LinkBatch();
- while( $row = $db->fetchObject( $res ) )
+ foreach ( $res as $row ) {
$linkBatch->add( $row->namespace, $row->title );
+ }
$db->dataSeek( $res, 0 );
$linkBatch->execute();
}
diff --git a/includes/specials/SpecialMostlinkedcategories.php b/includes/specials/SpecialMostlinkedcategories.php
index 20a35c97..e1fc1d95 100644
--- a/includes/specials/SpecialMostlinkedcategories.php
+++ b/includes/specials/SpecialMostlinkedcategories.php
@@ -1,17 +1,33 @@
<?php
/**
+ * Implements Special:Mostlinkedcategories
+ *
+ * Copyright © 2005, Ævar Arnfjörð Bjarmason
+ *
+ * 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
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
*/
/**
* A querypage to show categories ordered in descending order by the pages in them
*
* @ingroup SpecialPage
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class MostlinkedCategoriesPage extends QueryPage {
@@ -42,8 +58,9 @@ class MostlinkedCategoriesPage extends QueryPage {
*/
function preprocessResults( $db, $res ) {
$batch = new LinkBatch;
- while ( $row = $db->fetchObject( $res ) )
+ foreach ( $res as $row ) {
$batch->add( $row->namespace, $row->title );
+ }
$batch->execute();
// Back to start for display
diff --git a/includes/specials/SpecialMostlinkedtemplates.php b/includes/specials/SpecialMostlinkedtemplates.php
index 71a6b539..822d6bc9 100644
--- a/includes/specials/SpecialMostlinkedtemplates.php
+++ b/includes/specials/SpecialMostlinkedtemplates.php
@@ -1,7 +1,25 @@
<?php
/**
+ * Implements Special:Mostlinkedtemplates
+ *
+ * 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
+ * @author Rob Church <robchur@gmail.com>
*/
/**
@@ -9,7 +27,6 @@
* transclusion links, i.e. "most used" templates
*
* @ingroup SpecialPage
- * @author Rob Church <robchur@gmail.com>
*/
class SpecialMostlinkedtemplates extends QueryPage {
@@ -75,7 +92,7 @@ class SpecialMostlinkedtemplates extends QueryPage {
*/
public function preprocessResults( $db, $res ) {
$batch = new LinkBatch();
- while( $row = $db->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$batch->add( $row->namespace, $row->title );
}
$batch->execute();
@@ -110,8 +127,8 @@ class SpecialMostlinkedtemplates extends QueryPage {
private function makeWlhLink( $title, $skin, $result ) {
global $wgLang;
$wlh = SpecialPage::getTitleFor( 'Whatlinkshere' );
- $label = wfMsgExt( 'nlinks', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->value ) );
+ $label = wfMsgExt( 'ntransclusions', array( 'parsemag', 'escape' ),
+ $wgLang->formatNum( $result->value ) );
return $skin->link( $wlh, $label, array(), array( 'target' => $title->getPrefixedText() ) );
}
}
diff --git a/includes/specials/SpecialMostrevisions.php b/includes/specials/SpecialMostrevisions.php
index 414e8d97..f9bafabc 100644
--- a/includes/specials/SpecialMostrevisions.php
+++ b/includes/specials/SpecialMostrevisions.php
@@ -1,15 +1,32 @@
<?php
/**
- * A special page to show pages in the
+ * Implements Special:Mostrevisions
*
- * @ingroup SpecialPage
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason
+ *
+ * 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
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
/**
+ * A special page to show pages with highest revision count
+ *
* @ingroup SpecialPage
*/
class MostrevisionsPage extends QueryPage {
diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php
index 02197b19..2f156c65 100644
--- a/includes/specials/SpecialMovepage.php
+++ b/includes/specials/SpecialMovepage.php
@@ -1,93 +1,104 @@
<?php
/**
+ * Implements Special:Movepage
+ *
+ * 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
*/
/**
- * Constructor
+ * A special page that allows users to change page titles
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialMovepage( $par = null ) {
- global $wgUser, $wgOut, $wgRequest, $action;
+class MovePageForm extends UnlistedSpecialPage {
+ var $oldTitle, $newTitle; # Objects
+ var $reason; # Text input
+ var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared; # Checks
- # Check for database lock
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
+ private $watch = false;
+
+ public function __construct() {
+ parent::__construct( 'Movepage' );
}
- $target = isset( $par ) ? $par : $wgRequest->getVal( 'target' );
+ public function execute( $par ) {
+ global $wgUser, $wgOut, $wgRequest;
- // Yes, the use of getVal() and getText() is wanted, see bug 20365
- $oldTitleText = $wgRequest->getVal( 'wpOldTitle', $target );
- $newTitleText = $wgRequest->getText( 'wpNewTitle' );
+ # Check for database lock
+ if ( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
- $oldTitle = Title::newFromText( $oldTitleText );
- $newTitle = Title::newFromText( $newTitleText );
+ $this->setHeaders();
+ $this->outputHeader();
- if( is_null( $oldTitle ) ) {
- $wgOut->showErrorPage( 'notargettitle', 'notargettext' );
- return;
- }
- if( !$oldTitle->exists() ) {
- $wgOut->showErrorPage( 'nopagetitle', 'nopagetext' );
- return;
- }
+ $target = !is_null( $par ) ? $par : $wgRequest->getVal( 'target' );
- # Check rights
- $permErrors = $oldTitle->getUserPermissionsErrors( 'move', $wgUser );
- if( !empty( $permErrors ) ) {
- $wgOut->showPermissionsErrorPage( $permErrors );
- return;
- }
+ // Yes, the use of getVal() and getText() is wanted, see bug 20365
+ $oldTitleText = $wgRequest->getVal( 'wpOldTitle', $target );
+ $newTitleText = $wgRequest->getText( 'wpNewTitle' );
- $form = new MovePageForm( $oldTitle, $newTitle );
+ $this->oldTitle = Title::newFromText( $oldTitleText );
+ $this->newTitle = Title::newFromText( $newTitleText );
- if ( 'submit' == $action && $wgRequest->wasPosted()
- && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- $form->doSubmit();
- } else {
- $form->showForm( '' );
- }
-}
+ if( is_null( $this->oldTitle ) ) {
+ $wgOut->showErrorPage( 'notargettitle', 'notargettext' );
+ return;
+ }
+ if( !$this->oldTitle->exists() ) {
+ $wgOut->showErrorPage( 'nopagetitle', 'nopagetext' );
+ return;
+ }
-/**
- * HTML form for Special:Movepage
- * @ingroup SpecialPage
- */
-class MovePageForm {
- var $oldTitle, $newTitle; # Objects
- var $reason; # Text input
- var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared; # Checks
+ # Check rights
+ $permErrors = $this->oldTitle->getUserPermissionsErrors( 'move', $wgUser );
+ if( !empty( $permErrors ) ) {
+ $wgOut->showPermissionsErrorPage( $permErrors );
+ return;
+ }
- private $watch = false;
+ $def = !$wgRequest->wasPosted();
- function __construct( $oldTitle, $newTitle ) {
- global $wgRequest, $wgUser;
- $target = isset($par) ? $par : $wgRequest->getVal( 'target' );
- $this->oldTitle = $oldTitle;
- $this->newTitle = $newTitle;
$this->reason = $wgRequest->getText( 'wpReason' );
- if ( $wgRequest->wasPosted() ) {
- $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', false );
- $this->fixRedirects = $wgRequest->getBool( 'wpFixRedirects', false );
- $this->leaveRedirect = $wgRequest->getBool( 'wpLeaveRedirect', false );
- } else {
- $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', true );
- $this->fixRedirects = $wgRequest->getBool( 'wpFixRedirects', true );
- $this->leaveRedirect = $wgRequest->getBool( 'wpLeaveRedirect', true );
- }
+ $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', $def );
+ $this->fixRedirects = $wgRequest->getBool( 'wpFixRedirects', $def );
+ $this->leaveRedirect = $wgRequest->getBool( 'wpLeaveRedirect', $def );
$this->moveSubpages = $wgRequest->getBool( 'wpMovesubpages', false );
$this->deleteAndMove = $wgRequest->getBool( 'wpDeleteAndMove' ) && $wgRequest->getBool( 'wpConfirm' );
$this->moveOverShared = $wgRequest->getBool( 'wpMoveOverSharedFile', false );
$this->watch = $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn();
+
+ if ( 'submit' == $wgRequest->getVal( 'action' ) && $wgRequest->wasPosted()
+ && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
+ $this->doSubmit();
+ } else {
+ $this->showForm( '' );
+ }
}
/**
* Show the form
- * @param mixed $err Error message. May either be a string message name or
- * array message name and parameters, like the second argument to
- * OutputPage::wrapWikiMsg().
+ *
+ * @param $err Mixed: error message. May either be a string message name or
+ * array message name and parameters, like the second argument to
+ * OutputPage::wrapWikiMsg().
*/
function showForm( $err ) {
global $wgOut, $wgUser, $wgContLang, $wgFixDoubleRedirects;
@@ -134,7 +145,8 @@ class MovePageForm {
if ($this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
$wgOut->wrapWikiMsg( "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>", 'moveuserpage-warning' );
}
- $wgOut->addWikiMsg( 'movepagetext' );
+ $wgOut->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
+ 'movepagetext-noredirectfixer' );
$movepagebtn = wfMsg( 'movepagebtn' );
$submitVar = 'wpMove';
$confirm = false;
@@ -145,14 +157,14 @@ class MovePageForm {
$submitVar = 'wpMoveOverSharedFile';
$err = '';
}
-
+
$oldTalk = $this->oldTitle->getTalkPage();
$considerTalk = ( !$this->oldTitle->isTalkPage() && $oldTalk->exists() );
$dbr = wfGetDB( DB_SLAVE );
if ( $wgFixDoubleRedirects ) {
- $hasRedirects = $dbr->selectField( 'redirect', '1',
- array(
+ $hasRedirects = $dbr->selectField( 'redirect', '1',
+ array(
'rd_namespace' => $this->oldTitle->getNamespace(),
'rd_title' => $this->oldTitle->getDBkey(),
) , __METHOD__ );
@@ -164,7 +176,6 @@ class MovePageForm {
$wgOut->addWikiMsg( 'movepagetalktext' );
}
- $titleObj = SpecialPage::getTitleFor( 'Movepage' );
$token = htmlspecialchars( $wgUser->editToken() );
if ( !empty($err) ) {
@@ -174,7 +185,7 @@ class MovePageForm {
$errMsg = "<p><strong class=\"error\">$hookErr</strong></p>\n";
$wgOut->addHTML( $errMsg );
} else {
- $wgOut->wrapWikiMsg( '<p><strong class="error">$1</strong></p>', $err );
+ $wgOut->wrapWikiMsg( "<p><strong class=\"error\">\n$1\n</strong></p>", $err );
}
}
@@ -195,7 +206,7 @@ class MovePageForm {
}
$wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $titleObj->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
+ Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'move-page-legend' ) ) .
Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-movepage-table' ) ) .
@@ -213,7 +224,7 @@ class MovePageForm {
"</td>
<td class='mw-input'>" .
Xml::input( 'wpNewTitle', 40, $wgContLang->recodeForEdit( $newTitle->getPrefixedText() ), array( 'type' => 'text', 'id' => 'wpNewTitle' ) ) .
- Xml::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
+ Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
"</td>
</tr>
<tr>
@@ -243,7 +254,7 @@ class MovePageForm {
<tr>
<td></td>
<td class='mw-input' >" .
- Xml::checkLabel( wfMsg( 'move-leave-redirect' ), 'wpLeaveRedirect',
+ Xml::checkLabel( wfMsg( 'move-leave-redirect' ), 'wpLeaveRedirect',
'wpLeaveRedirect', $this->leaveRedirect ) .
"</td>
</tr>"
@@ -255,7 +266,7 @@ class MovePageForm {
<tr>
<td></td>
<td class='mw-input' >" .
- Xml::checkLabel( wfMsg( 'fix-double-redirects' ), 'wpFixRedirects',
+ Xml::checkLabel( wfMsg( 'fix-double-redirects' ), 'wpFixRedirects',
'wpFixRedirects', $this->fixRedirects ) .
"</td>
</tr>"
@@ -277,7 +288,7 @@ class MovePageForm {
# move and we aren't moving the talk page.
$this->moveSubpages && ($this->oldTitle->hasSubpages() || $this->moveTalk),
array( 'id' => 'wpMovesubpages' )
- ) . '&nbsp;' .
+ ) . '&#160;' .
Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
wfMsgExt(
( $this->oldTitle->hasSubpages()
@@ -294,7 +305,7 @@ class MovePageForm {
);
}
- $watchChecked = $wgUser->isLoggedIn() && ($this->watch || $wgUser->getBoolOption( 'watchmoves' )
+ $watchChecked = $wgUser->isLoggedIn() && ($this->watch || $wgUser->getBoolOption( 'watchmoves' )
|| $this->oldTitle->userIsWatching());
# Don't allow watching if user is not logged in
if( $wgUser->isLoggedIn() ) {
@@ -307,16 +318,16 @@ class MovePageForm {
</tr>");
}
- $wgOut->addHTML( "
+ $wgOut->addHTML( "
{$confirm}
<tr>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-submit'>" .
Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
"</td>
</tr>" .
Xml::closeElement( 'table' ) .
- Xml::hidden( 'wpEditToken', $token ) .
+ Html::hidden( 'wpEditToken', $token ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' ) .
"\n"
@@ -328,7 +339,7 @@ class MovePageForm {
}
function doSubmit() {
- global $wgOut, $wgUser, $wgRequest, $wgMaximumMovedPages, $wgLang;
+ global $wgOut, $wgUser, $wgMaximumMovedPages, $wgLang;
global $wgFixDoubleRedirects;
if ( $wgUser->pingLimiter( 'move' ) ) {
@@ -346,7 +357,7 @@ class MovePageForm {
# Disallow deletions of big articles
$bigHistory = $article->isBigDeletion();
if( $bigHistory && !$nt->userCan( 'bigdelete' ) ) {
- global $wgLang, $wgDeleteRevisionsLimit;
+ global $wgDeleteRevisionsLimit;
$this->showForm( array('delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
return;
}
@@ -368,16 +379,16 @@ class MovePageForm {
}
# Show a warning if the target file exists on a shared repo
- if ( $nt->getNamespace() == NS_FILE
+ if ( $nt->getNamespace() == NS_FILE
&& !( $this->moveOverShared && $wgUser->isAllowed( 'reupload-shared' ) )
- && !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
+ && !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
&& wfFindFile( $nt ) )
{
$this->showForm( array('file-exists-sharedrepo') );
return;
-
+
}
-
+
if ( $wgUser->isAllowed( 'suppressredirect' ) ) {
$createRedirect = $this->leaveRedirect;
} else {
@@ -433,7 +444,7 @@ class MovePageForm {
# would mean that you couldn't move them back in one operation, which
# is bad. FIXME: A specific error message should be given in this
# case.
-
+
// FIXME: Use Title::moveSubpages() here
$dbr = wfGetDB( DB_MASTER );
if( $this->moveSubpages && (
@@ -547,8 +558,8 @@ class MovePageForm {
$wgUser->removeWatch( $ot );
$wgUser->removeWatch( $nt );
}
-
- # Re-clear the file redirect cache, which may have been polluted by
+
+ # Re-clear the file redirect cache, which may have been polluted by
# parsing in messages above. See CR r56745.
# FIXME: needs a more robust solution inside FileRepo.
if( $ot->getNamespace() == NS_FILE ) {
diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php
index a39b56ee..cecd7dfd 100644
--- a/includes/specials/SpecialNewimages.php
+++ b/includes/specials/SpecialNewimages.php
@@ -1,10 +1,29 @@
<?php
/**
+ * Implements Special:Newimages
+ *
+ * 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
- * FIXME: this code is crap, should use Pager and Database::select().
*/
+/**
+ * @todo FIXME: this code is crap, should use Pager and Database::select().
+ */
function wfSpecialNewimages( $par, $specialPage ) {
global $wgUser, $wgOut, $wgLang, $wgRequest, $wgMiserMode;
@@ -49,16 +68,14 @@ function wfSpecialNewimages( $par, $specialPage ) {
} else {
$ts = false;
}
- $dbr->freeResult( $res );
- $sql = '';
# If we were clever, we'd use this to cache.
$latestTimestamp = wfTimestamp( TS_MW, $ts );
# Hardcode this for now.
$limit = 48;
-
- if ( $parval = intval( $par ) ) {
+ $parval = intval( $par );
+ if ( $parval ) {
if ( $parval <= $limit && $parval > 0 ) {
$limit = $parval;
}
@@ -75,14 +92,16 @@ function wfSpecialNewimages( $par, $specialPage ) {
}
$invertSort = false;
- if( $until = $wgRequest->getVal( 'until' ) ) {
+ $until = $wgRequest->getVal( 'until' );
+ if( $until ) {
$where[] = "img_timestamp < '" . $dbr->timestamp( $until ) . "'";
}
- if( $from = $wgRequest->getVal( 'from' ) ) {
+ $from = $wgRequest->getVal( 'from' );
+ if( $from ) {
$where[] = "img_timestamp >= '" . $dbr->timestamp( $from ) . "'";
$invertSort = true;
}
- $sql='SELECT img_size, img_name, img_user, img_user_text,'.
+ $sql = 'SELECT img_size, img_name, img_user, img_user_text,'.
"img_description,img_timestamp FROM $image";
if( $hidebotsql ) {
@@ -100,14 +119,13 @@ function wfSpecialNewimages( $par, $specialPage ) {
* We have to flip things around to get the last N after a certain date
*/
$images = array();
- while ( $s = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $s ) {
if( $invertSort ) {
array_unshift( $images, $s );
} else {
array_push( $images, $s );
}
}
- $dbr->freeResult( $res );
$gallery = new ImageGallery();
$firstTimestamp = null;
@@ -214,9 +232,9 @@ function wfSpecialNewimages( $par, $specialPage ) {
}
$nextLink = wfMsgExt( 'pager-older-n', $opts, $wgLang->formatNum( $limit ) );
- if( $shownImages > $limit && $lastTimestamp ) {
+ if( $invertSort || ( $shownImages > $limit && $lastTimestamp ) ) {
$query = array_merge(
- array( 'until' => $lastTimestamp ),
+ array( 'until' => ( $lastTimestamp ? $lastTimestamp : "" ) ),
$botpar,
$searchpar
);
diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php
index 903ddab0..3235436a 100644
--- a/includes/specials/SpecialNewpages.php
+++ b/includes/specials/SpecialNewpages.php
@@ -1,10 +1,32 @@
<?php
+/**
+ * Implements Special:Newpages
+ *
+ * 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
+ */
/**
- * implements Special:Newpages
+ * A special page that list newly created pages
+ *
* @ingroup SpecialPage
*/
-class SpecialNewpages extends SpecialPage {
+class SpecialNewpages extends IncludableSpecialPage {
// Stored objects
protected $opts, $skin;
@@ -14,7 +36,6 @@ class SpecialNewpages extends SpecialPage {
public function __construct() {
parent::__construct( 'Newpages' );
- $this->includable( true );
}
protected function setup( $par ) {
@@ -85,11 +106,11 @@ class SpecialNewpages extends SpecialPage {
/**
* Show a form for filtering namespace and username
*
- * @param string $par
- * @return string
+ * @param $par String
+ * @return String
*/
public function execute( $par ) {
- global $wgLang, $wgOut;
+ global $wgOut;
$this->setHeaders();
$this->outputHeader();
@@ -136,6 +157,7 @@ class SpecialNewpages extends SpecialPage {
);
// Disable some if needed
+ # FIXME: throws E_NOTICEs if not set; and doesn't obey hooks etc
if ( $wgGroupPermissions['*']['createpage'] !== true )
unset($filters['hideliu']);
@@ -174,7 +196,7 @@ class SpecialNewpages extends SpecialPage {
// Store query values in hidden fields so that form submission doesn't lose them
$hidden = array();
foreach ( $this->opts->getUnconsumedValues() as $key => $value ) {
- $hidden[] = Xml::hidden( $key, $value );
+ $hidden[] = Html::hidden( $key, $value );
}
$hidden = implode( "\n", $hidden );
@@ -183,7 +205,7 @@ class SpecialNewpages extends SpecialPage {
list( $tagFilterLabel, $tagFilterSelector ) = $tagFilter;
$form = Xml::openElement( 'form', array( 'action' => $wgScript ) ) .
- Xml::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
Xml::fieldset( wfMsg( 'newpages' ) ) .
Xml::openElement( 'table', array( 'id' => 'mw-newpages-table' ) ) .
"<tr>
@@ -239,9 +261,8 @@ class SpecialNewpages extends SpecialPage {
/**
* Format a row, providing the timestamp, links to the page/history, size, user links, and a comment
*
- * @param $skin Skin to use
* @param $result Result row
- * @return string
+ * @return String
*/
public function formatRow( $result ) {
global $wgLang, $wgContLang;
@@ -251,7 +272,9 @@ class SpecialNewpages extends SpecialPage {
$dm = $wgContLang->getDirMark();
$title = Title::makeTitleSafe( $result->rc_namespace, $result->rc_title );
- $time = htmlspecialchars( $wgLang->timeAndDate( $result->rc_timestamp, true ) );
+ $time = Html::element( 'span', array( 'class' => 'mw-newpages-time' ),
+ $wgLang->timeAndDate( $result->rc_timestamp, true )
+ );
$query = array( 'redirect' => 'no' );
@@ -261,38 +284,53 @@ class SpecialNewpages extends SpecialPage {
$plink = $this->skin->linkKnown(
$title,
null,
- array(),
- $query
+ array( 'class' => 'mw-newpages-pagename' ),
+ $query,
+ array( 'known' ) // Set explicitly to avoid the default of 'known','noclasses'. This breaks the colouration for stubs
);
- $hist = $this->skin->linkKnown(
+ $histLink = $this->skin->linkKnown(
$title,
wfMsgHtml( 'hist' ),
array(),
array( 'action' => 'history' )
);
- $length = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->length ) );
+ $hist = Html::rawElement( 'span', array( 'class' => 'mw-newpages-history' ), wfMsg( 'parentheses', $histLink ) );
+
+ $length = Html::rawElement( 'span', array( 'class' => 'mw-newpages-length' ),
+ '[' . wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ), $wgLang->formatNum( $result->length ) ) .
+ ']'
+ );
$ulink = $this->skin->userLink( $result->rc_user, $result->rc_user_text ) . ' ' .
$this->skin->userToolLinks( $result->rc_user, $result->rc_user_text );
$comment = $this->skin->commentBlock( $result->rc_comment );
- if ( $this->patrollable( $result ) )
+ if ( $this->patrollable( $result ) ) {
$classes[] = 'not-patrolled';
+ }
- # Tags, if any.
- list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
- $classes = array_merge( $classes, $newClasses );
+ # Add a class for zero byte pages
+ if ( $result->length == 0 ) {
+ $classes[] = 'mw-newpages-zero-byte-page';
+ }
+
+ # Tags, if any. check for including due to bug 23293
+ if ( !$this->including() ) {
+ list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
+ $classes = array_merge( $classes, $newClasses );
+ } else {
+ $tagDisplay = '';
+ }
$css = count($classes) ? ' class="'.implode( " ", $classes).'"' : '';
- return "<li{$css}>{$time} {$dm}{$plink} ({$hist}) {$dm}[{$length}] {$dm}{$ulink} {$comment} {$tagDisplay}</li>\n";
+ return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay}</li>\n";
}
/**
* Should a specific result row provide "patrollable" links?
*
* @param $result Result row
- * @return bool
+ * @return Boolean
*/
protected function patrollable( $result ) {
global $wgUser;
@@ -301,19 +339,18 @@ class SpecialNewpages extends SpecialPage {
/**
* Output a subscription feed listing recent edits to this page.
- * @param string $type
+ *
+ * @param $type String
*/
protected function feed( $type ) {
- global $wgFeed, $wgFeedClasses, $wgFeedLimit;
+ global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgOut;
if ( !$wgFeed ) {
- global $wgOut;
$wgOut->addWikiMsg( 'feed-unavailable' );
return;
}
if( !isset( $wgFeedClasses[$type] ) ) {
- global $wgOut;
$wgOut->addWikiMsg( 'feed-invalid' );
return;
}
@@ -329,7 +366,7 @@ class SpecialNewpages extends SpecialPage {
$feed->outHeader();
if( $pager->getNumRows() > 0 ) {
- while( $row = $pager->mResult->fetchObject() ) {
+ foreach ( $pager->mResult as $row ) {
$feed->outItem( $this->feedItem( $row ) );
}
}
@@ -337,10 +374,10 @@ class SpecialNewpages extends SpecialPage {
}
protected function feedTitle() {
- global $wgContLanguageCode, $wgSitename;
+ global $wgLanguageCode, $wgSitename;
$page = SpecialPage::getPage( 'Newpages' );
$desc = $page->getDescription();
- return "$wgSitename - $desc [$wgContLanguageCode]";
+ return "$wgSitename - $desc [$wgLanguageCode]";
}
protected function feedItem( $row ) {
@@ -434,6 +471,9 @@ class NewPagesPager extends ReverseChronologicalPager {
if ( $this->opts->getValue( 'hideredirs' ) ) {
$conds['page_is_redirect'] = 0;
}
+
+ // Allow changes to the New Pages query
+ wfRunHooks('SpecialNewpagesConditions', array(&$this, $this->opts, &$conds));
$info = array(
'tables' => array( 'recentchanges', 'page' ),
@@ -471,7 +511,7 @@ class NewPagesPager extends ReverseChronologicalPager {
function getStartBody() {
# Do a batch existence check on pages
$linkBatch = new LinkBatch();
- while( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$linkBatch->add( NS_USER, $row->rc_user_text );
$linkBatch->add( NS_USER_TALK, $row->rc_user_text );
$linkBatch->add( $row->rc_namespace, $row->rc_title );
diff --git a/includes/specials/SpecialPopularpages.php b/includes/specials/SpecialPopularpages.php
index 88b90bc3..375cefdf 100644
--- a/includes/specials/SpecialPopularpages.php
+++ b/includes/specials/SpecialPopularpages.php
@@ -1,11 +1,29 @@
<?php
/**
+ * Implements Special:PopularPages
+ *
+ * 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
*/
/**
- * implements Special:Popularpages
+ * A special page that list most viewed pages
+ *
* @ingroup SpecialPage
*/
class PopularPagesPage extends QueryPage {
diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php
index 4c8bbb09..e63aeee6 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -1,5 +1,31 @@
<?php
-
+/**
+ * Implements Special:Preferences
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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
+ */
+
+/**
+ * A special page that allows users to change their preferences
+ *
+ * @ingroup SpecialPage
+ */
class SpecialPreferences extends SpecialPage {
function __construct() {
parent::__construct( 'Preferences' );
@@ -25,18 +51,19 @@ class SpecialPreferences extends SpecialPage {
$this->showResetForm();
return;
}
-
- $wgOut->addScriptFile( 'prefs.js' );
+
+ $wgOut->addModules( 'mediawiki.legacy.prefs' );
+ $wgOut->addModules( 'mediawiki.special.preferences' );
if ( $wgRequest->getCheck( 'success' ) ) {
$wgOut->wrapWikiMsg(
- '<div class="successbox"><strong>$1</strong></div><div id="mw-pref-clear"></div>',
+ "<div class=\"successbox\"><strong>\n$1\n</strong></div><div id=\"mw-pref-clear\"></div>",
'savedprefs'
);
}
if ( $wgRequest->getCheck( 'eauth' ) ) {
- $wgOut->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1</div>",
+ $wgOut->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
'eauthentsent', $wgUser->getName() );
}
diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php
index 8b5f0c93..09e7734c 100644
--- a/includes/specials/SpecialPrefixindex.php
+++ b/includes/specials/SpecialPrefixindex.php
@@ -1,7 +1,29 @@
<?php
+/**
+ * Implements Special:Prefixindex
+ *
+ * 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
+ */
/**
- * implements Special:Prefixindex
+ * Implements Special:Prefixindex
+ *
* @ingroup SpecialPage
*/
class SpecialPrefixindex extends SpecialAllpages {
@@ -22,7 +44,7 @@ class SpecialPrefixindex extends SpecialAllpages {
$this->outputHeader();
# GET values
- $from = $wgRequest->getVal( 'from' );
+ $from = $wgRequest->getVal( 'from', '' );
$prefix = $wgRequest->getVal( 'prefix', '' );
$namespace = $wgRequest->getInt( 'namespace' );
$namespaces = $wgContLang->getNamespaces();
@@ -32,12 +54,17 @@ class SpecialPrefixindex extends SpecialAllpages {
: wfMsg( 'prefixindex' )
);
+ $showme = '';
if( isset( $par ) ){
- $this->showPrefixChunk( $namespace, $par, $from );
- } elseif( isset( $prefix ) ){
- $this->showPrefixChunk( $namespace, $prefix, $from );
- } elseif( isset( $from ) ){
- $this->showPrefixChunk( $namespace, $from, $from );
+ $showme = $par;
+ } elseif( $prefix != '' ){
+ $showme = $prefix;
+ } elseif( $from != '' ){
+ // For back-compat with Special:Allpages
+ $showme = $from;
+ }
+ if ($showme != '' || $namespace) {
+ $this->showPrefixChunk( $namespace, $showme, $from );
} else {
$wgOut->addHTML( $this->namespacePrefixForm( $namespace, null ) );
}
@@ -45,8 +72,8 @@ class SpecialPrefixindex extends SpecialAllpages {
/**
* HTML for the top form
- * @param integer $namespace A namespace constant (default NS_MAIN).
- * @param string $from dbKey we are starting listing at.
+ * @param $namespace Integer: a namespace constant (default NS_MAIN).
+ * @param $from String: dbKey we are starting listing at.
*/
function namespacePrefixForm( $namespace = NS_MAIN, $from = '' ) {
global $wgScript;
@@ -54,7 +81,7 @@ class SpecialPrefixindex extends SpecialAllpages {
$out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
- $out .= Xml::hidden( 'title', $t->getPrefixedText() );
+ $out .= Html::hidden( 'title', $t->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
$out .= Xml::element( 'legend', null, wfMsg( 'allpages' ) );
$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
@@ -83,8 +110,9 @@ class SpecialPrefixindex extends SpecialAllpages {
}
/**
- * @param integer $namespace (Default NS_MAIN)
- * @param string $from list all pages from this name (default FALSE)
+ * @param $namespace Integer, default NS_MAIN
+ * @param $prefix String
+ * @param $from String: list all pages from this name (default FALSE)
*/
function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null ) {
global $wgOut, $wgUser, $wgContLang, $wgLang;
@@ -105,7 +133,7 @@ class SpecialPrefixindex extends SpecialAllpages {
$namespace = NS_MAIN;
} else {
list( $namespace, $prefixKey, $prefix ) = $prefixList;
- list( /* $fromNs */, $fromKey, $from ) = $fromList;
+ list( /* $fromNS */, $fromKey, ) = $fromList;
### FIXME: should complain if $fromNs != $namespace
diff --git a/includes/specials/SpecialProtectedpages.php b/includes/specials/SpecialProtectedpages.php
index 8229770c..c676aa00 100644
--- a/includes/specials/SpecialProtectedpages.php
+++ b/includes/specials/SpecialProtectedpages.php
@@ -1,24 +1,45 @@
<?php
/**
+ * Implements Special:Protectedpages
+ *
+ * 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
*/
/**
- * @todo document
+ * A special page that lists protected pages
+ *
* @ingroup SpecialPage
*/
-class ProtectedPagesForm {
+class SpecialProtectedpages extends SpecialPage {
protected $IdLevel = 'level';
protected $IdType = 'type';
- public function showList( $msg = '' ) {
+ public function __construct() {
+ parent::__construct( 'Protectedpages' );
+ }
+
+ public function execute( $par ) {
global $wgOut, $wgRequest;
- if( $msg != "" ) {
- $wgOut->setSubtitle( $msg );
- }
+ $this->setHeaders();
+ $this->outputHeader();
// Purge expired entries on one in every 10 queries
if( !mt_rand( 0, 10 ) ) {
@@ -77,7 +98,6 @@ class ProtectedPagesForm {
$description_items[] = wfMsg( 'protect-summary-cascade' );
}
- $expiry_description = '';
$stxt = '';
if( $row->pr_expiry != 'infinity' && strlen($row->pr_expiry) ) {
@@ -123,14 +143,14 @@ class ProtectedPagesForm {
}
/**
- * @param $namespace int
- * @param $type string
- * @param $level string
- * @param $minsize int
- * @param $indefOnly bool
- * @param $cascadeOnly bool
- * @return string Input form
- * @private
+ * @param $namespace Integer
+ * @param $type String: restriction type
+ * @param $level String: restriction level
+ * @param $sizetype String: "min" or "max"
+ * @param $size Integer
+ * @param $indefOnly Boolean: only indefinie protection
+ * @param $cascadeOnly Boolean: only cascading protection
+ * @return String: input form
*/
protected function showOptions( $namespace, $type='edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
global $wgScript;
@@ -138,17 +158,17 @@ class ProtectedPagesForm {
return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', array(), wfMsg( 'protectedpages' ) ) .
- Xml::hidden( 'title', $title->getPrefixedDBkey() ) . "\n" .
- $this->getNamespaceMenu( $namespace ) . "&nbsp;\n" .
- $this->getTypeMenu( $type ) . "&nbsp;\n" .
- $this->getLevelMenu( $level ) . "&nbsp;\n" .
+ Html::hidden( 'title', $title->getPrefixedDBkey() ) . "\n" .
+ $this->getNamespaceMenu( $namespace ) . "&#160;\n" .
+ $this->getTypeMenu( $type ) . "&#160;\n" .
+ $this->getLevelMenu( $level ) . "&#160;\n" .
"<br /><span style='white-space: nowrap'>" .
- $this->getExpiryCheck( $indefOnly ) . "&nbsp;\n" .
- $this->getCascadeCheck( $cascadeOnly ) . "&nbsp;\n" .
+ $this->getExpiryCheck( $indefOnly ) . "&#160;\n" .
+ $this->getCascadeCheck( $cascadeOnly ) . "&#160;\n" .
"</span><br /><span style='white-space: nowrap'>" .
- $this->getSizeLimit( $sizetype, $size ) . "&nbsp;\n" .
+ $this->getSizeLimit( $sizetype, $size ) . "&#160;\n" .
"</span>" .
- "&nbsp;" . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
+ "&#160;" . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' );
}
@@ -157,12 +177,12 @@ class ProtectedPagesForm {
* Prepare the namespace filter drop-down; standard namespace
* selector, sans the MediaWiki namespace
*
- * @param mixed $namespace Pre-select namespace
- * @return string
+ * @param $namespace Mixed: pre-select namespace
+ * @return String
*/
protected function getNamespaceMenu( $namespace = null ) {
return "<span style='white-space: nowrap'>" .
- Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&nbsp;'
+ Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&#160;'
. Xml::namespaceSelector( $namespace, '' ) . "</span>";
}
@@ -190,11 +210,11 @@ class ProtectedPagesForm {
return
Xml::radioLabel( wfMsg('minimum-size'), 'sizetype', 'min', 'wpmin', !$max ) .
- '&nbsp;' .
+ '&#160;' .
Xml::radioLabel( wfMsg('maximum-size'), 'sizetype', 'max', 'wpmax', $max ) .
- '&nbsp;' .
+ '&#160;' .
Xml::input( 'size', 9, $size, array( 'id' => 'wpsize' ) ) .
- '&nbsp;' .
+ '&#160;' .
Xml::label( wfMsg('pagesize'), 'wpsize' );
}
@@ -204,13 +224,11 @@ class ProtectedPagesForm {
* @return string Formatted HTML
*/
protected function getTypeMenu( $pr_type ) {
- global $wgRestrictionTypes;
-
$m = array(); // Temporary array
$options = array();
// First pass to load the log names
- foreach( $wgRestrictionTypes as $type ) {
+ foreach( Title::getFilteredRestrictionTypes( true ) as $type ) {
$text = wfMsg("restriction-$type");
$m[$text] = $type;
}
@@ -222,7 +240,7 @@ class ProtectedPagesForm {
}
return "<span style='white-space: nowrap'>" .
- Xml::label( wfMsg('restriction-type') , $this->IdType ) . '&nbsp;' .
+ Xml::label( wfMsg('restriction-type') , $this->IdType ) . '&#160;' .
Xml::tags( 'select',
array( 'id' => $this->IdType, 'name' => $this->IdType ),
implode( "\n", $options ) ) . "</span>";
@@ -288,7 +306,7 @@ class ProtectedPagesPager extends AlphabeticPager {
function getStartBody() {
# Do a link batch query
$lb = new LinkBatch;
- while( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$lb->add( $row->page_namespace, $row->page_title );
}
$lb->execute();
@@ -334,11 +352,3 @@ class ProtectedPagesPager extends AlphabeticPager {
return 'pr_id';
}
}
-
-/**
- * Constructor
- */
-function wfSpecialProtectedpages() {
- $ppForm = new ProtectedPagesForm();
- $ppForm->showList();
-}
diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php
index d65b3f79..5b18d87f 100644
--- a/includes/specials/SpecialProtectedtitles.php
+++ b/includes/specials/SpecialProtectedtitles.php
@@ -1,24 +1,45 @@
<?php
/**
+ * Implements Special:Protectedtitles
+ *
+ * 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
*/
/**
- * @todo document
+ * A special page that list protected titles from creation
+ *
* @ingroup SpecialPage
*/
-class ProtectedTitlesForm {
+class SpecialProtectedtitles extends SpecialPage {
protected $IdLevel = 'level';
protected $IdType = 'type';
- function showList( $msg = '' ) {
+ public function __construct() {
+ parent::__construct( 'Protectedtitles' );
+ }
+
+ function execute( $par ) {
global $wgOut, $wgRequest;
- if ( $msg != "" ) {
- $wgOut->setSubtitle( $msg );
- }
+ $this->setHeaders();
+ $this->outputHeader();
// Purge expired entries on one in every 10 queries
if ( !mt_rand( 0, 10 ) ) {
@@ -33,7 +54,7 @@ class ProtectedTitlesForm {
$pager = new ProtectedTitlesPager( $this, array(), $type, $level, $NS, $sizetype, $size );
- $wgOut->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size ) );
+ $wgOut->addHTML( $this->showOptions( $NS, $type, $level ) );
if ( $pager->getNumRows() ) {
$s = $pager->getNavigationBar();
@@ -51,7 +72,7 @@ class ProtectedTitlesForm {
* Callback function to output a restriction
*/
function formatRow( $row ) {
- global $wgUser, $wgLang, $wgContLang;
+ global $wgUser, $wgLang;
wfProfileIn( __METHOD__ );
@@ -69,7 +90,7 @@ class ProtectedTitlesForm {
$description_items[] = $protType;
- $expiry_description = ''; $stxt = '';
+ $stxt = '';
if ( $row->pt_expiry != 'infinity' && strlen($row->pt_expiry) ) {
$expiry = Block::decodeExpiry( $row->pt_expiry );
@@ -85,13 +106,12 @@ class ProtectedTitlesForm {
}
/**
- * @param $namespace int
+ * @param $namespace Integer:
* @param $type string
* @param $level string
- * @param $minsize int
* @private
*/
- function showOptions( $namespace, $type='edit', $level, $sizetype, $size ) {
+ function showOptions( $namespace, $type='edit', $level ) {
global $wgScript;
$action = htmlspecialchars( $wgScript );
$title = SpecialPage::getTitleFor( 'Protectedtitles' );
@@ -99,10 +119,10 @@ class ProtectedTitlesForm {
return "<form action=\"$action\" method=\"get\">\n" .
'<fieldset>' .
Xml::element( 'legend', array(), wfMsg( 'protectedtitles' ) ) .
- Xml::hidden( 'title', $special ) . "&nbsp;\n" .
- $this->getNamespaceMenu( $namespace ) . "&nbsp;\n" .
- $this->getLevelMenu( $level ) . "&nbsp;\n" .
- "&nbsp;" . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
+ Html::hidden( 'title', $special ) . "&#160;\n" .
+ $this->getNamespaceMenu( $namespace ) . "&#160;\n" .
+ $this->getLevelMenu( $level ) . "&#160;\n" .
+ "&#160;" . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
"</fieldset></form>";
}
@@ -110,12 +130,12 @@ class ProtectedTitlesForm {
* Prepare the namespace filter drop-down; standard namespace
* selector, sans the MediaWiki namespace
*
- * @param mixed $namespace Pre-select namespace
+ * @param $namespace Mixed: pre-select namespace
* @return string
*/
function getNamespaceMenu( $namespace = null ) {
return Xml::label( wfMsg( 'namespace' ), 'namespace' )
- . '&nbsp;'
+ . '&#160;'
. Xml::namespaceSelector( $namespace, '' );
}
@@ -147,7 +167,7 @@ class ProtectedTitlesForm {
}
return
- Xml::label( wfMsg('restriction-level') , $this->IdLevel ) . '&nbsp;' .
+ Xml::label( wfMsg('restriction-level') , $this->IdLevel ) . '&#160;' .
Xml::tags( 'select',
array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
implode( "\n", $options ) );
@@ -158,7 +178,7 @@ class ProtectedTitlesForm {
* @todo document
* @ingroup Pager
*/
-class ProtectedtitlesPager extends AlphabeticPager {
+class ProtectedTitlesPager extends AlphabeticPager {
public $mForm, $mConds;
function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype='', $size=0 ) {
@@ -176,7 +196,7 @@ class ProtectedtitlesPager extends AlphabeticPager {
$this->mResult->seek( 0 );
$lb = new LinkBatch;
- while ( $row = $this->mResult->fetchObject() ) {
+ foreach ( $this->mResult as $row ) {
$lb->add( $row->pt_namespace, $row->pt_title );
}
@@ -208,12 +228,3 @@ class ProtectedtitlesPager extends AlphabeticPager {
}
}
-/**
- * Constructor
- */
-function wfSpecialProtectedtitles() {
-
- $ppForm = new ProtectedTitlesForm();
-
- $ppForm->showList();
-}
diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php
index fd3f17f2..6299f384 100644
--- a/includes/specials/SpecialRandompage.php
+++ b/includes/specials/SpecialRandompage.php
@@ -1,11 +1,31 @@
<?php
+/**
+ * Implements Special:Randompage
+ *
+ * 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
+ * @author Rob Church <robchur@gmail.com>, Ilmari Karonen
+ */
/**
* Special page to direct the user to a random page
*
* @ingroup SpecialPage
- * @author Rob Church <robchur@gmail.com>, Ilmari Karonen
- * @license GNU General Public Licence 2.0 or later
*/
class RandomPage extends SpecialPage {
private $namespaces; // namespaces to select pages from
@@ -33,7 +53,7 @@ class RandomPage extends SpecialPage {
}
public function execute( $par ) {
- global $wgOut, $wgContLang;
+ global $wgOut, $wgContLang, $wgRequest;
if ($par) {
$this->setNamespace( $wgContLang->getNsIndex( $par ) );
@@ -48,7 +68,9 @@ class RandomPage extends SpecialPage {
return;
}
- $query = $this->isRedirect() ? 'redirect=no' : '';
+ $redirectParam = $this->isRedirect() ? array( 'redirect' => 'no' ) : array();
+ $query = array_merge( $wgRequest->getValues(), $redirectParam );
+ unset( $query['title'] );
$wgOut->redirect( $title->getFullUrl( $query ) );
}
diff --git a/includes/specials/SpecialRandomredirect.php b/includes/specials/SpecialRandomredirect.php
index 28cb2aae..88c81b31 100644
--- a/includes/specials/SpecialRandomredirect.php
+++ b/includes/specials/SpecialRandomredirect.php
@@ -1,11 +1,31 @@
<?php
+/**
+ * Implements Special:Randomredirect
+ *
+ * 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
+ * @author Rob Church <robchur@gmail.com>, Ilmari Karonen
+ */
/**
* Special page to direct the user to a random redirect page (minus the second redirect)
*
* @ingroup SpecialPage
- * @author Rob Church <robchur@gmail.com>, Ilmari Karonen
- * @license GNU General Public Licence 2.0 or later
*/
class SpecialRandomredirect extends RandomPage {
function __construct(){
diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php
index 283eeaf4..c012beca 100644
--- a/includes/specials/SpecialRecentchanges.php
+++ b/includes/specials/SpecialRecentchanges.php
@@ -1,15 +1,36 @@
<?php
-
/**
* Implements Special:Recentchanges
+ *
+ * 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
*/
-class SpecialRecentChanges extends SpecialPage {
+
+/**
+ * A special page that lists last changes made to the wiki
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialRecentChanges extends IncludableSpecialPage {
var $rcOptions, $rcSubpage;
- public function __construct() {
- parent::__construct( 'Recentchanges' );
- $this->includable( true );
+ public function __construct( $name = 'Recentchanges' ) {
+ parent::__construct( $name );
}
/**
@@ -91,7 +112,7 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Main execution point
*
- * @param $subpage string
+ * @param $subpage String
*/
public function execute( $subpage ) {
global $wgRequest, $wgOut;
@@ -142,7 +163,7 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Return an array with a ChangesFeed object and ChannelFeed object
*
- * @return array
+ * @return Array
*/
public function getFeedObject( $feedFormat ){
$changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
@@ -186,7 +207,7 @@ class SpecialRecentChanges extends SpecialPage {
* update the timestamp
*
* @param $feedFormat String
- * @return string or false
+ * @return String or false
*/
public function checkLastModified( $feedFormat ) {
global $wgUseRCPatrol, $wgOut;
@@ -275,7 +296,7 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Process the query
*
- * @param $conds array
+ * @param $conds Array
* @param $opts FormOptions
* @return database result or false (for Recentchangeslinked only)
*/
@@ -290,6 +311,7 @@ class SpecialRecentChanges extends SpecialPage {
$dbr = wfGetDB( DB_SLAVE );
$limit = $opts['limit'];
$namespace = $opts['namespace'];
+ $select = '*';
$invert = $opts['invert'];
// JOIN on watchlist for users
@@ -302,14 +324,17 @@ class SpecialRecentChanges extends SpecialPage {
$tables[] = 'page';
$join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
}
- // Tag stuff.
- $fields = array();
- // Fields are * in this case, so let the function modify an empty array to keep it happy.
- ChangeTags::modifyDisplayQuery(
- $tables, $fields, $conds, $join_conds, $query_options, $opts['tagfilter']
- );
+ if ( !$this->including() ) {
+ // Tag stuff.
+ // Doesn't work when transcluding. See bug 23293
+ $fields = array();
+ // Fields are * in this case, so let the function modify an empty array to keep it happy.
+ ChangeTags::modifyDisplayQuery(
+ $tables, $fields, $conds, $join_conds, $query_options, $opts['tagfilter']
+ );
+ }
- if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options ) ) )
+ if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) )
return false;
// Don't use the new_namespace_time timestamp index if:
@@ -317,8 +342,8 @@ class SpecialRecentChanges extends SpecialPage {
// (b) We want all pages NOT in a certain namespaces (inverted)
// (c) There is a tag to filter on (use tag index instead)
// (d) UNION + sort/limit is not an option for the DBMS
- if( is_null($namespace)
- || $invert
+ if( is_null( $namespace )
+ || ( $invert && !is_null( $namespace ) )
|| $opts['tagfilter'] != ''
|| !$dbr->unionSupportsOrderAndLimit() )
{
@@ -329,7 +354,7 @@ class SpecialRecentChanges extends SpecialPage {
// We have a new_namespace_time index! UNION over new=(0,1) and sort result set!
} else {
// New pages
- $sqlNew = $dbr->selectSQLText( $tables, '*',
+ $sqlNew = $dbr->selectSQLText( $tables, $select,
array( 'rc_new' => 1 ) + $conds,
__METHOD__,
array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit,
@@ -354,7 +379,7 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Send output to $wgOut, only called if not used feeds
*
- * @param $rows array of database rows
+ * @param $rows Array of database rows
* @param $opts FormOptions
*/
public function webOutput( $rows, $opts ) {
@@ -437,7 +462,8 @@ class SpecialRecentChanges extends SpecialPage {
$defaults = $opts->getAllValues();
$nondefaults = $opts->getChangedValues();
- $opts->consumeValues( array( 'namespace', 'invert', 'tagfilter' ) );
+ $opts->consumeValues( array( 'namespace', 'invert', 'tagfilter',
+ 'categories', 'categories_any' ) );
$panel = array();
$panel[] = $this->optionsPanel( $defaults, $nondefaults );
@@ -467,11 +493,11 @@ class SpecialRecentChanges extends SpecialPage {
$unconsumed = $opts->getUnconsumedValues();
foreach( $unconsumed as $key => $value ) {
- $out .= Xml::hidden( $key, $value );
+ $out .= Html::hidden( $key, $value );
}
$t = $this->getTitle();
- $out .= Xml::hidden( 'title', $t->getPrefixedText() );
+ $out .= Html::hidden( 'title', $t->getPrefixedText() );
$form = Xml::tags( 'form', array( 'action' => $wgScript ), $out );
$panel[] = $form;
$panelString = implode( "\n", $panel );
@@ -480,8 +506,6 @@ class SpecialRecentChanges extends SpecialPage {
Xml::fieldset( wfMsg( 'recentchanges-legend' ), $panelString, array( 'class' => 'rcoptions' ) )
);
- $wgOut->addHTML( ChangesList::flagLegend() );
-
$this->setBottomText( $wgOut, $opts );
}
@@ -489,7 +513,7 @@ class SpecialRecentChanges extends SpecialPage {
* Get options to be displayed in a form
*
* @param $opts FormOptions
- * @return array
+ * @return Array
*/
function getExtraOptions( $opts ){
$extraOpts = array();
@@ -531,7 +555,7 @@ class SpecialRecentChanges extends SpecialPage {
* Creates the choose namespace selection
*
* @param $opts FormOptions
- * @return string
+ * @return String
*/
protected function namespaceFilterForm( FormOptions $opts ) {
$nsSelect = Xml::namespaceSelector( $opts['namespace'], '' );
@@ -544,7 +568,7 @@ class SpecialRecentChanges extends SpecialPage {
* Create a input to filter changes by categories
*
* @param $opts FormOptions
- * @return array
+ * @return Array
*/
protected function categoryFilterForm( FormOptions $opts ) {
list( $label, $input ) = Xml::inputLabelSep( wfMsg('rc_categories'),
@@ -559,13 +583,13 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Filter $rows by categories set in $opts
*
- * @param $rows array of database rows
+ * @param $rows Array of database rows
* @param $opts FormOptions
*/
function filterByCategories( &$rows, FormOptions $opts ) {
- $categories = array_map( 'trim', explode( "|" , $opts['categories'] ) );
+ $categories = array_map( 'trim', explode( '|' , $opts['categories'] ) );
- if( empty($categories) ) {
+ if( !count( $categories ) ) {
return;
}
@@ -573,32 +597,34 @@ class SpecialRecentChanges extends SpecialPage {
$cats = array();
foreach( $categories as $cat ) {
$cat = trim( $cat );
- if( $cat == "" ) continue;
+ if( $cat == '' ) continue;
$cats[] = $cat;
}
# Filter articles
$articles = array();
$a2r = array();
+ $rowsarr = array();
foreach( $rows AS $k => $r ) {
$nt = Title::makeTitle( $r->rc_namespace, $r->rc_title );
$id = $nt->getArticleID();
if( $id == 0 ) continue; # Page might have been deleted...
- if( !in_array($id, $articles) ) {
+ if( !in_array( $id, $articles ) ) {
$articles[] = $id;
}
- if( !isset($a2r[$id]) ) {
+ if( !isset( $a2r[$id] ) ) {
$a2r[$id] = array();
}
$a2r[$id][] = $k;
+ $rowsarr[$k] = $r;
}
# Shortcut?
- if( !count($articles) || !count($cats) )
+ if( !count( $articles ) || !count( $cats ) )
return ;
# Look up
- $c = new Categoryfinder ;
+ $c = new Categoryfinder;
$c->seed( $articles, $cats, $opts['categories_any'] ? "OR" : "AND" ) ;
$match = $c->run();
@@ -607,7 +633,7 @@ class SpecialRecentChanges extends SpecialPage {
foreach( $match AS $id ) {
foreach( $a2r[$id] AS $rev ) {
$k = $rev;
- $newrows[$k] = $rows[$k];
+ $newrows[$k] = $rowsarr[$k];
}
}
$rows = $newrows;
@@ -615,9 +641,11 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Makes change an option link which carries all the other options
- * @param $title see Title
- * @param $override
- * @param $options
+ *
+ * @param $title Title
+ * @param $override Array: options to override
+ * @param $options Array: current options
+ * @param $active Boolean: whether to show the link in bold
*/
function makeOptionsLink( $title, $override, $options, $active = false ) {
global $wgUser;
@@ -633,8 +661,9 @@ class SpecialRecentChanges extends SpecialPage {
/**
* Creates the options panel.
- * @param $defaults array
- * @param $nondefaults array
+ *
+ * @param $defaults Array
+ * @param $nondefaults Array
*/
function optionsPanel( $defaults, $nondefaults ) {
global $wgLang, $wgUser, $wgRCLinkLimits, $wgRCLinkDays;
diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php
index 3b549843..db0f554d 100644
--- a/includes/specials/SpecialRecentchangeslinked.php
+++ b/includes/specials/SpecialRecentchangeslinked.php
@@ -1,15 +1,36 @@
<?php
+/**
+ * Implements Special:Recentchangeslinked
+ *
+ * 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
+ */
/**
* This is to display changes made to all articles linked in an article.
+ *
* @ingroup SpecialPage
*/
-class SpecialRecentchangeslinked extends SpecialRecentchanges {
+class SpecialRecentchangeslinked extends SpecialRecentChanges {
var $rclTargetTitle;
function __construct(){
- SpecialPage::SpecialPage( 'Recentchangeslinked' );
- $this->includable( true );
+ parent::__construct( 'Recentchangeslinked' );
}
public function getDefaultOptions() {
@@ -52,7 +73,7 @@ class SpecialRecentchangeslinked extends SpecialRecentchanges {
}
$title = Title::newFromURL( $target );
if( !$title || $title->getInterwiki() != '' ){
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">\n$1</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
+ $wgOut->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
return false;
}
@@ -78,7 +99,8 @@ class SpecialRecentchangeslinked extends SpecialRecentchanges {
$query_options = array();
// left join with watchlist table to highlight watched rows
- if( $uid = $wgUser->getId() ) {
+ $uid = $wgUser->getId();
+ if( $uid ) {
$tables[] = 'watchlist';
$select[] = 'wl_user';
$join_conds['watchlist'] = array( 'LEFT JOIN', "wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace" );
@@ -88,12 +110,13 @@ class SpecialRecentchangeslinked extends SpecialRecentchanges {
$join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
$select[] = 'page_latest';
}
+ if ( !$this->including() ) { // bug 23293
+ ChangeTags::modifyDisplayQuery( $tables, $select, $conds, $join_conds,
+ $query_options, $opts['tagfilter'] );
+ }
- ChangeTags::modifyDisplayQuery( $tables, $select, $conds, $join_conds,
- $query_options, $opts['tagfilter'] );
-
- // XXX: parent class does this, should we too?
- // wfRunHooks('SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts ) );
+ if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) )
+ return false;
if( $ns == NS_CATEGORY && !$showlinkedto ) {
// special handling for categories
diff --git a/includes/specials/SpecialRemoveRestrictions.php b/includes/specials/SpecialRemoveRestrictions.php
deleted file mode 100644
index a3428a5a..00000000
--- a/includes/specials/SpecialRemoveRestrictions.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-function wfSpecialRemoveRestrictions() {
- global $wgOut, $wgRequest, $wgUser, $wgLang;
- $sk = $wgUser->getSkin();
- $title = SpecialPage::getTitleFor( 'RemoveRestrictions' );
- $id = $wgRequest->getVal( 'id' );
- if( !is_numeric( $id ) ) {
- $wgOut->addWikiMsg( 'removerestrictions-noid' );
- return;
- }
-
- UserRestriction::purgeExpired();
- $r = UserRestriction::newFromId( $id, true );
- if( !$r ) {
- $wgOut->addWikiMsg( 'removerestrictions-wrongid' );
- return;
- }
-
- $form = array();
- $form['removerestrictions-user'] = $sk->userLink( $r->getSubjectId(), $r->getSubjectText() ) .
- $sk->userToolLinks( $r->getSubjectId(), $r->getSubjectText() );
- $form['removerestrictions-type'] = UserRestriction::formatType( $r->getType() );
- if( $r->isPage() )
- $form['removerestrictions-page'] = $sk->link( $r->getPage() );
- if( $r->isNamespace() )
- $form['removerestrictions-namespace'] = $wgLang->getDisplayNsText( $r->getNamespace() );
- $form['removerestrictions-reason'] = Xml::input( 'reason' );
-
- $result = null;
- if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getVal( 'edittoken' ) ) )
- $result = wfSpecialRemoveRestrictionsProcess( $r );
-
- $wgOut->addWikiMsg( 'removerestrictions-intro' );
- $wgOut->addHTML( Xml::fieldset( wfMsgHtml( 'removerestrictions-legend' ) ) );
- if( $result )
- $wgOut->addHTML( '<strong class="success">' . wfMsgExt( 'removerestrictions-success',
- 'parseinline', $r->getSubjectText() ) . '</strong>' );
- $wgOut->addHTML( Xml::openElement( 'form', array( 'action' => $title->getLocalUrl( array( 'id' => $id ) ),
- 'method' => 'post' ) ) );
- $wgOut->addHTML( Xml::buildForm( $form, 'removerestrictions-submit' ) );
- $wgOut->addHTML( Xml::hidden( 'id', $r->getId() ) );
- $wgOut->addHTML( Xml::hidden( 'title', $title->getPrefixedDbKey() ) );
- $wgOut->addHTML( Xml::hidden( 'edittoken', $wgUser->editToken() ) );
- $wgOut->addHTML( "</form></fieldset>" );
-}
-
-function wfSpecialRemoveRestrictionsProcess( $r ) {
- global $wgRequest;
- $reason = $wgRequest->getVal( 'reason' );
- $result = $r->delete();
- $log = new LogPage( 'restrict' );
- $params = array( $r->getType() );
- if( $r->isPage() )
- $params[] = $r->getPage()->getPrefixedDbKey();
- if( $r->isNamespace() )
- $params[] = $r->getNamespace();
- $log->addEntry( 'remove', Title::makeTitle( NS_USER, $r->getSubjectText() ), $reason, $params );
- return $result;
-}
diff --git a/includes/specials/SpecialResetpass.php b/includes/specials/SpecialResetpass.php
index 967d2119..0af6fbf0 100644
--- a/includes/specials/SpecialResetpass.php
+++ b/includes/specials/SpecialResetpass.php
@@ -1,11 +1,29 @@
<?php
/**
+ * Implements Special:Resetpass
+ *
+ * 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
*/
/**
* Let users recover their password.
+ *
* @ingroup SpecialPage
*/
class SpecialResetpass extends SpecialPage {
@@ -19,6 +37,11 @@ class SpecialResetpass extends SpecialPage {
function execute( $par ) {
global $wgUser, $wgAuth, $wgOut, $wgRequest;
+ if ( wfReadOnly() ) {
+ $wgOut->readOnlyPage();
+ return;
+ }
+
$this->mUserName = $wgRequest->getVal( 'wpName' );
$this->mOldpass = $wgRequest->getVal( 'wpPassword' );
$this->mNewpass = $wgRequest->getVal( 'wpNewPassword' );
@@ -26,6 +49,7 @@ class SpecialResetpass extends SpecialPage {
$this->setHeaders();
$this->outputHeader();
+ $wgOut->disallowUserJs();
if( !$wgAuth->allowPasswordChange() ) {
$this->error( wfMsg( 'resetpass_forbidden' ) );
@@ -84,18 +108,18 @@ class SpecialResetpass extends SpecialPage {
function showForm() {
global $wgOut, $wgUser, $wgRequest;
- $wgOut->disallowUserJs();
-
- $self = SpecialPage::getTitleFor( 'Resetpass' );
+ $self = $this->getTitle();
if ( !$this->mUserName ) {
$this->mUserName = $wgUser->getName();
}
$rememberMe = '';
if ( !$wgUser->isLoggedIn() ) {
+ global $wgCookieExpiration, $wgLang;
$rememberMe = '<tr>' .
'<td></td>' .
'<td class="mw-input">' .
- Xml::checkLabel( wfMsg( 'remembermypassword' ),
+ Xml::checkLabel(
+ wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
'wpRemember', 'wpRemember',
$wgRequest->getCheck( 'wpRemember' ) ) .
'</td>' .
@@ -113,9 +137,9 @@ class SpecialResetpass extends SpecialPage {
'method' => 'post',
'action' => $self->getLocalUrl(),
'id' => 'mw-resetpass-form' ) ) . "\n" .
- Xml::hidden( 'token', $wgUser->editToken() ) . "\n" .
- Xml::hidden( 'wpName', $this->mUserName ) . "\n" .
- Xml::hidden( 'returnto', $wgRequest->getVal( 'returnto' ) ) . "\n" .
+ Html::hidden( 'token', $wgUser->editToken() ) . "\n" .
+ Html::hidden( 'wpName', $this->mUserName ) . "\n" .
+ Html::hidden( 'returnto', $wgRequest->getVal( 'returnto' ) ) . "\n" .
wfMsgExt( 'resetpass_text', array( 'parse' ) ) . "\n" .
Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
$this->pretty( array(
@@ -196,7 +220,6 @@ class SpecialResetpass extends SpecialPage {
} catch( PasswordError $e ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
throw new PasswordError( $e->getMessage() );
- return;
}
$user->setCookies();
diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php
index b2db869c..f77fc347 100644
--- a/includes/specials/SpecialRevisiondelete.php
+++ b/includes/specials/SpecialRevisiondelete.php
@@ -1,12 +1,32 @@
<?php
/**
- * Special page allowing users with the appropriate permissions to view
- * and hide revisions. Log items can also be hidden.
+ * Implements Special:Revisiondelete
+ *
+ * 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
*/
+/**
+ * Special page allowing users with the appropriate permissions to view
+ * and hide revisions. Log items can also be hidden.
+ *
+ * @ingroup SpecialPage
+ */
class SpecialRevisionDelete extends UnlistedSpecialPage {
/** Skin object */
var $skin;
@@ -333,8 +353,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$wgOut->addHTML( "<ul>" );
- $where = $revObjs = array();
-
$numRevisions = 0;
// Live revisions...
$list = $this->getList();
@@ -396,10 +414,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
'</td>' .
"</tr>\n" .
Xml::closeElement( 'table' ) .
- Xml::hidden( 'wpEditToken', $wgUser->editToken() ) .
- Xml::hidden( 'target', $this->targetObj->getPrefixedText() ) .
- Xml::hidden( 'type', $this->typeName ) .
- Xml::hidden( 'ids', implode( ',', $this->ids ) ) .
+ Html::hidden( 'wpEditToken', $wgUser->editToken() ) .
+ Html::hidden( 'target', $this->targetObj->getPrefixedText() ) .
+ Html::hidden( 'type', $this->typeName ) .
+ Html::hidden( 'ids', implode( ',', $this->ids ) ) .
Xml::closeElement( 'fieldset' ) . "\n";
} else {
$out = '';
@@ -533,7 +551,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
protected function success() {
global $wgOut;
$wgOut->setPagetitle( wfMsg( 'actioncomplete' ) );
- $wgOut->wrapWikiMsg( '<span class="success">$1</span>', $this->typeInfo['success'] );
+ $wgOut->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeInfo['success'] );
$this->list->reloadFromMaster();
$this->showForm();
}
@@ -598,1250 +616,3 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
}
}
-/**
- * Temporary b/c interface, collection of static functions.
- * @ingroup SpecialPage
- */
-class RevisionDeleter {
- /**
- * Checks for a change in the bitfield for a certain option and updates the
- * provided array accordingly.
- *
- * @param $desc String: description to add to the array if the option was
- * enabled / disabled.
- * @param $field Integer: the bitmask describing the single option.
- * @param $diff Integer: the xor of the old and new bitfields.
- * @param $new Integer: the new bitfield
- * @param $arr Array: the array to update.
- */
- protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
- if( $diff & $field ) {
- $arr[ ( $new & $field ) ? 0 : 1 ][] = $desc;
- }
- }
-
- /**
- * Gets an array describing the changes made to the visibilit of the revision.
- * If the resulting array is $arr, then $arr[0] will contain an array of strings
- * describing the items that were hidden, $arr[2] will contain an array of strings
- * describing the items that were unhidden, and $arr[3] will contain an array with
- * a single string, which can be one of "applied restrictions to sysops",
- * "removed restrictions from sysops", or null.
- *
- * @param $n Integer: the new bitfield.
- * @param $o Integer: the old bitfield.
- * @return An array as described above.
- */
- protected static function getChanges( $n, $o ) {
- $diff = $n ^ $o;
- $ret = array( 0 => array(), 1 => array(), 2 => array() );
- // Build bitfield changes in language
- self::checkItem( wfMsgForContent( 'revdelete-content' ),
- Revision::DELETED_TEXT, $diff, $n, $ret );
- self::checkItem( wfMsgForContent( 'revdelete-summary' ),
- Revision::DELETED_COMMENT, $diff, $n, $ret );
- self::checkItem( wfMsgForContent( 'revdelete-uname' ),
- Revision::DELETED_USER, $diff, $n, $ret );
- // Restriction application to sysops
- if( $diff & Revision::DELETED_RESTRICTED ) {
- if( $n & Revision::DELETED_RESTRICTED )
- $ret[2][] = wfMsgForContent( 'revdelete-restricted' );
- else
- $ret[2][] = wfMsgForContent( 'revdelete-unrestricted' );
- }
- return $ret;
- }
-
- /**
- * Gets a log message to describe the given revision visibility change. This
- * message will be of the form "[hid {content, edit summary, username}];
- * [unhid {...}][applied restrictions to sysops] for $count revisions: $comment".
- *
- * @param $count Integer: The number of effected revisions.
- * @param $nbitfield Integer: The new bitfield for the revision.
- * @param $obitfield Integer: The old bitfield for the revision.
- * @param $isForLog Boolean
- */
- public static function getLogMessage( $count, $nbitfield, $obitfield, $isForLog = false ) {
- global $wgLang;
- $s = '';
- $changes = self::getChanges( $nbitfield, $obitfield );
- if( count( $changes[0] ) ) {
- $s .= wfMsgForContent( 'revdelete-hid', implode( ', ', $changes[0] ) );
- }
- if( count( $changes[1] ) ) {
- if ($s) $s .= '; ';
- $s .= wfMsgForContent( 'revdelete-unhid', implode( ', ', $changes[1] ) );
- }
- if( count( $changes[2] ) ) {
- $s .= $s ? ' (' . $changes[2][0] . ')' : $changes[2][0];
- }
- $msg = $isForLog ? 'logdelete-log-message' : 'revdelete-log-message';
- return wfMsgExt( $msg, array( 'parsemag', 'content' ), $s, $wgLang->formatNum($count) );
-
- }
-
- // Get DB field name for URL param...
- // Future code for other things may also track
- // other types of revision-specific changes.
- // @returns string One of log_id/rev_id/fa_id/ar_timestamp/oi_archive_name
- public static function getRelationType( $typeName ) {
- if ( isset( SpecialRevisionDelete::$deprecatedTypeMap[$typeName] ) ) {
- $typeName = SpecialRevisionDelete::$deprecatedTypeMap[$typeName];
- }
- if ( isset( SpecialRevisionDelete::$allowedTypes[$typeName] ) ) {
- $class = SpecialRevisionDelete::$allowedTypes[$typeName]['list-class'];
- $list = new $class( null, null, null );
- return $list->getIdField();
- } else {
- return null;
- }
- }
-}
-
-/**
- * Abstract base class for a list of deletable items
- */
-abstract class RevDel_List {
- var $special, $title, $ids, $res, $current;
- var $type = null; // override this
- var $idField = null; // override this
- var $dateField = false; // override this
- var $authorIdField = false; // override this
- var $authorNameField = false; // override this
-
- /**
- * @param $special The parent SpecialPage
- * @param $title The target title
- * @param $ids Array of IDs
- */
- public function __construct( $special, $title, $ids ) {
- $this->special = $special;
- $this->title = $title;
- $this->ids = $ids;
- }
-
- /**
- * Get the internal type name of this list. Equal to the table name.
- */
- public function getType() {
- return $this->type;
- }
-
- /**
- * Get the DB field name associated with the ID list
- */
- public function getIdField() {
- return $this->idField;
- }
-
- /**
- * Get the DB field name storing timestamps
- */
- public function getTimestampField() {
- return $this->dateField;
- }
-
- /**
- * Get the DB field name storing user ids
- */
- public function getAuthorIdField() {
- return $this->authorIdField;
- }
-
- /**
- * Get the DB field name storing user names
- */
- public function getAuthorNameField() {
- return $this->authorNameField;
- }
- /**
- * Set the visibility for the revisions in this list. Logging and
- * transactions are done here.
- *
- * @param $params Associative array of parameters. Members are:
- * value: The integer value to set the visibility to
- * comment: The log comment.
- * @return Status
- */
- public function setVisibility( $params ) {
- $bitPars = $params['value'];
- $comment = $params['comment'];
-
- $this->res = false;
- $dbw = wfGetDB( DB_MASTER );
- $this->doQuery( $dbw );
- $dbw->begin();
- $status = Status::newGood();
- $missing = array_flip( $this->ids );
- $this->clearFileOps();
- $idsForLog = array();
- $authorIds = $authorIPs = array();
-
- for ( $this->reset(); $this->current(); $this->next() ) {
- $item = $this->current();
- unset( $missing[ $item->getId() ] );
-
- $oldBits = $item->getBits();
- // Build the actual new rev_deleted bitfield
- $newBits = SpecialRevisionDelete::extractBitfield( $bitPars, $oldBits );
-
- if ( $oldBits == $newBits ) {
- $status->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
- $status->failCount++;
- continue;
- } elseif ( $oldBits == 0 && $newBits != 0 ) {
- $opType = 'hide';
- } elseif ( $oldBits != 0 && $newBits == 0 ) {
- $opType = 'show';
- } else {
- $opType = 'modify';
- }
-
- if ( $item->isHideCurrentOp( $newBits ) ) {
- // Cannot hide current version text
- $status->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
- $status->failCount++;
- continue;
- }
- if ( !$item->canView() ) {
- // Cannot access this revision
- $msg = ($opType == 'show') ?
- 'revdelete-show-no-access' : 'revdelete-modify-no-access';
- $status->error( $msg, $item->formatDate(), $item->formatTime() );
- $status->failCount++;
- continue;
- }
- // Cannot just "hide from Sysops" without hiding any fields
- if( $newBits == Revision::DELETED_RESTRICTED ) {
- $status->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
- $status->failCount++;
- continue;
- }
-
- // Update the revision
- $ok = $item->setBits( $newBits );
-
- if ( $ok ) {
- $idsForLog[] = $item->getId();
- $status->successCount++;
- if( $item->getAuthorId() > 0 ) {
- $authorIds[] = $item->getAuthorId();
- } else if( IP::isIPAddress( $item->getAuthorName() ) ) {
- $authorIPs[] = $item->getAuthorName();
- }
- } else {
- $status->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
- $status->failCount++;
- }
- }
-
- // Handle missing revisions
- foreach ( $missing as $id => $unused ) {
- $status->error( 'revdelete-modify-missing', $id );
- $status->failCount++;
- }
-
- if ( $status->successCount == 0 ) {
- $status->ok = false;
- $dbw->rollback();
- return $status;
- }
-
- // Save success count
- $successCount = $status->successCount;
-
- // Move files, if there are any
- $status->merge( $this->doPreCommitUpdates() );
- if ( !$status->isOK() ) {
- // Fatal error, such as no configured archive directory
- $dbw->rollback();
- return $status;
- }
-
- // Log it
- $this->updateLog( array(
- 'title' => $this->title,
- 'count' => $successCount,
- 'newBits' => $newBits,
- 'oldBits' => $oldBits,
- 'comment' => $comment,
- 'ids' => $idsForLog,
- 'authorIds' => $authorIds,
- 'authorIPs' => $authorIPs
- ) );
- $dbw->commit();
-
- // Clear caches
- $status->merge( $this->doPostCommitUpdates() );
- return $status;
- }
-
- /**
- * Reload the list data from the master DB. This can be done after setVisibility()
- * to allow $item->getHTML() to show the new data.
- */
- function reloadFromMaster() {
- $dbw = wfGetDB( DB_MASTER );
- $this->res = $this->doQuery( $dbw );
- }
-
- /**
- * Record a log entry on the action
- * @param $params Associative array of parameters:
- * newBits: The new value of the *_deleted bitfield
- * oldBits: The old value of the *_deleted bitfield.
- * title: The target title
- * ids: The ID list
- * comment: The log comment
- * authorsIds: The array of the user IDs of the offenders
- * authorsIPs: The array of the IP/anon user offenders
- */
- protected function updateLog( $params ) {
- // Get the URL param's corresponding DB field
- $field = RevisionDeleter::getRelationType( $this->getType() );
- if( !$field ) {
- throw new MWException( "Bad log URL param type!" );
- }
- // Put things hidden from sysops in the oversight log
- if ( ( $params['newBits'] | $params['oldBits'] ) & $this->getSuppressBit() ) {
- $logType = 'suppress';
- } else {
- $logType = 'delete';
- }
- // Add params for effected page and ids
- $logParams = $this->getLogParams( $params );
- // Actually add the deletion log entry
- $log = new LogPage( $logType );
- $logid = $log->addEntry( $this->getLogAction(), $params['title'],
- $params['comment'], $logParams );
- // Allow for easy searching of deletion log items for revision/log items
- $log->addRelations( $field, $params['ids'], $logid );
- $log->addRelations( 'target_author_id', $params['authorIds'], $logid );
- $log->addRelations( 'target_author_ip', $params['authorIPs'], $logid );
- }
-
- /**
- * Get the log action for this list type
- */
- public function getLogAction() {
- return 'revision';
- }
-
- /**
- * Get log parameter array.
- * @param $params Associative array of log parameters, same as updateLog()
- * @return array
- */
- public function getLogParams( $params ) {
- return array(
- $this->getType(),
- implode( ',', $params['ids'] ),
- "ofield={$params['oldBits']}",
- "nfield={$params['newBits']}"
- );
- }
-
- /**
- * Initialise the current iteration pointer
- */
- protected function initCurrent() {
- $row = $this->res->current();
- if ( $row ) {
- $this->current = $this->newItem( $row );
- } else {
- $this->current = false;
- }
- }
-
- /**
- * Start iteration. This must be called before current() or next().
- * @return First list item
- */
- public function reset() {
- if ( !$this->res ) {
- $this->res = $this->doQuery( wfGetDB( DB_SLAVE ) );
- } else {
- $this->res->rewind();
- }
- $this->initCurrent();
- return $this->current;
- }
-
- /**
- * Get the current list item, or false if we are at the end
- */
- public function current() {
- return $this->current;
- }
-
- /**
- * Move the iteration pointer to the next list item, and return it.
- */
- public function next() {
- $this->res->next();
- $this->initCurrent();
- return $this->current;
- }
-
- /**
- * Get the number of items in the list.
- */
- public function length() {
- if( !$this->res ) {
- return 0;
- } else {
- return $this->res->numRows();
- }
- }
-
- /**
- * Clear any data structures needed for doPreCommitUpdates() and doPostCommitUpdates()
- * STUB
- */
- public function clearFileOps() {
- }
-
- /**
- * A hook for setVisibility(): do batch updates pre-commit.
- * STUB
- * @return Status
- */
- public function doPreCommitUpdates() {
- return Status::newGood();
- }
-
- /**
- * A hook for setVisibility(): do any necessary updates post-commit.
- * STUB
- * @return Status
- */
- public function doPostCommitUpdates() {
- return Status::newGood();
- }
-
- /**
- * Create an item object from a DB result row
- * @param $row stdclass
- */
- abstract public function newItem( $row );
-
- /**
- * Do the DB query to iterate through the objects.
- * @param $db Database object to use for the query
- */
- abstract public function doQuery( $db );
-
- /**
- * Get the integer value of the flag used for suppression
- */
- abstract public function getSuppressBit();
-}
-
-/**
- * Abstract base class for deletable items
- */
-abstract class RevDel_Item {
- /** The parent SpecialPage */
- var $special;
-
- /** The parent RevDel_List */
- var $list;
-
- /** The DB result row */
- var $row;
-
- /**
- * @param $list RevDel_List
- * @param $row DB result row
- */
- public function __construct( $list, $row ) {
- $this->special = $list->special;
- $this->list = $list;
- $this->row = $row;
- }
-
- /**
- * Get the ID, as it would appear in the ids URL parameter
- */
- public function getId() {
- $field = $this->list->getIdField();
- return $this->row->$field;
- }
-
- /**
- * Get the date, formatted with $wgLang
- */
- public function formatDate() {
- global $wgLang;
- return $wgLang->date( $this->getTimestamp() );
- }
-
- /**
- * Get the time, formatted with $wgLang
- */
- public function formatTime() {
- global $wgLang;
- return $wgLang->time( $this->getTimestamp() );
- }
-
- /**
- * Get the timestamp in MW 14-char form
- */
- public function getTimestamp() {
- $field = $this->list->getTimestampField();
- return wfTimestamp( TS_MW, $this->row->$field );
- }
-
- /**
- * Get the author user ID
- */
- public function getAuthorId() {
- $field = $this->list->getAuthorIdField();
- return intval( $this->row->$field );
- }
-
- /**
- * Get the author user name
- */
- public function getAuthorName() {
- $field = $this->list->getAuthorNameField();
- return strval( $this->row->$field );
- }
-
- /**
- * Returns true if the item is "current", and the operation to set the given
- * bits can't be executed for that reason
- * STUB
- */
- public function isHideCurrentOp( $newBits ) {
- return false;
- }
-
- /**
- * Returns true if the current user can view the item
- */
- abstract public function canView();
-
- /**
- * Returns true if the current user can view the item text/file
- */
- abstract public function canViewContent();
-
- /**
- * Get the current deletion bitfield value
- */
- abstract public function getBits();
-
- /**
- * Get the HTML of the list item. Should be include <li></li> tags.
- * This is used to show the list in HTML form, by the special page.
- */
- abstract public function getHTML();
-
- /**
- * Set the visibility of the item. This should do any necessary DB queries.
- *
- * The DB update query should have a condition which forces it to only update
- * if the value in the DB matches the value fetched earlier with the SELECT.
- * If the update fails because it did not match, the function should return
- * false. This prevents concurrency problems.
- *
- * @return boolean success
- */
- abstract public function setBits( $newBits );
-}
-
-/**
- * List for revision table items
- */
-class RevDel_RevisionList extends RevDel_List {
- var $currentRevId;
- var $type = 'revision';
- var $idField = 'rev_id';
- var $dateField = 'rev_timestamp';
- var $authorIdField = 'rev_user';
- var $authorNameField = 'rev_user_text';
-
- public function doQuery( $db ) {
- $ids = array_map( 'intval', $this->ids );
- return $db->select( array('revision','page'), '*',
- array(
- 'rev_page' => $this->title->getArticleID(),
- 'rev_id' => $ids,
- 'rev_page = page_id'
- ),
- __METHOD__,
- array( 'ORDER BY' => 'rev_id DESC' )
- );
- }
-
- public function newItem( $row ) {
- return new RevDel_RevisionItem( $this, $row );
- }
-
- public function getCurrent() {
- if ( is_null( $this->currentRevId ) ) {
- $dbw = wfGetDB( DB_MASTER );
- $this->currentRevId = $dbw->selectField(
- 'page', 'page_latest', $this->title->pageCond(), __METHOD__ );
- }
- return $this->currentRevId;
- }
-
- public function getSuppressBit() {
- return Revision::DELETED_RESTRICTED;
- }
-
- public function doPreCommitUpdates() {
- $this->title->invalidateCache();
- return Status::newGood();
- }
-
- public function doPostCommitUpdates() {
- $this->title->purgeSquid();
- // Extensions that require referencing previous revisions may need this
- wfRunHooks( 'ArticleRevisionVisiblitySet', array( &$this->title ) );
- return Status::newGood();
- }
-}
-
-/**
- * Item class for a revision table row
- */
-class RevDel_RevisionItem extends RevDel_Item {
- var $revision;
-
- public function __construct( $list, $row ) {
- parent::__construct( $list, $row );
- $this->revision = new Revision( $row );
- }
-
- public function canView() {
- return $this->revision->userCan( Revision::DELETED_RESTRICTED );
- }
-
- public function canViewContent() {
- return $this->revision->userCan( Revision::DELETED_TEXT );
- }
-
- public function getBits() {
- return $this->revision->mDeleted;
- }
-
- public function setBits( $bits ) {
- $dbw = wfGetDB( DB_MASTER );
- // Update revision table
- $dbw->update( 'revision',
- array( 'rev_deleted' => $bits ),
- array(
- 'rev_id' => $this->revision->getId(),
- 'rev_page' => $this->revision->getPage(),
- 'rev_deleted' => $this->getBits()
- ),
- __METHOD__
- );
- if ( !$dbw->affectedRows() ) {
- // Concurrent fail!
- return false;
- }
- // Update recentchanges table
- $dbw->update( 'recentchanges',
- array(
- 'rc_deleted' => $bits,
- 'rc_patrolled' => 1
- ),
- array(
- 'rc_this_oldid' => $this->revision->getId(), // condition
- // non-unique timestamp index
- 'rc_timestamp' => $dbw->timestamp( $this->revision->getTimestamp() ),
- ),
- __METHOD__
- );
- return true;
- }
-
- public function isDeleted() {
- return $this->revision->isDeleted( Revision::DELETED_TEXT );
- }
-
- public function isHideCurrentOp( $newBits ) {
- return ( $newBits & Revision::DELETED_TEXT )
- && $this->list->getCurrent() == $this->getId();
- }
-
- /**
- * Get the HTML link to the revision text.
- * Overridden by RevDel_ArchiveItem.
- */
- protected function getRevisionLink() {
- global $wgLang;
- $date = $wgLang->timeanddate( $this->revision->getTimestamp(), true );
- if ( $this->isDeleted() && !$this->canViewContent() ) {
- return $date;
- }
- return $this->special->skin->link(
- $this->list->title,
- $date,
- array(),
- array(
- 'oldid' => $this->revision->getId(),
- 'unhide' => 1
- )
- );
- }
-
- /**
- * Get the HTML link to the diff.
- * Overridden by RevDel_ArchiveItem
- */
- protected function getDiffLink() {
- if ( $this->isDeleted() && !$this->canViewContent() ) {
- return wfMsgHtml('diff');
- } else {
- return
- $this->special->skin->link(
- $this->list->title,
- wfMsgHtml('diff'),
- array(),
- array(
- 'diff' => $this->revision->getId(),
- 'oldid' => 'prev',
- 'unhide' => 1
- ),
- array(
- 'known',
- 'noclasses'
- )
- );
- }
- }
-
- public function getHTML() {
- $difflink = $this->getDiffLink();
- $revlink = $this->getRevisionLink();
- $userlink = $this->special->skin->revUserLink( $this->revision );
- $comment = $this->special->skin->revComment( $this->revision );
- if ( $this->isDeleted() ) {
- $revlink = "<span class=\"history-deleted\">$revlink</span>";
- }
- return "<li>($difflink) $revlink $userlink $comment</li>";
- }
-}
-
-/**
- * List for archive table items, i.e. revisions deleted via action=delete
- */
-class RevDel_ArchiveList extends RevDel_RevisionList {
- var $type = 'archive';
- var $idField = 'ar_timestamp';
- var $dateField = 'ar_timestamp';
- var $authorIdField = 'ar_user';
- var $authorNameField = 'ar_user_text';
-
- public function doQuery( $db ) {
- $timestamps = array();
- foreach ( $this->ids as $id ) {
- $timestamps[] = $db->timestamp( $id );
- }
- return $db->select( 'archive', '*',
- array(
- 'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey(),
- 'ar_timestamp' => $timestamps
- ),
- __METHOD__,
- array( 'ORDER BY' => 'ar_timestamp DESC' )
- );
- }
-
- public function newItem( $row ) {
- return new RevDel_ArchiveItem( $this, $row );
- }
-
- public function doPreCommitUpdates() {
- return Status::newGood();
- }
-
- public function doPostCommitUpdates() {
- return Status::newGood();
- }
-}
-
-/**
- * Item class for a archive table row
- */
-class RevDel_ArchiveItem extends RevDel_RevisionItem {
- public function __construct( $list, $row ) {
- RevDel_Item::__construct( $list, $row );
- $this->revision = Revision::newFromArchiveRow( $row,
- array( 'page' => $this->list->title->getArticleId() ) );
- }
-
- public function getId() {
- # Convert DB timestamp to MW timestamp
- return $this->revision->getTimestamp();
- }
-
- public function setBits( $bits ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'archive',
- array( 'ar_deleted' => $bits ),
- array( 'ar_namespace' => $this->list->title->getNamespace(),
- 'ar_title' => $this->list->title->getDBkey(),
- // use timestamp for index
- 'ar_timestamp' => $this->row->ar_timestamp,
- 'ar_rev_id' => $this->row->ar_rev_id,
- 'ar_deleted' => $this->getBits()
- ),
- __METHOD__ );
- return (bool)$dbw->affectedRows();
- }
-
- protected function getRevisionLink() {
- global $wgLang;
- $undelete = SpecialPage::getTitleFor( 'Undelete' );
- $date = $wgLang->timeanddate( $this->revision->getTimestamp(), true );
- if ( $this->isDeleted() && !$this->canViewContent() ) {
- return $date;
- }
- return $this->special->skin->link( $undelete, $date, array(),
- array(
- 'target' => $this->list->title->getPrefixedText(),
- 'timestamp' => $this->revision->getTimestamp()
- ) );
- }
-
- protected function getDiffLink() {
- if ( $this->isDeleted() && !$this->canViewContent() ) {
- return wfMsgHtml( 'diff' );
- }
- $undelete = SpecialPage::getTitleFor( 'Undelete' );
- return $this->special->skin->link( $undelete, wfMsgHtml('diff'), array(),
- array(
- 'target' => $this->list->title->getPrefixedText(),
- 'diff' => 'prev',
- 'timestamp' => $this->revision->getTimestamp()
- ) );
- }
-}
-
-/**
- * List for oldimage table items
- */
-class RevDel_FileList extends RevDel_List {
- var $type = 'oldimage';
- var $idField = 'oi_archive_name';
- var $dateField = 'oi_timestamp';
- var $authorIdField = 'oi_user';
- var $authorNameField = 'oi_user_text';
- var $storeBatch, $deleteBatch, $cleanupBatch;
-
- public function doQuery( $db ) {
- $archiveName = array();
- foreach( $this->ids as $timestamp ) {
- $archiveNames[] = $timestamp . '!' . $this->title->getDBkey();
- }
- return $db->select( 'oldimage', '*',
- array(
- 'oi_name' => $this->title->getDBkey(),
- 'oi_archive_name' => $archiveNames
- ),
- __METHOD__,
- array( 'ORDER BY' => 'oi_timestamp DESC' )
- );
- }
-
- public function newItem( $row ) {
- return new RevDel_FileItem( $this, $row );
- }
-
- public function clearFileOps() {
- $this->deleteBatch = array();
- $this->storeBatch = array();
- $this->cleanupBatch = array();
- }
-
- public function doPreCommitUpdates() {
- $status = Status::newGood();
- $repo = RepoGroup::singleton()->getLocalRepo();
- if ( $this->storeBatch ) {
- $status->merge( $repo->storeBatch( $this->storeBatch, FileRepo::OVERWRITE_SAME ) );
- }
- if ( !$status->isOK() ) {
- return $status;
- }
- if ( $this->deleteBatch ) {
- $status->merge( $repo->deleteBatch( $this->deleteBatch ) );
- }
- if ( !$status->isOK() ) {
- // Running cleanupDeletedBatch() after a failed storeBatch() with the DB already
- // modified (but destined for rollback) causes data loss
- return $status;
- }
- if ( $this->cleanupBatch ) {
- $status->merge( $repo->cleanupDeletedBatch( $this->cleanupBatch ) );
- }
- return $status;
- }
-
- public function doPostCommitUpdates() {
- $file = wfLocalFile( $this->title );
- $file->purgeCache();
- $file->purgeDescription();
- return Status::newGood();
- }
-
- public function getSuppressBit() {
- return File::DELETED_RESTRICTED;
- }
-}
-
-/**
- * Item class for an oldimage table row
- */
-class RevDel_FileItem extends RevDel_Item {
- var $file;
-
- public function __construct( $list, $row ) {
- parent::__construct( $list, $row );
- $this->file = RepoGroup::singleton()->getLocalRepo()->newFileFromRow( $row );
- }
-
- public function getId() {
- $parts = explode( '!', $this->row->oi_archive_name );
- return $parts[0];
- }
-
- public function canView() {
- return $this->file->userCan( File::DELETED_RESTRICTED );
- }
-
- public function canViewContent() {
- return $this->file->userCan( File::DELETED_FILE );
- }
-
- public function getBits() {
- return $this->file->getVisibility();
- }
-
- public function setBits( $bits ) {
- # Queue the file op
- # FIXME: move to LocalFile.php
- if ( $this->isDeleted() ) {
- if ( $bits & File::DELETED_FILE ) {
- # Still deleted
- } else {
- # Newly undeleted
- $key = $this->file->getStorageKey();
- $srcRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
- $this->list->storeBatch[] = array(
- $this->file->repo->getVirtualUrl( 'deleted' ) . '/' . $srcRel,
- 'public',
- $this->file->getRel()
- );
- $this->list->cleanupBatch[] = $key;
- }
- } elseif ( $bits & File::DELETED_FILE ) {
- # Newly deleted
- $key = $this->file->getStorageKey();
- $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
- $this->list->deleteBatch[] = array( $this->file->getRel(), $dstRel );
- }
-
- # Do the database operations
- $dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'oldimage',
- array( 'oi_deleted' => $bits ),
- array(
- 'oi_name' => $this->row->oi_name,
- 'oi_timestamp' => $this->row->oi_timestamp,
- 'oi_deleted' => $this->getBits()
- ),
- __METHOD__
- );
- return (bool)$dbw->affectedRows();
- }
-
- public function isDeleted() {
- return $this->file->isDeleted( File::DELETED_FILE );
- }
-
- /**
- * Get the link to the file.
- * Overridden by RevDel_ArchivedFileItem.
- */
- protected function getLink() {
- global $wgLang, $wgUser;
- $date = $wgLang->timeanddate( $this->file->getTimestamp(), true );
- if ( $this->isDeleted() ) {
- # Hidden files...
- if ( !$this->canViewContent() ) {
- $link = $date;
- } else {
- $link = $this->special->skin->link(
- $this->special->getTitle(),
- $date, array(),
- array(
- 'target' => $this->list->title->getPrefixedText(),
- 'file' => $this->file->getArchiveName(),
- 'token' => $wgUser->editToken( $this->file->getArchiveName() )
- )
- );
- }
- return '<span class="history-deleted">' . $link . '</span>';
- } else {
- # Regular files...
- $url = $this->file->getUrl();
- return Xml::element( 'a', array( 'href' => $this->file->getUrl() ), $date );
- }
- }
- /**
- * Generate a user tool link cluster if the current user is allowed to view it
- * @return string HTML
- */
- protected function getUserTools() {
- if( $this->file->userCan( Revision::DELETED_USER ) ) {
- $link = $this->special->skin->userLink( $this->file->user, $this->file->user_text ) .
- $this->special->skin->userToolLinks( $this->file->user, $this->file->user_text );
- } else {
- $link = wfMsgHtml( 'rev-deleted-user' );
- }
- if( $this->file->isDeleted( Revision::DELETED_USER ) ) {
- return '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
- }
-
- /**
- * Wrap and format the file's comment block, if the current
- * user is allowed to view it.
- *
- * @return string HTML
- */
- protected function getComment() {
- if( $this->file->userCan( File::DELETED_COMMENT ) ) {
- $block = $this->special->skin->commentBlock( $this->file->description );
- } else {
- $block = ' ' . wfMsgHtml( 'rev-deleted-comment' );
- }
- if( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
- return "<span class=\"history-deleted\">$block</span>";
- }
- return $block;
- }
-
- public function getHTML() {
- global $wgLang;
- $data =
- wfMsg(
- 'widthheight',
- $wgLang->formatNum( $this->file->getWidth() ),
- $wgLang->formatNum( $this->file->getHeight() )
- ) .
- ' (' .
- wfMsgExt( 'nbytes', 'parsemag', $wgLang->formatNum( $this->file->getSize() ) ) .
- ')';
- $pageLink = $this->getLink();
-
- return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
- $data . ' ' . $this->getComment(). '</li>';
- }
-}
-
-/**
- * List for filearchive table items
- */
-class RevDel_ArchivedFileList extends RevDel_FileList {
- var $type = 'filearchive';
- var $idField = 'fa_id';
- var $dateField = 'fa_timestamp';
- var $authorIdField = 'fa_user';
- var $authorNameField = 'fa_user_text';
-
- public function doQuery( $db ) {
- $ids = array_map( 'intval', $this->ids );
- return $db->select( 'filearchive', '*',
- array(
- 'fa_name' => $this->title->getDBkey(),
- 'fa_id' => $ids
- ),
- __METHOD__,
- array( 'ORDER BY' => 'fa_id DESC' )
- );
- }
-
- public function newItem( $row ) {
- return new RevDel_ArchivedFileItem( $this, $row );
- }
-}
-
-/**
- * Item class for a filearchive table row
- */
-class RevDel_ArchivedFileItem extends RevDel_FileItem {
- public function __construct( $list, $row ) {
- RevDel_Item::__construct( $list, $row );
- $this->file = ArchivedFile::newFromRow( $row );
- }
-
- public function getId() {
- return $this->row->fa_id;
- }
-
- public function setBits( $bits ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'filearchive',
- array( 'fa_deleted' => $bits ),
- array(
- 'fa_id' => $this->row->fa_id,
- 'fa_deleted' => $this->getBits(),
- ),
- __METHOD__
- );
- return (bool)$dbw->affectedRows();
- }
-
- protected function getLink() {
- global $wgLang, $wgUser;
- $date = $wgLang->timeanddate( $this->file->getTimestamp(), true );
- $undelete = SpecialPage::getTitleFor( 'Undelete' );
- $key = $this->file->getKey();
- # Hidden files...
- if( !$this->canViewContent() ) {
- $link = $date;
- } else {
- $link = $this->special->skin->link( $undelete, $date, array(),
- array(
- 'target' => $this->list->title->getPrefixedText(),
- 'file' => $key,
- 'token' => $wgUser->editToken( $key )
- )
- );
- }
- if( $this->isDeleted() ) {
- $link = '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
- }
-}
-
-/**
- * List for logging table items
- */
-class RevDel_LogList extends RevDel_List {
- var $type = 'logging';
- var $idField = 'log_id';
- var $dateField = 'log_timestamp';
- var $authorIdField = 'log_user';
- var $authorNameField = 'log_user_text';
-
- public function doQuery( $db ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
- $ids = array_map( 'intval', $this->ids );
- return $db->select( 'logging', '*',
- array( 'log_id' => $ids ),
- __METHOD__,
- array( 'ORDER BY' => 'log_id DESC' )
- );
- }
-
- public function newItem( $row ) {
- return new RevDel_LogItem( $this, $row );
- }
-
- public function getSuppressBit() {
- return Revision::DELETED_RESTRICTED;
- }
-
- public function getLogAction() {
- return 'event';
- }
-
- public function getLogParams( $params ) {
- return array(
- implode( ',', $params['ids'] ),
- "ofield={$params['oldBits']}",
- "nfield={$params['newBits']}"
- );
- }
-}
-
-/**
- * Item class for a logging table row
- */
-class RevDel_LogItem extends RevDel_Item {
- public function canView() {
- return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED );
- }
-
- public function canViewContent() {
- return true; // none
- }
-
- public function getBits() {
- return $this->row->log_deleted;
- }
-
- public function setBits( $bits ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'recentchanges',
- array(
- 'rc_deleted' => $bits,
- 'rc_patrolled' => 1
- ),
- array(
- 'rc_logid' => $this->row->log_id,
- 'rc_timestamp' => $this->row->log_timestamp // index
- ),
- __METHOD__
- );
- $dbw->update( 'logging',
- array( 'log_deleted' => $bits ),
- array(
- 'log_id' => $this->row->log_id,
- 'log_deleted' => $this->getBits()
- ),
- __METHOD__
- );
- return (bool)$dbw->affectedRows();
- }
-
- public function getHTML() {
- global $wgLang;
-
- $date = htmlspecialchars( $wgLang->timeanddate( $this->row->log_timestamp ) );
- $paramArray = LogPage::extractParams( $this->row->log_params );
- $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title );
-
- // Log link for this page
- $loglink = $this->special->skin->link(
- SpecialPage::getTitleFor( 'Log' ),
- wfMsgHtml( 'log' ),
- array(),
- array( 'page' => $title->getPrefixedText() )
- );
- // Action text
- if( !$this->canView() ) {
- $action = '<span class="history-deleted">' . wfMsgHtml('rev-deleted-event') . '</span>';
- } else {
- $action = LogPage::actionText( $this->row->log_type, $this->row->log_action, $title,
- $this->special->skin, $paramArray, true, true );
- if( $this->row->log_deleted & LogPage::DELETED_ACTION )
- $action = '<span class="history-deleted">' . $action . '</span>';
- }
- // User links
- $userLink = $this->special->skin->userLink( $this->row->log_user,
- User::WhoIs( $this->row->log_user ) );
- if( LogEventsList::isDeleted($this->row,LogPage::DELETED_USER) ) {
- $userLink = '<span class="history-deleted">' . $userLink . '</span>';
- }
- // Comment
- $comment = $wgLang->getDirMark() . $this->special->skin->commentBlock( $this->row->log_comment );
- if( LogEventsList::isDeleted($this->row,LogPage::DELETED_COMMENT) ) {
- $comment = '<span class="history-deleted">' . $comment . '</span>';
- }
- return "<li>($loglink) $date $userLink $action $comment</li>";
- }
-}
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php
index 40b28236..fd6e858e 100644
--- a/includes/specials/SpecialSearch.php
+++ b/includes/specials/SpecialSearch.php
@@ -1,24 +1,24 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
- * Run text & title search and display the output
+ * Implements Special:Search
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.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
* @ingroup SpecialPage
*/
@@ -29,7 +29,9 @@
* @param $par String: (default '')
*/
function wfSpecialSearch( $par = '' ) {
- global $wgRequest, $wgUser;
+ global $wgRequest, $wgUser, $wgOut;
+ $wgOut->allowClickjacking();
+
// Strip underscores from title parameter; most of the time we'll want
// text form here. But don't strip underscores from actual text params!
$titleParam = str_replace( '_', ' ', $par );
@@ -56,11 +58,10 @@ class SpecialSearch {
* Set up basic search parameters from the request and user settings.
* Typically you'll pass $wgRequest and $wgUser.
*
- * @param WebRequest $request
- * @param User $user
- * @public
+ * @param $request WebRequest
+ * @param $user User
*/
- function __construct( &$request, &$user ) {
+ public function __construct( &$request, &$user ) {
list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, 'searchlimit' );
$this->mPrefix = $request->getVal('prefix', '');
# Extract requested namespaces
@@ -68,7 +69,7 @@ class SpecialSearch {
if( empty( $this->namespaces ) ) {
$this->namespaces = SearchEngine::userNamespaces( $user );
}
- $this->searchRedirects = $request->getcheck( 'redirs' ) ? true : false;
+ $this->searchRedirects = $request->getCheck( 'redirs' );
$this->searchAdvanced = $request->getVal( 'advanced' );
$this->active = 'advanced';
$this->sk = $user->getSkin();
@@ -78,7 +79,8 @@ class SpecialSearch {
/**
* If an exact title match can be found, jump straight ahead to it.
- * @param string $term
+ *
+ * @param $term String
*/
public function goResult( $term ) {
global $wgOut;
@@ -91,6 +93,12 @@ class SpecialSearch {
}
# If there's an exact or very near match, jump right there.
$t = SearchEngine::getNearMatch( $term );
+
+ if ( !wfRunHooks( 'SpecialSearchGo', array( &$t, &$term ) ) ) {
+ # Hook requested termination
+ return;
+ }
+
if( !is_null( $t ) ) {
$wgOut->redirect( $t->getFullURL() );
return;
@@ -100,6 +108,8 @@ class SpecialSearch {
if( !is_null( $t ) ) {
global $wgGoToEdit;
wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) );
+ wfDebugLog( 'nogomatch', $t->getText(), false );
+
# If the feature is enabled, go straight to the edit page
if( $wgGoToEdit ) {
$wgOut->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
@@ -110,7 +120,7 @@ class SpecialSearch {
}
/**
- * @param string $term
+ * @param $term String
*/
public function showResults( $term ) {
global $wgOut, $wgUser, $wgDisableTextSearch, $wgContLang, $wgScript;
@@ -220,7 +230,6 @@ class SpecialSearch {
$filePrefix = $wgContLang->getFormattedNsText(NS_FILE).':';
if( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
- $wgOut->addHTML( $this->searchFocus() );
$wgOut->addHTML( $this->formHeader($term, 0, 0));
if( $this->searchAdvanced ) {
$wgOut->addHTML( $this->powerSearchBox( $term ) );
@@ -302,13 +311,10 @@ class SpecialSearch {
$textMatches->free();
}
if( $num === 0 ) {
- $wgOut->addWikiMsg( 'search-nonefound', wfEscapeWikiText( $term ) );
+ $wgOut->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
$this->showCreateLink( $t );
}
$wgOut->addHtml( "</div>" );
- if( $num === 0 ) {
- $wgOut->addHTML( $this->searchFocus() );
- }
if( $num || $this->offset ) {
$wgOut->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
@@ -326,10 +332,12 @@ class SpecialSearch {
$messageName = 'searchmenu-exists';
} elseif( $t->userCan( 'create' ) ) {
$messageName = 'searchmenu-new';
+ } else {
+ $messageName = 'searchmenu-new-nocreate';
}
}
if( $messageName ) {
- $wgOut->addWikiMsg( $messageName, wfEscapeWikiText( $t->getPrefixedText() ) );
+ $wgOut->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", array( $messageName, wfEscapeWikiText( $t->getPrefixedText() ) ) );
} else {
// preserve the paragraph for margins etc...
$wgOut->addHtml( '<p></p>' );
@@ -342,10 +350,9 @@ class SpecialSearch {
protected function setupPage( $term ) {
global $wgOut;
// Figure out the active search profile header
- $nsAllSet = array_keys( SearchEngine::searchableNamespaces() );
- if( $this->searchAdvanced )
+ if( $this->searchAdvanced ) {
$this->active = 'advanced';
- else {
+ } else {
$profiles = $this->getSearchProfiles();
foreach( $profiles as $key => $data ) {
@@ -363,16 +370,16 @@ class SpecialSearch {
$wgOut->setArticleRelated( false );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
// add javascript specific to special:search
- $wgOut->addScriptFile( 'search.js' );
- $wgOut->allowClickjacking();
+ $wgOut->addModules( 'mediawiki.legacy.search' );
+ $wgOut->addModules( 'mediawiki.special.search' );
}
/**
* Extract "power search" namespace settings from the request object,
* returning a list of index numbers to search.
*
- * @param WebRequest $request
- * @return array
+ * @param $request WebRequest
+ * @return Array
*/
protected function powerSearch( &$request ) {
$arr = array();
@@ -386,7 +393,8 @@ class SpecialSearch {
/**
* Reconstruct the 'power search' options for links
- * @return array
+ *
+ * @return Array
*/
protected function powerSearchOptions() {
$opt = array();
@@ -403,7 +411,7 @@ class SpecialSearch {
/**
* Show whole set of results
*
- * @param SearchResultSet $matches
+ * @param $matches SearchResultSet
*/
protected function showMatches( &$matches ) {
global $wgContLang;
@@ -416,7 +424,6 @@ class SpecialSearch {
if( !is_null($infoLine) ) {
$out .= "\n<!-- {$infoLine} -->\n";
}
- $off = $this->offset + 1;
$out .= "<ul class='mw-search-results'>\n";
while( $result = $matches->next() ) {
$out .= $this->showHit( $result, $terms );
@@ -431,11 +438,12 @@ class SpecialSearch {
/**
* Format a single hit result
- * @param SearchResult $result
- * @param array $terms terms to highlight
+ *
+ * @param $result SearchResult
+ * @param $terms Array: terms to highlight
*/
protected function showHit( $result, $terms ) {
- global $wgContLang, $wgLang, $wgUser;
+ global $wgLang, $wgUser;
wfProfileIn( __METHOD__ );
if( $result->isBrokenTitle() ) {
@@ -539,6 +547,18 @@ class SpecialSearch {
$this->sk->formatSize( $byteSize ),
$wgLang->formatNum( $wordCount )
);
+
+ if( $t->getNamespace() == NS_CATEGORY ) {
+ $cat = Category::newFromTitle( $t );
+ $size = wfMsgExt(
+ 'search-result-category-size',
+ array( 'parsemag', 'escape' ),
+ $wgLang->formatNum( $cat->getPageCount() ),
+ $wgLang->formatNum( $cat->getSubcatCount() ),
+ $wgLang->formatNum( $cat->getFileCount() )
+ );
+ }
+
$date = $wgLang->timeanddate( $timestamp );
// link to related articles if supported
@@ -567,7 +587,7 @@ class SpecialSearch {
if( $img ) {
$thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
if( $thumb ) {
- $desc = $img->getShortDesc();
+ $desc = wfMsg( 'parentheses', $img->getShortDesc() );
wfProfileOut( __METHOD__ );
// Float doesn't seem to interact well with the bullets.
// Table messes up vertical alignment of the bullets.
@@ -591,7 +611,7 @@ class SpecialSearch {
}
wfProfileOut( __METHOD__ );
- return "<li>{$link} {$redirect} {$section} {$extract}\n" .
+ return "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</div> {$extract}\n" .
"<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
"</li>\n";
@@ -600,7 +620,8 @@ class SpecialSearch {
/**
* Show results from other wikis
*
- * @param SearchResultSet $matches
+ * @param $matches SearchResultSet
+ * @param $query String
*/
protected function showInterwiki( &$matches, $query ) {
global $wgContLang;
@@ -609,7 +630,6 @@ class SpecialSearch {
$out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>".
wfMsg('search-interwiki-caption')."</div>\n";
- $off = $this->offset + 1;
$out .= "<ul class='mw-search-iwresults'>\n";
// work out custom project captions
@@ -638,15 +658,14 @@ class SpecialSearch {
/**
* Show single interwiki link
*
- * @param SearchResult $result
- * @param string $lastInterwiki
- * @param array $terms
- * @param string $query
- * @param array $customCaptions iw prefix -> caption
+ * @param $result SearchResult
+ * @param $lastInterwiki String
+ * @param $terms Array
+ * @param $query String
+ * @param $customCaptions Array: iw prefix -> caption
*/
protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) {
wfProfileIn( __METHOD__ );
- global $wgContLang, $wgLang;
if( $result->isBrokenTitle() ) {
wfProfileOut( __METHOD__ );
@@ -719,12 +738,11 @@ class SpecialSearch {
/**
* Generates the power search box at bottom of [[Special:Search]]
- * @param $term string: search term
- * @return $out string: HTML form
+ *
+ * @param $term String: search term
+ * @return String: HTML form
*/
protected function powerSearchBox( $term ) {
- global $wgScript, $wgContLang;
-
// Groups namespaces into rows according to subject
$rows = array();
foreach( SearchEngine::searchableNamespaces() as $namespace => $name ) {
@@ -809,19 +827,11 @@ class SpecialSearch {
$namespaceTables .
Xml::element( 'div', array( 'class' => 'divider' ), '', false ) .
$redirects .
- Xml::hidden( 'title', SpecialPage::getTitleFor( 'Search' )->getPrefixedText() ) .
- Xml::hidden( 'advanced', $this->searchAdvanced ) .
- Xml::hidden( 'fulltext', 'Advanced search' ) .
+ Html::hidden( 'title', SpecialPage::getTitleFor( 'Search' )->getPrefixedText() ) .
+ Html::hidden( 'advanced', $this->searchAdvanced ) .
+ Html::hidden( 'fulltext', 'Advanced search' ) .
Xml::closeElement( 'fieldset' );
}
-
- protected function searchFocus() {
- $id = $this->searchAdvanced ? 'powerSearchText' : 'searchText';
- return Html::inlineScript(
- "hookEvent(\"load\", function() {" .
- "document.getElementById('$id').focus();" .
- "});" );
- }
protected function getSearchProfiles() {
// Builds list of Search Types (profiles)
@@ -864,7 +874,7 @@ class SpecialSearch {
wfRunHooks( 'SpecialSearchProfiles', array( &$profiles ) );
- foreach( $profiles as $key => &$data ) {
+ foreach( $profiles as &$data ) {
sort($data['namespaces']);
}
@@ -872,7 +882,7 @@ class SpecialSearch {
}
protected function formHeader( $term, $resultsShown, $totalNum ) {
- global $wgContLang, $wgLang;
+ global $wgLang;
$out = Xml::openElement('div', array( 'class' => 'mw-search-formheader' ) );
@@ -882,7 +892,6 @@ class SpecialSearch {
$bareterm = substr( $term, strpos( $term, ':' ) + 1 );
}
-
$profiles = $this->getSearchProfiles();
// Outputs XML for Search Types
@@ -934,7 +943,7 @@ class SpecialSearch {
// Adds hidden namespace fields
if ( !$this->searchAdvanced ) {
foreach( $this->namespaces as $ns ) {
- $out .= Xml::hidden( "ns{$ns}", '1' );
+ $out .= Html::hidden( "ns{$ns}", '1' );
}
}
@@ -943,7 +952,6 @@ class SpecialSearch {
protected function shortDialog( $term ) {
$searchTitle = SpecialPage::getTitleFor( 'Search' );
- $searchable = SearchEngine::searchableNamespaces();
$out = Html::hidden( 'title', $searchTitle->getPrefixedText() ) . "\n";
// Keep redirect setting
$out .= Html::hidden( "redirs", (int)$this->searchRedirects ) . "\n";
@@ -958,7 +966,16 @@ class SpecialSearch {
return $out . $this->didYouMeanHtml;
}
- /** Make a search link with some target namespaces */
+ /**
+ * Make a search link with some target namespaces
+ *
+ * @param $term String
+ * @param $namespaces Array
+ * @param $label String: link's text
+ * @param $tooltip String: link's tooltip
+ * @param $params Array: query string parameters
+ * @return String: HTML fragment
+ */
protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params=array() ) {
$opt = $params;
foreach( $namespaces as $n ) {
@@ -986,7 +1003,12 @@ class SpecialSearch {
);
}
- /** Check if query starts with image: prefix */
+ /**
+ * Check if query starts with image: prefix
+ *
+ * @param $term String: the string to check
+ * @return Boolean
+ */
protected function startsWithImage( $term ) {
global $wgContLang;
@@ -997,7 +1019,12 @@ class SpecialSearch {
return false;
}
- /** Check if query starts with all: prefix */
+ /**
+ * Check if query starts with all: prefix
+ *
+ * @param $term String: the string to check
+ * @return Boolean
+ */
protected function startsWithAll( $term ) {
$allkeyword = wfMsgForContent('searchall');
diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php
index c41b15c5..989e4c07 100644
--- a/includes/specials/SpecialShortpages.php
+++ b/includes/specials/SpecialShortpages.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:Shortpages
+ *
+ * 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
*/
@@ -7,6 +24,7 @@
/**
* SpecialShortpages extends QueryPage. It is used to return the shortest
* pages in the database.
+ *
* @ingroup SpecialPage
*/
class ShortPagesPage extends QueryPage {
@@ -54,11 +72,13 @@ class ShortPagesPage extends QueryPage {
# the page must exist for it to have been pulled out of the table
if( $this->isCached() ) {
$batch = new LinkBatch();
- while( $row = $db->fetchObject( $res ) )
+ foreach ( $res as $row ) {
$batch->add( $row->namespace, $row->title );
+ }
$batch->execute();
- if( $db->numRows( $res ) > 0 )
+ if ( $db->numRows( $res ) > 0 ) {
$db->dataSeek( $res, 0 );
+ }
}
}
@@ -83,11 +103,11 @@ class ShortPagesPage extends QueryPage {
$plink = $this->isCached()
? $skin->link( $title )
: $skin->linkKnown( $title );
- $size = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ), $wgLang->formatNum( htmlspecialchars( $result->value ) ) );
+ $size = wfMessage( 'nbytes', $wgLang->formatNum( $result->value ) )->escaped();
return $title->exists()
? "({$hlink}) {$dm}{$plink} {$dm}[{$size}]"
- : "<s>({$hlink}) {$dm}{$plink} {$dm}[{$size}]</s>";
+ : "<del>({$hlink}) {$dm}{$plink} {$dm}[{$size}]</del>";
}
}
diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php
index 8e97f9b7..19bc6b00 100644
--- a/includes/specials/SpecialSpecialpages.php
+++ b/includes/specials/SpecialSpecialpages.php
@@ -1,84 +1,138 @@
<?php
/**
+ * Implements Special:Specialpages
+ *
+ * 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
*/
/**
+ * A special page that lists special pages
*
+ * @ingroup SpecialPage
*/
-function wfSpecialSpecialpages() {
- global $wgOut, $wgUser, $wgMessageCache, $wgSortSpecialPages;
+class SpecialSpecialpages extends UnlistedSpecialPage {
+
+ function __construct() {
+ parent::__construct( 'Specialpages' );
+ }
- $wgMessageCache->loadAllMessages();
+ function execute( $par ) {
+ global $wgOut;
+ $this->setHeaders();
+ $this->outputHeader();
+ $wgOut->allowClickjacking();
- $wgOut->setRobotPolicy( 'noindex,nofollow' ); # Is this really needed?
- $wgOut->allowClickjacking();
- $sk = $wgUser->getSkin();
+ $groups = $this->getPageGroups();
- $pages = SpecialPage::getUsablePages();
+ if ( $groups === false ) {
+ return;
+ }
- if( count( $pages ) == 0 ) {
- # Yeah, that was pointless. Thanks for coming.
- return;
+ $this->outputPageList( $groups );
}
- /** Put them into a sortable array */
- $groups = array();
- foreach ( $pages as $page ) {
- if ( $page->isListed() ) {
- $group = SpecialPage::getGroup( $page );
- if( !isset($groups[$group]) ) {
- $groups[$group] = array();
+ private function getPageGroups() {
+ global $wgSortSpecialPages;
+
+ $pages = SpecialPage::getUsablePages();
+
+ if( !count( $pages ) ) {
+ # Yeah, that was pointless. Thanks for coming.
+ return false;
+ }
+
+ /** Put them into a sortable array */
+ $groups = array();
+ foreach ( $pages as $page ) {
+ if ( $page->isListed() ) {
+ $group = SpecialPage::getGroup( $page );
+ if( !isset( $groups[$group] ) ) {
+ $groups[$group] = array();
+ }
+ $groups[$group][$page->getDescription()] = array( $page->getTitle(), $page->isRestricted() );
}
- $groups[$group][$page->getDescription()] = array( $page->getTitle(), $page->isRestricted() );
}
- }
- /** Sort */
- if ( $wgSortSpecialPages ) {
- foreach( $groups as $group => $sortedPages ) {
- ksort( $groups[$group] );
+ /** Sort */
+ if ( $wgSortSpecialPages ) {
+ foreach( $groups as $group => $sortedPages ) {
+ ksort( $groups[$group] );
+ }
}
- }
- /** Always move "other" to end */
- if( array_key_exists('other',$groups) ) {
- $other = $groups['other'];
- unset( $groups['other'] );
- $groups['other'] = $other;
+ /** Always move "other" to end */
+ if( array_key_exists( 'other', $groups ) ) {
+ $other = $groups['other'];
+ unset( $groups['other'] );
+ $groups['other'] = $other;
+ }
+
+ return $groups;
}
- $includesRestrictedPages = false;
- /** Now output the HTML */
- foreach ( $groups as $group => $sortedPages ) {
- $middle = ceil( count($sortedPages)/2 );
- $total = count($sortedPages);
- $count = 0;
-
- $wgOut->wrapWikiMsg( "<h4 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h4>\n", "specialpages-group-$group" );
- $wgOut->addHTML( "<table style='width: 100%;' class='mw-specialpages-table'><tr>" );
- $wgOut->addHTML( "<td width='30%' valign='top'><ul>\n" );
- foreach( $sortedPages as $desc => $specialpage ) {
- list( $title, $restricted ) = $specialpage;
- $link = $sk->linkKnown( $title , htmlspecialchars( $desc ) );
- if( $restricted ) {
- $includesRestrictedPages = true;
- $wgOut->addHTML( "<li class='mw-specialpages-page mw-specialpagerestricted'><strong>{$link}</strong></li>\n" );
- } else {
- $wgOut->addHTML( "<li>{$link}</li>\n" );
- }
+ private function outputPageList( $groups ) {
+ global $wgUser, $wgOut;
- # Split up the larger groups
- $count++;
- if( $total > 3 && $count == $middle ) {
- $wgOut->addHTML( "</ul></td><td width='10%'></td><td width='30%' valign='top'><ul>" );
+ $sk = $wgUser->getSkin();
+ $includesRestrictedPages = false;
+
+ foreach ( $groups as $group => $sortedPages ) {
+ $middle = ceil( count( $sortedPages )/2 );
+ $total = count( $sortedPages );
+ $count = 0;
+
+ $wgOut->wrapWikiMsg( "<h4 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h4>\n", "specialpages-group-$group" );
+ $wgOut->addHTML(
+ Html::openElement( 'table', array( 'style' => 'width:100%;', 'class' => 'mw-specialpages-table' ) ) ."\n" .
+ Html::openElement( 'tr' ) . "\n" .
+ Html::openElement( 'td', array( 'style' => 'width:30%;vertical-align:top' ) ) . "\n" .
+ Html::openElement( 'ul' ) . "\n"
+ );
+ foreach( $sortedPages as $desc => $specialpage ) {
+ list( $title, $restricted ) = $specialpage;
+ $link = $sk->linkKnown( $title , htmlspecialchars( $desc ) );
+ if( $restricted ) {
+ $includesRestrictedPages = true;
+ $wgOut->addHTML( Html::rawElement( 'li', array( 'class' => 'mw-specialpages-page mw-specialpagerestricted' ), Html::rawElement( 'strong', array(), $link ) ) . "\n" );
+ } else {
+ $wgOut->addHTML( Html::rawElement( 'li', array(), $link ) . "\n" );
+ }
+
+ # Split up the larger groups
+ $count++;
+ if( $total > 3 && $count == $middle ) {
+ $wgOut->addHTML(
+ Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
+ Html::element( 'td', array( 'style' => 'width:10%' ), '' ) .
+ Html::openElement( 'td', array( 'style' => 'width:30%' ) ) . Html::openElement( 'ul' ) . "\n"
+ );
+ }
}
+ $wgOut->addHTML(
+ Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
+ Html::element( 'td', array( 'style' => 'width:30%' ), '' ) .
+ Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n"
+ );
}
- $wgOut->addHTML( "</ul></td><td width='30%' valign='top'></td></tr></table>\n" );
- }
- if ( $includesRestrictedPages ) {
- $wgOut->wrapWikiMsg( "<div class=\"mw-specialpages-notes\">\n$1\n</div>", 'specialpages-note' );
+ if ( $includesRestrictedPages ) {
+ $wgOut->wrapWikiMsg( "<div class=\"mw-specialpages-notes\">\n$1\n</div>", 'specialpages-note' );
+ }
}
}
diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php
index 2e785b8b..b0d0246e 100644
--- a/includes/specials/SpecialStatistics.php
+++ b/includes/specials/SpecialStatistics.php
@@ -1,31 +1,44 @@
<?php
-
/**
- * Special page lists various statistics, including the contents of
- * `site_stats`, plus page view details if enabled
+ * Implements Special:Statistics
+ *
+ * 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
*/
/**
- * Show the special page
+ * Special page lists various statistics, including the contents of
+ * `site_stats`, plus page view details if enabled
*
- * @param mixed $par (not used)
+ * @ingroup SpecialPage
*/
class SpecialStatistics extends SpecialPage {
private $views, $edits, $good, $images, $total, $users,
- $activeUsers, $admins, $numJobs = 0;
+ $activeUsers, $admins = 0;
public function __construct() {
parent::__construct( 'Statistics' );
}
public function execute( $par ) {
- global $wgOut, $wgRequest, $wgMessageCache, $wgMemc;
+ global $wgOut, $wgMemc;
global $wgDisableCounters, $wgMiserMode;
- $wgMessageCache->loadAllMessages();
$this->setHeaders();
@@ -37,7 +50,6 @@ class SpecialStatistics extends SpecialPage {
$this->users = SiteStats::users();
$this->activeUsers = SiteStats::activeUsers();
$this->admins = SiteStats::numberingroup('sysop');
- $this->numJobs = SiteStats::jobs();
$this->hook = '';
# Staticic - views
@@ -56,11 +68,6 @@ class SpecialStatistics extends SpecialPage {
$wgMemc->set( $key, '1', 24*3600 ); // don't update for 1 day
}
}
-
- # Do raw output
- if( $wgRequest->getVal( 'action' ) == 'raw' ) {
- $this->doRawOutput();
- }
$text = Xml::openElement( 'table', array( 'class' => 'wikitable mw-statistics-table' ) );
@@ -101,15 +108,14 @@ class SpecialStatistics extends SpecialPage {
/**
* Format a row
- * @param string $text description of the row
- * @param float $number a number
- * @param array $trExtraParams
- * @param string $descMsg
- * @param string $descMsgParam
+ * @param $text String: description of the row
+ * @param $number Float: a statistical number
+ * @param $trExtraParams Array: params to table row, see Html::elememt
+ * @param $descMsg String: message key
+ * @param $descMsgParam Array: message params
* @return string table row in HTML format
*/
private function formatRow( $text, $number, $trExtraParams = array(), $descMsg = '', $descMsgParam = '' ) {
- global $wgStylePath;
if( $descMsg ) {
$descriptionText = wfMsgExt( $descMsg, array( 'parseinline' ), $descMsgParam );
if ( !wfEmptyMsg( $descMsg, $descriptionText ) ) {
@@ -118,10 +124,11 @@ class SpecialStatistics extends SpecialPage {
$descriptionText );
}
}
- return Xml::openElement( 'tr', $trExtraParams ) .
- Xml::openElement( 'td' ) . $text . Xml::closeElement( 'td' ) .
- Xml::openElement( 'td', array( 'class' => 'mw-statistics-numbers' ) ) . $number . Xml::closeElement( 'td' ) .
- Xml::closeElement( 'tr' );
+ return
+ Html::rawElement( 'tr', $trExtraParams,
+ Html::rawElement( 'td', array(), $text ) .
+ Html::rawElement( 'td', array( 'class' => 'mw-statistics-numbers' ), $number )
+ );
}
/**
@@ -155,13 +162,11 @@ class SpecialStatistics extends SpecialPage {
array( 'class' => 'mw-statistics-edits' ) ) .
$this->formatRow( wfMsgExt( 'statistics-edits-average', array( 'parseinline' ) ),
$wgLang->formatNum( sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 ) ),
- array( 'class' => 'mw-statistics-edits-average' ) ) .
- $this->formatRow( wfMsgExt( 'statistics-jobqueue', array( 'parseinline' ) ),
- $wgLang->formatNum( $this->numJobs ),
- array( 'class' => 'mw-statistics-jobqueue' ) );
+ array( 'class' => 'mw-statistics-edits-average' ) );
}
+
private function getUserStats() {
- global $wgLang, $wgUser, $wgRCMaxAge;
+ global $wgLang, $wgUser, $wgActiveUserDays;
$sk = $wgUser->getSkin();
return Xml::openElement( 'tr' ) .
Xml::tags( 'th', array( 'colspan' => '2' ), wfMsgExt( 'statistics-header-users', array( 'parseinline' ) ) ) .
@@ -180,8 +185,9 @@ class SpecialStatistics extends SpecialPage {
$wgLang->formatNum( $this->activeUsers ),
array( 'class' => 'mw-statistics-users-active' ),
'statistics-users-active-desc',
- $wgLang->formatNum( ceil( $wgRCMaxAge / ( 3600 * 24 ) ) ) );
+ $wgLang->formatNum( $wgActiveUserDays ) );
}
+
private function getGroupStats() {
global $wgGroupPermissions, $wgImplicitGroups, $wgLang, $wgUser;
$sk = $wgUser->getSkin();
@@ -228,6 +234,7 @@ class SpecialStatistics extends SpecialPage {
}
return $text;
}
+
private function getViewsStats() {
global $wgLang;
return Xml::openElement( 'tr' ) .
@@ -235,12 +242,13 @@ class SpecialStatistics extends SpecialPage {
Xml::closeElement( 'tr' ) .
$this->formatRow( wfMsgExt( 'statistics-views-total', array( 'parseinline' ) ),
$wgLang->formatNum( $this->views ),
- array ( 'class' => 'mw-statistics-views-total' ) ) .
+ array ( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
$this->formatRow( wfMsgExt( 'statistics-views-peredit', array( 'parseinline' ) ),
$wgLang->formatNum( sprintf( '%.2f', $this->edits ?
$this->views / $this->edits : 0 ) ),
array ( 'class' => 'mw-statistics-views-peredit' ) );
}
+
private function getMostViewedPages() {
global $wgLang, $wgUser;
$text = '';
@@ -267,7 +275,7 @@ class SpecialStatistics extends SpecialPage {
$text .= Xml::openElement( 'tr' );
$text .= Xml::tags( 'th', array( 'colspan' => '2' ), wfMsgExt( 'statistics-mostpopular', array( 'parseinline' ) ) );
$text .= Xml::closeElement( 'tr' );
- while( $row = $res->fetchObject() ) {
+ foreach ( $res as $row ) {
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
if( $title instanceof Title ) {
$text .= $this->formatRow( $sk->link( $title ),
@@ -279,7 +287,7 @@ class SpecialStatistics extends SpecialPage {
}
return $text;
}
-
+
private function getOtherStats( $stats ) {
global $wgLang;
@@ -299,20 +307,4 @@ class SpecialStatistics extends SpecialPage {
return $return;
}
-
- /**
- * Do the action=raw output for this page. Legacy, but we support
- * it for backwards compatibility
- * http://lists.wikimedia.org/pipermail/wikitech-l/2008-August/039202.html
- */
- private function doRawOutput() {
- global $wgOut;
- $wgOut->disable();
- header( 'Pragma: nocache' );
- echo "total=" . $this->total . ";good=" . $this->good . ";views=" .
- $this->views . ";edits=" . $this->edits . ";users=" . $this->users . ";";
- echo "activeusers=" . $this->activeUsers . ";admins=" . $this->admins .
- ";images=" . $this->images . ";jobs=" . $this->numJobs . "\n";
- return;
- }
-} \ No newline at end of file
+}
diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php
index 57feeae7..c2aecf47 100644
--- a/includes/specials/SpecialTags.php
+++ b/includes/specials/SpecialTags.php
@@ -1,8 +1,34 @@
<?php
+/**
+ * Implements Special:Tags
+ *
+ * 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
+ */
if (!defined('MEDIAWIKI'))
die;
+/**
+ * A special page that lists tags for edits
+ *
+ * @ingroup SpecialPage
+ */
class SpecialTags extends SpecialPage {
function __construct() {
@@ -10,16 +36,12 @@ class SpecialTags extends SpecialPage {
}
function execute( $par ) {
- global $wgOut, $wgUser, $wgMessageCache;
+ global $wgOut;
- $wgMessageCache->loadAllMessages();
-
- $sk = $wgUser->getSkin();
$wgOut->setPageTitle( wfMsg( 'tags-title' ) );
- $wgOut->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1</div>", 'tags-intro' );
+ $wgOut->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
// Write the headers
- $html = '';
$html = Xml::tags( 'tr', null, Xml::tags( 'th', null, wfMsgExt( 'tags-tag', 'parseinline' ) ) .
Xml::tags( 'th', null, wfMsgExt( 'tags-display-header', 'parseinline' ) ) .
Xml::tags( 'th', null, wfMsgExt( 'tags-description-header', 'parseinline' ) ) .
@@ -28,7 +50,7 @@ class SpecialTags extends SpecialPage {
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'change_tag', array( 'ct_tag', 'count(*) as hitcount' ), array(), __METHOD__, array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' ) );
- while ( $row = $res->fetchObject() ) {
+ foreach ( $res as $row ) {
$html .= $this->doTagRow( $row->ct_tag, $row->hitcount );
}
@@ -72,4 +94,4 @@ class SpecialTags extends SpecialPage {
return Xml::tags( 'tr', null, $newRow ) . "\n";
}
-} \ No newline at end of file
+}
diff --git a/includes/specials/SpecialUncategorizedcategories.php b/includes/specials/SpecialUncategorizedcategories.php
index f23e89ce..9574af70 100644
--- a/includes/specials/SpecialUncategorizedcategories.php
+++ b/includes/specials/SpecialUncategorizedcategories.php
@@ -1,15 +1,33 @@
<?php
/**
+ * Implements Special:Uncategorizedcategories
+ *
+ * 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
*/
/**
- * implements Special:Uncategorizedcategories
+ * A special page that lists uncategorized categories
+ *
* @ingroup SpecialPage
*/
class UncategorizedCategoriesPage extends UncategorizedPagesPage {
- function UncategorizedCategoriesPage() {
+ function __construct() {
$this->requestedNamespace = NS_CATEGORY;
}
diff --git a/includes/specials/SpecialUncategorizedimages.php b/includes/specials/SpecialUncategorizedimages.php
index 25310081..c4254039 100644
--- a/includes/specials/SpecialUncategorizedimages.php
+++ b/includes/specials/SpecialUncategorizedimages.php
@@ -1,6 +1,21 @@
<?php
/**
- * Special page lists images which haven't been categorised
+ * Implements Special:Uncategorizedimages
+ *
+ * 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
@@ -8,6 +23,8 @@
*/
/**
+ * Special page lists images which haven't been categorised
+ *
* @ingroup SpecialPage
*/
class UncategorizedImagesPage extends ImageQueryPage {
diff --git a/includes/specials/SpecialUncategorizedpages.php b/includes/specials/SpecialUncategorizedpages.php
index e7f0aaca..c7fef5d2 100644
--- a/includes/specials/SpecialUncategorizedpages.php
+++ b/includes/specials/SpecialUncategorizedpages.php
@@ -1,11 +1,29 @@
<?php
/**
+ * Implements Special:Uncategorizedpages
+ *
+ * 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
*/
/**
* A special page looking for page without any category.
+ *
* @ingroup SpecialPage
*/
class UncategorizedPagesPage extends PageQueryPage {
diff --git a/includes/specials/SpecialUncategorizedtemplates.php b/includes/specials/SpecialUncategorizedtemplates.php
index 7e6fd24b..aa4e979d 100644
--- a/includes/specials/SpecialUncategorizedtemplates.php
+++ b/includes/specials/SpecialUncategorizedtemplates.php
@@ -1,7 +1,25 @@
<?php
/**
+ * Implements Special:Uncategorizedtemplates
+ *
+ * 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
+ * @author Rob Church <robchur@gmail.com>
*/
/**
@@ -9,7 +27,6 @@
* template namespace
*
* @ingroup SpecialPage
- * @author Rob Church <robchur@gmail.com>
*/
class UncategorizedTemplatesPage extends UncategorizedPagesPage {
diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php
index 4db4e633..1cf61d26 100644
--- a/includes/specials/SpecialUndelete.php
+++ b/includes/specials/SpecialUndelete.php
@@ -1,25 +1,29 @@
<?php
-
/**
- * Special page allowing users with the appropriate permissions to view
- * and restore deleted content
+ * Implements Special:Undelete
+ *
+ * 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
*/
/**
- * Constructor
- */
-function wfSpecialUndelete( $par ) {
- global $wgRequest;
-
- $form = new UndeleteForm( $wgRequest, $par );
- $form->execute();
-}
-
-/**
* Used to show archived pages and eventually restore them.
+ *
* @ingroup SpecialPage
*/
class PageArchive {
@@ -28,7 +32,7 @@ class PageArchive {
function __construct( $title ) {
if( is_null( $title ) ) {
- throw new MWException( 'Archiver() given a null title.');
+ throw new MWException( __METHOD__ . ' given a null title.' );
}
$this->title = $title;
}
@@ -50,6 +54,7 @@ class PageArchive {
* given title prefix.
* Returns result wrapper with (ar_namespace, ar_title, count) fields.
*
+ * @param $prefix String: title prefix
* @return ResultWrapper
*/
public static function listPagesByPrefix( $prefix ) {
@@ -153,7 +158,8 @@ class PageArchive {
* Fetch (and decompress if necessary) the stored text for the deleted
* revision of the page with the given timestamp.
*
- * @return string
+ * @param $timestamp String
+ * @return String
* @deprecated Use getRevision() for more flexible information
*/
function getRevisionText( $timestamp ) {
@@ -164,7 +170,8 @@ class PageArchive {
/**
* Return a Revision object containing data for the deleted revision.
* Note that the result *may* or *may not* have a null page ID.
- * @param string $timestamp
+ *
+ * @param $timestamp String
* @return Revision
*/
function getRevision( $timestamp ) {
@@ -200,7 +207,7 @@ class PageArchive {
* May produce unexpected results in case of history merges or other
* unusual time issues.
*
- * @param string $timestamp
+ * @param $timestamp String
* @return Revision or null
*/
function getPreviousRevision( $timestamp ) {
@@ -248,6 +255,9 @@ class PageArchive {
/**
* Get the text from an archive row containing ar_text, ar_flags and ar_text_id
+ *
+ * @param $row Object: database row
+ * @return Revision
*/
function getTextFromRow( $row ) {
if( is_null( $row->ar_text_id ) ) {
@@ -272,7 +282,7 @@ class PageArchive {
*
* If there are no archived revisions for the page, returns NULL.
*
- * @return string
+ * @return String
*/
function getLastRevisionText() {
$dbr = wfGetDB( DB_SLAVE );
@@ -280,7 +290,7 @@ class PageArchive {
array( 'ar_text', 'ar_flags', 'ar_text_id' ),
array( 'ar_namespace' => $this->title->getNamespace(),
'ar_title' => $this->title->getDBkey() ),
- 'PageArchive::getLastRevisionText',
+ __METHOD__,
array( 'ORDER BY' => 'ar_timestamp DESC' ) );
if( $row ) {
return $this->getTextFromRow( $row );
@@ -291,7 +301,8 @@ class PageArchive {
/**
* Quick check if any archived revisions are present for the page.
- * @return bool
+ *
+ * @return Boolean
*/
function isDeleted() {
$dbr = wfGetDB( DB_SLAVE );
@@ -306,10 +317,10 @@ class PageArchive {
* Once restored, the items will be removed from the archive tables.
* The deletion log will be updated with an undeletion notice.
*
- * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
- * @param string $comment
- * @param array $fileVersions
- * @param bool $unsuppress
+ * @param $timestamps Array: pass an empty array to restore all revisions, otherwise list the ones to undelete.
+ * @param $comment String
+ * @param $fileVersions Array
+ * @param $unsuppress Boolean
*
* @return array(number of file revisions restored, number of image revisions restored, log message)
* on success, false on failure
@@ -369,12 +380,11 @@ class PageArchive {
* to the cur/old tables. If the page currently exists, all revisions will
* be stuffed into old, otherwise the most recent will go into cur.
*
- * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
- * @param string $comment
- * @param array $fileVersions
- * @param bool $unsuppress, remove all ar_deleted/fa_deleted restrictions of seletected revs
+ * @param $timestamps Array: pass an empty array to restore all revisions, otherwise list the ones to undelete.
+ * @param $comment String
+ * @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
*
- * @return mixed number of revisions restored or false on failure
+ * @return Mixed: number of revisions restored or false on failure
*/
private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
if ( wfReadOnly() )
@@ -482,7 +492,7 @@ class PageArchive {
$revision = null;
$restored = 0;
- while( $row = $ret->fetchObject() ) {
+ foreach ( $ret as $row ) {
// Check for key dupes due to shitty archive integrity.
if( $row->ar_rev_id ) {
$exists = $dbw->selectField( 'revision', '1', array('rev_id' => $row->ar_rev_id), __METHOD__ );
@@ -490,12 +500,12 @@ class PageArchive {
}
// Insert one revision at a time...maintaining deletion status
// unless we are specifically removing all restrictions...
- $revision = Revision::newFromArchiveRow( $row,
- array(
- 'page' => $pageId,
+ $revision = Revision::newFromArchiveRow( $row,
+ array(
+ 'page' => $pageId,
'deleted' => $unsuppress ? 0 : $row->ar_deleted
) );
-
+
$revision->insertOn( $dbw );
$restored++;
@@ -508,7 +518,7 @@ class PageArchive {
'ar_title' => $this->title->getDBkey(),
$oldones ),
__METHOD__ );
-
+
// Was anything restored at all?
if( $restored == 0 )
return 0;
@@ -535,7 +545,8 @@ class PageArchive {
}
} else {
// Revision couldn't be created. This is very weird
- return self::UNDELETE_UNKNOWNERR;
+ wfDebug( "Undelete: unknown error...\n" );
+ return false;
}
return $restored;
@@ -545,36 +556,45 @@ class PageArchive {
}
/**
- * The HTML form for Special:Undelete, which allows users with the appropriate
- * permissions to view and restore deleted content.
+ * Special page allowing users with the appropriate permissions to view
+ * and restore deleted content.
+ *
* @ingroup SpecialPage
*/
-class UndeleteForm {
+class UndeleteForm extends SpecialPage {
var $mAction, $mTarget, $mTimestamp, $mRestore, $mInvert, $mTargetObj;
- var $mTargetTimestamp, $mAllowed, $mCanView, $mComment, $mToken;
+ var $mTargetTimestamp, $mAllowed, $mCanView, $mComment, $mToken, $mRequest;
- function UndeleteForm( $request, $par = "" ) {
+ function __construct( $request = null ) {
+ parent::__construct( 'Undelete', 'deletedhistory' );
+
+ if ( $request === null ) {
+ global $wgRequest;
+ $this->mRequest = $wgRequest;
+ } else {
+ $this->mRequest = $request;
+ }
+ }
+
+ function loadRequest() {
global $wgUser;
- $this->mAction = $request->getVal( 'action' );
- $this->mTarget = $request->getVal( 'target' );
- $this->mSearchPrefix = $request->getText( 'prefix' );
- $time = $request->getVal( 'timestamp' );
+ $this->mAction = $this->mRequest->getVal( 'action' );
+ $this->mTarget = $this->mRequest->getVal( 'target' );
+ $this->mSearchPrefix = $this->mRequest->getText( 'prefix' );
+ $time = $this->mRequest->getVal( 'timestamp' );
$this->mTimestamp = $time ? wfTimestamp( TS_MW, $time ) : '';
- $this->mFile = $request->getVal( 'file' );
-
- $posted = $request->wasPosted() &&
- $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
- $this->mRestore = $request->getCheck( 'restore' ) && $posted;
- $this->mInvert = $request->getCheck( 'invert' ) && $posted;
- $this->mPreview = $request->getCheck( 'preview' ) && $posted;
- $this->mDiff = $request->getCheck( 'diff' );
- $this->mComment = $request->getText( 'wpComment' );
- $this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
- $this->mToken = $request->getVal( 'token' );
-
- if( $par != "" ) {
- $this->mTarget = $par;
- }
+ $this->mFile = $this->mRequest->getVal( 'file' );
+
+ $posted = $this->mRequest->wasPosted() &&
+ $wgUser->matchEditToken( $this->mRequest->getVal( 'wpEditToken' ) );
+ $this->mRestore = $this->mRequest->getCheck( 'restore' ) && $posted;
+ $this->mInvert = $this->mRequest->getCheck( 'invert' ) && $posted;
+ $this->mPreview = $this->mRequest->getCheck( 'preview' ) && $posted;
+ $this->mDiff = $this->mRequest->getCheck( 'diff' );
+ $this->mComment = $this->mRequest->getText( 'wpComment' );
+ $this->mUnsuppress = $this->mRequest->getVal( 'wpUnsuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
+ $this->mToken = $this->mRequest->getVal( 'token' );
+
if ( $wgUser->isAllowed( 'undelete' ) && !$wgUser->isBlocked() ) {
$this->mAllowed = true; // user can restore
$this->mCanView = true; // user can view content
@@ -587,11 +607,7 @@ class UndeleteForm {
$this->mTimestamp = '';
$this->mRestore = false;
}
- if ( $this->mTarget !== "" ) {
- $this->mTargetObj = Title::newFromURL( $this->mTarget );
- } else {
- $this->mTargetObj = null;
- }
+
if( $this->mRestore || $this->mInvert ) {
$timestamps = array();
$this->mFileVersions = array();
@@ -610,14 +626,33 @@ class UndeleteForm {
}
}
- function execute() {
+ function execute( $par ) {
global $wgOut, $wgUser;
+
+ $this->setHeaders();
+ if ( !$this->userCanExecute( $wgUser ) ) {
+ $this->displayRestrictionError();
+ return;
+ }
+ $this->outputHeader();
+
+ $this->loadRequest();
+
if ( $this->mAllowed ) {
$wgOut->setPagetitle( wfMsg( "undeletepage" ) );
} else {
$wgOut->setPagetitle( wfMsg( "viewdeletedpage" ) );
}
+ if( $par != '' ) {
+ $this->mTarget = $par;
+ }
+ if ( $this->mTarget !== '' ) {
+ $this->mTargetObj = Title::newFromURL( $this->mTarget );
+ } else {
+ $this->mTargetObj = null;
+ }
+
if( is_null( $this->mTargetObj ) ) {
# Not all users can just browse every deleted page from the list
if( $wgUser->isAllowed( 'browsearchive' ) ) {
@@ -659,7 +694,7 @@ class UndeleteForm {
if( $this->mRestore && $this->mAction == "submit" ) {
global $wgUploadMaintenance;
if( $wgUploadMaintenance && $this->mTargetObj && $this->mTargetObj->getNamespace() == NS_FILE ) {
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1</div>\n", array( 'filedelete-maintenance' ) );
+ $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n", array( 'filedelete-maintenance' ) );
return;
}
return $this->undelete();
@@ -679,8 +714,8 @@ class UndeleteForm {
'method' => 'get',
'action' => $wgScript ) ) .
Xml::fieldset( wfMsg( 'undelete-search-box' ) ) .
- Xml::hidden( 'title',
- SpecialPage::getTitleFor( 'Undelete' )->getPrefixedDbKey() ) .
+ Html::hidden( 'title',
+ $this->getTitle()->getPrefixedDbKey() ) .
Xml::inputLabel( wfMsg( 'undelete-search-prefix' ),
'prefix', 'prefix', 20,
$this->mSearchPrefix ) . ' ' .
@@ -692,7 +727,7 @@ class UndeleteForm {
// Generic list of deleted pages
private function showList( $result ) {
- global $wgLang, $wgContLang, $wgUser, $wgOut;
+ global $wgLang, $wgUser, $wgOut;
if( $result->numRows() == 0 ) {
$wgOut->addWikiMsg( 'undelete-no-results' );
@@ -702,9 +737,9 @@ class UndeleteForm {
$wgOut->addWikiMsg( 'undeletepagetext', $wgLang->formatNum( $result->numRows() ) );
$sk = $wgUser->getSkin();
- $undelete = SpecialPage::getTitleFor( 'Undelete' );
+ $undelete = $this->getTitle();
$wgOut->addHTML( "<ul>\n" );
- while( $row = $result->fetchObject() ) {
+ foreach ( $result as $row ) {
$title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title );
$link = $sk->linkKnown(
$undelete,
@@ -725,7 +760,7 @@ class UndeleteForm {
private function showRevision( $timestamp ) {
global $wgLang, $wgUser, $wgOut;
- $self = SpecialPage::getTitleFor( 'Undelete' );
+
$skin = $wgUser->getSkin();
if(!preg_match("/[0-9]{14}/",$timestamp)) return 0;
@@ -740,10 +775,10 @@ class UndeleteForm {
if( $rev->isDeleted(Revision::DELETED_TEXT) ) {
if( !$rev->userCan(Revision::DELETED_TEXT) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", 'rev-deleted-text-permission' );
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
return;
} else {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1</div>\n", 'rev-deleted-text-view' );
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
$wgOut->addHTML( '<br />' );
// and we are allowed to see...
}
@@ -752,7 +787,7 @@ class UndeleteForm {
$wgOut->setPageTitle( wfMsg( 'undeletepage' ) );
$link = $skin->linkKnown(
- SpecialPage::getTitleFor( 'Undelete', $this->mTargetObj->getPrefixedDBkey() ),
+ $this->getTitle( $this->mTargetObj->getPrefixedDBkey() ),
htmlspecialchars( $this->mTargetObj->getPrefixedText() )
);
@@ -823,7 +858,7 @@ class UndeleteForm {
Xml::openElement( 'div' ) .
Xml::openElement( 'form', array(
'method' => 'post',
- 'action' => $self->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
+ 'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
Xml::element( 'input', array(
'type' => 'hidden',
'name' => 'target',
@@ -851,14 +886,15 @@ class UndeleteForm {
/**
* Build a diff display between this and the previous either deleted
* or non-deleted edit.
- * @param Revision $previousRev
- * @param Revision $currentRev
- * @return string HTML
+ *
+ * @param $previousRev Revision
+ * @param $currentRev Revision
+ * @return String: HTML
*/
function showDiff( $previousRev, $currentRev ) {
global $wgOut;
- $diffEngine = new DifferenceEngine();
+ $diffEngine = new DifferenceEngine( $previousRev->getTitle() );
$diffEngine->showDiffStyle();
$wgOut->addHTML(
"<div>" .
@@ -888,7 +924,7 @@ class UndeleteForm {
$isDeleted = !( $rev->getId() && $rev->getTitle() );
if( $isDeleted ) {
/// @todo Fixme: $rev->getTitle() is null for deleted revs...?
- $targetPage = SpecialPage::getTitleFor( 'Undelete' );
+ $targetPage = $this->getTitle();
$targetQuery = array(
'target' => $this->mTargetObj->getPrefixedText(),
'timestamp' => wfTimestamp( TS_MW, $rev->getTimestamp() )
@@ -905,7 +941,7 @@ class UndeleteForm {
if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
$del .= $sk->revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
} else {
- $query = array(
+ $query = array(
'type' => 'archive',
'target' => $this->mTargetObj->getPrefixedDbkey(),
'ids' => $rev->getTimestamp()
@@ -948,10 +984,10 @@ class UndeleteForm {
$this->mTargetObj->getText(),
$wgLang->date( $file->getTimestamp() ),
$wgLang->time( $file->getTimestamp() ) );
- $wgOut->addHTML(
- Xml::openElement( 'form', array(
+ $wgOut->addHTML(
+ Xml::openElement( 'form', array(
'method' => 'POST',
- 'action' => SpecialPage::getTitleFor( 'Undelete' )->getLocalUrl(
+ 'action' => $this->getTitle()->getLocalUrl(
'target=' . urlencode( $this->mTarget ) .
'&file=' . urlencode( $key ) .
'&token=' . urlencode( $wgUser->editToken( $key ) ) )
@@ -979,13 +1015,13 @@ class UndeleteForm {
global $IP;
require_once( "$IP/includes/StreamFile.php" );
- $repo = RepoGroup::singleton()->getLocalRepo();
+ $repo = RepoGroup::singleton()->getLocalRepo();
$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
wfStreamFile( $path );
}
private function showHistory( ) {
- global $wgLang, $wgUser, $wgOut;
+ global $wgUser, $wgOut;
$sk = $wgUser->getSkin();
if( $this->mAllowed ) {
@@ -994,7 +1030,7 @@ class UndeleteForm {
$wgOut->setPagetitle( wfMsg( 'viewdeletedpage' ) );
}
- $wgOut->wrapWikiMsg( "<div class='mw-undelete-pagetitle'>\n$1</div>\n", array ( 'undeletepagetitle', $this->mTargetObj->getPrefixedText() ) );
+ $wgOut->wrapWikiMsg( "<div class='mw-undelete-pagetitle'>\n$1\n</div>\n", array ( 'undeletepagetitle', $this->mTargetObj->getPrefixedText() ) );
$archive = new PageArchive( $this->mTargetObj );
/*
@@ -1023,7 +1059,7 @@ class UndeleteForm {
# Batch existence check on user and talk pages
if( $haveRevisions ) {
$batch = new LinkBatch();
- while( $row = $revisions->fetchObject() ) {
+ foreach ( $revisions as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_USER, $row->ar_user_text ) );
$batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->ar_user_text ) );
}
@@ -1032,7 +1068,7 @@ class UndeleteForm {
}
if( $haveFiles ) {
$batch = new LinkBatch();
- while( $row = $files->fetchObject() ) {
+ foreach ( $files as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_USER, $row->fa_user_text ) );
$batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->fa_user_text ) );
}
@@ -1041,8 +1077,7 @@ class UndeleteForm {
}
if ( $this->mAllowed ) {
- $titleObj = SpecialPage::getTitleFor( "Undelete" );
- $action = $titleObj->getLocalURL( array( 'action' => 'submit' ) );
+ $action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
# Start the form here
$top = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' ) );
$wgOut->addHTML( $top );
@@ -1063,7 +1098,7 @@ class UndeleteForm {
if( $wgUser->isAllowed( 'suppressrevision' ) ) {
$unsuppressBox =
"<tr>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-input'>" .
Xml::checkLabel( wfMsg('revdelete-unsuppress'), 'wpUnsuppress',
'mw-undelete-unsuppress', $this->mUnsuppress ).
@@ -1089,7 +1124,7 @@ class UndeleteForm {
"</td>
</tr>
<tr>
- <td>&nbsp;</td>
+ <td>&#160;</td>
<td class='mw-submit'>" .
Xml::submitButton( wfMsg( 'undeletebtn' ), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
Xml::element( 'input', array( 'type' => 'reset', 'value' => wfMsg( 'undeletereset' ), 'id' => 'mw-undelete-reset' ) ) . ' ' .
@@ -1108,11 +1143,10 @@ class UndeleteForm {
if( $haveRevisions ) {
# The page's stored (deleted) history:
$wgOut->addHTML("<ul>");
- $target = urlencode( $this->mTarget );
$remaining = $revisions->numRows();
$earliestLiveTime = $this->mTargetObj->getEarliestRevTime();
- while( $row = $revisions->fetchObject() ) {
+ foreach ( $revisions as $row ) {
$remaining--;
$wgOut->addHTML( $this->formatRevisionRow( $row, $earliestLiveTime, $remaining, $sk ) );
}
@@ -1125,7 +1159,7 @@ class UndeleteForm {
if( $haveFiles ) {
$wgOut->addHTML( Xml::element( 'h2', null, wfMsg( 'filehist' ) ) . "\n" );
$wgOut->addHTML( "<ul>" );
- while( $row = $files->fetchObject() ) {
+ foreach ( $files as $row ) {
$wgOut->addHTML( $this->formatFileRow( $row, $sk ) );
}
$files->free();
@@ -1134,8 +1168,8 @@ class UndeleteForm {
if ( $this->mAllowed ) {
# Slip in the hidden controls here
- $misc = Xml::hidden( 'target', $this->mTarget );
- $misc .= Xml::hidden( 'wpEditToken', $wgUser->editToken() );
+ $misc = Html::hidden( 'target', $this->mTarget );
+ $misc .= Html::hidden( 'wpEditToken', $wgUser->editToken() );
$misc .= Xml::closeElement( 'form' );
$wgOut->addHTML( $misc );
}
@@ -1146,7 +1180,7 @@ class UndeleteForm {
private function formatRevisionRow( $row, $earliestLiveTime, $remaining, $sk ) {
global $wgUser, $wgLang;
- $rev = Revision::newFromArchiveRow( $row,
+ $rev = Revision::newFromArchiveRow( $row,
array( 'page' => $this->mTargetObj->getArticleId() ) );
$stxt = '';
$ts = wfTimestamp( TS_MW, $row->ar_timestamp );
@@ -1166,7 +1200,7 @@ class UndeleteForm {
}
// Build page & diff links...
if( $this->mCanView ) {
- $titleObj = SpecialPage::getTitleFor( "Undelete" );
+ $titleObj = $this->getTitle();
# Last link
if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
$pageLink = htmlspecialchars( $wgLang->timeanddate( $ts, true ) );
@@ -1228,14 +1262,12 @@ class UndeleteForm {
if( $this->mAllowed && $row->fa_storage_key ) {
$checkBox = Xml::check( "fileid" . $row->fa_id );
$key = urlencode( $row->fa_storage_key );
- $target = urlencode( $this->mTarget );
- $titleObj = SpecialPage::getTitleFor( "Undelete" );
- $pageLink = $this->getFileLink( $file, $titleObj, $ts, $key, $sk );
+ $pageLink = $this->getFileLink( $file, $this->getTitle(), $ts, $key, $sk );
} else {
$checkBox = '';
$pageLink = $wgLang->timeanddate( $ts, true );
}
- $userLink = $this->getFileUser( $file, $sk );
+ $userLink = $this->getFileUser( $file, $sk );
$data =
wfMsg( 'widthheight',
$wgLang->formatNum( $row->fa_width ),
@@ -1294,7 +1326,8 @@ class UndeleteForm {
/**
* Fetch image view link if it's available to all users
- * @return string
+ *
+ * @return String: HTML fragment
*/
function getFileLink( $file, $titleObj, $ts, $key, $sk ) {
global $wgLang, $wgUser;
@@ -1320,7 +1353,8 @@ class UndeleteForm {
/**
* Fetch file's user id if it's available to this user
- * @return string
+ *
+ * @return String: HTML fragment
*/
function getFileUser( $file, $sk ) {
if( !$file->userCan(File::DELETED_USER) ) {
@@ -1336,7 +1370,8 @@ class UndeleteForm {
/**
* Fetch file upload comment if it's available to this user
- * @return string
+ *
+ * @return String: HTML fragment
*/
function getFileComment( $file, $sk ) {
if( !$file->userCan(File::DELETED_COMMENT) ) {
diff --git a/includes/specials/SpecialUnlockdb.php b/includes/specials/SpecialUnlockdb.php
index fe38a48a..c71b554b 100644
--- a/includes/specials/SpecialUnlockdb.php
+++ b/includes/specials/SpecialUnlockdb.php
@@ -1,39 +1,62 @@
<?php
/**
+ * Implements Special:Unlockdb
+ *
+ * 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
*/
/**
+ * Implements Special:Unlockdb
*
+ * @ingroup SpecialPage
*/
-function wfSpecialUnlockdb() {
- global $wgUser, $wgOut, $wgRequest;
+class SpecialUnlockdb extends SpecialPage {
- if( !$wgUser->isAllowed( 'siteadmin' ) ) {
- $wgOut->permissionRequired( 'siteadmin' );
- return;
+ public function __construct() {
+ parent::__construct( 'Unlockdb', 'siteadmin' );
}
- $action = $wgRequest->getVal( 'action' );
- $f = new DBUnlockForm();
+ public function execute( $par ) {
+ global $wgUser, $wgOut, $wgRequest;
+
+ $this->setHeaders();
+
+ if( !$wgUser->isAllowed( 'siteadmin' ) ) {
+ $wgOut->permissionRequired( 'siteadmin' );
+ return;
+ }
+
+ $this->outputHeader();
+
+ $action = $wgRequest->getVal( 'action' );
- if ( "success" == $action ) {
- $f->showSuccess();
- } else if ( "submit" == $action && $wgRequest->wasPosted() &&
- $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- $f->doSubmit();
- } else {
- $f->showForm( "" );
+ if ( $action == 'success' ) {
+ $this->showSuccess();
+ } else if ( $action == 'submit' && $wgRequest->wasPosted() &&
+ $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
+ $this->doSubmit();
+ } else {
+ $this->showForm();
+ }
}
-}
-/**
- * @ingroup SpecialPage
- */
-class DBUnlockForm {
- function showForm( $err )
- {
+ private function showForm( $err = '' ) {
global $wgOut, $wgUser;
global $wgReadOnlyFile;
@@ -42,65 +65,57 @@ class DBUnlockForm {
return;
}
- $wgOut->setPagetitle( wfMsg( "unlockdb" ) );
- $wgOut->addWikiMsg( "unlockdbtext" );
+ $wgOut->addWikiMsg( 'unlockdbtext' );
- if ( $err != "" ) {
- $wgOut->setSubtitle( wfMsg( "formerror" ) );
+ if ( $err != '' ) {
+ $wgOut->setSubtitle( wfMsg( 'formerror' ) );
$wgOut->addHTML( '<p class="error">' . htmlspecialchars( $err ) . "</p>\n" );
}
- $lc = htmlspecialchars( wfMsg( "unlockconfirm" ) );
- $lb = htmlspecialchars( wfMsg( "unlockbtn" ) );
- $titleObj = SpecialPage::getTitleFor( "Unlockdb" );
- $action = $titleObj->escapeLocalURL( "action=submit" );
- $token = htmlspecialchars( $wgUser->editToken() );
- $wgOut->addHTML( <<<HTML
-
-<form id="unlockdb" method="post" action="{$action}">
-<table border="0">
+ $wgOut->addHTML(
+ Html::openElement( 'form', array( 'id' => 'unlockdb', 'method' => 'POST',
+ 'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) ) . "
+<table>
<tr>
- <td align="right">
- <input type="checkbox" name="wpLockConfirm" />
+ " . Html::openElement( 'td', array( 'style' => 'text-align:right' ) ) . "
+ " . Html::input( 'wpLockConfirm', null, 'checkbox' ) . "
</td>
- <td align="left">{$lc}</td>
+ " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) .
+ wfMsgHtml( 'unlockconfirm' ) . "</td>
</tr>
<tr>
- <td>&nbsp;</td>
- <td align="left">
- <input type="submit" name="wpLock" value="{$lb}" />
+ <td>&#160;</td>
+ " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) . "
+ " . Html::input( 'wpLock', wfMsg( 'unlockbtn' ), 'submit' ) . "
</td>
</tr>
-</table>
-<input type="hidden" name="wpEditToken" value="{$token}" />
-</form>
-HTML
-);
+</table>\n" .
+ Html::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n" .
+ Html::closeElement( 'form' )
+ );
}
- function doSubmit() {
+ private function doSubmit() {
global $wgOut, $wgRequest, $wgReadOnlyFile;
$wpLockConfirm = $wgRequest->getCheck( 'wpLockConfirm' );
- if ( ! $wpLockConfirm ) {
- $this->showForm( wfMsg( "locknoconfirm" ) );
+ if ( !$wpLockConfirm ) {
+ $this->showForm( wfMsg( 'locknoconfirm' ) );
return;
}
- if ( @! unlink( $wgReadOnlyFile ) ) {
+ if ( @!unlink( $wgReadOnlyFile ) ) {
$wgOut->showFileDeleteError( $wgReadOnlyFile );
return;
}
- $titleObj = SpecialPage::getTitleFor( "Unlockdb" );
- $success = $titleObj->getFullURL( "action=success" );
- $wgOut->redirect( $success );
+
+ $wgOut->redirect( $this->getTitle()->getFullURL( 'action=success' ) );
}
- function showSuccess() {
+ private function showSuccess() {
global $wgOut;
- $wgOut->setPagetitle( wfMsg( "unlockdb" ) );
- $wgOut->setSubtitle( wfMsg( "unlockdbsuccesssub" ) );
- $wgOut->addWikiMsg( "unlockdbsuccesstext" );
+ $wgOut->setSubtitle( wfMsg( 'unlockdbsuccesssub' ) );
+ $wgOut->addWikiMsg( 'unlockdbsuccesstext' );
}
}
diff --git a/includes/specials/SpecialUnusedcategories.php b/includes/specials/SpecialUnusedcategories.php
index fe7d7a17..a20efe09 100644
--- a/includes/specials/SpecialUnusedcategories.php
+++ b/includes/specials/SpecialUnusedcategories.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:Unusedcategories
+ *
+ * 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
*/
diff --git a/includes/specials/SpecialUnusedimages.php b/includes/specials/SpecialUnusedimages.php
index 9d9868f6..091ec3a3 100644
--- a/includes/specials/SpecialUnusedimages.php
+++ b/includes/specials/SpecialUnusedimages.php
@@ -1,11 +1,29 @@
<?php
/**
+ * Implements Special:Unusedimages
+ *
+ * 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
*/
/**
- * implements Special:Unusedimages
+ * A special page that lists unused images
+ *
* @ingroup SpecialPage
*/
class UnusedimagesPage extends ImageQueryPage {
@@ -22,22 +40,11 @@ class UnusedimagesPage extends ImageQueryPage {
function isSyndicated() { return false; }
function getSQL() {
- global $wgCountCategorizedImagesAsUsed, $wgDBtype;
+ global $wgCountCategorizedImagesAsUsed;
+
$dbr = wfGetDB( DB_SLAVE );
- switch ($wgDBtype) {
- case 'mysql':
- $epoch = 'UNIX_TIMESTAMP(img_timestamp)';
- break;
- case 'oracle':
- $epoch = '((trunc(img_timestamp) - to_date(\'19700101\',\'YYYYMMDD\')) * 86400)';
- break;
- case 'sqlite':
- $epoch = 'img_timestamp';
- break;
- default:
- $epoch = 'EXTRACT(epoch FROM img_timestamp)';
- }
+ $epoch = $dbr->unixTimestamp( 'img_timestamp' );
if ( $wgCountCategorizedImagesAsUsed ) {
list( $page, $image, $imagelinks, $categorylinks ) = $dbr->tableNamesN( 'page', 'image', 'imagelinks', 'categorylinks' );
diff --git a/includes/specials/SpecialUnusedtemplates.php b/includes/specials/SpecialUnusedtemplates.php
index 6ddbab32..68bf95a2 100644
--- a/includes/specials/SpecialUnusedtemplates.php
+++ b/includes/specials/SpecialUnusedtemplates.php
@@ -1,14 +1,32 @@
<?php
/**
+ * Implements Special:Unusedtemplates
+ *
+ * Copyright © 2006 Rob Church
+ *
+ * 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
+ * @author Rob Church <robchur@gmail.com>
*/
/**
- * implements Special:Unusedtemplates
- * @author Rob Church <robchur@gmail.com>
- * @copyright © 2006 Rob Church
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * A special page that lists unused templates
+ *
* @ingroup SpecialPage
*/
class UnusedtemplatesPage extends QueryPage {
diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php
index 483afdaa..ecd62cb7 100644
--- a/includes/specials/SpecialUnwatchedpages.php
+++ b/includes/specials/SpecialUnwatchedpages.php
@@ -1,17 +1,33 @@
<?php
/**
+ * Implements Special:Unwatchedpages
+ *
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason
+ *
+ * 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
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
*/
/**
* A special page that displays a list of pages that are not on anyones watchlist.
- * Implements Special:Unwatchedpages
*
* @ingroup SpecialPage
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class UnwatchedpagesPage extends QueryPage {
diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php
index 68ee8efc..893e4be2 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -1,18 +1,38 @@
<?php
/**
+ * Implements Special:Upload
+ *
+ * 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 Upload
- *
+ */
+
+/**
* Form for handling uploads and special page.
*
+ * @ingroup SpecialPage
+ * @ingroup Upload
*/
-
class SpecialUpload extends SpecialPage {
/**
* Constructor : initialise object
* Get data POSTed through the form and assign them to the object
- * @param WebRequest $request Data posted.
+ * @param $request WebRequest : data posted.
*/
public function __construct( $request = null ) {
global $wgRequest;
@@ -50,12 +70,11 @@ class SpecialUpload extends SpecialPage {
/** Text injection points for hooks not using HTMLForm **/
public $uploadFormTextTop;
public $uploadFormTextAfterSummary;
-
/**
* Initialize instance variables from request and create an Upload handler
*
- * @param WebRequest $request The request to extract variables from
+ * @param $request WebRequest: the request to extract variables from
*/
protected function loadRequest( $request ) {
global $wgUser;
@@ -63,14 +82,15 @@ class SpecialUpload extends SpecialPage {
$this->mRequest = $request;
$this->mSourceType = $request->getVal( 'wpSourceType', 'file' );
$this->mUpload = UploadBase::createFromRequest( $request );
- $this->mUploadClicked = $request->wasPosted()
- && ( $request->getCheck( 'wpUpload' )
+ $this->mUploadClicked = $request->wasPosted()
+ && ( $request->getCheck( 'wpUpload' )
|| $request->getCheck( 'wpUploadIgnoreWarning' ) );
// Guess the desired name from the filename if not provided
$this->mDesiredDestName = $request->getText( 'wpDestFile' );
- if( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null )
+ if( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
$this->mDesiredDestName = $request->getFileName( 'wpUploadFile' );
+ }
$this->mComment = $request->getText( 'wpUploadDescription' );
$this->mLicense = $request->getText( 'wpLicense' );
@@ -97,7 +117,7 @@ class SpecialUpload extends SpecialPage {
} else {
$this->mTokenOk = $wgUser->matchEditToken( $token );
}
-
+
$this->uploadFormTextTop = '';
$this->uploadFormTextAfterSummary = '';
}
@@ -107,8 +127,8 @@ class SpecialUpload extends SpecialPage {
* Handle permission checking elsewhere in order to be able to show
* custom error messages.
*
- * @param User $user
- * @return bool
+ * @param $user User object
+ * @return Boolean
*/
public function userCanExecute( $user ) {
return UploadBase::isEnabled() && parent::userCanExecute( $user );
@@ -118,7 +138,7 @@ class SpecialUpload extends SpecialPage {
* Special page entry point
*/
public function execute( $par ) {
- global $wgUser, $wgOut, $wgRequest;
+ global $wgUser, $wgOut;
$this->setHeaders();
$this->outputHeader();
@@ -131,13 +151,14 @@ class SpecialUpload extends SpecialPage {
# Check permissions
global $wgGroupPermissions;
- if( !$wgUser->isAllowed( 'upload' ) ) {
+ $permissionRequired = UploadBase::isAllowed( $wgUser );
+ if( $permissionRequired !== true ) {
if( !$wgUser->isLoggedIn() && ( $wgGroupPermissions['user']['upload']
|| $wgGroupPermissions['autoconfirmed']['upload'] ) ) {
// Custom message if logged-in users without any special rights can upload
$wgOut->showErrorPage( 'uploadnologin', 'uploadnologintext' );
} else {
- $wgOut->permissionRequired( 'upload' );
+ $wgOut->permissionRequired( $permissionRequired );
}
return;
}
@@ -156,69 +177,76 @@ class SpecialUpload extends SpecialPage {
# Unsave the temporary file in case this was a cancelled upload
if ( $this->mCancelUpload ) {
- if ( !$this->unsaveUploadedFile() )
+ if ( !$this->unsaveUploadedFile() ) {
# Something went wrong, so unsaveUploadedFile showed a warning
return;
+ }
}
# Process upload or show a form
- if ( $this->mTokenOk && !$this->mCancelUpload
- && ( $this->mUpload && $this->mUploadClicked ) ) {
+ if (
+ $this->mTokenOk && !$this->mCancelUpload &&
+ ( $this->mUpload && $this->mUploadClicked )
+ )
+ {
$this->processUpload();
} else {
# Backwards compatibility hook
- if( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) )
- {
+ if( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) ) {
wfDebug( "Hook 'UploadForm:initial' broke output of the upload form" );
return;
}
+
$this->showUploadForm( $this->getUploadForm() );
}
# Cleanup
- if ( $this->mUpload )
+ if ( $this->mUpload ) {
$this->mUpload->cleanupTempFile();
+ }
}
/**
- * Show the main upload form
+ * Show the main upload form
*
- * @param mixed $form An HTMLForm instance or HTML string to show
+ * @param $form Mixed: an HTMLForm instance or HTML string to show
*/
protected function showUploadForm( $form ) {
# Add links if file was previously deleted
if ( !$this->mDesiredDestName ) {
$this->showViewDeletedLinks();
}
-
+
if ( $form instanceof HTMLForm ) {
$form->show();
} else {
global $wgOut;
$wgOut->addHTML( $form );
}
-
+
}
/**
* Get an UploadForm instance with title and text properly set.
*
- * @param string $message HTML string to add to the form
- * @param string $sessionKey Session key in case this is a stashed upload
+ * @param $message String: HTML string to add to the form
+ * @param $sessionKey String: session key in case this is a stashed upload
+ * @param $hideIgnoreWarning Boolean: whether to hide "ignore warning" check box
* @return UploadForm
*/
protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
global $wgOut;
-
+
# Initialize form
$form = new UploadForm( array(
- 'watch' => $this->getWatchCheck(),
- 'forreupload' => $this->mForReUpload,
+ 'watch' => $this->getWatchCheck(),
+ 'forreupload' => $this->mForReUpload,
'sessionkey' => $sessionKey,
'hideignorewarning' => $hideIgnoreWarning,
'destwarningack' => (bool)$this->mDestWarningAck,
-
+
+ 'description' => $this->mComment,
'texttop' => $this->uploadFormTextTop,
'textaftersummary' => $this->uploadFormTextAfterSummary,
'destfile' => $this->mDesiredDestName,
@@ -226,26 +254,44 @@ class SpecialUpload extends SpecialPage {
$form->setTitle( $this->getTitle() );
# Check the token, but only if necessary
- if( !$this->mTokenOk && !$this->mCancelUpload
- && ( $this->mUpload && $this->mUploadClicked ) ) {
+ if(
+ !$this->mTokenOk && !$this->mCancelUpload &&
+ ( $this->mUpload && $this->mUploadClicked )
+ )
+ {
$form->addPreText( wfMsgExt( 'session_fail_preview', 'parseinline' ) );
}
+ # Give a notice if the user is uploading a file that has been deleted or moved
+ # Note that this is independent from the message 'filewasdeleted' that requires JS
+ $desiredTitleObj = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
+ $delNotice = ''; // empty by default
+ if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
+ LogEventsList::showLogExtract( $delNotice, array( 'delete', 'move' ),
+ $desiredTitleObj->getPrefixedText(),
+ '', array( 'lim' => 10,
+ 'conds' => array( "log_action != 'revision'" ),
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'upload-recreate-warning' ) )
+ );
+ }
+ $form->addPreText( $delNotice );
+
# Add text to form
$form->addPreText( '<div id="uploadtext">' .
wfMsgExt( 'uploadtext', 'parse', array( $this->mDesiredDestName ) ) .
'</div>' );
# Add upload error message
$form->addPreText( $message );
-
+
# Add footer to form
$uploadFooter = wfMsgNoTrans( 'uploadfooter' );
if ( $uploadFooter != '-' && !wfEmptyMsg( 'uploadfooter', $uploadFooter ) ) {
$form->addPostText( '<div id="mw-upload-footer-message">'
. $wgOut->parse( $uploadFooter ) . "</div>\n" );
}
-
- return $form;
+
+ return $form;
}
@@ -287,13 +333,13 @@ class SpecialUpload extends SpecialPage {
* essentially means that UploadBase::VERIFICATION_ERROR and
* UploadBase::EMPTY_FILE should not be passed here.
*
- * @param string $message HTML message to be passed to mainUploadForm
+ * @param $message String: HTML message to be passed to mainUploadForm
*/
protected function showRecoverableUploadError( $message ) {
$sessionKey = $this->mUpload->stashSession();
$message = '<h2>' . wfMsgHtml( 'uploadwarning' ) . "</h2>\n" .
'<div class="error">' . $message . "</div>\n";
-
+
$form = $this->getUploadForm( $message, $sessionKey );
$form->setSubmitText( wfMsg( 'upload-tryagain' ) );
$this->showUploadForm( $form );
@@ -302,13 +348,11 @@ class SpecialUpload extends SpecialPage {
* Stashes the upload, shows the main form, but adds an "continue anyway button".
* Also checks whether there are actually warnings to display.
*
- * @param array $warnings
- * @return boolean true if warnings were displayed, false if there are no
+ * @param $warnings Array
+ * @return boolean true if warnings were displayed, false if there are no
* warnings and the should continue processing like there was no warning
*/
protected function showUploadWarning( $warnings ) {
- global $wgUser;
-
# If there are no warnings, or warnings we can ignore, return early.
# mDestWarningAck is set when some javascript has shown the warning
# to the user. mForReUpload is set when the user clicks the "upload a
@@ -322,28 +366,26 @@ class SpecialUpload extends SpecialPage {
$sessionKey = $this->mUpload->stashSession();
- $sk = $wgUser->getSkin();
-
$warningHtml = '<h2>' . wfMsgHtml( 'uploadwarning' ) . "</h2>\n"
. '<ul class="warning">';
foreach( $warnings as $warning => $args ) {
- $msg = '';
- if( $warning == 'exists' ) {
- $msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
- } elseif( $warning == 'duplicate' ) {
- $msg = self::getDupeWarning( $args );
- } elseif( $warning == 'duplicate-archive' ) {
- $msg = "\t<li>" . wfMsgExt( 'file-deleted-duplicate', 'parseinline',
- array( Title::makeTitle( NS_FILE, $args )->getPrefixedText() ) )
- . "</li>\n";
- } else {
- if ( $args === true )
- $args = array();
- elseif ( !is_array( $args ) )
- $args = array( $args );
- $msg = "\t<li>" . wfMsgExt( $warning, 'parseinline', $args ) . "</li>\n";
+ if( $warning == 'exists' ) {
+ $msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
+ } elseif( $warning == 'duplicate' ) {
+ $msg = self::getDupeWarning( $args );
+ } elseif( $warning == 'duplicate-archive' ) {
+ $msg = "\t<li>" . wfMsgExt( 'file-deleted-duplicate', 'parseinline',
+ array( Title::makeTitle( NS_FILE, $args )->getPrefixedText() ) )
+ . "</li>\n";
+ } else {
+ if ( $args === true ) {
+ $args = array();
+ } elseif ( !is_array( $args ) ) {
+ $args = array( $args );
}
- $warningHtml .= $msg;
+ $msg = "\t<li>" . wfMsgExt( $warning, 'parseinline', $args ) . "</li>\n";
+ }
+ $warningHtml .= $msg;
}
$warningHtml .= "</ul>\n";
$warningHtml .= wfMsgExt( 'uploadwarning-text', 'parse' );
@@ -354,7 +396,7 @@ class SpecialUpload extends SpecialPage {
$form->addButton( 'wpCancelUpload', wfMsg( 'reuploaddesc' ) );
$this->showUploadForm( $form );
-
+
# Indicate that we showed a form
return true;
}
@@ -362,7 +404,7 @@ class SpecialUpload extends SpecialPage {
/**
* Show the upload form with error message, but do not stash the file.
*
- * @param string $message
+ * @param $message HTML string
*/
protected function showUploadError( $message ) {
$message = '<h2>' . wfMsgHtml( 'uploadwarning' ) . "</h2>\n" .
@@ -377,25 +419,21 @@ class SpecialUpload extends SpecialPage {
protected function processUpload() {
global $wgUser, $wgOut;
- // Verify permissions
- $permErrors = $this->mUpload->verifyPermissions( $wgUser );
- if( $permErrors !== true ) {
- $wgOut->showPermissionsErrorPage( $permErrors );
- return;
- }
-
// Fetch the file if required
$status = $this->mUpload->fetchFile();
if( !$status->isOK() ) {
- $this->showUploadForm( $this->getUploadForm( $wgOut->parse( $status->getWikiText() ) ) );
+ $this->showUploadError( $wgOut->parse( $status->getWikiText() ) );
return;
}
- // Deprecated backwards compatibility hook
- if( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) )
- {
+ if( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file.\n" );
- return array( 'status' => UploadBase::BEFORE_PROCESSING );
+ // This code path is deprecated. If you want to break upload processing
+ // do so by hooking into the appropriate hooks in UploadBase::verifyUpload
+ // and UploadBase::verifyFile.
+ // If you use this hook to break uploading, the user will be returned
+ // an empty form with no error message whatsoever.
+ return;
}
@@ -405,6 +443,15 @@ class SpecialUpload extends SpecialPage {
$this->processVerificationError( $details );
return;
}
+
+ // Verify permissions for this title
+ $permErrors = $this->mUpload->verifyPermissions( $wgUser );
+ if( $permErrors !== true ) {
+ $code = array_shift( $permErrors[0] );
+ $this->showRecoverableUploadError( wfMsgExt( $code,
+ 'parseinline', $permErrors[0] ) );
+ return;
+ }
$this->mLocalFile = $this->mUpload->getLocalFile();
@@ -433,28 +480,41 @@ class SpecialUpload extends SpecialPage {
$this->mUploadSuccessful = true;
wfRunHooks( 'SpecialUploadComplete', array( &$this ) );
$wgOut->redirect( $this->mLocalFile->getTitle()->getFullURL() );
-
}
/**
* Get the initial image page text based on a comment and optional file status information
*/
public static function getInitialPageText( $comment = '', $license = '', $copyStatus = '', $source = '' ) {
- global $wgUseCopyrightUpload;
+ global $wgUseCopyrightUpload, $wgForceUIMsgAsContentMsg;
+ $wgForceUIMsgAsContentMsg = (array) $wgForceUIMsgAsContentMsg;
+
+ /* These messages are transcluded into the actual text of the description page.
+ * Thus, forcing them as content messages makes the upload to produce an int: template
+ * instead of hardcoding it there in the uploader language.
+ */
+ foreach( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
+ if ( in_array( $msgName, $wgForceUIMsgAsContentMsg ) ) {
+ $msg[$msgName] = "{{int:$msgName}}";
+ } else {
+ $msg[$msgName] = wfMsgForContent( $msgName );
+ }
+ }
+
if ( $wgUseCopyrightUpload ) {
$licensetxt = '';
if ( $license != '' ) {
- $licensetxt = '== ' . wfMsgForContent( 'license-header' ) . " ==\n" . '{{' . $license . '}}' . "\n";
+ $licensetxt = '== ' . $msg[ 'license-header' ] . " ==\n" . '{{' . $license . '}}' . "\n";
}
- $pageText = '== ' . wfMsgForContent ( 'filedesc' ) . " ==\n" . $comment . "\n" .
- '== ' . wfMsgForContent ( 'filestatus' ) . " ==\n" . $copyStatus . "\n" .
- "$licensetxt" .
- '== ' . wfMsgForContent ( 'filesource' ) . " ==\n" . $source ;
+ $pageText = '== ' . $msg[ 'filedesc' ] . " ==\n" . $comment . "\n" .
+ '== ' . $msg[ 'filestatus' ] . " ==\n" . $copyStatus . "\n" .
+ "$licensetxt" .
+ '== ' . $msg[ 'filesource' ] . " ==\n" . $source;
} else {
if ( $license != '' ) {
- $filedesc = $comment == '' ? '' : '== ' . wfMsgForContent ( 'filedesc' ) . " ==\n" . $comment . "\n";
- $pageText = $filedesc .
- '== ' . wfMsgForContent ( 'license-header' ) . " ==\n" . '{{' . $license . '}}' . "\n";
+ $filedesc = $comment == '' ? '' : '== ' . $msg[ 'filedesc' ] . " ==\n" . $comment . "\n";
+ $pageText = $filedesc .
+ '== ' . $msg[ 'license-header' ] . " ==\n" . '{{' . $license . '}}' . "\n";
} else {
$pageText = $comment;
}
@@ -495,7 +555,7 @@ class SpecialUpload extends SpecialPage {
/**
* Provides output to the user for a result of UploadBase::verifyUpload
*
- * @param array $details Result of UploadBase::verifyUpload
+ * @param $details Array: result of UploadBase::verifyUpload
*/
protected function processVerificationError( $details ) {
global $wgFileExtensions, $wgLang;
@@ -510,10 +570,6 @@ class SpecialUpload extends SpecialPage {
$this->showRecoverableUploadError( wfMsgExt( 'illegalfilename',
'parseinline', $details['filtered'] ) );
break;
- case UploadBase::OVERWRITE_EXISTING_FILE:
- $this->showRecoverableUploadError( wfMsgExt( $details['overwrite'],
- 'parseinline' ) );
- break;
case UploadBase::FILETYPE_MISSING:
$this->showRecoverableUploadError( wfMsgExt( 'filetype-missing',
'parseinline' ) );
@@ -521,7 +577,10 @@ class SpecialUpload extends SpecialPage {
/** Statuses that require reuploading **/
case UploadBase::EMPTY_FILE:
- $this->showUploadForm( $this->getUploadForm( wfMsgHtml( 'emptyfile' ) ) );
+ $this->showUploadError( wfMsgHtml( 'emptyfile' ) );
+ break;
+ case UploadBase::FILE_TOO_LARGE:
+ $this->showUploadError( wfMsgHtml( 'largefileserver' ) );
break;
case UploadBase::FILETYPE_BADTYPE:
$finalExt = $details['finalExt'];
@@ -560,15 +619,16 @@ class SpecialUpload extends SpecialPage {
/**
* Remove a temporarily kept file stashed by saveTempUploadedFile().
- * @access private
- * @return success
+ *
+ * @return Boolean: success
*/
protected function unsaveUploadedFile() {
global $wgOut;
- if ( !( $this->mUpload instanceof UploadFromStash ) )
+ if ( !( $this->mUpload instanceof UploadFromStash ) ) {
return true;
+ }
$success = $this->mUpload->unsaveUploadedFile();
- if ( ! $success ) {
+ if ( !$success ) {
$wgOut->showFileDeleteError( $this->mUpload->getTempPath() );
return false;
} else {
@@ -582,14 +642,15 @@ class SpecialUpload extends SpecialPage {
* Formats a result of UploadBase::getExistsWarning as HTML
* This check is static and can be done pre-upload via AJAX
*
- * @param array $exists The result of UploadBase::getExistsWarning
- * @return string Empty string if there is no warning or an HTML fragment
+ * @param $exists Array: the result of UploadBase::getExistsWarning
+ * @return String: empty string if there is no warning or an HTML fragment
*/
public static function getExistsWarning( $exists ) {
- global $wgUser, $wgContLang;
+ global $wgUser;
- if ( !$exists )
+ if ( !$exists ) {
return '';
+ }
$file = $exists['file'];
$filename = $file->getTitle()->getPrefixedText();
@@ -638,8 +699,8 @@ class SpecialUpload extends SpecialPage {
/**
* Get a list of warnings
*
- * @param string local filename, e.g. 'file exists', 'non-descriptive filename'
- * @return array list of warning messages
+ * @param $filename String: local filename, e.g. 'file exists', 'non-descriptive filename'
+ * @return Array: list of warning messages
*/
public static function ajaxGetExistsWarning( $filename ) {
$file = wfFindFile( $filename );
@@ -648,7 +709,7 @@ class SpecialUpload extends SpecialPage {
// if there isn't an exact match...
$file = wfLocalFile( $filename );
}
- $s = '&nbsp;';
+ $s = '&#160;';
if ( $file ) {
$exists = UploadBase::getExistsWarning( $file );
$warning = self::getExistsWarning( $exists );
@@ -665,15 +726,15 @@ class SpecialUpload extends SpecialPage {
public static function getDupeWarning( $dupes ) {
if( $dupes ) {
global $wgOut;
- $msg = "<gallery>";
+ $msg = '<gallery>';
foreach( $dupes as $file ) {
$title = $file->getTitle();
$msg .= $title->getPrefixedText() .
- "|" . $title->getText() . "\n";
+ '|' . $title->getText() . "\n";
}
- $msg .= "</gallery>";
- return "<li>" .
- wfMsgExt( "file-exists-duplicate", array( "parse" ), count( $dupes ) ) .
+ $msg .= '</gallery>';
+ return '<li>' .
+ wfMsgExt( 'file-exists-duplicate', array( 'parse' ), count( $dupes ) ) .
$wgOut->parse( $msg ) .
"</li>\n";
} else {
@@ -694,25 +755,30 @@ class UploadForm extends HTMLForm {
protected $mDestWarningAck;
protected $mDestFile;
+ protected $mComment;
protected $mTextTop;
protected $mTextAfterSummary;
-
+
protected $mSourceIds;
public function __construct( $options = array() ) {
- global $wgLang;
-
$this->mWatch = !empty( $options['watch'] );
$this->mForReUpload = !empty( $options['forreupload'] );
- $this->mSessionKey = isset( $options['sessionkey'] )
+ $this->mSessionKey = isset( $options['sessionkey'] )
? $options['sessionkey'] : '';
$this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
$this->mDestWarningAck = !empty( $options['destwarningack'] );
-
- $this->mTextTop = $options['texttop'];
- $this->mTextAfterSummary = $options['textaftersummary'];
$this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
+ $this->mComment = isset( $options['description'] ) ?
+ $options['description'] : '';
+
+ $this->mTextTop = isset( $options['texttop'] )
+ ? $options['texttop'] : '';
+
+ $this->mTextAfterSummary = isset( $options['textaftersummary'] )
+ ? $options['textaftersummary'] : '';
+
$sourceDescriptor = $this->getSourceSection();
$descriptor = $sourceDescriptor
+ $this->getDescriptionSection()
@@ -724,34 +790,37 @@ class UploadForm extends HTMLForm {
# Set some form properties
$this->setSubmitText( wfMsg( 'uploadbtn' ) );
$this->setSubmitName( 'wpUpload' );
+ # Used message keys: 'accesskey-upload', 'tooltip-upload'
$this->setSubmitTooltip( 'upload' );
$this->setId( 'mw-upload-form' );
# Build a list of IDs for javascript insertion
$this->mSourceIds = array();
- foreach ( $sourceDescriptor as $key => $field ) {
- if ( !empty( $field['id'] ) )
+ foreach ( $sourceDescriptor as $field ) {
+ if ( !empty( $field['id'] ) ) {
$this->mSourceIds[] = $field['id'];
+ }
}
}
/**
- * Get the descriptor of the fieldset that contains the file source
+ * Get the descriptor of the fieldset that contains the file source
* selection. The section is 'source'
- *
- * @return array Descriptor array
+ *
+ * @return Array: descriptor array
*/
protected function getSourceSection() {
global $wgLang, $wgUser, $wgRequest;
+ global $wgMaxUploadSize;
if ( $this->mSessionKey ) {
return array(
- 'wpSessionKey' => array(
+ 'SessionKey' => array(
'type' => 'hidden',
'default' => $this->mSessionKey,
),
- 'wpSourceType' => array(
+ 'SourceType' => array(
'type' => 'hidden',
'default' => 'Stash',
),
@@ -771,25 +840,28 @@ class UploadForm extends HTMLForm {
'raw' => true,
);
}
-
+
$descriptor['UploadFile'] = array(
- 'class' => 'UploadSourceField',
- 'section' => 'source',
- 'type' => 'file',
- 'id' => 'wpUploadFile',
- 'label-message' => 'sourcefilename',
- 'upload-type' => 'File',
- 'radio' => &$radio,
- 'help' => wfMsgExt( 'upload-maxfilesize',
- array( 'parseinline', 'escapenoentities' ),
- $wgLang->formatSize(
- wfShorthandToInteger( ini_get( 'upload_max_filesize' ) )
- )
- ) . ' ' . wfMsgHtml( 'upload_source_file' ),
- 'checked' => $selectedSourceType == 'file',
+ 'class' => 'UploadSourceField',
+ 'section' => 'source',
+ 'type' => 'file',
+ 'id' => 'wpUploadFile',
+ 'label-message' => 'sourcefilename',
+ 'upload-type' => 'File',
+ 'radio' => &$radio,
+ 'help' => wfMsgExt( 'upload-maxfilesize',
+ array( 'parseinline', 'escapenoentities' ),
+ $wgLang->formatSize(
+ wfShorthandToInteger( min(
+ wfShorthandToInteger(
+ ini_get( 'upload_max_filesize' )
+ ), $wgMaxUploadSize
+ ) )
+ )
+ ) . ' ' . wfMsgHtml( 'upload_source_file' ),
+ 'checked' => $selectedSourceType == 'file',
);
if ( $canUploadByUrl ) {
- global $wgMaxUploadSize;
$descriptor['UploadFileURL'] = array(
'class' => 'UploadSourceField',
'section' => 'source',
@@ -815,11 +887,10 @@ class UploadForm extends HTMLForm {
return $descriptor;
}
-
/**
* Get the messages indicating which extensions are preferred and prohibitted.
- *
- * @return string HTML string containing the message
+ *
+ * @return String: HTML string containing the message
*/
protected function getExtensionsMessage() {
# Print a list of allowed file extensions, if so configured. We ignore
@@ -827,7 +898,6 @@ class UploadForm extends HTMLForm {
global $wgLang, $wgCheckFileExtensions, $wgStrictFileExtensions,
$wgFileExtensions, $wgFileBlacklist;
- $allowedExtensions = '';
if( $wgCheckFileExtensions ) {
if( $wgStrictFileExtensions ) {
# Everything not permitted is banned
@@ -855,16 +925,11 @@ class UploadForm extends HTMLForm {
/**
* Get the descriptor of the fieldset that contains the file description
* input. The section is 'description'
- *
- * @return array Descriptor array
+ *
+ * @return Array: descriptor array
*/
protected function getDescriptionSection() {
- global $wgUser, $wgOut;
-
- $cols = intval( $wgUser->getOption( 'cols' ) );
- if( $wgUser->getOption( 'editwidth' ) ) {
- $wgOut->addInlineStyle( '#mw-htmlform-description { width: 100%; }' );
- }
+ global $wgUser;
$descriptor = array(
'DestFile' => array(
@@ -884,7 +949,8 @@ class UploadForm extends HTMLForm {
'label-message' => $this->mForReUpload
? 'filereuploadsummary'
: 'fileuploadsummary',
- 'cols' => $cols,
+ 'default' => $this->mComment,
+ 'cols' => intval( $wgUser->getOption( 'cols' ) ),
'rows' => 8,
)
);
@@ -896,22 +962,25 @@ class UploadForm extends HTMLForm {
'raw' => true,
);
}
-
+
$descriptor += array(
'EditTools' => array(
'type' => 'edittools',
'section' => 'description',
- ),
- 'License' => array(
+ )
+ );
+
+ if ( $this->mForReUpload ) {
+ $descriptor['DestFile']['readonly'] = true;
+ } else {
+ $descriptor['License'] = array(
'type' => 'select',
'class' => 'Licenses',
'section' => 'description',
'id' => 'wpLicense',
'label-message' => 'license',
- ),
- );
- if ( $this->mForReUpload )
- $descriptor['DestFile']['readonly'] = true;
+ );
+ }
global $wgUseCopyrightUpload;
if ( $wgUseCopyrightUpload ) {
@@ -933,15 +1002,15 @@ class UploadForm extends HTMLForm {
}
/**
- * Get the descriptor of the fieldset that contains the upload options,
+ * Get the descriptor of the fieldset that contains the upload options,
* such as "watch this file". The section is 'options'
- *
- * @return array Descriptor array
+ *
+ * @return Array: descriptor array
*/
protected function getOptionsSection() {
- global $wgUser, $wgOut;
+ global $wgUser;
- if( $wgUser->isLoggedIn() ) {
+ if ( $wgUser->isLoggedIn() ) {
$descriptor = array(
'Watchthis' => array(
'type' => 'check',
@@ -952,7 +1021,7 @@ class UploadForm extends HTMLForm {
)
);
}
- if( !$this->mHideIgnoreWarning ) {
+ if ( !$this->mHideIgnoreWarning ) {
$descriptor['IgnoreWarning'] = array(
'type' => 'check',
'id' => 'wpIgnoreWarning',
@@ -961,14 +1030,14 @@ class UploadForm extends HTMLForm {
);
}
- $descriptor['wpDestFileWarningAck'] = array(
+ $descriptor['DestFileWarningAck'] = array(
'type' => 'hidden',
'id' => 'wpDestFileWarningAck',
'default' => $this->mDestWarningAck ? '1' : '',
);
if ( $this->mForReUpload ) {
- $descriptor['wpForReUpload'] = array(
+ $descriptor['ForReUpload'] = array(
'type' => 'hidden',
'id' => 'wpForReUpload',
'default' => '1',
@@ -976,7 +1045,6 @@ class UploadForm extends HTMLForm {
}
return $descriptor;
-
}
/**
@@ -989,12 +1057,9 @@ class UploadForm extends HTMLForm {
/**
* Add upload JS to $wgOut
- *
- * @param bool $autofill Whether or not to autofill the destination
- * filename text box
*/
- protected function addUploadJS( ) {
- global $wgUseAjax, $wgAjaxUploadDestCheck, $wgAjaxLicensePreview, $wgEnableAPI;
+ protected function addUploadJS() {
+ global $wgUseAjax, $wgAjaxUploadDestCheck, $wgAjaxLicensePreview, $wgEnableAPI, $wgStrictFileExtensions;
global $wgOut;
$useAjaxDestCheck = $wgUseAjax && $wgAjaxUploadDestCheck;
@@ -1008,18 +1073,19 @@ class UploadForm extends HTMLForm {
// the wpDestFile textbox
$this->mDestFile === '',
'wgUploadSourceIds' => $this->mSourceIds,
+ 'wgStrictFileExtensions' => $wgStrictFileExtensions,
+ 'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
);
$wgOut->addScript( Skin::makeVariablesScript( $scriptVars ) );
-
+
// For <charinsert> support
- $wgOut->addScriptFile( 'edit.js' );
- $wgOut->addScriptFile( 'upload.js' );
+ $wgOut->addModules( array( 'mediawiki.legacy.edit', 'mediawiki.legacy.upload' ) );
}
/**
* Empty function; submission is handled elsewhere.
- *
+ *
* @return bool false
*/
function trySubmit() {
@@ -1032,9 +1098,9 @@ class UploadForm extends HTMLForm {
* A form field that contains a radio box in the label
*/
class UploadSourceField extends HTMLTextField {
- function getLabelHtml() {
+ function getLabelHtml( $cellAttributes = array() ) {
$id = "wpSourceType{$this->mParams['upload-type']}";
- $label = Html::rawElement( 'label', array( 'for' => $id ), $this->mLabel );
+ $label = Html::rawElement( 'label', array( 'for' => $id ), $this->mLabel );
if ( !empty( $this->mParams['radio'] ) ) {
$attribs = array(
@@ -1043,13 +1109,15 @@ class UploadSourceField extends HTMLTextField {
'id' => $id,
'value' => $this->mParams['upload-type'],
);
- if ( !empty( $this->mParams['checked'] ) )
+ if ( !empty( $this->mParams['checked'] ) ) {
$attribs['checked'] = 'checked';
+ }
$label .= Html::element( 'input', $attribs );
}
- return Html::rawElement( 'td', array( 'class' => 'mw-label' ), $label );
+ return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes, $label );
}
+
function getSize() {
return isset( $this->mParams['size'] )
? $this->mParams['size']
diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php
new file mode 100644
index 00000000..48a41a5e
--- /dev/null
+++ b/includes/specials/SpecialUploadStash.php
@@ -0,0 +1,394 @@
+<?php
+/**
+ * Implements Special:UploadStash
+ *
+ * Web access for files temporarily stored by UploadStash.
+ *
+ * For example -- files that were uploaded with the UploadWizard extension are stored temporarily
+ * before committing them to the db. But we want to see their thumbnails and get other information
+ * about them.
+ *
+ * Since this is based on the user's session, in effect this creates a private temporary file area.
+ * However, the URLs for the files cannot be shared.
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @ingroup Upload
+ */
+
+class SpecialUploadStash extends UnlistedSpecialPage {
+ // UploadStash
+ private $stash;
+
+ // is the edit request authorized? boolean
+ private $isEditAuthorized;
+
+ // did the user request us to clear the stash? boolean
+ private $requestedClear;
+
+ // Since we are directly writing the file to STDOUT,
+ // we should not be reading in really big files and serving them out.
+ //
+ // We also don't want people using this as a file drop, even if they
+ // share credentials.
+ //
+ // This service is really for thumbnails and other such previews while
+ // uploading.
+ const MAX_SERVE_BYTES = 262144; // 256K
+
+ public function __construct( $request = null ) {
+ global $wgRequest;
+
+ parent::__construct( 'UploadStash', 'upload' );
+ try {
+ $this->stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+ } catch ( UploadStashNotAvailableException $e ) {
+ return null;
+ }
+
+ $this->loadRequest( is_null( $request ) ? $wgRequest : $request );
+ }
+
+ /**
+ * Execute page -- can output a file directly or show a listing of them.
+ *
+ * @param $subPage String: subpage, e.g. in http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
+ * @return Boolean: success
+ */
+ public function execute( $subPage ) {
+ global $wgUser;
+
+ if ( !$this->userCanExecute( $wgUser ) ) {
+ $this->displayRestrictionError();
+ return;
+ }
+
+ if ( !isset( $subPage ) || $subPage === '' ) {
+ return $this->showUploads();
+ }
+
+ return $this->showUpload( $subPage );
+ }
+
+
+ /**
+ * If file available in stash, cats it out to the client as a simple HTTP response.
+ * n.b. Most sanity checking done in UploadStashLocalFile, so this is straightforward.
+ *
+ * @param $key String: the key of a particular requested file
+ */
+ public function showUpload( $key ) {
+ global $wgOut;
+
+ // prevent callers from doing standard HTML output -- we'll take it from here
+ $wgOut->disable();
+
+ try {
+ $params = $this->parseKey( $key );
+ if ( $params['type'] === 'thumb' ) {
+ return $this->outputThumbFromStash( $params['file'], $params['params'] );
+ } else {
+ return $this->outputLocalFile( $params['file'] );
+ }
+ } catch( UploadStashFileNotFoundException $e ) {
+ $code = 404;
+ $message = $e->getMessage();
+ } catch( UploadStashZeroLengthFileException $e ) {
+ $code = 500;
+ $message = $e->getMessage();
+ } catch( UploadStashBadPathException $e ) {
+ $code = 500;
+ $message = $e->getMessage();
+ } catch( SpecialUploadStashTooLargeException $e ) {
+ $code = 500;
+ $message = 'Cannot serve a file larger than ' . self::MAX_SERVE_BYTES . ' bytes. ' . $e->getMessage();
+ } catch( Exception $e ) {
+ $code = 500;
+ $message = $e->getMessage();
+ }
+
+ wfHttpError( $code, OutputPage::getStatusMessage( $code ), $message );
+ return false;
+ }
+
+ /**
+ * Parse the key passed to the SpecialPage. Returns an array containing
+ * the associated file object, the type ('file' or 'thumb') and if
+ * application the transform parameters
+ *
+ * @param string $key
+ * @return array
+ */
+ private function parseKey( $key ) {
+ $type = strtok( $key, '/' );
+
+ if ( $type !== 'file' && $type !== 'thumb' ) {
+ throw new UploadStashBadPathException( "Unknown type '$type'" );
+ }
+ $fileName = strtok( '/' );
+ $thumbPart = strtok( '/' );
+ $file = $this->stash->getFile( $fileName );
+ if ( $type === 'thumb' ) {
+ $srcNamePos = strrpos( $thumbPart, $fileName );
+ if ( $srcNamePos === false || $srcNamePos < 1 ) {
+ throw new UploadStashBadPathException( 'Unrecognized thumb name' );
+ }
+ $paramString = substr( $thumbPart, 0, $srcNamePos - 1 );
+
+ $handler = $file->getHandler();
+ $params = $handler->parseParamString( $paramString );
+ return array( 'file' => $file, 'type' => $type, 'params' => $params );
+ }
+
+ return array( 'file' => $file, 'type' => $type );
+ }
+
+
+
+
+ /**
+ * Get a thumbnail for file, either generated locally or remotely, and stream it out
+ * @param String $key: key for the file in the stash
+ * @param int $width: width of desired thumbnail
+ * @return boolean success
+ */
+ private function outputThumbFromStash( $file, $params ) {
+
+ // this global, if it exists, points to a "scaler", as you might find in the Wikimedia Foundation cluster. See outputRemoteScaledThumb()
+ // this is part of our horrible NFS-based system, we create a file on a mount point here, but fetch the scaled file from somewhere else that
+ // happens to share it over NFS
+ global $wgUploadStashScalerBaseUrl;
+
+ $flags = 0;
+ if ( $wgUploadStashScalerBaseUrl ) {
+ $this->outputRemoteScaledThumb( $file, $params, $flags );
+ } else {
+ $this->outputLocallyScaledThumb( $file, $params, $flags );
+ }
+
+
+ }
+
+
+ /**
+ * Scale a file (probably with a locally installed imagemagick, or similar) and output it to STDOUT.
+ * @param $file: File object
+ * @param $params: scaling parameters ( e.g. array( width => '50' ) );
+ * @param $flags: scaling flags ( see File:: constants )
+ * @throws MWException
+ * @return boolean success
+ */
+ private function outputLocallyScaledThumb( $file, $params, $flags ) {
+
+ // n.b. this is stupid, we insist on re-transforming the file every time we are invoked. We rely
+ // on HTTP caching to ensure this doesn't happen.
+
+ $flags |= File::RENDER_NOW;
+
+ $thumbnailImage = $file->transform( $params, $flags );
+ if ( !$thumbnailImage ) {
+ throw new MWException( 'Could not obtain thumbnail' );
+ }
+
+ // we should have just generated it locally
+ if ( ! $thumbnailImage->getPath() ) {
+ throw new UploadStashFileNotFoundException( "no local path for scaled item" );
+ }
+
+ // now we should construct a File, so we can get mime and other such info in a standard way
+ // n.b. mimetype may be different from original (ogx original -> jpeg thumb)
+ $thumbFile = new UnregisteredLocalFile( false, $this->stash->repo, $thumbnailImage->getPath(), false );
+ if ( ! $thumbFile ) {
+ throw new UploadStashFileNotFoundException( "couldn't create local file object for thumbnail" );
+ }
+
+ return $this->outputLocalFile( $thumbFile );
+
+ }
+
+ /**
+ * Scale a file with a remote "scaler", as exists on the Wikimedia Foundation cluster, and output it to STDOUT.
+ * Note: unlike the usual thumbnail process, the web client never sees the cluster URL; we do the whole HTTP transaction to the scaler ourselves
+ * and cat the results out.
+ * Note: We rely on NFS to have propagated the file contents to the scaler. However, we do not rely on the thumbnail being created in NFS and then
+ * propagated back to our filesystem. Instead we take the results of the HTTP request instead.
+ * Note: no caching is being done here, although we are instructing the client to cache it forever.
+ * @param $file: File object
+ * @param $params: scaling parameters ( e.g. array( width => '50' ) );
+ * @param $flags: scaling flags ( see File:: constants )
+ * @throws MWException
+ * @return boolean success
+ */
+ private function outputRemoteScaledThumb( $file, $params, $flags ) {
+
+ // this global probably looks something like 'http://upload.wikimedia.org/wikipedia/test/thumb/temp'
+ // do not use trailing slash
+ global $wgUploadStashScalerBaseUrl;
+
+ $scalerThumbName = $file->getParamThumbName( $file->name, $params );
+ $scalerThumbUrl = $wgUploadStashScalerBaseUrl . '/' . $file->getRel() . '/' . $scalerThumbName;
+
+ // make a curl call to the scaler to create a thumbnail
+ $httpOptions = array(
+ 'method' => 'GET',
+ 'timeout' => 'default'
+ );
+ $req = MWHttpRequest::factory( $scalerThumbUrl, $httpOptions );
+ $status = $req->execute();
+ if ( ! $status->isOK() ) {
+ $errors = $status->getErrorsArray();
+ throw new MWException( "Fetching thumbnail failed: " . join( ", ", $errors ) );
+ }
+ $contentType = $req->getResponseHeader( "content-type" );
+ if ( ! $contentType ) {
+ throw new MWException( "Missing content-type header" );
+ }
+ return $this->outputContents( $req->getContent(), $contentType );
+ }
+
+ /**
+ * Output HTTP response for file
+ * Side effect: writes HTTP response to STDOUT.
+ * XXX could use wfStreamfile (in includes/Streamfile.php), but for consistency with outputContents() doing it this way.
+ * XXX is mimeType really enough, or do we need encoding for full Content-Type header?
+ *
+ * @param $file File object with a local path (e.g. UnregisteredLocalFile, LocalFile. Oddly these don't share an ancestor!)
+ */
+ private function outputLocalFile( $file ) {
+ if ( $file->getSize() > self::MAX_SERVE_BYTES ) {
+ throw new SpecialUploadStashTooLargeException();
+ }
+ self::outputFileHeaders( $file->getMimeType(), $file->getSize() );
+ readfile( $file->getPath() );
+ return true;
+ }
+
+ /**
+ * Output HTTP response of raw content
+ * Side effect: writes HTTP response to STDOUT.
+ * @param String $content: content
+ * @param String $mimeType: mime type
+ */
+ private function outputContents( $content, $contentType ) {
+ $size = strlen( $content );
+ if ( $size > self::MAX_SERVE_BYTES ) {
+ throw new SpecialUploadStashTooLargeException();
+ }
+ self::outputFileHeaders( $contentType, $size );
+ print $content;
+ return true;
+ }
+
+ /**
+ * Output headers for streaming
+ * XXX unsure about encoding as binary; if we received from HTTP perhaps we should use that encoding, concatted with semicolon to mimeType as it usually is.
+ * Side effect: preps PHP to write headers to STDOUT.
+ * @param String $contentType : string suitable for content-type header
+ * @param String $size: length in bytes
+ */
+ private static function outputFileHeaders( $contentType, $size ) {
+ header( "Content-Type: $contentType", true );
+ header( 'Content-Transfer-Encoding: binary', true );
+ header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
+ header( "Content-Length: $size", true );
+ }
+
+
+ /**
+ * Initialize authorization & actions to take, from the request
+ * @param $request: WebRequest
+ */
+ private function loadRequest( $request ) {
+ global $wgUser;
+ if ( $request->wasPosted() ) {
+
+ $token = $request->getVal( 'wpEditToken' );
+ $this->isEditAuthorized = $wgUser->matchEditToken( $token );
+
+ $this->requestedClear = $request->getBool( 'clear' );
+
+ }
+ }
+
+ /**
+ * Static callback for the HTMLForm in showUploads, to process
+ * Note the stash has to be recreated since this is being called in a static context.
+ * This works, because there really is only one stash per logged-in user, despite appearances.
+ *
+ * @return Status
+ */
+ public static function tryClearStashedUploads( $formData ) {
+ wfDebug( __METHOD__ . " form data : " . print_r( $formData, 1 ) );
+ if ( isset( $formData['clear'] ) and $formData['clear'] ) {
+ $stash = new UploadStash();
+ wfDebug( "stash has: " . print_r( $stash->listFiles(), 1 ) );
+ if ( ! $stash->clear() ) {
+ return Status::newFatal( 'uploadstash-errclear' );
+ }
+ }
+ return Status::newGood();
+ }
+
+ /**
+ * Default action when we don't have a subpage -- just show links to the uploads we have,
+ * Also show a button to clear stashed files
+ * @param Status : $status - the result of processRequest
+ */
+ private function showUploads( $status = null ) {
+ global $wgOut;
+ if ( $status === null ) {
+ $status = Status::newGood();
+ }
+
+ // sets the title, etc.
+ $this->setHeaders();
+ $this->outputHeader();
+
+
+ // create the form, which will also be used to execute a callback to process incoming form data
+ // this design is extremely dubious, but supposedly HTMLForm is our standard now?
+
+ $form = new HTMLForm( array(
+ 'Clear' => array(
+ 'type' => 'hidden',
+ 'default' => true,
+ 'name' => 'clear',
+ )
+ ), 'clearStashedUploads' );
+ $form->setSubmitCallback( array( __CLASS__, 'tryClearStashedUploads' ) );
+ $form->setTitle( $this->getTitle() );
+ $form->addHiddenField( 'clear', true, array( 'type' => 'boolean' ) );
+ $form->setSubmitText( wfMsg( 'uploadstash-clear' ) );
+
+ $form->prepareForm();
+ $formResult = $form->tryAuthorizedSubmit();
+
+
+ // show the files + form, if there are any, or just say there are none
+ $refreshHtml = Html::element( 'a', array( 'href' => $this->getTitle()->getLocalURL() ), wfMsg( 'uploadstash-refresh' ) );
+ $files = $this->stash->listFiles();
+ if ( count( $files ) ) {
+ sort( $files );
+ $fileListItemsHtml = '';
+ foreach ( $files as $file ) {
+ $fileListItemsHtml .= Html::rawElement( 'li', array(),
+ Html::element( 'a', array( 'href' =>
+ $this->getTitle( "file/$file" )->getLocalURL() ), $file )
+ );
+ }
+ $wgOut->addHtml( Html::rawElement( 'ul', array(), $fileListItemsHtml ) );
+ $form->displayForm( $formResult );
+ $wgOut->addHtml( Html::rawElement( 'p', array(), $refreshHtml ) );
+ } else {
+ $wgOut->addHtml( Html::rawElement( 'p', array(),
+ Html::element( 'span', array(), wfMsg( 'uploadstash-nofiles' ) )
+ . ' '
+ . $refreshHtml
+ ) );
+ }
+
+ return true;
+ }
+}
+
+class SpecialUploadStashTooLargeException extends MWException {};
diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php
index 8b8d0e9e..ccace79d 100644
--- a/includes/specials/SpecialUserlogin.php
+++ b/includes/specials/SpecialUserlogin.php
@@ -1,11 +1,28 @@
<?php
/**
+ * Implements Special:UserLogin
+ *
+ * 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
*/
/**
- * constructor
+ * Constructor
*/
function wfSpecialUserlogin( $par = '' ) {
global $wgRequest;
@@ -18,7 +35,8 @@ function wfSpecialUserlogin( $par = '' ) {
}
/**
- * implements Special:Login
+ * Implements Special:UserLogin
+ *
* @ingroup SpecialPage
*/
class LoginForm {
@@ -41,7 +59,7 @@ class LoginForm {
var $mName, $mPassword, $mRetype, $mReturnTo, $mCookieCheck, $mPosted;
var $mAction, $mCreateaccount, $mCreateaccountMail, $mMailmypassword;
var $mLoginattempt, $mRemember, $mEmail, $mDomain, $mLanguage;
- var $mSkipCookieCheck, $mReturnToQuery, $mToken;
+ var $mSkipCookieCheck, $mReturnToQuery, $mToken, $mStickHTTPS;
private $mExtUser = null;
@@ -50,7 +68,7 @@ class LoginForm {
* @param $request WebRequest: a WebRequest object passed by reference
* @param $par String: subpage parameter
*/
- function LoginForm( &$request, $par = '' ) {
+ function __construct( &$request, $par = '' ) {
global $wgAuth, $wgHiddenPrefs, $wgEnableEmail, $wgRedirectOnLogin;
$this->mType = ( $par == 'signup' ) ? $par : $request->getText( 'type' ); # Check for [[Special:Userlogin/signup]]
@@ -58,6 +76,7 @@ class LoginForm {
$this->mPassword = $request->getText( 'wpPassword' );
$this->mRetype = $request->getText( 'wpRetype' );
$this->mDomain = $request->getText( 'wpDomain' );
+ $this->mReason = $request->getText( 'wpReason' );
$this->mReturnTo = $request->getVal( 'returnto' );
$this->mReturnToQuery = $request->getVal( 'returntoquery' );
$this->mCookieCheck = $request->getVal( 'wpCookieCheck' );
@@ -70,9 +89,10 @@ class LoginForm {
$this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
$this->mAction = $request->getVal( 'action' );
$this->mRemember = $request->getCheck( 'wpRemember' );
+ $this->mStickHTTPS = $request->getCheck( 'wpStickHTTPS' );
$this->mLanguage = $request->getText( 'uselang' );
$this->mSkipCookieCheck = $request->getCheck( 'wpSkipCookieCheck' );
- $this->mToken = ($this->mType == 'signup' ) ? $request->getVal( 'wpCreateaccountToken' ) : $request->getVal( 'wpLoginToken' );
+ $this->mToken = ( $this->mType == 'signup' ) ? $request->getVal( 'wpCreateaccountToken' ) : $request->getVal( 'wpLoginToken' );
if ( $wgRedirectOnLogin ) {
$this->mReturnTo = $wgRedirectOnLogin;
@@ -107,14 +127,14 @@ class LoginForm {
if ( !is_null( $this->mCookieCheck ) ) {
$this->onCookieRedirectCheck( $this->mCookieCheck );
return;
- } else if( $this->mPosted ) {
+ } elseif( $this->mPosted ) {
if( $this->mCreateaccount ) {
return $this->addNewAccount();
- } else if ( $this->mCreateaccountMail ) {
+ } elseif ( $this->mCreateaccountMail ) {
return $this->addNewAccountMailPassword();
- } else if ( $this->mMailmypassword ) {
+ } elseif ( $this->mMailmypassword ) {
return $this->mailPassword();
- } else if ( ( 'submitlogin' == $this->mAction ) || $this->mLoginattempt ) {
+ } elseif ( ( 'submitlogin' == $this->mAction ) || $this->mLoginattempt ) {
return $this->processLogin();
}
}
@@ -128,13 +148,13 @@ class LoginForm {
global $wgOut;
if ( $this->mEmail == '' ) {
- $this->mainLoginForm( wfMsg( 'noemail', htmlspecialchars( $this->mName ) ) );
+ $this->mainLoginForm( wfMsgExt( 'noemailcreate', array( 'parsemag', 'escape' ) ) );
return;
}
$u = $this->addNewaccountInternal();
- if ($u == null) {
+ if ( $u == null ) {
return;
}
@@ -144,47 +164,46 @@ class LoginForm {
$result = $this->mailPasswordInternal( $u, false, 'createaccount-title', 'createaccount-text' );
wfRunHooks( 'AddNewAccount', array( $u, true ) );
- $u->addNewUserLogEntry();
+ $u->addNewUserLogEntry( true, $this->mReason );
$wgOut->setPageTitle( wfMsg( 'accmailtitle' ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->setArticleRelated( false );
- if( WikiError::isError( $result ) ) {
- $this->mainLoginForm( wfMsg( 'mailerror', $result->getMessage() ) );
+ if( !$result->isGood() ) {
+ $this->mainLoginForm( wfMsg( 'mailerror', $result->getWikiText() ) );
} else {
$wgOut->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
$wgOut->returnToMain( false );
}
- $u = 0;
}
-
/**
* @private
*/
function addNewAccount() {
- global $wgUser, $wgEmailAuthentication;
+ global $wgUser, $wgEmailAuthentication, $wgOut;
# Create the account and abort if there's a problem doing so
$u = $this->addNewAccountInternal();
- if( $u == null )
+ if( $u == null ) {
return;
+ }
# If we showed up language selection links, and one was in use, be
# smart (and sensible) and save that language as the user's preference
global $wgLoginLanguageSelector;
- if( $wgLoginLanguageSelector && $this->mLanguage )
+ if( $wgLoginLanguageSelector && $this->mLanguage ) {
$u->setOption( 'language', $this->mLanguage );
+ }
# Send out an email authentication message if needed
if( $wgEmailAuthentication && User::isValidEmailAddr( $u->getEmail() ) ) {
- global $wgOut;
- $error = $u->sendConfirmationMail();
- if( WikiError::isError( $error ) ) {
- $wgOut->addWikiMsg( 'confirmemail_sendfailed', $error->getMessage() );
- } else {
+ $status = $u->sendConfirmationMail();
+ if( $status->isGood() ) {
$wgOut->addWikiMsg( 'confirmemail_oncreate' );
+ } else {
+ $wgOut->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
}
}
@@ -206,7 +225,6 @@ class LoginForm {
}
} else {
# Confirm that the account was created
- global $wgOut;
$self = SpecialPage::getTitleFor( 'Userlogin' );
$wgOut->setPageTitle( wfMsgHtml( 'accountcreated' ) );
$wgOut->setArticleRelated( false );
@@ -214,7 +232,7 @@ class LoginForm {
$wgOut->addHTML( wfMsgWikiHtml( 'accountcreatedtext', $u->getName() ) );
$wgOut->returnToMain( false, $self );
wfRunHooks( 'AddNewAccount', array( $u, false ) );
- $u->addNewUserLogEntry();
+ $u->addNewUserLogEntry( false, $this->mReason );
return true;
}
}
@@ -254,16 +272,16 @@ class LoginForm {
# Request forgery checks.
if ( !self::getCreateaccountToken() ) {
self::setCreateaccountToken();
- $this->mainLoginForm( wfMsg( 'sessionfailure' ) );
+ $this->mainLoginForm( wfMsgExt( 'nocookiesnew', array( 'parseinline' ) ) );
return false;
}
-
+
# The user didn't pass a createaccount token
if ( !$this->mToken ) {
$this->mainLoginForm( wfMsg( 'sessionfailure' ) );
return false;
}
-
+
# Validate the createaccount token
if ( $this->mToken !== self::getCreateaccountToken() ) {
$this->mainLoginForm( wfMsg( 'sessionfailure' ) );
@@ -272,7 +290,7 @@ class LoginForm {
# Check permissions
if ( !$wgUser->isAllowed( 'createaccount' ) ) {
- $this->userNotPrivilegedMessage();
+ $wgOut->permissionRequired( 'createaccount' );
return false;
} elseif ( $wgUser->isBlockedFromCreateAccount() ) {
$this->userBlockedMessage();
@@ -359,7 +377,7 @@ class LoginForm {
return false;
}
- self::clearCreateaccountToken();
+ self::clearCreateaccountToken();
return $this->initUser( $u, false );
}
@@ -413,16 +431,17 @@ class LoginForm {
* creation.
*/
public function authenticateUserData() {
- global $wgUser, $wgAuth;
+ global $wgUser, $wgAuth, $wgMemc;
+
if ( $this->mName == '' ) {
return self::NO_NAME;
}
-
+
// We require a login token to prevent login CSRF
// Handle part of this before incrementing the throttle so
// token-less login attempts don't count towards the throttle
// but wrong-token attempts do.
-
+
// If the user doesn't have a login token yet, set one.
if ( !self::getLoginToken() ) {
self::setLoginToken();
@@ -432,7 +451,7 @@ class LoginForm {
if ( !$this->mToken ) {
return self::NEED_TOKEN;
}
-
+
global $wgPasswordAttemptThrottle;
$throttleCount = 0;
@@ -440,18 +459,17 @@ class LoginForm {
$throttleKey = wfMemcKey( 'password-throttle', wfGetIP(), md5( $this->mName ) );
$count = $wgPasswordAttemptThrottle['count'];
$period = $wgPasswordAttemptThrottle['seconds'];
-
- global $wgMemc;
+
$throttleCount = $wgMemc->get( $throttleKey );
if ( !$throttleCount ) {
$wgMemc->add( $throttleKey, 1, $period ); // start counter
- } else if ( $throttleCount < $count ) {
- $wgMemc->incr($throttleKey);
- } else if ( $throttleCount >= $count ) {
+ } elseif ( $throttleCount < $count ) {
+ $wgMemc->incr( $throttleKey );
+ } elseif ( $throttleCount >= $count ) {
return self::THROTTLED;
}
}
-
+
// Validate the login token
if ( $this->mToken !== self::getLoginToken() ) {
return self::WRONG_TOKEN;
@@ -464,7 +482,7 @@ class LoginForm {
// for user existence using User::newFromName($name)->getId() below
// will effectively be using stale data.
if ( $wgUser->getName() === $this->mName ) {
- wfDebug( __METHOD__.": already logged in as {$this->mName}\n" );
+ wfDebug( __METHOD__ . ": already logged in as {$this->mName}\n" );
return self::SUCCESS;
}
@@ -505,7 +523,7 @@ class LoginForm {
}
global $wgBlockDisablesLogin;
- if (!$u->checkPassword( $this->mPassword )) {
+ if ( !$u->checkPassword( $this->mPassword ) ) {
if( $u->checkTemporaryPassword( $this->mPassword ) ) {
// The e-mailed temporary password should not be used for actu-
// al logins; that's a very sloppy habit, and insecure if an
@@ -533,7 +551,7 @@ class LoginForm {
// faces etc will probably just fail cleanly here.
$retval = self::RESET_PASS;
} else {
- $retval = ($this->mPassword == '') ? self::EMPTY_PASS : self::WRONG_PASS;
+ $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
}
} elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
// If we've enabled it, make it so that a blocked user cannot login
@@ -543,8 +561,8 @@ class LoginForm {
$wgUser = $u;
// Please reset throttle for successful logins, thanks!
- if($throttleCount) {
- $wgMemc->delete($throttleKey);
+ if( $throttleCount ) {
+ $wgMemc->delete( $throttleKey );
}
if ( $isAutoCreated ) {
@@ -567,7 +585,7 @@ class LoginForm {
global $wgAuth, $wgUser, $wgAutocreatePolicy;
if ( $wgUser->isBlockedFromCreateAccount() ) {
- wfDebug( __METHOD__.": user is blocked from account creation\n" );
+ wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
return self::CREATE_BLOCKED;
}
@@ -591,22 +609,22 @@ class LoginForm {
return self::NOT_EXISTS;
}
if ( !$wgAuth->userExists( $user->getName() ) ) {
- wfDebug( __METHOD__.": user does not exist\n" );
+ wfDebug( __METHOD__ . ": user does not exist\n" );
return self::NOT_EXISTS;
}
if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
- wfDebug( __METHOD__.": \$wgAuth->authenticate() returned false, aborting\n" );
+ wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
return self::WRONG_PLUGIN_PASS;
}
}
- wfDebug( __METHOD__.": creating account\n" );
- $user = $this->initUser( $user, true );
+ wfDebug( __METHOD__ . ": creating account\n" );
+ $this->initUser( $user, true );
return self::SUCCESS;
}
function processLogin() {
- global $wgUser, $wgAuth;
+ global $wgUser;
switch ( $this->authenticateUserData() ) {
case self::SUCCESS:
@@ -637,8 +655,10 @@ class LoginForm {
return $this->cookieRedirectCheck( 'login' );
}
break;
-
+
case self::NEED_TOKEN:
+ $this->mainLoginForm( wfMsgExt( 'nocookieslogin', array( 'parseinline' ) ) );
+ break;
case self::WRONG_TOKEN:
$this->mainLoginForm( wfMsg( 'sessionfailure' ) );
break;
@@ -650,7 +670,7 @@ class LoginForm {
$this->mainLoginForm( wfMsg( 'wrongpassword' ) );
break;
case self::NOT_EXISTS:
- if( $wgUser->isAllowed( 'createaccount' ) ){
+ if( $wgUser->isAllowed( 'createaccount' ) ) {
$this->mainLoginForm( wfMsgWikiHtml( 'nosuchuser', htmlspecialchars( $this->mName ) ) );
} else {
$this->mainLoginForm( wfMsg( 'nosuchusershort', htmlspecialchars( $this->mName ) ) );
@@ -676,7 +696,7 @@ class LoginForm {
array( 'parsemag', 'escape' ), $this->mName ) );
break;
default:
- throw new MWException( "Unhandled case value" );
+ throw new MWException( 'Unhandled case value' );
}
}
@@ -692,27 +712,27 @@ class LoginForm {
*/
function mailPassword() {
global $wgUser, $wgOut, $wgAuth;
-
+
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
return false;
}
-
+
if( !$wgAuth->allowPasswordChange() ) {
$this->mainLoginForm( wfMsg( 'resetpass_forbidden' ) );
return;
}
- # Check against blocked IPs so blocked users can't flood admins
+ # Check against blocked IPs so blocked users can't flood admins
# with password resets
if( $wgUser->isBlocked() ) {
$this->mainLoginForm( wfMsg( 'blocked-mailpassword' ) );
return;
}
-
+
# Check for hooks
$error = null;
- if ( ! wfRunHooks( 'UserLoginMailPassword', array( $this->mName, &$error ) ) ) {
+ if ( !wfRunHooks( 'UserLoginMailPassword', array( $this->mName, &$error ) ) ) {
$this->mainLoginForm( $error );
return;
}
@@ -729,7 +749,7 @@ class LoginForm {
$this->mainLoginForm( wfMsg( 'sessionfailure' ) );
return;
}
-
+
# Check against the rate limiter
if( $wgUser->pingLimiter( 'mailpassword' ) ) {
$wgOut->rateLimited();
@@ -767,11 +787,11 @@ class LoginForm {
}
$result = $this->mailPasswordInternal( $u, true, 'passwordremindertitle', 'passwordremindertext' );
- if( WikiError::isError( $result ) ) {
- $this->mainLoginForm( wfMsg( 'mailerror', $result->getMessage() ) );
- } else {
+ if( $result->isGood() ) {
$this->mainLoginForm( wfMsg( 'passwordsent', $u->getName() ), 'success' );
self::clearLoginToken();
+ } else {
+ $this->mainLoginForm( $result->getWikiText( 'mailerror' ) );
}
}
@@ -781,21 +801,21 @@ class LoginForm {
* @param $throttle Boolean
* @param $emailTitle String: message name of email title
* @param $emailText String: message name of email text
- * @return Mixed: true on success, WikiError on failure
+ * @return Status object
* @private
*/
function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle', $emailText = 'passwordremindertext' ) {
global $wgServer, $wgScript, $wgUser, $wgNewPasswordExpiry;
if ( $u->getEmail() == '' ) {
- return new WikiError( wfMsg( 'noemail', $u->getName() ) );
+ return Status::newFatal( 'noemail', $u->getName() );
}
$ip = wfGetIP();
if( !$ip ) {
- return new WikiError( wfMsg( 'badipaddress' ) );
+ return Status::newFatal( 'badipaddress' );
}
-
- wfRunHooks( 'User::mailPasswordInternal', array(&$wgUser, &$ip, &$u) );
+
+ wfRunHooks( 'User::mailPasswordInternal', array( &$wgUser, &$ip, &$u ) );
$np = $u->randomPassword();
$u->setNewpassword( $np, $throttle );
@@ -824,7 +844,7 @@ class LoginForm {
# Run any hooks; display injected HTML if any, else redirect
$injected_html = '';
- wfRunHooks('UserLoginComplete', array(&$wgUser, &$injected_html));
+ wfRunHooks( 'UserLoginComplete', array( &$wgUser, &$injected_html ) );
if( $injected_html !== '' ) {
$this->displaySuccessfulLogin( 'loginsuccess', $injected_html );
@@ -833,7 +853,12 @@ class LoginForm {
if ( !$titleObj instanceof Title ) {
$titleObj = Title::newMainPage();
}
- $wgOut->redirect( $titleObj->getFullURL( $this->mReturnToQuery ) );
+ $redirectUrl = $titleObj->getFullURL( $this->mReturnToQuery );
+ global $wgSecureLogin;
+ if( $wgSecureLogin && !$this->mStickHTTPS ) {
+ $redirectUrl = preg_replace( '/^https:/', 'http:', $redirectUrl );
+ }
+ $wgOut->redirect( $redirectUrl );
}
}
@@ -844,11 +869,10 @@ class LoginForm {
* @private
*/
function successfulCreation() {
- global $wgUser, $wgOut;
-
+ global $wgUser;
# Run any hooks; display injected HTML
$injected_html = '';
- wfRunHooks('UserLoginComplete', array(&$wgUser, &$injected_html));
+ wfRunHooks( 'UserLoginComplete', array( &$wgUser, &$injected_html ) );
$this->displaySuccessfulLogin( 'welcomecreation', $injected_html );
}
@@ -873,22 +897,6 @@ class LoginForm {
}
/** */
- function userNotPrivilegedMessage($errors) {
- global $wgOut;
-
- $wgOut->setPageTitle( wfMsg( 'permissionserrors' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleRelated( false );
-
- $wgOut->addWikitext( $wgOut->formatPermissionsErrorMessage( $errors, 'createaccount' ) );
- // Stuff that might want to be added at the end. For example, instruc-
- // tions if blocked.
- $wgOut->addWikiMsg( 'cantcreateaccount-nonblock-text' );
-
- $wgOut->returnToMain( false );
- }
-
- /** */
function userBlockedMessage() {
global $wgOut, $wgUser;
@@ -920,14 +928,15 @@ class LoginForm {
*/
function mainLoginForm( $msg, $msgtype = 'error' ) {
global $wgUser, $wgOut, $wgHiddenPrefs, $wgEnableEmail;
- global $wgCookiePrefix, $wgLoginLanguageSelector;
+ global $wgRequest, $wgLoginLanguageSelector;
global $wgAuth, $wgEmailConfirmToEdit, $wgCookieExpiration;
-
+ global $wgSecureLogin;
+
$titleObj = SpecialPage::getTitleFor( 'Userlogin' );
-
+
if ( $this->mType == 'signup' ) {
- // Block signup here if in readonly. Keeps user from
- // going through the process (filling out data, etc)
+ // Block signup here if in readonly. Keeps user from
+ // going through the process (filling out data, etc)
// and being informed later.
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
@@ -945,12 +954,10 @@ class LoginForm {
if ( $wgUser->isLoggedIn() ) {
$this->mName = $wgUser->getName();
} else {
- $this->mName = isset( $_COOKIE[$wgCookiePrefix.'UserName'] ) ? $_COOKIE[$wgCookiePrefix.'UserName'] : null;
+ $this->mName = $wgRequest->getCookie( 'UserName' );
}
}
- $titleObj = SpecialPage::getTitleFor( 'Userlogin' );
-
if ( $this->mType == 'signup' ) {
$template = new UsercreateTemplate();
$q = 'action=submitlogin&type=signup';
@@ -965,26 +972,29 @@ class LoginForm {
if ( !empty( $this->mReturnTo ) ) {
$returnto = '&returnto=' . wfUrlencode( $this->mReturnTo );
- if ( !empty( $this->mReturnToQuery ) )
+ if ( !empty( $this->mReturnToQuery ) ) {
$returnto .= '&returntoquery=' .
wfUrlencode( $this->mReturnToQuery );
+ }
$q .= $returnto;
$linkq .= $returnto;
}
# Pass any language selection on to the mode switch link
- if( $wgLoginLanguageSelector && $this->mLanguage )
+ if( $wgLoginLanguageSelector && $this->mLanguage ) {
$linkq .= '&uselang=' . $this->mLanguage;
+ }
- $link = '<a href="' . htmlspecialchars ( $titleObj->getLocalUrl( $linkq ) ) . '">';
+ $link = '<a href="' . htmlspecialchars ( $titleObj->getLocalURL( $linkq ) ) . '">';
$link .= wfMsgHtml( $linkmsg . 'link' ); # Calling either 'gotaccountlink' or 'nologinlink'
$link .= '</a>';
# Don't show a "create account" link if the user can't
- if( $this->showCreateOrLoginLink( $wgUser ) )
- $template->set( 'link', wfMsgWikiHtml( $linkmsg, $link ) );
- else
+ if( $this->showCreateOrLoginLink( $wgUser ) ) {
+ $template->set( 'link', wfMsgExt( $linkmsg, array( 'parseinline', 'replaceafter' ), $link ) );
+ } else {
$template->set( 'link', '' );
+ }
$template->set( 'header', '' );
$template->set( 'name', $this->mName );
@@ -993,8 +1003,9 @@ class LoginForm {
$template->set( 'email', $this->mEmail );
$template->set( 'realname', $this->mRealName );
$template->set( 'domain', $this->mDomain );
+ $template->set( 'reason', $this->mReason );
- $template->set( 'action', $titleObj->getLocalUrl( $q ) );
+ $template->set( 'action', $titleObj->getLocalURL( $q ) );
$template->set( 'message', $msg );
$template->set( 'messagetype', $msgtype );
$template->set( 'createemail', $wgEnableEmail && $wgUser->isLoggedIn() );
@@ -1003,7 +1014,10 @@ class LoginForm {
$template->set( 'emailrequired', $wgEmailConfirmToEdit );
$template->set( 'canreset', $wgAuth->allowPasswordChange() );
$template->set( 'canremember', ( $wgCookieExpiration > 0 ) );
- $template->set( 'remember', $wgUser->getOption( 'rememberpassword' ) or $this->mRemember );
+ $template->set( 'usereason', $wgUser->isLoggedIn() );
+ $template->set( 'remember', $wgUser->getOption( 'rememberpassword' ) || $this->mRemember );
+ $template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
+ $template->set( 'stickHTTPS', $this->mStickHTTPS );
if ( $this->mType == 'signup' ) {
if ( !self::getCreateaccountToken() ) {
@@ -1016,7 +1030,7 @@ class LoginForm {
}
$template->set( 'token', self::getLoginToken() );
}
-
+
# Prepare language selection links as needed
if( $wgLoginLanguageSelector ) {
$template->set( 'languages', $this->makeLanguageSelector() );
@@ -1032,7 +1046,7 @@ class LoginForm {
wfRunHooks( 'UserLoginForm', array( &$template ) );
}
- //Changes the title depending on permissions for creating account
+ // Changes the title depending on permissions for creating account
if ( $wgUser->isAllowed( 'createaccount' ) ) {
$wgOut->setPageTitle( wfMsg( 'userlogin' ) );
} else {
@@ -1041,7 +1055,7 @@ class LoginForm {
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->setArticleRelated( false );
- $wgOut->disallowUserJs(); // just in case...
+ $wgOut->disallowUserJs(); // just in case...
$wgOut->addTemplate( $template );
}
@@ -1071,7 +1085,7 @@ class LoginForm {
global $wgDisableCookieCheck, $wgRequest;
return $wgDisableCookieCheck ? true : $wgRequest->checkSessionCookie();
}
-
+
/**
* Get the login token from the current session
*/
@@ -1079,7 +1093,7 @@ class LoginForm {
global $wgRequest;
return $wgRequest->getSessionData( 'wsLoginToken' );
}
-
+
/**
* Randomly generate a new login token and attach it to the current session
*/
@@ -1089,7 +1103,7 @@ class LoginForm {
// because the latter reuses $_SESSION['wsEditToken']
$wgRequest->setSessionData( 'wsLoginToken', User::generateToken() );
}
-
+
/**
* Remove any login token attached to the current session
*/
@@ -1105,7 +1119,7 @@ class LoginForm {
global $wgRequest;
return $wgRequest->getSessionData( 'wsCreateaccountToken' );
}
-
+
/**
* Randomly generate a new createaccount token and attach it to the current session
*/
@@ -1113,7 +1127,7 @@ class LoginForm {
global $wgRequest;
$wgRequest->setSessionData( 'wsCreateaccountToken', User::generateToken() );
}
-
+
/**
* Remove any createaccount token attached to the current session
*/
@@ -1130,7 +1144,9 @@ class LoginForm {
$titleObj = SpecialPage::getTitleFor( 'Userlogin' );
$query = array( 'wpCookieCheck' => $type );
- if ( $this->mReturnTo ) $query['returnto'] = $this->mReturnTo;
+ if ( $this->mReturnTo ) {
+ $query['returnto'] = $this->mReturnTo;
+ }
$check = $titleObj->getFullURL( $query );
return $wgOut->redirect( $check );
@@ -1143,7 +1159,7 @@ class LoginForm {
if ( !$this->hasSessionCookie() ) {
if ( $type == 'new' ) {
return $this->mainLoginForm( wfMsgExt( 'nocookiesnew', array( 'parseinline' ) ) );
- } else if ( $type == 'login' ) {
+ } elseif ( $type == 'login' ) {
return $this->mainLoginForm( wfMsgExt( 'nocookieslogin', array( 'parseinline' ) ) );
} else {
# shouldn't happen
@@ -1177,7 +1193,7 @@ class LoginForm {
foreach( $langs as $lang ) {
$lang = trim( $lang, '* ' );
$parts = explode( '|', $lang );
- if (count($parts) >= 2) {
+ if ( count( $parts ) >= 2 ) {
$links[] = $this->makeLanguageSelectorLink( $parts[0], $parts[1] );
}
}
@@ -1198,10 +1214,12 @@ class LoginForm {
global $wgUser;
$self = SpecialPage::getTitleFor( 'Userlogin' );
$attr = array( 'uselang' => $lang );
- if( $this->mType == 'signup' )
+ if( $this->mType == 'signup' ) {
$attr['type'] = 'signup';
- if( $this->mReturnTo )
+ }
+ if( $this->mReturnTo ) {
$attr['returnto'] = $this->mReturnTo;
+ }
$skin = $wgUser->getSkin();
return $skin->linkKnown(
$self,
diff --git a/includes/specials/SpecialUserlogout.php b/includes/specials/SpecialUserlogout.php
index e23df612..39b5b284 100644
--- a/includes/specials/SpecialUserlogout.php
+++ b/includes/specials/SpecialUserlogout.php
@@ -1,33 +1,63 @@
<?php
/**
+ * Implements Special:Upload
+ *
+ * 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
*/
/**
- * constructor
+ * Implements Special:Userlogout
+ *
+ * @ingroup SpecialPage
*/
-function wfSpecialUserlogout() {
- global $wgUser, $wgOut;
-
- /**
- * Some satellite ISPs use broken precaching schemes that log people out straight after
- * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
- */
- if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
- wfDebug( "Special:Userlogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
- wfHttpError( 400, wfMsg( 'loginerror' ), wfMsg( 'suspicious-userlogout' ) );
- return;
+class SpecialUserlogout extends UnlistedSpecialPage {
+
+ function __construct() {
+ parent::__construct( 'Userlogout' );
}
-
- $oldName = $wgUser->getName();
- $wgUser->logout();
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- // Hook.
- $injected_html = '';
- wfRunHooks( 'UserLogoutComplete', array(&$wgUser, &$injected_html, $oldName) );
+ function execute( $par ) {
+ global $wgUser, $wgOut;
+
+ /**
+ * Some satellite ISPs use broken precaching schemes that log people out straight after
+ * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
+ */
+ if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
+ wfDebug( "Special:Userlogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
+ wfHttpError( 400, wfMsg( 'loginerror' ), wfMsg( 'suspicious-userlogout' ) );
+ return;
+ }
+
+ $this->setHeaders();
+ $this->outputHeader();
- $wgOut->addHTML( wfMsgExt( 'logouttext', array( 'parse' ) ) . $injected_html );
- $wgOut->returnToMain();
+ $oldName = $wgUser->getName();
+ $wgUser->logout();
+
+ $wgOut->addWikiMsg( 'logouttext' );
+
+ // Hook.
+ $injected_html = '';
+ wfRunHooks( 'UserLogoutComplete', array( &$wgUser, &$injected_html, $oldName ) );
+ $wgOut->addHTML( $injected_html );
+
+ $wgOut->returnToMain();
+ }
}
diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php
index 36caf9a6..6ea8668b 100644
--- a/includes/specials/SpecialUserrights.php
+++ b/includes/specials/SpecialUserrights.php
@@ -1,13 +1,29 @@
<?php
/**
- * Special page to allow managing user group membership
+ * Implements Special:Userrights
+ *
+ * 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
*/
/**
- * A class to manage user levels rights.
+ * Special page to allow managing user group membership
+ *
* @ingroup SpecialPage
*/
class UserrightsPage extends SpecialPage {
@@ -32,10 +48,10 @@ class UserrightsPage extends SpecialPage {
public function userCanChangeRights( $user, $checkIfSelf = true ) {
$available = $this->changeableGroups();
return !empty( $available['add'] )
- or !empty( $available['remove'] )
- or ( ( $this->isself || !$checkIfSelf ) and
+ || !empty( $available['remove'] )
+ || ( ( $this->isself || !$checkIfSelf ) &&
( !empty( $available['add-self'] )
- or !empty( $available['remove-self'] ) ) );
+ || !empty( $available['remove-self'] ) ) );
}
/**
@@ -49,7 +65,7 @@ class UserrightsPage extends SpecialPage {
// any groups, it's a bit silly to give them the user search prompt.
global $wgUser, $wgRequest, $wgOut;
- if( $par ) {
+ if( $par !== null ) {
$this->mTarget = $par;
} else {
$this->mTarget = $wgRequest->getVal( 'user' );
@@ -67,7 +83,7 @@ class UserrightsPage extends SpecialPage {
$available = $this->changeableGroups();
- if ( !$this->mTarget ) {
+ if ( $this->mTarget === null ) {
/*
* If the user specified no target, and they can only
* edit their own groups, automatically set them as the
@@ -77,8 +93,9 @@ class UserrightsPage extends SpecialPage {
$this->mTarget = $wgUser->getName();
}
- if ( $this->mTarget == $wgUser->getName() )
+ if ( User::getCanonicalName( $this->mTarget ) == $wgUser->getName() ) {
$this->isself = true;
+ }
if( !$this->userCanChangeRights( $wgUser, true ) ) {
// fixme... there may be intermediate groups we can mention.
@@ -99,8 +116,9 @@ class UserrightsPage extends SpecialPage {
$this->setHeaders();
// show the general form
- if ( count( $available['add'] ) || count( $available['remove'] ) )
+ if ( count( $available['add'] ) || count( $available['remove'] ) ) {
$this->switchForm();
+ }
if( $wgRequest->wasPosted() ) {
// save settings
@@ -121,7 +139,7 @@ class UserrightsPage extends SpecialPage {
}
// show some more forms
- if( $this->mTarget ) {
+ if( $this->mTarget !== null ) {
$this->editUserGroupsForm( $this->mTarget );
}
}
@@ -139,12 +157,14 @@ class UserrightsPage extends SpecialPage {
* @return null
*/
function saveUserGroups( $username, $reason = '' ) {
- global $wgRequest, $wgUser, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+ global $wgRequest, $wgOut;
- $user = $this->fetchUser( $username );
- if( $user instanceof WikiErrorMsg ) {
- $wgOut->addWikiMsgArray( $user->getMessageKey(), $user->getMessageArgs() );
+ $status = $this->fetchUser( $username );
+ if( !$status->isOK() ) {
+ $wgOut->addWikiText( $status->getWikiText() );
return;
+ } else {
+ $user = $status->value;
}
$allgroups = $this->getAllGroups();
@@ -162,7 +182,7 @@ class UserrightsPage extends SpecialPage {
$removegroup[] = $group;
}
}
-
+
$this->doSaveUserGroups( $user, $addgroup, $removegroup, $reason );
}
@@ -247,10 +267,12 @@ class UserrightsPage extends SpecialPage {
function editUserGroupsForm( $username ) {
global $wgOut;
- $user = $this->fetchUser( $username );
- if( $user instanceof WikiErrorMsg ) {
- $wgOut->addWikiMsgArray( $user->getMessageKey(), $user->getMessageArgs() );
+ $status = $this->fetchUser( $username );
+ if( !$status->isOK() ) {
+ $wgOut->addWikiText( $status->getWikiText() );
return;
+ } else {
+ $user = $status->value;
}
$groups = $user->getGroups();
@@ -267,7 +289,7 @@ class UserrightsPage extends SpecialPage {
* return a user (or proxy) object for manipulating it.
*
* Side effects: error output for invalid access
- * @return mixed User, UserRightsProxy, or WikiErrorMsg
+ * @return Status object
*/
public function fetchUser( $username ) {
global $wgUser, $wgUserrightsInterwikiDelimiter;
@@ -278,21 +300,21 @@ class UserrightsPage extends SpecialPage {
$database = '';
} else {
list( $name, $database ) = array_map( 'trim', $parts );
-
+
if( $database == wfWikiID() ) {
$database = '';
} else {
if( !$wgUser->isAllowed( 'userrights-interwiki' ) ) {
- return new WikiErrorMsg( 'userrights-no-interwiki' );
+ return Status::newFatal( 'userrights-no-interwiki' );
}
if( !UserRightsProxy::validDatabase( $database ) ) {
- return new WikiErrorMsg( 'userrights-nodatabase', $database );
+ return Status::newFatal( 'userrights-nodatabase', $database );
}
}
}
- if( $name == '' ) {
- return new WikiErrorMsg( 'nouserspecified' );
+ if( $name === '' ) {
+ return Status::newFatal( 'nouserspecified' );
}
if( $name{0} == '#' ) {
@@ -307,13 +329,13 @@ class UserrightsPage extends SpecialPage {
}
if( !$name ) {
- return new WikiErrorMsg( 'noname' );
+ return Status::newFatal( 'noname' );
}
} else {
$name = User::getCanonicalName( $name );
- if( !$name ) {
+ if( $name === false ) {
// invalid name
- return new WikiErrorMsg( 'nosuchusershort', $username );
+ return Status::newFatal( 'nosuchusershort', $username );
}
}
@@ -324,10 +346,10 @@ class UserrightsPage extends SpecialPage {
}
if( !$user || $user->isAnon() ) {
- return new WikiErrorMsg( 'nosuchusershort', $username );
+ return Status::newFatal( 'nosuchusershort', $username );
}
- return $user;
+ return Status::newGood( $user );
}
function makeGroupNameList( $ids ) {
@@ -352,14 +374,13 @@ class UserrightsPage extends SpecialPage {
function switchForm() {
global $wgOut, $wgScript;
$wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
- Xml::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', array(), wfMsg( 'userrights-lookup-user' ) ) .
- Xml::inputLabel( wfMsg( 'userrights-user-editname' ), 'user', 'username', 30, $this->mTarget ) . ' ' .
+ Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ Xml::fieldset( wfMsg( 'userrights-lookup-user' ) ) .
+ Xml::inputLabel( wfMsg( 'userrights-user-editname' ), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ) ) . ' ' .
Xml::submitButton( wfMsg( 'editusergroup' ) ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' ) . "\n"
+ Html::closeElement( 'fieldset' ) .
+ Html::closeElement( 'form' ) . "\n"
);
}
@@ -396,8 +417,9 @@ class UserrightsPage extends SpecialPage {
global $wgOut, $wgUser, $wgLang;
$list = array();
- foreach( $groups as $group )
+ foreach( $groups as $group ) {
$list[] = self::buildGroupLink( $group );
+ }
$autolist = array();
if ( $user instanceof User ) {
@@ -417,8 +439,8 @@ class UserrightsPage extends SpecialPage {
}
$wgOut->addHTML(
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'name' => 'editGroup', 'id' => 'mw-userrights-form2' ) ) .
- Xml::hidden( 'user', $this->mTarget ) .
- Xml::hidden( 'wpEditToken', $wgUser->editToken( $this->mTarget ) ) .
+ Html::hidden( 'user', $this->mTarget ) .
+ Html::hidden( 'wpEditToken', $wgUser->editToken( $this->mTarget ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', array(), wfMsg( 'userrights-editusergroup' ) ) .
wfMsgExt( 'editinguser', array( 'parse' ), wfEscapeWikiText( $user->getName() ) ) .
@@ -437,7 +459,8 @@ class UserrightsPage extends SpecialPage {
<tr>
<td></td>
<td class='mw-submit'>" .
- Xml::submitButton( wfMsg( 'saveusergroups' ), array( 'name' => 'saveusergroups', 'accesskey' => 's' ) ) .
+ Xml::submitButton( wfMsg( 'saveusergroups' ),
+ array( 'name' => 'saveusergroups' ) + $wgUser->getSkin()->tooltipAndAccessKeyAttribs( 'userrights-set' ) ) .
"</td>
</tr>" .
Xml::closeElement( 'table' ) . "\n" .
@@ -511,7 +534,7 @@ class UserrightsPage extends SpecialPage {
foreach( $columns as $name => $column ) {
if( $column === array() )
continue;
- $ret .= xml::element( 'th', null, wfMsg( 'userrights-' . $name . '-col' ) );
+ $ret .= Xml::element( 'th', null, wfMsg( 'userrights-' . $name . '-col' ) );
}
$ret.= "</tr>\n<tr>\n";
foreach( $columns as $column ) {
@@ -522,7 +545,7 @@ class UserrightsPage extends SpecialPage {
$attr = $checkbox['disabled'] ? array( 'disabled' => 'disabled' ) : array();
if ( $checkbox['irreversible'] ) {
- $text = htmlspecialchars( wfMsg( 'userrights-irreversible-marker',
+ $text = htmlspecialchars( wfMsg( 'userrights-irreversible-marker',
User::getGroupMember( $group ) ) );
} else {
$text = htmlspecialchars( User::getGroupMember( $group ) );
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php
index ebc50bab..101823db 100644
--- a/includes/specials/SpecialVersion.php
+++ b/includes/specials/SpecialVersion.php
@@ -1,35 +1,56 @@
<?php
+/**
+ * Implements Special:Version
+ *
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason
+ *
+ * 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
+ */
/**
* Give information about the version of MediaWiki, PHP, the DB and extensions
*
* @ingroup SpecialPage
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class SpecialVersion extends SpecialPage {
- private $firstExtOpened = true;
+
+ protected $firstExtOpened = false;
- static $viewvcUrls = array(
+ protected static $extensionTypes = false;
+
+ protected static $viewvcUrls = array(
'svn+ssh://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki',
'http://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki',
# Doesn't work at the time of writing but maybe some day:
'https://svn.wikimedia.org/viewvc/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki',
);
- function __construct(){
+ public function __construct(){
parent::__construct( 'Version' );
}
/**
* main()
*/
- function execute( $par ) {
- global $wgOut, $wgMessageCache, $wgSpecialVersionShowHooks, $wgContLang;
- $wgMessageCache->loadAllMessages();
-
+ public function execute( $par ) {
+ global $wgOut, $wgSpecialVersionShowHooks, $wgContLang;
+
$this->setHeaders();
$this->outputHeader();
$wgOut->allowClickjacking();
@@ -37,74 +58,76 @@ class SpecialVersion extends SpecialPage {
$wgOut->addHTML( Xml::openElement( 'div',
array( 'dir' => $wgContLang->getDir() ) ) );
$text =
- $this->MediaWikiCredits() .
+ $this->getMediaWikiCredits() .
$this->softwareInformation() .
- $this->extensionCredits();
+ $this->getExtensionCredits();
if ( $wgSpecialVersionShowHooks ) {
- $text .= $this->wgHooks();
+ $text .= $this->getWgHooks();
}
+
$wgOut->addWikiText( $text );
$wgOut->addHTML( $this->IPInfo() );
$wgOut->addHTML( '</div>' );
}
- /**#@+
- * @private
- */
-
/**
- * @return wiki text showing the license information
+ * Returns wiki text showing the license information.
+ *
+ * @return string
*/
- static function MediaWikiCredits() {
- global $wgContLang;
-
+ private static function getMediaWikiCredits() {
$ret = Xml::element( 'h2', array( 'id' => 'mw-version-license' ), wfMsg( 'version-license' ) );
// This text is always left-to-right.
- $ret .= '<div dir="ltr">';
+ $ret .= '<div>';
$ret .= "__NOTOC__
- This wiki is powered by '''[http://www.mediawiki.org/ MediaWiki]''',
- copyright © 2001-2010 Magnus Manske, Brion Vibber, Lee Daniel Crocker,
- Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason,
- Niklas Laxström, Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor,
- Aaron Schulz, Andrew Garrett, Raimond Spekking, Alexandre Emsenhuber,
- Siebrand Mazeland, Chad Horohoe and others.
-
- MediaWiki 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.
-
- MediaWiki 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 [{{SERVER}}{{SCRIPTPATH}}/COPYING 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
- or [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].
- ";
+ " . self::getCopyrightAndAuthorList() . "\n
+ " . wfMsg( 'version-license-info' );
$ret .= '</div>';
return str_replace( "\t\t", '', $ret ) . "\n";
}
/**
- * @return wiki text showing the third party software versions (apache, php, mysql).
+ * Get the "MediaWiki is copyright 2001-20xx by lots of cool guys" text
+ *
+ * @return String
+ */
+ public static function getCopyrightAndAuthorList() {
+ global $wgLang;
+
+ $authorList = array(
+ 'Magnus Manske', 'Brion Vibber', 'Lee Daniel Crocker',
+ 'Tim Starling', 'Erik Möller', 'Gabriel Wicke', 'Ævar Arnfjörð Bjarmason',
+ 'Niklas Laxström', 'Domas Mituzas', 'Rob Church', 'Yuri Astrakhan',
+ 'Aryeh Gregor', 'Aaron Schulz', 'Andrew Garrett', 'Raimond Spekking',
+ 'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
+ 'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
+ 'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Ashar Voultoiz',
+ wfMsg( 'version-poweredby-others' )
+ );
+
+ return wfMsg( 'version-poweredby-credits', date( 'Y' ),
+ $wgLang->listToText( $authorList ) );
+ }
+
+ /**
+ * Returns wiki text showing the third party software versions (apache, php, mysql).
+ *
+ * @return string
*/
static function softwareInformation() {
$dbr = wfGetDB( DB_SLAVE );
// Put the software in an array of form 'name' => 'version'. All messages should
// be loaded here, so feel free to use wfMsg*() in the 'name'. Raw HTML or wikimarkup
- // can be used
+ // can be used.
$software = array();
$software['[http://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
$software['[http://www.php.net/ PHP]'] = phpversion() . " (" . php_sapi_name() . ")";
- $software[$dbr->getSoftwareLink()] = $dbr->getServerVersion();
+ $software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
- // Allow a hook to add/remove items
+ // Allow a hook to add/remove items.
wfRunHooks( 'SoftwareInfo', array( &$software ) );
$out = Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMsg( 'version-software' ) ) .
@@ -113,17 +136,19 @@ class SpecialVersion extends SpecialPage {
<th>" . wfMsg( 'version-software-product' ) . "</th>
<th>" . wfMsg( 'version-software-version' ) . "</th>
</tr>\n";
+
foreach( $software as $name => $version ) {
$out .= "<tr>
<td>" . $name . "</td>
<td>" . $version . "</td>
</tr>\n";
- }
+ }
+
return $out . Xml::closeElement( 'table' );
}
/**
- * Return a string of the MediaWiki version with SVN revision if available
+ * Return a string of the MediaWiki version with SVN revision if available.
*
* @return mixed
*/
@@ -151,20 +176,23 @@ class SpecialVersion extends SpecialPage {
/**
* Return a wikitext-formatted string of the MediaWiki version with a link to
- * the SVN revision if available
+ * the SVN revision if available.
*
* @return mixed
*/
public static function getVersionLinked() {
global $wgVersion, $IP;
wfProfileIn( __METHOD__ );
+
$info = self::getSvnInfo( $IP );
- if ( isset( $info['checkout-rev'] ) ) {
+
+ if ( isset( $info['checkout-rev'] ) ) {
$linkText = wfMsg(
'version-svn-revision',
isset( $info['directory-rev'] ) ? $info['directory-rev'] : '',
$info['checkout-rev']
);
+
if ( isset( $info['viewvc-url'] ) ) {
$version = "$wgVersion [{$info['viewvc-url']} $linkText]";
} else {
@@ -173,54 +201,115 @@ class SpecialVersion extends SpecialPage {
} else {
$version = $wgVersion;
}
+
wfProfileOut( __METHOD__ );
return $version;
}
- /** Generate wikitext showing extensions name, URL, author and description */
- function extensionCredits() {
+ /**
+ * Returns an array with the base extension types.
+ * Type is stored as array key, the message as array value.
+ *
+ * TODO: ideally this would return all extension types, including
+ * those added by SpecialVersionExtensionTypes. This is not possible
+ * since this hook is passing along $this though.
+ *
+ * @since 1.17
+ *
+ * @return array
+ */
+ public static function getExtensionTypes() {
+ if ( self::$extensionTypes === false ) {
+ self::$extensionTypes = array(
+ 'specialpage' => wfMsg( 'version-specialpages' ),
+ 'parserhook' => wfMsg( 'version-parserhooks' ),
+ 'variable' => wfMsg( 'version-variables' ),
+ 'media' => wfMsg( 'version-mediahandlers' ),
+ 'skin' => wfMsg( 'version-skins' ),
+ 'other' => wfMsg( 'version-other' ),
+ );
+
+ wfRunHooks( 'ExtensionTypes', array( &self::$extensionTypes ) );
+ }
+
+ return self::$extensionTypes;
+ }
+
+ /**
+ * Returns the internationalized name for an extension type.
+ *
+ * @since 1.17
+ *
+ * @param $type String
+ *
+ * @return string
+ */
+ public static function getExtensionTypeName( $type ) {
+ $types = self::getExtensionTypes();
+ return isset( $types[$type] ) ? $types[$type] : $types['other'];
+ }
+
+ /**
+ * Generate wikitext showing extensions name, URL, author and description.
+ *
+ * @return String: Wikitext
+ */
+ function getExtensionCredits() {
global $wgExtensionCredits, $wgExtensionFunctions, $wgParser, $wgSkinExtensionFunctions;
- if ( ! count( $wgExtensionCredits ) && ! count( $wgExtensionFunctions ) && ! count( $wgSkinExtensionFunctions ) )
+ if ( !count( $wgExtensionCredits ) && !count( $wgExtensionFunctions ) && !count( $wgSkinExtensionFunctions ) ) {
return '';
+ }
- $extensionTypes = array(
- 'specialpage' => wfMsg( 'version-specialpages' ),
- 'parserhook' => wfMsg( 'version-parserhooks' ),
- 'variable' => wfMsg( 'version-variables' ),
- 'media' => wfMsg( 'version-mediahandlers' ),
- 'other' => wfMsg( 'version-other' ),
- );
+ $extensionTypes = self::getExtensionTypes();
+
+ /**
+ * @deprecated as of 1.17, use hook ExtensionTypes instead.
+ */
wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ) );
$out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), wfMsg( 'version-extensions' ) ) .
Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-ext' ) );
- foreach ( $extensionTypes as $type => $text ) {
- if ( isset ( $wgExtensionCredits[$type] ) && count ( $wgExtensionCredits[$type] ) ) {
- $out .= $this->openExtType( $text, 'credits-' . $type );
-
- usort( $wgExtensionCredits[$type], array( $this, 'compare' ) );
-
- foreach ( $wgExtensionCredits[$type] as $extension ) {
- $out .= $this->formatCredits( $extension );
- }
+ // Make sure the 'other' type is set to an array.
+ if ( !array_key_exists( 'other', $wgExtensionCredits ) ) {
+ $wgExtensionCredits['other'] = array();
+ }
+
+ // Find all extensions that do not have a valid type and give them the type 'other'.
+ foreach ( $wgExtensionCredits as $type => $extensions ) {
+ if ( !array_key_exists( $type, $extensionTypes ) ) {
+ $wgExtensionCredits['other'] = array_merge( $wgExtensionCredits['other'], $extensions );
+ }
+ }
+
+ // Loop through the extension categories to display their extensions in the list.
+ foreach ( $extensionTypes as $type => $message ) {
+ if ( $type != 'other' ) {
+ $out .= $this->getExtensionCategory( $type, $message );
}
}
+
+ // We want the 'other' type to be last in the list.
+ $out .= $this->getExtensionCategory( 'other', $extensionTypes['other'] );
if ( count( $wgExtensionFunctions ) ) {
$out .= $this->openExtType( wfMsg( 'version-extension-functions' ), 'extension-functions' );
$out .= '<tr><td colspan="4">' . $this->listToText( $wgExtensionFunctions ) . "</td></tr>\n";
}
- if ( $cnt = count( $tags = $wgParser->getTags() ) ) {
- for ( $i = 0; $i < $cnt; ++$i )
+ $tags = $wgParser->getTags();
+ $cnt = count( $tags );
+
+ if ( $cnt ) {
+ for ( $i = 0; $i < $cnt; ++$i ) {
$tags[$i] = "&lt;{$tags[$i]}&gt;";
+ }
$out .= $this->openExtType( wfMsg( 'version-parser-extensiontags' ), 'parser-tags' );
$out .= '<tr><td colspan="4">' . $this->listToText( $tags ). "</td></tr>\n";
}
- if( $cnt = count( $fhooks = $wgParser->getFunctionHooks() ) ) {
+ if( count( $fhooks = $wgParser->getFunctionHooks() ) ) {
$out .= $this->openExtType( wfMsg( 'version-parser-function-hooks' ), 'parser-function-hooks' );
$out .= '<tr><td colspan="4">' . $this->listToText( $fhooks ) . "</td></tr>\n";
}
@@ -229,11 +318,43 @@ class SpecialVersion extends SpecialPage {
$out .= $this->openExtType( wfMsg( 'version-skin-extension-functions' ), 'skin-extension-functions' );
$out .= '<tr><td colspan="4">' . $this->listToText( $wgSkinExtensionFunctions ) . "</td></tr>\n";
}
+
$out .= Xml::closeElement( 'table' );
+
return $out;
}
+
+ /**
+ * Creates and returns the HTML for a single extension category.
+ *
+ * @since 1.17
+ *
+ * @param $type String
+ * @param $message String
+ *
+ * @return string
+ */
+ protected function getExtensionCategory( $type, $message ) {
+ global $wgExtensionCredits;
+
+ $out = '';
+
+ if ( array_key_exists( $type, $wgExtensionCredits ) && count( $wgExtensionCredits[$type] ) > 0 ) {
+ $out .= $this->openExtType( $message, 'credits-' . $type );
+
+ usort( $wgExtensionCredits[$type], array( $this, 'compare' ) );
+
+ foreach ( $wgExtensionCredits[$type] as $extension ) {
+ $out .= $this->getCreditsForExtension( $extension );
+ }
+ }
- /** Callback to sort extensions by type */
+ return $out;
+ }
+
+ /**
+ * Callback to sort extensions by type.
+ */
function compare( $a, $b ) {
global $wgLang;
if( $a['name'] === $b['name'] ) {
@@ -245,8 +366,16 @@ class SpecialVersion extends SpecialPage {
}
}
- function formatCredits( $extension ) {
+ /**
+ * Creates and formats the creidts for a single extension and returns this.
+ *
+ * @param $extension Array
+ *
+ * @return string
+ */
+ function getCreditsForExtension( array $extension ) {
$name = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
+
if ( isset( $extension['path'] ) ) {
$svnInfo = self::getSvnInfo( dirname($extension['path']) );
$directoryRev = isset( $svnInfo['directory-rev'] ) ? $svnInfo['directory-rev'] : null;
@@ -258,12 +387,13 @@ class SpecialVersion extends SpecialPage {
$viewvcUrl = null;
}
- # Make main link (or just the name if there is no URL)
+ # Make main link (or just the name if there is no URL).
if ( isset( $extension['url'] ) ) {
$mainLink = "[{$extension['url']} $name]";
} else {
$mainLink = $name;
}
+
if ( isset( $extension['version'] ) ) {
$versionText = '<span class="mw-version-ext-version">' .
wfMsg( 'version-version', $extension['version'] ) .
@@ -272,7 +402,7 @@ class SpecialVersion extends SpecialPage {
$versionText = '';
}
- # Make subversion text/link
+ # Make subversion text/link.
if ( $checkoutRev ) {
$svnText = wfMsg( 'version-svn-revision', $directoryRev, $checkoutRev );
$svnText = isset( $viewvcUrl ) ? "[$viewvcUrl $svnText]" : $svnText;
@@ -280,11 +410,13 @@ class SpecialVersion extends SpecialPage {
$svnText = false;
}
- # Make description text
+ # Make description text.
$description = isset ( $extension['description'] ) ? $extension['description'] : '';
+
if( isset ( $extension['descriptionmsg'] ) ) {
- # Look for a localized description
+ # Look for a localized description.
$descriptionMsg = $extension['descriptionmsg'];
+
if( is_array( $descriptionMsg ) ) {
$descriptionMsgKey = $descriptionMsg[0]; // Get the message key
array_shift( $descriptionMsg ); // Shift out the message key to get the parameters only
@@ -306,17 +438,21 @@ class SpecialVersion extends SpecialPage {
$extNameVer = "<tr>
<td colspan=\"2\"><em>$mainLink $versionText</em></td>";
}
+
$author = isset ( $extension['author'] ) ? $extension['author'] : array();
$extDescAuthor = "<td>$description</td>
<td>" . $this->listToText( (array)$author, false ) . "</td>
</tr>\n";
+
return $extNameVer . $extDescAuthor;
}
/**
- * @return string
+ * Generate wikitext showing hooks in $wgHooks.
+ *
+ * @return String: wikitext
*/
- function wgHooks() {
+ private function getWgHooks() {
global $wgHooks;
if ( count( $wgHooks ) ) {
@@ -346,32 +482,39 @@ class SpecialVersion extends SpecialPage {
$opt = array( 'colspan' => 4 );
$out = '';
- if( !$this->firstExtOpened ) {
+ if( $this->firstExtOpened ) {
// Insert a spacing line
- $out .= '<tr class="sv-space">' . Xml::element( 'td', $opt ) . "</tr>\n";
+ $out .= '<tr class="sv-space">' . Html::element( 'td', $opt ) . "</tr>\n";
}
- $this->firstExtOpened = false;
-
- if( $name )
+ $this->firstExtOpened = true;
+
+ if( $name ) {
$opt['id'] = "sv-$name";
+ }
$out .= "<tr>" . Xml::element( 'th', $opt, $text ) . "</tr>\n";
+
return $out;
}
/**
- * @return string
+ * Get information about client's IP address.
+ *
+ * @return String: HTML fragment
*/
- function IPInfo() {
+ private function IPInfo() {
$ip = str_replace( '--', ' - ', htmlspecialchars( wfGetIP() ) );
return "<!-- visited from $ip -->\n" .
"<span style='display:none'>visited from $ip</span>";
}
/**
- * @param array $list
- * @param bool $sort
- * @return string
+ * Convert an array of items into a list for display.
+ *
+ * @param $list Array of elements to display
+ * @param $sort Boolean: whether to sort the items in $list
+ *
+ * @return String
*/
function listToText( $list, $sort = true ) {
$cnt = count( $list );
@@ -391,9 +534,12 @@ class SpecialVersion extends SpecialPage {
}
/**
- * @param mixed $list Will convert an array to string if given and return
- * the paramater unaltered otherwise
- * @return mixed
+ * Convert an array or object to a string for display.
+ *
+ * @param $list Mixed: will convert an array to string if given and return
+ * the paramater unaltered otherwise
+ *
+ * @return Mixed
*/
static function arrayToString( $list ) {
if( is_array( $list ) && count( $list ) == 1 )
@@ -462,41 +608,47 @@ class SpecialVersion extends SpecialPage {
}
}
}
+
return false;
}
- // subversion is release 1.4 or above
+ // Subversion is release 1.4 or above.
if ( count( $lines ) < 11 ) {
return false;
}
+
$info = array(
'checkout-rev' => intval( trim( $lines[3] ) ),
'url' => trim( $lines[4] ),
'repo-url' => trim( $lines[5] ),
'directory-rev' => intval( trim( $lines[10] ) )
);
+
if ( isset( self::$viewvcUrls[$info['repo-url']] ) ) {
$viewvc = str_replace(
$info['repo-url'],
self::$viewvcUrls[$info['repo-url']],
$info['url']
);
- $pathRelativeToRepo = substr( $info['url'], strlen( $info['repo-url'] ) );
+
$viewvc .= '/?pathrev=';
$viewvc .= urlencode( $info['checkout-rev'] );
$info['viewvc-url'] = $viewvc;
}
+
return $info;
}
/**
* Retrieve the revision number of a Subversion working directory.
*
- * @param String $dir Directory of the svn checkout
- * @return int revision number as int
+ * @param $dir String: directory of the svn checkout
+ *
+ * @return Integer: revision number as int
*/
public static function getSvnRevision( $dir ) {
$info = self::getSvnInfo( $dir );
+
if ( $info === false ) {
return false;
} elseif ( isset( $info['checkout-rev'] ) ) {
@@ -506,5 +658,4 @@ class SpecialVersion extends SpecialPage {
}
}
- /**#@-*/
}
diff --git a/includes/specials/SpecialWantedcategories.php b/includes/specials/SpecialWantedcategories.php
index 5e5a4f17..b588dbf0 100644
--- a/includes/specials/SpecialWantedcategories.php
+++ b/includes/specials/SpecialWantedcategories.php
@@ -1,5 +1,24 @@
<?php
/**
+ * Implements Special:Wantedcategories
+ *
+ * Copyright © 2005 Ævar Arnfjörð Bjarmason
+ *
+ * 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
*/
@@ -8,10 +27,6 @@
* A querypage to list the most wanted categories - implements Special:Wantedcategories
*
* @ingroup SpecialPage
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class WantedCategoriesPage extends WantedQueryPage {
diff --git a/includes/specials/SpecialWantedfiles.php b/includes/specials/SpecialWantedfiles.php
index 189b9d8b..d6c1157b 100644
--- a/includes/specials/SpecialWantedfiles.php
+++ b/includes/specials/SpecialWantedfiles.php
@@ -1,17 +1,33 @@
<?php
-/*
+/**
+ * Implements Special:Wantedfiles
+ *
+ * Copyright © 2008 Soxred93
+ *
+ * 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
+ * @author Soxred93 <soxred93@gmail.com>
*/
/**
- * Querypage that lists the most wanted files - implements Special:Wantedfiles
+ * Querypage that lists the most wanted files
*
* @ingroup SpecialPage
- *
- * @author Soxred93 <soxred93@gmail.com>
- * @copyright Copyright © 2008, Soxred93
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class WantedFilesPage extends WantedQueryPage {
@@ -19,9 +35,19 @@ class WantedFilesPage extends WantedQueryPage {
return 'Wantedfiles';
}
+ /**
+ * KLUGE: The results may contain false positives for files
+ * that exist e.g. in a shared repo. Setting this at least
+ * keeps them from showing up as redlinks in the output, even
+ * if it doesn't fix the real problem (bug 6220).
+ */
+ function forceExistenceCheck() {
+ return true;
+ }
+
function getSQL() {
$dbr = wfGetDB( DB_SLAVE );
- list( $imagelinks, $page ) = $dbr->tableNamesN( 'imagelinks', 'page' );
+ list( $imagelinks, $image ) = $dbr->tableNamesN( 'imagelinks', 'image' );
$name = $dbr->addQuotes( $this->getName() );
return
"
@@ -31,8 +57,8 @@ class WantedFilesPage extends WantedQueryPage {
il_to as title,
COUNT(*) as value
FROM $imagelinks
- LEFT JOIN $page ON il_to = page_title AND page_namespace = ". NS_FILE ."
- WHERE page_title IS NULL
+ LEFT JOIN $image ON il_to = img_name
+ WHERE img_name IS NULL
GROUP BY il_to
";
}
diff --git a/includes/specials/SpecialWantedpages.php b/includes/specials/SpecialWantedpages.php
index eeca87ab..4e1611bc 100644
--- a/includes/specials/SpecialWantedpages.php
+++ b/includes/specials/SpecialWantedpages.php
@@ -1,17 +1,35 @@
<?php
/**
+ * Implements Special:Wantedpages
+ *
+ * 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
*/
/**
- * implements Special:Wantedpages
+ * A special page that lists most linked pages that does not exist
+ *
* @ingroup SpecialPage
*/
class WantedPagesPage extends WantedQueryPage {
var $nlinks;
- function WantedPagesPage( $inc = false, $nlinks = true ) {
+ function __construct( $inc = false, $nlinks = true ) {
$this->setListoutput( $inc );
$this->nlinks = $nlinks;
}
diff --git a/includes/specials/SpecialWantedtemplates.php b/includes/specials/SpecialWantedtemplates.php
index 329d7a3f..ae43c237 100644
--- a/includes/specials/SpecialWantedtemplates.php
+++ b/includes/specials/SpecialWantedtemplates.php
@@ -1,19 +1,35 @@
<?php
/**
+ * Implements Special:Wantedtemplates
+ *
+ * Copyright © 2008, Danny B.
+ * Based on SpecialWantedcategories.php by Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * makeWlhLink() taken from SpecialMostlinkedtemplates by Rob Church <robchur@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
* @ingroup SpecialPage
+ * @author Danny B.
*/
/**
- * A querypage to list the most wanted templates - implements Special:Wantedtemplates
- * based on SpecialWantedcategories.php by Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * makeWlhLink() taken from SpecialMostlinkedtemplates by Rob Church <robchur@gmail.com>
+ * A querypage to list the most wanted templates
*
* @ingroup SpecialPage
- *
- * @author Danny B.
- * @copyright Copyright © 2008, Danny B.
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class WantedTemplatesPage extends WantedQueryPage {
diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php
index c32af2ae..bb1c194d 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -1,5 +1,22 @@
<?php
/**
+ * Implements Special:Watchlist
+ *
+ * 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 Watchlist
*/
@@ -21,7 +38,7 @@ function wfSpecialWatchlist( $par ) {
$wgUser->saveSettings();
}
- global $wgServer, $wgScriptPath, $wgFeedClasses;
+ global $wgFeedClasses;
$apiParams = array( 'action' => 'feedwatchlist', 'allrev' => 'allrev',
'wlowner' => $wgUser->getName(), 'wltoken' => $wlToken );
$feedTemplate = wfScript('api').'?';
@@ -51,8 +68,7 @@ function wfSpecialWatchlist( $par ) {
$wgOut->setPageTitle( wfMsg( 'watchlist' ) );
- $sub = wfMsgExt( 'watchlistfor', 'parseinline', $wgUser->getName() );
- $sub .= '<br />' . WatchlistEditor::buildTools( $wgUser->getSkin() );
+ $sub = wfMsgExt( 'watchlistfor2', array( 'parseinline', 'replaceafter' ), $wgUser->getName(), WatchlistEditor::buildTools( $wgUser->getSkin() ) );
$wgOut->setSubtitle( $sub );
if( ( $mode = WatchlistEditor::getMode( $wgRequest, $par ) ) !== false ) {
@@ -89,7 +105,7 @@ function wfSpecialWatchlist( $par ) {
$prefs['days'] = floatval( $wgUser->getOption( 'watchlistdays' ) );
$prefs['hideminor'] = $wgUser->getBoolOption( 'watchlisthideminor' );
$prefs['hidebots'] = $wgUser->getBoolOption( 'watchlisthidebots' );
- $prefs['hideanons'] = $wgUser->getBoolOption( 'watchlisthideanon' );
+ $prefs['hideanons'] = $wgUser->getBoolOption( 'watchlisthideanons' );
$prefs['hideliu'] = $wgUser->getBoolOption( 'watchlisthideliu' );
$prefs['hideown' ] = $wgUser->getBoolOption( 'watchlisthideown' );
$prefs['hidepatrolled' ] = $wgUser->getBoolOption( 'watchlisthidepatrolled' );
@@ -155,10 +171,11 @@ function wfSpecialWatchlist( $par ) {
return;
}
- if( $days <= 0 ) {
- $andcutoff = '';
- } else {
- $andcutoff = "rc_timestamp > '".$dbr->timestamp( time() - intval( $days * 86400 ) )."'";
+ # Possible where conditions
+ $conds = array();
+
+ if( $days > 0 ) {
+ $conds[] = "rc_timestamp > '".$dbr->timestamp( time() - intval( $days * 86400 ) )."'";
}
# If the watchlist is relatively short, it's simplest to zip
@@ -170,21 +187,35 @@ function wfSpecialWatchlist( $par ) {
# Up estimate of watched items by 15% to compensate for talk pages...
# Toggles
- $andHideOwn = $hideOwn ? "rc_user != $uid" : '';
- $andHideBots = $hideBots ? "rc_bot = 0" : '';
- $andHideMinor = $hideMinor ? "rc_minor = 0" : '';
- $andHideLiu = $hideLiu ? "rc_user = 0" : '';
- $andHideAnons = $hideAnons ? "rc_user != 0" : '';
- $andHidePatrolled = $wgUser->useRCPatrol() && $hidePatrolled ? "rc_patrolled != 1" : '';
+ if( $hideOwn ) {
+ $conds[] = "rc_user != $uid";
+ }
+ if( $hideBots ) {
+ $conds[] = 'rc_bot = 0';
+ }
+ if( $hideMinor ) {
+ $conds[] = 'rc_minor = 0';
+ }
+ if( $hideLiu ) {
+ $conds[] = 'rc_user = 0';
+ }
+ if( $hideAnons ) {
+ $conds[] = 'rc_user != 0';
+ }
+ if ( $wgUser->useRCPatrol() && $hidePatrolled ) {
+ $conds[] = 'rc_patrolled != 1';
+ }
+ if( $nameSpaceClause ) {
+ $conds[] = $nameSpaceClause;
+ }
# Toggle watchlist content (all recent edits or just the latest)
if( $wgUser->getOption( 'extendwatchlist' )) {
- $andLatest='';
$limitWatchlist = intval( $wgUser->getOption( 'wllimit' ) );
$usePage = false;
} else {
# Top log Ids for a page are not stored
- $andLatest = 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG;
+ $conds[] = 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG;
$limitWatchlist = 0;
$usePage = true;
}
@@ -208,14 +239,13 @@ function wfSpecialWatchlist( $par ) {
'id' => 'mw-watchlist-resetbutton' ) ) .
wfMsgExt( 'wlheader-showupdated', array( 'parseinline' ) ) . ' ' .
Xml::submitButton( wfMsg( 'enotif_reset' ), array( 'name' => 'dummy' ) ) .
- Xml::hidden( 'reset', 'all' ) .
+ Html::hidden( 'reset', 'all' ) .
Xml::closeElement( 'form' );
}
$form .= '<hr />';
$tables = array( 'recentchanges', 'watchlist' );
$fields = array( "{$recentchanges}.*" );
- $conds = array();
$join_conds = array(
'watchlist' => array('INNER JOIN',"wl_user='{$uid}' AND wl_namespace=rc_namespace AND wl_title=rc_title"),
);
@@ -226,15 +256,6 @@ function wfSpecialWatchlist( $par ) {
if( $limitWatchlist ) {
$options['LIMIT'] = $limitWatchlist;
}
- if( $andcutoff ) $conds[] = $andcutoff;
- if( $andLatest ) $conds[] = $andLatest;
- if( $andHideOwn ) $conds[] = $andHideOwn;
- if( $andHideBots ) $conds[] = $andHideBots;
- if( $andHideMinor ) $conds[] = $andHideMinor;
- if( $andHideLiu ) $conds[] = $andHideLiu;
- if( $andHideAnons ) $conds[] = $andHideAnons;
- if( $andHidePatrolled ) $conds[] = $andHidePatrolled;
- if( $nameSpaceClause ) $conds[] = $nameSpaceClause;
$rollbacker = $wgUser->isAllowed('rollback');
if ( $usePage || $rollbacker ) {
@@ -287,29 +308,27 @@ function wfSpecialWatchlist( $par ) {
$form .= $wlInfo;
$form .= $cutofflinks;
$form .= $wgLang->pipeList( $links );
- $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $thisTitle->getLocalUrl() ) );
+ $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $thisTitle->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) );
$form .= '<hr /><p>';
- $form .= Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&nbsp;';
- $form .= Xml::namespaceSelector( $nameSpace, '' ) . '&nbsp;';
- $form .= Xml::checkLabel( wfMsg('invert'), 'invert', 'nsinvert', $invert ) . '&nbsp;';
+ $form .= Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&#160;';
+ $form .= Xml::namespaceSelector( $nameSpace, '' ) . '&#160;';
+ $form .= Xml::checkLabel( wfMsg('invert'), 'invert', 'nsinvert', $invert ) . '&#160;';
$form .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . '</p>';
- $form .= Xml::hidden( 'days', $days );
+ $form .= Html::hidden( 'days', $days );
if( $hideMinor )
- $form .= Xml::hidden( 'hideMinor', 1 );
+ $form .= Html::hidden( 'hideMinor', 1 );
if( $hideBots )
- $form .= Xml::hidden( 'hideBots', 1 );
+ $form .= Html::hidden( 'hideBots', 1 );
if( $hideAnons )
- $form .= Xml::hidden( 'hideAnons', 1 );
+ $form .= Html::hidden( 'hideAnons', 1 );
if( $hideLiu )
- $form .= Xml::hidden( 'hideLiu', 1 );
+ $form .= Html::hidden( 'hideLiu', 1 );
if( $hideOwn )
- $form .= Xml::hidden( 'hideOwn', 1 );
+ $form .= Html::hidden( 'hideOwn', 1 );
$form .= Xml::closeElement( 'form' );
$form .= Xml::closeElement( 'fieldset' );
$wgOut->addHTML( $form );
- $wgOut->addHTML( ChangesList::flagLegend() );
-
# If there's nothing to show, stop here
if( $numRows == 0 ) {
$wgOut->addWikiMsg( 'watchnochange' );
@@ -320,7 +339,7 @@ function wfSpecialWatchlist( $par ) {
/* Do link batch query */
$linkBatch = new LinkBatch;
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$userNameUnderscored = str_replace( ' ', '_', $row->rc_user_text );
if ( $row->rc_user != 0 ) {
$linkBatch->add( NS_USER, $userNameUnderscored );
@@ -337,7 +356,7 @@ function wfSpecialWatchlist( $par ) {
$s = $list->beginRecentChangesList();
$counter = 1;
- while ( $obj = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $obj ) {
# Make RC entry
$rc = RecentChange::newFromRow( $obj );
$rc->counter = $counter++;
@@ -364,7 +383,6 @@ function wfSpecialWatchlist( $par ) {
}
$s .= $list->endRecentChangesList();
- $dbr->freeResult( $res );
$wgOut->addHTML( $s );
}
@@ -444,8 +462,9 @@ function wlCutoffLinks( $days, $page = 'Watchlist', $options = array() ) {
/**
* Count the number of items on a user's watchlist
*
- * @param $talk Include talk pages
- * @return integer
+ * @param $user User object
+ * @param $talk Boolean: include talk pages
+ * @return Integer
*/
function wlCountItems( &$user, $talk = true ) {
$dbr = wfGetDB( DB_SLAVE, 'watchlist' );
@@ -455,7 +474,6 @@ function wlCountItems( &$user, $talk = true ) {
array( 'wl_user' => $user->mId ), 'wlCountItems' );
$row = $dbr->fetchObject( $res );
$count = $row->count;
- $dbr->freeResult( $res );
# Halve to remove talk pages if needed
if( !$talk )
diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php
index b63c0eee..360f3f68 100644
--- a/includes/specials/SpecialWhatlinkshere.php
+++ b/includes/specials/SpecialWhatlinkshere.php
@@ -1,13 +1,29 @@
<?php
/**
- * @todo Use some variant of Pager or something; the pagination here is lousy.
+ * Implements Special:Whatlinkshere
+ *
+ * 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
+ * @todo Use some variant of Pager or something; the pagination here is lousy.
*/
/**
- * implements Special:Whatlinkshere
+ * Implements Special:Whatlinkshere
+ *
* @ingroup SpecialPage
*/
class SpecialWhatLinksHere extends SpecialPage {
@@ -60,7 +76,7 @@ class SpecialWhatLinksHere extends SpecialPage {
return;
}
- $this->selfTitle = SpecialPage::getTitleFor( 'Whatlinkshere', $this->target->getPrefixedDBkey() );
+ $this->selfTitle = $this->getTitle( $this->target->getPrefixedDBkey() );
$wgOut->setPageTitle( wfMsg( 'whatlinkshere-title', $this->target->getPrefixedText() ) );
$wgOut->setSubtitle( wfMsg( 'whatlinkshere-backlink', $this->skin->link( $this->target, $this->target->getPrefixedText(), array(), array( 'redirect' => 'no' ) ) ) );
@@ -171,29 +187,25 @@ class SpecialWhatLinksHere extends SpecialPage {
// templatelinks comes second so that the templatelinks row overwrites the
// pagelinks row, so we get (inclusion) rather than nothing
if( $fetchlinks ) {
- while ( $row = $dbr->fetchObject( $plRes ) ) {
+ foreach ( $plRes as $row ) {
$row->is_template = 0;
$row->is_image = 0;
$rows[$row->page_id] = $row;
}
- $dbr->freeResult( $plRes );
-
}
if( !$hidetrans ) {
- while ( $row = $dbr->fetchObject( $tlRes ) ) {
+ foreach ( $tlRes as $row ) {
$row->is_template = 1;
$row->is_image = 0;
$rows[$row->page_id] = $row;
}
- $dbr->freeResult( $tlRes );
}
if( !$hideimages ) {
- while ( $row = $dbr->fetchObject( $ilRes ) ) {
+ foreach ( $ilRes as $row ) {
$row->is_template = 0;
$row->is_image = 1;
$rows[$row->page_id] = $row;
}
- $dbr->freeResult( $ilRes );
}
// Sort by key and then change the keys to 0-based indices
@@ -224,7 +236,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$wgOut->addHTML( $prevnext );
}
- $wgOut->addHTML( $this->listStart() );
+ $wgOut->addHTML( $this->listStart( $level ) );
foreach ( $rows as $row ) {
$nt = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -244,8 +256,8 @@ class SpecialWhatLinksHere extends SpecialPage {
}
}
- protected function listStart() {
- return Xml::openElement( 'ul', array ( 'id' => 'mw-whatlinkshere-list' ) );
+ protected function listStart( $level ) {
+ return Xml::openElement( 'ul', ( $level ? array() : array( 'id' => 'mw-whatlinkshere-list' ) ) );
}
protected function listItem( $row, $nt, $notClose = false ) {
@@ -303,7 +315,7 @@ class SpecialWhatLinksHere extends SpecialPage {
protected function wlhLink( Title $target, $text ) {
static $title = null;
if ( $title === null )
- $title = SpecialPage::getTitleFor( 'Whatlinkshere' );
+ $title = $this->getTitle();
return $this->skin->linkKnown(
$title,
@@ -368,9 +380,9 @@ class SpecialWhatLinksHere extends SpecialPage {
$f = Xml::openElement( 'form', array( 'action' => $wgScript ) );
# Values that should not be forgotten
- $f .= Xml::hidden( 'title', SpecialPage::getTitleFor( 'Whatlinkshere' )->getPrefixedText() );
+ $f .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
foreach ( $this->opts->getUnconsumedValues() as $name => $value ) {
- $f .= Xml::hidden( $name, $value );
+ $f .= Html::hidden( $name, $value );
}
$f .= Xml::fieldset( wfMsg( 'whatlinkshere' ) );
@@ -382,7 +394,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$f .= ' ';
# Namespace selector
- $f .= Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&nbsp;' .
+ $f .= Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&#160;' .
Xml::namespaceSelector( $namespace, '' );
$f .= ' ';
diff --git a/includes/specials/SpecialWithoutinterwiki.php b/includes/specials/SpecialWithoutinterwiki.php
index a5d60d2f..90c1f441 100644
--- a/includes/specials/SpecialWithoutinterwiki.php
+++ b/includes/specials/SpecialWithoutinterwiki.php
@@ -1,14 +1,31 @@
<?php
/**
+ * Implements Special:Withoutinterwiki
+ *
+ * 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
+ * @author Rob Church <robchur@gmail.com>
*/
/**
* Special page lists pages without language links
*
* @ingroup SpecialPage
- * @author Rob Church <robchur@gmail.com>
*/
class WithoutInterwikiPage extends PageQueryPage {
private $prefix = '';
@@ -31,7 +48,7 @@ class WithoutInterwikiPage extends PageQueryPage {
return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'withoutinterwiki-legend' ) ) .
- Xml::hidden( 'title', $t->getPrefixedText() ) .
+ Html::hidden( 'title', $t->getPrefixedText() ) .
Xml::inputLabel( wfMsg( 'allpagesprefix' ), 'prefix', 'wiprefix', 20, $prefix ) . ' ' .
Xml::submitButton( wfMsg( 'withoutinterwiki-submit' ) ) .
Xml::closeElement( 'fieldset' ) .
@@ -75,7 +92,7 @@ class WithoutInterwikiPage extends PageQueryPage {
}
function wfSpecialWithoutinterwiki() {
- global $wgRequest, $wgContLang;
+ global $wgRequest;
list( $limit, $offset ) = wfCheckLimits();
// Only searching the mainspace anyway
$prefix = Title::capitalize( $wgRequest->getVal( 'prefix' ), NS_MAIN );
diff --git a/includes/templates/NoLocalSettings.php b/includes/templates/NoLocalSettings.php
index 45b758a9..9001e3ba 100644
--- a/includes/templates/NoLocalSettings.php
+++ b/includes/templates/NoLocalSettings.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Template used when there is no LocalSettings.php file
+ *
* @file
* @ingroup Templates
*/
@@ -7,31 +9,20 @@
if ( !isset( $wgVersion ) ) {
$wgVersion = 'VERSION';
}
+$script = $_SERVER['SCRIPT_NAME'];
+$path = pathinfo( $script, PATHINFO_DIRNAME ) . '/';
+$path = str_replace( '//', '/', $path );
+$ext = pathinfo( $script, PATHINFO_EXTENSION );
-$scriptName = $_SERVER['SCRIPT_NAME'];
-$ext = substr( $scriptName, strrpos( $scriptName, "." ) + 1 );
-$path = '';
-# Add any directories in the main folder that could contain an entrypoint (even possibly).
-# We cannot just do a dir listing here, as we do not know where it is yet
-# These must not also be the names of subfolders that may contain an entrypoint
-$topdirs = array( 'extensions', 'includes' );
-foreach( $topdirs as $dir ){
- # Check whether a directory by this name is in the path
- if( strrpos( $scriptName, "/" . $dir . "/" ) ){
- # If so, check whether it is the right folder
- # First, get the number of directories up it is (to generate path)
- $numToGoUp = substr_count( substr( $scriptName, strrpos( $scriptName, "/" . $dir . "/" ) + 1 ), "/" );
- # And generate the path using ..'s
- for( $i = 0; $i < $numToGoUp; $i++ ){
- $realPath = "../" . $realPath;
- }
- # Checking existance (using the image here as it is something not likely to change, and to always be here)
- if( file_exists( $realPath . "skins/common/images/mediawiki.png" ) ) {
- # If so, get the path that we can use in this file, and stop looking
- $path = substr( $scriptName, 0, strrpos( $scriptName, "/" . $dir . "/" ) + 1 );
- break;
- }
- }
+# Check to see if the installer is running
+if ( !function_exists( 'session_name' ) ) {
+ $installerStarted = false;
+} else {
+ session_name( 'mw_installer_session' );
+ $oldReporting = error_reporting( E_ALL & ~E_NOTICE );
+ $success = session_start();
+ error_reporting( $oldReporting );
+ $installerStarted = ( $success && isset( $_SESSION['installData'] ) );
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -57,13 +48,16 @@ foreach( $topdirs as $dir ){
<h1>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></h1>
<div class='error'>
+ <p>LocalSettings.php not found.</p>
+ <p>
<?php
- if ( file_exists( 'config/LocalSettings.php' ) ) {
- echo( 'To complete the installation, move <tt>config/LocalSettings.php</tt> to the parent directory.' );
+ if ( $installerStarted ) {
+ echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php." );
} else {
- echo( "Please <a href=\"" . htmlspecialchars( $path ) . "config/index." . htmlspecialchars( $ext ) . "\" title='setup'> set up the wiki</a> first." );
+ echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first." );
}
?>
+ </p>
</div>
</body>
diff --git a/includes/templates/PHP4.php b/includes/templates/PHP4.php
index b071ebd5..69f7d55d 100644
--- a/includes/templates/PHP4.php
+++ b/includes/templates/PHP4.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Template used when the installer detects that this is PHP 4
+ *
* @file
* @ingroup Templates
*/
@@ -17,7 +19,7 @@ if( isset( $_SERVER['SCRIPT_NAME'] ) ) {
} else {
$scriptUrl = '';
}
-if ( preg_match( '!^(.*)/config/[^/]*.php$!', $scriptUrl, $m ) ) {
+if ( preg_match( '!^(.*)/(mw-)?config/[^/]*.php$!', $scriptUrl, $m ) ) {
$baseUrl = $m[1];
} elseif ( preg_match( '!^(.*)/[^/]*.php$!', $scriptUrl, $m ) ) {
$baseUrl = $m[1];
@@ -56,7 +58,7 @@ if ( preg_match( '!^(.*)/config/[^/]*.php$!', $scriptUrl, $m ) ) {
<h1>MediaWiki <?php echo htmlspecialchars( $wgVersion ); ?></h1>
<div class='error'>
<p>
- MediaWiki requires PHP 5.0.0 or higher. You are running PHP
+ MediaWiki requires PHP 5.1.x or higher. You are running PHP
<?php echo htmlspecialchars( phpversion() ); ?>.
</p>
<?php
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index 60f33767..99ab2d8e 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -1,9 +1,15 @@
<?php
/**
- * @defgroup Templates Templates
+ * Html forms for user login and account creation
+ *
* @file
* @ingroup Templates
*/
+
+/**
+ * @defgroup Templates Templates
+ */
+
if( !defined( 'MEDIAWIKI' ) ) die( -1 );
/**
@@ -61,7 +67,7 @@ class UserloginTemplate extends QuickTemplate {
</td>
</tr>
- <?php if( $this->data['usedomain'] ) {
+ <?php if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
$doms = "";
foreach( $this->data['domainnames'] as $dom ) {
$doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
@@ -77,17 +83,41 @@ class UserloginTemplate extends QuickTemplate {
</td>
</tr>
<?php }
+
+ if( $this->haveData( 'extrafields' ) ) {
+ echo $this->data['extrafields'];
+ }
+
if( $this->data['canremember'] ) { ?>
<tr>
<td></td>
<td class="mw-input">
<?php
- echo Html::input( 'wpRemember', '1', 'checkbox', array(
- 'tabindex' => '4',
- 'id' => 'wpRemember'
- ) + ( $this->data['remember'] ? array( 'checked' ) : array() ) ); ?>
-
- <label for="wpRemember"><?php $this->msg('remembermypassword') ?></label>
+ global $wgCookieExpiration, $wgLang;
+ echo Xml::checkLabel(
+ wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+ 'wpRemember',
+ 'wpRemember',
+ $this->data['remember'],
+ array( 'tabindex' => '8' )
+ )
+ ?>
+ </td>
+ </tr>
+<?php } ?>
+<?php if( $this->data['cansecurelogin'] ) { ?>
+ <tr>
+ <td></td>
+ <td class="mw-input">
+ <?php
+ echo Xml::checkLabel(
+ wfMsg( 'securelogin-stick-https' ),
+ 'wpStickHTTPS',
+ 'wpStickHTTPS',
+ $this->data['stickHTTPS'],
+ array( 'tabindex' => '9' )
+ );
+ ?>
</td>
</tr>
<?php } ?>
@@ -97,13 +127,13 @@ class UserloginTemplate extends QuickTemplate {
<?php
echo Html::input( 'wpLoginAttempt', wfMsg( 'login' ), 'submit', array(
'id' => 'wpLoginAttempt',
- 'tabindex' => '5'
+ 'tabindex' => '9'
) );
if ( $this->data['useemail'] && $this->data['canreset'] ) {
- echo '&nbsp;';
+ echo '&#160;';
echo Html::input( 'wpMailmypassword', wfMsg( 'mailmypassword' ), 'submit', array(
'id' => 'wpMailmypassword',
- 'tabindex' => '6'
+ 'tabindex' => '10'
) );
} ?>
@@ -145,6 +175,8 @@ class UsercreateTemplate extends QuickTemplate {
</div>
<div class="visualClear"></div>
<?php } ?>
+
+<div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
<div id="userlogin">
<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text('action') ?>">
@@ -240,21 +272,36 @@ class UsercreateTemplate extends QuickTemplate {
</div>
</td>
<?php } ?>
+ <?php if( $this->data['usereason'] ) { ?>
+ </tr>
+ <tr>
+ <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
+ <td class="mw-input">
+ <input type='text' class='loginText' name="wpReason" id="wpReason"
+ tabindex="7"
+ value="<?php $this->text('reason') ?>" size='20' />
+ </td>
+ <?php } ?>
</tr>
<?php if( $this->data['canremember'] ) { ?>
<tr>
<td></td>
<td class="mw-input">
- <input type='checkbox' name="wpRemember"
- tabindex="7"
- value="1" id="wpRemember"
- <?php if( $this->data['remember'] ) { ?>checked="checked"<?php } ?>
- /> <label for="wpRemember"><?php $this->msg('remembermypassword') ?></label>
+ <?php
+ global $wgCookieExpiration, $wgLang;
+ echo Xml::checkLabel(
+ wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+ 'wpRemember',
+ 'wpRemember',
+ $this->data['remember'],
+ array( 'tabindex' => '8' )
+ )
+ ?>
</td>
</tr>
<?php }
- $tabIndex = 8;
+ $tabIndex = 9;
if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
foreach ( $this->data['extraInput'] as $inputItem ) { ?>
<tr>
diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
index 5d955b36..546b9db8 100644
--- a/includes/upload/UploadBase.php
+++ b/includes/upload/UploadBase.php
@@ -25,14 +25,40 @@ abstract class UploadBase {
const EMPTY_FILE = 3;
const MIN_LENGTH_PARTNAME = 4;
const ILLEGAL_FILENAME = 5;
- const OVERWRITE_EXISTING_FILE = 7;
+ const OVERWRITE_EXISTING_FILE = 7; # Not used anymore; handled by verifyPermissions()
const FILETYPE_MISSING = 8;
const FILETYPE_BADTYPE = 9;
const VERIFICATION_ERROR = 10;
+
+ # HOOK_ABORTED is the new name of UPLOAD_VERIFICATION_ERROR
const UPLOAD_VERIFICATION_ERROR = 11;
const HOOK_ABORTED = 11;
+ const FILE_TOO_LARGE = 12;
const SESSION_VERSION = 2;
+ const SESSION_KEYNAME = 'wsUploadData';
+
+ static public function getSessionKeyname() {
+ return self::SESSION_KEYNAME;
+ }
+
+ public function getVerificationErrorCode( $error ) {
+ $code_to_status = array(self::EMPTY_FILE => 'empty-file',
+ self::FILE_TOO_LARGE => 'file-too-large',
+ self::FILETYPE_MISSING => 'filetype-missing',
+ self::FILETYPE_BADTYPE => 'filetype-banned',
+ self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
+ self::ILLEGAL_FILENAME => 'illegal-filename',
+ self::OVERWRITE_EXISTING_FILE => 'overwrite',
+ self::VERIFICATION_ERROR => 'verification-error',
+ self::HOOK_ABORTED => 'hookaborted',
+ );
+ if( isset( $code_to_status[$error] ) ) {
+ return $code_to_status[$error];
+ }
+
+ return 'unknown-error';
+ }
/**
* Returns true if uploads are enabled.
@@ -57,8 +83,10 @@ abstract class UploadBase {
* Can be overriden by subclasses.
*/
public static function isAllowed( $user ) {
- if( !$user->isAllowed( 'upload' ) ) {
- return 'upload';
+ foreach ( array( 'upload', 'edit' ) as $permission ) {
+ if ( !$user->isAllowed( $permission ) ) {
+ return $permission;
+ }
}
return true;
}
@@ -143,15 +171,37 @@ abstract class UploadBase {
}
/**
- * Return the file size
+ * Return true if the file is empty
+ * @return bool
*/
public function isEmptyFile() {
return empty( $this->mFileSize );
}
/**
- * @param string $srcPath the source path
- * @returns the real path if it was a virtual URL
+ * Return the file size
+ * @return integer
+ */
+ public function getFileSize() {
+ return $this->mFileSize;
+ }
+
+ /**
+ * Append a file to the Repo file
+ *
+ * @param $srcPath String: path to source file
+ * @param $toAppendPath String: path to the Repo file that will be appended to.
+ * @return Status Status
+ */
+ protected function appendToUploadFile( $srcPath, $toAppendPath ) {
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ $status = $repo->append( $srcPath, $toAppendPath );
+ return $status;
+ }
+
+ /**
+ * @param $srcPath String: the source path
+ * @return the real path if it was a virtual URL
*/
function getRealPath( $srcPath ) {
$repo = RepoGroup::singleton()->getLocalRepo();
@@ -163,7 +213,7 @@ abstract class UploadBase {
/**
* Verify whether the upload is sane.
- * Returns self::OK or else an array with error information
+ * @return mixed self::OK or else an array with error information
*/
public function verifyUpload() {
/**
@@ -174,21 +224,53 @@ abstract class UploadBase {
}
/**
+ * Honor $wgMaxUploadSize
+ */
+ global $wgMaxUploadSize;
+ if( $this->mFileSize > $wgMaxUploadSize ) {
+ return array(
+ 'status' => self::FILE_TOO_LARGE,
+ 'max' => $wgMaxUploadSize,
+ );
+ }
+
+ /**
* Look at the contents of the file; if we can recognize the
* type but it's corrupt or data of the wrong type, we should
* probably not accept it.
*/
$verification = $this->verifyFile();
if( $verification !== true ) {
- if( !is_array( $verification ) ) {
- $verification = array( $verification );
- }
return array(
'status' => self::VERIFICATION_ERROR,
'details' => $verification
);
}
+ /**
+ * Make sure this file can be created
+ */
+ $result = $this->validateName();
+ if( $result !== true ) {
+ return $result;
+ }
+
+ $error = '';
+ if( !wfRunHooks( 'UploadVerification',
+ array( $this->mDestName, $this->mTempPath, &$error ) ) ) {
+ return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
+ }
+
+ return array( 'status' => self::OK );
+ }
+
+ /**
+ * Verify that the name is valid and, if necessary, that we can overwrite
+ *
+ * @return mixed true if valid, otherwise and array with 'status'
+ * and other keys
+ **/
+ protected function validateName() {
$nt = $this->getTitle();
if( is_null( $nt ) ) {
$result = array( 'status' => $this->mTitleError );
@@ -202,41 +284,16 @@ abstract class UploadBase {
}
$this->mDestName = $this->getLocalFile()->getName();
- /**
- * In some cases we may forbid overwriting of existing files.
- */
- $overwrite = $this->checkOverwrite();
- if( $overwrite !== true ) {
- return array(
- 'status' => self::OVERWRITE_EXISTING_FILE,
- 'overwrite' => $overwrite
- );
- }
-
- $error = '';
- if( !wfRunHooks( 'UploadVerification',
- array( $this->mDestName, $this->mTempPath, &$error ) ) ) {
- // This status needs another name...
- return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
- }
-
- return array( 'status' => self::OK );
+ return true;
}
/**
- * Verifies that it's ok to include the uploaded file
+ * Verify the mime type
*
- * @return mixed true of the file is verified, a string or array otherwise.
+ * @param $mime string representing the mime
+ * @return mixed true if the file is verified, an array otherwise
*/
- protected function verifyFile() {
- $this->mFileProps = File::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
- $this->checkMacBinary();
-
- # magically determine mime type
- $magic = MimeMagic::singleton();
- $mime = $magic->guessMimeType( $this->mTempPath, false );
-
- # check mime type, if desired
+ protected function verifyMimeType( $mime ) {
global $wgVerifyMimeType;
if ( $wgVerifyMimeType ) {
wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n");
@@ -253,6 +310,8 @@ abstract class UploadBase {
$fp = fopen( $this->mTempPath, 'rb' );
$chunk = fread( $fp, 256 );
fclose( $fp );
+
+ $magic = MimeMagic::singleton();
$extMime = $magic->guessTypesForExtension( $this->mFinalExtension );
$ieTypes = $magic->getIEMimeTypes( $this->mTempPath, $chunk, $extMime );
foreach ( $ieTypes as $ieType ) {
@@ -262,13 +321,36 @@ abstract class UploadBase {
}
}
+ return true;
+ }
+
+ /**
+ * Verifies that it's ok to include the uploaded file
+ *
+ * @return mixed true of the file is verified, array otherwise.
+ */
+ protected function verifyFile() {
+ # get the title, even though we are doing nothing with it, because
+ # we need to populate mFinalExtension
+ $this->getTitle();
+
+ $this->mFileProps = File::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
+ $this->checkMacBinary();
+
+ # check mime type, if desired
+ $mime = $this->mFileProps[ 'file-mime' ];
+ $status = $this->verifyMimeType( $mime );
+ if ( $status !== true ) {
+ return $status;
+ }
+
# check for htmlish code and javascript
if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
- return 'uploadscripted';
+ return array( 'uploadscripted' );
}
if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
- if( self::detectScriptInSvg( $this->mTempPath ) ) {
- return 'uploadscripted';
+ if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+ return array( 'uploadscripted' );
}
}
@@ -279,14 +361,33 @@ abstract class UploadBase {
if ( $virus ) {
return array( 'uploadvirus', $virus );
}
+
+ $handler = MediaHandler::getHandler( $mime );
+ if ( $handler ) {
+ $handlerStatus = $handler->verifyUpload( $this->mTempPath );
+ if ( !$handlerStatus->isOK() ) {
+ $errors = $handlerStatus->getErrorsArray();
+ return reset( $errors );
+ }
+ }
+
+ wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
+ if ( $status !== true ) {
+ return $status;
+ }
+
wfDebug( __METHOD__ . ": all clear; passing.\n" );
return true;
}
/**
- * Check whether the user can edit, upload and create the image.
+ * Check whether the user can edit, upload and create the image. This
+ * checks only against the current title; if it returns errors, it may
+ * very well be that another title will not give errors. Therefore
+ * isAllowed() should be called as well for generic is-user-blocked or
+ * can-user-upload checking.
*
- * @param User $user the user to verify the permissions against
+ * @param $user the User object to verify the permissions against
* @return mixed An array as returned by getUserPermissionsErrors or true
* in case the user has proper permissions.
*/
@@ -301,19 +402,29 @@ abstract class UploadBase {
}
$permErrors = $nt->getUserPermissionsErrors( 'edit', $user );
$permErrorsUpload = $nt->getUserPermissionsErrors( 'upload', $user );
- $permErrorsCreate = ( $nt->exists() ? array() : $nt->getUserPermissionsErrors( 'create', $user ) );
+ if ( !$nt->exists() ) {
+ $permErrorsCreate = $nt->getUserPermissionsErrors( 'createpage', $user );
+ } else {
+ $permErrorsCreate = array();
+ }
if( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
$permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
$permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
return $permErrors;
}
+
+ $overwriteError = $this->checkOverwrite( $user );
+ if ( $overwriteError !== true ) {
+ return array( $overwriteError );
+ }
+
return true;
}
/**
* Check for non fatal problems with the file
*
- * @return array Array of warnings
+ * @return Array of warnings
*/
public function checkWarnings() {
$warnings = array();
@@ -321,7 +432,6 @@ abstract class UploadBase {
$localFile = $this->getLocalFile();
$filename = $localFile->getName();
$n = strrpos( $filename, '.' );
- $partname = $n ? substr( $filename, 0, $n ) : $filename;
/**
* Check whether the resulting filename is different from the desired one,
@@ -386,15 +496,21 @@ abstract class UploadBase {
* @return mixed Status indicating the whether the upload succeeded.
*/
public function performUpload( $comment, $pageText, $watch, $user ) {
- wfDebug( "\n\n\performUpload: sum:" . $comment . ' c: ' . $pageText . ' w:' . $watch );
- $status = $this->getLocalFile()->upload( $this->mTempPath, $comment, $pageText,
- File::DELETE_SOURCE, $this->mFileProps, false, $user );
-
- if( $status->isGood() && $watch ) {
- $user->addWatch( $this->getLocalFile()->getTitle() );
- }
+ $status = $this->getLocalFile()->upload(
+ $this->mTempPath,
+ $comment,
+ $pageText,
+ File::DELETE_SOURCE,
+ $this->mFileProps,
+ false,
+ $user
+ );
if( $status->isGood() ) {
+ if ( $watch ) {
+ $user->addWatch( $this->getLocalFile()->getTitle() );
+ }
+
wfRunHooks( 'UploadComplete', array( &$this ) );
}
@@ -417,9 +533,7 @@ abstract class UploadBase {
* filter out illegal characters, and try to make a legible name
* out of it. We'll strip some silently that Title would die on.
*/
- $basename = $this->mDesiredDestName;
-
- $this->mFilteredName = wfStripIllegalFilenameChars( $basename );
+ $this->mFilteredName = wfStripIllegalFilenameChars( $this->mDesiredDestName );
/* Normalize to title form before we do any further processing */
$nt = Title::makeTitleSafe( NS_FILE, $this->mFilteredName );
if( is_null( $nt ) ) {
@@ -466,11 +580,6 @@ abstract class UploadBase {
return $this->mTitle = null;
}
- $nt = Title::makeTitleSafe( NS_FILE, $this->mFilteredName );
- if( is_null( $nt ) ) {
- $this->mTitleError = self::ILLEGAL_FILENAME;
- return $this->mTitle = null;
- }
return $this->mTitle = $nt;
}
@@ -486,15 +595,18 @@ abstract class UploadBase {
}
/**
+ * NOTE: Probably should be deprecated in favor of UploadStash, but this is sometimes
+ * called outside that context.
+ *
* Stash a file in a temporary directory for later processing
* after the user has confirmed it.
*
* If the user doesn't explicitly cancel or accept, these files
* can accumulate in the temp directory.
*
- * @param string $saveName - the destination filename
- * @param string $tempSrc - the source temporary file to save
- * @return string - full path the stashed file, or false on failure
+ * @param $saveName String: the destination filename
+ * @param $tempSrc String: the source temporary file to save
+ * @return String: full path the stashed file, or false on failure
*/
protected function saveTempUploadedFile( $saveName, $tempSrc ) {
$repo = RepoGroup::singleton()->getLocalRepo();
@@ -503,39 +615,35 @@ abstract class UploadBase {
}
/**
- * Stash a file in a temporary directory for later processing,
- * and save the necessary descriptive info into the session.
- * Returns a key value which will be passed through a form
- * to pick up the path info on a later invocation.
+ * If the user does not supply all necessary information in the first upload form submission (either by accident or
+ * by design) then we may want to stash the file temporarily, get more information, and publish the file later.
+ *
+ * This method will stash a file in a temporary directory for later processing, and save the necessary descriptive info
+ * into the user's session.
+ * This method returns the file object, which also has a 'sessionKey' property which can be passed through a form or
+ * API request to find this stashed file again.
*
- * @return int Session key
+ * @param $key String: (optional) the session key used to find the file info again. If not supplied, a key will be autogenerated.
+ * @return File: stashed file
*/
- public function stashSession() {
- $status = $this->saveTempUploadedFile( $this->mDestName, $this->mTempPath );
- if( !$status->isOK() ) {
- # Couldn't save the file.
- return false;
- }
- if( !isset( $_SESSION ) ) {
- session_start(); // start up the session (might have been previously closed to prevent php session locking)
- }
- $key = $this->getSessionKey();
- $_SESSION['wsUploadData'][$key] = array(
- 'mTempPath' => $status->value,
- 'mFileSize' => $this->mFileSize,
- 'mFileProps' => $this->mFileProps,
- 'version' => self::SESSION_VERSION,
+ public function stashSessionFile( $key = null ) {
+ $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+ $data = array(
+ 'mFileProps' => $this->mFileProps
);
- return $key;
+ $file = $stash->stashFile( $this->mTempPath, $data, $key );
+ $this->mLocalFile = $file;
+ return $file;
}
/**
- * Generate a random session key from stash in cases where we want to start an upload without much information
+ * Stash a file in a temporary directory, returning a key which can be used to find the file again. See stashSessionFile().
+ *
+ * @param $key String: (optional) the session key used to find the file info again. If not supplied, a key will be autogenerated.
+ * @return String: session key
*/
- protected function getSessionKey() {
- $key = mt_rand( 0, 0x7fffffff );
- $_SESSION['wsUploadData'][$key] = array();
- return $key;
+ public function stashSession( $key = null ) {
+ return $this->stashSessionFile( $key )->getSessionKey();
}
/**
@@ -571,9 +679,9 @@ abstract class UploadBase {
* Perform case-insensitive match against a list of file extensions.
* Returns true if the extension is in the list.
*
- * @param string $ext
- * @param array $list
- * @return bool
+ * @param $ext String
+ * @param $list Array
+ * @return Boolean
*/
public static function checkFileExtension( $ext, $list ) {
return in_array( strtolower( $ext ), $list );
@@ -583,9 +691,9 @@ abstract class UploadBase {
* Perform case-insensitive match against a list of file extensions.
* Returns true if any of the extensions are in the list.
*
- * @param array $ext
- * @param array $list
- * @return bool
+ * @param $ext Array
+ * @param $list Array
+ * @return Boolean
*/
public static function checkFileExtensionList( $ext, $list ) {
foreach( $ext as $e ) {
@@ -599,9 +707,9 @@ abstract class UploadBase {
/**
* Checks if the mime type of the uploaded file matches the file extension.
*
- * @param string $mime the mime type of the uploaded file
- * @param string $extension The filename extension that the file is to be served with
- * @return bool
+ * @param $mime String: the mime type of the uploaded file
+ * @param $extension String: the filename extension that the file is to be served with
+ * @return Boolean
*/
public static function verifyExtension( $mime, $extension ) {
$magic = MimeMagic::singleton();
@@ -640,10 +748,10 @@ abstract class UploadBase {
* potentially harmful. The present implementation will produce false
* positives in some situations.
*
- * @param string $file Pathname to the temporary upload file
- * @param string $mime The mime type of the file
- * @param string $extension The extension of the file
- * @return bool true if the file contains something looking like embedded scripts
+ * @param $file String: pathname to the temporary upload file
+ * @param $mime String: the mime type of the file
+ * @param $extension String: the extension of the file
+ * @return Boolean: true if the file contains something looking like embedded scripts
*/
public static function detectScript( $file, $mime, $extension ) {
global $wgAllowTitlesInSVG;
@@ -790,7 +898,7 @@ abstract class UploadBase {
* This relies on the $wgAntivirus and $wgAntivirusSetup variables.
* $wgAntivirusRequired may be used to deny upload if the scan fails.
*
- * @param string $file Pathname to the temporary upload file
+ * @param $file String: pathname to the temporary upload file
* @return mixed false if not virus is found, NULL if the scan fails or is disabled,
* or a string containing feedback from the virus scanner if a virus was found.
* If textual feedback is missing but a virus was found, this function returns true.
@@ -805,7 +913,8 @@ abstract class UploadBase {
if ( !$wgAntivirusSetup[$wgAntivirus] ) {
wfDebug( __METHOD__ . ": unknown virus scanner: $wgAntivirus\n" );
- $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1</div>", array( 'virus-badscanner', $wgAntivirus ) );
+ $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
+ array( 'virus-badscanner', $wgAntivirus ) );
return wfMsg( 'virus-unknownscanner' ) . " $wgAntivirus";
}
@@ -907,15 +1016,14 @@ abstract class UploadBase {
* Check if there's an overwrite conflict and, if so, if restrictions
* forbid this user from performing the upload.
*
- * @return mixed true on success, error string on failure
+ * @return mixed true on success, array on failure
*/
- private function checkOverwrite() {
- global $wgUser;
+ private function checkOverwrite( $user ) {
// First check whether the local file can be overwritten
$file = $this->getLocalFile();
if( $file->exists() ) {
- if( !self::userCanReUpload( $wgUser, $file ) ) {
- return 'fileexists-forbidden';
+ if( !self::userCanReUpload( $user, $file ) ) {
+ return array( 'fileexists-forbidden', $file->getName() );
} else {
return true;
}
@@ -925,8 +1033,8 @@ abstract class UploadBase {
* wfFindFile finds a file, it exists in a shared repository.
*/
$file = wfFindFile( $this->getTitle() );
- if ( $file && !$wgUser->isAllowed( 'reupload-shared' ) ) {
- return 'fileexists-shared-forbidden';
+ if ( $file && !$user->isAllowed( 'reupload-shared' ) ) {
+ return array( 'fileexists-shared-forbidden', $file->getName() );
}
return true;
@@ -935,9 +1043,9 @@ abstract class UploadBase {
/**
* Check if a user is the last uploader
*
- * @param User $user
- * @param string $img, image name
- * @return bool
+ * @param $user User object
+ * @param $img String: image name
+ * @return Boolean
*/
public static function userCanReUpload( User $user, $img ) {
if( $user->isAllowed( 'reupload' ) ) {
@@ -964,7 +1072,7 @@ abstract class UploadBase {
* - File exists with normalized extension
* - The file looks like a thumbnail and the original exists
*
- * @param File $file The file to check
+ * @param $file The File object to check
* @return mixed False if the file does not exists, else an array
*/
public static function getExistsWarning( $file ) {
@@ -1082,10 +1190,34 @@ abstract class UploadBase {
return $blacklist;
}
+ /**
+ * Gets image info about the file just uploaded.
+ *
+ * Also has the effect of setting metadata to be an 'indexed tag name' in returned API result if
+ * 'metadata' was requested. Oddly, we have to pass the "result" object down just so it can do that
+ * with the appropriate format, presumably.
+ *
+ * @param $result ApiResult:
+ * @return Array: image info
+ */
public function getImageInfo( $result ) {
$file = $this->getLocalFile();
- $imParam = ApiQueryImageInfo::getPropertyNames();
- return ApiQueryImageInfo::getInfo( $file, array_flip( $imParam ), $result );
+ // TODO This cries out for refactoring. We really want to say $file->getAllInfo(); here.
+ // Perhaps "info" methods should be moved into files, and the API should just wrap them in queries.
+ if ( $file instanceof UploadStashFile ) {
+ $imParam = ApiQueryStashImageInfo::getPropertyNames();
+ $info = ApiQueryStashImageInfo::getInfo( $file, array_flip( $imParam ), $result );
+ } else {
+ $imParam = ApiQueryImageInfo::getPropertyNames();
+ $info = ApiQueryImageInfo::getInfo( $file, array_flip( $imParam ), $result );
+ }
+ return $info;
}
+
+ public function convertVerifyErrorToStatus( $error ) {
+ $code = $error['status'];
+ unset( $code['status'] );
+ return Status::newFatal( $this->getVerificationErrorCode( $code ), $error );
+ }
}
diff --git a/includes/upload/UploadFromFile.php b/includes/upload/UploadFromFile.php
index 73581a61..e67ec191 100644
--- a/includes/upload/UploadFromFile.php
+++ b/includes/upload/UploadFromFile.php
@@ -1,32 +1,65 @@
<?php
/**
+ * Implements regular file uploads
+ *
* @file
* @ingroup upload
- *
* @author Bryan Tong Minh
- *
- * Implements regular file uploads
*/
-class UploadFromFile extends UploadBase {
+class UploadFromFile extends UploadBase {
+ protected $mUpload = null;
function initializeFromRequest( &$request ) {
+ $upload = $request->getUpload( 'wpUploadFile' );
$desiredDestName = $request->getText( 'wpDestFile' );
if( !$desiredDestName )
- $desiredDestName = $request->getFileName( 'wpUploadFile' );
- return $this->initializePathInfo(
- $desiredDestName,
- $request->getFileTempName( 'wpUploadFile' ),
- $request->getFileSize( 'wpUploadFile' )
- );
+ $desiredDestName = $upload->getName();
+
+ return $this->initialize( $desiredDestName, $upload );
}
+
/**
- * Entry point for upload from file.
+ * Initialize from a filename and a WebRequestUpload
*/
- function initialize( $name, $tempPath, $fileSize ) {
- return $this->initializePathInfo( $name, $tempPath, $fileSize );
+ function initialize( $name, $webRequestUpload ) {
+ $this->mUpload = $webRequestUpload;
+ return $this->initializePathInfo( $name,
+ $this->mUpload->getTempName(), $this->mUpload->getSize() );
}
static function isValidRequest( $request ) {
- return (bool)$request->getFileTempName( 'wpUploadFile' );
+ # Allow all requests, even if no file is present, so that an error
+ # because a post_max_size or upload_max_filesize overflow
+ return true;
+ }
+
+ public function verifyUpload() {
+ # Check for a post_max_size or upload_max_size overflow, so that a
+ # proper error can be shown to the user
+ if ( is_null( $this->mTempPath ) || $this->isEmptyFile() ) {
+ if ( $this->mUpload->isIniSizeOverflow() ) {
+ global $wgMaxUploadSize;
+ return array(
+ 'status' => UploadBase::FILE_TOO_LARGE,
+ 'max' => min(
+ $wgMaxUploadSize,
+ wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ),
+ wfShorthandToInteger( ini_get( 'post_max_size' ) )
+ ),
+ );
+ }
+ }
+
+ return parent::verifyUpload();
+ }
+
+ /**
+ * Get the path to the file underlying the upload
+ * @return String path to file
+ */
+ public function getFileTempname() {
+ return $this->mUpload->getTempname();
}
+
+
}
diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php
index 17e922b0..156781e9 100644
--- a/includes/upload/UploadFromStash.php
+++ b/includes/upload/UploadFromStash.php
@@ -1,10 +1,9 @@
<?php
/**
- * @file
- * @ingroup upload
- *
* Implements uploading from previously stored file.
*
+ * @file
+ * @ingroup upload
* @author Bryan Tong Minh
*/
@@ -14,13 +13,13 @@ class UploadFromStash extends UploadBase {
is_array( $sessionData ) &&
isset( $sessionData[$key] ) &&
isset( $sessionData[$key]['version'] ) &&
- $sessionData[$key]['version'] == self::SESSION_VERSION;
+ $sessionData[$key]['version'] == UploadBase::SESSION_VERSION;
}
public static function isValidRequest( $request ) {
- $sessionData = $request->getSessionData( 'wsUploadData' );
+ $sessionData = $request->getSessionData( UploadBase::SESSION_KEYNAME );
return self::isValidSessionKey(
- $request->getInt( 'wpSessionKey' ),
+ $request->getText( 'wpSessionKey' ),
$sessionData
);
}
@@ -45,8 +44,8 @@ class UploadFromStash extends UploadBase {
}
public function initializeFromRequest( &$request ) {
- $sessionKey = $request->getInt( 'wpSessionKey' );
- $sessionData = $request->getSessionData('wsUploadData');
+ $sessionKey = $request->getText( 'wpSessionKey' );
+ $sessionData = $request->getSessionData( UploadBase::SESSION_KEYNAME );
$desiredDestName = $request->getText( 'wpDestFile' );
if( !$desiredDestName )
@@ -65,7 +64,7 @@ class UploadFromStash extends UploadBase {
/**
* There is no need to stash the image twice
*/
- public function stashSession() {
+ public function stashSession( $key = null ) {
if ( !empty( $this->mSessionKey ) )
return $this->mSessionKey;
return parent::stashSession();
diff --git a/includes/upload/UploadFromUrl.php b/includes/upload/UploadFromUrl.php
index 763dae38..c28fd7da 100644
--- a/includes/upload/UploadFromUrl.php
+++ b/includes/upload/UploadFromUrl.php
@@ -1,28 +1,30 @@
<?php
/**
- * @file
- * @ingroup upload
- *
* Implements uploading from a HTTP resource.
*
+ * @file
+ * @ingroup upload
* @author Bryan Tong Minh
* @author Michael Dale
*/
+
class UploadFromUrl extends UploadBase {
- protected $mTempDownloadPath;
+ protected $mAsync, $mUrl;
+ protected $mIgnoreWarnings = true;
/**
* Checks if the user is allowed to use the upload-by-URL feature. If the
* user is allowed, pass on permissions checking to the parent.
*/
public static function isAllowed( $user ) {
- if( !$user->isAllowed( 'upload_by_url' ) )
+ if ( !$user->isAllowed( 'upload_by_url' ) )
return 'upload_by_url';
return parent::isAllowed( $user );
}
/**
* Checks if the upload from URL feature is enabled
+ * @return bool
*/
public static function isEnabled() {
global $wgAllowCopyUploads;
@@ -31,14 +33,22 @@ class UploadFromUrl extends UploadBase {
/**
* Entry point for API upload
+ *
+ * @param $name string
+ * @param $url string
+ * @param $async mixed Whether the download should be performed
+ * asynchronous. False for synchronous, async or async-leavemessage for
+ * asynchronous download.
*/
- public function initialize( $name, $url, $na, $nb = false ) {
- global $wgTmpDirectory;
+ public function initialize( $name, $url, $async = false ) {
+ global $wgAllowAsyncCopyUploads;
- $localFile = tempnam( $wgTmpDirectory, 'WEBUPLOAD' );
- $this->initializePathInfo( $name, $localFile, 0, true );
+ $this->mUrl = $url;
+ $this->mAsync = $wgAllowAsyncCopyUploads ? $async : false;
- $this->mUrl = trim( $url );
+ $tempPath = $this->mAsync ? null : $this->makeTemporaryFile();
+ # File size and removeTempFile will be filled in later
+ $this->initializePathInfo( $name, $tempPath, 0, false );
}
/**
@@ -47,7 +57,7 @@ class UploadFromUrl extends UploadBase {
*/
public function initializeFromRequest( &$request ) {
$desiredDestName = $request->getText( 'wpDestFile' );
- if( !$desiredDestName )
+ if ( !$desiredDestName )
$desiredDestName = $request->getText( 'wpUploadFileURL' );
return $this->initialize(
$desiredDestName,
@@ -59,79 +69,162 @@ class UploadFromUrl extends UploadBase {
/**
* @param $request Object: WebRequest object
*/
- public static function isValidRequest( $request ){
- if( !$request->getVal( 'wpUploadFileURL' ) )
- return false;
- // check that is a valid url:
- return self::isValidUrl( $request->getVal( 'wpUploadFileURL' ) );
+ public static function isValidRequest( $request ) {
+ global $wgUser;
+
+ $url = $request->getVal( 'wpUploadFileURL' );
+ return !empty( $url )
+ && Http::isValidURI( $url )
+ && $wgUser->isAllowed( 'upload_by_url' );
}
- public static function isValidUrl( $url ) {
- // Only allow HTTP or FTP for now
- return (bool)preg_match( '!^(http://|ftp://)!', $url );
+
+ public function fetchFile() {
+ if ( !Http::isValidURI( $this->mUrl ) ) {
+ return Status::newFatal( 'http-invalid-url' );
+ }
+
+ if ( !$this->mAsync ) {
+ return $this->reallyFetchFile();
+ }
+ return Status::newGood();
+ }
+ /**
+ * Create a new temporary file in the URL subdirectory of wfTempDir().
+ *
+ * @return string Path to the file
+ */
+ protected function makeTemporaryFile() {
+ return tempnam( wfTempDir(), 'URL' );
}
/**
- * Do the real fetching stuff
+ * Callback: save a chunk of the result of a HTTP request to the temporary file
+ *
+ * @param $req mixed
+ * @param $buffer string
+ * @return int number of bytes handled
*/
- function fetchFile() {
- if( !self::isValidUrl( $this->mUrl ) ) {
- return Status::newFatal( 'upload-proto-error' );
+ public function saveTempFileChunk( $req, $buffer ) {
+ $nbytes = fwrite( $this->mTmpHandle, $buffer );
+
+ if ( $nbytes == strlen( $buffer ) ) {
+ $this->mFileSize += $nbytes;
+ } else {
+ // Well... that's not good!
+ fclose( $this->mTmpHandle );
+ $this->mTmpHandle = false;
}
- $res = $this->curlCopy();
- if( $res !== true ) {
- return Status::newFatal( $res );
- }
- return Status::newGood();
+
+ return $nbytes;
}
/**
- * Safe copy from URL
- * Returns true if there was an error, false otherwise
+ * Download the file, save it to the temporary file and update the file
+ * size and set $mRemoveTempFile to true.
*/
- private function curlCopy() {
- global $wgOut;
-
- # Open temporary file
- $this->mCurlDestHandle = @fopen( $this->mTempPath, "wb" );
- if( $this->mCurlDestHandle === false ) {
- # Could not open temporary file to write in
- return 'upload-file-error';
+ protected function reallyFetchFile() {
+ if ( $this->mTempPath === false ) {
+ return Status::newFatal( 'tmp-create-error' );
}
- $ch = curl_init();
- curl_setopt( $ch, CURLOPT_HTTP_VERSION, 1.0); # Probably not needed, but apparently can work around some bug
- curl_setopt( $ch, CURLOPT_TIMEOUT, 10); # 10 seconds timeout
- curl_setopt( $ch, CURLOPT_LOW_SPEED_LIMIT, 512); # 0.5KB per second minimum transfer speed
- curl_setopt( $ch, CURLOPT_URL, $this->mUrl);
- curl_setopt( $ch, CURLOPT_WRITEFUNCTION, array( $this, 'uploadCurlCallback' ) );
- curl_exec( $ch );
- $error = curl_errno( $ch );
- curl_close( $ch );
+ // Note the temporary file should already be created by makeTemporaryFile()
+ $this->mTmpHandle = fopen( $this->mTempPath, 'wb' );
+ if ( !$this->mTmpHandle ) {
+ return Status::newFatal( 'tmp-create-error' );
+ }
+
+ $this->mRemoveTempFile = true;
+ $this->mFileSize = 0;
- fclose( $this->mCurlDestHandle );
- unset( $this->mCurlDestHandle );
+ $req = MWHttpRequest::factory( $this->mUrl );
+ $req->setCallback( array( $this, 'saveTempFileChunk' ) );
+ $status = $req->execute();
- if( $error )
- return "upload-curl-error$errornum";
+ if ( $this->mTmpHandle ) {
+ // File got written ok...
+ fclose( $this->mTmpHandle );
+ $this->mTmpHandle = null;
+ } else {
+ // We encountered a write error during the download...
+ return Status::newFatal( 'tmp-write-error' );
+ }
+
+ if ( !$status->isOk() ) {
+ return $status;
+ }
- return true;
+ return $status;
}
/**
- * Callback function for CURL-based web transfer
- * Write data to file unless we've passed the length limit;
- * if so, abort immediately.
- * @access private
+ * Wrapper around the parent function in order to defer verifying the
+ * upload until the file really has been fetched.
*/
- function uploadCurlCallback( $ch, $data ) {
- global $wgMaxUploadSize;
- $length = strlen( $data );
- $this->mFileSize += $length;
- if( $this->mFileSize > $wgMaxUploadSize ) {
- return 0;
+ public function verifyUpload() {
+ if ( $this->mAsync ) {
+ return array( 'status' => UploadBase::OK );
}
- fwrite( $this->mCurlDestHandle, $data );
- return $length;
+ return parent::verifyUpload();
}
+
+ /**
+ * Wrapper around the parent function in order to defer checking warnings
+ * until the file really has been fetched.
+ */
+ public function checkWarnings() {
+ if ( $this->mAsync ) {
+ $this->mIgnoreWarnings = false;
+ return array();
+ }
+ return parent::checkWarnings();
+ }
+
+ /**
+ * Wrapper around the parent function in order to defer checking protection
+ * until we are sure that the file can actually be uploaded
+ */
+ public function verifyPermissions( $user ) {
+ if ( $this->mAsync ) {
+ return true;
+ }
+ return parent::verifyPermissions( $user );
+ }
+
+ /**
+ * Wrapper around the parent function in order to defer uploading to the
+ * job queue for asynchronous uploads
+ */
+ public function performUpload( $comment, $pageText, $watch, $user ) {
+ if ( $this->mAsync ) {
+ $sessionKey = $this->insertJob( $comment, $pageText, $watch, $user );
+
+ $status = new Status;
+ $status->error( 'async', $sessionKey );
+ return $status;
+ }
+
+ return parent::performUpload( $comment, $pageText, $watch, $user );
+ }
+
+
+ protected function insertJob( $comment, $pageText, $watch, $user ) {
+ $sessionKey = $this->stashSession();
+ $job = new UploadFromUrlJob( $this->getTitle(), array(
+ 'url' => $this->mUrl,
+ 'comment' => $comment,
+ 'pageText' => $pageText,
+ 'watch' => $watch,
+ 'userName' => $user->getName(),
+ 'leaveMessage' => $this->mAsync == 'async-leavemessage',
+ 'ignoreWarnings' => $this->mIgnoreWarnings,
+ 'sessionId' => session_id(),
+ 'sessionKey' => $sessionKey,
+ ) );
+ $job->initializeSessionData();
+ $job->insert();
+ return $sessionKey;
+ }
+
+
}
diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php
new file mode 100644
index 00000000..1765925d
--- /dev/null
+++ b/includes/upload/UploadStash.php
@@ -0,0 +1,397 @@
+<?php
+/**
+ * UploadStash is intended to accomplish a few things:
+ * - enable applications to temporarily stash files without publishing them to the wiki.
+ * - Several parts of MediaWiki do this in similar ways: UploadBase, UploadWizard, and FirefoggChunkedExtension
+ * And there are several that reimplement stashing from scratch, in idiosyncratic ways. The idea is to unify them all here.
+ * Mostly all of them are the same except for storing some custom fields, which we subsume into the data array.
+ * - enable applications to find said files later, as long as the session or temp files haven't been purged.
+ * - enable the uploading user (and *ONLY* the uploading user) to access said files, and thumbnails of said files, via a URL.
+ * We accomplish this by making the session serve as a URL->file mapping, on the assumption that nobody else can access
+ * the session, even the uploading user. See SpecialUploadStash, which implements a web interface to some files stored this way.
+ *
+ */
+class UploadStash {
+
+ // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
+ const KEY_FORMAT_REGEX = '/^[\w-]+\.\w*$/';
+
+ // repository that this uses to store temp files
+ // public because we sometimes need to get a LocalFile within the same repo.
+ public $repo;
+
+ // array of initialized objects obtained from session (lazily initialized upon getFile())
+ private $files = array();
+
+ // TODO: Once UploadBase starts using this, switch to use these constants rather than UploadBase::SESSION*
+ // const SESSION_VERSION = 2;
+ // const SESSION_KEYNAME = 'wsUploadData';
+
+ /**
+ * Represents the session which contains temporarily stored files.
+ * Designed to be compatible with the session stashing code in UploadBase (should replace it eventually)
+ *
+ * @param $repo FileRepo: optional -- repo in which to store files. Will choose LocalRepo if not supplied.
+ */
+ public function __construct( $repo ) {
+
+ // this might change based on wiki's configuration.
+ $this->repo = $repo;
+
+ if ( ! isset( $_SESSION ) ) {
+ throw new UploadStashNotAvailableException( 'no session variable' );
+ }
+
+ if ( !isset( $_SESSION[UploadBase::SESSION_KEYNAME] ) ) {
+ $_SESSION[UploadBase::SESSION_KEYNAME] = array();
+ }
+
+ }
+
+ /**
+ * Get a file and its metadata from the stash.
+ * May throw exception if session data cannot be parsed due to schema change, or key not found.
+ *
+ * @param $key Integer: key
+ * @throws UploadStashFileNotFoundException
+ * @throws UploadStashBadVersionException
+ * @return UploadStashFile
+ */
+ public function getFile( $key ) {
+ if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+ throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
+ }
+
+ if ( !isset( $this->files[$key] ) ) {
+ if ( !isset( $_SESSION[UploadBase::SESSION_KEYNAME][$key] ) ) {
+ throw new UploadStashFileNotFoundException( "key '$key' not found in stash" );
+ }
+
+ $data = $_SESSION[UploadBase::SESSION_KEYNAME][$key];
+ // guards against PHP class changing while session data doesn't
+ if ($data['version'] !== UploadBase::SESSION_VERSION ) {
+ throw new UploadStashBadVersionException( $data['version'] . " does not match current version " . UploadBase::SESSION_VERSION );
+ }
+
+ // separate the stashData into the path, and then the rest of the data
+ $path = $data['mTempPath'];
+ unset( $data['mTempPath'] );
+
+ $file = new UploadStashFile( $this, $this->repo, $path, $key, $data );
+ if ( $file->getSize === 0 ) {
+ throw new UploadStashZeroLengthFileException( "File is zero length" );
+ }
+ $this->files[$key] = $file;
+
+ }
+ return $this->files[$key];
+ }
+
+ /**
+ * Stash a file in a temp directory and record that we did this in the session, along with other metadata.
+ * We store data in a flat key-val namespace because that's how UploadBase did it. This also means we have to
+ * ensure that the key-val pairs in $data do not overwrite other required fields.
+ *
+ * @param $path String: path to file you want stashed
+ * @param $data Array: optional, other data you want associated with the file. Do not use 'mTempPath', 'mFileProps', 'mFileSize', or 'version' as keys here
+ * @param $key String: optional, unique key for this file in this session. Used for directory hashing when storing, otherwise not important
+ * @throws UploadStashBadPathException
+ * @throws UploadStashFileException
+ * @return UploadStashFile: file, or null on failure
+ */
+ public function stashFile( $path, $data = array(), $key = null ) {
+ if ( ! file_exists( $path ) ) {
+ wfDebug( "UploadStash: tried to stash file at '$path', but it doesn't exist\n" );
+ throw new UploadStashBadPathException( "path doesn't exist" );
+ }
+ $fileProps = File::getPropsFromPath( $path );
+
+ // we will be initializing from some tmpnam files that don't have extensions.
+ // most of MediaWiki assumes all uploaded files have good extensions. So, we fix this.
+ $extension = self::getExtensionForPath( $path );
+ if ( ! preg_match( "/\\.\\Q$extension\\E$/", $path ) ) {
+ $pathWithGoodExtension = "$path.$extension";
+ if ( ! rename( $path, $pathWithGoodExtension ) ) {
+ throw new UploadStashFileException( "couldn't rename $path to have a better extension at $pathWithGoodExtension" );
+ }
+ $path = $pathWithGoodExtension;
+ }
+
+ // If no key was supplied, use content hash. Also has the nice property of collapsing multiple identical files
+ // uploaded this session, which could happen if uploads had failed.
+ if ( is_null( $key ) ) {
+ $key = $fileProps['sha1'] . "." . $extension;
+ }
+
+ if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+ throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
+ }
+
+
+ // if not already in a temporary area, put it there
+ $status = $this->repo->storeTemp( basename( $path ), $path );
+
+ if( ! $status->isOK() ) {
+ // It is a convention in MediaWiki to only return one error per API exception, even if multiple errors
+ // are available. We use reset() to pick the "first" thing that was wrong, preferring errors to warnings.
+ // This is a bit lame, as we may have more info in the $status and we're throwing it away, but to fix it means
+ // redesigning API errors significantly.
+ // $status->value just contains the virtual URL (if anything) which is probably useless to the caller
+ $error = reset( $status->getErrorsArray() );
+ if ( ! count( $error ) ) {
+ $error = reset( $status->getWarningsArray() );
+ if ( ! count( $error ) ) {
+ $error = array( 'unknown', 'no error recorded' );
+ }
+ }
+ throw new UploadStashFileException( "error storing file in '$path': " . implode( '; ', $error ) );
+ }
+ $stashPath = $status->value;
+
+ // required info we always store. Must trump any other application info in $data
+ // 'mTempPath', 'mFileSize', and 'mFileProps' are arbitrary names
+ // chosen for compatibility with UploadBase's way of doing this.
+ $requiredData = array(
+ 'mTempPath' => $stashPath,
+ 'mFileSize' => $fileProps['size'],
+ 'mFileProps' => $fileProps,
+ 'version' => UploadBase::SESSION_VERSION
+ );
+
+ // now, merge required info and extra data into the session. (The extra data changes from application to application.
+ // UploadWizard wants different things than say FirefoggChunkedUpload.)
+ wfDebug( __METHOD__ . " storing under $key\n" );
+ $_SESSION[UploadBase::SESSION_KEYNAME][$key] = array_merge( $data, $requiredData );
+
+ return $this->getFile( $key );
+ }
+
+ /**
+ * Find or guess extension -- ensuring that our extension matches our mime type.
+ * Since these files are constructed from php tempnames they may not start off
+ * with an extension.
+ * XXX this is somewhat redundant with the checks that ApiUpload.php does with incoming
+ * uploads versus the desired filename. Maybe we can get that passed to us...
+ */
+ public static function getExtensionForPath( $path ) {
+ // Does this have an extension?
+ $n = strrpos( $path, '.' );
+ $extension = null;
+ if ( $n !== false ) {
+ $extension = $n ? substr( $path, $n + 1 ) : '';
+ } else {
+ // If not, assume that it should be related to the mime type of the original file.
+ $magic = MimeMagic::singleton();
+ $mimeType = $magic->guessMimeType( $path );
+ $extensions = explode( ' ', MimeMagic::singleton()->getExtensionsForType( $mimeType ) );
+ if ( count( $extensions ) ) {
+ $extension = $extensions[0];
+ }
+ }
+
+ if ( is_null( $extension ) ) {
+ throw new UploadStashFileException( "extension is null" );
+ }
+
+ return File::normalizeExtension( $extension );
+ }
+
+}
+
+class UploadStashFile extends UnregisteredLocalFile {
+ private $sessionStash;
+ private $sessionKey;
+ private $sessionData;
+ private $urlName;
+
+ /**
+ * A LocalFile wrapper around a file that has been temporarily stashed, so we can do things like create thumbnails for it
+ * Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
+ *
+ * @param $stash UploadStash: useful for obtaining config, stashing transformed files
+ * @param $repo FileRepo: repository where we should find the path
+ * @param $path String: path to file
+ * @param $key String: key to store the path and any stashed data under
+ * @param $data String: any other data we want stored with this file
+ * @throws UploadStashBadPathException
+ * @throws UploadStashFileNotFoundException
+ */
+ public function __construct( $stash, $repo, $path, $key, $data ) {
+ $this->sessionStash = $stash;
+ $this->sessionKey = $key;
+ $this->sessionData = $data;
+
+ // resolve mwrepo:// urls
+ if ( $repo->isVirtualUrl( $path ) ) {
+ $path = $repo->resolveVirtualUrl( $path );
+ }
+
+ // check if path appears to be sane, no parent traversals, and is in this repo's temp zone.
+ $repoTempPath = $repo->getZonePath( 'temp' );
+ if ( ( ! $repo->validateFilename( $path ) ) ||
+ ( strpos( $path, $repoTempPath ) !== 0 ) ) {
+ wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not valid\n" );
+ throw new UploadStashBadPathException( 'path is not valid' );
+ }
+
+ // check if path exists! and is a plain file.
+ if ( ! $repo->fileExists( $path, FileRepo::FILES_ONLY ) ) {
+ wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not found\n" );
+ throw new UploadStashFileNotFoundException( 'cannot find path, or not a plain file' );
+ }
+
+
+
+ parent::__construct( false, $repo, $path, false );
+
+ $this->name = basename( $this->path );
+ }
+
+ /**
+ * A method needed by the file transforming and scaling routines in File.php
+ * We do not necessarily care about doing the description at this point
+ * However, we also can't return the empty string, as the rest of MediaWiki demands this (and calls to imagemagick
+ * convert require it to be there)
+ *
+ * @return String: dummy value
+ */
+ public function getDescriptionUrl() {
+ return $this->getUrl();
+ }
+
+ /**
+ * Get the path for the thumbnail (actually any transformation of this file)
+ * The actual argument is the result of thumbName although we seem to have
+ * buggy code elsewhere that expects a boolean 'suffix'
+ *
+ * @param $thumbName String: name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
+ * @return String: path thumbnail should take on filesystem, or containing directory if thumbname is false
+ */
+ public function getThumbPath( $thumbName = false ) {
+ $path = dirname( $this->path );
+ if ( $thumbName !== false ) {
+ $path .= "/$thumbName";
+ }
+ return $path;
+ }
+
+ /**
+ * Return the file/url base name of a thumbnail with the specified parameters
+ *
+ * @param $params Array: handler-specific parameters
+ * @return String: base name for URL, like '120px-12345.jpg', or null if there is no handler
+ */
+ function thumbName( $params ) {
+ return $this->getParamThumbName( $this->getUrlName(), $params );
+ }
+
+
+ /**
+ * Given the name of the original, i.e. Foo.jpg, and scaling parameters, returns filename with appropriate extension
+ * This is abstracted from getThumbName because we also use it to calculate the thumbname the file should have on
+ * remote image scalers
+ *
+ * @param String $urlName: A filename, like MyMovie.ogx
+ * @param Array $parameters: scaling parameters, like array( 'width' => '120' );
+ * @return String|null parameterized thumb name, like 120px-MyMovie.ogx.jpg, or null if no handler found
+ */
+ function getParamThumbName( $urlName, $params ) {
+ if ( !$this->getHandler() ) {
+ return null;
+ }
+ $extension = $this->getExtension();
+ list( $thumbExt, ) = $this->handler->getThumbType( $extension, $this->getMimeType(), $params );
+ $thumbName = $this->getHandler()->makeParamString( $params ) . '-' . $urlName;
+ if ( $thumbExt != $extension ) {
+ $thumbName .= ".$thumbExt";
+ }
+ return $thumbName;
+ }
+
+ /**
+ * Helper function -- given a 'subpage', return the local URL e.g. /wiki/Special:UploadStash/subpage
+ * @param {String} $subPage
+ * @return {String} local URL for this subpage in the Special:UploadStash space.
+ */
+ private function getSpecialUrl( $subPage ) {
+ return SpecialPage::getTitleFor( 'UploadStash', $subPage )->getLocalURL();
+ }
+
+
+ /**
+ * Get a URL to access the thumbnail
+ * This is required because the model of how files work requires that
+ * the thumbnail urls be predictable. However, in our model the URL is not based on the filename
+ * (that's hidden in the session)
+ *
+ * @param $thumbName String: basename of thumbnail file -- however, we don't want to use the file exactly
+ * @return String: URL to access thumbnail, or URL with partial path
+ */
+ public function getThumbUrl( $thumbName = false ) {
+ wfDebug( __METHOD__ . " getting for $thumbName \n" );
+ return $this->getSpecialUrl( 'thumb/' . $this->getUrlName() . '/' . $thumbName );
+ }
+
+ /**
+ * The basename for the URL, which we want to not be related to the filename.
+ * Will also be used as the lookup key for a thumbnail file.
+ *
+ * @return String: base url name, like '120px-123456.jpg'
+ */
+ public function getUrlName() {
+ if ( ! $this->urlName ) {
+ $this->urlName = $this->sessionKey;
+ }
+ return $this->urlName;
+ }
+
+ /**
+ * Return the URL of the file, if for some reason we wanted to download it
+ * We tend not to do this for the original file, but we do want thumb icons
+ *
+ * @return String: url
+ */
+ public function getUrl() {
+ if ( !isset( $this->url ) ) {
+ $this->url = $this->getSpecialUrl( 'file/' . $this->getUrlName() );
+ }
+ return $this->url;
+ }
+
+ /**
+ * Parent classes use this method, for no obvious reason, to return the path (relative to wiki root, I assume).
+ * But with this class, the URL is unrelated to the path.
+ *
+ * @return String: url
+ */
+ public function getFullUrl() {
+ return $this->getUrl();
+ }
+
+
+ /**
+ * Getter for session key (the session-unique id by which this file's location & metadata is stored in the session)
+ *
+ * @return String: session key
+ */
+ public function getSessionKey() {
+ return $this->sessionKey;
+ }
+
+ /**
+ * Remove the associated temporary file
+ * @return Status: success
+ */
+ public function remove() {
+ return $this->repo->freeTemp( $this->path );
+ }
+
+}
+
+class UploadStashNotAvailableException extends MWException {};
+class UploadStashFileNotFoundException extends MWException {};
+class UploadStashBadPathException extends MWException {};
+class UploadStashBadVersionException extends MWException {};
+class UploadStashFileException extends MWException {};
+class UploadStashZeroLengthFileException extends MWException {};
+
diff --git a/includes/zhtable/Makefile.py b/includes/zhtable/Makefile.py
index 26e229df..a7822b0b 100644
--- a/includes/zhtable/Makefile.py
+++ b/includes/zhtable/Makefile.py
@@ -1,25 +1,33 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @author Philip
-import tarfile, zipfile
+import tarfile as tf
+import zipfile as zf
import os, re, shutil, sys, platform
pyversion = platform.python_version()
-islinux = platform.system().lower() == 'linux' or False
+islinux = platform.system().lower() == 'linux'
-if pyversion[:3] in ['2.5', '2.6', '2.7']:
+if pyversion[:3] in ['2.6', '2.7']:
import urllib as urllib_request
import codecs
- uniopen = codecs.open
- def unichr2(i):
- if sys.maxunicode >= 0x10000 or i < 0x10000:
- return unichr(i)
- else:
- return unichr(0xD7C0+(i>>10)) + unichr(0xDC00+(i&0x3FF))
+ open = codecs.open
+ _unichr = unichr
+ if sys.maxunicode < 0x10000:
+ def unichr(i):
+ if i < 0x10000:
+ return _unichr(i)
+ else:
+ return _unichr( 0xD7C0 + ( i>>10 ) ) + _unichr( 0xDC00 + ( i & 0x3FF ) )
elif pyversion[:2] == '3.':
import urllib.request as urllib_request
- uniopen = open
- unichr2 = chr
+ unichr = chr
+
+def unichr2( *args ):
+ return [unichr( int( i.split('<')[0][2:], 16 ) ) for i in args]
+
+def unichr3( *args ):
+ return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
# DEFINE
SF_MIRROR = 'easynews'
@@ -28,14 +36,14 @@ SCIM_PINYIN_VER = '0.5.91'
LIBTABE_VER = '0.2.3'
# END OF DEFINE
-def GetFileFromURL( url, dest ):
- if os.path.isfile(dest):
+def download( url, dest ):
+ if os.path.isfile( dest ):
print( 'File %s up to date.' % dest )
return
global islinux
if islinux:
# we use wget instead urlretrieve under Linux,
- # because wget will display details like download progress
+ # because wget could display details like download progress
os.system('wget %s' % url)
else:
print( 'Downloading from [%s] ...' % url )
@@ -43,191 +51,200 @@ def GetFileFromURL( url, dest ):
print( 'Download complete.\n' )
return
-def GetFileFromUnihan( path ):
- print( 'Extracting files from %s ...' % path )
- text = zipfile.ZipFile(path).read('Unihan_Variants.txt')
- uhfile = uniopen('Unihan_Variants.txt', 'w')
- uhfile.write(text)
- uhfile.close()
- return
+def uncompress( fp, member, encoding = 'U8' ):
+ name = member.rsplit( '/', 1 )[-1]
+ print( 'Extracting %s ...' % name )
+ fp.extract( member )
+ shutil.move( member, name )
+ if '/' in member:
+ shutil.rmtree( member.split( '/', 1 )[0] )
+ return open( name, 'rb', encoding, 'ignore' )
-def GetFileFromTar( path, member, rename ):
- print( 'Extracting %s from %s ...' % (rename, path) )
- tarfile.open(path, 'r:gz').extract(member)
- shutil.move(member, rename)
- tree_rmv = member.split('/')[0]
- shutil.rmtree(tree_rmv)
- return
-
-def ReadBIG5File( dest ):
- print( 'Reading and decoding %s ...' % dest )
- f1 = uniopen( dest, 'r', encoding='big5hkscs', errors='replace' )
- text = f1.read()
- text = text.replace( '\ufffd', '\n' )
- f1.close()
- f2 = uniopen( dest, 'w', encoding='utf8' )
- f2.write(text)
- f2.close()
- return text
+unzip = lambda path, member, encoding = 'U8': \
+ uncompress( zf.ZipFile( path ), member, encoding )
-def ReadFile( dest ):
- print( 'Reading and decoding %s ...' % dest )
- f = uniopen( dest, 'r', encoding='utf8' )
- ret = f.read()
- f.close()
- return ret
+untargz = lambda path, member, encoding = 'U8': \
+ uncompress( tf.open( path, 'r:gz' ), member, encoding )
-def ReadUnihanFile( dest ):
- print( 'Reading and decoding %s ...' % dest )
- f = uniopen( dest, 'r', encoding='utf8' )
- t2s_code = []
- s2t_code = []
- while True:
- line = f.readline()
- if line:
- if line.startswith('#'):
- continue
- elif not line.find('kSimplifiedVariant') == -1:
- temp = line.split('kSimplifiedVariant')
- t2s_code.append( ( temp[0].strip(), temp[1].strip() ) )
- elif not line.find('kTraditionalVariant') == -1:
- temp = line.split('kTraditionalVariant')
- s2t_code.append( ( temp[0].strip(), temp[1].strip() ) )
- else:
+def parserCore( fp, pos, beginmark = None, endmark = None ):
+ if beginmark and endmark:
+ start = False
+ else: start = True
+ mlist = set()
+ for line in fp:
+ if beginmark and line.startswith( beginmark ):
+ start = True
+ continue
+ elif endmark and line.startswith( endmark ):
break
- f.close()
- return ( t2s_code, s2t_code )
+ if start and not line.startswith( '#' ):
+ elems = line.split()
+ if len( elems ) < 2:
+ continue
+ elif len( elems[0] ) > 1:
+ mlist.add( elems[pos] )
+ return mlist
-def RemoveRows( text, num ):
- text = re.sub( '.*\s*', '', text, num)
- return text
+def tablesParser( path, name ):
+ """ Read file from scim-tables and parse it. """
+ global SCIM_TABLES_VER
+ src = 'scim-tables-%s/tables/zh/%s' % ( SCIM_TABLES_VER, name )
+ fp = untargz( path, src, 'U8' )
+ return parserCore( fp, 1, 'BEGIN_TABLE', 'END_TABLE' )
-def RemoveOneCharConv( text ):
- preg = re.compile('^.\s*$', re.MULTILINE)
- text = preg.sub( '', text )
- return text
+ezbigParser = lambda path: tablesParser( path, 'EZ-Big.txt.in' )
+wubiParser = lambda path: tablesParser( path, 'Wubi.txt.in' )
+zrmParser = lambda path: tablesParser( path, 'Ziranma.txt.in' )
-def ConvertToChar( code ):
- code = code.split('<')[0]
- return unichr2( int( code[2:], 16 ) )
-
-def GetDefaultTable( code_table ):
- char_table = {}
- for ( f, t ) in code_table:
- if f and t:
- from_char = ConvertToChar( f )
- to_chars = [ConvertToChar( code ) for code in t.split()]
- char_table[from_char] = to_chars
- return char_table
-
-def GetManualTable( dest ):
- text = ReadFile( dest )
- temp1 = text.split()
- char_table = {}
- for elem in temp1:
- elem = elem.strip('|')
- if elem:
- temp2 = elem.split( '|', 1 )
- from_char = unichr2( int( temp2[0][2:7], 16 ) )
- to_chars = [unichr2( int( code[2:7], 16 ) ) for code in temp2[1].split('|')]
- char_table[from_char] = to_chars
- return char_table
-
-def GetValidTable( src_table ):
- valid_table = {}
- for f, t in src_table.items():
- valid_table[f] = t[0]
- return valid_table
-
-def GetToManyRules( src_table ):
- tomany_table = {}
- for f, t in src_table.items():
- for i in range(1, len(t)):
- tomany_table[t[i]] = True
- return tomany_table
-
-def RemoveRules( dest, table ):
- text = ReadFile( dest )
- temp1 = text.split()
- for elem in temp1:
- f = ''
- t = ''
- elem = elem.strip().replace( '"', '' ).replace( '\'', '' )
- if '=>' in elem:
- if elem.startswith( '=>' ):
- t = elem.replace( '=>', '' ).strip()
- elif elem.endswith( '=>' ):
- f = elem.replace( '=>', '' ).strip()
- else:
- temp2 = elem.split( '=>' )
- f = temp2[0].strip()
- t = temp2[1].strip()
- try:
- table.pop(f, t)
- continue
- except:
- continue
+def phraseParser( path ):
+ """ Read phrase_lib.txt and parse it. """
+ global SCIM_PINYIN_VER
+ src = 'scim-pinyin-%s/data/phrase_lib.txt' % SCIM_PINYIN_VER
+ dst = 'phrase_lib.txt'
+ fp = untargz( path, src, 'U8' )
+ return parserCore( fp, 0 )
+
+def tsiParser( path ):
+ """ Read tsi.src and parse it. """
+ src = 'libtabe/tsi-src/tsi.src'
+ dst = 'tsi.src'
+ fp = untargz( path, src, 'big5hkscs' )
+ return parserCore( fp, 0 )
+
+def unihanParser( path ):
+ """ Read Unihan_Variants.txt and parse it. """
+ fp = unzip( path, 'Unihan_Variants.txt', 'U8' )
+ t2s = dict()
+ s2t = dict()
+ for line in fp:
+ if line.startswith( '#' ):
+ continue
else:
- f = t = elem
+ elems = line.split()
+ if len( elems ) < 3:
+ continue
+ type = elems.pop( 1 )
+ elems = unichr2( *elems )
+ if type == 'kTraditionalVariant':
+ s2t[elems[0]] = elems[1:]
+ elif type == 'kSimplifiedVariant':
+ t2s[elems[0]] = elems[1:]
+ fp.close()
+ return ( t2s, s2t )
+
+def applyExcludes( mlist, path ):
+ """ Apply exclude rules from path to mlist. """
+ excludes = open( path, 'rb', 'U8' ).read().split()
+ excludes = [word.split( '#' )[0].strip() for word in excludes]
+ excludes = '|'.join( excludes )
+ excptn = re.compile( '.*(?:%s).*' % excludes )
+ diff = [mword for mword in mlist if excptn.search( mword )]
+ mlist.difference_update( diff )
+ return mlist
+
+def charManualTable( path ):
+ fp = open( path, 'rb', 'U8' )
+ ret = {}
+ for line in fp:
+ elems = line.split( '#' )[0].split( '|' )
+ elems = unichr3( *elems )
+ if len( elems ) > 1:
+ ret[elems[0]] = elems[1:]
+ return ret
+
+def toManyRules( src_table ):
+ tomany = set()
+ for ( f, t ) in src_table.iteritems():
+ for i in range( 1, len( t ) ):
+ tomany.add( t[i] )
+ return tomany
+
+def removeRules( path, table ):
+ fp = open( path, 'rb', 'U8' )
+ texc = list()
+ for line in fp:
+ elems = line.split( '=>' )
+ f = t = elems[0].strip()
+ if len( elems ) == 2:
+ t = elems[1].strip()
+ f = f.strip('"').strip("'")
+ t = t.strip('"').strip("'")
if f:
try:
- table.pop(f)
+ table.pop( f )
except:
- x = 1
+ pass
if t:
- for temp_f, temp_t in table.copy().items():
- if temp_t == t:
- table.pop(temp_f)
+ texc.append( t )
+ texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) )
+ for (tmp_f, tmp_t) in table.copy().iteritems():
+ if texcptn.match( tmp_t ):
+ table.pop( tmp_f )
return table
-def DictToSortedList1( src_table ):
- return sorted( src_table.items(), key = lambda m: m[0] ) #sorted( temp_table, key = lambda m: len( m[0] ) )
+def customRules( path ):
+ fp = open( path, 'rb', 'U8' )
+ ret = dict()
+ for line in fp:
+ elems = line.split( '#' )[0].split()
+ if len( elems ) > 1:
+ ret[elems[0]] = elems[1]
+ return ret
-def DictToSortedList2( src_table ):
- return sorted( src_table.items(), key = lambda m: m[1] )
+def dictToSortedList( src_table, pos ):
+ return sorted( src_table.items(), key = lambda m: m[pos] )
-def Converter( string, conv_table ):
+def translate( text, conv_table ):
i = 0
- while i < len(string):
- for j in range(len(string) - i, 0, -1):
- f = string[i:][:j]
+ while i < len( text ):
+ for j in range( len( text ) - i, 0, -1 ):
+ f = text[i:][:j]
t = conv_table.get( f )
if t:
- string = string[:i] + t + string[i:][j:]
+ text = text[:i] + t + text[i:][j:]
i += len(t) - 1
break
i += 1
- return string
+ return text
+
+def manualWordsTable( path, conv_table, reconv_table ):
+ fp = open( path, 'rb', 'U8' )
+ reconv_table = {}
+ wordlist = [line.split( '#' )[0].strip() for line in fp]
+ wordlist = list( set( wordlist ) )
+ wordlist.sort( key = len, reverse = True )
+ while wordlist:
+ word = wordlist.pop()
+ new_word = translate( word, conv_table )
+ rcv_word = translate( word, reconv_table )
+ if word != rcv_word:
+ reconv_table[word] = word
+ reconv_table[new_word] = word
+ return reconv_table
-def GetDefaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
- wordlist = list( set( src_wordlist ) )
+def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
+ wordlist = list( src_wordlist )
wordlist.sort( key = len, reverse = True )
word_conv_table = {}
word_reconv_table = {}
+ conv_table = char_conv_table.copy()
+ reconv_table = char_reconv_table.copy()
+ tomanyptn = re.compile( '(?:%s)' % '|'.join( src_tomany ) )
while wordlist:
- conv_table = {}
- reconv_table = {}
conv_table.update( word_conv_table )
- conv_table.update( char_conv_table )
reconv_table.update( word_reconv_table )
- reconv_table.update( char_reconv_table )
word = wordlist.pop()
- new_word_len = word_len = len(word)
+ new_word_len = word_len = len( word )
while new_word_len == word_len:
- rvt_test = False
- for char in word:
- rvt_test = rvt_test or src_tomany.get(char)
- test_word = Converter( word, reconv_table )
- new_word = Converter( word, conv_table )
- if not reconv_table.get( new_word ):
- if not test_word == word:
- word_conv_table[word] = new_word
- word_reconv_table[new_word] = word
- elif rvt_test:
- rvt_word = Converter( new_word, reconv_table )
- if not rvt_word == word:
- word_conv_table[word] = new_word
- word_reconv_table[new_word] = word
+ add = False
+ test_word = translate( word, reconv_table )
+ new_word = translate( word, conv_table )
+ if not reconv_table.get( new_word ) \
+ and ( test_word != word \
+ or ( tomanyptn.search( word ) \
+ and word != translate( new_word, reconv_table ) ) ):
+ word_conv_table[word] = new_word
+ word_reconv_table[new_word] = word
try:
word = wordlist.pop()
except IndexError:
@@ -235,205 +252,98 @@ def GetDefaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv
new_word_len = len(word)
return word_reconv_table
-def GetManualWordsTable( src_wordlist, conv_table ):
- src_wordlist = [items.split('#')[0].strip() for items in src_wordlist]
- wordlist = list( set( src_wordlist ) )
- wordlist.sort( key = len, reverse = True )
- reconv_table = {}
- while wordlist:
- word = wordlist.pop()
- new_word = Converter( word, conv_table )
- reconv_table[new_word] = word
- return reconv_table
-
-def CustomRules( dest ):
- text = ReadFile( dest )
- temp = text.split()
- ret = dict()
- for i in range( 0, len( temp ), 2 ):
- ret[temp[i]] = temp[i + 1]
- return ret
-
-def GetPHPArray( table ):
+def PHPArray( table ):
lines = ['\'%s\' => \'%s\',' % (f, t) for (f, t) in table if f and t]
- #lines = ['"%s"=>"%s",' % (f, t) for (f, t) in table]
return '\n'.join(lines)
-def RemoveSameChar( src_table ):
- dst_table = {}
- for f, t in src_table.items():
- if f != t:
- dst_table[f] = t
- return dst_table
-
def main():
#Get Unihan.zip:
url = 'http://www.unicode.org/Public/UNIDATA/Unihan.zip'
han_dest = 'Unihan.zip'
- GetFileFromURL( url, han_dest )
+ download( url, han_dest )
# Get scim-tables-$(SCIM_TABLES_VER).tar.gz:
url = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-tables-%s.tar.gz' % ( SF_MIRROR, SCIM_TABLES_VER )
tbe_dest = 'scim-tables-%s.tar.gz' % SCIM_TABLES_VER
- GetFileFromURL( url, tbe_dest )
+ download( url, tbe_dest )
# Get scim-pinyin-$(SCIM_PINYIN_VER).tar.gz:
url = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-pinyin-%s.tar.gz' % ( SF_MIRROR, SCIM_PINYIN_VER )
pyn_dest = 'scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
- GetFileFromURL( url, pyn_dest )
+ download( url, pyn_dest )
# Get libtabe-$(LIBTABE_VER).tgz:
url = 'http://%s.dl.sourceforge.net/sourceforge/libtabe/libtabe-%s.tgz' % ( SF_MIRROR, LIBTABE_VER )
lbt_dest = 'libtabe-%s.tgz' % LIBTABE_VER
- GetFileFromURL( url, lbt_dest )
-
- # Extract the file from a comressed files
-
- # Unihan.txt Simp. & Trad
- GetFileFromUnihan( han_dest )
-
- # Make word lists
- t_wordlist = []
- s_wordlist = []
-
- # EZ.txt.in Trad
- src = 'scim-tables-%s/tables/zh/EZ-Big.txt.in' % SCIM_TABLES_VER
- dst = 'EZ.txt.in'
- GetFileFromTar( tbe_dest, src, dst )
- text = ReadFile( dst )
- text = text.split( 'BEGIN_TABLE' )[1].strip()
- text = text.split( 'END_TABLE' )[0].strip()
- text = re.sub( '.*\t', '', text )
- text = RemoveOneCharConv( text )
- t_wordlist.extend( text.split() )
+ download( url, lbt_dest )
- # Wubi.txt.in Simp
- src = 'scim-tables-%s/tables/zh/Wubi.txt.in' % SCIM_TABLES_VER
- dst = 'Wubi.txt.in'
- GetFileFromTar( tbe_dest, src, dst )
- text = ReadFile( dst )
- text = text.split( 'BEGIN_TABLE' )[1].strip()
- text = text.split( 'END_TABLE' )[0].strip()
- text = re.sub( '.*\t(.*?)\t\d*', '\g<1>', text )
- text = RemoveOneCharConv( text )
- s_wordlist.extend( text.split() )
-
- # Ziranma.txt.in Simp
- src = 'scim-tables-%s/tables/zh/Ziranma.txt.in' % SCIM_TABLES_VER
- dst = 'Ziranma.txt.in'
- GetFileFromTar( tbe_dest, src, dst )
- text = ReadFile( dst )
- text = text.split( 'BEGIN_TABLE' )[1].strip()
- text = text.split( 'END_TABLE' )[0].strip()
- text = re.sub( '.*\t(.*?)\t\d*', '\g<1>', text )
- text = RemoveOneCharConv( text )
- s_wordlist.extend( text.split() )
-
- # phrase_lib.txt Simp
- src = 'scim-pinyin-%s/data/phrase_lib.txt' % SCIM_PINYIN_VER
- dst = 'phrase_lib.txt'
- GetFileFromTar( pyn_dest, src, dst )
- text = ReadFile( 'phrase_lib.txt' )
- text = re.sub( '(.*)\t\d\d*.*', '\g<1>', text)
- text = RemoveRows( text, 5 )
- text = RemoveOneCharConv( text )
- s_wordlist.extend( text.split() )
-
- # tsi.src Trad
- src = 'libtabe/tsi-src/tsi.src'
- dst = 'tsi.src'
- GetFileFromTar( lbt_dest, src, dst )
- text = ReadBIG5File( 'tsi.src' )
- text = re.sub( ' \d.*', '', text.replace('# ', ''))
- text = RemoveOneCharConv( text )
- t_wordlist.extend( text.split() )
-
- # remove duplicate elements
- t_wordlist = list( set( t_wordlist ) )
- s_wordlist = list( set( s_wordlist ) )
-
- # simpphrases_exclude.manual Simp
- text = ReadFile( 'simpphrases_exclude.manual' )
- temp = text.split()
- s_string = '\n'.join( s_wordlist )
- for elem in temp:
- s_string = re.sub( '.*%s.*\n' % elem, '', s_string )
- s_wordlist = s_string.split('\n')
+ # Unihan.txt
+ ( t2s_1tomany, s2t_1tomany ) = unihanParser( han_dest )
+
+ t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
+ s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
- # tradphrases_exclude.manual Trad
- text = ReadFile( 'tradphrases_exclude.manual' )
- temp = text.split()
- t_string = '\n'.join( t_wordlist )
- for elem in temp:
- t_string = re.sub( '.*%s.*\n' % elem, '', t_string )
- t_wordlist = t_string.split('\n')
+ t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
+ s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
- # Make char to char convertion table
- # Unihan.txt, dict t2s_code, s2t_code = { 'U+XXXX': 'U+YYYY( U+ZZZZ) ... ', ... }
- ( t2s_code, s2t_code ) = ReadUnihanFile( 'Unihan_Variants.txt' )
- # dict t2s_1tomany = { '\uXXXX': '\uYYYY\uZZZZ ... ', ... }
- t2s_1tomany = {}
- t2s_1tomany.update( GetDefaultTable( t2s_code ) )
- t2s_1tomany.update( GetManualTable( 'trad2simp.manual' ) )
- # dict s2t_1tomany
- s2t_1tomany = {}
- s2t_1tomany.update( GetDefaultTable( s2t_code ) )
- s2t_1tomany.update( GetManualTable( 'simp2trad.manual' ) )
- # dict t2s_1to1 = { '\uXXXX': '\uYYYY', ... }; t2s_trans = { 'ddddd': '', ... }
- t2s_1to1 = GetValidTable( t2s_1tomany )
- s_tomany = GetToManyRules( t2s_1tomany )
- # dict s2t_1to1; s2t_trans
- s2t_1to1 = GetValidTable( s2t_1tomany )
- t_tomany = GetToManyRules( s2t_1tomany )
- # remove noconvert rules
- t2s_1to1 = RemoveRules( 'trad2simp_noconvert.manual', t2s_1to1 )
- s2t_1to1 = RemoveRules( 'simp2trad_noconvert.manual', s2t_1to1 )
+ s_tomany = toManyRules( t2s_1tomany )
+ t_tomany = toManyRules( s2t_1tomany )
+
+ # noconvert rules
+ t2s_1to1 = removeRules( 'trad2simp_noconvert.manual', t2s_1to1 )
+ s2t_1to1 = removeRules( 'simp2trad_noconvert.manual', s2t_1to1 )
- # Make word to word convertion table
+ # the supper set for word to word conversion
t2s_1to1_supp = t2s_1to1.copy()
s2t_1to1_supp = s2t_1to1.copy()
- # trad2simp_supp_set.manual
- t2s_1to1_supp.update( CustomRules( 'trad2simp_supp_set.manual' ) )
- # simp2trad_supp_set.manual
- s2t_1to1_supp.update( CustomRules( 'simp2trad_supp_set.manual' ) )
- # simpphrases.manual
- text = ReadFile( 'simpphrases.manual' )
- s_wordlist_manual = text.split('\n')
- t2s_word2word_manual = GetManualWordsTable(s_wordlist_manual, s2t_1to1_supp)
- t2s_word2word_manual.update( CustomRules( 'toSimp.manual' ) )
- # tradphrases.manual
- text = ReadFile( 'tradphrases.manual' )
- t_wordlist_manual = text.split('\n')
- s2t_word2word_manual = GetManualWordsTable(t_wordlist_manual, t2s_1to1_supp)
- s2t_word2word_manual.update( CustomRules( 'toTrad.manual' ) )
- # t2s_word2word
+ t2s_1to1_supp.update( customRules( 'trad2simp_supp_set.manual' ) )
+ s2t_1to1_supp.update( customRules( 'simp2trad_supp_set.manual' ) )
+
+ # word to word manual rules
+ t2s_word2word_manual = manualWordsTable( 'simpphrases.manual', s2t_1to1_supp, t2s_1to1_supp )
+ t2s_word2word_manual.update( customRules( 'toSimp.manual' ) )
+ s2t_word2word_manual = manualWordsTable( 'tradphrases.manual', t2s_1to1_supp, s2t_1to1_supp )
+ s2t_word2word_manual.update( customRules( 'toTrad.manual' ) )
+
+ # word to word rules from input methods
+ t_wordlist = set()
+ s_wordlist = set()
+ t_wordlist.update( ezbigParser( tbe_dest ),
+ tsiParser( lbt_dest ) )
+ s_wordlist.update( wubiParser( tbe_dest ),
+ zrmParser( tbe_dest ),
+ phraseParser( pyn_dest ) )
+
+ # exclude
+ s_wordlist = applyExcludes( s_wordlist, 'simpphrases_exclude.manual' )
+ t_wordlist = applyExcludes( t_wordlist, 'tradphrases_exclude.manual' )
+
s2t_supp = s2t_1to1_supp.copy()
s2t_supp.update( s2t_word2word_manual )
t2s_supp = t2s_1to1_supp.copy()
t2s_supp.update( t2s_word2word_manual )
- t2s_word2word = GetDefaultWordsTable( s_wordlist, s_tomany, s2t_1to1_supp, t2s_supp )
- ## toSimp.manual
+
+ # parse list to dict
+ t2s_word2word = defaultWordsTable( s_wordlist, s_tomany, s2t_1to1_supp, t2s_supp )
t2s_word2word.update( t2s_word2word_manual )
- # s2t_word2word
- s2t_word2word = GetDefaultWordsTable( t_wordlist, t_tomany, t2s_1to1_supp, s2t_supp )
- ## toTrad.manual
+ s2t_word2word = defaultWordsTable( t_wordlist, t_tomany, t2s_1to1_supp, s2t_supp )
s2t_word2word.update( s2t_word2word_manual )
# Final tables
# sorted list toHans
- t2s_1to1 = RemoveSameChar( t2s_1to1 )
- s2t_1to1 = RemoveSameChar( s2t_1to1 )
- toHans = DictToSortedList1( t2s_1to1 ) + DictToSortedList2( t2s_word2word )
+ t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
+ toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 )
# sorted list toHant
- toHant = DictToSortedList1( s2t_1to1 ) + DictToSortedList2( s2t_word2word )
+ s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
+ toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 )
# sorted list toCN
- toCN = DictToSortedList2( CustomRules( 'toCN.manual' ) )
+ toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
# sorted list toHK
- toHK = DictToSortedList2( CustomRules( 'toHK.manual' ) )
+ toHK = dictToSortedList( customRules( 'toHK.manual' ), 1 )
# sorted list toSG
- toSG = DictToSortedList2( CustomRules( 'toSG.manual' ) )
+ toSG = dictToSortedList( customRules( 'toSG.manual' ), 1 )
# sorted list toTW
- toTW = DictToSortedList2( CustomRules( 'toTW.manual' ) )
+ toTW = dictToSortedList( customRules( 'toTW.manual' ), 1 )
# Get PHP Array
php = '''<?php
@@ -442,30 +352,32 @@ def main():
*
* Automatically generated using code and data in includes/zhtable/
* Do not modify directly!
+ *
+ * @file
*/
$zh2Hant = array(\n'''
- php += GetPHPArray( toHant )
- php += '\n);\n\n$zh2Hans = array(\n'
- php += GetPHPArray( toHans )
- php += '\n);\n\n$zh2TW = array(\n'
- php += GetPHPArray( toTW )
- php += '\n);\n\n$zh2HK = array(\n'
- php += GetPHPArray( toHK )
- php += '\n);\n\n$zh2CN = array(\n'
- php += GetPHPArray( toCN )
- php += '\n);\n\n$zh2SG = array(\n'
- php += GetPHPArray( toSG )
- php += '\n);'
+ php += PHPArray( toHant ) \
+ + '\n);\n\n$zh2Hans = array(\n' \
+ + PHPArray( toHans ) \
+ + '\n);\n\n$zh2TW = array(\n' \
+ + PHPArray( toTW ) \
+ + '\n);\n\n$zh2HK = array(\n' \
+ + PHPArray( toHK ) \
+ + '\n);\n\n$zh2CN = array(\n' \
+ + PHPArray( toCN ) \
+ + '\n);\n\n$zh2SG = array(\n' \
+ + PHPArray( toSG ) \
+ + '\n);'
- f = uniopen( 'ZhConversion.php', 'w', encoding = 'utf8' )
+ f = open( 'ZhConversion.php', 'wb', encoding = 'utf8' )
print ('Writing ZhConversion.php ... ')
f.write( php )
f.close()
#Remove temp files
print ('Deleting temp files ... ')
- os.remove('EZ.txt.in')
+ os.remove('EZ-Big.txt.in')
os.remove('phrase_lib.txt')
os.remove('tsi.src')
os.remove('Unihan_Variants.txt')
diff --git a/includes/zhtable/simp2trad.manual b/includes/zhtable/simp2trad.manual
index bb4eb7ef..eb5fa396 100644
--- a/includes/zhtable/simp2trad.manual
+++ b/includes/zhtable/simp2trad.manual
@@ -10,6 +10,7 @@ U+04CA0ä² |U+09C06é°†|
U+04CA1䲡|U+09C0C鰌|
U+04CA2ä²¢|U+09C27é°§|
U+04CA3ä²£|U+04C77ä±·|
+U+04DAE䶮|U+09F91龑|
U+04E07万|U+0842Cè¬|U+04E07万|
U+04E0E与|U+08207與|U+04E0E与|
U+04E11丑|U+04E11丑|U+0919C醜|
@@ -41,7 +42,7 @@ U+051C6准|U+051C6准|U+06E96準|
U+051E0几|U+05E7E幾|U+051E0几|
U+051EB凫|U+09CE7鳧|U+09CEC鳬|
U+051FA出|U+051FA出|U+09F63齣|
-U+05212划|U+05212划|U+05283劃|
+U+05212划|U+05283劃|U+05212划|
U+0522B别|U+05225別|U+05F46彆|
U+0522E刮|U+0522E刮|U+098B3颳|
U+05236制|U+05236制|U+088FD製|
@@ -64,7 +65,7 @@ U+05401å|U+05401å|U+07C72ç±²|
U+05408åˆ|U+05408åˆ|U+095A4é–¤|
U+0540AåŠ|U+0540AåŠ|U+05F14å¼”|
U+0540CåŒ|U+0540CåŒ|U+08855è¡•|
-U+0540EåŽ|U+0540EåŽ|U+05F8C後|
+U+0540EåŽ|U+05F8C後|U+0540EåŽ|
U+05411å‘|U+05411å‘|U+056AEåš®|U+066CFæ›|
U+0542Få¯|U+0555Få•Ÿ|U+05553å•“|
U+05446呆|U+05446呆|U+07343çƒ|
@@ -369,4 +370,4 @@ U+2A38A𪎊|U+09EA8麨|
U+2A38B𪎋|U+04D34䴴|
U+2A38C𪎌|U+09EB3麳|
U+2A68Fðªš|U+2A600𪘀|
-U+2A690ðªš|U+2A62F𪘯| \ No newline at end of file
+U+2A690ðªš|U+2A62F𪘯|
diff --git a/includes/zhtable/simpphrases.manual b/includes/zhtable/simpphrases.manual
index a015a34b..4b699e26 100644
--- a/includes/zhtable/simpphrases.manual
+++ b/includes/zhtable/simpphrases.manual
@@ -135,6 +135,15 @@
乾忠
乾淳
æŽä¹¾é¡º
+黄润乾
+男性为乾
+男为乾
+阳为乾
+乾一组
+乾一å›
+陈乾生
+陈公乾生
+字乾生
ä¸ç€ç—•è¿¹
ä¸ç€è¾¹é™…
与ç€
@@ -2222,3 +2231,5 @@
醯壶
苧烯
近角èªä¿¡
+米泽瑠美
+å³¯å²¸å— \ No newline at end of file
diff --git a/includes/zhtable/simpphrases_exclude.manual b/includes/zhtable/simpphrases_exclude.manual
index 4606041f..3e9d3ecc 100644
--- a/includes/zhtable/simpphrases_exclude.manual
+++ b/includes/zhtable/simpphrases_exclude.manual
@@ -17,4 +17,5 @@
ç°‘
樑
摺å 
-餗 \ No newline at end of file
+餗
+安甯 \ No newline at end of file
diff --git a/includes/zhtable/toCN.manual b/includes/zhtable/toCN.manual
index e3c12d0b..54e95765 100644
--- a/includes/zhtable/toCN.manual
+++ b/includes/zhtable/toCN.manual
@@ -228,6 +228,7 @@
夜学 夜校
åŽä¹ æ°‘ä¹
中樂 æ°‘ä¹
+è»ä¸­æ¨‚園 军中ä¹å›­
åŽä¹è¡— åŽä¹è¡—
屋价 房价
計程車 出租车
@@ -277,4 +278,4 @@
矽钢 矽钢
ä¾å„¸ç´€ ä¾ç½—纪
甚麽 什么
-甚麼 什么 \ No newline at end of file
+甚麼 什么
diff --git a/includes/zhtable/toHK.manual b/includes/zhtable/toHK.manual
index 10a3dfcb..53b354c7 100644
--- a/includes/zhtable/toHK.manual
+++ b/includes/zhtable/toHK.manual
@@ -2239,3 +2239,4 @@
分布 分佈
分布于 分佈於
分布於 分佈於
+想象 æƒ³åƒ \ No newline at end of file
diff --git a/includes/zhtable/toSimp.manual b/includes/zhtable/toSimp.manual
index f424ee73..da04b82e 100644
--- a/includes/zhtable/toSimp.manual
+++ b/includes/zhtable/toSimp.manual
@@ -41,10 +41,26 @@
乾鹄 乾鹄
乾鹊 乾鹊
乾龙 乾龙
+张法乾 张法乾
+æ—‹ä¹¾è½¬å¤ æ—‹ä¹¾è½¬å¤
天é“为乾 天é“为乾
易ç»Â·ä¹¾ 易ç»Â·ä¹¾
易ç»ä¹¾ 易ç»ä¹¾
乾务 乾务
+黄润乾 黄润乾
+男性为乾 男性为乾
+男为乾 男为乾
+阳为乾 阳为乾
+男性为乾 男性为乾
+男性爲乾 男性为乾
+男为乾 男为乾
+男爲乾 男为乾
+阳为乾 阳为乾
+陽爲乾 阳为乾
+乾一组 乾一组
+ä¹¾ä¸€å› ä¹¾ä¸€å›
+陈乾生 陈乾生
+陈公乾生 陈公乾生
柳诒徵 柳诒徵
於夫罗 於夫罗
æ–¼æ¢¨åŽ æ–¼æ¢¨åŽ
@@ -86,6 +102,8 @@
答覆 ç­”å¤
åå覆覆 ååå¤å¤
é‡è¦† é‡å¤
+覆核 å¤æ ¸
+覆查 å¤æŸ¥
鬱姓 鬱姓
é¬±æ° é¬±æ°
ä¾å„¸ç´€ ä¾ç½—纪
@@ -140,3 +158,5 @@
標誌著 标志ç€
近角èªä¿¡ 近角èªä¿¡
ä¿®éŠ ä¿®ç‚¼
+米泽瑠美 米泽瑠美
+太閤 太é˜
diff --git a/includes/zhtable/toTW.manual b/includes/zhtable/toTW.manual
index 2ce16f3f..a638e86b 100644
--- a/includes/zhtable/toTW.manual
+++ b/includes/zhtable/toTW.manual
@@ -50,7 +50,6 @@
以太网 乙太網
ä½å›¾ 點陣圖
例程 常å¼
-ä¿¡é“ é€šé“
光标 游標
光盘 光碟
光驱 光碟機
@@ -329,7 +328,6 @@
平治 賓士
奔驰 賓士
ç©æž¶ æ·è±¹
-ç¦å£« ç¦æ–¯
雪é“é¾™ 雪éµé¾
è¬äº‹å¾— 馬自é”
拿破仑 拿破崙
@@ -410,3 +408,5 @@
é¤¨è£ é¤¨è£¡
ç³»åˆ—è£ ç³»åˆ—è£¡
æ‘å­è£ æ‘å­è£¡
+é’霉素 é’é»´ç´ 
+想象 想åƒ
diff --git a/includes/zhtable/toTrad.manual b/includes/zhtable/toTrad.manual
index b3459054..0c79178f 100644
--- a/includes/zhtable/toTrad.manual
+++ b/includes/zhtable/toTrad.manual
@@ -137,6 +137,46 @@
äºŽéŸ‹æ–¯å±ˆèŠ äºŽéŸ‹æ–¯å±ˆèŠ
于克-蘭多縣 于克-蘭多縣
于斯ç´çˆ¾æ–¯è²é‡Œ 于斯ç´çˆ¾æ–¯è²é‡Œ
+å¤äºŽå–¬ å¤äºŽå–¬
涂澤民 涂澤民
涂長望 涂長望
-å°åŽ† 枱曆 \ No newline at end of file
+涂æ•æ† 涂æ•æ†
+å°åŽ† 枱曆
+è‰·åŽ è‰·åŽ
+å»¢åŽ å»¢åŽ
+åŽé«®åº§ åŽé«®åº§
+åŽé«®æ˜Ÿç³»åœ˜ åŽé«®æ˜Ÿç³»åœ˜
+åŽé«®FK型星 åŽé«®FK型星
+åŽæµ·ç£ åŽæµ·ç£
+è³ˆåŽ è³ˆåŽ
+è³¢åŽ è³¢åŽ
+å‘‚åŽ å‘‚åŽ
+èŸ»åŽ èŸ»åŽ
+馬格里布 馬格里布
+佳里鎮 佳里鎮
+埔裡社撫墾局 埔è£ç¤¾æ’«å¢¾å±€
+埔è£ç¤¾æ’«å¢¾å±€ 埔è£ç¤¾æ’«å¢¾å±€
+有åªæŽ¡ 有åªæŽ¡
+ä»»ä½•è¡¨é” ä»»ä½•è¡¨é”
+會干擾 會干擾
+å…šé … å…šé …
+ä½™ä¸‰å‹ ä½™ä¸‰å‹
+ç°¡ç­‘ç¿Ž ç°¡ç­‘ç¿Ž
+楊雅筑 楊雅筑
+æ°å¨çˆ¾éŸ³æ¨‚ æ°å¨çˆ¾éŸ³æ¨‚
+å°¸ç¾…ç²¾èˆ å°¸ç¾…ç²¾èˆ
+索馬里 索馬里
+騰格里 騰格里
+æ‘里長 æ‘里長
+進制 進制
+æ¨¡èŒƒä¸‰è» æ¨¡èŒƒä¸‰è»
+é»ƒè©©æ° é»ƒè©©æ°
+陳冲 陳冲
+劉佳怜 劉佳怜
+范賢惠 范賢惠
+于國治 于國治
+于楓 于楓
+黎å‰é›² 黎å‰é›²
+于飛島 于飛島
+鄉愿 鄉愿
+奇迹 奇蹟
diff --git a/includes/zhtable/trad2simp.manual b/includes/zhtable/trad2simp.manual
index 4aed7e1d..6cbc3ee5 100644
--- a/includes/zhtable/trad2simp.manual
+++ b/includes/zhtable/trad2simp.manual
@@ -90,12 +90,14 @@ U+071EC燬|U+06BC1æ¯|
U+07343çƒ|U+05446呆|
U+07515甕|U+074EE瓮|
U+07526甦|U+082CFè‹|
+U+0752F甯|U+05B81å®|
U+0756B畫|U+0753B画|U+05212划|
U+07575畵|U+0753B画|U+05212划|
U+075E0ç— |U+09178é…¸|
U+07652癒|U+06108愈|
U+07661癡|U+075F4痴|
U+076C3盃|U+0676Fæ¯|
+U+0771E眞|U+0771F真|
U+077AD瞭|U+04E86了|
U+077C7矇|U+08499蒙|
U+07843硃|U+06731朱|
@@ -228,6 +230,7 @@ U+09EF4黴|U+09709霉|
U+09F15鼕|U+051AC冬|
U+09F47齇|U+09F44齄|
U+09F63齣|U+051FA出|
+U+09F91龑|U+04DAE䶮|
U+21ED5ð¡»•|U+05C81å²|
U+26A99𦪙|U+0447D䑽|
U+2895B𨥛|U+28C40𨱀|
diff --git a/includes/zhtable/tradphrases.manual b/includes/zhtable/tradphrases.manual
index f3a95335..5a832a60 100644
--- a/includes/zhtable/tradphrases.manual
+++ b/includes/zhtable/tradphrases.manual
@@ -30,6 +30,26 @@
ï¼—éš»
8隻
9隻
+0åªæ”¯æ´
+1åªæ”¯æ´
+2åªæ”¯æ´
+3åªæ”¯æ´
+4åªæ”¯æ´
+5åªæ”¯æ´
+6åªæ”¯æ´
+7åªæ”¯æ´
+8åªæ”¯æ´
+9åªæ”¯æ´
+0åªæ”¯æŒ
+1åªæ”¯æŒ
+2åªæ”¯æŒ
+3åªæ”¯æŒ
+4åªæ”¯æŒ
+5åªæ”¯æŒ
+6åªæ”¯æŒ
+7åªæ”¯æŒ
+8åªæ”¯æŒ
+9åªæ”¯æŒ
百隻
åƒéš»
è¬éš»
@@ -53,6 +73,7 @@
多åªæ˜¯
多åªéœ€
多åªæœƒ
+多åªç”¨
大åªèƒ½
大åªå¯
大åªåœ¨
@@ -109,6 +130,9 @@
7天後
8天後
9天後
+天後來
+天後天
+天後åŠ
後å°
è¬è±¡
並存著
@@ -241,6 +265,7 @@
幹的åœç•¶
乾巴
åŽä¹¾
+眼乾
å·é›žä¸è‘—
几絲
划著
@@ -431,6 +456,7 @@
並發ç¾
並發展
並發動
+並發布
ç«ä¸¦éž
舉手表
æ®æ‰‹è¡¨
@@ -649,6 +675,8 @@
牽一髮
白發其事
åŽé«®åº§
+åŽé«®æ˜Ÿç³»åœ˜
+åŽé«®FK型星
波髮藻
辮髮
逋髮
@@ -698,6 +726,10 @@
櫛髮工
鬒髮
模范棒棒堂
+模范三è»
+模范七棒
+模范14棒
+模范21棒
é¡ç¯„
儀範
典範
@@ -734,6 +766,7 @@
置言æˆç¯„
å¾çˆ²ä¹‹ç¯„我馳驅
天地為範
+範數
丰采
丰標ä¸å‡¡
丰神
@@ -874,6 +907,8 @@
è£å‹¾å¤–連
è£æ‰‹
水里鄉
+水里溪
+水里æ¿æ°´æºª
二里頭
å¹´æ­·å²
西歷å²
@@ -881,6 +916,7 @@
國歷代
國歷任
國歷屆
+國歷經
æ–°æ­·å²
å¤æ­·å²
百花曆
@@ -926,6 +962,14 @@
格里高利曆
共和曆
掛曆
+曆ç„
+天文曆表
+日心曆表
+地心曆表
+復活節曆表
+月çƒæ›†è¡¨
+伊爾汗曆表
+延曆
共和歷å²
厤物之æ„
爰定祥厤
@@ -1001,7 +1045,6 @@
一é‹éºµ
伊府麵
藥麵兒
-洋麵
æ„大利麵
湯下麵
茶麵
@@ -1032,6 +1075,7 @@
太僕
僮僕
金僕姑
+僕婢
樸實
樸訥
樸念ä»
@@ -1358,10 +1402,6 @@
昇平
爾冬陞
澹臺
-涂謹申
-涂鴻欽
-涂壯勳
-涂醒哲
拜託
委託
輓曲
@@ -1860,6 +1900,7 @@
批准的
核准的
為準
+準直
擺é˜
ç·¨é˜
碰é˜
@@ -2029,6 +2070,9 @@
任何é˜éŒ¶
任何é˜
任何錶
+任何表示
+任何表é”
+任何表演
é¸æ‰‹è¡¨ç¾
é¸æ‰‹è¡¨é”
é¸æ‰‹è¡¨ç¤º
@@ -2081,7 +2125,6 @@
銫é˜
數字é˜éŒ¶
數字é˜
-數字錶
顯示é˜éŒ¶
顯示é˜
顯示錶
@@ -2288,8 +2331,13 @@
7餘
8餘
9餘
+余姓
余光生
余光中
+ä½™æ€æ•
+ä½™å¨å¾·
+ä½™å­æ˜Ž
+余三å‹
å´‘å±±
崑曲
å´‘è…”
@@ -2361,7 +2409,7 @@
弔場
弔書
弔詞
-弔死
+弔死å•å­¤
弔死å•ç–¾
弔撒
弔喪
@@ -2872,6 +2920,8 @@
陽歷å²
é¡æˆ‘略歷å²
黃歷å²
+天曆
+天歷å²
美醜
ç»é†œ
出醜
@@ -2898,7 +2948,7 @@
醜èž
醜語
æ¯é†œ
-é½£å­
+一齣å­
齣兒
è³£çƒ
發çƒ
@@ -2935,6 +2985,7 @@
普鼕鼕
鼕鼕鼓
令人髮指
+爆發指數
開發
剪其髮
å哺æ‰é«®
@@ -2964,7 +3015,7 @@
細如髮
繫於一髮
膚髮
-è¯é«®
+生è¯é«®
蒼髮
被髮佯狂
被髮入山
@@ -3007,6 +3058,7 @@
å°è¡¨ä¸­
å°è¡¨æ˜Ž
ä¸æº–確
+並ä¸æº–確
一伙頭
一伙食
一åŠåª
@@ -3314,6 +3366,7 @@
å—宮适
大蜡
å­äº‘
+分å­é›²
å°ä»·
æ­²è¿äº‘æš®
崖广
@@ -3690,6 +3743,17 @@
ç•æ°´
點裡
這åªæ˜¯
+這åªä¸
+這åªå®¹
+這åªå…
+這åªæŽ¡
+這åªç”¨
+有åªæ˜¯
+有åªä¸
+有åªå®¹
+有åªå…
+有åªæŽ¡
+有åªç”¨
葉å¶ç¹
胡å­æ˜‚
包括
@@ -3807,6 +3871,8 @@
于韋斯屈èŠ
于克-蘭多縣
于斯ç´çˆ¾æ–¯è²é‡Œ
+å¤äºŽå–¬
+涂姓
涂å¤
涂天相
涂åºç‘„
@@ -3815,6 +3881,12 @@
涂羽å¿
涂逢年
涂長望
+涂謹申
+涂鴻欽
+涂壯勳
+涂醒哲
+涂善妮
+涂æ•æ†
總è£åˆ¶
故云
強制作用
@@ -3894,8 +3966,294 @@
注釋
月é¢
ä¿®æ°æ¥·
+ä¿®æ°éºŸ
學裡
ç„裡
館裡
系列裡
æ‘å­è£¡
+艷åŽ
+廢åŽ
+妖åŽ
+åŽæµ·ç£
+ä»™åŽ
+賈åŽ
+è³¢åŽ
+蜂åŽ
+皇åŽ
+王åŽ
+王侯åŽ
+æ¯åŽ
+æ­¦åŽ
+æ­ŒåŽ
+å½±åŽ
+å°åŽ
+太åŽ
+天åŽ
+å‘‚åŽ
+åŽé‡Œ
+åŽè¡—
+åŽç¾¿
+åŽç¨·
+åŽåº§
+åŽå¹³è·¯
+åŽå®‰è·¯
+åŽåœŸ
+åŽåŒ—è¡—
+åŽå† 
+望åŽçŸ³
+åŽè§’
+蟻åŽ
+åŽå¦ƒ
+大周åŽ
+å°å‘¨åŽ
+染殿åŽ
+准三åŽ
+風åŽ
+風後,
+人如風後入江雲
+中風後
+å±é¢¨å¾Œ
+颱風後
+颳風後
+整風後
+打風後
+é‡é¢¨å¾Œ
+èžé¢¨å¾Œ
+逆風後
+順風後
+大風後
+馬格里布
+劃入
+中庄å­
+埔è£ç¤¾æ’«å¢¾å±€
+懸掛
+僱傭
+å››æ¨å…­å…¥
+宿èˆ
+會干擾
+代表
+高清愿
+瓷製
+竹製
+絲製
+莜麵
+劃入
+ç°¡ç­‘ç¿Ž
+楊雅筑
+é­”æ°åº§
+æ°å¨çˆ¾éŸ³æ¨‚
+彭于æ™
+尸羅精èˆ
+索馬里 # (åŠä»¥ä¸‹ï¼‰é¿å…里海=>è£æµ·çš„轉æ›
+西西里
+騰格里
+阿里
+æ‘里長
+進制
+黃詩æ°
+陳冲
+何æ°
+劉佳怜
+于å°æƒ 
+于å“æµ·
+于耘婕
+于洋
+于澄
+于光新
+范賢惠
+于國治
+于楓
+于熙ç
+涂善妮
+邱于庭
+熊æ°
+åœäº‘å‰
+黎å‰é›²
+于飛島
+代表
+水無怜奈
+å‚²éŠ # æµè§ˆå™¨å
+å¤äºŽå–¬
+è³­åŽ
+åŽæµ·ç£
+ç«‹åŽç¶œ
+甲åŽè·¯
+劉芸åŽ
+è¬è¯åŽ
+趙惠åŽ
+趙å¨åŽ
+è–åŽ
+陳有åŽ
+許虬
+網éŠ
+ç‹„å¿—æ°
+伊é©æ°
+于冠è¯
+于å°ç…™
+于雲鶴
+于忠肅集
+于å‹æ¾¤
+于和å‰
+于來山
+于樂
+于天é¾
+于謹
+于榮光
+電波é˜
+余三å‹
+掛å
+啟發å¼
+舞åŽ
+甄åŽ
+郭åŽ
+0å¹´ # å”助分詞
+1å¹´
+2å¹´
+3å¹´
+4å¹´
+5å¹´
+6å¹´
+7å¹´
+8å¹´
+9å¹´
+ï¼å¹´
+1年
+ï¼’å¹´
+3年
+4年
+5年
+ï¼–å¹´
+ï¼—å¹´
+8年
+9年
+〇年
+零年
+一年
+å…©å¹´
+二年
+三年
+四年
+五年
+å…­å¹´
+七年
+å…«å¹´
+ä¹å¹´
+åå¹´
+百年
+åƒå¹´
+è¬å¹´
+å„„å¹´
+周åŽ
+0周後
+1周後
+2周後
+3周後
+4周後
+5周後
+6周後
+7周後
+8周後
+9周後
+ï¼å‘¨å¾Œ
+1周後
+2周後
+3周後
+4周後
+5周後
+6周後
+7周後
+8周後
+9周後
+零周後
+〇周後
+一周後
+二周後
+兩周後
+三周後
+四周後
+五周後
+六周後
+七周後
+八周後
+ä¹å‘¨å¾Œ
+å周後
+百周後
+åƒå‘¨å¾Œ
+è¬å‘¨å¾Œ
+億周後
+幾周後
+多周後
+å‰å¾€
+åŽç‘žç«™
+å¸åŽè‡º
+新井里美
+樗里å­
+伊é”里å­
+濱田里佳å­
+å°ŠåŽ
+å¶å¿—ç©—
+å¶ä¸äºŒå­
+于立æˆ
+山谷é“
+æŽå¿—å–œ
+于欣
+于少ä¿
+于海
+於海邊
+於海上
+于凌辰
+于é­æ™º
+于鬯
+于仲文
+于å†æ¸…
+于震
+於震å‰
+於震åŽ
+於震中
+固定制
+毗婆尸佛
+尸棄佛
+划船
+划ä¸ä¾†
+划拳
+划槳
+划動
+划艇
+划行
+划算
+總è£åˆ¶
+æ’生
+嚴云農
+手è£åŠ
+秦莊襄王
+伊æ±æ€œ
+衛後莊公
+餘é‡
+並行
+éƒéƒé’é’
+å”防
+å°è¡¨æ ¼
+å°è¡¨ç¤º
+å°è¡¨é”
+å°è¡¨æ¼”
+å°è¡¨æ˜Ž
+了然後
+戴表元
+張樂于張å¾
+余力為
+葉å¶ç´
+万俟
+幾個
+澀谷å€
+å”調
+é¸æ‰‹
+併發症
+併發é‡ç—‡
+併發模å¼
+併發型模å¼
+金色長髮
+紅色長髮
+一頭長髮
+çš„é•·é«®
+黑色長髮
diff --git a/includes/zhtable/tradphrases_exclude.manual b/includes/zhtable/tradphrases_exclude.manual
index 5fec98b2..6ed245c3 100644
--- a/includes/zhtable/tradphrases_exclude.manual
+++ b/includes/zhtable/tradphrases_exclude.manual
@@ -318,3 +318,12 @@
註釋
æµ®éŠ
冶éŠ
+裡å­
+裡外
+單隻
+è¯ä¿‚
+é‚£è£
+殺虫藥
+好家伙
+姦污
+併發
diff --git a/index.php b/index.php
index b413533e..8b4e2f7d 100644
--- a/index.php
+++ b/index.php
@@ -16,7 +16,8 @@
* Copyright (C) 2001-2010 Magnus Manske, Brion Vibber, Lee Daniel Crocker,
* Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason,
* Niklas Laxström, Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor,
- * Aaron Schulz and others.
+ * Aaron Schulz, Andrew Garrett, Raimond Spekking, Alexandre Emsenhuber
+ * Siebrand Mazeland, Chad Horohoe, Roan Kattouw and others.
*
* 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
@@ -36,13 +37,11 @@
* @file
*/
-
# Initialise common code
$preIP = dirname( __FILE__ );
require_once( "$preIP/includes/WebStart.php" );
# Initialize MediaWiki base class
-require_once( "$preIP/includes/Wiki.php" );
$mediaWiki = new MediaWiki();
wfProfileIn( 'main-misc-setup' );
@@ -102,10 +101,8 @@ if( $wgUseFileCache && isset( $wgTitle ) ) {
# Setting global variables in mediaWiki
$mediaWiki->setVal( 'action', $action );
-$mediaWiki->setVal( 'CommandLineMode', $wgCommandLineMode );
$mediaWiki->setVal( 'DisabledActions', $wgDisabledActions );
$mediaWiki->setVal( 'DisableHardRedirects', $wgDisableHardRedirects );
-$mediaWiki->setVal( 'DisableInternalSearch', $wgDisableInternalSearch );
$mediaWiki->setVal( 'EnableCreativeCommonsRdf', $wgEnableCreativeCommonsRdf );
$mediaWiki->setVal( 'EnableDublinCoreRdf', $wgEnableDublinCoreRdf );
$mediaWiki->setVal( 'JobRunRate', $wgJobRunRate );
@@ -115,10 +112,7 @@ $mediaWiki->setVal( 'UseExternalEditor', $wgUseExternalEditor );
$mediaWiki->setVal( 'UsePathInfo', $wgUsePathInfo );
$mediaWiki->performRequestForTitle( $wgTitle, $wgArticle, $wgOut, $wgUser, $wgRequest );
-$mediaWiki->finalCleanup( $wgDeferredUpdateList, $wgOut );
-
-# Not sure when $wgPostCommitUpdateList gets set, so I keep this separate from finalCleanup
-$mediaWiki->doUpdates( $wgPostCommitUpdateList );
+$mediaWiki->finalCleanup( $wgOut );
$mediaWiki->restInPeace();
diff --git a/languages/Language.php b/languages/Language.php
index 3416fb27..fee5aec3 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -1,30 +1,34 @@
<?php
/**
- * @defgroup Language Language
+ * Internationalisation code
*
* @file
* @ingroup Language
*/
-if( !defined( 'MEDIAWIKI' ) ) {
+/**
+ * @defgroup Language Language
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
echo "This file is part of MediaWiki, it is not a valid entry point.\n";
exit( 1 );
}
# Read language names
global $wgLanguageNames;
-require_once( dirname(__FILE__) . '/Names.php' ) ;
+require_once( dirname( __FILE__ ) . '/Names.php' );
global $wgInputEncoding, $wgOutputEncoding;
/**
* These are always UTF-8, they exist only for backwards compatibility
*/
-$wgInputEncoding = "UTF-8";
-$wgOutputEncoding = "UTF-8";
+$wgInputEncoding = 'UTF-8';
+$wgOutputEncoding = 'UTF-8';
-if( function_exists( 'mb_strtoupper' ) ) {
- mb_internal_encoding('UTF-8');
+if ( function_exists( 'mb_strtoupper' ) ) {
+ mb_internal_encoding( 'UTF-8' );
}
/**
@@ -34,20 +38,22 @@ if( function_exists( 'mb_strtoupper' ) ) {
*/
class FakeConverter {
var $mLang;
- function FakeConverter( $langobj ) { $this->mLang = $langobj; }
- function autoConvertToAllVariants( $text ) { return $text; }
+ function __construct( $langobj ) { $this->mLang = $langobj; }
+ function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
function convert( $t ) { return $t; }
function convertTitle( $t ) { return $t->getPrefixedText(); }
function getVariants() { return array( $this->mLang->getCode() ); }
function getPreferredVariant() { return $this->mLang->getCode(); }
+ function getDefaultVariant() { return $this->mLang->getCode(); }
+ function getURLVariant() { return ''; }
function getConvRuleTitle() { return false; }
- function findVariantLink(&$l, &$n, $ignoreOtherCond = false) {}
- function getExtraHashOptions() {return '';}
- function getParsedTitle() {return '';}
- function markNoConversion($text, $noParse=false) {return $text;}
- function convertCategoryKey( $key ) {return $key; }
- function convertLinkToAllVariants($text){ return array( $this->mLang->getCode() => $text); }
- function armourMath($text){ return $text; }
+ function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) { }
+ function getExtraHashOptions() { return ''; }
+ function getParsedTitle() { return ''; }
+ function markNoConversion( $text, $noParse = false ) { return $text; }
+ function convertCategoryKey( $key ) { return $key; }
+ function convertLinkToAllVariants( $text ) { return $this->autoConvertToAllVariants( $text ); }
+ function armourMath( $text ) { return $text; }
}
/**
@@ -129,7 +135,7 @@ class Language {
*/
static function factory( $code ) {
if ( !isset( self::$mLangObjCache[$code] ) ) {
- if( count( self::$mLangObjCache ) > 10 ) {
+ if ( count( self::$mLangObjCache ) > 10 ) {
// Don't keep a billion objects around, that's stupid.
self::$mLangObjCache = array();
}
@@ -158,10 +164,10 @@ class Language {
$class = 'Language' . str_replace( '-', '_', ucfirst( $code ) );
// Preload base classes to work around APC/PHP5 bug
if ( file_exists( "$IP/languages/classes/$class.deps.php" ) ) {
- include_once("$IP/languages/classes/$class.deps.php");
+ include_once( "$IP/languages/classes/$class.deps.php" );
}
if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
- include_once("$IP/languages/classes/$class.php");
+ include_once( "$IP/languages/classes/$class.php" );
}
}
@@ -169,7 +175,7 @@ class Language {
throw new MWException( "Language fallback loop detected when creating class $class\n" );
}
- if( ! class_exists( $class ) ) {
+ if ( !class_exists( $class ) ) {
$fallback = Language::getFallbackFor( $code );
++$recursionLevel;
$lang = Language::newFromCode( $fallback );
@@ -202,7 +208,7 @@ class Language {
}
function __construct() {
- $this->mConverter = new FakeConverter($this);
+ $this->mConverter = new FakeConverter( $this );
// Set the code to the name of the descendant
if ( get_class( $this ) == 'Language' ) {
$this->mCode = 'en';
@@ -225,7 +231,7 @@ class Language {
* Hook which will be called if this is the content language.
* Descendants can use this to register hook functions or modify globals
*/
- function initContLang() {}
+ function initContLang() { }
/**
* @deprecated Use User::getDefaultOptions()
@@ -257,12 +263,12 @@ class Language {
*/
function getNamespaces() {
if ( is_null( $this->namespaceNames ) ) {
- global $wgExtraNamespaces, $wgMetaNamespace, $wgMetaNamespaceTalk;
+ global $wgMetaNamespace, $wgMetaNamespaceTalk, $wgExtraNamespaces;
$this->namespaceNames = self::$dataCache->getItem( $this->mCode, 'namespaceNames' );
- if ( $wgExtraNamespaces ) {
- $this->namespaceNames = $wgExtraNamespaces + $this->namespaceNames;
- }
+ $validNamespaces = MWNamespace::getCanonicalNamespaces();
+
+ $this->namespaceNames = $wgExtraNamespaces + $this->namespaceNames + $validNamespaces;
$this->namespaceNames[NS_PROJECT] = $wgMetaNamespace;
if ( $wgMetaNamespaceTalk ) {
@@ -272,6 +278,13 @@ class Language {
$this->namespaceNames[NS_PROJECT_TALK] =
$this->fixVariableInNamespace( $talk );
}
+
+ # Sometimes a language will be localised but not actually exist on this wiki.
+ foreach( $this->namespaceNames as $key => $text ) {
+ if ( !isset( $validNamespaces[$key] ) ) {
+ unset( $this->namespaceNames[$key] );
+ }
+ }
# The above mixing may leave namespaces out of canonical order.
# Re-order by namespace ID number...
@@ -290,8 +303,8 @@ class Language {
*/
function getFormattedNamespaces() {
$ns = $this->getNamespaces();
- foreach($ns as $k => $v) {
- $ns[$k] = strtr($v, '_', ' ');
+ foreach ( $ns as $k => $v ) {
+ $ns[$k] = strtr( $v, '_', ' ' );
}
return $ns;
}
@@ -320,7 +333,7 @@ class Language {
*/
function getFormattedNsText( $index ) {
$ns = $this->getNsText( $index );
- return strtr($ns, '_', ' ');
+ return strtr( $ns, '_', ' ' );
}
/**
@@ -332,7 +345,7 @@ class Language {
* @return mixed An integer if $text is a valid value otherwise false
*/
function getLocalNsIndex( $text ) {
- $lctext = $this->lc($text);
+ $lctext = $this->lc( $text );
$ids = $this->getNamespaceIds();
return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
}
@@ -365,14 +378,14 @@ class Language {
# class-specific fixup hasn't been done.
$this->mNamespaceIds = array();
foreach ( $this->getNamespaces() as $index => $name ) {
- $this->mNamespaceIds[$this->lc($name)] = $index;
+ $this->mNamespaceIds[$this->lc( $name )] = $index;
}
foreach ( $this->getNamespaceAliases() as $name => $index ) {
- $this->mNamespaceIds[$this->lc($name)] = $index;
+ $this->mNamespaceIds[$this->lc( $name )] = $index;
}
if ( $wgNamespaceAliases ) {
foreach ( $wgNamespaceAliases as $name => $index ) {
- $this->mNamespaceIds[$this->lc($name)] = $index;
+ $this->mNamespaceIds[$this->lc( $name )] = $index;
}
}
}
@@ -388,7 +401,7 @@ class Language {
* @return mixed An integer if $text is a valid value otherwise false
*/
function getNsIndex( $text ) {
- $lctext = $this->lc($text);
+ $lctext = $this->lc( $text );
if ( ( $ns = MWNamespace::getCanonicalIndex( $lctext ) ) !== null ) {
return $ns;
}
@@ -480,7 +493,7 @@ class Language {
global $IP;
$names = array();
$dir = opendir( "$IP/languages/messages" );
- while( false !== ( $file = readdir( $dir ) ) ) {
+ while ( false !== ( $file = readdir( $dir ) ) ) {
$code = self::getCodeFromFileName( $file, 'Messages' );
if ( $code && isset( $allNames[$code] ) ) {
$names[$code] = $allNames[$code];
@@ -509,39 +522,39 @@ class Language {
}
function getMonthName( $key ) {
- return $this->getMessageFromDB( self::$mMonthMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mMonthMsgs[$key - 1] );
}
function getMonthNameGen( $key ) {
- return $this->getMessageFromDB( self::$mMonthGenMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mMonthGenMsgs[$key - 1] );
}
function getMonthAbbreviation( $key ) {
- return $this->getMessageFromDB( self::$mMonthAbbrevMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mMonthAbbrevMsgs[$key - 1] );
}
function getWeekdayName( $key ) {
- return $this->getMessageFromDB( self::$mWeekdayMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mWeekdayMsgs[$key - 1] );
}
function getWeekdayAbbreviation( $key ) {
- return $this->getMessageFromDB( self::$mWeekdayAbbrevMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mWeekdayAbbrevMsgs[$key - 1] );
}
function getIranianCalendarMonthName( $key ) {
- return $this->getMessageFromDB( self::$mIranianCalendarMonthMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mIranianCalendarMonthMsgs[$key - 1] );
}
function getHebrewCalendarMonthName( $key ) {
- return $this->getMessageFromDB( self::$mHebrewCalendarMonthMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mHebrewCalendarMonthMsgs[$key - 1] );
}
function getHebrewCalendarMonthNameGen( $key ) {
- return $this->getMessageFromDB( self::$mHebrewCalendarMonthGenMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mHebrewCalendarMonthGenMsgs[$key - 1] );
}
function getHijriCalendarMonthName( $key ) {
- return $this->getMessageFromDB( self::$mHijriCalendarMonthMsgs[$key-1] );
+ return $this->getMessageFromDB( self::$mHijriCalendarMonthMsgs[$key - 1] );
}
/**
@@ -574,36 +587,42 @@ class Language {
$minDiff = 0;
if ( $data[0] == 'System' || $tz == '' ) {
- # Global offset in minutes.
- if( isset($wgLocalTZoffset) ) $minDiff = $wgLocalTZoffset;
+ #  Global offset in minutes.
+ if ( isset( $wgLocalTZoffset ) ) {
+ $minDiff = $wgLocalTZoffset;
+ }
} else if ( $data[0] == 'Offset' ) {
$minDiff = intval( $data[1] );
} else {
$data = explode( ':', $tz );
- if( count( $data ) == 2 ) {
+ if ( count( $data ) == 2 ) {
$data[0] = intval( $data[0] );
$data[1] = intval( $data[1] );
$minDiff = abs( $data[0] ) * 60 + $data[1];
- if ( $data[0] < 0 ) $minDiff = -$minDiff;
+ if ( $data[0] < 0 ) {
+ $minDiff = -$minDiff;
+ }
} else {
$minDiff = intval( $data[0] ) * 60;
}
}
# No difference ? Return time unchanged
- if ( 0 == $minDiff ) return $ts;
+ if ( 0 == $minDiff ) {
+ return $ts;
+ }
wfSuppressWarnings(); // E_STRICT system time bitching
# Generate an adjusted date; take advantage of the fact that mktime
# will normalize out-of-range values so we don't have to split $minDiff
# into hours and minutes.
$t = mktime( (
- (int)substr( $ts, 8, 2) ), # Hours
+ (int)substr( $ts, 8, 2 ) ), # Hours
(int)substr( $ts, 10, 2 ) + $minDiff, # Minutes
(int)substr( $ts, 12, 2 ), # Seconds
(int)substr( $ts, 4, 2 ), # Month
(int)substr( $ts, 6, 2 ), # Day
- (int)substr( $ts, 0, 4 ) ); #Year
+ (int)substr( $ts, 0, 4 ) ); # Year
$date = date( 'YmdHis', $t );
wfRestoreWarnings();
@@ -617,9 +636,8 @@ class Language {
* escaping format.
*
* Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrU. See the
- * PHP manual for definitions. "o" format character is supported since
- * PHP 5.1.0, previous versions return literal o.
- * There are a number of extensions, which start with "x":
+ * PHP manual for definitions. There are a number of extensions, which
+ * start with "x":
*
* xn Do not translate digits of the next numeric format character
* xN Toggle raw digit (xn) flag, stays set until explicitly unset
@@ -669,7 +687,6 @@ class Language {
* @param $ts String: 14-character timestamp
* YYYYMMDDHHMMSS
* 01234567890123
- * @todo emulation of "o" format character for PHP pre 5.1.0
* @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
*/
function sprintfDate( $format, $ts ) {
@@ -730,51 +747,73 @@ class Language {
$num = intval( substr( $ts, 6, 2 ) );
break;
case 'xij':
- if ( !$iranian ) $iranian = self::tsToIranian( $ts );
+ if ( !$iranian ) {
+ $iranian = self::tsToIranian( $ts );
+ }
$num = $iranian[2];
break;
case 'xmj':
- if ( !$hijri ) $hijri = self::tsToHijri( $ts );
+ if ( !$hijri ) {
+ $hijri = self::tsToHijri( $ts );
+ }
$num = $hijri[2];
break;
case 'xjj':
- if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+ if ( !$hebrew ) {
+ $hebrew = self::tsToHebrew( $ts );
+ }
$num = $hebrew[2];
break;
case 'l':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$s .= $this->getWeekdayName( gmdate( 'w', $unix ) + 1 );
break;
case 'N':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$w = gmdate( 'w', $unix );
$num = $w ? $w : 7;
break;
case 'w':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$num = gmdate( 'w', $unix );
break;
case 'z':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$num = gmdate( 'z', $unix );
break;
case 'W':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$num = gmdate( 'W', $unix );
break;
case 'F':
$s .= $this->getMonthName( substr( $ts, 4, 2 ) );
break;
case 'xiF':
- if ( !$iranian ) $iranian = self::tsToIranian( $ts );
+ if ( !$iranian ) {
+ $iranian = self::tsToIranian( $ts );
+ }
$s .= $this->getIranianCalendarMonthName( $iranian[1] );
break;
case 'xmF':
- if ( !$hijri ) $hijri = self::tsToHijri( $ts );
+ if ( !$hijri ) {
+ $hijri = self::tsToHijri( $ts );
+ }
$s .= $this->getHijriCalendarMonthName( $hijri[1] );
break;
case 'xjF':
- if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+ if ( !$hebrew ) {
+ $hebrew = self::tsToHebrew( $ts );
+ }
$s .= $this->getHebrewCalendarMonthName( $hebrew[1] );
break;
case 'm':
@@ -787,64 +826,84 @@ class Language {
$num = intval( substr( $ts, 4, 2 ) );
break;
case 'xin':
- if ( !$iranian ) $iranian = self::tsToIranian( $ts );
+ if ( !$iranian ) {
+ $iranian = self::tsToIranian( $ts );
+ }
$num = $iranian[1];
break;
case 'xmn':
- if ( !$hijri ) $hijri = self::tsToHijri ( $ts );
+ if ( !$hijri ) {
+ $hijri = self::tsToHijri ( $ts );
+ }
$num = $hijri[1];
break;
case 'xjn':
- if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+ if ( !$hebrew ) {
+ $hebrew = self::tsToHebrew( $ts );
+ }
$num = $hebrew[1];
break;
case 't':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$num = gmdate( 't', $unix );
break;
case 'xjt':
- if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+ if ( !$hebrew ) {
+ $hebrew = self::tsToHebrew( $ts );
+ }
$num = $hebrew[3];
break;
case 'L':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$num = gmdate( 'L', $unix );
break;
- # 'o' is supported since PHP 5.1.0
- # return literal if not supported
- # TODO: emulation for pre 5.1.0 versions
case 'o':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
- if ( version_compare(PHP_VERSION, '5.1.0') === 1 )
- $num = date( 'o', $unix );
- else
- $s .= 'o';
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
+ $num = date( 'o', $unix );
break;
case 'Y':
$num = substr( $ts, 0, 4 );
break;
case 'xiY':
- if ( !$iranian ) $iranian = self::tsToIranian( $ts );
+ if ( !$iranian ) {
+ $iranian = self::tsToIranian( $ts );
+ }
$num = $iranian[0];
break;
case 'xmY':
- if ( !$hijri ) $hijri = self::tsToHijri( $ts );
+ if ( !$hijri ) {
+ $hijri = self::tsToHijri( $ts );
+ }
$num = $hijri[0];
break;
case 'xjY':
- if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+ if ( !$hebrew ) {
+ $hebrew = self::tsToHebrew( $ts );
+ }
$num = $hebrew[0];
break;
case 'xkY':
- if ( !$thai ) $thai = self::tsToYear( $ts, 'thai' );
+ if ( !$thai ) {
+ $thai = self::tsToYear( $ts, 'thai' );
+ }
$num = $thai[0];
break;
case 'xoY':
- if ( !$minguo ) $minguo = self::tsToYear( $ts, 'minguo' );
+ if ( !$minguo ) {
+ $minguo = self::tsToYear( $ts, 'minguo' );
+ }
$num = $minguo[0];
break;
case 'xtY':
- if ( !$tenno ) $tenno = self::tsToYear( $ts, 'tenno' );
+ if ( !$tenno ) {
+ $tenno = self::tsToYear( $ts, 'tenno' );
+ }
$num = $tenno[0];
break;
case 'y':
@@ -877,15 +936,21 @@ class Language {
$num = substr( $ts, 12, 2 );
break;
case 'c':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$s .= gmdate( 'c', $unix );
break;
case 'r':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$s .= gmdate( 'r', $unix );
break;
case 'U':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
+ if ( !$unix ) {
+ $unix = wfTimestamp( TS_UNIX, $ts );
+ }
$num = $unix;
break;
case '\\':
@@ -922,13 +987,12 @@ class Language {
} elseif ( $roman ) {
$s .= self::romanNumeral( $num );
$roman = false;
- } elseif( $hebrewNum ) {
+ } elseif ( $hebrewNum ) {
$s .= self::hebrewNumeral( $num );
$hebrewNum = false;
} else {
$s .= $this->formatNum( $num, true );
}
- $num = false;
}
}
return $s;
@@ -950,19 +1014,19 @@ class Language {
$gd = substr( $ts, 6, 2 ) -1;
# Days passed from the beginning (including leap years)
- $gDayNo = 365*$gy
- + floor(($gy+3) / 4)
- - floor(($gy+99) / 100)
- + floor(($gy+399) / 400);
+ $gDayNo = 365 * $gy
+ + floor( ( $gy + 3 ) / 4 )
+ - floor( ( $gy + 99 ) / 100 )
+ + floor( ( $gy + 399 ) / 400 );
// Add days of the past months of this year
- for( $i = 0; $i < $gm; $i++ ) {
+ for ( $i = 0; $i < $gm; $i++ ) {
$gDayNo += self::$GREG_DAYS[$i];
}
// Leap years
- if ( $gm > 1 && (($gy%4===0 && $gy%100!==0 || ($gy%400==0)))) {
+ if ( $gm > 1 && ( ( $gy % 4 === 0 && $gy % 100 !== 0 || ( $gy % 400 == 0 ) ) ) ) {
$gDayNo++;
}
@@ -971,26 +1035,27 @@ class Language {
$jDayNo = $gDayNo - 79;
- $jNp = floor($jDayNo / 12053);
+ $jNp = floor( $jDayNo / 12053 );
$jDayNo %= 12053;
- $jy = 979 + 33*$jNp + 4*floor($jDayNo/1461);
+ $jy = 979 + 33 * $jNp + 4 * floor( $jDayNo / 1461 );
$jDayNo %= 1461;
if ( $jDayNo >= 366 ) {
- $jy += floor(($jDayNo-1)/365);
- $jDayNo = floor(($jDayNo-1)%365);
+ $jy += floor( ( $jDayNo - 1 ) / 365 );
+ $jDayNo = floor( ( $jDayNo - 1 ) % 365 );
}
for ( $i = 0; $i < 11 && $jDayNo >= self::$IRANIAN_DAYS[$i]; $i++ ) {
$jDayNo -= self::$IRANIAN_DAYS[$i];
}
- $jm= $i+1;
- $jd= $jDayNo+1;
+ $jm = $i + 1;
+ $jd = $jDayNo + 1;
- return array($jy, $jm, $jd);
+ return array( $jy, $jm, $jd );
}
+
/**
* Converting Gregorian dates to Hijri dates.
*
@@ -998,39 +1063,40 @@ class Language {
*
* @link http://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
*/
- private static function tsToHijri ( $ts ) {
+ private static function tsToHijri( $ts ) {
$year = substr( $ts, 0, 4 );
$month = substr( $ts, 4, 2 );
$day = substr( $ts, 6, 2 );
$zyr = $year;
- $zd=$day;
- $zm=$month;
- $zy=$zyr;
-
-
-
- if (($zy>1582)||(($zy==1582)&&($zm>10))||(($zy==1582)&&($zm==10)&&($zd>14)))
- {
-
-
- $zjd=(int)((1461*($zy + 4800 + (int)( ($zm-14) /12) ))/4) + (int)((367*($zm-2-12*((int)(($zm-14)/12))))/12)-(int)((3*(int)(( ($zy+4900+(int)(($zm-14)/12))/100)))/4)+$zd-32075;
- }
- else
- {
- $zjd = 367*$zy-(int)((7*($zy+5001+(int)(($zm-9)/7)))/4)+(int)((275*$zm)/9)+$zd+1729777;
- }
+ $zd = $day;
+ $zm = $month;
+ $zy = $zyr;
+
+ if (
+ ( $zy > 1582 ) || ( ( $zy == 1582 ) && ( $zm > 10 ) ) ||
+ ( ( $zy == 1582 ) && ( $zm == 10 ) && ( $zd > 14 ) )
+ )
+ {
+ $zjd = (int)( ( 1461 * ( $zy + 4800 + (int)( ( $zm - 14 ) / 12 ) ) ) / 4 ) +
+ (int)( ( 367 * ( $zm - 2 - 12 * ( (int)( ( $zm - 14 ) / 12 ) ) ) ) / 12 ) -
+ (int)( ( 3 * (int)( ( ( $zy + 4900 + (int)( ( $zm - 14 ) / 12 ) ) / 100 ) ) ) / 4 ) +
+ $zd - 32075;
+ } else {
+ $zjd = 367 * $zy - (int)( ( 7 * ( $zy + 5001 + (int)( ( $zm - 9 ) / 7 ) ) ) / 4 ) +
+ (int)( ( 275 * $zm ) / 9 ) + $zd + 1729777;
+ }
- $zl=$zjd-1948440+10632;
- $zn=(int)(($zl-1)/10631);
- $zl=$zl-10631*$zn+354;
- $zj=((int)((10985-$zl)/5316))*((int)((50*$zl)/17719))+((int)($zl/5670))*((int)((43*$zl)/15238));
- $zl=$zl-((int)((30-$zj)/15))*((int)((17719*$zj)/50))-((int)($zj/16))*((int)((15238*$zj)/43))+29;
- $zm=(int)((24*$zl)/709);
- $zd=$zl-(int)((709*$zm)/24);
- $zy=30*$zn+$zj-30;
+ $zl = $zjd -1948440 + 10632;
+ $zn = (int)( ( $zl - 1 ) / 10631 );
+ $zl = $zl - 10631 * $zn + 354;
+ $zj = ( (int)( ( 10985 - $zl ) / 5316 ) ) * ( (int)( ( 50 * $zl ) / 17719 ) ) + ( (int)( $zl / 5670 ) ) * ( (int)( ( 43 * $zl ) / 15238 ) );
+ $zl = $zl - ( (int)( ( 30 - $zj ) / 15 ) ) * ( (int)( ( 17719 * $zj ) / 50 ) ) - ( (int)( $zj / 16 ) ) * ( (int)( ( 15238 * $zj ) / 43 ) ) + 29;
+ $zm = (int)( ( 24 * $zl ) / 709 );
+ $zd = $zl - (int)( ( 709 * $zm ) / 24 );
+ $zy = 30 * $zn + $zj - 30;
- return array ($zy, $zm, $zd);
+ return array( $zy, $zm, $zd );
}
/**
@@ -1055,7 +1121,7 @@ class Language {
# Month number when September = 1, August = 12
$month += 4;
- if( $month > 12 ) {
+ if ( $month > 12 ) {
# Next year
$month -= 12;
$year++;
@@ -1064,15 +1130,15 @@ class Language {
# Calculate day of year from 1 September
$dayOfYear = $day;
- for( $i = 1; $i < $month; $i++ ) {
- if( $i == 6 ) {
+ for ( $i = 1; $i < $month; $i++ ) {
+ if ( $i == 6 ) {
# February
$dayOfYear += 28;
# Check if the year is leap
- if( $year % 400 == 0 || ( $year % 4 == 0 && $year % 100 > 0 ) ) {
+ if ( $year % 400 == 0 || ( $year % 4 == 0 && $year % 100 > 0 ) ) {
$dayOfYear++;
}
- } elseif( $i == 8 || $i == 10 || $i == 1 || $i == 3 ) {
+ } elseif ( $i == 8 || $i == 10 || $i == 1 || $i == 3 ) {
$dayOfYear += 30;
} else {
$dayOfYear += 31;
@@ -1083,7 +1149,7 @@ class Language {
$start = self::hebrewYearStart( $hebrewYear );
# Calculate next year's start
- if( $dayOfYear <= $start ) {
+ if ( $dayOfYear <= $start ) {
# Day is before the start of the year - it is the previous year
# Next year's start
$nextStart = $start;
@@ -1092,7 +1158,7 @@ class Language {
$hebrewYear--;
# Add days since previous year's 1 September
$dayOfYear += 365;
- if( ( $year % 400 == 0 ) || ( $year % 100 != 0 && $year % 4 == 0 ) ) {
+ if ( ( $year % 400 == 0 ) || ( $year % 100 != 0 && $year % 4 == 0 ) ) {
# Leap year
$dayOfYear++;
}
@@ -1111,7 +1177,7 @@ class Language {
# Add 12 (or 13 for leap years) days to ignore the difference between
# Hebrew and Gregorian year (353 at least vs. 365/6) - now the
# difference is only about the year type
- if( ( $year % 400 == 0 ) || ( $year % 100 != 0 && $year % 4 == 0 ) ) {
+ if ( ( $year % 400 == 0 ) || ( $year % 100 != 0 && $year % 4 == 0 ) ) {
$diff += 13;
} else {
$diff += 12;
@@ -1131,14 +1197,14 @@ class Language {
$hebrewDay = $hebrewDayOfYear;
$hebrewMonth = 1;
$days = 0;
- while( $hebrewMonth <= 12 ) {
+ while ( $hebrewMonth <= 12 ) {
# Calculate days in this month
- if( $isLeap && $hebrewMonth == 6 ) {
+ if ( $isLeap && $hebrewMonth == 6 ) {
# Adar in a leap year
- if( $isLeap ) {
+ if ( $isLeap ) {
# Leap year - has Adar I, with 30 days, and Adar II, with 29 days
$days = 30;
- if( $hebrewDay <= $days ) {
+ if ( $hebrewDay <= $days ) {
# Day in Adar I
$hebrewMonth = 13;
} else {
@@ -1146,23 +1212,23 @@ class Language {
$hebrewDay -= $days;
# Try Adar II
$days = 29;
- if( $hebrewDay <= $days ) {
+ if ( $hebrewDay <= $days ) {
# Day in Adar II
$hebrewMonth = 14;
}
}
}
- } elseif( $hebrewMonth == 2 && $yearPattern == 2 ) {
+ } elseif ( $hebrewMonth == 2 && $yearPattern == 2 ) {
# Cheshvan in a complete year (otherwise as the rule below)
$days = 30;
- } elseif( $hebrewMonth == 3 && $yearPattern == 0 ) {
+ } elseif ( $hebrewMonth == 3 && $yearPattern == 0 ) {
# Kislev in an incomplete year (otherwise as the rule below)
$days = 29;
} else {
# Odd months have 30 days, even have 29
$days = 30 - ( $hebrewMonth - 1 ) % 2;
}
- if( $hebrewDay <= $days ) {
+ if ( $hebrewDay <= $days ) {
# In the current month
break;
} else {
@@ -1185,21 +1251,21 @@ class Language {
$a = intval( ( 12 * ( $year - 1 ) + 17 ) % 19 );
$b = intval( ( $year - 1 ) % 4 );
$m = 32.044093161144 + 1.5542417966212 * $a + $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
- if( $m < 0 ) {
+ if ( $m < 0 ) {
$m--;
}
$Mar = intval( $m );
- if( $m < 0 ) {
+ if ( $m < 0 ) {
$m++;
}
$m -= $Mar;
- $c = intval( ( $Mar + 3 * ( $year - 1 ) + 5 * $b + 5 ) % 7);
- if( $c == 0 && $a > 11 && $m >= 0.89772376543210 ) {
+ $c = intval( ( $Mar + 3 * ( $year - 1 ) + 5 * $b + 5 ) % 7 );
+ if ( $c == 0 && $a > 11 && $m >= 0.89772376543210 ) {
$Mar++;
- } else if( $c == 1 && $a > 6 && $m >= 0.63287037037037 ) {
+ } else if ( $c == 1 && $a > 6 && $m >= 0.63287037037037 ) {
$Mar += 2;
- } else if( $c == 2 || $c == 4 || $c == 6 ) {
+ } else if ( $c == 2 || $c == 4 || $c == 6 ) {
$Mar++;
}
@@ -1215,57 +1281,74 @@ class Language {
* http://en.wikipedia.org/wiki/Minguo_calendar
* http://en.wikipedia.org/wiki/Japanese_era_name
*
- * @param $ts String: 14-character timestamp, calender name
- * @return array converted year, month, day
+ * @param $ts String: 14-character timestamp
+ * @param $cName String: calender name
+ * @return Array: converted year, month, day
*/
private static function tsToYear( $ts, $cName ) {
$gy = substr( $ts, 0, 4 );
$gm = substr( $ts, 4, 2 );
$gd = substr( $ts, 6, 2 );
- if (!strcmp($cName,'thai')) {
+ if ( !strcmp( $cName, 'thai' ) ) {
# Thai solar dates
# Add 543 years to the Gregorian calendar
# Months and days are identical
$gy_offset = $gy + 543;
- } else if ((!strcmp($cName,'minguo')) || !strcmp($cName,'juche')) {
+ } else if ( ( !strcmp( $cName, 'minguo' ) ) || !strcmp( $cName, 'juche' ) ) {
# Minguo dates
# Deduct 1911 years from the Gregorian calendar
# Months and days are identical
$gy_offset = $gy - 1911;
- } else if (!strcmp($cName,'tenno')) {
+ } else if ( !strcmp( $cName, 'tenno' ) ) {
# NengÅ dates up to Meiji period
# Deduct years from the Gregorian calendar
# depending on the nengo periods
# Months and days are identical
- if (($gy < 1912) || (($gy == 1912) && ($gm < 7)) || (($gy == 1912) && ($gm == 7) && ($gd < 31))) {
+ if ( ( $gy < 1912 ) || ( ( $gy == 1912 ) && ( $gm < 7 ) ) || ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd < 31 ) ) ) {
# Meiji period
$gy_gannen = $gy - 1868 + 1;
$gy_offset = $gy_gannen;
- if ($gy_gannen == 1)
+ if ( $gy_gannen == 1 ) {
$gy_offset = 'å…ƒ';
- $gy_offset = '明治'.$gy_offset;
- } else if ((($gy == 1912) && ($gm == 7) && ($gd == 31)) || (($gy == 1912) && ($gm >= 8)) || (($gy > 1912) && ($gy < 1926)) || (($gy == 1926) && ($gm < 12)) || (($gy == 1926) && ($gm == 12) && ($gd < 26))) {
+ }
+ $gy_offset = '明治' . $gy_offset;
+ } else if (
+ ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd == 31 ) ) ||
+ ( ( $gy == 1912 ) && ( $gm >= 8 ) ) ||
+ ( ( $gy > 1912 ) && ( $gy < 1926 ) ) ||
+ ( ( $gy == 1926 ) && ( $gm < 12 ) ) ||
+ ( ( $gy == 1926 ) && ( $gm == 12 ) && ( $gd < 26 ) )
+ )
+ {
# TaishÅ period
$gy_gannen = $gy - 1912 + 1;
$gy_offset = $gy_gannen;
- if ($gy_gannen == 1)
+ if ( $gy_gannen == 1 ) {
$gy_offset = 'å…ƒ';
- $gy_offset = '大正'.$gy_offset;
- } else if ((($gy == 1926) && ($gm == 12) && ($gd >= 26)) || (($gy > 1926) && ($gy < 1989)) || (($gy == 1989) && ($gm == 1) && ($gd < 8))) {
+ }
+ $gy_offset = '大正' . $gy_offset;
+ } else if (
+ ( ( $gy == 1926 ) && ( $gm == 12 ) && ( $gd >= 26 ) ) ||
+ ( ( $gy > 1926 ) && ( $gy < 1989 ) ) ||
+ ( ( $gy == 1989 ) && ( $gm == 1 ) && ( $gd < 8 ) )
+ )
+ {
# ShÅwa period
$gy_gannen = $gy - 1926 + 1;
$gy_offset = $gy_gannen;
- if ($gy_gannen == 1)
+ if ( $gy_gannen == 1 ) {
$gy_offset = 'å…ƒ';
- $gy_offset = '昭和'.$gy_offset;
+ }
+ $gy_offset = '昭和' . $gy_offset;
} else {
# Heisei period
$gy_gannen = $gy - 1989 + 1;
$gy_offset = $gy_gannen;
- if ($gy_gannen == 1)
+ if ( $gy_gannen == 1 ) {
$gy_offset = 'å…ƒ';
- $gy_offset = 'å¹³æˆ'.$gy_offset;
+ }
+ $gy_offset = 'å¹³æˆ' . $gy_offset;
}
} else {
$gy_offset = $gy;
@@ -1293,7 +1376,7 @@ class Language {
$s = '';
for ( $pow10 = 1000, $i = 3; $i >= 0; $pow10 /= 10, $i-- ) {
if ( $num >= $pow10 ) {
- $s .= $table[$i][floor($num / $pow10)];
+ $s .= $table[$i][floor( $num / $pow10 )];
}
$num = $num % $pow10;
}
@@ -1324,14 +1407,14 @@ class Language {
$num = 0;
} else {
$s .= $table[$i][intval( ( $num / $pow10 ) )];
- if( $pow10 == 1000 ) {
+ if ( $pow10 == 1000 ) {
$s .= "'";
}
}
}
$num = $num % $pow10;
}
- if( strlen( $s ) == 2 ) {
+ if ( strlen( $s ) == 2 ) {
$str = $s . "'";
} else {
$str = substr( $s, 0, strlen( $s ) - 2 ) . '"';
@@ -1379,19 +1462,18 @@ class Language {
function dateFormat( $usePrefs = true ) {
global $wgUser;
- if( is_bool( $usePrefs ) ) {
- if( $usePrefs ) {
+ if ( is_bool( $usePrefs ) ) {
+ if ( $usePrefs ) {
$datePreference = $wgUser->getDatePreference();
} else {
- $options = User::getDefaultOptions();
- $datePreference = (string)$options['date'];
+ $datePreference = (string)User::getDefaultOption( 'date' );
}
} else {
$datePreference = (string)$usePrefs;
}
// return int
- if( $datePreference == '' ) {
+ if ( $datePreference == '' ) {
return 'default';
}
@@ -1431,6 +1513,7 @@ class Language {
* @return string
*/
function date( $ts, $adj = false, $format = true, $timecorrection = false ) {
+ $ts = wfTimestamp( TS_MW, $ts );
if ( $adj ) {
$ts = $this->userAdjust( $ts, $timecorrection );
}
@@ -1449,6 +1532,7 @@ class Language {
* @return string
*/
function time( $ts, $adj = false, $format = true, $timecorrection = false ) {
+ $ts = wfTimestamp( TS_MW, $ts );
if ( $adj ) {
$ts = $this->userAdjust( $ts, $timecorrection );
}
@@ -1467,7 +1551,7 @@ class Language {
* validateTimeZone() in Special:Preferences
* @return string
*/
- function timeanddate( $ts, $adj = false, $format = true, $timecorrection = false) {
+ function timeanddate( $ts, $adj = false, $format = true, $timecorrection = false ) {
$ts = wfTimestamp( TS_MW, $ts );
if ( $adj ) {
$ts = $this->userAdjust( $ts, $timecorrection );
@@ -1477,11 +1561,21 @@ class Language {
}
function getMessage( $key ) {
- return self::$dataCache->getSubitem( $this->mCode, 'messages', $key );
+ // Don't change getPreferredVariant() to getCode() / mCode, because:
+
+ // 1. Some language like Chinese has multiple variant languages. Only
+ // getPreferredVariant() (in LanguageConverter) could return a
+ // sub-language which would be more suitable for the user.
+ // 2. To languages without multiple variants, getPreferredVariant()
+ // (in FakeConverter) functions exactly same as getCode() / mCode,
+ // it won't break anything.
+
+ // The same below.
+ return self::$dataCache->getSubitem( $this->getPreferredVariant(), 'messages', $key );
}
function getAllMessages() {
- return self::$dataCache->getItem( $this->mCode, 'messages' );
+ return self::$dataCache->getItem( $this->getPreferredVariant(), 'messages' );
}
function iconv( $in, $out, $string ) {
@@ -1499,63 +1593,68 @@ class Language {
}
// callback functions for uc(), lc(), ucwords(), ucwordbreaks()
- function ucwordbreaksCallbackAscii($matches){
- return $this->ucfirst($matches[1]);
+ function ucwordbreaksCallbackAscii( $matches ) {
+ return $this->ucfirst( $matches[1] );
}
- function ucwordbreaksCallbackMB($matches){
- return mb_strtoupper($matches[0]);
+ function ucwordbreaksCallbackMB( $matches ) {
+ return mb_strtoupper( $matches[0] );
}
- function ucCallback($matches){
+ function ucCallback( $matches ) {
list( $wikiUpperChars ) = self::getCaseMaps();
return strtr( $matches[1], $wikiUpperChars );
}
- function lcCallback($matches){
+ function lcCallback( $matches ) {
list( , $wikiLowerChars ) = self::getCaseMaps();
return strtr( $matches[1], $wikiLowerChars );
}
- function ucwordsCallbackMB($matches){
- return mb_strtoupper($matches[0]);
+ function ucwordsCallbackMB( $matches ) {
+ return mb_strtoupper( $matches[0] );
}
- function ucwordsCallbackWiki($matches){
+ function ucwordsCallbackWiki( $matches ) {
list( $wikiUpperChars ) = self::getCaseMaps();
return strtr( $matches[0], $wikiUpperChars );
}
+ /**
+ * Make a string's first character uppercase
+ */
function ucfirst( $str ) {
$o = ord( $str );
- if ( $o < 96 ) {
+ if ( $o < 96 ) { // if already uppercase...
return $str;
} elseif ( $o < 128 ) {
- return ucfirst($str);
+ return ucfirst( $str ); // use PHP's ucfirst()
} else {
// fall back to more complex logic in case of multibyte strings
- return self::uc($str,true);
+ return $this->uc( $str, true );
}
}
+ /**
+ * Convert a string to uppercase
+ */
function uc( $str, $first = false ) {
if ( function_exists( 'mb_strtoupper' ) ) {
if ( $first ) {
- if ( self::isMultibyte( $str ) ) {
+ if ( $this->isMultibyte( $str ) ) {
return mb_strtoupper( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
} else {
return ucfirst( $str );
}
} else {
- return self::isMultibyte( $str ) ? mb_strtoupper( $str ) : strtoupper( $str );
+ return $this->isMultibyte( $str ) ? mb_strtoupper( $str ) : strtoupper( $str );
}
} else {
- if ( self::isMultibyte( $str ) ) {
- list( $wikiUpperChars ) = $this->getCaseMaps();
+ if ( $this->isMultibyte( $str ) ) {
$x = $first ? '^' : '';
return preg_replace_callback(
"/$x([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/",
- array($this,"ucCallback"),
+ array( $this, 'ucCallback' ),
$str
);
} else {
@@ -1569,7 +1668,7 @@ class Language {
if ( !$o ) {
return strval( $str );
} elseif ( $o >= 128 ) {
- return self::lc( $str, true );
+ return $this->lc( $str, true );
} elseif ( $o > 96 ) {
return $str;
} else {
@@ -1579,85 +1678,91 @@ class Language {
}
function lc( $str, $first = false ) {
- if ( function_exists( 'mb_strtolower' ) )
- if ( $first )
- if ( self::isMultibyte( $str ) )
+ if ( function_exists( 'mb_strtolower' ) ) {
+ if ( $first ) {
+ if ( $this->isMultibyte( $str ) ) {
return mb_strtolower( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
- else
+ } else {
return strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 );
- else
- return self::isMultibyte( $str ) ? mb_strtolower( $str ) : strtolower( $str );
- else
- if ( self::isMultibyte( $str ) ) {
- list( , $wikiLowerChars ) = self::getCaseMaps();
+ }
+ } else {
+ return $this->isMultibyte( $str ) ? mb_strtolower( $str ) : strtolower( $str );
+ }
+ } else {
+ if ( $this->isMultibyte( $str ) ) {
$x = $first ? '^' : '';
return preg_replace_callback(
"/$x([A-Z]|[\\xc0-\\xff][\\x80-\\xbf]*)/",
- array($this,"lcCallback"),
+ array( $this, 'lcCallback' ),
$str
);
- } else
+ } else {
return $first ? strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 ) : strtolower( $str );
+ }
+ }
}
function isMultibyte( $str ) {
return (bool)preg_match( '/[\x80-\xff]/', $str );
}
- function ucwords($str) {
- if ( self::isMultibyte( $str ) ) {
- $str = self::lc($str);
+ function ucwords( $str ) {
+ if ( $this->isMultibyte( $str ) ) {
+ $str = $this->lc( $str );
// regexp to find first letter in each word (i.e. after each space)
$replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)| ([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
// function to use to capitalize a single char
- if ( function_exists( 'mb_strtoupper' ) )
+ if ( function_exists( 'mb_strtoupper' ) ) {
return preg_replace_callback(
$replaceRegexp,
- array($this,"ucwordsCallbackMB"),
+ array( $this, 'ucwordsCallbackMB' ),
$str
);
- else
+ } else {
return preg_replace_callback(
$replaceRegexp,
- array($this,"ucwordsCallbackWiki"),
+ array( $this, 'ucwordsCallbackWiki' ),
$str
);
- }
- else
+ }
+ } else {
return ucwords( strtolower( $str ) );
+ }
}
- # capitalize words at word breaks
- function ucwordbreaks($str){
- if (self::isMultibyte( $str ) ) {
- $str = self::lc($str);
+ # capitalize words at word breaks
+ function ucwordbreaks( $str ) {
+ if ( $this->isMultibyte( $str ) ) {
+ $str = $this->lc( $str );
// since \b doesn't work for UTF-8, we explicitely define word break chars
- $breaks= "[ \-\(\)\}\{\.,\?!]";
+ $breaks = "[ \-\(\)\}\{\.,\?!]";
// find first letter after word break
$replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
- if ( function_exists( 'mb_strtoupper' ) )
+ if ( function_exists( 'mb_strtoupper' ) ) {
return preg_replace_callback(
$replaceRegexp,
- array($this,"ucwordbreaksCallbackMB"),
+ array( $this, 'ucwordbreaksCallbackMB' ),
$str
);
- else
+ } else {
return preg_replace_callback(
$replaceRegexp,
- array($this,"ucwordsCallbackWiki"),
+ array( $this, 'ucwordsCallbackWiki' ),
$str
);
- }
- else
+ }
+ } else {
return preg_replace_callback(
- '/\b([\w\x80-\xff]+)\b/',
- array($this,"ucwordbreaksCallbackAscii"),
- $str );
+ '/\b([\w\x80-\xff]+)\b/',
+ array( $this, 'ucwordbreaksCallbackAscii' ),
+ $str
+ );
+ }
}
/**
@@ -1676,18 +1781,22 @@ class Language {
}
function checkTitleEncoding( $s ) {
- if( is_array( $s ) ) {
+ if ( is_array( $s ) ) {
wfDebugDieBacktrace( 'Given array to checkTitleEncoding.' );
}
# Check for non-UTF-8 URLs
- $ishigh = preg_match( '/[\x80-\xff]/', $s);
- if(!$ishigh) return $s;
+ $ishigh = preg_match( '/[\x80-\xff]/', $s );
+ if ( !$ishigh ) {
+ return $s;
+ }
$isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
'[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
- if( $isutf8 ) return $s;
+ if ( $isutf8 ) {
+ return $s;
+ }
- return $this->iconv( $this->fallback8bitEncoding(), "utf-8", $s );
+ return $this->iconv( $this->fallback8bitEncoding(), 'utf-8', $s );
}
function fallback8bitEncoding() {
@@ -1703,15 +1812,15 @@ class Language {
function hasWordBreaks() {
return true;
}
-
+
/**
* Some languages such as Chinese require word segmentation,
* Specify such segmentation when overridden in derived class.
- *
+ *
* @param $string String
* @return String
*/
- function wordSegmentation( $string ) {
+ function segmentByWord( $string ) {
return $string;
}
@@ -1723,7 +1832,7 @@ class Language {
* @return String
*/
function normalizeForSearch( $string ) {
- return $string;
+ return self::convertDoubleWidth( $string );
}
/**
@@ -1731,8 +1840,17 @@ class Language {
* range: ff00-ff5f ~= 0020-007f
*/
protected static function convertDoubleWidth( $string ) {
- $string = preg_replace( '/\xef\xbc([\x80-\xbf])/e', 'chr((ord("$1") & 0x3f) + 0x20)', $string );
- $string = preg_replace( '/\xef\xbd([\x80-\x99])/e', 'chr((ord("$1") & 0x3f) + 0x60)', $string );
+ static $full = null;
+ static $half = null;
+
+ if ( $full === null ) {
+ $fullWidth = "ï¼ï¼‘23456789ABCDEFGHIJKLMNOPQRSTUVWXYZï½ï½‚cdefghijklï½ï½Žï½ï½ï½‘rstuvwxyz";
+ $halfWidth = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ $full = str_split( $fullWidth, 3 );
+ $half = str_split( $halfWidth );
+ }
+
+ $string = str_replace( $full, $half, $string );
return $string;
}
@@ -1756,8 +1874,12 @@ class Language {
*/
function firstChar( $s ) {
$matches = array();
- preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
- '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})/', $s, $matches);
+ preg_match(
+ '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
+ '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})/',
+ $s,
+ $matches
+ );
if ( isset( $matches[1] ) ) {
if ( strlen( $matches[1] ) != 3 ) {
@@ -1766,7 +1888,7 @@ class Language {
// Break down Hangul syllables to grab the first jamo
$code = utf8ToCodepoint( $matches[1] );
- if ( $code < 0xac00 || 0xd7a4 <= $code) {
+ if ( $code < 0xac00 || 0xd7a4 <= $code ) {
return $matches[1];
} elseif ( $code < 0xb098 ) {
return "\xe3\x84\xb1";
@@ -1798,7 +1920,7 @@ class Language {
return "\xe3\x85\x8e";
}
} else {
- return "";
+ return '';
}
}
@@ -1817,8 +1939,7 @@ class Language {
# wgInputEncoding, this text will be further converted
# to wgOutputEncoding.
global $wgEditEncoding;
- if( $wgEditEncoding == '' or
- $wgEditEncoding == 'UTF-8' ) {
+ if ( $wgEditEncoding == '' || $wgEditEncoding == 'UTF-8' ) {
return $s;
} else {
return $this->iconv( 'UTF-8', $wgEditEncoding, $s );
@@ -1828,12 +1949,12 @@ class Language {
function recodeInput( $s ) {
# Take the previous into account.
global $wgEditEncoding;
- if($wgEditEncoding != "") {
+ if ( $wgEditEncoding != '' ) {
$enc = $wgEditEncoding;
} else {
$enc = 'UTF-8';
}
- if( $enc == 'UTF-8' ) {
+ if ( $enc == 'UTF-8' ) {
return $s;
} else {
return $this->iconv( $enc, 'UTF-8', $s );
@@ -1848,7 +1969,14 @@ class Language {
* This is language-specific for performance reasons only.
*/
function normalize( $s ) {
- return UtfNormal::cleanUp( $s );
+ global $wgAllUnicodeFixes;
+ $s = UtfNormal::cleanUp( $s );
+ if ( $wgAllUnicodeFixes ) {
+ $s = $this->transformUsingPairFile( 'normalize-ar.ser', $s );
+ $s = $this->transformUsingPairFile( 'normalize-ml.ser', $s );
+ }
+
+ return $s;
}
/**
@@ -1863,7 +1991,7 @@ class Language {
if ( !isset( $this->transformData[$file] ) ) {
$data = wfGetPrecompiledData( $file );
if ( $data === false ) {
- throw new MWException( __METHOD__.": The transformation file $file is missing" );
+ throw new MWException( __METHOD__ . ": The transformation file $file is missing" );
}
$this->transformData[$file] = new ReplacementArray( $data );
}
@@ -1965,7 +2093,7 @@ class Language {
}
}
- if( !is_array( $rawEntry ) ) {
+ if ( !is_array( $rawEntry ) ) {
error_log( "\"$rawEntry\" is not a valid magic thingie for \"$mw->mId\"" );
} else {
$mw->mCaseSensitive = $rawEntry[0];
@@ -2047,15 +2175,19 @@ class Language {
*/
function formatNum( $number, $nocommafy = false ) {
global $wgTranslateNumerals;
- if (!$nocommafy) {
- $number = $this->commafy($number);
+ if ( !$nocommafy ) {
+ $number = $this->commafy( $number );
$s = $this->separatorTransformTable();
- if ($s) { $number = strtr($number, $s); }
+ if ( $s ) {
+ $number = strtr( $number, $s );
+ }
}
- if ($wgTranslateNumerals) {
+ if ( $wgTranslateNumerals ) {
$s = $this->digitTransformTable();
- if ($s) { $number = strtr($number, $s); }
+ if ( $s ) {
+ $number = strtr( $number, $s );
+ }
}
return $number;
@@ -2063,12 +2195,16 @@ class Language {
function parseFormattedNumber( $number ) {
$s = $this->digitTransformTable();
- if ($s) { $number = strtr($number, array_flip($s)); }
+ if ( $s ) {
+ $number = strtr( $number, array_flip( $s ) );
+ }
$s = $this->separatorTransformTable();
- if ($s) { $number = strtr($number, array_flip($s)); }
+ if ( $s ) {
+ $number = strtr( $number, array_flip( $s ) );
+ }
- $number = strtr( $number, array (',' => '') );
+ $number = strtr( $number, array( ',' => '' ) );
return $number;
}
@@ -2078,8 +2214,8 @@ class Language {
* @param $_ mixed
* @return string
*/
- function commafy($_) {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ function commafy( $_ ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
}
function digitTransformTable() {
@@ -2090,7 +2226,6 @@ class Language {
return self::$dataCache->getItem( $this->mCode, 'separatorTransformTable' );
}
-
/**
* Take a list of strings and build a locale-friendly comma-separated
* list, using the local comma-separator message.
@@ -2102,14 +2237,13 @@ class Language {
function listToText( $l ) {
$s = '';
$m = count( $l ) - 1;
- if( $m == 1 ) {
+ if ( $m == 1 ) {
return $l[0] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $l[1];
- }
- else {
+ } else {
for ( $i = $m; $i >= 0; $i-- ) {
if ( $i == $m ) {
$s = $l[$i];
- } else if( $i == $m - 1 ) {
+ } else if ( $i == $m - 1 ) {
$s = $l[$i] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $s;
} else {
$s = $l[$i] . $this->getMessageFromDB( 'comma-separator' ) . $s;
@@ -2128,7 +2262,11 @@ class Language {
function commaList( $list ) {
return implode(
$list,
- wfMsgExt( 'comma-separator', array( 'parsemag', 'escapenoentities', 'language' => $this ) ) );
+ wfMsgExt(
+ 'comma-separator',
+ array( 'parsemag', 'escapenoentities', 'language' => $this )
+ )
+ );
}
/**
@@ -2140,7 +2278,11 @@ class Language {
function semicolonList( $list ) {
return implode(
$list,
- wfMsgExt( 'semicolon-separator', array( 'parsemag', 'escapenoentities', 'language' => $this ) ) );
+ wfMsgExt(
+ 'semicolon-separator',
+ array( 'parsemag', 'escapenoentities', 'language' => $this )
+ )
+ );
}
/**
@@ -2151,7 +2293,11 @@ class Language {
function pipeList( $list ) {
return implode(
$list,
- wfMsgExt( 'pipe-separator', array( 'escapenoentities', 'language' => $this ) ) );
+ wfMsgExt(
+ 'pipe-separator',
+ array( 'escapenoentities', 'language' => $this )
+ )
+ );
}
/**
@@ -2171,42 +2317,26 @@ class Language {
*/
function truncate( $string, $length, $ellipsis = '...' ) {
# Use the localized ellipsis character
- if( $ellipsis == '...' ) {
+ if ( $ellipsis == '...' ) {
$ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
}
-
- if( $length == 0 ) {
+ # Check if there is no need to truncate
+ if ( $length == 0 ) {
return $ellipsis;
- }
- if ( strlen( $string ) <= abs( $length ) ) {
+ } elseif ( strlen( $string ) <= abs( $length ) ) {
return $string;
}
$stringOriginal = $string;
- if( $length > 0 ) {
- $string = substr( $string, 0, $length );
- $char = ord( $string[strlen( $string ) - 1] );
- $m = array();
- if ($char >= 0xc0) {
- # We got the first byte only of a multibyte char; remove it.
- $string = substr( $string, 0, -1 );
- } elseif( $char >= 0x80 &&
- preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
- '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m ) ) {
- # We chopped in the middle of a character; remove it
- $string = $m[1];
- }
+ if ( $length > 0 ) {
+ $string = substr( $string, 0, $length ); // xyz...
+ $string = $this->removeBadCharLast( $string );
$string = $string . $ellipsis;
-
} else {
- $string = substr( $string, $length );
- $char = ord( $string[0] );
- if( $char >= 0x80 && $char < 0xc0 ) {
- # We chopped in the middle of a character; remove the whole thing
- $string = preg_replace( '/^[\x80-\xbf]+/', '', $string );
- }
+ $string = substr( $string, $length ); // ...xyz
+ $string = $this->removeBadCharFirst( $string );
$string = $ellipsis . $string;
}
- # Do not truncate if the ellipsis actually make the string longer. Bug 22181
+ # Do not truncate if the ellipsis makes the string longer/equal (bug 22181)
if ( strlen( $string ) < strlen( $stringOriginal ) ) {
return $string;
} else {
@@ -2215,6 +2345,188 @@ class Language {
}
/**
+ * Remove bytes that represent an incomplete Unicode character
+ * at the end of string (e.g. bytes of the char are missing)
+ *
+ * @param $string String
+ * @return string
+ */
+ protected function removeBadCharLast( $string ) {
+ $char = ord( $string[strlen( $string ) - 1] );
+ $m = array();
+ if ( $char >= 0xc0 ) {
+ # We got the first byte only of a multibyte char; remove it.
+ $string = substr( $string, 0, -1 );
+ } elseif ( $char >= 0x80 &&
+ preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
+ '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m ) )
+ {
+ # We chopped in the middle of a character; remove it
+ $string = $m[1];
+ }
+ return $string;
+ }
+
+ /**
+ * Remove bytes that represent an incomplete Unicode character
+ * at the start of string (e.g. bytes of the char are missing)
+ *
+ * @param $string String
+ * @return string
+ */
+ protected function removeBadCharFirst( $string ) {
+ $char = ord( $string[0] );
+ if ( $char >= 0x80 && $char < 0xc0 ) {
+ # We chopped in the middle of a character; remove the whole thing
+ $string = preg_replace( '/^[\x80-\xbf]+/', '', $string );
+ }
+ return $string;
+ }
+
+ /*
+ * Truncate a string of valid HTML to a specified length in bytes,
+ * appending an optional string (e.g. for ellipses), and return valid HTML
+ *
+ * This is only intended for styled/linked text, such as HTML with
+ * tags like <span> and <a>, were the tags are self-contained (valid HTML)
+ *
+ * Note: tries to fix broken HTML with MWTidy
+ *
+ * @param string $text HTML string to truncate
+ * @param int $length (zero/positive) Maximum length (excluding ellipses)
+ * @param string $ellipsis String to append to the truncated text
+ * @returns string
+ */
+ function truncateHtml( $text, $length, $ellipsis = '...' ) {
+ # Use the localized ellipsis character
+ if ( $ellipsis == '...' ) {
+ $ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
+ }
+ # Check if there is no need to truncate
+ if ( $length <= 0 ) {
+ return $ellipsis; // no text shown, nothing to format
+ } elseif ( strlen( $text ) <= $length ) {
+ return $text; // string short enough even *with* HTML
+ }
+ $text = MWTidy::tidy( $text ); // fix tags
+ $displayLen = 0; // innerHTML legth so far
+ $testingEllipsis = false; // checking if ellipses will make string longer/equal?
+ $tagType = 0; // 0-open, 1-close
+ $bracketState = 0; // 1-tag start, 2-tag name, 0-neither
+ $entityState = 0; // 0-not entity, 1-entity
+ $tag = $ret = '';
+ $openTags = array(); // open tag stack
+ $textLen = strlen( $text );
+ for ( $pos = 0; $pos < $textLen; ++$pos ) {
+ $ch = $text[$pos];
+ $lastCh = $pos ? $text[$pos - 1] : '';
+ $ret .= $ch; // add to result string
+ if ( $ch == '<' ) {
+ $this->truncate_endBracket( $tag, $tagType, $lastCh, $openTags ); // for bad HTML
+ $entityState = 0; // for bad HTML
+ $bracketState = 1; // tag started (checking for backslash)
+ } elseif ( $ch == '>' ) {
+ $this->truncate_endBracket( $tag, $tagType, $lastCh, $openTags );
+ $entityState = 0; // for bad HTML
+ $bracketState = 0; // out of brackets
+ } elseif ( $bracketState == 1 ) {
+ if ( $ch == '/' ) {
+ $tagType = 1; // close tag (e.g. "</span>")
+ } else {
+ $tagType = 0; // open tag (e.g. "<span>")
+ $tag .= $ch;
+ }
+ $bracketState = 2; // building tag name
+ } elseif ( $bracketState == 2 ) {
+ if ( $ch != ' ' ) {
+ $tag .= $ch;
+ } else {
+ // Name found (e.g. "<a href=..."), add on tag attributes...
+ $pos += $this->truncate_skip( $ret, $text, "<>", $pos + 1 );
+ }
+ } elseif ( $bracketState == 0 ) {
+ if ( $entityState ) {
+ if ( $ch == ';' ) {
+ $entityState = 0;
+ $displayLen++; // entity is one displayed char
+ }
+ } else {
+ if ( $ch == '&' ) {
+ $entityState = 1; // entity found, (e.g. "&#160;")
+ } else {
+ $displayLen++; // this char is displayed
+ // Add on the other display text after this...
+ $skipped = $this->truncate_skip(
+ $ret, $text, "<>&", $pos + 1, $length - $displayLen );
+ $displayLen += $skipped;
+ $pos += $skipped;
+ }
+ }
+ }
+ # Consider truncation once the display length has reached the maximim.
+ # Double-check that we're not in the middle of a bracket/entity...
+ if ( $displayLen >= $length && $bracketState == 0 && $entityState == 0 ) {
+ if ( !$testingEllipsis ) {
+ $testingEllipsis = true;
+ # Save where we are; we will truncate here unless
+ # the ellipsis actually makes the string longer.
+ $pOpenTags = $openTags; // save state
+ $pRet = $ret; // save state
+ } elseif ( $displayLen > ( $length + strlen( $ellipsis ) ) ) {
+ # Ellipsis won't make string longer/equal, the truncation point was OK.
+ $openTags = $pOpenTags; // reload state
+ $ret = $this->removeBadCharLast( $pRet ); // reload state, multi-byte char fix
+ $ret .= $ellipsis; // add ellipsis
+ break;
+ }
+ }
+ }
+ if ( $displayLen == 0 ) {
+ return ''; // no text shown, nothing to format
+ }
+ // Close the last tag if left unclosed by bad HTML
+ $this->truncate_endBracket( $tag, $text[$textLen - 1], $tagType, $openTags );
+ while ( count( $openTags ) > 0 ) {
+ $ret .= '</' . array_pop( $openTags ) . '>'; // close open tags
+ }
+ return $ret;
+ }
+
+ // truncateHtml() helper function
+ // like strcspn() but adds the skipped chars to $ret
+ private function truncate_skip( &$ret, $text, $search, $start, $len = -1 ) {
+ $skipCount = 0;
+ if ( $start < strlen( $text ) ) {
+ $skipCount = strcspn( $text, $search, $start, $len );
+ $ret .= substr( $text, $start, $skipCount );
+ }
+ return $skipCount;
+ }
+
+ /*
+ * truncateHtml() helper function
+ * (a) push or pop $tag from $openTags as needed
+ * (b) clear $tag value
+ * @param String &$tag Current HTML tag name we are looking at
+ * @param int $tagType (0-open tag, 1-close tag)
+ * @param char $lastCh Character before the '>' that ended this tag
+ * @param array &$openTags Open tag stack (not accounting for $tag)
+ */
+ private function truncate_endBracket( &$tag, $tagType, $lastCh, &$openTags ) {
+ $tag = ltrim( $tag );
+ if ( $tag != '' ) {
+ if ( $tagType == 0 && $lastCh != '/' ) {
+ $openTags[] = $tag; // tag opened (didn't close itself)
+ } else if ( $tagType == 1 ) {
+ if ( $openTags && $tag == $openTags[count( $openTags ) - 1] ) {
+ array_pop( $openTags ); // tag closed
+ }
+ }
+ $tag = '';
+ }
+ }
+
+ /**
* Grammatical transformations, needed for inflected languages
* Invoked by putting {{grammar:case|word}} in a message
*
@@ -2224,7 +2536,7 @@ class Language {
*/
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms[$this->getCode()][$case][$word]) ) {
+ if ( isset( $wgGrammarForms[$this->getCode()][$case][$word] ) ) {
return $wgGrammarForms[$this->getCode()][$case][$word];
}
return $word;
@@ -2239,11 +2551,17 @@ class Language {
* These details may be overriden per language.
*/
function gender( $gender, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
$forms = $this->preConvertPlural( $forms, 2 );
- if ( $gender === 'male' ) return $forms[0];
- if ( $gender === 'female' ) return $forms[1];
- return isset($forms[2]) ? $forms[2] : $forms[0];
+ if ( $gender === 'male' ) {
+ return $forms[0];
+ }
+ if ( $gender === 'female' ) {
+ return $forms[1];
+ }
+ return isset( $forms[2] ) ? $forms[2] : $forms[0];
}
/**
@@ -2262,7 +2580,9 @@ class Language {
* @return string Correct form of plural for $count in this language
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
$forms = $this->preConvertPlural( $forms, 2 );
return ( $count == 1 ) ? $forms[0] : $forms[1];
@@ -2277,31 +2597,31 @@ class Language {
* @return array Padded array of forms or an exception if not an array
*/
protected function preConvertPlural( /* Array */ $forms, $count ) {
- while ( count($forms) < $count ) {
- $forms[] = $forms[count($forms)-1];
+ while ( count( $forms ) < $count ) {
+ $forms[] = $forms[count( $forms ) - 1];
}
return $forms;
}
/**
- * For translaing of expiry times
+ * For translating of expiry times
* @param $str String: the validated block time in English
* @return Somehow translated block time
* @see LanguageFi.php for example implementation
*/
function translateBlockExpiry( $str ) {
-
$scBlockExpiryOptions = $this->getMessageFromDB( 'ipboptions' );
- if ( $scBlockExpiryOptions == '-') {
+ if ( $scBlockExpiryOptions == '-' ) {
return $str;
}
- foreach (explode(',', $scBlockExpiryOptions) as $option) {
- if ( strpos($option, ":") === false )
+ foreach ( explode( ',', $scBlockExpiryOptions ) as $option ) {
+ if ( strpos( $option, ':' ) === false ) {
continue;
- list($show, $value) = explode(":", $option);
- if ( strcmp ( $str, $value) == 0 ) {
+ }
+ list( $show, $value ) = explode( ':', $option );
+ if ( strcmp( $str, $value ) == 0 ) {
return htmlspecialchars( trim( $show ) );
}
}
@@ -2331,8 +2651,8 @@ class Language {
}
# convert text to all supported variants
- function autoConvertToAllVariants($text) {
- return $this->mConverter->autoConvertToAllVariants($text);
+ function autoConvertToAllVariants( $text ) {
+ return $this->mConverter->autoConvertToAllVariants( $text );
}
# convert text to different variants of a language.
@@ -2346,16 +2666,15 @@ class Language {
}
# Check if this is a language with variants
- function hasVariants(){
- return sizeof($this->getVariants())>1;
+ function hasVariants() {
+ return sizeof( $this->getVariants() ) > 1;
}
# Put custom tags (e.g. -{ }-) around math to prevent conversion
- function armourMath($text){
- return $this->mConverter->armourMath($text);
+ function armourMath( $text ) {
+ return $this->mConverter->armourMath( $text );
}
-
/**
* Perform output conversion on a string, and encode for safe HTML output.
* @param $text String text to be converted
@@ -2372,7 +2691,7 @@ class Language {
}
/**
- * get the list of variants supported by this langauge
+ * Get the list of variants supported by this langauge
* see sample implementation in LanguageZh.php
*
* @return array an array of language codes
@@ -2381,20 +2700,27 @@ class Language {
return $this->mConverter->getVariants();
}
-
- function getPreferredVariant( $fromUser = true, $fromHeader = false ) {
- return $this->mConverter->getPreferredVariant( $fromUser, $fromHeader );
+ function getPreferredVariant() {
+ return $this->mConverter->getPreferredVariant();
+ }
+
+ function getDefaultVariant() {
+ return $this->mConverter->getDefaultVariant();
+ }
+
+ function getURLVariant() {
+ return $this->mConverter->getURLVariant();
}
/**
- * if a language supports multiple variants, it is
+ * If a language supports multiple variants, it is
* possible that non-existing link in one variant
* actually exists in another variant. this function
* tries to find it. See e.g. LanguageZh.php
*
* @param $link String: the name of the link
* @param $nt Mixed: the title object of the link
- * @param boolean $ignoreOtherCond: to disable other conditions when
+ * @param $ignoreOtherCond Boolean: to disable other conditions when
* we need to transclude a template or update a category's link
* @return null the input parameters may be modified upon return
*/
@@ -2406,12 +2732,13 @@ class Language {
* If a language supports multiple variants, converts text
* into an array of all possible variants of the text:
* 'variant' => text in that variant
+ *
+ * @deprecated Use autoConvertToAllVariants()
*/
- function convertLinkToAllVariants($text){
- return $this->mConverter->convertLinkToAllVariants($text);
+ function convertLinkToAllVariants( $text ) {
+ return $this->mConverter->convertLinkToAllVariants( $text );
}
-
/**
* returns language specific options used by User::getPageRenderHash()
* for example, the preferred language variant
@@ -2423,7 +2750,7 @@ class Language {
}
/**
- * for languages that support multiple variants, the title of an
+ * For languages that support multiple variants, the title of an
* article may be displayed differently in different variants. this
* function returns the apporiate title defined in the body of the article.
*
@@ -2441,7 +2768,7 @@ class Language {
* @param $noParse
* @return string the tagged text
*/
- function markNoConversion( $text, $noParse=false ) {
+ function markNoConversion( $text, $noParse = false ) {
return $this->mConverter->markNoConversion( $text, $noParse );
}
@@ -2543,7 +2870,9 @@ class Language {
}
function fixVariableInNamespace( $talk ) {
- if ( strpos( $talk, '$1' ) === false ) return $talk;
+ if ( strpos( $talk, '$1' ) === false ) {
+ return $talk;
+ }
global $wgMetaNamespace;
$talk = str_replace( '$1', $wgMetaNamespace, $talk );
@@ -2579,20 +2908,34 @@ class Language {
}
function formatTimePeriod( $seconds ) {
- if ( $seconds < 10 ) {
- return $this->formatNum( sprintf( "%.1f", $seconds ) ) . wfMsg( 'seconds-abbrev' );
- } elseif ( $seconds < 60 ) {
- return $this->formatNum( round( $seconds ) ) . wfMsg( 'seconds-abbrev' );
- } elseif ( $seconds < 3600 ) {
- return $this->formatNum( floor( $seconds / 60 ) ) . wfMsg( 'minutes-abbrev' ) .
- $this->formatNum( round( fmod( $seconds, 60 ) ) ) . wfMsg( 'seconds-abbrev' );
+ if ( round( $seconds * 10 ) < 100 ) {
+ return $this->formatNum( sprintf( "%.1f", round( $seconds * 10 ) / 10 ) ) . $this->getMessageFromDB( 'seconds-abbrev' );
+ } elseif ( round( $seconds ) < 60 ) {
+ return $this->formatNum( round( $seconds ) ) . $this->getMessageFromDB( 'seconds-abbrev' );
+ } elseif ( round( $seconds ) < 3600 ) {
+ $minutes = floor( $seconds / 60 );
+ $secondsPart = round( fmod( $seconds, 60 ) );
+ if ( $secondsPart == 60 ) {
+ $secondsPart = 0;
+ $minutes++;
+ }
+ return $this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' ) . ' ' .
+ $this->formatNum( $secondsPart ) . $this->getMessageFromDB( 'seconds-abbrev' );
} else {
$hours = floor( $seconds / 3600 );
$minutes = floor( ( $seconds - $hours * 3600 ) / 60 );
$secondsPart = round( $seconds - $hours * 3600 - $minutes * 60 );
- return $this->formatNum( $hours ) . wfMsg( 'hours-abbrev' ) .
- $this->formatNum( $minutes ) . wfMsg( 'minutes-abbrev' ) .
- $this->formatNum( $secondsPart ) . wfMsg( 'seconds-abbrev' );
+ if ( $secondsPart == 60 ) {
+ $secondsPart = 0;
+ $minutes++;
+ }
+ if ( $minutes == 60 ) {
+ $minutes = 0;
+ $hours++;
+ }
+ return $this->formatNum( $hours ) . $this->getMessageFromDB( 'hours-abbrev' ) . ' ' .
+ $this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' ) . ' ' .
+ $this->formatNum( $secondsPart ) . $this->getMessageFromDB( 'seconds-abbrev' );
}
}
@@ -2621,13 +2964,13 @@ class Language {
function formatSize( $size ) {
// For small sizes no decimal places necessary
$round = 0;
- if( $size > 1024 ) {
+ if ( $size > 1024 ) {
$size = $size / 1024;
- if( $size > 1024 ) {
+ if ( $size > 1024 ) {
$size = $size / 1024;
// For MB and bigger two decimal places are smarter
$round = 2;
- if( $size > 1024 ) {
+ if ( $size > 1024 ) {
$size = $size / 1024;
$msg = 'size-gigabytes';
} else {
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php
index d362c559..f5b5492d 100644
--- a/languages/LanguageConverter.php
+++ b/languages/LanguageConverter.php
@@ -1,11 +1,24 @@
<?php
-
/**
* Contains the LanguageConverter class and ConverterRule class
- * @ingroup Language
*
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
+ * 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 Language
*/
/**
@@ -51,21 +64,14 @@ class LanguageConverter {
$variantfallbacks = array(),
$flags = array(),
$manualLevel = array() ) {
+ global $wgDisabledVariants, $wgLanguageNames;
$this->mLangObj = $langobj;
$this->mMainLanguageCode = $maincode;
-
- global $wgDisabledVariants;
- $this->mVariants = array();
- foreach ( $variants as $variant ) {
- if ( !in_array( $variant, $wgDisabledVariants ) ) {
- $this->mVariants[] = $variant;
- }
- }
+ $this->mVariants = array_diff( $variants, $wgDisabledVariants );
$this->mVariantFallbacks = $variantfallbacks;
- global $wgLanguageNames;
$this->mVariantNames = $wgLanguageNames;
$this->mCacheKey = wfMemcKey( 'conversiontables', $maincode );
- $f = array(
+ $defaultflags = array(
// 'S' show converted text
// '+' add rules for alltext
// 'E' the gave flags is error
@@ -76,10 +82,10 @@ class LanguageConverter {
'D' => 'D', // convert description (subclass implement)
'-' => '-', // remove convert (not implement)
'H' => 'H', // add rule for convert code
- // (but no display in placed code )
+ // (but no display in placed code )
'N' => 'N' // current variant name
);
- $this->mFlags = array_merge( $f, $flags );
+ $this->mFlags = array_merge( $defaultflags, $flags );
foreach ( $this->mVariants as $v ) {
if ( array_key_exists( $v, $manualLevel ) ) {
$this->mManualLevel[$v] = $manualLevel[$v];
@@ -91,9 +97,12 @@ class LanguageConverter {
}
/**
- * @public
+ * Get all valid variants.
+ * Call this instead of using $this->mVariants directly.
+ *
+ * @return Array: contains all valid variants
*/
- function getVariants() {
+ public function getVariants() {
return $this->mVariants;
}
@@ -104,43 +113,39 @@ class LanguageConverter {
* when zh-sg is preferred but not defined, we will pick zh-hans
* in this case. Right now this is only used by zh.
*
- * @param string $v The language code of the variant
- * @return string array The code of the fallback language or false if there
- * is no fallback
- * @public
+ * @param $variant String: the language code of the variant
+ * @return String: The code of the fallback language or the
+ * main code if there is no fallback
*/
- function getVariantFallbacks( $v ) {
- if ( isset( $this->mVariantFallbacks[$v] ) ) {
- return $this->mVariantFallbacks[$v];
+ public function getVariantFallbacks( $variant ) {
+ if ( isset( $this->mVariantFallbacks[$variant] ) ) {
+ return $this->mVariantFallbacks[$variant];
}
return $this->mMainLanguageCode;
}
/**
* Get the title produced by the conversion rule.
- * @returns string
+ * @return String: The converted title text
*/
- function getConvRuleTitle() {
+ public function getConvRuleTitle() {
return $this->mConvRuleTitle;
}
/**
- * Get preferred language variants.
- * @param boolean $fromUser Get it from $wgUser's preferences
- * @param boolean $fromHeader Get it from Accept-Language
- * @return string the preferred language code
- * @public
+ * Get preferred language variant.
+ * @return String: the preferred language code
*/
- function getPreferredVariant( $fromUser = true, $fromHeader = false ) {
- global $wgDefaultLanguageVariant;
+ public function getPreferredVariant() {
+ global $wgDefaultLanguageVariant, $wgUser;
$req = $this->getURLVariant();
- if ( $fromUser && !$req ) {
+ if ( $wgUser->isLoggedIn() && !$req ) {
$req = $this->getUserVariant();
}
- if ( $fromHeader && !$req ) {
+ elseif ( !$req ) {
$req = $this->getHeaderVariant();
}
@@ -159,13 +164,34 @@ class LanguageConverter {
}
/**
+ * Get default variant.
+ * This function would not be affected by user's settings or headers
+ * @return String: the default variant code
+ */
+ public function getDefaultVariant() {
+ global $wgDefaultLanguageVariant;
+
+ $req = $this->getURLVariant();
+
+ if ( $wgDefaultLanguageVariant && !$req ) {
+ $req = $this->validateVariant( $wgDefaultLanguageVariant );
+ }
+
+ if ( $req ) {
+ return $req;
+ }
+ return $this->mMainLanguageCode;
+ }
+
+ /**
* Validate the variant
- * @param string $v the variant to validate
- * @returns mixed returns the variant if it is valid, null otherwise
+ * @param $variant String: the variant to validate
+ * @return Mixed: returns the variant if it is valid, null otherwise
*/
- function validateVariant( $v = null ) {
- if ( $v !== null && in_array( $v, $this->mVariants ) ) {
- return $v;
+ protected function validateVariant( $variant = null ) {
+ if ( $variant !== null &&
+ in_array( $variant, $this->mVariants ) ) {
+ return $variant;
}
return null;
}
@@ -173,11 +199,10 @@ class LanguageConverter {
/**
* Get the variant specified in the URL
*
- * @returns mixed variant if one found, false otherwise.
+ * @return Mixed: variant if one found, false otherwise.
*/
- function getURLVariant() {
+ public function getURLVariant() {
global $wgRequest;
- $ret = null;
if ( $this->mURLVariant ) {
return $this->mURLVariant;
@@ -196,11 +221,10 @@ class LanguageConverter {
/**
* Determine if the user has a variant set.
*
- * @returns mixed variant if one found, false otherwise.
+ * @return Mixed: variant if one found, false otherwise.
*/
- function getUserVariant() {
+ protected function getUserVariant() {
global $wgUser;
- $ret = null;
// memoizing this function wreaks havoc on parserTest.php
/* if ( $this->mUserVariant ) { */
@@ -222,15 +246,13 @@ class LanguageConverter {
return $this->mUserVariant = $this->validateVariant( $ret );
}
-
/**
* Determine the language variant from the Accept-Language header.
*
- * @returns mixed variant if one found, false otherwise.
+ * @return Mixed: variant if one found, false otherwise.
*/
- function getHeaderVariant() {
+ protected function getHeaderVariant() {
global $wgRequest;
- $ret = null;
if ( $this->mHeaderVariant ) {
return $this->mHeaderVariant;
@@ -238,30 +260,13 @@ class LanguageConverter {
// see if some supported language variant is set in the
// http header.
-
- $acceptLanguage = $wgRequest->getHeader( 'Accept-Language' );
- if ( !$acceptLanguage ) {
+ $languages = array_keys( $wgRequest->getAcceptLang() );
+ if ( empty( $languages ) ) {
return null;
}
- // explode by comma
- $result = StringUtils::explode( ',', strtolower( $acceptLanguage ) );
- $languages = array();
-
- foreach ( $result as $elem ) {
- // if $elem likes 'zh-cn;q=0.9'
- if ( ( $posi = strpos( $elem, ';' ) ) !== false ) {
- // get the real language code likes 'zh-cn'
- $languages[] = substr( $elem, 0, $posi );
- } else {
- $languages[] = $elem;
- }
- }
-
$fallback_languages = array();
foreach ( $languages as $language ) {
- // strip whitespace
- $language = trim( $language );
$this->mHeaderVariant = $this->validateVariant( $language );
if ( $this->mHeaderVariant ) {
break;
@@ -295,45 +300,24 @@ class LanguageConverter {
}
/**
- * Caption convert, base on preg_replace_callback.
- *
- * To convert text in "title" or "alt", like '<img alt="text" ... '
- * or '<span title="text" ... '
- *
- * @return string like ' alt="yyyy"' or ' title="yyyy"'
- * @private
- */
- function captionConvert( $matches ) {
- $toVariant = $this->getPreferredVariant();
- $title = $matches[1];
- $text = $matches[2];
- // we convert captions except URL
- if ( !strpos( $text, '://' ) ) {
- $text = $this->translate( $text, $toVariant );
- }
- return " $title=\"$text\"";
- }
-
- /**
* Dictionary-based conversion.
+ * This function would not parse the conversion rules.
+ * If you want to parse rules, try to use convert() or
+ * convertTo().
*
- * @param string $text the text to be converted
- * @param string $toVariant the target language code
- * @return string the converted text
- * @private
+ * @param $text String: the text to be converted
+ * @param $toVariant String: the target language code
+ * @return String: the converted text
*/
- function autoConvert( $text, $toVariant = false ) {
- $fname = 'LanguageConverter::autoConvert';
-
- wfProfileIn( $fname );
+ public function autoConvert( $text, $toVariant = false ) {
+ wfProfileIn( __METHOD__ );
- if ( !$this->mTablesLoaded ) {
- $this->loadTables();
- }
+ $this->loadTables();
if ( !$toVariant ) {
$toVariant = $this->getPreferredVariant();
if ( !$toVariant ) {
+ wfProfileOut( __METHOD__ );
return $text;
}
}
@@ -362,61 +346,92 @@ class LanguageConverter {
$reg = '/' . $codefix . $scriptfix . $prefix .
'<[^>]+>|&[a-zA-Z#][a-z0-9]+;' . $marker . $htmlfix . '/s';
+ $startPos = 0;
+ $sourceBlob = '';
+ $literalBlob = '';
- $matches = preg_split( $reg, $text, - 1, PREG_SPLIT_OFFSET_CAPTURE );
-
- $m = array_shift( $matches );
-
- $ret = $this->translate( $m[0], $toVariant );
- $mstart = $m[1] + strlen( $m[0] );
-
- // enable convertsion of '<img alt="xxxx" ... '
- // or '<span title="xxxx" ... '
- $captionpattern = '/\s(title|alt)\s*=\s*"([\s\S]*?)"/';
-
- $trtext = '';
- $trtextmark = "\0";
- $notrtext = array();
- foreach ( $matches as $m ) {
- $mark = substr( $text, $mstart, $m[1] - $mstart );
- $mark = preg_replace_callback( $captionpattern,
- array( &$this, 'captionConvert' ),
- $mark );
- // Let's convert the trtext only once,
- // it would give us more performance improvement
- $notrtext[] = $mark;
- $trtext .= $m[0] . $trtextmark;
- $mstart = $m[1] + strlen( $m[0] );
- }
- $notrtext[] = '';
- $trtext = $this->translate( $trtext, $toVariant );
- $trtext = StringUtils::explode( $trtextmark, $trtext );
- foreach ( $trtext as $t ) {
- $ret .= array_shift( $notrtext );
- $ret .= $t;
- }
- wfProfileOut( $fname );
- return $ret;
+ // Guard against delimiter nulls in the input
+ $text = str_replace( "\000", '', $text );
+
+ while ( $startPos < strlen( $text ) ) {
+ if ( preg_match( $reg, $text, $markupMatches, PREG_OFFSET_CAPTURE, $startPos ) ) {
+ $elementPos = $markupMatches[0][1];
+ $element = $markupMatches[0][0];
+ } else {
+ $elementPos = strlen( $text );
+ $element = '';
+ }
+
+ // Queue the part before the markup for translation in a batch
+ $sourceBlob .= substr( $text, $startPos, $elementPos - $startPos ) . "\000";
+
+ // Advance to the next position
+ $startPos = $elementPos + strlen( $element );
+
+ // Translate any alt or title attributes inside the matched element
+ if ( $element !== '' && preg_match( '/^(<[^>\s]*)\s([^>]*)(.*)$/', $element,
+ $elementMatches ) )
+ {
+ $attrs = Sanitizer::decodeTagAttributes( $elementMatches[2] );
+ $changed = false;
+ foreach ( array( 'title', 'alt' ) as $attrName ) {
+ if ( !isset( $attrs[$attrName] ) ) {
+ continue;
+ }
+ $attr = $attrs[$attrName];
+ // Don't convert URLs
+ if ( !strpos( $attr, '://' ) ) {
+ $attr = $this->translate( $attr, $toVariant );
+ }
+
+ // Remove HTML tags to avoid disrupting the layout
+ $attr = preg_replace( '/<[^>]+>/', '', $attr );
+ if ( $attr !== $attrs[$attrName] ) {
+ $attrs[$attrName] = $attr;
+ $changed = true;
+ }
+ }
+ if ( $changed ) {
+ $element = $elementMatches[1] . Html::expandAttributes( $attrs ) .
+ $elementMatches[3];
+ }
+ }
+ $literalBlob .= $element . "\000";
+ }
+
+ // Do the main translation batch
+ $translatedBlob = $this->translate( $sourceBlob, $toVariant );
+
+ // Put the output back together
+ $translatedIter = StringUtils::explode( "\000", $translatedBlob );
+ $literalIter = StringUtils::explode( "\000", $literalBlob );
+ $output = '';
+ while ( $translatedIter->valid() && $literalIter->valid() ) {
+ $output .= $translatedIter->current();
+ $output .= $literalIter->current();
+ $translatedIter->next();
+ $literalIter->next();
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $output;
}
/**
* Translate a string to a variant.
- * Doesn't process markup or do any of that other stuff, for that use
- * convert().
+ * Doesn't parse rules or do any of that other stuff, for that use
+ * convert() or convertTo().
*
- * @param string $text Text to convert
- * @param string $variant Variant language code
- * @return string Translated text
- * @private
+ * @param $text String: text to convert
+ * @param $variant String: variant language code
+ * @return String: translated text
*/
- function translate( $text, $variant ) {
+ public function translate( $text, $variant ) {
wfProfileIn( __METHOD__ );
// If $text is empty or only includes spaces, do nothing
// Otherwise translate it
if ( trim( $text ) ) {
- if ( !$this->mTablesLoaded ) {
- $this->loadTables();
- }
+ $this->loadTables();
$text = $this->mTables[$variant]->replace( $text );
}
wfProfileOut( __METHOD__ );
@@ -424,82 +439,56 @@ class LanguageConverter {
}
/**
- * Convert text to all supported variants.
+ * Call translate() to convert text to all valid variants.
*
- * @param string $text the text to be converted
- * @return array of string
- * @public
+ * @param $text String: the text to be converted
+ * @return Array: variant => converted text
*/
- function autoConvertToAllVariants( $text ) {
- $fname = 'LanguageConverter::autoConvertToAllVariants';
- wfProfileIn( $fname );
- if ( !$this->mTablesLoaded ) {
- $this->loadTables();
- }
+ public function autoConvertToAllVariants( $text ) {
+ wfProfileIn( __METHOD__ );
+ $this->loadTables();
$ret = array();
foreach ( $this->mVariants as $variant ) {
$ret[$variant] = $this->translate( $text, $variant );
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $ret;
}
/**
- * Convert link text to all supported variants.
+ * Convert link text to all valid variants.
+ * In the first, this function only convert text outside the
+ * "-{" "}-" markups. Since the "{" and "}" are not allowed in
+ * titles, the text will get all converted always.
+ * So I removed this feature and deprecated the function.
*
- * @param string $text the text to be converted
- * @return array of string
- * @public
+ * @param $text String: the text to be converted
+ * @return Array: variant => converted text
+ * @deprecated Use autoConvertToAllVariants() instead
*/
- function convertLinkToAllVariants( $text ) {
- if ( !$this->mTablesLoaded ) {
- $this->loadTables();
- }
-
- $ret = array();
- $tarray = StringUtils::explode( '-{', $text );
- $first = true;
-
- foreach ( $tarray as $txt ) {
- if ( $first ) {
- $first = false;
- foreach ( $this->mVariants as $variant ) {
- $ret[$variant] = $this->translate( $txt, $variant );
- }
- continue;
- }
-
- $marked = explode( '}-', $txt, 2 );
-
- foreach ( $this->mVariants as $variant ) {
- $ret[$variant] .= '-{' . $marked[0] . '}-';
- if ( array_key_exists( 1, $marked ) ) {
- $ret[$variant] .= $this->translate( $marked[1], $variant );
- }
- }
-
- }
-
- return $ret;
+ public function convertLinkToAllVariants( $text ) {
+ return $this->autoConvertToAllVariants( $text );
}
/**
- * Prepare manual conversion table.
- * @private
+ * Apply manual conversion rules.
+ *
+ * @param $convRule Object: Object of ConverterRule
*/
- function applyManualConv( $convRule ) {
+ protected function applyManualConv( $convRule ) {
// Use syntax -{T|zh-cn:TitleCN; zh-tw:TitleTw}- to custom
// title conversion.
- // Bug 24072: mConvRuleTitle won't work if the title conversion
- // rule was followed by other manual conversion rule(s).
+ // Bug 24072: $mConvRuleTitle was overwritten by other manual
+ // rule(s) not for title, this breaks the title conversion.
$newConvRuleTitle = $convRule->getTitle();
- if( $newConvRuleTitle ) {
+ if ( $newConvRuleTitle ) {
+ // So I add an empty check for getTitle()
$this->mConvRuleTitle = $newConvRuleTitle;
}
- // apply manual conversion table to global table
+ // merge/remove manual conversion rules to/from global table
$convTable = $convRule->getConvTable();
$action = $convRule->getRulesAction();
foreach ( $convTable as $variant => $pair ) {
@@ -523,42 +512,22 @@ class LanguageConverter {
}
/**
- * Convert text to different variants of a language. The automatic
- * conversion is done in autoConvert(). Here we parse the text
- * marked with -{}-, which specifies special conversions of the
- * text that can not be accomplished in autoConvert().
+ * Auto convert a Title object to a readable string in the
+ * preferred variant.
*
- * Syntax of the markup:
- * -{code1:text1;code2:text2;...}- or
- * -{flags|code1:text1;code2:text2;...}- or
- * -{text}- in which case no conversion should take place for text
- *
- * @param $text String: text to be converted
- * @return String: converted text
- */
- public function convert( $text ) {
- global $wgDisableLangConversion;
- if ( $wgDisableLangConversion ) return $text;
-
- $variant = $this->getPreferredVariant();
-
- return $this->recursiveConvertTopLevel( $text, $variant );
- }
-
- /**
- * Convert a Title object to a readable string in the preferred variant
+ *@param $title Object: a object of Title
+ *@return String: converted title text
*/
public function convertTitle( $title ) {
$variant = $this->getPreferredVariant();
$index = $title->getNamespace();
- if ( $index === NS_MAIN || $index === NS_SPECIAL ) {
+ if ( $index === NS_MAIN ) {
$text = '';
} else {
// first let's check if a message has given us a converted name
$nsConvKey = 'conversion-ns' . $index;
- $nsLocalText = wfMsgForContentNoTrans( $nsConvKey );
- if ( !wfEmptyMsg( $nsConvKey, $nsLocalText ) ) {
- $text = $nsLocalText;
+ if ( !wfEmptyMsg( $nsConvKey ) ) {
+ $text = wfMsgForContentNoTrans( $nsConvKey );
} else {
// the message does not exist, try retrieve it from the current
// variant's namespace names.
@@ -568,22 +537,61 @@ class LanguageConverter {
$text .= ':';
}
$text .= $title->getText();
- $text = $this->autoConvert( $text, $variant );
+ $text = $this->translate( $text, $variant );
return $text;
}
+ /**
+ * Convert text to different variants of a language. The automatic
+ * conversion is done in autoConvert(). Here we parse the text
+ * marked with -{}-, which specifies special conversions of the
+ * text that can not be accomplished in autoConvert().
+ *
+ * Syntax of the markup:
+ * -{code1:text1;code2:text2;...}- or
+ * -{flags|code1:text1;code2:text2;...}- or
+ * -{text}- in which case no conversion should take place for text
+ *
+ * @param $text String: text to be converted
+ * @return String: converted text
+ */
+ public function convert( $text ) {
+ $variant = $this->getPreferredVariant();
+ return $this->convertTo( $text, $variant );
+ }
+
+ /**
+ * Same as convert() except a extra parameter to custom variant.
+ *
+ * @param $text String: text to be converted
+ * @param $variant String: the target variant code
+ * @return String: converted text
+ */
+ public function convertTo( $text, $variant ) {
+ global $wgDisableLangConversion;
+ if ( $wgDisableLangConversion ) return $text;
+ return $this->recursiveConvertTopLevel( $text, $variant );
+ }
+
+ /**
+ * Recursively convert text on the outside. Allow to use nested
+ * markups to custom rules.
+ *
+ * @param $text String: text to be converted
+ * @param $variant String: the target variant code
+ * @param $depth Integer: depth of recursion
+ * @return String: converted text
+ */
protected function recursiveConvertTopLevel( $text, $variant, $depth = 0 ) {
$startPos = 0;
$out = '';
$length = strlen( $text );
while ( $startPos < $length ) {
- $m = false;
$pos = strpos( $text, '-{', $startPos );
-
+
if ( $pos === false ) {
// No more markup, append final segment
$out .= $this->autoConvert( substr( $text, $startPos ), $variant );
- $startPos = $length;
return $out;
}
@@ -601,10 +609,18 @@ class LanguageConverter {
return $out;
}
+ /**
+ * Recursively convert text on the inside.
+ *
+ * @param $text String: text to be converted
+ * @param $variant String: the target variant code
+ * @param $depth Integer: depth of recursion
+ * @return String: converted text
+ */
protected function recursiveConvertRule( $text, $variant, &$startPos, $depth = 0 ) {
// Quick sanity check (no function calls)
if ( $text[$startPos] !== '-' || $text[$startPos + 1] !== '{' ) {
- throw new MWException( __METHOD__.': invalid input string' );
+ throw new MWException( __METHOD__ . ': invalid input string' );
}
$startPos += 2;
@@ -637,7 +653,7 @@ class LanguageConverter {
$inner .= '-{';
if ( !$warningDone ) {
$inner .= '<span class="error">' .
- wfMsgForContent( 'language-converter-depth-warning',
+ wfMsgForContent( 'language-converter-depth-warning',
$this->mMaxDepth ) .
'</span>';
$warningDone = true;
@@ -656,7 +672,7 @@ class LanguageConverter {
$this->applyManualConv( $rule );
return $rule->getDisplay();
default:
- throw new MWException( __METHOD__.': invalid regex match' );
+ throw new MWException( __METHOD__ . ': invalid regex match' );
}
}
@@ -674,14 +690,13 @@ class LanguageConverter {
* actually exists in another variant. This function
* tries to find it. See e.g. LanguageZh.php
*
- * @param string $link the name of the link
- * @param mixed $nt the title object of the link
- * @param boolean $ignoreOtherCond: to disable other conditions when
- * we need to transclude a template or update a category's link
- * @return null the input parameters may be modified upon return
- * @public
+ * @param $link String: the name of the link
+ * @param $nt Mixed: the title object of the link
+ * @param $ignoreOtherCond Boolean: to disable other conditions when
+ * we need to transclude a template or update a category's link
+ * @return Null, the input parameters may be modified upon return
*/
- function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
+ public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
# If the article has already existed, there is no need to
# check it again, otherwise it may cause a fault.
if ( is_object( $nt ) && $nt->exists() ) {
@@ -714,7 +729,7 @@ class LanguageConverter {
}
$variants = $this->autoConvertToAllVariants( $link );
- if ( $variants == false ) { // give up
+ if ( !$variants ) { // give up
return;
}
@@ -742,12 +757,10 @@ class LanguageConverter {
}
}
- /**
+ /**
* Returns language specific hash options.
- *
- * @public
*/
- function getExtraHashOptions() {
+ public function getExtraHashOptions() {
$variant = $this->getPreferredVariant();
return '!' . $variant ;
}
@@ -768,10 +781,10 @@ class LanguageConverter {
* @private
*/
function loadTables( $fromcache = true ) {
- global $wgMemc;
if ( $this->mTablesLoaded ) {
return;
}
+ global $wgMemc;
wfProfileIn( __METHOD__ );
$this->mTablesLoaded = true;
$this->mTables = false;
@@ -801,13 +814,13 @@ class LanguageConverter {
wfProfileOut( __METHOD__ );
}
- /**
+ /**
* Hook for post processig after conversion tables are loaded.
*
*/
function postLoadTables() { }
- /**
+ /**
* Reload the conversion tables.
*
* @private
@@ -853,6 +866,11 @@ class LanguageConverter {
if ( strpos( $code, '/' ) === false ) {
$txt = $wgMessageCache->get( 'Conversiontable', true, $code );
+ if ( $txt === false ) {
+ # FIXME: this method doesn't seem to be expecting
+ # this possible outcome...
+ $txt = '&lt;Conversiontable&gt;';
+ }
} else {
$title = Title::makeTitleSafe( NS_MEDIAWIKI,
"Conversiontable/$code" );
@@ -888,7 +906,6 @@ class LanguageConverter {
}
}
-
// parse the mappings in this page
$blocks = StringUtils::explode( '-{', $txt );
$ret = array();
@@ -914,7 +931,6 @@ class LanguageConverter {
}
$parsed[$key] = true;
-
// recursively parse the subpages
if ( $recursive ) {
foreach ( $sublinks as $link ) {
@@ -925,7 +941,7 @@ class LanguageConverter {
if ( $this->mUcfirst ) {
foreach ( $ret as $k => $v ) {
- $ret[Language::ucfirst( $k )] = Language::ucfirst( $v );
+ $ret[$this->mLangObj->ucfirst( $k )] = $this->mLangObj->ucfirst( $v );
}
}
return $ret;
@@ -935,11 +951,11 @@ class LanguageConverter {
* Enclose a string with the "no conversion" tag. This is used by
* various functions in the Parser.
*
- * @param string $text text to be tagged for no conversion
- * @return string the tagged text
- * @public
+ * @param $text String: text to be tagged for no conversion
+ * @param $noParse Unused (?)
+ * @return String: the tagged text
*/
- function markNoConversion( $text, $noParse = false ) {
+ public function markNoConversion( $text, $noParse = false ) {
# don't mark if already marked
if ( strpos( $text, '-{' ) || strpos( $text, '}-' ) ) {
return $text;
@@ -980,15 +996,13 @@ class LanguageConverter {
/**
* Armour rendered math against conversion.
- * Wrap math into rawoutput -{R| math }- syntax.
- * @public
+ * Escape special chars in parsed math text.(in most cases are img elements)
*/
- function armourMath( $text ) {
- // we need to convert '-{' and '}-' to '-&#123;' and '&#125;-'
- // to avoid a unwanted '}-' appeared after the math-image.
+ public function armourMath( $text ) {
+ // convert '-{' and '}-' to '-&#123;' and '&#125;-' to prevent
+ // any unwanted markup appearing in the math image tag.
$text = strtr( $text, array( '-{' => '-&#123;', '}-' => '&#125;-' ) );
- $ret = "-{R|$text}-";
- return $ret;
+ return $text;
}
/**
@@ -1000,7 +1014,7 @@ class LanguageConverter {
// text should be splited by ";" only if a valid variant
// name exist after the markup, for example:
// -{zh-hans:<span style="font-size:120%;">xxx</span>;zh-hant:\
- // <span style="font-size:120%;">yyy</span>;}-
+ // <span style="font-size:120%;">yyy</span>;}-
// we should split it as:
// array(
// [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
@@ -1139,7 +1153,6 @@ class ConverterRule {
*/
function parseRules() {
$rules = $this->mRules;
- $flags = $this->mFlags;
$bidtable = array();
$unidtable = array();
$variants = $this->mConverter->mVariants;
@@ -1161,7 +1174,7 @@ class ConverterRule {
$bidtable[$v] = $to;
} elseif ( count( $u ) == 2 ) {
$from = trim( $u[0] );
- $v = trim( $u[1] );
+ $v = trim( $u[1] );
if ( array_key_exists( $v, $unidtable )
&& !is_array( $unidtable[$v] )
&& $to
@@ -1287,7 +1300,7 @@ class ConverterRule {
}
/*for unidirectional array fill to convert tables */
if ( ( $manLevel[$v] == 'bidirectional' || $manLevel[$v] == 'unidirectional' )
- && isset( $unidtable[$v] ) )
+ && isset( $unidtable[$v] ) )
{
if ( isset( $this->mConvTable[$v] ) ) {
$this->mConvTable[$v] = array_merge( $this->mConvTable[$v], $unidtable[$v] );
@@ -1307,7 +1320,6 @@ class ConverterRule {
$variant = $this->mConverter->getPreferredVariant();
}
- $variants = $this->mConverter->mVariants;
$this->parseFlags();
$flags = $this->mFlags;
diff --git a/languages/Names.php b/languages/Names.php
index 79759c95..84067219 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -19,6 +19,7 @@
'ar' => 'العربية', # Arabic
'arc' => 'ÜܪܡÜÜ', # Aramaic
'arn' => 'Mapudungun', # Mapuche, Mapudungu, Araucanian (Araucano)
+ 'ary' => 'Maġribi', # Moroccan Spoken Arabic
'arz' => 'مصرى', # Egyptian Spoken Arabic
'as' => 'অসমীয়া', # Assamese
'ast' => 'Asturianu', # Asturian
@@ -26,17 +27,18 @@
'avk' => 'Kotava', # Kotava
'ay' => 'Aymar aru', # Aymara
'az' => 'Azərbaycanca', # Azerbaijani
- 'ba' => 'Башҡорт', # Bashkir
+ 'ba' => 'БашҡортÑа', # Bashkir
'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
- 'bat-smg' => 'Žemaitėška', # Samogitian
+ 'bat-smg' => 'Žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
'bcc' => 'بلوچی مکرانی', # Southern Balochi
'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
'be' => 'БеларуÑкаÑ', # Belarusian normative
- 'be-tarask' => 'БеларуÑÐºÐ°Ñ (тарашкевіца)', # Belarusian in Taraskievica orthography
- 'be-x-old' => 'БеларуÑÐºÐ°Ñ (тарашкевіца)', # Belarusian in Taraskievica orthography; compat link
+ 'be-tarask' => "\xE2\x80\xAAБеларуÑÐºÐ°Ñ (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography
+ 'be-x-old' => "\xE2\x80\xAAБеларуÑÐºÐ°Ñ (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography; compat link
'bg' => 'БългарÑки', # Bulgarian
'bh' => 'भोजपà¥à¤°à¥€', # Bhojpuri
'bi' => 'Bislama', # Bislama
+ 'bjn' => 'Bahasa Banjar', # Banjarese
'bm' => 'Bamanankan', # Bambara
'bn' => 'বাংলা', # Bengali
'bo' => 'བོད་ཡིག', # Tibetan
@@ -55,13 +57,11 @@
'cho' => 'Choctaw', # Choctaw
'chr' => 'á£áŽ³áŽ©', # Cherokee
'chy' => 'Tsetsêhestâhese', # Cheyenne
- 'ckb' => 'Soranî / کوردی', # Sorani
- 'ckb-latn' => "\xE2\x80\xAASoranî (latînî)\xE2\x80\xAC", # Central Kurdish Latin script
- 'ckb-arab' => "\xE2\x80\xABکوردی (عەرەبی)\xE2\x80\xAC", # Central Kurdish Arabic script
+ 'ckb' => 'کوردی', # Sorani
'co' => 'Corsu', # Corsican
'cps' => 'Capiceño', # Capiznon
'cr' => 'NÄ“hiyawÄ“win / á“€á¦áƒá”­ááá£', # Cree
- 'crh' => 'Qırımtatarca', # Crimean Tatar
+ 'crh' => 'Qırımtatarca', # Crimean Tatar (multiple scripts - defaults to Latin)
'crh-latn' => "\xE2\x80\xAAQırımtatarca (Latin)\xE2\x80\xAC", # Crimean Tatar (Latin)
'crh-cyrl' => "\xE2\x80\xAAКъырымтатарджа (Кирилл)\xE2\x80\xAC", # Crimean Tatar (Cyrillic)
'cs' => 'ÄŒesky', # Czech
@@ -73,9 +73,8 @@
'de' => 'Deutsch', # German ("Du")
'de-at' => 'Österreichisches Deutsch', # Austrian German
'de-ch' => 'Schweizer Hochdeutsch', # Swiss Standard German
- 'de-formal' => 'Deutsch (Sie-Form)', # German - formal address ("Sie")
+ 'de-formal' => "\xE2\x80\xAADeutsch (Sie-Form)\xE2\x80\xAC", # German - formal address ("Sie")
'diq' => 'Zazaki', # Zazaki
- 'dk' => 'Dansk (deprecated:da)', # Unused code currently falls back to Danish, 'da' is correct for the language
'dsb' => 'Dolnoserbski', # Lower Sorbian
'dv' => 'Þ‹Þ¨ÞˆÞ¬Þ€Þ¨Þ„Þ¦ÞÞ°', # Dhivehi
'dz' => 'ཇོང་à½', # Bhutani
@@ -98,14 +97,14 @@
'fr' => 'Français', # French
'frc' => 'Français cadien', # Cajun French
'frp' => 'Arpetan', # Franco-Provençal/Arpitan
- 'frr' => 'Frasch', # North Frisian
+ 'frr' => 'Nordfriisk', # North Frisian
'fur' => 'Furlan', # Friulian
'fy' => 'Frysk', # Frisian
'ga' => 'Gaeilge', # Irish
'gag' => 'Gagauz', # Gagauz
- 'gan' => '贛語', # Gan
- 'gan-hans' => '赣语(简体)', # Gan (Simplified Han)
- 'gan-hant' => '贛語(ç¹é«”)', # Gan (Traditional Han)
+ 'gan' => '贛語', # Gan (multiple scripts - defaults to Traditional)
+ 'gan-hans' => "\xE2\x80\xAA赣语(简体)\xE2\x80\xAC", # Gan (Simplified Han)
+ 'gan-hant' => "\xE2\x80\xAA贛語(ç¹é«”)\xE2\x80\xAC", # Gan (Traditional Han)
'gd' => 'Gàidhlig', # Scots Gaelic
'gl' => 'Galego', # Galician
'glk' => 'گیلکی', # Gilaki
@@ -120,8 +119,7 @@
'haw' => 'Hawai`i', # Hawaiian
'he' => 'עברית', # Hebrew
'hi' => 'हिनà¥à¤¦à¥€', # Hindi
- 'hif' => 'Fiji Hindi', # Fijian Hindi (falls back to hif-latn)
- 'hif-deva' => 'फ़ीजी हिनà¥à¤¦à¥€', # Fiji Hindi (devangari)
+ 'hif' => 'Fiji Hindi', # Fijian Hindi (multiple scripts - defaults to Latin)
'hif-latn' => 'Fiji Hindi', # Fiji Hindi (latin)
'hil' => 'Ilonggo', # Hiligaynon
'ho' => 'Hiri Motu', # Hiri Motu
@@ -152,11 +150,13 @@
'ka' => 'ქáƒáƒ áƒ—ული', # Georgian
'kaa' => 'Qaraqalpaqsha', # Karakalpak
'kab' => 'Taqbaylit', # Kabyle
- 'kg' => 'Kongo', # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
+ 'kbd' => 'КъÑбÑÑ€Ð´ÐµÐ¸Ð±Ð·Ñ / QabardjajÉ™bza', # Kabardian (multiple scripts - defaults to Cyrillic)
+ 'kbd-cyrl' => 'къÑбÑрдеибзÑ', # Kabardian (Cyrillic)
+ 'kg' => 'Kongo', # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
'ki' => 'Gĩkũyũ', # Gikuyu
'kiu' => 'Kırmancki', # Kirmanjki
- 'kj' => 'Kwanyama', # Kwanyama
- 'kk' => 'Қазақша', # Kazakh
+ 'kj' => 'Kwanyama', # Kwanyama
+ 'kk' => 'Қазақша', # Kazakh (multiple scripts - defaults to Cyrillic)
'kk-arab' => "\xE2\x80\xABقازاقشا (تٴوتە)\xE2\x80\xAC", # Kazakh Arabic
'kk-cyrl' => "\xE2\x80\xAAҚазақша (кирил)\xE2\x80\xAC", # Kazakh Cyrillic
'kk-latn' => "\xE2\x80\xAAQazaqşa (latın)\xE2\x80\xAC", # Kazakh Latin
@@ -174,12 +174,12 @@
'kri' => 'Krio', # Krio
'krj' => 'Kinaray-a', # Kinaray-a
'ks' => 'कशà¥à¤®à¥€à¤°à¥€ - (كشميري)', # Kashmiri
- 'ksh' => 'Ripoarisch', # Ripuarian
- 'ku' => 'Kurdî', # Kurdish
- 'ku-latn' => "\xE2\x80\xAAKurdî (latînî)\xE2\x80\xAC", # Northern Kurdish Latin script
- 'ku-arab' => "\xE2\x80\xABكوردي (عەرەبی)\xE2\x80\xAC", # Northern Kurdish Arabic script
- 'kv' => 'Коми', # Komi-Zyrian, cyrillic is common script but also written in latin script
- 'kw' => 'Kernewek', # Cornish
+ 'ksh' => 'Ripoarisch', # Ripuarian
+ 'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
+ 'ku-latn' => "\xE2\x80\xAAKurdî (latînî)\xE2\x80\xAC", # Northern Kurdish (Latin script)
+ 'ku-arab' => "\xE2\x80\xABكوردي (عەرەبی)\xE2\x80\xAC", # Northern Kurdish (Arabic script) (falls back to ckb)
+ 'kv' => 'Коми', # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
+ 'kw' => 'Kernowek', # Cornish
'ky' => 'Кыргызча', # Kirghiz
'la' => 'Latina', # Latin
'lad' => 'Ladino', # Ladino
@@ -200,12 +200,13 @@
'lzh' => '文言', # Literary Chinese -- (bug 8217) lzh instead of zh-classical, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=l
'lzz' => 'Lazuri', # Laz
'mai' => 'मैथिली', # Maithili
- 'map-bms' => 'Basa Banyumasan', # Banyumasan
+ 'map-bms' => 'Basa Banyumasan', # Banyumasan
'mdf' => 'Мокшень', # Moksha
'mg' => 'Malagasy', # Malagasy
'mh' => 'Ebon', # Marshallese
'mhr' => 'Олык Марий', # Eastern Mari
'mi' => 'MÄori', # Maori
+ 'min' => 'Baso Minangkabau', # Minangkabau
'mk' => 'МакедонÑки', # Macedonian
'ml' => 'മലയാളം', # Malayalam
'mn' => 'Монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
@@ -231,6 +232,7 @@
'ng' => 'Oshiwambo', # Ndonga
'niu' => 'Niuē', # Niuean
'nl' => 'Nederlands', # Dutch
+ 'nl-informal' => "\xE2\x80\xAANederlands (informeel)\xE2\x80\xAC", # Dutch (informal address ("je"))
'nn' => "\xE2\x80\xAANorsk (nynorsk)\xE2\x80\xAC", # Norwegian (Nynorsk)
'no' => "\xE2\x80\xAANorsk (bokmål)\xE2\x80\xAC", # Norwegian
'nov' => 'Novial', # Novial
@@ -242,14 +244,14 @@
'om' => 'Oromoo', # Oromo
'or' => 'ଓଡ଼ିଆ', # Oriya
'os' => 'Иронау', # Ossetic
- 'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (pan)
+ 'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
'pag' => 'Pangasinan', # Pangasinan
'pam' => 'Kapampangan', # Pampanga
'pap' => 'Papiamentu', # Papiamentu
'pcd' => 'Picard', # Picard
'pdc' => 'Deitsch', # Pennsylvania German
'pdt' => 'Plautdietsch', # Plautdietsch/Mennonite Low German
- 'pfl' => 'Pfälzisch', # Palatinate German
+ 'pfl' => 'Pälzisch', # Palatinate German
'pi' => 'पािऴ', # Pali
'pih' => 'Norfuk / Pitkern', # Norfuk/Pitcairn/Norfolk
'pl' => 'Polski', # Polish
@@ -270,10 +272,10 @@
'roa-rup' => 'Armãneashce', # Aromanian
'roa-tara' => 'Tarandíne', # Tarantino
'ru' => 'РуÑÑкий', # Russian
- 'rue' => 'руÑиньÑкый Ñзык', # Rusyn
- 'ruq' => 'Vlăheşte', # Megleno-Romanian (falls back to ruq-latn)
+ 'rue' => 'РуÑиньÑкый', # Rusyn
+ 'ruq' => 'Vlăheşte', # Megleno-Romanian (multiple scripts - defaults to Latin)
'ruq-cyrl' => 'ВлахеÑте', # Megleno-Romanian (Cyrillic script)
- #'ruq-grek' => 'Βλαεστε', # Megleno-Romanian (Greek script)
+ # 'ruq-grek' => 'Βλαεστε', # Megleno-Romanian (Greek script)
'ruq-latn' => 'Vlăheşte', # Megleno-Romanian (Latin script)
'rw' => 'Kinyarwanda', # Kinyarwanda, should possibly be Kinyarwandi
'sa' => 'संसà¥à¤•à¥ƒà¤¤', # Sanskrit
@@ -286,6 +288,7 @@
'se' => 'Sámegiella', # Northern Sami
'sei' => 'Cmique Itom', # Seri
'sg' => 'Sängö', # Sango/Sangho
+ 'sgs' => 'Žemaitėška', # Samogitian
'sh' => 'Srpskohrvatski / СрпÑкохрватÑки', # Serbocroatian
'shi' => 'Tašlḥiyt', # Tachelhit
'si' => 'සිංහල', # Sinhalese
@@ -298,9 +301,9 @@
'sn' => 'chiShona', # Shona
'so' => 'Soomaaliga', # Somali
'sq' => 'Shqip', # Albanian
- 'sr' => 'СрпÑки / Srpski', # Serbian
- 'sr-ec' => 'СрпÑки (ћирилица)', # Serbian Cyrillic ekavian
- 'sr-el' => 'Srpski (latinica)', # Serbian Latin ekavian
+ 'sr' => 'СрпÑки / Srpski', # Serbian (multiple scripts - defaults to Cyrillic)
+ 'sr-ec' => "\xE2\x80\xAAСрпÑки (ћирилица)\xE2\x80\xAC", # Serbian Cyrillic ekavian
+ 'sr-el' => "\xE2\x80\xAASrpski (latinica)\xE2\x80\xAC", # Serbian Latin ekavian
'srn' => 'Sranantongo', # Sranan Tongo
'ss' => 'SiSwati', # Swati
'st' => 'Sesotho', # Southern Sotho
@@ -328,16 +331,16 @@
'tr' => 'Türkçe', # Turkish
'ts' => 'Xitsonga', # Tsonga
'tt' => 'Татарча/Tatarça', # Tatar (multiple scripts - defaults to Cyrillic)
- 'tt-cyrl' => 'Татарча', # Tatar (Cyrillic script)
+ 'tt-cyrl' => 'Татарча', # Tatar (Cyrillic script) (default)
'tt-latn' => 'Tatarça', # Tatar (Latin script)
'tum' => 'chiTumbuka', # Tumbuka
'tw' => 'Twi', # Twi, (FIXME!)
'ty' => 'Reo MÄ`ohi', # Tahitian
'tyv' => 'Тыва дыл', # Tyvan
'udm' => 'Удмурт', # Udmurt
- 'ug' => 'Uyghurche‎ / ئۇيغۇرچە', # Uyghur (multiple scripts - defaults to Latin)
- 'ug-arab' => 'ئۇيغۇرچە', # Uyghur (Arabic script)
- 'ug-latn' => 'Uyghurche‎', # Uyghur (Latin script - default)
+ 'ug' => 'ئۇيغۇرچە / Uyghurche‎', # Uyghur (multiple scripts - defaults to Arabic)
+ 'ug-arab' => 'ئۇيغۇرچە', # Uyghur (Arabic script) (default)
+ 'ug-latn' => 'Uyghurche‎', # Uyghur (Latin script)
'uk' => 'УкраїнÑька', # Ukrainian
'ur' => 'اردو', # Urdu
'uz' => 'O\'zbek', # Uzbek
@@ -365,8 +368,8 @@
'zh' => '中文', # (ZhÅng Wén) - Chinese
'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
'zh-cn' => "\xE2\x80\xAA中文(中国大陆)\xE2\x80\xAC", # Chinese (PRC)
- 'zh-hans' => "\xE2\x80\xAA中文(简体)\xE2\x80\xAC", # Chinese written using the Simplified Chinese script
- 'zh-hant' => "\xE2\x80\xAA中文(ç¹é«”)\xE2\x80\xAC", # Chinese written using the Traditional Chinese script
+ 'zh-hans' => "\xE2\x80\xAA中文(简体)\xE2\x80\xAC", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
+ 'zh-hant' => "\xE2\x80\xAA中文(ç¹é«”)\xE2\x80\xAC", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
'zh-hk' => "\xE2\x80\xAA中文(香港)\xE2\x80\xAC", # Chinese (Hong Kong)
'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
'zh-mo' => "\xE2\x80\xAA中文(澳門)\xE2\x80\xAC", # Chinese (Macau)
diff --git a/languages/classes/LanguageAm.php b/languages/classes/LanguageAm.php
index cf31c709..77374d3c 100644
--- a/languages/classes/LanguageAm.php
+++ b/languages/classes/LanguageAm.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Amharic (አማርኛ)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageAm extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageAr.php b/languages/classes/LanguageAr.php
index 70a53f86..77c46025 100644
--- a/languages/classes/LanguageAr.php
+++ b/languages/classes/LanguageAr.php
@@ -7,18 +7,18 @@
*/
class LanguageAr extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 6 );
if ( $count == 0 ) {
$index = 0;
} elseif ( $count == 1 ) {
$index = 1;
- } elseif( $count == 2 ) {
+ } elseif ( $count == 2 ) {
$index = 2;
- } elseif( $count % 100 >= 3 && $count % 100 <= 10 ) {
+ } elseif ( $count % 100 >= 3 && $count % 100 <= 10 ) {
$index = 3;
- } elseif( $count % 100 >= 11 && $count % 100 <= 99 ) {
+ } elseif ( $count % 100 >= 11 && $count % 100 <= 99 ) {
$index = 4;
} else {
$index = 5;
@@ -27,10 +27,10 @@ class LanguageAr extends Language {
}
/**
- * Temporary hack for bug 9413: replace Arabic presentation forms with their
- * standard equivalents.
+ * Temporary hack for bug 9413: replace Arabic presentation forms with their
+ * standard equivalents.
*
- * FIXME: This is language-specific for now only to avoid the negative
+ * FIXME: This is language-specific for now only to avoid the negative
* performance impact of enabling it for all languages.
*/
function normalize( $s ) {
diff --git a/languages/classes/LanguageBat_smg.php b/languages/classes/LanguageBat_smg.php
index 8d3450ac..5b6c92a6 100644
--- a/languages/classes/LanguageBat_smg.php
+++ b/languages/classes/LanguageBat_smg.php
@@ -8,15 +8,15 @@
class LanguageBat_smg extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
$count = abs( $count );
- if ( $count === 0 || ($count%100 === 0 || ($count%100 >= 10 && $count%100 < 20)) ) {
+ if ( $count === 0 || ( $count % 100 === 0 || ( $count % 100 >= 10 && $count % 100 < 20 ) ) ) {
return $forms[2];
- } elseif ( $count%10 === 1 ) {
+ } elseif ( $count % 10 === 1 ) {
return $forms[0];
- } elseif ( $count%10 === 2 ) {
+ } elseif ( $count % 10 === 2 ) {
return $forms[1];
} else {
return $forms[3];
diff --git a/languages/classes/LanguageBe.php b/languages/classes/LanguageBe.php
index b86a5f30..0b147333 100644
--- a/languages/classes/LanguageBe.php
+++ b/languages/classes/LanguageBe.php
@@ -15,15 +15,15 @@
class LanguageBe extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// FIXME: CLDR defines 4 plural forms instead of 3
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
diff --git a/languages/classes/LanguageBe_tarask.php b/languages/classes/LanguageBe_tarask.php
index 96ad9467..b29d8770 100644
--- a/languages/classes/LanguageBe_tarask.php
+++ b/languages/classes/LanguageBe_tarask.php
@@ -4,7 +4,7 @@
* @ingroup Language
*
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @link http://be.wikipedia.org/wiki/Talk:LanguageBe.php
+ * @link http://be-x-old.wikipedia.org/wiki/Project_talk:LanguageBe_tarask.php
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
* @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
*/
@@ -19,19 +19,19 @@ class LanguageBe_tarask extends Language {
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
- //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
- if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
// FIXME: CLDR defines 4 plural forms instead of 3
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
@@ -40,4 +40,37 @@ class LanguageBe_tarask extends Language {
}
}
}
+
+ /*
+ * The Belarusian language uses apostrophe sign,
+ * but the characters used for this could be both U+0027 and U+2019.
+ * This function unifies apostrophe sign in search index values
+ * to enable seach using both apostrophe signs.
+ */
+ function normalizeForSearch( $string ) {
+ wfProfileIn( __METHOD__ );
+
+ # MySQL fulltext index doesn't grok utf-8, so we
+ # need to fold cases and convert to hex
+
+ # Replacing apostrophe sign U+2019 with U+0027
+ $s = preg_replace( '/\xe2\x80\x99/', '\'', $string );
+
+ $s = parent::normalizeForSearch( $s );
+
+ wfProfileOut( __METHOD__ );
+ return $s;
+ }
+
+ /*
+ * Four-digit number should be without group commas (spaces)
+ * So "1 234 567", "12 345" but "1234"
+ */
+ function commafy( $_ ) {
+ if ( preg_match( '/^-?\d{1,4}(\.\d*)?$/', $_ ) ) {
+ return $_;
+ } else {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+ }
+ }
}
diff --git a/languages/classes/LanguageBg.php b/languages/classes/LanguageBg.php
index bb10675a..d6d34090 100644
--- a/languages/classes/LanguageBg.php
+++ b/languages/classes/LanguageBg.php
@@ -9,9 +9,9 @@ class LanguageBg extends Language {
* ISO number formatting: 123 456 789,99.
* Avoid tripple grouping by numbers with whole part up to 4 digits.
*/
- function commafy($_) {
- if (!preg_match('/^\d{1,4}$/',$_)) {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ function commafy( $_ ) {
+ if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageBh.php b/languages/classes/LanguageBh.php
index 80119ec7..3272e2f3 100644
--- a/languages/classes/LanguageBh.php
+++ b/languages/classes/LanguageBh.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Bihari (भोजपà¥à¤°à¥€)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageBh extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageBs.php b/languages/classes/LanguageBs.php
index df522f83..6432109d 100644
--- a/languages/classes/LanguageBs.php
+++ b/languages/classes/LanguageBs.php
@@ -7,15 +7,15 @@
class LanguageBs extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
// FIXME: CLDR defines 4 plural forms instead of 3. Plural for decimals is missing.
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
@@ -32,7 +32,7 @@ class LanguageBs extends Language {
*/
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['bs'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['bs'][$case][$word] ) ) {
return $wgGrammarForms['bs'][$case][$word];
}
switch ( $case ) {
diff --git a/languages/classes/LanguageCs.php b/languages/classes/LanguageCs.php
index ca1669b9..935aed4e 100644
--- a/languages/classes/LanguageCs.php
+++ b/languages/classes/LanguageCs.php
@@ -12,7 +12,7 @@ class LanguageCs extends Language {
# {{plural:count|form1|form0,2+}} for single form plurals
# in a message
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
switch ( $count ) {
diff --git a/languages/classes/LanguageCu.php b/languages/classes/LanguageCu.php
index e4ef7b02..1aecbca5 100644
--- a/languages/classes/LanguageCu.php
+++ b/languages/classes/LanguageCu.php
@@ -9,36 +9,36 @@ class LanguageCu extends Language {
# Invoked with {{grammar:case|word}}
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['Ñu'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['Ñu'][$case][$word] ) ) {
return $wgGrammarForms['Ñu'][$case][$word];
}
# These rules are not perfect, but they are currently only used for site names so it doesn't
# matter if they are wrong sometimes. Just add a special case for your site name if necessary.
- #join and array_slice instead mb_substr
+ # join and array_slice instead mb_substr
$ar = array();
preg_match_all( '/./us', $word, $ar );
- if (!preg_match("/[a-zA-Z_]/us", $word))
+ if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
switch ( $case ) {
- case 'genitive': #родительный падеж
- if ((join('',array_slice($ar[0],-4))=='вики') || (join('',array_slice($ar[0],-4))=='Вики'))
- {}
- elseif (join('',array_slice($ar[0],-2))=='ї')
- $word = join('',array_slice($ar[0],0,-2)).'Ñ—Ñ©';
+ case 'genitive': # родительный падеж
+ if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) )
+ { }
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ї' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'Ñ—Ñ©';
break;
- case 'accusative': #винительный падеж
- #stub
+ case 'accusative': # винительный падеж
+ # stub
break;
}
return $word;
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2: return $forms[1];
case 3:
diff --git a/languages/classes/LanguageCy.php b/languages/classes/LanguageCy.php
index 9a395393..d7727de2 100644
--- a/languages/classes/LanguageCy.php
+++ b/languages/classes/LanguageCy.php
@@ -7,7 +7,7 @@
*/
class LanguageCy extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// FIXME: CLDR defines 4 plural forms; very different, actually.
// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#cy
diff --git a/languages/classes/LanguageDsb.php b/languages/classes/LanguageDsb.php
index 4ea1b893..1c97c8ad 100644
--- a/languages/classes/LanguageDsb.php
+++ b/languages/classes/LanguageDsb.php
@@ -27,7 +27,7 @@ class LanguageDsb extends Language {
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
switch ( abs( $count ) % 100 ) {
diff --git a/languages/classes/LanguageEo.php b/languages/classes/LanguageEo.php
index 822a43f7..7ec447e7 100644
--- a/languages/classes/LanguageEo.php
+++ b/languages/classes/LanguageEo.php
@@ -3,63 +3,103 @@
/** Esperanto (Esperanto)
*
* @ingroup Language
+ * @author Brion Vibber <brion@pobox.com>
*/
class LanguageEo extends Language {
+ /**
+ * Wrapper for charset conversions.
+ *
+ * In most languages, this calls through to standard system iconv(), but
+ * for Esperanto we're also adding a special pseudo-charset to convert
+ * accented characters to/from the ASCII-friendly "X" surrogate coding:
+ *
+ * cx = ĉ cxx = cx
+ * gx = Ä gxx = gx
+ * hx = ĥ hxx = hx
+ * jx = ĵ jxx = jx
+ * sx = Å sxx = sx
+ * ux = Å­ uxx = ux
+ * xx = x
+ *
+ * http://en.wikipedia.org/wiki/Esperanto_orthography#X-system
+ * http://eo.wikipedia.org/wiki/X-sistemo
+ *
+ * X-conversion is applied, in either direction, between "utf-8" and "x" charsets;
+ * this comes into effect when input is run through $wgRequest->getText() and the
+ * $wgEditEncoding is set to 'x'.
+ *
+ * In the long run, this should be moved out of here and into the client-side
+ * editor behavior; the original server-side translation system dates to 2002-2003
+ * when many browsers with really bad Unicode support were still in use.
+ *
+ * @param string $in input character set
+ * @param string $out output character set
+ * @param string $string text to be converted
+ * @return string
+ */
function iconv( $in, $out, $string ) {
- # Por multaj lingvoj, ĉi tiu nur voku la sisteman funkcion iconv()
- # Ni ankaÅ­ konvertu X-sistemajn surogotajn
- if( strcasecmp( $in, 'x' ) == 0 and strcasecmp( $out, 'utf-8' ) == 0) {
- $xu = array (
- 'xx' => 'x' , 'xX' => 'x' ,
- 'Xx' => 'X' , 'XX' => 'X' ,
- "Cx" => "\xc4\x88" , "CX" => "\xc4\x88" ,
- "cx" => "\xc4\x89" , "cX" => "\xc4\x89" ,
- "Gx" => "\xc4\x9c" , "GX" => "\xc4\x9c" ,
- "gx" => "\xc4\x9d" , "gX" => "\xc4\x9d" ,
- "Hx" => "\xc4\xa4" , "HX" => "\xc4\xa4" ,
- "hx" => "\xc4\xa5" , "hX" => "\xc4\xa5" ,
- "Jx" => "\xc4\xb4" , "JX" => "\xc4\xb4" ,
- "jx" => "\xc4\xb5" , "jX" => "\xc4\xb5" ,
- "Sx" => "\xc5\x9c" , "SX" => "\xc5\x9c" ,
- "sx" => "\xc5\x9d" , "sX" => "\xc5\x9d" ,
- "Ux" => "\xc5\xac" , "UX" => "\xc5\xac" ,
- "ux" => "\xc5\xad" , "uX" => "\xc5\xad"
- ) ;
- return preg_replace ( '/([cghjsu]x?)((?:xx)*)(?!x)/ei',
- 'strtr( "$1", $xu ) . strtr( "$2", $xu )', $string );
- } else if( strcasecmp( $in, 'UTF-8' ) == 0 and strcasecmp( $out, 'x' ) == 0 ) {
- $ux = array (
- 'x' => 'xx' , 'X' => 'Xx' ,
- "\xc4\x88" => "Cx" , "\xc4\x89" => "cx" ,
- "\xc4\x9c" => "Gx" , "\xc4\x9d" => "gx" ,
- "\xc4\xa4" => "Hx" , "\xc4\xa5" => "hx" ,
- "\xc4\xb4" => "Jx" , "\xc4\xb5" => "jx" ,
- "\xc5\x9c" => "Sx" , "\xc5\x9d" => "sx" ,
- "\xc5\xac" => "Ux" , "\xc5\xad" => "ux"
- ) ;
+ if ( strcasecmp( $in, 'x' ) == 0 && strcasecmp( $out, 'utf-8' ) == 0 ) {
+ return preg_replace_callback (
+ '/([cghjsu]x?)((?:xx)*)(?!x)/i',
+ array( $this, 'strrtxuCallback' ), $string );
+ } else if ( strcasecmp( $in, 'UTF-8' ) == 0 && strcasecmp( $out, 'x' ) == 0 ) {
# Double Xs only if they follow cxapelutaj literoj.
- return preg_replace( '/((?:[cghjsu]|\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]'.
- '|\xc5[\x9c\x9d\xac\xad])x*)/ei', 'strtr( "$1", $ux )', $string );
+ return preg_replace_callback(
+ '/((?:[cghjsu]|\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]|\xc5[\x9c\x9d\xac\xad])x*)/i',
+ array( $this, 'strrtuxCallback' ), $string );
}
return parent::iconv( $in, $out, $string );
}
+ function strrtuxCallback( $matches ) {
+ static $ux = array (
+ 'x' => 'xx' , 'X' => 'Xx' ,
+ "\xc4\x88" => "Cx" , "\xc4\x89" => "cx" ,
+ "\xc4\x9c" => "Gx" , "\xc4\x9d" => "gx" ,
+ "\xc4\xa4" => "Hx" , "\xc4\xa5" => "hx" ,
+ "\xc4\xb4" => "Jx" , "\xc4\xb5" => "jx" ,
+ "\xc5\x9c" => "Sx" , "\xc5\x9d" => "sx" ,
+ "\xc5\xac" => "Ux" , "\xc5\xad" => "ux"
+ );
+ return strtr( $matches[1], $ux );
+ }
+
+ function strrtxuCallback( $matches ) {
+ static $xu = array (
+ 'xx' => 'x' , 'xX' => 'x' ,
+ 'Xx' => 'X' , 'XX' => 'X' ,
+ "Cx" => "\xc4\x88" , "CX" => "\xc4\x88" ,
+ "cx" => "\xc4\x89" , "cX" => "\xc4\x89" ,
+ "Gx" => "\xc4\x9c" , "GX" => "\xc4\x9c" ,
+ "gx" => "\xc4\x9d" , "gX" => "\xc4\x9d" ,
+ "Hx" => "\xc4\xa4" , "HX" => "\xc4\xa4" ,
+ "hx" => "\xc4\xa5" , "hX" => "\xc4\xa5" ,
+ "Jx" => "\xc4\xb4" , "JX" => "\xc4\xb4" ,
+ "jx" => "\xc4\xb5" , "jX" => "\xc4\xb5" ,
+ "Sx" => "\xc5\x9c" , "SX" => "\xc5\x9c" ,
+ "sx" => "\xc5\x9d" , "sX" => "\xc5\x9d" ,
+ "Ux" => "\xc5\xac" , "UX" => "\xc5\xac" ,
+ "ux" => "\xc5\xad" , "uX" => "\xc5\xad"
+ );
+ return strtr( $matches[1], $xu ) . strtr( $matches[2], $xu );
+ }
+
function checkTitleEncoding( $s ) {
# Check for X-system backwards-compatibility URLs
- $ishigh = preg_match( '/[\x80-\xff]/', $s);
+ $ishigh = preg_match( '/[\x80-\xff]/', $s );
$isutf = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
'[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
- if($ishigh and !$isutf) {
+ if ( $ishigh and !$isutf ) {
# Assume Latin1
$s = utf8_encode( $s );
} else {
- if( preg_match( '/(\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]'.
+ if ( preg_match( '/(\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]' .
'|\xc5[\x9c\x9d\xac\xad])/', $s ) )
return $s;
}
- //if( preg_match( '/[cghjsu]x/i', $s ) )
+ // if( preg_match( '/[cghjsu]x/i', $s ) )
// return $this->iconv( 'x', 'utf-8', $s );
return $s;
}
diff --git a/languages/classes/LanguageEt.php b/languages/classes/LanguageEt.php
index c6729d99..226c2d73 100644
--- a/languages/classes/LanguageEt.php
+++ b/languages/classes/LanguageEt.php
@@ -9,9 +9,9 @@ class LanguageEt extends Language {
/**
* Avoid grouping whole numbers between 0 to 9999
*/
- function commafy($_) {
- if (!preg_match('/^\d{1,4}$/',$_)) {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ function commafy( $_ ) {
+ if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageFi.php b/languages/classes/LanguageFi.php
index d1348f03..e3d922c4 100644
--- a/languages/classes/LanguageFi.php
+++ b/languages/classes/LanguageFi.php
@@ -12,7 +12,7 @@ class LanguageFi extends Language {
# Invoked with {{GRAMMAR:case|word}}
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['fi'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['fi'][$case][$word] ) ) {
return $wgGrammarForms['fi'][$case][$word];
}
@@ -38,18 +38,18 @@ class LanguageFi extends Language {
$word .= 'n';
break;
case 'elative':
- $word .= ($aou ? 'sta' : 'stä');
+ $word .= ( $aou ? 'sta' : 'stä' );
break;
case 'partitive':
- $word .= ($aou ? 'a' : 'ä');
+ $word .= ( $aou ? 'a' : 'ä' );
break;
case 'illative':
# Double the last letter and add 'n'
# mb_substr has a compatibility function in GlobalFunctions.php
- $word = $word . mb_substr($word, -1) . 'n';
+ $word = $word . mb_substr( $word, -1 ) . 'n';
break;
case 'inessive':
- $word .= ($aou ? 'ssa' : 'ssä');
+ $word .= ( $aou ? 'ssa' : 'ssä' );
break;
}
return $word;
@@ -113,15 +113,15 @@ class LanguageFi extends Language {
);
$final = '';
- $tokens = explode ( ' ', $str);
- foreach( $tokens as $item ) {
- if ( !is_numeric($item) ) {
- if ( count ( explode( '-', $item ) ) == 3 && strlen($item) == 10 ) {
+ $tokens = explode ( ' ', $str );
+ foreach ( $tokens as $item ) {
+ if ( !is_numeric( $item ) ) {
+ if ( count ( explode( '-', $item ) ) == 3 && strlen( $item ) == 10 ) {
list( $yyyy, $mm, $dd ) = explode( '-', $item );
- $final .= ' ' . $this->date( "{$yyyy}{$mm}{$dd}00000000");
+ $final .= ' ' . $this->date( "{$yyyy}{$mm}{$dd}000000" );
continue;
}
- if( isset( $weekds[$item] ) ) {
+ if ( isset( $weekds[$item] ) ) {
$final .= ' ' . $weekds[$item];
continue;
}
diff --git a/languages/classes/LanguageFr.php b/languages/classes/LanguageFr.php
index 7341bb86..dec1204c 100644
--- a/languages/classes/LanguageFr.php
+++ b/languages/classes/LanguageFr.php
@@ -9,9 +9,9 @@ class LanguageFr extends Language {
* Use singular form for zero (see bug 7309)
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageGa.php b/languages/classes/LanguageGa.php
index 344fdc84..a55e5f30 100644
--- a/languages/classes/LanguageGa.php
+++ b/languages/classes/LanguageGa.php
@@ -9,13 +9,13 @@ class LanguageGa extends Language {
# Invoked with {{GRAMMAR:transformation|word}}
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['ga'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['ga'][$case][$word] ) ) {
return $wgGrammarForms['ga'][$case][$word];
}
switch ( $case ) {
case 'ainmlae':
- switch ($word) {
+ switch ( $word ) {
case 'an Domhnach':
$word = 'Dé Domhnaigh'; break;
case 'an Luan':
@@ -36,14 +36,14 @@ class LanguageGa extends Language {
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ga
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == 1 ) {
$index = 0;
- } elseif( $count == 2 ) {
+ } elseif ( $count == 2 ) {
$index = 1;
} else {
$index = 2;
diff --git a/languages/classes/LanguageGan.php b/languages/classes/LanguageGan.php
index 54202e48..da5e1d22 100644
--- a/languages/classes/LanguageGan.php
+++ b/languages/classes/LanguageGan.php
@@ -1,35 +1,35 @@
<?php
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageZh.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageZh.php' );
/**
* @ingroup Language
*/
class GanConverter extends LanguageConverter {
- function __construct($langobj, $maincode,
- $variants=array(),
- $variantfallbacks=array(),
+ function __construct( $langobj, $maincode,
+ $variants = array(),
+ $variantfallbacks = array(),
$flags = array(),
$manualLevel = array() ) {
$this->mDescCodeSep = ':';
$this->mDescVarSep = 'ï¼›';
- parent::__construct($langobj, $maincode,
+ parent::__construct( $langobj, $maincode,
$variants,
$variantfallbacks,
$flags,
- $manualLevel);
+ $manualLevel );
$names = array(
'gan' => '原文',
'gan-hans' => '简体',
'gan-hant' => 'ç¹é«”',
);
- $this->mVariantNames = array_merge($this->mVariantNames,$names);
+ $this->mVariantNames = array_merge( $this->mVariantNames, $names );
}
function loadDefaultTables() {
- require( dirname(__FILE__)."/../../includes/ZhConversion.php" );
+ require( dirname( __FILE__ ) . "/../../includes/ZhConversion.php" );
$this->mTables = array(
'gan-hans' => new ReplacementArray( $zh2Hans ),
'gan-hant' => new ReplacementArray( $zh2Hant ),
@@ -41,7 +41,7 @@ class GanConverter extends LanguageConverter {
to mark anything.
$noParse is there for compatibility with LanguageConvert::markNoConversion
*/
- function markNoConversion($text, $noParse = false) {
+ function markNoConversion( $text, $noParse = false ) {
return $text;
}
@@ -62,20 +62,20 @@ class LanguageGan extends LanguageZh {
global $wgHooks;
parent::__construct();
- $variants = array('gan','gan-hans','gan-hant');
+ $variants = array( 'gan', 'gan-hans', 'gan-hant' );
$variantfallbacks = array(
- 'gan' => array('gan-hans','gan-hant'),
- 'gan-hans' => array('gan'),
- 'gan-hant' => array('gan'),
+ 'gan' => array( 'gan-hans', 'gan-hant' ),
+ 'gan-hans' => array( 'gan' ),
+ 'gan-hant' => array( 'gan' ),
);
- $ml=array(
+ $ml = array(
'gan' => 'disable',
);
$this->mConverter = new GanConverter( $this, 'gan',
$variants, $variantfallbacks,
array(),
- $ml);
+ $ml );
$wgHooks['ArticleSaveComplete'][] = $this->mConverter;
}
@@ -84,13 +84,13 @@ class LanguageGan extends LanguageZh {
function segmentForDiff( $text ) {
return preg_replace(
"/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "' ' .\"$1\"", $text);
+ "' ' .\"$1\"", $text );
}
function unsegmentForDiff( $text ) {
return preg_replace(
"/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "\"$1\"", $text);
+ "\"$1\"", $text );
}
// word segmentation
@@ -103,7 +103,7 @@ class LanguageGan extends LanguageZh {
$terms = implode( '|', $termsArray );
$terms = self::convertDoubleWidth( $terms );
$terms = implode( '|', $this->mConverter->autoConvertToAllVariants( $terms ) );
- $ret = array_unique( explode('|', $terms) );
+ $ret = array_unique( explode( '|', $terms ) );
return $ret;
}
}
diff --git a/languages/classes/LanguageGd.php b/languages/classes/LanguageGd.php
index 6c307f60..1b1b278e 100644
--- a/languages/classes/LanguageGd.php
+++ b/languages/classes/LanguageGd.php
@@ -18,7 +18,7 @@ class LanguageGd extends Language {
*
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
$count = abs( $count );
diff --git a/languages/classes/LanguageGv.php b/languages/classes/LanguageGv.php
index 5683826d..6e25e21c 100644
--- a/languages/classes/LanguageGv.php
+++ b/languages/classes/LanguageGv.php
@@ -9,14 +9,14 @@
class LanguageGv extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
- if ($count > 0 && ($count % 20) === 0 ) {
+ if ( $count > 0 && ( $count % 20 ) === 0 ) {
return $forms[0];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[1];
case 2: return $forms[2];
default: return $forms[3];
diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php
index d8256cb8..95beca79 100644
--- a/languages/classes/LanguageHe.php
+++ b/languages/classes/LanguageHe.php
@@ -8,62 +8,58 @@
* @author Rotem Liss
*/
class LanguageHe extends Language {
+
/**
* Convert grammar forms of words.
*
* Available cases:
* "prefixed" (or "תחילית") - when the word has a prefix
*
- * @param string the word to convert
- * @param string the case
+ * @param $word String: the word to convert
+ * @param $case String: the case
*/
public function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['he'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['he'][$case][$word] ) ) {
return $wgGrammarForms['he'][$case][$word];
}
-
+
switch ( $case ) {
case 'prefixed':
case 'תחילית':
# Duplicate the "Waw" if prefixed
if ( substr( $word, 0, 2 ) == "ו" && substr( $word, 0, 4 ) != "וו" ) {
- $word = "ו".$word;
+ $word = "ו" . $word;
}
-
+
# Remove the "He" if prefixed
if ( substr( $word, 0, 2 ) == "×”" ) {
$word = substr( $word, 2 );
}
-
+
# Add a hyphen if non-Hebrew letters
if ( substr( $word, 0, 2 ) < "×" || substr( $word, 0, 2 ) > "ת" ) {
- $word = "Ö¾".$word;
+ $word = "Ö¾" . $word;
}
}
-
+
return $word;
}
-
+
/**
* Gets a number and uses the suited form of the word.
*
- * @param integer the number of items
- * @param string the first form (singular)
- * @param string the second form (plural)
- * @param string the third form (2 items, plural is used if not applicable and not specified
- * @param not used (for compatibility with ancestor)
- * @param not used (for compatibility with ancestor)
- *
- * @return string of the suited form of word
+ * @param $count Integer: the number of items
+ * @param $forms Array with 3 items: the three plural forms
+ * @return String: the suited form of word
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == '1' ) {
return $forms[0];
- } elseif ( $count == '2' && isset($forms[2]) ) {
+ } elseif ( $count == '2' && isset( $forms[2] ) ) {
return $forms[2];
} else {
return $forms[1];
diff --git a/languages/classes/LanguageHi.php b/languages/classes/LanguageHi.php
index 705c73bc..fc9d0de8 100644
--- a/languages/classes/LanguageHi.php
+++ b/languages/classes/LanguageHi.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Hindi (हिनà¥à¤¦à¥€)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageHi extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageHr.php b/languages/classes/LanguageHr.php
index d8e84876..888029be 100644
--- a/languages/classes/LanguageHr.php
+++ b/languages/classes/LanguageHr.php
@@ -7,15 +7,15 @@
class LanguageHr extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// FIXME: CLDR defines 4 plural forms instead of 3. Plural for for decimals is missing.
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
diff --git a/languages/classes/LanguageHsb.php b/languages/classes/LanguageHsb.php
index f1418782..1b83f5ab 100644
--- a/languages/classes/LanguageHsb.php
+++ b/languages/classes/LanguageHsb.php
@@ -28,7 +28,7 @@ class LanguageHsb extends Language {
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
switch ( abs( $count ) % 100 ) {
diff --git a/languages/classes/LanguageHu.php b/languages/classes/LanguageHu.php
index 7845bdbb..44ce330c 100644
--- a/languages/classes/LanguageHu.php
+++ b/languages/classes/LanguageHu.php
@@ -7,7 +7,7 @@
class LanguageHu extends Language {
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms[$this->getCode()][$case][$word]) ) {
+ if ( isset( $wgGrammarForms[$this->getCode()][$case][$word] ) ) {
return $wgGrammarForms[$this->getCode()][$case][$word];
}
diff --git a/languages/classes/LanguageHy.php b/languages/classes/LanguageHy.php
index 73777def..527a55f5 100644
--- a/languages/classes/LanguageHy.php
+++ b/languages/classes/LanguageHy.php
@@ -10,58 +10,58 @@ class LanguageHy extends Language {
# Invoked with {{grammar:case|word}}
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['hy'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['hy'][$case][$word] ) ) {
return $wgGrammarForms['hy'][$case][$word];
}
# These rules are not perfect, but they are currently only used for site names so it doesn't
# matter if they are wrong sometimes. Just add a special case for your site name if necessary.
- #join and array_slice instead mb_substr
+ # join and array_slice instead mb_substr
$ar = array();
preg_match_all( '/./us', $word, $ar );
- if (!preg_match("/[a-zA-Z_]/us", $word))
+ if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
switch ( $case ) {
- case 'genitive': #Õ½Õ¥Õ¼Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
- if (join('',array_slice($ar[0],-1))=='Õ¡')
- $word = join('',array_slice($ar[0],0,-1)).'Õ¡ÕµÕ«';
- elseif (join('',array_slice($ar[0],-1))=='Õ¸')
- $word=join('',array_slice($ar[0],0,-1)).'Õ¸ÕµÕ«';
- elseif (join('',array_slice($ar[0],-4))=='Õ£Õ«Ö€Ö„')
- $word=join('',array_slice($ar[0],0,-4)).'Õ£Ö€Ö„Õ«';
+ case 'genitive': # Õ½Õ¥Õ¼Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
+ if ( join( '', array_slice( $ar[0], -1 ) ) == 'Õ¡' )
+ $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Õ¡ÕµÕ«';
+ elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'Õ¸' )
+ $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Õ¸ÕµÕ«';
+ elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'Õ£Õ«Ö€Ö„' )
+ $word = join( '', array_slice( $ar[0], 0, -4 ) ) . 'Õ£Ö€Ö„Õ«';
else
- $word.='Õ«';
+ $word .= 'Õ«';
break;
- case 'dative': #ÕÖ€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
- #stub
+ case 'dative': # ÕÖ€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
+ # stub
break;
- case 'accusative': #Õ€Õ¡ÕµÖÕ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
- #stub
+ case 'accusative': # Õ€Õ¡ÕµÖÕ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
+ # stub
break;
case 'instrumental': #
- #stub
+ # stub
break;
case 'prepositional': #
- #stub
+ # stub
break;
}
return $word;
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return (abs($count) <= 1) ? $forms[0] : $forms[1];
+ return ( abs( $count ) <= 1 ) ? $forms[0] : $forms[1];
}
/*
* Armenian numeric format is "12 345,67" but "1234,56"
*/
- function commafy($_) {
- if (!preg_match('/^\d{1,4}$/',$_)) {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ function commafy( $_ ) {
+ if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageJa.php b/languages/classes/LanguageJa.php
index 4a24260b..c5a992d5 100644
--- a/languages/classes/LanguageJa.php
+++ b/languages/classes/LanguageJa.php
@@ -6,7 +6,7 @@
* @ingroup Language
*/
class LanguageJa extends Language {
- function wordSegmentation( $string ) {
+ function segmentByWord( $string ) {
// Strip known punctuation ?
// $s = preg_replace( '/\xe3\x80[\x80-\xbf]/', '', $s ); # U3000-303f
@@ -23,14 +23,6 @@ class LanguageJa extends Language {
return $s;
}
- function normalizeForSearch( $string ) {
- // Double-width roman characters
- $s = self::convertDoubleWidth( $string );
-
- # Do general case folding and UTF-8 armoring
- return parent::normalizeForSearch( $s );
- }
-
# Italic is not appropriate for Japanese script
# Unfortunately most browsers do not recognise this, and render <em> as italic
function emphasize( $text ) {
diff --git a/languages/classes/LanguageKaa.php b/languages/classes/LanguageKaa.php
index f9f61dbd..4c6710ed 100644
--- a/languages/classes/LanguageKaa.php
+++ b/languages/classes/LanguageKaa.php
@@ -51,7 +51,7 @@ class LanguageKaa extends Language {
*/
function commafy( $_ ) {
if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
- return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev($_) ) );
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageKk.deps.php b/languages/classes/LanguageKk.deps.php
index aa7361bb..0a2a8afb 100644
--- a/languages/classes/LanguageKk.deps.php
+++ b/languages/classes/LanguageKk.deps.php
@@ -5,5 +5,5 @@
// changed on a subsequent page view.
// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageKk_cyrl.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageKk_cyrl.php' );
diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php
index 318b82a8..e3caacc8 100644
--- a/languages/classes/LanguageKk.php
+++ b/languages/classes/LanguageKk.php
@@ -1,15 +1,15 @@
<?php
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageKk_cyrl.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageKk_cyrl.php' );
define( 'KK_C_UC', 'ÐӘБВГҒДЕÐЖЗИЙКҚЛМÐҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрÑтуұүфхһцчшщъыіьÑÑŽÑ' ); # Kazakh Cyrillic lowercase
define( 'KK_L_UC', 'AÄBCÇDEÉFGÄžHIÄ°ÃJKLMNÑOÖPQRSÅžTUÃœVWXYÃZ' ); # Kazakh Latin uppercase
define( 'KK_L_LC', 'aäbcçdeéfgğhıiïjklmnñoöpqrsştuüvwxyýz' ); # Kazakh Latin lowercase
-//define( 'KK_A', 'ٴابپتجحدرزسشعÙقكلمنڭەوۇۋۆىيچھ' ); # Kazakh Arabic
+// define( 'KK_A', 'ٴابپتجحدرزسشعÙقكلمنڭەوۇۋۆىيچھ' ); # Kazakh Arabic
define( 'H_HAMZA', 'Ù´' ); # U+0674 ARABIC LETTER HIGH HAMZA
-//define( 'ZWNJ', '‌' ); # U+200C ZERO WIDTH NON-JOINER
+// define( 'ZWNJ', '‌' ); # U+200C ZERO WIDTH NON-JOINER
/** Kazakh (Қазақша)
* converter routines
@@ -18,10 +18,10 @@ define( 'H_HAMZA', 'Ù´' ); # U+0674 ARABIC LETTER HIGH HAMZA
*/
class KkConverter extends LanguageConverter {
- function __construct($langobj, $maincode,
- $variants=array(),
- $variantfallbacks=array(),
- $flags = array()) {
+ function __construct( $langobj, $maincode,
+ $variants = array(),
+ $variantfallbacks = array(),
+ $flags = array() ) {
parent::__construct( $langobj, $maincode,
$variants, $variantfallbacks, $flags );
@@ -46,9 +46,9 @@ class KkConverter extends LanguageConverter {
'kk-cyrl' => new ReplacementArray( $kk2Cyrl ),
'kk-latn' => new ReplacementArray( $kk2Latn ),
'kk-arab' => new ReplacementArray( $kk2Arab ),
- 'kk-kz' => new ReplacementArray( array_merge($kk2Cyrl, $kk2KZ) ),
- 'kk-tr' => new ReplacementArray( array_merge($kk2Latn, $kk2TR) ),
- 'kk-cn' => new ReplacementArray( array_merge($kk2Arab, $kk2CN) ),
+ 'kk-kz' => new ReplacementArray( array_merge( $kk2Cyrl, $kk2KZ ) ),
+ 'kk-tr' => new ReplacementArray( array_merge( $kk2Latn, $kk2TR ) ),
+ 'kk-cn' => new ReplacementArray( array_merge( $kk2Arab, $kk2CN ) ),
'kk' => new ReplacementArray()
);
}
@@ -62,24 +62,24 @@ class KkConverter extends LanguageConverter {
function loadRegs() {
$this->mCyrl2Latn = array(
- ## Punctuation
+ # # Punctuation
'/â„–/u' => 'No.',
- ## Е after vowels
+ # # Е after vowels
'/([ÐӘЕÐИОӨҰҮЭЮЯЪЬ])Е/u' => '$1YE',
'/([ÐӘЕÐИОӨҰҮЭЮЯЪЬ])е/ui' => '$1ye',
- ## leading ÐЮЯЩ
- '/^Ð(['.KK_C_UC.']|$)/u' => 'YO$1', '/^Ð(['.KK_C_LC.']|$)/u' => 'Yo$1',
- '/^Ю(['.KK_C_UC.']|$)/u' => 'YU$1', '/^Ю(['.KK_C_LC.']|$)/u' => 'Yu$1',
- '/^Я(['.KK_C_UC.']|$)/u' => 'YA$1', '/^Я(['.KK_C_LC.']|$)/u' => 'Ya$1',
- '/^Щ(['.KK_C_UC.']|$)/u' => 'ŞÇ$1', '/^Щ(['.KK_C_LC.']|$)/u' => 'Şç$1',
- ## other ÐЮЯ
+ # # leading ÐЮЯЩ
+ '/^Ð([' . KK_C_UC . ']|$)/u' => 'YO$1', '/^Ð([' . KK_C_LC . ']|$)/u' => 'Yo$1',
+ '/^Ю([' . KK_C_UC . ']|$)/u' => 'YU$1', '/^Ю([' . KK_C_LC . ']|$)/u' => 'Yu$1',
+ '/^Я([' . KK_C_UC . ']|$)/u' => 'YA$1', '/^Я([' . KK_C_LC . ']|$)/u' => 'Ya$1',
+ '/^Щ([' . KK_C_UC . ']|$)/u' => 'ŞÇ$1', '/^Щ([' . KK_C_LC . ']|$)/u' => 'Şç$1',
+ # # other ÐЮЯ
'/Ð/u' => 'YO', '/Ñ‘/u' => 'yo',
'/Ю/u' => 'YU', '/ю/u' => 'yu',
'/Я/u' => 'YA', '/Ñ/u' => 'ya',
'/Щ/u' => 'ŞÇ', '/щ/u' => 'şç',
- ## soft and hard signs
+ # # soft and hard signs
'/[ъЪ]/u' => 'ʺ', '/[ьЬ]/u' => 'ʹ',
- ## other characters
+ # # other characters
'/Ð/u' => 'A', '/а/u' => 'a', '/Ó˜/u' => 'Ä', '/Ó™/u' => 'ä',
'/Б/u' => 'B', '/б/u' => 'b', '/В/u' => 'V', '/в/u' => 'v',
'/Г/u' => 'G', '/г/u' => 'g', '/Ғ/u' => 'Ğ', '/ғ/u' => 'ğ',
@@ -101,24 +101,24 @@ class KkConverter extends LanguageConverter {
);
$this->mLatn2Cyrl = array(
- ## Punctuation
+ # # Punctuation
'/#|No\./' => 'â„–',
- ## Şç
- '/ŞÇʹ/u'=> 'ЩЬ', '/Şçʹ/u'=> 'Щь', '/Şçʹ/u'=> 'Щь',
+ # # Şç
+ '/ŞÇʹ/u' => 'ЩЬ', '/Şçʹ/u' => 'Щь', '/Şçʹ/u' => 'Щь',
'/Ş[Çç]/u' => 'Щ', '/şç/u' => 'щ',
- ## soft and hard signs
- '/(['.KK_L_UC.'])ʺ(['.KK_L_UC.'])/u' => '$1Ъ$2',
- '/ʺ(['.KK_L_LC.'])/u' => 'ъ$1',
- '/(['.KK_L_UC.'])ʹ(['.KK_L_UC.'])/u' => '$1Ь$2',
- '/ʹ(['.KK_L_LC.'])/u' => 'ь$1',
+ # # soft and hard signs
+ '/([' . KK_L_UC . '])ʺ([' . KK_L_UC . '])/u' => '$1Ъ$2',
+ '/ʺ([' . KK_L_LC . '])/u' => 'ъ$1',
+ '/([' . KK_L_UC . '])ʹ([' . KK_L_UC . '])/u' => '$1Ь$2',
+ '/ʹ([' . KK_L_LC . '])/u' => 'ь$1',
'/ʺ/u' => 'ъ',
'/ʹ/u' => 'ь',
- ## Ye Yo Yu Ya.
+ # # Ye Yo Yu Ya.
'/Y[Ee]/u' => 'Е', '/ye/u' => 'е',
'/Y[Oo]/u' => 'Ð', '/yo/u' => 'Ñ‘',
'/Y[UWuw]/u' => 'Ю', '/y[uw]/u' => 'ю',
'/Y[Aa]/u' => 'Я', '/ya/u' => 'Ñ',
- ## other characters
+ # # other characters
'/A/u' => 'Ð', '/a/u' => 'а', '/Ä/u' => 'Ó˜', '/ä/u' => 'Ó™',
'/B/u' => 'Б', '/b/u' => 'б', '/C/u' => 'Ц', '/c/u' => 'ц',
'/Ç/u' => 'Ч', '/ç/u' => 'ч', '/D/u' => 'Д', '/d/u' => 'д',
@@ -140,14 +140,14 @@ class KkConverter extends LanguageConverter {
);
$this->mCyLa2Arab = array(
- ## Punctuation -> Arabic
+ # # Punctuation -> Arabic
'/#|â„–|No\./u' => 'Ø€', # &#x0600;
'/\,/' => '،', # &#x060C;
'/;/' => 'Ø›', # &#x061B;
'/\?/' => 'ØŸ', # &#x061F;
'/%/' => 'Ùª', # &#x066A;
'/\*/' => 'Ù­', # &#x066D;
- ## Digits -> Arabic
+ # # Digits -> Arabic
'/0/' => 'Û°', # &#x06F0;
'/1/' => 'Û±', # &#x06F1;
'/2/' => 'Û²', # &#x06F2;
@@ -158,7 +158,7 @@ class KkConverter extends LanguageConverter {
'/7/' => 'Û·', # &#x06F7;
'/8/' => 'Û¸', # &#x06F8;
'/9/' => 'Û¹', # &#x06F9;
- ## Cyrillic -> Arabic
+ # # Cyrillic -> Arabic
'/Ðллаһ/ui' => 'ï·²',
'/([ÐӘЕÐИОӨҰҮЭЮЯЪЬ])е/ui' => '$1ÙŠÛ•',
'/[еÑ]/ui' => 'Û•', '/[ÑŠÑŒ]/ui' => '',
@@ -166,14 +166,14 @@ class KkConverter extends LanguageConverter {
'/[и]/ui' => 'ىي', '/Ñ‘/ui' => 'يو', '/ÑŽ/ui' => 'ÙŠÛ‹', '/Ñ/ui' => 'يا', '/[й]/ui' => 'ÙŠ',
'/ц/ui' => 'تس', '/щ/ui' => 'شش',
'/һ/ui' => 'ح', '/ч/ui' => 'تش',
- #'/һ/ui' => 'ھ', '/ч/ui' => 'چ',
+ # '/һ/ui' => 'ھ', '/ч/ui' => 'چ',
'/б/ui' => 'ب', '/в/ui' => 'ۆ', '/г/ui' => 'گ', '/ғ/ui' => 'ع',
'/д/ui' => 'د', '/ж/ui' => 'ج', '/з/ui' => 'ز', '/к/ui' => 'ك',
'/қ/ui' => 'ق', '/л/ui' => 'ل', '/м/ui' => 'م', '/н/ui' => 'ن',
'/Ò£/ui' => 'Ú­', '/п/ui' => 'Ù¾', '/Ñ€/ui' => 'ر', '/Ñ/ui' => 'س',
'/Ñ‚/ui' => 'ت', '/у/ui' => 'Û‹', '/Ñ„/ui' => 'Ù', '/Ñ…/ui' => 'Ø­',
'/ш/ui' => 'ش',
- ## Latin -> Arabic // commented for now...
+ # # Latin -> Arabic // commented for now...
/*'/Allah/ui' => 'ï·²',
'/[eé]/ui' => 'ە', '/[yý]/ui' => 'ي', '/[ʺʹ]/ui' => '',
'/[aä]/ui' => 'ا', '/[oö]/ui' => 'و', '/[uü]/ui' => 'ۇ',
@@ -195,13 +195,13 @@ class KkConverter extends LanguageConverter {
update: delete all rule parsing because it's not used
currently, and just produces a couple of bugs
*/
- function parseManualRule($rule, $flags=array()) {
- if(in_array('T',$flags)){
- return parent::parseManualRule($rule, $flags);
+ function parseManualRule( $rule, $flags = array() ) {
+ if ( in_array( 'T', $flags ) ) {
+ return parent::parseManualRule( $rule, $flags );
}
// otherwise ignore all formatting
- foreach($this->mVariants as $v) {
+ foreach ( $this->mVariants as $v ) {
$carray[$v] = $rule;
}
@@ -216,116 +216,115 @@ class KkConverter extends LanguageConverter {
*/
function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
// check for user namespace
- if(is_object($nt)){
+ if ( is_object( $nt ) ) {
$ns = $nt->getNamespace();
- if($ns==NS_USER || $ns==NS_USER_TALK)
+ if ( $ns == NS_USER || $ns == NS_USER_TALK )
return;
}
- $oldlink=$link;
+ $oldlink = $link;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if( $this->getPreferredVariant()==$this->mMainLanguageCode )
- $link=$oldlink;
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ $link = $oldlink;
}
/*
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*/
- function autoConvert($text, $toVariant=false) {
+ function autoConvert( $text, $toVariant = false ) {
global $wgTitle;
- if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_FILE){
+ if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
$imagename = $wgTitle->getNsText();
- if(preg_match("/^$imagename:/",$text)) return $text;
+ if ( preg_match( "/^$imagename:/", $text ) ) return $text;
}
- return parent::autoConvert($text,$toVariant);
+ return parent::autoConvert( $text, $toVariant );
}
/**
* It translates text into variant
*/
- function translate( $text, $toVariant ){
- global $wgContLanguageCode;
+ function translate( $text, $toVariant ) {
+ global $wgLanguageCode;
$text = parent::translate( $text, $toVariant );
- $letters = '';
switch( $toVariant ) {
case 'kk-cyrl':
case 'kk-kz':
$letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
- $wgContLanguageCode = 'kk';
+ $wgLanguageCode = 'kk';
break;
case 'kk-latn':
case 'kk-tr':
$letters = KK_C_UC . KK_C_LC . 'â„–0123456789';
- $wgContLanguageCode = 'kk-Latn';
+ $wgLanguageCode = 'kk-Latn';
break;
case 'kk-arab':
case 'kk-cn':
- $letters = KK_C_UC.KK_C_LC./*KK_L_UC.KK_L_LC.'ʺʹ'.*/',;\?%\*№0123456789';
- $wgContLanguageCode = 'kk-Arab';
+ $letters = KK_C_UC . KK_C_LC . /*KK_L_UC.KK_L_LC.'ʺʹ'.*/',;\?%\*№0123456789';
+ $wgLanguageCode = 'kk-Arab';
break;
default:
- $wgContLanguageCode = 'kk';
+ $wgLanguageCode = 'kk';
return $text;
}
// disable conversion variables like $1, $2...
$varsfix = '\$[0-9]';
- $matches = preg_split( '/' . $varsfix . '[^' . $letters . ']+/u', $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
+ $matches = preg_split( '/' . $varsfix . '[^' . $letters . ']+/u', $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
$mstart = 0;
$ret = '';
- foreach( $matches as $m ) {
- $ret .= substr( $text, $mstart, $m[1]-$mstart );
+ foreach ( $matches as $m ) {
+ $ret .= substr( $text, $mstart, $m[1] -$mstart );
$ret .= $this->regsConverter( $m[0], $toVariant );
- $mstart = $m[1] + strlen($m[0]);
+ $mstart = $m[1] + strlen( $m[0] );
}
return $ret;
}
function regsConverter( $text, $toVariant ) {
- if ($text == '') return $text;
+ if ( $text == '' ) {
+ return $text;
+ }
- $pat = array();
- $rep = array();
switch( $toVariant ) {
case 'kk-arab':
case 'kk-cn':
- $letters = KK_C_LC.KK_C_UC/*.KK_L_LC.KK_L_UC*/;
+ $letters = KK_C_LC . KK_C_UC/*.KK_L_LC.KK_L_UC*/;
$front = 'әөүіӘӨҮІ'/*.'äöüiÄÖÜİ'*/;
$excludes = 'еÑгғкқЕЭГҒКҚ'/*.'eégÄŸkqEÉGÄžKQ'*/;
// split text to words
- $matches = preg_split( '/[\b\s\-\.:]+/', $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
+ $matches = preg_split( '/[\b\s\-\.:]+/', $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
$mstart = 0;
$ret = '';
- foreach( $matches as $m ) {
+ foreach ( $matches as $m ) {
$ret .= substr( $text, $mstart, $m[1] - $mstart );
// is matched the word to front vowels?
// exclude a words matched to е, Ñ, г, к, к, Ò›,
// them should be without hamza
- if ( preg_match('/['.$front.']/u', $m[0]) && !preg_match('/['.$excludes.']/u', $m[0]) ) {
- $ret .= preg_replace('/['.$letters.']+/u', H_HAMZA.'$0', $m[0]);
+ if ( preg_match( '/[' . $front . ']/u', $m[0] ) && !preg_match( '/[' . $excludes . ']/u', $m[0] ) ) {
+ $ret .= preg_replace( '/[' . $letters . ']+/u', H_HAMZA . '$0', $m[0] );
} else {
$ret .= $m[0];
}
- $mstart = $m[1] + strlen($m[0]);
+ $mstart = $m[1] + strlen( $m[0] );
}
$text =& $ret;
- foreach( $this->mCyLa2Arab as $pat => $rep ) {
+ foreach ( $this->mCyLa2Arab as $pat => $rep ) {
$text = preg_replace( $pat, $rep, $text );
}
return $text;
break;
case 'kk-latn':
case 'kk-tr':
- foreach( $this->mCyrl2Latn as $pat => $rep ) {
+ foreach ( $this->mCyrl2Latn as $pat => $rep ) {
$text = preg_replace( $pat, $rep, $text );
}
return $text;
break;
case 'kk-cyrl':
case 'kk-kz':
- foreach( $this->mLatn2Cyrl as $pat => $rep ) {
+ foreach ( $this->mLatn2Cyrl as $pat => $rep ) {
$text = preg_replace( $pat, $rep, $text );
}
return $text;
@@ -339,8 +338,8 @@ class KkConverter extends LanguageConverter {
* We want our external link captions to be converted in variants,
* so we return the original text instead -{$text}-, except for URLs
*/
- function markNoConversion( $text, $noParse=false ) {
- if( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
+ function markNoConversion( $text, $noParse = false ) {
+ if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
return parent::markNoConversion( $text );
return $text;
}
@@ -399,7 +398,7 @@ class LanguageKk extends LanguageKk_cyrl {
*/
function ucfirst ( $string ) {
$variant = $this->getPreferredVariant();
- if ( ($variant == 'kk-latn' || $variant == 'kk-tr') && $string[0] == 'i' ) {
+ if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'i' ) {
$string = 'Ä°' . substr( $string, 1 );
} else {
$string = parent::ucfirst( $string );
@@ -413,7 +412,7 @@ class LanguageKk extends LanguageKk_cyrl {
*/
function lcfirst ( $string ) {
$variant = $this->getPreferredVariant();
- if ( ($variant == 'kk-latn' || $variant == 'kk-tr') && $string[0] == 'I' ) {
+ if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'I' ) {
$string = 'ı' . substr( $string, 1 );
} else {
$string = parent::lcfirst( $string );
diff --git a/languages/classes/LanguageKk_cyrl.php b/languages/classes/LanguageKk_cyrl.php
index e0a1b125..78febae1 100644
--- a/languages/classes/LanguageKk_cyrl.php
+++ b/languages/classes/LanguageKk_cyrl.php
@@ -27,24 +27,24 @@ class LanguageKk_cyrl extends Language {
$allVowels = array( "е", "Ó©", "Ò¯", "Ñ–", "Ó™", "Ñ", "а", "о", "Ò±", "Ñ‹", "Ñ", "Ñ‘", "и" );
// Preceding letters
$Nasals = array( "м", "н", "ң" );
- $Sonants = array( "и", "й", "л", "р", "у", "ю");
+ $Sonants = array( "и", "й", "л", "р", "у", "ю" );
$Consonants = array( "п", "Ñ„", "к", "Ò›", "Ñ‚", "ш", "Ñ", "Ñ…", "ц", "ч", "щ", "б", "в", "г", "д" );
$Sibilants = array( "ж", "з" );
- $Sonorants = array( "и", "й", "л", "р", "у", "ю", "м", "н", "ң", "ж", "з");
+ $Sonorants = array( "и", "й", "л", "р", "у", "ю", "м", "н", "ң", "ж", "з" );
// Possessives
$firstPerson = array( "м", "ң" ); // 1st singular, 2nd unformal
$secondPerson = array( "з" ); // 1st plural, 2nd formal
$thirdPerson = array( "Ñ‹", "Ñ–" ); // 3rd
- $lastLetter = self::lastLetter( $word, $allVowels );
+ $lastLetter = $this->lastLetter( $word, $allVowels );
$wordEnding =& $lastLetter[0];
$wordLastVowel =& $lastLetter[1];
// Now convert the word
switch ( $case ) {
case "dc1":
- case "genitive": #ilik
+ case "genitive": # ilik
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "Ñ‚Ñ–Ò£";
@@ -57,7 +57,7 @@ class LanguageKk_cyrl extends Language {
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "ның";
}
- } elseif ( in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants )) {
+ } elseif ( in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "дің";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -66,7 +66,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc2":
- case "dative": #barıs
+ case "dative": # barıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ке";
@@ -82,7 +82,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc21":
- case "possessive dative": #täweldık + barıs
+ case "possessive dative": # täweldık + barıs
if ( in_array( $wordEnding, $firstPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "е";
@@ -104,7 +104,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc3":
- case "accusative": #tabıs
+ case "accusative": # tabıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "Ñ‚Ñ–";
@@ -112,13 +112,13 @@ class LanguageKk_cyrl extends Language {
$word = $word . "Ñ‚Ñ‹";
}
} elseif ( in_array( $wordEnding, $allVowels ) ) {
- if ( in_array($wordLastVowel, $frontVowels ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ні";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "ны";
}
- } elseif ( in_array( $wordEnding, $Sonorants) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ } elseif ( in_array( $wordEnding, $Sonorants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ді";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "ды";
@@ -126,7 +126,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc31":
- case "possessive accusative": #täweldık + tabıs
+ case "possessive accusative": # täweldık + tabıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ді";
@@ -138,7 +138,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc4":
- case "locative": #jatıs
+ case "locative": # jatıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "те";
@@ -146,7 +146,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "та";
}
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonorants ) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "де";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "да";
@@ -154,7 +154,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc41":
- case "possessive locative": #täweldık + jatıs
+ case "possessive locative": # täweldık + jatıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "де";
@@ -162,7 +162,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "да";
}
} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "нде";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "нда";
@@ -170,20 +170,20 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc5":
- case "ablative": #şığıs
+ case "ablative": # şığıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "тен";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "тан";
}
- } elseif ( in_array($wordEnding, $allVowels ) || in_array($wordEnding, $Sonants ) || in_array($wordEnding, $Sibilants ) ) {
+ } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ден";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "дан";
}
- } elseif ( in_array($wordEnding, $Nasals ) ) {
+ } elseif ( in_array( $wordEnding, $Nasals ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "нен";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -192,14 +192,14 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc51":
- case "possessive ablative": #täweldık + şığıs
+ case "possessive ablative": # täweldık + şığıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "нен";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "нан";
}
- } elseif ( in_array($wordEnding, $secondPerson ) ) {
+ } elseif ( in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ден";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -208,7 +208,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc6":
- case "comitative": #kömektes
+ case "comitative": # kömektes
if ( in_array( $wordEnding, $Consonants ) ) {
$word = $word . "пен";
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
@@ -218,7 +218,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc61":
- case "possessive comitative": #täweldık + kömektes
+ case "possessive comitative": # täweldık + kömektes
if ( in_array( $wordEnding, $Consonants ) ) {
$word = $word . "пенен";
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
@@ -227,7 +227,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "бенен";
}
break;
- default: #dc0 #nominative #ataw
+ default: # dc0 #nominative #ataw
}
return $word;
}
@@ -247,24 +247,24 @@ class LanguageKk_cyrl extends Language {
$allVowels = array( "e", "ö", "ü", "i", "ä", "é", "a", "o", "u", "ı" );
// Preceding letters
$Nasals = array( "m", "n", "ñ" );
- $Sonants = array( "ï", "y", "ý", "l", "r", "w");
+ $Sonants = array( "ï", "y", "ý", "l", "r", "w" );
$Consonants = array( "p", "f", "k", "q", "t", "ş", "s", "x", "c", "ç", "b", "v", "g", "d" );
$Sibilants = array( "j", "z" );
- $Sonorants = array( "ï", "y", "ý", "l", "r", "w", "m", "n", "ñ", "j", "z");
+ $Sonorants = array( "ï", "y", "ý", "l", "r", "w", "m", "n", "ñ", "j", "z" );
// Possessives
$firstPerson = array( "m", "ñ" ); // 1st singular, 2nd unformal
$secondPerson = array( "z" ); // 1st plural, 2nd formal
$thirdPerson = array( "ı", "i" ); // 3rd
- $lastLetter = self::lastLetter( $word, $allVowels );
+ $lastLetter = $this->lastLetter( $word, $allVowels );
$wordEnding =& $lastLetter[0];
$wordLastVowel =& $lastLetter[1];
// Now convert the word
switch ( $case ) {
case "dc1":
- case "genitive": #ilik
+ case "genitive": # ilik
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "tiñ";
@@ -277,7 +277,7 @@ class LanguageKk_cyrl extends Language {
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "nıñ";
}
- } elseif ( in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants )) {
+ } elseif ( in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "diñ";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -286,7 +286,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc2":
- case "dative": #barıs
+ case "dative": # barıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ke";
@@ -302,7 +302,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc21":
- case "possessive dative": #täweldık + barıs
+ case "possessive dative": # täweldık + barıs
if ( in_array( $wordEnding, $firstPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "e";
@@ -324,7 +324,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc3":
- case "accusative": #tabıs
+ case "accusative": # tabıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ti";
@@ -332,13 +332,13 @@ class LanguageKk_cyrl extends Language {
$word = $word . "tı";
}
} elseif ( in_array( $wordEnding, $allVowels ) ) {
- if ( in_array($wordLastVowel, $frontVowels ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ni";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "nı";
}
- } elseif ( in_array( $wordEnding, $Sonorants) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ } elseif ( in_array( $wordEnding, $Sonorants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "di";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "dı";
@@ -346,7 +346,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc31":
- case "possessive accusative": #täweldık + tabıs
+ case "possessive accusative": # täweldık + tabıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "di";
@@ -358,7 +358,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc4":
- case "locative": #jatıs
+ case "locative": # jatıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "te";
@@ -366,7 +366,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "ta";
}
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonorants ) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "de";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "da";
@@ -374,7 +374,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc41":
- case "possessive locative": #täweldık + jatıs
+ case "possessive locative": # täweldık + jatıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "de";
@@ -382,7 +382,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "da";
}
} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "nde";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "nda";
@@ -390,20 +390,20 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc5":
- case "ablative": #şığıs
+ case "ablative": # şığıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ten";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "tan";
}
- } elseif ( in_array($wordEnding, $allVowels ) || in_array($wordEnding, $Sonants ) || in_array($wordEnding, $Sibilants ) ) {
+ } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "den";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "dan";
}
- } elseif ( in_array($wordEnding, $Nasals ) ) {
+ } elseif ( in_array( $wordEnding, $Nasals ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "nen";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -412,14 +412,14 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc51":
- case "possessive ablative": #täweldık + şığıs
+ case "possessive ablative": # täweldık + şığıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "nen";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "nan";
}
- } elseif ( in_array($wordEnding, $secondPerson ) ) {
+ } elseif ( in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "den";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -428,7 +428,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc6":
- case "comitative": #kömektes
+ case "comitative": # kömektes
if ( in_array( $wordEnding, $Consonants ) ) {
$word = $word . "pen";
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
@@ -438,7 +438,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc61":
- case "possessive comitative": #täweldık + kömektes
+ case "possessive comitative": # täweldık + kömektes
if ( in_array( $wordEnding, $Consonants ) ) {
$word = $word . "penen";
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
@@ -447,7 +447,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "benen";
}
break;
- default: #dc0 #nominative #ataw
+ default: # dc0 #nominative #ataw
}
return $word;
}
@@ -467,24 +467,24 @@ class LanguageKk_cyrl extends Language {
$allVowels = array( "ە", "ٶ", "ٷ", "ٸ", "ٵ", "ە", "ا", "و", "ۇ", "ى" );
// Preceding letters
$Nasals = array( "Ù…", "Ù†", "Ú­" );
- $Sonants = array( "ي", "ي", "ل", "ر", "ۋ");
+ $Sonants = array( "ي", "ي", "ل", "ر", "ۋ" );
$Consonants = array( "Ù¾", "Ù", "Ùƒ", "Ù‚", "ت", "Ø´", "س", "Ø­", "تس", "Ú†", "ب", "Û†", "Ú¯", "د" );
$Sibilants = array( "ج", "ز" );
- $Sonorants = array( "ي", "ي", "ل", "ر", "ۋ", "م", "ن", "ڭ", "ج", "ز");
+ $Sonorants = array( "ي", "ي", "ل", "ر", "ۋ", "م", "ن", "ڭ", "ج", "ز" );
// Possessives
$firstPerson = array( "Ù…", "Ú­" ); // 1st singular, 2nd unformal
$secondPerson = array( "ز" ); // 1st plural, 2nd formal
$thirdPerson = array( "Ù‰", "Ù¸" ); // 3rd
- $lastLetter = self::lastLetter( $word, $allVowels );
- $wordEnding =& $lastLetter[0];
- $wordLastVowel =& $lastLetter[1];
+ $lastLetter = $this->lastLetter( $word, $allVowels );
+ $wordEnding = $lastLetter[0];
+ $wordLastVowel = $lastLetter[1];
// Now convert the word
switch ( $case ) {
case "dc1":
- case "genitive": #ilik
+ case "genitive": # ilik
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "تٸڭ";
@@ -497,7 +497,7 @@ class LanguageKk_cyrl extends Language {
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "نىڭ";
}
- } elseif ( in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants )) {
+ } elseif ( in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دٸڭ";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -506,7 +506,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc2":
- case "dative": #barıs
+ case "dative": # barıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ÙƒÛ•";
@@ -522,7 +522,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc21":
- case "possessive dative": #täweldık + barıs
+ case "possessive dative": # täweldık + barıs
if ( in_array( $wordEnding, $firstPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "Û•";
@@ -544,7 +544,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc3":
- case "accusative": #tabıs
+ case "accusative": # tabıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "تٸ";
@@ -552,13 +552,13 @@ class LanguageKk_cyrl extends Language {
$word = $word . "تى";
}
} elseif ( in_array( $wordEnding, $allVowels ) ) {
- if ( in_array($wordLastVowel, $frontVowels ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "نٸ";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "نى";
}
- } elseif ( in_array( $wordEnding, $Sonorants) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ } elseif ( in_array( $wordEnding, $Sonorants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دٸ";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "دى";
@@ -566,7 +566,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc31":
- case "possessive accusative": #täweldık + tabıs
+ case "possessive accusative": # täweldık + tabıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دٸ";
@@ -578,7 +578,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc4":
- case "locative": #jatıs
+ case "locative": # jatıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "تە";
@@ -586,7 +586,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "تا";
}
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonorants ) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دە";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "دا";
@@ -594,7 +594,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc41":
- case "possessive locative": #täweldık + jatıs
+ case "possessive locative": # täweldık + jatıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دە";
@@ -602,7 +602,7 @@ class LanguageKk_cyrl extends Language {
$word = $word . "دا";
}
} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
- if ( in_array( $wordLastVowel, $frontVowels) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ندە";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "ندا";
@@ -610,20 +610,20 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc5":
- case "ablative": #şığıs
+ case "ablative": # şığıs
if ( in_array( $wordEnding, $Consonants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "تەن";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "تان";
}
- } elseif ( in_array($wordEnding, $allVowels ) || in_array($wordEnding, $Sonants ) || in_array($wordEnding, $Sibilants ) ) {
+ } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دەن";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "دان";
}
- } elseif ( in_array($wordEnding, $Nasals ) ) {
+ } elseif ( in_array( $wordEnding, $Nasals ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "Ù†Û•Ù†";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -632,14 +632,14 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc51":
- case "possessive ablative": #täweldık + şığıs
+ case "possessive ablative": # täweldık + şığıs
if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "Ù†Û•Ù†";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "نان";
}
- } elseif ( in_array($wordEnding, $secondPerson ) ) {
+ } elseif ( in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دەن";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -648,7 +648,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc6":
- case "comitative": #kömektes
+ case "comitative": # kömektes
if ( in_array( $wordEnding, $Consonants ) ) {
$word = $word . "Ù¾Û•Ù†";
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
@@ -658,7 +658,7 @@ class LanguageKk_cyrl extends Language {
}
break;
case "dc61":
- case "possessive comitative": #täweldık + kömektes
+ case "possessive comitative": # täweldık + kömektes
if ( in_array( $wordEnding, $Consonants ) ) {
$word = $word . "Ù¾Û•Ù†Û•Ù†";
} elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
@@ -667,17 +667,16 @@ class LanguageKk_cyrl extends Language {
$word = $word . "بەنەن";
}
break;
- default: #dc0 #nominative #ataw
+ default: # dc0 #nominative #ataw
}
return $word;
}
function lastLetter( $word, $allVowels ) {
$lastLetter = array();
- $ar = array();
// Put the word in a form we can play with since we're using UTF-8
- $ar = preg_split('//u', parent::lc($word), -1, PREG_SPLIT_NO_EMPTY);
+ $ar = preg_split( '//u', parent::lc( $word ), -1, PREG_SPLIT_NO_EMPTY );
// Here's an array with the order of the letters in the word reversed
// so we can find a match quicker *shrug*
@@ -712,7 +711,7 @@ class LanguageKk_cyrl extends Language {
*/
function commafy( $_ ) {
if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
- return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev($_) ) );
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageKm.php b/languages/classes/LanguageKm.php
index 831feb9c..128152f7 100644
--- a/languages/classes/LanguageKm.php
+++ b/languages/classes/LanguageKm.php
@@ -6,7 +6,7 @@
* @author Niklas Laxström
*/
class LanguageKm extends Language {
- function commafy($_) {
+ function commafy( $_ ) {
/* NO-op for Khmer. Cannot use
* $separatorTransformTable = array( ',' => '' )
* That would break when parsing and doing strstr '' => 'foo';
diff --git a/languages/classes/LanguageKsh.php b/languages/classes/LanguageKsh.php
index b21cc4d7..6d70b896 100644
--- a/languages/classes/LanguageKsh.php
+++ b/languages/classes/LanguageKsh.php
@@ -7,6 +7,166 @@
* @author Purodha Blissenbach
*/
class LanguageKsh extends Language {
+ static $familygender = array(
+ // Do not add male wiki families, since that's the default.
+ // No need add neuter wikis having names ending in -wiki.
+ 'wikipedia' => 'f',
+ 'wikiversity' => 'f',
+ 'wiktionary' => 'n',
+ 'wikibooks' => 'n',
+ 'wikiquote' => 'n',
+ 'wikisource' => 'n',
+ 'wikitravel' => 'n',
+ 'wikia' => 'f',
+ 'translatewiki.net' => 'n',
+ );
+ /**
+ * Convert from the nominative form of a noun to other cases.
+ * Invoked with {{GRAMMAR:case|word}} inside messages.
+ *
+ * case is a sequence of words, each of which is case insensitive.
+ * Between words, there must be at least one space character.
+ * Only the 1st character of each word is considered.
+ * Word order is irrelevant.
+ *
+ * Possible values specifying the grammatical case are:
+ * 1, Nominative
+ * 2, Genitive
+ * 3, Dative
+ * 4, Accusative, -omitted-
+ *
+ * Possible values specifying the article type are:
+ * Betoont focussed or stressed article
+ * -omitted- unstressed or unfocussed article
+ *
+ * Possible values for for the type of genitive are:
+ * Sing, Iehr prepositioned genitive = possessive dative
+ * Vun, Fon, -omitted- postpositioned genitive
+ * = preposition "vun" with dative
+ *
+ * Values of case overrides & prepositions, in the order of preceedence:
+ * Sing, Iehr possessive dative = prepositioned genitive
+ * Vun, Fon preposition "vun" with dative
+ * = postpositioned genitive
+ * En, em preposition "en" with dative
+ *
+ * Values for object gender specifiers of the possessive dative, or
+ * prepositioned genitive, evaluated with "Sing, Iehr" of above only:
+ * Male a singular male object follows
+ * -omitted- a non-male or plural object follows
+ *
+ * We currently handle definite articles of the singular only.
+ * There is a full set of test cases at:
+ * http://translatewiki.net/wiki/Portal:Ksh#GRAMMAR_Pr%C3%B6%C3%B6fe
+ * Contents of the leftmost table column can be copied and pasted as
+ * "case" values.
+ *
+ */
+ function convertGrammar( $word, $case )
+ {
+ $lord = strtolower($word);
+ $gender = 'm'; // Nuutnaarel // default
+ if ( preg_match ( '/wiki$/', $lord ) )
+ {
+ $gender = 'n'; // Dat xyz-wiki
+ }
+ if ( isset( self::$familygender[$lord] ) )
+ {
+ $gender = (self::$familygender[$lord]);
+ }
+ $case = (' '.strtolower($case));
+ if ( preg_match( '/ [is]/', $case ) )
+ {
+ # däm WikiMaatplaz singe, dä Wikipeedija iere, däm Wikiwööterbooch singe
+ # dem/em WikiMaatplaz singe, de Wikipeedija iere, dem/em Wikiwööterbooch singe
+ # däm WikiMaatplaz sing, dä Wikipeedija ier, däm Wikiwööterbooch sing
+ # dem/em WikiMaatplaz sing, de Wikipeedija ier, dem/em Wikiwööterbooch sing
+ $word = ( preg_match( '/ b/', $case )
+ ? ($gender=='f'
+ ? 'dä'
+ : 'däm'
+ )
+ : ($gender=='f'
+ ? 'de'
+ : 'dem'
+ )
+ ).
+ ' '.$word.' '.
+ ( $gender=='f'
+ ? 'ier'
+ : 'sing'
+ ).
+ ( preg_match( '/ m/', $case )
+ ? 'e'
+ : ''
+ );
+ }
+ elseif ( preg_match( '/ e/', $case ) )
+ {
+ # en dämm WikiMaatPlaz, en dä Wikipeedija, en dämm Wikiwööterbooch
+ # em WikiMaatplaz, en de Wikipeedija, em Wikiwööterbooch
+ if ( preg_match( '/ b/', $case ) )
+ {
+ $word = ('en '.($gender=='f'?'dä':'däm').' '.$word);
+ }
+ else
+ {
+ $word = (($gender=='f'?'en de':'em').' '.$word);
+ }
+ }
+ elseif ( preg_match( '/ [fv]/', $case ) || preg_match( '/ [2jg]/', $case ) )
+ {
+ # vun däm WikiMaatplaz, vun dä Wikipeedija, vun däm Wikiwööterbooch
+ # vum WikiMaatplaz, vun de Wikipeedija, vum Wikiwööterbooch
+ if ( preg_match( '/ b/', $case ) )
+ {
+ $word = ('vun '.($gender=='f'?'dä':'däm').' '.$word);
+ }
+ else
+ {
+ $word = (($gender=='f'?'vun de':'vum').' '.$word);
+ }
+ }
+ elseif ( preg_match( '/ [3d]/', $case ) )
+ {
+ # dämm WikiMaatPlaz, dä Wikipeedija, dämm Wikiwööterbooch
+ # dem/em WikiMaatplaz, de Wikipeedija, dem/em Wikiwööterbooch
+ if ( preg_match( '/ b/', $case ) )
+ {
+ $word = (($gender=='f'?'dää':'dämm').' '.$word);
+ }
+ else
+ {
+ $word = (($gender=='f'?'de':'dem').' '.$word);
+ }
+ }
+ else
+ {
+ # dä WikiMaatPlaz, di Wikipeedija, dat Wikiwööterbooch
+ # der WikiMaatplaz, de Wikipeedija, et Wikiwööterbooch
+ if ( preg_match( '/ b/', $case ) )
+ {
+ switch ( $gender )
+ {
+ case 'm' : $lord = 'dä' ; break ;
+ case 'f' : $lord = 'di' ; break ;
+ default : $lord = 'dat' ; break ;
+ }
+ }
+ else
+ {
+ switch ( $gender )
+ {
+ case 'm' : $lord = 'der' ; break ;
+ case 'f' : $lord = 'de' ; break ;
+ default : $lord = 'et' ; break ;
+ }
+ }
+ $word = ($lord.' '.$word);
+ }
+ return($word);
+ }
+
/**
* Avoid grouping whole numbers between 0 to 9999
*/
@@ -22,7 +182,7 @@ class LanguageKsh extends Language {
* Handle cases of (1, other, 0) or (1, other)
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == 1 ) {
diff --git a/languages/classes/LanguageKu.deps.php b/languages/classes/LanguageKu.deps.php
index 43e2916c..a187b778 100644
--- a/languages/classes/LanguageKu.deps.php
+++ b/languages/classes/LanguageKu.deps.php
@@ -5,5 +5,5 @@
// changed on a subsequent page view.
// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageKu_ku.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageKu_ku.php' );
diff --git a/languages/classes/LanguageKu.php b/languages/classes/LanguageKu.php
index 5ce68c57..1cc4f017 100644
--- a/languages/classes/LanguageKu.php
+++ b/languages/classes/LanguageKu.php
@@ -1,9 +1,9 @@
<?php
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageKu_ku.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageKu_ku.php' );
-/** Kurdish
- * converter routines
+/**
+ * Kurdish converter routines
*
* @ingroup Language
*/
@@ -18,8 +18,8 @@ class KuConverter extends LanguageConverter {
// Ùˆ Ùƒ=> ku -- ist auch richtig
/* Doppel- und Halbvokale */
- 'Úµ' => 'll', #ll
- 'Ú•' => 'rr', #rr
+ 'Úµ' => 'll', # ll
+ 'Ú•' => 'rr', # rr
'ا' => 'a',
# 'ئێ' => 'ê', # initial e
'Û•' => 'e',
@@ -69,7 +69,7 @@ class KuConverter extends LanguageConverter {
# 'rr' => 'ڕ', # selbiges für doppel-r
/* Einzelne Großbuchstaben */
- //' C' => 'ج',
+ // ' C' => 'ج',
/* Vowels */
'a' => 'ا',
@@ -140,25 +140,25 @@ class KuConverter extends LanguageConverter {
*/
function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
// check for user namespace
- if(is_object($nt)){
+ if ( is_object( $nt ) ) {
$ns = $nt->getNamespace();
- if($ns==NS_USER || $ns==NS_USER_TALK)
+ if ( $ns == NS_USER || $ns == NS_USER_TALK )
return;
}
- $oldlink=$link;
+ $oldlink = $link;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if( $this->getPreferredVariant() == $this->mMainLanguageCode )
- $link=$oldlink;
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ $link = $oldlink;
}
/*
* We want our external link captions to be converted in variants,
* so we return the original text instead -{$text}-, except for URLs
*/
- function markNoConversion($text, $noParse=false) {
- if($noParse || preg_match("/^https?:\/\/|ftp:\/\/|irc:\/\//",$text))
- return parent::markNoConversion($text);
+ function markNoConversion( $text, $noParse = false ) {
+ if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
+ return parent::markNoConversion( $text );
return $text;
}
@@ -166,24 +166,22 @@ class KuConverter extends LanguageConverter {
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*/
- function autoConvert($text, $toVariant=false) {
+ function autoConvert( $text, $toVariant = false ) {
global $wgTitle;
- if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_FILE){
+ if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
$imagename = $wgTitle->getNsText();
- if(preg_match("/^$imagename:/",$text)) return $text;
+ if ( preg_match( "/^$imagename:/", $text ) ) return $text;
}
- return parent::autoConvert($text,$toVariant);
+ return parent::autoConvert( $text, $toVariant );
}
/**
* It translates text into variant, specials:
* - ommiting roman numbers
*/
- function translate($text, $toVariant){
- $breaks = '[^\w\x80-\xff]';
-
+ function translate( $text, $toVariant ) {
/* From Kazakh interface, maybe we need it later
- *
+ $breaks = '[^\w\x80-\xff]';
// regexp for roman numbers
$roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
$roman = '';
@@ -207,7 +205,7 @@ class KuConverter extends LanguageConverter {
return $ret;
*/
- if( !isset( $this->mTables[$toVariant] ) ) {
+ if ( !isset( $this->mTables[$toVariant] ) ) {
throw new MWException( "Broken variant table: " . implode( ',', array_keys( $this->mTables ) ) );
}
@@ -216,6 +214,8 @@ class KuConverter extends LanguageConverter {
}
/**
+ * Kurdish (Kurdî / كوردی)
+ *
* @ingroup Language
*/
class LanguageKu extends LanguageKu_ku {
diff --git a/languages/classes/LanguageKu_ku.php b/languages/classes/LanguageKu_ku.php
index cf2107ec..a9ec64e6 100644
--- a/languages/classes/LanguageKu_ku.php
+++ b/languages/classes/LanguageKu_ku.php
@@ -12,7 +12,7 @@ class LanguageKu_ku extends Language {
function commafy( $_ ) {
if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
- return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev($_) ) );
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageLa.php b/languages/classes/LanguageLa.php
index c26d0e8e..81fc30cf 100644
--- a/languages/classes/LanguageLa.php
+++ b/languages/classes/LanguageLa.php
@@ -15,7 +15,7 @@ class LanguageLa extends Language {
*/
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['la'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['la'][$case][$word] ) ) {
return $wgGrammarForms['la'][$case][$word];
}
diff --git a/languages/classes/LanguageLn.php b/languages/classes/LanguageLn.php
index bcf5f6e3..11d276d8 100644
--- a/languages/classes/LanguageLn.php
+++ b/languages/classes/LanguageLn.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Lingala (Lingála)
*
* @ingroup Language
*/
@@ -10,9 +11,9 @@ class LanguageLn extends Language {
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageLt.php b/languages/classes/LanguageLt.php
index 87519d98..4291e797 100644
--- a/languages/classes/LanguageLt.php
+++ b/languages/classes/LanguageLt.php
@@ -11,15 +11,15 @@ class LanguageLt extends Language {
3 - penkiolika (15) lapų
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
- //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
- if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count%10==1 && $count%100!=11) return $forms[0];
- if ($count%10>=2 && ($count%100<10 || $count%100>=20)) return $forms[1];
+ if ( $count % 10 == 1 && $count % 100 != 11 ) return $forms[0];
+ if ( $count % 10 >= 2 && ( $count % 100 < 10 || $count % 100 >= 20 ) ) return $forms[1];
return $forms[2];
}
}
diff --git a/languages/classes/LanguageLv.php b/languages/classes/LanguageLv.php
index 84974c37..fea2d21f 100644
--- a/languages/classes/LanguageLv.php
+++ b/languages/classes/LanguageLv.php
@@ -15,14 +15,12 @@ class LanguageLv extends Language {
*
* Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}}
*
- * @param integer $count
- * @param string $wordform1
- * @param string $wordform2
- * @param string $wordform3 (not used)
- * @return string
+ * @param $count Integer
+ * @param $forms Array
+ * @return String
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// FIXME: CLDR defines 3 plural forms instead of 2. Form for 0 is missing.
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lv
diff --git a/languages/classes/LanguageMg.php b/languages/classes/LanguageMg.php
index 8593a298..54ef408f 100644
--- a/languages/classes/LanguageMg.php
+++ b/languages/classes/LanguageMg.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Malagasy (Malagasy)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageMg extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageMk.php b/languages/classes/LanguageMk.php
index 268365df..9dc8a560 100644
--- a/languages/classes/LanguageMk.php
+++ b/languages/classes/LanguageMk.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Macedonian (МакедонÑки)
*
* @ingroup Language
*/
@@ -9,7 +10,7 @@ class LanguageMk extends Language {
* http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mk
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
if ( $count % 10 === 1 && $count % 100 !== 11 ) {
diff --git a/languages/classes/LanguageMl.php b/languages/classes/LanguageMl.php
index 98b5fc96..3cd30eb2 100644
--- a/languages/classes/LanguageMl.php
+++ b/languages/classes/LanguageMl.php
@@ -1,14 +1,19 @@
<?php
+/**
+ * Malayalam (മലയാളം)
+ *
+ * @ingroup Language
+ */
class LanguageMl extends Language {
/**
- * Temporary hack for the issue described at
+ * Temporary hack for the issue described at
* http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46396
- * Convert Unicode 5.0 style Malayalam input to Unicode 5.1. Similar to
- * bug 9413. Also fixes miscellaneous problems due to mishandling of ZWJ,
+ * Convert Unicode 5.0 style Malayalam input to Unicode 5.1. Similar to
+ * bug 9413. Also fixes miscellaneous problems due to mishandling of ZWJ,
* e.g. bug 11162.
- *
- * FIXME: This is language-specific for now only to avoid the negative
+ *
+ * FIXME: This is language-specific for now only to avoid the negative
* performance impact of enabling it for all languages.
*/
function normalize( $s ) {
diff --git a/languages/classes/LanguageMo.php b/languages/classes/LanguageMo.php
index 83cfafb8..beeb04f8 100644
--- a/languages/classes/LanguageMo.php
+++ b/languages/classes/LanguageMo.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Moldavian (МолдовенÑÑкÑ)
*
* @ingroup Language
*/
@@ -7,7 +8,7 @@ class LanguageMo extends Language {
function convertPlural( $count, $forms ) {
// Plural rules per
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mo
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
diff --git a/languages/classes/LanguageMt.php b/languages/classes/LanguageMt.php
index fff779ac..fb271bf6 100644
--- a/languages/classes/LanguageMt.php
+++ b/languages/classes/LanguageMt.php
@@ -9,13 +9,13 @@
class LanguageMt extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 4 );
if ( $count === 1 ) $index = 0;
- elseif ( $count === 0 || ( $count%100>1 && $count%100<11) ) $index = 1;
- elseif ( $count%100>10 && $count%100<20 ) $index = 2;
+ elseif ( $count === 0 || ( $count % 100 > 1 && $count % 100 < 11 ) ) $index = 1;
+ elseif ( $count % 100 > 10 && $count % 100 < 20 ) $index = 2;
else $index = 3;
return $forms[$index];
}
diff --git a/languages/classes/LanguageMy.php b/languages/classes/LanguageMy.php
index d76b99e7..4fa5b05e 100644
--- a/languages/classes/LanguageMy.php
+++ b/languages/classes/LanguageMy.php
@@ -1,14 +1,13 @@
<?php
+
/** Burmese (Myanmasa)
*
* @ingroup Language
- * @file
*
* @author Niklas Laxström, 2008
*/
-
class LanguageMy extends Language {
- function commafy($_) {
+ function commafy( $_ ) {
/* NO-op. Cannot use
* $separatorTransformTable = array( ',' => '' )
* That would break when parsing and doing strstr '' => 'foo';
diff --git a/languages/classes/LanguageNso.php b/languages/classes/LanguageNso.php
index 1b56e76a..9ff89039 100644
--- a/languages/classes/LanguageNso.php
+++ b/languages/classes/LanguageNso.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Northern Sotho (Sesotho sa Leboa)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageNso extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguagePl.php b/languages/classes/LanguagePl.php
index bb798913..40477f42 100644
--- a/languages/classes/LanguagePl.php
+++ b/languages/classes/LanguagePl.php
@@ -6,7 +6,7 @@
*/
class LanguagePl extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
$count = abs( $count );
if ( $count == 1 )
@@ -22,9 +22,9 @@ class LanguagePl extends Language {
}
}
- function commafy($_) {
- if (!preg_match('/^\d{1,4}(.\d+)?$/',$_)) {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ function commafy( $_ ) {
+ if ( !preg_match( '/^\-?\d{1,4}(\.\d+)?$/', $_ ) ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguagePt_br.php b/languages/classes/LanguagePt_br.php
deleted file mode 100644
index 49726fe7..00000000
--- a/languages/classes/LanguagePt_br.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/** Brazilian Portugese (Portuguêsi do Brasil)
- *
- * @ingroup Language
- */
-class LanguagePt_br extends Language {
- /**
- * Use singular form for zero (see bug 7309)
- */
- function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ($count <= 1) ? $forms[0] : $forms[1];
- }
-}
diff --git a/languages/classes/LanguageRo.php b/languages/classes/LanguageRo.php
index 928f79fb..89edce11 100644
--- a/languages/classes/LanguageRo.php
+++ b/languages/classes/LanguageRo.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Romanian (Română)
*
* @ingroup Language
*/
@@ -7,7 +8,7 @@ class LanguageRo extends Language {
function convertPlural( $count, $forms ) {
// Plural rules per
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ro
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
diff --git a/languages/classes/LanguageRu.php b/languages/classes/LanguageRu.php
index bb737e84..8f027048 100644
--- a/languages/classes/LanguageRu.php
+++ b/languages/classes/LanguageRu.php
@@ -11,45 +11,45 @@ class LanguageRu extends Language {
# Invoked with {{grammar:case|word}}
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['ru'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['ru'][$case][$word] ) ) {
return $wgGrammarForms['ru'][$case][$word];
}
# These rules are not perfect, but they are currently only used for site names so it doesn't
# matter if they are wrong sometimes. Just add a special case for your site name if necessary.
- #join and array_slice instead mb_substr
+ # join and array_slice instead mb_substr
$ar = array();
preg_match_all( '/./us', $word, $ar );
- if (!preg_match("/[a-zA-Z_]/us", $word))
+ if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
switch ( $case ) {
- case 'genitive': #родительный падеж
- if ((join('',array_slice($ar[0],-4))=='вики') || (join('',array_slice($ar[0],-4))=='Вики'))
- {}
- elseif (join('',array_slice($ar[0],-1))=='ь')
- $word = join('',array_slice($ar[0],0,-1)).'Ñ';
- elseif (join('',array_slice($ar[0],-2))=='иÑ')
- $word=join('',array_slice($ar[0],0,-2)).'ии';
- elseif (join('',array_slice($ar[0],-2))=='ка')
- $word=join('',array_slice($ar[0],0,-2)).'ки';
- elseif (join('',array_slice($ar[0],-2))=='ти')
- $word=join('',array_slice($ar[0],0,-2)).'тей';
- elseif (join('',array_slice($ar[0],-2))=='ды')
- $word=join('',array_slice($ar[0],0,-2)).'дов';
- elseif (join('',array_slice($ar[0],-3))=='ник')
- $word=join('',array_slice($ar[0],0,-3)).'ника';
+ case 'genitive': # родительный падеж
+ if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) )
+ { }
+ elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' )
+ $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Ñ';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'иÑ' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ии';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ды' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дов';
+ elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' )
+ $word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
break;
- case 'dative': #дательный падеж
- #stub
+ case 'dative': # дательный падеж
+ # stub
break;
- case 'accusative': #винительный падеж
- #stub
+ case 'accusative': # винительный падеж
+ # stub
break;
- case 'instrumental': #творительный падеж
- #stub
+ case 'instrumental': # творительный падеж
+ # stub
break;
- case 'prepositional': #предложный падеж
- #stub
+ case 'prepositional': # предложный падеж
+ # stub
break;
}
return $word;
@@ -71,19 +71,19 @@ class LanguageRu extends Language {
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
- //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
- if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
// FIXME: CLDR defines 4 plural forms. Form with decimals missing.
// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ru
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
@@ -98,11 +98,11 @@ class LanguageRu extends Language {
* See manual of style at http://ru.wikipedia.org/wiki/ВикипедиÑ:Оформление_Ñтатей
* So "1 234 567", "12 345" but "1234"
*/
- function commafy($_) {
- if (preg_match('/^-?\d{1,4}(\.\d*)?$/',$_)) {
+ function commafy( $_ ) {
+ if ( preg_match( '/^-?\d{1,4}(\.\d*)?$/', $_ ) ) {
return $_;
} else {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
}
}
}
diff --git a/languages/classes/LanguageSe.php b/languages/classes/LanguageSe.php
index aac943d6..3011bc7f 100644
--- a/languages/classes/LanguageSe.php
+++ b/languages/classes/LanguageSe.php
@@ -1,18 +1,19 @@
<?php
/**
+ * Northern Sami (Sámegiella)
*
* @ingroup Language
*/
class LanguageSe extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#se
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == 1 ) {
$index = 0;
- } elseif( $count == 2 ) {
+ } elseif ( $count == 2 ) {
$index = 1;
} else {
$index = 2;
diff --git a/languages/classes/LanguageSh.php b/languages/classes/LanguageSh.php
index 29f06f4f..e62d7ba3 100644
--- a/languages/classes/LanguageSh.php
+++ b/languages/classes/LanguageSh.php
@@ -1,23 +1,24 @@
<?php
/**
+ * Serbo-Croatian (Srpskohrvatski / СрпÑкохрватÑки)
*
* @ingroup Language
*/
class LanguageSh extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
- //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
- if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
// FIXME: CLDR defines 4 plural forms. Form with decimals missing.
// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sh
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
diff --git a/languages/classes/LanguageSk.php b/languages/classes/LanguageSk.php
index 7ddbcbdb..ea74d1ba 100644
--- a/languages/classes/LanguageSk.php
+++ b/languages/classes/LanguageSk.php
@@ -6,7 +6,7 @@
*/
class LanguageSk extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == 1 ) {
diff --git a/languages/classes/LanguageSl.php b/languages/classes/LanguageSl.php
index 734b274c..09138ea5 100644
--- a/languages/classes/LanguageSl.php
+++ b/languages/classes/LanguageSl.php
@@ -12,7 +12,7 @@ class LanguageSl extends Language {
*/
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['sl'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['sl'][$case][$word] ) ) {
return $wgGrammarForms['sl'][$case][$word];
}
@@ -27,7 +27,7 @@ class LanguageSl extends Language {
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 5 );
if ( $count % 100 == 1 ) {
diff --git a/languages/classes/LanguageSma.php b/languages/classes/LanguageSma.php
index 5167fb08..a04c77da 100644
--- a/languages/classes/LanguageSma.php
+++ b/languages/classes/LanguageSma.php
@@ -1,18 +1,19 @@
<?php
/**
+ * Southern Sami (Ã…arjelsaemien)
*
* @ingroup Language
*/
class LanguageSma extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
// plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sma
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == 1 ) {
$index = 1;
- } elseif( $count == 2 ) {
+ } elseif ( $count == 2 ) {
$index = 2;
} else {
$index = 3;
diff --git a/languages/classes/LanguageSr.deps.php b/languages/classes/LanguageSr.deps.php
index ffdd234b..a3770378 100644
--- a/languages/classes/LanguageSr.deps.php
+++ b/languages/classes/LanguageSr.deps.php
@@ -5,5 +5,5 @@
// changed on a subsequent page view.
// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-require_once( dirname(__FILE__).'/LanguageSr_ec.php' );
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php
index 693660fb..35c90102 100644
--- a/languages/classes/LanguageSr.php
+++ b/languages/classes/LanguageSr.php
@@ -1,8 +1,8 @@
<?php
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageSr_ec.php' );
-require_once( dirname(__FILE__).'/LanguageSr_el.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
+require_once( dirname( __FILE__ ) . '/LanguageSr_el.php' );
/**
* There are two levels of conversion for Serbian: the script level
@@ -45,15 +45,15 @@ class SrConverter extends LanguageConverter {
'O' => 'О', 'P' => 'П', 'R' => 'Р', 'S' => 'С', 'Š' => 'Ш',
'T' => 'Т', 'U' => 'У', 'V' => 'В', 'Z' => 'З', 'Ž' => 'Ж',
- 'DŽ' => 'Ð', 'd!ž' => 'дж', 'D!ž'=> 'Дж', 'D!Ž'=> 'ДЖ',
- 'Lj' => 'Љ', 'l!j' => 'лј', 'L!j'=> 'Лј', 'L!J'=> 'ЛЈ',
- 'Nj' => 'Њ', 'n!j' => 'нј', 'N!j'=> 'Ðј', 'N!J'=> 'ÐЈ'
+ 'DŽ' => 'Ð', 'd!ž' => 'дж', 'D!ž' => 'Дж', 'D!Ž' => 'ДЖ',
+ 'Lj' => 'Љ', 'l!j' => 'лј', 'L!j' => 'Лј', 'L!J' => 'ЛЈ',
+ 'Nj' => 'Њ', 'n!j' => 'нј', 'N!j' => 'Ðј', 'N!J' => 'ÐЈ'
);
function loadDefaultTables() {
$this->mTables = array(
'sr-ec' => new ReplacementArray( $this->mToCyrillics ),
- 'sr-el' => new ReplacementArray( $this->mToLatin),
+ 'sr-el' => new ReplacementArray( $this->mToLatin ),
'sr' => new ReplacementArray()
);
}
@@ -63,13 +63,13 @@ class SrConverter extends LanguageConverter {
update: delete all rule parsing because it's not used
currently, and just produces a couple of bugs
*/
- function parseManualRule($rule, $flags=array()) {
- if(in_array('T',$flags)){
- return parent::parseManualRule($rule, $flags);
+ function parseManualRule( $rule, $flags = array() ) {
+ if ( in_array( 'T', $flags ) ) {
+ return parent::parseManualRule( $rule, $flags );
}
// otherwise ignore all formatting
- foreach($this->mVariants as $v) {
+ foreach ( $this->mVariants as $v ) {
$carray[$v] = $rule;
}
@@ -84,25 +84,25 @@ class SrConverter extends LanguageConverter {
*/
function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
// check for user namespace
- if(is_object($nt)){
+ if ( is_object( $nt ) ) {
$ns = $nt->getNamespace();
- if($ns==NS_USER || $ns==NS_USER_TALK)
+ if ( $ns == NS_USER || $ns == NS_USER_TALK )
return;
}
- $oldlink=$link;
+ $oldlink = $link;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if($this->getPreferredVariant()==$this->mMainLanguageCode)
- $link=$oldlink;
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ $link = $oldlink;
}
/*
* We want our external link captions to be converted in variants,
* so we return the original text instead -{$text}-, except for URLs
*/
- function markNoConversion($text, $noParse=false) {
- if($noParse || preg_match("/^https?:\/\/|ftp:\/\/|irc:\/\//",$text))
- return parent::markNoConversion($text);
+ function markNoConversion( $text, $noParse = false ) {
+ if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
+ return parent::markNoConversion( $text );
return $text;
}
@@ -110,39 +110,39 @@ class SrConverter extends LanguageConverter {
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*/
- function autoConvert($text, $toVariant=false) {
+ function autoConvert( $text, $toVariant = false ) {
global $wgTitle;
- if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_FILE){
+ if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
$imagename = $wgTitle->getNsText();
- if(preg_match("/^$imagename:/",$text)) return $text;
+ if ( preg_match( "/^$imagename:/", $text ) ) return $text;
}
- return parent::autoConvert($text,$toVariant);
+ return parent::autoConvert( $text, $toVariant );
}
/**
* It translates text into variant, specials:
* - ommiting roman numbers
*/
- function translate($text, $toVariant){
+ function translate( $text, $toVariant ) {
$breaks = '[^\w\x80-\xff]';
// regexp for roman numbers
$roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
- $reg = '/^'.$roman.'$|^'.$roman.$breaks.'|'.$breaks.$roman.'$|'.$breaks.$roman.$breaks.'/';
+ $reg = '/^' . $roman . '$|^' . $roman . $breaks . '|' . $breaks . $roman . '$|' . $breaks . $roman . $breaks . '/';
- $matches = preg_split($reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
+ $matches = preg_split( $reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
- $m = array_shift($matches);
- if( !isset( $this->mTables[$toVariant] ) ) {
+ $m = array_shift( $matches );
+ if ( !isset( $this->mTables[$toVariant] ) ) {
throw new MWException( "Broken variant table: " . implode( ',', array_keys( $this->mTables ) ) );
}
$ret = $this->mTables[$toVariant]->replace( $m[0] );
- $mstart = $m[1]+strlen($m[0]);
- foreach($matches as $m) {
- $ret .= substr($text, $mstart, $m[1]-$mstart);
- $ret .= parent::translate($m[0], $toVariant);
- $mstart = $m[1] + strlen($m[0]);
+ $mstart = $m[1] + strlen( $m[0] );
+ foreach ( $matches as $m ) {
+ $ret .= substr( $text, $mstart, $m[1] -$mstart );
+ $ret .= parent::translate( $m[0], $toVariant );
+ $mstart = $m[1] + strlen( $m[0] );
}
return $ret;
@@ -150,6 +150,8 @@ class SrConverter extends LanguageConverter {
}
/**
+ * Serbian (СрпÑки / Srpski)
+ *
* @ingroup Language
*/
class LanguageSr extends LanguageSr_ec {
@@ -158,7 +160,7 @@ class LanguageSr extends LanguageSr_ec {
parent::__construct();
- $variants = array('sr', 'sr-ec', 'sr-el');
+ $variants = array( 'sr', 'sr-ec', 'sr-el' );
$variantfallbacks = array(
'sr' => 'sr-ec',
'sr-ec' => 'sr',
@@ -169,24 +171,24 @@ class LanguageSr extends LanguageSr_ec {
'S' => 'S', 'пиÑмо' => 'S', 'pismo' => 'S',
'W' => 'W', 'реч' => 'W', 'reÄ' => 'W', 'ријеч' => 'W', 'rijeÄ' => 'W'
);
- $this->mConverter = new SrConverter($this, 'sr', $variants, $variantfallbacks, $flags);
+ $this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
$wgHooks['ArticleSaveComplete'][] = $this->mConverter;
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
- //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
- if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
// FIXME: CLDR defines 4 plural forms. Form with decimals missing.
// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ru
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
diff --git a/languages/classes/LanguageSr_ec.php b/languages/classes/LanguageSr_ec.php
index c7300198..ed447e5e 100644
--- a/languages/classes/LanguageSr_ec.php
+++ b/languages/classes/LanguageSr_ec.php
@@ -1,17 +1,19 @@
<?php
/**
+ * Serbian (cyrillic script)
+ *
* @ingroup Language
*/
class LanguageSr_ec extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
diff --git a/languages/classes/LanguageSr_el.deps.php b/languages/classes/LanguageSr_el.deps.php
index cec44dcc..67154c20 100644
--- a/languages/classes/LanguageSr_el.deps.php
+++ b/languages/classes/LanguageSr_el.deps.php
@@ -5,4 +5,4 @@
// changed on a subsequent page view.
// see http://mail.wikipedia.org/pipermail/wikitech-l/2006-January/033660.html
-require_once( dirname(__FILE__).'/LanguageSr_ec.php' );
+require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
diff --git a/languages/classes/LanguageSr_el.php b/languages/classes/LanguageSr_el.php
index 6ad55f4d..d43772af 100644
--- a/languages/classes/LanguageSr_el.php
+++ b/languages/classes/LanguageSr_el.php
@@ -1,17 +1,19 @@
<?php
/**
+ * Serbian (latin script)
+ *
* @ingroup Language
*/
class LanguageSr_el extends Language {
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
diff --git a/languages/classes/LanguageTg.php b/languages/classes/LanguageTg.php
index 3a2840db..f73e2ba8 100644
--- a/languages/classes/LanguageTg.php
+++ b/languages/classes/LanguageTg.php
@@ -1,6 +1,6 @@
<?php
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
/**
* Converts Tajiki to latin orthography
@@ -93,6 +93,8 @@ class TgConverter extends LanguageConverter {
}
/**
+ * Tajik (Тоҷикӣ)
+ *
* @ingroup Language
*/
class LanguageTg extends Language {
diff --git a/languages/classes/LanguageTi.php b/languages/classes/LanguageTi.php
index 1974915d..e37116b1 100644
--- a/languages/classes/LanguageTi.php
+++ b/languages/classes/LanguageTi.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Tigrinya (ትáŒáˆ­áŠ›)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageTi extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageTl.php b/languages/classes/LanguageTl.php
index 23b6ad6f..4495ddcc 100644
--- a/languages/classes/LanguageTl.php
+++ b/languages/classes/LanguageTl.php
@@ -1,5 +1,6 @@
<?php
/**
+ * Tagalog (Tagalog)
*
* @ingroup Language
*/
@@ -8,9 +9,9 @@ class LanguageTl extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
}
diff --git a/languages/classes/LanguageTr.php b/languages/classes/LanguageTr.php
index 57b0fd07..245b5b06 100644
--- a/languages/classes/LanguageTr.php
+++ b/languages/classes/LanguageTr.php
@@ -7,7 +7,7 @@
*/
class LanguageTr extends Language {
function ucfirst ( $string ) {
- if ( !empty($string) && $string[0] == 'i' ) {
+ if ( !empty( $string ) && $string[0] == 'i' ) {
return 'Ä°' . substr( $string, 1 );
} else {
return parent::ucfirst( $string );
diff --git a/languages/classes/LanguageTyv.php b/languages/classes/LanguageTyv.php
index d77f7966..9e5b6453 100644
--- a/languages/classes/LanguageTyv.php
+++ b/languages/classes/LanguageTyv.php
@@ -16,37 +16,37 @@ class LanguageTyv extends Language {
*/
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['tyv'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['tyv'][$case][$word] ) ) {
return $wgGrammarForms['tyv'][$case][$word];
}
- // Set up some constants...
- $allVowels = array("е", "и", "Ñ", "Ó©", "Ò¯", "а", "Ñ‘", "о", "у", "Ñ‹", "ÑŽ", "Ñ", "a", "e", "i", "o", "ö", "u", "ü", "y");
- $frontVowels = array("е", "и", "Ñ", "Ó©", "Ò¯", "e", "i", "ö", "ü");
- $backVowels = array("а", "Ñ‘", "о", "у", "Ñ‹", "ÑŽ", "Ñ", "a", "o", "u", "y");
- $unroundFrontVowels = array("е", "и", "Ñ", "e", "i");
- $roundFrontVowels = array("ө", "ү", "ö", "ü");
- $unroundBackVowels = array("а", "Ñ‹", "Ñ", "a", "y");
- $roundBackVowels = array("ё", "о", "у", "ю", "o", "u");
- $voicedPhonemes = array("д", "б", "з", "ж", "г", "d", "b", "z", "g");
- $unvoicedPhonemes = array("Ñ‚", "п", "Ñ", "ш", "к", "ч", "Ñ…", "t", "p", "s", "k", "x");
- $directiveUnvoicedStems = array("Ñ‚", "п", "Ñ", "ш", "к", "ч", "Ñ…", "л", "м", "н", "Ò£", "t", "p", "s", "k", "x", "l", "m", "n", "Å‹");
- $directiveVoicedStems = array("д", "б", "з", "ж", "г", "р", "й", "d", "b", "z", "g", "r", "j");
+ // Set up some constants...
+ $allVowels = array( "е", "и", "Ñ", "Ó©", "Ò¯", "а", "Ñ‘", "о", "у", "Ñ‹", "ÑŽ", "Ñ", "a", "e", "i", "o", "ö", "u", "ü", "y" );
+ $frontVowels = array( "е", "и", "Ñ", "Ó©", "Ò¯", "e", "i", "ö", "ü" );
+ $backVowels = array( "а", "Ñ‘", "о", "у", "Ñ‹", "ÑŽ", "Ñ", "a", "o", "u", "y" );
+ $unroundFrontVowels = array( "е", "и", "Ñ", "e", "i" );
+ $roundFrontVowels = array( "ө", "ү", "ö", "ü" );
+ $unroundBackVowels = array( "а", "Ñ‹", "Ñ", "a", "y" );
+ $roundBackVowels = array( "ё", "о", "у", "ю", "o", "u" );
+ $voicedPhonemes = array( "д", "б", "з", "ж", "г", "d", "b", "z", "g" );
+ $unvoicedPhonemes = array( "Ñ‚", "п", "Ñ", "ш", "к", "ч", "Ñ…", "t", "p", "s", "k", "x" );
+ $directiveUnvoicedStems = array( "Ñ‚", "п", "Ñ", "ш", "к", "ч", "Ñ…", "л", "м", "н", "Ò£", "t", "p", "s", "k", "x", "l", "m", "n", "Å‹" );
+ $directiveVoicedStems = array( "д", "б", "з", "ж", "г", "р", "й", "d", "b", "z", "g", "r", "j" );
-// $allSonants = array("л", "м", "н", "ң", "р", "й");
-// $allNasals = array("м", "н", "ң");
+ //$allSonants = array("л", "м", "н", "ң", "р", "й");
+ //$allNasals = array("м", "н", "ң");
- // Put the word in a form we can play with since we're using UTF-8
+ //Put the word in a form we can play with since we're using UTF-8
preg_match_all( '/./us', $word, $ar );
-
- $wordEnding = $ar[0][count($ar[0]) - 1]; //Here's the last letter in the word
- $wordReversed = array_reverse($ar[0]); //Here's an array with the order of the letters in the word reversed so we can find a match quicker *shrug*
- // Find the last vowel in the word
+ $wordEnding = $ar[0][count( $ar[0] ) - 1]; // Here's the last letter in the word
+ $wordReversed = array_reverse( $ar[0] ); // Here's an array with the order of the letters in the word reversed so we can find a match quicker *shrug*
+
+ // Find the last vowel in the word
$wordLastVowel = NULL;
foreach ( $wordReversed as $xvalue ) {
foreach ( $allVowels as $yvalue ) {
- if ( strcmp($xvalue, $yvalue) == 0 ) {
+ if ( strcmp( $xvalue, $yvalue ) == 0 ) {
$wordLastVowel = $xvalue;
break;
} else {
@@ -60,160 +60,160 @@ class LanguageTyv extends Language {
}
}
- // Now convert the word
+ // Now convert the word
switch ( $case ) {
case "genitive":
- if ( in_array($wordEnding, $unvoicedPhonemes) ) {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "Ñ‚Ò¯Ò£";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "тиң";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "туң";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "Ñ‚Ñ‹Ò£";
+ if ( in_array( $wordEnding, $unvoicedPhonemes ) ) {
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "Ñ‚Ò¯Ò£";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "тиң";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "туң";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "Ñ‚Ñ‹Ò£";
} else {
}
- } elseif ( $wordEnding === "л" || $wordEnding === "l") {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "дүң";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "диң";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "дуң";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "дың";
+ } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дүң";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "диң";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дуң";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дың";
} else {
}
} else {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "нүң";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "ниң";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "нуң";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "ның";
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "нүң";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ниң";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "нуң";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ның";
} else {
}
}
break;
case "dative":
- if ( in_array($wordEnding, $unvoicedPhonemes) ) {
- if ( in_array($wordLastVowel, $frontVowels) ) {
- $word = implode("",$ar[0]) . "ке";
- } elseif ( in_array($wordLastVowel, $backVowels) ) {
- $word = implode("",$ar[0]) . "ка";
+ if ( in_array( $wordEnding, $unvoicedPhonemes ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ке";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ка";
} else {
}
} else {
- if ( in_array($wordLastVowel, $frontVowels) ) {
- $word = implode("",$ar[0]) . "ге";
- } elseif ( in_array($wordLastVowel, $backVowels) ) {
- $word = implode("",$ar[0]) . "га";
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ге";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar[0] ) . "га";
} else {
}
}
break;
case "accusative":
- if ( in_array($wordEnding, $unvoicedPhonemes) ) {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "Ñ‚Ò¯";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "ти";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "ту";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "Ñ‚Ñ‹";
+ if ( in_array( $wordEnding, $unvoicedPhonemes ) ) {
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "Ñ‚Ò¯";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ти";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ту";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "Ñ‚Ñ‹";
} else {
}
- } elseif ( $wordEnding === "л" || $wordEnding === "l") {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "дү";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "ди";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "ду";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "ды";
+ } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дү";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ди";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ду";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ды";
} else {
}
} else {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "нү";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "ни";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "ну";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "ны";
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "нү";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ни";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ну";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ны";
} else {
}
}
break;
case "locative":
- if ( in_array($wordEnding, $unvoicedPhonemes) ) {
- if ( in_array($wordLastVowel, $frontVowels) ) {
- $word = implode("",$ar[0]) . "те";
- } elseif ( in_array($wordLastVowel, $backVowels) ) {
- $word = implode("",$ar[0]) . "та";
+ if ( in_array( $wordEnding, $unvoicedPhonemes ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "те";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar[0] ) . "та";
} else {
}
} else {
- if ( in_array($wordLastVowel, $frontVowels) ) {
- $word = implode("",$ar[0]) . "де";
- } elseif ( in_array($wordLastVowel, $backVowels) ) {
- $word = implode("",$ar[0]) . "да";
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "де";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar[0] ) . "да";
} else {
}
}
break;
case "ablative":
- if ( in_array($wordEnding, $unvoicedPhonemes) ) {
- if ( in_array($wordLastVowel, $frontVowels) ) {
- $word = implode("",$ar[0]) . "тен";
- } elseif ( in_array($wordLastVowel, $backVowels) ) {
- $word = implode("",$ar[0]) . "тан";
+ if ( in_array( $wordEnding, $unvoicedPhonemes ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "тен";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar[0] ) . "тан";
} else {
}
} else {
- if ( in_array($wordLastVowel, $frontVowels) ) {
- $word = implode("",$ar[0]) . "ден";
- } elseif ( in_array($wordLastVowel, $backVowels) ) {
- $word = implode("",$ar[0]) . "дан";
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "ден";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дан";
} else {
}
}
break;
case "directive1":
- if ( in_array($wordEnding, $directiveVoicedStems) ) {
- $word = implode("",$ar[0]) . "же";
- } elseif ( in_array($wordEnding, $directiveUnvoicedStems) ) {
- $word = implode("",$ar[0]) . "че";
+ if ( in_array( $wordEnding, $directiveVoicedStems ) ) {
+ $word = implode( "", $ar[0] ) . "же";
+ } elseif ( in_array( $wordEnding, $directiveUnvoicedStems ) ) {
+ $word = implode( "", $ar[0] ) . "че";
} else {
}
break;
case "directive2":
- if ( in_array($wordEnding, $unvoicedPhonemes) ) {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "түве";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "тиве";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "туве";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "тыве";
+ if ( in_array( $wordEnding, $unvoicedPhonemes ) ) {
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "түве";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "тиве";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "туве";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "тыве";
} else {
}
} else {
- if ( in_array($wordLastVowel, $roundFrontVowels) ) {
- $word = implode("",$ar[0]) . "дүве";
- } elseif ( in_array($wordLastVowel, $unroundFrontVowels) ) {
- $word = implode("",$ar[0]) . "диве";
- } elseif ( in_array($wordLastVowel, $roundBackVowels) ) {
- $word = implode("",$ar[0]) . "дуве";
- } elseif ( in_array($wordLastVowel, $unroundBackVowels) ) {
- $word = implode("",$ar[0]) . "дыве";
+ if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дүве";
+ } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
+ $word = implode( "", $ar[0] ) . "диве";
+ } elseif ( in_array( $wordLastVowel, $roundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дуве";
+ } elseif ( in_array( $wordLastVowel, $unroundBackVowels ) ) {
+ $word = implode( "", $ar[0] ) . "дыве";
} else {
}
}
diff --git a/languages/classes/LanguageUk.php b/languages/classes/LanguageUk.php
index 4b1dfde5..6c0cf8da 100644
--- a/languages/classes/LanguageUk.php
+++ b/languages/classes/LanguageUk.php
@@ -9,67 +9,67 @@ class LanguageUk extends Language {
# Invoked with {{grammar:case|word}}
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
- if ( isset($wgGrammarForms['uk'][$case][$word]) ) {
+ if ( isset( $wgGrammarForms['uk'][$case][$word] ) ) {
return $wgGrammarForms['uk'][$case][$word];
}
# These rules are not perfect, but they are currently only used for site names so it doesn't
# matter if they are wrong sometimes. Just add a special case for your site name if necessary.
- #join and array_slice instead mb_substr
+ # join and array_slice instead mb_substr
$ar = array();
preg_match_all( '/./us', $word, $ar );
- if (!preg_match("/[a-zA-Z_]/us", $word))
+ if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
switch ( $case ) {
- case 'genitive': #родовий відмінок
- if ((join('',array_slice($ar[0],-4))=='вікі') || (join('',array_slice($ar[0],-4))=='Вікі'))
- {}
- elseif (join('',array_slice($ar[0],-1))=='ь')
- $word = join('',array_slice($ar[0],0,-1)).'Ñ';
- elseif (join('',array_slice($ar[0],-2))=='Ñ–Ñ')
- $word=join('',array_slice($ar[0],0,-2)).'Ñ–Ñ—';
- elseif (join('',array_slice($ar[0],-2))=='ка')
- $word=join('',array_slice($ar[0],0,-2)).'ки';
- elseif (join('',array_slice($ar[0],-2))=='ти')
- $word=join('',array_slice($ar[0],0,-2)).'тей';
- elseif (join('',array_slice($ar[0],-2))=='ди')
- $word=join('',array_slice($ar[0],0,-2)).'дів';
- elseif (join('',array_slice($ar[0],-3))=='ник')
- $word=join('',array_slice($ar[0],0,-3)).'ника';
+ case 'genitive': # родовий відмінок
+ if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) )
+ { }
+ elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' )
+ $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Ñ';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'Ñ–Ñ' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'Ñ–Ñ—';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
+ elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' )
+ $word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
break;
- case 'dative': #давальний відмінок
- #stub
+ case 'dative': # давальний відмінок
+ # stub
break;
- case 'accusative': #знахідний відмінок
- if ((join('',array_slice($ar[0],-4))=='вікі') || (join('',array_slice($ar[0],-4))=='Вікі'))
- {}
- elseif (join('',array_slice($ar[0],-2))=='Ñ–Ñ')
- $word=join('',array_slice($ar[0],0,-2)).'Ñ–ÑŽ';
+ case 'accusative': # знахідний відмінок
+ if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) )
+ { }
+ elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'Ñ–Ñ' )
+ $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'Ñ–ÑŽ';
break;
- case 'instrumental': #орудний відмінок
- #stub
+ case 'instrumental': # орудний відмінок
+ # stub
break;
- case 'prepositional': #міÑцевий відмінок
- #stub
+ case 'prepositional': # міÑцевий відмінок
+ # stub
break;
}
return $word;
}
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
- //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
- if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
// FIXME: CLDR defines 4 plural forms. Form for decimals is missing/
// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#uk
$forms = $this->preConvertPlural( $forms, 3 );
- if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
return $forms[2];
} else {
- switch ($count % 10) {
+ switch ( $count % 10 ) {
case 1: return $forms[0];
case 2:
case 3:
@@ -82,10 +82,9 @@ class LanguageUk extends Language {
/*
* Ukrainian numeric format is "12 345,67" but "1234,56"
*/
-
- function commafy($_) {
- if (!preg_match('/^\d{1,4}$/',$_)) {
- return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_)));
+ function commafy( $_ ) {
+ if ( !preg_match( '/^\-?\d{1,4}(\.\d+)?$/', $_ ) ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
diff --git a/languages/classes/LanguageWa.php b/languages/classes/LanguageWa.php
index 4a4296ca..0cb439d0 100644
--- a/languages/classes/LanguageWa.php
+++ b/languages/classes/LanguageWa.php
@@ -13,18 +13,19 @@ class LanguageWa extends Language {
* Use singular form for zero
*/
function convertPlural( $count, $forms ) {
- if ( !count($forms) ) { return ''; }
+ if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 2 );
- return ($count <= 1) ? $forms[0] : $forms[1];
+ return ( $count <= 1 ) ? $forms[0] : $forms[1];
}
- ###
- ### Dates in Walloon are "1î d' <monthname>" for 1st of the month,
- ### "<day> di <monthname>" for months starting by a consoun, and
- ### "<day> d' <monthname>" for months starting with a vowel
- ###
+ ## #
+ ## # Dates in Walloon are "1î d' <monthname>" for 1st of the month,
+ ## # "<day> di <monthname>" for months starting by a consoun, and
+ ## # "<day> d' <monthname>" for months starting with a vowel
+ ## #
function date( $ts, $adj = false, $format = true, $tc = false ) {
+ $ts = wfTimestamp( TS_MW, $ts );
if ( $adj ) { $ts = $this->userAdjust( $ts, $tc ); }
$datePreference = $this->dateFormat( $format );
@@ -32,13 +33,13 @@ class LanguageWa extends Language {
#
# we also output this format for YMD (eg: 2001 January 15)
if ( $datePreference == 'ISO 8601' ) {
- $d = substr($ts, 0, 4). '-' . substr($ts, 4, 2). '-' .substr($ts, 6, 2);
+ $d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
return $d;
}
# dd/mm/YYYY format
if ( $datePreference == 'walloon short' ) {
- $d = substr($ts, 6, 2). '/' . substr($ts, 4, 2). '/' .substr($ts, 0, 4);
+ $d = substr( $ts, 6, 2 ) . '/' . substr( $ts, 4, 2 ) . '/' . substr( $ts, 0, 4 );
return $d;
}
@@ -47,17 +48,17 @@ class LanguageWa extends Language {
# we output this in all other cases
$m = substr( $ts, 4, 2 );
$n = substr( $ts, 6, 2 );
- if ($n == 1) {
+ if ( $n == 1 ) {
$d = "1î d' " . $this->getMonthName( $m ) .
" " . substr( $ts, 0, 4 );
- } else if ($n == 2 || $n == 3 || $n == 20 || $n == 22 || $n == 23) {
- $d = (0 + $n) . " d' " . $this->getMonthName( $m ) .
+ } else if ( $n == 2 || $n == 3 || $n == 20 || $n == 22 || $n == 23 ) {
+ $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
" " . substr( $ts, 0, 4 );
- } else if ($m == 4 || $m == 8 || $m == 10) {
- $d = (0 + $n) . " d' " . $this->getMonthName( $m ) .
+ } else if ( $m == 4 || $m == 8 || $m == 10 ) {
+ $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
" " . substr( $ts, 0, 4 );
} else {
- $d = (0 + $n) . " di " . $this->getMonthName( $m ) .
+ $d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
" " . substr( $ts, 0, 4 );
}
return $d;
diff --git a/languages/classes/LanguageYue.php b/languages/classes/LanguageYue.php
index 6581d788..aff3d29e 100644
--- a/languages/classes/LanguageYue.php
+++ b/languages/classes/LanguageYue.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Cantonese (粵語)
+ *
* @ingroup Language
*/
class LanguageYue extends Language {
@@ -12,12 +14,12 @@ class LanguageYue extends Language {
* for now just treat each character as a word.
* @todo Fixme: only do this for Han characters...
*/
- function wordSegmentation( $string ) {
+ function segmentByWord( $string ) {
$reg = "/([\\xc0-\\xff][\\x80-\\xbf]*)/";
$s = self::insertSpace( $string, $reg );
return $s;
}
-
+
function normalizeForSearch( $string ) {
wfProfileIn( __METHOD__ );
diff --git a/languages/classes/LanguageZh.deps.php b/languages/classes/LanguageZh.deps.php
index 542170a0..41874ff8 100644
--- a/languages/classes/LanguageZh.deps.php
+++ b/languages/classes/LanguageZh.deps.php
@@ -5,5 +5,5 @@
// changed on a subsequent page view.
// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-require_once( dirname(__FILE__).'/LanguageZh_hans.php' );
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageZh_hans.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php
index 0b88dbb2..0055a33b 100644
--- a/languages/classes/LanguageZh.php
+++ b/languages/classes/LanguageZh.php
@@ -1,25 +1,25 @@
<?php
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
-require_once( dirname(__FILE__).'/LanguageZh_hans.php' );
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( dirname( __FILE__ ) . '/LanguageZh_hans.php' );
/**
* @ingroup Language
*/
class ZhConverter extends LanguageConverter {
- function __construct($langobj, $maincode,
- $variants=array(),
- $variantfallbacks=array(),
+ function __construct( $langobj, $maincode,
+ $variants = array(),
+ $variantfallbacks = array(),
$flags = array(),
$manualLevel = array() ) {
$this->mDescCodeSep = ':';
$this->mDescVarSep = 'ï¼›';
- parent::__construct($langobj, $maincode,
+ parent::__construct( $langobj, $maincode,
$variants,
$variantfallbacks,
$flags,
- $manualLevel);
+ $manualLevel );
$names = array(
'zh' => '原文',
'zh-hans' => '简体',
@@ -31,20 +31,20 @@ class ZhConverter extends LanguageConverter {
'zh-sg' => '新加å¡',
'zh-my' => '大马',
);
- $this->mVariantNames = array_merge($this->mVariantNames,$names);
+ $this->mVariantNames = array_merge( $this->mVariantNames, $names );
}
function loadDefaultTables() {
- require( dirname(__FILE__)."/../../includes/ZhConversion.php" );
+ require( dirname( __FILE__ ) . "/../../includes/ZhConversion.php" );
$this->mTables = array(
'zh-hans' => new ReplacementArray( $zh2Hans ),
'zh-hant' => new ReplacementArray( $zh2Hant ),
- 'zh-cn' => new ReplacementArray( array_merge($zh2Hans, $zh2CN) ),
- 'zh-hk' => new ReplacementArray( array_merge($zh2Hant, $zh2HK) ),
- 'zh-mo' => new ReplacementArray( array_merge($zh2Hant, $zh2HK) ),
- 'zh-my' => new ReplacementArray( array_merge($zh2Hans, $zh2SG) ),
- 'zh-sg' => new ReplacementArray( array_merge($zh2Hans, $zh2SG) ),
- 'zh-tw' => new ReplacementArray( array_merge($zh2Hant, $zh2TW) ),
+ 'zh-cn' => new ReplacementArray( array_merge( $zh2Hans, $zh2CN ) ),
+ 'zh-hk' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
+ 'zh-mo' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
+ 'zh-my' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
+ 'zh-sg' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
+ 'zh-tw' => new ReplacementArray( array_merge( $zh2Hant, $zh2TW ) ),
'zh' => new ReplacementArray
);
}
@@ -62,7 +62,7 @@ class ZhConverter extends LanguageConverter {
to mark anything.
$noParse is there for compatibility with LanguageConvert::markNoConversion
*/
- function markNoConversion($text, $noParse = false) {
+ function markNoConversion( $text, $noParse = false ) {
return $text;
}
@@ -83,20 +83,20 @@ class LanguageZh extends LanguageZh_hans {
global $wgHooks;
parent::__construct();
- $variants = array('zh','zh-hans','zh-hant','zh-cn','zh-hk','zh-mo','zh-my','zh-sg','zh-tw');
-
+ $variants = array( 'zh', 'zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-mo', 'zh-my', 'zh-sg', 'zh-tw' );
+
$variantfallbacks = array(
- 'zh' => array('zh-hans','zh-hant','zh-cn','zh-tw','zh-hk','zh-sg','zh-mo','zh-my'),
- 'zh-hans' => array('zh-cn','zh-sg','zh-my'),
- 'zh-hant' => array('zh-tw','zh-hk','zh-mo'),
- 'zh-cn' => array('zh-hans','zh-sg','zh-my'),
- 'zh-sg' => array('zh-hans','zh-cn','zh-my'),
- 'zh-my' => array('zh-hans','zh-sg','zh-cn'),
- 'zh-tw' => array('zh-hant','zh-hk','zh-mo'),
- 'zh-hk' => array('zh-hant','zh-mo','zh-tw'),
- 'zh-mo' => array('zh-hant','zh-hk','zh-tw'),
+ 'zh' => array( 'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my' ),
+ 'zh-hans' => array( 'zh-cn', 'zh-sg', 'zh-my' ),
+ 'zh-hant' => array( 'zh-tw', 'zh-hk', 'zh-mo' ),
+ 'zh-cn' => array( 'zh-hans', 'zh-sg', 'zh-my' ),
+ 'zh-sg' => array( 'zh-hans', 'zh-cn', 'zh-my' ),
+ 'zh-my' => array( 'zh-hans', 'zh-sg', 'zh-cn' ),
+ 'zh-tw' => array( 'zh-hant', 'zh-hk', 'zh-mo' ),
+ 'zh-hk' => array( 'zh-hant', 'zh-mo', 'zh-tw' ),
+ 'zh-mo' => array( 'zh-hant', 'zh-hk', 'zh-tw' ),
);
- $ml=array(
+ $ml = array(
'zh' => 'disable',
'zh-hans' => 'unidirectional',
'zh-hant' => 'unidirectional',
@@ -105,7 +105,7 @@ class LanguageZh extends LanguageZh_hans {
$this->mConverter = new ZhConverter( $this, 'zh',
$variants, $variantfallbacks,
array(),
- $ml);
+ $ml );
$wgHooks['ArticleSaveComplete'][] = $this->mConverter;
}
@@ -114,13 +114,13 @@ class LanguageZh extends LanguageZh_hans {
function segmentForDiff( $text ) {
return preg_replace(
"/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "' ' .\"$1\"", $text);
+ "' ' .\"$1\"", $text );
}
function unsegmentForDiff( $text ) {
return preg_replace(
"/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "\"$1\"", $text);
+ "\"$1\"", $text );
}
/**
@@ -149,7 +149,7 @@ class LanguageZh extends LanguageZh_hans {
$terms = implode( '|', $termsArray );
$terms = self::convertDoubleWidth( $terms );
$terms = implode( '|', $this->mConverter->autoConvertToAllVariants( $terms ) );
- $ret = array_unique( explode('|', $terms) );
+ $ret = array_unique( explode( '|', $terms ) );
return $ret;
}
}
diff --git a/languages/classes/LanguageZh_hans.php b/languages/classes/LanguageZh_hans.php
index 5b03d731..a65162bc 100644
--- a/languages/classes/LanguageZh_hans.php
+++ b/languages/classes/LanguageZh_hans.php
@@ -1,6 +1,8 @@
<?php
/**
+ * Simplified Chinese
+ *
* @ingroup Language
*/
class LanguageZh_hans extends Language {
@@ -13,21 +15,21 @@ class LanguageZh_hans extends Language {
* for now just treat each character as a word.
* @todo Fixme: only do this for Han characters...
*/
- function wordSegmentation( $string ) {
+ function segmentByWord( $string ) {
$reg = "/([\\xc0-\\xff][\\x80-\\xbf]*)/";
$s = self::insertSpace( $string, $reg );
return $s;
}
- function normalizeForSearch( $string ) {
+ function normalizeForSearch( $s ) {
wfProfileIn( __METHOD__ );
// Double-width roman characters
- $s = self::convertDoubleWidth( $string );
- $s = trim( $s );
$s = parent::normalizeForSearch( $s );
+ $s = trim( $s );
+ $s = $this->segmentByWord( $s );
wfProfileOut( __METHOD__ );
return $s;
}
-} \ No newline at end of file
+}
diff --git a/languages/messages/MessagesAb.php b/languages/messages/MessagesAb.php
index 7f9347c9..efb0c01a 100644
--- a/languages/messages/MessagesAb.php
+++ b/languages/messages/MessagesAb.php
@@ -15,6 +15,67 @@
$fallback = 'ru';
+$namespaceNames = array(
+ NS_MEDIA => 'Ðмедиа',
+ NS_SPECIAL => 'ЦаÑтәи',
+ NS_TALK => 'Ðхцәажәара',
+ NS_USER => 'Ðлахәыла',
+ NS_USER_TALK => 'Ðлахәыла_ахцәажәара',
+ NS_PROJECT_TALK => '$1_ахцәажәара',
+ NS_FILE => 'Ðфаил',
+ NS_FILE_TALK => 'Ðфаил_ахцәажәара',
+ NS_MEDIAWIKI => 'Ðмедиавики',
+ NS_MEDIAWIKI_TALK => 'Ðмедиавики_ахцәажәара',
+ NS_TEMPLATE => 'Ðшаблон',
+ NS_TEMPLATE_TALK => 'Ðшаблон_ахцәажәара',
+ NS_HELP => 'Ðцхыраара',
+ NS_HELP_TALK => 'Ðцхыраара_ахцәажәара',
+ NS_CATEGORY => 'Ðкатегориа',
+ NS_CATEGORY_TALK => 'Ðкатегориа_ахцәажәара',
+);
+
+$namespaceAliases = array(
+ 'Иалахә' => NS_USER,
+
+ // Backward compat. Fallbacks from 'ru'.
+ 'Медиа' => NS_MEDIA,
+ 'СлужебнаÑ' => NS_SPECIAL,
+ 'ОбÑуждение' => NS_TALK,
+ 'УчаÑтник' => NS_USER,
+ 'ОбÑуждение_учаÑтника' => NS_USER_TALK,
+ 'ОбÑуждение_$1' => NS_PROJECT_TALK,
+ 'Файл' => NS_FILE,
+ 'ОбÑуждение_файла' => NS_FILE_TALK,
+ 'MediaWiki' => NS_MEDIAWIKI,
+ 'ОбÑуждение_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'Шаблон' => NS_TEMPLATE,
+ 'ОбÑуждение_шаблона' => NS_TEMPLATE_TALK,
+ 'Справка' => NS_HELP,
+ 'ОбÑуждение_Ñправки' => NS_HELP_TALK,
+ 'КатегориÑ' => NS_CATEGORY,
+ 'ОбÑуждение_категории' => NS_CATEGORY_TALK
+);
+
+$specialPageAliases = array(
+ 'Recentchanges' => array( 'ÐрҽеираҾыцқәа' ),
+ 'Upload' => array( 'Ðҭагалара' ),
+ 'Newimages' => array( 'ÐфаилқәаҾыц' ),
+ 'Randompage' => array( 'Машәырлатәи' ),
+ 'Newpages' => array( 'ÐдаҟьақәаҾыц' ),
+ 'Specialpages' => array( 'ЦаÑтәиÐдаҟьақәа' ),
+ 'Categories' => array( 'Ðкатегориақәа' ),
+ 'Mypage' => array( 'Садаҟьа' ),
+ 'Mytalk' => array( 'Сахцәажәара' ),
+ 'Mycontributions' => array( 'Ðрхиарақәа' ),
+ 'Search' => array( 'Ðҧшаара' ),
+);
+
+$magicWords = array(
+ 'language' => array( '0', '#ÐБЫЗШӘÐ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'цаÑтәи', 'ÑлужебнаÑ', 'special' ),
+ 'index' => array( '1', '__ÐИÐДЕКС__', '__ИÐДЕКС__', '__INDEX__' ),
+);
+
$messages = array(
# Dates
'sunday' => 'амҽыш',
@@ -75,21 +136,12 @@ $messages = array(
'qbspecialpages' => 'ЦаÑтәи адаҟьақәа',
# Vector skin
-'vector-action-move' => 'Ðхьӡ аҧÑахра',
-'vector-namespace-category' => 'Ðкатегориа',
-'vector-namespace-help' => 'Ðцхыраара адаҟьа',
-'vector-namespace-image' => 'Ðфаил',
-'vector-namespace-main' => 'Ðдаҟьа',
-'vector-namespace-project' => 'Ðпроект',
-'vector-namespace-special' => 'ЦаÑтәи адаҟьа',
-'vector-namespace-talk' => 'Ðхцәажәара',
-'vector-namespace-template' => 'Ðшаблон',
-'vector-namespace-user' => 'Ðлахәыла Ðдаҟьа',
-'vector-view-create' => 'Ðрҿиара',
-'vector-view-edit' => 'Ðриашамҭа',
-'vector-view-history' => 'Ðҭоурых',
-'vector-view-view' => 'Ðҧхьара',
-'vector-view-viewsource' => 'Ðхәаҧшра',
+'vector-action-move' => 'Ðхьӡ аҧÑахра',
+'vector-view-create' => 'Ðрҿиара',
+'vector-view-edit' => 'Ðриашамҭа',
+'vector-view-history' => 'Ðҭоурых',
+'vector-view-view' => 'Ðҧхьара',
+'vector-view-viewsource' => 'Ðхәаҧшра',
'help' => 'Ðцхыраара',
'search' => 'Ðҧшаара',
@@ -171,9 +223,8 @@ $messages = array(
'grouppage-sysop' => '{{ns:project}}:ÐдминиÑтраторцәа',
# Recent changes
-'recentchanges' => 'Ðрҽеира ҿыцқәа',
-'recentchanges-legend-newpage' => '$1 — адаҟьа ҿыц',
-'newpageletter' => 'Ò¾',
+'recentchanges' => 'Ðрҽеира ҿыцқәа',
+'newpageletter' => 'Ò¾',
# Recent changes linked
'recentchangeslinked' => 'Еимадоу ариашарақәа',
diff --git a/languages/messages/MessagesAce.php b/languages/messages/MessagesAce.php
index 72d16784..5467eeee 100644
--- a/languages/messages/MessagesAce.php
+++ b/languages/messages/MessagesAce.php
@@ -9,6 +9,7 @@
*
* @author Abi Azkia
* @author Andri.h
+ * @author Ezagren
* @author Fadli Idris
* @author Meno25
* @author Si Gam Acèh
@@ -16,6 +17,142 @@
$fallback = 'id';
+$namespaceNames = array(
+ NS_MEDIA => 'Alat',
+ NS_SPECIAL => 'Kusuih',
+ NS_TALK => 'Marit',
+ NS_USER => 'Ureuëng_Nguy',
+ NS_USER_TALK => 'Marit_Ureuëng_Nguy',
+ NS_PROJECT_TALK => 'Marit_$1',
+ NS_FILE => 'Beureukaih',
+ NS_FILE_TALK => 'Marit_Beureukaih',
+ NS_MEDIAWIKI => 'AlatWiki',
+ NS_MEDIAWIKI_TALK => 'Marit_AlatWiki',
+ NS_TEMPLATE => 'Pola',
+ NS_TEMPLATE_TALK => 'Marit_Pola',
+ NS_HELP => 'Beunantu',
+ NS_HELP_TALK => 'Marit_Beunantu',
+ NS_CATEGORY => 'Kawan',
+ NS_CATEGORY_TALK => 'Marit_Kawan',
+);
+
+$namespaceAliases = array(
+ 'Istimewa' => NS_SPECIAL,
+ 'Pembicaraan' => NS_TALK,
+ 'Pengguna' => NS_USER,
+ 'Pembicaraan_Pengguna' => NS_USER_TALK,
+ 'Pembicaraan_$1' => NS_PROJECT_TALK,
+ 'Berkas' => NS_FILE,
+ 'Pembicaraan_Berkas' => NS_FILE_TALK,
+ 'Pembicaraan_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'Templat' => NS_TEMPLATE,
+ 'Pembicaraan_Templat' => NS_TEMPLATE_TALK,
+ 'Bantuan' => NS_HELP,
+ 'Pembicaraan_Bantuan' => NS_HELP_TALK,
+ 'Kategori' => NS_CATEGORY,
+ 'Pembicaraan_Kategori' => NS_CATEGORY_TALK,
+ 'Gambar_Pembicaraan' => NS_FILE_TALK,
+ 'MediaWiki_Pembicaraan' => NS_MEDIAWIKI_TALK,
+ 'Templat_Pembicaraan' => NS_TEMPLATE_TALK,
+ 'Bantuan_Pembicaraan' => NS_HELP_TALK,
+ 'Kategori_Pembicaraan' => NS_CATEGORY_TALK,
+ 'Gambar' => NS_FILE,
+ 'Pembicaraan_Gambar' => NS_FILE_TALK,
+ 'Bicara' => NS_TALK,
+ 'Bicara_Pengguna' => NS_USER_TALK,
+);
+
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'Peuninah_ganda' ),
+ 'BrokenRedirects' => array( 'Peuninah_reuloh' ),
+ 'Disambiguations' => array( 'Hana_jeulaih' ),
+ 'Userlogin' => array( 'Tamong_log' ),
+ 'Userlogout' => array( 'Teubiet_log' ),
+ 'CreateAccount' => array( 'Peugot_nan' ),
+ 'Preferences' => array( 'Geunalak' ),
+ 'Watchlist' => array( 'Dapeuta_kalon' ),
+ 'Recentchanges' => array( 'Neuubah_baro' ),
+ 'Upload' => array( 'Pasoe' ),
+ 'Listfiles' => array( 'Dapeuta_beureukaih' ),
+ 'Newimages' => array( 'Beureukaih_baro' ),
+ 'Listusers' => array( 'Dapeuta_ureueng_nguy' ),
+ 'Listgrouprights' => array( 'Dapeuta_khut_(hak)_kawan' ),
+ 'Statistics' => array( 'Keunira' ),
+ 'Randompage' => array( 'On_beurangkari' ),
+ 'Lonelypages' => array( 'On_hana_soe_po' ),
+ 'Uncategorizedpages' => array( 'On_hana_roh_lam_kawan' ),
+ 'Uncategorizedcategories' => array( 'Kawan_hana_roh_lam_kawan' ),
+ 'Uncategorizedimages' => array( 'Beureukaih_hana_roh_lam_kawan' ),
+ 'Uncategorizedtemplates' => array( 'Templat_hana_roh_lam_kawan' ),
+ 'Unusedcategories' => array( 'Kawan_soh' ),
+ 'Unusedimages' => array( 'Beureukaih_hana_teunguy' ),
+ 'Wantedpages' => array( 'On_nyang_geuh\'eut' ),
+ 'Wantedcategories' => array( 'Kawan_nyang_geuh\'eut' ),
+ 'Wantedfiles' => array( 'Beureukaih_nyang_geuh\'eut' ),
+ 'Wantedtemplates' => array( 'Templat_nyang_geuh\'eut' ),
+ 'Mostlinked' => array( 'On_nyang_paleng_le_geunguy' ),
+ 'Mostlinkedcategories' => array( 'Kawan_nyang_paleng_le_geunguy' ),
+ 'Mostlinkedtemplates' => array( 'Templat_nyang_paleng_le_geunguy' ),
+ 'Mostimages' => array( 'Beureukaih_nyang_paleng_le_geunguy' ),
+ 'Mostcategories' => array( 'Kawan_paleng_le' ),
+ 'Mostrevisions' => array( 'Neuubah_paleng_le' ),
+ 'Fewestrevisions' => array( 'Neuubah_paleng_dit' ),
+ 'Shortpages' => array( 'On_paneuek' ),
+ 'Longpages' => array( 'On_panyang' ),
+ 'Newpages' => array( 'On_baro' ),
+ 'Ancientpages' => array( 'Teunuleh_trep' ),
+ 'Deadendpages' => array( 'On_mate' ),
+ 'Protectedpages' => array( 'On_nyang_geupeulindong' ),
+ 'Protectedtitles' => array( 'Nan_nyang_geupeulindong' ),
+ 'Allpages' => array( 'Dapeuta_on' ),
+ 'Prefixindex' => array( 'Dapeuta_neuaway' ),
+ 'Ipblocklist' => array( 'Dapeuta_neutheun' ),
+ 'Specialpages' => array( 'On_khusoih' ),
+ 'Contributions' => array( 'Peuneugot_ureueng_nguy' ),
+ 'Emailuser' => array( 'Surat-e_ureueng_nguy' ),
+ 'Confirmemail' => array( 'Peunyo_surat-e' ),
+ 'Whatlinkshere' => array( 'Hubong_gisa' ),
+ 'Recentchangeslinked' => array( 'Neuubah_meuhubong' ),
+ 'Movepage' => array( 'Peupinah_on' ),
+ 'Blockme' => array( 'Theun_lon' ),
+ 'Booksources' => array( 'Ne_kitab' ),
+ 'Categories' => array( 'Dapeuta_kawan' ),
+ 'Export' => array( 'Peuteubiet' ),
+ 'Version' => array( 'Seunalen' ),
+ 'Allmessages' => array( 'MandumPeusan' ),
+ 'Log' => array( 'Ceunatat' ),
+ 'Blockip' => array( 'Theun_ureueng_nguy' ),
+ 'Undelete' => array( 'Peubateue_sampoh' ),
+ 'Import' => array( 'Peutamong' ),
+ 'Lockdb' => array( 'Gunci_basis_data' ),
+ 'Unlockdb' => array( 'Peuhah_gunci_basis_data' ),
+ 'Userrights' => array( 'Khut_(hak)_ureueng_nguy' ),
+ 'MIMEsearch' => array( 'Mita_MIME' ),
+ 'FileDuplicateSearch' => array( 'Mita_beureukaih_saban' ),
+ 'Unwatchedpages' => array( 'On_hana_soe_kalon' ),
+ 'Listredirects' => array( 'Dapeuta_peuninah' ),
+ 'Revisiondelete' => array( 'Sampoh_peugot_ulang' ),
+ 'Unusedtemplates' => array( 'Templat_hana_soe_nguy' ),
+ 'Randomredirect' => array( 'Peuninah_beurangkari' ),
+ 'Mypage' => array( 'On_lon' ),
+ 'Mytalk' => array( 'Peugah_haba_lon' ),
+ 'Mycontributions' => array( 'Atra_lon_peugot' ),
+ 'Listadmins' => array( 'Dapeuta_ureueng_uroh' ),
+ 'Listbots' => array( 'Dapeuta_bot' ),
+ 'Popularpages' => array( 'On_meuceuhu' ),
+ 'Search' => array( 'Mita' ),
+ 'Resetpass' => array( 'Gantoe_lageuem_rahsia' ),
+ 'Withoutinterwiki' => array( 'Hana_interwiki' ),
+ 'MergeHistory' => array( 'Riwayat_peusapat' ),
+ 'Filepath' => array( 'Neuduek_beureukaih' ),
+ 'Invalidateemail' => array( 'Peubateue_peusah_surat-e' ),
+ 'Blankpage' => array( 'On_soh' ),
+ 'LinkSearch' => array( 'Mita_hubong' ),
+ 'DeletedContributions' => array( 'Peuneugot_nyang_geusampoh' ),
+ 'Tags' => array( 'Tag' ),
+ 'Activeusers' => array( 'Ureueng_nguy_udep' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Bôh garéh yup bak hubông:',
@@ -32,8 +169,7 @@ $messages = array(
'tog-editsection' => 'Peujeuet andam bideueng rot hubong [andam]',
'tog-editsectiononrightclick' => 'Peujeuet andam bideueng ngon teugon blah uneun bak nan bideueng (peureulee JavaScript)',
'tog-showtoc' => 'Peuleumah dapeuta asoe (keu on-on nyang na leubeh nibak 3 boh aneuk ulee)',
-'tog-rememberpassword' => 'Ingat lageuëm rahsia lôn bak komputer nyoë',
-'tog-editwidth' => 'Peurayeuk kotak andam ube layeu komputer',
+'tog-rememberpassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
'tog-watchcreations' => 'Tamah on-on nyang lonpeugot u dapeuta kalon',
'tog-watchdefault' => 'Tamah on-on nyang lon-andam u dapeuta kalon',
'tog-watchmoves' => 'Tamah on-on nyang lonpeupinah u dapeuta kalon',
@@ -151,26 +287,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Beunagi barô',
-'vector-action-delete' => 'Sampôh',
-'vector-action-move' => 'Peupinah',
-'vector-action-protect' => 'Peulindông',
-'vector-action-undelete' => 'Bateuë sampôh',
-'vector-action-unprotect' => 'Bateuë peulindông',
-'vector-namespace-category' => 'Kawan',
-'vector-namespace-help' => 'Ôn beunantu',
-'vector-namespace-image' => 'Beureukah',
-'vector-namespace-main' => 'Ôn',
-'vector-namespace-media' => 'Ôn media',
-'vector-namespace-mediawiki' => 'Peusan',
-'vector-view-create' => 'Peugöt',
-'vector-view-edit' => 'Andam',
-'vector-view-history' => 'Atra u likôt',
-'vector-view-view' => 'Beuët',
-'vector-view-viewsource' => 'Eu nè',
-'actions' => 'Buet',
-'namespaces' => 'Ruweuëng nan',
-'variants' => 'Ragam',
+'vector-action-addsection' => 'Beunagi barô',
+'vector-action-delete' => 'Sampôh',
+'vector-action-move' => 'Peupinah',
+'vector-action-protect' => 'Peulindông',
+'vector-action-undelete' => 'Bateuë sampôh',
+'vector-action-unprotect' => 'Bateuë peulindông',
+'vector-simplesearch-preference' => 'Peuudep mita saran nyang geupeusamporeuna (keu kulet Vector khong)',
+'vector-view-create' => 'Peugöt',
+'vector-view-edit' => 'Andam',
+'vector-view-history' => 'Atra u likôt',
+'vector-view-view' => 'Beuët',
+'vector-view-viewsource' => 'Eu nè',
+'actions' => 'Buet',
+'namespaces' => 'Ruweuëng nan',
+'variants' => 'Ragam',
'errorpagetitle' => 'Seunalah',
'returnto' => 'Gisa u $1.',
@@ -290,7 +421,7 @@ Nan Droeneuh ka teupeugot. Neuato laju [[Special:Preferences|peue nyang neugalak
'yourname' => 'Ureuëng nguy:',
'yourpassword' => 'Lageuëm:',
'yourpasswordagain' => 'Pasoë lom lageuëm:',
-'remembermypassword' => 'Ingat lageuëm rahsia lôn bak komputer nyoë',
+'remembermypassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
'login' => 'Tamöng',
'nav-login-createaccount' => 'Tamöng / dapeuta',
'loginprompt' => "Droëneuh suwah/payah neupeu’udép ''cookies'' mangat jeuët neutamong u {{SITENAME}}",
@@ -383,7 +514,6 @@ Ji Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] ba
'editingsection' => 'Andam $1 (bideuëng)',
'copyrightwarning' => "Beu neuingat bahwa ban mandum nyang Droëneuh tuléh keu {{SITENAME}} geukira geupeuteubiët di yup $2 (ngiëng $1 keu leubèh jeulah). Meunyoë Droëneuh h‘an neutém teunuléh Droëneuh ji’andam ngön jiba ho ho la’én, bèk neupasoë teunuléh Droëneuh keunoë.<br />Droëneuh neumeujanji chit meunyoë teunuléh nyoë nakeuh atra neutuléh keudroë, atawa neucok nibak nè nè atra umôm atawa nè bibeuëh la’én.
'''BÈK NEUPASOË TEUNULÉH NYANG GEUPEULINDÔNG HAK KARANG NYANG HANA IDIN'''",
-'longpagewarning' => "'''INGAT: Ôn nyoë panyangjih nakeuh $1 kilobit; ladôm alat rawoh web kadang na masalah bak ji’andam ôn nyang panyangjih 32 kb atawa leubèh. Beu neupeutimang keu neuplah jeuët padum boh beunagi nyang leubèh cut. '''",
'templatesused' => '{{PLURAL:$1|Templat|Templat}} nyang geunguy bak ôn nyoë:',
'templatesusedpreview' => '{{PLURAL:$1|Templat|Templat}} nyang geunguy bak eu dilèë nyoë:',
'template-protected' => '(geulindông)',
@@ -648,7 +778,6 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
# Watchlist
'watchlist' => 'Dapeuta keunalön lôn',
'mywatchlist' => 'Keunalön',
-'watchlistfor' => "(keu '''$1''')",
'addedwatch' => 'Ka geupeutamah u dapeuta kalön',
'addedwatchtext' => "Ôn \"[[:\$1]]\" ka geupeutamah u [[Special:Watchlist|dapeuta keunalön]] Droëneuh. Neu’ubah-neu’ubah bak masa u keuë bak ôn nyan ngön bak ôn peugah habajih, euntreuk leumah nyoë pat. Ôn nyan euntreuk geupeuleumah ''teubay'' bak [[Special:RecentChanges|dapeuta neu’ubah paléng barô]] mangat leubèh mudah leumah.",
'removedwatch' => 'Ka geusampôh nibak dapeuta keunalön',
@@ -866,9 +995,9 @@ Hubông teutap keu revisi ôn nyoë',
'nextdiff' => 'Geunantoë lheuëh nyan →',
# Media information
-'file-info-size' => '($1 × $2 piksel, rayek beureukah: $3, MIME jeunèh: $4)',
+'file-info-size' => '$1 × $2 piksel, rayek beureukah: $3, MIME jeunèh: $4',
'file-nohires' => '<small>Hana resolusi nyang leubèh manyang.</small>',
-'svg-long-desc' => '(Beureukah SVG, nominal $1 x $2 piksel, rayek beureukah: $3)',
+'svg-long-desc' => 'Beureukah SVG, nominal $1 x $2 piksel, rayek beureukah: $3',
'show-big-image' => 'Resolusi peunoh',
'show-big-image-thumb' => '<small>Rayek atra nyoë: $1 x $2 piksel</small>',
diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php
index ac324961..4cba542b 100644
--- a/languages/messages/MessagesAf.php
+++ b/languages/messages/MessagesAf.php
@@ -72,13 +72,21 @@ $magicWords = array(
'pagename' => array( '1', 'BLADSYNAAM', 'PAGENAME' ),
'namespace' => array( '1', 'NAAMSPASIE', 'NAMESPACE' ),
'talkspace' => array( '1', 'BESPREKINGSBLADSY', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'VOLBLADSYNAAM', 'FULLPAGENAME' ),
+ 'img_thumbnail' => array( '1', 'duimnael', 'thumbnail', 'thumb' ),
'img_right' => array( '1', 'regs', 'right' ),
'img_left' => array( '1', 'links', 'left' ),
'img_none' => array( '1', 'geen', 'none' ),
+ 'img_center' => array( '1', 'senter', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'omraam', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'raamloos', 'frameless' ),
'img_border' => array( '1', 'raam', 'border' ),
'img_top' => array( '1', 'bo', 'top' ),
+ 'img_text_top' => array( '1', 'teks-bo', 'text-top' ),
'img_middle' => array( '1', 'middel', 'middle' ),
'img_bottom' => array( '1', 'onder', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'teks-onder', 'text-bottom' ),
+ 'img_link' => array( '1', 'skakel=$1', 'link=$1' ),
'sitename' => array( '1', 'WERFNAAM', 'SITENAME' ),
'server' => array( '0', 'BEDIENER', 'SERVER' ),
'servername' => array( '0', 'BEDIENERNAAM', 'SERVERNAME' ),
@@ -95,21 +103,22 @@ $magicWords = array(
'pagesize' => array( '1', 'BLADSYGROOTTE', 'PAGESIZE' ),
'index' => array( '1', '__INDEKS__', '__INDEX__' ),
'noindex' => array( '1', '__GEENINDEKS__', '__NOINDEX__' ),
+ 'url_path' => array( '0', 'PAD', 'PATH' ),
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dubbele aansture', 'Dubbeleaansture' ),
- 'BrokenRedirects' => array( 'Stukkende aansture', 'Stukkendeaansture' ),
+ 'DoubleRedirects' => array( 'Dubbele_aansture', 'Dubbeleaansture' ),
+ 'BrokenRedirects' => array( 'Stukkende_aansture', 'Stukkendeaansture' ),
'Disambiguations' => array( 'Dubbelsinnig' ),
- 'Userlogin' => array( 'Teken in', 'Tekenin' ),
- 'Userlogout' => array( 'Teken uit', 'Tekenuit' ),
+ 'Userlogin' => array( 'Teken_in', 'Tekenin' ),
+ 'Userlogout' => array( 'Teken_uit', 'Tekenuit' ),
'CreateAccount' => array( 'SkepRekening', 'MaakGebruiker' ),
'Preferences' => array( 'Voorkeure' ),
'Watchlist' => array( 'Dophoulys' ),
- 'Recentchanges' => array( 'Onlangse wysigings', 'Onlangsewysigings' ),
+ 'Recentchanges' => array( 'Onlangse_wysigings', 'Onlangsewysigings' ),
'Upload' => array( 'Laai', 'Oplaai' ),
'Listfiles' => array( 'Beeldelys', 'Prentelys', 'Lêerslys' ),
- 'Newimages' => array( 'Nuwe beelde', 'Nuwebeelde', 'Nuwe lêers', 'Nuwelêers' ),
+ 'Newimages' => array( 'Nuwe_beelde', 'Nuwebeelde', 'Nuwe_lêers', 'Nuwelêers' ),
'Listusers' => array( 'Gebruikerslys', 'Lysgebruikers' ),
'Listgrouprights' => array( 'LysGroepRegte' ),
'Statistics' => array( 'Statistiek' ),
@@ -134,27 +143,28 @@ $specialPageAliases = array(
'Fewestrevisions' => array( 'MinsteWysigings' ),
'Shortpages' => array( 'KortBladsye' ),
'Longpages' => array( 'LangBladsye' ),
- 'Newpages' => array( 'Nuwe bladsye', 'Nuwebladsye' ),
+ 'Newpages' => array( 'Nuwe_bladsye', 'Nuwebladsye' ),
'Ancientpages' => array( 'OuBladsye' ),
'Deadendpages' => array( 'DoodloopBladsye' ),
'Protectedpages' => array( 'BeskermdeBladsye' ),
'Protectedtitles' => array( 'BeskermdeTitels' ),
- 'Allpages' => array( 'Alle bladsye', 'Allebladsye' ),
+ 'Allpages' => array( 'Alle_bladsye', 'Allebladsye' ),
'Prefixindex' => array( 'VoorvoegselIndeks' ),
'Ipblocklist' => array( 'IPBlokLys' ),
- 'Specialpages' => array( 'Spesiale bladsye', 'Spesialebladsye' ),
+ 'Unblock' => array( 'Deblokkeer' ),
+ 'Specialpages' => array( 'Spesiale_bladsye', 'Spesialebladsye' ),
'Contributions' => array( 'Bydraes', 'Gebruikersbydraes' ),
- 'Emailuser' => array( 'Stuur e-pos', 'Stuure-pos', 'Stuur epos', 'Stuurepos' ),
- 'Confirmemail' => array( 'Bevestig e-posadres', 'Bevestige-posadres', 'Bevestig eposadres', 'Bevestigeposadres' ),
- 'Whatlinkshere' => array( 'Skakels hierheen', 'Skakelshierheen' ),
+ 'Emailuser' => array( 'Stuur_e-pos', 'Stuure-pos', 'Stuur_epos', 'Stuurepos' ),
+ 'Confirmemail' => array( 'Bevestig_e-posadres', 'Bevestige-posadres', 'Bevestig_eposadres', 'Bevestigeposadres' ),
+ 'Whatlinkshere' => array( 'Skakels_hierheen', 'Skakelshierheen' ),
'Recentchangeslinked' => array( 'OnlangseVeranderingsMetSkakels', 'VerwanteVeranderings' ),
- 'Movepage' => array( 'Skuif bladsy', 'Skuifbladsy' ),
+ 'Movepage' => array( 'Skuif_bladsy', 'Skuifbladsy' ),
'Blockme' => array( 'BlokMy' ),
'Booksources' => array( 'Boekbronne' ),
'Categories' => array( 'Kategorieë' ),
'Export' => array( 'Eksporteer' ),
'Version' => array( 'Weergawe' ),
- 'Allmessages' => array( 'Stelselboodskappe', 'Alle stelselboodskappe', 'Allestelselboodskappe', 'Boodskappe' ),
+ 'Allmessages' => array( 'Stelselboodskappe', 'Alle_stelselboodskappe', 'Allestelselboodskappe', 'Boodskappe' ),
'Log' => array( 'Logboek', 'Logboeke' ),
'Blockip' => array( 'BlokIP' ),
'Undelete' => array( 'Ontskrap' ),
@@ -162,13 +172,13 @@ $specialPageAliases = array(
'Lockdb' => array( 'SluitDB' ),
'Unlockdb' => array( 'OntsluitDB' ),
'Userrights' => array( 'GebruikersRegte' ),
- 'MIMEsearch' => array( 'MIME-soek', 'MIMEsoek', 'MIME soek' ),
+ 'MIMEsearch' => array( 'MIME-soek', 'MIMEsoek', 'MIME_soek' ),
'FileDuplicateSearch' => array( 'LerDuplikaatSoek' ),
'Unwatchedpages' => array( 'NieDopgehoudeBladsye' ),
'Listredirects' => array( 'LysAansture' ),
'Revisiondelete' => array( 'WeergaweSkrap' ),
'Unusedtemplates' => array( 'OngebruikteSjablone' ),
- 'Randomredirect' => array( 'Lukrake aanstuur', 'Lukrakeaanstuur' ),
+ 'Randomredirect' => array( 'Lukrake_aanstuur', 'Lukrakeaanstuur' ),
'Mypage' => array( 'MyBladsy' ),
'Mytalk' => array( 'Mybespreking', 'Mybesprekings' ),
'Mycontributions' => array( 'Mybydrae' ),
@@ -177,7 +187,7 @@ $specialPageAliases = array(
'Popularpages' => array( 'PopulêreBladsye' ),
'Search' => array( 'Soek' ),
'Resetpass' => array( 'HerstelWagwoord' ),
- 'Withoutinterwiki' => array( 'Sonder taalskakels', 'Sondertaalskakels' ),
+ 'Withoutinterwiki' => array( 'Sonder_taalskakels', 'Sondertaalskakels' ),
'MergeHistory' => array( 'VersmeltGeskiedenis' ),
'Filepath' => array( 'Lêerpad' ),
'Invalidateemail' => array( 'OngeldigeEpos' ),
@@ -210,8 +220,7 @@ $messages = array(
'tog-editsection' => 'Wys [wysig]-skakels vir elke afdeling',
'tog-editsectiononrightclick' => 'Wysig afdeling met regskliek op afdeling se titel (JavaScript)',
'tog-showtoc' => 'Wys inhoudsopgawe (by bladsye met meer as drie opskrifte)',
-'tog-rememberpassword' => 'Onthou wagwoord oor sessies.',
-'tog-editwidth' => 'Verbreed die wysigingsboks oor die volle breedte van die skerm',
+'tog-rememberpassword' => "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$|dag|dae}})",
'tog-watchcreations' => 'Voeg bladsye wat ek skep by my dophoulys',
'tog-watchdefault' => 'Lys nuwe en gewysigde bladsye.',
'tog-watchmoves' => 'Voeg die bladsye wat ek skuif by my dophoulys',
@@ -355,31 +364,21 @@ $messages = array(
'faqpage' => 'Project:GewildeVrae',
# Vector skin
-'vector-action-addsection' => 'Nuwe onderwerp',
-'vector-action-delete' => 'Skrap',
-'vector-action-move' => 'Skuif',
-'vector-action-protect' => 'Beskerm',
-'vector-action-undelete' => 'Ontskrap',
-'vector-action-unprotect' => 'Verwyder beskerming',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Hulpbladsy',
-'vector-namespace-image' => 'Lêer',
-'vector-namespace-main' => 'Bladsy',
-'vector-namespace-media' => 'Mediablad',
-'vector-namespace-mediawiki' => 'Boodskap',
-'vector-namespace-project' => 'Projekblad',
-'vector-namespace-special' => 'Spesiale bladsy',
-'vector-namespace-talk' => 'Bespreking',
-'vector-namespace-template' => 'Sjabloon',
-'vector-namespace-user' => 'Gebruikersblad',
-'vector-view-create' => 'Skep',
-'vector-view-edit' => 'Wysig',
-'vector-view-history' => 'Wys geskiedenis',
-'vector-view-view' => 'Lees',
-'vector-view-viewsource' => 'Wys bronteks',
-'actions' => 'Aksies',
-'namespaces' => 'Naamruimtes',
-'variants' => 'Variante',
+'vector-action-addsection' => 'Nuwe onderwerp',
+'vector-action-delete' => 'Skrap',
+'vector-action-move' => 'Skuif',
+'vector-action-protect' => 'Beskerm',
+'vector-action-undelete' => 'Ontskrap',
+'vector-action-unprotect' => 'Verwyder beskerming',
+'vector-simplesearch-preference' => 'Aktiveer verbeterde soek-voorstelle (slegs vir die Vektor omslag)',
+'vector-view-create' => 'Skep',
+'vector-view-edit' => 'Wysig',
+'vector-view-history' => 'Wys geskiedenis',
+'vector-view-view' => 'Lees',
+'vector-view-viewsource' => 'Wys bronteks',
+'actions' => 'Aksies',
+'namespaces' => 'Naamruimtes',
+'variants' => 'Variante',
'errorpagetitle' => 'Fout',
'returnto' => 'Keer terug na $1.',
@@ -440,6 +439,9 @@ Te veel gebruikers probeer om na hierdie bladsy te kyk.
Wag asseblief 'n rukkie voordat u weer probeer om die bladsy op te roep.
$1",
+'pool-timeout' => "Die maksimum wagtyd vir 'n databasisversperring is oorskry.",
+'pool-queuefull' => 'Die poel se wagtou is vol',
+'pool-errorunknown' => 'Onbekende fout',
# 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' => 'Inligting oor {{SITENAME}}',
@@ -606,7 +608,8 @@ moenie vergeet om u [[Special:Preferences|persoonlike voorkeure vir {{SITENAME}}
'yourname' => 'Gebruikersnaam:',
'yourpassword' => 'Wagwoord:',
'yourpasswordagain' => 'Herhaal wagwoord',
-'remembermypassword' => 'Onthou my wagwoord oor sessies.',
+'remembermypassword' => "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$|dag|dae}})",
+'securelogin-stick-https' => 'Bly verbind met HTTPS na aanmelding',
'yourdomainname' => 'U domein:',
'externaldberror' => "'n Databasis fout het voorgekom tydens aanmelding of u het nie toestemming om u eksterne rekening op te dateer nie.",
'login' => 'Teken in',
@@ -623,6 +626,7 @@ moenie vergeet om u [[Special:Preferences|persoonlike voorkeure vir {{SITENAME}}
'gotaccount' => "Het u reeds 'n rekening? '''$1'''.",
'gotaccountlink' => 'Teken in',
'createaccountmail' => 'deur e-pos',
+'createaccountreason' => 'Rede:',
'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
'userexists' => "Die gebruikersnaam wat u gekies het is reeds geneem.
Kies asseblief 'n ander naam.",
@@ -647,6 +651,7 @@ Intekening word verbied.',
'wrongpasswordempty' => 'Die wagwoord was leeg. Probeer asseblief weer.',
'passwordtooshort' => 'Wagwoorde moet ten minste {{PLURAL:$1|1 karakter|$1 karakters}} lank wees.',
'password-name-match' => 'U wagwoord mag nie dieselfde as u gebruikersnaam wees nie.',
+'password-login-forbidden' => 'Die gebruik van hierdie gebruikersnaam en wagwoord is geweier.',
'mailmypassword' => "E-pos my 'n nuwe wagwoord",
'passwordremindertitle' => 'Wagwoordwenk van {{SITENAME}}',
'passwordremindertext' => 'Iemand (waarskynlik u vanaf IP-adres $1) het \'n nuwe wagwoord vir {{SITENAME}} ($4) gevra. \'n Tydelike wagwoord is vir gebruiker "$2" geskep. Die nuwe wagwoord is "$3". U kan met die tydelike wagwoord aanteken en \'n nuwe wagwoord stel. Die tydelike wagwoord sal na {{PLURAL:$5|een dag|$5 dae}} verval.
@@ -683,6 +688,9 @@ Wag asseblief alvorens u weer probeer.",
'loginlanguagelabel' => 'Taal: $1',
'suspicious-userlogout' => "U versoek om af te teken is geïgnoreer omdat dit lyk asof dit deur 'n gebreekte webleser of instaanbediener gestuur is.",
+# E-mail sending
+'php-mail-error-unknown' => 'Onbekende fout in PHP se mail()-funksie',
+
# Password reset dialog
'resetpass' => 'Verander wagwoord',
'resetpass_announce' => "U het aangeteken met 'n tydelike e-poskode.
@@ -734,9 +742,11 @@ U het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
'showlivepreview' => 'Lewendige voorskou',
'showdiff' => 'Wys veranderings',
'anoneditwarning' => "'''Waarskuwing:''' Aangesien u nie aangeteken is nie, sal u IP-adres in dié blad se wysigingsgeskiedenis gestoor word.",
+'anonpreviewwarning' => "''U is nie aangeteken nie.''
+''As u die bladsy stoor sal u IP-adres in die bladsy se geskeidenis aangeteken word.''",
'missingsummary' => "'''Onthou:''' Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer geklik word, word die wysiging sonder opsomming gestoor.",
'missingcommenttext' => 'Tik die opsomming onder.',
-'missingcommentheader' => "'''Let op:''' U het geen onderwerp/opskrif vir die opmerking verskaf nie. As u weer op \"Stoor\" klik, sal u wysiging sonder die onderwerp/opskrif gestoor word.",
+'missingcommentheader' => "'''Let op:''' U het geen onderwerp/opskrif vir die opmerking verskaf nie. As u weer op \"{{int:savearticle}}\" klik, sal u wysiging sonder die onderwerp/opskrif gestoor word.",
'summary-preview' => 'Opsomming nakijken:',
'subject-preview' => 'Onderwerp/ opskrif voorskou:',
'blockedtitle' => 'Gebruiker is geblokkeer',
@@ -805,8 +815,12 @@ Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
'usercsspreview' => "'''Onthou hierdie is slegs 'n voorskou van u persoonlike CSS.'''
'''Dit is nog nie gestoor nie!'''",
'userjspreview' => "'''Onthou hierdie is slegs 'n toets/voorskou van u gebruiker-JavaScript, dit is nog nie gestoor nie.'''",
+'sitecsspreview' => "'''Onthou dat u na 'n voorskou van die CSS-kode kyk.'''
+'''Dit is nog nie gestoor nie!'''",
+'sitejspreview' => "'''Onthou dat u na 'n voorskou van die JavaScript-kode kyk.'''
+'''Dit is nog nie gestoor nie!'''",
'userinvalidcssjstitle' => "'''Waarskuwing:''' daar is nie 'n omslag \"\$1\" nie.
-Onthou dat u eie .css- en .js-bladsye met 'n kleinletter begin, byvoorbeeld {{ns:user}}:Naam/monobook.css in plaas van {{ns:user}}:Naam/Monobook.css.",
+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!'''",
@@ -844,8 +858,6 @@ Hierdeur beloof u ons dat u die byvoegings self geskryf het, of gekopieer het va
'copyrightwarning2' => "Enige bydraes op {{SITENAME}} mag genadeloos gewysig of selfs verwyder word; indien u dit nie met u bydrae wil toelaat nie, moenie dit hier bylas nie.<br />
Deur enigiets hier te plaas, beloof u dat u dit self geskryf het, of dat dit gekopieer is vanuit \"publieke domein\" of soortgelyke vrye bronne (sien \$1 vir details).
'''MOENIE WERK WAT DEUR KOPIEREG BESKERM WORD HIER PLAAS SONDER TOESTEMMING NIE!'''",
-'longpagewarning' => 'WAARSKUWING: Hierdie bladsy is $1 kG groot.
-Probeer asseblief die bladsy verkort en die detail na subartikels skuif sodat dit nie 32 kG oorskry nie.',
'longpageerror' => "'''FOUT: die teks wat u bygevoeg het is $1 kilogrepe groot, wat groter is as die maximum van $2 kilogrepe.
Die bladsy kan nie gestoor word nie.'''",
'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie. Dalk wil u die teks plak in 'n lêer en stoor vir later.'''
@@ -1024,6 +1036,8 @@ $1",
'logdelete-failure' => "'''Sigbaarheid kon nie vir die logboekreël gestel word nie:'''
$1",
'revdel-restore' => 'Verander sigbaarheid',
+'revdel-restore-deleted' => 'geskrapte wysigings',
+'revdel-restore-visible' => 'sigbare wysigings',
'pagehist' => 'Bladsy geskiedenis',
'deletedhist' => 'Verwyderde geskiedenis',
'revdelete-content' => 'inhoud',
@@ -1091,11 +1105,13 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
# Diffs
'history-title' => 'Weergawegeskiedenis van "$1"',
'difference' => '(Verskil tussen weergawes)',
+'difference-multipage' => '(Verskil tussen bladsye)',
'lineno' => 'Lyn $1:',
'compareselectedversions' => 'Vergelyk gekose weergawes',
'showhideselectedversions' => 'Wys/versteek gekose weergawes',
'editundo' => 'maak ongedaan',
-'diff-multi' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} word nie gewys nie.)',
+'diff-multi' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur {{PLURAL:$2|een gebruiker|$2 gebruikers}} word nie gewys nie)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)',
# Search results
'searchresults' => 'soekresultate',
@@ -1130,6 +1146,7 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
'searchprofile-everything-tooltip' => 'Soek deur alle inhoud (ook besprekingsbladsye)',
'searchprofile-advanced-tooltip' => 'Soek in spesifieke naamruimtes',
'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woorde}})',
+'search-result-category-size' => '{{PLURAL:$1|1 kategorielid|$1 kategorielede}} ({{PLURAL:$2|1 subkategorie|$2 subkategorieë}}, {{PLURAL:$3|1 lêer|$3 lêers}})',
'search-result-score' => 'Relevansie: $1%',
'search-redirect' => '(aanstuur $1)',
'search-section' => '(afdeling $1)',
@@ -1206,6 +1223,7 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
'contextlines' => 'Aantal lyne per resultaat',
'contextchars' => 'Karakters konteks per lyn',
'stub-threshold' => 'Drempel vir merk as <a href="#" class="stub">saadjie</a> (grepe):',
+'stub-threshold-disabled' => 'Afgeskakel',
'recentchangesdays' => 'Aantal dae wat in onlangse wysigings vertoon word:',
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|dag|dae}}',
'recentchangescount' => 'Aantal wysigings om by verstek te vertoon:',
@@ -1239,6 +1257,7 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
'prefs-files' => 'Lêers',
'prefs-custom-css' => 'Persoonlike CSS',
'prefs-custom-js' => 'Persoonlike JS',
+'prefs-common-css-js' => 'Gedeelde CSS/JS vir al die omslae:',
'prefs-reset-intro' => 'U kan die blad gebruik om u voorkeure terug te stel na die webwerf se verstekwaardes.
Die aksie kan nie ongedaan gemaak word nie.',
'prefs-emailconfirm-label' => 'E-posbevestiging:',
@@ -1277,9 +1296,15 @@ U kan ook besluit om e-pos te ontvang as ander gebruikers u gebruikers- of bespr
'prefs-advancedrendering' => 'Gevorderde instellings',
'prefs-advancedsearchoptions' => 'Gevorderde instellings',
'prefs-advancedwatchlist' => 'Gevorderde instellings',
-'prefs-display' => 'Vertoonopsies',
+'prefs-displayrc' => 'Vertoonopsies',
+'prefs-displaysearchoptions' => 'Weergaweopsies',
+'prefs-displaywatchlist' => 'Weergaweopsies',
'prefs-diffs' => 'Verskille',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Die e-posadres lyk geldig',
+'email-address-validity-invalid' => "Verskaf 'n geldige e-posadres",
+
# User rights
'userrights' => 'Bestuur gebruikersregte',
'userrights-lookup-user' => 'Beheer gebruikersgroepe',
@@ -1363,6 +1388,7 @@ U kan ook besluit om e-pos te ontvang as ander gebruikers u gebruikers- of bespr
'right-hideuser' => "Blokkeer 'n gebruiker, versteek dit van die publiek",
'right-ipblock-exempt' => 'Omseil IP-blokkades',
'right-proxyunbannable' => "Blokkades vir instaanbedieners (proxy's) geld nie",
+'right-unblockself' => 'Eie gebruiker deblokkeer',
'right-protect' => 'Verander beskermingsvlakke en wysig beskermde bladsye',
'right-editprotected' => 'Wysig beskermde bladsye (sonder kaskade-beskerming)',
'right-editinterface' => 'Wysig die gebruikerskoppelvlak',
@@ -1385,7 +1411,6 @@ U kan ook besluit om e-pos te ontvang as ander gebruikers u gebruikers- of bespr
'right-siteadmin' => 'Sluit en ontsluit die datbasis',
'right-reset-passwords' => 'Herstel ander gebruikers se wagwoorde',
'right-override-export-depth' => "Eksporteer bladsye insluitend geskakelde bladsye tot 'n diepte van 5",
-'right-versiondetail' => 'Wys omvattende sagteware weergawe inligting',
'right-sendemail' => 'Stuur e-pos aan ander gebruikers',
# User rights log
@@ -1436,14 +1461,9 @@ U kan ook besluit om e-pos te ontvang as ander gebruikers u gebruikers- of bespr
'recentchanges-legend' => 'Opsies vir onlangse wysigings',
'recentchangestext' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
'recentchanges-feed-description' => 'Spoor die mees onlangse wysigings op die wiki na in die voer.',
-'recentchanges-label-legend' => 'Sleutel: $1.',
-'recentchanges-legend-newpage' => '$1 - nuwe bladsy',
'recentchanges-label-newpage' => "Met die wysiging is 'n nuwe bladsy geskep",
-'recentchanges-legend-minor' => '$1 - klein wysiging',
'recentchanges-label-minor' => "Hierdie is 'n klein wysiging",
-'recentchanges-legend-bot' => '$1 - robotwysiging',
'recentchanges-label-bot' => "Hierdie wysiging was deur 'n bot uitgevoer",
-'recentchanges-legend-unpatrolled' => '$1 - ongekontroleerde wysiging',
'recentchanges-label-unpatrolled' => 'Die wysiging is nog nie gekontroleer nie',
'rcnote' => "Hier volg die laaste {{PLURAL:$1|'''$1''' wysiging|'''$1''' wysigings}} vir die afgelope {{PLURAL:$2|dag|'''$2''' dae}}, soos vanaf $4, $5.",
'rcnotefrom' => 'Hier onder is die wysigings sedert <b>$2</b> (tot by <b>$1</b> word gewys).',
@@ -1491,6 +1511,9 @@ om lêers te laai.',
'upload_directory_missing' => 'Die oplaaigids ($1) bestaan nie en kon nie deur die webbediener geskep word nie.',
'upload_directory_read_only' => 'Die webbediener kan nie na die oplaai gids ($1) skryf nie.',
'uploaderror' => 'Laaifout',
+'upload-recreate-warning' => "'''Waarskuwing:' n lêer met dieselfde naam is verwyder of geskuif.'''
+
+Die verwyder- en skuiflogboeke van hierdie bladsy word hier vir verdere inligting vertoon:",
'uploadtext' => "Gebruik die vorm hier onder om nuwe lêers te laai wat u in u artikels wil gebruik.
Om lêers wat voorheen opgelaai is te sien of te deursoek, gaan na die [[Special:FileList|lêerlys]].
Die laai van lêers word in die [[Special:Log/upload|laailog]] aangeteken.
@@ -1532,6 +1555,17 @@ Aanbevole {{PLURAL:\$3|lêertipe|lêertipes}} is \$2.",
'filetype-banned-type' => "'''\".\$1\"''' is nie 'n toegelate lêertipe nie.
Toelaatbare {{PLURAL:\$3|lêertipes|lêertipes}} is \$2.",
'filetype-missing' => 'Die lêer het geen uitbreiding (soos ".jpg").',
+'empty-file' => 'Die lêer wat u probeer oplaai is leeg.',
+'file-too-large' => 'Die lêer wat u probeer oplaai is te groot.',
+'filename-tooshort' => 'Die lêernaam is te kort.',
+'filetype-banned' => 'Hierdie tipe lêer is verban en word nie toegelaat nie.',
+'verification-error' => 'Verifikasie van die lêer wat u probeer oplaai het gefaal.',
+'hookaborted' => "Die wysiging wat u probeer maak is deur 'n uitbreiding gekanselleer.",
+'illegal-filename' => 'Die lêernaam word nie toegelaat nie.',
+'overwrite' => "Die oorskryf van 'n bestaande lêer word nie toegelaat nie.",
+'unknown-error' => "'n Onbekende fout voorgekom het.",
+'tmp-create-error' => 'Kon nie tydelike lêer skep nie.',
+'tmp-write-error' => 'Fout met skryf van tydelike lêer.',
'large-file' => 'Aanbeveling: maak lêer kleiner as $1;
die lêer is $2.',
'largefileserver' => 'Hierdie lêer is groter as wat die bediener se opstelling toelaat.',
@@ -1563,13 +1597,14 @@ Indien u die lêer nog wil oplaai, gaan asseblief terug en kies 'n ander naam.
'file-exists-duplicate' => "Die lêer is 'n duplikaat van die volgende {{PLURAL:$1|lêer|lêers}}:",
'file-deleted-duplicate' => "'n Lêer identies aan dié een ([[:$1]]) was al voorheen geskrap. <br />
Dit word aanbeveel dat u die lêer se skrapgeskiedenis besigtig voor u poog om dit weer op te laai.",
-'successfulupload' => 'Laai suksesvol',
'uploadwarning' => 'Laaiwaarskuwing',
'uploadwarning-text' => 'Verander die onderstaande lêerbeskrywing en probeer dan weer.',
'savefile' => 'Stoor lêer',
'uploadedimage' => 'het "[[$1]]" gelaai',
'overwroteimage' => 'het een nuwe weergawe van "[[$1]]" gelaai',
'uploaddisabled' => 'Laai is uitgeskakel',
+'copyuploaddisabled' => 'Die oplaai van lêers per URL is afgeskakel.',
+'uploadfromurl-queued' => 'U oplaai is in die wagtou geplaas.',
'uploaddisabledtext' => 'Die oplaai van lêers is afgeskakel.',
'php-uploaddisabledtext' => 'Die oplaai van lêers is in PHP afgeskakel.
Kyk na die "file_uploads"-instelling.',
@@ -1591,6 +1626,15 @@ Dink twee keer na of dit wel gepas is om die lêer hier op te laai.
Die verwyderingsinligting van die lêer word vir u gemak hier herhaal:",
'filename-bad-prefix' => "Die naam van die lêer wat u besig is om op te laai begin met '''\"\$1\"''', wat 'n nie-beskrywende term is, gewoonlik outomaties toegedien deur digitale kameras.
Kies asseblief 'n meer beskrywende naam vir die lêer.",
+'upload-success-subj' => 'Laai suksesvol',
+'upload-success-msg' => 'U het [$2] suksesvol opgelaai. Dit is nou beskikbaar by: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Oplaaiprobleem',
+'upload-failure-msg' => "Daar was 'n probleem met u oplaai van [$2]:
+
+$1",
+'upload-warning-subj' => 'Oplaai-waarskuwing',
+'upload-warning-msg' => "Daar was 'n probleem met u oplaai van [$2].
+Gaan terug na die [[Special:Upload/stash/$1|oplaaivorm]] om die probleem op te los.",
'upload-proto-error' => 'Verkeerde protokol',
'upload-proto-error-text' => 'Oplaaie via hierdie metode vereis dat die URL met <code>http://</code> of <code>ftp://</code> begin.',
@@ -1606,22 +1650,23 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
'upload-http-error' => "'n HTTP-fout het voorgekom: $1",
# img_auth script messages
-'img-auth-accessdenied' => 'Toegang geweier',
-'img-auth-nopathinfo' => 'PATH_INFO word vermis.
+'img-auth-accessdenied' => 'Toegang geweier',
+'img-auth-nopathinfo' => 'PATH_INFO word vermis.
U bediener is nie ingestel om hierdie inligting deur te stuur nie.
Miskien gebruik dit CGI, waartydens img_auth nie ondersteun word nie.
Sien http://www.mediawiki.org/wiki/Manual:Image_Authorization vir meer inligting.',
-'img-auth-notindir' => 'Die aangevraagde pad is nie die ingestelde oplaaigids nie.',
-'img-auth-badtitle' => 'Dit was nie moontlik om \'n geldige bladsynaam van "$1" te maak nie.',
-'img-auth-nologinnWL' => 'U is nie aangeteken en "$1" is nie op die witlys nie.',
-'img-auth-nofile' => 'Lêer "$1" bestaan nie.',
-'img-auth-isdir' => 'U probeer om toegang na gids "$1" te kry.
+'img-auth-notindir' => 'Die aangevraagde pad is nie die ingestelde oplaaigids nie.',
+'img-auth-badtitle' => 'Dit was nie moontlik om \'n geldige bladsynaam van "$1" te maak nie.',
+'img-auth-nologinnWL' => 'U is nie aangeteken en "$1" is nie op die witlys nie.',
+'img-auth-nofile' => 'Lêer "$1" bestaan nie.',
+'img-auth-isdir' => 'U probeer om toegang na gids "$1" te kry.
Slegs toegang tot lêers word toegelaat.',
-'img-auth-streaming' => 'Besig met die stoom van "$1".',
-'img-auth-public' => "Die doel van img_auth.php is die afvoer van lêers vanaf 'n privaat wiki.
+'img-auth-streaming' => 'Besig met die stoom van "$1".',
+'img-auth-public' => "Die doel van img_auth.php is die afvoer van lêers vanaf 'n privaat wiki.
Hierdie wiki is opgestel as 'n publieke wiki.
Vir veiligheidsredes is img_auth.php gedeaktiveer.",
-'img-auth-noread' => 'Gebruiker het nie toegang om "$1" te lees nie.',
+'img-auth-noread' => 'Gebruiker het nie toegang om "$1" te lees nie.',
+'img-auth-bad-query-string' => 'Die URL het \'n ongeldige navraagstring ("query string").',
# HTTP errors
'http-invalid-url' => 'Ongeldige URL: $1',
@@ -1656,6 +1701,7 @@ Klik op die opskrifte om die tabel anders te sorteer.',
'listfiles_search_for' => 'Soek vir medianaam:',
'imgfile' => 'lêer',
'listfiles' => 'Lêerlys',
+'listfiles_thumb' => 'Duimnael',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Naam',
'listfiles_user' => 'Gebruiker',
@@ -1768,8 +1814,8 @@ Die beskrywing op die [$2 lêer se inligtingsblad] word hieronder weergegee.',
'statistics-edits' => 'Wysigings sedert {{SITENAME}} begin is',
'statistics-edits-average' => 'Gemiddelde wysigings per bladsy',
'statistics-views-total' => 'Totale aantal bladsye vertoon',
+'statistics-views-total-desc' => 'Die wys van nie-bestaande bladsye en spesiale bladsye is nie ingesluit nie',
'statistics-views-peredit' => 'Bladsye besigtig per wysiging',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job queue] lengte',
'statistics-users' => 'Geregistreerde [[Special:ListUsers|gebruikers]]',
'statistics-users-active' => 'Aktiewe grbruikers',
'statistics-users-active-desc' => "Gebruikers wat in die afgelope {{PLURAL:$1|dag|$1 dae}} 'n handeling uitgevoer het",
@@ -1784,7 +1830,7 @@ Die bladsye moet gewysig word om eerder direk na die regte onderwerpe te skakel.
'doubleredirects' => 'Dubbele aansture',
'doubleredirectstext' => 'Hierdie lys bevat bladsye wat aansture na ander aanstuurblaaie is.
Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reël van van die tweede aanstuur se teks, wat gewoonlik die "regte" teiken-bladsy gee waarna die eerste aanstuur behoort te wys.
-<s>Doodgekrapte reëls</s> dui aan dat die probleem reeds opgelos is.',
+<del>Doodgekrapte reëls</del> dui aan dat die probleem reeds opgelos is.',
'double-redirect-fixed-move' => "[[$1]] was geskuif en is nou 'n deurverwysing na [[$2]].",
'double-redirect-fixer' => 'Aanstuur hersteller',
@@ -1807,6 +1853,8 @@ Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reÃ
'nmembers' => '$1 {{PLURAL:$1|lid|lede}}',
'nrevisions' => '$1 {{PLURAL:$1|weergawe|weergawes}}',
'nviews' => '$1 {{PLURAL:$1|keer|kere}} aangevra',
+'nimagelinks' => 'Gebruik op {{PLURAL:$1|een bladsy|$1 bladsye}}',
+'ntransclusions' => 'gebruik op {{PLURAL:$1|een bladsy|$1 bladsye}}',
'specialpage-empty' => 'Die verslag lewer geen resultate nie.',
'lonelypages' => 'Weesbladsye',
'lonelypagestext' => 'Die volgende bladsye is nie geskakel of ingesluit in ander bladsye op {{SITENAME}} nie:',
@@ -1965,33 +2013,39 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
'listgrouprights-removegroup-self-all' => 'Alle groepe verwyder van eie gebruiker',
# E-mail user
-'mailnologin' => 'Geen versendadres beskikbaar',
-'mailnologintext' => "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in die [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te stuur.",
-'emailuser' => 'Stuur e-pos na hierdie gebruiker',
-'emailpage' => 'Stuur e-pos na gebruiker',
-'emailpagetext' => 'As dié gebruiker \'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm \'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verkyn as die "Van"-adres van die pos. Dus sal die ontvanger kan terug antwoord.',
-'usermailererror' => 'Fout met versending van e-pos:',
-'defemailsubject' => '{{SITENAME}}-epos',
-'noemailtitle' => 'Geen e-posadres',
-'noemailtext' => "Hierdie gebruiker het nie 'n geldige e-posadres gespesifiseer nie.",
-'nowikiemailtitle' => 'Geen E-pos toegelaat nie',
-'nowikiemailtext' => 'Hierdie gebruiker wil geen e-pos van andere gebruikers ontvang nie.',
-'email-legend' => "Stuur 'n E-pos na 'n ander gebruiker van {{SITENAME}}",
-'emailfrom' => 'Van:',
-'emailto' => 'Aan:',
-'emailsubject' => 'Onderwerp:',
-'emailmessage' => 'Boodskap:',
-'emailsend' => 'Stuur',
-'emailccme' => "E-pos vir my 'n kopie van my boodskap.",
-'emailccsubject' => 'Kopie van u boodskap aan $1: $2',
-'emailsent' => 'E-pos gestuur',
-'emailsenttext' => 'U e-pos is gestuur.',
-'emailuserfooter' => 'Hierdie e-pos is gestuur deur $1 aan $2 met behulp van die "Stuur e-pos aan die gebruiker"-funksie van {{SITENAME}}.',
+'mailnologin' => 'Geen versendadres beskikbaar',
+'mailnologintext' => "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in die [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te stuur.",
+'emailuser' => 'Stuur e-pos na hierdie gebruiker',
+'emailpage' => 'Stuur e-pos na gebruiker',
+'emailpagetext' => 'As dié gebruiker \'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm \'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verkyn as die "Van"-adres van die pos. Dus sal die ontvanger kan terug antwoord.',
+'usermailererror' => 'Fout met versending van e-pos:',
+'defemailsubject' => '{{SITENAME}}-epos',
+'usermaildisabled' => 'E-pos deur gebruikers is gedeaktiveer.',
+'usermaildisabledtext' => 'U kan nie e-pos aan ander gebruikers op hierdie wiki stuur nie',
+'noemailtitle' => 'Geen e-posadres',
+'noemailtext' => "Hierdie gebruiker het nie 'n geldige e-posadres gespesifiseer nie.",
+'nowikiemailtitle' => 'Geen E-pos toegelaat nie',
+'nowikiemailtext' => 'Hierdie gebruiker wil geen e-pos van andere gebruikers ontvang nie.',
+'email-legend' => "Stuur 'n E-pos na 'n ander gebruiker van {{SITENAME}}",
+'emailfrom' => 'Van:',
+'emailto' => 'Aan:',
+'emailsubject' => 'Onderwerp:',
+'emailmessage' => 'Boodskap:',
+'emailsend' => 'Stuur',
+'emailccme' => "E-pos vir my 'n kopie van my boodskap.",
+'emailccsubject' => 'Kopie van u boodskap aan $1: $2',
+'emailsent' => 'E-pos gestuur',
+'emailsenttext' => 'U e-pos is gestuur.',
+'emailuserfooter' => 'Hierdie e-pos is gestuur deur $1 aan $2 met behulp van die "Stuur e-pos aan die gebruiker"-funksie van {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Verlaat stelselboodskap.',
+'usermessage-editor' => 'Stelselboodskapper',
# Watchlist
'watchlist' => 'My dophoulys',
'mywatchlist' => 'My dophoulys',
-'watchlistfor' => "(vir '''$1''')",
+'watchlistfor2' => 'Vir $1 $2',
'nowatchlist' => 'U het geen items in u dophoulys nie.',
'watchlistanontext' => '$1 is noodsaaklik om u dophoulys te sien of te wysig.',
'watchnologin' => 'Nie ingeteken nie',
@@ -2112,7 +2166,10 @@ Die mees onlangse wysiging is gemaak deur [[User:$3|$3]] ([[User talk:$3|besprek
'revertpage' => 'Wysigings deur [[Special:Contributions/$2|$2]] teruggerol na laaste weergawe deur $1',
'revertpage-nouser' => 'Rol wysigings deur (gebruikersnaam verwyder) terug na die laaste weergawe deur [[User:$1|$1]]',
'rollback-success' => 'Wysigings deur $1 teruggerol; terugverander na laaste weergawe deur $2.',
-'sessionfailure' => "Dit lyk of daar 'n probleem met u sessie is.
+
+# Edit tokens
+'sessionfailure-title' => 'Sessie het gefaal',
+'sessionfailure' => "Dit lyk of daar 'n probleem met u sessie is.
Hierdie aksie is gekanselleer omdat dit 'n veiligheidsrisiko is (moontlike kaping van u sessie).
Gaan een bladsy terug, herlaai die bladsy en probeer dan weer.",
@@ -2246,18 +2303,22 @@ $1',
'month' => 'Vanaf maand (en vroeër):',
'year' => 'Vanaf jaar (en vroeër):',
-'sp-contributions-newbies' => 'Wys slegs bydraes van nuwe gebruikers',
-'sp-contributions-newbies-sub' => 'Vir nuwe gebruikers',
-'sp-contributions-newbies-title' => 'Bydraes van nuwe gebruikers',
-'sp-contributions-blocklog' => 'blokkeer-logboek',
-'sp-contributions-deleted' => 'geskrapte gebruikersbydraes',
-'sp-contributions-logs' => 'logboeke',
-'sp-contributions-talk' => 'bespreking',
-'sp-contributions-userrights' => 'bestuur gebruikersregte',
-'sp-contributions-blocked-notice' => 'Hierdie gebruiker is tans geblokkeer. Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
-'sp-contributions-search' => 'Soek na bydraes',
-'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
-'sp-contributions-submit' => 'Vertoon',
+'sp-contributions-newbies' => 'Wys slegs bydraes van nuwe gebruikers',
+'sp-contributions-newbies-sub' => 'Vir nuwe gebruikers',
+'sp-contributions-newbies-title' => 'Bydraes van nuwe gebruikers',
+'sp-contributions-blocklog' => 'blokkeer-logboek',
+'sp-contributions-deleted' => 'geskrapte gebruikersbydraes',
+'sp-contributions-uploads' => 'oplaaie',
+'sp-contributions-logs' => 'logboeke',
+'sp-contributions-talk' => 'bespreking',
+'sp-contributions-userrights' => 'bestuur gebruikersregte',
+'sp-contributions-blocked-notice' => 'Hierdie gebruiker is tans geblokkeer. Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
+'sp-contributions-blocked-notice-anon' => 'Hierdie IP-adres is tans geblokkeer.
+Die laaste inskrywing uit die blokkeerlogboek word hier ter inligting weergegee:',
+'sp-contributions-search' => 'Soek na bydraes',
+'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
+'sp-contributions-toponly' => 'Wys slegs die nuutste weergawes',
+'sp-contributions-submit' => 'Vertoon',
# What links here
'whatlinkshere' => 'Skakels hierheen',
@@ -2318,7 +2379,6 @@ Sien die [[Special:IPBlockList|IP-bloklys]] vir 'n oorsig van blokkerings.",
'ipb-edit-dropdown' => 'Werk lys van redes by',
'ipb-unblock-addr' => 'Deblokkeer $1',
'ipb-unblock' => "Deblokkeer 'n gebruiker of IP-adres",
-'ipb-blocklist-addr' => 'Bestaande blokkades vir $1',
'ipb-blocklist' => 'Wys bestaande blokkades',
'ipb-blocklist-contribs' => 'Bydraes van $1',
'unblockip' => 'Maak IP-adres oop',
@@ -2394,6 +2454,8 @@ U kan nie 'n rekening skep nie.",
'cant-block-while-blocked' => 'U kan nie ander gebruikers blokkeer terwyl u self geblokkeer is nie.',
'cant-see-hidden-user' => "Die gebruiker wat u probeer blokkeer is reeds geblokkeer en weggesteek.
Aangesien u nie die 'hideuser'-reg het nie, kan u nie die blokkade van die gebruiker sien of wysig nie.",
+'ipbblocked' => 'U kan nie ander gebruikers (de)blokkeer nie, omdat u self geblokkeer is',
+'ipbnounblockself' => 'U mag uself nie deblokkeer nie',
# Developer tools
'lockdb' => 'Sluit databasis',
@@ -2428,6 +2490,16 @@ Let daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy
<b>WAARSKUWING!</b>
Hierdie kan 'n drastiese en onverwagte verandering vir 'n gewilde bladsy wees;
maak asseblief seker dat u die gevolge van hierdie aksie verstaan voordat u voortgaan. Gebruik ook die ooreenstemmende besprekingsbladsy om oorleg te pleeg met ander bydraers.",
+'movepagetext-noredirectfixer' => "Die vorm hier onder hernoem 'n bladsy en skuif sy hele wysigingsgeskiedenis na die nuwe naam.
+Die ou bladsy sal vervang word met 'n aanstuurblad na die nuwe titel.
+Wees asseblief op die uitkyk vir vir [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|stukkende aansture]].
+Dit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.
+
+Let daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy met dieselfde titel bestaan nie, tensy dit leeg of 'n aanstuurbladsy is en geen wysigingsgeskiedenis het nie. Dit beteken dat u 'n bladsy kan terugskuif na sy ou titel indien u 'n fout begaan het, maar u kan nie 'n bestaande bladsy oorskryf nie.
+
+<b>WAARSKUWING!</b>
+Hierdie kan 'n drastiese en onverwagte verandering vir 'n gewilde bladsy wees;
+maak asseblief seker dat u die gevolge van hierdie aksie verstaan voordat u voortgaan.",
'movepagetalktext' => "Die ooreenstemmende besprekingsblad sal outomaties saam geskuif word, '''tensy:'''
*'n Besprekengsblad met die nuwe naam reeds bestaan, of
*U die keuse hier onder deselekteer.
@@ -2485,6 +2557,7 @@ Die teikenartikel "[[:$1]]" bestaan reeds. Wil u dit skrap om plek te maak vir d
'immobile-source-page' => 'Die bladsy kan nie geskuif word nie.',
'immobile-target-page' => 'Dit is nie moontlik om na die titel toe te skuif nie.',
'imagenocrossnamespace' => "'n Medialêer kan nie na 'n ander naamruimte geskuif word nie",
+'nonfile-cannot-move-to-file' => 'Net lêers kan na die lêernaamspasie geskuif word',
'imagetypemismatch' => 'Die nuwe lêer se uitbreiding pas nie by die lêertipe nie',
'imageinvalidfilename' => 'Die nuwe lêernaam is ongeldig',
'fix-double-redirects' => 'Opdateer alle aansture wat na die oorspronklike titel wys',
@@ -2564,6 +2637,7 @@ Stoor die afvoer op u eie rekenaar, en laai dit hier op.',
'importstart' => 'Importeer bladsye...',
'import-revision-count' => '$1 {{PLURAL:$1|weergawe|weergawes}}',
'importnopages' => 'Geen bladsye om te importeer nie.',
+'imported-log-entries' => '$1 {{PLURAL:$1|logboekreël|logboekreëls}} geïmporteer.',
'importfailed' => 'Intrek onsuksesvol: $1',
'importunknownsource' => 'Onbekende brontipe.',
'importcantopen' => 'Kon nie lêer oopmaak nie',
@@ -2660,6 +2734,8 @@ Die lêer is slegs gedeeltelik opgelaai.',
'tooltip-rollback' => '"Terugrol" rol met een kliek wysiging(s) terug wat die laaste gebruiker aan hierdie bladsy aangebring het.',
'tooltip-undo' => 'Met "ongedaan maak" maak u hierdie wysiging ongedaan en land u in die wysigingsvenster.
U kan daar \'n wysigingsopsomming byvoeg.',
+'tooltip-preferences-save' => 'Stoor voorkeure',
+'tooltip-summary' => "Verskaf 'n kort opsomming",
# Stylesheets
'common.css' => '/** Gemeenskaplike CSS vir alle omslae */',
@@ -2763,14 +2839,17 @@ $1',
'imagemaxsize' => "Beperk beeldgrootte tot:<br />''(vir lêerbeskrywingsbladsye)''",
'thumbsize' => 'Grootte van duimnaelskets:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|bladsy|bladsye}}',
-'file-info' => '(lêergrootte: $1, MIME-tipe: $2)',
-'file-info-size' => '($1 × $2 pixels, lêergrootte: $3, MIME type: $4)',
+'file-info' => 'lêergrootte: $1, MIME-tipe: $2',
+'file-info-size' => '$1 × $2 pixels, lêergrootte: $3, MIME type: $4',
'file-nohires' => '<small>Geen hoër resolusie is beskikbaar nie.</small>',
-'svg-long-desc' => '(SVG-lêer, nominaal $1 × $2 pixels, lêergrootte: $3)',
+'svg-long-desc' => 'SVG-lêer, nominaal $1 × $2 pixels, lêergrootte: $3',
'show-big-image' => 'Volle resolusie',
'show-big-image-thumb' => '<small>Grootte van hierdie voorskou: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'herhalend',
'file-info-gif-frames' => '$1 {{PLURAL:$1|raam|rame}}',
+'file-info-png-looped' => 'herhalend',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|keer|kere}} gespeel',
+'file-info-png-frames' => '$1 {{PLURAL:$1|raam|rame}}',
# Special:NewFiles
'newimages' => 'Gallery van nuwe beelde',
@@ -2926,6 +3005,7 @@ Ander velde sal versteek wees.
'exif-gpsareainformation' => 'Naam van GPS-gebied',
'exif-gpsdatestamp' => 'GPS-datum',
'exif-gpsdifferential' => 'Differensiële GPS-korreksie',
+'exif-objectname' => 'Kort titel',
# EXIF attributes
'exif-compression-1' => 'Ongekompakteerd',
@@ -3007,6 +3087,8 @@ Ander velde sal versteek wees.
'exif-sensingmethod-7' => 'Drielynige sensor',
'exif-sensingmethod-8' => 'Kleurvolgende lynsensor',
+'exif-filesource-3' => 'Digitale fotokamera',
+
'exif-scenetype-1' => "'n Direk gefotografeerde beeld",
'exif-customrendered-0' => 'Normale verwerking',
@@ -3083,26 +3165,26 @@ Ander velde sal versteek wees.
'limitall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'Bevestig e-posadres',
-'confirmemail_noemail' => "U het nie 'n geldige e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] gestel nie.",
-'confirmemail_text' => "Hierdie wiki vereis dat u e-posadres bevestig word voordat epos-funksies gebruik word. Klik onderstaande knoppie om 'n bevestigingspos na u adres te stuur. Die pos sal 'n skakel met 'n kode insluit; maak hierdie skakel oop in u webblaaier om te bevestig dat die adres geldig is.",
-'confirmemail_pending' => "'n Bevestigings-kode is reeds per e-pos aan u gestuur.
+'confirmemail' => 'Bevestig e-posadres',
+'confirmemail_noemail' => "U het nie 'n geldige e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] gestel nie.",
+'confirmemail_text' => "Hierdie wiki vereis dat u e-posadres bevestig word voordat epos-funksies gebruik word. Klik onderstaande knoppie om 'n bevestigingspos na u adres te stuur. Die pos sal 'n skakel met 'n kode insluit; maak hierdie skakel oop in u webblaaier om te bevestig dat die adres geldig is.",
+'confirmemail_pending' => "'n Bevestigings-kode is reeds per e-pos aan u gestuur.
As u onlangs u gebruiker geskep het, wag asseblief 'n paar minute vir aflewering alvorens u 'n nuwe kode versoek.",
-'confirmemail_send' => "Pos 'n bevestigingkode",
-'confirmemail_sent' => 'Bevestigingpos gestuur.',
-'confirmemail_oncreate' => "'n Bevestigings-kode is na u e-posadres gestuur.
+'confirmemail_send' => "Pos 'n bevestigingkode",
+'confirmemail_sent' => 'Bevestigingpos gestuur.',
+'confirmemail_oncreate' => "'n Bevestigings-kode is na u e-posadres gestuur.
Hierdie kode word nie benodig om aan te teken nie, maar u moet dit bevestig alvorens u enige van die wiki se e-posfunksies kan gebruik.",
-'confirmemail_sendfailed' => '{{SITENAME}} kon nie u bevestigings-epos uitstuur nie.
+'confirmemail_sendfailed' => '{{SITENAME}} kon nie u bevestigings-epos uitstuur nie.
Kontroleer u e-posadres vir ongeldige karakters.
Die e-posprogram meld: $1',
-'confirmemail_invalid' => 'Ongeldige bevestigingkode. Die kode het moontlik verval.',
-'confirmemail_needlogin' => 'U moet $1 om u e-posadres te bevestig.',
-'confirmemail_success' => 'U e-posadres is bevestig. U kan nou aanteken en die wiki gebruik.',
-'confirmemail_loggedin' => 'U e-posadres is nou bevestig.',
-'confirmemail_error' => 'Iets het foutgegaan met die stoor van u bevestiging.',
-'confirmemail_subject' => '{{SITENAME}}: E-posadres-bevestiging',
-'confirmemail_body' => 'Iemand, waarskynlik u vanaf IP-adres: $1, het \'n rekening "$2" met hierdie e-posadres by {{SITENAME}} geregistreer.
+'confirmemail_invalid' => 'Ongeldige bevestigingkode. Die kode het moontlik verval.',
+'confirmemail_needlogin' => 'U moet $1 om u e-posadres te bevestig.',
+'confirmemail_success' => 'U e-posadres is bevestig. U kan nou aanteken en die wiki gebruik.',
+'confirmemail_loggedin' => 'U e-posadres is nou bevestig.',
+'confirmemail_error' => 'Iets het foutgegaan met die stoor van u bevestiging.',
+'confirmemail_subject' => '{{SITENAME}}: E-posadres-bevestiging',
+'confirmemail_body' => 'Iemand, waarskynlik u vanaf IP-adres: $1, het \'n rekening "$2" met hierdie e-posadres by {{SITENAME}} geregistreer.
Om te bevestig dat hierdie adres werklik aan u behoort, en om die posfasiliteite by {{SITENAME}} te aktiveer, besoek hierdie skakel in u webblaaier:
@@ -3114,8 +3196,32 @@ Volg hierdie skakel om die bevestiging van u e-posadres te kanselleer:
$5
Hierdie bevestigingkode verval om $4.',
-'confirmemail_invalidated' => 'Die e-pos bevestiging is gekanselleer.',
-'invalidateemail' => 'Kanselleer e-pos bevestiging',
+'confirmemail_body_changed' => 'Iemand, waarskynlik u vanaf IP-adres $1
+het die e-posadres van rekening "$2" na hierdie adres op {{SITENAME}} verander.
+
+Om te bevestig dat hierdie adres werklik aan u behoort, en die e-pos-funksies op {{SITENAME}} te aktiveer, maak hierdie skakel in u blaaier oop:
+
+$3
+
+Indien die rekening *nie* aan u behoort nie, volg hierdie skakel om die bevestiging te kanselleer:
+
+$5
+
+Die bevestigingskode sal om $4 verval.',
+'confirmemail_body_set' => 'Iemand, waarskynlik u vanaf IP-adres $1
+het die e-posadres van rekening "$2" na hierdie adres op {{SITENAME}} verander.
+
+Om te bevestig dat hierdie adres werklik aan u behoort, en die e-pos-funksies op {{SITENAME}} te heraktiveer, maak hierdie skakel in u blaaier oop:
+
+$3
+
+Indien die rekening *nie* aan u behoort nie, volg hierdie skakel om die bevestiging te kanselleer:
+
+$5
+
+Die bevestigingskode sal om $4 verval.',
+'confirmemail_invalidated' => 'Die e-pos bevestiging is gekanselleer.',
+'invalidateemail' => 'Kanselleer e-pos bevestiging',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-invoeging van sjablone is afgeskakel]',
@@ -3154,6 +3260,7 @@ Bevestig asseblief dat u regtig hierdie blad oor wil skep.",
'table_pager_first' => 'Eerste bladsy',
'table_pager_last' => 'Laaste bladsy',
'table_pager_limit' => 'Wys $1 resultate per bladsy',
+'table_pager_limit_label' => 'Items per bladsy:',
'table_pager_limit_submit' => 'Laat waai',
'table_pager_empty' => 'Geen resultate',
@@ -3218,6 +3325,7 @@ U kan ook die [[Special:Watchlist/edit|standaard opdaterigskerm gebruik]].',
'version-specialpages' => 'Spesiale bladsye',
'version-parserhooks' => 'Ontlederhoeke',
'version-variables' => 'Veranderlikes',
+'version-skins' => 'Omslae',
'version-other' => 'Ander',
'version-mediahandlers' => 'Mediaverwerkers',
'version-hooks' => 'Hoeke',
@@ -3229,6 +3337,13 @@ U kan ook die [[Special:Watchlist/edit|standaard opdaterigskerm gebruik]].',
'version-hook-subscribedby' => 'Gebruik deur',
'version-version' => '(Weergawe $1)',
'version-license' => 'Lisensie',
+'version-poweredby-credits' => "Hierdie wiki word aangedryf deur '''[http://www.mediawiki.org/ MediaWiki]''', kopiereg © 2001-$1 $2.",
+'version-poweredby-others' => 'andere',
+'version-license-info' => 'MediaWiki is vrye sagteware, u kan MediaWiki versprei en/of wysig onder die voorwaardes van die "GNU Algemene Publieke Lisensie", soos deur die "Free Software Foundation" gepubliseer; óf weergawe 2 van die lisensie, of (as u wil) enige latere weergawe daarvan.
+
+MediaWiki word versprei met die hoop dat dit nuttig sal wees, maar SONDER ENIGE WAARBORGE, selfs sonder geïmpliseerde waarborg van VERHANDELBAARHEID of GESKIKTHEID VIR \'N SPESIFIEKE DOEL. Verwys na die "GNU Algemene Publieke Lisensie" vir meer besonderhede.
+
+Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van die "GNU Algemene Publieke Lisensie"] ontvang het, indien nie, skryf aan die "Free Software Foundation, Inc", 51 Franklin-straat, Vyfde Vloer, Boston, MA 02110-1301, Verenigde State van Amerika of [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lees dit hier aanlyn].',
'version-software' => 'Geïnstalleerde sagteware',
'version-software-product' => 'Produk',
'version-software-version' => 'Weergawe',
@@ -3299,6 +3414,15 @@ Verskaf die lêernaam sonder die "{{ns:file}}:" voorvoegsel.',
'tags-edit' => 'wysig',
'tags-hitcount' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
+# Special:ComparePages
+'comparepages' => 'Vergelyk bladsye',
+'compare-selector' => 'Vergelyk bladsyweergawes',
+'compare-page1' => 'Bladsy 1',
+'compare-page2' => 'Bladsy 2',
+'compare-rev1' => 'Weergawe 1',
+'compare-rev2' => 'Weergawe 2',
+'compare-submit' => 'Vergelyk',
+
# Database error messages
'dberr-header' => "Die wiki het 'n probleem",
'dberr-problems' => 'Jammer! Die webwerf ondervind op die oomblik tegniese probleme.',
@@ -3315,8 +3439,13 @@ Verskaf die lêernaam sonder die "{{ns:file}}:" voorvoegsel.',
'htmlform-float-invalid' => "Die waarde wat u ingevoer het is nie 'n getal nie.",
'htmlform-int-toolow' => 'Die ingevoerde waarde is laer as die minimum van $1',
'htmlform-int-toohigh' => 'Die ingevoerde waarde is groter as die maksimum van $1',
+'htmlform-required' => 'Hierdie waarde is verpligtend',
'htmlform-submit' => 'Dien in',
'htmlform-reset' => 'Maak wysigings ongedaan',
'htmlform-selectorother-other' => 'Ander',
+# SQLite database support
+'sqlite-has-fts' => 'Weergawe $1 met ondersteuning vir vol-teks soektogte ("full-text search")',
+'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
+
);
diff --git a/languages/messages/MessagesAln.php b/languages/messages/MessagesAln.php
index b514fc32..e457de88 100644
--- a/languages/messages/MessagesAln.php
+++ b/languages/messages/MessagesAln.php
@@ -33,14 +33,14 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Perdoruesi' => NS_USER,
+ 'Perdoruesi' => NS_USER,
'Perdoruesi_diskutim' => NS_USER_TALK,
- 'Përdoruesi' => NS_USER,
+ 'Përdoruesi' => NS_USER,
'Përdoruesi_diskutim' => NS_USER_TALK,
- 'Figura' => NS_FILE,
- 'Figura_diskutim' => NS_FILE_TALK,
- 'Kategori' => NS_CATEGORY,
- 'Kategori_Diskutim' => NS_CATEGORY_TALK
+ 'Figura' => NS_FILE,
+ 'Figura_diskutim' => NS_FILE_TALK,
+ 'Kategori' => NS_CATEGORY,
+ 'Kategori_Diskutim' => NS_CATEGORY_TALK
);
$specialPageAliases = array(
@@ -77,8 +77,7 @@ $messages = array(
'tog-editsection' => 'Lejo redaktimin e seksioneve me opcionin [redakto]',
'tog-editsectiononrightclick' => 'Lejo redaktimin e seksioneve tue klikue me të djathtë mbi titull (JavaScript)',
'tog-showtoc' => 'Trego përmbajtjen<br />(për faqet me mâ shum se 3 tituj)',
-'tog-rememberpassword' => 'Ruej fjalëkalimin në këtë kompjuter',
-'tog-editwidth' => 'Zgjâno kutinë për redaktim sa krejt ekrani',
+'tog-rememberpassword' => 'Ruej fjalëkalimin tem në këtë shfletues (për $1 {{PLURAL:$1|ditë|ditë}})',
'tog-watchcreations' => 'Shtoji në listë mbikëqyrëse faqet që i krijoj vetë',
'tog-watchdefault' => 'Shtoji në listë mbikëqyrëse faqet që i redaktoj',
'tog-watchmoves' => 'Shtoji në listë mbikëqyrëse faqet që i zhvendosi',
@@ -226,31 +225,21 @@ $messages = array(
'faqpage' => 'Project:Pyetjet e shpeshta',
# Vector skin
-'vector-action-addsection' => 'Shto temë',
-'vector-action-delete' => 'Fshij',
-'vector-action-move' => 'Zhvendos',
-'vector-action-protect' => 'Mbroj',
-'vector-action-undelete' => 'Kthe fshimjen mbrapsht',
-'vector-action-unprotect' => 'Hiq mbrojtjen',
-'vector-namespace-category' => 'Kategoria',
-'vector-namespace-help' => 'Faqja e ndihmës',
-'vector-namespace-image' => 'Skeda',
-'vector-namespace-main' => 'Faqja',
-'vector-namespace-media' => 'Faqja e mediave',
-'vector-namespace-mediawiki' => 'Mesazhi',
-'vector-namespace-project' => 'Faqja e projektit',
-'vector-namespace-special' => 'Faqja speciale',
-'vector-namespace-talk' => 'Diskutimi',
-'vector-namespace-template' => 'Shablloni',
-'vector-namespace-user' => 'Faqja e përdoruesit',
-'vector-view-create' => 'Krijo',
-'vector-view-edit' => 'Redakto',
-'vector-view-history' => 'Shih historinë',
-'vector-view-view' => 'Lexo',
-'vector-view-viewsource' => 'Shih kodin',
-'actions' => 'Veprimet',
-'namespaces' => 'Hapësinat',
-'variants' => 'Variantet',
+'vector-action-addsection' => 'Shto temë',
+'vector-action-delete' => 'Fshij',
+'vector-action-move' => 'Zhvendos',
+'vector-action-protect' => 'Mbroj',
+'vector-action-undelete' => 'Kthe fshimjen mbrapsht',
+'vector-action-unprotect' => 'Hiq mbrojtjen',
+'vector-simplesearch-preference' => 'Aktivizo sugjerime të avancueme në kërkim (vetëm për Vector skin)',
+'vector-view-create' => 'Krijo',
+'vector-view-edit' => 'Redakto',
+'vector-view-history' => 'Shih historinë',
+'vector-view-view' => 'Lexo',
+'vector-view-viewsource' => 'Shih kodin',
+'actions' => 'Veprimet',
+'namespaces' => 'Hapësinat',
+'variants' => 'Variantet',
'errorpagetitle' => 'Gabim',
'returnto' => 'Kthehu te $1.',
@@ -481,7 +470,7 @@ Mos harroni me i ndryshue [[Special:Preferences|parapëlqimet për {{SITENAME}}]
'yourname' => 'Nofka:',
'yourpassword' => 'Fjalëkalimi:',
'yourpasswordagain' => 'Fjalëkalimi përsëdyti:',
-'remembermypassword' => 'Mbaj mend fjalëkalimin tem në këtë kompjuter.',
+'remembermypassword' => 'Mbaj mend fjalëkalimin tem në këtë shfletues (për $1 {{PLURAL:$1|ditë|ditë}})',
'yourdomainname' => 'Domena juej:',
'externaldberror' => 'Ose pat gabim në databazën e autentifikimit, ose nuk lejoheni me ndryshue llogarinë tuej të jashtme.',
'login' => 'Kyçu',
@@ -498,6 +487,7 @@ Mos harroni me i ndryshue [[Special:Preferences|parapëlqimet për {{SITENAME}}]
'gotaccount' => "Ke llogari? '''$1'''.",
'gotaccountlink' => 'Kyçu',
'createaccountmail' => 'me email',
+'createaccountreason' => 'Arsyeja:',
'badretype' => 'Fjalëkalimet nuk janë të njêjta.',
'userexists' => 'Nofka keni zgjedhë âsht në përdorim.
Zgjedh nji emën tjetër.',
@@ -622,6 +612,7 @@ Ndoshta tashmâ e keni ndryshue fjalëkalimin me sukses, apo keni kërkue nji fj
'showdiff' => 'Trego ndryshimet',
'anoneditwarning' => "'''Kujdes:''' Ju nuk jeni i kyçun.
Adresa juej IP do të regjistrohet në historikun e redaktimit të kësaj faqeje.",
+'anonpreviewwarning' => "''Nuk jeni i kyçun. Regjistrimi ka me marrë shenim IP adresën tuej në histori të faqes.''",
'missingsummary' => "'''Vini re:''' Nuk keni specifikue përmbledhje të redaktimit.
Nëse klikoni prap në regjistro, redaktimi do të ruhet pa tê.",
'missingcommenttext' => 'Ju lutemi shtoni nji koment mâ poshtë.',
@@ -700,7 +691,7 @@ Ju lutemi kontrolloni nëse doni me krijue/redaktue këtë faqe.',
'userjspreview' => "'''Vini re, jeni tue testue/pâ veç parapâmjen e JavaScriptit tuej.'''
'''Ende nuk e keni ruejtë!'''",
'userinvalidcssjstitle' => "'''Kujdes:''' Nuk ka pâmje me emën \"\$1\".
-Vini re që faqet .css dhe .js përdorin vetëm titull me germa të vogla, psh. {{ns:user}}:Foo/monobook.css për dallim prej {{ns:user}}:Foo/Monobook.css.",
+Vini re që faqet .css dhe .js përdorin vetëm titull me germa të vogla, psh. {{ns:user}}:Foo/vector.css për dallim prej {{ns:user}}:Foo/Vector.css.",
'updated' => '(E ndryshueme)',
'note' => "'''Shenim:'''",
'previewnote' => "'''Kjo asht vetëm parapamje.'''
@@ -742,9 +733,6 @@ Gjithashtu po premtoni se këtë e keni shkrue vetë, ose e keni kopjue prej dom
Nëse nuk doni që shkrimet tueja me u redaktue pamëshirshëm dhe me u shpërnda arbitrarisht, atëherë mâ mirë mos publikoni këtu.<br />
Gjithashtu po premtoni se këtë e keni shkrue vetë, ose e keni kopjue prej domenës publike apo ndonji burimi tjetër të lirë (shih $1 për detaje).
'''Mos publikoni vepra që janë e drejtë autoriale pa leje!'''",
-'longpagewarning' => "'''Kujdes:''' Kjo faqe i ka $1 kilobyte;
-disa shfletues mujnë me pasë problem me redaktue faqe që janë afër apo mâ shumë se 32kb.
-Konsideroni mundësinë me dâ faqen në sekcione mâ të vogla.",
'longpageerror' => "'''Gabim: Teksti që po redaktoni i ka $1 kilobyte, që âsht mâ shumë se maksimumi prej $2 kilobytësh.'''
Nuk mundet me u ruejtë.",
'readonlywarning' => "'''Kujdes: Baza e të dhânave âsht mshelë për mirëmbajtje, kështuqë tashpërtash nuk keni me mujtë me i ruejtë redaktimet tueja.'''
@@ -1328,7 +1316,6 @@ Faqet në [[Special:Watchlist|listën tuej të mbikëqyrjes]] janë '''të theks
# Watchlist
'watchlist' => 'Mbikëqyrjet e mija',
'mywatchlist' => 'Lista mbikqyrëse',
-'watchlistfor' => "(për '''$1''')",
'addedwatch' => 'U shtu te lista mbikqyrëse',
'addedwatchtext' => "Faqja \"[[:\$1]]\" iu shtue [[Special:Watchlist|listës suej të mbikëqyrjes]].
Ndryshimet e ardhshme të kësaj faqeje dhe të faqes gjegjëse të diskutimit kanë me u listue këte, dhe faqja do të tregohet '''e theksueme''' në [[Special:RecentChanges|listën e ndryshimeve të fundit]] për me râ në sy.",
@@ -1599,9 +1586,9 @@ Lejon dhânien e arsyes në përmbledhje.',
'nextdiff' => 'Redaktim ma i ri →',
# Media information
-'file-info-size' => '($1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4)',
+'file-info-size' => '$1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4',
'file-nohires' => '<small>Rezolucioni i plotë.</small>',
-'svg-long-desc' => '(skeda SVG, $1 × $2 pixela, madhësia: $3)',
+'svg-long-desc' => 'skeda SVG, $1 × $2 pixela, madhësia: $3',
'show-big-image' => 'Rezolucion i plotë',
'show-big-image-thumb' => '<small>Madhësia e parapâmjes: $1 × $2 pixela</small>',
diff --git a/languages/messages/MessagesAm.php b/languages/messages/MessagesAm.php
index 3ead7069..9d39f541 100644
--- a/languages/messages/MessagesAm.php
+++ b/languages/messages/MessagesAm.php
@@ -62,8 +62,7 @@ $messages = array(
'tog-editsection' => 'በ[አርáˆ] መያያዣ ክáሠማረáˆáŠ• አስችáˆ',
'tog-editsectiononrightclick' => 'የክáሠአርዕስት ላይ በቀአበመጫን ክáሠማረáˆáŠ• አስችሠ(JavaScript)',
'tog-showtoc' => 'ከ3 አርዕስቶች በላይ ሲሆን የማá‹áŒ« ሰንጠረዥ ይታይ',
-'tog-rememberpassword' => 'መáŒá‰£á‰´áŠ• እዚህ አስሊ ላይ አስታá‹áˆµ',
-'tog-editwidth' => 'የማረሚያ ሳጥን ሙሉ ስá‹á‰µ አለá‹',
+'tog-rememberpassword' => 'ለሚቀጥለዠጊዜ በዚ ኮáˆá’á‹á‰°áˆ­ ላይ በአባáˆáŠá‰µ ስሜ መáŒá‰£á‰´áŠ• ( ቢባዛ ለ $1 {{PLURAL:$1|ቀን|ቀናት}}) አስታá‹áˆµá¢',
'tog-watchcreations' => 'እኔ የáˆáŒ áˆ­áŠ³á‰¸á‹áŠ• ገጾች ወደáˆáŠ¨á‰³á‰°áˆ‹á‰¸á‹ ገጾች á‹áˆ­á‹áˆ­ á‹áˆµáŒ¥ ጨáˆáˆ­',
'tog-watchdefault' => 'ያረáˆáŠ³á‰¸á‹áŠ• ገጾች ወደáˆáŠ¨á‰³á‰°áˆ‹á‰¸á‹ ገጾች á‹áˆ­á‹áˆ­ á‹áˆµáŒ¥ ጨáˆáˆ­',
'tog-watchmoves' => 'ያዛወርኳቸá‹áŠ• ገጾች ወደáˆáŠ¨á‰³á‰°áˆ‹á‰¸á‹ ገጾች á‹áˆ­á‹áˆ­ á‹áˆµáŒ¥ ጨáˆáˆ­',
@@ -199,27 +198,17 @@ $messages = array(
'faqpage' => 'Project:ብጊየጥ',
# Vector skin
-'vector-action-addsection' => 'ርዕስ ጨáˆáˆ­',
-'vector-action-delete' => 'አጥá‹',
-'vector-action-move' => 'ለማዛወር',
-'vector-action-protect' => 'ለመቆለá',
-'vector-action-undelete' => 'አታጥá‹',
-'vector-action-unprotect' => 'አለመቆለá',
-'vector-namespace-category' => 'መደብ',
-'vector-namespace-help' => 'እርዳታ ገጽ',
-'vector-namespace-image' => 'á‹á‹­áˆ',
-'vector-namespace-main' => 'መጣጥá',
-'vector-namespace-media' => 'á‹á‹­áˆ',
-'vector-namespace-mediawiki' => 'መáˆá‹•áŠ­á‰µ',
-'vector-namespace-special' => 'áˆá‹© ገጽ',
-'vector-namespace-talk' => 'á‹á‹­á‹­á‰µ',
-'vector-namespace-template' => 'መለጠáŠá‹«',
-'vector-namespace-user' => 'የተጠቃሚዠገጽ',
-'vector-view-create' => 'አዲስ áጠር',
-'vector-view-edit' => 'አርáˆ',
-'vector-view-history' => ' ታሪኩን አሳይ',
-'vector-view-view' => ' የተáŠá‰ á‰ ',
-'vector-view-viewsource' => 'ጥሬ ኮድ ለመመáˆáŠ¨á‰µ',
+'vector-action-addsection' => 'ርዕስ ጨáˆáˆ­',
+'vector-action-delete' => 'አጥá‹',
+'vector-action-move' => 'ለማዛወር',
+'vector-action-protect' => 'ለመቆለá',
+'vector-action-undelete' => 'አታጥá‹',
+'vector-action-unprotect' => 'አለመቆለá',
+'vector-view-create' => 'አዲስ áጠር',
+'vector-view-edit' => 'አርáˆ',
+'vector-view-history' => ' ታሪኩን አሳይ',
+'vector-view-view' => ' የተáŠá‰ á‰ ',
+'vector-view-viewsource' => 'ጥሬ ኮድ ለመመáˆáŠ¨á‰µ',
'errorpagetitle' => 'ስህተት',
'returnto' => '(ወደ $1 ለመመለስ)',
@@ -418,7 +407,7 @@ $2",
'yourname' => 'Username / የብዕር ስáˆ:',
'yourpassword' => 'Password / መáŒá‰¢á‹« ቃáˆ',
'yourpasswordagain' => 'መáŒá‰¢á‹« ቃáˆá‹ŽáŠ• ዳáŒáˆ˜áŠ› ይስጡ',
-'remembermypassword' => '(መáŒá‰¢á‹«á‹Ž እንዲታወስ áˆáˆáŠ­á‰µ እዚህ ያድርጉ)',
+'remembermypassword' => 'ለሚቀጥለዠጊዜ በዚ ኮáˆá’á‹á‰°áˆ­ ላይ በአባáˆáŠá‰µ ስሜ መáŒá‰£á‰´áŠ• ( ቢባዛ ለ $1 {{PLURAL:$1|ቀን|ቀናት}}) አስታá‹áˆµá¢',
'yourdomainname' => 'የእርስዎ ከባቢ (domain)á¦',
'externaldberror' => 'ወይሠአáአዊ የማረጋገጫ መረጃ-ቤት ስኅተት áŠá‰ áˆ¨á£ ወይሠአáአዊ አባáˆáŠá‰µá‹ŽáŠ• ማሳደስ አáˆá‰°áˆá‰€á‹±áˆá¢',
'login' => 'ለመáŒá‰£á‰µ',
@@ -576,7 +565,7 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'userjsyoucanpreview' => "'''áˆáŠ­áˆ­á¦''' ሳይቆጠብ አዲስ JSዎን ለመሞከር 'ቅድመ እይታ' የሚለá‹áŠ• ይጫኑá¢",
'usercsspreview' => "'''ማስታወሻᦠCSS-ዎን ለሙከራ ብቻ እያዩ áŠá‹á¤ ገና አáˆá‰°á‰†áŒ á‰ áˆ!'''",
'userjspreview' => "'''ማስታወሻᦠJavaScriptዎን ለሙከራ ብቻ እያዩ áŠá‹á¤ ገና አáˆá‰°á‰†áŒ á‰ áˆ!'''",
-'userinvalidcssjstitle' => "'''ማስጠንቀቂያá¦''' «$1» የሚባሠመáˆáŠ­ የለáˆá¢ áˆá‹© .css እና .js ገጾች በትንንሽ እንáŒáˆŠá‹áŠ› áŠá‹°áˆ መጀመር እንዳለባቸዠያስታá‹áˆ±á¢ ለáˆáˆ³áˆŒá¦ {{ns:user}}:Foo/monobook.css áˆáŠ­ áŠá‹ እንጂ {{ns:user}}:Foo/Monobook.css አይደለáˆá¢",
+'userinvalidcssjstitle' => "'''ማስጠንቀቂያá¦''' «$1» የሚባሠመáˆáŠ­ የለáˆá¢ áˆá‹© .css እና .js ገጾች በትንንሽ እንáŒáˆŠá‹áŠ› áŠá‹°áˆ መጀመር እንዳለባቸዠያስታá‹áˆ±á¢ ለáˆáˆ³áˆŒá¦ {{ns:user}}:Foo/vector.css áˆáŠ­ áŠá‹ እንጂ {{ns:user}}:Foo/Vector.css አይደለáˆá¢",
'updated' => '(የታደሰ)',
'note' => "'''ማሳሰቢያá¦'''",
'previewnote' => "ማስታወቂያᦠ'''ይህ ለሙከራዠብቻ áŠá‹ የሚታየዠ-- áˆáŠ•áˆ ለá‹áŒ¦á‰½ ገና አáˆá‰°áˆ‹áŠ©áˆ!'''",
@@ -600,7 +589,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'copyrightwarning2' => "ወደ {{SITENAME}} የሚላከዠአስተዋጽኦ áˆáˆ‰ በሌሎች ተጠቃሚዎች ሊታረáˆá£ ሊለወጥᣠወይሠሊጠዠእንደሚቻሠያስታá‹áˆ±á¢ ጽሕáˆá‰µá‹Ž እንዲታረሠካáˆá‹ˆá‹°á‹±á£ ወደዚህ አይáˆáŠ©á‰µá¢<br />
á‹°áŒáˆž ይህ የራስዎ ጽሕáˆá‰µ ወይሠከáŠáŒ» áˆáŠ•áŒ­ የተቀዳ ጽሕáˆá‰µ መáˆáŠ‘ን ያረጋáŒáŒ£áˆ‰á¢ (ለá‹áˆ­á‹áˆ­ $1 á‹­á‹©)á¢
'''አለáˆá‰ƒá‹µá¡ መብቱ የተጠበቀá‹áŠ• ሥራ አይáˆáŠ©á‰µ!'''",
-'longpagewarning' => "'''ማስጠንቀቂያᦠየዚሠገጽ መጠን እስከ $1 kilobyte ድረስ ደርሷáˆá¤ አንድ ጽሑá ከ32 kilobyte የበለጠ ሲሆን ይህ áŒá‹™ááŠá‰µ ለአንዳንድ ተጠቃሚ ዌብ-ብራá‹á‹˜áˆ­ ያስቸáŒáˆ«áˆá¢ እባክዎንᣠገጹን ወደ ተለያዩ ገጾች ማከá‹áˆáˆáŠ• ያስቡበትᢠ'''",
'longpageerror' => "'''ስህተትᦠያቀረቡት ጽሕáˆá‰µ $1 kb áŠá‹á¤ ይህሠከተáˆá‰€á‹°á‹ ወሰን $2 kb በላይ áŠá‹á¢ ሊቆጠብ አይችáˆáˆá¢'''",
'readonlywarning' => ":'''ማስታወቂያá¦''' {{SITENAME}} አáˆáŠ• ለአጭር áŒá‹œ ተቆáˆáŽ ገጹን ለማቅረብ አይቻáˆáˆá¢ ጥቂት ደቂቃ ቆይተዠእባክዎ እንደገና ይሞክሩት!
:(The database has been temporarily locked for maintenance, so you cannot save your edits at this time. You may wish to cut-&-paste the text into another file, and try again in a moment or two.)",
@@ -877,7 +865,7 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'prefs-info' => ' መሰረታዊ መረጃ',
'prefs-signature' => 'áŠáˆ­áˆ›',
'prefs-dateformat' => ' የቀን ቅርá€á‰µ',
-'prefs-display' => 'የማሳያ አማራጮች',
+'prefs-displayrc' => 'የማሳያ አማራጮች',
# User rights
'userrights' => 'የአባሠመብቶች ለማስተዳደር',
@@ -987,10 +975,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'recentchanges-legend' => 'የቅርብ ለá‹áŒ¥ አማራጮችá¦',
'recentchangestext' => 'በዚሠገጽ ላይ በቅርብ ጊዜ የወጡ አዳዲስ ለá‹áŒ¦á‰½ ለመከታተሠይችላሉá¢',
'recentchanges-feed-description' => 'በዚህ ዊኪ ላይ በቅርብ áŒá‹œ የተለወጠá‹áŠ• በዚሠfeed መከታተሠይችላሉ',
-'recentchanges-label-legend' => 'መáŒáˆˆáŒ«á¦ $1á¢',
-'recentchanges-legend-newpage' => '$1 - አዲስ ገጽ',
-'recentchanges-legend-minor' => '$1 - ጥቃቅን ለá‹áŒ¥',
-'recentchanges-legend-bot' => '$1 - የቦት (ሎሌ) ለá‹áŒ¥',
'rcnote' => "ከ$5 $4 እ.ኤ.አ. {{PLURAL:$2|ባለáˆá‹ 1 ቀን|ባለá‰á‰µ '''$2''' ቀኖች}} {{PLURAL:$1|የተደረገዠ'''1''' ለá‹áŒ¥ እታች ይገኛáˆ|የተደረጉት '''$1''' መጨረሻ ለá‹áŒ¦á‰½ እታች ይገኛሉ}}á¢",
'rcnotefrom' => "ከ'''$2''' ጀáˆáˆ® የተቀየሩት ገጾች (እስከ '''$1''' ድረስ) ክዚህ በታች ይታያሉá¢",
'rclistfrom' => '(ከ $1 ጀáˆáˆ® አዲስ ለá‹áŒ¦á‰¹áŠ• ለማየት)',
@@ -1077,7 +1061,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'fileexists-shared-forbidden' => 'ይህ ስሠያለበት á‹á‹­áˆ አáˆáŠ• በጋራ á‹á‹­áˆ áˆáŠ•áŒ­ ይኖራáˆá¤ እባክዎ ተመáˆáˆ°á‹ á‹á‹­áˆ‰áŠ• በሌላ ስሠስር ይላኩትᢠ[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'ይህ á‹á‹­áˆ {{PLURAL:$1|የሚከተለዠá‹áŠ¡áˆ|የሚከተሉት á‹á‹­áˆŽá‰½}} ቅጂ áŠá‹á¦',
'file-deleted-duplicate' => 'ለዚህ á‹á‹­áˆ አንድ ቅጂ የሆአá‹á‹­áˆ ([[:$1]]) ቀድሞ ጠáቷáˆá¢ እንደገና ሳይáˆáŠ©á‰µ እባክዎ የዚያá‹áŠ• á‹á‹­áˆ መጥá‹á‰µ ታሪክ ይመለከቱá¢',
-'successfulupload' => 'መላኩ ተከናወáŠ',
'uploadwarning' => 'የመላክ ማስጠንቀቂያ',
'savefile' => 'á‹á‹­áˆ‰ ለመቆጠብ',
'uploadedimage' => '«[[$1]]» ላከ',
@@ -1093,6 +1076,7 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
ይህን á‹á‹­áˆ መላክ የሚገባ መሆኑን ይቆጠሩᢠየá‹á‹­áˆ‰ ማጥá‹á‰µ መá‹áŒˆá‰¥ ከዚህ ታች ይታያáˆá¦",
'filename-bad-prefix' => "የሚáˆáŠ©á‰µ á‹á‹­áˆ ስሠበ'''«$1»''' ይጀመራáˆá¤ ይህ ብዙ ጊዜ በá‰áŒ¥áˆ«á‹Š ካሜራ የተወሰአገላጭ á‹«áˆáˆ†áŠ ስሠይሆናáˆá¢ እባክዎ ለá‹á‹­áˆá‹Ž ገላጭ የሆአስሠይáˆáˆ¨áŒ¡á¢",
+'upload-success-subj' => 'መላኩ ተከናወáŠ',
'upload-proto-error' => 'ትክክለኛ á‹«áˆáˆ†áŠ ወጠ(protocol)',
'upload-proto-error-text' => 'የሩቅ መላክ እንዲቻሠURL በ<code>http://</code> ወይሠበ<code>ftp://</code> መጀመር አለበትá¢',
@@ -1384,7 +1368,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'የáˆáŠ¨á‰³á‰°áˆ‹á‰¸á‹ ገጾችá¤',
'mywatchlist' => 'የáˆáŠ¨á‰³á‰°áˆ‹á‰¸á‹ ገጾችá¤',
-'watchlistfor' => "(ለ'''$1''')",
'nowatchlist' => 'á‹áˆ­á‹áˆ­á‹Ž ባዶ áŠá‹á¢ áˆáŠ•áˆ ገጽ ገና አáˆá‰°áŒ¨áˆ˜áˆ¨áˆá¢',
'watchlistanontext' => 'የሚከታተሉት ገጾች á‹áˆ­á‹áˆ­á‹ŽáŠ• ለመመáˆáŠ¨á‰µ ወይሠለማስተካከሠእባክዎ $1á¢',
'watchnologin' => 'ገና አáˆáŒˆá‰¡áˆ',
@@ -1655,7 +1638,6 @@ $1',
'ipb-edit-dropdown' => "'ተራ የማገጃ áˆáŠ­áŠ•á‹«á‰¶á‰½' ለማስተካከáˆ",
'ipb-unblock-addr' => 'ከ$1 መገጃ ለማንሣት',
'ipb-unblock' => 'ከብዕር ስሠወይሠከá‰. አድራሻ ማገጃ ለማንሣት',
-'ipb-blocklist-addr' => 'በ$1 ላይ አáˆáŠ• ያለá‹áŠ• ማገጃ ለመመáˆáŠ¨á‰µ',
'ipb-blocklist' => 'አáˆáŠ• ያሉትን ማገጃዎች ለመመáˆáŠ¨á‰µ',
'ipb-blocklist-contribs' => 'የ$1 ለá‹áŒ¦á‰½',
'unblockip' => 'ከተጠቃሚ ማገጃ ለማንሣት',
@@ -1965,10 +1947,10 @@ $1',
'imagemaxsize' => 'በá‹á‹­áˆ መáŒáˆˆáŒ« ገጽ ላይ የስዕሠመጠን ወሰን ቢበዛá¦',
'thumbsize' => 'የናሙና መጠንá¦',
'widthheightpage' => '$1 በ$2ᣠ$3 ገጾች',
-'file-info' => '(የá‹á‹­áˆ መጠንᦠ$1ᣠየMIME አይáŠá‰µá¦ $2)',
-'file-info-size' => '($1 × $2 á’ክስáˆá¤ መጠንᦠ$3ᤠየMIME á‹“á‹­áŠá‰µá¦ $4)',
+'file-info' => 'የá‹á‹­áˆ መጠንᦠ$1ᣠየMIME አይáŠá‰µá¦ $2',
+'file-info-size' => '$1 × $2 á’ክስáˆá¤ መጠንᦠ$3ᤠየMIME á‹“á‹­áŠá‰µá¦ $4',
'file-nohires' => '<small>ከዚህ በላይ ማጉላት አይቻáˆáˆá¢</small>',
-'svg-long-desc' => '(የSVG á‹á‹­áˆá¡ በተáŒá‰£áˆ­ $1 × $2 á’ክስáˆá¤ መጠንᦠ$3)',
+'svg-long-desc' => 'የSVG á‹á‹­áˆá¡ በተáŒá‰£áˆ­ $1 × $2 á’ክስáˆá¤ መጠንᦠ$3',
'show-big-image' => 'በሙሉ ጒáˆáˆ…áŠá‰µ ለመመáˆáŠ¨á‰µ',
'show-big-image-thumb' => '<small>የዚህ ናሙና ቅጂ ክáˆáˆá¦ $1 × $2 á’ክሰáˆ</small>',
diff --git a/languages/messages/MessagesAn.php b/languages/messages/MessagesAn.php
index 538c6854..64ab3376 100644
--- a/languages/messages/MessagesAn.php
+++ b/languages/messages/MessagesAn.php
@@ -39,83 +39,87 @@ $namespaceNames = array(
);
$magicWords = array(
- 'namespace' => array( '1', 'ESPAZIODENOMBRES', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESPAZIODENOMBRESE', 'NAMESPACEE' ),
+ 'redirect' => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+ 'namespace' => array( '1', 'ESPACIODENOMBRES', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESPACIODENOMBRESE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
'img_right' => array( '1', 'dreita', 'derecha', 'dcha', 'der', 'right' ),
'img_left' => array( '1', 'cucha', 'zurda', 'izquierda', 'izda', 'izq', 'left' ),
'ns' => array( '0', 'EN:', 'EDN:', 'NS:' ),
'displaytitle' => array( '1', 'TÃTOL', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'BERSIÓNAUTUAL', 'BERSIONAUTUAL', 'REVISIÓNACTUAL', 'CURRENTVERSION' ),
- 'language' => array( '0', '#LENGUACHE:', '#LUENGA:', '#IDIOMA:', '#LANGUAGE:' ),
- 'special' => array( '0', 'espezial', 'special' ),
+ 'currentversion' => array( '1', 'BERSIÓNAUTUAL', 'BERSIONAUTUAL', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#LUENGA:', '#IDIOMA:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'espezial', 'especial', 'special' ),
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Reendrezeras dobles', 'Dobles reendrezeras', 'Endrezeras dobles', 'Dobles endrezeras' ),
- 'BrokenRedirects' => array( 'Reendrezeras trencatas', 'Endrezeras trencatas', 'Reendrezeras crebatas', 'Endrezeras crebatas', 'Endrezeras trencadas', 'Endrezeras crebadas' ),
- 'Disambiguations' => array( 'Desambigazions', 'Pachinas de desambigazión' ),
- 'Userlogin' => array( 'Enzetar sesión', 'Dentrar' ),
- 'Userlogout' => array( 'Salir', 'Rematar sesión' ),
- 'CreateAccount' => array( 'Creyar cuenta' ),
- 'Preferences' => array( 'Preferenzias' ),
- 'Watchlist' => array( 'Lista de seguimiento' ),
- 'Recentchanges' => array( 'Zaguers cambeos', 'Cambeos rezients' ),
+ 'DoubleRedirects' => array( 'Endreceras_doples', 'Reendrezeras_dobles', 'Dobles_reendrezeras', 'Endrezeras_dobles', 'Dobles_endrezeras' ),
+ 'BrokenRedirects' => array( 'Endreceras_trencatas', 'Endreceras_trencadas', 'Reendrezeras_trencatas', 'Endrezeras_trencatas', 'Reendrezeras_crebatas', 'Endrezeras_crebatas', 'Endrezeras_trencadas', 'Endrezeras_crebadas' ),
+ 'Disambiguations' => array( 'Desambigacions', 'Desambigazions', 'Pachinas_de_desambigazión' ),
+ 'Userlogin' => array( 'Encetar_sesión', 'Enzetar_sesión', 'Dentrar' ),
+ 'Userlogout' => array( 'Salir', 'Rematar_sesión' ),
+ 'CreateAccount' => array( 'Creyar_cuenta' ),
+ 'Preferences' => array( 'Preferencias' ),
+ 'Watchlist' => array( 'Lista_de_seguimiento' ),
+ 'Recentchanges' => array( 'Zaguers_cambeos', 'Cambeos_recients' ),
'Upload' => array( 'Cargar', 'Puyar' ),
- 'Listfiles' => array( 'Lista d\'imáchens', 'Lista d\'imachens' ),
- 'Newimages' => array( 'Nuebas imáchens', 'Nuebas imachens' ),
- 'Listusers' => array( 'Lista d\'usuarios' ),
- 'Listgrouprights' => array( 'Lis' ),
- 'Statistics' => array( 'Estadistica', 'Estatistica', 'Estadisticas', 'Estatisticas' ),
- 'Randompage' => array( 'Pachina aleatoria', 'Pachina aliatoria', 'Pachina á l\'azar' ),
- 'Lonelypages' => array( 'Pachinas popiellas' ),
- 'Uncategorizedpages' => array( 'Pachinas sin categorías', 'Pachinas sin categorizar' ),
- 'Uncategorizedcategories' => array( 'Categorías sin categorías', 'Categorías sin categorizar' ),
- 'Uncategorizedimages' => array( 'Imáchens sin categorías', 'Imachens sin categorizar', 'Imáchens sin categorizar' ),
- 'Uncategorizedtemplates' => array( 'Plantillas sin categorías', 'Plantillas sin categorizar' ),
- 'Unusedcategories' => array( 'Categorías no emplegatas', 'Categorías sin emplegar' ),
- 'Unusedimages' => array( 'Imáchens no emplegatas', 'Imáchens sin emplegar' ),
- 'Wantedpages' => array( 'Pachinas requiestas', 'Pachinas demandatas', 'Binclos crebatos', 'Binclos trencatos' ),
- 'Wantedcategories' => array( 'Categorías requiestas', 'Categorías demandatas' ),
- 'Wantedfiles' => array( 'Archibos requiestos', 'Archibos demandatos' ),
- 'Wantedtemplates' => array( 'Plantillas requiestas', 'Plantillas demandatas' ),
- 'Mostlinked' => array( 'Pachinas más enlazatas', 'Pachinas más binculatas' ),
- 'Mostlinkedcategories' => array( 'Categorías más enlazatas', 'Categorías más binculatas' ),
- 'Mostlinkedtemplates' => array( 'Plantillas más enlazatas', 'Plantillas más binculatas' ),
- 'Mostimages' => array( 'Imáchens más emplegatas', 'Imachens más emplegatas' ),
- 'Mostcategories' => array( 'Pachinas con más categorías' ),
- 'Mostrevisions' => array( 'Pachinas con más edizions', 'Pachinas más editatas', 'Pachinas con más bersions' ),
- 'Fewestrevisions' => array( 'Pachinas con menos edizions', 'Pachinas menos editatas', 'Pachinas con menos bersions' ),
- 'Shortpages' => array( 'Pachinas más cortas' ),
- 'Longpages' => array( 'Pachinas más largas' ),
- 'Newpages' => array( 'Pachinas nuebas', 'Pachinas más nuebas', 'Pachinas más rezients', 'Pachinas rezients' ),
- 'Ancientpages' => array( 'Pachinas más biellas', 'Pachinas biellas', 'Pachinas más antigas', 'Pachinas antigas' ),
- 'Deadendpages' => array( 'Pachinas sin salida', 'Pachinas sin de salida' ),
- 'Protectedpages' => array( 'Pachinas protechitas', 'Pachinas protechidas' ),
- 'Protectedtitles' => array( 'Títols protechitos', 'Títols protexitos', 'Títols protechius' ),
- 'Allpages' => array( 'Todas as pachinas' ),
- 'Prefixindex' => array( 'Pachinas por prefixo', 'Mirar por prefixo' ),
- 'Ipblocklist' => array( 'Lista d\'IPs bloqueyatas', 'Lista d\'IPs bloquiatas', 'Lista d\'adrezas IP bloqueyatas', 'Lista d\'adrezas IP bloquiatas' ),
- 'Specialpages' => array( 'Pachinas espezials' ),
- 'Contributions' => array( 'Contrebuzions' ),
- 'Emailuser' => array( 'Nimbía mensache' ),
- 'Confirmemail' => array( 'Confirmar e-mail' ),
- 'Movepage' => array( 'Renombrar pachina', 'Mober pachina', 'Tresladar pachina' ),
+ 'Listfiles' => array( 'Lista_de_fichers', 'Lista_d\'imáchens', 'Lista_d\'imachens' ),
+ 'Newimages' => array( 'Nuevos_fichers', 'Nuevas_imáchens', 'Nuevas_imachens', 'Nuebas_imachens' ),
+ 'Listusers' => array( 'Lista_d\'usuarios' ),
+ 'Listgrouprights' => array( 'ListaDreitosGrupos' ),
+ 'Statistics' => array( 'Estatisticas', 'Estadisticas' ),
+ 'Randompage' => array( 'Pachina_a_l\'azar', 'Pachina_aleatoria', 'Pachina_aliatoria' ),
+ 'Lonelypages' => array( 'Pachinas_popiellas' ),
+ 'Uncategorizedpages' => array( 'Pachinas_sin_categorizar', 'Pachinas_sin_categorías' ),
+ 'Uncategorizedcategories' => array( 'Categorías_sin_categorizar._Categorías_sin_categorías' ),
+ 'Uncategorizedimages' => array( 'Fichers_sin_categorizar', 'Fichers_sin_categorías', 'Imáchens_sin_categorías', 'Imachens_sin_categorizar', 'Imáchens_sin_categorizar' ),
+ 'Uncategorizedtemplates' => array( 'Plantillas_sin_categorizar._Plantillas_sin_categorías' ),
+ 'Unusedcategories' => array( 'Categorías_no_emplegatas', 'Categorías_sin_emplegar' ),
+ 'Unusedimages' => array( 'Fichers_no_emplegatos', 'Fichers_sin_emplegar', 'Imáchens_no_emplegatas', 'Imáchens_sin_emplegar' ),
+ 'Wantedpages' => array( 'Pachinas_requiestas', 'Pachinas_demandatas', 'Binclos_crebatos', 'Binclos_trencatos' ),
+ 'Wantedcategories' => array( 'Categorías_requiestas', 'Categorías_demandatas' ),
+ 'Wantedfiles' => array( 'Fichers_requiestos', 'Fichers_demandaus', 'Archibos_requiestos', 'Archibos_demandatos' ),
+ 'Wantedtemplates' => array( 'Plantillas_requiestas', 'Plantillas_demandatas' ),
+ 'Mostlinked' => array( 'Pachinas_más_enlazatas', 'Pachinas_más_vinculatas' ),
+ 'Mostlinkedcategories' => array( 'Categorías_más_emplegatas', 'Categorías_más_enlazatas', 'Categorías_más_binculatas' ),
+ 'Mostlinkedtemplates' => array( 'Plantillas_más_emplegatas', 'Plantillas_más_enlazatas', 'Plantillas_más_binculatas' ),
+ 'Mostimages' => array( 'Fichers_más_emplegatos', 'Imáchens_más_emplegatas', 'Imachens_más_emplegatas' ),
+ 'Mostcategories' => array( 'Pachinas_con_más_categorías' ),
+ 'Mostrevisions' => array( 'Pachinas_con_más_edicions', 'Pachinas_con_más_edizions', 'Pachinas_más_editatas', 'Pachinas_con_más_bersions' ),
+ 'Fewestrevisions' => array( 'Pachinas_con_menos_edicions', 'Pachinas_con_menos_edizions', 'Pachinas_menos_editatas', 'Pachinas_con_menos_bersions' ),
+ 'Shortpages' => array( 'Pachinas_más_curtas' ),
+ 'Longpages' => array( 'Pachinas_más_largas' ),
+ 'Newpages' => array( 'Pachinas_nuevas', 'Pachinas_recients', 'Pachinas_nuebas', 'Pachinas_más_nuebas', 'Pachinas_más_rezients', 'Pachinas_rezients' ),
+ 'Ancientpages' => array( 'Pachinas_más_viellas', 'Pachinas_más_antigas', 'Pachinas_más_biellas', 'Pachinas_biellas', 'Pachinas_antigas' ),
+ 'Deadendpages' => array( 'Pachinas_sin_salida', 'Pachinas_sin_de_salida' ),
+ 'Protectedpages' => array( 'Pachinas_protechitas', 'Pachinas_protechidas' ),
+ 'Protectedtitles' => array( 'Títols_protechitos', 'Títols_protexitos', 'Títols_protechius' ),
+ 'Allpages' => array( 'Todas_as_pachinas' ),
+ 'Prefixindex' => array( 'Pachinas_por_prefixo', 'Mirar_por_prefixo' ),
+ 'Ipblocklist' => array( 'Lista_d\'IPs_bloqueyatas', 'Lista_d\'IPs_bloquiatas', 'Lista_d\'adrezas_IP_bloqueyatas', 'Lista_d\'adrezas_IP_bloquiatas' ),
+ 'Specialpages' => array( 'Pachinas_especials', 'Pachinas_espezials' ),
+ 'Contributions' => array( 'Contrebucions', 'Contrebuzions' ),
+ 'Emailuser' => array( 'Ninvía_mensache', 'Nimbía_mensache' ),
+ 'Confirmemail' => array( 'Confirmar_e-mail' ),
+ 'Movepage' => array( 'TresladarPachina', 'Renombrar_pachina', 'Mober_pachina', 'Tresladar_pachina' ),
+ 'Blockme' => array( 'Bloqueya-me' ),
+ 'Booksources' => array( 'Fuents_de_libros' ),
'Categories' => array( 'Categorías' ),
- 'Export' => array( 'Esportar' ),
- 'Version' => array( 'Bersión' ),
- 'Allmessages' => array( 'Toz os mensaches' ),
+ 'Export' => array( 'Exportar' ),
+ 'Version' => array( 'Versión', 'Bersión' ),
+ 'Allmessages' => array( 'Totz_os_mensaches', 'Toz_os_mensaches' ),
'Log' => array( 'Rechistro', 'Rechistros' ),
'Blockip' => array( 'Bloqueyar' ),
'Undelete' => array( 'Restaurar' ),
'Import' => array( 'Importar' ),
- 'Unwatchedpages' => array( 'Pachinas no cosiratas', 'Pachinas sin cosirar' ),
- 'Mypage' => array( 'A mía pachina', 'A mía pachina d\'usuario' ),
- 'Mytalk' => array( 'A mía descusión', 'A mía pachina de descusión' ),
- 'Mycontributions' => array( 'As mías contrebuzions' ),
- 'Listadmins' => array( 'Lista d\'almenistradors' ),
- 'Listbots' => array( 'Lista de bots' ),
- 'Popularpages' => array( 'Pachinas populars', 'Pachinas más populars' ),
+ 'Unwatchedpages' => array( 'Pachinas_no_cosiratas', 'Pachinas_sin_cosirar' ),
+ 'Mypage' => array( 'A_mía_pachina', 'A_mía_pachina_d\'usuario' ),
+ 'Mytalk' => array( 'A_mía_descusión', 'A_mía_pachina_de_descusión' ),
+ 'Mycontributions' => array( 'As_mías_contrebucions', 'As_mías_contrebuzions' ),
+ 'Listadmins' => array( 'Lista_d\'almenistradors' ),
+ 'Listbots' => array( 'Lista_de_botz', 'Lista_de_bots' ),
+ 'Popularpages' => array( 'Pachinas_populars', 'Pachinas_más_populars' ),
'Search' => array( 'Mirar' ),
+ 'Resetpass' => array( 'Cambiar_contrasenya' ),
);
$messages = array(
@@ -134,8 +138,7 @@ $messages = array(
'tog-editsection' => 'Activar a edición por seccions usando os vinclos [editar]',
'tog-editsectiononrightclick' => "Activar a edición de seccions punchando con o botón dreito d'o ratet <br /> en os títols de seccions (cal JavaScript)",
'tog-showtoc' => "Amostrar l'endice (ta pachinas con más de 3 seccions)",
-'tog-rememberpassword' => 'Remerar a parola de paso entre sesions',
-'tog-editwidth' => "Enamplar a caixa d'edizión ta plenar toda a pantalla",
+'tog-rememberpassword' => "Remerar o mío nombre d'usuario en iste navegador (como muito por $1 {{PLURAL:$1|día|días}})",
'tog-watchcreations' => 'Cosirar as pachinas que creye',
'tog-watchdefault' => 'Cosirar as pachinas que edite',
'tog-watchmoves' => 'Cosirar as pachinas que treslade',
@@ -281,31 +284,21 @@ $messages = array(
'faqpage' => 'Project:Preguntas freqüents',
# Vector skin
-'vector-action-addsection' => 'Adhibir nueva sección',
-'vector-action-delete' => 'Borrar',
-'vector-action-move' => 'Tresladar',
-'vector-action-protect' => 'Protecher',
-'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Desprotecher',
-'vector-namespace-category' => 'Categoría',
-'vector-namespace-help' => "Pachina d'aduya",
-'vector-namespace-image' => 'Fichero',
-'vector-namespace-main' => 'Pachina',
-'vector-namespace-media' => 'Pachina multimedia',
-'vector-namespace-mediawiki' => 'Mensache',
-'vector-namespace-project' => "Pachina d'o prochecto",
-'vector-namespace-special' => 'Pachina especial',
-'vector-namespace-talk' => 'Discusión',
-'vector-namespace-template' => 'Plantilla',
-'vector-namespace-user' => "Pachina d'usuario",
-'vector-view-create' => 'Creyar',
-'vector-view-edit' => 'Editar',
-'vector-view-history' => "Amostrar l'historial",
-'vector-view-view' => 'Leyer',
-'vector-view-viewsource' => 'Veyer o codigo fuent',
-'actions' => 'Accions',
-'namespaces' => 'Espacios de nombres',
-'variants' => 'Variants',
+'vector-action-addsection' => 'Adhibir nueva sección',
+'vector-action-delete' => 'Borrar',
+'vector-action-move' => 'Tresladar',
+'vector-action-protect' => 'Protecher',
+'vector-action-undelete' => 'Restaurar',
+'vector-action-unprotect' => 'Desprotecher',
+'vector-simplesearch-preference' => "Habilitar socherencias de busca amilloradas (nomás ta l'apariencia Vector)",
+'vector-view-create' => 'Creyar',
+'vector-view-edit' => 'Editar',
+'vector-view-history' => "Amostrar l'historial",
+'vector-view-view' => 'Leyer',
+'vector-view-viewsource' => 'Veyer o codigo fuent',
+'actions' => 'Accions',
+'namespaces' => 'Espacios de nombres',
+'variants' => 'Variants',
'errorpagetitle' => 'Error',
'returnto' => 'Tornar ta $1.',
@@ -366,6 +359,9 @@ Masiaus usuarios son mirando d'acceder ta ista pachina.
Aguarde una mica antes de tornar a acceder ta ista pachina.
$1",
+'pool-timeout' => "S'ha pasau o tiempo d'aspera limite ta o bloqueyo",
+'pool-queuefull' => 'A coda de treballo ye plena',
+'pool-errorunknown' => 'Error desconoixida',
# 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' => 'Información sobre {{SITENAME}}',
@@ -525,7 +521,7 @@ No xublide de presonalizar [[Special:Preferences|as suyas preferencias en {{SITE
'yourname' => "Nombre d'usuario:",
'yourpassword' => 'Contrasenya:',
'yourpasswordagain' => 'Torne a escribir a contrasenya:',
-'remembermypassword' => "Remerar datos d'usuario entre sesions.",
+'remembermypassword' => "Remerar o mío nombre d'usuario y contrasenya entre sesions en iste ordinador (como muito por $1 {{PLURAL:$1|día|días}})",
'yourdomainname' => 'Dominio:',
'externaldberror' => "Bi habió una error d'autenticación externa d'a base de datos u bien no tiene premisos ta esviellar a suya cuenta externa.",
'login' => 'Encetar sesión',
@@ -542,6 +538,7 @@ No xublide de presonalizar [[Special:Preferences|as suyas preferencias en {{SITE
'gotaccount' => "Tiene ya una cuenta? '''$1'''.",
'gotaccountlink' => 'Identificar-se y encetar sesión',
'createaccountmail' => 'por correu electronico',
+'createaccountreason' => 'Razón:',
'badretype' => 'As contrasenyas que ha escrito no son iguals.',
'userexists' => "Ixe nombre d'usuario ya ye en uso.
Por favor, meta-ne uno diferent.",
@@ -646,9 +643,10 @@ Talment ya ha cambiato a suya contrasenya u ha demandato una nueva contrasenya t
'showlivepreview' => 'Anvista previa',
'showdiff' => 'Amostrar cambeos',
'anoneditwarning' => "''Pare cuenta:'' No s'ha identificato con un nombre d'usuario. A suya adreza IP s'alzará en l'historial d'a pachina.",
+'anonpreviewwarning' => "''No s'ha identificau con una cuenta d'usuario. A suya adreza IP quedará rechistrada en l'historial d'edicions d'ista pachina.\"",
'missingsummary' => "'''Pare cuenta:''' No ha escrito garra resumen d'edición. Si puncha de nuevas en «{{int:savearticle}}» a suya edición se grabará sin resumen.",
'missingcommenttext' => 'Por favor, escriba o texto astí baixo.',
-'missingcommentheader' => "'''Pare cuenta:''' No ha escrito garra títol ta iste comentario. Si puncha de nuevas en \"Alzar\", a suya edición se grabará sin títol.",
+'missingcommentheader' => "'''Recordanza:''' No ha garra títol ta iste comentario. Si puncha de nuevas en \"{{int:savearticle}}\", a suya edición se grabará sin garra títol.",
'summary-preview' => "Veyer anvista previa d'o resumen:",
'subject-preview' => "Anvista previa d'o tema/títol:",
'blockedtitle' => "L'usuario ye bloqueyato",
@@ -720,7 +718,7 @@ A zaguera dentrada d'o rechistro de bloqueyos s'amuestra contino:",
'usercsspreview' => "'''Remere que isto no ye que una previsualización d'o suyo CSS d'usuario.'''
'''Encara no s'ha alzato!'''",
'userjspreview' => "'''Remere que sólo ye previsualizando o suyo javascript d'usuario y encara no ye grabato!'''",
-'userinvalidcssjstitle' => "'''Pare cuenta:''' No bi ha garra aparencia clamata \"\$1\". Remere que as pachinas presonalizatas .css y .js tienen un títol en minusclas, p.e. {{ns:user}}:Foo/monobook.css en cuenta de {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Pare cuenta:''' No bi ha garra aparencia clamata \"\$1\". Remere que as pachinas presonalizatas .css y .js tienen un títol en minusclas, p.e. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
'updated' => '(Esviellato)',
'note' => "'''Nota:'''",
'previewnote' => "'''Pare cuenta que isto no ye que l'anvista previa d'a pachina; os cambeos encara no s'ha alzato!'''",
@@ -750,8 +748,6 @@ Habrá d'incorporar os suyos cambeos en o texto existent.
'''NO COPIE SIN PREMISO ESCRITOS CON DREITOS D'AUTOR!'''<br />",
'copyrightwarning2' => "Por favor, pare cuenta que todas as contrebucions a {{SITENAME}} pueden estar editatas, cambiatas u borratas por atros colaboradors. Si no deseya que atra chent corricha os suyos escritos sin piedat y los destribuiga librement, alavez, no debería meter-los aquí. <br /> En publicar aquí, tamién ye declarando que vusté mesmo escribió iste texto y ye o duenyo d'os dreitos d'autor, u bien lo copió dende o dominio publico u qualsiquier atra fuent libre (veyer $1 ta más información). <br />
'''NO COPIE SIN PREMISO ESCRITOS CON DREITOS D'AUTOR!'''",
-'longpagewarning' => "'''Pare cuenta: Ista pachina tiene ya $1 kilobytes; bells navegadors pueden tener problemas en editar pachinas de 32 kB o más.
-Considere, por favor, a posibilidat de troxar ista pachina en trestallos más chicotz.'''",
'longpageerror' => "'''ERROR: O texto que ha escrito ye de $1 kilobytes, que ye mayor que a grandaria maxima de $2 kilobytes. No se puede alzar.'''",
'readonlywarning' => "'''Pare cuenta: A base de datos ye bloqueyata por custions de mantenimiento. Por ixo, en iste inte ye imposible d'alzar as suyas edicions. Puede copiar y apegar o texto en un fichero y alzar-lo ta dimpués.'''
@@ -925,6 +921,8 @@ $1",
'logdelete-failure' => "'''A visibilidat d'o rechistro no s'ha puesto achustar:'''
$1",
'revdel-restore' => 'Cambiar a visibilidat',
+'revdel-restore-deleted' => 'versions borradas',
+'revdel-restore-visible' => 'versions visibles',
'pagehist' => 'Historial',
'deletedhist' => 'Historial de borrau',
'revdelete-content' => 'conteniu',
@@ -991,11 +989,13 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
# Diffs
'history-title' => 'Historial de versions de "$1"',
'difference' => '(Esferencias entre versions)',
+'difference-multipage' => '(Diferencia entre pachinas)',
'lineno' => 'Linia $1:',
'compareselectedversions' => 'Confrontar as versions trigatas',
'showhideselectedversions' => 'Amostrar/amagar as versions trigadas',
'editundo' => 'desfer',
-'diff-multi' => "(S'ha amagato {{PLURAL:$1|una edición entremeya|$1 edicions entremeyas}}.)",
+'diff-multi' => "(No s'amuestra {{PLURAL:$1|una edición entremeya feita|$1 edicions entremeyas feitas}} por {{PLURAL:$2|un usuario|$2 usuarios}}).",
+'diff-multi-manyusers' => "(No s'amuestra {{PLURAL:$1|una edición entremeya|$1 edicions entremeyas}} feitas por más {{PLURAL:$2|d'un usuario|de $2 usuarios}})",
# Search results
'searchresults' => "Resultau d'a busca",
@@ -1030,6 +1030,7 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'searchprofile-everything-tooltip' => 'Mirar en totz os contenius (tamién en as pachinas de descusión)',
'searchprofile-advanced-tooltip' => 'Mirar en os siguients espacios de nombres',
'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 parolas}})',
+'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 fichero|$3 fichers}})',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(endrecera dende $1)',
'search-section' => '(sección $1)',
@@ -1104,6 +1105,7 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'contextlines' => "Linias de contexto que s'amostrarán por resultau",
'contextchars' => 'Carácters de contexto por linia',
'stub-threshold' => 'Branquil superior ta o formateyo de <a href="#" class="stub">vinclos ta borradors</a> (en bytes):',
+'stub-threshold-disabled' => 'Desactivato',
'recentchangesdays' => "Días que s'amostrarán en ''zaguers cambeos'':",
'recentchangesdays-max' => '(masimo $1 {{PLURAL:$1|día|días}})',
'recentchangescount' => "Numero d'edicions a amostrar, por defecto:",
@@ -1137,6 +1139,7 @@ Contino se i amuestra una calu chenerata de traza aleatoria que puede fer servir
'prefs-files' => 'fichers',
'prefs-custom-css' => 'CSS presonalizato',
'prefs-custom-js' => 'JS presonalizato',
+'prefs-common-css-js' => 'CSS/JS compartito ta todas as apariencias:',
'prefs-reset-intro' => "Puet emplegar ista pachina ta restaurar as suyas preferencias a las valuras por defecto d'o sitio.
No se podrá desfer iste cambio.",
'prefs-emailconfirm-label' => 'Confirmación de correu electronico:',
@@ -1173,7 +1176,9 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'prefs-advancedrendering' => 'Opcions abanzadas',
'prefs-advancedsearchoptions' => 'Opcions abanzadas',
'prefs-advancedwatchlist' => 'Opcions abanzadas',
-'prefs-display' => 'Opcions de visualización',
+'prefs-displayrc' => 'Opcions de visualización',
+'prefs-displaysearchoptions' => 'Opcions de visualización',
+'prefs-displaywatchlist' => 'Opcions de visualización',
'prefs-diffs' => 'Diferencias',
# User rights
@@ -1259,6 +1264,7 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'right-hideuser' => "Bloqueyar un nombre d'usuario, amagando-lo d'o publico",
'right-ipblock-exempt' => "Ignorar os bloqueyos d'adrezas IP, os autobloqueyos y os bloqueyos de rangos de IPs.",
'right-proxyunbannable' => 'Ignorar os bloqueyos automaticos de proxies',
+'right-unblockself' => 'Desbloqueyar-se ells mesmos',
'right-protect' => 'Cambiar os livels de protección y editar pachinas protechitas',
'right-editprotected' => 'Editar pachinas protechitas (sin de protección en cascada)',
'right-editinterface' => "Editar a interficie d'usuario",
@@ -1281,7 +1287,6 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'right-siteadmin' => 'Trancar y destrancar a base de datos',
'right-reset-passwords' => "Reiniciar a contrasenya d'atros usuarios",
'right-override-export-depth' => 'Exporta pachinas que incluigan as enlazadas dica un fundaria de 5',
-'right-versiondetail' => "Amostrar a información adicional d'a versión d'o software",
'right-sendemail' => 'Ninviar un correu electronico a atros usuarios',
# User rights log
@@ -1332,14 +1337,9 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'recentchanges-legend' => 'Opcions sobre a pachina de zaguers cambeos',
'recentchangestext' => "Siga os cambeos más recients d'a wiki en ista pachina.",
'recentchanges-feed-description' => "Seguir os cambios más recients d'o wiki en ista fuent de noticias.",
-'recentchanges-label-legend' => 'Leyenda: $1.',
-'recentchanges-legend-newpage' => '$1 - pachina nueva',
'recentchanges-label-newpage' => 'Ista edición ha creyau una nueva pachina',
-'recentchanges-legend-minor' => '$1 - edición menor',
'recentchanges-label-minor' => 'Ista ye una edición menor',
-'recentchanges-legend-bot' => '$1 - edición de bot',
'recentchanges-label-bot' => 'Ista edición fue feita por un bot',
-'recentchanges-legend-unpatrolled' => '$1 - edición sin patrullar',
'recentchanges-label-unpatrolled' => "Esta edición encara no s'ha controlato",
'rcnote' => "Contino {{PLURAL:$1|s'amuestra o unico cambeo feito|s'amuestran os zaguers '''$1''' cambeos feitos}} en {{PLURAL:$2|o zaguer día|os zaguers '''$2''' días}}, dica o $5, $4.",
'rcnotefrom' => "Contino s'amuestran os cambeos dende '''$2''' (dica '''$1''').",
@@ -1385,6 +1385,9 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'upload_directory_missing' => 'O directorio de carga ($1) no existe y no lo puede creyar o servidor web.',
'upload_directory_read_only' => 'O servidor web no puede escribir en o directorio de carga de fichers ($1).',
'uploaderror' => "S'ha producito una error en cargar o fichero",
+'upload-recreate-warning' => "''Pare cuenta: T'a suya conveniencia s'ha muestra aquí o fichero con ixe nombre ha sido eliminado o renombrado.'''
+
+T'a suya conveniencia s'su conveniencia se muestra aquí el registro de supresiones y traslados de esta página:",
'uploadtext' => "Faiga servir o formulario d'o cobaixo ta cargar fichers.
Ta veyer u mirar fichers cargatas denantes vaiga t'a [[Special:FileList|lista de fichers cargatos]]. As cargas y recargas tamién se rechistran en o [[Special:Log/upload|rechistro de cargas]], y os borraus en o [[Special:Log/delete|rechistro de borraus]].
@@ -1416,6 +1419,17 @@ Ta incluyir un fichero en una pachina, emplegue un vinclo d'una d'istas trazas
'filetype-unwanted-type' => "Os '''\".\$1\"''' son un tipo de fichero no deseyato. Se prefieren os fichers {{PLURAL:\$3|de tipo|d'os tipos}} \$2.",
'filetype-banned-type' => "No se premiten os fichers de tipo '''\".\$1\"'''. {{PLURAL:\$3|O tipo premitito ye|Os tipos premititos son}} \$2.",
'filetype-missing' => 'O fichero no tiene garra estensión (como ".jpg").',
+'empty-file' => 'O fichero que ninvió yera buedo.',
+'file-too-large' => 'O fichero que ninvió ye masiau gran.',
+'filename-tooshort' => 'O nombre de fichero ye masiau curto.',
+'filetype-banned' => 'Iste tipo de fichero ye vedau.',
+'verification-error' => 'Iste fichero no pasó a verificación de fichers.',
+'hookaborted' => "A modificación que ha mirau de fer l'ha cancelau un hook d'extensión.",
+'illegal-filename' => 'O nombre de fichero no ye premitiu.',
+'overwrite' => 'No se premite de sobrescribir un fichero existent.',
+'unknown-error' => 'Ha ocurriu una error desconoixida.',
+'tmp-create-error' => "No s'ha puesto creyar o fichero temporal.",
+'tmp-write-error' => 'Error en escribir o fichero temporal.',
'large-file' => 'Se consella que os fichers no sigan mayors de $1; iste fichero ocupa $2.',
'largefileserver' => "A grandaria d'iste fichero ye mayor d'a que a confeguración d'iste servidor premite.",
'emptyfile' => 'Parixe que o fichero que se miraba de cargar ye buedo; por favor, comprebe que ixe ye reyalment o fichero que quereba cargar.',
@@ -1440,13 +1454,14 @@ Si encara quiere cargar ixe fichero, torne y faiga servir un nuevo nombre. [[Fil
'fileexists-shared-forbidden' => 'Ya bi ha un fichero con ixe nombre en o reposte compartito. Si encara quiere cargar o fichero, por favor, torne enta zaga y faiga servir un nuevo nombre. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => "Iste fichero ye un duplicau {{PLURAL:$1|d'o siguient fichero|d'os siguients fichers}}:",
'file-deleted-duplicate' => "Un fichero igual que iste ([[:$1]]) s'ha borrato enantes. Debería mirar-se o historial de borraus d'o fichero antes de continar cargando-lo atra vegada.",
-'successfulupload' => 'Cargata correctament',
'uploadwarning' => 'Alvertencia de carga de fichero',
'uploadwarning-text' => "Por favor, modifique a descripción d'o fichero d'abaixo y torne a intentar-lo.",
'savefile' => 'Alzar fichero',
'uploadedimage' => '«[[$1]]» cargato.',
'overwroteimage' => 's\'ha cargato una nueva versión de "[[$1]]"',
'uploaddisabled' => 'A carga de fichers ye desactivata',
+'copyuploaddisabled' => 'Carga por URL desactivada.',
+'uploadfromurl-queued' => "S'ha metiu en a ringlera a suya carga.",
'uploaddisabledtext' => 'A carga de fichers ye desactivata.',
'php-uploaddisabledtext' => 'A carga de fichers PHP ye desactivata. Por favor, verfique a confeguración de file_uploads.',
'uploadscripted' => 'Iste fichero contiene codigo de script u HTML que puede estar interpretado incorrectament por un navegador.',
@@ -1478,6 +1493,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misz.
#</pre> <!-- dixe ista linia esautament igual como ye -->',
+'upload-success-subj' => 'Cargata correctament',
+'upload-success-msg' => 'A carga de [$2] ha surtiu con exito. Ye disponible aquí: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema en a carga',
+'upload-failure-msg' => 'I ha habiu un problema con o a suya carga dende [$2]:
+
+$1',
+'upload-warning-subj' => 'Alvertencia de carga',
+'upload-warning-msg' => 'I habió un problea con a carga de [$2]. Puede tornar ta [[Special:Upload/stash/$1|upload form]] pa correchir iste problema.',
'upload-proto-error' => 'Protocolo incorrecto',
'upload-proto-error-text' => 'Si quiere cargar fichers dende atra pachina, a URL ha de prencipiar por <code>http://</code> u <code>ftp://</code>.',
@@ -1537,6 +1560,7 @@ Fendo click en un encabezau de columna se cambia o criterio d'ordenación.",
'listfiles_search_for' => "Mirar por nombre d'o fichero:",
'imgfile' => 'fichero',
'listfiles' => 'Lista de imachens',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Calendata:',
'listfiles_name' => 'Nombre',
'listfiles_user' => 'Usuario',
@@ -1650,8 +1674,8 @@ Debaixo s'amuestra a descripción d'a suya [$2 pachina de descripción].",
'statistics-edits' => 'Edicions en pachinas dende que se debantó {{SITENAME}}',
'statistics-edits-average' => "Meya d'edicions por pachina",
'statistics-views-total' => 'Total de vesitas',
+'statistics-views-total-desc' => "No s'inclui as vesitas a pachinas inexistents ni a pachinas especials",
'statistics-views-peredit' => 'Vesitas por edición',
-'statistics-jobqueue' => "Longaria d'a [http://www.mediawiki.org/wiki/Manual:Job_queue coda de treballos]",
'statistics-users' => '[[Special:ListUsers|Usuarios]] rechistratos',
'statistics-users-active' => 'Usuarios activos',
'statistics-users-active-desc' => 'Usuarios que han feito qualsiquier acción en {{PLURAL:$1|o zaguer día|os zaguers $1 días}}',
@@ -1664,7 +1688,7 @@ Ixos vinclos habrían de ir millor t'a pachina especifica apropiada.<br />
Una pachina se considera pachina de desambigación si fa servir una plantilla provenient de [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'Reendreceras dobles',
-'doubleredirectstext' => "En ista pachina s'amuestran as pachinas que son reendreceras enta atras pachinas reendrezatas.
+'doubleredirectstext' => "En ista pachina s'amuestran as pachinas que son reendreceras enta atras pachinas reendrezatas.
Cada ringlera contién o vinclo t'a primer y segunda reendreceras, y tamién o destino d'a segunda reendrecera, que ye a ormino a pachina obchectivo \"reyal\" a la que a primer pachina habría d'endrezar.",
'double-redirect-fixed-move' => "S'ha tresladau [[$1]], agora ye una endrecera ta [[$2]]",
'double-redirect-fixer' => 'Apanyador de reendreceras',
@@ -1688,6 +1712,8 @@ Cada ringlera contién o vinclo t'a primer y segunda reendreceras, y tamién o d
'nmembers' => '$1 {{PLURAL:$1|miembro|miembros}}',
'nrevisions' => '$1 {{PLURAL:$1|versión|versions}}',
'nviews' => '$1 {{PLURAL:$1|vesita|vesitas}}',
+'nimagelinks' => "S'emplega en $1 {{PLURAL:$1|pachina|pachinas}}",
+'ntransclusions' => "s'emplega en $1 {{PLURAL:$1|pachina|pachinas}}",
'specialpage-empty' => 'Ista pachina ye bueda.',
'lonelypages' => 'Pachinas popiellas',
'lonelypagestext' => "As siguients pachinas no tienen vinclos dende atras pachinas ni s'incluyen en atras pachinas de {{SITENAME}}.",
@@ -1843,34 +1869,40 @@ Protocolos suportados: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Salir de todas as collas',
# E-mail user
-'mailnologin' => "No ninviar l'adreza",
-'mailnologintext' => "Ha d'haber [[Special:UserLogin|encetato una sesión]] y tener una adreza conforme de correu-e en as suyas [[Special:Preferences|preferencias]] ta ninviar un correu electronico ta atros usuarios.",
-'emailuser' => 'Ninviar un correu electronico ta iste usuario',
-'emailpage' => "Ninviar correu ta l'usuario",
-'emailpagetext' => 'Puede fer servir o formulario que bi ye contino ta ninviar un correu electronico a iste usuario.
+'mailnologin' => "No ninviar l'adreza",
+'mailnologintext' => "Ha d'haber [[Special:UserLogin|encetato una sesión]] y tener una adreza conforme de correu-e en as suyas [[Special:Preferences|preferencias]] ta ninviar un correu electronico ta atros usuarios.",
+'emailuser' => 'Ninviar un correu electronico ta iste usuario',
+'emailpage' => "Ninviar correu ta l'usuario",
+'emailpagetext' => 'Puede fer servir o formulario que bi ye contino ta ninviar un correu electronico a iste usuario.
L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias d\'usuario]] amaneixerá en o campo "Remitent" ta que o destinatario pueda responder-le.',
-'usermailererror' => "L'obchecto de correu retornó una error:",
-'defemailsubject' => 'Correu de {{SITENAME}}',
-'noemailtitle' => 'No bi ha garra adreza de correu electronico',
-'noemailtext' => 'Iste usuario no ha especificato una adreza conforme de correu electronico.',
-'nowikiemailtitle' => 'no se premiten os correus electronicos',
-'nowikiemailtext' => "Iste usuario ha esleyiu de no recibir correus electronicos d'atros usuarios.",
-'email-legend' => 'Ninviar un correu electronico ta atro usuario de {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'Ta:',
-'emailsubject' => 'Afer:',
-'emailmessage' => 'Mensache:',
-'emailsend' => 'Ninviar',
-'emailccme' => "Ninviar-me una copia d'o mío mensache.",
-'emailccsubject' => "Copia d'o suyo mensache ta $1: $2",
-'emailsent' => 'Mensache de correu ninviato',
-'emailsenttext' => "S'ha ninviato o suyo correu.",
-'emailuserfooter' => 'Iste correu-e s\'ha ninviato por $1 ta $2 fendo servir a función "Email user" de {{SITENAME}}.',
+'usermailererror' => "L'obchecto de correu retornó una error:",
+'defemailsubject' => 'Correu de {{SITENAME}}',
+'usermaildisabled' => "S'ha desactivau o ninvío de correus electronicos a os usuarios",
+'usermaildisabledtext' => 'En ista wiki no puet ninviar un correu-e a atros usuarios',
+'noemailtitle' => 'No bi ha garra adreza de correu electronico',
+'noemailtext' => 'Iste usuario no ha especificato una adreza conforme de correu electronico.',
+'nowikiemailtitle' => 'no se premiten os correus electronicos',
+'nowikiemailtext' => "Iste usuario ha esleyiu de no recibir correus electronicos d'atros usuarios.",
+'email-legend' => 'Ninviar un correu electronico ta atro usuario de {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'Ta:',
+'emailsubject' => 'Afer:',
+'emailmessage' => 'Mensache:',
+'emailsend' => 'Ninviar',
+'emailccme' => "Ninviar-me una copia d'o mío mensache.",
+'emailccsubject' => "Copia d'o suyo mensache ta $1: $2",
+'emailsent' => 'Mensache de correu ninviato',
+'emailsenttext' => "S'ha ninviato o suyo correu.",
+'emailuserfooter' => 'Iste correu-e s\'ha ninviato por $1 ta $2 fendo servir a función "Email user" de {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Deixando un mensache de sistema.',
+'usermessage-editor' => "Mensachero d'o sistema",
# Watchlist
'watchlist' => 'Lista de seguimiento',
'mywatchlist' => 'Lista de seguimiento',
-'watchlistfor' => "(de '''$1''')",
+'watchlistfor2' => 'De $1 $2',
'nowatchlist' => 'No tien garra pachina en a lista de seguimiento.',
'watchlistanontext' => "Ha de $1 ta veyer u editar as dentradas d'a suya lista de seguimiento.",
'watchnologin' => 'No ha encetato a sesión',
@@ -1985,7 +2017,10 @@ A zaguer edición d'a pachina la fació [[User:$3|$3]] ([[User talk:$3|descusió
'revertpage' => "S'han revertito as edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|Descusión]]); tornando t'a zaguera versión editada por [[User:$1|$1]]",
'revertpage-nouser' => "S'han revertito as edicions feitas por (nombre d'usuario eliminato) a la zaguera versión feita por [[User:$1|$1]]",
'rollback-success' => "Revertidas as edicions de $1; s'ha retornato t'a zaguer versión de $2.",
-'sessionfailure' => "Pareix que bi ha un problema con a suya sesión;
+
+# Edit tokens
+'sessionfailure-title' => 'Error de sesión',
+'sessionfailure' => "Pareix que bi ha un problema con a suya sesión;
s'ha anulato ista acción como mida de precura contra seqüestros de sesión.
Torne t'a pachina anterior, recargue a pachina y torne a prebar alavez.",
@@ -2109,18 +2144,21 @@ $1",
'month' => 'Dende o mes (y anteriors):',
'year' => "Dende l'anyo (y anteriors):",
-'sp-contributions-newbies' => "Amostrar nomás as contrebucions d'os usuarios nuevos",
-'sp-contributions-newbies-sub' => 'Por nuevos usuarios',
-'sp-contributions-newbies-title' => "Contrebucions d'os nuevos usuarios",
-'sp-contributions-blocklog' => 'Rechistro de bloqueyos',
-'sp-contributions-deleted' => "contribucions d'usuario borradas",
-'sp-contributions-logs' => 'rechistros',
-'sp-contributions-talk' => 'descusión',
-'sp-contributions-userrights' => "administración de dreitos d'usuario",
-'sp-contributions-blocked-notice' => "Iste usuario ye bloqueyato en istos momentos. A zaguer dentrada d'o rechistro de bloqueyos se presienta debaixo ta más información:",
-'sp-contributions-search' => 'Mirar contribucions',
-'sp-contributions-username' => "Adreza IP u nombre d'usuario:",
-'sp-contributions-submit' => 'Mirar',
+'sp-contributions-newbies' => "Amostrar nomás as contrebucions d'os usuarios nuevos",
+'sp-contributions-newbies-sub' => 'Por nuevos usuarios',
+'sp-contributions-newbies-title' => "Contrebucions d'os nuevos usuarios",
+'sp-contributions-blocklog' => 'Rechistro de bloqueyos',
+'sp-contributions-deleted' => "contribucions d'usuario borradas",
+'sp-contributions-logs' => 'rechistros',
+'sp-contributions-talk' => 'descusión',
+'sp-contributions-userrights' => "administración de dreitos d'usuario",
+'sp-contributions-blocked-notice' => "Iste usuario ye bloqueyato en istos momentos. A zaguer dentrada d'o rechistro de bloqueyos se presienta debaixo ta más información:",
+'sp-contributions-blocked-notice-anon' => "Ista adreza IP se troba acutalment bloqueyada.
+Ta más información, s'amuestra contino a zaguera dentrada d'o rechistro de bloqueyos.",
+'sp-contributions-search' => 'Mirar contribucions',
+'sp-contributions-username' => "Adreza IP u nombre d'usuario:",
+'sp-contributions-toponly' => 'Mostrar nomás as zagueras versions',
+'sp-contributions-submit' => 'Mirar',
# What links here
'whatlinkshere' => 'Pachinas que enlazan con ista',
@@ -2183,7 +2221,6 @@ as pachinas que s'han vandalizato).",
'ipb-edit-dropdown' => "Editar as razons d'o bloqueyo",
'ipb-unblock-addr' => 'Desbloqueyar $1',
'ipb-unblock' => 'Desbloqueyar un usuario u una IP',
-'ipb-blocklist-addr' => 'Bloqueyos actuals de $1',
'ipb-blocklist' => 'Amostrar bloqueyos actuals',
'ipb-blocklist-contribs' => 'Contrebucions de $1',
'unblockip' => 'Desbloqueyar usuario',
@@ -2252,6 +2289,8 @@ $1 ya ye bloqueyato. Quiere cambiar as condicions d'o bloqueyo?",
'sorbs_create_account_reason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}. No puede creyar una cuenta',
'cant-block-while-blocked' => 'No puet bloqueyar a atros usuarios en o tiempo que ye bloqueyato.',
'cant-see-hidden-user' => "L'usuario a qui ye mirando de bloqueyar ya ye bloqueyau y amagau. Como que ye posible que vusté no tienga o dreito hideuser, no puede veyer ni editar os bloqueyos d'ixe usuario.",
+'ipbblocked' => 'No puede bloqueyar ni desbloqueyar atros usuarios porque ya ye bloqueyau.',
+'ipbnounblockself' => 'No tiene permiso ta sacar o suyo propio bloqueyo',
# Developer tools
'lockdb' => 'Trancar a base de datos',
@@ -2341,6 +2380,7 @@ A pachina de destino ("[[:$1]]") ya existe. Quiere borrar-la ta premitir o tresl
'immobile-source-page' => 'Ista pachina no se puet tresladar.',
'immobile-target-page' => 'No se puet tresladar ta ixe títol.',
'imagenocrossnamespace' => 'No se puede tresladar un fichero ta un espacio de nombres que no sía fichers',
+'nonfile-cannot-move-to-file' => 'No ye posible de mover qualcosa que no siga un fichero ta o espacio de nombres fichers',
'imagetypemismatch' => 'A nueva estensión no concuerda con o tipo de fichero',
'imageinvalidfilename' => "O nombre d'o fichero obchectivo no ye conforme",
'fix-double-redirects' => 'Esviellar todas as reendreceras que plegan ta o títol orichinal',
@@ -2416,6 +2456,7 @@ Todas as importacions interwiki se rechistran en o [[Special:Log/import|rechistr
'importstart' => 'Importando pachinas...',
'import-revision-count' => '$1 {{PLURAL:$1|versión|versions}}',
'importnopages' => 'No bi ha garra pachina ta importar.',
+'imported-log-entries' => "S'ha importau {{PLURAL:$1|una dentrada d'o rechistro|S'han importau $1 dentradas d'o rechistro}}.",
'importfailed' => 'Ha fallato a importación: $1',
'importunknownsource' => "O tipo de fuent d'a importación ye esconoixito",
'importcantopen' => "No s'ha puesto importar iste fichero",
@@ -2509,6 +2550,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
'tooltip-upload' => 'Prencipia a carga',
'tooltip-rollback' => '"Revertir" revierte todas as zagueras edicions d\'un mesmo usuario en ista pachina nomás con un clic.',
'tooltip-undo' => '"Desfer" revierte a edición trigata y ubre a pachina d\'edición en o modo de previsualización. Deixa escribir una razón en o resumen d\'edición.',
+'tooltip-preferences-save' => 'Alzar as preferencias',
+'tooltip-summary' => 'Escribir un breu resumen',
# Metadata
'nodublincore' => 'Metadatos Dublin Core RDF desactivatos en iste servidor.',
@@ -2605,19 +2648,22 @@ $1',
'nextdiff' => "Ir t'a edición siguient →",
# Media information
-'mediawarning' => "'''Pare cuenta!''': Iste tipo de fichero puet contener codigo endino.
+'mediawarning' => "'''Pare cuenta!''': Iste tipo de fichero puet contener codigo endino.
En executar-lo, podría meter en un contornillo a seguridat d'o suyo sistema.",
'imagemaxsize' => "Limite de grandaria d'as imáchens:<br />''(ta pachinas de descripción de fichers)''",
'thumbsize' => "Midas d'a miniatura:",
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pachina|pachinas}}',
-'file-info' => "(grandaria d'o fichero: $1; tipo MIME: $2)",
-'file-info-size' => "($1 × $2 píxels; grandaria d'o fichero: $3; tipo MIME: $4)",
+'file-info' => "grandaria d'o fichero: $1; tipo MIME: $2",
+'file-info-size' => "$1 × $2 píxels; grandaria d'o fichero: $3; tipo MIME: $4",
'file-nohires' => '<small>No bi ha garra versión con resolución más gran.</small>',
-'svg-long-desc' => '(fichero SVG, nominalment $1 × $2 píxels, grandaria: $3)',
+'svg-long-desc' => 'fichero SVG, nominalment $1 × $2 píxels, grandaria: $3',
'show-big-image' => 'Imachen en a maxima resolución',
'show-big-image-thumb' => "<small>Grandaria d'ista anvista previa: $1 × $2 píxels</small>",
'file-info-gif-looped' => 'embuclau',
'file-info-gif-frames' => '$1 {{PLURAL:$1|imachen|imáchens}}',
+'file-info-png-looped' => 'embuclau',
+'file-info-png-repeat' => 'reproducito $1 {{PLURAL:$1|vegada|vegadas}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|imáchens|imáchens}}',
# Special:NewFiles
'newimages' => 'Galería de nuevas imachens',
@@ -2926,24 +2972,24 @@ Nomás se consideran os elementos de lista (ringleras que escomienzan por *). O
'limitall' => 'Totz',
# E-mail address confirmation
-'confirmemail' => 'Confirmar adreza de correu-e',
-'confirmemail_noemail' => "No tiene una adreza de correu-e conforme en as suyas [[Special:Preferences|preferencias d'usuario]].",
-'confirmemail_text' => "{{SITENAME}} requiere que confirme a suya adreza de correu-e antis de poder usar as funcions de correu-e. Punche o botón de baxo ta ninviar un mensache de confirmación t'a suya adreza. O mensache incluirá un vinclo con un codigo. Escriba-lo ta confirmar que a suya adreza ye conforme.",
-'confirmemail_pending' => "Ya se le ha ninviato un codigo de confirmación; si creyó una cuenta fa poco tiempo, puede que s'estime más d'aguardar bells menutos ta veyer si le plega antes de pedir un nuevo codigo.",
-'confirmemail_send' => 'Ninviar un codigo de confirmación.',
-'confirmemail_sent' => "S'ha ninviato un correu de confirmación.",
-'confirmemail_oncreate' => "S'ha ninviato un codigo de confirmación t'a suya adreza de correu-e.
+'confirmemail' => 'Confirmar adreza de correu-e',
+'confirmemail_noemail' => "No tiene una adreza de correu-e conforme en as suyas [[Special:Preferences|preferencias d'usuario]].",
+'confirmemail_text' => "{{SITENAME}} requiere que confirme a suya adreza de correu-e antis de poder usar as funcions de correu-e. Punche o botón de baxo ta ninviar un mensache de confirmación t'a suya adreza. O mensache incluirá un vinclo con un codigo. Escriba-lo ta confirmar que a suya adreza ye conforme.",
+'confirmemail_pending' => "Ya se le ha ninviato un codigo de confirmación; si creyó una cuenta fa poco tiempo, puede que s'estime más d'aguardar bells menutos ta veyer si le plega antes de pedir un nuevo codigo.",
+'confirmemail_send' => 'Ninviar un codigo de confirmación.',
+'confirmemail_sent' => "S'ha ninviato un correu de confirmación.",
+'confirmemail_oncreate' => "S'ha ninviato un codigo de confirmación t'a suya adreza de correu-e.
Iste codigo no ye necesario ta dentrar, pero amenistará escribir-lo antis d'activar qualsiquier función d'o wiki basata en o correu electronico.",
-'confirmemail_sendfailed' => "{{SITENAME}} no ha puesto ninviar-le o mensache de confirmación. Por favor, comprebe que no bi haiga carácters no conformes en l'adreza de correu electronico indicata.
+'confirmemail_sendfailed' => "{{SITENAME}} no ha puesto ninviar-le o mensache de confirmación. Por favor, comprebe que no bi haiga carácters no conformes en l'adreza de correu electronico indicata.
O programa retornó o siguient codigo d'error: $1",
-'confirmemail_invalid' => 'O codigo de confirmación no ye conforme. Regular que o codigo sía circumducito.',
-'confirmemail_needlogin' => 'Amenistar $1 ta confirmar a suya adreza de correu-e.',
-'confirmemail_success' => 'A suya adreza de correu-e ya ye confirmata. Agora puede [[Special:UserLogin|dentrar]] en o wiki y gronxiar-se-ie.',
-'confirmemail_loggedin' => 'A suya adreza de correu-e ya ye confirmata.',
-'confirmemail_error' => 'Bella cosa falló en alzar a suya confirmación.',
-'confirmemail_subject' => "confirmación de l'adreza de correu-e de {{SITENAME}}",
-'confirmemail_body' => 'Belún, probablement vusté mesmo, ha rechistrato una cuenta "$2" con ista adreza de correu-e en {{SITENAME}} dende l\'adreza IP $1.
+'confirmemail_invalid' => 'O codigo de confirmación no ye conforme. Regular que o codigo sía circumducito.',
+'confirmemail_needlogin' => 'Amenistar $1 ta confirmar a suya adreza de correu-e.',
+'confirmemail_success' => 'A suya adreza de correu-e ya ye confirmata. Agora puede [[Special:UserLogin|dentrar]] en o wiki y gronxiar-se-ie.',
+'confirmemail_loggedin' => 'A suya adreza de correu-e ya ye confirmata.',
+'confirmemail_error' => 'Bella cosa falló en alzar a suya confirmación.',
+'confirmemail_subject' => "confirmación de l'adreza de correu-e de {{SITENAME}}",
+'confirmemail_body' => 'Belún, probablement vusté mesmo, ha rechistrato una cuenta "$2" con ista adreza de correu-e en {{SITENAME}} dende l\'adreza IP $1.
Ta confirmar que ista cuenta reyalment le perteneixe y activar as funcions de correu-e en {{SITENAME}}, ubra iste vinclo en o suyo navegador:
@@ -2954,8 +3000,19 @@ Si a cuenta *no* ye suya, siga iste atro vinclo ta anular a confirmación d\'adr
$5
Iste codigo de confirmación circumducirá en $4.',
-'confirmemail_invalidated' => "Anular a confirmación d'adreza de correu-e",
-'invalidateemail' => 'Anular a confirmación de correu-e',
+'confirmemail_body_changed' => 'Belún, probablement vusté mesmo, dende l\'adreza IP $1, ha cambiato l\'adreza de correu-e d\'a cuenta "$2" ta ista adreza en {{SITENAME}}.
+
+Ta confirmar que ista cuenta reyalment le perteneix y ta reactivar as funcions de correu-e en {{SITENAME}}, ubra iste vinclo en o suyo navegador:
+
+$3
+
+Si a cuenta *no* ye suya, siga iste atro vinclo ta anular a confirmación d\'adreza de correu-e:
+
+$5
+
+Iste codigo de confirmación circumducirá en $4.',
+'confirmemail_invalidated' => "Anular a confirmación d'adreza de correu-e",
+'invalidateemail' => 'Anular a confirmación de correu-e',
# Scary transclusion
'scarytranscludedisabled' => "[S'ha desactivato a transclusión interwiki]",
@@ -2995,6 +3052,7 @@ Por favor, confirme que reyalment deseya tornar a creyar l'articlo.",
'table_pager_first' => 'Primera pachina',
'table_pager_last' => 'Zaguer pachina',
'table_pager_limit' => 'Amostrar $1 elementos por pachina',
+'table_pager_limit_label' => 'Ãtems por pachina:',
'table_pager_limit_submit' => 'Ir-ie',
'table_pager_empty' => 'No bi ha garra resultau',
@@ -3062,6 +3120,13 @@ Tamién puede fer servir o [[Special:Watchlist/edit|editor estándar]].",
'version-hook-subscribedby' => 'Suscrito por',
'version-version' => '(Versión $1)',
'version-license' => 'Licencia',
+'version-poweredby-credits' => "Iste wiki funciona gracias a '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'atros',
+'version-license-info' => "MediaWiki ye software libre, puet redistribuyir-lo y/u modificar-lo baixo os terminos d'a Licencia Publica Cheneral GNU publicada por a Free Software Foundation, ya siga d'a suya versión 2 u (a la suya esleción) qualsiquier versión posterior.
+
+MediaWiki se distribuye con l'asperanza d'estar d'utilidat, pero SIN GARRA GUARANCIA; nian a guarancia implicita de COMERCIALIZACIÓN u ADEQUACIÓN TA UNA FINALIDAT DETERMINADA. En trobará más detalles en a Licencia Publica General GNU.
+
+Con iste programa ha d'haber recibiu [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia d'a Licencia Publica Cheneral GNU]; si no ye asinas, endrece-se a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA u bien [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html la leiga en linia].",
'version-software' => 'Software instalato',
'version-software-product' => 'Producto',
'version-software-version' => 'Versión',
@@ -3132,6 +3197,15 @@ Escriba o nombre d\'o fichero sin o prefixo "{{ns:file}}:".',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|cambeo|cambeos}}',
+# Special:ComparePages
+'comparepages' => 'Contimparar pachinas',
+'compare-selector' => "Contimparar as versions d'as pachinas",
+'compare-page1' => 'Pachina 1',
+'compare-page2' => 'Pachina 2',
+'compare-rev1' => 'Versión 1',
+'compare-rev2' => 'Versión 2',
+'compare-submit' => 'Contimparar',
+
# Database error messages
'dberr-header' => 'Iste wiki tiene un problema',
'dberr-problems' => 'Lo sentimos. Iste sitio ye experimentando dificultatz tecnicas.',
@@ -3148,8 +3222,13 @@ Escriba o nombre d\'o fichero sin o prefixo "{{ns:file}}:".',
'htmlform-float-invalid' => 'A valura que ha especificato no ye un entero.',
'htmlform-int-toolow' => "A valura que ha especificato ye por debaixo d'o menimo de $1",
'htmlform-int-toohigh' => "A valura que ha especificato ye alto d'o maximo de $1",
+'htmlform-required' => 'Ista valura ye necesaria',
'htmlform-submit' => 'Ninviar',
'htmlform-reset' => 'Desfer cambios',
'htmlform-selectorother-other' => 'Atros',
+# SQLite database support
+'sqlite-has-fts' => '$1, con soporte de busca de texto integro',
+'sqlite-no-fts' => '$1, sin soporte de busca de texto integro',
+
);
diff --git a/languages/messages/MessagesAng.php b/languages/messages/MessagesAng.php
index 2c071d9a..d8146c48 100644
--- a/languages/messages/MessagesAng.php
+++ b/languages/messages/MessagesAng.php
@@ -43,8 +43,7 @@ $messages = array(
'tog-editsection' => 'DÇ£la Ädihtende þafian bȳ [Ädihtan] hlenÄ‹um',
'tog-editsectiononrightclick' => 'Þafa dÇ£la Ädihtune þurh sÆ¿enÈas þǣre sƿīðran healfe on dÇ£la titulum (þis þearf JavaScript)',
'tog-showtoc' => 'Innoðes tæfle sÄ“on (for sÄ«dum þe mÄ Ã¾onne 3 hÄ“afodingas habbaþ)',
-'tog-rememberpassword' => 'MÄ«ne inmeldunge Èemyndan on þissum spearcatelle',
-'tog-editwidth' => 'Þone Ädihtbox sprædan to fyllenne þæt fulÄnsÄ«enÄ“agþȳrl',
+'tog-rememberpassword' => 'MÄ«ne inmeldunge Èemyndan on þissum spearcatelle (oþ $1 {{PLURAL:$1|dæÈ|dagas}})',
'tog-watchcreations' => 'SÄ«dan þe iÄ‹ scieppe Ä“acian tÅ mÄ«nre ƿæccÈetale',
'tog-watchdefault' => 'SÄ«dan þe iÄ‹ Ädihte Ä“acian tÅ mÄ«nre ƿæccÈetale',
'tog-watchmoves' => 'SÄ«dan þe iÄ‹ hÆ¿eorfe Ä“acian tÅ mÄ«nre ƿæccÈetale',
@@ -190,31 +189,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Mearcunge Ä“acian',
-'vector-action-delete' => 'Forlēos',
-'vector-action-move' => 'Ç·eÈ',
-'vector-action-protect' => 'BeorÈa',
-'vector-action-undelete' => 'Sciepe tramet eft',
-'vector-action-unprotect' => 'UnbeorÈa',
-'vector-namespace-category' => 'Flocc',
-'vector-namespace-help' => 'Helpsīde',
-'vector-namespace-image' => 'Ȝeƿithord',
-'vector-namespace-main' => 'SÄ«de',
-'vector-namespace-media' => 'Missenmiddelsīde',
-'vector-namespace-mediawiki' => 'Ç¢rend',
-'vector-namespace-project' => 'Ƿeorcsīde',
-'vector-namespace-special' => 'SyndriÈ sÄ«de',
-'vector-namespace-talk' => 'Talu',
-'vector-namespace-template' => 'Bysen',
-'vector-namespace-user' => 'Brūcendsīde',
-'vector-view-create' => 'Sciepe',
-'vector-view-edit' => 'Ä€dihte',
-'vector-view-history' => 'Stǣr',
-'vector-view-view' => 'RÇ£d',
-'vector-view-viewsource' => 'SÄ“o fruman',
-'actions' => 'Fremmunga',
-'namespaces' => 'Namstedas',
-'variants' => 'Missenlicnessa',
+'vector-action-addsection' => 'Mearcunge Ä“acian',
+'vector-action-delete' => 'Forlēos',
+'vector-action-move' => 'Ç·eÈ',
+'vector-action-protect' => 'BeorÈa',
+'vector-action-undelete' => 'Sciepe tramet eft',
+'vector-action-unprotect' => 'UnbeorÈa',
+'vector-simplesearch-preference' => 'LÇ£t forðoda sÄ“cunge tÅtyhtinga (synderlÄ«ce for Vector scinne)',
+'vector-view-create' => 'Sciepe',
+'vector-view-edit' => 'Ä€dihte',
+'vector-view-history' => 'Stǣr',
+'vector-view-view' => 'RÇ£d',
+'vector-view-viewsource' => 'SÄ“o fruman',
+'actions' => 'Fremmunga',
+'namespaces' => 'Namstedas',
+'variants' => 'Missenlicnessa',
'errorpagetitle' => 'Ç·Åh',
'returnto' => 'ÈœÄ eft tÅ $1',
@@ -388,7 +377,7 @@ CnÄw þæt sume sÄ«dan cunnon gelÇ£stende Ä“owod wesan swÄ Ã¾Å« wÇ£re gÄ«et in
'yourname' => 'Þīn brūcendnama',
'yourpassword' => 'Þafungƿord:',
'yourpasswordagain' => 'Þafungƿord edƿrītan:',
-'remembermypassword' => 'MÄ«ne inmeldunge Èemyndan on þissum spearcatelle',
+'remembermypassword' => 'MÄ«ne inmeldunge Èemyndan on þissum spearcatelle (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Þīn ÈeÆ¿eald:',
'login' => 'Inmeldian',
'nav-login-createaccount' => 'Nīƿne hordcleofan scieppan oþþe inmeldian',
@@ -401,6 +390,7 @@ CnÄw þæt sume sÄ«dan cunnon gelÇ£stende Ä“owod wesan swÄ Ã¾Å« wÇ£re gÄ«et in
'createaccount' => 'Hordcleofan scieppan',
'gotaccountlink' => 'Inmeldian',
'createaccountmail' => 'Þurh spearcenaǣrend',
+'createaccountreason' => 'Racu:',
'badretype' => 'ÃžÄ Ã¾afungÆ¿ord þe Æ¿rite þū, bÄ“oþ unÈemæcca.',
'userexists' => 'HÆ¿Ä hæfþ þæt brÅ«cendnama.
Bidde Åðer brÅ«cendnama Ä‹Ä“osan.',
@@ -498,9 +488,6 @@ Gif þu hider misfÅn cÅme, cnoca Ã¾Ä Ã¾Ä«nne webbscÄ“aweres '''on bæc''' cnÃ
Þū behǣtst ēac þæt þū selfa þis ƿrite, oþþe efenlǣhtest of sumre
folcliÄ‹um Ägnunge oþþe ÈelÄ«Ä‹um frÄ“om horde (sÄ“o $1 for Äscungum).
'''Ne forþsend efenlǣhtscielded ƿeorc būtan þafunge!'''",
-'longpagewarning' => 'WARNUNG: Þes tramet is $1 kilobyta lang; sume
-webbscÄ“aweras hæbben earfoðu mid þȳ þe hÄ«e Ädihtaþ trametas nÄ“a oþþe lengran þonne 32kb.
-Bidde behycge þæt þu bricst þone tramet intŠsmalrum dǣlum.',
'templatesused' => '{{PLURAL:$1|Bysen|Bysena}} brocen on þisre sīdan:',
'templatesusedpreview' => '{{PLURAL:$1|Bysen|Bysena}} brocen on þisre forescēaƿe:',
'template-protected' => '(borgen)',
@@ -680,12 +667,8 @@ Bidde behycge þæt þu bricst þone tramet intŠsmalrum dǣlum.',
'recentchanges' => 'Nīƿe hƿearfas',
'recentchanges-legend' => 'Nīƿa hƿearfa forebearƿan',
'recentchanges-feed-description' => 'ÃžÄ mÇ£st nÄ«Æ¿oste hÆ¿earfan huntan to þisse Æ¿iki in þissum strÄ“ame',
-'recentchanges-label-legend' => 'CÇ£È: $1.',
-'recentchanges-legend-newpage' => '$1 - nīƿu sīde',
'recentchanges-label-newpage' => 'Þes Ädiht macode nÄ«Æ¿a sÄ«dan',
-'recentchanges-legend-minor' => '$1 - lȳtl Ädiht',
'recentchanges-label-minor' => 'Þes is lȳtl Ädiht',
-'recentchanges-legend-bot' => '$1 - searuþræles Ädiht',
'recentchanges-label-bot' => 'Searuþræl fremmode þisne Ädiht',
'rcnote' => "Under {{PLURAL:$1|... '''1''' ...|sind Ã¾Ä Ã¦ftemestan '''$1''' hweorfunga}} in {{PLURAL:$2|...|þǣm æftemestum '''$2''' dagum}}, . . $5, $4.",
'rcnotefrom' => 'Under sind Ã¾Ä hweorfunga siþþan <b>$2</b> (oþ <b>$1</b> geÄ«ewed).',
@@ -902,7 +885,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'MÄ«nu ƿæcceÈetalu',
'mywatchlist' => 'MÄ«nu ƿæcceÈetalu',
-'watchlistfor' => "(for '''$1''')",
'addedwatch' => 'To ƿæcceÈetale Ä“acod',
'removedwatch' => 'FornÅm fram ƿæccÈetale',
'removedwatchtext' => 'SÄ“o sÄ«de "[[:$1]]" ƿæs fram [[Special:Watchlist|þīnre ƿæccÈetale]] fornÅm.',
@@ -1178,9 +1160,9 @@ Bidde cÄ“os Åðerne naman.',
# Media information
'imagemaxsize' => 'Settan biliðu on biliþgemearcungtrametum tÅ:',
'thumbsize' => 'Þumannæglmicelnes:',
-'file-info-size' => '($1 × $2 pixels, fīlmiċelu: $3, MIMEcynn: $4)',
+'file-info-size' => '$1 × $2 pixels, fīlmiċelu: $3, MIMEcynn: $4',
'file-nohires' => '<small>Þǣr nis nÇ£niÈ mÄ miÄ‹elu.</small>',
-'svg-long-desc' => '(SVG fīl, rihte $1 × $2 pixels, fīlmiċelu: $3)',
+'svg-long-desc' => 'SVG fīl, rihte $1 × $2 pixels, fīlmiċelu: $3',
'show-big-image' => 'Fulmiċelu',
'show-big-image-thumb' => '<small>Þēos forescēaƿe miċelu: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php
index c5d4de91..583696bb 100644
--- a/languages/messages/MessagesAr.php
+++ b/languages/messages/MessagesAr.php
@@ -21,6 +21,7 @@
* @author Gharbeia
* @author Hakeem
* @author Histolo2
+ * @author Houcinee1
* @author Jak
* @author Khaledhosny
* @author Lord Anubis
@@ -35,13 +36,17 @@
* @author OsamaK
* @author Ouda
* @author Oxydo
+ * @author Rami.Awad
* @author Riadismet
+ * @author Samer
* @author Sami Lab
* @author Tarawneh
* @author TheEgyptian
* @author Uwe a
+ * @author Zanatos
* @author ترجمان05
* @author عصام بايزيدي
+ * @author عمرو
* @author نصوح
*/
@@ -113,7 +118,7 @@ $dateFormats = array(
'ymd time' => 'H:i',
'ymd date' => 'Y xg j',
'ymd both' => 'H:i، Y xg j', # Arabic comma
-
+
'hijri time' => 'H:i',
'hijri date' => 'xmj xmF xmY',
'hijri both' => 'H:i، xmj xmF xmY',
@@ -220,6 +225,7 @@ $magicWords = array(
'subjectpagenamee' => array( '1', 'عنوان_صÙحة_الموضوع', 'عنوان_صÙحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'رسالة:', 'MSG:' ),
'subst' => array( '0', 'نسخ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'تصغير', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -230,8 +236,8 @@ $magicWords = array(
'img_center' => array( '1', 'مركز', 'center', 'centre' ),
'img_framed' => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'لاإطار', 'frameless' ),
- 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'حدود', 'border' ),
'img_baseline' => array( '1', 'خط_أساسي', 'baseline' ),
'img_sub' => array( '1', 'Ùرعي', 'sub' ),
@@ -249,6 +255,7 @@ $magicWords = array(
'nse' => array( '0', 'نطم:', 'NSE:' ),
'localurl' => array( '0', 'مسار_محلي:', 'LOCALURL:' ),
'localurle' => array( '0', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'مسار_المقالة', 'ARTICLEPATH' ),
'server' => array( '0', 'خادم', 'SERVER' ),
'servername' => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
'scriptpath' => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
@@ -265,6 +272,7 @@ $magicWords = array(
'revisionday' => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
@@ -306,6 +314,9 @@ $magicWords = array(
'staticredirect' => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'مسار', 'PATH' ),
+ 'url_wiki' => array( '0', 'ويكي', 'WIKI' ),
+ 'url_query' => array( '0', 'استعلام', 'QUERY' ),
);
$specialPageAliases = array(
@@ -319,6 +330,7 @@ $specialPageAliases = array(
'Watchlist' => array( 'قائمة_المراقبة' ),
'Recentchanges' => array( 'أحدث_التغييرات' ),
'Upload' => array( 'رÙع' ),
+ 'UploadStash' => array( 'رÙع_مخÙÙŠ' ),
'Listfiles' => array( 'عرض_الملÙات', 'قائمة_الملÙات', 'قائمة_الصور' ),
'Newimages' => array( 'ملÙات_جديدة', 'صور_جديدة' ),
'Listusers' => array( 'عرض_المستخدمين', 'قائمة_المستخدمين' ),
@@ -353,6 +365,7 @@ $specialPageAliases = array(
'Allpages' => array( 'كل_الصÙحات' ),
'Prefixindex' => array( 'Ùهرس_بادئة' ),
'Ipblocklist' => array( 'قائمة_المنع', 'عرض_المنع', 'قائمة_منع_أيبي' ),
+ 'Unblock' => array( 'رÙع_منع' ),
'Specialpages' => array( 'صÙحات_خاصة' ),
'Contributions' => array( 'مساهمات' ),
'Emailuser' => array( 'مراسلة_المستخدم' ),
@@ -377,12 +390,14 @@ $specialPageAliases = array(
'FileDuplicateSearch' => array( 'بحث_ملÙ_مكرر' ),
'Unwatchedpages' => array( 'صÙحات_غير_مراقبة' ),
'Listredirects' => array( 'عرض_التحويلات' ),
- 'Revisiondelete' => array( 'حذÙ_نسخة' ),
+ 'Revisiondelete' => array( 'حذÙ_مراجعة' ),
'Unusedtemplates' => array( 'قوالب_غير_مستخدمة' ),
'Randomredirect' => array( 'تحويلة_عشوائية' ),
'Mypage' => array( 'صÙحتي' ),
'Mytalk' => array( 'نقاشي' ),
'Mycontributions' => array( 'مساهماتي' ),
+ 'Myuploads' => array( 'رÙوعاتي' ),
+ 'PermanentLink' => array( 'وصلة_دائمة', 'رابط_دائم' ),
'Listadmins' => array( 'عرض_الإداريين' ),
'Listbots' => array( 'عرض_البوتات' ),
'Popularpages' => array( 'صÙحات_مشهورة' ),
@@ -397,6 +412,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'مساهمات_محذوÙØ©' ),
'Tags' => array( 'وسوم' ),
'Activeusers' => array( 'مستخدمون_نشطون' ),
+ 'ComparePages' => array( 'مقارنة_الصÙحات' ),
+ 'Badtitle' => array( 'عوان_سئ' ),
+ 'DisableAccount' => array( 'تعطيل_الحساب' ),
);
/**
@@ -430,8 +448,7 @@ $messages = array(
'tog-editsection' => 'مكن تعديل الأقسام عن طريق وصلات [عدل]',
'tog-editsectiononrightclick' => 'Ùعل تعديل الأقسام بواسطة كبسة الÙأرة اليمين على عناوين الأقسام (جاÙاسكريبت)',
'tog-showtoc' => 'اعرض Ùهرس المحتويات (للصÙحات التي تحتوي على أكثر من 3 عناوين)',
-'tog-rememberpassword' => 'تذكر دخولي على هذا الحاسوب',
-'tog-editwidth' => 'زد عرض صندوق التحرير لملء الشاشة كلها',
+'tog-rememberpassword' => 'تذكر دخولي على هذا المتصÙØ­ (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
'tog-watchcreations' => 'أض٠الصÙحات التي أنشئها إلى قائمة مراقبتي',
'tog-watchdefault' => 'أض٠الصÙحات التي أعدلها إلى قائمة مراقبتي',
'tog-watchmoves' => 'أض٠الصÙحات التي أنقلها إلى قائمة مراقبتي',
@@ -578,31 +595,21 @@ $messages = array(
'faqpage' => 'Project:أسئلة متكررة',
# Vector skin
-'vector-action-addsection' => 'أض٠موضوعا',
-'vector-action-delete' => 'احذÙ',
-'vector-action-move' => 'انقل',
-'vector-action-protect' => 'احم',
-'vector-action-undelete' => 'استرجع الحذÙ',
-'vector-action-unprotect' => 'أزل الحماية',
-'vector-namespace-category' => 'تصنيÙ',
-'vector-namespace-help' => 'صÙحة مساعدة',
-'vector-namespace-image' => 'ملÙ',
-'vector-namespace-main' => 'صÙحة',
-'vector-namespace-media' => 'صÙحة وسيط',
-'vector-namespace-mediawiki' => 'رسالة',
-'vector-namespace-project' => 'صÙحة مشروع',
-'vector-namespace-special' => 'صÙحة خاصة',
-'vector-namespace-talk' => 'نقاش',
-'vector-namespace-template' => 'قالب',
-'vector-namespace-user' => 'صÙحة مستخدم',
-'vector-view-create' => 'أنشئ',
-'vector-view-edit' => 'عدل',
-'vector-view-history' => 'اعرض التاريخ',
-'vector-view-view' => 'اقرأ',
-'vector-view-viewsource' => 'اعرض المصدر',
-'actions' => 'Ø£Ùعال',
-'namespaces' => 'النطاقات',
-'variants' => 'المتغيرات',
+'vector-action-addsection' => 'أض٠موضوعا',
+'vector-action-delete' => 'احذÙ',
+'vector-action-move' => 'انقل',
+'vector-action-protect' => 'احم',
+'vector-action-undelete' => 'استرجع الحذÙ',
+'vector-action-unprotect' => 'أزل الحماية',
+'vector-simplesearch-preference' => 'مكّن مقترحات البحث المÙحسّنة (لواجهة Ùكتور Ùقط)',
+'vector-view-create' => 'أنشئ',
+'vector-view-edit' => 'عدل',
+'vector-view-history' => 'اعرض التاريخ',
+'vector-view-view' => 'اقرأ',
+'vector-view-viewsource' => 'اعرض المصدر',
+'actions' => 'Ø£Ùعال',
+'namespaces' => 'النطاقات',
+'variants' => 'المتغيرات',
'errorpagetitle' => 'خطأ',
'returnto' => 'ارجع إلى $1.',
@@ -663,6 +670,9 @@ $messages = array(
من Ùضلك انتظر قليلا قبل أن تحاول الوصول إلى هذه الصÙحة مجددا.
$1',
+'pool-timeout' => 'انتهاء الانتظار للقÙÙ„',
+'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}}',
@@ -832,7 +842,8 @@ $2',
'yourname' => 'اسم المستخدم:',
'yourpassword' => 'كلمة السر:',
'yourpasswordagain' => 'أعد كتابة كلمة السر:',
-'remembermypassword' => 'تذكر دخولي على هذا الحاسوب',
+'remembermypassword' => 'تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
+'securelogin-stick-https' => 'ابقَ ÙÙŠ اتصال HTTPS بعد الدخول.',
'yourdomainname' => 'نطاقك:',
'externaldberror' => 'هناك إما خطأ ÙÙŠ دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
'login' => 'ادخل',
@@ -849,6 +860,7 @@ $2',
'gotaccount' => "تمتلك حسابا بالÙعل؟ '''$1'''.",
'gotaccountlink' => 'Ù„Ùج',
'createaccountmail' => 'بواسطة البريد الإلكتروني',
+'createaccountreason' => 'السبب:',
'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالÙعل.
اختر اسما مختلÙا.',
@@ -877,6 +889,7 @@ $2',
من Ùضلك حاول مرة أخرى.',
'passwordtooshort' => 'يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حر٠واحد|حرÙين|$1 حروÙ|$1 حرÙا|$1 حرÙ}}.',
'password-name-match' => 'يجب أن تكون كلمة المرور مختلÙØ© عن اسم المستخدم.',
+'password-login-forbidden' => 'تم منع استخدام اسم المستخدم هذا وكلمة السر.',
'mailmypassword' => 'أرسل لي كلمة سر جديدة',
'passwordremindertitle' => 'كلمة سر مؤقتة جديدة ل{{SITENAME}}',
'passwordremindertext' => 'لقد طلب شخص ما (غالبا أنت، من عنوان الآيبي $1) كلمة سر جديدة ل{{SITENAME}} ($4).
@@ -917,6 +930,9 @@ $2',
'loginlanguagelabel' => 'اللغة: $1',
'suspicious-userlogout' => 'رÙض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصÙØ­ معطوب أو وسيط تخزين.',
+# E-mail sending
+'php-mail-error-unknown' => "خطأ غير معرو٠ÙÙŠ وظيÙØ© البريد PHP's mail()",
+
# Password reset dialog
'resetpass' => 'تغيير كلمة السر',
'resetpass_announce' => 'تم تسجيل دخولك بكلمة سر مؤقتة.
@@ -968,11 +984,12 @@ $2',
'showdiff' => 'أظهر التغييرات',
'anoneditwarning' => "'''تحذير:''' لم تقم بالدخول.
سيسجل عنوان الآيبي خاصتك ÙÙŠ تاريخ هذه الصÙحة.",
+'anonpreviewwarning' => "''أنت غير مسجل الدخول. الحÙظ سيسجل عنوان الأيبي الخاص بك ÙÙŠ تاريخ هذه الصÙحة.''",
'missingsummary' => "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.
إذا قمت بضغط Ø­Ùظ الصÙحة مرة أخرى، Ùيتم Ø­Ùظ تعديلك بدون ملخص.",
'missingcommenttext' => 'من Ùضلك أدخل تعليقا ÙÙŠ الأسÙÙ„.',
'missingcommentheader' => "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.
-إذا قمت بالضغط على Ø­Ùظ الصÙحة مجددا، سيتم Ø­Ùظ تعليقك بدون عنوان.",
+إذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم Ø­Ùظ تعليقك بدون عنوان.",
'summary-preview' => 'معاينة الملخص:',
'subject-preview' => 'معاينة للموضوع/العنوان:',
'blockedtitle' => 'المستخدم ممنوع',
@@ -1046,8 +1063,12 @@ $2',
لم يتم Ø­Ùظها بعد!'''",
'userjspreview' => "'''تذكر أنك Ùقط تجرب/تعاين جاÙاسكربت.'''
'''لم يتم الحÙظ بعد!'''",
+'sitecsspreview' => "''' تذكر أنك Ùقط ÙÙŠ وضع المعاينة لهذا CSS '''
+''' ولم يتم Ø­Ùظ الصÙحة بعد! '''",
+'sitejspreview' => "''' تذكر أنك Ùقط ÙÙŠ وضع المعاينة لكود JavaScript هذا'''
+''' ولم يتم Ø­Ùظه بعد! '''",
'userinvalidcssjstitle' => "'''تحذير:''' لا توجد واجهة \"\$1\".
-تذكر أن ملÙات ال.css Ùˆ ال.js تستخدم حرو٠صغيرة ÙÙŠ العنوان ØŒ كمثال {{ns:user}}:Foo/monobook.css Ùˆ ليس {{ns:user}}:Foo/Monobook.css.",
+تذكر أن ملÙات ال.css Ùˆ ال.js تستخدم حرو٠صغيرة ÙÙŠ العنوان ØŒ كمثال {{ns:user}}:Foo/vector.css Ùˆ ليس {{ns:user}}:Foo/Vector.css.",
'updated' => '(محدثة)',
'note' => "'''ملاحظة:'''",
'previewnote' => "'''تذكر أن هذه مجرد معاينة للصÙحة؛''''
@@ -1089,9 +1110,6 @@ $2',
إذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />
أنت تقر أيضا أنك كتبت هذا بنÙسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتÙاصيل).
'''لا تض٠أي عمل ذي حقوق محÙوظة بدون تصريح!'''",
-'longpagewarning' => "'''تحذير:''' حجم الصÙحة $1 كيلوبايت؛
-قد تواجه بعض المتصÙحات مشاكل عند تحرير صÙحات يزيد حجمها عن 32 كيلوبايت.
-يرجى تقسيم الصÙحة إلى أقسام أصغر.",
'longpageerror' => "'''خطأ: النص الذي أدخلته حجمه $1 كيلوبايت، وهذا أكبر من الحد الأقصى وهو $2 كيلوبايت.
لا يمكن Ø­Ùظه.'''",
'readonlywarning' => "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من Ø­Ùظ التعديلات التي قمت بها حاليا.
@@ -1272,6 +1290,8 @@ $1",
'logdelete-failure' => "'''تعذر ضبط رؤية السجل:'''
$1",
'revdel-restore' => 'تغيير الرؤية',
+'revdel-restore-deleted' => 'مراجعات محذوÙØ©',
+'revdel-restore-visible' => 'مراجعات مرئية',
'pagehist' => 'تاريخ الصÙحة',
'deletedhist' => 'التاريخ المحذوÙ',
'revdelete-content' => 'محتوى',
@@ -1342,11 +1362,13 @@ $1",
# Diffs
'history-title' => 'تاريخ مراجعة "$1"',
'difference' => '(الÙرق بين المراجعتين)',
+'difference-multipage' => '(الÙرق بين الصÙحتين)',
'lineno' => 'سطر $1:',
'compareselectedversions' => 'قارن بين النسختين المختارتين',
'showhideselectedversions' => 'أظهر/أخ٠المراجعات المختارة',
'editundo' => 'تراجع',
-'diff-multi' => '({{PLURAL:$1|مراجعة واحدة متوسطة|$1 مراجعة متوسطة}} غير معروضة.)',
+'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة|مراجعتان متوسطتان غير معروضتان|$1 مراجعات متوسطة غير معروضة|$1 مراجعة متوسطة غير معروضة}} أجراها {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
+'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
# Search results
'searchresults' => 'نتائج البحث',
@@ -1381,6 +1403,7 @@ $1",
'searchprofile-everything-tooltip' => 'ابحث ÙÙŠ كل المحتوى (شاملا صÙحات النقاش)',
'searchprofile-advanced-tooltip' => 'ابحث ÙÙŠ النطاقات المخصصة',
'search-result-size' => '$1 ({{PLURAL:$2|لا كلمات|كلمة واحدة|كلمتان|$2 كلمات|$2 كلمة}})',
+'search-result-category-size' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصاني٠Ùرعية|تصني٠Ùرعي واحد|تصنيÙان Ùرعيان|$2 تصنيÙات Ùرعية|$2 تصنيÙًا Ùرعيًا|$2 تصني٠Ùرعي}} Ùˆ{{PLURAL:$3|لا ملÙات|مل٠واحد|ملÙان|$3 ملÙات|$3 ملÙًا|$3 ملÙ}})',
'search-result-score' => 'الارتباط: $1%',
'search-redirect' => '(تحويلة $1)',
'search-section' => '(قسم $1)',
@@ -1458,6 +1481,7 @@ $1",
'contextlines' => 'عدد الأسطر ÙÙŠ كل نتيجة:',
'contextchars' => 'عدد الأحر٠ÙÙŠ كل سطر',
'stub-threshold' => 'الحد لتنسيق <a href="#" class="stub">وصلة البذرة</a>:',
+'stub-threshold-disabled' => 'معطل',
'recentchangesdays' => 'عدد الأيام المعروضة ÙÙŠ أحدث التغييرات:',
'recentchangesdays-max' => 'الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}',
'recentchangescount' => 'عدد التعديلات الظاهرة مبدئيا:',
@@ -1491,6 +1515,7 @@ $1",
'prefs-files' => 'ملÙات',
'prefs-custom-css' => 'CSS مخصص',
'prefs-custom-js' => 'جاÙاسكربت مخصص',
+'prefs-common-css-js' => 'CSS أو جاÙاسكربت مشتركة لجميع المظاهر:',
'prefs-reset-intro' => 'يمكنك استخدام هذه الصÙحة لإعادة تÙضيلاتك للحالة الاÙتراضية للموقع.
لن تستطيع استرجاع الحالة السابقة.',
'prefs-emailconfirm-label' => 'تأكيد البريد الإلكتروني:',
@@ -1529,9 +1554,15 @@ $1",
'prefs-advancedrendering' => 'خيارات متقدمة',
'prefs-advancedsearchoptions' => 'خيارات متقدمة',
'prefs-advancedwatchlist' => 'خيارات متقدمة',
-'prefs-display' => 'خيارات العرض',
+'prefs-displayrc' => 'خيارات العرض',
+'prefs-displaysearchoptions' => 'خصائص العرض',
+'prefs-displaywatchlist' => 'خصائص العرض',
'prefs-diffs' => 'Ùروقات',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
+'email-address-validity-invalid' => 'أدخل عنوان بريد إلكتروني صالح',
+
# User rights
'userrights' => 'إدارة صلاحيات المستخدم',
'userrights-lookup-user' => 'إدارة مجموعات المستخدم',
@@ -1615,6 +1646,7 @@ $1",
'right-hideuser' => 'منع اسم مستخدم، مخÙيا إياه عن العامة',
'right-ipblock-exempt' => 'تÙادي عمليات منع الأيبي، المنع التلقائي ومنع النطاق',
'right-proxyunbannable' => 'تÙادي عمليات المنع الأوتوماتيكية للبروكسيهات',
+'right-unblockself' => 'رÙع المنع عن أنÙسهم',
'right-protect' => 'تغيير مستويات الحماية وتعديل الصÙحات المحمية',
'right-editprotected' => 'تعديل الصÙحات المحمية (بدون الحماية المضمنة)',
'right-editinterface' => 'تعديل واجهة المستخدم',
@@ -1637,7 +1669,6 @@ $1",
'right-siteadmin' => 'غلق ورÙع غلق قاعدة البيانات',
'right-reset-passwords' => 'إعادة ضبط كلمة السر للمستخدمين الآخرين',
'right-override-export-depth' => 'تصدير الصÙحات متضمنة الصÙحات الموصولة حتى عمق 5',
-'right-versiondetail' => 'رؤية معلومات نسخة البرنامج الممتدة',
'right-sendemail' => 'إرسال رسائل بريد إلكتروني إلى مستخدمين آخرين',
# User rights log
@@ -1688,14 +1719,9 @@ $1",
'recentchanges-legend' => 'خيارات أحدث التغييرات',
'recentchangestext' => 'تابع آخر التغييرات ÙÙŠ الويكي من هذه الصÙحة.',
'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
-'recentchanges-label-legend' => 'المÙتاح: $1.',
-'recentchanges-legend-newpage' => '$1 - صÙحة جديدة',
'recentchanges-label-newpage' => 'أنشأ هذا التعديل صÙحة جديدة',
-'recentchanges-legend-minor' => '$1 - تعديل Ø·ÙÙŠÙ',
'recentchanges-label-minor' => 'هذا تعديل Ø·ÙÙŠÙ',
-'recentchanges-legend-bot' => '$1 - تعديل بوت',
'recentchanges-label-bot' => 'أجرى هذا التعديل بوت',
-'recentchanges-legend-unpatrolled' => '$1 - تعديل غير مراجع',
'recentchanges-label-unpatrolled' => 'لم يراجع هذا التعديل إلى الآن',
'rcnote' => "بالأسÙÙ„ {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} ÙÙŠ {{PLURAL:$2||'''اليوم''' الماضي|'''اليومين''' الماضيين|ال'''$2''' أيام الماضية|ال'''$2''' يوما الماضيا|ال'''$2''' يوم الماضي}}ØŒ كما ÙÙŠ $5ØŒ $4.",
'rcnotefrom' => "بالأسÙÙ„ التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
@@ -1743,6 +1769,9 @@ $1",
'upload_directory_missing' => 'مجلد الرÙع ($1) Ù…Ùقود ولم يمكن إنشاؤه بواسطة خادوم الوب.',
'upload_directory_read_only' => 'مجلد الرÙع ($1) لا يمكن الكتابة عليه بواسطة خادوم الوب.',
'uploaderror' => 'خطأ ÙÙŠ الرÙع',
+'upload-recreate-warning' => "'''تحذير: سبق حذ٠أو نقل مل٠بهذا الاسم.'''
+
+سجلا الحذ٠والنقل لهذه الصÙحة معروضان هنا للتيسير:",
'uploadtext' => "استخدم الاستمارة بالأسÙÙ„ لرÙع الملÙات.
لرؤية أو البحث ÙÙŠ الملÙات المرÙوعة سابقا، راجع [[Special:FileList|قائمة الملÙات المرÙوعة]]ØŒ عمليات الرÙع (وإعادة الرÙع) مسجلة ÙÙŠ [[Special:Log/upload|سجل الرÙع]] وعمليات الحذ٠ÙÙŠ [[Special:Log/delete|سجل الحذÙ]].
@@ -1778,6 +1807,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' ليس نوع مل٠مسموح به.
{{PLURAL:\$3|نوع المل٠المسموح به هو|أنواع الملÙات المسموح بها هي}} \$2.",
'filetype-missing' => 'المل٠بدون امتداد (مثل ".jpg").',
+'empty-file' => 'المل٠الذي أرسلته كان Ùارغا.',
+'file-too-large' => 'المل٠الذي أرسلته كان كبيرا جدا.',
+'filename-tooshort' => 'اسم المل٠قصير جدا.',
+'filetype-banned' => 'نوع المل٠هذا ممنوع.',
+'verification-error' => 'لم يجتز المل٠تحقق صحة الملÙات.',
+'hookaborted' => 'التعديل الذي تحاول أن تقوم به أجهض من قبل تمديد هوك',
+'illegal-filename' => 'لا يسمح باسم المل٠هذا.',
+'overwrite' => 'لا يسمح بالكتابة Ùوق مل٠موجود.',
+'unknown-error' => 'خطأ غير معرو٠حدث.',
+'tmp-create-error' => 'تعذر إنشاء مل٠مؤقت.',
+'tmp-write-error' => 'خطأ أثناء كتابة المل٠المؤقت.',
'large-file' => 'ينصح ألا تكون الملÙات أكبر من $1Ø› هذا المل٠حجمه $2.',
'largefileserver' => 'حجم هذا المل٠أكبر من المسموح به على هذا الخادوم.',
'emptyfile' => 'يبدو أن المل٠الذي رÙعته Ùارغ.
@@ -1806,13 +1846,14 @@ $1",
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'هذا المل٠مكرر {{PLURAL:$1|للملÙ|للملÙات}} التالية:',
'file-deleted-duplicate' => 'مل٠مطابق لهذه المل٠([[:$1]]) تم حذÙÙ‡ من قبل. ينبغي أن تتحقق من تاريخ الحذ٠لهذا المل٠قبل المتابعة بإعادة رÙعه.',
-'successfulupload' => 'تم رÙع المل٠بنجاح',
'uploadwarning' => 'تحذير الرÙع',
'uploadwarning-text' => 'من Ùضلك عدل وص٠المل٠أدناه وحاول مرة أخرى.',
'savefile' => 'احÙظ الملÙ',
'uploadedimage' => 'رÙع "[[$1]]"',
'overwroteimage' => 'رÙع نسخة جديدة من "[[$1]]"',
'uploaddisabled' => 'تم تعطيل الرÙع',
+'copyuploaddisabled' => 'الرÙع من مسار معطل.',
+'uploadfromurl-queued' => 'رÙعك قد أضي٠إلى الطابور',
'uploaddisabledtext' => 'رÙع الملÙات معطل.',
'php-uploaddisabledtext' => 'رÙع ملÙات PHP معطل. من Ùضلك تحقق من إعدادات رÙع الملÙات.',
'uploadscripted' => 'هذا المل٠يضم كود HTML أو كود آخر يمكن أن ÙŠÙسره متصÙØ­ الوب بطريقة خاطئة.',
@@ -1847,6 +1888,14 @@ JD # جينوبتيك
MGP # بينتاكس
PICT # متنوع
#</pre> <!-- اترك هذا السطر تماما كما هو -->',
+'upload-success-subj' => 'تم رÙع المل٠بنجاح',
+'upload-success-msg' => 'مرÙوعك من [$2] قد نجح، وهو متوÙر هنا: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'مشكلة رÙع',
+'upload-failure-msg' => 'توجد مشكلة ÙÙŠ مرÙوعك من [$2]:
+
+$1',
+'upload-warning-subj' => 'تحذير رÙع',
+'upload-warning-msg' => 'ثمة مشكلة ÙÙŠ مرÙوعك من [$2]. يمكنك الرجوع إلى [[Special:Upload/stash/$1|نموذج الرÙع]] لتصحيح المشكلة.',
'upload-proto-error' => 'بروتوكول غير صحيح',
'upload-proto-error-text' => 'الرÙع عن بعد يتطلب مسارا يبدأ بـ <code>http://</code> أو <code>ftp://</code>.',
@@ -1913,6 +1962,7 @@ PICT # متنوع
'listfiles_search_for' => 'ابحث عن اسم الميديا:',
'imgfile' => 'ملÙ',
'listfiles' => 'قائمة الملÙات',
+'listfiles_thumb' => 'تصغير',
'listfiles_date' => 'تاريخ',
'listfiles_name' => 'اسم',
'listfiles_user' => 'مستخدم',
@@ -1958,6 +2008,7 @@ PICT # متنوع
'shared-repo-from' => 'من $1',
'shared-repo' => 'مستودع مشترك',
'shared-repo-name-wikimediacommons' => 'ويكيميديا كومنز',
+'filepage.css' => '/* CSS المعروض هنا سيضمن ÙÙŠ صÙحات وص٠الملÙات، أيضا على الويكيات الأجنبية */',
# File reversion
'filerevert' => 'استرجع $1',
@@ -2029,8 +2080,8 @@ PICT # متنوع
'statistics-edits' => 'تعديلات الصÙحات منذ تنصيب {{SITENAME}}',
'statistics-edits-average' => 'متوسط التعديلات لكل صÙحة',
'statistics-views-total' => 'إجمالي المشاهدات',
+'statistics-views-total-desc' => 'مشاهدات الصÙحات غير الموجودة والصÙحات الخاصة غير مشمولة.',
'statistics-views-peredit' => 'المشاهدات لكل تعديل',
-'statistics-jobqueue' => 'طول [http://www.mediawiki.org/wiki/Manual:Job_queue طابور الشغل]',
'statistics-users' => '[[Special:ListUsers|مستخدمون]] مسجلون',
'statistics-users-active' => 'مستخدمون نشطون',
'statistics-users-active-desc' => 'المستخدمون الذين قاموا بÙعل ÙÙŠ آخر {{PLURAL:$1|يوم|$1 يوم}}',
@@ -2045,7 +2096,7 @@ PICT # متنوع
'doubleredirects' => 'تحويلات مزدوجة',
'doubleredirectstext' => 'هذه الصÙحة تعرض الصÙحات التي تحول إلى صÙحات تحويل أخرى.
كل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهد٠التحويلة الثانية، والذي عادة ما يشير إلى صÙحة الهد٠"الحقيقية"ØŒ التي من المÙترض أن تحول إليها التحويلة الأولى.
-المدخلات <s>المشطوبة</s> صححت.',
+المدخلات <del>المشطوبة</del> صححت.',
'double-redirect-fixed-move' => '[[$1]] تم نقلها، هي الآن تحويلة إلى [[$2]]',
'double-redirect-fixer' => 'مصلح التحويل',
@@ -2068,6 +2119,8 @@ PICT # متنوع
'nmembers' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}',
'nrevisions' => '{{PLURAL:$1|تعديل وحيد|تعديلان|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
'nviews' => '{{PLURAL:$1|مشاهدة واحدة|مشاهدتان|$1 مشاهدات|$1 مشاهدة}}',
+'nimagelinks' => 'مستخدم ÙÙŠ {{PLURAL:$1||صÙحة واحدة|صÙحتين|$1 صÙحات|$1 صÙحة}}',
+'ntransclusions' => 'مستخدم ÙÙŠ {{PLURAL:$1||صÙحة واحدة|صÙحتين|$1 صÙحات|$1 صÙحة}}',
'specialpage-empty' => 'لا توجد نتائج لهذا التقرير.',
'lonelypages' => 'صÙحات يتيمة',
'lonelypagestext' => 'الصÙحات التالية غير موصولة من أو مضمنة ÙÙŠ الصÙحات الأخرى ÙÙŠ {{SITENAME}}.',
@@ -2226,34 +2279,40 @@ PICT # متنوع
'listgrouprights-removegroup-self-all' => 'يمكنه إزالة كل المجموعات من حسابه الخاص',
# E-mail user
-'mailnologin' => 'لا يوجد عنوان للإرسال',
-'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح ÙÙŠ صÙحة [[Special:Preferences|التÙضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.',
-'emailuser' => 'إرسال رسالة لهذا المستخدم',
-'emailpage' => 'إرسال رسالة للمستخدم',
-'emailpagetext' => 'يمكنك استخدام الاستمارة بالأسÙÙ„ لإرسال رسالة بريد إلكتروني إلى هذا المستخدم.
+'mailnologin' => 'لا يوجد عنوان للإرسال',
+'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح ÙÙŠ صÙحة [[Special:Preferences|التÙضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.',
+'emailuser' => 'إرسال رسالة لهذا المستخدم',
+'emailpage' => 'إرسال رسالة للمستخدم',
+'emailpagetext' => 'يمكنك استخدام الاستمارة بالأسÙÙ„ لإرسال رسالة بريد إلكتروني إلى هذا المستخدم.
عنوان البريد الإلكتروني الذي قمت أنت بإدخاله ÙÙŠ [[Special:Preferences|تÙضيلاتك]]ØŒ سيظهر كعنوان المرسل ÙÙŠ البريد الإلكتروني، حتى يصبح المتلقي قادرا على الرد عليك مباشرة.',
-'usermailererror' => 'جسم البريد أرجع خطأ:',
-'defemailsubject' => 'رسالة من {{SITENAME}}',
-'noemailtitle' => 'لا يوجد عنوان بريد إلكتروني',
-'noemailtext' => 'لم يحدد هذا المستخدم عنوان بريد إلكتروني صحيح.',
-'nowikiemailtitle' => 'لا بريد إلكتروني مسموح به',
-'nowikiemailtext' => 'هذا المستخدم اختار ألا يستقبل البريد الإلكتروني من المستخدمين الآخرين.',
-'email-legend' => 'إرسال بريد إلكتروني إلى مستخدم {{SITENAME}} آخر',
-'emailfrom' => 'من:',
-'emailto' => 'إلى:',
-'emailsubject' => 'الموضوع:',
-'emailmessage' => 'الرسالة:',
-'emailsend' => 'أرسل',
-'emailccme' => 'أرسل لي بنسخة من رسالتي.',
-'emailccsubject' => 'نسخة من رسالتك إلى $1: $2',
-'emailsent' => 'تم إرسال البريد الإلكتروني',
-'emailsenttext' => 'تم إرسال رسالتك الإلكترونية.',
-'emailuserfooter' => 'هذا البريد الإلكتروني تم إرساله بواسطة $1 إلى $2 بواسطة وظيÙØ© "مراسلة المستخدم" ÙÙŠ {{SITENAME}}.',
+'usermailererror' => 'جسم البريد أرجع خطأ:',
+'defemailsubject' => 'رسالة من {{SITENAME}}',
+'usermaildisabled' => 'بريد المستخدم الإلكتروني معطل',
+'usermaildisabledtext' => 'لا يمكنك إرسال بريد إلكتروني إلى مستخدمين آخرين على هذه الويكي',
+'noemailtitle' => 'لا يوجد عنوان بريد إلكتروني',
+'noemailtext' => 'لم يحدد هذا المستخدم عنوان بريد إلكتروني صحيح.',
+'nowikiemailtitle' => 'لا بريد إلكتروني مسموح به',
+'nowikiemailtext' => 'هذا المستخدم اختار ألا يستقبل البريد الإلكتروني من المستخدمين الآخرين.',
+'email-legend' => 'إرسال بريد إلكتروني إلى مستخدم {{SITENAME}} آخر',
+'emailfrom' => 'من:',
+'emailto' => 'إلى:',
+'emailsubject' => 'الموضوع:',
+'emailmessage' => 'الرسالة:',
+'emailsend' => 'أرسل',
+'emailccme' => 'أرسل لي بنسخة من رسالتي.',
+'emailccsubject' => 'نسخة من رسالتك إلى $1: $2',
+'emailsent' => 'تم إرسال البريد الإلكتروني',
+'emailsenttext' => 'تم إرسال رسالتك الإلكترونية.',
+'emailuserfooter' => 'هذا البريد الإلكتروني تم إرساله بواسطة $1 إلى $2 بواسطة وظيÙØ© "مراسلة المستخدم" ÙÙŠ {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'ترك رسالة نظام.',
+'usermessage-editor' => 'مراسل النظام',
# Watchlist
'watchlist' => 'قائمة مراقبتي',
'mywatchlist' => 'قائمة مراقبتي',
-'watchlistfor' => "(Ù„'''$1''')",
+'watchlistfor2' => 'Ù„$1 $2',
'nowatchlist' => 'لا توجد مدخلات ÙÙŠ قائمة مراقبتك.',
'watchlistanontext' => 'الرجاء $1 لعرض أو تعديل الصÙحات ÙÙŠ قائمة مراقبتك.',
'watchnologin' => 'غير مسجل',
@@ -2295,32 +2354,32 @@ PICT # متنوع
'enotif_lastvisited' => 'انظر $1 لكل التغييرات منذ زيارتك الأخيرة.',
'enotif_lastdiff' => 'انظر $1 لرؤية هذا التغيير.',
'enotif_anon_editor' => 'مستخدم مجهول $1',
-'enotif_body' => 'عزيزي $WATCHINGUSERNAME،
-
-$CHANGEDORCREATED صÙحة $PAGETITLE ÙÙŠ {{SITENAME}} من قبل $PAGEEDITORØŒ لرؤية النسخة الحالية من الصÙحة راجع: $PAGETITLE_URL.
+'enotif_body' => 'عزيزي $ WATCHINGUSERNAMEE
+صÙحة $PAGETITLE قد $ CHANGEDORCREATEDÙÙŠ $PAGEEDITDATE ب$PAGEEDITOR, انظر$PAGETITLE_URL للمراجعة الحالية
+موجز للمحرر: $PAGESUMMARY $PAGEMINOREDIT
-$NEWPAGE
-ملخص تعديل المحرر: $PAGESUMMARY $PAGEMINOREDIT
+الاتصال بالمحرر:
+ البريد: $PAGEEDITOR_EMAIL
+ ويكي: $PAGEEDITOR_WIKI
-اتصل بالمحرر:
-عبر بريد إلكتروني: $PAGEEDITOR_EMAIL
-عبر الويكي: $PAGEEDITOR_WIKI
+لن يكون هناك لا إخطارات أخرى ÙÙŠ حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة هذه الصÙحة.
+يمكن أيضا تعيين إشارات الإعلام لجميع صÙحات شاهد على هيئة الرصد الخاصة بك.
-لن يكون هنالك أي إخطارات أخرى عن أية تغييرات تتم ÙÙŠ المستقبل إلا إذا زرت هذه الصÙحة.
-يمكنك أيضا أن تعيد تصÙير عداد الإخطارات لجميع الصÙحات التي تراقبها ÙÙŠ قائمة مراقبتك.
-
- نظام إخطار {{SITENAME}} الودود
+ {{SITENAME}} إعلام النظام الخاص بك ودية
--
-لتغيير إعدادات قائمة مراقبتك، اذهب إلى:
-{{fullurl:{{#special:Watchlist}}/edit}}
+لتغيير إعدادات إعلام البريد الإلكتروني الخاص بك، قم بزيارة
+{{fullurl: {{# الخاص: تÙضيلات}}}}
+
+لتغيير إعدادات الرصد الخاصة بك، قم بزيارة
+{{fullurl: {{# الخاص: الرصد}}/تحرير}}
-لحذ٠الصÙحة من قائمة مراقبتك، زر
-$UNWATCHURL
+لحذ٠الصÙحة من هيئة الرصد الخاصة بك، قم بزيارة
+$ أونواتشورل
-للاقتراحات وللحصول على مساعدة إضاÙية:
-{{fullurl:{{MediaWiki:Helppage}}}}',
+التغذية المرتدة، والحصول على مساعدة إضاÙية:
+{{fullurl: {{MediaWiki:Helppage}}}}',
# Delete
'deletepage' => 'حذ٠الصÙحة',
@@ -2374,7 +2433,10 @@ $UNWATCHURL
'revertpage-nouser' => 'استرجع التعديلات بواسطة (اسم المستخدم تمت إزالته) حتى آخر نسخة بواسطة [[User:$1|$1]]',
'rollback-success' => 'استرجع تعديلات $1؛
استرجع حتى آخر نسخة بواسطة $2.',
-'sessionfailure' => 'يبدو أنه هناك مشكلة ÙÙŠ هذه جلسة الدخول الخاصة بك؛
+
+# Edit tokens
+'sessionfailure-title' => 'Ùشل ÙÙŠ الجلسة',
+'sessionfailure' => 'يبدو أنه هناك مشكلة ÙÙŠ هذه جلسة الدخول الخاصة بك؛
لذلك Ùقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.
من Ùضلك اضغط على Ù…Ùتاح "رجوع" لتحميل الصÙحة التي جئت منها، ثم حاول مرة أخرى.',
@@ -2511,19 +2573,23 @@ $1',
'month' => 'من شهر (وأقدم):',
'year' => 'من سنة (وأقدم):',
-'sp-contributions-newbies' => 'اعرض مساهمات الحسابات الجديدة Ùقط',
-'sp-contributions-newbies-sub' => 'للحسابات الجديدة',
-'sp-contributions-newbies-title' => 'مساهمات المستخدم للحسابات الجديدة',
-'sp-contributions-blocklog' => 'سجل المنع',
-'sp-contributions-deleted' => 'مساهمات المستخدم المحذوÙØ©',
-'sp-contributions-logs' => 'سجلات',
-'sp-contributions-talk' => 'نقاش',
-'sp-contributions-userrights' => 'إدارة صلاحيات المستخدم',
-'sp-contributions-blocked-notice' => 'هذا المستخدم ممنوع حاليا.
+'sp-contributions-newbies' => 'اعرض مساهمات الحسابات الجديدة Ùقط',
+'sp-contributions-newbies-sub' => 'للحسابات الجديدة',
+'sp-contributions-newbies-title' => 'مساهمات المستخدم للحسابات الجديدة',
+'sp-contributions-blocklog' => 'سجل المنع',
+'sp-contributions-deleted' => 'مساهمات المستخدم المحذوÙØ©',
+'sp-contributions-uploads' => 'مرÙوعات',
+'sp-contributions-logs' => 'سجلات',
+'sp-contributions-talk' => 'نقاش',
+'sp-contributions-userrights' => 'إدارة صلاحيات المستخدم',
+'sp-contributions-blocked-notice' => 'هذا المستخدم ممنوع حاليا.
إن آخر مدخلة ÙÙŠ سجل المنع موجودة أدناه كمرجع:',
-'sp-contributions-search' => 'بحث عن مساهمات',
-'sp-contributions-username' => 'عنوان أيبي أو اسم مستخدم:',
-'sp-contributions-submit' => 'ابحث',
+'sp-contributions-blocked-notice-anon' => 'عنوان الأيبي هذا ممنوع حاليا.
+آخر مدخلة لسجل المنع معروضة هنا كمرجع:',
+'sp-contributions-search' => 'بحث عن مساهمات',
+'sp-contributions-username' => 'عنوان أيبي أو اسم مستخدم:',
+'sp-contributions-toponly' => 'أظهر أعلى المراجعات Ùقط',
+'sp-contributions-submit' => 'ابحث',
# What links here
'whatlinkshere' => 'ماذا يصل هنا',
@@ -2585,7 +2651,6 @@ $1',
'ipb-edit-dropdown' => 'عدل أسباب المنع',
'ipb-unblock-addr' => 'رÙع منع $1',
'ipb-unblock' => 'رÙع المنع عن مستخدم أو عنوان أيبي',
-'ipb-blocklist-addr' => 'عمليات المنع الموجودة ل$1',
'ipb-blocklist' => 'عرض حالات المنع الحالية',
'ipb-blocklist-contribs' => 'مساهمات $1',
'unblockip' => 'رÙع المنع عن المستخدم',
@@ -2662,6 +2727,8 @@ $1 ممنوع بالÙعل. هل تريد تغيير الإعدادات؟',
لا يمكنك إنشاء حساب.',
'cant-block-while-blocked' => 'أنت لا يمكنك منع المستخدمين الآخرين بينما أنت ممنوع.',
'cant-see-hidden-user' => 'المستخدم الذي تحاول منعه تم منعه مسبقا وإخÙائه. بما أنك لا تمتلك صلاحية إخÙاء المستخدم ØŒ لا يمكنك مشاهدة المنع أو تعديله.',
+'ipbblocked' => 'لا يمكنك منع أو رÙع منع مستخدمين آخرين لأنك ممنوع',
+'ipbnounblockself' => 'لا يسمح لك برÙع المنع عن Ù†Ùسك',
# Developer tools
'lockdb' => 'Ù‚ÙÙ„ قاعدة البيانات',
@@ -2699,6 +2766,18 @@ $1 ممنوع بالÙعل. هل تريد تغيير الإعدادات؟',
'''تحذير!'''
هذا قد يكون تغييرا كارثيا وغير متوقع لصÙحة مشهورة؛
من Ùضلك تأكد من Ùهم عواقب هذا قبل المتابعة.",
+'movepagetext-noredirectfixer' => "باستخدام الاستمارة بالأسÙÙ„ بإمكانك أن تغير اسم الصÙحة، وأن تنقل تاريخها للاسم الجديد.
+العنوان القديم سيصبح تحويلة للعنوان الجديد.
+يمكنك تحديث التحويلات التي تشير إلى العنوان الأصلي تلقائيا.
+لو اخترت ألا تÙعل، تأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]].
+أنت مسؤول عن التأكد من أن الوصلات تتصل مع بعضها بشكل مناسب.
+
+لاحظ أنه '''لن يتم''' نقل الصÙحة إذا كان هناك صÙحة بنÙس العنوان الجديد، إلا إذا كانت Ùارغة، أو تحويلة ولا تاريخ لها.
+هذا يعني أنك يمكنك استرجاع الصÙحة لمكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صÙحة موجودة.
+
+'''تحذير!'''
+هذا قد يكون تغييرا كارثيا وغير متوقع لصÙحة مشهورة؛
+من Ùضلك تأكد من Ùهم عواقب هذا قبل المتابعة",
'movepagetalktext' => "صÙحة النقاش المرÙقة سيتم نقلها كذلك، '''إلا ÙÙŠ حالة''':
* توجد صÙحة نقاش غير Ùارغة تحت العنوان الجديد، أو
* قمت بإزالة اختيار الصندوق بالأسÙÙ„.
@@ -2756,6 +2835,7 @@ $1 ممنوع بالÙعل. هل تريد تغيير الإعدادات؟',
'immobile-source-page' => 'هذه الصÙحة غير قابلة للنقل.',
'immobile-target-page' => 'غير قادر على النقل إلى العنوان الوجهة هذا.',
'imagenocrossnamespace' => 'لا يمكن نقل المل٠إلى نطاق غير نطاق الملÙات',
+'nonfile-cannot-move-to-file' => 'لا يمكن نقل غير الملÙات إلى نطاق الملÙات',
'imagetypemismatch' => 'امتداد المل٠الجديد لا يطابق نوعه',
'imageinvalidfilename' => 'اسم المل٠الهد٠غير صحيح',
'fix-double-redirects' => 'حدث أي تحويلات تشير إلى العنوان الأصلي',
@@ -2835,6 +2915,7 @@ $1 ممنوع بالÙعل. هل تريد تغيير الإعدادات؟',
'importstart' => 'استيراد صÙحات...',
'import-revision-count' => '{{PLURAL:$1|لا مراجعات|مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}',
'importnopages' => 'لا صÙحات للاستيراد',
+'imported-log-entries' => 'استورد {{PLURAL:$1||مدخلة سجل واحدة|مدخلتي سجل|$1 مدخلات سجل|$1 مدخل سجل}}.',
'importfailed' => 'Ùشل الاستيراد: <nowiki>$1</nowiki>',
'importunknownsource' => 'نوع مصدر استيراد مجهول',
'importcantopen' => 'لم يمكن Ùتح مل٠الاستيراد',
@@ -2931,6 +3012,8 @@ $1 ممنوع بالÙعل. هل تريد تغيير الإعدادات؟',
'tooltip-upload' => 'ابدأ الرÙع',
'tooltip-rollback' => '"استرجاع" تسترجع التعديل (التعديلات) ÙÙŠ هذه الصÙحة للمساهم الأخير بضغطة واحدة.',
'tooltip-undo' => '"رجوع" تسترجع هذا التعديل وتÙتح ناÙذة التعديل ÙÙŠ نمط العرض المسبق. تسمح بإضاÙØ© سبب ÙÙŠ الملخص.',
+'tooltip-preferences-save' => 'احÙظ التغييرات',
+'tooltip-summary' => 'أدخل ملخصا قصيرا',
# Stylesheets
'common.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */',
@@ -3062,14 +3145,17 @@ $1',
'imagemaxsize' => "حد حجم الصور:<br />''(لصÙحات وص٠الملÙات)''",
'thumbsize' => 'حجم العرض المصغر:',
'widthheightpage' => '$1×$2ØŒ $3 {{PLURAL:$3|صÙحة|صÙحة}}',
-'file-info' => '(حجم الملÙ: $1ØŒ نوع MIME: $2)',
-'file-info-size' => '($1 × $2 بكسل حجم الملÙ: $3ØŒ نوع MIME: $4)',
+'file-info' => 'حجم الملÙ: $1ØŒ نوع MIME: $2',
+'file-info-size' => '$1 × $2 بكسل حجم الملÙ: $3ØŒ نوع MIME: $4',
'file-nohires' => '<small>لا توجد دقة أعلى متوÙرة.</small>',
-'svg-long-desc' => '(مل٠SVGØŒ أبعاده $1 × $2 بكسل، حجم الملÙ: $3)',
+'svg-long-desc' => 'مل٠SVGØŒ أبعاده $1 × $2 بكسل، حجم الملÙ: $3',
'show-big-image' => 'دقة كاملة',
'show-big-image-thumb' => '<small>حجم هذا العرض: $1 × $2 بكسل</small>',
'file-info-gif-looped' => 'ملÙÙˆÙ',
'file-info-gif-frames' => '{{PLURAL:$1||إطار واحد|إطاران|$1 إطارات|$1 إطارا|$1 إطار}}',
+'file-info-png-looped' => 'ملÙÙˆÙ',
+'file-info-png-repeat' => 'عرضت {{PLURAL:$1||مرة واحدة|مرتين|$1 مرات|$1 مرة}}',
+'file-info-png-frames' => '{{PLURAL:$1||إطار واحد|إطاران|$1 إطارات|$1 إطارًا|$1 إطار}}',
# Special:NewFiles
'newimages' => 'معرض الملÙات الجديدة',
@@ -3166,9 +3252,9 @@ $1',
'exif-spectralsensitivity' => 'الحساسية الطيÙية',
'exif-isospeedratings' => 'تقييم سرعة أيزو',
'exif-oecf' => 'عامل التحويل الكهروضوئي',
-'exif-shutterspeedvalue' => 'سرعة الغالق',
-'exif-aperturevalue' => 'Ùتحة الغالق',
-'exif-brightnessvalue' => 'السطوع',
+'exif-shutterspeedvalue' => 'سرعة الغالق APEX',
+'exif-aperturevalue' => 'Ùتحة الغالق APEX',
+'exif-brightnessvalue' => 'سطوع APEX',
'exif-exposurebiasvalue' => 'تعويض التعرض',
'exif-maxaperturevalue' => 'أقصى غالق أرضي',
'exif-subjectdistance' => 'مساÙØ© الجسم',
@@ -3233,6 +3319,7 @@ $1',
'exif-gpsareainformation' => 'اسم مساحة GPS',
'exif-gpsdatestamp' => 'تاريخ GPS',
'exif-gpsdifferential' => 'تصحيح GPS التÙاضلي',
+'exif-objectname' => 'عنوان قصير',
# EXIF attributes
'exif-compression-1' => 'غير مضغوط',
@@ -3334,7 +3421,7 @@ $1',
'exif-sensingmethod-7' => 'مستشعر خطي ثلاثي',
'exif-sensingmethod-8' => 'مستشعر لون خطي متتابع',
-'exif-filesource-3' => 'دي إس سي',
+'exif-filesource-3' => 'كاميرا رقمية واقÙØ©',
'exif-scenetype-1' => 'صورة ملتقطة بشكل مباشر',
@@ -3412,31 +3499,31 @@ $1',
'limitall' => 'الكل',
# E-mail address confirmation
-'confirmemail' => 'تأكيد عنوان البريد الإلكتروني',
-'confirmemail_noemail' => 'ليس لديك عنوان بريد إلكتروني صحيح مسجل ÙÙŠ [[Special:Preferences|تÙضيلاتك]].',
-'confirmemail_text' => '{{SITENAME}} يتطلب تأكيد عنوانك الإلكتروني قبل استخدام خصائص البريد الإلكتروني.
+'confirmemail' => 'تأكيد عنوان البريد الإلكتروني',
+'confirmemail_noemail' => 'ليس لديك عنوان بريد إلكتروني صحيح مسجل ÙÙŠ [[Special:Preferences|تÙضيلاتك]].',
+'confirmemail_text' => '{{SITENAME}} يتطلب تأكيد عنوانك الإلكتروني قبل استخدام خصائص البريد الإلكتروني.
اضغط على زر التÙعيل بالأسÙÙ„ ليتم إرسال رسالة تأكيد لعنوانك.
ستتضمن الرسالة رمز تÙعيل؛
اضغط على الوصلة التي تحتوي الرمز لتأكيد أن عنوانك الإلكتروني صحيح.',
-'confirmemail_pending' => 'تم إرسال كود التأكيد بالÙعل من قبل إلى بريدك الإلكتروني؛
+'confirmemail_pending' => 'تم إرسال كود التأكيد بالÙعل من قبل إلى بريدك الإلكتروني؛
إذا كان حسابك قد تم عمله حالا، ربما يجب أن تنتظر بضع دقائق قبل طلبك لكود آخر.',
-'confirmemail_send' => 'أرسل كود تأكيد',
-'confirmemail_sent' => 'تم إرسال رسالة التأكيد، شكرا لك.',
-'confirmemail_oncreate' => 'تم إرسال كود تأكيد لعنوان بريدك الإلكتروني.
+'confirmemail_send' => 'أرسل كود تأكيد',
+'confirmemail_sent' => 'تم إرسال رسالة التأكيد، شكرا لك.',
+'confirmemail_oncreate' => 'تم إرسال كود تأكيد لعنوان بريدك الإلكتروني.
لا يشترط أن تستخدم الكود للدخول للموسوعة باسمك، ولكن يجب أن تقوم بإدخاله قبل استخدامك أيا من خواص البريد الإلكتروني المستخدمة هنا ÙÙŠ الويكي.',
-'confirmemail_sendfailed' => 'لم يتمكن {{SITENAME}} من إرسال رسالة التأكيد إليك.
+'confirmemail_sendfailed' => 'لم يتمكن {{SITENAME}} من إرسال رسالة التأكيد إليك.
من Ùضلك التمس عنوان بريدك الإلكتروني باحثا عن حرو٠غير صحيحة.
أرجع خادم البريد: $1',
-'confirmemail_invalid' => 'كود تأكيد غير صحيح.
+'confirmemail_invalid' => 'كود تأكيد غير صحيح.
ربما انتهت Ùترة صلاحيته.',
-'confirmemail_needlogin' => 'يجب عليك $1 لتأكيد بريدك الإلكتروني.',
-'confirmemail_success' => 'تم تأكيد بريدك الإلكتروني.
+'confirmemail_needlogin' => 'يجب عليك $1 لتأكيد بريدك الإلكتروني.',
+'confirmemail_success' => 'تم تأكيد بريدك الإلكتروني.
يمكنك الآن [[Special:UserLogin|الدخول]] والتمتع بالويكي.',
-'confirmemail_loggedin' => 'بريدك الإلكتروني تم تأكيده الآن.',
-'confirmemail_error' => 'ثمة شيء خطأ عند محاولة Ø­Ùظ تأكيدك.',
-'confirmemail_subject' => 'رسالة تأكيد البريد من {{SITENAME}}',
-'confirmemail_body' => 'شخص ما، من المحتمل أن يكون أنت، من عنوان الأيبي $1،
+'confirmemail_loggedin' => 'بريدك الإلكتروني تم تأكيده الآن.',
+'confirmemail_error' => 'ثمة شيء خطأ عند محاولة Ø­Ùظ تأكيدك.',
+'confirmemail_subject' => 'رسالة تأكيد البريد من {{SITENAME}}',
+'confirmemail_body' => 'شخص ما، من المحتمل أن يكون أنت، من عنوان الأيبي $1،
سجل حسابا "$2" بعنوان البريد الإلكتروني هذا ÙÙŠ {{SITENAME}}.
لتأكيد أن هذا الحساب ينتمي إليك Ùعلا وتÙعيل خواص البريد الإلكتروني ÙÙŠ {{SITENAME}}ØŒ اÙتح هذه الوصلة ÙÙŠ متصÙحك :
@@ -3449,8 +3536,38 @@ $3
$5
كود التÙعيل هذا سينتهي ÙÙŠ $4.',
-'confirmemail_invalidated' => 'تأكيد عنوان البريد الإلكتروني تم إلغاؤه',
-'invalidateemail' => 'إلغاء تأكيد البريد الإلكتروني',
+'confirmemail_body_changed' => 'شخص ما -من المحتمل أن يكون أنت- من عنوان الأيبي $1 غيّر عنوان البريد
+الإلكتروني للحساب "$2" إلى عنوان البريد الإلكتروني هذا ÙÙŠ
+{{SITENAME}}.
+
+لتأكيد أن هذا الحساب لك Ùعلا ولتÙعيل خواص البريد الإلكتروني ÙÙŠ
+{{SITENAME}}ØŒ اÙتح هذه الوصلة ÙÙŠ متصÙحك:
+
+$3
+
+إذا كان هذا الحساب *ليس* لك، اتبع هذه الوصلة لإلغاء تأكيد عنوان البريد
+الإلكتروني:
+
+$5
+
+سينتهي رمز التÙعيل هذا ÙÙŠ $4.',
+'confirmemail_body_set' => 'شخص ما -من المحتمل أن يكون أنت- من عنوان الأيبي $1 غيّر عنوان البريد
+الإلكتروني للحساب "$2" إلى عنوان البريد الإلكتروني هذا ÙÙŠ
+{{SITENAME}}.
+
+لتأكيد أن هذا الحساب لك Ùعلا ولتÙعيل خواص البريد الإلكتروني ÙÙŠ
+{{SITENAME}}ØŒ اÙتح هذه الوصلة ÙÙŠ متصÙحك:
+
+$3
+
+إذا كان هذا الحساب *ليس* لك، اتبع هذه الوصلة لإلغاء تأكيد عنوان البريد
+الإلكتروني:
+
+$5
+
+سينتهي رمز التÙعيل هذا ÙÙŠ $4.',
+'confirmemail_invalidated' => 'تأكيد عنوان البريد الإلكتروني تم إلغاؤه',
+'invalidateemail' => 'إلغاء تأكيد البريد الإلكتروني',
# Scary transclusion
'scarytranscludedisabled' => '[التضمين بالإنترويكي معطل]',
@@ -3496,6 +3613,7 @@ $1',
'table_pager_first' => 'الصÙحة الأولى',
'table_pager_last' => 'الصÙحة الأخيرة',
'table_pager_limit' => 'اعرض $1 مدخلة ÙÙŠ الصÙحة',
+'table_pager_limit_label' => 'العناصر لكل صÙحة:',
'table_pager_limit_submit' => 'اذهب',
'table_pager_empty' => 'لا نتائج',
@@ -3620,6 +3738,7 @@ $1',
'version-specialpages' => 'صÙحات خاصة',
'version-parserhooks' => 'خطاطي٠المحلل',
'version-variables' => 'المتغيرات',
+'version-skins' => 'واجهات',
'version-other' => 'أخرى',
'version-mediahandlers' => 'متحكمات الميديا',
'version-hooks' => 'الخطاطيÙ',
@@ -3632,6 +3751,13 @@ $1',
'version-version' => '(نسخة $1)',
'version-svn-revision' => '(&رلم;r$2)',
'version-license' => 'الرخصة',
+'version-poweredby-credits' => "تدار هذه الويكي ب'''[http://www.mediawiki.org/ ميدياويكي]''', حقوق النشر © 2001-$1 $2.",
+'version-poweredby-others' => 'آخرون',
+'version-license-info' => "ميدياويكي برنامج حر، يحق لك توزيعه Ùˆ/أو تعديله ÙˆÙقاً لبنود رخصة غنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (ÙˆÙقا لاختيارك أنت) أي إصدار لاحق.
+
+هذا البرنامج يوزع على أمل أن يكون Ù…Ùيداً، ولكن '''دون أية ضمانات'''ØŒ بما ÙÙŠ ذلك ضمانات '''التسويق''' أو '''الملاءمة لغرض معين'''. انظر رخصة غنو العمومية لمزيد من التÙاصيل.
+
+ينبغي أن تكون قد تلقيت نسخة من رخصة غنو العمومية إذا لم يتم ذلك، اكتب إلى: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA أو [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html اقرأ على الإنترنت].",
'version-software' => 'البرنامج المثبت',
'version-software-product' => 'المنتج',
'version-software-version' => 'النسخة',
@@ -3702,6 +3828,15 @@ $1',
'tags-edit' => 'عدل',
'tags-hitcount' => '$1 {{PLURAL:$1|تغيير|تغيير}}',
+# Special:ComparePages
+'comparepages' => 'قارن صÙحات',
+'compare-selector' => 'قارن مراجعات الصÙحة',
+'compare-page1' => 'صÙحة 1',
+'compare-page2' => 'صÙحة 2',
+'compare-rev1' => 'مراجعة 1',
+'compare-rev2' => 'مراجعة 2',
+'compare-submit' => 'قارن',
+
# Database error messages
'dberr-header' => 'هذا الويكي به مشكلة',
'dberr-problems' => 'عذرا! هذا الموقع يعاني من صعوبات تقنية.',
@@ -3718,8 +3853,13 @@ $1',
'htmlform-float-invalid' => 'القيمة التي حددتها ليست عددا.',
'htmlform-int-toolow' => 'القيمة التي حددتها أقل من الحد الأدنى وهو $1',
'htmlform-int-toohigh' => 'القيمة التي حددتها أكبر من الحد الأقصى وهو $1',
+'htmlform-required' => 'هذه القيمة مطلوبة',
'htmlform-submit' => 'أرسل',
'htmlform-reset' => 'الرجوع عن التغييرات',
'htmlform-selectorother-other' => 'أخرى',
+# SQLite database support
+'sqlite-has-fts' => '$1 بدعم البحث ÙÙŠ كامل النص',
+'sqlite-no-fts' => '$1 بدون دعم البحث ÙÙŠ كامل النص',
+
);
diff --git a/languages/messages/MessagesArc.php b/languages/messages/MessagesArc.php
index 40238ca9..05d8484f 100644
--- a/languages/messages/MessagesArc.php
+++ b/languages/messages/MessagesArc.php
@@ -14,6 +14,31 @@
* @author The Thadman
*/
+$namespaceNames = array(
+ NS_MEDIA => 'Ü¡ÜÜ•ÜÜ',
+ NS_SPECIAL => 'Ü•ÜܠܢÜÜ',
+ NS_MAIN => '',
+ NS_TALK => 'Ü¡Ü¡Ü Ü Ü',
+ NS_USER => 'ܡܦܠܚܢÜ',
+ NS_USER_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܡܦܠܚܢÜ',
+ NS_PROJECT_TALK => 'Ü¡Ü¡Ü Ü Ü_Ü•$1',
+ NS_FILE => 'ܠܦܦÜ',
+ NS_FILE_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܠܦܦÜ',
+ NS_MEDIAWIKI => 'Ü¡ÜÜ•ÜÜܘÜÜ©Ü',
+ NS_MEDIAWIKI_TALK => 'Ü¡Ü¡Ü Ü Ü_Ü•Ü¡ÜÜ•ÜÜܘÜÜ©Ü',
+ NS_TEMPLATE => 'Ü©Ü Ü’Ü',
+ NS_TEMPLATE_TALK => 'Ü¡Ü¡Ü Ü Ü_Ü•Ü©Ü Ü’Ü',
+ NS_HELP => 'ܥܘܕܪܢÜ',
+ NS_HELP_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܥܘܕܪܢÜ',
+ NS_CATEGORY => 'ܣܕܪÜ',
+ NS_CATEGORY_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܣܕܪÜ',
+);
+
+$namespaceAliases = array(
+ 'ܡܬܚܫܚܢÜ' => NS_USER,
+ 'Ü¡Ü¡Ü Ü Ü_ܕܡܬܚܫܚܢÜ' => NS_USER_TALK,
+);
+
$specialPageAliases = array(
'CreateAccount' => array( 'ܒܪÜ_ܚܘܫܒܢÜ' ),
'Preferences' => array( 'Ü“Ü’Üܬ̈Ü' ),
@@ -24,10 +49,11 @@ $specialPageAliases = array(
'Longpages' => array( 'ܦÜܬܬ̈Ü_Üܪ̈ÜܟܬÜ' ),
'Newpages' => array( 'ܦÜܬܬ̈Ü_ܚܕ̈ܬܬÜ' ),
'Protectedpages' => array( 'ܦÜܬܬ̈Ü_ܢܛÜܪ̈ܬÜ' ),
+ 'Protectedtitles' => array( 'ܟܘܢÜ̈Ü_ܢܛÜܪ̈Ü' ),
'Allpages' => array( 'ÜŸÜ _ܦÜܬܬ̈Ü' ),
'Specialpages' => array( 'ܦÜܬܬ̈Ü_ܕ̈ÜܠܢÜܬÜ' ),
'Contributions' => array( 'ܫܘܬܦܘÜܬ̈Ü' ),
- 'Whatlinkshere' => array( 'Ü¡Ü_Üܣܪ_Ü ÜŸÜ' ),
+ 'Whatlinkshere' => array( 'Ü¡Ü_Üܣܪ_ܠܗܪܟÜ' ),
'Movepage' => array( 'Ü«Ü¢Ü_ܦÜܬÜ' ),
'Categories' => array( 'ܣܕܪ̈Ü' ),
'Allmessages' => array( 'ÜŸÜ _Üܓܪ̈ܬÜ' ),
@@ -45,16 +71,25 @@ $magicWords = array(
'numberofarticles' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܡܠܘÜ̈Ü', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܠܦܦ̈Ü', 'NUMBEROFFILES' ),
'pagename' => array( '1', 'Ü«Ü¡Ü_ܕܦÜܬÜ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ܟܘܢÜÜ_ܕܦÜܬÜ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ܚܩܠÜ', 'NAMESPACE' ),
'msg' => array( '0', 'ÜܓܪܬÜ:', 'MSG:' ),
'img_thumbnail' => array( '1', 'ܙܥܘܪܬÜ', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'ܙܥܘܪܬÜ=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'ÜÜ¡ÜÜ¢Ü', 'right' ),
'img_left' => array( '1', 'ܣܡܠÜ', 'left' ),
- 'img_none' => array( '1', 'Ü Ü Ü¡Ü•Ü¡', 'none' ),
+ 'img_none' => array( '1', 'Ü Ü_Ü¡Ü•Ü¡', 'none' ),
'img_center' => array( '1', 'ܡܨܥÜ', 'center', 'centre' ),
- 'grammar' => array( '0', 'ܬܘܪܨ_Ü¡Ü¡Ü Ü Ü', 'GRAMMAR:' ),
+ 'img_page' => array( '1', 'ܦÜܬÜ=$1', 'ܦÜÜ¬Ü $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'ܬܚܘܡÜ', 'border' ),
+ 'img_baseline' => array( '1', 'ܣܪܛÜ_ܫܪܫÜÜ', 'baseline' ),
+ 'img_sub' => array( '1', 'ܦܪܥÜÜ', 'sub' ),
+ 'grammar' => array( '0', 'ܬܘܪܨ_Ü¡Ü¡Ü Ü Ü:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ܓܢܣÜ:', 'GENDER:' ),
'language' => array( '0', '#Ü Ü«Ü¢Ü:', '#LANGUAGE:' ),
'special' => array( '0', 'Ü•ÜܠܢÜÜ', 'special' ),
+ 'url_path' => array( '0', 'Ü«Ü’ÜÜ Ü', 'PATH' ),
+ 'url_wiki' => array( '0', 'ܘÜÜ©Ü', 'WIKI' ),
);
$rtl = true;
@@ -64,32 +99,12 @@ $defaultUserOptionOverrides = array(
'quickbar' => 2,
);
-$namespaceNames = array(
- NS_MEDIA => 'Ü¡ÜÜ•ÜÜ',
- NS_SPECIAL => 'Ü•ÜܠܢÜÜ',
- NS_MAIN => '',
- NS_TALK => 'Ü¡Ü¡Ü Ü Ü',
- NS_USER => 'ܡܬܚܫܚܢÜ',
- NS_USER_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܡܬܚܫܚܢÜ',
- NS_PROJECT_TALK => 'Ü¡Ü¡Ü Ü Ü_Ü•$1',
- NS_FILE => 'ܠܦܦÜ',
- NS_FILE_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܠܦܦÜ',
- NS_MEDIAWIKI => 'Ü¡ÜÜ•ÜÜܘÜÜ©Ü',
- NS_MEDIAWIKI_TALK => 'Ü¡Ü¡Ü Ü Ü_Ü•Ü¡ÜÜ•ÜÜܘÜÜ©Ü',
- NS_TEMPLATE => 'Ü©Ü Ü’Ü',
- NS_TEMPLATE_TALK => 'Ü¡Ü¡Ü Ü Ü_Ü•Ü©Ü Ü’Ü',
- NS_HELP => 'ܥܘܕܪܢÜ',
- NS_HELP_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܥܘܕܪܢÜ',
- NS_CATEGORY => 'ܣܕܪÜ',
- NS_CATEGORY_TALK => 'Ü¡Ü¡Ü Ü Ü_ܕܣܕܪÜ',
-);
-
$messages = array(
# User preference toggles
'tog-underline' => 'ܪܫܘܡ Ü£ÜªÜ›Ü Ü¬ÜšÜܬ ÜܣܘܪÜ:',
'tog-justify' => 'Ü«Ü˜Ü Ü¦Ü¬Ü“Ü¡ÌˆÜ',
'tog-hideminor' => 'Ü›Ü«Ü Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü™Ü¥Ü˜ÜªÌˆÜ Ü’Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü',
-'tog-rememberpassword' => 'ܕܟܘܪ Ü¥Ü Ü Ü¬Ü Ü¥Ü  ÜšÜ«Ü˜Ü’Ü¬Ü Ü—Ü•Ü',
+'tog-rememberpassword' => 'ܕܟܘܪ Ü¥Ü Ü Ü¬Ü Ü¥Ü  ܡܦÜÜ¬Ü¢Ü Ü—Ü¢Ü (Ü Ü¡Ü¬ÜšÜ Ü¥Ü ÜÜ Ü• $1 {{PLURAL:$1|ÜܘܡÜ|Üܘܡܬ̈Ü}})',
'tog-watchcreations' => 'Üܘܣܦ ܦÜÜ¬Ü¬ÌˆÜ Ü•Ü’ÜªÜ ÜÜ¢Ü Ü ÜªÌˆÜ—ÜܬÜ',
'tog-watchdefault' => 'Üܘܣܦ ܦÜÜ¬Ü¬ÌˆÜ Ü•Ü«ÜšÜ Ü¦ ÜÜ¢Ü Ü ÜªÌˆÜ—ÜܬÜ',
'tog-watchmoves' => 'Üܘܣܦ ܦÜÜ¬Ü¬ÌˆÜ Ü•Ü«Ü¢Ü ÜÜ¢Ü Ü ÜªÌˆÜ—ÜܬÜ',
@@ -192,30 +207,19 @@ $messages = array(
'faqpage' => 'Project:ܫܘÜÜ ÌˆÜ Ü¬Ü¢Ü̈Ü',
# Vector skin
-'vector-action-addsection' => 'Üܘܣܦ ܡܠܘÜÜ',
-'vector-action-delete' => 'ܫܘܦ',
-'vector-action-move' => 'Ü«Ü¢Ü',
-'vector-action-protect' => 'ܢܛܘܪ',
-'vector-action-undelete' => 'Ü Ü Ü«Ü˜Ü¦',
-'vector-action-unprotect' => 'Ü Ü Ü¢Ü›Ü˜Üª',
-'vector-namespace-category' => 'ܣܕܪÜ',
-'vector-namespace-help' => 'ܦÜÜ¬Ü Ü•Ü¥Ü˜Ü•ÜªÜ¢Ü',
-'vector-namespace-image' => 'ܠܦܦÜ',
-'vector-namespace-main' => 'ܦÜܬÜ',
-'vector-namespace-media' => 'ܦÜÜ¬Ü Ü•Ü¡ÜÜ•ÜÜ',
-'vector-namespace-mediawiki' => 'ÜܓܪܬÜ',
-'vector-namespace-project' => 'ܦÜÜ¬Ü Ü•Ü¬ÜªÜ¡ÜܬÜ',
-'vector-namespace-special' => 'ܦÜÜ¬Ü Ü•ÜܠܢÜܬÜ',
-'vector-namespace-talk' => 'Ü¡Ü¡Ü Ü Ü',
-'vector-namespace-template' => 'Ü©Ü Ü’Ü',
-'vector-namespace-user' => 'ܦÜÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
-'vector-view-create' => 'ܒܪÜ',
-'vector-view-edit' => 'ܫܚܠܦ',
-'vector-view-history' => 'ÜšÜ™Ü Ü¬Ü«Ü¥ÜܬÜ',
-'vector-view-view' => 'ܩܪÜ',
-'vector-view-viewsource' => 'ÜšÜ™Ü Ü¡Ü’Ü˜Ü¥Ü',
-'actions' => 'ܥܒܕ̈Ü',
-'namespaces' => 'ܚܩܠܬ̈Ü',
+'vector-action-addsection' => 'Üܘܣܦ ܡܠܘÜÜ',
+'vector-action-delete' => 'ܫܘܦ',
+'vector-action-move' => 'Ü«Ü¢Ü',
+'vector-action-protect' => 'ܢܛܘܪ',
+'vector-action-undelete' => 'Ü Ü Ü«Ü˜Ü¦',
+'vector-action-unprotect' => 'Ü Ü Ü¢Ü›Ü˜Üª',
+'vector-view-create' => 'ܒܪÜ',
+'vector-view-edit' => 'ܫܚܠܦ',
+'vector-view-history' => 'ÜšÜ™Ü Ü¬Ü«Ü¥ÜܬÜ',
+'vector-view-view' => 'ܩܪÜ',
+'vector-view-viewsource' => 'ÜšÜ™Ü Ü¡Ü’Ü˜Ü¥Ü',
+'actions' => 'ܥܒܕ̈Ü',
+'namespaces' => 'ܚܩܠܬ̈Ü',
'errorpagetitle' => 'ܦܘܕÜ',
'returnto' => 'ܕܥܘܪ ܠ$1.',
@@ -270,6 +274,7 @@ $messages = array(
'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' => 'ܡܢܘ {{SITENAME}}',
@@ -351,7 +356,7 @@ $messages = array(
'yourname' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
'yourpassword' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü:',
'yourpasswordagain' => 'ܟܬܘܒ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢Ü¬Ü ÜܚܪܬÜ:',
-'remembermypassword' => 'ܕܟܘܪ Ü¥Ü Ü Ü¬Ü Ü¥Ü  ÜšÜ«Ü˜Ü’Ü¬Ü Ü—Ü•Ü',
+'remembermypassword' => 'ܕܟܘܪ Ü¥Ü Ü Ü¬Ü Ü¥Ü  ܡܦÜÜ¬Ü¢Ü Ü—Ü¢Ü (Ü Ü¡Ü¬ÜšÜ Ü¥Ü ÜÜ Ü• $1 {{PLURAL:$1|ÜܘܡÜ|Üܘܡܬ̈Ü}})',
'login' => 'ܥܘܠ',
'nav-login-createaccount' => 'ܥܘܠ / Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢Ü',
'loginprompt' => 'ÜÜ Ü¨Ü Ü Ü¡Ü¦ÜÜ¬Ü¢Ü Ü•ÜÜ ÜŸ ܕܣܡܟ ܠܩܘܩÜÜ™ (cookies) Ü Ü¥Ü Ü Ü¬Ü Ü  {{SITENAME}}.',
@@ -366,6 +371,7 @@ $messages = array(
'gotaccount' => "ÜÜܬ Ü ÜŸ ܚܘܫܒܢÜØŸ '''$1'''.",
'gotaccountlink' => 'ܥܘܠ',
'createaccountmail' => 'Ü’ÜÜ• Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
+'createaccountreason' => 'ܥܠܬÜ',
'badretype' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü ÜŸÜ¬Ü’Ü¬ Üܢܬ Ü Ü ÜܘÜܢܬÜ.',
'userexists' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü«Ü©ÜÜ Ü.
Ü“Ü’Ü Ü«Ü¡Ü ÜܚܪܢÜ.',
@@ -419,6 +425,7 @@ $messages = array(
'showdiff' => 'ÜšÜ˜Ü Ü«Ü˜ÜšÜ Ü¦ÌˆÜ',
'anoneditwarning' => "'''ܙܘܗܪÜ:''' Ü Ü ÜÜܬÜÜŸ ܥܠÜÜ Ü.
ÜÜ Ü¦Ü (IP) Ü•ÜÜ ÜŸ ܢܬܟܬܒ ܒܬܫܥÜÜ¬Ü Ü•Ü¦ÜܬÜ.",
+'anonpreviewwarning' => '"Ü Ü ÜÜܬÜÜŸ ܥܠÜÜ Ü. ÜÜ¢ Ü Ü’ÜŸ ܦÜÜ¬Ü Üܢܬ ÜÜ Ü¦Ü (IP) Ü•ÜÜ ÜŸ ܢܬܟܬܒ ܒܬܫܥÜÜ¬Ü Ü•Ü«Ü˜ÜšÜ Ü¦Ü Ü•Ü¦ÜܬÜ."',
'summary-preview' => 'ÜšÜÜªÜ Ü©Ü•Ü¡ÜÜ Ü•Ü¦Ü£ÜÜ©Ü¬ÌˆÜ :',
'blockedtitle' => 'Ü¡Ü¦Ü ÜšÜ¢Ü Ü—Ü˜ ܡܚܪܡÜ',
'blockednoreason' => 'Ü Üܬ Ü¥Ü Ü¬Ü ÜÜ—ÜܒܬÜ',
@@ -496,6 +503,8 @@ $messages = array(
'revdelete-radio-unset' => 'Ü Ü',
'revdelete-log' => 'ܥܠܬÜ:',
'revdel-restore' => 'ܫܚܠܦ ܚܙÜܬÜ',
+'revdel-restore-deleted' => 'ܬܢÜÜ¬ÌˆÜ Ü«Üܦ̈Ü',
+'revdel-restore-visible' => 'ܬܢÜÜ¬ÌˆÜ Ü¡Ü¬ÜšÜ™ÜÜ¢Üܬ̈Ü',
'pagehist' => 'ܬܫܥÜÜ¬Ü Ü•Ü¦ÜܬÜ',
'deletedhist' => 'ܬܫܥÜÜ¬Ü Ü«ÜܦܬÜ',
'revdelete-content' => 'ܚܒÜܫܬ̈Ü',
@@ -531,6 +540,8 @@ $messages = array(
'compareselectedversions' => 'ܦܚܘܡ Ü’Üܬ ܬܪÜÜ¢ ܬܢÜÜ¬ÌˆÜ Ü“Ü’Üܬ̈Ü',
'showhideselectedversions' => 'ܚܘÜ/Ü›Ü«Ü Ü¬Ü¢ÜÜ¬ÌˆÜ Ü“Ü’Üܬ̈Ü',
'editundo' => 'Ü Ü Ü¬Ü¥Ü’Ü•',
+'diff-multi' => '({{PLURAL:$1|ÜšÜ•Ü Ü¬Ü¢ÜÜ¬Ü Ü¡Ü¨Ü¥ÜܬÜ|$1 ܬܢÜÜ¬ÌˆÜ Ü¡Ü¨Ü¥Üܬ̈Ü}} Ü’ÜÜ• {{PLURAL:$2|ܚܕ Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü Ü“Ü ÜܚܬÜ|$2 Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü Ü Ü“Ü Üܚܬ̈Ü}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|One ÜšÜ•Ü Ü¬Ü¢ÜÜ¬Ü Ü¡Ü¨Ü¥ÜܬÜ|$1 ܬܢÜÜ¬ÌˆÜ Ü¡Ü¨Ü¥Üܬ̈Ü}} Ü’ÜÜ• ÜܬÜܪ Ü¡Ü¢ $2 {{PLURAL:$2|ܚܕ Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü Ü“Ü ÜܚܬÜ|Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü Ü Ü“Ü Üܚܬ̈Ü}})',
# Search results
'searchresults' => 'Ü¦Ü Ü›ÌˆÜ Ü•Ü’Ü˜Ü¨ÜÜ',
@@ -655,7 +666,7 @@ $messages = array(
'prefs-advancedrendering' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü¡Ü¬Ü©Ü•ÌˆÜ¡Ü¢Ü',
'prefs-advancedsearchoptions' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü¡Ü¬Ü©Ü•ÌˆÜ¡Ü¢Ü',
'prefs-advancedwatchlist' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü¡Ü¬Ü©Ü•ÌˆÜ¡Ü¢Ü',
-'prefs-display' => 'ÜšÜ˜Ü Ü“Ü’Üܬ̈Ü',
+'prefs-displayrc' => 'ÜšÜ˜Ü Ü“Ü’Üܬ̈Ü',
'prefs-diffs' => 'ܦܪ̈ÜܫܘÜܬÜ',
# User rights
@@ -736,34 +747,30 @@ $messages = array(
'action-userrights' => 'Ü«ÜšÜ Ü¦Ü¬Ü Ü•ÜŸÜ  Ü™Ü•ÌˆÜ©Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|ܫܘܚܠܦÜ|ܫܘܚܠܦ̈Ü}}',
-'recentchanges' => 'Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü',
-'recentchanges-legend' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü•Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü',
-'recentchangestext' => 'ܥܩܒ Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•Ü¬ Ü¡Ü¢ ÜŸÜ  ܕܘÜÜ©Ü Ü’Ü¦ÜÜ¬Ü Ü—Ü•Ü.',
-'recentchanges-label-legend' => 'Ü©Ü ÜÜ•Ü: $1.',
-'recentchanges-legend-newpage' => '$1 - ܦÜÜ¬Ü ÜšÜ•Ü¬Ü',
-'recentchanges-label-newpage' => 'Ü«Ü˜ÜšÜ Ü¦Ü Ü—Ü¢Ü Ü’ÜªÜ Ü¦ÜÜ¬Ü ÜšÜ•Ü¬Ü',
-'recentchanges-legend-minor' => '$1 - Ü«Ü˜ÜšÜ Ü¦Ü Ü™Ü¥Ü˜ÜªÜ',
-'recentchanges-label-minor' => 'Ü—Ü¢Ü Ü—Ü˜ Ü«Ü˜ÜšÜ Ü¦Ü Ü™Ü¥Ü˜ÜªÜ',
-'recentchanges-legend-bot' => '$1 - Ü«Ü˜ÜšÜ Ü¦Ü Ü•Ü’Ü˜Ü¬ (bot)',
-'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ Ü—Ü¢Ü Ü«Ü˜ÜšÜ Ü¦Ü',
-'rclistfrom' => 'ÜšÜ˜Ü Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü Ü¡Ü¢ $1',
-'rcshowhideminor' => '$1 Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü™Ü¥Ü˜ÜªÌˆÜ',
-'rcshowhidebots' => '$1 Ü’Ü˜Ü¬ÌˆÜ (Bots)',
-'rcshowhideliu' => '$1 Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü¥Ü Üܠ̈Ü',
-'rcshowhideanons' => '$1 Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü',
-'rcshowhidemine' => '$1 ܫܘܚܠܦ̈Ü',
-'rclinks' => 'ÜšÜ˜Ü $1 Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Üܚܪ̈ÜÜ Ü’ $2 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜܬÜ<br />$3',
-'diff' => 'ܦܪÜܫܘܬÜ',
-'hist' => 'ܬܫܥÜܬÜ',
-'hide' => 'ܛܫÜ',
-'show' => 'ܚܘÜ',
-'minoreditletter' => 'Ü™',
-'newpageletter' => 'Üš',
-'boteditletter' => 'Ü’',
-'newsectionsummary' => '/* $1 */ Ü¡Ü¢Ü¬Ü ÜšÜ•Ü¬Ü',
-'rc-enhanced-expand' => 'ÜšÜ˜Ü Üܪ̈ÜÜŸÜ¬Ü (Ü’Ü¥Ü Ü ÜŸ JavaScript)',
-'rc-enhanced-hide' => 'Ü›Ü«Ü Üܪ̈ÜܟܬÜ',
+'nchanges' => '$1 {{PLURAL:$1|ܫܘܚܠܦÜ|ܫܘܚܠܦ̈Ü}}',
+'recentchanges' => 'Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü',
+'recentchanges-legend' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü•Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü',
+'recentchangestext' => 'ܥܩܒ Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•Ü¬ Ü¡Ü¢ ÜŸÜ  ܕܘÜÜ©Ü Ü’Ü¦ÜÜ¬Ü Ü—Ü•Ü.',
+'recentchanges-label-newpage' => 'Ü«Ü˜ÜšÜ Ü¦Ü Ü—Ü¢Ü Ü’ÜªÜ Ü¦ÜÜ¬Ü ÜšÜ•Ü¬Ü',
+'recentchanges-label-minor' => 'Ü—Ü¢Ü Ü—Ü˜ Ü«Ü˜ÜšÜ Ü¦Ü Ü™Ü¥Ü˜ÜªÜ',
+'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ Ü—Ü¢Ü Ü«Ü˜ÜšÜ Ü¦Ü',
+'rclistfrom' => 'ÜšÜ˜Ü Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü Ü¡Ü¢ $1',
+'rcshowhideminor' => '$1 Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü™Ü¥Ü˜ÜªÌˆÜ',
+'rcshowhidebots' => '$1 Ü’Ü˜Ü¬ÌˆÜ (Bots)',
+'rcshowhideliu' => '$1 Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü¥Ü Üܠ̈Ü',
+'rcshowhideanons' => '$1 Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü',
+'rcshowhidemine' => '$1 ܫܘܚܠܦ̈Ü',
+'rclinks' => 'ÜšÜ˜Ü $1 Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Üܚܪ̈ÜÜ Ü’ $2 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜÜ<br />$3',
+'diff' => 'ܦܪÜܫܘܬÜ',
+'hist' => 'ܬܫܥÜܬÜ',
+'hide' => 'ܛܫÜ',
+'show' => 'ܚܘÜ',
+'minoreditletter' => 'Ü™',
+'newpageletter' => 'Üš',
+'boteditletter' => 'Ü’',
+'newsectionsummary' => '/* $1 */ Ü¡Ü¢Ü¬Ü ÜšÜ•Ü¬Ü',
+'rc-enhanced-expand' => 'ÜšÜ˜Ü Üܪ̈ÜÜŸÜ¬Ü (Ü’Ü¥Ü Ü ÜŸ JavaScript)',
+'rc-enhanced-hide' => 'Ü›Ü«Ü Üܪ̈ÜܟܬÜ',
# Recent changes linked
'recentchangeslinked' => 'Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•ÌˆÜ¡ÜÜ',
@@ -796,6 +803,12 @@ $messages = array(
'upload-description' => 'Ü«Ü˜Ü¡Ü—Ü Ü•Ü Ü¦Ü¦Ü',
'upload-options' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü•ÜÜ£Ü©Ü¬Ü Ü•Ü Ü¦Ü¦Ü',
'watchthisupload' => 'ÜªÜ—Ü Ü—Ü¢Ü Ü Ü¦Ü¦Ü',
+'upload-success-subj' => 'Ü Ü¦Ü¦Ü Üܣܩܬ ܢܨÜÜšÜÜܬ',
+'upload-failure-subj' => 'Ü©Ü›ÜªÜ Ü’ÜÜ£Ü©Ü¬Ü Ü•Ü Ü¦Ü¦Ü',
+'upload-failure-msg' => 'ÜÜܬ Ü—Ü˜Ü Ü©Ü›ÜªÜ Ü’Ü Ü¦Ü¦Ü Ü•Üܣܩܬ Ü¡Ü¢ [$2]:
+
+$1',
+'upload-warning-subj' => 'Ü™Ü˜Ü—ÜªÜ Ü¥Ü  ÜÜ£Ü©Ü¬Ü Ü•Ü Ü¦Ü¦Ü',
'upload-proto-error' => 'ܦܪܘܛܘܩܘܠ Ü Ü Ü¬ÜªÜܨÜ',
'upload-file-error' => 'Ü¦Ü˜Ü•Ü Ü“Ü˜ÜÜ',
@@ -815,6 +828,7 @@ $messages = array(
# Special:ListFiles
'imgfile' => 'ܠܦܦÜ',
'listfiles' => 'Ü¡ÜŸÜ¬Ü’Ü˜Ü¬Ü Ü•Ü Ü¦Ü¦ÌˆÜ',
+'listfiles_thumb' => 'ܙܘܥܪÜ',
'listfiles_date' => 'Ü£ÜܩܘܡÜ',
'listfiles_name' => 'Ü«Ü¡Ü',
'listfiles_user' => 'ܡܦܠܚܢÜ',
@@ -993,7 +1007,7 @@ $messages = array(
# Special:ActiveUsers
'activeusers' => 'Ü¡ÜŸÜ¬Ü’Ü˜Ü¬Ü Ü•Ü—Ü•ÌˆÜ¡Ü ÜŸÜ«Üܪ̈Ü',
-'activeusers-count' => '$1 {{PLURAL:$1|Ü«Ü˜ÜšÜ Ü¦Ü ÜšÜ•Ü¬Ü|Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü}} Ü’ {{PLURAL:$3|ÜÜ˜Ü¡Ü ÜܚܪÜÜ|$3 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜܬÜ}}',
+'activeusers-count' => '$1 {{PLURAL:$1|Ü«Ü˜ÜšÜ Ü¦Ü ÜšÜ•Ü¬Ü|Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü}} Ü’ {{PLURAL:$3|ÜÜ˜Ü¡Ü ÜܚܪÜÜ|$3 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜÜ}}',
'activeusers-from' => 'ÜšÜ˜Ü Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü•Ü«ÜªÜ Ü¥Ü¡:',
'activeusers-hidebots' => 'Ü›Ü«Ü Ü’Ü˜Ü¬ÌˆÜ (bots)',
'activeusers-hidesysops' => 'Ü›Ü«Ü Ü¡Ü•Ü’ÜªÌˆÜ¢Ü',
@@ -1034,10 +1048,14 @@ $messages = array(
'emailccsubject' => 'Ü¨ÜšÜšÜ Ü•Üܓܪܬܟ Ü  $1: $2',
'emailsent' => 'Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Üܫܬܕܪ',
+# User Messenger
+'usermessage-summary' => 'Ü«Ü’Ü©Ü ÜÜ“ÜªÜ¬Ü Ü•Ü›ÜŸÜ£Ü',
+'usermessage-editor' => 'Ü¡Ü«Ü•ÜªÜ¢Ü Ü•Ü›ÜŸÜ£Ü',
+
# Watchlist
'watchlist' => 'ܪ̈ܗÜܬÜ',
'mywatchlist' => 'ܪ̈ܗÜܬÜ',
-'watchlistfor' => "(Ü '''$1''')",
+'watchlistfor2' => 'Ü  $1 $2',
'nowatchlist' => 'Ü Üܬ Ü ÜŸ Ü¡Ü•Ü¡ ܒܪ̈ܗÜÜ¬Ü Ü•ÜÜ ÜŸ',
'watchnologin' => 'Ü ÜܬÜÜŸ ܥܠÜÜ Ü',
'addedwatch' => 'Üܘܣܦ ܠܪ̈ܗÜܬÜ',
@@ -1047,7 +1065,7 @@ $messages = array(
'watchthispage' => 'ÜªÜ—Ü Ü—Ü•Ü Ü¦ÜܬÜ',
'unwatch' => 'Ü Ü ÜªÜ—Ü',
'unwatchthispage' => 'ÜŸÜ Ü ÜªÜ—ÜÜ',
-'wlshowlast' => 'ÜšÜ˜Ü $1 Ü«Ü¥Ü¬ÌˆÜ $2 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜÜ¬Ü $3',
+'wlshowlast' => 'ÜšÜ˜Ü $1 Ü«Ü¥Ü¬ÌˆÜ $2 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜÜ $3',
'watchlist-options' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü•ÜªÌˆÜ—ÜܬÜ',
# Displayed when you click the "watch" button and it is in the process of watching
@@ -1084,6 +1102,9 @@ $messages = array(
'rollbacklink' => 'ÜܦܢÜ',
'editcomment' => "ܦܣÜÜ©Ü¬ÌˆÜ Ü•Ü«Ü˜ÜšÜ Ü¦Ü Ü—Ü˜Ü: \"''\$1''\".",
+# Edit tokens
+'sessionfailure-title' => 'Ü¡Ü˜Ü¬Ü’Ü Ü Ü Ü¢Ü¨ÜšÜ¬',
+
# Protect
'protectlogpage' => 'Ü£Ü“Ü Ü Ü•Ü¢Ü›ÜªÜ',
'protectedarticle' => 'ܢܛÜÜªÜ "[[$1]]"',
@@ -1297,12 +1318,6 @@ Do you want to change the settings?',
'import-logentry-upload-detail' => '$1 {{PLURAL:$1|ܬܢÜÜ¬Ü |ܬܢÜܬ̈Ü}}',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ܬܢÜÜ¬Ü |ܬܢÜܬ̈Ü}} Ü¡Ü¢ $2',
-# Tooltip help for the actions
-'tooltip-pt-userpage' => '',
-'tooltip-pt-mytalk' => '',
-'tooltip-search' => 'Search {{SITENAME}}',
-'tooltip-t-print' => 'Printable version of this page',
-
# Attribution
'anonymous' => '{{PLURAL:$1|Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü|Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü Ü Üܕ̈ÜÜ¥Ü}} Ü• {{SITENAME}}',
'siteuser' => '{{SITENAME}} Ü¡Ü¦Ü ÜšÜ¢Ü $1',
@@ -1338,6 +1353,7 @@ $1',
# Media information
'thumbsize' => 'Ü¥Ü“ÜªÜ Ü•Ü¨Ü˜ÜªÜ¬Ü Ü™Ü¥Ü˜ÜªÜ¬Ü:',
+'file-info' => 'Ü¥Ü“ÜªÜ Ü•Ü Ü¦Ü¦Ü: $1, MIME ÜÜ•Ü«Ü: $2',
'file-nohires' => '<small>Ü Üܬ Ü¢Ü©Ü•Ü˜Ü¬Ü ÜܬÜܪ Ü¡Ü¢ Ü—Ü¢Ü.</small>',
'show-big-image' => 'Ü¢Ü©Ü•Ü˜Ü¬Ü Ü“Ü¡ÜܪܬÜ',
@@ -1448,6 +1464,7 @@ $1',
'table_pager_prev' => 'ܦÜÜ¬Ü Ü©Ü•ÜܡܬÜ',
'table_pager_first' => 'ܦÜÜ¬Ü Ü©Ü•Ü¡ÜܬÜ',
'table_pager_last' => 'ܦÜÜ¬Ü ÜܚܪÜܬÜ',
+'table_pager_limit_label' => 'Ü¡Ü•Ü¡ Ü ÜŸÜ  ܕܦÜ:',
'table_pager_limit_submit' => 'ܙܠ',
'table_pager_empty' => 'Ü Üܬ ܦܠܛ̈Ü',
@@ -1472,6 +1489,7 @@ $1',
'version-specialpages' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü•ÌˆÜܠܢÜܬÜ',
'version-other' => 'ÜܚܪܢÜ',
'version-version' => '(Ü¨ÜšÜšÜ $1)',
+'version-poweredby-others' => 'Üܚܪ̈ܢÜ',
'version-software-version' => 'ܨܚܚÜ',
# Special:FilePath
@@ -1504,6 +1522,13 @@ $1',
'tags-edit' => 'ܫܚܠܦ',
'tags-hitcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦÜ|ܫܘܚܠܦ̈Ü}}',
+# Special:ComparePages
+'compare-page1' => 'Ü•Ü¦Ü 1',
+'compare-page2' => 'Ü•Ü¦Ü 2',
+'compare-rev1' => 'ܬܢÜÜ¬Ü 1',
+'compare-rev2' => 'ܬܢÜÜ¬Ü 2',
+'compare-submit' => 'ܦܚܘܡ',
+
# HTML forms
'htmlform-submit' => 'ܫܕܪ',
'htmlform-reset' => 'Ü Ü Ü¬Ü¥Ü’Ü• ܫܘܚܠܦ̈Ü',
diff --git a/languages/messages/MessagesArn.php b/languages/messages/MessagesArn.php
index ebd350f0..e6257b38 100644
--- a/languages/messages/MessagesArn.php
+++ b/languages/messages/MessagesArn.php
@@ -96,15 +96,11 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-delete' => 'Ñamümün',
-'vector-namespace-main' => 'Pakina',
-'vector-namespace-mediawiki' => 'Yefalzugu',
-'vector-namespace-talk' => 'Nvxamkawvn',
-'vector-namespace-user' => 'Kellufe',
-'vector-view-create' => 'Zewmape',
-'vector-view-edit' => 'Pepikan',
-'vector-view-history' => 'Pegelpe rupañmael',
-'vector-view-view' => 'Chillkatun',
+'vector-action-delete' => 'Ñamümün',
+'vector-view-create' => 'Zewmape',
+'vector-view-edit' => 'Pepikan',
+'vector-view-history' => 'Pegelpe rupañmael',
+'vector-view-view' => 'Chillkatun',
'returnto' => 'Amutun $1 püle.',
'tagline' => '{{SITENAME}} mew',
@@ -302,8 +298,6 @@ $messages = array(
'action-undelete' => 'Namümlay tüfachi pakina',
# Recent changes
-'recentchanges-legend-newpage' => '$1 - We Pakina',
-'recentchanges-legend-minor' => '$1 pichi wirin',
'rcshowhideminor' => '$1 pichi wirin',
'rcshowhidemine' => '$1 tañi wirin',
'hist' => 'rupañ',
@@ -388,7 +382,6 @@ $messages = array(
'emailsend' => 'Werkün',
# Watchlist
-'watchlistfor' => "('''$1''')",
'watchnologin' => 'Petu konlaymi',
'watch' => 'Llaytun',
'watchthispage' => 'Llaytun tüfachi pakina',
diff --git a/languages/messages/MessagesAry.php b/languages/messages/MessagesAry.php
new file mode 100644
index 00000000..3468cb77
--- /dev/null
+++ b/languages/messages/MessagesAry.php
@@ -0,0 +1,2099 @@
+<?php
+/** Moroccan Spoken Arabic (Maġribi)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Daoudata
+ * @author Enzoreg
+ * @author MassNssen
+ * @author Zanatos
+ */
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Ṣetter l-lyanaṫ:',
+'tog-highlightbroken' => 'L-Lyanaṫ le ṣefḫaṫ li ma mojodinċ ka iṫ\'afiċaw <a href="" class="new">ḫomer</a> (ola : bḫal haka<a href="" class="internal">?</a>)',
+'tog-justify' => 'Jusṫifyé l-paragrafaṫ',
+'tog-hideminor' => 'Ĥebbi ṫ-ṫeÄdilaṫ l-leĥĥrin',
+'tog-hidepatrolled' => 'Ĥebbi ṫ-ṫeÄdilaṫ l-mraqbin fe ṫ-ṫeÄdilaṫ l-leĥĥrin',
+'tog-newpageshidepatrolled' => 'Ĥebbi ṣ-ṣefḫaṫ l-mraqbin men ṣ-ṣefḫaṫ j-jdad',
+'tog-extendwatchlist' => 'Kebber l-lista dyal s-suivi baċ bano ṫ-ṫeġyiraṫ kamlin, maċi ġir l-leĥĥrin.',
+'tog-usenewrc' => 'SṫeÄmel ṫ-ṫeÄ¡yiraṫ l-leĥĥrin l-mezyanin (kayḫṫaj JavaScript)',
+'tog-numberheadings' => 'Nemra otomaṫikiya dyal l-Äanawin',
+'tog-showtoolbar' => 'Werri l-barra dyal ṫ-ṫeÄdilaṫ (kayḫṫaj JavaScript)',
+'tog-editondblclick' => 'Baċ ṫṣayeb ṣ-ṣefḫa ĥaṣek ṫbrek 2 merraṫ (kayḫṫaj JavaScript)',
+'tog-editsection' => 'Aktivé ṫ-ṫeÄdilaṫ dyal s-seksyon be l-lyanaṫ « [Äœeddel] »',
+'tog-editsectiononrightclick' => 'BaÄ‹ ṫbeddel l-Äonwan dyal Ä‹i seksyon brek Älih be l-imniya (kayḫṫaj JavaScript)',
+'tog-showtoc' => 'biyn lfahras dyal lmohtawayat (bnisba lsafahat li ktr mn 3 dlaanawin)',
+'tog-rememberpassword' => 'Äœqel Äla smiyṫi fe had l-ordinaṫør (Ä¡ir limoddaṫ {{PLURAL:$1|yom waḫed|$1 iyyam}})',
+'tog-watchcreations' => 'zid sfahi li nchatha f qaaimat lmoraqaba',
+'tog-watchdefault' => 'zid sfahi li adltha f qaaimat lmoraqaba',
+'tog-watchmoves' => 'zid sfahi li bdlt blasstha f qaaimat lmoraqaba',
+'tog-watchdeletion' => 'zid sfahi li mshtha f qaaimat lmoraqaba',
+'tog-minordefault' => 'alm jmia tadilat tafifa iftiradiyan',
+'tog-previewontop' => 'biyn laard lmosbaq qbl sndoq thrir',
+'tog-previewonfirst' => 'Ůbiyn moaayana maa awal tadil',
+'tog-nocache' => 'attl takhzin lmotassafih lsfha',
+'tog-enotifwatchlistpages' => 'sift liya barid electroni ila tbdlat chi sfha f qaaimat lmoraqaba diali',
+'tog-enotifusertalkpages' => 'sift liya rissala electronia ila tbdlat sfht niqach dyali',
+'tog-enotifminoredits' => 'sift liya risala electronia hta bnisba ltadilat tafifa',
+'tog-enotifrevealaddr' => 'biyn lbarid lelectroni dyali f halat rassaail laikhtar',
+'tog-shownumberswatching' => 'biyn aadad lmostakhdimin lmoraqibin',
+'tog-oldsig' => 'moaayana litawqia lmawjod',
+'tog-fancysig' => 'aaml nass bhal nass wiki (bla wsla otomatikia)',
+'tog-externaleditor' => 'stakhdm moharrir khariji iftiradiyan(faqat lilkhobaraa, kaybghi iaadadat khassa f lordinator dyalk)',
+'tog-externaldiff' => 'stakhdm farq khariji iftiradiyan(faqat lilkhobaraa, kaybghi iaadadat khassa f lordinator dyalk)',
+'tog-showjumplinks' => 'mkkn wassalat "sir l" lmossaaida',
+'tog-uselivepreview' => 'staml listiarad saria (khasso javascipt) (tjribi)',
+'tog-forceeditsummary' => 'nbhni ila kandkhl molkhass taadil khawi',
+'tog-watchlisthideown' => 'khbi tadilat dyali mn qaaimat lmoraqaba',
+'tog-watchlisthidebots' => 'khbi tadilat lbot mn qaaimat lmoraqaba',
+'tog-watchlisthideminor' => 'khbi tadilat tafifa mn qaaimat lmoraqaba',
+'tog-watchlisthideliu' => 'khbi tadilat lmostkhdimin lmsjlin mn qaaimat lmoraqaba',
+'tog-watchlisthideanons' => 'khbi taadilat lmostkhdimin lmjholin mn qaaimat lmoraqaba',
+'tog-watchlisthidepatrolled' => 'khbi tadilat lmorajaaa mn qaaimat lmoraqaba',
+'tog-nolangconversion' => 'attl thwil lahajat',
+'tog-ccmeonemails' => 'sift liya noskha mn rasaail lbarid lelectroni likansiftha lmostkhdimin lkhrin',
+'tog-diffonly' => 'matbiynch mohtawa sfha tht lforoqat',
+'tog-showhiddencats' => 'biyn tsnifat lmkhfiya',
+'tog-noconvertlink' => 'aattl thwil anwan lwslat',
+'tog-norollbackdiff' => 'hiyd lfrq ila drt istirjaa',
+
+'underline-always' => 'Dima',
+'underline-never' => 'Abadan',
+'underline-default' => 'reglage dyal lmotassafih',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'namat lkht dyal mintaqat thrir',
+'editfont-default' => 'reglage dyal lmotasafih',
+'editfont-monospace' => 'Ä¥tt tabit lÄ¡ará¸',
+'editfont-sansserif' => 'Ä¥tt ba ziyada',
+'editfont-serif' => 'kht bzwayd',
+
+# Dates
+'sunday' => 'L-Ḫed',
+'monday' => 'Ṫ-Ṫnin',
+'tuesday' => 'Ṫ-Ṫlaṫ',
+'wednesday' => 'L-ArbeÄ',
+'thursday' => 'L-Ĥmis',
+'friday' => 'J-JemÄa',
+'saturday' => 'S-Sebṫ',
+'sun' => 'Ḫed',
+'mon' => 'Ṫnin',
+'tue' => 'Ṫlaṫ',
+'wed' => 'ArbeÄ',
+'thu' => 'Ĥmis',
+'fri' => 'JemÄa',
+'sat' => 'Sebṫ',
+'january' => 'Yanayer',
+'february' => 'Febrayer',
+'march' => 'Mars',
+'april' => 'Abril',
+'may_long' => 'May',
+'june' => 'Yonyo',
+'july' => 'Yolyoz',
+'august' => 'Ġoċṫ',
+'september' => 'Ċoṫanbir',
+'october' => 'Okṫober',
+'november' => 'Nowanbir',
+'december' => 'Dojanbir',
+'january-gen' => 'Yanayer',
+'february-gen' => 'Febrayer',
+'march-gen' => 'Mars',
+'april-gen' => 'Abril',
+'may-gen' => 'May',
+'june-gen' => 'Yonyo',
+'july-gen' => 'Yolyoz',
+'august-gen' => 'Ġoċṫ',
+'september-gen' => 'Ċoṫambir',
+'october-gen' => 'Okṫober',
+'november-gen' => 'Nowanbir',
+'december-gen' => 'Dojanbir',
+'jan' => 'Yan',
+'feb' => 'Feb',
+'mar' => 'Mar',
+'apr' => 'Abr',
+'may' => 'May',
+'jun' => 'Yon',
+'jul' => 'Yol',
+'aug' => 'Ġoċ',
+'sep' => 'Ċoṫ',
+'oct' => 'Okṫ',
+'nov' => 'Now',
+'dec' => 'Doj',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Katégori|Katégoryaṫ}}',
+'category_header' => 'ṣ-ṣefḫaṫ fe l-katégori "$1"',
+'subcategories' => 'L-katégoriyaṫ ṫ-ṫeḫṫaniya',
+'category-media-header' => 'L-fiċyé mulṫimédya li kaynin fe l-katégori "$1"',
+'category-empty' => '" Had l-katégori ma fiha ḫṫa ċi ṣefḫa ola fiċyé mulṫimédya. "',
+'hidden-categories' => '{{PLURAL:$1|Katégori mĥebya|Katégoryaṫ mĥebyin}}',
+'hidden-category-category' => 'Katégoryaṫ mĥebyin',
+'category-subcat-count' => 'Had l-katégori fiha {{PLURAL:$2|l-katégori l-ferÄiya|$2 katégoryaṫ ferÄiyin, menhom {{PLURAL:$1|hadi|$1}}}} li l-ṫeḫṫ.',
+'category-subcat-count-limited' => 'Had l-katégori fiha {{PLURAL:$1|l-katégori l-ferÄiya|$1 katégoryaṫ ferÄiyin}} l-ṫeḫṫ.',
+'category-article-count' => "Had l-katégori fiha {{PLURAL:$2|had 'ṣ-ṣefḫa|$2 ṣefḫaṫ, menhom {{PLURAL:$1|hadi|$1}} li l-ṫeḫṫ}}.",
+'category-article-count-limited' => "{{PLURAL:$1|Had 'ṣ-ṣefḫa kayna|Had $1 dyal 'ṣ-ṣefḫaṫ kaynin}} fe had l-katégori.",
+'category-file-count' => 'Had l-katégori fiha {{PLURAL:$2|had l-fiċyé|$2 fiċyé, menhom {{PLURAL:$1|hada|$1}} li l-ṫeḫṫ}}.',
+'category-file-count-limited' => '{{PLURAL:$1|Had l-fiċyé kayen|Had $1 dyal l-fiċyé kaynin}} fe had l-katégori.',
+'listingcontinuesabbrev' => 'L-Kmala',
+'index-category' => 'sfahi mfhrssa',
+'noindex-category' => 'shat mamfhtsach',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'mainpagetext' => "'''MediaWiki ṫ'instala be najaḫ.'''",
+'mainpagedocfooter' => 'Ila bÄ¡iṫiw meÄlomaṫ Ä¥rin baÄ‹ ṫesṫeÄmlo had l-lojisyél siro Ä‹ofo [http://meta.wikimedia.org/wiki/Aide:Contenu Gid dyal l-mosṫeÄ¥dim]
+
+== L-bdaya mÄa MediaWiki ==
+* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]
+* [http://www.mediawiki.org/wiki/Manual:FAQ/fr FAQ fe MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ Äla versyonaṫ jdad dyal MediaWiki]',
+
+'about' => 'ala',
+'article' => 'sfht mohtawa',
+'newwindow' => '(kayṫḫell fe ċerjem weḫdaĥor)',
+'cancel' => 'Bettel',
+'moredotdotdot' => 'Kṫer...',
+'mypage' => "'Ṣ-Ṣefḫa dyali",
+'mytalk' => 'Ṣefḫa dyal n-niqaċ',
+'anontalk' => "hdr maa had l'ip",
+'navigation' => 'Navigasyon',
+'and' => '&#32;o',
+
+# Cologne Blue skin
+'qbfind' => 'Lqa',
+'qbbrowse' => 'Qeleb',
+'qbedit' => 'Äœedel',
+'qbpageoptions' => "Had 'ṣ-ṣefḫa",
+'qbpageinfo' => 'L-Meá¸mon',
+'qbmyoptions' => "'Ṣ-Ṣefḫaṫ dyawli",
+'qbspecialpages' => 'Ṣefḫaṫ ĥaṣṣin',
+'faq' => 'asaila kaytaawdo bzaf',
+'faqpage' => 'Project:asaila kaytaawdo',
+
+# Vector skin
+'vector-action-addsection' => 'Zid topic',
+'vector-action-delete' => 'Suprimi',
+'vector-action-move' => 'Neqel',
+'vector-action-protect' => 'Ḫami',
+'vector-action-undelete' => 'rja lhadf',
+'vector-action-unprotect' => 'Ḫiyed l-ḫimaya',
+'vector-view-create' => 'ĤṫareÄ',
+'vector-view-edit' => 'Äœedel',
+'vector-view-history' => 'Ṫariĥ l-fiċyé',
+'vector-view-view' => 'Qra',
+'vector-view-viewsource' => 'ÄŠof l-masdar',
+'actions' => 'afaal',
+'namespaces' => 'Maḫel s-smiyyaṫ :',
+'variants' => 'lhja:',
+
+'errorpagetitle' => "Ĥata'",
+'returnto' => 'RjeÄ le $1',
+'tagline' => 'Men',
+'help' => 'MosaÄada',
+'search' => 'Qelleb',
+'searchbutton' => 'Qelleb',
+'go' => 'Sir',
+'searcharticle' => 'Sir',
+'history' => 'Ṫariĥ ṣ-ṣefḫa',
+'history_short' => 'Historik',
+'updatedmarker' => 'tam thditha ala akhir ziyara liya',
+'info_short' => 'maalomat',
+'printableversion' => 'Vérsyon imkenliha ṫṫetbeÄ',
+'permalink' => 'Lyan dayem',
+'print' => 'TbeÄ',
+'edit' => 'á¹¢ayeb',
+'create' => 'ĤṫareÄ',
+'editthispage' => 'Ĝeddel had ṣ-ṣefḫa',
+'create-this-page' => "ĤṫareÄ had 'á¹£-á¹£efḫa",
+'delete' => 'Mḫi',
+'deletethispage' => "Suprimi had 'ṣ-ṣefḫa",
+'undelete_short' => 'strjaa {{PLURAL:$1|wahd taadil|$1 taadil}}',
+'protect' => 'Ḫami',
+'protect_change' => 'Beddel',
+'protectthispage' => "Ḫmi had 's-sefḫa",
+'unprotect' => 'Ḫiyed l-ḫimaya',
+'unprotectthispage' => 'Ḫiyd lḫimaya Äla had sfha',
+'newpage' => 'Ṣefḫa jdida',
+'talkpage' => "Ṫnaqeċ fe had 'ṣ-ṣefḫa",
+'talkpagelinktext' => 'Ṫnaqeċ',
+'specialpage' => 'Ṣefḫa ĥaṣa',
+'personaltools' => 'Adawaṫ ċeĥṣiya',
+'postcomment' => 'Seksyon jdida',
+'articlepage' => 'Ċof l-li fe ṣ-ṣefḫa',
+'talk' => 'Modakara',
+'views' => 'Afiċaj',
+'toolbox' => "Ṣendoq l-'adawaṫ",
+'userpage' => 'Ċof ṣ-ṣefḫa de l-mosṫeĥdim',
+'projectpage' => 'Ċof ṣ-ṣefḫa de lmchroa',
+'imagepage' => 'ċof ṣ-ṣefḫa dyal l-fiċyé',
+'mediawikipage' => 'Ċof ṣ-ṣefḫa de risala',
+'templatepage' => 'Ċof ṣ-ṣefḫa de l-modele',
+'viewhelppage' => 'Ċof ṣ-ṣefḫa de l-mosaaada',
+'categorypage' => 'Ċof l-katégori dyal ṣ-ṣefḫa',
+'viewtalkpage' => 'ÄŠof tadakor',
+'otherlanguages' => 'Be loġaṫ ĥrin',
+'redirectedfrom' => '(Ṫḫowwlaṫ men $1)',
+'redirectpagesub' => 'Ṣefḫa dyal ṫ-ṫeḫwil',
+'lastmodifiedat' => 'L-merra l-leĥĥra li ṫsaybaṫ fiha had á¹£-á¹£efḫa kaneṫ fe nhar $1, mÄa $2.',
+'viewcount' => 'had sfha tchaft {{PLURAL:$1|wa7d lmrra|$1 mrra}}.',
+'protectedpage' => 'Ṣefḫa mhmiya',
+'jumpto' => 'Sir le:',
+'jumptonavigation' => 'Navigasyon',
+'jumptosearch' => 'Qelleb',
+'view-pool-error' => 'smh lina serveurat ayana
+bzzaf dlmostakhdimin bghaw iwslo lhad sfha
+aafak hawl mn ba3d wahd chwiya
+
+$1',
+'pool-timeout' => 'Daz l-weqṫ faċ konṫi kaṫṫsenna z-zeqron',
+'pool-queuefull' => 'á¹¢eff l-Ä¥edma Äamá¹›a',
+'pool-errorunknown' => 'khata mjhol',
+
+# 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' => 'KolÄ‹i Äla {{SITENAME}}',
+'aboutpage' => 'Project:MeÄlomaṫ',
+'copyright' => 'L-moḫṫawa mojod fe $1',
+'copyrightpage' => '{{ns:project}}:Copyrights',
+'currentevents' => 'laahdath ljariya',
+'currentevents-url' => 'Project:ahdat jariya',
+'disclaimers' => 'Iná¸araṫ',
+'disclaimerpage' => 'Project:Iná¸araṫ Äammin',
+'edithelp' => 'MosaÄada',
+'edithelppage' => 'Help:Kifaċ tṣayeb ċi ṣ-ṣefḫa',
+'helppage' => 'Help:Meá¸mon',
+'mainpage' => 'Ṣ-Ṣefḫa l-owla',
+'mainpage-description' => 'Ṣ-Ṣefḫa l-owla',
+'policy-url' => 'Project:siyassa',
+'portal' => 'bwabt lmojtamaaa',
+'portal-url' => 'Project:bwabt lmojtamaaa',
+'privacy' => 'Siyasa ĥoṣoṣiya',
+'privacypage' => 'Project:Siyasa ĥoṣoṣiya',
+
+'badaccess' => 'Ġalat fe s-smaḫ',
+'badaccess-group0' => 'mamsmohch lik tdkhl had ttbiq li bghiti',
+'badaccess-groups' => 'had laction lli tlbtih msmoh ghir lmostkhdimin li kaynin f {{PLURAL:$2|group|wahd mn had les group}}: $1.',
+
+'versionrequired' => 'khassak version $1 dial mediawiki',
+'versionrequiredtext' => 'noskha $1 dyal mediawiki mtloba bach tstaaml had sfha
+chof [[Special:Version|sfht lversion]]',
+
+'ok' => 'Waĥĥa',
+'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'retrievedfrom' => 'MrejjÄa men "$1"',
+'youhavenewmessages' => 'Äœendek $1 ($2).',
+'newmessageslink' => 'méṣajaṫ jdad',
+'newmessagesdifflink' => 'ṫ-ṫeġyir l-leĥĥer',
+'youhavenewmessagesmulti' => 'Jawek méṣajaṫ jdad fe $1',
+'editsection' => 'á¹¢ayeb',
+'editsection-brackets' => '[$1]',
+'editold' => 'á¹£ayeb',
+'viewsourceold' => 'ÄŠof l-masdar',
+'editlink' => 'á¹£ayeb',
+'viewsourcelink' => 'ÄŠof l-Äin',
+'editsectionhint' => 'Ṣayeb s-séksyon : $1',
+'toc' => 'L-Meá¸mon',
+'showtoc' => 'Werri',
+'hidetoc' => 'Ḫebbi',
+'thisisdeleted' => 'nÄŠof onstarjaa $1?',
+'viewdeleted' => 'nchof $1?',
+'restorelink' => '{{PLURAL:$1|wahd taadil tmsh|$1 taadilat tmshat}}',
+'feedlinks' => 'tlqim:',
+'feed-invalid' => 'nawaa ichtirak tlqim khata',
+'feed-unavailable' => 'tlqimat makaynach',
+'site-rss-feed' => 'L-flu RSS dyal $1',
+'site-atom-feed' => 'Flu Atom dyal $1',
+'page-rss-feed' => 'L-Flu RSS dyal $1',
+'page-atom-feed' => 'L-Flu Atom dyal "$1"',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
+'red-link-title' => '$1 (ṣefḫa ma kaynaċ)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Ṣefḫa',
+'nstab-user' => 'Ṣ-Ṣefḫa dyal l-mosṫeĥdim',
+'nstab-media' => 'sfha dyal media',
+'nstab-special' => 'Ṣefḫa ĥaṣṣa',
+'nstab-project' => 'á¹¢efḫa dyal meÄ‹roÄ',
+'nstab-image' => 'Fiċyé',
+'nstab-mediawiki' => 'risala',
+'nstab-template' => 'Modél',
+'nstab-help' => 'sfhat lmosaaada',
+'nstab-category' => 'Katégori',
+
+# Main script and global functions
+'nosuchaction' => 'makaynch fiaal bhal hada',
+'nosuchactiontext' => 'lfial li tlbti mashihch
+imkn ghltti flktba dyal ladresse
+hadchi imkn kadalik ichir lchi khataaa f {{SITENAME}}',
+'nosuchspecialpage' => 'makaynach sfha bhad smiya',
+'nospecialpagetext' => '<strong>tlbti sfha khassa makaynach</strong>
+lista dyal safahat lkhassa ghatlgaha f [[Special:SpecialPages|{{int:specialpages}}]]',
+
+# General errors
+'error' => "Ĥata'",
+'databaseerror' => 'khataaa f qaaaidat lbayanat',
+'dberrortext' => 'khata fsight amr qaaaidat lbayanat
+hadchi iqdr ikon raja lchi khataa f lbrnamaj
+akhir amr dyal qaaidat lbayanat kan
+<blockquote><tt>$1</tt></blockquote>
+dakhl had dalla "<tt>$2</tt>".
+qaaidat lbayant rddat bhad lkhataa "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'wqÄ waḫd lmoÄ‹kil f siÄ¡t istiÄlam qaÄidat lbayanat
+
+aÄ¥ir talab istiÄlam qaÄidat lbayanat kan
+
+"$1"
+
+li hwa mn daĥl ddala "$2".
+
+qaÄidat lbayanat rjÄat lÄ¥ata\' "$3: $4"',
+'laggedslavemode' => "'''attansyo''' sfḫa iqdr mafihach aĥir tḫditaṫ",
+'readonly' => 'qaÄidat lbayanat msdoda',
+'enterlockreason' => 'dĥl sabab lli ĥllak tsdha, okadalik lwaqt li momkin thll bqdha',
+'missing-article' => 'Ma ṫṫelqaċ n-neṣ dyal ċi ṣefḫa l-li kanṫ ĥaṣṣha ṫṫelqa, smiyṫha "$1" $2.
+
+Äœomoman had Ä‹-Ä‹i kay-iwqeÄ faÄ‹ kaṫ-ṫbeÄ Ä‹i lyan le waḫed d-diff l-li daz Älih l-weqṫ ola le l-historik dyal Ä‹i á¹£efḫa memḫiya.
+
+Ila ma kanṫċ, imken ikon ċi bog fe l-program.
+Äœafak Älem [[Special:ListUsers/sysop|l-adminisṫrator]] bla ma ṫnsa ma ṫÄtih l-Äonwan dyal l-lyan.',
+'missingarticle-rev' => '(n-nemra dyal l-vérsyon : $1)',
+'missingarticle-diff' => '(lfarq: $1, $2)',
+'internalerror' => 'khataaa dakhili',
+'internalerror_info' => 'khataaa dakhili : $1',
+'fileappenderrorread' => 'manqdroch nqraw "$1" atna\' lidafa.',
+'fileappenderror' => 'maymknch ncopie had lfichier "$1" l hada "$2".',
+'filecopyerror' => 'maymknch ncopie had lfichier "$1" l hada "$2".',
+'filerenameerror' => 'maymknch nsmiw had lfichier "$1" l hada "$2".',
+'filedeleteerror' => 'maymknch had lfichier "$1" itmsh .',
+'directorycreateerror' => 'maymknch had lmojllad itnchaa "$1".',
+'filenotfound' => 'maymknch nlgaw had lfichier"$1".',
+'unexpected' => 'qima mamtwqaach: "$1"="$2".',
+'formerror' => "khata':listimara matqdrch tnfd",
+'badarticleerror' => 'mamyknch tdir had lfiil ala had sfha',
+'badtitle' => 'aanwan mamzyanch',
+'badtitletext' => 'L-Äœonwan li tlebṫi Ä¡alet, Ä¥awi, ola waqila hada Äonwan fe bezzaf de l-loÄ¡aṫ ola fe bezzaf de l-maÄ‹ariÄ. Imken ikon fih Ä‹i ḫrof li ma imken lekÄ‹ ṫesṫeÄmelhom fe l-Äanawin.',
+'viewsource' => 'ÄŠof l-Äin',
+'viewsourcefor' => 'l $1',
+'protectedpagetext' => 'had sfha mhmiya bach mataadlch baqi',
+'viewsourcetext' => 'imkn lik tchof otcopie lmasdar dyak had sfha',
+'ns-specialprotected' => 'sfahi lkhassa maymknch taadlha',
+
+# Virus scanner
+'virus-scanfailed' => 's-skan fċel (kod $1)',
+'virus-unknownscanner' => 'antivirus mjhol :',
+
+# Login and logout pages
+'logouttext' => "''' nta daba kharj.'''
+
+ila bghiti tqdr tstamr tstaml {{SITENAME}} kamjhol , olla ila bghiti [[Special:UserLogin|tdkhl aawtani]] bnafs smiya ola bsmiya khra.
+
+tqdr tchof baad sfahi bhal ila msjl hta tfrgh lcache dyalk",
+'welcomecreation' => '== mrhba bik, $1! ==
+lcont dyalk raha mojoda
+matnsach tbddl[[Special:Preferences|{{SITENAME}} tfdilat dyal]].',
+'yourname' => 'Smiyṫ l-mosṫeĥdim:',
+'yourpassword' => 'Saroṫ:',
+'yourpasswordagain' => 'aaawd ktb lmot de passe dyalk',
+'remembermypassword' => 'Äœqel Äla smiyṫ l-ḫsab dyali fe had l-ordinaṫør (Ä¡ir limoddaṫ {{PLURAL:$1|yom waḫed|$1 iyyam}})',
+'yourdomainname' => 'domain dyalk',
+'login' => 'DÄ¥el',
+'nav-login-createaccount' => 'Ṫkonékta / ĤṫareÄ Ä‹i konṫ',
+'userlogin' => 'Ṫkonnékta / Ṣayeb ċi ḫsab',
+'userloginnocreate' => 'Ṫkonékta',
+'logout' => 'Ṫdékonékta',
+'userlogout' => 'Ĥrej',
+'notloggedin' => 'nta mamkoniktich',
+'nologin' => 'maandkch cont ? $1',
+'nologinlink' => 'Ḫell ċi ḫsab',
+'createaccount' => 'Ḫell ċi ḫsab',
+'gotaccount' => 'aandk deja cont ? $1',
+'gotaccountlink' => 'Ṫkonékta',
+'createaccountmail' => "b l'email",
+'createaccountreason' => 'S-Sbab:',
+'loginerror' => 'khataa f dokhol',
+'createaccounterror' => "kayn chi mchkil f incha' lcont : $1",
+'noname' => 'Ma kṫebṫiċ ċi smiyṫ l-mosṫeĥdim mqadda.',
+'loginsuccesstitle' => 'dkhlti mzyan',
+'loginsuccess' => 'Dĥelṫi mezyan fe {{SITENAME}} be smiyṫ "$1".',
+'nouserspecified' => 'khassk tdkhl ism lmostakhdim.',
+'login-userblocked' => 'Had l-mosṫeÄ¥dim meḫbos. Konnéksyon memnoÄa.',
+'wrongpassword' => 'S-Saroṫ Äendek Ä¡alet.
+Äœafak Äawed keṫbo.',
+'wrongpasswordempty' => 'Ma kṫebṫiċ s-saroṫ.
+Äœafak Äawed ketbo.',
+'password-name-match' => 'lmot de pass khassha tkon mkhtalfa ala ism lmostakhdim dyalk',
+'mailmypassword' => 'Ṣifet li saroṫ jdid',
+'passwordremindertitle' => 'Saroṫ jdid {{SITENAME}} ġir bidman.',
+'noemail' => 'L-Mosṫeĥdim "$1" mazal me deĥĥel ḫṫa ċi imayl.',
+'noemailcreate' => 'Ĥaṣ l-imayl dyalek ykon ṣaleḫ.',
+'passwordsent' => 'Siftna lek saroṫ jdid fe l-imayl dyal "$1". Äœafak Äawed dÄ¥el le ḫsabek faÄ‹ ywá¹£el lek.',
+'mailerror' => "khata' atna' irsal lbarid: $1",
+'emailconfirmlink' => "konfirmasyon dyal l'email",
+'accountcreated' => 'lcompt tkriyat',
+'loginlanguagelabel' => 'Loġa: $1',
+
+# Password reset dialog
+'resetpass' => 'tbdl lmot de passe',
+'resetpass_text' => '<!-- zid chi nass hna -->',
+'oldpassword' => 'lmot de passe qdima :',
+'newpassword' => 'lmot de passe jdida :',
+'retypenew' => 'aaawd ktb lmot de passe jdida :',
+'resetpass_submit' => 'rigler lmot de pass odkhl',
+'resetpass-submit-loggedin' => 'tbdl lmot de passe',
+'resetpass-submit-cancel' => 'Bettel',
+'resetpass-temp-password' => 'mot de passe moaqata',
+
+# Edit page toolbar
+'bold_sample' => 'Kṫaba Ä¡liá¸a',
+'bold_tip' => 'Kṫaba Ä¡liá¸a',
+'italic_sample' => 'Kṫaba mayla',
+'italic_tip' => 'Kṫaba mayla',
+'link_sample' => 'Äœonwan l-lyan',
+'link_tip' => 'Lyan daĥili',
+'extlink_sample' => 'http://www.example.com Äœonwan l-lyan',
+'extlink_tip' => 'Lyan Ä¥ariji (Äqel Äla http:// préfiks)',
+'headline_sample' => 'Neá¹£ de l-Äonwan.',
+'headline_tip' => 'Ĝonwan mosṫawa 2',
+'math_sample' => 'Kṫeb Äalaqa de l-mat hnaya',
+'math_tip' => 'Äœalaqa de l-mat (LaTeX)',
+'nowiki_sample' => 'N-Neṣ li ma mformatéċ keṫbo hna',
+'nowiki_tip' => 'Ĝti n-neĥĥal le l-formataj',
+'image_sample' => 'Example.jpg',
+'image_tip' => "Fiċyé m'inséré",
+'media_sample' => 'Example.ogg',
+'media_tip' => 'Lyan dyal ċi fiċyé médya',
+'sig_tip' => 'Ṫ-ṪowqiÄ dyalek be s-saÄa o ṫ-ṫariÄ¥',
+'hr_tip' => 'Ĥett horizontal (ma ṫkeṫṫerċ menno)',
+
+# Edit pages
+'summary' => 'Moleĥĥaṣ:',
+'subject' => 'Mowá¸oÄ/Äœonwan',
+'minoredit' => 'Hada ṫeÄdil sÄ¡ir',
+'watchthis' => 'ṪebbeÄ had á¹£-á¹£efḫa',
+'savearticle' => 'Ċejjel ṣ-ṣefḫa',
+'preview' => 'L-Prévizualizasyon',
+'showpreview' => 'Werri l-prévizualizasyon',
+'showlivepreview' => 'aard mobachir',
+'showdiff' => 'Werri ṫ-ṫeġyiraṫ',
+'anoneditwarning' => "'''Ĝendak:''' Ma mkonéktéċ.
+Ä ayṫċejjel l-Äonwan IP dyalek fe ṫariÄ¥ had á¹£-á¹£efḫa.",
+'missingcommenttext' => 'afak dkhl taaliq ltaht',
+'summary-preview' => 'Prévizualizasyon dyal l-moleĥĥaṣ:',
+'blockedtitle' => 'had lmostakhdim tbloka',
+'blockednoreason' => 'ta sabab mamaatich',
+'whitelistedittitle' => 'khassk tdkhl bach thrr',
+'whitelistedittext' => 'khassk $1 bach taadl sfahi',
+'nosuchsectiontitle' => 'maymknch nlgaw lqissm',
+'loginreqtitle' => 'khassk tsjl dokhol',
+'loginreqlink' => 'Ṫkonékta',
+'accmailtitle' => 'lmot de passe tsaft.',
+'newarticle' => '(jdid)',
+'newarticletext' => "ṪbeÄṫi waḫed l-lyan li kayddi le waḫed á¹£-á¹£efḫa li ṫṫemḫaṫ.
+BaÄ‹ ṫsayeb had á¹£-á¹£efḫa, bda ṫekṫeb fe á¹£-á¹£endoq li l-ṫeḫṫ (Ä‹of ila bÄ¡iṫi [[{{MediaWiki:Helppage}}|á¹£-á¹£efḫa de l-mosaÄada]] le l-mazid de l-meÄlomaṫ).
+Ila wá¹£elṫi hnaya Äla Ä¡efla, brek Äla l-boton '''rjeÄ''' dyal n-navigaṫør internet dyalek.",
+'noarticletext' => 'Ma kayen fe had s-saÄa ḫṫa neá¹£ fe had á¹£-á¹£efḫa.
+Imken lek [[Special:Search/{{PAGENAME}}|ṫqelleb Äla á¹£efḫa be had l-Äonwan]] fe á¹£-á¹£efḫaṫ l-Ä¥rin,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ṫqelleb fe l-Äamaliyaṫ l-mlaqyin]
+ola [{{fullurl:{{FULLPAGENAME}}|action=edit}} ṫsayeb ṣ-ṣefḫa]</span>.',
+'noarticletext-nopermission' => 'Ma kayen fe had s-saÄa ḫṫa neá¹£ fe had á¹£-á¹£efḫa.
+Imken lek [[Special:Search/{{PAGENAME}}|ṫqelleb Äla á¹£efḫa be had l-Äonwan]] fe á¹£-á¹£efḫaṫ l-Ä¥rin,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ṫqelleb fe l-Äamaliyaṫ l-mlaqyin]
+ola [{{fullurl:{{FULLPAGENAME}}|action=edit}} ṫsayeb ṣ-ṣefḫa]</span>.',
+'userpage-userdoesnotexist-view' => 'L-Ḫsab dyal l-mosṫeĥdim "$1" ma mċejjelċ.',
+'updated' => '(mohdata)',
+'note' => "'''molahada:'''",
+'previewnote' => "'''Dir fe balek belli hadċi ġir prévizualizasyon.'''
+Dakċi li beddelṫi mazal ma ṫċejjel !",
+'editing' => 'Ṫ-ṪeÄdil dyal $1',
+'editingsection' => 'Ṣayeb $1 (séksyon)',
+'editingcomment' => 'Ṣayeb $1 (séksyon jdida)',
+'editconflict' => 'mdarba f thrir: $1',
+'yourtext' => 'N-Neá¹£ dyalek',
+'storedversion' => 'noskha msjla',
+'yourdiff' => 'lforoq',
+'copyrightwarning' => "L-Mosahamaṫ le {{SITENAME}} kollhom meÄṫabrin bḫal menÄ‹orin be ṫetbiq $2 (Ä‹of $1 le mazid l-meÄlomaṫ). Ila ma bÄ¡iṫiÄ‹ belli n-ná¹£oá¹£ dyawlek ma iṫwezzÄoÄ‹ o ma iṫṣayboÄ‹ ki mma jab L-Lah, Äafak Ä¡ir ma ṫḫetthomÄ‹ hnaya.<br />
+Ä adi ṫwaÄedna ayá¸an belli nṫa li kṫebṫi hadÄ‹i kollo, o ma nqelṫihÄ‹ men Ä‹i Äin jayya men á¸-á¸amn l-Äomomi ola men meá¹£der mefṫoḫ weḫdaÄ¥or.
+'''MA ṪESṪEĜMELĊ L-ĤEDMA DYAL N-NAS LI FIHOM COPYRIGHT BLA MA ṪṪAĤOD L-'IDN MENHOM'''",
+'templatesused' => 'Had á¹£-á¹£efḫa {{PLURAL:$1|kaṫsṫeÄmel had l-modél|kaysṫeÄmel had l-modélaṫ}}:',
+'templatesusedpreview' => '{{PLURAL:$1|Modél l-mesṫeÄmel|Modélaṫ l-mesṫeÄmlin}} fe had l-prévizualizasyon:',
+'template-protected' => 'Ḫimaya',
+'template-semiprotected' => '(ḫimaya ma kamlaċ)',
+'hiddencategories' => '{{PLURAL:$1|L-Katégori l-mĥebbya li kaṫmlek|L-Katégoriyaṫ l-mĥebbyin li kaymelko}} had ṣ-ṣefḫa :',
+'edittools' => '<!-- nass ghayban hna t7t t3dil ot7t istimarat raf3 sowar. -->',
+'permissionserrors' => 'Ġalat fe s-smaḫ',
+'permissionserrorstext-withaction' => "Ma ÄendekÄ‹ l-ḫaqq baÄ‹ $2, Älawed had {{PLURAL:$1|s-sabab|l-'asbiba}}",
+'log-fulllog' => 'chod sijjil lkamil',
+'edit-conflict' => 'mdarba f thrir',
+
+# Parser/template warnings
+'parser-template-loop-warning' => 'tamm kachf halaqat qalab : [[$1]]',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'lcont maymknch tnchaa',
+
+# History pages
+'viewpagelogs' => 'ÄŠof l-Äamaliyaṫ dyal had á¹£-á¹£efḫa',
+'currentrev' => 'Ċof l-versyon l-leĥĥra',
+'currentrev-asof' => 'L-Vérsyon l-leĥĥra nhar $2 mÄa s-saÄa $3',
+'revisionasof' => 'MorajaÄa $1',
+'previousrevision' => 'MorajaÄa qdem',
+'nextrevision' => 'L-Vérsyon li mbeÄd →',
+'currentrevisionlink' => 'Ċof l-versyon l-leĥĥra',
+'cur' => 'daba',
+'next' => 'li jay',
+'last' => 'qbel',
+'page_first' => 'lowla',
+'page_last' => 'lkhra',
+'histlegend' => 'MeÄlomaṫ ṫefsiriya : ({{MediaWiki:Cur}}) = l-ferq mÄa l-vérsyon dyal daba, ({{MediaWiki:Last}}) = l-ferq mÄa l-vérsyon li qbel, <b>m</b> = ṫeÄdil ma mohimÄ‹ bezzaf',
+'history-fieldset-title' => 'Qelleb fe ṫ-ṫariĥ',
+'history-show-deleted' => 'lmahdofa faqat',
+'histfirst' => 'L-Owel',
+'histlast' => 'L-Leĥĥer',
+'historyempty' => '(khawi)',
+
+# Revision feed
+'history-feed-title' => 'tarikh lmrajaaa',
+'history-feed-item-nocomment' => 'Men $1 ḫṫal $2',
+
+# Revision deletion
+'rev-deleted-comment' => '(taaliq thiyd)',
+'rev-deleted-user' => '(ism lmostkhdim thiyd)',
+'rev-delundel' => 'Biyyen/Ĥebbi',
+'rev-showdeleted' => 'Werri',
+'revdelete-nologtype-title' => 'la nawa sijil tamma iaataoho',
+'revdelete-nologid-title' => 'modkhala sijjil ghayr sahiha',
+'revdelete-show-file-submit' => 'iyih',
+'revdelete-hide-text' => 'khbbi nass lmorajaa',
+'revdelete-hide-image' => 'khbi lmohtawa dyal lfichier',
+'revdelete-hide-name' => 'khbi lfiil olhadaf',
+'revdelete-hide-comment' => 'khhbi taaliq taadil',
+'revdelete-hide-user' => 'khbbi ism lmostakhdim/ip',
+'revdelete-radio-same' => '(matghiyrch)',
+'revdelete-radio-set' => 'iyih',
+'revdelete-radio-unset' => 'la',
+'revdelete-log' => 'S-Sbab:',
+'revdel-restore' => 'Beddel Ä‹-Ä‹ofa',
+'revdel-restore-deleted' => 'morajaaa mahdoufa',
+'revdel-restore-visible' => "morajaat mar'iya",
+'pagehist' => 'Ṫariĥ ṣ-ṣefḫa',
+'deletedhist' => 'tarikh lmhdof',
+'revdelete-content' => 'L-Meá¸mon',
+'revdelete-summary' => 'molkhass taadil',
+'revdelete-uname' => 'Smiyṫ l-mosṫeĥdim:',
+'revdelete-hid' => 'khbbi $1',
+'revdelete-unhid' => 'biyn $1',
+'revdelete-otherreason' => 'Sabab weḫdaĥor/zayed:',
+'revdelete-reasonotherlist' => 'Sabab weḫdaĥor',
+'revdelete-edit-reasonlist' => 'aadl asbab lhadf',
+'revdelete-offender' => 'moallif lmorajaa',
+
+# Suppression log
+'suppressionlog' => 'sijil likhfaaa',
+
+# History merging
+'mergehistory' => 'dmj tawarikh sfha',
+'mergehistory-from' => 'sfha lmasdar :',
+'mergehistory-into' => 'sfha lhadaf :',
+'mergehistory-submit' => 'dmj lmorajaat',
+'mergehistory-reason' => 'S-Sbab:',
+
+# Merge log
+'mergelog' => 'sjl damj',
+'revertmerge' => 'Ḫiyyed ṫ-ṫeĥlat.',
+
+# Diffs
+'history-title' => 'Ṫ-Ṫariĥ dyal lé-vérsyon dyal "$1"',
+'difference' => '(Ferq mabin lé-vérsyon)',
+'lineno' => 'á¹¢ter $1:',
+'compareselectedversions' => 'Qaren lé-versyon li meÄzolin',
+'editundo' => 'RjeÄ',
+
+# Search results
+'searchresults' => "N-Naṫa'ij dyal l-beḫṫ",
+'searchresults-title' => 'N-Naṫa\'ij dyal l-beḫṫ Äla "$1"',
+'searchresulttext' => 'Ila bÄ¡iṫi kṫer de l-meÄlomaṫ Äla {{SITENAME}}, Ä‹of [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => "Qelebṫiw Äla « '''[[:$1]]''' » ([[Special:Prefixindex/$1|á¹£-á¹£efḫaṫ kolhom li badyin be « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|á¹£-á¹£efḫaṫ kolhom li mlaqyin mÄa « $1 »]])",
+'searchsubtitleinvalid' => "Qellebṫi Äla '''$1'''",
+'titlematches' => 'onwan sfha yotabiq',
+'notitlematches' => 'Ḫṫa Ä‹i neá¹£ ma mlaqi mÄa dak Ä‹-Ä‹i l-li kaṫ-qelleb Älih',
+'textmatches' => 'neá¹£ sfha kaytabq',
+'notextmatches' => 'Ḫṫa Ä‹i neá¹£ ma mlaqi mÄa dakÄ‹i li kaṫqelleb Älih',
+'prevn' => 'L-Li qbel {{PLURAL:$1|$1}}',
+'nextn' => 'L-Li mbeÄd {{PLURAL:$1|$1}}',
+'viewprevnext' => 'ÄŠof ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'khiyarat lbaht',
+'searchhelp-url' => 'Help:Meá¸mon',
+'searchprofile-articles' => 'sfht mohtawa',
+'searchprofile-project' => 'sfhai dyal lmossada ol mchroa',
+'searchprofile-images' => 'media',
+'searchprofile-everything' => 'kolchi',
+'searchprofile-advanced' => 'motaqaddim',
+'searchprofile-articles-tooltip' => 'qllb f $1',
+'searchprofile-project-tooltip' => 'qllb f $1',
+'searchprofile-images-tooltip' => 'qllb f tsawr',
+'search-result-size' => '$1 ({{PLURAL:$2|kelma weḫda|$2 kelmaṫ}})',
+'search-result-score' => 'lirtibat: $1%',
+'search-redirect' => '(Ṫeḫwil $1)',
+'search-section' => '(seksyon $1)',
+'search-suggest' => 'Waċ konṫi baġi ṫqol : $1',
+'search-interwiki-caption' => 'MaÄ‹ariÄ Ä¥Ä¥oṫ',
+'search-interwiki-default' => 'N-Naṫija dyal $1:',
+'search-interwiki-more' => '(z-zyada)',
+'search-mwsuggest-enabled' => 'be qṫiraḫaṫ',
+'search-mwsuggest-disabled' => 'bla qṫiraḫaṫ',
+'search-relatedarticle' => 'mortabita',
+'mwsuggest-disable' => 'attl liqtirahat dyal AJAX',
+'searcheverything-enable' => 'Qelleb fe maḫel s-smiyyaṫ',
+'searchrelated' => 'mortabita',
+'searchall' => 'kolċi',
+'nonefound' => "'''Molaḫada''': Ma kayen Ä¡ir weḫdin men l-blaá¹£aṫ dyal s-smiyyaṫ li kanqellbo Älihom otomaṫikiyan.
+Jerreb be l-préfiks \"all:\" baÄ‹ ṫqelleb Äla l-meá¸mon kollo (o ḫṫa á¹£-á¹£efḫaṫ dyal n-niqaÄ‹, l-modélaṫ, etc.) ola ṣṫeÄmel l-blaá¹£a dyal s-smiyya li bÄ¡iṫi bḫal Ä‹i préfiks.",
+'powersearch' => 'Ṫeqlab á¹£Äib',
+'powersearch-legend' => 'Ṫeqlab á¹£Äib',
+'powersearch-ns' => 'Qelleb fe maḫel s-smiyyaṫ',
+'powersearch-redir' => "Lisṫaṫ 'ṫ-ṫeḫwilaṫ",
+'powersearch-field' => 'Qeleb Äla',
+'powersearch-togglelabel' => 'Ĥṫar',
+'powersearch-toggleall' => 'Kolċi',
+'powersearch-togglenone' => 'Walo',
+'search-external' => 'Qeleb Äla bera',
+'searchdisabled' => '{{SITENAME}} ma ĥedamċ.
+Imken lik ṫqeleb fe google.
+Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫin.',
+
+# Quickbar
+'qbsettings' => "L-lawḫa 's-sariÄa",
+'qbsettings-none' => 'Ma kaynċ',
+'qbsettings-fixedleft' => "Meḫbos fe 'ċ-ċmal",
+'qbsettings-fixedright' => "Meḫbos fe 'l-limin",
+'qbsettings-floatingleft' => "Ḫor fe 'ċ-ċmal",
+'qbsettings-floatingright' => "Ḫor fe 'l-limen",
+
+# Preferences page
+'preferences' => 'Li kaṫfeá¸á¸el',
+'mypreferences' => 'Ḫajaṫ li kanfeá¸á¸el',
+'prefs-edits' => 'adad taadilat :',
+'prefsnologin' => 'nta mamkoniktich',
+'changepassword' => 'tbdl lmot de passe',
+'prefs-skin' => 'frssada',
+'skin-preview' => 'L-Prévizualizasyon',
+'prefs-math' => 'mat',
+'datedefault' => 'la tafdil',
+'prefs-datetime' => 'tarikh o ssaa',
+'prefs-personal' => 'milf lmostakhdim',
+'prefs-rc' => 'Ṫ-ṪeÄdilaṫ l-leĥĥra',
+'prefs-watchlist' => 'qaimat lmoraqaba',
+'prefs-watchlist-days' => 'adad kiyam alaard f qaimat lmoraqaba:',
+'prefs-watchlist-days-max' => 'Maximmum 7 yam',
+'prefs-watchlist-edits-max' => 'maximmum:1000',
+'prefs-watchlist-token' => 'miftah qaimat lmoraqaba',
+'prefs-misc' => 'motafarriqat',
+'prefs-resetpass' => 'tbdl lmot de passe',
+'prefs-email' => "reglage dyal l'email",
+'prefs-rendering' => "l'apparence",
+'saveprefs' => 'sjl',
+'resetprefs' => 'hiyd tgyirat li mamsjlach',
+'restoreprefs' => 'rjaa kaml liadadat liftiradiya',
+'prefs-editing' => 'thrir',
+'prefs-edit-boxsize' => 'hajm nafidat thrir',
+'rows' => 'sofof:',
+'columns' => 'aaamida:',
+'searchresultshead' => 'Qelleb',
+'resultsperpage' => 'adad nataij f sfha',
+'contextlines' => 'adad lastor f kol natija',
+'contextchars' => 'adad lahrof f satr:',
+'stub-threshold-disabled' => 'makhdamch',
+'timezonelegend' => 'lmintaqa zamaniya :',
+'localtime' => 'Lwaqt lmahali :',
+'timezoneuseserverdefault' => 'stakhdm iftirad serveur',
+'timezoneuseoffset' => 'khor (hdd lfarq)',
+'timezoneoffset' => 'Lfarq¹:',
+'servertime' => 'wqt serveur',
+'guesstimezone' => 'dkhl twqit mn navigateur',
+'timezoneregion-africa' => 'Ifriqya',
+'timezoneregion-america' => 'Mirikan',
+'timezoneregion-antarctica' => 'Antarkṫik',
+'timezoneregion-arctic' => 'Arkṫik',
+'timezoneregion-asia' => 'Asya',
+'timezoneregion-atlantic' => 'L-Moḫit L-Atlaṣi',
+'timezoneregion-australia' => 'Osṫralya',
+'timezoneregion-europe' => 'Oropa',
+'timezoneregion-indian' => 'L-Moḫit L-Hindi',
+'timezoneregion-pacific' => 'L-Moḫit L-Pasifik',
+'allowemail' => "mkn tlqa l'email mn mostakhdimin khrin",
+'prefs-searchoptions' => 'khiyarat lbaht',
+'prefs-namespaces' => 'Maḫel s-smiyyaṫ :',
+'defaultns' => 'olla qlb f had dominat :',
+'default' => 'iftiradi',
+'prefs-files' => 'Fiċyé',
+'prefs-custom-css' => 'personalisé CSS',
+'prefs-custom-js' => 'personalisé JavaScript',
+'prefs-emailconfirm-label' => "konfirmi l'email:",
+'prefs-textboxsize' => 'hajm nafidat tahrir',
+'youremail' => 'I-Méyl',
+'username' => 'Smiyṫ l-mosṫeĥdim:',
+'uid' => 'raqm lmostakhdim :',
+'prefs-memberingroups' => 'odw f {{PLURAL:$1|mjmoaa|mjmoaat}}:',
+'prefs-registration' => 'wqt tasjil:',
+'yourrealname' => 'smiytk lhaqiqiya:',
+'yourlanguage' => 'Loġa',
+'yourvariant' => 'lhja:',
+'yournick' => 'sinyator jdid:',
+'yourgender' => 'ljisn :',
+'gender-unknown' => 'mamhddch',
+'gender-male' => 'Dikr',
+'gender-female' => "Mo'enaṫ",
+'email' => 'I-Méyl',
+'prefs-help-email-required' => "l'email darori",
+'prefs-info' => "L-MeÄlomaṫ l-'asasiya",
+'prefs-signature' => 'Sinyaṫur',
+'prefs-dateformat' => 'sighat lwaqt',
+'prefs-timeoffset' => 'lmintaqa zamaniya',
+'prefs-advancedediting' => 'khiyarat motaqaddima',
+'prefs-advancedrc' => 'khiyarat motaqaddima',
+'prefs-advancedrendering' => 'khiyarat motaqaddima',
+'prefs-advancedsearchoptions' => 'khiyarat motaqaddima',
+'prefs-advancedwatchlist' => 'khiyarat motaqaddima',
+'prefs-displayrc' => 'khiyarat laard',
+'prefs-displaysearchoptions' => 'khiyarat laard',
+'prefs-displaywatchlist' => 'khiyarat laard',
+'prefs-diffs' => 'foroqat',
+
+# User rights
+'userrights' => 'idarat salahiyat lmostakhdim',
+'userrights-lookup-user' => 'idarat mjmoat lmostkhdim',
+'userrights-user-editname' => 'dkhl ism mostakhdim :',
+'editusergroup' => 'addl mjmoat lmostakhdim',
+'userrights-editusergroup' => 'tadil mjmoaat lmostakhdim',
+'saveusergroups' => 'hifd mjmoat lmotakhdim',
+'userrights-groupsmember' => 'odw fi :',
+'userrights-groupsmember-auto' => 'odw dimni f :',
+'userrights-reason' => 'S-Sbab:',
+'userrights-changeable-col' => 'lmojmoat li imkn li tghiyrha',
+'userrights-unchangeable-col' => 'lmjmoat li maymknch lik tghyrha',
+'userrights-irreversible-marker' => '$1*',
+
+# Groups
+'group' => 'majmoaa:',
+'group-user' => 'Mosṫeĥdimon',
+'group-autoconfirmed' => 'mostakhdimon maakadon automatikiyan',
+'group-bot' => 'botat',
+'group-sysop' => 'Wébmodirin',
+'group-bureaucrat' => 'bitoqratiyon',
+'group-suppress' => 'noddar',
+'group-all' => '(kolchi)',
+
+'group-user-member' => 'Mosṫeĥdim',
+'group-autoconfirmed-member' => "Mosṫeĥdim moakkad tilqa'iyan",
+'group-bot-member' => 'bot',
+'group-sysop-member' => 'Wébmodirin',
+'group-bureaucrat-member' => 'biroqrat',
+'group-suppress-member' => 'nadhir',
+
+'grouppage-user' => '{{ns:project}}:mostakhdimon',
+'grouppage-autoconfirmed' => '{{ns:project}}:mostakhdimon mofaalon tilqaiyan',
+'grouppage-bot' => '{{ns:project}}:Botat',
+'grouppage-sysop' => '{{ns:project}}:Wébmodirin',
+'grouppage-bureaucrat' => '{{ns:project}}:biroqratiyon',
+'grouppage-suppress' => '{{ns:project}}:Ouversayt',
+
+# Rights
+'right-read' => 'qra safha',
+'right-edit' => 'taadil sfahi',
+'right-createpage' => 'inchaa sfahi (li hiya machi sfahi dyal niqach)',
+'right-createtalk' => 'inchaa sfahi dyal niqach',
+'right-createaccount' => 'inchaa ism mostakhdim jadid',
+'right-minoredit' => 'taalim ala koll taadilat katafifa',
+'right-move' => 'Neqqel ṣ-ṣefḫa',
+'right-move-subpages' => 'naql sfahi maa sfahiha lfariya',
+'right-move-rootuserpages' => 'naql sfahi d lmostakhdimin lassassiya',
+'right-movefile' => 'naql lfichiyat',
+'right-upload' => 'Ṣifet ċi fiċyé',
+'right-delete' => "Mḫi had 'ṣ-ṣefḫa",
+'right-undelete' => 'rj3 sfha',
+'right-suppressionlog' => 'chouf sijillat sirriya',
+'right-unblockself' => 'ihiydo lblokage ala ryoshom',
+'right-protect' => 'taghyir mostawayat lhimaya wtadil sfahi li mhmiyin',
+'right-rollback' => 'srtjaa taadilat akhr mostkhdim adl sfha mayana',
+'right-noratelimit' => "mamt'atrch b hodod lmoaddal",
+'right-import' => 'importé sfahi mn wikiat khrin',
+'right-importupload' => 'importi sfahi mn fichier marfoa',
+'right-patrol' => 'allm ala taadilat lkhrin kamorajaa',
+'right-autopatrol' => 'alm taadilat lmostakhdim morajaa tilqaiya',
+'right-patrolmarks' => 'chof alamat lmorajaa f ahdat tghyirat',
+'right-unwatchedpages' => 'chof sfahi li mamraqbinch',
+'right-trackback' => 'dir trackback',
+'right-mergehistory' => 'dmj tarikh sfahi',
+'right-userrights' => 'taadil kol salahiyat lmostkhdimin',
+'right-userrights-interwiki' => 'taadil salahiyat lmostkhdim lmostkhdimin f lwikiyat lkhrin',
+'right-siteadmin' => 'sd o zl qaidat lbayant',
+'right-reset-passwords' => 'awd rigli lmot de passe dyal lmostkhdimin lkhrin',
+'right-override-export-depth' => 'tsdir sfahi obinha sfahi lmawsola hta lomq 5',
+'right-sendemail' => 'sift email lmostkhdimin lkhrin',
+
+# User rights log
+'rightslog' => 'Ĝamaliyaṫ ḫoqoq l-mosṫeĥdim',
+'rightslogtext' => 'hada sijil btaghyirat f salahiyat lmostkhdimin',
+'rightslogentry' => 'ghyr salahiyat $1 mn $2 l $3',
+'rightsnone' => '(walo)',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => "ĤṫareÄ had 'á¹£-á¹£efḫa",
+'action-edit' => 'Ṣayeb had ṣ-ṣefḫa',
+'action-createpage' => 'inchaa sfahi jdad',
+'action-createtalk' => 'inchaa sfahi dyal niqach',
+'action-createaccount' => 'inchaa had ism mostakhdim',
+'action-minoredit' => 'allm had tghyir katafif',
+'action-move' => 'Neqqel had ṣ-ṣefḫa',
+'action-move-subpages' => 'nql had sfha osfahi lfaraiya dyalha',
+'action-move-rootuserpages' => 'naql sfahi d lmostakhdimin lassassiya',
+'action-movefile' => 'Neqqel had lfichier',
+'action-upload' => 'Ṣifet ċi fiċyé',
+'action-reupload' => 'ktb ala had lfichier li deja kayn',
+'action-reupload-shared' => 'ktb ala had lfichier f depot mochtarak',
+'action-upload_by_url' => 'rfa had lfichier mn URL',
+'action-writeapi' => 'stakhdem lkitaba API',
+'action-delete' => 'Mḫi had ṣ-ṣefḫa',
+'action-deleterevision' => 'mhi had lmorajaa',
+'action-deletedhistory' => 'choof tarikh sfahi lmhdoufa',
+'action-browsearchive' => 'qelleb f sfahi lmhdoufa',
+'action-undelete' => 'rjaa had ṣ-ṣefḫa',
+'action-suppressrevision' => 'reviem o sjl had lmorajaa lmkhfiya',
+'action-suppressionlog' => 'chof had sijil lkhass',
+'action-block' => 'mnaa had lmostkhdim mn taadil',
+'action-protect' => 'ghiyr mostawayat lhimaya dyal had sfha',
+'action-import' => 'importi had sfha mn wiki akhr',
+'action-importupload' => 'amporti had sfha mn fichier mrfoa',
+'action-patrol' => 'alm ala taadilat lkhrin kamorajaa',
+'action-autopatrol' => 'alm taadil dualk kamorajaa',
+'action-unwatchedpages' => 'chof lista dyal sfahi li mamraqbach',
+'action-trackback' => 'dir trackback',
+'action-mergehistory' => 'dmj tarikh had sfha',
+'action-userrights' => 'taadil kol salahiyat lmostkhdimin',
+'action-userrights-interwiki' => 'taadil salahiyat lmostkhdimin f lwikiyat lkhrin',
+'action-siteadmin' => 'sd o7l qaidat lbayant',
+
+# Recent changes
+'nchanges' => '{{PLURAL:$1|ṫeġyira weḫda|$1 dyal ṫ-ṫeġyiraṫ}}',
+'recentchanges' => 'Ṫ-ṪeÄdilaṫ l-leĥĥra',
+'recentchanges-legend' => 'Opsyon dyal ṫ-ṫeġyiraṫ l-leĥĥra',
+'recentchangestext' => 'ṪebbeÄ á¹«-ṫeÄdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.',
+'recentchanges-feed-description' => 'ṪebbeÄ á¹«-ṫeÄdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.',
+'recentchanges-label-newpage' => "anch' had tadil sfha jdida",
+'recentchanges-label-minor' => 'Hada ṫeÄdil sÄ¡ir',
+'recentchanges-label-bot' => 'had taadil darou bot',
+'recentchanges-label-unpatrolled' => 'had taadil matrajach',
+'rcnote' => 'Hnaya Ä¡aṫelqaw {{PLURAL:$1|ṫ-ṫeÄ¡yira l-leĥĥra li ṫdareṫ|l-$1 dyal ṫ-ṫeÄ¡yiraṫ l-leĥĥrin li ṫdaro}} tol {{PLURAL:$2|l-yom l-leĥĥer|l-<b>$2</b> iyam l-leĥĥra}} ḫtal nhar $4 mÄa s-saÄa $5.',
+'rcnotefrom' => "hna taghirat mn '''$2''' (tal '''$1''' maaroda).",
+'rclistfrom' => 'Werri ṫeġyiraṫ jdad badyen men $1',
+'rcshowhideminor' => '$1 ṪeÄdilaṫ ma mohimminÄ‹ bezzaf',
+'rcshowhidebots' => '$1 R-Robowaṫ',
+'rcshowhideliu' => '$1 l-mosṫeĥdimin l-mċejjlin',
+'rcshowhideanons' => '$1 mosṫeĥdimin mĥebbyin',
+'rcshowhidepatr' => '$1 taadilat lmorajaa',
+'rcshowhidemine' => '$1 ṫ-ṫeÄdilaṫ dyawli',
+'rclinks' => 'Werri l-$1 dyal ṫ-ṫeġyiraṫ l-leĥĥrin li ṫdaro fe had l-$2 l-iyam l-leĥĥrin<br />$3.',
+'diff' => 'ferq',
+'hist' => 'Ṫariĥ',
+'hide' => 'Ĥebbi',
+'show' => 'Werri',
+'minoreditletter' => 'á¹£',
+'newpageletter' => 'J',
+'boteditletter' => 'b',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[$1 katchof {{PLURAL:$1|mostkhdim|mostkhdimin}}]',
+'rc_categories' => 'limiti tsnifat (frqha b "|")',
+'rc_categories_any' => 'ay wahd',
+'rc-change-size' => '$1',
+'newsectionsummary' => '/* $1 */ qism jdid',
+'rc-enhanced-expand' => 'Werri ṫ-ṫafaṣil (kayḫṫaj JavaScript)',
+'rc-enhanced-hide' => 'Ĥebbi ṫ-ṫafaṣil',
+
+# Recent changes linked
+'recentchangeslinked' => 'L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin',
+'recentchangeslinked-feed' => 'L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin',
+'recentchangeslinked-toolbox' => 'L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin',
+'recentchangeslinked-title' => 'Ṫ-ṪeÄ¡yiraṫ li mlaqyin mÄa "$1"',
+'recentchangeslinked-backlink' => '↠$1',
+'recentchangeslinked-noresult' => 'ta tghyir f sfahi mrtabta f lmodda li drtiha',
+'recentchangeslinked-summary' => "Hadi lista dial 'ṫ-ṫeÄ¡yiraṫ li ṫdaro mo'aÄ¥arane le 'á¹£-á¹£efḫaṫ li mlaqyin mÄa 'á¹£-á¹£efḫa l-meÄniya (ola le 'aÄda' dial Ä‹i á¹£efa mÄayana). 'á¹¢-á¹¢efḫaṫ li [[Special:Watchlist|mṫebeÄ]] mekṫobine be ḫrof Ä¡laá¸.",
+'recentchangeslinked-page' => 'Smiyṫ ṣ-ṣefḫa',
+'recentchangeslinked-to' => 'ÄŠof ṫ-ṫeÄ¡yiraṫ dyal á¹£-á¹£efḫaṫ li fihom Ä‹i lyan kayddik le á¹£-á¹£efḫa li bÄ¡iṫi fe blaá¹£t ma ṫdir l-Äeks',
+
+# Upload
+'upload' => 'Ṣifet ċi fiċyé',
+'uploadbtn' => 'Ṣifet ċi fiċyé',
+'reuploaddesc' => "ilgha' rojoa orjaa l upload form",
+'upload-tryagain' => 'fist lmodifikasyon',
+'uploadnologin' => 'nta mamkoniktich',
+'uploadnologintext' => 'khassk [[Special:UserLogin|tsjl]] bach tsift fichier.',
+'uploadlog' => 'Øplowdaṫ',
+'uploadlogpage' => 'Øplowdaṫ',
+'filename' => 'smiyt lfichier',
+'filedesc' => 'Moleĥĥaṣ:',
+'fileuploadsummary' => 'Summary:',
+'filereuploadsummary' => 'Ṫ-Ṫeġyiraṫ de l-fichier',
+'filestatus' => 'halat hoqoq naskh:',
+'filesource' => 'masdar :',
+'uploadedfiles' => 'Ṣifet chi fiċyé',
+'ignorewarnings' => 'tjahl thdirat',
+'file-too-large' => 'lfichier kbir bzzaf',
+'filename-tooshort' => 'smiyt lfichier qssira bzaf',
+'filetype-banned' => 'had nawa lmilf mamnoa',
+'verification-error' => 'had lfichier fih chi defout',
+'hookaborted' => 'taadil li bghiti dirou ojhida mn tamdid lhook',
+'illegal-filename' => 'had smiyt lmillaf mamnoaa',
+'overwrite' => 'maymknch tktb fog fichier deja kayn',
+'unknown-error' => "khata' mjhol wqaa",
+'tmp-create-error' => 'maymknch nkriyiw fichier temporaire.',
+'tmp-write-error' => "khata' f kitabat lmilaf lmo'aqqat",
+'uploadwarning' => 'tahdir rafaa',
+'uploadwarning-text' => 'afak bdl description dyal lmilaf ltaht ohawl awtani',
+'savefile' => 'sjjl had lfichier',
+'uploadedimage' => 'øplowda "[[$1]]"',
+'overwroteimage' => 'sift noskha jdida dyal "[[$1]]"',
+'uploaddisabled' => 'upload maatl',
+'copyuploaddisabled' => 'sift b URL makhdamch',
+'uploadfromurl-queued' => 'sift dyamlk tzad l servic',
+'uploaddisabledtext' => 'sift dyal lfichier makhdamch',
+'upload-source' => 'lmilffat lmasdariya',
+'sourcefilename' => 'ism milf lmasdar :',
+'sourceurl' => 'URL dyal lmasdar:',
+'destfilename' => 'lmif lmostadhdaf:',
+'upload-maxfilesize' => 'lhajm laqssa : $1',
+'upload-description' => 'wasi lfichier',
+'upload-options' => 'khiyarat rafa',
+'watchthisupload' => 'Watch this file',
+'filename-prefix-blacklist' => ' #<!-- khlli had str kima hwa --> <pre>
+# sigha bhal hakka:
+# * aych haja mn "#" tal akhir nass rah taaliq
+# * Every non-blank line is a prefix for typical file names assigned automatically by digital cameras
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # some mobile phones
+IMG # generic
+JD # Jenoptik
+MGP # Pentax
+PICT # misc.
+ #</pre> <!-- khlli had str kima hwa -->',
+'upload-failure-subj' => 'mochila f sift dyal lfichier',
+'upload-warning-subj' => 'tahdir rafaa',
+
+'upload-proto-error' => 'protocol machi hwa hadak',
+'upload-file-error' => 'khataaa dakhili',
+'upload-unknown-size' => 'hakm mamaarofch',
+'upload-http-error' => "lgina wahd khata' HTTP : $1",
+
+# img_auth script messages
+'img-auth-accessdenied' => 'lwosol trfd',
+'img-auth-streaming' => 'ard "$1".',
+
+# HTTP errors
+'http-invalid-url' => 'URL makhdamch : $1',
+'http-read-error' => "khata' qira'at HTTP.",
+'http-timed-out' => 'salat moddat mohlat talab dyal HTTp.',
+'http-curl-error' => "khata' f jalb lmassar: $1",
+'http-host-unreachable' => 'manqdroch nwslo l had lmassar.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'manqdroch nwslo l had lmassar.',
+'upload-curl-error28' => 'salat moddat rafa',
+
+'license' => 'tarkhiss :',
+'license-header' => 'tarkhiss',
+'nolicense' => 'ta wahd mamhddch',
+'license-nopreview' => '(lpreview makaynch)',
+'upload_source_url' => '(massar shih,imkn twssl lih)',
+'upload_source_file' => '(fichier f lpc dyalk)',
+
+# Special:ListFiles
+'imgfile' => 'Fiċyé',
+'listfiles' => 'lista dyal lfichiyat',
+'listfiles_date' => 'tarikh',
+'listfiles_name' => 'smiya',
+'listfiles_user' => 'Mosṫeĥdim',
+'listfiles_size' => 'lhajm',
+'listfiles_description' => 'wasf',
+'listfiles_count' => 'naskh',
+
+# File description page
+'file-anchor-link' => 'Fiċyé',
+'filehist' => 'Ṫariĥ l-fiċyé',
+'filehist-help' => 'Brek Äla ṫ-ṫariÄ¥ o s-saÄa baÄ‹ ṫċof l-fiÄ‹yé bḫal li kan fe hadik l-owqiṫa.',
+'filehist-deleteall' => 'Suprimi kolchi',
+'filehist-deleteone' => 'Suprimi',
+'filehist-revert' => 'RejjeÄ',
+'filehist-current' => 'dyal daba',
+'filehist-datetime' => 'Nhar/SaÄa',
+'filehist-thumb' => 'Ṫeṣwira mṣeġġra',
+'filehist-thumbtext' => 'Ṫ-Ṫeṣġir dyal l-vérsyon dyal nhar $2 mÄa s-saÄa $3',
+'filehist-nothumb' => 'la tasghir',
+'filehist-user' => 'Mosṫeĥdim',
+'filehist-dimensions' => 'T-Tol o l-Äerá¸',
+'filehist-filesize' => 'hajm lfichier',
+'filehist-comment' => 'Äœelleq',
+'filehist-missing' => 'fichier makaynch',
+'imagelinks' => 'Lyanaṫ l-fiċyé',
+'linkstoimage' => '{{PLURAL:$1|Had á¹£-á¹£efḫa kaṫsṫeÄmel|Had l-$1 de á¹£-á¹£efḫaṫ kaysṫeÄmlo}}:',
+'sharedupload' => 'Had l-fiÄ‹yé jay men $1 o maÄ‹ariÄ Ä¥rin imken lhom isṫeÄmloh.',
+'uploadnewversion-linktext' => 'Øplowdi vérsyon jdida dyal had l-fiċyé',
+'shared-repo-from' => 'mn $1',
+'shared-repo' => 'depot mochtarak',
+
+# File reversion
+'filerevert' => 'rjjea $1',
+'filerevert-backlink' => '↠$1',
+'filerevert-legend' => 'rjjea lfichier',
+'filerevert-comment' => 'S-Sbab:',
+'filerevert-submit' => 'RejjeÄ',
+
+# File deletion
+'filedelete' => 'suprimi $1',
+'filedelete-backlink' => '↠$1',
+'filedelete-legend' => 'quprimi kolchi',
+'filedelete-comment' => 'S-Sbab:',
+'filedelete-submit' => 'Suprimi',
+'filedelete-otherreason' => 'Sabab weḫdaĥor/zayed:',
+'filedelete-reason-otherlist' => 'Sabab weḫdaĥor',
+
+# MIME search
+'mimetype' => 'nawa lmilf:',
+'download' => 'telecharji',
+
+# Unwatched pages
+'unwatchedpages' => 'sfahi mamraqbach',
+
+# List redirects
+'listredirects' => "Lisṫaṫ 'ṫ-ṫeḫwilaṫ",
+
+# Unused templates
+'unusedtemplates' => 'qwalb mamstkhmdach',
+'unusedtemplateswlh' => 'wslat khrin',
+
+# Random page
+'randompage' => 'sfahi achwaiya',
+
+# Statistics
+'statistics' => 'Staṫisṫik',
+'statistics-header-pages' => "ihsa'at sfahi",
+'statistics-header-edits' => "ihsa'at taadilat",
+'statistics-header-views' => "ihsa'at lmochahada",
+'statistics-header-users' => "ihsa'at lmstkhdimin",
+'statistics-header-hooks' => "ihsa'at khra",
+'statistics-articles' => 'sfht mohtawa',
+'statistics-pages' => 'Ṣefḫa',
+'statistics-files' => 'Ṣifet ci fiċyé',
+'statistics-edits-average' => 'otawassit taadilat lkol sfha',
+'statistics-views-total' => 'chof total',
+'statistics-views-peredit' => 'lmochahadat lkol taadil',
+'statistics-users-active' => 'mostakhdimon nachtin',
+'statistics-mostpopular' => 'aktar sfahi mochahada',
+
+'disambiguations' => 'sfahi dyal tawdih',
+'disambiguationspage' => 'Template:tawdih',
+
+'double-redirect-fixer' => 'mosslih tahwil',
+
+'brokenredirects' => 'tahwilat makhddamach',
+'brokenredirects-edit' => 'Äœedel',
+'brokenredirects-delete' => 'Suprimi',
+
+'withoutinterwiki-legend' => 'prifix',
+'withoutinterwiki-submit' => 'Werri',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|okté|okté}}',
+'nmembers' => "$1 {{PLURAL:$1|Äœoá¸w|AÄá¸a'}}",
+'lonelypages' => 'sfahi itima',
+'uncategorizedpages' => 'sfahi mamsnfinch',
+'uncategorizedcategories' => 'tsnifat mamsnfinch',
+'uncategorizedimages' => 'fichiyat mamsnfinch',
+'uncategorizedtemplates' => 'qwalb mamsnfinch',
+'unusedcategories' => 'tsnifat mabqatch mstaamla',
+'unusedimages' => 'milfat mamstkhdmach',
+'popularpages' => 'sfahi mchhora',
+'wantedcategories' => 'tsnifat mtloba',
+'wantedpages' => 'sfahi mtloba',
+'wantedfiles' => 'milfat mtloba',
+'wantedtemplates' => 'qwalb mtloba',
+'mostlinked' => 'akta sfahi waslan',
+'mostlinkedcategories' => 'aktar tsnifat irtibatan',
+'mostlinkedtemplates' => 'aktar lqwalb waslan',
+'mostcategories' => 'aktar sfahi tsnifan',
+'mostimages' => 'aktar lmilfat irtibatan',
+'mostrevisions' => 'aktar sfahi taadilan',
+'prefixindex' => 'Ṣ-Ṣefḫaṫ kolhom be l-prefiks',
+'shortpages' => 'sfahi qssar',
+'longpages' => 'sfahi twila',
+'deadendpages' => 'sfahi andha nihaya msdoda',
+'protectedpages' => 'Ṣfaḫi mhmiya',
+'protectedtitles' => 'Ĝanawin meḫmiya',
+'listusers' => 'lista dyal lmostkhdimin',
+'listusers-editsonly' => 'Werri ġir l-mosṫeĥdimin li fayeṫ sahmo.',
+'listusers-creationsort' => 'JmeÄ Äla ḫsab ṫariÄ¥ l-ĥṫiraÄ',
+'usereditcount' => '$1 ṫeÄdil{{PLURAL:$1||aṫ}}',
+'usercreated' => "tnch' f $1 saaa $2",
+'newpages' => 'Ṣefḫaṫ jdad',
+'newpages-username' => 'Smiyṫ l-mosṫeĥdim:',
+'ancientpages' => 'aqdam sfahi',
+'move' => 'Neqqel',
+'movethispage' => 'Neqqel had ṣ-ṣefḫa',
+'notargettitle' => 'makanch hadaf',
+'notargettext' => 'mahdditch sfha lhadaf ola lmostkhdim bach tdir had lkhassiya',
+'nopagetitle' => 'makaynach sfha hadaf bhal hadi',
+'nopagetext' => 'sfha lhadaf li hdditiha makaynach',
+'pager-newer-n' => '{{PLURAL:$1|l-leĥĥra|$1 l-leĥĥrin}}',
+'pager-older-n' => '{{PLURAL:$1|l-qdima gaÄ|l-qdam gaÄ $1}}',
+'suppress' => 'Oversight',
+
+# Book sources
+'booksources' => 'Ĝyon l-kṫab',
+'booksources-search-legend' => 'Qelleb Äla l-kṫoba',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'Sir',
+
+# Special:Log
+'specialloguserlabel' => 'Mosṫeĥdim:',
+'speciallogtitlelabel' => "l'adresse:",
+'log' => 'Ĝamaliyaṫ',
+'all-logs-page' => 'kol sijillat laama',
+
+# Special:AllPages
+'allpages' => 'Ṣ-Ṣefḫaṫ kamlin',
+'alphaindexline' => 'Men $1 ḫṫal $2',
+'nextpage' => 'sfha jaya ($1)',
+'prevpage' => 'Ṣ-Ṣefḫa li qbel ($1)',
+'allpagesfrom' => 'Werri ṣ-ṣefḫaṫ li badyin men:',
+'allpagesto' => 'Werri ṣ-ṣefḫaṫ ḫṫal:',
+'allarticles' => 'Ṣ-Ṣefḫaṫ kolhom',
+'allinnamespace' => 'kol sfahi (f nitaq $1)',
+'allnotinnamespace' => 'kol sfahi (machi f nitaq $1)',
+'allpagesprev' => 'li sbq',
+'allpagesnext' => 'li jay',
+'allpagessubmit' => 'Sir',
+'allpagesprefix' => 'biyn sfahi katbda b:',
+
+# Special:Categories
+'categories' => 'tsnifat',
+'special-categories-sort-count' => 'rttb bladad',
+'special-categories-sort-abc' => 'rttb blhorof',
+
+# Special:DeletedContributions
+'sp-deletedcontributions-contribs' => 'L-mosahamaṫ',
+
+# Special:LinkSearch
+'linksearch' => 'L-lyanaṫ l-ĥarijiyin',
+'linksearch-pat' => 'namat lbaht:',
+'linksearch-ns' => 'Maḫel s-smiyyaṫ :',
+'linksearch-ok' => 'Qelleb',
+
+# Special:ListUsers
+'listusers-submit' => 'Werri',
+'listusers-noresult' => 'ta mostakhdim matlgach.',
+'listusers-blocked' => '(mbloki)',
+
+# Special:ActiveUsers
+'activeusers' => 'lista dyal lmostkhdimin nachtin',
+'activeusers-hidebots' => 'khbbi lbotat',
+'activeusers-hidesysops' => 'Khbbi lidariyin',
+'activeusers-noresult' => 'ta mostakhdim matlgach.',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Ṫariĥ dyal l-ḫsabaṫ j-jdad',
+'newuserlog-byemail' => "lmot de passe raha tsiftat f l'email",
+'newuserlog-create-entry' => 'Ḫsab jdid',
+'newuserlog-create2-entry' => 'ĥṫareÄ á¸«sab jdid $1',
+'newuserlog-autocreate-entry' => 'lcont tnchad automatikmen',
+
+# Special:ListGroupRights
+'listgrouprights' => 'salahiyat mjmoat lmostkhdimin',
+'listgrouprights-group' => 'majmoaa',
+'listgrouprights-rights' => 'salahiyat',
+'listgrouprights-members' => "Lisṫa dyal l-aÄá¸a'",
+'listgrouprights-addgroup' => "Zid aÄá¸a' fe l-mejmoÄa{{PLURAL:$2||ṫ}} : $1",
+'listgrouprights-addgroup-all' => 'zid gaa lmjmoat',
+'listgrouprights-removegroup-all' => 'hiyd gaa lmjmoat',
+
+# E-mail user
+'mailnologin' => 'Ma kayenÄ‹ l-Äonwan dyal l-morasil',
+'emailuser' => 'Ṣifet imayl le had l-mosṫeĥdim',
+'emailpage' => 'sift email lhad lmostkhdim',
+'defemailsubject' => 'Imayl dyal {{SITENAME}}',
+'usermaildisabled' => 'L-Mosṫeḫdim ma mĥeddemċ l-imayl dyalo.',
+'usermaildisabledtext' => 'Ma ymken lekċ ṫṣifet ċi imayl le l-mosṫeĥdimin l-ĥrin fe had l-wiki',
+'noemailtitle' => 'Ma kayen ḫṫa imayl',
+'noemailtext' => 'Had l-mosṫeÄ¥dim ma ÄendoÄ‹ imayl mqadd.',
+'nowikiemailtitle' => 'makaynch email msmoh bih',
+'nowikiemailtext' => 'Had l-mosṫeĥdim ma bġa iṫweṣṣel be ḫṫa ċi imayl men ay mosṫeḫdim.',
+'email-legend' => 'Sifet ċi imayl le ċi mosṫeĥdim aĥor dyal {{SITENAME}}',
+'emailfrom' => 'mn:',
+'emailto' => 'l:',
+'emailsubject' => 'lmawdoa:',
+'emailmessage' => 'risala:',
+'emailsend' => 'irssal',
+'emailccme' => 'sift noskha mn rissala dyali.',
+'emailccsubject' => 'copie rissala dyalk l $1: $2',
+'emailsent' => "l'email tsfit",
+'emailsenttext' => 'L-Imayl dyalek ṫṣifet mezyan.',
+'emailuserfooter' => 'Had l-imayl ṣifto « $1 » le « $2 » be waṣitaṫ « Ṣifet ċi imayl le l-mosṫeḫdim » fe {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Ĥella waḫed l-meṣaj sistém.',
+'usermessage-editor' => 'Morasil s-sistém',
+
+# Watchlist
+'watchlist' => 'L-Lista de s-suivi dyalṫi',
+'mywatchlist' => 'L-Lista dyal s-suivi',
+'watchlistfor2' => 'Le $1 $2',
+'nowatchlist' => 'Ma kayna ḫṫa ċi ṣefḫa fe l-lista dyal s-suivi dyalṫek.',
+'watchlistanontext' => 'Ĝafak $1 baċ ṫċof ola baċ ṫṣayeb ṣ-ṣefḫaṫ li fe l-lista dyal s-suivi.',
+'watchnologin' => 'nta mamkoniktich',
+'watchnologintext' => 'Ĥaṣṣek ṫkon [[Special:UserLogin|dĥelṫi le ḫsabek]] baċ ṫṣayeb l-lista dyal s-suivi.',
+'addedwatch' => 'Ṫzadeṫ le l-lista dyal s-suivi',
+'addedwatchtext' => "Ṣ-Ṣefḫa \"[[:\$1]]\" ṫzadeṫ le [[Special:Watchlist|l-lista dyal s-suivi dyalṫek]].
+Ṫ-Ṫeġyiraṫ j-jayyin dyal had ṣ-ṣefḫa o dyal ṣ-ṣefḫa de n-niqaċ l-mnasba ġayṫċejjlo fiha.
+L-Kṫaba dyal had á¹£-á¹£efḫa Ä¡aṫban '''Ä¡liá¸a''' fe [[Special:RecentChanges|l-lista dyal ṫ-ṫeÄdilaṫ l-leĥĥrin]] baÄ‹ ṫeshal Älik l-qadiya.",
+'removedwatch' => 'Mmḫiya men l-lista dyal s-suivi',
+'removedwatchtext' => 'Ṫemḫaṫ ṣ-ṣefḫa "[[:$1]]" men [[Special:Watchlist|ṣ-ṣefḫa de s-suivi dyalṫek]].',
+'watch' => 'Ḫá¸i',
+'watchthispage' => 'ṪebbeÄ had á¹£-á¹£efḫa',
+'unwatch' => 'Ma tbqaÄ‹ tḫá¸i.',
+'unwatchthispage' => 'hiyd mn list dyal s-suivi dyali',
+'notanarticle' => 'Hadi maÄ‹i á¹£efḫaṫ meá¸mon',
+'watchlist-details' => '{{PLURAL:$1|ṣefḫa weḫda|$1 de ṣ-ṣefḫaṫ}} kaynin fe l-lista dyal s-suivi dyalṫek, bla ma nḫesbo ṣ-ṣefḫaṫ dyal n-niqaċ.',
+'wlshowlast' => 'Werri l-$1 de s-swayeÄ o l-$2 iyam l-leĥĥrin, ola werri $3',
+'watchlist-options' => 'Lé-Opsyon de l-lista dyal s-suivi',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Kayraqeb...',
+'unwatching' => "Nihayaṫ 's-suivi...",
+
+'enotif_mailer' => '{{SITENAME}} nidam lbaridi',
+'enotif_reset' => 'Qiyyed ṣ-ṣefḫaṫ bḫal la zerṫihom kamlin',
+'enotif_impersonal_salutation' => 'Mosṫeḫdim {{SITENAME}}',
+'changed' => 'Beddel',
+'created' => "tnch'at",
+'enotif_subject' => 'Ṣ-Ṣefḫa $PAGETITLE dyal {{SITENAME}} $CHANGEDORCREATEDha $PAGEEDITOR',
+'enotif_lastvisited' => 'Sir ċof $1 baċ ṫċof ṫ-ṫeġyiraṫ kamlin men ziyarṫek l-leĥĥraniya.',
+'enotif_lastdiff' => 'Ċof $1 baċ ṫċof had ṫ-ṫeġyiraṫ.',
+'enotif_anon_editor' => 'mosṫeĥdim ma mċejjelċ $1',
+
+# Delete
+'deletepage' => "Mḫi had 'ṣ-ṣefḫa",
+'confirm' => 'konfirmi',
+'excontent' => 'lmohtawa kan : "$1"',
+'exblank' => 'sfha kant khawya',
+'delete-confirm' => 'suprimi "$1"',
+'delete-backlink' => '↠$1',
+'delete-legend' => 'Suprimi',
+'confirmdeletetext' => 'Ĝendak rah ġadi ṫemḫi ċi ṣefḫa ola fiċyé, o ḫṫa lé-vérsyon li fe ṫ-ṫariĥ.
+Äœafak ekked belli hadÄ‹i howa li baÄ¡i ṫdir, belli nṫa fahem l-ahammiya dyalo, o belli kaṫdir hadÄ‹i be ṫ-ṫowfiq dyal [[{{MediaWiki:Policy-url}}|l-qawaÄid d-daÄ¥iliya]].',
+'actioncomplete' => 'Ṫsalaṫ l-Äamaliya',
+'actionfailed' => 'Ma á¹£eá¸qaṫċ',
+'deletedtext' => '« <nowiki>$1</nowiki> » ṫemḫa.
+Ċof $2 ila bġiṫi ċi lista dyal kolċi li ṫemḫa aĥiran.',
+'deletedarticle' => 'memḫi "[[$1]]"',
+'suppressedarticle' => 'mḫa "[[$1]]"',
+'dellogpage' => 'Ṫ-Ṫariĥ dyal ṣ-ṣefḫaṫ li ṫṫemḫaw',
+'dellogpagetext' => 'Ha hiya l-lista dyal dakÄ‹i li Äad ṫṫemḫa.',
+'deletionlog' => 'Ṫ-Ṫariĥ dyal ṣ-ṣefḫaṫ li ṫṫemḫaw',
+'reverted' => 'L-Vérsyon li men qbel rejÄaṫ.',
+'deletecomment' => 'S-Sbab:',
+'deleteotherreason' => 'Sabab weḫdaĥor/zayed:',
+'deletereasonotherlist' => 'Sabab weḫdaĥor',
+'delete-edit-reasonlist' => 'aadl asbab lhadf',
+
+# Rollback
+'rollback' => 'tjjea taadilat',
+'rollback_short' => 'RjeÄ l-lor',
+'rollbacklink' => 'RjeÄ l-lor',
+'rollbackfailed' => 'rjoaa mankhch',
+
+# Protect
+'protectlogpage' => 'Ṫariĥ l-ḫimaya',
+'protectedarticle' => 'ḫma "[[$1]]"',
+'modifiedarticleprotection' => 'beddel l-mosṫawa de l-ḫimaya dyal « [[$1]] »',
+'unprotectedarticle' => 'ḫma "[[$1]]"',
+'protect-backlink' => '↠$1',
+'protectcomment' => 'S-Sbab:',
+'protectexpiry' => 'Ġayṫqada fe:',
+'protect_expiry_invalid' => 'Daz Älih l-oqeṫ.',
+'protect_expiry_old' => 'L-oqeṫ dyal n-nihaya fe l-maá¸i.',
+'protect-text' => "Hnaya ṫeqá¸er tÄ‹of o ṫbeddel l-mostawa de l-ḫimaya dyal á¹£-á¹£efḫa '''<nowiki>$1</nowiki>'''.",
+'protect-locked-access' => "Ḫsabek ma ÄendoÄ‹ l-ḫaqq baÄ‹ ibeddel l-mosṫawa de l-ḫimaya dyal á¹£-á¹£efḫa.
+Hnaya ġadi ṫelqa lé-ééglaj l-leĥĥrin dyal ṣ-ṣefḫa '''$1''':",
+'protect-cascadeon' => 'Had á¹£-á¹£efḫa raha meḫmiya ḫiṫ hiya daÄ¥el {{PLURAL:$1|had á¹£-á¹£efḫa, li ṫṫeḫmaṫ|had á¹£-á¹£efḫaṫ, li ṫṫeḫmaw}} be l-opsyon "ḫimaya moá¸mana" Ä¥eddama.
+Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had á¹£-á¹£efḫa bla ma i\'eṫṫer hadÄ‹i l-ḫimaya l-moá¸mana.',
+'protect-default' => 'Ĥelli l-mosṫeĥdimin kolhom',
+'protect-fallback' => "Tleb l-'idn $1",
+'protect-level-autoconfirmed' => 'Bloki l-mosṫeĥdimin j-jdad o li ma mċejjlinċ',
+'protect-level-sysop' => 'L-modirin boḫdhom',
+'protect-summary-cascade' => 'Moá¸mana',
+'protect-expiring' => 'Ä ayṫqada nhar $2 mÄa s-saÄa $3',
+'protect-expiry-indefinite' => 'mamhddch',
+'protect-cascade' => 'Ḫami Äla á¹£-á¹£efḫaṫ li fe had á¹£-á¹£efḫa (ḫimaya moá¸mana)',
+'protect-cantedit' => 'Ma imken lekÄ‹ ṫbeddel l-mosṫawa de l-ḫimaya dyal had á¹£-á¹£efḫa ḫiṫ ma ÄendekÄ‹ l-ḫeqq baÄ‹ ṫbeddlo.',
+'protect-othertime' => 'waqt akhr:',
+'protect-othertime-op' => 'waqt akhr',
+'protect-otherreason' => 'Sabab weḫdaĥor/zayed:',
+'protect-otherreason-op' => 'Sabab weḫdaĥor',
+'restriction-type' => "L-'idn:",
+'restriction-level' => 'Mosṫawa á¸-á¸wabet',
+'minimum-size' => 'L-Qyas á¹£-ṣġir gaÄ',
+'maximum-size' => 'L-Qyas l-kbir gaÄ',
+'pagesize' => '(okté)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'á¹¢ayeb',
+'restriction-move' => 'Neqqel',
+'restriction-create' => 'ĤṫareÄ',
+'restriction-upload' => 'Øplowdi',
+
+# Restriction levels
+'restriction-level-sysop' => 'ḫimaya kamla',
+'restriction-level-autoconfirmed' => 'ḫimaya ma kamlaċ',
+'restriction-level-all' => 'ay mosṫawa',
+
+# Undelete
+'undelete' => 'Ċof ṣ-ṣefḫaṫ l-memḫiyyin',
+'undeletepage' => 'Ċof o qad ṣ-ṣefḫaṫ l-memḫiyyin',
+'undeletepagetitle' => "'''Had l-lista fiha morajaÄaṫ memḫiya men [[:$1|$1]]'''",
+'undelete-nodiff' => 'lam yatim lotor ala moraja sabiqa.',
+'undeletebtn' => 'strjaa',
+'undeletelink' => 'Biyyen/Ĥebbi',
+'undeleteviewlink' => 'chof',
+'undeletereset' => 'aawd regli',
+'undeleteinvert' => 'Qleb dakÄ‹i li Äzelṫi',
+'undeletecomment' => 'S-Sabab',
+'undeletedarticle' => 'sṫerjeÄ "[[$1]]"',
+'undeletedrevisions' => '{{PLURAL:$1|vérsyon weḫda rejÄaṫ ki kaneṫ|$1 de lé-vérsyon rejÄo ki kano}}',
+'undelete-search-box' => 'Qelleb Äla Ä‹i á¹£-á¹£efḫaṫ memḫiya',
+'undelete-search-submit' => 'Qelleb',
+'undelete-error-short' => 'Tá¹›a waḫed l-Ä¡alat fe sṫirjaÄ l-fiÄ‹yé : $1',
+'undelete-show-file-submit' => 'iyih',
+
+# Namespace form on various pages
+'namespace' => 'Maḫel s-smiyyaṫ :',
+'invert' => "Qleb 's-séléksyon",
+'blanknamespace' => "(Re'si)",
+
+# Contributions
+'contributions' => 'L-mosahamaṫ dyal l-mosṫeĥdim',
+'contributions-title' => 'L-Mosahamaṫ dyal $1',
+'mycontris' => 'L-mosahamaṫ dyawli',
+'contribsub2' => 'Le $1 ($2)',
+'uctop' => '(l-foq)',
+'month' => 'Men Ä‹her (o qdem)',
+'year' => 'Men Äam (o men qbel)',
+
+'sp-contributions-newbies' => 'Werri ġir l-mosahamaṫ dyal l-mosṫeĥdimin j-jdad',
+'sp-contributions-newbies-sub' => 'Le ḫsabaṫ jdad',
+'sp-contributions-newbies-title' => 'mosahamat lmostkhdim lilhassabat jdida',
+'sp-contributions-blocklog' => 'Ṫariĥ l-blokajaṫ',
+'sp-contributions-deleted' => 'mosahamaṫ memḫiya',
+'sp-contributions-talk' => 'ṫnaqeċ',
+'sp-contributions-search' => 'Qelleb Äla Ä‹i mosahamaṫ',
+'sp-contributions-username' => 'Ĝonwan IP ola smiyṫ l-mosṫeĥdim',
+'sp-contributions-submit' => 'Qelleb',
+
+# What links here
+'whatlinkshere' => 'Ṣefḫaṫ mlaqyin',
+'whatlinkshere-title' => 'á¹¢-á¹¢efḫaṫ li mlaqyin mÄa "$1"',
+'whatlinkshere-page' => 'Ṣefḫa',
+'whatlinkshere-backlink' => '↠$1',
+'linkshere' => "Had ṣ-ṣefḫaṫ kayddiw le '''[[:$1]]''':",
+'isredirect' => 'Ṫeḫwil ṣ-ṣefḫa',
+'istemplate' => 'Daĥel',
+'isimage' => 'lyan ṫ-ṫeṣwira',
+'whatlinkshere-prev' => '{{PLURAL:$1|li qbel|$1 li qbel}}',
+'whatlinkshere-next' => '{{PLURAL:$1|li mbeÄd|$1 li mbeÄd}}',
+'whatlinkshere-links' => '↠lyanaṫ',
+'whatlinkshere-hideredirs' => '$1 ṫ-ṫeḫwilaṫ',
+'whatlinkshere-hidetrans' => '$1 ṫ-ṫeá¸minaṫ',
+'whatlinkshere-hidelinks' => '$1 l-lyanaṫ',
+'whatlinkshere-filters' => 'Filter',
+
+# Block/unblock
+'blockip' => 'Bloké l-mosṫeĥdim',
+'blockip-title' => 'Bloki l-mosṫeḫdim',
+'blockip-legend' => 'Bloki l-mosṫeḫdim',
+'ipaddress' => 'Äœonwan IP:',
+'ipadressorusername' => 'Ĝonwan IP ola smiyṫ l-mosṫeĥdim',
+'ipbexpiry' => 'Ġayṫqada fe :',
+'ipbreason' => 'S-Sabab',
+'ipbreasonotherlist' => 'Sabab weḫdaĥor',
+'ipbanononly' => 'Bloki ġir l-mosṫeḫdimin li ma mċejjlinċ',
+'ipbcreateaccount' => 'MneÄ Ä¥á¹«iraÄ Ä‹i ḫsab',
+'ipbemailban' => 'Ma ṫĥelliċ l-mosṫeĥdim yṣifet ċi imayl',
+'ipbenableautoblock' => 'Bloki otomaṫikiyan l-Äonwan IP l-leĥĥrani li sṫeÄmlo l-mosṫeḫdim o l-Äanawin IP li qbel mennha li ymken lo yÄawed ysṫeÄmelhom.',
+'ipbsubmit' => 'Bloki had l-mosṫeĥdim',
+'ipbother' => 'weqṫ aĥor :',
+'ipboptions' => '2 swayeÄ:2 hours,nhar:1 day,3 iyam:3 days,ṣémana:1 week,2 ṣémanaṫ:2 weeks,Ä‹her:1 month,3 Ä‹hor:3 months,6 Ä‹hor:6 months,Äam:1 year,ma kayṫsalaÄ‹:infinite',
+'ipbotheroption' => 'ḫwayej ĥrin',
+'ipbotherreason' => 'Sabab weḫdaĥor/zayed:',
+'ipbhidename' => 'Ĥebbi smiyṫ l-mosṫeĥdim men ṫ-ṫeġyiraṫ o men l-listaṫ',
+'ipbwatchuser' => 'ṪbeÄ á¹£-á¹£efḫaṫ dyal l-mosṫeḫdim o de n-niqaÄ‹ dyal had l-mosṫeÄ¥dim',
+'ipballowusertalk' => 'Ĥelli had l-mosṫeĥdim yṣayeb ṣfeḫṫo dyal n-niqaċ faċ ykon mbloki',
+'ipb-change-block' => "Äœawed bloki had l-mosṫeÄ¥dim be had l-'iÄdadaṫ",
+'badipaddress' => 'Äœonwan IP Ä¡alet',
+'blockipsuccesssub' => 'Blokaj najeḫ',
+'ipb-edit-dropdown' => 'Beddel asbab l-blokaj',
+'ipb-unblock-addr' => 'Débloki $1',
+'ipb-unblock' => 'Débloki Ä‹i ḫsab dyal l-mosṫeÄ¥dim ola Äonwan IP',
+'ipb-blocklist' => 'Ċof lé-blokaj li fayeṫ kaynin',
+'ipb-blocklist-contribs' => 'L-Mosahamaṫ dyal $1',
+'unblockip' => 'Débloki Ä‹i mosṫeÄ¥dim ola Ä‹i Äonwan IP',
+'ipusubmit' => 'Mḫi l-blokaj',
+'unblocked' => '[[User:$1|$1]] ma bqaċ mbloki',
+'unblocked-id' => 'L-Blokaj $1 ṫṫemḫa',
+'ipblocklist' => 'Ĝanawin IP o smiyyaṫ l-mosṫeĥdim meḫbosin',
+'ipblocklist-legend' => 'Qelleb Äla Ä‹i mosṫeÄ¥dim memḫi',
+'ipblocklist-username' => 'Smiyṫ l-mosṫeÄ¥dim ola l-Äonwan IP',
+'ipblocklist-sh-userblocks' => '$1 lé-blokaj dyal l-ḫsabaṫ',
+'ipblocklist-sh-tempblocks' => "$1 lé-blokaj l-mo'eqqaṫa",
+'ipblocklist-sh-addressblocks' => '$1 lé-blokaj dyal l-Äanawin IP boḫdhom',
+'ipblocklist-submit' => 'Qelleb',
+'ipblocklist-localblock' => 'Blokaj maḫalli',
+'ipblocklist-otherblocks' => 'Blokaj {{PLURAL:$1|weḫdaĥor|weḫdaĥrin}}',
+'blocklistline' => '$1 : $2 bloka $3 ; $4',
+'infiniteblock' => 'ma kayṫsalaċ',
+'expiringblock' => 'Ä¡ayṫqada nhar $1 mÄa $2',
+'anononlyblock' => 'ġir l-mosṫeĥdim li ma mċejjelċ',
+'noautoblockblock' => 'blokaj otomaṫiki mḫiyyed',
+'createaccountblock' => 'memnoÄ á¹«sayeb Ä‹i ḫsab',
+'emailblock' => 'imayl mbloki',
+'blocklist-nousertalk' => 'ma ymken loċ yṣayeb ṣfeḫṫo dyal n-niqaċ',
+'ipblocklist-empty' => 'L-Lista dyal l-Äanawin IP li mblokyin raha daba Ä¥awya.',
+'ipblocklist-no-results' => 'L-Ĝonwan IP ola l-mosṫeĥdim li tlebṫiw ma mblokiċ.',
+'blocklink' => 'Bloki',
+'unblocklink' => 'Ḫiyyed l-manÄ',
+'change-blocklink' => 'beddel l-manÄ',
+'contribslink' => 'Mosahamaṫ',
+'blocklogpage' => 'Ṫariĥ l-blokajaṫ',
+'blocklogentry' => 'bloka [[$1]] limoddaṫ $2 $3',
+'unblocklogentry' => 'débloka $1',
+'block-log-flags-anononly' => 'Ġir l-mosṫeĥdimin li ma mċejjlinċ',
+'block-log-flags-nocreate' => 'mmnoÄ á¹«sayeb Ä‹i ḫsab',
+'block-log-flags-noautoblock' => 'blokaj otomaṫiki dyal l-Äanawin IP mḫiyyed',
+'block-log-flags-noemail' => 'imayl mbloki',
+'block-log-flags-nousertalk' => 'ma ymken loċ yṣayeb ṣfeḫṫo dyal n-niqaċ',
+'block-log-flags-angry-autoblock' => 'blokaj otomaṫiki mḫessen ĥeddam',
+'block-log-flags-hiddenname' => 'smiyṫ l-mosṫeĥdim mĥebbya',
+'ipb_expiry_invalid' => 'L-weqṫ li bqa ġalet.',
+'ipb_expiry_temp' => 'L-Blokaj dyal s-smiyyaṫ dyal l-mosṫeĥdimin l-mĥebbyin ĥaṣṣo ybqa dima.',
+'ipb_already_blocked' => '"$1" rah fayeṫ mbloki',
+'ipb-otherblocks-header' => 'Blokaj {{PLURAL:$1|weḫdaĥor|weḫdaĥrin}}',
+'sorbs' => 'DNSBL',
+
+# Developer tools
+'lockconfirm' => "Ah, kan'ekked belli bġiṫ neġleq l-bazdødoné",
+'unlockconfirm' => 'Ah, beṣṣeḫ bġiṫ nḫell l-bazdødoné.',
+'lockbtn' => 'Ġleq l-bazdødoné',
+'unlockbtn' => 'Ḫell l-bazdødoné',
+'locknoconfirm' => "Ma qiyyedṫiċ sendok ṫ-ṫe'kid.",
+'lockdbsuccesssub' => 'Iqfal l-bazdødoné njeḫ',
+'unlockdbsuccesssub' => 'Iqfal l-bazdødoné ṫṫemḫa',
+'unlockdbsuccesstext' => 'L-Bazdødoné raha ṫṫḫellaṫ.',
+'databasenotlocked' => 'L-Bazdødoné raha ma meġloqaċ.',
+
+# Move page
+'move-page' => 'Neqqel $1',
+'move-page-backlink' => '↠$1',
+'move-page-legend' => 'Neqqel ṣ-ṣefḫa',
+'movepagetext' => "Ila sṫeÄmelṫi l-formulér li l-ṫeḫṫ, Ä‹i á¹£efḫa Ä¡adi ṫÄawed ṫṫsemma o Ä¡adi ṫneqqel ṫ-ṫariÄ¥ kollo le s-smiya j-jdida.
+L-Äœonwan l-qdim Ä¡adi iwelli á¹£efḫa jdida li Ä¡adi ṫḫowwlek le l-Äonwan j-jdid.
+Imken lek ṫjedded otomaṫikiyan ṫ-ṫeḫwilaṫ li kayddiw le l-Äonwan l-'aá¹£li.
+Ila ma bÄ¡iṫiÄ‹, ṫ'ekked ma ṫeḫá¸i kolla [[Special:DoubleRedirects|dobl-ṫeḫwila]] ola koll [[Special:BrokenRedirects|ṫ-ṫeḫwilaṫ l-mherrsin]].
+Rak mes'ol baċ ṫraqeb ila l-lyanaṫ baqyin kayddiw le l-maḫel fin ĥaṣṣhom iddiwek.
+
+Laḫed belli á¹£-á¹£efḫa '''ma Ä¡adiÄ‹''' ṫṫneqqel ila fayeṫ kayna Ä‹i á¹£efḫa be had l-Äonwan, illa ila kaneṫ Ä¥awya ola Ä‹i ṫeḫwil ma Äendo ḫṫa ṫariÄ¥ dyal ṫeÄdilaṫ fayeṫ.
+MeÄniyṫha imken lek ṫÄawed ṫrejjeÄ l-Äonwan l-'aá¹£li ila konṫi Ä¡letṫi, o ma imken lekÄ‹ ṫekṫeb Äla á¹£efḫa mojoda.
+
+'''Äœendak!'''
+Imken hadċi y'eddi ṫeġyiraṫ hammin ila kaneṫ ċi ṣefḫa kayqrawha n-nas bezzaf;
+Äœafak kon mṫ'ekked belli nṫa Äaref Ä‹no kaṫdir qbel ma ṫebda ay ḫaja.",
+'movepagetalktext' => "Ila kaneṫ Ä‹i á¹£efḫa dyal n-niqaÄ‹ mÄaha, Ä¡adi ṫÄawed ṫṫsemma otomaṫikiyan '''illa ila:'''
+* neqqelṫi ṣ-ṣefḫa le maḫel de s-smiyaṫ weḫdaĥor, ola
+* ṣefḫa dyal n-niqaċ ma ĥawyaċ msemmya bḫal bḫal, ola
+* brekṫi Äla l-Äalama li men l-ṫeḫṫ.",
+'movearticle' => 'Neqqel ṣ-ṣefḫa',
+'movenologin' => 'Mdékonnékti',
+'movenotallowed' => 'Ma ÄendekÄ‹ l-heqq ṫneqqel á¹£-á¹£efḫaṫ.',
+'movenotallowedfile' => 'Ma ÄendekÄ‹ l-heqq ṫneqqel lé-fiÄ‹yé.',
+'cant-move-user-page' => "Ma ÄendekÄ‹ l-ḫeqq ṫneqqel á¹£-á¹£efḫaṫ r-ra'isiyya.",
+'newtitle' => 'Le Ä‹i Äonwan jdid',
+'move-watch' => 'ṪebbeÄ had á¹£-á¹£efḫa',
+'movepagebtn' => 'Neqqel ṣ-ṣefḫa',
+'pagemovedsub' => 'Neqqelna ṣfeḫṫek be najaḫ',
+'movepage-moved' => '\'\'\'Neqqelna "$1" fe "$2"\'\'\'',
+'movepage-moved-redirect' => 'Ṫeḫwil men s-smiya l-qidima ṫeĥṫarÄaṫ.',
+'articleexists' => 'Fayeṫ kayna ṣefḫa be had s-smiyya, ola s-smiyya li ĥṫariṫi ma ṣalḫaċ.
+Ĝafak ĥṫar smiyya weḫdaḫra.',
+'talkexists' => "'''á¹¢-á¹¢efḫa ṫṫneqqlaṫ be najaḫ, walayenni á¹£-á¹£efḫa de l-modakara ma ṫṫneqqlaṫċ ḫiṫ fayeṫ kayna Ä‹i weḫda be had l-Äonwan.
+Ĝafak fuzyonéhom be yiddek.'''",
+'movedto' => 'ṫsemmaṫ',
+'movetalk' => 'Neqqel á¹£-á¹£efḫa dyal n-niqaÄ‹ li mlaqya mÄah',
+'move-subpages' => 'Neqqel á¹£-á¹£efḫaṫ l-ferÄiyya (ḫṫal $1)',
+'move-talk-subpages' => 'Neqqel á¹£-á¹£efḫaṫ l-ferÄiya dyal á¹£-á¹£efḫa de n-niqaÄ‹ (ḫṫal $1)',
+'movepage-page-exists' => 'Ṣ-Ṣefḫa $1 fayeṫ kayna o ma ymken lhaċ ṫṫemḫa otomaṫikiyan.',
+'movepage-page-moved' => 'Ṣ-Ṣefḫa $1 wellaṫ smiyyṫha $2',
+'movepage-page-unmoved' => 'á¹¢-á¹¢efḫa $1 ma qeá¸raṫċ ṫwelli $2.',
+'1movedto2' => 'neqqel [[$1]] ḫṫal [[$2]]',
+'1movedto2_redir' => 'neqqel [[$1]] le [[$2]] foq ṫ-ṫeḫwila dyalṫha',
+'move-redirect-suppressed' => 'Ṫ-Ṫeḫwil ṫṫemḫa',
+'movelogpage' => 'Ṫariĥ n-naql',
+'movelogpagetext' => 'Ha hiya l-lista dyal ṣ-ṣefḫaṫ kamlin li ṫneqqlo.',
+'movesubpage' => '{{PLURAL:$1|á¹¢efḫa ferÄiyya|á¹¢efḫaṫ ferÄiyya}}',
+'movenosubpage' => 'Had á¹£-á¹£efḫa ma fiha ḫṫa Ä‹i á¹£efḫa ferÄiyya.',
+'movereason' => 'S-Sbab:',
+'revertmove' => 'RejjeÄ',
+'delete_and_move' => 'Mḫi o neqqel',
+'delete_and_move_confirm' => 'Ah, mḫi ṣ-ṣefḫa',
+
+# Export
+'export' => 'Éxporté ċi ṣefḫaṫ',
+'export-submit' => 'khrj',
+'export-addcattext' => 'zid sfahi mn tsnif :',
+'export-addcat' => 'zid',
+'export-addnstext' => 'zid sfahi mn had nitaq:',
+'export-addns' => 'zid',
+'export-download' => 'sjjl had lfichier',
+'export-templates' => 'dimn lqwalb',
+'export-pagelinks' => 'dimn sfahi lmawsla lomq:',
+
+# Namespace 8 related
+'allmessages' => "rasa'il nidam",
+'allmessagesname' => 'smiya',
+'allmessages-filter-legend' => 'Filter',
+'allmessages-filter-unmodified' => 'mamaadlch',
+'allmessages-filter-all' => 'Kolċi',
+'allmessages-filter-modified' => 'lmoaddal',
+'allmessages-prefix' => 'filtri hassab lprefix',
+'allmessages-language' => 'Loġa:',
+'allmessages-filter-submit' => 'Sir',
+
+# Thumbnails
+'thumbnail-more' => 'Kebber',
+'filemissing' => 'fichier makaynch',
+
+# Special:Import
+'import' => 'Éxporté ċi ṣefḫaṫ',
+'import-interwiki-submit' => 'importé',
+'import-upload-filename' => 'smiyt lfichier:',
+'import-comment' => 'taÄœelleq:',
+
+# Import log
+'importlogpage' => "sijjil dyal l'import",
+'import-logentry-interwiki' => 'importé blwiki $1',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Ṣ-Ṣefḫa de l-mosṫeĥdim dyalṫek',
+'tooltip-pt-mytalk' => 'Ṣfeḫṫek dyal n-niqaċ',
+'tooltip-pt-preferences' => 'Li kaṫfeddel',
+'tooltip-pt-watchlist' => 'L-Lista dyal á¹£-á¹£efḫaṫ li kaṫṫebbÄo',
+'tooltip-pt-mycontris' => 'L-Lista dyal mosahamaṫek',
+'tooltip-pt-login' => 'Ḫsen lik ṫṫkonékta{{GENDER:||e|(y)}}, walakin maÄ‹i á¸arori.',
+'tooltip-pt-logout' => 'Ṫdékonékta',
+'tooltip-ca-talk' => 'Modakara Äla l-li fe had á¹£-á¹£efḫa',
+'tooltip-ca-edit' => 'Imkenlik ṫṣayeb had ṣ-ṣefḫa.
+Äœafak sṫeÄmel l-boton dyal l-prévizualizasyon qbel ma ṫċejjel',
+'tooltip-ca-addsection' => 'Bda séksyon jdida',
+'tooltip-ca-viewsource' => 'Had ṣ-ṣefḫa mḫamya.
+Imken lek ṫċof l-Äin dyalha.',
+'tooltip-ca-history' => 'L-vérsyonaṫ l-qdam dyal had ṣ-ṣefḫa',
+'tooltip-ca-protect' => 'Ḫami Äla had á¹£-á¹£efḫa',
+'tooltip-ca-delete' => 'Mḫi had ṣ-ṣefḫa',
+'tooltip-ca-move' => 'Neqqel had ṣ-ṣefḫa',
+'tooltip-ca-watch' => 'Zid had ṣ-ṣefḫa le l-lista dyal s-suivi',
+'tooltip-ca-unwatch' => 'Ḫiyyed had ṣ-ṣefḫa men l-lista dyal s-suivi dyalṫek',
+'tooltip-search' => 'Qelleb fe {{SITENAME}}',
+'tooltip-search-go' => 'Sir le Ä‹i sefḫa l-li Äendha nefs s-smiya, ila kaneṫ',
+'tooltip-search-fulltext' => 'Qelleb Äla á¹£-á¹£efḫaṫ li fihom had n-neá¹£',
+'tooltip-p-logo' => 'ṣefḫaṫ l-sṫiqbal',
+'tooltip-n-mainpage' => 'Sir le ṣ-ṣefḫa de l-sṫiqbal',
+'tooltip-n-mainpage-description' => 'Sir le ṣefḫaṫ l-sṫiqbal',
+'tooltip-n-portal' => 'Äœel l-meÄ‹roÄ ; Ä‹no imken lek ṫdir ; fin ṫelqa ḫajaṫ li ṫeḫṫajhom',
+'tooltip-n-currentevents' => 'Ċof deġya aċ tari daba',
+'tooltip-n-recentchanges' => 'Lisṫa dyal ṫ-ṫeġyiraṫ l-leĥrin fe l-wiki',
+'tooltip-n-randompage' => 'ÄŠarji Ä‹i á¹£efḫa Äe L-Lah',
+'tooltip-n-help' => 'MosaÄada',
+'tooltip-t-whatlinkshere' => 'Lisṫa dyal á¹£-á¹£efḫaṫ kamlin li mlaqyin mÄa hadi',
+'tooltip-t-recentchangeslinked' => 'Lisṫa dyal ṫ-ṫeÄ¡yiraṫ l-leĥĥrin dyal á¹£-á¹£efḫaṫ l-li mlaqyin mÄa hadi',
+'tooltip-feed-rss' => 'L-Flu RSS dyal had ṣ-ṣefḫa',
+'tooltip-feed-atom' => 'L-Flu Atom dyal had ṣ-ṣefḫa',
+'tooltip-t-contributions' => 'ÄŠof l-lista dyal mosahamaṫ had l-mosṫeÄmil',
+'tooltip-t-emailuser' => 'Ṣifet imayl le had l-mosṫeĥdim',
+'tooltip-t-upload' => 'Ṣifet ci fiċyé',
+'tooltip-t-specialpages' => 'Lisṫa dyal ṣ-sefḫaṫ l-ĥaṣin kollhom',
+'tooltip-t-print' => 'Vérsyon dyal á¹£-á¹£efḫa l-li imken lik ṫetbeÄ',
+'tooltip-t-permalink' => 'Lyan dayem le had l-vérsyon dyal ṣ-ṣefḫa',
+'tooltip-ca-nstab-main' => 'Ċof l-li fe ṣ-ṣefḫa',
+'tooltip-ca-nstab-user' => 'Ċof ṣ-ṣefḫa de l-mosṫeĥdim',
+'tooltip-ca-nstab-media' => 'tchof sfht lmedia',
+'tooltip-ca-nstab-special' => 'Hadi ṣefḫa ĥaṣa, ma imkenlikċ ṫṣayebha',
+'tooltip-ca-nstab-project' => 'ÄŠof á¹£-á¹£efḫa dyal l-meÄ‹roÄ',
+'tooltip-ca-nstab-image' => 'ċof ṣ-ṣefḫa dyal l-fiċyé',
+'tooltip-ca-nstab-mediawiki' => "tcouf rasa'il nidam",
+'tooltip-ca-nstab-template' => 'ÄŠof á¹£-á¹£efḫa de l-meá¸mon',
+'tooltip-ca-nstab-help' => 'Ċof ṣ-ṣefḫa de l-mosaaada',
+'tooltip-ca-nstab-category' => 'Ċof l-katégori dyal ṣ-ṣefḫa',
+'tooltip-minoredit' => 'Äœelmo bḫal Ä‹i ṫeÄdil ma mohimÄ‹',
+'tooltip-save' => 'Ċejjel ṫ-ṫeġyiraṫ dyawlek',
+'tooltip-preview' => 'ÄŠof Ä‹no beddelti, Äafak steÄ¥dem hadi qbel ma ṫċejjel !',
+'tooltip-diff' => 'Werri ċno li beddelṫi fe n-neṣ',
+'tooltip-compareselectedversions' => 'Werri ṫ-ṫeÄ¡yiraṫ mabin lé-vérsyon l-meÄzolin dyal had á¹£-á¹£efḫa',
+'tooltip-watch' => 'Ḫá¸i had s-sefḫa',
+'tooltip-upload' => 'bda rafaa',
+'tooltip-rollback' => '« SṫerjeÄ Â» kaybettel be klik waḫed ṫeÄ¡yir(aṫ) dyal had á¹£-á¹£efḫa be l-mosahim l-leĥĥer.',
+'tooltip-undo' => '"RejjeÄ ki \'ma kan" kaysṫerjeÄ li sayebṫi o kayḫell Ä‹erjem weḫdaÄ¥or ka prévizualizasyon. Kaṫĥellik ṫzid Ä‹i sabab fe sendoq l-moleĥĥaá¹£aṫ.',
+'tooltip-preferences-save' => 'sjjl taghyirat',
+'tooltip-summary' => 'dkhl molkhass qssir',
+
+# Stylesheets
+'common.css' => '/* CSS placed here will be applied to all skins */',
+
+# Attribution
+'others' => 'khrin',
+'creditspage' => 'ichadat sfha',
+
+# Spam protection
+'spambot_username' => 'tandif spam mediawiki',
+
+# Info page
+'numedits' => 'adad taadilat (sfha) : $1',
+'numtalkedits' => 'adad taadilat (sfht niqach): $1',
+'numwatchers' => 'adad lmmoraqibin: $1',
+
+# Math options
+'mw_math_png' => 'dima biyn bhal PNG',
+
+# Math errors
+'math_failure' => 'khata flmat',
+'math_unknown_error' => 'khat mjhol',
+'math_unknown_function' => 'wadifa mjhola',
+'math_lexing_error' => 'khata fsigha',
+'math_syntax_error' => 'khata fsiyagha',
+
+# Patrolling
+'markaspatrolleddiff' => 'marki kamorajaaa',
+
+# Patrol log
+'patrol-log-auto' => '(otomatik)',
+'patrol-log-diff' => 'morajaa $1',
+'log-show-hide-patrol' => '$1 sijjil lkhafr',
+
+# Browsing diffs
+'previousdiff' => 'Ṫ-ṪeÄdil li mbeÄd',
+'nextdiff' => 'Ṫ-ṪeÄdila li mbeÄd',
+
+# Media information
+'widthheight' => '$1×$2',
+'file-info-size' => '$1 × $2 piksel, ṫqel l-fiċyé: $3, ċkel MIME : $4',
+'file-nohires' => '<small>Ma kayenċ ċi rézolusyon kber men hadi.</small>',
+'svg-long-desc' => 'Fiċyé SVG, rézolusyon $1 × $2 pikselaṫ, ḫajm : $3',
+'show-big-image' => 'Rézolusyon kamla',
+'show-big-image-thumb' => '<small>L-Ḫajm dyal had l-prévizualizasyon : $1 × $2 pikselaṫ</small>',
+'file-info-gif-looped' => 'mlfoof',
+'file-info-png-looped' => 'mlfof',
+
+# Special:NewFiles
+'newimages-legend' => 'Filter',
+'newimages-label' => 'smiyt lfichier olla chwiya mnno:',
+'showhidebots' => '($1 R-Robowaṫ)',
+'noimages' => 'walo maytchaf.',
+'ilsubmit' => 'Qelleb',
+'bydate' => 'hassab tarikh',
+'sp-newimages-showfrom' => 'biyn lmilfat mn $2, $1',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => 's',
+'minutes-abbrev' => 'm',
+'hours-abbrev' => 'h',
+
+# Bad image list
+'bad_image_list' => "L-forma howa ṫ-ṫali :
+
+L-lisṫaṫ dyal ṫ-ṫiÄdad (á¹£-á¹£tor li badyin be *) homa l-li nÄṫabro.
+L-lyan l-owwel dyal ċi ṣter ĥaṣṣo walabedda ikon dyal ċi ṫeṣwira ĥat'a.
+L-lyanaṫ l-Ä¥rin l-li fe nefs á¹£-á¹£ter ka-nÄṫabrohom bḫal sṫiṫna'aṫ, maṫalan bḫal Ä‹i á¹£efḫaṫ l-li imken ṫban fihom ṫ-ṫeá¹£wira.",
+
+/*
+Short names for language variants used for language conversion links.
+To disable showing a particular link, set it to 'disable', e.g.
+'variantname-zh-sg' => 'disable',
+Variants for Chinese language
+*/
+'variantname-zh-hans' => 'Kṫaba',
+'variantname-zh-hant' => 'Kṫaba',
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-mo' => 'mo',
+'variantname-zh-sg' => 'sg',
+'variantname-zh-my' => 'my',
+'variantname-zh' => 'zh',
+
+# Variants for Gan language
+'variantname-gan-hans' => 'hans',
+'variantname-gan' => 'gan',
+
+# Variants for Serbian language
+'variantname-sr-ec' => 'sr-ec',
+'variantname-sr-el' => 'sr-el',
+'variantname-sr' => 'sr',
+
+# Variants for Kazakh language
+'variantname-kk-kz' => 'kk-kz',
+'variantname-kk-tr' => 'kk-tr',
+'variantname-kk-cn' => 'kk-cn',
+'variantname-kk-cyrl' => 'kk-cyrl',
+'variantname-kk-latn' => 'kk-latn',
+'variantname-kk-arab' => 'kk-arab',
+
+# Variants for Kurdish language
+'variantname-ku' => 'ku',
+
+# Metadata
+'metadata' => 'L-Métadoné',
+'metadata-help' => "Had l-fiÄ‹yé fih l-mazid dyal l-meÄlomaṫ ; ikon zadhom s-scanér ola l-moá¹£ewwira li ĥṫarÄohom.
+Ila ṫbeddel l-fiċyé men ḫalṫo l-'aṣliya, kaynin ċi ṫafaṣil ma mnasbinċ kolliyan le l-fiċyé li mbeddel.",
+'metadata-expand' => 'Werri ṫ-ṫafaṣil',
+'metadata-collapse' => 'Ĥebbi ṫ-ṫafaṣil',
+'metadata-fields' => "L-'itaraṫ dyal lé-métadoné EXIF li mlistyin fe had ṣ-ṣefḫa ġaykono fe ṣ-ṣefḫa de l-woṣf dyal ṫ-ṫeṣwira menni ṫṫṣeġġer l-lowḫa dyal lé-métadoné. L'itaraṫ l-ĥrin ġaykono mĥebbyin be tariqa otomaṫikiyan.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength",
+
+# EXIF tags
+'exif-imagewidth' => 'laard',
+'exif-imagelength' => 'lirtifaa',
+'exif-bitspersample' => 'bit lkol mokawwin',
+'exif-compression' => 'nidam daght',
+'exif-photometricinterpretation' => 'tarkib lpixel',
+'exif-orientation' => 'tawjih',
+'exif-samplesperpixel' => 'adad lmokawwinat',
+'exif-planarconfiguration' => 'tartib lbayanat',
+'exif-ycbcrsubsampling' => 'nisbat laayina dyal Y l C',
+'exif-ycbcrpositioning' => 'lwada dyal Y o C',
+'exif-xresolution' => 'ddiqa lofoqia',
+'exif-yresolution' => 'diqa raissia',
+'exif-resolutionunit' => 'wihdat tahlil X o Y',
+'exif-stripoffsets' => 'mawqiaa bayanat sora',
+'exif-rowsperstrip' => 'adad sofof lkol chariha',
+'exif-stripbytecounts' => 'byte lkol chariha mdghota',
+'exif-jpeginterchangeformat' => 'lhad l JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'bytes dyal JPEG',
+'exif-transferfunction' => 'wadifat naql',
+'exif-whitepoint' => 'alwan noqta lbida',
+'exif-primarychromaticities' => 'alwan assasia',
+'exif-ycbcrcoefficients' => 'moamalat masfofa tahwil farigh lon',
+'exif-referenceblackwhite' => 'zoj mn qiyam lmarjia lkhl olbid',
+'exif-datetime' => 'tarikh owqt taghyir',
+'exif-imagedescription' => 'onwan sora',
+'exif-make' => 'manaa alat taswir',
+'exif-model' => 'nawa alat taswir',
+'exif-software' => 'logieciels li mstkhdmin',
+'exif-artist' => 'lmoallif',
+'exif-copyright' => 'malik lhoqoq',
+'exif-exifversion' => 'noskha Exif',
+'exif-flashpixversion' => 'noskha flash pix madoma',
+'exif-colorspace' => 'farq lon',
+'exif-componentsconfiguration' => 'maana kol mokawwin',
+'exif-compressedbitsperpixel' => 'tor daght sora',
+'exif-pixelydimension' => 'ard sora sahih',
+'exif-pixelxdimension' => 'tol sora sahih',
+'exif-makernote' => 'molahadat lmasnaa',
+'exif-usercomment' => 'taaliqat lmostakhdim',
+'exif-relatedsoundfile' => 'milf sawti mortabit',
+'exif-datetimeoriginal' => 'tarikh o wqt tawlid lbayanat',
+'exif-datetimedigitized' => 'tarikh tahwil raqmi',
+'exif-subsectime' => 'tarikh tawani fariya',
+'exif-subsectimeoriginal' => 'waqt tarikh asli tawani fariya',
+'exif-subsectimedigitized' => 'waqt tarikh raqmi tawani fariya',
+'exif-exposuretime' => 'zaman taarrod',
+'exif-exposuretime-format' => '$1 taniya ($2)',
+'exif-fnumber' => 'ladad lboaari',
+'exif-exposureprogram' => 'barnamaj taarod',
+
+'exif-meteringmode-0' => 'mjhol',
+
+# Flash modes
+'exif-flash-fired-1' => 'lflach bda',
+'exif-flash-return-0' => 'makaynach dalat rojoa lwamid',
+'exif-flash-return-2' => 'dow rojoa lwamid makchfch',
+'exif-flash-return-3' => 'dow rojoa lwamid bad lkachf dyalo',
+'exif-flash-mode-1' => 'flsash gh ijbari',
+'exif-flash-mode-2' => 'flash ijbari',
+'exif-flash-mode-3' => 'namat tilqai',
+'exif-flash-function-1' => 'makaynch lflash',
+'exif-flash-redeye-1' => 'namat ikhtizal laqin lhmra',
+
+'exif-focalplaneresolutionunit-2' => 'bossa',
+
+'exif-sensingmethod-1' => 'mahddch',
+'exif-sensingmethod-2' => 'motchair lon lmissaha mn roqaqa whda',
+'exif-sensingmethod-3' => 'mostchair lon lmissaha mn jouj d roqaqat',
+'exif-sensingmethod-4' => 'mostchair lon lmissaha mn tlata d roqaqat',
+'exif-sensingmethod-5' => 'motchair lon missaha motatabiaa',
+'exif-sensingmethod-7' => 'mostachair khatti tolati',
+'exif-sensingmethod-8' => 'mostchair lon khatti motatabi3',
+
+'exif-scenetype-1' => 'sora moltaqata bchkl mobachir',
+
+'exif-customrendered-0' => 'amaliya adiya',
+'exif-customrendered-1' => 'amaliya hassab talab',
+
+'exif-exposuremode-0' => "tarod tilqa'i",
+'exif-exposuremode-1' => 'taarod yadawi',
+'exif-exposuremode-2' => 'aqwass tilqaiya',
+
+'exif-whitebalance-0' => "tawazon lbyin tilqa'i",
+'exif-whitebalance-1' => "l'ekilibre dyal lon lbyid",
+
+'exif-scenecapturetype-0' => 'qiyassi',
+'exif-scenecapturetype-1' => 'ardiyya',
+'exif-scenecapturetype-2' => 'portrait',
+'exif-scenecapturetype-3' => 'machhad layli',
+
+'exif-gaincontrol-0' => 'Walo',
+'exif-gaincontrol-1' => 'tahakkom aala monkhafid',
+'exif-gaincontrol-2' => 'tahakkom aala mortafi',
+'exif-gaincontrol-3' => 'tahakkom asfal monkhafid',
+'exif-gaincontrol-4' => 'tahakkom asfal mortafaa',
+
+'exif-contrast-0' => 'normaol',
+'exif-contrast-1' => 'triyy',
+'exif-contrast-2' => 'qassi',
+
+'exif-saturation-0' => 'normal',
+'exif-saturation-1' => 'tachaboo qlil',
+'exif-saturation-2' => 'tachaboo ali',
+
+'exif-sharpness-0' => 'normal',
+'exif-sharpness-1' => 'triyy',
+'exif-sharpness-2' => 'qassi',
+
+'exif-subjectdistancerange-0' => 'mjhol',
+'exif-subjectdistancerange-1' => 'mavro',
+'exif-subjectdistancerange-2' => "ro'ya qriba",
+'exif-subjectdistancerange-3' => "ro'ya baida",
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'dairat ard chamaliya',
+'exif-gpslatitude-s' => 'dairat ard ljanobiya',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'khatt tol charqi',
+'exif-gpslongitude-w' => 'khatt toll lgharbi',
+
+'exif-gpsstatus-a' => 'amaliyat lqiyas lhaliya',
+'exif-gpsstatus-v' => 'chomol lqiyass',
+
+'exif-gpsmeasuremode-2' => 'amaliyat qiyas tonaiyat alabaad',
+'exif-gpsmeasuremode-3' => 'amaliyat qiyas tolatiyat alabaad',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'kilometr f saa',
+'exif-gpsspeed-m' => 'mil f saa',
+'exif-gpsspeed-n' => 'aqd',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'litijah lhaqiqi',
+'exif-gpsdirection-m' => 'littijah lmighnatissi',
+
+# External editor support
+'edit-externally' => 'Ṣayeb had l-fiċyé be ċi aplikasyon ĥarijiya',
+'edit-externally-help' => '(ÄŠof [http://www.mediawiki.org/wiki/Manual:External_editors/fr les instructions d’installation] ila ḫṫajiṫi meÄlomaṫ Ä¥rin)',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'kolċi',
+'imagelistall' => 'kolċi',
+'watchlistall2' => 'kolċi',
+'namespacesall' => 'kolċi',
+'monthsall' => 'kolhom',
+'limitall' => 'kolċi',
+
+# E-mail address confirmation
+'confirmemail' => "konfirmasyon dyal l'email",
+'confirmemail_send' => 'sift code lkonfirmation',
+'confirmemail_sent' => 'tam irssal rissala dyal lkonfirmation.',
+'confirmemail_loggedin' => "l'email dyalk tkonfirma daba",
+'confirmemail_error' => "khayn chi khata' mlli bghiti tsjl lkonfirmation dyalk",
+'confirmemail_subject' => "rissala ta'kid mn {{SITENAME}}",
+'confirmemail_invalidated' => "lkonfirmasyon dyal l'email tlgha",
+'invalidateemail' => "lghi lkofirmasyon dyal l'email",
+
+# Scary transclusion
+'scarytranscludedisabled' => '[tadmin dyal interwiki moattal]',
+'scarytranscludefailed' => '[lbaht 3la lqalb fchl l $1]',
+'scarytranscludetoolong' => '[URL twil bzzaf]',
+
+# Trackbacks
+'trackbackremove' => '([$1 Suprimi])',
+'trackbacklink' => 'lmotabaaa',
+'trackbackdeleteok' => 'lmotabaa tmshat',
+
+# Delete conflict
+'deletedwhileediting' => "'''attansyo''': had sfha tmshat bad ma bditi taadil dyalha",
+'recreate' => "awd li'inchaa",
+
+# action=purge
+'confirm_purge_button' => 'Waĥĥa',
+'confirm-purge-top' => 'bghiti tmsh lcache dyal had sfha ?',
+
+# Multipage image navigation
+'imgmultipageprev' => 'sfha li sbqat',
+'imgmultipagenext' => 'sfha jaya →',
+'imgmultigo' => 'sir !',
+'imgmultigoto' => 'sir lsfha $1',
+
+# Table pager
+'ascending_abbrev' => 'tassaaodi',
+'descending_abbrev' => 'tanazoli',
+'table_pager_next' => 'Ṣefḫa li jaya',
+'table_pager_prev' => 'sfha li sbqat',
+'table_pager_first' => 'sfha lowla',
+'table_pager_last' => 'sfha lkhra',
+'table_pager_limit' => 'biyn $1 onssor f sfha',
+'table_pager_limit_label' => 'ada lanassir f sfha:',
+'table_pager_limit_submit' => 'Sir',
+'table_pager_empty' => 'la nataij',
+
+# Auto-summaries
+'autosumm-blank' => 'khwi sfha',
+'autosumm-replace' => 'bdl lmohtawa b "$1"',
+'autoredircomment' => 'hwwl sfha l [[$1]]',
+'autosumm-new' => 'dir chi ssfha b "$1"',
+
+# Live preview
+'livepreview-loading' => 'tssna wa7d chwiya kaytcharja ....',
+'livepreview-ready' => 'tssna wahd chwiya rah kaytcharja. .... safi ha hwa wajd',
+
+# Friendlier slave lag warnings
+'lag-warn-normal' => 'tghiyrat jdad y3ni aqal mn $1 {{PLURAL:$1|taniya|tawani}} iqdr matbanch lik flista',
+
+# Watchlist editor
+'watchlistedit-numitems' => 'lista d s-suivi dyalk fiha {{PLURAL:$1|1 onwan|$1 anawin}}, bla sfahi dniqach.',
+'watchlistedit-noitems' => 'lista dyal ladressat dyalk mafihach ta onwan.',
+'watchlistedit-normal-title' => 'á¹¢ayeb l-lista dyal s-suivi',
+'watchlistedit-normal-legend' => 'Mmḫiya men l-lista dyal s-suivi',
+'watchlistedit-normal-submit' => 'hiyd ladressat',
+'watchlistedit-raw-title' => 'á¹¢ayeb l-lista dyal lkham',
+'watchlistedit-raw-legend' => 'á¹¢ayeb l-lista dyal lkham',
+'watchlistedit-raw-titles' => 'ladressat:',
+'watchlistedit-raw-submit' => 'hddt qaimat lmoraqaba',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Lista dyal s-suivi',
+'watchlisttools-edit' => 'ÄŠof o Äeddel l-lista dyal s-suivi',
+'watchlisttools-raw' => 'á¹¢ayeb l-lista dyal s-suivi',
+
+# Special:Version
+'version' => 'Noskha',
+'version-extensions' => 'limtidadat lmotabbata',
+'version-specialpages' => 'Ṣefḫa ĥaṣa',
+'version-parserhooks' => 'khatatif lmohllil',
+'version-variables' => 'lmotaghayyirat',
+'version-other' => 'okhra',
+'version-mediahandlers' => 'motahakkimat lmedia',
+'version-hooks' => 'lkhtatif',
+'version-extension-functions' => 'wadaif lmohallil',
+'version-parser-extensiontags' => 'wossom imtidad lmohallil',
+'version-parser-function-hooks' => 'khtatif dyal dalat lmohllil',
+'version-skin-extension-functions' => 'fonctionat dyal lfrssada',
+'version-hook-name' => 'smiyt lkhttaf',
+'version-hook-subscribedby' => 'kaytstaml mn taraf',
+'version-version' => '(Noskha $1)',
+'version-license' => 'rokhssa',
+'version-poweredby-others' => 'khrin',
+'version-software' => "lbarnamaj li m'anstalli",
+'version-software-product' => 'lmntoj',
+'version-software-version' => 'noskha',
+
+# Special:FilePath
+'filepath' => 'massar lfichier',
+'filepath-page' => 'Fiċyé:',
+'filepath-submit' => 'Sir',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-legend' => 'qllb ala lmdoublin',
+'fileduplicatesearch-filename' => 'smiyt lfichier',
+'fileduplicatesearch-submit' => 'Qelleb',
+
+# Special:SpecialPages
+'specialpages' => 'Ṣefḫaṫ ĥaṣṣin',
+'specialpages-group-maintenance' => 'taqarir siyana',
+'specialpages-group-other' => 'sfahi khassin khrin',
+'specialpages-group-login' => 'dkhl/tqiyd',
+'specialpages-group-changes' => 'akhir taghiyrat osijillat',
+'specialpages-group-media' => 'taqarir kmedia o rafa',
+'specialpages-group-users' => 'lmostakhdimon o salahiyat',
+'specialpages-group-highuse' => 'sfahi istikhdam ali',
+'specialpages-group-pages' => 'listat dyal sfahi',
+'specialpages-group-pagetools' => 'adawat sfahi',
+'specialpages-group-wiki' => 'bayanat lwiki o adawat',
+'specialpages-group-redirects' => 'sfhat khassa kathwwl',
+'specialpages-group-spam' => 'adawat spam',
+
+# Special:BlankPage
+'blankpage' => 'sfha khawiya',
+'intentionallyblankpage' => 'had sfha trkat fargh a anwa',
+
+# Special:Tags
+'tags' => 'wossom taghyir shiha',
+'tag-filter-submit' => 'Filter',
+'tags-title' => 'wossom',
+'tags-tag' => 'smiyt lwasm',
+'tags-display-header' => 'dohor f qawain tghiyrat',
+'tags-description-header' => 'wasf kaml dyal lmana',
+'tags-hitcount-header' => 'tghyirat mawssoma',
+'tags-edit' => 'Äœedel',
+'tags-hitcount' => '{{PLURAL:$1|ṫeġyira weḫda|$1 dyal ṫ-ṫeġyiraṫ}}',
+
+# Special:ComparePages
+'comparepages' => 'qarn sfahi',
+'compare-selector' => 'qarn morajaat sfha',
+'compare-page1' => 'sfha 1',
+'compare-page2' => 'sfha 2',
+'compare-rev1' => 'morajaa 1',
+'compare-rev2' => 'morajaa 2',
+'compare-submit' => 'qarn',
+
+# Database error messages
+'dberr-header' => 'had lwiki fih chi mochkil',
+'dberr-problems' => 'smh lina had lmawqia ando chi machakil tiqniya',
+'dberr-again' => 'jrb tssna 5 dqayq oaawd thmil',
+'dberr-info' => 'mayqdrch ittasl b qaaidat lbayanat : $1',
+'dberr-usegoogle' => 'imkn lik tqllb f Google f lwaqt lhadir',
+'dberr-outofdate' => 'khssk tlahd anna lfahadriss dyalhom l lmohtawa dyalna iqdr matkonch met a jour',
+'dberr-cachederror' => 'hadchi rah ghir nskha msjla, o iqdr matkonch a jour',
+
+# HTML forms
+'htmlform-invalid-input' => 'kayna chi mochkilat f chi modkhalat dyalk',
+'htmlform-select-badoption' => 'lqima li drtiha masalhach ka khiyar',
+'htmlform-int-invalid' => 'lqima li drtiha machi adad shih',
+'htmlform-float-invalid' => 'lqima li drtiha machi adad',
+'htmlform-int-toolow' => 'lwima li drtiha sghr mn lminimmun li hwa $1',
+'htmlform-int-toohigh' => 'lqima li drtima lfog kbr mn lmaximmum li hwa $1',
+'htmlform-required' => 'had lqima mtloba',
+'htmlform-submit' => 'sift',
+'htmlform-reset' => 'rojoa an taadilat',
+'htmlform-selectorother-other' => 'okhra',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 maa imkaniyat lbaht f nass kaml',
+'sqlite-no-fts' => '$1 imkaniyat lbaht f nass kaml',
+
+);
diff --git a/languages/messages/MessagesArz.php b/languages/messages/MessagesArz.php
index 90b0d44f..3c724eb6 100644
--- a/languages/messages/MessagesArz.php
+++ b/languages/messages/MessagesArz.php
@@ -115,6 +115,7 @@ $magicWords = array(
'subjectpagenamee' => array( '1', 'عنوان_صÙحة_الموضوع', 'عنوان_صÙحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'رسالة:', 'MSG:' ),
'subst' => array( '0', 'نسخ:', 'إحلال:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'مصدر:', 'مصدر_قالب:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'تصغير', 'مصغر', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -125,8 +126,8 @@ $magicWords = array(
'img_center' => array( '1', 'مركز', 'center', 'centre' ),
'img_framed' => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'لاإطار', 'frameless' ),
- 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة $1', 'صÙحة_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'حد', 'حدود', 'border' ),
'img_baseline' => array( '1', 'خط_أساسى', 'خط_أساسي', 'baseline' ),
'img_sub' => array( '1', 'Ùرعى', 'Ùرعي', 'sub' ),
@@ -160,6 +161,7 @@ $magicWords = array(
'revisionday' => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
@@ -193,7 +195,7 @@ $magicWords = array(
'filepath' => array( '0', 'مسار_الملÙ:', 'FILEPATH:' ),
'tag' => array( '0', 'وسم', 'tag' ),
'hiddencat' => array( '1', '__تصنيÙ_مخÙÙŠ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'صÙحات_ÙÙ‰_التصنيÙ', 'صÙحات ÙÙŠ التصنيÙ', 'صÙحات_ÙÙŠ_التصنيÙ', 'صÙحات_ÙÙŠ_تصنيÙ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesincategory' => array( '1', 'صÙحات_ÙÙŠ_التصنيÙ', 'صÙحات_ÙÙŠ_تصنيÙ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'حجم_الصÙحة', 'PAGESIZE' ),
'index' => array( '1', '__Ùهرسة__', '__INDEX__' ),
'noindex' => array( '1', '__لاÙهرسة__', '__NOINDEX__' ),
@@ -201,97 +203,101 @@ $magicWords = array(
'staticredirect' => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'مسار', 'PATH' ),
+ 'url_wiki' => array( '0', 'ويكى', 'ويكي', 'WIKI' ),
+ 'url_query' => array( '0', 'استعلام', 'QUERY' ),
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'تحويلات_مزدوجة' ),
- 'BrokenRedirects' => array( 'تحويلات_مكسورة' ),
+ 'DoubleRedirects' => array( 'تحويلات_دوبل' ),
+ 'BrokenRedirects' => array( 'تحويلات_مكسوره' ),
'Disambiguations' => array( 'توضيحات' ),
'Userlogin' => array( 'دخول_اليوزر' ),
'Userlogout' => array( 'خروج_اليوزر' ),
- 'CreateAccount' => array( 'إنشاء_حساب' ),
+ 'CreateAccount' => array( 'ابتدى_حساب' ),
'Preferences' => array( 'تÙضيلات' ),
- 'Watchlist' => array( 'قايمة_المراقبة' ),
- 'Recentchanges' => array( 'اخر_التعديلات' ),
+ 'Watchlist' => array( 'ليستة_المراقبه' ),
+ 'Recentchanges' => array( 'اخر_تعديلات' ),
'Upload' => array( 'رÙع' ),
- 'Listfiles' => array( 'عرض_الملÙات', 'قايمة_الملÙات', 'قايمة_الصور' ),
- 'Newimages' => array( 'ملÙات_جديدة', 'صور_جديدة' ),
- 'Listusers' => array( 'عرض_المستخدمين', 'قايمة_المستخدمين' ),
- 'Listgrouprights' => array( 'عرض_صلاحيات_المجموعات' ),
- 'Statistics' => array( 'إحصائيات' ),
- 'Randompage' => array( 'عشوائي', 'صÙحة_عشوائية' ),
- 'Lonelypages' => array( 'صÙحات_وحيدة', 'صÙحات_يتيمة' ),
- 'Uncategorizedpages' => array( 'صÙحات_مش_مصنÙØ©' ),
- 'Uncategorizedcategories' => array( 'تصنيÙات_مش_مصنÙØ©' ),
- 'Uncategorizedimages' => array( 'ملÙات_مش_مصنÙØ©', 'صور_مش_مصنÙØ©' ),
- 'Uncategorizedtemplates' => array( 'قوالب_مش_مصنÙØ©' ),
- 'Unusedcategories' => array( 'تصنيÙات_مش_مستخدمة' ),
- 'Unusedimages' => array( 'ملÙات_مش_مستخدمة', 'صور_مش_مستخدمة' ),
- 'Wantedpages' => array( 'صÙحات_مطلوبة', 'وصلات_مكسورة' ),
- 'Wantedcategories' => array( 'تصنيÙات_مطلوبة' ),
- 'Wantedfiles' => array( 'ملÙات_مطلوبة' ),
- 'Wantedtemplates' => array( 'قوالب_مطلوبة' ),
- 'Mostlinked' => array( 'أكثر_الصÙحات_وصلا', 'الأكثر_وصلا' ),
- 'Mostlinkedcategories' => array( 'أكثر_التصنيÙات_وصلا', 'أكثر_التصنيÙات_استخداما' ),
- 'Mostlinkedtemplates' => array( 'أكثر_القوالب_وصلا', 'أكثر_القوالب_استخداما' ),
- 'Mostimages' => array( 'أكثر_الملÙات_وصلا', 'أكثر_الملÙات', 'أكثر_الصور' ),
- 'Mostcategories' => array( 'أكثر_التصنيÙات' ),
- 'Mostrevisions' => array( 'أكثر_المراجعات' ),
- 'Fewestrevisions' => array( 'أقل_المراجعات' ),
- 'Shortpages' => array( 'صÙحات_قصيرة' ),
- 'Longpages' => array( 'صÙحات_طويلة' ),
- 'Newpages' => array( 'صÙحات_جديدة' ),
- 'Ancientpages' => array( 'صÙحات_قديمة' ),
- 'Deadendpages' => array( 'صÙحات_نهاية_مسدودة' ),
- 'Protectedpages' => array( 'صÙحات_محمية' ),
- 'Protectedtitles' => array( 'عناوين_محمية' ),
- 'Allpages' => array( 'كل_الصÙحات' ),
- 'Prefixindex' => array( 'Ùهرس_بادئة' ),
- 'Ipblocklist' => array( 'قائمة_المنع', 'عرض_المنع', 'قائمة_منع_أيبى' ),
- 'Specialpages' => array( 'صÙحات_خاصة' ),
+ 'Listfiles' => array( 'عرض_الÙايلات', 'ليستة_الÙايلات', 'ليستة_الصور' ),
+ 'Newimages' => array( 'Ùايلات_جديده', 'صور_جديده' ),
+ 'Listusers' => array( 'عرض_اليوزرات', 'ليستة_اليوزرات' ),
+ 'Listgrouprights' => array( 'عرض_حقوق_الجروپات' ),
+ 'Statistics' => array( 'احصائيات' ),
+ 'Randompage' => array( 'عشوائى', 'صÙحه_عشوائيه' ),
+ 'Lonelypages' => array( 'صÙØ­_وحدانيه', 'صÙØ­_يتيمه' ),
+ 'Uncategorizedpages' => array( 'صÙØ­_مش_متصنÙÙ‡' ),
+ 'Uncategorizedcategories' => array( 'تصانيÙ_مش_متصنÙÙ‡' ),
+ 'Uncategorizedimages' => array( 'Ùايلات_مش_متصنÙÙ‡', 'صور_مش_متصنÙÙ‡' ),
+ 'Uncategorizedtemplates' => array( 'قوالب_مش_متصنÙÙ‡' ),
+ 'Unusedcategories' => array( 'تصانيÙ_مش_مستعمله' ),
+ 'Unusedimages' => array( 'Ùايلات_مش_مستعمله', 'صور_مش_مستعمله' ),
+ 'Wantedpages' => array( 'صÙØ­_مطلوبه', 'لينكات_مكسوره' ),
+ 'Wantedcategories' => array( 'تصانيÙ_مطلوبه' ),
+ 'Wantedfiles' => array( 'Ùايلات_مطلوبه' ),
+ 'Wantedtemplates' => array( 'قوالب_مطلوبه' ),
+ 'Mostlinked' => array( 'اكتر_صÙØ­_معمول_ليها_لينك' ),
+ 'Mostlinkedcategories' => array( 'اكتر_تصانيÙ_معمول_ليها_لينك', 'اكتر_تصانيÙ_مستعمله' ),
+ 'Mostlinkedtemplates' => array( 'اكتر_قوالب_معمول_ليها_لينك', 'اكتر_قوالب_مستعمله' ),
+ 'Mostimages' => array( 'اكتر_Ùايلات_معمول_ليها_لينك', 'اكتر_Ùايلات', 'اكتر_صور' ),
+ 'Mostcategories' => array( 'اكتر_تصانيÙ' ),
+ 'Mostrevisions' => array( 'اكتر_مراجعات' ),
+ 'Fewestrevisions' => array( 'اقل_مراجعات' ),
+ 'Shortpages' => array( 'صÙØ­_قصيره' ),
+ 'Longpages' => array( 'صÙØ­_طويله' ),
+ 'Newpages' => array( 'صÙØ­_جديده' ),
+ 'Ancientpages' => array( 'صÙØ­_قديمه' ),
+ 'Deadendpages' => array( 'صÙØ­_نهايه_مسدوده' ),
+ 'Protectedpages' => array( 'صÙØ­_محميه' ),
+ 'Protectedtitles' => array( 'عناوين_محميه' ),
+ 'Allpages' => array( 'كل_الصÙØ­' ),
+ 'Prefixindex' => array( 'Ùهرس_بدايه' ),
+ 'Ipblocklist' => array( 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ),
+ 'Unblock' => array( 'رÙع_منع' ),
+ 'Specialpages' => array( 'صÙØ­_مخصوصه' ),
'Contributions' => array( 'مساهمات' ),
- 'Emailuser' => array( 'مراسلة_المستخدم' ),
- 'Confirmemail' => array( 'تأكيد_البريد' ),
- 'Whatlinkshere' => array( 'ماذا_يصل_هنا' ),
- 'Recentchangeslinked' => array( 'أحدث_التغييرات_الموصولة', 'تغييرات_مرتبطة' ),
- 'Movepage' => array( 'نقل_صÙحة' ),
- 'Blockme' => array( 'منعى' ),
+ 'Emailuser' => array( 'ابعت_ايميل_لليوزر' ),
+ 'Confirmemail' => array( 'تأكيد_الايميل' ),
+ 'Whatlinkshere' => array( 'ايه_بيوصل_هنا' ),
+ 'Recentchangeslinked' => array( 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ),
+ 'Movepage' => array( 'نقل_صÙحه' ),
+ 'Blockme' => array( 'بلوك_لنÙسى' ),
'Booksources' => array( 'مصادر_كتاب' ),
- 'Categories' => array( 'تصنيÙات' ),
+ 'Categories' => array( 'تصانيÙ' ),
'Export' => array( 'تصدير' ),
- 'Version' => array( 'إصدار' ),
+ 'Version' => array( 'نسخه' ),
'Allmessages' => array( 'كل_الرسايل' ),
'Log' => array( 'سجل', 'سجلات' ),
- 'Blockip' => array( 'منع', 'منع_أيبى', 'منع_مستخدم' ),
+ 'Blockip' => array( 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ),
'Undelete' => array( 'استرجاع' ),
- 'Import' => array( 'استيراد' ),
+ 'Import' => array( 'استوراد' ),
'Lockdb' => array( 'Ù‚ÙÙ„_قب' ),
'Unlockdb' => array( 'Ùتح_قب' ),
- 'Userrights' => array( 'صلاحيات_المستخدم', 'ترقية_مدير_نظام', 'ترقية_بوت' ),
- 'MIMEsearch' => array( 'بحث_ميم' ),
- 'FileDuplicateSearch' => array( 'بحث_ملÙ_مكرر' ),
- 'Unwatchedpages' => array( 'صÙحات_مش_مراقبة' ),
+ 'Userrights' => array( 'حقوق_اليوزر', 'ترقية_سيسوپ', 'ترقية_بوت' ),
+ 'MIMEsearch' => array( 'تدوير_MIME' ),
+ 'FileDuplicateSearch' => array( 'تدوير_Ùايل_متكرر' ),
+ 'Unwatchedpages' => array( 'صÙØ­_مش_متراقبه' ),
'Listredirects' => array( 'عرض_التحويلات' ),
- 'Revisiondelete' => array( 'حذÙ_نسخة' ),
- 'Unusedtemplates' => array( 'قوالب_مش_مستخدمة' ),
- 'Randomredirect' => array( 'تحويلة_عشوائية' ),
+ 'Revisiondelete' => array( 'مسح_نسخه' ),
+ 'Unusedtemplates' => array( 'قوالب_مش_مستعمله' ),
+ 'Randomredirect' => array( 'تحويله_عشوائيه' ),
'Mypage' => array( 'صÙحتى' ),
- 'Mytalk' => array( 'نقاشى' ),
+ 'Mytalk' => array( 'مناقشتى' ),
'Mycontributions' => array( 'مساهماتى' ),
- 'Listadmins' => array( 'عرض_الإداريين' ),
+ 'Listadmins' => array( 'عرض_الاداريين' ),
'Listbots' => array( 'عرض_البوتات' ),
- 'Popularpages' => array( 'صÙحات_مشهورة' ),
- 'Search' => array( 'بحث' ),
- 'Resetpass' => array( 'تغيير_كلمة_السر', 'ضبط_كلمة_السر' ),
- 'Withoutinterwiki' => array( 'بدون_إنترويكى' ),
+ 'Popularpages' => array( 'صÙØ­_مشهوره' ),
+ 'Search' => array( 'تدوير' ),
+ 'Resetpass' => array( 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ),
+ 'Withoutinterwiki' => array( 'من-غير_interwiki' ),
'MergeHistory' => array( 'دمج_التاريخ' ),
'Filepath' => array( 'مسار_ملÙ' ),
- 'Invalidateemail' => array( 'تعطيل_البريد_الإلكترونى' ),
- 'Blankpage' => array( 'صÙحة_Ùارغة' ),
- 'LinkSearch' => array( 'بحث_الوصلات' ),
- 'DeletedContributions' => array( 'مساهمات_محذوÙØ©' ),
+ 'Invalidateemail' => array( 'تعطيل_الايميل' ),
+ 'Blankpage' => array( 'صÙحه_Ùارضيه' ),
+ 'LinkSearch' => array( 'تدوير_اللينكات' ),
+ 'DeletedContributions' => array( 'مساهمات_ممسوحه' ),
'Tags' => array( 'وسوم' ),
- 'Activeusers' => array( 'مستخدمون_نشطون' ),
+ 'Activeusers' => array( 'يوزرات_نشطا' ),
);
$messages = array(
@@ -310,8 +316,7 @@ $messages = array(
'tog-editsection' => 'اسمح بـ تعديل الاجزاء عن طريق لينكات [تعديل]',
'tog-editsectiononrightclick' => 'اسمح بـ تعديل الاجزاء لما تعمل right-click بـ الماوس على عناوين الاجزاء (بيحتاج JavaScript)',
'tog-showtoc' => 'بين جدول المحتويات (بتاع الصÙØ­ اللى Ùيها اكتر من 3 عناوين)',
-'tog-rememberpassword' => 'خليك Ùاكر دخولى على الكمبيوتر دا',
-'tog-editwidth' => 'وسع صندوق التحرير عشان يملا للشاشه كلها.',
+'tog-rememberpassword' => ' (لمدة $1 {{PLURAL:$1|يوم|يوم}})خليك Ùاكر دخولى على الكمبيوتر دا',
'tog-watchcreations' => 'زوّد الصÙØ­ اللى ابتديتها على ليستة الصÙØ­ اللى باراقبها',
'tog-watchdefault' => 'زوّد الصÙØ­ اللى باعدلها على ليستة الصÙØ­ اللى باراقبها',
'tog-watchmoves' => 'زوّد الصÙØ­ اللى بانقلها على ليستة الصÙØ­ اللى باراقبها',
@@ -458,31 +463,20 @@ $messages = array(
'faqpage' => 'Project:اسئله بتتسئل كتير',
# Vector skin
-'vector-action-addsection' => 'ضي٠موضوع',
-'vector-action-delete' => 'مسح',
-'vector-action-move' => 'نقل',
-'vector-action-protect' => 'حمايه',
-'vector-action-undelete' => 'الغى المسح',
-'vector-action-unprotect' => 'الغى الحمايه',
-'vector-namespace-category' => 'تصنيÙ',
-'vector-namespace-help' => 'صÙحة مساعده',
-'vector-namespace-image' => 'ملÙ',
-'vector-namespace-main' => 'صÙحه',
-'vector-namespace-media' => 'صÙحة ميديا',
-'vector-namespace-mediawiki' => 'رساله',
-'vector-namespace-project' => 'صÙحة مشروع',
-'vector-namespace-special' => 'صÙحه مخصوصه',
-'vector-namespace-talk' => 'نقاش',
-'vector-namespace-template' => 'قالب',
-'vector-namespace-user' => 'صÙحة يوزر',
-'vector-view-create' => 'اعمل',
-'vector-view-edit' => 'تعديل',
-'vector-view-history' => 'استعراض التاريخ',
-'vector-view-view' => 'قرايه',
-'vector-view-viewsource' => 'استعراض المصدر',
-'actions' => 'أعمال',
-'namespaces' => 'النطاقات',
-'variants' => 'المتغيرات',
+'vector-action-addsection' => 'ضي٠موضوع',
+'vector-action-delete' => 'مسح',
+'vector-action-move' => 'نقل',
+'vector-action-protect' => 'حمايه',
+'vector-action-undelete' => 'الغى المسح',
+'vector-action-unprotect' => 'الغى الحمايه',
+'vector-view-create' => 'اعمل',
+'vector-view-edit' => 'تعديل',
+'vector-view-history' => 'استعراض التاريخ',
+'vector-view-view' => 'قرايه',
+'vector-view-viewsource' => 'استعراض المصدر',
+'actions' => 'أعمال',
+'namespaces' => 'النطاقات',
+'variants' => 'المتغيرات',
'errorpagetitle' => 'غلطه',
'returnto' => 'ارجع ل $1.',
@@ -707,7 +701,7 @@ $2',
'yourname' => 'اليوزرنيم:',
'yourpassword' => 'الباسوورد:',
'yourpasswordagain' => 'اكتب الباسورد تاني:',
-'remembermypassword' => 'اÙتكر بيانات دخولى على الكمبيوتر ده',
+'remembermypassword' => ' (لمدة $1 {{PLURAL:$1|يوم|يوم}})خليك Ùاكر دخولى على الكمبيوتر دا',
'yourdomainname' => 'النطاق بتاعك:',
'externaldberror' => 'يا إما ÙÙ‰ حاجة غلط ÙÙ‰ الدخول على قاعدة البيانات الخارجية أو انت مش مسموح لك تعمل تحديث لحسابك الخارجي.',
'login' => 'دخول',
@@ -724,6 +718,7 @@ $2',
'gotaccount' => "عندك حساب؟ '''$1'''.",
'gotaccountlink' => 'دخول',
'createaccountmail' => 'بـ الايميل',
+'createaccountreason' => 'السبب:',
'badretype' => 'كلمتين السر اللى كتبتهم مش زى بعضهم',
'userexists' => 'اسم اليوزر اللى دخلته بيستعمله يوزر غيرك.
دخل اسم تانى.',
@@ -843,8 +838,8 @@ $2',
'missingsummary' => "'''خد بالك:''' انت ما كتبتش ملخص للتعديل.
لو دوست على سييڤ الصÙحه مرة تانية التعديل بتاعك Ø­ يتحÙظ من غير ملخص.",
'missingcommenttext' => 'لو سمحت اكتب تعليق تحت.',
-'missingcommentheader' => "'''خد بالك:''' انت ما كتبتش عنوان\\موضوع للتعليق دا
-لو دوست على سييڤ الصÙحه مرة تانيه، تعليقك Ø­ يتحÙظ من غير عنوان.",
+'missingcommentheader' => "'''.خد بالك:''' انت ما كتبتش عنوان\\موضوع للتعليق دا
+لو دوست على {{int:savearticle}} مرة تانيه، تعليقك Ø­ يتحÙظ من غير عنوان.",
'summary-preview' => 'بروÙÙ‡ للملخص:',
'subject-preview' => 'بروÙØ© للعنوان/للموضوع',
'blockedtitle' => 'اليوزر ممنوع',
@@ -917,7 +912,7 @@ $2',
هى لسه ماتسييڤتش!'''",
'userjspreview' => "'''Ø£Ùتكر أنك بس بتجرب/بتعرض الجاÙا سكريبت بتاع اليوزر بتاعك، Ùˆ انها لسة ماتحÙظتش!'''",
'userinvalidcssjstitle' => "'''تحذير:'''ماÙيش واجهة \"\$1\".
-اÙتكر أن ملÙات ال.css Ùˆ ال.js بتستخدم حرو٠صغيرة ÙÙ‰ العنوان ØŒ مثلا {{ns:user}}:Foo/monobook.css Ùˆ مش {{ns:user}}:Foo/Monobook.css.",
+اÙتكر أن ملÙات ال.css Ùˆ ال.js بتستخدم حرو٠صغيرة ÙÙ‰ العنوان ØŒ مثلا {{ns:user}}:Foo/vector.css Ùˆ مش {{ns:user}}:Foo/Vector.css.",
'updated' => '(متحدثة)',
'note' => "'''ملحوظه:'''",
'previewnote' => "''' دى بروÙÙ‡ للصÙحه بس،
@@ -957,9 +952,6 @@ $2',
'copyrightwarning2' => "لو سمحت تعمل حسابك ان كل مشاركاتك ÙÙ‰ {{SITENAME}} ممكن المشاركين التانيين يعدلوها،يغيروها، او يمسحوها خالص. لو مانتش حابب ان كتاباتك تتعدل Ùˆ تتغير بالشكل دا، Ùياريت ما تنشرهاش هنا.<br />.
Ùˆ كمان انت بتدينا كلمة شر٠انك صاحب الكتابات دي، او انك نقلتها من مكان مش خاضع لحقوق النشر .(شو٠التÙاصيل ÙÙ‰ $1 ).
'''لو سمحت ما تحطش هنا اى نص خاضع لحقوق النشر من غير تصريح!'''.",
-'longpagewarning' => "'''تحذير:''' الصÙحه دى حجمها $1 â€kilobyte;â€
-شوية براوزرات ممكن يبقى عندها مشاكل لما تحاول تعديل صÙØ­ بيزيد حجمها عن 32 â€kb.â€
-لو سمحت Ùكر ÙÙ‰ تقسيم الصÙحه لاجزاء اصغر.",
'longpageerror' => "'''غلط: النص اللى دخلته حجمه $1 كيلوبايت، ودا أكبر من الحد الأقصى و اللى هو $2 كيلوبايت.
مش ممكن يتحÙظ.'''",
'readonlywarning' => "'''تحذير: قاعدة البيانات اتقÙلت للصيانة، Ùˆ علشان كدا انت مش Ø­ تقدر تحÙظ التعديلات اللى عملتها دلوقاي.
@@ -1207,7 +1199,7 @@ $1",
'compareselectedversions' => 'قارن بين النسختين المختارتين',
'showhideselectedversions' => 'عرض/تخبية المراجعات المختاره.',
'editundo' => 'استرجاع',
-'diff-multi' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخه متوسطه}} مش معروضه.)',
+'diff-multi' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}} مش معروضه)',
# Search results
'searchresults' => 'نتايج التدوير',
@@ -1319,6 +1311,7 @@ $1",
'contextlines' => 'عدد السطور ÙÙ‰ كل نتيجة:',
'contextchars' => 'عدد الحرو٠ÙÙ‰ كل سطر',
'stub-threshold' => 'الحد لتنسيق <a href="#" class="stub">لينك البذرة</a>:',
+'stub-threshold-disabled' => 'معطل',
'recentchangesdays' => 'عدد الأيام المعروضة ÙÙ‰ اخرالتغييرات:',
'recentchangesdays-max' => '(الحد الاقصى $1 {{PLURAL:$1|يوم|ايام}})',
'recentchangescount' => 'عدد التعديلات اللى بتظهر اوتوماتيكى ÙÙ‰ اخر التغييرات, تواريخ الصÙحه, Ùˆ ÙÙ‰ السجلات, :',
@@ -1391,7 +1384,9 @@ $1",
'prefs-advancedrendering' => 'اختيارات متقدمه',
'prefs-advancedsearchoptions' => 'اختيارات متقدمه',
'prefs-advancedwatchlist' => 'اختيارات متقدمه',
-'prefs-display' => 'اختيارات العرض',
+'prefs-displayrc' => 'اختيارات العرض',
+'prefs-displaysearchoptions' => 'اختيارات العرض',
+'prefs-displaywatchlist' => 'اختيارات العرض',
'prefs-diffs' => 'التغيير',
# User rights
@@ -1499,7 +1494,6 @@ $1",
'right-siteadmin' => 'Ù‚ÙÙ„ ÙˆÙتح قاعدة البيانات',
'right-reset-passwords' => 'تغيير الباوسورد بتاعة اليوزرات التانيين',
'right-override-export-depth' => 'تصدير الصÙحات مع الصÙحات الموصوله لحد عمق 5',
-'right-versiondetail' => 'عرض معلومات نسخة السوÙتوير المتوسعه',
'right-sendemail' => 'يبعت إيميل لليوزرز التانيين',
# User rights log
@@ -1550,14 +1544,9 @@ $1",
'recentchanges-legend' => 'اختيارات اخر التعديلات',
'recentchangestext' => 'تابع آخر التغييرات ÙÙ‰ الويكى على الصÙحة دى.',
'recentchanges-feed-description' => 'تابع اخر التعديلات للويكى ده عن طريق الÙييد ده .',
-'recentchanges-label-legend' => 'المÙتاح: $1.',
-'recentchanges-legend-newpage' => '$1 - صÙحه جديده',
'recentchanges-label-newpage' => 'التعديل ده عمل صÙحه جديده',
-'recentchanges-legend-minor' => '$1 - تعديل صغير',
'recentchanges-label-minor' => 'ده تعديل صغير',
-'recentchanges-legend-bot' => '$1 - تعديل بتاع بوت',
'recentchanges-label-bot' => 'التعديل ده عمله بوت',
-'recentchanges-legend-unpatrolled' => '$1 - تعديل مش متراجع',
'recentchanges-label-unpatrolled' => 'التعديل ده مإتراجعش لسه',
'rcnote' => "Ùيه تحت {{PLURAL:$1|'''1''' تغيير|آخر '''$1''' تغيير}} ÙÙ‰ آخر {{PLURAL:$2|يوم|'''$2''' يوم}}ØŒ بدءا من $5ØŒ $4.",
'rcnotefrom' => "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
@@ -1667,7 +1656,6 @@ $1",
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'المل٠دا تكرار {{PLURAL:$1|للملÙ|للملÙات}} دي:',
'file-deleted-duplicate' => 'ÙÙ‰ مل٠مطابق للمل٠دا ([[:$1]]) اتمسح قبل كدا. انتا لازم تشيك على تاريخ المسح بتاع المل٠دا قبل ما تحمله مرة تانية',
-'successfulupload' => 'التحميل ناجح',
'uploadwarning' => 'تحذير التحميل',
'uploadwarning-text' => 'لو سمحت عدل وص٠المل٠اللى تحت وحاول تانى.',
'savefile' => 'Ø­Ùظ الملÙ',
@@ -1708,6 +1696,8 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- سيب السطر ده زى ما هوه -->',
+'upload-success-subj' => 'التحميل ناجح',
+'upload-warning-subj' => 'تحذير التحميل',
'upload-proto-error' => 'بروتوكول مش صحيح',
'upload-proto-error-text' => 'االتحميل عن بعد لازمله يوأرإل بيبتدى بـ <code>http://</code> أو <code>ftp://</code>.',
@@ -1891,7 +1881,6 @@ PICT # misc.
'statistics-edits-average' => 'متوسط التعديلات لكل صÙحة',
'statistics-views-total' => 'إجمالى المشاهدات',
'statistics-views-peredit' => 'المشاهدات لكل تعديل',
-'statistics-jobqueue' => 'طول [http://www.mediawiki.org/wiki/Manual:Job_queue طابور الشغل]',
'statistics-users' => '[[Special:ListUsers|يوزرز]] مسجلين',
'statistics-users-active' => 'يوزرز نشطين',
'statistics-users-active-desc' => 'اليوزرز اللى Ù†Ùذو عمليه ÙÙ‰ الـ {{PLURAL:$1|يوم|$1 ايام}} اللى Ùاتو',
@@ -1906,7 +1895,7 @@ PICT # misc.
'doubleredirects' => 'تحويلات مزدوجه',
'doubleredirectstext' => 'الصÙحة دى Ùيها لستة الصÙحات اللى Ùيها تحويلة لصÙحة تانية Ùيها تحويلة.
كل سطر ÙÙ‰ اللستة دى Ùيه لينك للتحويلة الأولانية والتانية Ùˆ كمان للصÙحة بتاعة التحويلة التانية Ùˆ اللى غالبا هى الصÙحة الاصلية اللى المÙروض التحويلة الاولانية توصل ليها.
-<s>Crossed out</s> اتحلت.',
+<del>Crossed out</del> اتحلت.',
'double-redirect-fixed-move' => '[[$1]] اتنقلت، هى دلوقتى تحويله ل [[$2]]',
'double-redirect-fixer' => 'مصلح التحويل',
@@ -2113,7 +2102,6 @@ PICT # misc.
# Watchlist
'watchlist' => 'لستة الصÙحات اللى باراقبها',
'mywatchlist' => 'لستة الصÙØ­ اللى باراقبها',
-'watchlistfor' => "(Ù„ '''$1''')",
'nowatchlist' => 'ماÙيش حاجة ÙÙ‰ لستة مراقبتك.',
'watchlistanontext' => 'لو سمحت $1 لعرض أو تعديل الصÙحات ÙÙ‰ لستة مراقبتك.',
'watchnologin' => 'مش متسجل',
@@ -2235,7 +2223,9 @@ $UNWATCHURL
'revertpage-nouser' => 'استرجع التعديلات بتاعه (اسم اليوزر اتمسح) لغايه آخر نسخه بتاعه [[User:$1|$1]]',
'rollback-success' => 'استرجع تعديلات $1؛
استرجع لآخر نسخة بواسطة $2.',
-'sessionfailure' => 'الظاهر انه ÙÙ‰ مشكلة ÙÙ‰ جلسة دخولك دى Ø›
+
+# Edit tokens
+'sessionfailure' => 'الظاهر انه ÙÙ‰ مشكلة ÙÙ‰ جلسة دخولك دى Ø›
وعلشان كدا العملية دى اتلغت كإجراء احترازى ضد الاختراق.
لو سمحت دوس على زرار"رجوع" علشان تحمل الصÙحة اللى جيت منها مرة تانية، Ùˆ بعدين حاول تاني.',
@@ -2447,7 +2437,6 @@ $1',
'ipb-edit-dropdown' => 'عدل أسباب المنع',
'ipb-unblock-addr' => 'رÙع منع $1',
'ipb-unblock' => 'رÙع المنع عن يوزر أو عنوان أيبي',
-'ipb-blocklist-addr' => 'عرض المنع الموجود دلوقتى ل$1',
'ipb-blocklist' => 'عرض حالات المنع الموجودة دلوقتي',
'ipb-blocklist-contribs' => 'مساهمات $1',
'unblockip' => 'رÙع منع يوزر',
@@ -2922,10 +2911,10 @@ $1',
'imagemaxsize' => "حد حجم الصوره:<br />''(لصÙحات الوص٠بتاع الملÙات)''",
'thumbsize' => 'حجم العرض المتصغر:',
'widthheightpage' => '$1×$2ØŒ $3 {{PLURAL:$3|صÙحة|صÙحة}}',
-'file-info' => '(حجم الملÙ: $1ØŒ نوع MIME: $2)',
-'file-info-size' => '($1 × $2 بكسل حجم الÙايل: $3ØŒ نوع MIME: $4)',
+'file-info' => 'حجم الملÙ: $1ØŒ نوع MIME: $2',
+'file-info-size' => '$1 × $2 بكسل حجم الÙايل: $3ØŒ نوع MIME: $4',
'file-nohires' => '<small>ماÙيش ريزوليوشن اعلى متوÙر.</small>',
-'svg-long-desc' => '(مل٠SVGØŒ اساسا $1 × $2 بكسل، حجم الملÙ: $3)',
+'svg-long-desc' => 'مل٠SVGØŒ اساسا $1 × $2 بكسل، حجم الملÙ: $3',
'show-big-image' => 'الصورة بدقه كامله',
'show-big-image-thumb' => '<small>حجم البروÙÙ‡ دى: $1 × $2 بكسل</small>',
'file-info-gif-looped' => 'ملÙÙˆÙ',
@@ -3549,6 +3538,11 @@ $1',
'tags-edit' => 'تعديل',
'tags-hitcount' => '$1 {{PLURAL:$1|تغيير|تغيير}}',
+# Special:ComparePages
+'compare-page1' => 'صÙحه 1',
+'compare-page2' => 'صÙحه 2',
+'compare-submit' => 'قارن',
+
# Database error messages
'dberr-header' => 'الويكى دا Ùيه مشكله',
'dberr-problems' => 'متأسÙين، السايت دا بيعانى من صعوبات Ùنيه',
diff --git a/languages/messages/MessagesAs.php b/languages/messages/MessagesAs.php
index 177964ae..a9f890cc 100644
--- a/languages/messages/MessagesAs.php
+++ b/languages/messages/MessagesAs.php
@@ -18,71 +18,81 @@
* @author Urhixidur
*/
-$fallback='bn';
+$fallback = 'bn';
$namespaceNames = array(
NS_MEDIA => 'মাধà§à¦¯à¦®',
NS_SPECIAL => 'বিশেষ',
- NS_TALK => 'বারà§à¦¤à¦¾',
+ NS_TALK => 'বাৰà§à¦¤à¦¾',
NS_USER => 'সদসà§à¦¯',
- NS_USER_TALK => 'সদসà§à¦¯ বারà§à¦¤à¦¾',
- NS_PROJECT_TALK => '$1 বারà§à¦¤à¦¾',
- NS_FILE => 'চিতà§à¦°',
- NS_FILE_TALK => 'চিতà§à¦° বারà§à¦¤à¦¾',
- NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki বারà§à¦¤à¦¾',
+ NS_USER_TALK => 'সদসà§à¦¯_বাৰà§à¦¤à¦¾',
+ NS_PROJECT_TALK => '$1_বাৰà§à¦¤à¦¾',
+ NS_FILE => 'চিতà§à§°',
+ NS_FILE_TALK => 'চিতà§à§°_বাৰà§à¦¤à¦¾',
+ NS_MEDIAWIKI => 'মেডিয়াৱিকি',
+ NS_MEDIAWIKI_TALK => 'মেডিয়াৱিকি_বাৰà§à¦¤à¦¾',
NS_TEMPLATE => 'সাà¦à¦š',
- NS_TEMPLATE_TALK => 'সাà¦à¦š বারà§à¦¤à¦¾',
+ NS_TEMPLATE_TALK => 'সাà¦à¦š_বাৰà§à¦¤à¦¾',
NS_HELP => 'সহায়',
- NS_HELP_TALK => 'সহায় বারà§à¦¤à¦¾',
- NS_CATEGORY => 'শà§à¦°à§‡à¦£à§€',
- NS_CATEGORY_TALK => 'শà§à¦°à§‡à¦£à§€ বারà§à¦¤à¦¾',
+ NS_HELP_TALK => 'সহায়_বাৰà§à¦¤à¦¾',
+ NS_CATEGORY => 'শà§à§°à§‡à¦£à§€',
+ NS_CATEGORY_TALK => 'শà§à§°à§‡à¦£à§€_বাৰà§à¦¤à¦¾',
);
$namespaceAliases = array(
'विशेष' => NS_SPECIAL,
'वारà¥à¤¤à¤¾' => NS_TALK,
+ 'বারà§à¦¤à¦¾' => NS_TALK,
'सदसà¥à¤¯' => NS_USER,
'सदसà¥à¤¯_वारà¥à¤¤à¤¾' => NS_USER_TALK,
+ 'সদসà§à¦¯ বারà§à¦¤à¦¾' => NS_USER_TALK,
'$1_वारà¥à¤¤à¤¾' => NS_PROJECT_TALK,
+ '$1 বারà§à¦¤à¦¾' => NS_PROJECT_TALK,
'चितà¥à¤°' => NS_FILE,
'चितà¥à¤°_वारà¥à¤¤à¤¾' => NS_FILE_TALK,
+ 'চিতà§à¦°' => NS_FILE,
+ 'চিতà§à¦° বারà§à¦¤à¦¾' => NS_FILE_TALK,
+ 'MediaWiki বারà§à¦¤à¦¾' => NS_MEDIAWIKI_TALK,
'साà¤à¤šà¤¾' => NS_TEMPLATE,
'साà¤à¤šà¤¾_वारà¥à¤¤à¤¾' => NS_TEMPLATE_TALK,
+ 'সাà¦à¦š বারà§à¦¤à¦¾' => NS_TEMPLATE_TALK,
+ 'সহায় বারà§à¦¤à¦¾' => NS_HELP_TALK,
'शà¥à¤°à¥‡à¤£à¥€' => NS_CATEGORY,
'शà¥à¤°à¥‡à¤£à¥€_वारà¥à¤¤à¤¾' => NS_CATEGORY_TALK,
+ 'শà§à¦°à§‡à¦£à§€' => NS_CATEGORY,
+ 'শà§à¦°à§‡à¦£à§€ বারà§à¦¤à¦¾' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
- 'Userlogin' => array( 'সদসà§à¦¯à§° পà§à¦°à¦¬à§‡à¦¶' ),
- 'Userlogout' => array( 'সদসà§à¦¯à§° পà§à¦°à¦¸à§à¦¥à¦¾à¦¨' ),
+ 'Userlogin' => array( 'সদসà§à¦¯à§°_পà§à§°à¦¬à§‡à¦¶' ),
+ 'Userlogout' => array( 'সদসà§à¦¯à§°_পà§à§°à¦¸à§à¦¥à¦¾à¦¨' ),
'CreateAccount' => array( 'সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿' ),
'Preferences' => array( 'পচনà§à¦¦' ),
'Watchlist' => array( 'লকà§à¦·à§à¦¯à¦¤à¦¾à¦²à¦¿à¦•à¦¾' ),
- 'Recentchanges' => array( 'শেহতীয়া কাম' ),
+ 'Recentchanges' => array( 'শেহতীয়া_কাম' ),
'Upload' => array( 'বোজাই' ),
- 'Listfiles' => array( 'চিতà§à¦°-তালিকা' ),
- 'Newimages' => array( 'নতà§à¦¨ চিতà§à¦°' ),
+ 'Listfiles' => array( 'চিতà§à§°-তালিকা' ),
+ 'Newimages' => array( 'নতà§à¦¨_চিতà§à§°' ),
'Listusers' => array( 'সদসà§à¦¯-তালিকা' ),
- 'Listgrouprights' => array( 'গোটৰ অধিকাৰসমà§à¦¹' ),
+ 'Listgrouprights' => array( 'গোটৰ_অধিকাৰসমূহ' ),
'Statistics' => array( 'পৰিসংখà§à¦¯à¦¾' ),
'Randompage' => array( 'আকসà§à¦®à¦¿à¦•' ),
- 'Lonelypages' => array( 'অকলশৰীয়া পৃষà§à¦ à¦¾' ),
- 'Uncategorizedpages' => array( 'অবিনà§à¦¯à¦¸à§à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§à¦¹' ),
- 'Uncategorizedcategories' => array( 'অবিনà§à¦¯à¦¸à§à¦¤ শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ' ),
- 'Uncategorizedimages' => array( 'অবিনà§à¦¯à¦¸à§à¦¤ চিতà§à§°à¦¬à§‹à§°' ),
- 'Uncategorizedtemplates' => array( 'অবিনà§à¦¯à¦¸à§à¦¤ সাà¦à¦šà¦¬à§‹à§°' ),
- 'Unusedcategories' => array( 'অবà§à¦¯à§±à¦¹à§ƒà¦¤ শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ' ),
- 'Unusedimages' => array( 'অবà§à¦¯à§±à¦¹à§ƒà¦¤ চিতà§à§°à¦¬à§‹à§°' ),
- 'Wantedpages' => array( 'আকাংকà§à¦·à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
- 'Wantedcategories' => array( 'আকাংকà§à¦·à¦¿à¦¤ শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ' ),
- 'Allpages' => array( 'সকলোবোৰ পৃষà§à¦ à¦¾' ),
- 'Specialpages' => array( 'বিশেষ পৃষà§à¦ à¦¾à¦¬à§‹à§°' ),
+ 'Lonelypages' => array( 'অকলশৰীয়া_পৃষà§à¦ à¦¾' ),
+ 'Uncategorizedpages' => array( 'অবিনà§à¦¯à¦¸à§à¦¤_পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
+ 'Uncategorizedcategories' => array( 'অবিনà§à¦¯à¦¸à§à¦¤_শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ' ),
+ 'Uncategorizedimages' => array( 'অবিনà§à¦¯à¦¸à§à¦¤_চিতà§à§°à¦¬à§‹à§°' ),
+ 'Uncategorizedtemplates' => array( 'অবিনà§à¦¯à¦¸à§à¦¤_সাà¦à¦šà¦¬à§‹à§°' ),
+ 'Unusedcategories' => array( 'অবà§à¦¯à§±à¦¹à§ƒà¦¤_শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ' ),
+ 'Unusedimages' => array( 'অবà§à¦¯à§±à¦¹à§ƒà¦¤_চিতà§à§°à¦¬à§‹à§°' ),
+ 'Wantedpages' => array( 'আকাংকà§à¦·à¦¿à¦¤_পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
+ 'Wantedcategories' => array( 'আকাংকà§à¦·à¦¿à¦¤_শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ' ),
+ 'Allpages' => array( 'সকলোবোৰ_পৃষà§à¦ à¦¾' ),
+ 'Specialpages' => array( 'বিশেষ_পৃষà§à¦ à¦¾à¦¬à§‹à§°' ),
'Contributions' => array( 'অৱদানবোৰ' ),
- 'Mypage' => array( 'মোৰ পৃষà§à¦ à¦¾' ),
- 'Mytalk' => array( 'মোৰ কথোপকথন' ),
- 'Mycontributions' => array( 'মোৰ অৱদান' ),
- 'Popularpages' => array( 'জনপà§à§°à¦¿à¦¯à¦¼ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
+ 'Mypage' => array( 'মোৰ_পৃষà§à¦ à¦¾' ),
+ 'Mytalk' => array( 'মোৰ_কথোপকথন' ),
+ 'Mycontributions' => array( 'মোৰ_অৱদান' ),
+ 'Popularpages' => array( 'জনপà§à§°à¦¿à¦¯à¦¼_পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
);
$digitTransformTable = array(
@@ -114,8 +124,7 @@ $messages = array(
'tog-editsection' => '[সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক] সংযোগৰ দà§à¦¬à¦¾à§°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰা সকà§à§°à§€à¦¯à¦¼ কৰক',
'tog-editsectiononrightclick' => 'বিষয়ৰ শিৰোণামাত সো-বà§à¦Ÿà¦¾à¦® টিপা মাৰি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰাতো সকà§à§°à§€à¦¯à¦¼ কৰক (JavaScript)',
'tog-showtoc' => 'শিৰোণামাৰ সà§à¦šà§€ দেখà§à§±à¦¾à¦“ক (যিবোৰ পৃষà§à¦ à¦¾à¦¤ তিনিতাতকৈ বেছি শিৰোণামা আছে)',
-'tog-rememberpassword' => 'মোৰ পà§à§°à§±à§‡à¦¶ à¦à¦‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ মনত ৰাখক',
-'tog-editwidth' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বাকছ সমà§à¦ªà§‚ৰà§à¦£ ৰূপে ভাবে বহল কৰক',
+'tog-rememberpassword' => 'মোৰ পà§à§°à§±à§‡à¦¶ à¦à¦‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ মনত ৰাখক (সৰà§à¦¬à¦¾à¦§à¦¿à¦• $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
'tog-watchcreations' => 'মই বনোৱা সকলো পৃষà§à¦ à¦¾ মোৰ লকà§à¦·à§à¦¯-তালিকাত যোগ কৰক',
'tog-watchdefault' => 'মই সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰা সকলো পৃষà§à¦ à¦¾ মোৰ লকà§à¦·à§à¦¯-তালিকাত যোগ কৰক',
'tog-watchmoves' => 'মই সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা সকলো পৃষà§à¦ à¦¾ মোৰ লকà§à¦·à§à¦¯-তালিকাত যোগ কৰক',
@@ -259,31 +268,21 @@ $messages = array(
'faqpage' => 'Project:পà§à§°à¦¾à¦¯à¦¼à§‡ উঠা পà§à§°à¦¶à§à¦¨',
# Vector skin
-'vector-action-addsection' => 'বিষয় যোগ',
-'vector-action-delete' => 'মচি পেলাওক',
-'vector-action-move' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰক',
-'vector-action-protect' => 'সংৰকà§à¦·à¦¿à¦¤ কৰক',
-'vector-action-undelete' => 'মচি পেলাওà¦à¦•',
-'vector-action-unprotect' => 'অসংৰকà§à¦·à¦¿à¦¤ কৰক',
-'vector-namespace-category' => 'বিষয়শà§à§°à§‡à¦£à§€',
-'vector-namespace-help' => 'সহায় পৃষà§à¦ à¦¾',
-'vector-namespace-image' => 'ফাইল',
-'vector-namespace-main' => 'পৃষà§à¦ à¦¾',
-'vector-namespace-media' => 'মেডিয়া পৃষà§à¦ à¦¾',
-'vector-namespace-mediawiki' => 'বাৰà§à¦¤à¦¾',
-'vector-namespace-project' => 'পà§à§°à¦•à¦²à§à¦ª পৃষà§à¦ à¦¾',
-'vector-namespace-special' => 'বিশেষ পৃষà§à¦ à¦¾',
-'vector-namespace-talk' => 'কথা-বতৰা',
-'vector-namespace-template' => 'টেমà§à¦ªà¦²à§‡à¦Ÿ',
-'vector-namespace-user' => 'সদসà§à¦¯ পৃষà§à¦ à¦¾',
-'vector-view-create' => 'সৃষà§à¦Ÿà¦¿ কৰক',
-'vector-view-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
-'vector-view-history' => 'ইতিহাস চাওà¦à¦•',
-'vector-view-view' => 'পঢ়ক',
-'vector-view-viewsource' => 'উৎস চাওà¦à¦•',
-'actions' => 'কাৰà§à¦¯à§à¦¯à¦¸à¦®à§‚হ',
-'namespaces' => 'নামসà§à¦¥à¦¾à¦¨',
-'variants' => 'বিকলà§à¦ªà¦¸à¦®à§‚হ',
+'vector-action-addsection' => 'বিষয় যোগ',
+'vector-action-delete' => 'মচি পেলাওক',
+'vector-action-move' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰক',
+'vector-action-protect' => 'সংৰকà§à¦·à¦¿à¦¤ কৰক',
+'vector-action-undelete' => 'মচি পেলাওà¦à¦•',
+'vector-action-unprotect' => 'অসংৰকà§à¦·à¦¿à¦¤ কৰক',
+'vector-simplesearch-preference' => 'উৎকৃষà§à¦Ÿ সনà§à¦§à¦¾à¦¨à§° দিহা-পোহা সকà§à§°à¦¿à¦¯à¦¼ কৰক (ভেকà§à¦Ÿà§° সà§à¦•à¦¿à¦¨à§° বাবেহে)',
+'vector-view-create' => 'সৃষà§à¦Ÿà¦¿ কৰক',
+'vector-view-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+'vector-view-history' => 'ইতিহাস চাওà¦à¦•',
+'vector-view-view' => 'পঢ়ক',
+'vector-view-viewsource' => 'উৎস চাওà¦à¦•',
+'actions' => 'কাৰà§à¦¯à§à¦¯à¦¸à¦®à§‚হ',
+'namespaces' => 'নামসà§à¦¥à¦¾à¦¨',
+'variants' => 'বিকলà§à¦ªà¦¸à¦®à§‚হ',
'errorpagetitle' => 'ভà§à¦²',
'returnto' => '$1 লৈ ঘà§à§°à¦¿ যাà¦à¦“ক ।',
@@ -344,6 +343,9 @@ $messages = array(
অনà§à¦—à§à§°à¦¹ কৰি অলপ পাচত à¦à¦‡ পৃষà§à¦ à¦¾ চাব পà§à§°à¦¯à¦¼à¦¾à¦¸ কৰক ।
$1',
+'pool-timeout' => 'লকৰ বাবে অপেকà§à¦·à¦¾ কৰি সময় উকলি গৈছে',
+'pool-queuefull' => 'পোল কিউ (pool queue) সমূল',
+'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}}ৰ বৃতà§à¦¤à¦¾à¦¨à§à¦¤',
@@ -391,6 +393,7 @@ $1',
'viewdeleted' => '$1 চাওক?',
'restorelink' => '{{PLURAL:$1| à¦à¦Ÿà¦¾ বিলà§à¦ªà§à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|$1 টা বিলà§à¦ªà§à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}}',
'feedlinks' => 'ফিড:',
+'feed-invalid' => 'অবৈধ গà§à§°à¦¾à¦¹à¦• ফীড পà§à§°à¦•à¦¾à§°',
'feed-unavailable' => 'সিনà§à¦¡à¦¿à¦•à§‡à¦¶à¦¨ ফিড মজà§à¦¤ নাই',
'site-rss-feed' => '$1 আৰ à¦à¦¸ à¦à¦¸ ফিড',
'site-atom-feed' => '$1 à¦à¦Ÿà¦® ফিড',
@@ -423,6 +426,17 @@ $1',
# General errors
'error' => 'ভà§à¦²',
'databaseerror' => 'তথà§à¦¯à¦•à§‹à¦·à§° ভà§à¦²',
+'dberrortext' => 'à¦à¦• ডাটাবেচ চিণà§à¦Ÿà§‡à¦•à§à¦¸ তà§à§°à§à¦Ÿà¦¿ ঘটিছে।
+ছফà§à¦Ÿà§±à§‡à§°à¦¤ থকা কোনো বাগৰ বাবে à¦à¦¨à§‡ হব পাৰে।
+অনà§à¦¤à¦¿à¦®à¦¬à¦¾à§° চেষà§à¦Ÿà¦¾ কৰা ডাটাবেচ কà§à§±à§‡à§°à§€à¦Ÿà§‹ আছিল à¦à¦¨à§‡à¦§à§°à¦£à§°:
+<blockquote><tt>$1</tt></blockquote>
+"<tt>$2</tt>" ফাংচনৰ পৰা
+ডাটাবেচে পà§à§°à§‡à§°à¦£ কৰা তà§à§°à§à¦Ÿà¦¿: "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'à¦à¦• ডাটাবেচ চিণà§à¦Ÿà§‡à¦•à§à¦¸ তà§à§°à§à¦Ÿà¦¿ ঘটিছে।
+অনà§à¦¤à¦¿à¦®à¦¬à¦¾à§° চেষà§à¦Ÿà¦¾ কৰা ডাটাবেচ কà§à§±à§‡à§°à§€à¦Ÿà§‹ আছিল à¦à¦¨à§‡à¦§à§°à¦£à§°:
+"$1"
+"$2" ফাংচনৰ পৰা
+ডাটাবেচে পà§à§°à§‡à§°à¦£ কৰা তà§à§°à§à¦Ÿà¦¿ "$3: $4"',
'laggedslavemode' => 'সাবধান: ইয়াত সামà§à¦ªà§à§°à¦¤à¦¿à¦• সাল-সলনি নাথাকিব পাৰে',
'readonly' => 'তথà§à¦¯à¦•à§‹à¦· বনà§à¦§ কৰা আছে',
'enterlockreason' => 'বনà§à¦§ কৰাৰ কাৰণ দিয়ক, লগতে কেতিয়ামানে খোলা হব তাকো জনাব।',
@@ -482,7 +496,8 @@ $1',
'yourname' => 'সদসà§à¦¯à¦¨à¦¾à¦®:',
'yourpassword' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦',
'yourpasswordagain' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ আকৌ à¦à¦¬à¦¾à§° লিখক',
-'remembermypassword' => 'মোৰ পà§à§°à§±à§‡à¦¶ à¦à¦‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ মনত ৰাখিব',
+'remembermypassword' => 'মোৰ পà§à§°à§±à§‡à¦¶ à¦à¦‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ মনত ৰাখিব (সৰà§à¦¬à¦¾à¦§à¦¿à¦• $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
+'securelogin-stick-https' => 'পà§à§°à§±à§‡à¦¶ কৰা পাছত HTTPS-ৰ দà§à¦¬à¦¾à§°à¦¾ সংযোগ ৰাখক',
'yourdomainname' => 'আপোনাৰ দমেইন:',
'login' => 'পà§à§°à§±à§‡à¦¶',
'nav-login-createaccount' => 'পà§à§°à§±à§‡à¦¶/সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿',
@@ -498,6 +513,7 @@ $1',
'gotaccount' => "আপà§à¦¨à¦¿ সদসà§à¦¯ হয়নে? '''$1'''",
'gotaccountlink' => 'পà§à§°à¦¬à§‡à¦¶',
'createaccountmail' => 'ই-মেইলেৰে',
+'createaccountreason' => 'কাৰণ:',
'badretype' => 'আপà§à¦¨à¦¿ দিয়া গà§à¦ªà§à¦¤ শবà§à¦¦ দà§à¦Ÿà¦¾ মিলা নাই।',
'userexists' => 'আপà§à¦¨à¦¿ দিয়া সদসà§à¦¯à¦¨à¦¾à¦® আগৰে পৰাই বà§à¦¯à§±à¦¹à¦¾à§° হৈ আছে।
অনà§à¦—à§à§°à¦¹ কৰি বেলেগ সদসà§à¦¯à¦¨à¦¾à¦® à¦à¦Ÿà¦¾ বাচনী কৰক।',
@@ -524,6 +540,7 @@ $1',
'wrongpasswordempty' => 'দিয়া গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦à¦¤à§‹ খালী; অনà§à¦—à§à§°à¦¹ কৰি আকৌ à¦à¦¬à¦¾à§° চেষà§à¦Ÿà¦¾ কৰক। ।',
'passwordtooshort' => "গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ কমেও {{PLURAL:$1|১ তা|$1 তা}} আখৰ হ'ব লাগিব ।",
'password-name-match' => "আপà§à¦¨à¦¾à§° গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ আৰৠআপà§à¦¨à¦¾à§° সদসà§à¦¯à¦¨à¦¾à¦® বেলেগ হ'ব লাগিব",
+'password-login-forbidden' => 'à¦à¦‡ সদসà§à¦¯à¦¨à¦¾à¦® আৰৠগà§à¦ªà§à¦¤à¦¸à¦¬à§à¦¦à§° বà§à¦¯à§±à¦¹à¦¾à§° নিষিদà§à¦§ কৰা হৈছে ।',
'mailmypassword' => 'ই-মেইলত গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ পঠাওক',
'passwordremindertitle' => '{{SITENAME}} ৰ কাৰণে নতà§à¦¨ অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦',
'passwordremindertext' => 'কোনোবাই (হয়তো আপà§à¦¨à¦¿, $1 আই-পি ঠিকনাৰ পৰা)
@@ -562,6 +579,9 @@ $1',
অনà§à¦—à§à§°à¦¹ কৰি কিছৠসময় অপেকà§à¦·à¦¾ কৰি আকৌ পà§à§°à¦¯à¦¼à¦¾à¦¸ কৰক ।',
'loginlanguagelabel' => 'ভাষা: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'পি-à¦à¦‡à¦›-পি mail() ফলনত অজà§à¦žà¦¾à¦¤ তà§à§°à§à¦Ÿà¦¿',
+
# Password reset dialog
'resetpass' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ শলনি',
'resetpass_announce' => 'আপà§à¦¨à¦¿ ই-মেইলত পোৱা অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦à§°à§‡ পà§à§°à§±à§‡à¦¶ কৰিছে।
@@ -612,11 +632,12 @@ $1',
'showdiff' => 'সালসলনিবোৰ দেখà§à§±à¦¾à¦“ক',
'anoneditwarning' => "'''সাৱধান:''' আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা নাই ।
à¦à¦‡ পৃষà§à¦ à¦¾à§° ইতিহাসত আপোনাৰ আই পি ঠিকনা সংৰকà§à¦·à¦¿à¦¤ কৰা হ'ব।",
+'anonpreviewwarning' => "''আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা নাই । আপà§à¦¨à¦¾à§° সমà§à¦ªà¦¦à¦¨à¦¾ সাà¦à¦šà¦¿à¦²à§‡ আপà§à¦¨à¦¾à§° আই-পি ঠিকনা à¦à¦‡ পৃষà§à¦ à¦¾à§° ইতিহাসত সংৰকà§à¦·à¦¿à¦¤ কৰা হব।\"",
'missingsummary' => "'''সà§à¦®à¦¾à§°à¦•:''' আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সাৰাংশ দিয়া নাই।
আপà§à¦¨à¦¿ আৰৠà¦à¦¬à¦¾à§° সংৰকà§à¦·à¦£à§° বাবে কà§à¦²à§€à¦• কৰিলে সাৰাংশৰ অবিহনে সংৰকà§à¦·à¦¿à¦¤ হব।",
'missingcommenttext' => 'অনà§à¦—à§à§°à¦¹ কৰি তলত মনà§à¦¤à¦¬à§à¦¯ à¦à¦Ÿà¦¾ দিয়à§à¦•à¥¤',
'missingcommentheader' => "'''সà§à¦®à¦¾à§°à¦•:''' আপà§à¦¨à¦¿ à¦à¦‡ মনà§à¦¤à¦¬à§à¦¯à¦Ÿà§‹à¦¤ শিৰোণামা দিয়া নাই।
-যদি আকৌ à¦à¦¬à¦¾à§° সংৰকà§à¦·à¦¿à¦¤ কৰে, তেনেহলে শিৰোণামা অবিহনে সংৰকà§à¦·à¦¿à¦¤ হব।",
+যদি আকৌ à¦à¦¬à¦¾à§° যদি \"{{int:savearticle}}\" টিপে, তেনেহলে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ শিৰোণামা অবিহনে সংৰকà§à¦·à¦¿à¦¤ হব।",
'summary-preview' => 'সাৰাংশৰ খচৰা:',
'subject-preview' => 'বিষয়/শিৰোণামাৰ খচৰা:',
'blockedtitle' => 'সদসà§à¦¯à¦œà¦¨à¦• অবৰোধ কৰা হৈছে',
@@ -721,8 +742,6 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
ইয়াত আপোনাৰ লিখনি দিয়াৰ লগে লগে আপà§à¦¨à¦¿ আপোনা-আপà§à¦¨à¦¿ পà§à§°à¦¤à¦¿à¦¶à§à§°à§à¦¤à¦¿ দিছে যে à¦à¦‡ লিখনিটো আপোনাৰ মৌলিক লিখনি, বা কোনো সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à§° নথকা বা কোনো ৰাজহà§à§±à¦¾ ৱেবছাইট বা তেনে কোনো মà§à¦•à¦²à¦¿ উৎসৰ পৰা আহৰণ কৰা| (অধিক জানিবলৈ $1 চাà¦à¦“ক)
'''সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à§°à¦¯à§à¦•à§à¦¤ কোনো সমল অনà§à¦®à¦¤à¦¿ অবিহনে দাখিল নকৰে যেন!'''",
-'longpagewarning' => "'''সাবধান: à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ $1 কিলোবাইট আকাৰৰ; কিছà§à¦®à¦¾à¦¨ বà§à§°à¦¾à¦‰à¦œà¦¾à§°à§‡ ৩২ কিলোবাইটৰ বা তাতকৈ বেছি আকাৰৰ পৃষà§à¦ à¦¾ দেখà§à§±à¦¾à¦¬à¦²à§ˆ বা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ অসà§à¦¬à¦¿à¦§à¦¾ পাব পাৰে ।
-অনà§à¦—à§à§°à¦¹ কৰি à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à¦• সৰৠসৰৠখণà§à¦¡à¦¤ বিভকà§à¦¤ কৰাৰ কথা বিবেচনা কৰক ।'''",
'longpageerror' => "'''ভà§à¦²: আপà§à¦¨à¦¿ দিয়া লিখনী $1 কিলো-বাইট আকাৰৰ, যি $2 কিলো-বাইট সীমাটকৈ বেছি।
ইয়াক সঞà§à¦šà¦¿à¦¤ কৰিব পৰা নাযাব।'''",
'protectedpagewarning' => "সকিয়নি: à¦à¦‡ পৃষà§à¦ à¦¾ বনà§à¦§ ৰখা হৈছে; কেৱল à¦à¦¡à¦®à¦¿à¦¨à¦¿à¦·à§à¦Ÿà§à§°à§‡à¦Ÿà§° মৰà§à¦¯à¦¦à¦¾à§° সদসà§à¦¯à¦‡ হে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিব পাৰিব ।'''
@@ -826,6 +845,8 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'revdelete-unsuppress' => 'পà§à¦¨à§°à§à¦¸à§à¦¥à¦¾à¦ªà¦¨ কৰা সংশোধনসমূহৰ সীমাবদà§à¦§à¦¤à¦¾ আতৰাওà¦à¦•',
'revdelete-log' => 'কাৰণ:',
'revdel-restore' => 'দৃষà§à¦Ÿà¦¿à¦ªà¦¾à¦¤ সালসলনি কৰক',
+'revdel-restore-deleted' => 'বাতিল কৰা সংশোধনসমূহ',
+'revdel-restore-visible' => 'দৃশà§à¦¯à¦®à¦¾à¦¨ সংশোধনসমূহ',
'pagehist' => 'পৃষà§à¦ à¦¾ ইতিহাস',
'deletedhist' => 'মচি পেলোৱা ইতিহাস',
'revdelete-content' => 'বিষয়বসà§à¦¤à§',
@@ -864,10 +885,13 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
# Diffs
'history-title' => '"$1" ৰ সাল-সলনিৰ ইতিহাস',
'difference' => 'বিভিনà§à¦¨ সংসà§à¦•à§°à¦£à§° পà§à§°à¦­à§‡à¦¦',
+'difference-multipage' => '(পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ মাজত তফাৎ)',
'lineno' => '$1 নং শাৰীঃ',
'compareselectedversions' => 'নিৰà§à¦¬à¦¾à¦šà¦¿à¦¤ কৰা সংকলন সমূহৰ মাজত পাৰà§à¦¥à¦•à§à¦¯ চাà¦à¦“ক ।',
'showhideselectedversions' => 'নিৰà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধনসমূহ দেখোৱাওà¦à¦•/আà¦à§° কৰক',
'editundo' => 'পূৰà§à¦¬à¦¬à¦¤ কৰক',
+'diff-multi' => '({{PLURAL:$2|à¦à¦œà¦¨ সদসà§à¦¯à§°|$2জন সদসà§à¦¯à§°}} দà§à¦¬à¦¾à§°à¦¾ {{PLURAL:$1|à¦à¦Ÿà¦¾ মধà§à¦¯à§±à§°à§à¦¤à§€ সংশোধন|$1-টা মধà§à¦¯à§±à§°à§à¦¤à§€ সংশোধন}} দেখোৱা হোৱা নাই)',
+'diff-multi-manyusers' => '({{PLURAL:$2|à¦à¦œà¦¨à¦¤à¦•à§ˆ|$2-জনতকৈ}} অধিক সদসà§à¦¯à§° দà§à¦¬à¦¾à§°à¦¾ {{PLURAL:$1|à¦à¦Ÿà¦¾ মধà§à¦¯à§±à§°à§à¦¤à§€ সংশোধন|$1-টা মধà§à¦¯à§±à§°à§à¦¤à§€ সংশোধন}} দেখোৱা হোৱা নাই)',
# Search results
'searchresults' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§° ফলাফল',
@@ -972,6 +996,7 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'contextlines' => 'পà§à§°à¦¤à¦¿ শাৰী দৰà§à¦¶à¦¨:',
'contextchars' => 'পà§à§°à¦¤à¦¿ শাৰীত সনà§à¦¦à§°à§à¦­:',
'stub-threshold' => '<a href="#" class="stub">আধাৰ সংযোগ</a> ৰ সৰà§à¦¬à§‹à¦šà§à¦š আকাৰ (বাইটত):',
+'stub-threshold-disabled' => 'নিসà§à¦•à§à§°à¦¿à¦¯à¦¼',
'recentchangesdays' => 'শেহতীয়া সাল-সলনীত দেখà§à§±à¦¾à¦¬ লগা দিন:',
'recentchangesdays-max' => 'সৰà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিন|দিন}}',
'recentchangescount' => 'শেহতীয়া সাল-সলনী, ইতিহাস আৰৠলগ পৃষà§à¦ à¦¾à¦¤ দেখà§à§±à¦¾à¦¬ লগা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° সংখà§à¦¯à¦¾:',
@@ -1029,9 +1054,15 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'prefs-advancedrendering' => 'উচà§à¦šà¦¤à§° উপায়ানà§à¦¤à§° সমূহ',
'prefs-advancedsearchoptions' => 'উচà§à¦šà¦¤à§° উপায়ানà§à¦¤à§° সমূহ',
'prefs-advancedwatchlist' => 'উচà§à¦šà¦¤à§° উপায়ানà§à¦¤à§° সমূহ',
-'prefs-display' => 'পà§à§°à¦¦à§°à§à¦¶à¦¨à§€ উপায়ানà§à¦¤à§° সমূহ',
+'prefs-displayrc' => 'পà§à§°à¦¦à§°à§à¦¶à¦¨à§€ উপায়ানà§à¦¤à§° সমূহ',
+'prefs-displaysearchoptions' => 'বিকলà§à¦ª পà§à§°à¦¦à§°à§à¦¶à¦¨ কৰক',
+'prefs-displaywatchlist' => 'বিকলà§à¦ª পà§à§°à¦¦à§°à§à¦¶à¦¨ কৰক',
'prefs-diffs' => 'পাৰà§à¦¥à¦•à§à¦¯',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ই-মেইল ঠিকনাটো সঠিক',
+'email-address-validity-invalid' => 'সঠিক ই-মেইল ঠিকনা পà§à§°à¦¦à¦¾à¦¨ কৰক',
+
# User rights
'userrights' => 'সদসà§à¦¯à§° অধিকাৰ বà§à¦¯à§±à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾',
'userrights-lookup-user' => 'সদসà§à¦¯ গোটবোৰ বà§à¦¯à§±à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ কৰক',
@@ -1170,7 +1201,9 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'ignorewarnings' => 'সকলো সতৰà§à¦•à¦¬à¦¾à¦£à§€ আওকাণ কৰক',
'minlength1' => "ফাইলনাম কমেও à¦à¦Ÿà¦¾ আখৰৰ হ'ব লাগে ।",
'badfilename' => 'ফাইলনাম "$1"-লৈ সলনি কৰা হ\'ল ।',
-'successfulupload' => "আপলোড সফল হ'ল",
+'empty-file' => 'আপà§à¦¨à¦¿ দাখিল কৰা ফাইলখন খালী ।',
+'illegal-filename' => 'ফাইলৰ à¦à¦‡ নামটো গà§à§°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নহয় ।',
+'tmp-create-error' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইল তৈয়াৰ কৰিব পৰা নহ’ল |',
'uploadwarning' => 'আপলোড সতৰà§à¦•à¦¬à¦¾à¦£à§€',
'savefile' => 'সংৰকà§à¦·à¦£',
'uploadedimage' => '"[[$1]]" আপলোড কৰা হ’ল',
@@ -1180,6 +1213,8 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'upload-description' => 'ফাইলৰ বৰà§à¦£à¦¨à¦¾',
'upload-options' => "আপল'ড বিকলà§à¦ªà¦¸à¦®à§‚হ",
'watchthisupload' => 'à¦à¦‡ ফাইল লকà§à¦·à§à¦¯ কৰক',
+'upload-success-subj' => "আপলোড সফল হ'ল",
+'upload-warning-subj' => 'আপলোড সতৰà§à¦•à§€à¦•à§°à¦£',
# Special:ListFiles
'imgfile' => 'ফাইল',
@@ -1346,19 +1381,19 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'listgrouprights-removegroup-all' => 'সমসà§à¦¤ গোট আà¦à¦¤à§°à¦¾à¦“ক',
# E-mail user
-'emailuser' => 'à¦à¦‡ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ ই-মেইল পথাওক',
-'emailfrom' => 'পà§à§°à§‡à§°à¦•',
-'emailsubject' => 'বিষয়',
-'emailmessage' => 'বাৰà§à¦¤à¦¾',
-'emailsend' => 'পà§à§°à§‡à§°à¦£ কৰক',
-'emailccme' => 'মোৰ বাৰà§à¦¤à¦¾à§° à¦à¦Ÿà¦¾ পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ মোলৈ ই-মেইল কৰক',
-'emailsent' => 'ই-মেইল পà§à§°à§‡à§°à¦£ কৰা হ’ল',
-'emailsenttext' => 'আপোনাৰ ই-মেইল বাৰà§à¦¤à¦¾ পà§à§°à§‡à§°à¦£ কৰা হৈছে',
+'emailuser' => 'à¦à¦‡ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ ই-মেইল পথাওক',
+'usermaildisabled' => 'বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° ই-মেইল নিষà§à¦•à§à§°à¦¿à¦¯à¦¼',
+'emailfrom' => 'পà§à§°à§‡à§°à¦•',
+'emailsubject' => 'বিষয়',
+'emailmessage' => 'বাৰà§à¦¤à¦¾',
+'emailsend' => 'পà§à§°à§‡à§°à¦£ কৰক',
+'emailccme' => 'মোৰ বাৰà§à¦¤à¦¾à§° à¦à¦Ÿà¦¾ পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ মোলৈ ই-মেইল কৰক',
+'emailsent' => 'ই-মেইল পà§à§°à§‡à§°à¦£ কৰা হ’ল',
+'emailsenttext' => 'আপোনাৰ ই-মেইল বাৰà§à¦¤à¦¾ পà§à§°à§‡à§°à¦£ কৰা হৈছে',
# Watchlist
'watchlist' => 'মই অনà§à¦¸à§°à¦£ কৰা পৃষà§à¦ à¦¾à¦¬à¦¿à¦²à¦¾à¦•à§° তালিকা',
'mywatchlist' => 'মই চকৠৰখা পৃষà§à¦ à¦¾à¦¬à§‹à§°à§° তালিকা',
-'watchlistfor' => "('''$1''' ৰ কাৰনে)",
'watchnologin' => 'পà§à§°à§±à§‡à¦¶ কৰা নাই',
'addedwatch' => 'লকà§à¦·à§à¦¯ তালিকাত অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤à¦¿ কৰা হল',
'addedwatchtext' => 'আপোনাৰ [[Special:Watchlist|লকà§à¦·à§à¦¯ তালিকাত ]] "[[:$1]]" অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤à¦¿ কৰা হ\'ল ।
@@ -1478,11 +1513,13 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'sp-contributions-newbies-title' => 'সদসà§à¦¯à§° বৰঙণি নতà§à¦¨ à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§° বাবে',
'sp-contributions-blocklog' => 'বাৰণ সূচী',
'sp-contributions-deleted' => 'ৰদ কৰা সদসà§à¦¯à§° বৰঙণিসমূহ',
+'sp-contributions-uploads' => 'আপলোডসমূহ',
'sp-contributions-logs' => 'অভিলেখ',
'sp-contributions-talk' => 'আলোচনা',
'sp-contributions-userrights' => 'সদসà§à¦¯à§° অধিকাৰ বà§à¦¯à§±à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾',
'sp-contributions-search' => 'বৰঙণিসমূহৰ কাৰণে অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক',
'sp-contributions-username' => 'আইপি ঠিকনা অথবা বà§à¦¯à§±à¦¹à¦¾à§°à¦•à§°à§à¦¤à¦¾à§° নাম:',
+'sp-contributions-toponly' => 'কেৱল সামপà§à§°à¦¤à¦¿à¦• সংশোধনসমূহ দেখোৱাওà¦à¦•',
'sp-contributions-submit' => 'সনà§à¦§à¦¾à¦¨ কৰক',
# What links here
@@ -1672,6 +1709,7 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'tooltip-compareselectedversions' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦¤ নিৰà§à¦¬à¦¾à¦šà¦¿à¦¤ কৰা দà§à¦Ÿà¦¾ অৱতৰৰ মাজত পাৰà§à¦¥à¦•à§à¦¯ দেখà§à§±à¦¾à¦“ক ।',
'tooltip-watch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ আপোনাৰ অনà§à¦¸à§°à¦£à¦¤à¦¾à¦²à¦¿à¦•à¦¾à¦­à§à¦•à§à¦¤ কৰক',
'tooltip-upload' => 'আপলোড আৰমà§à¦­ কৰক',
+'tooltip-summary' => 'চমৠসাৰাংশ লিখক',
# Attribution
'anonymous' => '{{SITENAME}}ৰ বেনামী {{PLURAL:$1|সদসà§à¦¯|সদসà§à¦¯à¦¸à¦•à¦²}}',
@@ -1710,12 +1748,14 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'nextdiff' => 'নতà§à¦¨à¦¤à§° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ →',
# Media information
-'file-info-size' => '($1 × $2 পিকà§à¦¸à§‡à¦², ফাইলৰ মাতà§à§°à¦¾: $3, MIME পà§à§°à¦•à¦¾à§°: $4)',
+'file-info' => 'ফাইল আকাৰ: $1, MIME ধৰণ: $2',
+'file-info-size' => '$1 × $2 পিকà§à¦¸à§‡à¦², ফাইলৰ মাতà§à§°à¦¾: $3, MIME পà§à§°à¦•à¦¾à§°: $4',
'file-nohires' => '<small>ইয়াতকৈ ডাঙৰকৈ দেখà§à§±à¦¾à¦¬ নোৱাৰি ।</small>',
-'svg-long-desc' => '(SVG ফাইল, সাধাৰণতঃ $1 × $2 পিকà§à¦¸à§‡à¦², ফাইল মাতà§à§°à¦¾: $3)',
+'svg-long-desc' => 'SVG ফাইল, সাধাৰণতঃ $1 × $2 পিকà§à¦¸à§‡à¦², ফাইল মাতà§à§°à¦¾: $3',
'show-big-image' => 'সমà§à¦ªà§‚ৰà§à¦£ দৃশà§à¦¯',
'show-big-image-thumb' => '<small>à¦à¦‡ খচৰাৰ আকাৰ: $1 × $2 পিকà§à¦¸à§‡à¦² </small>',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ফà§à§°à§‡à¦®|ফà§à§°à§‡à¦®}}',
+'file-info-png-repeat' => "$1 {{PLURAL:$1|বাৰ|বাৰ}} চলোৱা হ'ল",
# Special:NewFiles
'newimages' => 'নতà§à¦¨ ফাইলৰ বিথীকা',
@@ -1749,6 +1789,7 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'exif-datetime' => 'ফাইল সলনিৰ তাৰিখ আৰৠসময়',
'exif-imagedescription' => 'চিতà§à§° শিৰোনামা',
'exif-artist' => 'সà§à§°à¦·à§à¦Ÿà¦¾',
+'exif-objectname' => 'চমৠশীৰà§à¦·à¦•',
'exif-orientation-1' => 'সাধাৰণ',
@@ -1820,13 +1861,15 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'watchlisttools-raw' => 'কেà¦à¦šà¦¾ লকà§à¦·à§à¦¯-তালিকা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
# Special:Version
-'version' => 'সংসà§à¦•à§°à¦£',
-'version-specialpages' => 'বিশেষ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
-'version-other' => 'অনà§à¦¯',
-'version-version' => '(সংসà§à¦•à§°à¦£ $1)',
-'version-license' => 'লাইচেঞà§à¦š',
-'version-software-product' => 'পণà§à¦¯',
-'version-software-version' => 'সংসà§à¦•à§°à¦£',
+'version' => 'সংসà§à¦•à§°à¦£',
+'version-specialpages' => 'বিশেষ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
+'version-other' => 'অনà§à¦¯',
+'version-version' => '(সংসà§à¦•à§°à¦£ $1)',
+'version-license' => 'লাইচেঞà§à¦š',
+'version-poweredby-credits' => "à¦à¦‡ ৱিকি '''[http://www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দà§à¦¬à¦¾à§°à¦¾ পà§à§°à¦šà¦²à¦¿à¦¤ , কপিৰাইট © ২০০১-$1 $2.",
+'version-poweredby-others' => 'অনà§à¦¯',
+'version-software-product' => 'পণà§à¦¯',
+'version-software-version' => 'সংসà§à¦•à§°à¦£',
# Special:FilePath
'filepath' => 'ফাইল পথ',
@@ -1872,6 +1915,15 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'tags-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'tags-hitcount' => '$1 {{PLURAL:$1|সাল-সলনি|সাল-সলনিসমূহ}}',
+# Special:ComparePages
+'comparepages' => 'পৃষà§à¦ à¦¾ তà§à¦²à¦¨à¦¾ কৰক',
+'compare-selector' => 'পৃষà§à¦ à¦¾ পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ তà§à¦²à¦¨à¦¾ কৰক',
+'compare-page1' => 'পৃষà§à¦ à¦¾ ১',
+'compare-page2' => 'পৃষà§à¦ à¦¾ ২',
+'compare-rev1' => 'পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ ১',
+'compare-rev2' => 'পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ ২',
+'compare-submit' => 'তà§à¦²à¦¨à¦¾ কৰক',
+
# Database error messages
'dberr-header' => 'à¦à¦‡ ৱিকিট কেতবোৰ জেং লাগিছে',
@@ -1881,6 +1933,7 @@ $1ৰ দà§à¦¬à¦¾à§° à¦à¦‡ অবৰোধ কৰা হৈছে ।
'htmlform-float-invalid' => 'অপà§à¦¨à¦¿ ধাযà§à¦¯ কৰা মান সংখà§à¦¯à¦¾ নহয়',
'htmlform-int-toolow' => 'আপà§à¦¨à¦¿ ধাযà§à¦¯ কৰা মান নà§à¦¯à§‚নতম $1 তকৈ তলত',
'htmlform-int-toohigh' => 'আপà§à¦¨à¦¿ ধাযà§à¦¯ কৰা মান অধিকতম $1 তকৈ ওপৰত',
+'htmlform-required' => 'à¦à¦‡ মান আৱশà§à¦¯à¦•',
'htmlform-submit' => 'দাখিল কৰক',
'htmlform-reset' => 'সাল-সলনি পণà§à¦¡ কৰক',
'htmlform-selectorother-other' => 'অনà§à¦¯',
diff --git a/languages/messages/MessagesAst.php b/languages/messages/MessagesAst.php
index 58b4d747..bbb488f5 100644
--- a/languages/messages/MessagesAst.php
+++ b/languages/messages/MessagesAst.php
@@ -49,6 +49,12 @@ $namespaceAliases = array(
'Categoría_discusión' => NS_CATEGORY_TALK,
);
+$specialPageAliases = array(
+ 'Statistics' => array( 'Estadístiques' ),
+ 'Log' => array( 'Rexistru' ),
+ 'Blockip' => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Sorrayar enllaces:',
@@ -65,8 +71,7 @@ $messages = array(
'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-showtoc' => 'Amosar índiz (pa páxines con más de 3 encabezaos)',
-'tog-rememberpassword' => 'Recordar la clave ente sesiones',
-'tog-editwidth' => "Estenderexar la caxa d'edición pa que ocupe tola pantalla.",
+'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',
@@ -93,10 +98,10 @@ $messages = array(
'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-nolangconversion' => 'Deshabilitar la conversión de variantes de llingua',
+'tog-nolangconversion' => 'Desactivar la conversión de variantes',
'tog-ccmeonemails' => 'Mandame copies de los correos que mando a otros usuarios',
'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
-'tog-showhiddencats' => 'Amosar categoríes ocultes',
+'tog-showhiddencats' => 'Amosar categoríes anubríes',
'tog-norollbackdiff' => 'Desanicier les diferencies depués de restaurar',
'underline-always' => 'Siempre',
@@ -212,31 +217,21 @@ $messages = array(
'faqpage' => 'Project:Entrugues más frecuentes',
# Vector skin
-'vector-action-addsection' => 'Amestar asuntu',
-'vector-action-delete' => 'Desaniciar',
-'vector-action-move' => 'Treslladar',
-'vector-action-protect' => 'Protexer',
-'vector-action-undelete' => 'Des-desaniciar',
-'vector-action-unprotect' => 'Desprotexer',
-'vector-namespace-category' => 'Categoría',
-'vector-namespace-help' => "Páxina d'ayuda",
-'vector-namespace-image' => 'Ficheru',
-'vector-namespace-main' => 'Páxina',
-'vector-namespace-media' => 'Páxina de multimedia',
-'vector-namespace-mediawiki' => 'Mensaxe',
-'vector-namespace-project' => 'Páxina de proyeutu',
-'vector-namespace-special' => 'Páxina especial',
-'vector-namespace-talk' => 'Alderique',
-'vector-namespace-template' => 'Plantía',
-'vector-namespace-user' => "Páxina d'usuariu",
-'vector-view-create' => 'Crear',
-'vector-view-edit' => 'Editar',
-'vector-view-history' => 'Ver historial',
-'vector-view-view' => 'Lleer',
-'vector-view-viewsource' => 'Ver códigu fonte',
-'actions' => 'Aiciones',
-'namespaces' => 'Espacios de nome',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Amestar asuntu',
+'vector-action-delete' => 'Desaniciar',
+'vector-action-move' => 'Treslladar',
+'vector-action-protect' => 'Protexer',
+'vector-action-undelete' => 'Des-desaniciar',
+'vector-action-unprotect' => 'Desprotexer',
+'vector-simplesearch-preference' => 'Activar suxerencies de gueta enantaes (piel Vector namái)',
+'vector-view-create' => 'Crear',
+'vector-view-edit' => 'Editar',
+'vector-view-history' => 'Ver historial',
+'vector-view-view' => 'Lleer',
+'vector-view-viewsource' => 'Ver códigu fonte',
+'actions' => 'Aiciones',
+'namespaces' => 'Espacios de nome',
+'variants' => 'Variantes',
'errorpagetitle' => 'Error',
'returnto' => 'Tornar a $1.',
@@ -297,6 +292,9 @@ Hai demasiaos usuarios intentando ver esta páxina.
Espera un momentu enantes d'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',
# 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}}',
@@ -339,7 +337,7 @@ $1",
'editsectionhint' => 'Editar seición: $1',
'toc' => 'Tabla de conteníos',
'showtoc' => 'amosar',
-'hidetoc' => 'esconder',
+'hidetoc' => 'anubrir',
'thisisdeleted' => '¿Ver o restaurar $1?',
'viewdeleted' => '¿Ver $1?',
'restorelink' => '{{PLURAL:$1|una edición desaniciada|$1 ediciones desaniciaes}}',
@@ -461,9 +459,10 @@ Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvier
Se creó la to cuenta.
Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
'yourname' => "Nome d'usuariu:",
-'yourpassword' => 'Clave:',
+'yourpassword' => 'Contraseña:',
'yourpasswordagain' => 'Reescribi la to clave:',
-'remembermypassword' => 'Recordar la mio identificación nesti ordenador',
+'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",
'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',
@@ -471,15 +470,16 @@ Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAM
'loginprompt' => "Has tener les ''cookies'' activaes pa entrar en {{SITENAME}}.",
'userlogin' => 'Entrar / Crear cuenta',
'userloginnocreate' => 'Entrar',
-'logout' => 'Salir',
-'userlogout' => 'Salir',
+'logout' => 'Colar',
+'userlogout' => 'Colar',
'notloggedin' => 'Non identificáu',
'nologin' => "¿Nun tienes una cuenta? '''$1'''.",
'nologinlink' => '¡Fai una!',
-'createaccount' => 'Crear una nueva cuenta',
+'createaccount' => 'Crear una cuenta',
'gotaccount' => "¿Ya tienes una cuenta? '''$1'''.",
'gotaccountlink' => '¡Identifícate!',
'createaccountmail' => 'per e-mail',
+'createaccountreason' => 'Motivu:',
'badretype' => "Les claves qu'escribisti nun concuayen.",
'userexists' => "El nome d'usuariu conseñáu yá esiste. Por favor escueyi un nome diferente.",
'loginerror' => "Error d'identificación",
@@ -500,6 +500,7 @@ Mira que tea bien escritu.',
'wrongpasswordempty' => 'La clave taba en blanco. Inténtalo otra vuelta.',
'passwordtooshort' => 'Les contraseñes han de tener a lo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.',
'password-name-match' => "La contraseña tien de ser distinta del nome d'usuariu.",
+'password-login-forbidden' => "Ta torgao usar esti nome d'usuariu y contraseña.",
'mailmypassword' => 'Unviar la clave nueva',
'passwordremindertitle' => 'Nueva clave provisional pa {{SITENAME}}',
'passwordremindertext' => 'Daquién (seique tu, dende la direición IP $1) solicitó una clave
@@ -541,10 +542,14 @@ Por favor espera enantes d'intentalo otra vuelta.",
'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é.",
+# E-mail sending
+'php-mail-error-unknown' => 'Error desconocíu na función mail() de PHP',
+
# Password reset dialog
'resetpass' => 'Camudar la clave',
'resetpass_announce' => "T'identificasti con una clave temporal unviada per corréu.
P'acabar d'identificate has d'escribir equí una clave nueva:",
+'resetpass_text' => '<!-- Amestar testu equí -->',
'resetpass_header' => 'Camudar la clave de la cuenta',
'oldpassword' => 'Clave vieya:',
'newpassword' => 'Clave nueva:',
@@ -593,6 +598,7 @@ Seique yá camudasti la clave temporal o que solicitasti otra nueva.",
'showlivepreview' => 'Vista rápida',
'showdiff' => 'Amosar cambeos',
'anoneditwarning' => "'''Avisu:''' Nun tas identificáu. La to IP va quedar grabada 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.",
'missingcommenttext' => 'Por favor, escribi un comentariu embaxo.',
@@ -670,7 +676,11 @@ La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
'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ó!'''",
-'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/monobook.css en cuenta de {{ns:user}}:Foo/Monobook.css.",
+'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'''
+'''¡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.",
'updated' => '(Actualizao)',
'note' => "'''Nota:'''",
'previewnote' => "'''¡Alcuérdate de qu'esto ye sólo una previsualización y los cambeos entá nun se grabaron!'''",
@@ -705,9 +715,6 @@ Amás tas dexándonos afitao qu'escribisti esto tu mesmu o que lo copiasti d'una
'copyrightwarning2' => "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />
Amás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).
'''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
-'longpagewarning' => "'''Avisu:''' Esta páxina tien más de $1 quilobytes;
-dellos navegadores puen tener problemes pa editar páxines de 32 ó más kb.
-Piensa en dixebrar la páxina en seiciones más pequeñes.",
'longpageerror' => "'''ERROR: El testu qu'unviasti tien $1 quilobytes, que ye más que'l máximu de $2 quilobytes.'''
Nun se pue grabar.",
'readonlywarning' => "'''Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.'''
@@ -727,6 +734,7 @@ La cabera entrada del rexistru s'ufre darréu pa referencia:",
'template-protected' => '(protexida)',
'template-semiprotected' => '(semi-protexida)',
'hiddencategories' => 'Esta páxina pertenez a {{PLURAL:$1|una categoría oculta|$1 categoríes ocultes}}:',
+'edittools' => "<!-- Esti testu apaecerá baxo los formularios d'edición y xuba. -->",
'nocreatetitle' => 'Creación de páxines limitada',
'nocreatetext' => '{{SITENAME}} tien restrinxida la capacidá de crear páxines nueves.
Pues volver atrás y editar una páxina esistente, o bien [[Special:UserLogin|identificate o crear una cuenta]].',
@@ -886,6 +894,8 @@ $1",
'logdelete-failure' => "'''Nun se pudo configurar la visibilidá del rexistru:'''
$1",
'revdel-restore' => 'Camudar visibilidá',
+'revdel-restore-deleted' => 'revisiones desaniciaes',
+'revdel-restore-visible' => 'revisiones visibles',
'pagehist' => 'Historial de la páxina',
'deletedhist' => 'Historial elimináu',
'revdelete-content' => 'conteníu',
@@ -907,6 +917,7 @@ Nun tienes accesu al mesmu.',
'revdelete-no-change' => "'''Avisu:''' l'elementu con data $2, $1 yá tien los axustes de visibilidá pidíos.",
'revdelete-concurrent-change' => "Error al camudar l'elementu con data $2, $1: paez que'l so estáu camudólu otra persona mientres tentabes camudalu tu.
Comprueba los rexistros, por favor.",
+'revdelete-only-restricted' => "Fallu al anubrir l'elementu con data $1, $2: nun se puen quitar elementos de la vista de los alministradores ensin escoyer tamién una de les otres opciones de visibilidá.",
'revdelete-reason-dropdown' => '*Razones comúnes de desaniciu
** Violación del Copyright
** Información personal non apropiada
@@ -953,11 +964,13 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
# Diffs
'history-title' => 'Historial de revisiones de "$1"',
'difference' => '(Diferencia ente revisiones)',
+'difference-multipage' => '(Diferencia ente páxines)',
'lineno' => 'Llinia $1:',
'compareselectedversions' => 'Comparar les versiones seleicionaes',
'showhideselectedversions' => 'Amosar/anubrir les versiones seleicionaes',
'editundo' => 'esfacer',
-'diff-multi' => '({{PLURAL:$1|1 revisión intermedia non amosada|$1 revisiones intermedies non amosaes}})',
+'diff-multi' => "({{PLURAL:$1|Nun s'amuesa 1 revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} {{PLURAL:$2|d'un usuariu|de $2 usuarios}} )",
+'diff-multi-manyusers' => "({{PLURAL:$1|Nun s'amuesa una revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} de más de $2 {{PLURAL:$2|usuariu|usuarios}})",
# Search results
'searchresults' => 'Resultaos de la busca',
@@ -992,6 +1005,7 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
'searchprofile-everything-tooltip' => "Buscar tol conteníu (incluyendo páxines d'alderique)",
'searchprofile-advanced-tooltip' => 'Buscar en namespaces personalizaos',
'search-result-size' => '$1 ({{PLURAL:$2|1 pallabra|$2 pallabres}})',
+'search-result-category-size' => '{{PLURAL:$1|1 miembru|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategories}}, {{PLURAL:$3|1 ficheru|$3 ficheros}})',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(redireición a $1)',
'search-section' => '(seición $1)',
@@ -1018,7 +1032,7 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
'powersearch-field' => 'Buscar',
'powersearch-togglelabel' => 'Comprobar:',
'powersearch-toggleall' => 'Toos',
-'powersearch-togglenone' => 'Dengunu',
+'powersearch-togglenone' => 'Dengún',
'search-external' => 'Busca esterna',
'searchdisabled' => "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google. Has fixate en que'l conteníu de los sos índices de {{SITENAME}} pue tar desfasáu.",
@@ -1066,6 +1080,7 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
'contextlines' => "Llinies p'amosar per resultáu:",
'contextchars' => 'Carauteres de testu per llinia:',
'stub-threshold' => 'Llímite superior pa considerar como <a href="#" class="stub">enllaz a entamu</a> (bytes):',
+'stub-threshold-disabled' => 'Desactivao',
'recentchangesdays' => "Díes qu'amosar nos cambeos recientes:",
'recentchangesdays-max' => '(máximo $1 {{PLURAL:$1|día|díes}})',
'recentchangescount' => "Númberu d'ediciones p'amosar de mou predetermináu:",
@@ -1099,6 +1114,7 @@ Equí tienes un valor al debalu que pues usar: $1",
'prefs-files' => 'Archivos',
'prefs-custom-css' => 'CSS personalizada',
'prefs-custom-js' => 'JS personalizada',
+'prefs-common-css-js' => 'CSS/JavaScript compartíu pa toles pieles:',
'prefs-reset-intro' => 'Pues usar esta páxina pa reaniciar les preferencies a los valores predeterminaos del sitiu.
Esto nun se pue desfacer.',
'prefs-emailconfirm-label' => 'Confirmación del corréu:',
@@ -1137,8 +1153,15 @@ Tamién pues escoyer permitir a los demás contautar contigo al traviés de la t
'prefs-advancedrendering' => 'Opciones avanzaes',
'prefs-advancedsearchoptions' => 'Opciones avanzaes',
'prefs-advancedwatchlist' => 'Opciones avanzaes',
+'prefs-displayrc' => 'Opciones de vista',
+'prefs-displaysearchoptions' => 'Opciones de vista',
+'prefs-displaywatchlist' => 'Opciones de vista',
'prefs-diffs' => 'Diferencies',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'La direición de corréu paez válida',
+'email-address-validity-invalid' => 'Escribi una direición de corréu válida',
+
# User rights
'userrights' => "Xestión de permisos d'usuariu",
'userrights-lookup-user' => 'Xestión de grupos del usuariu',
@@ -1222,6 +1245,7 @@ Tamién pues escoyer permitir a los demás contautar contigo al traviés de la t
'right-hideuser' => "Bloquiar un nome d'usuariu ocultándolu al públicu",
'right-ipblock-exempt' => "Saltar los bloqueos d'IP, los autobloqueos y los bloqueos d'intervalu",
'right-proxyunbannable' => 'Saltar los bloqueos automáticos de los proxys',
+'right-unblockself' => 'Desbloquiase ellos mesmos',
'right-protect' => 'Camudar los niveles de proteición y editar páxines protexíes',
'right-editprotected' => 'Editar les páxines protexíes (ensin proteición en cascada)',
'right-editinterface' => "Editar la interfaz d'usuariu",
@@ -1310,7 +1334,7 @@ Tamién pues escoyer permitir a los demás contautar contigo al traviés de la t
'rclinks' => 'Amosar los caberos $1 cambeos nos caberos $2 díes <br />$3',
'diff' => 'dif',
'hist' => 'hist',
-'hide' => 'Esconder',
+'hide' => 'Anubrir',
'show' => 'Amosar',
'minoreditletter' => 'm',
'newpageletter' => 'N',
@@ -1342,6 +1366,9 @@ Tamién pues escoyer permitir a los demás contautar contigo al traviés de la t
'upload_directory_missing' => 'El direutoriu de xubida ($1) nun esiste y nun pudo ser creáu pol sirvidor de web.',
'upload_directory_read_only' => "El sirvidor nun pue modificar el direutoriu de xubida d'archivos ($1).",
'uploaderror' => 'Error de xubida',
+'upload-recreate-warning' => "'''Avisu: Se desanició o treslladó un ficheru con esi nome.'''
+
+Equí s'ufre'l rexistru de desaniciu y treslláu d'esta páxina por comodidá:",
'uploadtext' => "Usa'l formulariu d'abaxo pa xubir archivos.
Pa ver o buscar archivos xubíos previamente, vete a la [[Special:FileList|llista d'archivos xubíos]]. Les xubíes tamién queden conseñaos nel [[Special:Log/upload|rexistru de xubíes]], y los esborraos nel [[Special:Log/delete|rexistru d'esborraos]].
@@ -1368,13 +1395,25 @@ Mira la [[Special:NewFiles|galería d'archivos nuevos]] pa una güeyada más vis
'minlength1' => "Los nomes d'archivu han tener a lo menos una lletra.",
'illegalfilename' => 'El nome d\'archivu "$1" contién carauteres non permitíos en títulos de páxina. Por favor renoma l\'archivu y xúbilu otra vuelta.',
'badfilename' => 'Nome de la imaxe camudáu a "$1".',
+'filetype-mime-mismatch' => 'La estensión del ficheru nun concasa cola triba MIME.',
'filetype-badmime' => 'Los ficheros de la triba MIME "$1" nun tienen permitida la xubida.',
'filetype-bad-ie-mime' => 'Nun se pue xubir esti ficheru porque Internet Explorer detectalu como "$1", que nun ta permitíu y pue ser una triba de ficheru peligrosa.',
'filetype-unwanted-type' => "'''\".\$1\"''' ye una triba de ficheru non recomendáu.
{{PLURAL:\$3|La triba de ficheru preferida ye|Les tribes de ficheru preferíes son}} \$2.",
-'filetype-banned-type' => "'''\".\$1\"''' nun ye una mena d'archivu permitida.
-{{PLURAL:\$3|La mena d'archivu permitida ye|Les menes d'archivu permitíes son}} \$2.",
+'filetype-banned-type' => "'''\".\$1\"''' nun ye una triba de ficheru permitida.
+{{PLURAL:\$3|La triba de ficheru permitida ye|Les tribes de ficheru permitíes son}} \$2.",
'filetype-missing' => 'El ficheru nun tien estensión (como ".jpg").',
+'empty-file' => "El ficheru qu'unviasti taba baleru.",
+'file-too-large' => "El ficheru qu'unviasti yera demasiao grande.",
+'filename-tooshort' => 'El nome de ficheru ye demasiao curtiu.',
+'filetype-banned' => 'Esta triba de ficheru ta torgada.',
+'verification-error' => 'Esti ficheru nun pasó la comprobación de ficheros.',
+'hookaborted' => 'La conexón con una estensión encaboxó el cambéu que tentasti facer.',
+'illegal-filename' => 'El nome de ficheru nun ta permitíu.',
+'overwrite' => 'Nun ta permitío sobroscribir un ficheru esistente.',
+'unknown-error' => 'Hebo un error desconocíu.',
+'tmp-create-error' => 'Nun se pudo crear el ficheru temporal.',
+'tmp-write-error' => 'Error al escribir nel ficheru temporal.',
'large-file' => 'Encamiéntase a que los ficheros nun pasen de $1;
esti ficheru tien $2.',
'largefileserver' => 'Esti ficheru ye mayor de lo que permite la configuración del sirvidor.',
@@ -1407,13 +1446,14 @@ Si tovía asina quies xubir el ficheru, por favor vuelvi atrás y usa otru nome.
'file-exists-duplicate' => 'Esti ficheru ye un duplicáu {{PLURAL:$1|del siguiente ficheru|de los siguientes ficheros}}:',
'file-deleted-duplicate' => 'Yá se desanició enantes un ficheru idénticu a esti ([[:$1]]).
Deberíes revisar el historial de desaniciu del ficheru enantes de xubilu otra vuelta.',
-'successfulupload' => 'Xubida correuta',
'uploadwarning' => 'Avisu de xubíes de ficheros',
'uploadwarning-text' => 'Por favor, camuda más abaxo la descripción del ficheru y vuelve a tentalo.',
'savefile' => 'Guardar ficheru',
'uploadedimage' => 'xubió "[[$1]]"',
'overwroteimage' => 'xubió una versión nueva de "[[$1]]"',
'uploaddisabled' => 'Deshabilitaes les xubíes',
+'copyuploaddisabled' => 'Xubir por URL ta desactivao.',
+'uploadfromurl-queued' => 'La to xubía ta na cola.',
'uploaddisabledtext' => 'Les xubíes de ficheros tán desactivaes.',
'php-uploaddisabledtext' => 'Les xubíes de ficheros tan desactivaes en PHP.
Por favor, comprueba la configuración de file_uploads.',
@@ -1436,6 +1476,28 @@ Habríes considerar si ye afechisco continuar xubiendo esti ficheru.
Por comodidá s'amuesa equí'l rexistru de desaniciu d'esti ficheru:",
'filename-bad-prefix' => "El nome del ficheru que tas xubiendo entama con '''\"\$1\"''', que ye un nome non descriptivu que de vezu conseñen automáticamente les cámares dixitales.
Por favor escueyi un nome más descriptivu pal to ficheru.",
+'filename-prefix-blacklist' => ' #<!-- dexa esta llinia exactamente como ta --> <pre>
+# La sintaxis ye la siguiente:
+# * Lo que va del caráuter "#" al fin de llinia ye un comentariu
+# * Toa llinia non-balera ye un prefixu pa los nomes de ficheru típicos que ponen les cámares dixitales
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # dellos teléfonos móviles
+IMG # xenéricu
+JD # Jenoptik
+MGP # Pentax
+PICT # misc.
+ #</pre> <!-- dexa esta llinia exactamente como ta -->',
+'upload-success-subj' => 'Xubida correuta',
+'upload-success-msg' => 'La xubía de [$2] foi correuta. Ta disponible equí: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema na xubía',
+'upload-failure-msg' => 'Hebo un problema cola to xubía de [$2]:
+
+$1',
+'upload-warning-subj' => 'Avisu de xubía',
+'upload-warning-msg' => 'Hebo un problema cola to xubía de [$2]. Pues volver al [[Special:Upload/stash/$1|formulariu de xubía]] pa iguar esti problema.',
'upload-proto-error' => 'Protocolu incorreutu',
'upload-proto-error-text' => "La xubida remota requier que l'URL entame por <code>http://</code> o <code>ftp://</code>.",
@@ -1462,6 +1524,7 @@ Visita http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'img-auth-nofile' => 'El ficheru "$1" nun esiste.',
'img-auth-isdir' => 'Tas tentando acceder al direutoriu "$1".
Namái se permite l\'accesu a ficheros.',
+'img-auth-streaming' => 'Unviando "$1".',
'img-auth-public' => "La función de img_auth.php ye sacar ficheros d'una wiki privada.
Esta wiki ta configurada como wiki pública.
Pa una meyor seguridá, img_auth.php ta desactiváu.",
@@ -1498,6 +1561,7 @@ Calcando na cabecera d'una columna camúdase l'orde acordies con ella.",
'listfiles_search_for' => "Buscar por nome d'archivu multimedia:",
'imgfile' => 'archivu',
'listfiles' => "Llista d'imáxenes",
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Fecha',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Usuariu',
@@ -1541,6 +1605,7 @@ La descripción de la [páxina de descripción del ficheru $2] s'amuesa darréu.
'uploadnewversion-linktext' => "Xubir una nueva versión d'esta imaxe",
'shared-repo-from' => 'de $1',
'shared-repo' => 'un repositoriu compartíu',
+'filepage.css' => "/* El CSS allugáu equí s'incluye na páxina de descripción del ficheru, que tamién s'incluye nes wikis clientes foriates */",
# File reversion
'filerevert' => 'Revertir $1',
@@ -1611,8 +1676,8 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
'statistics-edits' => "Ediciones de páxines dende qu'entamó {{SITENAME}}",
'statistics-edits-average' => "Media d'ediciones per páxina",
'statistics-views-total' => 'Visites totales',
+'statistics-views-total-desc' => "Les vistes de páxines non-esistentes y especiales nun s'incluyen",
'statistics-views-peredit' => 'Visites por edición',
-'statistics-jobqueue' => 'Llonxitú de la [http://www.mediawiki.org/wiki/Manual:Job_queue cola de xeres]',
'statistics-users' => '[[Special:ListUsers|Usuarios]] rexistraos',
'statistics-users-active' => 'Usuarios activos',
'statistics-users-active-desc' => 'Usuarios que realizaron una aición {{PLURAL:$1|nel caberu día|nos caberos $1 díes}}',
@@ -1623,7 +1688,9 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
'disambiguations-text' => "Les siguientes páxines enllacien a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar al artículu apropiáu.<br />Una páxina considérase de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Redireiciones dobles',
-'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición. Cada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que normalmente ye la páxina oxetivu "real", aonde la primer redireición habría empobinar.',
+'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
+Cada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu "real", onde tendría d\'empobinar la primer redireición.
+Les entraes <del>tachaes</del> tan resueltes.',
'double-redirect-fixed-move' => '[[$1]] foi treslladáu, agora ye una redireición haza [[$2]]',
'double-redirect-fixer' => 'Iguador de redireiciones',
@@ -1646,6 +1713,8 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
'nmembers' => '$1 {{PLURAL:$1|miembru|miembros}}',
'nrevisions' => '$1 {{PLURAL:$1|revisión|revisiones}}',
'nviews' => '$1 {{PLURAL:$1|vista|vistes}}',
+'nimagelinks' => 'Usao en $1 {{PLURAL:$1|páxina|páxines}}',
+'ntransclusions' => 'usao en $1 {{PLURAL:$1|páxina|páxines}}',
'specialpage-empty' => 'Nun hai resultaos nestos momentos.',
'lonelypages' => 'Páxines güérfanes',
'lonelypagestext' => 'Les páxines siguientes nun tán enllaciaes nin trescluyíes dende otres páxines de {{SITENAME}}.',
@@ -1801,36 +1870,42 @@ Pue haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] toca
'listgrouprights-removegroup-self-all' => 'Desaniciar tolos grupos de la cuenta propia',
# E-mail user
-'mailnologin' => "Ensin direición d'unviu",
-'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
+'mailnologin' => "Ensin direición d'unviu",
+'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
pa poder unviar correos a otros usuarios.',
-'emailuser' => 'Manda-y un email a esti usuariu',
-'emailpage' => "Corréu d'usuariu",
-'emailpagetext' => "Pues usar el formulariu d'embaxo pa unviar un corréu electrónicu a esti usuariu.
+'emailuser' => 'Manda-y un email a esti usuariu',
+'emailpage' => "Corréu d'usuariu",
+'emailpagetext' => "Pues usar el formulariu d'embaxo pa unviar un corréu electrónicu a esti usuariu.
La direición de corréu electrónicu qu'especificasti nes [[Special:Preferences|tos preferencies d'usuariu]] va apaecer como la direición \"Dende\" del corréu, pa que'l que lo recibe seya quien a respondete direutamente a ti.",
-'usermailererror' => "L'operador de corréu devolvió un error:",
-'defemailsubject' => 'Corréu electrónicu de {{SITENAME}}',
-'noemailtitle' => 'Ensin direición de corréu',
-'noemailtext' => 'Esti usuariu nun especificó una direición de corréu válida.',
-'nowikiemailtitle' => "Nun se permite'l corréu electrónicu",
-'nowikiemailtext' => "Esti usuariu nun quier recibir correos d'otros usuarios.",
-'email-legend' => 'Unviar un corréu electrónicu a otru usuariu de {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'A:',
-'emailsubject' => 'Asuntu:',
-'emailmessage' => 'Mensaxe:',
-'emailsend' => 'Unviar',
-'emailccme' => 'Unviame per corréu una copia del mio mensaxe.',
-'emailccsubject' => 'Copia del to mensaxe a $1: $2',
-'emailsent' => 'Corréu unviáu',
-'emailsenttext' => 'El to corréu foi unviáu.',
-'emailuserfooter' => 'Esti corréu electrónicu foi unviáu por $1 a $2 per acidu de la funxión "Manda-y un corréu a un usuariu" de {{SITENAME}}.',
+'usermailererror' => "L'operador de corréu devolvió un error:",
+'defemailsubject' => 'Corréu electrónicu de {{SITENAME}}',
+'usermaildisabled' => 'Corréu del usuariu desactiváu',
+'usermaildisabledtext' => "Nun pues unviar corréu a otros usuarios d'esta wiki",
+'noemailtitle' => 'Ensin direición de corréu',
+'noemailtext' => 'Esti usuariu nun especificó una direición de corréu válida.',
+'nowikiemailtitle' => "Nun se permite'l corréu electrónicu",
+'nowikiemailtext' => "Esti usuariu nun quier recibir correos d'otros usuarios.",
+'email-legend' => 'Unviar un corréu electrónicu a otru usuariu de {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'A:',
+'emailsubject' => 'Asuntu:',
+'emailmessage' => 'Mensaxe:',
+'emailsend' => 'Unviar',
+'emailccme' => 'Unviame per corréu una copia del mio mensaxe.',
+'emailccsubject' => 'Copia del to mensaxe a $1: $2',
+'emailsent' => 'Corréu unviáu',
+'emailsenttext' => 'El to corréu foi unviáu.',
+'emailuserfooter' => 'Esti corréu electrónicu foi unviáu por $1 a $2 per acidu de la funxión "Manda-y un corréu a un usuariu" de {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Dexar un mensaxe del sistema.',
+'usermessage-editor' => 'Mensaxería del sistema',
# Watchlist
'watchlist' => 'La mio páxina de vixilancia',
'mywatchlist' => 'La mio páxina de vixilancia',
-'watchlistfor' => "(pa '''$1''')",
+'watchlistfor2' => 'Pa $1 $2',
'nowatchlist' => 'La to llista de vixilancia ta vacia.',
'watchlistanontext' => 'Por favor $1 pa ver o editar entraes na to llista de vixilancia.',
'watchnologin' => 'Non identificáu',
@@ -1937,19 +2012,23 @@ Esborralu pue perturbar les operaciones de la base de datos de {{SITENAME}};
obra con precaución.",
# Rollback
-'rollback' => 'Revertir ediciones',
-'rollback_short' => 'Revertir',
-'rollbacklink' => 'revertir',
-'rollbackfailed' => 'Falló la reversión',
-'cantrollback' => "Nun se pue revertir la edición; el postrer collaborador ye l'únicu autor d'esta páxina.",
-'alreadyrolled' => 'Nun se pue revertir la postrer edición de [[:$1]] fecha por [[User:$2|$2]] ([[User talk:$2|alderique]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+'rollback' => 'Revertir ediciones',
+'rollback_short' => 'Revertir',
+'rollbacklink' => 'revertir',
+'rollbackfailed' => 'Falló la reversión',
+'cantrollback' => "Nun se pue revertir la edición; el postrer collaborador ye l'únicu autor d'esta páxina.",
+'alreadyrolled' => 'Nun se pue revertir la postrer edición de [[:$1]] fecha por [[User:$2|$2]] ([[User talk:$2|alderique]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
daquién más yá editó o revirtió la páxina.
La postrer edición foi fecha por [[User:$3|$3]] ([[User talk:$3|alderique]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "El resume de la edición yera: \"''\$1''\".",
-'revertpage' => 'Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]',
-'rollback-success' => 'Revertíes les ediciones de $1; camudáu a la última versión de $2.',
-'sessionfailure' => 'Paez qu\'hai un problema cola to sesión; por precaución
+'editcomment' => "El resume de la edición yera: \"''\$1''\".",
+'revertpage' => 'Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]',
+'revertpage-nouser' => "Revertíes les ediciones de (nome d'usuariu desaniciáu) a la cabera revisión de [[User:$1|$1]]",
+'rollback-success' => 'Revertíes les ediciones de $1; camudáu a la última versión de $2.',
+
+# Edit tokens
+'sessionfailure-title' => 'Fallu de sesión',
+'sessionfailure' => 'Paez qu\'hai un problema cola to sesión; por precaución
cancelóse l\'aición que pidisti. Da-y al botón "Atrás" del
navegador pa cargar otra vuelta la páxina y vuelve a intentalo.',
@@ -2081,19 +2160,23 @@ $1",
'month' => "Dende'l mes (y anteriores):",
'year' => "Dende l'añu (y anteriores):",
-'sp-contributions-newbies' => 'Amosar namái les contribuciones de cuentes nueves',
-'sp-contributions-newbies-sub' => 'Namái les cuentes nueves',
-'sp-contributions-newbies-title' => "Contribuciones d'usuariu pa cuentes nueves",
-'sp-contributions-blocklog' => 'Rexistru de bloqueos',
-'sp-contributions-deleted' => "Contribuciones d'usuariu desaniciaes",
-'sp-contributions-logs' => 'rexistros',
-'sp-contributions-talk' => 'alderique',
-'sp-contributions-userrights' => "xestión de permisos d'usuariu",
-'sp-contributions-blocked-notice' => "Esti usuariu anguaño ta bloquiáu.
+'sp-contributions-newbies' => 'Amosar namái les contribuciones de cuentes nueves',
+'sp-contributions-newbies-sub' => 'Namái les cuentes nueves',
+'sp-contributions-newbies-title' => "Contribuciones d'usuariu pa cuentes nueves",
+'sp-contributions-blocklog' => 'Rexistru de bloqueos',
+'sp-contributions-deleted' => "Contribuciones d'usuariu desaniciaes",
+'sp-contributions-uploads' => 'xubes',
+'sp-contributions-logs' => 'rexistros',
+'sp-contributions-talk' => 'alderique',
+'sp-contributions-userrights' => "xestión de permisos d'usuariu",
+'sp-contributions-blocked-notice' => "Esti usuariu anguaño ta bloquiáu.
La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
-'sp-contributions-search' => 'Buscar contribuciones',
-'sp-contributions-username' => "Direición IP o nome d'usuariu:",
-'sp-contributions-submit' => 'Guetar',
+'sp-contributions-blocked-notice-anon' => "Esta IP anguaño ta bloquiada.
+La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
+'sp-contributions-search' => 'Buscar contribuciones',
+'sp-contributions-username' => "Direición IP o nome d'usuariu:",
+'sp-contributions-toponly' => 'Amosar namái les ediciones que son les caberes revisiones',
+'sp-contributions-submit' => 'Guetar',
# What links here
'whatlinkshere' => "Lo qu'enllaza equí",
@@ -2153,7 +2236,6 @@ Esto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWik
'ipb-edit-dropdown' => 'Editar motivos de bloquéu',
'ipb-unblock-addr' => 'Desbloquiar $1',
'ipb-unblock' => "Desbloquiar un nome d'usuariu o direición IP",
-'ipb-blocklist-addr' => 'Bloqueos esistentes de $1',
'ipb-blocklist' => 'Ver los bloqueos esistentes',
'ipb-blocklist-contribs' => 'Contribuciones de $1',
'unblockip' => 'Desbloquiar usuariu',
@@ -2223,6 +2305,10 @@ $1 yá ta bloquiáu. ¿Quies camudar los parámetros?',
'sorbsreason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.',
'sorbs_create_account_reason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta',
'cant-block-while-blocked' => 'Nun pues bloquiar a otros usuarios mentes tu teas bloquiáu.',
+'cant-see-hidden-user' => "L'usuariu que tentes bloquiar yá ta bloquiáu y anubríu.
+Como nun tienes permisos p'anubrir usuarios, nun pues ver o editar el bloquéu del usuariu.",
+'ipbblocked' => 'Nun pues bloquiar o desbloquiar a otros usuarios, porque tas bloquiáu tu mesmu',
+'ipbnounblockself' => 'Nun tienes permisu pa desbloquiate tu mesmu',
# Developer tools
'lockdb' => 'Protexer la base de datos',
@@ -2264,12 +2350,24 @@ Esto significa que pues volver a renomar una páxina col nome orixinal si t'enqu
¡AVISU!'''
Esti pue ser un cambéu importante y inesperáu pa una páxina popular;
por favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
+'movepagetext-noredirectfixer' => "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.
+El nome vieyu va convertise nuna redireición al nuevu.
+Asegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].
+Tu yes el responsable de facer que los enllaces queden apuntando au se supón qu'han apuntar.
+
+Recuerda que la páxina '''nun''' va movese si yá hai una páxina col nuevu títulu, a nun ser que tea balera o seya una redireición que nun tenga historial.
+Esto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y que nun pues sobreescribir una páxina yá esistente.
+
+¡AVISU!'''
+Esti pue ser un cambéu importante y inesperáu pa una páxina popular;
+por favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
'movepagetalktext' => "La páxina d'alderique asociada va ser treslladada automáticamente '''a nun ser que:'''
*Yá esista una páxina d'alderique non vacia col nuevu nome, o
*Desactives la caxella d'equí baxo.
Nestos casos vas tener que treslladar o fusionar la páxina manualmente.",
'movearticle' => 'Treslladar la páxina:',
+'moveuserpage-warning' => "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
'movenologin' => 'Non identificáu',
'movenologintext' => 'Tienes que ser un usuariu rexistráu y tar [[Special:UserLogin|identificáu]] pa treslladar una páxina.',
'movenotallowed' => 'Nun tienes permisu pa mover páxines.',
@@ -2299,6 +2397,9 @@ Nestos casos vas tener que treslladar o fusionar la páxina manualmente.",
'move-redirect-suppressed' => 'redireición desaniciada',
'movelogpage' => 'Rexistru de tresllaos',
'movelogpagetext' => 'Esta ye la llista de páxines treslladaes.',
+'movesubpage' => '{{PLURAL:$1|Subpáxina|Subpáxines}}',
+'movesubpagetext' => "Esta páxina tien $1 {{PLURAL:$1|subpáxina|subpáxines}} que s'amuesen darréu.",
+'movenosubpage' => 'Esta páxina nun tien subpáxines.',
'movereason' => 'Motivu:',
'revertmove' => 'revertir',
'delete_and_move' => 'Esborrar y treslladar',
@@ -2314,6 +2415,7 @@ La páxina de destín "[[:$1]]" yá esiste. ¿Quies esborrala pa dexar sitiu pal
'immobile-source-page' => 'Esta páxina nun ye treslladable.',
'immobile-target-page' => 'Nun se pue treslladar a esi títulu de destín.',
'imagenocrossnamespace' => "Nun se pue treslladar una imaxe a nun espaciu de nomes que nun ye d'imáxenes",
+'nonfile-cannot-move-to-file' => 'Nun se pue treslladar más que ficheros al espaciu de nomes de ficheros',
'imagetypemismatch' => 'La estensión nueva del archivu nun concueya cola so mena',
'imageinvalidfilename' => 'El nome del archivu oxetivu nun ye válidu',
'fix-double-redirects' => 'Actualizar cualesquier redireición que señale al títulu orixinal',
@@ -2322,6 +2424,10 @@ La páxina de destín "[[:$1]]" yá esiste. ¿Quies esborrala pa dexar sitiu pal
La cabera entrada del rexistru s'ufre darréu pa referencia:",
'semiprotectedpagemovewarning' => "'''Nota:''' Esta páxina ta candada pa que namái los usuarios rexistraos puedan treslladala.
La cabera entrada del rexistru s'ufre darréu pa referencia:",
+'move-over-sharedrepo' => '== Ficheru esistente ==
+[[:$1]] esiste nun repositoriu compartíu. Si mueves un ficheru a esti títulu se saltará el ficheru compartíu.',
+'file-exists-sharedrepo' => "El nome de ficheru qu'escoyisti yá ta n'usu nun repositoriu compartíu.
+Escueyi otru nome, por favor.",
# Export
'export' => 'Esportar páxines',
@@ -2339,7 +2445,7 @@ Por último, tamién pues usar un enllaz: p.e. [[{{#Special:Export}}/{{MediaWiki
'''Nota:''' Desactivóse la esportación del historial completu de páxines al traviés d'esti formulariu por motivos de rendimientu.",
'export-submit' => 'Esportar',
'export-addcattext' => 'Añader páxines dende la categoría:',
-'export-addcat' => 'Añader',
+'export-addcat' => 'Amestar',
'export-addnstext' => 'Amestar páxines del espaciu de nomes:',
'export-addns' => 'Amestar',
'export-download' => 'Guardar como archivu',
@@ -2393,6 +2499,7 @@ Guárdalu nel ordenador y xúbilu equí.",
'importstart' => 'Importando les páxines...',
'import-revision-count' => '$1 {{PLURAL:$1|revisión|revisiones}}',
'importnopages' => 'Nun hai páxines pa importar.',
+'imported-log-entries' => 'Importao $1 {{PLURAL:$1|entrada del rexistru|entraes del rexistru}}.',
'importfailed' => 'Falló la importación: $1',
'importunknownsource' => "Triba d'orixe d'importación desconocida",
'importcantopen' => "Nun se pudo abrir l'archivu d'importación",
@@ -2431,7 +2538,7 @@ Guárdalu nel ordenador y xúbilu equí.",
'tooltip-pt-mycontris' => 'Llista de les tos contribuciones',
'tooltip-pt-login' => 'Encamentámoste a identificate, anque nun ye obligatorio',
'tooltip-pt-anonlogin' => "Encamiéntasete que t'identifiques, anque nun ye obligatorio.",
-'tooltip-pt-logout' => 'Salir',
+'tooltip-pt-logout' => 'Colar',
'tooltip-ca-talk' => 'Alderique tocante al conteníu de la páxina',
'tooltip-ca-edit' => "Pues editar esta páxina. Por favor usa'l botón de previsualización enantes de guardar los cambeos.",
'tooltip-ca-addsection' => 'Emprima una seición nueva',
@@ -2485,6 +2592,34 @@ Guárdalu nel ordenador y xúbilu equí.",
'tooltip-upload' => 'Empecipiar la xubida',
'tooltip-rollback' => '"Revertir" elimina la edición/es d\'esta páxina fecha/es pol postrer collaborador con un solu clic.',
'tooltip-undo' => '"Esfacer" revierte esta edición y abre\'l formulariu d\'edición en mou de previsualización. Permite añader un motivu nel resume.',
+'tooltip-preferences-save' => 'Guardar les preferencies',
+'tooltip-summary' => 'Escribi un resume curtiu',
+
+# Stylesheets
+'common.css' => "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
+'standard.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Standard */',
+'nostalgia.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Nostalgia */',
+'cologneblue.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Cologne Blue */',
+'monobook.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */',
+'myskin.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu MySkin */',
+'chick.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Chick */',
+'simple.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Simple */',
+'modern.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Modern */',
+'vector.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */',
+'print.css' => '/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */',
+'handheld.css' => '/* Los CSS allugaos equí afeutarán a los preseos portátiles basaos nel aspeutu configuráu en $wgHandheldStyle */',
+
+# Scripts
+'common.js' => '/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */',
+'standard.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Standard */',
+'nostalgia.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Nostalgia */',
+'cologneblue.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Cologne Blue */',
+'monobook.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */',
+'myskin.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MySkin */',
+'chick.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Chick */',
+'simple.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Simple */',
+'modern.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Modern */',
+'vector.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */',
# Metadata
'nodublincore' => 'Metadatos RDF Dublin Core desactivaos pa esti sirvidor.',
@@ -2574,18 +2709,22 @@ $1",
'nextdiff' => 'Diferencia más recién →',
# Media information
-'mediawarning' => "'''Avisu''': Esti archivu pue contener códigu maliciosu, pue ser comprometío executalu nel to sistema.",
+'mediawarning' => "'''Avisu''': Esta triba de ficheru pue contener códigu maliciosu.
+Al executalu pues comprometer el to sistema.",
'imagemaxsize' => "Llende del tamañu d'imaxe: <br />''(pa les páxines de descripción de ficheru)''",
'thumbsize' => 'Tamañu de la muestra:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|páxina|páxines}}',
-'file-info' => "(tamañu d'archivu: $1, triba MIME: $2)",
-'file-info-size' => "($1 × $2 píxeles, tamañu d'archivu: $3, triba MIME: $4)",
+'file-info' => "tamañu d'archivu: $1, triba MIME: $2",
+'file-info-size' => "$1 × $2 píxeles, tamañu d'archivu: $3, triba MIME: $4",
'file-nohires' => '<small>Nun ta disponible con mayor resolución.</small>',
-'svg-long-desc' => "(archivu SVG, $1 × $2 píxeles nominales, tamañu d'archivu: $3)",
+'svg-long-desc' => "archivu SVG, $1 × $2 píxeles nominales, tamañu d'archivu: $3",
'show-big-image' => 'Resolución completa',
'show-big-image-thumb' => "<small>Tamañu d'esta previsualización: $1 × $2 píxeles</small>",
'file-info-gif-looped' => 'animáu',
'file-info-gif-frames' => '$1 {{PLURAL:$1|cuadru|cuadros}}',
+'file-info-png-looped' => 'animáu',
+'file-info-png-repeat' => 'reproducíu $1 {{PLURAL:$1|vez|veces}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|cuadru|cuadros}}',
# Special:NewFiles
'newimages' => "Galería d'imáxenes nueves",
@@ -2739,6 +2878,7 @@ tabla de metadatos tea recoyida. Los demás tarán escondíos por defeutu.
'exif-gpsareainformation' => "Nome de l'área GPS",
'exif-gpsdatestamp' => 'Fecha GPS',
'exif-gpsdifferential' => 'Correición diferencial de GPS',
+'exif-objectname' => 'Títulu curtiu',
# EXIF attributes
'exif-compression-1' => 'Non comprimida',
@@ -2820,6 +2960,8 @@ tabla de metadatos tea recoyida. Los demás tarán escondíos por defeutu.
'exif-sensingmethod-7' => 'Sensor Trillinial',
'exif-sensingmethod-8' => 'Sensor llinial secuencial de color',
+'exif-filesource-3' => 'Cámara fotográfica dixital',
+
'exif-scenetype-1' => 'Una imaxe fotografiada direutamente',
'exif-customrendered-0' => 'Procesu normal',
@@ -2896,30 +3038,30 @@ tabla de metadatos tea recoyida. Los demás tarán escondíos por defeutu.
'limitall' => 'toos',
# E-mail address confirmation
-'confirmemail' => 'Confirmar direición de corréu',
-'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
+'confirmemail' => 'Confirmar direición de corréu',
+'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
+'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
funcionalidaes de mensaxes. Da-y al botón que tienes equí embaxo pa unviar un avisu de
confirmación a la to direición. Esti avisu va incluyir un enllaz con un códigu; carga
l'enllaz nel to navegador pa confirmar la to direición de corréu electrónicu.",
-'confirmemail_pending' => "Yá s'unvió un códigu de confirmación a la to direición de corréu; si creasti hai poco la to cuenta, pues esperar dellos minutos a que-y de tiempu a llegar enantes de pidir otru códigu nuevu.",
-'confirmemail_send' => 'Unviar códigu de confirmación',
-'confirmemail_sent' => 'Corréu de confirmación unviáu.',
-'confirmemail_oncreate' => "Unvióse un códigu de confirmación a la to direición de corréu.
+'confirmemail_pending' => "Yá s'unvió un códigu de confirmación a la to direición de corréu; si creasti hai poco la to cuenta, pues esperar dellos minutos a que-y de tiempu a llegar enantes de pidir otru códigu nuevu.",
+'confirmemail_send' => 'Unviar códigu de confirmación',
+'confirmemail_sent' => 'Corréu de confirmación unviáu.',
+'confirmemail_oncreate' => "Unvióse un códigu de confirmación a la to direición de corréu.
Esti códigu nun se necesita pa identificase, pero tendrás que lu conseñar enantes
d'activar cualesquier funcionalidá de la wiki que tea rellacionada col corréu.",
-'confirmemail_sendfailed' => '{{SITENAME}} nun pudo unviar el to corréu de confirmación.
+'confirmemail_sendfailed' => '{{SITENAME}} nun pudo unviar el to corréu de confirmación.
Por favor comprueba que nun punxeras carauteres non válidos na to direición de corréu.
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_success' => 'El to corréu quedó confimáu.
+'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_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.',
-'confirmemail_error' => 'Hebo un problema al guardar la to confirmación.',
-'confirmemail_subject' => 'Confirmación de la direición de corréu de {{SITENAME}}',
-'confirmemail_body' => 'Daquién, seique tu dende la IP $1, rexistró la cuenta "$2" con
+'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
+'confirmemail_error' => 'Hebo un problema al guardar la to confirmación.',
+'confirmemail_subject' => 'Confirmación de la direición de corréu de {{SITENAME}}',
+'confirmemail_body' => 'Daquién, seique tu dende la IP $1, rexistró la cuenta "$2" con
esta direición de corréu en {{SITENAME}}.
Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les funcionalidaes
@@ -2933,8 +3075,36 @@ la confirmación de la direición de corréu electrónicu:
$5
Esti códigu de confirmación caduca\'l $4.',
-'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu cancelada',
-'invalidateemail' => 'Cancelar confirmación de corréu electrónicu',
+'confirmemail_body_changed' => 'Daquién, seique tu dende la IP $1, camudó les señes de corréu de
+la cuenta "$2" a esta direición de corréu en {{SITENAME}}.
+
+Pa confirmar qu\'esta cuenta ye tuya daveres y reactivar les funciones
+de corréu en {{SITENAME}}, abri esti enllaz nel to navegador:
+
+$3
+
+Si la cuenta *nun* ye de to, calca nesti enllaz pa encaboxar
+la confirmación de les señes de corréu electrónicu:
+
+$5
+
+Esti códigu de confirmación caduca\'l $4.',
+'confirmemail_body_set' => 'Daquién, seique tu dende la IP $1, camudó les señes de corréu de
+la cuenta "$2" a esta direición de corréu en {{SITENAME}}.
+
+Pa confirmar qu\'esta cuenta ye tuya daveres y reactivar les funciones
+de corréu en {{SITENAME}}, abri esti enllaz nel to navegador:
+
+$3
+
+Si la cuenta *nun* ye de to, calca nesti enllaz pa encaboxar
+la confirmación de les señes de corréu electrónicu:
+
+$5
+
+Esti códigu de confirmación caduca\'l $4.',
+'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu cancelada',
+'invalidateemail' => 'Cancelar confirmación de corréu electrónicu',
# Scary transclusion
'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
@@ -2974,6 +3144,7 @@ Por favor confirma que daveres quies volver a crear esta páxina.",
'table_pager_first' => 'Primer páxina',
'table_pager_last' => 'Postrer páxina',
'table_pager_limit' => 'Amosar $1 elementos per páxina',
+'table_pager_limit_label' => 'Elementos por páxina:',
'table_pager_limit_submit' => 'Dir',
'table_pager_empty' => 'Nun hai resultaos',
@@ -2983,6 +3154,9 @@ Por favor confirma que daveres quies volver a crear esta páxina.",
'autoredircomment' => 'Redirixendo a [[$1]]',
'autosumm-new' => "Páxina creada con '$1'",
+# Size units
+'size-gigabytes' => '$1 XB',
+
# Live preview
'livepreview-loading' => 'Cargando…',
'livepreview-ready' => 'Cargando… ¡Llisto!',
@@ -3028,6 +3202,7 @@ Tamién pues [[Special:Watchlist/edit|usar l'editor estándar]].",
'version-specialpages' => 'Páxines especiales',
'version-parserhooks' => "Hooks d'análisis sintáuticu",
'version-variables' => 'Variables',
+'version-skins' => 'Apariencia',
'version-other' => 'Otros',
'version-mediahandlers' => "Remanadores d'archivos multimedia",
'version-hooks' => 'Hooks',
@@ -3039,6 +3214,13 @@ Tamién pues [[Special:Watchlist/edit|usar l'editor estándar]].",
'version-hook-subscribedby' => 'Suscritu por',
'version-version' => '(Versión $1)',
'version-license' => 'Llicencia',
+'version-poweredby-credits' => "Esta wiki funciona con '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'otros',
+'version-license-info' => "MediaWiki ye software llibre; pues redistribuilu y/o camudalu baxo los términos de la Llicencia Pública Xeneral GNU tal como ta asoleyada pola Free Software Foundation; o la versión 2 de la Llicencia, o (como prefieras) cualesquier versión posterior.
+
+MediaWiki se distribúi col envís de que seya afayadiza, pero ENSIN GARANTÃA DALA; ensin siquiera garantía implícita de COMERCIALIDà o ADAUTACIÓN A UN DETERMINÃU PROPÓSITU. Llee la Llicencia Pública Xeneral GNU pa más detalles.
+
+Tendríes d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llicencia Pública Xeneral GNU] xunto con esti programa; sinón, escribi a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lleela en llinia].",
'version-software' => 'Software instaláu',
'version-software-product' => 'Productu',
'version-software-version' => 'Versión',
@@ -3108,6 +3290,15 @@ Escribi\'l nome del archivu ensin el prefixu "{{ns:file}}:".',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|cambéu|cambeos}}',
+# Special:ComparePages
+'comparepages' => 'Comparar páxines',
+'compare-selector' => 'Comparar revisiones de páxina',
+'compare-page1' => 'Páxina 1',
+'compare-page2' => 'Páxina 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
'dberr-header' => 'Esta wiki tien un problema',
'dberr-problems' => '¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.',
@@ -3119,8 +3310,18 @@ Escribi\'l nome del archivu ensin el prefixu "{{ns:file}}:".',
# HTML forms
'htmlform-invalid-input' => 'Hai problemes con parte de la to entrada',
+'htmlform-select-badoption' => 'El valor que conseñasti nun ye una opción válida.',
+'htmlform-int-invalid' => 'El valor que conseñasti nun ye un númberu enteru.',
+'htmlform-float-invalid' => 'El valor que conseñasti nun ye un númberu.',
+'htmlform-int-toolow' => "El valor que conseñasti ye menor que'l mínimu de $1",
+'htmlform-int-toohigh' => "El valor que conseñasti ye mayor que'l máximu de $1",
+'htmlform-required' => 'Se requier esti valor',
'htmlform-submit' => 'Unviar',
'htmlform-reset' => 'Esfacer cambeos',
'htmlform-selectorother-other' => 'Otros',
+# SQLite database support
+'sqlite-has-fts' => '$1 con sofitu pa gueta en testu completu',
+'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
+
);
diff --git a/languages/messages/MessagesAvk.php b/languages/messages/MessagesAvk.php
index aaa10edf..ed7c1149 100644
--- a/languages/messages/MessagesAvk.php
+++ b/languages/messages/MessagesAvk.php
@@ -111,8 +111,7 @@ $messages = array(
'tog-editsection' => 'Betara va gabot kan "[Betara]" gluyasiki',
'tog-editsectiononrightclick' => 'Betara va gabot talton vulegason<br /> va gabotvergumvelt',
'tog-showtoc' => 'Nedira va ugak<br /> (icde teliz dem lo 3 gabot)',
-'tog-rememberpassword' => 'Va jinaf remravlem setiker (cookie)',
-'tog-editwidth' => 'Betaxo mantanhon nediwer',
+'tog-rememberpassword' => 'Va jinaf remravlem setiker (cookie) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Kosuzdasikira va jinon betayan bueem',
'tog-watchdefault' => 'Va jinon reduyun ik betayan telizeem suzdá',
'tog-watchmoves' => 'Kosuzdasikira va jinon arrundayan bueem',
@@ -430,7 +429,7 @@ Me vulkul da rupeson va "Lodamaceem" bu va intaf {{SITENAME}} rotuilkal.',
'yourname' => 'Rinaf favesikyolt',
'yourpassword' => 'Rinaf remravlem',
'yourpasswordagain' => 'Va rinaf remravlem tolon bazel',
-'remembermypassword' => 'Setikera va jinaf remravlem (cookie)',
+'remembermypassword' => 'Setikera va jinaf remravlem (cookie) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Rinaf ind',
'externaldberror' => 'Ont divefa origakrokla va pilkomodara ont va rinafa divefa pata me ronuskel.',
'login' => 'Pilkomodá',
@@ -601,7 +600,6 @@ Dere, kan rinaf suteks ik suteks male sangiskafa nuyafa klita, anton webel !
'copyrightwarning2' => "Vay stragal da kot webeks va {{SITENAME}} gan ar webesik zo robetar ike zo roataler ike zo rosular. Ede me djumel da rinaf suteks yo zo robetad, vaon batliz me staksel !<br />
Rin dere abdiplekul da va webeks miv suteyel ike mal sangiskafa ok gundafa nuyafa klita ksudal (va $1 loon wil).
'''VA COPYRIGHT SUTEKS ARIEKON MERICTANON VOL WEBEL !'''",
-'longpagewarning' => "'''WALZERA : batu bu tir kaikasu va $1 ko; konaki exulesiki va bu pokefu ok kaikefu gu 32 ko bak sutelara pofejed. Ton lopinaf gabot yo va bu rotir gosolparsal.'''",
'longpageerror' => "'''ROKLA : Atoen krent tir $1 kilobytes. Batcoba tir lodabrotcafa dam $2 kilobytes cuge. In tir merogiwan.'''",
'readonlywarning' => "'''OBRAL : batu bu kiewaginon zo abdinendar, acum va betara dure me rogiwatal. Ko iyeltak ta radimifa giwara va krent roksudal.'''",
'protectedpagewarning' => "'''WALZERA : batu bu zo nendar. Antaf ristus favesik vaon robetar.'''",
@@ -1077,7 +1075,6 @@ Ede va man iyeltak soe co-djukalvajal, vay dimpil ise va warzaf yolt favel.
'fileexists-shared-forbidden' => 'Koe pakano iyeltakxo milyoltaf iyeltak ixam tir.
Ede va man iyeltak soe co-djukalvajal, vay dimpil ise va warzaf yolt favel. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Bat iyeltak tir jontolaca ke {{PLURAL:$1|iyeltak|iyeltak}}:',
-'successfulupload' => 'Ksudanhara',
'uploadwarning' => 'Obral !',
'savefile' => 'Giwara va iyeltak',
'uploadedimage' => '« [[$1]] » ksudayan mo zanisiko',
@@ -1094,6 +1091,7 @@ Ede va man iyeltak soe co-djukalvajal, vay dimpil ise va warzaf yolt favel. [[Fi
Gokrafial ede tolkalvajara va bat iyeltak tir vodanhafa.
Sulara \"log\" va batu bu krafiason batlize zo nedir :",
+'upload-success-subj' => 'Ksudanhara',
'upload-proto-error' => 'Kitsendaj',
'upload-file-error' => 'Koefa rokla',
@@ -1379,7 +1377,6 @@ L'adresse électronique que vous avez indiquée dans vos préférences apparaît
# Watchlist
'watchlist' => 'Suzdasiki',
'mywatchlist' => 'Jinafi suzdasiki',
-'watchlistfor' => "(tori '''$1''')",
'nowatchlist' => 'Rinafi suzdasiki va nedoy teliz ruldar.',
'watchlistanontext' => 'Ta wira ik betara va ra ke rinafi suzdasiki vay $1.',
'watchnologin' => 'Dogluyariskaf',
@@ -1639,7 +1636,6 @@ Va lazavanha (tulon ozwason va cidayanu bu se) vlevon bazel !',
'ipb-edit-dropdown' => 'Betara va elekaralazava',
'ipb-unblock-addr' => 'Va $1 dimelekara',
'ipb-unblock' => 'Dimelekara va favesikyolt ok IP mane',
-'ipb-blocklist-addr' => 'Tis elekareem va $1',
'ipb-blocklist' => 'Wira va tis elekareem',
'ipb-blocklist-contribs' => 'Webereem ke $1',
'unblockip' => 'Grielekara va IP mane',
@@ -1964,10 +1960,10 @@ $1',
# Media information
'thumbsize' => 'Aluklum :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|bu|bu}}',
-'file-info' => '(iyeltakaldo : $1, MIME ord : $2)',
-'file-info-size' => '($1 × $2 pixel, iyeltakaldo : $3, MIME ord : $4)',
+'file-info' => 'iyeltakaldo : $1, MIME ord : $2',
+'file-info-size' => '$1 × $2 pixel, iyeltakaldo : $3, MIME ord : $4',
'file-nohires' => '<small>Me roderaykan logijaf lum.</small>',
-'svg-long-desc' => '(SVG iyeltak, prekson $1 × $2 pixels, iyeltakaldo : $3)',
+'svg-long-desc' => 'SVG iyeltak, prekson $1 × $2 pixels, iyeltakaldo : $3',
'show-big-image' => 'Geltraf lum',
'show-big-image-thumb' => '<small>Lum ke bata abdinedira : $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesAy.php b/languages/messages/MessagesAy.php
index 30aa2b23..225d1758 100644
--- a/languages/messages/MessagesAy.php
+++ b/languages/messages/MessagesAy.php
@@ -30,8 +30,7 @@ $messages = array(
'tog-editsection' => '[Turkaña] sipitampi tuqitaki turkawi luräña',
'tog-editsectiononrightclick' => '(JavaScript munawiwa) titulxat tuqina kupi suxuqiñampi tuqitaki turkawi luräña',
'tog-showtoc' => 'Waruchataw uñachayaña (kimsa tituljampi uñstawitaki)',
-'tog-rememberpassword' => "Akax jasanchirin imt'awija amtaña",
-'tog-editwidth' => 'Akiptawit llataxa taqi anchuniwa',
+'tog-rememberpassword' => "Akax jasanchirin imt'awija amtaña (for a maximum of $1 {{PLURAL:$1|day|days}})",
'tog-watchcreations' => "Unch'ukit waruchatajana nayaxa uñstawix uñstayawajata yapxataña",
'tog-watchdefault' => "Unch'ukit waruchatajana nayaxa uñstawix turkajata yapxataña",
'tog-watchmoves' => "Unch'ukit waruchatajana nayaxa uñstawix sutiyarajata yapxataña",
diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php
index f5236b48..656f7c16 100644
--- a/languages/messages/MessagesAz.php
+++ b/languages/messages/MessagesAz.php
@@ -64,7 +64,13 @@ $specialPageAliases = array(
'Activeusers' => array( 'Aktivİstifadəçilər' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$magicWords = array(
+ 'redirect' => array( '0', '#Ä°STÄ°QAMÆTLÆNDÄ°RMÆ', '#Ä°STÄ°QAMÆTLÆNDÄ°R', '#REDIRECT' ),
+ 'notoc' => array( '0', '__MÃœNDÆRÄ°CATYOX__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__QALEREYAYOX__', '__NOGALLERY__' ),
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -82,8 +88,7 @@ $messages = array(
'tog-editsection' => 'Hər bir bölmə üçün [redaktə]ni mümkün et',
'tog-editsectiononrightclick' => 'Bölmələrin redaktəsini başlıqların üzərində sağ klik etməklə mümkün et (JavaScript)',
'tog-showtoc' => 'Mündəricat siyahısını göstər (3 başlıqdan artıq olan səhifələrdə)',
-'tog-rememberpassword' => 'Parolu xatırla',
-'tog-editwidth' => 'Yazma yeri maksimal geniÅŸ olsun',
+'tog-rememberpassword' => 'Məni bu kompüterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
'tog-watchcreations' => 'Yaratdığım səhifələri izlədiyim səhifələrə əlavə et',
'tog-watchdefault' => 'Redaktə etdiyim səhifələri izlədiyim səhifələrə əlavə et',
'tog-watchmoves' => 'Adlarını dəyişdiyim səhifələri izlədiyim səhifələrə əlavə et',
@@ -196,6 +201,7 @@ $messages = array(
'index-category' => 'İndeksləşdirilmiş səhifələr',
'noindex-category' => 'İndeksləşdirilməyən səhifələr',
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
'mainpagetext' => "'''MediaWiki müvəffəqiyyətlə quraşdırıldı.'''",
'mainpagedocfooter' => 'Bu vikinin istifadəsi ilə bağlı məlumat almaq üçün [http://meta.wikimedia.org/wiki/Help:Contents İstifadəçi məlumat səhifəsinə] baxın.
@@ -227,31 +233,21 @@ $messages = array(
'faqpage' => 'Project:TSS',
# Vector skin
-'vector-action-addsection' => 'Mövzu əlavə et',
-'vector-action-delete' => 'Sil',
-'vector-action-move' => 'Adını dəyişdir',
-'vector-action-protect' => 'Mühafizə et',
-'vector-action-undelete' => 'Bərpa et',
-'vector-action-unprotect' => 'Mühafizəni kənarlaşdır',
-'vector-namespace-category' => 'Kateqoriya',
-'vector-namespace-help' => 'Kömək səhifəsi',
-'vector-namespace-image' => 'Fayl',
-'vector-namespace-main' => 'Səhifə',
-'vector-namespace-media' => 'Media səhifəsi',
-'vector-namespace-mediawiki' => 'Mesaj',
-'vector-namespace-project' => 'Layihə haqqında',
-'vector-namespace-special' => 'Xüsusi səhifə',
-'vector-namespace-talk' => 'Müzakirə',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'İstifadəçi səhifəsi',
-'vector-view-create' => 'Yarat',
-'vector-view-edit' => 'RedaktÉ™',
-'vector-view-history' => 'Tarixçə',
-'vector-view-view' => 'Oxu',
-'vector-view-viewsource' => 'Mənbəyə bax',
-'actions' => 'Hərəkətlər',
-'namespaces' => 'Adlar fəzası',
-'variants' => 'Variantlar',
+'vector-action-addsection' => 'Mövzu əlavə et',
+'vector-action-delete' => 'Sil',
+'vector-action-move' => 'Adını dəyişdir',
+'vector-action-protect' => 'Mühafizə et',
+'vector-action-undelete' => 'Bərpa et',
+'vector-action-unprotect' => 'Mühafizəni kənarlaşdır',
+'vector-simplesearch-preference' => 'İnkişaf etmiş axtarma təkliflərini gətir (yalnız Vector görünüşü üçün)',
+'vector-view-create' => 'Yarat',
+'vector-view-edit' => 'RedaktÉ™',
+'vector-view-history' => 'Tarixçə',
+'vector-view-view' => 'Oxu',
+'vector-view-viewsource' => 'Mənbəyə bax',
+'actions' => 'Hərəkətlər',
+'namespaces' => 'Adlar fəzası',
+'variants' => 'Variantlar',
'errorpagetitle' => 'Xəta',
'returnto' => '$1 səhifəsinə qayıt.',
@@ -312,6 +308,9 @@ Bu səhifəyə baxmaq üçün həddən artıq müraciət daxil olmuşdur.
Zəhmət olmasa, bir müddət sonra yenidən cəhd edin.
$1',
+'pool-timeout' => 'Blokun gözləmə müddəti bitdi',
+'pool-queuefull' => 'Çıxarış səhifəsi doludur',
+'pool-errorunknown' => 'naməlum xəta',
# 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}} haqqında',
@@ -342,12 +341,15 @@ $1',
Bax: [[Special:Version|Versiyalar]].',
'ok' => 'OK',
+'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
'retrievedfrom' => 'Mənbə — "$1"',
'youhavenewmessages' => 'Hal-hazırda $1 var. ($2)',
'newmessageslink' => 'yeni ismarıclar',
'newmessagesdifflink' => 'Sonuncu və əvvəlki versiya arasındakı fərq',
'youhavenewmessagesmulti' => '$1-də yeni mesajınız var.',
'editsection' => 'redaktÉ™',
+'editsection-brackets' => '[$1]',
'editold' => 'redaktÉ™',
'viewsourceold' => 'başlanğıc kodu nəzərdən keçir',
'editlink' => 'redaktÉ™',
@@ -451,7 +453,12 @@ SorÄŸu: $2',
'protectedpagetext' => 'Bu səhifə redaktə üçün bağlıdır.',
'viewsourcetext' => 'Siz bu səhifənin məzmununu görə və köçürə bilərsiniz:',
'protectedinterface' => 'Bu səhifədə proqram təminatı üçün sistem məlumatları var və sui-istifadənin qarşısını almaq üçün mühafizə olunmalıdır.',
+'editinginterface' => "'''Diqqət.''' Siz proqram təminatı interfeysinin mətn olan səhifəni redaktə edirsiniz.
+Onun dəyişdirilməsi digər istifadəçilərin interfeysinin xarici görünüşünə təsir göstərir.
+Tərcümə üçün daha yaxşı olar ki, MediaWiki-nin lokallaşması üçün olan [http://translatewiki.net/wiki/Main_Page?setlang=ru translatewiki.net] layihəsindən istifadə edəsiniz.",
'sqlhidden' => '(SQL gizli sorÄŸu)',
+'cascadeprotected' => 'Səhifə mühafizə olunub, çünki o kaskad mühafizə olunan {{PLURAL:$1|növbəti səhifəyə|növbəti səhifələrə}} qoşulub:
+$2',
'namespaceprotected' => 'Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.',
'customcssjsprotected' => 'Sizin bu səhifədə redaktə etməyə icazəniz yoxdur. Çünki bu səhifədə başqa istifadəçinin şəxsi məlumatları var.',
'ns-specialprotected' => 'Xüsusi səhifələr redaktə oluna bilməz.',
@@ -473,7 +480,8 @@ Hesabınız yaradıldı.
'yourname' => 'İstifadəçi adı',
'yourpassword' => 'Parol:',
'yourpasswordagain' => 'Parolu təkrar yazın:',
-'remembermypassword' => 'Məni xatırla',
+'remembermypassword' => 'Məni bu kompüterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
+'securelogin-stick-https' => 'Loqini daxil etdikdən sonra HTTPS-lə əlaqədə qal',
'yourdomainname' => 'Sizin domain',
'externaldberror' => 'Ya verilənlər bazasının doğruluğunu yoxlamada xəta baş verib, yaxud da siz xarici akkauntu yeniləməyi bacarmırsınız.',
'login' => 'Daxil ol',
@@ -490,11 +498,16 @@ Hesabınız yaradıldı.
'gotaccount' => "Giriş hesabınız varsa '''$1'''.",
'gotaccountlink' => 'daxil olun',
'createaccountmail' => 'e-məktub ilə',
+'createaccountreason' => 'Səbəb:',
'badretype' => 'Daxil etdiyiniz parol uyğun gəlmir.',
'userexists' => 'Daxil edilmiş ad istifadədədir.
Lütfən ayrı ad seçin.',
'loginerror' => 'Daxil olunma xətası',
'createaccounterror' => '$1 Hesab açılmadı',
+'nocookiesnew' => 'İstifadəçi qeydiyyata düşüb, lakin təmsil olunmayıb.
+{{SITENAME}} iştirakçıların təqdim olunması üçün kökələrdən istifadə olunur.
+Siz kökələrin qəbuluna qadağa qoymusunuz.
+Lütfən, onları qəbul etməyə icazə verdikdən sonra yeni istifadəçi adı və parolunuzla təmsil olunuz.',
'nocookieslogin' => '{{SITENAME}} saytında girmək üçün alətlərinizin açıq olması lazımdır. Alətləriniz bağlıdır. Zəhmət olmasa açın və bir daha yoxlayın.',
'noname' => 'İşlək istifadəçi adı daxil etməmişdiniz.',
'loginsuccesstitle' => 'Daxil olundu',
@@ -510,12 +523,14 @@ Düzgün yazdığına əmin ol.',
'wrongpasswordempty' => 'Parol boş. Təkrar yazın.',
'passwordtooshort' => 'Parolda ən azı {{PLURAL:$1|1 hərf yaxud simvol|$1 hərf yaxud simvol}} olmalıdır.',
'password-name-match' => 'Parol adınızdan fərqli olmalıdır.',
+'password-login-forbidden' => 'Bu istifadəçi adından və paroldan istifadə qadağan olunub.',
'mailmypassword' => 'E-mail ilə yeni parol göndər',
'passwordremindertitle' => '{{SITENAME}} parol xatırladıcı',
'noemail' => '"$1" adlı istifadəçi e-poçt ünvanını qeyd etməmişdir.',
'noemailcreate' => 'Düzgün e-mail ünvanı qeyd etməlisiniz',
'passwordsent' => 'Yeni parol "$1" üçün qeydiyyata alınan e-poçt ünvanına göndərilmişdir.
Xahiş edirik, e-məktubu aldıqdan sonra yenidən daxil olasınız.',
+'blocked-mailpassword' => 'İP ünvanınız bloklu olduğuna görə, yeni parol göndərmə mümkün deyil.',
'mailerror' => 'Məktub göndərmə xətası: $1',
'acct_creation_throttle_hit' => 'Sizin IP ünvanınızdan bu viki-də son bir gün ərzində {{PLURAL:$1|1 hesab|$1 hesab}} açılmışdır. Bu bir gün ərzində icazə verilən maksimum say olduğu üçün, indiki anda daha çox hesab aça bilməzsiniz.',
'emailauthenticated' => 'E-poçt ünvanınız $2 saat $3 tarixində təsdiq edilib.',
@@ -534,6 +549,9 @@ Yeni cəhd etməzdən əvvəl bir qədər gözləyin.',
'loginlanguagelabel' => 'Dil: $1',
'suspicious-userlogout' => 'Sizin çıxış üçün cəhdiniz uğursuz alındı. Bu, brouzerin yaxud proksi-keşləmənin düzgün işləməməsindən qaynaqlanır.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHP-nin mail() funksiyasında naməlum xəta',
+
# Password reset dialog
'resetpass' => 'Parolu dəyiş',
'resetpass_announce' => 'Siz sistemə müvəqqəti elektron poçt kodu ilə daxil olmusunuz.
@@ -586,6 +604,7 @@ Ola bilər siz parolu müvəffəqiyyətlə dəyişmisiniz yaxud müvəqqəti par
'showlivepreview' => 'Canlı sınaq göstərişi',
'showdiff' => 'Dəyişiklikləri göstər',
'anoneditwarning' => "'''DÄ°QQÆT!''' Siz özünüzü sistemÉ™ tÉ™qdim etmÉ™misiniz. Sizin IP ünvanınız bu sÉ™hifÉ™nin tarixçəsinÉ™ qeyd olunacaq.",
+'anonpreviewwarning' => 'Sistemə daxil olmamısınız. "Səhifəni qeyd et" düyməsini bassanız IP ünvanınız səhifənin tarixçəsində qeyd olunacaq.',
'missingsummary' => "'''Xatırlatma.''' Siz dəyişikliklərin qısa şərhini verməmisiniz. \"Səhifəni qeyd et\" düyməsinə təkrar basandan sonra sizin dəyişiklikləriniz şərhsiz qeyd olunacaq.",
'missingcommenttext' => 'Zəhmət olmasa, aşağıda şərhinizi yazın.',
'summary-preview' => 'Xülasə baxış',
@@ -621,12 +640,19 @@ vÉ™ ya sÉ™hifÉ™ni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktÉ™]</span> edÉ
və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.',
'userpage-userdoesnotexist' => '"$1" istifadəçi adı qeydiyyata alınmayıb.
ÆgÉ™r siz bu sÉ™hifÉ™ni yaratmaq/redaktÉ™ etmÉ™k istÉ™yirsinizsÉ™, xahiÅŸ edirik bunu yoxlayın.',
+'userpage-userdoesnotexist-view' => '"$1" istifadəçi hesabı qeydiyyatda deyil',
'blocked-notice-logextract' => 'Bu istifadəçi hal-hazırda bloklanmışdır.
Bloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:',
+'usercssyoucanpreview' => "'''İpucu:''' Qeyd etmədən əvvəl \"{{int:showpreview}}\"ə klikləyərək yeni CSSinizi yoxlayın.",
+'userjsyoucanpreview' => "'''İpucu:''' Qeyd etmədən əvvəl \"{{int:showpreview}}\"ə klikləyərək yeni JavaScriptinizi yoxlayın.",
'usercsspreview' => "''Xatırladırıq ki, siz yalnız CSS-də sınaq göstərişi etmisiniz.'''
'''Bu hələ yaddaşda saxlanılmayıb!'''",
'userjspreview' => "''Xatırladırıq ki, siz yalnız JavaScript-də test/sınaq göstərişi etmisiniz.'''
'''Bu hələ yaddaşda saxlanılmayıb!'''",
+'sitecsspreview' => "''Xatırladırıq ki, siz yalnız CSS-də sınaq göstərişi etmisiniz.'''
+'''Bu hələ yaddaşda saxlanılmayıb!'''",
+'sitejspreview' => "''Xatırladırıq ki, siz yalnız JavaScript kodunda sınaq göstərişi etmisiniz.'''
+'''Bu hələ yaddaşda saxlanılmayıb!'''",
'updated' => '(yeniləndi)',
'note' => "'''Qeyd:'''",
'previewnote' => "'''Bu yalnız sınaq göstərişidir; dəyişikliklər hal-hazırda qeyd edilməmişdir!'''",
@@ -647,7 +673,6 @@ Siz eyni zamanda söz verirsiniz ki, bu yazıları siz özünüz yazmısınız v
----
<div style="font-weight: bold; font-size: 110%; color:red;">MÃœÆLLÄ°F HÃœQUQLARI Ä°LÆ QORUNMUÅž HEÇ BÄ°R İŞİ Ä°CAZÆSÄ°Z DÆRC ETMÆYÄ°N!</div>',
-'longpagewarning' => "'''DÄ°QQÆT! Bu sÉ™hifÉ™nin hÉ™cmi $1 kb-dır; HÉ™cmi 32 kb-a yaxın vÉ™ ya daha artıq olan sÉ™hifÉ™lÉ™r bÉ™zi brouzerlÉ™rdÉ™ redaktÉ™ ilÉ™ baÄŸlı problemlÉ™r yarada bilÉ™r. MümkünsÉ™ sÉ™hifÉ™ni daha kiçik bölmÉ™lÉ™rÉ™ bölün.'''",
'semiprotectedpagewarning' => "'''Qeyd:''' Bu səhifə mühafizəli olduğu üçün yalnız qeydiyyatdan keçmiş istifadəçilər redaktə edə bilərlər.",
'titleprotectedwarning' => "'''DÄ°QQÆT! Bu sÉ™hifÉ™ mühafizÉ™lidir, yalnız [[Special:ListGroupRights|icazÉ™si olan]] istifadəçilÉ™r onu redaktÉ™ edÉ™ bilÉ™rlÉ™r.'''",
'templatesused' => 'Bu səhifədə istifadə edilmiş {{PLURAL:$1|şablon|şablonlar}}:',
@@ -657,6 +682,8 @@ Siz eyni zamanda söz verirsiniz ki, bu yazıları siz özünüz yazmısınız v
'template-semiprotected' => '(yarım-mühafizə)',
'hiddencategories' => 'Bu səhifə {{PLURAL:$1|1 gizli kateqoriyaya|$1 gizli kateqoriyaya}} aiddir:',
'nocreatetitle' => 'Səhifə yaratma məhdudlaşdırılıb.',
+'nocreatetext' => '{{SITENAME}} saytında yeni səhifələrin yaradılması imkanları məhdudlaşdırılıb.
+Siz geri qayıdıb mövcud səhifəni və ya [[Special:UserLogin|sistemə təqdim olunma və ya yeni hesab açmaq]] səhifəsini redaktə edə bilərsiniz.',
'nocreate-loggedin' => 'Sizin yeni səhifələr yaratmaq üçün icazəniz yoxdur.',
'sectioneditnotsupported-title' => 'Bölüm redaktəsi dəstəklənmir',
'sectioneditnotsupported-text' => 'Bölüm redaktəsi bu səhifədə dəstəklənmir.',
@@ -670,6 +697,8 @@ Bu səhifə üçün silmə qeydləri aşağıda göstərilmişdir:",
'moveddeleted-notice' => 'Bu səhifə silinmişdir.
Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeydləri göstərilmişdir.',
'log-fulllog' => 'Bütöv məlumatı göstər',
+'edit-hook-aborted' => 'Düzəlişlər qarmaq-prosedur tərəfindən geri qaytarılıb.
+ÆlavÉ™ izahat verilmÉ™yib.',
'edit-gone-missing' => 'Səhifəni yeniləmək mümkün deyil.
Çox güman ki, səhifə silinmişdir.',
'edit-conflict' => 'Düzəlişlər münaqişəsi',
@@ -678,12 +707,25 @@ Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeyd
Belə ki, bu adda səhifə artıq mövcuddur.',
# Parser/template warnings
+'expensive-parserfunction-category' => 'Kifayət qədər böyük sayda genişresurslu funksiyaların müraciət olunduğu səhifələr',
'post-expand-template-inclusion-warning' => "'''DÄ°QQÆT!''' Daxil edilÉ™n ÅŸablonların hÉ™cmi hÉ™ddindÉ™n artıq böyükdür.
Bəzi şablonlar əlavə olunmayacaq.",
'post-expand-template-inclusion-category' => 'Şablonun daxil olduğu səhifələrin ölçüsü böyükdür.',
+'post-expand-template-argument-category' => 'Şablonlarda buraxılmış arqumentlərin mövcud olduğu səhifələr',
+'parser-template-loop-warning' => '[[$1]]: Şablonda düyün tapıldı',
+'parser-template-recursion-depth-warning' => '($1) Şablonda dərinlik limiti keçildi',
+'language-converter-depth-warning' => '($1) Dil konvertorunun limiti keçildi',
+
+# "Undo" feature
+'undo-failure' => 'Dəyişikliklərin toqquşması nəticəsində geriyə qaytarma işi uğursuz oldu.',
+'undo-norev' => 'Düzəlişlər geri qaytarıla bilinmir, çünki onlar ya mövcüd deyil, ya da silinib.',
+'undo-summary' => '$1 dəyişikliyi [[Special:Contributions/$2|$2]] ([[User talk:$2|Müzakirə]]) tərəfindən geri alındı.',
# Account creation failure
'cantcreateaccounttitle' => 'Hesab açılmır.',
+'cantcreateaccount-text' => "Bu IP ünvanından ('''$1''') istifadəçi hesabı yaradılması [[User:$3|$3]] tərəfindən əngəllənmişdir.
+
+$3 tərəfindən verilən səbəb ''$2''",
# History pages
'viewpagelogs' => 'Bu səhifə ilə bağlı qeydlərə bax',
@@ -721,6 +763,7 @@ Vikidə buna bənzər səhifələri [[Special:Search|axtarmağa]] cəhd edin.',
'rev-deleted-comment' => '(şərhlər silindi)',
'rev-deleted-user' => '(İstifadəçi adı silindi)',
'rev-deleted-event' => '(qeyd silindi)',
+'rev-deleted-user-contribs' => '[istifadəçi adı və ya IP ünvanı silindi - dəyişiklik fəaliyyətlərdən çıxarıldı]',
'rev-deleted-text-permission' => "Səhifənin bu versiyası''' silinib'''.
Mümkündür ki, bunun səbəbi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərində] göstərilmişdir.",
'rev-suppressed-text-unhide' => "Səhifənin bu versiyası''' silinib'''.
@@ -730,11 +773,15 @@ Siz idarəçi olduÄŸunuza görÉ™ silinÉ™n [$1 bu versiyanı] nÉ™zÉ™rdÉ™n keçirÉ
Siz idarəçi olduğunuza görə silinən bu versiyanı nəzərdən keçirə bilərsiniz. Mümkündür ki, silinmənin səbəbi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərində] göstərilmişdir.",
'rev-deleted-no-diff' => "Siz versiyalar arasındakı fərqi nəzərdən keçirə bilməzsiniz. Belə ki, versiyalardan biri '''silinib'''.
Mümkündür ki, bununla bağlı təfərrüatlar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silmə qeydlərində] göstərilmişdir.",
+'rev-suppressed-no-diff' => "ÆvvÉ™lki redaktÉ™lÉ™rin biri '''silinmiÅŸ''' fÉ™rqi görÉ™ bilmÉ™zsiniz.",
'rev-delundel' => 'göstər/gizlət',
'rev-showdeleted' => 'Göstər',
'revisiondelete' => 'Səhifənin versiyalarını sil/bərpa et',
+'revdelete-nooldid-title' => 'Hədəf dəyişikliyi keçərsizdir',
+'revdelete-nologtype-title' => 'Heç bir qeyd tipi verilmədi',
'revdelete-nologid-title' => 'Yanlış jurnal yazısı',
'revdelete-no-file' => 'Axtarılan fayl mövcud deyil',
+'revdelete-show-file-confirm' => '"<nowiki>$1</nowiki>" faylının $2 $3 tarixli silinmiş bir redaktəsini görmək istədiyinizdən əminsizinizmi?',
'revdelete-show-file-submit' => 'Bəli',
'revdelete-selected' => "'''[[:$1]] səhifəsinin {{PLURAL:$2|seçilmiş versiyası|seçilmiş versiyaları}}:'''",
'logdelete-selected' => "'''Jurnalın {{PLURAL:$1|seçilmiş qeydi|seçilmiş qeydləri}}:'''",
@@ -753,16 +800,27 @@ Mümkündür ki, bununla bağlı təfərrüatlar [{{fullurl:{{#Special:Log}}/del
'revdelete-log' => 'Səbəb:',
'revdelete-submit' => 'Seçilmiş {{PLURAL:$1|versiyaya|versiyayalara}} tətbiq et',
'revdelete-logentry' => '[[$1]] səhifəsinin versiyasının görünüşünü dəyişdirdi',
+'logdelete-logentry' => '[[$1]] səhifəsinin versiyasının görünüşünü dəyişdirdi',
'revdelete-success' => "'''Versiyanın görünüşü yeniləndi.'''",
+'revdelete-failure' => "'''Versiyanın görünüşü dəyişdirilə bilməz:'''
+$1",
+'logdelete-success' => "''' Gündəlik görünüşü uğurla tamamlandı.'''",
+'logdelete-failure' => "'''Jurnalın görünüşü tənzimlənməyib:'''
+$1",
'revdel-restore' => 'Görünüşü dəyiş',
+'revdel-restore-deleted' => 'Silinmiş redaktələr',
+'revdel-restore-visible' => 'görünən düzəlişlər',
'pagehist' => 'Səhifənin tarixçəsi',
'deletedhist' => 'Silmə qeydləri',
'revdelete-content' => 'məzmun',
'revdelete-summary' => 'redaktə xülasəsi',
'revdelete-uname' => 'istifadəçi adı',
'revdelete-restricted' => 'məhdudiyyətlər idarəçilərə tətbiq olunur',
+'revdelete-unrestricted' => 'idarəçilər üçün götürülmüş məhdudiyyətlər',
'revdelete-hid' => 'gizlət $1',
'revdelete-unhid' => 'göstər $1',
+'revdelete-log-message' => '$2 {{PLURAL:$2|dəyişiklik|dəyişiklik}} üçün $1',
+'logdelete-log-message' => '$2 {{PLURAL:$2|hadisə|hadisə}} üçün $1',
'revdelete-reason-dropdown' => '*Ümumi silmə səbəbləri
** Müəllif hüquqları pozuntusu
** Uyğunsuz şəxsi məlumat',
@@ -783,77 +841,94 @@ Mümkündür ki, bununla bağlı təfərrüatlar [{{fullurl:{{#Special:Log}}/del
'mergehistory-go' => 'Birləşdirilə bilən redaktələri göstər',
'mergehistory-submit' => 'Qarışıq düzəlişlər',
'mergehistory-empty' => 'Birləşdiriləcək redaktələr tapılmamışdır.',
+'mergehistory-success' => '[[:$1]] səhifəsinin $3 {{PLURAL:$3|revizyonu|dəyişikliyi}} uğurla [[:$2]] -yə birləşdirildi.',
'mergehistory-no-source' => 'Mənbə $1 yoxdur.',
'mergehistory-no-destination' => 'Mənbə səhifəsi $1 mövcud deyil.',
'mergehistory-invalid-source' => 'Mənbənin düzgün başlığı olmalıdır.',
'mergehistory-invalid-destination' => 'Hədəf səhifəsinin düzgün başlığı olmalıdır.',
'mergehistory-autocomment' => '[[:$1]] səhifəsi [[:$2]] səhifəsinə birləşdirildi',
+'mergehistory-comment' => '$3 [[:$1]] səhifəsi [[:$2]] səhifəsinə birləşdirildi',
+'mergehistory-same-destination' => 'Mənbə və hədəf səhifələri eyni ola bilməz',
'mergehistory-reason' => 'Səbəb:',
# Merge log
-'mergelog' => 'Birləşdirmə qeydi',
-'revertmerge' => 'Ayır',
+'mergelog' => 'Birləşdirmə qeydi',
+'pagemerge-logentry' => '[[$1]] [[$2]]-yə birləşdirildi ($3-ə qədər)',
+'revertmerge' => 'Ayır',
# Diffs
'history-title' => '"$1" səhifəsinin tarixçəsi',
'difference' => '(Versiyalar arasındakı fərq)',
+'difference-multipage' => '(Səhifələr arasında fərq)',
'lineno' => 'Sətir $1:',
'compareselectedversions' => 'Seçilən versiyaları müqayisə et',
'showhideselectedversions' => 'Seçilən versiyaları göstər/gizlə',
'editundo' => 'əvvəlki halına qaytar',
-'diff-multi' => '({{PLURAL:$1|bir aralıq dəyişiklik|$1 aralıq dəyişiklik}} göstərilməmişdir.)',
+'diff-multi' => '({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)',
+'diff-multi-manyusers' => '({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)',
# Search results
-'searchresults' => 'Axtarış nəticələri',
-'searchresults-title' => "''$1'' üçün axtarış nəticələri",
-'searchresulttext' => '{{SITENAME}}-nı axtarmaqla bağlı ətraflı məlumat üçün [[{{MediaWiki:Helppage}}|{{int:kömək}}]] səhifəsinə baş çək.',
-'searchsubtitle' => '"[[:$1]]" üçün axtarış ([[Special:Prefixindex/$1|"$1" ilə başlayan bütün səhifələr]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" səhifəsi ilə əlaqəli olan bütün səhifələr]])',
-'searchsubtitleinvalid' => 'Axtarılan: "$1"',
-'titlematches' => 'Səhifə adı eynidir',
-'notitlematches' => 'Uyğun gələn səhifə adı tapılmadı',
-'textmatches' => 'Mətn eynidir',
-'notextmatches' => 'Məqalələrdə uyğun məzmun tapılmadı',
-'prevn' => 'əvvəlki {{PLURAL:$1|$1}}',
-'nextn' => 'sonrakı {{PLURAL:$1|$1}}',
-'viewprevnext' => 'Göstər ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-legend' => 'Axtarış kriteriyaları',
-'searchmenu-exists' => "'''Bu vikidə \"[[:\$1]]\" adında səhifə mövcutdur'''",
-'searchmenu-new' => "'''Bu vikidə \"[[:\$1]]\" səhifəsini yarat!'''",
-'searchhelp-url' => 'Help:Mündəricət',
-'searchprofile-articles' => 'Məqalələr',
-'searchprofile-project' => 'Kömək və Layihə səhifələri',
-'searchprofile-images' => 'Multimedia',
-'searchprofile-everything' => 'Hər şey',
-'searchprofile-advanced' => 'Qabaqcıl',
-'searchprofile-articles-tooltip' => 'Axtarış $1',
-'searchprofile-project-tooltip' => 'Axtarış $1',
-'searchprofile-images-tooltip' => 'Fayllar üçün axtarış',
-'searchprofile-advanced-tooltip' => 'Ad aralığında axtar',
-'search-result-size' => '$1 ({{PLURAL:$2|1 söz|$2 söz}})',
-'search-result-score' => 'UyÄŸunluq: $1%',
-'search-redirect' => '(yönləndirmə $1)',
-'search-section' => '(bölmə $1)',
-'search-suggest' => 'Bəlkə, bunu nəzərdə tuturdunuz: $1',
-'search-interwiki-caption' => 'Qardaş layihələr',
-'search-interwiki-default' => '$1 nəticə:',
-'search-interwiki-more' => '(yenÉ™)',
-'search-mwsuggest-enabled' => 'təkliflərlə',
-'search-mwsuggest-disabled' => 'təklif yoxdur',
-'search-relatedarticle' => 'əlaqədar',
-'searcheverything-enable' => 'Ad aralığında axtar:',
-'searchrelated' => 'əlaqədar',
-'searchall' => 'bütün',
-'nonefound' => "'''Qeyd''': ÆksÉ™r uÄŸursuz axtarışlara sÉ™bÉ™b indeksləşdirilmÉ™yÉ™n, geniÅŸ iÅŸlÉ™nÉ™n \"var\", \"vÉ™\" tipli sözlÉ™r vÉ™ ya axtarışa bir sözdÉ™n artıq ifadÉ™lÉ™rin verilmÉ™sidir. Çalışıb axtardığınız ifadÉ™nin qarşısında ''all:'' (bütün) yazın. Bu halda axtarışınız istifadəçi sÉ™hifÉ™lÉ™rini, ÅŸablonları vÉ™ s. da É™hatÉ™ edÉ™cÉ™k.",
-'search-nonefound' => 'Sorğunuza uyğun nəticə tapılmadı.',
-'powersearch' => 'Axtar',
-'powersearch-legend' => 'Təkmil axtarış',
-'powersearch-ns' => 'Ad aralığında axtar:',
-'powersearch-redir' => 'Yönləndirmələri göstər',
-'powersearch-field' => 'Axtar:',
-'powersearch-togglelabel' => 'Yoxla:',
-'powersearch-toggleall' => 'Hamısı',
-'powersearch-togglenone' => 'Heç biri',
-'search-external' => 'Xarici axtarış',
+'searchresults' => 'Axtarış nəticələri',
+'searchresults-title' => "''$1'' üçün axtarış nəticələri",
+'searchresulttext' => '{{SITENAME}}-nı axtarmaqla bağlı ətraflı məlumat üçün [[{{MediaWiki:Helppage}}|{{int:kömək}}]] səhifəsinə baş çək.',
+'searchsubtitle' => '"[[:$1]]" üçün axtarış ([[Special:Prefixindex/$1|"$1" ilə başlayan bütün səhifələr]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" səhifəsi ilə əlaqəli olan bütün səhifələr]])',
+'searchsubtitleinvalid' => 'Axtarılan: "$1"',
+'toomanymatches' => 'Üst-üstə düşən çoxlu hal tapılıb, lütfən yeni sorğu göndərin',
+'titlematches' => 'Səhifə adı eynidir',
+'notitlematches' => 'Uyğun gələn səhifə adı tapılmadı',
+'textmatches' => 'Mətn eynidir',
+'notextmatches' => 'Məqalələrdə uyğun məzmun tapılmadı',
+'prevn' => 'əvvəlki {{PLURAL:$1|$1}}',
+'nextn' => 'sonrakı {{PLURAL:$1|$1}}',
+'prevn-title' => 'ÆvvÉ™lki bir $1 {{PLURAL:$1|nÉ™ticÉ™|nÉ™ticÉ™}}',
+'nextn-title' => 'ÆvvÉ™lki bir $1 {{PLURAL:$1|nÉ™ticÉ™|nÉ™ticÉ™}}',
+'shown-title' => 'Səhifə üçün $1 {{PLURAL:$1|nəticə|nəticəyə}} bax',
+'viewprevnext' => 'Göstər ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Axtarış kriteriyaları',
+'searchmenu-exists' => "'''Bu vikidə \"[[:\$1]]\" adında səhifə mövcutdur'''",
+'searchmenu-new' => "'''Bu vikidə \"[[:\$1]]\" səhifəsini yarat!'''",
+'searchhelp-url' => 'Help:Mündəricət',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu cür prefiksli səhifələri göstər]]',
+'searchprofile-articles' => 'Məqalələr',
+'searchprofile-project' => 'Kömək və Layihə səhifələri',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Hər şey',
+'searchprofile-advanced' => 'Qabaqcıl',
+'searchprofile-articles-tooltip' => 'Axtarış $1',
+'searchprofile-project-tooltip' => 'Axtarış $1',
+'searchprofile-images-tooltip' => 'Fayllar üçün axtarış',
+'searchprofile-everything-tooltip' => 'Bütün daxili axtar (müzakirə səhifəsi daxil olmaqla)',
+'searchprofile-advanced-tooltip' => 'Ad aralığında axtar',
+'search-result-size' => '$1 ({{PLURAL:$2|1 söz|$2 söz}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 element|$1 elementlər}} ({{PLURAL:$2|$2 alt kateqoriya|$2 alt kateqoriyalar}}, {{PLURAL:$3|$3 fayl|$3 fayllar}})',
+'search-result-score' => 'UyÄŸunluq: $1%',
+'search-redirect' => '(yönləndirmə $1)',
+'search-section' => '(bölmə $1)',
+'search-suggest' => 'Bəlkə, bunu nəzərdə tuturdunuz: $1',
+'search-interwiki-caption' => 'Qardaş layihələr',
+'search-interwiki-default' => '$1 nəticə:',
+'search-interwiki-more' => '(yenÉ™)',
+'search-mwsuggest-enabled' => 'təkliflərlə',
+'search-mwsuggest-disabled' => 'təklif yoxdur',
+'search-relatedarticle' => 'əlaqədar',
+'mwsuggest-disable' => 'AJAX təkliflərini rədd et',
+'searcheverything-enable' => 'Ad aralığında axtar:',
+'searchrelated' => 'əlaqədar',
+'searchall' => 'bütün',
+'showingresults' => "Aşağıda #'''$2''' ilə başlayan {{PLURAL:$1|'''$1'''-ə qədər}} nəticə göstərilib.",
+'showingresultsnum' => "Aşağıda #'''$2''' ilə başlayan {{PLURAL:$3|'''$3'''}} nəticə göstərilib.",
+'showingresultsheader' => "'''$4''' üçün {{PLURAL:$5|'''$3'''-dən '''$1''' nəticə|'''$3'''-dən '''$1 - $2''' nəticə}}",
+'nonefound' => "'''Qeyd''': ÆksÉ™r uÄŸursuz axtarışlara sÉ™bÉ™b indeksləşdirilmÉ™yÉ™n, geniÅŸ iÅŸlÉ™nÉ™n \"var\", \"vÉ™\" tipli sözlÉ™r vÉ™ ya axtarışa bir sözdÉ™n artıq ifadÉ™lÉ™rin verilmÉ™sidir. Çalışıb axtardığınız ifadÉ™nin qarşısında ''all:'' (bütün) yazın. Bu halda axtarışınız istifadəçi sÉ™hifÉ™lÉ™rini, ÅŸablonları vÉ™ s. da É™hatÉ™ edÉ™cÉ™k.",
+'search-nonefound' => 'Sorğunuza uyğun nəticə tapılmadı.',
+'powersearch' => 'Axtar',
+'powersearch-legend' => 'Təkmil axtarış',
+'powersearch-ns' => 'Ad aralığında axtar:',
+'powersearch-redir' => 'Yönləndirmələri göstər',
+'powersearch-field' => 'Axtar:',
+'powersearch-togglelabel' => 'Yoxla:',
+'powersearch-toggleall' => 'Hamısı',
+'powersearch-togglenone' => 'Heç biri',
+'search-external' => 'Xarici axtarış',
# Quickbar
'qbsettings' => 'Naviqasiya paneli',
@@ -864,109 +939,127 @@ Mümkündür ki, bununla bağlı təfərrüatlar [{{fullurl:{{#Special:Log}}/del
'qbsettings-floatingright' => 'Sağa əyilir',
# Preferences page
-'preferences' => 'Nizamlamalar',
-'mypreferences' => 'Nizamlamalarım',
-'prefs-edits' => 'Redaktələrin sayı:',
-'prefsnologin' => 'Daxil olmamısınız',
-'prefsnologintext' => 'Nizamlamaları dəyişmək üçün <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} daxil olmaq]</span> zəruridir.',
-'changepassword' => 'Parolu dəyiş',
-'prefs-skin' => 'Üzlük',
-'skin-preview' => 'Sınaq göstərişi',
-'prefs-math' => 'Riyaziyyat',
-'datedefault' => 'Seçim yoxdur',
-'prefs-datetime' => 'Tarix vÉ™ vaxt',
-'prefs-personal' => 'İstifadəçi profili',
-'prefs-rc' => 'Son dəyişikliklər',
-'prefs-watchlist' => 'İzləmə siyahısı',
-'prefs-watchlist-days' => 'İzləmə siyahısında göstərilən maksimal günlərin sayı:',
-'prefs-watchlist-days-max' => 'Maksimum 7 gün',
-'prefs-watchlist-edits' => 'İzləmə siyahısında göstərilən maksimal redaktələrin sayı:',
-'prefs-watchlist-edits-max' => 'Maksimum say: 1000',
-'prefs-watchlist-token' => 'İzləmə siyahısı nişanı:',
-'prefs-misc' => 'Digər seçimlər',
-'prefs-resetpass' => 'Parolu dəyiş',
-'prefs-email' => 'E-mailin parametrləri',
-'prefs-rendering' => 'Görünüş',
-'saveprefs' => 'Qeyd et',
-'resetprefs' => 'Yarat',
-'restoreprefs' => 'Susmaya görə bütün nizamlamaları bərpa et',
-'prefs-editing' => 'RedaktÉ™',
-'prefs-edit-boxsize' => 'Redaktə pəncərəsinin həcmi',
-'rows' => 'Sıralar:',
-'columns' => 'Sütunlar:',
-'searchresultshead' => 'Axtar',
-'resultsperpage' => 'Səhifəyə aid tapılmış nəticələr:',
-'contextlines' => 'Nəticələrə aid sıralar:',
-'contextchars' => 'Sıraya aid işarələr:',
-'stub-threshold' => '<a href="#" class="stub">Keçidsiz linki</a> format etmək üçün hüdud (baytlarla):',
-'recentchangesdays' => 'Son dəyişiklərdə göstərilən günlərin miqdarı:',
-'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|gün|gün}}',
-'recentchangescount' => 'Son dəyişikliklərdə başlıq sayı:',
-'prefs-help-watchlist-token' => 'Bu sahəni gizli parolla doldurmağınız sizin izləmə siyahınız üçün RSS yayım kanalı yaradacaqdır.
+'preferences' => 'Nizamlamalar',
+'mypreferences' => 'Nizamlamalarım',
+'prefs-edits' => 'Redaktələrin sayı:',
+'prefsnologin' => 'Daxil olmamısınız',
+'prefsnologintext' => 'Nizamlamaları dəyişmək üçün <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} daxil olmaq]</span> zəruridir.',
+'changepassword' => 'Parolu dəyiş',
+'prefs-skin' => 'Cild',
+'skin-preview' => 'Sınaq göstərişi',
+'prefs-math' => 'Riyaziyyat',
+'datedefault' => 'Seçim yoxdur',
+'prefs-datetime' => 'Tarix vÉ™ vaxt',
+'prefs-personal' => 'İstifadəçi profili',
+'prefs-rc' => 'Son dəyişikliklər',
+'prefs-watchlist' => 'İzləmə siyahısı',
+'prefs-watchlist-days' => 'İzləmə siyahısında göstərilən maksimal günlərin sayı:',
+'prefs-watchlist-days-max' => 'Maksimum 7 gün',
+'prefs-watchlist-edits' => 'İzləmə siyahısında göstərilən maksimal redaktələrin sayı:',
+'prefs-watchlist-edits-max' => 'Maksimum say: 1000',
+'prefs-watchlist-token' => 'İzləmə siyahısı nişanı:',
+'prefs-misc' => 'Digər seçimlər',
+'prefs-resetpass' => 'Parolu dəyiş',
+'prefs-email' => 'E-mailin parametrləri',
+'prefs-rendering' => 'Görünüş',
+'saveprefs' => 'Qeyd et',
+'resetprefs' => 'Yarat',
+'restoreprefs' => 'Susmaya görə bütün nizamlamaları bərpa et',
+'prefs-editing' => 'RedaktÉ™',
+'prefs-edit-boxsize' => 'Redaktə pəncərəsinin həcmi',
+'rows' => 'Sıralar:',
+'columns' => 'Sütunlar:',
+'searchresultshead' => 'Axtar',
+'resultsperpage' => 'Səhifəyə aid tapılmış nəticələr:',
+'contextlines' => 'Nəticələrə aid sıralar:',
+'contextchars' => 'Sıraya aid işarələr:',
+'stub-threshold' => '<a href="#" class="stub">Keçidsiz linki</a> format etmək üçün hüdud (baytlarla):',
+'stub-threshold-disabled' => 'Kənarlaşdırılıb',
+'recentchangesdays' => 'Son dəyişiklərdə göstərilən günlərin miqdarı:',
+'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|gün|gün}}',
+'recentchangescount' => 'Son dəyişikliklərdə başlıq sayı:',
+'prefs-help-recentchangescount' => 'Buraya yeni dəyişikliklər, səhifələrin və jurnalların tarixçəsi daxildir.',
+'prefs-help-watchlist-token' => 'Bu sahəni gizli parolla doldurmağınız sizin izləmə siyahınız üçün RSS yayım kanalı yaradacaqdır.
Bu parolu bilən hər kəs izləmə siyahınızı oxuya bilər, bu səbəbdən etibarlı parol seçin.
Təsadüfi yolla seçilmiş bu paroldan istifadə edə bilərsiniz: $1',
-'savedprefs' => 'Seçiminiz qeyd edildi.',
-'timezonelegend' => 'Vaxt zonası:',
-'localtime' => 'Yerli vaxt:',
-'timezoneuseserverdefault' => 'Susmaya görə serverdən istifadə',
-'timezoneuseoffset' => 'Digər (fərqi göstərmək)',
-'timezoneoffset' => 'Vaxt fərqi¹:',
-'servertime' => 'Server vaxtı:',
-'guesstimezone' => 'Brouzerdən götür',
-'timezoneregion-africa' => 'Afrika',
-'timezoneregion-america' => 'Amerika',
-'timezoneregion-antarctica' => 'Antarktika',
-'timezoneregion-arctic' => 'Arktik',
-'timezoneregion-asia' => 'Asiya',
-'timezoneregion-atlantic' => 'Atlantik Okean',
-'timezoneregion-australia' => 'Avstraliya',
-'timezoneregion-europe' => 'Avropa',
-'timezoneregion-indian' => 'Hind Okeanı',
-'timezoneregion-pacific' => 'Sakit Okean',
-'allowemail' => 'Digər istifadəçilər mənə e-məktub göndərə bilər',
-'prefs-searchoptions' => 'Axtarış kriteriyaları',
-'prefs-namespaces' => 'Adlar fəzası',
-'defaultns' => 'Yaxud bu adlar fəzasında axtar:',
-'default' => 'boÅŸ',
-'prefs-files' => 'Fayllar',
-'prefs-custom-css' => 'Xüsusi CSS',
-'prefs-custom-js' => 'Xüsusi JavaScript',
-'prefs-emailconfirm-label' => 'E-mailin təsdiqlənməsi:',
-'prefs-textboxsize' => 'Redaktə pəncərəsinin ölçüsü',
-'youremail' => 'E-məktub *',
-'username' => 'İstifadəçi adı:',
-'uid' => 'İstifadəçi ID:',
-'prefs-memberingroups' => 'Üzvü olduğu {{PLURAL:$1|qrup|qruplar}}:',
-'prefs-memberingroups-type' => '$1',
-'prefs-registration' => 'Qeydiyyat vaxtı:',
-'prefs-registration-date-time' => '$1',
-'yourrealname' => 'Æsl adınız:',
-'yourlanguage' => 'Dil:',
-'yourvariant' => 'Variant:',
-'yournick' => 'Ləqəb:',
-'badsig' => 'Səhv xam imza.
+'savedprefs' => 'Seçiminiz qeyd edildi.',
+'timezonelegend' => 'Vaxt zonası:',
+'localtime' => 'Yerli vaxt:',
+'timezoneuseserverdefault' => 'Susmaya görə serverdən istifadə',
+'timezoneuseoffset' => 'Digər (fərqi göstərmək)',
+'timezoneoffset' => 'Vaxt fərqi¹:',
+'servertime' => 'Server vaxtı:',
+'guesstimezone' => 'Brouzerdən götür',
+'timezoneregion-africa' => 'Afrika',
+'timezoneregion-america' => 'Amerika',
+'timezoneregion-antarctica' => 'Antarktika',
+'timezoneregion-arctic' => 'Arktik',
+'timezoneregion-asia' => 'Asiya',
+'timezoneregion-atlantic' => 'Atlantik Okean',
+'timezoneregion-australia' => 'Avstraliya',
+'timezoneregion-europe' => 'Avropa',
+'timezoneregion-indian' => 'Hind Okeanı',
+'timezoneregion-pacific' => 'Sakit Okean',
+'allowemail' => 'Digər istifadəçilər mənə e-məktub göndərə bilər',
+'prefs-searchoptions' => 'Axtarış kriteriyaları',
+'prefs-namespaces' => 'Adlar fəzası',
+'defaultns' => 'Yaxud bu adlar fəzasında axtar:',
+'default' => 'boÅŸ',
+'prefs-files' => 'Fayllar',
+'prefs-custom-css' => 'Xüsusi CSS',
+'prefs-custom-js' => 'Xüsusi JavaScript',
+'prefs-common-css-js' => 'Bütün skinlər üçün ümumi CSS/JavaScript:',
+'prefs-emailconfirm-label' => 'E-mailin təsdiqlənməsi:',
+'prefs-textboxsize' => 'Redaktə pəncərəsinin ölçüsü',
+'youremail' => 'E-məktub *',
+'username' => 'İstifadəçi adı:',
+'uid' => 'İstifadəçi ID:',
+'prefs-memberingroups' => 'Üzvü olduğu {{PLURAL:$1|qrup|qruplar}}:',
+'prefs-memberingroups-type' => '$1',
+'prefs-registration' => 'Qeydiyyat vaxtı:',
+'prefs-registration-date-time' => '$1',
+'yourrealname' => 'Æsl adınız:',
+'yourlanguage' => 'Dil:',
+'yourvariant' => 'Variant:',
+'yournick' => 'Ləqəb:',
+'badsig' => 'Səhv xam imza.
HTML kodu yoxla.',
-'yourgender' => 'Cins:',
-'gender-unknown' => 'göstərmə',
-'gender-male' => 'kiÅŸi',
-'gender-female' => 'qadın',
-'email' => 'E-məktub',
-'prefs-help-realname' => 'Həqiqi adınızı daxil etmək qeyri-məcburidir.
+'badsiglength' => 'İmzanız çox uzundur. İmza $1 {{PLURAL:$1|character|simvoldan}} uzun olmamalıdır.',
+'yourgender' => 'Cins:',
+'gender-unknown' => 'göstərmə',
+'gender-male' => 'kiÅŸi',
+'gender-female' => 'qadın',
+'email' => 'E-məktub',
+'prefs-help-realname' => 'Həqiqi adınızı daxil etmək qeyri-məcburidir.
Bu seçimi etdiyiniz halda, adınız işinizə görə müəlliflik hüququnuzun tanınması üçün istifadə ediləcək.',
-'prefs-help-email' => 'E-məktub ünvanınızı daxil etmək qeyri-məcburidir.
+'prefs-help-email' => 'E-məktub ünvanınızı daxil etmək qeyri-məcburidir.
Bu parolunuzu unutduğunuz halda sizə yeni parol göndərməyə imkan verir.
Həmçinin kimliyinizi gostərmədən belə, başqalarının sizinlə istifadəçi və ya istifadəçi müzakirəsi səhifələriniz vasitəsi ilə əlaqə yaratmalarını seçə bilərsiniz.',
-'prefs-help-email-required' => 'Elektron ünvan tələb olunur.',
-'prefs-info' => 'Æsas mÉ™lumatlar',
-'prefs-i18n' => 'Beynəlxalqlaşdırma',
-'prefs-signature' => 'Ä°mza',
-'prefs-dateformat' => 'Tarix formatı',
-'prefs-advancedediting' => 'Ætraflı variantlar',
-'prefs-advancedrc' => 'Ætraflı variantlar',
-'prefs-advancedrendering' => 'Ætraflı variantlar',
-'prefs-advancedsearchoptions' => 'Ætraflı variantlar',
-'prefs-advancedwatchlist' => 'Ætraflı variantlar',
-'prefs-diffs' => 'Fərqlər',
+'prefs-help-email-required' => 'Elektron ünvan tələb olunur.',
+'prefs-info' => 'Æsas mÉ™lumatlar',
+'prefs-i18n' => 'Beynəlxalqlaşdırma',
+'prefs-signature' => 'Ä°mza',
+'prefs-dateformat' => 'Tarix formatı',
+'prefs-timeoffset' => 'Zaman ofseti
+
+Zaman ofseti
+
+Zaman ofseti
+
+Zaman ofseti',
+'prefs-advancedediting' => 'Ætraflı variantlar',
+'prefs-advancedrc' => 'Ætraflı variantlar',
+'prefs-advancedrendering' => 'Ætraflı variantlar',
+'prefs-advancedsearchoptions' => 'Ætraflı variantlar',
+'prefs-advancedwatchlist' => 'Ætraflı variantlar',
+'prefs-displayrc' => 'Görüntü variantları',
+'prefs-displaysearchoptions' => 'Görüntü variantları',
+'prefs-displaywatchlist' => 'Görüntü variantları',
+'prefs-diffs' => 'Fərqlər',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-poçt ünvanı keçərlidir',
+'email-address-validity-invalid' => 'Düzgünn e-mail ünvanına gir',
# User rights
'userrights' => 'İstifadəçi hüququ idarəsi',
@@ -977,7 +1070,12 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'userrights-editusergroup' => 'İstifadəçi qruplarını redaktə et',
'saveusergroups' => 'İstifadəçi qrupunu qeyd et',
'userrights-groupsmember' => 'Daxil olduÄŸu qruplar:',
+'userrights-groupsmember-auto' => 'Güman edilən üzv:',
'userrights-reason' => 'Səbəb:',
+'userrights-no-interwiki' => 'Sizə başqa vikilayihələrdəki istifadəçilərin statusunu dəyişməyə icazə verilməyib',
+'userrights-nodatabase' => '$1 verilənlər bazası ya mövcud deyil, ya da lokal deyil.',
+'userrights-nologin' => 'Siz istifadəçilərin hüquqlarını dəyişmək üçün idarəçi olaraq sistemə [[Special:UserLogin|Daxil olmalısınız]].',
+'userrights-notallowed' => 'Sizin istifadəçi hesabınıza digər istifadəçilərə əlavə hüquq verməyə icazə verilməyib.',
'userrights-changeable-col' => 'Dəyişdirə bildiyiniz qruplar',
'userrights-unchangeable-col' => 'Dəyişdirə bilmədiyiniz qruplar',
'userrights-irreversible-marker' => '$1*',
@@ -1004,6 +1102,7 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'grouppage-bot' => '{{ns:project}}:Botlar',
'grouppage-sysop' => '{{ns:project}}:İdarəçilər',
'grouppage-bureaucrat' => '{{ns:project}}:Bürokratlar',
+'grouppage-suppress' => '{{ns:project}}:Müfəttişlər',
# Rights
'right-read' => 'Səhifələrin oxunması',
@@ -1013,25 +1112,53 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'right-createaccount' => 'Yeni istifadəçi hesabları açmaq',
'right-minoredit' => 'Redaktələri kiçik redaktə kimi nişanlamaq',
'right-move' => 'Səhifənin adını dəyişdir',
+'right-move-subpages' => 'Səhifənin adının onların alt səhifələrin adı ilə dəyişdirilməsi',
+'right-move-rootuserpages' => 'əsas istifadəçi səhifələrinin adını dəyişmək',
'right-movefile' => 'Faylın adını dəyişdir',
+'right-suppressredirect' => 'Səhifənin adını dəyişən zaman kohnə addan istiqamətlənmə yaradıla bilinmir',
'right-upload' => 'Fayl yüklə',
'right-reupload' => 'Mövcud faylın yeni versiyasının yüklənməsi',
'right-reupload-own' => 'Mövcud faylın yeni versiyasının həmin istifadəçi tərəfindən yüklənməsi',
+'right-reupload-shared' => 'ümumi anbarda olan faylın adının lokal adla dəyişdirilməsi',
'right-upload_by_url' => 'URL-dən fayl yüklə',
'right-autoconfirmed' => 'Yarım mühafizə edilmiş səhifənin redaktəsi',
+'right-bot' => 'Avtomatik proses hesab edilir',
+'right-apihighlimits' => 'API sorğularında yüksək həddən istifadə et',
'right-writeapi' => 'Redaktələrdən zamanı API-dən (İnterfeys proqramlaşdıran proqram) istifadə',
'right-delete' => 'Səhifələrin silinməsi',
'right-bigdelete' => 'Uzun tarixçəsi olan səhifələrin silinməsi',
+'right-deleterevision' => 'səhifənin konkret versiyasının silinməsi və bərpası',
+'right-deletedhistory' => 'silinmiş mətnə daxil olmadan silinmiş səhifələrin tarixçələrinə baxma',
'right-browsearchive' => 'Silinmiş səhifələri axtar',
'right-undelete' => 'Silinmiş səhifələrin bərpası',
+'right-suppressrevision' => 'İdarəçilərdən gizlənmiş dəyişikliklərə bax və geri yüklə',
'right-suppressionlog' => 'Şəxsi qeydlərə bax',
'right-block' => 'Digər istifadəçilərin redaktə etməsinə qadağa qoy',
'right-blockemail' => 'İstifadəçinin e-poçt göndərməsinə qadağa qoy',
'right-hideuser' => 'İstifadəçi adına qadağa qoy və adın görünməsinin qarşısını al',
+'right-ipblock-exempt' => 'IP bloklanmalarını, avtobloklanmalarını və diapazon bloklanmalarını keç',
+'right-proxyunbannable' => 'Proksilərin avtomatik bloklanmalarını keç',
+'right-unblockself' => 'Özünün blokunun qaldırılması',
+'right-protect' => 'Mühafizə səviyyəsi dəyiş və mühafizə altında olan səhifəni redaktə et',
+'right-editprotected' => 'Mühafizə olunmuş səhifələri redaktə (kaskad mühafizə daxil olmaqla)',
'right-editinterface' => 'İstifadəçi interfeysini dəyişmək',
+'right-editusercssjs' => 'Digər istifadəçilərin CSS və JavaScript fayllarını redaktə',
+'right-editusercss' => 'Digər istifadəçilərin CSS faylını redaktə',
+'right-edituserjs' => 'Digər istifadəçilərin JavaScript faylını redaktə',
+'right-markbotedits' => 'Geri qaytarılan dəyişikliklərin bot dəyişiklikləri kimi işarələnməsi',
+'right-noratelimit' => 'Sürət limiti yoxdur',
+'right-import' => 'Digər vikilərdən səhifələrin idxalı',
+'right-importupload' => 'fayl yükləmə vasitəsilə səhifələrin idxalı',
+'right-patrol' => 'Digərlərinin dəyişikliklərini patrullanmış olaraq işarələ',
+'right-autopatrol' => 'Dəyişikliklər avtomatik patrullanmış kimi işarələnir',
+'right-patrolmarks' => 'Bütün patrullanmış son dəyişikliklərə bax',
+'right-unwatchedpages' => 'Müşahidə olunmayan səhifələrin siyahısına baxış',
+'right-trackback' => 'Trackback göndər',
+'right-mergehistory' => 'Səhifələrin tarixini birləşdirmək',
'right-userrights' => 'Bütün istifadəçi hüquqlarının redaktə edilməsi',
'right-userrights-interwiki' => 'Digər vikilərdəki istifadəçilərin istifadəçi hüquqlarını dəyişdir',
'right-siteadmin' => 'Məlumatlar bazasının bloklanması və blokun götürülməsi',
+'right-reset-passwords' => 'Digər istifadəçi parollarını ləğv etmək',
'right-sendemail' => 'Digər istifadəçilərə elektron poçt göndər',
# User rights log
@@ -1041,22 +1168,39 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'rightsnone' => '(heç biri)',
# Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'bu səhifənin oxunması',
-'action-edit' => 'bu səhifəni redaktə etmək',
-'action-createpage' => 'səhifələrin yaradılması',
-'action-createtalk' => 'müzakirə səhifələrinin yaradılması',
-'action-createaccount' => 'bu istifadəçi hesabının yaradılması',
-'action-minoredit' => 'bunu kiçik redaktə kimi nişanla',
-'action-move' => 'bu səhifənin adını dəyişmək',
-'action-move-subpages' => 'bu səhifənin və onun altsəhifələrinin adını dəyişmək',
-'action-move-rootuserpages' => 'əsas istifadəçi səhifələrinin adını dəyişmək',
-'action-movefile' => 'bu faylın adını dəyişmək',
-'action-upload' => 'bu faylı yüklə',
-'action-delete' => 'bu səhifəni sil',
-'action-deleterevision' => 'bu yoxlamaı ləğv et',
-'action-browsearchive' => 'Silinmiş səhifələri axtar',
-'action-undelete' => 'bu səhifəni silmə',
-'action-userrights' => 'Bütün istifadəçi hüquqlarını redaktə et',
+'action-read' => 'bu səhifənin oxunması',
+'action-edit' => 'bu səhifəni redaktə etmək',
+'action-createpage' => 'səhifələrin yaradılması',
+'action-createtalk' => 'müzakirə səhifələrinin yaradılması',
+'action-createaccount' => 'bu istifadəçi hesabının yaradılması',
+'action-minoredit' => 'bunu kiçik redaktə kimi nişanla',
+'action-move' => 'bu səhifənin adını dəyişmək',
+'action-move-subpages' => 'bu səhifənin və onun altsəhifələrinin adını dəyişmək',
+'action-move-rootuserpages' => 'əsas istifadəçi səhifələrinin adını dəyişmək',
+'action-movefile' => 'bu faylın adını dəyişmək',
+'action-upload' => 'bu faylı yüklə',
+'action-reupload' => 'Mövcud faylın yeni versiyasının yüklənməsi',
+'action-upload_by_url' => 'URL ünvanından bu faylı yükləmək',
+'action-writeapi' => 'API yazıdan istifadə',
+'action-delete' => 'bu səhifəni sil',
+'action-deleterevision' => 'bu yoxlamaı ləğv et',
+'action-deletedhistory' => 'səhifənin silinmə tarixinə bax',
+'action-browsearchive' => 'Silinmiş səhifələri axtar',
+'action-undelete' => 'bu səhifəni silmə',
+'action-suppressrevision' => 'bu gizli redaktəyə bax və bərpa et',
+'action-suppressionlog' => 'xüsusi gündəliyə baxış',
+'action-block' => 'istifadəçinin redaktə etməsini əngəlləmək',
+'action-protect' => 'bu səhifənin mühafizə səviyyəsini dəyişmək',
+'action-import' => 'bu səhifəni başqa vikidən götürmək',
+'action-importupload' => 'fayl yükləmə vasitəsilə səhifələrin idxalı',
+'action-patrol' => 'Digərlərinin dəyişikliklərini patrullanmış olaraq işarələ',
+'action-autopatrol' => 'öz redaktələrinizi patrullanmış olarq işarələmək',
+'action-unwatchedpages' => 'müşahidə olunmayan səhifələrin siyahısına baxış',
+'action-trackback' => 'Trackback göndər',
+'action-mergehistory' => 'Bu səhifənin tarixini birləşdirmək',
+'action-userrights' => 'Bütün istifadəçi hüquqlarını redaktə et',
+'action-userrights-interwiki' => 'Digər vikilərdəki istifadəçilərin istifadəçi hüquqlarını dəyişdir',
+'action-siteadmin' => 'Məlumatlar bazasının bloklanması və blokun götürülməsi',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
@@ -1064,16 +1208,12 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'recentchanges-legend' => 'Son dəyişiklik seçimləri',
'recentchangestext' => "'''Æn son dÉ™yiÅŸikliklÉ™ri bu sÉ™hifÉ™dÉ™n izlÉ™yin:'''",
'recentchanges-feed-description' => 'Vikidəki ən son dəyişiklikləri bu yayım kanalından izləyin.',
-'recentchanges-label-legend' => 'Şərh: $1.',
-'recentchanges-legend-newpage' => '$1 - yeni səhifə',
'recentchanges-label-newpage' => 'Bu dəyişiklik yeni səhifə yaratdı',
-'recentchanges-legend-minor' => '$1 - kiçik redaktə',
'recentchanges-label-minor' => 'Bu kiçik redaktədir',
-'recentchanges-legend-bot' => '$1 - bot redaktəsi',
'recentchanges-label-bot' => 'Bu redaktə bot tərəfindən edilmişdir',
-'recentchanges-legend-unpatrolled' => '$1 - nəzərdən keçirilməmiş redaktə',
'recentchanges-label-unpatrolled' => 'Bu redaktə hələ nəzərdən keçirilməmişdir',
'rcnote' => "Aşağıdakı {{PLURAL:$1|'''1''' dəyişiklik|'''$1''' dəyişiklik}} saat $5, $4 tarixinə qədər son {{PLURAL:$2|gün|'''$2''' gün}} ərzində edilmişdir.",
+'rcnotefrom' => "Aşağıda '''$2'''-dən ('''$1'''-ə qədər) dəyişikliklər sadalanmışdır.",
'rclistfrom' => '$1 vaxtından başlayaraq yeni dəyişiklikləri göstər',
'rcshowhideminor' => 'Kiçik redaktələri $1',
'rcshowhidebots' => 'Botları $1',
@@ -1091,6 +1231,7 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'boteditletter' => 'b',
'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 izləyən istifadəçi]',
+'rc_categories' => 'Kateqoriyalara limit qoy ("|" ilə ayır)',
'rc_categories_any' => 'Hər',
'rc-change-size' => '$1',
'newsectionsummary' => '/* $1 */ yeni bölmə',
@@ -1109,65 +1250,118 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'recentchangeslinked-to' => 'Qeyd olunan səhifədəki deyil, ona daxili keçid verən səhifələrdəki dəyişiklikləri göstər',
# Upload
-'upload' => 'Fayl yüklə',
-'uploadbtn' => 'Sənəd yüklə',
-'reuploaddesc' => 'Return to the upload form.',
-'uploadnologin' => 'Daxil olmamısınız',
-'uploadnologintext' => 'Fayl yükləmək üçün [[Special:UserLogin|daxil olmalısınız]].',
-'uploaderror' => 'Yükləmə xətası',
-'upload-permitted' => 'İcazə verilən fayl tipləri: $1.',
-'uploadlog' => 'yükləmə qeydi',
-'uploadlogpage' => 'Yükləmə qeydi',
-'uploadlogpagetext' => 'Aşağıda ən yeni yükləmə jurnal qeydləri verilmişdir.',
-'filename' => 'Fayl adı',
-'filedesc' => 'Xülasə',
-'fileuploadsummary' => 'Ä°zahat:',
-'filereuploadsummary' => 'Fayl dəyişiklikləri:',
-'filestatus' => 'Müəllif statusu:',
-'filesource' => 'Mənbə:',
-'uploadedfiles' => 'Yüklənmiş fayllar',
-'ignorewarning' => 'Xəbərdarlıqlara əhəmiyyət vermə və faylı saxla',
-'badfilename' => 'Faylın adı dəyişildi. Yeni adı: "$1".',
-'emptyfile' => 'Yüklədiyiniz fayl boşdur. Bu faylın adında olan hərf səhvi ilə bağlı ola bilər. Xahiş olunur ki, doğurdan da bu faylı yükləmək istədiyinizi yoxlayasınız.',
-'fileexists' => "Yükləmək istədiyiniz adda fayl mövcuddur.
+'upload' => 'Fayl yüklə',
+'uploadbtn' => 'Sənəd yüklə',
+'reuploaddesc' => 'Return to the upload form.',
+'upload-tryagain' => 'Dəyşdirilmiş fayl izahını göndər',
+'uploadnologin' => 'Daxil olmamısınız',
+'uploadnologintext' => 'Fayl yükləmək üçün [[Special:UserLogin|daxil olmalısınız]].',
+'upload_directory_missing' => '($1) yükləmə qaydası axtarılır və vebserverdə yaradılması qeyri-mümkündür.',
+'upload_directory_read_only' => '"$1" kataloqunun arxivi veb-server yazıları üçün qapalıdır.',
+'uploaderror' => 'Yükləmə xətası',
+'upload-permitted' => 'İcazə verilən fayl tipləri: $1.',
+'upload-preferred' => 'İcazə verilən fayl tipləri: $1.',
+'upload-prohibited' => 'İcazə verilməyən fayl tipləri: $1.',
+'uploadlog' => 'yükləmə qeydi',
+'uploadlogpage' => 'Yükləmə qeydi',
+'uploadlogpagetext' => 'Aşağıda ən yeni yükləmə jurnal qeydləri verilmişdir.',
+'filename' => 'Fayl adı',
+'filedesc' => 'Xülasə',
+'fileuploadsummary' => 'Ä°zahat:',
+'filereuploadsummary' => 'Fayl dəyişiklikləri:',
+'filestatus' => 'Müəllif statusu:',
+'filesource' => 'Mənbə:',
+'uploadedfiles' => 'Yüklənmiş fayllar',
+'ignorewarning' => 'Xəbərdarlıqlara əhəmiyyət vermə və faylı saxla',
+'ignorewarnings' => 'Bütün xəbərdarlıqlara məhəl qoymamaq',
+'badfilename' => 'Faylın adı dəyişildi. Yeni adı: "$1".',
+'empty-file' => 'Göndərdiyiniz fayl boşdur.',
+'file-too-large' => 'Göndərdiyiniz fayl çox böyükdür.',
+'filename-tooshort' => 'Fayl adı qısadır.',
+'filetype-banned' => 'Bu tip fayllar qadağandır.',
+'verification-error' => 'Fayl təsdiqi baş tutmadı.',
+'illegal-filename' => 'Fayl adına icazə yoxdur.',
+'unknown-error' => 'Bilinməyən bir xəta yarandı.',
+'tmp-create-error' => 'Müvəqqəti fayl yaradıla bilmədi.',
+'tmp-write-error' => 'Müvəqqəti fayl yazılarkən xəta.',
+'largefileserver' => 'Faylın ölçüsü yol verilən həddi aşır.',
+'emptyfile' => 'Yüklədiyiniz fayl boşdur. Bu faylın adında olan hərf səhvi ilə bağlı ola bilər. Xahiş olunur ki, doğurdan da bu faylı yükləmək istədiyinizi yoxlayasınız.',
+'fileexists' => "Yükləmək istədiyiniz adda fayl mövcuddur.
Lütfən '''<tt>[[:$1]]</tt>''' keçidini yoxlayın və bu faylı yükləmək istədiyinizdən əmin olun.
[[$1|thumb]]",
-'successfulupload' => 'Yükləmə tamamlandı',
-'uploadwarning' => 'Yükləmə xəbərdarlığı',
-'savefile' => 'Faylı qeyd et',
-'uploadedimage' => 'yükləndi "[[$1]]"',
-'upload-source' => 'Mənbə faylı',
-'sourcefilename' => 'Fayl adı mənbələri',
-'sourceurl' => 'URL mənbəsi:',
-'destfilename' => 'Fayl adı',
-'upload-maxfilesize' => 'Faylın maksimum həcmi: $1',
-'upload-description' => 'Faylın izahı',
-'watchthisupload' => 'Bu faylı izlə',
-'upload-wasdeleted' => "'''Diqqət! Siz əvvəl bu ad altında mövcud olmuş və silinmiş faylı yenidən yükləməkdəsiniz'''
+'uploadwarning' => 'Yükləmə xəbərdarlığı',
+'savefile' => 'Faylı qeyd et',
+'uploadedimage' => 'yükləndi "[[$1]]"',
+'overwroteimage' => '"[[$1]]"-in yeni versiyası yükləndi',
+'uploaddisabled' => 'Yükləmə baş tutmadı',
+'copyuploaddisabled' => 'URL-dən yükləmə baş tutmadı.',
+'uploadfromurl-queued' => 'Yükləməniz növbə gözləyir',
+'uploaddisabledtext' => 'Fayl yüklənməsi baş tutmadı.',
+'upload-source' => 'Mənbə faylı',
+'sourcefilename' => 'Fayl adı mənbələri',
+'sourceurl' => 'URL mənbəsi:',
+'destfilename' => 'Fayl adı',
+'upload-maxfilesize' => 'Faylın maksimum həcmi: $1',
+'upload-description' => 'Faylın izahı',
+'upload-options' => 'Yükləmə parametrləri',
+'watchthisupload' => 'Bu faylı izlə',
+'upload-wasdeleted' => "'''Diqqət! Siz əvvəl bu ad altında mövcud olmuş və silinmiş faylı yenidən yükləməkdəsiniz'''
ÆvvÉ™lcÉ™dÉ™n bu faylı yenidÉ™n yüklÉ™mÉ™yin nÉ™ dÉ™rÉ™cÉ™dÉ™ lazımlı olduÄŸunu müəyyÉ™nləşdirmÉ™yiniz mÉ™slÉ™hÉ™tdir.
Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
+'filename-prefix-blacklist' => ' #<!-- Bu sətrə toxunmayın --> <pre>
+# Sintaksis aşağıdakı kimi görünür:
+# * "#" simvolundan sətrin sonuna kimi yazılar şərhdir
+# * Tipik fayl adları üçün olan prefiksdəki hər bir boş olmayan sətir rəqəmli kamera trəfindən avtomatik qeydə alınır
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # digər mobil telefonlar
+IMG # generic
+JD # Jenoptik
+MGP # Pentax
+PICT # misc.
+ #</pre> <!-- Bu sətrə toxunmayın -->',
+'upload-success-subj' => 'Yükləmə tamamlandı',
+'upload-failure-subj' => 'Yükləmə problemi',
+'upload-failure-msg' => 'Yüklədiyiniz [$2] forması ilə bağlı problem yaranıb:
-'upload-file-error' => 'Daxili xəta',
-'upload-unknown-size' => 'Naməlum həcm',
+$1',
+'upload-warning-subj' => 'Yükləmə xəbərdarlığı',
+
+'upload-proto-error' => 'Yanlış protokol',
+'upload-file-error' => 'Daxili xəta',
+'upload-misc-error' => 'Naməlum yükləmə xətası',
+'upload-too-many-redirects' => 'URL-də xeyli yönləndirmə var',
+'upload-unknown-size' => 'Naməlum həcm',
+'upload-http-error' => ' HTTP xətası var : $1',
# img_auth script messages
'img-auth-accessdenied' => 'Giriş qadağandır',
+'img-auth-nofile' => 'Fayl "$1" mövcud deyil.',
+'img-auth-streaming' => '"$1" axını.',
+'img-auth-noread' => 'İstifadəçinin "$1"i oxumaq hüququ yoxdur.',
# HTTP errors
'http-invalid-url' => 'Səhv URL: $1',
'http-read-error' => 'HTTP oxuma xətası',
+'http-timed-out' => 'HTTP istəyinin vaxtı bitdi.',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error28' => 'Yükləmə vaxtı bitdi',
-'license' => 'Lisenziya',
-'license-header' => 'Lisenziya',
-'nolicense' => 'Heç biri seçilməmişdir',
+'license' => 'Lisenziya',
+'license-header' => 'Lisenziya',
+'nolicense' => 'Heç biri seçilməmişdir',
+'upload_source_url' => ' (keçərli, hər kəsin daxil ola biləcəyi bir URL)',
+'upload_source_file' => ' (kompyuterinizdəki bir fayl)',
# Special:ListFiles
+'listfiles_search_for' => 'Media adı üçün axtar:',
'imgfile' => 'fayl',
'listfiles' => 'Fayl siyahısı',
+'listfiles_thumb' => 'Kiçik şəkil',
'listfiles_date' => 'Tarix',
'listfiles_name' => 'Ad',
'listfiles_user' => 'İstifadəçi',
@@ -1176,26 +1370,28 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'listfiles_count' => 'Versiya',
# File description page
-'file-anchor-link' => 'Fayl',
-'filehist' => 'Faylın tarixçəsi',
-'filehist-help' => 'Faylın əvvəlki versiyasını görmək üçün gün/tarix bölməsindəki tarixləri tıqlayın.',
-'filehist-deleteall' => 'hamısını sil',
-'filehist-deleteone' => 'sil',
-'filehist-revert' => 'əvvəlki vəziyyətinə',
-'filehist-current' => 'indiki',
-'filehist-datetime' => 'Tarix/Vaxt',
-'filehist-thumb' => 'Kiçik şəkil',
-'filehist-thumbtext' => '$1 tarixindəki versiyanın kiçildilmiş görüntüsü',
-'filehist-user' => 'İstifadəçi',
-'filehist-dimensions' => 'Ölçülər',
-'filehist-filesize' => 'Faylın həcmi',
-'filehist-comment' => 'Şərh',
-'filehist-missing' => 'Şəkil gözlənilir',
-'imagelinks' => 'Fayl keçidləri',
-'linkstoimage' => '{{PLURAL:$1|səhifə|$1 səhifə}} bu fayla istinad edir:',
-'sharedupload' => 'Bu fayl $1-dandır və ola bilsin ki, başqa layihələrdə də istifadə edilir.',
-'uploadnewversion-linktext' => 'Bu faylın yeni versiyasını yüklə',
-'shared-repo-from' => '$1-dan',
+'file-anchor-link' => 'Fayl',
+'filehist' => 'Faylın tarixçəsi',
+'filehist-help' => 'Faylın əvvəlki versiyasını görmək üçün gün/tarix bölməsindəki tarixləri tıqlayın.',
+'filehist-deleteall' => 'hamısını sil',
+'filehist-deleteone' => 'sil',
+'filehist-revert' => 'əvvəlki vəziyyətinə',
+'filehist-current' => 'indiki',
+'filehist-datetime' => 'Tarix/Vaxt',
+'filehist-thumb' => 'Kiçik şəkil',
+'filehist-thumbtext' => '$1 tarixindəki versiyanın kiçildilmiş görüntüsü',
+'filehist-nothumb' => 'Miniatür yoxdur',
+'filehist-user' => 'İstifadəçi',
+'filehist-dimensions' => 'Ölçülər',
+'filehist-filesize' => 'Faylın həcmi',
+'filehist-comment' => 'Şərh',
+'filehist-missing' => 'Şəkil gözlənilir',
+'imagelinks' => 'Fayl keçidləri',
+'linkstoimage' => '{{PLURAL:$1|səhifə|$1 səhifə}} bu fayla istinad edir:',
+'sharedupload' => 'Bu fayl $1-dandır və ola bilsin ki, başqa layihələrdə də istifadə edilir.',
+'uploadnewversion-linktext' => 'Bu faylın yeni versiyasını yüklə',
+'shared-repo-from' => '$1-dan',
+'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
# File reversion
'filerevert' => '$1 faylını əvvəlki vəziyyətinə qaytar',
@@ -1213,6 +1409,7 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'filedelete-submit' => 'Sil',
'filedelete-success' => "'''$1''' silinmiÅŸdir.",
'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'-nin $3 və $2 versiyaları silinmişdir.</span>',
+'filedelete-nofile' => "'''$1''' mövcud deyil.",
'filedelete-otherreason' => 'Başqa/əlavə səbəb:',
'filedelete-reason-otherlist' => 'Başqa səbəb',
'filedelete-reason-dropdown' => '*Æsas silmÉ™ sÉ™bÉ™bi
@@ -1222,6 +1419,7 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
# MIME search
'mimesearch' => 'MIME axtar',
+'mimetype' => 'MIME tipi:',
'download' => 'Yüklə',
# Unwatched pages
@@ -1254,8 +1452,8 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'statistics-edits' => '{{SITENAME}} yaranandan bəri edilən səhifə dəyişiklikləri',
'statistics-edits-average' => 'Hər səhifədəki orta hesabla dəyişiklik',
'statistics-views-total' => 'Cəmi göstərmə',
+'statistics-views-total-desc' => 'Mövcud olmayan və xüsusi səhifələrin göstərilmələri daxil edilməmişdir.',
'statistics-views-peredit' => 'Redaktə başına göstərmə',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue İş sırası] uzunluğu',
'statistics-users' => 'Qeydiyyatdan keçmiş [[Special:ListUsers|istifadəçilər]]',
'statistics-users-active' => 'Aktiv istifadəçilər',
'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 gündə}} iş görən istifadəçilər',
@@ -1266,8 +1464,10 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'disambiguations-text' => "Aşağıdakı səhifələr '''dəqiqləşdirmə səhifələrinə''' keçid verir. Bunun əvəzinə onlar çox guman ki, müvafiq konkret bir məqaləni göstərməlidirlər.
<br />Səhifə o zaman dəqiqləşdirmə səhifəsi hesab edilir ki, onda [[MediaWiki:Disambiguationspage]]-dən keçid verilmiş şablon istifadə edilir.",
-'doubleredirects' => 'İkiqat istiqamətləndirmələr',
-'double-redirect-fixer' => 'Yönləndirmə səhvdir',
+'doubleredirects' => 'İkiqat istiqamətləndirmələr',
+'double-redirect-fixed-move' => '[[$1]] dəyişdirilib.
+Hazırda [[$2]]-yə istiqamətlənib.',
+'double-redirect-fixer' => 'Yönləndirmə səhvdir',
'brokenredirects' => 'Xətalı istiqamətləndirmə',
'brokenredirectstext' => 'Aşağıdakı istiqamətləndirmələr mövcud olmayan səhifələrə keçid verir:',
@@ -1285,6 +1485,10 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'ncategories' => '$1 {{PLURAL:$1|kateqoriya|kateqoriya}}',
'nlinks' => '$1 {{PLURAL:$1|keçid|keçidlər}}',
'nmembers' => '$1 {{PLURAL:$1|üzv|üzv}}',
+'nrevisions' => '$1 dəyişiklik',
+'nviews' => '$1 baxış',
+'nimagelinks' => '$1 səhifədə istifadə olunmur',
+'ntransclusions' => '$1 səhifədə istifadə olunur',
'specialpage-empty' => 'Bu səhifə boşdur.',
'lonelypages' => 'Yetim səhifələr',
'uncategorizedpages' => 'Kateqoriyasız səhifələr',
@@ -1296,10 +1500,12 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'popularpages' => 'Məşhur səhifələr',
'wantedcategories' => 'Təlabat olunan kateqoriyalar',
'wantedpages' => 'Tələb olunan səhifələr',
+'wantedpages-badtitle' => 'Müraciət zamantı yanlış başlıq: $1',
'wantedfiles' => 'Tələb olunan fayllar',
'wantedtemplates' => 'Tələb olunan şablonlar',
'mostlinked' => 'Æn çox keçidlÉ™nÉ™n sÉ™hifÉ™lÉ™r',
'mostlinkedcategories' => 'Æn çox mÉ™qalÉ™si olan kateqoriyalar',
+'mostlinkedtemplates' => 'Æn çox istifadÉ™ olunan ÅŸablonlar',
'mostcategories' => 'Kateqoriyası ən çox olan məqalələr',
'mostimages' => 'Æn çox istifadÉ™ edilmiÅŸ ÅŸÉ™killÉ™r',
'mostrevisions' => 'Æn çox nÉ™zÉ™rdÉ™n keçirilmiÅŸ (versiyalı) mÉ™qalÉ™lÉ™r',
@@ -1315,11 +1521,17 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'protectedpagesempty' => 'Hal-hazırda bu parametrə uyğun heç bir mühafizəli səhifə yoxdur',
'protectedtitles' => 'Mühafizəli başlıqlar',
'listusers' => 'İstifadəçi siyahısı',
+'listusers-editsonly' => 'Yalnız redaktələri olan istifadəçiləri göstər',
+'listusers-creationsort' => 'Yaranma tarixinə görə sırala',
+'usereditcount' => '$1 {{PLURAL:$1|redaktÉ™}}',
+'usercreated' => '$1 $2 vaxtda yaradılıb',
'newpages' => 'Yeni səhifələr',
'newpages-username' => 'İstifadəçi adı:',
'ancientpages' => 'Æn köhnÉ™ sÉ™hifÉ™lÉ™r',
'move' => 'Adını dəyiş',
'movethispage' => 'Bu səhifənin adını dəyiş',
+'notargettitle' => 'Verilməyib',
+'nopagetitle' => 'Belə hədəf səhifəsi yoxdur',
'pager-newer-n' => '{{PLURAL:$1|1 daha yeni|$1 daha yeni}}',
'pager-older-n' => '{{PLURAL:$1|1 daha köhnə|$1 daha köhnə}}',
'suppress' => 'Təftişçi',
@@ -1339,6 +1551,7 @@ Bu səhifənin silmə qeydləri aşağıda göstərilmişdir:",
'alllogstext' => '{{SITENAME}} üçün bütün mövcud qeydlərin birgə göstərişi.
Qeyd növü, istifadəçi adı və ya təsir edilmiş səhifəni seçməklə daha spesifik ola bilərsiniz.',
'logempty' => 'Jurnalda uyğun qeyd tapılmadı.',
+'log-title-wildcard' => 'Bu mətnlə başlayan başlıqları axtar',
# Special:AllPages
'allpages' => 'Bütün səhifələr',
@@ -1356,18 +1569,23 @@ Qeyd növü, istifadəçi adı və ya təsir edilmiş səhifəni seçməklə dah
'allpagesprefix' => 'Bu prefiksli səhifələri göstər:',
# Special:Categories
-'categories' => 'Kateqoriyalar',
-'categoriespagetext' => 'Aşağıdakı {{PLURAL:$1|kateqoriyada|kateqoriyalarda}} səhifələr, yaxud media-fayllar var.
+'categories' => 'Kateqoriyalar',
+'categoriespagetext' => 'Aşağıdakı {{PLURAL:$1|kateqoriyada|kateqoriyalarda}} səhifələr, yaxud media-fayllar var.
[[Special:UnusedCategories|İstifadə olunmayan kateqoriyalar]] burada göstərilməyib.
Həmçinin, [[Special:WantedCategories|tələb olunan kateqoriyalara]] baxın.',
+'special-categories-sort-count' => 'miqdara görə tənzimlə',
+'special-categories-sort-abc' => 'əlifba sırası ilə düz',
# Special:DeletedContributions
+'deletedcontributions' => 'Silinmiş istifadəçi fəaliyyətləri',
+'deletedcontributions-title' => 'Silinmiş istifadəçi fəaliyyətləri',
'sp-deletedcontributions-contribs' => 'köməklərim',
# Special:LinkSearch
-'linksearch' => 'Xarici keçidlər',
-'linksearch-ns' => 'Adlar fəzası:',
-'linksearch-ok' => 'Axtar',
+'linksearch' => 'Xarici keçidlər',
+'linksearch-pat' => 'Axtarış sxemi:',
+'linksearch-ns' => 'Adlar fəzası:',
+'linksearch-ok' => 'Axtar',
# Special:ListUsers
'listusers-submit' => 'Göstər',
@@ -1376,44 +1594,71 @@ Həmçinin, [[Special:WantedCategories|tələb olunan kateqoriyalara]] baxın.',
# Special:ActiveUsers
'activeusers' => 'Aktiv istifadəçilərin siyahısı',
+'activeusers-count' => '$1 {{PLURAL:$1|edit|redaktə}} son {{PLURAL:$3|day|$3 gün}}',
'activeusers-hidebots' => 'Botları gizlə',
'activeusers-hidesysops' => 'İdarəçiləri gizlə',
'activeusers-noresult' => 'İstifadəçi tapılmadı.',
# Special:Log/newusers
'newuserlogpage' => 'Yeni istifadəçilərin qeydiyyatı',
+'newuserlogpagetext' => 'Yeni qeydiyyatdan keçmiş istifadəçilərin siyahısı.',
'newuserlog-byemail' => 'parol e-maillə göndərildi',
'newuserlog-create-entry' => 'Yeni istifadəçi hesabı',
+'newuserlog-create2-entry' => 'Yeri $1 hesabı açıldı',
'newuserlog-autocreate-entry' => 'Hesab avtomatik olaraq yaradıldı',
# Special:ListGroupRights
-'listgrouprights' => 'İstifadəçi qruplarının hüquqları',
-'listgrouprights-summary' => 'Bu vikidə olan istifadəçi siyahıları və onların hüquqları aşağıda göstərilmişdir.
+'listgrouprights' => 'İstifadəçi qruplarının hüquqları',
+'listgrouprights-summary' => 'Bu vikidə olan istifadəçi siyahıları və onların hüquqları aşağıda göstərilmişdir.
Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-helppage}}]] səhifəsində tapa bilərsiniz',
-'listgrouprights-group' => 'Qrup',
-'listgrouprights-rights' => 'Hüquqlar',
-'listgrouprights-helppage' => 'Help:Qrup hüquqları',
-'listgrouprights-members' => '(üzvləri)',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Verilmiş hüquqlar</span>
+* <span class="listgrouprights-revoked">Ləğv edilmiş hüquqlar</span>',
+'listgrouprights-group' => 'Qrup',
+'listgrouprights-rights' => 'Hüquqlar',
+'listgrouprights-helppage' => 'Help:Qrup hüquqları',
+'listgrouprights-members' => '(üzvləri)',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-addgroup' => '{{PLURAL:$2|Qrupu}} əlavə et: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|Qrupu}} sil: $1',
+'listgrouprights-addgroup-all' => 'Bütün qrupları əlavə et',
+'listgrouprights-removegroup-all' => 'Bütün qrupları sil',
+'listgrouprights-addgroup-self' => 'Öz hesabına $1 {{PLURAL:$2|qrupunu|qruplarını}} əlavə et',
+'listgrouprights-removegroup-self' => 'Öz hesabından $1 {{PLURAL:$2|qrupunu|qruplarını}} sil',
+'listgrouprights-addgroup-self-all' => 'Bütün qrupları öz hesabına əlavə edə bilər',
+'listgrouprights-removegroup-self-all' => 'Bütün qrupları öz hesabından çıxara bilər',
# E-mail user
-'mailnologin' => 'Ãœnvan yoxdur',
-'emailuser' => 'İstifadəçiyə e-məktub yolla',
-'emailpage' => 'İstifadəçiyə e-məktub yolla',
-'defemailsubject' => '{{SITENAME}} e-məktub',
-'noemailtitle' => 'E-məktub ünvanı yoxdur',
-'noemailtext' => 'Bu istifadəçi işlək e-məktub ünvanını qeyd etməmişdir.',
-'emailfrom' => 'Kimdən:',
-'emailto' => 'KimÉ™',
-'emailsubject' => 'Mövzu:',
-'emailmessage' => 'Mesaj:',
-'emailsend' => 'Göndər',
-'emailsent' => 'E-məktub göndərildi',
-'emailsenttext' => 'E-məktub mesajınız göndərildi.',
+'mailnologin' => 'Ãœnvan yoxdur',
+'emailuser' => 'İstifadəçiyə e-məktub yolla',
+'emailpage' => 'İstifadəçiyə e-məktub yolla',
+'usermailererror' => 'Elektron poçtla məlumat göndərilən zaman xəta baş vermişdir:',
+'defemailsubject' => '{{SITENAME}} e-məktub',
+'usermaildisabled' => 'İstifadəçi e-maili işləmir',
+'noemailtitle' => 'E-məktub ünvanı yoxdur',
+'noemailtext' => 'Bu istifadəçi işlək e-məktub ünvanını qeyd etməmişdir.',
+'nowikiemailtitle' => 'E-poçtlara icazə verilmir',
+'email-legend' => 'Digər {{SITENAME}} istifadəçilərinə ismarıc yollamaq',
+'emailfrom' => 'Kimdən:',
+'emailto' => 'KimÉ™',
+'emailsubject' => 'Mövzu:',
+'emailmessage' => 'Mesaj:',
+'emailsend' => 'Göndər',
+'emailccme' => 'Məktubun surətini elektron ünvanıma göndər.',
+'emailccsubject' => ' $1: $2-yə olan ismarıclarınızın surəti',
+'emailsent' => 'E-məktub göndərildi',
+'emailsenttext' => 'E-məktub mesajınız göndərildi.',
+
+# User Messenger
+'usermessage-summary' => 'Sistem mesajı qoyun.',
+'usermessage-editor' => 'Sistem məlumatları',
+'usermessage-template' => 'MediaWiki:İstifadəçi müzakirəsi',
# Watchlist
'watchlist' => 'İzlədiyim səhifələr',
'mywatchlist' => 'İzlədiyim səhifələr',
-'watchlistfor' => "('''$1''' üçün)",
+'watchlistfor2' => '$1 $2 üçün',
+'nowatchlist' => 'İzləmə siyahınız böşdur.',
'watchnologin' => 'Daxil olmamısınız',
'watchnologintext' => 'İzləmə siyahınızda dəyişiklik aparmaq üçün [[Special:UserLogin|daxil olmalısınız]].',
'addedwatch' => 'İzləmə siyahısına əlavə edildi.',
@@ -1426,6 +1671,7 @@ Səhifəni izləmə sıyahınızdan çıxarmaq üçün yan lovhədəki "izləmə
'watchthispage' => 'Bu səhifəni izlə',
'unwatch' => 'İzləmə',
'unwatchthispage' => 'İzləmə',
+'notanarticle' => 'Səhifə boşdur',
'watchnochange' => 'Verilən vaxt ərzində heç bir izlədiyiniz səhifə redaktə edilməmişdir.',
'watchlist-details' => 'Müzakirə səhifələrini çıxmaq şərtilə {{PLURAL:$1|$1 səhifəni|$1 səhifəni}} izləyirsiniz.',
'wlheader-enotif' => '* E-məktubla bildiriş aktivdir.',
@@ -1507,11 +1753,17 @@ Sonuncu silinmələrə bax: $2.',
'delete-edit-reasonlist' => 'Silmə səbəblərinin redaktəsi',
# Rollback
-'rollback' => 'ÆvvÉ™lki versiya',
-'rollbacklink' => 'əvvəlki halına qaytar',
-'cantrollback' => 'Redaktə geri qaytarıla bilməz; axırıncı redaktə səhifədə olan yeganə fəaliyyətdir.',
-'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Müzakirə]]) tərəfindən edilmiş dəyişikliklər [[User:$1|$1]] tərəfindən edilmiş dəyişikliklərə qaytarıldı.',
-'rollback-success' => '$1 tərəfindən edilmiş redaktələr geri qaytarıldı; $2 tərəfindən yaradılmış son versiya bərpa olundu.',
+'rollback' => 'ÆvvÉ™lki versiya',
+'rollback_short' => 'əvvəlki halına qaytar',
+'rollbacklink' => 'əvvəlki halına qaytar',
+'rollbackfailed' => 'Geri qaytarma uÄŸursuz',
+'cantrollback' => 'Redaktə geri qaytarıla bilməz; axırıncı redaktə səhifədə olan yeganə fəaliyyətdir.',
+'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Müzakirə]]) tərəfindən edilmiş dəyişikliklər [[User:$1|$1]] tərəfindən edilmiş dəyişikliklərə qaytarıldı.',
+'revertpage-nouser' => '(istifadəçi adı çıxarılmış) tərəfindən edilən dəyişikliklər [[User:$1|$1]] tərəfindən edilən son dəyişikliyə geri alındı',
+'rollback-success' => '$1 tərəfindən edilmiş redaktələr geri qaytarıldı; $2 tərəfindən yaradılmış son versiya bərpa olundu.',
+
+# Edit tokens
+'sessionfailure-title' => 'Giriş səhvi',
# Protect
'protectlogpage' => 'Mühafizə etmə qeydləri',
@@ -1526,6 +1778,7 @@ Sonuncu silinmələrə bax: $2.',
'protectexpiry' => 'Vaxtı bitib',
'protect_expiry_invalid' => 'Mühafizənin bitmə vaxtı səhvdir.',
'protect_expiry_old' => 'Bitmə vaxtı keçmişdir.',
+'protect-unchain-permissions' => 'Mühafizənin əlavə parametrlərini açmaq',
'protect-text' => "Siz '''<nowiki>$1</nowiki>''' səhifəsinin mühafizə səviyyəsini görə və dəyişə bilərsiniz.",
'protect-locked-blocked' => "Səhifənin bloklu olduğu müddətdə siz mühafizə səviyyəsini dəyişə bilməzsiniz.
'''$1''' səhifəsində hal-hazırda edə biləcəyiniz əməliyyatlar bunlardır:",
@@ -1545,8 +1798,10 @@ Sonuncu silinmələrə bax: $2.',
'protect-cantedit' => 'Bu səhifənin mühafizə dərəcəsini dəyişdirə bilməzsiniz, çünki bu dəyişiklik üçün hüququnuz yoxdur.',
'protect-othertime' => 'BaÅŸqa vaxt:',
'protect-othertime-op' => 'BaÅŸqa vaxt',
+'protect-existing-expiry' => 'Mövcud bitiş zamanı: $3, $2',
'protect-otherreason' => 'Digər/əlavə səbəb:',
'protect-otherreason-op' => 'Digər səbəb',
+'protect-edit-reasonlist' => 'Mühafizə səbəblərinin redaktəsi',
'protect-expiry-options' => '1 saat:1 hour,1 gün:1 day,1 həftə:1 week,2 həftə:2 weeks,1 ay:1 month,3 ay:3 months,6 ay:6 months,1 ill:1 year,Müddətsiz:infinite',
'restriction-type' => 'Hüquqlar:',
'restriction-level' => 'Məhdudiyyət dərəcəsi:',
@@ -1566,24 +1821,35 @@ Sonuncu silinmələrə bax: $2.',
'restriction-level-all' => 'istənilən səviyyə',
# Undelete
-'undelete' => 'Silinmiş səhifələri göstər',
-'undeletepage' => 'Silinmiş səhifələri göstər və ya bərpa et',
-'viewdeletedpage' => 'Silinmiş səhifələri göstər',
-'undeletebtn' => 'Bərpa et',
-'undeletelink' => 'bax/bərpa et',
-'undeleteviewlink' => 'görünüş',
-'undeletereset' => 'Qur',
-'undeleteinvert' => 'Seçilən xaricindəkiləri',
-'undeletecomment' => 'Səbəb:',
-'undeletedarticle' => '"[[$1]]" məqaləsi bərpa edilmişdir',
-'cannotundelete' => 'Silməni ləğv etmə yetinə yetirilə bilmir; başqa birisi daha əvvəl səhifənin silinməsini ləğv etmiş ola bilər.',
-'undeletedpage' => "'''$1 bərpa edildi'''
+'undelete' => 'Silinmiş səhifələri göstər',
+'undeletepage' => 'Silinmiş səhifələri göstər və ya bərpa et',
+'undeletepagetitle' => "'''Aşağıdakı, [[:$1|$1]] səhifəsinin silinmiş dəyişikliklərindən ibarətdir'''.",
+'viewdeletedpage' => 'Silinmiş səhifələri göstər',
+'undelete-fieldset-title' => 'Dəyişiklikləri geri yüklə',
+'undelete-revision' => '$3 tərəfindən $1 səhifəsinin silinmiş redaktəsi ($4 tarixinden bəri, $5 saatda):',
+'undelete-nodiff' => 'ÆvvÉ™lki redaktÉ™ tapılmadı.',
+'undeletebtn' => 'Bərpa et',
+'undeletelink' => 'bax/bərpa et',
+'undeleteviewlink' => 'görünüş',
+'undeletereset' => 'Qur',
+'undeleteinvert' => 'Seçilən xaricindəkiləri',
+'undeletecomment' => 'Səbəb:',
+'undeletedarticle' => '"[[$1]]" məqaləsi bərpa edilmişdir',
+'cannotundelete' => 'Silməni ləğv etmə yetinə yetirilə bilmir; başqa birisi daha əvvəl səhifənin silinməsini ləğv etmiş ola bilər.',
+'undeletedpage' => "'''$1 bərpa edildi'''
Məqalələrin bərpa edilməsi və silinməsi haqqında son dəyişiklikləri nəzərdən keçirmək üçün [[Special:Log/delete|silmə qeydlərinə]] baxın.",
-'undelete-header' => 'Son silinmiş səhifələrə baxmaq üçün [[Special:Log/delete|silmə qeydlərinə]] bax.',
-'undelete-search-box' => 'Silinmiş səhifələri axtar.',
-'undelete-search-submit' => 'Axtar',
-'undelete-show-file-submit' => 'Bəli',
+'undelete-header' => 'Son silinmiş səhifələrə baxmaq üçün [[Special:Log/delete|silmə qeydlərinə]] bax.',
+'undelete-search-box' => 'Silinmiş səhifələri axtar.',
+'undelete-search-prefix' => 'Bununla başlayan səhifəliri göstər:',
+'undelete-search-submit' => 'Axtar',
+'undelete-no-results' => 'Silmə arxivində birbiriylə örtüşən heç bir səhifə tapılmadı.',
+'undelete-error-short' => 'Fayl silinərkən xəta: $1',
+'undelete-error-long' => 'Fayl silinərkən üzə çıxan xətalar:
+
+$1',
+'undelete-show-file-confirm' => '"<nowiki>$1</nowiki>" faylının $2 $3 tarixli silinmiş bir redaktəsini görmək istədiyinizdən əminsizinizmi?',
+'undelete-show-file-submit' => 'Bəli',
# Namespace form on various pages
'namespace' => 'Adlar fəzası:',
@@ -1600,16 +1866,19 @@ Məqalələrin bərpa edilməsi və silinməsi haqqında son dəyişiklikləri n
'month' => 'Ay',
'year' => 'Axtarışa bu tarixdən etibarən başla:',
-'sp-contributions-newbies' => 'Ancaq yeni istifadəçilərin fəaliyyətlərini göstər',
-'sp-contributions-newbies-sub' => 'Yeni istifadəçilər üçün',
-'sp-contributions-blocklog' => 'Bloklama qeydləri',
-'sp-contributions-deleted' => 'silinmiş istifadəçi fəaliyyətləri',
-'sp-contributions-logs' => 'Loqlar',
-'sp-contributions-talk' => 'Müzakirə',
-'sp-contributions-userrights' => 'istifadəçi hüquqları idarəsi',
-'sp-contributions-search' => 'Fəaliyyətləri axtar',
-'sp-contributions-username' => 'IP Ünvanı və ya istifadəçi adı:',
-'sp-contributions-submit' => 'Axtar',
+'sp-contributions-newbies' => 'Ancaq yeni istifadəçilərin fəaliyyətlərini göstər',
+'sp-contributions-newbies-sub' => 'Yeni istifadəçilər üçün',
+'sp-contributions-newbies-title' => 'Yeni hesablar üçün istifadəçi fəaliyyətləri',
+'sp-contributions-blocklog' => 'Bloklama qeydləri',
+'sp-contributions-deleted' => 'silinmiş istifadəçi fəaliyyətləri',
+'sp-contributions-uploads' => 'yüklənənlər',
+'sp-contributions-logs' => 'Loqlar',
+'sp-contributions-talk' => 'Müzakirə',
+'sp-contributions-userrights' => 'istifadəçi hüquqları idarəsi',
+'sp-contributions-search' => 'Fəaliyyətləri axtar',
+'sp-contributions-username' => 'IP Ünvanı və ya istifadəçi adı:',
+'sp-contributions-toponly' => 'Yalnız ən son dəyişiklikləri göstər',
+'sp-contributions-submit' => 'Axtar',
# What links here
'whatlinkshere' => 'Bu səhifəyə bağlantılar',
@@ -1617,6 +1886,8 @@ Məqalələrin bərpa edilməsi və silinməsi haqqında son dəyişiklikləri n
'whatlinkshere-page' => 'Səhifə:',
'whatlinkshere-backlink' => '↠$1',
'linkshere' => "'''[[:$1]]''' səhifəsinə istinad edən səhifələr:",
+'nolinkshere' => "'''[[:$1]]''' səhifəsinə keçid verən səhifə yoxdur.",
+'nolinkshere-ns' => "Seçilmiş ad aralığında heç bir səhifə '''[[:$1]]''' səhifəsinə keçid vermir.",
'isredirect' => 'İstiqamətləndirmə səhifəsi',
'istemplate' => 'daxil olmuÅŸ',
'isimage' => 'şəkil üçün keçid',
@@ -1638,6 +1909,15 @@ Məqalələrin bərpa edilməsi və silinməsi haqqında son dəyişiklikləri n
'ipbexpiry' => 'Bitmə müddəti:',
'ipbreason' => 'Səbəb:',
'ipbreasonotherlist' => 'Digər səbəb',
+'ipbreason-dropdown' => '*Bloklama səbəbləri:
+** Yalan məlumatların əlavə edilməsi
+** Səhifənin məzmununun silinməsi
+** Xarici saytlara spam-keçidlər
+** Səhifəyə mənasız və yararsız əlavələrə görə
+** Hədə və təqiblərə görə
+** Təhqirə görə
+** Çoxsaylı hesabdan sui istifadəyə görə
+** Qadağan olunmuş istifadəçi adına görə',
'ipbanononly' => 'Yalnız anonim istifadəçiləri blokla',
'ipbcreateaccount' => 'Hesab açmanı məhdudlaşdır',
'ipbsubmit' => 'Bu istifadəçini blokla',
@@ -1664,6 +1944,8 @@ Bax [[Special:IPBlockList|IP blok siyahısı]] bloklanmış IP-lər.',
'unblocked-id' => '$1-nin bloku götürüldü',
'ipblocklist' => 'Bloklanmış istifadəçilər',
'ipblocklist-legend' => 'Bloklanmış istifadəçini axtar',
+'ipblocklist-username' => 'İstifadəçi adı və ya IP ünvanı:',
+'ipblocklist-sh-addressblocks' => '$1 tək IP blokları',
'ipblocklist-submit' => 'Axtar',
'ipblocklist-localblock' => 'Yerli blok',
'ipblocklist-otherblocks' => 'BaÅŸqa {{PLURAL:$1|bloklama|bloklamalar}}',
@@ -1709,10 +1991,24 @@ $1 artıq bloklanıb.
Bloklama şərtlərini dəyişmək istəyirsiniz?',
'ipb-otherblocks-header' => 'BaÅŸqa {{PLURAL:$1|bloklama|bloklamalar}}',
'ipb_cant_unblock' => 'Xəta: Bloklama IDsi $1 tapılmadı. Bloklamanın götürülməsi mümkündür.',
+'ip_range_invalid' => 'Yanlış IP',
+'blockme' => 'Məni blokla',
'proxyblocker' => 'Proksi bloklayıcı',
+'proxyblocker-disabled' => 'Bu funksiya əngəlləndi.',
'proxyblocksuccess' => 'Oldu.',
'sorbs' => 'DNSBL',
+# Developer tools
+'lockdb' => 'Verilənlər bazasını blokla',
+'unlockdb' => 'Verilənlər bazasından bloku götür',
+'lockconfirm' => 'Bəli, mən həqiqətən verilənlər bazasının bağlamaq istəyirəm.',
+'unlockconfirm' => 'Bəli, mən həqiqətən verilənlər bazasının blokunu açmaq istəyirəm.',
+'lockbtn' => 'Verilənlər bazasını blokla',
+'unlockbtn' => 'Verilənlər bazasından bloku götür',
+'lockdbsuccesssub' => 'Verilənlər bazası bloklanıb',
+'unlockdbsuccesssub' => 'Bloklanma verilənlər bazası silinib',
+'databasenotlocked' => 'Verilənlər bazası bloklanmayıb.',
+
# Move page
'move-page' => 'Dəyişdir $1',
'move-page-legend' => 'Səhifənin adını dəyiş',
@@ -1733,19 +2029,30 @@ Bu yerdÉ™yiÅŸmÉ™ populiyar sÉ™hifÉ™ üçün É™saslı vÉ™ gözlÉ™nilmÉ™z ola bilÉ
Həmin hallarda , ehtiyac yaranarsa siz səhifələri əllə birləşdirmək məcburiyyətində qalacaqsınız",
'movearticle' => 'Səhifənin adını dəyişdir',
'movenologin' => 'SistemdÉ™ deyilsiniz',
+'movenotallowed' => 'Siz səhifələrin adını dəyişə bilməzsiniz.',
+'movenotallowedfile' => 'Siz faylların adını dəyişə bilməzsiniz.',
+'cant-move-user-page' => 'İstifadəçi səhifələrinin adını dəyişə bilməzsiniz (başlıqlardan başqa).',
'newtitle' => 'Yeni başlıq',
'move-watch' => 'Bu səhifəni izlə',
'movepagebtn' => 'Səhifənin adını dəyiş',
'pagemovedsub' => 'Yerdəyişmə edilmişdir',
'movepage-moved' => '\'\'\'"$1" səhifəsi "$2" səhifəsinə yerləşdirilmişdir\'\'\'',
+'movepage-moved-redirect' => 'Yönləndirmə yaradıldı.',
+'movepage-moved-noredirect' => 'Yönləndirmənin yaradılmasının qarşııs alındı.',
'articleexists' => 'Bu adda səhifə artıq mövcuddur və ya sizin seçdiyiniz ad uyğun deyil.
Zəhmət olmasa başqa ad seçin.',
'talkexists' => "'''Səhifənin adı dəyişdi, lakin müzakirə səhifəsi yeni adla olduğu üçün dəyişə bilmir. Zəhmət olmasa, onun adını özünüz dəyişin.'''",
'movedto' => 'dəyişdi',
'movetalk' => 'Bu səhifənin müzakirə səhifəsinin də adını dəyişdir.',
+'move-subpages' => 'Yarımsəhifələri köçür ($1-ə qədər)',
+'move-talk-subpages' => 'Müzakirə səhifələrinin alt səhifələrini köçür ($1-ə qədər)',
+'movepage-page-moved' => '$1 səhifəsi $2 səhifəsinə köçürülüb.',
+'movepage-page-unmoved' => '$1 səhifəsi $2 səhifəsinə köçürülə bilinmir.',
'1movedto2' => '[[$1]] adı dəyişildi. Yeni adı: [[$2]]',
'1movedto2_redir' => '[[$1]] adı və istiqamətləndirmə dəyişildi: [[$2]]',
+'move-redirect-suppressed' => 'yönləndirmənin qarşısı alındı',
'movelogpage' => 'Yerdəyişmə qeydləri',
+'movesubpage' => '{{PLURAL:$1|alt səhifə}}',
'movenosubpage' => 'Bu səhifənin altsəhifəsi yoxdur.',
'movereason' => 'Səbəb:',
'revertmove' => 'ÆvvÉ™lki vÉ™ziyyÉ™tinÉ™',
@@ -1756,8 +2063,12 @@ Zəhmət olmasa başqa ad seçin.',
'delete_and_move_confirm' => 'Bəli, səhifəni sil',
'delete_and_move_reason' => 'Ad dəyişməyə yer açmaq üçün silinmişdir',
'selfmove' => 'Səhifənin hazırkı adı ilə dəyişmək istənilən ad eynidir. Bu əməliyyat yerinə yetirilə bilməz.',
+'immobile-source-namespace' => '"$1" ad aralığında səhifə adları dəyişmir.',
+'immobile-target-namespace' => 'Səhilərin "$1" ad aralığına daşınması qeyri-mümkündür',
'immobile-target-namespace-iw' => 'İntervikilər səhifə adının dəyişməsi üçün əsas ola bilməz.',
'immobile-source-page' => 'Bu səhifənin adı dəyişdirilə bilməz.',
+'immobile-target-page' => 'Bu hədəf başlığına daşınmır.',
+'imageinvalidfilename' => 'Hədəf fayl adı keçərsizdir.',
'protectedpagemovewarning' => "'''Xəbərdarlıq:''' Bu səhifə mühafizə edildiyi üçün onun adını yalnız idarəçilər dəyişə bilərlər.",
# Export
@@ -1771,34 +2082,54 @@ Zəhmət olmasa başqa ad seçin.',
'export-download' => 'Faylı qeyd et',
# Namespace 8 related
-'allmessages' => 'Sistem məlumatları',
-'allmessagesname' => 'Ad',
-'allmessagesdefault' => 'İlkin mətn',
-'allmessagescurrent' => 'İndiki mətn',
-'allmessagestext' => 'Bu MediaWiki-dÉ™ olan sistem mesajlarının siyahısıdır. ÆgÉ™r MediaWiki-ni lokallaÅŸdırmaq iÅŸindÉ™ kömÉ™k etmÉ™k isÉ™yirsinizsÉ™, lütfÉ™n [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] vÉ™ [http://translatewiki.net translatewiki.net]-É™ baÅŸ çəkin.',
-'allmessages-filter-all' => 'Hamısı',
-'allmessages-filter-modified' => 'Dəyişdirilmiş',
-'allmessages-language' => 'Dil:',
-'allmessages-filter-submit' => 'Keç',
+'allmessages' => 'Sistem məlumatları',
+'allmessagesname' => 'Ad',
+'allmessagesdefault' => 'İlkin mətn',
+'allmessagescurrent' => 'İndiki mətn',
+'allmessagestext' => 'Bu MediaWiki-dÉ™ olan sistem mesajlarının siyahısıdır. ÆgÉ™r MediaWiki-ni lokallaÅŸdırmaq iÅŸindÉ™ kömÉ™k etmÉ™k isÉ™yirsinizsÉ™, lütfÉ™n [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] vÉ™ [http://translatewiki.net translatewiki.net]-É™ baÅŸ çəkin.',
+'allmessages-filter-legend' => 'Filtr',
+'allmessages-filter-unmodified' => 'Dəyişdirilməmiş',
+'allmessages-filter-all' => 'Hamısı',
+'allmessages-filter-modified' => 'Dəyişdirilmiş',
+'allmessages-language' => 'Dil:',
+'allmessages-filter-submit' => 'Keç',
# Thumbnails
'thumbnail-more' => 'Böyüt',
+'filemissing' => 'Şəkil gözlənilir',
'djvu_page_error' => 'DjVu səhifəsi əlçatmazdır',
'djvu_no_xml' => 'DjVu üçün XML faylı almaq mümkün deyil.',
'thumbnail_image-missing' => 'Belə görünür ki, $1 faylı yoxdur',
# Special:Import
-'import-interwiki-submit' => 'Ä°dxal',
-'import-upload-filename' => 'Fayl adı:',
-'import-comment' => 'Şərh:',
-'importnotext' => 'Boş və ya mətn yoxdur',
-'import-noarticle' => 'Çıxarılacaq səhifə yoxdur!',
-'import-token-mismatch' => 'Seans məlumatlarının itirilməsi. Lütfən, yenidən cəhd edin.',
-'import-invalid-interwiki' => 'Göstərilən vikidən köçürmək mümkün deyil',
+'import' => 'Səhifələri idxal et',
+'importinterwiki' => 'Vikilərarası çıxarma',
+'import-interwiki-source' => 'Mənbə viki/səhifə:',
+'import-interwiki-history' => 'Səhifənin dəyişmə tarixçələrinin hamısını köçür',
+'import-interwiki-templates' => 'Bütün şablonlarla birlikdə',
+'import-interwiki-submit' => 'Ä°dxal',
+'import-upload-filename' => 'Fayl adı:',
+'import-comment' => 'Şərh:',
+'importstart' => 'Çıxarılacaq səhifələr...',
+'import-revision-count' => '$1 {{PLURAL:$1|revision|dəyişiklik}}',
+'importnopages' => 'Çıxarılacaq səhifə yoxdur.',
+'importfailed' => 'Uğursuz çıxarış: <nowiki>$1</nowiki>',
+'importcantopen' => 'Çıxarılacaq fayl açılmadı',
+'importbadinterwiki' => 'Yanlış interviki keçidi',
+'importnotext' => 'Boş və ya mətn yoxdur',
+'importsuccess' => 'Çıxarma başa çatdı!',
+'import-noarticle' => 'Çıxarılacaq səhifə yoxdur!',
+'xml-error-string' => '$1 $2 sətrində, $3 sütünunda ($4 bayt): $5',
+'import-upload' => 'XML-veriləni yüklə',
+'import-token-mismatch' => 'Seans məlumatlarının itirilməsi. Lütfən, yenidən cəhd edin.',
+'import-invalid-interwiki' => 'Göstərilən vikidən köçürmək mümkün deyil',
# Import log
-'importlogpage' => 'Çıxarılma gündəliyi',
-'importlogpagetext' => 'Səhifələrin idarəçilər tərəfindən digər vikilərdən dəyişiklik tarixçəsi ilə birlikdə köçürülməsi',
+'importlogpage' => 'Çıxarılma gündəliyi',
+'importlogpagetext' => 'Səhifələrin idarəçilər tərəfindən digər vikilərdən dəyişiklik tarixçəsi ilə birlikdə köçürülməsi',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revision|dəyişiklik}}',
+'import-logentry-interwiki' => 'vikilərarası idxal $1',
+'import-logentry-interwiki-detail' => '$2-dən $1 {{PLURAL:$1|dəyişiklik|dəyişikliklər}}',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'İstifadəçi səhifəniz',
@@ -1864,6 +2195,31 @@ Zəhmət olmasa başqa ad seçin.',
'tooltip-upload' => 'Yükləməni başlat',
'tooltip-rollback' => 'Sonuncu istifadəçi tərəfindən edilmiş bütün dəyişiklikləri bir dəfəyə geri qaytar',
'tooltip-undo' => 'Edilmiş dəyişikliyi geri qaytar və geri qaytarma səbəbini qeyd etmək üçün sınaq göstərişini aç',
+'tooltip-preferences-save' => 'Nizamlamaları saxla',
+
+# Stylesheets
+'common.css' => '/* Burada yerləşən CSS bütün skinlərə tətbiq olunur */',
+'standard.css' => '/* Burada yerləşən CSS Standard skin istifadəçilərinə tətbiq olunur */',
+'nostalgia.css' => '/* Burada yerləşən CSS Nostalgia skin istifadəçilərinə tətbiq olunur */',
+'cologneblue.css' => '/* Burada yerləşən CSS Cologne Blue skin istifadəçilərinə tətbiq olunur */',
+'monobook.css' => '/* Burada yerləşən CSS Monobook skin istifadəçilərinə tətbiq olunur */',
+'myskin.css' => '/* Burada yerləşən CSS MySkin skin istifadəçilərinə tətbiq olunur */',
+'chick.css' => '/* Burada yerləşən CSS Chick skin istifadəçilərinə tətbiq olunur */',
+'simple.css' => '/* Burada yerləşən CSS Simple skin istifadəçilərinə tətbiq olunur */',
+'modern.css' => '/* Burada yerləşən CSS Modern skin istifadəçilərinə tətbiq olunur */',
+'vector.css' => '/* Burada yerləşən CSS Vector istifadəçilərinə tətbiq olunur */',
+
+# Scripts
+'common.js' => '/* Burada istifadəçilərin hamısı üçün bütün səhifələrdə istənilən JavaScript yüklənəcək */',
+'standard.js' => '/* Burada Standard skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'nostalgia.js' => '/* Burada Nostalgia skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'cologneblue.js' => '/* Burada Cologne Blue skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'monobook.js' => '/* Burada MonoBook skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'myskin.js' => '/* Burada MySkin skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'chick.js' => '/* Burada Chick skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'simple.js' => '/* Burada Simple skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'modern.js' => '/* Burada Modern skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
+'vector.js' => '/* Burada Vector skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
# Metadata
'nodublincore' => 'Bu server üçün Dublin Core RDF metaməlumatları qadağandır.',
@@ -1871,24 +2227,35 @@ Zəhmət olmasa başqa ad seçin.',
'notacceptable' => 'Viki-server məlumatları brauzerinizin oxuya biləcəyi formatda təqdim edə bilmir.',
# Attribution
-'anonymous' => '{{SITENAME}} saytının anonim {{PLURAL:$1|istifadəçisi|istifadəçiləri}}',
-'siteuser' => '{{SITENAME}} istifadəçisi $1',
-'anonuser' => '{{SITENAME}} anonim istifadəçisi $1',
-'others' => 'digərləri',
-'creditspage' => 'Səhifə kreditleri',
+'anonymous' => '{{SITENAME}} saytının anonim {{PLURAL:$1|istifadəçisi|istifadəçiləri}}',
+'siteuser' => '{{SITENAME}} istifadəçisi $1',
+'anonuser' => '{{SITENAME}} anonim istifadəçisi $1',
+'othercontribs' => '$1-in işinə əsaslanıb.',
+'others' => 'digərləri',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|user|istifadəçi}} $1',
+'anonusers' => '{{SITENAME}} anonim {{PLURAL:$2|user|istifadəçi}} $1',
+'creditspage' => 'Səhifə kreditleri',
# Spam protection
'spamprotectiontitle' => 'Spam qoruma süzgəci',
+'spambot_username' => 'MediaViki spam təmizləməsi',
# Info page
'infosubtitle' => 'Səhifə üçün məlumat',
+'numedits' => 'Redaktələrin sayı (səhifə): $1',
+'numtalkedits' => 'Redaktələrin sayı (müzakirə səhifəsi): $1',
+'numwatchers' => 'Baxış sayı: $1',
# Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgia',
-'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-modern' => 'Müasir',
+'skinname-standard' => 'Classic',
+'skinname-nostalgia' => 'Nostalgia',
+'skinname-cologneblue' => 'Cologne Blue',
+'skinname-monobook' => 'MonoBook',
+'skinname-myskin' => 'MySkin',
+'skinname-chick' => 'Chick',
+'skinname-simple' => 'Simple',
+'skinname-modern' => 'Modern',
+'skinname-vector' => 'Vector',
# Math options
'mw_math_png' => 'Həmişə PNG formatında göstər',
@@ -1904,13 +2271,18 @@ Zəhmət olmasa başqa ad seçin.',
'math_syntax_error' => 'sintaksis xətası',
# Patrolling
-'markaspatrolleddiff' => 'Yoxlannıldı',
-'markedaspatrolled' => 'Yoxlannıldı',
+'markaspatrolleddiff' => 'Yoxlannıldı',
+'markaspatrolledtext' => 'Səhifəni patrullanmış kimi işarələ',
+'markedaspatrolled' => 'Yoxlannıldı',
+'rcpatroldisabled' => 'Son dəyişikliklərin patrullanması qadağandır',
+'markedaspatrollederror' => 'Yoxlanmadı',
# Patrol log
-'patrol-log-page' => 'Patrul gündəliyi',
-'patrol-log-auto' => '(avtomatik)',
-'patrol-log-diff' => 'təftiş $1',
+'patrol-log-page' => 'Patrul gündəliyi',
+'patrol-log-header' => 'Bu yoxlanmış dəyişikliklərin gündəliyidir.',
+'patrol-log-auto' => '(avtomatik)',
+'patrol-log-diff' => 'təftiş $1',
+'log-show-hide-patrol' => '$1 patrul gündəliyi',
# Image deletion
'deletedrevision' => 'Köhnə versiyaları silindi $1.',
@@ -1929,13 +2301,18 @@ $1',
# Media information
'imagemaxsize' => "Şəkilin maksimal tutumu:<br />''(faylın təsviri səhifələri üçün)''",
'thumbsize' => 'Kiçik ölçü:',
+'widthheight' => '$1×$2',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|səhifə|səhifələr}}',
-'file-info-size' => '($1 × $2 piksel, fayl həcmi: $3, MIME növü: $4)',
+'file-info' => 'faylın ölçüsü: $1, MIME tipi: $2',
+'file-info-size' => '$1 × $2 piksel, fayl həcmi: $3, MIME növü: $4',
'file-nohires' => '<small>Daha dəqiq versiyası yoxdur.</small>',
-'svg-long-desc' => '(SVG fayl, nominal olaraq $1 × $2 piksel, faylın ölçüsü: $3)',
+'svg-long-desc' => 'SVG fayl, nominal olaraq $1 × $2 piksel, faylın ölçüsü: $3',
'show-big-image' => 'Daha yüksək keyfiyyətli şəkil',
'show-big-image-thumb' => '<small>Sınaq göstərişi ölçüsü: $1 × $2 piksel</small>',
'file-info-gif-looped' => 'ilmələnib',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|çərçivə}}',
+'file-info-png-looped' => 'ilmələnib',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|çərçivə}}',
# Special:NewFiles
'newimages' => 'Yeni faylların siyahısı',
@@ -1947,8 +2324,10 @@ $1',
'bydate' => 'tarixə görə',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 's',
-'hours-abbrev' => 'h',
+'video-dims' => '$1, $2×$3',
+'seconds-abbrev' => 'san',
+'minutes-abbrev' => 'd',
+'hours-abbrev' => 'saat',
# Bad image list
'bad_image_list' => 'Format bu şəkildə olmalıdır:
@@ -1991,64 +2370,153 @@ Variants for Chinese language
'metadata-collapse' => 'Ætraflı mÉ™lumatları gizlÉ™',
# EXIF tags
-'exif-imagewidth' => 'GeniÅŸlik',
-'exif-imagelength' => 'Hündürlük',
-'exif-artist' => 'Müəllif',
-'exif-usercomment' => 'İstifadəçi şərhi',
-'exif-exposuretime-format' => '$1 saniyÉ™ ($2)',
-'exif-fnumber' => 'F nömrəsi',
-'exif-aperturevalue' => 'Obyektiv gözü',
-'exif-brightnessvalue' => 'Parlaqlıq',
-'exif-lightsource' => 'İşıq mənbəsi',
-'exif-flash' => 'FlaÅŸ',
-'exif-subjectarea' => 'Subyekt sahəsi',
-'exif-subjectlocation' => 'Subyekt yeri',
-'exif-filesource' => 'Fayl mənbəsi',
-'exif-contrast' => 'Kontrast',
-'exif-gpslatituderef' => 'Şimal və ya cənub en dairəsi',
-'exif-gpslatitude' => 'En dairəsi',
-'exif-gpslongituderef' => 'Şəq və ya qərb uzunluq dairəsi',
-'exif-gpslongitude' => 'Uzunluq dairəsi',
-'exif-gpsaltitude' => 'Yüksəklik',
-'exif-gpsstatus' => 'Statusu qəbul edən',
-'exif-gpsmeasuremode' => 'Ölçmə üsulu',
-'exif-gpsdestlatitude' => 'En dairəsinin təyin olunması',
-'exif-gpsdestlongitude' => 'Uzunluq dairəsinin təyin olunması',
-'exif-gpsdatestamp' => 'Zaman',
+'exif-imagewidth' => 'GeniÅŸlik',
+'exif-imagelength' => 'Hündürlük',
+'exif-compression' => 'Sıxılmamış',
+'exif-orientation' => 'Orientasiya',
+'exif-samplesperpixel' => 'Rəng komponentlərinin sayı',
+'exif-ycbcrpositioning' => 'Y və C komponetlərinə görə yerləşmə sırası',
+'exif-xresolution' => 'Üfiqi xətt',
+'exif-yresolution' => 'Şaquli xətt',
+'exif-rowsperstrip' => 'Hər blokdakı sətirlərin sayı',
+'exif-jpeginterchangeformatlength' => 'JPEG məlumat bazasının baytları',
+'exif-transferfunction' => 'Transfer funksiyası',
+'exif-datetime' => 'Faylın dəyişməsi tarixi və vaxtı',
+'exif-imagedescription' => 'Şəkil başlığı',
+'exif-make' => 'Kamera istehsalçısı',
+'exif-model' => 'Kamera modeli',
+'exif-software' => 'Proqram təminatı',
+'exif-artist' => 'Müəllif',
+'exif-copyright' => 'Sahibinin müəlliflik hüququ',
+'exif-exifversion' => 'Exif versiyası',
+'exif-colorspace' => 'Rəng sahəsi',
+'exif-pixelydimension' => 'Şəkilin eni',
+'exif-pixelxdimension' => 'Şəkilin hündürlüyü',
+'exif-usercomment' => 'İstifadəçi şərhi',
+'exif-exposuretime-format' => '$1 saniyÉ™ ($2)',
+'exif-fnumber' => 'F nömrəsi',
+'exif-exposureprogram' => 'Ekspozisiya proqramı',
+'exif-spectralsensitivity' => 'Spektral həssaslıq',
+'exif-isospeedratings' => 'ISO sürət reytinqi',
+'exif-aperturevalue' => 'Obyektiv gözü',
+'exif-brightnessvalue' => 'Parlaqlıq',
+'exif-subjectdistance' => 'Obyektə qədər məsafə',
+'exif-lightsource' => 'İşıq mənbəsi',
+'exif-flash' => 'FlaÅŸ',
+'exif-focallength' => 'Fokus məsafəsi',
+'exif-subjectarea' => 'Subyekt sahəsi',
+'exif-flashenergy' => 'FlaÅŸ enerjisi',
+'exif-subjectlocation' => 'Subyekt yeri',
+'exif-filesource' => 'Fayl mənbəsi',
+'exif-scenetype' => 'Səhnə tipi',
+'exif-whitebalance' => 'Ağ balansı',
+'exif-gaincontrol' => 'Səhnə idarəsi',
+'exif-contrast' => 'Kontrast',
+'exif-saturation' => 'DoymuÅŸluq',
+'exif-sharpness' => 'Kəskinlik',
+'exif-gpsversionid' => 'GPS etiket versiyası',
+'exif-gpslatituderef' => 'Şimal və ya cənub en dairəsi',
+'exif-gpslatitude' => 'En dairəsi',
+'exif-gpslongituderef' => 'Şəq və ya qərb uzunluq dairəsi',
+'exif-gpslongitude' => 'Uzunluq dairəsi',
+'exif-gpsaltitude' => 'Yüksəklik',
+'exif-gpstimestamp' => 'GPS vaxtı (atom saatı)',
+'exif-gpsstatus' => 'Statusu qəbul edən',
+'exif-gpsmeasuremode' => 'Ölçmə üsulu',
+'exif-gpsdop' => 'Ölçünün dəqiqliyi',
+'exif-gpsspeedref' => 'Sürət uniti',
+'exif-gpsspeed' => 'GPS qəbuledicinin sürəti',
+'exif-gpstrack' => 'İdarəetmə mexanizmi',
+'exif-gpsimgdirection' => 'Şəklin istiqaməti',
+'exif-gpsdestlatitude' => 'En dairəsinin təyin olunması',
+'exif-gpsdestlongitude' => 'Uzunluq dairəsinin təyin olunması',
+'exif-gpsdestbearing' => 'Obyektin pelenqi',
+'exif-gpsdestdistance' => 'Məsafə',
+'exif-gpsprocessingmethod' => 'GPS prosesinin adı',
+'exif-gpsareainformation' => 'GPS sahənin adı',
+'exif-gpsdatestamp' => 'Zaman',
+'exif-gpsdifferential' => 'GPS diferensial korreksiya',
+'exif-objectname' => 'Qısa başlıq',
+
+# EXIF attributes
+'exif-compression-1' => 'Sıxılmış',
'exif-unknowndate' => 'Naməlum tarix',
'exif-orientation-1' => 'Normal',
+'exif-orientation-2' => 'Üfüqi çevrilib',
'exif-orientation-3' => '180° döndərilib',
+'exif-orientation-4' => 'Şaquli çevrilib',
+'exif-orientation-5' => 'Saat əqrəbinin əksi istiqamətində 90° döndərilib və şaquli çevrilib',
'exif-orientation-6' => 'Saat əqrəbi istiqamətində 90° döndərilib',
+'exif-orientation-7' => 'Saat əqrəbi istiqamətində 90° döndərilib və şaquli çevrilib',
'exif-orientation-8' => 'Saat əqrəbinin əksi istiqamətində 90° döndərilib',
+'exif-planarconfiguration-1' => 'chunky format',
+'exif-planarconfiguration-2' => 'planar format',
+
'exif-componentsconfiguration-0' => 'mövcud deyil',
+'exif-exposureprogram-0' => 'Tanınmadı',
'exif-exposureprogram-1' => 'Æl ilÉ™',
'exif-exposureprogram-2' => 'Normal proqram',
+'exif-exposureprogram-3' => 'Açıqlıq üstünlüyü',
+
+'exif-subjectdistance-value' => '$1 metr',
'exif-meteringmode-0' => 'Naməlum',
'exif-meteringmode-1' => 'Orta',
'exif-meteringmode-3' => 'Nöqtəli',
+'exif-meteringmode-4' => 'Multi-Spot',
'exif-meteringmode-5' => 'Dizaynlı',
+'exif-meteringmode-6' => 'Qismi',
'exif-meteringmode-255' => 'Digər',
-'exif-lightsource-0' => 'Naməlum',
-'exif-lightsource-1' => 'Sübh',
-'exif-lightsource-4' => 'FlaÅŸ',
-'exif-lightsource-9' => 'Gözəl hava',
-'exif-lightsource-10' => 'Buludlu hava',
-'exif-lightsource-11' => 'Kölgə',
-'exif-lightsource-17' => 'A tipi standart işıq',
-'exif-lightsource-18' => 'B tipi standart işıq',
-'exif-lightsource-19' => 'C tipi standart işıq',
+'exif-lightsource-0' => 'Naməlum',
+'exif-lightsource-1' => 'Sübh',
+'exif-lightsource-2' => 'Flüorosensiya',
+'exif-lightsource-4' => 'FlaÅŸ',
+'exif-lightsource-9' => 'Gözəl hava',
+'exif-lightsource-10' => 'Buludlu hava',
+'exif-lightsource-11' => 'Kölgə',
+'exif-lightsource-12' => 'D tipli gündüz işığı lampası (5700 − 7100K)',
+'exif-lightsource-13' => 'N tipli gündüz işığı lampası (4600 – 5400K)',
+'exif-lightsource-14' => 'W tipli gündüz işığı lampası (3900 – 4500K)',
+'exif-lightsource-15' => 'WW tipli gündüz işığı lampası (3200 – 3700K)',
+'exif-lightsource-17' => 'A tipi standart işıq',
+'exif-lightsource-18' => 'B tipi standart işıq',
+'exif-lightsource-19' => 'C tipi standart işıq',
+'exif-lightsource-24' => 'ISO studiya lampası',
+'exif-lightsource-255' => 'Digər işıq mənbəyi',
+
+# Flash modes
+'exif-flash-fired-0' => 'Flaş yandırılmadı',
+'exif-flash-fired-1' => 'Flaş yandırıldı',
+'exif-flash-mode-3' => 'avtomatik rejim',
'exif-focalplaneresolutionunit-2' => 'düymlər',
+'exif-sensingmethod-1' => 'Tanınmadı',
+'exif-sensingmethod-2' => 'Birkristallı matrisli rəngli sensor',
+'exif-sensingmethod-3' => 'İkikristallı matrisli rəngli sensor',
+'exif-sensingmethod-4' => 'Üçkristallı matrisli rəngli sensor',
+'exif-sensingmethod-5' => 'Rəngin ardıcıl ölçülməsilə birlikdə matrisli sensor',
+'exif-sensingmethod-7' => 'Üçrəngli xətti sensor',
+'exif-sensingmethod-8' => 'Rəngin ardıcıl ölçülməsilə birlikdə xətti sensor',
+
'exif-filesource-3' => 'Rəqəmsal fotoapparat',
+'exif-scenetype-1' => 'Foto-təsvir birbaşa çəkilmişdir',
+
'exif-customrendered-0' => 'Normal proses',
+'exif-customrendered-1' => 'Xüsusi proses',
+
+'exif-exposuremode-0' => 'Avtomatik ekspozisiya',
+'exif-exposuremode-1' => 'Æl ekspozisiyası',
+'exif-exposuremode-2' => 'Avtomatik breketinq',
+
+'exif-whitebalance-0' => 'Bəyaz balansın avtomatik tənzimlənməsi',
+'exif-whitebalance-1' => 'Bəyaz balansın əllə tənzimlənməsi',
'exif-scenecapturetype-0' => 'Standart',
'exif-scenecapturetype-1' => 'Mənzərə',
@@ -2056,12 +2524,18 @@ Variants for Chinese language
'exif-scenecapturetype-3' => 'Gecə görünüşü',
'exif-gaincontrol-0' => 'Heç biri',
+'exif-gaincontrol-1' => 'Bir az artırma',
+'exif-gaincontrol-2' => 'Kəskin artırma',
+'exif-gaincontrol-3' => ' Bir az azaltma',
+'exif-gaincontrol-4' => 'Kəskin azaltma',
'exif-contrast-0' => 'Normal',
'exif-contrast-1' => 'YumÅŸaq',
'exif-contrast-2' => 'Ağır',
'exif-saturation-0' => 'Normal',
+'exif-saturation-1' => 'Aşağı doyma dərəcəsi',
+'exif-saturation-2' => 'Yuxarı doyma dərəcəsi',
'exif-sharpness-0' => 'Normal',
'exif-sharpness-1' => 'YumÅŸaq',
@@ -2070,12 +2544,31 @@ Variants for Chinese language
'exif-subjectdistancerange-0' => 'Naməlum',
'exif-subjectdistancerange-1' => 'Makro',
'exif-subjectdistancerange-2' => 'Bağlı görünüş',
+'exif-subjectdistancerange-3' => 'Uzaq məsafədən çəkiliş',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Şimal en dairəsi',
+'exif-gpslatitude-s' => 'Cənub en dairəsi',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Qərb uzunluq dairəsi',
+'exif-gpslongitude-w' => 'Şərq uzunluq dairəsi',
+
+'exif-gpsstatus-a' => 'Ölçmə yekunlaşmayıb',
+'exif-gpsstatus-v' => 'Verilənləri ötürmək üçün hazırdır',
+
+'exif-gpsmeasuremode-2' => '2-ölçülü koordinat',
+'exif-gpsmeasuremode-3' => '3-ölçülü koordinat',
# Pseudotags used for GPSSpeedRef
'exif-gpsspeed-k' => 'km/saat',
'exif-gpsspeed-m' => 'Saatda mil',
'exif-gpsspeed-n' => 'Dəniz mili',
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Doğru istiqamət',
+'exif-gpsdirection-m' => 'Maqnit istiqaməti',
+
# External editor support
'edit-externally' => 'Bu faylı kənar proqram vasitəsilə redaktə et.',
'edit-externally-help' => '(Daha ətraflı məlumat üçün [http://www.mediawiki.org/wiki/Manual:External_editors tətbiqetmə qaydalarına] baxa bilərsiniz)',
@@ -2089,17 +2582,25 @@ Variants for Chinese language
'limitall' => 'bütün',
# E-mail address confirmation
-'confirmemail' => 'E-məktubunu təsdiq et',
-'confirmemail_send' => 'Təsdiq kodu göndər',
-'confirmemail_sent' => 'Təsdiq e-məktubu göndərildi.',
-'confirmemail_invalid' => 'Səhv təsdiqləmə kodu. Kodun vaxtı keçmiş ola bilər.',
-'confirmemail_needlogin' => 'E-məktub ünvanınızın təsdiqlənməsi üçün $1 lazımdır.',
-'confirmemail_success' => 'E-poçt ünvanınız indi təsdiq edildi. Siz indi [[Special:UserLogin|hesab açaraq]] vikidən həzz ala bilərsiz.',
-'confirmemail_loggedin' => 'E-məktubunuz indi təsdiq edildi.',
-'confirmemail_subject' => '{{SITENAME}} e-məktub təsdiq etmə',
+'confirmemail' => 'E-məktubunu təsdiq et',
+'confirmemail_send' => 'Təsdiq kodu göndər',
+'confirmemail_sent' => 'Təsdiq e-məktubu göndərildi.',
+'confirmemail_invalid' => 'Səhv təsdiqləmə kodu. Kodun vaxtı keçmiş ola bilər.',
+'confirmemail_needlogin' => 'E-məktub ünvanınızın təsdiqlənməsi üçün $1 lazımdır.',
+'confirmemail_success' => 'E-poçt ünvanınız indi təsdiq edildi. Siz indi [[Special:UserLogin|hesab açaraq]] vikidən həzz ala bilərsiz.',
+'confirmemail_loggedin' => 'E-məktubunuz indi təsdiq edildi.',
+'confirmemail_subject' => '{{SITENAME}} e-məktub təsdiq etmə',
+'confirmemail_invalidated' => 'E-mail təsdiqlənməsi dayandırıldı',
+'invalidateemail' => 'E-mail təsdiqlənməsindən imtina',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[«Interwiki transcluding»dən çıxılmışdır]',
+'scarytranscludetoolong' => '[URL uzundur]',
# Trackbacks
-'trackbackremove' => '([$1 Sil])',
+'trackbackremove' => '([$1 Sil])',
+'trackbacklink' => 'Trackback',
+'trackbackdeleteok' => 'Geri izləmə uğurla silindi.',
# Delete conflict
'deletedwhileediting' => "'''Diqqət!''' Bu səhifə siz redaktə etməyə başladıqdan sonra silinmişdir!",
@@ -2123,6 +2624,7 @@ Variants for Chinese language
'table_pager_first' => 'İlk səhifə',
'table_pager_last' => 'Son səhifə',
'table_pager_limit' => 'Səhifədə $1 mövqe sərgilə',
+'table_pager_limit_label' => 'Səhifədəki mövqelər:',
'table_pager_limit_submit' => 'Seç',
'table_pager_empty' => 'Nəticə yoxdur',
@@ -2140,30 +2642,48 @@ Variants for Chinese language
'watchlistedit-normal-title' => 'İzlədiyim səhifələri redaktə et',
'watchlistedit-normal-legend' => 'İzləmə siyahısından başlıqların silinməsi',
'watchlistedit-normal-submit' => 'Başlığın silinməsi',
+'watchlistedit-normal-done' => '{{PLURAL:$1|$1 səhifə}} izləmə səhifələrinizdən silindi:',
+'watchlistedit-raw-title' => 'Mətn kimi redaktə et',
+'watchlistedit-raw-legend' => 'Mətn kimi redaktə et',
'watchlistedit-raw-titles' => 'Başlıqlar:',
'watchlistedit-raw-submit' => 'İzlədiyim səhifələrin siyahısının yenilənməsi',
+'watchlistedit-raw-done' => 'İzləmə səhifələriniz qeyd olundu.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 title was|$1 başlıq}} əlavə edildi:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title was|$1 başlıq}} çıxarıldı:',
# Watchlist editing tools
'watchlisttools-view' => 'Siyahıdakı səhifələrdə edilən dəyişikliklər',
'watchlisttools-edit' => 'İzlədiyim səhifələri göstər və redaktə et',
'watchlisttools-raw' => 'Mətn kimi redaktə et',
+# Core parser functions
+'unknown_extension_tag' => '"$1" Naməlum ayırma teqi',
+
# Special:Version
-'version' => 'Versiya',
-'version-specialpages' => 'Xüsusi səhifələr',
-'version-variables' => 'Dəyişkənlər',
-'version-other' => 'Digər',
-'version-version' => '(Versiya $1)',
-'version-license' => 'Lisenziya',
-'version-software-product' => 'Məhsul',
-'version-software-version' => 'Versiya',
+'version' => 'Versiya',
+'version-extensions' => 'NIzamlanmış genişlənmələr',
+'version-specialpages' => 'Xüsusi səhifələr',
+'version-variables' => 'Dəyişkənlər',
+'version-skins' => 'Üzlük',
+'version-other' => 'Digər',
+'version-hooks' => 'Çəngəllər',
+'version-extension-functions' => 'ÆlavÉ™ fubksiyalar',
+'version-hook-name' => 'Çəngəlin adı',
+'version-version' => '(Versiya $1)',
+'version-license' => 'Lisenziya',
+'version-poweredby-credits' => "Bu wiki '''[http://www.mediawiki.org/ MediaWiki]''' proqramı istifadə edilərək yaradılmışdır, müəlliflik © 2001-$1 $2.",
+'version-poweredby-others' => 'digərləri',
+'version-software-product' => 'Məhsul',
+'version-software-version' => 'Versiya',
# Special:FilePath
-'filepath' => 'Fayl yolu',
-'filepath-page' => 'Fayl:',
+'filepath' => 'Fayl yolu',
+'filepath-page' => 'Fayl:',
+'filepath-submit' => 'Get',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dublikat fayl axtarışı',
+'fileduplicatesearch-legend' => 'Dublikatı axtar',
'fileduplicatesearch-filename' => 'Fayl adı:',
'fileduplicatesearch-submit' => 'Axtar',
@@ -2180,14 +2700,49 @@ Variants for Chinese language
'specialpages-group-pagetools' => 'Səhifə alətləri',
'specialpages-group-wiki' => 'Viki məlumatları və alətləri',
'specialpages-group-redirects' => 'Xüsusi istiqamətləndirmə səhifələri',
+'specialpages-group-spam' => 'Spam alətləri',
+
+# Special:BlankPage
+'blankpage' => 'Boş səhifə',
+'intentionallyblankpage' => 'Bu səhifə xüsusilə boşdur.',
# Special:Tags
-'tag-filter-submit' => 'Filtrlər',
-'tags-edit' => 'redaktÉ™',
+'tag-filter' => '[[Special:Tags|Etiket]] süzgəci:',
+'tag-filter-submit' => 'Filtrlər',
+'tags-title' => 'Etiketlər',
+'tags-tag' => 'Etiket adı',
+'tags-description-header' => 'Anlamının tam açıqlaması',
+'tags-hitcount-header' => 'Etiketli dəyişikliklər',
+'tags-edit' => 'redaktÉ™',
+'tags-hitcount' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
+
+# Special:ComparePages
+'comparepages' => 'Səhifələri qarşılaşdır',
+'compare-selector' => 'Səhifə redaktələrini qarşılaşdır',
+'compare-page1' => 'Səhifə 1',
+'compare-page2' => 'Səhifə 2',
+'compare-rev1' => 'Dəyişiklik 1',
+'compare-rev2' => 'Dəyişiklik 2',
+'compare-submit' => 'Qarşılaşdır',
+
+# Database error messages
+'dberr-header' => 'Bu vikidÉ™ problem var',
+'dberr-info' => '($1: Məlumat bazası ilə əlaqə yoxdur)',
# HTML forms
+'htmlform-invalid-input' => 'Girişinizin bir qismilə əlaqədəar problemlər var',
+'htmlform-select-badoption' => 'İşarə etdiyiniz xüsus keçərli deyil.',
+'htmlform-int-invalid' => 'Göstərdiyiniz ifadə tam ədəd deyil.',
+'htmlform-float-invalid' => 'Göstərdiyiniz ifadə ədəd deyil.',
+'htmlform-int-toolow' => 'Göstərdiyiniz $1 ifadəsi minimaldan aşağıdır.',
+'htmlform-int-toohigh' => 'Göstərdiyiniz $1 ifadəsi maksimumdan yuxarıdır.',
+'htmlform-required' => 'Bu digər gərəklidir',
'htmlform-submit' => 'Yolla',
'htmlform-reset' => 'Dəyişiklikləri geri qaytar',
'htmlform-selectorother-other' => 'Digər',
+# SQLite database support
+'sqlite-has-fts' => '$1 tam mətn axtarma ilə',
+'sqlite-no-fts' => '$1 tam mətn axtarma olmadan',
+
);
diff --git a/languages/messages/MessagesBa.php b/languages/messages/MessagesBa.php
index 687a0c59..9f22d207 100644
--- a/languages/messages/MessagesBa.php
+++ b/languages/messages/MessagesBa.php
@@ -11,6 +11,7 @@
* @author Comp1089
* @author Haqmar
* @author Reedy
+ * @author Roustammr
* @author Timming
* @author РуÑтам Ðурыев
*/
@@ -54,8 +55,7 @@ $messages = array(
'tog-editsection' => 'Һәр бүлек Ó©Ñөн «үҙгәртеү» һылтанмаһын күрһәтергә',
'tog-editsectiononrightclick' => 'Бүлектәрҙе иÑемдәренә ÑÑ‹Ñҡан менән Ñиртеп үҙгәртергә (JavaScript кәрәкле)',
'tog-showtoc' => 'ЭÑтәлек күрһәтелһен (3-тән күп башлығы булған биттәрҙә)',
-'tog-rememberpassword' => 'Был компьютерҙа иҫәп Ñҙыуым хәтерленһен',
-'tog-editwidth' => 'Мөхәррирләү тәҙрәһен Ñкрандың тулы киңлегендә',
+'tog-rememberpassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп Ñҙыуым хәтерләнһен',
'tog-watchcreations' => 'Мин төҙөгән биттәрҙе күҙәтеү иÑемлегенә Ñҙырға',
'tog-watchdefault' => 'Үҙгәрткән биттәрем күҙәтеү иÑемлегемә өҫтәлһен',
'tog-watchmoves' => 'ИÑемен үҙгәрткән биттәрем күҙәтеү иÑемлегемә өҫтәлһен',
@@ -113,42 +113,42 @@ $messages = array(
'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' => 'Декабрь (Ðҡъюлай)',
+'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' => 'декабрь (аҡъюлай)',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориÑ}}',
@@ -199,31 +199,21 @@ $messages = array(
'faqpage' => 'Project:ЙБҺ',
# Vector skin
-'vector-action-addsection' => 'Тема өҫтәргә',
-'vector-action-delete' => 'Юйырға',
-'vector-action-move' => 'ИÑемен үҙгәртергә',
-'vector-action-protect' => 'Һаҡларға',
-'vector-action-undelete' => 'Тергеҙергә',
-'vector-action-unprotect' => 'Һаҡлауҙы ÑиÑергә',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Ярҙам бите',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Бит',
-'vector-namespace-media' => 'Медиа-бит',
-'vector-namespace-mediawiki' => 'Хәбәр',
-'vector-namespace-project' => 'Проект бите',
-'vector-namespace-special' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚',
-'vector-namespace-talk' => 'Фекер алышыу',
-'vector-namespace-template' => 'Ҡалып',
-'vector-namespace-user' => 'ҠулланыуÑÑ‹ бите',
-'vector-view-create' => 'Яһау',
-'vector-view-edit' => 'Үҙгәртергә',
-'vector-view-history' => 'Тарихты ҡарау',
-'vector-view-view' => 'Уҡыу',
-'vector-view-viewsource' => 'Сығанаҡты ҡарарға',
-'actions' => 'Хәрәкәт',
-'namespaces' => 'ИÑем арауыҡтары',
-'variants' => 'Варианттар',
+'vector-action-addsection' => 'Тема өҫтәргә',
+'vector-action-delete' => 'Юйырға',
+'vector-action-move' => 'ИÑемен үҙгәртергә',
+'vector-action-protect' => 'Һаҡларға',
+'vector-action-undelete' => 'Тергеҙергә',
+'vector-action-unprotect' => 'Һаҡлауҙы ÑиÑергә',
+'vector-simplesearch-preference' => 'Киңәйтелгән Ñҙләү тәҡдимдәрен ҡулланырға ("Векторлы" күренеш Ó©Ñөн генә)',
+'vector-view-create' => 'Яһау',
+'vector-view-edit' => 'Үҙгәртергә',
+'vector-view-history' => 'Тарихты ҡарау',
+'vector-view-view' => 'Уҡыу',
+'vector-view-viewsource' => 'Сығанаҡты ҡарарға',
+'actions' => 'Хәрәкәт',
+'namespaces' => 'ИÑем арауыҡтары',
+'variants' => 'Варианттар',
'errorpagetitle' => 'Хата',
'returnto' => '$1 битенә ҡайтыу.',
@@ -284,6 +274,9 @@ $messages = array(
Зинһар был биткә һуңырак кереп ҡарағыҙ.
$1',
+'pool-timeout' => 'Блоклауҙы көтөү ваҡыты үтте',
+'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' => '{{grammar:genitive|{{SITENAME}}}} тураһында',
@@ -450,7 +443,8 @@ $2',
'yourname' => 'ҠатнашыуÑÑ‹ иÑеме',
'yourpassword' => 'Һеҙҙең пароль',
'yourpasswordagain' => 'Паролде ҡабаттан Ñҙыу',
-'remembermypassword' => 'Паролде хәтерҙә ҡалдырырға',
+'remembermypassword' => 'Был компьютерҙа паролемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
'yourdomainname' => 'Һеҙҙең домен',
'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы Ò¯Ò™ көйләүҙәрегеҙҙе үҙгәртер Ó©Ñөн хоҡуҡтарығыҙ етәрле түгел.',
'login' => 'Танышыу йәки теркәлеү',
@@ -467,6 +461,7 @@ $2',
'gotaccount' => "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
'gotaccountlink' => 'Үҙегеҙ менән таныштырығыҙ',
'createaccountmail' => 'Ñл. почта буйынÑа',
+'createaccountreason' => 'Сәбәп:',
'badretype' => 'Һеҙ кереткән паролдәр тап килмәйҙәр.',
'userexists' => 'Керетелгән иÑем ҡулланыла.
Зинһар, башҡа иÑем һайлағыҙ.',
@@ -487,6 +482,7 @@ $2',
'wrongpasswordempty' => 'Зинһар, буш булмаған пароль керетегеҙ.',
'passwordtooshort' => 'Пароль кәмендә $1 {{PLURAL:$1|Ñимволдан}} торорға тейеш.',
'password-name-match' => 'Керетелгән пароль ҡулланыуÑÑ‹ иÑеменән айырылырға тейеш.',
+'password-login-forbidden' => 'Был ҡатнашыуÑÑ‹ иÑемен һәм паролде ҡулланыу тыйылған',
'mailmypassword' => 'Яңы пароль ебәрергә',
'passwordremindertitle' => '{{SITENAME}} Ó©Ñөн Ñңы ваҡытлыÑа пароль',
'passwordremindertext' => 'Кемдер (бәлки, һеҙ, IP-адреÑÑ‹: $1) {{SITENAME}} ($4) Ó©Ñөн Ñңы пароль һоратты. $2 ҡатнашыуÑыһы Ó©Ñөн ваҡытлыÑа Ñңы пароль Ñһалды: $3. Әгәр был һеҙ булһағыҙ, ÑиÑтемага керегеҙ һәм паролде алмаштырығыҙ. Яңы пароль $5 {{PLURAL:$5|көн}} ғәмәлдә булаÑаҡ.
@@ -521,6 +517,9 @@ $2',
'loginlanguagelabel' => 'Тел: $1',
'suspicious-userlogout' => 'Һеҙҙең ÑеанÑÑ‚Ñ‹ тамамлау тураһында һорауығыҙ кире ҡағылды, Ñөнки ул төҙөк булмаған браузер йәки кÑшлауÑÑ‹ прокÑи тарафынан ебәрелгән һорауға оҡшаған.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHP-ның mail() функциÑһында билдәһеҙ хата',
+
# Password reset dialog
'resetpass' => 'Паролде үҙгәртеү',
'resetpass_announce' => 'Һеҙ ÑиÑтемала Ñлектрон почта аша алынған ваҡытлыÑа пароль менән танылдығыҙ. СиÑтемаға кереүҙә тамалау Ó©Ñөн Ñңы пароль булдырығыҙ.',
@@ -569,10 +568,11 @@ $2',
'showlivepreview' => 'Тиҙ алдан байҡау',
'showdiff' => 'Индерелгән үҙгәрештәр',
'anoneditwarning' => "'''Иғтибар''': Һеҙ танылмағанһығыҙ. IP-адреÑÑ‹Ò“Ñ‹Ò™ был биттең үҙгәртеүҙәр тарихына ÑҙылаÑаҡ.",
+'anonpreviewwarning' => "''Һеҙ танылмағанһығыҙ. Яҙҙырыу ваҡытында IP-адреÑÑ‹Ò“Ñ‹Ò™ был биттең үҙгәртеүҙәр тарихына ÑҙылаÑаҡ.''",
'missingsummary' => "'''Иҫкәртеү.''' Һеҙ үҙгәртеүҙергә ҡыҫҡа таÑуирлама Ñҙманығыҙ. Ҡабаттан «Битте һаҡларға» төймәһенә баҫһағыҙ, үҙгәртеүҙәрегеҙ таÑуирламаһыҙ һаҡланаÑаҡ.",
'missingcommenttext' => 'Зинһар, аҫҡа Ò¯Ò™ таÑуирламағыҙҙы керетегеҙ.',
'missingcommentheader' => "'''Иҫкәртеү:''' Һеҙ был комментарий Ó©Ñөн тема/иÑем Ñҙманығыҙ.
-«Битте һаҡларға» төймәһенә ҡабат баҫыу менән үҙгәртеүҙерегеҙ иÑемһеҙ ÑҙылаÑаҡ.",
+«{{int:savearticle}}» төймәһенә ҡабат баҫыу менән үҙгәртеүҙерегеҙ иÑемһеҙ ÑҙылаÑаҡ.",
'summary-preview' => 'БулаÑаҡ таÑуирлама:',
'subject-preview' => 'Тема/башлыҡты алдан ҡарау:',
'blockedtitle' => 'ҠулланыуÑÑ‹ блокланған',
@@ -644,7 +644,11 @@ $2',
'userjsyoucanpreview' => "'''Кәңәш:''' Яңы JS-файлды һаҡларҙан алда тикшерер Ó©Ñөн \"{{int:showpreview}}\" төймәһенә баҫығыҙ.",
'usercsspreview' => "'''Был бары тик CSS файлды алдан ҡарау ғына, ул әле һаҡланмаған!'''",
'userjspreview' => "'''Был бары тик JavaScript файлын алдан ҡарау ғына, ул әле һаҡланмаған!'''",
-'userinvalidcssjstitle' => "'''Иғтибар:''' \"\$1\" биҙәү темаһы табылманы. Иҫтә тотоғоҙ, .css һәм .js ҡулланыуÑÑ‹ биттәренең иÑемдәре тик бәләкәй хәрефтәрҙән генә торорға тейеш. Мәҫәлән: {{ns:user}}:Foo/monobook.css, Ó™ {{ns:user}}:Foo/Monobook.css түгел!",
+'sitecsspreview' => "'''Һеҙ CSS файлын алдан ҡарайһығыҙ ғына икәнен иҫегеҙҙә тотоғоҙ.'''
+'''Ул әле һаҡланмаған!'''",
+'sitejspreview' => "'''Һеҙ JavaScript кодын алдан ҡарайһығыҙ ғына икәнен иҫегеҙҙә тотоғоҙ.'''
+'''Ул әле һаҡланмаған!'''",
+'userinvalidcssjstitle' => "'''Иғтибар:''' \"\$1\" биҙәү темаһы табылманы. Иҫтә тотоғоҙ, .css һәм .js ҡулланыуÑÑ‹ биттәренең иÑемдәре тик бәләкәй хәрефтәрҙән генә торорға тейеш. Мәҫәлән: {{ns:user}}:Foo/vector.css, Ó™ {{ns:user}}:Foo/Vector.css түгел!",
'updated' => '(Яңыртылды)',
'note' => "'''Иҫкәрмә:'''",
'previewnote' => "'''Ҡарап Ñығыу өлгөһө, әлегә үҙгәрештәр Ñҙҙырылмаған!'''",
@@ -682,9 +686,6 @@ $2',
Әгәр кемдең дә булһа текÑтарығыҙҙы үҙгәртеүен теләмәһәгеҙ, уларҙы бында ҡуймағыҙ.<br />
Шулай уҡ, кереткән өҫтәмәләрҙең авторы булыуығыҙҙы йәки уларҙы, ÑÑтәлеге ирекле рәүештә таратылырға һәм үҙгәртелергә Ñ€Ó©Ñ…Ñәт ителгән Ñығанаҡтан алыуығыҙҙы раҫлайһығыҙ (ҡарағыҙ: $1).
'''РӨХСӘТҺЕҘ, ÐВТОРЛЫҠ ХОҠУҠТÐРЫ МЕÐӘРҺÐҠЛÐÐÒ’ÐÐ ÐœÐТЕРИÐЛДÐР ҠУЙМÐҒЫҘ!'''",
-'longpagewarning' => "'''КИҪӘТЕҮ:''' Был биттең күләме $1 килобайт.
-32 Кб йәки унан ҙурыраҡ биттәр ҡайһы бер браузерҙарҙа дөрөҫ күренмәҫкә мөмкин.
-Битте бер ниÑÓ™ өлөшкә бүлеп ҡарағыҙ.",
'longpageerror' => "'''Ð¥ÐТÐ: һаҡланаÑаҡ текÑÑ‚ күләме $1 килобайт, был иһә Ñ€Ó©Ñ…Ñәт ителгән $2 килобайттан күп. Битте һаҡлап булмай.'''",
'readonlywarning' => "'''КИҪӘТЕҮ: Техник хеҙмәтләндереү Ñәбәпле мәғлүмәттәр базаһы блокланған, шунлыҡтан үҙгәртеүҙәрегеҙҙе хәҙер һаҡлай алмайһығыҙ.'''
ТекÑÑ‚Ñ‹ аҙаҡтан ҡулланыу Ó©Ñөн файлда һаҡлап тора алаһығыҙ.
@@ -864,6 +865,8 @@ $1",
'logdelete-failure' => "'''Яҙма күренеүÑәнлеге көйләнмәгән:'''
$1",
'revdel-restore' => 'КүренеүÑәнлекте үҙгәртергә',
+'revdel-restore-deleted' => 'юйылған өлгөләр',
+'revdel-restore-visible' => 'ҡара алған өлгөләр',
'pagehist' => 'Бит тарихы',
'deletedhist' => 'Юйылған тарих',
'revdelete-content' => 'ÑÑтәлек',
@@ -931,11 +934,13 @@ $1",
# Diffs
'history-title' => '$1 битенең үҙгәртеү тарихы',
'difference' => '(Өлгөләр араһында айырма)',
+'difference-multipage' => '(Биттәр араһындағы айырма)',
'lineno' => '$1 юл:',
'compareselectedversions' => 'Һайланған верÑиÑларҙы Ñағыштырыу',
'showhideselectedversions' => 'Һайланған верÑиÑларҙы күрһәтергә/йәшерергә',
'editundo' => 'кире алыу',
-'diff-multi' => '({{PLURAL:$1|Бер ваҡытлы верÑиÑ|$1 ваҡытлы верÑиÑ}} күрһәтелмәгән)',
+'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыуÑының}} {{PLURAL:$1|ваҡытлы верÑиÑһы}} күрһәтелмәгән)',
+'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыуÑының}} {{PLURAL:$1|ваҡытлы верÑиÑһы}} күрһәтелмәгән)',
# Search results
'searchresults' => 'Эҙләү һөҙөмтәләре',
@@ -970,6 +975,7 @@ $1",
'searchprofile-everything-tooltip' => 'Бар биттәрҙә Ñҙләү (фекер алышыу биттәрендә лә)',
'searchprofile-advanced-tooltip' => 'МахÑÑƒÑ Ð¸Ñем арауыҡтарында Ñҙләргә',
'search-result-size' => '$1 ({{PLURAL:$2|$2 Ò»Ò¯Ò™|$2 Ò»Ò¯Ò™}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 ағза}} ({{PLURAL:$2|$2 ÑÑке категориÑ}}, {{PLURAL:$3|$3 файл}})',
'search-result-score' => 'Тап килеүÑәнлек: $1%',
'search-redirect' => '(йүнәлтеү $1)',
'search-section' => '($1 бүлеге)',
@@ -1046,6 +1052,7 @@ $1",
'contextlines' => 'Һәр бер һөҙөмтәнең күрһәтеләÑәк юл һаны:',
'contextchars' => 'Бер юлдағы билдәләр һаны:',
'stub-threshold' => '<a href="#" class="stub">Материалдарға һылтанмалар </a> форматлау Ñиге (байттарҙа)',
+'stub-threshold-disabled' => 'Һүндерелгән',
'recentchangesdays' => 'Күҙәтеү иÑемлегендә күренгән көндәр һаны:',
'recentchangesdays-max' => 'Иң күбендә $1 {{PLURAL:$1|көн}}',
'recentchangescount' => 'Ғәҙәттә күрһәтелгән үҙгәртеүҙәр һаны:',
@@ -1079,6 +1086,7 @@ $1",
'prefs-files' => 'Файлдар',
'prefs-custom-css' => 'Ò®Ò™ CSS',
'prefs-custom-js' => 'Ò®Ò™ JS',
+'prefs-common-css-js' => 'Бөтә күренештәр Ó©Ñөн дөйөм CSS/JS:',
'prefs-reset-intro' => 'Был битте, көйләүҙәрегеҙҙе ғәҙәттәге көйләүҙәргә ташлатыу Ó©Ñөн ҡулланып була.
Раҫлағандан һуң ғәмәлде кире ҡайтарып булмаÑÑаҡ.',
'prefs-emailconfirm-label' => 'Электрон почтаны раҫлау:',
@@ -1117,9 +1125,15 @@ $1",
'prefs-advancedrendering' => 'Киңәйтелгән көйләүҙәр',
'prefs-advancedsearchoptions' => 'Киңәйтелгән көйләүҙәр',
'prefs-advancedwatchlist' => 'Киңәйтелгән көйләүҙәр',
-'prefs-display' => 'Күренеш көйләүҙәре',
+'prefs-displayrc' => 'Күренеш көйләүҙәре',
+'prefs-displaysearchoptions' => 'Күренеш көйләүҙәре',
+'prefs-displaywatchlist' => 'Күренеш көйләүҙәре',
'prefs-diffs' => 'Ðйырмалар',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail Ð°Ð´Ñ€ÐµÑ Ð´Ó©Ñ€Ó©Ò« булғанға оҡшаған',
+'email-address-validity-invalid' => 'Дөрөҫ e-mail адреÑын керетегеҙ',
+
# User rights
'userrights' => 'ҠулланыуÑÑ‹ хоҡуҡтарын идаралау',
'userrights-lookup-user' => 'ҠулланыуÑÑ‹ төркөмдәрен идаралау',
@@ -1203,6 +1217,7 @@ $1",
'right-hideuser' => 'ҠатнашыуÑÑ‹ иÑемен тыйыу һәм йәшереү',
'right-ipblock-exempt' => 'IP адреÑтарҙы бикләүҙе, авто-бикләүҙәрҙе, арауыҡтарҙы бикләүҙе урап үтеү',
'right-proxyunbannable' => 'ПрокÑи Ñерверҙарҙы авто-бикләүҙе урап үтеү',
+'right-unblockself' => 'Үҙҙәренең биген аÑыу',
'right-protect' => 'Биттәрҙең һаҡланыу дәрәжәһен үҙгәртеү һәм һаҡланған биттәрҙе мөхәррирләү',
'right-editprotected' => 'Һаҡланған биттәрҙе мөхәррирләү(Ñҙмә-Ñҙлекле һаҡлауһыҙ)',
'right-editinterface' => 'ҠулланыуÑÑ‹ интерфейÑын үҙгәртеү',
@@ -1225,7 +1240,6 @@ $1",
'right-siteadmin' => 'Мәғлүмәттәр базаһын аÑыу һәм Ñбыу',
'right-reset-passwords' => 'Башҡа ҡатнашыуÑыларҙың паролен Ñңыртыу',
'right-override-export-depth' => '5-Ñе тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе Ñығарыу',
-'right-versiondetail' => 'Программаның өлгөһө тураһында киңәйтелгән мәғлүмәтте ҡарау',
'right-sendemail' => 'Башҡа ҡатнашыуÑыларға Ñлектрон почта аша хат ебәреү',
# User rights log
@@ -1276,14 +1290,9 @@ $1",
'recentchanges-legend' => 'Һуңғы үҙгәртеүҙәр көйләүҙәре',
'recentchangestext' => '{{grammar:genitive|{{SITENAME}}}}. биттәрендә индерелгән һуңғы үҙгәртеүҙәр иÑемлеге',
'recentchanges-feed-description' => 'Был таҫмалағы һуңғы үҙгәртеүҙәрҙе күҙәтеп барырға',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 — Ñңы бит',
'recentchanges-label-newpage' => 'Был үҙгәртеү Ñңы бит Ñһаны',
-'recentchanges-legend-minor' => '$1 — әҙ үҙгәреш',
'recentchanges-label-minor' => 'Был әҙ үҙгәреш',
-'recentchanges-legend-bot' => '$1 — бот төҙәтеүе',
'recentchanges-label-bot' => 'Был төҙәтеү бот тарафынан башҡарылды',
-'recentchanges-legend-unpatrolled' => '$1 — ҡаралмаған төҙәтеү',
'recentchanges-label-unpatrolled' => 'Был төҙәтеү ҡаралмаған әле',
'rcnote' => 'Ðҫта $4 $5 тиклем Ñшләнгән, һуңғы {{PLURAL:$2|1|$2}} көн ÑÑендәге һуңғы {{PLURAL:$1|1|$1}} үҙгәртеү күрһәтелгән.',
'rcnotefrom' => "Түбәндә '''$2''' башлап ('''$1''' тиклем) үҙгәртеүҙәр күрһәтелгән.",
@@ -1330,6 +1339,8 @@ $1",
'upload_directory_missing' => 'Тейәү Ó©Ñөн Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ($1) ÑŽÒ¡ йәки веб-Ñервер уны булдыра алмай.',
'upload_directory_read_only' => 'Тейәү Ó©Ñөн директориÑға ($1) веб-Ñервер Ñҙҙыра алмай.',
'uploaderror' => 'Тейәү хатаһы',
+'upload-recreate-warning' => "'''Иғтибар. Бындай иÑемле файл юйылған йәки күÑерелгән. '''
+Был биттең юйыуҙары һәм күÑереүҙәре Ñҙмалары журналы түбәндә килтерелгән:",
'uploadtext' => "Файл тейәү Ó©Ñөн түбәндәге форманы ҡулланығыҙ.
Элек тейәлгән файлдарҙы байҡар Ó©Ñөн [[Special:FileList|тейәлгән файлдар иÑемлеген]] ҡарағыҙ. Файл тейәүҙәр шулай уҡ [[Special:Log/upload|тейәү Ñҙмаларына]], юйыуҙар иһә [[Special:Log/delete|юйыу Ñҙмаларына]] Ñҙылып баралар.
@@ -1365,6 +1376,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' — тыйылған файл тибы.
{{PLURAL:\$3|РөхÑәт ителгән файл тибы|РөхÑәт ителгән файл типтары:}} \$2.",
'filetype-missing' => 'Файлдың киңәйтелмәһе юҡ (мәҫәлән, ".jpg").',
+'empty-file' => 'Һеҙ ебәргән файл буш.',
+'file-too-large' => 'Һеҙ ебәргән файл бигерәк ҙур.',
+'filename-tooshort' => 'Файлдың иÑеме бигерәк ҡыҫҡа.',
+'filetype-banned' => 'Был файл Ñ‚Ó©Ñ€Ó© Ñ€Ó©Ñ…Ñәт ителмәй.',
+'verification-error' => 'Был файл тикшереү үтмәгән.',
+'hookaborted' => 'Һеҙ керетергә теләгән үҙгәртеүҙәр киңәйтелмә Ñшкәртеү ҡоралы тарафынан кире алынды.',
+'illegal-filename' => 'Ярамаған файл иÑеме.',
+'overwrite' => 'Булған файлды алыштырыу мөмкин түгел.',
+'unknown-error' => 'Билдәһеҙ хата.',
+'tmp-create-error' => 'Ваҡытлы файл булдырыу мөмкин түгел.',
+'tmp-write-error' => 'Ваҡытлы файлға Ñҙҙырыу хатаһы.',
'large-file' => 'Дәүмәле $1 байттан артмаған файлдар ҡулланырға кәңәш ителә (был файлдың дәүмәле $2 байт тәшкил итә).',
'largefileserver' => 'Был файлдың дәүмәле Ñ€Ó©Ñ…Ñәт ителгәндән ҙурыраҡ.',
'emptyfile' => 'Һеҙ тейәгән файл буш булырға тейеш.
@@ -1395,13 +1417,14 @@ $1",
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Был файл түбәндәге {{PLURAL:$1|файл|файлдар}} менән тап килә:',
'file-deleted-duplicate' => 'Оҡшаш файл ([[:$1]]) юйылғайны инде. Уны ҡайтанан тейәр алдынан, зинһар, файлды юйыу тарихын ҡарағыҙ.',
-'successfulupload' => 'Тейәү уңышлы тамамланды',
'uploadwarning' => 'Киҫәтеү',
'uploadwarning-text' => 'Зинһар, түбәндәге файл таÑуирламаһын үҙгәртегеҙ һәм Ñңынан ҡабатлап ҡарағыҙ.',
'savefile' => 'ҺөҙгөÑÑ‚Ó© Ñҙҙырып ҡуйырға',
'uploadedimage' => '«[[$1]]» тейәлгән',
'overwroteimage' => '"[[$1]]" файлының Ñңы өлгөһө тейәлде',
'uploaddisabled' => 'Тейәү Ñ€Ó©Ñ…Ñәт ителмәй',
+'copyuploaddisabled' => 'URL Ð°Ð´Ñ€ÐµÑ Ð°ÑˆÐ° тейәү Ñ€Ó©Ñ…Ñәт ителмәй.',
+'uploadfromurl-queued' => 'Һеҙҙең тейәүегеҙ Ñиратҡа ҡуйылды.',
'uploaddisabledtext' => 'Файлдар тейәү Ñ€Ó©Ñ…Ñәт ителмәй.',
'php-uploaddisabledtext' => 'Файлдар тейәү PHP көйләүҙәрендә Ñ€Ó©Ñ…Ñәт ителмәй. Зинһар, file_uploads көйләүен тикшерегеҙ.',
'uploadscripted' => 'Файлда булған HTML-кодты йәки Ñкриптты браузер дөрөҫ Ñшкәртмәүе мөмкин.',
@@ -1422,6 +1445,13 @@ $1",
Түбәндә файлдың юйыу Ñҙмалары килтерелә:",
'filename-bad-prefix' => "Тейәлә торған файлдың иÑеме ''«$1»''' менән башлана һәм ул цифрлы камераларҙа файлдарға уҙенән-үҙе бирелә торған иÑемгә оҡшаған.
Зинһар, файлды Ñҡшыраҡ таÑуирлаған иÑем һайлағыҙ.",
+'upload-success-subj' => 'Файл тейәү уңышлы тамамланды',
+'upload-success-msg' => 'Һеҙҙең [$2] адреÑынан тейәүегеҙ уңышлы тамаланды. Файлды ошонда ҡарай алаһығыҙ: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Тейәү уңышлы түгел',
+'upload-failure-msg' => '[$2] адреÑынан тейәгән ваҡытта ҡыйынлыҡтар тыуҙы:
+$1',
+'upload-warning-subj' => 'Тейәү ваҡытында киҫәтеү',
+'upload-warning-msg' => '[$2] адреÑынан тейәгән ваҡытта ҡыйынлыҡтар тыуҙы. Хатаны төҙәтеү Ó©Ñөн [[Special:Upload/stash/$1|файл тейәү формаһына]] кире ҡайта алаһығыҙ.',
'upload-proto-error' => 'Протокол дөрөҫ түгел',
'upload-proto-error-text' => 'Ðлыҫтан тейәү Ó©Ñөн <code>http://</code> йәки <code>ftp://</code> менән башланған Ð°Ð´Ñ€ÐµÑ ÐºÓ™Ñ€Ó™Ðº.',
@@ -1489,6 +1519,7 @@ $1",
'listfiles_search_for' => 'Файл иÑеме буйынÑа Ñҙләү:',
'imgfile' => 'файл',
'listfiles' => 'Файлдар иÑемлеге',
+'listfiles_thumb' => 'Шартлы Ñ€Ó™Ñем',
'listfiles_date' => 'Көнө',
'listfiles_name' => 'ИÑем',
'listfiles_user' => 'ҠатнашыуÑÑ‹',
@@ -1603,8 +1634,8 @@ $1",
'statistics-edits' => '{{SITENAME}} проекты булдырылған ваҡыттан башлап үҙгәртеүҙәр һаны',
'statistics-edits-average' => 'УртаÑа бер биткә тура килгән төҙәтеүҙәр һаны',
'statistics-views-total' => 'Ҡарап Ñығыуҙар',
+'statistics-views-total-desc' => 'Булмаған биттәрҙе һәм махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€Ò™Ðµ ҡарап Ñығыуҙарҙы Ò¯Ò™ ÑÑенә алмай',
'statistics-views-peredit' => 'Бер үҙгәртеүгә ҡарап Ñығыуҙар',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Эштәр Ñираты] оҙонлоғо',
'statistics-users' => 'Теркәлгән [[Special:ListUsers|ҡатнашыуÑылар]]',
'statistics-users-active' => 'Әүҙем ҡатнашыуÑылар',
'statistics-users-active-desc' => 'Һуңғы {{PLURAL:$1|көндә|$1 көндә}} ниндәйҙер Ñшмәкәрлек башҡарған ҡатнашыуÑылар',
@@ -1618,8 +1649,8 @@ $1",
'doubleredirects' => 'Икеле йүнәлтеүҙәр',
'doubleredirectstext' => 'Был биттә икенÑе йүнәлтеү биттәренә йүнәлткән биттәр иÑемлеге килтерелгән.
-Һәр юл беренÑе һәм икенÑе йүнәлтеүгә һылтанманан, шулай уҡ икенÑе һылтанма йүнәлткән һәм беренÑе йүнәлтмә һылтанма Ñһарға тейеш булған биттән тора.
-<s>Һыҙылған</s> Ñҙыуҙар төҙәтелгән.',
+Һәр юл беренÑе һәм икенÑе йүнәлтеүгә һылтанманан, шулай уҡ икенÑе һылтанма йүнәлткән һәм беренÑе йүнәлтмә һылтанма Ñһарға тейеш булған биттән тора.
+<del>Һыҙылған</del> Ñҙыуҙар төҙәтелгән.',
'double-redirect-fixed-move' => '[[$1]] битенең иÑеме үҙгәртелгән.
Хәҙер ул [[$2]] битенә йүнәлтелгән.',
'double-redirect-fixer' => 'Йүнәлтеүҙәрҙе төҙәтеүÑе',
@@ -1643,6 +1674,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|объект}}',
'nrevisions' => '$1 {{PLURAL:$1|өлгө|өлгө}}',
'nviews' => '$1 {{PLURAL:$1|ҡарап Ñығыу}}',
+'nimagelinks' => '$1 {{PLURAL:$1|биттә}} ҡулланыла',
+'ntransclusions' => '$1 {{PLURAL:$1|биттә}} ҡулланыла',
'specialpage-empty' => 'Был һорау Ó©Ñөн һөҙөмтәләр ÑŽÒ¡.',
'lonelypages' => 'Етем биттәр',
'lonelypagestext' => 'Түбәндәге биттәргә {{SITENAME}} проектының башҡа биттәренән һылтанмалар юҡ һәм улар башҡа биттәргә индерелмәгән.',
@@ -1799,34 +1832,40 @@ $1",
'listgrouprights-removegroup-self-all' => 'Үҙенең иҫәп Ñҙмаһынан бөтә төркөмдәрҙе юйыу',
# E-mail user
-'mailnologin' => 'Хат ебәреү Ó©Ñөн Ð°Ð´Ñ€ÐµÑ ÑŽÒ¡',
-'mailnologintext' => 'Башҡа ҡатнашыуÑыларға хат ебәреү Ó©Ñөн, һеҙ [[Special:UserLogin|танылырға]] һәм [[Special:Preferences|көйләүҙәрегеҙҙә]] Ñ‹Ñын Ñлектрон Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ñ‡Ñ‚Ð°Ò»Ñ‹ кереткән булырға тейешһегеҙ.',
-'emailuser' => 'ҠатнашыуÑыға хат',
-'emailpage' => 'ҠатнашыуÑыға хат',
-'emailpagetext' => 'Был ҡатнашыуÑыға Ñлектрон почта аша хат ебәреү Ó©Ñөн, һеҙ түбәндәге форманы ҡуллана алаһығыҙ.
+'mailnologin' => 'Хат ебәреү Ó©Ñөн Ð°Ð´Ñ€ÐµÑ ÑŽÒ¡',
+'mailnologintext' => 'Башҡа ҡатнашыуÑыларға хат ебәреү Ó©Ñөн, һеҙ [[Special:UserLogin|танылырға]] һәм [[Special:Preferences|көйләүҙәрегеҙҙә]] Ñ‹Ñын Ñлектрон Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ñ‡Ñ‚Ð°Ò»Ñ‹ кереткән булырға тейешһегеҙ.',
+'emailuser' => 'ҠатнашыуÑыға хат',
+'emailpage' => 'ҠатнашыуÑыға хат',
+'emailpagetext' => 'Был ҡатнашыуÑыға Ñлектрон почта аша хат ебәреү Ó©Ñөн, һеҙ түбәндәге форманы ҡуллана алаһығыҙ.
Яуап Ó©Ñөн Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ»Ð°Ñ€Ð°Ò¡ һеҙ [[Special:Preferences|көйләүҙәрегеҙҙә]] күрһәткән Ñлектрон почта адреÑÑ‹ күрһәтеләÑәк, шулай итеп, хатты алыуÑÑ‹ һеҙгә тура Ñуап ебәрә алаÑаҡ.',
-'usermailererror' => 'Хат ебәргән ваҡытта хата килеп ÑÑ‹Ò¡Ñ‚Ñ‹:',
-'defemailsubject' => '{{SITENAME}} проектынан хат',
-'noemailtitle' => 'Электрон почта адреÑÑ‹ ÑŽÒ¡',
-'noemailtext' => 'Был ҡатнашыуÑÑ‹ дөрөҫ Ñлектрон почта адреÑÑ‹ күрһәтмәгән',
-'nowikiemailtitle' => 'Электрон хат ебәреү Ó©Ñөн Ñ€Ó©Ñ…Ñәт ÑŽÒ¡',
-'nowikiemailtext' => 'Был ҡатнашыуÑÑ‹ башҡа ҡатнашыуÑыларҙан Ñлектрон хат алырға теләмәүен күрһәткән.',
-'email-legend' => '{{SITENAME}} проектының башҡа ҡатнашыуÑыһына Ñлектрон хат ебәрергә',
-'emailfrom' => 'Кемдән:',
-'emailto' => 'Кемгә:',
-'emailsubject' => 'Тема:',
-'emailmessage' => 'Хәбәр:',
-'emailsend' => 'Ебәреү',
-'emailccme' => 'Хаттың күÑермәһен миңә ебәрергә',
-'emailccsubject' => '$1 Ó©Ñөн хатығыҙҙың күÑермәһе: $2',
-'emailsent' => 'Хат ебәрелде',
-'emailsenttext' => 'Һеҙҙең Ñлектрон хатығыҙ ебәрелде.',
-'emailuserfooter' => 'Был Ñлектрон хат $1 ҡатнашыуÑыһынан $2 ҡатнашыуÑыһына {{SITENAME}} проектының "ҠатнашыуÑыға хат" формаһы аша ебәрелде.',
+'usermailererror' => 'Хат ебәргән ваҡытта хата килеп ÑÑ‹Ò¡Ñ‚Ñ‹:',
+'defemailsubject' => '{{SITENAME}} проектынан хат',
+'usermaildisabled' => 'ҠатнашыуÑының Ñлектрон почтаһы һүндерелгән',
+'usermaildisabledtext' => 'Һеҙ был вики-проекттың башҡа ҡатнашыуÑыларына Ñлектрон хат ебәрә алмайһығыҙ',
+'noemailtitle' => 'Электрон почта адреÑÑ‹ ÑŽÒ¡',
+'noemailtext' => 'Был ҡатнашыуÑÑ‹ дөрөҫ Ñлектрон почта адреÑÑ‹ күрһәтмәгән',
+'nowikiemailtitle' => 'Электрон хат ебәреү Ó©Ñөн Ñ€Ó©Ñ…Ñәт ÑŽÒ¡',
+'nowikiemailtext' => 'Был ҡатнашыуÑÑ‹ башҡа ҡатнашыуÑыларҙан Ñлектрон хат алырға теләмәүен күрһәткән.',
+'email-legend' => '{{SITENAME}} проектының башҡа ҡатнашыуÑыһына Ñлектрон хат ебәрергә',
+'emailfrom' => 'Кемдән:',
+'emailto' => 'Кемгә:',
+'emailsubject' => 'Тема:',
+'emailmessage' => 'Хәбәр:',
+'emailsend' => 'Ебәреү',
+'emailccme' => 'Хаттың күÑермәһен миңә ебәрергә',
+'emailccsubject' => '$1 Ó©Ñөн хатығыҙҙың күÑермәһе: $2',
+'emailsent' => 'Хат ебәрелде',
+'emailsenttext' => 'Һеҙҙең Ñлектрон хатығыҙ ебәрелде.',
+'emailuserfooter' => 'Был Ñлектрон хат $1 ҡатнашыуÑыһынан $2 ҡатнашыуÑыһына {{SITENAME}} проектының "ҠатнашыуÑыға хат" формаһы аша ебәрелде.',
+
+# User Messenger
+'usermessage-summary' => 'СиÑтема хәбәрен ҡалдырырға.',
+'usermessage-editor' => 'СиÑтема хәбәрÑеһе',
# Watchlist
'watchlist' => 'Күҙәтеү иÑемлеге',
'mywatchlist' => 'Күҙәтеү иÑемлеге',
-'watchlistfor' => "('''$1''' Ó©Ñөн)",
+'watchlistfor2' => '$1 $2 Ó©Ñөн',
'nowatchlist' => 'Һеҙҙең күҙәтеү иÑемлегегеҙ буш.',
'watchlistanontext' => 'Күҙәтеү иÑемлеген ҡарау йәки мөхәррирләү Ó©Ñөн $1 кәрәк.',
'watchnologin' => 'Үҙегеҙҙе танытырға кәрәк',
@@ -1944,7 +1983,10 @@ $UNWATCHURL
'revertpage-nouser' => '(ҠатнашыуÑының иÑеме юйылған) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды',
'rollback-success' => '$1 уҙгәртеүҙәре кире алдынды;
$2 өлгөһөнә ҡайтыу.',
-'sessionfailure' => 'Хәҙерге ÑеанÑта хаталар килеп Ñыҡҡан, булырға тейеш;
+
+# Edit tokens
+'sessionfailure-title' => 'Ð¡ÐµÐ°Ð½Ñ Ñ…Ð°Ñ‚Ð°Ò»Ñ‹',
+'sessionfailure' => 'Хәҙерге ÑеанÑта хаталар килеп Ñыҡҡан, булырға тейеш;
"ÑеанÑÑ‚Ñ‹ баҫып алыу"ға юл ҡуймау Ó©Ñөн был ғәмәл үтәлмәне.
Ðлдағы биткә кире ҡайтығыҙ, битте Ñңыртығыҙ һәм Ñңынан ҡабатлап ҡарағыҙ.',
@@ -2079,19 +2121,23 @@ $1',
'month' => 'Ðйҙан башлап (һәм Ñлегерәк):',
'year' => 'Йылдан башлап (һәм Ñлегерәк):',
-'sp-contributions-newbies' => 'Яңы иҫәп Ñҙмалары кереткән өлөштө генә күрһәтергә',
-'sp-contributions-newbies-sub' => 'Яңы иҫәп Ñҙмалары Ó©Ñөн',
-'sp-contributions-newbies-title' => 'Яңы иҫәп Ñҙмалары Ó©Ñөн ҡатнашыуÑÑ‹ өлөшө',
-'sp-contributions-blocklog' => 'блоклау Ñҙмалары',
-'sp-contributions-deleted' => 'ҡулланыуÑының юйылған өлөшө',
-'sp-contributions-logs' => 'журналдар',
-'sp-contributions-talk' => 'фекер алышыу',
-'sp-contributions-userrights' => 'ҡатнашыуÑÑ‹ хоҡуҡтарын идаралау',
-'sp-contributions-blocked-notice' => 'Әлеге ваҡытта был ҡатнашыуÑÑ‹ бикле.
+'sp-contributions-newbies' => 'Яңы иҫәп Ñҙмалары кереткән өлөштө генә күрһәтергә',
+'sp-contributions-newbies-sub' => 'Яңы иҫәп Ñҙмалары Ó©Ñөн',
+'sp-contributions-newbies-title' => 'Яңы иҫәп Ñҙмалары Ó©Ñөн ҡатнашыуÑÑ‹ өлөшө',
+'sp-contributions-blocklog' => 'блоклау Ñҙмалары',
+'sp-contributions-deleted' => 'ҡулланыуÑының юйылған өлөшө',
+'sp-contributions-uploads' => 'тейәүҙәр',
+'sp-contributions-logs' => 'журналдар',
+'sp-contributions-talk' => 'фекер алышыу',
+'sp-contributions-userrights' => 'ҡатнашыуÑÑ‹ хоҡуҡтарын идаралау',
+'sp-contributions-blocked-notice' => 'Әлеге ваҡытта был ҡатнашыуÑÑ‹ бикле.
Түбәндә бикләү Ñҙмаларынан һуңғы ҡатнашыуÑыны бикләү Ñҙмаһы килтерелгән:',
-'sp-contributions-search' => 'Өлөштәрҙе Ñҙләү',
-'sp-contributions-username' => 'ҠулланыуÑының IP-адреÑÑ‹ йәки иÑеме:',
-'sp-contributions-submit' => 'Эҙлә',
+'sp-contributions-blocked-notice-anon' => 'Әлеге ваҡытта был IP Ð°Ð´Ñ€ÐµÑ Ð±Ð¸ÐºÐ»Ðµ.
+Түбәндә бикләү Ñҙмаларынан һуңғы адреÑÑ‚Ñ‹ бикләү Ñҙмаһы килтерелгән:',
+'sp-contributions-search' => 'Өлөштәрҙе Ñҙләү',
+'sp-contributions-username' => 'ҠулланыуÑының IP-адреÑÑ‹ йәки иÑеме:',
+'sp-contributions-toponly' => 'Һуңғы өлгөләрҙе генә күрһәтергә',
+'sp-contributions-submit' => 'Эҙлә',
# What links here
'whatlinkshere' => 'Бында һылтанмалар',
@@ -2113,9 +2159,9 @@ $1',
'whatlinkshere-filters' => 'Һайлау',
# Block/unblock
-'blockip' => 'ҠатнашыуÑыны Ñбыу',
-'blockip-title' => 'ҠатнашыуÑыны Ñбыу',
-'blockip-legend' => 'ҠатнашыуÑыны Ñбыу',
+'blockip' => 'ҠатнашыуÑыны бикләү',
+'blockip-title' => 'ҠатнашыуÑыны бикләү',
+'blockip-legend' => 'ҠатнашыуÑыны бикләү',
'blockiptext' => 'Билдәләнгән IP адреÑтан Ñҙыу мөмкинлеген бикләү Ó©Ñөн, түбәндәге форманы ҡулланығыҙ.
Был бары тик вандаллыҡҡа юл ҡуймау Ó©Ñөн генә һәм [[{{MediaWiki:Policy-url}}|ҡағиҙәләр]] буйынÑа ғына Ñшләнергә тейеш.
Түбәндә бикләү Ñәбәбен күрһәтегеҙ (мәҫәлән, вандаллыҡ Ñҙҙәре булған бер ниÑÓ™ биттең цитатаһын килтерегеҙ).',
@@ -2152,7 +2198,6 @@ $1',
'ipb-edit-dropdown' => 'Бикләү Ñәбәптәрен мөхәррирләргә',
'ipb-unblock-addr' => '$1 биген алырға',
'ipb-unblock' => 'ҠатнашыуÑының йәки IP адреÑÑ‚Ñ‹Ò£ биген алырға',
-'ipb-blocklist-addr' => '$1 Ó©Ñөн бикләүҙәр',
'ipb-blocklist' => 'Булған бикләүҙәрҙе күрһәтергә',
'ipb-blocklist-contribs' => '$1 ҡатнашыуÑыһының кереткән өлөшө',
'unblockip' => 'ҠатнашыуÑының биген алырға',
@@ -2230,6 +2275,8 @@ $1 бикләнгән инде.
'cant-block-while-blocked' => 'Үҙегеҙ бикләнгән ваҡытта һеҙ башҡа ҡатнашыуÑыларҙы бикләй алмайһығыҙ.',
'cant-see-hidden-user' => 'Һеҙ бикләргә тырышҡан ҡатнашыуÑÑ‹ әлеге ваҡытта бикләнгән һәм йәшерелгән.
ҠатнашыуÑыларҙы йәшереү хоҡуғығыҙ булмағанға күрә, һеҙ был бикләүҙе ҡарай йәки үҙгәртә алмайһығыҙ.',
+'ipbblocked' => 'Үҙегеҙ бикләнгән ваҡытта һеҙ башҡа ҡатнашыуÑыларҙы бикләй йәки бикте ала алмайһығыҙ.',
+'ipbnounblockself' => 'Һеҙ үҙегеҙҙән бикте ала алмайһығыҙ.',
# Developer tools
'lockdb' => 'Мәғлүмәттәр базаһын бикләргә',
@@ -2267,6 +2314,18 @@ $1 бикләнгән инде.
'''Иғтибар!'''
ПопулÑÑ€ биттәрҙең иÑемен үҙгәртеү көтмәгән һөҙөмтәләргә килтерергә мөмкин.
Дауам итерҙән алда, бөтә булаÑаҡ һөҙөмтәләрҙе аңлауығыҙҙы уйлағыҙ.",
+'movepagetext-noredirectfixer' => "Ðҫтағы форманы ҡулланыу биттең иÑемен үҙгәртә һәм уның үҙгәртеүҙәр Ñҙмаһын Ñңы урынға күÑерә.
+Биттең Ñлекке иÑеме Ñңы биткә йүнәлтеү булып ҡалаÑаҡ.
+Һеҙ Ñлекке иÑемгә булған йүнәлтеүҙәрҙе автоматик рәүештә Ñңы иÑемгә күÑерә алаһығыз.
+Әгәр быны Ñшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәрҙе]] тикшерегеҙ.
+Һылтанмаларҙың кәрәкле урынға күрһәтеүҙәренең дауам итеүе Ó©Ñөн һеҙ Ñуаплы.
+
+Иғтибар итегеҙ, әгәр Ñңы иÑемле бит бар икән, биттең иÑеме '''үҙгәртелмәйәÑәк'''; Ñлекке бит йүнәлтеү, буш һәм үҙгәртеү тарихына Ñйә булмаған оÑраҡтарҙан башҡа.
+Был шуны аңлата: бит иÑемен Ñңылыш үҙгәртһәгеҙ, битте кире ҡайтара алаһығыҙ, ләкин булған битте ÑŽÑ Ð°Ð»Ð¼Ð°Ð¹Ò»Ñ‹Ò“Ñ‹Ò™.
+
+'''Иғтибар!'''
+ПопулÑÑ€ биттәрҙең иÑемен үҙгәртеү көтмәгән һөҙөмтәләргә килтерүе мөмкин.
+Дауам итерҙән алда, бөтә булаÑаҡ һөҙөмтәләрҙе аңлауығыҙҙы уйлағыҙ.",
'movepagetalktext' => "Фекер алышыу битенең иÑеме лә үҙгәртеләÑәк, '''киләһе оÑраҡтарҙан тыш''':
*Бындай иÑемле фекер алышыу бите бар, йәки
*Ðҫтағы юлды билдәләмәгәнһегеҙ.
@@ -2321,6 +2380,7 @@ $1 бикләнгән инде.
'immobile-source-page' => 'Был биттең иÑемен үҙгәртеү мөмкин түгел.',
'immobile-target-page' => 'Биткә был иÑемде биреү мөмкин түгел.',
'imagenocrossnamespace' => 'Файлға башҡа иÑемдәр арауығындағы иÑемде биреү мөмкин түгел.',
+'nonfile-cannot-move-to-file' => 'Файл булмаған еÑемгә файл иÑемдәре арауығындағы иÑемде биреү мөмкин түгел.',
'imagetypemismatch' => 'Яңы файл киңәйтеүе уның төрө менән тап килмәй',
'imageinvalidfilename' => 'Файл иÑеме дөрөҫ түгел',
'fix-double-redirects' => 'Элекке иÑемгә һылтанған йүнәлтеүҙәрҙе төҙәтергә',
@@ -2397,6 +2457,7 @@ $1 бикләнгән инде.
'importstart' => 'Биттәрҙе тейәү...',
'import-revision-count' => '$1 {{PLURAL:$1|өлгө|өлгө}}',
'importnopages' => 'Тейәү Ó©Ñөн биттәр ÑŽÒ¡.',
+'imported-log-entries' => 'Журналдан $1 {{PLURAL:$1|Ñҙма}} тейәлде.',
'importfailed' => 'Тейәү хатаһы: <nowiki>$1</nowiki>',
'importunknownsource' => 'Сығанаҡ биттең төрө билдәһеҙ',
'importcantopen' => 'Тейәлә торған битте аÑып булмай',
@@ -2494,6 +2555,8 @@ $1 бикләнгән инде.
'tooltip-upload' => 'КүÑерә башларға',
'tooltip-rollback' => 'Бер баҫыу менән аҙаҡҡы мөхәррирләүÑенең үҙгәртеүҙәрен кире ала.',
'tooltip-undo' => '"Кире ал" төҙәтеүҙе кире ала һәм төҙәтеү формаһын "алдан байҡау"ҙа күрһәтә. Һәм кире алыуҙың Ñәбәбен белдерергә була.',
+'tooltip-preferences-save' => 'Көйләүҙәрҙе һаҡларға',
+'tooltip-summary' => 'ҠыҫҡаÑа таÑуирлама керетегеҙ',
# Metadata
'nodublincore' => 'Dublin Core RDF мета-мәғлүмәт был Ñервер Ó©Ñөн Ñ€Ó©Ñ…Ñәт ителмәй.',
@@ -2599,14 +2662,17 @@ $1',
'imagemaxsize' => "РәÑем дәүмәле Ó©Ñөн Ñик: <br />''(файл таÑуирламаһы биттәре Ó©Ñөн)''",
'thumbsize' => 'Шартлы Ñ€Ó™Ñем дәүмәле:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|бит}}',
-'file-info' => '(файлдың дәүмәле: $1, MIME төрө: $2)',
-'file-info-size' => '($1 × $2 нөктә, файл күләме: $3, MIME-төр: $4)',
+'file-info' => 'файлдың дәүмәле: $1, MIME төрө: $2',
+'file-info-size' => '$1 × $2 нөктә, файлдың дәүмәле: $3, MIME төрө: $4',
'file-nohires' => '<small>Юғары аÑыҡлыҡтағы өлгө ÑŽÒ¡.</small>',
-'svg-long-desc' => '(SVG файлы, номиналь $1 × $2 нөктә, файл күләме: $3)',
+'svg-long-desc' => 'SVG файлы, номиналь $1 × $2 нөктә, файлдың дәүмәле: $3',
'show-big-image' => 'Тулы аÑыҡлыҡ',
'show-big-image-thumb' => '<small>Ðлдан байҡау дәүмәле: $1 × $2 нөктә</small>',
'file-info-gif-looped' => 'әйләнешле',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм}}',
+'file-info-png-looped' => 'әйләнешле',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|тапҡыр}} уйнала',
+'file-info-png-frames' => '$1 {{PLURAL:$1|фрейм}}',
# Special:NewFiles
'newimages' => 'Яңы файлдар йыйылмаһы',
@@ -2760,6 +2826,7 @@ $1',
'exif-gpsareainformation' => 'GPS өлкәһенең иÑеме',
'exif-gpsdatestamp' => 'GPS ваҡыты',
'exif-gpsdifferential' => 'GPS мәғлүмәтте дифференциаль төҙәтеү',
+'exif-objectname' => 'Ҡыҫҡа иÑем',
# EXIF attributes
'exif-compression-1' => 'Ҡыҫылмаған',
@@ -2917,28 +2984,28 @@ $1',
'limitall' => 'бөтә',
# E-mail address confirmation
-'confirmemail' => 'Электрон почта адреÑын раҫлау',
-'confirmemail_noemail' => 'Һеҙҙең [[Special:Preferences|көйләүҙәрегеҙҙә]] дөрөҫ Ñлектрон почта адреÑÑ‹ ÑŽÒ¡.',
-'confirmemail_text' => '{{SITENAME}} проекты Ñлектрон почта мөмкинлектәрен ҡулланыр алдынан Ñлектрон почта адреÑының раҫланыуын талап итә.
+'confirmemail' => 'Электрон почта адреÑын раҫлау',
+'confirmemail_noemail' => 'Һеҙҙең [[Special:Preferences|көйләүҙәрегеҙҙә]] дөрөҫ Ñлектрон почта адреÑÑ‹ ÑŽÒ¡.',
+'confirmemail_text' => '{{SITENAME}} проекты Ñлектрон почта мөмкинлектәрен ҡулланыр алдынан Ñлектрон почта адреÑының раҫланыуын талап итә.
Электрон адреÑÑ‚Ñ‹ раҫлау хаты һеҙҙең почтағыҙға ебәрелһен Ó©Ñөн, түбәндәге төймәгә баҫығыҙ.
Хатта махÑÑƒÑ Ð±Ð¸Ñ‚ÐºÓ™ һылтанма булаÑаҡ, был һылтанманы браузерығыҙҙа аÑҡандан һуң, һеҙҙең Ñлектрон почта адреÑÑ‹Ò“Ñ‹Ò™ раҫланған, тип һаналаÑаҡ.',
-'confirmemail_pending' => 'Электрон почта адреÑын раҫлау хаты һеҙгә ебәрелгән ине инде.
+'confirmemail_pending' => 'Электрон почта адреÑын раҫлау хаты һеҙгә ебәрелгән ине инде.
Әгәр һеҙ иҫәп Ñҙмаһын Ñңыраҡ булдырһағыҙ, һеҙгә был хатты Ñңынан һорар алдынан, хат килгәнÑе, бер ниÑÓ™ минут көтөргә кәрәк.',
-'confirmemail_send' => 'Электрон почта адреÑын раҫлау хатын ебәрергә',
-'confirmemail_sent' => 'Электрон почта адреÑын раҫлау хаты ебәрелде.',
-'confirmemail_oncreate' => 'Электрон почта адреÑын раҫлау хаты һеҙ күрһәткән Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ¹Ñ‹Ð½Ñа ебәрелде.
+'confirmemail_send' => 'Электрон почта адреÑын раҫлау хатын ебәрергә',
+'confirmemail_sent' => 'Электрон почта адреÑын раҫлау хаты ебәрелде.',
+'confirmemail_oncreate' => 'Электрон почта адреÑын раҫлау хаты һеҙ күрһәткән Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ¹Ñ‹Ð½Ñа ебәрелде.
Хатта күрһәтелгән һылтанма ÑиÑтемала танылыу талап итмәй, ләкин Ñлетрон почта мөмкинлектәрен вики проектта ҡулланыр Ó©Ñөн, һеҙгә танылырға кәрәк.',
-'confirmemail_sendfailed' => '{{SITENAME}} Ñлектрон почта адреÑын раҫлау хатын ебәрә алмай.
+'confirmemail_sendfailed' => '{{SITENAME}} Ñлектрон почта адреÑын раҫлау хатын ебәрә алмай.
Зинһар, адреÑығыҙҙың дөрөҫлөгөн тикшерегеҙ.
Почта хеҙмәтенең Ñуабы: $1',
-'confirmemail_invalid' => 'Раҫлау коды дөрөҫ түгел йәки уның ҡүлланыу ваҡыты үткән.',
-'confirmemail_needlogin' => 'Электрон почта адреÑын раҫлау Ó©Ñөн $1 кәрәк.',
-'confirmemail_success' => 'Һеҙҙең Ñлектрон почта адреÑÑ‹Ò“Ñ‹Ò™ раҫланды.
+'confirmemail_invalid' => 'Раҫлау коды дөрөҫ түгел йәки уның ҡүлланыу ваҡыты үткән.',
+'confirmemail_needlogin' => 'Электрон почта адреÑын раҫлау Ó©Ñөн $1 кәрәк.',
+'confirmemail_success' => 'Һеҙҙең Ñлектрон почта адреÑÑ‹Ò“Ñ‹Ò™ раҫланды.
Хәҙер һеҙ [[Special:UserLogin|танылыу үтеп]], вики проект менән ҡуллана алаһығыҙ.',
-'confirmemail_loggedin' => 'Һеҙҙең Ñлектрон почта адреÑÑ‹Ò“Ñ‹Ò™ раҫланды.',
-'confirmemail_error' => 'Электрон почта адреÑын раҫлаған ваҡытта хата килеп ÑÑ‹Ò¡Ñ‚Ñ‹.',
-'confirmemail_subject' => '{{SITENAME}} Ñлектрон почта адреÑын раҫлау',
-'confirmemail_body' => 'Кемдер, бәлки һеҙҙер, $1 IP адреÑынан
+'confirmemail_loggedin' => 'Һеҙҙең Ñлектрон почта адреÑÑ‹Ò“Ñ‹Ò™ раҫланды.',
+'confirmemail_error' => 'Электрон почта адреÑын раҫлаған ваҡытта хата килеп ÑÑ‹Ò¡Ñ‚Ñ‹.',
+'confirmemail_subject' => '{{SITENAME}} Ñлектрон почта адреÑын раҫлау',
+'confirmemail_body' => 'Кемдер, бәлки һеҙҙер, $1 IP адреÑынан
{{SITENAME}} проектында ошо Ñлектрон почта адреÑÑ‹ менән "$2" иҫәп Ñҙмаһын теркәгән.
Был иҫәп Ñҙмаһы Ñ‹Ñынлап та һеҙҙеке икәнен раҫлау Ó©Ñөн һәм
@@ -2952,8 +3019,36 @@ $3
$5
Был раҫлау коды $4 ғәмәлдән Ñыға.',
-'confirmemail_invalidated' => 'Электрон почта адреÑын раҫлау туҡтатылды',
-'invalidateemail' => 'Электрон почта адреÑын раҫлауҙы туҡтатыу',
+'confirmemail_body_changed' => 'Кемдер, бәлки һеҙҙер, $1 IP адреÑынан
+{{SITENAME}} проектында "$2" иҫәп Ñҙмаһының Ñлектрон почта адреÑын ошо адреÑҡа үҙгәрткән.
+
+Был иҫәп Ñҙмаһы Ñ‹Ñынлап та һеҙҙеке икәнен раҫлау Ó©Ñөн һәм
+{{SITENAME}} проектында Ñлетрон почта мөмкинлектәрен Ñңынан тоҡандырыу Ó©Ñөн, браузерығыҙҙа түбәндәге һылтанманы аÑÑ‹Ò“Ñ‹Ò™:
+
+$3
+
+Әгәр һеҙ иҫәп Ñҙмаһын *булдырмағанһығыҙ* икән,
+Ñлектрон почта адреÑын раҫлауҙы үтҡәрмәү Ó©Ñөн Ñ‚ үбәндәге һылтанманы аÑÑ‹Ò“Ñ‹Ò™:
+
+$5
+
+Был раҫлау коды $4 ғәмәлдән Ñыға.',
+'confirmemail_body_set' => 'Кемдер, бәлки һеҙҙер, $1 IP адреÑынан
+{{SITENAME}} проектында "$2" иҫәп Ñҙмаһының Ñлектрон почта адреÑын ошо Ð°Ð´Ñ€ÐµÑ Ð¸Ñ‚ÐµÐ¿ билдәләгән.
+
+Был иҫәп Ñҙмаһы Ñ‹Ñынлап та һеҙҙеке икәнен раҫлау Ó©Ñөн һәм
+{{SITENAME}} проектында Ñлетрон почта мөмкинлектәрен Ñңынан тоҡандырыу Ó©Ñөн, браузерығыҙҙа түбәндәге һылтанманы аÑÑ‹Ò“Ñ‹Ò™:
+
+$3
+
+Әгәр иҫәп Ñҙмаһы һеҙҙеке *түгел* икән,
+Ñлектрон почта адреÑын раҫлауҙы үтҡәрмәү Ó©Ñөн Ñ‚ үбәндәге һылтанманы аÑÑ‹Ò“Ñ‹Ò™:
+
+$5
+
+Был раҫлау коды $4 ғәмәлдән Ñыға.',
+'confirmemail_invalidated' => 'Электрон почта адреÑын раҫлау туҡтатылды',
+'invalidateemail' => 'Электрон почта адреÑын раҫлауҙы туҡтатыу',
# Scary transclusion
'scarytranscludedisabled' => '[Интервики индереү мөмкинлеге һүндерелгән]',
@@ -2993,6 +3088,7 @@ $1',
'table_pager_first' => 'БеренÑе бит',
'table_pager_last' => 'Һуңғы бит',
'table_pager_limit' => 'Бер биткә $1 еÑем күрһәтергә',
+'table_pager_limit_label' => 'Бер биттә еÑемдәр һаны:',
'table_pager_limit_submit' => 'КүÑеү',
'table_pager_empty' => 'Табылманы',
@@ -3050,6 +3146,7 @@ $1',
'version-specialpages' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€',
'version-parserhooks' => 'Уҡыу ҡоралдары',
'version-variables' => 'ҮҙгәреүÑән дәүмәлдәр',
+'version-skins' => 'Күренештәр',
'version-other' => 'Башҡалар',
'version-mediahandlers' => 'Медиа ÑшкәртеүÑе ҡоралдар',
'version-hooks' => 'Эләктереп алыуÑылар',
@@ -3061,6 +3158,13 @@ $1',
'version-hook-subscribedby' => 'Яҙҙырылған',
'version-version' => '($1 өлгөһө)',
'version-license' => 'РөхÑәтнамә',
+'version-poweredby-credits' => "Был вики проект '''[http://www.mediawiki.org/ MediaWiki]''' нигеҙендә Ñшләй, copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'башҡалар',
+'version-license-info' => 'MediaWiki — ирекле программа, һеҙ уны Ирекле программалар фонды тарафынан баҫтырылған GNU General Public License Ñ€Ó©Ñ…Ñәтнамәһенә Ñрашлы тарата һәм/йәки үҙгәртә алаһығыҙ (Ñ€Ó©Ñ…Ñәтнамәнең йә иÑенÑе өлгөһө, йә унан һуңғы өлгөләре).
+
+MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР ÐИДӘЙ Ò˜Ó˜ ЯУÐПЛЫЛЫҠ ЙӨКЛӘМӘҺЕҘ, хатта фараз ителгән ÒºÐТЫУ ӨСӨРЯРÐҠЛЫЛЫҠ йәки БИЛДӘЛӘÐГӘРМÐҠСÐТ ӨСӨРЯРÐҠЛЫТЫҠ тураһында Ñуаплылыҡ йөкләмәһеҙ таратыла. Ентекле мәғлүмәт алыр Ó©Ñөн, GNU General Public License Ñ€Ó©Ñ…Ñәтнамәһе тураһында уҡығыҙ.
+
+Был программа менән ҡуша һеҙ [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License Ñ€Ó©Ñ…Ñәтнамәһенең күÑермәһен] алырға тейеш инегеҙ, әгәр ÑŽÒ¡ икән, Ирекле программалар фондына 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA адреÑÑ‹ буйынÑа Ñҙығыҙ, йәки Ñ€Ó©Ñ…Ñәтнамәнең [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html онлайн өлгөһөн] уҡығыҙ.',
'version-software' => 'Ҡуйылған программалар',
'version-software-product' => 'Продукт',
'version-software-version' => 'Өлгөһө',
@@ -3131,6 +3235,15 @@ $1',
'tags-edit' => 'үҙгәртергә',
'tags-hitcount' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
+# Special:ComparePages
+'comparepages' => 'Биттәрҙе Ñағыштырыу',
+'compare-selector' => 'Биттәрҙең өлгөләрен Ñағыштырыу',
+'compare-page1' => 'БеренÑе бит',
+'compare-page2' => 'ИкенÑе бит',
+'compare-rev1' => 'БеренÑе өлгө',
+'compare-rev2' => 'ИкенÑе өлгө',
+'compare-submit' => 'Сағыштырырға',
+
# Database error messages
'dberr-header' => 'Был вики проектта ҡыйынлыҡтар бар',
'dberr-problems' => 'Ғәфү итегеҙ!
@@ -3148,8 +3261,13 @@ $1',
'htmlform-float-invalid' => 'Һеҙ һан керетмәгәнһегеҙ.',
'htmlform-int-toolow' => 'Һеҙ кереткән мәғәнә аҫҡы Ñиктән түбәнерәк — $1',
'htmlform-int-toohigh' => 'Һеҙ кереткән мәғәнә өҫкө Ñиктән юғарыраҡ — $1',
+'htmlform-required' => 'Был мәғәнә билдәләнгән булырға тейеш',
'htmlform-submit' => 'Ебәрергә',
'htmlform-reset' => 'Үҙгәртеүҙәрҙе кире алырға',
'htmlform-selectorother-other' => 'Башҡа',
+# SQLite database support
+'sqlite-has-fts' => '$1, тулы текÑÑ‚ буйынÑа Ñҙләү мөмкинлеге менән',
+'sqlite-no-fts' => '$1, тулы текÑÑ‚ буйынÑа Ñҙләү мөмкинлекһеҙ',
+
);
diff --git a/languages/messages/MessagesBar.php b/languages/messages/MessagesBar.php
index 9a110b53..ba9144d4 100644
--- a/languages/messages/MessagesBar.php
+++ b/languages/messages/MessagesBar.php
@@ -12,6 +12,8 @@
* @author Merlissimo
* @author Metalhead64
* @author Mucalexx
+ * @author The Evil IP address
+ * @author Wikifan
* @author bar.wikipedia.org administrators
* @author ✓
*/
@@ -34,7 +36,7 @@ $messages = array(
'tog-editsection' => 'Links zum beorweiten vo dé oazlnen Obschnitt åzoang',
'tog-editsectiononrightclick' => 'Oazlne Obschnitt mid am Rechtsdruckerrer beorweiten (JavaScript werd braucht)',
'tog-showtoc' => 'Ozeign vum Inhaltsvazeichnis bei Saitn mid mer ois drei Ãœbaschriftn',
-'tog-editwidth' => "Eingåbeföid erweitan, damid's in gãnzn Büidschiam ausfüid",
+'tog-rememberpassword' => 'Mid dem Browser drauerhoft ågmoydt bleim (maximaal $1 {{PLURAL:$1|Tog|Tog}})',
'tog-watchcreations' => 'Vo mir soywer eigstoyde Seiten autómaatisch bówochten',
'tog-watchdefault' => 'Vo mir soywer genderde Seiten autómaatisch bówochten',
'tog-watchmoves' => 'Vo mir soywer vaschówane Seiten autómaatisch bówochten',
@@ -159,30 +161,29 @@ $messages = array(
'mytalk' => 'Aigane Diskussion',
'anontalk' => 'Dischkrirsaiten vo derer IP-Adress',
'navigation' => 'Navigazion',
-'and' => '&#32;und',
# Cologne Blue skin
'qbfind' => 'Finden',
'qbedit' => 'werkln',
'qbmyoptions' => 'Maine Saiten',
'qbspecialpages' => 'Speziaalsaiten',
-'faq' => 'FAQ',
# Vector skin
-'vector-action-addsection' => 'Obschnit dazuafyng',
-'vector-action-delete' => 'leschn',
-'vector-action-move' => 'Vaschiam',
-'vector-action-protect' => 'Schytzen',
-'vector-action-undelete' => 'Wiaderherstöin',
-'vector-action-unprotect' => 'Fraigeem',
-'vector-view-create' => 'Erstöin',
-'vector-view-edit' => 'Werkln',
-'vector-view-history' => 'Versionsgschicht',
-'vector-view-view' => 'Leesn',
-'vector-view-viewsource' => 'Quöitext åzong',
-'actions' => 'Akzionen',
-'namespaces' => 'NÃ¥mensraim',
-'variants' => 'Variantn',
+'vector-action-addsection' => 'Obschnit dazuafyng',
+'vector-action-delete' => 'leschn',
+'vector-action-move' => 'Vaschiam',
+'vector-action-protect' => 'Schytzen',
+'vector-action-undelete' => 'Wiaderherstöin',
+'vector-action-unprotect' => 'Fraigeem',
+'vector-simplesearch-preference' => 'Daweiterte Suachvurschläg aktivirn (netter Vector)',
+'vector-view-create' => 'Erstöin',
+'vector-view-edit' => 'Werkln',
+'vector-view-history' => 'Versionsgschicht',
+'vector-view-view' => 'Leesn',
+'vector-view-viewsource' => 'Quöitext åzong',
+'actions' => 'Akzionen',
+'namespaces' => 'NÃ¥mensraim',
+'variants' => 'Variantn',
'errorpagetitle' => 'Feeler',
'returnto' => 'Zruck zur Saiten $1.',
@@ -358,7 +359,7 @@ Vagiss bittschee ned, daine [[Special:Preferences|{{SITENAME}}-Aistellungen]] å
'yourname' => 'Benytzernåm:',
'yourpassword' => 'Posswort:',
'yourpasswordagain' => 'Posswort no amoi',
-'remembermypassword' => 'auf dem Computer dauerhoft åmöiden',
+'remembermypassword' => 'Mid dem Browser dauerhoft ågmöidt blaim (maximaal $1 {{PLURAL:$1|Dog|Dog}})',
'yourdomainname' => 'Eanerne Domain:',
'externaldberror' => 'Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.',
'login' => 'Åmöiden',
@@ -375,6 +376,7 @@ Vagiss bittschee ned, daine [[Special:Preferences|{{SITENAME}}-Aistellungen]] å
'gotaccount' => "Du host scho a Benutzerkonto? '''$1'''.",
'gotaccountlink' => 'Åmöiden',
'createaccountmail' => 'per E-Mäil',
+'createaccountreason' => 'Grund',
'badretype' => 'De zwoa Posswerter stimman ned ywerai.',
'userexists' => 'Da Benytzernåm is scho vageem. Bittschee nimm an åndern her.',
'loginerror' => 'Feeler bai da Åmöidung',
@@ -456,7 +458,6 @@ Du kååst an Titl vo derer Saiten auf de åndern Saiten [[Special:Search/{{PAGE
'blocked-notice-logextract' => "{{GENDER:$1|Der Benutzer|De Benutzarin|Der Benutzer do}} is zurzeid gesperrd.
Zua da Informazion foigt a aktueller Auszug aus 'm Benutzersperr-Logbiache:",
'updated' => '(Gendert)',
-'note' => "'''Hinweis:'''",
'previewnote' => "'''Des is netter a Vurschau, d' Saiten is nu ned gspaichert worn!'''",
'previewconflict' => "De Vurschau gibt an Inhoit vom owern Textföidl wiader. So werd d' Saiten ausschaun, wånn du jetzad spaichertst.",
'session_fail_preview' => "'''Daine Beorwaitungen håm ned gspaichert wern kenna, wail Sitzungsdaaten valurn gånga san.'''
@@ -476,8 +477,6 @@ Bittschee fiag daine Enderungen ins owere Textföidl ai.
Du gibst uns dodamid dai Zuasog, dass du dén Text '''söiwer vafosst''' host, das da Text a Oigmoaguat '''(public domain)''' is, óder das da '''Urhéwer''' sai '''Zuastimmung''' geem hod. Fois der Text beraits irngdwó ånderst vaéffmtlécht worn is, moch bittschee an Hiwais in da Diskussiónssaitn.
<i>Bittschee beochtt, das olle {{SITENAME}}-Baitrég autómaatésch unter da „$2“ steengan (schau unter $1 fyr Details). Fois du néd mechst, das dai Orwait do vo ånderne vaéndert und vabroatt werd, dånn druck néd auf „Saiten spaichern“.</i>",
-'longpagewarning' => "'''Wornung:''' De Saiten is $1 kB grouss; ned a jeeder Browser kå Saiten beorwaiten, de greesser ois wia 32 kB san.
-Ywerleeg da bittschee, ob a Auftailung vo derer Saiten in koanare Obschnit meglich is.",
'semiprotectedpagewarning' => "'''Hoibsperrung:''' De Saiten is aso gsperrt worn, das netter registriarde Benytzer de endern kenna.",
'titleprotectedwarning' => "'''Ochtung: De Saitenerstöiung is aso gschytzt worn, das netter Benytzer mid [[Special:ListGroupRights|speziöie Rechte]] de Saiten erstöin kennan.'''
Zur Informazion foigt da aktuöie Logbuachaitrog:",
@@ -609,17 +608,11 @@ Mid ånderne Benutzer kåst du aa ywer de Benutzerdischkrirsaiten an Kontakt auf
'group-user-member' => 'Benutza',
'group-autoconfirmed-member' => 'Bestätigta Benutza',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Administrator',
-'group-bureaucrat-member' => 'Bürokrat',
-'group-suppress-member' => 'Oversighter',
'grouppage-user' => '{{ns:project}}:Benutza',
'grouppage-autoconfirmed' => '{{ns:project}}:Bestätigte Benutza',
-'grouppage-bot' => '{{ns:project}}:Bots',
'grouppage-sysop' => '{{ns:project}}:Administratoan',
'grouppage-bureaucrat' => '{{ns:project}}:Bürokratn',
-'grouppage-suppress' => '{{ns:project}}:Oversighter',
# Rights
'right-read' => 'Seitn lesn',
@@ -666,26 +659,26 @@ Mid ånderne Benutzer kåst du aa ywer de Benutzerdischkrirsaiten an Kontakt auf
'recentchangeslinked-to' => 'Zoagt Éndarungen auf Saiten, dé doher valinken',
# Upload
-'upload' => 'Auffeloon',
-'uploadnologin' => 'Ned ågmöidt',
-'uploadnologintext' => "Sie miassn [[Special:UserLogin|ogmeidt sei]], wenn S' Dateien hoachladn wolln.",
-'uploadlog' => 'Datei-Logbuach',
-'uploadlogpage' => 'Datei-Logbuach',
-'uploadlogpagetext' => 'Des is des Logbuach vo de hoachgladna Dateien, schaug aa unta [[Special:NewFiles|neie Dateien]].',
-'uploadedfiles' => 'Hoachgladene Dateien',
-'badfilename' => "Da Dateinam is in „$1“ g'ändat won.",
-'large-file' => 'De Dateigreß sollat nach Möglichkeit $1 net überschreitn. De Datei is $2 groaß.',
-'emptyfile' => "De hochgladene Datei is laar. Da Grund konn a Tippfehler im Dateinam sei. Bitte kontrollieren'S, ob Sie de Datei wirklich hochladn woin.",
-'successfulupload' => 'Erfolgreich hoachgladn',
-'uploadwarning' => 'Obacht',
-'uploadedimage' => 'håd „[[$1]]“ aufeglådn',
-'uploaddisabled' => "'tschuldigung, as Hochladn is deaktiviert.",
-'uploadscripted' => 'De Datei enthalt HTML- oda Scriptcode, der irrtümlichaweis von am Webbrowser ausgführt wern kinnat.',
-'watchthisupload' => 'De Saiten beowochten',
-'filewasdeleted' => 'A Datei mit dem Nama is scho oamoi hochgladn worn und zwischenzeitlich wieda glöscht worn. Bitte schaug erscht den Eintrag im $1 oo, bevor du de Datei wirklich speicherst.',
-'upload-wasdeleted' => "'''Obacht: Du ladst aa Datei hoach, de scho friara glöscht worn is.'''
+'upload' => 'Auffeloon',
+'uploadnologin' => 'Ned ågmöidt',
+'uploadnologintext' => "Sie miassn [[Special:UserLogin|ogmeidt sei]], wenn S' Dateien hoachladn wolln.",
+'uploadlog' => 'Datei-Logbuach',
+'uploadlogpage' => 'Datei-Logbuach',
+'uploadlogpagetext' => 'Des is des Logbuach vo de hoachgladna Dateien, schaug aa unta [[Special:NewFiles|neie Dateien]].',
+'uploadedfiles' => 'Hoachgladene Dateien',
+'badfilename' => "Da Dateinam is in „$1“ g'ändat won.",
+'large-file' => 'De Dateigreß sollat nach Möglichkeit $1 net überschreitn. De Datei is $2 groaß.',
+'emptyfile' => "De hochgladene Datei is laar. Da Grund konn a Tippfehler im Dateinam sei. Bitte kontrollieren'S, ob Sie de Datei wirklich hochladn woin.",
+'uploadwarning' => 'Obacht',
+'uploadedimage' => 'håd „[[$1]]“ aufeglådn',
+'uploaddisabled' => "'tschuldigung, as Hochladn is deaktiviert.",
+'uploadscripted' => 'De Datei enthalt HTML- oda Scriptcode, der irrtümlichaweis von am Webbrowser ausgführt wern kinnat.',
+'watchthisupload' => 'De Saiten beowochten',
+'filewasdeleted' => 'A Datei mit dem Nama is scho oamoi hochgladn worn und zwischenzeitlich wieda glöscht worn. Bitte schaug erscht den Eintrag im $1 oo, bevor du de Datei wirklich speicherst.',
+'upload-wasdeleted' => "'''Obacht: Du ladst aa Datei hoach, de scho friara glöscht worn is.'''
Bittschee prüf gnau, ob as erneite Hoachladn de Richtlinien entspricht.
Zu deina Information folgt des Lösch-Logbuach mit da Begründung fia de vorherige Löschung:",
+'upload-success-subj' => 'Erfolgreich hoachgladn',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL is net erreichbar',
@@ -743,7 +736,6 @@ A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
'statistics' => 'Statistik',
'statistics-mostpopular' => 'Am meistn bsuachte Seitn',
-'disambiguationspage' => 'Template:Begriffsklärung',
'disambiguations-text' => 'De folgenden Seitn valinkn auf a Seitn zur Begriffsklärung.
Sie solltn stattdessn auf de eigentlich gemoante Seitn valinkn.<br />A Seitn werd ois Begriffsklärungsseitn behandelt, wenn [[MediaWiki:Disambiguationspage]] auf sie valinkt.<br />
Links aus Namensräume wern da net aufglistet.',
@@ -826,7 +818,6 @@ Links aus Namensräume wern da net aufglistet.',
# Watchlist
'watchlist' => 'Beobachtungslistn',
'mywatchlist' => 'Beowochtungslisten',
-'watchlistfor' => "(fia '''$1''')",
'watchlistanontext' => 'Sie miaßn si $1, um Eanane Beobachtungslistn zum seng oda Einträge auf ihr zum bearbatn.',
'watchnologin' => 'Sie san net ogmeidt',
'addedwatch' => 'Zua Beobachtungslistn dazuado',
@@ -1001,7 +992,6 @@ Zur da Aufheewung vo da Sperrn schau unter da [[Special:IPBlockList|Listen vo ol
'ipb-edit-dropdown' => 'Sperrgrynd beorwaiten',
'ipb-unblock-addr' => '„$1“ fraigeem',
'ipb-unblock' => 'IP-Adress/Benytzer fraigeem',
-'ipb-blocklist-addr' => 'Aktuelle Sperrn fyr „$1“ åzoang',
'ipb-blocklist' => 'Olle aktuöin Sperrn åzaang',
'ipb-blocklist-contribs' => 'Benytzerbaiträg vo „$1“',
'unblockip' => 'IP-Adress fraigeem',
@@ -1180,9 +1170,9 @@ Vorschau der Änderungen an dieser Seite. Bitte vor dem Speichern benutzen!",
'nextdiff' => 'zum nextn Untaschied in de Veasionen →',
# Media information
-'file-info-size' => '($1 × $2 Pixl, Dateigreßn: $3, MIME-Typ: $4)',
+'file-info-size' => '$1 × $2 Pixl, Dateigreßn: $3, MIME-Typ: $4',
'file-nohires' => '<small>Es gibt ka hechane Auflösung.</small>',
-'svg-long-desc' => '(SVG-Datei, Basisgreß: $1 × $2 Pixl, Dateigreß: $3)',
+'svg-long-desc' => 'SVG-Datei, Basisgreß: $1 × $2 Pixl, Dateigreß: $3',
'show-big-image' => 'Version in hechana Auflösung',
'show-big-image-thumb' => '<small>Greßn vu da Voaãnsicht: $1 × $2 Pixl</small>',
diff --git a/languages/messages/MessagesBat_smg.php b/languages/messages/MessagesBat_smg.php
index 7cf68a27..d32e58ac 100644
--- a/languages/messages/MessagesBat_smg.php
+++ b/languages/messages/MessagesBat_smg.php
@@ -1,5 +1,8 @@
<?php
-/** Samogitian (Žemaitėška)
+/** Samogitian
+ *
+ * ISO 639-3 code 'sgs' should be used. This is code is maintained for backward
+ * compatilibity.
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
@@ -7,1942 +10,6 @@
* @ingroup Language
* @file
*
- * @author Hugo.arg
- * @author Urhixidur
- * @author Zordsdavini
- * @author לערי ריינה×רט
*/
-$fallback = 'lt';
-
-$namespaceNames = array(
- NS_MEDIA => 'MedÄ—jÄ—',
- NS_SPECIAL => 'Specēlos',
- NS_TALK => 'AptarÄ—ms',
- NS_USER => 'Nauduotuos',
- NS_USER_TALK => 'NauduotuojÄ—_aptarÄ—ms',
- NS_PROJECT_TALK => '$1_aptarÄ—ms',
- NS_FILE => 'Abruozdielis',
- NS_FILE_TALK => 'AbruozdielÄ—_aptarÄ—ms',
- NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_aptarÄ—ms',
- NS_TEMPLATE => 'Å abluons',
- NS_TEMPLATE_TALK => 'Å abluona_aptarÄ—ms',
- NS_HELP => 'Pagelba',
- NS_HELP_TALK => 'Pagelbas_aptarÄ—ms',
- NS_CATEGORY => 'KateguorÄ—jÄ—',
- NS_CATEGORY_TALK => 'KateguorÄ—jÄ—s_aptarÄ—ms',
-);
-
-/**
- * Aliases from the fallback language 'lt' to avoid breakage of links
- */
-
-$namespaceAliases = array(
- 'Specialus' => NS_SPECIAL,
- 'Aptarimas' => NS_TALK,
- 'Naudotojas' => NS_USER,
- 'Naudotojo_aptarimas' => NS_USER_TALK,
- '$1_aptarimas' => NS_PROJECT_TALK,
- 'Vaizdas' => NS_FILE,
- 'Vaizdo_aptarimas' => NS_FILE_TALK,
- 'MediaWiki_aptarimas' => NS_MEDIAWIKI_TALK,
- 'Å ablonas' => NS_TEMPLATE,
- 'Å ablono_aptarimas' => NS_TEMPLATE_TALK,
- 'Pagalba' => NS_HELP,
- 'Pagalbos_aptarimas' => NS_HELP_TALK,
- 'Kategorija' => NS_CATEGORY,
- 'Kategorijos_aptarimas' => NS_CATEGORY_TALK,
-);
-
-$messages = array(
-# User preference toggles
-'tog-underline' => 'Pabrauktė nūruodas:',
-'tog-highlightbroken' => 'FuormoutÄ— nasontiu poslapiu nÅ«ruodas <a href="#" class="new">Å¡Ä—tÄ“p</a> (prÄ«Å¡Ä—ngÄ - Å¡Ä—tÄ“p <a href="#" class="internal">?</a>).',
-'tog-justify' => 'Līgintė pastraipas palē abi poses',
-'tog-hideminor' => 'PakavuotÄ— mažus pataisÄ—mus vielÄ«bÅ«ju taisÄ«mu sÄraÅ¡Ä—',
-'tog-extendwatchlist' => 'Ä–Å¡pliestÄ— keravuojamu sÄraÅ¡a, kÅ« ruodÄ«tu vÄ—sus tÄ—nkamus pakeitÄ—mus',
-'tog-usenewrc' => 'PažongÄ“ ruodomÄ— vielibÄ—Ì…jÄ— pakeitÄ—mÄ (JavaScript)',
-'tog-numberheadings' => 'AutuomatÄ—Å¡kÄ numeroutÄ— skÄ—rsnelios',
-'tog-showtoolbar' => 'Ruodītė redagavėma rakondinė (JavaScript)',
-'tog-editondblclick' => 'Poslapiu redagavÄ—ms dvÄ—gobu paspaudÄ—mu (JavaScript)',
-'tog-editsection' => 'Ijongtė skėrsneliu redagavėma nauduojant nūruodas [taisītė]',
-'tog-editsectiononrightclick' => 'Ijongtė skėrsneliu redagavėma paspaudos skėrsnelė pavadėnėma<br />dešėniouju pelies klavėšu (JavaScript)',
-'tog-showtoc' => 'RuodÄ«tÄ— torÄ—ni, jÄ“ poslapÄ« daugiau kÄp 3 skÄ—rsnelÄ“',
-'tog-rememberpassword' => 'Atmintė prėsėjongėma infuormacėjė šėtom kuompioterī',
-'tog-editwidth' => 'PÄ—lna pluotÄ— redagavÄ—ma lauks',
-'tog-watchcreations' => 'PridietÄ— poslapius, katrÅ«s sokorio, i keravuojamu sÄraÅ¡a',
-'tog-watchdefault' => 'PridietÄ— poslapius, katrÅ«s taisau, i keravuojamu sÄraÅ¡a',
-'tog-watchmoves' => 'PridietÄ— poslapius, katrÅ«s parkelio, i keravuojamu sÄraÅ¡a',
-'tog-watchdeletion' => 'PridietÄ— poslapius, katrÅ«s Ä—Å¡trino, i keravuojamu sÄraÅ¡a',
-'tog-minordefault' => 'PalÄ“ nutÄ«liejÄ—ma pažīmietÄ— redagavÄ—mus kÄp mažus',
-'tog-previewontop' => 'Ruodītė parvaiza vėrš redagavėma lauka',
-'tog-previewonfirst' => 'Ruodītė straipsnė parvėiza pėrmu redagavėmu',
-'tog-nocache' => "NenauduotÄ— poslapiu kaupÄ—ma (''caching'')",
-'tog-enotifwatchlistpages' => 'SiÅstÄ— mon gromata, kÅ«met pakeitams poslapis, katra stebiu',
-'tog-enotifusertalkpages' => 'SiÅstÄ— mon gromata, kÅ«met pakaitams mona nauduotuojÄ— aptarÄ—ma poslapis',
-'tog-enotifminoredits' => 'SiÅstÄ— mon gromata, kÅ«met poslapÄ— keitÄ—ms Ä«r mažos',
-'tog-enotifrevealaddr' => 'Ruodītė mona el. pašta adresa primėnėma gromatuos',
-'tog-shownumberswatching' => 'Ruodītė keravuojantiu nauduotuoju skatliu',
-'tog-fancysig' => 'Parašos ba autuomatėniu nūruodu',
-'tog-externaleditor' => 'Palē nutīliejėma nauduotė ėšuorini radaktuoriu',
-'tog-externaldiff' => 'Palē nutīliejėma nauduotė ėšuorinė skėrtomu ruodīma pruograma',
-'tog-showjumplinks' => 'Ijongtė „paršuoktė i“ pasėikiamoma nūruodas',
-'tog-uselivepreview' => 'NauduotÄ— tÄ—isiogÄ—ne parvÄ—iza (JavaScript) (EksperimentÄ—nis)',
-'tog-forceeditsummary' => 'KlaustÄ—, kumet palÄ—iku toÅ¡ÄÄ“ pakeitÄ—ma kuomentara',
-'tog-watchlisthideown' => 'Kavuotė mona pakeitėmos keravuojamu sarašė',
-'tog-watchlisthidebots' => 'KavuotÄ— robotu pakeitÄ—mos keravuojamu sÄraÅ¡Ä—',
-'tog-watchlisthideminor' => 'Kavuotė mažos pakeitėmos keravuojamu sarašė',
-'tog-watchlisthideliu' => 'KavuotÄ— prisÄ—jongosium nauduotuojum keitÄ—mus keravuojamu sÄroÅ¡Ä—',
-'tog-watchlisthideanons' => 'Kavuotė anonimėniu nauduotuoju keitėmus keravuojamu sarašė',
-'tog-nolangconversion' => 'Ä–Å¡jongtÄ— variantu keitÄ—ma',
-'tog-ccmeonemails' => 'SiÅstÄ— mon gromatu kopÄ—jÄ—s, katros siontiu kÄ—tÄ—ims nauduotojams',
-'tog-diffonly' => 'NeruodÄ«tÄ— poslapÄ— torÄ—nÄ— puo skÄ—rtomÄs',
-'tog-showhiddencats' => 'Ruodītė pakavuotas kateguorėjės',
-'tog-norollbackdiff' => 'Nekrēptė diemesė i skėrtoma atlėkus atmetėma',
-
-'underline-always' => 'Visumet',
-'underline-never' => 'Nikumet',
-'underline-default' => 'Palē naršīklės nostatīmos',
-
-# Dates
-'sunday' => 'sekma dÄ—ina',
-'monday' => 'pÄ—rmadÄ—inis',
-'tuesday' => 'ontradÄ—inis',
-'wednesday' => 'treÄiadÄ—inis',
-'thursday' => 'ketvÄ—rtadÄ—inis',
-'friday' => 'pÄ—nktadÄ—inis',
-'saturday' => 'subata',
-'sun' => 'Sekm',
-'mon' => 'PÄ—rm',
-'tue' => 'Ontr',
-'wed' => 'TreÄ',
-'thu' => 'Ketv',
-'fri' => 'PÄ—nk',
-'sat' => 'Sub',
-'january' => 'sausÄ—',
-'february' => 'vasarÄ—',
-'march' => 'kuova',
-'april' => 'balondÄ—',
-'may_long' => 'gegožės',
-'june' => 'bėrželė',
-'july' => 'lÄ—ipas',
-'august' => 'rogpjūtė',
-'september' => 'siejÄ—s',
-'october' => 'spalÄ—',
-'november' => 'lapkrÄ—stÄ—',
-'december' => 'groudÄ—',
-'january-gen' => 'Sausis',
-'february-gen' => 'Vasaris',
-'march-gen' => 'Kuovs',
-'april-gen' => 'Balondis',
-'may-gen' => 'Gegožė',
-'june-gen' => 'Bėrželis',
-'july-gen' => 'LÄ—ipa',
-'august-gen' => 'Rogpjūtis',
-'september-gen' => 'SiejÄ—',
-'october-gen' => 'Spalis',
-'november-gen' => 'LapkrÄ—stis',
-'december-gen' => 'Groudis',
-'jan' => 'sau',
-'feb' => 'vas',
-'mar' => 'kuo',
-'apr' => 'bal',
-'may' => 'geg',
-'jun' => 'bÄ—r',
-'jul' => 'lÄ—i',
-'aug' => 'rgp',
-'sep' => 'sie',
-'oct' => 'spa',
-'nov' => 'lap',
-'dec' => 'grd',
-
-# Categories related messages
-'pagecategories' => '{{PLURAL:$1|KateguorÄ—jÄ—|KateguorÄ—jÄ—s|KateguorÄ—ju}}',
-'category_header' => 'Kateguorėjės „$1“ straipsnē',
-'subcategories' => 'SubkateguorÄ—jÄ—s',
-'category-media-header' => 'Abruozdielis kateguorėjuo „$1“',
-'category-empty' => "''Å Ä—ta kateguorÄ—jÄ— nÅ«nÄ netor nÄ— vÄ—ina straipsnÄ— a faila.''",
-'hidden-categories' => '{{PLURAL:$1|Pakavuota kateguorÄ—jÄ—|Pakavuotas kateguorÄ—jÄ—s}}',
-'hidden-category-category' => 'Pakavuotas kateguorÄ—jÄ—s',
-'category-subcat-count' => '{{PLURAL:$2|Tuo kateguorÄ—juo Ä«r vÄ—ina subkateguorÄ—jÄ—.|{{PLURAL:$1|Ruodoma|Ruodomas|Ruodoma}} $1 {{PLURAL:$1|subkateguorÄ—jÄ—|subkateguorÄ—jÄ—s|subkateguorÄ—ju}} (Ä—Å¡ vÄ—sa Ä«r $2 {{PLURAL:$2|subkateguorÄ—jÄ—|subkateguorÄ—jÄ—s|subkateguorÄ—ju}}).}}',
-'category-article-count' => '{{PLURAL:$2|Tuo kateguorėjuo īr vėins poslapis.|{{PLURAL:$1|Ruodoms|Ruodomė|Ruodoma}} $1 tuos kateguorėjės {{PLURAL:$1|poslapis|poslapē|poslapiu}} (ėš vėsa kateguorėjuo īr $2 {{PLURAL:$2|poslapis|poslapē|poslapiu}}).}}',
-'listingcontinuesabbrev' => 'tes.',
-
-'about' => 'Aple',
-'article' => 'Straipsnis',
-'newwindow' => '(Ä«r atverams naujam longÄ—)',
-'cancel' => 'NutrauktÄ—',
-'moredotdotdot' => 'Daugiau...',
-'mypage' => 'Mona poslapis',
-'mytalk' => 'Mona aptarÄ—ms',
-'anontalk' => 'Å Ä—ta IP aptarÄ—ms',
-'navigation' => 'Naršīms',
-'and' => '&#32;Ä—r',
-
-# Cologne Blue skin
-'qbfind' => 'Ėiškuotė',
-'qbbrowse' => 'Naršītė',
-'qbedit' => 'Taisītė',
-'qbpageoptions' => 'Tas poslapis',
-'qbpageinfo' => 'Konteksts',
-'qbmyoptions' => 'Mona poslapē',
-'qbspecialpages' => 'Specēlė̅jė poslapē',
-'faq' => 'DOK',
-'faqpage' => 'Project:DOK',
-
-# Vector skin
-'vector-action-addsection' => 'PridietÄ— tema',
-'vector-action-delete' => 'TrintÄ—',
-'vector-action-move' => 'ParvadintÄ—',
-'vector-action-protect' => 'Ožrakintė',
-'vector-action-undelete' => 'AtkortÄ—',
-'vector-action-unprotect' => 'AtrakintÄ—',
-'vector-namespace-category' => 'KateguorÄ—jÄ—',
-'vector-namespace-help' => 'Pagelbas poslapis',
-'vector-namespace-image' => 'Fails',
-'vector-namespace-main' => 'Poslapis',
-'vector-namespace-media' => 'AbruozdielÄ— poslapis',
-'vector-namespace-mediawiki' => 'Pranešims',
-'vector-namespace-project' => 'Pruojekta poslapis',
-'vector-namespace-special' => 'Specēlos poslapis',
-'vector-namespace-talk' => 'AptarÄ—ms',
-'vector-namespace-template' => 'Å abluons',
-'vector-namespace-user' => 'NauduotuojÄ— poslapis',
-'vector-view-create' => 'SokortÄ—',
-'vector-view-edit' => 'Taisītė',
-'vector-view-history' => 'VeizietÄ— istuorÄ—jÄ—',
-'vector-view-view' => 'Skaitītė',
-'vector-view-viewsource' => 'VeizietÄ— kuoda',
-'actions' => 'VÄ“ksmÄ',
-'namespaces' => 'Vardū srėtīs',
-'variants' => 'VariantÄ',
-
-'errorpagetitle' => 'Klaida',
-'returnto' => 'Grīžtė i $1.',
-'tagline' => 'Straipsnis Ä—Å¡ {{SITENAME}}.',
-'help' => 'Pagelba',
-'search' => 'Ėiškuotė',
-'searchbutton' => 'Ėiškuok',
-'go' => 'Ä’k',
-'searcharticle' => 'Ä’k',
-'history' => 'PoslapÄ— istuorÄ—jÄ—',
-'history_short' => 'IstuorÄ—jÄ—',
-'updatedmarker' => 'atnaujėnta nu paskotėnė mona apsėlonkīma',
-'info_short' => 'InfuormacÄ—jÄ—',
-'printableversion' => 'VersÄ—jÄ— spausdintÄ—',
-'permalink' => 'Nulatėnė nūruoda',
-'print' => 'SpausdÄ—ntÄ—',
-'edit' => 'Taisītė',
-'create' => 'SokortÄ—',
-'editthispage' => 'Taisītė ton poslapė',
-'create-this-page' => 'SokortÄ— ta poslapi',
-'delete' => 'TrintÄ—',
-'deletethispage' => 'TrintÄ— ton poslapÄ—',
-'protect' => 'Ožrakintė',
-'protect_change' => 'pakeistÄ—',
-'protectthispage' => 'Ožrakintė šėta poslapi',
-'unprotect' => 'AtrakintÄ—',
-'unprotectthispage' => 'AtrakintÄ— Å¡Ä—ta poslapi',
-'newpage' => 'Naus poslapis',
-'talkpage' => 'AptartÄ— Å¡Ä—ta poslapi',
-'talkpagelinktext' => 'AptarÄ—ms',
-'specialpage' => 'Specēlosis poslapis',
-'personaltools' => 'PersuonalÄ—nÄ“ rakondÄ',
-'postcomment' => 'Rašītė kuomentara',
-'articlepage' => 'VeizietÄ— straipsnÄ—',
-'talk' => 'AptarÄ—ms',
-'views' => 'ParveizÄ—tÄ—',
-'toolbox' => 'RakondÄ',
-'userpage' => 'Ruodītė nauduotoja poslapi',
-'projectpage' => 'Ruodītė pruojekta poslapi',
-'imagepage' => 'VeizietÄ— abruozdielÄ— poslapi',
-'mediawikipage' => 'Ruodītė pranešėma poslapi',
-'templatepage' => 'Ruodītė šabluona poslapi',
-'viewhelppage' => 'Ruodītė pagelbuos poslapi',
-'categorypage' => 'Ruodītė kateguorėjės poslapi',
-'viewtalkpage' => 'Ruodītė aptarėma poslapi',
-'otherlanguages' => 'KÄ—tuom kalbuom',
-'redirectedfrom' => '(Nokreipta Ä—Å¡ $1)',
-'redirectpagesub' => 'NokreipÄ—ma poslapis',
-'lastmodifiedat' => 'Å Ä—ts poslapis paskotini karta pakeists $1 $2.',
-'viewcount' => 'Tas poslapis bova atverts $1 {{PLURAL:$1|Äiesa|Äiesus|Äiesu}}.',
-'protectedpage' => 'Ožrakints poslapis',
-'jumpto' => 'Paršuoktė i:',
-'jumptonavigation' => 'navÄ—gacÄ—jÄ—',
-'jumptosearch' => 'paėiška',
-
-# 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' => 'Aple {{SITENAME}}',
-'aboutpage' => 'Project:Aple',
-'copyright' => 'Turinīs pateikts so $1 licencėjė.',
-'copyrightpage' => '{{ns:project}}:Autuoriu teisÄ—s',
-'currentevents' => '** Vielībė̅jė ivīkē **',
-'currentevents-url' => 'Project:Vielībė̅jė ivīkē',
-'disclaimers' => 'Atsakuomībės aprėbuojims',
-'disclaimerpage' => 'Project:Atsakuomībės aprėbuojims',
-'edithelp' => 'KÄp redagoutÄ—',
-'edithelppage' => 'Help:RedagavÄ—ms',
-'helppage' => 'Help:Torėnīs',
-'mainpage' => 'PÄ—rms poslapis',
-'mainpage-description' => 'PÄ—rms poslapis',
-'policy-url' => 'Project:PuolitÄ—ka',
-'portal' => 'Kuolektīvs',
-'portal-url' => 'Project:Kuolektīvs',
-'privacy' => 'Privatoma puolitÄ—ka',
-'privacypage' => 'Project:Privatoma puolitÄ—ka',
-
-'badaccess' => 'PrivÄ—lÄ—ju klaida',
-'badaccess-group0' => 'TomstÄ nelÄ“dama ivÄ«kdÄ«tÄ— veiksma, katruo praÅ¡iet.',
-
-'ok' => 'GerÄ',
-'retrievedfrom' => 'Gautė ėš „$1“',
-'youhavenewmessages' => 'Tamsta toret $1 ($2).',
-'newmessageslink' => 'naujū žėnotiu',
-'newmessagesdifflink' => 'paskotinis pakeitÄ—ms',
-'youhavenewmessagesmulti' => 'Toret naujū žėnotiu $1',
-'editsection' => 'taisītė',
-'editold' => 'taisītė',
-'viewsourceold' => 'veizietÄ— Å¡altÄ—ni',
-'editlink' => 'keistÄ—',
-'viewsourcelink' => 'veizietÄ— kuoda',
-'editsectionhint' => 'RedagoutÄ— skirsneli: $1',
-'toc' => 'Torėnīs',
-'showtoc' => 'ruodītė',
-'hidetoc' => 'kavuotÄ—',
-'thisisdeleted' => 'VeizÄ—tÄ— a atkortÄ— $1?',
-'viewdeleted' => 'Ruodītė $1?',
-'restorelink' => '$1 {{PLURAL:$1|ėštrinta keitėma|ėštrintos keitėmos|ėštrintū keitėmu}}',
-'feedlinks' => 'Å altÄ—nis:',
-'site-rss-feed' => '$1 RSS Å¡altÄ—nis',
-'site-atom-feed' => '$1 Atom Å¡altÄ—nis',
-'page-rss-feed' => '„$1“ RSS šaltėnis',
-'page-atom-feed' => '„$1“ Atom šaltėnis',
-'red-link-title' => '$1 (poslapis da neparašīts)',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Poslapis',
-'nstab-user' => 'NauduotuojÄ— poslapis',
-'nstab-media' => 'AbruozdielÄ— poslapis',
-'nstab-special' => 'Specēlos poslapis',
-'nstab-project' => 'Proujekta poslapis',
-'nstab-image' => 'Fails',
-'nstab-mediawiki' => 'Teksts',
-'nstab-template' => 'Å abluons',
-'nstab-help' => 'Pagelbuos poslapis',
-'nstab-category' => 'KateguorÄ—jÄ—',
-
-# Main script and global functions
-'nosuchaction' => 'Nier tuokÄ— veiksma',
-'nosuchspecialpage' => 'Nier tuokė specēlėjė poslapė',
-'nospecialpagetext' => 'Tamsta praÅ¡iet nelaistÄ—na specÄ“lÄ—Ì…jÄ— poslapÄ—, laistÄ—nÅ« specÄ“liÅ«ju poslapiu sÅraÅ¡a rasÄ—t [[Special:SpecialPages|specÄ“liÅ«ju poslapiu sÄroÅ¡Ä—]].',
-
-# General errors
-'error' => 'Klaida',
-'databaseerror' => 'Doumenū bazės klaida',
-'laggedslavemode' => 'Diemesė: Poslapī gal nesmatītė naujausiu pakeitėmu.',
-'readonly' => 'Doumenū bazė ožrakėnta',
-'enterlockreason' => 'Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta',
-'readonlytext' => 'Doumenū bazė daba īr ožrakėnta naujėm irašam a kėtėm keitėmam,
-mažo doumenÅ« bazÄ—s techninÄ“ pruofilaktÄ—kÄ,
-puo tuo vėsks griš i sava viežes.
-Ožrakėnusiuojo admėnėstratuoriaus pateikts rakėnima paaiškėnims: $1',
-'missing-article' => 'Doumenū bazė nerada poslapė teksta, katra ana torietu rastė, pavadėnta „$1“ $2.
-
-PaprastÄ tas bÅ«n dielÄ“ pasenosÄ—s skÄ—rtoma vuo istuorÄ—jÄ—s nÅ«ruodas i poslapi, katros bova Ä—Å¡trÄ—nts.
-
-Jēgo tas nie šėts varėjants, Tamsta mažo raduot klaida pruogramėnė ironguo.
-PraÅ¡uom aple Å¡Ä—tÄ paskelbtÄ— [[Special:ListUsers/sysop|adminÄ—stratoriÅ]], nepamÄ—rÅ¡damÄ— nuruodÄ«tÄ— nÅ«ruoda.',
-'missingarticle-rev' => '(versÄ—jÄ—#: $1)',
-'missingarticle-diff' => '(SkÄ—rt.: $1, $2)',
-'readonly_lag' => 'DoumenÅ« bazÄ— bova autuomatÄ—Å¡kÄ ožrakÄ—nta, kuol pagelbinÄ—s doumenÅ« bazÄ—s pasvÄ«s pagrÄ—ndine',
-'internalerror' => 'VÄ—dÄ—nÄ— klaida',
-'internalerror_info' => 'VÄ—dÄ—nÄ— klaida: $1',
-'filecopyerror' => 'Nepavīkst kopėjoutė faila ėš „$1“ i „$2“.',
-'filerenameerror' => 'Nepavīkst parvardėntė faila ėš „$1“ i „$2“.',
-'filenotfound' => 'Nepavīkst rastė faila „$1“.',
-'fileexistserror' => 'Nepavīkst irašītė i faila „$1“: tas fails jau īr',
-'unexpected' => 'Natėkieta raikšmie: „$1“=„$2“.',
-'cannotdelete' => 'Nepavīka ėštrintė nuruodīta poslapė a faila. (Mažo kažkas padarė pėrmesnis šėta)',
-'badtitle' => 'Bluogs pavadÄ—nÄ—ms',
-'badtitletext' => 'NuruodÄ«ts poslapÄ— pavadÄ—nÄ—ms bova neleistÄ—ns, toÅ¡ÄÄ—s a neteisÄ—ngÄ sojongts terpkalbinis a terppruojektÄ—nis pavadÄ—nÄ—ms. AnamÄ— gal bÅ«tÄ— vÄ—ins a daugiau sÄ—mbuoliu, neleistÄ—nÅ« pavadÄ—nÄ—mÅ«s',
-'perfcachedts' => 'Ruodoma ėšsauguota doumenū kopėjė, katra bova atnaujėnta $1.',
-'querypage-no-updates' => 'AtnaujÄ—nÄ—mÄ tam poslapiÅ nÅ«nÄ Ä—Å¡jongtÄ— Ä«r. DoumenÄ«s nÅ«nÄ ÄÄ— nebus atnaujÄ—ntÄ—.',
-'wrong_wfQuery_params' => 'NetaisingÄ— parametrÄ i funkcÄ—jÄ— wfQuery()<br />
-FunkcÄ—jÄ—: $1<br />
-Ožklausėms: $2',
-'viewsource' => 'VeizÄ—tÄ— kuoda',
-'viewsourcefor' => 'poslapiÅ $1',
-'protectedpagetext' => 'Šėts poslapis īr ožrakints, saugont anū nū redagavėma.',
-'viewsourcetext' => 'Tomsta galÄ—t veizietÄ— Ä—r kopÄ—joutÄ— poslapÄ— kuoda:',
-'protectedinterface' => 'Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.',
-'editinginterface' => "'''DiemesÄ—:''' Tamsta keitat poslapi, katros Ä«r nauduojams programÄ—nÄ—s irongas sÅsajÄ—s tekstÄ—. PakeitÄ—mÄ tamÄ— poslapÅ« tÄ“puogi pakeis nauduotuojÄ— sÅsajÄ—s Ä—Å¡ruoda Ä— kÄ—tÄ—ims nauduotujams. JÄ“go nuorÄ—t pargoldÄ«tÄ—, siÅ«luom pasÄ—nauduotÄ— [http://translatewiki.net/wiki/Main_Page?setlang=bat-smg „translatewiki.net“], „MediaWiki“ lokalÄ—zacÄ—jÄ—s pruojÄ—ktu.",
-'sqlhidden' => '(SQL ožklausa pakavuota)',
-'namespaceprotected' => "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
-'ns-specialprotected' => 'Specēlė̅ jė poslapē negal būtė keitamė.',
-
-# Login and logout pages
-'logouttext' => "'''Daba Tamsta esat atsÄ—jongÄ—s.'''
-
-GalÄ—t Ä— tuoliau nauduotÄ— {{SITENAME}} anuonimÄ—Å¡kÄ aba prisÄ—jonkÄ—t Ä—Å¡ naujÄ— Å¡Ä—tuo patiu a kÄ—to nauduotuojÄ— vardu.
-Pastebiejims: katruos nekatruos poslapiuos Ä— tuoliau gal ruodÄ«tÄ— bÅ«ktÄ bÅ«tomiet prisÄ—jongÄ—s lÄ—gÄ— tuol, kumet Ä—Å¡valÄ«sÄ—t sava narÅ¡Ä«klÄ—s dietovÄ— (''cache'').",
-'welcomecreation' => '== Svēkė, $1! ==
-
-Tamstas paskīra bova sokorta. Neožmėrškėt pakeistė sava {{SITENAME}} nustatīmu.',
-'yourname' => 'NauduotuojÄ— vards:',
-'yourpassword' => 'Slaptažuodis:',
-'yourpasswordagain' => 'Pakartuoket slaptažuodė:',
-'remembermypassword' => 'AtmintÄ— Å¡Ä—ta infuormacÄ—jÄ— Å¡Ä—tom kuompioteri',
-'yourdomainname' => 'Tamstas domens:',
-'login' => 'PrisÄ—jongtÄ—',
-'nav-login-createaccount' => 'Prėsėjongtė / sokortė paskīra',
-'loginprompt' => 'Ijonkėt pakavukus, jēgo nuorėt prisėjongtė pri {{SITENAME}}.',
-'userlogin' => 'Prėsėjongtė / sokortė paskīra',
-'logout' => 'AtsÄ—jongtÄ—',
-'userlogout' => 'AtsÄ—jongtÄ—',
-'notloggedin' => 'NeprisÄ—jongis',
-'nologin' => "NetorÄ—t prisÄ—jongÄ—ma varda? '''$1'''.",
-'nologinlink' => 'Sokorkėt paskīra',
-'createaccount' => 'Sokortė paskīra',
-'gotaccount' => "Jau torėt paskīra? '''$1'''.",
-'gotaccountlink' => 'PrisÄ—jonkÄ—t',
-'badretype' => 'Ivestė slaptažuodē nesotamp.',
-'userexists' => 'Irašīts nauduotuojė vards jau īr nauduojams.
-Prašuom pasėrėnktė kėtuoki varda.',
-'loginerror' => 'PrisÄ—jongÄ—ma klaida',
-'nocookiesnew' => 'Nauduotuojė paskīra bova sokurta, ale Tamsta nēsot prisėjongis. {{SITENAME}} nauduo pakavukus, kū prijongtu nauduotuojus. Tamsta esot ėšjongis anūs. Prašuom ijongtė pakavukus, tumet prisėjonkėt so sava nauju nauduotuojė vardu ė slaptažuodiu.',
-'nocookieslogin' => "Vikipedėjė nauduo pakavukus (''cookies''), kū prijongtu nauduotuojus. Tamsta esat ėšjongės anūs. Prašuom ijongtė pakavukus ė pamiegītė viel.",
-'loginsuccesstitle' => 'SiekmingÄ prisÄ—jongiet.',
-'loginsuccess' => "'''NÅ«nÄ Tamsta esot prisÄ—jongÄ—s pri {{SITENAME}} kÄp „$1“.'''",
-'nosuchuser' => 'Nier anėjuokė nauduotuojė pavadėnta „$1“.
-Patikrėnkėt rašība, aba [[Special:UserLogin/signup|sokorkėt naujė paskīra]].',
-'nosuchusershort' => 'Nier juokė nauduotuojė, pavadėnta „$1“. Patėkrinkėt rašība.',
-'nouserspecified' => 'TamstÄ rÄ“k nuruodÄ«tÄ— nauduotuojÄ— varda.',
-'wrongpassword' => 'Ivests neteisings slaptažuodis. Pameginket dÄ karta.',
-'wrongpasswordempty' => 'Ivests slaptažuodis īr tošts. Pameginket vielėk.',
-'passwordtooshort' => 'Tamstas slaptažuodis nier laistėns aba par tromps īr. Ans tor būtė nuors {{PLURAL:$1|1 sėmbuolė|$1 sėmbuoliu}} ėlgoma ė skėrtės nū Tamstas nauduotuojė varda.',
-'mailmypassword' => 'AtsiÅstÄ— naujÄ— slaptažuodi paÅ¡to',
-'passwordremindertitle' => 'Laikėns {{SITENAME}} slaptažuodis',
-'passwordremindertext' => 'KažkastÄ (tÄ—kriausÄ“ Tamsta, IP adreso $1)
-papraÅ¡Ä—, kÅ« atsiÅstomiet naujÄ— slaptažuodi pruojektÅ {{SITENAME}} ($4).
-LaikÄ—ns slaptažuodis nauduotuojŠ„$2“ bova sokorts Ä—r nustatÄ«ts kÄp „$3“.
-Jēgo Tamsta nuoriejot ana pakeistė tūmet torietomiet prisėjongtė ė daba pakeistė sava slaptažuodi.
-
-Jēgo kažkas kėts atlėka ta prašīma aba Tamsta prisėmėniet sava slaptažuodi ė
-nebnuorÄ—t ana pakeistÄ—, Tamsta galÄ—t tÄ—isiuog nekreiptÄ— diemiesÄ— Ä— Å¡Ä—ta gruomata Ä— tuoliau
-nauduotis sava senu slaptažuodžiu.',
-'noemail' => 'Nier anėjuokė el. pašta adresa ivesta nauduotuojŠ„$1“.',
-'passwordsent' => 'Naus slaptažuodis bova nusiÅsts i el. paÅ¡ta adresa,
-ožregėstrouta nauduotuojė „$1“.
-Prašuom prisėjongtė vielē, kumet Tamsta gausėt anū.',
-'blocked-mailpassword' => 'Tamstas IP adresos īr ožblokouts nū redagavėma, tudie neleidama nauduotė slaptažuodė priminėma funkcėjės, kū apsėsauguotomė nū pėktnaudžēvėma.',
-'eauthentsent' => 'PatvÄ—rtÄ—nÄ—ma gruomata bova nusiÅsta i paskÄ—rta el. paÅ¡ta adresa.
-PrÄ«Å¡ Ä—Å¡siontiant kÄ—ta gruomata i Tamstas diežote, Tamsta torÄ—t vÄ«kdÄ«tÄ— nuruodÄ«mus gruomatuo, kÅ« patvÄ—rtÄ—ntomiet, kÅ« diežotÄ— tÄ—krÄ Ä«r Tamstas.',
-'throttled-mailpassword' => 'Slaptažuodžė priminims jau bova Ä—Å¡siÅsts, par paskotÄ—nes $1 adÄ«nas. Nuorint apsÄ—sauguotÄ— nÅ« pÄ—ktnaudžēvÄ—ma, slaptažuodÄ— priminims gal bÅ«t Ä—Å¡siÅsts tÄ—k kas $1 adÄ«nas.',
-'mailerror' => 'Klaida siontiant pašta: $1',
-'acct_creation_throttle_hit' => 'Tamsta jau sokūriet $1 prisėjongėma varda. Daugiau nebgalėma.',
-'emailauthenticated' => 'Tamstas el. pašta adresos bova ožtvirtėnts $1.',
-'emailnotauthenticated' => 'Tamstas el. pašta adresos da nier patvėrtėnts. Anėjuokės gruomatas
-nebus siontamas ni vÄ—inam žemiau Ä—Å¡vardÄ—ntam puoslaugiÅ.',
-'noemailprefs' => 'Nuruodėkīt el. pašta adresa, kū vėiktu šėtos funkcėjės.',
-'emailconfirmlink' => 'Patvėrtinkėt sava el. pašta adresa',
-'accountcreated' => 'Nauduotuos sokorts',
-'accountcreatedtext' => 'Nauduotuos $1 sokorts.',
-'createaccount-title' => '{{SITENAME}} paskīruos kūrėms',
-'loginlanguagelabel' => 'Kalba: $1',
-
-# Password reset dialog
-'resetpass' => 'Keistė slaptažuodi',
-'resetpass_header' => 'Keistė paskīruos slaptažuodi',
-'oldpassword' => 'Sens slaptažuodis:',
-'newpassword' => 'Naus slaptažuodis:',
-'retypenew' => 'Pakartuokėt nauja slaptažuodi:',
-'resetpass_submit' => 'Nostatītė slaptažuodi ė prėsėjongtė',
-'resetpass_success' => 'Tamstas slaptažuodis pakeists siekmÄ—ngÄ! Daba prÄ—sÄ—jongiama...',
-'resetpass-temp-password' => 'Laikėns slaptažuodis:',
-
-# Edit page toolbar
-'bold_sample' => 'Pastuorints teksts',
-'bold_tip' => 'PastuorintÄ— teksta',
-'italic_sample' => 'Teksts kursīvu',
-'italic_tip' => 'Teksts kursīvu',
-'link_sample' => 'NÅ«ruodas pavadinÄ—ms',
-'link_tip' => 'Vėdinė nūruoda',
-'extlink_sample' => 'http://www.example.com nūruodas pavadėnėms',
-'extlink_tip' => 'Ėšuorėnė nūruoda (nepamėrškėt http:// priraša)',
-'headline_sample' => 'Skīrė pavadėnėms',
-'headline_tip' => 'Ontra līgė skīrė pavadėnėms',
-'math_sample' => 'IveskÄ—t fuormolÄ—',
-'math_tip' => 'MatematinÄ— fuormolÄ— (LaTeX fuormato)',
-'nowiki_sample' => 'IterpkÄ—t nefuormouta teksta ÄÄ—',
-'nowiki_tip' => 'Ä–gnoroutÄ— wiki fuormata',
-'image_sample' => 'Pavīzdīs.jpg',
-'image_tip' => 'IdietÄ— abruozdieli',
-'media_sample' => 'Pavīzdīs.ogg',
-'media_tip' => 'NÅ«ruoda i media faila',
-'sig_tip' => 'Tomstas paraÅ¡os Ä—r Äiesos',
-'hr_tip' => 'Guorizuontali linÄ—jÄ— (nenauduokÄ—t ba reikala)',
-
-# Edit pages
-'summary' => 'Kuomentars:',
-'subject' => 'Tema/ontraštė:',
-'minoredit' => 'Mažos pataisims',
-'watchthis' => 'KeravuotÄ— Å¡Ä—ta poslapÄ—',
-'savearticle' => 'Ä–Å¡sauguotÄ— poslapÄ—',
-'preview' => 'Parveiza',
-'showpreview' => 'Ruodītė parveiza',
-'showlivepreview' => 'TÄ—isiuogÄ—nÄ— parvaiza',
-'showdiff' => 'Ruodītė skėrtomus',
-'anoneditwarning' => "'''Diemesė:''' Tomsta nesat prisėjungės. Jūsa IP adresos būs irašīts i šiuo poslapė istuorėjė.",
-'missingsummary' => "'''PriminÄ—ms:''' Tamsta nenuruodiet pakeitÄ—ma kuomentara. JÄ“go viel paspausÄ—t ''Ä–Å¡sauguotÄ—'', Tamstas pakeitÄ—ms bus Ä—Å¡sauguots ba anuo.",
-'missingcommenttext' => 'Prašuom ivestė kuomentara.',
-'summary-preview' => 'Kuomentara parvaiza:',
-'subject-preview' => 'Skėrsnelė/ontraštės parvaiza:',
-'blockedtitle' => 'Nauduotuos īr ožblokouts',
-'blockedtext' => "'''Tamstas nauduotuojė vards a IP adresos īr ožblokouts.'''
-
-Ožbluokava $1.
-Nuruodīta prižastis īr ''$2''.
-
-* Bluokavėma pradžia: $8
-* BluokavÄ—ma pabenga: $6
-* Numatīts bluokoujamasės: $7
-
-Tamsta galÄ—t sosÄ—sÄ—iktÄ— so $1 a kÄ—tu
-[[{{MediaWiki:Grouppage-sysop}}|adminėstratuoriom]], kū aptartė ožbluokavėma.
-Tamsta negalÄ—t nauduotÄ—s funkcÄ—jÄ— „RaÅ¡Ä«tÄ— laiÅ¡ka tam nauduotuojÅ“, jÄ“go nesot pateikis tÄ—kra sava el. paÅ¡ta adresa sava [[Special:Preferences|paskÄ«ruos nustatÄ«mÅ«s]] Ä— nesot ožblokouts nu anuos nauduojÄ—ma.
-Tamstas dabartÄ—nis IP adresos Ä«r $3, a bluokavÄ—ma ID Ä«r #$5. PraÅ¡uom nuruodÄ«tÄ— Å¡Ä—tÄ, kumet kreipiatÄ—s diel atbluokavÄ—ma.",
-'autoblockedtext' => "Tamstas IP adresos bova autuomatÄ—Å¡kÄ ožblokouts, kadongi ana nauduojÄ— kÄ—ts nauduotuos, katra ožbluokava $1.
-Nuruodīta prīžastis īr tuokė:
-
-:''$2''
-
-* Bluokavėma pradžė: $8
-* BluokavÄ—ma pabenga: $6
-* Numatuoms bluokavÄ—ma Äiesos: $7
-
-Tamsta galėt sosėsėiktė so $1 aba kėtu [[{{MediaWiki:Grouppage-sysop}}|adminėstratuoriom]], kū aprokoutomėt biedas diel bluokavėma.
-
-Tamsta negalÄ—t nauduotÄ—s fonkcÄ—jÄ— „RaÅ¡Ä«tÄ— gruomata tam nauduotuojÅ“, jÄ“go nesot nuruode tÄ—kra el. paÅ¡ta adresa sava [[Special:Preferences|nauduotuojÄ— nustatÄ«mÅ«s]]. TÄ“puogi Tamsta negalat nauduotÄ—s ta fonkcÄ—jÄ—, jÄ“go TamstÄ ožblokouts anuos nauduojÄ—ms.
-
-Tamstas IP adresos Ä«r $3, bluokavÄ—ma ID Ä«r $5.
-Prašuom nuruodītė šėtūs doumenis visūmet, kumet kreipiatės diel bluokavėma.",
-'blockednoreason' => 'prīžastis nier nuruodīta',
-'blockedoriginalsource' => "Žemiau īr ruodoms '''$1''' torėnīs:",
-'blockededitsource' => "''Tamstas keitimu'' teksts poslapiui '''$1''' īr ruodoms žemiau:",
-'whitelistedittitle' => 'Nuorėnt redagoutė rēk prisėjongtė',
-'whitelistedittext' => 'Tamsta torėt $1, kū keistomėt poslapius.',
-'nosuchsectiontitle' => 'Nier tuokė skīrė',
-'loginreqlink' => 'prisÄ—jongtÄ—',
-'accmailtitle' => 'Slaptažuodis ėšsiūsts īr.',
-'accmailtext' => "Nauduotuojė '$1' slaptažuodis nusiūsts i $2 īr.",
-'newarticle' => '(Naus)',
-'newarticletext' => "Tamsta pakliovuot i nÅ«nÄ neesoti poslapi.
-Nuoriedamė sokortė poslapi, pradiekėt rašītė žemiau esontiamė ivedima pluotė
-(platiau [[{{MediaWiki:Helppage}}|pagelbas poslapī]]).
-JÄ“go pakliovuot ÄÄ— netÄ«Äiuom, paprastiausÄ“ paspauskÄ—t narÅ¡Ä«klÄ—s mÄ«gtoka '''atgal'''.",
-'anontalkpagetext' => "----''Tas īr anonimėnė nauduotuojė, katros nier sosėkūrės aba nenauduo paskīruos, aptarėmu poslapis.
-DielÄ“ tuo nauduojams IP adresos anuo atpažėnÄ—mÅ.
-Tas IP adresos gal būtė dalinams keletŠnauduotuoju.
-JÄ“go Tamsta esat anonimÄ—nis nauduotuos Ä—r veizÄ—t, kÅ« kuomentarÄ nier skÄ—rtÄ— TamstÄ, [[Special:UserLogin/signup|sokorkÄ—t paskÄ«ra]] aba [[Special:UserLogin|prisÄ—jonkÄ—t]], Ä— nebÅ«sÄ—t maiÅ¡uoms so kÄ—tÄs anonimÄ—nÄ“s nauduotuojÄs.''",
-'noarticletext' => 'Tuo Äiesu tamÄ— poslapÄ« nier juokÄ— teksta.
-Tamsta galėt [[Special:Search/{{PAGENAME}}|ėiškuotė šėta poslapė pavadėnėma]] kėtūs poslapiūs,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė sosėjosiu regėstru],
-aba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistÄ— ta poslapi].',
-'userpage-userdoesnotexist' => 'Nauduotuojė paskīra „$1“ nier ožregėstrouta. Prašuom patikrėntė, a Tamsta nuorėt kortė/keistė ta poslapi.',
-'clearyourcache' => "'''DiemesÄ—:''' Ä—Å¡sauguojus TamstÄ gal prireiktÄ— Ä—Å¡valÄ«tÄ— Tamstas narÅ¡Ä«klÄ—s rÄ—nktovÄ—, kÅ« paveizÄ—tomÄ—t pakeitÄ—mus. '''Mozilla / Safari / Konqueror:''' laikÄ«dami ''Shift'' pasÄ—rinkÄ—t ''AtsiÅstÄ— Ä—Å¡ nauja'', a paspauskÄ—t ''Ctrl-Shift-R'' (sÄ—stemuo Apple Mac ''Cmd-Shift-R''); '''IE:''' laikÄ«damÄ— ''Ctrl'' paspauskÄ—t ''AtnaujÄ—ntÄ—'', o paspauskÄ—t ''Ctrl-F5''; '''Konqueror:''' paprastiausÄ“ paspauskÄ—t ''PerkrautÄ—'' mÄ«gtoka, o paspauskÄ—t ''F5''; '''Opera''' nauduotuojam gal prireiktÄ— pÄ—lnÄ Ä—Å¡valÄ«tÄ— anÅ« rÄ—nktovÄ— ''RakondÄ→NustatÄ«mÄ''.",
-'usercssyoucanpreview' => "'''Patarėms:''' Nauduokit „Ruodītė parvaiza“ mīgtoka, kū ėšmiegintomiet sava naujaji CSS priš ėšsaugont.",
-'userjsyoucanpreview' => "'''Patarėms:''' Nauduokit „Ruodītė parvaiza“ mīgtoka, kū ėšmiegintomiet sava naujaji JS priš ėšsaugont.",
-'usercsspreview' => "'''Napamirškėt, kū Tamsta tėk parveizėt sava nauduotoja CSS, ans da nabova ėšsauguots!'''",
-'userjspreview' => "'''Nepamirškėt, kū Tamsta tėk testoujat/parvaizėt sava nauduotoja ''JavaScript'', ans da nabova ėšsauguots!'''",
-'userinvalidcssjstitle' => "'''Diemesė:''' Nė juokės ėšruodos „$1“. Napamirškėt, kū sava .css ėr .js poslapē nauduo pavadėnėma mažuosiomės raidiemis, pvz., Nauduotuos:Foo/monobook.css, o ne Nauduotuos:Foo/Monobook.css.",
-'updated' => '(AtnaujÄ—nta)',
-'note' => "'''Pastebiejims:'''",
-'previewnote' => "'''NepamÄ—rÅ¡kÄ—t, kÅ« tas tÄ—ktÄs pervaiza, pakeitÄ—mÄ da nier Ä—Å¡sauguotÄ—!'''",
-'previewconflict' => 'Å Ä—ta parvaiza paruod teksta Ä—Å¡ vÄ—rÅ¡otinÄ—jÄ— teksta redagavÄ—ma lauka tÄ“p, kÄp ans bus ruodoms, jei pasirinksÄ—t anÅ« Ä—Å¡sauguotÄ—.',
-'session_fail_preview' => "'''Atsiprašuom! Mes nagalėm vīkdītė Tamstas keitėma diel sesėjės doumenū praradima.
-PraÅ¡uom pamiegintÄ— vielÄ“k. Jei Å¡Ä—tÄ napaded, pamieginkÄ—t atsÄ—jongtÄ— Ä—r prÄ—sÄ—jongtÄ— atgal.'''",
-'session_fail_preview_html' => "'''Atsėprašuom! Mes nagalėm apdoroutė Tamstas keitėma diel sesėjės doumenū praradėma.'''
-''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',
-'editingsection' => 'Taisuoms $1 (skÄ—rsnelis)',
-'editingcomment' => 'Taisuoms $1 (naus skīrius)',
-'editconflict' => 'Ä–Å¡preskÄ—t kuonflÄ—kta: $1',
-'explainconflict' => "Kažėn kas kÄ—ts jau pakeitÄ— poslapi nÅ« tuo Äiesa, kumet Tamsta pradiejuot ana redagoutÄ—.
-VÄ—rÅ¡otÄ—niamÄ— tekstÄ—niamÄ— laukÄ— pateikta Å¡Ä—tu Äiesu esontÄ— poslapÄ— versÄ—jÄ—.
-Tamstas pakeitÄ—mÄ pateiktÄ— žemiau esontiamÄ— laukÄ—.
-TamstÄ rÄ“k sojongtÄ— Tamstas pakeitÄ—mus so esontÄ— versÄ—jÄ—.
-Kumet paspausÄ—te „IraÅ¡Ä«tė“, bus iraÅ¡Ä«ts '''tÄ—ktÄs''' teksts vÄ—rÅ¡otÄ—niam tekstÄ—niam laukÄ—.",
-'yourtext' => 'Tamstas teksts',
-'storedversion' => 'Ä–Å¡sauguota versÄ—jÄ—',
-'editingold' => "'''ISPIEJIMS: Tamsta keitat ne naujausÄ— poslapÄ— versÄ—jÄ—.
-JÄ“go Ä—Å¡sauguosÄ—t sava pakeitÄ—mus, paskum darÄ«tÄ— pakeitÄ—mÄ prapols.'''",
-'yourdiff' => 'SkÄ—rtomÄ',
-'copyrightwarning' => "Primenam, kÅ« vÄ—sks, kas patenk i {{SITENAME}}, Ä«r laikuoma pavÄ—iÅ¡Ä—nto palÄ“ $2 (platiau - $1). JÄ“go nenuorit, kÅ« Tamstas duovis bÅ«tou ba pasÄ—gailiejÄ—ma keitams Ä— platÄ—nams, neraÅ¡Ä«kÄ—t ÄÄ—.<br />
-Tamsta tēpuogi pasėžadat, kū tas īr Tamstas patėis rašīts torėnīs a kuopėjouts ėš vėišū a panašiū valnū šaltėniu.
-'''NEKOPĖJOUKĖT AUTUORĖNIEM TEISIEM APSAUGUOTU DARBŪ BA LEIDĖMA!'''",
-'copyrightwarning2' => "Primenam, kÅ« vÄ—sks, kas patenk i {{SITENAME}} gal bÅ«tÄ— keitama, perdaruoma, a paÅ¡alÄ—nama kÄ—tÅ« nauduotuoju. JÄ“go nenuorÄ—t, kÅ« Tamstas duovis bÅ«tu ba pasÄ—gailiejÄ—ma keitams, ÄiuonÄs neraÅ¡Ä«kÄ—t.<br />
-Tēpuogi Tamsta pasėžadat, kū tas īr Tamstas rašīts teksts aba kuopėjouts
-ėš vėišū liousū šaltėniu (detaliau - $1).
-'''NEKUOPĖJOUKAT AUTUORĖNIEM TEISIEM APSAUGUOTU DARBŪ BA LEIDĖMA!'''",
-'longpagewarning' => "'''DIEMESÄ–: Tas poslapis Ä«r $1 kilobaitu Ä—lgoma; katruos nekatruos
-naršīklės gal torietė biedū redagounant poslapius bavēk a vėrš 32 kB.
-Prašuom pamiegītė poslapi padalėntė i keleta smolkesniū daliū.'''",
-'readonlywarning' => "'''DIEMESÄ–: DoumenÅ« bazÄ— bova ožrakÄ—nta teknÄ—nÄ“ pruofilaktÄ—kÄ,
-tudie negaliesÄ—t Ä—Å¡sauguotÄ— sava pakeitÄ—mu daba. Tamsta galÄ—t nosÄ—kopÄ—joutÄ— teksta i tekstÄ—ni faila
-Ä— paskum ikeltÄ— ana ÄÄ—.'''",
-'protectedpagewarning' => "'''DIEMESĖ: Šėts poslapis īr ožrakints ėr anū redagoutė gal tėk admėnėstratuorė teises torėntīs prietelē.'''",
-'semiprotectedpagewarning' => "'''PastebiejÄ—ms:''' Å Ä—ts poslapis bova ožrakÄ—nts Ä—r anuo gal redagoutÄ— tÄ—k regÄ—stroutÄ— nauduotojÄ.",
-'titleprotectedwarning' => "'''DIEMESÄ–: Tas poslapis bova ožrakÄ—nts tÄ“p, ka tÄ—ktÄs kÄpkatrÄ— nauduotuojÄ“ galietu ana sokortÄ—.'''",
-'templatesused' => '{{PLURAL:$1|Å abluons|Å abluonÄ}}, katrÄ—i Ä«r nauduojamÄ— poslapÄ«:',
-'templatesusedpreview' => '{{PLURAL:$1|Å abluons|Å abluonÄ}}, nauduotÄ— Å¡Ä—tuo parvaizuo:',
-'templatesusedsection' => 'Å abluonÄ, nauduotÄ— Å¡Ä—tom skÄ—rsnelÄ«:',
-'template-protected' => '(apsauguots)',
-'template-semiprotected' => '(posiau apsauguots)',
-'hiddencategories' => 'Tas poslapis prÄ—klausa $1 {{PLURAL:$1|pakavuotÄ kateguorÄ—jÄ“|pakavuotoms kateguorÄ—jÄ—ms|pakavuotu kateguorÄ—ju}}:',
-'nocreatetitle' => 'Poslapiu kūrims aprėbuots',
-'nocreatetext' => '{{SITENAME}} aprėbuojė galėmībe kortė naujus poslapius.
-Tamsta galÄ—t grīžtÄ— Ä— redagoutÄ— nÅ«nÄ esonti poslapi, a [[Special:UserLogin|prÄ—sÄ—jongtÄ— a sokortÄ— paskÄ«ra]].',
-'permissionserrors' => 'Teisiu klaida',
-'permissionserrorstext' => 'Tamsta netorėt teisiu šėta darītė diel {{PLURAL:$1|tuos prīžastėis|tū prīžastiū}}:',
-'permissionserrorstext-withaction' => 'Tamsta netorėt leidėma $2 dielē {{PLURAL:$1|tos prīžastėis|tū prīžastiu}}:',
-'recreate-moveddeleted-warn' => "'''DiemesÄ—: Tomsta atkoriat poslapi, katros onkstiau bova Ä—Å¡trints.'''
-
-Tomsta torėt nosprēst, a pritėnk tuoliau redagoutė šėta poslapi.
-Å Ä—ta poslapÄ— Å¡alÄ—nÄ—mu istuorÄ—jÄ— Ä«r pateikta patuogoma vardan:",
-'moveddeleted-notice' => 'Tas poslapis bova Ä—Å¡trÄ—nts.
-Ä–Å¡trÄ—nta poslapÄ— versÄ—ju sÄraÅ¡os Ä«r pateikts paveiziejÄ—mŠžemiau.',
-'edit-conflict' => 'RedagavÄ—ma kuonflÄ—ktos',
-
-# "Undo" feature
-'undo-success' => 'Keitėms gal būtė atšaukts. Prašuom patėkrėntė palīgėnėma, asonti žemiau, kū patvėrtėntomiet, kū Tamsta šėta ė nuorėt padarītė, ė tumet ėšsauguokit pakeitėmos, asontios žemiau, kū ožbėngtomiet keitėma atšaukėma.',
-'undo-failure' => 'Keitėms nagal būt atšaukts diel konflėktounantiu tarpėniu pakeitėmu.',
-'undo-summary' => 'Atšauktė [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarėms]]) versėje $1',
-
-# Account creation failure
-'cantcreateaccount-text' => "Paskīrū kūrėma ėš šėta IP adresa ('''$1''') ožbluokava [[User:$3|$3]].
-
-$3 nuruodīta prīžastis īr ''$2''",
-
-# History pages
-'viewpagelogs' => 'RuodÄ«tÄ— Å¡Ä—tuo poslapÄ— specÄ“liÅsios vaiksmos',
-'nohistory' => 'Å Ä—ts poslapis netor keitÄ—mu istuorÄ—jÄ—s.',
-'currentrev' => 'DabartÄ—nÄ— versÄ—jÄ—',
-'currentrev-asof' => 'DabartÄ—nÄ— $1 versÄ—jÄ—',
-'revisionasof' => '$1 versÄ—jÄ—',
-'revision-info' => '$1 versÄ—jÄ— nauduotuojÄ— $2',
-'previousrevision' => 'â†OnkstesnÄ— versÄ—jÄ—',
-'nextrevision' => 'Paskesnė versėjė→',
-'currentrevisionlink' => 'DabartÄ—nÄ— versÄ—jÄ—',
-'cur' => 'dab',
-'next' => 'kÄ—ts',
-'last' => 'pask',
-'page_first' => 'pÄ—rm',
-'page_last' => 'pask',
-'histlegend' => "SkÄ—rtomÄ terp versÄ—ju: pažīmiekit lÄ«ginamas versÄ—jÄ—s Ä— spauskÄ—t ''Enter'' klavÄ—Å¡a a mÄ«gtuka apatiuo.<br />
-ŽīmiejimÄ: (dab) = palÄ«ginims so vielibiausÄ— versÄ—jÄ—,
-(pask) = palīginims so priš ta bovosia versėjė, S = mažos pataisims.",
-'history-fieldset-title' => 'Naršītė istuorėjuo',
-'histfirst' => 'SeniausÄ—',
-'histlast' => 'VielibÄ—Ì…jÄ—',
-'historysize' => '($1 {{PLURAL:$1|baits|baitÄ|baitu}})',
-'historyempty' => '(nieka nier)',
-
-# Revision feed
-'history-feed-title' => 'VersÄ—ju istuorÄ—jÄ—',
-'history-feed-item-nocomment' => '$1 $2',
-'history-feed-empty' => 'Prašuoms poslapis nēgzėstuo.
-Ans galiejė būtė ėštrėnts ėš pruojekta, aba parvardėnts.
-Pamiegīkėt [[Special:Search|ėiškoutė pruojektė]] sosėjosiu naujū poslapiu.',
-
-# Revision deletion
-'rev-delundel' => 'ruodītė/kavuotė',
-'revisiondelete' => 'TrintÄ—/atkortÄ— versÄ—jÄ—s',
-'logdelete-selected' => "{{PLURAL:$2|PasÄ—rinkts|PasÄ—rinktÄ—|PasÄ—rinktÄ—}} '''$1''' istuorÄ—jÄ—s {{PLURAL:$2|atÄ—tÄ—kims|atsÄ—tÄ—kimÄ|atsÄ—tÄ—kimÄ}}:",
-'revdelete-text' => "'''Ä–Å¡trintuos versÄ—jÄ—s Ä—r ivÄ«kÄ“ vistÄ—ik da bus ruodomÄ— poslapÄ— istuorÄ—juo Ä—r specÄ“liÅ«ju veiksmÅ« istuorÄ—juo, no anÅ« torÄ—nÄ— dalÄ«s nabus vÄ—iÅ¡Ä pasÄ—ikiamos.'''
-KÄ—tÄ— admÄ—nÄ—stratuorÄ“ Å¡Ä—tom pruojekte vÄ—sdar galÄ—s pasÄ—iktÄ— pasliepta torÄ—ni Ä—r galÄ—s ana atkortÄ— viel par Å¡Ä—ta pate sasaja, nabent Ä«r nostatÄ«tÄ— papÄ—lduomÄ— aprÄ—buojÄ—mÄ.",
-'revdelete-unsuppress' => 'Å alÄ—ntÄ— apribuojÄ—mos atkortuos versÄ—jÄ—s',
-'logdelete-logentry' => 'pakeists [[$1]] atsÄ—tÄ—kima veiziemoms',
-'revdel-restore' => 'KeistÄ— veizÄ—muma',
-'revdelete-edit-reasonlist' => 'Keistė trīnėma prīžastis',
-
-# Suppression log
-'suppressionlog' => 'Trīnėma istuorėjė',
-
-# History merging
-'mergehistory-success' => '$3 [[:$1]] versÄ—ju siekmÄ—ngÄ sojongta so [[:$2]].',
-
-# Merge log
-'revertmerge' => 'AtskÄ—rtÄ—',
-
-# Diffs
-'history-title' => 'Poslapė „$1“ istuorėjė',
-'difference' => '(SkÄ—rtomÄ terp versÄ—ju)',
-'lineno' => 'EilotÄ— $1:',
-'compareselectedversions' => 'Palīgintė pasėrinktas versėjės',
-'editundo' => 'atšauktė',
-'diff-multi' => '($1 {{PLURAL:$1|tarpÄ—nis keitÄ—ms nier ruoduoms|tarpÄ—nÄ“ keitÄ—mÄ nier ruoduomÄ—|tarpÄ—niu keitÄ—mu nier ruoduoma}}.)',
-
-# Search results
-'searchresults' => 'PaÄ—iÅ¡kuos rezoltatÄ',
-'searchresults-title' => 'PaÄ—iÅ¡kuos rezoltatÄ "$1"',
-'searchresulttext' => 'Daugiau infuormacėjės aple paėiška pruojektė {{SITENAME}} rasėt [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Tamsta ėiškuojot \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|vėsė poslapē katrėi prasėded so "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|vėsė poslapē katrėi ruod i "$1"]])',
-'searchsubtitleinvalid' => 'Jėškuom „$1“',
-'titlematches' => 'Straipsniu pavadėnėmu atitėkmenīs',
-'notitlematches' => 'Juokiū pavadinėma atitikmenū',
-'textmatches' => 'Poslapė torėnė atėtikmenīs',
-'notextmatches' => 'Juokiū poslapė teksta atitikmenū',
-'prevn' => 'onkstesnius {{PLURAL:$1|$1}}',
-'nextn' => 'paskesnius {{PLURAL:$1|$1}}',
-'viewprevnext' => 'VeizÄ—tÄ— ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-legend' => 'PaÄ—iÅ¡kuos nustatÄ«mÄ',
-'searchmenu-exists' => "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
-'searchmenu-new' => "'''Sokortė poslapi „[[:$1]]“ šėtuo wiki!'''",
-'searchhelp-url' => 'Help:Torėnīs',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ėiškuotė poslapiu so šėtuom prīšdielio]]',
-'searchprofile-articles' => 'Torėnė poslapē',
-'searchprofile-project' => 'Pruojėkta poslapē',
-'searchprofile-images' => 'FailÄ',
-'searchprofile-everything' => 'VÄ—sks',
-'searchprofile-advanced' => 'Prapliesta',
-'searchprofile-articles-tooltip' => 'Ä–iÅ¡kuotÄ— ÄiuonÄs: $1',
-'searchprofile-project-tooltip' => 'Ä–iÅ¡kuotÄ— ÄiuonÄs: $1',
-'searchprofile-images-tooltip' => 'Ėiškuotė failu',
-'searchprofile-everything-tooltip' => 'Ėiškuotė vėsuo torėnė (tuom patėm ėr aptarėma poslapiu)',
-'search-result-size' => '$1 ({{PLURAL:$2|1 žuodis|$2 žuodē|$2 žuodiu}})',
-'search-result-score' => 'TÄ—nkamoms: $1%',
-'search-redirect' => '(paradresavÄ—ms $1)',
-'search-section' => '(skīrios $1)',
-'search-suggest' => 'Mažo nuoriejot $1',
-'search-interwiki-caption' => 'DokterÄ—nÄ“ pruojektÄ',
-'search-interwiki-default' => '$1 rezoltatÄ:',
-'search-interwiki-more' => '(daugiau)',
-'search-mwsuggest-enabled' => 'so pasiÅ«lÄ«mÄs',
-'search-mwsuggest-disabled' => 'nie pasiūlīmu',
-'search-relatedarticle' => 'SosÄ—jÄ—n',
-'mwsuggest-disable' => 'Kavuotė AJAX pasiūlīmus',
-'searchrelated' => 'sosÄ—jÄ—n',
-'searchall' => 'vÄ—sÄ—',
-'showingresults' => "Žemiau ruodoma lėgė '''$1''' {{PLURAL:$1|rezoltata|rezoltatu|rezoltatu}} pradedont #'''$2'''.",
-'showingresultsnum' => "Žemiau ruodoma '''$3''' {{PLURAL:$3|rezoltata|rezoltatu|rezoltatu}} pradedant #'''$2'''.",
-'nonefound' => "'''PastebiejÄ—ms''': PalÄ“ nutÄ«liejÄ—ma Ä—iÅ¡kuoma tÄ—ktÄs kÄp katruosÄ— vardÅ« srÄ—tÄ«sÄ—. PamiegÄ«kÄ—t priraÅ¡Ä«tÄ— prÄ—iÅ¡dieli ''all:'', jÄ“go nuorÄ—t Ä—iÅ¡kiuotÄ— vÄ—sa torÄ—nÄ— (tamÄ— tarpÄ— aptarÄ—ma poslapius, Å¡abluonus Ä— tÄ“p tuoliau), aba nauduokÄ—t nuorÄ—ma vardÅ« srÄ—ti kÄp prÄ—iÅ¡dieli.",
-'search-nonefound' => 'Nier rezoltatu, katrėi atitėktu ožklausėma.',
-'powersearch' => 'Ėiškuotė',
-'powersearch-legend' => 'Prapliesta paėiška',
-'powersearch-ns' => 'Ėiškoutė vardū srėtīsė:',
-'powersearch-redir' => 'ItrauktÄ— paradresavÄ—mus',
-'powersearch-field' => 'Ėiškoutė',
-'search-external' => 'Ėšuorėnė paėiška',
-
-# Quickbar
-'qbsettings' => 'GreitasÄ pasÄ—rÄ—nkÄ—ms',
-'qbsettings-none' => 'Neruodītė',
-
-# Preferences page
-'preferences' => 'NustatÄ«mÄ',
-'mypreferences' => 'Mona nustatÄ«mÄ',
-'prefs-edits' => 'KeitÄ—mu skaitlius:',
-'prefsnologin' => 'NaprisÄ—jongis',
-'prefsnologintext' => 'TamstÄ rÄ“k bÅ«tÄ— <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} prisÄ—jongosam]</span>, kÅ« galietomiet keistÄ— sava nustatÄ«mus.',
-'changepassword' => 'Pakeistė slaptažuodė',
-'prefs-skin' => 'Ä–Å¡ruoda',
-'skin-preview' => 'Parveiza',
-'prefs-math' => 'MatematÄ—ka',
-'datedefault' => 'JuokÄ— pasÄ—rÄ—nkÄ—ma',
-'prefs-datetime' => 'Data Ä— Äiesos',
-'prefs-personal' => 'NauduotuojÄ— pruopilis',
-'prefs-rc' => 'VielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ',
-'prefs-watchlist' => 'Keravuojamu sÄraÅ¡os',
-'prefs-watchlist-days' => 'KÄ—ik dÄ—inÅ« ruodÄ«tÄ— keravuojamu sÄraÅ¡Ä—:',
-'prefs-watchlist-days-max' => '(daugiausē 7 dėinas)',
-'prefs-watchlist-edits' => 'KÄ—ik pakeitÄ—mu ruodÄ«tÄ— Ä—Å¡pliestiniam keravuojamu sÄraÅ¡Ä—:',
-'prefs-watchlist-edits-max' => '(dÄ—dliausias skaitlius: 1000)',
-'prefs-misc' => 'IvairÄ— nustatÄ«mÄ',
-'prefs-resetpass' => 'Keistė slaptažuodi',
-'saveprefs' => 'Ä–Å¡sauguotÄ—',
-'resetprefs' => 'Atstatītė nostatīmos',
-'restoreprefs' => 'Atstatītė vėsus numatītūsius nustatīmus',
-'prefs-editing' => 'RedagavÄ—ms',
-'prefs-edit-boxsize' => 'RedagavÄ—ma longa dÄ—doms.',
-'rows' => 'EilotÄ—s:',
-'columns' => 'Štolpalē:',
-'searchresultshead' => 'PaÄ—iÅ¡kuos nostatÄ«mÄ',
-'resultsperpage' => 'Rezoltatu poslapie:',
-'contextlines' => 'Eilotiu rezoltatÄ—:',
-'contextchars' => 'Konteksta sÄ—mbuoliu eilotie:',
-'stub-threshold' => 'Minimums <a href="#" class="stub">nabÄ—ngta poslapÄ—</a> fuormatavÄ—mÅ:',
-'recentchangesdays' => 'Ruodomas dÄ—inas vielÄ«bÅ«ju pakeitÄ—mu sÄraÅ¡Ä—:',
-'recentchangesdays-max' => '(daugiausē $1 {{PLURAL:$1|dėina|dėinū|dėinas}})',
-'recentchangescount' => 'NumatÄ«tasÄ keitÄ—mu skaitlius, ruodoms vielÄ«bÅ«ju keitÄ—mu, poslapiu istuorÄ—jÄ—sÄ— Ä— notÄ—kÄ—mu saraÅ¡Å«sÄ—:',
-'savedprefs' => 'NostatÄ«mÄ siekmÄ—ngÄ Ä—Å¡sauguotÄ—.',
-'timezonelegend' => 'ÄŒiesa zuona',
-'localtime' => 'VÄ—itinis Äiesos:',
-'timezoneuseserverdefault' => 'Nauduotė palē nutīliejėma ėš serverė',
-'timezoneuseoffset' => 'KÄ—ta (patikslÄ—ntÄ— skÄ—rtoma)',
-'timezoneoffset' => 'Skėrtoms¹:',
-'servertime' => 'ServerÄ— Äiesos:',
-'guesstimezone' => 'Paimtė ėš naršīklės',
-'timezoneregion-africa' => 'AfrÄ—ka',
-'timezoneregion-america' => 'AmerÄ—ka',
-'timezoneregion-antarctica' => 'AntarktÄ—da',
-'timezoneregion-asia' => 'AzÄ—jÄ—',
-'timezoneregion-atlantic' => 'Atlanta ondenīns',
-'timezoneregion-australia' => 'AustralÄ—jÄ—',
-'timezoneregion-europe' => 'Euruopa',
-'timezoneregion-indian' => 'Indėjės ondenīns',
-'timezoneregion-pacific' => 'Ramosis ondenīns',
-'allowemail' => 'Lēstė siūstė el. gramuotelės ėš kėtū nauduotuoju',
-'prefs-searchoptions' => 'PaÄ—iÅ¡kuos nustatÄ«mÄ',
-'prefs-namespaces' => 'Vardū srėtīs',
-'defaultns' => 'Palē nutīliejėma ėiškuotė šėtuosė vardū srėtīsė:',
-'default' => 'palē nūtīliejėma',
-'prefs-files' => 'FailÄ',
-'youremail' => 'El. pašts:',
-'username' => 'NauduotuojÄ— vards:',
-'uid' => 'NauduotuojÄ— ID:',
-'prefs-memberingroups' => '{{PLURAL:$1|Gropės|Gropiu}} narīs:',
-'yourrealname' => 'TÄ—kros vards:',
-'yourlanguage' => 'AplÄ—nkuos kalba:',
-'yourvariant' => 'Variants',
-'yournick' => 'Pasėrinkts slapīvardis:',
-'badsig' => 'Neteisings parašas; patėkrinkėt HTML žīmės.',
-'badsiglength' => 'Tamstas parašos īr par ėlgs.
-Ana gal sodarÄ«tÄ— ne daugiau kÄp $1 {{PLURAL:$1|sÄ—mbuolis|sÄ—mbuolÄ“|sÄ—mbuoliu}}.',
-'yourgender' => 'LÄ«tis:',
-'gender-unknown' => 'Nier nuruodīta',
-'gender-male' => 'VÄ«rs',
-'gender-female' => 'MuoterÄ—Å¡ka',
-'email' => 'El. pašts',
-'prefs-help-realname' => 'TÄ—krs vards nier privaluoms, vuo jÄ“go Tamsta ana ivesÄ—t, ons bus nauduojams Tamstas darba pažīmiejÄ—mÅ.',
-'prefs-help-email' => 'El. paÅ¡ta adresos nier privaloms, ale uns leid TamstÄ gautÄ— nauja slaptažuodi, jÄ“go pamÄ—rÅ¡uot kuoks uns bova, Ä— tÄ“puogi Tamsta galÄ—t leistÄ— kÄ—tÄ—ims pasÄ—iktÄ— Tamsta par Tamstas nauduotuojÄ— a nauduotuojÄ— aptarÄ—ma poslapi neatsklÄ—idont Tamstas tapatoma.',
-
-# User rights
-'userrights' => 'Nauduotuoju teisiu valdīms',
-'userrights-lookup-user' => 'Tvarkītė nauduotuojė gropės',
-'userrights-user-editname' => 'IveskÄ—t nauduotuojÄ— varda:',
-'editusergroup' => 'RedagoutÄ— nauduotuojÄ— gropes',
-'editinguser' => "Taisuoms nauduotuos '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'KeistÄ— nauduotuoju gropes',
-'saveusergroups' => 'SauguotÄ— nauduotuoju gropes',
-'userrights-groupsmember' => 'Narīs:',
-'userrights-reason' => 'Prīžastis:',
-
-# Groups
-'group' => 'GropÄ—:',
-'group-user' => 'Nauduotuojē',
-'group-autoconfirmed' => 'AutuomatÄ—Å¡kÄ patvirtÄ—ntÄ— nauduotuojÄ“',
-'group-bot' => 'BuotÄ',
-'group-sysop' => 'Adminėstratuorē',
-'group-bureaucrat' => 'BiorokratÄ',
-'group-all' => '(vÄ—sÄ—)',
-
-'group-user-member' => 'Nauduotuos',
-'group-bot-member' => 'Buots',
-'group-sysop-member' => 'AdminÄ—stratuorius',
-'group-bureaucrat-member' => 'Biorokrats',
-
-'grouppage-user' => '{{ns:project}}:Nauduotuojē',
-'grouppage-autoconfirmed' => '{{ns:project}}:AutomatÄ—Å¡kÄ patvÄ—rtintÄ— nauduotuojÄ“',
-'grouppage-bot' => '{{ns:project}}:RobuotÄ',
-'grouppage-sysop' => '{{ns:project}}:Adminėstratuorē',
-'grouppage-bureaucrat' => '{{ns:project}}:BiorokratÄ',
-
-# Rights
-'right-read' => 'Skaitītė poslapius',
-'right-edit' => 'KeistÄ— poslapius',
-
-# User rights log
-'rightslog' => 'Nauduotuoju teisiu istuorÄ—jÄ—',
-'rightslogtext' => 'Pateikiams nauduotuoju teisiu pakeitÄ—mu sÄraÅ¡os.',
-'rightslogentry' => 'pakeista $1 gropės narīstė ėš $2 i $3. Sveikėnam!',
-'rightsnone' => '(juokiū)',
-
-# Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'redagoutÄ— ta poslapi',
-'action-undelete' => 'atkortÄ— ta poslapi',
-'action-patrol' => 'pažīmietÄ— kÄ—tÅ« keitÄ—mus kÄp patikrÄ—ntus',
-'action-userrights' => 'keistė vėsū nauduotuoju teises',
-
-# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|pakeitÄ—ms|pakeitÄ—mÄ|pakeitÄ—mu}}',
-'recentchanges' => 'VielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ',
-'recentchanges-legend' => 'VielÄ«buju pakeitÄ—mu pasÄ—rinkÄ—mÄ',
-'recentchangestext' => 'TamÄ— poslapÄ« Ä«r patÄ«s vielÄ«bÄ—Ì… jÄ— paketÄ—mÄ tom pruojÄ—ktÄ—.',
-'recentchanges-feed-description' => 'Keravuokėt patius vielībiausius pakeitėmus pruojektŠtamė šaltėnī.',
-'rcnote' => "Žemiau Ä«r '''$1''' {{PLURAL:$1|paskotinis pakeitims|paskotinÄ“ pakeitimÄ|paskotiniu pakeitimu}} par $2 {{PLURAL:$2|paskotinÄ—Ì…jÄ— dÄ—ina|paskotÄ—niasÄ—s '''$2''' dÄ—inas|paskotÄ—niuju '''$2''' dÄ—inÅ«}} skaitlioujant nÅ« $4, $5.",
-'rcnotefrom' => 'Žemiau īr pakeitėma pradedant nū <b>$2</b> (ruodom lėgė <b>$1</b> pakeitėmu).',
-'rclistfrom' => 'Ruodītė naujus pakeitėmus pradedant nū $1',
-'rcshowhideminor' => '$1 mažus pakeitėmus',
-'rcshowhidebots' => '$1 robuotus',
-'rcshowhideliu' => '$1 prėsėjongusiūm nauduotuojūm pakeitėmus',
-'rcshowhideanons' => '$1 anuonimÄ—nius nauduotuojus',
-'rcshowhidepatr' => '$1 patikrÄ—ntus pakeitÄ—mus',
-'rcshowhidemine' => '$1 mona pakeitÄ—mus',
-'rclinks' => 'Ruodītė paskotėnius $1 pakeitėmu par paskotėnė̅sēs $2 dėinū<br />$3',
-'diff' => 'skÄ—rt',
-'hist' => 'ist',
-'hide' => 'KavuotÄ—',
-'show' => 'Ruodītė',
-'minoreditletter' => 'm',
-'newpageletter' => 'N',
-'boteditletter' => 'r',
-'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|keravuojontis nauduotuos|keravuojontīs nauduotuojē|keravuojontiu nauduotuoju}}]',
-'rc_categories' => 'Ruodītė tėk šėtas kateguorėjės (atskirkit nauduodamė „|“)',
-'rc_categories_any' => 'BikuokÄ—',
-'newsectionsummary' => '/* $1 */ naus skÄ—rsnelis',
-'rc-enhanced-expand' => 'Ruodītė detales (rēk JavaScript)',
-'rc-enhanced-hide' => 'KavuotÄ— detales',
-
-# Recent changes linked
-'recentchangeslinked' => 'SosÄ—jÄ—n pakeitÄ—mÄ',
-'recentchangeslinked-feed' => 'SosÄ—jÄ—n pakeitÄ—mÄ',
-'recentchangeslinked-toolbox' => 'SosÄ—jÄ—n pakeitÄ—mÄ',
-'recentchangeslinked-title' => 'So $1 sosÄ—je pakeitimÄ',
-'recentchangeslinked-noresult' => 'Nier juokiÅ« pakeitÄ—mu sosÄ—itous poslapious douto Äieso.',
-'recentchangeslinked-summary' => "Å Ä—tom specÄ“liajam poslapi ruodomÄ— vielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ poslapiÅ«s, i katrÅ«s Ä«r nuruodoma. PoslapÄ“ Ä—Å¡ Tamstas [[Special:Watchlist|keravuojamu sÄraÅ¡a]] Ä«r '''pastuorÄ—ntÄ—'''.",
-'recentchangeslinked-page' => 'PoslapÄ— pavadinÄ—ms:',
-'recentchangeslinked-to' => 'Ruodītė so doutu poslapiu sosėjosiu puslapiu pakeitėmus',
-
-# Upload
-'upload' => 'IkeltÄ— faila',
-'uploadbtn' => 'IkeltÄ— faila',
-'reuploaddesc' => 'Sogrīžtė i ikielima fuorma.',
-'uploadnologin' => 'NaprÄ—sÄ—jongis',
-'uploadnologintext' => 'Nuoriedamė ikeltė faila, torėt būt [[Special:UserLogin|prėsėjongis]].',
-'upload_directory_read_only' => 'Tėnklapė serveris nagal rašītė i ikielima papke ($1).',
-'uploaderror' => 'Ikielima soklīdims',
-'uploadtext' => "Nauduokėtės žemiau pateikta skvarma kū ikeltomėt failus.
-NuoriedamÄ— parveizietÄ— ar Ä—iÅ¡kuotÄ— unkstiau ikeltÅ« abruozdieliu, Ä“kÄ—t i [[Special:FileList|ikeltÅ« failu saraÅ¡a]], ikielÄ—mÄ Ä—r Ä—Å¡trÄ«nÄ—mÄ Ä«r ožregÄ—stroujamÄ— [[Special:Log/upload|ikielÄ—mu istuorÄ—juo]], trÄ«nÄ—mÄ - [[Special:Log/delete|trÄ«nÄ—mu istuorÄ—juo]].
-
-Nuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' aba
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' tÄ—isiuogÄ—nÄ“ nÅ«ruodÄ i faila.",
-'upload-permitted' => 'LaistÄ—nÄ— failu tÄ—pÄ: $1.',
-'upload-preferred' => 'PageidajamÄ— failu tÄ—pÄ: $1.',
-'upload-prohibited' => 'OždraustÄ— failu tÄ—pÄ: $1.',
-'uploadlog' => 'ikielimu istuorÄ—jÄ—',
-'uploadlogpage' => 'Ikielimu istuorÄ—jÄ—',
-'uploadlogpagetext' => 'Žemiau pateikiam paskotėniu failu ikielima istuorėjė.',
-'filename' => 'Faila vards',
-'filedesc' => 'Kuomentars',
-'fileuploadsummary' => 'Kuomentars:',
-'uploadedfiles' => 'IkeltÄ— failÄ',
-'ignorewarning' => 'NekrÄ—iptÄ— diemiesÄ— i parspiejÄ—ma Ä—r Ä—Å¡auguotÄ— faila vÄ—svÄ—in.',
-'ignorewarnings' => 'NekrÄ—iptÄ— diemesÄ— i vÄ—suokius perspiejimos',
-'minlength1' => 'Faila pavadinėms tor būtė nuors vėina raidie.',
-'illegalfilename' => 'Faila vardė „$1“ īr sėmbuoliu, katrėi nier leidami poslapė pavadinėmūs. Prašuom parvadėntė faila ė miegītė ikeltė ana par naujė.',
-'badfilename' => 'Faila pavadinėms pakeists i „$1“.',
-'filetype-missing' => 'Fails netor galÅ«nÄ—s (kÄp pavÄ«zdÄ«s „.jpg“).',
-'emptyfile' => 'PanaÅ¡u, ka fails, katra ikieliet Ä«r toÅ¡Äias. Tas gal bÅ«tÄ— diel klaiduos faila pavadÄ—nÄ—mÄ—. PasÄ—tÄ—krinkÄ—t a tÄ—krÄ nuorÄ—t ikeltÄ— Å¡Ä—ta faila.',
-'fileexists' => "Fails so tuokiu vardu jau īr, prašuom paveizėtė '''<tt>[[:$1]]</tt>''', jēgo nesat ožtėkrėnts, a nuorit ana parrašītė.
-[[$1|thumb]]",
-'fileexists-extension' => "Fails so pavÄ—diu pavadinÄ—mu jau Ä«r: [[$2|thumb]]
-* Ikeliama faila pavadinÄ—ms: '''<tt>[[:$1]]</tt>'''
-* Jau esontÄ— faila pavadinÄ—ms: '''<tt>[[:$2]]</tt>'''
-Prašuom ėšsėrėnktė kėta varda.",
-'file-exists-duplicate' => 'Tas fails īr {{PLURAL:$1|šėta faila|šėtū failu}} doblėkats:',
-'successfulupload' => 'Ikelt siekmÄ—ngÄ',
-'uploadwarning' => 'DiemesÄ—',
-'savefile' => 'Ä–Å¡sauguotÄ— faila',
-'uploadedimage' => 'ikielė „[[$1]]“',
-'overwroteimage' => 'ikruovė nauja „[[$1]]“ versėjė',
-'uploaddisabledtext' => 'Failu ikielÄ—mÄ oždraustÄ— Ä«r.',
-'uploadscripted' => 'Å Ä—ts failos tor HTML a programÄ—ni kuoda, katros gal bÅ«tÄ— klaidÄ—ngÄ soprasts interneta narÅ¡Ä«klÄ—s.',
-'uploadvirus' => 'Å Ä—tom faile Ä«r virosas! Ä–Å¡samiau: $1',
-'sourcefilename' => 'Ikeliams fails',
-'destfilename' => 'Nuorims faila pavadinims',
-'upload-maxfilesize' => 'DÄ—dliausias faila dÄ—doms: $1',
-'watchthisupload' => 'KeravuotÄ— Å¡Ä—ta poslapÄ—',
-'upload-wasdeleted' => "'''ParspiejÄ—ms: Tamsta ikeliat faila, katros unkstiau bova Ä—Å¡trÄ—nts.'''
-
-Tamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.
-Tuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
-
-'upload-proto-error' => 'NateisÄ—ngs protuokols',
-'upload-proto-error-text' => 'Nutuolinē ikielims raikalaun, kū URL prasėdietu <code>http://</code> o <code>ftp://</code>.',
-'upload-file-error' => 'VÄ—dÄ—nÄ— klaida',
-'upload-file-error-text' => 'Ivīka vėdėnė klaida bandont sokortė laikinaji faila serverī. Prašuom sosėsėiktė so sistemuos admėnėstratuoriom.',
-'upload-misc-error' => 'Nažėnuoma ikielėma klaida',
-'upload-misc-error-text' => 'IvÄ«ka nežėnuoma klaida vÄ«kstont ikielÄ—mÅ. PraÅ¡uom patÄ—krÄ—nt, kÅ« URL teisÄ—ngs teipuogi pasÄ—ikiams Ä—r pamiegÄ«kit viel. JÄ“ bieda Ä—Å¡lÄ—ik, sosÄ—sÄ—ikÄ—t so sistemuos admÄ—nÄ—stratuoriom.',
-
-# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'Napavīkst pasėiktė URL',
-'upload-curl-error6-text' => 'Pataikts URL nagal būt pasėikts. Prašuom patėkrėntė, kū URL īr teisings ėr svetainė veik.',
-'upload-curl-error28' => 'Par Ä—lgÄ ikeliama',
-'upload-curl-error28-text' => 'AtsakontÄ— svetainÄ— ožtronk par Ä—lgÄ. PatÄ—krÄ—nkÄ—t, a svetainÄ— veik, palaukÄ—t tropoti Ä— vielÄ“ pamiegÄ«kit. Mažo TamstÄ rÄ“ktu pamiegÄ«tÄ— ne tuokio apkrauto Äieso.',
-
-'license' => 'LicensÄ—jÄ—',
-'license-header' => 'LicensÄ—jÄ—',
-'nolicense' => 'NepasÄ—rÄ—nkt',
-'license-nopreview' => '(Parveiza negalÄ—ma)',
-'upload_source_url' => ' (tÄ—krs, vÄ—iÅ¡Ä priÄ—inams URL)',
-'upload_source_file' => ' (fails Tamstas kompioterī)',
-
-# Special:ListFiles
-'listfiles-summary' => 'Tas specēlus poslapis ruod vėsus ikeltus failus.
-PalÄ“ numatÄ«ma paskiausÄ“ ikeltÄ— failÄ Ä«r ruoduomÄ— sÄroÅ¡a vÄ—rÅ¡ou.
-Paspaude ont štolpelė ontraštės pakeisėt ėšruokavėma.',
-'imgfile' => 'fails',
-'listfiles' => 'Failu sÄraÅ¡os',
-'listfiles_name' => 'PavadinÄ—ms',
-'listfiles_user' => 'Nauduotuos',
-'listfiles_size' => 'DÄ—doms',
-'listfiles_description' => 'Aprašīms',
-'listfiles_count' => 'VersÄ—jÄ—s',
-
-# File description page
-'file-anchor-link' => 'Fails',
-'filehist' => 'AbruozdielÄ— istuorÄ—jÄ—',
-'filehist-help' => 'PaspauskÄ—t ont datas/Äiesa, ka paveizietomÄ—t faila tuoki, kokis ons bova tÅ« Äiesu.',
-'filehist-deleteall' => 'trintÄ— vÄ—sus',
-'filehist-deleteone' => 'trintÄ— Å¡Ä—ta',
-'filehist-revert' => 'sogÅžėntÄ—',
-'filehist-current' => 'dabartÄ—nis',
-'filehist-datetime' => 'Data/ÄŒiesos',
-'filehist-thumb' => 'Miniatiūra',
-'filehist-thumbtext' => 'Versėjės $1 miniatiūra',
-'filehist-user' => 'Nauduotuos',
-'filehist-dimensions' => 'MierÄ',
-'filehist-filesize' => 'Faila dÄ—doms',
-'filehist-comment' => 'Kuomentars',
-'imagelinks' => 'Faila nūruodas',
-'linkstoimage' => '{{PLURAL:$1|Šėts poslapis|Šėtė poslapē}} nuruod i šėta faila:',
-'nolinkstoimage' => 'I faila neruod anÄ—juoks poslapis.',
-'sharedupload' => 'Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.',
-'uploadnewversion-linktext' => 'IkeltÄ— nauja faila versÄ—je',
-
-# File reversion
-'filerevert' => 'SogrÅžėntÄ— $1',
-'filerevert-legend' => 'Faila sogrÅžinÄ—ms',
-'filerevert-intro' => '<span class="plainlinks">Tamsta grÅžėnat \'\'\'[[Media:$1|$1]]\'\'\' i versÄ—je $4 ($2, $3).</span>',
-'filerevert-comment' => 'Kuomentars:',
-'filerevert-submit' => 'GrÅžėntÄ—',
-
-# File deletion
-'filedelete' => 'TrintÄ— $1',
-'filedelete-legend' => 'TrintÄ— faila',
-'filedelete-intro' => "Tamsta roušeties ėštrėntė faila '''[[Media:$1|$1]]''' so vėsa anuo istuorėjė.",
-'filedelete-comment' => 'Prīžastis:',
-'filedelete-submit' => 'TrintÄ—',
-'filedelete-success' => "'''$1''' bova Ä—Å¡trints.",
-'filedelete-nofile' => "'''$1''' nēsa.",
-'filedelete-otherreason' => 'Kėta/papėlduoma prīžastis:',
-'filedelete-reason-otherlist' => 'Kėta prīžastis',
-'filedelete-reason-dropdown' => '*Dažnas trīnėma prīžastīs
-** AutorÄ«stÄ—s teisiu pažeidÄ—mÄ
-** PasÄ—kartuojontis fails',
-'filedelete-edit-reasonlist' => 'Keistė trīnėma prīžastis',
-
-# MIME search
-'mimesearch' => 'MIME paėiška',
-'mimesearch-summary' => 'Šėts poslapis laid ruodīti failus vagol anū MIME tipa. Iveskėt: torėnėtips/potipis, pvz. <tt>image/jpeg</tt>.',
-'mimetype' => 'MIME tips:',
-'download' => 'parsėsiūstė',
-
-# Unwatched pages
-'unwatchedpages' => 'Nekeravuojėmė poslapē',
-
-# List redirects
-'listredirects' => 'ParadresavÄ—mu sÄraÅ¡os',
-
-# Unused templates
-'unusedtemplates' => 'NenauduojamÄ— Å¡abluonÄ',
-'unusedtemplatestext' => 'Å Ä—ts poslapis ruod sÄraÅ¡a poslapiu, esontiu Å¡abluonu vardÅ« srÄ—tÄ«, katrÄ— nÄ— iterptÄ— i juoki kÄ—ta poslapi. NepamÄ—rÅ¡kÄ—t patÄ—krÄ—ntÄ— kÄ—tÅ« nÅ«ruodu priÅ¡ anÅ«s Ä—Å¡trÄ—nont.',
-'unusedtemplateswlh' => 'kėtas nūruodas',
-
-# Random page
-'randompage' => 'Bikuoks poslapis',
-'randompage-nopages' => 'Šėtuo vardū srėti nier anėjuokiu poslapiu.',
-
-# Random redirect
-'randomredirect' => 'Bikuoks paradresavÄ—ms',
-'randomredirect-nopages' => 'Šėtuo vardū srėti nier anėjuokiū paradresavėmu.',
-
-# Statistics
-'statistics' => 'StatÄ—stÄ—ka',
-'statistics-header-pages' => 'Poslapiu statÄ—stÄ—ka',
-'statistics-header-edits' => 'RedagavÄ—mu statÄ—stÄ—ka',
-'statistics-header-views' => 'Parveizu statistÄ—ka',
-'statistics-header-users' => 'Nauduotuoju statÄ—stÄ—ka',
-'statistics-articles' => 'Torėnė poslapē',
-'statistics-pages' => 'Poslapē',
-'statistics-files' => 'IkeltÄ— failÄ',
-'statistics-edits' => 'Poslapiu redagavėmu skaitlius nū {{SITENAME}} sokūrėma',
-'statistics-edits-average' => 'VÄ—dotÄ—nis keitÄ—mu skaitlius poslapiÅ',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Oždoutiū eilės] ėlgoms',
-'statistics-users' => 'Ožsėregėstravosiu [[Special:ListUsers|nauduotuoju]]',
-'statistics-users-active' => 'Aktīviu nauduotuoju',
-'statistics-mostpopular' => 'Daugiausē ruodītė poslapē',
-
-'disambiguations' => 'Daugiareikšmiu žuodiu poslapē',
-
-'doubleredirects' => 'DvÄ—gobÄ— paradresavÄ—mÄ',
-'doubleredirectstext' => 'TÄ—i paradresavÄ—mÄ ruod i kÄ—tus paradresavÄ—ma poslapius. Kuožnuo eilotÄ“ pamÄ—navuots pÄ—rmasÄ Ä—r ontrasÄ paradresavÄ—mÄ, tÄ“puogi ontrojÄ— paradresavÄ—ma paskÄ—rtis, katra paprastÄ Ä— paruod i tÄ—kraji poslapi, i katra pÄ—rmasÄ paradresavÄ—ms Ä— torietu ruodÄ«tÄ—.',
-'double-redirect-fixed-move' => '[[$1]] bova parkelts, daba tas Ä«r paradresavÄ—ms i [[$2]]',
-
-'brokenredirects' => 'NeveikiantÄ«s paradresavÄ—mÄ',
-'brokenredirectstext' => 'Žemiau ėšvardintė paradresavėma poslapē ruod i nasontius poslapius:',
-'brokenredirects-edit' => 'redagoutÄ—',
-'brokenredirects-delete' => 'trintÄ—',
-
-'withoutinterwiki' => 'Poslapē ba kalbū nūruodu',
-'withoutinterwiki-summary' => 'Šėtė poslapē neruod i kėtū kalbū versėjės:',
-'withoutinterwiki-submit' => 'Ruodītė',
-
-'fewestrevisions' => 'Straipsnē so mažiausė pakeitėmu',
-
-# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|baits|baitÄ|baitu}}',
-'ncategories' => '$1 {{PLURAL:$1|kateguorÄ—jÄ—|kateguorÄ—jÄ—s|kateguorÄ—ju}}',
-'nlinks' => '$1 {{PLURAL:$1|nūruoda|nūruodas|nūruodu}}',
-'nmembers' => '$1 {{PLURAL:$1|narīs|narē|nariū}}',
-'nrevisions' => '$1 {{PLURAL:$1|pakeitÄ—ms|pakeitÄ—mÄ|pakeitÄ—mu}}',
-'nviews' => '$1 {{PLURAL:$1|paruodÄ«ms|paruodÄ«mÄ|paruodÄ«mu}}',
-'specialpage-empty' => 'Å Ä—tÄ ataskaitÄ nie rezoltatu.',
-'lonelypages' => 'Vėinišė straipsnē',
-'lonelypagestext' => 'I šėtuos poslapius nier nūruodu ėš kėtū šėta pruojekta poslapiu.',
-'uncategorizedpages' => 'Poslapē, napriskėrtė juokē kateguorėjē',
-'uncategorizedcategories' => 'Kateguorėjės, naprėskėrtas juokē kateguorėjē',
-'uncategorizedimages' => 'Abruozdielē, nepriskėrtė juokē kateguorėjē',
-'uncategorizedtemplates' => 'Å abluonÄ, nepriskÄ—rtÄ— juokÄ“ kateguorÄ—jÄ“',
-'unusedcategories' => 'Nenauduojamas kateguorÄ—jÄ—s',
-'unusedimages' => 'NenauduojamÄ— failÄ',
-'wantedcategories' => 'NuorÄ—miausÄ—s kateguorÄ—jÄ—s',
-'wantedpages' => 'Nuorėmiausē poslapē',
-'wantedfiles' => 'NuorÄ—mÄ— failÄ',
-'wantedtemplates' => 'NuorÄ—mÄ— Å¡abluonÄ',
-'mostlinked' => 'Daugiausē ruodomė straipsnē',
-'mostlinkedcategories' => 'Daugiausē ruodomas kateguorėjės',
-'mostlinkedtemplates' => 'DaugiausÄ“ ruodomÄ— Å¡abluonÄ',
-'mostcategories' => 'Straipsnē so daugiausē kateguorėju',
-'mostimages' => 'Daugiausē ruodomė abruozdielē',
-'mostrevisions' => 'Straipsnē so daugiausē keitėmu',
-'prefixindex' => 'Vėsė poslapē so prīšdielio',
-'shortpages' => 'Trompiausė poslapē',
-'longpages' => 'Ėlgiausė poslapē',
-'deadendpages' => 'Straipsnē-aklavėitės',
-'deadendpagestext' => 'Tė poslapē netor nūruodu i kėtus poslapius šėtom pruojektė.',
-'protectedpages' => 'Apsauguotė poslapē',
-'protectedpagestext' => 'Šėtē poslapē īr apsauguotė nū parkielėma a redagavėma',
-'protectedpagesempty' => 'Å Ä—tu Äiesu nier apsauguots anÄ—juoks fails so Å¡Ä—tÄs parametrÄs.',
-'protectedtitles' => 'ApsauguotÄ— pavadinÄ—mÄ',
-'protectedtitlesempty' => 'Å Ä—tou Äieso nier anÄ—juokÄ— pavadinÄ—ma, katros apsauguots tÄs parametrÄs.',
-'listusers' => 'SÄraÅ¡os nauduotuoju',
-'listusers-editsonly' => 'RuodÄ«tÄ— tÄ—ktÄs nauduotuojus katrÄ—i Ä«r atlÄ—kÄ— pakeitÄ—mus',
-'newpages' => 'Naujausė straipsnē',
-'newpages-username' => 'NauduotuojÄ— vards:',
-'ancientpages' => 'Seniausė poslapē',
-'move' => 'ParvadintÄ—',
-'movethispage' => 'ParvadintÄ— Å¡Ä—ta poslapi',
-'unusedimagestext' => 'Primenam, kÅ« kÄ—tas svetainÄ—s gal bÅ«tÄ— nuruodiosÄ—s i abruozdieli tÄ—isiogÄ—niu URL, no vÄ—stÄ—ik gal bÅ«tÄ— Å¡Ä—tom sÄraÅ¡Ä—, nuors Ä—r Ä«r aktÄ«vÄ“ naudounams.',
-'unusedcategoriestext' => 'Šėtū kateguorėju poslapē sokortė, nuors juoks kėts straipsnis a kateguorėjė ana nenauduo.',
-'notargettitle' => 'Nenuruodīts objekts',
-'notargettext' => 'Tamsta nenuruodiet nuorima poslapÄ— a nauduotuojÄ—,
-katram ivīkdītė šėta funkcėjė.',
-'pager-newer-n' => '$1 {{PLURAL:$1|paskesnis|paskesni|paskesniū}}',
-'pager-older-n' => '{{PLURAL:$1|senesnis|senesni|senesniū}}',
-
-# Book sources
-'booksources' => 'Knīngu šaltinē',
-'booksources-search-legend' => 'Knīngu šaltiniu paėiška',
-'booksources-go' => 'Ä’k!',
-
-# Special:Log
-'specialloguserlabel' => 'Nauduotuos:',
-'speciallogtitlelabel' => 'PavadÄ—nims:',
-'log' => 'Specēliūju veiksmū istuorėjė',
-'all-logs-page' => 'VÄ—sos istuorÄ—jÄ—s',
-'alllogstext' => 'Bėndra idietu failu, ėštrīnėmu, ožrakėnėmu, bluokavėmu ė prėvėlėju soteikėmu istuorėjė.
-Īr galėmībė somažintė rezoltatu skaitliu patėkslėnont vēksma tėpa, nauduotuojė a sosėjosė poslapė.',
-'logempty' => 'Istuorėjuo nier anėjuokiū atitinkontiu atsėtėkimu.',
-'log-title-wildcard' => 'Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto',
-
-# Special:AllPages
-'allpages' => 'Vėsė straipsnē',
-'alphaindexline' => 'Nu $1 lÄ—g $2',
-'nextpage' => 'KÄ—ts poslapis ($1)',
-'prevpage' => 'Unkstesnis poslapis ($1)',
-'allpagesfrom' => 'Ruodītė poslapius pradedont nu:',
-'allpagesto' => 'RuodÄ«tÄ— poslapius, basÄ—bengÄ—nÄios so:',
-'allarticles' => 'Vėsė straipsnē',
-'allinnamespace' => 'Vėsė poslapē (srėtis - $1)',
-'allnotinnamespace' => 'Vėsė poslapē (nesontīs šiuo srėtie - $1)',
-'allpagesprev' => 'Onkstesnis',
-'allpagesnext' => 'Sekontis',
-'allpagessubmit' => 'Tink',
-'allpagesprefix' => 'Ruodītė poslapios so prīdelēs:',
-'allpagesbadtitle' => 'Douts poslapÄ— pavadÄ—nÄ—ms Ä«r neteisings a tor terpkalbÄ—nÄ— a terppruojektÄ—nÄ— prÄ«dielÄ—. AnamÄ— Ä«r vÄ—ns a kelÄ— žėnklÄ, katrÅ« negal nauduotÄ— pavadÄ—nÄ—mÅ«s.',
-'allpages-bad-ns' => '{{SITENAME}} netor „$1“ vardū srėtėis.',
-
-# Special:Categories
-'categories' => 'KateguorÄ—jÄ—s',
-'categoriespagetext' => 'Pruojekte Ä«r Å¡Ä—tuos kateguorÄ—jÄ—s.',
-'categoriesfrom' => 'Ruodītė kateguorėjės pradedont nu:',
-
-# Special:DeletedContributions
-'deletedcontributions' => 'PanaikÄ—nts nauduotuojÄ— duovis',
-'deletedcontributions-title' => 'Ä–Å¡trÄ—nts nauduotuojÄ— duovis',
-
-# Special:LinkSearch
-'linksearch' => 'Ėšuorėnės nūruodas',
-'linksearch-ns' => 'Vardū srėtis:',
-'linksearch-ok' => 'Ėiškuotė',
-
-# Special:ListUsers
-'listusersfrom' => 'Ruodītė nauduotuojus pradedont nū:',
-'listusers-submit' => 'Ruodītė',
-'listusers-noresult' => 'Nerast anėjuokiū nauduotuoju.',
-
-# Special:Log/newusers
-'newuserlogpage' => 'Nauduotuojė kūrėma regėstros',
-'newuserlog-byemail' => 'slaptažuodis Ä—Å¡siÅsts par el. paÅ¡ta',
-'newuserlog-create-entry' => 'Naus nauduotuos',
-
-# Special:ListGroupRights
-'listgrouprights' => 'Nauduotuoju gropiu teisÄ—s',
-'listgrouprights-group' => 'GropÄ—',
-'listgrouprights-members' => '(nariÅ« sÄroÅ¡os)',
-
-# E-mail user
-'mailnologin' => 'Nier adresa',
-'mailnologintext' => 'TamstÄ reik bÅ«tÄ— [[Special:UserLogin|prisÄ—jongosiam]]
-ė tor būtė ivests teisings el. pašta adresos Tamstas [[Special:Preferences|nustatīmuos]],
-kÅ« siÅstomiet el. gruomatas kÄ—tÄ—m nauduotuojam.',
-'emailuser' => 'RaÅ¡Ä«tÄ— gruomata Å¡Ä—tam nauduotuojÅ',
-'emailpage' => 'Siūstė el. gruomata nauduotuojui',
-'usermailererror' => 'PaÅ¡ta objekts grÅžėna klaida:',
-'noemailtitle' => 'Nier el. pašta adreso',
-'noemailtext' => 'Šėts nauduotuos nier nuruodės teisėnga el.pašta adresa a īr pasėrinkės negautė el. pašta ėš kėtū nauduotuoju.',
-'email-legend' => 'SiÅ«stÄ— elektruonÄ—ne gruomata kÄ—tam {{SITENAME}} nauduotuojÅ',
-'emailfrom' => 'NÅ«:',
-'emailmessage' => 'Pranešėms:',
-'emailsend' => 'SiÅstÄ—',
-'emailccme' => 'SiÅstÄ— monei mona gruomatas kuopÄ—jÄ—.',
-'emailccsubject' => 'Gruomatas kuopÄ—jÄ— nauduotuojÅ $1: $2',
-'emailsent' => 'El. gruomata Ä—Å¡siÅsta',
-'emailsenttext' => 'Tamstas el. paÅ¡ta žėnotÄ— Ä—Å¡siÅsta.',
-
-# Watchlist
-'watchlist' => 'Keravuojamė straipsnē',
-'mywatchlist' => 'Keravuojamė poslapē',
-'watchlistfor' => "(nauduotuojÄ— '''$1''')",
-'nowatchlist' => 'NetorÄ—t anÄ—vÄ—ina keravuojama poslapÄ—.',
-'watchlistanontext' => 'PraÅ¡uom $1, ka parveizietomÄ—t a pakeistomiet elementus sava keravuojamu sÄraÅ¡Ä—.',
-'watchnologin' => 'NeprisÄ—jongÄ—s',
-'watchnologintext' => 'TamstÄ rÄ“k bÅ«tÄ— [[Special:UserLogin|prisÄ—jongosiam]], ka pakeistomiet sava keravuojamu sÄraÅ¡a.',
-'addedwatch' => 'Pridieta pri keravuojamu',
-'addedwatchtext' => "Poslapis \"[[\$1]]\" idiets i [[Special:Watchlist|keravuojamu sÄraÅ¡a]].
-BÅ«santÄ«s poslapÄ— Ä—r atÄ—tinkama aptarÄ—ma poslapÄ— pakeitÄ—mÄ bus paruoduomÄ— keravuojamu poslapiu sÄraÅ¡Ä—,
-tÄ“puogi bus '''parÄ«Å¡kintÄ—''' [[Special:RecentChanges|vielÄ«bÅ«ju pakeitÄ—mu sÄraÅ¡Ä—]], kÅ« Ä—Å¡sÄ—skÄ—rtom Ä—Å¡ kÄ—tÅ« straipsniu.
-Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"nebkeravuotė\" vėršotėniam meniū.",
-'removedwatch' => 'Pašalėntė ėš keravuojamu',
-'removedwatchtext' => 'Poslapis „[[:$1]]“ paÅ¡alÄ—nts Ä—Å¡ [[Special:Watchlist|Tamstas keravuojamu sÄraÅ¡a]].',
-'watch' => 'KeravuotÄ—',
-'watchthispage' => 'KeravuotÄ— Å¡Ä—ta poslapÄ—',
-'unwatch' => 'NebkeravuotÄ—',
-'unwatchthispage' => 'NustuotÄ— keravuotÄ—',
-'notanarticle' => 'Ne torÄ—nÄ— poslapis',
-'watchnochange' => 'PasÄ—rÄ—nkto Äieso nebova redagouts nÄ— vÄ—ins keravuojams straipsnis.',
-'watchlist-details' => 'Keravuojama $1 {{PLURAL:$1|poslapis|$1 poslapē|$1 poslapiu}} neskaitlioujant aptarėmu poslapiu.',
-'wlheader-enotif' => '* El. paÅ¡ta primÄ—nÄ—mÄ ijongtÄ— Ä«r.',
-'wlheader-showupdated' => "* PoslapÄ“, katrÄ—i pakeistÄ— nu Tamstas paskotÄ—nÄ— apsÄ—lonkÄ—ma Äiesa anÅ«s, Ä«r pažīmietÄ— '''pastuorintÄ'''",
-'watchmethod-recent' => 'tÄ—krÄ—namÄ— vielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ keravuojamiems poslapiams',
-'watchmethod-list' => 'Ėiškuoma vielībūju pakeitėmu keravuojamūs poslapiūs',
-'watchlistcontains' => 'Tamstas kervuojamu sÄraÅ¡Ä— Ä«r $1 {{PLURAL:$1|poslapis|poslapÄ“|poslapiu}}.',
-'wlnote' => "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
-'wlshowlast' => 'Ruodītė paskotėniu $1 adīnu, $2 dėinū a $3 pakeitėmus',
-'watchlist-options' => 'Keravuojamu sÄroÅ¡a pasÄ—rinkÄ—mÄ',
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Itraukiama i keravuojamu sÄraÅ¡a...',
-'unwatching' => 'Å alÄ—nama Ä—Å¡ keravuojamu sÄraÅ¡a...',
-
-'enotif_reset' => 'PažīmietÄ— vÄ—sus poslapius kÄp aplonkÄ«tus',
-'enotif_newpagetext' => 'Tas Ä«r naus poslapis.',
-'changed' => 'pakeitÄ—',
-'created' => 'sokūrė',
-'enotif_anon_editor' => 'anuonÄ—minis nauduotuos $1',
-
-# Delete
-'deletepage' => 'TrintÄ— poslapi',
-'confirm' => 'Ožtvėrtinu',
-'excontent' => 'boves torinīs: „$1“',
-'excontentauthor' => 'boves torinÄ«s: „$1“ (redagava tÄ—ktÄs „[[Special:Contributions/$2|$2]]“)',
-'exbeforeblank' => 'priš ėštrinant torinīs bova: „$1“',
-'exblank' => 'poslapis bova tuÅ¡Äes',
-'delete-confirm' => 'Ä–Å¡trÄ—nta "$1"',
-'delete-legend' => 'Trīnėms',
-'historywarning' => 'DiemesÄ—: TrÄ—nams poslapis tor istuorÄ—jÄ—:',
-'confirmdeletetext' => 'Tamsta pasÄ—rÄ—nkuot Ä—Å¡trÄ—ntÄ— poslapi a abruozdieli draugum so vÄ—sa anuo istuorÄ—jÄ—.
-PraÅ¡uom patvÄ—rtÄ—ntÄ—, kÅ« Tamsta tÄ—krÄ nuorÄ—t Å¡Ä—tu padarÄ«tÄ—, žėnuot aple galÄ—mus padarÄ—nius, Ä— kÅ« Tamsta Å¡Ä—tÄ daruot atsėžvelgdamÄ— i [[{{MediaWiki:Policy-url}}|puolitÄ—ka]].',
-'actioncomplete' => 'VÄ“ksmos atlÄ—kts Ä«r',
-'deletedtext' => '„$1“ ėštrints.
-Paskotiniu pašalinėmu istuorėjė - $2.',
-'deletedarticle' => 'ėštrīnė „[[$1]]“',
-'suppressedarticle' => 'apžabuots „[[$1]]“',
-'dellogpage' => 'Pašalinėmu istuorėjė',
-'dellogpagetext' => 'Žemiau Ä«r pateikiams paskotiniu Ä—Å¡trÄ«nimu sÄraÅ¡os.',
-'deletionlog' => 'pašalinėmu istuorėjė',
-'reverted' => 'Atkorta i onkstesne versÄ—je',
-'deletecomment' => 'Prīžastis:',
-'deleteotherreason' => 'Kėta/papėlduoma prižastis:',
-'deletereasonotherlist' => 'Kėta prižastis',
-'deletereason-dropdown' => '*Dažnas trīnėma prižastīs
-** Autorė prašīms
-** Autorėniu teisiu pažeidėms
-** VandalÄ—zmos',
-'delete-edit-reasonlist' => 'Keistė trėnėma prīžastis',
-
-# Rollback
-'rollback' => 'AtmestÄ— pakeitÄ—mos',
-'rollback_short' => 'AtmestÄ—',
-'rollbacklink' => 'atmestÄ—',
-'rollbackfailed' => 'Atmetims napavīka',
-'cantrollback' => 'NegalÄ—ma atmestÄ— redagavÄ—ma; paskotinis keitÄ—s nauduotuos Ä«r tuo poslapÄ— autorius.',
-'alreadyrolled' => 'Nepavīka atmestė paskotėnė [[User:$2|$2]] ([[User talk:$2|Aptarėms]]) darīta straipsnė [[$1]] keitėma;
-kažkas jau pakeitė straipsnė arba sospiejė pėrmiesnis atmestė keitėma.
-
-GalÄ—nis keitÄ—ms dÄ—rbts nauduotuojÄ— [[User:$3|$3]] ([[User talk:$3|AptarÄ—ms]]).',
-'editcomment' => "Redagavėma kuomentars bova: „''$1''“.",
-'revertpage' => 'Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|AptarÄ—ms]]) pakeitÄ—ms; sogrÅžėnta nauduotuojÄ— [[User:$1|$1]] versÄ—jÄ—',
-'rollback-success' => 'AtmestÄ— $1 keitÄ—mÄ; grÅžėnta i paskotÄ—ne $2 versÄ—je.',
-'sessionfailure' => 'Atruod kÅ« Ä«r biedÅ« so Tamstas prÄ—sÄ—jongÄ—ma sesÄ—jÄ—; Å¡Ä—ts veiksmos bova atÅ¡aukts kÄp atsargoma prÄ—imonÄ— priÅ¡ sesÄ—jÄ—s vuogÄ—ma.
-Prašoum paspaustė „atgal“ ėr parkrautė poslapi ėš katruo atiejot, ė pamieginkėt vielē.',
-
-# Protect
-'protectlogpage' => 'RakinÄ—mu istuorÄ—jÄ—',
-'protectlogtext' => 'Žemiau Ä«r poslapÄ— ožrakinÄ—mu tÄ“puogi atrakinÄ—mu istuorÄ—jÄ—. NÅ«nÄ veikiantiu poslapiu apsaugÅ« sÄraÅ¡a sorasÄ—t [[Special:ProtectedPages|apsauguotu poslapiu saraÅ¡Ä—]].',
-'protectedarticle' => 'ožrakina „[[$1]]“',
-'modifiedarticleprotection' => 'pakeists „[[$1]]“ apsauguos līgis',
-'unprotectedarticle' => 'atrakėna „[[$1]]“',
-'protect-title' => 'Nustatuoms apsauguojėma līgis poslapiŠ„$1“',
-'prot_1movedto2' => 'Straipsnis [[$1]] parvadints i [[$2]]',
-'protect-legend' => 'Ožrakinėma patvėrtinėms',
-'protectcomment' => 'Prīžastis:',
-'protectexpiry' => 'Beng galiuotÄ—:',
-'protect_expiry_invalid' => 'GaliuojÄ—ma Äiesos Ä«r nateisÄ—ngs.',
-'protect_expiry_old' => 'GaliuojÄ—ma Äiesos Ä«r praÄ—itÄ«.',
-'protect-text' => "Čė Tamsta galėt paveizėtė ė pakeistė apsauguos līgi šėtuo poslapio '''$1'''.",
-'protect-locked-access' => "Tamstas paskīra netor teisiu keistė poslapiu apsauguos līgiu.
-Čė Ä«r dabartÄ—nÄ“ nustatÄ«mÄ poslapiÅ '''$1''':",
-'protect-cascadeon' => 'Tas poslapis nÅ«nÄ Ä«r apsauguots, kadongi ons Ä«r itraukts i {{PLURAL:$1|ta poslapi, apsauguota|tÅ«s poslapiÅ«s, apsauguotus}} „pakuopÄ—nÄ—s apsauguos“ pasÄ—rÄ—nkÄ—mu. Tamsta galÄ—t pakeistÄ— Å¡Ä—ta poslapÄ— apsauguos lÄ«gi, no tas nepaveiks pakuopÄ—nÄ—s apsauguos.',
-'protect-default' => 'LeistÄ— vÄ—sÄ—ms nauduotuojams',
-'protect-fallback' => 'Rēkalautė „$1“ teisės',
-'protect-level-autoconfirmed' => 'Blokoutė naujē prisėregėstravosius ė neregėstroutus nauduotuojus',
-'protect-level-sysop' => 'TÄ—ktÄs adminÄ—stratuorÄ“',
-'protect-summary-cascade' => 'pakuopÄ—nÄ— apsauga',
-'protect-expiring' => 'beng galiuotÄ— $1 (UTC)',
-'protect-expiry-indefinite' => 'nerÄ—buotÄ',
-'protect-cascade' => 'ApsaugotÄ— poslapius, itrauktus i Å¡Ä—ta poslapi (pakuopÄ—nÄ— apsauga).',
-'protect-cantedit' => 'Tamsta negalėt keistė šėta poslapė apsauguojėma līgiu, kagongi netorėt teisiu anuo redagoutė.',
-'protect-othertime' => 'KÄ—ts Äiesos:',
-'protect-othertime-op' => 'kÄ—ts Äiesos',
-'protect-existing-expiry' => 'Esams rakÄ—nÄ—ma ožsÄ—bengÄ—ma Äiesos: $3, $2',
-'protect-otherreason' => 'Kėta/papėlduoma prīžastis:',
-'protect-otherreason-op' => 'kėta/papėlduoma prīžastis',
-'protect-dropdown' => '*Iprastas ožrakinėma prīžastīs
-** Intensīvus vandalėzmos
-** Intensīvus nūruodu reklamavėms
-** Neproduktīvi redagavėma vaina
-** DÄ—dlÄ— svarboma poslapis',
-'protect-edit-reasonlist' => 'Keistė ožrakinėma prīžastis',
-'protect-expiry-options' => '1 adÄ«na:1 hour,1 dÄ—ina:1 day,1 nedielÄ—:1 week,2 nedielÄ—s:2 weeks,1 mienou:1 month,3 mieniesÄ“:3 months,6 mieniesÄ“:6 months,1 metÄ:1 year,par omžius:infinite',
-'restriction-type' => 'LaidÄ—ms:',
-'restriction-level' => 'Aprėbuojėma līgis:',
-'minimum-size' => 'MinÄ—malus dÄ—doms',
-'maximum-size' => 'DÄ—dliausis dÄ—doms',
-'pagesize' => '(baitÄs)',
-
-# Restrictions (nouns)
-'restriction-edit' => 'RedagavÄ—ms',
-'restriction-move' => 'ParvadÄ—nÄ—ms',
-'restriction-create' => 'SokortÄ—',
-'restriction-upload' => 'IkeltÄ—',
-
-# Restriction levels
-'restriction-level-sysop' => 'pÄ—lnÄ apsauguota',
-'restriction-level-autoconfirmed' => 'posiau apsauguota',
-'restriction-level-all' => 'bikuoks',
-
-# Undelete
-'undelete' => 'Atstatītė ėštrinta poslapi',
-'undeletepage' => 'Ruodītė ė atkortė ėštrintos poslapios',
-'viewdeletedpage' => 'Ruodītė ėštrintos poslapios',
-'undeletepagetext' => 'Žemiau ėšvardėntė poslapē īr ėštrėntė, no da laikuomi
-arkÄ«ve, tudie anie gal bÅ«t atstatÄ«tÄ—. ArkÄ«vs gal bÅ«t perÄ“odÄ—Å¡kÄ valuoms.',
-'undeleteextrahelp' => "Nuoriedamė atkortė vėsa poslapi, palikit vėsas varnales napažīmietas ėr
-spauskėt '''''Atkortė'''''. Nuoriedamiė atlėktė pasirėnktini atstatīma, pažīmiekit varnales šėtū versėju, katras nuorietomiet atstatītė, ėr spauskėt '''''Atkortė'''''. Paspaudus
-'''''Ėš naujė''''' bos ėšvalītuos vėsos varnalės ėr kuomentara lauks.",
-'undeleterevisions' => '$1 {{PLURAL:$1|versėjė|versėjės|versėju}} soarkīvouta',
-'undeletehistory' => 'Jē atstatīsėt straipsni, istuorėjuo bos atstatītuos vėsos versėjės.
-Jē puo ėštrīnima bova sokuots straipsnis tuokiuo patio pavadėnėmo,
-atstatītuos versėjės atsiras onkstesnie istuorėjuo, o dabartėnė
-versÄ—jÄ— lÄ—ks napakeista. Atkoriant Ä«r prarondamÄ— apribuojimÄ failu versÄ—juom.',
-'undeleterevdel' => 'AtkorÄ—ms nebus ivÄ«kdÄ«ts, jÄ“ Å¡Ä—tÄ nulems paskotÄ—nÄ—s poslapÄ— versÄ—jÄ—s dalini Ä—Å¡trÄ«nima.
-TuokÄ“s atvejÄs, TamstÄ rÄ“k atžīmietÄ— a atkavuotÄ— naujausÄ“s Ä—Å¡trintas versÄ—jÄ—s.
-Failu versėjės, katrū netorėt teisiu veizėtė, nebus atkortas.',
-'undeletehistorynoadmin' => 'Šėts straipsnis bova ėštrints. Trīnima prižastis
-ruodoma žemiau, teipuogi kas redagava poslapi
-lėgė trīnima. Ėštrintū poslapiu tekstos īr galėmas tėk admėnėstratuoriam.',
-'undelete-revision' => 'Ä–Å¡trÄ—nta $1 versÄ—jÄ—, katra $4 d. $5 padÄ—rba $3:',
-'undeleterevision-missing' => 'Neteisėnga a dėngosė versėjė. Tamsta mažo torėt bluoga nūruoda, a versėjė bova atkorta a pašalėnta ėš arkīva.',
-'undeletebtn' => 'AtkortÄ—',
-'undeletelink' => 'veizietė/atstatītė',
-'undeletereset' => 'Ä–Å¡ naujÄ—',
-'undeleteinvert' => 'ŽīmietÄ— prÄ«Å¡Ä—ngÄ',
-'undeletecomment' => 'Kuomentars:',
-'undeletedarticle' => 'atkorta „[[$1]]“',
-'undeletedrevisions' => 'atkorta $1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}}',
-'undeletedrevisions-files' => 'atkorta $1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}} Ä—r $2 {{PLURAL:$2|fails|failÄ|failu}}',
-'undeletedfiles' => 'atkorta $1 {{PLURAL:$1|fails|failÄ|failu}}',
-'undeletedpage' => "'''$1 bova atkurts'''
-ParveizÄ—kiet [[Special:Log/delete|trÄ«nimu sÄraÅ¡a]], nuoriedamÄ— rastÄ— paskotÄ—niu trÄ«nimu Ä—r atkorÄ—mu sÄraÅ¡a.",
-'undelete-header' => 'Veizėkit [[Special:Log/delete|trīnima istuorėjuo]] paskoteniausē ėštrintū poslapiu.',
-'undelete-search-box' => 'Ėiškuotė ėštrintū poslapiu',
-'undelete-search-prefix' => 'Ruodītė poslapios pradedant so:',
-'undelete-search-submit' => 'Ėiškuotė',
-'undelete-no-results' => 'Nabova rasta juokė atėtėnkontė poslapė ėštrīnima arkīve.',
-'undelete-show-file-confirm' => 'A Ä—Å¡ tÄ—krÄ nuorÄ—t parveizietÄ— Ä—Å¡trÄ—nta faila „<nowiki>$1</nowiki>“ $2 $3 versÄ—jÄ—?',
-'undelete-show-file-submit' => 'TÄ“p',
-
-# Namespace form on various pages
-'namespace' => 'Vardū srėtis:',
-'invert' => 'ŽīmietÄ— prÄ«Å¡Ä—ngÄ',
-'blanknamespace' => '(PagrÄ—ndinÄ—)',
-
-# Contributions
-'contributions' => 'NauduotuojÄ— duovis',
-'contributions-title' => 'NauduotuojÄ— $1 duovis',
-'mycontris' => 'Mona duovis',
-'contribsub2' => 'NauduotuojÄ— $1 ($2)',
-'uctop' => ' (paskotinis)',
-'month' => 'Nu mienÄ—sÄ— (Ä—r onkstiau):',
-'year' => 'Nu metu (Ä—r onkstiau):',
-
-'sp-contributions-newbies' => 'Ruodītė tėk naujū prieteliu duovios',
-'sp-contributions-newbies-sub' => 'Naujuoms paskīruoms',
-'sp-contributions-newbies-title' => 'Nauduotuoju keitÄ—mÄ naujuoms paskÄ«ruoms',
-'sp-contributions-blocklog' => 'BluokavÄ—mu istuorÄ—jÄ—',
-'sp-contributions-deleted' => 'PanaikÄ—nts nauduotuojÄ— duovis',
-'sp-contributions-talk' => 'AptarÄ—ms',
-'sp-contributions-userrights' => 'Nauduotuoju teisiu valdīms',
-'sp-contributions-search' => 'Ėiškuotė duovė',
-'sp-contributions-username' => 'IP adresos a nauduotuojÄ— vards:',
-'sp-contributions-submit' => 'Ėiškuotė',
-
-# What links here
-'whatlinkshere' => 'Sosėjėn straipsnē',
-'whatlinkshere-title' => 'Poslapē, katrėi ruod i "$1"',
-'whatlinkshere-page' => 'Poslapis:',
-'linkshere' => "Šėtė poslapē ruod i '''[[:$1]]''':",
-'nolinkshere' => "I '''[[:$1]]''' nūruodu nier.",
-'nolinkshere-ns' => "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''[[:$1]]'''.",
-'isredirect' => 'nukreipēmasės poslapis',
-'istemplate' => 'iterpims',
-'isimage' => 'abruozdielė nūruoda',
-'whatlinkshere-prev' => '$1 {{PLURAL:$1|onkstesnis|onkstesni|onkstesniū}}',
-'whatlinkshere-next' => '$1 {{PLURAL:$1|kėts|kėtė|kėtū}}',
-'whatlinkshere-links' => '↠nūruodas',
-'whatlinkshere-hideredirs' => '$1 nukreipÄ—mus',
-'whatlinkshere-hidetrans' => '$1 itraukÄ—mus',
-'whatlinkshere-hidelinks' => '$1 nūruodas',
-'whatlinkshere-hideimages' => '$1 abruozdieliu nūruodas',
-'whatlinkshere-filters' => 'FÄ—ltrÄ',
-
-# Block/unblock
-'blockip' => 'Ožblokoutė nauduotuoja',
-'blockip-legend' => 'BlokoutÄ— nauduotuoja',
-'blockiptext' => 'Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].
-Žemiau nuruodīkėt tėkslē prižastė.',
-'ipaddress' => 'IP adresos',
-'ipadressorusername' => 'IP adresos a nauduotuojÄ— vards',
-'ipbexpiry' => 'GaliuojÄ—ma Äiesos',
-'ipbreason' => 'Prīžastis:',
-'ipbreasonotherlist' => 'Kėta prīžastis',
-'ipbreason-dropdown' => '*Dažniausės bluokavėma prižastīs
-** Melagėngas infuormacėjės rašīms
-** Torėnė trīnims ėš poslapiu
-** Spaminims
-** Zaunu/bikuo rašīms i poslapios
-** GondinÄ—mÄ/PÄ—ktžuodiavÄ—mÄ
-** Pėktnaudžiavėms paskėruomis
-** NetÄ—nkams nauduotuojÄ— vards',
-'ipbanononly' => 'BlokoutÄ— tÄ—ktÄs anuonimÄ—nius nauduotuojus',
-'ipbcreateaccount' => 'Nelaistė kortė paskīrū',
-'ipbemailban' => 'NelaistÄ— nauduotuojÅ siÅstÄ— el. gruomatas',
-'ipbenableautoblock' => 'AutuomatÄ—Å¡kÄ blokoutÄ— tuo nauduotuojÄ— paskiausÄ“ nauduota IP adresa, Ä— bikuokius paskesnius IP adresus, Ä—Å¡ katrÅ« ons miegin redagoutÄ—',
-'ipbsubmit' => 'BlokoutÄ— Å¡Ä—ta nauduotuoja',
-'ipbother' => 'KÄ—tuoks Äiesos',
-'ipboptions' => '2 adÄ«nas:2 hours,1 dÄ—ina:1 day,3 dÄ—inas:3 days,1 nedielÄ—:1 week,2 nedielÄ—s:2 weeks,1 mienou:1 month,3 mienesÄ“:3 months,6 mienesÄ“:6 months,1 metÄ:1 year,omžėms:infinite',
-'ipbotheroption' => 'kÄ—ta',
-'ipbotherreason' => 'Kėta/papėlduoma prižastis',
-'ipbwatchuser' => 'KeravuotÄ— tuo nauduotuojÄ— poslapi Ä—r anuo aptarÄ—ma poslapi',
-'ipb-change-block' => 'ParblokoutÄ— ta nauduotuoja so Å¡Ä—tÄs nustatÄ«mÄs',
-'badipaddress' => 'NelaistÄ—ns IP adresos',
-'blockipsuccesssub' => 'Ožblokavėms pavīka',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] bova ožblokouts.
-<br />Aplonkīkėt [[Special:IPBlockList|IP blokavėmu istuorėjė]] noriedamė ana parveizėtė.',
-'ipb-edit-dropdown' => 'Redagoutė blokavėmu prīžastis',
-'ipb-unblock-addr' => 'AtblokoutÄ— $1',
-'ipb-unblock' => 'AtblokoutÄ— nauduotuojÄ— varda a IP adresa',
-'ipb-blocklist-addr' => 'Ruodītė esontius $1 bluokavėmus',
-'ipb-blocklist' => 'Ruodītė asontius bluokavėmus',
-'ipb-blocklist-contribs' => '$1 duovis',
-'unblockip' => 'AtbluokoutÄ— nauduotuoja',
-'unblockiptext' => 'Nauduokėt šėta fuorma, kū atkortomiet rašīma teises
-onkstiau ožbluokoutam IP adresÅ a nauduotuojÅ.',
-'ipusubmit' => 'AtblokoutÄ— Å¡Ä—ta adresa',
-'unblocked' => '[[User:$1|$1]] bova atbluokouts',
-'unblocked-id' => 'Bluokavėms $1 bova pašalėnts',
-'ipblocklist' => 'BlokoutÄ— IP adresÄ Ä— nauduotuojÄ“',
-'ipblocklist-legend' => 'Rastė ožblokouta nauduotuoja',
-'ipblocklist-username' => 'Nauduotuos a IP adresos:',
-'ipblocklist-submit' => 'Ėiškuotė',
-'blocklistline' => '$1, $2 ožblokava $3 ($4)',
-'infiniteblock' => 'neribuotÄ',
-'expiringblock' => 'beng galiuotÄ— $1 $2',
-'anononlyblock' => 'vÄ—n anuonÄ—mÄ',
-'noautoblockblock' => 'autuomatinis blokavÄ—ms Ä—Å¡jongts',
-'createaccountblock' => 'paskīrū korėms oždrausts īr',
-'emailblock' => 'el. pašts ožblokouts',
-'ipblocklist-empty' => 'BlokavÄ—mu saraÅ¡os toÅ¡Äias.',
-'ipblocklist-no-results' => 'Prašuoms IP adresos a nauduotuojė vards ožblokouts nier.',
-'blocklink' => 'ožblokoutė',
-'unblocklink' => 'atbluokoutÄ—',
-'change-blocklink' => 'keistė bluokavėma nustatīmus',
-'contribslink' => 'duovis',
-'autoblocker' => 'Autuomatėnis ožbluokavėms, nes dalėnaties IP adreso so nauduotuojo "$1". Prīžastės - "$2".',
-'blocklogpage' => 'Ožblokavėmu istuorėjė',
-'blocklogentry' => 'ožblokava „[[$1]]“, blokavÄ—ma Äiesos - $2 $3',
-'reblock-logentry' => 'pakeistÄ— [[$1]] bluokavÄ—ma nustatÄ«mÄ, naus bluokavÄ—ma Äiesos Ä«r $2 $3',
-'blocklogtext' => 'Čė Ä«r nauduotuoju blokavÄ—ma Ä—r atblokavÄ—ma sÄraÅ¡os. AutuomatÄ—Å¡kÄ blokoutÄ— IP adresÄ nier Ä—Å¡vardÄ—ntÄ—. Jeigu nuorÄ—t paveizÄ—tÄ— nÅ«nÄ blokoujamus adresus, veizÄ—kÄ—t [[Special:IPBlockList|IP ožbluokavÄ—mu istuorÄ—jÄ—]].',
-'unblocklogentry' => 'atbluokava $1',
-'block-log-flags-anononly' => 'vėn anonėmėnē nauduotuojē',
-'block-log-flags-nocreate' => 'privėlėju kūrėms ėšjungts',
-'block-log-flags-noautoblock' => 'automatÄ—nis blokavÄ—ms Ä—Å¡jungts',
-'block-log-flags-noemail' => 'e-pašts bluokouts īr',
-'ipb_expiry_invalid' => 'GaliuojÄ—ma Äiesos nelaistÄ—ns.',
-'ipb_already_blocked' => '„$1“ jau ožblokouts',
-'ipb-needreblock' => '== Jau ožblokouts ==
-$1 jau īr ožblokouts. A nuorėt pakeistė nustatīmus?',
-'proxyblocksuccess' => 'Padarīt.',
-
-# Developer tools
-'unlockdbtext' => 'AtrakÄ—nos doumenÅ« baze grÅžėns galimÄ«be vÄ—sÄ—m
-nauduotuojam redagoutÄ— poslapios, keistÄ— anÅ« nostatÄ«mos, keistÄ— anÅ« keravuojamu sÄraÅ¡a Ä—
-kėtos dalīkos, rēkalaujontios pakeitėmu doumenū bazė.
-PraÅ¡uom patvÄ—rtÄ—ntÄ— Å¡Ä—tÄ, kÅ« ketinat padarÄ«tÄ—.',
-'locknoconfirm' => 'Tamsta neoždiejot patvėrtinėma varnalės.',
-'unlockdbsuccesstext' => 'Doumenū bazė bova atrakėnta.',
-
-# Move page
-'move-page' => 'PervadÄ—ntÄ— $1',
-'move-page-legend' => 'PoslapÄ— pervadÄ—nims',
-'movepagetext' => "Nauduodamė žemiau pateikta fuorma, parvadinsėt poslapi neprarasdamė anuo istuorėjės.
-SenasÄ pavadinÄ—ms pataps nukrÄ“piamouju - ruodÄ«s i naujÄ«ji.
-Tamsta esat atsakėngs ož šėta, kū nūruodas ruodītu i ten, kor ė nuorieta.
-
-Primenam, kÅ« poslapis '''nebus''' parvadints, jÄ“go jau Ä«r poslapis naujo pavadinÄ—mo, nebent tas poslapis Ä«r tuÅ¡ÄÄ—s a nukreipÄ“masis Ä— netor redagavÄ—ma istuorÄ—jÄ—s.
-Tumet, Tamsta galėt parvadintė poslapi seniau nauduota vardu, jēgo priš šėta ons bova par klaida parvadints, a egzėstounantiu poslapiu sogadintė negalėt.
-
-'''DIEMESÄ–!'''
-Jēgo parvadinat puopoliaru poslapi, tas gal sokeltė nepagēdaunamu šalotiniu efektu, tudie šėta veiksma vīkdīkit tėk isitėkine,
-kū soprantat vėsas pasiekmes.",
-'movepagetalktext' => "SosÄ—its aptarÄ—ma poslapis bus autuomatÄ—Å¡kÄ parkelts draugom so ano, '''Ä—Å¡skÄ«rus:''':
-*Poslapis nauju pavadinėmo tor netoštė aptarėma poslapi, a
-*Paliksėt žemiau asontė varnale nepažīmieta.
-Å Ä—tÄs atviejÄs Tamsta sava nužiÅ«ra torÄ—t parkeltÄ— a apjongtÄ— aptarÄ—ma poslapi.",
-'movearticle' => 'ParvadintÄ— poslapi:',
-'movenologin' => 'NeprisÄ—jongÄ—s',
-'movenologintext' => 'Nuoriedamė parvadintė poslapi, torėt būtė ožsėregėstravės nauduotuos ė tēpuogi būtė [[Special:UserLogin|prisėjongės]].',
-'newtitle' => 'Naus pavadÄ—nÄ—ms:',
-'move-watch' => 'KeravuotÄ— Å¡Ä—ta poslapi',
-'movepagebtn' => 'ParvadintÄ— poslapÄ—',
-'pagemovedsub' => 'Parvadinta siekmingÄ',
-'movepage-moved' => '\'\'\'"$1" bova parvadints i "$2"\'\'\'',
-'movepage-moved-redirect' => 'Nukreipims bova sokorts.',
-'articleexists' => 'Straipsnis so tuokiu vardo jau Ä«r
-a parinktÄsis vards Ä«r bluogs.
-Parinkat kÄ—ta varda.',
-'talkexists' => "'''PatsÄ poslapis bova siekmÄ—ngÄ parvadints, no aptarÄ—mu poslapis nabova parkelts, kadongi nauja
-pavadÄ—nÄ—ma straipsnis jau tor aptarÄ—mu poslapi.
-Prašuom sojongtė šėtuos poslapios.'''",
-'movedto' => 'parvadints i',
-'movetalk' => 'ParkeltÄ— sosÄ—ta aptarÄ—ma poslapi.',
-'1movedto2' => 'Straipsnis [[$1]] parvadints i [[$2]]',
-'1movedto2_redir' => '[[$1]] parvadints i [[$2]] (onkstiau bova nukrÄ“pamÄsis)',
-'movelogpage' => 'ParvardinÄ—mu istuorÄ—jÄ—',
-'movelogpagetext' => 'SÄraÅ¡os parvadintu poslapiu.',
-'movereason' => 'Prīžastis:',
-'revertmove' => 'atmestÄ—',
-'delete_and_move' => 'Ä–Å¡trintÄ— Ä— parkeltÄ—',
-'delete_and_move_text' => '==Rēkalings ėštrīnims==
-Paskėrties straipsnis „[[:$1]]“ jau īr. A nuorėt ana ėštrintė, kū galietomiet parvadintė?',
-'delete_and_move_confirm' => 'TÄ“p, trintÄ— poslapi',
-'delete_and_move_reason' => 'Ä–Å¡trinta diel parkielima',
-'move-leave-redirect' => 'ParvadÄ—nant paliktÄ— nukreipÄ—ma',
-
-# Export
-'export' => 'EkspuortoutÄ— poslapius',
-'exportcuronly' => 'EksportoutÄ— tÄ—ktÄs dabartÄ—ne versÄ—jÄ—, neitraukiant istuorÄ—jÄ—s',
-'export-submit' => 'EksportoutÄ—',
-'export-addcattext' => 'PridietÄ— poslapius Ä—Å¡ kateguorÄ—jÄ—s:',
-'export-addcat' => 'PridietÄ—',
-'export-download' => 'SauguotÄ— kÄp faila',
-
-# Namespace 8 related
-'allmessages' => 'VÄ—sÄ— sÄ—stemas tekstÄ Ä— praneÅ¡Ä—mÄ',
-'allmessagesname' => 'PavadÄ—nÄ—ms',
-'allmessagesdefault' => 'PradÄ—nis teksts',
-'allmessagescurrent' => 'DabartÄ—nis teksts',
-'allmessagestext' => 'Čė pateikamÄ— sÄ—stemÄ—niu praneÅ¡Ä—mu sÄraÅ¡os, esontis MediaWiki srÄ—tie.',
-'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' nepalaikuoms īr, nes nustatīms '''\$wgUseDatabaseMessages''' ėšjungts īr.",
-
-# Thumbnails
-'thumbnail-more' => 'PadÄ—dintÄ—',
-'thumbnail_error' => 'Klaida koriant somažėnta pavēkslieli: $1',
-'thumbnail_invalid_params' => 'Nalaistieni miniatiÅ«ras parametrÄ',
-'thumbnail_dest_directory' => 'Nepavīkst sokortė paskėrtėis papkes',
-
-# Special:Import
-'import' => 'ImportoutÄ— poslapius',
-'import-revision-count' => '$1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}}',
-
-# Import log
-'importlogpage' => 'Impuorta istuorÄ—jÄ—',
-'import-logentry-upload-detail' => '$1 {{PLURAL:$1|keitims|keitimÄ|keitimu}}',
-'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|keitims|keitimÄ|keitimu}} Ä—Å¡ $2',
-
-# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tamstas nauduotuojÄ— poslapis',
-'tooltip-pt-anonuserpage' => 'NauduotuojÄ— poslapis Tamstas IP adresÅ',
-'tooltip-pt-mytalk' => 'Tamstas aptarÄ—ma poslapis',
-'tooltip-pt-preferences' => 'Mona nostatÄ«mÄ',
-'tooltip-pt-watchlist' => 'Poslapiu sÄraÅ¡os, katrÅ«s Tamsta pasÄ—rÄ—nkuot keravuotÄ—.',
-'tooltip-pt-mycontris' => 'Tamstas darÄ«tu keitimu sÄraÅ¡os',
-'tooltip-pt-login' => 'Rekuomendoujam prÄ—sÄ—jongtÄ—, nuors tas nÄ—r privaluoma.',
-'tooltip-pt-logout' => 'AtsÄ—jongtÄ—',
-'tooltip-ca-talk' => 'PoslapÄ— torÄ—nÄ— aptarÄ—ms',
-'tooltip-ca-edit' => 'Tamsta galėt keistė ta poslapi. Nepamėrškėt paspaustė parvaizuos mīgtoka priš ėšsauguodamė.',
-'tooltip-ca-addsection' => 'Pradietė nauja skīriu',
-'tooltip-ca-viewsource' => 'Poslapis īr ožrakints. Galėt parveizėt torini.',
-'tooltip-ca-history' => 'UnkstesnÄ—s poslapÄ— versÄ—jÄ—s.',
-'tooltip-ca-protect' => 'Ožrakintė šėta poslapi',
-'tooltip-ca-delete' => 'TrÄ—ntÄ— ta poslapi',
-'tooltip-ca-move' => 'ParvadÄ—ntÄ— poslapi',
-'tooltip-ca-watch' => 'PridietÄ— poslapi i keravuojamu sÄraÅ¡a',
-'tooltip-ca-unwatch' => 'PaÅ¡alÄ—ntÄ— poslapi Ä—Å¡ keravuojamu sÄraÅ¡a',
-'tooltip-search' => 'Ėiškuotė šėtom pruojektė',
-'tooltip-search-go' => 'Ētė i poslapi su tuokiu pavadėnėmu jēgo tuoks īr',
-'tooltip-search-fulltext' => 'Ėiškuotė poslapiu so tuokiu tekstu',
-'tooltip-p-logo' => 'PÄ—rms poslapis',
-'tooltip-n-mainpage' => 'Aplonkītė pėrma poslapi',
-'tooltip-n-mainpage-description' => 'Ä’tÄ— i pÄ—rma poslapi',
-'tooltip-n-portal' => 'Aple pruojekta, ka galėma vēktė, kamė ka rastė',
-'tooltip-n-currentevents' => 'RaskÄ—t naujausÄ— infuormacÄ—jÄ—',
-'tooltip-n-recentchanges' => 'VielÄ«bÅ«ju pakeitÄ—mu sÄraÅ¡os tamÄ— projektÄ—.',
-'tooltip-n-randompage' => 'Atidarītė bikuoki straipsni',
-'tooltip-n-help' => 'Vėita, katruo rasėt rūpėmus atsakīmus.',
-'tooltip-t-whatlinkshere' => 'Poslapiu sÄraÅ¡os, ruodantiu i ÄÄ—',
-'tooltip-t-recentchangeslinked' => 'PaskotÄ—nÄ“ pakeitÄ—mÄ straipsnious, pasÄ—ikiamous Ä—Å¡ Å¡Ä—ta straipsnÄ—',
-'tooltip-feed-rss' => 'Å Ä—ta poslapÄ— RSS Å¡altÄ—nis',
-'tooltip-feed-atom' => 'Å Ä—ta poslapÄ— Atom Å¡altÄ—nis',
-'tooltip-t-contributions' => 'RuodÄ«tÄ— Å¡Ä—ta nauduotuojÄ— keitÄ—mu sÄraÅ¡a',
-'tooltip-t-emailuser' => 'SiÅstÄ— gromata Å¡Ä—tom prietÄ—liÅ',
-'tooltip-t-upload' => 'IdietÄ— abruozdielios a medÄ—jÄ—s failos',
-'tooltip-t-specialpages' => 'SpecÄ“liÅ«ju poslapiu sÄraÅ¡os',
-'tooltip-t-print' => 'Å Ä—ta poslapÄ— versÄ—jÄ— spausdÄ—nÄ—mÅ',
-'tooltip-t-permalink' => 'Vėslaikėnė nūruoda i šėta poslapė versėje',
-'tooltip-ca-nstab-main' => 'Ruodītė poslapė torėni',
-'tooltip-ca-nstab-user' => 'Ruodītė nauduotuojė poslapi',
-'tooltip-ca-nstab-special' => 'Šėts poslapis īr specēlosis - anuo nagalėm redagoutė.',
-'tooltip-ca-nstab-project' => 'Ruodītė pruojekta poslapi',
-'tooltip-ca-nstab-image' => 'Ruodītė abruozdielė poslapi',
-'tooltip-ca-nstab-template' => 'Ruodītė šabluona',
-'tooltip-ca-nstab-help' => 'Ruodītė pagelbas poslapi',
-'tooltip-ca-nstab-category' => 'Ruodītė kateguorėjės poslapi',
-'tooltip-minoredit' => 'PažīmietÄ— pakeitÄ—ma kÄp maža',
-'tooltip-save' => 'Ä–Å¡sauguotÄ— pakeitÄ—mos',
-'tooltip-preview' => 'Pakeitėmu parveiza, prašuom parveizėt priš ėšsaugont!',
-'tooltip-diff' => 'Ruod, kuokios pakeitÄ—mos padariet tekste.',
-'tooltip-compareselectedversions' => 'Veizėtė abodvėju pasėrėnktū poslapė versėju skėrtomos.',
-'tooltip-watch' => 'PridietÄ— Å¡Ä—ta poslapi i keravuojamu sÄraÅ¡a',
-'tooltip-recreate' => 'Atkortė poslapi napaisant šėto, kū ans bova ėštrints',
-'tooltip-rollback' => 'Atšauktė atmestus šėta poslapė keitėmus i vielībiause versėje par vėina paspaudėma',
-'tooltip-undo' => '"Anolioutė" atmeta ta keitėma ėr atidara unkstesnies versėjės redagavėma skvarma. Leid pridietė atmetėma prīžasti kuomentarūsė.',
-
-# Attribution
-'anonymous' => 'NeregÄ—strouts nauduotuos',
-'siteuser' => '{{SITENAME}} nauduotuos $1',
-'lastmodifiedatby' => 'Å Ä—ta poslapi paskotini karta redagava $3 $2, $1.',
-'others' => 'kÄ—tÄ—',
-'siteusers' => '{{SITENAME}} {{PLURAL:$2|nauduotuos|nauduotuojē}} $1',
-'creditspage' => 'Poslapė kūriejē',
-
-# Spam protection
-'spamprotectiontitle' => 'Prišreklamėnis fėltros',
-'spamprotectiontext' => 'Poslapis, katra nuoriejot Ä—Å¡sauguotÄ— bova ožblokouts priÅ¡reklamÄ—nÄ— fÄ—ltra. Å Ä—tÄ tÄ—kriausÄ“ sokielÄ— nÅ«ruoda i kÄ—ta svetaine. Ä–Å¡Ä—mkit nÅ«ruoda Ä— pamieginkÄ—t viel.',
-'spamprotectionmatch' => 'Šėts tekstos bova atpažėnts prišreklamėnė fėltra: $1',
-'spambot_username' => "''MediaWiki'' reklamu Å¡alÄ—nÄ—ms",
-'spam_reverting' => 'Atkoriama i onkstesne versėje, katra nator nūruodu i $1',
-'spam_blanking' => 'Vėsos versėjės toriejė nūruodu i $1. Ėšvaluoma',
-
-# Info page
-'numedits' => 'Pakeitimu skaitlius (straipsnis): $1',
-'numtalkedits' => 'PakeitÄ—mu skaitlius (aptarÄ—ma poslapis): $1',
-'numwatchers' => 'Keravuojantiu skaitlius: $1',
-
-# Math options
-'mw_math_png' => 'VÄ—sumet fuormuotÄ— PNG',
-'mw_math_simple' => 'HTML paprastÄs atvejÄs, kÄ—tÄ“p - PNG',
-'mw_math_html' => 'HTML kumet imanuoma, kėtēp - PNG',
-'mw_math_source' => 'Paliktė TeX fuormata (tekstinems naršīklems)',
-'mw_math_modern' => 'Rekomendounama muodernioms naršīklems',
-'mw_math_mathml' => 'MathML jēgo imanuoma (ekspermentinis)',
-
-# Math errors
-'math_failure' => 'Nepavīka apdoruotė',
-'math_unknown_error' => 'nežinuoma klaida',
-'math_unknown_function' => 'nežinuoma funkcėjė',
-
-# Patrolling
-'markaspatrolleddiff' => 'Žīmietė, kū patikrėnta',
-'markaspatrolledtext' => 'Pažīmietė, ka poslapis patėkrėnts īr',
-'markedaspatrolled' => 'Pažīmiets kÄp patÄ—krints',
-'markedaspatrolledtext' => 'PasÄ—rinkta versÄ—jÄ— siekmingÄ pažīmieta kÄp patÄ—krinta',
-
-# Patrol log
-'patrol-log-page' => 'PatikrinÄ—ma istuorÄ—jÄ—',
-'patrol-log-line' => 'PoslapÄ— „$2“ $1 pažīmieta kÄp patÄ—krinta $3',
-'patrol-log-auto' => '(autuomatÄ—Å¡kÄ)',
-'patrol-log-diff' => 'versÄ—jÄ— $1',
-'log-show-hide-patrol' => '$1 patvirtėnėmu saraša',
-
-# Image deletion
-'deletedrevision' => 'Ä–Å¡trinta sena versÄ—jÄ— $1.',
-'filedeleteerror-short' => 'Klaida trÄ—nont faila: $1',
-
-# Browsing diffs
-'previousdiff' => '↠Onkstesnis pakeitėms',
-'nextdiff' => 'Paskesinis pakeitėms →',
-
-# Media information
-'mediawarning' => "'''Diemesė''': Šėts fails gal torietė kenksmėnga kuoda, anū palaidus Tamstas sėstėma gal būtė sogadinta.",
-'imagemaxsize' => 'Rėbuotė abruozdieliu dėdoma anū aprašīma poslapī lėgė:',
-'thumbsize' => 'Somažėntu pavēkslieliu didums:',
-'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|poslapis|poslapē|poslapiu}}',
-'file-info' => '(faila dÄ—doms: $1, MIME tips: $2)',
-'file-info-size' => '($1 × $2 taškū, faila dėdoms: $3, MIME tips: $4)',
-'file-nohires' => '<small>Geresnis ėšraiškėms negalėms.</small>',
-'svg-long-desc' => '(SVG fails, fuormalē $1 × $2 puškiu, faila dėdoms: $3)',
-'show-big-image' => 'Pėlns ėšraiškėms',
-'show-big-image-thumb' => '<small>Šėtuos parvaizos dėdums: $1 × $2 puškiu</small>',
-
-# Special:NewFiles
-'newimages' => 'Naujausiu abruozdieliu galerÄ—jÄ—',
-'imagelisttext' => "Žemiau Ä«r '''$1''' failu sÄraÅ¡os, sorÅ«Å¡iouts $2.",
-'newimages-label' => 'Faila vards (ar anuo dalis):',
-'showhidebots' => '($1 robotos)',
-'ilsubmit' => 'Ėiškoutė',
-'bydate' => 'palē data',
-'sp-newimages-showfrom' => 'Ruodītė naujus abruozdielius pradedant nū $2, $1',
-
-# Bad image list
-'bad_image_list' => 'Fuormats tuoks Ä«r:
-
-Tėk eilotės, prasėdedantės *, īr itraukiamas. Pėrmuojė nūruoda eilotie tor būtė nūruoda i bluoga abruozdieli.
-Vėsas kėtas nūoruodas tuo patiuo eilotie īr laikomas ėšėmtim, tas rēšk ka poslapē, katrūs leidama iterptė abruozdieli.',
-
-# Metadata
-'metadata' => 'Metadoumenīs',
-'metadata-help' => 'Å Ä—tom failÄ— Ä«r papÄ—lduomos infuormacÄ—jÄ—s, tikriausÄ“ pridietos skaitmeninÄ—s kameruos a skanÄ—rÄ—, katros bova nauduots anam sokortÄ— a parkeltÄ— i skaitmenÄ—ni fuormata. JÄ“go fails bova pakeists Ä—Å¡ pradÄ—nÄ—s versÄ—jÄ—s, katruos nekatruos datalÄ—s gal nepÄ—lnÄ atspÄ—ndietÄ— nauja faila.',
-'metadata-expand' => 'Ruodītė ėšpliestinė infuormacėjė',
-'metadata-collapse' => 'KavuotÄ— Ä—Å¡pliestinÄ— infuormacÄ—jÄ—',
-'metadata-fields' => 'EXIF metadoumenÅ« laukÄ, nuruodÄ«tÄ— tamÄ— praneÅ¡Ä—mÄ—, bus itrauktÄ— i abruozdielÄ— poslapi, kumet metadoumenÅ« lentelÄ— bus suskleista. PalÄ“ nutÄ«liejÄ—ma kÄ—tÄ— laukÄ bus pakavuotÄ—.
-* make
-* model
-* datetimeoriginal
-* exposuretime
-* fnumber
-* isospeedratings
-* focallength',
-
-# EXIF tags
-'exif-imagewidth' => 'Platoms',
-'exif-imagelength' => 'Aukštoms',
-'exif-orientation' => 'Pasokims',
-'exif-xresolution' => 'Gorizuontalus ėšraiškėms',
-'exif-datetime' => 'Faila keitÄ—ma data Ä— Äiesos',
-'exif-imagedescription' => 'AbruozdielÄ— pavadÄ—nÄ—ms',
-'exif-make' => 'Kameras gamÄ—ntuos',
-'exif-model' => 'Kameras muodelis',
-'exif-colorspace' => 'Spalvū pristatīms',
-'exif-compressedbitsperpixel' => 'Abruozdielė sospaudėma rėžėms',
-'exif-datetimeoriginal' => 'DoumenÅ« generavÄ—ma data Ä— Äiesos',
-'exif-exposuretime' => 'Ä–Å¡laikÄ«ma Äiesos',
-'exif-fnumber' => 'F skaitlius',
-'exif-brightnessvalue' => 'Å vÄ—isoms',
-'exif-lightsource' => 'Å vÄ—isuos Å¡altÄ—nis',
-'exif-flash' => 'BlÄ—cos',
-'exif-focallength' => 'Žėdinė nutuolėms',
-'exif-flashenergy' => 'BlÄ—ca energÄ—jÄ—',
-'exif-contrast' => 'Kuontrasts',
-
-'exif-orientation-1' => 'StandartÄ—Å¡ks',
-
-'exif-xyresolution-i' => '$1 puškē cuolī',
-'exif-xyresolution-c' => '$1 puškē centėmetrė',
-
-'exif-componentsconfiguration-0' => 'nēsa',
-
-'exif-exposureprogram-0' => 'Nenūruodīta',
-
-'exif-contrast-0' => 'Paprasts',
-'exif-contrast-1' => 'Mažos',
-'exif-contrast-2' => 'DÄ—dlis',
-
-# External editor support
-'edit-externally' => 'Atdarītė ėšuoriniam redaktuorio',
-'edit-externally-help' => 'NuoriedamÄ— gautÄ— daugiau infuormacÄ—jÄ—s, veiziekÄ—t [http://www.mediawiki.org/wiki/Manual:External_editors kruovÄ—ma instrokcÄ—jÄ—s].',
-
-# 'all' in various places, this might be different for inflected languages
-'recentchangesall' => 'vÄ—sos',
-'imagelistall' => 'vÄ—sÄ—',
-'watchlistall2' => 'vÄ—sos',
-'namespacesall' => 'vÄ—sas',
-'monthsall' => 'vÄ—sÄ—',
-
-# E-mail address confirmation
-'confirmemail' => 'Patvirtėnkėt el. pašta adresa',
-'confirmemail_noemail' => 'Tamsta netorėt nuruodės teisėnga el. pašta adresa [[Special:Preferences|sava nustatīmūs]].',
-'confirmemail_text' => 'Šėtom pruojektė īr rēkalėnga patvirtėntė el. pašta adresa prīš nauduojont el. pašta funkcėjės. Spauskėt žemiau esonti mīgtoka,
-kÅ« Tamstas el. paÅ¡ta adresu bÅ«tom Ä—Å¡siÅsts patvirtÄ—nÄ—ma kods.
-Gruomatuo bus atsiÅsta nÅ«ruoda so kodu, katra nuÄ“jus, el. paÅ¡ta adresos bus patvirtÄ—nts.',
-'confirmemail_send' => 'Ä–Å¡siÅstÄ— patvirtÄ—nÄ—ma koda',
-'confirmemail_sent' => 'PatvirtÄ—nÄ—ma gruomata Ä—Å¡siÅsta.',
-'confirmemail_needlogin' => 'TamstÄ rÄ“k $1, kÅ« patvirtÄ—ntomiet sava el. paÅ¡ta adresa.',
-'confirmemail_loggedin' => 'Tamstas el. pašta adresos ožtvėrtints īr.',
-'confirmemail_body' => 'Kažėnkas, mosiet Tamsta IP adreso $1, ožregėstrava
-paskīra „$2“ sosėita so šėtuom el. pašta adresu pruojektė {{SITENAME}}.
-
-KÅ« patvirtÄ—ntomiet, kÅ« ta diežotÄ— Ä—Å¡ tÄ—krÄ prÄ—klausa TamstÄ, Ä—r aktÄ«voutomiet
-el. pašta puoslaugi pruojėktė {{SITENAME}}, atdarīkiet ta nūruoda sava naršīklie:
-
-$3
-
-Jēgo paskīra regėstravuot *ne* Tamsta, tumet ēkėt ta nūruoda,
-kū atšauktomiet el. pašta adresa patvirtėnėma:
-
-$5
-
-PatvirtÄ—nÄ—ma kods bengs galiuotÄ— $4.',
-'invalidateemail' => 'El. pašta patvirtėnėma atšaukėms',
-
-# Trackbacks
-'trackbackremove' => '([$1 TrintÄ—])',
-
-# Delete conflict
-'deletedwhileediting' => 'DiemesÄ—: Å Ä—ts poslapis Ä—Å¡trints po Å¡Ä—ta, kumet pradiejot redagoutÄ—!',
-'recreate' => 'AtkortÄ—',
-
-# action=purge
-'confirm_purge_button' => 'Tink',
-
-# Multipage image navigation
-'imgmultipageprev' => '↠unkstesnis poslapis',
-'imgmultipagenext' => 'kėts poslapis →',
-'imgmultigo' => 'Ä’tÄ—!',
-'imgmultigoto' => 'Ä’tÄ— i poslapi $1',
-
-# Table pager
-'ascending_abbrev' => 'dÄ—diejÄ—ma tvarka',
-'descending_abbrev' => 'mažiejontė tvarka',
-'table_pager_next' => 'KÄ—ts poslapis',
-'table_pager_prev' => 'Onkstesnis poslapis',
-'table_pager_first' => 'PÄ—rms poslapis',
-'table_pager_last' => 'PaskotÄ—nis poslapis',
-'table_pager_limit' => 'Ruodītė $1 elementu par poslapi',
-'table_pager_limit_submit' => 'Ruodītė',
-'table_pager_empty' => 'Juokiū rezoltatu',
-
-# Auto-summaries
-'autosumm-blank' => 'Šalėnams ciels torėnīs ėš poslapė',
-'autosumm-replace' => "Poslapis keitams so '$1'",
-'autoredircomment' => 'Nukreipama i [[$1]]',
-'autosumm-new' => 'Naus poslapis: $1',
-
-# Live preview
-'livepreview-loading' => 'Kraunama īr…',
-'livepreview-ready' => 'Ikeliama… Padarīta!',
-
-# Friendlier slave lag warnings
-'lag-warn-normal' => 'PakeitÄ—mÄ, naujesnÄ— kÄp $1 {{PLURAL:$1|sekondÄ—|sekondÄ—s|sekondiu}}, tamÄ— sÄraÅ¡Ä— gal bÅ«tÄ— neruodomÄ—.',
-'lag-warn-high' => 'DielÄ“ dÄ—dlÄ— doumenÅ« bazÄ—s pasÄ—likÄ—ma pakeitÄ—mÄ, naujesnÄ— nÄ“go $1 {{PLURAL:$1|sekondÄ—|sekondÄ—s|sekondiu}}, tamÄ— saraÅ¡Ä— gal bÅ«tÄ— neruodomÄ—.',
-
-# Watchlist editor
-'watchlistedit-numitems' => 'Tamstas keravuojamu sÄraÅ¡Ä— Ä«r $1 poslapiu neskaitliuojant aptarÄ—mu poslapiu.',
-'watchlistedit-noitems' => 'Tamstas keravuojamu sÄraÅ¡Ä— nÄ— juokiÅ« poslapiu.',
-'watchlistedit-normal-title' => 'KeistÄ— keravuojamu sÄroÅ¡a',
-'watchlistedit-normal-legend' => 'Å alÄ—ntÄ— poslapios Ä—Å¡ keravuojamu sÄraÅ¡a',
-'watchlistedit-normal-explain' => 'Žemiau Ä«r ruodomÄ— poslapÄ“ Tamstas keravuojamu sÄraÅ¡Ä—.
-Nuoriedamė pašalėntė poslapi, pri anuo oždiekėt varnale ė paspauskėt „Šalėntė poslapios“.
-Tamsta tÄ“puogi galÄ—t [[Special:Watchlist/raw|redagoutÄ— grÄ«naji keravuojamu sÄraÅ¡a]].',
-'watchlistedit-normal-submit' => 'Å alÄ—ntÄ— poslapios',
-'watchlistedit-normal-done' => '$1 {{PLURAL:$1|poslapis bova pašalėnts|poslapē bova pašalėntė|poslapiu bova pašalėnta}} ėš Tamstas keravuojamu saraša:',
-'watchlistedit-raw-title' => 'KeistÄ— grÄ«nÅjÄ— keravuojamu sÄraÅ¡a',
-'watchlistedit-raw-legend' => 'KeistÄ— grÄ«nÅjÄ— keravuojamu sÄraÅ¡a',
-'watchlistedit-raw-explain' => 'Žemiau ruodomÄ— poslapÄ“ Tamstas keravuojamu sÄraÅ¡Ä—, Ä— gal bÅ«tÄ— pridietÄ— i a paÅ¡alÄ—ntÄ— Ä—Å¡ sÄraÅ¡a; vÄ—ins poslapis eilotie. BÄ—ngÄ— paspauskÄ—t „AtnaujÄ—ntÄ— keravuojamu sÄraÅ¡a“. Tamsta tÄ“puogi galÄ—t [[Special:Watchlist/edit|nauduotÄ— standartÄ—ni radaktuoriu]].',
-'watchlistedit-raw-titles' => 'Poslapē:',
-'watchlistedit-raw-submit' => 'AtnaujÄ—ntÄ— keravuojamu sÄraÅ¡a',
-'watchlistedit-raw-done' => 'Tamstas keravuojamu sÄroÅ¡os bova atnaujÄ—nts.',
-'watchlistedit-raw-added' => '$1 {{PLURAL:$1|poslapis bova pridiets|poslapē bova pridietė|poslapiu bova pridieta}}:',
-'watchlistedit-raw-removed' => '$1 {{PLURAL:$1|poslapis bova pašalėnts|poslapē bova pašalėntė|poslapiu bova pašalėnta}}:',
-
-# Watchlist editing tools
-'watchlisttools-view' => 'VeizietÄ— sosÄ—josius pakeitÄ—mus',
-'watchlisttools-edit' => 'VeizietÄ— Ä—r keistÄ— keravuojamu straipsniu sÄraÅ¡a',
-'watchlisttools-raw' => 'KeistÄ— nebÄ—ngta keravuojamu straipsniu sÄraÅ¡a',
-
-# Special:Version
-'version' => 'VersÄ—jÄ—',
-'version-license' => 'LicenzÄ—jÄ—',
-
-# Special:FilePath
-'filepath' => 'Faila maršrots',
-'filepath-page' => 'Fails:',
-
-# Special:FileDuplicateSearch
-'fileduplicatesearch' => 'Ėiškuotė doblikoutu failu',
-'fileduplicatesearch-legend' => 'Ėiškuotė doblėkatu',
-'fileduplicatesearch-filename' => 'Faila vards:',
-'fileduplicatesearch-submit' => 'Ėiškuotė',
-'fileduplicatesearch-info' => '$1 × $2 pėkseliu<br />Faila dėdoms: $3<br />MIME tėps: $4',
-
-# Special:SpecialPages
-'specialpages' => 'Specēlė̅jė poslapē',
-'specialpages-note' => '----
-* Normalūs specēlė̅jė puslapē.
-* <strong class="mw-specialpagerestricted">Apribuotė specēlė̅jė puslapē.</strong>',
-'specialpages-group-maintenance' => 'SÄ—stemas palaikÄ«ma praneÅ¡Ä—mÄ',
-'specialpages-group-other' => 'Kėtė specēlė̅jė poslapē',
-'specialpages-group-login' => 'PrisÄ—jongÄ—ms / RegistracÄ—jÄ—',
-'specialpages-group-changes' => 'VielÄ«biÄ—Ì… jÄ— pakeitÄ—mÄ Ä— regÄ—strÄ',
-'specialpages-group-media' => 'Infuormacėjė aple failus ėr anū pakruovėms',
-'specialpages-group-users' => 'Nauduotuojē ė teisės',
-'specialpages-group-highuse' => 'Platē nauduojamė poslapē',
-'specialpages-group-pages' => 'Poslapiu sarašas',
-'specialpages-group-pagetools' => 'Poslapiu rakondÄ',
-'specialpages-group-wiki' => 'Wiki doumenÄ«s Ä— rakondÄ',
-'specialpages-group-redirects' => 'Specēlė̅jė nukreipėma poslapē',
-'specialpages-group-spam' => 'Å lamÅ¡ta valdÄ«ma rakondÄ',
-
-# Special:BlankPage
-'blankpage' => 'ToÅ¡Äias poslapis',
-
-# Special:Tags
-'tags-edit' => 'taisītė',
-
-);
+$fallback = 'sgs';
diff --git a/languages/messages/MessagesBcc.php b/languages/messages/MessagesBcc.php
index c2ea2591..d6cbb565 100644
--- a/languages/messages/MessagesBcc.php
+++ b/languages/messages/MessagesBcc.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Huji
* @author Mostafadaneshvar
* @author ZxxZxxZ
*/
@@ -153,8 +154,7 @@ $messages = array(
'tog-editsection' => 'Ùعال کتن کسمت اصلاح از طریق لینکان [edit]',
'tog-editsectiononrightclick' => 'Ùعال کتن اصلاح کسمت گون کلیک راست اور کسمت عناوین(جاوا)',
'tog-showtoc' => 'جدول محتوای‌ء پیش دار( په صÙحیانی Ú©Ù‡ گیش Ú†Ù‡ 3 عنوانش هست)',
-'tog-rememberpassword' => 'منی وارد بیگ ته ای کامپیوتر هیال کن',
-'tog-editwidth' => 'جعبه اصلاح مزنی Ú©Ù† تا Ú©Ù„ صÙحه بگریت',
+'tog-rememberpassword' => 'من ورود ته ای کامپیوتر هیال بکن (په $1 {{PLURAL:$1|روچ|روچ}})',
'tog-watchcreations' => 'هور Ú©Ù† منی صÙحاتی Ú©Ù‡ من ته لیست چارگ شرکتت',
'tog-watchdefault' => 'هورکن صÙحاتی Ú©Ù‡ من اصلاح کتن ته منی لیست چارگ',
'tog-watchmoves' => 'هور Ú©Ù† صÙحاتی Ú©Ù‡ من جاه په جاه کت ته منی لیست چارگ',
@@ -289,31 +289,20 @@ $messages = array(
'faqpage' => 'Project:ب.ج.س',
# Vector skin
-'vector-action-addsection' => 'هور کتن عنوان',
-'vector-action-delete' => 'زورگ',
-'vector-action-move' => 'جاه په جاه',
-'vector-action-protect' => 'Ø­Ùاظت',
-'vector-action-undelete' => 'ترینگ',
-'vector-action-unprotect' => 'Ø­Ùاظت درگیزگ',
-'vector-namespace-category' => 'دسته',
-'vector-namespace-help' => 'تاک راهنما',
-'vector-namespace-image' => 'Ùایل',
-'vector-namespace-main' => 'تاک',
-'vector-namespace-media' => 'تاک مدیا',
-'vector-namespace-mediawiki' => 'کوله',
-'vector-namespace-project' => 'تاک پروژه',
-'vector-namespace-special' => 'حاصین تاک',
-'vector-namespace-talk' => 'Ú¯Ù¾',
-'vector-namespace-template' => 'تمپلت',
-'vector-namespace-user' => 'کاربر تاک',
-'vector-view-create' => 'شرکتن',
-'vector-view-edit' => 'اصلاح',
-'vector-view-history' => 'چارتن تاریح',
-'vector-view-view' => 'وانتن',
-'vector-view-viewsource' => 'پیشدارگ بن جاه',
-'actions' => 'کاران',
-'namespaces' => 'Ùضانامان',
-'variants' => 'گوشگان',
+'vector-action-addsection' => 'هور کتن عنوان',
+'vector-action-delete' => 'زورگ',
+'vector-action-move' => 'جاه په جاه',
+'vector-action-protect' => 'Ø­Ùاظت',
+'vector-action-undelete' => 'ترینگ',
+'vector-action-unprotect' => 'Ø­Ùاظت درگیزگ',
+'vector-view-create' => 'شرکتن',
+'vector-view-edit' => 'اصلاح',
+'vector-view-history' => 'چارتن تاریح',
+'vector-view-view' => 'وانتن',
+'vector-view-viewsource' => 'پیشدارگ بن جاه',
+'actions' => 'کاران',
+'namespaces' => 'Ùضانامان',
+'variants' => 'گوشگان',
'errorpagetitle' => 'حطا',
'returnto' => 'تررگ به $1.',
@@ -539,7 +528,7 @@ $2',
'yourname' => 'نام کاربری',
'yourpassword' => 'کلمه رمز',
'yourpasswordagain' => 'کلمه رمز دگه نویس',
-'remembermypassword' => 'می ورود ته ای کامپیوتر په حاطر بدار',
+'remembermypassword' => 'می ورودءَ ته ای کامپیوتر بدار (په $1 {{PLURAL:$1|روچ|روچ}})',
'yourdomainname' => 'شمی دامین',
'externaldberror' => 'یک حطا دیتابیس تصدیق هویت دراییگی هست یا شما را اجازت نیست وتی حساب درایی په روچ کنیت.',
'login' => 'ورود',
@@ -732,7 +721,7 @@ $2',
'usercsspreview' => "''''بزان Ú©Ù‡ شما Ùقط وتی CSS کاربری بازبینی کنین. هنگنت آیی ذخیره نه بوتت!''''",
'userjspreview' => "''''په یاد دار Ú©Ù‡ شما Ùقط وتی کاربری JavaScript بازبینی/آزمایش کنگیت، هنگت ذخیره نه بوتت!''''",
'userinvalidcssjstitle' => "'''هوژاری:''هچ جلدی نیست\"\$1\".
-بزان Ú©Ù‡ صÙحات .css Ùˆ .js Ú†Ù‡ عناوین گون هوردین حر٠استÙاده کننت، مثلا {{ns:user}}:Foo/monobook.css بدل به په {{ns:user}}:Foo/Monobook.css.",
+بزان Ú©Ù‡ صÙحات .css Ùˆ .js Ú†Ù‡ عناوین گون هوردین حر٠استÙاده کننت، مثلا {{ns:user}}:Foo/vector.css بدل به په {{ns:user}}:Foo/Vector.css.",
'updated' => '(په روچ بیتگین)',
'note' => "'''یادداشت:'''",
'previewnote' => "'''Ø´ÛŒ Ùقط یک بازبینی انت;
@@ -771,9 +760,6 @@ $2',
اگر شما نه لوٹیت شمی نوشتاک گون بی رحمی اصلاح مه بنت، اچه شما آیء ادان دیم مه دهیت.<br />
شما هنچوش ما را قول دهیت که شما شی وت نوشتت یا ایء چه یک دامین عمومی یا هنچوشین آزاتین منبع کپی کتیت.(بچار $1 په جزییات).
''' نوشتاکی که حق کپی دارنت بی اجازت دیم مه دهیت!'''",
-'longpagewarning' => "'''هوژاری. ای صÙحه $1 کیلوبایت نت;
-لهتی Ú†Ù‡ بروزران شاید مشکلاتی Ú†Ù‡ دست رسی Ùˆ اصلاح صÙحات گیش Ú†Ù‡ 32Ú©.ب داشته بنت.
-لطÙا توجه کنیت په هورد کتن صÙحه په هوردترین چنٹ. '''",
'longpageerror' => "'''حطا: متنی که شما دیم داتت $1 کیلو بایتت، که چه گیشترین حد $2 کیلوبایت مزن
آی نه تونیت ذخیره بوت.'''",
'readonlywarning' => "'''هوژاری: دیتابیس به تعمیرات کبلنت، اچه شما نه تونیت وتی اصلاحات هنو ذخیره کنیت.
@@ -1157,7 +1143,7 @@ $1",
'prefs-advancedrendering' => 'پیشرÙتگین گزینه',
'prefs-advancedsearchoptions' => 'پیشرÙتگین گزینه',
'prefs-advancedwatchlist' => 'پیشرÙتگین گزینه',
-'prefs-display' => 'پیشدارگ گزینه هان',
+'prefs-displayrc' => 'پیشدارگ گزینه هان',
'prefs-diffs' => 'پرک',
# User rights
@@ -1263,7 +1249,6 @@ $1",
'right-siteadmin' => 'کبل و پچ دیتابیس',
'right-reset-passwords' => 'کلمه رمز چه دگه کاربران ءَ عوض کن',
'right-override-export-depth' => 'درگیزگ صÙحات گون صÙحاتی لینک بوتگین ته سطح Ûµ',
-'right-versiondetail' => 'اطلاعات نسخه برنامه گیشترین پیشدار',
# User rights log
'rightslog' => 'ورودان حقوق کاربر',
@@ -1416,7 +1401,6 @@ $1",
لطÙا برگردیت Ùˆ ای Ùایل گون نوکین نامی آپلود کنیت.[[File:$1|انگشتی|مرکز|$1]]',
'file-exists-duplicate' => 'ای Ùایل کپیء Ú†Ù‡ جهلیگین {{PLURAL:$1|Ùایل|Ùایلان}}:',
'file-deleted-duplicate' => 'یک Ùایلی په داب ای Ùایل ([[:$1]]) پیسرتر حذ٠بوتگت. شما بایدن تاریح حذ٠آ Ùایلء دگه بچاریت',
-'successfulupload' => 'آپلود موÙÙ‚',
'uploadwarning' => 'هوژاری آپلود',
'savefile' => 'ذخیره Ùایل',
'uploadedimage' => 'اپلود بوت "[[$1]]"',
@@ -1452,6 +1436,7 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'آپلود موÙÙ‚',
'upload-proto-error' => 'اشتباه پروتوکل',
'upload-proto-error-text' => 'آپلود دراین نیاز په URL آنی داریت که شروع بیت گون <code>http://</code> یا <code>ftp://</code>.',
@@ -1506,8 +1491,8 @@ PICT # misc.
'filehist-current' => 'هنو',
'filehist-datetime' => 'تاریح/زمان',
'filehist-thumb' => 'بند انگشت',
-'filehist-thumbtext' => 'بند انگشتی عکس چه $1',
-'filehist-nothumb' => 'بی بند انگشتی',
+'filehist-thumbtext' => 'بندانگشتی از نسخهٔ مورخ $1',
+'filehist-nothumb' => 'Ùاقد بندانگشتی',
'filehist-user' => 'کاربر',
'filehist-dimensions' => 'جنبه یان',
'filehist-filesize' => 'اندازه Ùایل',
@@ -1602,7 +1587,6 @@ PICT # misc.
'statistics-edits-average' => 'میانگین اصلاحات ته هر صÙحه ای',
'statistics-views-total' => 'چارگان کل',
'statistics-views-peredit' => 'چارگ ته هر اصلاح',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue طول کار] ای',
'statistics-users' => 'ثبت نامی [[Special:ListUsers|users]]',
'statistics-users-active' => 'Ùعالین کاربر',
'statistics-users-active-desc' => 'کاربرانی که ته پیشگین {{PLURAL:$1|روچ|$1 روچان}} کاری اش کتت',
@@ -1819,7 +1803,6 @@ PICT # misc.
# Watchlist
'watchlist' => 'منی لیست چارگ',
'mywatchlist' => 'منی لیست چارگ',
-'watchlistfor' => "(په '''$1''')",
'nowatchlist' => 'شما را هچ چیزی ته وتی لیست چارگ نیست.',
'watchlistanontext' => 'لطÙا $1 په دیستن یا اصلاح ایتیمان ته وتی لیست چارگء',
'watchnologin' => 'وارد نه بی تگیت',
@@ -1936,7 +1919,9 @@ $NEWPAGE
'revertpage' => 'ترینت اصلاحات توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|گپ کن]])په آهری بازبینی گون [[User:$1|$1]]',
'rollback-success' => 'اصلاحات ترینگ بوتت گون $1;
په آهری نسخه ترینگ بوتنت گون $2.',
-'sessionfailure' => 'چوش جاه کیت که گون شمی نند وارد بییگ مشکلی هست;
+
+# Edit tokens
+'sessionfailure' => 'چوش جاه کیت که گون شمی نند وارد بییگ مشکلی هست;
ای کار په خاطر سوء استÙاده Ú†Ù‡ نندگ کنسل بوت.
لطÙا بجنیت "back" Ùˆ صÙحه ای Ú©Ù‡ Ú†Ù‡ آیء اتکگیت دگه بار کنیت او راندء دگه تلاش کنیت.',
@@ -2141,7 +2126,6 @@ $1',
'ipb-edit-dropdown' => 'اصلاح کن دلایل محدودیت',
'ipb-unblock-addr' => 'رÙع محدودیت $1',
'ipb-unblock' => 'نام کاربری یا آدرس Ø¢ÛŒ Ù¾ÛŒ رÙع محدودیت Ú©Ù†',
-'ipb-blocklist-addr' => 'به گند هستین محدودیت په $1',
'ipb-blocklist' => 'به گند هنوکین محدودیتان',
'ipb-blocklist-contribs' => 'مشارکت په $1',
'unblockip' => 'کاربر رÙع محدودیت Ú©Ù†',
@@ -2574,10 +2558,10 @@ $1',
'imagemaxsize' => "محدودیت تصاویر: <br />''(په صÙحات توضیح Ùایل)''",
'thumbsize' => 'اندازه پیج انگشتی',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|صÙحه|صÙحات}}',
-'file-info' => '(اندازه Ùایل: $1, مایم نوع: $2)',
-'file-info-size' => '($1 × $2 پیکسل, اندازه Ùایل: $3, مایم نوع: $4)',
+'file-info' => 'اندازه Ùایل: $1, مایم نوع: $2',
+'file-info-size' => '$1 × $2 پیکسل, اندازه Ùایل: $3, مایم نوع: $4',
'file-nohires' => '<small>مزنترین رزلوشن نیست.</small>',
-'svg-long-desc' => '(اس ÙˆÛŒ جی Ùایل, معمولا $1 × $2 پیکسل, Ùایل اندازه: $3)',
+'svg-long-desc' => 'اس ÙˆÛŒ جی Ùایل, معمولا $1 × $2 پیکسل, Ùایل اندازه: $3',
'show-big-image' => 'Ú©Ù„ صÙحه',
'show-big-image-thumb' => '<small>اندازه ای بازبین:$1× $2 pixels</small>',
diff --git a/languages/messages/MessagesBcl.php b/languages/messages/MessagesBcl.php
index 1ff744dc..655ad38a 100644
--- a/languages/messages/MessagesBcl.php
+++ b/languages/messages/MessagesBcl.php
@@ -106,8 +106,7 @@ $messages = array(
'tog-editsection' => 'Togótan an paghirá kan seksyon sa paági kan mga takód na [hirá]',
'tog-editsectiononrightclick' => 'Togotan an paghirá kan seksyon sa pag-lagatik sa walá sa mga titulo nin seksyon (JavaScript)',
'tog-showtoc' => 'Ipahilíng an indise kan mga laog (para sa mga pahinang igwang sobra sa 3 pamayohan)',
-'tog-rememberpassword' => 'Giromdomón an mga paglaóg ko sa kompyuter na iní',
-'tog-editwidth' => 'Nasa pinakahalakbáng na sokol an kahon nin paghirá',
+'tog-rememberpassword' => 'Giromdomón an mga paglaóg ko sa kompyuter na iní (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Idúgang an mga pahinang ginigíbo ko sa pigbabantayan ko',
'tog-watchdefault' => 'Idúgang an mga pahinang pighíhirá ko sa pigbabantayan ko',
'tog-watchmoves' => 'Idúgang an mga pahinang piglilípat ko sa pigbabantayan ko',
@@ -236,12 +235,11 @@ $messages = array(
'faqpage' => 'Project:HD',
# Vector skin
-'vector-action-delete' => 'paráon',
-'vector-action-move' => 'Ibalyó',
-'vector-namespace-main' => 'Pahina',
-'vector-view-create' => 'Maggíbo',
-'vector-view-edit' => 'Liwatón',
-'vector-view-view' => 'Basáhon',
+'vector-action-delete' => 'paráon',
+'vector-action-move' => 'Ibalyó',
+'vector-view-create' => 'Maggíbo',
+'vector-view-edit' => 'Liwatón',
+'vector-view-view' => 'Basáhon',
'errorpagetitle' => 'Salâ',
'returnto' => 'Magbwelta sa $1.',
@@ -444,7 +442,7 @@ Nagibo na an ''account'' mo. Giromdomon tabi na ribayán an saimong mga kabôtan
'yourname' => 'Pangaran kan paragamit:',
'yourpassword' => 'Sekretong panlaog:',
'yourpasswordagain' => 'Itaták giraray an sekretong panlaog:',
-'remembermypassword' => 'Giromdomon an paglaog ko sa kompyuter na ini',
+'remembermypassword' => 'Giromdomon an paglaog ko sa kompyuter na ini(for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => "An saimong ''domain'':",
'externaldberror' => "Igwang nin salang panluwas pantunay kan base nin datos o dai ka pigtotogotan na bâgohon an saimong panluwas na ''account''.",
'login' => 'Maglaog',
@@ -608,7 +606,7 @@ Kun dai tinuyong nakaabot ka digdi, pindoton sana an back sa browser mo.',
'userjsyoucanpreview' => "'''Tip:''' Gamiton an 'Show preview' para testingon an bâgong JS bago magtagama.",
'usercsspreview' => "'''Giromdomon tabî na pigpapatânaw sana saimo an CSS nin parágamit, dai pa ini nakatagama!'''",
'userjspreview' => "'''Giromdomon tabi na pigtetest/pighihiling mo sana an patanaw kan saimong JavaScript nin paragamit, dai pa ini naitagama!'''",
-'userinvalidcssjstitle' => "'''Patanid:''' Mayong ''skin'' na \"\$1\". Giromdomon tabî na an .css asin .js na mga páhina naggagamit nin titulong nakasurat sa sadit na letras, halimbawa {{ns:user}}:Foo/monobook.css bakong {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Patanid:''' Mayong ''skin'' na \"\$1\". Giromdomon tabî na an .css asin .js na mga páhina naggagamit nin titulong nakasurat sa sadit na letras, halimbawa {{ns:user}}:Foo/vector.css bakong {{ns:user}}:Foo/Vector.css.",
'updated' => '(Binàgo)',
'note' => "'''Paisi:'''",
'previewnote' => "'''Patànaw sana ini; dai pa naitagama an mga pagbabàgo!'''",
@@ -643,8 +641,6 @@ Pigpropromesa mo man samuyà na ika an kagsurat kaini, o kinopya mo ini sa domin
'''DAI TABÌ MAGSUMITIR NIN MGA GIBONG IPINAPANGALAD NA KOPYAHON NIN MAYONG PERMISO!'''",
'copyrightwarning2' => "Giromdomon tabì na an gabos na kontribusyon sa {{SITENAME}} pwedeng hirahón, bàgohon o halion kan ibang mga parágamit. Kun habô mong mahirá an saimomg sinurat na mayong pakimàno, pues, dai tabì isumitir iyan digdi.<br />
Pigpapangakò mo man samuyà na ika an nagsurat kaini, o pigkopya mo ini sa dominiong panpubliko o sarong parehong libreng rekurso (hilingon an $1 para sa mga detalye). '''DAI TABÌ MAGSUMITIR NIN MGA GIBONG IPINAPANGALAD NA KOPYAHON NIN MAYONG PERMISO!'''",
-'longpagewarning' => "'''PATANID: $1 na kilobytes na kalabà an pahinang ini; an ibang mga browser pwedeng magkaproblema sa paghirá nin mga pahinang haros o sobra sa 32 kb.
-Paki bangâ ini sa saradit na seksyon.'''",
'longpageerror' => "'''SALÀ: $1 na kilobytes na kalabà an pahinang isinumitir mo, na mas halabà sa hanggan nin $2 na kilobytes. Dai pwede ining itagama.'''",
'readonlywarning' => "'''PATANID: Nakakandado an base nin datos para sa pagmantinir, pues, dai mo mûna pwede na itagama an mga paghirá mo. Pwede mo pa man na arogon dangan ipaskil ang teksto sa sarong dokumento arog kan MS Word asbp. asin itagama ini para sa atyan.'''",
'protectedpagewarning' => "'''PATANID: Nakakandado ining pahina tangarig an mga parágamit na may priblehiyo nin ''sysop'' sana an pwedeng maghira kaini.'''",
@@ -969,7 +965,6 @@ Kun an sinosog na ''file'' iyo an parehong ladawan na nasa dating sokol, dai na
Kun igwa ka nin ladawan na may resolusyón na maximo ikarga tabî ini, kun dai, bâgohon tabî an pangaran nin ''file''.",
'fileexists-forbidden' => "Igwa nang ''file'' na may parehong pangaran; bumalik tabi asin ikarga an ''file'' sa bâgong pangaran [[File:$1|thumb|center|$1]]",
'fileexists-shared-forbidden' => "Igwa nang ''file'' na may parehong pangaran sa repositoryo nin mga bakas na ''file''; bumalik tabî asin ikarga an ''file'' sa bâgong pangaran. [[File:$1|thumb|center|$1]]",
-'successfulupload' => 'Nakarga na',
'uploadwarning' => 'Patanid sa pagkarga',
'savefile' => "Itagama an ''file''",
'uploadedimage' => 'Ikinarga "[[$1]]"',
@@ -987,6 +982,7 @@ Kun igwa ka nin ladawan na may resolusyón na maximo ikarga tabî ini, kun dai,
Isipon tabi kun maninigo an pagkarga giraray kaini.
An historial nin pagparâ kan ''file'' nakakaag digdi para sa konbenyensya:",
'filename-bad-prefix' => "An pangaran nin ''file'' na pigkakarga mo nagpopoon sa '''\"\$1\"''', sarong pangaran na dai makapaladawan na normalmente enseguidang pigtatao kan mga kamerang digital. Magpili tabî nin pangaran nin ''file'' na mas makapaladawan.",
+'upload-success-subj' => 'Nakarga na',
'upload-proto-error' => 'Salang protocolo',
'upload-proto-error-text' => 'An pagkargang panharayo kaipuhan nin mga URLs na nagpopoon sa <code>http://</code> o <code>ftp://</code>.',
@@ -1239,7 +1235,6 @@ o habo magresibo nin e-surat sa ibang paragamit.',
# Watchlist
'watchlist' => 'Pigbabantayan ko',
'mywatchlist' => 'Pigbabantayan ko',
-'watchlistfor' => "(para sa '''$1''')",
'nowatchlist' => 'Mayo ka man na mga bagay saimong lista nin pigbabantayan.',
'watchlistanontext' => 'Mag $1 tabi para mahiling o maghira nin mga bagay saimong lista nin mga pigbabantayan.',
'watchnologin' => 'Mayô sa laog',
@@ -1343,7 +1338,9 @@ Huring hirá ni [[User:$3|$3]] ([[User talk:$3|Olay]]).',
'editcomment' => "Ini an nakakaag na komentaryo sa paghirá: \"''\$1''\".",
'revertpage' => 'Binawî na mga paghirá kan [[Special:Contributions/$2|$2]] ([[User talk:$2|Magtaram]]); pigbalik sa dating bersyón ni [[User:$1|$1]]',
'rollback-success' => 'Binawî na mga paghirá ni $1; pigbalik sa dating bersyón ni $2.',
-'sessionfailure' => "Garo may problema sa paglaog mo;
+
+# Edit tokens
+'sessionfailure' => "Garo may problema sa paglaog mo;
kinanselár ining aksyón bilang sarong paglikay kontra sa ''session hijacking''.
Pindotón tabî an \"back\" asin ikarga giraray an páhinang ginikanan mo, dangan probarán giraray.",
@@ -1507,7 +1504,6 @@ Magkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang
'ipb-edit-dropdown' => 'Hirahón an mga rasón sa pagbabagát',
'ipb-unblock-addr' => 'Paagihon $1',
'ipb-unblock' => 'Bawion an pagbagat nin ngaran nin paragamit o direccion nin IP',
-'ipb-blocklist-addr' => 'Hilingón an mga presenteng pagbagat ki $1',
'ipb-blocklist' => 'Hilingon an mga presenteng binagat',
'unblockip' => 'Paagihon an parâgamit',
'unblockiptext' => 'Gamiton an pormulario sa baba para puede giraray suratan an dating binagat na direccion nin IP address o ngaran nin paragamit.',
@@ -1832,10 +1828,10 @@ $1",
'imagemaxsize' => 'Limitaran an mga ladawan sa mga páhinang deskripsyon kan ladawan sa:',
'thumbsize' => 'Sokol nin retratito:',
'widthheightpage' => '$1×$2, $3 mga pahina',
-'file-info' => "(sokol kan ''file'': $1, tipo nin MIME: $2)",
-'file-info-size' => "($1 × $2 na pixel, sokol kan ''file'': $3, tipo nin MIME: $4)",
+'file-info' => "sokol kan ''file'': $1, tipo nin MIME: $2",
+'file-info-size' => "$1 × $2 na pixel, sokol kan ''file'': $3, tipo nin MIME: $4",
'file-nohires' => '<small>Mayong mas halangkaw na resolusyón.</small>',
-'svg-long-desc' => '(file na SVG, haros $1 × $2 pixels, sokol kan file: $3)',
+'svg-long-desc' => 'file na SVG, haros $1 × $2 pixels, sokol kan file: $3',
'show-big-image' => 'Todong resolusyon',
'show-big-image-thumb' => '<small>Sokol kan patânaw: $1 × $2 na pixel</small>',
diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php
index cac6f5a8..4528886e 100644
--- a/languages/messages/MessagesBe.php
+++ b/languages/messages/MessagesBe.php
@@ -59,7 +59,11 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Размовы_пра_катÑгорыю',
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+# Per discussion on http://translatewiki.net/wiki/Thread:Support/Customization_of number format
+$separatorTransformTable = array(
+ ',' => "\xc2\xa0", # nbsp
+ '.' => ','
+);
$linkTrail = '/^([абвгґджзеёжзійклмнопрÑтуўфхцчшыьÑÑŽÑćÄłńśšŭźža-z]+)(.*)$/sDu';
@@ -79,8 +83,7 @@ $messages = array(
'tog-editsection' => 'Праўка падраздзелаў праз ÑпаÑылкі "[правіць]"',
'tog-editsectiononrightclick' => 'Праўка падраздзелаў па правым пÑтрыку на загалоўку (ЯваÑкрыпт)',
'tog-showtoc' => 'Паказваць змеÑÑ‚ (Ð´Ð»Ñ Ñтаронак, дзе больш за 3 падзагалоўкі)',
-'tog-rememberpassword' => 'ПамÑтаць ад ÑеанÑу да ÑеанÑу',
-'tog-editwidth' => 'Пашыраць Ñ€ÑдактарÑкае акно да поўнай шырыні Ñкрана',
+'tog-rememberpassword' => 'ПамÑтаць ÑƒÐ²Ð°Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ð´Ð°Ð½Ñ‹Ñ Ñž гÑтым браўзеры (не даўжÑй за $1 {{PLURAL:$1|дзень|дні|дзён}})',
'tog-watchcreations' => 'Старонкі, ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ñ‹Ñ Ð¼Ð½Ð¾Ð¹, дадаюцца да назіранага',
'tog-watchdefault' => 'Старонкі, Ð¿Ñ€Ð°ÑžÐ»ÐµÐ½Ñ‹Ñ Ð¼Ð½Ð¾Ð¹, дадаюцца да назіранага',
'tog-watchmoves' => 'Старонкі, перанеÑÐµÐ½Ñ‹Ñ Ð¼Ð½Ð¾Ð¹, дадаюцца да назіранага',
@@ -226,31 +229,21 @@ $messages = array(
'faqpage' => 'Project:ЧÐПЫ',
# Vector skin
-'vector-action-addsection' => 'Дадаць Ñ‚Ñму',
-'vector-action-delete' => 'Сцерці',
-'vector-action-move' => 'ПеранеÑці',
-'vector-action-protect' => 'Ðхова',
-'vector-action-undelete' => 'Ðднавіць',
-'vector-action-unprotect' => 'ЗнÑць ахову',
-'vector-namespace-category' => 'КатÑгорыÑ',
-'vector-namespace-help' => 'Старонка даведкі',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Старонка',
-'vector-namespace-media' => 'МультымедыÑ',
-'vector-namespace-mediawiki' => 'Паведамленне',
-'vector-namespace-project' => 'Ðб праекце',
-'vector-namespace-special' => 'ÐдмыÑÐ»Ð¾Ð²Ð°Ñ Ñтаронка',
-'vector-namespace-talk' => 'Размовы',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Старонка',
-'vector-view-create' => 'Стварыць',
-'vector-view-edit' => 'Правіць',
-'vector-view-history' => 'Паказаць гіÑторыю',
-'vector-view-view' => 'Чытаць',
-'vector-view-viewsource' => 'Паказаць выточны Ñ‚ÑкÑÑ‚',
-'actions' => 'ДзеÑнні',
-'namespaces' => 'ПраÑторы імёнаў',
-'variants' => 'ВарыÑнты',
+'vector-action-addsection' => 'Дадаць Ñ‚Ñму',
+'vector-action-delete' => 'Сцерці',
+'vector-action-move' => 'ПеранеÑці',
+'vector-action-protect' => 'Ðхова',
+'vector-action-undelete' => 'Ðднавіць',
+'vector-action-unprotect' => 'ЗнÑць ахову',
+'vector-simplesearch-preference' => 'Уключыць пашыраны пошук прапаноў (толькі Ð´Ð»Ñ Ñ‚Ñмы Vector)',
+'vector-view-create' => 'Стварыць',
+'vector-view-edit' => 'Правіць',
+'vector-view-history' => 'Паказаць гіÑторыю',
+'vector-view-view' => 'Чытаць',
+'vector-view-viewsource' => 'Паказаць выточны Ñ‚ÑкÑÑ‚',
+'actions' => 'ДзеÑнні',
+'namespaces' => 'ПраÑторы імёнаў',
+'variants' => 'ВарыÑнты',
'errorpagetitle' => 'Памылка',
'returnto' => 'Ð’Ñрнуцца да $1.',
@@ -311,6 +304,9 @@ $messages = array(
Калі лаÑка, трохі пачакайце, перш чым адкрываць гÑтую Ñтаронку ізноў.
$1',
+'pool-timeout' => 'Выйшаў Ñ‡Ð°Ñ Ñ‡Ð°ÐºÐ°Ð½Ð½Ñ Ð±Ð»Ð°ÐºÑ–Ñ€Ð¾ÑžÐºÑ–',
+'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' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
@@ -473,7 +469,8 @@ $2',
'yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
'yourpassword' => 'Пароль',
'yourpasswordagain' => 'Паўтарыце пароль',
-'remembermypassword' => 'ПамÑтаць мÑне',
+'remembermypassword' => "ПамÑтаць мÑне на гÑтым камп'ютары (не даўжÑй за $1 {{PLURAL:$1|дзень|дзён}})",
+'securelogin-stick-https' => 'ПрацÑгваць злучÑнне па HTTPS паÑÐ»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð°',
'yourdomainname' => 'Ваш дамен',
'externaldberror' => 'Ðбо памылка вонкавай аўтÑнтыкацыі Ñž базе дадзеных, або вам не дазволена абнаўлÑць Ñвой вонкавы рахунак.',
'login' => 'УвайÑці Ñž ÑÑ–ÑÑ‚Ñму',
@@ -490,6 +487,7 @@ $2',
'gotaccount' => "Ужо маеце рахунак? '''$1'''.",
'gotaccountlink' => 'УвайÑці Ñž ÑÑ–ÑÑ‚Ñму',
'createaccountmail' => 'праз Ñл.пошту',
+'createaccountreason' => 'Прычына:',
'badretype' => 'Ð£Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ– не аднолькавыÑ.',
'userexists' => 'Такое Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° ўжо занÑтае.
ТрÑба выбраць іншае імÑ.',
@@ -508,6 +506,7 @@ $2',
'wrongpasswordempty' => 'Быў уведзены пуÑÑ‚Ñ‹ пароль. ПаÑпрабуйце нанова.',
'passwordtooshort' => 'ТрÑба, каб у паролі было найменей {{PLURAL:$1|1 знак|$1 знакаў}}.',
'password-name-match' => 'Ваш пароль павінен адрознівацца ад Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка.',
+'password-login-forbidden' => 'ВыкарыÑтанне гÑтага Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±Ñ‹Ð»Ð¾ забаронена.',
'mailmypassword' => 'ÐдаÑлаць новы пароль Ñл.поштай',
'passwordremindertitle' => 'Ðагаданне пра пароль ад {{SITENAME}}',
'passwordremindertext' => 'Ðехта (магчыма, што вы, з адраÑу IP $1) папраÑÑ–Ñž выÑлаць новы пароль Ð´Ð»Ñ Ð¿Ð»Ñцоўкі {{SITENAME}} ($4). Ð”Ð»Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° "$2" быў Ñтвораны тымчаÑовы пароль: "$3".
@@ -541,6 +540,9 @@ $2',
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запыт на выхад быў адмоўлены, паколькі ён выглÑдае Ñк накіраваны Ñа зламанага браўзера або кÑшаванне прокÑÑ–-Ñервераў.',
+# E-mail sending
+'php-mail-error-unknown' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž функцыі PHP-пошты',
+
# Password reset dialog
'resetpass' => 'ЗмÑніць пароль',
'resetpass_announce' => 'Ð’Ñ‹ ўвайшлі Ñž ÑÑ–ÑÑ‚Ñму пад тымчаÑовым паролем, прыÑланым Ñл.поштай. Каб правільна аформіць уваход, належыць вызначыць новы пароль воÑÑŒ тут:',
@@ -591,9 +593,10 @@ $2',
'showlivepreview' => 'Жывы перадпаказ',
'showdiff' => 'Розніца',
'anoneditwarning' => 'Ð’Ñ‹ не ўвайшлі Ñž ÑÑ–ÑÑ‚Ñму. Таму, калі вы запішаце Ñтаронку, у Ñе гіÑторыю трапіць ваш Ð°Ð´Ñ€Ð°Ñ IP.',
+'anonpreviewwarning' => "''Ð’Ñ‹ не прайшлі ідÑнтыфікацыю Захаванне будзе запіÑана з вашым IP адраÑам у гіÑторыі правак гÑтай Ñтаронкі.''",
'missingsummary' => "'''Ðагадваем''': вы не ўпіÑалі тлумачÑÐ½Ð½Ñ Ð´Ð»Ñ Ñваёй праўкі. Калі націÑнуць ЗапіÑаць ÑÑˆÑ‡Ñ Ñ€Ð°Ð·, праўка будзе замацавана без тлумачÑннÑ.",
'missingcommenttext' => 'Калі лаÑка, увÑдзіце ніжÑй каментарый.',
-'missingcommentheader' => "'''Увага:''' вы нічога не ўпіÑалі Ñž полі Ñ‚Ñмы/загалоўку гÑтай заўвагі. ÐаціÑканне '{{:{{ns:mediawiki}}:savearticle/be}}' замацуе вашую праўку з пуÑтым полем Ñ‚Ñмы/загалоўку.",
+'missingcommentheader' => "'''Увага:''' вы нічога не ўпіÑалі Ñž Ñ‚Ñму/загаловак гÑтай заўвагі. ÐаціÑканне '{{int:savearticle}}' замацуе вашую праўку з пуÑтой Ñ‚Ñмай/загалоўкам.",
'summary-preview' => 'Перадпаказ апіÑаннÑ:',
'subject-preview' => 'Перадпаказ Ñ‚Ñмы/загалоўка:',
'blockedtitle' => 'Удзельнік заблакаваны',
@@ -655,7 +658,11 @@ $2',
'userjsyoucanpreview' => "'''Парада:''' КарыÑтайцеÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ°Ð¹ \"''{{int:showpreview}}''\" Ð´Ð»Ñ Ð²Ñ‹Ð¿Ñ€Ð°Ð±Ð¾ÑžÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð°Ð³Ð° коду JS ''перад тым'', Ñк Ñго запіÑваць.",
'usercsspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні паказ вашага ўлаÑнага CSS. Праўкі ÑÑˆÑ‡Ñ Ð½Ðµ замацаваныÑ!'''",
'userjspreview' => "'''ПамÑтайце, што гÑта выпрабаванне/папÑÑ€Ñдні паказ вашага ўлаÑнага ЯваÑкрыпту, Ñкі ÑÑˆÑ‡Ñ Ð½Ðµ быў замацаваны!'''",
-'userinvalidcssjstitle' => "'''Увага:''' ÐÑма вокладкі з назвай \"\$1\". ПамÑтайце, што Ñвае Ñтаронкі .css Ñ– .js называюцца толькі малымі літарамі, такім чынам, напр., {{ns:user}}:Foo/monobook.css, а не {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні паказ вашага CSS.'''
+'''Праўкі ÑÑˆÑ‡Ñ Ð½Ðµ замацаваныÑ!'''",
+'sitejspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні паказ вашага JavaScript.'''
+'''Праўкі ÑÑˆÑ‡Ñ Ð½Ðµ замацаваныÑ!'''",
+'userinvalidcssjstitle' => "'''Увага:''' ÐÑма вокладкі з назвай \"\$1\". ПамÑтайце, што Ñвае Ñтаронкі .css Ñ– .js называюцца толькі малымі літарамі, такім чынам, напр., {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
'updated' => '(абноўлена)',
'note' => "'''Заўвага:'''",
'previewnote' => "'''ГÑта папÑÑ€Ñдні паказ; праўкі ÑÑˆÑ‡Ñ Ð½Ðµ замацаваныÑ!'''",
@@ -690,8 +697,6 @@ $2',
'copyrightwarning2' => "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб Ð²Ð°ÑˆÑ‹Ñ Ð¼Ð°Ñ‚ÑрыÑлы бÑзлітаÑна правіліÑÑ, то Ñ– не давайце Ñ–Ñ… Ñюды.<br />
ТакÑама вы нам абÑцаеце, што напіÑалі гÑта Ñамі, або Ñкапіравалі з Ñ€ÑÑурÑу, Ñкі знаходзіцца Ñž публічнай улаÑнаÑці, або з аналагічнага Ñвабоднага Ñ€ÑÑурÑу (бач падрабÑзнаÑці на $1).
'''ÐЕ КЛÐДЗІЦЕ СЮДЫ, БЕЗ ÐДПÐВЕДÐÐГРДÐЗВОЛУ, ÐœÐТЭРЫЯЛУ, ЯКІ ÐХОЎВÐЕЦЦРÐЎТÐРСКІМ ПРÐÐ’ÐÐœ!'''",
-'longpagewarning' => "'''УВÐГÐ: Старонка даÑÑгае аб'ёму $1 кілабайтаў; Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð±Ñ€Ð°ÑžÐ·ÐµÑ€Ñ‹ не адольваюць Ñтаронак з аб'ёмам, блізкім ці большым за 32 kб.
-Падумайце, ці можна падзÑліць Ñтаронку на некалькі меншых.'''",
'longpageerror' => "'''ПÐМЫЛКÐ: немагчыма запіÑаць ваш Ñ‚ÑкÑÑ‚, бо Ñго аб'ём $1 кілабайтаў, а дазволены макÑімум — $2 кілабайтаў.'''",
'readonlywarning' => "'''УВÐГÐ: зараз вы не можаце запіÑаць Ñвае праўкі, таму што база даных зачынена на абÑлугоўванне. Магчыма, варта перанеÑці ваш Ñ‚ÑкÑÑ‚ у аÑобны файл Ñ– запіÑаць на потым.
@@ -852,6 +857,8 @@ $2',
$1",
'logdelete-success' => "'''БачнаÑць падзеі наÑÑ‚Ð°ÑžÐ»ÐµÐ½Ð°Ñ Ð¿Ð°ÑпÑхова.'''",
'revdel-restore' => 'ПамÑнÑць бачнаÑць',
+'revdel-restore-deleted' => 'Ð’Ñ‹Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ Ð·Ð¼ÐµÐ½Ñ‹',
+'revdel-restore-visible' => 'Ð‘Ð°Ñ‡Ð½Ñ‹Ñ Ð·Ð¼ÐµÐ½Ñ‹',
'pagehist' => 'ГіÑÑ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі',
'deletedhist' => 'Ð¡Ñ†Ñ‘Ñ€Ñ‚Ð°Ñ Ð³Ñ–ÑторыÑ',
'revdelete-content' => 'змеÑÑ‚',
@@ -924,7 +931,7 @@ $1",
'compareselectedversions' => 'Параўнаць Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ð²ÐµÑ€ÑÑ–Ñ–',
'showhideselectedversions' => 'Паказаць/Ñхаваць Ð²Ñ‹Ð±Ñ€Ð°Ð½Ñ‹Ñ Ð²ÐµÑ€ÑÑ–Ñ–',
'editundo' => 'адкат',
-'diff-multi' => '(Ðе паказан{{PLURAL:$1|а адна Ð¿Ñ€Ð°Ð¼ÐµÐ¶ÐºÐ°Ð²Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ|Ñ‹ $1 прамежкавых верÑій}}.)',
+'diff-multi' => '(не паказан{{PLURAL:$1|а адна Ð¿Ñ€Ð°Ð¼ÐµÐ¶ÐºÐ°Ð²Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ|Ñ‹ $1 прамежкавых верÑій}}, зроблен{{PLURAL:$2|Ð°Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ð¼|Ñ‹Ñ $2 удзельнікамі}})',
# Search results
'searchresults' => 'Вынікі пошуку',
@@ -1031,6 +1038,7 @@ $1",
'contextlines' => 'Радкоў на вынік:',
'contextchars' => 'КантÑкÑту на радок:',
'stub-threshold' => 'Парог Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ ÑпаÑылкі <a href="#" class="stub">Ñк на пачатковы артыкул</a> (у байтах):',
+'stub-threshold-disabled' => 'Ðе ўключана',
'recentchangesdays' => 'За колькі дзён паказваць {{lc:{{:{{ns:mediawiki}}:recentchanges/be}}}}:',
'recentchangesdays-max' => '(найбольш $1 {{PLURAL:$1|дзень|дзён}})',
'recentchangescount' => 'ÐŸÑ€Ð°Ð´Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць правак Ð´Ð·ÐµÐ»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ:',
@@ -1064,6 +1072,7 @@ $1",
'prefs-files' => 'Файлы',
'prefs-custom-css' => 'УлаÑны CSS',
'prefs-custom-js' => 'УлаÑны JS',
+'prefs-common-css-js' => 'Ðгульны CSS/JavaScript Ð´Ð»Ñ ÑžÑÑ–Ñ… вокладак:',
'prefs-reset-intro' => 'Тут можна вÑрнуць Ñвае наÑтаўленні да прадвызначÑннÑÑž, прынÑÑ‚Ñ‹Ñ… на гÑтай плÑцоўцы.
Ðдкаціць гÑтае дзеÑнне нельга.',
'prefs-emailconfirm-label' => 'Пацверджанне адраÑу Ñл.пошты:',
@@ -1100,9 +1109,14 @@ $1",
'prefs-advancedrendering' => 'УÑÐºÐ»Ð°Ð´Ð½ÐµÐ½Ñ‹Ñ Ð½Ð°Ñтаўленні',
'prefs-advancedsearchoptions' => 'УÑÐºÐ»Ð°Ð´Ð½ÐµÐ½Ñ‹Ñ Ð½Ð°Ñтаўленні',
'prefs-advancedwatchlist' => 'УÑÐºÐ»Ð°Ð´Ð½ÐµÐ½Ñ‹Ñ Ð½Ð°Ñтаўленні',
-'prefs-display' => 'Паказ',
+'prefs-displayrc' => 'Паказ',
+'prefs-displaysearchoptions' => 'Паказ',
+'prefs-displaywatchlist' => 'Паказ',
'prefs-diffs' => 'Розніцы',
+# User preference: e-mail validation using jQuery
+'email-address-validity-invalid' => 'УвÑдзіце Ñлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+
# User rights
'userrights' => 'РаÑпараджÑнне правамі ўдзельніка',
'userrights-lookup-user' => 'РаÑпараджацца групамі ўдзельнікаў',
@@ -1186,6 +1200,7 @@ $1",
'right-hideuser' => 'ЗабаранÑць Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° Ñ– рабіць Ñго нÑбачным',
'right-ipblock-exempt' => 'Перамагаць забароны на IP, аўта- Ñ– дыÑÐ¿Ð°Ð·Ð¾Ð½Ð½Ñ‹Ñ Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹',
'right-proxyunbannable' => 'Перамагаць Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ñ‹Ñ Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ на прокÑÑ–',
+'right-unblockself' => 'Разблакаваць іх',
'right-protect' => 'ÐœÑнÑць узроўні аховы Ñ– правіць Ñтаронкі, што пад аховай',
'right-editprotected' => 'Правіць Ñтаронкі, што пад аховай (але без каÑкаднай аховы)',
'right-editinterface' => 'Правіць карыÑтальніцкі інтÑрфейÑ',
@@ -1258,14 +1273,9 @@ $1",
'recentchanges-legend' => 'МагчымаÑці паказу',
'recentchangestext' => 'ГÑта Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð¼ÐµÐ½Ñ‹ на плÑцоўцы {{SITENAME}}.',
'recentchanges-feed-description' => 'Сачыць за найбольш актуальнымі змÑненнÑмі Ñž вікÑе праз гÑÑ‚Ñ‹ Ñтрумень навін.',
-'recentchanges-label-legend' => 'ÐзначÑнні: $1.',
-'recentchanges-legend-newpage' => '$1 - Ð½Ð¾Ð²Ð°Ñ Ñтаронка',
'recentchanges-label-newpage' => 'ГÑтай праўкай была Ñтворана Ð½Ð¾Ð²Ð°Ñ Ñтаронка',
-'recentchanges-legend-minor' => '$1 - Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¿Ñ€Ð°ÑžÐºÐ°',
'recentchanges-label-minor' => 'ГÑта Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¿Ð° значÑнні праўка',
-'recentchanges-legend-bot' => '$1 - праўка робата',
'recentchanges-label-bot' => 'Праўка была Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ð°Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ð°Ð¹-робатам',
-'recentchanges-legend-unpatrolled' => '$1 - нÑÑžÑ…Ð²Ð°Ð»ÐµÐ½Ð°Ñ Ð¿Ñ€Ð°ÑžÐºÐ°',
'recentchanges-label-unpatrolled' => 'Праўка ÑÑˆÑ‡Ñ Ð½Ðµ атрымала адзнакі ўхваленаÑці (за ёй не Ñочыць "патруль")',
'rcnote' => "ÐіжÑй паказан{{PLURAL:$1|а '''1''' змÑненне|Ñ‹Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ '''$1''' змÑненнÑÑž}} за апошні{{PLURAL:$2| дзень|Ñ '''$2''' дзён}}, паводле Ñтану на $5, $4.",
'rcnotefrom' => 'ÐіжÑй знаходзÑцца змены з <b>$2</b> (да <b>$1</b> на Ñтаронку).',
@@ -1312,6 +1322,9 @@ $1",
'upload_directory_missing' => 'ÐÑма каталога Ð´Ð»Ñ ÑžÐºÐ»Ð°Ð´Ð°Ñž ($1), Ñ– Ñерверу не ўдалоÑÑ Ñго Ñтварыць.',
'upload_directory_read_only' => 'Ðемагчыма Ð´Ð»Ñ Ð²ÐµÐ±-Ñервера запіÑаць у каталог укладаў ($1).',
'uploaderror' => 'Памылка пры ўкладанні',
+'upload-recreate-warning' => "'''Увага''': файл з такім імем быў выдалены або перамешчаны.'''
+
+Журнал Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ– перамÑшчÑÐ½Ð½Ñ Ð³Ñтай Ñтаронкі прыводзіцца тут Ð´Ð»Ñ Ð·Ñ€ÑƒÑ‡Ð½Ð°Ñці:",
'uploadtext' => "Тут можна ўклаÑці файлы Ñž вікі.
ПраглÑд або пошук раней укладзенага [[Special:FileList|робіцца тут]]; апроч таго, уÑе ўкладанні Ñ– Ñціранні адзначаюцца Ñž журналах [[Special:Log/upload|укладаннÑ]] Ñ– [[Special:Log/delete|ÑціраннÑ]], адпаведна.
@@ -1343,6 +1356,14 @@ $1",
'filetype-unwanted-type' => "'''\".\$1\"''' належыць да нежаданых тыпаў файлаў. Пажаданы{{PLURAL:\$3| тып файла|Ñ Ñ‚Ñ‹Ð¿Ñ‹ файлаў}}: \$2.",
'filetype-banned-type' => "'''\".\$1\"''' належыць да недазволеных тыпаў файлаў. Дазволены{{PLURAL:\$3| тып файла|Ñ Ñ‚Ñ‹Ð¿Ñ‹ файлаў}}: \$2.",
'filetype-missing' => 'Ðазва файла без ÑуфікÑу (напрыклад, ".jpg").',
+'empty-file' => 'Файл, Ñкі вы прадÑтавілі, быў пуÑÑ‚Ñ‹.',
+'file-too-large' => 'Файл, Ñкі вы прадÑтавілі быў занадта вÑлікі.',
+'filename-tooshort' => 'Ð†Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° занадта кароткае.',
+'filetype-banned' => 'ГÑÑ‚Ñ‹ тып файлаў забаронены.',
+'verification-error' => 'ГÑÑ‚Ñ‹ файл не прайшоў файлавую праверку.',
+'illegal-filename' => 'Ð†Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° не дапуÑкаецца.',
+'unknown-error' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°.',
+'tmp-create-error' => 'Ðе атрымалаÑÑ Ñтварыць чаÑовы файл',
'large-file' => 'РÑкамендуецца, каб файлы былі не Ð±Ð¾Ð»ÑŒÑˆÑ‹Ñ Ð·Ð° $1; гÑÑ‚Ñ‹ файл ёміць $2.',
'largefileserver' => "ГÑÑ‚Ñ‹ файл большага аб'ёму, чым дазвалÑе ÐºÐ°Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ‹Ñ Ñервера.",
'emptyfile' => 'Здаецца, што файл, укладзены вамі, пуÑÑ‚Ñ‹. Магчыма, здарылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž назве файла? Праверце, ці вы Ñапраўды хацелі ўклаÑці менавіта гÑÑ‚Ñ‹ файл.',
@@ -1366,7 +1387,6 @@ $1",
Калі вы жадаеце ÑžÑÑ‘ ж уклаÑці Ñвой файл, паўтарыце працÑдуру ўкладаннÑ, але з іншай назвай. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => "ГÑÑ‚Ñ‹ файл з'ÑўлÑецца дублікатам наÑтупн{{PLURAL:$1|ага файла|Ñ‹Ñ… файлаў}}:",
'file-deleted-duplicate' => 'Файл, падобны да гÑтага ([[:$1]]), быў Ñцёрты некалі раней. ТрÑба праверыць гіÑторыю таго файла перад тым, Ñк укладваць Ñго нанова.',
-'successfulupload' => 'ПаÑпÑховае ўкладанне',
'uploadwarning' => 'ПапÑÑ€Ñджанне пра ўкладанне',
'savefile' => 'ЗапіÑаць файл',
'uploadedimage' => 'укладзена "[[$1]]"',
@@ -1390,6 +1410,9 @@ $1",
ТрÑба падумаць, ці варта ўкладваць такі файл.
ВоÑÑŒ, Ð´Ð·ÐµÐ»Ñ Ð´Ð°Ð²ÐµÐ´ÐºÑ–, журнал ÑціраннÑÑž:",
'filename-bad-prefix' => "Ðазва файла, Ñкі вы ўкладаеце, пачынаецца з '''\"\$1\"''', што падобна на аўтаматычныÑ, Ð½ÐµÑ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ‚Ñ‹ÑžÐ½Ñ‹Ñ Ð½Ð°Ð·Ð²Ñ‹ файлаў, ÑÐºÑ–Ñ Ñ€Ð¾Ð±Ñць Ð»Ñ–Ñ‡Ð±Ð°Ð²Ñ‹Ñ Ñ„Ð¾Ñ‚Ð°Ð°Ð¿Ð°Ñ€Ð°Ñ‚Ñ‹. Калі лаÑка, змÑніце назву на больш зразумелую.",
+'upload-success-subj' => 'ПаÑпÑховае ўкладанне',
+'upload-failure-subj' => 'Праблема загрузкі',
+'upload-warning-subj' => 'Дадаць папÑÑ€Ñджанне',
'upload-proto-error' => 'ÐÑправільны пратакол',
'upload-proto-error-text' => 'Укладанне файла зводдаль патрабуе URL, Ñкі пачынаецца з <code>http://</code> або <code>ftp://</code>.',
@@ -1541,7 +1564,6 @@ $1",
'statistics-edits-average' => 'КолькаÑць правак на 1 Ñтаронку',
'statistics-views-total' => 'УÑе паказы',
'statistics-views-peredit' => 'КолькаÑць паказаў на 1 праўку',
-'statistics-jobqueue' => 'Ð”Ð°ÑžÐ¶Ñ‹Ð½Ñ [http://www.mediawiki.org/wiki/Manual:Job_queue чаргі задач]',
'statistics-users' => 'Registered [[Special:ListUsers|users]]',
'statistics-users-active' => 'ÐÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÑ–',
'statistics-users-active-desc' => 'Удзельнікі, ÑÐºÑ–Ñ Ñ…Ð¾Ñ†ÑŒ нешта зрабілі за апошн{{PLURAL:$1|Ñ– дзень|Ñ–Ñ $1 дзён}}',
@@ -1556,7 +1578,7 @@ $1",
'doubleredirects' => 'ÐŸÐ°Ð´Ð²Ð¾Ð¹Ð½Ñ‹Ñ Ð¿ÐµÑ€Ð°Ñылкі',
'doubleredirectstext' => 'Тут Ð¿ÐµÑ€Ð°Ð»Ñ–Ñ‡Ð°Ð½Ñ‹Ñ Ñтаронкі-пераÑылкі, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð²Ð°ÑŽÑ†ÑŒ на Ñ–Ð½ÑˆÑ‹Ñ Ð¿ÐµÑ€Ð°Ñылкі.
Кожны радок утрымлівае ÑпаÑылкі на першую Ñ– другую пераÑылкі, а такÑама мÑту другой пераÑылкі, ÑÐºÐ°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð° Ñ– Ñ‘Ñць "ÑапраўднаÑ" мÑÑ‚Ð°Ð²Ð°Ñ Ñтаронка, на Ñкую павінна была паказваць Ð¿ÐµÑ€ÑˆÐ°Ñ Ð¿ÐµÑ€Ð°Ñылка.
-<s>ЗакрÑÑÐ»ÐµÐ½Ñ‹Ñ Ñкладнікі</s> ўжо былі папраўленыÑ.',
+<del>ЗакрÑÑÐ»ÐµÐ½Ñ‹Ñ Ñкладнікі</del> ўжо былі папраўленыÑ.',
'double-redirect-fixed-move' => 'Ðазва [[$1]] была перанеÑена, Ñ– зараз пераÑылае да [[$2]]',
'double-redirect-fixer' => 'ВыпраўлÑльнік пераÑылак',
@@ -1731,34 +1753,35 @@ $1",
'listgrouprights-removegroup-self-all' => 'Выдаліць уÑе групы Ñа Ñвайго акаунта',
# E-mail user
-'mailnologin' => 'ÐÑма Ñл.адраÑу',
-'mailnologintext' => 'ТрÑба [[Special:UserLogin|ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму]] Ñ– мець пацверджаны Ð°Ð´Ñ€Ð°Ñ Ñл.пошты Ñž Ñваіх [[Special:Preferences|наÑтáўленнÑÑ…]], каб Ñлаць Ñл.пошту іншым удзельнікам.',
-'emailuser' => 'Эл.пошта ўдзельніка',
-'emailpage' => 'Зварот да ўдзельніка праз Ñл.пошту',
-'emailpagetext' => 'Тут можна выÑлаць Ñл.пошту гÑтаму ўдзельніку.
+'mailnologin' => 'ÐÑма Ñл.адраÑу',
+'mailnologintext' => 'ТрÑба [[Special:UserLogin|ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму]] Ñ– мець пацверджаны Ð°Ð´Ñ€Ð°Ñ Ñл.пошты Ñž Ñваіх [[Special:Preferences|наÑтáўленнÑÑ…]], каб Ñлаць Ñл.пошту іншым удзельнікам.',
+'emailuser' => 'Эл.пошта ўдзельніка',
+'emailpage' => 'Зварот да ўдзельніка праз Ñл.пошту',
+'emailpagetext' => 'Тут можна выÑлаць Ñл.пошту гÑтаму ўдзельніку.
ÐÐ´Ñ€Ð°Ñ Ñл.пошты, уведзены вамі Ñž [[Special:Preferences|Ñваіх наÑтаўленнÑÑ…]], з\'Ñвіцца Ñž полі "From" вашага ліÑта, Ñ– атрымальнік зможа адказаць на ваш ліÑÑ‚.',
-'usermailererror' => "Паштовы аб'ект паведамлÑе пра памылку:",
-'defemailsubject' => 'Ñл.пошта {{SITENAME}}',
-'noemailtitle' => 'ÐÑма адраÑа Ñлектроннай пошты',
-'noemailtext' => 'Удзельнік не паведаміў карÑктнага адраÑу Ñл.пошты.',
-'nowikiemailtitle' => 'Ðе Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ Ñл.пошта',
-'nowikiemailtext' => 'ГÑÑ‚Ñ‹ ўдзельнік не жадае атрымліваць Ñл.пошты ад іншых удзельнікаў.',
-'email-legend' => 'ÐдаÑлаць Ñл.ліÑÑ‚ іншаму ўдзельніку праекта {{SITENAME}}',
-'emailfrom' => 'Ðд каго:',
-'emailto' => 'Каму:',
-'emailsubject' => 'ТÑма:',
-'emailmessage' => 'ТÑкÑÑ‚:',
-'emailsend' => 'ÐдаÑлаць',
-'emailccme' => 'Ðтрымаць копію Ñвайго ліÑта.',
-'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ліÑта да $1: $2',
-'emailsent' => 'Эл.пошта адаÑлана',
-'emailsenttext' => 'Ваш ліÑÑ‚ Ñл.пошты быў адаÑланы.',
-'emailuserfooter' => 'ГÑÑ‚Ñ‹ Ñл.ліÑÑ‚ быў выÑланы ад $1 да $2 праз функцыю "{{:{{ns:mediawiki}}:emailuser/be}}" плÑцоўкі {{SITENAME}}.',
+'usermailererror' => "Паштовы аб'ект паведамлÑе пра памылку:",
+'defemailsubject' => 'Ñл.пошта {{SITENAME}}',
+'usermaildisabled' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° ўдзельніка не працуе',
+'usermaildisabledtext' => 'Ð’Ñ‹ не можаце адпраўлÑць паведамленні Ñлектроннай пошты іншым карыÑтальнікам гÑтай вікі',
+'noemailtitle' => 'ÐÑма адраÑа Ñлектроннай пошты',
+'noemailtext' => 'Удзельнік не паведаміў карÑктнага адраÑу Ñл.пошты.',
+'nowikiemailtitle' => 'Ðе Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ Ñл.пошта',
+'nowikiemailtext' => 'ГÑÑ‚Ñ‹ ўдзельнік не жадае атрымліваць Ñл.пошты ад іншых удзельнікаў.',
+'email-legend' => 'ÐдаÑлаць Ñл.ліÑÑ‚ іншаму ўдзельніку праекта {{SITENAME}}',
+'emailfrom' => 'Ðд каго:',
+'emailto' => 'Каму:',
+'emailsubject' => 'ТÑма:',
+'emailmessage' => 'ТÑкÑÑ‚:',
+'emailsend' => 'ÐдаÑлаць',
+'emailccme' => 'Ðтрымаць копію Ñвайго ліÑта.',
+'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ліÑта да $1: $2',
+'emailsent' => 'Эл.пошта адаÑлана',
+'emailsenttext' => 'Ваш ліÑÑ‚ Ñл.пошты быў адаÑланы.',
+'emailuserfooter' => 'ГÑÑ‚Ñ‹ Ñл.ліÑÑ‚ быў выÑланы ад $1 да $2 праз функцыю "{{:{{ns:mediawiki}}:emailuser/be}}" плÑцоўкі {{SITENAME}}.',
# Watchlist
'watchlist' => 'Мой ÑÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½Ð°Ð³Ð°',
'mywatchlist' => 'Ðазіранае',
-'watchlistfor' => "(Ð´Ð»Ñ '''$1''')",
'nowatchlist' => 'Ваш ÑÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½Ð°Ð³Ð° зараз пуÑÑ‚Ñ‹.',
'watchlistanontext' => 'Каб бачыць або правіць Ñкладнікі назіранага, Ñ‚Ñ€Ñба $1.',
'watchnologin' => 'Без прадÑтаўленнÑ',
@@ -1872,7 +1895,9 @@ $NEWPAGE
'editcomment' => "ТлумачÑнне праўкі было: \"''\$1''\".",
'revertpage' => 'Праўкі аўтарÑтва [[Special:Contributions/$2|$2]] ([[User talk:$2|размова]]) адкочаныÑ; вернута апошнÑÑ Ð²ÐµÑ€ÑÑ–Ñ Ð°ÑžÑ‚Ð°Ñ€Ñтва [[User:$1|$1]]',
'rollback-success' => 'Ðдкочаны праўкі $1; вернута апошнÑÑ Ð²ÐµÑ€ÑÑ–Ñ $2.',
-'sessionfailure' => 'Магчыма, Ñ‘Ñць праблемы з вашым ÑеанÑам працы Ñž ÑÑ–ÑÑ‚Ñме. Таму вам было адмоўлена Ñž выкананні дзеÑннÑ, каб заÑцерагчыÑÑ Ð°Ð´ захопу ÑеанÑа. ÐаціÑніце "Ðазад", Ñ– перачытайце Ñтаронку, з Ñкой вы Ñюды прыйшлі, тады паÑпрабуйце нанова.',
+
+# Edit tokens
+'sessionfailure' => 'Магчыма, Ñ‘Ñць праблемы з вашым ÑеанÑам працы Ñž ÑÑ–ÑÑ‚Ñме. Таму вам было адмоўлена Ñž выкананні дзеÑннÑ, каб заÑцерагчыÑÑ Ð°Ð´ захопу ÑеанÑа. ÐаціÑніце "Ðазад", Ñ– перачытайце Ñтаронку, з Ñкой вы Ñюды прыйшлі, тады паÑпрабуйце нанова.',
# Protect
'protectlogpage' => 'Журнал аховы',
@@ -2066,7 +2091,6 @@ $1',
'ipb-edit-dropdown' => 'Прычыны паÑтаноўкі блока',
'ipb-unblock-addr' => 'ЗнÑць блок з $1',
'ipb-unblock' => 'ЗнÑць блок з Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° або адраÑу IP',
-'ipb-blocklist-addr' => 'ÐаÑÑžÐ½Ñ‹Ñ Ð±Ð»Ð¾ÐºÑ– Ð´Ð»Ñ $1',
'ipb-blocklist' => 'Паказаць наÑÑžÐ½Ñ‹Ñ Ð±Ð»Ð¾ÐºÑ–',
'ipb-blocklist-contribs' => 'Уклад $1',
'unblockip' => 'ЗнÑць блок з удзельніка',
@@ -2489,14 +2513,17 @@ $1',
'imagemaxsize' => "ÐœÑжа памеру выÑваў:<br />''(на тлумачальных Ñтаронках)''",
'thumbsize' => 'Памеры драбніцы:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñтаронка|Ñтаронак}}',
-'file-info' => "(аб'ём файла: $1, тып MIME: $2)",
-'file-info-size' => "($1 × $2 кропак, аб'ём файла: $3, тып MIME: $4)",
+'file-info' => "аб'ём файла: $1, тып MIME: $2",
+'file-info-size' => "$1 × $2 кропак, аб'ём файла: $3, тып MIME: $4",
'file-nohires' => '<small>Без верÑÑ–Ñ– Ñž лепшым разрозненні.</small>',
-'svg-long-desc' => "(файл SVG, намінальна $1 × $2 кропак, аб'ём файла: $3)",
+'svg-long-desc' => "файл SVG, намінальна $1 × $2 кропак, аб'ём файла: $3",
'show-big-image' => 'Ðайлепшае разрозненне',
'show-big-image-thumb' => '<small>Памеры гÑтага перадпаказу: $1 × $2 кропак</small>',
'file-info-gif-looped' => 'закальцаваныÑ',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадр|кадраў}}',
+'file-info-png-looped' => 'бÑÑконца',
+'file-info-png-repeat' => 'паўтараецца $1 {{PLURAL:$1|раз|разоў}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадр|кадраў}}',
# Special:NewFiles
'newimages' => 'ÐÐ¾Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹',
@@ -2793,24 +2820,24 @@ $1',
'limitall' => 'уÑе',
# E-mail address confirmation
-'confirmemail' => 'Пацвердзіць Ð°Ð´Ñ€Ð°Ñ Ñл.пошты',
-'confirmemail_noemail' => 'У [[Special:Preferences|вашых наÑтаўленнÑÑ…]] нÑма дапушчальнага адраÑу Ñл.пошты.',
-'confirmemail_text' => 'Ðа плÑцоўцы {{SITENAME}} патрабуецца праверка адраÑу Ñл.пошты перад тым, Ñк карыÑтацца магчымаÑцÑмі Ñл.пошты. ÐаціÑніце кнопку, што ніжÑй, каб адаÑлаць Ñабе пацвÑрджальны ліÑÑ‚. У ліÑце будзе ÑпаÑылка на ÑпецыÑльную пацвÑрджальную Ñтаронку, Ñкую Ñ‚Ñ€Ñба будзе адкрыць у браўзеры, каб пацвердзіць правільнаÑць Ñвайго адраÑу Ñл.пошты.',
-'confirmemail_pending' => 'Вам ужо быў адаÑланы пацвÑрджальны код; калі ваш рахунак Ñтвораны нÑдаўна, то магчыма, што Ñ‚Ñ€Ñба пачакаць Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ†Ð²Ñрджальнага коду колькі мінут, перад тым Ñк звÑртацца па наÑтупны.',
-'confirmemail_send' => 'ÐдаÑлаць код пацверджаннÑ',
-'confirmemail_sent' => 'ÐдаÑланы ліÑÑ‚ Ñл.пошты з пацверджаннем.',
-'confirmemail_oncreate' => 'ПацвÑрджальны код быў адаÑланы на ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты.
+'confirmemail' => 'Пацвердзіць Ð°Ð´Ñ€Ð°Ñ Ñл.пошты',
+'confirmemail_noemail' => 'У [[Special:Preferences|вашых наÑтаўленнÑÑ…]] нÑма дапушчальнага адраÑу Ñл.пошты.',
+'confirmemail_text' => 'Ðа плÑцоўцы {{SITENAME}} патрабуецца праверка адраÑу Ñл.пошты перад тым, Ñк карыÑтацца магчымаÑцÑмі Ñл.пошты. ÐаціÑніце кнопку, што ніжÑй, каб адаÑлаць Ñабе пацвÑрджальны ліÑÑ‚. У ліÑце будзе ÑпаÑылка на ÑпецыÑльную пацвÑрджальную Ñтаронку, Ñкую Ñ‚Ñ€Ñба будзе адкрыць у браўзеры, каб пацвердзіць правільнаÑць Ñвайго адраÑу Ñл.пошты.',
+'confirmemail_pending' => 'Вам ужо быў адаÑланы пацвÑрджальны код; калі ваш рахунак Ñтвораны нÑдаўна, то магчыма, што Ñ‚Ñ€Ñба пачакаць Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ†Ð²Ñрджальнага коду колькі мінут, перад тым Ñк звÑртацца па наÑтупны.',
+'confirmemail_send' => 'ÐдаÑлаць код пацверджаннÑ',
+'confirmemail_sent' => 'ÐдаÑланы ліÑÑ‚ Ñл.пошты з пацверджаннем.',
+'confirmemail_oncreate' => 'ПацвÑрджальны код быў адаÑланы на ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты.
ГÑÑ‚Ñ‹ код непатрÑбны, каб уваходзіць у ÑÑ–ÑÑ‚Ñму, але Ñго Ñ‚Ñ€Ñба будзе паказаць перад тым, Ñк дазволіць Ñабе ÑкіÑ-колечы магчымаÑці Ñл.пошты гÑтай Вікі.',
-'confirmemail_sendfailed' => 'Ðе ўдалоÑÑ Ð°Ð´Ð°Ñлаць пацвÑрджальны Ñл.ліÑÑ‚ з плÑцоўкі {{SITENAME}}. Праверце, ці Ñž адраÑе нÑма недапушчальных знакаў.
+'confirmemail_sendfailed' => 'Ðе ўдалоÑÑ Ð°Ð´Ð°Ñлаць пацвÑрджальны Ñл.ліÑÑ‚ з плÑцоўкі {{SITENAME}}. Праверце, ці Ñž адраÑе нÑма недапушчальных знакаў.
Вынік паштовага адÑыланнÑ: $1',
-'confirmemail_invalid' => 'ÐÑправільны код пацверджаннÑ. Магчыма, неактуальны код.',
-'confirmemail_needlogin' => 'Вам Ñ‚Ñ€Ñба зрабіць $1 каб пацвердзіць Ñвой Ð°Ð´Ñ€Ð°Ñ Ñл.пошты.',
-'confirmemail_success' => 'Ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты быў пацверджаны. Можаце [[Special:UserLogin|ўваходзіць у ÑÑ–ÑÑ‚Ñму]] Ñ– працаваць з вікі.',
-'confirmemail_loggedin' => 'Зараз ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты ÑтаўÑÑ Ð¿Ð°Ñ†Ð²ÐµÑ€Ð´Ð¶Ð°Ð½Ñ‹Ð¼.',
-'confirmemail_error' => 'ÐеакрÑÑÐ»ÐµÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° пры запіÑванні пацверджаннÑ.',
-'confirmemail_subject' => 'Пацверджанне адраÑу Ñл.пошты Ð´Ð»Ñ {{SITENAME}}',
-'confirmemail_body' => 'Ðехта (магчыма, што Ñ– вы — з адраÑу IP $1) завёў рахунак "$2" на плÑцоўцы {{SITENAME}}, паказваючы гÑÑ‚Ñ‹ Ð°Ð´Ñ€Ð°Ñ Ñл.пошты Ñк Ñвой.
+'confirmemail_invalid' => 'ÐÑправільны код пацверджаннÑ. Магчыма, неактуальны код.',
+'confirmemail_needlogin' => 'Вам Ñ‚Ñ€Ñба зрабіць $1 каб пацвердзіць Ñвой Ð°Ð´Ñ€Ð°Ñ Ñл.пошты.',
+'confirmemail_success' => 'Ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты быў пацверджаны. Можаце [[Special:UserLogin|ўваходзіць у ÑÑ–ÑÑ‚Ñму]] Ñ– працаваць з вікі.',
+'confirmemail_loggedin' => 'Зараз ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты ÑтаўÑÑ Ð¿Ð°Ñ†Ð²ÐµÑ€Ð´Ð¶Ð°Ð½Ñ‹Ð¼.',
+'confirmemail_error' => 'ÐеакрÑÑÐ»ÐµÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° пры запіÑванні пацверджаннÑ.',
+'confirmemail_subject' => 'Пацверджанне адраÑу Ñл.пошты Ð´Ð»Ñ {{SITENAME}}',
+'confirmemail_body' => 'Ðехта (магчыма, што Ñ– вы — з адраÑу IP $1) завёў рахунак "$2" на плÑцоўцы {{SITENAME}}, паказваючы гÑÑ‚Ñ‹ Ð°Ð´Ñ€Ð°Ñ Ñл.пошты Ñк Ñвой.
Ð”Ð·ÐµÐ»Ñ Ñ‚Ð°Ð³Ð¾, каб пацвердзіць, што рахунак Ñапраўды ваш, Ñ– каб актываваць магчымаÑці Ñл.пошты Ð´Ð»Ñ {{SITENAME}}, адкрыйце Ñž браўзеры гÑтую ÑпаÑылку:
@@ -2821,8 +2848,19 @@ $3
$5
ГÑÑ‚Ñ‹ пацвÑрджальны код згаÑне $4.',
-'confirmemail_invalidated' => 'Пацверджанне Ñл.пошты ÑкаÑаванае',
-'invalidateemail' => 'Ðдмовіцца ад Ð¿Ð°Ñ†Ð²ÐµÑ€Ð´Ð¶Ð°Ð½Ð½Ñ Ñл.пошты',
+'confirmemail_body_changed' => 'Ðехта з IP-адраÑу "$1" (магчыма, што Ð’Ñ‹) змÑніў Ð°Ð´Ñ€Ð°Ñ Ñл.пошты Ð´Ð»Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ "$2" на плÑцоўцы {{SITENAME}}.
+
+Каб пацвердзіць, што рахунак Ñапраўды належыць вам, Ñ– каб ізноў уключыць працу з Ñл.поштай Ð´Ð»Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ на плÑцоўцы {{SITENAME}}, адкрыйце гÑтую ÑпаÑылку Ñž браўзеры:
+
+$3
+
+Калі рахунак вам *не належыць*, адкрыйце ніжÑй паказаную ÑпаÑылку, каб адмовіцца ад Ð¿Ð°Ñ†Ð²ÐµÑ€Ð´Ð¶Ð°Ð½Ð½Ñ Ð°Ð´Ñ€Ð°Ñу Ñл.пошты:
+
+$5
+
+ГÑÑ‚Ñ‹ квіток на пацверджанне будзе дзейÑны не далей за $4.',
+'confirmemail_invalidated' => 'Пацверджанне Ñл.пошты ÑкаÑаванае',
+'invalidateemail' => 'Ðдмовіцца ад Ð¿Ð°Ñ†Ð²ÐµÑ€Ð´Ð¶Ð°Ð½Ð½Ñ Ñл.пошты',
# Scary transclusion
'scarytranscludedisabled' => '[УÑтаўлÑнне з іншых вікі не дазволена]',
@@ -2864,6 +2902,7 @@ $1',
'table_pager_first' => 'ÐŸÐµÑ€ÑˆÐ°Ñ Ñтаронка',
'table_pager_last' => 'ÐпошнÑÑ Ñтаронка',
'table_pager_limit' => 'Па $1 Ñкладнікаў на Ñтаронцы',
+'table_pager_limit_label' => 'ЗапіÑаў на Ñтаронку:',
'table_pager_limit_submit' => 'Пераход',
'table_pager_empty' => 'Без вынікаў',
@@ -2915,6 +2954,7 @@ $1',
'version-specialpages' => 'ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі',
'version-parserhooks' => 'Хукі парÑера',
'version-variables' => 'ЗменныÑ',
+'version-skins' => 'Вокладкі',
'version-other' => 'Рознае',
'version-mediahandlers' => 'Ðпрацоўнікі мультымедый',
'version-hooks' => 'Хукі',
@@ -2926,6 +2966,13 @@ $1',
'version-hook-subscribedby' => 'Сюды падпіÑаныÑ',
'version-version' => '(ВерÑÑ–Ñ $1)',
'version-license' => 'ЛіцÑнзіÑ',
+'version-poweredby-credits' => "ПлÑцоўка працуе на '''[http://www.mediawiki.org/ MediaWiki]''', капірайт © 2001-$1 $2.",
+'version-poweredby-others' => 'іншыÑ',
+'version-license-info' => "MediaWiki з'ÑўлÑецца Ñвабодным праграмным забеÑпÑчÑннем. Такім чынам, вы можаце паўторна раÑпаўÑюджваць прадукт Ñ–(або) змÑнÑць Ñго на ўмовах Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ GNU General Public License у тым выглÑдзе, у Ñкім Ñно публікуецца фондам Free Software Foundation; Ñілу мае верÑÑ–Ñ (выпуÑк) 2 гÑтага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ Ð°Ð±Ð¾, на ваш выбар, Ð½Ð°Ð²ÐµÐ¹ÑˆÐ°Ñ Ð²ÐµÑ€ÑÑ–Ñ (выпуÑк) пагадненнÑ.
+
+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 або [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html атрымайце Ñе з ІнтÑрнÑту].",
'version-software' => 'УÑÑ‚Ð°Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð´ÑƒÐºÑ‚Ñ‹',
'version-software-product' => 'Прадукт',
'version-software-version' => 'ВерÑÑ–Ñ',
@@ -2996,6 +3043,15 @@ $1',
'tags-edit' => 'правіць',
'tags-hitcount' => '$1 {{PLURAL:$1|мена|менаў}}',
+# Special:ComparePages
+'comparepages' => 'Параўнанне Ñтаронак',
+'compare-selector' => 'Параўнанне верÑій Ñтаронкі',
+'compare-page1' => 'Старонка 1',
+'compare-page2' => 'Старонка 2',
+'compare-rev1' => 'ВерÑÑ–Ñ 1',
+'compare-rev2' => 'ВерÑÑ–Ñ 2',
+'compare-submit' => 'Параўнаць',
+
# Database error messages
'dberr-header' => 'Праблема на плÑцоўцы',
'dberr-problems' => 'Прабачце, на плÑцоўцы здарыліÑÑ Ñ‚ÑÑ…Ð½Ñ–Ñ‡Ð½Ñ‹Ñ Ñ†ÑжкаÑці.',
@@ -3012,8 +3068,13 @@ $1',
'htmlform-float-invalid' => "Пададзенае значÑнне не з'ÑўлÑецца лікам.",
'htmlform-int-toolow' => 'Пададзенае значÑнне меншае за мінімум $1',
'htmlform-int-toohigh' => 'Пададзенае значÑнне большае за макÑімум $1',
+'htmlform-required' => 'ГÑтае значÑнне неабходнае',
'htmlform-submit' => 'Падаць',
'htmlform-reset' => 'Ðдкаціць змÑненні',
'htmlform-selectorother-other' => 'Рознае',
+# SQLite database support
+'sqlite-has-fts' => '$1 з падтрымкай поўна-Ñ‚ÑкÑтавага пошуку',
+'sqlite-no-fts' => '$1 без падтрымкі поўна-Ñ‚ÑкÑтавага пошуку',
+
);
diff --git a/languages/messages/MessagesBe_tarask.php b/languages/messages/MessagesBe_tarask.php
index 03d49474..2721332b 100644
--- a/languages/messages/MessagesBe_tarask.php
+++ b/languages/messages/MessagesBe_tarask.php
@@ -236,7 +236,10 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Выдалены_ўнёÑак' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array(
+ ',' => "\xc2\xa0", # nbsp
+ '.' => ','
+);
$linkTrail = '/^([абвгґджзеёжзійклмнопрÑтуўфхцчшыьÑÑŽÑćÄłńśšŭźža-z]+)(.*)$/sDu';
@@ -262,8 +265,7 @@ $messages = array(
'tog-editsection' => 'Дазволіць Ñ€Ñдагаваньне аÑобных ÑÑкцыÑÑž па ÑпаÑылках [Ñ€Ñдагаваць]',
'tog-editsectiononrightclick' => 'РÑдагаваць ÑÑкцыі па правым шчоўканьні мышкай на загалоўку (JavaScript)',
'tog-showtoc' => 'Паказваць зьмеÑÑ‚ (Ð´Ð»Ñ Ñтаронак з колькаÑьцю ÑÑкцый болей за 3)',
-'tog-rememberpassword' => 'Запомніць мÑне на гÑтым кампутары',
-'tog-editwidth' => 'Пашыраць поле Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñž поўную шырыню Ñкрана',
+'tog-rememberpassword' => 'Запомніць мÑне Ñž гÑтым браўзÑры (Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ за $1 {{PLURAL:$1|дзень|дні|дзён}})',
'tog-watchcreations' => 'Дадаваць у мой ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ñтаронкі, ÑÐºÑ–Ñ Ñ Ð±ÑƒÐ´Ñƒ Ñтвараць',
'tog-watchdefault' => 'Дадаваць у мой ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ñтаронкі, ÑÐºÑ–Ñ Ñ Ð±ÑƒÐ´Ñƒ Ñ€Ñдагаваць',
'tog-watchmoves' => 'Дадаваць у мой ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ñтаронкі, ÑÐºÑ–Ñ Ñ Ð±ÑƒÐ´Ñƒ пераноÑіць',
@@ -408,31 +410,21 @@ $messages = array(
'faqpage' => 'Project:ЧаÑÑ‚Ñ‹Ñ Ð¿Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ–',
# Vector skin
-'vector-action-addsection' => 'Дадаць Ñ‚Ñму',
-'vector-action-delete' => 'Выдаліць',
-'vector-action-move' => 'ПеранеÑьці',
-'vector-action-protect' => 'Ðбараніць',
-'vector-action-undelete' => 'Ðднавіць',
-'vector-action-unprotect' => 'ЗьнÑць абарону',
-'vector-namespace-category' => 'КатÑгорыÑ',
-'vector-namespace-help' => 'Старонка дапамогі',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Старонка',
-'vector-namespace-media' => 'Старонка мÑдыÑ',
-'vector-namespace-mediawiki' => 'Паведамленьне',
-'vector-namespace-project' => 'Старонка праекту',
-'vector-namespace-special' => 'СпÑцыÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка',
-'vector-namespace-talk' => 'Ðбмеркаваньне',
-'vector-namespace-template' => 'Шаблён',
-'vector-namespace-user' => 'Старонка ўдзельніка',
-'vector-view-create' => 'Стварыць',
-'vector-view-edit' => 'РÑдагаваць',
-'vector-view-history' => 'Паказаць гіÑторыю',
-'vector-view-view' => 'Чытаць',
-'vector-view-viewsource' => 'Паказаць крыніцу',
-'actions' => 'ДзеÑньні',
-'namespaces' => 'ПраÑторы назваў',
-'variants' => 'ВарыÑнты',
+'vector-action-addsection' => 'Дадаць Ñ‚Ñму',
+'vector-action-delete' => 'Выдаліць',
+'vector-action-move' => 'ПеранеÑьці',
+'vector-action-protect' => 'Ðбараніць',
+'vector-action-undelete' => 'Ðднавіць',
+'vector-action-unprotect' => 'ЗьнÑць абарону',
+'vector-simplesearch-preference' => 'Уключыць Ð¿Ð°Ð»ÐµÐ¿ÑˆÐ°Ð½Ñ‹Ñ Ð¿Ð¾ÑˆÑƒÐºÐ°Ð²Ñ‹Ñ Ð¿Ð°Ð´ÐºÐ°Ð·ÐºÑ– (толькі Ð´Ð»Ñ Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Â«Ð’Ñктар»)',
+'vector-view-create' => 'Стварыць',
+'vector-view-edit' => 'РÑдагаваць',
+'vector-view-history' => 'Паказаць гіÑторыю',
+'vector-view-view' => 'Чытаць',
+'vector-view-viewsource' => 'Паказаць крыніцу',
+'actions' => 'ДзеÑньні',
+'namespaces' => 'ПраÑторы назваў',
+'variants' => 'ВарыÑнты',
'errorpagetitle' => 'Памылка',
'returnto' => 'Ð’Ñрнуцца да Ñтаронкі $1.',
@@ -493,6 +485,9 @@ $messages = array(
Калі лаÑка, пачакайце Ñ– паÑпрабуйце зайÑьці пазьней.
$1',
+'pool-timeout' => 'СкончыўÑÑ Ñ‡Ð°Ñ Ñ‡Ð°ÐºÐ°Ð½ÑŒÐ½Ñ Ð±Ð»ÑкаваньнÑ',
+'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' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
@@ -657,7 +652,8 @@ $2',
'yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'yourpassword' => 'Пароль:',
'yourpasswordagain' => 'Паўтарыце пароль:',
-'remembermypassword' => 'Запомніць мÑне на гÑтым кампутары',
+'remembermypassword' => 'Запомніць мÑне на гÑтым кампутары (Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ за $1 {{PLURAL:$1|дзень|дні|дзён}})',
+'securelogin-stick-https' => 'Утрымліваць злучÑньне праз HTTPS паÑÑŒÐ»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ Ñž ÑÑ‹ÑÑ‚Ñму',
'yourdomainname' => 'Ваш дамÑн:',
'externaldberror' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° аўтÑнтыфікацыі з дапамогай вонкавай базы зьвеÑтак, ці Вам не дазволена абнаўлÑць Ñвой рахунак.',
'login' => 'УвайÑьці',
@@ -674,6 +670,7 @@ $2',
'gotaccount' => "Ужо маеце рахунак? '''$1'''.",
'gotaccountlink' => 'Увайдзіце',
'createaccountmail' => 'па Ñлектроннай пошце',
+'createaccountreason' => 'Прычына:',
'badretype' => 'Ð£Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– паролі не Ñупадаюць.',
'userexists' => 'Выбранае Вамі Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° ўжо выкарыÑтоўваецца кімÑьці іншым. Выберыце іншае імÑ.',
'loginerror' => 'Памылка ўваходу',
@@ -698,6 +695,7 @@ $2',
'wrongpasswordempty' => 'Быў уведзены пуÑÑ‚Ñ‹ пароль. Калі лаÑка, паÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·.',
'passwordtooshort' => 'Паролі павінны ўтрымліваць Ð½Ñ Ð¼ÐµÐ½Ñˆ за $1 {{PLURAL:$1|Ñымбаль|Ñымбалі|ÑымбалÑÑž}}.',
'password-name-match' => 'Ваш пароль павінен адрозьнівацца ад Вашага Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°.',
+'password-login-forbidden' => 'ВыкарыÑтаньне гÑтага Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° Ñ– Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±Ñ‹Ð»Ð¾ забароненае.',
'mailmypassword' => 'ДаÑлаць новы пароль па Ñлектроннай пошце',
'passwordremindertitle' => 'Ðовы чаÑовы пароль Ð´Ð»Ñ {{GRAMMAR:родны|{{SITENAME}}}}',
'passwordremindertext' => 'Ðехта (магчыма Ð’Ñ‹, з IP-адраÑу $1) запытаў Ð½Ð°Ñ Ð´Ð°Ñлаць новы пароль Ð´Ð»Ñ {{GRAMMAR:родны|{{SITENAME}}}} ($4). Ð”Ð»Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° «$2» быў Ñтвораны чаÑовы пароль Ñ– ён цÑпер «$3». Калі гÑта была Ð’Ð°ÑˆÐ°Ñ Ñ–Ð½Ñ–Ñ†Ñ‹Ñтыва, Вам Ñ‚Ñ€Ñба ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму Ñ– адразу зьмÑніць пароль. ТÑрмін дзеÑÐ½ÑŒÐ½Ñ Ð’Ð°ÑˆÐ°Ð³Ð° чаÑовага паролю — $5 {{PLURAL:$5|дзень|дні|дзён}}.
@@ -734,6 +732,9 @@ $2',
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запыт на выхад з ÑÑ‹ÑÑ‚Ñмы быў адхілены, таму што выглÑдае, што ён быў даÑланы пашкоджаным браўзÑрам альбо кÑшаваным прокÑÑ–-ÑÑрвÑрам.',
+# E-mail sending
+'php-mail-error-unknown' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž функцыі PHP mail()',
+
# Password reset dialog
'resetpass' => 'ЗьмÑніць пароль',
'resetpass_announce' => 'Ð’Ñ‹ ўвайшлі з дапамогай чаÑовага паролю, даÑланага праз Ñлектронную пошту.
@@ -784,12 +785,13 @@ $2',
'showpreview' => 'ПраглÑдзець',
'showlivepreview' => 'Хуткі папÑÑ€Ñдні праглÑд',
'showdiff' => 'Паказаць зьмены',
-'anoneditwarning' => "'''ПапÑÑ€Ñджаньне:''' Ð’Ñ‹ не ўвайшлі. Ваш IP-Ð°Ð´Ñ€Ð°Ñ Ð±ÑƒÐ´Ð·Ðµ запіÑаны Ñž гіÑторыі гÑтай Ñтаронкі.",
+'anoneditwarning' => "'''ПапÑÑ€Ñджаньне:''' Ð’Ñ‹ не ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму. Ваш IP-Ð°Ð´Ñ€Ð°Ñ Ð±ÑƒÐ´Ð·Ðµ запіÑаны Ñž гіÑторыі гÑтай Ñтаронкі.",
+'anonpreviewwarning' => "''Ð’Ñ‹ не ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму. ÐŸÐ°Ð´Ñ‡Ð°Ñ Ð·Ð°Ñ…Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð’Ð°Ñˆ IP-Ð°Ð´Ñ€Ð°Ñ Ð±ÑƒÐ´Ð·Ðµ дададзены Ñž гіÑторыю Ñ€ÑдагаваньнÑÑž Ñтаронкі.''",
'missingsummary' => "'''Ðапамін:''' Ð’Ñ‹ не пазначылі кароткае апіÑаньне зьменаў.
Калі Ð’Ñ‹ націÑьніце кнопку «ЗапіÑаць» ÑÑˆÑ‡Ñ Ñ€Ð°Ð·, Вашае Ñ€Ñдагаваньне будзе запіÑанае без апіÑаньнÑ.",
'missingcommenttext' => 'Калі лаÑка, увÑдзіце камÑнтар ніжÑй.',
-'missingcommentheader' => "'''Ðапамін:''' Ð’Ñ‹ не пазначылі Ñ‚Ñмы гÑтага камÑнтара.
-Калі Ð’Ñ‹ націÑьніце кнопку «Захаваць» ÑÑˆÑ‡Ñ Ñ€Ð°Ð·, Ваш камÑнтар захаваецца бÑз Ñ‚Ñмы.",
+'missingcommentheader' => "'''Ðапамін:''' Ð’Ñ‹ не пазначылі загаловак камÑнтара.
+Калі Ð’Ñ‹ націÑьніце кнопку «{{int:savearticle}}» ÑÑˆÑ‡Ñ Ñ€Ð°Ð·, Ваш камÑнтар захаваецца бÑз Ñ‚Ñмы.",
'summary-preview' => 'ПапÑÑ€Ñдні праглÑд апіÑаньнÑ:',
'subject-preview' => 'ПапÑÑ€Ñдні праглÑд загалоўку:',
'blockedtitle' => 'Удзельнік заблÑкаваны',
@@ -855,8 +857,12 @@ $2',
'userjsyoucanpreview' => "'''Падказка:''' выкарыÑтоўвайце кнопку «{{int:showpreview}}», каб паÑпрабаваць новы код JavaScript перад тым Ñк Ñго запіÑаць.",
'usercsspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні праглÑд Вашага CSS. Ðн ÑÑˆÑ‡Ñ Ð½Ðµ запіÑаны!'''",
'userjspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні праглÑд Вашага JavaScript, ён ÑÑˆÑ‡Ñ Ð½Ðµ запіÑаны!'''",
-'userinvalidcssjstitle' => "'''Увага:''' нÑма Ñ‚Ñмы Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Â«$1».
-ПамÑтайце, што ўлаÑÐ½Ñ‹Ñ Ñтаронкі .css Ñ– .js павінны мець назву, ÑÐºÐ°Ñ Ñкладаецца з малых літараў, напрыклад, {{ns:user}}:ХтоÑьці/monobook.css, а не {{ns:user}}:ХтоÑьці/Monobook.css.",
+'sitecsspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні праглÑд гÑтага CSS.'''
+'''Ðн ÑÑˆÑ‡Ñ Ð½Ðµ захаваны!'''",
+'sitejspreview' => "'''ПамÑтайце, што гÑта толькі папÑÑ€Ñдні праглÑд гÑтага коду JavaScript.'''
+'''Ðн ÑÑˆÑ‡Ñ Ð½Ðµ захаваны!'''",
+'userinvalidcssjstitle' => "'''ПапÑÑ€Ñджаньне:''' нÑма Ñ‚Ñмы Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Â«$1».
+ПамÑтайце, што ўлаÑÐ½Ñ‹Ñ Ñтаронкі .css Ñ– .js павінны мець назву, ÑÐºÐ°Ñ Ñкладаецца з малых літараў, напрыклад, {{ns:user}}:ХтоÑьці/vector.css, а не {{ns:user}}:ХтоÑьці/Vector.css.",
'updated' => '(Ðбноўлена)',
'note' => "'''Заўвага: '''",
'previewnote' => "'''ГÑта толькі папÑÑ€Ñдні праглÑд Ñ– зьмены ÑÑˆÑ‡Ñ Ð½Ðµ былі захаваныÑ!'''",
@@ -895,8 +901,6 @@ $2',
РазьмÑшчÑньнем тут Ñ‚ÑкÑтаў, Ð’Ñ‹ дÑклÑруеце, што Ð’Ñ‹ зьÑўлÑецеÑÑ Ñ–Ñ… аўтарам, ці Ð’Ñ‹ ÑкапіÑвалі Ñ–Ñ… з крыніцы, ÑÐºÐ°Ñ Ð´Ð°Ð·Ð²Ð°Ð»Ñе вольнае выкарыÑтаньне Ñваіх Ñ‚ÑкÑтаў (Ð´Ð·ÐµÐ»Ñ Ð¿Ð°Ð´Ñ€Ð°Ð±ÑзнаÑьцÑÑž глÑдзіце $1).
'''КÐЛІ ЛÐСКÐ, ÐЕ ЗЬМЯШЧÐЙЦЕ ТУТ БЕЗ ДÐЗВОЛУ ÐœÐТЭРЫЯЛЫ, ЯКІЯ ÐХОЎВÐЮЦЦРÐЎТÐРСКІМ ПРÐÐ’ÐÐœ!'''",
-'longpagewarning' => "'''ПÐПЯРЭДЖÐÐЬÐЕ: ГÑÑ‚Ð°Ñ Ñтаронка ўтрымлівае $1 {{PLURAL:$1|кілÑбайт|кілÑбайты|кілÑбайтаў}}; Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð±Ñ€Ð°ÑžÐ·Ñры могуць мець праблемы пры адлюÑтраваньні Ñтаронак аб'ёмам болей за 32 кб.
-Калі гÑта магчыма, паÑпрабуйце падзÑліць зьмеÑÑ‚ Ñтаронкі на больш Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ñ Ñ‡Ð°Ñткі.'''",
'longpageerror' => "'''ПÐМЫЛКÐ: Ðб'ём Ñ‚ÑкÑту, Ñкі Ð’Ñ‹ Ñпрабуеце запіÑаць Ñкладае $1 {{PLURAL:$1|кілÑбайт|кілÑбайты|кілÑбайтаў}}. Ðб'ём Ñтаронкі Ð½Ñ Ð¼Ð¾Ð¶Ð° перавышаць $2 {{PLURAL:$2|кілÑбайт|кілÑбайты|кілÑбайтаў}}. Старонка Ð½Ñ Ð¼Ð¾Ð¶Ð° быць захаванаÑ.'''",
'readonlywarning' => "'''ПÐПЯРЭДЖÐÐЬÐЕ: База зьвеÑтак была заблÑÐºÐ°Ð²Ð°Ð½Ð°Ñ Ð´Ð»Ñ Ñ‚Ñхнічнага абÑлугоўваньнÑ, таму немагчыма зараз захаваць Ð’Ð°ÑˆÑ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹.
Ð’Ñ‹ можаце ÑкапіÑваць Ñ‚ÑкÑÑ‚ у файл на Вашым кампутары, а пазьней захаваць Ñюды.'''
@@ -1072,6 +1076,8 @@ $1",
'logdelete-failure' => "'''Ðемагчыма ÑžÑтанавіць бачнаÑьць у журнале:'''
$1",
'revdel-restore' => 'ЗьмÑніць бачнаÑьць',
+'revdel-restore-deleted' => 'Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
+'revdel-restore-visible' => 'Ð±Ð°Ñ‡Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
'pagehist' => 'ГіÑÑ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі',
'deletedhist' => 'Ð’Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ Ð³Ñ–ÑторыÑ',
'revdelete-content' => 'зьмеÑÑ‚',
@@ -1141,11 +1147,13 @@ $1",
# Diffs
'history-title' => 'ГіÑÑ‚Ð¾Ñ€Ñ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ð°Ñž Ñтаронкі «$1»',
'difference' => '(Ðдрозьненьні паміж вÑÑ€ÑÑ–Ñмі)',
+'difference-multipage' => '(Розьніца паміж Ñтаронкамі)',
'lineno' => 'Радок $1:',
'compareselectedversions' => 'Параўнаць Ð²Ñ‹Ð±Ñ€Ð°Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
'showhideselectedversions' => 'Паказаць/Ñхаваць Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
'editundo' => 'ÑкаÑаваць',
-'diff-multi' => '($1 {{PLURAL:$1|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ Ð½Ðµ паказанаÑ|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ– не паказаныÑ|прамежных вÑÑ€ÑÑ–ÑÑž не паказаныÑ}})',
+'diff-multi' => '($1 {{PLURAL:$1|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–|прамежных вÑÑ€ÑÑ–ÑÑž}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказанаÑ|не паказаныÑ|не паказаныÑ}})',
+'diff-multi-manyusers' => '($1 {{PLURAL:$1|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–|прамежных вÑÑ€ÑÑ–ÑÑž}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказанаÑ|не паказаныÑ|не паказаныÑ}})',
# Search results
'searchresults' => 'Вынікі пошуку',
@@ -1180,6 +1188,7 @@ $1",
'searchprofile-everything-tooltip' => 'Шукаць уÑюды (уключна Ñа Ñтаронкамі абмеркаваньнÑ)',
'searchprofile-advanced-tooltip' => 'Шукаць у дадатковых праÑторах назваў',
'search-result-size' => '$1 ($2 {{PLURAL:$2|Ñлова|Ñловы|Ñловаў}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|ÑлемÑнт|ÑлемÑнты|ÑлемÑнтаў}} ($2 {{PLURAL:$2|падкатÑгорыÑ|падкатÑгорыі|падкатÑгорыÑÑž}}, $3 {{PLURAL:|файл|файлы|файлаў}})',
'search-result-score' => 'ÐдпаведнаÑьць: $1%',
'search-redirect' => '(перанакіраваньне $1)',
'search-section' => '(ÑÑÐºÑ†Ñ‹Ñ $1)',
@@ -1255,6 +1264,7 @@ $1",
'contextlines' => 'КолькаÑьць радкоў Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ:',
'contextchars' => 'КолькаÑьць ÑымбалÑÑž на радок:',
'stub-threshold' => 'МакÑымальны памер Ñтаронкі Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ ÑпаÑылак <a href="#" class="stub">Ñк на накід</a> (у байтах):',
+'stub-threshold-disabled' => 'Выключаны',
'recentchangesdays' => 'КолькаÑьць дзён Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñž апошніх зьменах:',
'recentchangesdays-max' => '(макÑымальна $1 {{PLURAL:$1|дзень|дні|дзён}})',
'recentchangescount' => 'КолькаÑьць Ñ€ÑдагаваньнÑÑž Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ па змоўчваньні:',
@@ -1288,6 +1298,7 @@ $1",
'prefs-files' => 'Файлы',
'prefs-custom-css' => 'Індывідуальны CSS',
'prefs-custom-js' => 'Індывідуальны JS',
+'prefs-common-css-js' => 'Ðгульны CSS/JS Ð´Ð»Ñ ÑžÑÑ–Ñ… афармленьнÑÑž:',
'prefs-reset-intro' => 'Ð’Ñ‹ можаце выкарыÑтоўваць гÑтую Ñтаронку Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ Вашых наладаў на налады Ñайта па змоўчваньні.
ГÑтае дзеÑньне не можа быць адмененае.',
'prefs-emailconfirm-label' => 'Пацьверджаньне адраÑу Ñлектроннай пошты:',
@@ -1324,9 +1335,15 @@ $1",
'prefs-advancedrendering' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
'prefs-advancedsearchoptions' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
'prefs-advancedwatchlist' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
-'prefs-display' => 'УÑтаноўкі паказу',
+'prefs-displayrc' => 'Ðалады паказу',
+'prefs-displaysearchoptions' => 'Ðалады паказу',
+'prefs-displaywatchlist' => 'Ðалады паказу',
'prefs-diffs' => 'Розьніцы вÑÑ€ÑÑ–ÑÑž',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ВыглÑдзіць Ñлушна',
+'email-address-validity-invalid' => 'Ðеабходны Ñлушны адраÑ!',
+
# User rights
'userrights' => 'Кіраваньне правамі ўдзельнікаў і ўдзельніц',
'userrights-lookup-user' => 'Кіраваньне групамі ўдзельнікаў і ўдзельніц',
@@ -1337,10 +1354,10 @@ $1",
'saveusergroups' => 'Захаваць групы ўдзельнікаў і ўдзельніц',
'userrights-groupsmember' => 'Уваходзіць у:',
'userrights-groupsmember-auto' => 'ÐÑÑўны чалец:',
-'userrights-groups-help' => 'Тут можна мÑнÑць групы да Ñкіх належыць гÑÑ‚Ñ‹ ўдзельнік:
-* Вызначанае поле азначае прыналежнаÑьць удзельніка да гÑтай групы.
-* ÐÑ Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ðµ поле азначае, што ўдзельнік не належыць гÑтай групе.
-* Знак * азначае што Ð’Ñ‹ Ð½Ñ Ð·Ð¼Ð¾Ð¶Ð°Ñ†Ðµ выдаліць удзельніка з групы, калі дададзіце Ñго да Ñе Ñ– наадварот.',
+'userrights-groups-help' => 'Тут можна зьмÑнÑць групы, да Ñкіх належыць гÑÑ‚Ñ‹ ўдзельнік:
+* Ðдзначанае поле побач з назвай групы пазначае прыналежнаÑьць удзельніка да групы.
+* ПуÑтое поле азначае, што ўдзельнік не належыць да групы.
+* Знак * азначае, што Ð’Ñ‹ Ð½Ñ Ð·Ð¼Ð¾Ð¶Ð°Ñ†Ðµ выдаліць удзельніка з групы, калі дададзіце Ñго да Ñе, Ñ– наадварот.',
'userrights-reason' => 'Прычына:',
'userrights-no-interwiki' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу зьмÑнÑць правы ўдзельнікаў іншых вікаў.',
'userrights-nodatabase' => 'Базы зьвеÑтак $1 не Ñ–Ñнуе альбо Ñна не зьÑўлÑецца лÑкальнай.',
@@ -1410,6 +1427,7 @@ $1",
'right-hideuser' => 'блÑкаваньне рахунку ўдзельніка Ñ– Ñго хаваньне',
'right-ipblock-exempt' => 'абход блÑкаваньнÑÑž IP-адраÑоў, аўта-блÑкаваньнÑÑž Ñ– блÑкаваньнÑÑž дыÑпазонаў',
'right-proxyunbannable' => 'абход аўтаматычных блÑкаваньнÑÑž прокÑÑ–',
+'right-unblockself' => 'разблÑкаваньне Ñамога ÑÑбе',
'right-protect' => 'зьмена ўзроўню абароны Ñтаронак Ñ– Ñ€Ñдагаваньне абароненых Ñтаронак',
'right-editprotected' => 'Ñ€Ñдагаваньне абароненых Ñтаронак (без каÑкаднай абароны)',
'right-editinterface' => 'Ñ€Ñдагаваньне інтÑрфÑйÑа карыÑтальніка',
@@ -1432,7 +1450,6 @@ $1",
'right-siteadmin' => 'блÑкаваньне Ñ– разблÑкаваньне базы зьвеÑтак',
'right-reset-passwords' => 'ачыÑтка паролÑÑž іншых удзельнікаў',
'right-override-export-depth' => 'ÑкÑпартаваньне Ñтаронак, уключаючы зьвÑÐ·Ð°Ð½Ñ‹Ñ Ñтаронкі з глыбінёй да 5',
-'right-versiondetail' => 'Паказваць пашыраную інфармацыю пра вÑÑ€ÑÑ–ÑŽ праграмнага забеÑьпÑчÑньнÑ',
'right-sendemail' => 'адпраўка Ñлектронных ліÑтоў іншым удзельнікам',
# User rights log
@@ -1483,14 +1500,9 @@ $1",
'recentchanges-legend' => 'Ðалады апошніх зьменаў',
'recentchangestext' => 'Сачыце за апошнімі зьменамі Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} на гÑтай Ñтаронцы.',
'recentchanges-feed-description' => 'Сачыць за апошнімі зьменамі Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} праз гÑтую Ñтужку.',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 — Ð½Ð¾Ð²Ð°Ñ Ñтаронка',
'recentchanges-label-newpage' => 'ГÑтым Ñ€Ñдагаваньнем была ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ Ð½Ð¾Ð²Ð°Ñ Ñтаронка',
-'recentchanges-legend-minor' => '$1 — дробнае Ñ€Ñдагаваньне',
'recentchanges-label-minor' => 'ГÑтае Ñ€Ñдагаваньне — дробнае',
-'recentchanges-legend-bot' => '$1 — Ñ€Ñдагаваньне робата',
'recentchanges-label-bot' => 'ГÑтае Ñ€Ñдагаваньне зробленае робатам',
-'recentchanges-legend-unpatrolled' => '$1 — не патрулÑванае Ñ€Ñдагаваньне',
'recentchanges-label-unpatrolled' => 'ГÑтае Ñ€Ñдагаваньне ÑÑˆÑ‡Ñ Ð½Ðµ было адпатрулÑваным',
'rcnote' => "ÐіжÑй {{PLURAL:$1|пададзена '''$1''' апошнÑÑ Ð·ÑŒÐ¼ÐµÐ½Ð°|Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ '''$1''' Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹|Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ '''$1''' апошніх зьменаў}} за {{PLURAL:$2|апошні '''$2''' дзень|Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ '''$2''' дні|Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ '''$2''' дзён}}, па Ñтане на $5, $4.",
'rcnotefrom' => "ÐіжÑй знаходзÑцца зьмены з '''$2''' (да '''$1''' на Ñтаронку).",
@@ -1537,6 +1549,9 @@ $1",
'upload_directory_missing' => 'Ð—Ð°Ð³Ñ€ÑƒÐ·Ð°Ñ‡Ð½Ð°Ñ Ð´Ñ‹Ñ€ÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ ($1) адÑутнічае Ñ– Ð½Ñ Ð¼Ð¾Ð¶Ð° быць ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ ÑÑрвÑрам.',
'upload_directory_read_only' => 'СÑрвÑÑ€ Ð½Ñ Ð¼Ð°Ðµ правоў на Ð·Ð°Ð¿Ñ–Ñ Ñƒ дырÑкторыю загружаных файлаў ($1).',
'uploaderror' => 'Памылка загрузкі',
+'upload-recreate-warning' => "'''Увага: файл з такой назвай быў выдалены альбо перанеÑены.'''
+
+Журнал выдаленьнÑÑž Ñ– пераноÑаў гÑтай Ñтаронкі Ð´Ð»Ñ Ð·Ñ€ÑƒÑ‡Ð½Ð°Ñьці пададзены тут:",
'uploadtext' => "Ужывайце форму ніжÑй Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÑ– файлаў.
Каб паглÑдзець ці адшукаць раней Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹, глÑдзіце [[Special:FileList|ÑÑŒÐ¿Ñ–Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ñ‹Ñ… файлаў]], загрузкі такÑама запіÑваюцца Ñž [[Special:Log/upload|журнал загрузак]], а выдаленьні — у [[Special:Log/delete|журнал выдаленьнÑÑž]].
@@ -1569,6 +1584,17 @@ $1",
{{PLURAL:$3|Пажаданым тыпам файла зьÑўлÑецца|Пажаданымі тыпамі файлаў зьÑўлÑюцца}} $2.",
'filetype-banned-type' => "'''«.$1»''' — забаронены тып файлаў. {{PLURAL:$3|Дазволеным тыпам файла зьÑўлÑецца|Дазволенымі тыпамі файлаў зьÑўлÑюцца}} $2.",
'filetype-missing' => 'Файл Ð½Ñ Ð¼Ð°Ðµ пашырÑÐ½ÑŒÐ½Ñ (напрыклад, «.jpg»).',
+'empty-file' => 'ДаÑланы Вамі файл пуÑÑ‚Ñ‹.',
+'file-too-large' => 'ДаÑланы Вамі файл занадта вÑлікі.',
+'filename-tooshort' => 'Ðазва файла занадта кароткаÑ.',
+'filetype-banned' => 'ГÑÑ‚Ñ‹ тып файла забаронены.',
+'verification-error' => 'ГÑÑ‚Ñ‹ файл не прайшоў вÑрыфікацыю.',
+'hookaborted' => 'ÐŸÑ€Ð°Ð¿Ð°Ð½Ð°Ð²Ð°Ð½Ð°Ñ Ð’Ð°Ð¼Ñ– зьмена была Ð°Ð´Ñ…Ñ–Ð»ÐµÐ½Ð°Ñ Ð°Ð¿Ñ€Ð°Ñ†Ð¾ÑžÑˆÑ‡Ñ‹ÐºÐ°Ð¼ пашырÑньнÑ.',
+'illegal-filename' => 'ÐÐµÐ´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° файла.',
+'overwrite' => 'Замена Ñ–Ñнуючага файла забароненаÑ.',
+'unknown-error' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°.',
+'tmp-create-error' => 'Ðемагчыма Ñтварыць чаÑовы файл.',
+'tmp-write-error' => 'Памылка запіÑу чаÑовага файла.',
'large-file' => 'РÑкамÑндаваны памер файлаў — Ð½Ñ Ð±Ð¾Ð»ÐµÐ¹ $1;
памер гÑтага файла — $2.',
'largefileserver' => 'Памер гÑтага файла перавышае макÑымальна дазволены.',
@@ -1597,13 +1623,14 @@ $1",
Калі Ð’Ñ‹ жадаеце загрузіць Ваш файл, вÑрніцеÑÑ Ð½Ð°Ð·Ð°Ð´ Ñ– загрузіце гÑÑ‚Ñ‹ файл з новай назвай. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'ГÑÑ‚Ñ‹ файл дублюе {{PLURAL:$1|наÑтупны файл|наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹}}:',
'file-deleted-duplicate' => 'Падобны файл ([[:$1]]) ужо выдалÑÑžÑÑ. Калі лаÑка, паглÑдзіце гіÑторыю выдаленьнÑÑž гÑтага файла перад Ñго паўторнай загрузкай.',
-'successfulupload' => 'Загрузка паÑьпÑхова ÑкончылаÑÑ',
'uploadwarning' => 'ПапÑÑ€Ñджаньне',
'uploadwarning-text' => 'Калі лаÑка, зьмÑніце апіÑаньне файла ніжÑй Ñ– паÑпрабуйце ізноў.',
'savefile' => 'Захаваць файл',
'uploadedimage' => 'Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ð°Ñ Â«[[$1]]»',
'overwroteimage' => 'Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ð°Ñ Ð½Ð¾Ð²Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ Â«[[$1]]»',
'uploaddisabled' => 'Загрузка файлаў забароненаÑ',
+'copyuploaddisabled' => 'Загрузка праз URL-Ð°Ð´Ñ€Ð°Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ.',
+'uploadfromurl-queued' => 'Ваша загрузка Ð´Ð°Ð»ÑƒÑ‡Ð°Ð½Ð°Ñ Ð´Ð° чаргі.',
'uploaddisabledtext' => 'Загрузка файлаў забароненаÑ.',
'php-uploaddisabledtext' => 'Загрузка файлаў была Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ñž парамÑтрах канфігурацыі PHP. Калі лаÑка, праверце значÑньне парамÑтра «file_uploads».',
'uploadscripted' => 'ГÑÑ‚Ñ‹ файл утрымлівае HTML-код альбо Ñкрыпт, Ñкі можа памылкова апрацоўвацца браўзÑрам.',
@@ -1623,6 +1650,14 @@ $1",
УпÑўніцеÑÑ Ñž неабходнаÑьці загрузкі гÑтага файла.
Журнал выдаленьнÑÑž Ð´Ð»Ñ Ð³Ñтага файла знаходзіцца ніжÑй:",
'filename-bad-prefix' => "Ðазва файла, Ñкі Ð’Ñ‹ загружаеце, пачынаецца з '''«$1»'''. ÐŸÐ°Ð´Ð¾Ð±Ð½Ñ‹Ñ Ð±ÐµÑÑÑнÑÐ¾ÑžÐ½Ñ‹Ñ Ð½Ð°Ð·Ð²Ñ‹ звычайна Ñтвараюцца аўтаматычна лічбавымі фотаапаратамі. Калі лаÑка, абÑрыце больш зразумелую назву Ð´Ð»Ñ Ð’Ð°ÑˆÐ°Ð³Ð° файла.",
+'upload-success-subj' => 'Загрузка паÑьпÑхова ÑкончылаÑÑ',
+'upload-success-msg' => 'Ð’Ð°ÑˆÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° з [$2] была паÑьпÑховаÑ. Яна даÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ñ‚ÑƒÑ‚: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Праблема загрузкі',
+'upload-failure-msg' => 'Узьнікла праблема пад Ñ‡Ð°Ñ Ð’Ð°ÑˆÐ°Ð¹ загрузкі з [$2]:
+
+$1',
+'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>.',
@@ -1689,6 +1724,7 @@ $1",
'listfiles_search_for' => 'Пошук па назьве файла:',
'imgfile' => 'файл',
'listfiles' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ñ„Ð°Ð¹Ð»Ð°Ñž',
+'listfiles_thumb' => 'МініÑтура',
'listfiles_date' => 'Дата',
'listfiles_name' => 'Ðазва',
'listfiles_user' => 'Удзельнік',
@@ -1803,8 +1839,8 @@ $1",
'statistics-edits' => 'ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñьць Ñ€ÑдагаваньнÑÑž',
'statistics-edits-average' => 'СÑÑ€ÑднÑÑ ÐºÐ¾Ð»ÑŒÐºÐ°Ñьць Ñ€ÑдагаваньнÑÑž на Ñтаронку',
'statistics-views-total' => 'ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñьць праглÑдаў',
+'statistics-views-total-desc' => 'ПраглÑды неіÑнуючых Ñтаронак Ñ– ÑпÑцыÑльных Ñтаронак не ўлічаныÑ',
'statistics-views-peredit' => 'КолькаÑьць праглÑдаў на Ñ€Ñдагаваньне',
-'statistics-jobqueue' => 'Ð”Ð°ÑžÐ¶Ñ‹Ð½Ñ [http://www.mediawiki.org/wiki/Manual:Job_queue чаргі заданьнÑÑž]',
'statistics-users' => '[[Special:ListUsers|ЗарÑгіÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÑ–]]',
'statistics-users-active' => 'ÐÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÑ–',
'statistics-users-active-desc' => 'Удзельнікі, ÑÐºÑ–Ñ Ð²Ñ‹ÐºÐ°Ð½Ð°Ð»Ñ– нейкае дзеÑньне цÑгам {{PLURAL:$1|апошнÑга $1 днÑ|апошніх $1 дзён|апошніх $1 дзён}}',
@@ -1817,8 +1853,8 @@ $1",
Старонка лічыцца шматзначнай, калі Ñна ўтрымлівае шаблён назва Ñкога знаходзіцца на Ñтаронцы [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Ð”Ð²Ð°Ð¹Ð½Ñ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–',
-'doubleredirectstext' => 'Ðа гÑтай Ñтаронцы знаходзіцца ÑÑŒÐ¿Ñ–Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½ÑÑž на Ñ–Ð½ÑˆÑ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–. Кожны радок утрымлівае ÑпаÑылкі на першае Ñ– другое перанакіраваньне, а такÑама першы радок Ñтаронкі другога перанакіраваньнÑ, у Ñкім звычайна знаходзіцца назва Ñтаронкі, куды павіннае ÑпаÑылацца першае перанакіраваньне.
-<s>ЗакрÑÑьленыÑ</s> ÑлемÑнты былі выпраўленыÑ.',
+'doubleredirectstext' => 'Ðа гÑтай Ñтаронцы пададзены ÑÑŒÐ¿Ñ–Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½ÑÑž на Ñ–Ð½ÑˆÑ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–. Кожны радок утрымлівае ÑпаÑылкі на першае Ñ– другое перанакіраваньне, а такÑама мÑтавую Ñтаронку другога перанакіраваньнÑ, ÑÐºÐ°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð° зьÑўлÑецца «Ñапраўднай» мÑтавай Ñтаронкай, куды павіннае ÑпаÑылацца першае перанакіраваньне.
+<del>ЗакрÑÑьленыÑ</del> ÑлемÑнты былі выпраўленыÑ.',
'double-redirect-fixed-move' => '[[$1]] была перанеÑенаÑ, Ñна цÑпер перанакіроўвае на [[$2]]',
'double-redirect-fixer' => 'Выпраўленьне перанакіраваньнÑÑž',
@@ -1841,6 +1877,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|ÑлемÑнт|ÑлемÑнты|ÑлемÑнтаў}}',
'nrevisions' => '$1 {{PLURAL:$1|вÑÑ€ÑÑ–Ñ|вÑÑ€ÑÑ–Ñ–|вÑÑ€Ñій}}',
'nviews' => '$1 {{PLURAL:$1|праглÑд|праглÑды|праглÑдаў}}',
+'nimagelinks' => 'ВыкарыÑтоўваецца на $1 {{PLURAL:$1|Ñтаронцы|Ñтаронках|Ñтаронках}}',
+'ntransclusions' => 'выкарыÑтоўваецца на $1 {{PLURAL:$1|Ñтаронцы|Ñтаронках|Ñтаронках}}',
'specialpage-empty' => 'ГÑÑ‚Ð°Ñ Ñтаронка — пуÑтаÑ.',
'lonelypages' => 'Старонкі-Ñіраціны',
'lonelypagestext' => 'Ðа наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñтаронкі нÑма ÑпаÑылак Ñ– Ñны Ð½Ñ ÑžÐ»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ñž Ñ–Ð½ÑˆÑ‹Ñ Ñтаронкі {{GRAMMAR:родны|{{SITENAME}}}}.',
@@ -1932,7 +1970,7 @@ $1",
# Special:Categories
'categories' => 'КатÑгорыі',
-'categoriespagetext' => '{{PLURAL:$1|ÐаÑÑ‚ÑƒÐ¿Ð½Ð°Ñ ÐºÐ°Ñ‚ÑÐ³Ð¾Ñ€Ñ‹Ñ Ð·ÑŒÐ¼Ñшчае|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі зьмÑшчаюць}} Ñтаронкі Ñ–/альбо мÑдыÑ-файлы.
+'categoriespagetext' => '{{PLURAL:$1|ÐаÑÑ‚ÑƒÐ¿Ð½Ð°Ñ ÐºÐ°Ñ‚ÑÐ³Ð¾Ñ€Ñ‹Ñ Ð·ÑŒÐ¼Ñшчае|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі зьмÑшчаюць}} Ñтаронкі Ñ–/альбо мÑдыÑфайлы.
Тут не Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ [[Special:UnusedCategories|катÑгорыі, ÑÐºÑ–Ñ Ð½Ðµ выкарыÑтоўваюцца]].
ГлÑдзіце такÑама [[Special:WantedCategories|ÑÑŒÐ¿Ñ–Ñ Ð·Ð°Ð¿Ð°Ñ‚Ñ€Ð°Ð±Ð°Ð²Ð°Ð½Ñ‹Ñ… катÑгорыÑÑž]].',
'categoriesfrom' => 'Паказаць катÑгорыі, пачынаючы з:',
@@ -1997,34 +2035,40 @@ $1",
'listgrouprights-removegroup-self-all' => 'Можа выдаліць улаÑны рахунак з ÑžÑÑ–Ñ… груп',
# E-mail user
-'mailnologin' => 'ÐÑма адраÑу атрымальніка',
-'mailnologintext' => 'Вам неабходна [[Special:UserLogin|ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму]] Ñ– мець пацьверджаны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ñž Вашых [[Special:Preferences|наладах]], каб даÑылаць ліÑÑ‚Ñ‹ іншым удзельнікам.',
-'emailuser' => 'ДаÑлаць ліÑÑ‚',
-'emailpage' => 'ДаÑлаць ліÑÑ‚ ўдзельніку ці ўдзельніцы па Ñлектроннай пошце',
-'emailpagetext' => 'Ð’Ñ‹ можаце выкарыÑтоўваць форму ніжÑй, каб даÑлаць гÑтаму ўдзельніку ліÑÑ‚ па Ñлектроннай пошце.
+'mailnologin' => 'ÐÑма адраÑу атрымальніка',
+'mailnologintext' => 'Вам неабходна [[Special:UserLogin|ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму]] Ñ– мець пацьверджаны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ñž Вашых [[Special:Preferences|наладах]], каб даÑылаць ліÑÑ‚Ñ‹ іншым удзельнікам.',
+'emailuser' => 'ДаÑлаць ліÑÑ‚',
+'emailpage' => 'ДаÑлаць ліÑÑ‚ ўдзельніку ці ўдзельніцы па Ñлектроннай пошце',
+'emailpagetext' => 'Ð’Ñ‹ можаце выкарыÑтоўваць форму ніжÑй, каб даÑлаць гÑтаму ўдзельніку ліÑÑ‚ па Ñлектроннай пошце.
ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты, Ñкі Ð’Ñ‹ пазначалі Ñž [[Special:Preferences|Ñваіх наладах]], будзе пазначаны Ñž полі ліÑта «Ðд», Ñ– ўдзельнік зможа даÑлаць на гÑÑ‚Ñ‹ Ð°Ð´Ñ€Ð°Ñ Ð°Ð´ÐºÐ°Ð·.',
-'usermailererror' => 'Пры адÑыланьні пошты адбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°:',
-'defemailsubject' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° {{GRAMMAR:родны|{{SITENAME}}}}',
-'noemailtitle' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты адÑутнічае',
-'noemailtext' => 'ГÑÑ‚Ñ‹ удзельнік не пазначыў Ñлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты.',
-'nowikiemailtitle' => 'Ðтрыманьне ліÑтоў па Ñлектроннай пошце забароненае',
-'nowikiemailtext' => 'ГÑÑ‚Ñ‹ ўдзельнік не дазволіў атрымліваць ліÑÑ‚Ñ‹ па Ñлектроннай пошце ад іншых удзельнікаў.',
-'email-legend' => 'ДаÑлаць ліÑÑ‚ Ñлектроннай пошты іншаму ўдзельніку {{GRAMMAR:родны|{{SITENAME}}}}',
-'emailfrom' => 'Ðд:',
-'emailto' => 'Да:',
-'emailsubject' => 'ТÑма:',
-'emailmessage' => 'Паведамленьне:',
-'emailsend' => 'ДаÑлаць',
-'emailccme' => 'ДаÑлаць мне копію ліÑта.',
-'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ліÑта да $1: $2',
-'emailsent' => 'ЛіÑÑ‚ адаÑланы',
-'emailsenttext' => 'Ваш ліÑÑ‚ быў адаÑланы.',
-'emailuserfooter' => 'ГÑÑ‚Ñ‹ ліÑÑ‚ быў даÑланы ўдзельнікам $1 да ўдзельніка $2 з дапамогай функцыі «ДаÑлаць ліÑт» праекту {{SITENAME}}.',
+'usermailererror' => 'Пры адÑыланьні пошты адбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°:',
+'defemailsubject' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° {{GRAMMAR:родны|{{SITENAME}}}}',
+'usermaildisabled' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° ўдзельніка адключанаÑ',
+'usermaildisabledtext' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ даÑылаць ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹ іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}',
+'noemailtitle' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты адÑутнічае',
+'noemailtext' => 'ГÑÑ‚Ñ‹ удзельнік не пазначыў Ñлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты.',
+'nowikiemailtitle' => 'Ðтрыманьне ліÑтоў па Ñлектроннай пошце забароненае',
+'nowikiemailtext' => 'ГÑÑ‚Ñ‹ ўдзельнік не дазволіў атрымліваць ліÑÑ‚Ñ‹ па Ñлектроннай пошце ад іншых удзельнікаў.',
+'email-legend' => 'ДаÑлаць ліÑÑ‚ Ñлектроннай пошты іншаму ўдзельніку {{GRAMMAR:родны|{{SITENAME}}}}',
+'emailfrom' => 'Ðд:',
+'emailto' => 'Да:',
+'emailsubject' => 'ТÑма:',
+'emailmessage' => 'Паведамленьне:',
+'emailsend' => 'ДаÑлаць',
+'emailccme' => 'ДаÑлаць мне копію ліÑта.',
+'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ліÑта да $1: $2',
+'emailsent' => 'ЛіÑÑ‚ адаÑланы',
+'emailsenttext' => 'Ваш ліÑÑ‚ быў адаÑланы.',
+'emailuserfooter' => 'ГÑÑ‚Ñ‹ ліÑÑ‚ быў даÑланы ўдзельнікам $1 да ўдзельніка $2 з дапамогай функцыі «ДаÑлаць ліÑт» праекту {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Паведамленьне пра выхад з ÑÑ‹ÑÑ‚Ñмы.',
+'usermessage-editor' => 'ДаÑтаўка ÑÑ‹ÑÑ‚Ñмных паведамленьнÑÑž',
# Watchlist
'watchlist' => 'Мой ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
'mywatchlist' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
-'watchlistfor' => "(Ð´Ð»Ñ '''$1''')",
+'watchlistfor2' => 'Ð”Ð»Ñ $1 $2',
'nowatchlist' => 'Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð¿ÑƒÑÑ‚Ñ‹.',
'watchlistanontext' => 'Вам патрÑбна $1, каб праглÑдаць альбо Ñ€Ñдагаваць ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ.',
'watchnologin' => 'Ð’Ñ‹ не ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму',
@@ -2085,7 +2129,13 @@ $NEWPAGE
СыÑÑ‚Ñма паведамленьнÑÑž {{GRAMMAR:родны|{{SITENAME}}}}
--
+Каб зьмÑніць налады абвÑшчÑÐ½ÑŒÐ½Ñ Ð¿Ñ€Ð°Ð· Ñлектронную пошту, наведайце:
+{{fullurl:{{#special:Preferences}}}}
+
Каб зьмÑніць налады ÑьпіÑу назіраньнÑ, наведайце:
+{{fullurl:{{#special:Preferences}}}}
+
+Каб выдаліць Ñтаронку з Вашага ÑьпіÑу назіраньнÑ, наведайце:
$UNWATCHURL
Ð—Ð²Ð°Ñ€Ð¾Ñ‚Ð½Ð°Ñ ÑувÑзь Ñ– дапамога:
@@ -2140,7 +2190,10 @@ $UNWATCHURL
'revertpage-nouser' => 'РÑдагаваньні (Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° выдаленае) ÑкаÑÐ°Ð²Ð°Ð½Ñ‹Ñ Ð´Ð° папÑÑ€ÑднÑй вÑÑ€ÑÑ–Ñ– [[User:$1|$1]]',
'rollback-success' => 'ÐÐ´Ð¼ÐµÐ½ÐµÐ½Ñ‹Ñ Ñ€Ñдагаваньні $1;
Ð²ÐµÑ€Ð½ÑƒÑ‚Ð°Ñ Ð¿Ð°Ð¿ÑÑ€ÑднÑÑ Ð²ÑÑ€ÑÑ–Ñ $2.',
-'sessionfailure' => 'Магчыма ўзьніклі праблемы Ñž Вашым цÑперашнім ÑÑанÑе працы;
+
+# Edit tokens
+'sessionfailure-title' => 'Памылка ÑÑÑÑ–Ñ–',
+'sessionfailure' => 'Магчыма ўзьніклі праблемы Ñž Вашым цÑперашнім ÑÑанÑе працы;
гÑта дзеÑньне было ÑкаÑавана Ð´Ð»Ñ Ð¿Ñ€Ð°Ð´ÑƒÑ…Ñ–Ð»ÐµÐ½ÑŒÐ½Ñ Ð¿ÐµÑ€Ð°Ñ…Ð¾Ð¿Ñƒ ÑÑанÑу.
Калі лаÑка, націÑьніце «назад» Ñ– перазагрузіце Ñтаронку, зь Ñкой Ð’Ñ‹ прыйшлі, Ñ– паÑпрабуйце ізноў.',
@@ -2275,18 +2328,22 @@ $1',
'month' => 'Ðд меÑÑца (Ñ– раней):',
'year' => 'Ðд году (Ñ– раней):',
-'sp-contributions-newbies' => 'Паказаць унёÑак толькі з новых рахункаў',
-'sp-contributions-newbies-sub' => 'УнёÑак пачынаючых',
-'sp-contributions-newbies-title' => 'УнёÑак удзельнікаў з новых рахункаў',
-'sp-contributions-blocklog' => 'журнал блÑкаваньнÑÑž',
-'sp-contributions-deleted' => 'выдалены ўнёÑак удзельніка',
-'sp-contributions-logs' => 'журналы падзеÑÑž',
-'sp-contributions-talk' => 'гутаркі',
-'sp-contributions-userrights' => 'кіраваньне правамі ўдзельнікаў і ўдзельніц',
-'sp-contributions-blocked-notice' => '{{GENDER:$1|ГÑÑ‚Ñ‹ ўдзельнік у дадзены момант заблÑкаваны|ГÑÑ‚Ð°Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–Ñ†Ð° Ñž дадзены момант заблÑкаванаÑ}}. Ðпошні Ð·Ð°Ð¿Ñ–Ñ Ð· журнала блÑкаваньнÑÑž пададзены ніжÑй Ð´Ð»Ñ Ð´Ð°Ð²ÐµÐ´ÐºÑ–:',
-'sp-contributions-search' => 'Пошук унёÑку',
-'sp-contributions-username' => 'IP-Ð°Ð´Ñ€Ð°Ñ Ð°Ð»ÑŒÐ±Ð¾ Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°/ўдзельніцы:',
-'sp-contributions-submit' => 'Шукаць',
+'sp-contributions-newbies' => 'Паказаць унёÑак толькі з новых рахункаў',
+'sp-contributions-newbies-sub' => 'УнёÑак пачынаючых',
+'sp-contributions-newbies-title' => 'УнёÑак удзельнікаў з новых рахункаў',
+'sp-contributions-blocklog' => 'журнал блÑкаваньнÑÑž',
+'sp-contributions-deleted' => 'выдалены ўнёÑак удзельніка',
+'sp-contributions-uploads' => 'загрузкі',
+'sp-contributions-logs' => 'журналы падзеÑÑž',
+'sp-contributions-talk' => 'гутаркі',
+'sp-contributions-userrights' => 'кіраваньне правамі ўдзельнікаў і ўдзельніц',
+'sp-contributions-blocked-notice' => '{{GENDER:$1|ГÑÑ‚Ñ‹ ўдзельнік у дадзены момант заблÑкаваны|ГÑÑ‚Ð°Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–Ñ†Ð° Ñž дадзены момант заблÑкаванаÑ}}. Ðпошні Ð·Ð°Ð¿Ñ–Ñ Ð· журнала блÑкаваньнÑÑž пададзены ніжÑй Ð´Ð»Ñ Ð´Ð°Ð²ÐµÐ´ÐºÑ–:',
+'sp-contributions-blocked-notice-anon' => 'ГÑÑ‚Ñ‹ IP-Ð°Ð´Ñ€Ð°Ñ Ñƒ дадзены момант заблÑкаваны.
+Ðпошні Ð·Ð°Ð¿Ñ–Ñ Ð· журнала блÑкаваньнÑÑž пададзены ніжÑй Ð´Ð»Ñ Ð´Ð°Ð²ÐµÐ´ÐºÑ–:',
+'sp-contributions-search' => 'Пошук унёÑку',
+'sp-contributions-username' => 'IP-Ð°Ð´Ñ€Ð°Ñ Ð°Ð»ÑŒÐ±Ð¾ Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°/ўдзельніцы:',
+'sp-contributions-toponly' => 'Паказваць толькі зьмены, ÑÐºÑ–Ñ Ð·ÑŒÑўлÑюцца апошнімі вÑÑ€ÑÑ–Ñмі',
+'sp-contributions-submit' => 'Шукаць',
# What links here
'whatlinkshere' => 'СпаÑылкі на Ñтаронку',
@@ -2345,7 +2402,6 @@ $1',
'ipb-edit-dropdown' => 'РÑдагаваць прычыны блÑкіровак',
'ipb-unblock-addr' => 'РазблÑкаваць $1',
'ipb-unblock' => 'РазблÑкаваць рахунак ўдзельніка ці IP-адраÑ',
-'ipb-blocklist-addr' => 'ÐаÑÑžÐ½Ñ‹Ñ Ð±Ð»Ñкаваньні Ð´Ð»Ñ $1',
'ipb-blocklist' => 'Паказаць Ñ–ÑÐ½ÑƒÑŽÑ‡Ñ‹Ñ Ð±Ð»Ñкаваньні',
'ipb-blocklist-contribs' => 'УнёÑак $1',
'unblockip' => 'РазблÑкаваць удзельніка',
@@ -2415,6 +2471,8 @@ $1 ужо заблÑкаваны. Ð’Ñ‹ жадаеце зьмÑніць параÐ
Ð’Ñ‹ Ð½Ñ Ð·Ð¼Ð¾Ð¶Ð°Ñ†Ðµ Ñтварыць рахунак',
'cant-block-while-blocked' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ блÑкаваць іншых удзельнікаў, пакуль Ð’Ñ‹ Ñамі заблÑкаваныÑ.',
'cant-see-hidden-user' => 'Удзельнік, Ñкога Ð’Ñ‹ Ñпрабуеце заблÑкаваць, ужо заблÑкаваны Ñ– Ñхаваны. З-за таго, што Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў Ñ…Ð°Ð²Ð°Ð½ÑŒÐ½Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ñž, Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ бачыць альбо зьмÑнÑць блÑкаваньне удзельніка.',
+'ipbblocked' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ блÑкаваць ці раблÑкоўваць іншых удзельнікаў, таму што заблÑÐºÐ°Ð²Ð°Ð½Ñ‹Ñ Ñамі',
+'ipbnounblockself' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ раблÑкоўваць ÑÑбе',
# Developer tools
'lockdb' => 'ЗаблÑкаваць базу зьвеÑтак',
@@ -2451,6 +2509,17 @@ $1 ужо заблÑкаваны. Ð’Ñ‹ жадаеце зьмÑніць параÐ
'''ПÐПЯРЭДЖÐÐЬÐЕ!'''
Зьмена назвы можа прывеÑьці да нечаканых зьменаў папулÑрных Ñтаронак;
калі лаÑка, упÑўніцеÑÑ, што Ð’Ñ‹ разумееце наÑтупÑтвы такіх зьменаў.",
+'movepagetext-noredirectfixer' => "СкарыÑтаўшыÑÑ Ð³Ñтай формай, Ð’Ñ‹ перанеÑÑце Ñтаронку з уÑёй гіÑторыÑй зьменаў да новай назвы.
+Старонка Ñа Ñтарой назвай будзе перанакіроўваць на Ñтаронку з новай.
+Калі лаÑка, праверце Ñ–Ñнаваньне [[Special:DoubleRedirects|падвоеных]] Ñ– [[Special:BrokenRedirects|нÑÑлушных перанакіраваньнÑÑž]].
+Ð’Ñ‹ Ð°Ð´ÐºÐ°Ð·Ð½Ñ‹Ñ Ð·Ð° тое, каб ÑпаÑылкі працÑгвалі веÑьці туды, куды Ñны павінны.
+
+Заўважце, калі лаÑка, што Ñтаронка '''Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ''' перанеÑенаÑ, калі ўжо Ñ–Ñнуе Ñтаронка з новай назвай, Ð°ÐºÑ€Ð°Ð¼Ñ Ð²Ñ‹Ð¿Ð°Ð´ÐºÐ°Ñž, калі Ñна пуÑÑ‚Ð°Ñ Ñ†Ñ– зьмÑшчае перанакіраваньне, а такÑама Ð½Ñ Ð¼Ð°Ðµ папÑÑ€ÑднÑй гіÑторыі Ñ€ÑдагаваньнÑÑž.
+ГÑта значыць, што Ð’Ñ‹ можаце перанеÑьці Ñтаронку назад, калі зробіце памылку, але Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ выпадкова перазапіÑаць Ñ–Ñнуючую Ñтаронку.
+
+'''ПапÑÑ€Ñджаньне!'''
+ÐŸÐµÑ€Ð°Ð½Ð¾Ñ Ð¼Ð¾Ð¶Ð° быць маштабным Ñ– нечаканым Ð´Ð»Ñ ''папулÑрных'' Ñтаронак.
+УпÑўніцеÑÑ, калі лаÑка, што Ð’Ñ‹ разумееце ÑžÑе Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ñ‹Ñ Ð½Ð°ÑтупÑтвы пераноÑу.",
'movepagetalktext' => "Старонка Ð°Ð±Ð¼ÐµÑ€ÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð±ÑƒÐ´Ð·Ðµ перанеÑÐµÐ½Ð°Ñ Ñ€Ð°Ð·Ð°Ð¼ з аÑноўнай Ñтаронкай, '''за выключÑньнем:'''
* Ðе пуÑÑ‚Ð°Ñ Ñтаронка Ð°Ð±Ð¼ÐµÑ€ÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ ÑžÐ¶Ð¾ Ñ–Ñнуе пад новай назвай, альбо
* Ð’Ñ‹ не паÑтавілі адзнаку Ñž полі ніжÑй.
@@ -2506,6 +2575,7 @@ $1 ужо заблÑкаваны. Ð’Ñ‹ жадаеце зьмÑніць параÐ
'immobile-source-page' => 'ГÑтую Ñтаронку нельга пераноÑіць.',
'immobile-target-page' => 'Ðемагчыма перанеÑьці Ñтаронку пад гÑтую назву.',
'imagenocrossnamespace' => 'Ðельга перанеÑьці файл у нÑ-файлавую праÑтору назваў',
+'nonfile-cannot-move-to-file' => 'Ðельга перанеÑьці Ð½Ñ Ñ„Ð°Ð¹Ð» у праÑтору назваў файлаў',
'imagetypemismatch' => 'Ðовае пашырÑньне файла не адпавÑдае Ñго тыпу',
'imageinvalidfilename' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° мÑтавага файла',
'fix-double-redirects' => 'Ðбнавіць уÑе перанакіраваньні на першапачатковую назву',
@@ -2587,6 +2657,7 @@ $1 ужо заблÑкаваны. Ð’Ñ‹ жадаеце зьмÑніць параÐ
'importstart' => 'Імпартаваньне Ñтаронак…',
'import-revision-count' => '$1 {{PLURAL:$1|вÑÑ€ÑÑ–Ñ|вÑÑ€ÑÑ–Ñ–|вÑÑ€Ñій}}',
'importnopages' => 'ÐÑма Ñтаронак Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ð½ÑŒÐ½Ñ.',
+'imported-log-entries' => '{{PLURAL:$1|Імпартаваны $1 Ð·Ð°Ð¿Ñ–Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð°|Ð†Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ð½Ñ‹Ñ $1 запіÑÑ‹ журнала|Ð†Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ð½Ñ‹Ñ $1 запіÑаў журнала}}.',
'importfailed' => 'Ðемагчыма імпартаваць: $1',
'importunknownsource' => 'ÐевÑдомы тып крыніцы імпарту',
'importcantopen' => 'Ðемагчыма адкрыць файл імпарту',
@@ -2664,7 +2735,7 @@ $1 ужо заблÑкаваны. Ð’Ñ‹ жадаеце зьмÑніць параÐ
'tooltip-t-permalink' => 'Ð¡Ñ‚Ð°Ð»Ð°Ñ ÑпаÑылка на гÑтую вÑÑ€ÑÑ–ÑŽ Ñтаронкі',
'tooltip-ca-nstab-main' => 'Паказаць зьмеÑÑ‚ Ñтаронкі',
'tooltip-ca-nstab-user' => 'Паказаць Ñтаронку ўдзельніка',
-'tooltip-ca-nstab-media' => 'Паказаць Ñтаронку мÑдыÑ-файла',
+'tooltip-ca-nstab-media' => 'Паказаць Ñтаронку мÑдыÑфайла',
'tooltip-ca-nstab-special' => 'ГÑта ÑпÑцыÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка, Ñ– Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ Ñе Ñ€Ñдагаваць',
'tooltip-ca-nstab-project' => 'Паказаць Ñтаронку праекту',
'tooltip-ca-nstab-image' => 'Паказаць Ñтаронку файла',
@@ -2683,6 +2754,8 @@ $1 ужо заблÑкаваны. Ð’Ñ‹ жадаеце зьмÑніць параÐ
'tooltip-rollback' => '«Ðдкат» вÑртае Ñ€Ñдагаваньні папÑÑ€ÑднÑга ўдзельніка адным клікам.',
'tooltip-undo' => '«СкаÑаваць» — ÑкаÑоўвае гÑтае Ñ€Ñдагаваньне Ñ– адкрывае акно Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñž Ñ€Ñжыме праглÑду.
ДазвалÑе дадаваць прычыну адкату Ñž апіÑаньне зьменаў.',
+'tooltip-preferences-save' => 'Захаваць налады',
+'tooltip-summary' => 'УвÑдзіце кароткае апіÑаньне',
# Metadata
'nodublincore' => 'ÐœÑтазьвеÑткі Dublin Core RDF Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ñ‹Ñ Ð½Ð° гÑтым ÑÑрвÑры.',
@@ -2789,14 +2862,17 @@ $1',
'imagemaxsize' => "Ðбмежаваньне памеру выÑваў: <br />''(Ð´Ð»Ñ Ñтаронак апіÑÐ°Ð½ÑŒÐ½Ñ Ñ„Ð°Ð¹Ð»Ð°Ñž)''",
'thumbsize' => 'Памер паменшанай вÑÑ€ÑÑ–Ñ– выÑвы:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñтаронка|Ñтаронкі|Ñтаронак}}',
-'file-info' => '(памер файла: $1, тып MIME: $2)',
-'file-info-size' => '($1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}, памер файла: $3, тып MIME: $4)',
+'file-info' => 'памер файла: $1, тып MIME: $2',
+'file-info-size' => '$1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}, памер файла: $3, тып MIME: $4',
'file-nohires' => '<small>ÐÑма вÑÑ€ÑÑ–Ñ– зь лепшым разрозьненьнем.</small>',
-'svg-long-desc' => '(SVG-файл, намінальна $1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}, памер файла: $3).',
+'svg-long-desc' => 'SVG-файл, намінальна $1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}, памер файла: $3.',
'show-big-image' => 'Ðайлепшае разрозьненьне',
'show-big-image-thumb' => '<small>Памер пры папÑÑ€Ñднім праглÑдзе: $1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}</small>',
'file-info-gif-looped' => 'паўтараючыÑÑ',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадры|кадраў}}',
+'file-info-png-looped' => 'паўтараючыÑÑ',
+'file-info-png-repeat' => 'паўтораны $1 {{PLURAL:$1|раз|разы|разоў}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадар|кадры|кадраў}}',
# Special:NewFiles
'newimages' => 'ГалерÑÑ Ð½Ð¾Ð²Ñ‹Ñ… файлаў',
@@ -2955,6 +3031,7 @@ $1',
'exif-gpsareainformation' => 'Ðазва GPS-зоны',
'exif-gpsdatestamp' => 'Дата GPS',
'exif-gpsdifferential' => 'ДыфÑÑ€ÑнцыÑÐ»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¿Ñ€Ð°ÑžÐºÐ° GPS',
+'exif-objectname' => 'ÐšÐ°Ñ€Ð¾Ñ‚ÐºÐ°Ñ Ð½Ð°Ð·Ð²Ð°',
# EXIF attributes
'exif-compression-1' => 'ÐÑÑьціÑнуты',
@@ -3114,23 +3191,23 @@ $1',
'limitall' => 'уÑе',
# E-mail address confirmation
-'confirmemail' => 'Пацьвердзіць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
-'confirmemail_noemail' => 'Ð’Ñ‹ не пазначылі Ñлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ñž Вашых [[Special:Preferences|наладах удзельніка]].',
-'confirmemail_text' => '{{SITENAME}} патрабуе, каб Ð’Ñ‹ пацьвердзілі Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты перад ўжываньнем магчымаÑьцÑÑž Ñлектроннай пошты. Ðктывізуйце кнопку ніжÑй, каб даÑлаць ліÑÑ‚ з пацьверджаньнем на Ваш адраÑ. ЛіÑÑ‚ будзе ўтрымліваць ÑпаÑылку з кодам; загрузіце ÑпаÑылку Ñž Вашым браўзÑры, каб пацьвердзіць, што Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты зьÑўлÑецца Ñлушным.',
-'confirmemail_pending' => 'Код Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ ÑƒÐ¶Ð¾ быў даÑланы Вам праз Ñлектронную пошту; калі Ð’Ñ‹ нÑдаўна Ñтварылі рахунак, Вам варта пачакаць код некалькі хвілінаў перад Ñпробай запыту новага коду.',
-'confirmemail_send' => 'ДаÑлаць код пацьверджаньнÑ',
-'confirmemail_sent' => 'ЛіÑÑ‚ Ð´Ð»Ñ Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð´Ð°Ñланы.',
-'confirmemail_oncreate' => 'Код Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð±Ñ‹Ñž адпраўлены на Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты. ГÑÑ‚Ñ‹ код не патрÑбны, каб увайÑьці, але Вам Ñ‚Ñ€Ñба будзе падаць Ñго перад ужываньнем магчымаÑьцÑÑž, заÑнаваных на Ñлектроннай пошце, у {{GRAMMAR:меÑны|{{SITENAME}}}}.',
-'confirmemail_sendfailed' => '{{SITENAME}} Ð½Ñ Ð¼Ð¾Ð¶Ð° даÑлаць пацьвÑрджальны ліÑÑ‚. Праверце Ð°Ð´Ñ€Ð°Ñ Ð½Ð° наÑўнаÑьць нÑÑлушных ÑымбалÑÑž.
+'confirmemail' => 'Пацьвердзіць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+'confirmemail_noemail' => 'Ð’Ñ‹ не пазначылі Ñлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ñž Вашых [[Special:Preferences|наладах удзельніка]].',
+'confirmemail_text' => '{{SITENAME}} патрабуе, каб Ð’Ñ‹ пацьвердзілі Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты перад ўжываньнем магчымаÑьцÑÑž Ñлектроннай пошты. Ðктывізуйце кнопку ніжÑй, каб даÑлаць ліÑÑ‚ з пацьверджаньнем на Ваш адраÑ. ЛіÑÑ‚ будзе ўтрымліваць ÑпаÑылку з кодам; загрузіце ÑпаÑылку Ñž Вашым браўзÑры, каб пацьвердзіць, што Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты зьÑўлÑецца Ñлушным.',
+'confirmemail_pending' => 'Код Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ ÑƒÐ¶Ð¾ быў даÑланы Вам праз Ñлектронную пошту; калі Ð’Ñ‹ нÑдаўна Ñтварылі рахунак, Вам варта пачакаць код некалькі хвілінаў перад Ñпробай запыту новага коду.',
+'confirmemail_send' => 'ДаÑлаць код пацьверджаньнÑ',
+'confirmemail_sent' => 'ЛіÑÑ‚ Ð´Ð»Ñ Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð´Ð°Ñланы.',
+'confirmemail_oncreate' => 'Код Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð±Ñ‹Ñž адпраўлены на Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты. ГÑÑ‚Ñ‹ код не патрÑбны, каб увайÑьці, але Вам Ñ‚Ñ€Ñба будзе падаць Ñго перад ужываньнем магчымаÑьцÑÑž, заÑнаваных на Ñлектроннай пошце, у {{GRAMMAR:меÑны|{{SITENAME}}}}.',
+'confirmemail_sendfailed' => '{{SITENAME}} Ð½Ñ Ð¼Ð¾Ð¶Ð° даÑлаць пацьвÑрджальны ліÑÑ‚. Праверце Ð°Ð´Ñ€Ð°Ñ Ð½Ð° наÑўнаÑьць нÑÑлушных ÑымбалÑÑž.
Ðдказ паштовага ÑÑрвÑра: $1',
-'confirmemail_invalid' => 'ÐÑÑлушны код пацьверджаньнÑ. Магчыма, ÑкончыўÑÑ Ñго Ñ‚Ñрмін дзеÑньнÑ.',
-'confirmemail_needlogin' => 'Вам Ñ‚Ñ€Ñба $1, каб пацьвердзіць Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты.',
-'confirmemail_success' => 'Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты быў пацьверджаны. Зараз Ð’Ñ‹ можаце ўвайÑьці.',
-'confirmemail_loggedin' => 'Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты быў пацьверджаны.',
-'confirmemail_error' => 'Ðешта пайшло Ð½Ñ Ñ‚Ð°Ðº у чаÑе Ð·Ð°Ñ…Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð²Ð°ÑˆÐ°Ð³Ð° пацьверджаньнÑ.',
-'confirmemail_subject' => '{{SITENAME}}: Пацьверджаньне адраÑу Ñлектроннай пошты',
-'confirmemail_body' => 'Ðехта, магчыма Ð’Ñ‹, з IP-адраÑу $1, Ñтварыў рахунак «$2» з гÑтым адраÑам Ñлектроннай пошты Ñž праекце {{SITENAME}}.
+'confirmemail_invalid' => 'ÐÑÑлушны код пацьверджаньнÑ. Магчыма, ÑкончыўÑÑ Ñго Ñ‚Ñрмін дзеÑньнÑ.',
+'confirmemail_needlogin' => 'Вам Ñ‚Ñ€Ñба $1, каб пацьвердзіць Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты.',
+'confirmemail_success' => 'Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты быў пацьверджаны. Зараз Ð’Ñ‹ можаце ўвайÑьці.',
+'confirmemail_loggedin' => 'Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты быў пацьверджаны.',
+'confirmemail_error' => 'Ðешта пайшло Ð½Ñ Ñ‚Ð°Ðº у чаÑе Ð·Ð°Ñ…Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð²Ð°ÑˆÐ°Ð³Ð° пацьверджаньнÑ.',
+'confirmemail_subject' => '{{SITENAME}}: Пацьверджаньне адраÑу Ñлектроннай пошты',
+'confirmemail_body' => 'Ðехта, магчыма Ð’Ñ‹, з IP-адраÑу $1, Ñтварыў рахунак «$2» з гÑтым адраÑам Ñлектроннай пошты Ñž праекце {{SITENAME}}.
Каб пацьвердзіць, што гÑÑ‚Ñ‹ рахунак належыць Вам Ñ– актывізаваць магчымаÑьці Ñлектроннай пошты Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}, адкрыйце гÑтую ÑпаÑылку у Вашым браўзÑры:
@@ -3141,8 +3218,32 @@ $3
$5
Код дзейнічае да $4.',
-'confirmemail_invalidated' => 'Пацьверджаньне адраÑу Ñлектроннай пошты адмененае',
-'invalidateemail' => 'СкаÑаваць пацьверджаньне адраÑу Ñлектроннай пошты',
+'confirmemail_body_changed' => 'Ðехта, магчыма Ð’Ñ‹, з IP-адраÑу $1, зьмÑніў Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты рахунку «$2» у праекце {{SITENAME}}.
+
+Каб пацьвердзіць, што гÑÑ‚Ñ‹ рахунак належыць Вам Ñ– актывізаваць магчымаÑьці Ñлектроннай пошты Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} зноў, адкрыйце гÑтую ÑпаÑылку у Вашым браўзÑры:
+
+$3
+
+Калі рахунак належыць *нÑ* Ваш, адкрыйце наÑтупную ÑпаÑылку Ð´Ð»Ñ Ñ‚Ð°Ð³Ð¾, каб не пацьвердзіць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:
+
+$5
+
+Код дзейнічае да $4.',
+'confirmemail_body_set' => 'Ðехта, магчыма Ð’Ñ‹, з IP-адраÑа $1,
+уÑтанавіў Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ð´Ð»Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ «$2» у {{GRAMMAR:меÑны|{{SITENAME}}}}.
+
+Каб пацьвердзіць, што гÑÑ‚Ñ‹ рахунак Ñапраўды належыць Вам, Ñ– каб актывізаваць новы магчымаÑьці Ñлектроннай пошты Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}, адкрыйце гÑтую ÑпаÑылку у Вашым браўзÑры:
+
+$3
+
+Калі рахунак Вам *не* належыць, перайдзіце па гÑтай ÑпаÑылцы
+каб ÑкаÑаваць пацьверджаньне па Ñлектроннай пошце:
+
+$5
+
+ГÑÑ‚Ñ‹ код Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð´Ð·ÐµÐ¹Ð½Ñ–Ñ‡Ð°Ðµ да $4.',
+'confirmemail_invalidated' => 'Пацьверджаньне адраÑу Ñлектроннай пошты адмененае',
+'invalidateemail' => 'СкаÑаваць пацьверджаньне адраÑу Ñлектроннай пошты',
# Scary transclusion
'scarytranscludedisabled' => '[УлучÑньне інтÑрвікі было адключанае]',
@@ -3184,6 +3285,7 @@ $1',
'table_pager_first' => 'ÐŸÐµÑ€ÑˆÐ°Ñ Ñтаронка',
'table_pager_last' => 'ÐпошнÑÑ Ñтаронка',
'table_pager_limit' => 'Паказваць $1 ÑлемÑнтаў на Ñтаронцы',
+'table_pager_limit_label' => 'ЗапіÑаў на Ñтаронку:',
'table_pager_limit_submit' => 'ПерайÑьці',
'table_pager_empty' => 'ÐÑ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°',
@@ -3248,6 +3350,7 @@ $1',
'version-specialpages' => 'СпÑцыÑÐ»ÑŒÐ½Ñ‹Ñ Ñтаронкі',
'version-parserhooks' => 'ПрацÑдуры-перахопнікі парÑÑра',
'version-variables' => 'ЗьменныÑ',
+'version-skins' => 'Ðфармленьні',
'version-other' => 'ІншыÑ',
'version-mediahandlers' => 'Ðпрацоўшчыкі мÑдыÑ',
'version-hooks' => 'ПрацÑдуры-перахопнікі',
@@ -3259,6 +3362,13 @@ $1',
'version-hook-subscribedby' => 'ПадпіÑаны на',
'version-version' => '(Ð’ÑÑ€ÑÑ–Ñ $1)',
'version-license' => 'ЛіцÑнзіÑ',
+'version-poweredby-credits' => "{{SITENAME}} працуе на праграмным забеÑьпÑчÑньні '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'іншыÑ',
+'version-license-info' => 'MediaWiki зьÑўлÑецца вольным праграмным забеÑьпÑчÑньнем, Ñкое Ð’Ñ‹ можаце раÑпаўÑюджваць Ñ–/ці зьмÑнÑць на ўмовах ліцÑнзіі GNU General Public License вÑÑ€ÑÑ–Ñ– 2 ці болей позьнÑй, апублікаванай ФундацыÑй вольнага праграмнага забеÑьпÑчÑÐ½ÑŒÐ½Ñ (Free Software Foundation).
+
+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, альбо прачытайце [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html он-лайн копію ліцÑнзіі].',
'version-software' => 'УÑталÑванае праграмнае забеÑьпÑчÑньне',
'version-software-product' => 'Прадукт',
'version-software-version' => 'Ð’ÑÑ€ÑÑ–Ñ',
@@ -3293,7 +3403,7 @@ $1',
'specialpages-group-other' => 'Ð†Ð½ÑˆÑ‹Ñ ÑпÑцыÑÐ»ÑŒÐ½Ñ‹Ñ Ñтаронкі',
'specialpages-group-login' => 'Уваход / ÑтварÑньне рахунку',
'specialpages-group-changes' => 'ÐÐ¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ Ñ– журналы падзеÑÑž',
-'specialpages-group-media' => 'Справаздачы пра мÑдыÑ-файлы Ñ– загрузка',
+'specialpages-group-media' => 'Справаздачы пра мÑдыÑфайлы Ñ– загрузка',
'specialpages-group-users' => 'Удзельнікі і правы',
'specialpages-group-highuse' => 'ЧаÑÑ‚Ð°ÑžÐ¶Ñ‹Ð²Ð°Ð½Ñ‹Ñ Ñтаронкі',
'specialpages-group-pages' => 'СьпіÑÑ‹ Ñтаронак',
@@ -3329,6 +3439,15 @@ $1',
'tags-edit' => 'Ñ€Ñдагаваць',
'tags-hitcount' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
+# Special:ComparePages
+'comparepages' => 'Параўнаньне Ñтаронак',
+'compare-selector' => 'Параўнаньне вÑÑ€ÑÑ–ÑÑž Ñтаронак',
+'compare-page1' => 'Старонка 1',
+'compare-page2' => 'Старонка 2',
+'compare-rev1' => 'Ð’ÑÑ€ÑÑ–Ñ 1',
+'compare-rev2' => 'Ð’ÑÑ€ÑÑ–Ñ 2',
+'compare-submit' => 'Параўнаць',
+
# Database error messages
'dberr-header' => 'ГÑÑ‚Ð°Ñ Ð²Ñ–ÐºÑ– не функцыÑнуе Ñпраўна',
'dberr-problems' => 'Прабачце! Ðа гÑтым Ñайце ўзьніклі Ñ‚ÑÑ…Ð½Ñ–Ñ‡Ð½Ñ‹Ñ Ñ†ÑжкаÑьці.',
@@ -3345,8 +3464,13 @@ $1',
'htmlform-float-invalid' => 'ЗначÑньне, Ñкое Ð’Ñ‹ выбралі, не зьÑўлÑецца лікам.',
'htmlform-int-toolow' => 'ЗначÑньне, Ñкое вы выбралі, менш за $1',
'htmlform-int-toohigh' => 'ЗначÑньне, Ñкое Ð’Ñ‹ выбралі, больш за $1',
+'htmlform-required' => 'ГÑтае значÑньне — неабходнае',
'htmlform-submit' => 'Захаваць',
'htmlform-reset' => 'ÐдмÑніць зьмены',
'htmlform-selectorother-other' => 'Іншае',
+# SQLite database support
+'sqlite-has-fts' => '$1 з падтрымкай поўнатÑкÑтнага пошуку',
+'sqlite-no-fts' => '$1 без падтрымкі поўнатÑкÑтнага пошуку',
+
);
diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php
index 8570c1e5..de5e4bb8 100644
--- a/languages/messages/MessagesBg.php
+++ b/languages/messages/MessagesBg.php
@@ -224,7 +224,7 @@ $specialPageAliases = array(
$linkTrail = '/^([a-zабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ]+)(.*)$/sDu';
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$messages = array(
# User preference toggles
@@ -242,8 +242,7 @@ $messages = array(
'tog-editsection' => 'ВъзможноÑÑ‚ за редактиране на раздел чрез препратка [редактиране]',
'tog-editsectiononrightclick' => 'ВъзможноÑÑ‚ за редактиране на раздел при щракване Ñ Ð´ÐµÑÐ½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ върху заглавие на раздел (изиÑква ДжаваÑкрипт)',
'tog-showtoc' => 'Показване на Ñъдържание (за Ñтраници Ñ Ð¿Ð¾Ð²ÐµÑ‡Ðµ от три раздела)',
-'tog-rememberpassword' => 'ЗапомнÑне между ÑеÑиите',
-'tog-editwidth' => 'МакÑимална ширина на кутиÑта за редактиране',
+'tog-rememberpassword' => 'ЗапомÑне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})',
'tog-watchcreations' => 'ДобавÑне на Ñъздадените от мен Ñтраници към ÑпиÑъка ми за наблюдение',
'tog-watchdefault' => 'ДобавÑне на редактираните от мен Ñтраници към ÑпиÑъка ми за наблюдение',
'tog-watchmoves' => 'ДобавÑне на премеÑтените от мен Ñтраници към ÑпиÑъка ми за наблюдение',
@@ -391,31 +390,21 @@ $messages = array(
'faqpage' => 'Project:ЧЗВ',
# Vector skin
-'vector-action-addsection' => 'ДобавÑне на тема',
-'vector-action-delete' => 'Изтриване',
-'vector-action-move' => 'ПремеÑтване',
-'vector-action-protect' => 'Защита',
-'vector-action-undelete' => 'ВъзÑтановÑване',
-'vector-action-unprotect' => 'СвалÑне на защитата',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Помощ',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Страница',
-'vector-namespace-media' => 'МедиÑ',
-'vector-namespace-mediawiki' => 'Съобщение',
-'vector-namespace-project' => 'Проект',
-'vector-namespace-special' => 'Специална Ñтраница',
-'vector-namespace-talk' => 'БеÑеда',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Потребител',
-'vector-view-create' => 'Създаване',
-'vector-view-edit' => 'Редактиране',
-'vector-view-history' => 'ИÑториÑ',
-'vector-view-view' => 'Преглед',
-'vector-view-viewsource' => 'Преглед на кода',
-'actions' => 'ДейÑтвиÑ',
-'namespaces' => 'Именни проÑтранÑтва',
-'variants' => 'Варианти',
+'vector-action-addsection' => 'ДобавÑне на тема',
+'vector-action-delete' => 'Изтриване',
+'vector-action-move' => 'ПремеÑтване',
+'vector-action-protect' => 'Защита',
+'vector-action-undelete' => 'ВъзÑтановÑване',
+'vector-action-unprotect' => 'СвалÑне на защитата',
+'vector-simplesearch-preference' => 'Включване на Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¸Ñ Ð¿Ñ€Ð¸ Ñ‚ÑŠÑ€Ñене (Ñамо за изгледа Vector)',
+'vector-view-create' => 'Създаване',
+'vector-view-edit' => 'Редактиране',
+'vector-view-history' => 'ИÑториÑ',
+'vector-view-view' => 'Преглед',
+'vector-view-viewsource' => 'Преглед на кода',
+'actions' => 'ДейÑтвиÑ',
+'namespaces' => 'Именни проÑтранÑтва',
+'variants' => 'Варианти',
'errorpagetitle' => 'Грешка',
'returnto' => 'Обратно към $1.',
@@ -476,6 +465,9 @@ $messages = array(
МолÑ, изчакайте малко преди отново да пробвате да отворите Ñтраницата.
$1',
+'pool-timeout' => 'Изтичане на времето за заключване на Ñтраницата',
+'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}}',
@@ -640,7 +632,8 @@ $2',
'yourname' => 'ПотребителÑко име:',
'yourpassword' => 'Парола:',
'yourpasswordagain' => 'Парола (повторно):',
-'remembermypassword' => 'ЗапомнÑне на паролата',
+'remembermypassword' => 'ЗапомнÑне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
+'securelogin-stick-https' => 'Запазване на връзката през HTTPS Ñлед влизане',
'yourdomainname' => 'Домейн:',
'externaldberror' => 'Или е Ñтанала грешка в базата от данни при външното удоÑтоверÑване, или не ви е позволено да обновÑвате външната Ñи Ñметка.',
'login' => 'Влизане',
@@ -659,6 +652,7 @@ $2',
'gotaccount' => "Имате ли вече Ñметка? '''$1'''.",
'gotaccountlink' => 'Влизане',
'createaccountmail' => 'Ñ Ð¿Ð¸Ñмо по електронната поща',
+'createaccountreason' => 'Причина:',
'badretype' => 'Въведените пароли не Ñъвпадат.',
'userexists' => 'Въведеното потребителÑко име вече Ñе използва.
Изберете друго име.',
@@ -679,6 +673,7 @@ $2',
'wrongpasswordempty' => 'Въведената парола е празна. Опитайте отново.',
'passwordtooshort' => 'Ðеобходимо е паролата да Ñъдържа поне {{PLURAL:$1|1 знак|$1 знака}}.',
'password-name-match' => 'Паролата ви Ñ‚Ñ€Ñбва да Ñе различава от потребителÑкото ви име.',
+'password-login-forbidden' => 'Използването на това потребителÑко име и парола е забранено.',
'mailmypassword' => 'Изпращане на нова парола',
'passwordremindertitle' => 'ÐапомнÑне за парола от {{SITENAME}}',
'passwordremindertext' => 'ÐÑкой (най-вероÑтно вие, от IP-Ð°Ð´Ñ€ÐµÑ $1) е пожелал нова парола за влизане в {{SITENAME}} ($4).
@@ -715,6 +710,9 @@ $2',
'loginlanguagelabel' => 'Език: $1',
'suspicious-userlogout' => 'ЗаÑвката ви за излизане от ÑиÑтемата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокÑи.',
+# E-mail sending
+'php-mail-error-unknown' => 'ÐеизвеÑтна грешка в mail() функциÑта на PHP',
+
# Password reset dialog
'resetpass' => 'ПромÑна на парола',
'resetpass_announce' => 'ВлÑзохте Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½ÐµÐ½ код, получен по електронната поща. Сега е нужно да Ñи изберете нова парола:',
@@ -766,9 +764,11 @@ $2',
'showlivepreview' => 'Бърз предварителен преглед',
'showdiff' => 'Показване на промените',
'anoneditwarning' => "'''Внимание:''' Ðе Ñте влезли в ÑиÑтемата. Ð’ иÑториÑта на Ñтраницата ще бъде запиÑан вашиÑÑ‚ IP-адреÑ.",
+'anonpreviewwarning' => 'Внимание: Ðе Ñте влезли в ÑиÑтемата. Ðко Ñъхраните редакциÑта Ñи, Ñ‚Ñ Ñ‰Ðµ бъде запиÑана в иÑториÑта на Ñтраницата Ñ Ð²Ð°ÑˆÐ¸ÑÑ‚ IP-адреÑ.',
'missingsummary' => "'''ÐапомнÑне:''' Ðе е въведено кратко опиÑание на промените. При повторно натиÑкане на бутона „СъхранÑване“, редакциÑта ще бъде Ñъхранена без резюме.",
'missingcommenttext' => 'По-долу въведете вашето Ñъобщение.',
-'missingcommentheader' => "'''ÐапомнÑне:''' Ðе е въведено заглавие на коментара. При повторно натиÑкане на бутона „СъхранÑване“, редакциÑта ще бъде запиÑана без такова.",
+'missingcommentheader' => "'''ÐапомнÑне:''' Ðе е въведено заглавие на коментара.
+При повторно натиÑкане на \"{{int:savearticle}}\", редакциÑта ще бъде запиÑана без такова.",
'summary-preview' => 'Предварителен преглед на резюмето:',
'subject-preview' => 'Предварителен преглед на заглавието:',
'blockedtitle' => 'ПотребителÑÑ‚ е блокиран',
@@ -839,7 +839,11 @@ $2',
'userjsyoucanpreview' => "'''Съвет:''' Използвайте бутона „{{int:showpreview}}“, за да изпробвате Ð½Ð¾Ð²Ð¸Ñ ÐºÐ¾Ð´ на ДжаваÑкрипт преди Ñъхранението.",
'usercsspreview' => "'''Ðе забравÑйте, че това е Ñамо предварителен преглед на кода на CSS. Страницата вÑе още не е Ñъхранена!'''",
'userjspreview' => "'''Ðе забравÑйте, че това е Ñамо изпробване/предварителен преглед на кода на ДжаваÑкрипт. Страницата вÑе още не е Ñъхранена!'''",
-'userinvalidcssjstitle' => "'''Внимание:''' Ðе ÑъщеÑтвува облик „$1“. Ðеобходимо е да Ñе знае, че имената на потребителÑките ви Ñтраници за CSS и ДжаваÑкрипт Ñ‚Ñ€Ñбва да Ñе ÑÑŠÑтоÑÑ‚ от малки букви, например: „{{ns:user}}:Иван/monobook.css“ (а не „{{ns:user}}:Иван/Monobook.css“).",
+'sitecsspreview' => "'''Ðе забравÑйте, че това е Ñамо предварителен преглед на този CSS.'''
+'''Той вÑе още не е Ñъхранен!'''",
+'sitejspreview' => "'''Ðе забравÑйте, че това е Ñамо предварителен преглед на този ДжаваÑкрипт код.'''
+'''Той вÑе още не е Ñъхранен!'''",
+'userinvalidcssjstitle' => "'''Внимание:''' Ðе ÑъщеÑтвува облик „$1“. Ðеобходимо е да Ñе знае, че имената на потребителÑките ви Ñтраници за CSS и ДжаваÑкрипт Ñ‚Ñ€Ñбва да Ñе ÑÑŠÑтоÑÑ‚ от малки букви, например: „{{ns:user}}:Иван/vector.css“ (а не „{{ns:user}}:Иван/Vector.css“).",
'updated' => '(обновена)',
'note' => "'''Забележка:'''",
'previewnote' => "'''Това е Ñамо предварителен преглед. Промените вÑе още не Ñа Ñъхранени!'''",
@@ -877,8 +881,6 @@ $2',
Ðко Ñте ползвали чужди материали, за които имате разрешение, непременно поÑочете източника.
<div style=\"font-variant:small-caps\">'''Ðе публикувайте Ð¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ñки права без разрешение!'''</div>",
-'longpagewarning' => "'''Ð’ÐИМÐÐИЕ: Страницата има размер $1 килобайта; нÑкои браузъри могат да имат проблеми при редактиране на Ñтраници по-големи от 32 kB.
-ОбмиÑлете дали Ñтраницата не може да Ñе раздели на нÑколко по-малки чаÑти.'''",
'longpageerror' => "'''ГРЕШКÐ: ТекÑÑ‚ÑŠÑ‚, който пращате, е Ñ Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° $1 килобайта, което надвишава Ð¿Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимум от $2 килобайта. Заради това не може да бъде Ñъхранен.'''",
'readonlywarning' => "'''Ð’ÐИМÐÐИЕ: Базата от данни беше затворена за поддръжка, затова в момента промените ви не могат да бъдат Ñъхранени. Ðко желаете, можете да Ñъхраните Ñтраницата като текÑтов файл и да Ñе опитате да Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÑƒÐ²Ð°Ñ‚Ðµ по-къÑно.'''
@@ -1051,6 +1053,8 @@ $1",
'logdelete-failure' => "'''Данните не могат да Ñе видÑÑ‚:'''
$1",
'revdel-restore' => 'ПромÑна на видимоÑтта',
+'revdel-restore-deleted' => 'изтрити верÑии',
+'revdel-restore-visible' => 'видими редакции',
'pagehist' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° Ñтраницата',
'deletedhist' => 'Изтрита иÑториÑ',
'revdelete-content' => 'Ñъдържание',
@@ -1118,11 +1122,13 @@ $1",
# Diffs
'history-title' => 'Преглед на иÑториÑта на „$1“',
'difference' => '(Разлики между верÑиите)',
+'difference-multipage' => '(Разлики между Ñтраниците)',
'lineno' => 'Ред $1:',
'compareselectedversions' => 'Сравнение на избраните верÑии',
'showhideselectedversions' => 'Показване/Ñкриване на избрани верÑии',
'editundo' => 'връщане',
-'diff-multi' => '({{PLURAL:$1|Една междинна верÑÐ¸Ñ Ð½Ðµ е показана|$1 междинни верÑии не Ñа показани}}.)',
+'diff-multi' => '({{PLURAL:$1|Ðе е показана една междинна верÑиÑ|Ðе Ñа показани $1 междинни верÑии}} от {{PLURAL:$2|един потребител|$2 потребителÑ}}.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ðе е показана една междинна верÑиÑ|Ðе Ñа показани $1 междинни верÑии}} от повече от $2 {{PLURAL:$2|потребител|потребителÑ}})',
# Search results
'searchresults' => 'Резултати от Ñ‚ÑŠÑ€Ñенето',
@@ -1157,6 +1163,7 @@ $1",
'searchprofile-everything-tooltip' => 'ТърÑене в цÑлото Ñъдържание (вкл. беÑеди)',
'searchprofile-advanced-tooltip' => 'ТърÑене в избрани именни проÑтранÑтва',
'search-result-size' => '$1 ({{PLURAL:$2|една дума|$2 думи}})',
+'search-result-category-size' => '{{PLURAL:$1|1 член|$1 члена}} ({{PLURAL:$2|1 подкатегориÑ|$2 подкатегории}}, {{PLURAL:$3|1 файл|$3 файла}})',
'search-result-score' => 'РелевантноÑÑ‚: $1%',
'search-redirect' => '(пренаÑочване $1)',
'search-section' => '(раздел $1)',
@@ -1232,6 +1239,7 @@ $1",
'contextlines' => 'Редове за резултат:',
'contextchars' => 'Знаци от контекÑта на ред:',
'stub-threshold' => 'Праг за форматиране на <a href="#" class="stub">препратки към мъничета</a>:',
+'stub-threshold-disabled' => 'Изключено',
'recentchangesdays' => 'Брой дни в поÑледни промени:',
'recentchangesdays-max' => '(най-много $1 {{PLURAL:$1|ден|дни}})',
'recentchangescount' => 'Брой показвани редакции по подразбиране:',
@@ -1265,6 +1273,7 @@ $1",
'prefs-files' => 'Файлове',
'prefs-custom-css' => 'Личен CSS',
'prefs-custom-js' => 'Личен JS',
+'prefs-common-css-js' => 'Общи наÑтройки на CSS/JS за вÑички облици:',
'prefs-reset-intro' => 'Тази Ñтраница може да Ñе използва за възÑтановÑване на потребителÑките наÑтройки към Ñтандартните за Ñайта.
Това дейÑтвие е необратимо.',
'prefs-emailconfirm-label' => 'Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
@@ -1301,9 +1310,15 @@ $1",
'prefs-advancedrendering' => 'Разширени наÑтройки',
'prefs-advancedsearchoptions' => 'Разширени наÑтройки',
'prefs-advancedwatchlist' => 'Разширени наÑтройки',
-'prefs-display' => 'ÐаÑтройки за показване на ÑпиÑъка',
+'prefs-displayrc' => 'ÐаÑтройки за показване на ÑпиÑъка',
+'prefs-displaysearchoptions' => 'ÐаÑтройки на изгледа',
+'prefs-displaywatchlist' => 'Видими наÑтройки',
'prefs-diffs' => 'Разлики',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ÐдреÑÑŠÑ‚ за е-поща изглежда валиден',
+'email-address-validity-invalid' => 'Въведете валиден Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща',
+
# User rights
'userrights' => 'Управление на потребителÑките права',
'userrights-lookup-user' => 'УправлÑване на потребителÑките групи',
@@ -1387,6 +1402,7 @@ $1",
'right-hideuser' => 'блокиране и Ñкриване на потребителÑко име',
'right-ipblock-exempt' => 'пренебрегване на Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸Ñ Ð¿Ð¾ IP blocks, автоматични Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸Ñ Ð¸ блокирани IP интервали',
'right-proxyunbannable' => 'пренебрегване на автоматичното блокиране на прокÑита',
+'right-unblockself' => 'СобÑтвено отблокиране',
'right-protect' => 'променÑне на нивото на защита и редактиране на защитени Ñтраници',
'right-editprotected' => 'редактиране на защитени Ñтраници (без каÑкадна защита)',
'right-editinterface' => 'редактиране на интерфейÑа',
@@ -1409,7 +1425,6 @@ $1",
'right-siteadmin' => 'заключване и отключване на базата от данни',
'right-reset-passwords' => 'СмÑна на паролите на други потребители',
'right-override-export-depth' => 'ИзнаÑÑне на Ñтраници, включително Ñвързаните Ñ Ñ‚ÑÑ… в дълбочина до пето ниво',
-'right-versiondetail' => 'Показване на подробна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° верÑиÑта на Ñофтуера',
'right-sendemail' => 'Изпращане на е-пиÑма до другите потребители',
# User rights log
@@ -1463,14 +1478,9 @@ $1",
Легенда: '''тек''' = разлика на текущата верÑиÑ,
'''иÑÑ‚''' = иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° верÑиите",
'recentchanges-feed-description' => 'ПроÑледÑване на поÑледните промени в {{SITENAME}}.',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 - нова Ñтраница',
'recentchanges-label-newpage' => 'С тази Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð±ÐµÑˆÐµ Ñъздадена нова Ñтраница',
-'recentchanges-legend-minor' => '$1 - малка промÑна',
'recentchanges-label-minor' => 'Това е малка промÑна',
-'recentchanges-legend-bot' => '$1 - Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð¾Ñ‚ бот',
'recentchanges-label-bot' => 'Тази Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ðµ извършена от робот',
-'recentchanges-legend-unpatrolled' => '$1 - непроверена редакциÑ',
'recentchanges-label-unpatrolled' => 'Тази Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð²Ñе още не е проверена',
'rcnote' => "{{PLURAL:$1|Показана е '''1''' промÑна|Показани Ñа поÑледните '''$1''' промени}} през {{PLURAL:$2|поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð´ÐµÐ½|поÑледните '''$2''' дни}}, към $5, $4.",
'rcnotefrom' => 'Дадени Ñа промените от <strong>$2</strong> (до <strong>$1</strong> показани).',
@@ -1520,6 +1530,9 @@ $1",
'upload_directory_missing' => 'ДиректориÑта за качване ($1) липÑва и не може да бъде Ñъздадена на Ñървъра.',
'upload_directory_read_only' => 'Сървърът нÑма доÑтъп за пиÑане в директориÑта за качване „$1“.',
'uploaderror' => 'Грешка при качване',
+'upload-recreate-warning' => "'''Внимание: Файл Ñ Ñ‚Ð¾Ð²Ð° име вече е бил изтрит или премеÑтен.'''
+
+За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ да прегледате запиÑите от дневниците на изтриваниÑта и премеÑтваниÑта:",
'uploadtext' => "ФормулÑрът по-долу Ñлужи за качване на файлове, които ще могат да Ñе използват в Ñтраниците.
За преглеждане и Ñ‚ÑŠÑ€Ñене на вече качените файлове може да Ñе използва [[Special:FileList|ÑпиÑъка Ñ ÐºÐ°Ñ‡ÐµÐ½Ð¸ файлове]]. КачваниÑта и изтриваниÑта Ñе запиÑват в [[Special:Log/upload|дневника на качваниÑта]] и [[Special:Log/delete|дневник на изтриваниÑта]].
@@ -1551,6 +1564,17 @@ $1",
'filetype-unwanted-type' => "'''„.$1“''' е нежелан файлов формат. {{PLURAL:$3|ПреопръчителниÑÑ‚ файлов формат е|Препоръчителните файлови формати Ñа}} $2.",
'filetype-banned-type' => "'''„.$1“''' не е позволен файлов формат. {{PLURAL:$3|ПозволениÑÑ‚ файлов формат е|Позволените файлови формати Ñа}} $2.",
'filetype-missing' => 'Файлът нÑма разширение (напр. „.jpg“).',
+'empty-file' => 'ПодадениÑÑ‚ от Ð²Ð°Ñ Ñ„Ð°Ð¹Ð» беше празен.',
+'file-too-large' => 'ПодадениÑÑ‚ от Ð²Ð°Ñ Ñ„Ð°Ð¹Ð» беше твърде голÑм.',
+'filename-tooshort' => 'Името на файла е твърде кратко.',
+'filetype-banned' => 'Този тип файл е забранен.',
+'verification-error' => 'Файлът не премина процедурата по верификациÑ.',
+'hookaborted' => 'Промените, които опитахте, бÑха отменени от разширение.',
+'illegal-filename' => 'Ðепозволено файлово име.',
+'overwrite' => 'Ðе Ñе позволÑва презапиÑване на ÑъщеÑтвуващ файл.',
+'unknown-error' => 'Възникна неизвеÑтна грешка.',
+'tmp-create-error' => 'Грешка при Ñъздаването на временен файл.',
+'tmp-write-error' => 'Грешка при запиÑа на временен файл.',
'large-file' => 'Ðе Ñе препоръчва файловете да Ñе по-големи от $1; този файл е $2.',
'largefileserver' => 'Файлът е по-голÑм от допуÑÑ‚Ð¸Ð¼Ð¸Ñ Ð¾Ñ‚ Ñървъра размер.',
'emptyfile' => 'КачениÑÑ‚ от Ð²Ð°Ñ Ñ„Ð°Ð¹Ð» е празен. Това може да е предизвикано от грешка в името на файла. Уверете Ñе дали наиÑтина желаете да го качите.',
@@ -1573,13 +1597,14 @@ $1",
Ðко вÑе още желаете да качите Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð», върнете Ñе и качете файла Ñ Ð½Ð¾Ð²Ð¾ име. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Този файл Ñе Ð¿Ð¾Ð²Ñ‚Ð°Ñ€Ñ ÑÑŠÑ {{PLURAL:$1|ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»|Ñледните файлове}}:',
'file-deleted-duplicate' => 'Идентичен Ñ Ñ‚Ð¾Ð·Ð¸ файл ([[:$1]]) вече е бил изтриван. ИÑториÑта на изтриването на файла Ñледва да Ñе провери, преди да Ñе приÑтъпи към повторното му качване.',
-'successfulupload' => 'Качването беше уÑпешно',
'uploadwarning' => 'Предупреждение при качване',
'uploadwarning-text' => 'Ðеобходимо е да промените опиÑанието на файла по-долу и да опитате отново.',
'savefile' => 'СъхранÑване на файл',
'uploadedimage' => 'качи „[[$1]]“',
'overwroteimage' => 'качи нова верÑÐ¸Ñ Ð½Ð° „[[$1]]“',
'uploaddisabled' => 'КачваниÑта Ñа забранени.',
+'copyuploaddisabled' => 'СпрÑно е качването на файлове чрез URL.',
+'uploadfromurl-queued' => 'КачениÑÑ‚ от Ð²Ð°Ñ Ñ„Ð°Ð¹Ð» беше добавен в опашката.',
'uploaddisabledtext' => 'Качването на файлове е забранено.',
'php-uploaddisabledtext' => 'КачваниÑта на файлове Ñа Ñпрени през PHP. Проверете наÑтройката file_uploads.',
'uploadscripted' => 'Файлът Ñъдържа HTML или Ñкриптов код, който може да бъде погрешно интерпретиран от браузъра.',
@@ -1597,6 +1622,14 @@ $1",
Преценете дали е удачно да продължите Ñ ÐºÐ°Ñ‡Ð²Ð°Ð½ÐµÑ‚Ð¾ на файла. За ваше удобÑтво, ето запиÑа за него в дневника на изтриваниÑта:",
'filename-bad-prefix' => "Името на файла, който качвате, започва Ñ '''„$1“''', което е неопиÑателно име, типично задавано по автоматичен начин от цифровите камери или апарати. Изберете по-опиÑателно име на файла.",
+'upload-success-subj' => 'Качването беше уÑпешно',
+'upload-success-msg' => 'Качването ви от [$2] е уÑпешно. ДоÑтъпно е тук: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Проблем при качване',
+'upload-failure-msg' => 'Имаше проблем Ñ Ð²Ð°ÑˆÐµÑ‚Ð¾ качване от [$2]:
+
+$1',
+'upload-warning-subj' => 'Предупреждение за качването',
+'upload-warning-msg' => 'Имаше проблем Ñ ÐºÐ°Ñ‡Ð²Ð°Ð½ÐµÑ‚Ð¾ ви от [$2]. Може да Ñе върнете към [[Special:Upload/stash/$1|Ñтраницата за качване]], за да поправите проблема.',
'upload-proto-error' => 'Ðеправилен протокол',
'upload-proto-error-text' => 'ИзиÑква Ñе Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð¿Ð¾Ñ‡Ð²Ð°Ñ‰ Ñ <code>http://</code> или <code>ftp://</code>.',
@@ -1656,6 +1689,7 @@ $1",
'listfiles_search_for' => 'ТърÑене по име на файла:',
'imgfile' => 'файл',
'listfiles' => 'СпиÑък на файловете',
+'listfiles_thumb' => 'Миникартинка',
'listfiles_date' => 'Дата',
'listfiles_name' => 'Име на файла',
'listfiles_user' => 'Потребител',
@@ -1768,8 +1802,8 @@ $1",
'statistics-edits' => 'Брой редакции по Ñтраници от началото на {{SITENAME}}',
'statistics-edits-average' => 'Средно редакции на Ñтраница',
'statistics-views-total' => 'Общо прегледи',
+'statistics-views-total-desc' => 'Ðе Ñа включени прегледите на неÑъщеÑтвуващи и Ñпециални Ñтраници',
'statistics-views-peredit' => 'Прегледи на редакциÑ',
-'statistics-jobqueue' => 'Дължина на [http://www.mediawiki.org/wiki/Manual:Job_queue работната опашка]',
'statistics-users' => 'РегиÑтрирани [[Special:ListUsers|потребители]]',
'statistics-users-active' => 'Ðктивни потребители',
'statistics-users-active-desc' => 'Потребители, направили Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ· {{PLURAL:$1|поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð´ÐµÐ½|поÑледните $1 дни}}',
@@ -1782,7 +1816,7 @@ $1",
'doubleredirects' => 'Двойни пренаÑочваниÑ',
'doubleredirectstext' => 'Тази Ñтраница Ñъдържа ÑпиÑък ÑÑŠÑ Ñтраници, които пренаÑочват към друга пренаÑочваща Ñтраница.
Ð’Ñеки ред Ñъдържа препратки към първото и второто пренаÑочване, както и целта на второто пренаÑочване, коÑто обикновено е „иÑтинÑката“ целева Ñтраница, към коÑто първото пренаÑочване би Ñ‚Ñ€Ñбвало да Ñочи.
-<s>ЗадраÑканите</s> запиÑи Ñа коригирани.',
+<del>ЗадраÑканите</del> запиÑи Ñа коригирани.',
'double-redirect-fixed-move' => 'ОправÑне на двойно пренаÑочване Ñлед премеÑтването на [[$1]] като [[$2]]',
'double-redirect-fixer' => 'Redirect fixer',
@@ -1805,6 +1839,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|член|члена}}',
'nrevisions' => '$1 {{PLURAL:$1|верÑиÑ|верÑии}}',
'nviews' => '$1 {{PLURAL:$1|преглед|прегледа}}',
+'nimagelinks' => 'Използва Ñе в $1 {{PLURAL:$1|Ñтраница|Ñтраници}}',
+'ntransclusions' => 'използва Ñе в $1 {{PLURAL:$1|Ñтраница|Ñтраници}}',
'specialpage-empty' => 'Страницата е празна.',
'lonelypages' => 'Страници Ñираци',
'lonelypagestext' => 'Към Ñледващите Ñтраници нÑма препратки или не Ñа включени в други Ñтраници в {{SITENAME}}.',
@@ -1959,34 +1995,40 @@ $1",
'listgrouprights-removegroup-self-all' => 'Може да премахва вÑички групи от ÑобÑтвената Ñметка',
# E-mail user
-'mailnologin' => 'ÐÑма електронна поща',
-'mailnologintext' => 'Ðеобходимо е да [[Special:UserLogin|влезете]] и да поÑочите валидна електронна поща в [[Special:Preferences|наÑтройките]] Ñи, за да може да пращате пиÑма на други потребители.',
-'emailuser' => 'ПиÑмо до потребителÑ',
-'emailpage' => 'Пращане пиÑмо на потребител',
-'emailpagetext' => 'Можете да използвате формулÑра по-долу, за да изпратите електронно пиÑмо на този потребител.
+'mailnologin' => 'ÐÑма електронна поща',
+'mailnologintext' => 'Ðеобходимо е да [[Special:UserLogin|влезете]] и да поÑочите валидна електронна поща в [[Special:Preferences|наÑтройките]] Ñи, за да може да пращате пиÑма на други потребители.',
+'emailuser' => 'ПиÑмо до потребителÑ',
+'emailpage' => 'Пращане пиÑмо на потребител',
+'emailpagetext' => 'Можете да използвате формулÑра по-долу, за да изпратите електронно пиÑмо на този потребител.
ÐдреÑÑŠÑ‚, който Ñе въвели в [[Special:Preferences|наÑтройките Ñи]], ще Ñе поÑви в полето „От“ на пиÑмото, така че получателÑÑ‚ ще е в ÑÑŠÑтоÑние да ви отговори.',
-'usermailererror' => 'ПощенÑкиÑÑ‚ обект даде грешка:',
-'defemailsubject' => 'ПиÑмо от {{SITENAME}}',
-'noemailtitle' => 'ÐÑма електронна поща',
-'noemailtext' => 'Този потребител не е поÑочил валиден Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща.',
-'nowikiemailtitle' => 'Ðепозволена електронна поща',
-'nowikiemailtext' => 'Този потребител е избрал да не получава електронна поща от други потребители.',
-'email-legend' => 'Изпращане на електронно пиÑмо до друг потребител на {{SITENAME}}',
-'emailfrom' => 'От:',
-'emailto' => 'До:',
-'emailsubject' => 'ОтноÑно:',
-'emailmessage' => 'Съобщение:',
-'emailsend' => 'Изпращане',
-'emailccme' => 'Изпращане на копие на пиÑмото до автора.',
-'emailccsubject' => 'Копие на пиÑмото ви до $1: $2',
-'emailsent' => 'ПиÑмото е изпратено',
-'emailsenttext' => 'ПиÑмото ви беше изпратено.',
-'emailuserfooter' => 'Това пиÑмо беше изпратено от $1 на $2 чрез функциÑта „Изпращане на пиÑмо до потребителÑ“ на {{SITENAME}}.',
+'usermailererror' => 'ПощенÑкиÑÑ‚ обект даде грешка:',
+'defemailsubject' => 'ПиÑмо от {{SITENAME}}',
+'usermaildisabled' => 'ПотребителÑÑ‚ не е разрешил да получава електронна поща',
+'usermaildisabledtext' => 'Ðе можете да изпращате електронна поща на други потребители от това уики',
+'noemailtitle' => 'ÐÑма електронна поща',
+'noemailtext' => 'Този потребител не е поÑочил валиден Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща.',
+'nowikiemailtitle' => 'Ðепозволена електронна поща',
+'nowikiemailtext' => 'Този потребител е избрал да не получава електронна поща от други потребители.',
+'email-legend' => 'Изпращане на електронно пиÑмо до друг потребител на {{SITENAME}}',
+'emailfrom' => 'От:',
+'emailto' => 'До:',
+'emailsubject' => 'ОтноÑно:',
+'emailmessage' => 'Съобщение:',
+'emailsend' => 'Изпращане',
+'emailccme' => 'Изпращане на копие на пиÑмото до автора.',
+'emailccsubject' => 'Копие на пиÑмото ви до $1: $2',
+'emailsent' => 'ПиÑмото е изпратено',
+'emailsenttext' => 'ПиÑмото ви беше изпратено.',
+'emailuserfooter' => 'Това пиÑмо беше изпратено от $1 на $2 чрез функциÑта „Изпращане на пиÑмо до потребителÑ“ на {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'ОÑтавÑне на ÑиÑтемно Ñъобщение.',
+'usermessage-editor' => 'СиÑтемни ÑъобщениÑ',
# Watchlist
'watchlist' => 'МоÑÑ‚ ÑпиÑък за наблюдение',
'mywatchlist' => 'МоÑÑ‚ ÑпиÑък за наблюдение',
-'watchlistfor' => "(за '''$1''')",
+'watchlistfor2' => 'За $1 $2',
'nowatchlist' => 'СпиÑъкът ви за наблюдение е празен.',
'watchlistanontext' => 'За преглеждане и редактиране на ÑпиÑъка за наблюдение Ñе изиÑква $1 в ÑиÑтемата.',
'watchnologin' => 'Ðе Ñте влезли',
@@ -2030,7 +2072,7 @@ $1",
'enotif_anon_editor' => 'анонимен потребител $1',
'enotif_body' => 'Уважаеми(а) $WATCHINGUSERNAME,
-Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED на $PAGEEDITDATE от $PAGEEDITOR. За текущата верÑÐ¸Ñ Ð½Ð° Ñтраницата вижте $PAGETITLE_URL.
+Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED на $PAGEEDITDATE от $PAGEEDITOR. За текущата верÑÐ¸Ñ Ð½Ð° Ñтраницата, вижте $PAGETITLE_URL.
$NEWPAGE
@@ -2046,6 +2088,9 @@ $NEWPAGE
СиÑтемата за извеÑÑ‚Ñване на {{SITENAME}}
--
+За да промените наÑтройките Ñи за извеÑÑ‚ÑÐ²Ð°Ð½Ð¸Ñ Ñ‡Ñ€ÐµÐ· електронна поща, поÑетете
+{{fullurl:{{#special:Preferences}}}}
+
За да промените наÑтройките на ÑпиÑъка Ñи за наблюдение, поÑетете
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2100,7 +2145,10 @@ $UNWATCHURL
'revertpage' => 'Премахване на [[Special:Contributions/$2|редакции на $2]] ([[User talk:$2|беÑеда]]); възвръщане към поÑледната верÑÐ¸Ñ Ð½Ð° [[User:$1|$1]]',
'revertpage-nouser' => 'Премахнати редакции на (отÑтранено потребителÑко име) и връщане към поÑледната верÑÐ¸Ñ Ð½Ð° [[User:$1|$1]]',
'rollback-success' => 'Отменени редакции на $1; възвръщане към поÑледната верÑÐ¸Ñ Ð½Ð° $2.',
-'sessionfailure' => 'Изглежда има проблем ÑÑŠÑ ÑеÑиÑта ви; дейÑтвието беше отказано като предпазна мÑрка Ñрещу крадене на ÑеÑиÑта. ÐатиÑнете бутона за връщане на браузъра, презаредете Ñтраницата, от коÑто Ñте дошли, и опитайте отново.',
+
+# Edit tokens
+'sessionfailure-title' => 'ПрекъÑната ÑеÑиÑ',
+'sessionfailure' => 'Изглежда има проблем ÑÑŠÑ ÑеÑиÑта ви; дейÑтвието беше отказано като предпазна мÑрка Ñрещу крадене на ÑеÑиÑта. ÐатиÑнете бутона за връщане на браузъра, презаредете Ñтраницата, от коÑто Ñте дошли, и опитайте отново.',
# Protect
'protectlogpage' => 'Дневник на защитата',
@@ -2224,19 +2272,23 @@ $1',
'month' => 'МеÑец:',
'year' => 'Година:',
-'sp-contributions-newbies' => 'Показване Ñамо на приноÑите на нови потребители',
-'sp-contributions-newbies-sub' => 'на нови потребители',
-'sp-contributions-newbies-title' => 'ПотребителÑки приноÑи за нови Ñметки',
-'sp-contributions-blocklog' => 'Дневник на блокираниÑта',
-'sp-contributions-deleted' => 'изтрити приноÑи на потребител',
-'sp-contributions-logs' => 'дневници',
-'sp-contributions-talk' => 'беÑеда',
-'sp-contributions-userrights' => 'управление на потребителÑките права',
-'sp-contributions-blocked-notice' => 'ПотребителÑÑ‚ понаÑтоÑщем е блокиран.
+'sp-contributions-newbies' => 'Показване Ñамо на приноÑите на нови потребители',
+'sp-contributions-newbies-sub' => 'на нови потребители',
+'sp-contributions-newbies-title' => 'ПотребителÑки приноÑи за нови Ñметки',
+'sp-contributions-blocklog' => 'Дневник на блокираниÑта',
+'sp-contributions-deleted' => 'изтрити приноÑи на потребител',
+'sp-contributions-uploads' => 'качваниÑ',
+'sp-contributions-logs' => 'дневници',
+'sp-contributions-talk' => 'беÑеда',
+'sp-contributions-userrights' => 'управление на потребителÑките права',
+'sp-contributions-blocked-notice' => 'ПотребителÑÑ‚ понаÑтоÑщем е блокиран.
За Ñправка по-долу е показан поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° него от дневника на блокираниÑта:',
-'sp-contributions-search' => 'ТърÑене на приноÑи',
-'sp-contributions-username' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ потребителÑко име:',
-'sp-contributions-submit' => 'ТърÑене',
+'sp-contributions-blocked-notice-anon' => 'Този IP Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð½Ð°ÑтоÑщем е блокиран.
+За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ да прегледате поÑледниÑÑ‚ Ð·Ð°Ð¿Ð¸Ñ Ð² Дневника на блокираниÑта:',
+'sp-contributions-search' => 'ТърÑене на приноÑи',
+'sp-contributions-username' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ потребителÑко име:',
+'sp-contributions-toponly' => 'Показване Ñамо на поÑледните редакции',
+'sp-contributions-submit' => 'ТърÑене',
# What links here
'whatlinkshere' => 'Какво Ñочи наÑам',
@@ -2299,7 +2351,6 @@ $1',
'ipb-edit-dropdown' => 'Причини за блокиране',
'ipb-unblock-addr' => 'Отблокиране на $1',
'ipb-unblock' => 'Отблокиране на потребителÑко име IP-адреÑ',
-'ipb-blocklist-addr' => 'Преглед на текущите Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸Ñ Ð½Ð° $1',
'ipb-blocklist' => 'Преглед на текущите блокираниÑ',
'ipb-blocklist-contribs' => 'ПриноÑи на $1',
'unblockip' => 'Отблокиране на потребител',
@@ -2370,6 +2421,8 @@ $1 е вече блокиран. Желаете ли да промените нÐ
'sorbs_create_account_reason' => 'IP-адреÑÑŠÑ‚ ви е запиÑан като анонимно доÑтъпен междинен Ñървър в DNSBL на {{SITENAME}}. Ðе може да Ñъздадете Ñметка.',
'cant-block-while-blocked' => 'Ðе можете да блокирате други потребители, докато Ñам(а) Ñте блокиран(а).',
'cant-see-hidden-user' => 'ПотребителÑÑ‚, който опитвате да блокирате, вече е блокиран и Ñкрит. Тъй като нÑмате права да Ñкривате потребители, не можете да видите или редактирате блокирането на потребителÑ.',
+'ipbblocked' => 'Ðе можете да блокирате и разблокирате други потребители, защото вие ÑамиÑÑ‚ (Ñамата) Ñте блокиран(а).',
+'ipbnounblockself' => 'ÐÑмате право да Ñе разблокирате Ñам(а).',
# Developer tools
'lockdb' => 'Заключване на базата от данни',
@@ -2402,6 +2455,17 @@ $1 е вече блокиран. Желаете ли да промените нÐ
'''Ð’ÐИМÐÐИЕ!'''
Това може да е голÑма и неочаквана промÑна за извеÑтна Ñтраница. Уверете Ñе, че разбирате поÑледÑтвиÑта, преди да продължите.",
+'movepagetext-noredirectfixer' => "С помощта на формулÑра по-долу Ñе преименува Ñтраница, като цÑлата Ñ Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ð¾Ð½Ð½Ð° иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñе премеÑтва под новото име.
+Старото име ще оÑтане като пренаÑочваща Ñтраница към новото заглавие.
+Желателно е преди премеÑтването да Ñе извърши проверка за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренаÑочваниÑ]].
+Добре е да Ñе направи проверка дали препратките продължават да Ñочат там, където Ñе предполага.
+
+Важно е да Ñе знае, че Ñтраницата '''нÑма''' да бъде премеÑтена, ако вече ÑъщеÑтвува Ñтраница Ñ Ð½Ð¾Ð²Ð¾Ñ‚Ð¾ име, оÑвен ако не е празна или пренаÑочваща Ñтраница и нÑма налична редакционна иÑториÑ.
+Това означава, че ако една Ñтраница бъде преименувана по погрешка, Ñ‚Ñ Ð¼Ð¾Ð¶Ðµ да Ñе премеÑти обратно ÑÑŠÑ Ñтарото Ñи заглавие, но не може да Ñе замеÑти ÑъщеÑтвуваща Ñтраница.
+
+'''Предупреждение!'''
+Това може да е драÑтична или неочаквана промÑна за нÑÐºÐ¾Ñ Ð¿Ð¾Ð¿ÑƒÐ»Ñрна Ñтраница;
+необходимо е да Ñе уверите, че разбирате поÑледÑтвиÑта от това преди да предприемете дейÑтвието.",
'movepagetalktext' => "Ðко ÑъщеÑтвува, Ñъответната диÑкуÑионна Ñтраница ще бъде премеÑтена автоматично заедно Ñ Ð½ÐµÑ, '''оÑвен ако:'''
* не меÑтите Ñтраницата от едно именно проÑтранÑтво в друго,
* вече ÑъщеÑтвува непразна диÑкуÑионна Ñтраница Ñ Ñ‚Ð¾Ð²Ð° име или
@@ -2457,6 +2521,7 @@ $1 е вече блокиран. Желаете ли да промените нÐ
'immobile-source-page' => 'Тази Ñтраница не може да бъде премеÑтвана.',
'immobile-target-page' => 'Ðе може да Ñе извърши премеÑтване върху това целево заглавие.',
'imagenocrossnamespace' => 'Ðевъзможно е да Ñе премеÑтват картинки извън това именно проÑтранÑтво',
+'nonfile-cannot-move-to-file' => 'Ðе може да Ñе премеÑти във файл нещо, което не е файл.',
'imagetypemismatch' => 'Ðовото разширение на файла не Ñъвпада Ñ Ñ‚Ð¸Ð¿Ð° му',
'imageinvalidfilename' => 'Целевото име на файл е невалидно',
'fix-double-redirects' => 'ОбновÑване на вÑички двойни пренаÑочваниÑ, които Ñочат към оригиналното заглавие',
@@ -2535,6 +2600,7 @@ $1 е вече блокиран. Желаете ли да промените нÐ
'importstart' => 'ВнаÑÑне на Ñтраници…',
'import-revision-count' => '$1 {{PLURAL:$1|верÑиÑ|верÑии}}',
'importnopages' => 'ÐÑма Ñтраници за внаÑÑне.',
+'imported-log-entries' => '{{PLURAL:$1|ВнеÑен е $1 запиÑ|ВнеÑени Ñа $1 запиÑа}} в дневника.',
'importfailed' => 'ВнаÑÑнето беше неуÑпешно: $1',
'importunknownsource' => 'Ðепознат тип файл',
'importcantopen' => 'Ðе е възможно да Ñе отвори файла за внаÑÑне',
@@ -2628,6 +2694,8 @@ $1 е вече блокиран. Желаете ли да промените нÐ
'tooltip-rollback' => 'Чрез „отмÑна“ ще премахнете наведнъж вÑички промени, нанеÑени от поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€',
'tooltip-undo' => 'Препратката „връщане“ премахва тази Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð¸ Ð¾Ñ‚Ð²Ð°Ñ€Ñ Ñтраницата за редактиране в режим на предварителен преглед.
Ð’ полето за резюме може да Ñе впише причина за връщането.',
+'tooltip-preferences-save' => 'СъхранÑване на предпочитаниÑта',
+'tooltip-summary' => 'Въведете кратко резюме',
# Stylesheets
'common.css' => '/* Чрез редактиране на този файл ще промените вÑички облици */',
@@ -2738,14 +2806,17 @@ $1',
'imagemaxsize' => "Ограничение на размерите на картинките:<br />''(Ñамо за опиÑателните Ñтраници)''",
'thumbsize' => 'Размери на миникартинките:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñтраница|Ñтраници}}',
-'file-info' => '(големина на файла: $1, MIME-тип: $2)',
-'file-info-size' => '($1 × $2 пикÑела, големина на файла: $3, MIME-тип: $4)',
+'file-info' => 'големина на файла: $1, MIME-тип: $2',
+'file-info-size' => '$1 × $2 пикÑела, големина на файла: $3, MIME-тип: $4',
'file-nohires' => '<small>Ðе е налична верÑÐ¸Ñ Ñ Ð¿Ð¾-виÑока разделителна ÑпоÑобноÑÑ‚.</small>',
-'svg-long-desc' => '(Файл във формат SVG, оÑновен размер: $1 × $2 пикÑела, големина на файла: $3)',
+'svg-long-desc' => 'Файл във формат SVG, оÑновен размер: $1 × $2 пикÑела, големина на файла: $3',
'show-big-image' => 'Пълна разделителна ÑпоÑобноÑÑ‚',
'show-big-image-thumb' => '<small>Размер на Ð¿Ñ€ÐµÐ´Ð²Ð°Ñ€Ð¸Ñ‚ÐµÐ»Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ³Ð»ÐµÐ´: $1 × $2 пикÑела</small>',
'file-info-gif-looped' => 'зациклен',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадър|кадъра}}',
+'file-info-png-looped' => 'зациклен',
+'file-info-png-repeat' => 'изпълнено $1 {{PLURAL:$1|път|пъти}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадър|кадъра}}',
# Special:NewFiles
'newimages' => 'Ð“Ð°Ð»ÐµÑ€Ð¸Ñ Ð½Ð° новите файлове',
@@ -2897,6 +2968,7 @@ $1',
'exif-gpsareainformation' => 'Име на GPS зоната',
'exif-gpsdatestamp' => 'GPS дата',
'exif-gpsdifferential' => 'Диференциална ÐºÐ¾Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð° GPS',
+'exif-objectname' => 'Кратко заглавие',
# EXIF attributes
'exif-compression-1' => 'ÐекомпреÑиран',
@@ -3057,23 +3129,23 @@ $1',
'limitall' => 'вÑички',
# E-mail address confirmation
-'confirmemail' => 'Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща',
-'confirmemail_noemail' => 'Ðе Ñте поÑочили валиден Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща в [[Special:Preferences|наÑтройки Ñи]].',
-'confirmemail_text' => '{{SITENAME}} изиÑква да потвърдите адреÑа Ñи за електронна поща преди да използвате възможноÑтите за е-поща. ÐатиÑнете Ð´Ð¾Ð»Ð½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½, за да ви бъде изпратено пиÑмо, Ñъдържащо Ñпециално генерирана препратка, чрез коÑто ще можете да потвърдите валидноÑтта на адреÑа Ñи.',
-'confirmemail_pending' => 'Кодът за потвърждение вече е изпратен. Ðко току-що Ñте Ñе региÑтрирали, изчакайте нÑколко минути да приÑтигне пиÑмото, преди да поиÑкате нов код.',
-'confirmemail_send' => 'Изпращане на код за потвърждение',
-'confirmemail_sent' => 'Кодът за потвърждение беше изпратен.',
-'confirmemail_oncreate' => 'Код за потвърждение беше изпратен на електронната ви поща.
+'confirmemail' => 'Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща',
+'confirmemail_noemail' => 'Ðе Ñте поÑочили валиден Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща в [[Special:Preferences|наÑтройки Ñи]].',
+'confirmemail_text' => '{{SITENAME}} изиÑква да потвърдите адреÑа Ñи за електронна поща преди да използвате възможноÑтите за е-поща. ÐатиÑнете Ð´Ð¾Ð»Ð½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½, за да ви бъде изпратено пиÑмо, Ñъдържащо Ñпециално генерирана препратка, чрез коÑто ще можете да потвърдите валидноÑтта на адреÑа Ñи.',
+'confirmemail_pending' => 'Кодът за потвърждение вече е изпратен. Ðко току-що Ñте Ñе региÑтрирали, изчакайте нÑколко минути да приÑтигне пиÑмото, преди да поиÑкате нов код.',
+'confirmemail_send' => 'Изпращане на код за потвърждение',
+'confirmemail_sent' => 'Кодът за потвърждение беше изпратен.',
+'confirmemail_oncreate' => 'Код за потвърждение беше изпратен на електронната ви поща.
Този код не е необходим за влизане, но ще ви Ñ‚Ñ€Ñбва при активирането на функциите в {{SITENAME}}, изиÑкващи валидна електронна поща.',
-'confirmemail_sendfailed' => '{{SITENAME}} не можа да изпрати пиÑмо Ñ ÐºÐ¾Ð´ за потвърждение. Проверете адреÑа Ñи за недопуÑтими знаци.
+'confirmemail_sendfailed' => '{{SITENAME}} не можа да изпрати пиÑмо Ñ ÐºÐ¾Ð´ за потвърждение. Проверете адреÑа Ñи за недопуÑтими знаци.
Изпращачът на е-поща отвърна: $1',
-'confirmemail_invalid' => 'Грешен код за потвърждение. Възможно е кодът да е оÑтарÑл.',
-'confirmemail_needlogin' => 'Ðеобходимо е да $1, за потвърждаване на адреÑа за електронна поща.',
-'confirmemail_success' => 'ÐдреÑÑŠÑ‚ ви за електронна поща беше потвърден. Вече можете да влезете и да Ñе наÑлаждавате на уикито.',
-'confirmemail_loggedin' => 'ÐдреÑÑŠÑ‚ ви за електронна поща беше потвърден.',
-'confirmemail_error' => 'Станала е грешка при потвърждаването на адреÑа ви.',
-'confirmemail_subject' => '{{SITENAME}} — Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща',
-'confirmemail_body' => 'ÐÑкой, вероÑтно вие, от IP-Ð°Ð´Ñ€ÐµÑ $1, е региÑтрирал потребител „$2“ в {{SITENAME}}, като е поÑочил този Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща.
+'confirmemail_invalid' => 'Грешен код за потвърждение. Възможно е кодът да е оÑтарÑл.',
+'confirmemail_needlogin' => 'Ðеобходимо е да $1, за потвърждаване на адреÑа за електронна поща.',
+'confirmemail_success' => 'ÐдреÑÑŠÑ‚ ви за електронна поща беше потвърден. Вече можете да влезете и да Ñе наÑлаждавате на уикито.',
+'confirmemail_loggedin' => 'ÐдреÑÑŠÑ‚ ви за електронна поща беше потвърден.',
+'confirmemail_error' => 'Станала е грешка при потвърждаването на адреÑа ви.',
+'confirmemail_subject' => '{{SITENAME}} — Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща',
+'confirmemail_body' => 'ÐÑкой, вероÑтно вие, от IP-Ð°Ð´Ñ€ÐµÑ $1, е региÑтрирал потребител „$2“ в {{SITENAME}}, като е поÑочил този Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща.
За да потвърдите, че Ñметката в {{SITENAME}} и наÑтоÑщиÑÑ‚ пощенÑки Ð°Ð´Ñ€ÐµÑ Ñа ваши, заредете долната препратка в браузъра Ñи:
@@ -3084,8 +3156,32 @@ $3
$5
Кодът за потвърждение ще загуби валидноÑÑ‚ Ñлед $4.',
-'confirmemail_invalidated' => 'Отменено потвърждение за електронна поща',
-'invalidateemail' => 'ОтмÑна на потвърждението за електронна поща',
+'confirmemail_body_changed' => 'ÐÑкой, вероÑтно вие, от IP Ð°Ð´Ñ€ÐµÑ $1,
+е променил Ñ Ñ‚Ð¾Ð·Ð¸ Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ‚Ð° поща, аÑоциирана Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñка Ñметка "$2" в {{SITENAME}}.
+
+За да потвърдите, че тази потребителÑка Ñметка ви принадлежи и да активирате отново функциите, Ñвързани Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ‚Ð° поща в {{SITENAME}}, отворете във Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ Ñледната връзка:
+
+$3
+
+Ðко потребителÑката Ñметка *не* ви принадлежи, молÑ, откажете потвърждението, като поÑледвате Ñледната връзка:
+
+$5
+
+ВалидноÑтта на този код за потвърждение ще важи до $4.',
+'confirmemail_body_set' => 'ÐÑкой, вероÑтно вие, от IP Ð°Ð´Ñ€ÐµÑ $1,
+е поÑочил този Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронната поща, Ñвързан Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñка Ñметка "$2" в {{SITENAME}}.
+
+За потвърждаване, че тази потребителÑка Ñметка наиÑтина ви принадлежи и за да активирате отново функциите, Ñвързани Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð° поща в {{SITENAME}}, необходимо е да отворите във Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ Ñледната препратка:
+
+$3
+
+Ðко потребителÑката Ñметка *не* ви принадлежи, можете да откажете потвърждението, като поÑледвате Ñледната препратка:
+
+$5
+
+ВалидноÑтта на този код за потвърждение изтича на $4.',
+'confirmemail_invalidated' => 'Отменено потвърждение за електронна поща',
+'invalidateemail' => 'ОтмÑна на потвърждението за електронна поща',
# Scary transclusion
'scarytranscludedisabled' => '[Включването между уикита е деактивирано]',
@@ -3125,6 +3221,7 @@ $1',
'table_pager_first' => 'Първа Ñтраница',
'table_pager_last' => 'ПоÑледна Ñтраница',
'table_pager_limit' => 'Показване на $1 запиÑа на Ñтраница',
+'table_pager_limit_label' => 'ЗапиÑи на Ñтраница:',
'table_pager_limit_submit' => 'ОтварÑне',
'table_pager_empty' => 'ÐÑма резултати',
@@ -3179,6 +3276,7 @@ $1',
'version-specialpages' => 'Специални Ñтраници',
'version-parserhooks' => 'Куки в парÑера',
'version-variables' => 'Променливи',
+'version-skins' => 'Облици',
'version-other' => 'Други',
'version-mediahandlers' => 'Обработчици на медиÑ',
'version-hooks' => 'Куки',
@@ -3190,6 +3288,13 @@ $1',
'version-hook-subscribedby' => 'Ползвана от',
'version-version' => '(ВерÑÐ¸Ñ $1)',
'version-license' => 'Лиценз',
+'version-poweredby-credits' => "Това уики Ñе задвиждва от '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'други',
+'version-license-info' => 'MediaWiki е Ñвободен Ñофтуер, можете да го разпроÑтранÑвате и/или променÑте ÑъглаÑно уÑловиÑта на GNU General Public License, както е публикуван от Free Software Foundation, верÑÐ¸Ñ 2 на лиценза или (по ваше уÑмотрение) коÑто и да е Ñледваща верÑиÑ.
+
+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 или го [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].',
'version-software' => 'ИнÑталиран Ñофтуер',
'version-software-product' => 'Продукт',
'version-software-version' => 'ВерÑиÑ',
@@ -3257,6 +3362,15 @@ $1',
'tags-edit' => 'редактиране',
'tags-hitcount' => '$1 {{PLURAL:$1|промÑна|промени}}',
+# Special:ComparePages
+'comparepages' => 'СравнÑване на Ñтраници',
+'compare-selector' => 'СравнÑване верÑиите на Ñтраници',
+'compare-page1' => 'Страница 1',
+'compare-page2' => 'Страница 2',
+'compare-rev1' => 'ВерÑÐ¸Ñ 1',
+'compare-rev2' => 'ВерÑÐ¸Ñ 2',
+'compare-submit' => 'СравнÑване',
+
# Database error messages
'dberr-header' => 'Това уики има проблем',
'dberr-problems' => 'СъжалÑваме! Сайтът изпитва техничеÑки затруднениÑ.',
@@ -3273,8 +3387,13 @@ $1',
'htmlform-float-invalid' => 'ПоÑочената ÑтойноÑÑ‚ не е чиÑло.',
'htmlform-int-toolow' => 'ПоÑочената от Ð²Ð°Ñ ÑтойноÑÑ‚ е под минимално допуÑтимата $1.',
'htmlform-int-toohigh' => 'ПоÑочената от Ð²Ð°Ñ ÑтойноÑÑ‚ Ð½Ð°Ð´Ñ…Ð²ÑŠÑ€Ð»Ñ Ð¼Ð°ÐºÑимално допуÑтимата $1.',
+'htmlform-required' => 'Тази ÑтойноÑÑ‚ Ñе изиÑква',
'htmlform-submit' => 'Изпращане',
'htmlform-reset' => 'Отказване на промените',
'htmlform-selectorother-other' => 'Друга',
+# SQLite database support
+'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на пълнотекÑтово Ñ‚ÑŠÑ€Ñене',
+'sqlite-no-fts' => '$1 без поддръжка на пълнотекÑтово Ñ‚ÑŠÑ€Ñене',
+
);
diff --git a/languages/messages/MessagesBh.php b/languages/messages/MessagesBh.php
index c1e06c50..a96d268b 100644
--- a/languages/messages/MessagesBh.php
+++ b/languages/messages/MessagesBh.php
@@ -10,6 +10,25 @@
* @author Ganesh
*/
+$namespaceNames = array(
+ NS_MEDIA => 'मीडिया',
+ NS_SPECIAL => 'विशेष',
+ NS_TALK => 'वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
+ NS_USER => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
+ NS_USER_TALK => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾_वारà¥à¤¤à¤¾',
+ NS_PROJECT_TALK => '$1_वारà¥à¤¤à¤¾',
+ NS_FILE => 'चितà¥à¤°',
+ NS_FILE_TALK => 'चितà¥à¤°_वारà¥à¤¤à¤¾',
+ NS_MEDIAWIKI => 'मीडियाविकि',
+ NS_MEDIAWIKI_TALK => 'मीडियाविकि_वारà¥à¤¤à¤¾',
+ NS_TEMPLATE => 'टेमà¥à¤ªà¤²à¥‡à¤Ÿ',
+ NS_TEMPLATE_TALK => 'टेमà¥à¤ªà¤²à¥‡à¤Ÿ_वारà¥à¤¤à¤¾',
+ NS_HELP => 'मदद',
+ NS_HELP_TALK => 'मदद_वारà¥à¤¤à¤¾',
+ NS_CATEGORY => 'शà¥à¤°à¥‡à¤£à¥€',
+ NS_CATEGORY_TALK => 'शà¥à¤°à¥‡à¤£à¥€_वारà¥à¤¤à¤¾',
+);
+
$digitTransformTable = array(
'0' => '०', # &#x0966;
'1' => '१', # &#x0967;
@@ -30,7 +49,7 @@ $messages = array(
'tog-justify' => 'पैरागà¥à¤°à¤¾à¤« जसà¥à¤Ÿà¥€à¤«à¤¾à¤ˆ',
'tog-hideminor' => 'हाल के परिवरà¥à¤¤à¤¨ में मामूली संपादन छà¥à¤ªà¤¾à¤ˆà¤‚',
'tog-numberheadings' => 'सà¥à¤µà¤¯à¤‚-सांखà¥à¤¯à¤¿à¤•à¥€ शिरà¥à¤·à¤•',
-'tog-rememberpassword' => 'ई कमà¥à¤ªà¤¯à¥à¤Ÿà¤° पर हमार खाता हर दम सकà¥à¤°à¤¿à¤¯ रहे',
+'tog-rememberpassword' => 'इ बà¥à¤°à¤¾à¤‰à¤œà¤° पर हमार पà¥à¤°à¤µà¥‡à¤¶ जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
'tog-previewonfirst' => 'पहिलका समà¥à¤ªà¤¾à¤¦à¤¨ पर पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ देखीं',
'underline-always' => 'हमेशा',
@@ -329,9 +348,10 @@ $1',
'showlivepreview' => 'सीधा पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
'showdiff' => 'परिवरà¥à¤¤à¤¨ देखाईं',
'anoneditwarning' => "'''चेतावनी:''' रउआ आपन खाता में पà¥à¤°à¤µà¥‡à¤¶ नईखीं कईले। ई पनà¥à¤¨à¤¾ के समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास पर राउर आई पी पता दरà¥à¤œ कईल जाई।",
+'anonpreviewwarning' => "''रउआ खाता में पà¥à¤°à¤µà¥‡à¤¶ नईखीं भईल। सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करेब त ई पनà¥à¤¨à¤¾ के समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास पर राउर आई पी पता दरà¥à¤œ हो जाई।\"",
'missingsummary' => "'''सà¥à¤®à¤°à¤£à¤ªà¤¤à¥à¤°:'''रउआ à¤à¤—ो सारांश के समà¥à¤ªà¤¾à¤¦à¤¨ नईखीं पà¥à¤°à¤¦à¤¾à¤¨ कईले। अगर रउआ \"फिर से सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करीं\" पर कà¥à¤²à¤¿à¤• करेब, त राउर समà¥à¤ªà¤¾à¤¦à¤¨ बिना à¤à¤—ो सारांश के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ हो जाई।",
'missingcommenttext' => 'कृपया निचे à¤à¤—ो टिपà¥à¤ªà¤£à¥€ करीं।',
-'missingcommentheader' => "'''सà¥à¤®à¤°à¤£à¤ªà¤¤à¥à¤°:''' रउआ ई टिपà¥à¤ªà¤£à¥€ खातिर कौनो विषय/शिरà¥à¤·à¤• पà¥à¤°à¤¦à¤¾à¤¨ नईखीं कईले। यदि रउआ फिर से सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करब त राउर समà¥à¤ªà¤¾à¤¦à¤¨ बिना कौनो शिरà¥à¤·à¤• के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ हो जाई।",
+'missingcommentheader' => "'''सà¥à¤®à¤°à¤£à¤ªà¤¤à¥à¤°:''' रउआ ई टिपà¥à¤ªà¤£à¥€ खातिर कौनो विषय/शिरà¥à¤·à¤• पà¥à¤°à¤¦à¤¾à¤¨ नईखीं कईले। \"{{int:savearticle}}\" यदि रउआ फिर से सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करब त राउर समà¥à¤ªà¤¾à¤¦à¤¨ बिना कौनो शिरà¥à¤·à¤• के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ हो जाई।",
'summary-preview' => 'सारांश पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨:',
'subject-preview' => 'विषय/शिरà¥à¤·à¤• पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨:',
'blockedtitle' => 'निषà¥à¤•à¥à¤°à¤¿à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
@@ -384,6 +404,8 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
मेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
'rev-delundel' => 'दिखाईं/छà¥à¤ªà¤¾à¤ˆà¤‚',
'revdel-restore' => 'दूशà¥à¤¯à¤¤à¤¾ बदलीं',
+'revdel-restore-deleted' => 'मिटल संसोधन',
+'revdel-restore-visible' => 'दृशà¥à¤¯à¤®à¤¾à¤¨ संसोधन',
'pagehist' => 'पनà¥à¤¨à¤¾ के इतिहास',
'deletedhist' => 'मिटावल इतिहास',
'revdelete-content' => 'सामगà¥à¤°à¥€',
@@ -405,6 +427,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'compareselectedversions' => 'चà¥à¤¨à¤² गईल संशोधन में अनà¥à¤¤à¤° देखीं',
'showhideselectedversions' => 'चà¥à¤¨à¤² गईल संशोधन दिखाईं/छà¥à¤ªà¤¾à¤ˆà¤‚',
'editundo' => 'पूरà¥à¤µà¤µà¤¤',
+'diff-multi' => '({{PLURAL:$1|à¤à¤—ो मधà¥à¤¯à¤® संशोधन|$1 गो मधà¥à¤¯à¤® संशोधन}} नईखे दिखावल)',
# Search results
'searchresults' => 'खोज परिणाम',
@@ -672,10 +695,12 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
# Media information
'file-nohires' => '<small> उचà¥à¤š गà¥à¤£à¤µà¤¤à¥à¤¤à¤¾ उपलबà¥à¤§ नईखे। </small>',
+'svg-long-desc' => 'à¤à¤¸ वी जी फाईल, नॉमिनलà¥à¤²à¥€ $1 x $2 पिकà¥à¤¸à¤²à¥à¤¸, फाईल के आकार $3',
'show-big-image' => 'पà¥à¤°à¤¾ गà¥à¤£à¤µà¤¤à¥à¤¤à¤¾',
'show-big-image-thumb' => '<small> इ पà¥à¤°à¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ के आकार: $1 x $2 पिकà¥à¤¸à¤²à¥à¤¸</small>',
'file-info-gif-looped' => 'लूपà¥à¤¡',
'file-info-gif-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®}}',
+'file-info-png-looped' => 'लूपà¥à¤¡',
# Bad image list
'bad_image_list' => 'फोरà¥à¤®à¥‡à¤Ÿ निमà¥à¤¨ अनà¥à¤¸à¤¾à¤° बा:
diff --git a/languages/messages/MessagesBjn.php b/languages/messages/MessagesBjn.php
new file mode 100644
index 00000000..935e5fc5
--- /dev/null
+++ b/languages/messages/MessagesBjn.php
@@ -0,0 +1,2432 @@
+<?php
+/** Bahasa Banjar (Bahasa Banjar)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Alamnirvana
+ * @author Ezagren
+ * @author J Subhi
+ */
+
+$fallback = 'id';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Garisi di bawah tautan',
+'tog-highlightbroken' => 'Bantuk tautan pagat <a href="" class="puga">nangkaya ini</a> (pilihan: nangkaya ini<a href="" class="internal">?</a>)',
+'tog-justify' => 'Ratakan paragraf',
+'tog-hideminor' => 'Sungkupakan babakan sapalih dalam parubahan tahanyar',
+'tog-hidepatrolled' => 'Sungkupakan babakan taawasi dalam parubahan tahanyar',
+'tog-newpageshidepatrolled' => 'Sungkupakan tungkaran nang diitihi matan daptar tungkaran hanyar',
+'tog-extendwatchlist' => 'Singkaiakan daptar itihan hagan manampaiakan samunyaan parubahan, kada nang hanyar haja.',
+'tog-usenewrc' => 'Purukakan panampaian parubahan tahanyar tingkat tinggi (parlu ada JavaScript)',
+'tog-numberheadings' => 'Bari numur judul utumatis',
+'tog-showtoolbar' => 'Tampaiakan bilah-pakakas babak (parlu ada JavaScript)',
+'tog-editondblclick' => 'Babak tutungkaran wan klik ganda (parlu ada JavaScript)',
+'tog-editsection' => "Kawa'akan pambabakan sub-hagian malalui tautan [babak]",
+'tog-editsectiononrightclick' => "Kawa'akan mambabak sub-hagian lawan mang-klik kanan pada judul hagian (parlu ada JavaScript)",
+'tog-showtoc' => 'Tampaiakan tabil isi (gasan tungkaran-tungkaran awan judul kapala labih pada 3)',
+'tog-rememberpassword' => 'Ingatakan babuat log ulun pada panjalajah web ini (gasan salawas $1{{PLURAL:$1|hari|hahari}})',
+'tog-watchcreations' => 'Tambahi tungkaran nang ulun ulah ka daptar itihan',
+'tog-watchdefault' => 'Tambahi tungkaran nang ulun babak ka daptar itihan ulun',
+'tog-watchmoves' => 'Tambahi tungkaran nang ulun pindah ka daptar itihan ulun',
+'tog-watchdeletion' => 'Tambahi tungkaran nang ulun hapus ka daptar itihan ulun',
+'tog-minordefault' => 'Tandai samunyaan babakan sawagai babakan sapalih sacara baku',
+'tog-previewontop' => 'Tampaiakan titilikan sabalum kutak babak',
+'tog-previewonfirst' => 'Tampaiakan titilikan pada babakan kaasa',
+'tog-nocache' => "Kada kawa'akan tambuluk panjalajahan web tungkaran",
+'tog-enotifwatchlistpages' => 'Surili ulun amun sabuah tungkaran dalam daptar itihan ulun baubah',
+'tog-enotifusertalkpages' => 'Surili ulun amun tungkaran pamandiran ulun baubah',
+'tog-enotifminoredits' => 'Surili ulun jua amun ada babakan sapalih matan tungkaran-tungkaran',
+'tog-enotifrevealaddr' => 'Timbulakan alamat suril ulun pada suril pamadahan',
+'tog-shownumberswatching' => 'Tampaiakan barapa papamuruk nang maitihi',
+'tog-oldsig' => 'Titilikan tandatangan:',
+'tog-fancysig' => 'Tapsirakan tandatangan sawagai naskah wiki (kada batautan utumatis)',
+'tog-externaleditor' => 'Puruk pambabak luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian.[http://www.mediawiki.org/wiki/Manual:External_editors More information.])',
+'tog-externaldiff' => 'Puruk palainan luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian. [http://www.mediawiki.org/wiki/Manual:External_editors More information.])',
+'tog-showjumplinks' => 'Kawa\'akan "lacung ka" tautan kakawaan-masuk',
+'tog-uselivepreview' => 'Puruk titilikan langsung (parlu ada JavaScript) (cacubaan)',
+'tog-forceeditsummary' => 'Ingatakan ulun wayah babuat sabuah kasimpulan babakan kusung',
+'tog-watchlisthideown' => 'Sungkupakan babakan ulun di daptar itihan',
+'tog-watchlisthidebots' => 'Sungkupakan babakan bot di daptar itihan',
+'tog-watchlisthideminor' => 'Sungkupakan babakan sapalih di daptar itihan',
+'tog-watchlisthideliu' => 'Sungkupakan babakan pamuruk babuat log di daptar itihan',
+'tog-watchlisthideanons' => 'Sungkupakan babakan pamuruk kada bangaran di daptar itihan',
+'tog-watchlisthidepatrolled' => 'Sungkupakan babakan taawasi di daptar itihan',
+'tog-ccmeonemails' => 'Surili ulun salinan susuril nang ulun kirim ka pamuruk lain',
+'tog-diffonly' => 'Kada usah manampaiakan isi tungkaran di bawah balain',
+'tog-showhiddencats' => 'Tampaiakan tutumbung tasungkup',
+'tog-norollbackdiff' => 'Kada usah manampaiakan lainan imbah mambulikakan',
+
+'underline-always' => 'Salalu',
+'underline-never' => 'Kada suah',
+'underline-default' => 'Default Panjalajahan web',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'Babak wilayah gaya tulisan',
+'editfont-default' => 'Default Panjalajahan web',
+'editfont-monospace' => 'Tulisan Monospace',
+'editfont-sansserif' => 'Tulisan Sans-serif',
+'editfont-serif' => 'Tulisan Serif',
+
+# Dates
+'sunday' => 'Ahat',
+'monday' => 'Sanayan',
+'tuesday' => 'Salasa',
+'wednesday' => 'Arba',
+'thursday' => 'Kemés',
+'friday' => 'Jumahat',
+'saturday' => 'Saptu',
+'sun' => 'Aha',
+'mon' => 'San',
+'tue' => 'Sal',
+'wed' => 'Arb',
+'thu' => 'Kem',
+'fri' => 'Jum',
+'sat' => 'Sap',
+'january' => 'Januari',
+'february' => 'Pibuari',
+'march' => 'Marat',
+'april' => 'April',
+'may_long' => 'Mai',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => 'Agustus',
+'september' => 'Siptimbir',
+'october' => 'Uktubir',
+'november' => 'Nupimbir',
+'december' => 'Disimbir',
+'january-gen' => 'Januari',
+'february-gen' => 'Pibuari',
+'march-gen' => 'Marat',
+'april-gen' => 'April',
+'may-gen' => 'Mai',
+'june-gen' => 'Juni',
+'july-gen' => 'Juli',
+'august-gen' => 'Agustus',
+'september-gen' => 'Siptimbir',
+'october-gen' => 'Uktubir',
+'november-gen' => 'Nopember',
+'december-gen' => 'Disimbir',
+'jan' => 'Jan',
+'feb' => 'Pib',
+'mar' => 'Mar',
+'apr' => 'Apr',
+'may' => 'Mai',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Agu',
+'sep' => 'Sip',
+'oct' => 'Ukt',
+'nov' => 'Nup',
+'dec' => 'Dis',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Tumbung|Tutumbung}}',
+'category_header' => "Tutungkaran dalam tumbung ''$1''",
+'subcategories' => 'Sub-tumbung',
+'category-media-header' => 'Média dalam tumbung "$1"',
+'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-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-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-limited' => 'Tumbung ini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
+'listingcontinuesabbrev' => 'samb.',
+'index-category' => 'Tungkaran tasusun bapadalakan kata',
+'noindex-category' => 'Tungkaran kada tasusun bapadalakan kata',
+
+'mainpagetext' => "'''MediaWiki sudah tapasang awan sukses'''.",
+'mainpagedocfooter' => 'Carii panjalasan [http://meta.wikimedia.org/wiki/Help:Contents Panduan Pamuruk] gasan mamuruk parangkat lunak wiki
+
+== Gasan bamula ==
+* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Daptar konpigurasi setélan]
+* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki nang rancak ditakunakan]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]',
+
+'about' => 'Pasal',
+'article' => 'Tungkaran isi',
+'newwindow' => '(buka di lalungkang hanyar)',
+'cancel' => 'Walangi',
+'moredotdotdot' => 'Lainnya...',
+'mypage' => 'Tungkaran ulun',
+'mytalk' => 'Pamandiran ulun',
+'anontalk' => 'Pamandiran hagan alamat IP ini',
+'navigation' => 'Napigasi',
+'and' => '&#32;wan',
+
+# Cologne Blue skin
+'qbfind' => 'Paugaian',
+'qbbrowse' => 'Tangadahi',
+'qbedit' => 'Babak',
+'qbpageoptions' => 'Tungkaran ini',
+'qbpageinfo' => 'Naskah aluran',
+'qbmyoptions' => 'Tungkaran ulun',
+'qbspecialpages' => 'Tungkaran istimiwa',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Tambahi tupik',
+'vector-action-delete' => 'Hapus',
+'vector-action-move' => 'Pindahakan',
+'vector-action-protect' => 'Lindungi',
+'vector-action-undelete' => 'Pawalangan pahapusan',
+'vector-action-unprotect' => 'Kada dilindungi',
+'vector-simplesearch-preference' => 'Kawa-akan saran panggagaian tingkat lanjut (Vector skin haja)',
+'vector-view-create' => 'Ulah',
+'vector-view-edit' => 'Babak',
+'vector-view-history' => 'Tiringi halam',
+'vector-view-view' => 'Baca',
+'vector-view-viewsource' => 'Tiringi asal mula',
+'actions' => 'Tindakan',
+'namespaces' => 'Ngarankamar',
+'variants' => 'Macam',
+
+'errorpagetitle' => 'Kasalahan',
+'returnto' => 'Bulik ka $1.',
+'tagline' => 'Matan {{SITENAME}}',
+'help' => 'Patulung',
+'search' => 'Gagai',
+'searchbutton' => 'Gagai',
+'go' => 'Tulak',
+'searcharticle' => 'Tulak',
+'history' => 'Tungkaran halam',
+'history_short' => 'Tungkaran halam',
+'updatedmarker' => 'Dihanyari tumatan ilangan pauncitan ulun',
+'info_short' => 'Panjalasan',
+'printableversion' => 'Nang kawa dicitak',
+'permalink' => 'Tautan tatap',
+'print' => 'Citak',
+'edit' => 'Babak',
+'create' => 'Ulah',
+'editthispage' => 'Babak tungkaran ini',
+'create-this-page' => 'Ulah tungkaran ini',
+'delete' => 'Hapus',
+'deletethispage' => 'Hapus tungkaran ini',
+'undelete_short' => 'Walang mahapus {{PLURAL:$1|asa babakan|$1 bababakan}}',
+'protect' => 'Lindungi',
+'protect_change' => 'ubah',
+'protectthispage' => 'Lindungi tungkaran ini',
+'unprotect' => 'Kada dilindungi',
+'unprotectthispage' => 'Kada dilindungi tungkaran ini',
+'newpage' => 'Tungkaran hanyar',
+'talkpage' => 'Pandirakan tungkaran ini',
+'talkpagelinktext' => 'Pandir',
+'specialpage' => 'Tungkaran istimiwa',
+'personaltools' => 'Pakakas surang',
+'postcomment' => 'Palih hanyar',
+'articlepage' => 'Tiringi isi tungkaran',
+'talk' => 'Pamandiran',
+'views' => 'Titiringan',
+'toolbox' => 'Wadah pakakas',
+'userpage' => 'Tiringi tungkaran pamuruk',
+'projectpage' => 'Tiringi tungkaran rangka gawian',
+'imagepage' => 'Tiringi tungkaran barakas',
+'mediawikipage' => 'Tiringi tungkaran pasan sistim',
+'templatepage' => 'Tiringi tungkaran citakan',
+'viewhelppage' => 'Tiringi tungkaran patulung',
+'categorypage' => 'Tiringi tungkaran tumbung',
+'viewtalkpage' => 'Tiringi tungkaran pamandiran',
+'otherlanguages' => 'Dalam bahasa lain',
+'redirectedfrom' => '(Diugahakan matan $1)',
+'redirectpagesub' => 'Tungkaran paugahan',
+'lastmodifiedat' => 'Tungkaran ini tauncit diubah pada $1, $2.',
+'viewcount' => 'Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.',
+'protectedpage' => 'Tungkaran nang dilindungi',
+'jumpto' => 'Malacung ka',
+'jumptonavigation' => 'napigasi',
+'jumptosearch' => 'gagai',
+'view-pool-error' => 'Ampuni, server lagi limpuar kabaratan wayah ini.
+Kabanyakan pamuruk nang handak maniringi tungkaran ini.
+Muhun hadangi ha sapandang sabalum Pian cubai pulang maungkai tungkaran ini.
+
+$1',
+'pool-timeout' => 'Habis waktu mahadangi gasan tasunduk',
+'pool-queuefull' => 'Antrian hibak',
+'pool-errorunknown' => 'Kada tahu napa nang salah',
+
+# 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' => 'Pasal {{SITENAME}}',
+'aboutpage' => 'Project:Pasal',
+'copyright' => 'Isi tasadia sasuai lawan $1.',
+'copyrightpage' => '{{ns:project}}:Hak cipta',
+'currentevents' => 'Paristiwa damini',
+'currentevents-url' => 'Project:Paristiwa damini',
+'disclaimers' => 'Panyangkalan',
+'disclaimerpage' => 'Project:Panyangkalan umum',
+'edithelp' => 'Patulung mambabak',
+'edithelppage' => 'Help:Pambabakan',
+'helppage' => 'Help:Isi',
+'mainpage' => 'Tungkaran Tatambaian',
+'mainpage-description' => 'Tungkaran Tatambaian',
+'policy-url' => 'Project:Kaaripan',
+'portal' => 'Saképéng bubuhan',
+'portal-url' => 'Project:Saképéng bubuhan',
+'privacy' => 'Kaaripan paribadi',
+'privacypage' => 'Project:Kaaripan paribadi',
+
+'badaccess' => 'Parijinan tasalah',
+'badaccess-group0' => 'Pian kadada ijin hagan malakuakan nang Pian mintai.',
+'badaccess-groups' => 'Tindakan nang Pian mintai dibatasi hagan pamuruk dalam {{PLURAL:$2|galambang|salah asa matan galambang}}: $1.',
+
+'versionrequired' => 'Parlu MediaWiki mudil $1',
+'versionrequiredtext' => 'MediaWiki mudil $1 diparluakan hagan mamuruk tungkaran ini.
+Lihati [[Special:Version|Tungkaran mudil]]',
+
+'ok' => 'OK',
+'retrievedfrom' => 'Dijumput matan "$1"',
+'youhavenewmessages' => 'Pian baisi $1 ($2)',
+'newmessageslink' => 'pasan hanyar',
+'newmessagesdifflink' => 'parubahan tauncit',
+'youhavenewmessagesmulti' => 'Pian baisi pasan hanyar dalam $1',
+'editsection' => 'babak',
+'editold' => 'babak',
+'viewsourceold' => 'tiringi asal mulanya',
+'editlink' => 'babak',
+'viewsourcelink' => 'tiringi asal mulanya',
+'editsectionhint' => 'Babak hagian: $1',
+'toc' => 'Isi',
+'showtoc' => 'tampaiakan',
+'hidetoc' => 'sungkupakan',
+'thisisdeleted' => 'Tiringi atawa mambulikakan $1?',
+'viewdeleted' => 'Tiringi $1?',
+'restorelink' => '$1 {{PLURAL:$1|babakan|babakan}} nang sudah dihapus',
+'feedlinks' => 'Kitihan',
+'feed-invalid' => 'Macam pamintaan kitihan kada pas.',
+'feed-unavailable' => 'Kitihan sindikasi kadada',
+'site-rss-feed' => 'Kitihan RSS $1',
+'site-atom-feed' => 'Kitihan Atum $1',
+'page-rss-feed' => "Kitihan RSS ''$1''",
+'page-atom-feed' => "Kitihan Atum ''$1''",
+'red-link-title' => '$1 (tungkaran baluman ada)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Tungkaran',
+'nstab-user' => 'Pamuruk',
+'nstab-media' => 'Média',
+'nstab-special' => 'Tungkaran istimiwa',
+'nstab-project' => 'Tungkaran rangka gawian',
+'nstab-image' => 'Barakas',
+'nstab-mediawiki' => 'Pasan',
+'nstab-template' => 'Citakan',
+'nstab-help' => 'Patulung',
+'nstab-category' => 'Tumbung',
+
+# Main script and global functions
+'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}}.',
+'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}}]].',
+
+# General errors
+'error' => 'Kasalahan',
+'databaseerror' => 'Kasalahan Basisdata',
+'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
+Kasalahan ini pina manandai adanya sabuah bug dalam parangkat lunak.
+Parmintaan basisdata yang tadudi adalah:
+<blockquote><tt>$1</tt></blockquote>
+matan dalam pungsi "<tt>$2</tt>".
+Basisdata kasalahan babulik "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'Ada kasalahan sintaks pada parmintaan basisdata.
+Parmintaan basisdata nang tadudi adalah:
+"$1"
+matan dalam pungsi "$2".
+Basisdata kasalahan babulik "$3: $4".',
+'laggedslavemode' => "'''Paringatan:''' Tungkaran ini 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.
+
+Pambakal nang manyunduk mamadahi nangkaini: $1',
+'missing-article' => 'Basisdata kada ulihan manggagai kata matan tungkaran nang saharusnya ada, bangaran "$1" $2.
+
+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',
+'missingarticle-rev' => '(ralatan#: $1)',
+'missingarticle-diff' => '(Lain: $1, $2)',
+'readonly_lag' => 'Basisdata sudah utumatis tasunduk pas server basisdata dua lagi marungkuti basisdata tatambaian',
+'internalerror' => 'Kasalahan di dalam',
+'internalerror_info' => 'Kasalahan di dalam: $1',
+'fileappenderrorread' => 'Kada kawa mambaca "$1" parhatan manambahi.',
+'fileappenderror' => 'Kada kawa mamasukakan "$1" ka "$2".',
+'filecopyerror' => 'Kada kawa manyalin "$1" ka "$2".',
+'filerenameerror' => 'Kada kawa maubah ngaran barakas "$1" manjadi "$2".',
+'filedeleteerror' => 'Kada kawa mahapus barakas "$1".',
+'directorycreateerror' => 'Kada kawa maulah direktori "$1".',
+'filenotfound' => 'Kada kawa maugai barakas "$1".',
+'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.',
+'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
+'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.',
+'perfcachedts' => 'Data nang dudi ini adalah timbuluk, wan tauncit dihahanyari pada $1.',
+'querypage-no-updates' => 'Pamugaan matan tungkaran ini 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',
+'viewsourcefor' => 'gasan $1',
+'actionthrottled' => 'Kalakuan dikiripi',
+'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ini.
+Muhun cubai pulang dalam babarapa minit.',
+'protectedpagetext' => 'Tungkaran ini sudah dilindungi hagan mancagah babakan.',
+'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ini:',
+'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 pamuruk lain.
+Gasan tarjamahan, muhun puruk [http://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',
+'namespaceprotected' => "Pian kada baisi ijin hagan mambabak tutungkaran dalam ngaran kamar '''$1'''.",
+'customcssjsprotected' => 'Pian kada baisi ijin hagan mambabak tungkaran ini, karana ini mangandung setélan paribadi pamuruk lain.',
+'ns-specialprotected' => 'Tungkaran istimiwa kada kawa dibabak',
+'titleprotected' => "Judul ini dilindungi matan paulahan ulih [[User:$1|$1]].
+Alasan nang dibariakan adalah ''$2''.",
+
+# Virus scanner
+'virus-badscanner' => "Konpigurasi buruk: pamindai virus kada dipinandui: ''$1''",
+'virus-scanfailed' => 'Pamindaian kada bakulihan (kudi $1)',
+'virus-unknownscanner' => 'Antivirus kada dipinandui:',
+
+# Login and logout pages
+'logouttext' => "'''Pian parhatan ini sudah kaluar log.'''
+
+Pian kawa manyambung hagan mamuruk {{SITENAME}} kada bangaran, atawa Pian kawa [[Special:UserLogin|babuat log pulang]] sawagai pamuruk nang sama atawa sawagai pamuruk balain.
+Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
+'welcomecreation' => '==Salamat datang, $1!==
+Akun Pian sudah diulah.
+Jangan kada ingat hagan maubah [[Special:Preferences|preferensi {{SITENAME}}]] Pian.',
+'yourname' => 'Ngaran pamuruk',
+'yourpassword' => 'Katasunduk:',
+'yourpasswordagain' => 'Katik pulang katasunduk:',
+'remembermypassword' => 'Ingatan log babuat ulun dalam komputer ini (salawas $1{{PLURAL:$1|hari|hari}})',
+'securelogin-stick-https' => 'Bagana tasambung awan HTTPS imbah babuat-log',
+'yourdomainname' => 'Dumain Pian:',
+'externaldberror' => 'Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.',
+'login' => 'Babuat',
+'nav-login-createaccount' => 'Babuat log / ulah akun',
+'loginprompt' => "Pian harus mengaktipakan ''cookies'' hagan kawa babuat log ka {{SITENAME}}.",
+'userlogin' => 'Babuat log / ulah akun',
+'userloginnocreate' => 'Babuat log',
+'logout' => 'Kaluar',
+'userlogout' => 'Kaluar',
+'notloggedin' => 'Balum babuat log',
+'nologin' => 'Kada baisi sabuah akun? $1.',
+'nologinlink' => 'Daptarkan akun hanyar',
+'createaccount' => 'Ulah akun',
+'gotaccount' => 'Sudah baisi sabuah akun? $1.',
+'gotaccountlink' => 'Babuat log',
+'createaccountmail' => 'Lung suril',
+'createaccountreason' => 'Alasan:',
+'badretype' => 'Katasunduk nang Pian buati kada pas.',
+'userexists' => 'Ngaran pamuruk nang dibuati sudah dipuruk.
+Muhun pilih sabuah ngaran lain.',
+'loginerror' => 'Kasalahan babuat log',
+'createaccounterror' => 'Kada kawa maulah akun: $1',
+'nocookiesnew' => "Akun pamuruk sudah diulah, tagal Pian kada babuat log lagi.
+{{SITENAME}} mamuruk ''cookies'' hagan pamuruk babuat log.
+''Cookies'' Pian lagi kada kawa.
+Muhun kawa'akan nangitu, hanyar babuat log awan ngaran pamuruk hanyar wan katasunduk Pian.",
+'nocookieslogin' => "{{SITENAME}} mamuruk ''cookies'' hagan pamuruk babuat log.
+''Cookies'' Pian lagi kada kawa.
+Muhun kawa'akan nang itu wan cubai pulang.",
+'noname' => 'Ngaran pamuruk nang Pian ajuakan kada sah.',
+'loginsuccesstitle' => 'Kulihan babuat log',
+'loginsuccess' => "'''Pian parhatan ini babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
+'nosuchuser' => 'Kadada pamuruk bangaran "$1".
+Ngaran pamuruk adalah kasus marinci.
+Lihati pulang ijaan, atawa [[Special:UserLogin/signup|ulah sabuah akun hanyar]]',
+'nosuchusershort' => 'Kadada pamuruk bangaran "<nowiki>$1</nowiki>".
+Lihati pulang hijaan Pian.',
+'nouserspecified' => "Pian harus ma'ajuakan sabuah ngaran pamuruk.",
+'login-userblocked' => 'Pamuruk ini diblukir. Babuat log kada dibulihakan.',
+'wrongpassword' => 'Kada sunduk kada bujur nang dibuati.
+Muhun cubai pulang.',
+'wrongpasswordempty' => 'Kata sunduk nang dibuati kusung.
+Muhun cubai pulang.',
+'passwordtooshort' => 'Kata sunduk musti paling sadikit {{PLURAL:$1|1 karaktir|$1 karaktir}}.',
+'password-name-match' => 'Kata sunduk Pian musri aabida lawan ngaran pamuruk Pian.',
+'password-login-forbidden' => 'Mamuruk ngaran wan katasunduk nangini sudah dtangati.',
+'mailmypassword' => 'Kirimi kata sunduk hanyar',
+'passwordremindertitle' => 'Kata sunduk samantara gasan {{SITENAME}}',
+'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah katasunduk hanyar gasan {{SITENAME}} ($4). sabuah katasunduk samantara gasan pamuruk "$2" sudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Katasunduk samantara Pian akan kadaluarsa dalam {{PLURAL:$5|satu hari|$5 hahari}}.
+
+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 mamuruk katasunduk lawas Pian.',
+'noemail' => 'Kadada alamat suril tarakam gasan pamuruk "$1".',
+'noemailcreate' => 'Pian parlu manyadiakan sabuah alamat suril nang sah',
+'passwordsent' => 'Sabuah kata sunduk hanyar sudah dikirim ka suril tadaptar gasan "$1".
+muhun babuat log pulang habis Pian manarima nangini.',
+'blocked-mailpassword' => 'Alamat IP Pian diblukir hagan mambabak, wan kada dibulihakan mamuruk pungsi pamulihan kata sunduk hagan mancagah salah puruk.',
+'eauthentsent' => 'Sabuah suril peyakinan sudah dikirim ka alamat suril.
+Sabalum ada suril lain nang takirim ka akun, Pian akan parlu maumpati anjuran dalam suril nangitu, hagan mayakinakan bahwasanya akun nangitu bujur-bujur ampun Pian.',
+'throttled-mailpassword' => 'Sabuah pangingat kata sunduk sudah takirim, dalam {{PLURAL:$1|jam|$1 jam}} tauncit. Hagan mancagah salah puruk, asa pangingat kata sunduk haja nang dikirim satiap {{PLURAL:$1|jam|$1 jam}}.',
+'mailerror' => 'Kasalahan pangiriman suril: $1',
+'acct_creation_throttle_hit' => 'Pailang wiki nangini mamuruk alamat IP Pian sudah maulah {{PLURAL:$1|1 akun|$1 akun}} dalam asa harian ini, dimana nangitu jumlah paling banyak nang diijinakan. Sawagai kulihan, pailang awan alamat IP nangini kada kawa maulah akun pulang samantara.',
+'emailauthenticated' => 'Alamat suril Pian cucuk pada $2, $3',
+'emailnotauthenticated' => 'Alamat suril Pian baluman dicucukan.
+Kadada suril nang akan dikirim maumpati pitur.',
+'noemailprefs' => 'Ajuakan sabuah alamat suril dalam kakatujuan Pian gasan pitur-pitur ini bagawi.',
+'emailconfirmlink' => 'Yakinakan alamat suril Pian',
+'invalidemailaddress' => 'Alamat suril ini kada kawa ditarima karana pormat kada sah.
+Muhun buati sabuah alamat suril nang bujur pormatnya atawa kusungakan haja isian itu.',
+'accountcreated' => 'Akun diulah',
+'accountcreatedtext' => 'Akun pamuruk 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.
+
+Pian kawa kada mahual pasan ini, amun paulahan akun ini adalah kasalahan.',
+'usernamehasherror' => 'Ngaran pamuruk kada kawa mangandung tanda kurung',
+'login-throttled' => 'Pian sudah kabanyakan mancuba babuat log.
+Muhun hadangi dahulu sapandang hanyar cubai pulang.',
+'loginlanguagelabel' => 'Bahasa: $1',
+'suspicious-userlogout' => 'Parmintaan Pian hagan kaluar log kada ditarima karana nangkaya dikirim matan panjalajah web rakai atawa tatangkap proxy.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Kasalahan kada dipinandui dalam pungsi surat () PHP',
+
+# Password reset dialog
+'resetpass' => 'Ubah katasunduk',
+'resetpass_announce' => 'Pian babuat log awan sabuah kudi samantara nang disurili.
+Hagan manuntungakan babuat log, Pian musti manyetel sabuah katasunduk hanyar di sia:',
+'resetpass_header' => 'Ubah katasunduk akun',
+'oldpassword' => 'Katasunduk lawas:',
+'newpassword' => 'Katasunduk hanyar:',
+'retypenew' => 'Katik pulang katasunduk hanyar:',
+'resetpass_submit' => 'Setel katasunduk wan babuat log',
+'resetpass_success' => 'Katasunduk Pian bahasil diubah!
+Wayah ini 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.
+Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasunduk samantara hanyar.',
+'resetpass-temp-password' => 'Katasunduk samantara:',
+
+# Edit page toolbar
+'bold_sample' => 'Naskah kandal',
+'bold_tip' => 'Naskah kandal',
+'italic_sample' => 'Naskah hiring',
+'italic_tip' => 'Naskah hiring',
+'link_sample' => 'Judul tautan',
+'link_tip' => 'Tautan dalam',
+'extlink_sample' => 'http://www.example.com judul tautan',
+'extlink_tip' => 'Tautan luar (Ingatakan bamula wan http://)',
+'headline_sample' => 'Naskah judul',
+'headline_tip' => 'Judul tingkat 2',
+'math_sample' => 'Masukakan rumus di sia',
+'math_tip' => 'Rumus matamatika (LaTeX)',
+'nowiki_sample' => 'Masukakan naskah kada babantuk di sia',
+'nowiki_tip' => 'Halinakan pambantukan/purmat wiki',
+'image_tip' => "Maktub'akan barakas",
+'media_tip' => 'Tautan barakas',
+'sig_tip' => 'Tandatangan Pian lawan tanda waktu',
+'hr_tip' => 'Garis horisontal',
+
+# Edit pages
+'summary' => 'Kasimpulan:',
+'subject' => 'Subyek/judul:',
+'minoredit' => 'Ini adalah babakan sapalih',
+'watchthis' => 'Itihi tungkaran ini',
+'savearticle' => 'Simpan tungkaran',
+'preview' => 'Tilik',
+'showpreview' => 'Tampaiakan titilikan',
+'showlivepreview' => 'Titilikan langsung',
+'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.''",
+'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.
+Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
+'summary-preview' => 'Tilikan kasimpulan:',
+'subject-preview' => 'Titilikan subyek/judul:',
+'blockedtitle' => 'Pamuruk diblukir',
+'blockedtext' => "'''Ngaran pamuruk Pian atawa alamat IP sudah diblukir.'''
+
+Pamblukiran diulah ulih $1.
+Alasannya ''$2''.
+
+* Mulai diblukir: $8
+* Kadaluarsa blukir: $6
+* Tujuan pamblukiran: $7
+
+Pian kawa mangiwau $1 atawa nang lain [[{{MediaWiki:Grouppage-sysop}}|pambakal]] hagan mamandirakan pamblukiran nangini.
+Pian kada kawa mamuruk pitur 'surili pamuruk ini' amun kadada sabuah alamat suril nang sah nang diajukan dalam [[Special:Preferences|kakatujuan akun]] Pian wan Pian kada lagi diblukir mamuruk nangini.
+Alamat IP Pian parhatan ini $3, wan ID nang diblukir adalah $5.
+Muhun sampaiakan samunyaan rarinci di atas dalam parmintaan nag Pian ulah.",
+'autoblockedtext' => "Alamat IP Pian sudah utumatis diblukir karana dipuruk ulih pamuruk lain, nang diblukir ulih $1.
+Alasannya: ''$2''.
+
+* Mulai diblukir: $8
+* Kadaluarsa blukir: $6
+* Tujuan pamblukiran: $7
+
+Pian kawa mangiwau $1 atawa nang lain [[{{MediaWiki:Grouppage-sysop}}|pambakal]] hagan mamandirakan pamblukiran nangini.
+
+Catatan Pian kada kawa mamuruk pitur 'surili pamuruk ini' amun kadada sabuah alamat suril nang sah nang tadaptar dalam [[Special:Preferences|kakatujuan akun]] Pian wan Pian kada lagi diblukir mamuruk nangini.
+
+Alamat IP Pian parhatan ini $3, wan ID nang diblukir adalah $5.
+Muhun sampaiakan samunyaan rarinci di atas dalam parmintaan nag Pian ulah.",
+'blockednoreason' => 'kadada alasan nang diunjukakan',
+'blockedoriginalsource' => "Asal mula matan '''$1''' ditampaiakan di bawah:",
+'blockededitsource' => "Naskah nang '''babakan Pian''' awan '''$1''' ditampaiakan di bawah:",
+'whitelistedittitle' => 'Parlu babuat log hagan mambabak',
+'whitelistedittext' => 'Pian harus $1 hagan mambabak tungkaran.',
+'confirmedittext' => 'Pian musti mayakinakan alamat suril Pian sabalum mambabak tungkaran-tungkaran. Muhun disetel wan disakakan alamat suril Pian tumatan [[Special:Preferences|kakatujuan pamuruk]] Pian.',
+'nosuchsectiontitle' => 'Hagian kada tadapat',
+'nosuchsectiontext' => 'Pian habis mancuba mambabak sabuting hagian nang kadada.
+Pinanya ini sudah diugahakan atawa dihapus parhatan Pian maniringi tungkaran nangitu.',
+'loginreqtitle' => 'Parlu babuat log',
+'loginreqlink' => 'Babuat log',
+'loginreqpagetext' => 'Pian musti $1 hagan maniringi rungkaran-tungkaran lain.',
+'accmailtitle' => 'Katasunduk takirim.',
+'accmailtext' => "Sabuah katasunduk babarang gasan [[User talk:$1|$1]] sudah dikirim ka $2.
+
+Katasunduk gasan pamuruk 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.
+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,
+<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,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>.',
+'userpage-userdoesnotexist' => 'Akun pamuruk "$1" kada tadaptar.
+Muhun pariksa amun Pian handak maulah/mambabak tungkaran ini.',
+'userpage-userdoesnotexist-view' => 'Akun pamuruk "$1" kada tadaptar.',
+'blocked-notice-logextract' => 'Pamuruk nangini parhatan ini diblukir.
+Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
+'clearyourcache' => "'''Catatan: Habis manyimpan, Pian harus malingarakan cache panjalajah web Pian hagan malihat parubahan.'''
+'''Mozilla/Firefox/Safari:''' tahan ''Shift'' parhatan klik ''Reload'', atawa picik ''Ctrl-F5'' atawa ''Ctrl-R'' (''Command-R'' pada sabuah Macintosh);
+'''Opera:''' barasihakan cache pada ''Tools → Preferences'';
+'''Internet Explorer:''' tahan ''Ctrl'' parhatan klik ''Refresh,'' atawa picik ''Ctrl-F5''.",
+'usercssyoucanpreview' => "'''Tip:''' Puruk picikan \"{{int:showpreview}}\" hagan tis CSS hanyar Pian sabalum manyimpan.",
+'userjsyoucanpreview' => "'''Tip:''' Puruk picikan \"{{int:showpreview}}\" hagan tis JavaScript hanyar Pian sabalum manyimpan.",
+'usercsspreview' => "'''Ingatakan bahwasa Pian manilik pamuruk CSS Pian haja.'''
+'''Nangini baluman tasimpan pulang!'''",
+'userjspreview' => "'''Ingatakan bahwasa Pian tis/manilik pamuruk JavaScript Pian.'''
+'''Nangini baluman tasimpan pulang!'''",
+'sitecsspreview' => "'''Ingatakan bahwasa Pian manilik CSS ini haja.'''
+'''Nangini lagi baluman tasimpan!'''",
+'sitejspreview' => "'''Ingatakan bahwasa Pian manilik JavaScript code ini haja.'''
+'''Nangini lagi baluman tasimpan!'''",
+'userinvalidcssjstitle' => "'''Paringatan:''' Kadada kulit \"\$1\".
+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!'''",
+'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.
+Amun magun kada kulihan, cubai [[Special:UserLogout|kaluar log]] wan imbah itu babuat log pulang.",
+'session_fail_preview_html' => "'''Kami kada kawa manarusakan babakan Pian karana kahilangan wayah data.'''
+
+''Marga {{SITENAME}} mangkawa'akan HTML mantah, titilikan disungkupakan sawagai pancahagahan sarangan Javascript.''
+
+'''Amun nangini adalah sabuah parcubaan babakan nang sabujurnya, muhun cubai lagi.'''
+Amun ini masih haja kada bagawi, cubai [[Special:UserLogout|kaluar log]] wan babuat log pulang.",
+'token_suffix_mismatch' => "'''Babakan Pian sudah kada ditarima karana aplikasi Pian mahancuri tanda baca pada babakan token.'''
+Babakan ini kada ditarima hagan mancagah kasalahan pada naskah tungkaran.
+Nangini ambahanu tajadi amun Pian mamuruk sabuah layanan proxy buggy bapandal web kada bangaran.",
+'editing' => 'Mambabak $1',
+'editingsection' => 'Mambabak $1 (hagian)',
+'editingcomment' => 'Mambabak $1 (hagian hanyar)',
+'editconflict' => 'Babakan bacakut: $1',
+'explainconflict' => "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian mula mambabak ini.
+Naskah atas baisi naskah tungkaran sawagai dimapa ini ada hahanyaran ini.
+Parubahan Pian ditampaiakan pada naskah di bawah.
+Pian pinanya harus manggabungakan parubahan Pian ka dalam naskah nang ada.
+Naskah nang di atas '''haja''' nang akan tasimpan amung Pian manikin \"{{int:savearticle}}\".",
+'yourtext' => 'Naskah Pian',
+'storedversion' => 'Ralatan tasimpan',
+'nonunicodebrowser' => "'''Paringatan: Panjalajah web Pian kada manyukung unicode.'''
+Sabuah pambulatan gawian di wadah ini mambulihakan Pian aman mambabak tutungkaran: karaktir non-ASCII akan cungul pada kutak babakan sawagai kudi hiksadisimal.",
+'editingold' => "'''Paringatan: Pian lagi mambabak ralatan lawas matan tungkaran ini.'''
+Amun Pian manyimpan ini, babarapa paparubahan dulah imbah ralatan nangini akan tanggal.",
+'yourdiff' => 'Nang balain',
+'copyrightwarning' => "Muhun dicatat bahwasanya samunyaan sumbangan ka {{SITENAME}} adalah sudah dipartimbangkan disabarakan di bawah $2 (lihati $1 gasan rincian). Amun Pian kada handak tulisan Pian dibabak wan disabarakan, kada usah mangirim ini ka sia. <br />
+Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini matan sabuah asal mula ampun umum atawa asal mula lainnya nang samacam.
+'''Jangan kirimkan gawian bahak cipta kada baijin!'''",
+'copyrightwarning2' => "Muhun dicatat bahwasanya samunyaan sumbangan ka {{SITENAME}} kawa dibabak, diubah, atawa dibuang awan panyumbang lainnya.
+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.'''
+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.
+
+Pambakal nang manyunduk manjalasakan kaini: $1",
+'protectedpagewarning' => "'''Paringatan: Tungkaran ini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal nang kawa mambabak ini.'''
+Log masuk pauncitan disadiakan di bawah gasan rujukan:",
+'semiprotectedpagewarning' => "'''Catatan:''' Tungkaran ini sudah dilindungi laluai pamuruk tadaptar haja nang kawa mambabak.
+Log masuk pauncitan disadiakan di bawah gasan rujukan:",
+'cascadeprotectedwarning' => "'''Paringatan:''' Tungkaran ini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal haja nang kawa mambabak, karana ini tamasuk dalam baumpat parlindungan barénténg {{PLURAL: $1|tungkaran|tutungkaran}}:",
+'titleprotectedwarning' => "'''Paringatan: Tungkaran ini sudah dilindungi laluai [[Special:ListGroupRights|hak khas]] diparluakan hagan maulah ini.'''
+Log masuk pauncitan disadiakan di bawah gasan rujukan:",
+'templatesused' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di tungkaran ini:',
+'templatesusedpreview' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di titilikan ini:',
+'templatesusedsection' => "{{PLURAL:$1|Citakan|Cicitakan}} nang diguna'akan di hagian ini:",
+'template-protected' => '(dilindungi)',
+'template-semiprotected' => '(semi-dilindungi)',
+'hiddencategories' => 'Tungkaran ini adalah angguta matan {{PLURAL:$1|1 tumbung tasungkup|$1 tumbung tasungkup}}:',
+'nocreatetitle' => 'Maulah tungkaran dibatasi',
+'nocreatetext' => '{{SITENAME}} lagi mambatasi kakawaan maulah tungkaran hanyar.
+Pian kawa babulik wan mambabak sabuah tungkaran nag ada, atawa [[Special:UserLogin|lbabuat log atawa baulah sabuah akun]]',
+'nocreate-loggedin' => 'Pian kada baisi ijin hagan maulah tungkaran-tungkaran hanyar.',
+'sectioneditnotsupported-title' => 'Pambabakan hagian kada didukung',
+'sectioneditnotsupported-text' => 'Pambabakan hagian kada didukung pada tungkaran ini.',
+'permissionserrors' => 'Parijinan tasalah',
+'permissionserrorstext' => 'Pian kada baisi ijin gasan malakuakan itu, karana {{PLURAL:$1|alasan|alasan}} ini:',
+'permissionserrorstext-withaction' => 'Pian kada baisi ijin gasan $2, karana {{PLURAL:$1|alasan|alasan}} ini:',
+'recreate-moveddeleted-warn' => "'''Paringatan: Pian maulah pulang sabuah tungkaran nang sabalumnya dihapus.'''
+
+Pian partimbangakan dahulu sasuaikah hagan manarusakan pambabakan tungkaran ini.
+Log pahapusan wan paugahan gasan tungkaran ini disadiakan di sia:",
+'moveddeleted-notice' => 'Tungkaran ini sudah dihapus.
+Log pahapusan wan paugahan gasan tungkaran ini disadiakan di bawah ini gasan rujukan.',
+'log-fulllog' => 'Tiringi samunyaan log',
+'edit-hook-aborted' => 'Babakan ditinggalakan ulih kakait parser.
+Ini kadada panjalasan.',
+'edit-gone-missing' => 'Kada kawa mamutakhirakan tungkaran ini.
+Ini cungul pinanya sudah tahapus.',
+'edit-conflict' => 'Babakan bacakut.',
+'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.',
+
+# Parser/template warnings
+'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
+
+Nangini harusnya takurang matan $2 {{PLURAL:$2|kiauan|kiauan-kiauan}}, ada {{PLURAL:$1|wayah ini $1 kiauan|wayah ini $1 kiauan-kiauan}}.",
+'expensive-parserfunction-category' => 'Tungkaran-tungkaran awan pungsi parser kiauan-kiauan kabanyakan',
+'post-expand-template-inclusion-warning' => "'''Paringatan:''' Citakan nang diumpatakan takarannya kaganalan.
+Babarapa citakan akan kada taumpatakan.",
+'post-expand-template-inclusion-category' => 'Tungkaran-tungkaran nang citakan baumpat limpuar',
+'post-expand-template-argument-warning' => "'''Paringatan:''' Tungkaran ini mangandung paling kada sabuah kalimat citakan wan ukuran panyingkaiannya kaganalan. Kalimat-kalimat nangitu sudah diabaiakan.",
+'post-expand-template-argument-category' => 'Tungkaran-tungkaran nang mangandung kalimat-kalimat citakan diabaiakan',
+'parser-template-loop-warning' => 'Citakan baulang takantup: [[$1]]',
+'parser-template-recursion-depth-warning' => 'Citakan batas kadalaman recursi limpuar ($1)',
+'language-converter-depth-warning' => 'Batas kadalaman pakonversi bahasa limpuar ($1)',
+
+# "Undo" feature
+'undo-success' => 'Babakan kawa diwalangi.
+Muhun pariksa panandingan di bawah hagan mayakinakan ini apa nang Pian handak gawi, wan imbah itu simpan parubahan di bawah hagan manuntungakan pawalangan babakan.',
+'undo-failure' => 'Babakan ini kada kawa diwalangi karana ada cakutan di tangah babakan-babakan.',
+'undo-norev' => 'Babakan kada kawa diwalangi karana ini kadada atawa tahapus.',
+'undo-summary' => 'â†Mawalangakan ralatan $1 ulih [[Special:Contributions/$2|$2]] ([[User talk:$2|Pandir]])',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Akun kada kawa diulah',
+'cantcreateaccount-text' => "Paulahan akun matan alamat IP ('''$1''') sudah diblukir ulih [[User:$3|$3]].
+
+Alasan nang dibari ulih $3 adalah ''$2''",
+
+# History pages
+'viewpagelogs' => 'Tiringi log tungkaran ini',
+'nohistory' => 'Kadada halam babakan gasan tungkaran ini.',
+'currentrev' => 'Ralatan pahabisannya',
+'currentrev-asof' => 'Ralatan pahanyarnya pada $1',
+'revisionasof' => 'Ralatan matan $1',
+'revision-info' => 'Ralatan pada $1 ulih $2',
+'previousrevision' => 'â†Ralatan talawas',
+'nextrevision' => 'Ralatan salanjutnya→',
+'currentrevisionlink' => 'Ralatan wayahini',
+'cur' => 'dmn',
+'next' => 'dudi',
+'last' => 'sblm',
+'page_first' => 'Panambaian',
+'page_last' => 'Pauncitan',
+'histlegend' => "Pilihan mananding: tandai kutak-kutak radiu ralatan-ralatan nang handak ditanding wan picik enter atawa picikan di bawah.<br />Legend: '''({{int:cur}})''' =lainnya awan ralatan pahanyarnya, '''({{int:last}})''' = lainnya awan ralatan sabalumnya, '''{{int:minoreditletter}}''' = babakan sapalih.",
+'history-fieldset-title' => 'Tangadahi halam',
+'history-show-deleted' => 'Nang dihapus haja',
+'histfirst' => 'Palawasnya',
+'histlast' => 'Pahanyarnya',
+'historysize' => '($1 {{PLURAL:$1|bita|bibita}})',
+'historyempty' => '(kusung)',
+
+# Revision feed
+'history-feed-title' => 'Ralatan halam',
+'history-feed-description' => 'Ralatan halam gasan tungkaran ini pada wiki',
+'history-feed-item-nocomment' => '$1 wayah $2',
+'history-feed-empty' => 'Tungkaran nang diminta kadada.
+Ini pinanya sudah dihapus matan wiki ini, atawa dingarani lain.
+Cubai [[Special:Search|gagai di wiki ini]] gasan tungkaran hanyar bakarabat.',
+
+# Revision deletion
+'rev-deleted-comment' => '(kasimpulan babakan dibuang)',
+'rev-deleted-user' => '(ngaran pamuruk dibuang)',
+'rev-deleted-event' => '(log palakuan dibuang)',
+'rev-deleted-user-contribs' => '[ngaran pamuruk atawa alamat IP dibuang - babakan disungkupakan matan daptar sumbangan]',
+'rev-deleted-text-permission' => "Ralatan tungkaran ini sudah '''dihapus'''.
+Rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].",
+'rev-deleted-text-unhide' => "Ralatan tungkaran ini sudah '''dihapus'''.
+Rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].
+Sawagai pambakal Pian masih kawa [$1 maniringi ralatan ini] amun Pian hakun manarusakan.",
+'rev-suppressed-text-unhide' => "Ralatan tungkaran ini sudah '''ditikin'''.
+Rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log panikinan].
+Sawagai pambakal Pian masih kawa [$1 maniringi ralatan ini] amun Pian hakun manarusakan.",
+'rev-deleted-text-view' => "Ralatan tungkaran ini sudah '''dihapus'''.
+Sawagai saurang pambakal Pian kawa maniringi ini, rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].",
+'rev-suppressed-text-view' => "Ralatan tungkaran ini sudah '''ditikin'''.
+Sawagai saurang pambakal Pian kawa maniringi ini, rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log panikinan].",
+'rev-deleted-no-diff' => "Pian kada kawa maniringi nang balain ini karana asa matan ralatan-ralatan sudah '''dihapus'''.
+Rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].",
+'rev-suppressed-no-diff' => "Pian kada kawa maniringi nang balain ini karana asa matan ralatan-ralatan sudah '''dihapus'''.",
+'rev-deleted-unhide-diff' => "Asa matan ralatan-ralatan nang balain ini sudah '''dihapus'''.
+Rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].
+Sawagai pambakal Pian masih kawa [$1 maniringi nang balain ini] amun Pian hakun manarusakan.",
+'rev-suppressed-unhide-diff' => "Asa matan ralatan-ralatan nang balain ini sudah '''ditikin'''.
+Rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log panikinan].
+Sawagai pambakal Pian masih kawa [$1 maniringi nang balain ini] amun Pian hakun manarusakan.",
+'rev-deleted-diff-view' => "Asa matan ralatan-ralatan nang balain ini sudah '''dihapus'''.
+Sawagai saurang pambakal Pian kawa nang balain ini; rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].",
+'rev-suppressed-diff-view' => "Asa matan ralatan-ralatan nang balain ini sudah '''ditikin'''.
+Sawagai saurang pambakal Pian kawa nang balain ini; rarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log panikinan].",
+'rev-delundel' => 'tampaiakan/sungkupakan',
+'rev-showdeleted' => 'tampaiakan',
+'revisiondelete' => 'Hapus/kada mahapus ralatan-ralatan',
+'revdelete-nooldid-title' => 'Ralatan nag dituju kada sah',
+'revdelete-nooldid-text' => 'Pian kada maajuakan sabuah ralatan(-ralatan) tatuju hagan malakuakan pungsi ini, ralatan nang dituju kadada, atawa Pian mancuba manyungkupakan ralatan parhatan ini.',
+'revdelete-nologtype-title' => 'Kadada macam log dibari',
+'revdelete-nologtype-text' => 'Pian kada maajuakan sabuah macam log hagan malakuakan palakuan ini.',
+'revdelete-nologid-title' => 'Log buat kada sah',
+'revdelete-nologid-text' => 'Pian kada maajuakan sabuah log kajadian tatuju hagan malakuakan pungsi ini atawa buat nang diajuakan kadada.',
+'revdelete-no-file' => 'Barakas nang diajuakan kadada.',
+'revdelete-show-file-confirm' => 'Pian bujurkah handak maniringi sabuah ralatan tahapus matan barakas "<nowiki>$1</nowiki>" $2 pada $3?',
+'revdelete-show-file-submit' => 'Iya-ai',
+'revdelete-selected' => "'''{{PLURAL:$2|Ralatan tapilih|Raralatan tapilih}} matan [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Log kajadian tapilih|Log kakajadian tapilih}}:'''",
+'revdelete-text' => "'''Raralatan tahapus wan kakajadian akan magun cungul dalam halam tungkaran wan log, tagal hagian matan isinya akan kada kawa diungkai umum.'''
+Pambakal lain pada {{SITENAME}} akan magun kawa maungkai isi tasungkup wan kawa mambulikakan hapusan pulang mangguna'akan antarmuha sama, kacuali ada panambahan pahalatan lain nang disetél.",
+'revdelete-confirm' => 'Muhun yakinakan bahwasa Pian handak manggawi ini, bahwasa Pian paham sabab akibat, wan bahwasa Pian manggawi ini bapandal awan [[{{MediaWiki:Policy-url}}|kaaripan]].',
+'revdelete-suppress-text' => "Panikinan parlu dipuruk gasan kakasus baumpat ini:
+* Pina kawa jadi panjalasan pitnah
+* balalabihan panjalasan kada sasuai paribadi
+*: ''alamat badiam wan numur talipun, numur kaamanan susial, dll.''",
+'revdelete-legend' => 'Setel panampaian tabatas',
+'revdelete-hide-text' => 'Sungkupakan naskah ralatan',
+'revdelete-hide-image' => 'Sungkupakan isi barakas',
+'revdelete-hide-name' => 'Sungkupakan palakuan wan nang dituju',
+'revdelete-hide-comment' => 'Sungkupakan kasimpulan babakan',
+'revdelete-hide-user' => 'Sungkupakan ngaran pamuruk/alamat IP pambabak',
+'revdelete-hide-restricted' => 'Sungkupakan data matan pambakal nangkaya nang lain',
+'revdelete-radio-same' => '(Ditangati maubah)',
+'revdelete-radio-set' => 'Iya-ai',
+'revdelete-radio-unset' => 'Kada',
+'revdelete-suppress' => 'Sungkupakan data matan pambakal nangkaya nang lain',
+'revdelete-unsuppress' => 'Buang pambatasan pada ralatan-ralatan nang dibulikakan',
+'revdelete-log' => 'Alasan:',
+'revdelete-submit' => 'Lamar hagan mamilih {{PLURAL:$1|ralatan|ralatan-ralatan}}',
+'revdelete-logentry' => 'Ubah panampaian ralatan matan "[[$1]]"',
+'logdelete-logentry' => 'Ubah panampaian kajadian matan "[[$1]]"',
+'revdelete-success' => "'''Panampaian ralatan bakulihan dimutakhirakan.'''",
+'revdelete-failure' => "'''Panampaian ralatan kada kawa dimutakhirakan:'''
+$1",
+'logdelete-success' => "'''Log panampaian bahasil disetel.'''",
+'logdelete-failure' => "'''Log panampaian kada kawa disetel:'''
+$1",
+'revdel-restore' => 'Ubah tampilan',
+'revdel-restore-deleted' => 'Ralatan-ralatan tahapus',
+'revdel-restore-visible' => 'Ralatan-ralatan kalihatan',
+'pagehist' => 'Sajarah tungkaran',
+'deletedhist' => 'Halam tahapus',
+'revdelete-content' => 'Isi',
+'revdelete-summary' => 'Kasimpulan babakan',
+'revdelete-uname' => 'ngaran pamuruk',
+'revdelete-restricted' => 'Talamar pambatasan hagan pambakal-pambakal',
+'revdelete-unrestricted' => 'Buang pambatasan gasan pambakal-pambakal',
+'revdelete-hid' => 'Sung $1',
+'revdelete-unhid' => 'Singkai $1',
+'revdelete-log-message' => '$1 gasan $2 {{PLURAL:$2|ralatan|ralatan-ralatan}}',
+'logdelete-log-message' => '$1 gasan $2 {{PLURAL:$2|kajadian|kajadian-kajadian}}',
+'revdelete-hide-current' => 'Tasalah manyungkupakan nang batanggal $1, $2: ini adalah ralatan tahanyar.
+Ini kada kawa disungkupakan.',
+'revdelete-show-no-access' => 'Tasalah manampaiakan nang batanggal $1, $2: nangini sudah ditandai "tabatas".
+Pian kada kawa malihati ini.',
+'revdelete-modify-no-access' => 'Tasalah magaganti nang batanggal $1, $2: nangini sudah ditandai "tabatas".
+Pian kada kawa maungkai ini.',
+'revdelete-modify-missing' => 'Kasalahan magaganti nang ba-ID $1: Ini bahilang matan basis data!',
+'revdelete-no-change' => "'''Paringatan:''' nang batanggal $1, $2 sudah baisi setélan kakawaan-dilihati.",
+'revdelete-concurrent-change' => 'Kasalahan magaganti nang batanggal $1, $2: nangini cungulnya suah diubah ulih urang lain pas Pian handak magaganti ini.
+Muhun pariksa lolog.',
+'revdelete-only-restricted' => 'Kasalahan manyungkup ngan batanggal $1, $2: Pian kada kawa manikin matan tiringan ulih papambakal kadada jua mamilih asa matan pilihan kawa-malihati.',
+'revdelete-reason-dropdown' => '*Aalasan umum pahapusan
+** Palangaran hak cipta
+** Kakadasasuaian panjalasan paribadi
+** Pina kawa jadi panjalasan pitnah',
+'revdelete-otherreason' => 'Alasan lain/tatambahan:',
+'revdelete-reasonotherlist' => 'Alasan lain',
+'revdelete-edit-reasonlist' => 'Aalasan pahapusan babakan',
+'revdelete-offender' => 'Ralatan panulis:',
+
+# 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.',
+
+# History merging
+'mergehistory' => 'Gabungakan hahalam tungkaran',
+'mergehistory-header' => 'Tungkaran ngini mambulihakan Pian manggabungakan raralatan matan asa tungkaran asal mula ka sabuah tungkaran tahanyar.
+Yakini bahwasa parubahan ngini masih maharagu tarus halam lawas tungkaran.',
+'mergehistory-box' => 'Gabungakan raralatan matan dua tungkaran:',
+'mergehistory-from' => 'Tungkaran asal mula:',
+'mergehistory-into' => 'Tungkaran tatuju:',
+'mergehistory-list' => 'Halam babakan nang kawa digabungakan',
+'mergehistory-merge' => 'Raralatan barikut matan [[:$1]] kawa digabungakan ka[[:$2]].
+Puruk picikan radiu hagan manggabungakan raralatan nang diulah pada wan sabalum wayah tartantu haja.
+Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
+'mergehistory-go' => 'Tampaiakan bababakan nang kawa digabungakan',
+'mergehistory-submit' => 'Gabungakan raralatan',
+'mergehistory-empty' => 'Kadada raralatan nang kawa digabungakan',
+'mergehistory-success' => '$3 {{PLURAL:$3|ralatan|raralatan}} matan [[:$1]] ruhui digabungakan ka [[:$2]].',
+'mergehistory-fail' => 'Kada kawa manggabungakan halam, muhun pariksa pulang tungkaran wan parameter wayah.',
+'mergehistory-no-source' => 'Tungkaran asal mula $1 kadada.',
+'mergehistory-no-destination' => 'Tungkaran tatuju $1 kadada.',
+'mergehistory-invalid-source' => 'Asal mula tungkaran musti sabuah judul sah.',
+'mergehistory-invalid-destination' => 'Tungkaran tatuju musti sabuah judul sah.',
+'mergehistory-autocomment' => 'Sudah digabungakan [[:$1]] ka dalam [[:$2]]',
+'mergehistory-comment' => 'Sudah digabungakan [[:$1]] ka dalam [[:$2]]: $3',
+'mergehistory-same-destination' => 'Tungkaran-tungkaran asal mula wan tatuju kada kawa sama',
+'mergehistory-reason' => 'Alasan:',
+
+# Merge log
+'mergelog' => 'Log panggabungan',
+'pagemerge-logentry' => 'Sudah digabungakan [[$1]] ka dalam [[$2]] (ralatan-ralatan sampai $3)',
+'revertmerge' => 'Walang panggabungan',
+'mergelogpagetext' => 'Di bawah adalah daptar nang paling hanyar panggabungan matan sabuah tungkaran halam ka dalam nang lain.',
+
+# Diffs
+'history-title' => "Ralatan halam matan ''$1''",
+'difference' => '(Nang balain antar ralatan)',
+'difference-multipage' => '(Nang balain antar tungkaran-tungkaran)',
+'lineno' => 'Baris $1:',
+'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-manyusers' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih labih pada $2 {{PLURAL:$2|pamuruk|papamuruk}} kada ditampaiakan)',
+
+# Search results
+'searchresults' => 'Kulihan panggagaian',
+'searchresults-title' => 'Kulihan gagai gasan "$1"',
+'searchresulttext' => 'Gasan panjalasan labih lanjut pasal panggagaian pintangan {{SITENAME}}, lihati [[{{MediaWiki:Helppage}}|tungkaran patulung]].',
+'searchsubtitle' => 'Pian manggagai \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|samunyaan tungkaran bamula wan "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|samunyaan tungkaran nang bataut ka "$1"]])',
+'searchsubtitleinvalid' => "Pian manggagai '''$1'''",
+'toomanymatches' => 'Kabanyakan nang cucuk kulihan, muhun cubai parmintaan lain',
+'titlematches' => 'Judul tungkaran pas',
+'notitlematches' => 'Kadada tungkaran bajudul pas',
+'textmatches' => 'Naskah tungkaran pas',
+'notextmatches' => 'Kadada tungkaran banaskah pas',
+'prevn' => '{{PLURAL:$1|$1}} tadahulu',
+'nextn' => '{{PLURAL:$1|$1}} dudinya',
+'prevn-title' => 'Tadahulu $1 {{PLURAL:$1|kulihan|kulihan-kulihan}}',
+'nextn-title' => 'Tadudi $1 {{PLURAL:$1|kulihan|kulihan-kulihan}}',
+'shown-title' => 'Tampaiakan $1 {{PLURAL:$ 1|kulihan|kukulihan}} par tungkatan',
+'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!'''",
+'searchhelp-url' => 'Help:Isi',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
+'searchprofile-articles' => 'Tungkaran isi',
+'searchprofile-project' => 'Tutungkaran Patulung wan Rangka gawian',
+'searchprofile-images' => 'Multimadia',
+'searchprofile-everything' => 'Samunyaan',
+'searchprofile-advanced' => 'Haratan',
+'searchprofile-articles-tooltip' => 'Panggagaian pada $1',
+'searchprofile-project-tooltip' => 'Panggagaian pada $1',
+'searchprofile-images-tooltip' => 'Panggagaian barakas',
+'searchprofile-everything-tooltip' => 'Panggagaian sabarataan isi (tamasuk tutungkaran pamandiran)',
+'searchprofile-advanced-tooltip' => 'Panggagaian pada ragam ngaran kakamar',
+'search-result-size' => '$1 ({{PLURAL:$2|1 ujar|$2 uujar}})',
+'search-result-category-size' => '{{PLURAL:$1|1 angguta|$1 aangguta}} ({{PLURAL:$2|1 subtumbung|$2 subtutumbung}}, {{PLURAL:$3|1 barakas|$3 babarakas}})',
+'search-result-score' => 'Kacucukan: $1%',
+'search-redirect' => '(Paugahan $1)',
+'search-section' => '(hagian $1)',
+'search-suggest' => 'Inikah maksud Pian: $1',
+'search-interwiki-caption' => 'Dingsanak rangka gawian',
+'search-interwiki-default' => 'Kulihan $1',
+'search-interwiki-more' => '(lagi)',
+'search-mwsuggest-enabled' => 'awan saran',
+'search-mwsuggest-disabled' => 'kadada saran',
+'search-relatedarticle' => 'Bakulaan',
+'mwsuggest-disable' => "Kada kawa'akan sasaran AJAX",
+'searcheverything-enable' => 'Panggagaian pada samunyaan ngaran kakamar',
+'searchrelated' => 'bakulaan',
+'searchall' => 'samunyaan',
+'showingresults' => "Di bawah ngini ditampaiakan hingga {{PLURAL:$1|'''1''' kulihan|'''$1''' kukulihan}}, dimulai matan #'''$2'''.",
+'showingresultsnum' => "Di bawah ngini ditampaiakan hingga {{PLURAL:$3|'''1''' kulihan|'''$3''' kukulihan}}, dimulai matan #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Kulihan '''$1''' matan '''$3'''|Kukulihan '''$1 - $2''' matan '''$3'''}} gasan '''$4'''",
+'nonefound' => "'''Catatan''': babarapa ngaran kamar haja nang baku digagai.
+Tarai pamintaan Pian lawan ''all:'' gasan manggagai samunyaan isi (tamasuk tungkaran pamandiran, citakan, dll), atawa puruk ngaran kamar nang dihandaki sabagai awalan.",
+'search-nonefound' => 'Kadada kulihan nang pas awan parmintaan.',
+'powersearch' => 'Panggagaian mahir',
+'powersearch-legend' => 'Panggagaian mahir',
+'powersearch-ns' => 'Manggagai di ngaran kamar:',
+'powersearch-redir' => 'Daptar paugahan',
+'powersearch-field' => 'Manggagai',
+'powersearch-togglelabel' => 'Pilihi:',
+'powersearch-toggleall' => 'Samunyaan',
+'powersearch-togglenone' => 'Kadada',
+'search-external' => 'Panggagaian luar',
+'searchdisabled' => '{{SITENAME}} panggagaian kada kawa
+Pian kawa manggagai lung Google parhatan ini.
+Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
+
+# Quickbar
+'qbsettings' => 'Bilahhancap',
+'qbsettings-none' => 'Kadada',
+'qbsettings-fixedleft' => 'Tatap di kiwa',
+'qbsettings-fixedright' => 'Tatap di kanan',
+'qbsettings-floatingleft' => 'Mangambang sabalah kiwa',
+'qbsettings-floatingright' => 'Mangambang sabalah kanan',
+
+# Preferences page
+'preferences' => 'Kakatujuan',
+'mypreferences' => 'Nang ulun katuju',
+'prefs-edits' => 'Rikinan babakan-babakan:',
+'prefsnologin' => 'Balum babuat log',
+'prefsnologintext' => 'Pian harus <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} babuat log]</span> gasat mengeset kakatujuan Pian.',
+'changepassword' => 'Ubah katasunduk',
+'prefs-skin' => 'Kulimbit',
+'skin-preview' => 'Titilikan',
+'prefs-math' => 'Matik',
+'datedefault' => 'Kadada katujuan',
+'prefs-datetime' => 'Tanggal wan waktu',
+'prefs-personal' => 'Data awak',
+'prefs-rc' => 'Parubahan tahanyar',
+'prefs-watchlist' => 'Paitihan',
+'prefs-watchlist-days' => 'Rikinan hari-hari ditampaiakan di daptar itihan:',
+'prefs-watchlist-days-max' => 'Paling lawas 7 hari-hari',
+'prefs-watchlist-edits' => 'Rikinan paningginya matan parubahan hagan ditampaiakan pada singkaian daptar itihan:',
+'prefs-watchlist-edits-max' => 'Rikinan paningginya:1000',
+'prefs-watchlist-token' => 'Token itihan:',
+'prefs-misc' => 'Balalain',
+'prefs-resetpass' => 'Ubah katasunduk',
+'prefs-email' => 'Pipilihan suril',
+'prefs-rendering' => 'Pancungulan',
+'saveprefs' => 'Simpan',
+'resetprefs' => 'Kusungakan paparubahan kada tasimpan',
+'restoreprefs' => 'Bulikakan samunyaan sesetélan default',
+'prefs-editing' => 'Pambabakan',
+'prefs-edit-boxsize' => 'Ukuran lalungkang babakan',
+'rows' => 'Baris:',
+'columns' => 'Kolom:',
+'searchresultshead' => 'Gagai',
+'resultsperpage' => 'Hantukan par tungkaran:',
+'contextlines' => 'Baris par hantukan:',
+'contextchars' => 'Isi par baris:',
+'stub-threshold' => 'Ambang watas gasan pormat <a href="#" class="stub">taautan rintisan</a>:',
+'stub-threshold-disabled' => 'Kada kawa-akan',
+'recentchangesdays' => 'Hahari nang manampaiakan parubahan tahanyar:',
+'recentchangesdays-max' => 'Paling lawas $1 {{PLURAL:$1|hari|hahari}}',
+'recentchangescount' => 'Rikinan babakan nang ditampaiakan default:',
+'prefs-help-recentchangescount' => 'Ini tamasuk parubahan tahanyar, halam-halam tungkaran, wan log-log.',
+'prefs-help-watchlist-token' => 'Maisi kutak ngini lawan kunci rahasia (PIN) akan mahasilakan sindikasi RSS hagan daptar pantauan Anda. Siapa gin nang tahu kunci ngini kawa mambaca daptar itihan Pian, jadi pilihi nilainya bahati-hati
+Barikut ngini adalah nilai acak nang kawa Pian puruk: $1',
+'savedprefs' => 'Kakatujuan Pian sudah ham disimpan.',
+'timezonelegend' => 'Waktu banua:',
+'localtime' => 'Waktu damintu:',
+'timezoneuseserverdefault' => 'Purukan Server default',
+'timezoneuseoffset' => 'Nang lain (ajuakan nang luput setel)',
+'timezoneoffset' => 'Luput setel¹:',
+'servertime' => 'Waktu server:',
+'guesstimezone' => 'Isiakan matan panjalajah web',
+'timezoneregion-africa' => 'Aprika',
+'timezoneregion-america' => 'Amirika',
+'timezoneregion-antarctica' => 'Antarktika',
+'timezoneregion-arctic' => 'Arktik',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Lalautan Atlantik',
+'timezoneregion-australia' => 'Australia',
+'timezoneregion-europe' => 'Irupa',
+'timezoneregion-indian' => 'Lalautan Hindia',
+'timezoneregion-pacific' => 'Lalautan Pasipik',
+'allowemail' => "Kawa'akan pamuruk lain mangirim suril",
+'prefs-searchoptions' => 'Papilihan manggagai',
+'prefs-namespaces' => 'Ngaran kamar',
+'defaultns' => 'Atawa-lah manggagai dalam ngaran kakamar nangini:',
+'default' => 'default',
+'prefs-files' => 'Barakas',
+'prefs-custom-css' => 'Saragamakan CSS',
+'prefs-custom-js' => 'Saraganakan JavaScript',
+'prefs-common-css-js' => 'Babagi CSS/JavaScript gasan samunyaan skin:',
+'prefs-reset-intro' => 'Pian kawa mamuruk tungkaran ini hagan setel bulik kakatujuan Pian ka default situs.
+Ini kada kawa diwalangi.',
+'prefs-emailconfirm-label' => 'Payakinakan suril:',
+'prefs-textboxsize' => 'Ukuran kutak ubahan',
+'youremail' => 'Suril:',
+'username' => 'Ngaran pamuruk:',
+'uid' => 'ID pamuruk:',
+'prefs-memberingroups' => 'Angguta matan {{PLURAL:$1|galambang|gagalambang}}:',
+'prefs-registration' => 'Waktu pandaptaran:',
+'yourrealname' => 'Ngaran asli:',
+'yourlanguage' => 'Bahasa:',
+'yournick' => 'Tandatangan:',
+'prefs-help-signature' => 'Kumintar pada tungkaran pamandiran parlu ditandatangani awan "<nowiki>~~~~</nowiki>" nangapa akan taubah jadi tandatangan Pian wan waktu wayahini.',
+'badsig' => 'Tandatangan mantah kada sah.
+Pariksa tag HTML.',
+'badsiglength' => 'Tapak tangan Sampian talalu panjang. Jangan malabihi pada $1 {{PLURAL:$1|karakter|karakter}}.',
+'yourgender' => 'Janis kalamin:',
+'gender-unknown' => 'Kada diajuakan',
+'gender-male' => 'Lalakian',
+'gender-female' => 'Bibinian',
+'prefs-help-gender' => 'Opsional: dipuruk gasan mambaiki manyambat gindir ulih parangkat lunak. Panjalasan ngini akan tasingkai hagan umum.',
+'email' => 'Suril',
+'prefs-help-realname' => 'Ngaran bujur adalah pilihan haja.
+Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan gawian Pian.',
+'prefs-help-email-required' => 'Alamat suril diparluakan.',
+'prefs-info' => 'Panjalasan pandal',
+'prefs-i18n' => 'Intarnasionalisasi',
+'prefs-signature' => 'Tandatangan',
+'prefs-dateformat' => 'Purmat tanggal',
+'prefs-timeoffset' => 'Setélan waktu',
+'prefs-advancedediting' => 'Pilihan harat',
+'prefs-advancedrc' => 'Pilihan harat',
+'prefs-advancedrendering' => 'Pilihan harat',
+'prefs-advancedsearchoptions' => 'Pilihan harat',
+'prefs-advancedwatchlist' => 'Pilihan harat',
+'prefs-displayrc' => 'Pilihan tampilan',
+'prefs-displaysearchoptions' => 'Pilihan tampilan',
+'prefs-displaywatchlist' => 'Pilihan tampilan',
+'prefs-diffs' => 'Bida',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Alamat suril tacungul sah',
+'email-address-validity-invalid' => 'Buati sabuah alamat suril nang sah',
+
+# User rights
+'userrights' => 'Pangalulaan hak-hak pamuruk',
+'userrights-lookup-user' => 'Mangalula gagalambang pamuruk',
+'userrights-user-editname' => 'Buati sabuah ngaran pamuruk:',
+'editusergroup' => 'Babak galambang pamuruk',
+'editinguser' => "Mangganti hak akses pamuruk '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'userrights-editusergroup' => 'Babak galambang pamuruk',
+'saveusergroups' => 'Simpan galambang pamuruk',
+'userrights-groupsmember' => 'Angguta matan:',
+'userrights-groupsmember-auto' => 'Angguta tasirat matan:',
+'userrights-groups-help' => 'Pian kawa maubah galambang pamuruk ngini:
+* Kutak awan tanda cek artnya galambang pamuruk nang basangkutan
+* Kutak kada batanda cek artinya pamuruk ngini lainan angguta galambang ngitu
+* Tanda * manandai bahwasa Pian kada kawa mawalangi galambang ngitu amun Pian sudah manambahinya, atawa kabalikannya.',
+'userrights-reason' => 'Alasan:',
+'userrights-no-interwiki' => 'Pian kada baisi ijin hagan mambabak hak pamuruk di wiki lain.',
+'userrights-nodatabase' => 'Basis data $1 kadada atawa lainan lukal.',
+'userrights-nologin' => 'Pian musti [[Special:UserLogin|lbabuat log]] awan sabuah akun pambakal hagan mambari hak pamuruk.',
+'userrights-notallowed' => 'Akun Pian kada baisi ijin hagan mambari hak pamuruk.',
+'userrights-changeable-col' => 'Gagalambang nang Pian kawa ubah',
+'userrights-unchangeable-col' => 'Gagalambang nang Pian kada kawa ubah',
+
+# Groups
+'group' => 'Galambang:',
+'group-user' => 'Pamuruk',
+'group-autoconfirmed' => 'Pamuruk utumatis diyakinakan',
+'group-bot' => 'Bot',
+'group-sysop' => 'Pambakal',
+'group-bureaucrat' => 'Birukrat',
+'group-suppress' => 'Pangawas',
+'group-all' => '(samunyaan)',
+
+'group-user-member' => 'Pamuruk',
+'group-autoconfirmed-member' => 'pamuruk utumatis diyakinakan',
+'group-bot-member' => 'Bot',
+'group-sysop-member' => 'Pambakal',
+'group-bureaucrat-member' => 'Birukrat',
+'group-suppress-member' => 'pangawas',
+
+'grouppage-user' => '{{ns:project}}: Pamuruk',
+'grouppage-autoconfirmed' => '{{ns:project}}: Pamuruk utumatis diyakinakan',
+'grouppage-bot' => '{{ns:project}}:Bot',
+'grouppage-sysop' => '{{ns:project}}:Pambakal',
+'grouppage-bureaucrat' => '{{ns:project}}:Birukrat',
+'grouppage-suppress' => '{{ns:project}}:Pangawas',
+
+# Rights
+'right-read' => 'Mambaca tungkaran',
+'right-edit' => 'Mambaiki tungkaran',
+'right-createpage' => 'Ulah tutungkaran (nang lainan tutungkaran pamandiran)',
+'right-createtalk' => 'Maulah tutungkaran pamandiran',
+'right-createaccount' => 'Ulah akun pamuruk hanyar',
+'right-minoredit' => 'Tandai bababakan sawagai sapalih',
+'right-move' => 'Mamindahakan tungkaran',
+'right-move-subpages' => 'Ugahakan tutungkaran awan subtumgkaran-nya',
+'right-move-rootuserpages' => 'Ugahakan akar tutungkaran pamuruk',
+'right-movefile' => 'Mamindahakan barakas',
+'right-suppressredirect' => 'Kada maulah paugahan matan tutungkaran asal mula parhatan tutungkan pindahan',
+'right-upload' => 'Unggahakan barakas',
+'right-reupload' => 'Manulistindih barakas nang ada',
+'right-reupload-own' => 'Manulistindih barakas nang ada unggahan ulih urang nang sama',
+'right-reupload-shared' => 'Manulak babarakas pada panyimpanan media lokal basamaan',
+'right-upload_by_url' => 'Hunggahakan babarakas matan sabuah URL',
+'right-purge' => 'Limpuarakan timbuluk situs gasan asa tungkaran kada pambaritahuan',
+'right-autoconfirmed' => 'Mambabak tutungkaran sami-dilindungi',
+'right-bot' => 'Ditindak sawagai sabuah proses utumatis',
+'right-nominornewtalk' => 'Kadada babakan sapalih di tutungkaran pamandiran nang mancungulakan tampaian pasan puga',
+'right-apihighlimits' => 'Mamuruk watas kueri API tatinggi',
+'right-writeapi' => 'Puruk panulisan API',
+'right-delete' => 'Mahapus tungkaran',
+'right-bigdelete' => 'Hapus tutungkaran awan hahalam ganal',
+'right-deleterevision' => 'Mahapus wan mawalangi hapus raralatan tatantu matan tutungkaran',
+'right-deletedhistory' => 'Tiringi mamasukan halam tahapus, kada banaskah tarait',
+'right-deletedtext' => 'Tiringi naskah tahapus wan parubahan antar raralatan tahapus',
+'right-browsearchive' => 'Manggagai tungkaran nang sudah dihapus',
+'right-undelete' => 'Mambulikakan sabuah tungkaran tahapus',
+'right-suppressrevision' => 'Maniring pulang wan mambulikakan raralatan matan papambakal',
+'right-suppressionlog' => 'Tiringi log paribadi',
+'right-block' => 'Blukir pamuruk lain mambabak',
+'right-blockemail' => 'Blukir saurang pamuruk mangirimi suril',
+'right-hideuser' => 'Blukir sabuah ngaranpamuruk, sungkupakan ini matan umum',
+'right-ipblock-exempt' => 'Liwati blukir IP, blukir-utumatis wan aria blukir',
+'right-proxyunbannable' => 'Liwati utumatis blukir matan pruksi',
+'right-unblockself' => 'Lapas blukirnya surang',
+'right-protect' => 'Ubah tingkat parlindungan wan babakan tutungkaran nang diindungi',
+'right-editprotected' => 'Babak tungkaran nang dilindungi (kada parlindungan barenteng)',
+'right-editinterface' => 'Babak antarmuha pamuruk ini',
+'right-editusercssjs' => 'Babak pamuruk lain babarakas CSS wan JavaScript',
+'right-editusercss' => 'Babak pamruk lain babarakas CSS',
+'right-edituserjs' => 'Babak pamuruk lain babarakas JavaScript',
+'right-rollback' => 'Mambulikakan hancap bababakan matan pamuruk tauncit nang mambabak sabuah tungkaran tatantu',
+'right-markbotedits' => 'Tandai bababakan dibulikakan sawagai bababakan bot',
+'right-noratelimit' => 'Kada pangaruh awan watas rating',
+'right-import' => 'Impur tutungkaran matan wiwiki lain',
+'right-importupload' => 'Iimpur tutungkaran matan sabuah barakas hunggahan',
+'right-patrol' => "Tandai bababakan nang lain sawagai ta'awasi",
+'right-autopatrol' => "Babakan ampun surang utumatis ditandai sawagai ta'awasi",
+'right-patrolmarks' => 'Tiringi tanda parubahan tahanyar',
+'right-unwatchedpages' => 'Tiringi sabuah daptar tutungkaran nang kada diitihi',
+'right-trackback' => 'Mangirimakan sabuah panjajakan balik',
+'right-mergehistory' => 'Gabungakan halam matan tutungkaran',
+'right-userrights' => 'Babak sabarataan hak pamuruk',
+'right-userrights-interwiki' => 'Babak hahak pamuruk matan papamuruk wiwiki balain',
+'right-siteadmin' => 'Sunduk wan buka sunduk basis data',
+'right-reset-passwords' => 'Risit katasunduk pamuruk lain',
+'right-override-export-depth' => 'Ekspur tutungkaran tamasuk tutungkaran tataut sampai kadalaman 5',
+'right-sendemail' => 'Mangirim suril ka papamuruk lain',
+
+# User rights log
+'rightslog' => 'Log parubahan hak masuk',
+'rightslogtext' => 'Nangini adalah sabuah log paparubahan ka hahak pamuruk.',
+'rightslogentry' => 'Ubah galambang angguta gasan $1 matan $2 ka $3',
+'rightsnone' => '(kadada)',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'baca tungkaran ini',
+'action-edit' => 'babak tungkaran ini',
+'action-createpage' => 'ulah tutungkaran',
+'action-createtalk' => 'ulah tutungkaran pamandiran',
+'action-createaccount' => 'ulah akun pamuruk ini',
+'action-minoredit' => 'tandai babakan ini sawagai sapalih',
+'action-move' => 'pindahakan tungkaran ini',
+'action-move-subpages' => 'pindahakan tungkaran ini, wan sub-tutungkarannya',
+'action-move-rootuserpages' => 'mamindahakan akar tutungkaran pamuruk',
+'action-movefile' => 'pindahakan barakas ini',
+'action-upload' => 'hunggahakan barakas ini',
+'action-reupload' => 'manimpa barakas nang ada',
+'action-reupload-shared' => 'manindih barakas nang sudah ada di wadah payimpanan barakas basamaan',
+'action-upload_by_url' => 'hunggahakan barakas ini matan sabuah URL',
+'action-writeapi' => 'puruk panulisan API',
+'action-delete' => 'hapus tungkaran ini',
+'action-deleterevision' => 'hapus ralatan ini',
+'action-deletedhistory' => 'tiringi halam tahapus tungkaran ini',
+'action-browsearchive' => 'gagai tutungkaran tahapus',
+'action-undelete' => 'kada jadi mahapus tungkaran ini',
+'action-suppressrevision' => 'tilik wan bulikakan ralatan tasungkup ini',
+'action-suppressionlog' => 'tiringi log paribadi ini',
+'action-block' => 'blukir pamuruk ini matan mambabak',
+'action-protect' => 'Ubah tingkat parlindungan tungkaran ngini',
+'action-import' => 'Impur tungkaran ngini matan wiki lain',
+'action-importupload' => 'Impur tungkaran ngini matan sabuah barakas hunggahan',
+'action-patrol' => "tandai babakan nang lain sawagai ta'awasi",
+'action-autopatrol' => "Tandai babakan Pian sawagai ta'awasi",
+'action-unwatchedpages' => 'tiringi daptar tutungkaran nang kada diitihi',
+'action-trackback' => 'kirim sabuah jajakbulik',
+'action-mergehistory' => 'gabungakan halam matan tungkaran ngini',
+'action-userrights' => 'babak sabarataan hak pamuruk',
+'action-userrights-interwiki' => 'babak hak pamuruk matan papamuruk dalam wiwiki lain',
+'action-siteadmin' => 'sunduk atawa bukasunduk basisdata',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
+'recentchanges' => 'Parubahan tahanyar',
+'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",
+'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',
+'rcshowhidepatr' => "$1 babakan ta'awasi",
+'rcshowhidemine' => '$1 babakan ulun',
+'rclinks' => 'Tampaiakan $1 parubahan tahanyar dalam $2 hari tauncit<br />$3',
+'diff' => 'bida',
+'hist' => 'halam',
+'hide' => 'Sungkupakan',
+'show' => 'Tampaiakan',
+'minoreditletter' => 's',
+'newpageletter' => 'H',
+'boteditletter' => 'b',
+'number_of_watching_users_pageview' => "[$1 {{PLURAL:$1|pa'itihi|papa'itihi}}]",
+'rc_categories' => 'Watasi tutumbung (pisahakan lawan "|")',
+'rc_categories_any' => 'Napa gin',
+'newsectionsummary' => '/* $1 */ hagian hanyar',
+'rc-enhanced-expand' => 'Tampaiakan rincian (parlu ada JavaScript)',
+'rc-enhanced-hide' => 'Sungkupakan ririncian',
+
+# Recent changes linked
+'recentchangeslinked' => 'Parubahan tarait',
+'recentchangeslinked-feed' => 'Parubahan tarait',
+'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).
+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',
+
+# Upload
+'upload' => 'Hunggahakan barakas',
+'uploadbtn' => 'Hunggahakan barakas',
+'reuploaddesc' => 'Walang mahunggah wan babulik ka purmulir hunggahan',
+'upload-tryagain' => 'Kirim katarangan barakas taubah',
+'uploadnologin' => 'Baluman babuat log',
+'uploadnologintext' => 'Pian musti [[Special:UserLogin|babuat log]] amun handak mahunggah babarakas.',
+'upload_directory_missing' => 'Direktori hunggahan ($1) hilang wan kada kawa diulah ulih webserver.',
+'upload_directory_read_only' => 'Direktori hunggahan ($1) kada kawa ditulisi ulih webserver.',
+'uploaderror' => 'Hunggah tasalah',
+'upload-recreate-warning' => "'''Paringatan: Sabuah barakas bangaran ngini sudah dihapus atawa dipindahakan.'''
+Log pahapusan wan pamindahan hagan tungkarran ngini adalah sawagai barikut:",
+'uploadtext' => "Puruk purmulir di bawah gasan mahunggah barakas.
+Gasan manampaiakan atawa manggagai barakas nang sabalumnya dimuat, puruk [[Special:FileList|daptar barakas]]. Pahunggahan (lagi) jua tacatat dalam [[Special:Log/upload|log pahunggahan]], samantara pahapusan tacatat dalam [[Special:Log/delete|log pahapusan]].
+
+Gasan manampaiakn atawa maumpatakan barakas di dalam suatu tungkaran, puruk tautan lawan salah asa purmat di bawah ngini:
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Barakas.jpg]]</nowiki></tt>''' hagan manampaiakan barakas dalam takaran aslinya
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Barakas.png|200px|thumb|left|naskah alternatip]]</nowiki></tt>''' hagan manampaiakan barakas lawan libar 200px dalam sabuah kutak di kiwa tungkaran lawan 'naskah alternatip' sawagai katarangan gambar
+* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Barakas.ogg]]</nowiki></tt>''' sawagai tautan langsung ka barakas nang dimaksud kada batampaiakan barakas ngitu lung wiki",
+'upload-permitted' => 'Macam barakas nang diijinakan: $1.',
+'upload-preferred' => 'Macam barakas nang dikatujui: $1.',
+'upload-prohibited' => 'Macam barakas nang ditangati: $1.',
+'uploadlog' => 'log hunggah',
+'uploadlogpage' => 'Log mambuati',
+'uploadlogpagetext' => 'Di bawah ngini adalah sabuah daptar matan barakas nang hanyar dihuhunggah.
+Janaki [[Special:NewFiles|galeri babarakas hanyar]] gasan tampaian visual.',
+'filename' => 'Ngaran barakas',
+'filedesc' => 'Kasimpulan',
+'fileuploadsummary' => 'Kasimpulan:',
+'filereuploadsummary' => 'Parubahan barakas:',
+'filestatus' => 'Satatus hakcipta:',
+'filesource' => 'Asal mula:',
+'uploadedfiles' => 'Babarakas tahunggah',
+'ignorewarning' => 'Kada mahuwal paringatan wan simpan haja barakas langsung.',
+'ignorewarnings' => 'Kada mahuwal apapun paringatan',
+'minlength1' => 'Ngaran barakas musti sahikitnya asa abjad.',
+'illegalfilename' => 'Ngaran barakas "$1" mangandung karaktir nang kada dibulihakan dalam tungkaran jujudul.
+Muhan ganti ngaran barakas wan cubai mahunggah pulang.',
+'badfilename' => 'Ngaran barakas sudah diganti ka "$1".',
+'filetype-badmime' => 'Babarakas macam MIME "$1" kada bulih dihunggah.',
+'filetype-bad-ie-mime' => 'Kada kawa mahunggah barakas ngini karana Internet Explorer manangguh ngini sawagai "$1", nang kada dibulihakan wan samacam barakas babahaya.',
+'filetype-unwanted-type' => "'''\".\$1\"''' adalah samacam barakas nagn kada dihandaki.
+Dikatujui {{PLURAL:\$3|macam barakas|mamacam barakas}} \$2.",
+'filetype-missing' => 'Barakas kada baisi ekstensi (nangkaya ",jpg").',
+'empty-file' => 'Barakas nang Pian buatakan puang.',
+'file-too-large' => 'Barakas nang Pian buatakan kaganalan.',
+'filename-tooshort' => 'Ngaran barakas kahandapan.',
+'filetype-banned' => 'Macam barakas ini ditangati.',
+'verification-error' => 'Barakas nangini kada lulus paitihan.',
+'hookaborted' => 'Parubahan nang Pian cuba ulah sudah digagalakan ulih unjun ekstensi.',
+'illegal-filename' => 'Ngaranbarakas kada dibulihakan.',
+'overwrite' => 'Manindih tulis sabuah barakas nang ada kada dibulihakan.',
+'unknown-error' => 'Kasalahan kada dipinandui tajadi.',
+'tmp-create-error' => 'Kada kawa maulah barakas pahadangan.',
+'tmp-write-error' => 'Kasalahan sawaktu manulis barakas pahadangan.',
+'large-file' => 'Disaranakan babarakas kada tapanjang pada $1;
+barakas ngini $2.',
+'largefileserver' => 'Barakas ngini taganal pada nang dibulihakan server.',
+'emptyfile' => 'Barakas nang Pian hunggah kusung pinanya,
+Ngini pinanya ada salah katik ngaran barakas.
+Muhun pariksa apa bubujuran Pian handak mahunggah barakas ngini.',
+'fileexists' => "Sabuah barakas bangaran ngin sudah ada, muhun pariksa '''<tt>[[:$1]]</tt>''' amun Pian kada musti amun Pian handak mangganti ngini.
+[[$1|thumb]]",
+'filepageexists' => "Tungkaran diskripsi gasan barakas ngini suda diulah di '''<tt>[[:$1]]</tt>''', tagal kadada barakas bangaran ngini tasadia.
+Kasimpulan nang Pian masukakan kada ham cungul pada tungkran diskripsi.
+Hagan maulah kasimpulan Pian cungul di sana, Pian musti mambabaknya manual.
+[[$1|thumb]]",
+'fileexists-extension' => "Sabuah barakas bangaran sama sudah tasadia: [[$2|thumb]]
+*Ngaran barakas hunggahan: '''<tt>[[:$1]]</tt>'''
+* Ngaran barakas sudah tasadia: '''<tt>[[:$2]]</tt>'''
+Muhun pilihi sabuah ngaran babida.",
+'fileexists-thumbnail-yes' => "Barakas ngini kajanakannya sabuah pancitraan nang dihalusi takarannya ''(thumbnail)''.
+[[$1|thumb]]
+Muhun pariksa barakas '''<tt>[[:$1]]</tt>'''.
+Amun barakas dipariksa sama awan pancitraan takaran aslinya kada parlu mahunggah sabuah tambahan thumbnail.",
+'file-thumbnail-no' => "Ngaran barakas bamula awan '''<tt>$1</tt>'''.
+Ngini kajanakannya sabuah pancitraan nang dihalusi takaran ''(thumbnail)''.
+Amun Pian baisi pancitraan ngini barisulusi hibak hunggah nang ngini, amun kada muhun ubah ngaran barakas.",
+'fileexists-forbidden' => 'Sabuah barakas bangaran sama sudah tasadia, wan kada kawa ditindihtulis.
+Amun Pian handak jua mahunggah barakas Pian, muhun babulik wan puruk sabuah ngaran hanyar.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Sabuah barakas bangaran ngini sudah tasadia di repositori barakas babagi
+Amun Pian handak jua mahunggah barakas Pian, muhun babulik wan puruk sabuah ngaran hanyar.
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'Barakas ngini adalah sabuah duplikat matan {{PLURAL:$1|barakas|babarakas}} barikut:',
+'file-deleted-duplicate' => 'Sabuah barakas identik awan barakas ngini ([[:$1]]) suah dihapus sabalumnya.
+Pian musti mamariksa halam pahapusan barakas ngitu hanyar manarusakan mahunggah pulang ngini.',
+'uploadwarning' => 'Paringatan hunggah',
+'uploadwarning-text' => 'Muhun mangganti katarangan barakas di bawah wan cubai pulang.',
+'savefile' => 'Simpan barakas',
+'uploadedimage' => 'mamuat "[[$1]]"',
+'overwroteimage' => 'mahunggah sabuah pérsi hanyar matan "[[$1]]"',
+'uploaddisabled' => 'Pahunggahan dipajahakan.',
+'copyuploaddisabled' => 'Hunggah lawan URL pajah.',
+'uploadfromurl-queued' => "Pahunggahan Pian sudah ba'antri.",
+'uploaddisabledtext' => 'Hunggah barakas kada kawa.',
+'php-uploaddisabledtext' => 'Mahunggah barakas di PHP dipajahakan.
+Muhun pariksa setelan file_uploads.',
+'uploadscripted' => 'Barakas ngini mangandung HTML atawa kudi script nang kawa ditarjamahakan tasalah ulih sabuah panjalajah web.',
+'uploadvirus' => 'Barakas baisi pirus!
+Ririncian: $1',
+'upload-source' => 'Asal mula barakas',
+'sourcefilename' => 'Ngaranbarakas asal mula:',
+'sourceurl' => 'Asal mula URL:',
+'destfilename' => 'Ngaranbarakas tujuan:',
+'upload-maxfilesize' => 'Takaran barakas maksimum: $1',
+'upload-description' => 'Diskripsi barakas',
+'upload-options' => 'Pilihan hunggah',
+'watchthisupload' => 'Itihi barakas ini',
+'filewasdeleted' => 'Sabuah barakas bangaran ngini suah dihunggah wan abis tu dihapus.
+Pian musti pariksa $1 hanyar mahunggah ngini pulang.',
+'upload-wasdeleted' => "'''Paringatan: Pian mahunggah sabuah barakas nang suah dihapus.'''
+
+Pian partimbangakan dahulu sasuaikah hagan manarusakan pahunggahan barakas ngini.
+Log pahapusan gasan barakas ngini disadiakan di sia:",
+'filename-bad-prefix' => "Ngaran barakas nang Pian hunggah bamula lawan '''\"\$1\"''', nang lainan-ngaran diskriptip biasanya utumatis dibari ulih kudakan digital.
+Muhun pilih ngaran labih diskriptip lain gasan barakas Pian.",
+'upload-success-subj' => 'Kulihan mahunggah',
+'upload-success-msg' => 'Hunggahan Pian matan [$2] ruhui. Ngini tasadia di sia: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Hunggah bamasalah',
+'upload-failure-msg' => 'Ada sabauah masalah tadi tu pas Pian hunggah matan [$2]:
+$1',
+'upload-warning-subj' => 'Paringatan mahunggah',
+'upload-warning-msg' => 'Ada masalah lawan hunggahan Pian matan [$2]. Pian bulih babulik ka [[Special:Upload/stash/$1|purmulir hunggah]] hagan mambujuri masalah ngini.',
+
+'upload-proto-error' => 'Protokol kada bujur',
+'upload-proto-error-text' => 'Hunggahan rimut parlu URL bamula lawan <code>http://</code> atawa <code>ftp://</code>.',
+'upload-file-error' => 'Kasalahan di dalam',
+'upload-file-error-text' => 'Sabuah kasalahan dalam tajadi wayah mancubai maulah sabuah barakas samantara dalam server.
+Muhun kiau saurang [[Special:ListUsers/sysop|pambakal]].',
+'upload-misc-error' => 'Tasalah buat nang kada dipinandui',
+'upload-misc-error-text' => 'Nyunyuk kada dikatahui tajadi pas mahunggah.
+Muhun pastiakan URL sah wan kawa diuangkai wan cubai pulang.
+Amun masih haja bamasalah, kiau saurang [[Special:ListUsers/sysop|pambakal]].',
+'upload-too-many-redirects' => 'URL mangandung kabanyakan paugahan.',
+'upload-unknown-size' => 'Ukuran kada dikatahui',
+'upload-http-error' => 'Sabuah kasalahan HTTP tajadi: $1',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'Ungkaian ditolak',
+'img-auth-nopathinfo' => 'PATH_INFO hilang.
+Server Pian kada disetel hagan malimpatakan panjalasan ngini.
+Ngini karana CGI-based wan kada manyukung img_auth.
+Janaki http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => "Jalur nang diminta kada ta'atur lawan direktori hunggahan.",
+'img-auth-badtitle' => 'Kada kawa mambangun sabuah judul sah matan "$1".',
+'img-auth-nologinnWL' => 'Pian kada kawa babuat log wan \'$1" kadada dalam daptar putih.',
+'img-auth-nofile' => 'Barakas "$1" kadada.',
+'img-auth-isdir' => 'Pian mancuba hagan maungkai sabuah direktori "$1".
+Hanya maungkai barakas dibulihakan.',
+'img-auth-streaming' => 'Streaming "$1".',
+'img-auth-public' => 'Pungsi img_auth.php mangaluarakan babarakas matan sabuah wiki paribadi.
+Wiki ngini diatur sawagai wiki umum.
+Gasan kaamanan baik, img_auth.php dipajahakan.',
+'img-auth-noread' => 'Pamuruk kada baisi hak ungkai hagan mambaca "$1".',
+'img-auth-bad-query-string' => 'URL baisi sabuah string kueri kada sah.',
+
+# HTTP errors
+'http-invalid-url' => 'URL kada sah: $1',
+'http-invalid-scheme' => 'URL lawan skema "$1" kada disukung.',
+'http-request-error' => 'Parmintaan HTTP gagal karana kasalah kada dikatahui.',
+'http-read-error' => 'Kasalahan baca HTTP.',
+'http-timed-out' => 'Parmintaan HTTP habis wayahnya.',
+'http-curl-error' => 'Kasalahan pas maambil URL: $1',
+'http-host-unreachable' => 'Kada kawa mancapai URL.',
+'http-bad-status' => 'Ada sabuah masalah pas maminta HTTP: $1 $2',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Kada kawa mancapai URL.',
+'upload-curl-error6-text' => 'URL tasadia kada kawa dicapai.
+Muhun pariksa ganda bahwasa URL bujur wan situs nyala.',
+'upload-curl-error28' => 'Wayah pahunggahan habis',
+'upload-curl-error28-text' => 'Situs ngini kalawasan mananggapi.
+Muhun pariksa manyalakah situs ngini, hadangi satumat wan cubai pulang.
+Pian amun handak cubai pas wayah kada tapi haur.',
+
+'license' => 'Lisensi:',
+'license-header' => 'Lisensi',
+'nolicense' => 'Kadada mamilih',
+'license-nopreview' => '(titilikan kada tasadia)',
+'upload_source_url' => '(sabuah URL sah umum nang kawa diungkai)',
+'upload_source_file' => '(sabuah barakas pada kumputir Pian)',
+
+# Special:ListFiles
+'listfiles-summary' => "Tungkaran istimiwa ngini manampaiakan samunyaan barakas hunggahan.
+Baku babarakas hunggahan ta'uncit ditampaiakan di puncak daptar.
+Sabuah klik pada sabuah kolum kapalaan hagan maubah surtiran urut.",
+'listfiles_search_for' => 'Gagai ngaran barakas:',
+'imgfile' => 'barakas',
+'listfiles' => 'Daptar barakas',
+'listfiles_thumb' => 'Pahalusan',
+'listfiles_date' => 'Tanggal',
+'listfiles_name' => 'Ngaran',
+'listfiles_user' => 'Pamuruk',
+'listfiles_size' => 'Ukuran',
+'listfiles_description' => 'Pamaparan',
+'listfiles_count' => 'Janis',
+
+# File description page
+'file-anchor-link' => 'Barakas',
+'filehist' => 'Barakas halam',
+'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ini pada wayah itu.',
+'filehist-deleteall' => 'hapus samunyaan',
+'filehist-deleteone' => 'hapus',
+'filehist-revert' => 'bulikakan',
+'filehist-current' => 'daminian',
+'filehist-datetime' => 'Tanggal/Waktu',
+'filehist-thumb' => 'Pahalusan',
+'filehist-thumbtext' => 'Pahalusan gasan bantuk per $1',
+'filehist-nothumb' => 'Kadada thumbnail',
+'filehist-user' => 'Pamuruk',
+'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-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.',
+'nolinkstoimage' => 'Kadada tutungkaran nang bataut ka barakas ngini.',
+'morelinkstoimage' => 'Tiringi [[Special:WhatLinksHere/$1|tautan lagi]] ka barakas ngini.',
+'redirectstofile' => 'Barakas barikut {{PLURAL:$1|diugahakan|$1 diugahakan}} ka barakas ngini:',
+'sharedupload' => 'Barakas ini matan $1 wan mungkin dipuruk rangka-rangka gawian lain.',
+'filepage-nofile' => 'Kadada barakas bangaran ngini.',
+'filepage-nofile-link' => 'Kadada barakas bangaran ngini tasadia, tagal Pian kawa [$1 mahunggah ngini].',
+'uploadnewversion-linktext' => 'Buatakan bantuk nang labih hanyar matan barakas ini',
+'shared-repo-from' => 'matan $1',
+'shared-repo' => 'suatu repositori basama',
+
+# File reversion
+'filerevert' => 'Bulikakan $1',
+'filerevert-legend' => 'Bulikakan barakas',
+'filerevert-intro' => "Pian mambulikakan '''[[Media:$1|$1]]''' ka macam [$4 pada $3, $2].",
+'filerevert-comment' => 'Alasan:',
+'filerevert-defaultcomment' => 'Dibulikakan ka macam pada $2, $1',
+'filerevert-submit' => 'Bulikakan',
+'filerevert-success' => "'''[[Media:$1|$1]]''' sudah dibulikakan ka macam [$4 pada $3, $2]",
+'filerevert-badversion' => 'Kadada janis lokal bahari tumatan barakas ini lawan bacap waktu nang dimaksud.',
+
+# File deletion
+'filedelete' => 'Mahapus $1',
+'filedelete-legend' => 'Hapus barakas',
+'filedelete-intro' => "Pian huwal mahapus barakas '''[[Media:$1|$1]]''' awan barataan halamnya.",
+'filedelete-intro-old' => "Pian mahapus pirsi matan '''[[Media:$1|$1]]''' sawagai matan [$4 $3, $2].",
+'filedelete-comment' => 'Alasan:',
+'filedelete-submit' => 'Hapus',
+'filedelete-success' => "'''$1''' sudah tahapus.",
+'filedelete-success-old' => "Pirsi matan '''[[Media:$1|$1]]''' sawagai matan $3, $2 sudah tahapus.",
+'filedelete-nofile' => "'''$1''' kadada.",
+'filedelete-nofile-old' => "Kadada arsip pirsi matan '''$1''' lawan atribut diajuakan.",
+'filedelete-otherreason' => 'Alasan lain/tambahan:',
+'filedelete-reason-otherlist' => 'Alasan nang lain',
+'filedelete-reason-dropdown' => '*Alasan pahapusan
+** Palanggaran hak cipta
+** Barakas duplikat',
+'filedelete-edit-reasonlist' => 'Aalasan pahapusan babakan',
+
+# MIME search
+'mimesearch' => 'Panggagaian MIME',
+'mimetype' => 'Macam MIME',
+'download' => 'hunduh',
+
+# Unwatched pages
+'unwatchedpages' => 'Tungkaran nang kada diitihi',
+
+# List redirects
+'listredirects' => 'Daptar paugahan',
+
+# Unused templates
+'unusedtemplates' => 'Citakan nang kada dipuruk',
+'unusedtemplatestext' => "Daptar barikut adalah samua tungkaran pada ngaran kamar {{ns:template}} nang kada dipuruk di tungkaran manapun.
+Pariksa 'hulu tautan lain ka citakan itu sabalum mahapusnya.",
+'unusedtemplateswlh' => 'tautan lain',
+
+# Random page
+'randompage' => 'Tungkaran babarang',
+'randompage-nopages' => 'Kadada tungkaran pada {{PLURAL:$2||}}kamar ngaran ini: $1.',
+
+# Random redirect
+'randomredirect' => 'Paugahan babarang',
+'randomredirect-nopages' => 'Kada tadapat paugahan pada ngaran kamar "$1".',
+
+# Statistics
+'statistics' => 'Statistik',
+'statistics-header-pages' => 'Statistik tungkaran',
+'statistics-header-edits' => 'Statistik babakan',
+'statistics-header-views' => 'Statistik panampaian',
+'statistics-header-users' => 'Statistik pamuruk',
+'statistics-header-hooks' => 'Statistik lainnya',
+'statistics-articles' => 'Tungkaran isi',
+'statistics-pages' => 'Jumlah tungkaran',
+'statistics-pages-desc' => 'Sabarataan tungkaran di wiki ini, tamasuk tungkaran pamandiran, paugahan, wan lain-lain.',
+'statistics-files' => 'Barakas nang dihunggahakan',
+'statistics-edits' => 'Jumlah babakan tumatan {{SITENAME}} dimulai',
+'statistics-edits-average' => 'Rata-rata babakan par tungkaran',
+'statistics-views-total' => 'Jumlah panampaian tungkaran',
+'statistics-views-peredit' => 'Jumlah panampaian par babakan',
+'statistics-users' => 'Jumlah [[Special:ListUsers|pamuruk tadaptar]]',
+'statistics-users-active' => 'Jumlah pamuruk aktip',
+'statistics-users-active-desc' => 'Pamuruk nang sudah malakukan suatu aksi dalam {{PLURAL:$1|sahari|$1 hari}} tauncit.',
+'statistics-mostpopular' => 'Tungkaran nang paling banyak ditampaiakan',
+
+'doubleredirects' => 'Paugahan ganda',
+'double-redirect-fixed-move' => '[[$1]] sudah dipindahakan.
+Ngini wayah ini sudah diugahakan ka [[$2]].',
+'double-redirect-fixer' => 'Pambaiki paugahan',
+
+'brokenredirects' => 'Papaugahan pagat',
+'brokenredirectstext' => 'Tautan paugahab barikut manuju ka tutungkaran non-tasadia:',
+'brokenredirects-edit' => 'babak',
+'brokenredirects-delete' => 'hapus',
+
+'withoutinterwiki' => 'Tutungkaran kada batatautan bahasa',
+'withoutinterwiki-summary' => 'Tutungkaran barikut kada batautan ka pipirsi bahasa lain.',
+'withoutinterwiki-legend' => 'Mulaan',
+'withoutinterwiki-submit' => 'Tampaiakan',
+
+'fewestrevisions' => 'Tutungkaran lawanan raralatan pandikitnya.',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|bit|bit}}',
+'ncategories' => '{{PLURAL:$1|tumbung|tutumbung}}',
+'nlinks' => '$1 {{PLURAL:$1|tautan|tautan}}',
+'nmembers' => '$1 {{PLURAL:$1|angguta|angguta}}',
+'nrevisions' => '$1 {{PLURAL:$1|ralatan|raralatan}}',
+'nviews' => 'dilihat $1 {{PLURAL:$1|kali|kali}}',
+'nimagelinks' => "Diguna'akan pada $1 {{PLURAL:$1|tungkaran|tutungkaran}}",
+'ntransclusions' => 'dipuruk pada $1 {{PLURAL:$1|tungkaran|tutungkaran}}',
+'specialpage-empty' => 'Kadada kulihan gasan lapuran ngini.',
+'lonelypages' => 'Tutungkaran yatim',
+'lonelypagestext' => 'Tutungkaran barikut kada bataut matab atawa ditranklusi ka dalam tutungkaran lain pada {{SITENAME}}.',
+'uncategorizedpages' => 'Tutungkaran kada batumbung',
+'uncategorizedcategories' => 'Tutumbung kada batumbung',
+'uncategorizedimages' => 'Babarakas kada batumbung',
+'uncategorizedtemplates' => 'Cicitakan kada batumbung',
+'unusedcategories' => 'Tutumbung kada tapuruk',
+'unusedimages' => 'Babarakas kada tapuruk',
+'popularpages' => 'Tutungkaran populir',
+'wantedcategories' => 'Tutumbung naang dihandaki',
+'wantedpages' => 'Tutungkaran nang dihandaki',
+'wantedpages-badtitle' => 'Judul kada sah dalam setelan kulihan: $1',
+'wantedfiles' => 'Babarakas nang dihandaki',
+'wantedtemplates' => 'Cicitakan nang dihandaki',
+'mostlinked' => 'Tutungkaran tatuju tautan pambanyaknya',
+'mostlinkedcategories' => 'Tutumbung tatuju tautan pambanyaknya',
+'mostlinkedtemplates' => 'Cicitakan tatuju tautan pambanyaknya',
+'mostcategories' => 'Tutungkaran lawan pambanyaknya tutumbung',
+'mostimages' => 'Babarakas tatuju tautan pambanyaknya',
+'mostrevisions' => 'Tutungkaran lawan raralatan pambnyaknya',
+'prefixindex' => 'Samunyaan tungkaran wan awalan',
+'shortpages' => 'tutungkaran handap',
+'longpages' => 'Tutungkaran panjang',
+'deadendpages' => 'Tutungkaran buntu',
+'deadendpagestext' => 'Tutungkaran barikut kada bataut ka tutungkaran lain pada {{SITENAME}}.',
+'protectedpages' => 'Tutungkaran nang dilindungi',
+'protectedpages-indef' => 'Parlindungan kada bawatas haja',
+'protectedpages-cascade' => 'Parlindungan barenteng haja',
+'listusers' => 'Daptar pamuruk',
+'listusers-editsonly' => 'Tiringi papamuruk awan babakan',
+'listusers-creationsort' => 'Susun ulih tanggal paulahan',
+'usereditcount' => '$1 {{PLURAL:$1|babakan|bababakan}}',
+'usercreated' => 'Diulah pada $1, $2',
+'newpages' => 'Tungkaran hanyar',
+'newpages-username' => 'Ngaran pamuruk:',
+'ancientpages' => 'Tutungkaran panuhanya',
+'move' => 'Pindahakan',
+'movethispage' => 'Pindahakan tungkaran ini',
+'notargettitle' => 'Kadada tujuan',
+'pager-newer-n' => '{{PLURAL:$1|tahanyar 1|tahanyar $1}}',
+'pager-older-n' => '{{PLURAL:$1|talawas 1|talawas $1}}',
+
+# Book sources
+'booksources' => 'Buku bamula',
+'booksources-search-legend' => 'Gagai gasan buku asal mula',
+'booksources-go' => 'Tulak ka',
+
+# Special:Log
+'specialloguserlabel' => 'Pamuruk:',
+'speciallogtitlelabel' => 'Judul:',
+'log' => 'Log',
+'all-logs-page' => 'Samunyaan log umum',
+
+# Special:AllPages
+'allpages' => 'Samunyaan tungkaran',
+'alphaindexline' => '$1 sampai $2',
+'nextpage' => 'Tungkaran salanjutnya ($1)',
+'prevpage' => 'Tungkaran sabalumnya ($1)',
+'allpagesfrom' => 'Manampaiakan tungkaran mulai matan:',
+'allpagesto' => 'Manampaiakan ujung pahabisan tungkaran:',
+'allarticles' => 'Samunyaan tungkaran',
+'allinnamespace' => 'Sabarataan tutungkaran (ngaran-kamar $1)',
+'allnotinnamespace' => 'Sabarataan tutungkaran (lainan di ngaran-kamar $1)',
+'allpagesprev' => 'Sabalumnya',
+'allpagesnext' => 'Dudi',
+'allpagessubmit' => 'Tulak',
+'allpagesprefix' => 'Tampilakan tutungkaran bamula lawan:',
+
+# Special:Categories
+'categories' => 'Tutumbung',
+'special-categories-sort-count' => 'susun ulih rikinan',
+'special-categories-sort-abc' => 'susun abjad',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Hapus sumbangan pamuruk',
+'deletedcontributions-title' => 'Hapus sumbangan pamuruk',
+'sp-deletedcontributions-contribs' => 'Sumbangan',
+
+# Special:LinkSearch
+'linksearch' => 'Tautan luar',
+'linksearch-pat' => 'Gagai bapola:',
+'linksearch-ns' => 'Ngaran-kamar:',
+'linksearch-ok' => 'Gagai',
+'linksearch-line' => '$1 ditautakan matan $2',
+
+# Special:ListUsers
+'listusersfrom' => 'Manampaiakan papamuruk mulai matan:',
+'listusers-submit' => 'Tampaiakan',
+'listusers-noresult' => 'Kadada pamuruk tatamu.',
+'listusers-blocked' => '(diblukir)',
+
+# Special:ActiveUsers
+'activeusers' => 'Daptar pamuruk aktip',
+'activeusers-intro' => 'Ngini adalah sabuah daptar papamuruk sabuah bantuk kagiatan dalam tauncit $1 {{PLURAL:$1|hari|hahari}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|babak|babakan}} dalam tauncit {{PLURAL:$3|hari|$3 hahari}}',
+'activeusers-from' => 'Manampaiakan papamuruk mulai matan:',
+'activeusers-hidebots' => 'Sungkupakan bot',
+'activeusers-hidesysops' => 'Sungkupakan pambakal',
+'activeusers-noresult' => 'Kadada papamuruk tatamu.',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Log pamuruk hanyar',
+'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
+'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
+'newuserlog-create-entry' => 'mandaptar sabagai pamuruk',
+'newuserlog-create2-entry' => 'Maulah akun hanyar $1',
+'newuserlog-autocreate-entry' => 'Akun diulah utumatis',
+
+# Special:ListGroupRights
+'listgrouprights' => 'Galambang hak pamuruk',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Hak nang balaku</span>
+* <span class="listgrouprights-revoked">Hak nang dicukut</span>',
+'listgrouprights-group' => 'Galambang',
+'listgrouprights-rights' => 'Hak',
+'listgrouprights-helppage' => 'Help:Galambang hak',
+'listgrouprights-members' => '(daptar angguta)',
+'listgrouprights-addgroup' => 'Tambahi {{PLURAL:$2|galambang|gagalambang}}: $1',
+'listgrouprights-removegroup' => 'Hapus {{PLURAL:$2|galambang|gagalambang}}: $1',
+'listgrouprights-addgroup-all' => 'Tambahi samunyaan gagalambang',
+'listgrouprights-removegroup-all' => 'Hapus samunyaan gagalambang',
+'listgrouprights-addgroup-self' => 'Tambahi {{PLURAL:$2|galambang|gagalambang}} ka akun surang: $1',
+'listgrouprights-removegroup-self' => 'Hapus {{PLURAL:$2|galambang|gagalambang}} matan akun surang: $1',
+'listgrouprights-addgroup-self-all' => 'Tambahi samunyaan gagalambang ka akun surang',
+'listgrouprights-removegroup-self-all' => 'Hapus samunyaan gagalambang matan akun surang',
+
+# E-mail user
+'mailnologin' => 'Kadada alamat kirim',
+'emailuser' => 'Surel pamuruk',
+'emailpage' => 'Surili pamuruk',
+'usermailererror' => 'Objek surat ada kasalahan dibulikakan:',
+'defemailsubject' => 'Suril {{SITENAME}}',
+'usermaildisabled' => 'Suril pamuruk dipajahakan',
+'usermaildisabledtext' => 'Pian kada kawa mangirim suril ka papamuruk lain di wiki ngini',
+'noemailtitle' => 'Kadada alamat suril',
+'noemailtext' => 'Pamuruk ngini kada baisi sabuah alamat suril sah nang diajuakan.',
+'nowikiemailtitle' => 'Kadada suril dibulihakan.',
+'nowikiemailtext' => 'Pamuruk ngini sudah mamilih kada manarima suril matan papamuruk lain.',
+'email-legend' => 'Kirimi sabuah suril ka pamuruk {{SITENAME}} lain',
+'emailfrom' => 'Matan:',
+'emailto' => 'Hagan:',
+'emailsubject' => 'Parihal:',
+'emailmessage' => 'Pasan:',
+'emailsend' => 'Kirim',
+'emailccme' => 'Surili ulun sabuah salinan pasan ulun.',
+'emailccsubject' => 'Salinan pasan Pian hagan: $1: $2',
+'emailsent' => 'Suril takirim',
+'emailsenttext' => 'Suril pasan Pian sudah takirim.',
+'emailuserfooter' => 'Suril ngini dikirim ulih $1 hagan $2 lung pungsi "Suril pamuruk" pada {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Tinggalakan sistim pasan.',
+'usermessage-editor' => ' Sistim panyampai pasan',
+
+# Watchlist
+'watchlist' => 'Daptar itihan ulun',
+'mywatchlist' => 'Daptar itihan ulun',
+'watchlistfor2' => 'Gasan $1 $2',
+'nowatchlist' => 'Pian kada baisi apa pun pada daptar itihan Pian.',
+'watchlistanontext' => 'Muhun $1 hagan maniringi atawa mambabak nang dalam daptar itihan Pian.',
+'watchnologin' => 'Baluman babuat log',
+'watchnologintext' => 'Pian musti [[Special:UserLogin|babuat log]] amun handak magaganti daptar itihan Pian.',
+'addedwatch' => 'Sudah ditambahakan ka daptar itihan',
+'addedwatchtext' => "Tungkaran \"[[:\$1]]\" sudah ditambahakan ke [[Special:Watchlist|daptar itihan]] Pian.
+Parubahan-parubahan salanjutnya pada tungkaran ini dan tungkaran pamandiran taraitnya akan takambit di sia, wan tungkaran itu akan ditampaiakan '''kandal''' pada [[Special:RecentChanges|daptar parubahan tahanyar]] cagar labih mudah diitihi.",
+'removedwatch' => 'Sudah dibuang matan daptar itihan',
+'removedwatchtext' => 'Tungkaran "[[:$1]]" sudah dihapus matan [[Special:Watchlist|daptar itihan]] Pian.',
+'watch' => 'Itih',
+'watchthispage' => 'Itihi tungkaran ini',
+'unwatch' => 'walang maitihi',
+'unwatchthispage' => 'Mandak maitihi',
+'notanarticle' => 'Lainan sabuah tungkaran isi',
+'notvisiblerev' => 'Ralatan tauncit ulih saurang pamuruk babida sudah dihapus',
+'watchlist-details' => '{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.',
+'wlheader-enotif' => 'Suril pamadahan dipajahi.',
+'wlshowlast' => 'Tampaiakan $1 jam $2 hari pahabisan $3',
+'watchlist-options' => 'Pilihan daptar itihan',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Maitihi...',
+'unwatching' => 'Kada jadi maitihi...',
+
+'enotif_mailer' => 'Panyurili pamadahan {{SITENAME}}',
+'enotif_reset' => 'Tandai samunyaan tutungkaran sudah diilangi',
+'enotif_newpagetext' => 'Ngini adalah sabuah tungkaran hanyar.',
+'enotif_impersonal_salutation' => 'Pamuruk {{SITENAME}}',
+'changed' => "ta'ubah",
+'created' => "ta'ulah",
+'enotif_lastvisited' => 'Janaki $1 gasan samunyaan parubahan mula Pian pauncitan tadi bailang.',
+'enotif_lastdiff' => 'Janaki $1 hagaan maniringi parubahan ngini.',
+
+# Delete
+'deletepage' => 'Hapus tungkaran',
+'confirm' => 'Yakinakan',
+'excontent' => "isi sabalumnya: '$1'",
+'excontentauthor' => "isinya: '$1' haja (wan aasaannya panyumbang adalah '[[Special:Contributions/$2|$2]]')",
+'exbeforeblank' => "isi sabalum dikusungakan: '$1'",
+'exblank' => 'tungkaran dikusungakan',
+'delete-confirm' => 'Hapus "$1"',
+'delete-legend' => 'Hapus',
+'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',
+'deletedtext' => '"<nowiki>$1</nowiki>" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
+'deletedarticle' => 'mahapus "[[$1]]"',
+'dellogpage' => 'Log pahapusan',
+'deletionlog' => 'log pahapusan',
+'deletecomment' => 'Alasan:',
+'deleteotherreason' => 'Alasan lain/tambahan:',
+'deletereasonotherlist' => 'Alasan lain',
+
+# Rollback
+'rollbacklink' => 'bulikakan',
+'alreadyrolled' => 'Kada kawa malakukan pambulikan ka ralatan tauncit [[:$1]] ulih [[User:$2|$2]] ([[User talk:$2|pandir]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+pamuruk lain sudah mambabak atawa malakukan pambulikan lawan tungkaran ini.
+
+Babakan tauncit dilakukan ulih [[User:$3|$3]] ([[User talk:$3|pandir]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "Kumintar pambabakan adalah: \"''\$1''\".",
+'revertpage' => 'â†Babakan [[Special:Contributions/$2|$2]] ([[User talk:$2|pandir]]) dibulikakan ka ralatan tauncit ulih [[User:$1|$1]]',
+'revertpage-nouser' => 'Pambulikan babakan ulih (pamuruk dihapus) ka babakan tauncit ulih [[User:$1|$1]]',
+
+# Protect
+'protectlogpage' => 'Log palindungan',
+'protectedarticle' => "malindungi ''[[$1]]''",
+'modifiedarticleprotection' => 'maubah tingkat perlindungan "[[$1]]"',
+'unprotectedarticle' => 'mahilangakan palindungan "[[$1]]"',
+'movedarticleprotection' => 'mamindahakan pangaturan protéksi matan "[[$2]]" ka "[[$1]]"',
+'protect-title' => 'Malindungi "$1"',
+'prot_1movedto2' => '[[$1]] dipindahakan ka [[$2]]',
+'protect-legend' => 'Konpirmasi palindungan',
+'protectcomment' => 'Alasan:',
+'protectexpiry' => 'Kadaluwarsa:',
+'protect_expiry_invalid' => 'Waktu kadaluwarsa kada sah.',
+'protect_expiry_old' => 'Waktu kadaluwarsa adalah pada masa bahari.',
+'protect-text' => "Pian kawa maniring atawa mangganti tingkatan parlindungan gasan tungkaran '''<nowiki>$1</nowiki>''' di sia.",
+'protect-locked-access' => "Akun Pian kada baisi ijin gasan maubah tingkatan palindungan tungkaran.
+Di sia adalah pangaturan wayah ini gasan tungkaran '''$1''':",
+'protect-cascadeon' => 'Tungkaran ini rahatan dilindungi lantaran diumpatakan dalam {{PLURAL:$1|tungkaran|tungkaran-tungkaran}} barikut nang sudah aktip palindungan barénténgnya.
+Pian kawa maubah tingkatan palindungan gasan tungkaran ini, tagal ini kada pacang mangaruhi palindungan barénténg.',
+'protect-default' => 'Bulihakan samua pamuruk',
+'protect-fallback' => 'Mamarluakan ijin "$1"',
+'protect-level-autoconfirmed' => 'Blukir pamuruk hanyar wan kada tadaptar',
+'protect-level-sysop' => 'Hanya pambakal',
+'protect-summary-cascade' => 'barénténg',
+'protect-expiring' => 'kadaluwarsa $1 (UTC)',
+'protect-expiry-indefinite' => 'kada bawatas',
+'protect-cascade' => 'Lindungi tungkaran-tungkaran nang tamasuk dalam tungkaran ini (palindungan barénténg)',
+'protect-cantedit' => 'Pian kada kawa maubah tingkatan parlindungan tungkaran ini karana Pian kada baisi hak gasan itu.',
+'protect-othertime' => 'Wayah lain:',
+'protect-othertime-op' => 'wayah lain',
+'protect-existing-expiry' => 'Wayah kadaluwarsa nang ada: $2, $3',
+'protect-otherreason' => 'Alasan lain/tambahan:',
+'protect-otherreason-op' => 'Alasan nang lain',
+'protect-edit-reasonlist' => 'Aalasan parlindungan babakan',
+'protect-expiry-options' => '1 jam:1 hour,1 hari:1 day,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salawasan:infinite',
+'restriction-type' => 'Parijinan:',
+'restriction-level' => 'Tingkatan hinggan:',
+'minimum-size' => 'Ukuran minimum',
+'maximum-size' => 'Ukuran maksimum',
+'pagesize' => '(bita)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Babak',
+'restriction-move' => 'Pindahakan',
+'restriction-create' => 'Ulah',
+'restriction-upload' => 'Unggah',
+
+# Restriction levels
+'restriction-level-sysop' => 'palindungan hibak',
+'restriction-level-autoconfirmed' => '(semi-dilindungi)',
+'restriction-level-all' => 'samunyaan tingkatan',
+
+# Undelete
+'undelete' => 'Tiringi tutungkaran tahapus',
+'undeletepage' => 'Tiringi wan bulikakan tutungkaran tahapus',
+'viewdeletedpage' => 'Tiringi tutungkaran tahapus',
+'undelete-fieldset-title' => 'Mambulikakan ralatan',
+'undeleterevisions' => "$1 {{PLURAL:$1|ralatan|raralatan}} ta'arsip",
+'undelete-revision' => 'Ralatan tahapus matan $1 (pada $4, $5) ulih $3:',
+'undelete-nodiff' => 'Kadada ralatan sabalumnya tatamu.',
+'undeletebtn' => 'Bulikakan',
+'undeletelink' => 'tiring/bulikakan',
+'undeleteviewlink' => 'tiringi',
+'undeletereset' => 'Bulikakan setelan',
+'undeleteinvert' => 'Bulikakan pilihan',
+'undeletecomment' => 'Alasan:',
+'undeletedarticle' => "''[[$1]]'' sudah dibulikakan",
+'undeletedrevisions' => '{{PLURAL:$1|1 ralatan|$1 raralatan}} dibulikakan',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 ralatan|$1 raralatan}} and {{PLURAL:$2|1 barakas|$2 babarakas}} dibulikakan',
+'undeletedfiles' => '$1 {{PLURAL:$1|barakas|babarakas}} dibulikakan',
+'cannotundelete' => 'Walang mahapus gagal;
+ada urang lain nang badahulu mawalangi pahapusan tungkaran ngini.',
+'undelete-header' => 'Janaki [[Special:Log/delete|log pahapusan]] gasan tutungkaran hanyar tahapus.',
+'undelete-search-box' => 'Gagai tutungkaran tahapus',
+'undelete-search-prefix' => 'Tampaiakan tutungkaran bamula lawan:',
+'undelete-search-submit' => 'Gagai',
+'undelete-show-file-submit' => 'Iya-ai',
+
+# Namespace form on various pages
+'namespace' => 'Ngaran-kamar:',
+'invert' => 'Bulikakan pilihan',
+'blanknamespace' => '(Tatambaian)',
+
+# Contributions
+'contributions' => 'Sumbangan pamuruk',
+'contributions-title' => 'Sumbangan pamuruk gasan $1',
+'mycontris' => 'Sumbangan ulun',
+'contribsub2' => 'Gasan $1 ($2)',
+'uctop' => ' (atas)',
+'month' => 'Matan bulan (wan sabalumnya):',
+'year' => 'Matan tahun (wan sabalumnya):',
+
+'sp-contributions-newbies' => 'Tampaiakan sumbangan pamuruk-pamuruk hanyar haja',
+'sp-contributions-newbies-sub' => 'Gasan akun hanyar',
+'sp-contributions-newbies-title' => 'Sumbangan pamuruk gasan akun hanyar',
+'sp-contributions-blocklog' => 'Log blukir',
+'sp-contributions-deleted' => 'Tahapus sumbangan pamuruk',
+'sp-contributions-uploads' => 'hunggahan',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'pandir',
+'sp-contributions-userrights' => 'pangalulaan hak-hak pamuruk',
+'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-toponly' => 'Tampaiakan hanya ralatan tauncit',
+'sp-contributions-submit' => 'Gagai',
+
+# What links here
+'whatlinkshere' => 'Tautan apa di sia',
+'whatlinkshere-title' => "Tungkaran-tungkaran nang batautan ka ''$1''",
+'whatlinkshere-page' => 'Tungkaran:',
+'linkshere' => "Tungkaran-tungkaran barikut batautan ka '''[[:$1]]''':",
+'nolinkshere' => "Kadada tutungkaran tataut ka '''[[:$1]]'''.",
+'nolinkshere-ns' => "Kadada tutungkaran tataut ka '''[[:$1]]''' dalam ngaran-kamar nang dipilih.",
+'isredirect' => 'tungkaran paugahan',
+'istemplate' => 'transklusi',
+'isimage' => 'Tautan barakas',
+'whatlinkshere-prev' => '$1 {{PLURAL:$1|sabalumnya|sabalumnya}}',
+'whatlinkshere-next' => '{{PLURAL:$1|dudi|dudi $1}}',
+'whatlinkshere-links' => '↠tautan',
+'whatlinkshere-hideredirs' => '$1 paugahan',
+'whatlinkshere-hidetrans' => '$1 transklusi',
+'whatlinkshere-hidelinks' => '$1 tautan',
+'whatlinkshere-hideimages' => '$1 tautan pancitraan',
+'whatlinkshere-filters' => 'Saringan',
+
+# Block/unblock
+'blockip' => 'Blukir pamuruk',
+'blockip-title' => 'Blukir pamuruk',
+'blockip-legend' => 'Blukir pamuruk',
+'ipadressorusername' => 'Alamat IP atawa ngaran pamuruk:',
+'ipbexpiry' => 'Kadaluwarsa:',
+'ipbreason' => 'Alasan:',
+'ipbreasonotherlist' => 'Alasan nang lain',
+'ipbcreateaccount' => 'Tangkal paulahan akun',
+'ipbemailban' => 'Tangkal pamuruk mangirimi suril',
+'ipbenableautoblock' => 'Utumatis blukir alamat IP tauncit dipuruk ulih pamuruk ngini, wan sabarataan aalamat IP nang cuba dipuruk matan',
+'ipbsubmit' => 'Blukir pamuruk ngini',
+'ipbother' => 'Wayah lain:',
+'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salawasan:infinite',
+'ipbotheroption' => 'lainnya',
+'ipbotherreason' => 'Alasan lain/tambahan:',
+'ipbhidename' => 'Sungkupakan ngaranpamuruk matan babakan wan dadaptar',
+'ipbwatchuser' => 'Itihi tutungkaran pamuruk wan pamandiran pamuruk ngini',
+'ipb-change-block' => 'Blukir pulang pamuruk lawan setelan ngingini',
+'badipaddress' => 'Alamat IP kada sah',
+'blockipsuccesssub' => 'Pamblukiran ruhui',
+'ipb-edit-dropdown' => 'Aalasan pamblukiran babakan',
+'ipb-unblock-addr' => 'Mahilangakan blukir $1',
+'ipb-unblock' => 'Lapas blukir sabuah ngaranpamuruk atawa alamat IP',
+'ipb-blocklist' => 'Tiringi blukir nang ada',
+'ipb-blocklist-contribs' => 'Sumbangan gasan $1',
+'unblockip' => 'Lapas blukir pamuruk',
+'ipusubmit' => 'Buang blukir ngini',
+'unblocked' => '[[User:$1|$1]] sudah dicabut blukirnya',
+'unblocked-id' => 'Blukir $1 sudah dibuang',
+'ipblocklist' => 'Pamuruk tablukir',
+'ipblocklist-legend' => 'Ugai saurang pamuruk tablukir',
+'ipblocklist-submit' => 'Gagai',
+'ipblocklist-localblock' => 'Blukir lokal',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|pamblukiran|papamblukiran}} lain',
+'infiniteblock' => 'Kada bawatas',
+'expiringblock' => 'kadaluwarsa pada $1, $2',
+'anononlyblock' => 'kadabangaran haja',
+'noautoblockblock' => 'pamblukiran utumatis dipajahakan',
+'createaccountblock' => 'paulahan akun diblukir',
+'emailblock' => 'suril diblukir',
+'blocklist-nousertalk' => 'kada kawa mambabak tungkaran pamandiran surang',
+'ipblocklist-empty' => 'Daptar pamblukiran kusung.',
+'ipblocklist-no-results' => 'Alamat IP nang diminta atawa ngaran pamuruk kada diblukir.',
+'blocklink' => 'blukir',
+'unblocklink' => 'hilangakan blukir',
+'change-blocklink' => 'ubah blukir',
+'contribslink' => 'sumbangan',
+'blocklogpage' => 'Log blukir',
+'blocklogentry' => 'mamblukir [[$1]] sampai wayah $2 $3',
+'unblocklogentry' => 'Mahilangakan blukir "$1"',
+'block-log-flags-anononly' => 'papamuruk kada bangaran haja',
+'block-log-flags-nocreate' => 'Paulahan akun dipajahakan',
+'block-log-flags-noautoblock' => 'pamblukiran utumatis dipajahakan',
+'block-log-flags-noemail' => 'suril diblukir',
+'block-log-flags-nousertalk' => 'kada kawa mambabak tungkaran pamandiran surang',
+'block-log-flags-hiddenname' => 'ngaran-pamuruk tasungkup',
+'ipb_expiry_invalid' => 'Wayah kadaluwarsa kada sah.',
+'ipb_expiry_temp' => 'Pamblukiran ngaran-pamuruk tasungkup musti tatap.',
+'ipb_already_blocked' => '"$1" sudah diblukir',
+'ipb-otherblocks-header' => '{{PLURAL:$1|pamblukiran|papamblukiran}} lain',
+'ip_range_invalid' => 'Jarak IP kada sah.',
+'ip_range_toolarge' => 'Jarak blukir taganal pada /$1 kada dibulihakan.',
+'blockme' => 'Blokir ulun',
+'proxyblocker' => 'Pamblukir pruksi',
+'proxyblocker-disabled' => 'Pungsi ngini dipajahakan.',
+'proxyblocksuccess' => 'Sudah.',
+'sorbsreason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.',
+'sorbs_create_account_reason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.
+Pian kada kawa maulah sabuah akun',
+'cant-block-while-blocked' => 'Pian kada kawa mamblukir pamuruk lain parhatan Pian diblukir.',
+'cant-see-hidden-user' => 'Pamuruk nang Pian cuba blukir sudah diblukir wan tasungkup.
+Tumatan Pian kada baisi hak mnyungkupakan pamuruk, Pian kada kawa manjanaki atawa mambabak pamblukiran pamuruk.',
+'ipbblocked' => 'Pian kada kawa mamblukir atau malapas blukir pamuruk lain, karana Pian surang diblukir',
+'ipbnounblockself' => 'Pian kada dibulihakan malapas blukir Pian surang',
+
+# Developer tools
+'lockdb' => 'Sunduk basisdata',
+'unlockdb' => 'Lapas sunduk basisdata',
+'lockconfirm' => "I'ih, ulun bujuran handak manyunduk basisdata.",
+'unlockconfirm' => "I'ih, ulun bujuran handak malapas sunduk basisdata.",
+'lockbtn' => 'Sunduk basisdata',
+'unlockbtn' => 'Lapas sunduk basisdata',
+'locknoconfirm' => 'Pian kada mamariksa kutak payakinan.',
+'lockdbsuccesssub' => 'Basisdata ruhui disunduk',
+'unlockdbsuccesssub' => 'Sunduk basisdata dibuang',
+'unlockdbsuccesstext' => 'Basisdata sudah dilapas sunduknya.',
+
+# Move page
+'move-page' => 'Pindahakan $1',
+'move-page-legend' => 'Pindahakan tungkaran',
+'movepagetext' => "Mamuruk purmulir di bawah akan mangganti ngaran sabuah tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuah tungkaran paugahan ka judul hanyar. Pian kawa mahanyari bahwasanya paugahan-paugahan manuju ka judul nang samustinya langsung. Amun kada, pastiakan cuntring gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]]. Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.
+
+Catatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar itu, kacuali amun tungkaran itu puang atawa sabuah paugahan wan kadada halam babakan.
+
+'''Paringatan!'''
+Ini kawa maakibatakan parubahan kada taduga wan drastis gasan sabuah tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
+'movepagetalktext' => "Tungkaran pamandiran tarait akan langsung dipindahakan baimbai wan ini '''kacuali amun:'''
+*Sabuah tungkaran pamandiran nang kada puang sudah baisi awan judul hanyar, atawa
+*Pian kada manyuntring kutak di bawah.",
+'movearticle' => 'Pindahakan tungkaran:',
+'newtitle' => 'Ka judul hanyar:',
+'move-watch' => 'Itihi tungkaran asal mula wan tungkaran tujuan',
+'movepagebtn' => 'Pindahakan tungkaran',
+'pagemovedsub' => 'Pamindahan ruhui',
+'movepage-moved' => '\'\'\'"$1" sudah dipindahakan ka "$2"\'\'\'',
+'movepage-moved-redirect' => 'Tungkaran paugahan sudah diulah.',
+'articleexists' => 'Tungkaran lawan ngaran itu sudah ada atawa ngaran nang dipilih kada sah. Silakan pilih ngaran lain.',
+'talkexists' => "'''Tungkaran itu sudah ruhui dipindahakan, tapi tungkaran pamandirannya kada kawa tapindah karana sudah ada tungkaran pamandiran bajudul hanyar. Muhun gabungakan manual haja tungkaran-tungkaran itu.'''",
+'movedto' => 'dipindahakan ka',
+'movetalk' => 'Pindahakan tungkaran pamandiran nang tarait',
+'1movedto2' => 'mamindahakan [[$1]] ka [[$2]]',
+'1movedto2_redir' => 'mamindahakan [[$1]] ka [[$2]] malalui paugahan',
+'move-redirect-suppressed' => 'paugahan ditikin',
+'movelogpage' => 'Log pamindahan',
+'movelogpagetext' => 'Di bawah ngini adalah sabuah daptar matan samunyaan pamindahan tungkaran.',
+'movesubpage' => '{{PLURAL:$1|Subtungkaran|Subtutungkaran}}',
+'movesubpagetext' => 'Tungkaran ngini baisi $1 {{PLURAL:$1|subtungkaran|subtutungkaran}} ditampaiakan di bawah.',
+'movenosubpage' => 'Tungkaran ngini kada baisi subtutungkaran.',
+'movereason' => 'Alasan:',
+'revertmove' => 'bulikakan',
+'delete_and_move' => 'Hapus wan pindahakan',
+'delete_and_move_text' => '==pahapusan diparluakan==
+Tungkaran tatuju"[[:$1]]" sadauh tasadia.
+Pian handakkah hagan mahapus ngini maulah jalan gasan pamindahan?',
+'delete_and_move_confirm' => "I'ih, hapus tungkaran ngini",
+'delete_and_move_reason' => 'Dihapus hagan maulah jalan gasan pamindahan',
+'selfmove' => 'Asal mula wan tujuan bajudul sama;
+kada kawa mamindah sabuah tungkaran ka tungkaran ngitu jua.',
+'immobile-source-namespace' => 'Kada kawa mamindahakan tutungkaran pada ngarankamar "$1"',
+'immobile-target-namespace' => 'Kada kawa mamindahakan tutungkaran ka ngarankamar "$1"',
+'immobile-target-namespace-iw' => 'Tautan interwiki adalah lainan sabuah tujuan sah gasan mamindahakan tungkaran.',
+'immobile-source-page' => 'Tungkaran ngini kada kawa dipindahakan.',
+'immobile-target-page' => 'Kada kawa mamindahakan ka judul tujuan ngitu.',
+'imagenocrossnamespace' => 'Kada kawa mamindahakan barakas ka ngaran-kamar lainan-barakas.',
+'nonfile-cannot-move-to-file' => 'Kada kawa mamindahakan lainan-barakas ka ngaran-kamar barakas',
+'imagetypemismatch' => 'Ekstensi barakas hanyar kada cucuk lawa macamnya.',
+'imageinvalidfilename' => 'Ngaran barakas tujuan kada sah',
+'fix-double-redirects' => 'Mutakhirakan babarapa paugahan nang manitik ka judul asli',
+'move-leave-redirect' => 'Ulah paugahan ka judul hanyar',
+
+# Export
+'export' => 'Kirimi tungkaran ka luar',
+'export-submit' => 'Pangaluar',
+'export-addcat' => 'Tambahi',
+'export-addnstext' => 'Tambahi tutungkaran matan ngaran-kamar:',
+'export-addns' => 'Tambahi',
+'export-download' => 'Simpan sawagai barakas',
+'export-templates' => 'Tamasuk cicitakan',
+'export-pagelinks' => 'Tamasuk tutungkaran tataut sampai kadalaman:',
+
+# Namespace 8 related
+'allmessages' => ' Sistim papasanan',
+'allmessagesname' => 'Ngaran',
+'allmessagesdefault' => 'Naskah baku pasan',
+'allmessagescurrent' => 'Naskah pasan wayahini.',
+'allmessages-filter-legend' => 'Saringan',
+'allmessages-filter' => 'Saringan lawan kaadaan kustom:',
+'allmessages-filter-unmodified' => 'Kada digaganti',
+'allmessages-filter-all' => 'Samunyaan',
+'allmessages-filter-modified' => 'Digaganti',
+'allmessages-prefix' => 'Sarinngan lawan mulaan:',
+'allmessages-language' => 'Bahasa:',
+'allmessages-filter-submit' => 'Tulak',
+
+# Thumbnails
+'thumbnail-more' => 'Ganali',
+'filemissing' => 'Barakas hilang',
+'thumbnail_error' => 'Kasalahan maulah thumbnail: $1',
+'djvu_page_error' => 'Tungkaran DJVu di luar jarak',
+'djvu_no_xml' => 'Kada kawa kulihan XML gasan barakas DJVu',
+'thumbnail_invalid_params' => 'Takaran thumbnail kada sah',
+'thumbnail_dest_directory' => 'Kada kawa maulah direktori tujuan',
+'thumbnail_image-type' => 'Macam pancitraan kada disukung',
+'thumbnail_image-missing' => 'Barakas janakannya hilang: $1',
+
+# Special:Import
+'import' => 'Pamasuk tungkaran',
+'importinterwiki' => 'Impur transwiki',
+'import-interwiki-source' => 'Wiki/tungkaran asal mula:',
+'import-interwiki-history' => 'Salin sabarataan halam raralatan gasan tungkaran ngini',
+'import-interwiki-templates' => 'Tamasuk samunyaan cicitakan',
+'import-interwiki-submit' => 'Impur',
+'import-interwiki-namespace' => 'Ngaran-kamar tujuan:',
+'import-upload-filename' => 'Ngaran barakas:',
+'import-comment' => 'Kumintar:',
+'importstart' => 'Mangimpur tutungkaran...',
+'import-revision-count' => '$1 {{PLURAL:$1|ralatan|raralatan}}',
+'importnopages' => 'Kadada tutungkaran hagan diimpur.',
+'importfailed' => 'Impur gagal: <nowiki>$1</nowiki>',
+'importunknownsource' => 'Macam asal mula impur kada ditahui',
+'importcantopen' => 'Kada kawa mambuka barakas impur',
+'importbadinterwiki' => 'Tautan interwiki buruk',
+'importnotext' => 'Kusung atawa kadada naskah',
+'importsuccess' => 'Impur tuntung!',
+'importhistoryconflict' => 'Halam ralatan nang ada bacakut (pina suah diimpur tungkaran ngini sabalumnya)',
+'importnosources' => 'Kadada asal mula traswiki impur nang diulah wan halam hunggahan langsung dipajahakan.',
+'importnofile' => 'Kadada barakas impur tahunggah.',
+'importuploaderrorsize' => 'Hunggahan barakas impur gagal.
+Barakas ngini kaganalan pada takaran hunggahan nang dibulihakan.',
+'importuploaderrorpartial' => 'Hunggahan barakas impur gagal.
+Barakas ngini tahunggah sapalih haja.',
+'importuploaderrortemp' => 'Hunggahan barakas impur gagal.
+Sabuah puldar samantara hilang.',
+'import-parse-failure' => 'Kagagalan prusis impur XML',
+'import-noarticle' => 'Kadada tungkaran hagan diimpur!',
+'import-nonewrevisions' => 'Sabarataan raralatan suah diimpur sabalumnya.',
+'import-upload' => 'Hunggah data XML',
+'import-token-mismatch' => 'Kahilangan sesi data.
+Muhun cubai pulang.',
+'import-invalid-interwiki' => 'Kada kawa maimpur matan wiki nang diajuakan.',
+
+# Import log
+'importlogpage' => 'Log impur',
+'import-logentry-upload' => '[[$1]] diimpur lung hunggah barakas',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|ralatan|raralatan}}',
+'import-logentry-interwiki' => 'ditranswiki $1',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ralatan|raralatan}} matan $2',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Tungkaran pamuruk Pian',
+'tooltip-pt-anonuserpage' => 'Tungkaran pamuruk matan alamat IP Pian mambabak sawagai',
+'tooltip-pt-mytalk' => 'Tungkaran pamandiran Pian',
+'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-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-addsection' => 'Mulai hagian hanyar',
+'tooltip-ca-viewsource' => 'Tungkaran ini dilindungi. Pian kawa maniring asal mulanya.',
+'tooltip-ca-history' => 'Raralatan bahari tungkaran ini',
+'tooltip-ca-protect' => 'Lindungi tungkaran ini',
+'tooltip-ca-unprotect' => 'Buka palindungan tungkaran ini',
+'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-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-p-logo' => 'Ilangi tungkaran tatambaian',
+'tooltip-n-mainpage' => 'Ilangi tungkaran tatambaian',
+'tooltip-n-mainpage-description' => 'Ilangi Tungkaran Tatambaian',
+'tooltip-n-portal' => 'Pasal rangka-gawian, apa nang kawa pian gawi, di mana maugai sasuatu',
+'tooltip-n-currentevents' => 'Gagai panjalasan prihal paristiwa damini',
+'tooltip-n-recentchanges' => 'Daptar parubahan tahanyar dalam wiki',
+'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-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-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-ca-nstab-main' => 'Tiringi tungkaran isi',
+'tooltip-ca-nstab-user' => 'Tiring tungkaran pamuruk',
+'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',
+'tooltip-ca-nstab-image' => 'Tiringi barakas tungkaran',
+'tooltip-ca-nstab-mediawiki' => 'Tiring sistim pasan',
+'tooltip-ca-nstab-template' => 'Tiringi citakan',
+'tooltip-ca-nstab-help' => 'Tiringi tungkaran patulung',
+'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-diff' => 'Tampaiakan nang apa parubahan nang Pian ulah',
+'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ini',
+'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-preferences-save' => 'Simpan kakatujuan',
+'tooltip-summary' => 'Buati sabuah kasimpulan handap',
+
+# Metadata
+'notacceptable' => 'Server wiki kada kawa manyadiakan data dalam sabuah purmat nang client Pian kawa baca.',
+
+# Attribution
+'siteuser' => 'Pamuruk {{SITENAME}} $1',
+'anonuser' => 'Pamuruk kada bangaran {{SITENAME}} $1',
+'lastmodifiedatby' => 'Tungkaran ngini tauncit diubah pada $1, $2 ulih $3',
+'othercontribs' => 'Dipandalakan pada gawian ulih $1.',
+'others' => 'lainnya',
+'siteusers' => '{{PLURAL:$2|pamuruk|papamuruk}} {{SITENAME}} $1',
+'anonusers' => '{{PLURAL:$2|pamuruk|papamuruk}} kada bangaran {{SITENAME}} $1',
+'creditspage' => 'Tungkaran kridit',
+'nocredits' => 'Kadada panjalasan kridit tasadia gasan tungkaran ngini.',
+
+# Info page
+'infosubtitle' => 'Panjalasan gasan tungkaran',
+'numedits' => 'Rikinan babakan (tungkaran): $1',
+
+# Patrol log
+'patrol-log-diff' => 'Ralatan $1',
+
+# Image deletion
+'deletedrevision' => 'Raralatan lawas tahapus: $1',
+
+# Browsing diffs
+'previousdiff' => '↠Ralatan talawas',
+'nextdiff' => 'Ralatan tahanyar →',
+
+# Media information
+'file-info-size' => '$1 × $2 piksel, ukuran barakas: $3, tipe MIME: $4',
+'file-nohires' => '<small> kadada tasadia resolusi tapancau.</small>',
+'svg-long-desc' => 'Barakas SVG, nominal $1 × $2 piksel, basar barakas: $3',
+'show-big-image' => 'Ukuran hibak',
+'show-big-image-thumb' => '<small>Ukurannya tilikan ini: $1 × $2 piksel</small>',
+
+# Special:NewFiles
+'newimages-legend' => 'Saringan',
+'noimages' => 'Kadada nang dijanaki.',
+'ilsubmit' => 'Gagai',
+'bydate' => 'ulih tanggal',
+
+# Bad image list
+'bad_image_list' => "Purmatnya nangkaya di bawah ni:
+
+Daptar buting (baris bamula wan *) haja nang dipartimbangkan.
+Tautan ta'asa dalam sabuah baris mustinya sabuah tautan ka barakas nang buruk.
+Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nangkaya tungkaran-tungkaran di mana barakas itu ada.",
+
+# 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-expand' => 'Tampaiakan tambahan rincian',
+'metadata-collapse' => 'Sungkupakan tambahan rincian',
+'metadata-fields' => 'EXIF metadata tadaptar dalam pasan ini akan masuk dalam tungkaran pancitraan wayah tabel metadata tasungkup. Nang lainnya cagaran babaku tasungkup.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength',
+
+# EXIF tags
+'exif-jpeginterchangeformat' => 'Ofset ka JPEG SOI',
+'exif-usercomment' => 'Kumintar pamuruk',
+
+# External editor support
+'edit-externally' => 'Babak barakas ini puruk sabuah aplikasi luar',
+'edit-externally-help' => '(Lihati [http://www.mediawiki.org/wiki/Manual:External_editors setup instructions] untuk panjalasan labih)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'samunyaan',
+'namespacesall' => 'samunyaan',
+'monthsall' => 'samunyaan',
+
+# Trackbacks
+'trackbackremove' => '([$1 Hapus])',
+
+# Delete conflict
+'recreate' => 'Ulah pulang',
+
+# action=purge
+'confirm_purge_button' => 'OK',
+
+# Multipage image navigation
+'imgmultigo' => 'Tulak!',
+'imgmultigoto' => 'Tulak ka tungkaran $1',
+
+# Table pager
+'table_pager_limit_submit' => 'Tulak ka',
+
+# Watchlist editor
+'watchlistedit-normal-title' => 'Babak daptar itihan',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Tampaiakan parubahan tarait',
+'watchlisttools-edit' => 'Tiringi wan babak daptar itihan',
+'watchlisttools-raw' => 'Babak daptar itihan mantah',
+
+# Special:Version
+'version-specialpages' => 'Tungkaran istimiwa',
+'version-other' => 'Lain-lain',
+'version-hook-name' => 'Ngaran kait',
+
+# Special:FilePath
+'filepath' => 'Wadah barakas',
+'filepath-page' => 'Barakas:',
+'filepath-submit' => 'Gagai',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-submit' => 'Gagai',
+
+# Special:SpecialPages
+'specialpages' => 'Tungkaran istimiwa',
+'specialpages-note' => '----
+Pamaparan tampaian:
+* Tungkaran istimiwa normal
+* <strong class="mw-specialpagerestricted">Tungkaran istimiwa tahinggan</strong>',
+'specialpages-group-maintenance' => 'Lapuran pamaliharaan',
+'specialpages-group-other' => 'Tungkaran istimiwa lainnya',
+'specialpages-group-login' => 'Babuat log / mandaptar',
+'specialpages-group-changes' => 'Parubahan tahanyar wan log',
+'specialpages-group-media' => 'Lapuran wan pamuatan barakas',
+'specialpages-group-users' => 'Pamuruk wan hak pamuruk',
+'specialpages-group-highuse' => 'Tungkaran pamakaian tinggi',
+'specialpages-group-pages' => 'Daptar tungkaran',
+'specialpages-group-pagetools' => 'Pakakas tungkaran',
+'specialpages-group-wiki' => 'Data wan pakakas wiki',
+'specialpages-group-redirects' => 'Maugahakan tungkaran istimiwa',
+'specialpages-group-spam' => 'Pakakas spam',
+
+# Special:BlankPage
+'blankpage' => 'Tungkaran puang',
+'intentionallyblankpage' => "Tungkaran ini kurinah dibiarakan puang wan diguna'akan di antaranya gasan paukuran kinerja, wan lain-lain.",
+
+# Special:Tags
+'tags' => 'Tag parubahan sah',
+'tag-filter' => 'Saringan [[Special:Tags|Tag]]:',
+'tag-filter-submit' => 'Saringan',
+'tags-title' => 'Gantungan',
+'tags-tag' => 'Gantungan ngaran',
+'tags-display-header' => 'Pancungulan pada daptar parubahan.',
+'tags-edit' => 'babak',
+
+# Special:ComparePages
+'comparepages' => 'Bandingakan tutungkaran',
+'compare-page1' => 'Tungkaran 1',
+'compare-page2' => 'Tungkaran 2',
+'compare-rev1' => 'Ralatan 1',
+'compare-rev2' => 'Ralatan 2',
+
+# HTML forms
+'htmlform-selectorother-other' => 'Lain-lain',
+
+);
diff --git a/languages/messages/MessagesBn.php b/languages/messages/MessagesBn.php
index 824eb1d3..0a7335fd 100644
--- a/languages/messages/MessagesBn.php
+++ b/languages/messages/MessagesBn.php
@@ -13,6 +13,8 @@
* @author Jayantanth
* @author Prometheus.pyrphoros
* @author Reedy
+ * @author Samritmaity
+ * @author Usarker
* @author Wikitanvir
* @author Zaheen
* @author לערי ריינה×רט
@@ -73,8 +75,7 @@ $messages = array(
'tog-editsection' => '[সমà§à¦ªà¦¾à¦¦à¦¨à¦¾] সংযোগের সাহাযà§à¦¯à§‡ পরিচà§à¦›à§‡à¦¦ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার কà§à¦·à¦®à¦¤à¦¾ দেয়া হোক',
'tog-editsectiononrightclick' => 'পরিচà§à¦›à§‡à¦¦à§‡à¦° শিরোনামে ডান কà§à¦²à¦¿à¦•à§‡à¦° মাধà§à¦¯à¦®à§‡ <br />পরিচà§à¦›à§‡à¦¦ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার কà§à¦·à¦®à¦¤à¦¾ দেয়া হোক (জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ)',
'tog-showtoc' => 'সূচিপতà§à¦° দেখানো হোক (৩টির বেশি পরিচà§à¦›à§‡à¦¦à§‡à¦° শিরোনামবিশিষà§à¦Ÿ পাতার জনà§à¦¯)',
-'tog-rememberpassword' => 'à¦à¦•à¦¾à¦§à¦¿à¦• সেশনের জনà§à¦¯ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ মনে রাখা হোক',
-'tog-editwidth' => 'পà§à¦°à§‹ পরà§à¦¦à¦¾ ভরতে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বাকà§à¦¸à¦Ÿà¦¿ পà§à¦°à¦¸à¦¸à§à¦¤ করো',
+'tog-rememberpassword' => 'à¦à¦‡ বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡ আমার লগ ইন তথà§à¦¯ (শবà§à¦¦à¦šà¦¾à¦¬à¦¿) মনে রাখো (সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিনের|দিনের}} জনà§à¦¯)',
'tog-watchcreations' => 'আমার তৈরি পাতাগà§à¦²à¦¿ আমার নজরতালিকায় যোগ করা হোক',
'tog-watchdefault' => 'আমার সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ পাতাগà§à¦²à¦¿ আমার নজরতালিকায় যোগ করা হোক',
'tog-watchmoves' => 'আমার সরিয়ে ফেলা পাতাগà§à¦²à¦¿ আমার নজরতালিকায় যোগ করা হোক',
@@ -219,31 +220,21 @@ $messages = array(
'faqpage' => 'Project:পà§à¦°à¦¾à¦œà¦¿à¦ªà§à¦°',
# Vector skin
-'vector-action-addsection' => 'বিষয় যোগ',
-'vector-action-delete' => 'অপসারণ',
-'vector-action-move' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°',
-'vector-action-protect' => 'সà§à¦°à¦•à§à¦·à¦¾',
-'vector-action-undelete' => 'পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦°',
-'vector-action-unprotect' => 'অরকà§à¦·à¦¾',
-'vector-namespace-category' => 'বিষয়শà§à¦°à§‡à¦£à§€',
-'vector-namespace-help' => 'সাহাযà§à¦¯',
-'vector-namespace-image' => 'ফাইল',
-'vector-namespace-main' => 'পাতা',
-'vector-namespace-media' => 'মিডিয়া পাতা',
-'vector-namespace-mediawiki' => 'বারà§à¦¤à¦¾',
-'vector-namespace-project' => 'পà§à¦°à¦•à¦²à§à¦ª পাতা',
-'vector-namespace-special' => 'বিশেষ পাতা',
-'vector-namespace-talk' => 'আলাপ',
-'vector-namespace-template' => 'টেমà§à¦ªà¦²à§‡à¦Ÿ',
-'vector-namespace-user' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পাতা',
-'vector-view-create' => 'তৈরি করà§à¦¨',
-'vector-view-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
-'vector-view-history' => 'ইতিহাস',
-'vector-view-view' => 'পড়à§à¦¨',
-'vector-view-viewsource' => 'সোরà§à¦¸ দেখà§à¦¨',
-'actions' => 'কারà§à¦¯à¦•à§à¦°à¦®',
-'namespaces' => 'নামসà§à¦¥à¦¾à¦¨',
-'variants' => 'বিকলà§à¦ªà¦¸à¦®à§‚হ',
+'vector-action-addsection' => 'বিষয় যোগ',
+'vector-action-delete' => 'অপসারণ',
+'vector-action-move' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°',
+'vector-action-protect' => 'সà§à¦°à¦•à§à¦·à¦¾',
+'vector-action-undelete' => 'পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦°',
+'vector-action-unprotect' => 'অরকà§à¦·à¦¾',
+'vector-simplesearch-preference' => 'আরও সমৃদà§à¦§ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ পরামরà§à¦¶ সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨ (শà§à¦§à§à¦®à¦¾à¦¤à§à¦° ভেকà§à¦Ÿà¦° সà§à¦•à¦¿à¦¨à§‡à¦° জনà§à¦¯)',
+'vector-view-create' => 'তৈরি করà§à¦¨',
+'vector-view-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+'vector-view-history' => 'ইতিহাস',
+'vector-view-view' => 'পড়à§à¦¨',
+'vector-view-viewsource' => 'সোরà§à¦¸ দেখà§à¦¨',
+'actions' => 'কারà§à¦¯à¦•à§à¦°à¦®',
+'namespaces' => 'নামসà§à¦¥à¦¾à¦¨',
+'variants' => 'বিকলà§à¦ªà¦¸à¦®à§‚হ',
'errorpagetitle' => 'তà§à¦°à§à¦Ÿà¦¿',
'returnto' => '$1 শিরোনামের পাতায় ফেরত যান।',
@@ -304,6 +295,9 @@ $messages = array(
নতà§à¦¨ করে ঠপাতাটি দেখার চেষà§à¦Ÿà¦¾ করার আগে কিছà§à¦•à§à¦·à¦£ অপেকà§à¦·à¦¾ করà§à¦¨à¥¤
$1',
+'pool-timeout' => 'সময় উতà§à¦¤à¦¿à¦°à§à¦£ লক-à¦à¦° জনà§à¦¯ অপেকà§à¦·à¦¾à¦°à¦¤',
+'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}} বৃতà§à¦¤à¦¾à¦¨à§à¦¤',
@@ -466,7 +460,8 @@ $2',
'yourname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম (Username)',
'yourpassword' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (Password)',
'yourpasswordagain' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿à¦Ÿà¦¿ (password) আবার লিখà§à¦¨',
-'remembermypassword' => 'আমাকে পরবরà§à¦¤à§€à¦¤à§‡ মনে রাখা হোক',
+'remembermypassword' => 'à¦à¦•à¦¾à¦§à¦¿à¦• সেশনের জনà§à¦¯ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ মনে রাখা হোক (সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিনের|দিনের}} জনà§à¦¯)',
+'securelogin-stick-https' => 'লগইনের পর à¦à¦‡à¦šà¦Ÿà¦¿à¦Ÿà¦¿à¦ªà¦¿à¦à¦¸-à¦à¦° সাথে সংযোগকৃত থাকà§à¦¨',
'yourdomainname' => 'আপনার ডোমেইন',
'externaldberror' => 'হয় কোন বহিঃসà§à¦¥ যাচাইকরণ ডাটাবেজ তà§à¦°à§à¦Ÿà¦¿ ঘটেছে অথবা আপনার বহিঃসà§à¦¥ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ হালনাগাদ করার অনà§à¦®à¦¤à¦¿ নেই।',
'login' => 'পà§à¦°à¦¬à§‡à¦¶ করà§à¦¨',
@@ -483,6 +478,7 @@ $2',
'gotaccount' => "আপনার কি ইতিমধà§à¦¯à§‡ à¦à¦•à¦Ÿà¦¿ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা আছে? '''$1''' করà§à¦¨à¥¤",
'gotaccountlink' => 'পà§à¦°à¦¬à§‡à¦¶',
'createaccountmail' => 'ই-মেইলের মাধà§à¦¯à¦®à§‡',
+'createaccountreason' => 'কারণ:',
'badretype' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (password) দà§à¦Ÿà¦¿ মিলছেনা।',
'userexists' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামটি অনà§à¦¯ কেঊ আগেই বà§à¦¯à¦¬à¦¹à¦¾à¦° করেছে। দয়া করে অনà§à¦¯ নাম বেছে নিন।',
'loginerror' => 'লগ-ইন করতে সমসà§à¦¯à¦¾ হয়েছে',
@@ -502,6 +498,7 @@ $2',
'wrongpasswordempty' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (password) পà§à¦°à¦¬à§‡à¦¶à§‡à¦° ঘরটি খালি ছিল। দয়াকরে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
'passwordtooshort' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ অবশà§à¦¯à¦‡ {{PLURAL:$1|১ অকà§à¦·à¦°à§‡à¦°|$1 অকà§à¦·à¦°à§‡à¦°}} হতে হবে।',
'password-name-match' => 'আপনার শবà§à¦¦à¦šà¦¾à¦¬à¦¿ আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম থেকে আলাদা হতে হবে।',
+'password-login-forbidden' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম à¦à¦¬à¦‚ শবà§à¦¦à¦šà¦¾à¦¬à¦¿à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° নিষিদà§à¦§ করা হয়েছে।',
'mailmypassword' => 'নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ ই-মেইলে পাঠানো হোক',
'passwordremindertitle' => '{{SITENAME}}-à¦à¦° জনà§à¦¯ নতà§à¦¨ সাময়িক শবà§à¦¦à¦šà¦¾à¦¬à¦¿',
'passwordremindertext' => 'কেউ à¦à¦•à¦œà¦¨ ($1 আইপি ঠিকানাটি থেকে সমà§à¦­à¦¬à¦¤ আপনি) অনà§à¦°à§‹à¦§ করেছেন যেন আমরা আপনাকে {{SITENAME}} ($4) à¦à¦° জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পাঠাই।
@@ -536,6 +533,9 @@ $2',
'loginlanguagelabel' => 'ভাষা: $1',
'suspicious-userlogout' => 'আপনার পà§à¦°à¦¸à§à¦¥à¦¾à¦¨à§‡à¦° অনà§à¦°à§‹à¦§ বাতিল হয়েছে কারণ অনà§à¦®à¦¿à¦¤ যে আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° অসমà§à¦ªà§‚রà§à¦£ অথবা পূবরà§à¦¬à¦¤à§€ তথà§à¦¯ পà§à¦°à§‡à¦°à¦£ করেছে।',
+# E-mail sending
+'php-mail-error-unknown' => 'পিà¦à¦‡à¦šà¦ªà¦¿ à¦à¦° মেইল () কারà§à¦¯à§‡ অজà§à¦žà¦¾à¦¤ ভà§à¦²',
+
# Password reset dialog
'resetpass' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
'resetpass_announce' => 'আপন ই-মেইলকৃত সংকেত দà§à¦¬à¦¾à¦°à¦¾ লগ-ইন আছেন। লগ-ইন পদà§à¦§à¦¤à¦¿ সমà§à¦ªà§‚রà§à¦£ করতে আপনাকে অবশà§à¦¯à¦‡ à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ গà§à¦°à¦¹à¦£ করতে হবে:',
@@ -585,9 +585,10 @@ $2',
'showlivepreview' => 'তাৎকà§à¦·à¦£à¦¿à¦• পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨',
'showdiff' => 'পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ',
'anoneditwarning' => 'আপনি লগ ইন করেননি। à¦à¦‡ পাতার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° ইতিহাসে আপনার আইপি সংখà§à¦¯à¦¾ সংরকà§à¦·à¦¿à¦¤ হবে।',
+'anonpreviewwarning' => 'আপনি লগ ইন করেননি। à¦à¦‡ পাতার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° ইতিহাসে আপনার আইপি সংখà§à¦¯à¦¾ সংরকà§à¦·à¦¿à¦¤ হবে।',
'missingsummary' => "'''খেয়াল করà§à¦¨''': আপনি কিনà§à¦¤à§ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° সারাংশ দেননি। আবার যদি \"সংরকà§à¦·à¦£\" বোতামে কà§à¦²à¦¿à¦• করেন, তাহলে ঠসারাংশ বাকà§à¦¯à¦Ÿà¦¿ ছাড়াই আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সংরকà§à¦·à¦¿à¦¤ হবে।",
'missingcommenttext' => 'দয়াকরে নিচে মনà§à¦¤à¦¬à§à¦¯ যোগ করà§à¦¨à¥¤',
-'missingcommentheader' => "'''মনে রাখবেন:''' আপনি à¦à¦‡ মনà§à¦¤à¦¬à§à¦¯à§‡à¦° জনà§à¦¯ কোন বিষয়/শিরোনাম দেননি। আপনি যদি সংরকà§à¦·à¦£ বোতাম কà§à¦²à¦¿à¦• করেন, তাহলে আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কোন বিষয়/শিরোনাম ছাড়াই সংরকà§à¦·à¦¿à¦¤ হবে।",
+'missingcommentheader' => "'''খেয়াল করà§à¦¨:''' আপনি à¦à¦‡ মনà§à¦¤à¦¬à§à¦¯à§‡à¦° জনà§à¦¯ কোন বিষয়/শিরোনাম দেননি। সংরকà§à¦·à¦£ বোতামে কà§à¦²à¦¿à¦• করলে, আপনার à¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কোন বিষয়/শিরোনাম ছাড়াই সংরকà§à¦·à¦¿à¦¤ হবে।",
'summary-preview' => 'সারাংশ পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨:',
'subject-preview' => 'বিষয়/শিরোনাম পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨:',
'blockedtitle' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ বাধা দেয়া হয়েছে',
@@ -663,7 +664,11 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
'usercsspreview' => "'''মনে রাখবেন আপনি আপনার জনà§à¦¯ বরাদà§à¦§à¦•à§ƒà¦¤ সিà¦à¦¸à¦à¦¸ পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨ করছেন।
à¦à¦Ÿà¦¾ à¦à¦–নও সংরকà§à¦·à¦£ করা হয়নি!'''",
'userjspreview' => "'''মনে রাখà§à¦¨ আপনি আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ কেবলমাতà§à¦° পরীকà§à¦·à¦¾/পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨ করছেন। à¦à¦Ÿà¦¾ à¦à¦–নও সংরকà§à¦·à¦£ করা হয়নি!'''",
-'userinvalidcssjstitle' => "'''সতরà§à¦•à§€à¦•à¦°à¦£:''' \"\$1\" নামে কোন আবরণ নেই। মনে রাখবেন, পছনà§à¦¦à¦®à¦¾à¦«à¦¿à¦• .css à¦à¦¬à¦‚ .js পাতাগà§à¦²à¦¿ ছোট হাতের শিরোনাম বà§à¦¯à¦¬à¦¹à¦¾à¦° করে, যেমন {{ns:user}}:Foo/monobook.css; কিনà§à¦¤à§ à¦à¦°à¦•à¦® শিরোনাম নয়: {{ns:user}}:Foo/Monobook.css",
+'sitecsspreview' => "'''মনে রাখবেন আপনি আপনার জনà§à¦¯ বরাদà§à¦§à¦•à§ƒà¦¤ সিà¦à¦¸à¦à¦¸ পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨ করছেন।
+à¦à¦Ÿà¦¾ à¦à¦–নও সংরকà§à¦·à¦£ করা হয়নি!'''",
+'sitejspreview' => "'''মনে রাখà§à¦¨ আপনি আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ কেবলমাতà§à¦° পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨ করছেন।'''
+'''à¦à¦Ÿà¦¾ à¦à¦–নও সংরকà§à¦·à¦£ করা হয়নি!'''",
+'userinvalidcssjstitle' => "'''সতরà§à¦•à§€à¦•à¦°à¦£:''' \"\$1\" নামে কোন আবরণ নেই। মনে রাখবেন, পছনà§à¦¦à¦®à¦¾à¦«à¦¿à¦• .css à¦à¦¬à¦‚ .js পাতাগà§à¦²à¦¿ ছোট হাতের শিরোনাম বà§à¦¯à¦¬à¦¹à¦¾à¦° করে, যেমন {{ns:user}}:Foo/vector.css; কিনà§à¦¤à§ à¦à¦°à¦•à¦® শিরোনাম নয়: {{ns:user}}:Foo/Vector.css",
'updated' => '(হালনাগাদ)',
'note' => "'''নোট:'''",
'previewnote' => "'''à¦à¦Ÿà¦¿ পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨ মাতà§à¦°à¥¤ কোনো পরিবরà§à¦¤à¦¨ à¦à¦–নও সংরকà§à¦·à¦£ করা হয়নি!'''",
@@ -694,8 +699,6 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
আপনি আরো পà§à¦°à¦¤à¦¿à¦œà§à¦žà¦¾ করছেন যে, à¦à¦‡ লেখাগà§à¦²à§‹ আপনি নিজে লিখেছেন, বা সাধারণের বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ উনà§à¦®à§à¦•à§à¦¤ কোন উৎস থেকে সংগà§à¦°à¦¹ করেছেন।
'''সà§à¦¬à¦¤à§à¦¬ সংরকà§à¦·à¦¿à¦¤ কোন লেখা সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à¦°à§€à¦° অনà§à¦®à¦¤à¦¿ ছাড়া à¦à¦–ানে জমা দেবেন না!'''",
'copyrightwarning2' => "অনà§à¦—à§à¦°à¦¹ করে লকà§à¦· করà§à¦¨: {{SITENAME}}-à¦à¦° à¦à¦‡ ভà§à¦•à§à¦¤à¦¿à¦¤à§‡ আপনার লেখা বা অবদান অনà§à¦¯à¦¾à¦¨à§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°à¦¾ পরিবরà§à¦¤à¦¨ বা পরিবরà§à¦§à¦¨ করতে, à¦à¦®à¦¨à¦•à¦¿ মà§à¦›à§‡ ফেলতে পারবেন। {{SITENAME}} ঠআপনার সকল লেখালেখি/অবদান গনৠফà§à¦°à¦¿ ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡à¦° ($1) আওতায় বিনামূলà§à¦¯à§‡ পà§à¦°à¦¾à¦ªà§à¦¯ ও হসà§à¦¤à¦¾à¦¨à§à¦¤à¦°à¦¯à§‹à¦—à§à¦¯à¥¤ আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে à¦à¦¬à¦‚ যথেচà§à¦›à¦­à¦¾à¦¬à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে পারেন। আপনি যদি ঠবà§à¦¯à¦¾à¦ªà¦¾à¦°à§‡ à¦à¦•à¦®à¦¤ না হন, তাহলে à¦à¦–ানে আপনার লেখা জমা দেবেন না। আপনি আরো পà§à¦°à¦¤à¦¿à¦œà§à¦žà¦¾ করছেন যে, à¦à¦‡ লেখাগà§à¦²à§‹ আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° জনà§à¦¯ উনà§à¦®à§à¦•à§à¦¤ কোন উৎস থেকে সংগà§à¦°à¦¹ করেছেন। '''সà§à¦¬à¦¤à§à¦¬ সংরকà§à¦·à¦¿à¦¤ কোন লেখা সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à¦°à§€à¦° অনà§à¦®à¦¤à¦¿ ছাড়া à¦à¦–ানে জমা দেবেন না।'''",
-'longpagewarning' => "'''সতরà§à¦•à§€à¦•à¦°à¦£: à¦à¦‡ পাতাটি $1 কিলোবাইট দীরà§à¦˜; কিছৠবà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡ ৩২ কিলোবাইটের চেয়ে দীরà§à¦˜ পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে সমসà§à¦¯à¦¾ হতে পারে।
-অনà§à¦—à§à¦°à¦¹ করে পাতাটিকে à¦à¦•à¦¾à¦§à¦¿à¦• কà§à¦·à§à¦¦à§à¦°à¦¤à¦° অংশে ভাগ করার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤'''",
'longpageerror' => "'''তà§à¦°à§à¦Ÿà¦¿: আপনার জমা দেয়া টেকà§à¦¸à¦Ÿà§‡à¦° পরিমাণ $1 কিলোবাইট, যা সরà§à¦¬à§‹à¦šà§à¦š সীমা $2 কিলোবাইটের চেয়ে বেশি। à¦à¦Ÿà¦¿ সংরকà§à¦·à¦£ করা সমà§à¦­à¦¬ নয়।'''",
'readonlywarning' => "'''সতরà§à¦•à§€à¦•à¦°à¦£: রকà§à¦·à¦£à¦¾à¦¬à§‡à¦•à§à¦·à¦£à§‡à¦° জনà§à¦¯ ডাটাবেজ অবরà§à¦¦à§à¦§ রাখা হয়েছে, তাই à¦à¦‡ মà§à¦¹à§‚রà§à¦¤à§‡ আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সংরকà§à¦·à¦£ করতে পারবেন না।
আপনি চাইলে লেখাটি কাট à¦à¦¬à¦‚ পেষà§à¦Ÿ করে ভবিষà§à¦¯à¦¤à§‡à¦° জনà§à¦¯ কোন টেকà§à¦¸à¦Ÿ ফাইলে সংরকà§à¦·à¦£ করতে পারেন।'''
@@ -794,6 +797,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'rev-deleted-comment' => '(সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সারাংশ অপসারিত)',
'rev-deleted-user' => '(বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম সরিয়ে নেওয়া হয়েছে)',
'rev-deleted-event' => '(লগ অà§à¦¯à¦¾à¦•à¦¶à¦¨ সরানো হয়েছে)',
+'rev-deleted-user-contribs' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম অথবা আইপি ঠিকানা অপসারিত হয়েছে - অবদান থেকে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ আড়াল করা হয়েছে',
'rev-deleted-text-permission' => "পাতার à¦à¦‡ সংসà§à¦•à¦°à¦£à¦Ÿà¦¿ '''অপসারিত''' হয়েছে।
বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ কারণ à¦à¦° [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।",
'rev-deleted-text-unhide' => "পাতার à¦à¦‡ সংসà§à¦•à¦°à¦£à¦Ÿà¦¿ '''অপসারিত''' হয়েছে।
@@ -810,7 +814,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'revdelete-nologid-title' => 'ভà§à¦² লগ ভà§à¦•à§à¦¤à¦¿',
'revdelete-no-file' => 'নিরà§à¦§à¦¾à¦°à¦¿à¦¤ ফাইলটি নেই।',
'revdelete-show-file-submit' => 'হà§à¦¯à¦¾à¦',
-'revdelete-selected' => "'''[[:$1]]-à¦à¦° {{PLURAL:$2|টি নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধন|টি নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধন}}:'''",
+'revdelete-selected' => "'''[[:$1]] পাতার {{PLURAL:$2|নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধন|নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধনসমূহ}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|টি নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ লগ-ঘটনা|টি নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ লগ-ঘটনা}}:'''",
'revdelete-text' => "'''মà§à¦›à§‡ ফেলা সংশোধনগà§à¦²à§‹ à¦à¦¬à¦‚ ঘটনাগà§à¦²à¦¿ à¦à¦–নও পাতার ইতিহাস ও লগগà§à¦²à§‹à¦¤à§‡ দেখাবে, কিনà§à¦¤à§ তাদের বিষয়বসà§à¦¤à§à¦° অংশবিশেষ সরà§à¦¬à§‹à¦¸à¦¾à¦§à¦¾à¦°à¦£à§‡à¦° জনà§à¦¯ উনà§à¦®à§à¦•à§à¦¤ থাকবে না।'''
@@ -819,7 +823,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'revdelete-hide-text' => 'সংশোধিত লেখা আড়াল করো',
'revdelete-hide-image' => 'ফাইলের বিষয়বসà§à¦¤à§ আড়াল করো',
'revdelete-hide-name' => 'কাজ à¦à¦¬à¦‚ লকà§à¦·à§à¦¯ আড়াল করো',
-'revdelete-hide-comment' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ মনà§à¦¤à¦¬à§à¦¯ আড়াল করো',
+'revdelete-hide-comment' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সারাংশ আড়াল করো',
'revdelete-hide-user' => 'সমà§à¦ªà¦¾à¦¦à¦•à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম/আইপি আড়াল করো',
'revdelete-hide-restricted' => 'পà§à¦°à¦¶à¦¾à¦¸à¦•à¦¬à§ƒà¦¨à§à¦¦ à¦à¦¬à¦‚ অনà§à¦¯à¦¦à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ à¦à¦‡ ডাটা রোধ করো',
'revdelete-radio-same' => 'পরিবরà§à¦¤à¦¨ নয়',
@@ -829,11 +833,13 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'revdelete-unsuppress' => 'সংশোধন পà§à¦¨à¦ƒà¦¸à§à¦¥à¦¾à¦ªà¦¨à§‡à¦° উপর সীমাবদà§à¦§à¦¤à¦¾ দূর করো',
'revdelete-log' => 'কারণ:',
'revdelete-submit' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} পà§à¦°à¦¯à¦¼à§‹à¦— করো',
-'revdelete-logentry' => '[[$1]]-à¦à¦° সংশোধন দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করা হয়েছে',
-'logdelete-logentry' => '[[$1]]-à¦à¦° ঘটনা দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করা হয়েছে',
+'revdelete-logentry' => '[[$1]] পাতার সংশোধন দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করেছেন',
+'logdelete-logentry' => '[[$1]] পাতার ঘটনা দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করেছে',
'revdelete-success' => "'''সংশোধন দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ সফলভাবে হালনাগাদ করা হয়েছে।'''",
'logdelete-success' => "'''ঘটনা দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ সফলভাবে সà§à¦¥à¦¾à¦ªà¦¨ করা হয়েছে।'''",
-'revdel-restore' => 'দৃষà§à¦Ÿà¦¿à¦ªà¦¾à¦¤ পরিবরà§à¦¤à¦¨ করো',
+'revdel-restore' => 'দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করো',
+'revdel-restore-deleted' => 'অপসারিত সংসà§à¦•à¦°à¦£',
+'revdel-restore-visible' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à¦¯à§‹à¦—à§à¦¯ সংসà§à¦•à¦°à¦£',
'pagehist' => 'পাতার ইতিহাস',
'deletedhist' => 'ইতিহাস মà§à¦›à§‡ ফেলো',
'revdelete-content' => 'বিষয়বসà§à¦¤à§',
@@ -843,7 +849,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'revdelete-unrestricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ তà§à¦²à§‡ নাও',
'revdelete-hid' => '$1 আড়াল করা হয়েছে',
'revdelete-unhid' => '$1 পà§à¦°à¦•à¦¾à¦¶ করা হয়েছে',
-'revdelete-log-message' => '{{PLURAL:$2|টি সংশোধনের|টি সংশোধনের}} $1',
+'revdelete-log-message' => '$2{{PLURAL:$2|টি সংশোধনের|টি সংশোধনের}} $1',
'logdelete-log-message' => '$1 à¦à¦° জনà§à¦¯ $2 {{PLURAL:$2|ঘটনা|ঘটনা সমূহ}}',
'revdelete-reason-dropdown' => '*সাধারণ অপসারণের কারণসমূহ
** কপিরাইট লঙà§à¦˜à¦¨
@@ -889,11 +895,12 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
# Diffs
'history-title' => '"$1" à¦à¦° সংশোধনের ইতিহাস',
'difference' => '(সংসà§à¦•à¦°à¦£à¦—à§à¦²à§‹à¦° মধà§à¦¯à§‡ পারà§à¦¥à¦•à§à¦¯)',
+'difference-multipage' => 'পাতাগà§à¦²à§‹à¦° মধà§à¦¯à§‡ পারà§à¦¥à¦•à§à¦¯',
'lineno' => '$1 নং লাইন:',
'compareselectedversions' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংসà§à¦•à¦°à¦£à¦—à§à¦²à§‹ তà§à¦²à¦¨à¦¾ করো',
'showhideselectedversions' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধনগà§à¦²à§‹ দেখাও/লà§à¦•à¦¾à¦“',
'editundo' => 'বাতিল',
-'diff-multi' => '({{PLURAL:$1|à¦à¦•à¦Ÿà¦¿ অনà§à¦¤à¦°à§à¦¬à¦°à§à¦¤à§€à¦•à¦¾à¦²à§€à¦¨ সংশোধন|$1টি অনà§à¦¤à¦°à§à¦¬à¦°à§à¦¤à§€à¦•à¦¾à¦²à§€à¦¨ সংশোধন}} দেখানো হয়নি।)',
+'diff-multi' => '({{PLURAL:$2|à¦à¦•à¦œà¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ |$2 জন বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€}} সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ {{PLURAL:$1|à¦à¦•à¦Ÿà¦¿ অনà§à¦¤à¦°à§à¦¬à¦°à§à¦¤à§€à¦•à¦¾à¦²à§€à¦¨ সংশোধন|$1টি অনà§à¦¤à¦°à§à¦¬à¦°à§à¦¤à§€à¦•à¦¾à¦²à§€à¦¨ সংশোধন}} দেখানো হয়নি।)',
# Search results
'searchresults' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° ফলাফল',
@@ -901,6 +908,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'searchresulttext' => '{{SITENAME}} ঠঅনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° বà§à¦¯à¦¾à¦ªà¦¾à¦°à§‡ আরও তথà§à¦¯à§‡à¦° জনà§à¦¯ [[{{MediaWiki:Helppage}}|{{int:help}}]] দেখà§à¦¨à¥¤',
'searchsubtitle' => 'আপনি অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করেছেন \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|"$1" দিয়ে শà§à¦°à§ হওয়া সকল পাতাসমূহ]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" à¦à¦° সাথে সংযà§à¦•à§à¦¤ সকল পাতা]])',
'searchsubtitleinvalid' => "আপনি অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করেছেন '''$1'''",
+'toomanymatches' => 'à¦à¦•à¦‡ রকম অনেকগà§à¦²à§‹ উতà§à¦¤à¦° à¦à¦¸à§‡à¦›à§‡, অনà§à¦—à§à¦°à¦¹ করে অনà§à¦¯ কোন কà§à¦¯à¦¼à§‡à¦°à¦¿ দিন',
'titlematches' => 'নিবনà§à¦§à§‡à¦° শিরোনাম মিলেছে',
'notitlematches' => 'কোন পাতার শিরোনামের সাথে মিলে নেই',
'textmatches' => 'পাতার লেখার সাথে মিলেছে',
@@ -966,127 +974,140 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'qbsettings-floatingright' => 'ভাসমান ডান',
# Preferences page
-'preferences' => 'আমার পছনà§à¦¦',
-'mypreferences' => 'আমার পছনà§à¦¦',
-'prefs-edits' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° সংখà§à¦¯à¦¾:',
-'prefsnologin' => 'আপনি লগ-ইন করেননি',
-'prefsnologintext' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° পছনà§à¦¦ ঠিক করতে হলে আপনাকে অবশà§à¦¯à¦‡ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} লগইন]</span> করা অবসà§à¦¥à¦¾à¦¯à¦¼ থাকতে হবে।',
-'changepassword' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (password) পরিবরà§à¦¤à¦¨',
-'prefs-skin' => 'আবরণ (Skin)',
-'skin-preview' => 'পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨',
-'prefs-math' => 'গণিত',
-'datedefault' => 'কোন পছনà§à¦¦ নেই',
-'prefs-datetime' => 'তারিখ ও সময়',
-'prefs-personal' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বৃতà§à¦¤à¦¾à¦¨à§à¦¤',
-'prefs-rc' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ',
-'prefs-watchlist' => 'নজর তালিকা',
-'prefs-watchlist-days' => 'যত দিনের নজরতালিকা দেখানো হবে:',
-'prefs-watchlist-days-max' => 'সরà§à¦¬à§‹à¦šà§à¦š ৭ দিন',
-'prefs-watchlist-edits' => 'সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ নজর তালিকায় সরà§à¦¬à§‹à¦šà§à¦š সংখà§à¦¯à¦¾à¦° পরিবরà§à¦¤à¦¨ দেখানোর জনà§à¦¯:',
-'prefs-watchlist-edits-max' => 'সরà§à¦¬à§‹à¦šà§à¦š নামà§à¦¬à¦¾à¦°: ১০০০',
-'prefs-watchlist-token' => 'নজরতালিকা টোকেন:',
-'prefs-misc' => 'বিবিধ',
-'prefs-resetpass' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
-'prefs-email' => 'ই-মেইল অপশন',
-'prefs-rendering' => 'অবয়ব',
-'saveprefs' => 'সংরকà§à¦·à¦£ করো',
-'resetprefs' => 'অসংরকà§à¦·à¦¿à¦¤ পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ পরিসà§à¦•à¦¾à¦° করো',
-'restoreprefs' => 'সকল পূরà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ সেটিং ফিরিয়ে আনো',
-'prefs-editing' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
-'prefs-edit-boxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার।',
-'rows' => 'সারি:',
-'columns' => 'কলাম:',
-'searchresultshead' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
-'resultsperpage' => 'পà§à¦°à¦¤à¦¿ পাতায় হিট:',
-'contextlines' => 'লাইন পà§à¦°à¦¤à¦¿ হিটে:',
-'contextchars' => 'পà§à¦°à¦¤à¦¿ লাইনে কনà§â€Œà¦Ÿà§‡à¦•à§à¦¸à¦Ÿ সংখà§à¦¯à¦¾:',
-'stub-threshold' => '<a href="#" class="stub">অসমà§à¦ªà§‚রà§à¦£ নিবনà§à¦§à§‡à¦° সংযোগগà§à¦²à¦¿à¦°</a> বিশেষ ফরমà§à¦¯à¦¾à¦Ÿà¦¿à¦™à§‡à¦° সীমা (বাইটে):',
-'recentchangesdays' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡ দিনসমূহ দেখানোর জনà§à¦¯:',
-'recentchangesdays-max' => 'সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিন|দিন}}',
-'recentchangescount' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° সংখà§à¦¯à¦¾:',
-'savedprefs' => 'আপনার পছনà§à¦¦à¦—à§à¦²à§‹ সংরকà§à¦·à¦£ করা হয়েছে।',
-'timezonelegend' => 'সময় বলয়:',
-'localtime' => 'সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ সময়:',
-'timezoneuseserverdefault' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সারà§à¦­à¦¾à¦° পূরà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤',
-'timezoneuseoffset' => 'অনà§à¦¯ (অফসেট নিরà§à¦¦à¦¿à¦·à§à¦Ÿ করà§à¦¨)',
-'timezoneoffset' => 'সময়পারà§à¦¥à¦•à§à¦¯Â¹:',
-'servertime' => 'সারà§à¦­à¦¾à¦°à§‡à¦° সময়:',
-'guesstimezone' => 'বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° থেকে পূরণ করো',
-'timezoneregion-africa' => 'আফà§à¦°à¦¿à¦•à¦¾',
-'timezoneregion-america' => 'আমেরিকা',
-'timezoneregion-antarctica' => 'à¦à¦¨à§à¦Ÿà¦¾à¦°à§à¦Ÿà¦¿à¦•à¦¾',
-'timezoneregion-arctic' => 'আরà§à¦•à¦Ÿà¦¿à¦•',
-'timezoneregion-asia' => 'à¦à¦¶à¦¿à¦¯à¦¼à¦¾',
-'timezoneregion-atlantic' => 'আটলানà§à¦Ÿà¦¿à¦• মহাসাগর',
-'timezoneregion-australia' => 'অসà§à¦Ÿà§à¦°à§‡à¦²à¦¿à¦¯à¦¼à¦¾',
-'timezoneregion-europe' => 'ইউরোপ',
-'timezoneregion-indian' => 'ভারত মহাসাগর',
-'timezoneregion-pacific' => 'পà§à¦°à¦¶à¦¾à¦¨à§à¦¤ মহাসাগর',
-'allowemail' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦°à¦•à§‡ আপনাকে ই-মেইল পাঠানোর অনà§à¦®à¦¤à¦¿ দিন।',
-'prefs-searchoptions' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° পছনà§à¦¦à¦¸à¦®à§‚হ',
-'prefs-namespaces' => 'নামসà§à¦¥à¦¾à¦¨à¦¸à¦®à§‚হ',
-'defaultns' => 'নতà§à¦¬à¦¾ à¦à¦‡ নামসà§à¦¥à¦¾à¦¨à¦—à§à¦²à¦¿à¦¤à§‡ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করো:',
-'default' => 'আদি অবসà§à¦¥à¦¾',
-'prefs-files' => 'ফাইল',
-'prefs-custom-css' => 'সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ CSS',
-'prefs-custom-js' => 'সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ JS',
-'prefs-emailconfirm-label' => 'ই-মেইল নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£:',
-'prefs-textboxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার',
-'youremail' => 'ইমেইল *',
-'username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম:',
-'uid' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নং (ID):',
-'prefs-memberingroups' => '{{PLURAL:$1|দলের|দলসমূহের}} সদসà§à¦¯:',
-'prefs-registration' => 'নিবনà§à¦§à§‡à¦° সময়:',
-'yourrealname' => 'আসল নাম *',
-'yourlanguage' => 'ভাষা:',
-'yourvariant' => 'বিকলà§à¦ª:',
-'yournick' => 'সà§à¦¬à¦¾à¦•à§à¦·à¦°:',
-'prefs-help-signature' => 'আলাপ পাতায় আপনার মনà§à¦¤à¦¬à§à¦¯ অবশà§à¦¯à¦‡ "<nowiki>~~~~</nowiki>" চিহà§à¦¨ দà§à¦¬à¦¾à¦°à¦¾ সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ হতে হবে, যা সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ আপনার সà§à¦¬à¦¾à¦•à§à¦·à¦° ও সময় সংযà§à¦•à§à¦¤ করবে।',
-'badsig' => 'অবৈধ সà§à¦¬à¦¾à¦•à§à¦·à¦°; à¦à¦‡à¦šà¦Ÿà¦¿à¦à¦®à¦à¦² টà§à¦¯à¦¾à¦— পরীকà§à¦·à¦¾ করà§à¦¨à¥¤',
-'badsiglength' => 'আপনার সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦Ÿà¦¿ বেশ লমà§à¦¬à¦¾à¥¤
+'preferences' => 'আমার পছনà§à¦¦',
+'mypreferences' => 'আমার পছনà§à¦¦',
+'prefs-edits' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° সংখà§à¦¯à¦¾:',
+'prefsnologin' => 'আপনি লগ-ইন করেননি',
+'prefsnologintext' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° পছনà§à¦¦ ঠিক করতে হলে আপনাকে অবশà§à¦¯à¦‡ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} লগইন]</span> করা অবসà§à¦¥à¦¾à¦¯à¦¼ থাকতে হবে।',
+'changepassword' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (password) পরিবরà§à¦¤à¦¨',
+'prefs-skin' => 'আবরণ (Skin)',
+'skin-preview' => 'পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨',
+'prefs-math' => 'গণিত',
+'datedefault' => 'কোন পছনà§à¦¦ নেই',
+'prefs-datetime' => 'তারিখ ও সময়',
+'prefs-personal' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বৃতà§à¦¤à¦¾à¦¨à§à¦¤',
+'prefs-rc' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ',
+'prefs-watchlist' => 'নজর তালিকা',
+'prefs-watchlist-days' => 'যত দিনের নজরতালিকা দেখানো হবে:',
+'prefs-watchlist-days-max' => 'সরà§à¦¬à§‹à¦šà§à¦š ৭ দিন',
+'prefs-watchlist-edits' => 'সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ নজর তালিকায় সরà§à¦¬à§‹à¦šà§à¦š সংখà§à¦¯à¦¾à¦° পরিবরà§à¦¤à¦¨ দেখানোর জনà§à¦¯:',
+'prefs-watchlist-edits-max' => 'সরà§à¦¬à§‹à¦šà§à¦š নামà§à¦¬à¦¾à¦°: ১০০০',
+'prefs-watchlist-token' => 'নজরতালিকা টোকেন:',
+'prefs-misc' => 'বিবিধ',
+'prefs-resetpass' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
+'prefs-email' => 'ই-মেইল অপশন',
+'prefs-rendering' => 'অবয়ব',
+'saveprefs' => 'সংরকà§à¦·à¦£ করো',
+'resetprefs' => 'অসংরকà§à¦·à¦¿à¦¤ পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ পরিসà§à¦•à¦¾à¦° করো',
+'restoreprefs' => 'সকল পূরà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ সেটিং ফিরিয়ে আনো',
+'prefs-editing' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+'prefs-edit-boxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার।',
+'rows' => 'সারি:',
+'columns' => 'কলাম:',
+'searchresultshead' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
+'resultsperpage' => 'পà§à¦°à¦¤à¦¿ পাতায় হিট:',
+'contextlines' => 'লাইন পà§à¦°à¦¤à¦¿ হিটে:',
+'contextchars' => 'পà§à¦°à¦¤à¦¿ লাইনে কনà§â€Œà¦Ÿà§‡à¦•à§à¦¸à¦Ÿ সংখà§à¦¯à¦¾:',
+'stub-threshold' => '<a href="#" class="stub">অসমà§à¦ªà§‚রà§à¦£ নিবনà§à¦§à§‡à¦° সংযোগগà§à¦²à¦¿à¦°</a> বিশেষ ফরমà§à¦¯à¦¾à¦Ÿà¦¿à¦™à§‡à¦° সীমা (বাইটে):',
+'stub-threshold-disabled' => 'নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼',
+'recentchangesdays' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡ দিনসমূহ দেখানোর জনà§à¦¯:',
+'recentchangesdays-max' => 'সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিন|দিন}}',
+'recentchangescount' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° সংখà§à¦¯à¦¾:',
+'prefs-help-recentchangescount' => 'à¦à¦¤à§‡ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ, পাতার ইতিহাস à¦à¦¬à¦‚ লগ অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¥¤',
+'prefs-help-watchlist-token' => 'à¦à¦‡ ঘরটি à¦à¦•à¦Ÿà¦¿ গোপন শবà§à¦¦ চাবি দà§à¦¬à¦¾à¦°à¦¾ পূরণ করলে আপনার নজর তালিকার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ আরà¦à¦¸à¦à¦¸ ফিড তৈরী হবে। যারা à¦à¦‡ ঘরের চাবি জানবে তারা আপনার নজর তালিকা দেখতে পারবে, তাই à¦à¦•à¦Ÿà¦¿ গোপন মান বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤ à¦à¦–ানে à¦à¦²à§‹à¦®à§‡à¦²à§‹à¦­à¦¾à¦¬à§‡ তৈরী à¦à¦•à¦Ÿà¦¿ মান দেখানো হয়েছে যা আপনি বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে পারেন: $1',
+'savedprefs' => 'আপনার পছনà§à¦¦à¦—à§à¦²à§‹ সংরকà§à¦·à¦£ করা হয়েছে।',
+'timezonelegend' => 'সময় বলয়:',
+'localtime' => 'সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ সময়:',
+'timezoneuseserverdefault' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সারà§à¦­à¦¾à¦° পূরà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤',
+'timezoneuseoffset' => 'অনà§à¦¯ (অফসেট নিরà§à¦¦à¦¿à¦·à§à¦Ÿ করà§à¦¨)',
+'timezoneoffset' => 'সময়পারà§à¦¥à¦•à§à¦¯Â¹:',
+'servertime' => 'সারà§à¦­à¦¾à¦°à§‡à¦° সময়:',
+'guesstimezone' => 'বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° থেকে পূরণ করো',
+'timezoneregion-africa' => 'আফà§à¦°à¦¿à¦•à¦¾',
+'timezoneregion-america' => 'আমেরিকা',
+'timezoneregion-antarctica' => 'à¦à¦¨à§à¦Ÿà¦¾à¦°à§à¦Ÿà¦¿à¦•à¦¾',
+'timezoneregion-arctic' => 'আরà§à¦•à¦Ÿà¦¿à¦•',
+'timezoneregion-asia' => 'à¦à¦¶à¦¿à¦¯à¦¼à¦¾',
+'timezoneregion-atlantic' => 'আটলানà§à¦Ÿà¦¿à¦• মহাসাগর',
+'timezoneregion-australia' => 'অসà§à¦Ÿà§à¦°à§‡à¦²à¦¿à¦¯à¦¼à¦¾',
+'timezoneregion-europe' => 'ইউরোপ',
+'timezoneregion-indian' => 'ভারত মহাসাগর',
+'timezoneregion-pacific' => 'পà§à¦°à¦¶à¦¾à¦¨à§à¦¤ মহাসাগর',
+'allowemail' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦°à¦•à§‡ আপনাকে ই-মেইল পাঠানোর অনà§à¦®à¦¤à¦¿ দিন।',
+'prefs-searchoptions' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° পছনà§à¦¦à¦¸à¦®à§‚হ',
+'prefs-namespaces' => 'নামসà§à¦¥à¦¾à¦¨à¦¸à¦®à§‚হ',
+'defaultns' => 'নতà§à¦¬à¦¾ à¦à¦‡ নামসà§à¦¥à¦¾à¦¨à¦—à§à¦²à¦¿à¦¤à§‡ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করো:',
+'default' => 'আদি অবসà§à¦¥à¦¾',
+'prefs-files' => 'ফাইল',
+'prefs-custom-css' => 'সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ CSS',
+'prefs-custom-js' => 'সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ JS',
+'prefs-common-css-js' => 'সকল কà§à¦·à§‡à¦¤à§à¦°à§‡à¦° জনà§à¦¯ সিà¦à¦¸à¦à¦¸/জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ',
+'prefs-reset-intro' => 'আপনি à¦à¦‡ পাতা বà§à¦¯à¦¬à¦¹à¦¾à¦° করে আপনার পছনà§à¦¦à¦¸à¦®à§‚হকে সাইটের পূরà§à¦¬à¦ªà§à¦°à¦¦à¦¤à§à¦¤ সেটিংসে পরিবরà§à¦¤à¦¨ করতে পারেন।
+পরিবরà§à¦¤à¦¨ করার পর à¦à¦Ÿà¦¾ আর ফিরিয়ে আনা যাবে না।',
+'prefs-emailconfirm-label' => 'ই-মেইল নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£:',
+'prefs-textboxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার',
+'youremail' => 'ইমেইল *',
+'username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম:',
+'uid' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নং (ID):',
+'prefs-memberingroups' => '{{PLURAL:$1|দলের|দলসমূহের}} সদসà§à¦¯:',
+'prefs-registration' => 'নিবনà§à¦§à§‡à¦° সময়:',
+'yourrealname' => 'আসল নাম *',
+'yourlanguage' => 'ভাষা:',
+'yourvariant' => 'বিকলà§à¦ª:',
+'yournick' => 'সà§à¦¬à¦¾à¦•à§à¦·à¦°:',
+'prefs-help-signature' => 'আলাপ পাতায় আপনার মনà§à¦¤à¦¬à§à¦¯ অবশà§à¦¯à¦‡ "<nowiki>~~~~</nowiki>" চিহà§à¦¨ দà§à¦¬à¦¾à¦°à¦¾ সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ হতে হবে, যা সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ আপনার সà§à¦¬à¦¾à¦•à§à¦·à¦° ও সময় সংযà§à¦•à§à¦¤ করবে।',
+'badsig' => 'অবৈধ সà§à¦¬à¦¾à¦•à§à¦·à¦°; à¦à¦‡à¦šà¦Ÿà¦¿à¦à¦®à¦à¦² টà§à¦¯à¦¾à¦— পরীকà§à¦·à¦¾ করà§à¦¨à¥¤',
+'badsiglength' => 'আপনার সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦Ÿà¦¿ বেশ লমà§à¦¬à¦¾à¥¤
যা অবশà§à¦¯à¦‡ $1 {{PLURAL:$1|অকà§à¦·à¦°à§‡à¦°|অকà§à¦·à¦°à§‡à¦°}} বেশী হতে পারবে না।',
-'yourgender' => 'লিঙà§à¦—:',
-'gender-unknown' => 'অনà§à¦²à§à¦²à§‡à¦–িত',
-'gender-male' => 'পà§à¦°à§à¦·',
-'gender-female' => 'মহিলা',
-'email' => 'ই-মেইল',
-'prefs-help-realname' => 'আসল নাম দেওয়া অনাবশà§à¦¯à¦•à¥¤ যদি আসল নাম দেন, তবে আপনার কাজের সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿ দানে তা বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হবে।',
-'prefs-help-email' => 'ই-মেইল ঠিকানা à¦à¦šà§à¦›à¦¿à¦•, কিনà§à¦¤à§ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ ভà§à¦²à§‡ গেলে, à¦à¦Ÿà¦¿ নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পেতে আপনাকে সà§à¦¯à§‹à¦— করে দেবে।
+'yourgender' => 'লিঙà§à¦—:',
+'gender-unknown' => 'অনà§à¦²à§à¦²à§‡à¦–িত',
+'gender-male' => 'পà§à¦°à§à¦·',
+'gender-female' => 'মহিলা',
+'email' => 'ই-মেইল',
+'prefs-help-realname' => 'আসল নাম দেওয়া অনাবশà§à¦¯à¦•à¥¤ যদি আসল নাম দেন, তবে আপনার কাজের সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿ দানে তা বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হবে।',
+'prefs-help-email' => 'ই-মেইল ঠিকানা à¦à¦šà§à¦›à¦¿à¦•, কিনà§à¦¤à§ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ ভà§à¦²à§‡ গেলে, à¦à¦Ÿà¦¿ নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পেতে আপনাকে সà§à¦¯à§‹à¦— করে দেবে।
আপনার পরিচয় উনà§à¦®à§‹à¦šà¦¨ ছাড়াই অনà§à¦¯à¦°à¦¾ আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পাতা অথবা বà§à¦¯à¦¬à¦¹à¦¾à¦•à¦¾à¦°à§€_আলাপ পাতার মাধà§à¦¯à¦®à§‡ আপনার সাথে যোগাযোগ করতে পারে, à¦à¦®à¦¨à¦Ÿà¦¿à¦“ আপনি পছনà§à¦¦ করতে পারেন।',
-'prefs-help-email-required' => 'ই-মেইল ঠিকানা আবশà§à¦¯à¦•à¥¤',
-'prefs-info' => 'সাধারণ তথà§à¦¯',
-'prefs-i18n' => 'আনà§à¦¤à¦°à§à¦œà¦¾à¦¤à¦¿à¦•à¦¿à¦•à¦°à¦£',
-'prefs-signature' => 'সà§à¦¬à¦¾à¦•à§à¦·à¦°',
-'prefs-dateformat' => 'তারিখ বিনà§à¦¯à¦¾à¦¸',
-'prefs-timeoffset' => 'সময় অফসেট',
-'prefs-advancedediting' => 'উচà§à¦šà¦¤à¦° অপশন',
-'prefs-advancedrc' => 'উচà§à¦šà¦¤à¦° অপশন',
-'prefs-advancedrendering' => 'উচà§à¦šà¦¤à¦° অপশন',
-'prefs-advancedsearchoptions' => 'উচà§à¦šà¦¤à¦° অপশন',
-'prefs-advancedwatchlist' => 'উচà§à¦šà¦¤à¦° অপশন',
-'prefs-display' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
-'prefs-diffs' => 'পারà§à¦¥à¦•à§à¦¯',
+'prefs-help-email-required' => 'ই-মেইল ঠিকানা আবশà§à¦¯à¦•à¥¤',
+'prefs-info' => 'সাধারণ তথà§à¦¯',
+'prefs-i18n' => 'আনà§à¦¤à¦°à§à¦œà¦¾à¦¤à¦¿à¦•à¦¿à¦•à¦°à¦£',
+'prefs-signature' => 'সà§à¦¬à¦¾à¦•à§à¦·à¦°',
+'prefs-dateformat' => 'তারিখ বিনà§à¦¯à¦¾à¦¸',
+'prefs-timeoffset' => 'সময় অফসেট',
+'prefs-advancedediting' => 'উচà§à¦šà¦¤à¦° অপশন',
+'prefs-advancedrc' => 'উচà§à¦šà¦¤à¦° অপশন',
+'prefs-advancedrendering' => 'উচà§à¦šà¦¤à¦° অপশন',
+'prefs-advancedsearchoptions' => 'উচà§à¦šà¦¤à¦° অপশন',
+'prefs-advancedwatchlist' => 'উচà§à¦šà¦¤à¦° অপশন',
+'prefs-displayrc' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
+'prefs-displaysearchoptions' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
+'prefs-displaywatchlist' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
+'prefs-diffs' => 'পারà§à¦¥à¦•à§à¦¯',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ইমেইল ঠিকানাটি সঠিক',
+'email-address-validity-invalid' => 'সঠিক ইমেই ঠিকানা পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨',
# User rights
-'userrights' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾',
-'userrights-lookup-user' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ দল বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ করà§à¦¨',
-'userrights-user-editname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম লিখà§à¦¨:',
-'editusergroup' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° দল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করো',
-'editinguser' => "বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করছেন '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° দল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করো',
-'saveusergroups' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° দল সংরকà§à¦·à¦£ করো',
-'userrights-groupsmember' => 'সদসà§à¦¯:',
-'userrights-groups-help' => 'আপনি à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বরà§à¦¤à¦®à¦¾à¦¨ দল পরিবরà§à¦¤à¦¨ করতে পারবেন:
+'userrights' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾',
+'userrights-lookup-user' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ দল বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ করà§à¦¨',
+'userrights-user-editname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম লিখà§à¦¨:',
+'editusergroup' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° দল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করো',
+'editinguser' => "বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করছেন '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'userrights-editusergroup' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° দল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করো',
+'saveusergroups' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° দল সংরকà§à¦·à¦£ করো',
+'userrights-groupsmember' => 'সদসà§à¦¯:',
+'userrights-groupsmember-auto' => 'শরà§à¦¤à¦¹à§€à¦¨ সদসà§à¦¯',
+'userrights-groups-help' => 'আপনি à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বরà§à¦¤à¦®à¦¾à¦¨ দল পরিবরà§à¦¤à¦¨ করতে পারবেন:
* টিক চিহà§à¦¨ দেওয়া ঘরের অরà§à¦¥ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ à¦à¦–ন ঠদলের অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¥¤
* টিক চিহà§à¦¨ বিহীন ঘরের অরà§à¦¥ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ ঠদলের অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤ নন।
* à¦à¦•à¦Ÿà¦¿ তারকা চিহà§à¦¨ (*) দà§à¦¬à¦¾à¦°à¦¾ বোà¦à¦¾à¦¨à§‹ হচà§à¦›à§‡ à¦à¦‡ দলের অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¦¿à¦° পর আপনি আর তা বাতিল করতে পারবেন না।',
-'userrights-reason' => 'কারণ:',
-'userrights-no-interwiki' => 'আপনার অনà§à¦¯ উইকিতে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই।',
-'userrights-nodatabase' => '$1 ডাটাবেজটির হয় কোন অসà§à¦¤à¦¿à¦¤à§à¦¬ নেই অথবা à¦à¦Ÿà¦¿ সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ ডাটাবেজ নয়।',
-'userrights-nologin' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার পà§à¦°à¦¯à§à¦•à§à¦¤ করতে হলে আপনাকে কোন পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ [[Special:UserLogin|পà§à¦°à¦¬à§‡à¦¶]] করতে হবে।',
-'userrights-notallowed' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ থেকে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার পà§à¦°à¦¯à§à¦•à§à¦¤ করার অনà§à¦®à¦¤à¦¿ নেই।',
-'userrights-changeable-col' => 'দল যা আপনি পরিবরà§à¦¤à¦¨ করতে পারেন',
-'userrights-unchangeable-col' => 'দল যা আপনি পরিবরà§à¦¤à¦¨ করতে পারবেন না',
+'userrights-reason' => 'কারণ:',
+'userrights-no-interwiki' => 'আপনার অনà§à¦¯ উইকিতে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই।',
+'userrights-nodatabase' => '$1 ডাটাবেজটির হয় কোন অসà§à¦¤à¦¿à¦¤à§à¦¬ নেই অথবা à¦à¦Ÿà¦¿ সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ ডাটাবেজ নয়।',
+'userrights-nologin' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার পà§à¦°à¦¯à§à¦•à§à¦¤ করতে হলে আপনাকে কোন পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ [[Special:UserLogin|পà§à¦°à¦¬à§‡à¦¶]] করতে হবে।',
+'userrights-notallowed' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ থেকে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার পà§à¦°à¦¯à§à¦•à§à¦¤ করার অনà§à¦®à¦¤à¦¿ নেই।',
+'userrights-changeable-col' => 'দল যা আপনি পরিবরà§à¦¤à¦¨ করতে পারেন',
+'userrights-unchangeable-col' => 'দল যা আপনি পরিবরà§à¦¤à¦¨ করতে পারবেন না',
# Groups
'group' => 'দল:',
@@ -1156,6 +1177,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'right-mergehistory' => 'পাতার ইতিহাস à¦à¦•à§€à¦•à¦°à¦£ করà§à¦¨à¥¤',
'right-userrights' => 'সকল বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
'right-userrights-interwiki' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯ উইকির বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° অধিকারসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨à¥¤',
+'right-siteadmin' => 'ডাটাবেজ বনà§à¦§ à¦à¦¬à¦‚ খà§à¦²à§à¦¨',
'right-reset-passwords' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পà§à¦¨à¦°à¦¾à¦¯à¦¼ নিরà§à¦§à¦¾à¦°à¦£ করà§à¦¨',
'right-override-export-depth' => '৫ম সà§à¦¤à¦° পরà§à¦¯à¦¨à§à¦¤ সংযà§à¦•à§à¦¤à¦¿à¦¸à¦¹ à¦à¦•à¦Ÿà¦¿ পাতা রপà§à¦¤à¦¾à¦¨à§€ করà§à¦¨',
'right-sendemail' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ ইমেইল পাঠান',
@@ -1205,14 +1227,9 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'recentchanges-legend' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡à¦° পছনà§à¦¦à¦¸à¦®à§‚হ',
'recentchangestext' => 'à¦à¦‡ পাতায় উইকিটির সবচেয়ে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦—à§à¦²à¦¿ অনà§à¦¸à¦°à¦£ করà§à¦¨à¥¤',
'recentchanges-feed-description' => 'à¦à¦‡ ফিডে উইকিটির সবচেয়ে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦—à§à¦²à¦¿ অনà§à¦¸à¦°à¦£ করà§à¦¨à¥¤',
-'recentchanges-label-legend' => 'লিজেনà§à¦¡: $1।',
-'recentchanges-legend-newpage' => '$1 - নতà§à¦¨ পাতা',
'recentchanges-label-newpage' => 'à¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ পাতা তৈরি হয়েছে',
-'recentchanges-legend-minor' => '$1 - অনà§à¦²à§à¦²à§‡à¦–িত সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'recentchanges-label-minor' => 'à¦à¦Ÿà¦¿ à¦à¦•à¦Ÿà¦¿ অনà§à¦²à§à¦²à§‡à¦–িত সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
-'recentchanges-legend-bot' => '$1 - বট সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'recentchanges-label-bot' => 'à¦à¦Ÿà¦¿ বট দà§à¦¬à¦¾à¦°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤',
-'recentchanges-legend-unpatrolled' => '$1 - অপরীকà§à¦·à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'recentchanges-label-unpatrolled' => 'à¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà¦¿ à¦à¦–নও পরীকà§à¦·à¦¿à¦¤ নয়',
'rcnote' => "বিগত {{PLURAL:$2|দিনে|'''$2''' দিনে}} সংঘটিত {{PLURAL:$1|'''১'''|'''$1'''}}টি পরিবরà§à¦¤à¦¨ নীচে দেখানো হল (যেখানে বরà§à¦¤à¦®à¦¾à¦¨ সময় ও তারিখ $5, $4)।",
'rcnotefrom' => "'''$2'''-à¦à¦° পরে সংঘটিত পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ নিচে দেখানো হল ('''$1'''টি)।",
@@ -1291,6 +1308,13 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
পছনà§à¦¦à¦¨à§€à¦¯à¦¼ {{PLURAL:\$3|ফাইলের ধরন|ফাইলের ধরনগà§à¦²à§‹}} হলো \$2।",
'filetype-banned-type' => "'''\".\$1\"''' ফাইল ধরনটি অনà§à¦®à§‹à¦¦à¦¿à¦¤ নয়। অনà§à¦®à§‹à¦¦à¦¿à¦¤ {{PLURAL:\$3|ফাইলের ধরণ|ফাইলের ধরনগà§à¦²à§‹}} হল \$2।",
'filetype-missing' => 'à¦à¦‡ ফাইলটির কোন à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨ নেই (যেমন ".jpg")।',
+'empty-file' => 'আপনার জমাকৃত ফাইলটি খালি।',
+'file-too-large' => 'আপনার জমাকৃত ফাইলটি অনেক বড়।',
+'filename-tooshort' => 'ফাইল নামটি খà§à¦¬ ছোট।',
+'illegal-filename' => 'ফাইলের à¦à¦‡ নামটি গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়।',
+'unknown-error' => 'à¦à¦•à¦Ÿà¦¿ অজানা তà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে।',
+'tmp-create-error' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইল তৈরি করা যাবে না।',
+'tmp-write-error' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইলে লিখতে সমসà§à¦¯à¦¾ হয়েছে।',
'large-file' => '$1-à¦à¦° চেয়ে বড় আকারের ফাইল সà§à¦ªà¦¾à¦°à¦¿à¦¶ করা হয় না; à¦à¦‡ ফাইলটি $2।',
'largefileserver' => 'সারà§à¦­à¦¾à¦°à§‡ যতখানি অনà§à¦®à§‹à¦¦à¦¿à¦¤ তার চেয়ে à¦à¦‡ ফাইলের আকার বড়।',
'emptyfile' => 'আপনি যে ফাইলটি আপলোড করেছেন, তা খালি মনে হচà§à¦›à§‡à¥¤ ফাইলের নামে টাইপিং তà§à¦°à§à¦Ÿà¦¿à¦° কারণে à¦à¦°à¦•à¦® হতে পারে। অনà§à¦—à§à¦°à¦¹ করে পরীকà§à¦·à¦¾ করে দেখà§à¦¨ আপনি আসলেই à¦à¦‡ ফাইলটি আপলোড করতে চান কি না।',
@@ -1311,13 +1335,13 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'fileexists-shared-forbidden' => 'অংশীদারী ফাইল ভাণà§à¦¡à¦¾à¦°à§‡ à¦à¦‡ নামের à¦à¦•à¦Ÿà¦¿ ফাইল ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤
আপনি যদি à¦à¦–নো ফাইলটি আপলোড করতে চান, তবে অনà§à¦—à§à¦°à¦¹à¦ªà§‚রà§à¦¬à¦• পেছনে গিয়ে à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ নামে ফাইলটি আপলোড করà§à¦¨à¥¤[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'à¦à¦‡ ফাইলটি নিচের {{PLURAL:$1|ফাইল|ফাইলগà§à¦²à¦¿à¦°}} অনà§à¦²à¦¿à¦ªà¦¿:',
-'successfulupload' => 'আপলোড সফল হয়েছে',
'uploadwarning' => 'আপলোড সতরà§à¦•à¦¬à¦¾à¦£à§€',
'uploadwarning-text' => 'অনà§à¦—à§à¦°à¦¹ করে নিচে ফাইলের বরà§à¦£à¦¨à¦¾ পরিবরà§à¦¤à¦¨ করে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
'savefile' => 'সংরকà§à¦·à¦£',
'uploadedimage' => '"[[$1]]" আপলোড করা হয়েছে।',
'overwroteimage' => '"[[$1]]"-à¦à¦° à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ সংসà§à¦•à¦°à¦£ আপলোড করা হয়েছে',
'uploaddisabled' => 'আপলোড নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ আছে',
+'copyuploaddisabled' => 'ইউআরà¦à¦² à¦à¦° মাধà§à¦¯à¦®à§‡ আপলোড নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।',
'uploaddisabledtext' => 'ফাইল আপলোড নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼à¥¤',
'php-uploaddisabledtext' => 'পিà¦à¦‡à¦ªà¦¿ -ঠফাইল আপলোড নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।
অনà§à¦—à§à¦°à¦¹ করে file_uploads সেটিং পরীকà§à¦·à¦¾ করà§à¦¨à¥¤',
@@ -1337,6 +1361,9 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
à¦à¦‡ ফাইলটি আপলোড করা উচিত কি না বিবেচনা করে দেখà§à¦¨à¥¤
ফাইলটির অবলà§à¦ªà§à¦¤à¦¿ লগ আপনার সà§à¦¬à¦¿à¦§à¦¾à¦°à§à¦¥à§‡ à¦à¦–ানে দেওয়া হল:",
'filename-bad-prefix' => "আপনি যে ফাইলটি আপলোড করছেন, তার নাম '''\"\$1\"''' দিয়ে শà§à¦°à§ হয়েছে। ঠধরনের নাম সাধারণত ডিজিটাল কà§à¦¯à¦¾à¦®à§‡à¦°à¦¾à¦—à§à¦²à¦¿ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ দিয়ে থাকে à¦à¦¬à¦‚ à¦à¦—à§à¦²à¦¿ বà§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦®à§‚লক নয়। অনà§à¦—à§à¦°à¦¹ করে আপনার ফাইলের জনà§à¦¯ আরও বà§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦®à§‚লক à¦à¦•à¦Ÿà¦¿ নাম পছনà§à¦¦ করà§à¦¨à¥¤",
+'upload-success-subj' => 'আপলোড সফল হয়েছে',
+'upload-failure-subj' => 'আপলোড সমসà§à¦¯à¦¾',
+'upload-warning-subj' => 'আপলোড সতরà§à¦•à§€à¦•à¦°à¦£',
'upload-proto-error' => 'ভà§à¦² পà§à¦°à§‹à¦Ÿà§‹à¦•à¦²',
'upload-proto-error-text' => 'দূরবরà§à¦¤à§€ আপলোডের জনà§à¦¯ URLগà§à¦²à¦¿ <code>http://</code> বা <code>ftp://</code> দিয়ে শà§à¦°à§ হওয়া আবশà§à¦¯à¦•à¥¤',
@@ -1382,6 +1409,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'listfiles_search_for' => 'ছবির নাম অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨:',
'imgfile' => 'ফাইল',
'listfiles' => 'ছবির তালিকা',
+'listfiles_thumb' => 'সংকà§à¦·à§‡à¦ªà¦šà¦¿à¦¤à§à¦°',
'listfiles_date' => 'তারিখ',
'listfiles_name' => 'নাম',
'listfiles_user' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€',
@@ -1484,7 +1512,6 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'statistics-edits-average' => 'পà§à¦°à¦¤à¦¿ পাতার গড় সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'statistics-views-total' => 'সরà§à¦¬à§‹à¦®à§‹à¦Ÿ পà§à¦°à¦¦à¦°à§à¦¶à¦¨',
'statistics-views-peredit' => 'পà§à¦°à¦¤à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ পà§à¦°à¦¦à¦°à§à¦¶à¦¨',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue জব কিউয়ের] দৈরà§à¦˜à§à¦¯',
'statistics-users' => 'নিবনà§à¦§à¦¿à¦¤ [[Special:ListUsers|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€]]',
'statistics-users-active' => 'সকà§à¦°à¦¿à¦¯à¦¼ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€',
'statistics-users-active-desc' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} à¦à¦•à¦Ÿà¦¿ কাজ করেছেন।',
@@ -1495,7 +1522,8 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'disambiguations-text' => "নিচের পাতাগà§à¦²à¦¿ থেকে à¦à¦•à¦Ÿà¦¿ '''দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾ নিরসন পাতা'''-তে সংযোগ আছে। à¦à¦° পরিবরà§à¦¤à§‡ à¦à¦—à§à¦²à¦¿ থেকে à¦à¦•à¦Ÿà¦¿ উপযà§à¦•à§à¦¤ বিষয়ে সংযোগ থাকা আবশà§à¦¯à¦•à¥¤<br />যদি কোন পাতায় à¦à¦®à¦¨ কোন টেমপà§à¦²à§‡à¦Ÿ থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে à¦à¦•à¦Ÿà¦¿ দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾ নিরসন পাতা হিসেবে গণà§à¦¯ করা হয়।",
'doubleredirects' => 'দà§à¦‡à¦¬à¦¾à¦° করা পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦—à§à¦²à¦¿',
-'doubleredirectstext' => 'à¦à¦‡ পাতায় à¦à¦®à¦¨ পাতাগà§à¦²à¦¿à¦° তালিকা আছে, যেগà§à¦²à¦¿ অনà§à¦¯ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ পাতায় পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ করেছে। পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ সারিতে পà§à¦°à¦¥à¦® ও দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° জনà§à¦¯ সংযোগ আছে à¦à¦¬à¦‚ দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿à¦° লকà§à¦·à§à¦¯ সংযোগটিও দেওয়া আছে। à¦à¦‡ লকà§à¦·à§à¦¯ সংযোগটিই সাধারণত "আসল" লকà§à¦·à§à¦¯ পাতা, যেটিতে পà§à¦°à¦¥à¦® পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿ থেকে সংযোগ থাকা উচিত।',
+'doubleredirectstext' => 'à¦à¦‡ পাতায় à¦à¦®à¦¨ পাতাগà§à¦²à§‹à¦° তালিকা আছে, যেগà§à¦²à§‹ অনà§à¦¯ কোন পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ পাতায় পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ হয়েছে। পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ সারিতে পà§à¦°à¦¥à¦® ও দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° জনà§à¦¯ সংযোগ আছে à¦à¦¬à¦‚ দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿à¦° লকà§à¦·à§à¦¯ সংযোগটিও দেওয়া আছে। à¦à¦‡ লকà§à¦·à§à¦¯ সংযোগটিই সাধারণত "আসল" লকà§à¦·à§à¦¯ পাতা, যেটিতে পà§à¦°à¦¥à¦® পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿ থেকে সংযোগ থাকা উচিত।
+<del>কেটে দেওয়া</del> ভà§à¦•à§à¦¤à¦¿à¦—à§à¦²à§‹ ঠিক করা হয়েছে।',
'double-redirect-fixed-move' => '[[$1]] সরিয়ে নেওয়া হয়েছে।
à¦à¦Ÿà¦¿ à¦à¦–ন [[$2]] ঠপà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ হয়েছে।',
'double-redirect-fixer' => 'পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ মেরামতকারী',
@@ -1519,6 +1547,8 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'nmembers' => '$1 {{PLURAL:$1|সদসà§à¦¯|সদসà§à¦¯à¦¬à§ƒà¦¨à§à¦¦}}',
'nrevisions' => '$1 {{PLURAL:$1|সংশোধন|সংশোধনসমূহ}}',
'nviews' => '$1 {{PLURAL:$1|বার দেখা হয়েছে|বার দেখা হয়েছে}}',
+'nimagelinks' => '$1 {{PLURAL:$1|টি পাতায়| টি পাতায়}} বà§à¦¯à¦¬à¦¹à§ƒà¦¤',
+'ntransclusions' => '$1 {{PLURAL:$1|টি পাতায়| টি পাতায়}} বà§à¦¯à¦¬à¦¹à§ƒà¦¤',
'specialpage-empty' => 'à¦à¦‡ রিপোরà§à¦Ÿà§‡à¦° জনà§à¦¯ কোন ফলাফল নেই।',
'lonelypages' => 'পিতৃহীন পাতা',
'lonelypagestext' => 'নিচের পাতাগà§à¦²à§‹ {{SITENAME}} থেকে সংযোগকৃত বা পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà§à¦¤ হয়নি।',
@@ -1670,6 +1700,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
আপনি [[Special:Preferences|আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পছনà§à¦¦à§‡]] যে ই-মেইল ঠিকানাটি পà§à¦°à¦¬à§‡à¦¶ করিয়েছেন সেটিকে ই-মেইলের পà§à¦°à§‡à¦°à¦• হিসেবে দেখানো হবে, যেনো মেইলের পà§à¦°à¦¾à¦ªà¦• আপনাকে উতà§à¦¤à¦° দিতে পারেন।',
'usermailererror' => 'মেইল অবজেকà§à¦Ÿ তà§à¦°à§à¦Ÿà¦¿ পাঠিয়েছে:',
'defemailsubject' => '{{SITENAME}} ই-মেইল',
+'usermaildisabled' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ ই-মেইল নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼',
'noemailtitle' => 'ই-মেইল ঠিকানা নেই',
'noemailtext' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ কোন বৈধ ই-মেইল ঠিকানা জানাননি।',
'nowikiemailtitle' => 'কোন ইমেইল অনà§à¦®à§‹à¦¦à¦¿à¦¤ নয়',
@@ -1685,10 +1716,14 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'emailsenttext' => 'আপনার ই-মেইল বারà§à¦¤à¦¾ পà§à¦°à§‡à¦°à¦£ করা হয়েছে।',
'emailuserfooter' => 'à¦à¦‡ ই-মেইলটি {{SITENAME}} সাইটের "ই-মেইল করà§à¦¨" সà§à¦¬à¦¿à¦§à¦¾ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে $1-à¦à¦° পকà§à¦· থেকে $2-à¦à¦° নিকট পাঠানো হয়েছে।',
+# User Messenger
+'usermessage-summary' => 'বাদবাকি সিসà§à¦Ÿà§‡à¦® বারà§à¦¤à¦¾',
+'usermessage-editor' => 'সিসà§à¦Ÿà§‡à¦® মà§à¦¯à¦¾à¦¸à§‡à¦žà§à¦œà¦¾à¦°',
+
# Watchlist
'watchlist' => 'আমার নজর তালিকা',
'mywatchlist' => 'আমার নজর তালিকা',
-'watchlistfor' => "('''$1''' à¦à¦° জনà§à¦¯)",
+'watchlistfor2' => '$1 ($2)-à¦à¦° জনà§à¦¯',
'nowatchlist' => 'আপনার নজরতালিকা খালি।',
'watchlistanontext' => 'আপনার নজরতালিকার আইটেমগà§à¦²à¦¿ দেখতে বা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে অনà§à¦—à§à¦°à¦¹ করে $1।',
'watchnologin' => 'আপনি à¦à¦–নও লগ-ইন করেননি।',
@@ -1815,7 +1850,10 @@ $UNWATCHURL
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]]) à¦à¦° সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ সংসà§à¦•à¦°à¦£ হতে [[User:$1|$1]] à¦à¦° সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ সরà§à¦¬à¦¶à§‡à¦· সংসà§à¦•à¦°à¦£à§‡ ফেরত যাওয়া হয়েছে।',
'revertpage-nouser' => '(বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম অপসারিত) করà§à¦¤à§ƒà¦• সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà¦¿ বাতিলপূরà§à¦¬à¦• [[User:$1|$1]]-à¦à¦° সরà§à¦¬à¦¶à§‡à¦· সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ ফেরত যাওয়া হয়েছে।',
'rollback-success' => '$1-à¦à¦° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦—à§à¦²à¦¿ পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে নেওয়া হয়েছে; $2-à¦à¦° করা শেষ সংসà§à¦•à¦°à¦£à§‡ পাতাটি ফেরত নেওয়া হয়েছে।',
-'sessionfailure' => 'আপনার লগ ইন সেশনে à¦à¦•à¦Ÿà¦¿ সমসà§à¦¯à¦¾ হয়েছে বলে মনে হচà§à¦›à§‡;
+
+# Edit tokens
+'sessionfailure-title' => 'সেশন পরিতà§à¦¯à¦•à§à¦¤',
+'sessionfailure' => 'আপনার লগ ইন সেশনে à¦à¦•à¦Ÿà¦¿ সমসà§à¦¯à¦¾ হয়েছে বলে মনে হচà§à¦›à§‡;
সেশন হাইজà§à¦¯à¦¾à¦• পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡à¦° উপায় হিসেবে à¦à¦‡ কাজটি বাতিল করা হয়েছে।
অনà§à¦—à§à¦°à¦¹ বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° "back" বোতাম চাপà§à¦¨ à¦à¦¬à¦‚ যে পাতা থেকে à¦à¦¸à§‡à¦›à¦¿à¦²à§‡à¦¨, তা রিলোড করà§à¦¨ à¦à¦¬à¦‚ আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
@@ -1937,19 +1975,23 @@ $1',
'month' => 'à¦à¦‡ মাস (বা তার আগে) থেকে:',
'year' => 'à¦à¦‡ বছর (à¦à¦¬à¦‚ তার আগে) থেকে:',
-'sp-contributions-newbies' => 'শà§à¦§à§ নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° অবদানসমূহ দেখাও',
-'sp-contributions-newbies-sub' => 'নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° জনà§à¦¯',
-'sp-contributions-newbies-title' => 'নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অবদান',
-'sp-contributions-blocklog' => 'বাধা দানের লগ',
-'sp-contributions-deleted' => 'মà§à¦›à§‡ ফেলা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অবদান',
-'sp-contributions-logs' => 'লগসমূহ',
-'sp-contributions-talk' => 'আলোচনা',
-'sp-contributions-userrights' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾',
-'sp-contributions-blocked-notice' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ বরà§à¦¤à¦®à¦¾à¦¨à§‡ বাধাদানকৃত অবসà§à¦¥à¦¾à¦¯à¦¼ রয়েছেন।
+'sp-contributions-newbies' => 'শà§à¦§à§ নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° অবদানসমূহ দেখাও',
+'sp-contributions-newbies-sub' => 'নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° জনà§à¦¯',
+'sp-contributions-newbies-title' => 'নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অবদান',
+'sp-contributions-blocklog' => 'বাধা দানের লগ',
+'sp-contributions-deleted' => 'মà§à¦›à§‡ ফেলা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অবদান',
+'sp-contributions-uploads' => 'আপলোডসমূহ',
+'sp-contributions-logs' => 'লগসমূহ',
+'sp-contributions-talk' => 'আলোচনা',
+'sp-contributions-userrights' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾',
+'sp-contributions-blocked-notice' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ বরà§à¦¤à¦®à¦¾à¦¨à§‡ বাধাদানকৃত অবসà§à¦¥à¦¾à¦¯à¦¼ রয়েছেন।
তথà§à¦¯à¦¸à§‚তà§à¦° হিসেবে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• বাধাদান লগে ভà§à¦•à§à¦¤à¦¿à¦Ÿà¦¿ নিচে দেওয়া হলো:',
-'sp-contributions-search' => 'অবদানসমূহের জনà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
-'sp-contributions-username' => 'আইপি (IP) ঠিকানা অথবা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম:',
-'sp-contributions-submit' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
+'sp-contributions-blocked-notice-anon' => 'à¦à¦‡ আইপি ঠিকানাটি বরà§à¦¤à¦®à¦¾à¦¨à§‡ বাধাদানকৃত অবসà§à¦¥à¦¾à¦¯à¦¼ রয়েছে।
+তথà§à¦¯à¦¸à§‚তà§à¦° হিসেবে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• বাধাদান লগের ভà§à¦•à§à¦¤à¦¿à¦Ÿà¦¿ নিচে দেওয়া হলো:',
+'sp-contributions-search' => 'অবদানসমূহের জনà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
+'sp-contributions-username' => 'আইপি (IP) ঠিকানা অথবা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম:',
+'sp-contributions-toponly' => 'শà§à¦§à§à¦®à¦¾à¦¤à§à¦° সেই সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦—à§à¦²à¦¿ দেখেও যেগà§à¦²à§‹ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• সংসà§à¦•à¦°à¦£à§‡à¦° অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¥¤',
+'sp-contributions-submit' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
# What links here
'whatlinkshere' => 'সংযোগকারী পাতাসমূহ',
@@ -2010,7 +2052,6 @@ $1',
'ipb-edit-dropdown' => 'বাধাদানের কারণ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
'ipb-unblock-addr' => '$1-à¦à¦° উপর থেকে বাধা তà§à¦²à§‡ নেওয়া হোক',
'ipb-unblock' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ বা আইপি ঠিকানার উপর থেকে বাধা তà§à¦²à§‡ নেওয়া হোক',
-'ipb-blocklist-addr' => '$1-à¦à¦° জনà§à¦¯ বিদà§à¦¯à¦®à¦¾à¦¨ বà§à¦²à¦•à¦—à§à¦²à§‹ দেখà§à¦¨',
'ipb-blocklist' => 'বিদà§à¦¯à¦®à¦¾à¦¨ বাধাগà§à¦²à¦¿ দেখà§à¦¨',
'ipb-blocklist-contribs' => '$1 à¦à¦° অবদানসমূহ',
'unblockip' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° উপর থেকে বাধা তà§à¦²à§‡ নেওয়া হোক',
@@ -2293,6 +2334,8 @@ $1',
'tooltip-upload' => 'আপলোড শà§à¦°à§ করো',
'tooltip-rollback' => '"পà§à¦¨à¦°à§à¦¬à¦¹à¦¾à¦²" à¦à¦‡ পাতায় সরà§à¦¬à¦¶à§‡à¦· অবদানকারীর সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হ বাতিল করে পাতাটিকে পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে দেয়',
'tooltip-undo' => '"বাতিল" à¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦•à§‡ পূরà§à¦¬à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফিরত নিবে à¦à¦¬à¦‚ পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨ সহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ফরমটি খà§à¦²à¦¬à§‡à¥¤ à¦à¦Ÿà¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সারাংশতে à¦à¦° কারণ যোগ করার সà§à¦¯à§‹à¦— দিবে।',
+'tooltip-preferences-save' => 'পছনà§à¦¦ সংরকà§à¦·à¦£',
+'tooltip-summary' => 'à¦à¦•à¦Ÿà¦¿ সংকà§à¦·à¦¿à¦ªà§à¦¤ সারাংশ দিন',
# Metadata
'nodublincore' => 'Dublin Core RDF metadata à¦à¦‡ সারà§à¦­à¦¾à¦°à§‡à¦° জনà§à¦¯ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼à¥¤',
@@ -2384,10 +2427,10 @@ $1',
'imagemaxsize' => 'ছবির বিবরণ পাতায় পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ ছবির আকারের সরà§à¦¬à§‹à¦šà§à¦š সীমা:',
'thumbsize' => 'থামà§à¦¬à¦¨à§‡à¦‡à¦² আকার:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$1|পাতাট|পাতাগà§à¦²à§‹}}',
-'file-info' => '(ফাইলের আকার: $1, MIME ধরণ: $2)',
-'file-info-size' => '($1 × $2 pixel, ফাইলের আকার: $3, MIME ধরণ: $4)',
+'file-info' => 'ফাইলের আকার: $1, MIME ধরণ: $2',
+'file-info-size' => '$1 × $2 pixel, ফাইলের আকার: $3, MIME ধরণ: $4',
'file-nohires' => '<small>à¦à¦° চেয়ে বেশি রেজোলিউশন লভà§à¦¯ নয়।</small>',
-'svg-long-desc' => '(SVG ফাইল, সাধারণত $1 × $2 pixels, ফাইলের আকার: $3)',
+'svg-long-desc' => 'SVG ফাইল, সাধারণত $1 × $2 pixels, ফাইলের আকার: $3',
'show-big-image' => 'পূরà§à¦£ রেজোলিউশন',
'show-big-image-thumb' => '<small>আকারের পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨: $1 × $2 pixels</small>',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ফà§à¦°à§‡à¦®|ফà§à¦°à§‡à¦®}}',
@@ -2543,6 +2586,7 @@ $1',
'exif-gpsareainformation' => 'GPS à¦à¦²à¦¾à¦•à¦¾à¦° নাম',
'exif-gpsdatestamp' => 'GPS তারিখ',
'exif-gpsdifferential' => 'GPS ডিফারেনশিয়াল সংশোধন',
+'exif-objectname' => 'সংকà§à¦·à¦¿à¦ªà§à¦¤ শিরোনাম',
# EXIF attributes
'exif-compression-1' => 'অসংকà§à¦šà¦¿à¦¤',
@@ -2818,6 +2862,7 @@ $1',
'version-specialpages' => 'বিশেষ পাতাসমূহ',
'version-parserhooks' => 'পারà§à¦¸à¦¾à¦° হà§à¦•',
'version-variables' => 'চলক',
+'version-skins' => 'আবরণসমূহ (Skin)',
'version-other' => 'অনà§à¦¯',
'version-hooks' => 'হà§à¦•',
'version-extension-functions' => 'à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨à§‡à¦° কাজ',
@@ -2828,6 +2873,8 @@ $1',
'version-hook-subscribedby' => 'সাবসà§à¦•à§à¦°à¦¾à¦‡à¦¬ করেছেন',
'version-version' => '(সংসà§à¦•à¦°à¦£ $1)',
'version-license' => 'লাইসেনà§à¦¸',
+'version-poweredby-credits' => "à¦à¦‡à¦• উইকিটি পরিচালিত হচà§à¦›à§‡ '''[http://www.mediawiki.org/ মিডিয়াউইকি]'''-à¦à¦° মাধà§à¦¯à¦®à§‡, কপিরাইট © ২০০১-$1 $2।",
+'version-poweredby-others' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯',
'version-software' => 'ইনসà§à¦Ÿà¦²à¦•à§ƒà¦¤ সফটওয়à§à¦¯à¦¾à¦°',
'version-software-product' => 'পণà§à¦¯',
'version-software-version' => 'সংসà§à¦•à¦°à¦£',
@@ -2877,6 +2924,15 @@ $1',
'tags-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'tags-hitcount' => '$1 {{PLURAL:$1|পরিবরà§à¦¤à¦¨|পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ}}',
+# Special:ComparePages
+'comparepages' => 'পাতার তà§à¦²à¦¨à¦¾',
+'compare-selector' => 'পাতার সংশোধন তà§à¦²à¦¨à¦¾',
+'compare-page1' => 'পাতা ১',
+'compare-page2' => 'পাতা ২',
+'compare-rev1' => 'সংশোধন ১',
+'compare-rev2' => 'সংশোধন ২',
+'compare-submit' => 'তà§à¦²à¦¨à¦¾',
+
# Database error messages
'dberr-header' => 'à¦à¦‡ উইকিতে কোন সমসà§à¦¯à¦¾ রয়েছে',
'dberr-problems' => 'দà§à¦ƒà¦–িত!
@@ -2889,6 +2945,7 @@ $1',
# HTML forms
'htmlform-invalid-input' => 'আপনার পà§à¦°à¦¦à¦¾à¦¨à¦•à§ƒà¦¤ ইনপà§à¦Ÿà§‡ সমসà§à¦¯à¦¾ রয়েছে',
+'htmlform-required' => 'মান পà§à¦°à¦¦à¦¾à¦¨ করা আবশà§à¦¯à¦•à¥¤',
'htmlform-submit' => 'জমা দাও',
'htmlform-reset' => 'পরিবরà§à¦¤à¦¨ বাতিল',
'htmlform-selectorother-other' => 'অনà§à¦¯',
diff --git a/languages/messages/MessagesBo.php b/languages/messages/MessagesBo.php
index 5a3d6ba7..1c7aba1a 100644
--- a/languages/messages/MessagesBo.php
+++ b/languages/messages/MessagesBo.php
@@ -35,6 +35,7 @@ $messages = array(
'tog-usenewrc' => 'ཡར་རྒྱས་ཅན་གྱི་ཉེ་བའི་བཟོ་བཅོས་བེད་སྤྱོད་པà¼(Java ཡི་བརྡ་ཆད་དགོས)',
'tog-showtoolbar' => 'རྩོམ་སྒྲིག་ལག་ཆ་སྟོནà¼(Java ཡི་བརྡ་ཆད་དགོསà¼)',
'tog-editondblclick' => 'ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ལན་གཉིས་རྡེབà¼(Java ཡི་བརྡ་ཆད་དགོསà¼)',
+'tog-rememberpassword' => 'ངའི་ནང་འཛུལ་བཤར་ལྟ་ཆས་འདི་རུ་མང་མà½à½ à¼‹à½‰à½²à½“ $1 {{PLURAL:$1}} དྲན་པར་མཛོདà¼',
'tog-watchcreations' => 'ངའི་ལྟ་à½à½¼à½ à½²à¼‹à½‚ྲས་སུ་གསར་བཟོ་བྱས་པ་ལ་ཤོག་ངོས་à½à¼‹à½¦à¾£à½¼à½“à¼',
'tog-watchdefault' => 'ངའི་ལྟ་à½à½¼à½ à½²à¼‹à½‚ྲས་སུ་རྩོམ་སྒྲིག་བྱས་པ་ལ་ཤོག་ངོས་à½à¼‹à½¦à¾£à½¼à½“à¼',
'tog-watchmoves' => 'ངའི་ལྟ་à½à½¼à½ à½²à¼‹à½‚ྲས་སུ་སྤོར་བ་ལ་ཤོག་ངོས་à½à¼‹à½¦à¾£à½¼à½“à¼',
@@ -123,6 +124,7 @@ $messages = array(
'hidden-category-category' => 'སྦས་བའི་སྡེ་ཚནà¼',
'about' => 'སà¾à½¼à½¢à¼',
+'article' => 'ནང་དོན་ཤོག་ངོསà¼',
'newwindow' => '(སྒེའུ་à½à½´à½„་གསར་བར་ཕྱེ་བà¼)',
'cancel' => 'རྩིས་མེདà¼',
'moredotdotdot' => 'དེ་ལས་མང་བ་་་',
@@ -135,6 +137,7 @@ $messages = array(
'qbfind' => 'འཚོལ་བà¼',
'qbedit' => 'རྩོམ་སྒྲིག',
'qbpageoptions' => 'ཤོག་ངོས་འདིà¼',
+'qbpageinfo' => 'འབྲེལ་ཆགསà¼',
'qbmyoptions' => 'ངའི་ཤོག་ངོསà¼',
'qbspecialpages' => 'དམིཊ་བསལ་གྱི་བཟོ་བཅོསà¼',
'faq' => 'རྒྱུན་ལྡན་དྲི་བà¼',
@@ -180,6 +183,7 @@ $messages = array(
'protect' => 'སྲུང་བà¼',
'protect_change' => 'སྒྱུར་བཅོསà¼',
'protectthispage' => 'ཤོག་ངོས་འདི་སྲུང་བà¼',
+'unprotect' => 'ཉེན་སྲུང་མེད་པà¼',
'unprotectthispage' => 'ཤོག་ངོས་འདི་སྲུང་བ་དོར་བà¼',
'newpage' => 'ཤོག་ངོས་གསར་བà¼',
'talkpage' => 'ཤོག་ངོས་འདིར་གྲོས་སྡུརà¼',
@@ -187,6 +191,7 @@ $messages = array(
'specialpage' => 'དམིགས་གསལ་ཤོག་ངོསà¼',
'personaltools' => 'སྒེར་ཀྱི་ལག་ཆà¼',
'postcomment' => 'སྡེ་ཚན་གསར་བà¼',
+'articlepage' => 'ནང་དོན་ཤོག་ངོས་ལ་ལྟ་བà¼',
'talk' => 'གྲོས་བསྡུརà¼',
'views' => 'མà½à½¼à½„་རིསà¼',
'toolbox' => 'ལག་ཆའི་སྒྲོམà¼',
@@ -200,11 +205,13 @@ $messages = array(
'viewtalkpage' => 'གྲོས་མོལ་ལ་ལྟ་བà¼',
'otherlanguages' => 'སà¾à½‘་རིགས་གཞནà¼',
'redirectedfrom' => '$1 ནས་à½à¼‹à½•à¾±à½¼à½‚ས་བསà¾à¾±à½¢à¼‹à½‘ུ་བཟོས་པà¼',
+'redirectpagesub' => 'རིམ་འགྲེམ་ཤོག་ངོསà¼',
'lastmodifiedat' => 'དྲ་ངོས་འདི་ཡི་བཟོ་བཅོས་མà½à½ à¼‹à½˜à¼‹$1$2སྟེང་རེདà¼',
'protectedpage' => 'སྲུང་སà¾à¾±à½¼à½–་བྱས་པའི་ཤོག་ངོསà¼',
'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' => '{{SITENAME}}ངེད་ཀྱི་སà¾à½¼à½¢à¼',
@@ -244,6 +251,8 @@ $messages = array(
'viewdeleted' => ' $1 ལ་ལྟའམà¼',
'site-rss-feed' => '$1 ཡི་RSS འབྱུང་à½à½´à½„སà¼',
'site-atom-feed' => '$1 ཡི་Atom འབྱུང་à½à½´à½„སà¼',
+'page-rss-feed' => '$1 ཡི་RSS འབྱུང་à½à½´à½„སà¼',
+'page-atom-feed' => '$1 ཡི་Atom འབྱུང་à½à½´à½„སà¼',
'red-link-title' => '$1 ( ཤོག་ངོས་མེད་པà¼)',
# Short words for each namespace, by default used in the namespace tab in monobook
@@ -258,18 +267,23 @@ $messages = array(
'nstab-category' => 'དཀར་ཆག',
# Main script and global functions
-'nosuchaction' => 'བྱ་འགུལ་འདི་འདྲ་མེདà¼',
+'nosuchaction' => 'བྱ་འགུལ་འདི་འདྲ་མེདà¼',
+'nosuchspecialpage' => 'དམིགས་བསལ་ཤོག་ངོས་འདི་འདྲ་ཞིག་མི་འདུག',
# General errors
-'error' => 'ནོར་འà½à¾²à½´à½£à¼',
-'readonly' => 'གཞི་གྲངས་མཛོད་ཟྭ་བརྒྱབ་པà¼',
-'internalerror' => 'ནང་ལོག་ནོར་སà¾à¾±à½¼à½“à¼',
-'internalerror_info' => 'ནང་ལོགས་ནོར་སà¾à¾±à½¼à½“༠$1',
-'filecopyerror' => '"$1" "$2"ལ་འདྲ་བཤུ་བྱེད་མ་à½à½´à½–à¼',
-'filedeleteerror' => '"$1"ཟེར་བ་སུབ་མ་à½à½´à½–à¼',
-'filenotfound' => '"$1"ཟེར་བའི་ཡིག་ཆ་མ་རྙེད་པà¼',
-'badtitle' => 'à½à¼‹à½–ྱང་སà¾à¾±à½¼à½“་ཅནà¼',
-'viewsource' => 'à½à½¼à½„ས་ལ་ལྟ་བà¼',
+'error' => 'ནོར་འà½à¾²à½´à½£à¼',
+'readonly' => 'གཞི་གྲངས་མཛོད་ཟྭ་བརྒྱབ་པà¼',
+'internalerror' => 'ནང་ལོག་ནོར་སà¾à¾±à½¼à½“à¼',
+'internalerror_info' => 'ནང་ལོགས་ནོར་སà¾à¾±à½¼à½“༠$1',
+'filecopyerror' => '"$1" "$2"ལ་འདྲ་བཤུ་བྱེད་མ་à½à½´à½–à¼',
+'filedeleteerror' => '"$1"ཟེར་བ་སུབ་མ་à½à½´à½–à¼',
+'filenotfound' => '"$1"ཟེར་བའི་ཡིག་ཆ་མ་རྙེད་པà¼',
+'badtitle' => 'à½à¼‹à½–ྱང་སà¾à¾±à½¼à½“་ཅནà¼',
+'viewsource' => 'à½à½¼à½„ས་ལ་ལྟ་བà¼',
+'actionthrottled' => 'བྱ་འགུལ་à½à½ºà½‚ས་སོང་à¼',
+'namespaceprotected' => "à½à¾±à½ºà½‘་ལ་'''$1''' མིང་གནས་ནང་གི་ཤོག་ངོས་བཟོ་བཅོས་ཀྱི་ཆོག་མཆན་མེདà¼",
+'customcssjsprotected' => 'ཤོག་ངོས་འདིར་སྤྱོད་མི་གཞན་པའི་སྒེར་གྱི་སྒྲིག་འཇུག་ཚུད་ཡོད་པས་à½à¾±à½ºà½‘་ལ་བཟོ་བཅོས་ཀྱི་ཆོག་མཆན་མེདà¼',
+'ns-specialprotected' => 'དམིགས་བསམ་ཤོག་ངོས་རྣམས་བཟོ་བཅོས་བྱེད་མི་à½à½´à½–à¼',
# Virus scanner
'virus-unknownscanner' => 'ངོས་མ་ཟིན་པའི་དྲ་འབུà¼',
@@ -278,7 +292,7 @@ $messages = array(
'yourname' => 'སྤྱོད་མིང་à¼',
'yourpassword' => 'ལམ་ཡིག',
'yourpasswordagain' => 'ལམ་ཡིག་སà¾à¾±à½¢à¼‹à½‚à½à½‚ས་བྱོསà¼',
-'remembermypassword' => 'ངའི་དྲ་མིང་འདིར་གསོག་པà¼',
+'remembermypassword' => 'ངའི་ལམ་ཡིག་འདིར་(མང་མà½à½ à¼‹à½‰à½²à½“ $1 {{PLURAL:$1}}) དྲན་པར་བྱསà¼',
'login' => 'ནང་འཛུལà¼',
'nav-login-createaccount' => 'ནང་འཛུལ༠/ à½à½¼à¼‹à½ à½‚ོདà¼',
'userlogin' => 'ནང་འཛུལ༠/ à½à½¼à¼‹à½ à½‚ོདà¼',
@@ -290,6 +304,7 @@ $messages = array(
'createaccount' => 'à½à½¼à¼‹à½ à½‚ོདà¼',
'gotaccountlink' => 'ནང་འཛུལà¼',
'createaccountmail' => 'གློག་འཕྲིན་སྤྱད་དེà¼',
+'createaccountreason' => 'རྒྱུ་མཚནà¼',
'badretype' => 'ལམ་ཡིག་གང་བཅུག་པ་à½à½¼à¼‹à½à½´à½‚་མ་བྱུང་à¼',
'userexists' => 'མིང་འདི་བེད་སྤྱོད་བྱས་ཟིན་པས་མིང་གཞན་ཞིག་གདམ་རོགསà¼',
'loginerror' => 'ནང་འཛུལ་ནོར་སà¾à¾±à½¼à½“à¼',
@@ -341,6 +356,7 @@ $messages = array(
'showlivepreview' => 'ད་ཡོད་སྔོན་ལྟà¼',
'showdiff' => 'བཟོས་བཅོས་སྟོནà¼',
'anoneditwarning' => "'''གསལ་བརྡà¼''' à½à¾±à½ºà½‘་à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་མི་འདུག à½à¾±à½ºà½‘་ཀྱི་ IP à½à¼‹à½–ྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུརà¼",
+'anonpreviewwarning' => '༼à½à¾±à½ºà½‘་རང་à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་མི་འདུག ཉར་ཚགས་ཀྱིས་à½à¾±à½ºà½‘་ཀྱི་ IP à½à¼‹à½–ྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུརà¼à¼½',
'summary-preview' => 'བསྡུས་དོན་སྔོན་ལྟà¼',
'subject-preview' => 'བརྗོད་གཞི་དང་འགོ་བརྗོད་སྔོན་ལྟà¼',
'blockedtitle' => 'སྤྱོད་མི་བཀག་ཟིནà¼',
@@ -409,7 +425,7 @@ $messages = array(
'searchprofile-project-tooltip' => '$1ནང་དུ་འཚོལ་བà¼',
'searchprofile-images-tooltip' => 'ཡིག་ཆ་འཚོལ་བà¼',
'search-result-size' => '$1({{PLURAL:$2|1 word|$2 words}})',
-'search-redirect' => 'à½à¼‹à½•à¾±à½¼à½‚ས་བསà¾à¾±à½¢à¼‹à½–ཟོà¼',
+'search-redirect' => '($1རིམ་འགྲེམà¼)',
'search-section' => '(ཚན་པ $1)',
'search-suggest' => '$1 ལ་ཟེར་བ་ཡིན་ནམà¼',
'search-interwiki-caption' => 'སྲིང་མོའི་ལས་འཆརà¼',
@@ -502,6 +518,7 @@ $messages = array(
'rclistfrom' => '$1 ལས་འགོ་བཙུགས་à½à½ºà¼‹à½ à½‚ྱུར་བཅོས་གསར་བ་སྟོན་ཅིག',
'rcshowhideminor' => '$1 རྩོམ་སྒྲིག་ཕལ་བà¼',
'rcshowhideliu' => 'à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་པའི་སྤྱོད་མི་ $1',
+'rcshowhideanons' => 'མིང་མེད་སྤྱོད་མི $1',
'rcshowhidemine' => '$1ངའི་རྩོམ་སྒྲིག',
'rclinks' => 'འདས་བའི་ཉིན་ $2 <br />$3 ནང་ཚུན་གྱི་བཟོ་བཅོས་གཞུག་མ་ $1 སྟོན་ཅིག',
'diff' => 'མི་འདྲ་སà¼',
@@ -536,6 +553,9 @@ $messages = array(
'ignorewarning' => 'ཉེན་བརྡ་སྣང་མེད་བà½à½„་ནས་ཡིག་ཆ་ཉོར་ཅིག',
'ignorewarnings' => 'ཉེན་བརྡ་ཅི་ཡོད་སྣང་མེད་à½à½¼à½„ས་ཤིག',
'badfilename' => 'ཡིག་ཆའི་མིང་"$1"ལ་བསྒྱུར་ཟིནà¼',
+'filename-tooshort' => 'ཡིག་ཆའི་མིང་à½à½´à½„་དྲགས་འདུག',
+'filetype-banned' => 'ཡིག་ཆ་འདིའི་རིགས་བཀག་སྡོམ་བྱས་འདུག',
+'illegal-filename' => 'ཡིག་ཆའི་མིང་འདི་ལ་ཆོག་མཆན་མི་འདུག',
'uploadwarning' => 'ཡར་འཇུག་སྔོན་བརྡà¼',
'savefile' => 'ཡིག་ཆ་ཉོར་ཅིག',
'uploadedimage' => '"[[$1]]"ཡར་འཇུག་བྱས་ཟིནà¼',
@@ -675,6 +695,7 @@ $messages = array(
'protect-level-sysop' => 'དོ་དམ་པ་à½à½¼à¼‹à½“རà¼',
'protect-cantedit' => 'à½à¾±à½¼à½‘་ལ་ཤོག་ངོས་འདི་རྩོམ་སྒྲིག་གི་ཆོག་མཆན་མེད་པས་ངོས་འདི་ཡི་སྲུང་སà¾à¾±à½¼à½–་རིམ་པ་ལ་བཟོ་བཅོས་བྱེད་མི་ཆོག',
'restriction-type' => 'ཆོག་མཆནà¼',
+'restriction-level' => 'དམ་བསྒྲགས་ཚད་རིམà¼',
# Restrictions (nouns)
'restriction-edit' => 'རྩོམ་སྒྲིག',
@@ -771,6 +792,8 @@ $messages = array(
'tooltip-n-help' => 'གང་དུ་འཚོལ་བའི་གནསà¼',
'tooltip-t-whatlinkshere' => 'འདི་ལ་སྦྲེལ་བའི་à½à½ºà¼‹à½à½ºà¼‹à½¤à½¼à½‚་ངོས་ཡོངས་རྫོགསà¼',
'tooltip-t-recentchangeslinked' => 'ངོས་འདི་དང་འབྲེལ་བའི་ཉེ་བའི་བཟོ་བཅོསà¼',
+'tooltip-feed-rss' => 'ཤོག་ངོས་འདིའི་RSS འབྱུང་à½à½´à½„སà¼',
+'tooltip-feed-atom' => 'ཤོག་ངོས་འདིའི་Atom འབྱུང་à½à½´à½„སà¼',
'tooltip-t-contributions' => 'བཀོལ་མི་འདིའི་བྱས་རྗེས་སྟོནà¼',
'tooltip-t-emailuser' => 'སྤྱོད་མི་འདིར་དྲ་འཕྲིན་སà¾à½´à½¢à¼‹à½–à¼',
'tooltip-t-upload' => 'ཡིག་ཆ་ཡར་འཇུག',
@@ -793,6 +816,9 @@ $messages = array(
'previousdiff' => '↠རྩོམ་སྒྲིག་རྙིང་བà¼',
'nextdiff' => 'རྩོམ་སྒྲིག་གསར་གྲས༠→',
+# Media information
+'show-big-image' => 'གà½à½“་འབེབ་ཆ་ཚང་à¼',
+
# Special:NewFiles
'ilsubmit' => 'འཚོལà¼',
diff --git a/languages/messages/MessagesBpy.php b/languages/messages/MessagesBpy.php
index 22bec868..348048e1 100644
--- a/languages/messages/MessagesBpy.php
+++ b/languages/messages/MessagesBpy.php
@@ -11,7 +11,7 @@
* @author Uttam Singha, Dec 2006
*/
-$fallback='bn';
+$fallback = 'bn';
$digitTransformTable = array(
'0' => '০',
@@ -61,8 +61,7 @@ $messages = array(
'tog-editsection' => '[পতিক] লিঙà§à¦• à¦à¦¹à¦¾à¦¨à§à¦¨ পরিচà§à¦›à¦¦ পতানি অক',
'tog-editsectiononrightclick' => 'পরিচà§à¦›à¦¦ পতানির য়à§à¦¯à¦¾à¦¥à¦¾à¦™à¦¹à¦¾à¦¨ বাতেদের গোথামগ <br /> পরিচà§à¦›à¦¦à¦° চিঙনাঙর গজে যাতিলে দে (জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ)',
'tog-showtoc' => 'বিষয়র মাঠেলহানি দেহাদে (যে পাতারতা ৩হানর গজে চিঙনাঙ আসে)',
-'tog-rememberpassword' => 'কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦° à¦à¦¹à¦¾à¦¤ মর লগইন নিঙশিঙে থ',
-'tog-editwidth' => 'আসà§à¦¤à¦¾ পরà§à¦¦à¦¾à¦¹à¦¾à¦¨ বà§à¦œà¦¾à¦¨à¦¿à¦°à¦•à¦¾ পতানির বাকà§à¦¸à¦— সালকর',
+'tog-rememberpassword' => 'আহার গজে সেশনর কা খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ মনে থ(সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিনর|দিনর}} কা)',
'tog-watchcreations' => 'যে পতাহানি মি ইকরিসৠঅতা মর তালাবির তালিকাত থ',
'tog-watchdefault' => 'যে পতাহানি মি পতাসৠঅতা মর তালাবির তালিকাত থ',
'tog-watchmoves' => 'যে পতাহানি মি থেইকরিসৠঅতা মর তালাবির তালিকাত থ',
@@ -208,31 +207,21 @@ $messages = array(
'faqpage' => 'Project:আঙলাক',
# Vector skin
-'vector-action-addsection' => 'বিষয় তিলকর',
-'vector-action-delete' => 'পà§à¦¸à§‡ বেলা',
-'vector-action-move' => 'থেইকর',
-'vector-action-protect' => 'লà§à¦•à¦°',
-'vector-action-undelete' => 'নাপà§à¦¸à¦¿',
-'vector-action-unprotect' => 'নালà§à¦•à¦°à¦¿',
-'vector-namespace-category' => 'বিষয়র থাক',
-'vector-namespace-help' => 'পাঙলাক পাতা',
-'vector-namespace-image' => 'ফাইল',
-'vector-namespace-main' => 'পাতা',
-'vector-namespace-media' => 'মিডিয়া পাতা',
-'vector-namespace-mediawiki' => 'পৌ',
-'vector-namespace-project' => 'পà§à¦°à¦•à¦²à§à¦ª পাতা',
-'vector-namespace-special' => 'বিশেষ পাতা',
-'vector-namespace-talk' => 'য়à§à¦¯à¦¾à¦°à¦¿',
-'vector-namespace-template' => 'মডেল',
-'vector-namespace-user' => 'আতাকà§à¦°à¦¾à¦° পাতা',
-'vector-view-create' => 'হঙকরিক',
-'vector-view-edit' => 'পতানি',
-'vector-view-history' => 'ইতিহাস চেইক',
-'vector-view-view' => 'পাকরিক',
-'vector-view-viewsource' => 'সোরà§à¦¸ চেইক',
-'actions' => 'কারà§à¦¯à¦•à§à¦°à¦®',
-'namespaces' => 'নাঙরলাম',
-'variants' => 'ভেরিয়েনà§à¦Ÿà¦¹à¦¾à¦¨à¦¿',
+'vector-action-addsection' => 'বিষয় তিলকর',
+'vector-action-delete' => 'পà§à¦¸à§‡ বেলা',
+'vector-action-move' => 'থেইকর',
+'vector-action-protect' => 'লà§à¦•à¦°',
+'vector-action-undelete' => 'নাপà§à¦¸à¦¿',
+'vector-action-unprotect' => 'নালà§à¦•à¦°à¦¿',
+'vector-simplesearch-preference' => 'বিসারানির কা পরামরà§à¦¶ থা করেই (হà§à¦¦à§à¦¦à¦¾ ভেকà§à¦Ÿà¦° সà§à¦•à¦¿à¦¨à¦° কা)',
+'vector-view-create' => 'হঙকরিক',
+'vector-view-edit' => 'পতানি',
+'vector-view-history' => 'ইতিহাস চেইক',
+'vector-view-view' => 'পাকরিক',
+'vector-view-viewsource' => 'সোরà§à¦¸ চেইক',
+'actions' => 'কারà§à¦¯à¦•à§à¦°à¦®',
+'namespaces' => 'নাঙরলাম',
+'variants' => 'ভেরিয়েনà§à¦Ÿà¦¹à¦¾à¦¨à¦¿',
'errorpagetitle' => 'লাল',
'returnto' => '$1-ত আলথকে যাগা।',
@@ -453,7 +442,7 @@ $2',
'yourname' => 'আতাকà§à¦°à¦¾à¦° নাংহান (Username)',
'yourpassword' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password)',
'yourpasswordagain' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password) আরাকমৠইকর',
-'remembermypassword' => 'à¦à¦°à§‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦° à¦à¦¹à¦¾à¦¤à§à¦¤ সাইট à¦à¦¹à¦¾à¦¤ মর হমানিহান মনে থ',
+'remembermypassword' => 'আহার গজে সেশনর কা খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ মনে থ(সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিনর|দিনর}} কা)',
'yourdomainname' => 'তর ডোমেইনগ',
'externaldberror' => 'ডাটেবেজর মা বেসেপ আহান ইসে নাইলে তরতা বারেদের à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ বদালানির য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ নেই।',
'login' => 'হমানি',
@@ -470,6 +459,7 @@ $2',
'gotaccount' => "মানà§à¦¨à¦¾à¦ªà¦¾ à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ আহান আগেতà§à¦¤à¦° আসে? '''$1'''।",
'gotaccountlink' => 'লগইন',
'createaccountmail' => 'ই-মেইলন',
+'createaccountreason' => 'কারণ:',
'badretype' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ (password) দà§à¦¬à¦¿à¦¯à¦¼à¦—ি না মিলের।',
'userexists' => 'à¦à¦°à§‡ আতাকà§à¦°à¦¾à¦° নাঙ à¦à¦¹à¦¾à¦¨ আরাক আগই আগে বà§à¦¯à¦¬à¦¹à¦¾à¦° করিসে। তি আরাক নাঙ আহান বাছ।',
'loginerror' => 'লগইনে লালà§à¦‡à¦¸à§‡',
@@ -649,7 +639,7 @@ $2',
'userjspreview' => "'''তি মনে থইস à¦à¦¹à¦¾à¦¨ তর জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿà¦° পরীকà§à¦·à¦¾/আগচাহান।'''
'''à¦à¦¹à¦¾à¦¨ à¦à¦ªà¦¾à¦—াউ ইতৠনাইসে!'''",
'userinvalidcssjstitle' => "'''সিঙà§à¦‡à¦¸:''' \"\$1\" নাঙর কোন সর নেই।
-মনে থইস .css বারো .js পাতার নাঙ à¦à¦¤à¦¾ রূহিবৃতà§à¦¤à¦¿à¦° মাতà§à¦™à§‡ হà§à¦°à¦•à¦¾ আতর ইকার মেয়েকল অরতাহে, যেসাদে {{ns:user}}:Foo/monobook.css; কিনà§à¦¤à§ à¦à¦¸à¦¾à¦¦à§‡ চিঙনাঙ নাইব: {{ns:user}}:Foo/Monobook.css",
+মনে থইস .css বারো .js পাতার নাঙ à¦à¦¤à¦¾ রূহিবৃতà§à¦¤à¦¿à¦° মাতà§à¦™à§‡ হà§à¦°à¦•à¦¾ আতর ইকার মেয়েকল অরতাহে, যেসাদে {{ns:user}}:Foo/vector.css; কিনà§à¦¤à§ à¦à¦¸à¦¾à¦¦à§‡ চিঙনাঙ নাইব: {{ns:user}}:Foo/Vector.css",
'updated' => '(আপডেট)',
'note' => "'''নোট:'''",
'previewnote' => "'''à¦à¦¹à¦¾à¦¨ হà§à¦¦à§à¦¦à¦¾ আগচাহান;
@@ -681,8 +671,6 @@ $2',
'copyrightwarning' => "দয়া করিয়া খিয়াল কর {{SITENAME}}-ত হারি অবদান $2-র মাতà§à¦™à§‡ পাসিতা (আরাকউ হবাকরে $1-ত চা)। তর জমা দিয়াসত লেখা যেগউ বে-রিদয় ইয়া পতিতে পারে বারো যেসারে খà§à¦¶à¦¿ অসারে বিলিতে পারে। তি যদি à¦à¦¹à¦¾à¦¨à¦° বারে à¦à¦•à¦®à¦¤ নার, অতা ইলে তর লেখা à¦à¦¹à¦¾à¦¤ জমা নাদি।<br />
তি আরাকউ ৱাশাক করর যে, à¦à¦°à§‡ লেখা à¦à¦¹à¦¾à¦¨ তি নিজে ইকিসতহান, নাইলে হাবà§à¦¬à¦¿à¦° কা উনà§à¦®à§à¦•à§à¦¤ কোন উৎস আহাতà§à¦¤ পাসতহান।
'''সà§à¦¬à¦¤à§à¦¬ সংরকà§à¦·à¦¿à¦¤ অসে অসাদে কোন লেখা সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à¦°à§€à¦° য়à§à¦¯à¦¾à¦¥à¦¾à¦™ না লà§à¦‡à¦¯à¦¼à¦¾ à¦à¦¹à¦¾à¦¤ জমা না দিস!'''",
-'longpagewarning' => "'''সিঙà§à¦‡à¦¸: à¦à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ $1 কিলোবাইট ডাঙর; বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° আকেইগত ৩২ কিলোবাইটর গজে ডাঙর পাতানিত বেরা ইতে পারে।
-দয়া করিয়া পাতা à¦à¦¹à¦¾à¦¨à¦°à§‡ হà§à¦°à¦•à¦¾ হà§à¦°à¦•à¦¾ কত অংশত খেইকরানির হতনা কর।'''",
'templatesused' => 'পাতাহাত বরাসি {{PLURAL:$1|মডেল|মডেলহানি}}:',
'templatesusedpreview' => 'আগচা à¦à¦¹à¦¾à¦¨à¦¾à¦¤ মিহিসে {{PLURAL:$1|মডেল|মডেলহানি}}:',
'templatesusedsection' => 'à¦à¦¹à¦¾à¦¤ {{PLURAL:$1|মডেল|মডেলহানি}} তিলà§à¦‡à¦¸à§‡:',
@@ -921,6 +909,7 @@ $2',
'prefs-files' => 'ফাইল',
'prefs-custom-css' => 'সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ CSS',
'prefs-custom-js' => 'সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ JS',
+'prefs-common-css-js' => 'হাবà§à¦¬à¦¿ সà§à¦•à¦¿à¦¨à¦° কা শেয়ারড CSS/JavaScript:',
'youremail' => 'ই-মেইল *:',
'yourrealname' => 'আৱৈপা নাংহান *:',
'yourlanguage' => 'ঠারহান:',
@@ -934,7 +923,7 @@ $2',
'prefs-advancedrc' => 'উচà§à¦šà¦¤à¦° অপশন',
'prefs-advancedrendering' => 'উচà§à¦šà¦¤à¦° অপশন',
'prefs-advancedwatchlist' => 'উচà§à¦šà¦¤à¦° অপশন',
-'prefs-display' => 'দেহাদেনার অপশন',
+'prefs-displayrc' => 'দেহাদেনার অপশন',
'prefs-diffs' => 'ফারাক',
# User rights
@@ -1247,7 +1236,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'মর তালাবি',
'mywatchlist' => 'মর তালাবি',
-'watchlistfor' => "('''$1'''-র কা)",
'addedwatch' => 'তালাবির তালিকাহাত থনা ইল',
'addedwatchtext' => "\"<nowiki>\$1</nowiki>\" পাতা à¦à¦¹à¦¾à¦¨ তর [[Special:Watchlist|আহির-আরà§à¦® তালিকা]]-ত তিলকরানি ইল। পিসেদে à¦à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ বারো পাতা à¦à¦¹à¦¾à¦¨à¦° লগে সাকেই আসে য়à§à¦¯à¦¾à¦°à§€ পাতাত অইতই হারি জাতর পতানি à¦à¦¹à¦¾à¦¨à¦¾à¦¤ তিলকরানি অইতই। অতাবাদেউ [[Special:RecentChanges|হাদি à¦à¦¹à¦¾à¦¨à¦° পতানিহানি]]-ত পাতা à¦à¦¹à¦¾à¦¨à¦°à§‡ '''গাঢ়করা''' মেয়েকে দেহা দেনা অইতই যাতে তি নà§à¦™à¦¿à¦•à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ চিনে পারবেতা।
@@ -1561,9 +1549,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'nextdiff' => 'নà§à§±à¦¾ পতা →',
# Media information
-'file-info-size' => '($1 × $2 পিকà§à¦¸à§‡à¦², ফাইলর সাইজহান: $3, à¦à¦®à¦†à¦‡à¦à¦®à¦‡-র অংতা: $4)',
+'file-info-size' => '$1 × $2 পিকà§à¦¸à§‡à¦², ফাইলর সাইজহান: $3, à¦à¦®à¦†à¦‡à¦à¦®à¦‡-র অংতা: $4',
'file-nohires' => '<small>à¦à¦¹à¦¾à¦¤à§à¦¤ গজর রিজরিউশন নেই।</small>',
-'svg-long-desc' => '(SVG ফাইল, সাধারনত $1 × $2 পিকà§à¦¸à§‡à¦², ফাইলর সাইজহান: $3)',
+'svg-long-desc' => 'SVG ফাইল, সাধারনত $1 × $2 পিকà§à¦¸à§‡à¦², ফাইলর সাইজহান: $3',
'show-big-image' => 'পà§à¦²à§à¦²à¦¾à¦ª রিজলিউশন',
'show-big-image-thumb' => '<small>আগচা হানর সাইজহান: $1 × $2 পিকà§à¦¸à§‡à¦²à¦¸</small>',
diff --git a/languages/messages/MessagesBqi.php b/languages/messages/MessagesBqi.php
index 9c10929a..b1d4c588 100644
--- a/languages/messages/MessagesBqi.php
+++ b/languages/messages/MessagesBqi.php
@@ -28,8 +28,7 @@ $messages = array(
'tog-editsection' => 'امکان اصلاح یه قسمت زه راه لینکها',
'tog-editsectiononrightclick' => 'امکان اصلاح یه قسمت زه راه راست کلیک کردن رو عنوان اوقسمت- جاوااسکریپت',
'tog-showtoc' => 'نشودادن Ùهرست محتوا سی صÙحاتی Ú©Ù‡ بیشتر زه سه سرخط دارن',
-'tog-rememberpassword' => 'به حاÙظه کامپیوتر دادن نحوه ورودی خوم',
-'tog-editwidth' => 'اصلاح جعبه یا کادری که عرضا پر وابیده',
+'tog-rememberpassword' => 'به حاÙظه کامپیوتر دادن نحوه ورودی خوم (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'اضا٠کردن اوصÙحاتی Ú©Ù‡ خوم درست کردم به Ùهرست نمایشی',
'tog-watchdefault' => 'اضا٠کردن اوصÙحاتی Ú©Ù‡ خوم اصلاح کردم به Ùهرست نمایشی',
'tog-watchmoves' => 'اضا٠کردن صÙحاتی Ú©Ù‡ خوم جابجا کردم به Ùهرست نمایشی',
@@ -258,7 +257,7 @@ $1',
# Login and logout pages
'yourname' => 'نام کاربر:',
'yourpassword' => 'رمز:',
-'remembermypassword' => 'رمز اویدن به سیستم را دراین رایانه به خاطر بسپار',
+'remembermypassword' => 'رمز اویدن به سیستم را دراین رایانه به خاطر بسپار (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'اویدن به سیستم',
'nav-login-createaccount' => 'اویدن به سیستم',
'loginprompt' => 'ایسا وا Ú©ÙˆÚ©ÛŒ ها راÙعال کنین سی اویدن به {{SITENAME}}.',
@@ -360,9 +359,6 @@ $1',
ایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه Ùˆ به دلخواه ارسال بوه، ایچو Ù†Ùرستن.<br />
درضمن ایسادارین به ایما قول ادین Ú©Ù‡ خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق Ú©Ù¾ÛŒ رایت را بی‌اجازه Ù†Ùرستین!'''',",
-'longpagewarning' => "'''هشدار: ای صÙحه $1 کیلوبایت طول داره؛
-بعضی زه مرورگرها ممکنه با اصلاح صÙحات نزدیک به Û³Û² کیلوبایت یا طولانی‌تر زه آن مشکلاتی داشته بون.
-لطÙاً درمورد خرد کردن ای صÙحه به قسمت‌های کوچکتر Ùکر کنین.'''",
'templatesused' => 'قالبهای استÙاده شده من ای صÙحه:',
'templatesusedpreview' => 'قالبها یا الگوهای استÙاده وابیده در ای پیش نمایش:',
'template-protected' => '(تحت حمایت)',
@@ -560,7 +556,6 @@ $2',
# Watchlist
'watchlist' => 'لیست پیگیریهای مو',
'mywatchlist' => 'لیست پیگیریهای مو',
-'watchlistfor' => "(سی '''$1''')",
'addedwatch' => 'اضا٠وابید به لیست پیگیری',
'addedwatchtext' => "صÙحه «<nowiki>$1</nowiki>» به [[Special:Watchlist|لیست پی‌گیری‌های ]] ایسا
اضا٠وابید.
@@ -776,9 +771,9 @@ $2',
'nextdiff' => 'تÙاوت بعدی→',
# Media information
-'file-info-size' => '($1 × $2 پیکسل, اندازه Ùایل: $3, MIME نوع: $4)',
+'file-info-size' => '$1 × $2 پیکسل, اندازه Ùایل: $3, MIME نوع: $4',
'file-nohires' => '<small>قابلیت تÙکیک بالاتری در دسترس نه.</small>',
-'svg-long-desc' => '(SVG Ùایل, تقریبا$1 × $2 پیکسل, اندازه Ùایل: $3)',
+'svg-long-desc' => 'SVG Ùایل, تقریبا$1 × $2 پیکسل, اندازه Ùایل: $3',
'show-big-image' => 'تصویر با قابلیت تÙکیک کامل',
'show-big-image-thumb' => '<کوچیک>اندازه پیش نمایش: $1 × $2 پیکسلها</کوچیک>',
diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php
index 52726b3a..fbb9d60c 100644
--- a/languages/messages/MessagesBr.php
+++ b/languages/messages/MessagesBr.php
@@ -24,8 +24,8 @@ $namespaceNames = array(
NS_USER => 'Implijer',
NS_USER_TALK => 'Kaozeadenn_Implijer',
NS_PROJECT_TALK => 'Kaozeadenn_$1',
- NS_FILE => 'Skeudenn',
- NS_FILE_TALK => 'Kaozeadenn_Skeudenn',
+ NS_FILE => 'Restr',
+ NS_FILE_TALK => 'Kaozeadenn_Restr',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'Kaozeadenn_MediaWiki',
NS_TEMPLATE => 'Patrom',
@@ -36,50 +36,124 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Kaozeadenn_Rummad',
);
+$namespaceAliases = array(
+ 'Skeudenn' => NS_FILE,
+ 'Kaozeadenn_Skeudenn' => NS_FILE_TALK,
+);
+
$specialPageAliases = array(
'DoubleRedirects' => array( 'AdksaoùDoubl' ),
'BrokenRedirects' => array( 'AdkasoùTorr' ),
- 'Disambiguations' => array( 'Digejañ' ),
+ 'Disambiguations' => array( 'Disheñvelout' ),
+ 'Userlogin' => array( 'KevreañImplijer' ),
+ 'Userlogout' => array( 'DigevreañImplijer' ),
'CreateAccount' => array( 'KrouiñKont' ),
'Preferences' => array( 'Penndibaboù' ),
- 'Watchlist' => array( 'Roll evezhiañ' ),
+ 'Watchlist' => array( 'Roll_evezhiañ' ),
'Recentchanges' => array( 'KemmoùDiwezhañ' ),
'Upload' => array( 'Pellgargañ' ),
'Listfiles' => array( 'RollSkeudennoù' ),
- 'Newimages' => array( 'SkeudennoùNevez' ),
+ 'Newimages' => array( 'RestroùNevez', 'SkeudennoùNevez' ),
+ 'Listusers' => array( 'RollImplijerien' ),
+ 'Listgrouprights' => array( 'RollGwirioùStrollad' ),
'Statistics' => array( 'Stadegoù' ),
+ 'Randompage' => array( 'DreZegouezh' ),
+ 'Lonelypages' => array( 'PajennoùEnoUnan' ),
+ 'Uncategorizedpages' => array( 'PajennoùDirumm' ),
+ 'Uncategorizedcategories' => array( 'RummadoùDirumm' ),
+ 'Uncategorizedimages' => array( 'RestroùDirumm' ),
+ 'Uncategorizedtemplates' => array( 'PatromoùDirumm' ),
+ 'Unusedcategories' => array( 'RummadoùDizimplij' ),
+ 'Unusedimages' => array( 'RestroùDizimplij' ),
+ 'Wantedpages' => array( 'LiammoùTorr' ),
+ 'Wantedcategories' => array( 'RummadoùGoulennet' ),
+ 'Wantedfiles' => array( 'RestroùGoulennet' ),
+ 'Wantedtemplates' => array( 'PatromoùGoulennet' ),
+ 'Mostlinkedtemplates' => array( 'PatromoùImplijetañ' ),
+ 'Shortpages' => array( 'PajennoùBerr' ),
+ 'Longpages' => array( 'PajennoùHir' ),
'Newpages' => array( 'PajennoùNevez' ),
'Ancientpages' => array( 'PajennoùKozh' ),
+ 'Protectedpages' => array( 'PajennoùGwarezet' ),
+ 'Protectedtitles' => array( 'TitloùGwarezet' ),
'Allpages' => array( 'AnHollBajennoù' ),
+ 'Unblock' => array( 'Distankañ' ),
'Specialpages' => array( 'PajennoùDibar' ),
+ 'Contributions' => array( 'Degasadennoù' ),
+ 'Emailuser' => array( 'PostelImplijer' ),
+ 'Confirmemail' => array( 'KadarnaatPostel' ),
+ 'Whatlinkshere' => array( 'PetraGasBetekAmañ' ),
+ 'Recentchangeslinked' => array( 'KemmoùKar' ),
+ 'Movepage' => array( 'AdkasPajenn' ),
+ 'Blockme' => array( 'MaStankañ' ),
+ 'Booksources' => array( 'MammennoùLevr' ),
'Categories' => array( 'Rummadoù' ),
'Export' => array( 'Ezporzhiañ' ),
'Version' => array( 'Stumm' ),
+ 'Allmessages' => array( 'HollGemennadennoù' ),
+ 'Log' => array( 'Marilh' ),
+ 'Blockip' => array( 'Stankañ' ),
'Undelete' => array( 'Diziverkañ' ),
'Import' => array( 'Enporzhiañ' ),
+ 'Userrights' => array( 'GwirioùImplijer' ),
+ 'Unwatchedpages' => array( 'PajennoùNannEvezhiet' ),
+ 'Listredirects' => array( 'RollañAdkasoù' ),
+ 'Unusedtemplates' => array( 'PatromoùDizimplij' ),
'Mypage' => array( 'MaFajenn' ),
'Mytalk' => array( 'MaC\'haozeadennoù' ),
+ 'Mycontributions' => array( 'MaDegasadennoù' ),
+ 'Listadmins' => array( 'RollMerourien' ),
+ 'Listbots' => array( 'RollBotoù' ),
+ 'Popularpages' => array( 'PajennoùPoblek' ),
'Search' => array( 'Klask' ),
+ 'Resetpass' => array( 'KemmañGer-tremen' ),
+ 'Withoutinterwiki' => array( 'HepEtrewiki' ),
+ 'MergeHistory' => array( 'KendeuziñIstor' ),
+ 'LinkSearch' => array( 'KlaskLiamm' ),
+ 'Tags' => array( 'Balizennoù' ),
+ 'Activeusers' => array( 'ImplijerienOberiant' ),
+ 'ComparePages' => array( 'KeñveriañPajennoù' ),
+ 'Badtitle' => array( 'TitlFall' ),
);
$magicWords = array(
'redirect' => array( '0', '#ADKAS', '#REDIRECT' ),
+ 'numberofpages' => array( '1', 'NIVERABAJENNOU', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NIVERABENNADOU', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NIVERARESTROU', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NIVERAIMPLIJERIEN', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NIVERAIMPLIJERIENOBERIANT', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NIVERAZEGASEDENNOU', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NIVERALENNADENNOU', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'ANVPAJENN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ANVPAJENNSK', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ESAOUENNANV', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESAOUENNANVSK', 'NAMESPACEE' ),
+ 'fullpagename' => array( '1', 'ANVPAJENNKLOK', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ANVPAJENNKLOKSK', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ANVISPAJENN', 'SUBPAGENAME' ),
'img_right' => array( '1', 'dehou', 'right' ),
'img_left' => array( '1', 'kleiz', 'left' ),
'img_none' => array( '1', 'netra', 'none' ),
- 'img_center' => array( '1', 'kreiz', 'center', 'centre' ),
+ 'img_center' => array( '1', 'kreizenn', 'center', 'centre' ),
+ 'img_page' => array( '1', 'pajenn=$1', 'pajenn $1', 'page=$1', 'page $1' ),
+ 'img_sub' => array( '1', 'is', 'sub' ),
'img_top' => array( '1', 'krec\'h', 'top' ),
+ 'img_middle' => array( '1', 'kreiz', 'middle' ),
'img_bottom' => array( '1', 'traoñ', 'bottom' ),
+ 'img_link' => array( '1', 'liamm=$1', 'link=$1' ),
'sitename' => array( '1', 'ANVLEC\'HIENN', 'SITENAME' ),
'server' => array( '0', 'SERVIJER', 'SERVER' ),
'servername' => array( '0', 'ANVSERVIJER', 'SERVERNAME' ),
'grammar' => array( '0', 'YEZHADUR:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'JENER:', 'GENDER:' ),
'plural' => array( '0', 'LIESTER:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLKLOK:', 'FULLURL:' ),
'currentversion' => array( '1', 'STUMMRED', 'CURRENTVERSION' ),
'language' => array( '0', '#YEZH:', '#LANGUAGE:' ),
'special' => array( '0', 'dibar', 'special' ),
'pagesize' => array( '1', 'MENTPAJENN', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'HENT', 'PATH' ),
);
$bookstoreList = array(
@@ -97,7 +171,7 @@ $dateFormats = array(
'dmy both' => 'j M Y "da" H:i',
);
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$linkTrail = "/^((?:c\'h|C\'H|C\'h|c’h|C’H|C’h|[a-zA-ZàâçéèêîôûäëïöüùñÇÉÂÊÎÔÛÄËÃÖÜÀÈÙÑ])+)(.*)$/sDu";
$messages = array(
@@ -116,8 +190,7 @@ $messages = array(
'tog-editsection' => 'Kemmañ ur rann dre al liammoù [kemmañ]',
'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou<br /> war titl ar rann',
'tog-showtoc' => 'Diskouez an daolenn<br /> (evit ar pennadoù zo ouzhpenn 3 rann enno)',
-'tog-rememberpassword' => "Derc'hel soñj eus ma ger-tremen (toupin)",
-'tog-editwidth' => 'Digeriñ ar prenestr skridaozañ betek leuniañ ar skramm gantañ penn-da-benn',
+'tog-rememberpassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
'tog-watchcreations' => 'Evezhiañ ar pajennoù krouet ganin',
'tog-watchdefault' => 'Evezhiañ ar pennadoù savet pe kemmet ganin',
'tog-watchmoves' => "Ouzhpennañ da'm roll evezhiañ ar pajennoù adanvet ganin",
@@ -264,31 +337,21 @@ $messages = array(
'faqpage' => 'Project:FAG',
# Vector skin
-'vector-action-addsection' => 'Rannbennad nevez',
-'vector-action-delete' => 'Diverkañ',
-'vector-action-move' => 'Adenvel',
-'vector-action-protect' => 'Gwareziñ',
-'vector-action-undelete' => 'Diziverkañ',
-'vector-action-unprotect' => 'Diwareziñ',
-'vector-namespace-category' => 'Rummad',
-'vector-namespace-help' => 'Skoazell',
-'vector-namespace-image' => 'Restr',
-'vector-namespace-main' => 'Pennad',
-'vector-namespace-media' => 'Pajenn vedia',
-'vector-namespace-mediawiki' => 'Kemennadenn',
-'vector-namespace-project' => 'Pajenn ar raktres',
-'vector-namespace-special' => 'Pajenn dibar',
-'vector-namespace-talk' => 'Kaozeal',
-'vector-namespace-template' => 'Patrom',
-'vector-namespace-user' => 'Pajenn implijer',
-'vector-view-create' => 'Krouiñ',
-'vector-view-edit' => 'Kemmañ',
-'vector-view-history' => 'Gwelet an istor',
-'vector-view-view' => 'Lenn',
-'vector-view-viewsource' => 'Sellet ouzh tarzh an destenn',
-'actions' => 'Oberoù',
-'namespaces' => 'Esaouennoù anv',
-'variants' => 'Adstummoù',
+'vector-action-addsection' => 'Rannbennad nevez',
+'vector-action-delete' => 'Diverkañ',
+'vector-action-move' => 'Adenvel',
+'vector-action-protect' => 'Gwareziñ',
+'vector-action-undelete' => 'Diziverkañ',
+'vector-action-unprotect' => 'Diwareziñ',
+'vector-simplesearch-preference' => "Aotren ar c'hinnigoù klask gwellaet (gant Vektor nemetken)",
+'vector-view-create' => 'Krouiñ',
+'vector-view-edit' => 'Kemmañ',
+'vector-view-history' => 'Gwelet an istor',
+'vector-view-view' => 'Lenn',
+'vector-view-viewsource' => 'Sellet ouzh tarzh an destenn',
+'actions' => 'Oberoù',
+'namespaces' => 'Esaouennoù anv',
+'variants' => 'Adstummoù',
'errorpagetitle' => 'Fazi',
'returnto' => "Distreiñ d'ar bajenn $1.",
@@ -349,6 +412,9 @@ Re a implijerien a glask mont war ar bajenn-mañ war un dro.
Gortozit ur pennadig a-raok klask mont war ar bjann-mañ en-dro.
$1',
+'pool-timeout' => "Aet eur dreist d'an termen gortoz evit ar stankadenn",
+'pool-queuefull' => 'Soulgarget eo ar servijerioù',
+'pool-errorunknown' => 'Fazi dianav',
# 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' => 'Diwar-benn {{SITENAME}}',
@@ -405,7 +471,7 @@ $1',
'red-link-title' => "$1 (n'eus ket eus ar bajenn-mañ)",
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Page',
+'nstab-main' => 'Pajenn',
'nstab-user' => 'Pajenn implijer',
'nstab-media' => 'Media',
'nstab-special' => 'Pajenn dibar',
@@ -511,7 +577,8 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
'yourname' => "Hoc'h anv implijer",
'yourpassword' => 'Ho ker-tremen',
'yourpasswordagain' => 'Skrivit ho ker-tremen en-dro',
-'remembermypassword' => "Derc'hel soñj eus ma ger-tremen (toupin)",
+'remembermypassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
+'securelogin-stick-https' => 'Chom kevreet da HTTPS goude bezañ bet kevreet',
'yourdomainname' => 'Ho tomani',
'externaldberror' => "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
'login' => 'Kevreañ',
@@ -528,10 +595,11 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
'gotaccountlink' => 'Kevreañ',
'createaccountmail' => 'dre bostel',
+'createaccountreason' => 'Abeg :',
'badretype' => 'Ne glot ket ar gerioù-tremen an eil gant egile.',
'userexists' => "Implijet eo an anv implijer lakaet ganeoc'h dija.
Dibabit un anv all mar plij.",
-'loginerror' => 'Kudenn kevreañ',
+'loginerror' => 'Kudenn gevreañ',
'createaccounterror' => 'Dibosupl krouiñ ar gont : $1',
'nocookiesnew' => "Krouet eo bet ar gont implijer met n'oc'h ket kevreet. {{SITENAME}} a implij toupinoù evit ar c'hevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
'nocookieslogin' => "{{SITENAME}} a implij toupinoù evit kevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
@@ -548,6 +616,7 @@ Gwiriit eo bet skrivet mat an anv ganeoc\'h pe [[Special:UserLogin/signup|krouit
'wrongpasswordempty' => 'Ger-tremen ebet. Lakait unan mar plij.',
'passwordtooshort' => '{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.',
'password-name-match' => "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
+'password-login-forbidden' => 'Berzet eo ober gant an anv-implijer hag ar ger-tremen-mañ.',
'mailmypassword' => 'Kasit din ur ger-tremen nevez',
'passwordremindertitle' => 'Ho ker-tremen berrbad nevez evit {{SITENAME}}',
'passwordremindertext' => "Unan bennak (c'hwi moarvat gant ar chomlec'h IP \$1)
@@ -587,6 +656,9 @@ Gortozit a-raok klask en-dro.",
'loginlanguagelabel' => 'Yezh : $1',
'suspicious-userlogout' => 'Distaolet eo bet ho koulenn digevreañ rak kaset e oa bet gant ur merdeer direizhet pe krubuilhadenn ur proksi, evit doare.',
+# E-mail sending
+'php-mail-error-unknown' => "Fazi dianav en arc'hwel postel () PHP",
+
# Password reset dialog
'resetpass' => 'Cheñch ar ger-tremen',
'resetpass_announce' => "Enskrivet oc’h bet dre ur ger-tremen da c'hortoz kaset deoc'h dre bostel. A-benn bezañ enrollet da vat e rankit spisaat ur ger-tremen nevez amañ :",
@@ -638,9 +710,11 @@ Gortozit a-raok klask en-dro.",
'showdiff' => "Diskouez ar c'hemmoù",
'anoneditwarning' => "'''Diwallit :''' N'oc'h ket kevreet.
Ho chomlec'h IP eo a vo enrollet war istor kemmoù ar bajenn-mañ.",
+'anonpreviewwarning' => "''N'oc'h ket kevreet. Enrollañ a lakao war-wel ho chomlec'h IP e istor kemmoù ar bajenn.''",
'missingsummary' => "'''Taolit evezh:''' N'hoc'h eus ket lakaet tamm testenn diverrañ ebet evit ho kemmoù. Mar klikit war enrollañ en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
'missingcommenttext' => "Skrivit hoc'h evezhiadenn a-is.",
-'missingcommentheader' => "'''Taolit evezh:''' N'hoc'h eus ket lakaet tamm danvez/titl ebet evit hoc'h evezhiadenn. Mar klikit war enrollañ en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+'missingcommentheader' => "'''Taolit evezh :''' N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.
+Mar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
'summary-preview' => 'Rakwelet an diverrañ :',
'subject-preview' => 'Rakwelet danvez/titl :',
'blockedtitle' => 'Implijer stanket',
@@ -714,7 +788,11 @@ Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
'usercsspreview' => "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ho follenn CSS deoc'h.'''
'''N'eo ket bet enrollet evit c'hoazh!'''",
'userjspreview' => "'''Dalc'hit soñj emaoc'h o rakwelet pe o testiñ ho kod javascript deoc'h ha n'eo ket bet enrollet c'hoazh!'''",
-'userinvalidcssjstitle' => "'''Diwallit:''' N'eus tamm gwiskadur \"\$1\" ebet. Ho pez soñj e vez implijet lizherennoù bihan goude an anv implijer hag ar veskell / gant ar pajennoù personel dezho un astenn .css ha .js; da skouer eo mat ar follenn stil {{ns:user}}:Foo/monobook.css ha faziek an hini {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ar follenn CSS-mañ.'''
+'''N'eo ket bet enrollet evit c'hoazh!'''",
+'sitejspreview' => "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ar c'hod JavaScript-mañ.'''
+'''N'eo ket bet enrollet evit c'hoazh!'''",
+'userinvalidcssjstitle' => "'''Diwallit:''' N'eus tamm gwiskadur \"\$1\" ebet. Ho pez soñj e vez implijet lizherennoù bihan goude an anv implijer hag ar veskell / gant ar pajennoù personel dezho un astenn .css ha .js; da skouer eo mat ar follenn stil {{ns:user}}:Foo/vector.css ha faziek an hini {{ns:user}}:Foo/Vector.css.",
'updated' => '(Hizivaet)',
'note' => "'''Notenn :'''",
'previewnote' => "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''
@@ -749,9 +827,6 @@ N'eus '''nemet''' an destenn zo en takad krec'h a vo saveteet pa klikot war \"{{
Heñveldra, prometiñ a rit kemer perzh dre zegas skridoù savet ganeoc'h hepken pe tennet eus ur vammenn frank a wirioù.
'''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER (COPYRIGHT) HEP AOTRE D'OBER KEMENT-SE!'''",
'copyrightwarning2' => "Notit mat e c'hall kement degasadenn graet ganeoc'h war {{SITENAME}} bezañ kemmet, adaozet pe lamet kuit gant an implijerien all. Mar ne fell ket deoc'h e vije kemmet-digemmet ar pezh hoc'h eus skrivet na gemerit ket perzh er raktres-mañ.<br /> Gouestlañ a rit ivez eo bet savet ar boued spered ganeoc'h pe eilet diwar ur vammenn frank a wirioù pe en domani foran (gwelet $1 evit gouzout hiroc'h). '''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER HEP AOTRE D'OBER KEMENT-SE!'''",
-'longpagewarning' => "'''KEMENN DIWALL: $1 ko eo hed ar bajenn-mañ;
-merdeerioù zo o deus poan da verañ ar pajennoù tro-dro pe en tu all da 32 ko pa vezont savet.
-Marteze e c'hallfec'h rannañ ar bajenn e rannoù bihanoc'h.'''",
'longpageerror' => "'''FAZI: $1 kilobit hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget $2 kilobit, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
'readonlywarning' => "'''KEMENN DIWALL : stanket eo an diaz titouroù a-benn bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.
Gallout a rit eilañ-pegañ an destenn en ur restr skrid all hag enrollañ anezhi a-benn diwezhatoc'hik.'''
@@ -928,6 +1003,8 @@ $1",
'logdelete-failure' => "'''N'eus ket bet gallet termeniñ gweluster ar marilh :'''
$1",
'revdel-restore' => 'Cheñch ar gweluster',
+'revdel-restore-deleted' => 'adweladennoù bet diverket',
+'revdel-restore-visible' => "adweladennoù a c'heller gwelet",
'pagehist' => 'Istor ar bajenn',
'deletedhist' => 'Diverkañ an istor',
'revdelete-content' => 'danvez',
@@ -993,14 +1070,16 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
# Diffs
'history-title' => 'Istor stummoù disheñvel "$1"',
'difference' => "(Diforc'hioù etre ar stummoù)",
+'difference-multipage' => "(diforc'h etre ar pajennoù)",
'lineno' => 'Linenn $1:',
'compareselectedversions' => 'Keñveriañ ar stummoù diuzet',
'showhideselectedversions' => 'Diskouez/Kuzhat ar stummoù diuzet',
'editundo' => 'disteuler',
-'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} kuzhet.)",
+'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
+'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
# Search results
-'searchresults' => "Disoc'h ar c'hlask",
+'searchresults' => "Disoc'hoù enklask",
'searchresults-title' => 'Disoc\'hoù klask evit "$1"',
'searchresulttext' => "Evit gouzout hiroc'h diwar-benn ar c'hlask e {{SITENAME}}, sellet ouzh [[{{MediaWiki:Helppage}}|{{int:help}}]].",
'searchsubtitle' => 'Klasket hoc\'h eus \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|an holl bajennoù a grog gant "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|an holl bajennoù enno ul liamm war-du "$1"]])',
@@ -1032,6 +1111,7 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
'searchprofile-everything-tooltip' => "Klask e pep lec'h (er pajennoù kaozeal ivez)",
'searchprofile-advanced-tooltip' => 'Klask en esaouennoù anv personelaet',
'search-result-size' => '$1 ({{PLURAL:$2|1 ger|$2 ger}})',
+'search-result-category-size' => '{{PLURAL:$1|1|$1}} ezel ({{PLURAL:$2|1|$2}} is-rummad, {{PLURAL:$3|1|$3}} restr)',
'search-result-score' => 'Klotadusted : $1%',
'search-redirect' => '(adkas $1)',
'search-section' => '(rann $1)',
@@ -1106,6 +1186,7 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
'contextlines' => 'Niver a linennoù dre respont',
'contextchars' => 'Niver a arouezennoù kendestenn dre linenn',
'stub-threshold' => 'Bevenn uhelañ evit al <a href="#" class="stub">liammoù war-du an danvez pennadoù</a> (okted) :',
+'stub-threshold-disabled' => 'Diweredekaet',
'recentchangesdays' => "Niver a zevezhioù da ziskouez er c'hemmoù diwezhañ :",
'recentchangesdays-max' => "(d'ar muiañ $1 {{PLURAL:$1|deiz|deiz}})",
'recentchangescount' => 'Niver a gemmoù da ziskouez dre ziouer',
@@ -1139,6 +1220,7 @@ Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
'prefs-files' => 'Restroù',
'prefs-custom-css' => 'CSS personelaet',
'prefs-custom-js' => 'JS personelaet',
+'prefs-common-css-js' => 'JavaScript ha CSS kenrannet evit an holl wiskadurioù :',
'prefs-reset-intro' => "Ober gant ar bajenn-mañ a c'hallit evit adlakaat ho penndibaboù dre ziouer evit al lec'hienn-mañ. Kement-se n'hallo ket bezañ disc'hraet da c'houde.",
'prefs-emailconfirm-label' => 'Kadarnaat ar postel :',
'prefs-textboxsize' => 'Ment ar prenestr skridaozañ',
@@ -1177,9 +1259,15 @@ Gallout a rit lezel tud all da vont e darempred ganeoc'h dre ho pajennoù implij
'prefs-advancedrendering' => 'Dibarzhioù araokaet',
'prefs-advancedsearchoptions' => 'Dibarzhioù araokaet',
'prefs-advancedwatchlist' => 'Dibarzhioù araokaet',
-'prefs-display' => 'Dibarzhioù diskwel',
+'prefs-displayrc' => 'Dibarzhioù diskwel',
+'prefs-displaysearchoptions' => 'Dibarzhioù diskwel',
+'prefs-displaywatchlist' => 'Dibarzhioù diskwel',
'prefs-diffs' => "Diforc'hioù",
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
+'email-address-validity-invalid' => "Ebarzhit ur chomlec'h postel reizh",
+
# User rights
'userrights' => 'Merañ statud an implijerien',
'userrights-lookup-user' => 'Merañ strolladoù an implijer',
@@ -1263,6 +1351,7 @@ Gallout a rit lezel tud all da vont e darempred ganeoc'h dre ho pajennoù implij
'right-hideuser' => 'Stankañ un implijer, en ur guzhat anezhañ diouzh ar re all',
'right-ipblock-exempt' => "Tremen dreist an IPoù stanket, ar stankadennoù emgefre hag ar bloc'hadennoù IP stanket",
'right-proxyunbannable' => 'Temen dreist stankadennoù emgefre ar proksioù',
+'right-unblockself' => 'En em zistankañ drezo o unan',
'right-protect' => 'Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet',
'right-editprotected' => 'Kemmañ ar pajennoù gwarezet (hep gwarez dre skalierad)',
'right-editinterface' => 'Degas kemmoù war an etrefas implijer',
@@ -1285,7 +1374,6 @@ Gallout a rit lezel tud all da vont e darempred ganeoc'h dre ho pajennoù implij
'right-siteadmin' => 'Prennañ ha dibrennañ ar bank-titouroù',
'right-reset-passwords' => 'Kemmañ ger-tremen implijerien all',
'right-override-export-depth' => 'Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live',
-'right-versiondetail' => 'Sellet ouzh an titouroù ouzhpenn diwar-benn stummoù ar meziantoù',
'right-sendemail' => "Kas ur postel d'an implijerien all",
# User rights log
@@ -1336,14 +1424,9 @@ Gallout a rit lezel tud all da vont e darempred ganeoc'h dre ho pajennoù implij
'recentchanges-legend' => "Dibarzhioù ar c'hemmoù diwezhañ",
'recentchangestext' => "Dre ar bajenn-mañ e c'hallit heuliañ ar c'hemmoù diwezhañ bet degaset d'ar wiki.",
'recentchanges-feed-description' => "Heuilhit ar c'hemmoù diwezhañ er wiki el lusk-mañ.",
-'recentchanges-label-legend' => "Alc'hwez : $1.",
-'recentchanges-legend-newpage' => '$1 - pajenn nevez',
'recentchanges-label-newpage' => "Gant ar c'hemm-mañ e vo krouet ur bajenn nevez.",
-'recentchanges-legend-minor' => '$1 - kemm dister',
'recentchanges-label-minor' => "Ur c'hemm dister eo hemañ",
-'recentchanges-legend-bot' => '$1 - kemm degaset gant ur robot',
'recentchanges-label-bot' => "Gant ur bot eo bet degaset ar c'hemm-mañ.",
-'recentchanges-legend-unpatrolled' => "$1 - kemm n'eo ket bet gwiriet",
'recentchanges-label-unpatrolled' => "N'eo ket bet gwiriet ar c'hemm-mañ evit c'hoazh.",
'rcnote' => "Setu aze an {{PLURAL:$1|'''1''' change|'''$1''' kemm diwezhañ}} bet c'hoarvezet e-pad an {{PLURAL:$2|deiz|'''$2''' deiz}} diwezhañ, savet d'an $4 da $5.",
'rcnotefrom' => "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an '''$2''' ('''$1''' d'ar muiañ).",
@@ -1390,6 +1473,9 @@ E '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
'upload_directory_missing' => "Mankout a ra ar c'havlec'h enporzhiañ ($1) ha n'eo ket bet ar servijer Web evit e grouiñ.",
'upload_directory_read_only' => "N'hall ket ar servijer skrivañ e renkell ar c'hargadennoù ($1).",
'uploaderror' => 'Fazi',
+'upload-recreate-warning' => "'''Diwallit''' : Diverket pe dilec'hiet ez eus bet ur restr gant an anv-se.'''
+
+Deoc'h da c'houzout, setu aze marilh an diverkañ hag an dilec'hiañ evit ar bajenn-mañ.",
'uploadtext' => "Grit gant ar furmskrid a-is evit enporzhiañ restroù war ar servijer.
Evit sellet pe klask skeudennoù bet enporzhiet a-raok sellit ouzh [[Special:FileList|roll ar skeudennoù]]. Kavet e vo ar skeudennoù enporzhiet war [[Special:Log/upload|marilh ar pajennoù enporzhiet]] hag an diverkadennoù war [[Special:Log/delete|istor an diverkadennoù]].
@@ -1423,6 +1509,17 @@ S.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
'filetype-banned-type' => "'''N'eo ket \".\$1\"''' eus ar seurt restroù aotreet.
\$2 eo {{PLURAL:\$3|ar seurt restroù|ar seurt restroù}} degemeret.",
'filetype-missing' => 'N\'eus astenn ebet stag ouzh ar restr (evel ".jpg").',
+'empty-file' => "Ar restr hoc'h eus roet a oa goullo.",
+'file-too-large' => "Ar restr hoc'h eus roet a oa re vras.",
+'filename-tooshort' => 'Re verr eo anv ar restr.',
+'filetype-banned' => 'Difennet eo ar seurt restroù',
+'verification-error' => 'Korbellet eo bet ar restr-mañ gant ar gwiriañ restroù.',
+'hookaborted' => "Ar c'hemm hoc'h eus klasket degas zo bet harzet gant ur c'hrog astenn.",
+'illegal-filename' => "N'eo ket aotreet anv ar restr.",
+'overwrite' => "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
+'unknown-error' => "C'hoarvezet ez eus ur gudenn dianav.",
+'tmp-create-error' => 'Dibosupl eo krouiñ ur restr padennek.',
+'tmp-write-error' => 'Ur gudenn skrivañ a zo bet evit ar restr padennek.',
'large-file' => "Erbediñ a reer ne vefe ket brasoc'h ar restroù eget $1; $2 eo ment ar restr-mañ.",
'largefileserver' => "Brasoc'h eo ar restr-mañ eget ar pezh a c'hall ar servijer aotren.",
'emptyfile' => "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
@@ -1449,13 +1546,14 @@ Mar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un a
Mar fell deoc'h enporzhiañ ar restr-mañ da vat, kit war ho kiz hag enporzhiit anezhi adarre dindan un anv all. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Un eil eus ar {{PLURAL:$1|restr|restroù}} da-heul eo ar restr-mañ :',
'file-deleted-duplicate' => "Diverket ez eus bet c'hoazh ur restr heñvel-poch ouzh ar restr-mañ ([[:$1]]). Gwelloc'h e vefe deoc'h teuler ur sell war istor diverkadenn ar bajenn-se a-raok hec'h enporzhiañ en-dro.",
-'successfulupload' => 'Eiladenn kaset da benn vat',
'uploadwarning' => 'Diwallit!',
'uploadwarning-text' => 'Cheñchit deskrivadur ar restr a-is ha klaskit en-dro.',
'savefile' => 'Enrollañ ar restr',
'uploadedimage' => '"[[$1]]" enporzhiet',
'overwroteimage' => 'enporzhiet ur stumm nevez eus "[[$1]]"',
'uploaddisabled' => 'Ho tigarez, diweredekaet eo bet kas ar restr-mañ.',
+'copyuploaddisabled' => 'Diweredekaet eo bet ar pellgargañ dre URL.',
+'uploadfromurl-queued' => 'Lakaet eo bet ho pellgargadenn er roll gortoz.',
'uploaddisabledtext' => 'Diweredekaet eo an enporzhiañ restroù.',
'php-uploaddisabledtext' => 'Diweredekaet eo bet ar pellgargañ e PHP. Gwiriit an dibarzh arventennoù file_uploads.',
'uploadscripted' => "Er restr-mañ ez eus kodoù HTML pe skriptoù a c'hallfe bezañ kammgomprenet gant ur merdeer Kenrouedad.",
@@ -1488,6 +1586,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- leave this line exactly as it is -->",
+'upload-success-subj' => 'Eiladenn kaset da benn vat',
+'upload-success-msg' => 'Ho kargadenn eus [$2] a zo bet graet. Gellout a rit kavout anezhi amañ : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Kudenn kargañ',
+'upload-failure-msg' => "Ur gudenn 'zo bet e-pad ho kargadenn adalek [$2] :
+
+$1",
+'upload-warning-subj' => "Kemmen diwall e-pad ar c'hargañ",
+'upload-warning-msg' => "Ur gudenn zo bet e-kerzh hoc'h ezporzhiadur eus [$2]. Gallout a c'heller distreiñ d'ar [[Special:Upload/stash/$1|furmskrid ezporzhiañ]] evit renkañ ar gudenn.",
'upload-proto-error' => 'Protokol direizh',
'upload-proto-error-text' => 'Rekis eo an URLoù a grog gant <code>http://</code> pe <code>ftp://</code> evit enporzhiañ.',
@@ -1551,6 +1657,7 @@ Klikañ e penn ar bann a cheñch an urzh kinnig.',
'listfiles_search_for' => 'Klask anv ar skeudenn :',
'imgfile' => 'restr',
'listfiles' => 'Roll ar skeudennoù',
+'listfiles_thumb' => 'Munud',
'listfiles_date' => 'Deiziad',
'listfiles_name' => 'Anv',
'listfiles_user' => 'Implijer',
@@ -1663,8 +1770,8 @@ Diskouezet eo deskrivadur he [$2 fajenn zeskrivañ] amañ dindan.',
'statistics-edits' => 'Kemmoù war ar pajennoù abaoe krouidigezh {{SITENAME}}',
'statistics-edits-average' => "Keidenn ar c'hemmoù dre bajenn",
'statistics-views-total' => 'Hollad ar selladennoù',
+'statistics-views-total-desc' => "N'haller ket mont war ar pajennoù n'eus ket anezho pe war ar pajennoù dibar.",
'statistics-views-peredit' => 'Keidenn gweladenniñ dre gemmoù',
-'statistics-jobqueue' => 'Hirder ar [http://www.mediawiki.org/wiki/Manual:Job_queue roll gortoz evit an tretiñ]',
'statistics-users' => '[[Special:ListUsers|Implijerien]] enrollet',
'statistics-users-active' => 'Implijerien oberiant',
'statistics-users-active-desc' => "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
@@ -1679,7 +1786,7 @@ Sellet e vez ouzh ur bajenn evel ouzh ur bajenn disheñvelout ma ra gant ur patr
'doubleredirects' => 'Adkasoù doubl',
'doubleredirectstext' => 'Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.
War bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal "gwirion" a zlefe an adkas kentañ kas di.
-Diskoulmet eo bet an enmontoù <s>barrennet</s>.',
+Diskoulmet eo bet an enmontoù <del>barrennet</del>.',
'double-redirect-fixed-move' => 'Adanvet eo bet [[$1]], adkaset eo war-du [[$2]] bremañ',
'double-redirect-fixer' => 'Reizher adkasoù',
@@ -1703,6 +1810,8 @@ $1 {{PLURAL:$1|rummad|rummad}}',
'nmembers' => '$1 {{PLURAL:$1|elfenn|elfenn}}',
'nrevisions' => '$1 {{PLURAL:$1|stumm|stumm}}',
'nviews' => '$1 {{PLURAL:$1|selladenn|selladenn}}',
+'nimagelinks' => 'Implijet e $1 {{PLURAL:$1|pajenn|pajenn}}',
+'ntransclusions' => 'implijet e $1 {{PLURAL:$1|pajenn|pajenn}}',
'specialpage-empty' => 'Goullo eo ar bajenn-mañ.',
'lonelypages' => 'Pajennoù hep liamm daveto',
'lonelypagestext' => "N'eo ket liammet pe enframmet ar pajennoù da-heul ouzh pajenn all ebet eus {{SITENAME}}.",
@@ -1860,36 +1969,42 @@ Gallout a ra bezañ [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]
'listgrouprights-removegroup-self-all' => 'Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.',
# E-mail user
-'mailnologin' => "Chomlec'h ebet",
-'mailnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]]
+'mailnologin' => "Chomlec'h ebet",
+'mailnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]]
ha bezañ merket ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù]]
evit gallout kas ur postel d'un implijer all.",
-'emailuser' => "Kas ur postel d'an implijer-mañ",
-'emailpage' => 'Postel implijer',
-'emailpagetext' => "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an implijer-mañ.
+'emailuser' => "Kas ur postel d'an implijer-mañ",
+'emailpage' => 'Postel implijer',
+'emailpagetext' => "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an implijer-mañ.
E maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h-c'hwi en ho [[Special:Preferences|Penndibaboù]], d'ar resever da c'hallout respont deoc'h war-eeun ma kar.",
-'usermailererror' => 'Fazi postel :',
-'defemailsubject' => 'postel kaset eus {{SITENAME}}',
-'noemailtitle' => "Chomlec'h postel ebet",
-'noemailtext' => "N'en deus ket an implijer-mañ resisaet chomlec'h postel reizh ebet.",
-'nowikiemailtitle' => 'Berzet kas posteloù',
-'nowikiemailtext' => 'Dibabet ez eus bet gant an implijerien-mañ chom hep resev posteloù a-berzh implijerien all.',
-'email-legend' => "Kas ur postel d'un implijer all eus {{SITENAME}}",
-'emailfrom' => 'Kaser :',
-'emailto' => 'Resever :',
-'emailsubject' => 'Danvez :',
-'emailmessage' => 'Postel :',
-'emailsend' => 'Kas',
-'emailccme' => "Kas din un eilskrid eus ma c'hemennadenn dre bostel.",
-'emailccsubject' => 'Eilenn eus ho kemennadenn da $1: $2',
-'emailsent' => 'Postel kaset',
-'emailsenttext' => 'Kaset eo bet ho postel.',
-'emailuserfooter' => 'Kaset eo bet ar postel-mañ gant $1 da $2 dre an arc\'hwel "Kas ur postel d\'an implijer" war {{SITENAME}}.',
+'usermailererror' => 'Fazi postel :',
+'defemailsubject' => 'postel kaset eus {{SITENAME}}',
+'usermaildisabled' => "Diweredekaet eo ar c'has posteloù etre an implijerien.",
+'usermaildisabledtext' => "Ne c'helloc'h ket kas posteloù da implijerien all er wiki-mañ",
+'noemailtitle' => "Chomlec'h postel ebet",
+'noemailtext' => "N'en deus ket an implijer-mañ resisaet chomlec'h postel reizh ebet.",
+'nowikiemailtitle' => 'Berzet kas posteloù',
+'nowikiemailtext' => 'Dibabet ez eus bet gant an implijerien-mañ chom hep resev posteloù a-berzh implijerien all.',
+'email-legend' => "Kas ur postel d'un implijer all eus {{SITENAME}}",
+'emailfrom' => 'Kaser :',
+'emailto' => 'Resever :',
+'emailsubject' => 'Danvez :',
+'emailmessage' => 'Postel :',
+'emailsend' => 'Kas',
+'emailccme' => "Kas din un eilskrid eus ma c'hemennadenn dre bostel.",
+'emailccsubject' => 'Eilenn eus ho kemennadenn da $1: $2',
+'emailsent' => 'Postel kaset',
+'emailsenttext' => 'Kaset eo bet ho postel.',
+'emailuserfooter' => 'Kaset eo bet ar postel-mañ gant $1 da $2 dre an arc\'hwel "Kas ur postel d\'an implijer" war {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'En deus laosket ur gemennadenn sistem.',
+'usermessage-editor' => 'Kemennerezh ar reizhiad',
# Watchlist
'watchlist' => 'Roll evezhiañ',
'mywatchlist' => 'Ma roll evezhiañ',
-'watchlistfor' => "(evit '''$1''')",
+'watchlistfor2' => 'Evit $1 $2',
'nowatchlist' => "N'eus pennad ebet en ho roll evezhiañ.",
'watchlistanontext' => "Ret eo deoc'h $1 evit gwelet pe kemmañ an elfennoù zo en ho roll evezhiañ.",
'watchnologin' => 'Digevreet',
@@ -1936,7 +2051,7 @@ Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ. klikit war "Paouez da e
'enotif_anon_editor' => 'implijer dizanv $1',
'enotif_body' => '$WATCHINGUSERNAME ker,
-$CHANGEDORCREATED eo bet ar bajenn {{SITENAME}} evit $PAGETITLE gant $PAGEEDITOR d\'an $PAGEEDITDATE, gwelet $PAGETITLE_URL evit gwelet ar stumm red.
+$CHANGEDORCREATED eo bet pajenn $PAGETITLE {{SITENAME}} gant $PAGEEDITOR d\'an $PAGEEDITDATE gwelet $PAGETITLE_URL evit gwelet ar stumm red.
$NEWPAGE
@@ -1952,6 +2067,9 @@ Gallout a rit nevesaat doare ar pennadoù evezhiet ganeoc\'h en ho rollad evezhi
Ho reizhiad kemenn {{SITENAME}} muiañ karet
--
+A-benn kemmañ arventennoù ho kemennoù dre bostel, sellit ouzh
+{{fullurl:{{#special:Preferences}}}}
+
A-benn kemmañ doare ho rollad evezhiañ, sellit ouzh
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2010,7 +2128,10 @@ Ar c'hemm diwezhañ d'ar bajenn-mañ a oa bet graet gant [[User:$3|$3]] ([[User
'revertpage' => "Kemmoù distaolet gant [[Special:Contributions/$2|$2]] ([[User talk:$2|Kaozeal]]); adlakaet d'ar stumm diwezhañ a-gent gant [[User:$1|$1]]",
'revertpage-nouser' => "Disteuler kemmoù (anv implijer distaolet) ha distreiñ d'ar stumm diwezhañ gant [[User:$1|$1]]",
'rollback-success' => 'Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.',
-'sessionfailure' => 'Evit doare ez eus ur gudenn gant ho talc\'h;
+
+# Edit tokens
+'sessionfailure-title' => "Fazi dalc'h",
+'sessionfailure' => 'Evit doare ez eus ur gudenn gant ho talc\'h;
Nullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.
Klikit war "kent" hag adkargit ar bajenn oc\'h deuet drezi; goude klaskit en-dro.',
@@ -2139,18 +2260,22 @@ $1',
'month' => 'Abaoe miz (hag a-raok) :',
'year' => 'Abaoe bloaz (hag a-raok) :',
-'sp-contributions-newbies' => "Diskouez hepken degasadennoù ar c'hontoù nevez",
-'sp-contributions-newbies-sub' => 'Evit an implijerien nevez',
-'sp-contributions-newbies-title' => "Degasadennoù implijer evit ar c'hontoù nevez",
-'sp-contributions-blocklog' => 'Roll ar stankadennoù',
-'sp-contributions-deleted' => 'Degasadennoù diverket',
-'sp-contributions-logs' => 'marilhoù',
-'sp-contributions-talk' => 'kaozeal',
-'sp-contributions-userrights' => 'Merañ ar gwirioù',
-'sp-contributions-blocked-notice' => "Stanket eo an implijer-mañ evit poent. Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
-'sp-contributions-search' => 'Klask degasadennoù',
-'sp-contributions-username' => "Anv implijer pe chomlec'h IP :",
-'sp-contributions-submit' => 'Klask',
+'sp-contributions-newbies' => "Diskouez hepken degasadennoù ar c'hontoù nevez",
+'sp-contributions-newbies-sub' => 'Evit an implijerien nevez',
+'sp-contributions-newbies-title' => "Degasadennoù implijer evit ar c'hontoù nevez",
+'sp-contributions-blocklog' => 'Roll ar stankadennoù',
+'sp-contributions-deleted' => 'Degasadennoù diverket',
+'sp-contributions-uploads' => 'Enporzhiadennoù',
+'sp-contributions-logs' => 'marilhoù',
+'sp-contributions-talk' => 'kaozeal',
+'sp-contributions-userrights' => 'Merañ ar gwirioù',
+'sp-contributions-blocked-notice' => "Stanket eo an implijer-mañ evit poent. Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
+'sp-contributions-blocked-notice-anon' => "Stanket eo ar chomlec'h IP-mañ evit ar mare.
+Dindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
+'sp-contributions-search' => 'Klask degasadennoù',
+'sp-contributions-username' => "Anv implijer pe chomlec'h IP :",
+'sp-contributions-toponly' => 'Na ziskouez nemet an adweladennoù diwezhañ',
+'sp-contributions-submit' => 'Klask',
# What links here
'whatlinkshere' => 'Pajennoù liammet',
@@ -2214,7 +2339,6 @@ Sellit ouzh [[Special:IPBlockList|roll ar chomlec\'hioù IP ha kontoù stanket]]
'ipb-edit-dropdown' => 'Kemmañ an abegoù stankañ',
'ipb-unblock-addr' => 'Distankañ $1',
'ipb-unblock' => "Distankañ un implijer pe ur chomlec'h IP",
-'ipb-blocklist-addr' => 'Stankadennoù zo evit $1',
'ipb-blocklist' => 'Teuler ur sell ouzh roll an dud stanket evit poent',
'ipb-blocklist-contribs' => 'Degasadennoù evit $1',
'unblockip' => "Distankañ ur chomlec'h IP",
@@ -2282,6 +2406,8 @@ Stanket eo $1 c'hoazh. Kemmañ an arventennoù a fell deoc'h ?",
'sorbs_create_account_reason' => "Rollet eo ho chomlec'h IP evel ur proksi digor war an DNSBL implijet gant {{SITENAME}}. N'hallit ket krouiñ ur gont",
'cant-block-while-blocked' => "N'hallit ket stankañ implijerien all ma'z oc'h stanket c'hwi hoc'h-unan.",
'cant-see-hidden-user' => "Stanket ha kuzhet eo bet dija an implijer emaoc'h o klask stankañ. Dre ma n'emañ ket ganeoc'h ar gwir hideuser, n'hallit ket gwelet pe kemmañ stankadenn an implijer.",
+'ipbblocked' => "Ne c'hellit ket stankañ pe distankañ implijerien all, dre ma 'z oc'h stanket",
+'ipbnounblockself' => "N'oc'h ket aotreet d'en em zistankañ ho unan",
# Developer tools
'lockdb' => 'Prennañ ar bank',
@@ -2314,6 +2440,15 @@ Ne vo ket kemmet liammoù an titl kozh ha ne vo ket dilec'hiet ar bajenn gaozeal
'''DIWALLIT!'''
Gallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;
bezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
+'movepagetext-noredirectfixer' => "Grit gant ar furmskrid a-is evit adenvel ur bajenn hag adkas an istor anezhi war-zu an anv nevez.
+Dont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.
+Gwiriit mat an [[Special:DoubleRedirects|adkasoù doubl]] hag an [[Special:BrokenRedirects|adkasoù torr]].
+Ennoc'h emañ fiziet gwiriañ e kendalc'h al liammoù da gas war-zu ar bajenn a rankont kas daveti.
+
+Notit mat ne vo '''ket''' dilec'hiet ar bajenn ma'z eus dija unan gant an titl nevez nemet e vefe goullo istor ar c'hemmoù degaset enni hag e vefe pe goullo ar bajenn pe e vefe un adkas anezhi. Gant se e c'haller adenvel ur bajenn war-zu he lec'h orin mard eo faziek an dilec'hiañ ha dibosupl eo frikañ ur bajenn zo anezhi c'hoazh.
+
+'''Diwallit !'''
+Ur c'hemm bras ha dic'hortoz e c'hall bezañ evit ur bajenn a vez sellet outi alies ; bezit sur hoc'h eus komprenet mat an heuliadoù a-raok kenderc'hel ganti.",
'movepagetalktext' => "Gant se e vo adanvet ent emgefre ar bajenn gaozeal stag, ma'z eus anezhi '''nemet ma:'''
*ec'h adanvit ur bajenn war-du ul lec'h all,
*ez eus ur bajenn gaozeal c'hoazh gant an anv nevez, pe
@@ -2371,6 +2506,7 @@ Diverkañ anezhañ a fell deoc'h ober evit reiñ lec'h d'an adkas ?",
'immobile-source-page' => "N'haller ket adenvel ar bajenn-mañ.",
'immobile-target-page' => "N'haller ket kas ar bajenn-mañ war-du an titl-se.",
'imagenocrossnamespace' => "N'haller ket dilec'hiañ ur skeudenn war-du un esaouenn anv n'eo ket hini ur skeudenn.",
+'nonfile-cannot-move-to-file' => "N'haller ket dilec'hiañ un dra ha n'eo ket ur restr war-du an esaouenn anv restr",
'imagetypemismatch' => 'Ne glot ket astenn nevez ar restr gant ar furmad-mañ.',
'imageinvalidfilename' => 'Fall eo anv ar restr tal',
'fix-double-redirects' => 'Hizivaat an holl adkasoù a gas war-du an titl orin',
@@ -2449,6 +2585,7 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
'importstart' => "Oc'h enporzhiañ pajennoù...",
'import-revision-count' => '$1 {{PLURAL:$1|stumm|stumm}}',
'importnopages' => 'Pajenn ebet da enporzhiañ.',
+'imported-log-entries' => '$1 moned{{PLURAL:$1||}} eus ar marilh enporzhiet{{PLURAL:$1||}}.',
'importfailed' => "C'hwitet eo an enporzhiadenn: $1",
'importunknownsource' => 'Dianav eo seurt ar vammenn enporzhiañ',
'importcantopen' => "N'eus ket bet gallet digeriñ ar restr enporzhiet",
@@ -2542,6 +2679,8 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
'tooltip-rollback' => "\"Disteuler\" a zistaol en ur c'hlik ar c'hemm(où) bet degaset d'ar bajenn-mañ gant an implijer diwezhañ.",
'tooltip-undo' => '"Dizober" a zistaol ar c\'hemm-mañ hag a zigor ar prenestr skridaozañ er mod rakwelet.
Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
+'tooltip-preferences-save' => 'Enrollañ ar penndibaboù',
+'tooltip-summary' => 'Skrivit un diveradenn verr',
# Stylesheets
'common.css' => '/** Talvezout a raio ar CSS lakaet amañ evit an holl gwiskadurioù */',
@@ -2668,19 +2807,22 @@ $1',
'nextdiff' => "Stumm nevesoc'h →",
# Media information
-'mediawarning' => "'''Diwallit :''' Kodoù siek a c'hall bezañ er seurt restr-mañ.
+'mediawarning' => "'''Diwallit :''' Kodoù siek a c'hall bezañ er seurt restr-mañ.
Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
'imagemaxsize' => "Bevenn ment vrasañ ar skeudennoù :<br />''(evit ar pajennoù deskrivañ)''",
'thumbsize' => 'Ment an alberz :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pajenn|pajenn}}',
-'file-info' => '(ment ar restr : $1, seurt MIME : $2)',
-'file-info-size' => '($1 × $2 piksel, ment ar restr : $3, seurt MIME : $4)',
+'file-info' => 'ment ar restr : $1, seurt MIME : $2',
+'file-info-size' => '$1 × $2 piksel, ment ar restr : $3, seurt MIME : $4',
'file-nohires' => "<small>N'haller ket gwellaat ar pizhder.</small>",
-'svg-long-desc' => '(restr SVG file, pizhder $1 × $2 piksel, ment ar restr : $3)',
+'svg-long-desc' => 'restr SVG file, pizhder $1 × $2 piksel, ment ar restr : $3',
'show-big-image' => 'Pizhder leun',
'show-big-image-thumb' => '<small>Ment ar rakweled-mañ : $1 × $2 piksel</small>',
'file-info-gif-looped' => "e kelc'h",
'file-info-gif-frames' => '$1 {{PLURAL:$1|skeudenn|skeudenn}}',
+'file-info-png-looped' => "e kelc'h",
+'file-info-png-repeat' => 'lennet $1 {{PLURAL:$1|wezh|gwezh}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|skeudenn|skeudenn}}',
# Special:NewFiles
'newimages' => 'Roll ar restroù nevez',
@@ -2833,6 +2975,7 @@ Kement liamm all war an hevelep linenn a seller outañ evel un nemedenn, da skou
'exif-gpsareainformation' => 'Anv an takad GPS',
'exif-gpsdatestamp' => 'Deiziad GPS',
'exif-gpsdifferential' => "Reizhadenn diforc'hadus GPS",
+'exif-objectname' => 'Titl berr',
# EXIF attributes
'exif-compression-1' => 'Hep gwaskañ',
@@ -2866,7 +3009,7 @@ Kement liamm all war an hevelep linenn a seller outañ evel un nemedenn, da skou
'exif-subjectdistance-value' => '$1 metr',
'exif-meteringmode-0' => 'Dianav',
-'exif-meteringmode-1' => 'Keitat',
+'exif-meteringmode-1' => 'Keidenn',
'exif-meteringmode-2' => 'Muzul kreiz keitat',
'exif-meteringmode-3' => 'Spot',
'exif-meteringmode-4' => 'Liesspot',
@@ -2992,26 +3135,26 @@ Kement liamm all war an hevelep linenn a seller outañ evel un nemedenn, da skou
'limitall' => 'An holl',
# E-mail address confirmation
-'confirmemail' => "Kadarnaat ar chomlec'h postel",
-'confirmemail_noemail' => "N'hoc'h eus ket spisaet chomlec'h postel mat ebet en ho [[Special:Preferences|penndibaboù implijer]].",
-'confirmemail_text' => "Rankout a ra ar wiki-mañ bezañ gwiriet ho chomlec'h postel a-raok gallout implijout nep arc'hwel postel. Implijit ar bouton a-is evit kas ur postel kadarnaat d'ho chomlec'h. Ul liamm ennañ ur c'hod a vo er postel. Kargit al liamm-se en o merdeer evit kadarnaat ho chomlec'h.",
-'confirmemail_pending' => "Ur c'hod kadarnaat zo bet kaset deoc'h dre bostel c'hoazh;
+'confirmemail' => "Kadarnaat ar chomlec'h postel",
+'confirmemail_noemail' => "N'hoc'h eus ket spisaet chomlec'h postel mat ebet en ho [[Special:Preferences|penndibaboù implijer]].",
+'confirmemail_text' => "Rankout a ra ar wiki-mañ bezañ gwiriet ho chomlec'h postel a-raok gallout implijout nep arc'hwel postel. Implijit ar bouton a-is evit kas ur postel kadarnaat d'ho chomlec'h. Ul liamm ennañ ur c'hod a vo er postel. Kargit al liamm-se en o merdeer evit kadarnaat ho chomlec'h.",
+'confirmemail_pending' => "Ur c'hod kadarnaat zo bet kaset deoc'h dre bostel c'hoazh;
a-raok klask goulenn unan nevez, m'emaoc'h o paouez krouiñ ho kont, e vo fur eus ho perzh gortoz un nebeud munutoù ha leuskel amzer dezhañ d'en em gavout betek ennoc'h.",
-'confirmemail_send' => "Kas ur c'hod kadarnaat",
-'confirmemail_sent' => 'Postel kadarnaat kaset.',
-'confirmemail_oncreate' => "Kaset ez eus bet ur c'hod kadarnaat d'ho chomlec'h postel.
+'confirmemail_send' => "Kas ur c'hod kadarnaat",
+'confirmemail_sent' => 'Postel kadarnaat kaset.',
+'confirmemail_oncreate' => "Kaset ez eus bet ur c'hod kadarnaat d'ho chomlec'h postel.
N'eus ket ezhomm eus ar c'hod-mañ evit kevreañ met ret e vo deoc'h ober gantañ evit aotren hini pe hini eus arc'hwelioù postel ar wiki.",
-'confirmemail_sendfailed' => "Dibosupl kas ar postel kadarnaat deoc'h gant {{SITENAME}}.
+'confirmemail_sendfailed' => "Dibosupl kas ar postel kadarnaat deoc'h gant {{SITENAME}}.
Gwiriit ha n'eus ket arouezennoù direizh en ho chomlec'h.
Distro ar posteler : $1",
-'confirmemail_invalid' => "Kod kadarnaat kamm. Marteze eo aet ar c'hod d'e dermen",
-'confirmemail_needlogin' => "Ret eo deoc'h $1 evit kadarnaat ho chomlec'h postel.",
-'confirmemail_success' => "Kadarnaet eo ho chomlec'h postel. A-benn bremañ e c'hallit [[Special:UserLogin|kevreañ]] hag ober ho mad eus ar wiki.",
-'confirmemail_loggedin' => "Kadarnaet eo ho chomlec'h bremañ",
-'confirmemail_error' => 'Ur gudenn zo bet e-ser enrollañ ho kadarnadenn',
-'confirmemail_subject' => "Kadarnadenn chomlec'h postel evit {{SITENAME}}",
-'confirmemail_body' => "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP \$1,
+'confirmemail_invalid' => "Kod kadarnaat kamm. Marteze eo aet ar c'hod d'e dermen",
+'confirmemail_needlogin' => "Ret eo deoc'h $1 evit kadarnaat ho chomlec'h postel.",
+'confirmemail_success' => "Kadarnaet eo ho chomlec'h postel. A-benn bremañ e c'hallit [[Special:UserLogin|kevreañ]] hag ober ho mad eus ar wiki.",
+'confirmemail_loggedin' => "Kadarnaet eo ho chomlec'h bremañ",
+'confirmemail_error' => 'Ur gudenn zo bet e-ser enrollañ ho kadarnadenn',
+'confirmemail_subject' => "Kadarnadenn chomlec'h postel evit {{SITENAME}}",
+'confirmemail_body' => "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP \$1,
en deus enrollet ur gont \"\$2\" gant ar chomlec'h postel-mañ war lec'hienn {{SITENAME}}.
A-benn kadarnaat eo deoc'h ar gont-se ha gweredekaat
@@ -3025,8 +3168,36 @@ evit nullañ kadarnaat ar chomlec'h postel :
\$5
Mont a raio ar c'hod-mañ d'e dermen d'ar \$4.",
-'confirmemail_invalidated' => "Nullet eo bet kadarnaat ar chomlec'h postel",
-'invalidateemail' => 'Nullañ kadarnaat ar postel',
+'confirmemail_body_changed' => "Unan bennak, c'hwi sur a-walc'h, gant ar chomlec'h IP \$1,
+en deus cheñchet chomlec'h postel ar gont \"\$2\" gant ar chomlec'h postel-mañ war lec'hienn {{SITENAME}}.
+
+A-benn kadarnaat eo deoc'h ar gont-se hag adgweredekaat
+ar perzhioù postel war {{SITENAME}}, digorit al liamm-mañ en ho merdeer :
+
+\$3
+
+Ma n'eo *ket* deoc'h ar gont, heuilhit al liamm-mañ
+evit nullañ kadarnaat ar chomlec'h postel :
+
+\$5
+
+Mont a raio ar c'hod kadarnaat-mañ d'e dermen d'ar \$4.",
+'confirmemail_body_set' => "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP \$1,
+en deus enrollet ur gont \"\$2\" gant ar chomlec'h postel-mañ war lec'hienn {{SITENAME}}.
+
+Evit kadarnaat eo deoc'h ar gont-se ha gweredekaat en-dro
+an arc'hwelioù postelerezh war {{SITENAME}}, digorit al liamm-mañ en ho merdeer :
+
+\$3
+
+Ma n'eo *ket* deoc'h ar gont heuilhit al liamm-mañ
+evit nullañ kadarnaat ar chomlec'h postel :
+
+\$5
+
+Mont a raio ar c'hod-mañ d'e dermen d'ar \$4.",
+'confirmemail_invalidated' => "Nullet eo bet kadarnaat ar chomlec'h postel",
+'invalidateemail' => 'Nullañ kadarnaat ar postel',
# Scary transclusion
'scarytranscludedisabled' => '[Diweredekaet eo an treuzkludañ etrewiki]',
@@ -3066,6 +3237,7 @@ Kadarnait mar plij e fell deoc'h krouiñ ar pennad-mañ da vat.",
'table_pager_first' => 'Pajenn gentañ',
'table_pager_last' => 'Pajenn ziwezhañ',
'table_pager_limit' => 'Diskouez $1 elfenn dre bajenn',
+'table_pager_limit_label' => "Disoc'hoù dre bajenn :",
'table_pager_limit_submit' => 'Mont',
'table_pager_empty' => "Disoc'h ebet",
@@ -3142,6 +3314,7 @@ Gallout a rit [[Special:Watchlist/edit|implijout an aozer boutin ivez]].',
'version-specialpages' => 'Pajennoù dibar',
'version-parserhooks' => 'Galvoù dielfennañ',
'version-variables' => 'Argemmoù',
+'version-skins' => 'Gwiskadurioù',
'version-other' => 'Diseurt',
'version-mediahandlers' => 'Merer danvez liesvedia',
'version-hooks' => 'Galvoù',
@@ -3153,6 +3326,13 @@ Gallout a rit [[Special:Watchlist/edit|implijout an aozer boutin ivez]].',
'version-hook-subscribedby' => 'Termenet gant',
'version-version' => '(Stumm $1)',
'version-license' => 'Aotre-implijout',
+'version-poweredby-credits' => "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 're all',
+'version-license-info' => "Ur meziant frank eo MediaWiki; gallout a rit skignañ anezhañ ha/pe kemmañ anezhañ dindan termenoù ar GNU Aotre implijout Foran Hollek evel m'emañ embannet gant Diazezadur ar Meziantoù Frank; pe diouzh stumm 2 an aotre implijout, pe (evel mar karit) ne vern pe stumm nevesoc'h.
+
+Ingalet eo MediaWiki gant ar spi e vo talvoudus met n'eus TAMM GWARANT EBET; hep zoken gwarant empleg ar VARC'HADUSTED pe an AZASTER OUZH UR PAL BENNAK. Gwelet ar GNU Aotre Implijout Foran Hollek evit muioc'h a ditouroù.
+
+Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar GNU Aotre implijout Foran Hollek] a-gevret gant ar programm-mañ; ma n'hoc'h eus ket, skrivit da Diazezadur ar Meziantoù Frank/Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA pe [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lennit anezhañ enlinenn].",
'version-software' => 'Meziant staliet',
'version-software-product' => 'Produ',
'version-software-version' => 'Stumm',
@@ -3222,6 +3402,15 @@ Merkañ anv ar restr hep ar rakger "{{ns:file}}:"',
'tags-edit' => 'aozañ',
'tags-hitcount' => '$1 {{PLURAL:$1|kemm|kemm}}',
+# Special:ComparePages
+'comparepages' => 'Keñveriañ pajennoù',
+'compare-selector' => 'Keñveriañ stummoù ar pajennoù',
+'compare-page1' => 'Pajenn 1',
+'compare-page2' => 'Pajenn 2',
+'compare-rev1' => 'Adweladenn 1',
+'compare-rev2' => 'Adweladenn 2',
+'compare-submit' => 'Keñveriañ',
+
# Database error messages
'dberr-header' => 'Ur gudenn zo gant ar wiki-mañ',
'dberr-problems' => "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
@@ -3238,8 +3427,13 @@ Merkañ anv ar restr hep ar rakger "{{ns:file}}:"',
'htmlform-float-invalid' => "An dalvoudenn bet lakaet ganeoc'h n'eo ket un niver.",
'htmlform-int-toolow' => "Skrivet hoc'h eus un dalvoudenn zo dindan an niver bihanañ aotreet a $1",
'htmlform-int-toohigh' => "Skrivet hoc'h eus un dalvoudenn a ya dreist d'an niver uhelañ aotreet a $1",
+'htmlform-required' => 'An talvoudenn-mañ a zo ret',
'htmlform-submit' => 'Kas',
'htmlform-reset' => "Dizober ar c'hemmoù",
'htmlform-selectorother-other' => 'Unan all',
+# SQLite database support
+'sqlite-has-fts' => '$1 gant enklask eus an destenn a-bezh embreget',
+'sqlite-no-fts' => '$1 hep enklask eus an destenn a-bezh embreget',
+
);
diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php
index 82281604..f9795f0d 100644
--- a/languages/messages/MessagesBs.php
+++ b/languages/messages/MessagesBs.php
@@ -12,6 +12,7 @@
* @author Fulup
* @author Kal-El
* @author Malafaya
+ * @author Palapa
* @author Seha
* @author Smooth O
* @author לערי ריינה×רט
@@ -89,6 +90,7 @@ $specialPageAliases = array(
'Allpages' => array( 'SveStranice' ),
'Prefixindex' => array( 'IndeksPrefiksa' ),
'Ipblocklist' => array( 'ListaBlokiranjaPrekoIP' ),
+ 'Unblock' => array( 'Deblokada' ),
'Specialpages' => array( 'SpecijalneStranice' ),
'Contributions' => array( 'Doprinos' ),
'Emailuser' => array( 'EmailKorisnika' ),
@@ -133,6 +135,8 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'ObrisaniDoprinosi' ),
'Tags' => array( 'Oznake' ),
'Activeusers' => array( 'AktivniKorisnici' ),
+ 'ComparePages' => array( 'UporedjivanjeStranica' ),
+ 'Badtitle' => array( 'Losnaslov' ),
);
$magicWords = array(
@@ -201,14 +205,14 @@ $magicWords = array(
'img_width' => array( '1', '$1piksel', '$1p', '$1px' ),
'img_center' => array( '1', 'centar', 'c', 'center', 'centre' ),
'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bez okvira', 'frameless' ),
+ 'img_frameless' => array( '1', 'bez_okvira', 'frameless' ),
'img_page' => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'na gore', 'na gore=$1', 'na gore$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_upright' => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'granica', 'border' ),
- 'img_baseline' => array( '1', 'pocetna linija', 'baseline' ),
+ 'img_baseline' => array( '1', 'pocetna_linija', 'baseline' ),
'img_sub' => array( '1', 'odjeljak', 'sub' ),
'img_top' => array( '1', 'vrh', 'top' ),
- 'img_text_top' => array( '1', 'vrh teksta', 'text-top' ),
+ 'img_text_top' => array( '1', 'vrh_teksta', 'text-top' ),
'img_middle' => array( '1', 'sredina', 'middle' ),
'img_bottom' => array( '1', 'dugme', 'bottom' ),
'img_text_bottom' => array( '1', 'tekst-dugme', 'text-bottom' ),
@@ -260,10 +264,12 @@ $magicWords = array(
'staticredirect' => array( '1', '__STATISTICNOPREUSMJERENJE__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'NIVOZASTITE', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'PUTANJA', 'PATH' ),
+ 'url_query' => array( '0', 'UPIT', 'QUERY' ),
);
$fallback8bitEncoding = "iso-8859-2";
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zćÄžšđž]+)(.*)$/sDu';
$messages = array(
@@ -282,8 +288,7 @@ $messages = array(
'tog-editsection' => 'Omogući da mijenjam pojedinaÄne odjeljke putem [uredi] linka',
'tog-editsectiononrightclick' => 'UkljuÄite ureÄ‘ivanje odjeljka sa pritiskom na desno dugme miÅ¡a u naslovu odjeljka (JavaScript)',
'tog-showtoc' => 'Prikaži sadržaj (u svim stranicama sa više od tri podnaslova)',
-'tog-rememberpassword' => 'Zapamti šifru za iduće posjete',
-'tog-editwidth' => 'Proširi kutiju za uređivanje da ispuni cijeli ekran',
+'tog-rememberpassword' => 'Zapamti moju šifru u ovom pregledniku (najviše $1 {{PLURAL:$1|dan|dana}})',
'tog-watchcreations' => 'Dodaj stranice koje ja napravim u moj spisak praćenih Älanaka',
'tog-watchdefault' => 'Dodaj stranice koje ureÄ‘ujem u moj spisak praćenih Älanaka',
'tog-watchmoves' => 'Stranice koje premjestim dodaj na spisak praćenja',
@@ -429,31 +434,21 @@ $messages = array(
'faqpage' => 'Project:NPP',
# Vector skin
-'vector-action-addsection' => 'Dodaj temu',
-'vector-action-delete' => 'Brisanje',
-'vector-action-move' => 'Preusmjeri',
-'vector-action-protect' => 'Zaštiti',
-'vector-action-undelete' => 'Vrati obrisano',
-'vector-action-unprotect' => 'Oslobodi zaštitu',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Stranica pomoći',
-'vector-namespace-image' => 'Datoteka',
-'vector-namespace-main' => 'Stranica',
-'vector-namespace-media' => 'Stranica medije',
-'vector-namespace-mediawiki' => 'Poruka',
-'vector-namespace-project' => 'Stranica projekta',
-'vector-namespace-special' => 'Posebna stranica',
-'vector-namespace-talk' => 'Razgovor',
-'vector-namespace-template' => 'Å ablon',
-'vector-namespace-user' => 'KorisniÄka stranica',
-'vector-view-create' => 'Napravi',
-'vector-view-edit' => 'Uređivanje',
-'vector-view-history' => 'Pregled historije',
-'vector-view-view' => 'ÄŒitanje',
-'vector-view-viewsource' => 'Pogledaj izvor',
-'actions' => 'Akcije',
-'namespaces' => 'Imenski prostori',
-'variants' => 'Varijante',
+'vector-action-addsection' => 'Dodaj temu',
+'vector-action-delete' => 'Brisanje',
+'vector-action-move' => 'Preusmjeri',
+'vector-action-protect' => 'Zaštiti',
+'vector-action-undelete' => 'Vrati obrisano',
+'vector-action-unprotect' => 'Oslobodi zaštitu',
+'vector-simplesearch-preference' => 'Omogući napredne sugestije pretrage (samo vector koža)',
+'vector-view-create' => 'Napravi',
+'vector-view-edit' => 'Uređivanje',
+'vector-view-history' => 'Pregled historije',
+'vector-view-view' => 'ÄŒitanje',
+'vector-view-viewsource' => 'Pogledaj izvor',
+'actions' => 'Akcije',
+'namespaces' => 'Imenski prostori',
+'variants' => 'Varijante',
'errorpagetitle' => 'Greška',
'returnto' => 'Povratak na $1.',
@@ -514,6 +509,9 @@ Previše korisnika pokušava da pregleda ovu stranicu.
Molimo priÄekajte trenutak prije nego Å¡to ponovno pokuÅ¡ate pristupiti ovoj stranici.
$1',
+'pool-timeout' => 'Zaustavi Äekanje na zakljuÄavanje',
+'pool-queuefull' => 'Red na pool je prenapunjen',
+'pool-errorunknown' => 'Nepoznata greška',
# 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' => 'O projektu {{SITENAME}}',
@@ -679,7 +677,8 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podeÅ
'yourname' => 'KorisniÄko ime:',
'yourpassword' => 'Å ifra:',
'yourpasswordagain' => 'Ponovite Å¡ifru:',
-'remembermypassword' => 'Zapamti šifru za iduće posjete',
+'remembermypassword' => 'Zapamti moju Å¡ifru na ovom raÄunaru (najviÅ¡e $1 {{PLURAL:$1|dan|dana|dana}})',
+'securelogin-stick-https' => 'Ostani povezan na HTTPS nakon prijave',
'yourdomainname' => 'Vaš domen:',
'externaldberror' => 'DoÅ¡lo je do greÅ¡ke pri vanjskoj autorizaciji baze podataka ili vam nije dopuÅ¡teno osvježavanje VaÅ¡eg vanjskog korisniÄkog raÄuna.',
'login' => 'Prijavi se',
@@ -696,6 +695,7 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podeÅ
'gotaccount' => "Imate nalog? '''$1'''.",
'gotaccountlink' => 'Prijavi se',
'createaccountmail' => 'e-poštom',
+'createaccountreason' => 'Razlog:',
'badretype' => 'Å ifre koje ste unijeli se ne poklapaju.',
'userexists' => 'KorisniÄko ime koje ste unijeli je već u upotrebi.
Molimo Vas da izaberete drugo ime.',
@@ -719,6 +719,7 @@ Molimo Vas da pokušate ponovno.',
Molimo Vas da pokušate ponovno.',
'passwordtooshort' => 'Å ifra mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.',
'password-name-match' => 'VaÅ¡a Å¡ifra mora biti razliÄita od VaÅ¡eg korisniÄkog imena.',
+'password-login-forbidden' => 'KoriÅ¡tenje ovih korisniÄkih imena i Å¡ifara je zabranjeo.',
'mailmypassword' => 'Pošalji mi novu šifru',
'passwordremindertitle' => 'Nova privremena Å¡ifra za {{SITENAME}}',
'passwordremindertext' => 'Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}} ($4). Privremena šifra za korisnika "$2" je napravljena i glasi "$3". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.
@@ -757,6 +758,9 @@ Molimo Vas da saÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
+# E-mail sending
+'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
+
# Password reset dialog
'resetpass' => 'Promijeni korisniÄku Å¡ifru',
'resetpass_announce' => 'Prijavili ste se sa privremenim kodom koji ste dobili na e-mail.
@@ -809,6 +813,7 @@ Možda ste već uspješno promijenili Vašu šifru ili ste tražili novu privrem
'showlivepreview' => 'Pregled uživo',
'showdiff' => 'Prikaži izmjene',
'anoneditwarning' => 'Niste prijavljeni. Vaša IP adresa će biti zapisana.',
+'anonpreviewwarning' => "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
'missingsummary' => "'''Napomena:''' Niste unijeli sažetak izmjene.
Ako kliknete na SaÄuvaj, VaÅ¡a izmjena će biti saÄuvana bez sažetka.",
'missingcommenttext' => 'Molimo unesite komentar ispod.',
@@ -892,8 +897,12 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
'usercsspreview' => "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''
'''Ovaj pregled joÅ¡ uvijek nije saÄuvan!'''",
'userjspreview' => "'''Zapamtite ovo je samo izgled vaÅ¡e JavaScript-e, joÅ¡ uvijek nije saÄuvan!'''",
+'sitecsspreview' => "'''Zapamtite ovo je samo izgled ovog CSS-a.'''
+'''JoÅ¡ uvijek nije saÄuvan!'''",
+'sitejspreview' => "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''
+'''JoÅ¡ uvijek nije saÄuvan!'''",
'userinvalidcssjstitle' => "'''Upozorenje:''' Ne postoji interfejs pod imenom \"\$1\".
-Ne zaboravite da imena stranica s .css i .js kodom poÄinju malim slovom, npr. {{ns:user}}:Foo/monobook.css, a ne {{ns:user}}:Foo/Monobook.css.",
+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!'''",
@@ -934,9 +943,6 @@ nemojte ih slati ovdje. TakoÄ‘e, slanje Älanka podrazumijeva i vaÅ¡u izjavu da
'copyrightwarning2' => "Zapamtite da svi doprinosi na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />
TakoÄ‘er nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sliÄnog slobodnog izvora informacija (pogledajte $1 za viÅ¡e detalja).
'''NE ŠALJITE AUTORSKIM PRAVOM ZAŠTIĆENE TEKSTOVE BEZ DOZVOLE!'''",
-'longpagewarning' => "'''Pažnja''': Ova stranica ima $1 kilobajta;
-neki preglednici mogu imati problema kad uređujete stranice skoro ili veće od 32 kilobajta.
-Molimo Vas da razmotrite razbijanje stranice na manje dijelove.",
'longpageerror' => "'''Greška: Tekst, koji ste poslali, je dug $1 kilobajta, što je veće od maksimuma, koji iznosi $2 kilobajta.
Stranica ne može biti spremljena.'''",
'readonlywarning' => "'''PAŽNJA: Baza je zakljuÄana zbog održavanja, tako da nećete moći da saÄuvate svoje izmjene za sada.
@@ -1116,6 +1122,8 @@ $1",
'logdelete-failure' => "'''Zapisnik vidljivosti nije mogao biti postavljen:'''
$1",
'revdel-restore' => 'Promijeni dostupnost',
+'revdel-restore-deleted' => 'obrisane revizije',
+'revdel-restore-visible' => 'vidljive revizije',
'pagehist' => 'Historija stranice',
'deletedhist' => 'Izbrisana historija',
'revdelete-content' => 'sadržaj',
@@ -1183,11 +1191,13 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
# Diffs
'history-title' => 'Historija izmjena stranice "$1"',
'difference' => '(Razlika između revizija)',
+'difference-multipage' => '(Razlika između stranica)',
'lineno' => 'Linija $1:',
'compareselectedversions' => 'Uporedite oznaÄene verzije',
'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
'editundo' => 'ukloni ovu izmjenu',
-'diff-multi' => '({{plural:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}})',
+'diff-multi' => '({{plural:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije|Nije prikazano $1 međurevizija}} od {{PLURAL:$2|jednog korisnika|$2 korisnika}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})',
# Search results
'searchresults' => 'Rezultati pretrage',
@@ -1222,6 +1232,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
'searchprofile-everything-tooltip' => 'Pretraži sve sadržaje (ukljujući i stranice za razgovor)',
'searchprofile-advanced-tooltip' => 'Traži u ostalim imenskim prostorima',
'search-result-size' => '$1 ({{PLURAL:$2|$2 rijeÄ|$2 rijeÄi}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Älan|$1 Älana|$1 Älanova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})',
'search-result-score' => 'Relevantnost: $1%',
'search-redirect' => '(preusmjeravanje $1)',
'search-section' => '(sekcija $1)',
@@ -1297,6 +1308,7 @@ PokuÅ¡ajte u VaÅ¡ upit ukljuÄiti prefiks ''all:'' da bi ste pretražili sav sad
'contextlines' => 'Linija po pogotku:',
'contextchars' => 'Karaktera konteksta po liniji:',
'stub-threshold' => 'Formatiranje <a href="#" class="stub">linkova stranica u zaÄetku</a> (bajtova):',
+'stub-threshold-disabled' => 'IskljuÄen/a',
'recentchangesdays' => 'Broj dana za prikaz u nedavnim izmjenama:',
'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
@@ -1330,6 +1342,7 @@ Ovdje su navedene neke nasumiÄno odabrane vrijednosti koje možete koristiti: $
'prefs-files' => 'Datoteke',
'prefs-custom-css' => 'Prilagođeni CSS',
'prefs-custom-js' => 'Prilagođeni JS',
+'prefs-common-css-js' => 'Dijeljeni CSS/JS za sve kože:',
'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.
Ovo se ne može vratiti unazad.',
'prefs-emailconfirm-label' => 'E-mail potvrda:',
@@ -1369,9 +1382,15 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'prefs-advancedrendering' => 'Napredne opcije',
'prefs-advancedsearchoptions' => 'Napredne opcije',
'prefs-advancedwatchlist' => 'Napredne opcije',
-'prefs-display' => 'Postavke izgleda',
+'prefs-displayrc' => 'Postavke izgleda',
+'prefs-displaysearchoptions' => 'Postavke izgleda',
+'prefs-displaywatchlist' => 'Postavke izgleda',
'prefs-diffs' => 'Razlike',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Izgleda valjano',
+'email-address-validity-invalid' => 'Neophodna valjana adresa!',
+
# User rights
'userrights' => 'Postavke korisniÄkih prava',
'userrights-lookup-user' => 'Menadžment korisniÄkih grupa',
@@ -1455,6 +1474,7 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'right-hideuser' => 'Blokiranje korisniÄkog imena, i njegovo sakrivanje od javnosti',
'right-ipblock-exempt' => 'Zaobilaženje IP blokada, autoblokada i blokada IP grupe',
'right-proxyunbannable' => 'Zaobilaženje automatskih blokada proxy-ja',
+'right-unblockself' => 'Deblokiranje samog sebe',
'right-protect' => 'Promjena nivoa zaštite i uređivanje zaštićenih stranica',
'right-editprotected' => 'Uređivanje zaštićenih stranica (bez povezanih zaštita)',
'right-editinterface' => 'UreÄ‘ivanje korisniÄkog interfejsa',
@@ -1477,7 +1497,6 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'right-siteadmin' => 'ZakljuÄavanje i otkljuÄavanje baze podataka',
'right-reset-passwords' => 'Resetuje Å¡ifre drugih korisnika',
'right-override-export-depth' => 'Izvoz stranica ukljuÄujući povezane stranice do dubine od 5 linkova',
-'right-versiondetail' => 'Pregledavanje proširenih informacija o verzijama softvera',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
# User rights log
@@ -1528,14 +1547,9 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'recentchanges-legend' => 'Postavke nedavnih izmjena',
'recentchangestext' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
'recentchanges-feed-description' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova stranica',
'recentchanges-label-newpage' => 'Ovom izmjenom se pravi nova stranica',
-'recentchanges-legend-minor' => '$1 - mala izmjena',
'recentchanges-label-minor' => 'Ovo je mala izmjena',
-'recentchanges-legend-bot' => '$1 - izmjena bota',
'recentchanges-label-bot' => 'Ova izmjenu je naÄinio bot',
-'recentchanges-legend-unpatrolled' => '$1 - nepatrolirana izmjena',
'recentchanges-label-unpatrolled' => 'Ova izmjena još nije patrolirana',
'rcnote' => "Ispod {{PLURAL:$1|je '''$1''' promjena|su '''$1''' zadnje promjene|su '''$1''' zadnjih promjena}} u {{PLURAL:$2|posljednjem '''$2''' danu|posljednja '''$2''' dana|posljednjih '''$2''' dana}}, od $4, $5.",
'rcnotefrom' => 'Ispod su izmjene od <b>$2</b> (do <b>$1</b> prikazano).',
@@ -1582,6 +1596,8 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
'upload_directory_missing' => 'Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.',
'upload_directory_read_only' => 'Folder za postavljanje ($1) na webserveru je postavljen samo za Äitanje.',
'uploaderror' => 'Greška pri slanju',
+'upload-recreate-warning' => "'''Upozorenje: Datoteka s tim imenom je obrisana ili premještena.'''
+Zapisnik brisanja i premještanja za ovu stranicu je dostupan ovdje na uvid:",
'uploadtext' => "Koristite formu ispod za postavljanje datoteka.
Da bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|zapisnik postavljanja]], a brisanja u [[Special:Log/delete|zapisnik brisanja]].
@@ -1616,6 +1632,17 @@ Molimo Vas da promijenite ime datoteke i pokušate da je ponovo postavite.',
'filetype-banned-type' => "'''\".\$1\"''' nije dopuštena vrsta datoteke.
{{PLURAL:\$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} \$2.",
'filetype-missing' => 'Datoteka nema ekstenziju (poput ".jpg").',
+'empty-file' => 'Datoteka koju ste poslali je bila prazna.',
+'file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
+'filename-tooshort' => 'Ime datoteke je prekratko.',
+'filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'verification-error' => 'Ova datoteka nije prošla provjeru.',
+'hookaborted' => 'Izmjena koji ste pokuÅ¡ali naÄiniti je obustavljena preko kuke proÅ¡irenja.',
+'illegal-filename' => 'Ime datoteke nije dopušteno.',
+'overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
+'unknown-error' => 'Desila se nepoznata greška.',
+'tmp-create-error' => 'Nije moguće napraviti privremenu datoteku.',
+'tmp-write-error' => 'Greška pri pisanju privremene datoteke.',
'large-file' => 'PreporuÄeno je da datoteke nisu veće od $1;
Ova datoteka je velika $2.',
'largefileserver' => 'Ova datoteka je veća nego što server dopušta.',
@@ -1642,13 +1669,14 @@ Ako i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošal
'fileexists-shared-forbidden' => 'Datoteka sa ovim imenom već postoji u zajedniÄkoj ostavi; molimo Vas da se vratite i poÅ¡aljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:',
'file-deleted-duplicate' => 'Datoteka koje je identiÄna ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego Å¡to nastavite sa njenim ponovnim postavljanjem.',
-'successfulupload' => 'Uspješno slanje',
'uploadwarning' => 'Upozorenje pri slanju',
'uploadwarning-text' => 'Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.',
'savefile' => 'SaÄuvaj datoteku',
'uploadedimage' => 'poslato "[[$1]]"',
'overwroteimage' => 'postavljena nova verzija datoteke "[[$1]]"',
'uploaddisabled' => 'Slanje fajlova je iskljuÄeno',
+'copyuploaddisabled' => 'Postavljanje putem URL nije omogućeno.',
+'uploadfromurl-queued' => 'VaÅ¡e postavljanje je na Äekanju.',
'uploaddisabledtext' => 'Postavljanje datoteka je onemogućeno.',
'php-uploaddisabledtext' => 'Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.',
'uploadscripted' => 'Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.',
@@ -1683,6 +1711,14 @@ JD # Jenoptik
MGP # Pentax
PICT # razni
#</pre> <!-- ostavite ovu liniju onakvom kakva jeste -->',
+'upload-success-subj' => 'Uspješno slanje',
+'upload-success-msg' => 'Vaša datoteka iz [$2] je uspješno postavljena. Dostupna je ovdje: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem pri postavljanju',
+'upload-failure-msg' => 'Nastao je problem s Vašim postavljanjem sa [$2]:
+
+$1',
+'upload-warning-subj' => 'Upozorenje pri slanju',
+'upload-warning-msg' => 'Nastao je problem sa vašim postavljanjem sa [$2]. Morate se vratiti na [[Special:Upload/stash/$1|formu za postavljanje]] kako biste riješili ovaj problem.',
'upload-proto-error' => 'Pogrešan protokol',
'upload-proto-error-text' => 'Postavljanje sa vanjske lokacije zahtjeva URL-ove koji poÄinju sa <code>http://</code> ili <code>ftp://</code>.',
@@ -1749,6 +1785,7 @@ Klikom na zaglavlje kolone možete promjeniti naÄin sortiranja.',
'listfiles_search_for' => 'Traži medije po imenu:',
'imgfile' => 'datoteka',
'listfiles' => 'Spisak slika',
+'listfiles_thumb' => 'Smanjeni pregled',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Naziv',
'listfiles_user' => 'Korisnik',
@@ -1863,8 +1900,8 @@ Prije brisanja provjerite da li druge stranice vode na te Å¡ablone.',
'statistics-edits' => 'Broj izmjena od kako je instalirana {{SITENAME}}',
'statistics-edits-average' => 'ProsjeÄno izmjena po stranici',
'statistics-views-total' => 'Ukupno pregleda',
+'statistics-views-total-desc' => 'Pregledi nepostojećih stranica i posebnih stranica nisu ukljuÄeni',
'statistics-views-peredit' => 'Pogleda po izmjeni',
-'statistics-jobqueue' => 'Dužina [http://www.mediawiki.org/wiki/Manual:Job_queue akcija na Äekanju]',
'statistics-users' => 'Registrovani [[Special:ListUsers|korisnici]]',
'statistics-users-active' => 'Aktivni korisnici',
'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
@@ -1877,9 +1914,9 @@ Po pravilu, one se trebaju povezati sa konkretnim Älankom.<br />
Stranica se smatra Ävorom, ukoliko koristi Å¡ablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage|Ävor stranica]]",
'doubleredirects' => 'Dvostruka preusmjerenja',
-'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.
+'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.
Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, Å¡to obiÄno daje "pravi" ciljni Älanak, na koji bi prvo preusmjerenje i trebalo da pokazuje.
-<s>Precrtane</s> stavke su riješene.',
+<del>Precrtane</del> stavke su riješene.',
'double-redirect-fixed-move' => '[[$1]] je premješten, sada je preusmjerenje na [[$2]]',
'double-redirect-fixer' => 'PopravljaÄ preusmjerenja',
@@ -1902,6 +1939,8 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
'nmembers' => '$1 {{PLURAL:$1|Älan|Älanova}}',
'nrevisions' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
'nviews' => '$1 {{PLURAL:$1|pregled|pregleda}}',
+'nimagelinks' => 'Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}',
+'ntransclusions' => 'koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}',
'specialpage-empty' => 'Nepostoje rezultati za ovaj izvještaj.',
'lonelypages' => 'SiroÄići',
'lonelypagestext' => 'Slijedeće stranice nemaju linkove na ostalim stranicama na ovoj {{SITENAME}}.',
@@ -2060,36 +2099,42 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
'listgrouprights-removegroup-self-all' => 'Može ukloniti sve grupe sa svog raÄuna',
# E-mail user
-'mailnologin' => 'Nema adrese za slanje',
-'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
+'mailnologin' => 'Nema adrese za slanje',
+'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]
da biste slali e-poštu drugim korisnicima.',
-'emailuser' => 'Pošalji e-poštu ovom korisniku',
-'emailpage' => 'Pošalji e-mail korisniku',
-'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
+'emailuser' => 'Pošalji e-poštu ovom korisniku',
+'emailpage' => 'Pošalji e-mail korisniku',
+'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
E-mail adresa koju ste unijeli u [[Special:Preferences|VaÅ¡im korisniÄkim postavkama]] će biti prikazana kao adresa poÅ¡iljaoca, tako da će primaoc poruke moći da Vam odgovori.',
-'usermailererror' => 'Objekat pošte je vratio grešku:',
-'defemailsubject' => '{{SITENAME}} e-pošta',
-'noemailtitle' => 'Nema adrese e-pošte',
-'noemailtext' => 'Ovaj korisnik nije naveo ispravnu adresu e-pošte.',
-'nowikiemailtitle' => 'E-mail nije dopušten',
-'nowikiemailtext' => 'Ovaj korisnik je odabrao da ne prima e-mail poštu od drugih korisnika.',
-'email-legend' => 'Slanje e-maila drugom {{SITENAME}} korisniku',
-'emailfrom' => 'Od:',
-'emailto' => 'Za:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'Poruka:',
-'emailsend' => 'Pošalji',
-'emailccme' => 'Pošalji mi kopiju moje poruke.',
-'emailccsubject' => 'Kopiraj Vašu poruku za $1: $2',
-'emailsent' => 'Poruka poslata',
-'emailsenttext' => 'Vaša poruka je poslata e-poštom.',
-'emailuserfooter' => 'Ovaj e-mail je poslao $1 korisniku $2 putem funkcije "Pošalji e-mail korisniku" sa {{SITENAME}}.',
+'usermailererror' => 'Objekat pošte je vratio grešku:',
+'defemailsubject' => '{{SITENAME}} e-pošta',
+'usermaildisabled' => 'KorisniÄki e-mail onemogućen',
+'usermaildisabledtext' => 'Ne možete poslati e-mail drugim korisnicima na ovoj wiki',
+'noemailtitle' => 'Nema adrese e-pošte',
+'noemailtext' => 'Ovaj korisnik nije naveo ispravnu adresu e-pošte.',
+'nowikiemailtitle' => 'E-mail nije dopušten',
+'nowikiemailtext' => 'Ovaj korisnik je odabrao da ne prima e-mail poštu od drugih korisnika.',
+'email-legend' => 'Slanje e-maila drugom {{SITENAME}} korisniku',
+'emailfrom' => 'Od:',
+'emailto' => 'Za:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'Poruka:',
+'emailsend' => 'Pošalji',
+'emailccme' => 'Pošalji mi kopiju moje poruke.',
+'emailccsubject' => 'Kopiraj Vašu poruku za $1: $2',
+'emailsent' => 'Poruka poslata',
+'emailsenttext' => 'Vaša poruka je poslata e-poštom.',
+'emailuserfooter' => 'Ovaj e-mail je poslao $1 korisniku $2 putem funkcije "Pošalji e-mail korisniku" sa {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Ostavljanje sistemske poruke.',
+'usermessage-editor' => 'Sistem za poruke',
# Watchlist
'watchlist' => 'Moji praćeni Älanci',
'mywatchlist' => 'Moji praćeni Älanci',
-'watchlistfor' => "(korisnika '''$1''')",
+'watchlistfor2' => 'Za $1 $2',
'nowatchlist' => 'Nemate niÅ¡ta na svom spisku praćenih Älanaka.',
'watchlistanontext' => 'Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.',
'watchnologin' => 'Niste prijavljeni',
@@ -2134,30 +2179,33 @@ Ako kasnije želite da uklonite stranicu sa vaÅ¡eg spiska praćenih Älanaka, kl
'enotif_anon_editor' => 'anonimni korisnik $1',
'enotif_body' => 'Poštovani $WATCHINGUSERNAME,
-{{SITENAME}} strana $PAGETITLE je bila $CHANGEDORCREATED $PAGEEDITDATE od strane $PAGEEDITOR,
-pogledajte $PAGETITLE_URL za trenutnu verziju.
+
+Stranica {{SITENAME}} sa naslovom $PAGETITLE je bila $CHANGEDORCREATED dana $PAGEEDITDATE od strane $PAGEEDITOR, pogledajte $PAGETITLE_URL za trenutnu reviziju.
$NEWPAGE
-Sažetak editora: $PAGESUMMARY $PAGEMINOREDIT
+Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
-Kontaktirajte editora:
-pošta: $PAGEEDITOR_EMAIL
+Kontaktirajte urednika:
+mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Neće biti drugih obavijeÅ¡tenja u sluÄaju daljih izmjena ukoliko ne posjetite ovu stranu.
-TakoÄ‘er možete da resetujete zastavice za obavijeÅ¡tenja za sve VaÅ¡e praćene stranice na vaÅ¡em spisku praćenih Älanaka.
+Neće biti drugih obavjeÅ¡tenja u sluÄaju daljnjih izmjena osima ako posjetite stranicu.
+Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.
- Vaš prijateljski {{SITENAME}} sistem obaviještavanja
+ Vaš prijateljski {{SITENAME}} sistem obavještavanja
--
-Da promjenite podeÅ¡avanja vezana za spisak praćenih Älanaka posjetite
+Za promjenu vaših postavki e-mail obavijesti, posjetite
+{{fullurl:{{#special:Preferences}}}}
+
+Za promjenu postavki vašeg praćenja, posjetite
{{fullurl:{{#special:Watchlist}}/edit}}
-Da obrišete stranicu iz Vašeg spiska praćenja posjetite
+Da obrišete stranicu sa vašeg spiska praćenja, posjetite
$UNWATCHURL
-Fidbek i dalja pomoć:
+Povratne informacije i daljnja pomoć:
{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
@@ -2210,7 +2258,10 @@ Posljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]
'revertpage-nouser' => 'Vraćene izmjene korisnika (korisniÄko ime uklonjeno) na posljednju reviziju koju je naÄinio [[User:$1|$1]]',
'rollback-success' => 'Poništene izmjene korisnika $1;
vraćeno na posljednju verziju koju je saÄuvao $2.',
-'sessionfailure' => "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+
+# Edit tokens
+'sessionfailure-title' => 'Greška u sesiji',
+'sessionfailure' => "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
# Protect
'protectlogpage' => 'Protokol zakljuÄavanja',
@@ -2342,18 +2393,22 @@ $1',
'month' => 'Od mjeseca (i ranije):',
'year' => 'Od godine (i ranije):',
-'sp-contributions-newbies' => 'Prikaži samo doprinose novih korisnika',
-'sp-contributions-newbies-sub' => 'Za nove korisnike',
-'sp-contributions-newbies-title' => 'Doprinosi novih korisnika',
-'sp-contributions-blocklog' => 'Evidencija blokiranja',
-'sp-contributions-deleted' => 'obrisani doprinosi korisnika',
-'sp-contributions-logs' => 'zapisnici',
-'sp-contributions-talk' => 'razgovor',
-'sp-contributions-userrights' => 'postavke korisniÄkih prava',
-'sp-contributions-blocked-notice' => 'Ovaj korisnik je trenutno blokiran. Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
-'sp-contributions-search' => 'Pretraga doprinosa',
-'sp-contributions-username' => 'IP adresa ili korisniÄko ime:',
-'sp-contributions-submit' => 'Traži',
+'sp-contributions-newbies' => 'Prikaži samo doprinose novih korisnika',
+'sp-contributions-newbies-sub' => 'Za nove korisnike',
+'sp-contributions-newbies-title' => 'Doprinosi novih korisnika',
+'sp-contributions-blocklog' => 'Evidencija blokiranja',
+'sp-contributions-deleted' => 'obrisani doprinosi korisnika',
+'sp-contributions-uploads' => 'postavljanja',
+'sp-contributions-logs' => 'zapisnici',
+'sp-contributions-talk' => 'razgovor',
+'sp-contributions-userrights' => 'postavke korisniÄkih prava',
+'sp-contributions-blocked-notice' => 'Ovaj korisnik je trenutno blokiran. Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
+'sp-contributions-blocked-notice-anon' => 'Ova IP adresa je trenutno blokirana.
+Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
+'sp-contributions-search' => 'Pretraga doprinosa',
+'sp-contributions-username' => 'IP adresa ili korisniÄko ime:',
+'sp-contributions-toponly' => 'Prikaži samo izmjene koje su posljednje revizije',
+'sp-contributions-submit' => 'Traži',
# What links here
'whatlinkshere' => 'Å ta je povezano ovdje',
@@ -2412,7 +2467,6 @@ $1',
'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
'ipb-unblock-addr' => 'Deblokiraj $1',
'ipb-unblock' => 'Deblokiraj korisniÄko ime ili IP adresu',
-'ipb-blocklist-addr' => 'Postojeće blokade za $1',
'ipb-blocklist' => 'Vidi postojeće blokade',
'ipb-blocklist-contribs' => 'Doprinosi za $1',
'unblockip' => 'Odblokiraj korisnika',
@@ -2487,6 +2541,8 @@ Međutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.',
Ne možete napraviti raÄun',
'cant-block-while-blocked' => 'Ne možete blokirati druge korisnike dok ste blokirani.',
'cant-see-hidden-user' => 'Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.',
+'ipbblocked' => 'Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani',
+'ipbnounblockself' => 'Nije Vam dopušteno da deblokirate samog sebe',
# Developer tools
'lockdb' => 'ZakljuÄajte bazu',
@@ -2533,6 +2589,17 @@ preusmjerite.
'''Pažnja!'''
Imajte na umu da preusmjeravanje popularnog Älanka može biti
drastiÄna i neoÄekivana promjena za korisnike.",
+'movepagetext-noredirectfixer' => "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.
+Stari naziv će postati preusmjerenje na novi naziv.
+Molimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].
+Vi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.
+
+Imajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.
+Ovo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.
+
+'''Pažnja!'''
+Imajte na umu da preusmjeravanje popularnog Älanka može biti
+drastiÄna i neoÄekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego Å¡to nastavite.",
'movepagetalktext' => "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''
*Ako premještate stranicu preko imenskih prostora,
*Neprazna stranica za razgovor već postoji pod novim imenom, ili
@@ -2589,6 +2656,7 @@ Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
'immobile-source-page' => 'Ova stranica se ne može premještati.',
'immobile-target-page' => 'Ne može se preusmjeriti na taj odredišni naslov.',
'imagenocrossnamespace' => 'Ne može se premjestiti datoteka u nedatoteÄni imenski prostor',
+'nonfile-cannot-move-to-file' => 'Ne mogu se premjestiti podaci u datoteÄni imenski prostor',
'imagetypemismatch' => 'Ekstenzija nove datoteke ne odgovara njenom tipu',
'imageinvalidfilename' => 'Ciljno ime datoteke nije valjano',
'fix-double-redirects' => 'Ažuriraj sva preusmjerenja koja vode ka originalnom naslovu',
@@ -2669,6 +2737,7 @@ SaÄuvajte je na VaÅ¡em raÄunaru i poÅ¡aljite ovdje.',
'importstart' => 'Uvoz stranica...',
'import-revision-count' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
'importnopages' => 'Nema stranica za uvoz.',
+'imported-log-entries' => '{{PLURAL:$1|Uvezena $1 stavka zapisnika|Uvezene $1 stavke zapisnika|Uvezeno $1 stavki zapisnika}}.',
'importfailed' => 'Uvoz nije uspjeo: $1',
'importunknownsource' => 'Nepoznat izvorni tip uvoza',
'importcantopen' => 'Ne može se otvoriti uvozna datoteka',
@@ -2765,6 +2834,8 @@ Nedostaje privremeni folder.',
'tooltip-rollback' => 'Brzo vraćanje izmjene(izmjena) ove stranice posljednjeg ureÄ‘ivaÄa jednim klikom.',
'tooltip-undo' => 'Vraća posljednju izmjenu i otvara formu za uređivanje u modu pregleda.
Dopušta unos razloga u sažetak.',
+'tooltip-preferences-save' => 'SaÄuvaj podeÅ¡avanja',
+'tooltip-summary' => 'Unesite kratki sažetak',
# Stylesheets
'common.css' => '/* CSS umetnut ovdje primijenit će se na sve skinove */',
@@ -2892,14 +2963,17 @@ $1',
'imagemaxsize' => "OgraniÄenje veliÄine slike:<br />''(za stranice opisa datoteke)''",
'thumbsize' => 'VeliÄina umanjenog prikaza:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|stranica|stranice|stranica}}',
-'file-info' => '(veliÄina datoteke: $1, MIME tip: $2)',
-'file-info-size' => '($1 × $2 piksela, veliÄina datoteke: $3, MIME tip: $4)',
+'file-info' => 'veliÄina datoteke: $1, MIME tip: $2',
+'file-info-size' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME tip: $4',
'file-nohires' => '<small>Veća rezolucija nije dostupna.</small>',
-'svg-long-desc' => '(SVG fajl, dozvoljeno $1 × $2 piksela, veliÄina fajla: $3)',
+'svg-long-desc' => 'SVG fajl, dozvoljeno $1 × $2 piksela, veliÄina fajla: $3',
'show-big-image' => 'Vidi sliku u punoj veliÄini (rezoluciji)',
'show-big-image-thumb' => '<small>VeliÄina ovoga prikaza: $1 × $2 piksela</small>',
'file-info-gif-looped' => 'stalno iznova',
'file-info-gif-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄice|sliÄica}}',
+'file-info-png-looped' => 'stalno iznova',
+'file-info-png-repeat' => 'pregledano $1 {{PLURAL:$1|put|puta}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄice|sliÄica}}',
# Special:NewFiles
'newimages' => 'Galerija novih slika',
@@ -3053,6 +3127,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
'exif-gpsareainformation' => 'Naziv GPS podruÄja',
'exif-gpsdatestamp' => 'GPS datum',
'exif-gpsdifferential' => 'GPS diferencijalna korekcija',
+'exif-objectname' => 'Kratki naslov',
# EXIF attributes
'exif-compression-1' => 'Nekompresovano',
@@ -3216,25 +3291,25 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
'limitall' => 'sve',
# E-mail address confirmation
-'confirmemail' => 'Potvrdite adresu e-pošte',
-'confirmemail_noemail' => 'Niste unijeli taÄnu e-mail adresu u VaÅ¡e [[Special:Preferences|korisniÄke postavke]].',
-'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu VaÅ¡e e-poÅ¡te prije nego Å¡to koristite mogućnosti e-poÅ¡te. Aktivirajte dugme ispod kako bi ste poslali poÅ¡tu za potvrdu na VaÅ¡u adresu. PoÅ¡ta ukljuÄuje link koji sadrži kod; uÄitajte link u VaÅ¡ preglednik da bi ste potvrdili da je adresa VaÅ¡e e-poÅ¡te validna.',
-'confirmemail_pending' => 'Konfirmacioni kod Vam je već poslan putem e-maila;
+'confirmemail' => 'Potvrdite adresu e-pošte',
+'confirmemail_noemail' => 'Niste unijeli taÄnu e-mail adresu u VaÅ¡e [[Special:Preferences|korisniÄke postavke]].',
+'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu VaÅ¡e e-poÅ¡te prije nego Å¡to koristite mogućnosti e-poÅ¡te. Aktivirajte dugme ispod kako bi ste poslali poÅ¡tu za potvrdu na VaÅ¡u adresu. PoÅ¡ta ukljuÄuje link koji sadrži kod; uÄitajte link u VaÅ¡ preglednik da bi ste potvrdili da je adresa VaÅ¡e e-poÅ¡te validna.',
+'confirmemail_pending' => 'Konfirmacioni kod Vam je već poslan putem e-maila;
ako ste nedavno otvorili VaÅ¡ raÄun, trebali bi priÄekati par minuta da poslana poÅ¡ta stigne, prije nego Å¡to ponovno zahtijevate novi kod.',
-'confirmemail_send' => 'Pošaljite kod za potvrdu',
-'confirmemail_sent' => 'E-pošta za potvrđivanje poslata.',
-'confirmemail_oncreate' => 'Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.
+'confirmemail_send' => 'Pošaljite kod za potvrdu',
+'confirmemail_sent' => 'E-pošta za potvrđivanje poslata.',
+'confirmemail_oncreate' => 'Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.
Taj kod nije neophodan za prijavljivanje, ali Vam ne potreban kako bi ste omogućili funkcije wikija zasnovane na e-mailu.',
-'confirmemail_sendfailed' => '{{SITENAME}} Vam ne može poslati poštu za potvrđivanje. Provjerite adresu zbog nepravilnih karaktera.
+'confirmemail_sendfailed' => '{{SITENAME}} Vam ne može poslati poštu za potvrđivanje. Provjerite adresu zbog nepravilnih karaktera.
Povratna pošta: $1',
-'confirmemail_invalid' => 'NetaÄan kod za potvrdu. Moguće je da je kod istekao.',
-'confirmemail_needlogin' => 'Morate $1 da bi ste potvrdili Vašu e-mail adresu.',
-'confirmemail_success' => 'Adresa vaše e-pošte je potvrđena. Možete sad da se prijavite i uživate u viki.',
-'confirmemail_loggedin' => 'Adresa Vaše e-pošte je potvrđena.',
-'confirmemail_error' => 'NeÅ¡to je poÅ¡lo po zlu prilikom saÄuvavanja vaÅ¡e potvrde.',
-'confirmemail_subject' => 'VikirijeÄnik adresa e-poÅ¡te za potvrÄ‘ivanje',
-'confirmemail_body' => 'Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog "$2" sa ovom adresom e-pošte na {{SITENAME}}.
+'confirmemail_invalid' => 'NetaÄan kod za potvrdu. Moguće je da je kod istekao.',
+'confirmemail_needlogin' => 'Morate $1 da bi ste potvrdili Vašu e-mail adresu.',
+'confirmemail_success' => 'Adresa vaše e-pošte je potvrđena. Možete sad da se prijavite i uživate u viki.',
+'confirmemail_loggedin' => 'Adresa Vaše e-pošte je potvrđena.',
+'confirmemail_error' => 'NeÅ¡to je poÅ¡lo po zlu prilikom saÄuvavanja vaÅ¡e potvrde.',
+'confirmemail_subject' => 'VikirijeÄnik adresa e-poÅ¡te za potvrÄ‘ivanje',
+'confirmemail_body' => 'Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog "$2" sa ovom adresom e-pošte na {{SITENAME}}.
Da potvrdite da ovaj nalog stvarno pripada vama i da aktivirate mogućnost e-pošte na {{SITENAME}}, otvorite ovaj link u vašem pregledniku:
@@ -3244,8 +3319,32 @@ Ako ovo niste vi, pratite ovaj link da prekinete prijavu:
$5
Ovaj kod za potvrdu će isteći u $4.',
-'confirmemail_invalidated' => 'Potvrda e-mail adrese otkazana',
-'invalidateemail' => 'Odustani od e-mail potvrde',
+'confirmemail_body_changed' => 'Neko, vjerovatno Vi, je sa IP adrese $1
+je promijenio adresu e-poÅ¡te raÄuna "$2" na ovu adresu za {{SITENAME}}.
+
+Da potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:
+
+$3
+
+Ako ovaj raÄun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-poÅ¡te:
+
+$5
+
+Ovaj kod za potvrdu će isteći u $4.',
+'confirmemail_body_set' => 'Neko, vjerovatno Vi, je sa IP adrese $1
+je postavio adresu e-poÅ¡te raÄuna "$2" na ovu adresu za {{SITENAME}}.
+
+Da potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:
+
+$3
+
+Ako ovaj raÄun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-poÅ¡te:
+
+$5
+
+Ovaj kod za potvrdu će isteći u $4.',
+'confirmemail_invalidated' => 'Potvrda e-mail adrese otkazana',
+'invalidateemail' => 'Odustani od e-mail potvrde',
# Scary transclusion
'scarytranscludedisabled' => '[MeÄ‘uwiki umetanje je iskljuÄeno]',
@@ -3288,6 +3387,7 @@ Molimo Vas da potvrdite da stvarno želite da ponovo napravite ovaj Älanak.",
'table_pager_first' => 'Prva stranica',
'table_pager_last' => 'Zadnja stranica',
'table_pager_limit' => 'Pokaži $1 stavki po stranici',
+'table_pager_limit_label' => 'Stavke po stranici:',
'table_pager_limit_submit' => 'Idi',
'table_pager_empty' => 'Bez rezultata',
@@ -3411,6 +3511,7 @@ TakoÄ‘er možete [[Special:Watchlist/edit|koristiti standardni ureÄ‘ivaÄ]].',
'version-specialpages' => 'Posebne stranice',
'version-parserhooks' => 'Kuke parsera',
'version-variables' => 'Promjenjive',
+'version-skins' => 'Kože',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'UpravljaÄi medije',
'version-hooks' => 'Kuke',
@@ -3422,6 +3523,13 @@ TakoÄ‘er možete [[Special:Watchlist/edit|koristiti standardni ureÄ‘ivaÄ]].',
'version-hook-subscribedby' => 'Pretplaćeno od',
'version-version' => '(Verzija $1)',
'version-license' => 'Licenca',
+'version-poweredby-credits' => "Ova wiki je zasnovana na '''[http://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
+'version-poweredby-others' => 'ostali',
+'version-license-info' => 'Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.
+
+Mediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, Äak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREÄENU SVRHU. Pogledajte GNU opću javnu licencu za viÅ¡e detalja.
+
+Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] zajedno s ovim programom, ako niste, piÅ¡ite Fondaciji Slobodnog Softvera na adresu Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je proÄitajte [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html online].',
'version-software' => 'Instalirani softver',
'version-software-product' => 'Proizvod',
'version-software-version' => 'Verzija',
@@ -3492,6 +3600,15 @@ Unesite ime datoteke bez "{{ns:file}}:" prefiksa.',
'tags-edit' => 'uređivanje',
'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
+# Special:ComparePages
+'comparepages' => 'Usporedi stranice',
+'compare-selector' => 'Usporedi ispravljanje stranica',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Ispravljanje 1',
+'compare-rev2' => 'Ispravljanje 2',
+'compare-submit' => 'Usporedi',
+
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
'dberr-problems' => 'Žao nam je! Ova stranica ima odreÄ‘ene tehniÄke poteÅ¡koće.',
@@ -3508,8 +3625,13 @@ Unesite ime datoteke bez "{{ns:file}}:" prefiksa.',
'htmlform-float-invalid' => 'Vrijednost koju ste unijeli nije broj.',
'htmlform-int-toolow' => 'Vrijednost koju ste naveli je ispod minimuma od $1',
'htmlform-int-toohigh' => 'Vrijednost koju ste naveli je iznad maksimuma od $1',
+'htmlform-required' => 'Ova vrijednost je obavezna',
'htmlform-submit' => 'Pošalji',
'htmlform-reset' => 'Vrati izmjene',
'htmlform-selectorother-other' => 'Ostalo',
+# SQLite database support
+'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
+'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
+
);
diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php
index fe5a316e..dc6819e2 100644
--- a/languages/messages/MessagesCa.php
+++ b/languages/messages/MessagesCa.php
@@ -11,6 +11,7 @@
* @author BroOk
* @author Cedric31
* @author Davidpar
+ * @author El libre
* @author Iradigalesc
* @author Jordi Roqué
* @author Juanpabl
@@ -61,7 +62,7 @@ $namespaceAliases = array(
'Imatge_Discussió' => NS_FILE_TALK,
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$dateFormats = array(
'mdy time' => 'H:i',
@@ -197,8 +198,7 @@ $messages = array(
'tog-editsection' => 'Activa la modificació de seccions mitjançant els enllaços [modifica]',
'tog-editsectiononrightclick' => "Habilita l'edició per seccions en clicar amb el botó dret sobre els títols de les seccions (cal JavaScript)",
'tog-showtoc' => 'Mostra la taula de continguts (per pàgines amb més de 3 seccions)',
-'tog-rememberpassword' => 'Recorda la contrasenya entre sessions',
-'tog-editwidth' => "Amplia el quadre d'edició per encabir tota la pantalla",
+'tog-rememberpassword' => 'Recorda la sessió al navegador (per un màxim de {{PLURAL:$1|dia|dies}})',
'tog-watchcreations' => 'Vigila les pàgines que he creat',
'tog-watchdefault' => 'Afegeix les pàgines que edito a la meua llista de seguiment',
'tog-watchmoves' => 'Afegeix les pàgines que reanomeni a la llista de seguiment',
@@ -344,31 +344,21 @@ $messages = array(
'faqpage' => 'Project:PMF',
# Vector skin
-'vector-action-addsection' => 'Nova secció',
-'vector-action-delete' => 'Esborra',
-'vector-action-move' => 'Reanomena',
-'vector-action-protect' => 'Protegeix',
-'vector-action-undelete' => 'Restaura',
-'vector-action-unprotect' => 'Desprotegeix',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Ajuda',
-'vector-namespace-image' => 'Fitxer',
-'vector-namespace-main' => 'Pàgina',
-'vector-namespace-media' => 'Pàgina de fitxer',
-'vector-namespace-mediawiki' => 'Missatge',
-'vector-namespace-project' => 'Pàgina del projecte',
-'vector-namespace-special' => 'Pàgina especial',
-'vector-namespace-talk' => 'Discussió',
-'vector-namespace-template' => 'Plantilla',
-'vector-namespace-user' => "Pàgina d'usuari",
-'vector-view-create' => 'Inicia',
-'vector-view-edit' => 'Modifica',
-'vector-view-history' => "Mostra l'historial",
-'vector-view-view' => 'Mostra',
-'vector-view-viewsource' => 'Mostra la font',
-'actions' => 'Accions',
-'namespaces' => 'Espais de noms',
-'variants' => 'Variants',
+'vector-action-addsection' => 'Nova secció',
+'vector-action-delete' => 'Esborra',
+'vector-action-move' => 'Reanomena',
+'vector-action-protect' => 'Protegeix',
+'vector-action-undelete' => 'Restaura',
+'vector-action-unprotect' => 'Desprotegeix',
+'vector-simplesearch-preference' => 'Habilitar suggeriments de recerca millorats (només aparença Vector)',
+'vector-view-create' => 'Inicia',
+'vector-view-edit' => 'Modifica',
+'vector-view-history' => "Mostra l'historial",
+'vector-view-view' => 'Mostra',
+'vector-view-viewsource' => 'Mostra la font',
+'actions' => 'Accions',
+'namespaces' => 'Espais de noms',
+'variants' => 'Variants',
'errorpagetitle' => 'Error',
'returnto' => 'Torna cap a $1.',
@@ -429,6 +419,9 @@ Massa usuaris estan tractant d'accedir a aquesta pàgina.
Per favor, esperau una mica abans de tornar a accedir a aquesta pàgina.
$1",
+'pool-timeout' => "Temps d'espera per al blocatge",
+'pool-queuefull' => 'La cua de treball és plena',
+'pool-errorunknown' => 'Error desconegut',
# 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' => 'Quant al projecte {{SITENAME}}',
@@ -592,7 +585,8 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
'yourname' => "Nom d'usuari",
'yourpassword' => 'Contrasenya',
'yourpasswordagain' => 'Escriviu una altra vegada la contrasenya',
-'remembermypassword' => 'Recorda la contrasenya entre sessions',
+'remembermypassword' => 'Recorda la contrasenya entre sessions (per un màxim de $1 {{PLURAL:$1|dia|dies}})',
+'securelogin-stick-https' => "Roman connectat via HTTPS desprès d'autenticar-se",
'yourdomainname' => 'El vostre domini',
'externaldberror' => "Hi ha hagut una fallida en el servidor d'autenticació externa de la base de dades i no teniu permís per a actualitzar el vostre compte d'accès extern.",
'login' => 'Inici de sessió',
@@ -609,6 +603,7 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
'gotaccount' => 'Ja teniu un compte? $1.',
'gotaccountlink' => 'Inicia una sessió',
'createaccountmail' => 'per correu electrònic',
+'createaccountreason' => 'Motiu:',
'badretype' => 'Les contrasenyes que heu introduït no coincideixen.',
'userexists' => 'El nom que heu entrat ja és en ús. Escolliu-ne un de diferent.',
'loginerror' => "Error d'inici de sessió",
@@ -627,6 +622,7 @@ Reviseu-ne l'ortografia (recordeu que es distingeixen les majúscules i minúscu
'wrongpasswordempty' => "La contrasenya que s'ha introduït estava en blanc. Torneu-ho a provar.",
'passwordtooshort' => "La contrasenya ha de tenir un mínim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
'password-name-match' => "La contrasenya ha de ser diferent al vostre nom d'usuari.",
+'password-login-forbidden' => "No és permès d'utilitzar aquest nom d'usuari i contrasenya.",
'mailmypassword' => "Envia'm una nova contrasenya per correu electrònic",
'passwordremindertitle' => 'Nova contrasenya temporal per al projecte {{SITENAME}}',
'passwordremindertext' => "Algú (vós mateix segurament, des de l'adreça l'IP $1) ha soŀlicitat que us enviéssim una nova contrasenya per a iniciar la sessió al projecte {{SITENAME}} ($4).
@@ -664,6 +660,9 @@ Si us plau, esperi abans de tornar-ho a intentar.",
'loginlanguagelabel' => 'Llengua: $1',
'suspicious-userlogout' => "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
+# E-mail sending
+'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
+
# Password reset dialog
'resetpass' => 'Canvia la contrasenya',
'resetpass_announce' => 'Heu iniciat la sessió amb un codi temporal enviat per correu electrònic. Per a finalitzar-la, heu de definir una nova contrasenya ací:',
@@ -715,9 +714,10 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
'showlivepreview' => 'Vista ràpida',
'showdiff' => 'Mostra els canvis',
'anoneditwarning' => "'''Avís:''' No esteu identificats amb un compte d'usuari. Es mostrarà la vostra adreça IP en l'historial d'aquesta pàgina.",
+'anonpreviewwarning' => "''No us heu identificat amb un compte d'usuari. La vostra adreça IP quedarà registrada a l'historial d'aquesta pàgina.''",
'missingsummary' => "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
'missingcommenttext' => 'Introduïu un comentari a continuació.',
-'missingcommentheader' => "'''Recordatori:''' No heu proporcionat un assumpte/encapçalament per al comentari. Si cliqueu al botó Torna a desar, la vostra contribució se desarà sense cap.",
+'missingcommentheader' => "'''Recordatori:''' No heu proporcionat un assumpte/encapçalament per al comentari. Si cliqueu de nou al botó \"{{int:savearticle}}\", la vostra contribució se desarà sense cap.",
'summary-preview' => 'Previsualització del resum:',
'subject-preview' => 'Previsualització de tema/capçalera:',
'blockedtitle' => "L'usuari està blocat",
@@ -787,7 +787,11 @@ Per més detalls, la darrera entrada del registre es mostra a continuació:",
'usercsspreview' => "'''Recordeu que esteu previsualitzant el vostre CSS d'usuari.'''
'''Encara no s'ha desat!'''",
'userjspreview' => "'''Recordeu que només estau provant/previsualitzant el vostre JavaScript, encara no ho heu desat!'''",
-'userinvalidcssjstitle' => "'''Atenció:''' No existeix l'aparença «$1». Recordeu que les subpàgines personalitzades amb extensions .css i .js utilitzen el títol en minúscules, per exemple, {{ns:user}}:NOM/monobook.css no és el mateix que {{ns:user}}:NOM/Monobook.css.",
+'sitecsspreview' => "'''Adoneu-vos que esteu veient una vista prèvia d'aquest full d'estil CSS.'''
+'''No n'hi ha estat encara gravada!'''",
+'sitejspreview' => "'''Adoneu-vos que esteu veient una vista prèvia d'aquest codi Javascript.'''
+'''No n'hi ha estat encara gravat!'''",
+'userinvalidcssjstitle' => "'''Atenció:''' No existeix l'aparença «$1». Recordeu que les subpàgines personalitzades amb extensions .css i .js utilitzen el títol en minúscules, per exemple, {{ns:user}}:NOM/vector.css no és el mateix que {{ns:user}}:NOM/Vector.css.",
'updated' => '(Actualitzat)',
'note' => "'''Nota:'''",
'previewnote' => "'''Açò només és una previsualització, els canvis de la qual encara no s'han desat!'''",
@@ -823,7 +827,6 @@ A més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bÃ
'copyrightwarning2' => "Si us plau, tingueu en compte que totes les contribucions al projecte {{SITENAME}} poden ser corregides, alterades o esborrades per altres usuaris. Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />
A més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o altres recursos lliures similars (consulteu $1 per a més detalls).
'''No feu servir textos amb drets d'autor sense permís!'''",
-'longpagewarning' => "'''ATENCIÓ: Aquesta pàgina fa $1 kB; hi ha navegadors que poden presentar problemes editant pàgines que s'acostin o sobrepassin els 32 kB. Intenteu, si és possible, dividir la pàgina en seccions més petites.'''",
'longpageerror' => "'''ERROR: El text que heu introduït és de $1 kB i sobrepassa el màxim permès de $2 kB. Per tant, no es desarà.'''",
'readonlywarning' => "'''ADVERTÈNCIA: La base de dades està tancada per manteniment
i no podeu desar les vostres contribucions en aquests moments. Podeu retallar i enganxar el codi
@@ -1001,6 +1004,8 @@ $1",
'logdelete-failure' => "'''No s'ha pogut establir la visibilitat del registre:'''
$1",
'revdel-restore' => "Canvia'n la visibilitat",
+'revdel-restore-deleted' => 'revisions esborrades',
+'revdel-restore-visible' => 'revisions visibles',
'pagehist' => 'Historial',
'deletedhist' => "Historial d'esborrat",
'revdelete-content' => 'el contingut',
@@ -1069,11 +1074,13 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
# Diffs
'history-title' => 'Historial de versions de «$1»',
'difference' => '(Diferència entre revisions)',
+'difference-multipage' => '(Diferència entre pàgines)',
'lineno' => 'Línia $1:',
'compareselectedversions' => 'Compara les versions seleccionades',
'showhideselectedversions' => 'Mostra/oculta les versions seleccionades',
'editundo' => 'desfés',
-'diff-multi' => '(Hi ha {{PLURAL:$1|una revisió intermèdia|$1 revisions intermèdies}})',
+'diff-multi' => '({{PLURAL:$1|Hi ha una revisió intermèdia |Hi ha $1 revisions intermèdies}} sense mostrar fetes per {{PLURAL:$2|un usuari|$2 usuaris}})',
+'diff-multi-manyusers' => "({{PLURAL:$1|Hi ha una revisió intermèdia|Hi ha $1 revisions intermèdies}} sense mostrar fetes per més {{PLURAL:$2|d'un usuari|de $2 usuaris}})",
# Search results
'searchresults' => 'Resultats de la cerca',
@@ -1108,6 +1115,7 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
'searchprofile-everything-tooltip' => "Cerca tot tipus de contingut (s'hi inclouen pàgines de discussió)",
'searchprofile-advanced-tooltip' => 'Cerca als espais de noms predefinits',
'search-result-size' => '$1 ({{PLURAL:$2|1 paraula|$2 paraules}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membre|$1 membres}} ({{PLURAL:$2|1 subcategoria|$2 subcategories}}, {{PLURAL:$3|1 fitxer|$3 fitxers}})',
'search-result-score' => 'Rellevància: $1%',
'search-redirect' => '(redirigit des de $1)',
'search-section' => '(secció $1)',
@@ -1182,6 +1190,7 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
'contextlines' => 'Línies a mostrar per resultat',
'contextchars' => 'Caràcters de context per línia',
'stub-threshold' => 'Límit per a formatar l\'enllaç com <a href="#" class="stub">esborrany</a> (en octets):',
+'stub-threshold-disabled' => 'Deshabilitat',
'recentchangesdays' => 'Dies a mostrar en els canvis recents:',
'recentchangesdays-max' => '(màxim $1 {{PLURAL:$1|dia|dies}})',
'recentchangescount' => "Nombre d'edicions a mostrar per defecte:",
@@ -1215,6 +1224,7 @@ A continuació es mostra un valor generat de forma aleatòria que podeu fer serv
'prefs-files' => 'Fitxers',
'prefs-custom-css' => 'CSS personalitzat',
'prefs-custom-js' => 'JS personalitzat',
+'prefs-common-css-js' => 'CSS/JS compartit per tots els skins:',
'prefs-reset-intro' => 'Podeu usar aquesta pàgina per a restablir les vostres preferències als valors per defecte.
No es podrà desfer el canvi.',
'prefs-emailconfirm-label' => 'Confirmació de correu electrònic:',
@@ -1252,9 +1262,15 @@ També podeu contactar amb altres usuaris a través de la vostra pàgina d'usuar
'prefs-advancedrendering' => 'Opcions avançades',
'prefs-advancedsearchoptions' => 'Opcions avançades',
'prefs-advancedwatchlist' => 'Opcions avançades',
-'prefs-display' => "Opcions d'aparença",
+'prefs-displayrc' => "Opcions d'aparença",
+'prefs-displaysearchoptions' => 'Opcions de visualització',
+'prefs-displaywatchlist' => 'Opcions de visualització',
'prefs-diffs' => 'Difs',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "L'adreça de correu electrònic sembla vàlida",
+'email-address-validity-invalid' => 'Escriviu una adreça vàlida de correu electrònic',
+
# User rights
'userrights' => "Gestió dels permisos d'usuari",
'userrights-lookup-user' => "Gestiona els grups d'usuari",
@@ -1338,6 +1354,7 @@ També podeu contactar amb altres usuaris a través de la vostra pàgina d'usuar
'right-hideuser' => "Blocar un nom d'usuari amagant-lo del públic",
'right-ipblock-exempt' => "Evitar blocatges d'IP, de rang i automàtics",
'right-proxyunbannable' => 'Evitar els blocatges automàtics a proxies',
+'right-unblockself' => 'Desblocar-se a si mateixos',
'right-protect' => 'Canviar el nivell de protecció i modificar pàgines protegides',
'right-editprotected' => 'Editar pàgines protegides (sense protecció de cascada)',
'right-editinterface' => "Editar la interfície d'usuari",
@@ -1360,7 +1377,6 @@ També podeu contactar amb altres usuaris a través de la vostra pàgina d'usuar
'right-siteadmin' => 'Blocar i desblocar la base de dades',
'right-reset-passwords' => "Reiniciar la contrasenya d'altres usuaris",
'right-override-export-depth' => 'Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5',
-'right-versiondetail' => 'Veure la informació addicional de la versió del programari',
'right-sendemail' => 'Enviar missatges de correu electrònic a altres usuaris',
# User rights log
@@ -1411,14 +1427,9 @@ També podeu contactar amb altres usuaris a través de la vostra pàgina d'usuar
'recentchanges-legend' => 'Opcions de canvis recents',
'recentchangestext' => 'Seguiu els canvis recents del projecte {{SITENAME}} en aquesta pàgina.',
'recentchanges-feed-description' => 'Segueix en aquest canal els canvis més recents del wiki.',
-'recentchanges-label-legend' => 'Llegenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova pàgina',
'recentchanges-label-newpage' => 'Aquesta modificació inicià una pàgina',
-'recentchanges-legend-minor' => '$1 - modificació menor',
'recentchanges-label-minor' => 'Aquesta és una modificació menor',
-'recentchanges-legend-bot' => "$1 - modificació d'un bot",
'recentchanges-label-bot' => 'Aquesta modificació fou feta per un bot',
-'recentchanges-legend-unpatrolled' => '$1 - modificació sense patrullar',
'recentchanges-label-unpatrolled' => 'Aquesta modificació encara no ha estat patrullada',
'rcnote' => 'A continuació hi ha {{PLURAL:$1|el darrer canvi|els darrers <strong>$1</strong> canvis}} en {{PLURAL:$2|el darrer dia|els darrers <strong>$2</strong> dies}}, actualitzats a les $5 del $4.',
'rcnotefrom' => 'A sota hi ha els canvis des de <b>$2</b> (es mostren fins <b>$1</b>).',
@@ -1466,6 +1477,9 @@ per a penjar-hi fitxers.",
'upload_directory_missing' => "No s'ha trobat el directori de càrrega ($1) i tampoc no ha pogut ser creat pel servidor web.",
'upload_directory_read_only' => 'El servidor web no pot escriure al directori de càrrega ($1)',
'uploaderror' => "S'ha produït un error en l'intent de carregar",
+'upload-recreate-warning' => "'''Atenció: S'ha eliminat o reanomenat un fitxer amb aquest mateix nom.'''
+
+A continuació es mostren els registres de supressió i reanomenament d'aquesta pàgina:",
'uploadtext' => "Feu servir el formulari de sota per a carregar fitxers.
Per a visualitzar o cercar fitxers que s'hagen carregat prèviament, aneu a la [[Special:FileList|llista de fitxers carregats]]. Les càrregues es registren en el [[Special:Log/upload|registre de càrregues]] i els fitxers esborrats en el [[Special:Log/delete|registre d'esborrats]].
@@ -1498,6 +1512,17 @@ Vegeu la [[Special:NewFiles|galeria de nous fitxers]] per a una presentació mé
'filetype-unwanted-type' => "Els fitxers del tipus «'''.$1'''» no són desitjats. {{PLURAL:$3|Es prefereix el tipus de fitxer|Els tipus de fitxer preferits són}} $2.",
'filetype-banned-type' => "Els fitxers del tipus «'''.$1'''» no estan permesos. {{PLURAL:$3|Només s'admeten els fitxers del tipus|Els tipus de fitxer permesos són}} $2.",
'filetype-missing' => 'El fitxer no té extensió (com ara «.jpg»).',
+'empty-file' => 'El fitxer que heu tramès està buit.',
+'file-too-large' => 'El fitxer que heu tramès és massa gran.',
+'filename-tooshort' => 'El nom del fitxer és massa curt.',
+'filetype-banned' => 'Aquest tipus de fitxer està prohibit.',
+'verification-error' => 'Aquest fitxer no ha passat la verificació de fitxers.',
+'hookaborted' => "La modificació que vau tractar de fer ha estat canceŀlada per un lligam d'extensió.",
+'illegal-filename' => 'El nom del fitxer no està permès.',
+'overwrite' => 'No es permet sobreescriure un fitxer existent.',
+'unknown-error' => "S'ha produït un error desconegut.",
+'tmp-create-error' => "No s'ha pogut crear el fitxer temporal.",
+'tmp-write-error' => 'Error en escriure el fitxer temporal.',
'large-file' => 'Els fitxers importants no haurien de ser més grans de $1; aquest fitxer ocupa $2.',
'largefileserver' => 'Aquest fitxer és més gran del que el servidor permet.',
'emptyfile' => 'El fitxer que heu carregat sembla estar buit.
@@ -1523,13 +1548,14 @@ Si us plau, torneu enrere i carregueu aquest fitxer sota un altre nom. [[File:$1
Si us plau, si encara desitgeu carregar el vostre fitxer, torneu enrera i carregueu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Aquest fitxer és un duplicat {{PLURAL:$1|del fitxer |dels següents fitxers:}}',
'file-deleted-duplicate' => "Un fitxer idèntic a aquest ([[:$1]]) ha estat esborrat amb anterioritat. Hauríeu de comprovar el registre d'esborrat del fitxer abans de tornar-lo a carregar.",
-'successfulupload' => "El fitxer s'ha carregat amb èxit",
'uploadwarning' => 'Avís de càrrega',
'uploadwarning-text' => 'Modifiqueu la descripció de la imatge i torneu a intentar-ho.',
'savefile' => 'Desa el fitxer',
'uploadedimage' => 'ha carregat [[$1]]',
'overwroteimage' => 'ha carregat una nova versió de «[[$1]]»',
'uploaddisabled' => "S'ha inhabilitat la càrrega",
+'copyuploaddisabled' => 'Càrrega per URL deshabilitada.',
+'uploadfromurl-queued' => "S'ha encuat la vostra càrrega.",
'uploaddisabledtext' => "S'ha inhabilitat la càrrega de fitxers.",
'php-uploaddisabledtext' => 'La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.',
'uploadscripted' => 'Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.',
@@ -1548,6 +1574,14 @@ Si us plau, si encara desitgeu carregar el vostre fitxer, torneu enrera i carreg
Hauríeu de considerar si és realment adequat continuar carregant aquest fitxer, perquè potser també acaba eliminat.
A continuació teniu el registre d'eliminació per a que pugueu comprovar els motius que van portar a la seua eliminació:",
'filename-bad-prefix' => "El nom del fitxer que esteu penjant comença amb '''«$1»''', que és un nom no descriptiu que les càmeres digitals normalment assignen de forma automàtica. Trieu un de més descriptiu per al vostre fitxer.",
+'upload-success-subj' => "El fitxer s'ha carregat amb èxit",
+'upload-success-msg' => 'El material carregat de [$2] està disponible ací: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema en la càrrega',
+'upload-failure-msg' => 'Hi ha hagut un problema amb la vostra càrrega des de [$2]:
+
+$1',
+'upload-warning-subj' => 'Avís de càrrega',
+'upload-warning-msg' => 'Hi ha hagut un problema amb la teva càrrega de [$2]. Pots tornar a [[Special:Upload/stash/$1|formulari de càrrega]] per corregir aquest problema.',
'upload-proto-error' => 'El protocol és incorrecte',
'upload-proto-error-text' => 'Per a les càrregues remotes cal que els URL comencin amb <code>http://</code> o <code>ftp://</code>.',
@@ -1608,6 +1642,7 @@ Clicant al capdamunt de les columnes podeu canviar-ne l'ordenació.",
'listfiles_search_for' => "Cerca el nom d'un fitxer de medis:",
'imgfile' => 'fitxer',
'listfiles' => 'Llista de fitxers',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nom',
'listfiles_user' => 'Usuari',
@@ -1720,8 +1755,8 @@ La descripció de la seva [$2 pàgina de descripció] es mostra a continuació.'
'statistics-edits' => 'Edicions en pàgines des que el projecte {{SITENAME}} fou instaŀlat',
'statistics-edits-average' => 'Edicions per pàgina de mitjana',
'statistics-views-total' => 'Visualitzacions totals',
+'statistics-views-total-desc' => "No hom inclou l'accès a pàgines inexistents o pàgines especials",
'statistics-views-peredit' => 'Visualitzacions per modificació',
-'statistics-jobqueue' => 'Longitud de la [http://www.mediawiki.org/wiki/Manual:Job_queue cua de treballs]',
'statistics-users' => '[[Special:ListUsers|Usuaris]] registrats',
'statistics-users-active' => 'Usuaris actius',
'statistics-users-active-desc' => "Usuaris que han dut a terme alguna acció en {{PLURAL:$1|l'últim dia|els últims $1 dies}}",
@@ -1736,7 +1771,7 @@ Una pàgina es tracta com de desambiguació si utilitza una plantilla que està
'doubleredirects' => 'Redireccions dobles',
'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
Cada fila conté enllaços a la primera i segona redireccions, així com el destí de la segona redirecció, què generalment és la pàgina destí "real", a la què hauria d\'apuntar la primera redirecció.
-Les entrades <s>ratllades</s> s\'han resolt.',
+Les entrades <del>ratllades</del> s\'han resolt.',
'double-redirect-fixed-move' => "S'ha reanomenat [[$1]], ara és una redirecció a [[$2]]",
'double-redirect-fixer' => 'Supressor de dobles redireccions',
@@ -1759,6 +1794,8 @@ Les entrades <s>ratllades</s> s\'han resolt.',
'nmembers' => '$1 {{PLURAL:$1|membre|membres}}',
'nrevisions' => '$1 {{PLURAL:$1|revisió|revisions}}',
'nviews' => '$1 {{PLURAL:$1|visita|visites}}',
+'nimagelinks' => "S'utilitza en {{PLURAL:$1|una pàgina|$1 pàgines}}",
+'ntransclusions' => 'utilitzada en {{PLURAL:$1|una pàgina|$1 pàgines}}',
'specialpage-empty' => 'Aquesta pàgina és buida.',
'lonelypages' => 'Pàgines òrfenes',
'lonelypagestext' => "Les següents pàgines no s'enllacen ni s'inclouen en cap altra pàgina del projecte {{SITENAME}}.",
@@ -1914,36 +1951,42 @@ Pot ser que hi hagi més informació sobre drets individuals [[{{MediaWiki:Listg
'listgrouprights-removegroup-self-all' => 'Abandona tots els grups',
# E-mail user
-'mailnologin' => "No enviïs l'adreça",
-'mailnologintext' => "Heu d'haver [[Special:UserLogin|entrat]]
+'mailnologin' => "No enviïs l'adreça",
+'mailnologintext' => "Heu d'haver [[Special:UserLogin|entrat]]
i tenir una direcció electrònica vàlida en les vostres [[Special:Preferences|preferències]]
per enviar un correu electrònic a altres usuaris.",
-'emailuser' => 'Envia un missatge de correu electrònic a aquest usuari',
-'emailpage' => 'Correu electrònic a usuari',
-'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a aquest usuari.
+'emailuser' => 'Envia un missatge de correu electrònic a aquest usuari',
+'emailpage' => 'Correu electrònic a usuari',
+'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a aquest usuari.
L'adreça electrònica que heu entrat en [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
-'usermailererror' => "L'objecte de correu ha retornat un error:",
-'defemailsubject' => 'Adreça correl de {{SITENAME}}',
-'noemailtitle' => 'No hi ha cap adreça electrònica',
-'noemailtext' => 'Aquest usuari no ha especificat una adreça electrònica vàlida.',
-'nowikiemailtitle' => 'No es permet el correu electrònic',
-'nowikiemailtext' => "Aquest usuari ha escollit no rebre missatges electrònics d'altres usuaris.",
-'email-legend' => 'Enviar un correu electrònic a un altre usuari de {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'Per a:',
-'emailsubject' => 'Assumpte:',
-'emailmessage' => 'Missatge:',
-'emailsend' => 'Envia',
-'emailccme' => "Envia'm una còpia del meu missatge.",
-'emailccsubject' => 'Còpia del vostre missatge a $1: $2',
-'emailsent' => 'Correu electrònic enviat',
-'emailsenttext' => 'El vostre correu electrònic ha estat enviat.',
-'emailuserfooter' => "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «e-mail» del projecte {{SITENAME}}.",
+'usermailererror' => "L'objecte de correu ha retornat un error:",
+'defemailsubject' => 'Adreça correl de {{SITENAME}}',
+'usermaildisabled' => "Correu electrònic d'usuaris deshabilitat",
+'usermaildisabledtext' => 'No podeu enviar correus electrònics a altres usuaris en aquest wiki',
+'noemailtitle' => 'No hi ha cap adreça electrònica',
+'noemailtext' => 'Aquest usuari no ha especificat una adreça electrònica vàlida.',
+'nowikiemailtitle' => 'No es permet el correu electrònic',
+'nowikiemailtext' => "Aquest usuari ha escollit no rebre missatges electrònics d'altres usuaris.",
+'email-legend' => 'Enviar un correu electrònic a un altre usuari de {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'Per a:',
+'emailsubject' => 'Assumpte:',
+'emailmessage' => 'Missatge:',
+'emailsend' => 'Envia',
+'emailccme' => "Envia'm una còpia del meu missatge.",
+'emailccsubject' => 'Còpia del vostre missatge a $1: $2',
+'emailsent' => 'Correu electrònic enviat',
+'emailsenttext' => 'El vostre correu electrònic ha estat enviat.',
+'emailuserfooter' => "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «e-mail» del projecte {{SITENAME}}.",
+
+# User Messenger
+'usermessage-summary' => 'Deixant missatges de sistema.',
+'usermessage-editor' => 'Missatger del sistema',
# Watchlist
'watchlist' => 'Llista de seguiment',
'mywatchlist' => 'Llista de seguiment',
-'watchlistfor' => "(per a '''$1''')",
+'watchlistfor2' => 'Per $1 $2',
'nowatchlist' => 'No teniu cap element en la vostra llista de seguiment.',
'watchlistanontext' => 'Premeu $1 per a visualitzar o modificar elements de la vostra llista de seguiment.',
'watchnologin' => 'No heu iniciat la sessió',
@@ -2063,7 +2106,10 @@ La darrera modificació ha estat feta per l'usuari [[User:$3|$3]] ([[User talk:$
'revertpage' => "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]). S'ha recuperat la darrera versió de l'usuari [[User:$1|$1]]",
'revertpage-nouser' => "Desfetes les edicions de (nom d'usuari eliminat) a l'última revisió feta per [[User:$1|$1]]",
'rollback-success' => "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
-'sessionfailure' => "Sembla que hi ha problema amb la vostra sessió. Aquesta acció ha estat anuŀlada en prevenció de pirateig de sessió. Si us plau, pitgeu «Torna», i recarregueu la pàgina des d'on veniu, després intenteu-ho de nou.",
+
+# Edit tokens
+'sessionfailure-title' => 'Error de sessió',
+'sessionfailure' => "Sembla que hi ha problema amb la vostra sessió. Aquesta acció ha estat anuŀlada en prevenció de pirateig de sessió. Si us plau, pitgeu «Torna», i recarregueu la pàgina des d'on veniu, després intenteu-ho de nou.",
# Protect
'protectlogpage' => 'Registre de protecció',
@@ -2195,19 +2241,23 @@ $1",
'month' => 'Mes (i anteriors):',
'year' => 'Any (i anteriors):',
-'sp-contributions-newbies' => 'Mostra les contribucions dels usuaris novells',
-'sp-contributions-newbies-sub' => 'Per a novells',
-'sp-contributions-newbies-title' => "Contribucions dels comptes d'usuari més nous",
-'sp-contributions-blocklog' => 'Registre de bloquejos',
-'sp-contributions-deleted' => "contribucions d'usuari esborrades",
-'sp-contributions-logs' => 'registres',
-'sp-contributions-talk' => 'discussió',
-'sp-contributions-userrights' => "gestió de drets d'usuari",
-'sp-contributions-blocked-notice' => "En aquests moments, aquest compte d'usuari es troba blocat.
+'sp-contributions-newbies' => 'Mostra les contribucions dels usuaris novells',
+'sp-contributions-newbies-sub' => 'Per a novells',
+'sp-contributions-newbies-title' => "Contribucions dels comptes d'usuari més nous",
+'sp-contributions-blocklog' => 'Registre de bloquejos',
+'sp-contributions-deleted' => "contribucions d'usuari esborrades",
+'sp-contributions-uploads' => 'pujades',
+'sp-contributions-logs' => 'registres',
+'sp-contributions-talk' => 'discussió',
+'sp-contributions-userrights' => "gestió de drets d'usuari",
+'sp-contributions-blocked-notice' => "En aquests moments, aquest compte d'usuari es troba blocat.
Per més detalls, la última entrada del registre es mostra a continuació:",
-'sp-contributions-search' => 'Cerca les contribucions',
-'sp-contributions-username' => "Adreça IP o nom d'usuari:",
-'sp-contributions-submit' => 'Cerca',
+'sp-contributions-blocked-notice-anon' => 'En aquests moments, aquesta adreça IP es troba blocada.
+Per més detalls, la última entrada del registre es mostra a continuació:',
+'sp-contributions-search' => 'Cerca les contribucions',
+'sp-contributions-username' => "Adreça IP o nom d'usuari:",
+'sp-contributions-toponly' => 'Mostra només revisions superiors',
+'sp-contributions-submit' => 'Cerca',
# What links here
'whatlinkshere' => 'Què hi enllaça',
@@ -2271,7 +2321,6 @@ quines pàgines en concret estan sent vandalitzades).",
'ipb-edit-dropdown' => 'Edita les raons per a blocar',
'ipb-unblock-addr' => 'Desbloca $1',
'ipb-unblock' => 'Desbloca un usuari o una adreça IP',
-'ipb-blocklist-addr' => 'Bloquejos existents per $1',
'ipb-blocklist' => 'Llista els bloquejos existents',
'ipb-blocklist-contribs' => 'Contribucions de $1',
'unblockip' => "Desbloca l'usuari",
@@ -2342,6 +2391,8 @@ L'usuari $1 ja està blocat. Voleu canviar-ne els paràmetres del blocatge?",
'sorbs_create_account_reason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
'cant-block-while-blocked' => 'No podeu blocar altres usuaris quan esteu bloquejat.',
'cant-see-hidden-user' => "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
+'ipbblocked' => 'No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.',
+'ipbnounblockself' => 'No teniu permís per a treure el vostre bloqueig',
# Developer tools
'lockdb' => 'Bloca la base de dades',
@@ -2379,6 +2430,17 @@ Això significa que podeu reanomenar de nou una pàgina al seu títol original s
'''ADVERTÈNCIA!'''
Açò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; assegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
+'movepagetext-noredirectfixer' => "El títol anterior es convertirà en un redireccionament al nou títol.
+
+Assegureu-vos de verificar els redireccionaments [[Special:DoubleRedirects|doble]]s i els [[Special:BrokenRedirects|trencat]]s.
+
+Sigueu responsable de fer que els enllaços continuen apuntant cap a on se suposa que han d'anar.
+
+Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou proposat, tret del cas que la pàgina és buida o no n'hi ha un historial de redireccionaments.
+
+Això significa que si reanomeneu per equivocació una pàgina amb el seu nom anterior no ho podreu fer, ja que no es pot sobreescriure una pàgina existent.
+
+'''Avís:''' Això pot ser un canvi dràstic i inesperat per una pàgina popular; si us plau, assegureu-vos que sabeu el que féu abans de continuar.",
'movepagetalktext' => "La pàgina de discussió associada, si existeix, serà traslladada automàticament '''tret dels següents casos''':
* Ja hi existeix una pàgina de discussió no buida amb el nou nom, o si
* la opció de davall es troba desactivada
@@ -2437,6 +2499,7 @@ La pàgina de destinació, «[[:$1]]», ja existeix. Voleu eliminar-la per a fer
'immobile-source-page' => 'Aquesta pàgina no es pot moure.',
'immobile-target-page' => 'No es pot moure cap a una destinació amb aquest títol.',
'imagenocrossnamespace' => 'No es pot moure la imatge a un espai de noms on no li correspon',
+'nonfile-cannot-move-to-file' => 'No es pot moure la imatge a un espai de noms on no li correspon',
'imagetypemismatch' => 'La nova extensió de fitxer no coincideix amb el seu tipus',
'imageinvalidfilename' => 'El nom de fitxer indicat no és vàlid',
'fix-double-redirects' => "Actualitza també les redireccions que apuntin a l'article original",
@@ -2514,6 +2577,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
'importstart' => "S'estan important pàgines...",
'import-revision-count' => '$1 {{PLURAL:$1|revisió|revisions}}',
'importnopages' => 'No hi ha cap pàgina per importar.',
+'imported-log-entries' => "{{PLURAL:$1|S'ha importat una entrada del registre|S'han importat $1 entrades del registre}}.",
'importfailed' => 'La importació ha fallat: $1',
'importunknownsource' => "No es reconeix el tipus de la font d'importació",
'importcantopen' => "No ha estat possible d'obrir el fitxer a importar",
@@ -2607,6 +2671,8 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
'tooltip-rollback' => "«Rollback» reverteix les edicions del darrer contribuïdor d'aquesta pàgina en un clic.",
'tooltip-undo' => '«Desfés» reverteix aquesta modificació i obre un formulari de previsualització.
Permet afegir un motiu al resum.',
+'tooltip-preferences-save' => 'Desa preferències',
+'tooltip-summary' => 'Afegiu un breu resum',
# Stylesheets
'common.css' => '/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */',
@@ -2713,14 +2779,17 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
'imagemaxsize' => "Límit de mida d'imatges:<br />''(per a pàgines de descripció de fitxers)''",
'thumbsize' => 'Mida de la miniatura:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pàgina|pàgines}}',
-'file-info' => '(mida: $1, tipus MIME: $2)',
-'file-info-size' => '($1 × $2 píxels, mida del fitxer: $3, tipus MIME: $4)',
+'file-info' => 'mida: $1, tipus MIME: $2',
+'file-info-size' => '$1 × $2 píxels, mida del fitxer: $3, tipus MIME: $4',
'file-nohires' => '<small>No hi ha cap versió amb una resolució més gran.</small>',
-'svg-long-desc' => '(fitxer SVG, nominalment $1 × $2 píxels, mida del fitxer: $3)',
+'svg-long-desc' => 'fitxer SVG, nominalment $1 × $2 píxels, mida del fitxer: $3',
'show-big-image' => 'Imatge en màxima resolució',
'show-big-image-thumb' => "<small>Mida d'aquesta previsualització: $1 × $2 píxels</small>",
'file-info-gif-looped' => 'embuclat',
'file-info-gif-frames' => '$1 {{PLURAL:$1|fotograma|fotogrames}}',
+'file-info-png-looped' => 'embuclat',
+'file-info-png-repeat' => "s'ha reproduït $1 {{PLURAL:$1|vegada|vegades}}",
+'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogrames}}',
# Special:NewFiles
'newimages' => 'Galeria de nous fitxers',
@@ -2876,6 +2945,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
'exif-gpsareainformation' => "Nom de l'àrea GPS",
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Correcció diferencial GPS',
+'exif-objectname' => 'Títol abreujat',
# EXIF attributes
'exif-compression-1' => 'Sense compressió',
@@ -2960,6 +3030,8 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
'exif-sensingmethod-7' => 'Sensor trilineal',
'exif-sensingmethod-8' => 'Sensor linear de color per seqüències',
+'exif-filesource-3' => 'Càmera fotogràfica digital',
+
'exif-scenetype-1' => 'Una imatge fotografiada directament',
'exif-customrendered-0' => 'Procés normal',
@@ -3036,33 +3108,33 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
'limitall' => 'tots',
# E-mail address confirmation
-'confirmemail' => "Confirma l'adreça de correu electrònic",
-'confirmemail_noemail' => "No heu introduït una direcció vàlida de correu electrònic en les vostres [[Special:Preferences|preferències d'usuari]].",
-'confirmemail_text' => "El projecte {{SITENAME}} necessita que valideu la vostra adreça de correu
+'confirmemail' => "Confirma l'adreça de correu electrònic",
+'confirmemail_noemail' => "No heu introduït una direcció vàlida de correu electrònic en les vostres [[Special:Preferences|preferències d'usuari]].",
+'confirmemail_text' => "El projecte {{SITENAME}} necessita que valideu la vostra adreça de correu
electrònic per a poder gaudir d'algunes facilitats. Cliqueu el botó inferior
per a enviar un codi de confirmació a la vostra adreça. Seguiu l'enllaç que
hi haurà al missatge enviat per a confirmar que el vostre correu és correcte.",
-'confirmemail_pending' => "Ja s'ha enviat el vostre codi de confirmació per correu electrònic; si
+'confirmemail_pending' => "Ja s'ha enviat el vostre codi de confirmació per correu electrònic; si
fa poc hi heu creat el vostre compte, abans de mirar de demanar un nou
codi, primer hauríeu d'esperar alguns minuts per a rebre'l.",
-'confirmemail_send' => 'Envia per correu electrònic un codi de confirmació',
-'confirmemail_sent' => "S'ha enviat un missatge de confirmació.",
-'confirmemail_oncreate' => "S'ha enviat un codi de confirmació a la vostra adreça de correu electrònic.
+'confirmemail_send' => 'Envia per correu electrònic un codi de confirmació',
+'confirmemail_sent' => "S'ha enviat un missatge de confirmació.",
+'confirmemail_oncreate' => "S'ha enviat un codi de confirmació a la vostra adreça de correu electrònic.
No es requereix aquest codi per a autenticar-s'hi, però vos caldrà proporcionar-lo
abans d'activar qualsevol funcionalitat del wiki basada en missatges
de correu electrònic.",
-'confirmemail_sendfailed' => "{{SITENAME}} no ha pogut enviar el vostre missatge de confirmació.
+'confirmemail_sendfailed' => "{{SITENAME}} no ha pogut enviar el vostre missatge de confirmació.
Comproveu que l'adreça no tingui caràcters no vàlids.
El programari de correu retornà el següent missatge: $1",
-'confirmemail_invalid' => 'El codi de confirmació no és vàlid. Aquest podria haver vençut.',
-'confirmemail_needlogin' => 'Necessiteu $1 per a confirmar la vostra adreça electrònica.',
-'confirmemail_success' => "S'ha confirmat la vostra adreça electrònica.
+'confirmemail_invalid' => 'El codi de confirmació no és vàlid. Aquest podria haver vençut.',
+'confirmemail_needlogin' => 'Necessiteu $1 per a confirmar la vostra adreça electrònica.',
+'confirmemail_success' => "S'ha confirmat la vostra adreça electrònica.
Ara podeu [[Special:UserLogin|iniciar una sessió]] i gaudir del wiki.",
-'confirmemail_loggedin' => "Ja s'ha confirmat la vostra adreça electrònica.",
-'confirmemail_error' => 'Quelcom ha fallat en desar la vostra confirmació.',
-'confirmemail_subject' => "Confirmació de l'adreça electrònica del projecte {{SITENAME}}",
-'confirmemail_body' => "Algú, segurament vós, ha registrat el compte «$2» al projecte {{SITENAME}}
+'confirmemail_loggedin' => "Ja s'ha confirmat la vostra adreça electrònica.",
+'confirmemail_error' => 'Quelcom ha fallat en desar la vostra confirmació.',
+'confirmemail_subject' => "Confirmació de l'adreça electrònica del projecte {{SITENAME}}",
+'confirmemail_body' => "Algú, segurament vós, ha registrat el compte «$2» al projecte {{SITENAME}}
amb aquesta adreça electrònica des de l'adreça IP $1.
Per a confirmar que aquesta adreça electrònica us pertany realment
@@ -3075,8 +3147,34 @@ Si *no* heu estat qui ho ha fet, seguiu aquest altre enllaç per a canceŀlar la
$5
Aquest codi de confirmació caducarà a $4.",
-'confirmemail_invalidated' => "Confirmació d'adreça electrònica canceŀlada",
-'invalidateemail' => "Canceŀlació d'adreça electrònica",
+'confirmemail_body_changed' => 'Algú, segurament vós, des de l\'adreça IP $1, ha canviat al projecte {{SITENAME}} l\'adreça de correu del compte "$2" a aquesta adreça.
+
+Per confirmar que aquest compte realment us pertany i per reactivar
+les opcions de correu a {{SITENAME}}, obriu el següent enllaç al vostre navegador:
+
+$3
+
+Si el compte *no* us pertany, seguiu l\'enllaç següent
+per a cancel·lar la confirmació d\'adreça de correu:
+
+$5
+
+Aquest codi de confirmació expirarà el $4.',
+'confirmemail_body_set' => "Algú, probablement vós, des de l'adreça IP $1,
+ha establert aquesta adreça de correu electrònic com la del compte «$2» del lloc {{SITENAME}}.
+
+Per confirmar que aquest compte realment us pertany i reactivar
+les facilitats de correu electrònic a {{SITENAME}}, cal que obriu al navegador aquest enllaç:
+
+$3
+
+Si el compte *no* us pertany, canceŀleu l'adreça de correu electrònic seguint aquest enllaç:
+
+$5
+
+Aquest codi de confirmació caducarà el $4.",
+'confirmemail_invalidated' => "Confirmació d'adreça electrònica canceŀlada",
+'invalidateemail' => "Canceŀlació d'adreça electrònica",
# Scary transclusion
'scarytranscludedisabled' => "[S'ha inhabilitat la transclusió interwiki]",
@@ -3116,6 +3214,7 @@ Confirmeu que realment voleu tornar-la a crear.",
'table_pager_first' => 'Primera pàgina',
'table_pager_last' => 'Darrera pàgina',
'table_pager_limit' => 'Mostra $1 elements per pàgina',
+'table_pager_limit_label' => 'Ãtems per pàgina:',
'table_pager_limit_submit' => 'Vés-hi',
'table_pager_empty' => 'Sense resultats',
@@ -3173,6 +3272,7 @@ També podeu [[Special:Watchlist/edit|utilitzar l'editor estàndard]].",
'version-specialpages' => 'Pàgines especials',
'version-parserhooks' => "Extensions de l'analitzador",
'version-variables' => 'Variables',
+'version-skins' => 'Aparences',
'version-other' => 'Altres',
'version-mediahandlers' => 'Connectors multimèdia',
'version-hooks' => 'Lligams',
@@ -3184,6 +3284,13 @@ També podeu [[Special:Watchlist/edit|utilitzar l'editor estàndard]].",
'version-hook-subscribedby' => 'Subscrit per',
'version-version' => '(Versió $1)',
'version-license' => 'Llicència',
+'version-poweredby-credits' => "El wiki funciona gràcies a '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'altres',
+'version-license-info' => "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior.
+
+MediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a la Llicència Pública General GNU.
+
+Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
'version-software' => 'Programari instaŀlat',
'version-software-product' => 'Producte',
'version-software-version' => 'Versió',
@@ -3254,6 +3361,15 @@ Introduïu el nom del fitxer sense el prefix «{{ns:file}}:».",
'tags-edit' => 'modifica',
'tags-hitcount' => '$1 {{PLURAL:$1|canvi|canvis}}',
+# Special:ComparePages
+'comparepages' => 'Comparar pàgines',
+'compare-selector' => 'Comparar revisions de pàgines',
+'compare-page1' => 'Pàgina 1',
+'compare-page2' => 'Pàgina 2',
+'compare-rev1' => 'Revisió 1',
+'compare-rev2' => 'Revisió 2',
+'compare-submit' => 'Compara',
+
# Database error messages
'dberr-header' => 'Aquest wiki té un problema',
'dberr-problems' => 'Ho sentim. Aquest lloc web està experimentant dificultats tècniques.',
@@ -3270,8 +3386,13 @@ Introduïu el nom del fitxer sense el prefix «{{ns:file}}:».",
'htmlform-float-invalid' => 'El valor especificat no és un nombre.',
'htmlform-int-toolow' => 'El valor que heu especifcat està per sota del mínim de $1',
'htmlform-int-toohigh' => 'El valor que heu especificat està per sobre del màxim de $1',
+'htmlform-required' => 'Aquest valor és necessari',
'htmlform-submit' => 'Tramet',
'htmlform-reset' => 'Desfés els canvis',
'htmlform-selectorother-other' => 'Altres',
+# SQLite database support
+'sqlite-has-fts' => '$1, amb suport de búsqueda de text íntegre',
+'sqlite-no-fts' => '$1, sense supor de búsqueda de text íntegre',
+
);
diff --git a/languages/messages/MessagesCdo.php b/languages/messages/MessagesCdo.php
index 70646ac6..7dc5c627 100644
--- a/languages/messages/MessagesCdo.php
+++ b/languages/messages/MessagesCdo.php
@@ -22,7 +22,7 @@ $dateFormats = array(
$messages = array(
# User preference toggles
-'tog-rememberpassword' => 'Giéu cÄ« gá diêng-nÅ̤ gé diâng nguÄi gì dióng-hô̤ gâe̤ng mÄ­k-mÄ',
+'tog-rememberpassword' => 'Giéu cÄ« gá diêng-nÅ̤ gé diâng nguÄi gì dióng-hô̤ gâe̤ng mÄ­k-mÄ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Gă-tiÄ•ng nguÄi kÅ­i gì hiÄ•k-miêng gáu nguÄi gì gáng-sê-dăng',
'tog-watchdefault' => 'Gă-tiÄ•ng nguÄi siÅ­-gÄi gì hiÄ•k-miêng gáu nguÄi gì gáng-sê-dăng',
'tog-watchmoves' => 'Gă-tiÄ•ng nguÄi iè-dông gì hiÄ•k-miêng gáu nguÄi gì gáng-sê-dăng',
@@ -220,7 +220,7 @@ Nṳ̄ gì dióng-hô̤ Ä«-gÄ­ng kÅ­i hÅ̤ lÄu. DÄng nṳ̄ â̤-sÄi siÅ­-gÄ
'yourname' => 'Ê̤ṳng-hô-miàng',
'yourpassword' => 'MÄ­k-mÄ',
'yourpasswordagain' => 'Dṳ̀ng-sÄ­ng páh diÄ“ mÄ­k-mÄ',
-'remembermypassword' => 'Giéu cÄ« gá diêng-nÅ̤ gé diâng nguÄi gì dióng-hô̤ gâe̤ng mÄ­k-mÄ.',
+'remembermypassword' => 'Giéu cÄ« gá diêng-nÅ̤ gé diâng nguÄi gì dióng-hô̤ gâe̤ng mÄ­k-mÄ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Láuk-diē',
'loginprompt' => 'Páh kŭi cookies ciáh â̤ diē {{SITENAME}}.',
'userlogin' => 'Láuk-diē / kŭi dióng-hô̤',
@@ -302,7 +302,6 @@ IÅk-guÅ nṳ̄ dÄ­k-ciék áik \"{{int:savearticle}}\", '''nâ ô''' gà̤-dÄ“
'yourtext' => 'Nṳ̄ gì ùng-cê',
'editingold' => "'''GĪNG-GÓ̤: Nṳ̄ hiêng-câi lÄ̤ siÅ­-gÄi ciÄ hiÄ•k-miêng Ä«-gÄ­ng guó-gÄ­ gì bÄ“ng-buÅng. Nṳ̄ nâ bÅ̤-còng Ä­, cÄ« ciáh gô bÄ“ng-buÅng cÄ­-hâiu gì siÅ­-gÄi cêu mò̤ lÄu.'''",
'yourdiff' => 'Chă-biék',
-'longpagewarning' => "'''GÄ«ng-gó̤: BuÅng hiÄ•k ô $1 chiÄ•ng-cê-ciék (''kilobyte'') dòng; ô siÅh piÄ• báuk-lÄng-ké (''browser'') mò̤ nièng-ngài piÄ•ng-cÄ­k 32 chiÄ•ng-cê-ciék cÅ̤-êu hĕ̤k-ciÄ gă dòng gì hiÄ•k. ChiÄng sṳ̆-liòng ciÅng ciÄ hiÄ•k tiáh có̤ gă dÅi gì dâung.'''",
'readonlywarning' => "'''GÄ«ng-gó̤: Ôi lÄu mì-hô buÅng câng, só-gé̤ṳ-kó ké̤ṳk sÅ̤ kÄ« lÄu, gó-chṳ̄ cÄ«-lùng nṳ̄ mò̤ nièng-ngài bÅ̤-còng nṳ̄ gì siÅ­-gÄi. ChiÄng sÄ•ng bÅ̤-còng diÅh nṳ̄ diêng-nÅ̤ buÅng-dê, dÄ«ng nék-gÅ« mâing gái ché.'''",
'protectedpagewarning' => "'''GĪNG-GÓ̤: CiÄ hiÄ•k Ä«-gÄ­ng ké̤ṳk sÅ̤ kÄ« go̤ lÄu, nâ ô guÄng-lÄ«-uòng â̤ siÅ­-gÄi Ä­.'''",
'semiprotectedpagewarning' => "'''Cé̤ṳ-é:''' CiÄ hiÄ•k-miêng Ä«-gÄ­ng ké̤ṳk bÅ̤-hô, gó-chṳ̄ nâ ô láuk-diÄ“ gì ê̤ṳng-hô â̤-sÄi siÅ­-gÄi Ä­.",
@@ -439,32 +438,32 @@ Siók-mìng: (dÄng) = gâe̤ng dék sÄ­ng bÄ“ng-buÅng bÄ«-piâng, (sèng) = gÃ
'recentchangeslinked-toolbox' => 'SiÅng-guăng gì gÄi-biéng',
# Upload
-'upload' => 'Siông-duòng ùng-giông',
-'uploadbtn' => 'Siông-duòng ùng-giông',
-'reuploaddesc' => 'DuÅng kó̤ siông-duòng dăng-dăng.',
-'uploadnologin' => 'Mò̤ láuk-diē',
-'uploadnologintext' => 'SÄ•ng [[Special:UserLogin|láuk-diÄ“]] ciáh â̤-sÄi siông-duòng ùng-giông.',
-'uploaderror' => 'Siông-duòng ô dâng',
-'uploadlog' => 'siông-duòng nĭk-cé',
-'uploadlogpage' => 'Siông-duòng nĭk-cé',
-'uploadlogpagetext' => 'Â-dÄ̤ sê gé-luÅh cÄ«-bÅng ùng-giông siông-duòng gì dăng-dăng.',
-'filename' => 'Ùng-giông-miàng',
-'filedesc' => 'Cūng-giék',
-'fileuploadsummary' => 'Cūng-giék:',
-'filesource' => 'Lài-nguòng:',
-'uploadedfiles' => 'Siông-duòng ùng-giông',
-'ignorewarning' => 'Mò̤ sê̤ṳ gÄ«ng-gó̤ bÅ̤-còng ùng-giông.',
-'ignorewarnings' => 'Mò̤ sê̤ṳ gīng-gó̤',
-'fileexists' => "Ī-gÄ­ng ô siÅh bÄ­k dè̤ng miàng ùng-giông, nṳ̄ nâ mâ̤ káuk-dêng nṳ̄ sê-ng-sê dÅng-cÄ­ng páh-sáung gÄi-biéng Ä­, chiÄng giÄ“ng-chă '''<tt>[[:$1]]</tt>'''.
+'upload' => 'Siông-duòng ùng-giông',
+'uploadbtn' => 'Siông-duòng ùng-giông',
+'reuploaddesc' => 'DuÅng kó̤ siông-duòng dăng-dăng.',
+'uploadnologin' => 'Mò̤ láuk-diē',
+'uploadnologintext' => 'SÄ•ng [[Special:UserLogin|láuk-diÄ“]] ciáh â̤-sÄi siông-duòng ùng-giông.',
+'uploaderror' => 'Siông-duòng ô dâng',
+'uploadlog' => 'siông-duòng nĭk-cé',
+'uploadlogpage' => 'Siông-duòng nĭk-cé',
+'uploadlogpagetext' => 'Â-dÄ̤ sê gé-luÅh cÄ«-bÅng ùng-giông siông-duòng gì dăng-dăng.',
+'filename' => 'Ùng-giông-miàng',
+'filedesc' => 'Cūng-giék',
+'fileuploadsummary' => 'Cūng-giék:',
+'filesource' => 'Lài-nguòng:',
+'uploadedfiles' => 'Siông-duòng ùng-giông',
+'ignorewarning' => 'Mò̤ sê̤ṳ gÄ«ng-gó̤ bÅ̤-còng ùng-giông.',
+'ignorewarnings' => 'Mò̤ sê̤ṳ gīng-gó̤',
+'fileexists' => "Ī-gÄ­ng ô siÅh bÄ­k dè̤ng miàng ùng-giông, nṳ̄ nâ mâ̤ káuk-dêng nṳ̄ sê-ng-sê dÅng-cÄ­ng páh-sáung gÄi-biéng Ä­, chiÄng giÄ“ng-chă '''<tt>[[:$1]]</tt>'''.
[[$1|thumb]]",
-'successfulupload' => 'Siông-diòng sìng-gŭng',
-'uploadwarning' => 'Siông-duòng gīng-gó̤',
-'savefile' => 'BÅ̤-còng ùng-giông',
-'uploadedimage' => 'siông-duòng "[[$1]]"',
-'uploadvirus' => 'CiÄ Ã¹ng-giông ô bêng-dÅ­k! Sá̤-ciék: $1',
-'sourcefilename' => 'Nguòng-sṳ̄ ùng-giông-miàng:',
-'destfilename' => 'Mŭk-biĕu ùng-giông-miàng:',
-'watchthisupload' => 'Gáng-sê ciÄ hiÄ•k',
+'uploadwarning' => 'Siông-duòng gīng-gó̤',
+'savefile' => 'BÅ̤-còng ùng-giông',
+'uploadedimage' => 'siông-duòng "[[$1]]"',
+'uploadvirus' => 'CiÄ Ã¹ng-giông ô bêng-dÅ­k! Sá̤-ciék: $1',
+'sourcefilename' => 'Nguòng-sṳ̄ ùng-giông-miàng:',
+'destfilename' => 'Mŭk-biĕu ùng-giông-miàng:',
+'watchthisupload' => 'Gáng-sê ciÄ hiÄ•k',
+'upload-success-subj' => 'Siông-diòng sìng-gŭng',
# Special:ListFiles
'imgfile' => 'ùng-giông',
@@ -590,7 +589,6 @@ Siók-mìng: (dÄng) = gâe̤ng dék sÄ­ng bÄ“ng-buÅng bÄ«-piâng, (sèng) = gÃ
# Watchlist
'watchlist' => 'NguÄi gì gáng-sê-dăng',
'mywatchlist' => 'NguÄi gì gáng-sê-dăng',
-'watchlistfor' => "('''$1''' gì)",
'nowatchlist' => 'Nṳ̄ gì gáng-sê-dăng gà̤-dēng mò̤ dèu-mĕ̤k.',
'watchnologin' => 'Mò̤ láuk diē',
'addedwatch' => 'Gă-tiĕng gáu gáng-sê-dăng',
@@ -735,7 +733,6 @@ Có̤i âu gì siÅ­-gÄi sê [[User:$3|$3]] ([[User talk:$3|TÅ̤-lâung]]) sÅ«
'ipb-edit-dropdown' => 'SiÅ­-gÄi hÅ­ng-sÅ̤ nguòng-Ä­ng',
'ipb-unblock-addr' => 'GÄi-hÅ­ng $1',
'ipb-unblock' => 'GÄi-hÅ­ng siÅh ciáh ê̤ṳng-hô hĕ̤k IP dê-cÄ«',
-'ipb-blocklist-addr' => 'Káng dó̤i $1 gì hÅ­ng-sÅ̤ dăng-dăng',
'ipb-blocklist' => 'Káng hÅ­ng-sÅ̤ dăng-dăng',
'unblockip' => 'GÄi-hÅ­ng ê̤ṳng-hô',
'ipusubmit' => 'GÄi-hÅ­ng ciÄ dê-cÄ«',
diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php
index 70d3b717..de33574c 100644
--- a/languages/messages/MessagesCe.php
+++ b/languages/messages/MessagesCe.php
@@ -17,29 +17,192 @@
$fallback = 'ru';
$namespaceNames = array(
- NS_MEDIA => 'Медйа',
- NS_SPECIAL => 'Башхо',
- NS_TALK => 'Дийца',
- NS_USER => 'Юзер',
- NS_USER_TALK => 'Юзери_дийца',
- NS_PROJECT_TALK => '$1_Дийца',
- NS_FILE => 'Сурт',
- NS_FILE_TALK => 'Сурти_дийца',
- NS_MEDIAWIKI => 'МедйаВики',
- NS_MEDIAWIKI_TALK => 'МедйаВики_дийца',
- NS_TEMPLATE => 'Дакъа',
- NS_TEMPLATE_TALK => 'Дакъан_дийца',
- NS_HELP => 'ГІо',
- NS_HELP_TALK => 'ГІодан_дийца',
- NS_CATEGORY => 'Тоба',
- NS_CATEGORY_TALK => 'Тобан_дийца',
+ NS_MEDIA => 'Медиа',
+ NS_SPECIAL => 'Белхан',
+ NS_TALK => 'Дийцаре',
+ NS_USER => 'Декъашхо',
+ NS_USER_TALK => 'Декъашхон_дийцаре',
+ NS_PROJECT_TALK => '{{GRAMMAR:genitive|$1}}_дийцаре',
+ NS_FILE => 'Хlум',
+ NS_FILE_TALK => 'Хlуман_дийцаре',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_дийцаре',
+ NS_TEMPLATE => 'Куцкеп',
+ NS_TEMPLATE_TALK => 'Куцкеп_дийцаре',
+ NS_HELP => 'Гlо',
+ NS_HELP_TALK => 'Гlон_дийцаре',
+ NS_CATEGORY => 'Кадегар',
+ NS_CATEGORY_TALK => 'Кадегар_дийцаре',
+);
+
+$namespaceAliases = array(
+ 'Медйа' => NS_MEDIA,
+ 'Башхо' => NS_SPECIAL,
+ 'Дийца' => NS_TALK,
+ 'Юзер' => NS_USER,
+ 'Юзери_дийца' => NS_USER_TALK,
+ 'Дийцаре_декъашхо' => NS_USER_TALK,
+ '$1_Дийца' => NS_PROJECT_TALK,
+ 'Дийцаре_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+ 'Сурт' => NS_FILE,
+ 'Сурти_дийца' => NS_FILE_TALK,
+ 'Дийцаре_хlуман' => NS_FILE_TALK,
+ 'МедйаВики' => NS_MEDIAWIKI,
+ 'МедйаВики_дийца' => NS_MEDIAWIKI_TALK,
+ 'MediaWiki_Дийцаре' => NS_MEDIAWIKI_TALK,
+ 'Дакъан' => NS_TEMPLATE,
+ 'Дакъан_дийца' => NS_TEMPLATE_TALK,
+ 'ГІо' => NS_HELP,
+ 'ГІодан_дийца' => NS_HELP_TALK,
+ 'Тоба' => NS_CATEGORY,
+ 'Тобан_дийца' => NS_CATEGORY_TALK
);
$magicWords = array(
- 'notoc' => array( '0', '__СДЖдац__', '__БЕЗ_ОГЛ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__ГалерйЯц__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'redirect' => array( '0', '#дlаÑахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БÐЦ_ЧУЛÐЦÐÐœ__', '__БÐЦ_ЧУЛ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ЙÐЦ_УЧЕ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛÐЦÐМБÐР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ЧУЛÐЦÐÐœ__', '__ЧУЛ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ЦÐМЕГ_РЕДÐККХÐ_ÐГlОÐ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__КОЬРТÐ_ЙОЦÐШ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'КÐРÐРÐ_БУТТ', 'КÐРÐРÐ_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'КÐРÐРÐ_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ_МУХ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ_ÐБР', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'КÐРÐРÐ_ДЕ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'КÐРÐРÐ_ДЕ_2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'КÐРÐРÐЧУ_ДЕ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'КÐРÐРÐ_ШО', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'КÐРÐРÐ_Ð¥ÐÐ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'КÐРÐРÐ_СÐХЬТ', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'МЕТТИГÐÐ_БУТТ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'МЕСТÐЫЙ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'МЕТТИГÐÐ_БУТТ_1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ_МУХ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ_ÐБР', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'МЕТТИГÐÐ_ДЕ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'МЕТТИГÐÐ_ДЕ_2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'МЕТТИГÐÐ_ДЕ_ЦlЕ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'МЕТТИГÐÐ_ШО', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'МЕТТИГÐÐ_Ð¥ÐÐ', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'МЕТТИГÐÐ_СÐХЬТ', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ÐГlОÐИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ЯЗЗÐÐœÐШИ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Ð¥lУМÐИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ДЕКЪÐШХОЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ДУКХÐЛЛÐ_ЖИГÐРÐ_ДЕКЪÐШХОЙ', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ÐИСДÐРШИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ХЬÐЖÐРИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ÐГlОÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ÐГlОÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ЦlЕРИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ЦlЕРИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ДИЙЦÐРШИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ДИЙЦÐРШИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ЯЗЗÐÐœÐШИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ЯЗЗÐÐœÐШИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ЮЬЗЗИÐÐ_ÐГlОÐ_ЦlЕ', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ЮЬЗЗИÐÐ_ÐГlОÐ_ЦlЕ_2', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ÐГlОÐ_КlЕЛÐРÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ÐГlОÐ_КlЕЛÐРÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ÐГlОÐ_ЦlЕРÐ_БУХ', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ÐГlОÐ_ЦlЕРÐ_БУХ_2', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ДИЙЦÐРЕ_ÐГlОÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ДИЙЦÐРЕ_ÐГlОÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ÐГlОÐ_ЯЗЗÐÐœÐÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ÐГlОÐ_ЯЗЗÐÐœÐÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'Ð¥ÐÐÐœ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'Ð¥lОТТОР:', 'Ð¥lОТТ:', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'ВИКИ_Ð¥ÐÐÐœ_БОЦÐШ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'жима', 'жимо', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'жима=$1', 'жимо=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'бакъхьа', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'харцхьа', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'йоцуш', 'без', 'none' ),
+ 'img_width' => array( '1', '$1цинт', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'юккъ', 'центр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'гурабе', 'обрамить', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'гурабоцаш', 'безрамки', 'frameless' ),
+ 'img_page' => array( '1', 'агlо=$1', 'агlо_$1', 'page_$1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'бакъхьалакхо', 'бакъхьалакхо=$1', 'бакъхьалакхо_$1', 'upright_$1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'доза', 'граница', 'border' ),
+ 'img_baseline' => array( '1', 'бух', 'оÑнование', 'baseline' ),
+ 'img_sub' => array( '1', 'буха', 'под', 'sub' ),
+ 'img_super' => array( '1', 'тlе', 'над', 'super', 'sup' ),
+ 'img_top' => array( '1', 'лакхахь', 'Ñверху', 'top' ),
+ 'img_text_top' => array( '1', 'лакххьара-йоза', 'текÑÑ‚-Ñверху', 'text-top' ),
+ 'img_middle' => array( '1', 'юккъе', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'бухар', 'Ñнизу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'бухара-йоза', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
+ 'img_link' => array( '1', 'хьажориг=$1', 'ÑÑылка=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ЧУЬРÐ:', 'Ð’ÐУТР:', 'INT:' ),
+ 'sitename' => array( '1', 'МЕТТИГ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'БО:', 'ПИ:', 'NS:' ),
+ 'nse' => array( '0', 'БОХЬ:', 'ПИК:', 'NSE:' ),
+ 'localurl' => array( '0', 'Ð¥lОТТÐЕЛЛÐ_МЕТТИГ:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'Ð¥lОТТÐЕЛЛÐ_МЕТТИГ_2:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'ГlУЛКХДИРИГ', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'ГlУЛКХДЕЧУЬÐÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ÐЕКЪ_ОЦ_МЕТТÐКЕПÐ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'ЙОМÐÐÐ¥ÐТl', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'ДОЖÐР:', 'ПÐДЕЖ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ВУ_ЙУ:', 'GENDER', 'ПОЛ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__ХИЙЦÐР_ДОЦУШ_КОЬРТЕ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ЙОЗÐ_ХИЙЦÐР_ДОЦУШ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'КÐРÐРÐ_КlИР', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'КÐРÐРÐ_КlИРÐÐ_ДЕ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'МЕТТИГЕРÐ_КlИРÐ', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'МЕТТИГÐÐ_КlИРÐÐ_ДЕ', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ЦУЬÐÐ_БÐШХО', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕ_БÐШХО', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕ_БÐШХО_2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'БЕТТÐ_БÐШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ШО_БÐШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'КЪÐСТÐÐœ_ХЕÐÐ_БÐШХО', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'ДЕКЪÐШХОÐ_БÐШХО', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ДУКХÐЛЛИÐ_ТЕРÐХЬ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ХЬÐЛХÐР_ЭЛП_ЖИМÐ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ХЬÐЛХÐР_ЭЛП_ДОККХÐ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'КЕГИЙЧУ_ЭЛПÐШЦÐ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
+ 'uc' => array( '0', 'ДÐККХИЙЧУ_ЭЛПÐШЦÐ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
+ 'raw' => array( '0', 'ТÐЙÐÐЗÐ:', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ГÐЙТÐ_КОЬРТÐМОГl', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Т', 'Ð', 'R' ),
+ 'newsectionlink' => array( '1', '__ХЬÐЖОРИГ_ОЦ_КЕРЛÐЧУ_ДЕКЪÐÐ__', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__ЙОЦÐШ_ХЬÐЖОРИГ_ОЦ_КЕРЛÐЧУ_ДЕКЪÐÐ__', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ЙОЛШЙОЛУ_БÐШХО', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ИШÐРЙИÐÐ_МЕТТИГ:', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ИШÐРЙÐР_МЕТТИГÐÐ', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'КЪÐСТÐÐœ_ЙОЛУЧУ_Ð¥ÐÐÐÐ', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'КЪÐСТÐÐœ_МЕТТИГÐ_Ð¥ÐÐÐÐ', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ХЬÐЖОЧЕ_Ð¥ÐÐÐœ', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#МОТТ', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'special' => array( '0', 'башхо', 'ÑлужебнаÑ', 'special' ),
+ 'contentlanguage' => array( '1', 'МОТТ_ЧУЛÐЦÐÐœ', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ÐГlОÐÐШ_ОЦ_ЦlЕРÐШКÐХЬ:', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ÐДМÐÐКУЬГÐЛХОЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ТЕРÐХЬÐÐ_БÐРÐМХlОТТОР', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ЙУЗÐ_Ð¥ÐРЦЕ', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
+ 'padright' => array( '0', 'ЙУЗÐ_БÐКЪЕ', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
+ 'special' => array( '0', 'белхан', 'гlуллакхан', 'ÑлужебнаÑ', 'special' ),
+ 'defaultsort' => array( '1', 'ЛИСТÐР_ЦÐХЬЕХОР', 'ДОГlÐ_ЛИСТÐРÐÐ', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ОЦ_Ð¥lУМÐÐТlЕ_ÐЕКЪ:', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'къаÑтам', 'къаÑто', 'къаÑÑ‚', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
+ 'hiddencat' => array( '1', '__КЪÐЙЛÐХЙОЛУ_КÐДЕГÐР__', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'ÐГlОÐÐШ_ОЦУ_КÐДЕГÐРШЧОХЬ', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ÐГlОÐ_БÐРÐÐœ', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
+ 'index' => array( '1', '__МЕТТИГТЕРÐХЬ__', '__ИÐДЕКС__', '__INDEX__' ),
+ 'noindex' => array( '1', '__МЕТТИГТЕРÐХЬ_ЙОЦÐШ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'ТЕРÐХЬ_ОЦ_ТОБÐÐЦÐ', 'ЧИСЛО_Ð’_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__БУХЕХЬДЕРГ_ДlÐСХЬÐЖÐЙÐР__', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ГlÐРОЛЛИ_БÐРÐÐœ', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'терахьибарам', 'форматдаты', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ЙОМÐ', 'ПУТЬ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ЧЕХКÐ', 'ВИКИ', 'WIKI' ),
);
$messages = array(
@@ -58,7 +221,7 @@ $messages = array(
'tog-editsection' => 'Гайта хьажориг «ниÑйе» аьлла Ñ…lора агlона',
'tog-editsectiononrightclick' => 'ÐиÑде дакъа шозза бакъехьар дахка Ñ‚lетаlийча оцу кортан (JavaScript)',
'tog-showtoc' => 'Гойти коьртнаш (оцу агlонашна лаххара 3 коьртнашца)',
-'tog-rememberpassword' => 'Даглаца Ñан дlавазвалар Ñ…lокху гlулкхдечу гlирÑа Ñ‚lÑÑ…ÑŒ',
+'tog-rememberpassword' => 'Даглаца Ñан дlавазвалар Ñ…lокху гlулкхдечу гlирÑа Ñ‚lÑÑ…ÑŒ (цхьан $1 {{PLURAL:$1|де|ден|динахь}})',
'tog-watchcreations' => 'Тlетоха Ð°Ñ ÐºÑ…Ð¾Ð»Ð»Ð¸Ð½Ð° агlонаш тергаме могlам чу',
'tog-watchdefault' => 'Тlетоха Ð°Ñ Ð½Ð¸Ñйина агlонаш тергаме могlам чу',
'tog-watchmoves' => 'Тlетоха Ð°Ñ Ñ†lераш хийцина агlонаш тергаме могlам чу',
@@ -205,31 +368,21 @@ $messages = array(
'faqpage' => 'Project:СиХХ',
# Vector skin
-'vector-action-addsection' => 'Тlетоха хьедар',
-'vector-action-delete' => 'Дlадайá',
-'vector-action-move' => 'Цlе хийца',
-'vector-action-protect' => 'Гlаролла дé',
-'vector-action-undelete' => 'Меттахlоттадé',
-'vector-action-unprotect' => 'Гlароллех къаÑта',
-'vector-namespace-category' => 'Кадегар',
-'vector-namespace-help' => 'ÐиÑвохааман агlо',
-'vector-namespace-image' => 'Хlум',
-'vector-namespace-main' => 'Ðгlо',
-'vector-namespace-media' => 'Медиа-агlо',
-'vector-namespace-mediawiki' => 'Хаам',
-'vector-namespace-project' => 'Кхолламех',
-'vector-namespace-special' => 'Белха агlо',
-'vector-namespace-talk' => 'Дийцаре',
-'vector-namespace-template' => 'Куцкеп',
-'vector-namespace-user' => 'Декъашхон агlо',
-'vector-view-create' => 'Кхоллар',
-'vector-view-edit' => 'ÐиÑйé',
-'vector-view-history' => 'Хьажа иÑторе',
-'vector-view-view' => 'Éшар',
-'vector-view-viewsource' => 'Билглонашка хьажа',
-'actions' => 'Дийраш',
-'namespaces' => 'Цlерийн ана',
-'variants' => 'Кепараш',
+'vector-action-addsection' => 'Тlетоха хьедар',
+'vector-action-delete' => 'Дlадайá',
+'vector-action-move' => 'Цlе хийца',
+'vector-action-protect' => 'Гlаролла дé',
+'vector-action-undelete' => 'Меттахlоттадé',
+'vector-action-unprotect' => 'Гlароллех къаÑта',
+'vector-simplesearch-preference' => 'Шуьйра лахаран хьехар лата де (декъа «Хьушйерг» кечйарца)',
+'vector-view-create' => 'Кхоллар',
+'vector-view-edit' => 'ÐиÑйé',
+'vector-view-history' => 'Хьажа иÑторе',
+'vector-view-view' => 'Éшар',
+'vector-view-viewsource' => 'Билглонашка хьажа',
+'actions' => 'Дийраш',
+'namespaces' => 'Цlерийн ана',
+'variants' => 'Кепараш',
'errorpagetitle' => 'Гlалат',
'returnto' => 'Юхагlо оцу агlоне $1.',
@@ -290,6 +443,9 @@ $messages = array(
Дехар до, Ñобардеш а йуха хьажа Ñ…lокху агlонтlе жим Ñ‚lаьхьо.
$1',
+'pool-timeout' => 'Сацо веза хан тlех йаьлла',
+'pool-queuefull' => 'Дехаршан чоь йуззина йу',
+'pool-errorunknown' => 'Дойзаш доцу гlалат',
# 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:genitive|{{SITENAME}}}} лаьцна',
@@ -391,7 +547,7 @@ $1',
'yourname' => 'Декъашхон цlе:',
'yourpassword' => 'Ишар:',
'yourpasswordagain' => 'Юха Ñзъйе ишар:',
-'remembermypassword' => 'Даглаца Ñан дlавазвалар Ñ…lокху гlулкхдечу гlирÑа Ñ‚lÑÑ…ÑŒ',
+'remembermypassword' => 'Даглаца Ñан дlавазвалар Ñ…lокху гlулкхдечу гlирÑа Ñ‚lÑÑ…ÑŒ (цхьан $1 {{PLURAL:$1|ден|динахь|динахь}})',
'yourdomainname' => 'Хьан машан меттиг:',
'login' => 'Вовзийта хьой гlирÑан',
'nav-login-createaccount' => 'Вовзийта хьой / дlавазло',
@@ -692,7 +848,6 @@ $1',
'recentchanges' => 'Керла ниÑдарш',
'recentchanges-legend' => 'ГlÐ¸Ñ€Ñ Ð½Ð¸Ñбарна керла ниÑдарш',
'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
-'recentchanges-legend-newpage' => '$1 — керла агlо',
'recentchanges-label-newpage' => 'Оцу ниÑдарца кхоллина керла агlо.',
'recentchanges-label-minor' => 'Ð¥lара ниÑдинарг къаÑтийна жимо долушÑан',
'rcnote' => "{{PLURAL:$1|Тlаьххьара '''$1''' хийцам|Тlаьххьара '''$1''' хийцамаш|Тlаьххьара '''$1''' хийцамаш}} за '''$2''' {{PLURAL:$2|де|дийнахь|дийнахь}}, оцу хан чохь $5 $4.",
@@ -937,7 +1092,6 @@ PICT # тайп тайпан
# Watchlist
'watchlist' => 'Тергаме могlам',
'mywatchlist' => 'Тергаме могlам',
-'watchlistfor' => "(декъашхона '''$1''')",
'watchnologin' => 'Хьо вовзита веза гlирÑан',
'addedwatch' => 'Юькъатоьхна тергаме могlамна',
'addedwatchtext' => 'Хlар агlо «[[:$1]]» тlетоьхна хьан [[Special:Watchlist|тидаме могlам чу]].
@@ -1247,9 +1401,9 @@ PICT # тайп тайпан
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|агlо|агlонаш|агlонаш}}',
-'file-info-size' => '($1 × $2 Ñиртакх, Ñ…lуман барам: $3, MIME-тайп: $4)',
+'file-info-size' => '$1 × $2 Ñиртакх, Ñ…lуман барам: $3, MIME-тайп: $4',
'file-nohires' => '<small>Кхи йоккха гlоле башхо Ñц.</small>',
-'svg-long-desc' => '(SVG-хlума, хlоттамца $1 × $2 цинташ, хlуман барам: $3)',
+'svg-long-desc' => 'SVG-хlума, хlоттамца $1 × $2 цинташ, хlуман барам: $3',
'show-big-image' => 'Сурт цlанал лаккхара бакъонца',
'show-big-image-thumb' => '<small>Хьажарна барам: $1 × $2 цинташ</small>',
diff --git a/languages/messages/MessagesCeb.php b/languages/messages/MessagesCeb.php
index ff2d3407..a7567d2c 100644
--- a/languages/messages/MessagesCeb.php
+++ b/languages/messages/MessagesCeb.php
@@ -79,8 +79,7 @@ $messages = array(
'tog-editsection' => 'Mausab ang mga seksiyon gamit ang [usba] nga sumpay',
'tog-editsectiononrightclick' => 'Mahimo ang pag-usab sa seksyon pinaagi sa pag-right click sa titulo sa seksyon (JavaScript kinahanglan)',
'tog-showtoc' => 'Ipakita ang talaan sa sulod (alang sa mga panid nga may daghan pa sa 3 ka heading)',
-'tog-rememberpassword' => 'Hinumdomi ako sa kining kompyuter',
-'tog-editwidth' => 'Palapdan ang kahon sa pag-usab aron mapuno sa tibuok screen',
+'tog-rememberpassword' => 'Hinumdomi ako sa kining kompyuter (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Bantayi ang akong gisugdang mga panid',
'tog-watchdefault' => 'Bantayi ang akong giusab nga mga panid',
'tog-watchmoves' => 'Bantayi ang akong gibalhin nga mga panid',
@@ -222,31 +221,20 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Pagdugang og topiko',
-'vector-action-delete' => 'Papasa',
-'vector-action-move' => 'Ibalhin',
-'vector-action-protect' => 'Protektahi',
-'vector-action-undelete' => 'Ayaw papasa',
-'vector-action-unprotect' => 'Ayaw protektahi',
-'vector-namespace-category' => 'Kategoriya',
-'vector-namespace-help' => 'Panid sa tabang',
-'vector-namespace-image' => 'Payl',
-'vector-namespace-main' => 'Panid',
-'vector-namespace-media' => 'Panid sa medya',
-'vector-namespace-mediawiki' => 'Mensahe',
-'vector-namespace-project' => 'Panid sa proyekto',
-'vector-namespace-special' => 'Espesyal nga panid',
-'vector-namespace-talk' => 'Panaghisgot-hisgot',
-'vector-namespace-template' => 'Plantilya',
-'vector-namespace-user' => 'Panid sa tiggamit',
-'vector-view-create' => 'Himoa',
-'vector-view-edit' => 'Usba',
-'vector-view-history' => 'Tan-awa ang kaagi',
-'vector-view-view' => 'Basaha',
-'vector-view-viewsource' => 'Tan-awa ang ginikanan',
-'actions' => 'Mga lihok',
-'namespaces' => 'Mga ngalang espasyo',
-'variants' => 'Mga baryant',
+'vector-action-addsection' => 'Pagdugang og topiko',
+'vector-action-delete' => 'Papasa',
+'vector-action-move' => 'Ibalhin',
+'vector-action-protect' => 'Protektahi',
+'vector-action-undelete' => 'Ayaw papasa',
+'vector-action-unprotect' => 'Ayaw protektahi',
+'vector-view-create' => 'Himoa',
+'vector-view-edit' => 'Usba',
+'vector-view-history' => 'Tan-awa ang kaagi',
+'vector-view-view' => 'Basaha',
+'vector-view-viewsource' => 'Tan-awa ang ginikanan',
+'actions' => 'Mga lihok',
+'namespaces' => 'Mga ngalang espasyo',
+'variants' => 'Mga baryant',
'errorpagetitle' => 'Sayop',
'returnto' => 'Balik sa $1.',
@@ -470,7 +458,7 @@ Ayaw kalimot sa pag-usab sa imong [[Special:Preferences|{{SITENAME}} mga prepere
'yourname' => 'Ngalan sa tiggamit:',
'yourpassword' => 'Pasword:',
'yourpasswordagain' => 'Itayp og usab ang pasword:',
-'remembermypassword' => 'Hinumdomi ako niini nga kompyuter',
+'remembermypassword' => 'Hinumdomi ako niining brawser (sa kadugayon nga $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})',
'yourdomainname' => 'Ang imong domain:',
'externaldberror' => 'May nahitabong authentication database error o kaha wala ka tugoti nga mag-update sa imong eksternal nga akawnt.',
'login' => 'Sulod',
@@ -1026,7 +1014,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Akong gibantayan',
'mywatchlist' => 'Akong gibantayan',
-'watchlistfor' => "(para kang '''$1''')",
'addedwatch' => 'Nadugang sa gibantayan',
'addedwatchtext' => "Ang panid \"[[:\$1]]\" nadugang na sa imong [[Special:Watchlist|gibantayan]].
Ang mga pag-usab puhon sa kining panid ug ang kaubang panid sa hisgot dinhi maitala, ug ang panid mopakita nga '''nakalugom''' sa [[Special:RecentChanges|talaan sa mga bag-ong pag-usab]] aron dali kini pilion.",
@@ -1240,9 +1227,9 @@ Puyde dugangan og rason sa mubong sugid.',
'nextdiff' => 'Mas bag-ong pag-usab →',
# Media information
-'file-info-size' => '($1 × $2 pixels, size sa payl: $3, MIME type: $4)',
+'file-info-size' => '$1 × $2 pixels, size sa payl: $3, MIME type: $4',
'file-nohires' => '<small>Walay mas taas nga resolusyon.</small>',
-'svg-long-desc' => '(SVG nga payl, nominally $1 × $2 pixels, size sa payl: $3)',
+'svg-long-desc' => 'SVG nga payl, nominally $1 × $2 pixels, size sa payl: $3',
'show-big-image' => 'Tibuok resolusyon',
'show-big-image-thumb' => '<small>Size niining preview: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesCh.php b/languages/messages/MessagesCh.php
index fbb001a0..f1a43f18 100644
--- a/languages/messages/MessagesCh.php
+++ b/languages/messages/MessagesCh.php
@@ -37,7 +37,7 @@ $messages = array(
'tog-extendwatchlist' => "Na'ladångkolu i listan pinilan para u na'annok i manaplikayon na tinilaika siha",
'tog-usenewrc' => "I manmana'lamaolek na tinilaika (JavaScript)",
'tog-showtoc' => "Na'annok i fañodda'an (annai guåha mas ki 3 na titulo gi påhina)",
-'tog-rememberpassword' => 'Hasso iyo-ku login gi este na komputadora.',
+'tog-rememberpassword' => 'Hasso iyo-ku login gi este na komputadora (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => "Po'lo i påhina siha ni fina'tinas-hu gi iyo-ku listan pinilan.",
'tog-watchdefault' => "Po'lo i påhina siha ni hu tulaika gi iyo-ku listan pinilan.",
'tog-watchmoves' => "Po'lo i påhina siha ni hu muebi gi iyo-ku listan pinilan.",
@@ -151,9 +151,6 @@ $messages = array(
'qbmyoptions' => 'PÃ¥hina-hu siha',
'qbspecialpages' => 'Manespesiat na påhina',
-# Vector skin
-'vector-namespace-template' => 'Plantiya',
-
'errorpagetitle' => 'Linachi',
'returnto' => 'Hånao tåtte para $1.',
'tagline' => 'Ginen {{SITENAME}}',
@@ -316,7 +313,7 @@ Munga mamalefa tumulaika ga'ña-mu {{SITENAME}}.",
'yourname' => "NÃ¥'an ni muna'setbi:",
'yourpassword' => 'Password:',
'yourpasswordagain' => "Taip ta'lo i password:",
-'remembermypassword' => "Na'hasso iyo-ku login gi este na komputer",
+'remembermypassword' => "Na'hasso iyo-ku login gi este na komputer (for a maximum of $1 {{PLURAL:$1|day|days}})",
'yourdomainname' => 'Lugat-mu:',
'login' => 'Log in',
'nav-login-createaccount' => "HÃ¥lom / fa'tinas kuenta-mu",
@@ -911,7 +908,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Listan pinilan-hu',
'mywatchlist' => 'Listan pinilan-hu',
-'watchlistfor' => "(para '''$1''')",
'addedwatch' => "Mapo'lo gi listan pinilan",
'addedwatchtext' => "Mana'suha i påhina \"[[:\$1]]\" para iyo-mu [[Special:Watchlist|Listan pinilan]].
I tinilaika siha mo'na gi tiempo kontodu i påhinan kombetsasion siha para u fana'lista guihi, yan para u '''na'potpot''' i påhina gi halom [[Special:RecentChanges|i listan tinilaika gi halacha]] para un ayek ha' mas libianu.",
@@ -1119,9 +1115,9 @@ Ayek fan otru nå'an-ña.",
'nextdiff' => "Mamaila' na dif →",
# Media information
-'file-info-size' => '($1 × $2 na pixel, mineddong atkibu: $3, MIME klåsi: $4)',
+'file-info-size' => '$1 × $2 na pixel, mineddong atkibu: $3, MIME klåsi: $4',
'file-nohires' => "<small>TÃ¥ya' mas takhilo' na risolusion.</small>",
-'svg-long-desc' => '(Atkibu SVG, $1 × $2 na pixels, mineddong atkibu: $3)',
+'svg-long-desc' => 'Atkibu SVG, $1 × $2 na pixels, mineddong atkibu: $3',
'show-big-image' => 'Magåhet mineddong-ña',
'show-big-image-thumb' => '<small>Mineddong i ripasu: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesCkb.php b/languages/messages/MessagesCkb.php
index e91f6633..93c4c786 100644
--- a/languages/messages/MessagesCkb.php
+++ b/languages/messages/MessagesCkb.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Aras Noori
* @author Arastein
* @author Asoxor
* @author Cyrus abdi
@@ -15,7 +16,137 @@
* @author رزگار
*/
-$fallback = 'ckb-arab';
+$linkPrefixExtension = true;
+$fallback8bitEncoding = 'windows-1256';
+
+$rtl = true;
+$defaultUserOptionOverrides = array(
+ # Swap sidebar to right side by default
+ 'quickbar' => 2,
+ # Underlines seriously harm legibility. Force off:
+ 'underline' => 0,
+);
+
+$digitTransformTable = array(
+ '0' => 'Ù ', # &#x0660;
+ '1' => 'Ù¡', # &#x0661;
+ '2' => 'Ù¢', # &#x0662;
+ '3' => 'Ù£', # &#x0663;
+ '4' => 'Ù¤', # &#x0664;
+ '5' => 'Ù¥', # &#x0665;
+ '6' => 'Ù¦', # &#x0666;
+ '7' => 'Ù§', # &#x0667;
+ '8' => 'Ù¨', # &#x0668;
+ '9' => 'Ù©', # &#x0669;
+ '.' => 'Ù«', # &#x066b; wrong table ?
+ ',' => 'Ù¬', # &#x066c;
+);
+
+$namespaceNames = array(
+ NS_MEDIA => 'میدیا',
+ NS_SPECIAL => 'تایبەت',
+ NS_MAIN => '',
+ NS_TALK => 'وتووێژ',
+ NS_USER => 'بەکارھێنەر',
+ NS_USER_TALK => 'لێدوانی_بەکارھێنەر',
+ NS_PROJECT_TALK => 'لێدوانی_$1',
+ NS_FILE => 'Ù¾Û•Ú•Ú¯Û•',
+ NS_FILE_TALK => 'وتووێژی_پەڕگە',
+ NS_MEDIAWIKI => 'میدیاویکی',
+ NS_MEDIAWIKI_TALK => 'وتووێژی_میدیاویکی',
+ NS_TEMPLATE => 'داڕێژە',
+ NS_TEMPLATE_TALK => 'وتووێژی_داڕێژە',
+ NS_HELP => 'یارمەتی',
+ NS_HELP_TALK => 'وتووێژی_یارمەتی',
+ NS_CATEGORY => 'Ù¾Û†Ù„',
+ NS_CATEGORY_TALK => 'وتووێژی_پۆل',
+);
+
+$namespaceAliases = array(
+ 'لێدوان' => NS_TALK,
+ 'قسەی_بەکارھێنەر' => NS_USER_TALK,
+ 'لێدوانی_پەڕگە' => NS_FILE_TALK,
+ 'لێدوانی_میدیاویکی' => NS_MEDIAWIKI_TALK,
+ 'قاڵب' => NS_TEMPLATE,
+ 'لێدوانی_قاڵب' => NS_TEMPLATE_TALK,
+ 'لێدوانی_داڕێژە' => NS_TEMPLATE_TALK,
+ 'لێدوانی_یارمەتی' => NS_HELP_TALK,
+ 'لێدوانی_پۆل' => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'ڕەوانکەرە_دووپاتکراوەکان' ),
+ 'BrokenRedirects' => array( 'ڕەوانکەرە_شکاوەکان' ),
+ 'Userlogin' => array( 'چوونەژوورەوەی_بەکارھێنەر' ),
+ 'CreateAccount' => array( 'ھەژمار_دروستکردن' ),
+ 'Preferences' => array( 'ھەڵبژاردەکان' ),
+ 'Watchlist' => array( 'لیستی_چاودێری' ),
+ 'Recentchanges' => array( 'دوایین_گۆڕانکارییەکان' ),
+ 'Upload' => array( 'بارکردن' ),
+ 'Listfiles' => array( 'لیستی_پەڕگەکان' ),
+ 'Newimages' => array( 'پەڕگە_نوێکان' ),
+ 'Listusers' => array( 'لیستی_بەکارھێنەران' ),
+ 'Statistics' => array( 'ئامارەکان' ),
+ 'Randompage' => array( 'ھەڵکەوت،پەڕەی_بە_ھەرمەکی' ),
+ 'Lonelypages' => array( 'پەڕە_تاکەکان،_پەڕە_ھەتیوکراوەکان' ),
+ 'Uncategorizedpages' => array( 'پەڕە_پۆلێننەکراوەکان' ),
+ 'Uncategorizedcategories' => array( 'پۆلە_پۆلێننەکراوەکان' ),
+ 'Uncategorizedimages' => array( 'پەڕگە_پۆلێننەکراوەکان،_وێنە_پۆلێننەکراوەکان' ),
+ 'Uncategorizedtemplates' => array( 'داڕێژە_پۆلێننەکراوەکان' ),
+ 'Unusedcategories' => array( 'پۆلە_بەکارنەھێنراوەکان' ),
+ 'Unusedimages' => array( 'پەڕگە_بەکارنەھێنراوەکان،_وێنە_بەکارنەھێنراوەکان' ),
+ 'Wantedpages' => array( 'پەڕە_پێویستەکان،_بەستەرە_شکاوەکان' ),
+ 'Wantedcategories' => array( 'پۆلە_پێویستەکان' ),
+ 'Wantedfiles' => array( 'پەڕگە_پێویستەکان' ),
+ 'Wantedtemplates' => array( 'داڕێژە_پێویستەکان' ),
+ 'Mostlinked' => array( 'پەڕەکانی_زیاترین_بەستەردراون،_زیاترین_بەستەردراون' ),
+ 'Mostlinkedcategories' => array( 'پۆلەکانی_زیاترین_بەستەردراون،_پۆلەکانی_زیاترین_بەکارھێنراون' ),
+ 'Mostlinkedtemplates' => array( 'داڕێژەکانی_زیاترین_بەستەردراون،_داڕێژەکانی_زیاترین_بەکارھێنراون' ),
+ 'Mostimages' => array( 'پەڕگەکانی_زیاترین_بەستەردراون،_زیاترین_پەڕگەکان،_زیاترین_وێنەکان' ),
+ 'Mostcategories' => array( 'زیاترین_پۆلەکان' ),
+ 'Mostrevisions' => array( 'زیاترین_پێداچوونەوەکان' ),
+ 'Fewestrevisions' => array( 'کەمترین__پێداچوونەوەکان' ),
+ 'Shortpages' => array( 'پەڕە‌_کورتەکان' ),
+ 'Longpages' => array( 'پەڕە_درێژەکان' ),
+ 'Newpages' => array( 'پەڕە_نوێکان' ),
+ 'Ancientpages' => array( 'پەڕە_کۆنەکان' ),
+ 'Deadendpages' => array( 'پەڕە_بەربەستراوەکان' ),
+ 'Protectedpages' => array( 'پەڕە_پارێزراوەکان' ),
+ 'Protectedtitles' => array( 'بابەتە_پارێزراوەکان' ),
+ 'Allpages' => array( 'ھەموو_پەڕەکان' ),
+ 'Unblock' => array( 'کردنەوە' ),
+ 'Specialpages' => array( 'پەڕە_تایبەتەکان' ),
+ 'Contributions' => array( 'بەشدارییەکان' ),
+ 'Emailuser' => array( 'ئیمەیل_بەکارھێنەر' ),
+ 'Confirmemail' => array( 'بڕواکردن_ئیمەیل' ),
+ 'Whatlinkshere' => array( 'چی_بەستەری_داوە_بێرە' ),
+ 'Movepage' => array( 'پەڕە_گواستنەوە' ),
+ 'Categories' => array( 'پۆلەکان' ),
+ 'Export' => array( 'ھەناردن' ),
+ 'Version' => array( 'وەشان' ),
+ 'Allmessages' => array( 'ھەموو_پەیامەکان' ),
+ 'Log' => array( 'Ù„Û†Ú¯' ),
+ 'Mypage' => array( 'Ù¾Û•Ú•Û•Ú©Û•Ù…' ),
+ 'Mytalk' => array( 'لێدوانەکانم' ),
+ 'Mycontributions' => array( 'بەشدارییەکانم' ),
+ 'Listadmins' => array( 'لیستی_بەڕێوبەران' ),
+ 'Listbots' => array( 'لیستی_بۆتەکان' ),
+ 'Popularpages' => array( 'پەڕە_ناودارەکان' ),
+ 'Search' => array( 'گەڕان' ),
+ 'Resetpass' => array( 'تێپەڕوشەگۆڕان،_تێپەڕەوشە_ڕێکخستنەوە' ),
+ 'Activeusers' => array( 'بەکارھێنەرە_چالاکەکان' ),
+);
+
+$magicWords = array(
+ 'img_thumbnail' => array( '1', 'ÙˆÛŽÙ†Û†Ú©', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'ڕاست', 'right' ),
+ 'img_left' => array( '1', 'Ú†Û•Ù¾', 'left' ),
+ 'img_width' => array( '1', '$1پیکسڵ', '$1px' ),
+ 'img_center' => array( '1', 'ناوەڕاست', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'چوارچێوە', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'بێچوارچێوە', 'frameless' ),
+ 'img_border' => array( '1', 'سنوور', 'border' ),
+);
$messages = array(
# User preference toggles
@@ -33,8 +164,7 @@ $messages = array(
'tog-editsection' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی بەستەرەکانی [دەستکاری]',
'tog-editsectiononrightclick' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی کلیکی ڕاست کردن لەسەر سەردێڕی بەشەکان (JavaScript پێویستە)',
'tog-showtoc' => 'پێرستی ناوەڕۆک نیشان بدە (بۆ ئەو پەڕانە کە زیاتر لە ٣ سەردێڕیان تێدایە)',
-'tog-rememberpassword' => 'چوونەژوورەوەم لەسەر ئەم کۆمپییتەرە لەبیرت ببێ',
-'tog-editwidth' => 'چوراچێوە دەستکاری پان کەرەوە تا سەرانسەری شاشەکە پڕ کاتەوە',
+'tog-rememberpassword' => 'چوونە ژوورەوەم لەسەر ئەم وێبگەڕە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
'tog-watchcreations' => 'ئەو پەڕانە کە من دروستم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
'tog-watchdefault' => 'ئەو پەڕانە کە من دەستکاریم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
'tog-watchmoves' => 'ئەو پەڕانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم',
@@ -178,31 +308,21 @@ $messages = array(
'faqpage' => 'Project:پرسیار و وەڵام',
# Vector skin
-'vector-action-addsection' => 'بابەت دابنێ',
-'vector-action-delete' => 'بیسڕەوە',
-'vector-action-move' => 'بیگوازەوە',
-'vector-action-protect' => 'بیپارێزە',
-'vector-action-undelete' => 'سڕینەوە بگەڕێنەوە',
-'vector-action-unprotect' => 'مەیپارێزە',
-'vector-namespace-category' => 'Ù¾Û†Ù„',
-'vector-namespace-help' => 'پەڕەی یارمەتی',
-'vector-namespace-image' => 'Ù¾Û•Ú•Ú¯Û•',
-'vector-namespace-main' => 'Ù¾Û•Ú•Û•',
-'vector-namespace-media' => 'پەڕەی میدیا',
-'vector-namespace-mediawiki' => 'پەیام',
-'vector-namespace-project' => 'پەڕەی پرۆژە',
-'vector-namespace-special' => 'پەڕەی تایبەت',
-'vector-namespace-talk' => 'وتووێژ',
-'vector-namespace-template' => 'داڕێژە',
-'vector-namespace-user' => 'پەڕەی بەکارھێنەر',
-'vector-view-create' => 'درووستکردن',
-'vector-view-edit' => 'دەستکاریی بکە',
-'vector-view-history' => 'مێژووەکەی ببینە',
-'vector-view-view' => 'بیخوێنەوە',
-'vector-view-viewsource' => 'سەرچاوەکەی ببینە',
-'actions' => 'کردارەکان',
-'namespaces' => 'شوێنناوەکان',
-'variants' => 'شێوەزارەکان',
+'vector-action-addsection' => 'بابەت دابنێ',
+'vector-action-delete' => 'بیسڕەوە',
+'vector-action-move' => 'بیگوازەوە',
+'vector-action-protect' => 'بیپارێزە',
+'vector-action-undelete' => 'سڕینەوە بگەڕێنەوە',
+'vector-action-unprotect' => 'مەیپارێزە',
+'vector-simplesearch-preference' => 'ڕێگە بدە بە پێشنیارەکانی گەڕانی پێشکەوتوو (تەنیا بۆ پێستەی ڤێکتۆر)',
+'vector-view-create' => 'درووستکردن',
+'vector-view-edit' => 'دەستکاریی بکە',
+'vector-view-history' => 'مێژووەکەی ببینە',
+'vector-view-view' => 'بیخوێنەوە',
+'vector-view-viewsource' => 'سەرچاوەکەی ببینە',
+'actions' => 'کردارەکان',
+'namespaces' => 'شوێنناوەکان',
+'variants' => 'شێوەزارەکان',
'errorpagetitle' => 'Ú¾Û•ÚµÛ•',
'returnto' => 'بگەڕێوە بۆ $1.',
@@ -430,6 +550,7 @@ $2',
'yourname' => 'ناوی بەکارھێنەری:',
'yourpassword' => 'تێپەڕوشە:',
'yourpasswordagain' => 'تێپه‌ڕه‌وشه‌ دووباره:‌',
+'remembermypassword' => 'چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
'yourdomainname' => 'ناوی دۆمه‌ینی خۆت',
'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
'login' => 'بچۆ ژوورەوە',
@@ -446,6 +567,7 @@ $2',
'gotaccount' => "خاوه‌نی هه‌ژماری خۆتی؟ '''$1'''.",
'gotaccountlink' => 'چوونه‌ ژووره‌وه‌',
'createaccountmail' => 'بە ئیمەیل',
+'createaccountreason' => 'هۆکار:',
'badretype' => 'تێپەڕوشەکان لەیەک ناچن.',
'userexists' => 'ئەو ناوەی تۆ داوتە پێشتر کەسێکی دیکە بەکاری بردووە.
ناوێکی دیکە ھەڵبژێرە.',
@@ -559,9 +681,12 @@ $2',
'showdiff' => 'گۆڕانکارییەکان نیشان بدە',
'anoneditwarning' => "'''ھۆشیار بە:''' نەچوویتەتە ژوورەوە.
ئەدرەسی IPی تۆ لە مێژووی دەستکارییەکانی ئەم پەڕەدا تۆماردەکرێت.",
+'anonpreviewwarning' => '«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»',
'missingsummary' => "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.
ئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
'missingcommenttext' => 'تکایە لە خوارەوە شرۆڤەیەک بنووسە.',
+'missingcommentheader' => "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.
+ئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
'summary-preview' => 'پێشبینینی کورتە:',
'subject-preview' => 'پێشبینینی بابەت\\سەردێڕ :',
'blockedtitle' => 'به‌کار هینه‌ر له‌کار خراوه',
@@ -633,6 +758,12 @@ $2',
'''هێشتا پاشه‌که‌وت نه‌بووه !'''",
'userjspreview' => "'''لەیادت بێ کە ئێستە تەنها پێشبینین\\تاقی‌کردنەوەی جاڤاسکریپتی بەکارهێنەریەکەت دەکەی.'''
'''هێشتا پاشەکەوت نەبووه !'''",
+'sitecsspreview' => "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی ئەم CSS ده‌که‌ی.'''
+'''هێشتا پاشه‌که‌وت نه‌کراوە !'''",
+'sitejspreview' => "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی ئەم کۆدی جاڤاسکریپتە ده‌که‌ی.'''
+'''هێشتا پاشه‌که‌وت نه‌کراوە !'''",
+'userinvalidcssjstitle' => "'''ئاگادارکردنەوە:''' پێست نیە بۆ \"\$1\".
+لەیادت بێ کە لاپەڕەکانی‌ .css و .js لە بابەت بە پیتی بچووک کەڵک وەر ئەگرن. وەک {{ns:user}}:Foo/vector.css نە وەک {{ns:user}}:Foo/Vector.css .",
'updated' => '(نوێ‌کراوە)',
'note' => "'''تێبینی:'''",
'previewnote' => "'''لە بیرت بێت کە ئەمە تەنھا پێشبینینە.'''
@@ -674,9 +805,6 @@ $2',
ئەگەر ناتەوێ نووسراوەکانت بێبەزەیی دەستکاری بکرێن، ھەر مەینێرە بۆ ئێرە.<br />
ھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە (سەیری $1 بکە بۆ وردەکاریەکان).
'''ئەو کارانە Ú©Û• ماÙÛŒ لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
-'longpagewarning' => "'''ئاگاداری:''' درێژاییی ئەم پەڕە $1 کیلوبایتە؛
-بڕێ لە وێبگەڕەکان لەگەڵ دەستکاری کردنی ئەو پەڕانە کە نزیک یان درێژتر لە ٣٢ کیلوبایتن کێشەیان ھەیە.
-تکایە لەت کردنی ئەم پەڕە بۆ چەند بەشی چکۆلەترتان لەبەرچاو بێت.",
'longpageerror' => "'''هەڵە: ئەو دەقی ناردووتە $1 کیلوبایت درێژەی هەیە، کە لە زۆرینەی $2 کیلۆبایت درێژترە.'''<br />
پاشەکەوت ناکرێت.",
'readonlywarning' => "'''ئاگاداری: بنکەدراوە بۆ چاکردنەوە داخراوە، بۆیە ئێستا ناتوانی دەستکاریەکانت پاشەکەوت بکەیت.'''<br />
@@ -842,6 +970,8 @@ $1",
'logdelete-failure' => "'''بیندرانی لۆگ داناندرێت:'''
$1",
'revdel-restore' => 'چۆنیەتی دەرکەوتن بگۆڕە',
+'revdel-restore-deleted' => 'پێداچوونەوە سڕاوەکان',
+'revdel-restore-visible' => 'پێداچوونەوە دەرکەوتووەکان',
'pagehist' => 'مێژووی پەڕە',
'deletedhist' => 'مێژوو بسڕەوە',
'revdelete-content' => 'ناوەڕۆک',
@@ -906,10 +1036,12 @@ $1",
# Diffs
'history-title' => 'مێژووی پیاچوونەوەکانی «$1»',
'difference' => '(جیاوازی نێوان پیاچوونەوەکان)',
+'difference-multipage' => '(جیاوازی نێوان پەڕەکان)',
'lineno' => 'ھێڵی $1:',
'compareselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان ھەڵسەنگێنە',
'showhideselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان نیشانبدە/بشارەوە',
'editundo' => 'پووچەڵ‌کردنەوە',
+'diff-multi' => '({{PLURAL:$1|پیاچوونەوەیەکی نێوانی|$1 پیاچوونەوەی نێوانی}}ی {{PLURAL:$2|بەکارھێنەرێک|$2 بەکارھێنەر}} نیشان نەدراوە)',
# Search results
'searchresults' => 'ئەنجامەکانی گەڕان',
@@ -1093,7 +1225,7 @@ $1",
'prefs-advancedrendering' => 'هەڵبژاردە پێشکەوتووەکان',
'prefs-advancedsearchoptions' => 'هەڵبژاردە پێشکەوتووەکان',
'prefs-advancedwatchlist' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-display' => 'ھەڵبژاردەکان نیشانبدە',
+'prefs-displayrc' => 'هەڵبژاردەکانی نیشان‌دان',
'prefs-diffs' => 'جیاوازییەکان',
# User rights
@@ -1199,7 +1331,6 @@ $1",
'right-siteadmin' => 'داخستن و کردنەوەی بنکەدراو',
'right-reset-passwords' => 'ڕیکخستنەوەی تێپەڕوشەی بەکارهێنەرانی دیکە',
'right-override-export-depth' => 'هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت',
-'right-versiondetail' => 'نیشان‌دانی زانیاریەکانی وەشانی بڵاوەی نەرم‌ئامێر',
# User rights log
'rightslog' => 'Ù„Û†Ú¯ÛŒ ماÙەکانی بەکارھێنەر',
@@ -1249,14 +1380,9 @@ $1",
'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
'recentchangestext' => 'دواکەوتنی دوایین گۆڕانکارییەکان لەسەر ویکی لەم لاپەڕەدا.',
'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە Ù„Û•Ù… «Ùید»ەوە.',
-'recentchanges-label-legend' => 'پێرست: $1.',
-'recentchanges-legend-newpage' => '$1 - لاپەڕەی نوێ',
'recentchanges-label-newpage' => 'ئەم دەستکاریە لاپەڕەیەکی نوێی درووست‌کرد',
-'recentchanges-legend-minor' => '$1 - دەستکاریی بچووک',
'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
-'recentchanges-legend-bot' => '$1 - دەستکاریی بۆت',
'recentchanges-label-bot' => 'ئەم دەستکاریە لە لایەن بۆتەوە پێک هاتووە',
-'recentchanges-legend-unpatrolled' => '$1 - دەستکاری چاودێری‌نەکراو',
'recentchanges-label-unpatrolled' => 'ئەم دەستکاریە هێشتا نەڕۆشتەتە ژێر چاودێری',
'rcnote' => "لە خوارەوەدا {{PLURAL:$1|'''۱''' گۆڕانکاری |دوایین '''$1''' گۆڕانکارییەکان}} لە دوایین {{PLURAL:$2|ڕۆژ|'''$2''' ڕۆژەوە}} ، تا $5، $4 دەبینن.",
'rcnotefrom' => "ئەوی‌ خوارەوە گۆڕانکارییەکانە لە '''$2'''ەوە (ھەتا '''$1''' نیشاندراو).",
@@ -1303,6 +1429,9 @@ $1",
'upload_directory_missing' => 'لقی بارکردن ($1) ون بووە و ڕاژەکاری‌وێب بۆی درووست ناکرێت.',
'upload_directory_read_only' => 'ڕاژەکاری‌وێب دەسەڵاتی نووسینی سەر لقی بارکردنی ($1) نیە.',
'uploaderror' => 'ھەڵە لە بارکردن دا',
+'upload-recreate-warning' => "'''ھۆشیار بە: پەرگەیەک بەو ناوەوە سڕاوەتەوە یان گوێزاوەتەوە.'''
+
+لۆگی سڕینەوە یان گواستنەوەی ئەم پەڕە لێرە لەبەردەستدایە:",
'uploadtext' => "Ùۆرمی خوارەوە بەکاربێنە بۆ بارکردنی پەڕگەکان.
بۆ بینینی و گەڕان لەو پەڕگانەی پێشتر بار کراون، بڕۆ بۆ [[Special:FileList|لیستی پەڕگە بارکراوەکان]]، ھەروەھا [[Special:Log/upload|ڕەشنووسی بارکردنەکان]] و [[Special:Log/delete|ڕەشنووسی سڕینەوەکان]].
@@ -1337,6 +1466,10 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' جۆرە پەڕگەی ڕێگە پێ‌نەدراوە‌.
\$2، ئەو جۆرە {{PLURAL:\$3|پەڕگەیە|پەڕگانەیە}} وا ڕێگە دراوە.",
'filetype-missing' => 'پەڕگەکە پاشگری نییە (وەک ".jpg").',
+'empty-file' => 'ئەو پەڕگەیە کە ناردووتە ڤاڵا بوو.',
+'file-too-large' => 'ئەو پەڕگەیە ناردووتە زۆر گەورەیە.',
+'filename-tooshort' => 'ناوی پەڕگە زۆر کورتە.',
+'filetype-banned' => 'ئەم جۆرە پەڕگەیە قەدەغەیە.',
'large-file' => 'پێشنیار دەکرێت قەبارەی پەڕگەکان زیاتر لە $1 نەبێت؛
قەبارەی ئەم پەڕگە $2.',
'largefileserver' => 'ئەم پەڕگە گەورەتر لەوەیە کە ڕاژەکار ڕێگەدەدات.',
@@ -1393,6 +1526,12 @@ $1",
لۆگی سڕینەوەی ئەم پەڕگە بۆ ئاسوودەیی لێرە دانراوە:",
'filename-bad-prefix' => "دەستپێکی ناوی ئەو پەڕگەی باری دەکەی '''\"\$1\"'''، کە ناوێکی ناسێنەر نیە؛ ئەو جۆرە ناوە زۆربەی کات کامێرا دیجیتاڵەکان خۆکار بەکاری‌دەبەن.
تکایە ناوێک هەڵبژێرە کە زانیاریی زیاتر بدات سەبارەت بە پەڕگەکەت.",
+'upload-success-subj' => 'بارکردنی سەرکەوتوو',
+'upload-success-msg' => 'بارکردنی [$2] سەرکەوتووانە جێبەجێکرا. لێرە لەبەردەستدایە: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'کێشەی بارکردن',
+'upload-failure-msg' => 'کێشەیەک لەگەڵ بارکردنی [$2]دا ھەبوو:
+
+$1',
'upload-proto-error' => 'پرۆتۆکۆڵی هەڵە',
'upload-proto-error-text' => 'بۆ بارکردن لە تۆڕ، URL دەبێ بە <code>http://</code> یان <code>ftp://</code> دەست‌پێ‌بکات.',
@@ -1435,6 +1574,7 @@ $1",
'listfiles_search_for' => 'بگەڕێ بۆ ناوی میدیای:',
'imgfile' => 'Ù¾Û•Ú•Ú¯Û•',
'listfiles' => 'لیستی پەرگەکان',
+'listfiles_thumb' => 'ÙˆÛŽÙ†Û†Ú©',
'listfiles_date' => 'ڕێکەوت',
'listfiles_name' => 'ناو',
'listfiles_user' => 'بەکارھێنەر',
@@ -1551,7 +1691,6 @@ $1",
'statistics-edits-average' => 'نێونجی ژمارەی دەستکارییەکان لە پەڕەیەک دا',
'statistics-views-total' => 'دیتنی هەموو',
'statistics-views-peredit' => 'دیتنی هەر دەستکارییەک',
-'statistics-jobqueue' => 'درێژی [http://www.mediawiki.org/wiki/Manual:Job_queue ڕیزی کار]',
'statistics-users' => '[[Special:ListUsers|بەکارھێنەر]]ە تۆمارکراوەکان',
'statistics-users-active' => 'ئەندامە چالاکەکان',
'statistics-users-active-desc' => 'ئەو بەکارھێنەرانە کە لە {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}ی ڕابردوودا کارێکیان جێبەجێ کردبێت.',
@@ -1564,6 +1703,9 @@ $1",
ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەیە بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە مامەڵەی لەگەڵدا دەکرێ.",
'doubleredirects' => 'دووجار ڕەوانەکراوەکان',
+'doubleredirectstext' => 'ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.
+هەر ڕیزێک، بەستەرەکانی یەکەم و دووەم ڕەوانەکراو و ھەروەھا ئامانجی ڕەوانەکراوی دووەم کە زۆربەی کات مەبەستی «ڕاستی»یە کە ڕەوانەکراوی یەکەمیش دەبێ بۆ ئەوێ ڕەوانە بکاتی لەخۆگرتووە.
+دراوە <del>هێڵ بەسەردا کێشراوەکان</del> چارەسەر کراون.',
'double-redirect-fixed-move' => '[[$1]] گوێسترایەوە.
ئێستا ڕەوانکەرە بۆ [[$2]].',
'double-redirect-fixer' => 'چارەسەرکەری ڕەوانکەر',
@@ -1768,7 +1910,6 @@ $1",
# Watchlist
'watchlist' => 'لیستی چاودێرییەکانم',
'mywatchlist' => 'لیستی چاودێرییەکانم',
-'watchlistfor' => "(بۆ '''$1''')",
'nowatchlist' => 'لە لیستی چاودێڕییەکانتدا ھیچ نیە.',
'watchlistanontext' => 'تکایە بۆ دیتن و دەستکاری بابەتەکانی لە ناو لیستی چاودێریەکەت‌دا $1.',
'watchnologin' => 'لە ژوورەوە نیت.',
@@ -1887,7 +2028,9 @@ $UNWATCHURL
'revertpage' => 'گەڕاندنەوەی دەستکارییەکان لەلایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین دەستکاریی [[User:$1|$1]]',
'rollback-success' => 'دەستکارییەکانی $1 وەرگێرایەوە؛<br />
گۆڕدرا بۆ دوایین دەستکاریی $2.',
-'sessionfailure' => 'لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.
+
+# Edit tokens
+'sessionfailure' => 'لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.
ئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.
تکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.',
@@ -2025,11 +2168,13 @@ $1',
'sp-contributions-newbies-title' => 'هاوبەشیەکانی بەکارهێنەر بۆ هەژمارە نوێکان',
'sp-contributions-blocklog' => 'لۆگی بەربەستن',
'sp-contributions-deleted' => 'بەشدارییە سڕاوەکان',
+'sp-contributions-uploads' => 'بارکردنەکان',
'sp-contributions-logs' => 'تۆمارەکان',
'sp-contributions-talk' => 'لێدوان',
'sp-contributions-userrights' => 'بەڕێوبەرایەتی ماÙەکانی بەکارهێنەر',
'sp-contributions-search' => 'گەڕین بۆ بەشدارییەکان',
'sp-contributions-username' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارھێنەری:',
+'sp-contributions-toponly' => 'تەنیا ئەو دەستکارییانە نیشانبدە کە دوایین پیاچوونەوەن',
'sp-contributions-submit' => 'بگەڕێ',
# What links here
@@ -2090,7 +2235,6 @@ $1',
'ipb-edit-dropdown' => 'دەستکاری هۆکارەکانی بەربەست',
'ipb-unblock-addr' => 'لە بەربەست‌دەرهێنانی $1',
'ipb-unblock' => 'لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی',
-'ipb-blocklist-addr' => 'ئەو بەربەستانەی بۆ $1 هەیە',
'ipb-blocklist' => 'دیتنی ئەو بەربەستانەی وا هەیە',
'ipb-blocklist-contribs' => 'هاوبەشیەکان بۆ $1',
'unblockip' => 'لە بەربەست‌دەرهێنانی بەکارهێنەر',
@@ -2195,6 +2339,17 @@ $1',
'''ھۆشیار بە!'''
ئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕێنەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛
تکایە پێش گۆڕینی ناو باش بیر لە ئاکامەکەی بکەوە.",
+'movepagetext-noredirectfixer' => "بەکارھێنانی ئەم Ùۆرمەی خوارەوە ناوی پەڕەیەک دەگۆڕێت، بە گواستنەوەی ھەموو مێژووەکەی بۆ ناوی نوێ.
+ناوە کۆنەکە دەبێتە پەڕەیەکی ڕەوانەکردنەوە بۆ ناوە نوێکە.
+دڵنیا بە کە [[Special:DoubleRedirects|دووجار ڕەوانەکراوەکان]] یان [[Special:BrokenRedirects|ڕەوانەکراوە شکاوەکان]] تاقی بکەیتەوە.
+تۆ بەرپرسیاری لەوەی کە دڵنیا ببیتەوە بەستەرەکان ھەر پێوەندییان ھەیە بەو شوێنە کە چاوەڕوان دەکرێت.
+
+دەبێت بزانی کە پەڕەکە '''ناگوازرێتەوە''' ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە پەڕەکە واڵا یان ڕەوانەکراوەیەک بێت و ھیچ مێژووی گۆڕاندنی پێشووی نەبێت.
+ئەمە بەو واتایە کە ئەگەر ھەڵەیەک بکەی دەتوانی ناوی پەڕەکە دیسانەوە بگۆڕی بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ھەنووکە ھەیە.
+
+'''ھۆشیار بە!'''
+ئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕێنەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛
+تکایە پێش گۆڕینی ناو باش بیر لە ئاکامەکەی بکەوە.",
'movepagetalktext' => "پەڕەی وتووێژی پەیوەندیداری بە شێوەی خۆکار لەگەڵیدا دەگوازرێتەوە، '''مەگەر:'''
* پەڕەیەکی وتووێژی ناواڵا پێشتر ھەبێت لە ژێر ناوە نوێکەدا، یان
* ئەو چوارچێوەی خوارەوە لێنەدراو بکەی.
@@ -2504,7 +2659,10 @@ $1',
# Media information
'thumbsize' => 'قەبارەی وێنۆک:',
+'file-info' => 'قه‌باره‌: $1, جۆر: $2',
+'file-info-size' => '$1 × $2 پیکسێل، قەبارەی پەڕگە: $3، جۆری MIME: $4',
'file-nohires' => '<small>رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.</small>',
+'svg-long-desc' => 'پەڕگەی SVG، بە ناو $1 × $2 پیکسەڵ، قەبارەی پەڕگە: $3',
'show-big-image' => 'گەورە کردنەوە',
'show-big-image-thumb' => '<small>قەبارەی ئەم پێشبینینە: $1 × $2 خاڵە</small>',
@@ -2689,30 +2847,30 @@ $1',
'limitall' => 'ھەموو',
# E-mail address confirmation
-'confirmemail' => 'بڕواپێکردنی ناونیشانی ئیمەیل',
-'confirmemail_noemail' => 'لە [[Special:Preferences|هەڵبژاردەکانی بەکارهێنەر]] ناونیشانی ئی‌مەیلی گونجاوت دیاری نەکردووە.',
-'confirmemail_text' => '{{SITENAME}} بە پێویستی دەزانێ پێش کەڵک وەرگرتن لە تایبەتمەندیەکانی ئی‌مەیل، ناونیشانی ئی‌مەیلی خۆت ڕاچاو بکەیت.
+'confirmemail' => 'بڕواپێکردنی ناونیشانی ئیمەیل',
+'confirmemail_noemail' => 'لە [[Special:Preferences|هەڵبژاردەکانی بەکارهێنەر]] ناونیشانی ئی‌مەیلی گونجاوت دیاری نەکردووە.',
+'confirmemail_text' => '{{SITENAME}} بە پێویستی دەزانێ پێش کەڵک وەرگرتن لە تایبەتمەندیەکانی ئی‌مەیل، ناونیشانی ئی‌مەیلی خۆت ڕاچاو بکەیت.
ئەو دوکمەی خوارەوە چالاک بکە تاکوو ئی‌مەیلێکی بڕوا پێ‌کردن بنێردرێت بۆ ناونیشانی ئی‌مەیلەکەت.
ئەو ئی‌مەیلە بەستەرەکی تێدایە؛ لە وێبگەڕەکەت ئەو بەستەرە ببینە تاکوو ناونیشانی ئی‌مەیلەکەت بڕوادار بێت.',
-'confirmemail_pending' => 'کۆدی بڕواپێ‌کردن لە پێش‌دا ئی‌مەیل کراوە بۆت.
+'confirmemail_pending' => 'کۆدی بڕواپێ‌کردن لە پێش‌دا ئی‌مەیل کراوە بۆت.
ئەگەر بە تازەیی هەژمارەت درووست‌کردووە، لەوانەیە باشتربێت چەن خۆلکێک بوەستی بۆ گەیشتنی ئەو ئەمەیلی، پێش دیسان داواکردنەوەی کۆدی نوێ.',
-'confirmemail_send' => 'ئی‌مەیل‌کردنی کۆدی بڕواپێ‌کردن',
-'confirmemail_sent' => 'ئی‌مەیلی بڕواپێ‌کردن ناردرا.',
-'confirmemail_oncreate' => 'کۆدی بڕواپێ‌کردنی ناردرا بۆ ناونیشانی ئی‌مەیلت.
+'confirmemail_send' => 'ئی‌مەیل‌کردنی کۆدی بڕواپێ‌کردن',
+'confirmemail_sent' => 'ئی‌مەیلی بڕواپێ‌کردن ناردرا.',
+'confirmemail_oncreate' => 'کۆدی بڕواپێ‌کردنی ناردرا بۆ ناونیشانی ئی‌مەیلت.
پێویست نیە بڕۆیتە ژوورەوە، تەنها پێویستە پێش کەڵک وەرگرتن لە تایبەتمەندیەکان ئی‌مەیلیی ویکی ئەوە جێبەجێ بکەیت.',
-'confirmemail_sendfailed' => '{{SITENAME}} ناتوانێ ئی‌مەیلی برواکردن بنێرێت بۆ تۆ.
+'confirmemail_sendfailed' => '{{SITENAME}} ناتوانێ ئی‌مەیلی برواکردن بنێرێت بۆ تۆ.
تکایە ئەرخەیان بە هەموو پیتەکانی ناونیشانەکەت گونجاوە.
مەیلکەر ئەوەی گەڕاندەوە: $1',
-'confirmemail_invalid' => 'کۆدی بڕواپێ‌کردنی نەگونجاو.
+'confirmemail_invalid' => 'کۆدی بڕواپێ‌کردنی نەگونجاو.
لەوانەیە ئەو کۆدە ماوەی بەسەر چووبێت.',
-'confirmemail_needlogin' => 'بۆ بڕواپێ‌کردنی ناونیشانی ئی‌مەیلەکەت، دەبێ $1.',
-'confirmemail_success' => 'ناونیشانی ئی‌میلەکەت بڕوای‌پێ‌کرا.
+'confirmemail_needlogin' => 'بۆ بڕواپێ‌کردنی ناونیشانی ئی‌مەیلەکەت، دەبێ $1.',
+'confirmemail_success' => 'ناونیشانی ئی‌میلەکەت بڕوای‌پێ‌کرا.
ئێستە دەتوانی [[Special:UserLogin|بڕۆیتە ژوورەوە]] و لە ویکی کەڵک بگری.',
-'confirmemail_loggedin' => 'ئێستا بڕواکراوە بە ئیمەیلەکەت.',
-'confirmemail_error' => 'کێشەیەک هەیە لە پاشەکەوت‌کردنی بڕواپێ‌کردنی تۆدا.',
-'confirmemail_subject' => 'بڕوا پێ‌کردنی ناونیشانی ئی‌مەیلی {{SITENAME}}',
-'confirmemail_body' => 'کەسێک، لەوانەیە خۆت، لە ناونیشانی ئای‌پی $1،
+'confirmemail_loggedin' => 'ئێستا بڕواکراوە بە ئیمەیلەکەت.',
+'confirmemail_error' => 'کێشەیەک هەیە لە پاشەکەوت‌کردنی بڕواپێ‌کردنی تۆدا.',
+'confirmemail_subject' => 'بڕوا پێ‌کردنی ناونیشانی ئی‌مەیلی {{SITENAME}}',
+'confirmemail_body' => 'کەسێک، لەوانەیە خۆت، لە ناونیشانی ئای‌پی $1،
لە {{SITENAME}} بەم ناونیشانی ئی‌مەیلە، هەژمارەیەکی تۆمارکردووە "$2" .
بۆ ئەوەی بڕا بکرێت کە ئەم هەژمارە لە ڕاستیدا بۆتۆیە و بۆ چالاک‌کردنی تایبەتمەندیەکانی ئی‌مەیل لە {{SITENAME}}دا، ئەو بەستەرەی خوارەوە لە وێبگەڕەکەت‌دا بکەوە:
@@ -2724,8 +2882,32 @@ $3
$5
ئەم کۆدی بڕواپێ‌کردنە لە $4 ماوەی بەسەردێت.',
-'confirmemail_invalidated' => 'بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە',
-'invalidateemail' => 'هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل',
+'confirmemail_body_changed' => 'کەسێک، لەوانەیە خۆت، لە ئای‌پی ئەدرەسی $1،
+ئەدرەسی ئەیمەیلی ھەژماری «$2» لە {{SITENAME}}دا گۆڕاوە بۆ ئەم ئەدرەسە.
+
+بۆ ئەوەی بڕوا بکرێت کە ئەم ھەژمارە لە ڕاستیدا بۆتۆیە و بۆ چالاککردنەوەی تایبەتمەندیەکانی ئیمەیل لە {{SITENAME}}دا، ئەم بەستەرەی خوارەوە لە وێبگەڕەکەتدا بکەوە:
+
+$3
+
+ئەگەر ھەژمارە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی بڕوا‌پێکردنی ئەدرەسی ئیمەیل بەدوای ئەم بەستەرە بکەوە:
+
+$5
+
+ئەم کۆدی بڕواپێکردنە لە $4 ماوەی بەسەردێت.',
+'confirmemail_body_set' => 'کەسێک، لەوانەیە خۆت، لە ئای‌پی ئەدرەسی $1،
+ئەدرەسی ئەیمەیلی ھەژماری «$2» لە {{SITENAME}}دا کردووە بەم ئەدرەسە.
+
+بۆ ئەوەی بڕوا بکرێت کە ئەم ھەژمارە لە ڕاستیدا بۆتۆیە و بۆ چالاککردنەوەی تایبەتمەندیەکانی ئیمەیل لە {{SITENAME}}دا، ئەم بەستەرەی خوارەوە لە وێبگەڕەکەتدا بکەوە:
+
+$3
+
+ئەگەر ھەژمارە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی بڕوا‌پێکردنی ئەدرەسی ئیمەیل بەدوای ئەم بەستەرە بکەوە:
+
+$5
+
+ئەم کۆدی بڕواپێکردنە لە $4 ماوەی بەسەردێت.',
+'confirmemail_invalidated' => 'بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە',
+'invalidateemail' => 'هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل',
# Scary transclusion
'scarytranscludetoolong' => '[URL زۆر درێژە]',
@@ -2840,6 +3022,7 @@ $5
'version-specialpages' => 'پەڕە تایبەتەکان',
'version-parserhooks' => 'قولاپە لێککەرەکان',
'version-variables' => 'گۆڕاوەکان',
+'version-skins' => 'پێستەکان',
'version-other' => 'ھی دیکە',
'version-mediahandlers' => 'بایەخ‌دەرانی مێدیا',
'version-hooks' => 'قولاپەکان',
@@ -2911,6 +3094,15 @@ $5
'tags-edit' => 'دەستکاری',
'tags-hitcount' => '$1 {{PLURAL:$1|گۆڕان|گۆڕانکاری}}',
+# Special:ComparePages
+'comparepages' => 'پەڕەکان ھەڵسەنگێنە',
+'compare-selector' => 'پیاچوونەوەکانی پەڕە ھەڵسەنگێنە',
+'compare-page1' => 'پەڕەی ١',
+'compare-page2' => 'پەڕەی ٢',
+'compare-rev1' => 'پێداچوونەوەی ١',
+'compare-rev2' => 'پێداچوونەوەی ٢',
+'compare-submit' => 'ھەڵسەنگاندن',
+
# Database error messages
'dberr-header' => 'ئەم ویکی‌یە کێشەی هەیە',
'dberr-problems' => 'ببورە! ئەم ماڵپەڕە ئێستا خەریک ئەزموونێکی کێشەی تەکنیکیە.',
diff --git a/languages/messages/MessagesCkb_arab.php b/languages/messages/MessagesCkb_arab.php
deleted file mode 100644
index f53591a0..00000000
--- a/languages/messages/MessagesCkb_arab.php
+++ /dev/null
@@ -1,2997 +0,0 @@
-<?php
-/** Sorani (Arabic script) (‫کوردی (عەرەبی)‬)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- * @author Aras Noori
- * @author Arastein
- * @author Asoxor
- * @author Cyrus abdi
- * @author Haval
- * @author Marmzok
- * @author رزگار
- */
-
-$linkPrefixExtension = true;
-$fallback8bitEncoding = 'windows-1256';
-
-$rtl = true;
-$defaultUserOptionOverrides = array(
- # Swap sidebar to right side by default
- 'quickbar' => 2,
- # Underlines seriously harm legibility. Force off:
- 'underline' => 0,
-);
-
-$digitTransformTable = array(
- '0' => 'Ù ', # &#x0660;
- '1' => 'Ù¡', # &#x0661;
- '2' => 'Ù¢', # &#x0662;
- '3' => 'Ù£', # &#x0663;
- '4' => 'Ù¤', # &#x0664;
- '5' => 'Ù¥', # &#x0665;
- '6' => 'Ù¦', # &#x0666;
- '7' => 'Ù§', # &#x0667;
- '8' => 'Ù¨', # &#x0668;
- '9' => 'Ù©', # &#x0669;
- '.' => 'Ù«', # &#x066b; wrong table ?
- ',' => 'Ù¬', # &#x066c;
-);
-
-$namespaceNames = array(
- NS_MEDIA => 'میدیا',
- NS_SPECIAL => 'تایبەت',
- NS_MAIN => '',
- NS_TALK => 'لێدوان',
- NS_USER => 'بەکارھێنەر',
- NS_USER_TALK => 'لێدوانی_بەکارھێنەر',
- NS_PROJECT_TALK => 'لێدوانی_$1',
- NS_FILE => 'Ù¾Û•Ú•Ú¯Û•',
- NS_FILE_TALK => 'لێدوانی_پەڕگە',
- NS_MEDIAWIKI_TALK => 'لێدوانی_میدیاویکی',
- NS_TEMPLATE => 'داڕێژە',
- NS_TEMPLATE_TALK => 'لێدوانی_داڕێژە',
- NS_HELP => 'یارمەتی',
- NS_HELP_TALK => 'لێدوانی_یارمەتی',
- NS_CATEGORY => 'Ù¾Û†Ù„',
- NS_CATEGORY_TALK => 'لێدوانی_پۆل',
-);
-
-$namespaceAliases = array(
- 'قسەی_بەکارھێنەر' => NS_USER_TALK,
- 'قاڵب' => NS_TEMPLATE,
- 'لێدوانی_قاڵب' => NS_TEMPLATE_TALK,
-);
-
-$specialPageAliases = array(
- 'CreateAccount' => array( 'ھەژماردروستکردن' ),
- 'Preferences' => array( 'ھەڵبژاردەکان' ),
- 'Recentchanges' => array( 'دوایین‌گۆڕانکارییەکان' ),
- 'Upload' => array( 'بارکردن' ),
- 'Listfiles' => array( 'لیستی‌پەڕگەکان' ),
- 'Newimages' => array( 'پەڕگەنوێکان' ),
- 'Listusers' => array( 'لیستی‌بەکارھێنەران' ),
- 'Statistics' => array( 'ئامارەکان' ),
- 'Randompage' => array( 'بەھەڵکەوت' ),
- 'Shortpages' => array( 'پەڕە‌کورتەکان' ),
- 'Newpages' => array( 'پەڕەنوێکان' ),
- 'Ancientpages' => array( 'پەڕەکۆنەکان' ),
- 'Protectedpages' => array( 'پەڕەپارێزراوەکان' ),
- 'Allpages' => array( 'ھەمووپەڕەکان' ),
- 'Specialpages' => array( 'پەڕەتایبەتەکان' ),
- 'Contributions' => array( 'بەشدارییەکان' ),
- 'Movepage' => array( 'پەڕەگواستنەوە' ),
- 'Categories' => array( 'پۆلەکان' ),
- 'Export' => array( 'ھەناردن' ),
- 'Version' => array( 'وەشان' ),
- 'Allmessages' => array( 'ھەمووپەیامەکان' ),
- 'Log' => array( 'Ù„Û†Ú¯' ),
- 'Mypage' => array( 'Ù¾Û•Ú•Û•Ú©Û•Ù…' ),
- 'Mycontributions' => array( 'بەشدارییەکانم' ),
- 'Listadmins' => array( 'لیستی‌بەڕێوبەران' ),
- 'Search' => array( 'گەڕان' ),
- 'Resetpass' => array( 'تێپەڕوشەگۆڕان' ),
- 'Activeusers' => array( 'بەکارھێنەرەچالاکەکان' ),
-);
-
-$magicWords = array(
- 'img_thumbnail' => array( '1', 'ÙˆÛŽÙ†Û†Ú©', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'ڕاست', 'right' ),
- 'img_left' => array( '1', 'Ú†Û•Ù¾', 'left' ),
- 'img_width' => array( '1', '$1پیکسڵ', '$1px' ),
- 'img_center' => array( '1', 'ناوەڕاست', 'center', 'centre' ),
- 'img_framed' => array( '1', 'چوارچێوە', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'بێچوارچێوە', 'frameless' ),
- 'img_border' => array( '1', 'سنوور', 'border' ),
-);
-
-$messages = array(
-# User preference toggles
-'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
-'tog-highlightbroken' => 'بەستەرە شکاوەکان <a href="" class="new">بەم جۆرە</a> بڕازێنەوە (یان: بەەم جۆرە<a href="" class="internal">؟</a>)',
-'tog-justify' => 'پەرەگراÙەکان پڕاوپر نیشان بدە',
-'tog-hideminor' => 'دەستکارییە بچوکەکان بشارەوە لە دوا گۆڕانکارییەکاندا',
-'tog-hidepatrolled' => 'لە دوایین گۆڕانکاریەکان، دەستکاریە پارێزراوەکان داشارە',
-'tog-newpageshidepatrolled' => 'لە لیستی لاپەڕە نوێکان، لاپەڕە پارێزراوەکان داشارە',
-'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
-'tog-usenewrc' => 'دوا گۆڕانکارییە پەرە پێدراوەکان بەکار ببە (پێویستی بە جاڤاسکریپتە)',
-'tog-numberheadings' => 'ژمارەکردنی خۆکاری سەردێڕەکان',
-'tog-showtoolbar' => 'شریتی ئامرازەکانی دەستکاری نیشان بدە (JavaScript پێویستە)',
-'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکلیک لەسەر دەق (JavaScript پێویستە)',
-'tog-editsection' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگه‌ی به‌سته‌رەکانی [دەستکاری]',
-'tog-editsectiononrightclick' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی کلیکی ڕاست کردن لەسەر سەردێڕی بەشەکان (JavaScript پێویستە)',
-'tog-showtoc' => 'پێرستی ناوەڕۆک نیشان بدە (بۆ ئەو پەڕانە کە زیاتر لە ٣ سەردێڕیان تێدایە)',
-'tog-rememberpassword' => 'چوونەژوورەوەم بەبیربهێنەوە لەسەر ئەم کۆمپیوتەرە',
-'tog-editwidth' => 'چوراچێوە دەستکاری پان کەرەوە تا سەرانسەری شاشەکە پڕ کاتەوە',
-'tog-watchcreations' => 'ئەو پەڕانە کە من دروستم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
-'tog-watchdefault' => 'ئەو پەڕانە کە من دەستکاریم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
-'tog-watchmoves' => 'ئەو پەڕانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم',
-'tog-watchdeletion' => 'ئەو پەڕانە کە‌ من سڕیومنەتەوە زیاد بکە‌ بە لیستی چاودێڕییەکەم',
-'tog-minordefault' => 'ھەموو دەستکارییەکان بە ورد نیشان بکە Ù„Û• حاڵەتی دیÙاڵت',
-'tog-previewontop' => 'پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌',
-'tog-previewonfirst' => 'لە یەکەم دەستکاری دا پێشبینین نیشان بدە',
-'tog-nocache' => 'کەش کردنی (cach) پەڕەکان لە کار بخە',
-'tog-enotifwatchlistpages' => 'ئەگەر پەڕەیەکی لە لیستی چاودێڕییەکانم گۆڕدرا ئیمەیلم بۆ بنێرە',
-'tog-enotifusertalkpages' => 'ئەگەر پەڕەی وتووێژەکەم گۆڕدرا ئیمەیلم بۆ بنێرە',
-'tog-enotifminoredits' => 'بۆ گۆڕانکارییە بچووکەکانی پەڕەکانیش ئیمەیلم بۆ بنێرە',
-'tog-enotifrevealaddr' => 'ئەدرەسی ئیمەیلەکەم لە ئیمەیلە ئاگاداریدەرەکان دا نیشان بدە',
-'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
-'tog-oldsig' => 'پێش‌بینینی ئەو واژۆی وا هەیە:',
-'tog-fancysig' => 'وەک دەقی ویکی ئیمزا بەرچاو خە (بێ بەستەری خۆکار بۆ پەڕەی بەکارھێنەر)',
-'tog-externaleditor' => 'دەستکاریکەری دەرەکی بە کار بێنە Ù„Û• حاڵەتی دیÙاڵتدا (تەنھا بۆ شارەزایان، تەنزیماتی تایبەتی پێویستە Ù„Û• سەر کۆمپیوتەرەکەت)',
-'tog-externaldiff' => 'کەڵک وەرگرتن لە پرۆگرامێکی دەرەکی بۆ دیتنی جیاوازیەکان لە بنەڕەتەوە (تەنها بۆ بەکارهێنانی پێشکەوتوو، پێویستی بە ئامرازی تایبەت لە سەر کۆمپیوتەرت هەیە)',
-'tog-showjumplinks' => 'ڕێگە بدە بۆ بەستەرەکانی «{{int:jumpto}}»',
-'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری‌)',
-'tog-forceeditsummary' => 'ئەگەر پوختەی دەستکاریم نەنووسی پێم بڵێ',
-'tog-watchlisthideown' => 'دەستکارییەکانم بشارەوە لە لیستی چاودێری',
-'tog-watchlisthidebots' => 'دەستکارییەکانی بات بشارەوە لە لیستی چاودێری',
-'tog-watchlisthideminor' => 'دەستکارییە بچووکەکان لە لیستی چاودێریدا بشارەوە',
-'tog-watchlisthideliu' => 'دەستکارییەکانی ئەو بەکارهێنەرانەی لە ژوورەوەن بشارەوە لە لیستی چاودێری',
-'tog-watchlisthideanons' => 'دەستکارییەکانی بەکارهێنەرانی نەناسراو بشارەوە لە لیستی چاودێری',
-'tog-watchlisthidepatrolled' => 'لە لیستی چاودێریەکان، دەستکاریە پارێزراوەکان داشارە',
-'tog-nolangconversion' => 'لەکارخستنی ئاڵوگۆڕەکانی شێوەزار',
-'tog-ccmeonemails' => 'کۆپییەکانی ئەو ئیمەیلانە کە بۆ بەکارھێنەرانی ترم ناردووە بۆ خۆشم بنێرە',
-'tog-diffonly' => 'ناوەڕۆکی پەڕە لەژێر جیاوازییەکان نیشان مەدە',
-'tog-showhiddencats' => 'ھاوپۆلە شاراوەکان نیشان بدە',
-'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
-'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
-
-'underline-always' => 'ھەمیشە',
-'underline-never' => 'ھەرگیز',
-'underline-default' => 'دیÙاڵتی وێبگەڕەکە',
-
-# Font style option in Special:Preferences
-'editfont-style' => 'شێوازی جۆرەپیتی بەشی دەستکاری:',
-'editfont-default' => 'بنچینەی وێبگەڕ',
-'editfont-monospace' => 'جۆرەپیتی تاکەبۆشایی (Monospaced)',
-'editfont-sansserif' => 'جۆرەپیتی Sans-serif',
-'editfont-serif' => 'جۆرەپیتی Serif',
-
-# 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' => 'ئابی',
-'september-gen' => 'ئەیلولی',
-'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' => 'ژێرھاوپۆلەکان',
-'category-media-header' => 'میدیا له‌ هاوپۆلی "$1" دا',
-'category-empty' => "''ئەم ھاوپۆلە ھەنووکە ھیچ پەڕە یان پەڕگەیەک لە خۆ ناگرێت.‌''",
-'hidden-categories' => '{{PLURAL:$1|ھاوپۆلی شاراوە|ھاوپۆلی شاراوە}}',
-'hidden-category-category' => 'هاوپۆلە شاردراوەکان',
-'category-subcat-count' => '{{PLURAL:$2|ئەم پۆلە تەنھا ژێرپۆلی خوارەوەی تێدایە.| ئەم پۆلە ئەم {{PLURAL:$1|ژێرپۆلەی|$1 ژێرپۆلانەی}} خوارەوەی تێدایە، لە کۆی سەرجەم $2 دانە.}}',
-'category-subcat-count-limited' => 'ئەم هاوپۆلە {{PLURAL:$1|ژێرهاوپۆلی}} لەخۆ گرتووە.',
-'category-article-count' => '{{PLURAL:$2|ئەم پۆلە تەنھا ئەم پەڕەی لەخۆگرتووە.|{{PLURAL:$1|پەڕە|$1 پەڕە}} لەم پۆلەدا، لە سەرجەم $2 پەڕە.}}',
-'category-article-count-limited' => 'ئەم {{PLURAL:$1|لاپەڕە|$1 لاپەڕانە}}، لەم هاوپۆلەدان.',
-'category-file-count' => '{{PLURAL:$2|ئەم هاوپۆلە تەنها ئەم پەڕگەی لەخۆ گرتووە.|ئەم‌ {{PLURAL:$1|پەڕگەیە}} کە بەشێکە لە هەموو $2پەڕگەی ئەم هاوپۆلە‌ دەیبینی.}}',
-'category-file-count-limited' => 'ئەم {{PLURAL:$1|پەڕگە|پەڕگانە}} لەم هاوپۆلەدایە.',
-'listingcontinuesabbrev' => '(درێژە)',
-
-'mainpagetext' => "'''ویكیمیدیا به‌سه‌ركه‌وتووی دامه‌زرا.'''",
-'mainpagedocfooter' => 'بكه‌ [http://meta.wikimedia.org/wiki/Help:ناوه‌ڕۆكی چۆنێتی به‌كارهێنان] بۆ وه‌ده‌ست هێنانی زانیاریی له‌سه‌ر چۆنێتی كارگێڕی نه‌رمه‌كاڵای ویكی، سه‌ردانی.
-
-== ده‌ست به‌ كاركردن ==
-
-* [http://www.mediawiki.org/wiki/Manual:Configuration_settings لیسته‌ی هه‌ڵبژاردنه‌كان و ڕێكخستنه‌كان]
-* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لیستی وه‌شانه‌كانی ویكیمیدیا]',
-
-'about' => 'سه‌باره‌ت',
-'article' => 'بابەت',
-'newwindow' => '(لە پەڕەیەکی نوێ دەکرێتەوە)',
-'cancel' => 'ھەڵوەشاندنەوە',
-'moredotdotdot' => 'زیاتر',
-'mypage' => 'په‌ڕه‌ی من',
-'mytalk' => 'لێدوانەکەم',
-'anontalk' => 'وتووێژ بۆ ئەم ئای‌پی یە',
-'navigation' => 'ڕێدۆزی',
-'and' => '&#32;Ùˆ',
-
-# Cologne Blue skin
-'qbfind' => 'بدۆزەرەوە',
-'qbbrowse' => 'بگه‌ڕێ',
-'qbedit' => 'دەستکاری',
-'qbpageoptions' => 'ئەم پەڕەیە',
-'qbpageinfo' => 'زانیاریی په‌ڕه‌',
-'qbmyoptions' => 'پەڕەکانم',
-'qbspecialpages' => 'پەڕە تایبەتەکان',
-'faq' => 'پرسیار و وەڵام (FAQ)',
-'faqpage' => 'Project:پرسیار و وەڵام',
-
-# Vector skin
-'vector-action-addsection' => 'زیادکردنی بابەت',
-'vector-action-delete' => 'سڕینەوە',
-'vector-action-move' => 'گواستنەوە',
-'vector-action-protect' => 'پاراستن',
-'vector-action-undelete' => 'گەڕاندنەوەی سڕین',
-'vector-action-unprotect' => 'نەپاراستن',
-'vector-namespace-category' => 'Ù¾Û†Ù„',
-'vector-namespace-help' => 'پەڕەی یارمەتی',
-'vector-namespace-image' => 'Ù¾Û•Ú•Ú¯Û•',
-'vector-namespace-main' => 'Ù¾Û•Ú•Û•',
-'vector-namespace-media' => 'پەڕەی میدیا',
-'vector-namespace-mediawiki' => 'پەیام',
-'vector-namespace-project' => 'پەڕەی پرۆژە',
-'vector-namespace-special' => 'پەڕەی تایبەت',
-'vector-namespace-talk' => 'لێدوان',
-'vector-namespace-template' => 'قاڵب',
-'vector-namespace-user' => 'پەڕەی بەکارھێنەر',
-'vector-view-create' => 'دروست‌کردن',
-'vector-view-edit' => 'دەستکاری',
-'vector-view-history' => 'بینینی مێژوو',
-'vector-view-view' => 'خوێندنەوە',
-'vector-view-viewsource' => 'بینینی سەرچاوە',
-'actions' => 'کردارەکان',
-'namespaces' => 'بۆشایی‌ناوەکان',
-'variants' => 'شێوەزارەکان',
-
-'errorpagetitle' => 'Ú¾Û•ÚµÛ•',
-'returnto' => 'بگەڕێوە بۆ $1.',
-'tagline' => 'Ù„Û• {{SITENAME}}',
-'help' => 'یارمەتی',
-'search' => 'گەڕان',
-'searchbutton' => 'بگەڕێ',
-'go' => 'بڕۆ',
-'searcharticle' => 'بڕۆ',
-'history' => 'مێژووی پەڕە',
-'history_short' => 'مێژووی پەڕە',
-'updatedmarker' => 'لە دوای دواسەردانم نوێکراوەتەوە',
-'info_short' => 'زانیاری',
-'printableversion' => 'وەشانی ئامادەی چاپ',
-'permalink' => 'بەستەری ھەمیشەیی',
-'print' => 'چاپ',
-'edit' => 'دەستکاری',
-'create' => 'دروستکردن',
-'editthispage' => 'دەستکاری ئەم پەڕەیە بکە‌',
-'create-this-page' => 'ئەم پەڕە دروست بکە',
-'delete' => 'سڕینەوە',
-'deletethispage' => 'سڕینه‌وه‌ی ئه‌م په‌ڕه‌یه‌',
-'undelete_short' => '{{PLURAL:$1|یەک گۆڕانکاریی|$1 گۆڕانکاریی}} سڕاوە بەجێبھێنەرەوە',
-'protect' => 'پاراستن',
-'protect_change' => 'گۆڕین',
-'protectthispage' => 'ئه‌م په‌ڕه‌یه‌ بپارێزه‌',
-'unprotect' => 'مه‌پارێزه‌',
-'unprotectthispage' => 'ئه‌م په‌ڕه‌یه‌ مه‌پارێزه‌',
-'newpage' => 'پەڕەی نوێ',
-'talkpage' => 'باس لەسەر ئەم پەڕە بکە‌',
-'talkpagelinktext' => 'لێدوان',
-'specialpage' => 'په‌ڕه‌ی تایبه‌ت',
-'personaltools' => 'ئامڕازە تاکەکەسییەکان',
-'postcomment' => 'بەشی نوێ',
-'articlepage' => 'ناوه‌ڕۆكی بابه‌ت ببینه‌',
-'talk' => 'لێدوان',
-'views' => 'بینینەکان',
-'toolbox' => 'ئامرازدان',
-'userpage' => 'په‌ڕه‌ی به‌كارهێنه‌ر نیشانبده‌',
-'projectpage' => 'په‌ڕه‌ی پرۆژه‌ نیشانبده‌',
-'imagepage' => 'پەڕەی پەڕگە نیشان بدە',
-'mediawikipage' => 'په‌ڕه‌ی په‌یام نیشانبده‌',
-'templatepage' => 'په‌ڕه‌ی قاڵب نیشانبده‌',
-'viewhelppage' => 'په‌ڕه‌ی یارمه‌تی نیشانبده‌',
-'categorypage' => 'په‌ڕه‌ی هاوپۆل نیشانبده‌',
-'viewtalkpage' => 'بینینی لێدوان',
-'otherlanguages' => 'بە زمانەکانی تر',
-'redirectedfrom' => '(ڕەوانەکراوە لە $1 ەوە)',
-'redirectpagesub' => 'پەڕەی ڕەوانەکردن',
-'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێکراوەتەوە.',
-'viewcount' => 'ئەم پەڕەیە {{PLURAL:$1|یەکجار|$1 جار}} بینراوە.',
-'protectedpage' => 'پەڕەی پارێزراو',
-'jumpto' => 'باز بدە بۆ:',
-'jumptonavigation' => 'ڕێدۆزی',
-'jumptosearch' => 'گەڕان',
-'view-pool-error' => 'ببورە، لەم کاتەدا ڕاژەکارەکان زیاباریان لە سەرە.<br />
-ژمارەیەکی زۆر لە بەکارهێنەران هاوکات هەوڵی دیتنی ئەم لاپەرەیان داوە.<br />
-تکایە پێش هەوڵی دووبارە بۆ دیتنی ئەم لاپەڕە، نەختێک بوەستە.<br /><br />
-
-$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:دەربارە',
-'copyright' => 'ناوەڕۆک ئامادەیە لە ژێر $1.',
-'copyrightpage' => '{{ns:project}}:ماÙەکانی لەبەرگرتنەوە',
-'currentevents' => 'ڕووداوە ھەنووکەییەکان',
-'currentevents-url' => 'Project:ڕووداوە بەردەوامەکان',
-'disclaimers' => 'نابەرپرسییەکان',
-'disclaimerpage' => 'Project:بەرپرس‌نەبوون',
-'edithelp' => 'ڕێنمایی بۆ دەستکاریکردن',
-'edithelppage' => 'Help:دەستکاریکردن',
-'helppage' => 'Help:ناوەڕۆک',
-'mainpage' => 'دەستپێک',
-'mainpage-description' => 'دەستپێک',
-'policy-url' => 'Project: سیاسەت',
-'portal' => 'دەروازەی بەکارھێنەران',
-'portal-url' => 'Project: دەروازەی بەکارھێنەران',
-'privacy' => 'ڕێبازی تایبەتێتی',
-'privacypage' => 'Project:پاراستنی زانیارییەکان',
-
-'badaccess' => 'ھەڵە لە بە دەست ھێنان',
-'badaccess-group0' => 'ڕێگەت پێ نەدراوە بۆ بەجێهێنای ئەو ئەنجامە وا داخوازیت کردووه.',
-'badaccess-groups' => 'ئەو ئەنجامەی وا داخوازیت کردووه مەحدود کراوە بۆ بەکارهێنەرانی {{PLURAL:$2|دەستەی|یەکێک لە دەستەکانی}}: $1',
-
-'versionrequired' => 'وەشانی $1ی‌ میدیاویکی پێویستە',
-'versionrequiredtext' => 'پێویستیت بە وەشانی $1ی ویکیمیدیا ھەیە بۆ بەکاربردنی ئەم پەڕەیە.
-تەماشای [[Special:Version|پەڕەی وەشان]] بکە.',
-
-'ok' => 'باشه‌',
-'retrievedfrom' => 'وەرگیراو لە «$1»',
-'youhavenewmessages' => '$1ت ھەیە ($2).',
-'newmessageslink' => 'پەیامی نوێ',
-'newmessagesdifflink' => 'دوا گۆڕانکارییەکان',
-'youhavenewmessagesmulti' => 'لە $1 دا پەیامی نوێت ھەیە',
-'editsection' => 'دەستکاری',
-'editold' => 'دەستکاری',
-'viewsourceold' => 'بینینی سەرچاوە',
-'editlink' => 'دەستکاری',
-'viewsourcelink' => 'بینینی سەرچاوە',
-'editsectionhint' => 'دەستکاری کردنی بەشی: $1',
-'toc' => 'ناوەڕۆک',
-'showtoc' => 'نیشاندان',
-'hidetoc' => 'شاردنەوە',
-'thisisdeleted' => 'نیشاندان یا گەڕاندنەوەی $1؟',
-'viewdeleted' => '$1 نیشان بده‌؟',
-'restorelink' => '{{PLURAL:$1|گۆڕانکاریی سڕاو|$1 یەک گۆڕانکاریی سڕاو}}',
-'feedlinks' => 'خۆراک:',
-'feed-invalid' => 'ئەندام بوونی ئەو جۆرە خۆراکە نەناسراوە.',
-'feed-unavailable' => 'پەیوەندی Ùییدەکان ئامادەی Ú©Û•ÚµÚ© وەرگرتن نیە',
-'site-rss-feed' => 'Ùیدی RSS بۆ $1',
-'site-atom-feed' => 'Ùیدی Atom بۆ $1',
-'page-rss-feed' => 'Ùیدی RSS بۆ «$1»',
-'page-atom-feed' => 'Atom Feed ـی "$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-mediawiki' => 'پەیام',
-'nstab-template' => 'قاڵب',
-'nstab-help' => 'پەڕەی یارمەتی',
-'nstab-category' => 'ھاوپۆل',
-
-# Main script and global functions
-'nosuchaction' => 'كرداری به‌م شێوه‌یه‌ نییه‌',
-'nosuchactiontext' => 'ئەو چالاکییەی لە لایەن بەستەرەوە دیاریکراوە ناتەواوە.
-لەوانەیە بە هەڵە بەستەرەکەت نووسیبێت، یان بەستەرێکی هەڵەی بە دواوە بێت.
-لەوانەیە ئەمە نیشانەی هەڵەیەک بێت لەو نەرمەکاڵایەی کە بەکاردێت لە لایەن {{SITENAME}}.',
-'nosuchspecialpage' => 'په‌ڕه‌ی تایبه‌تی له‌و شێوه‌یه‌ نییه‌',
-'nospecialpagetext' => '<strong>پەڕەیەکی تایبەت دەخوازیت کە بوونی نیە.</strong>
-
-لیستێکی پەڕە تایبەتە دروستەکان لە [[Special:SpecialPages|{{int:specialpages}}]] لە بەردەست‌دایە.',
-
-# General errors
-'error' => 'هه‌ڵه‌',
-'databaseerror' => 'هه‌ڵه‌ له‌ بنكه‌دراوه‌دا هه‌یه‌',
-'dberrortext' => 'ھەڵەیەکی ڕستەنووسی لە داواکاریی بنکەیدراو ڕووی داوە.
-لەوانەیە ئەوە نیشاندەری کەلێنێک لە نەرمامێرەکەدا بێت.
-دوایین تێکۆشان بۆ داواکاری بنکەیدراو:
-<blockquote><tt>$1</tt></blockquote>.
-لە نێو کرداری "<tt>$2</tt>".
-بنکەیدراو ھەڵەی"<tt>$3: $4</tt>" گەڕاندووتەوە.',
-'dberrortextcl' => 'هەڵەیەکی ڕستەنووسی لە داواکاریی بنکە‌یدراو ڕوویداوە.
-دوایین تێکۆشان بۆ داواکاری بنکەیدراو ئەمە بووە:
-"$1"
-لە نێو کرداری "$2".
-بنکەیدراو ھەڵەی "$3: $4" گەڕاندووەتەوە',
-'laggedslavemode' => 'ئاگاداری: لەوانەیە لاپەڕەکە نوێکردنەکان لە بەر نەگرێت.',
-'readonly' => 'بنکەدراوە داخراوە',
-'enterlockreason' => 'هۆیەک بۆ قوÙڵ‌کردنەکە بنووسە Ú©Û• تێیدا کاتی کردنەوەی Ù‚Û†ÙÚµÛ•Ú©Û• باس کرابێت',
-'readonlytext' => 'بنکەدراوەکە Ù„Û•Ù… کاتەدا لەبەر چاکسازی ئاسایی بۆ نوسینی نوێ Ùˆ دەستکاری قوÙÚµ کراوه. دوای ئەوە ئەگرێتەوە بۆ ئاستی خۆی.
-
-ئەو بەڕێوبەرەی Ú©Û• قوÙÚµÛŒ کردووه ئەم ڕوون‌کردنەوەی نووسیوە : $1',
-'missing-article' => 'دانەگە (دەیتابەیس) نەیتوانی دەقی پەڕەیەک بدۆزێتەوە کە دەبوا بیدۆزایەتوە، بەناوی "$1" $2 .
-
-ئەمە کاتێ ڕوو ئەدات کە بەدواچوونی بەستەری پەڕەیکی سڕاوە یان جیاوازیەکانی مێژوو تێپەڕبووی دەکەی.
-
-ئەگەر وا نەبێت، ئەوا Ú•Û•Ù†Ú¯Û• گرÙتێکت Ù„Û•Ù… نەرمامێرە دا ھەبێت، Ú©Û• تۆ پێت زانیوە..
-تکایە ئەمە بە یەکێک لە ئەندامانی [[Special:ListUsers/sysop|بەڕێوبەر]] ڕاپۆرت بدە، و ناونیشانی URLـەکەی پێ بدە.',
-'missingarticle-rev' => '(پیاچوونەوە#: $1)',
-'missingarticle-diff' => '(جیاوازی: $1، $2)',
-'readonly_lag' => 'بنكه‌دراوه‌كه‌ به‌شێوه‌ی خۆكار به‌ندكراوه‌، له‌كاتێكدا بنكه‌دراوه‌ی ڕاژه‌كاره‌كه‌ ڕۆڵی له‌خۆگرتن ده‌گێڕێت',
-'internalerror' => 'هه‌ڵه‌یه‌كی ناوخۆیی ڕویدا',
-'internalerror_info' => 'هه‌ڵه‌ی ناوخۆیی: $1',
-'fileappenderror' => 'نه‌تواندرا "$1" بخرێته‌سه‌ر "$2".',
-'filecopyerror' => 'په‌ڕگه‌ی „$1“ ڕوونوس نابێت بۆ „$2“ .',
-'filerenameerror' => 'ناوی په‌ڕگه‌ی "$1" نه‌گۆڕدرا بۆ "$2".',
-'filedeleteerror' => 'بسڕدرێته‌وه‌"$1" نه‌توانرا په‌ڕگه‌ی',
-'directorycreateerror' => 'نەتوانرا بوخچەی "$1"دروست بکرێت.',
-'filenotfound' => 'په‌ڕگه‌ی "$1" نه‌دۆزرایه‌وه‌',
-'fileexistserror' => 'ناتوانی لەسەر پەڕگەی "$1" بنووسیت: ئەو پەڕگەیە هەیە.',
-'unexpected' => 'نرخی چاوەڕوان نەکراو: "$1"="$2" .',
-'formerror' => 'Ù‡Û•ÚµÛ•: Ùورمەکە نانێردرێت.',
-'badarticleerror' => 'ئەو ئاماژە لەم لاپەڕەدا پێک‌نایە.',
-'cannotdelete' => 'نەتوانرا پەڕە یان پەڕگەی «$1» بسڕدرێتەوە.
-لەوانەیە پێشتر لە لایەن کەسێکی ترەوە سڕابێتەوە.',
-'badtitle' => 'ناونیشانی خراپ',
-'badtitletext' => 'سەرناوی ئەو لاپەڕەی کە دەتەوێت پووچە، بەتاڵە، یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە لکێندراوە.
-ڕەنگە یەک یان چەند کاراکتێری تێدا بێت کە ناشێت لە نێو سەرناوەکان دا بەکار بھێنرێت.',
-'perfcached' => 'ئەم داتای خوارەوە پاشەکەوتی کەشە وە ناکرێ تازەی بکەیەوە.',
-'perfcachedts' => 'ئەم داتای خوارەوە کەش کراوە، و دوایین جار لە $1 تازە کراوەتەوە',
-'querypage-no-updates' => 'تازەکردنەوەی ئەم لاپەڕە لە حاڵی ئێستا دا ناچالاک کراو.
-داتای ئەم شوێنە بەم زووانە تازە ناکرێتەوە.',
-'wrong_wfQuery_params' => 'پارامێتری ھەڵە بۆ wfQuery()<br />
-کردار: $1<br />
-داواکاری: $2',
-'viewsource' => 'بینینی سەرچاوە',
-'viewsourcefor' => 'بۆ $1',
-'actionthrottled' => 'چالاکی پێشی پێ گیرا',
-'actionthrottledtext' => 'بە مەبەستی پێشگریی لە سپەم، ڕێگە نادرێت تۆ لە ماوەیەکی کورت دا لە سەر یەک ئەمە زۆر جار ئەنجام بدەی، وە ئیستا تۆ لە ڕادە بەدەرت کردووە.
-تکایە پاش چەند خولەک دووبارە تاقی بکەوە.',
-'protectedpagetext' => 'بە مەبەستی پێشگریی Ù„Û• دەستکاریی، ئەم لاپەڕە قوÙÚµ کراوە.',
-'viewsourcetext' => 'تۆ دەتوانی سەرچاوەی ئەم لاپەڕە ببینی و کۆپی بکەی:',
-'protectedinterface' => 'ئەم لاپەڕە دەقی ڕوواڵەتی نەرم‌ئامێرەکە نیشان ئەدات، ÙˆÛ• بۆ پێشگریی Ù„Û• خراپکاریی قوÙÚµ کراوە.',
-'editinginterface' => "'''ئاگاداریی:''' تۆ خەریکی دەستکاریی لاپەڕەیەکی کە بۆ دابینکردنی دەقی ڕوواڵەتی نەرم‌ئامێر بە کار دەھێنرێت.
-گۆڕانکاریی لە ئەم لاپەڕە کاریگەر دەبێت لە سەر ڕواڵەتی لاپەڕەکانی بەکارھێنەرانی دیکە.
-بۆ وەرگێڕان تکایە [http://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] بەکار بھێنە، واتە پرۆژەی خۆجێیی‌کردنی مێدیاویکی.",
-'sqlhidden' => '(داواکاریی SQL شاراوەیە)',
-'cascadeprotected' => 'ئەم لاپەڕە پارێزراوە لە دەستکاریی، چونکا خراوەتە سەر ڕیزی ئەم {{PLURAL:$1|لاپەڕانه‌، کە}} که‌ به‌ هه‌ڵکردنی بژارده‌ی داڕژان هه‌ڵکراوه‌:
-$2',
-'namespaceprotected' => "تۆ ناتوانی لاپەڕەکانی ناو نەیمسپەیسی '''$1''' بگۆڕی.",
-'customcssjsprotected' => 'تۆ ناتوانی ئەم لاپەڕە دەستکاریی بکەی، چونکا ڕێکراوە تاکەکەسییەکانی بەکارھێنەرێکی دیکەی تێدایە.',
-'ns-specialprotected' => 'تۆ ناتوانی لاپەڕە تایبەتەکان دەستکاریی بکەی.',
-'titleprotected' => 'ئەم سەرناوە پارێزراوە لە دروستکران لە لایەن [[User:$1|$1]].
-ھۆکاری ئەمە بریتیە لە "\'\'$2\'\'".',
-
-# Virus scanner
-'virus-badscanner' => "پێکەربەندیی نابەجێ: ڤایرس سکەنێری نەناسراو: ''$1''",
-'virus-scanfailed' => 'سکەن ئەنجام نەدرا(کۆد $1)',
-'virus-unknownscanner' => 'دژەڤایرس نەناسراوە:',
-
-# Login and logout pages
-'logouttext' => "'''ئێستا تۆ لە ھەژمارەکەت ھاتوویتە دەرەوە.'''
-
-تۆ دەتوانی درێژە بدەی بە بەرکارھێنانی {{SITENAME}} بە شێوەی بێناو، یان دەتوانی [[Special:UserLogin|دیسانەوە بچیتەوە ژوورەوە]] بە ھەمان ناو یان بە ناوی بەکارھێنەرێکی جیاوازەوە.
-ئاگادار بە کە سەرەڕای چوونەدەرەوەی تۆ لە ھەژمارەکەت ھەندێک لە پەڕەکان ھەر بە شێوەیەک نیشان ئەدرێن کە گوایە تۆ ھێشتا لە ژوورەوەیت. ئەمە بەردەوام دەبێت ھەتا کاتێک کە تۆ کەشی وێبگەڕەکەت دەسڕیتەوە.",
-'welcomecreation' => '== بەخێربێی، $1! ==
-ھەژمارەکەت دروست کرا.
-لە بیرت نەچێت کە گۆڕانکاری لە [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ی تایبەتی خۆت بدەی.',
-'yourname' => 'ناوی بەکارھێنەر:',
-'yourpassword' => 'تێپەڕوشە:',
-'yourpasswordagain' => 'تێپه‌ڕه‌وشه‌ دووباره:‌',
-'remembermypassword' => 'زانیاریی چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە‌',
-'yourdomainname' => 'ناوی دۆمه‌ینی خۆت',
-'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
-'login' => 'چوونەژوورەوە',
-'nav-login-createaccount' => 'چوونەژوورەوە / دروستکردنی هەژمار',
-'loginprompt' => 'بۆ چونەژوورەوه لە {{SITENAME}}، ئەشێ ڕێگە بدەی بە کووکی‌یەکان.',
-'userlogin' => 'دروست کردنی ھەژمار \\ چوونە ژورەوە',
-'userloginnocreate' => 'چوونەژوورەوە',
-'logout' => 'دەرچوون',
-'userlogout' => 'دەرچوون',
-'notloggedin' => 'له‌ ژووره‌وه‌ نیت',
-'nologin' => "ھەژمارت نییە؟ '''$1'''.",
-'nologinlink' => 'ھەژمارێک دروست بکە',
-'createaccount' => 'ھەژمار دروست بکە',
-'gotaccount' => "خاوه‌نی هه‌ژماری خۆتی؟ '''$1'''.",
-'gotaccountlink' => 'چوونه‌ ژووره‌وه‌',
-'createaccountmail' => 'بە ئیمەیل',
-'badretype' => 'تێپەڕوشەکان لەیەک ناچن.',
-'userexists' => 'ئەو ناوەی تۆ داوتە پێشتر کەسێکی دیکە بەکاری بردووە.
-ناوێکی دیکە ھەڵبژێرە.',
-'loginerror' => 'ھەڵە لە چوونە ژوورەوەدا',
-'nocookiesnew' => 'هەژماری بەکارهێنەر درووست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.
-{{SITENAME}} بۆ چوونەوە ژووری بەکارهێنەر لە شەکرۆکە کەڵک وەر دەگرێت.
-تۆ بەکار‌هێنانی شەکرۆکەت لەکارخستە.
-تکایە شەکرۆکە کارا بکە و بە ناو و وشەی تێپەڕبوونی بەکارهێنەر بچۆ ژوورەوە.',
-'nocookieslogin' => '{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.
-ڕێگەت نەداوە بە کووکی‌یەکان.
-ڕێگەیان پێ بدەو و دیسان تێبکۆشە.',
-'noname' => 'ناوی بەکارهێنەری گۆنجاوت دابین‌ نەکردووه.',
-'loginsuccesstitle' => 'سەرکەوتی بۆ چوونە ژوورەوە',
-'loginsuccess' => "'''ئێستا لە {{SITENAME}} چوویتەوە ژوورەوە وەک \"\$1\".'''",
-'nosuchuser' => 'بەکارھێنەرێک بە ناوی «$1» نیە.
-ناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.
-ڕێنووسەکەت چاولێکەرەوە، یان [[Special:UserLogin/signup|ھەژمارێکی نوێ دروست بکە]].',
-'nosuchusershort' => 'بەکارهێنەر بە ناوی "<nowiki>$1</nowiki>" نیە.
-چاو لە ڕێنووسەکە بکە.',
-'nouserspecified' => 'دەبێ ناوی بەکارهێنەر دابین‌ بکەی.',
-'wrongpassword' => 'تێپەڕوشەی ھەڵە.
-تکایە دووبارە تێبکۆشە.',
-'wrongpasswordempty' => 'تێپەڕەوشەی لێدراو بەتاڵبوو.
-تکایە هەوڵ بدەوە.',
-'passwordtooshort' => 'تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.',
-'password-name-match' => 'تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.',
-'mailmypassword' => 'تێپەڕوشەیەکی نوێ بنێرە بۆ ئیمەیلەکەم',
-'passwordremindertitle' => 'تێپەڕوشەیەکی نوێی کاتی بۆ {{SITENAME}}',
-'passwordremindertext' => 'کەسێک (لەوانەیە خۆت، لە ناونیشانی ئای‌پی $1) داخوازی تێپەڕوشەیەکی نوێی کردووە بۆ {{SITENAME}} ($4) .تێپەڕوشەیەکی کاتی بۆ بەکارهێنەر «$2» درووست‌کراوە و وەک «$3» دانراوه. ئەگەر داواکاری تۆ بووە، دەبێ هەر ئێستا بڕۆیتە ژوورەوە و تێپەڕوشەیەکی نوێ هەڵبژێریت. تێپەڕوشەی کاتی لە {{PLURAL:$5|ڕۆژدا|$5 ڕۆژدا}} ماوەی‌ بەسەر دەچێت.
-
-ئەگەر کەسێکی دی ئەو داخوازیەی کردە یان وشە نهێنیەکەت بیر هاتەوە و چی‌تر پێویستت بە گۆڕانی نەبوو، ئەم پەیامە بەتاڵ‌کەوە و لە وشە نهێنیە کۆنەکەت کەڵک وەربگرە.',
-'noemail' => 'ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».',
-'passwordsent' => 'وشەی نهێنی نوێ بۆ ئەدرەسی ئی‌مێڵغ تۆمار کراو بۆ "$1"، ناردرا.
-تکایە دوای وەرگرتنی دووبارە بچۆ ژوورەوە.',
-'blocked-mailpassword' => 'ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.',
-'eauthentsent' => 'ئی‌مەیلێکی بڕواپێکردن ناردرا بۆ ئەدرەسی ئی‌مەیلی پاڵێوراو. <br />
-پێش ئەوەی ئی‌مەیلی‌تر بنێردرێ بۆ ئەم هەژمارە، بۆ ئەوەی بڕوات پێ‌بکرێ کە ئەو هەژمارە بەڕاستی هین تۆیە، دەبێ ڕێنوماییەکانی ناو ئەو ئی‌مەیلە هەنگاو بە هەنگاو ئەنجام بدەیت.',
-'throttled-mailpassword' => 'بیرهێنەرەوەیەکی وشەی نهێنی پێش ئەمە لە {{PLURAL:$1|کاتژمێر}}ی ڕابردوودا ناردراوە.
-بۆ بەرگری لە بەکارهێنانی خراپ، تاکە یەک بیرهێنەرەوەی وشەی نهێنی هەر {{PLURAL:$1|کاتژمێر}} دەنێردرێت.',
-'mailerror' => 'هەڵە ڕوویدا لە ناردنی ئیمەیل: $1',
-'acct_creation_throttle_hit' => 'بینەرانی ویکی بەکەڵک وەرگرتن لەم ئای‌پی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.
-وەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.',
-'emailauthenticated' => 'ئیمەیلەکەت بە ڕاست ناسرا لە $3ی $2 دا',
-'emailnotauthenticated' => 'ئیمەیلەکەت ھێشتا نەناسراوە.
-ھیچ ئیمەیلێک بۆ ئەم بابەتانەی خوارەوە نانێردرێت.',
-'noemailprefs' => 'بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئی‌مێڵ دابین بکە.',
-'emailconfirmlink' => 'ئیمەیلەکەت پشت‌ڕاست بکەرەوە',
-'invalidemailaddress' => 'ئەو ئەدرەسی ئی‌مێڵە لەبەر ئەوەی بە شێوازێکی نەناسراوە، پەسند نەکرا.
-تکایە ئەدرەسێک بە شێوازی ناسراو بنووسە یان ئەو خانەیە بەتاڵ بهێڵەوە.',
-'accountcreated' => 'ھەژمار دروست کرا',
-'accountcreatedtext' => 'هەژماری بەکارهێنەر بۆ $1 درووست‌کرا.',
-'createaccount-title' => 'درووست‌کردنی هەژمارە بۆ {{SITENAME}}',
-'createaccount-text' => 'کەسێک هەژمارەیەکی بۆ ئی‌مێڵ ئەدرەسەکی تۆ لەسەر {{SITENAME}} ($4) بەناوی "$2"، بە وشەی نهێنی "$3".
-ئێستا دەبێ بڕۆیتە ژوورەوە و وشەی نهێنی بگۆڕیت.
-
-ئەگەر ئەو هەژمارە بە هەڵە درووست‌کراوە، ئەم برووسکە لە بەرچاو مەگرە.',
-'login-throttled' => 'ژمارەیەکی زۆر هەوڵت داوە بۆ چوونە ژوورەوە.
-تکایە پێش هەوڵی دووبارە، نەختێک بوەستە.',
-'loginlanguagelabel' => 'زمان: $1',
-
-# Password reset dialog
-'resetpass' => 'گۆڕینی تێپەڕوشە',
-'resetpass_announce' => 'بە کۆدی کاتیی ئیمەیل‌کراو ھاتوویتە ژوورەوە.
-بۆ دوایی ھاتنی چوونە ژوورەوە، ئەشێ تێپەڕوشەیەکی نوێ ھەڵبژێری لێرە:',
-'resetpass_text' => '<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سÙر بكه‌ره‌وه‌ -->',
-'resetpass_header' => 'گۆڕینی تێپەڕوشەی ھەژمار',
-'oldpassword' => 'تێپەڕوشەی پێشو:',
-'newpassword' => 'تێپەڕوشەی نوێ:',
-'retypenew' => 'تێپەڕوشەی نوێ دوبارە بنووسەوە:',
-'resetpass_submit' => 'تێپەڕوشە رێکخە و بچۆ ژوورەوە',
-'resetpass_success' => 'تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا. ئێستا چوونە ژوورەوەت...',
-'resetpass_forbidden' => 'تێپەڕوشەکە ناگۆڕدرێت',
-'resetpass-no-info' => 'بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.',
-'resetpass-submit-loggedin' => 'گۆڕینی تێپەڕوشە',
-'resetpass-submit-cancel' => 'ھەڵوەشاندنەوە',
-'resetpass-wrong-oldpass' => 'تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.
-وا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.',
-'resetpass-temp-password' => 'تێپەڕوشەی کاتی:',
-
-# Edit page toolbar
-'bold_sample' => 'دەقی ئەستوور',
-'bold_tip' => 'دەقی ئەستوور',
-'italic_sample' => 'دەقی لار',
-'italic_tip' => 'دەقی لار',
-'link_sample' => 'نێوی بەستەر',
-'link_tip' => 'بەستەری ناوخۆ',
-'extlink_sample' => 'http://www.example.com سەردێڕی بەستەر',
-'extlink_tip' => 'بەستەری دەرەکی (لەبیرت بێ نووسینی پێشگری http:// )',
-'headline_sample' => 'دەقی سەردێڕ',
-'headline_tip' => 'سەردێڕی ئاست ۲',
-'math_sample' => 'Ùۆرموول لێرە بنووسە',
-'math_tip' => 'Ùۆرموولی بیرکاری (LaTeX)',
-'nowiki_sample' => 'لەگەرە دەقی نەڕازراو تێ‌بخە',
-'nowiki_tip' => 'لەبەرچاو نەگرتنی دارشتنەکانی ویکی',
-'image_sample' => 'نموونە.jpg',
-'image_tip' => 'وێنەی نێو دەق',
-'media_sample' => 'نموونە.ogg',
-'media_tip' => 'لینکی پەڕگە',
-'sig_tip' => 'ئیمزاکەت بە مۆری ڕێکەوتەوە',
-'hr_tip' => 'هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)',
-
-# Edit pages
-'summary' => 'پوختە:',
-'subject' => 'بابەت/سەردێڕ:',
-'minoredit' => 'ئەم گۆڕانکارییە بچووکە',
-'watchthis' => 'چاودێری ئەم پەڕەیە بکە',
-'savearticle' => 'پاشەکەوتکردنی پەرە',
-'preview' => 'پێشبینین',
-'showpreview' => 'پێشبینینی پەڕە',
-'showlivepreview' => 'پێشبینینی ڕاسته‌وخۆ',
-'showdiff' => 'گۆڕانکارییەکان نیشان بدە',
-'anoneditwarning' => "'''وشیار بە:''' نەچوویتەتە ژوورەوە.
-ئەدرەسی ئەکەت لە مێژووی ئەم پەڕە دا تۆمار دەکرێ.",
-'missingsummary' => "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.
-ئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
-'missingcommenttext' => 'تکایە لە خوارەوە شرۆڤەیەک بنووسە.',
-'missingcommentheader' => "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.<br />
-ئەگەر دیسان پاشەکەوت لێدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت ئەبێ.",
-'summary-preview' => 'پێشبینینی کورتە:',
-'subject-preview' => 'پێشبینینی بابەت\\سەردێڕ :',
-'blockedtitle' => 'به‌کار هینه‌ر له‌کار خراوه',
-'blockedtext' => '\'\'\'ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.\'\'\'<br /><br />
-بەربەست لە لایەن $1 کراوە.<br />
-هۆکاری بەربەست کردن \'\'$2\'\'.<br /><br />
-* دەستپێکی بەربەست‌کران: $8<br />
-* کۆتایی هاتنی بەربەست‌کران: $6<br />
-* بابەتی بەربەست: $7<br /><br />
-دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]] بۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە.<br /><br />
-لە بیرت بێ تاکوو ئەمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی "ئی‌مەیل ناردن بۆ ئەم بەکارهێنەرە" کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.<br /><br />
-ئای‌پی ئەدرەسی ئێستای تۆ $3 و پەێناسەی بەربەست‌کراو #$5.<br />
-تکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.',
-'autoblockedtext' => 'ئای‌پی ئەدرەسی تۆ بە شێوەی خۆکار بەربەست کراوە چونکە لە لایەن بەکارهێنەرێکی دی کەڵکی لێ وەرگیراوە کە لە لایەن $1 بەربەست کراوە.<br />
-ئەمە هۆکارەکەیەتی:<br /><br />
-:\'\'$2\'\'<br /><br />
-* دەستپێکی بەربەست‌کران: $8<br />
-* کۆتایی هاتنی بەربەست‌کران: $6<br />
-* بابەتی بەربەست: $7<br /><br />
-
-دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]] بۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە.<br /><br />
-
-لە بیرت بێ تاکوو ئەمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی "ئی‌مەیل ناردن بۆ ئەم بەکارهێنەرە" کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.<br /><br />
-
-ئای‌پی ئەدرەسی ئێستای تۆ $3 و پەێناسەی بەربەست‌کراو #$5.<br />
-تکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.',
-'blockednoreason' => 'هیچ هۆکارێک نەدراوە',
-'blockedoriginalsource' => "سەرچاوەی '''$1''' لەخوارەوە پیشاندراوە:",
-'blockededitsource' => "دەقی '''دەستکاریەکانی تۆ''' بۆ '''$1''' لە خوارەوە نیشان‌دراوە:",
-'whitelistedittitle' => 'بۆ دەستکاریکردن پێویستە لەژوورەوە بیت',
-'whitelistedittext' => 'بۆ دەستکاری کردنی لاپەڕەکان دەبێ $1.',
-'confirmedittext' => 'پێویستە پێش هەرجۆرە دەستکاریەکی لاپەڕەکان ئەدرەسی ئیمەیلت ڕاچاو کردبێت .<br />
-تکایە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ئی‌مەیلەکەت دانێ و بڕواپێکراوی بکە.',
-'nosuchsectiontitle' => 'بەش نەدۆزرایەوە',
-'nosuchsectiontext' => 'هەوڵی دەستکاریکردنی بەشێکت داوە کە بوونی نیە.
-لەوانەیە لەو کاتە خەریکی بینینی پەڕە بوویت گۆزرابێتەوە یان سڕابێتەوە.',
-'loginreqtitle' => 'پێویستە بچیه ژور',
-'loginreqlink' => 'چونە‌ژوور',
-'loginreqpagetext' => 'بۆ دیتنی لاپەڕەکانی دیکە دەبێ $1 .',
-'accmailtitle' => 'وشه‌ی نهێنی ناردرا.',
-'accmailtext' => "تێپەڕوشەیەکی هەرەمەکی درووست‌کراو بۆ [[User talk:$1|$1]] ناردرا بۆ $2 .
-
-کاتێ چوویتە ‌ژوورەوە، لە ''[[Special:ChangePassword|گۆڕینی تێپەڕوشە]]'' دەتوانی وشەی تێپەڕبوون بۆ ئەم هەژمارە نوێیە بگۆڕی.",
-'newarticle' => '(نوێ)',
-'newarticletext' => "بە دوای بەستەری پەڕەیەک کەوتووی کە ھێشتا دروست نەکراوە.
-بۆ دروست کردنی پەڕەکە، لە چوارچێوەکەی خوارەوە دەست بکە بە تایپ کردن. (بۆ زانیاری زورتر
-[[{{MediaWiki:Helppage}}|یارمەتی]] ببینە).
-ئەگەر بە ھەڵەوە ھاتویتە ئێرە، لە سەر دوگمەی '''back'''ی وێبگەڕەکەت کلیک بکە.",
-'anontalkpagetext' => "----''ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست‌نەکردووه یان کەڵکی‌ لێ وەرناگرێ .
-لەبەر ئەوە مەجبوورین ئای‌پی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.
-ئای‌پی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.
-ئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:UserLogin/signup|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی‌ نەناسراوی دی تێکەڵ نەکرێیت. ''",
-'noarticletext' => 'ھەنووکە لەم پەڕەدا ھیچ دەقێک نیە.
-دەتوانی بۆ ئەم ناوە لە [[Special:Search/{{PAGENAME}}|پەڕەکانی تر دا بگەڕێی]] ،<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگەکاندا بگەڕی ],
-یان [{{fullurl:{{FULLPAGENAME}}|action=edit}} ئەم پەڕە دەستکاری بکەیت. ]</span>.',
-'userpage-userdoesnotexist' => 'هەژماری بەکارهێنەری "$1" تۆمار نەکراوە.<br />
-گەر دەتەوێ ئەم لاپەڕە درووست‌کەی یان دەستکاری بکەی تکایە تاقی‌بکەوە .',
-'clearyourcache' => "'''ئاگاداری - دوای پەشەکەوت‌کردن، بۆ بینینی گۆڕانکارییەکان دەبێ کاشی وێبگەڕەکەت دەور لێ‌دەیتەوە.'''<br />
-'''Mozilla / Firefox / Safari:'''کاتێ لەسەر ''Reload'' کرتە دەکەی، دەست لەسەر''Shift'' ڕاگرە، یان ''Ctrl-F5'' لێدە یا ''Ctrl-R''. (لە ماکینتاش ''Command-R'' ئەبێ لێدەی)<br />
-'''Konqueror: ''' لەسەر ''Reload'' کرتە بکە یا ''F5'' لێدە ؛<br />
-'''Opera:''' کاشەکەت لە ''Tools → Preferences'' بسڕەوە ؛<br />
-'''Internet Explorer:''' کاتێ ''Refresh'' لێ‌ئەدەی ''Ctrl'' ڕاگرە، یان ''Ctrl-F5'' لێدە .",
-'usercssyoucanpreview' => "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
-'userjsyoucanpreview' => "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
-'usercsspreview' => "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی CSS به‌کارهێنه‌ریه‌که‌ت ده‌که‌ی.'''
-'''هێشتا پاشه‌که‌وت نه‌بووه !'''",
-'userjspreview' => "'''لەیادت بێ کە ئێستە تەنها پێشبینین\\تاقی‌کردنەوەی جاڤاسکریپتی بەکارهێنەریەکەت دەکەی.'''
-'''هێشتا پاشەکەوت نەبووه !'''",
-'userinvalidcssjstitle' => "'''ئاگادارکردنەوە:''' پێست نیە بۆ \"\$1\".
-لەیادت بێ کە لاپەڕەکانی‌ .css و .js لە بابەت بە پیتی بچووک کەڵک وەر ئەگرن. وەک {{ns:user}}:Foo/monobook.css نە وەک {{ns:user}}:Foo/Monobook.css .",
-'updated' => '(نوێ‌کراوە)',
-'note' => "'''تێبینی:'''",
-'previewnote' => "'''لە بیرت بێت کە ئەمە تەنھا پێشبینینە.'''
-گۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
-'previewconflict' => 'ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.',
-'session_fail_preview' => "'''ببوورە! لەبەر ون‌بوونی هێندێ دراوە ناتوانین دەستکاریەکەت چارەسەر کەین.'''<br />
-تکایە دیسان تاقی‌ بکەوە.<br />
-ئەگەر هێشتا کار ناکات بکۆشە [[Special:UserLogout|بچیتە دەرەوە]] و بگەڕێیتەوە ژوورەوە.",
-'session_fail_preview_html' => "'''ببوورە! لەبەر ون‌بوونی هێندێ دراوە ناتوانین دەستکاریەکەت چارەسەر کەین.'''<br /><br />
-''لەبەر ئەوەی {{SITENAME}} HTMLـی چاک توانا نەدراوە، پێشبینین بۆ بەرگری لە هێرشەکانی جاڤاسکریپتی داشاردراوە.''<br /><br />
-'''ئەگەر ئەمە هەوڵێکی ڕەوا بۆ دەستکاری‌کردنە، تکایە دیسان تاقی‌ بکەوە.'''<br />
-ئەگەر هێشتا کار ناکات بکۆشە [[Special:UserLogout|بچیتە دەرەوە]] و بگەڕێیتەوە ژوورەوە.",
-'token_suffix_mismatch' => "'''دەستکاریەکەت پەسەند نەکرا لەبەر ئەوەی ڕاژەخواز یان وێبگەڕەکەت نووسەکانی خاڵبەندی لەیەک پچڕاندوە.'''<br />
-دەستکاریەکەت بۆ بەرگری لە تێکەڵ‌بوونی دەقی لاپەڕەکە وەر نەگیرا.<br />
-ئەمە بڕێ‌جار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
-'editing' => 'دەستکاریکردنی $1',
-'editingsection' => 'گۆڕاندنی: $1 (بەش)',
-'editingcomment' => 'گۆڕاندنی $1 (بەشی نوێ)',
-'editconflict' => 'دەستکاری کێشە : $1',
-'explainconflict' => "لەو ماوەی تۆ خەریک دەستکاری‌کردنی ئەم لاپەڕە بووی‌، کەسێکی‌تر گۆڕانکاری‌ تێدا کردووە.<br />
-بەشی سەرەوەی دەق، شێوازی ئێستای لاپەڕەکە لە خۆ ئەگرێت.<br />
-گۆڕانکاریەکانی تۆش لە بەشی خوارەوەی دەق نیشان‌دراوە.<br />
-دەبێ گۆڕانکاریەکانی خۆت لەگەڵ ئێستەی لاپەڕەکەدا یەک‌بخەی.<br />
-کاتێ \"پاشەکەوتی لاپەڕە\" لێدەی، '''تەنها''' ئەو دەقەی بەشی سەرەوە پاشەکەوت دەبێت.",
-'yourtext' => 'نوسراوی تۆ',
-'storedversion' => 'پێداچوونەوەی پاشەکەوت‌کراو',
-'nonunicodebrowser' => "'''ئاگاداری: وێبگەڕەکەت لە یوونی‌کۆد پاڵپشتی ناکات .'''<br />
-پرۆسەی چارەسەرکردن لە کاردایە بۆ ئەوەی ڕیگەت پێ بدا بە پاراوی دەستکاری لاپەڕەکان بکەیت: ئەو پیتانەی وا ASCII نین لە چوارچێوەی دەستکاری‌کردن‌دا وەک کۆدی ژمارە‌شازدەیی(hexadecimal) نیشان ئەدرێن.",
-'editingold' => "'''ئاگاداری: تۆ خەریکی دەستکاری‌ پێداچوونەوەیەکی کات‌بەسەرچووی ئەم لاپەڕەی.'''<br />
-ئەگەر پاشەکەوتی بکەیت، هەموو گۆڕانکاریەکانی پێش ئەم پێداچوونەوە لەدەست ئەڕوا.",
-'yourdiff' => 'جیاوازیەکان',
-'copyrightwarning' => "تکایە ئاگادار بن Ú©Û• ھەموو بەشدارییەک بۆ {{SITENAME}} وا Ùەرز ئەکرێت Ú©Û• Ù„Û• ژێر «$2» بڵاو دەبێتەوە (بۆ ئاگاداری زۆرتر $1 سەیر Ú©Û•). ئەگەر ناتەوێ نوسراوەکەت بێ‌ڕەحمانە دەستکاری بکرێت Ùˆ بە دڵخواز دیسان بڵاو ببێتەوە، لێرە Ù¾ÛŽØ´Ú©Û•Ø´ÛŒ Ù…Û•Ú©Û•. ھەروەھا بەڵین ئەدەی Ú©Û• خۆت ئەمەت نووسیوە، یان Ù„Û• سەرچاوەیەکی بە دەسەڵاتی گشتی ''(public domain)'' یان سەرچاوەیەکی ھاوتا لەبەرت‌گرتوەتەو.
-'''«بەرھەمێک Ú©Û• ماÙÛŒ لەبەرگرتنەوەی پارێزراوە، بێ ئیجازە بڵاو مەکەرەوە.»'''",
-'copyrightwarning2' => "لە یادتان بێت کە هەموو بەشداریەکان لە {{SITENAME}} لەوانەیە لەلایەن بەشداربووەکانی‌تر دەستکاری بکرێن، بگۆڕدرێن یا بسڕێنەوە.<br />
-ئەگەر ناتەوێ نووسراوەکانت بێ‌بەزەیی دەستکاری بکرێن، هەر مەینێرە بۆ ئێرە.<br />
-هەروا تۆ بڕیارمان پێ‌ئەدوی کە ئەمە خۆت نووسیوتە یان لە شوێنێکی گشتی یا سەرچاوەیەکی ئازاد وەک ئەو کۆپی‌ هەڵت‌ گرتووە (بۆ وردەکاریەکان ئەمە ببینە $1) .<br />
-'''بێ وەرگرتنی یارمەتی‌، کارە ماÙ‌پارێزراوەکان مەنێرە !'''",
-'longpagewarning' => "'''ئاگاداری:''' درێژاییی ئەم پەڕە $1 کیلوبایتە؛
-بڕێ لە وێبگەڕەکان لەگەڵ دەستکاری کردنی ئەو پەڕانە کە نزیک یان درێژتر لە ٣٢ کیلوبایتن کێشەیان ھەیە.
-تکایە لەت کردنی ئەم پەڕە بۆ چەند بەشی چکۆلەترتان لەبەرچاو بێت.",
-'longpageerror' => "'''هەڵە: ئەو دەقی ناردووتە $1 کیلوبایت درێژەی هەیە، کە لە زۆرینەی $2 کیلۆبایت درێژترە.'''<br />
-پاشەکەوت ناکرێت.",
-'readonlywarning' => "'''ئاگاداری: بنکەدراوە بۆ چاکردنەوە داخراوە، بۆیە ئێستا ناتوانی دەستکاریەکانت پاشەکەوت بکەیت.'''<br />
-باشتر وایە دەقەکە cut و paste بکەیتە ناو پەڕگەیەکی دەق و پاشەکەوتی بکەی بۆ دوایی.<br /><br />
-ئەو بەڕێوبەرەی کە دایخستوە، ئەم هۆکارەی بەردەست خستووە: $1",
-'protectedpagewarning' => "'''ئاگاداری: ئەم Ù¾Û•Ú•Û• داخراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە Ú©Û• ماÙÛŒ بەڕێوەبەرایەتییان ھەیە بتوانن دەستکاریی بکەن.'''
-بۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
-'semiprotectedpagewarning' => "'''ئاگاداری: ئەم پەڕە داخراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن دەستکاریی بکەن.'''
-بۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
-'cascadeprotectedwarning' => "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆیە تەنها ئەو کەسانەی ماÙÛŒ بەڕێوبەرایەتی‌یان هەیە ئەتوانن دەستکاری بکەن، چۆنکا ئەمە {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} Ù„Û• زنجیرەی پارێزراوەکانی Ù„Û• خۆ گرتووە‌:",
-'titleprotectedwarning' => "'''ئاگاداری: ئەم Ù¾Û•Ú•Û• داخراوە، بۆئەوەی بۆ درووست‌کردنی [[Special:ListGroupRights|ماÙÛ• تایبەتەکانت]] پێویستن.'''
-بۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
-'templatesused' => 'ئەو {{PLURAL:$1|قاڵبە کە لەم پەڕەیەدا بە کارھێنراوە|قاڵبانە کە لەم پەڕەیەدا بە کارھێنراون}}:',
-'templatesusedpreview' => 'ئەو {{PLURAL:$1|قاڵبە کە لەم پێشبینینەدا بە کارھێنراوە|قاڵبانە کە لەم پێشبینینەدا بە کارھێنراون}}:',
-'templatesusedsection' => 'ئەو {{PLURAL:$1|داڕێژە|داڕێژانە}} کە لەم بەشەدا بە کارھێنراون:',
-'template-protected' => '(پارێزراو)',
-'template-semiprotected' => '(نیوەپارێزراو)',
-'hiddencategories' => 'ئەم پەڕە ئەندامێکی {{PLURAL:$1|١ ھاوپۆلی شاراوەیە|$1 ھاوپۆلی شاراوەیە}}:',
-'nocreatetitle' => 'درووست‌کردنی لاپەڕە سنووردار کراوە',
-'nocreatetext' => '{{SITENAME}} توانای درووست‌کردنی لاپەڕە نوێکانی داخستووە.<br />
-ئەتوانی بگەڕێتەوە دواوە و یەکێک لەو لاپەڕانەی وا هەن دەستکاری بکەیت ، یان [[Special:UserLogin|بچۆ ژوورەوە یان هەژمارێک درووست‌بکە]]',
-'nocreate-loggedin' => 'ئیجازەی دروست کردنی پەڕەی نوێت نیە.',
-'sectioneditnotsupported-title' => 'بەش دەستکاریکردنی پشتیوانی ناکرێ',
-'permissionserrors' => 'ھەڵەی ئیجازەکان',
-'permissionserrorstext' => 'ماÙÛŒ ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :',
-'permissionserrorstext-withaction' => 'دەسەڵاتت نییە بۆ $2 لەبەر ئەم {{PLURAL:$1|هۆکارە|هۆکارانە}}ی خوارەوە:',
-'recreate-moveddeleted-warn' => "'''ئاگاداری: خەریکی دووبارە لاپەڕەیەک درووست‌ ئەکەیته‌وه کە لە پێشدا سڕدراوەتەوە. '''<br /><br />
-دەبێ ئاگات لەوە بێت کە دەستکاری‌کردنی ئەم لاپەڕە قازانجی هەیە یا نا.<br />
-لۆگی سڕینەوە و جێبەجێ کردنی ئەم لاپەڕە بۆ ئاسان‌کاری لێرەدا هاتووە:",
-'moveddeleted-notice' => 'ئەم پەڕەیە سڕاوەتەوە.
-لۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە خوارەوە دابینکراوە.',
-'log-fulllog' => 'دیتنی لۆگی تەواو',
-'edit-hook-aborted' => 'دەستکاری لە لایەن قولاپەوە هەڵوەشێندرایەوە.<br />
-هۆکاری ئەوەی بەردەست نەخستووە.',
-'edit-gone-missing' => 'توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />
-لەوە دەچی سڕدرابێتەوه.‌',
-'edit-conflict' => 'کێشەی دەستکاری.',
-'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
-'edit-already-exists' => 'توانای درووست‌کردنی لاپەڕەی نوێ نیە.<br />
-ئەوە لەپێش‌دا هەبوو.',
-
-# Parser/template warnings
-'expensive-parserfunction-warning' => "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری ÙÛ•Ù†Ú©Ø´ÛŽÙ†ÛŒ لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />
-ئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگ‌کەردن|بانگ‌کەردن}} کە ئێستا {{PLURAL:$1|بانگ‌کردنی|بانگ‌کردنی}} تێدایە.",
-'expensive-parserfunction-category' => 'ئەو لاپەڕانەی ژمارەیەکی زۆر بانگ‌کەری ÙÛ•Ù†Ú©Ø´ÛŽÙ†ÛŒ لێک‌کەرەوەیان لەخۆ گرتووە.',
-'post-expand-template-inclusion-warning' => "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.<br />
-لەوانەیە هێندێ لە داڕێژەکان لەخۆ نەگرێت.",
-'post-expand-template-inclusion-category' => 'ئەو لاپەڕانەی وا داڕێژە تیێدا قەبارەی تێپەڕیوە',
-'post-expand-template-argument-warning' => "'''ئاگاداری:''' ئەم لاپەڕە لانیکەم یەک بەڵگەی داڕێژە لە خۆ گرتوو کە قەبارەی کردنەوەی زۆر گەورەیە.<br />
-ئەم بەڵگە بەکار نەخراوە.",
-'post-expand-template-argument-category' => 'ئەو لاپەڕانەی بەڵگەی داڕێژەی بەکار نەخراوی لەخۆ گرتووە',
-'parser-template-loop-warning' => 'ئەڵقەی داڕێژە دۆزرایەوە: [[$1]]',
-'parser-template-recursion-depth-warning' => 'سنووری قووڵی گەڕانەوەی داڕێژە تێپەڕیوە ($1)',
-
-# "Undo" feature
-'undo-success' => 'دەستکاریەکە ئەتوانێ ئەنجام‌نەدراو بێت.<br />
-تکایە بۆ ئەوەی ئەرخەیان بیت ئەمەیە ئەوەی‌ دەتویست بیکەی چاو لەو هەڵسەنگاندنەی خوارەوە بکە و دواتر بۆ تەواوکردنی ئەنجام‌نەدراو، گۆڕانکارییەکان پاشەکەوت بکە.',
-'undo-failure' => 'لەبەر کێشەی دەست‌تێ‌وەردان، ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەیت.',
-'undo-norev' => 'ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.',
-'undo-summary' => 'پووچەڵ‌کرنەوەی پێداچوونەوەی $1 لەلایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|وتووێژ]])',
-
-# Account creation failure
-'cantcreateaccounttitle' => 'ناتوانرێت هەژمار دروست بکرێت',
-'cantcreateaccount-text' => 'درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی (\'\'\'$1\'\'\') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />
-$3 هۆکاری "$2" خستوەتەڕوو',
-
-# History pages
-'viewpagelogs' => 'لۆگەکانی ئەم پەڕەیە ببینە',
-'nohistory' => 'هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.',
-'currentrev' => 'پێداچوونەوی ئێستا',
-'currentrev-asof' => 'بینینەوی ھەنووکە تا $1',
-'revisionasof' => 'وەک بینینەوەی $1',
-'revision-info' => 'پێداچوونەوی $1 لە لایەن $2',
-'previousrevision' => '→پیاچوونەوەی کۆنتر',
-'nextrevision' => 'پیاچوونەوەی نوێترâ†',
-'currentrevisionlink' => 'پیاچوونەوەی ئێستا',
-'cur' => 'ئێستا',
-'next' => 'پاش',
-'last' => 'پێشوو',
-'page_first' => 'یەکەمین',
-'page_last' => 'دوایین',
-'histlegend' => "وەشانەکان بۆ ھەڵسەنگاندن دیاری بکە و ئەم دوگمەی خوارەوە لێبدە. <br />
-ڕێنمایی: ('''ئێستا''') = جیاوازی لەگەڵ وەشانی ئێستا، ('''پێشوو''') =جیاوازی لەگەڵ وەشانی پێشوو، '''ب''' = گۆڕانکاریی بچووک.",
-'history-fieldset-title' => 'گەشتی مێژوو',
-'histfirst' => 'کۆنترین',
-'histlast' => 'نوێترین',
-'historysize' => '({{PLURAL:$1|1 بایت|$1 بایت}})',
-'historyempty' => '(پووچ)',
-
-# Revision feed
-'history-feed-title' => 'مێژووی پیاچوونەوە',
-'history-feed-description' => 'مێژووی پیاچوونەوە بۆ ئەم پەڕە لە ویکییەکە',
-'history-feed-item-nocomment' => '$1 Ù„Û• $2',
-'history-feed-empty' => 'لاپەڕەی داخوازی‌کراو بوونی نیە.<br />
-لەوانەیە لەسەر ویکی سڕدرابێتەوە یان ناوی گۆڕدرابێت.<br />
-بۆ لاپەڕەی وەک ئەوە هەوڵی [[Special:Search|گەڕان لەسەر ویکی]] بدە.',
-
-# Revision deletion
-'rev-deleted-comment' => '(بۆچوون سڕایەوە)',
-'rev-deleted-user' => '(ناوی بەکارهێنەر سڕایەوە)',
-'rev-deleted-event' => '(لۆگی کردەوە سڕایەوە)',
-'rev-deleted-text-permission' => "پێداچوونەوەی ئەم لاپەڕە '''سڕدراوەتەوە'''.<br />
-لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]",
-'rev-deleted-text-unhide' => "پێداچوونەوەی ئەم لاپەڕە '''سڕدراوەتەوە'''.<br />
-لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]<br />
-وەک بەڕێوبەر هێشتا دەتوانی [$1 ئەم پێداچوونەوە] ببینی، گەر دەتەوێ پێشتر بڕۆی.",
-'rev-suppressed-text-unhide' => "پێداچوونەوی ئەم لاپەڕە '''بەرگری''' لێ‌کراوە.
-لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].
-وەک بەڕێوبەر هێشتا دەتوانی [$1 ئەم پێداچوونەوە] ببینی، گەر دەتەوێ پێشتر بڕۆی.",
-'rev-deleted-text-view' => "پێداچوونەوەی ئەم لاپەڕە '''سڕدراوەتەوە'''.<br />
-وەک بەڕێوبەر هێشتا دەتوانی چاوی لێ‌بکەی؛ لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].",
-'rev-suppressed-text-view' => "پێداچوونەوی ئەم لاپەڕە '''بەرگری''' لێ‌کراوە.
-وەک بەڕێوبەر دەتوانی بیبینی؛ لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].",
-'rev-deleted-no-diff' => "ناتوانی ئەم جیاوازیە ببینی لەبەر ئەوەی یەکێک لە پێداچوونەوەکان '''سڕدراوەتەوه'''‌.<br />
-لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].",
-'rev-deleted-unhide-diff' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازیە '''سڕدراوەتەوه'''.<br />
-لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].<br />
-وەک بەڕێوبەر هێشتا دەتوانی [$1 ئەم جیاوزیە‌] ببینی، گەر دەتەوێ پێشتر بڕۆی.",
-'rev-delundel' => 'پیشاندان/شاردنەوە',
-'rev-showdeleted' => 'نیشان بدە',
-'revisiondelete' => 'سڕینەوە\\هاوردنەوەی پێداچوونەوەکان',
-'revdelete-nooldid-title' => 'مەبەستی پێداچوونەوەی نادیار',
-'revdelete-nooldid-text' => 'پێداچوەنەوەی مەبەستت ڕاچاو نەکردە بۆ ئەنجامی ئەم ÙÛ•Ù†Ú©Ø´ÛŽÙ†Û• یان ئەو پێداچوونەوەی ڕاچاوت کردە بوونی نیە، یا خەریکی Ù‡Û•ÙˆÚµÛŒ داشاردنی پێداچوونەوهی ئێستا‌ ئەدەی.',
-'revdelete-nologtype-title' => 'جۆری لۆگ ڕاچاو نەکراوە',
-'revdelete-nologtype-text' => 'جۆری لۆگت ڕاچاو نەکردە بۆ خستنە‌کاری ئەم کردەوە.',
-'revdelete-nologid-title' => 'پێ‌دراوەی لۆگی نەناسراو',
-'revdelete-nologid-text' => 'بۆ ئەنجامی ئەم ÙÛ•Ù†Ú©Ø´ÛŽÙ†Û• یا Ù„Û†Ú¯ÛŒ ڕووداوی مەبەستت ڕاچاو نەکردووە یان ئەو پێ‌دراوەی ڕاچاوت کردە بوونی نیە.',
-'revdelete-no-file' => 'ئەو پەڕگەی ڕاچاوت کردووە بوونی نیە.',
-'revdelete-show-file-confirm' => 'ئایا دڵنیایت دەتەوێ پێداچوونەوەی سڕاوەی پەڕگەی "<nowiki>$1</nowiki>" لە $2، لە $3دا ببیینی؟',
-'revdelete-show-file-submit' => 'بەڵێ',
-'revdelete-selected' => "'''{{PLURAL:$2|پێداچوونەوەی هەڵبژێراوی|پێداچوونەوەکانی هەڵبژێراوی}} [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|لۆگی ڕووداوەی هەڵبژێراو|لۆگی ڕووداوە هەڵبژێراوەکان}}:'''",
-'revdelete-text' => "'''پێداچوون و ڕووداوە سڕاوەکان هێشتا لە لاپەڕەی مێژوو و لۆگەکان دەست دەکەون،ن بەڵام ناوەڕۆکی ھێندێکیان بەرچاوی گشتیی ناکەون.'''<br />
-بەڕێوبەرانی دیکە Ù„Û• {{SITENAME}}دا، هێشتا دەتوانن دەستکارییە شاراوەکان ببینن Ùˆ Ù„Û• Ú•ÛŽÚ¯Û•ÛŒ ھەر ئەم ÙÛ†Ú•Ù…Û•ÙˆÛ• بیانگەڕێننەوە، مەگەر ئەوەی بەربەستی دیکە داندرابێت.",
-'revdelete-confirm' => 'تکایە بەڵێن بدە کە دەتەوێ ئەوە بکەی و لە ئەنجامەکانی ئەوە ئاگاداریت و بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] ئەنجامی ئەدەی.',
-'revdelete-suppress-text' => "بەرگری دەبێ '''تەنها''' بۆ ئەم بابەتانە بەکاربهێندرێت:<br />
-* سووکایەتیکردن بە کەسایەتییەک<br />
-* بڵاوکردنەوەی زانیاریی تاکەکەسی نەگونجاو<br />
-*: '' ناونیشانی ماڵ یا ژمارە تەلەÙÛ†Ù† Ùˆ ÙˆÛ•Ú© ئەمانە.''<br />",
-'revdelete-legend' => 'دانانی بەربەستەکانی بەرچاوکەوتن',
-'revdelete-hide-text' => 'داشاردنی دەقی پێداچوونەوە',
-'revdelete-hide-image' => 'ناوەڕۆکی پەڕگە بشارەوە',
-'revdelete-hide-name' => 'داشاردنی مەبەست و کردەوە',
-'revdelete-hide-comment' => 'داشاردنی پوختەی دەستکاری',
-'revdelete-hide-user' => 'شاردنەوەی ناوی بەکارهێنەری\\ئای-‌پی دەستکاریکەر',
-'revdelete-hide-restricted' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
-'revdelete-radio-same' => '(مەیگۆڕە)',
-'revdelete-radio-set' => 'بەڵێ',
-'revdelete-radio-unset' => 'نا',
-'revdelete-suppress' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
-'revdelete-unsuppress' => 'لابردنی بەربەستەکان لە سەر پێداچوونەوە گەڕێندراوەکان',
-'revdelete-log' => 'هۆکار:',
-'revdelete-submit' => 'خستنەکار بۆ سەر پێداچوونەوە {{PLURAL:$1|ھەڵبژێردراوەکە|ھەڵبژێردراوەکان}}',
-'revdelete-logentry' => 'گۆڕانی بەرچاوکەوتنی دەستکارییەکی [[$1]]',
-'logdelete-logentry' => 'بیندرانی ڕووداوە‌ گۆڕاوەکەی [[$1]]',
-'revdelete-success' => "'''چۆنیەتی بیندرانی پێداچوونەوە بە سەرکەوتوویی نوێکراوە.'''",
-'revdelete-failure' => "'''ناکرێ دەرکەوتنی پێداچوونەوە نوێبکرێتەوە:'''
-$1",
-'logdelete-success' => "'''بیندرانی لۆگ‌ بە سەرکەوتوویی داندرا.'''",
-'logdelete-failure' => "'''بیندرانی لۆگ داناندرێت:'''
-$1",
-'revdel-restore' => 'چۆنیەتی دەرکەوتن بگۆڕە',
-'pagehist' => 'مێژووی پەڕە',
-'deletedhist' => 'مێژوو بسڕەوە',
-'revdelete-content' => 'ناوەڕۆک',
-'revdelete-summary' => 'پوختەی دەستکاری',
-'revdelete-uname' => 'ناوی بەکارهێنەر',
-'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
-'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
-'revdelete-hid' => '$1ـی داشارد',
-'revdelete-unhid' => '$1ـی ئاشکرا کرد',
-'revdelete-log-message' => '$1 بۆ {{PLURAL:$2|پێداچوونەوەی|پێداچوونەوەکانی}} $2',
-'logdelete-log-message' => '$1 بۆ {{PLURAL:$2|ڕووداوی|ڕووداوەکانی}} $2',
-'revdelete-hide-current' => 'هەڵە لە شاردنەوەی بابەتی ڕیکەوتی $2، کات $1: ئەمە پێداچوونەوی ئێستا لەکاردایە.
-ناکرێ داشاردرێت.',
-'revdelete-show-no-access' => 'هەڵە لە نیشان‌دانی بابەتی ڕیکەوتی $2، کات $1: ئەم بابەتە وەک "بەرگیراو"‌. نیشان‌ کراوە.
-دەسەڵاتی دەست‌پێ‌گەیشتنی ئەوەت نیە.',
-'revdelete-modify-no-access' => 'هەڵە لە چاکسازی بابەتی ڕیکەوتی $2، کات $1: ئەم بابەتە وەک "بەرگیراو"‌. نیشان‌ کراوە.
-دەسەڵاتی دەست‌پێ‌گەیشتنی ئەوەت نیە.',
-'revdelete-modify-missing' => 'هەڵە لە چاکسازی بابەت خاوەن پێناسەی $1: لە بنکەدراو ون بووە !',
-'revdelete-no-change' => "'''ئاگاداری:''' بابەتی ڕێکەوتی $2، کات $1، لە پێش‌دا خاوەن داخوازی هەلبژاردەکانی بیندرانە.",
-'revdelete-concurrent-change' => 'هەڵە لە چاکسازی بابەتی ڕێکەوتی $2 کات $1: لەوانەیە کاتێ تۆ هەوڵی چاکسازیت ئەدا، کەسێکی‌تر دۆخەکەی گۆڕابێت.
-تکایە چاو لە لۆگەکەی بکە.',
-'revdelete-only-restricted' => 'ناتوانی لە دیتنی بابەتەکان لە لایەن بەڕێوبەرانەوە بەرگری بکەیت، مەگەر یەکێک‌تر لە هەڵبژاردەکانی بەرگری هەڵبژێریت.',
-'revdelete-edit-reasonlist' => 'دەستکاری هۆکارەکانی سڕینەوە',
-
-# Suppression log
-'suppressionlog' => 'لۆگی بەرگری‌کردن',
-'suppressionlogtext' => 'لە خوارەوە لیستێک لە سڕاوە و بەرگری‌کراوانەی وا ناوەڕۆکیان لە چاو بەڕێوبەران داشاردراوە دەبینیت.
-بۆ دیتنی ئەو بەرگریانەی ئێستا لە کاردایە چاو لە [[Special:IPBlockList|لیستی بەرگری ئای‌پی]] بکە.',
-
-# History merging
-'mergehistory' => 'یەک‌خستنی مێژووەکانی لاپەڕە',
-'mergehistory-header' => 'ئەم لاپەڕە دەسەڵاتی ئەوەت پێ‌دەدا پێداچوونەوەکانی مێژووی لاپەڕەیەکی مەبەستت بخەیتە سەر لاپەڕەیەکی نوێ.
-ئەرخەیان ببە ئەم گۆڕان‌کاریە لاپەڕە مێژوویەکە بەردەوام دەهێڵێتەوە.',
-'mergehistory-box' => 'سەر یەک‌خستنی پێداچوونەوەکانی دوو لاپەڕە:',
-'mergehistory-from' => 'سەرچاوەی پەڕە',
-'mergehistory-into' => 'پەڕەی مەبەست:',
-'mergehistory-list' => 'ئەو مێژووی لاپەڕانە وا توانای سەر یەک‌خستنیان هەیە',
-'mergehistory-merge' => 'ئەم پێداچوونەوانەی [[:$1]] دەتواندرێ بخرێتە سەر [[:$2]].
-دەتوانی لە ستوونی دوکمە ڕادیۆیەکە بۆ تەنها خستنە‌سەر پێداچوونەوەکانی ڕێکەوتێکی تایبەت یا پێش ئەوە کەڵک وەر بگریت.
-لەیادت بێت کە بەکارهێنانی بەستەرەکانی ڕێن‌نیشاندەر، ستوونەکە وەک ئەوەڵ لێ‌دەکاتەوە.',
-'mergehistory-go' => 'نیشان‌دانی ئەو دەستکاریانە وا توانای خستنەسەر یەکیان هەیە',
-'mergehistory-submit' => 'خستنەسەریەکی پێداچوونەوەکان',
-'mergehistory-empty' => 'ناتواندرێت هیچ یەک لە پێداچوونەوەکان بخرێتە ‌سەریەک.',
-'mergehistory-success' => '$3 {{PLURAL:$3|پێداچوونەوەی|پێداچوونەوەی}} [[:$1]] بە سەرکەوتوویەوە خرایە سەر [[:$2]].',
-'mergehistory-fail' => 'سەریەک خستنی مێژوو پێک‌نایەت، تکایە دیسان دیاریکەرەکانی لاپەڕە و کات چاو لێ بکەوە.',
-'mergehistory-no-source' => 'لاپەڕەی سەرچاوەی $1 بوونی نیە.',
-'mergehistory-no-destination' => 'لاپەڕەی مەبەستی $1 بوونی نیە.',
-'mergehistory-invalid-source' => 'لاپەڕەی سەرچاوە دەبێ سەردێڕێکی گونجاو بێت.',
-'mergehistory-invalid-destination' => 'لاپەڕەی مەبەست دەبێ سەردێڕێکی گونجاو بێت.',
-'mergehistory-autocomment' => '[[:$1]] خرایە سەر [[:$2]]',
-'mergehistory-comment' => '[[:$1]] خرایە سەر [[:$2]]: $3',
-'mergehistory-same-destination' => 'لاپەڕەی سەرچاوە و مەبەست نابێ یەکێک بن.',
-'mergehistory-reason' => 'هۆکار:',
-
-# Merge log
-'mergelog' => 'لۆگی یەککردن',
-'pagemerge-logentry' => '[[$1]] خرایە سەر [[$2]] (پێداچوونەوەکان تا $3)',
-'revertmerge' => 'لەیەک جیاکردنەوە',
-'mergelogpagetext' => 'لە خوارەوە دوایین مێژووی‌لاپەڕە خستنە سەر لاپەڕەیەکی‌تر، دەبینی.',
-
-# Diffs
-'history-title' => 'مێژووی پیاچوونەوەکانی "$1"',
-'difference' => '(جیاوازی نێوان پێداچوونەوەکان)',
-'lineno' => 'ھێڵی $1:',
-'compareselectedversions' => 'ھەڵسەنگاندنی وەشانە ھەڵبژێردراوەکان',
-'showhideselectedversions' => 'نیشان‌دان\\داشاردنی پێداچوونەوەکانی هەڵبژێردراو',
-'editundo' => 'پووچەڵ‌کردنەوە',
-'diff-multi' => '({{PLURAL:$1|پێداچوونەوەیەکی نێوانیی|$1 پێداچوونەوەی نێوانیی}} نیشان نەدراوە)',
-
-# Search results
-'searchresults' => 'ئەنجامەکانی گەڕان',
-'searchresults-title' => 'ئەنجامەکانی گەڕان بۆ "$1"',
-'searchresulttext' => 'بۆ زانیاری زیاتر دەربارەی گەڕان {{SITENAME}} ، بڕوانە لە [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'گەڕایت بۆ \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|هەموو ئەو پەڕانەی دەستپێدەکەن بە "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|هەموو ئەو پەڕانەی بەستەرکراون بۆ "$1"]])',
-'searchsubtitleinvalid' => "گەڕایت بۆ '''$1'''",
-'toomanymatches' => 'هاوتای ئەوەی داوات کرد، زۆر هەیە. تکایە داوای‌تر تاقی بکەوە.',
-'titlematches' => 'سەردێڕی پەڕە پێی ئەخوا',
-'notitlematches' => 'لە نێو سەردێڕەکان نەبینرا',
-'textmatches' => 'هاوتاکانی دەقی لاپەڕە',
-'notextmatches' => 'لە دەقی نووسراوەکان دا نەبینرا',
-'prevn' => '{{PLURAL:$1|$1}}ی پێشوو',
-'nextn' => '{{PLURAL:$1|$1}}ی دواتر',
-'prevn-title' => '$1 {{PLURAL:$1|ئەنجامی|ئەنجامی}} پێشو',
-'nextn-title' => '$1 {{PLURAL:$1|ئەنجامی|ئەنجامی}} دواتر',
-'shown-title' => 'لە هەر لاپەڕە $1 {{PLURAL:$1|ئەنجام|ئەنجام}} نیشان‌ بدە',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ببینە',
-'searchmenu-legend' => 'ھەڵبژاردەکانی گەڕان',
-'searchmenu-exists' => "'''لەم ویکیە‌دا لاپەڕەیەک هەیە کە بە \"[[:\$1]]\" ناونراوە.'''",
-'searchmenu-new' => "'''لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!'''",
-'searchhelp-url' => 'Help:پێرست',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|گەڕیان لە پەڕەکانی بەم پێشگرەوە]]',
-'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 ({{PLURAL:$2|یەک وشە|$2 وشە}})',
-'search-result-score' => 'پەیوەندی: $1%',
-'search-redirect' => '(ئاڵوگۆڕ $1)',
-'search-section' => '(بەشی $1)',
-'search-suggest' => 'ئایا مەبەستت ئەمە بوو: $1',
-'search-interwiki-caption' => 'پرۆژە خوشکەکان',
-'search-interwiki-default' => '$1 ئەنجام:',
-'search-interwiki-more' => '(زیاتر)',
-'search-mwsuggest-enabled' => 'بە پێشنیارەکانەوە',
-'search-mwsuggest-disabled' => 'بێ پێشنیار',
-'search-relatedarticle' => 'پەیوەست',
-'mwsuggest-disable' => 'پێشنیارەکانی AJAX نیشان مەدە',
-'searcheverything-enable' => 'لە ھەموو بۆشایی‌‌ناوەکان دا بگەڕە',
-'searchrelated' => 'پەیوەست',
-'searchall' => 'هەموو',
-'showingresults' => "لە خوارەوە {{PLURAL:$1|'''یەک''' ئەنجام|'''$1''' ئەنجام}} نیشان دراوە، بە دەست پێ کردن لە ژمارەی '''$2'''ەوە.",
-'showingresultsnum' => "لە خوارەوە {{PLURAL:$3|'''١''' ئەنجام|'''$3''' ئەنجام}} دەبینن کە لە ئەنجامی ژمارە '''$2'''ەوە دەست{{PLURAL:$3|پێدەکات|پێدەکەن}}",
-'showingresultsheader' => "{{PLURAL:$5|ئەنجامی '''$1''' لە '''$3'''|ئەنجامەکانی '''$1 - $2''' لە '''$3'''}} بۆ '''$4'''",
-'nonefound' => "'''تێبینی''': لە حاڵەتی بنچینەیی تەنھا لە ھەندێک لە شوێن-‌ناوەکان گەڕان دەکرێت.<br />
-پێشگری ''all:'' بەکاربێنە بۆ گەڕان لە نێو ھەموو کەرستەکان (وەک پەڕەکانی وتووێژ، داڕێژەکان و هتد)، یان شوێن-‌ناوێکی دڵخواز وەک پێشگر بەکار بێنە.",
-'search-nonefound' => 'ھیچ ئەنجامێک کە بە داواکارییەکەت بخوا نەدۆزرایەوە.',
-'powersearch' => 'بە ھێز بگەڕە',
-'powersearch-legend' => 'گەڕانی پێشکەوتوو',
-'powersearch-ns' => 'گەڕان لە بۆشایی‌ناوەکانی:',
-'powersearch-redir' => 'ڕەوانەکراوەکان لیست بکرێن',
-'powersearch-field' => 'گەڕان بۆ',
-'powersearch-togglelabel' => 'پشکنینی:',
-'powersearch-toggleall' => 'ھەموو',
-'powersearch-togglenone' => 'ھیچیان',
-'search-external' => 'گەڕانی دەرەکی',
-'searchdisabled' => 'گەڕانی {{SITENAME}} ئێستە کار ناکات.
-دەتوانی بۆ ئێستا لە گەڕانی گووگڵ کەڵک وەرگری.
-لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
-
-# Quickbar
-'qbsettings' => 'خێرا-تووڵ',
-'qbsettings-none' => 'هیچ',
-'qbsettings-fixedleft' => 'چەپ‌ سەپێندراو',
-'qbsettings-fixedright' => 'ڕاست سەپێندراو',
-'qbsettings-floatingleft' => 'سەراوی چەپ',
-'qbsettings-floatingright' => 'سەراوی ڕاست',
-
-# Preferences page
-'preferences' => 'ھەڵبژاردەکان',
-'mypreferences' => 'ھەڵبژاردەکانم',
-'prefs-edits' => 'ژمارەی گۆڕانکارییەکان:',
-'prefsnologin' => 'لەژوورەوە نیت',
-'prefsnologintext' => 'بۆ دانانی هەڵبژاردەکانی بەکارهێنەر دەبێ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} بچیتە ژوورەوە]</span>.',
-'changepassword' => 'تێپەڕوشە بگۆڕە',
-'prefs-skin' => 'پێستە',
-'skin-preview' => 'پێش بینین',
-'prefs-math' => 'بیرکاری',
-'datedefault' => 'ھەڵنەبژێردراو',
-'prefs-datetime' => 'کات و ڕێکەوت',
-'prefs-personal' => 'پرۆÙایلی بەکارھێنەر',
-'prefs-rc' => 'دوایین گۆڕانکارییەکان',
-'prefs-watchlist' => 'لیستی چاودێڕییەکان',
-'prefs-watchlist-days' => 'ژمارەی ڕۆژە نیشاندراوەکان لە لیستی چاودێڕییەکان:',
-'prefs-watchlist-days-max' => '(ئه‌وپه‌ڕی ٧ ڕۆژە)',
-'prefs-watchlist-edits' => 'ئەوپەڕی ژمارەی گۆڕانکارییەکان بۆ نیشان دان لە لیستی پەرە پێدراوی چاودێڕی:',
-'prefs-watchlist-edits-max' => '(ئەوپەڕی ژمارە: ١٠٠٠)',
-'prefs-watchlist-token' => 'ڕەمزی لیستی چاودێری:',
-'prefs-misc' => 'جۆراوجۆر',
-'prefs-resetpass' => 'تێپەڕوشە بگۆڕە',
-'prefs-email' => 'ھەڵبژاردەکانی ئیمەیل',
-'prefs-rendering' => 'ڕواڵەت',
-'saveprefs' => 'پاشەکەوت',
-'resetprefs' => 'گۆڕانکارییە پاشەکەوت نەکراوەکان پاک بکەرەوە',
-'restoreprefs' => 'ھەموو تەنزیمەکان ببەرەوە بۆ حاڵەتی بنچینەیی',
-'prefs-editing' => 'دەستکاریکردن',
-'prefs-edit-boxsize' => 'قەبارەی پەنجەرەی گۆڕانکاری.',
-'rows' => 'ڕیزەکان:',
-'columns' => 'ستوونەکان:',
-'searchresultshead' => 'گەڕان',
-'resultsperpage' => 'ژمارەی ئەنجامەکان لە ھەر پەڕەیەک:',
-'contextlines' => 'ژمارەی دێڕەکانی ھەر ئەنجام:',
-'contextchars' => 'ژمارەی پیتەکانی ھەر دێڕ:',
-'stub-threshold' => 'بەربەرە بۆ داڕێژانی(بایت) <a href="#" class="stub">بەستەری ناتەواو</a>:',
-'recentchangesdays' => 'ژمارە ڕۆژە نیشاندراوەکان لە دوایین گۆڕانکارییەکان:',
-'recentchangesdays-max' => '(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})',
-'recentchangescount' => 'ژمارەی گۆڕانکارییەکان Ú©Û• نیشان ئەدرێن Ù„Û• حاڵەتی دیÙاڵت:',
-'prefs-help-recentchangescount' => 'ئەمە دوایین گۆڕانکارییەکان، مێژووی پەڕەکان و لۆگەکانیش لەبەردەگرێت.',
-'prefs-help-watchlist-token' => 'بە Ù¾Ú• کردنەوەی ئەم شوێنە بۆشاییە بە وشەیەکی نهێنی، Ùیدی RSS بۆ لیستی چاودێریەکەت درووست دەکرێت.
- هەر کەس ئەو وشە نهێنیەی هەبێ دەتوانێ چاو لە لیستی چاودێریەکەت بکات، بۆیە دراوەیەکی پارێزراو هەڵیبژێرە.
-Ùەرموو ئەمە دراوەیەکی بە هەڵکەوت درووست‌کراو Ú©Û• دەتوانی Ú©Û•ÚµÚ©ÛŒ لێ‌وەرگری: $1',
-'savedprefs' => 'ھەڵبژاردەکانت پاشەکەوت کران',
-'timezonelegend' => 'ناوچەکات:',
-'localtime' => 'کاتی ناوچەیی:',
-'timezoneuseserverdefault' => 'کەڵک وەرگرتن لە بنچینەی ڕاژەکار',
-'timezoneuseoffset' => 'دیکە (ناتەواویەکان دیاری بکە)',
-'timezoneoffset' => 'جیاوازی¹:',
-'servertime' => 'کاتی server:',
-'guesstimezone' => 'لە وێبگەڕەکە بیگرە',
-'timezoneregion-africa' => 'ئەÙریقا',
-'timezoneregion-america' => 'ئەمریکا',
-'timezoneregion-antarctica' => 'پۆڵی باشوور',
-'timezoneregion-arctic' => 'پۆڵی باکوور',
-'timezoneregion-asia' => 'ئاسیا',
-'timezoneregion-atlantic' => 'زەریای ئەتڵەسی',
-'timezoneregion-australia' => 'ئوستڕاڵیا',
-'timezoneregion-europe' => 'ئەورووپا',
-'timezoneregion-indian' => 'زەریای هندی',
-'timezoneregion-pacific' => 'زەریای هێمن',
-'allowemail' => 'ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن',
-'prefs-searchoptions' => 'ھەڵبژاردەکانی گەڕان',
-'prefs-namespaces' => 'بۆشایی‌ناوەکان',
-'defaultns' => 'ئەگەرنا لەم بۆشایی ناوانەدا بگەڕە:',
-'default' => 'بنچینەیی',
-'prefs-files' => 'پەڕگەکان',
-'prefs-custom-css' => 'CSSی دڵخواز',
-'prefs-custom-js' => 'JSی دڵخواز',
-'prefs-reset-intro' => 'دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.
-گەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.',
-'prefs-emailconfirm-label' => 'پشتڕاست کردنەوەی ئیمەیل:',
-'prefs-textboxsize' => 'قەبارەی پەنجەرەی گۆڕانکاری',
-'youremail' => 'ئی‌مەیل:',
-'username' => 'ناوی به‌كارهێنه‌ر:',
-'uid' => 'ژمارەی بەکارھێنەر:',
-'prefs-memberingroups' => 'ئەندامی {{PLURAL:$1|گرووپی|گرووپەکانی}}:',
-'prefs-registration' => 'کاتی خۆتۆمارکردن:',
-'yourrealname' => 'ناوی ڕاستی:',
-'yourlanguage' => 'زمان',
-'yourvariant' => 'زاراوە:',
-'yournick' => 'نازناو',
-'prefs-help-signature' => 'بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە "<nowiki>~~~~</nowiki>" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.',
-'badsig' => 'ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌',
-'badsiglength' => 'واژۆکەت زۆر درێژە.
-واژۆ نابێ لە $1 {{PLURAL:$1|نووسە|نووسە}} درێژتر بێت.',
-'yourgender' => 'جنس:',
-'gender-unknown' => 'ئاشکرا نەکراو',
-'gender-male' => 'پیاو',
-'gender-female' => 'Ú˜Ù†',
-'prefs-help-gender' => 'دڵخواز: بۆ بانگ کردنی دروست بە دەستی نەرمامێر.
-ئەم زانیارییە گشتی ئەبێ.',
-'email' => 'ئی‌مەیل',
-'prefs-help-realname' => 'ناوی ڕاستی دڵخوازە.
-ئەگەر پێت خۆش بێت بیدەی، زۆرتر ڕاتدەکێشێت بۆ کارەکانت.',
-'prefs-help-email' => 'دانانی ناونیشانی ئیمەیل دڵخوازانەیە، بەڵام ئەگەر تێپەڕوشەکەت لەیادکرد، بۆ نوێ کردنەوەی ئیمەیل پێویست دەبێت.<br />
-ھەروا دەتوانی ھەڵبژێری کە بەکارھێنەرانی دیکە بێ تێگەیشتن لە کەسایەتیت، لە پەڕەی لێدوان پێوەندیت لەگەڵ بگرن.',
-'prefs-help-email-required' => 'ناونیشانی ئیمەیل پێویستە.',
-'prefs-info' => 'زانیاریی سەرەتایی',
-'prefs-i18n' => 'نێونەتەویی کردن',
-'prefs-signature' => 'واژۆ',
-'prefs-dateformat' => 'ڕازاندنەوەی ڕێکەوت',
-'prefs-timeoffset' => 'قەرەبووکەری کات',
-'prefs-advancedediting' => 'ھەڵبژاردەکانی پێشکەوتوو',
-'prefs-advancedrc' => 'ھەڵبژاردەکانی پێشکەوتوو',
-'prefs-advancedrendering' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-advancedsearchoptions' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-advancedwatchlist' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-display' => 'هەڵبژاردەکانی نیشان‌دان',
-'prefs-diffs' => 'جیاوازییەکان',
-
-# User rights
-'userrights' => 'بەڕێوەبردنی ماÙەکانی بەکارهێنەران',
-'userrights-lookup-user' => 'بەڕێوەبردنی گرووپەکانی بەکارهێنەران',
-'userrights-user-editname' => 'ناوی بەکارهێنەرێک بنووسە:',
-'editusergroup' => 'گرووپەکانی بەکارهێنەر بگۆڕە',
-'editinguser' => "گۆڕینی ماÙەکانی بەکارهێنەر بۆ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'دەستکاری کردنی گرووپەکانی بەکارهێنەران',
-'saveusergroups' => 'گرووپی بەکارهێنەران پاشەکەوت بکە',
-'userrights-groupsmember' => 'ئەندامە لە:',
-'userrights-groups-help' => 'دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە بگۆڕیت:
-* چوارچێوەی نیشان‌کراو مانای ئەوەیە لەو گرووپەدا هەیە.
-* چوارچێوەی نیشان‌نەکراو مانای ئەوەیە لەو گرووپەدا نیە.
-* A * پێت‌دەڵێ ناتوانی ئەو گرووپی جارێکی دی زیادت کردووە لای‌بەری.',
-'userrights-reason' => 'هۆکار:',
-'userrights-no-interwiki' => 'دەسەڵاتی گۆڕینی ماÙەکانی بەکارهێنەر Ù„Û• ویکی‌یەکانی دیکەت نیە.',
-'userrights-nodatabase' => 'بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.',
-'userrights-nologin' => 'بۆ دانانی ماÙەکانی بەکارهێنەر دەبێ بە هەژماری بەڕێوبەری [[Special:UserLogin|بچیتە ژووروە]].',
-'userrights-notallowed' => 'هەژمارەکەی تۆ دەسەڵاتی دانانی ماÙەکانی بەکارهێنەری نیە.',
-'userrights-changeable-col' => 'ئەو گرووپانە بۆت ئەگۆڕدرێن',
-'userrights-unchangeable-col' => 'ئەو گرووپانە بۆت ناگۆڕدرێن',
-
-# Groups
-'group' => 'گرووپ:',
-'group-user' => 'بەکارهێنەران',
-'group-autoconfirmed' => 'بەکارھێنەرە خۆکار پەسندکراوەکان',
-'group-bot' => 'بۆتەکان',
-'group-sysop' => 'بەڕێوبەران',
-'group-bureaucrat' => 'بورووکراتەکان',
-'group-suppress' => 'چاودێرەکان',
-'group-all' => '(هەموو)',
-
-'group-user-member' => 'بەکارھێنەر',
-'group-autoconfirmed-member' => 'بەکارھێنەری خۆکار پەسەندکراو',
-'group-bot-member' => 'بۆت',
-'group-sysop-member' => 'بەڕێوەبەر',
-'group-bureaucrat-member' => 'بورووکرات',
-'group-suppress-member' => 'چاودێر',
-
-'grouppage-user' => '{{ns:project}}:بەکارھێنەران',
-'grouppage-autoconfirmed' => '{{ns:project}}:بەکارهێنەرانی خۆکار-بڕواکراو',
-'grouppage-bot' => '{{ns:project}}:بۆتەکان',
-'grouppage-sysop' => '{{ns:project}}:بەڕێوبەران',
-'grouppage-bureaucrat' => '{{ns:project}}:بورووکراتەکان',
-'grouppage-suppress' => '{{ns:project}}:چاودێر',
-
-# Rights
-'right-read' => 'خوێندنەوەی پەڕەکان',
-'right-edit' => 'دەستکاری کردنی پەڕەکان',
-'right-createpage' => 'دروست کردنی پەڕەکان (کە پەڕەی لێدوان نین)',
-'right-createtalk' => 'دروست کردنی پەڕەکانی لێدوان',
-'right-createaccount' => 'دروست کردنی ھەژماری بەکارھێنەریی نوێ',
-'right-minoredit' => 'بچووک دیاری کردنی گۆڕانکارییەکان',
-'right-move' => 'گواستنەوەی پەڕەکان',
-'right-move-subpages' => 'گواستنەوەی لاپەڕەکان دەگەڵ ژێرلاپەڕەکانی',
-'right-move-rootuserpages' => 'گواستنەوەی بنەرەتی لاپەڕەکانی بەکارهێنەر',
-'right-movefile' => 'گواستنەوەی پەڕگەکان',
-'right-suppressredirect' => 'درووست‌ نەکردنی رەوانەکەر لە لاپەڕەی سەرچاوە کاتی گواستنەوەی لاپەڕەکان',
-'right-upload' => 'بارکردنی پەڕگەکان',
-'right-reupload' => 'سەرنووسینی ئەو پەڕگانەی وا هەن',
-'right-reupload-own' => 'سەرنووسینی ئەو پەڕگانەی وا هەن کاتێ کەسێ خۆی باریان دەکات',
-'right-reupload-shared' => 'بەتاڵ‌کردنەوەی پەڕگە لە سەر میدیا هاوبەشە ناوخۆکان',
-'right-upload_by_url' => 'بارکردنی پەرگە لە ئەدرەسێکی سەر تۆڕەوە',
-'right-purge' => 'خاڵی‌کردنی کاشی وێبگە بۆ لاپەڕەیەک بێ بڕواپێ‌کران',
-'right-autoconfirmed' => 'دەستکاری لاپەڕەکانی‌ نیوەپارێزراو',
-'right-bot' => 'هەڵسوکەوت لەگەڵ‌کران وەک پرۆسەیەکی خۆکار',
-'right-nominornewtalk' => 'دەستکاری بچووکی لاپەڕەی وتووێژ بەو شێوەی نەبێتە هۆی درووست‌بوونی پەیامی نوێ',
-'right-apihighlimits' => 'خستنە‌کاری سنووری زیاتر بۆ داخوازیەکانی API',
-'right-writeapi' => 'کەڵک وەر گرتن لە نووسینی API',
-'right-delete' => 'سڕینەوەی پەڕەکان',
-'right-bigdelete' => 'سڕینەوە و هاوردنەوەی پێداچوونەوەیکی تایبەتی لاپەڕەکان',
-'right-deleterevision' => 'سڕینەوە و هاوردنەوەی پێداچوونەوەیکی تایبەتی لاپەڕەکان',
-'right-deletedhistory' => 'دیتنی دراوە سڕاوەکانی مێژوو بێ دەقە هەڵواسراوەکانی',
-'right-browsearchive' => 'گەڕانی ناو لاپەڕە سڕاوەکان',
-'right-undelete' => 'هاوەردنەوەی لاپەڕەیەک',
-'right-suppressrevision' => 'چاوپێداخشان و هاردنوەی ئەو لاپەڕانەی لە بەڕێوبەران داشاردرابوو.',
-'right-suppressionlog' => 'دیتنی لۆگە ئەهلیەکان',
-'right-block' => 'بەربەستنی بەکارھێنەرانی تر لە دەستکاری کردن',
-'right-blockemail' => 'بەرگری‌کردنی بەکارهێنەرێک لە ناردنی ئی‌مەیل',
-'right-hideuser' => 'بەربەست‌کردنی ناوێکی بەکارهێنەری، داشاردنی لە بەرچاوی هەموان',
-'right-ipblock-exempt' => 'لادان لە بەرگریەکانی ئای‌پی، بەرگریە خۆکارەکان و بەرگریە ڕیزەکان',
-'right-proxyunbannable' => 'لادان لە بەرگری خۆکاری پرۆکسیەکان',
-'right-protect' => 'گۆڕانی ئاستی پارێزراوی و دەستکاری لاپەڕە پارێزراوەکان',
-'right-editprotected' => 'دەستکاری لاپەڕە پارێزراوەکان (بێ پاراستنی زنجیری)',
-'right-editinterface' => 'گۆڕانی ڕووکاری بەکارهێنەر',
-'right-editusercssjs' => 'دەستکاری پەڕگەکانی CSS و JSـی بەکارهێنەرانی دیکە',
-'right-editusercss' => 'گۆڕانی پەڕگەکانی CSSـی دیکەی بەکارهێنەر',
-'right-edituserjs' => 'گۆڕانی پەڕگەکانی JSـی دیکەی بەکارهێنەر',
-'right-rollback' => 'بەخێرایی گەڕانەوەی دەستکاریەکانی دوایین بەکارهێنەر کە لاپەڕەیەکی تایبەتی دەستکاری کردە',
-'right-markbotedits' => 'نیشان‌کردنی دەستکاریە گەڕێنراوەکان وەک دەستکاریەکانی بۆت (bot)',
-'right-noratelimit' => 'کاریگەری وەرنەگرتن لە سنوورەکانی ئاست',
-'right-import' => 'هێنانەناوەی لاپەڕە لە ویکی‌یەکانی دیکە',
-'right-importupload' => 'هێنانەناوەی لاپەڕە لە پەڕگەیەکی بارکراو',
-'right-patrol' => 'لەژێرچاودێری نیشان‌کردنی دەستکاریەکانی کەسانی‌تر',
-'right-autopatrol' => 'خۆکار لەژێرچاودێری نیشان‌کردنی دەستکاریەکانی کەسێک بۆخۆی',
-'right-patrolmarks' => 'دیتنی دوایین دەستکاریەکان وا لەژێرچاودێری نیشان‌کراون',
-'right-unwatchedpages' => 'دیتنی لیستێک لەو لاپەڕانەی چاودێری ناکرێن',
-'right-trackback' => 'ناردنی ڕێچکەیەک',
-'right-mergehistory' => 'سەریەک‌خستنی میژووی لاپەڕەکان',
-'right-userrights' => 'دەستکاری ماÙەکانی هەموو بەکارهێنەران',
-'right-userrights-interwiki' => 'دەستکاری ماÙەکانی بەکارهێنەریی بەکارهێنەران Ù„Û• ویکی‌یەکانی دیکە‌دا',
-'right-siteadmin' => 'داخستن و کردنەوەی بنکەدراو',
-'right-reset-passwords' => 'ڕیکخستنەوەی تێپەڕوشەی بەکارهێنەرانی دیکە',
-'right-override-export-depth' => 'هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت',
-'right-versiondetail' => 'نیشان‌دانی زانیاریەکانی وەشانی بڵاوەی نەرم‌ئامێر',
-
-# User rights log
-'rightslog' => 'Ù„Û†Ú¯ÛŒ ماÙەکانی بەکارهێنەر',
-'rightslogtext' => 'ئەمە Ù„Û†Ú¯ÛŒ دەستکاری ماÙەکانی بەکار‌هێنەرە.',
-'rightslogentry' => 'بۆ $1 ئەندامەتی گرووپی $2 گۆڕدرا بۆ $3',
-'rightsnone' => '(ھیچ)',
-
-# Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'خوێندنەوەی ئەم پەڕە',
-'action-edit' => 'دەستکاری ئەم پەڕە',
-'action-createpage' => 'درووست‌کردنی لاپەڕە',
-'action-createtalk' => 'درووست‌کردنی لەپەڕەکانی وتووێژ',
-'action-createaccount' => 'درووست‌کردنی هەژمارەی ئەم بەکارهێنەرە',
-'action-minoredit' => 'نیشان‌کردنی ئەم دەستکاریە وەک بچووک',
-'action-move' => 'گواستنەوەی ئەم پەڕە',
-'action-move-subpages' => 'گواستنەوەی ئەم لاپەڕە و ژێرلاپەڕەکانی',
-'action-move-rootuserpages' => 'گواستنەوەی بنەرەتی لاپەڕەکانی بەکارهێنەر',
-'action-movefile' => 'ئەم پەڕگەیە بگوازەوە',
-'action-upload' => 'ئەم پەڕەیە بار بکە',
-'action-reupload' => 'سەرنووسینی ئەم پەڕگە وا هەیە',
-'action-reupload-shared' => 'بەتاڵ‌کردنی ئەم پەڕگە لە‌سەر شوێنێکی هاوبەش',
-'action-upload_by_url' => 'بارکردنی ئەم پەرگە لە ئەدرەسێکی سەر تۆڕەوە',
-'action-writeapi' => 'کەڵک وەر گرتن لە نووسینی API',
-'action-delete' => 'ئەم پەڕەیە بسڕەوە',
-'action-deleterevision' => 'سڕینی ئەم پێداچوونەوە',
-'action-deletedhistory' => 'دیتنی مێژووی سڕاوەی ئەم لاپەڕە',
-'action-browsearchive' => 'گەران لە نێو لاپەڕە سڕاوەکان',
-'action-undelete' => 'گەڕانەوەی ئەم لاپەڕە',
-'action-suppressrevision' => 'چاوپێداخشان و هاردنوەی ئەم لاپەڕە شاراوە',
-'action-suppressionlog' => 'دیتنی ئەم لۆگە ئەهلیە',
-'action-block' => 'بەربەست کردنی ئەم بەکارهێنەرە بۆ دەستکاری‌کردن',
-'action-protect' => 'گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە',
-'action-import' => 'هێنانەناوەی ئەم لاپەڕە لە ویکی‌یەکی دیکە',
-'action-importupload' => 'هێنانەناوەی ئەم لاپەڕە لە پەڕگەیەکی بارکراو',
-'action-patrol' => 'لەژێرچاودێری نیشان‌کردنی دەستکاریەکانی کەسانی‌تر',
-'action-autopatrol' => 'دەستکاریەکانت وەک لەژێرچاودێری نیشان کراون',
-'action-unwatchedpages' => 'دیتنی لیستێک لەو لاپەڕانەی چاودێری ناکرێن',
-'action-trackback' => 'ناردنی ڕێچکەیەک',
-'action-mergehistory' => 'سەریەک‌خستنی میژووی ئەم لاپەڕە',
-'action-userrights' => 'دەستکاری ماÙەکانی هەموو بەکارهێنەران',
-'action-userrights-interwiki' => 'دەستکاری ماÙەکانی بەکارهێنەریی بەکارهێنەران Ù„Û• ویکی‌یەکانی دیکە‌دا',
-'action-siteadmin' => 'داخستن یا کردنەوەی بنکەدراو',
-
-# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری|گۆڕانکاری}}',
-'recentchanges' => 'دوایین گۆڕانکارییەکان',
-'recentchanges-legend' => 'هەڵبژاردنەکانی دوا گۆڕانکارییەکان',
-'recentchangestext' => 'دواکەوتنی دوایین گۆڕانکارییەکان لەسەر ویکی لەم لاپەڕەدا.',
-'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە Ù„Û•Ù… «Ùید»ەوە.',
-'recentchanges-label-legend' => 'پێرست: $1.',
-'recentchanges-legend-newpage' => '$1 - لاپەڕەی نوێ',
-'recentchanges-label-newpage' => 'ئەم دەستکاریە لاپەڕەیەکی نوێی درووست‌کرد',
-'recentchanges-legend-minor' => '$1 - دەستکاریی بچووک',
-'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
-'recentchanges-legend-bot' => '$1 - دەستکاریی بۆت',
-'recentchanges-label-bot' => 'ئەم دەستکاریە لە لایەن بۆتەوە پێک هاتووە',
-'recentchanges-legend-unpatrolled' => '$1 - دەستکاری چاودێری‌نەکراو',
-'recentchanges-label-unpatrolled' => 'ئەم دەستکاریە هێشتا نەڕۆشتەتە ژێر چاودێری',
-'rcnote' => "لە خوارەوەدا {{PLURAL:$1|'''۱''' گۆڕانکاری |دوایین '''$1''' گۆڕانکارییەکان}} لە دوایین {{PLURAL:$2|ڕۆژ|'''$2''' ڕۆژەوە}} ، تا $5، $4 دەبینن.",
-'rcnotefrom' => "ئەوی‌ خوارەوە گۆڕانکارییەکانە لە '''$2''' بۆ ئێستا (هەتا '''$1''' نمایشت).",
-'rclistfrom' => 'گۆڕانکارییە نوێکان کە لە $1ەوە دەست پێدەکەن نیشان بدە.',
-'rcshowhideminor' => 'دەستکارییە بچووکەکان $1',
-'rcshowhidebots' => 'بۆتەکان $1',
-'rcshowhideliu' => 'بەکارھێنەرە لە ژوورەکان $1',
-'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
-'rcshowhidepatr' => 'گۆرانکارییە کۆنترۆڵکراوەکان $1',
-'rcshowhidemine' => 'دەستکارییەکانی من $1',
-'rclinks' => 'دوایین $1 گۆڕانکارییەکانی دوایین $2 ڕۆژی <br />$3',
-'diff' => 'جیاوازی',
-'hist' => 'مێژوو',
-'hide' => 'بشارەوە',
-'show' => 'نیشان بدە',
-'minoreditletter' => 'ب',
-'newpageletter' => 'Ù†',
-'boteditletter' => '.بۆت',
-'number_of_watching_users_pageview' => '[$1 چاودێر لەسەر {{PLURAL:$1|بەکارهێنەر|بەکارهێنەر}}]',
-'rc_categories' => 'بەرتەسک‌کردنەوە بە هاوپۆلەکان (به "|" جودای بکەوە‌)',
-'rc_categories_any' => 'هەرکام',
-'newsectionsummary' => '/* $1 */ بەشی نوێ',
-'rc-enhanced-expand' => 'وردەکارییەکان پیشان بدە (پێویستی بە جاڤاسکریپتە)',
-'rc-enhanced-hide' => 'وردەکارییەکان بشارەوە',
-
-# Recent changes linked
-'recentchangeslinked' => 'گۆڕانکارییە پەیوەندیدارەکان',
-'recentchangeslinked-feed' => 'گۆڕانکارییە پەیوەندیدارەکان',
-'recentchangeslinked-toolbox' => 'گۆڕانکارییە پەیوەندیدارەکان',
-'recentchangeslinked-title' => 'گۆڕانکارییە پەیوەندیدارەکان بە "$1" ـەوە',
-'recentchangeslinked-noresult' => 'هیچ گۆڕانکارییەک لە لاپەڕەکانی بەستەر پێ‌دراو، لە درێژەی ماوەی دراوە.',
-'recentchangeslinked-summary' => "ئەم لاپەڕە تایبەتە، دوایین گۆڕانکارییەکان لەو لاپەڕانە نیشان ئەدا کە بەستەریان داوە بەم لاپەڕە.
-لاپەڕەکانی ناو [[Special:Watchlist|لیستی چاودێڕییەکانت]] '''ئەستوورن'''.",
-'recentchangeslinked-page' => 'ناوی پەڕە:',
-'recentchangeslinked-to' => 'نیشاندانی گۆڕانکارییەکانی ئەو پەڕگانە کە لینک دراون بەم پەڕگەوە',
-
-# Upload
-'upload' => 'پەڕگەیەک بار بکە',
-'uploadbtn' => 'پەڕگە بار بکە',
-'reuploaddesc' => 'هەڵوەشانەوەی بارکردن Ùˆ گەڕانەوە بۆ Ùۆرمی بارکردن',
-'upload-tryagain' => 'پێناسەی گۆڕدراوی پەڕگە بنێرە',
-'uploadnologin' => 'لەژوورەوە نیت',
-'uploadnologintext' => 'بۆ بارکردنی پەڕگەکان ئەشێ [[Special:UserLogin|لە ژوورەوە بیت]].',
-'upload_directory_missing' => 'لقی بارکردن ($1) ون بووە و ڕاژەکاری‌وێب بۆی درووست ناکرێت.',
-'upload_directory_read_only' => 'ڕاژەکاری‌وێب دەسەڵاتی نووسینی سەر لقی بارکردنی ($1) نیە.',
-'uploaderror' => 'ھەڵە لە بارکردن دا',
-'uploadtext' => "Ùۆرمی خوارەوە بەکاربێنە بۆ بارکردنی پەڕگەکان.<br />
-بۆ بینینی و گەڕان لەو پەڕگانەی پێشتر بار کراون، بڕۆ بۆ [[Special:FileList|لیستی پەڕگە بارکراوەکان]]، ھەروەھا [[Special:Log/upload|ڕەشنووسی بارکردنەکان]] و [[Special:Log/delete|ڕەشنووسی سڕینەوەکان]].<br /><br />
-
-بۆ بەکارھێنانی پەڕگەیەک لە پەڕەیەکدا، بەستەرێک بە یەکێک لەم شێوازانەی خوارەوە بە کار بێنە:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' بۆ بەکارهێنانی وەشانی تەواوی پەڕگە
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' بۆ بەکارهێنانی بە پانتایی ٢٠٠ پیکسەل لە چوارچێوەیەک لە لێواری چەپ بە 'alt text' وەک شرۆڤە
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' بۆ بەستەرپێدان بە پەڕگەیەک بێ نیشاندانی خۆی پەڕگەکە",
-'upload-permitted' => 'جۆرە پەڕگە ڕێگەپێدراوەکان: $1.',
-'upload-preferred' => 'جۆرە پەڕگانەی بە باشتر دەزانرێن: $1.',
-'upload-prohibited' => 'جۆرە پەڕگانەی قەدەغە کراون: $1.',
-'uploadlog' => 'لۆگی بارکردن',
-'uploadlogpage' => 'لۆگی بارکردن',
-'uploadlogpagetext' => 'لەخوارەوە لیستی دوایین بارکراوەکان دەبینی.
-بۆ ئەوەی چاوێکیان لێ بکەی، [[Special:NewFiles|گالەری پەڕگە نوێکان]] ببینە.',
-'filename' => 'ناوی پەڕگە',
-'filedesc' => 'پوختە',
-'fileuploadsummary' => 'پوختە:',
-'filereuploadsummary' => 'گۆرانکارییەکانی پەڕگە:',
-'filestatus' => 'بارودۆخی ماÙÛŒ لەبەرگرتنەوە:',
-'filesource' => 'سەرچاوە:',
-'uploadedfiles' => 'پەڕگە بارکراوەکان',
-'ignorewarning' => 'چاوپۆشان لە ئاگادارییەکان و پاشەکەوت کردن بە هەر شێوەیەک',
-'ignorewarnings' => 'گوێ مەدە بە ئاگادارییەکان',
-'minlength1' => 'ناوی پەڕگەکان دەبێ لانیکەم یەک پیت ببێت.',
-'illegalfilename' => 'ناوی‌پەڕگەی "$1" پیتێکی تێدایە کە ڕێگەنەدراوە بۆ سەردێڕی لاپەڕە بەکاربێت.
-تکایە ناوی پەڕگەکە بگۆڕە و دیسان باری بکەوە.',
-'badfilename' => 'ناوی پەڕگە بە "$1" گۆڕا .',
-'filetype-badmime' => 'ڕێگە نەدراوە پەڕگەی "$1" جۆری MIME بار بکرێت.',
-'filetype-bad-ie-mime' => 'ناتوانین ئەم پەڕگە باربکەین لەبەر ئەوەی وێبگەڕی Internet Explore ئەوە وەک "$1" دەناسێت کە ڕێگەنەدراوەیە و جۆرە پەڕگەیەکی مەترسی‌دارە.',
-'filetype-unwanted-type' => "'''\".\$1\"''' جۆرە پەڕگەی نەخوازراوە.
-\$2، ئەو جۆرە {{PLURAL:\$3|پەڕگەیە|پەڕگانەیە}} وا بە باش‌ دازاندرێت.",
-'filetype-banned-type' => "'''\".\$1\"''' جۆرە پەڕگەی ڕێگە پێ‌نەدراوە‌.
-\$2، ئەو جۆرە {{PLURAL:\$3|پەڕگەیە|پەڕگانەیە}} وا ڕێگە دراوە.",
-'filetype-missing' => 'پەڕگەکە پاشگری نییە (وەک ".jpg").',
-'large-file' => 'پێشنیار دەکرێت قەبارەی پەڕگەکان زیاتر لە $1 نەبێت؛
-قەبارەی ئەم پەڕگە $2.',
-'largefileserver' => 'ئەم پەڕگە گەورەتر لەوەیە کە ڕاژەکار ڕێگەدەدات.',
-'emptyfile' => 'ئەو پەڕگەی بارت‌کرد لەوەدەچێ بەتاڵ و خاڵی بێت.
-شایەد ئەوە جۆرە هەڵەیەک لە ناوی لاپەڕەکە بێت.
-گەر بە ڕاستی دەتەوێ ئەو پەڕگە باربکەی جارێکی‌کە چاوی لێ‌بکەوە.',
-'fileexists' => "پەڕگەیەک هەر بەو ناوە‌ لە پێش‌دا هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە '''<tt>[[:$1]]</tt>''' بکە.
-[[$1|thumb]]",
-'filepageexists' => "پەڕەی ناساندن بۆ ئەم پەڕگە پێشتر لە '''<tt>[[:$1]]</tt>''' درووستکراوە، بەڵام پەڕگەیەک بەو ناوەوە ئێستا نادۆزرێتەوە.
-ئەو پوختەی کە نووسیوتە لە پەڕەی ناساندن بەرچاو ناکەوێت.
-گەر دەتەوێ پوختەکەت بەرچاو کەوێت دەبێ خۆت دەستی دەستکاری بکەی.
-[[$1|thumb]]",
-'fileexists-extension' => "پەڕگەیەک هەر بەو ناوە هەیە: [[$2|thumb]]
-* ناوی ئەو پەڕگەی باری ئەکەی:'''<tt>[[:$1]]</tt>'''
-* ناوی ئەو پەڕگەی ئێستا هەیە:'''<tt>[[:$2]]</tt>'''
-تکایە ناوێکی دیکە هەڵبژێرە.",
-'fileexists-thumbnail-yes' => "لەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''. [[$1|thumb]]
-تکایە چاو لە پەڕگەی '''<tt>[[:$1]]</tt>''' بکه.‌
-گەر ئەوەی چاوت لێ‌کرد قەبارەی ڕەسەنی هەر ئەو وێنەیە، پێویست ناکات دیسان هێماکەی باربکەی.",
-'file-thumbnail-no' => "دەستپێکی ناوی ئەم پەڕگە ئەوەیە: '''<tt>$1</tt>'''
-لەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''.
-گەر ئەو وێنەت لە قەبارەی ڕەسەنی‌ خۆی‌دا هەیه،‌ تکایە ئەوە بار بکه،‌ دەنا ناوی پەڕگەکە بگۆڕە.",
-'fileexists-forbidden' => 'پەڕگەیەک بەو ناوە لە پێش‌دا هەیە و سەرنووسین ناکرێت.
-گەر هێشتا دەتەوێ پەڕگەکەت باربکەی، تکایە بگەڕێ دواوە و ناوێکی نوێ بەکاربهێنە.
-[[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'پەڕگەیەک بەو ناوە لە پێش‌دا لە شوێنی پەڕگە هاوبەشەکان هەیه.
-گەر هێشتا دەتەوێ پەڕگەکەت باربکەی، تکایە بگەڕێ دواوە و ناوێکی نوێ بەکاربهێنە.
-[[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'ئەم پەڕگەیە لێ‌گرتنەوەی ئەم {{PLURAL:$1|پەڕگەیە|پەڕگانەیە}}:',
-'file-deleted-duplicate' => 'ئەم پەڕگەیە ڕێک وەک ئەم پەڕگە ([[$1]]) دەچێت کە لەم دواییانەدا سڕاوەتەوە.
-پێش دەست‌پێ‌کردنی دیسان بارکردنەوەی، تکایە چاو لە مێژووی سڕینەوەی ئەو پەڕگە بکە.',
-'successfulupload' => 'بارکردنی سەرکەوتوو',
-'uploadwarning' => 'ئاگادارییەکانی بارکردن',
-'savefile' => 'پەڕگە پاشەکەوت بکە',
-'uploadedimage' => '«[[$1]]» بار کرا',
-'overwroteimage' => 'وەشانێکی نوێی «[[$1]]» بار کرد',
-'uploaddisabled' => 'بارکردن قەدەخە کراوە',
-'uploaddisabledtext' => 'بارکردنی پەڕگەکان لە کار خستراوە.',
-'php-uploaddisabledtext' => 'بارکردنی پەڕگەکان لە PHPدا لە کار خستراوە.
-تکایە چاو لە هەڵبژاردەکانی بارکردنی_پەڕگەکان بکە.',
-'uploadscripted' => 'ئەم پەڕگە HTML یان کۆدی سکریپتی لەخۆگرتووە کە لەوانەیە ببێتە هۆی هەڵە تێگەیشتنی هێندێ وێبگەڕەکان.',
-'uploadvirus' => 'ئەم پەڕگە ڤایرۆسی هەیە! وردەکاری: $1',
-'upload-source' => 'پەڕگەی سەرچاوە',
-'sourcefilename' => 'ناوی پەڕگەی سەرچاوە:',
-'destfilename' => 'ناوی مەبەست:',
-'upload-maxfilesize' => 'ئەو پەری قەبارەی Ùایل: $1',
-'upload-description' => 'پێناسەی پەڕگە',
-'upload-options' => 'ھەڵبژاردەکانی بارکردن',
-'watchthisupload' => 'چاودێریی ئەم پەڕگە بکە',
-'filewasdeleted' => 'پەڕگەیەک بەم ناوە لەم دواییانەدا بارکرا و بە خێرایی سڕایەوە.
-باشتر وایە پێش هەوڵی دووبارە بۆ بارکردن سەرنجی $1 بدەی.',
-'upload-wasdeleted' => "'''ئاگاداری: خەریکی پەڕگەیەک باردەکەی کە لەم دواییانەدا سڕاوەتەوە.'''
-
-پێش بارکردن ئەرخەیان ببە کە بارکردنی ئەو پەڕگە بەسوودە.
-لۆگی سڕینەوەی ئەم پەڕگە بۆ ئاسوودەیی لێرە دانراوە:",
-'filename-bad-prefix' => "دەستپێکی ناوی ئەو پەڕگەی باری دەکەی '''\"\$1\"'''، کە ناوێکی ناسێنەر نیە؛ ئەو جۆرە ناوە زۆربەی کات کامێرا دیجیتاڵەکان خۆکار بەکاری‌دەبەن.
-تکایە ناوێک هەڵبژێرە کە زانیاریی زیاتر بدات سەبارەت بە پەڕگەکەت.",
-
-'upload-proto-error' => 'پرۆتۆکۆڵی هەڵە',
-'upload-proto-error-text' => 'بۆ بارکردن لە تۆڕ، URL دەبێ بە <code>http://</code> یان <code>ftp://</code> دەست‌پێ‌بکات.',
-'upload-file-error' => 'ھەڵەی ناوخۆیی',
-'upload-file-error-text' => 'کێشەیەکی ناوخۆ ڕووی‌دا وەختێ هەوڵی درووست‌کردنی پەڕگەی کاتی ئەدرا لە سەر ڕاژەکار.
-تکایە پەیوەندی بکە بە [[Special:ListUsers/sysop|بەڕێوبەر]].',
-'upload-misc-error' => 'هەڵەیەکی نەناسراوی بارکردن',
-'upload-misc-error-text' => 'هەڵەیەکی نەناسراو لە کاتی بارکردن ڕووی‌دا.
-تکایە لە درووست‌بوون و دەست‌پێ گەیشتنی URL ئەرخەیان ببە و دیسان تاقی‌بکەوە.
-گەر کێشەکە هەر بەردەوام بوو پەیوەندی بکە بە [[Special:ListUsers/sysop|بەڕێوبەر]].',
-'upload-too-many-redirects' => 'URL ڕەوانەکەری زۆری لەخۆ گرتووە',
-'upload-unknown-size' => 'قەبارەی نادیار',
-'upload-http-error' => 'هەڵەیەکی HTTP ڕووئ داوە: $1',
-
-# img_auth script messages
-'img-auth-accessdenied' => 'تێپه‌ربوون ره‌تکرایه‌وه‌',
-'img-auth-nofile' => 'Ùایلی "$1" بوونی نیه‌',
-'img-auth-isdir' => 'هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی "$1" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی Ùایل رێپێدراوه‌',
-
-# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
-'upload-curl-error6-text' => 'ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.
-تکایە دیسان سەرنجی بدەوە کە URL درووست‌ نووسراوە و ماڵپەڕەکە بەردەوام کار دەکات.',
-'upload-curl-error28' => 'کات‌بەسەرچوونی بارکردن',
-'upload-curl-error28-text' => 'ئەو ماڵپەرە کاتی زۆری خایاند بۆ وەڵام دانەوە.
-تکایە ئەرخەیان بە کە ماڵپەڕ بەردەوامە لە کارکردن، نەختێک ڕاوەستە و دیسان تاقی کەوە.
-لەوانەیە لە کاتێ کە کەمتر سەرقاڵ بێت تاقی بکەیتەوە باشتر بێت.',
-
-'license' => 'بەڵگەنامە:',
-'license-header' => 'بەڵگەنامە',
-'nolicense' => 'هیچ‌کام هەڵنەبژاردراوە',
-'license-nopreview' => '(پێشبینین ئامادەی کەڵک وەرگرتن نییە)',
-'upload_source_url' => ' (URLـی بەکار، بۆ دەست‌پێگەیشتنی گشتی)',
-'upload_source_file' => ' (پەڕگەیەک لەسەر کۆمپیوتەرەکەت)',
-
-# Special:ListFiles
-'listfiles-summary' => 'ئەم لاپەڕە تایبەتە هەموو لاپەڕە بارکراوەکانت نیشان ئەدات.
-لەسەر نمای بنچینەیی، دوایین بارکراوەکان لە سەرووی لیستەکە دەبیندرێن.
-بە کرتە لەسەر سەرپەڕی ستوونەکانی دەتوانی شێوازی چنینەکەیان بگۆڕیت.',
-'listfiles_search_for' => 'گەڕان بۆ ناوی مێدیا:',
-'imgfile' => 'Ù¾Û•Ú•Ú¯Û•',
-'listfiles' => 'لیستی پەرگەکان',
-'listfiles_date' => 'ڕێکەوت',
-'listfiles_name' => 'ناو',
-'listfiles_user' => 'بەکارھێنەر',
-'listfiles_size' => 'قەبارە',
-'listfiles_description' => 'پەسن',
-'listfiles_count' => 'وەشانەکان',
-
-# File description page
-'file-anchor-link' => 'Ù¾Û•Ú•Ú¯Û•',
-'filehist' => 'مێژووی پەڕگە',
-'filehist-help' => 'کرتە بکەسەر ڕێکەوت\\کات بۆ بینینی پەڕگەکە بەو شێوەی لەو کاتەدا بووە.',
-'filehist-deleteall' => 'هەمووی بسڕەوە',
-'filehist-deleteone' => 'سڕینەوە',
-'filehist-revert' => 'پێچەوانەکردنەوە',
-'filehist-current' => 'هەنووکە',
-'filehist-datetime' => 'ڕێکەوت/کات',
-'filehist-thumb' => 'ھێما',
-'filehist-thumbtext' => 'ھێما بۆ وەشانی $1',
-'filehist-nothumb' => 'هێما نییه',
-'filehist-user' => 'بەکارهێنەر',
-'filehist-dimensions' => 'دوورییەکان',
-'filehist-filesize' => 'قەبارەی پەڕگە',
-'filehist-comment' => 'لێدوان',
-'filehist-missing' => 'ون‌بوونی پەڕه',
-'imagelinks' => 'بەستەرەکانی پەڕگە',
-'linkstoimage' => 'لەم {{PLURAL:$1|پەڕەی خوارەوە بەستەر دراوە|$1 پەڕەی خوارەوە بەستەر دراوە}} بۆ ئەم پەڕگە:',
-'linkstoimage-more' => 'زیاتر لە $1 {{PLURAL:$1|بەستەری لاپەڕە|بەستەری لاپەڕە}} بۆ ئەم پەڕگه.
-ئەم لیستە {{PLURAL:$1|یەکەم لاپەڕەی بەستەرە|یەکەم لاپەڕە $1 بەستەرە}} بۆ تەنها یەم پەڕگە.
-هەروا [[Special:WhatLinksHere/$2|لیستی تەواو]] ئامادەی کەڵک وەرگرتنە.',
-'nolinkstoimage' => '‌لاپەڕەیەک نەدۆزرایەوە کە بەستەری هەبێ بۆ ئەم پەڕگە.',
-'morelinkstoimage' => '[[Special:WhatLinksHere/$1|بەستەری زیاتر]] ببینە بۆ ئەم پەڕگە.',
-'redirectstofile' => 'ئەم {{PLURAL:$1|پەڕگە ڕەوانکەرە|پەڕگانە ڕەوانکەرن}} بۆ ئەم پەڕگە:',
-'duplicatesoffile' => 'ئەم {{PLURAL:$1|پەڕگە دووبارەکرنەوەیەکی|پەڕگانە دووبارەکردنەوەی}} ئەم پەڕگەن ([[Special:FileDuplicateSearch/$2|وردەکاری زیاتر]]):',
-'sharedupload' => 'ئەم پەڕگە لە $1ەوەیە و لەوە دەچێ لە پرۆژەکانی دیکەش بەکار ببرێت.',
-'sharedupload-desc-there' => 'ئەم پەڕگە لە $1ەوەیە و لەوە دەچێ لە پرۆژەکانی دیکەش بەکار ببرێت.
-تکایە بۆ زانیاریی زیاتر چاو بکە لە [$2 لاپەڕەی ناساندنی پەڕگە].',
-'sharedupload-desc-here' => 'ئەم پەڕگە لە $1ەوەیە و لەوە دەچێ لە پرۆژەکانی دیکەش بەکار ببرێت.
-لە خوارەوە پێناسەکەی کە لە [$2 لاپەڕەی ناساندنی پەڕگە] هەیە، دەبینیت.',
-'filepage-nofile' => 'پەڕگەیەک بەم ناوە نیە.',
-'filepage-nofile-link' => 'پەڕگەیەک بەم ناوە نیە بەڵام دەتوانی [$1 باری بکەی].',
-'uploadnewversion-linktext' => 'وەشانێکی نوێی ئەم پەڕەیە بار بکە',
-'shared-repo-from' => 'لە لایەن $1',
-'shared-repo' => 'شوێنێکی هاوبەشی',
-
-# File reversion
-'filerevert' => 'پێچەوانەکردنەوەی $1',
-'filerevert-backlink' => '→ $1',
-'filerevert-legend' => 'پێچەوانەکردنەوەی پەڕگە',
-'filerevert-intro' => "خەریکی پەڕگەی '''[[Media:$1|$1]]''' دەگەڕینیتەوە بۆ [$4 وەشانی $3، $2].",
-'filerevert-comment' => 'هۆکار:',
-'filerevert-defaultcomment' => 'گەڕێندراوە بۆ وەشانی $2، $1',
-'filerevert-submit' => 'گەڕاندنەوە',
-'filerevert-success' => "'''[[Media:$1|$1]]''' گەڕێندراوەتەوە بۆ [$4 وەشانی $3، $2].",
-'filerevert-badversion' => 'وەشانێکی پێشووی ئەم پەڕگە بەو کاتە ڕاچاوکراوه ‌نەدۆزرایەوە.',
-
-# File deletion
-'filedelete' => 'سڕینەوەی $1',
-'filedelete-backlink' => '→ $1',
-'filedelete-legend' => 'سڕینەوەی پەڕگە',
-'filedelete-intro' => "خەریکی پەڕگەی '''[[Media:$1|$1]]''' دەگەڵ هەموو مێژووی دەسڕیتەوە.",
-'filedelete-intro-old' => "خەریکی وەشانی [$4 $3، $2] لە '''[[Media:$1|$1]]''' دەسڕیتەوە.",
-'filedelete-comment' => 'هۆکار:',
-'filedelete-submit' => 'بسڕەوە',
-'filedelete-success' => "'''$1''' سڕاوەتەوە.",
-'filedelete-success-old' => "وەشانی $3، $2 لە '''[[Media:$1|$1]]''' سڕاوەتەوە.",
-'filedelete-nofile' => "'''$1''' بوونی نییە.",
-'filedelete-nofile-old' => "وەشانێکی ئەرشیڤ‌کراوی '''$1''' بەو تایبەتمەندییە دیاری‌کراوانە نییە.",
-'filedelete-otherreason' => 'هۆکاری دیکە\\زیادی:',
-'filedelete-reason-otherlist' => 'هۆکاری دیکە',
-'filedelete-reason-dropdown' => '*هوکارە هاوبەشەکانی سڕینەوە
-**لادان Ù„Û• ماÙەکانی بڵاوکردنەوە
-***پەڕگەی دووبارەکراوە',
-'filedelete-edit-reasonlist' => 'دەستکاری هۆکارەکانی سڕینەوە',
-
-# MIME search
-'mimesearch' => 'گەڕانی MIME',
-'mimesearch-summary' => 'ئەم لاپەڕە پاڵێوتنی هەیە بۆ جۆرەکانی MIME.
-ناودراو: جۆرەی ناوەڕۆک\\ژێرجۆرە، وەک <tt>image/jpeg</tt>.',
-'mimetype' => 'جۆرەی MIME:',
-'download' => 'داگرتن',
-
-# Unwatched pages
-'unwatchedpages' => 'لاپەڕە چاودێری‌نەکراوەکان',
-
-# List redirects
-'listredirects' => 'لیستی ئاڕاستەکراوەکان',
-
-# Unused templates
-'unusedtemplates' => 'داڕێژە بەکارنەھێنراوەکان',
-'unusedtemplatestext' => 'ئەم لاپەڕە هەموو لاپەڕەکانی ناوبۆشایی {{ns:template}} کە نەکەوتوونەتە لاپەڕەی دیکە.
-لە یادت بێ سەرنج بدەی بۆ بەستەری دیکە بۆ داڕێژەکان، پێش سڕینەوەیان.',
-'unusedtemplateswlh' => 'بەستەرەکانی تر',
-
-# Random page
-'randompage' => 'پەڕەیەک بە هەڵکەوت',
-'randompage-nopages' => 'هیچ لاپەڕەیەک لەم {{PLURAL:$2|ناوبۆشاییەدا|ناوبۆشاییانەدا}} نیە: $1.',
-
-# Random redirect
-'randomredirect' => 'ڕەوانکەری هەرمەکی',
-'randomredirect-nopages' => 'لە ناوبۆشایی "$1" هیچ ڕەوانکەرێک نییە.',
-
-# Statistics
-'statistics' => 'ئامارەکان',
-'statistics-header-pages' => 'ئامارەکانی پەڕەکان',
-'statistics-header-edits' => 'ئامارەکانی گۆڕانکارییەکان',
-'statistics-header-views' => 'ئامارەکانی سەردانەکان',
-'statistics-header-users' => 'ئامارەکانی بەکارھێنەران',
-'statistics-header-hooks' => 'ئامارەکانی دیکە',
-'statistics-articles' => 'پەڕە بە ناوەڕۆکەکان',
-'statistics-pages' => 'پەڕەکان',
-'statistics-pages-desc' => 'گشت پەڕەکانی ویکی، بە لەخۆگرتنی پەڕەکانی وتووێژ، ڕەوانەکراوەکان و ھتد.',
-'statistics-files' => 'پەڕگە بارکراوەکان',
-'statistics-edits' => 'دەستکارییەکانی لاپەڕە لە کاتی دامەزراندنی {{SITENAME}}',
-'statistics-edits-average' => 'نێونجی ژمارەی دەستکارییەکان لە پەڕەیەک دا',
-'statistics-views-total' => 'دیتنی هەموو',
-'statistics-views-peredit' => 'دیتنی هەر دەستکارییەک',
-'statistics-jobqueue' => 'درێژی [http://www.mediawiki.org/wiki/Manual:Job_queue ڕیزی کار]',
-'statistics-users' => '[[Special:ListUsers|بەکارھێنەر]]ە تۆمارکراوەکان',
-'statistics-users-active' => 'ئەندامە چالاکەکان',
-'statistics-users-active-desc' => 'ئەو بەکارھێنەرانە کە لە دوایین {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}دا کارێکیان جێبەجێ کربێت.',
-'statistics-mostpopular' => 'زۆرترین لاپەڕە بینراوەکان',
-
-'disambiguations' => 'پەڕەکانی جوداکردنەوە',
-'disambiguationspage' => 'Template: خاوێن‌کردنەوەی ناوەڕۆک',
-'disambiguations-text' => "ئەم لاپەڕانە بەستەرن بۆ '''لاپەڕەی خاوێن‌کردنەوەی ناوەڕۆک'''.
-ئەوانە دەبێ لە جیاتی ئەوە بەستەر بن بۆ بابەتی گونجاو.<br />
-هەر لاپەڕەیەک کە لە داڕێژی بەستەر پێ‌دراو لە [[MediaWiki:Disambiguationspage]] کەڵک وەرگرێت وەک لاپەڕەی خاوێن‌کردنەوەی نوەڕۆک دەناسرێت.",
-
-'doubleredirects' => 'دووجار ڕەوانەکراوەکان',
-'doubleredirectstext' => 'ئەم لاپەڕە لیستی ئەو لاپەڕانەن وا ڕەوانکەرن بۆ لاپەڕەی ڕەوانکەر دیکە.
-هەر ڕیزێک، بەستەرەکان بۆ یەکەم و دووهەم ڕەوانکەری لەخۆ گرتووە. ئامانجی ڕەوانکەری دووهەم کە زۆربەی کات مەبەستی ڕاستیییە و ڕەوانکەری یەکەمیش هەر دەبێ بۆ ئەوێ ڕەوان بکات.
-دراوەکانی <s>هێڵ بەسەردا کێشراو</s> چارەسەر کرا.',
-'double-redirect-fixed-move' => '[[$1]] گوێسترایەوە.
-ئێستا ڕەوانکەرە بۆ [[$2]].',
-'double-redirect-fixer' => 'چارەسەرکەری ڕەوانکەر',
-
-'brokenredirects' => 'ڕەوانەکراوە خراپەکان',
-'brokenredirectstext' => 'ئەم ڕەوانکەرانە بەستەرن بۆ لاپەڕەهایەک کە بوونیان نیە:',
-'brokenredirects-edit' => 'دەستکاری',
-'brokenredirects-delete' => 'سڕینەوە',
-
-'withoutinterwiki' => 'پەڕەکانی بێ بەستەرەکانی زمان',
-'withoutinterwiki-summary' => 'ئەم پەڕانە بەستەریان بۆ وەشانەکانی زمانەکانی تر نیە.',
-'withoutinterwiki-legend' => 'پێشگر',
-'withoutinterwiki-submit' => 'پیشاندان',
-
-'fewestrevisions' => 'پەڕەکان بە کەمترین پیاچوونەوەوە',
-
-# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|بایت|بایت}}',
-'ncategories' => '$1 {{PLURAL:$1|ھاوپۆل|ھاوپۆل}}',
-'nlinks' => '$1 {{PLURAL:$1|بەستەر|بەستەر}}',
-'nmembers' => '$1 {{PLURAL:$1|ئەندام|ئەندام}}',
-'nrevisions' => '$1 {{PLURAL:$1|پیاچوونەوە|پیاچوونەوە}}',
-'nviews' => '$1 جار {{PLURAL:$1|بینراو|بینراو}}',
-'specialpage-empty' => 'ئەنجامێک بۆ ئەم ڕاپۆرتە نییە.',
-'lonelypages' => 'پەڕە ھەتیوەکان',
-'lonelypagestext' => 'بەم لاپەڕانە لە هیچ لاپەڕەیەک‌دا لە {{SITENAME}} بەستەر نەدراوە یا هیچ لاپەڕەیەک لەخۆیانی نەگرتووە.',
-'uncategorizedpages' => 'پەڕە پۆلێن نەکراوەکان',
-'uncategorizedcategories' => 'پۆلە پۆلێن نەکراوەکان',
-'uncategorizedimages' => 'پەڕگە پۆلێن نەکراوەکان',
-'uncategorizedtemplates' => 'داڕێژە پۆلێن نەکراوەکان',
-'unusedcategories' => 'پۆلە بەکارنەھێنراوەکان',
-'unusedimages' => 'پەڕگە بەکارنەھێنراوەکان',
-'popularpages' => 'پەڕە مەحبووبەکان',
-'wantedcategories' => 'پۆلە داواکراوەکان',
-'wantedpages' => 'پەڕە داواکراوەکان',
-'wantedpages-badtitle' => 'سەردێڕی نەگونجاو لە سەرجەمی ئەنجامەکان: $1',
-'wantedfiles' => 'پەڕگە داواکراوەکان',
-'wantedtemplates' => 'قاڵبە داواکراوەکان',
-'mostlinked' => 'زیاترین لاپەڕە بەستەر دراوەکان',
-'mostlinkedcategories' => 'زیاترین هاوپۆلە‌ بەستەر دراوەکان',
-'mostlinkedtemplates' => 'زیاترین داڕێژە‌ بەستەر دراوەکان',
-'mostcategories' => 'پەڕەکان بە زۆرترین ھاوپۆلەوە',
-'mostimages' => 'زیاترین پەڕگە‌ بەستەر دراوەکان',
-'mostrevisions' => 'لاپەڕەکان بە زیاترین پێداچوونەوە',
-'prefixindex' => 'گشت پەڕەکان بە پێشگرەوە',
-'shortpages' => 'پەڕە کورتەکان',
-'longpages' => 'پەڕە دڕێژەکان',
-'deadendpages' => 'لاپەڕەکانی دوایین بەستراو',
-'deadendpagestext' => 'ئەم لاپەرانە بە هیچ لاپەڕەیەکی دیکە لە {{SITENAME}}دا بەستەری نەداوە.',
-'protectedpages' => 'پەڕە پارێزراوەکان',
-'protectedpages-indef' => 'تەنها پاراستنە زۆرەکان',
-'protectedpages-cascade' => 'تەنها پاراستنە زنجیرییەکان',
-'protectedpagestext' => 'ئەم لاپەڕانە لە گواستنەوە و دەستکاری‌کردن پارێزراون',
-'protectedpagesempty' => 'هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.',
-'protectedtitles' => 'سەرناوە پارێزراوەکان',
-'protectedtitlestext' => 'ئەم سەردێڕانە لە درووست‌کردن پارێزراون',
-'protectedtitlesempty' => 'هیچ سەردێڕیك ئێستا بەم دیاریکراوانە نەپارێزراوە.',
-'listusers' => 'لیستی بەکارھێنەران',
-'listusers-editsonly' => 'تەنھا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە',
-'listusers-creationsort' => 'ڕیز کردن بە پێی ڕێکەوتی دروست کردن',
-'usereditcount' => '$1 {{PLURAL:$1|دەستکاری|دەستکاری}}',
-'usercreated' => 'دروست کراو لە $2ی $1',
-'newpages' => 'پەڕە نوێکان',
-'newpages-username' => 'ناوی بەکارھێنەر:',
-'ancientpages' => 'کۆنترین پەڕەکان',
-'move' => 'گواستنەوە',
-'movethispage' => 'ئەم پەڕەیە بگوازەوە',
-'unusedimagestext' => 'تکایە ئاگادار بە کە لەوانەیە ماڵپەڕێک بە URLـی ڕاستەوەخۆ بەستەری دابێت بە پەڕگەیەک و هەر بۆیە لەوانەیە ئێستا لە وەک چالاک لێرەدا لیست‌کرابێت.',
-'unusedcategoriestext' => 'ئەم پەڕەی پۆلانە ھەن، ئەگەرچی ھیچ پەڕە یان پۆلێکی تر کەڵکیان لێ وەرناگرێ.',
-'notargettitle' => 'بێ مەبەست',
-'notargettext' => 'لاپەڕە یان بەکارهێنەرێکت دیاری نەکردوو تاکەە ئەو ÙÛ•Ù†Ú©Ø´ÛŽÙ†Û• لەسەر بهێنیتە کار.',
-'nopagetitle' => 'چاودێری',
-'nopagetext' => 'لاپەڕەی مەبەست وا ڕاچاوت کردووە بوونی نییە.',
-'pager-newer-n' => '{{PLURAL:$1|یەکێکی نوێتر|$1ی نوێتر}}',
-'pager-older-n' => '{{PLURAL:$1|یەکێک کۆنتر|$1ی کۆنتر}}',
-'suppress' => 'چاودێری',
-
-# Book sources
-'booksources' => 'سەرچاوەکانی کتێب',
-'booksources-search-legend' => 'بۆ سەرچاوەی کتێب بگەڕێ',
-'booksources-go' => 'بڕۆ',
-'booksources-text' => 'Ù„Û• خوارەوە لیستێک Ù„Û• بەستەر بۆ ماڵپەڕهایەک Ú©Û• کتێبی نوێ Ùˆ بەکارهێنراو دەÙرۆشێت Ùˆ لەوانەیە Ù„Û•ÙˆÛŽ زانیاریی زیاترت دەست‌کەوێت سەبارەت بەو کتێبانەی Ù„Û• دووی دەگەڕیت:',
-'booksources-invalid-isbn' => 'ISBN دراو لەوە ناچی بەکار بێت، سەرنج بدە لە کاتی کۆپی کردن لە سەرچاوە تووشی هەڵە نوبوبێت.',
-
-# Special:Log
-'specialloguserlabel' => 'بەکارھێنەر:',
-'speciallogtitlelabel' => 'ناونیشان:',
-'log' => 'لۆگەکان',
-'all-logs-page' => 'ھەموو لۆگە گشتییەکان',
-'alllogstext' => 'پیشاندانی تێکەڵ‌کراوی هەموو لۆگەکانی بەردەستی {{SITENAME}}.
-بۆ وردبوونەوەی زیاتر دەتوانی جۆری لۆگ، ناوی بەکارهێنەر یا لاپەڕە گۆراوەکان هەڵبژێریت (هەستیار بە گەورە و بچووکی پیتەکان).',
-'logempty' => 'هیچ بابەتێکی هاوتا لە لۆگەکاندا نەدۆزرایەوە.',
-'log-title-wildcard' => 'گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن',
-
-# Special:AllPages
-'allpages' => 'ھەموو پەڕەکان',
-'alphaindexline' => '$1 تا $2',
-'nextpage' => 'پەڕەی پاشەوە ($1)',
-'prevpage' => 'پەڕەی پێشەوە ($1)',
-'allpagesfrom' => 'بینینی پەڕەکان بە دەست پێ کردن لە:',
-'allpagesto' => 'بینینی پەڕەکان بە دوایی ھاتن بە:',
-'allarticles' => 'ھەمووی وتارەکان',
-'allinnamespace' => 'ھەموو پەڕەکان (بۆشایی-ناوی $1)',
-'allnotinnamespace' => 'ھەموو پەڕەکان (ئەوانەی لە بۆشایی-ناوی $1دا نین)',
-'allpagesprev' => 'Ù¾ÛŽØ´',
-'allpagesnext' => 'پاش',
-'allpagessubmit' => 'بڕۆ',
-'allpagesprefix' => 'نیشاندانی پەڕەکان بە پێشگری:',
-'allpagesbadtitle' => 'سەردێڕی لاپەڕە گونجاو نەبوو یان پێشگڕێکی بەینی‌زمانی یان بەینی‌ویکی هەبوو.
-لەوانەیە یەک یان زیاتر پیتی نەگونجاو بۆ سەردێڕی لەخۆ گرتبێ.',
-'allpages-bad-ns' => '{{SITENAME}} ناوبۆشایی نیە "$1".',
-
-# Special:Categories
-'categories' => 'پۆلەكان',
-'categoriespagetext' => 'ئەم {{PLURAL:$1|پۆلە پەڕە یان پەڕگەی|پۆلانە پەڕە یان پەڕگەیان}} لەخۆگرتە.<br />
-[[Special:UnusedCategories|پۆلە بەکارنەھێنراوەکان]] لێرەدا نیشان نەدراون.<br />
-ھەروا دەتوانی [[Special:WantedCategories|پۆلە خوازراوەکان]] ببینی.',
-'categoriesfrom' => 'پیشان‌دانی هاوپۆلەکان بە دەست‌پێ‌کردن لە :',
-'special-categories-sort-count' => 'ڕیز کردن بە پێی ژمارە',
-'special-categories-sort-abc' => 'ڕیز کردن بە Ù¾ÛŽÛŒ ئەلÙابێت',
-
-# Special:DeletedContributions
-'deletedcontributions' => 'بەشدارییە سڕاوەکان',
-'deletedcontributions-title' => 'هاوبەشییەکانی سڕاوەی بەکارهێنەر',
-'sp-deletedcontributions-contribs' => 'بەشدارییەکان',
-
-# Special:LinkSearch
-'linksearch' => 'بەستەرە دەرەکییەکان',
-'linksearch-pat' => 'گەڕان بۆ نواندن:',
-'linksearch-ns' => 'بۆشاییی ناو:',
-'linksearch-ok' => 'گەڕان',
-'linksearch-line' => '$1 بەستەرپێ‌دراو لە $2',
-
-# Special:ListUsers
-'listusersfrom' => 'نیشاندانی بەکارھێنەران بە دست پێکردن لە:',
-'listusers-submit' => 'نیشاندان',
-'listusers-noresult' => 'ھیچ بەکارھێنەرێک نەدۆزرایەوە.',
-'listusers-blocked' => '(بەربەست‌کراو)',
-
-# Special:ActiveUsers
-'activeusers' => 'لیستی بەکارھێنەرە چالاکەکان',
-'activeusers-count' => '$1 گۆڕانکاری لە دوایین {{PLURAL:$3|ڕۆژدا|$3 ڕۆژدا}}',
-'activeusers-from' => 'نیشاندانی بەکارھێنەران بە دست پێکردن لە:',
-'activeusers-hidebots' => 'بۆتەکان بشارەوە',
-'activeusers-noresult' => 'هیچ بەکارهێنەرێک نەدۆزرایەوە',
-
-# Special:Log/newusers
-'newuserlogpage' => 'لۆگی دروست کردنی بەکارھێنەر',
-'newuserlogpagetext' => 'ئەمە لۆگێکی درووست‌کردنی بەکارهێنەرە.',
-'newuserlog-byemail' => 'تێپەڕوشە بە ئیمەیل نێردرا.',
-'newuserlog-create-entry' => 'بەکارھێنەری نوێ',
-'newuserlog-create2-entry' => 'ھەژماری $1ی دروست کرد',
-'newuserlog-autocreate-entry' => 'هەژمارە بە جۆری خۆکار درووست‌کرا',
-
-# Special:ListGroupRights
-'listgrouprights' => 'ماÙەکانی گرووپە بەکارھێنەرییەکان',
-'listgrouprights-summary' => 'ئەمە لیستێکە Ù„Û• گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ ماÙەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.
-لێرەدا لەوانەیە [[{{MediaWiki:Listgrouprights-helppage}}|زانیاری زیاترت]] دەست‌کەوێت سەبارەت بە ماÙÛ• تاکەکەسیەکان.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">ماÙÛŒ دراوە</span>
-* <span class="listgrouprights-granted">ماÙÛŒ سەندراوە</span>',
-'listgrouprights-group' => 'گرووپ',
-'listgrouprights-rights' => 'ماÙەکان',
-'listgrouprights-helppage' => 'Help:ماÙەکانی گرووپ',
-'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' => 'لابردنی هەموو گرووپەکان له‌ سه‌ر هه‌ژماری خۆ',
-
-# E-mail user
-'mailnologin' => 'ناونیشان بۆ ناردن نییه‌',
-'mailnologintext' => 'ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.',
-'emailuser' => 'ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە',
-'emailpage' => 'ئیمەیل بۆ بەکارھێنەر',
-'emailpagetext' => 'ده‌توانی له‌م Ùۆرمه‌ی خواره‌وه‌ که‌ڵک وه‌رگریت بۆ ناردنی په‌یامێکی ئی‌مه‌یل بنێریت بۆ ئه‌م به‌کارهێنه‌ره‌.
-ناونیشانی ئی‌مه‌یلت وا له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کانی به‌کارهێنه‌ر‌دا]] نووسیوته‌، بۆ ئه‌دره‌سی "له‌لایه‌ن" ئی‌مه‌یل نیشان ئه‌درێت، هه‌ر بۆیه‌ وه‌گر ده‌توانێ ڕاسته‌وخۆ وه‌ڵامت بداته‌وه‌.',
-'defemailsubject' => 'ئیمەیلی {{SITENAME}}',
-'noemailtitle' => 'هیچ ناونیشانێکی ئی‌مەیل نییە',
-'noemailtext' => 'ئەم بەکارهێنەرە ناونێشانێکی بڕوا پێکراوی ئی‌مەیلی دانەناوە.',
-'nowikiemailtitle' => 'ڕێگە بۆ ئی‌مەیل نەدراوە',
-'nowikiemailtext' => 'ئەم بەکارهێنەرە تایبەتمەندیی وەرنەگرتنی ئی‌مەیل لە بەکارهێنەرانی دیکەی هەلبژاردووە.',
-'email-legend' => 'ناردنی ئیمەیلێک بۆ بەکارهێنەرێکی دیکەی {{SITENAME}}',
-'emailfrom' => 'Ù„Û•:',
-'emailto' => 'بۆ:',
-'emailsubject' => 'بابەت:',
-'emailmessage' => 'نامە:',
-'emailsend' => 'بینێرە',
-'emailccme' => 'کۆپییەک لە نامەکە بنێرە بۆ ئیمەیلەکەم.',
-'emailccsubject' => 'کۆپیی نامەکەت بۆ $1: $2',
-'emailsent' => 'نامەکەت ناردرا',
-'emailsenttext' => 'نامەکەت ناردرا',
-'emailuserfooter' => 'ئەم ئیمەیلە لە $1ەوە ناردرا بۆ $2 بە "Email user" لە {{SITENAME}}ەوە.',
-
-# Watchlist
-'watchlist' => 'لیستی چاودێڕییەکانی من',
-'mywatchlist' => 'لیستی چاودێرییەکانم',
-'watchlistfor' => "(بۆ '''$1''')",
-'nowatchlist' => 'لە لیستی چاودێڕییەکانتدا ھیچ نیە.',
-'watchlistanontext' => 'تکایە بۆ دیتن و دەستکاری بابەتەکانی لە ناو لیستی چاودێریەکەت‌دا $1.',
-'watchnologin' => 'لە ژوورەوە نیت.',
-'watchnologintext' => 'دەبی لە [[Special:UserLogin|ژوورەوە]] بیت بۆ ئەوەی بتوانی گۆڕانکاری بکەیت لە لیستی چاودێریەکەت‌دا.',
-'addedwatch' => 'بە لیستی چاودێڕییەکانت زێدە کرا',
-'addedwatchtext' => 'پەڕەی "[[:$1]]" خرایە سەر [[Special:Watchlist|لیستی چاودێرییەکەت]].
-گۆڕانکارییەکانی داھاتووی ئەم پەڕە و پەڕەی وتووێژەکەی، لەوێدا ڕیزدەکرێ و پەڕەکە لە [[Special:RecentChanges|لیستی دوایین گۆڕانکارییەکاندا]] ئەستوورکراو دەردەکەوێت بۆ ئەوەی ئاسانتر دەستکەوێت.',
-'removedwatch' => 'لە لیستی چاودێڕییەکانت لابرا',
-'removedwatchtext' => 'پەڕەی "[[:$1]]" لە [[Special:Watchlist|لیستی چاودێڕیەکانت]] لابرا.',
-'watch' => 'چاودێری بکە',
-'watchthispage' => 'چاودێڕیی ئەم پەڕە بکە',
-'unwatch' => 'لابردنی چاودێری',
-'unwatchthispage' => 'ئیتر چاودێری مەکە',
-'notanarticle' => 'پەڕەی بێ ناوەڕۆک',
-'notvisiblerev' => 'پیاچوونەوە سڕاوەتەوە',
-'watchnochange' => 'لە کاتی دیاری کراو دا، بابەتە چاودێڕی کراوەکانت، دەستکاری نەکراون',
-'watchlist-details' => '{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێڕیەکەت دایە، بێجگە پەڕەکانی لێدوان.',
-'wlheader-enotif' => '* ئەکرێ بە E-mail ئاگاداری بدەی',
-'wlheader-showupdated' => "* â€Ø¦Û•Ùˆ پەڕانە Ú©Û• Ù„Û• پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
-'watchmethod-recent' => 'سەرنج‌دانی دوایین دەستکاریەکان بۆ لاپەڕە چاودێری‌کراوەکان',
-'watchmethod-list' => 'سەرنج‌دانی لاپەڕە چاودێری‌کراوەکان بۆ دوایین دەستکاریەکان',
-'watchlistcontains' => 'لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.',
-'iteminvalidname' => "ھەڵە لەگەڵ بابەتی '$1'، ناوی نادروست...",
-'wlnote' => "خوارەوە {{PLURAL:$1|دوایین گۆڕانکاریە|دوایین '''$1''' گۆڕانکارییەکانن}} لە دواین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}} دا.",
-'wlshowlast' => 'نیشان دانی دوایین $1 کاتژمێری، $2 ڕۆژ لە $3',
-'watchlist-options' => 'ھەڵبژاردەکانی لیستی چاودێڕییەکان',
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'چاودێری...',
-'unwatching' => 'لابردنی چاودێری...',
-
-'enotif_mailer' => 'سیستەمی ئاگاداری بە ئی‌مەیلی {{SITENAME}}',
-'enotif_reset' => 'ھەمووی پەڕەکان وەک بینراو دیاری بکە',
-'enotif_newpagetext' => 'ئەمە پەڕەیەکی تازەیە.',
-'enotif_impersonal_salutation' => 'بەکارهێنەری {{SITENAME}}',
-'changed' => 'گۆڕدراو',
-'created' => 'دروستکراو',
-'enotif_subject' => '$PAGETITLE ـی لاپەڕەی {{SITENAME}} لە لایەن $PAGEEDITOR $CHANGEDORCREATED',
-'enotif_lastvisited' => 'بۆ دیتنی هەموو گۆرانکارییەکانی پاش دوایین چاوپێکەوتنت $1 ببینە.',
-'enotif_lastdiff' => 'بۆ دیتنی ئەم گۆڕانە $1 ببینە.',
-'enotif_anon_editor' => 'بەکارهێنەری نەناسراو $1',
-'enotif_body' => '$WATCHINGUSERNAMEی بەڕێز،
-پەڕەی $PAGETITLE لە {{SITENAME}} دا لە ڕێکەوتی $PAGEEDITDATE بە دەستی $PAGEEDITOR $CHANGEDORCREATEDە، سەردانی $PAGETITLE_URL بکە بۆ وەشانی ھەنووکەی ئەو پەڕە.
-
-$NEWPAGE
-
-پوختەی دەستکارییەکەی: $PAGESUMMARY $PAGEMINOREDIT
-
-پەیوەندی لەگەڵ دەستکاریکەر:
-ئیمەیڵ: $PAGEEDITOR_EMAIL
-ویکی: $PAGEEDITOR_WIKI
-
-تا سەردانی ئەو پەڕە نەکەی، ئەگەر گۆڕانکارییەکی تری تێدا ڕووی دا خەبەر پێ نادرێ.
-هەروا دەتوانی نیشانەکانی ئاگاداری بۆ هەموو لاپەڕەکانی ناو لیستی چاودێریت ببیتەوەنووک
-
-
- بە سوپاسەوە، سیستەمی ڕاگەیاندنی {{SITENAME}}
---
-بۆ گۆڕینی تەنزیماتی لیستی چاودێرییەکانت، سەربدە لە
-{{fullurl:{{#special:Watchlist}}/edit}}
-
-بۆ لابردنی پەڕەکە لە لیستی چاودێرییەکانت، سەربدە لە
-$UNWATCHURL
-
-رێنوێنیی زۆرتر و دەربڕینی بیروڕا:
-{{fullurl:{{MediaWiki:Helppage}}}}',
-
-# Delete
-'deletepage' => 'پەڕە بسڕەوەو',
-'confirm' => 'پشتدار بکەرەوە',
-'excontent' => "ناوەڕۆک ئەمە بو: '$1'",
-'excontentauthor' => "ناوەڕۆک ئەمە بو: '$1'(و تەنھا بەشداریکەر '[[Special:Contributions/$2|$2]]' بوو)",
-'exbeforeblank' => "ناوەڕۆک بەر لە بەتاڵ کردنەوە ئەمە بوو: '$1'",
-'exblank' => 'پەڕە خاڵی بوو',
-'delete-confirm' => 'سڕینەوەی "$1"',
-'delete-backlink' => '→ $1',
-'delete-legend' => 'سڕینەوە',
-'historywarning' => "'''ئاگاداری:''' ئەم لاپەڕە کە دەتەوێت بیسڕیتەوە پێشتر $1 {{PLURAL:$1|revision|پێداچوونەوەی }} لەسەر کراوە.",
-'confirmdeletetext' => 'تۆ خەریکی پەڕەیەک بە هەموو مێژووەکەیەوە دەسڕیتەو.
-تکایە دووپاتی بکەوە کە دەتەوێت ئەم کارە بکەی، لە ئاکامەکەی تێدەگەی، و ئەم کارە بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] ئەنجام ئەدەی.',
-'actioncomplete' => 'کردەوە بە ئاکام گەیشت',
-'actionfailed' => 'کردارەکە سەرنەکەوت',
-'deletedtext' => '"<nowiki>$1</nowiki>" سڕایەوە.
-سەیری $2 بکە بۆ تۆمارێکی دوایین سڕینەوەکان.',
-'deletedarticle' => '«[[$1]]» سڕایەوە',
-'suppressedarticle' => '"[[$1]]" بەرگری‌کراو',
-'dellogpage' => 'لۆگی سڕینەوە',
-'dellogpagetext' => 'ئەوەی خوارەوە لیستێكە لە دوایین سڕینەوەکان',
-'deletionlog' => 'لۆگی سڕینەوە',
-'reverted' => 'گەڕێندراوە بۆ پێداچوونەوەی پێشووتر',
-'deletecomment' => 'هۆکار:',
-'deleteotherreason' => 'ھۆکاری دیکە:',
-'deletereasonotherlist' => 'ھۆکاری دیکە',
-'deletereason-dropdown' => '* ھۆکاری سڕینەوە
-** داواکاریی نووسەر
-** تێکدانی ماÙÛŒ لەبەرگرتنەوە
-** خراپکاری',
-'delete-edit-reasonlist' => 'دەستکاری کردنی ھۆکارەکانی سڕینەوە',
-'delete-toobig' => 'ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.
-بۆ بەرگری لە خراپ‌بوونی چاوەڕوان نەکراوی {{SITENAME}}، سڕینەوەی لاپەڕەی وا بەربەست‌کراوە.',
-'delete-warning-toobig' => 'ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.
-سڕینەوی ئەوە لە وانەیە کارەکانی بنکەدراوی {{SITENAME}} تووشی کێشە بکات؛
-دوورنواڕانە جێ‌بەجێی بکە.',
-
-# Rollback
-'rollback' => 'گەڕاندنەوەی دەستکارییەکان',
-'rollback_short' => 'گەڕاندنەوە',
-'rollbacklink' => 'گەڕاندنەوە',
-'rollbackfailed' => 'گەڕاندنەوە سەرکەوتوو نەبوو',
-'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''\" بوو.",
-'revertpage' => 'گەڕاندنەوەی دەستکارییەکان لەلایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین دەستکاریی [[User:$1|$1]]',
-'rollback-success' => 'دەستکارییەکانی $1 وەرگێرایەوە؛<br />
-گۆڕدرا بۆ دوایین دەستکاریی $2.',
-'sessionfailure' => 'لەوەدەچی بەشی چوونەژوورەوەت تووشی کێشە بووبێت.
-ئەم کردەوە بۆ بەرگری لە ئاڵۆزی و مەترسی دزینی دراوەکان هەڵوەشێندراوە.
-تکایە دوکمەی "back" لێدە و ئەو لاپەڕەی لێیەوە هاتوویتە ئێرە، نوێ بکەوە، ئینجا دیسان تاقی‌بکەوە.',
-
-# Protect
-'protectlogpage' => 'لۆگی پاراستن',
-'protectlogtext' => 'لەخوارەوە لیستێک لە لاپەڕە داخراوەکان و کراوەکان دەبینی.
-بۆ دیتنی لیستی ئەو لاپەرانەی ئێستە پاراستنیان لە ئارادایە [[Special:ProtectedPages|لیستی لاپەڕە پارێزراوەکان ]] ببینە.',
-'protectedarticle' => 'پارێزراو "[[$1]]"',
-'modifiedarticleprotection' => 'ئاستی پاراستنی "[[$1]]"ی گۆڕا',
-'unprotectedarticle' => '"[[$1]]" لە حاڵی ئێستا دا نەپازراوە',
-'movedarticleprotection' => 'ڕێککارییەکانی پاراستن لە "[[$2]]" گوازرایەوە بۆ "[[$1]]"',
-'protect-title' => 'گۆڕینی ئاستی پاراستنی "$1"',
-'prot_1movedto2' => '[[$1]] گوازراوەتەوە بۆ [[$2]]',
-'protect-backlink' => '↠$1',
-'protect-legend' => 'پاراستن تەیید بکە',
-'protectcomment' => 'هۆکار:',
-'protectexpiry' => 'ھەتا:',
-'protect_expiry_invalid' => 'کاتی بەسەرچوون نادروستە:',
-'protect_expiry_old' => 'کاتی بەسەرچوون ڕابردووە',
-'protect-text' => "تۆ دەتوانی لێرە ئاستی پاراستنی لاپەڕەکە ببینی وە بیگۆڕی '''<nowiki>$1</nowiki>''' .",
-'protect-locked-blocked' => "ناتوانیت ئاستی پاراستن بگۆڕیت کاتێ بەستراوە.
-ئەوە هەڵبژاردەکانی ئێستای ڕێکخستنی بۆ لاپەڕە '''$1''':",
-'protect-locked-dblock' => "ئاستەکانی پاراستن ناگۆڕدرێن کاتێ بنکەدراوی چالاک داخرابێت.
-ئەوە هەڵبژاردەکانی ئێستای ڕێکخستنی بۆ لاپەڕە '''$1''':",
-'protect-locked-access' => "ھەژمارەکەت ڕێگەی ئەوەی پێ نەدراوە کە بتوانێت ئاستی پاراستنی پەڕە بگۆڕێت.
-ڕێککارییەکانی ئێستای پەڕەی '''$1''' ئەمەتە:",
-'protect-cascadeon' => 'ئەم لاپەڕە لە حاڵی ئێستا دا پارێزراوە چونکا لە نێو ئەم {{PLURAL:$1|لاپەڕ(ان)ە دایە کە }} حاڵەتی پاراستنی تاڤگەیی ئەو(ان) ھەڵکراوە
-
-تۆ دەتوانی ئاستی پاراستنی ئەم لاپەڕە بگۆڕی، بەڵام ئەم گۆڕانە ھیچ کاریگەر نابێت لە سەر پاراستنی تاڤگەیی',
-'protect-default' => 'بە ھەموو بەکارھێنەران ڕێگە بدە',
-'protect-fallback' => 'پێویستی بە ئیزنی «$1» ھەیە',
-'protect-level-autoconfirmed' => 'بەکارھێنەرانی نوێ و تۆمارنەکراو ئاستەنگ بکە',
-'protect-level-sysop' => 'تەنھا بەڕێوەبەران',
-'protect-summary-cascade' => 'تاڤگەیی',
-'protect-expiring' => 'تا ڕێکەوتی $1 (UTC)',
-'protect-expiry-indefinite' => 'زۆر\\نەناسراو',
-'protect-cascade' => 'لاپەڕەکانی نێو ئەم لاپەتە بپارێزە (پاراستنی تاڤگەیی)',
-'protect-cantedit' => 'ناتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، چونکوو تۆ ئیجازەی ئەم کارەت نیە.',
-'protect-othertime' => 'کاتی دیکە:',
-'protect-othertime-op' => 'کاتی دیکە',
-'protect-existing-expiry' => 'ئەم کاتی بەسەرچوونی ماوە کە هەیە: $3، $2',
-'protect-otherreason' => 'هۆکاری زیادکراو\\دیکە:',
-'protect-otherreason-op' => 'ھۆکاری دیکە',
-'protect-dropdown' => '*ھۆکارە باوەکانی پاراستن
-** خراپکاریی لەڕادەبەدەر
-** سپامی لەڕادەبەدەر
-** شەڕە دەستکاریی بێ‌سوود
-** پەڕەی زۆربینەردار',
-'protect-edit-reasonlist' => 'دەستکاری کردنی ھۆکارەکانی پاراستن',
-'protect-expiry-options' => 'Ù¡ کاتژمێر:1 hour,Ù¡ Ú•Û†Ú˜:1 day,Ù¡ Ú¾Û•Ùتە:1 week,Ù¢ Ú¾Û•Ùتە:2 weeks,Ù¡ مانگ:1 month,Ù£ مانگ:3 months,Ù¦ مانگ:6 months,Ù¡ ساڵ:1 year,بی‌بڕانەوە:infinite',
-'restriction-type' => 'ئیزن:',
-'restriction-level' => 'ئاستی سنووردارکردن:',
-'minimum-size' => 'کەمترین قەبارە',
-'maximum-size' => 'زۆرترین قەبارە:',
-'pagesize' => '(بایت)',
-
-# Restrictions (nouns)
-'restriction-edit' => 'دەستکاری',
-'restriction-move' => 'گواستنەوە',
-'restriction-create' => 'دروستکردن',
-'restriction-upload' => 'بارکردن',
-
-# Restriction levels
-'restriction-level-sysop' => 'تەواو پارێزراو',
-'restriction-level-autoconfirmed' => 'نیوە پارێزراو',
-'restriction-level-all' => 'هەر ئاستێک',
-
-# Undelete
-'undelete' => 'دیتنی لاپەڕە سڕاوەکان',
-'undeletepage' => 'دیتنی و گەڕاندنەوەی لاپەڕە سڕاوەکان',
-'undeletepagetitle' => "'''ئەمە تێکەڵ‌کراوەی پێداچوونەوە سڕدراوەکانی [[:$1|$1]]'''.",
-'viewdeletedpage' => 'دیتنی لاپەڕە سڕاوەکان',
-'undeletepagetext' => 'ئەم {{PLURAL:$1|سڕاوەتەوە|$1 لاپەڕە سڕاونەتەوە}} بەڵام لەبەر ئەوەی لە ئەرشیڤ‌دا هەن هێشتا دەتوانی بیانهێنیتەوە.
-ئەرشیڤ چەن‌وەخت جارێ لە کاتی دیاری‌کراودا خاوێن‌دەکرێتەوە.',
-'undelete-fieldset-title' => 'هێنانەوەی پێداچوونەوەکان',
-'undeleteextrahelp' => "بۆ هێنانەوەی هەموو مێژووی لاپەڕەیەک، تەواوی چوارچێوەکانی نیشان‌کردن بەتاڵ بهێڵەوە و کرتە بکە سەر '''''هێنانەوە'''''.
-بۆ ئەنجامی گەڕانەوەیەکی هەڵبژاردوو، چوارچێوەی بەرامبەر ئەو پێداچوونەوی دەتەوێ بیهێنیتەوە، نیشان‌بکە و کرتە بکە سەر '''''هێنانەوە'''''.
-کرتەکردن سەر '''''بردنەوە نووک''''' ئەبێتە هۆی سڕینەوەی شوێنی بۆچوونەکان و بەتاڵ بوونەوەی چوارچێوەکان.",
-'undeleterevisions' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}} ئەرشیڤ‌کرا',
-'undeletehistory' => 'ئەگەر لاپەڕەیەک بهێنیتەوە، هەموو پێداچوونەوەکانی دەگەڕێنەوە بۆ لاپەڕەی مێژوو.
-ئەگەر لە کاتی سڕاوەبوون، لاپەڕەیەک هەر بەو ناوە درووست‌کرابێت، پێداچوونەوە هێنراوەکان لە لاپەڕەی مێژووی کۆن‌دا نیشان ئەدرێت.',
-'undeletehistorynoadmin' => 'ئەم لاپەڕە سڕاوەتەوە.
-لەو پۆختەی لە خوارەوە دەیبینی، هۆکاری سڕینەوە و هەروا وردەکاریەکان سەبارە بەو کەسەی پێش سڕینەوە دەستکاری لاپەڕەکەی کردووە، دەست‌دەکەوێ.
-دەقی ڕاستی ئەم پێداچوونەوە سڕاوانە تەنها بۆ بەڕێوبەران دەست‌پێ‌گەیشتنی هەیە.',
-'undelete-revision' => 'پێداچوونەوەی سڕاوەی $1 (لە $4، $5) لەلایەن $3:',
-'undeleterevision-missing' => 'پێداچوونەوەی نادیار یا نەناسراو.
-لەوانەیە خەریکی لە بەستەرێکی خراپ کەڵک وەر ئەگری ئا لەوانەیە پێداچوونەوەکە لە ئەرشیڤ لابرابێت.',
-'undelete-nodiff' => 'هیچ پێداچوونەوەیەکی پێشو نەدۆزرایەوە.',
-'undeletebtn' => 'هێنانەوە',
-'undeletelink' => 'بینین/گەڕاندنەوە',
-'undeleteviewlink' => 'دیتن',
-'undeletereset' => 'بردنەوە نووک',
-'undeleteinvert' => 'هەڵگێڕانەوەی هەڵبژاردن',
-'undeletecomment' => 'هۆکار:',
-'undeletedarticle' => '«[[$1]]» گێڕایەوە',
-'undeletedrevisions' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} هێنرایەوە',
-'undeletedrevisions-files' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} و {{PLURAL:$2|1 پەڕگە|$2 پەڕگە}} هێنرایەوە',
-'undeletedfiles' => '{{PLURAL:$1|1 پەڕگە|$1 پەڕگە}} هێنرایەوه',
-'cannotundelete' => 'لە سڕین گەڕانەوە سەرکەوتوو نەبوو؛
-کەسێکی دیکە پێش تۆ گەڕاندوویەتەوە.',
-'undeletedpage' => "'''$1 هێنراوەتەوە'''
-
-بۆ دیتنی پێشینەی دوایین سڕینەوەکان و هێنانەوەکان سەرنجی [[Special:Log/delete|لۆگی سڕینەوە]] بدە.",
-'undelete-header' => 'بۆ دیتنی ئەو لاپەڕانەی لەم داییانەدا سڕاونەتەوە چاو لە [[Special:Log/delete|لۆگی سڕینەوە]] بکە.',
-'undelete-search-box' => 'گەڕان بۆ لاپەڕە سڕاوەکان',
-'undelete-search-prefix' => 'نیشان‌دانی ئەو لاپەڕانەی دەستپێکیان ئەمەیە:',
-'undelete-search-submit' => 'گەڕان',
-'undelete-no-results' => 'لە ئەرشیڤی سڕاوەکانی لاپەڕەیەکی هاوتا نەدۆزرایەوە.',
-'undelete-cleanup-error' => 'هەڵە لە سڕینەوەی ئەرشیڤی بەکەڵک نەهاتووی پەڕگە "$1".',
-'undelete-missing-filearchive' => 'ناکرێ ئەرشیڤی پەڕگە بە پێناسەی $1 بهێنیتەوە لەبەر ئەوەی لە ناو بنکەی دراوە‌دا نییە.
-لەوانەیە لە‌پێش‌دا هێنرابێتەوە.',
-'undelete-error-short' => 'هەڵە لە گەڕاندنەوەی سڕینەوەی پەڕگە: $1',
-'undelete-error-long' => 'هەڵەیەک لە کاتی گەڕاندنەوەی سڕینەوەی پەڕگە ڕووی‌دا:
-
-$1',
-'undelete-show-file-confirm' => 'ئایا ئەرخەیانی کە دەتەوێ پێداچوونەوە سراوەکەی پەڕگەی "<nowiki>$1</nowiki>" لە $2 لە $3 ببینی؟',
-'undelete-show-file-submit' => 'بەڵێ',
-
-# Namespace form on various pages
-'namespace' => 'بۆشاییی ناو',
-'invert' => 'ھەڵبژاردەکان پێچەوانە بکە',
-'blanknamespace' => '(سەرەکی)',
-
-# Contributions
-'contributions' => 'بەشدارییەکانی بەکارھێنەر',
-'contributions-title' => 'بەشدارییەکانی بەکارھێنەر $1',
-'mycontris' => 'بەشدارییەکانم',
-'contribsub2' => 'بۆ $1 ($2)',
-'nocontribs' => 'هیچ گۆڕانکاریەکی هاوتای ئەم پێوەرانە نودۆزرایەوە',
-'uctop' => '(سەر)',
-'month' => 'لە مانگی (و پێشترەوە):',
-'year' => 'لە ساڵی (و پێشترەوە):',
-
-'sp-contributions-newbies' => 'تەنھا بەشدارییەکانی بەکارھێنەرە تازەکان نیشان بدە',
-'sp-contributions-newbies-sub' => 'لە بەکارھێنەرە تازەکانەوە',
-'sp-contributions-newbies-title' => 'هاوبەشیەکانی بەکارهێنەر بۆ هەژمارە نوێکان',
-'sp-contributions-blocklog' => 'لۆگی بەربەستن',
-'sp-contributions-deleted' => 'بەشدارییە سڕاوەکان',
-'sp-contributions-logs' => 'تۆمارەکان',
-'sp-contributions-talk' => 'لێدوان',
-'sp-contributions-userrights' => 'بەڕێوبەرایەتی ماÙەکانی بەکارهێنەر',
-'sp-contributions-search' => 'گەڕین بۆ بەشدارییەکان',
-'sp-contributions-username' => 'ناونیشانی ئای-پی یا ناوی بەکارهێنەری:',
-'sp-contributions-submit' => 'بگەڕە',
-
-# What links here
-'whatlinkshere' => 'بەسراوەکان بە ئێرەوە',
-'whatlinkshere-title' => 'ئەو پەڕانەی بەستەرکراون بۆ "$1"',
-'whatlinkshere-page' => 'Ù¾Û•Ú•Û•:',
-'linkshere' => "ئەم پەڕانە بەستەریان ھەیە بۆ '''[[:$1]]''':",
-'nolinkshere' => "هیچ لاپەڕەیەک بەستەری نەداوە بە '''[[:$1]]'''.",
-'nolinkshere-ns' => "هیچ لاپەڕەیەک بەستەری نەداوە بە '''[[:$1]]''' لە بۆشایی‌ناوی هەڵبژێردراو.",
-'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' => 'پاڵێوەرەکان',
-
-# Block/unblock
-'blockip' => 'بەربەستنی بەکارھێنەر',
-'blockip-legend' => 'بەربەست‌کردنی بەکارهێنەر',
-'blockiptext' => 'Ù„Û•Ù… Ùۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین Ù„Û• ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، Ú©Û•ÚµÚ© وەرگریت.
-ئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].
-لە خوارەوە هۆکارێک بە ڕوونی بنووسە (بۆ نموونە بە وردی ئەو لاپەڕانە و خراپکاری تێدا کراوە وەک، وەک بەڵگە، بنووسە).',
-'ipaddress' => 'ناونیشانی IP:',
-'ipadressorusername' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارهێنەری:',
-'ipbexpiry' => 'بەسەرچوون:',
-'ipbreason' => 'هۆکار:',
-'ipbreasonotherlist' => 'هۆکاری تر',
-'ipbreason-dropdown' => '*هۆکارە هاوبەشەکانی بەربست‌کران
-**دانانی زانیاریی هەڵە
-**لابردنی ناوەڕۆکی لاپەڕەکان
-**بەستەر بۆ لاپەڕەی دەرەکی نەگونجاو
-**نووسینی قسەی بێ‌مانا و بێ‌سوود
-**هەڵسووکەوت یان وتاری هاندەر بۆ توندوتیژی
-**بەکارهێنانی چەن هەژمارە پێکەوە
-**ناوی بەکارهێنەریی نەگونجاو',
-'ipbanononly' => 'تەنها بەربەست‌کردنی بەکارهێنەرانی نەناسراو',
-'ipbcreateaccount' => 'بەرگری لە درووست‌کردنی هەژمارە',
-'ipbemailban' => 'بەرگری لە ئی‌مەیل ناردنی بەکارهێنەر',
-'ipbenableautoblock' => 'خۆکار بەربەست‌کردنی ئەو ناونیشانی‌ ئای‌پیە وا ئەم بەکار‌هێنەرە کەڵکی لێ‌وەرگرتووە و ئەو ئای‌پی‌یانەی دیکە وا لەوێوە هەوڵی دەستکاری ئەدەن.',
-'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' => 'دیتنی لاپەڕەی بەکارهێنەر و وتووێژی ئەم بەکارهێنەرە',
-'ipballowusertalk' => 'ڕێگەدان بە ئەم بەکارهێنەرە کە لاپەڕەی وتووێژی خۆی دەستکاری بکات، کاتێ بەربەست‌کراوە',
-'ipb-change-block' => 'دیسان بەربەست‌کردنەوەی ئەم بەکارهێنەرە بەم هەڵبژاردانە',
-'badipaddress' => 'ناونیشانی ئای‌پی نەگونجاو',
-'blockipsuccesssub' => 'بەربەست کردن سەرکەوتوو بوو',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بەربەست‌کراوە.<br />
-بۆ دیتنی بەربەست‌کراوەکان، چاو لە [[Special:IPBlockList|لیستی بەربەستی ئای‌پی]] بکە.',
-'ipb-edit-dropdown' => 'دەستکاری هۆکارەکانی بەربەست',
-'ipb-unblock-addr' => 'لە بەربەست‌دەرهێنانی $1',
-'ipb-unblock' => 'لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی',
-'ipb-blocklist-addr' => 'ئەو بەربەستانەی بۆ $1 هەیە',
-'ipb-blocklist' => 'دیتنی ئەو بەربەستانەی وا هەیە',
-'ipb-blocklist-contribs' => 'هاوبەشیەکان بۆ $1',
-'unblockip' => 'لە بەربەست‌دەرهێنانی بەکارهێنەر',
-'unblockiptext' => 'بۆ گەڕاندنەوەی دەست‌پی‌گەیشتنی نووسین بۆ ئەو دوایین ئای‌پی یان بەکارهێنەری بەربەست کراوە، Ù„Û•Ùˆ Ùۆرمەی خوارەوە Ú©Û•ÚµÚ© وەرگرە.',
-'ipusubmit' => 'لابردنی ئەم بەربەستە',
-'unblocked' => '[[User:$1|$1]] لە بەربەست دەرهێنرا',
-'unblocked-id' => 'بەربەستی $1 لابرا',
-'ipblocklist' => 'IP ئەدرەس و بەکارھێنەرە بەربەستراوەکان',
-'ipblocklist-legend' => 'دۆزینەوەی بەکارهێنەرێکی بەربەست‌کراو',
-'ipblocklist-username' => 'ناوی‌ بەکارهێنەری یان ناونیشانی ئای‌پی:',
-'ipblocklist-sh-userblocks' => '$1 بەربەستی هەژمارە',
-'ipblocklist-sh-tempblocks' => '$1 بەربەستی کاتی',
-'ipblocklist-sh-addressblocks' => '$1 بەربەستی تاکە ئای‌پی',
-'ipblocklist-submit' => 'گەڕان',
-'blocklistline' => '$1، $2 بەربەستی کرد $3 ($4)',
-'infiniteblock' => 'زۆر\\نەپێوراو',
-'expiringblock' => 'لە $2، $1 ماوەی بەسەر دەچێ',
-'anononlyblock' => 'تەنها بۆ چەن سات',
-'noautoblockblock' => 'بەربەستی خۆکار لەکار خسترا',
-'createaccountblock' => 'درووست‌کردنی هەژمارە بەربەست کرا',
-'emailblock' => 'ئی‌مەیل بەربەست‌کرا',
-'blocklist-nousertalk' => 'دەستکاری لاپەڕەی وتووێژی خۆ ناکرێت',
-'ipblocklist-empty' => 'لیستی بەربەستەکان بەتاڵە',
-'ipblocklist-no-results' => 'ئای‌پی ئەدرەس یان ناوی‌ بەکارهێنەری داواکراو بەربەست نەکراوە.',
-'blocklink' => 'بەربەستن',
-'unblocklink' => 'لابردنی بەرگری',
-'change-blocklink' => 'گۆڕینی بەرگری',
-'contribslink' => 'بەشداری',
-'autoblocker' => 'خۆکار بەربەست‌کراوە لەبەر ئەوەی ناونیشانی ئای‌پی تۆ لەم دواییانەدا لە لایەن "[[User:$1|$1]]" بەکار هاتووە.
-هۆکاری بەربەست‌کرانی $1 ئەمەیە: "$2"',
-'blocklogpage' => 'لۆگی بەربەستن',
-'blocklogentry' => '[[$1]] ئاستەنگ کرا بۆ ماوەی $2 $3',
-'reblock-logentry' => 'دۆخی ئاستەنگ کردنی [[$1]] بۆ گۆڕدرا بۆ ماوەی $2 $3',
-'blocklogtext' => 'ئەمە لۆگی کردەوەکانی بەربەست‌کران یا لابردنی بەربەستی بەکارهێنەرە.
-بەربەست‌کرانی خۆکاری ئای‌پی لەم لیستەدا نەهاتوون.
-بۆ دیتنی ئەو بەربەستانە ئێستە لە ئارادان چاو لە [[Special:IPBlockList|لیستی بەربەستی ئای‌پی]] بکە.',
-'unblocklogentry' => 'بەربەستنی "$1" بەتاڵ کرا',
-'block-log-flags-anononly' => 'تەنها بەکارهێنەرە نەناسراوەکان',
-'block-log-flags-nocreate' => 'دروستکردنی هەژمار ناچالاککراوە',
-'block-log-flags-noautoblock' => 'بەربست‌کردنی خۆکار لە کار خسترا',
-'block-log-flags-noemail' => 'ئی‌مەیل بەربەست‌کراوە',
-'block-log-flags-nousertalk' => 'دەستکاری لاپەڕەی وتووێژی خۆ ناکرێت',
-'block-log-flags-angry-autoblock' => 'بەربەستی خۆکاری پێشکەوتوو خستراوەتە کار',
-'block-log-flags-hiddenname' => 'شاردنەوەی ناوی‌بەکارهێنەری',
-'range_block_disabled' => 'تایبەتمەندی بەڕێوەبەر بۆ بەربەست‌کردنی زنجیرە لە کارخستراوە.',
-'ipb_expiry_invalid' => 'کاتی بەسەرچوونی نەگونجاو.',
-'ipb_expiry_temp' => 'بەربەستی ناوی‌بەکارهێنەرە شاراوەکان دەبێ پایەدار بێت.',
-'ipb_hide_invalid' => 'بەرگری لەم هەژمارە ناکرێت، لەوانەیە دەستکاری زۆری هەبێت.',
-'ipb_already_blocked' => '"$1" لە پێش‌دا بەربەست‌‌کراوە',
-'ipb-needreblock' => '== لەپێش‌دا بەربەست‌کراو ==
-"$1" لە پێش‌دا بەربەست‌‌کراوە.
-ئایا دەتەو‌ێ هەڵبژاردەکانی بگۆڕیت؟',
-'ipb_cant_unblock' => 'پێناسەی بەربەست‌کردنی $1 نەدۆزرایەوە.
-لەوانەیە لە بەربەستی لابرابێت.',
-'ipb_blocked_as_range' => 'هەڵە: ئای‌پی $1 ڕاستەوخۆ بەربەست نەکراوە بۆیە ناکڕێت لە بەربەست لای‌ بەیت.
-ئەوە وەک بەشێک لە زنجیرە ئای‌پیی $2 بەربەست کراوە و هەر بەو شێوە دەکرێ لە بەربەست دەرچێ.',
-'ip_range_invalid' => 'زنجیرە ئای‌پی نەگونجاو.',
-'blockme' => 'بەربەست‌کردنی من',
-'proxyblocker' => 'بەربەست‌کەری پرۆکسی',
-'proxyblocker-disabled' => 'ئەم ÙÛ•Ù†Ú©Ø´ÛŽÙ†Û• لەکار خستراوە.',
-'proxyblockreason' => 'ناونیشانی ئای‌پی تۆ بەربەست‌کراوە لەبەر ئەوەی پرۆکسیەکی کراوەیە.
-تکایە پەیوەندی بکە بە دابینکەری خزمەتی ئینتەرنەتی خۆت یان پاڵپشتی تەکنیکی و ئاگادریان کەوە لەو کێشە ئەمنیە گرینگە.',
-'proxyblocksuccess' => 'جێ‌بەجێ‌کرا.',
-'sorbsreason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.',
-'sorbs_create_account_reason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.
-بۆیە ناتوانی هەژمارە درووست‌بکەی.',
-'cant-block-while-blocked' => 'کاتێ خۆت بەربەست‌کراوی، ناتوانی بەکارهێنەرانی دیکە بەربەست بکەی.',
-
-# Developer tools
-'lockdb' => 'داخستنی بنکەدراوە',
-'unlockdb' => 'کردنەوەی بنکەدراوە',
-'lockdbtext' => 'داخستنی بنکەدراوە ئەبێتە هۆی ڕاگرتنی توانای هەموو بەکارهێنەران بۆ دەستکاری لاپەڕەکان، گۆڕانی هەڵبژاردەکانیان، دەستکاری لیستی چاودێرییەکانیان و هەموو ئەموو ئەو شتانە وا پێویستی بە گۆرانکاری لە بنکەدراوە هەیە.
-تکایە ئەرخەیان بە ئەمە هەر ئەوەیە کە دەتەوێ بیکەی و دوای چاکسازیەکەت لەیادت بێ کە بنکەدراوەکە بکەیتەوە.',
-'unlockdbtext' => 'کردنەوەی بنکەدراوە ئەبێتە هۆی گەڕاندنەوەی توانای هەموو بەکارهێنەران بۆ دەستکاری لاپەڕەکان، گۆڕانی هەڵبژاردەکانیان، دەستکاری لیستی چاودێرییەکانیان و هەموو ئەموو ئەو شتانە وا پێویستی بە گۆرانکاری لە بنکەدراوە هەیە.
-تکایە ئەرخەیان بە ئەمە هەر ئەوەیە کە دەتەوێ بیکەی.',
-'lockconfirm' => 'بەڵێ، ئەرخەیانم دەمەوێ بنکەدراو داخەم.',
-'unlockconfirm' => 'بەڵێ، ئەرخەیانم دەمەوێ بنکەدراو بکەمەوە.',
-'lockbtn' => 'داخستنی بنکەدراو',
-'unlockbtn' => 'کردنەوەی بنکەدراو',
-'locknoconfirm' => 'چوارچێوەی ئەرخەیانیت نیشان‌ نەکرد.',
-'lockdbsuccesssub' => 'داخستنی بنکەدراو بەسەرکەوتوویی جێبەجێ کرا',
-'unlockdbsuccesssub' => 'بنکەدراو کرایەوە',
-'lockdbsuccesstext' => 'بنکەدراو داخرا.<br />
-لەیادت بێ دوای تەواوبوونی چاکسازی [[Special:UnlockDB|بنکەدراو بکەیتەوە]].',
-'unlockdbsuccesstext' => 'بنکەدراو کرایەوە.',
-'lockfilenotwritable' => 'پەڕگەی داخستنی بنکەدراو سەرنووس ناکرێت.
-بۆ کردنەوە یا داخستنی بنکەدراو، پێویستە ڕاژەکار بتوانێ ئەو پەڕگە سەرنووس بکات.',
-'databasenotlocked' => 'بنکەدراو دانەخراوە.',
-
-# Move page
-'move-page' => '$1 بگوازەوە',
-'move-page-legend' => 'گواستنەوەی پەڕە',
-'movepagetext' => "بەکارھێنانی ئەم Ùۆرمەی خوارەوە ناوی پەڕەیەک دەگۆڕێت، بە گواستنەوەی ھەموو مێژووەکەی بۆ ناوی نوێ.<br />
-<br />ناوە کۆنەکە دەبێتە پەڕەیەکی ئاڕاستەکردنەوە بۆ ناوە نوێکە.
-دەتوانی ئاڕاستەکان بۆ پەڕەی سەرەکی بەشێوەی خۆکار نوێ بکەیتەوە.<br />
-ئەگەر ناتەوێت ئەم کارە بکەی، دڵنیا بە کە [[Special:DoubleRedirects|ئاڕاستە دووبارەکراوەکان]] یان [[Special:BrokenRedirects|شکاوەکان]] تاقی بکەیتەوە.<br />
-تۆ بەرپرسیاری دڵنیا ببیتەوە لەوەی کە بەستەرەکان دەچنە سەر خاڵێک کە چاوەروان دەکرێت بچنە ئەوێ.<br /><br />
-دەبێت بزانی کە پەڕەکە '''ناگوازرێتەوە''' ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە پەڕەکە واڵا یان ئاڕاستەیەک بێت و ھیچ مێژووی گۆڕاندنی پێشووی نەبێت.<br />
-ئەمە بەو واتایە کە ئەگەر ھەڵەیەک بکەی دەتوانی ناوی پەڕەکە دیسانەوە بگۆڕی بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ھەنووکە ھەیە.<br /><br />
-'''ئاگاداری!'''<br />
-ئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕێنەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛<br />
-تکایە پێش گۆڕینی ناو باش بیر لە ئاکامەکەی بکەوە.",
-'movepagetalktext' => "پەڕەی وتووێژی پەیوەندیدار بە شێوەی خۆکار لەگەڵیدا دەگوازرێتەوە، '''مەگەر:'''
-*پەڕەیەکی لێدوانی ناواڵا پێشتر ھەبێت لە ژێر ناوە نوێکەدا، یان
-*ئەم بۆکسەی خوارەوەت لێنەداوە بکەی.
-<br /><br />
-لەو حاڵەتانەدا، ئەگەر بتەوێت بیگوازیتەوە ناچار دەبیت بە شێوەی دەستی بیگوازیتەوە یان تێکەڵیان بکەی.",
-'movearticle' => 'ئەم پەڕە بگوازەوە:',
-'movenologin' => 'نەچوویتەتە ژوورەوە',
-'movenologintext' => 'بۆ گواستنەوەی پەڕەیەک، ئەشێ ببی بە ئەندام و [[Special:UserLogin|لە ژوورەوە]] بیت.',
-'movenotallowed' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەکان.',
-'movenotallowedfile' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی پەڕگەکان.',
-'cant-move-user-page' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەکانی بەکارهێنەر (جیاواز لە ژێرلاپەڕەکان).',
-'cant-move-to-user-page' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەیەک بۆ لاپەڕەی بەکارهێنەر (غەیری بۆ ژێرلاپەڕەی بەکارهێنەر).',
-'newtitle' => 'بۆ ناوی نوێی:',
-'move-watch' => 'ئەم پەڕە چاودێری بکە',
-'movepagebtn' => 'ئەم پەڕە بگوازەوە',
-'pagemovedsub' => 'گواستنەوە بە سەرکەوتوویی جێبەجێ کرا',
-'movepage-moved' => '\'\'\'"$1" گوازراوەتەوە بۆ "$2"\'\'\'',
-'movepage-moved-redirect' => 'ڕەوانکەرێک درووست‌کرا.',
-'movepage-moved-noredirect' => 'لە دانانی ڕەوانەکەر بەرگری کرا.',
-'articleexists' => 'لاپەڕەیەک بەم ناوە ھەیە، یان ئەو ناوەی تۆ ھەڵتبژاردووە بایەخدار نیە.
-تکایە ناوێکی دیکە ھەڵبژێرە',
-'cantmove-titleprotected' => 'ناتوانی لاپەڕەیەک بگوێزیتەوە بۆ ئەم شوێنە، لەبەر ئەوەی سەردێڕی نوێ لە درووست‌کردن پارێزراوە.',
-'talkexists' => "'''خودی پەڕەکە بە سەرکەوتوویی گوازرایەوە، بەڵام پەڕەی وتووێژەکەی ناگوازرێتەوە چونکو پێشتر بە سەردێرە نوێکەوە، یەکێک ھەیە.
-تکایە بە دەستی تێکەڵیان بکە.'''",
-'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' => 'زۆرینەی ژمارەی $1 {{PLURAL:$1|لاپەڕە|لاپەڕە}} گوێستراوەتەوە و لەوە زیاتر خۆکار ناگوێسترێتەوە.',
-'1movedto2' => '[[$1]] گۆزرایەوە بۆ [[$2]]',
-'1movedto2_redir' => 'بە ڕەوانکردنەوە، [[$1]] گۆزرایەوە بۆ [[$2]]',
-'move-redirect-suppressed' => 'ڕەوانەکردن بەرگری‌کراوە',
-'movelogpage' => 'لۆگی گواستنەوە',
-'movelogpagetext' => 'لە خوارەوەدا لیستی ھەموو پەڕە گواستنەوەکان دەبینن.',
-'movesubpage' => '{{PLURAL:$1|ژێرپەڕە|ژێرپەڕە}}',
-'movesubpagetext' => 'ئەم لاپەڕە $1 {{PLURAL:$1|ژێرلاپەڕەی‌|ژێرلاپەڕەی}} هەیە کە لەخوارە نیشان دراوە.',
-'movenosubpage' => 'ئەم پەڕە ھیچ ژێرپەڕەیەکی نییە.',
-'movereason' => 'هۆکار:',
-'revertmove' => 'پێچەوانەکردنەوە',
-'delete_and_move' => 'بیسڕەوە و بیگوازەوە',
-'delete_and_move_text' => '== پێویستییەکانی سڕینەوە ==
-لاپەڕەی مەبەست "[[:$1]]" لە پێش‌دا هەیە.
-ئایا دەتەوێ ئەوە بسڕیتەوە تا ڕێگە بۆ گواستنەوەی بکەیتەوە؟',
-'delete_and_move_confirm' => 'بەڵێ، لاپەڕەکە بسڕەوه',
-'delete_and_move_reason' => 'بۆ کردنەوەی ڕیگە بۆ گواستنەوەی لاپەڕە، سڕایەوە',
-'selfmove' => 'سەردێڕەکانی سەرچاوە و مەبەست یەکێکن؛
-ناکرێ لاپەڕەیەک بۆ سەر خۆی‌ بگوازرێتەوە.',
-'immobile-source-namespace' => 'گواستنەوەی لاپەڕە لە بۆشایی‌ناو "$1" ناکرێت.',
-'immobile-target-namespace' => 'گواستنەوەی لاپەڕە بۆناو بۆشایی‌ناو "$1" ناکرێت.',
-'immobile-target-namespace-iw' => 'بەستەرێکی نێوان‌ویکی ئامانجێکی گونجاو نیە بۆ گواستنەوەی لاپەڕە.',
-'immobile-source-page' => 'ئەمە لاپەڕە بۆ گواستنەوە نابێت.',
-'immobile-target-page' => 'بۆ ئەم سەردێڕی ئامانجە جێگۆڕ ناکرێ.',
-'imagenocrossnamespace' => 'گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.',
-'imagetypemismatch' => 'پاشگری ئەو پەڕگە نوێیە هاوتای جۆری پەڕگەکە نیە.',
-'imageinvalidfilename' => 'ناوی پەڕگەی ئامانج گونجاو نیە',
-'fix-double-redirects' => 'نوێ‌کەردنەوەی هەموو ڕەوانکەرەکان وا ئاماژە بە سەردێڕە سەرەکیەکە دەکەن',
-'move-leave-redirect' => 'لە پاشەوە ڕەوانکەرێک دابنە',
-'protectedpagemovewarning' => "'''ئاگاداری: '''ئەم لاپەڕە داخراوە بۆیە تەنها ئەو بەکارهێنەرانەی ماÙÛŒ بەڕێوبەرایەتیان هەیە دەتوانن جێگۆڕی بکەن.",
-'semiprotectedpagemovewarning' => "'''ئاگاداری: '''ئەم لاپەڕە داخراوە بۆیە تەنها ئەو بەکارهێنەرانەی هەژمارەکەیان تۆمار کراوە دەتوانن جێگۆڕی بکەن.",
-
-# Export
-'export' => 'ھەناردنی پەڕەکان',
-'exporttext' => 'دەتوانی دەق و مێژووی دەستکاری لاپەڕەیەکی تایبەت یان دەستە لاپەڕەیەک بۆ ناو پەڕگەیەکی XML هەناردن بکەیت.
-دواتر بە کەڵک‌وەرگرتن لە [[Special:Import|لاپەڕەی هێنانەناوە]] لە مێدیاویکی‌دا، دەتوانی بیهێنیتە ناو ویکی‌یەکانی دیکە.
-
-بۆ هەناردنی لاپەڕەکان، سەردێڕەکان لە چوارچێوەی دەقی خوارەوە بنووسە، هەر هێڵێک یەک سەردێڕ. هەروا هەڵبژێرە ئایا پێداچوونەوەی ئێستا و هەموو پێداچوونەوە کۆنەکانت دەوێ یان هەر پێداچوونەوەی ئێستا و زانیاریی سەبارەت بە دوایین دەستکاری.
-
-لە بابەتی دواتر هەروەها دەتوانی لە بەستەرێک کەڵک وەرگریت، بۆ نموونە [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] بۆ لەپەڕەی "[[{{MediaWiki:Mainpage}}]]".',
-'exportcuronly' => 'تەنها پێداچوونەوەی ئێستا لەخۆ بگرێت نەک هەموو مێژوو',
-'exportnohistory' => "----
-'''ئاگاداربە: '''ھەناردنی ھەموو مێژووی پەڕەکان Ù„Û•Ù… Ùۆرمەوە لەبەر ھۆکاری ڕێخستن، داخراوە.",
-'export-submit' => 'هەناردن',
-'export-addcattext' => 'زیادکردنی لاپەڕەکان لە هاوپۆل:',
-'export-addcat' => 'زیادکردن',
-'export-addnstext' => 'زیادکردنی لاپەڕەکان لە بۆشایی‌ناو:',
-'export-addns' => 'زیادکردن',
-'export-download' => 'پاشەکەوت‌کردن وە پەڕگە',
-'export-templates' => 'داڕێژەکانیش لە خۆگرێت',
-'export-pagelinks' => 'لەخۆگرتنی لاپەڕەکانی بەستەر پێ‌دراو هەتا قووڵایی:',
-
-# Namespace 8 related
-'allmessages' => 'پەیامەکانی سیستەم',
-'allmessagesname' => 'ناو',
-'allmessagesdefault' => 'دەقی بنەڕەتی',
-'allmessagescurrent' => 'دەقی ھەنووکە',
-'allmessagestext' => 'ئەمە لیستێکە لە پەیامەکانی بەردەست لە بۆشایی‌ناوی مێدیاویکی.
-بۆ هاوبەشی لە ناوچەیی‌کردنی مێدیاویکی، تکایە سەرنجی [http://www.mediawiki.org/wiki/Localisation ناوچەیی‌کردن] و [http://translatewiki.net translatewiki.net] بدە.',
-'allmessagesnotsupportedDB' => "ئەم لاپەڕە ناتوانی بەکاربێت لەبەر ئەوەی '''\$wgUseDatabaseMessages''' لەکار خستراوە.",
-'allmessages-filter-legend' => 'پاڵێو',
-'allmessages-filter-unmodified' => 'چاکسازی نەکراو',
-'allmessages-filter-all' => 'هەموو',
-'allmessages-filter-modified' => 'چاکسازی‌کراو',
-'allmessages-prefix' => 'پاڵێو بە پێشگر:',
-'allmessages-language' => 'زمان:',
-'allmessages-filter-submit' => 'ڕۆشتن',
-
-# Thumbnails
-'thumbnail-more' => 'گەورە کردنەوە',
-'filemissing' => 'ون‌بوونی پەڕگە',
-'thumbnail_error' => 'هەڵە کاتی درووست‌کردنی هێما: $1',
-'djvu_page_error' => 'لاپەڕەی DjVu لەدەرۆی ڕیز',
-'djvu_no_xml' => 'XML بۆ پەڕگەی DjVu ناکێشرێتەوە',
-'thumbnail_invalid_params' => 'دیاریکەری نەگونجاوی هێما',
-'thumbnail_dest_directory' => 'پێرستی مەبەست درووست‌ناکرێت',
-'thumbnail_image-type' => 'جۆرەی وێنە پاڵپشت نەکراوە',
-'thumbnail_gd-library' => 'شێوەپێدانی‌ ناتەواوی ژێدەرگەی GD: ون‌بوونی ÙÛ•Ù†Ú©Ø´ÛŽÙ† $1',
-'thumbnail_image-missing' => 'لەوە دەچێ پەڕگە ون بوبێت: $1',
-
-# Special:Import
-'import' => 'هێنانەناوەی لاپەڕەکان',
-'importinterwiki' => 'هێنانەناوەی ترانس‌ویکی',
-'import-interwiki-text' => 'بۆ هێنانە‌ناوە ویکی‌یەک و سەردێڕێکی لاپەڕە هەڵبژێرە.
-ڕێکەوتەکانی پێداچوونەوە و ناوی دەستکاری‌کەرەکان دەپارێزدرێت.
-هەموو کردوەکانی هێنانەناوەی ترانس‌ویکی لە [[Special:Log/import|لۆگی هێنانەناوە]] لۆگ دەکرێت.',
-'import-interwiki-source' => 'سەرچاوەی ویکی\\لاپەڕە :',
-'import-interwiki-history' => 'ڕوونووس‌کردنی هەموو مێژووی پێداچوونەوەکانی ئەم لاپەڕە',
-'import-interwiki-templates' => 'لەخۆگرتنی هەموو داڕێژەکان',
-'import-interwiki-submit' => 'هاوردن',
-'import-interwiki-namespace' => 'بۆشایی‌ناوی مەبەست:',
-'import-upload-filename' => 'پەڕگە‌ناو:',
-'import-comment' => 'بۆچوون:',
-'importtext' => 'تکایە هەناردنی پەڕگە لە سەرچاوەی ویکی‌یەوە بە کەڵک وەرگرتن لە [[Special:Export|ئامێری هەناردن]] بکە.
-لەسەر کۆمپیۆتەرەکەت پاشەکەوتی بکە و باری‌بكە ئێرە.',
-'importstart' => 'هێنانەناوەی لاپەڕەکان',
-'import-revision-count' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}',
-'importnopages' => 'هیچ لاپەڕەیەک نیە بۆ هێنانەناوە.',
-'importfailed' => 'هێنانەناوە سەرکەوتوو نەبوو: <nowiki>$1</nowiki>',
-'importunknownsource' => 'جۆرەی سەرچاوەی هێنانەناوەی نەناسراو',
-'importcantopen' => 'پەڕگەی هێنانەناوە ناکرێتەوە',
-'importbadinterwiki' => 'بەستەری خراپی نێوان‌ویکی',
-'importnotext' => 'بەتاڵ لە دەق',
-'importsuccess' => 'هێنانەناوە تەواو بوو!',
-'importhistoryconflict' => 'کێشە لەو مێژووی پێداچوونەوانە وا هەیە (لەوانەیە ئەم لاپەڕە لەپێش‌دا هێنرابێتەناوە)',
-'importnosources' => 'هیچ سەرچاوەیەکی هێنانەناوەی نێوان‌ویکی دیاری‌نەکراوە و بارکردنی ڕاستەوخۆی مێژوو لەکارخستراوە.',
-'importnofile' => 'هیچ پەڕگەیەکی هێنانەناوە بارنەکرا.',
-'importuploaderrorsize' => 'بارکردنی پەڕگەی هێنانەناوە سەرکەوتوو نەبوو.
-پەڕگەکە لەو قەبارەی بۆ بارکردن ڕێگەدراوە گەورەترە.',
-'importuploaderrorpartial' => 'بارکردنی پەڕگەی هێنانەناوە سەرکەوتوو نەبوو.
-تەنها بەشێک لە پەڕگەکە بارکرا.',
-'importuploaderrortemp' => 'بارکردنی پەڕگەی هێنانەناوە سەرکەوتوو نەبوو.
-بوخچەیەکی کاتی ون‌بووە.',
-'import-parse-failure' => 'سەرنەکەوتن لە هێنانەناوەی XML',
-'import-noarticle' => 'هیچ لاپەڕەیەک نیە بۆ هێنانەناوە',
-'import-nonewrevisions' => 'هەموو پێداچوونەوەکان لە پێش‌دا هێنراونەتەناوە.',
-'import-upload' => 'بارکردنی دراوەی XML',
-'import-token-mismatch' => 'لەدەست‌ڕۆشتنی دراوەکانی ئەو بەشە.
-تکایە دیسان تاقی‌بکەوە.',
-'import-invalid-interwiki' => 'لە ویکی‌ دیاری‌کراوە ناهێنڕێتەوە ناوە.',
-
-# Import log
-'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',
-
-# Tooltip help for the actions
-'tooltip-pt-userpage' => 'پەڕە بەکارھێنەریی تۆ',
-'tooltip-pt-anonuserpage' => 'پەڕەی بەکارھێنەری بۆ ئای‌پی یەکە کە بەناویەوە خەریکی دەستکاری کردنی',
-'tooltip-pt-mytalk' => 'پەڕەی وتوبێژی تۆ',
-'tooltip-pt-anontalk' => 'لێدوان لەسەر دەستکارییەکان لەم ئایپی ئەدرەسەوە',
-'tooltip-pt-preferences' => 'بژاردەکانت',
-'tooltip-pt-watchlist' => 'لیستی ئەو پەڕانە کە چاودێری گۆڕانکارییەکانیانی دەکەی',
-'tooltip-pt-mycontris' => 'لیستی بەشدارییەکانت',
-'tooltip-pt-login' => 'هاندەدرێیت کە بچیتە ژوورەوە؛ هەرچەندە، پێویست نییە',
-'tooltip-pt-anonlogin' => 'پێشنیار دەکەین بڕۆیتەژوورەوە، ئەگەرچی ئەوە زۆرەملیی نیە',
-'tooltip-pt-logout' => 'دەرچوون',
-'tooltip-ca-talk' => 'لێدوان دەربارەی ناوەڕۆکی پەرە',
-'tooltip-ca-edit' => 'ئەتوانی دەستکاری ئەم پەڕەیە بکەیت.
-تکایە دوگمەی پێشبینین بەکارببە پێش پاشەکەوتکردن.',
-'tooltip-ca-addsection' => 'بەشێکی نوێ دەست پێ بکە',
-'tooltip-ca-viewsource' => 'ئەم پەڕەیە پارێزراوە.
-ئەتوانی سەرچاوەکەی ببینیت',
-'tooltip-ca-history' => 'وەشانەکانی پێشووی ئەم پەڕەیە',
-'tooltip-ca-protect' => 'ئەم پەڕەیە بپارێزە',
-'tooltip-ca-delete' => 'ئەم پەڕەیە بسڕەوە',
-'tooltip-ca-undelete' => 'هێنانەوەی دەستکاریەکانی پیش سڕینەوە وا لەسەر ئەم لاپەڕە ڕووی‌داوە',
-'tooltip-ca-move' => 'ئەم پەڕەیە بگوازەوە',
-'tooltip-ca-watch' => 'ئەم پەڕە بخە سەر لیستی چاودێریت',
-'tooltip-ca-unwatch' => 'ئەم پەڕە لە لیستی چاودێڕییەکەت لابە',
-'tooltip-search' => 'لە {{SITENAME}} بگەڕێ',
-'tooltip-search-go' => 'بڕۆ بۆ پەڕەیەک کە بە تەواوەتی ئەم ناوەی تیادایە ئەگەر هەبێت',
-'tooltip-search-fulltext' => 'لە پەڕەکاندا بگەڕێ بۆ ئەم دەقە',
-'tooltip-p-logo' => 'بینینی پەڕەی دەستپێک',
-'tooltip-n-mainpage' => 'بینینی پەڕەی دەستپێک',
-'tooltip-n-mainpage-description' => 'سەردانی پەڕەی سەرەکی بکە',
-'tooltip-n-portal' => 'دەربارەی پڕۆژەکە، چی ئەتوانی بکەیت، لە کوێ شتەکان بدۆزیتەوە',
-'tooltip-n-currentevents' => 'زانیاری پێشینە بەدەست بھێنە دەربارەی بۆنە ھەنووکەییەکان',
-'tooltip-n-recentchanges' => 'لیستی دوایین گۆڕانکارییەکان لەم ویکییەدا',
-'tooltip-n-randompage' => 'پەڕەیەک بە هەڵکەوت نیشان بدە',
-'tooltip-n-help' => 'شوێنێک بۆ دۆزینەوەی',
-'tooltip-t-whatlinkshere' => 'لیستی هەموو ئەو پەڕانەی ویکی کە بەستەرکراون بۆ ئێرە',
-'tooltip-t-recentchangeslinked' => 'دوایین گۆڕانکارییەکان لەو پەڕانە کە بەگرەوە گرێ دراون',
-'tooltip-feed-rss' => 'RSS بۆ ئەم گۆڕانکارییەکانی ئەم پەڕە',
-'tooltip-feed-atom' => 'Atom feed بۆ ئەم گۆڕانکارییەکانی ئەم پەڕە',
-'tooltip-t-contributions' => 'بینینی بەشدارییەکانی ئەم بەکارھێنەرە',
-'tooltip-t-emailuser' => 'ئیمەیلێک بنێرە بۆ ئەم بەکارھێنەرە',
-'tooltip-t-upload' => 'پەڕگەیەک (Ùایل) بار بکە',
-'tooltip-t-specialpages' => 'لیستی ھەموو پەڕە تایبەتەکان',
-'tooltip-t-print' => 'وەشانی چاپی ئەم پەڕەیە',
-'tooltip-t-permalink' => 'گرێدەری ھەمیشەیی بۆ ئەم وەشانەی ئەم پەڕەیە',
-'tooltip-ca-nstab-main' => 'بینینی پەڕەی ناوەڕۆک',
-'tooltip-ca-nstab-user' => 'پەڕەی بەکارھێنەر تەماشا بکە',
-'tooltip-ca-nstab-media' => 'پەڕەی میدیا چاو لێ بکە',
-'tooltip-ca-nstab-special' => 'ئەمە پەڕەیەکی تایبەتە، ناتوانی خودی ئەم پەڕە دەستکاری بکەیت',
-'tooltip-ca-nstab-project' => 'بینینی پەڕەی پرۆژە',
-'tooltip-ca-nstab-image' => 'بینینی پەڕەی پەڕگە',
-'tooltip-ca-nstab-mediawiki' => 'بینینی پەیامی سیستەم',
-'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-recreate' => 'درووست‌کردنەوەی لاپەڕە ئەگەرچی سڕاوەتەوە',
-'tooltip-upload' => 'دەستپێکردنی بارکردن',
-'tooltip-rollback' => "''گەڕاندنەوە'' بە یەک کلیک گۆڕانکاری (گۆڕانکارییەکانی) ئەم پەڕە ئەباتەوە بۆ ھی دواین بەشدار",
-'tooltip-undo' => '"پاشگەزبوونەوە" گۆڕانکارییەکان دەگەڕەنێتەوە Ùˆ Ùۆرمی دەستکاری کردن Ù„Û• حاڵەتی پێشبینین دەکاتەوە. بەم Ø´ÛŽÙˆÛ• دەکرێ ھۆکارێک Ù„Û• بەشی پوختە دا بنووسرێت.',
-
-# Metadata
-'notacceptable' => 'ڕاژەکاری ویکی ناتوانێت داتا بەوشێوەی بۆ ڕاژەخوازی تۆ بخوێندرێتەوە، ئامادە بکات.',
-
-# Attribution
-'anonymous' => '{{PLURAL:$1|بەکارهێنەری|بەکارهێنەرانی}} نەناسراوی {{SITENAME}}',
-'siteuser' => 'بەکارھێنەری {{SITENAME}}، $1',
-'lastmodifiedatby' => 'ئەم پەڕە دواجار لە $2ی $1 بە دەستی $3 گۆڕدراوە.',
-'othercontribs' => 'لەسەر بنەمای کاری $1.',
-'others' => 'ئەوانی دیکە',
-'siteusers' => '{{PLURAL:$2|بەکارهێنەری|بەکارهێنەرانی}} {{SITENAME}} $1',
-'creditspage' => 'بایەخەکانی لاپەڕە',
-'nocredits' => 'هیچ زانیارییەکی بایەخ لەبەردەست‌دا نیە بۆ ئەم لاپەڕە.',
-
-# Spam protection
-'spamprotectiontitle' => 'پاڵێوی پاراستن لە سپام',
-'spamprotectiontext' => 'ئەو لاپەڕەی دەتویست پاشەکەوتی بکەی، بە پاڵێوی سپام بەربەست‌کرا
-لەوانەیە هۆکاری ئەوە بەستەرەک بووە بۆ ماڵپەڕەکی دەرەکی کە لەناو ڕەش‌لیست‌دایە.',
-'spamprotectionmatch' => 'ئەم دەقە ئەوەیە کە پاڵێوی سپامەکە دەبزوێنێ: $1',
-'spambot_username' => 'خاوێن‌کردنەوەی سپامی مێدیاویکی',
-'spam_reverting' => 'گەڕانەوە بۆ دوایین پێداچوونەوە کە بەستەری لەخۆگرتووە بۆ $1',
-
-# Info page
-'infosubtitle' => 'زانیاریی لاپەڕە',
-'numedits' => 'ژمارەی دەستکارییەکان (پەڕە): $1',
-'numtalkedits' => 'ژمارە گۆڕانکارییەکان (پەڕەی لێدوان): $1',
-'numwatchers' => 'ژمارەی چاودێران: $1',
-'numauthors' => 'ژمارەی نووسەری جودا (لاپەڕە): $1',
-
-# Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'غەریبی',
-'skinname-cologneblue' => 'شینی کۆلۆن',
-'skinname-monobook' => 'Ù…Û†Ù†Û†',
-'skinname-myskin' => 'پێستی خۆم',
-'skinname-chick' => 'جوجه‌',
-'skinname-simple' => 'ساده‌',
-'skinname-modern' => 'مۆدێڕن',
-'skinname-vector' => 'ڤێکتۆر',
-
-# Math options
-'mw_math_png' => 'ھەموو جارێک وەک PNG نیشان بدە',
-'mw_math_simple' => 'HTML ئەگەر ساکار بێت, ئەگەرنا PNG',
-'mw_math_html' => 'ئەگەر بکرێ بە HTML ، ئەگەرنا بە PNG',
-'mw_math_source' => 'وەک TeX بمێنێتەوە (بۆ وێبگەڕە دەقی‌یەکان)',
-'mw_math_modern' => 'بۆ وێبگەڕە مۆدێڕنەکان باشترە',
-
-# Math errors
-'math_unknown_error' => 'هەڵەیەکی نەزانراو',
-'math_unknown_function' => 'Ùەرمانێکی نەناسراو',
-'math_syntax_error' => 'ڕستەکار هەڵەیە',
-
-# Patrolling
-'markaspatrolleddiff' => 'وەک چاودێری‌کراو نیشان‌کردن',
-'markaspatrolledtext' => 'ئەم لاپەڕە وەک چاودێری‌کراو نیشان بکە',
-'markedaspatrolled' => 'وەک چاودێری‌کراو نیشان‌کرا',
-'markedaspatrolledtext' => 'پێداچوونەوەی هەڵبژێراو وەک چاودێری‌کراو نیشان‌کرا.',
-'rcpatroldisabled' => 'چاودێری دوایین گۆڕانکاریەکان لەکار خسترا',
-'rcpatroldisabledtext' => 'تایبەتمەندی چاودێری دوایین گۆڕانکاریەکان ئێستا لەکار خستراوە.',
-'markedaspatrollederror' => 'ناکرێ وه‌ک چاودێری‌کراو نیشان بکرێت',
-'markedaspatrollederror-noautopatrol' => 'ڕێگەت پێ‌نەدراوە گۆڕانکاریەکانی خۆت وەک چاودێری‌کراو نیشان بکەیت.',
-
-# Patrol log
-'patrol-log-page' => 'لۆگی چاودێری',
-'patrol-log-header' => 'ئەمە لۆگێکی چاودێری پێداچوونەوەکانە.',
-'patrol-log-auto' => '(خۆکار)',
-'patrol-log-diff' => 'پێداچوونەوە $1',
-'log-show-hide-patrol' => 'لۆگی چاودێری $1',
-
-# Image deletion
-'deletedrevision' => 'پێداچوونەوەی کۆنی سڕاوە $1',
-'filedeleteerror-short' => 'هەڵە لە سڕینەوەی پەڕگە: $1',
-'filedeleteerror-long' => 'کاتی سڕینەوەی ئەم پەڕگەی ڕووبەڕووی کێشە بووینەوە:
-
-$1',
-'filedelete-missing' => 'Ùایلی "$1" ناتوانرێت بسردرێته‌وه‌ ،له‌به‌ر ئه‌وه‌ی بونی نیه‌',
-
-# Browsing diffs
-'previousdiff' => '→ گۆڕانکاریی کۆنتر',
-'nextdiff' => 'گۆڕانکاریی نوێتر â†',
-
-# Media information
-'thumbsize' => 'قەبارەی وێنۆک:',
-'file-info' => '(قه‌باره‌: $1, جۆر: $2)',
-'file-info-size' => '($1 × $2 پیکسێل، قەبارەی پەڕگە: $3، جۆری MIME: $4)',
-'file-nohires' => '<small>رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.</small>',
-'svg-long-desc' => '(پەڕگەی SVG، بە ناو $1 × $2 خاڵ، قەبارەی پەڕگە: $3)',
-'show-big-image' => 'گەورە کردنەوە',
-'show-big-image-thumb' => '<small>قەبارەی ئەم پێشبینینە: $1 × $2 خاڵە</small>',
-
-# Special:NewFiles
-'newimages' => 'پێشانگای پەڕگە نوێکان',
-'newimages-legend' => 'پاڵاوتن',
-'noimages' => 'هیچ بۆ دیتن نیە.',
-'ilsubmit' => 'گەڕان',
-'bydate' => 'بەپێی ڕێکەوت',
-
-# Bad image list
-'bad_image_list' => 'Ùۆرمات بەم Ø´ÛŽÙˆÛ•ÛŒ خوارەوەیە:
-
-تەنھا ئەو بابەتانەی کە کە لیست کراون (واتە ئەو دێڕانەی بە * دەست پێ دەکەن) لێک ئەدرێتەوە.
-یەکەم بەستەر Ù„Û• سەر دێڕێک دەبێت بەستەری Ùایلێکی خراپ بێت.
-ھەموو بەستەرەکانی دوای ئەو Ú©Û• لەسەر ھەمان دێڕن وەکوو نائاسایی دێتە ھەژمار، واتە ئەو لاپەڕانەی Ú©Û• Ú•Û•Ù†Ú¯Û• تێدا Ùایل بە Ø´ÛŽÙˆÛ•ÛŒ ئینلاین بێت',
-
-# Variants for Kurdish language
-'variantname-ku-arab' => 'ئەلÙوبێی عەرەبی',
-'variantname-ku-latn' => 'ئەلÙوبێی لاتینی',
-
-# Metadata
-'metadata' => 'دراوی مێتا',
-'metadata-help' => 'ئەم پەڕگە زانیاری زێدەی ھەیە، کە لەوە دەچێت کامێرا یان ھێماگر (scanner) خستبێتیە سەری. ئەگەر پەڕگەکە لە حاڵەتی سەرەتاییەکەیەوە دەستکاری کرابێ، شایەد بڕێ لە بڕگەکان بە تەواوی زانیارەکانی وێنە گۆڕدراوەکە نیشان نەدەن.',
-'metadata-expand' => 'وردەکارییە درێژکراوەکان پیشان بدە',
-'metadata-collapse' => 'وردەکارییە درێژکراوەکان بشارەوە',
-'metadata-fields' => 'ئەو کێڵگە EXIFانە لەم پەیامە بە ڕیز کراون، کاتێک خشتەی metadata کۆ کراوەش بێ ھەر نیشان ئەدرێت. کێڵگەکانی تر تا خشتەکە باز نەکرێ، شاراوەن.
-* make
-* model
-* datetimeoriginal
-* exposuretime
-* fnumber
-* isospeedratings
-* focallength',
-
-# EXIF tags
-'exif-imagewidth' => 'پانی',
-'exif-imagelength' => 'بەرزی',
-'exif-imagedescription' => 'ناونیشانی وێنە',
-'exif-model' => 'جۆری کامێرا',
-'exif-artist' => 'نووسەر',
-'exif-colorspace' => 'بۆشایی ره‌نگ',
-'exif-usercomment' => 'بۆچوونەکانی بەکارهێنەر',
-'exif-relatedsoundfile' => 'Ùایلی ده‌نگی لێکچوو',
-'exif-lightsource' => 'سەرچاوەی ڕووناکی',
-'exif-flash' => 'Ùلاش',
-'exif-filesource' => 'سەرچاوەی پەڕگە',
-'exif-saturation' => 'تێربوون',
-'exif-gpslatitude' => 'پانی',
-'exif-gpslongitude' => 'درێژی',
-'exif-gpsmeasuremode' => 'جۆری پێوان',
-'exif-gpsdop' => 'وردی پێوان',
-'exif-gpsspeedref' => 'یەکەی خێرایی',
-'exif-gpsspeed' => 'خێرایی وەرگری GPS',
-'exif-gpstrack' => 'ئاڕاستەی جوڵان',
-'exif-gpsimgdirection' => 'ئاڕاستەی وێنە',
-'exif-gpsdatestamp' => 'ڕێکەوتی GPS',
-
-# EXIF attributes
-'exif-compression-1' => 'نەپەستێنراو',
-
-'exif-unknowndate' => 'ڕێکەوتی نەزانراو',
-
-'exif-orientation-1' => 'ئاسایی',
-'exif-orientation-2' => 'ئاسۆیی هەڵگێڕدراوەتەوە',
-'exif-orientation-3' => '١٨٠° سوڕاوەتەوە',
-'exif-orientation-4' => 'ستوونی هەڵگێڕدراوەتەوە',
-
-'exif-componentsconfiguration-0' => 'بوونی نییە',
-
-'exif-exposureprogram-1' => 'دەستکار',
-
-'exif-meteringmode-0' => 'نەزانراو',
-'exif-meteringmode-1' => 'تێکڕا',
-'exif-meteringmode-5' => 'Ø´ÛŽÙˆÛ•',
-'exif-meteringmode-6' => 'بەش بەش',
-'exif-meteringmode-255' => 'هیتر',
-
-'exif-lightsource-0' => 'نەزانراو',
-'exif-lightsource-1' => 'ڕووناکی ڕۆژ',
-'exif-lightsource-2' => 'Ùلۆرسەنت',
-'exif-lightsource-3' => 'تانگەستەن',
-'exif-lightsource-4' => 'Ùلاش',
-'exif-lightsource-9' => 'ئاسمانی ڕوون',
-'exif-lightsource-10' => 'ئاسمانی هەوری',
-'exif-lightsource-11' => 'سێبەر',
-'exif-lightsource-12' => 'Ùلۆرسەنتی ڕووناکیی‌ڕۆژ (D 5700 – 7100K)',
-'exif-lightsource-13' => 'Ùلۆرسەنتی سپیی Ú•Û†Ú˜ (N 4600 – 5400K)',
-'exif-lightsource-14' => 'Ùلۆرسەنتی سپیی ÙÛŽÙ†Ú© (W 3900 – 4500K)',
-'exif-lightsource-15' => 'Ùلۆرسەنتی سپی (WW 3200 – 3700K)',
-'exif-lightsource-17' => 'ڕووناکی ستانداردی A',
-'exif-lightsource-18' => 'ڕووناکی ستانداردی B',
-'exif-lightsource-19' => 'ڕووناکی ستانداردی C',
-'exif-lightsource-24' => 'ISOـی تانگەستەنی ستۆدیۆ',
-'exif-lightsource-255' => 'سەرچاوەی دیکە ڕووناکی',
-
-# Flash modes
-'exif-flash-fired-0' => 'Ùلاش کاری نەکرد',
-'exif-flash-fired-1' => 'Ùلاش کاری کرد',
-'exif-flash-return-0' => 'ÙÛ•Ù†Ú©Ø´ÛŽÙ†ÛŒ بینینەوەی گەڕانەوەی ڕووناکی Ùلاش نیە',
-'exif-flash-return-2' => 'گەڕانەوەی ڕووناکی Ùلاش نەبینرایەوە',
-'exif-flash-return-3' => 'گەڕانەوەی ڕووناکی Ùلاش بینرایەوە',
-'exif-flash-mode-1' => 'کارکردنی ناچاریی Ùلاش',
-'exif-flash-mode-2' => 'بەرگری ناچاری Ù„Û• کارکردنی Ùلاش',
-'exif-flash-mode-3' => 'شێوازی خۆکار',
-'exif-flash-function-1' => 'ÙÛ•Ù†Ú©Ø´ÛŽÙ†ÛŒ Ùلاش نیە',
-'exif-flash-redeye-1' => 'شێوازی کەم‌کردنەوەی سوور-چاو',
-
-'exif-focalplaneresolutionunit-2' => 'ئینج',
-
-'exif-sensingmethod-1' => 'دیاری نەکراو',
-'exif-sensingmethod-2' => 'یەک چیپی هەستەوەری بەشی ڕەنگ',
-'exif-sensingmethod-3' => 'دوو چیپی هەستەوەری بەشی ڕەنگ',
-'exif-sensingmethod-4' => 'سێ چیپی هەستەوەری بەشی ڕەنگ',
-'exif-sensingmethod-5' => 'هەستەوەری بەشی ڕەنگی زنجیری',
-'exif-sensingmethod-7' => 'هەستەوەری سێ‌هێڵی',
-'exif-sensingmethod-8' => 'هەستەوەری هێڵی ڕەنگی زنجیری',
-
-'exif-scenetype-1' => 'وێنەیەکی ڕاستەوخۆ وێنەگیراو',
-
-'exif-customrendered-0' => 'پرۆسەی ئاسایی',
-'exif-customrendered-1' => 'پرۆسەی دڵخواز',
-
-'exif-exposuremode-0' => 'بەرچاو خستنی خۆکار',
-'exif-exposuremode-1' => 'بەرچاو خستنی دەستی',
-'exif-exposuremode-2' => 'زنجیرە گرتنی خۆکار',
-
-'exif-whitebalance-0' => 'خۆکار یەکسان‌کردنی سپیایی',
-'exif-whitebalance-1' => 'دەستی یەکسان‌کردنی سپیایی',
-
-'exif-scenecapturetype-0' => 'ستاندارد',
-'exif-scenecapturetype-1' => 'دیمەن',
-'exif-scenecapturetype-2' => 'پۆرترە',
-'exif-scenecapturetype-3' => 'وێنەی شەو',
-
-'exif-gaincontrol-0' => 'هیچ',
-
-'exif-contrast-0' => 'ئاسایی',
-'exif-contrast-1' => 'نەرم',
-'exif-contrast-2' => 'Ú•Û•Ù‚',
-
-'exif-saturation-0' => 'ئاسایی',
-'exif-saturation-1' => 'تێرکردنی کەم',
-'exif-saturation-2' => 'تێرکردنی زۆر',
-
-'exif-sharpness-0' => 'ئاسایی',
-'exif-sharpness-1' => 'نەرم',
-'exif-sharpness-2' => 'Ú•Û•Ù‚',
-
-'exif-subjectdistancerange-0' => 'نەزانراو',
-'exif-subjectdistancerange-1' => 'گەورە',
-'exif-subjectdistancerange-2' => 'دیمەنی نزیک',
-'exif-subjectdistancerange-3' => 'دیمەنی دوور',
-
-# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-'exif-gpslatitude-n' => 'پانیی جوگراÙیایی باکوور',
-'exif-gpslatitude-s' => 'پانیی جوگراÙیایی باشوور',
-
-# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
-'exif-gpslongitude-e' => 'پانیی جوگراÙیایی ڕۆژهەڵات',
-'exif-gpslongitude-w' => 'پانیی جوگراÙیایی ڕۆژئاوا',
-
-# Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'کیلۆمەتر هەر کاتژمێر',
-'exif-gpsspeed-m' => 'مایل هەر کاتژمێر',
-
-# External editor support
-'edit-externally' => 'دەستکاری ئەم پەڕەیە بکە بە بەکارهێنانی پڕۆگرامێکی دەرەکی',
-'edit-externally-help' => '(بۆ زانیاریی زیاتر سەیری [http://www.mediawiki.org/wiki/Manual:External_editors ڕێنماییەکانی دامەزراندن] بکە)',
-
-# 'all' in various places, this might be different for inflected languages
-'recentchangesall' => 'ھەموو',
-'imagelistall' => 'ھەموو',
-'watchlistall2' => 'ھەموو',
-'namespacesall' => 'ھەموو',
-'monthsall' => 'ھەموو',
-
-# E-mail address confirmation
-'confirmemail' => 'بڕواپێ‌کردنی ناونیشانی ئی‌مەیل',
-'confirmemail_noemail' => 'لە [[Special:Preferences|هەڵبژاردەکانی بەکارهێنەر]] ناونیشانی ئی‌مەیلی گونجاوت دیاری نەکردووە.',
-'confirmemail_text' => '{{SITENAME}} بە پێویستی دەزانێ پێش کەڵک وەرگرتن لە تایبەتمەندیەکانی ئی‌مەیل، ناونیشانی ئی‌مەیلی خۆت ڕاچاو بکەیت.
-ئەو دوکمەی خوارەوە چالاک بکە تاکوو ئی‌مەیلێکی بڕوا پێ‌کردن بنێردرێت بۆ ناونیشانی ئی‌مەیلەکەت.
-ئەو ئی‌مەیلە بەستەرەکی تێدایە؛ لە وێبگەڕەکەت ئەو بەستەرە ببینە تاکوو ناونیشانی ئی‌مەیلەکەت بڕوادار بێت.',
-'confirmemail_pending' => 'کۆدی بڕواپێ‌کردن لە پێش‌دا ئی‌مەیل کراوە بۆت.
-ئەگەر بە تازەیی هەژمارەت درووست‌کردووە، لەوانەیە باشتربێت چەن خۆلکێک بوەستی بۆ گەیشتنی ئەو ئەمەیلی، پێش دیسان داواکردنەوەی کۆدی نوێ.',
-'confirmemail_send' => 'ئی‌مەیل‌کردنی کۆدی بڕواپێ‌کردن',
-'confirmemail_sent' => 'ئی‌مەیلی بڕواپێ‌کردن ناردرا.',
-'confirmemail_oncreate' => 'کۆدی بڕواپێ‌کردنی ناردرا بۆ ناونیشانی ئی‌مەیلت.
-پێویست نیە بڕۆیتە ژوورەوە، تەنها پێویستە پێش کەڵک وەرگرتن لە تایبەتمەندیەکان ئی‌مەیلیی ویکی ئەوە جێبەجێ بکەیت.',
-'confirmemail_sendfailed' => '{{SITENAME}} ناتوانێ ئی‌مەیلی برواکردن بنێرێت بۆ تۆ.
-تکایە ئەرخەیان بە هەموو پیتەکانی ناونیشانەکەت گونجاوە.
-
-مەیلکەر ئەوەی گەڕاندەوە: $1',
-'confirmemail_invalid' => 'کۆدی بڕواپێ‌کردنی نەگونجاو.
-لەوانەیە ئەو کۆدە ماوەی بەسەر چووبێت.',
-'confirmemail_needlogin' => 'بۆ بڕواپێ‌کردنی ناونیشانی ئی‌مەیلەکەت، دەبێ $1.',
-'confirmemail_success' => 'ناونیشانی ئی‌میلەکەت بڕوای‌پێ‌کرا.
-ئێستە دەتوانی [[Special:UserLogin|بڕۆیتە ژوورەوە]] و لە ویکی کەڵک بگری.',
-'confirmemail_loggedin' => 'ناونیشانی ئی‌مەیلەکەت ئێستا بڕوای پێ‌کرا.',
-'confirmemail_error' => 'کێشەیەک هەیە لە پاشەکەوت‌کردنی بڕواپێ‌کردنی تۆدا.',
-'confirmemail_subject' => 'بڕوا پێ‌کردنی ناونیشانی ئی‌مەیلی {{SITENAME}}',
-'confirmemail_body' => 'کەسێک، لەوانەیە خۆت، لە ناونیشانی ئای‌پی $1،
-لە {{SITENAME}} بەم ناونیشانی ئی‌مەیلە، هەژمارەیەکی تۆمارکردووە "$2" .
-
-بۆ ئەوەی بڕا بکرێت کە ئەم هەژمارە لە ڕاستیدا بۆتۆیە و بۆ چالاک‌کردنی تایبەتمەندیەکانی ئی‌مەیل لە {{SITENAME}}دا، ئەو بەستەرەی خوارەوە لە وێبگەڕەکەت‌دا بکەوە:
-
-$3
-
-ئەگەر تۆ ئەو هەژمارەت تۆمار *نەکردووە*، بۆ هەڵوەشاندنەوەی بڕوا‌پێ‌کردنی ناونیشانی ئی‌مەیل بڕۆ بۆ ئەم بەستەرە:
-
-$5
-
-ئەم کۆدی بڕواپێ‌کردنە لە $4 ماوەی بەسەردێت.',
-'confirmemail_invalidated' => 'بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە',
-'invalidateemail' => 'هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل',
-
-# Scary transclusion
-'scarytranscludetoolong' => '[URL زۆر درێژە]',
-
-# Trackbacks
-'trackbackremove' => '([سڕینەوە $1])',
-
-# Delete conflict
-'recreate' => 'درووست‌کردنەوە',
-
-# action=purge
-'confirm_purge_button' => 'باشە',
-
-# Separators for various lists, etc.
-'semicolon-separator' => 'Ø›&#32;',
-'comma-separator' => '،&#32;',
-
-# Multipage image navigation
-'imgmultipageprev' => '↠پەڕەی پێشوو',
-'imgmultipagenext' => 'پەڕەی داهاتوو →',
-'imgmultigo' => 'بڕۆ!',
-'imgmultigoto' => 'بڕۆ بۆ پەڕەی $1',
-
-# Table pager
-'table_pager_next' => 'پەڕەی داهاتوو',
-'table_pager_prev' => 'پەڕەی پێشوو',
-'table_pager_first' => 'پەرەی یەکەم',
-'table_pager_last' => 'دوا پەڕە',
-'table_pager_limit' => '$1 دانە پیشان بدە بۆ هەر پەڕەیەک',
-'table_pager_limit_submit' => 'بڕۆ',
-'table_pager_empty' => 'هیچ ئەنجامێک نییە',
-
-# Auto-summaries
-'autosumm-blank' => 'پەڕەکەی واڵا کردەوە',
-'autoredircomment' => 'ڕەوانە کرا بۆ [[$1]]',
-'autosumm-new' => "پەڕەیەک دروست کرا بە '$1'",
-
-# Size units
-'size-bytes' => '$1 بایت',
-'size-kilobytes' => '$1 کیلۆبایت',
-'size-megabytes' => '$1 مێگابایت',
-
-# Live preview
-'livepreview-loading' => 'له‌باركردنایه‌ ...',
-'livepreview-ready' => 'ئاماده‌یه‌',
-
-# Friendlier slave lag warnings
-'lag-warn-normal' => 'گۆڕانکاریەکانی نوێ‌تر لە $1 {{PLURAL:$1|چرکە|چرکە}} لەوانەیە لەم لیستەدا نیشان نەدرێن.',
-'lag-warn-high' => 'لەبەر زۆر دواکەوتنی ڕاژەکاری بنکەدراو، گۆڕانکاریەکانی نوێ‌تر لە $1 {{PLURAL:$1|چرکە|چرکە}} لەوانەیە لەم لیستەدا نیشان نەدرێن.',
-
-# Watchlist editor
-'watchlistedit-numitems' => 'بێجگە لە پەڕەی وتووێژەکان، لیستی چاودێڕییەکانت {{PLURAL:$1|1 بابەت|$1 بابەت}}ی تێدایە،',
-'watchlistedit-noitems' => 'لیستی چاودێڕییەکانت ھیچ بابەتێکی تێدا نییە.',
-'watchlistedit-normal-title' => 'دە‌ستکاری لیستی چاودێری',
-'watchlistedit-normal-legend' => 'لابردنی سەردێڕەکان لە لیستی چاودێری',
-'watchlistedit-normal-explain' => 'سەردێڕی بڕگەکانی لیستی چاودێریەکەت لە خوارەوە نیشان‌دراون.<br />
-بۆ لابردنی هەرکام، چوارچێوەی بەرامبەری نیشان بکە و کرتە بکە سەر لابردنی سەردێڕەکان.<br />
-هەروا دەتوانی [[Special:Watchlist/raw|دەستکاری لیستی خاو]]بکەیت.',
-'watchlistedit-normal-submit' => 'ناونیشانەکان لاببە',
-'watchlistedit-normal-done' => '{{PLURAL:$1|1 سەردێڕ |$1 سەردێڕ}} لە لیستی چاودێریت سڕایەوە:',
-'watchlistedit-raw-title' => 'دەستکاری لیستی خاوی چاودێری',
-'watchlistedit-raw-legend' => 'دەستکاری لیستی خاوی چاودێری',
-'watchlistedit-raw-explain' => 'سەردێڕی بەڕگەکانی لیستی چاودێریەکەت لە خوارەوە نیشان‌دراون و دەتوانی بە زیادکردن و لابردن دەستکاری بکەیت؛<br />
-هەر هێڵێک، سەردێڕێک.<br />
-کاتێ تەواوت‌کرد، کرتە بکە سەر نوێ‌کردنەوەی لیستی چاودێری.<br />
-هەروا دەتوانی لە [[Special:Watchlist/edit|دەستکاریکەری ستاندارد]] کەڵک‌وەرگریت.',
-'watchlistedit-raw-titles' => 'ناونیشانەکان:',
-'watchlistedit-raw-submit' => 'نوێکردنەوەی لیستی چاودێری',
-'watchlistedit-raw-done' => 'لیستی چاودێریەکەت نوێ‌کرایەوە',
-'watchlistedit-raw-added' => '{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} زیادکرا:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} لابرا:',
-
-# Watchlist editing tools
-'watchlisttools-view' => 'دیتنی گۆڕانکارییە پەیوەندیدارەکان',
-'watchlisttools-edit' => 'بینین و دەستکاری کردنی لیستی چاودێڕییەکان',
-'watchlisttools-raw' => 'دەستکاری کردنی لیستی خامی چاودێڕییەکان',
-
-# Iranian month names
-'iranian-calendar-m1' => 'خاکەلێوە',
-'iranian-calendar-m2' => 'گوڵان',
-'iranian-calendar-m3' => 'جۆزەردان',
-'iranian-calendar-m4' => 'پووشپەڕ',
-'iranian-calendar-m5' => 'گەلاوێژ',
-'iranian-calendar-m6' => 'خەرمانان',
-
-# Core parser functions
-'unknown_extension_tag' => 'تاگی درێژکراوەی نەناسراو "$1"',
-
-# Special:Version
-'version' => 'وەشان',
-'version-extensions' => 'پێوەکراوە دامەزراوەکان',
-'version-specialpages' => 'پەڕە تایبەتەکان',
-'version-parserhooks' => 'قولاپە لێککەرەکان',
-'version-variables' => 'گۆڕاوەکان',
-'version-other' => 'ھی دیکە',
-'version-mediahandlers' => 'بایەخ‌دەرانی مێدیا',
-'version-hooks' => 'قولاپەکان',
-'version-extension-functions' => 'Ùەنکشێنەکانی درێژەکراو',
-'version-parser-extensiontags' => 'تاگەکانی درێژکراوی لێککەرەوە',
-'version-parser-function-hooks' => 'قولاپەکانی ÙÛ•Ù†Ú©Ø´ÛŽÙ†ÛŒ لێککەرەوە',
-'version-skin-extension-functions' => 'Ùەنکشێنەکانی درێژکراوی ڕووبەرگ',
-'version-hook-name' => 'ناوی قولاپ',
-'version-hook-subscribedby' => 'بەشداربوو لە لایەن',
-'version-version' => '(وەشانی $1)',
-'version-license' => 'مۆڵەت',
-'version-software' => 'نەرمەکاڵای دامەزراو',
-'version-software-product' => 'بەرهەم',
-'version-software-version' => 'وەشان',
-
-# Special:FilePath
-'filepath' => 'ڕێڕەوی پەڕگە',
-'filepath-page' => 'Ù¾Û•Ú•Ú¯Û•:',
-'filepath-submit' => 'بڕۆ',
-'filepath-summary' => 'ئەم لاپەڕە تایبەتە ڕێڕەوی تەواو بۆ پەڕگەیەک دەگەڕێنێتەوە.
-وێنەکان لە قەبارەی تەواو‌دا نیشان‌ دەدرێن و جۆرە پەڕگەکانی دیکە بە پڕۆگرامی هاوپەیوەندی خۆی ڕاستەوخۆ دەست‌پێ‌دەکات.
-
-ناوی پەڕگەکە بێ پێشگری "{{ns:file}}" بنووسە.',
-
-# Special:FileDuplicateSearch
-'fileduplicatesearch' => 'گەڕان بۆ پەڕگە دووپات کراوەکان',
-'fileduplicatesearch-summary' => 'گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.
-
-ناوی پەڕگەکە بێ پێشگری "{{ns:file}}" بنووسە.',
-'fileduplicatesearch-legend' => 'گەڕان بۆ دووبارەکردنێک',
-'fileduplicatesearch-filename' => 'ناوی پەرگە:',
-'fileduplicatesearch-submit' => 'گەڕان',
-'fileduplicatesearch-info' => '$1 × $2 پیکسەل<br />قەبارەی پەڕگە: $3<br />MIME جۆری: $4',
-'fileduplicatesearch-result-1' => 'پەڕگەی "$1" دووپاتکراوەیەکی کوتوموتی نییە.',
-'fileduplicatesearch-result-n' => 'پەڕگەی «$1» {{PLURAL:$2|١ دووپاتکراوەی کوتوموتی|$2 دووپاتکراوەی کوتوموتی}} ھەیە.',
-
-# Special:SpecialPages
-'specialpages' => 'پەڕە تایبەتەکان',
-'specialpages-note' => '----
-* لاپەڕە تایبەتە ئاساییەکان
-* <strong class="mw-specialpagerestricted">لاپەڕە تایبەتە بەربەست‌کراوەکان.</strong>',
-'specialpages-group-maintenance' => 'ڕاپۆرتەکانی چاکسازی',
-'specialpages-group-other' => 'پەڕە تایبەتەکانی دیکە',
-'specialpages-group-login' => 'چوونە ژوورەوە/ناونووسین',
-'specialpages-group-changes' => 'دوایین گۆڕانکارییەکان و ڕەشنووسەکان',
-'specialpages-group-media' => 'گوزارشتەکان و بارکردنەکانی مێدیا',
-'specialpages-group-users' => 'بەکارھێنەران Ùˆ ماÙەکان',
-'specialpages-group-highuse' => 'پەڕە زۆر بەکار ھێنراوەکان',
-'specialpages-group-pages' => 'لیستەکانی پەڕەکان',
-'specialpages-group-pagetools' => 'ئامرازەکانی پەڕە',
-'specialpages-group-wiki' => 'داتا و ئامرازەکانی ویکی',
-'specialpages-group-redirects' => 'پەڕە تایبەتەکانی رەوانکردنەوە',
-'specialpages-group-spam' => 'ئامرازەکانی سپەم',
-
-# Special:BlankPage
-'blankpage' => 'پەڕەی واڵا',
-'intentionallyblankpage' => 'ئەم لاپەڕە بەقەستی بەتاڵ هێڵراوەتەوە',
-
-# Special:Tags
-'tags' => 'گۆڕانکاری گونجاوی تاگەکان',
-'tag-filter' => 'پاڵێوی [[Special:Tags|تاگ]]:',
-'tag-filter-submit' => 'پاڵاوتن',
-'tags-title' => 'تاگەکان',
-'tags-intro' => 'ئەم لاپەڕە ئەو تاگانەی لیست دەکات کە لەوانەیە نەرمامێر دەستکاریەکی بۆ نیشان بکات و مەبەستی نیشان بدات.',
-'tags-tag' => 'ناوی تاگ',
-'tags-display-header' => 'دیمەن لەسەر لیستەکانی گۆڕان',
-'tags-description-header' => 'پێناسەی تەواوی مەبەست',
-'tags-hitcount-header' => 'گۆڕانکاریە تاگ‌کراوەکان',
-'tags-edit' => 'دەستکاری',
-'tags-hitcount' => '$1 {{PLURAL:$1|گۆڕان|گۆڕانکاری}}',
-
-# Database error messages
-'dberr-header' => 'ئەم ویکی‌یە کێشەی هەیە',
-'dberr-problems' => 'ببورە! ئەم ماڵپەڕە ئێستا خەریک ئەزموونێکی کێشەی تەکنیکیە.',
-'dberr-again' => 'چەن خولک ڕاوەستە و نوێی بکەوە.',
-'dberr-info' => '(پەیوەندی دەگەڵ ڕاژەکاری بنکەدراو پێک‌نایەت: $1)',
-'dberr-usegoogle' => 'دەتوانی هاوکات هەوڵی گەڕان بە گووگڵ بدەیت.',
-'dberr-outofdate' => 'لەیادت بێ لەوانەیە پێرستەکەیان سەبارەت نە ناوەڕۆک ئەم ماڵپەڕە ماوە بەسەرچوو بێت.',
-'dberr-cachederror' => 'ئەمە ڕوونووسێکی کاش‌کراوی لاپەڕەی داواکراوە و لەوانەیە بەڕۆژ نەبێت.',
-
-# HTML forms
-'htmlform-invalid-input' => 'هێندێ کێشە هەیە لە بڕێک لە ناودراوەکانت',
-'htmlform-select-badoption' => 'ئەو نرخەی دیاریت‌کردووە هەڵبژاردەیەکی گونجاو نیە.',
-'htmlform-int-invalid' => 'ئەو نرخەی دیاریت‌کردووه ژمارەیەکی تەواو نیە.',
-'htmlform-float-invalid' => 'ئەو نرخەی دیاریت‌کردووه ژمارە نیە.',
-'htmlform-int-toolow' => 'ئەو نرخەی دیاریت‌کردووه کەمترە لە ئەمپەڕی $1.',
-'htmlform-int-toohigh' => 'ئەو نرخەی دیاریت‌کردووه زیاترە لە ئەوپەڕی $1.',
-'htmlform-submit' => 'ناردن',
-'htmlform-reset' => 'پووچەڵکردنەوەی دەستکارییەکان',
-'htmlform-selectorother-other' => 'دیکە',
-
-);
diff --git a/languages/messages/MessagesCo.php b/languages/messages/MessagesCo.php
index fabd455a..74a3290c 100644
--- a/languages/messages/MessagesCo.php
+++ b/languages/messages/MessagesCo.php
@@ -349,11 +349,10 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
'emailsend' => 'Invià',
# Watchlist
-'watchlist' => 'Articuli seguitati',
-'mywatchlist' => 'Articuli seguitati',
-'watchlistfor' => "(di l'ultizatore '''$1''')",
-'addedwatch' => "Aghjuntu à u listinu di l'articuli seguitati",
-'watch' => 'Seguità',
+'watchlist' => 'Articuli seguitati',
+'mywatchlist' => 'Articuli seguitati',
+'addedwatch' => "Aghjuntu à u listinu di l'articuli seguitati",
+'watch' => 'Seguità',
'enotif_reset' => 'Marcà tutte e pagine visitate',
'enotif_newpagetext' => 'Ista hè una pagina nova.',
@@ -463,7 +462,7 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
'tooltip-ca-nstab-user' => 'Vede a pagina di utilizatore',
# Attribution
-'anonymous' => 'Utilizatore(/i) anonimu(/i) di {{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|Utilizatore anonimu|Utilizatori anonimi}} di {{SITENAME}}',
'others' => 'altri',
# Math errors
diff --git a/languages/messages/MessagesCps.php b/languages/messages/MessagesCps.php
index 29693c63..a8bfc3d6 100644
--- a/languages/messages/MessagesCps.php
+++ b/languages/messages/MessagesCps.php
@@ -28,8 +28,7 @@ $messages = array(
'tog-editsection' => 'Pasugtan ang pagilis sang mga seksyon pamaagi sa mga [ilis] nga link',
'tog-editsectiononrightclick' => 'Pasugtan ang pag-ilis sang mga bahin pama-agi sa tu-o nga pagpindot sa mga titulo sang pahina {kinanglan ang JavaScript}',
'tog-showtoc' => 'Ipakita ang listahan sang mga kaundan (sa mga pahina nga may madamu pa sa 3 ka titulo)',
-'tog-rememberpassword' => 'Dumdumon ang akon pagsulod sa mini nga kompyuter',
-'tog-editwidth' => 'Palapadun ang kahon sang pang-ilis para masudlan ang bilog nga screen',
+'tog-rememberpassword' => 'Dumdumon ang akon pagsulod sa mini nga kompyuter (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Idugang sa akon balantayan ang mga pahina nga gin-ubra ko.',
'tog-watchdefault' => 'Idugang sa akon balantayan ang mga pahina nga akon na-islan',
'tog-watchmoves' => 'Idugang sa akon balantayan ang mga pahina nga akon ginsaylo',
@@ -174,31 +173,20 @@ $messages = array(
'faqpage' => "Project:Mga perme napamangkot (''FAQ'')",
# Vector skin
-'vector-action-addsection' => 'Magdugang sang topiko',
-'vector-action-delete' => 'Panason',
-'vector-action-move' => 'Isdogon',
-'vector-action-protect' => 'Protektahan',
-'vector-action-undelete' => 'Indi pag panason',
-'vector-action-unprotect' => 'Indi pag protektahan',
-'vector-namespace-category' => 'Kategorya',
-'vector-namespace-help' => 'Pahina sang pagtabang',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pahina',
-'vector-namespace-media' => 'Pahina sang midya',
-'vector-namespace-mediawiki' => 'Mensahe',
-'vector-namespace-project' => 'Pahina sang proyekto',
-'vector-namespace-special' => 'Pinasahi nga pahina',
-'vector-namespace-talk' => 'Diskusyon',
-'vector-namespace-template' => 'Templeyt',
-'vector-namespace-user' => 'Pahina sang manug-usar',
-'vector-view-create' => 'Mag-ubra',
-'vector-view-edit' => 'Liwaton',
-'vector-view-history' => 'Ipakita ang kasaysayan',
-'vector-view-view' => 'Basahon',
-'vector-view-viewsource' => 'Lantawon ang ginhalinan',
-'actions' => 'Mga aksyon',
-'namespaces' => 'Espasyo sang pangalan',
-'variants' => 'Mga variant',
+'vector-action-addsection' => 'Magdugang sang topiko',
+'vector-action-delete' => 'Panason',
+'vector-action-move' => 'Isdogon',
+'vector-action-protect' => 'Protektahan',
+'vector-action-undelete' => 'Indi pag panason',
+'vector-action-unprotect' => 'Indi pag protektahan',
+'vector-view-create' => 'Mag-ubra',
+'vector-view-edit' => 'Liwaton',
+'vector-view-history' => 'Ipakita ang kasaysayan',
+'vector-view-view' => 'Basahon',
+'vector-view-viewsource' => 'Lantawon ang ginhalinan',
+'actions' => 'Mga aksyon',
+'namespaces' => 'Espasyo sang pangalan',
+'variants' => 'Mga variant',
'errorpagetitle' => 'Sala/Error',
'returnto' => 'Balik sa $1.',
@@ -408,7 +396,7 @@ Indi pagkalimtan nga islan ang imo [[Special:Preferences|mga uyon mo sa {{SITENA
'yourname' => 'Hayo (username):',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Liwata ka pindot ang password:',
-'remembermypassword' => 'Dumduma ang pagsulod ko sa mini nga kompyuter',
+'remembermypassword' => 'Dumduma ang pagsulod ko sa mini nga kompyuter (pinakadamu na ang $1 {{PLURAL:$1|adlaw|mga adlaw}})',
'yourdomainname' => 'Imo domain:',
'login' => 'Mag sulod',
'nav-login-createaccount' => 'Magsulod / maghimo account',
@@ -684,7 +672,6 @@ Mga Pahina sa [[Special:Watchlist|imo watchlist]] '''madukot'''.",
# Watchlist
'watchlist' => 'Mga akon ginabantayan',
'mywatchlist' => 'Akon ginabantayan',
-'watchlistfor' => "(para sa '''$1''')",
'addedwatch' => 'Gindugang sa lista sang ginabantayan',
'addedwatchtext' => "Ang pahina nga \"[[:\$1]]\" gindugang na sa imo [[Special:Watchlist|ginabantayan]].
Ang mga pagbag-o sa buwas-damlag kag mga kaangot nga pahina sang istoryahanay pagalistahon diya, kag ang pahina maggwa nga '''madukot''' sa [[Special:RecentChanges|lista sang mga nagligad nga pagbag-o]] para mas mahapos makita.",
@@ -898,9 +885,9 @@ Ginapasugtan sa pagdugang sang rason sa kabilugan.',
'nextdiff' => 'Mas bag-o nga gin-islan →',
# Media information
-'file-info-size' => '($1 × $2 piksel, kadakuon sang file: $3, klase sang MIME: $4)',
+'file-info-size' => '$1 × $2 piksel, kadakuon sang file: $3, klase sang MIME: $4',
'file-nohires' => '<small>Wala na sang mas mataas pa nga resolusyon (katin-aw).</small>',
-'svg-long-desc' => '(SVG file, nga ara sa $1 × $2 ka piksels, kadakuon sang file: $3)',
+'svg-long-desc' => 'SVG file, nga ara sa $1 × $2 ka piksels, kadakuon sang file: $3',
'show-big-image' => 'Bilog nga resolusyon (katin-aw)',
'show-big-image-thumb' => '<small>Kadakuon sang mini nga prebyu: $1 × $2 piksels</small>',
diff --git a/languages/messages/MessagesCrh_cyrl.php b/languages/messages/MessagesCrh_cyrl.php
index 2791e41d..e53903e1 100644
--- a/languages/messages/MessagesCrh_cyrl.php
+++ b/languages/messages/MessagesCrh_cyrl.php
@@ -17,7 +17,7 @@ $fallback = 'ru';
$fallback8bitEncoding = 'windows-1251';
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zâçğıñöşüа-Ñё“»]+)(.*)$/sDu';
@@ -119,8 +119,7 @@ $messages = array(
'tog-editsection' => 'Болюклерни [денъиштир] багълантыларны иле денъиштирме акъкъы бер',
'tog-editsectiononrightclick' => 'Болюк ÑерлеваÑына онъ баÑып болюкте денъишикликке рухÑет бер. (JavaScript)',
'tog-showtoc' => 'Мундеридже джедвели коÑьтер (3 данеден зиÑде ÑерлеваÑÑ‹ олгъан Ñаифелер ичюн)',
-'tog-rememberpassword' => 'Парольни хатырла',
-'tog-editwidth' => 'Язув пенджереÑини бутюн Ñкранны толдураджакъ шекильде кенишлет',
+'tog-rememberpassword' => 'Киришимни бу браузерде хатырла (Ñнъ чокъ $1 {{PLURAL:$1|кунь|кунь}} ичюн)',
'tog-watchcreations' => 'Мен Ñраткъан Ñаифелерни козетюв джедвелиме кирÑет',
'tog-watchdefault' => 'Мен денъиштирген Ñаифелерни козетюв джедвелиме кирÑет',
'tog-watchmoves' => 'Меним тарафымдан ады денъиштирильген Ñаифелерни козетюв джедвелиме кирÑет',
@@ -266,31 +265,21 @@ $messages = array(
'faqpage' => 'Project:Сыкъ берильген Ñуаллер',
# Vector skin
-'vector-action-addsection' => 'Мевзу къош',
-'vector-action-delete' => 'Ðкъ ÑÑ‚',
-'vector-action-move' => 'Ðдыны денъиштир',
-'vector-action-protect' => 'Къорчала',
-'vector-action-undelete' => 'Янъыдан Ñрат',
-'vector-action-unprotect' => 'Къорчалавны чыкъар',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Ярдым ÑаифеÑи',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Саифе',
-'vector-namespace-media' => 'Медиа ÑаифеÑи',
-'vector-namespace-mediawiki' => 'БеÑнат',
-'vector-namespace-project' => 'Лейха ÑаифеÑи',
-'vector-namespace-special' => 'МахÑÑƒÑ Ñаифе',
-'vector-namespace-talk' => 'Музакере',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Къулланыджы ÑаифеÑи',
-'vector-view-create' => 'Ярат',
-'vector-view-edit' => 'Денъиштир',
-'vector-view-history' => 'Кечмишини коÑьтер',
-'vector-view-view' => 'Окъу',
-'vector-view-viewsource' => 'Менба кодуны коÑьтер',
-'actions' => 'Ðрекетлер',
-'namespaces' => 'ИÑим фезалары',
-'variants' => 'Вариантлар',
+'vector-action-addsection' => 'Мевзу къош',
+'vector-action-delete' => 'Ðкъ ÑÑ‚',
+'vector-action-move' => 'Ðдыны денъиштир',
+'vector-action-protect' => 'Къорчала',
+'vector-action-undelete' => 'Янъыдан Ñрат',
+'vector-action-unprotect' => 'Къорчалавны чыкъар',
+'vector-simplesearch-preference' => 'ТафÑилÑтлы къыдырув теклифлерини ишлет (тек Вектор реÑимлемеÑи ичюн)',
+'vector-view-create' => 'Ярат',
+'vector-view-edit' => 'Денъиштир',
+'vector-view-history' => 'Кечмишини коÑьтер',
+'vector-view-view' => 'Окъу',
+'vector-view-viewsource' => 'Менба кодуны коÑьтер',
+'actions' => 'Ðрекетлер',
+'namespaces' => 'ИÑим фезалары',
+'variants' => 'Вариантлар',
'errorpagetitle' => 'Хата',
'returnto' => '$1.',
@@ -349,6 +338,8 @@ $messages = array(
'view-pool-error' => 'Ðфу Ñтинъиз, Ñервер шимди адден-ашыр юкленди. Пек чокъ къулланыджы бу Ñаифени ачмагъа тырыша. Лютфен, бу Ñаифени бир даа ачмакътан Ñвель бираз бекленъиз.
$1',
+'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).
'aboutsite' => '{{SITENAME}} акъкъында',
@@ -508,7 +499,8 @@ $2',
'yourname' => 'Къулланыджы адынъыз',
'yourpassword' => 'Паролинъиз',
'yourpasswordagain' => 'Парольни бир даа Ñзынъыз:',
-'remembermypassword' => 'Бу компьютерде мени хатырла',
+'remembermypassword' => 'Киришимни бу компьютерде хатырла (Ñнъ чокъ $1 {{PLURAL:$1|кунь|кунь}} ичюн)',
+'securelogin-stick-https' => 'Кирген Ñонъ HTTPS-ге багъланып тур',
'yourdomainname' => 'Домен адынъыз',
'externaldberror' => 'Отурымынъыз ачылгъанда бир хата олды. Бу тыш ÑÑабынъызгъа денъишиклик Ñпмагъа акъкъынъыз олмаювындан мейдангъа келип ола.',
'login' => 'Кириш',
@@ -525,6 +517,7 @@ $2',
'gotaccount' => "Даа Ñвель ÑÑап ачкъан Ñдинъизми? '''$1'''.",
'gotaccountlink' => 'Отурым ачынъыз',
'createaccountmail' => 'e-mail ваÑтаÑынен',
+'createaccountreason' => 'Себеп:',
'badretype' => 'КирÑеткен пароллеринъиз айны дегиль.',
'userexists' => 'КирÑеткен къулланыджы адынъыз Ñнди къулланыла.
Башкъа бир къулланыджы ады Ñайланъыз.',
@@ -630,9 +623,10 @@ $2 къулланыджыÑына вакътынджа <code>$3</code> пароÐ
'showlivepreview' => 'Тез бакъып чыкъув',
'showdiff' => 'Денъишикликлерни коÑьтер',
'anoneditwarning' => "'''Дикъкъат''': Отурым ачмагъанынъыздан Ñебеп денъишиклик тарихына Ñизинъ IP адреÑинъиз Ñзылыр.",
+'anonpreviewwarning' => 'Отурым ачмадынъыз. Саифени ÑакълаÑанъыз, денъишиклик тарихына Ñизинъ IP адреÑинъиз Ñзылыр.',
'missingsummary' => "'''Хатырлатма.''' Денъиштирмелеринъизни къыÑкъадан тариф Ñтмединъиз. «Саифени Ñакъла» дёгмеÑине текрар баÑув иле денъиштирмелеринъиз тефÑирÑиз Ñакъланаджакълар.",
'missingcommenttext' => 'Лютфен, ашагъыда тефÑир Ñзынъыз.',
-'missingcommentheader' => "'''Хатырлатма:''' ТефÑир ÑерлеваÑыны Ñзмадынъыз. «Саифени Ñакъла» дёгмеÑине текрар баÑкъан Ñонъ тефÑиринъиз ÑерлеваÑыз Ñакъланыр.",
+'missingcommentheader' => "'''Хатырлатма:''' ТефÑир мевзуÑыны/ÑерлеваÑыны Ñзмадынъыз. «{{int:savearticle}}» дёгмеÑине текрар баÑкъан Ñонъ тефÑиринъиз ÑерлеваÑыз Ñакъланыр.",
'summary-preview' => 'Бакъып чыкъув таÑвири:',
'subject-preview' => 'Бакъып чыкъув ÑерлеваÑÑ‹:',
'blockedtitle' => 'Къулланыджы блок Ñтильди.',
@@ -695,7 +689,7 @@ $2 къулланыджыÑына вакътынджа <code>$3</code> пароÐ
'userjsyoucanpreview' => "'''ТевÑие:''' Янъы JavaScript-инъизни тешкермек ичюн Ñаифени Ñакъламаздан Ñвель «{{int:showpreview}}» дёгмеÑине баÑынъыз.",
'usercsspreview' => "'''Унутманъыз, бу тек бакъып чыкъув - къулланыджы CSS файлынъыз Ð°Ð»Ñ Ð´Ð°Ð° Ñакъланмады!'''",
'userjspreview' => "'''Унутманъыз, Ñиз шимди тек теÑÑ‚ ÑтеÑинъиз Ñ Ð´Ð° бакъып чыкъув кореÑинъиз - къулланыджы JavaScript'и шимдилик Ñакъланмады.'''",
-'userinvalidcssjstitle' => "'''Ихтар:''' \"\$1\" адынен бир тема ёкътыр. тема-ады.css ве .js файлларынынъ адлары кичик афир иле Ñзмакъ керек, Ñни {{ns:user}}:Темель/'''M'''onobook.css дегиль, {{ns:user}}:Темель/'''m'''onobook.css.",
+'userinvalidcssjstitle' => "'''Ихтар:''' \"\$1\" адынен бир тема ёкътыр. тема-ады.css ве .js файлларынынъ адлары кичик афир иле Ñзмакъ керек, Ñни {{ns:user}}:Темель/'''V'''ector.css дегиль, {{ns:user}}:Темель/'''v'''ector.css.",
'updated' => '(Янъарды)',
'note' => "'''Ихтар:'''",
'previewnote' => "'''Бу тек бакъып чыкъув, метин Ð°Ð»Ñ Ð´Ð°Ð° Ñакъланмагъан!'''",
@@ -728,7 +722,6 @@ $2 къулланыджыÑына вакътынджа <code>$3</code> пароÐ
'copyrightwarning2' => "'''Лютфен, дикъкъат:''' {{SITENAME}} Ñайтына Ñиз къошкъан бутюн иÑÑелер башкъа бир къулланыджы тарафындан денъиштирилип Ñ Ð´Ð° ёкъ Ñтилип олур. Къошкъан иÑÑенъизнинъ башкъа инÑанлар тарафындан аджымаÑызджа денъиштирильмеÑини Ñ Ð´Ð° азат тарзда ве ÑынъырÑызджа башкъа ерлерге дагъытылмаÑыны иÑтемеÑенъиз, иÑÑе къошманъыз.<br />
Ðйрыджа, мында иÑÑе къошып, бу иÑÑенинъ озюнъиз тарафындан Ñзылгъанына, Ñ Ð´Ð° джемааткъа ачыкъ бир менбадан Ñ Ð´Ð° башкъа бир азат менбадан копиÑлангъанына Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ñ Ð±ÐµÑ€Ð³ÐµÐ½ олаÑынъыз ($1 бакъынъыз).<br />
'''МУЭЛЛИФЛИК ÐКЪКЪЫÐЕРКЪОРЧÐЛÐÐГЪÐРИЧ БИР МЕТИÐÐИ МЫÐДРРУХСЕТСИЗ КЪОШМÐÐЪЫЗ!'''",
-'longpagewarning' => "'''ТЕÐБИ: Бу Ñаифе $1 килобайт буюклигиндедир; базы браузерлер денъишиклик Ñпкъан вакъытта 32 kb ве уÑÑ‚ÑŽ буюкликлерде проблемалар Ñшап олур. Саифени парчаларгъа айырмагъа тырышынъыз.'''",
'longpageerror' => "'''ТЕÐБИ: Бу Ñаифе $1 килобайт буюклигиндедир. Ðзамий (макÑималь) изинли буюклик иÑе $2 килобайт. Бу Ñаифе Ñакъланып оламаз.'''",
'readonlywarning' => "'''ТЕÐБИ: Бакъым Ñебеби иле малюмат базаÑÑ‹ шимди килитлидир. Бу Ñебептен денъишикликлеринъиз шимди Ñакълап оламаÑынъыз. Язгъанларынъызны башкъа бир Ñдитор программаÑына алып Ñакълап олур ве даа Ñонъ текрар мында кетирип Ñакълап олурÑынъыз'''
@@ -835,11 +828,13 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
# Diffs
'history-title' => '$1 ÑаифеÑининъ денъишиклик тарихы',
'difference' => '(ВерÑиÑлар араÑÑ‹ фаркълар)',
+'difference-multipage' => '(Саифелер араÑындаки фаркъ)',
'lineno' => '$1 Ñатыр:',
'compareselectedversions' => 'Сайлангъан верÑиÑларны тенъештир',
'showhideselectedversions' => 'Сайлангъан верÑиÑларны коÑьтер/гизле',
'editundo' => 'лÑгъу ÑÑ‚',
-'diff-multi' => '({{PLURAL:$1|1 арадаки верÑиÑ|$1 арадаки верÑиÑ}} коÑьтерильмеди.)',
+'diff-multi' => '({{PLURAL:$2|Бир къулланыджы|$2 къулланыджы}}нынъ Ñпкъан {{PLURAL:$1|бир ара верÑиÑÑÑ‹|$1 ара верÑиÑÑÑ‹}} коÑьтерильмей)',
+'diff-multi-manyusers' => '($2-ден зиÑде {{PLURAL:$2|къулланыджы|къулланыджы}}нынъ Ñпкъан {{PLURAL:$1|бир ара верÑиÑÑÑ‹|$1 ара верÑиÑÑÑ‹}} коÑьтерильмей)',
# Search results
'searchresults' => 'Къыдырув нетиджелери',
@@ -1005,7 +1000,9 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'prefs-advancedrendering' => 'ИлÑве Ñазламалар',
'prefs-advancedsearchoptions' => 'ИлÑве Ñазламалар',
'prefs-advancedwatchlist' => 'ИлÑве Ñазламалар',
-'prefs-display' => 'КоÑьтерилюв Ñазламалары',
+'prefs-displayrc' => 'КоÑьтерилюв Ñазламалары',
+'prefs-displaysearchoptions' => 'КоÑьтерилюв Ñазламалары',
+'prefs-displaywatchlist' => 'КоÑьтерилюв Ñазламалары',
'prefs-diffs' => 'Фаркълар',
# User rights
@@ -1054,14 +1051,9 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'recentchanges-legend' => 'Сонъки денъишикликлер Ñазламалары',
'recentchangestext' => 'Япылгъан Ñнъ Ñонъки денъишикликлерни бу Ñаифеде корип олаÑынъыз.',
'recentchanges-feed-description' => 'Бу лента ваÑтаÑынен викиде Ñонъки денъишикликлерни козет.',
-'recentchanges-label-legend' => 'Изаат: $1.',
-'recentchanges-legend-newpage' => '$1 - Ñнъы Ñаифе',
'recentchanges-label-newpage' => 'Бу денъишиклик Ñнъы бир Ñаифе Ñратты',
-'recentchanges-legend-minor' => '$1 - кичик денъишиклик',
'recentchanges-label-minor' => 'Бу кичик бир денъишиклик',
-'recentchanges-legend-bot' => '$1 - бот денъишиклиги',
'recentchanges-label-bot' => 'Бу бир ботнынъ Ñпкъан денъишиклиги',
-'recentchanges-legend-unpatrolled' => '$1 - тешкерильмеген денъишиклик',
'recentchanges-label-unpatrolled' => 'Бу денъишиклик Ð°Ð»Ñ Ð´Ð°Ð° тешкерильмеген',
'rcnote' => "$4 $5 тарихында Ñонъки {{PLURAL:$2|куньде|'''$2''' куньде}} Ñпылгъан '''{{PLURAL:$1|1|$1}}''' денъишиклик:",
'rcnotefrom' => "'''$2''' тарихындан итибарен Ñпылгъан денъишикликлер ашагъыдадыр (Ñнъ чокъ '''$1''' дане Ñаифе коÑьтериле).",
@@ -1168,7 +1160,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
Эгер бу файлны Ñп бир юклемеге иÑтеÑенъиз, кери къайтынъыз ве файл иÑмини денъиштирип Ñнъыдан юкленъиз.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Бу файл ашагъыдаки {{PLURAL:$1|файлнынъ|файлларнынъ}} дубликаты ола:',
-'successfulupload' => 'Юкленюв беджерильди',
'uploadwarning' => 'Тенби',
'savefile' => 'Файлны Ñакъла',
'uploadedimage' => 'Юкленген: "[[$1]]"',
@@ -1187,6 +1178,7 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
Эр алда бу файлны юклемеге девам Ñтмеге иÑтейÑинъизми?
Бу файл ичюн ёкъ Ñтювнинъ журналыны мында бакъып олаÑынъыз:",
'filename-bad-prefix' => "Сиз юклеген файлнынъ ады '''\"\$1\"'''-нен башлана. Бу, адетиндже, ракъамлы фотоаппаратлардан файл адына Ñзылгъан манаÑыз ишаретлердир. Лютфен, бу файл ичюн анълыджа бир ад Ñайлап Ñзынъыз.",
+'upload-success-subj' => 'Юкленюв беджерильди',
'upload-proto-error' => 'Янълыш протокол',
'upload-proto-error-text' => 'Интернеттен бир реÑим файлы юклемеге иÑтеÑенъиз Ð°Ð´Ñ€ÐµÑ <code>http://</code> Ñ Ð´Ð° <code>ftp://</code>нен башламалы.',
@@ -1296,7 +1288,7 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'doubleredirects' => 'Ðлламагъа олгъан ёлламалар',
'doubleredirectstext' => 'Бу Ñаифеде дигер ёллама Ñаифелерине ёлланма олгъан Ñаифелери коÑьтериле.
Эр Ñатырда биринджи ве Ñкинджи ёлламагъа багълантылар да, Ñкинджи ёлламанынъ макъÑат ÑаифеÑи (адетиндже о биринджи ёлламанынъ керекли макъÑады ола) да бар.
-<s>УÑÑ‚ÑŽ Ñызылгъан</s> меÑелелер Ñнди чезильген.',
+<del>УÑÑ‚ÑŽ Ñызылгъан</del> меÑелелер Ñнди чезильген.',
'double-redirect-fixed-move' => '[[$1]] авуштырылды, шимди [[$2]] ÑаифеÑине ёллап тура.',
'brokenredirects' => 'Бар олмагъан Ñаифеге Ñпылгъан ёлламалар',
@@ -1439,7 +1431,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
# Watchlist
'watchlist' => 'Козетюв джедвели',
'mywatchlist' => 'Козетюв джедвелим',
-'watchlistfor' => "('''$1''' ичюн)",
'nowatchlist' => 'Сизинъ козетюв джедвелинъиз боштыр.',
'watchlistanontext' => 'Козетюв джедвелини бакъмакъ Ñ Ð´Ð° денъиштирмек ичюн $1 борджлуÑынъыз.',
'watchnologin' => 'Отурым ачмакъ керек',
@@ -1909,10 +1900,10 @@ MediaWiki интерфейÑининъ чешит тиллерге терджиÐ
'imagemaxsize' => "РеÑим ольчюÑи Ñынъыры:<br />''(файл малюмат Ñаифелери ичюн)''",
'thumbsize' => 'Кичик ольчю:',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|1|$3}} Ñаифе',
-'file-info' => '(файл буюклиги: $1, MIME чешити: $2)',
-'file-info-size' => '($1 × $2 пикÑель, файл буюклиги: $3, MIME чешити: $4)',
+'file-info' => 'файл буюклиги: $1, MIME чешити: $2',
+'file-info-size' => '$1 × $2 пикÑель, файл буюклиги: $3, MIME чешити: $4',
'file-nohires' => '<small>Даа юкÑек чезинирликке Ñаип верÑÐ¸Ñ Ñ‘ÐºÑŠ.</small>',
-'svg-long-desc' => '(SVG файлы, номиналь $1 × $2 пикÑель, файл буюклиги: $3)',
+'svg-long-desc' => 'SVG файлы, номиналь $1 × $2 пикÑель, файл буюклиги: $3',
'show-big-image' => 'Там чезинирлик',
'show-big-image-thumb' => '<small>Бакъып чыкъувда реÑим буюклиги: $1 × $2 пикÑель</small>',
diff --git a/languages/messages/MessagesCrh_latn.php b/languages/messages/MessagesCrh_latn.php
index 3d3bc549..d355c8a8 100644
--- a/languages/messages/MessagesCrh_latn.php
+++ b/languages/messages/MessagesCrh_latn.php
@@ -14,7 +14,7 @@
$fallback8bitEncoding = 'windows-1254';
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$namespaceNames = array(
NS_MEDIA => 'Media',
@@ -116,8 +116,7 @@ $messages = array(
'tog-editsection' => 'Bölüklerni [deñiştir] bağlantılarnı ile deñiştirme aqqı ber',
'tog-editsectiononrightclick' => 'Bölük serlevasına oñ basıp bölükte deñişiklikke ruhset ber. (JavaScript)',
'tog-showtoc' => 'Münderice cedveli köster (3 daneden ziyade serlevası olğan saifeler içün)',
-'tog-rememberpassword' => 'Parolni hatırla',
-'tog-editwidth' => 'Yazuv penceresini bütün ekrannı tolduracaq şekilde kenişlet',
+'tog-rememberpassword' => 'Kirişinmi bu brauzerde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)',
'tog-watchcreations' => 'Men yaratqan saifelerni közetüv cedvelime kirset',
'tog-watchdefault' => 'Men deñiştirgen saifelerni közetüv cedvelime kirset',
'tog-watchmoves' => 'Menim tarafımdan adı deñiştirilgen saifelerni közetüv cedvelime kirset',
@@ -263,31 +262,21 @@ $messages = array(
'faqpage' => 'Project:Sıq berilgen sualler',
# Vector skin
-'vector-action-addsection' => 'Mevzu qoÅŸ',
-'vector-action-delete' => 'Yoq et',
-'vector-action-move' => 'Adını deñiştir',
-'vector-action-protect' => 'Qorçala',
-'vector-action-undelete' => 'Yañıdan yarat',
-'vector-action-unprotect' => 'Qorçalavnı çıqar',
-'vector-namespace-category' => 'Kategoriya',
-'vector-namespace-help' => 'Yardım saifesi',
-'vector-namespace-image' => 'Fayl',
-'vector-namespace-main' => 'Saife',
-'vector-namespace-media' => 'Media saifesi',
-'vector-namespace-mediawiki' => 'Beyanat',
-'vector-namespace-project' => 'Leyha saifesi',
-'vector-namespace-special' => 'Mahsus saife',
-'vector-namespace-talk' => 'Muzakere',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Qullanıcı saifesi',
-'vector-view-create' => 'Yarat',
-'vector-view-edit' => 'Deñiştir',
-'vector-view-history' => 'Keçmişini köster',
-'vector-view-view' => 'Oqu',
-'vector-view-viewsource' => 'Menba kodunı köster',
-'actions' => 'Areketler',
-'namespaces' => 'İsim fezaları',
-'variants' => 'Variantlar',
+'vector-action-addsection' => 'Mevzu qoÅŸ',
+'vector-action-delete' => 'Yoq et',
+'vector-action-move' => 'Adını deñiştir',
+'vector-action-protect' => 'Qorçala',
+'vector-action-undelete' => 'Yañıdan yarat',
+'vector-action-unprotect' => 'Qorçalavnı çıqar',
+'vector-simplesearch-preference' => 'Tafsilâtlı qıdıruv tekliflerini işlet (tek Vektor resimlemesi içün)',
+'vector-view-create' => 'Yarat',
+'vector-view-edit' => 'Deñiştir',
+'vector-view-history' => 'Keçmişini köster',
+'vector-view-view' => 'Oqu',
+'vector-view-viewsource' => 'Menba kodunı köster',
+'actions' => 'Areketler',
+'namespaces' => 'İsim fezaları',
+'variants' => 'Variantlar',
'errorpagetitle' => 'Hata',
'returnto' => '$1.',
@@ -346,6 +335,8 @@ $messages = array(
'view-pool-error' => 'Afu etiñiz, server şimdi adden-aşır yüklendi. Pek çoq qullanıcı bu saifeni açmağa tırışa. Lütfen, bu saifeni bir daa açmaqtan evel biraz bekleñiz.
$1',
+'pool-timeout' => 'Kilit içün vaqıt bitişi beklene',
+'pool-errorunknown' => 'Bilinmegen hata',
# 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}} aqqında',
@@ -505,7 +496,8 @@ Bu saytnıñ [[Special:Preferences|sazlamalarını]] şahsıñızğa köre deñi
'yourname' => 'Qullanıcı adıñız',
'yourpassword' => 'Paroliñiz',
'yourpasswordagain' => 'Parolni bir daa yazıñız:',
-'remembermypassword' => 'Bu kompyuterde meni hatırla',
+'remembermypassword' => 'Kirişimni bu kompyuterde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)',
+'securelogin-stick-https' => 'Kirgen soñ HTTPS-ge bağlanıp tur',
'yourdomainname' => 'Domen adıñız',
'externaldberror' => 'Oturımıñız açılğanda bir hata oldı. Bu tış esabıñızğa deñişiklik yapmağa aqqıñız olmayuvından meydanğa kelip ola.',
'login' => 'KiriÅŸ',
@@ -522,6 +514,7 @@ Bu saytnıñ [[Special:Preferences|sazlamalarını]] şahsıñızğa köre deñi
'gotaccount' => "Daa evel esap açqan ediñizmi? '''$1'''.",
'gotaccountlink' => 'Oturım açıñız',
'createaccountmail' => 'e-mail vastasınen',
+'createaccountreason' => 'Sebep:',
'badretype' => 'Kirsetken parolleriñiz aynı degil.',
'userexists' => 'Kirsetken qullanıcı adıñız endi qullanıla.
Başqa bir qullanıcı adı saylañız.',
@@ -628,9 +621,10 @@ Parоliñizni endi muvafaqiyetnen deñiştirdiñiz ya da yañı bir muvaqqat par
'showlivepreview' => 'Tez baqıp çıquv',
'showdiff' => 'Deñişikliklerni köster',
'anoneditwarning' => "'''Diqqat''': Oturım açmağanıñızdan sebep deñişiklik tarihına siziñ IP adresiñiz yazılır.",
+'anonpreviewwarning' => 'Oturım açmadıñız. Saifeni saqlasañız deñişiklik tarihına siziñ IP adresiñiz yazılır.',
'missingsummary' => "'''Hatırlatma.''' Deñiştirmeleriñizni qısqadan tarif etmediñiz. \"Saifeni saqla\" dögmesine tekrar basuv ile deñiştirmeleriñiz tefsirsiz saqlanacaqlar.",
'missingcommenttext' => 'Lütfen, aşağıda tefsir yazıñız.',
-'missingcommentheader' => "'''Hatırlatma:''' Tefsir serlevasını yazmadıñız. \"Saifeni saqla\" dögmesine tekrar basqan soñ tefsiriñiz serlevasız saqlanır.",
+'missingcommentheader' => "'''Hatırlatma:''' Tefsir mevzusını/serlevasını yazmadıñız. \"{{int:savearticle}}\" dögmesine tekrar basqan soñ tefsiriñiz serlevasız saqlanır.",
'summary-preview' => 'Baqıp çıquv tasviri:',
'subject-preview' => 'Baqıp çıquv serlevası:',
'blockedtitle' => 'Qullanıcı blok etildi.',
@@ -693,7 +687,7 @@ Blok etüv jurnalınıñ soñki yazısı aşağıda kösterilgen:',
'userjsyoucanpreview' => "'''Tevsiye:''' Yañı JavaScript-iñizni teşkermek içün saifeni saqlamazdan evel \"{{int:showpreview}}\" dögmesine basıñız.",
'usercsspreview' => "'''Unutmañız, bu tek baqıp çıquv - qullanıcı CSS faylıñız alâ daa saqlanmadı!'''",
'userjspreview' => "'''Unutmañız, siz şimdi tek test etesiñiz ya da baqıp çıquv köresiñiz - qullanıcı JavaScript'i şimdilik saqlanmadı.'''",
-'userinvalidcssjstitle' => "'''İhtar:''' \"\$1\" adınen bir tema yoqtır. tema-adı.css ve .js fayllarınıñ adları kiçik afir ile yazmaq kerek, yani {{ns:user}}:Temel/'''M'''onobook.css degil, {{ns:user}}:Temel/'''m'''onobook.css.",
+'userinvalidcssjstitle' => "'''İhtar:''' \"\$1\" adınen bir tema yoqtır. tema-adı.css ve .js fayllarınıñ adları kiçik afir ile yazmaq kerek, yani {{ns:user}}:Temel/'''V'''ector.css degil, {{ns:user}}:Temel/'''v'''ector.css.",
'updated' => '(Yañardı)',
'note' => "'''Ä°htar:'''",
'previewnote' => "'''Bu tek baqıp çıquv, metin alâ daa saqlanmağan!'''",
@@ -726,7 +720,6 @@ Ayrıca, mında isse qoşıp, bu isseniñ özüñiz tarafından yazılğanına,
'copyrightwarning2' => "'''Lütfen, diqqat:''' {{SITENAME}} saytına siz qoşqan bütün isseler başqa bir qullanıcı tarafından deñiştirilip ya da yoq etilip olur. Qoşqan isseñizniñ başqa insanlar tarafından acımasızca deñiştirilmesini ya da azat tarzda ve sıñırsızca başqa yerlerge dağıtılmasını istemeseñiz, isse qoşmañız.<br />
Ayrıca, mında isse qoşıp, bu isseniñ özüñiz tarafından yazılğanına, ya da cemaatqa açıq bir menbadan ya da başqa bir azat menbadan kopiyalanğanına garantiya bergen olasıñız ($1 baqıñız).<br />
'''MÜELLİFLİK AQQINEN QORÇALANĞAN İÇ BİR METİNNİ MINDA RUHSETSİZ QOŞMAÑIZ!'''",
-'longpagewarning' => "'''TENBİ: Bu saife $1 kilobayt büyükligindedir; bazı brauzerler deñişiklik yapqan vaqıtta 32 kb ve üstü büyükliklerde problemalar yaşap olur. Saifeni parçalarğa ayırmağa tırışıñız.'''",
'longpageerror' => "'''TENBİ: Bu saife $1 kilobayt büyükligindedir. Azamiy (maksimal) izinli büyüklik ise $2 kilobayt. Bu saife saqlanıp olamaz.'''",
'readonlywarning' => "'''TENBİ: Baqım sebebi ile malümat bazası şimdi kilitlidir. Bu sebepten deñişiklikleriñiz şimdi saqlap olamasıñız. Yazğanlarıñıznı başqa bir editor programmasına alıp saqlap olur ve daa soñ tekrar mında ketirip saqlap olursıñız'''
@@ -833,11 +826,13 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
# Diffs
'history-title' => '"$1" saifesiniñ deñişiklik tarihı',
'difference' => '(Versiyalar arası farqlar)',
+'difference-multipage' => '(Saifeler arasındaki farq)',
'lineno' => '$1 satır:',
'compareselectedversions' => 'Saylanğan versiyalarnı teñeştir',
'showhideselectedversions' => 'Saylanğan versiyalarnı köster/gizle',
'editundo' => 'lâğu et',
-'diff-multi' => '({{PLURAL:$1|1 aradaki versiya|$1 aradaki versiya}} kösterilmedi.)',
+'diff-multi' => '({{PLURAL:$2|Bir qullanıcı|$2 qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)',
+'diff-multi-manyusers' => '($2-den ziyade {{PLURAL:$2|qullanıcı|qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)',
# Search results
'searchresults' => 'Qıdıruv neticeleri',
@@ -1003,7 +998,9 @@ Bundan ğayrı bu vikideki saifeñizden başqa qullanıcılarğa siznen bağlanm
'prefs-advancedrendering' => 'İlâve sazlamalar',
'prefs-advancedsearchoptions' => 'İlâve sazlamalar',
'prefs-advancedwatchlist' => 'İlâve sazlamalar',
-'prefs-display' => 'Kösterilüv sazlamaları',
+'prefs-displayrc' => 'Kösterilüv sazlamaları',
+'prefs-displaysearchoptions' => 'Kösterilüv sazlamaları',
+'prefs-displaywatchlist' => 'Kösterilüv sazlamaları',
'prefs-diffs' => 'Farqlar',
# User rights
@@ -1052,14 +1049,9 @@ Bundan ğayrı bu vikideki saifeñizden başqa qullanıcılarğa siznen bağlanm
'recentchanges-legend' => 'Soñki deñişiklikler sazlamaları',
'recentchangestext' => 'Yapılğan eñ soñki deñişikliklerni bu saifede körip olasıñız.',
'recentchanges-feed-description' => 'Bu lenta vastasınen vikide soñki deñişikliklerni közet.',
-'recentchanges-label-legend' => 'Ä°zaat: $1.',
-'recentchanges-legend-newpage' => '$1 - yañı saife',
'recentchanges-label-newpage' => 'Bu deñişiklik yañı bir saife yarattı',
-'recentchanges-legend-minor' => '$1 - kiçik deñişiklik',
'recentchanges-label-minor' => 'Bu kiçik bir deñişiklik',
-'recentchanges-legend-bot' => '$1 - bot deñişikligi',
'recentchanges-label-bot' => 'Bu bir botnıñ yapqan deñişikligi',
-'recentchanges-legend-unpatrolled' => '$1 - teşkerilmegen deñişiklik',
'recentchanges-label-unpatrolled' => 'Bu deñişiklik alâ daa teşkerilmegen',
'rcnote' => "$4 $5 tarihında soñki {{PLURAL:$2|künde|'''$2''' künde}} yapılğan '''{{PLURAL:$1|1|$1}}''' deñişiklik:",
'rcnotefrom' => "'''$2''' tarihından itibaren yapılğan deñişiklikler aşağıdadır (eñ çоq '''$1''' dane saife kösterile).",
@@ -1165,7 +1157,6 @@ Faylıñıznı yañıdan yüklemege isteseñiz, lütfen, keri qaytıp yañı bir
Eger bu faylnı ep bir yüklemege isteseñiz, keri qaytıñız ve fayl ismini deñiştirip yañıdan yükleñiz.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Bu fayl aşağıdaki {{PLURAL:$1|faylnıñ|fayllarnıñ}} dublikatı ola:',
-'successfulupload' => 'Yüklenüv becerildi',
'uploadwarning' => 'Tenbi',
'savefile' => 'Faylnı saqla',
'uploadedimage' => 'Yüklengen: "[[$1]]"',
@@ -1184,6 +1175,7 @@ Eger bu faylnı ep bir yüklemege isteseñiz, keri qaytıñız ve fayl ismini de
Er alda bu faylnı yüklemege devam etmege isteysiñizmi?
Bu fayl içün yoq etüvniñ jurnalını mında baqıp olasıñız:",
'filename-bad-prefix' => "Siz yüklegen faylnıñ adı '''\"\$1\"'''-nen başlana. Bu, adetince, raqamlı fotoapparatlardan fayl adına yazılğan manasız işaretlerdir. Lütfen, bu fayl içün añlıca bir ad saylap yazıñız.",
+'upload-success-subj' => 'Yüklenüv becerildi',
'upload-proto-error' => 'Yañlış protokol',
'upload-proto-error-text' => 'İnternetten bir resim faylı yüklemege isteseñiz adres <code>http://</code> ya da <code>ftp://</code>nen başlamalı.',
@@ -1293,7 +1285,7 @@ Eger saifede, [[MediaWiki:Disambiguationspage]] saifesinde adı keçken şablon
'doubleredirects' => 'YollamaÄŸa olÄŸan yollamalar',
'doubleredirectstext' => 'Bu saifede diger yollama saifelerine yollanma olğan saifeleri kösterile.
Er satırda birinci ve ekinci yollamağa bağlantılar da, ekinci yollamanıñ maqsat saifesi (adetince o birinci yollamanıñ kerekli maqsadı ola) da bar.
-<s>Üstü sızılğan</s> meseleler endi çezilgen.',
+<del>Üstü sızılğan</del> meseleler endi çezilgen.',
'double-redirect-fixed-move' => '[[$1]] avuştırıldı, şimdi [[$2]] saifesine yollap tura.',
'brokenredirects' => 'Bar olmağan saifege yapılğan yollamalar',
@@ -1436,7 +1428,6 @@ Ayrıca [[Special:WantedCategories|talap etilgen kategoriyalarnıñ cedveline]]
# Watchlist
'watchlist' => 'Közetüv cedveli',
'mywatchlist' => 'Közetüv cedvelim',
-'watchlistfor' => "('''$1''' içün)",
'nowatchlist' => 'Siziñ közetüv cedveliñiz boştır.',
'watchlistanontext' => 'Közetüv cedvelini baqmaq ya da deñiştirmek içün $1 borclusıñız.',
'watchnologin' => 'Oturım açmaq kerek',
@@ -1904,10 +1895,10 @@ Faylnı işletip işletim sistemañızğa zarar ketirip olursıñız.",
'imagemaxsize' => "Resim ölçüsi sıñırı:<br />''(fayl malümat saifeleri içün)''",
'thumbsize' => 'Kiçik ölçü:',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|1|$3}} saife',
-'file-info' => '(fayl büyükligi: $1, MIME çeşiti: $2)',
-'file-info-size' => '($1 × $2 piksel, fayl büyükligi: $3, MIME çeşiti: $4)',
+'file-info' => 'fayl büyükligi: $1, MIME çeşiti: $2',
+'file-info-size' => '$1 × $2 piksel, fayl büyükligi: $3, MIME çeşiti: $4',
'file-nohires' => '<small>Daa yüksek çezinirlikke saip versiya yoq.</small>',
-'svg-long-desc' => '(SVG faylı, nominal $1 × $2 piksel, fayl büyükligi: $3)',
+'svg-long-desc' => 'SVG faylı, nominal $1 × $2 piksel, fayl büyükligi: $3',
'show-big-image' => 'Tam çezinirlik',
'show-big-image-thumb' => '<small>Baqıp çıquvda resim büyükligi: $1 × $2 piksel</small>',
diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php
index 8cacc800..0eb62aa1 100644
--- a/languages/messages/MessagesCs.php
+++ b/languages/messages/MessagesCs.php
@@ -30,18 +30,31 @@ $namespaceNames = array(
NS_SPECIAL => 'Speciální',
NS_TALK => 'Diskuse',
NS_USER => 'Uživatel',
- NS_USER_TALK => 'Uživatel_diskuse',
- NS_PROJECT_TALK => '$1_diskuse',
+ NS_USER_TALK => 'Diskuse_s_uživatelem',
+ NS_PROJECT_TALK => 'Diskuse_k_{{grammar:3sg|$1}}',
NS_FILE => 'Soubor',
- NS_FILE_TALK => 'Soubor_diskuse',
+ NS_FILE_TALK => 'Diskuse_k_souboru',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_diskuse',
+ NS_MEDIAWIKI_TALK => 'Diskuse_k_MediaWiki',
NS_TEMPLATE => 'Å ablona',
- NS_TEMPLATE_TALK => 'Å ablona_diskuse',
+ NS_TEMPLATE_TALK => 'Diskuse_k_Å¡ablonÄ›',
NS_HELP => 'Nápověda',
- NS_HELP_TALK => 'Nápověda_diskuse',
+ NS_HELP_TALK => 'Diskuse_k_nápovědě',
NS_CATEGORY => 'Kategorie',
- NS_CATEGORY_TALK => 'Kategorie_diskuse',
+ NS_CATEGORY_TALK => 'Diskuse_ke_kategorii',
+);
+
+$namespaceAliases = array(
+ 'Uživatelka' => NS_USER, # female complement
+ 'Diskuse_s_uživatelkou' => NS_USER_TALK, # female complement
+ 'Uživatel_diskuse' => NS_USER_TALK, # old literal translation backward compatibility
+ 'Uživatelka_diskuse' => NS_USER_TALK, # female complement to old literal translation style
+ '$1_diskuse' => NS_PROJECT_TALK, # old literal translation backward compatibility
+ 'Soubor_diskuse' => NS_FILE_TALK, # old literal translation backward compatibility
+ 'MediaWiki_diskuse' => NS_MEDIAWIKI_TALK, # old literal translation backward compatibility
+ 'Å ablona_diskuse' => NS_TEMPLATE_TALK, # old literal translation backward compatibility
+ 'Nápověda_diskuse' => NS_HELP_TALK, # old literal translation backward compatibility
+ 'Kategorie_diskuse' => NS_CATEGORY_TALK, # old literal translation backward compatibility
);
/**
@@ -59,7 +72,7 @@ $datePreferences = array(
);
/**
- * Default date format to be used
+ * Default date format to be used
*/
$defaultDateFormat = 'ÄŒSN basic dt';
@@ -107,7 +120,7 @@ $dateFormats = array(
* Hledání knihy podle ISBN
*/
$bookstoreList = array(
- 'Národní knihovna' => 'http://sigma.nkp.cz/F/?func=find-a&find_code=ISN&request=$1',
+ 'Národní knihovna' => 'http://aleph.nkp.cz/F/?func=find-a&find_code=ISN&request=$1',
'Státní technická knihovna' => 'http://www.stk.cz/cgi-bin/dflex/CZE/STK/BROWSE?A=01&V=$1',
'inherit' => true,
);
@@ -237,96 +250,96 @@ $magicWords = array(
# Písmena, která se mají objevit jako Äást odkazu ve formÄ› '[[jazyk]]y' atd:
$linkTrail = '/^([a-záÄÄéěíňóřšťúůýž]+)(.*)$/sDu';
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dvojitá přesměrování', 'Dvojita presmerovani' ),
- 'BrokenRedirects' => array( 'Přerušená přesměrování', 'Prerusena presmerovani' ),
+ 'DoubleRedirects' => array( 'Dvojitá_přesměrování', 'Dvojita_presmerovani' ),
+ 'BrokenRedirects' => array( 'Přerušená_přesměrování', 'Prerusena_presmerovani' ),
'Disambiguations' => array( 'Rozcestníky', 'Rozcestniky' ),
'Userlogin' => array( 'Přihlásit', 'Prihlasit' ),
'Userlogout' => array( 'Odhlásit', 'Odhlasit' ),
- 'CreateAccount' => array( 'VytvoÅ™it úÄet', 'Vytvorit ucet' ),
+ 'CreateAccount' => array( 'VytvoÅ™it_úÄet', 'Vytvorit_ucet' ),
'Preferences' => array( 'Nastavení', 'Nastaveni' ),
- 'Watchlist' => array( 'Sledované stránky', 'Sledovane stranky' ),
- 'Recentchanges' => array( 'Poslední změny', 'Posledni zmeny' ),
- 'Upload' => array( 'NaÄíst soubor', 'Nacist soubor', 'NaÄíst obrázek' ),
- 'Listfiles' => array( 'Seznam souborů', 'Seznam souboru' ),
- 'Newimages' => array( 'Nové obrázky', 'Galerie nových obrázků', 'Nove obrazky' ),
- 'Listusers' => array( 'Uživatelé', 'Uzivatele', 'Seznam uživatelů', 'Seznam uzivatelu' ),
- 'Listgrouprights' => array( 'Seznam uživatelských práv', 'Seznam uzivatelskych prav' ),
- 'Statistics' => array( 'Statistiky' ),
- 'Randompage' => array( 'Náhodná stránka', 'Nahodna stranka' ),
- 'Lonelypages' => array( 'SirotÄí stránky', 'Sirotci stranky' ),
- 'Uncategorizedpages' => array( 'Nekategorizované stránky', 'Nekategorizovane stranky' ),
- 'Uncategorizedcategories' => array( 'Nekategorizované kategorie', 'Nekategorizovane kategorie' ),
- 'Uncategorizedimages' => array( 'Nekategorizované soubory', 'Nekategorizovane soubory' ),
- 'Uncategorizedtemplates' => array( 'Nekategorizované šablony', 'Nekategorizovane sablony' ),
- 'Unusedcategories' => array( 'Nepoužívané kategorie', 'Nepouzivane kategorie' ),
- 'Unusedimages' => array( 'Nepoužívané soubory', 'Nepouzivane soubory' ),
- 'Wantedpages' => array( 'Požadované stránky', 'Pozadovane stranky', 'Chybějící stránky' ),
- 'Wantedcategories' => array( 'Požadované kategorie', 'Pozadovane kategorie', 'Chybějící kategorie' ),
- 'Wantedfiles' => array( 'Požadované soubory', 'Pozadovane soubory', 'Chybějící soubory' ),
- 'Wantedtemplates' => array( 'Požadované šablony', 'Pozadovane sablony', 'Chybějící šablony' ),
- 'Mostlinked' => array( 'Nejodkazovanější stránky', 'Nejodkazovanejsi stranky' ),
- 'Mostlinkedcategories' => array( 'Nejpoužívanější kategorie', 'Nejpouzivanejsi kategorie' ),
- 'Mostlinkedtemplates' => array( 'Nejpoužívanější šablony', 'Nejpouzivanejsi sablony' ),
- 'Mostimages' => array( 'Nejpoužívanější soubory', 'Nejpouzivanejsi soubory' ),
- 'Mostcategories' => array( 'Stránky s nejvíce kategoriemi', 'Stranky s nejvice kategoriemi', 'Stránky s nejvyšším poÄtem kategorií' ),
- 'Mostrevisions' => array( 'Stránky s nejvíce editacemi', 'Stranky s nejvice editacemi', 'Stránky s nejvyšším poÄtem editací' ),
- 'Fewestrevisions' => array( 'Stránky s nejménÄ› editacemi', 'Stranky s nejmene editacemi', 'Stránky s nejmenším poÄtem editací' ),
- 'Shortpages' => array( 'Nejkratší stránky', 'Nejkratsi stranky' ),
- 'Longpages' => array( 'Nejdelší stránky', 'Nejdelsi stranky' ),
- 'Newpages' => array( 'Nové stránky', 'Nove stranky', 'Nejnovější stránky', 'Nejnovejsi stranky' ),
- 'Ancientpages' => array( 'Staré stránky', 'Stare stranky', 'Nejstarší stránky' ),
- 'Deadendpages' => array( 'Slepé stránky', 'Slepe stranky' ),
- 'Protectedpages' => array( 'ZamÄené stránky', 'Zamcene stranky' ),
- 'Protectedtitles' => array( 'ZamÄené názvy', 'Zamcene nazvy', 'Stránky které nelze vytvoÅ™it' ),
- 'Allpages' => array( 'Všechny stránky', 'Vsechny stranky' ),
- 'Ipblocklist' => array( 'Blokovaní uživatelé', 'Blokovani uzivatele' ),
- 'Specialpages' => array( 'Speciální stránky', 'Specialni stranky' ),
+ 'Watchlist' => array( 'Sledované_stránky', 'Sledovane_stranky' ),
+ 'Recentchanges' => array( 'Poslední_změny', 'Posledni_zmeny' ),
+ 'Upload' => array( 'NaÄíst_soubor', 'Nacist_soubor', 'NaÄíst_obrázek' ),
+ 'Listfiles' => array( 'Seznam_souborů', 'Seznam_souboru' ),
+ 'Newimages' => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
+ 'Listusers' => array( 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ),
+ 'Listgrouprights' => array( 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ),
+ 'Statistics' => array( 'Statistika', 'Statistiky' ),
+ 'Randompage' => array( 'Náhodná_stránka', 'Nahodna_stranka' ),
+ 'Lonelypages' => array( 'SirotÄí_stránky', 'Sirotci_stranky' ),
+ 'Uncategorizedpages' => array( 'Nekategorizované_stránky', 'Nekategorizovane_stranky' ),
+ 'Uncategorizedcategories' => array( 'Nekategorizované_kategorie', 'Nekategorizovane_kategorie' ),
+ 'Uncategorizedimages' => array( 'Nekategorizované_soubory', 'Nekategorizovane_soubory' ),
+ 'Uncategorizedtemplates' => array( 'Nekategorizované_šablony', 'Nekategorizovane_sablony' ),
+ 'Unusedcategories' => array( 'Nepoužívané_kategorie', 'Nepouzivane_kategorie' ),
+ 'Unusedimages' => array( 'Nepoužívané_soubory', 'Nepouzivane_soubory' ),
+ 'Wantedpages' => array( 'Chybějící_stránky', 'Požadované_stránky', 'Pozadovane_stranky' ),
+ 'Wantedcategories' => array( 'Chybějící_kategorie', 'Požadované_kategorie', 'Pozadovane_kategorie' ),
+ 'Wantedfiles' => array( 'Chybějící_soubory', 'Požadované_soubory', 'Pozadovane_soubory' ),
+ 'Wantedtemplates' => array( 'Chybějící_šablony', 'Požadované_šablony', 'Pozadovane_sablony' ),
+ 'Mostlinked' => array( 'Nejodkazovanější_stránky', 'Nejodkazovanejsi_stranky' ),
+ 'Mostlinkedcategories' => array( 'Nejpoužívanější_kategorie', 'Nejpouzivanejsi_kategorie' ),
+ 'Mostlinkedtemplates' => array( 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ),
+ 'Mostimages' => array( 'Nejpoužívanější_soubory', 'Nejpouzivanejsi_soubory' ),
+ 'Mostcategories' => array( 'Stránky_s_nejvíce_kategoriemi', 'Stranky_s_nejvice_kategoriemi', 'Stránky_s_nejvyšším_poÄtem_kategorií' ),
+ 'Mostrevisions' => array( 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_poÄtem_editací' ),
+ 'Fewestrevisions' => array( 'Stránky_s_nejménÄ›_editacemi', 'Stranky_s_nejmene_editacemi', 'Stránky_s_nejmenším_poÄtem_editací' ),
+ 'Shortpages' => array( 'Nejkratší_stránky', 'Nejkratsi_stranky' ),
+ 'Longpages' => array( 'Nejdelší_stránky', 'Nejdelsi_stranky' ),
+ 'Newpages' => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
+ 'Ancientpages' => array( 'Nejstarší_stránky', 'Staré_stránky', 'Stare_stranky' ),
+ 'Deadendpages' => array( 'Slepé_stránky', 'Slepe_stranky' ),
+ 'Protectedpages' => array( 'ZamÄené_stránky', 'Zamcene_stranky' ),
+ 'Protectedtitles' => array( 'ZamÄené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvoÅ™it' ),
+ 'Allpages' => array( 'Všechny_stránky', 'Vsechny_stranky' ),
+ 'Ipblocklist' => array( 'Blokovaní_uživatelé', 'Blokovani_uzivatele' ),
+ 'Specialpages' => array( 'Speciální_stránky', 'Specialni_stranky' ),
'Contributions' => array( 'Příspěvky', 'Prispevky' ),
'Emailuser' => array( 'E-mail' ),
- 'Confirmemail' => array( 'Potvrdit e-mail' ),
- 'Whatlinkshere' => array( 'Co odkazuje na', 'Odkazuje sem' ),
- 'Recentchangeslinked' => array( 'Související změny', 'Souvisejici zmeny' ),
- 'Movepage' => array( 'Přesunout stránku' ),
- 'Blockme' => array( 'Zablokuj mÄ›', 'Zablokuj me' ),
- 'Booksources' => array( 'Zdroje knih' ),
+ 'Confirmemail' => array( 'Potvrdit_e-mail' ),
+ 'Whatlinkshere' => array( 'Co_odkazuje_na', 'Odkazuje_sem' ),
+ 'Recentchangeslinked' => array( 'Související_změny', 'Souvisejici_zmeny' ),
+ 'Movepage' => array( 'Přesunout_stránku' ),
+ 'Blockme' => array( 'Zablokuj_mÄ›', 'Zablokuj_me' ),
+ 'Booksources' => array( 'Zdroje_knih' ),
'Categories' => array( 'Kategorie' ),
- 'Export' => array( 'Exportovat stránky' ),
+ 'Export' => array( 'Exportovat_stránky' ),
'Version' => array( 'Verze' ),
- 'Allmessages' => array( 'Všechny zprávy' ),
- 'Log' => array( 'Protokolovací záznamy', 'Protokoly', 'Protokol', 'Protokolovaci zaznamy' ),
- 'Blockip' => array( 'Blokovat uživatele', 'Blokovat IP', 'Blokovat uzivatele' ),
- 'Undelete' => array( 'Smazané stránky', 'Smazane stranky' ),
- 'Import' => array( 'Importovat stránky' ),
- 'Lockdb' => array( 'Zamknout databázi', 'Zamknout databazi' ),
- 'Unlockdb' => array( 'Odemknout databázi', 'Odemknout databazi' ),
- 'Userrights' => array( 'Uživatelská práva', 'Správa uživatelů', 'Uzivatelska prava' ),
- 'MIMEsearch' => array( 'Hledání podle MIME', 'Hledani podle MIME', 'Hledat podle MIME typu' ),
- 'FileDuplicateSearch' => array( 'Hledání duplicitních souborů', 'Hledani duplicitnich souboru' ),
- 'Unwatchedpages' => array( 'Unwatchedpages', 'Nesledované stránky' ),
- 'Listredirects' => array( 'Seznam přesměrování', 'Seznam presmerovani' ),
- 'Revisiondelete' => array( 'Smazat revizi' ),
- 'Unusedtemplates' => array( 'Nepoužívané šablony', 'Nepouzivane sablony' ),
- 'Randomredirect' => array( 'Náhodné přesměrování', 'Nahodne presmerovani' ),
- 'Mypage' => array( 'Moje stránka', 'Moje stranka' ),
- 'Mytalk' => array( 'Moje diskuse', 'Moje diskuze' ),
- 'Mycontributions' => array( 'Mé příspěvky', 'Me prispevky' ),
- 'Listadmins' => array( 'Seznam správců', 'Seznam spravcu' ),
- 'Listbots' => array( 'Seznam botů', 'Seznam botu' ),
- 'Popularpages' => array( 'Nejnavštěvovanější stránky', 'Nejnavstevovanejsi stranky' ),
+ 'Allmessages' => array( 'Všechny_zprávy' ),
+ 'Log' => array( 'Protokolovací_záznamy', 'Protokoly', 'Protokol', 'Protokolovaci_zaznamy' ),
+ 'Blockip' => array( 'Blokovat_uživatele', 'Blokovat_IP', 'Blokovat_uzivatele' ),
+ 'Undelete' => array( 'Smazané_stránky', 'Smazane_stranky' ),
+ 'Import' => array( 'Importovat_stránky' ),
+ 'Lockdb' => array( 'Zamknout_databázi', 'Zamknout_databazi' ),
+ 'Unlockdb' => array( 'Odemknout_databázi', 'Odemknout_databazi' ),
+ 'Userrights' => array( 'Uživatelská_práva', 'Správa_uživatelů', 'Uzivatelska_prava' ),
+ 'MIMEsearch' => array( 'Hledání_podle_MIME', 'Hledani_podle_MIME', 'Hledat_podle_MIME_typu' ),
+ 'FileDuplicateSearch' => array( 'Hledání_duplicitních_souborů', 'Hledani_duplicitnich_souboru' ),
+ 'Unwatchedpages' => array( 'Nesledované_stránky' ),
+ 'Listredirects' => array( 'Seznam_přesměrování', 'Seznam_presmerovani' ),
+ 'Revisiondelete' => array( 'Smazat_revizi' ),
+ 'Unusedtemplates' => array( 'Nepoužívané_šablony', 'Nepouzivane_sablony' ),
+ 'Randomredirect' => array( 'Náhodné_přesměrování', 'Nahodne_presmerovani' ),
+ 'Mypage' => array( 'Moje_stránka', 'Moje_stranka' ),
+ 'Mytalk' => array( 'Moje_diskuse', 'Moje_diskuze' ),
+ 'Mycontributions' => array( 'Mé_příspěvky', 'Me_prispevky' ),
+ 'Listadmins' => array( 'Seznam_správců', 'Seznam_spravcu' ),
+ 'Listbots' => array( 'Seznam_botů', 'Seznam_botu' ),
+ 'Popularpages' => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
'Search' => array( 'Hledání', 'Hledani' ),
- 'Resetpass' => array( 'Změna hesla', 'Zmena hesla', 'Resetovat heslo' ),
- 'Withoutinterwiki' => array( 'Bez interwiki', 'Stránky bez interwiki odkazů' ),
- 'MergeHistory' => array( 'SlouÄení historie', 'Slouceni historie', 'SlouÄit historii' ),
- 'Filepath' => array( 'Cesta k souboru' ),
- 'Invalidateemail' => array( 'Zneplatnit e-mail', 'Zrušit potvrzení e-mailu' ),
- 'Blankpage' => array( 'Prázdná stránka' ),
- 'LinkSearch' => array( 'Hledání odkazů', 'Hledani odkazu' ),
- 'DeletedContributions' => array( 'Smazané příspěvky', 'Smazane prispevky' ),
+ 'Resetpass' => array( 'Změna_hesla', 'Zmena_hesla', 'Resetovat_heslo' ),
+ 'Withoutinterwiki' => array( 'Bez_interwiki', 'Stránky_bez_interwiki_odkazů' ),
+ 'MergeHistory' => array( 'SlouÄení_historie', 'Slouceni_historie', 'SlouÄit_historii' ),
+ 'Filepath' => array( 'Cesta_k_souboru' ),
+ 'Invalidateemail' => array( 'Zneplatnit_e-mail', 'Zrušit_potvrzení_e-mailu' ),
+ 'Blankpage' => array( 'Prázdná_stránka' ),
+ 'LinkSearch' => array( 'Hledání_odkazů', 'Hledani_odkazu' ),
+ 'DeletedContributions' => array( 'Smazané_příspěvky', 'Smazane_prispevky' ),
'Tags' => array( 'ZnaÄky', 'Znacky' ),
- 'Activeusers' => array( 'Aktivní uživatelé', 'Aktivni uzivatele' ),
+ 'Activeusers' => array( 'Aktivní_uživatelé', 'Aktivni_uzivatele' ),
);
$messages = array(
@@ -345,8 +358,7 @@ $messages = array(
'tog-editsection' => 'Zapnout možnost editace Äásti stránky pomocí odkazu [editovat]',
'tog-editsectiononrightclick' => 'Zapnout možnost editace Äásti stránky pomocí kliknutí pravým tlaÄítkem na nadpisy stránky (JavaScript)',
'tog-showtoc' => 'Zobrazovat obsah (na stránkách s více než třemi nadpisy)',
-'tog-rememberpassword' => 'Pamatovat si mé heslo mezi návštěvami',
-'tog-editwidth' => 'Roztáhnout editaÄní okno na celou šířku obrazovky',
+'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é',
@@ -493,31 +505,21 @@ $messages = array(
'faqpage' => 'Project:Často kladené otázky',
# Vector skin
-'vector-action-addsection' => 'Přidat téma',
-'vector-action-delete' => 'Smazat',
-'vector-action-move' => 'Přesunout',
-'vector-action-protect' => 'Zamknout',
-'vector-action-undelete' => 'Obnovit',
-'vector-action-unprotect' => 'Odemknout',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Nápověda',
-'vector-namespace-image' => 'Soubor',
-'vector-namespace-main' => 'Stránka',
-'vector-namespace-media' => 'Stránka souboru',
-'vector-namespace-mediawiki' => 'Hlášení',
-'vector-namespace-project' => 'Projektová stránka',
-'vector-namespace-special' => 'Speciální stránka',
-'vector-namespace-talk' => 'Diskuse',
-'vector-namespace-template' => 'Å ablona',
-'vector-namespace-user' => 'Uživatelská stránka',
-'vector-view-create' => 'Založit',
-'vector-view-edit' => 'Editovat',
-'vector-view-history' => 'Zobrazit historii',
-'vector-view-view' => 'Číst',
-'vector-view-viewsource' => 'Zobrazit zdrojový kód',
-'actions' => 'Akce',
-'namespaces' => 'Jmenné prostory',
-'variants' => 'Varianty',
+'vector-action-addsection' => 'Přidat téma',
+'vector-action-delete' => 'Smazat',
+'vector-action-move' => 'Přesunout',
+'vector-action-protect' => 'Zamknout',
+'vector-action-undelete' => 'Obnovit',
+'vector-action-unprotect' => 'Odemknout',
+'vector-simplesearch-preference' => 'Zapnout rozšířené návrhy hledání (pouze vzhled Vektor)',
+'vector-view-create' => 'Založit',
+'vector-view-edit' => 'Editovat',
+'vector-view-history' => 'Zobrazit historii',
+'vector-view-view' => 'Číst',
+'vector-view-viewsource' => 'Zobrazit zdrojový kód',
+'actions' => 'Akce',
+'namespaces' => 'Jmenné prostory',
+'variants' => 'Varianty',
'errorpagetitle' => 'Chyba',
'returnto' => 'Návrat na stránku „$1“.',
@@ -578,6 +580,9 @@ Tuto stránku si právě prohlíží příliš mnoho uživatelů.
PÅ™ed tím, než ji zkusíte naÄíst znovu, chvíli poÄkejte.
$1',
+'pool-timeout' => 'PÅ™i Äekání na zámek vyprÅ¡el Äasový limit',
+'pool-queuefull' => 'Fronta ve fondu je plná',
+'pool-errorunknown' => 'Neznámá chyba',
# 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' => 'O&nbsp;{{grammar:6sg|{{SITENAME}}}}',
@@ -739,7 +744,8 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
'yourname' => 'Uživatelské jméno:',
'yourpassword' => 'Vaše heslo',
'yourpasswordagain' => 'Zopakujte heslo:',
-'remembermypassword' => 'Trvalé přihlášení',
+'remembermypassword' => 'Zapamatovat si mé pÅ™ihlášení na tomto poÄítaÄi (maximálnÄ› $1 {{PLURAL:$1|den|dny|dní}})',
+'securelogin-stick-https' => 'Zůstat po přihlášení připojen přes HTTPS',
'yourdomainname' => 'Vaše doména',
'externaldberror' => 'BuÄ nastala chyba externí autentizaÄní databáze, nebo nemáte dovoleno mÄ›nit svůj externí úÄet.',
'login' => 'Přihlaste se',
@@ -756,6 +762,7 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
'gotaccount' => "Už jste registrováni? '''$1'''.",
'gotaccountlink' => 'Přihlaste se',
'createaccountmail' => 'pomocí e-mailu',
+'createaccountreason' => 'Důvod:',
'badretype' => 'Vámi napsaná hesla nesouhlasí.',
'userexists' => 'Uživatel se stejným jménem je už registrován. Zvolte jiné jméno.',
'loginerror' => 'Chyba při přihlašování',
@@ -773,6 +780,7 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
'wrongpasswordempty' => 'Bylo zadáno prázdné heslo. Zkuste to znovu.',
'passwordtooshort' => 'Heslo musí být dlouhé nejméně $1 {{PLURAL:$1|znak|znaky|znaků}}.',
'password-name-match' => 'Vaše heslo nesmí být stejné jako uživatelské jméno.',
+'password-login-forbidden' => 'Použití tohoto uživatelského jména a hesla byla zakázáno.',
'mailmypassword' => 'Poslat e-mailem nové heslo',
'passwordremindertitle' => 'Nové doÄasné heslo na {{grammar:4sg|{{SITENAME}}}}',
'passwordremindertext' => 'Někdo (patrně vy, z IP adresy $1) požádal, abychom o nové heslo
@@ -814,6 +822,9 @@ PoÄkejte chvíli, než to zkusíte znovu.',
'loginlanguagelabel' => 'Jazyk: $1',
'suspicious-userlogout' => 'Váš požadavek na odhlášení byl odmítnut, neboÅ¥ to vypadá, že ho poslal rozbitý prohlížeÄ nebo cachující proxy.',
+# E-mail sending
+'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
+
# Password reset dialog
'resetpass' => 'Změna hesla',
'resetpass_announce' => 'PÅ™ihlaÅ¡ujete se doÄasným heslem zaslaným e-mailem. PÅ™ihlášení lze dokonÄit po nastavení nového trvalého hesla.',
@@ -865,9 +876,11 @@ Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové d
'showlivepreview' => 'Rychlý náhled',
'showdiff' => 'Ukázat změny',
'anoneditwarning' => "'''Varování:''' Nejste přihlášen(a). Vaše IP adresa bude zveřejněna v historii této stránky.",
+'anonpreviewwarning' => "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
'missingsummary' => "'''Připomenutí:''' Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána bez shrnutí.",
'missingcommenttext' => 'Zadejte komentář',
-'missingcommentheader' => "'''Připomenutí:''' Nezadali jste předmět/nadpis pro tento komentář. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána i bez toho.",
+'missingcommentheader' => "'''Připomenutí:''' Nezadali jste předmět/nadpis pro tento komentář.
+Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána i bez toho.",
'summary-preview' => 'Náhled shrnutí:',
'subject-preview' => 'Náhled předmětu/nadpisu:',
'blockedtitle' => 'Uživatel zablokován',
@@ -933,7 +946,11 @@ Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
'usercsspreview' => "'''Pamatujte, že si prohlížíte jen náhled vašeho uživatelského CSS.'''
'''Zatím nebylo uloženo!'''",
'userjspreview' => "'''Pamatujte, že testujete a prohlížíte pouze náhled vašeho uživatelského JavaScriptu, dosud nebyl uložen!'''",
-'userinvalidcssjstitle' => "'''Varování:''' Vzhled „$1“ neexistuje. Nezapomeňte, že uživatelské .css a .js soubory používají malá písmena, např. {{ns:user}}:{{BASEPAGENAME}}/monobook.css, nikoli {{ns:user}}:{{BASEPAGENAME}}/Monobook.css.",
+'sitecsspreview' => "'''Pamatujte, že si prohlížíte jen náhled tohoto CSS.'''
+'''Zatím nebylo uloženo!'''",
+'sitejspreview' => "'''Pamatujte, že testujete a prohlížíte pouze náhled tohoto JavaScriptu.'''
+'''Dosud nebyl uložen!'''",
+'userinvalidcssjstitle' => "'''Varování:''' Vzhled „$1“ neexistuje. Nezapomeňte, že uživatelské .css a .js soubory používají malá písmena, např. {{ns:user}}:{{BASEPAGENAME}}/vector.css, nikoli {{ns:user}}:{{BASEPAGENAME}}/Vector.css.",
'updated' => '(Změna uložena)',
'note' => "'''Poznámka:'''&nbsp;",
'previewnote' => "'''Pamatujte, že toto je pouze náhled, změny zatím nebyly uloženy!'''",
@@ -969,7 +986,6 @@ Uložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírová
'''NEVKLÃDEJTE DÃLA CHRÃNÄšNÃ AUTORSKÃM PRÃVEM BEZ DOVOLENÃ!'''",
'copyrightwarning2' => "UvÄ›domte si, že vÅ¡echny příspÄ›vky do {{grammar:2sg|{{SITENAME}}}} mohou být ostatními uživateli upraveny, pozmÄ›nÄ›ny Äi odstranÄ›ny. Pokud si nepÅ™ejete, aby váš text byl nemilosrdnÄ› upravován, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />
Uložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>), podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
-'longpagewarning' => 'VAROVÃNÃ: Tato stránka je $1 KiB dlouhá; nÄ›které prohlížeÄe mohou mít problémy s editováním stran, které se blíží nebo jsou delší než 32 KiB. Prosíme, zvažte rozdÄ›lení stránky na více Äástí.',
'longpageerror' => "'''CHYBA: Pokoušíte se uložit text o velikosti $1 KiB, pÅ™iÄemž dovolené maximum je $2 KiB. VaÅ¡e editace nemůže být uložena.'''",
'readonlywarning' => "'''VAROVÃNÃ: Databáze byla uzamÄena kvůli údržbÄ›, takže nebudete moci uložit své zmÄ›ny. Můžete si okopírovat text do souboru a uložit ho na pozdÄ›ji.'''
@@ -1144,6 +1160,8 @@ $1",
'logdelete-failure' => "'''Nepodařilo se nastavit viditelnost protokolu:'''
$1",
'revdel-restore' => 'Změnit viditelnost',
+'revdel-restore-deleted' => 'smazané revize',
+'revdel-restore-visible' => 'viditelné revize',
'pagehist' => 'Historie stránky',
'deletedhist' => 'Smazaná historie',
'revdelete-content' => 'obsah',
@@ -1211,11 +1229,13 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
# Diffs
'history-title' => 'Historie verzí stránky „$1“',
'difference' => '(Rozdíly mezi verzemi)',
+'difference-multipage' => '(Rozdíly mezi stránkami)',
'lineno' => 'Řádka $1:',
'compareselectedversions' => 'Porovnat vybrané verze',
'showhideselectedversions' => 'Zobrazit/skrýt vybrané revize',
'editundo' => 'zrušit editaci',
-'diff-multi' => '({{PLURAL:$1|Není zobrazena jedna mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}}.)',
+'diff-multi' => '({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|1 uživatele|$2 uživatelů}}.)',
+'diff-multi-manyusers' => '(Není zobrazeno $1 mezilehlých verzí od více než $2 {{PLURAL:$2|uživatele|uživatelů}}.)',
# Search results
'searchresults' => 'Výsledky hledání',
@@ -1250,6 +1270,7 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
'searchprofile-everything-tooltip' => 'Prohledávat veÅ¡kerý obsah (vÄetnÄ› diskusních stránek)',
'searchprofile-advanced-tooltip' => 'Nastavit jmenné prostory, ve kterých se má hledat',
'search-result-size' => '$1 ({{PLURAL:$2|1 slovo|$2 slova|$2 slov}})',
+'search-result-category-size' => '{{PLURAL:$1|1 položka|$1 položky|$1 položek}} ({{PLURAL:$2|1 podkategorie|$2 podkategorie|$2 podkategorií}}, {{PLURAL:$3|1 soubor|$3 soubory|$3 souborů}})',
'search-result-score' => 'Relevantnost: $1 %',
'search-redirect' => '(přesměrování $1)',
'search-section' => '(Äást $1)',
@@ -1325,6 +1346,7 @@ Pokud na zaÄátek dotazu pÅ™idáte ''all:'', bude se hledat vÅ¡ude (vÄetnÄ› di
'contextlines' => 'PoÄet řádků u každého výsledku:',
'contextchars' => 'Kontext na každé řádce:',
'stub-threshold' => 'Limit pro formátování odkazu jako <a href="#" class="stub">pahýl</a> (v bajtech):',
+'stub-threshold-disabled' => 'Vypnuto',
'recentchangesdays' => 'PoÄet dní zobrazených v posledních zmÄ›nách:',
'recentchangesdays-max' => '(maximálně $1 {{PLURAL:$1|den|dny|dní}})',
'recentchangescount' => 'PoÄet implicitnÄ› zobrazovaných záznamů:',
@@ -1358,6 +1380,7 @@ Můžete použít tuto náhodně vygenerovanou hodnotu: $1',
'prefs-files' => 'Soubory',
'prefs-custom-css' => 'Vlastní CSS',
'prefs-custom-js' => 'Vlastní JS',
+'prefs-common-css-js' => 'Sdílené CSS/JS pro všechny styly:',
'prefs-reset-intro' => 'Pomocí této stránky můžete všechna nastavení vrátit na implicitní hodnoty.
Tuto operaci nelze vrátit zpět.',
'prefs-emailconfirm-label' => 'Ověření e-mailu:',
@@ -1394,9 +1417,15 @@ Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelsk
'prefs-advancedrendering' => 'Rozšířené možnosti',
'prefs-advancedsearchoptions' => 'Rozšířené možnosti',
'prefs-advancedwatchlist' => 'Rozšířené možnosti',
-'prefs-display' => 'Nastavení vzhledu',
+'prefs-displayrc' => 'Možnosti zobrazení',
+'prefs-displaysearchoptions' => 'Možnosti zobrazení',
+'prefs-displaywatchlist' => 'Možnosti zobrazení',
'prefs-diffs' => 'Porovnání verzí',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mailová adresa vypadá platně',
+'email-address-validity-invalid' => 'Zadejte platnou e-mailovou adresu',
+
# User rights
'userrights' => 'Správa uživatelských skupin',
'userrights-lookup-user' => 'Spravovat uživatelské skupiny',
@@ -1480,6 +1509,7 @@ Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelsk
'right-hideuser' => 'Blokování uživatelského jména a jeho skrytí',
'right-ipblock-exempt' => 'Obcházení blokování IP adres, jejich rozsahů a autobloků',
'right-proxyunbannable' => 'Obcházení automatického blokování proxy serverů',
+'right-unblockself' => 'Odblokování sebe sama',
'right-protect' => 'MÄ›nÄ›ní úrovnÄ› zámku a editace zamÄených stránek',
'right-editprotected' => 'Editace zamÄených stránek (bez kaskádového zámku)',
'right-editinterface' => 'Editace zpráv uživatelského rozhraní',
@@ -1502,7 +1532,6 @@ Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelsk
'right-siteadmin' => 'Zamykání a odemykání databáze',
'right-reset-passwords' => 'Nastavování hesel jiným uživatelům',
'right-override-export-depth' => 'Exportovat stránky vÄetnÄ› odkazovaných stránek až do hloubky 5',
-'right-versiondetail' => 'Prohlížení podrobných informací o verzích nainstalovaného software.',
'right-sendemail' => 'Odesílání e-mailů ostatním uživatelům',
# User rights log
@@ -1553,14 +1582,9 @@ Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelsk
'recentchanges-legend' => 'Možnosti posledních změn',
'recentchangestext' => 'Sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}} na této stránce.',
'recentchanges-feed-description' => 'Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.',
-'recentchanges-label-legend' => 'Legenda: $1',
-'recentchanges-legend-newpage' => '$1 – nová stránka',
'recentchanges-label-newpage' => 'Touto editací byla založena nová stránka',
-'recentchanges-legend-minor' => '$1 – malá editace',
'recentchanges-label-minor' => 'Toto je malá editace',
-'recentchanges-legend-bot' => '$1 – editace bota',
'recentchanges-label-bot' => 'Tuto editaci provedl bot',
-'recentchanges-legend-unpatrolled' => '$1 – neprověřená editace',
'recentchanges-label-unpatrolled' => 'Tato změna dosud nebyla prověřena',
'rcnote' => 'Níže {{plural:$1|je poslední|jsou poslední|je posledních}} <strong>$1</strong> {{plural:$1|změna|změny|změn}} za {{PLURAL:$2|poslední|poslední|posledních}} <strong>$2</strong> {{plural:$2|den|dny|dnů}} před $4, $5.',
'rcnotefrom' => 'Níže {{PLURAL:$1|je|jsou|je}} nejvýše <b>$1</b> {{PLURAL:$1|změna|změny|změn}} od <b>$2</b>.',
@@ -1607,6 +1631,9 @@ $3',
'upload_directory_missing' => 'Adresář pro nahrávání souborů ($1) chybí a webový server ho nedokáže vytvořit.',
'upload_directory_read_only' => 'Do adresáře pro naÄítané soubory ($1) nemá webserver právo zápisu.',
'uploaderror' => 'PÅ™i naÄítání doÅ¡lo k chybÄ›',
+'upload-recreate-warning' => "'''UpozornÄ›ní: Soubor pod tímto názvem byl dříve smazán Äi pÅ™ejmenován.'''
+
+Zde je pro přehled zobrazen soupis mazání a přesunů této stránky:",
'uploadtext' => "Níže uvedený formulář slouží k naÄtení souborů. Již naÄtené soubory si můžete prohlížet a hledat pomocí [[Special:FileList|seznamu naÄtených souborů]], každé naÄtení se také zaznamenává do [[Special:Log/upload|knihy naÄtení]], smazání jsou v [[Special:Log/delete|knize smazaných stránek]].
Pro vložení obrázku do stránky použijte jeden z následujících způsobů zápisu:
@@ -1637,6 +1664,17 @@ Pro vložení obrázku do stránky použijte jeden z následujících způsobů
'filetype-unwanted-type' => "„.$1“''' je nežádoucí formát souborů. {{plural:$3|Upřednostňovaný formát souborů je|Upřednostňované formáty souborů jsou}} $2.",
'filetype-banned-type' => "'''„.$1“''' je nedovolený formát souborů. {{plural:$3|Povolený formát souborů je|Povolené formáty souborů jsou}} $2.",
'filetype-missing' => 'Soubor nemá příponu (např. ".jpg").',
+'empty-file' => 'NaÄtený soubor je prázdný.',
+'file-too-large' => 'NaÄtený soubor je příliÅ¡ velký.',
+'filename-tooshort' => 'Název souboru je příliš krátký.',
+'filetype-banned' => 'Tento typ souboru je zakázán.',
+'verification-error' => 'Soubor nevyhověl při ověřování.',
+'hookaborted' => 'Požadovaná úprava byla zamítnuta některým rozšířením.',
+'illegal-filename' => 'Tento název souboru není dovolen.',
+'overwrite' => 'Není dovoleno přepsat existující soubor.',
+'unknown-error' => 'Došlo k neznámé chybě.',
+'tmp-create-error' => 'NepodaÅ™ilo se vytvoÅ™it doÄasný soubor.',
+'tmp-write-error' => 'Chyba pÅ™i zápisu do doÄasného souboru.',
'large-file' => 'DoporuÄuje se, aby délka souboru nepÅ™esahovala $1, tento soubor má $2.',
'largefileserver' => 'Velikost tohoto souboru pÅ™ekraÄuje limit nastavený na serveru.',
'emptyfile' => 'Soubor, který jste vložili, se zdá být prázdný. Mohl to způsobit překlep v názvu souboru. Prosím zkontrolujte, zda jste opravdu chtěli vložit tento soubor.',
@@ -1661,13 +1699,14 @@ Pokud chcete pÅ™esto soubor naÄíst, vraÅ¥te se a zvolte jiný název.
'fileexists-shared-forbidden' => 'Soubor s tímto názvem již existuje ve sdíleném úložiÅ¡ti. Pokud pÅ™esto chcete váš soubor naÄíst, vraÅ¥te se a zvolte jiný název. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Tento soubor je duplikát {{PLURAL:$1|následujícího souboru|následujících souborů}}:',
'file-deleted-duplicate' => 'Identický soubor k tomuto ([[:$1]]) byl již dříve smazán. Před tím, než soubor znovu nahrajete, byste měli zkontrolovat záznamy o předchozím smazání.',
-'successfulupload' => 'NaÄtení úspěšnÄ› provedeno!',
'uploadwarning' => 'UpozornÄ›ní k naÄítání',
'uploadwarning-text' => 'Prosíme, upravte popis souboru níže a zkuste to znovu.',
'savefile' => 'Uložit soubor',
'uploadedimage' => 'naÄítá „[[$1]]“',
'overwroteimage' => 'naÄtena nová verze "[[$1]]"',
'uploaddisabled' => 'NaÄítání souborů vypnuto.',
+'copyuploaddisabled' => 'NaÄítání souborů prostÅ™ednictvím URL je vypnuto.',
+'uploadfromurl-queued' => 'Váš požadavek na naÄtení souboru byl uložen do fronty.',
'uploaddisabledtext' => 'NaÄítání souborů je vypnuto.',
'php-uploaddisabledtext' => 'V PHP je vypnuto naÄítání souborů. Prosím, zkontrolujte nastavení file_uploads.',
'uploadscripted' => 'Tento soubor obsahuje HTML nebo kód skriptu, který by mohl být prohlížeÄem chybnÄ› interpretován.',
@@ -1700,6 +1739,14 @@ JD # Jenoptik
MGP # Pentax
PICT # různé
#</pre> <!-- tuto řádku ponechte beze změny -->',
+'upload-success-subj' => 'NaÄtení úspěšnÄ› provedeno!',
+'upload-success-msg' => 'Soubor vámi naÄtený z [$2] je dostupný na [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problém s naÄítaným souborem',
+'upload-failure-msg' => 'U souboru vámi naÄítaného z [$2] se vyskytl problém:
+
+$1',
+'upload-warning-subj' => 'UpozornÄ›ní k naÄítání',
+'upload-warning-msg' => 'PÅ™i vaÅ¡em naÄítání souboru z [$2] nastal problém. Pokud ho chcete vyÅ™eÅ¡it, můžete se vrátit do [[Special:Upload/stash/$1|naÄítacího formuláře]].',
'upload-proto-error' => 'Neplatný protokol',
'upload-proto-error-text' => 'Nahrání vzdáleného souboru vyžaduje zadání URLs zaÄínající na <code>http://</code> nebo <code>ftp://</code>.',
@@ -1761,6 +1808,7 @@ Kliknutím na hlaviÄku sloupce můžete zmÄ›nit Å™azení.',
'listfiles_search_for' => 'Hledat soubor podle názvu:',
'imgfile' => 'soubor',
'listfiles' => 'Seznam souborů',
+'listfiles_thumb' => 'Náhled',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Název',
'listfiles_user' => 'Uživatel',
@@ -1874,8 +1922,8 @@ Vstup: <code>typ obsahu/podtyp</code>, napÅ™. <code>image/jpeg</code>.',
'statistics-edits' => 'PoÄet editací od založení wiki',
'statistics-edits-average' => 'PrůmÄ›rný poÄet editací na stránku',
'statistics-views-total' => 'Celkový poÄet zobrazení',
+'statistics-views-total-desc' => 'Zobrazení neexistujících a speciálních stránek se nepoÄítají',
'statistics-views-peredit' => 'PoÄet zobrazení na editaci',
-'statistics-jobqueue' => 'Délka [http://www.mediawiki.org/wiki/Manual:Job_queue fronty údržby]',
'statistics-users' => 'Registrovaní [[Special:ListUsers|uživatelé]]',
'statistics-users-active' => 'Aktivní uživatelé',
'statistics-users-active-desc' => 'Uživatelé, kteří v {{plural:$1|posledním dni|posledních $1 dnech}} provedli nějakou operaci',
@@ -1888,7 +1936,7 @@ Vstup: <code>typ obsahu/podtyp</code>, napÅ™. <code>image/jpeg</code>.',
'doubleredirects' => 'Dvojitá přesměrování',
'doubleredirectstext' => 'Na této stránce je seznam přesměrování vedoucích na další přesměrování.
Každý řádek obsahuje odkaz na první a druhé pÅ™esmÄ›rování a k tomu cíl druhého pÅ™esmÄ›rování, který obvykle ukazuje jméno „skuteÄné“ cílové stránky, na kterou by mÄ›lo první pÅ™esmÄ›rování odkazovat.
-<s>Přeškrtnuté</s> položky již byly vyřešeny.',
+<del>Přeškrtnuté</del> položky již byly vyřešeny.',
'double-redirect-fixed-move' => 'Stránka [[$1]] byla přesunuta, nyní přesměrovává na [[$2]]',
'double-redirect-fixer' => 'Opravář přesměrování',
@@ -1911,6 +1959,8 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
'nmembers' => '$1 {{PLURAL:$1|stránka|stránky|stránek}}',
'nrevisions' => '$1 {{PLURAL:$1|revize|revize|revizí}}',
'nviews' => '$1 {{PLURAL:$1|návšteva|návštevy|návštev}}',
+'nimagelinks' => 'Použit na $1 {{PLURAL:$1|stránce|stránkách}}',
+'ntransclusions' => 'použita na $1 {{PLURAL:$1|stránce|stránkách}}',
'specialpage-empty' => 'Tomuto požadavku neodpovídají žádné záznamy.',
'lonelypages' => 'SirotÄí stránky',
'lonelypagestext' => 'Následující stránky nejsou odkazovány z jiných stránek na {{grammar:6sg|{{SITENAME}}}} ani do nich vloženy.',
@@ -2068,34 +2118,40 @@ Podporované protokoly: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'VyÅ™azení svého úÄtu z libovolné skupiny',
# E-mail user
-'mailnologin' => 'Bez odesílací adresy',
-'mailnologintext' => 'Pokud chcete posílat e-maily jiným uživatelům, musíte se [[Special:UserLogin|přihlásit]] a mít platnou e-mailovou adresu ve svém [[Special:Preferences|nastavení]].',
-'emailuser' => 'Poslat e-mail',
-'emailpage' => 'Poslat e-mail',
-'emailpagetext' => 'Pomocí níže zobrazeného formuláře můžete tomuto uživateli poslat zprávu e-mailem.
+'mailnologin' => 'Bez odesílací adresy',
+'mailnologintext' => 'Pokud chcete posílat e-maily jiným uživatelům, musíte se [[Special:UserLogin|přihlásit]] a mít platnou e-mailovou adresu ve svém [[Special:Preferences|nastavení]].',
+'emailuser' => 'Poslat e-mail',
+'emailpage' => 'Poslat e-mail',
+'emailpagetext' => 'Pomocí níže zobrazeného formuláře můžete tomuto uživateli poslat zprávu e-mailem.
E-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se objeví jako adresa odesílatele pošty, aby vám adresát mohl odpovědět přímo.',
-'usermailererror' => 'Chyba poštovního programu:',
-'defemailsubject' => 'E-mail z {{grammar:2sg|{{SITENAME}}}}',
-'noemailtitle' => 'Bez e-mailové adresy',
-'noemailtext' => 'Tento uživatel nezadal platnou e-mailovou adresu.',
-'nowikiemailtitle' => 'E-mail není povolen',
-'nowikiemailtext' => 'Tento uživatel si nepřeje dostávat e-maily od ostatních uživatelů.',
-'email-legend' => 'Odeslání e-mailu jinému uživateli {{GRAMMAR:2sg|{{SITENAME}}}}',
-'emailfrom' => 'Od:',
-'emailto' => 'Komu:',
-'emailsubject' => 'Předmět:',
-'emailmessage' => 'Zpráva:',
-'emailsend' => 'Odeslat',
-'emailccme' => 'Poslat kopii zprávy na můj e-mail',
-'emailccsubject' => 'Kopie Vaší zprávy pro uživatele $1: $2',
-'emailsent' => 'Zpráva odeslána',
-'emailsenttext' => 'Váš e-mail byl odeslán.',
-'emailuserfooter' => 'Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „Poslat e-mail“; odeslal ho uživatel $1 uživateli $2',
+'usermailererror' => 'Chyba poštovního programu:',
+'defemailsubject' => 'E-mail z {{grammar:2sg|{{SITENAME}}}}',
+'usermaildisabled' => 'Posílání e-mailů je vypnuto',
+'usermaildisabledtext' => 'Nemáte oprávnění odesílat e-maily ostatním uživatelům této wiki',
+'noemailtitle' => 'Bez e-mailové adresy',
+'noemailtext' => 'Tento uživatel nezadal platnou e-mailovou adresu.',
+'nowikiemailtitle' => 'E-mail není povolen',
+'nowikiemailtext' => 'Tento uživatel si nepřeje dostávat e-maily od ostatních uživatelů.',
+'email-legend' => 'Odeslání e-mailu jinému uživateli {{GRAMMAR:2sg|{{SITENAME}}}}',
+'emailfrom' => 'Od:',
+'emailto' => 'Komu:',
+'emailsubject' => 'Předmět:',
+'emailmessage' => 'Zpráva:',
+'emailsend' => 'Odeslat',
+'emailccme' => 'Poslat kopii zprávy na můj e-mail',
+'emailccsubject' => 'Kopie Vaší zprávy pro uživatele $1: $2',
+'emailsent' => 'Zpráva odeslána',
+'emailsenttext' => 'Váš e-mail byl odeslán.',
+'emailuserfooter' => 'Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „Poslat e-mail“; odeslal ho uživatel $1 uživateli $2',
+
+# User Messenger
+'usermessage-summary' => 'DoruÄena zpráva od systému.',
+'usermessage-editor' => 'Systémový poslíÄek',
# Watchlist
'watchlist' => 'Sledované stránky',
'mywatchlist' => 'Sledované stránky',
-'watchlistfor' => "(uživatele '''$1''')",
+'watchlistfor2' => '{{GENDER:$1|Uživatele|Uživatelky|Uživatele}} $1 $2',
'nowatchlist' => 'Na svém seznamu sledovaných stránek nemáte žádné položky.',
'watchlistanontext' => 'Pro prohlížení Äi úpravu seznamu sledovaných stránek se musíte $1.',
'watchnologin' => 'Nejste přihlášen(a)',
@@ -2148,11 +2204,15 @@ Uživatele, který změnu provedl, můžete kontaktovat:
e-mailem: $PAGEEDITOR_EMAIL
na wiki: $PAGEEDITOR_WIKI
-Dokud stránku nenavštívíte, nebudou vám zasílána další oznámení o změnách této stránky, případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.
+Dokud stránku nenavštívíte, nebudou vám zasílána další oznámení o změnách této stránky.
+Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.
S pozdravem váš zasílaÄ hlášení {{grammar:2sg|{{SITENAME}}}}
--
+Změnit nastavení e-mailových oznámení můžete na
+{{fullurl:{{#special:Preferences}}}}
+
Nastavení sledovaných stránek může změnit na
{{fullurl:Special:Watchlist/edit}}
@@ -2206,7 +2266,10 @@ Poslední editaci této stránky provedl(a) [[User:$3|$3]] ([[User talk:$3|disku
'revertpage' => 'Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“',
'revertpage-nouser' => 'Editace uživatele (uživatelské jméno skryto) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“',
'rollback-success' => 'Editace uživatele $1 byla vrácena na poslední verzi od uživatele $2.',
-'sessionfailure' => 'Zřejmě je nějaký problém s vaším přihlášením;
+
+# Edit tokens
+'sessionfailure-title' => 'Chyba sezení',
+'sessionfailure' => 'Zřejmě je nějaký problém s vaším přihlášením;
vámi požadovaná Äinnost byla stornována jako prevence pÅ™ed neoprávnÄ›ným přístupem.
StisknÄ›te tlaÄítko „zpÄ›t“, obnovte stránku, ze které jste pÅ™iÅ¡li a zkuste Äinnost znovu.',
@@ -2331,18 +2394,22 @@ $1',
'month' => 'Do měsíce:',
'year' => 'Do roku:',
-'sp-contributions-newbies' => 'Zobrazit příspÄ›vky novÄ› založených úÄtů',
-'sp-contributions-newbies-sub' => 'Noví uživatelé',
-'sp-contributions-newbies-title' => 'Příspěvky nových uživatelů',
-'sp-contributions-blocklog' => 'kniha zablokování',
-'sp-contributions-deleted' => 'smazané editace uživatele',
-'sp-contributions-logs' => 'protokolovací záznamy',
-'sp-contributions-talk' => 'diskuse',
-'sp-contributions-userrights' => 'správa uživatelských práv',
-'sp-contributions-blocked-notice' => 'Tento uživatel je momentálně zablokován. Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
-'sp-contributions-search' => 'Zobrazení příspěvků',
-'sp-contributions-username' => 'IP adresa nebo uživatelské jméno:',
-'sp-contributions-submit' => 'Zobrazit',
+'sp-contributions-newbies' => 'Zobrazit příspÄ›vky novÄ› založených úÄtů',
+'sp-contributions-newbies-sub' => 'Noví uživatelé',
+'sp-contributions-newbies-title' => 'Příspěvky nových uživatelů',
+'sp-contributions-blocklog' => 'kniha zablokování',
+'sp-contributions-deleted' => 'smazané editace uživatele',
+'sp-contributions-uploads' => 'naÄtené soubory',
+'sp-contributions-logs' => 'protokolovací záznamy',
+'sp-contributions-talk' => 'diskuse',
+'sp-contributions-userrights' => 'správa uživatelských práv',
+'sp-contributions-blocked-notice' => 'Tento uživatel je momentálně zablokován. Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
+'sp-contributions-blocked-notice-anon' => 'Tato IP adresa je momentálně zablokována.
+Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
+'sp-contributions-search' => 'Zobrazení příspěvků',
+'sp-contributions-username' => 'IP adresa nebo uživatelské jméno:',
+'sp-contributions-toponly' => 'Zobrazit pouze aktuální revize',
+'sp-contributions-submit' => 'Zobrazit',
# What links here
'whatlinkshere' => 'Odkazuje sem',
@@ -2403,7 +2470,6 @@ Můžete si prohlédnout [[Special:IPBlockList|seznam zablokovaných uživatelů
'ipb-edit-dropdown' => 'Editace seznamu důvodů zablokování',
'ipb-unblock-addr' => 'Odblokovat uživatele nebo IP $1',
'ipb-unblock' => 'Odblokovat uživatele nebo IP adresu',
-'ipb-blocklist-addr' => 'Probíhající bloky uživatele $1',
'ipb-blocklist' => 'Zobrazit probíhající bloky',
'ipb-blocklist-contribs' => 'Příspěvky uživatele $1',
'unblockip' => 'Odblokovat uživatele',
@@ -2471,6 +2537,8 @@ $1 je již zablokován(a). Chcete změnit nastavení bloku?',
'sorbs_create_account_reason' => 'VaÅ¡e IP adresa je uvedena na seznamu DNSBL jako otevÅ™ený proxy server. Z této adresy si nemůžete založit úÄet',
'cant-block-while-blocked' => 'Nemůžete blokovat jiné uživatele, když jste zablokován(a).',
'cant-see-hidden-user' => 'Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.',
+'ipbblocked' => 'Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}',
+'ipbnounblockself' => 'Nemáte dovoleno odblokovat {{GENDER:|sám|sama|sám}} sebe',
# Developer tools
'lockdb' => 'Zamknout databázi',
@@ -2504,6 +2572,16 @@ To znamená, že stránku můžete přesunout zpět na původní název, pokud u
'''Upozornění!'''
PÅ™ejmenování oblíbené stránky může být drastická a neÄekaná zmÄ›na; ujistÄ›te se, prosím, že chápete důsledky svého kroku pÅ™ed tím, než zmÄ›nu provedete.",
+'movepagetext-noredirectfixer' => "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.
+Původní název se stane přesměrováním na nový název.
+Nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.
+Je na vaší zodpovědnosti zajistit, aby odkazy stále vedly tam, kam mají.
+
+Stránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.
+To znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.
+
+'''Upozornění!'''
+PÅ™ejmenování oblíbené stránky může být drastická a neÄekaná zmÄ›na; ujistÄ›te se, prosím, že chápete důsledky svého kroku pÅ™ed tím, než zmÄ›nu provedete.",
'movepagetalktext' => "PÅ™idružená diskusní stránka, pokud existuje, bude automaticky pÅ™esunuta spoleÄnÄ› se stránkou, '''pokud:'''
* Dosud neexistuje neprázdná diskusní stránka pod novým jménem a
* nezrušíte křížek ve formuláři.
@@ -2558,6 +2636,7 @@ Cílová stránka „[[:$1]]“ již existuje. Přejete si ji smazat pro uvolně
'immobile-source-page' => 'Tuto stránku nelze přesouvat.',
'immobile-target-page' => 'Stránku nelze přesunout na zadaný název.',
'imagenocrossnamespace' => 'Nelze přesunout mimo jmenný prostor Soubor:',
+'nonfile-cannot-move-to-file' => 'Do jmenného prostoru {{ns:file}} nelze přesouvat stránky nepřináležející k souboru',
'imagetypemismatch' => 'Nová přípona souboru neodpovídá jeho typu',
'imageinvalidfilename' => 'Název cílového souboru není platný',
'fix-double-redirects' => 'Opravit všechna přesměrování směřující na původní název',
@@ -2635,6 +2714,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'importstart' => 'Stránky se importují…',
'import-revision-count' => '$1 {{PLURAL:$1|revize|revize|revizí}}',
'importnopages' => 'Není co importovat.',
+'imported-log-entries' => '{{PLURAL:$1|Naimportován 1 protokolovací záznam|Naimportovány $1 protokolovací záznamy|Naimportováno $1 protokolovacích záznamů}}.',
'importfailed' => 'Import selhal: $1',
'importunknownsource' => 'Neznámý typ zdroje importu',
'importcantopen' => 'Nepodařilo se otevřít importní soubor',
@@ -2727,6 +2807,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'tooltip-upload' => 'Odesílání souboru',
'tooltip-rollback' => '„Vrácení zpět“ jedním kliknutím zruší všechny editace provedené posledním uživatelem.',
'tooltip-undo' => '„Zrušit editaci“ otevře okno editace, které neobsahuje změny provedené v rušené editaci. Je možné doplnit zdůvodnění do shrnutí editace.',
+'tooltip-preferences-save' => 'Uložit nastavení',
+'tooltip-summary' => 'Zadejte struÄné shrnutí',
# Stylesheets
'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
@@ -2857,14 +2939,17 @@ OtevÅ™ením souboru můžete ohrozit svůj poÄítaÄ.",
''(na stránce s popisem souboru)''",
'thumbsize' => 'Velikost náhledu:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|stránka|stránky|stránek}}',
-'file-info' => '(velikost souboru: $1, MIME typ: $2)',
-'file-info-size' => '(rozměr: $1 × $2 pixelů, velikost souboru: $3, MIME typ: $4)',
+'file-info' => 'velikost souboru: $1, MIME typ: $2',
+'file-info-size' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4',
'file-nohires' => '<small>Větší rozlišení není k dispozici.</small>',
-'svg-long-desc' => '(soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3)',
+'svg-long-desc' => 'soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
'show-big-image' => 'Obrázek ve vyšším rozlišení',
'show-big-image-thumb' => '<small>Velikost tohoto náhledu je: $1 × $2 pixelů</small>',
'file-info-gif-looped' => 've smyÄce',
'file-info-gif-frames' => '$1 {{PLURAL:$1|snímek|snímky|snímků}}',
+'file-info-png-looped' => 've smyÄce',
+'file-info-png-repeat' => 'opakováno $1{{PLURAL:$1|krát|krát}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|snímek|snímky|snímků}}',
# Special:NewFiles
'newimages' => 'Galerie nových souborů',
@@ -3016,6 +3101,7 @@ Obsahuje pouze seznam s odrážkami (řádka zaÄíná s *). První odkaz na Å™Ã
'exif-gpsareainformation' => 'OznaÄení GPS oblasti',
'exif-gpsdatestamp' => 'Datum podle GPS',
'exif-gpsdifferential' => 'Diferenciální korekce GPS',
+'exif-objectname' => 'Krátký název',
# EXIF attributes
'exif-compression-1' => 'Nekomprimovaný',
@@ -3175,25 +3261,25 @@ Obsahuje pouze seznam s odrážkami (řádka zaÄíná s *). První odkaz na Å™Ã
'limitall' => 'vše',
# E-mail address confirmation
-'confirmemail' => 'Potvrzení e-mailové adresy',
-'confirmemail_noemail' => 'Ve svém [[Special:Preferences|uživatelském nastavení]] jste nezadali platnou e-mailovou adresu.',
-'confirmemail_text' => 'Tato wiki vyžaduje, abyste pÅ™ed využíváním nÄ›kterých funkcí potvrdili svoji e-mailovou adresu. Kliknutím na tlaÄítko níže odeÅ¡lete potvrzovací e-mail na vámi uvedenou adresu. Tento e-mail obsahuje odkaz a potvrzovací kód; zobrazením odkazované stránky ve svém internetovém prohlížeÄi potvrdíte, že zadaná adresa je platná.',
-'confirmemail_pending' => 'Potvrzovací kód vám byl již zaslán na váš e-mail.
+'confirmemail' => 'Potvrzení e-mailové adresy',
+'confirmemail_noemail' => 'Ve svém [[Special:Preferences|uživatelském nastavení]] jste nezadali platnou e-mailovou adresu.',
+'confirmemail_text' => 'Tato wiki vyžaduje, abyste pÅ™ed využíváním nÄ›kterých funkcí potvrdili svoji e-mailovou adresu. Kliknutím na tlaÄítko níže odeÅ¡lete potvrzovací e-mail na vámi uvedenou adresu. Tento e-mail obsahuje odkaz a potvrzovací kód; zobrazením odkazované stránky ve svém internetovém prohlížeÄi potvrdíte, že zadaná adresa je platná.',
+'confirmemail_pending' => 'Potvrzovací kód vám byl již zaslán na váš e-mail.
Pokud jste si úÄet založili pÅ™ed chvílí, zkuste na doruÄení kódu nÄ›kolik minut poÄkat, než požádáte o nový.',
-'confirmemail_send' => 'Odeslat potvrzovací kód',
-'confirmemail_sent' => 'Potvrzovací e-mail byl odeslán',
-'confirmemail_oncreate' => 'Na vaši e-mailovou adresu byl zaslán potvrzovací kód.
+'confirmemail_send' => 'Odeslat potvrzovací kód',
+'confirmemail_sent' => 'Potvrzovací e-mail byl odeslán',
+'confirmemail_oncreate' => 'Na vaši e-mailovou adresu byl zaslán potvrzovací kód.
Tento kód není zapotřebí k přihlášení, ale budete ho potřebovat k aktivaci některých funkcí založených na využití e-mailu.',
-'confirmemail_sendfailed' => '{{GRAMMAR:3sg|{{SITENAME}}}} se nepodařilo odeslat potvrzovací e-mail. Zkontrolujte, zda e-mailová adresa neobsahuje chybné znaky.
+'confirmemail_sendfailed' => '{{GRAMMAR:3sg|{{SITENAME}}}} se nepodařilo odeslat potvrzovací e-mail. Zkontrolujte, zda e-mailová adresa neobsahuje chybné znaky.
Poštovní program hlásí: $1',
-'confirmemail_invalid' => 'Neplatný potvrzovací kód. Možná již vypršela platnost kódu.',
-'confirmemail_needlogin' => 'Pro potvrzení své e-mailové adresy se musíte $1.',
-'confirmemail_success' => 'Vaše e-mailová adresa byla potvrzena. Nyní se můžete přihlásit a používat wiki.',
-'confirmemail_loggedin' => 'Vaše e-mailová adresa byla potvrzena.',
-'confirmemail_error' => 'Nepodařilo se uložit vaše potvrzení.',
-'confirmemail_subject' => 'Potvrzení e-mailové adresy pro {{grammar:4sg|{{SITENAME}}}}',
-'confirmemail_body' => 'NÄ›kdo (patrnÄ› vy, z IP adresy $1) si registroval úÄet se jménem "$2" a touto e-mailovou adresou na {{grammar:6sg|{{SITENAME}}}}.
+'confirmemail_invalid' => 'Neplatný potvrzovací kód. Možná již vypršela platnost kódu.',
+'confirmemail_needlogin' => 'Pro potvrzení své e-mailové adresy se musíte $1.',
+'confirmemail_success' => 'Vaše e-mailová adresa byla potvrzena. Nyní se můžete přihlásit a používat wiki.',
+'confirmemail_loggedin' => 'Vaše e-mailová adresa byla potvrzena.',
+'confirmemail_error' => 'Nepodařilo se uložit vaše potvrzení.',
+'confirmemail_subject' => 'Potvrzení e-mailové adresy pro {{grammar:4sg|{{SITENAME}}}}',
+'confirmemail_body' => 'NÄ›kdo (patrnÄ› vy, z IP adresy $1) si registroval úÄet se jménem "$2" a touto e-mailovou adresou na {{grammar:6sg|{{SITENAME}}}}.
Pokud si pÅ™ejete aktivovat e-mailové funkce na {{grammar:6sg|{{SITENAME}}}}, tak pro potvrzení, že tato adresa opravdu patří vám, pÅ™ejdÄ›te svým internetovým prohlížeÄem na následující adresu:
@@ -3204,8 +3290,38 @@ Pokud jste o toto potvrzení *nežádali*, kliknÄ›te na následující odkaz, Ä
$5
Platnost tohoto potvrzovacího kódu vyprší $4.',
-'confirmemail_invalidated' => 'Potvrzení e-mailové adresy bylo zrušeno',
-'invalidateemail' => 'Zrušit potvrzení e-mailové adresy',
+'confirmemail_body_changed' => 'Někdo (patrně vy, z IP adresy $1)
+zmÄ›nil e-mailovou adresu k úÄtu "$2" na {{grammar:6sg|{{SITENAME}}}} na tuto adresu.
+
+Pokud si přejete aktivovat e-mailové funkce na {{grammar:6sg|{{SITENAME}}}},
+tak pro potvrzení, že tato adresa opravdu patří vám, přejděte svým
+internetovým prohlížeÄem na následující adresu:
+
+$3
+
+Pokud jste o toto potvrzení *nežádali*, klikněte na následující odkaz,
+Äímž potvrzení zrušíte:
+
+$5
+
+Platnost tohoto potvrzovacího kódu vyprší $4.',
+'confirmemail_body_set' => 'Někdo (patrně vy, z IP adresy $1) nastavil e-mailovou adresu
+úÄtu „$2“ na {{grammar:6sg|{{SITENAME}}}} na tuto adresu.
+
+Pokud si přejete znovu aktivovat e-mailové funkce na
+{{grammar:6sg|{{SITENAME}}}}, tak pro potvrzení, že tato adresa opravdu
+patří vám, pÅ™ejdÄ›te svým internetovým prohlížeÄem na následující adresu:
+
+$3
+
+Pokud vám tento úÄet *nepatří*, kliknÄ›te na následující
+odkaz, Äímž potvrzení zrušíte:
+
+$5
+
+Platnost tohoto potvrzovacího kódu vyprší $4.',
+'confirmemail_invalidated' => 'Potvrzení e-mailové adresy bylo zrušeno',
+'invalidateemail' => 'Zrušit potvrzení e-mailové adresy',
# Scary transclusion
'scarytranscludedisabled' => '[Vkládání šablon mezi wiki je vypnuto]',
@@ -3248,6 +3364,7 @@ Opravdu si přejete znovu tuto stránku založit?',
'table_pager_first' => 'První stránka',
'table_pager_last' => 'Poslední stránka',
'table_pager_limit' => 'Zobrazit $1 položek na stránku',
+'table_pager_limit_label' => 'Položek na stránce:',
'table_pager_limit_submit' => 'Zobrazit',
'table_pager_empty' => 'Nic nebylo nalezeno',
@@ -3361,6 +3478,7 @@ Seznam editovaných stránek můžete také [[Special:Watchlist/edit|editovat ve
'version-specialpages' => 'Speciální stránky',
'version-parserhooks' => 'Přípojné body parseru',
'version-variables' => 'Proměnné',
+'version-skins' => 'Vzhledy',
'version-other' => 'Jiné',
'version-mediahandlers' => 'Obsluha médií',
'version-hooks' => 'Přípojné body',
@@ -3372,6 +3490,13 @@ Seznam editovaných stránek můžete také [[Special:Watchlist/edit|editovat ve
'version-hook-subscribedby' => 'Volán z',
'version-version' => '(Verze $1)',
'version-license' => 'Licence',
+'version-poweredby-credits' => "Tato wiki běží na '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'další',
+'version-license-info' => 'MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buÄ verze 2 této licence anebo (podle vaÅ¡eho uvážení) kterékoli pozdÄ›jší verze.
+
+MediaWiki je distribuována v nadÄ›ji, že bude užiteÄná, avÅ¡ak BEZ JAKÉKOLI ZÃRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URÄŒITà ÚČEL. Podrobnosti se doÄtete v textu GNU General Public License.
+
+[{{SERVER}}{{SCRIPTPATH}}/COPYING Kopii GNU General Public License] jste mÄ›li obdržet spolu s tímto programem, pokud ne, napiÅ¡te na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html si ji pÅ™eÄtÄ›te online].',
'version-software' => 'Nainstalovaný software',
'version-software-product' => 'Název',
'version-software-version' => 'Verze',
@@ -3441,6 +3566,15 @@ Zadejte jméno souboru bez oznaÄení "{{ns:file}}:".',
'tags-edit' => 'editovat',
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změny|změn}}',
+# Special:ComparePages
+'comparepages' => 'Porovnání stránek',
+'compare-selector' => 'Porovnání revizí stránek',
+'compare-page1' => 'Stránka 1',
+'compare-page2' => 'Stránka 2',
+'compare-rev1' => 'Revize 1',
+'compare-rev2' => 'Revize 2',
+'compare-submit' => 'Porovnat',
+
# Database error messages
'dberr-header' => 'Tato wiki má nějaké potíže',
'dberr-problems' => 'Promiňte! Tento server má v tuto chvíli technické problémy.',
@@ -3457,8 +3591,13 @@ Zadejte jméno souboru bez oznaÄení "{{ns:file}}:".',
'htmlform-float-invalid' => 'Uvedená hodnota není Äíslo.',
'htmlform-int-toolow' => 'Vámi zadaná hodnota je menší než dovolené minimum $1',
'htmlform-int-toohigh' => 'Vámi zadaná hodnota je větší než dovolené maximum $1',
+'htmlform-required' => 'Tato položka je povinná',
'htmlform-submit' => 'Odeslat',
'htmlform-reset' => 'Vrátit změny',
'htmlform-selectorother-other' => 'Jiná hodnota',
+# SQLite database support
+'sqlite-has-fts' => '$1 s podporou plnotextového vyhledávání',
+'sqlite-no-fts' => '$1 bez podpory plnotextového vyhledávání',
+
);
diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php
index dd78a347..fc006ada 100644
--- a/languages/messages/MessagesCsb.php
+++ b/languages/messages/MessagesCsb.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Iketsi
* @author Kaszeba
* @author Kuvaly
* @author Leinad
@@ -15,6 +16,8 @@
* @author לערי ריינה×רט
*/
+$fallback = 'pl';
+
$namespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Specjalnô',
@@ -50,8 +53,7 @@ $messages = array(
'tog-editsection' => 'Włączô edicëjã dzélów starnë przez lënczi [edicëjô]',
'tog-editsectiononrightclick' => 'Włączë edicëjã sekcëji bez klëkniãcé prawą knąpą mëszë<br />na titlu sekcëji (JavaScript)',
'tog-showtoc' => 'Pòkażë spisënk zamkłoscë (dlô starnów z wicy jak 3 nôgłówkama)',
-'tog-rememberpassword' => 'Wdôrzë mòjé miono brëkòwnika na tim kòmpùtrze',
-'tog-editwidth' => 'Kastka edicëji mô fùl szérz',
+'tog-rememberpassword' => 'Spamiãtôj mòją parolã na tim kòmpùtrze (maksymalno przez $1 {{PLURAL:$1|dzéń|dni|dniów}})',
'tog-watchcreations' => 'Dodôwôj starnë, chtërné ùsôdzã, do mòji lëstë ùzérónëch artiklów',
'tog-watchdefault' => 'Dodôwôj starnë, chtërné editëjã do mòji lëstë ùzérónëch artiklów',
'tog-watchmoves' => 'Dodôwôj starnë jaczé przenoszã do mòji lëstë ùzérónëch artiklów',
@@ -186,31 +188,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Dodôj témã',
-'vector-action-delete' => 'Rëmôj',
-'vector-action-move' => 'Przeniesë',
-'vector-action-protect' => 'Zazychrëjë',
-'vector-action-undelete' => 'Doprowôdzë nazôd',
-'vector-action-unprotect' => 'Òdzychrëjë',
-'vector-namespace-category' => 'Kategòrëjô',
-'vector-namespace-help' => 'Pòmòc',
-'vector-namespace-image' => 'Lopk',
-'vector-namespace-main' => 'Artikel',
-'vector-namespace-media' => 'Starna lopka',
-'vector-namespace-mediawiki' => 'Wiadło',
-'vector-namespace-project' => 'Starna ùdbë',
-'vector-namespace-special' => 'Specjalnô starna',
-'vector-namespace-talk' => 'Diskùsëjô',
-'vector-namespace-template' => 'Szablóna',
-'vector-namespace-user' => 'Starna brëkòwnika',
-'vector-view-create' => 'Ùsôdzë',
-'vector-view-edit' => 'Edicëjô',
-'vector-view-history' => 'Historëjô lopka',
-'vector-view-view' => 'Czëtôj',
-'vector-view-viewsource' => 'Zdrojowi tekst',
-'actions' => 'Dzéjania',
-'namespaces' => 'Rum mionów:',
-'variants' => 'Wariantë',
+'vector-action-addsection' => 'Dodôj témã',
+'vector-action-delete' => 'Rëmôj',
+'vector-action-move' => 'Przeniesë',
+'vector-action-protect' => 'Zazychrëjë',
+'vector-action-undelete' => 'Doprowôdzë nazôd',
+'vector-action-unprotect' => 'Òdzychrëjë',
+'vector-simplesearch-preference' => 'Włączë awansowóné pòdpòwiescë szëkbë (blós dlô skórczi Wektor)',
+'vector-view-create' => 'Ùsôdzë',
+'vector-view-edit' => 'Edicëjô',
+'vector-view-history' => 'Historëjô lopka',
+'vector-view-view' => 'Czëtôj',
+'vector-view-viewsource' => 'Zdrojowi tekst',
+'actions' => 'Dzéjania',
+'namespaces' => 'Rum mionów:',
+'variants' => 'Wariantë',
'errorpagetitle' => 'Fela',
'returnto' => 'Nazôd do starnë $1.',
@@ -275,7 +267,7 @@ $messages = array(
'currentevents' => 'Aktualné wëdarzenia',
'currentevents-url' => 'Project:Aktualné wëdarzenia',
'disclaimers' => 'Prawné zastrzedżi',
-'disclaimerpage' => 'Project:General_disclaimer',
+'disclaimerpage' => 'Project:Prawné zastrzedżi',
'edithelp' => 'Pòmòc do edicëji',
'edithelppage' => 'Help:Editowanié starnë',
'helppage' => 'Help:Spisënk zamkłoscë',
@@ -329,7 +321,7 @@ $messages = array(
'nstab-special' => 'Specjalnô starna',
'nstab-project' => 'meta-starna',
'nstab-image' => 'Òbrôzk',
-'nstab-mediawiki' => 'ògłosënk',
+'nstab-mediawiki' => 'Òłosënk',
'nstab-template' => 'Szablóna',
'nstab-help' => 'Pòmòc',
'nstab-category' => 'Kategòrëjô',
@@ -376,7 +368,7 @@ Nie zbëjë zmienic swòjich nastôwów na [[Special:Preferences|{{SITENAME}}]].
'yourname' => 'Miono brëkòwnika',
'yourpassword' => 'Twòja parola',
'yourpasswordagain' => 'Pòwtórzë parolã',
-'remembermypassword' => 'Wdôrzë mòjé miono brëkòwnika na tim kòmpùtrze',
+'remembermypassword' => 'Spamiãtôj mòją parolã na tim kòmpùtrze (maksymalno przez $1 {{PLURAL:$1|dzéń|dni|dniów}})',
'yourdomainname' => 'Twòjô domena',
'login' => 'Wlogùjë mie',
'nav-login-createaccount' => 'Logòwanié',
@@ -556,23 +548,27 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
'history-feed-item-nocomment' => '$1 ò $2',
# Revision deletion
-'rev-delundel' => 'pòkażë/zatacë',
-'revdelete-radio-set' => 'Jo',
-'revdelete-radio-unset' => 'Nié',
-'revdel-restore' => 'Zjinaczë widzawnotã',
-'pagehist' => 'Historëjô starnë',
-'deletedhist' => 'Rëmniãtô historëjô edicëji',
-'revdelete-content' => 'zamkłosc',
-'revdelete-summary' => 'òpisënk zjinaczi',
-'revdelete-uname' => 'miono brëkòwnika',
-'revdelete-restricted' => 'nastôwi ògrańczenia dlô sprôwników',
-'revdelete-unrestricted' => 'rëmôj ògrańczenia dlô sprôwników',
-'revdelete-hid' => 'zatacë $1',
-'revdelete-unhid' => 'nie tacë $1',
-'revdelete-log-message' => '$1 - $2 {{PLURAL:$2|wersëjô|wersëji}}',
-'logdelete-log-message' => '$1 – $2 {{PLURAL:$2|zdarzenié|zdarzenia|zdarzeniów}}',
-'revdelete-hide-current' => 'Pòkôza sã fela przë taceniu wersëji datowóny na $2, $1. To je nônowszô wersëjô starnë, chtërnô ni mòże bëc zataconô.',
-'revdelete-show-no-access' => 'Pòkôza sã fela przë próbie wëskrzënieniô elementu datowónegò na $2, $1. Widzawnota negò elementu òsta ògrańczonô - ni môsz przëstãpù.',
+'rev-delundel' => 'pòkażë/zatacë',
+'rev-showdeleted' => 'pokôż',
+'revdelete-show-file-submit' => 'Jo',
+'revdelete-radio-set' => 'Jo',
+'revdelete-radio-unset' => 'Nié',
+'revdel-restore' => 'Zjinaczë widzawnotã',
+'revdel-restore-deleted' => 'rëmniãté wersëje',
+'revdel-restore-visible' => 'widzawné wersëje',
+'pagehist' => 'Historëjô starnë',
+'deletedhist' => 'Rëmniãtô historëjô edicëji',
+'revdelete-content' => 'zamkłosc',
+'revdelete-summary' => 'òpisënk zjinaczi',
+'revdelete-uname' => 'miono brëkòwnika',
+'revdelete-restricted' => 'nastôwi ògrańczenia dlô sprôwników',
+'revdelete-unrestricted' => 'rëmôj ògrańczenia dlô sprôwników',
+'revdelete-hid' => 'zatacë $1',
+'revdelete-unhid' => 'nie tacë $1',
+'revdelete-log-message' => '$1 - $2 {{PLURAL:$2|wersëjô|wersëji}}',
+'logdelete-log-message' => '$1 – $2 {{PLURAL:$2|zdarzenié|zdarzenia|zdarzeniów}}',
+'revdelete-hide-current' => 'Pòkôza sã fela przë taceniu wersëji datowóny na $2, $1. To je nônowszô wersëjô starnë, chtërnô ni mòże bëc zataconô.',
+'revdelete-show-no-access' => 'Pòkôza sã fela przë próbie wëskrzënieniô elementu datowónegò na $2, $1. Widzawnota negò elementu òsta ògrańczonô - ni môsz przëstãpù.',
# Merge log
'revertmerge' => 'Rozdzélë',
@@ -595,6 +591,7 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
'prevn' => 'wczasniészé {{PLURAL:$1|$1}}',
'nextn' => 'nôslédné {{PLURAL:$1|$1}}',
'viewprevnext' => 'Òbaczë ($1 {{int:pipe-separator}} $2) ($3).',
+'searchprofile-advanced' => 'Awansowóné',
'search-result-size' => '$1 ({{PLURAL:$2|1 słowò|$2 słowa|$2 słów}})',
'search-redirect' => '(przeczérowanié $1)',
'search-section' => '(dzél $1)',
@@ -604,6 +601,7 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
'search-interwiki-more' => '(wicy)',
'search-mwsuggest-enabled' => 'z sugestëjama',
'search-mwsuggest-disabled' => 'bez sugestëjów',
+'searchall' => 'wszëtczé',
'nonefound' => "'''Bôczënk''':Dlô szëkbë są domëslno przistãpné blós niejedné rumë mionów.
Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów (zamëkający w se starnë diskùsëji, szablónë, ëtp), abò ùżëje przëdôwka wëbrónegò ruma mionów.",
'powersearch' => 'Szëkba',
@@ -670,6 +668,7 @@ Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów
'prefs-files' => 'Lopczi',
'prefs-custom-css' => 'swój CSS',
'prefs-custom-js' => 'swój JavaScript',
+'prefs-common-css-js' => 'Wespólny CSS/JS dlô wszëtczich skórków:',
'prefs-reset-intro' => 'Na ti starnie mòże doprowôdzëc nazôd domëslné nastôwë dlô ti starnë.
Negò dzéjaniô ni mòżé pòzdze ju copnąc.',
'prefs-emailconfirm-label' => 'Pòcwierdzenié e-mailowi adresë:',
@@ -753,6 +752,7 @@ Mòżesz zezwòlëc jinszim brëkòwniką na łączbã z Tobą przez Twòją sta
'recentchanges-legend' => 'Òptacëje slédnych zjinaków',
'recentchangestext' => 'Na starna prezentérëje historëjã slédnëch edicëjów w {{SITENAME}}.',
'recentchanges-feed-description' => 'Pòdstrzegô slédny zmianë w tim pòwrózkù.',
+'recentchanges-label-minor' => 'To je drobnô edicëjô',
'rcnote' => "Niżi {{PLURAL:$1|nachôdô sã '''1''' slédnô zjinaka zrobionô|nachôdają sã '''$1''' slédné zjinaczi zrobioné|nachôdô sã '''$1''' slédnych zjinaków zrobionëch}} w {{PLURAL:$2|slédnégò dnia|slédnych '''$2''' dniach}}, rëchùjąc òd $5 dnia $4.",
'rcnotefrom' => "Niżi są zmianë òd '''$2''' (pòkazóné do '''$1''').",
'rclistfrom' => 'Pòkażë nowé zmianë òd $1',
@@ -785,31 +785,31 @@ Starnë z [[Special:Watchlist|lëstë ùzérónëch artiklów]] są '''pògrëbi
'recentchangeslinked-to' => 'Wëskrzëni zjinaczi nié na lënkòwónëch starnach, blós na starnach lënkùjącëch do pòdóny starnë',
# Upload
-'upload' => 'Wladënk lopka',
-'uploadbtn' => 'Wladëjë lopk',
-'uploadnologin' => 'Felënk logòwaniô',
-'uploadtext' => "Brëkùjë negò fòrmùlara do wladënkù lopków.
+'upload' => 'Wladënk lopka',
+'uploadbtn' => 'Wladëjë lopk',
+'uploadnologin' => 'Felënk logòwaniô',
+'uploadtext' => "Brëkùjë negò fòrmùlara do wladënkù lopków.
Jeżlë chcesz przezdrzec abò szëkac w dotenczas wladowónëch lopkach, biéj do [[Special:FileList|lësta lopków]]. Kòżdi wladënk je registrowóny w [[Special:Log/upload|registrze wladënkù]], a rëmniãcé w [[Special:Log/delete|registrze rëmaniô]].
Abë dodac lopk do starnë, ùżëjë ùniższegò lënka wedle nôslédnëch mùstrów:
* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Lopk.jpg]]</nowiki></tt>''' wëskrzëni całi lopk
* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Lopk.png|200px|thumb|left|pòdpisënk òbrôzka]]</nowiki></tt>''' wëskrzëni z lewi starnë, przë ùbrzégù, miniaturkã w szérzë 200 pikslów w ramie, z nôdpisã 'pòdpisënk òbrôzka'
* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Lopk.ogg]]</nowiki></tt>''' òtemknie prosti lënk do lopka bez wëskrzënianiô sómegò lopka",
-'uploadlog' => 'Lësta wladënków',
-'uploadlogpage' => 'Dołączoné',
-'uploadlogpagetext' => 'Hewò je lësta slédno wladowónëch lopków.
+'uploadlog' => 'Lësta wladënków',
+'uploadlogpage' => 'Dołączoné',
+'uploadlogpagetext' => 'Hewò je lësta slédno wladowónëch lopków.
Wszëtczé gòdzënë tikają conë ùniwersalnégò czasë.',
-'filename' => 'Miono lopka',
-'filedesc' => 'Òpisënk',
-'fileuploadsummary' => 'Pòdrechòwanié:',
-'filesource' => 'Zdrój:',
-'uploadedfiles' => 'Wladowóné lopczi',
-'badfilename' => 'Miono òbrôzka zmienioné na "$1".',
-'successfulupload' => 'Wladënk darzëł sã',
-'uploadwarning' => 'Òstrzega ò wladënkù',
-'savefile' => 'Zapiszë lôpk',
-'uploadedimage' => 'wladënk: "$1"',
-'uploaddisabled' => 'Przeprôszómë! Mòżlëwòta wladënkù lopków na nen serwer òsta wëłączonô.',
+'filename' => 'Miono lopka',
+'filedesc' => 'Òpisënk',
+'fileuploadsummary' => 'Pòdrechòwanié:',
+'filesource' => 'Zdrój:',
+'uploadedfiles' => 'Wladowóné lopczi',
+'badfilename' => 'Miono òbrôzka zmienioné na "$1".',
+'uploadwarning' => 'Òstrzega ò wladënkù',
+'savefile' => 'Zapiszë lôpk',
+'uploadedimage' => 'wladënk: "$1"',
+'uploaddisabled' => 'Przeprôszómë! Mòżlëwòta wladënkù lopków na nen serwer òsta wëłączonô.',
+'upload-success-subj' => 'Wladënk darzëł sã',
# Special:ListFiles
'listfiles' => 'Lësta òbrôzków',
@@ -819,6 +819,7 @@ Wszëtczé gòdzënë tikają conë ùniwersalnégò czasë.',
'file-anchor-link' => 'Òbrôzk',
'filehist' => 'Historëjô lopka',
'filehist-help' => 'Klëkni na datum/czas, abë òbaczëc jak wëzdrzôł lopk w tim czasu.',
+'filehist-revert' => 'copnij',
'filehist-current' => 'aktualny',
'filehist-datetime' => 'Datum/Czas',
'filehist-thumb' => 'Miniatura',
@@ -936,7 +937,6 @@ Mòżesz zawãżëc wëszłosc przez wëbranié ôrtu registru, miona brëkòwni
# Watchlist
'watchlist' => 'Lësta ùzérónëch artiklów',
'mywatchlist' => 'Lësta ùzérónëch artiklów',
-'watchlistfor' => "(dlô '''$1''')",
'watchnologin' => 'Felënk logòwóniô',
'addedwatch' => 'Dodónô do lëstë ùzérónëch',
'addedwatchtext' => "Starna \"[[:\$1]]\" òsta dodónô do twòji [[Special:Watchlist|lëstë ùzérónëch artiklów]].
@@ -970,6 +970,7 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
'deletepage' => 'Rëmôj starnã',
'confirm' => 'Pòcwierdzë',
'excontent' => 'Zamkłosc starnë "$1"',
+'delete-legend' => 'Rëmôj',
'confirmdeletetext' => 'Chcesz rëmnąc starnã do grëpë z ji całowną historëją.
Ùgwësni sã, czë na gwës chcesz to zrobic, rozmiejąc kònsekwencëje ti òperacëji ë że robisz to zgòdno z [[{{MediaWiki:Policy-url}}|reglama]].',
'actioncomplete' => 'Òperacëjô wëkònónô',
@@ -1018,10 +1019,11 @@ Mòżesz zmienic légã zazychrowaniô, nie bãdze to równak miało cëskù na
'restriction-level' => 'Léga bezpieczi:',
# Undelete
-'viewdeletedpage' => 'Òbaczë rëmóne starnë',
-'undeletebtn' => 'Doprowôdzë nazôd',
-'undeletelink' => 'wëskrzëni abò doprowôdzë nazôd',
-'undeletedarticle' => 'dobëté nazôd "[[$1]]"',
+'viewdeletedpage' => 'Òbaczë rëmóne starnë',
+'undeletebtn' => 'Doprowôdzë nazôd',
+'undeletelink' => 'wëskrzëni abò doprowôdzë nazôd',
+'undeletedarticle' => 'dobëté nazôd "[[$1]]"',
+'undelete-show-file-submit' => 'Jo',
# Namespace form on various pages
'namespace' => 'Rum mionów:',
@@ -1040,7 +1042,7 @@ Mòżesz zmienic légã zazychrowaniô, nie bãdze to równak miało cëskù na
'sp-contributions-newbies' => 'Pòkażë edicëjã blós nowich brëkòwników',
'sp-contributions-newbies-sub' => 'Dlô nowich brëkòwników',
'sp-contributions-blocklog' => 'historëjô blokòwaniô',
-'sp-contributions-talk' => 'Diskùsëjô',
+'sp-contributions-talk' => 'diskùsëjô',
'sp-contributions-search' => 'Szëkba za edicëjama',
'sp-contributions-username' => 'Adresa IP abò miono brëkòwnika:',
'sp-contributions-submit' => 'Szëkôj',
@@ -1205,6 +1207,8 @@ Mòżesz òbaczëc ji zdrój.',
'tooltip-rollback' => '"Copni" jednym klëkniãcem copô wszëtczé zjinaczi zrëchtowóny na ti starnie przez slédno editëjãcegò',
'tooltip-undo' => '"anulëjë" copô nã edicëjã ë òtmëkô edicjowé òkno w tribie pòdzérkù.
Zezwôlô na dodanié przëczënë zjinaczi w òpisënkù.',
+'tooltip-preferences-save' => 'Zapiszë nastôwë',
+'tooltip-summary' => 'Wpiszë wãzłowati òpisënk',
# Attribution
'anonymous' => 'Anonimòwi {{PLURAL:$1|brëkòwnik|brëkòwnicë}} na {{SITENAME}}',
@@ -1234,8 +1238,9 @@ Zezwôlô na dodanié przëczënë zjinaczi w òpisënkù.',
# Media information
'imagemaxsize' => 'Ògrańczë na starnie òpisënkù òbrôzków jich miarã do:',
'thumbsize' => 'Miara miniaturków:',
-'file-info-size' => '($1 × $2 pikslów, miara lopka: $3, ôrt MIME: $4)',
+'file-info-size' => '$1 × $2 pikslów, miara lopka: $3, ôrt MIME: $4',
'file-nohires' => '<small>Felëje wikszô miara.</small>',
+'svg-long-desc' => 'Lopk SVG, nominalno $1 × $2 pikslów, miara lopka: $3',
'show-big-image' => 'Fùl miara',
'show-big-image-thumb' => '<small>Miara pòdzérkù: $1 × $2 pikslów</small>',
@@ -1277,10 +1282,14 @@ Jinszé pòla bãdą domëslno zataconé.
'watchlistall2' => 'wszëtczé',
'namespacesall' => 'wszëtczé',
'monthsall' => 'wszëtczé',
+'limitall' => 'wszëtczé',
# E-mail address confirmation
'confirmemail_loggedin' => 'Twòjô adresa e-mail òsta pòcwierdzona.',
+# action=purge
+'confirm_purge_button' => 'Jo!',
+
# Multipage image navigation
'imgmultigo' => 'Biéj!',
diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php
index f7df422e..08d3c32d 100644
--- a/languages/messages/MessagesCu.php
+++ b/languages/messages/MessagesCu.php
@@ -89,7 +89,7 @@ $linkTrail = '/^([a-zабвгдеєжѕзїіıићклмнопÑÑтѹфхѡѿÑ
$messages = array(
# Dates
-'sunday' => 'нєдѣÌлꙗ',
+'sunday' => 'нєдѣлꙗ',
'monday' => 'понедѣл҄ьникъ',
'tuesday' => 'въторьникъ',
'wednesday' => 'Ñрѣда',
@@ -103,35 +103,35 @@ $messages = array(
'thu' => 'ч҃т',
'fri' => 'п҃т',
'sat' => 'Ñ҃б',
-'january' => 'їаноуаÌрїи',
-'february' => 'февроуаÌрїи',
+'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' => 'дєкєÌмврїꙗ',
+'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' => 'маи',
+'may' => 'маїи',
'jun' => 'їо҃ун',
'jul' => 'їо҃ул',
'aug' => 'аѵ҃г',
@@ -141,575 +141,626 @@ $messages = array(
'dec' => 'дє҃к',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|КатигоріÌê™—|КатигоріÌи|КатигоріÌÑ©|КатигоріÌÑ©}}',
-'category_header' => 'катигоріÌÑ© â– $1 â– ÑтраниÌцѧ',
-'subcategories' => 'ÑоубкатигоріÌÑ©',
-'listingcontinuesabbrev' => '· вѧÌщє',
+'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
+'category_header' => 'катигорїѩ â– $1 â– Ñтраницѧ',
+'subcategories' => 'подъкатигорїѩ',
+'hidden-categories' => '{{PLURAL:$1|Ñъкрꙑта катигорїꙗ|Ñъкрꙑти катигорїи|Ñъкрꙑтꙑ катигорїѩ}}',
+'listingcontinuesabbrev' => '· вѧщє',
'linkprefix' => '/^(.*?)(„|«)$/sD',
-'about' => 'опьÑаÌниѥ',
-'article' => 'члѣÌнъ',
-'moredotdotdot' => 'вѧÌщє ···',
-'mypage' => 'Ð¼Ð¾ê™—Ì ÑтраниÌца',
-'mytalk' => 'Ð¼Ð¾ê™—Ì Ð±Ñ”ÑÑ£Ìда',
-'navigation' => 'плаÌваниѥ',
+'about' => 'опьÑаниѥ',
+'article' => 'члѣнъ',
+'newwindow' => '(иномь окънѣ)',
+'moredotdotdot' => 'вѧщє ···',
+'mypage' => 'моꙗ Ñтраница',
+'mytalk' => 'моꙗ бєÑѣда',
+'navigation' => 'плаваниѥ',
'and' => '&#32;и',
# Cologne Blue skin
-'qbedit' => 'иÑпраÌви',
+'qbedit' => 'иÑправи',
'qbpageoptions' => 'Ñи ÑтраниÌца',
-'qbmyoptions' => 'Ð¼Ð¾ê™—Ì ÑтраниÌцѧ',
-'qbspecialpages' => 'нароÌчьнꙑ ÑтраниÌцѧ',
+'qbmyoptions' => 'моꙗ Ñтраницѧ',
+'qbspecialpages' => 'нарочьнꙑ Ñтраницѧ',
# Vector skin
-'vector-action-delete' => 'поничьжєÌниѥ',
-'vector-action-move' => 'прѣимєноваÌниѥ',
-'vector-action-protect' => 'ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ìниѥ',
-'vector-action-unprotect' => 'поущєÌниѥ',
-'vector-namespace-category' => 'катигоріÌê™—',
-'vector-namespace-help' => 'поÌмощь',
-'vector-namespace-image' => 'дѣÌло',
-'vector-namespace-main' => 'члѣÌнъ',
-'vector-namespace-media' => 'ÑрѣÌдьÑтва',
-'vector-namespace-mediawiki' => 'напьÑаÌниѥ',
-'vector-namespace-project' => 'ÑъвѣÌÑ‚ÑŠ',
-'vector-namespace-special' => 'нароÌчьна',
-'vector-namespace-talk' => 'бєÑÑ£Ìда',
-'vector-namespace-template' => 'обраê™ÑŒÌць',
-'vector-namespace-user' => 'поÌльꙃєватєл҄ь',
-'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' => 'ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ìниѥ',
-'protectthispage' => 'Ñи ÑтраниÌцѧ ê™Ð°Ð±Ñ€Ð°Ð½Ñ”Ìниѥ',
-'unprotect' => 'поущєÌниѥ',
-'newpage' => 'ноÌва ÑтраниÌца',
-'talkpage' => 'Ñи ÑтраниÌцѧ бєÑÑ£Ìда',
-'talkpagelinktext' => 'бєÑÑ£Ìда',
-'specialpage' => 'нароÌчьна ÑтраниÌца',
-'personaltools' => 'Ð¼Ð¾ê™—Ì Ð¾Ñ€Ñ«Ìдиꙗ',
-'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' => 'Ñ—Ñторїꙗ',
+'info_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' => 'глаÌвьна ÑтраниÌца',
-'mainpage-description' => 'глаÌвьна ÑтраниÌца',
-'portal' => 'обьщєÌниꙗ ÑъвѣÌÑ‚ÑŠ',
-'portal-url' => 'Project:ОбьщєÌниꙗ ÑъвѣÌÑ‚ÑŠ',
-
+'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:Обьщєниꙗ Ñъвѣтъ',
+
+'retrievedfrom' => 'поѩто Ð¸ê™ â– $1 â–',
'youhavenewmessages' => '$1 тєбѣ напьÑанꙑ ÑÑ«Ñ‚ÑŠ ($2)',
-'newmessageslink' => 'ноÌви напьÌÑаниꙗ',
-'newmessagesdifflink' => 'поÑлѣÌдьнꙗ мѣÌна',
-'editsection' => 'иÑпраÌви',
-'editold' => 'иÑпраÌви',
-'viewsourceold' => 'ÑтраниÌцѧ иÑтоÌчьнъ оÌбраê™ÑŠ',
-'editlink' => 'иÑпраÌви',
-'viewsourcelink' => 'ÑтраниÌцѧ иÑтоÌчьнъ оÌбраê™ÑŠ',
-'editsectionhint' => 'иÑправлѥÌниѥ чѧÌÑти : $1',
-'toc' => 'катаÌлогъ',
-'showtoc' => 'виÌждь',
+'newmessageslink' => 'нови напьÑаниꙗ',
+'newmessagesdifflink' => 'поÑлѣдьнꙗ мѣна',
+'editsection' => 'иÑправи',
+'editold' => 'иÑправи',
+'viewsourceold' => 'Ñтраницѧ иÑточьнъ обраê™ÑŠ',
+'editlink' => 'иÑправи',
+'viewsourcelink' => 'Ñтраницѧ иÑточьнъ обраê™ÑŠ',
+'editsectionhint' => 'иÑправлѥниѥ чѧÑти : $1',
+'toc' => 'каталогъ',
+'showtoc' => 'виждь',
'hidetoc' => 'Ñъкрꙑи',
-'viewdeleted' => '$1 виÌдєти хоÌщєши ;',
-'red-link-title' => '$1 (Ñи ÑтраниÌцѧ нѣÌÑÑ‚ÑŠ)',
+'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-mediawiki' => 'напьÑаÌниѥ',
-'nstab-template' => 'обраê™ÑŒÌць',
-'nstab-help' => 'ÑтраниÌца поÌмощи',
-'nstab-category' => 'катигоріÌê™—',
+'nstab-main' => 'члѣнъ',
+'nstab-user' => 'польꙃєватєл҄ь',
+'nstab-media' => 'ÑрѣдьÑтва',
+'nstab-special' => 'нарочьна',
+'nstab-project' => 'Ñъвѣтъ',
+'nstab-image' => 'дѣло',
+'nstab-mediawiki' => 'напьÑаниѥ',
+'nstab-template' => 'обраê™ÑŒÑ†ÑŒ',
+'nstab-help' => 'Ñтраница помощи',
+'nstab-category' => 'катигорїꙗ',
# General errors
'error' => 'блаê™Ð½Ð°',
-'viewsource' => 'ÑтраниÌцѧ иÑтоÌчьнъ оÌбраê™ÑŠ',
+'viewsource' => 'Ñтраницѧ иÑточьнъ обраê™ÑŠ',
'viewsourcefor' => '$1 дѣлꙗ',
# Login and logout pages
-'yourname' => 'Ñ‚Ð²Ð¾Ñ¥Ì Ð¸Ìмѧ',
-'yourpassword' => 'Таино Ñлово напиши',
-'yourpasswordagain' => 'Опакы таиноѥ Ñлово напиши',
-'login' => 'Въниди',
-'nav-login-createaccount' => 'въниди / ÑÑŠê™Ð¸Ìжди Ñи мѣÌÑто',
-'userlogin' => 'въниди / ÑÑŠê™Ð¸Ìжди Ñи мѣÌÑто',
+'yourname' => 'твоѥ имѧ',
+'yourpassword' => 'таино Ñлово напиши',
+'yourpasswordagain' => 'опакꙑ таиноѥ Ñлово напиши',
+'login' => 'въниди',
+'nav-login-createaccount' => 'въниди / ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
+'userlogin' => 'въниди / ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
'userloginnocreate' => 'въниди',
-'logout' => 'иÑ̾хоÌдъ',
-'userlogout' => 'иÑ̾хоÌдъ',
-'nologinlink' => 'ÑÑŠê™Ð¸Ìжди Ñи мѣÌÑто',
-'createaccount' => 'ÑÑŠê™Ð¸Ìжди Ñи мѣÌÑто',
-'gotaccount' => "МѣÑто ти Ñ¥ÑÑ‚ÑŠ ли? '''$1'''.",
-'gotaccountlink' => 'Въниди',
-'userexists' => 'Ñѫщє поÌльꙃєватєлꙗ иÌмѧ пьÑа ♠ино иê™Ð¾Ð±Ñ€Ñ§Ñ‰Ð¸',
+'logout' => 'иÑ̾ходъ',
+'userlogout' => 'иÑ̾ходъ',
+'nologin' => 'мѣÑто ти нѣÑÑ‚ÑŠ ли ? $1',
+'nologinlink' => 'ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
+'createaccount' => 'ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
+'gotaccount' => 'мѣÑто ти Ñ¥ÑÑ‚ÑŠ ли? $1',
+'gotaccountlink' => 'въниди',
+'createaccountreason' => 'какъ ÑъмꙑÑлъ :',
+'userexists' => 'Ñѫщє польꙃєватєлꙗ имѧ пьÑа ♠ино иê™Ð¾Ð±Ñ€Ñ§Ñ‰Ð¸',
'loginerror' => 'въхода блаê™Ð½Ð°',
-'accountcreated' => 'мѣÌÑто ÑÑŠÑ‚Ð²Ð¾Ñ€Ñ”Ð½Ð¾Ì Ñ¥ÌÑÑ‚ÑŠ',
-'loginlanguagelabel' => 'Ñ©ê™ê™‘Ìкъ : $1',
+'accountcreated' => 'мѣÑто Ñътворєно Ñ¥ÑÑ‚ÑŠ',
+'loginlanguagelabel' => 'Ñ©ê™ê™‘къ : $1',
# Password reset dialog
-'resetpass' => 'таина ÑловєÑÑ” иê™Ð¼Ñ£Ð½Ñ¥Ìниѥ',
+'resetpass' => 'таина ÑловєÑÑ” иê™Ð¼Ñ£Ð½Ñ¥Ð½Ð¸Ñ¥',
'oldpassword' => 'Ñтаро таино Ñлово :',
'newpassword' => 'ново таино Ñлово :',
-'resetpass-submit-loggedin' => 'таина ÑловєÑÑ” иê™Ð¼Ñ£Ð½Ñ¥Ìниѥ',
+'resetpass-submit-loggedin' => 'таина ÑловєÑÑ” иê™Ð¼Ñ£Ð½Ñ¥Ð½Ð¸Ñ¥',
# Edit page toolbar
-'link_sample' => 'ÑъвѧÌê™Ð¸ иÌмѧ',
-'extlink_sample' => 'http://www.example.com ÑъвѧÌê™Ð¸ иÌмѧ',
+'link_sample' => 'Ñъвѧê™Ð¸ имѧ',
+'link_tip' => 'вънѫтрьнꙗ Ñъвѧê™ÑŒ',
+'extlink_sample' => 'http://www.example.com Ñъвѧê™Ð¸ имѧ',
+'extlink_tip' => 'вънѣщьнꙗ Ñъвѧê™ÑŒ (помьни о http://)',
'math_tip' => 'маѳиматїчьна формоула (LaTeX)',
-'sig_tip' => 'твои аѵтоÌграфъ и нꙑÌнѣшьна врѣÌмѧ и дьнь',
+'sig_tip' => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
# Edit pages
-'summary' => 'опьÑаÌниѥ :',
-'minoredit' => 'маÌлаꙗ мѣÌна',
-'watchthis' => 'Ñи ÑтраниÌцѧ блюдєÌниѥ',
-'savearticle' => 'ÑъхранѥÌниѥ',
-'showpreview' => 'мѣÌнꙑ поê™ÑŒÑ€Ñ£Ìниѥ (Ð±Ñ”ê™ ÑъхранѥÌниꙗ)',
-'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> можєши',
-'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 â– (чѧÌÑÑ‚ÑŒ)',
-'templatesused' => 'Ñѥѩ ÑтраниÌцѧ {{PLURAL:$1|ÑÑŒ обраê™ÑŒÌць поÌльꙃоуѥтъ Ñѧ Ñ¥ÌÑÑ‚ÑŠ|Ñ҄и обраê™ÑŒÑ†Ð°Ì поÌльꙃоуѭтъ Ñѧ Ñ¥ÑÑ‚Ñ”Ì|Ñ҄и обраê™ÑŒÑ†Ð¸Ì поÌльꙃоуѭтъ Ñѧ ÑÑ«ÌÑ‚ÑŠ}} :',
-'template-protected' => '(ê™Ð°Ð±Ñ€Ð°Ð½Ñ”но Ñ¥ÌÑÑ‚ÑŠ)',
+'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> можєши',
+'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' => '(ê™Ð°Ð±Ñ€Ð°Ð½Ñ”но Ñ¥ÑÑ‚ÑŠ)',
# History pages
-'viewpagelogs' => 'Ñи ÑтраниÌцѧ Ñ—ÑторіÌÑ©',
+'viewpagelogs' => 'Ñи Ñтраницѧ Ñ—Ñторїѩ',
'cur' => 'нꙑ҃н',
'last' => 'пÑ҃лд',
-'page_first' => 'прьÌва ÑтраниÌца',
-'page_last' => 'поÑлѣÌдьнꙗ ÑтраниÌца',
-'histlast' => 'поÑлѣÌдьнꙗ',
-'historyempty' => '(поуÌÑто)',
+'page_first' => 'прьва Ñтраница',
+'page_last' => 'поÑлѣдьнꙗ Ñтраница',
+'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-uname' => 'поÌльꙃєватєлꙗ иÌмѧ',
+'revdelete-radio-unset' => 'нѣтъ',
+'revdelete-log' => 'какъ ÑъмꙑÑлъ :',
+'pagehist' => 'Ñтраницѧ Ñ—Ñторїꙗ',
+'deletedhist' => 'поничьжєна Ñ—Ñторїꙗ',
+'revdelete-summary' => 'мѣнꙑ опьÑаниѥ',
+'revdelete-uname' => 'польꙃєватєлꙗ имѧ',
+'revdelete-otherreason' => 'инъ или допльнитєл҄ьнъ ÑъмꙑÑлъ :',
+'revdelete-reasonotherlist' => 'инъ ÑъмꙑÑлъ',
+
+# History merging
+'mergehistory-reason' => 'какъ ÑъмꙑÑлъ :',
# Search results
-'searchresults' => 'иÑкаÌниꙗ ÑлѣдьÑтвиѥ',
-'searchresults-title' => 'иÑкаÌниꙗ â– $1 â– ÑлѣдьÑтвиѥ',
+'searchresults' => 'иÑканиꙗ ÑлѣдьÑтвиѥ',
+'searchresults-title' => 'иÑканиꙗ â– $1 â– ÑлѣдьÑтвиѥ',
'viewprevnext' => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-new' => "'''ÑтраниÌцѫ â– [[:$1]] â– ÑътвориÌти моÌжєши'''",
-'searchhelp-url' => 'Help:КатаÌлогъ',
-'searchprofile-articles' => 'члѣÌни',
-'searchprofile-images' => 'дѣлаÌ',
-'searchprofile-everything' => 'вьÑÑ©Ì ÑтраниÌцѧ',
+'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' => 'ищиÌ',
+'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' => 'таина ÑловєÑÑ” иê™Ð¼Ñ£Ð½Ñ¥Ìниѥ',
-'searchresultshead' => 'иÑкаÌниѥ',
-'prefs-searchoptions' => 'иÑкаÌниꙗ ÑтроиÌ',
-'prefs-files' => 'дѣлаÌ',
-'username' => 'поÌльꙃєватєлꙗ иÌмѧ :',
-'uid' => 'поÌльꙃєватєлꙗ чиÑÐ»Ð¾Ì :',
-'yourrealname' => 'иÌÑтиньно иÌмѧ :',
-'yourlanguage' => 'Ñ©ê™ê™‘Ìкъ :',
-'yournick' => 'аѵтоÌграфъ :',
-'gender-male' => 'мѫжъ',
-'gender-female' => 'жєна',
+'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' => 'аѵтографъ',
+
+# User rights
+'userrights-reason' => 'какъ ÑъмꙑÑлъ :',
# Groups
-'group-user' => 'поÌльꙃєватєлє',
-'group-bot' => 'аѵтомаÌти',
-'group-sysop' => 'ÑъмотриÌтєлє',
-'group-bureaucrat' => 'чинодаÌтєлє',
-
-'group-user-member' => 'поÌльꙃєватєл҄ь',
-'group-bot-member' => 'аѵтомаÌÑ‚ÑŠ',
-'group-sysop-member' => 'ÑъмотриÌтєл҄ь',
-'group-bureaucrat-member' => 'чинодаÌтєл҄ь',
-
-'grouppage-user' => '{{ns:project}}:ПоÌльꙃєватєлє',
-'grouppage-bot' => '{{ns:project}}:ÐѵтомаÌти',
-'grouppage-sysop' => '{{ns:project}}:СъмотриÌтєлє',
-'grouppage-bureaucrat' => '{{ns:project}}:ЧинодаÌтєлє',
+'group' => 'чинъ :',
+'group-user' => 'польꙃєватєлє',
+'group-bot' => 'аѵтомати',
+'group-sysop' => 'Ñъмотритєлє',
+'group-bureaucrat' => 'чинодатєлє',
+
+'group-user-member' => 'польꙃєватєл҄ь',
+'group-bot-member' => 'аѵтоматъ',
+'group-sysop-member' => 'Ñъмотритєл҄ь',
+'group-bureaucrat-member' => 'чинодатєл҄ь',
+
+'grouppage-user' => '{{ns:project}}:Польꙃєватєлє',
+'grouppage-bot' => '{{ns:project}}:Ðѵтомати',
+'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
+'grouppage-bureaucrat' => '{{ns:project}}:Чинодатєлє',
# User rights log
-'rightslog' => 'чинодаÌтєльÑтва Ñ—ÑторіÌê™—',
+'rightslog' => 'чинодатєльÑтва Ñ—Ñторїꙗ',
# Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'Ñи ÑтраниÌцѧ иÑправлєÌниѥ',
+'action-edit' => 'Ñи Ñтраницѧ иÑправлєниѥ',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|мѣÌна|мѣÌнꙑ|мѣÌнъ}}',
-'recentchanges' => 'поÑлѣÌдьнѩ мѣÌнꙑ',
+'nchanges' => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
+'recentchanges' => 'поÑлѣдьнѩ мѣнꙑ',
'recentchanges-legend' => 'поÑлѣдьн҄ь мѣнъ Ñтрои',
'recentchangestext' => 'Ñ҄ьдє поÑлѣдьнѩ мѣнꙑ Ñѥѩ викиопꙑтьÑтвованиꙗ видѣти можєши',
'recentchanges-label-newpage' => 'по Ñѥи мѣнꙑ нова Ñтраница Ñътворѥна Ñ¥ÑÑ‚ÑŠ',
-'recentchanges-label-minor' => 'маÌлаꙗ мѣÌна',
+'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 Ð¼Ð¾ê™—Ì Ð¼Ñ£Ìнꙑ',
+'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' => 'виÌждь',
+'show' => 'виждь',
'minoreditletter' => 'м҃л',
'newpageletter' => 'н҃в',
'boteditletter' => 'а҃ѵ',
# Recent changes linked
-'recentchangeslinked' => 'ÑъвѧÌê™Ð°Ð½ê™‘ ÑтраниÌцѧ',
-'recentchangeslinked-feed' => 'ÑъвѧÌê™Ð°Ð½ê™‘ ÑтраниÌцѧ',
-'recentchangeslinked-toolbox' => 'ÑъвѧÌê™Ð°Ð½ê™‘ ÑтраниÌцѧ',
-'recentchangeslinked-page' => 'ÑтраниÌцѧ иÌмѧ :',
+'recentchangeslinked' => 'Ñъвѧê™Ð°Ð½ê™‘ Ñтраницѧ',
+'recentchangeslinked-feed' => 'Ñъвѧê™Ð°Ð½ê™‘ Ñтраницѧ',
+'recentchangeslinked-toolbox' => 'Ñъвѧê™Ð°Ð½ê™‘ Ñтраницѧ',
+'recentchangeslinked-page' => 'Ñтраницѧ имѧ :',
# Upload
-'upload' => 'положєÌниѥ дѣÌла',
-'uploadbtn' => 'положєÌниѥ дѣÌла',
-'uploadlog' => 'дѣÌлъ положєÌниꙗ Ñ—ÑторіÌê™—',
-'uploadlogpage' => 'дѣÌлъ положєÌниꙗ Ñ—ÑторіÌê™—',
-'filename' => 'дѣÌла иÌмѧ',
-'filedesc' => 'опьÑаÌниѥ',
-'fileuploadsummary' => 'опьÑаÌниѥ:',
-'successfulupload' => 'дѣÌло положєно Ñ¥ÌÑÑ‚ÑŠ',
-'uploadedimage' => 'â– [[$1]] ■положєÌнъ Ñ¥ÌÑÑ‚ÑŠ',
-'watchthisupload' => 'Ñи дѣÌла блюдєÌниѥ',
+'upload' => 'положєниѥ дѣла',
+'uploadbtn' => 'положєниѥ дѣла',
+'uploadlog' => 'дѣлъ положєниꙗ Ñ—Ñторїꙗ',
+'uploadlogpage' => 'дѣлъ положєниꙗ Ñ—Ñторїꙗ',
+'filename' => 'дѣла имѧ',
+'filedesc' => 'опьÑаниѥ',
+'fileuploadsummary' => 'опьÑаниѥ:',
+'uploadedimage' => 'â– [[$1]] ■положєнъ Ñ¥ÑÑ‚ÑŠ',
+'watchthisupload' => 'Ñи дѣла блюдєниѥ',
+'upload-success-subj' => 'дѣло положєно Ñ¥ÑÑ‚ÑŠ',
'license' => 'прощєниѥ :',
'license-header' => 'прощєниѥ',
# Special:ListFiles
-'imgfile' => 'дѣÌло',
-'listfiles' => 'дѣÌлъ катаÌлогъ',
+'imgfile' => 'дѣло',
+'listfiles' => 'дѣлъ каталогъ',
'listfiles_name' => 'иÌмѧ',
-'listfiles_user' => 'поÌльꙃєватєл҄ь',
-'listfiles_size' => 'мѣÌра',
+'listfiles_user' => 'польꙃєватєл҄ь',
+'listfiles_size' => 'мѣра',
# File description page
-'file-anchor-link' => 'виÌдъ',
-'filehist' => 'дѣÌла Ñ—ÑторіÌê™—',
-'filehist-deleteone' => 'поничьжєÌниѥ',
-'filehist-current' => 'нꙑнѣщьн҄ь оÌбраê™ÑŠ',
-'filehist-datetime' => 'дьнь / врѣÌмѧ',
-'filehist-user' => 'поÌльꙃєватєл҄ь',
-'imagelinks' => 'дѣÌла ÑъвѧÌê™Ð¸',
-'sharedupload' => 'ÑÑ¥ дѣÌло въ $1 ÑъхранѥÌно Ñ¥ÌÑÑ‚ÑŠ дѣÌла · ѥгожє Ð´Ñ€Ð¾ÑƒÐ³ê™‘Ì Ð¾Ð¿ê™‘Ñ‚ÑŒÑтвоваÌниѩ поÌльꙃєвати моÌгѫтъ',
+'file-anchor-link' => 'дѣло',
+'filehist' => 'дѣла Ñ—Ñторїꙗ',
+'filehist-deleteone' => 'поничьжєниѥ',
+'filehist-current' => 'нꙑнѣщьн҄ь обраê™ÑŠ',
+'filehist-datetime' => 'дьнь / врѣмѧ',
+'filehist-user' => 'польꙃєватєл҄ь',
+'filehist-filesize' => 'дѣла мѣра',
+'filehist-comment' => 'опьÑаниѥ',
+'imagelinks' => 'дѣла Ñъвѧê™Ð¸',
+'sharedupload' => 'ÑÑ¥ дѣло въ $1 Ñъхранѥно Ñ¥ÑÑ‚ÑŠ дѣла · ѥгожє дроугꙑ опꙑтьÑтвованиѩ польꙃєвати могѫтъ',
+
+# File reversion
+'filerevert-comment' => 'какъ ÑъмꙑÑлъ :',
# File deletion
-'filedelete-submit' => 'поничьжєÌниѥ',
+'filedelete' => 'поничьжєниѥ $1',
+'filedelete-legend' => 'дѣла поничьжєниѥ',
+'filedelete-comment' => 'какъ ÑъмꙑÑлъ :',
+'filedelete-submit' => 'поничьжєниѥ',
# MIME search
-'mimetype' => 'MIME тѵÌпъ :',
-'download' => 'поѩÌти',
+'mimetype' => 'MIME тѷпъ :',
+'download' => 'поѩти',
# List redirects
-'listredirects' => 'прѣнаправлѥÌниꙗ',
+'listredirects' => 'прѣнаправлѥниꙗ',
# Random page
-'randompage' => 'ÑтраниÌца въ нєê™Ð°Ð°Ìпѫ',
+'randompage' => 'Ñтраница въ нєê™Ð°Ð°Ð¿Ñ«',
# Random redirect
-'randomredirect' => 'прѣнаправлѥÌниє въ нєê™Ð°Ð°Ìпѫ',
+'randomredirect' => 'прѣнаправлѥниє въ нєê™Ð°Ð°Ð¿Ñ«',
# Statistics
-'statistics' => 'СтатїÑтїка',
-'statistics-header-pages' => 'ÑтраниÌцѧ ÑтатїÑтїка',
-'statistics-header-edits' => 'мѣÌнъ ÑтатїÑтїка',
-'statistics-header-users' => 'поÌльꙃєватєлъ ÑтатїÑтїка',
-'statistics-articles' => 'иÑтиньнꙑ члѣÌни',
-'statistics-pages' => 'ÑтраниÌцѧ',
-'statistics-files' => 'положєнꙑ дѣлаÌ',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue ДѣÌиÑтвъ чрѣÌдꙑ] дльгота',
+'statistics' => 'ÑтатїÑтїка',
+'statistics-header-pages' => 'Ñтраницѧ ÑтатїÑтїка',
+'statistics-header-edits' => 'мѣнъ ÑтатїÑтїка',
+'statistics-header-users' => 'польꙃєватєлъ ÑтатїÑтїка',
+'statistics-articles' => 'иÑтиньнꙑ члѣни',
+'statistics-pages' => 'Ñтраницѧ',
+'statistics-files' => 'положєнꙑ дѣла',
-'disambiguations' => 'мъногоÑъмꙑÌÑлиꙗ',
-'disambiguationspage' => 'Template:мъногоÑъмꙑÌÑлиѥ',
+'disambiguations' => 'мъногоÑъмꙑÑлиꙗ',
+'disambiguationspage' => 'Template:мъногоÑъмꙑÑлиѥ',
-'brokenredirects-edit' => 'иÑпраÌви',
-'brokenredirects-delete' => 'поничьжєÌниѥ',
+'brokenredirects-edit' => 'иÑправи',
+'brokenredirects-delete' => 'поничьжєниѥ',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|баÌитъ|баÌита|баÌитъ}}',
-'nlinks' => '$1 {{PLURAL:$1|ÑъвѧÌê™ÑŒ|ÑъвѧÌê™Ñ§|ÑъвѧÌê™Ð¸}}',
-'shortpages' => 'кратъкꙑ ÑтраниÌцѧ',
-'listusers' => 'поÌльꙃєватєлъ катаÌлогъ',
-'newpages' => 'ноÌви члѣÌни',
-'newpages-username' => 'поÌльꙃєватєлꙗ иÌмѧ :',
-'move' => 'прѣимєноваÌниѥ',
-'movethispage' => 'Ñи ÑтраниÌцѧ прѣимєноваÌниѥ',
+'nbytes' => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
+'nlinks' => '$1 {{PLURAL:$1|Ñъвѧê™ÑŒ|Ñъвѧê™Ð¸|Ñъвѧê™Ð¸Ð¸}}',
+'shortpages' => 'кратъкꙑ Ñтраницѧ',
+'listusers' => 'польꙃєватєлъ каталогъ',
+'newpages' => 'нови члѣни',
+'newpages-username' => 'польꙃєватєлꙗ имѧ :',
+'move' => 'прѣимєнованиѥ',
+'movethispage' => 'Ñи Ñтраницѧ прѣимєнованиѥ',
# Book sources
-'booksources-go' => 'прѣидиÌ',
+'booksources-go' => 'прѣиди',
# Special:Log
-'specialloguserlabel' => 'поÌльꙃєватєл҄ь:',
-'speciallogtitlelabel' => 'ÑтраниÌцѧ иÌмѧ :',
-'log' => 'Ñ—ÑторіÌÑ©',
-'all-logs-page' => 'вьÑÑ©Ì Ñ—ÑторіÌÑ©',
+'specialloguserlabel' => 'польꙃєватєл҄ь:',
+'speciallogtitlelabel' => 'Ñтраницѧ имѧ :',
+'log' => 'Ñ—Ñторїѩ',
+'all-logs-page' => 'вьÑÑ© обьщѧ Ñ—Ñторїѩ',
# Special:AllPages
-'allpages' => 'вьÑÑ©Ì ÑтраниÌцѧ',
-'alphaindexline' => 'оÌÑ‚ÑŠ $1 до $2',
-'allpagesfrom' => 'ÑтраниÌцѧ видѣÌти Ñ…Ð¾Ñ‰Ñ«Ì ÑÑŠ начѧÌльнами боуÌкъвами :',
-'allarticles' => 'вьÑÑ©Ì ÑтраниÌцѧ',
-'allpagessubmit' => 'прѣидиÌ',
+'allpages' => 'вьÑÑ© Ñтраницѧ',
+'alphaindexline' => 'отъ $1 до $2',
+'allpagesfrom' => 'Ñтраницѧ видѣти хощѫ ÑÑŠ начѧльнами боукъвами :',
+'allarticles' => 'вьÑÑ© Ñтраницѧ',
+'allpagessubmit' => 'прѣиди',
# Special:Categories
-'categories' => 'катигоріÌÑ©',
+'categories' => 'катигорїѩ',
# Special:DeletedContributions
-'deletedcontributions' => 'пониÌчьжєнꙑ добродѣꙗÌниꙗ',
-'deletedcontributions-title' => 'пониÌчьжєнꙑ добродѣꙗÌниꙗ',
+'deletedcontributions' => 'поничьжєнꙑ добродѣꙗниꙗ',
+'deletedcontributions-title' => 'поничьжєнꙑ добродѣꙗниꙗ',
# Special:LinkSearch
-'linksearch' => 'вънѣщьнѩ ÑъвѧÌê™Ð¸',
-'linksearch-ok' => 'ищиÌ',
+'linksearch' => 'вънѣщьнѩ Ñъвѧê™Ð¸',
+'linksearch-ok' => 'ищи',
# Special:ListUsers
-'listusers-submit' => 'виÌждь',
+'listusers-submit' => 'виждь',
# Special:Log/newusers
-'newuserlogpage' => 'ноÌвъ мѣÌÑÑ‚ÑŠ ÑътворѥÌниꙗ Ñ—ÑторіÌê™—',
-'newuserlog-create-entry' => 'ноÌвъ поÌльꙃєватєл҄ь',
-'newuserlog-autocreate-entry' => 'поÌльꙃєватєлꙗ мѣÌÑто аѵтоматиÌчьно ÑÑŠÑ‚Ð²Ð¾Ñ€Ñ”Ð½Ð¾Ì Ñ¥ÌÑÑ‚ÑŠ',
+'newuserlogpage' => 'новъ мѣÑÑ‚ÑŠ Ñътворѥниꙗ Ñ—Ñторїꙗ',
+'newuserlog-create-entry' => 'новъ польꙃєватєл҄ь',
+'newuserlog-autocreate-entry' => 'польꙃєватєлꙗ мѣÑто аѵтоматичьно Ñътворєно Ñ¥ÑÑ‚ÑŠ',
# E-mail user
'emailuser' => 'поÑъли єпїÑтолѫ',
# Watchlist
-'watchlist' => 'Ð¼Ð¾ê™—Ì Ð±Ð»ÑŽÐ´Ñ”Ìниꙗ',
-'mywatchlist' => 'Ð¼Ð¾ê™—Ì Ð±Ð»ÑŽÐ´Ñ”Ìниꙗ',
-'watchlistfor' => "(поÌльꙃєватєлꙗ иÌмѧ '''$1''' Ñ¥ÌÑÑ‚ÑŠ)",
-'addedwatch' => 'ÑтраниÌца нꙑнѣ поÌдъ твоимь блюдєÌниѥмь Ñ¥ÌÑÑ‚ÑŠ',
-'addedwatchtext' => "ÑтраниÌца â– [[:$1]] ■нꙑнѣ поÌдъ твоимь [[Special:Watchlist|блюдєÌниѥмь]] Ñ¥ÌÑÑ‚ÑŠ â™
-вÑê™— ѥѩ и ѥѩжє бєÑѣдꙑ мѣÌнꙑ ÑтраниÌцѧ â– [[Special:Watchlist|Ð¼Ð¾ê™—Ì Ð±Ð»ÑŽÐ´Ñ”Ìниꙗ]] ■покаê™Ð°Ð½ê™‘ ÑÑ«ÌÑ‚ÑŠ и [[Special:RecentChanges|поÑлѣÌдьнъ мѣÌнъ]] катаÌлоꙃѣ '''чрьнꙑимъ''' Ñѧ авлꙗѭтъ",
-'removedwatchtext' => 'ÑтраниÌца â– [[:$1]] ■нꙑнѣ твоѥго [[Special:Watchlist|блюдєÌниꙗ]] иê™Ð½Ñ”Ñєна Ñ¥ÌÑÑ‚ÑŠ',
-'watch' => 'блюдєÌниѥ',
-'watchthispage' => 'Ñи ÑтраниÌцѧ блюдєÌниѥ',
-'unwatch' => 'оÑтаÌви блюдєÌниѥ',
+'watchlist' => 'моꙗ блюдєниꙗ',
+'mywatchlist' => 'моꙗ блюдєниꙗ',
+'addedwatch' => 'Ñтраница нꙑнѣ подъ твоимь блюдєниѥмь Ñ¥ÑÑ‚ÑŠ',
+'addedwatchtext' => "Ñтраница â– [[:$1]] ■нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] Ñ¥ÑÑ‚ÑŠ â™
+вÑê™— ѥѩ и ѥѩжє бєÑѣдꙑ мѣнꙑ Ñтраницѧ â– [[Special:Watchlist|моꙗ блюдєниꙗ]] ■покаê™Ð°Ð½ê™‘ ÑÑ«Ñ‚ÑŠ и [[Special:RecentChanges|поÑлѣдьнъ мѣнъ]] каталоꙃѣ '''чрьнꙑимъ''' Ñѧ авлꙗѭтъ",
+'removedwatchtext' => 'Ñтраница â– [[:$1]] ■нꙑнѣ твоѥго [[Special:Watchlist|блюдєниꙗ]] иê™Ð½Ñ”Ñєна Ñ¥ÑÑ‚ÑŠ',
+'watch' => 'блюдєниѥ',
+'watchthispage' => 'Ñи Ñтраницѧ блюдєниѥ',
+'unwatch' => 'оÑтави блюдєниѥ',
# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'блюдєÌниѥ ...',
-'unwatching' => 'оÑтавьлєÌниѥ блюдєÌниꙗ ...',
+'watching' => 'блюдєниѥ ...',
+'unwatching' => 'оÑтавьлєниѥ блюдєниꙗ ...',
-'created' => 'ÑътворѥÌнъ Ñ¥ÌÑÑ‚ÑŠ',
+'created' => 'Ñътворѥнъ Ñ¥ÑÑ‚ÑŠ',
# Delete
-'deletepage' => 'поничьжєÌниѥ',
+'deletepage' => 'поничьжєниѥ',
'excontent' => "вънѫтри бѣ: '$1'",
-'excontentauthor' => "Ð²ÑŠÐ½Ñ«Ñ‚Ñ€Ð¸Ì Ð±Ñ£ : '$1' (и поÑлѣÌдьн҄ии дѣÌтєл҄ь бѣ '[[Special:Contributions/$2|$2]]')",
-'delete-legend' => 'поничьжєÌниѥ',
-'actioncomplete' => 'дѣÌиÑтво ÑÑŠÑ‚Ð²Ð¾Ñ€Ñ”Ð½Ð¾Ì Ñ¥ÌÑÑ‚ÑŠ',
-'deletedtext' => 'ÑтраниÌца â– <nowiki>$1</nowiki> ■поничьжєна Ñ¥ÌÑÑ‚ÑŠ â™
-виждь â– $2 ■поÑлѣÌдьнъ поничьжєÌниѩ дѣлꙗÌ',
-'deletedarticle' => 'â– [[$1]] ■поничьжєÌнъ Ñ¥ÌÑÑ‚ÑŠ',
-'dellogpage' => 'поничьжєÌниꙗ Ñ—ÑторіÌê™—',
-'deletionlog' => 'поничьжєÌниꙗ Ñ—ÑторіÌê™—',
+'excontentauthor' => "вънѫтри бѣ : '$1' (и поÑлѣдьн҄ии дѣтєл҄ь бѣ '[[Special:Contributions/$2|$2]]')",
+'delete-legend' => 'поничьжєниѥ',
+'actioncomplete' => 'дѣиÑтво Ñътворєно Ñ¥ÑÑ‚ÑŠ',
+'deletedtext' => 'Ñтраница â– <nowiki>$1</nowiki> ■поничьжєна Ñ¥ÑÑ‚ÑŠ â™
+виждь â– $2 ■поÑлѣдьнъ поничьжєниѩ дѣлꙗ',
+'deletedarticle' => 'â– [[$1]] ■поничьжєнъ Ñ¥ÑÑ‚ÑŠ',
+'dellogpage' => 'поничьжєниꙗ Ñ—Ñторїꙗ',
+'deletionlog' => 'поничьжєниꙗ Ñ—Ñторїꙗ',
+'deletecomment' => 'какъ ÑъмꙑÑлъ :',
# Protect
-'protectlogpage' => 'ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ìниꙗ Ñ—ÑторіÌê™—',
-'protectedarticle' => 'â– [[$1]] â– ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ð½Ð° Ñ¥ÌÑÑ‚ÑŠ',
-'prot_1movedto2' => 'â– [[$1]] ■нарєчєÌнъ â– [[$2]] ■ѥÌÑÑ‚ÑŠ',
-'protect-level-sysop' => 'тоÌлико ÑъмотриÌтєлє',
+'protectlogpage' => 'ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ð½Ð¸ê™— Ñ—Ñторїꙗ',
+'protectedarticle' => 'â– [[$1]] â– ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ð½Ð° Ñ¥ÑÑ‚ÑŠ',
+'prot_1movedto2' => 'â– [[$1]] ■нарєчєнъ â– [[$2]] ■ѥÑÑ‚ÑŠ',
+'protectcomment' => 'какъ ÑъмꙑÑлъ :',
+'protect-level-sysop' => 'толико Ñъмотритєлє',
# Restrictions (nouns)
-'restriction-edit' => 'иÑпраÌви',
-'restriction-move' => 'прѣимєноваÌниѥ',
-'restriction-upload' => 'положєÌниѥ',
+'restriction-edit' => 'иÑправи',
+'restriction-move' => 'прѣимєнованиѥ',
+'restriction-upload' => 'положєниѥ',
# Undelete
-'undelete-search-submit' => 'ищиÌ',
+'undeletecomment' => 'какъ ÑъмꙑÑлъ :',
+'undelete-search-submit' => 'ищи',
# Namespace form on various pages
-'namespace' => 'имєÌнъ проÑтоÌръ:',
-'blanknamespace' => '(глаÌвьно)',
+'namespace' => 'имєнъ проÑторъ:',
+'blanknamespace' => '(главьно)',
# Contributions
-'contributions' => 'поÌльꙃєватєлꙗ добродѣꙗÌниꙗ',
-'contributions-title' => 'поÌльꙃєватєлꙗ â– $1 ■добродѣꙗÌниꙗ',
-'mycontris' => 'Ð¼Ð¾ê™—Ì Ð´Ð¾Ð±Ñ€Ð¾Ð´Ñ£ê™—Ìниꙗ',
-'contribsub2' => 'поÌльꙃєватєлꙗ иÌмѧ â– $1 ■ѥÌÑÑ‚ÑŠ ($2)',
-'uctop' => '(поÑлѣÌдьнꙗ мѣÌна)',
-
-'sp-contributions-blocklog' => 'ê™Ð°Ð³Ñ€Ð°Ð¶Ð´Ñ”Ìниꙗ Ñ—ÑторіÌê™—',
-'sp-contributions-deleted' => 'пониÌчьжєнꙑ добродѣꙗÌниꙗ',
-'sp-contributions-talk' => 'бєÑÑ£Ìда',
-'sp-contributions-username' => 'IP чиÑло или поÌльꙃєватєлꙗ иÌмѧ :',
-'sp-contributions-submit' => 'ищиÌ',
+'contributions' => 'польꙃєватєлꙗ добродѣꙗниꙗ',
+'contributions-title' => 'польꙃєватєлꙗ ■$1 ■добродѣꙗниꙗ',
+'mycontris' => 'моꙗ добродѣꙗниꙗ',
+'contribsub2' => 'польꙃєватєлꙗ имѧ â– $1 ■ѥÑÑ‚ÑŠ ($2)',
+'uctop' => '(поÑлѣдьнꙗ мѣна)',
+
+'sp-contributions-blocklog' => 'ê™Ð°Ð³Ñ€Ð°Ð¶Ð´Ñ”ниꙗ Ñ—Ñторїꙗ',
+'sp-contributions-deleted' => 'поничьжєнꙑ добродѣꙗниꙗ',
+'sp-contributions-talk' => 'бєÑѣда',
+'sp-contributions-username' => 'IP чиÑло или польꙃєватєлꙗ имѧ :',
+'sp-contributions-submit' => 'ищи',
# What links here
-'whatlinkshere' => 'доÑ̑ьдєÌщьнѩ ÑъвѧÌê™Ð¸',
-'whatlinkshere-title' => 'ÑтраниÌцѧ ижє ÑÑŠ â– $1 â– ÑъвѧÌê™Ð¸ имѫтъ',
-'whatlinkshere-page' => 'ÑтраниÌца :',
-'isredirect' => 'прѣнаправлѥÌниѥ',
-'whatlinkshere-links' => '↠ÑъвѧÌê™Ð¸',
-'whatlinkshere-hideredirs' => '$1 прѣнаправлѥÌниꙗ',
-'whatlinkshere-hidelinks' => '$1 ÑъвѧÌê™Ð¸',
+'whatlinkshere' => 'доÑ̑ьдєщьнѩ Ñъвѧê™Ð¸',
+'whatlinkshere-title' => 'Ñтраницѧ ижє ÑÑŠ â– $1 â– Ñъвѧê™Ð¸ имѫтъ',
+'whatlinkshere-page' => 'Ñтраница :',
+'isredirect' => 'прѣнаправлѥниѥ',
+'istemplate' => 'внѫтри Ñтраницѧ',
+'whatlinkshere-links' => '↠Ñъвѧê™Ð¸',
+'whatlinkshere-hideredirs' => '$1 прѣнаправлѥниꙗ',
+'whatlinkshere-hidelinks' => '$1 Ñъвѧê™Ð¸',
# Block/unblock
-'blockip' => 'ê™Ð°Ð³Ñ€Ð°Ð´Ð¸Ì поÌльꙃєватєл҄ь',
-'ipadressorusername' => 'IP чиÑло или поÌльꙃєватєлꙗ иÌмѧ :',
-'ipblocklist-submit' => 'иÑкаÌниѥ',
-'blocklink' => 'ê™Ð°Ð³Ñ€Ð°Ð´Ð¸Ì',
-'contribslink' => 'добродѣꙗÌниꙗ',
-'blocklogpage' => 'ê™Ð°Ð³Ñ€Ð°Ð¶Ð´Ñ”Ìниꙗ Ñ—ÑторіÌê™—',
+'blockip' => 'ê™Ð°Ð³Ñ€Ð°Ð´Ð¸ польꙃєватєл҄ь',
+'ipadressorusername' => 'IP чиÑло или польꙃєватєлꙗ имѧ :',
+'ipbreason' => 'какъ ÑъмꙑÑлъ :',
+'ipblocklist' => 'ê™Ð°Ð³Ñ€Ð°Ð¶Ð´Ñ”нꙑ польꙃєватєлє',
+'ipblocklist-submit' => 'иÑканиѥ',
+'blocklink' => 'ê™Ð°Ð³Ñ€Ð°Ð´Ð¸',
+'contribslink' => 'добродѣꙗниꙗ',
+'blocklogpage' => 'ê™Ð°Ð³Ñ€Ð°Ð¶Ð´Ñ”ниꙗ Ñ—Ñторїꙗ',
# Move page
-'move-page' => 'прѣимєноваÌниѥ â– $1 â–',
-'move-page-legend' => 'ÑтраниÌцѧ прѣимєноваÌниѥ',
-'movearticle' => 'ÑтраниÌца :',
-'newtitle' => 'ноÌво иÌмѧ :',
-'move-watch' => 'Ñи ÑтраниÌцѧ блюдєÌниѥ',
-'movepagebtn' => 'прѣимєноваÌниѥ',
-'pagemovedsub' => 'прѣимєноваÌниѥ ÑÑŠÑ‚Ð²Ð¾Ñ€Ñ¥Ð½Ð¾Ì Ñ¥ÌÑÑ‚ÑŠ',
-'movepage-moved' => "'''â– $1 ■нарєчєÌнъ â– $2■ѥÌÑÑ‚ÑŠ'''",
-'movepage-moved-redirect' => 'прѣнаправлѥÌниѥ ÑÑŠÑ‚Ð²Ð¾Ñ€Ñ¥Ð½Ð¾Ì Ð±Ñ£',
+'move-page' => 'прѣимєнованиѥ â– $1 â–',
+'move-page-legend' => 'Ñтраницѧ прѣимєнованиѥ',
+'movearticle' => 'Ñтраница :',
+'newtitle' => 'ново имѧ :',
+'move-watch' => 'Ñи Ñтраницѧ блюдєниѥ',
+'movepagebtn' => 'прѣимєнованиѥ',
+'pagemovedsub' => 'прѣимєнованиѥ Ñътворѥно Ñ¥ÑÑ‚ÑŠ',
+'movepage-moved' => "'''â– $1 ■нарєчєнъ â– $2■ѥÑÑ‚ÑŠ'''",
+'movepage-moved-redirect' => 'прѣнаправлѥниѥ Ñътворѥно бѣ',
'movedto' => 'прѣимєновано въ',
-'movetalk' => 'Ñи ÑтраниÌцѧ бєÑÑ£Ìдꙑ прѣимєноваÌниѥ',
-'1movedto2' => 'â– [[$1]] ■нарєчєÌнъ â– [[$2]] ■ѥÌÑÑ‚ÑŠ',
-'1movedto2_redir' => '[[$1]] нарєчєÌнъ [[$2]] Ð²Ñ€ÑŒÑ…Ð¾ÑƒÌ Ð¿Ñ€Ñ£Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»Ñ¥Ìниꙗ Ñ¥ÌÑÑ‚ÑŠ.',
-'movelogpage' => 'прѣимєноваÌниꙗ Ñ—ÑторіÌê™—',
+'movetalk' => 'Ñи Ñтраницѧ бєÑѣдꙑ прѣимєнованиѥ',
+'1movedto2' => 'â– [[$1]] ■нарєчєнъ â– [[$2]] ■ѥÑÑ‚ÑŠ',
+'1movedto2_redir' => '[[$1]] нарєчєнъ [[$2]] врьхоу прѣнаправлѥниꙗ Ñ¥ÑÑ‚ÑŠ.',
+'movelogpage' => 'прѣимєнованиꙗ Ñ—Ñторїꙗ',
+'movereason' => 'какъ ÑъмꙑÑлъ :',
+'move-leave-redirect' => 'прѣнаправлѥниꙗ Ñътворѥниѥ',
# Namespace 8 related
-'allmessages' => 'ÑÑ·ÑтиÌмьнꙑ напьÑаÌниꙗ',
-'allmessagesname' => 'иÌмѧ',
+'allmessages' => 'ÑÑ·Ñтимьнꙑ напьÑаниꙗ',
+'allmessagesname' => 'имѧ',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ñ‚Ð²Ð¾ê™—Ì Ð¿Ð¾Ìльꙃєватєл҄ьÑка ÑтраниÌца',
-'tooltip-pt-mytalk' => 'Ñ‚Ð²Ð¾ê™—Ì Ð±Ñ”ÑÑ£Ìдꙑ ÑтраниÌца',
+'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-n-mainpage-description' => 'виÌждь глаÌвьнѫ ÑтраниÌцѫ',
-'tooltip-n-recentchanges' => 'поÑлѣÌдьн҄ь мѣÌнъ катаÌлогъ',
-'tooltip-t-upload' => 'положєÌниѥ дѣÌлъ',
-'tooltip-t-specialpages' => 'вьÑѣѩ нароÌчьнъ ÑтраниÌцѧ катаÌлогъ',
-'tooltip-t-print' => 'Ñѥѩ ÑтраниÌцѧ пєчаÌтьнъ оÌбраê™ÑŠ',
-'tooltip-ca-nstab-special' => 'Ñи нароÌчьна ÑтраниÌца Ñ¥ÌÑÑ‚ÑŠ · ѥѩжє иê™Ð¼Ñ£Ð½ê™—Ìти нє можєши',
-'tooltip-watch' => 'Ñи ÑтраниÌцѧ блюдєÌниѥ',
+'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-n-mainpage-description' => 'виждь главьноу Ñтраницѫ',
+'tooltip-n-recentchanges' => 'поÑлѣдьн҄ь мѣнъ каталогъ',
+'tooltip-t-contributions' => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
+'tooltip-t-upload' => 'положєниѥ дѣлъ',
+'tooltip-t-specialpages' => 'вьÑѣѩ нарочьнъ Ñтраницѧ каталогъ',
+'tooltip-t-print' => 'Ñѥѩ Ñтраницѧ пєчатьнъ обраê™ÑŠ',
+'tooltip-ca-nstab-special' => 'Ñи нарочьна Ñтраница Ñ¥ÑÑ‚ÑŠ · ѥѩжє иê™Ð¼Ñ£Ð½ê™—ти нє можєши',
+'tooltip-watch' => 'Ñи Ñтраницѧ блюдєниѥ',
# Media information
-'file-info-size' => '($1 × $2 п҃ѯ · дѣÌла мѣÌра : $3 · MIME тѵÌпъ : $4)',
-'svg-long-desc' => '(дѣÌло SVG · обꙑÌчьнъ оÌбраê™ÑŠ : $1 × $2 п҃ѯ · дѣÌла мѣÌра : $3)',
-'show-big-image' => 'пльÌнъ виÌда оÌбраê™ÑŠ',
+'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
+'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраê™ÑŠ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
+'show-big-image' => 'пльнъ вида обраê™ÑŠ',
# Special:NewFiles
-'ilsubmit' => 'ищиÌ',
+'ilsubmit' => 'ищи',
# EXIF tags
-'exif-artist' => 'творьÌць',
+'exif-artist' => 'творьць',
# 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'вьÑê™—Ì',
-'namespacesall' => 'вьÑê™—Ì',
-'monthsall' => 'вьÑÑ©Ì',
+'watchlistall2' => 'вьÑê™—',
+'namespacesall' => 'вьÑê™—',
+'monthsall' => 'вьÑÑ©',
'unit-pixel' => 'п҃ѯ',
# Multipage image navigation
-'imgmultigo' => 'прѣидиÌ',
+'imgmultigo' => 'прѣиди',
# Table pager
-'table_pager_limit_submit' => 'прѣидиÌ',
+'table_pager_limit_submit' => 'прѣиди',
# Auto-summaries
-'autosumm-new' => 'ноÌва ÑтраниÌца ÑÑŠÑ‚Ð²Ð¾Ñ€Ñ”Ð½Ð°Ì Ð¼Ñ£Ìроѭ $1 Ñ¥ÌÑÑ‚ÑŠ',
+'autosumm-new' => 'нова Ñтраница â– $1 â– Ñътворєна Ñ¥ÑÑ‚ÑŠ',
# Size units
'size-bytes' => '$1 Б҃',
# Special:Version
-'version' => 'MediaWiki оÌбраê™ÑŠ',
-'version-version' => '(оÌбраê™ÑŠ $1)',
-'version-license' => 'прощєÌниѥ',
-'version-software-version' => 'оÌбраê™ÑŠ',
+'version' => 'MediaWiki обраê™ÑŠ',
+'version-version' => '(обраê™ÑŠ $1)',
+'version-license' => 'прощєниѥ',
+'version-software-version' => 'обраê™ÑŠ',
# Special:FilePath
-'filepath-page' => 'дѣÌло :',
+'filepath-page' => 'дѣло :',
# Special:FileDuplicateSearch
-'fileduplicatesearch-submit' => 'ищиÌ',
+'fileduplicatesearch-submit' => 'ищи',
# Special:SpecialPages
-'specialpages' => 'нароÌчьнꙑ ÑтраниÌцѧ',
+'specialpages' => 'нарочьнꙑ Ñтраницѧ',
# Special:Tags
-'tags-edit' => 'иÑпраÌви',
+'tags-edit' => 'иÑправи',
);
diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php
index c5bcf1a4..861f9708 100644
--- a/languages/messages/MessagesCv.php
+++ b/languages/messages/MessagesCv.php
@@ -53,8 +53,7 @@ $messages = array(
'tog-editsection' => '«Тӳрлет» ÑÑылкăна кашни пайра кăтартмалла',
'tog-editsectiononrightclick' => 'Шăшин Ñылтăм пуÑкăчне пуÑÑан ÑÑ‚Ð°Ñ‚ÑŒÑ Ð¿Ð°Ð¹Ð½Ðµ тӳрлетмелле (JavaScript)',
'tog-showtoc' => 'Тупмаллине кăтартмалла (3, е ытларах заголовок пулÑан)',
-'tog-rememberpassword' => 'Мана ку компьютер çинче аÑтуÑа хăвармалла',
-'tog-editwidth' => 'Тӳрлетмелли чӳречене браузерăн пĕтĕм Ñарлакăшĕпе кăтартмалла',
+'tog-rememberpassword' => 'Мана ку компьютер çинче аÑтуÑа хăвармалла (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Эпĕ тунă ÑтраницăÑене Ñăнав ÑпиÑокне кĕртмелле',
'tog-watchdefault' => 'Тӳрлетнĕ ÑтраницăÑене Ñăнав ÑпиÑокне кĕртмелле',
'tog-watchmoves' => 'Страница Ñтне Ñпĕ улаштарÑан вĕÑене Ñăнав ÑпиÑокне кĕртмелле',
@@ -185,24 +184,14 @@ $messages = array(
'faqpage' => 'Project:ЫйХу',
# Vector skin
-'vector-action-addsection' => 'Тема хуш',
-'vector-action-delete' => 'КăларÑа пăрах',
-'vector-action-move' => 'Ятне улăштар',
-'vector-action-protect' => 'Хӳтĕле',
-'vector-namespace-category' => 'Категори',
-'vector-namespace-help' => 'Пулăшу Ñтраници',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Страница',
-'vector-namespace-mediawiki' => 'Пĕлтерӳ',
-'vector-namespace-project' => 'Проект çинчен',
-'vector-namespace-special' => 'Ятарлă Ñтраницă',
-'vector-namespace-talk' => 'СӳтÑе Ñв',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Хутшăнакан Ñтраници',
-'vector-view-create' => 'Çĕннине ту',
-'vector-view-edit' => 'Тӳрлет',
-'vector-view-history' => 'Кун-çул',
-'vector-view-view' => 'Вула',
+'vector-action-addsection' => 'Тема хуш',
+'vector-action-delete' => 'КăларÑа пăрах',
+'vector-action-move' => 'Ятне улăштар',
+'vector-action-protect' => 'Хӳтĕле',
+'vector-view-create' => 'Çĕннине ту',
+'vector-view-edit' => 'Тӳрлет',
+'vector-view-history' => 'Кун-çул',
+'vector-view-view' => 'Вула',
'errorpagetitle' => 'Йăнăш',
'returnto' => '$1 Ñтраницăна таврăн.',
@@ -407,7 +396,7 @@ $1',
'yourname' => 'Сирĕн ÑÑ‚',
'yourpassword' => 'Вăрттăн Ñăмах:',
'yourpasswordagain' => 'Вăрттăн Ñăмах тепре çырăр:',
-'remembermypassword' => 'Ку компьютер çинче мана аÑтуÑа хăвармалла',
+'remembermypassword' => 'Ку компьютер çинче мана аÑтуÑа хăвармалла (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Сирĕн домен',
'login' => 'Сайта кĕр',
'nav-login-createaccount' => 'Сайта кĕр / региÑтрацилен',
@@ -694,30 +683,26 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
'rightsnone' => '(çук)',
# Recent changes
-'recentchanges' => 'УлшăнуÑем',
-'recentchanges-legend' => 'Çĕнĕ улшăнуÑен ĕнерлевĕ',
-'recentchanges-legend-newpage' => '$1 — çĕнĕ Ñтраница',
-'recentchanges-legend-minor' => '$1 — пĕчĕк улшăну',
-'recentchanges-legend-bot' => '$1 — бот улăштарни',
-'recentchanges-label-bot' => 'Ку улшăнăва бот тунă',
-'recentchanges-legend-unpatrolled' => '$1 — тĕрĕÑлемен улшăну',
-'rcnote' => 'Юлашки <strong>$2</strong> кун хушшинчи <strong>$1</strong> улшăнуÑем. Халě пěтěмпе <strong>{{NUMBEROFARTICLES}}</strong> ÑтатьÑ.',
-'rclistfrom' => 'Юлашки улшăнуÑене $1 вăхăтран пуçлаÑа кăтартнă',
-'rcshowhideminor' => 'пĕчĕк тӳрлетӳÑене $1',
-'rcshowhidebots' => 'ботÑене $1',
-'rcshowhideliu' => 'Ñайта кĕнĕÑкерÑене $1',
-'rcshowhideanons' => 'ÑчĕÑене палăртманÑкерÑене $1',
-'rcshowhidepatr' => 'тĕрĕÑленĕ тӳрлетӳÑене $1',
-'rcshowhidemine' => 'хăвăн тӳрлетӳÑене $1',
-'rclinks' => 'Юлашки $2 кун хушшинче тунă $1 улшăнуÑене кăтартмалла<br />$3',
-'diff' => 'танл.',
-'hist' => 'иÑтори',
-'hide' => 'кăтартмалла мар',
-'show' => 'кăтартмалла',
-'minoreditletter' => 'п',
-'newpageletter' => 'Ç',
-'rc_categories_any' => 'Кашни',
-'newsectionsummary' => '/* $1 */ Çĕнĕ тема',
+'recentchanges' => 'УлшăнуÑем',
+'recentchanges-legend' => 'Çĕнĕ улшăнуÑен ĕнерлевĕ',
+'recentchanges-label-bot' => 'Ку улшăнăва бот тунă',
+'rcnote' => 'Юлашки <strong>$2</strong> кун хушшинчи <strong>$1</strong> улшăнуÑем. Халě пěтěмпе <strong>{{NUMBEROFARTICLES}}</strong> ÑтатьÑ.',
+'rclistfrom' => 'Юлашки улшăнуÑене $1 вăхăтран пуçлаÑа кăтартнă',
+'rcshowhideminor' => 'пĕчĕк тӳрлетӳÑене $1',
+'rcshowhidebots' => 'ботÑене $1',
+'rcshowhideliu' => 'Ñайта кĕнĕÑкерÑене $1',
+'rcshowhideanons' => 'ÑчĕÑене палăртманÑкерÑене $1',
+'rcshowhidepatr' => 'тĕрĕÑленĕ тӳрлетӳÑене $1',
+'rcshowhidemine' => 'хăвăн тӳрлетӳÑене $1',
+'rclinks' => 'Юлашки $2 кун хушшинче тунă $1 улшăнуÑене кăтартмалла<br />$3',
+'diff' => 'танл.',
+'hist' => 'иÑтори',
+'hide' => 'кăтартмалла мар',
+'show' => 'кăтартмалла',
+'minoreditletter' => 'п',
+'newpageletter' => 'Ç',
+'rc_categories_any' => 'Кашни',
+'newsectionsummary' => '/* $1 */ Çĕнĕ тема',
# Recent changes linked
'recentchangeslinked' => 'Çыхăннă улшăнуÑем',
@@ -726,36 +711,36 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
'recentchangeslinked-page' => 'Страница Ñчĕ:',
# Upload
-'upload' => 'Файла кĕртеÑÑи',
-'uploadbtn' => 'Файла кĕрт',
-'uploadnologin' => 'ЭÑир Ñайта кĕмен.',
-'uploadnologintext' => 'Файла ÐºÄ•Ñ€Ñ‚ÐµÑ ÑƒÐ¼Ä•Ð½ Ñирĕн малтан [[Special:UserLogin|Ñайта кĕмелле]].',
-'uploaderror' => 'Файла кĕртне чухне йăнăш пулчĕ',
-'uploadlog' => 'ФайлÑене кĕртнин логĕ',
-'uploadlogpage' => 'ФайлÑене кĕртнине кăтартакан журнал',
-'uploadlogpagetext' => 'ÐÑларах ÑÑир юлашкинчен кĕртнĕ файлÑене куратăр.
+'upload' => 'Файла кĕртеÑÑи',
+'uploadbtn' => 'Файла кĕрт',
+'uploadnologin' => 'ЭÑир Ñайта кĕмен.',
+'uploadnologintext' => 'Файла ÐºÄ•Ñ€Ñ‚ÐµÑ ÑƒÐ¼Ä•Ð½ Ñирĕн малтан [[Special:UserLogin|Ñайта кĕмелле]].',
+'uploaderror' => 'Файла кĕртне чухне йăнăш пулчĕ',
+'uploadlog' => 'ФайлÑене кĕртнин логĕ',
+'uploadlogpage' => 'ФайлÑене кĕртнине кăтартакан журнал',
+'uploadlogpagetext' => 'ÐÑларах ÑÑир юлашкинчен кĕртнĕ файлÑене куратăр.
Пур çĕрте те Ñервер вăхăтне (Гринвич тăрăх, UTC) кăтартнă.',
-'filedesc' => 'КĕÑкен ăнлантарни',
-'fileuploadsummary' => 'КĕÑке ăнлантару:',
-'filestatus' => 'УÑă курмалли майÑем',
-'filesource' => 'Çăлкуç',
-'uploadedfiles' => 'Кĕртнĕ файлÑем',
-'ignorewarning' => 'ÐÑăрхаттаруÑене пăхмаÑăр файла çав-çавах çырÑа хумалла.',
-'ignorewarnings' => 'ÐÑăрхаттаруÑене шута илмелле мар',
-'badfilename' => 'Файл Ñтне $1 çине улăштарнă',
-'filetype-badmime' => '"$1" MIME-Ñ‚Ä•Ñлĕ файлÑене кĕртеймеÑтпĕр.',
-'filetype-missing' => 'Файлăн хушма Ñчĕ тупăнмарĕ (Ñ‚Ä•Ñлĕхрен, «.jpg»).',
-'largefileserver' => 'Файл пыÑăкăшĕ юрăхлинчен пыÑăкрах (пĕчĕклетĕр).',
-'successfulupload' => 'Файла ăнăçлă тултартăмăр',
-'uploadwarning' => 'ÐÑăрхаттару',
-'savefile' => 'Файла çырÑа хур',
-'uploadedimage' => '«[[$1]]» кĕртрĕмĕр',
-'uploaddisabled' => 'Каçарăр та Ñайта халĕ нимĕн те кĕртме юрамаÑÑ‚.',
-'uploaddisabledtext' => 'Ку вики-Ñайтра файлÑене кĕртме чарнă.',
-'uploadvirus' => 'Файл ăшĕнче Ð²Ð¸Ñ€ÑƒÑ Ð¿ÑƒÑ€! $1 пăхăр.',
-'sourcefilename' => 'Файлăн чăн Ñчĕ',
-'watchthisupload' => 'Ку файла Ñăнав ÑпиÑокне кĕртмелле',
-'filewasdeleted' => 'Ку Ñтла файл малтан пулнă, анчах та ăна кăларÑа пăрахнă. ТархаÑшăн, $1 ÐºÄ•Ñ€Ñ‚ÐµÑ ÑƒÐ¼Ä•Ð½ тĕрĕÑлĕр.',
+'filedesc' => 'КĕÑкен ăнлантарни',
+'fileuploadsummary' => 'КĕÑке ăнлантару:',
+'filestatus' => 'УÑă курмалли майÑем',
+'filesource' => 'Çăлкуç',
+'uploadedfiles' => 'Кĕртнĕ файлÑем',
+'ignorewarning' => 'ÐÑăрхаттаруÑене пăхмаÑăр файла çав-çавах çырÑа хумалла.',
+'ignorewarnings' => 'ÐÑăрхаттаруÑене шута илмелле мар',
+'badfilename' => 'Файл Ñтне $1 çине улăштарнă',
+'filetype-badmime' => '"$1" MIME-Ñ‚Ä•Ñлĕ файлÑене кĕртеймеÑтпĕр.',
+'filetype-missing' => 'Файлăн хушма Ñчĕ тупăнмарĕ (Ñ‚Ä•Ñлĕхрен, «.jpg»).',
+'largefileserver' => 'Файл пыÑăкăшĕ юрăхлинчен пыÑăкрах (пĕчĕклетĕр).',
+'uploadwarning' => 'ÐÑăрхаттару',
+'savefile' => 'Файла çырÑа хур',
+'uploadedimage' => '«[[$1]]» кĕртрĕмĕр',
+'uploaddisabled' => 'Каçарăр та Ñайта халĕ нимĕн те кĕртме юрамаÑÑ‚.',
+'uploaddisabledtext' => 'Ку вики-Ñайтра файлÑене кĕртме чарнă.',
+'uploadvirus' => 'Файл ăшĕнче Ð²Ð¸Ñ€ÑƒÑ Ð¿ÑƒÑ€! $1 пăхăр.',
+'sourcefilename' => 'Файлăн чăн Ñчĕ',
+'watchthisupload' => 'Ку файла Ñăнав ÑпиÑокне кĕртмелле',
+'filewasdeleted' => 'Ку Ñтла файл малтан пулнă, анчах та ăна кăларÑа пăрахнă. ТархаÑшăн, $1 ÐºÄ•Ñ€Ñ‚ÐµÑ ÑƒÐ¼Ä•Ð½ тĕрĕÑлĕр.',
+'upload-success-subj' => 'Файла ăнăçлă тултартăмăр',
'upload-proto-error' => 'Йăнăш протокол',
'upload-file-error' => 'Шалти йăнăш',
@@ -1162,8 +1147,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'nextdiff' => 'Малаллахи тӳрлетӳ →',
# Media information
-'file-info' => '(файл пыÑăкăшĕ: $1, MIME-Ñ‚Ä•ÑÄ•: $2)',
-'file-info-size' => '($1 × $2 пикÑел, файл пыÑăкăше: $3, MIME-Ñ‚Ä•ÑÄ•: $4)',
+'file-info' => 'файл пыÑăкăшĕ: $1, MIME-Ñ‚Ä•ÑÄ•: $2',
+'file-info-size' => '$1 × $2 пикÑел, файл пыÑăкăше: $3, MIME-Ñ‚Ä•ÑÄ•: $4',
'file-nohires' => '<small>ПыÑăкрах калăпăшли çук.</small>',
# Special:NewFiles
diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php
index 049fa42d..ac542792 100644
--- a/languages/messages/MessagesCy.php
+++ b/languages/messages/MessagesCy.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Arwel Parry
* @author Lloffiwr
* @author Malafaya
* @author Reedy
@@ -130,8 +131,7 @@ $messages = array(
'tog-editsection' => 'Galluogi golygu adran trwy ddolennau [golygu] uwchben yr adran',
'tog-editsectiononrightclick' => 'Galluogi golygu adran drwy dde-glicio ar bennawd yr adran (JavaScript)',
'tog-showtoc' => 'Dangos y daflen gynnwys (ar gyfer tudalennau sydd â mwy na 3 pennawd)',
-'tog-rememberpassword' => "Y cyfrifiadur hwn i gofio'r cyfrinair",
-'tog-editwidth' => "Chwyddo'r blwch golygu i lanw'r sgrîn",
+'tog-rememberpassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
'tog-watchcreations' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu creu',
'tog-watchdefault' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu golygu',
'tog-watchmoves' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu symud',
@@ -276,31 +276,21 @@ $messages = array(
'faqpage' => 'Project:Cwestiynau cyffredin',
# Vector skin
-'vector-action-addsection' => 'Ychwanegu adran',
-'vector-action-delete' => 'Dileu',
-'vector-action-move' => 'Symud',
-'vector-action-protect' => 'Diogelu',
-'vector-action-undelete' => 'Adfer',
-'vector-action-unprotect' => 'Dad-ddiogelu',
-'vector-namespace-category' => 'Categori',
-'vector-namespace-help' => 'Tudalen gymorth',
-'vector-namespace-image' => 'Ffeil',
-'vector-namespace-main' => 'Tudalen',
-'vector-namespace-media' => 'Tudalen cyfrwng',
-'vector-namespace-mediawiki' => 'Neges',
-'vector-namespace-project' => 'Tudalen brosiect',
-'vector-namespace-special' => 'Tudalen arbennig',
-'vector-namespace-talk' => 'Sgwrs',
-'vector-namespace-template' => 'Nodyn',
-'vector-namespace-user' => 'Tudalen defnyddiwr',
-'vector-view-create' => 'Dechrau',
-'vector-view-edit' => 'Golygu',
-'vector-view-history' => 'Gweld yr hanes',
-'vector-view-view' => 'Darllen',
-'vector-view-viewsource' => 'Dangos côd y dudalen',
-'actions' => 'Gweithrediadau',
-'namespaces' => 'Parthau',
-'variants' => 'Amrywiolion',
+'vector-action-addsection' => 'Ychwanegu adran',
+'vector-action-delete' => 'Dileu',
+'vector-action-move' => 'Symud',
+'vector-action-protect' => 'Diogelu',
+'vector-action-undelete' => 'Adfer',
+'vector-action-unprotect' => 'Dad-ddiogelu',
+'vector-simplesearch-preference' => 'Galluogi awgrymiadau chwilio uwch (gwedd Vector yn unig)',
+'vector-view-create' => 'Dechrau',
+'vector-view-edit' => 'Golygu',
+'vector-view-history' => 'Gweld yr hanes',
+'vector-view-view' => 'Darllen',
+'vector-view-viewsource' => 'Dangos côd y dudalen',
+'actions' => 'Gweithrediadau',
+'namespaces' => 'Parthau',
+'variants' => 'Amrywiolion',
'errorpagetitle' => 'Gwall',
'returnto' => 'Dychwelyd at $1.',
@@ -361,6 +351,9 @@ Mae gormod o ddefnyddwyr am weld y dudalen hon ar unwaith.
Arhoswch ychydig cyn ceisio mynd at y dudalen hon eto.
$1',
+'pool-timeout' => 'Cafwyd goroedi wrth aros am y clo',
+'pool-queuefull' => 'Mae cwt y gronfa brosesu yn llawn',
+'pool-errorunknown' => 'Gwall anhysbys',
# 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' => 'Ynglŷn â {{SITENAME}}',
@@ -524,7 +517,8 @@ Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{S
'yourname' => 'Eich enw defnyddiwr:',
'yourpassword' => 'Eich cyfrinair:',
'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
-'remembermypassword' => "Y cyfrifiadur hwn i gofio'r cyfrinair",
+'remembermypassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (am hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
+'securelogin-stick-https' => "Cadw'r cyswllt â HTTPS ar ôl mewngofnodi",
'yourdomainname' => 'Eich parth',
'externaldberror' => "Naill ai: cafwyd gwall dilysu allanol ar databas neu: ar y llaw arall efallai nad oes hawl gennych chi i ddiwygio'ch cyfrif allanol.",
'login' => 'Mewngofnodi',
@@ -541,6 +535,7 @@ Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{S
'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.",
'gotaccountlink' => 'Mewngofnodwch',
'createaccountmail' => 'trwy e-bost',
+'createaccountreason' => 'Rheswm:',
'badretype' => "Nid yw'r cyfrineiriau'n union yr un fath.",
'userexists' => 'Mae rhywun arall wedi dewis yr enw defnyddiwr hwn. Dewiswch un arall os gwelwch yn dda.',
'loginerror' => 'Problem mewngofnodi',
@@ -550,7 +545,7 @@ Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{S
'noname' => 'Dydych chi ddim wedi cynnig enw defnyddiwr dilys.',
'loginsuccesstitle' => 'Llwyddodd y mewngofnodi',
'loginsuccess' => "'''Yr ydych wedi mewngofnodi i {{SITENAME}} fel \"\$1\".'''",
-'nosuchuser' => "Does yna'r un defnyddiwr â'r enw \"\$1\".
+'nosuchuser' => "Does dim defnyddiwr o'r enw \"\$1\".
Mae'r rhaglen yn gwahaniaethu rhwng llythrennau bach a mawr.
Sicrhewch eich bod chi wedi sillafu'r enw'n gywir, neu [[Special:UserLogin/signup|crëwch gyfrif newydd]].",
'nosuchusershort' => 'Does dim defnyddiwr o\'r enw "<nowiki>$1</nowiki>". Gwiriwch eich sillafu.',
@@ -560,6 +555,7 @@ Sicrhewch eich bod chi wedi sillafu'r enw'n gywir, neu [[Special:UserLogin/signu
'wrongpasswordempty' => 'Roedd y cyfrinair yn wag. Rhowch gynnig arall arni.',
'passwordtooshort' => "Mae'n rhaid fod gan gyfrinair o leia $1 {{PLURAL:$1|nod}}.",
'password-name-match' => "Rhaid i'ch cyfrinair a'ch enw defnyddiwr fod yn wahanol i'w gilydd.",
+'password-login-forbidden' => "Gwaharddwyd defnyddio'r enw defnyddiwr a'r cyfrinair hwn.",
'mailmypassword' => 'Anfoner cyfrinair newydd ataf trwy e-bost',
'passwordremindertitle' => 'Hysbysu cyfrinair dros dro newydd ar gyfer {{SITENAME}}',
'passwordremindertext' => 'Mae rhywun (chi mwy na thebyg, o\'r cyfeiriad IP $1) wedi gofyn i ni anfon cyfrinair newydd atoch ar gyfer {{SITENAME}} ($4).
@@ -594,6 +590,9 @@ Oedwch ychydig cyn mentro eto.',
'loginlanguagelabel' => 'Iaith: $1',
'suspicious-userlogout' => 'Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.',
+# E-mail sending
+'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
+
# Password reset dialog
'resetpass' => 'Newid cyfrinair y cyfrif',
'resetpass_announce' => "Fe wnaethoch fewngofnodi gyda chôd dros dro oddi ar e-bost.
@@ -645,10 +644,11 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
'showlivepreview' => 'Rhagolwg byw',
'showdiff' => 'Dangos newidiadau',
'anoneditwarning' => "'''Dalier sylw''': Nid ydych wedi mewngofnodi. Fe fydd eich cyfeiriad IP yn ymddangos ar hanes golygu'r dudalen hon. Gallwch ddewis cuddio'ch cyfeiriad IP drwy greu cyfrif (a mewngofnodi) cyn golygu.",
+'anonpreviewwarning' => "''Nid ydych wedi mewngofnodi. Os y cadwch eich newidiadau caiff eich cyfeiriad IP ei gofnodi yn hanes golygu'r dudalen hon.''",
'missingsummary' => "'''Sylwer:''' Nid ydych wedi gosod nodyn yn y blwch 'Crynodeb'.
Os y pwyswch eto ar 'Cadw'r dudalen' caiff y golygiad ei gadw heb nodyn.",
'missingcommenttext' => 'Rhowch eich sylwadau isod.',
-'missingcommentheader' => "'''Nodyn:''' Nid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc/Pennawd:'. Os y cliciwch 'Cadw'r dudalen' eto fe gedwir y golygiad heb bennawd.",
+'missingcommentheader' => "'''Nodyn:''' Nid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc/Pennawd:'. Os y cliciwch \"{{int:savearticle}}\" eto fe gedwir y golygiad heb bennawd.",
'summary-preview' => "Rhagolwg o'r crynodeb:",
'subject-preview' => 'Rhagolwg pwnc/pennawd:',
'blockedtitle' => "Mae'r defnyddiwr hwn wedi cael ei flocio",
@@ -716,8 +716,12 @@ Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
'usercsspreview' => "'''Cofiwch - dim ond rhagolwg o'ch CSS defnyddiwr yw hwn.'''
'''Nid yw wedi'i gadw eto!'''",
'userjspreview' => "'''Cofiwch -- dim ond rhagolwg o'ch JavaScript yw hwn; nid yw wedi'i gadw eto!'''",
+'sitecsspreview' => "'''Cofiwch - dim ond rhagolwg o'ch CSS yw hwn.'''
+'''Nid yw wedi'i gadw eto!'''",
+'sitejspreview' => "'''Cofiwch - dim ond rhagolwg o'ch côd JavaScript yw hwn.'''
+'''Nid yw wedi'i rhoi ar gadw eto!'''",
'userinvalidcssjstitle' => "'''Rhybudd:''' Nid oes gwedd o'r enw \"\$1\".
-Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/monobook.css yn hytrach na {{ns:user}}:Foo/Monobook.css.",
+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'r dudalen wedi ei chadw eto.'''",
@@ -755,8 +759,6 @@ Rydych chi'n cadarnhau mai chi yw awdur y cyfraniad, neu eich bod chi wedi'i gop
Os nad ydych chi'n fodlon i'ch gwaith gael ei olygu heb drugaredd, neu i gopïau ymddangos ar draws y we, peidiwch a'i gyfrannu yma.<br />
Rydych chi'n cadarnhau mai chi yw awdur y cyfraniad, neu eich bod chi wedi'i gopïo o'r parth cyhoeddus (''public domain'') neu rywle rhydd tebyg.<br />
'''PEIDIWCH Â CHYFRANNU GWAITH O DAN HAWLFRAINT HEB GANIATÂD!'''",
-'longpagewarning' => "'''RHYBUDD: Mae'r dudalen hon yn $1 cilobeit o hyd; mae rhai porwyr yn cael trafferth wrth lwytho tudalennau sy'n hirach na 32 kb.
-Byddai'n dda o beth llunio sawl tudalen llai o hyd o ddeunydd y dudalen hon.'''",
'longpageerror' => "'''GWALL: Mae'r testun yr ydych wedi ei osod yma yn $1 cilobeit o hyd, ac yn hwy na'r hyd eithaf o $2 cilobeit.
Ni ellir ei roi ar gadw.'''",
'readonlywarning' => "'''RHYBUDD: Mae'r databas wedi'i gloi am gyfnod er mwyn cynnal a chadw, felly fyddwch chi ddim yn gallu cadw'ch golygiadau ar hyn o bryd. Rydyn ni'n argymell eich bod chi'n copïo a gludo'r testun i ffeil a'i gadw ar eich disg tan bod y sustem yn weithredol eto.'''
@@ -804,9 +806,9 @@ Mae ar gael yn barod.',
Dylai fod llai na $2 {{PLURAL:$2|galwad|alwad|alwad|galwad|galwad|galwad}} yn y dudalen, ond ar hyn o bryd mae $1 {{PLURAL:$1|galwad|alwad|alwad|galwad|galwad|galwad}} ynddi.",
'expensive-parserfunction-category' => "Tudalennau a gormod o alwadau ar ffwythiannau dosrannu sy'n dreth ar adnoddau",
-'post-expand-template-inclusion-warning' => "Rhybudd: Mae'r maint cynnwys nodyn yn rhy fawr.
+'post-expand-template-inclusion-warning' => "'''Rhybudd:''' Mae maint y nodiadau ar ôl eu chwyddo yn rhy fawr.
Ni chaiff rhai nodiadau eu cynnwys.",
-'post-expand-template-inclusion-category' => "Tudalennau a phatrymlun ynddynt sy'n fwy na chyfyngiad y meddalwedd",
+'post-expand-template-inclusion-category' => "Tudalennau a nodiadau ynddynt sy'n fwy na chyfyngiad y meddalwedd",
'post-expand-template-argument-warning' => "'''Rhybudd:''' Mae gan y dudalen hon o leiaf un arg nodyn sydd a maint ehangu rhy fawr.
Cafodd yr argiau hyn eu hepgor.",
'post-expand-template-argument-category' => 'Tudalennau lle ceir argiau nodiadau coll',
@@ -932,6 +934,8 @@ $1",
'logdelete-failure' => "'''Ni ellid gosod cyfyngiadau ar y gallu i weld y cofnod lòg:'''
$1",
'revdel-restore' => 'Newid gwelededd',
+'revdel-restore-deleted' => 'diwygiadau dilëedig',
+'revdel-restore-visible' => 'diwygiadau gweladwy',
'pagehist' => 'Hanes y dudalen',
'deletedhist' => 'Hanes dilëedig',
'revdelete-content' => 'cynnwys',
@@ -999,11 +1003,13 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
# Diffs
'history-title' => "Hanes golygu '$1'",
'difference' => '(Gwahaniaethau rhwng diwygiadau)',
+'difference-multipage' => '(Y gwahaniaeth rhwng y tudalennau)',
'lineno' => 'Llinell $1:',
'compareselectedversions' => 'Cymharer y fersiynau dewisedig',
'showhideselectedversions' => 'Dangos/cuddio y diwygiadau dewisedig',
'editundo' => 'dadwneud',
-'diff-multi' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol.)',
+'diff-multi' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan {{PLURAL:$2||un defnyddiwr|$2 ddefnyddiwr|$2 defnyddiwr|$2 o ddefnyddwyr|$2 o ddefnyddwyr}}.)',
+'diff-multi-manyusers' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan mwy na $2 {{PLURAL:$2|o ddefnyddwyr}}.)',
# Search results
'searchresults' => "Canlyniadau'r chwiliad",
@@ -1038,6 +1044,7 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
'searchprofile-everything-tooltip' => "Chwilio'r cynnwys gyfan (gan gynnwys tudalennau sgwrs)",
'searchprofile-advanced-tooltip' => 'Chwilio drwy parthau dewisol',
'search-result-size' => '$1 ({{PLURAL:$2|dim geiriau|$2 gair|$2 air|$2 gair|$2 gair|$2 gair|}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 aelod}} ({{PLURAL:$2|$2 is-gategori}}, {{PLURAL:$3|$3 ffeil}})',
'search-result-score' => 'Perthnasedd: $1%',
'search-redirect' => '(ailgyfeiriad $1)',
'search-section' => '(adran $1)',
@@ -1114,6 +1121,7 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
'contextlines' => "Nifer y llinellau i'w dangos ar gyfer pob hit:",
'contextchars' => 'Nifer y llythrennau a nodau eraill i bob llinell:',
'stub-threshold' => 'Trothwy ar gyfer fformatio <a href="#" class="stub">cyswllt eginyn</a> (beitiau):',
+'stub-threshold-disabled' => 'Analluogwyd',
'recentchangesdays' => "Nifer y diwrnodau i'w dangos yn 'newidiadau diweddar':",
'recentchangesdays-max' => '(hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})',
'recentchangescount' => "Nifer y golygiadau i'w dangos yn ddiofyn:",
@@ -1147,6 +1155,7 @@ Dyma allwedd wedi ei chreu ar hap y gallwch ei defnyddio: $1",
'prefs-files' => 'Ffeiliau',
'prefs-custom-css' => 'CSS o hunan-ddewis',
'prefs-custom-js' => 'JS o hunan-ddewis',
+'prefs-common-css-js' => 'CSS/JS ar y cyd ar gyfer pob gwedd:',
'prefs-reset-intro' => "Gallwch ddefnyddio'r dudalen hon i ailosod eich dewisiadau i'r rhai diofyn.
Ni allwch ddadwneud y weithred hon.",
'prefs-emailconfirm-label' => "Cadarnhau'r e-bost:",
@@ -1185,9 +1194,15 @@ Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen d
'prefs-advancedrendering' => 'Dewisiadau uwch',
'prefs-advancedsearchoptions' => 'Dewisiadau uwch',
'prefs-advancedwatchlist' => 'Dewisiadau uwch',
-'prefs-display' => 'Dewisiadau arddangos',
+'prefs-displayrc' => 'Dewisiadau arddangos',
+'prefs-displaysearchoptions' => 'Dewisiadau arddangos',
+'prefs-displaywatchlist' => 'Dewisiadau arddangos',
'prefs-diffs' => "Cymharu golygiadau ('gwahan')",
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Y cyfeiriad e-bost yn ymddangos yn un dilys',
+'email-address-validity-invalid' => 'Rhowch gyfeiriad e-bost dilys',
+
# User rights
'userrights' => 'Rheoli galluoedd defnyddwyr',
'userrights-lookup-user' => 'Rheoli grwpiau defnyddiwr',
@@ -1271,6 +1286,7 @@ Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen d
'right-hideuser' => "Atal enw defnyddiwr rhag i'r cyhoedd ei weld",
'right-ipblock-exempt' => 'Mynd heibio i flociau IP, blociau awtomatig a blociau amrediad',
'right-proxyunbannable' => 'Mynd heibio i flociau awtomatig gan weinyddion dirprwyol',
+'right-unblockself' => 'Dad-flocio eu hunain',
'right-protect' => 'Newid lefelau diogelu a golygu tudalennau wedi eu diogelu',
'right-editprotected' => 'Golygu tudalennau sydd wedi eu diogelu (ond bod hebddynt ddiogelu sgydol)',
'right-editinterface' => "Golygu'r rhyngwyneb",
@@ -1293,7 +1309,6 @@ Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen d
'right-siteadmin' => "Cloi a datgloi'r databas",
'right-reset-passwords' => 'Ailosod cyfrinair defnyddwyr eraill',
'right-override-export-depth' => 'Allforio tudalennau gan gynnwys tudalennau cysylltiedig hyd at ddyfnder o 5',
-'right-versiondetail' => "Gweld y manylion estynedig am y fersiwn hwn o'r meddalwedd",
'right-sendemail' => 'Anfon e-bost at ddefnyddwyr eraill',
# User rights log
@@ -1316,7 +1331,7 @@ Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen d
'action-upload' => "uwchlwytho'r ffeil",
'action-reupload' => 'trosysgrifo ffeil sydd eisoes ar gael',
'action-reupload-shared' => "Uwchlwytho ffeil ar wici lleol, gyda'r un teitl â ffeil yn y storfa gyfrannol",
-'action-upload_by_url' => "uuchlwytho'r ffeil o gyfeiriad URL",
+'action-upload_by_url' => "uwchlwytho'r ffeil o gyfeiriad URL",
'action-writeapi' => "defnyddio'r API i ysgrifennu a thrin y tudalennau",
'action-delete' => "dileu'r dudalen",
'action-deleterevision' => "dileu'r golygiad",
@@ -1344,14 +1359,9 @@ Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen d
'recentchanges-legend' => "Dewisiadau'r newidiadau diweddar",
'recentchangestext' => "Dilynwch y newidiadau diweddaraf i'r wici ar y dudalen hon.",
'recentchanges-feed-description' => "Dilynwch y newidiadau diweddaraf i'r wici gyda'r porthiant hwn.",
-'recentchanges-label-legend' => 'Eglurhad: $1.',
-'recentchanges-legend-newpage' => '$1 - tudalen newydd',
'recentchanges-label-newpage' => 'Dechreuwyd tudalen newydd wrth olygu',
-'recentchanges-legend-minor' => '$1 - mân olygiad',
'recentchanges-label-minor' => 'Mân olygiad',
-'recentchanges-legend-bot' => '$1 - golygiad gan fot',
'recentchanges-label-bot' => 'Golygwyd gan fot',
-'recentchanges-legend-unpatrolled' => '$1 - golygiad heb dderbyn ymweliad patrôl eto',
'recentchanges-label-unpatrolled' => "Nid yw'r golygiad hwn wedi derbyn ymweliad patrôl eto",
'rcnote' => "Isod mae'r '''$1''' newid diweddaraf yn ystod y {{PLURAL:$2|diwrnod|diwrnod|deuddydd|tridiau|'''$2''' diwrnod|'''$2''' diwrnod}} diwethaf, hyd at $5, $4.",
'rcnotefrom' => "Isod rhestrir pob newid ers '''$2''' (hyd at '''$1''' ohonynt).",
@@ -1397,6 +1407,9 @@ Gallwch hefyd adael i eraill anfon e-bost atoch trwy'r cyswllt ar eich tudalen d
'upload_directory_missing' => "Mae'r cyfeiriadur uwchlwytho ($1) yn eisiau, ac ni allai'r gweinydd gwe ei greu.",
'upload_directory_read_only' => "Ni all y gweinydd ysgrifennu i'r cyfeiriadur uwchlwytho ($1).",
'uploaderror' => "Gwall tra'n uwchlwytho ffeil",
+'upload-recreate-warning' => "'''Rhybudd: Cafodd ffeil o'r enw hwn ei dileu neu ei symud.'''
+
+Dyma'r lòg dileu a symud ar gyfer y dudalen hon, er gwybodaeth:",
'uploadtext' => "Defnyddiwch y ffurflen isod i uwchlwytho ffeiliau.
I weld a chwilio am ffeiliau sydd eisoes wedi eu huwchlwytho, ewch at y [[Special:FileList|rhestr o'r ffeiliau sydd wedi eu huwchlwytho]]. I weld cofnodion uwchlwytho a dileu ffeiliau, ewch at y [[Special:Log/upload|lòg uwchlwytho]] neu'r [[Special:Log/delete|lòg dileu]].
@@ -1415,7 +1428,7 @@ Gweler [[Special:NewFiles|oriel y ffeiliau newydd]] i fwrw golwg drostynt.",
'filedesc' => 'Crynodeb',
'fileuploadsummary' => 'Crynodeb:',
'filereuploadsummary' => "Newidiadau i'r ffeil:",
-'filestatus' => 'Statws hawlfraint:',
+'filestatus' => 'Statws yr hawlfraint:',
'filesource' => 'Ffynhonnell:',
'uploadedfiles' => 'Ffeiliau a uwchlwythwyd',
'ignorewarning' => "Anwybydder y rhybudd, a rhoi'r dudalen ar gadw beth bynnag",
@@ -1429,6 +1442,17 @@ Gweler [[Special:NewFiles|oriel y ffeiliau newydd]] i fwrw golwg drostynt.",
'filetype-unwanted-type' => "Mae'r math '''\".\$1\"''' o ffeil yn anghymeradwy. Mae'n well defnyddio ffeil {{PLURAL:\$3|o'r math|o'r math|o'r mathau|o'r mathau|o'r mathau|o'r mathau}} \$2.",
'filetype-banned-type' => "Ni chaniateir ffeiliau o'r math '''\".\$1\"'''. \$2 yw'r {{PLURAL:\$3|math|math|mathau|mathau|mathau|mathau}} o ffeil a ganiateir.",
'filetype-missing' => "Nid oes gan y ffeil hon estyniad (megis '.jpg').",
+'empty-file' => "Mae'r ffeil a gyflwynwyd gennych yn wag.",
+'file-too-large' => "Mae'r ffeil a gyflwynwyd gennych yn rhy fawr.",
+'filename-tooshort' => "Mae enw'r ffeil yn rhy fyr.",
+'filetype-banned' => "Mae'r math hwn o ffeil wedi ei wahardd.",
+'verification-error' => "Nid yw'r ffeil hon wedi ei derbyn wrth ei gwirio.",
+'hookaborted' => 'Cafodd y darpar newid ei derfynu gan fachyn estyniad.',
+'illegal-filename' => "Nid yw'r enw ffeil hwn yn cael ei ganiatáu.",
+'overwrite' => 'Ni chaniateir trosysgrifo ffeil sydd eisoes yn bod.',
+'unknown-error' => 'Cafwyd gwall anhysbys.',
+'tmp-create-error' => 'Wedi methu llunio ffeil dros dro.',
+'tmp-write-error' => "Cafwyd gwall wrth ysgrifennu'r ffeil dros dro.",
'large-file' => "Argymhellir na ddylai ffeil fod yn fwy na $1. Mae'r ffeil hwn yn $2 o faint.",
'largefileserver' => "Mae'r ffeil yn fwy na'r hyn mae'r gweinydd yn ei ganiatau.",
'emptyfile' => "Ymddengys fod y ffeil a uwchlwythwyd yn wag. Efallai bod gwall teipio yn enw'r ffeil. Sicrhewch eich bod wir am uwchlwytho'r ffeil.",
@@ -1457,19 +1481,20 @@ Ewch nôl ac uwchlwythwch y ffeil gydag enw gwahanol iddo.
'file-exists-duplicate' => "Dyblgeb yw'r ffeil hwn o'r {{PLURAL:$1|ffeil|ffeil|ffeiliau|ffeiliau|ffeiliau|ffeiliau}} sy'n dilyn:",
'file-deleted-duplicate' => "Mae ffeil union debyg i hon ([[:$1]]) eisoes wedi cael ei dileu.
Dylech edrych ar hanes dileu'r ffeil honno cyn bwrw ati i'w llwytho unwaith eto.",
-'successfulupload' => 'Wedi llwyddo uwchlwytho',
'uploadwarning' => 'Rhybudd uwchlwytho',
'uploadwarning-text' => 'Newidiwch ddisgrifiad y ffeil isod ac yna ceisiwch ei huwchlwytho eto, os gwelwch yn dda.',
'savefile' => "Cadw'r ffeil",
'uploadedimage' => 'wedi llwytho "[[$1]]"',
'overwroteimage' => 'wedi uwchlwytho fersiwn newydd o "[[$1]]"',
'uploaddisabled' => "Ymddiheurwn; mae uwchlwytho wedi'i analluogi.",
+'copyuploaddisabled' => 'Analluogwyd uwchlwytho gan URL.',
+'uploadfromurl-queued' => "Mae'r ffeil mewn ciw, yn disgwyl cael ei huwchlwytho.",
'uploaddisabledtext' => 'Analluogwyd uwchlwytho ffeiliau ar y wefan hon.',
'php-uploaddisabledtext' => 'Anablwyd uwchlwytho ffeiliau yn PHP.
Gwiriwch y gosodiad ar file_uploads.',
'uploadscripted' => "Mae'r ffeil hon yn cynnwys HTML neu sgript a all achosi problemau i borwyr gwe.",
'uploadvirus' => 'Mae firws gan y ffeil hon! Manylion: $1',
-'upload-source' => 'Y ffeil gwreiddiol',
+'upload-source' => 'Y ffeil wreiddiol',
'sourcefilename' => "Enw'r ffeil wreiddiol:",
'sourceurl' => 'URL y gwreiddiol:',
'destfilename' => 'Enw ffeil y cyrchfan:',
@@ -1484,6 +1509,14 @@ Dylech ddarllen y $1 cyn bwrw ati i'w uwchlwytho unwaith eto.",
Ail-feddyliwch a ddylech barhau i uwchlwytho'r ffel hon.
Dyma'r lòg dileu ar gyfer y ffeil i chi gael gweld:",
'filename-bad-prefix' => "Mae'r enw ar y ffeil yr ydych yn ei uwchlwytho yn dechrau gyda '''\"\$1\"'''. Mae'r math hwn o enw diystyr fel arfer yn cael ei osod yn awtomatig gan gamerâu digidol. Mae'n well gosod enw sy'n disgrifio'r ffeil arno.",
+'upload-success-subj' => 'Wedi llwyddo uwchlwytho',
+'upload-success-msg' => "Llwyddwyd i uwchlwytho'r ffeil o [$2]. Mae ar gael yma: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => 'Cafwyd problem wrth uwchlwytho',
+'upload-failure-msg' => 'Cafwyd problem wrth uwchlwytho o [$2]:
+
+$1',
+'upload-warning-subj' => 'Rhybudd uwchlwytho',
+'upload-warning-msg' => 'Cafwyd problem wrth uwchlwytho o [$2]. Gallwch ddychwelyd at y [[Special:Upload/stash/$1|ffurflen uwchlwytho]] i ddatrys y broblem.',
'upload-proto-error' => 'Protocol gwallus',
'upload-proto-error-text' => "Rhaid cael URLs yn dechrau gyda <code>http://</code> neu <code>ftp://</code> wrth uwchlwytho'n bell.",
@@ -1550,6 +1583,7 @@ Gallwch newid trefn y rhestr trwy bwyso ar bennawd colofn.",
'listfiles_search_for' => "Chwilio am enw'r ddelwedd:",
'imgfile' => 'ffeil',
'listfiles' => "Rhestr o'r holl ffeiliau",
+'listfiles_thumb' => 'Mân-lun',
'listfiles_date' => 'Dyddiad',
'listfiles_name' => 'Enw',
'listfiles_user' => 'Defnyddiwr',
@@ -1664,8 +1698,8 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
'statistics-edits' => 'Golygiadau ers y dechrau ar {{SITENAME}}',
'statistics-edits-average' => "Golygiadau'r dudalen, ar gyfartaledd",
'statistics-views-total' => 'Cyfanswm yr ymweliadau',
+'statistics-views-total-desc' => 'Ni chynhwysir ymweliadau â thudalennau nad ydynt yn bod na thudalennau arbennig',
'statistics-views-peredit' => 'Ymweliadau i bob golygiad:',
-'statistics-jobqueue' => 'Hyd y [http://www.mediawiki.org/wiki/Manual:Job_queue llinell tasgau]',
'statistics-users' => '[[Special:ListUsers|Defnyddwyr]] cofrestredig',
'statistics-users-active' => 'Defnyddwyr gweithgar',
'statistics-users-active-desc' => 'Defnyddwyr sydd wedi gweithredu unwaith neu ragor yn ystod y {{PLURAL:$1||diwrnod|deuddydd|tridiau|$1 diwrnod|$1 diwrnod}} diwethaf',
@@ -1673,11 +1707,12 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
'disambiguations' => 'Tudalennau gwahaniaethu',
'disambiguationspage' => 'Template:Gwahaniaethu',
-'disambiguations-text' => "Mae'r tudalennau canlynol yn cysylltu â thudalennau gwahaniaethu. Yn hytrach dylent gysylltu'n syth â'r erthygl briodol.<br />Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
+'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau wici, sydd yn cysylltu â '''thudalennau gwahaniaethu'''. Yn hytrach dylent arwain yn syth at yr erthygl briodol.<br />
+Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
'doubleredirects' => 'Ailgyfeiriadau dwbl',
'doubleredirectstext' => "Mae pob rhes yn cynnwys cysylltiad i'r ddau ail-gyfeiriad cyntaf, ynghyd â chyrchfan yr ail ailgyfeiriad. Fel arfer bydd hyn yn rhoi'r gwir dudalen y dylai'r tudalennau cynt gyfeirio ati.
-Gosodwyd <s>llinell</s> drwy'r eitemau sydd eisoes wedi eu datrys.",
+Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
'double-redirect-fixed-move' => "Symudwyd [[$1]], a'i droi'n ailgyfeiriad at [[$2]]",
'double-redirect-fixer' => 'Y bot ailgyfeirio',
@@ -1700,6 +1735,8 @@ Gosodwyd <s>llinell</s> drwy'r eitemau sydd eisoes wedi eu datrys.",
'nmembers' => '$1 {{PLURAL:$1|aelod|aelod|aelod|aelod|aelod|aelod}}',
'nrevisions' => '$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}',
'nviews' => '$1 {{PLURAL:$1|ymweliad|ymweliad|ymweliad|ymweliad|ymweliad|ymweliad}}',
+'nimagelinks' => 'Defnyddir ar {{PLURAL:$1||$1 dudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}}',
+'ntransclusions' => 'defnyddir ar {{PLURAL:$1||$1 dudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}}',
'specialpage-empty' => "Ni chafwyd canlyniadau i'w hadrodd.",
'lonelypages' => 'Erthyglau heb gysylltiadau iddynt',
'lonelypagestext' => 'Nid oes cysylltiad yn arwain at y tudalennau canlynol oddi wrth unrhyw dudalen arall yn {{SITENAME}}. Nid ydynt wedi eu trawsgynnwys ar unrhyw dudalen yn {{SITENAME}}, chwaith.',
@@ -1856,36 +1893,42 @@ Protocoliau sy\'n cael eu cynnal: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => "Yn gallu tynnu'r holl grwpiau oddi ar eich cyfrif eich hunan",
# E-mail user
-'mailnologin' => "Does dim cyfeiriad i'w anfon iddo",
-'mailnologintext' => 'Rhaid eich bod wedi [[Special:UserLogin|mewngofnodi]]
+'mailnologin' => "Does dim cyfeiriad i'w anfon iddo",
+'mailnologintext' => 'Rhaid eich bod wedi [[Special:UserLogin|mewngofnodi]]
a bod cyfeiriad e-bost dilys yn eich [[Special:Preferences|dewisiadau]]
er mwyn medru anfon e-bost at ddefnyddwyr eraill.',
-'emailuser' => 'Anfon e-bost at y defnyddiwr hwn',
-'emailpage' => 'Anfon e-bost at ddefnyddiwr',
-'emailpagetext' => "Os yw'r cyfeiriad e-bost sydd yn newisiadau'r defnyddiwr hwn yn un dilys, gellir anfon neges ato o'i ysgrifennu ar y ffurflen isod.
+'emailuser' => 'Anfon e-bost at y defnyddiwr hwn',
+'emailpage' => 'Anfon e-bost at ddefnyddiwr',
+'emailpagetext' => "Os yw'r cyfeiriad e-bost sydd yn newisiadau'r defnyddiwr hwn yn un dilys, gellir anfon neges ato o'i ysgrifennu ar y ffurflen isod.
Bydd y cyfeiriad e-bost a osodoch yn eich [[Special:Preferences|dewisiadau chithau]] yn ymddangos ym maes \"Oddi wrth\" yr e-bost, fel bod y defnyddiwr arall yn gallu anfon ateb atoch.",
-'usermailererror' => 'Dychwelwyd gwall gan y rhaglen e-bost:',
-'defemailsubject' => 'E-bost {{SITENAME}}',
-'noemailtitle' => 'Dim cyfeiriad e-bost',
-'noemailtext' => "Nid yw'r defnyddiwr hwn wedi gosod cyfeiriad e-bost dilys.",
-'nowikiemailtitle' => 'Ni chaniateir e-bostio',
-'nowikiemailtext' => "Mae'r defnyddiwr hwn wedi dewis peidio derbyn e-byst oddi wrth ddefnyddwyr eraill.",
-'email-legend' => 'Anfon e-bost at ddefnyddiwr {{SITENAME}} arall',
-'emailfrom' => 'Oddi wrth:',
-'emailto' => 'At:',
-'emailsubject' => 'Pwnc:',
-'emailmessage' => 'Neges:',
-'emailsend' => 'Anfon',
-'emailccme' => "Anfoner gopi o'r neges e-bost ataf.",
-'emailccsubject' => "Copi o'ch neges at $1: $2",
-'emailsent' => "Neges e-bost wedi'i hanfon",
-'emailsenttext' => 'Mae eich neges e-bost wedi cael ei hanfon.',
-'emailuserfooter' => 'Anfonwyd yr e-bost hwn oddi wrth $1 at $2 trwy ddefnyddio\'r teclyn "Anfon e-bost at ddefnyddiwr" ar {{SITENAME}}.',
+'usermailererror' => 'Dychwelwyd gwall gan y rhaglen e-bost:',
+'defemailsubject' => 'E-bost {{SITENAME}}',
+'usermaildisabled' => 'Dim modd anfon e-bost at ddefnyddwyr',
+'usermaildisabledtext' => 'Ni allwch anfon e-bost at ddefnyddwyr eraill y wici hwn',
+'noemailtitle' => 'Dim cyfeiriad e-bost',
+'noemailtext' => "Nid yw'r defnyddiwr hwn wedi gosod cyfeiriad e-bost dilys.",
+'nowikiemailtitle' => 'Ni chaniateir e-bostio',
+'nowikiemailtext' => "Mae'r defnyddiwr hwn wedi dewis peidio derbyn e-byst oddi wrth ddefnyddwyr eraill.",
+'email-legend' => 'Anfon e-bost at ddefnyddiwr {{SITENAME}} arall',
+'emailfrom' => 'Oddi wrth:',
+'emailto' => 'At:',
+'emailsubject' => 'Pwnc:',
+'emailmessage' => 'Neges:',
+'emailsend' => 'Anfon',
+'emailccme' => "Anfoner gopi o'r neges e-bost ataf.",
+'emailccsubject' => "Copi o'ch neges at $1: $2",
+'emailsent' => "Neges e-bost wedi'i hanfon",
+'emailsenttext' => 'Mae eich neges e-bost wedi cael ei hanfon.',
+'emailuserfooter' => 'Anfonwyd yr e-bost hwn oddi wrth $1 at $2 trwy ddefnyddio\'r teclyn "Anfon e-bost at ddefnyddiwr" ar {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Yn gadael neges am ddigwyddiad yn y sustem.',
+'usermessage-editor' => 'Golygydd neges y system',
# Watchlist
'watchlist' => 'Fy rhestr wylio',
'mywatchlist' => 'Fy rhestr wylio',
-'watchlistfor' => "(ar gyfer '''$1''')",
+'watchlistfor2' => 'Yn ôl gofyn $1 $2',
'nowatchlist' => "Mae eich rhestr wylio'n wag.",
'watchlistanontext' => "Rhaid $1 er mwyn gweld neu ddiwygio'ch rhestr wylio.",
'watchnologin' => 'Nid ydych wedi mewngofnodi',
@@ -1946,10 +1989,13 @@ Os digwydd mwy o olygiadau i\'r dudalen cyn i chi ymweld â hi, ni chewch ragor
Sustem hysbysu {{SITENAME}}
--
-I newid eich gosodiadau gwylio, ymwelwch â
+I newid eich gosodiadau negeseuon hysbysu, ewch i
+{{fullurl:{{#special:Preferences}}}}
+
+I newid eich gosodiadau gwylio, ewch i
{{fullurl:{{#special:Watchlist}}/edit}}
-I dynnu\'r dudalen oddi ar eich rhestr wylio, ewch at
+I dynnu\'r dudalen oddi ar eich rhestr wylio, ewch i
$UNWATCHURL
Am fwy o gymorth ac adborth:
@@ -1973,7 +2019,7 @@ Os gwelwch yn dda, cadarnhewch eich bod chi wir yn bwriadu gwneud hyn, eich bod
Gwelwch y $2 am gofnod o\'r dileuon diweddar.',
'deletedarticle' => 'wedi dileu "[[$1]]"',
'suppressedarticle' => 'cuddiwyd "[[$1]]"',
-'dellogpage' => 'Log dileuon',
+'dellogpage' => 'Lòg dileuon',
'dellogpagetext' => "Ceir rhestr isod o'r dileadau diweddaraf.",
'deletionlog' => 'lòg dileuon',
'reverted' => "Wedi gwrthdroi i'r golygiad cynt",
@@ -2005,7 +2051,10 @@ mae rhywun arall eisoes wedi dadwneud y golygiad neu wedi golygu'r dudalen.
'revertpage-nouser' => 'Wedi gwrthdroi golygiadau gan (enw wedi ei guddio); wedi adfer y golygiad diweddaraf gan [[User:$1|$1]]',
'rollback-success' => "Gwrthdrowyd y golygiadau gan $1;
wedi gwrthdroi i'r golygiad olaf gan $2.",
-'sessionfailure' => "Mae'n debyg fod yna broblem gyda'ch sesiwn mewngofnodi; diddymwyd y weithred er mwyn diogelu'r sustem rhag ddefnyddwyr maleisus. Gwasgwch botwm 'nôl' eich porwr ac ail-lwythwch y dudalen honno, yna ceisiwch eto.",
+
+# Edit tokens
+'sessionfailure-title' => 'Sesiwn wedi methu',
+'sessionfailure' => "Mae'n debyg fod yna broblem gyda'ch sesiwn mewngofnodi; diddymwyd y weithred er mwyn diogelu'r sustem rhag ddefnyddwyr maleisus. Gwasgwch botwm 'nôl' eich porwr ac ail-lwythwch y dudalen honno, yna ceisiwch eto.",
# Protect
'protectlogpage' => 'Lòg diogelu',
@@ -2084,7 +2133,7 @@ Os oes tudalen newydd o'r un enw wedi cael ei chreu ers y dilëad, fe ddangosir
'undeleterevdel' => "Ni fydd yr adfer yn cael ei chyflawni pe byddai peth o'r diwygiad blaen i'r dudalen neu'r ffeil yn cael ei dileu oherwydd yr adfer.
Os hynny, rhaid i chi dad-ticio'r diwygiad dilëedig diweddaraf neu ei ddatguddio.",
'undeletehistorynoadmin' => "Mae'r dudalen hon wedi'i dileu. Dangosir y rheswm am y dileu isod, gyda manylion o'r holl ddefnyddwyr sydd wedi golygu'r dudalen cyn y dileu. Dim ond gweinyddwyr sydd yn gallu gweld testun y diwygiadau i'r dudalen.",
-'undelete-revision' => 'Testun y golygiad gan $3 o $1 (fel ag yr oedd am $5 ar $4), a ddilëwyd:',
+'undelete-revision' => 'Y golygiad gan $3 o $1 (fel ag yr oedd am $5 ar $4), a ddilëwyd:',
'undeleterevision-missing' => "Y diwygiad yn annilys neu yn eisiau.
Mae'n bosib bod nam ar y cyswllt, neu fod y diwygiad eisoes wedi ei adfer neu wedi ei ddileu o'r archif.",
'undelete-nodiff' => 'Ni chafwyd hyd i olygiad cynharach.',
@@ -2135,18 +2184,22 @@ $1',
'month' => 'Cyfraniadau hyd at fis:',
'year' => 'Cyfraniadau hyd at y flwyddyn:',
-'sp-contributions-newbies' => 'Dangos cyfraniadau gan gyfrifon newydd yn unig',
-'sp-contributions-newbies-sub' => 'Ar gyfer cyfrifon newydd',
-'sp-contributions-newbies-title' => 'Cyfraniadau defnyddwyr newydd',
-'sp-contributions-blocklog' => 'Lòg blocio',
-'sp-contributions-deleted' => 'cyfraniadau defnyddiwr i dudalennau dilëedig',
-'sp-contributions-logs' => 'logiau',
-'sp-contributions-talk' => 'sgwrs',
-'sp-contributions-userrights' => 'rheoli galluoedd defnyddwyr',
-'sp-contributions-blocked-notice' => "Mae'r defnyddiwr hwn wedi ei atal rhag golygu ar hyn o bryd. Mae'r cofnod diweddaraf yn y lòg blocio i'w weld isod:",
-'sp-contributions-search' => 'Chwilio am gyfraniadau',
-'sp-contributions-username' => 'Cyfeiriad IP neu enw defnyddiwr:',
-'sp-contributions-submit' => 'Chwilier',
+'sp-contributions-newbies' => 'Dangos cyfraniadau gan gyfrifon newydd yn unig',
+'sp-contributions-newbies-sub' => 'Ar gyfer cyfrifon newydd',
+'sp-contributions-newbies-title' => 'Cyfraniadau defnyddwyr newydd',
+'sp-contributions-blocklog' => 'Lòg blocio',
+'sp-contributions-deleted' => 'cyfraniadau defnyddiwr i dudalennau dilëedig',
+'sp-contributions-uploads' => 'Llwythiadau',
+'sp-contributions-logs' => 'logiau',
+'sp-contributions-talk' => 'sgwrs',
+'sp-contributions-userrights' => 'rheoli galluoedd defnyddwyr',
+'sp-contributions-blocked-notice' => "Mae'r defnyddiwr hwn wedi ei atal rhag golygu ar hyn o bryd. Mae'r cofnod diweddaraf yn y lòg blocio i'w weld isod:",
+'sp-contributions-blocked-notice-anon' => "Mae'r gallu i olygu o'r cyfeiriad IP hwn wedi ei atal ar hyn o bryd.
+Mae'r cofnod diweddaraf yn y lòg blocio i'w weld isod:",
+'sp-contributions-search' => 'Chwilio am gyfraniadau',
+'sp-contributions-username' => 'Cyfeiriad IP neu enw defnyddiwr:',
+'sp-contributions-toponly' => 'Dangos y diwygiadau diweddaraf yn unig',
+'sp-contributions-submit' => 'Chwilier',
# What links here
'whatlinkshere' => "Beth sy'n cysylltu yma",
@@ -2205,7 +2258,6 @@ $1',
'ipb-edit-dropdown' => "Golygu'r rhesymau dros flocio",
'ipb-unblock-addr' => 'Datflocio $1',
'ipb-unblock' => 'Datflocio enw defnyddiwr neu cyfeiriad IP',
-'ipb-blocklist-addr' => 'Y blociau cyfredol ar gyfer $1',
'ipb-blocklist' => 'Dangos y blociau cyfredol',
'ipb-blocklist-contribs' => 'Cyfraniadau $1',
'unblockip' => 'Dadflocio defnyddiwr',
@@ -2277,6 +2329,8 @@ Ni allwch greu cyfrif.',
'cant-block-while-blocked' => 'Ni allwch flocio defnyddwyr eraill tra bod bloc arnoch chithau.',
'cant-see-hidden-user' => "Mae'r defnyddiwr yr ydych am ei flocio eisoes wedi ei flocio a'i guddio.
Gan nad yw'r gallu \"hideuser\" gennych, ni allwch weld y bloc ar y defnyddiwr na'i olygu.",
+'ipbblocked' => 'Ni allwch flocio na dad-flocio defnyddwyr eraill, oherwydd eich bod chi eich hunan wedi eich blocio',
+'ipbnounblockself' => "Nid yw'r gallu gennych i ddad-flocio'ch hunan",
# Developer tools
'lockdb' => "Cloi'r databas",
@@ -2313,6 +2367,18 @@ Hefyd, mae'n amhosibl ysgrifennu dros ben tudalen sydd ar gael yn barod.
'''Dalier Sylw!'''
Gall hwn fod yn newid sydyn a llym i dudalen boblogaidd;
gwnewch yn siwr eich bod chi'n deall y canlyniadau cyn mynd ati.",
+'movepagetext-noredirectfixer' => "Wrth ddefnyddio'r ffurflen isod byddwch yn ail-enwi tudalen, gan symud ei hanes gyfan i'r enw newydd.
+Bydd yr hen deitl yn troi'n dudalen ailgyfeirio i'r teitl newydd.
+Byddwch gystal â thrwsio [[Special:DoubleRedirects|ailgyfeiriadau dwbl]] ac [[Special:BrokenRedirects|ailgyfeiriadau tor]].
+Eich cyfrifoldeb chi yw sicrhau bod cysylltiadau wici'n dal i arwain at y man iawn.
+
+Sylwch '''na fydd''' y dudalen yn symud os oes yna dudalen o'r enw newydd ar gael yn barod (heblaw ei bod hi'n wag neu'n ailgyfeiriad heb unrhyw hanes golygu).
+Felly, os y gwnewch gamgymeriad wrth ail-enwi tudalen dylai fod yn bosibl ei hail-enwi eto ar unwaith wrth yr enw gwreiddiol.
+Hefyd, mae'n amhosibl ysgrifennu dros ben tudalen sydd yn bodoli'n barod.
+
+'''Dalier Sylw!'''
+Gall hwn fod yn newid sydyn a llym i dudalen boblogaidd;
+gwnewch yn siwr eich bod chi'n deall y canlyniadau cyn mynd ati.",
'movepagetalktext' => "Bydd y dudalen sgwrs yn symud gyda'r dudalen hon '''onibai:'''
*bod tudalen sgwrs wrth yr enw newydd yn bodoli'n barod
*bod y blwch isod heb ei farcio.
@@ -2369,6 +2435,7 @@ nid yw'n bosib cyflawnu'r symud.",
'immobile-source-page' => 'Ni ellir symud y dudalen hon.',
'immobile-target-page' => "Ddim yn gallu symud i'r teitl newydd hwn.",
'imagenocrossnamespace' => 'Ni ellir symud ffeil i barth arall',
+'nonfile-cannot-move-to-file' => 'Ni ellir symud unrhywbeth heblaw ffeil i barth y ffeiliau',
'imagetypemismatch' => "Nid yw'r estyniad ffeil newydd yn cyfateb i'r math o ffeil",
'imageinvalidfilename' => "Mae enw'r ffeil darged yn annilys",
'fix-double-redirects' => "Yn diwygio unrhyw ailgyfeiriadau sy'n cysylltu i'r teitl gwreiddiol",
@@ -2443,10 +2510,11 @@ Mae cofnod o bob weithred o fewnforio i'w gweld ar y [[Special:Log/import|lòg m
'import-interwiki-namespace' => 'Parth y cyrchir ato:',
'import-upload-filename' => "Enw'r ffeil:",
'import-comment' => 'Sylw:',
-'importtext' => "Os gwelwch yn dda, allforiwch y ffeil o'r wici gwreiddiol trwy ddefnyddio'r nodwedd [[Special:Export|allforio]]. Rhowch hi ar gadw ar eich cyfrifiadur, ac yna ei huwchlwytho fan hyn.",
+'importtext' => "Allforiwch y ffeil o'r wici gwreiddiol trwy ddefnyddio'r [[Special:Export|nodwedd allforio]]. Rhowch hi ar gadw ar eich cyfrifiadur, ac wedyn ei huwchlwytho fan hyn.",
'importstart' => "Wrthi'n mewnforio...",
'import-revision-count' => '$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}',
'importnopages' => "Dim tudalennau i gael i'w mewnforio.",
+'imported-log-entries' => 'Mewnforiwyd $1 {{PLURAL:$1|cofnod|cofnod|gofnod|cofnod|cofnod|o gofnodion}} lòg.',
'importfailed' => 'Y mewnforio wedi methu: <nowiki>$1</nowiki>',
'importunknownsource' => "Y gwreiddiol i'w fewnforio o fath anhysbys",
'importcantopen' => "Ni ellid agor y ffeil i'w fewnforio",
@@ -2543,6 +2611,8 @@ Mae ffolder dros dro yn eisiau.',
'tooltip-rollback' => "Yn troi golygiad(au) y defnyddiwr diwethaf i'r dudalen hon yn ôl gydag un clic.",
'tooltip-undo' => 'Mae "dadwneud" yn troi\'r golygiad hwn yn ôl ac yn dangos rhagolwg o\'r golygiad adferedig.
Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
+'tooltip-preferences-save' => "Rhoi'r dewisiadau ar gadw",
+'tooltip-summary' => 'Rhowch grynodeb byr',
# Metadata
'nodublincore' => "Mae metadata RDF 'Dublin Core' wedi cael ei analluogi ar y gwasanaethwr hwn.",
@@ -2637,19 +2707,22 @@ $1",
'nextdiff' => 'Y fersiwn dilynol →',
# Media information
-'mediawarning' => "'''Rhybudd''': Gallasai'r math hwn o ffeil gynnwys côd maleisus.
+'mediawarning' => "'''Rhybudd''': Gallasai'r math hwn o ffeil gynnwys côd maleisus.
Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil.",
'imagemaxsize' => "Maint mwyaf y delweddau:<br />''(ar y tudalennau disgrifiad)''",
'thumbsize' => 'Maint mân-lun :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|tudalen|dudalen|dudalen|tudalen|thudalen|tudalen}}',
-'file-info' => '(maint y ffeil: $1, ffurf MIME: $2)',
-'file-info-size' => '($1 × $2 picsel, maint y ffeil: $3, ffurf MIME: $4)',
+'file-info' => 'maint y ffeil: $1, ffurf MIME: $2',
+'file-info-size' => '$1 × $2 picsel, maint y ffeil: $3, ffurf MIME: $4',
'file-nohires' => '<small>Wedi ei chwyddo hyd yr eithaf.</small>',
-'svg-long-desc' => '(Ffeil SVG, maint mewn enw $1 × $2 picsel, maint y ffeil: $3)',
+'svg-long-desc' => 'Ffeil SVG, maint mewn enw $1 × $2 picsel, maint y ffeil: $3',
'show-big-image' => 'Maint llawn',
'show-big-image-thumb' => '<small>Maint y rhagolwg: $1 × $2 picsel</small>',
'file-info-gif-looped' => 'dolennog',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ffrâm}}',
+'file-info-png-looped' => 'dolennog',
+'file-info-png-repeat' => "wedi'i chwarae {{PLURAL:$1||unwaith|ddwywaith|deirgwaith|$1 gwaith|$1 gwaith}}",
+'file-info-png-frames' => '$1 {{PLURAL:$1|ffrâm}}',
# Special:NewFiles
'newimages' => 'Oriel y ffeiliau newydd',
@@ -2810,6 +2883,7 @@ Ymateb yr amledd gofodol',
'exif-gpsareainformation' => "Enw'r parth GPS",
'exif-gpsdatestamp' => 'Dyddiad GPS',
'exif-gpsdifferential' => 'cywiriad differol y GPS',
+'exif-objectname' => 'Teitl byr',
# EXIF attributes
'exif-compression-1' => 'Heb ei gywasgu',
@@ -2891,6 +2965,8 @@ Ymateb yr amledd gofodol',
'exif-sensingmethod-7' => 'Synhwyrydd trillinol',
'exif-sensingmethod-8' => 'Synhwyrydd lliw llinellol dilyniannol',
+'exif-filesource-3' => 'Camera digidol lluniau llonydd',
+
'exif-scenetype-1' => "Delwedd wedi ei dynnu'n uniongyrchol",
'exif-customrendered-0' => 'Proses normal',
@@ -2967,25 +3043,25 @@ Ymateb yr amledd gofodol',
'limitall' => 'oll',
# E-mail address confirmation
-'confirmemail' => "Cadarnhau'r cyfeiriad e-bost",
-'confirmemail_noemail' => 'Does dim cyfeiriad e-bost dilys wedi ei osod yn eich [[Special:Preferences|dewisiadau defnyddiwr]].',
-'confirmemail_text' => "Cyn i chi allu defnyddio'r nodweddion e-bost, mae'n rhaid i {{SITENAME}} ddilysu'ch cyfeiriad e-bost. Pwyswch y botwm isod er mwyn anfon côd cadarnhau i'ch cyfeiriad e-bost. Bydd yr e-bost yn cynnwys cyswllt gyda chôd ynddi; llwythwch y cyswllt ar eich porwr er mwyn cadarnhau dilysrwydd eich cyfeiriad e-bost.",
-'confirmemail_pending' => "Mae côd cadarnhau eisoes wedi ei anfon atoch; os ydych newydd greu'ch cyfrif, hwyrach y gallech ddisgwyl rhai munudau amdano cyn gofyn yr eilwaith am gôd newydd.",
-'confirmemail_send' => 'Postiwch gôd cadarnhau',
-'confirmemail_sent' => "Wedi anfon e-bost er mwyn cadarnhau'r cyfeiriad.",
-'confirmemail_oncreate' => "Anfonwyd côd cadarnhau at eich cyfeiriad e-bost.
+'confirmemail' => "Cadarnhau'r cyfeiriad e-bost",
+'confirmemail_noemail' => 'Does dim cyfeiriad e-bost dilys wedi ei osod yn eich [[Special:Preferences|dewisiadau defnyddiwr]].',
+'confirmemail_text' => "Cyn i chi allu defnyddio'r nodweddion e-bost, mae'n rhaid i {{SITENAME}} ddilysu'ch cyfeiriad e-bost. Pwyswch y botwm isod er mwyn anfon côd cadarnhau i'ch cyfeiriad e-bost. Bydd yr e-bost yn cynnwys cyswllt gyda chôd ynddi; llwythwch y cyswllt ar eich porwr er mwyn cadarnhau dilysrwydd eich cyfeiriad e-bost.",
+'confirmemail_pending' => "Mae côd cadarnhau eisoes wedi ei anfon atoch; os ydych newydd greu'ch cyfrif, hwyrach y gallech ddisgwyl rhai munudau amdano cyn gofyn yr eilwaith am gôd newydd.",
+'confirmemail_send' => 'Postiwch gôd cadarnhau',
+'confirmemail_sent' => "Wedi anfon e-bost er mwyn cadarnhau'r cyfeiriad.",
+'confirmemail_oncreate' => "Anfonwyd côd cadarnhau at eich cyfeiriad e-bost.
Nid oes rhaid wrth y côd wrth fewngofnodi, ond rhaid ei ddefnyddio er mwyn galluogi offer ar y wici sy'n defnyddio e-bost.",
-'confirmemail_sendfailed' => "Ni fu'n bosibl danfon yr e-bost cadarnháu oddi wrth {{SITENAME}}. Gwiriwch eich cyfeiriad e-bost am nodau annilys.
+'confirmemail_sendfailed' => "Ni fu'n bosibl danfon yr e-bost cadarnháu oddi wrth {{SITENAME}}. Gwiriwch eich cyfeiriad e-bost am nodau annilys.
Dychwelodd yr ebostydd: $1",
-'confirmemail_invalid' => 'Côd cadarnhau annilys. Efallai fod y côd wedi dod i ben.',
-'confirmemail_needlogin' => 'Rhaid $1 er mwyn cadarnhau eich cyfeiriad e-bost.',
-'confirmemail_success' => "Mae eich cyfeiriad e-bost wedi'i gadarnhau.
+'confirmemail_invalid' => 'Côd cadarnhau annilys. Efallai fod y côd wedi dod i ben.',
+'confirmemail_needlogin' => 'Rhaid $1 er mwyn cadarnhau eich cyfeiriad e-bost.',
+'confirmemail_success' => "Mae eich cyfeiriad e-bost wedi'i gadarnhau.
Cewch [[Special:UserLogin|fewngofnodi]] a mwynhau'r wici.",
-'confirmemail_loggedin' => 'Cadarnhawyd eich cyfeiriad e-bost.',
-'confirmemail_error' => 'Cafwyd gwall wrth ddanfon eich cadarnhad.',
-'confirmemail_subject' => 'Cadarnhâd cyfeiriad e-bost ar {{SITENAME}}',
-'confirmemail_body' => 'Mae rhywun (chi, yn fwy na thebyg, o\'r cyfeiriad IP $1) wedi cofrestru\'r cyfrif "$2" ar {{SITENAME}} gyda\'r cyfeiriad e-bost hwn.
+'confirmemail_loggedin' => 'Cadarnhawyd eich cyfeiriad e-bost.',
+'confirmemail_error' => 'Cafwyd gwall wrth ddanfon eich cadarnhad.',
+'confirmemail_subject' => 'Cadarnhâd cyfeiriad e-bost ar {{SITENAME}}',
+'confirmemail_body' => 'Mae rhywun (chi, yn fwy na thebyg, o\'r cyfeiriad IP $1) wedi cofrestru\'r cyfrif "$2" ar {{SITENAME}} gyda\'r cyfeiriad e-bost hwn.
I gadarnhau mai chi yn wir yw perchennog y cyfrif hwn, ac i alluogi nodweddion e-bost ar {{SITENAME}}, agorwch y cyswllt hwn yn eich porwr:
@@ -2996,8 +3072,30 @@ Os *nad* chi sydd berchen y cyfrif hwn, dilynwch y cyswllt hwn er mwyn diddymu c
$5
Bydd y côd cadarnhau yn dod i ben am $4.',
-'confirmemail_invalidated' => "Diddymwyd y weithred o gadarnhau'r cyfeiriad e-bost",
-'invalidateemail' => 'Diddymu cadarnhad y cyfeiriad e-bost.',
+'confirmemail_body_changed' => 'Mae rhywun (chi, yn fwy na thebyg, o\'r cyfeiriad IP $1) wedi newid cyfeiriad e-bost y cyfrif "$2" ar {{SITENAME}} i\'r cyfeiriad e-bost hwn.
+
+I gadarnhau mai chi yn wir yw perchennog y cyfrif hwn, ac i ail-alluogi nodweddion e-bost ar {{SITENAME}}, agorwch y cyswllt hwn yn eich porwr:
+
+$3
+
+Os *nad* chi sydd berchen y cyfrif hwn, dilynwch y cyswllt hwn er mwyn diddymu cadarnhad y cyfeiriad e-bost:
+
+$5
+
+Bydd y côd cadarnhau yn dod i ben am $4.',
+'confirmemail_body_set' => 'Mae rhywun (chi, yn fwy na thebyg, o\'r cyfeiriad IP $1) wedi gosod cyfeiriad e-bost y cyfrif "$2" ar {{SITENAME}} i\'r cyfeiriad e-bost hwn.
+
+I gadarnhau mai chi yn wir yw perchennog y cyfrif hwn, ac i ail-alluogi nodweddion e-bost ar {{SITENAME}}, agorwch y cyswllt hwn yn eich porwr:
+
+$3
+
+Os *nad* chi sydd berchen y cyfrif hwn, dilynwch y cyswllt hwn er mwyn diddymu cadarnhad y cyfeiriad e-bost:
+
+$5
+
+Bydd y côd cadarnhau yn dod i ben am $4.',
+'confirmemail_invalidated' => "Diddymwyd y weithred o gadarnhau'r cyfeiriad e-bost",
+'invalidateemail' => 'Diddymu cadarnhad y cyfeiriad e-bost.',
# Scary transclusion
'scarytranscludedisabled' => '[Analluogwyd cynhwysiad rhyng-wici]',
@@ -3037,6 +3135,7 @@ Cadarnhewch eich bod chi wir am ail-greu'r dudalen.",
'table_pager_first' => 'Tudalen gyntaf',
'table_pager_last' => 'Tudalen olaf',
'table_pager_limit' => 'Dangos $1 eitem y dudalen',
+'table_pager_limit_label' => 'Eitemau ar bob tudalen:',
'table_pager_limit_submit' => 'Eler',
'table_pager_empty' => 'Dim canlyniadau',
@@ -3092,6 +3191,7 @@ Gallwch hefyd [[Special:Watchlist/edit|ddefnyddio\'r rhestr arferol]].',
'version-specialpages' => 'Tudalennau arbennig',
'version-parserhooks' => 'Bachau dosrannydd',
'version-variables' => 'Newidynnau',
+'version-skins' => 'Gweddau',
'version-other' => 'Arall',
'version-mediahandlers' => 'Trinyddion cyfryngau',
'version-hooks' => 'Bachau',
@@ -3103,6 +3203,13 @@ Gallwch hefyd [[Special:Watchlist/edit|ddefnyddio\'r rhestr arferol]].',
'version-hook-subscribedby' => 'Tanysgrifwyd gan',
'version-version' => '(Fersiwn $1)',
'version-license' => 'Trwydded',
+'version-poweredby-credits' => "Mae'r wici hwn wedi'i nerthu gan '''[http://www.mediawiki.org/ MediaWiki]''', hawlfraint © 2001 - $1 $2.",
+'version-poweredby-others' => 'eraill',
+'version-license-info' => "Meddalwedd rhydd yw MediaWiki; gallwch ei ddefnyddio a'i addasu yn ôl termau'r GNU General Public License a gyhoeddir gan Free Software Foundation; naill ai fersiwn 2 o'r Drwydded, neu unrhyw fersiwn diweddarach o'ch dewis.
+
+Cyhoeddir MediaWiki yn y gobaith y bydd o ddefnydd, ond HEB UNRHYW WARANT; heb hyd yn oed gwarant ymhlyg o FARCHNADWYEDD nag o FOD YN ADDAS AT RYW BWRPAS ARBENNIG. Gweler y GNU General Public License am fanylion pellach.
+
+Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Public License] gyda'r rhaglen hon; os nad ydych, ysgrifennwch at Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, neu [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html gallwch ei ddarllen ar y we].",
'version-software' => 'Meddalwedd gosodedig',
'version-software-product' => 'Cynnyrch',
'version-software-version' => 'Fersiwn',
@@ -3173,6 +3280,15 @@ Rhowch enw\'r ffeil heb y rhagddodiad "{{ns:file}}:".',
'tags-edit' => 'golygu',
'tags-hitcount' => '$1 {{PLURAL:$1|newid}}',
+# Special:ComparePages
+'comparepages' => 'Cymharu tudalennau',
+'compare-selector' => "Cymharu diwygiadau gwahanol o'r dudalen",
+'compare-page1' => 'Tudalen 1',
+'compare-page2' => 'Tudalen 2',
+'compare-rev1' => 'Diwygiad 1',
+'compare-rev2' => 'Diwygiad 2',
+'compare-submit' => 'Cymharer',
+
# Database error messages
'dberr-header' => 'Mae problem gan y wici hwn',
'dberr-problems' => "Mae'n ddrwg gennym! Mae'r wefan hon yn dioddef anawsterau technegol.",
@@ -3189,8 +3305,13 @@ Rhowch enw\'r ffeil heb y rhagddodiad "{{ns:file}}:".',
'htmlform-float-invalid' => "Nid yw'r gwerth a bennwyd gennych yn rif.",
'htmlform-int-toolow' => "Mae'r gwerth a bennwyd gennych yn llai na'r isafswm $1",
'htmlform-int-toohigh' => "Mae'r gwerth a bennwyd gennych yn fwy na'r uchafswm $1",
+'htmlform-required' => "Rhaid llanw'r blwch hwn",
'htmlform-submit' => 'Gosoder',
'htmlform-reset' => 'Datod y newidiadau',
'htmlform-selectorother-other' => 'Arall',
+# SQLite database support
+'sqlite-has-fts' => '$1 gyda chymorth chwilio yr holl destun',
+'sqlite-no-fts' => '$1 heb gymorth chwiliad yr holl destun',
+
);
diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php
index d0766ad2..87826fe3 100644
--- a/languages/messages/MessagesDa.php
+++ b/languages/messages/MessagesDa.php
@@ -9,6 +9,7 @@
*
* @author Amjaabc
* @author Anders Wegge Jakobsen <awegge@gmail.com>
+ * @author Aputtu
* @author Boivie
* @author Byrial
* @author Christian List
@@ -47,22 +48,25 @@ $namespaceNames = array(
NS_TALK => 'Diskussion',
NS_USER => 'Bruger',
NS_USER_TALK => 'Brugerdiskussion',
- NS_PROJECT_TALK => '$1-diskussion',
+ NS_PROJECT_TALK => '$1_diskussion',
NS_FILE => 'Fil',
NS_FILE_TALK => 'Fildiskussion',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki-diskussion',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_diskussion',
NS_TEMPLATE => 'Skabelon',
NS_TEMPLATE_TALK => 'Skabelondiskussion',
NS_HELP => 'Hjælp',
- NS_HELP_TALK => 'Hjælp-diskussion',
+ NS_HELP_TALK => 'Hjælp_diskussion',
NS_CATEGORY => 'Kategori',
NS_CATEGORY_TALK => 'Kategoridiskussion',
);
$namespaceAliases = array(
- 'Billede' => NS_FILE,
- 'Billeddiskussion' => NS_FILE_TALK,
+ '$1-diskussion' => NS_PROJECT_TALK,
+ 'Billede' => NS_FILE,
+ 'Billeddiskussion' => NS_FILE_TALK,
+ 'MediaWiki-diskussion' => NS_MEDIAWIKI_TALK,
+ 'Hjælp-diskussion' => NS_HELP_TALK,
);
$bookstoreList = array(
@@ -71,65 +75,65 @@ $bookstoreList = array(
'inherit' => true,
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dobbelte omdirigeringer' ),
- 'BrokenRedirects' => array( 'Defekte omdirigeringer' ),
- 'Disambiguations' => array( 'Flertydige sider' ),
- 'Userlogin' => array( 'Log på', 'Brugerlogind' ),
- 'Userlogout' => array( 'Brugerlogud' ),
- 'CreateAccount' => array( 'Opret konto' ),
+ 'DoubleRedirects' => array( 'Dobbelte_omdirigeringer' ),
+ 'BrokenRedirects' => array( 'Defekte_omdirigeringer' ),
+ 'Disambiguations' => array( 'Flertydige_sider' ),
+ 'Userlogin' => array( 'Log_på', 'Brugerlogind' ),
+ 'Userlogout' => array( 'Log_ud', 'Brugerlogud' ),
+ 'CreateAccount' => array( 'Opret_konto' ),
'Preferences' => array( 'Indstillinger' ),
'Watchlist' => array( 'Overvågningsliste' ),
- 'Recentchanges' => array( 'Seneste ændringer' ),
+ 'Recentchanges' => array( 'Seneste_ændringer' ),
'Listfiles' => array( 'Filer', 'Filliste' ),
- 'Newimages' => array( 'Nye filer' ),
+ 'Newimages' => array( 'Nye_filer' ),
'Listusers' => array( 'Brugerliste', 'Bruger' ),
'Listgrouprights' => array( 'Grupperettighedsliste' ),
'Statistics' => array( 'Statistik' ),
- 'Randompage' => array( 'Tilfældig side' ),
- 'Lonelypages' => array( 'Forældreløse sider' ),
- 'Uncategorizedpages' => array( 'Ukategoriserede sider' ),
- 'Uncategorizedcategories' => array( 'Ukategoriserede kategorier' ),
- 'Uncategorizedimages' => array( 'Ukategoriserede filer' ),
- 'Uncategorizedtemplates' => array( 'Ukategoriserede skabeloner' ),
- 'Unusedcategories' => array( 'Ubrugte kategorier' ),
- 'Unusedimages' => array( 'Ubrugte filer' ),
- 'Wantedpages' => array( 'Ønskede sider' ),
- 'Wantedcategories' => array( 'Ønskede kategorier' ),
- 'Mostlinked' => array( 'Sider med flest henvisninger' ),
- 'Mostlinkedcategories' => array( 'Kategorier med flest sider' ),
- 'Mostlinkedtemplates' => array( 'Hyppigst brugte skabeloner' ),
- 'Mostimages' => array( 'Mest brugte filer' ),
- 'Mostcategories' => array( 'Sider med flest kategorier' ),
- 'Mostrevisions' => array( 'Sider med flest redigeringer' ),
- 'Fewestrevisions' => array( 'Sider med færrest redigeringer' ),
- 'Shortpages' => array( 'Korteste sider' ),
- 'Longpages' => array( 'Længste sider' ),
- 'Newpages' => array( 'Nye sider' ),
- 'Ancientpages' => array( 'Ældste sider' ),
+ 'Randompage' => array( 'Tilfældig_side' ),
+ 'Lonelypages' => array( 'Forældreløse_sider' ),
+ 'Uncategorizedpages' => array( 'Ukategoriserede_sider' ),
+ 'Uncategorizedcategories' => array( 'Ukategoriserede_kategorier' ),
+ 'Uncategorizedimages' => array( 'Ukategoriserede_filer' ),
+ 'Uncategorizedtemplates' => array( 'Ukategoriserede_skabeloner' ),
+ 'Unusedcategories' => array( 'Ubrugte_kategorier' ),
+ 'Unusedimages' => array( 'Ubrugte_filer' ),
+ 'Wantedpages' => array( 'Ønskede_sider' ),
+ 'Wantedcategories' => array( 'Ønskede_kategorier' ),
+ 'Mostlinked' => array( 'Sider_med_flest_henvisninger' ),
+ 'Mostlinkedcategories' => array( 'Kategorier_med_flest_sider' ),
+ 'Mostlinkedtemplates' => array( 'Hyppigst_brugte_skabeloner' ),
+ 'Mostimages' => array( 'Mest_brugte_filer' ),
+ 'Mostcategories' => array( 'Sider_med_flest_kategorier' ),
+ 'Mostrevisions' => array( 'Sider_med_flest_redigeringer' ),
+ 'Fewestrevisions' => array( 'Sider_med_færrest_redigeringer' ),
+ 'Shortpages' => array( 'Korteste_sider' ),
+ 'Longpages' => array( 'Længste_sider' ),
+ 'Newpages' => array( 'Nye_sider' ),
+ 'Ancientpages' => array( 'Ældste_sider' ),
'Deadendpages' => array( 'Blindgydesider' ),
- 'Protectedpages' => array( 'Beskyttede sider' ),
- 'Protectedtitles' => array( 'Beskyttede titler' ),
- 'Allpages' => array( 'Alle sider' ),
+ 'Protectedpages' => array( 'Beskyttede_sider' ),
+ 'Protectedtitles' => array( 'Beskyttede_titler' ),
+ 'Allpages' => array( 'Alle_sider' ),
'Prefixindex' => array( 'Præfiksindeks' ),
- 'Ipblocklist' => array( 'Blokerede adresser' ),
+ 'Ipblocklist' => array( 'Blokerede_adresser' ),
'Specialpages' => array( 'Specialsider' ),
'Contributions' => array( 'Bidrag' ),
'Emailuser' => array( 'E-mail' ),
- 'Confirmemail' => array( 'Bekræft e-mail' ),
- 'Whatlinkshere' => array( 'Hvad linker hertil' ),
- 'Recentchangeslinked' => array( 'Relaterede ændringer' ),
- 'Movepage' => array( 'Flyt side' ),
+ 'Confirmemail' => array( 'Bekræft_e-mail' ),
+ 'Whatlinkshere' => array( 'Hvad_linker_hertil' ),
+ 'Recentchangeslinked' => array( 'Relaterede_ændringer' ),
+ 'Movepage' => array( 'Flyt_side' ),
'Blockme' => array( 'Proxyspærring' ),
'Booksources' => array( 'ISBN-søgning' ),
'Categories' => array( 'Kategorier' ),
'Export' => array( 'Eksporter' ),
'Allmessages' => array( 'MediaWiki-systemmeddelelser' ),
'Log' => array( 'Loglister' ),
- 'Blockip' => array( 'Bloker adresse' ),
+ 'Blockip' => array( 'Bloker_adresse' ),
'Undelete' => array( 'Gendannelse' ),
'Import' => array( 'Importere' ),
'Lockdb' => array( 'Databasespærring' ),
@@ -137,24 +141,28 @@ $specialPageAliases = array(
'Userrights' => array( 'Brugerrettigheder' ),
'MIMEsearch' => array( 'MIME-type-søgning' ),
'FileDuplicateSearch' => array( 'Filduplikatsøgning' ),
- 'Unwatchedpages' => array( 'Uovervågede sider' ),
+ 'Unwatchedpages' => array( 'Uovervågede_sider' ),
'Listredirects' => array( 'Henvisninger' ),
'Revisiondelete' => array( 'Versionssletning' ),
- 'Unusedtemplates' => array( 'Ubrugte skabeloner' ),
- 'Randomredirect' => array( 'Tilfældig henvisning' ),
- 'Mypage' => array( 'Min brugerside' ),
- 'Mytalk' => array( 'Min diskussionsside' ),
- 'Mycontributions' => array( 'Mine bidrag' ),
+ 'Unusedtemplates' => array( 'Ubrugte_skabeloner' ),
+ 'Randomredirect' => array( 'Tilfældig_henvisning' ),
+ 'Mypage' => array( 'Min_brugerside' ),
+ 'Mytalk' => array( 'Min_diskussionsside' ),
+ 'Mycontributions' => array( 'Mine_bidrag' ),
'Listadmins' => array( 'Administratorer' ),
'Listbots' => array( 'Robotter' ),
- 'Popularpages' => array( 'Populære sider' ),
+ 'Popularpages' => array( 'Populære_sider' ),
'Search' => array( 'Søgning' ),
- 'Resetpass' => array( 'Nulstil kodeord' ),
- 'Withoutinterwiki' => array( 'Manglende interwikilinks' ),
- 'MergeHistory' => array( 'Sammenfletning af historikker' ),
+ 'Resetpass' => array( 'Nulstil_kodeord' ),
+ 'Withoutinterwiki' => array( 'Manglende_interwikilinks' ),
+ 'MergeHistory' => array( 'Sammenfletning_af_historikker' ),
'Filepath' => array( 'Filsti' ),
- 'Invalidateemail' => array( 'Ugyldiggør e-mail' ),
- 'DeletedContributions' => array( 'Slettede bidrag' ),
+ 'Invalidateemail' => array( 'Ugyldiggør_e-mail' ),
+ 'Blankpage' => array( 'Tom_Side' ),
+ 'LinkSearch' => array( 'Link_Søgning' ),
+ 'DeletedContributions' => array( 'Slettede_bidrag' ),
+ 'Activeusers' => array( 'Aktive_Brugere' ),
+ 'ComparePages' => array( 'Sammenlign_Sider' ),
);
$dateFormats = array(
@@ -187,8 +195,7 @@ $messages = array(
'tog-editsection' => 'Redigér afsnit ved hjælp af [redigér]-henvisninger',
'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler (JavaScript)',
'tog-showtoc' => 'Vis indholdsfortegnelse (på sider med mere end tre afsnit)',
-'tog-rememberpassword' => 'Husk adgangskode til næste besøg fra denne computer',
-'tog-editwidth' => 'Udvid redigeringsboksen til at fylde hele skærmen',
+'tog-rememberpassword' => 'Husk mit login på denne computer (højst $1 {{PLURAL:$1|dag|dage}})',
'tog-watchcreations' => 'Tilføj sider jeg opretter til min overvågningsliste',
'tog-watchdefault' => 'Tilføj sider jeg redigerer til min overvågningsliste',
'tog-watchmoves' => 'Tilføj sider jeg flytter til min overvågningsliste',
@@ -328,31 +335,21 @@ $messages = array(
'faqpage' => 'Project:OSS',
# Vector skin
-'vector-action-addsection' => 'Nyt emne',
-'vector-action-delete' => 'Slet',
-'vector-action-move' => 'Flyt',
-'vector-action-protect' => 'Beskyt',
-'vector-action-undelete' => 'Gendan',
-'vector-action-unprotect' => 'Fjern beskyttelse',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Hjælpeside',
-'vector-namespace-image' => 'Fil',
-'vector-namespace-main' => 'Side',
-'vector-namespace-media' => 'Medieside',
-'vector-namespace-mediawiki' => 'Besked',
-'vector-namespace-project' => 'Projektside',
-'vector-namespace-special' => 'Specialside',
-'vector-namespace-talk' => 'Diskussion',
-'vector-namespace-template' => 'Skabelon',
-'vector-namespace-user' => 'Brugerside',
-'vector-view-create' => 'Opret',
-'vector-view-edit' => 'Redigér',
-'vector-view-history' => 'Se historik',
-'vector-view-view' => 'Vis',
-'vector-view-viewsource' => 'Se kilden',
-'actions' => 'Handlinger',
-'namespaces' => 'Navnerum',
-'variants' => 'Varianter',
+'vector-action-addsection' => 'Nyt emne',
+'vector-action-delete' => 'Slet',
+'vector-action-move' => 'Flyt',
+'vector-action-protect' => 'Beskyt',
+'vector-action-undelete' => 'Gendan',
+'vector-action-unprotect' => 'Fjern beskyttelse',
+'vector-simplesearch-preference' => 'Aktivér forbedrede søgeforslag (kun Vector-udseendet)',
+'vector-view-create' => 'Opret',
+'vector-view-edit' => 'Redigér',
+'vector-view-history' => 'Se historik',
+'vector-view-view' => 'Vis',
+'vector-view-viewsource' => 'Se kilden',
+'actions' => 'Handlinger',
+'namespaces' => 'Navnerum',
+'variants' => 'Varianter',
'errorpagetitle' => 'Fejl',
'returnto' => 'Tilbage til $1.',
@@ -413,6 +410,9 @@ For mange brugere prøver at vise denne side.
Vent et øjeblik, før du prøver at vise denne side ige.
$1',
+'pool-timeout' => 'Timeout mens man venter på låsningen',
+'pool-queuefull' => 'Pool køen er fuld',
+'pool-errorunknown' => 'Ukendt fejl',
# 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' => 'Om {{SITENAME}}',
@@ -574,7 +574,8 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
'yourname' => 'Dit brugernavn:',
'yourpassword' => 'Din adgangskode:',
'yourpasswordagain' => 'Gentag adgangskode',
-'remembermypassword' => 'Husk min adgangskode til næste gang.',
+'remembermypassword' => 'Husk mit brugernavn på denne computer (højst $1 {{PLURAL:$1|dag|dage}})',
+'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
'yourdomainname' => 'Dit domænenavn',
'externaldberror' => 'Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.',
'login' => 'Log på',
@@ -591,6 +592,7 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
'gotaccount' => "Du har allerede en brugerkonto? '''$1'''.",
'gotaccountlink' => 'Log på',
'createaccountmail' => 'via e-mail',
+'createaccountreason' => 'Begrundelse:',
'badretype' => 'De indtastede adgangskoder er ikke ens.',
'userexists' => 'Det brugernavn du har valgt er allerede i brug. Vælg venligst et andet brugernavn.',
'loginerror' => 'Logon mislykket',
@@ -610,6 +612,7 @@ Kontrollér stavemåden, eller [[Special:UserLogin/signup|opret en ny konto]].',
'wrongpasswordempty' => 'Du glemte at indtaste password. Prøv igen.',
'passwordtooshort' => 'Adgangskoden skal mindst være på $1 {{PLURAL:$1|tegn|tegn}}.',
'password-name-match' => 'Kodeordet må ikke være det samme som brugernavnet.',
+'password-login-forbidden' => 'Brugen af dette brugernavn og adgangskode er blevet forbudt.',
'mailmypassword' => 'Send nyt password',
'passwordremindertitle' => 'Nyt password til {{SITENAME}}',
'passwordremindertext' => 'Nogen (sandsynligvis dig, fra IP-adressen $1)
@@ -651,6 +654,9 @@ Vent venligst før du prøver igen.',
'loginlanguagelabel' => 'Sprog: $1',
'suspicious-userlogout' => 'Din anmodning om at logge ud blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
+# E-mail sending
+'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
+
# Password reset dialog
'resetpass' => 'Skift adgangskode',
'resetpass_announce' => 'Log på med den via e-mail tilsendte password. For at afslutte tilmeldingen, skal du nu vælge et nyt password.',
@@ -702,9 +708,10 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
'showlivepreview' => 'Live-forhåndsvisning',
'showdiff' => 'Vis ændringer',
'anoneditwarning' => 'Du arbejder uden at være logget på. Istedet for brugernavn vises din IP-adresse i versionshistorikken.',
+'anonpreviewwarning' => "''Du er ikke logget ind. Hvis du gemmer, registreres din IP-adresse i versionshistorikken.''",
'missingsummary' => "'''Påmindelse:''' Du har ikke angivet en redigeringsbeskrivelse. Hvis du igen trykker på \"Gem\", gemmes ændringerne uden en beskrivelse.",
'missingcommenttext' => 'Indtast venligst et resume.',
-'missingcommentheader' => "'''BEMÆRK:''' du har ikke angivet en overskrift i feltet „Emne:“. Hvis du igen trykker på „Gem side“, gemmes bearbejdningen uden overskrift.",
+'missingcommentheader' => "'''Bemærk:''' Du har ikke angivet en overskrift i feltet „Emne:“ for denne kommentar. Hvis du trykker „Gem side“ én gang til, gemmes dine ændringer uden overskrift.",
'summary-preview' => 'Forhåndsvisning af beskrivelsen:',
'subject-preview' => 'Forhåndsvisning af emnet:',
'blockedtitle' => 'Brugeren er blokeret',
@@ -783,7 +790,11 @@ Loggen over den seneste blokering ses nedenfor:',
'usercsspreview' => "'''Husk at dette kun er en forhåndsvisning af dit eget css.
'''Det er ikke gemt endnu!'''",
'userjspreview' => "'''Husk at du kun tester/forhåndsviser dit eget javascript, det er ikke gemt endnu!'''",
-'userinvalidcssjstitle' => "'''Advarsel:''' Der findes intet skin „$1“. Tænk på, at brugerspecifikke .css- og .js-sider begynder med små bogstaver, altså f.eks. ''{{ns:user}}:Hansen/monobook.css'' og ikke ''{{ns:user}}:Hansen/Monobook.css''.",
+'sitecsspreview' => "'''Husk, at dette kun er en forhåndsvisning af denne CSS.'''
+'''Det er endnu ikke gemt!'''",
+'sitejspreview' => "'''Husk, at du kun ser en forhåndsvisning af denne JavaScriptkode.'''
+'''Det er endnu ikke gemt!'''",
+'userinvalidcssjstitle' => "'''Advarsel:''' Der findes intet skin „$1“. Tænk på, at brugerspecifikke .css- og .js-sider begynder med små bogstaver, altså f.eks. ''{{ns:user}}:Hansen/vector.css'' og ikke ''{{ns:user}}:Hansen/Vector.css''.",
'updated' => '(Opdateret)',
'note' => "'''Bemærk:'''",
'previewnote' => 'Husk at dette er kun en forhåndsvisning, siden er ikke gemt endnu!',
@@ -820,8 +831,6 @@ Læg ingen tekster ind, hvis du ikke kan acceptere at disse kan ændres.
Du bekræfter hermed også, at du selv har skrevet denne tekst eller kopieret den fra en fri kilde (se $1 for detaljer).
'''OVERFØR IKKE OPHAVSRETSLIGT BESKYTTET INDHOLD UDEN TILLADELSE!'''",
-'longpagewarning' => "'''ADVARSEL: Denne side er $1 kilobyte stor; nogle browsere kan have problemer med at redigere sider der nærmer sig eller er større end 32 kb.
-Overvej om siden kan opdeles i mindre dele.'''",
'longpageerror' => "'''FEJL: Teksten, som du ville gemme, er $1 kB stor. Det er større end det tilladet maksimum på $2 kB. Det er ikke muligt at gemme.'''",
'readonlywarning' => "'''ADVARSEL: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu. Det kan godt være en god ide at kopiere din tekst til en tekstfil, så du kan gemme den til senere.'''
@@ -990,6 +999,8 @@ $1",
'logdelete-failure' => "'''Kunne ikke ændre logsynligheden.'''
$1",
'revdel-restore' => 'Ændre synlighed',
+'revdel-restore-deleted' => 'slettede redigeringer',
+'revdel-restore-visible' => 'synlige ændringer',
'pagehist' => 'Sidehistorik',
'deletedhist' => 'Slettet historik',
'revdelete-content' => 'indhold',
@@ -1059,11 +1070,13 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
# Diffs
'history-title' => 'Versionshistorik for "$1"',
'difference' => '(Forskel mellem versioner)',
+'difference-multipage' => '(Forskel mellem sider)',
'lineno' => 'Linje $1:',
'compareselectedversions' => 'Sammenlign valgte versioner',
'showhideselectedversions' => 'Vis/skjul udvalgte versioner',
'editundo' => 'fjern redigering',
-'diff-multi' => '(Versionssammenligningen medtager {{plural:$1|en mellemliggende version|$1 mellemliggende versioner}}.)',
+'diff-multi' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af {{PLURAL:$2|en bruger|$2 brugere}} ikke vist)',
+'diff-multi-manyusers' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af mere end $2 {{PLURAL:$2|bruger|brugere}} ikke vist)',
# Search results
'searchresults' => 'Søgeresultater',
@@ -1098,6 +1111,7 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
'searchprofile-everything-tooltip' => 'Søg i alt indhold (inklusive diskussionssider)',
'searchprofile-advanced-tooltip' => 'Søg i bestemte navnerum',
'search-result-size' => '$1 ({{PLURAL:$2|et ord|$2 ord}})',
+'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})',
'search-result-score' => 'Relevans: $1%',
'search-redirect' => '(omdiriger $1)',
'search-section' => '(sektion $1)',
@@ -1173,6 +1187,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
'contextlines' => 'Linjer pr. resultat',
'contextchars' => 'Tegn pr. linje i resultatet',
'stub-threshold' => 'Grænse for visning af henvisning som <a href="#" class="stub">artikelstump</a>:',
+'stub-threshold-disabled' => 'Deaktiveret',
'recentchangesdays' => 'Antal dage som skal vises i seneste ændringer:',
'recentchangesdays-max' => '(maks. $1 {{PLURAL:$1|dag|dage}})',
'recentchangescount' => 'Antal redigeringer som skal vises som standard:',
@@ -1206,6 +1221,7 @@ Her er en tilfældig genereret værdi som du kan bruge: $1',
'prefs-files' => 'Filer',
'prefs-custom-css' => 'Personlig CSS',
'prefs-custom-js' => 'Personlig JavaScript',
+'prefs-common-css-js' => 'Fælles CSS/JS for alle udseender:',
'prefs-reset-intro' => 'Du kan bruge denne side til at tilbagestille alle dine indstillinger til standardindstillingerne.
Det kan ikke gøres om.',
'prefs-emailconfirm-label' => 'Bekræftelse af e-mail:',
@@ -1221,7 +1237,7 @@ Det kan ikke gøres om.',
'yournick' => 'Signatur:',
'prefs-help-signature' => 'Kommentarer på diskussionssider bør signeres med "<nowiki>~~~~</nowiki>" som vil blive konverteret til din signatur og et tidsstempel.',
'badsig' => 'Syntaksen i underskriften er ugyldig; kontroller venligst den brugte HTML.',
-'badsiglength' => 'Din sigantur er for lang. Den må højst indeholde {{PLURAL:$1|}}$1 tegn.',
+'badsiglength' => 'Din signatur er for lang. Den må højst indeholde {{PLURAL:$1|}}$1 tegn.',
'yourgender' => 'Køn:',
'gender-unknown' => 'Uspecificeret',
'gender-male' => 'Mand',
@@ -1243,9 +1259,15 @@ Du kan også vælge at lade andre brugere kontakte dig gennem din bruger- eller
'prefs-advancedrendering' => 'Avancerede indstillinger',
'prefs-advancedsearchoptions' => 'Avancerede indstillinger',
'prefs-advancedwatchlist' => 'Avancerede indstillinger',
-'prefs-display' => 'Indstillinger for visning',
+'prefs-displayrc' => 'Indstillinger for visning',
+'prefs-displaysearchoptions' => 'Visningsmuligheder',
+'prefs-displaywatchlist' => 'Visningsmuligheder',
'prefs-diffs' => 'Forskelle',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
+'email-address-validity-invalid' => 'Indtast en gyldig e-mail adresse',
+
# User rights
'userrights' => 'HÃ¥ndtering af brugerrettigheder',
'userrights-lookup-user' => 'Administrér brugergrupper',
@@ -1329,6 +1351,7 @@ Du kan også vælge at lade andre brugere kontakte dig gennem din bruger- eller
'right-hideuser' => 'Blokere et brugernavn og skjule navnet',
'right-ipblock-exempt' => 'Redigere fra blokerede IP-adresser',
'right-proxyunbannable' => 'Redigere gennem automatisk blokeret proxy',
+'right-unblockself' => 'Fjerne blokering af dem selv',
'right-protect' => 'Ændre beskyttelse og redigere beskyttede sider',
'right-editprotected' => 'Ændre beskyttede sider (uden nedarvet sidebeskyttelse)',
'right-editinterface' => 'Ændre brugergrænsefladens tekster',
@@ -1351,7 +1374,6 @@ Du kan også vælge at lade andre brugere kontakte dig gennem din bruger- eller
'right-siteadmin' => 'LÃ¥se og frigive databasen',
'right-reset-passwords' => 'Ændre andre brugeres adgangskode',
'right-override-export-depth' => 'Eksportere sider inkl. henviste sider op til en dybde på 5',
-'right-versiondetail' => 'Se den udvidede information om programversion',
'right-sendemail' => 'Sende e-mail til andre brugere',
# User rights log
@@ -1402,14 +1424,9 @@ Du kan også vælge at lade andre brugere kontakte dig gennem din bruger- eller
'recentchanges-legend' => 'Indstillinger for seneste ændringer',
'recentchangestext' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
'recentchanges-feed-description' => 'Med dette feed kan du følge de seneste ændringer på {{SITENAME}}.',
-'recentchanges-label-legend' => 'Tegnforklaring: $1.',
-'recentchanges-legend-newpage' => '$1 – ny side',
'recentchanges-label-newpage' => 'Denne redigering oprettede en ny side',
-'recentchanges-legend-minor' => '$1 – mindre ændring',
'recentchanges-label-minor' => 'Dette er en mindre ændring',
-'recentchanges-legend-bot' => '$1 – botændring',
'recentchanges-label-bot' => 'Denne redigering blev udført af en bot',
-'recentchanges-legend-unpatrolled' => '$1 – upatruljeret ændring',
'recentchanges-label-unpatrolled' => 'Denne redigering er endnu ikke blevet patruljeret',
'rcnote' => "Herunder ses {{PLURAL:$1|'''1''' ændring|de sidste '''$1''' ændringer}} fra {{PLURAL:$2|i dag|de sidste '''$2''' dage}} fra den $4, kl. $5.",
'rcnotefrom' => "Nedenfor er op til '''$1''' ændringer siden '''$2''' vist.",
@@ -1456,6 +1473,9 @@ Du kan også vælge at lade andre brugere kontakte dig gennem din bruger- eller
'upload_directory_missing' => 'upload-kataloget ($1) findes ikke. Webserveren har ikke mulighed for at oprette kataloget.',
'upload_directory_read_only' => 'Webserveren har ingen skriverettigheder for upload-kataloget ($1).',
'uploaderror' => 'Fejl under oplægning af fil',
+'upload-recreate-warning' => "'''Advarsel: En fil med det navn, er blevet slettet eller flyttet.'''
+
+Sletnings- og flytnings-loggen for denne side leveres her for nemheds skyld:",
'uploadtext' => "Brug formularen herunder til at lægge filer op.
Gå til [[Special:FileList|listen over filer]] for at se eller søge i eksisterende filer. (Gen-)oplægnigner logges i [[Special:Log/upload|oplægningsloggen]], sletninger i [[Special:Log/delete|sletteloggen]].
@@ -1487,6 +1507,17 @@ Brug en henvisning af en de følgende typer for at bruge en fil på en side:
'filetype-unwanted-type' => "'''\".\$1\"''' er ikke en foretrukken filtype. {{PLURAL:\$3|Den foretrukne filtype|De foretrukne filtyper}} er \$2.",
'filetype-banned-type' => "'''\".\$1\"''' er en uønsket filtype. {{PLURAL:\$3|Den tilladte filtype|De tillatdte filtyper}} er \$2.",
'filetype-missing' => 'Filen der skal uploades har ingen endelse (f.eks. „.jpg“).',
+'empty-file' => 'Den fil du indsendte var tom.',
+'file-too-large' => 'Den fil du indsendte var for stor.',
+'filename-tooshort' => 'Filnavnet er for kort.',
+'filetype-banned' => 'Denne type fil er ikke tilladt',
+'verification-error' => 'Denne fil bestod ikke fil verifikationen.',
+'hookaborted' => 'Ændringen du forsøgte at gøre blev afbrudt af en udvidelses hook.',
+'illegal-filename' => 'Filnavnet er ikke tilladt.',
+'overwrite' => 'Overskrivning af en eksisterende fil er ikke tilladt.',
+'unknown-error' => 'En ukendt fejl opstod.',
+'tmp-create-error' => 'Kunne ikke oprette temporær fil.',
+'tmp-write-error' => 'Fejl ved skrivning af temporær fil.',
'large-file' => 'Filstørrelsen skal så vidt muligt ikke overstige $1. Denne fil er $2 stor.',
'largefileserver' => 'Filen er større end den på serveren indstillede maksimale størrelse.',
'emptyfile' => 'Filen du lagde op lader til at være tom. Det kan skyldes en slåfejl i filnavnet. Kontroller om du virkelig ønsker at lægge denne fil op.',
@@ -1514,13 +1545,14 @@ Hvis du fortsat vil lægge filen op, bedes du gå tilbage og bruge et nyt navn.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Denne fil er en bublet af {{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}}:',
'file-deleted-duplicate' => 'En fil identisk med denne fil ([[:$1]]) er tidligere blevet slettet. Du bør tjekke den fils sletningshistorik før du prøver at genoplægge den.',
-'successfulupload' => 'Oplægningen er gennemført',
'uploadwarning' => 'Advarsel',
'uploadwarning-text' => 'Vær venlig at ændre filbeskrivelsen nedenfor og prøv igen.',
'savefile' => 'Gem fil',
'uploadedimage' => 'lagde "[[$1]]" op',
'overwroteimage' => 'lagde en ny version af "[[$1]]" op',
'uploaddisabled' => 'Desværre er funktionen til at lægge filer op afbrudt på denne server.',
+'copyuploaddisabled' => 'Upload via URL er slået fra.',
+'uploadfromurl-queued' => 'Din upload er blevet sat i kø.',
'uploaddisabledtext' => 'Oplægning af filer er deaktiveret.',
'php-uploaddisabledtext' => 'Oplægning af filer er forhindret i PHP. Tjek indstillingen for file_uploads.',
'uploadscripted' => 'Denne fil indeholder HTML eller script-kode, der i visse tilfælde can fejlfortolkes af en browser.',
@@ -1539,6 +1571,14 @@ Hvis du fortsat vil lægge filen op, bedes du gå tilbage og bruge et nyt navn.
Overvej om det er passende at fortsætte med uploadet.
Sletningsloggen for denne fil er gengivet herunder.",
'filename-bad-prefix' => "Navnet på filen du er ved at lægge op begynder med '''\"\$1\"'''. Dette er et ikkebeskrivende navn, der typisk er skabt automatisk af et digitalkamera. Vær venlig at vælge et mere beskrivende navn på dit billede.",
+'upload-success-subj' => 'Oplægningen er gennemført',
+'upload-success-msg' => 'Din upload fra [$2] lykkedes. Den er tilgængelig her: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Upload problem',
+'upload-failure-msg' => 'Der var et problem med din upload fra [$2]:
+
+$1',
+'upload-warning-subj' => 'Uploadadvarsel',
+'upload-warning-msg' => 'Der var et problem med din upload fra [$2]. Du kan vende tilbage til [[Special:Upload/stash/$1|upload form]] for at løse dette problem.',
'upload-proto-error' => 'Forkert protokol',
'upload-proto-error-text' => 'Adressen skal begynde med <code>http://</code> eller <code>ftp://</code>.',
@@ -1598,6 +1638,7 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
'listfiles_search_for' => 'Søge efter fil:',
'imgfile' => 'Fil',
'listfiles' => 'Filliste',
+'listfiles_thumb' => 'Thumbnail',
'listfiles_date' => 'Dato',
'listfiles_name' => 'Navn',
'listfiles_user' => 'Bruger',
@@ -1712,8 +1753,8 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
'statistics-edits' => 'Redigeringer siden {{SITENAME}} blev oprettet',
'statistics-edits-average' => 'Gennemsnitligt antal redigeringer per side',
'statistics-views-total' => 'Visninger i alt',
+'statistics-views-total-desc' => 'Visninger på ikke-eksisterende sider og special sider er ikke inkluderet',
'statistics-views-peredit' => 'Visninger per redigering',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Jobkøens] længde',
'statistics-users' => 'Registrerede [[Special:ListUsers|brugere]]',
'statistics-users-active' => 'Aktive brugere',
'statistics-users-active-desc' => 'Brugere som har udført handlinger i {{PLURAL:$1|det sidste døgn|de sidste $1 dage}}',
@@ -1726,7 +1767,7 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
'doubleredirects' => 'Dobbelte omdirigeringer',
'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
Hver linje indeholder henvisninger til den første og den anden omdirigering, såvel som til målet for den anden omdirigering som sædvanligvis er den "rigtige" målside som den første omdirigering burde henvise til.
-<s>Overstregede</s> poster er rettede.',
+<del>Overstregede</del> poster er rettede.',
'double-redirect-fixed-move' => '[[$1]] blev flyttet og er nu en omdirigering til [[$2]]',
'double-redirect-fixer' => 'Omdirigerings-retter',
@@ -1749,6 +1790,8 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, sÃ
'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmer}}',
'nrevisions' => '{{PLURAL:$1|1 ændring|$1 ændringer}}',
'nviews' => '{{PLURAL:$1|1 visning|$1 visninger}}',
+'nimagelinks' => 'Brugt på $1 {{PLURAL:$1|side|sider}}',
+'ntransclusions' => 'brugt på $1 {{PLURAL:$1|side|sider}}',
'specialpage-empty' => 'Der er ingen resultater at vise.',
'lonelypages' => 'Forældreløse sider',
'lonelypagestext' => 'Følgende sider er ikke henvist til eller inkluderet på andre sider på {{SITENAME}}:',
@@ -1905,34 +1948,40 @@ Der findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere informat
'listgrouprights-removegroup-self-all' => 'Kan fjerne alle grupper fra egen konto',
# E-mail user
-'mailnologin' => 'Du er ikke logget på',
-'mailnologintext' => 'Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.',
-'emailuser' => 'E-mail til denne bruger',
-'emailpage' => 'E-mail bruger',
-'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne bruger.
+'mailnologin' => 'Du er ikke logget på',
+'mailnologintext' => 'Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.',
+'emailuser' => 'E-mail til denne bruger',
+'emailpage' => 'E-mail bruger',
+'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne bruger.
Den e-mail-adresse du har angivet i [[Special:Preferences|dine indstillinger]] vil dukke op i "fra"-feltet på e-mailen, så modtageren kan svare dig.',
-'usermailererror' => 'E-mail-modulet returnerede en fejl:',
-'defemailsubject' => 'E-mail fra {{SITENAME}}',
-'noemailtitle' => 'Ingen e-mail-adresse',
-'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mail-adresse.',
-'nowikiemailtitle' => 'E-mail er ikke tilladt',
-'nowikiemailtext' => 'Denne bruger har valgt ikke at modtage e-mail fra andre brugere.',
-'email-legend' => 'Send e-post til en anden {{SITENAME}}-bruger.',
-'emailfrom' => 'Fra:',
-'emailto' => 'Til:',
-'emailsubject' => 'Emne:',
-'emailmessage' => 'Besked:',
-'emailsend' => 'Send',
-'emailccme' => 'Send en kopi af denne e-mail til mig',
-'emailccsubject' => 'Kopi sendes til $1: $2',
-'emailsent' => 'E-mail sendt',
-'emailsenttext' => 'Din e-mail er blevet sendt.',
-'emailuserfooter' => 'Denne e-mail er sendt af $1 til $2 ved hjælp af funktionen "E-mail til denne bruger" på {{SITENAME}}.',
+'usermailererror' => 'E-mail-modulet returnerede en fejl:',
+'defemailsubject' => 'E-mail fra {{SITENAME}}',
+'usermaildisabled' => 'Bruger-e-mail deaktiveret',
+'usermaildisabledtext' => 'Du kan ikke sende e-mails til andre brugere på denne wiki',
+'noemailtitle' => 'Ingen e-mail-adresse',
+'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mail-adresse.',
+'nowikiemailtitle' => 'E-mail er ikke tilladt',
+'nowikiemailtext' => 'Denne bruger har valgt ikke at modtage e-mail fra andre brugere.',
+'email-legend' => 'Send e-post til en anden {{SITENAME}}-bruger.',
+'emailfrom' => 'Fra:',
+'emailto' => 'Til:',
+'emailsubject' => 'Emne:',
+'emailmessage' => 'Besked:',
+'emailsend' => 'Send',
+'emailccme' => 'Send en kopi af denne e-mail til mig',
+'emailccsubject' => 'Kopi sendes til $1: $2',
+'emailsent' => 'E-mail sendt',
+'emailsenttext' => 'Din e-mail er blevet sendt.',
+'emailuserfooter' => 'Denne e-mail er sendt af $1 til $2 ved hjælp af funktionen "E-mail til denne bruger" på {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Efterlader system besked.',
+'usermessage-editor' => 'System messenger',
# Watchlist
'watchlist' => 'Overvågningsliste',
'mywatchlist' => 'Min overvågningsliste',
-'watchlistfor' => "(for '''$1''')",
+'watchlistfor2' => 'For $1 $2',
'nowatchlist' => 'Du har ingenting i din overvågningsliste.',
'watchlistanontext' => 'Du skal $1, for at se din overvågningsliste eller ændre indholdet af den.',
'watchnologin' => 'Ikke logget på',
@@ -1991,6 +2040,9 @@ På din overvågningsliste kan du også nulstille alle markeringer på de sider,
Med venlig hilsen {{SITENAME}}s informationssystem
--
+For at ændre dine indstillinger for e-mail-notifikationer, besøg
+{{fullurl:{{#special:Preferences}}}}
+
For at ændre indstillingerne for din overvågningsliste, besøg
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2029,7 +2081,7 @@ Bekræft venligst at du virkelig vil gøre dette, at du forstår konsekvenserne,
** Efter forfatters ønske
** Overtrædelse af ophavsret
** Hærværk',
-'delete-edit-reasonlist' => 'Rediger sletningsårsagerrette',
+'delete-edit-reasonlist' => 'Rediger sletningsårsager',
'delete-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}}. Sletning af sådanne sider er begrænset blevet for at forhindre utilsigtet forstyrrelse af {{SITENAME}}.',
'delete-warning-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}} versioner, slettes den kan det forstyrre driften af {{SITENAME}}, gå forsigtigt frem.',
@@ -2048,7 +2100,10 @@ Den seneste redigering er foretaget af [[User:$3|$3]] ([[User talk:$3|diskussion
'revertpage-nouser' => 'Gendannet til seneste version af [[User:$1|$1]], ændringer fra (brugernavn fjernet) fjernet',
'rollback-success' => 'Ændringerne fra $1 er fjernet,
og den seneste version af $2 er gendannet.',
-'sessionfailure' => 'Der lader til at være et problem med din loginsession; denne handling blev annulleret som en sikkerhedsforanstaltning mod kapring af sessionen. Tryk på "tilbage"-knappen og genindlæs den side du kom fra, og prøv dernæst igen.',
+
+# Edit tokens
+'sessionfailure-title' => 'Sessionsfejl',
+'sessionfailure' => 'Der lader til at være et problem med din loginsession; denne handling blev annulleret som en sikkerhedsforanstaltning mod kapring af sessionen. Tryk på "tilbage"-knappen og genindlæs den side du kom fra, og prøv dernæst igen.',
# Protect
'protectlogpage' => 'Skrivebeskyttelseslog',
@@ -2176,18 +2231,22 @@ $1',
'month' => 'MÃ¥ned:',
'year' => 'Ã…r:',
-'sp-contributions-newbies' => 'Vis kun bidrag fra nye brugere',
-'sp-contributions-newbies-sub' => 'Fra nye kontoer',
-'sp-contributions-newbies-title' => 'Brugerbidrag fra nye konti',
-'sp-contributions-blocklog' => 'blokeringslog',
-'sp-contributions-deleted' => 'slettede brugerbidrag',
-'sp-contributions-logs' => 'loglister',
-'sp-contributions-talk' => 'diskussion',
-'sp-contributions-userrights' => 'håndtering af brugerrettigheder',
-'sp-contributions-blocked-notice' => 'Denne bruger er i øjeblikket blokeret. Loggen over den seneste blokering kan ses nedenfor:',
-'sp-contributions-search' => 'Søg efter bidrag',
-'sp-contributions-username' => 'IP-adresse eller brugernavn:',
-'sp-contributions-submit' => 'Søg',
+'sp-contributions-newbies' => 'Vis kun bidrag fra nye brugere',
+'sp-contributions-newbies-sub' => 'Fra nye kontoer',
+'sp-contributions-newbies-title' => 'Brugerbidrag fra nye konti',
+'sp-contributions-blocklog' => 'blokeringslog',
+'sp-contributions-deleted' => 'slettede brugerbidrag',
+'sp-contributions-uploads' => 'uploads',
+'sp-contributions-logs' => 'loglister',
+'sp-contributions-talk' => 'diskussion',
+'sp-contributions-userrights' => 'håndtering af brugerrettigheder',
+'sp-contributions-blocked-notice' => 'Denne bruger er i øjeblikket blokeret. Loggen over den seneste blokering kan ses nedenfor:',
+'sp-contributions-blocked-notice-anon' => 'Denne IP-adresse er i øjeblikket blokeret.
+Den seneste post i blokeringsloggen vises nedenfor:',
+'sp-contributions-search' => 'Søg efter bidrag',
+'sp-contributions-username' => 'IP-adresse eller brugernavn:',
+'sp-contributions-toponly' => 'Vis kun redigeringer, der er aktuelle versioner',
+'sp-contributions-submit' => 'Søg',
# What links here
'whatlinkshere' => 'Hvad henviser hertil',
@@ -2248,7 +2307,6 @@ Se [[Special:IPBlockList|IP-blokeringslisten]] for alle blokeringer.',
'ipb-edit-dropdown' => 'Ændre spærreårsager',
'ipb-unblock-addr' => 'Ophæv blokeringen af "$1"',
'ipb-unblock' => 'Frigive IP-adresse/bruger',
-'ipb-blocklist-addr' => 'Aktuelle blokeringer af "$1"',
'ipb-blocklist' => 'Vis alle blokeringer som er i kraft',
'ipb-blocklist-contribs' => 'Bidrag fra $1',
'unblockip' => 'Ophæv blokering af bruger',
@@ -2318,6 +2376,8 @@ $1 er allerede blokkeret. Vil du ændre indstillingene?',
'sorbs_create_account_reason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY. Oprettelse af nye brugere er ikke mulig.',
'cant-block-while-blocked' => 'Du kan ikke blokkere andre brugere mens du selv er blokkeret.',
'cant-see-hidden-user' => 'Brugeren du prøver at blokerer er allerede blokeret og skjult. Siden du ikke har rettigheden til at skjule brugere, kan du ikke se eller ændre brugerens blokering.',
+'ipbblocked' => 'Du kan ikke ændre blokeringer, da du selv er blokeret',
+'ipbnounblockself' => 'Du kan ikke ophæve blokeringen af dig selv',
# Developer tools
'lockdb' => 'LÃ¥s database',
@@ -2340,6 +2400,17 @@ $1 er allerede blokkeret. Vil du ændre indstillingene?',
'move-page' => 'Flyt $1',
'move-page-legend' => 'Flyt side',
'movepagetext' => "Når du bruger formularen herunder vil du få omdøbt en side og flyttet hele sidens historie til det nye navn. Den gamle titel vil blive en omdirigeringsside til den nye titel. Henvisninger til den gamle titel vil ikke blive ændret. Sørg for at tjekke for dobbelte eller dårlige omdirigeringer. Du er ansvarlig for, at alle henvisninger stadig peger derhen, hvor det er meningen de skal pege. Bemærk at siden '''ikke''' kan flyttes hvis der allerede er en side med den nye titel, medmindre den side er tom eller er en omdirigering uden nogen historie. Det betyder at du kan flytte en side tilbage hvor den kom fra, hvis du kommer til at lave en fejl. <b>ADVARSEL!</b> Dette kan være en drastisk og uventet ændring for en populær side; vær sikker på, at du forstår konsekvenserne af dette før du fortsætter.",
+'movepagetext-noredirectfixer' => "Brug formularen herunder du vil omdøbe en side og flyttet hele sidens historie til det nye navn.
+Den gamle titel vil blive en omdirigeringsside til den nye titel.
+Vær sikker på at tjekke for [[Special:DoubleRedirects|dobbelte]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
+Du er ansvarlig for at sikre, at alle henvisninger stadig peger på et sted hvor det giver meningen at gå.
+
+Bemærk, at siden '''ikke''' kan flyttes hvis der allerede er en side med den nye titel, medmindre den er tom eller er en omdirigering, og har ingen historie.
+Det betyder at du kan omdøbe en side tilbage hvor den kom fra, hvis du laver en fejl, og du kan ikke overskrive en eksisterende side.
+
+'''Advarsel!'''
+Dette kan være en drastisk og uventet ændring for en populær side;
+du skal være sikker på at du forstår konsekvenserne af dette før du fortsætter.",
'movepagetalktext' => "Den tilhørende diskussionsside, hvis der er en, vil automatisk blive flyttet med siden '''medmindre:''' *Du flytter siden til et andet navnerum,
*En ikke-tom diskussionsside allerede eksisterer under det nye navn, eller
*Du fjerner markeringen i boksen nedenunder.
@@ -2395,6 +2466,7 @@ Artiklen "[[:$1]]" eksisterer allerede. Vil du slette den for at gøre plads til
'immobile-source-page' => 'Denne side kan ikke flyttes.',
'immobile-target-page' => 'Kan ikke flytte til det navn.',
'imagenocrossnamespace' => 'Filer kan ikke flyttes til et navnerum der ikke indeholder filer',
+'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til fil-navnerummet',
'imagetypemismatch' => 'Den nye filendelse passer ikke til filtypen',
'imageinvalidfilename' => 'Destinationsnavnet er ugyldigt',
'fix-double-redirects' => 'Opdater henvisninger til det oprindelige navn',
@@ -2473,6 +2545,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
'importstart' => 'Importerer sider …',
'import-revision-count' => '– {{PLURAL:$1|1 version|$1 versioner}}',
'importnopages' => 'Ingen sider fundet til import.',
+'imported-log-entries' => 'Importere $1 {{PLURAL:$1|log post|log poster}}.',
'importfailed' => 'Importering fejlede: $1',
'importunknownsource' => 'Ukendt fejlkilde',
'importcantopen' => 'Importfil kunne ikke åbnes',
@@ -2567,6 +2640,8 @@ Du kan se på kildeteksten.',
'tooltip-rollback' => '"Rul tilbage" fjerner den sidste bidragsyders redigering(er) af denne side med et klik',
'tooltip-undo' => '"Fjern redigering" fjerner denne redigering og åbner redigeringssiden med forhåndsvisning.
Det giver mulighed for at tilføje en begrundelse i beskrivelsen.',
+'tooltip-preferences-save' => 'Gem indstillinger',
+'tooltip-summary' => 'Indtast en kort opsummering',
# Stylesheets
'common.css' => '/** CSS inkluderet her vil være aktivt for alle brugere. */',
@@ -2674,19 +2749,22 @@ $1',
'nextdiff' => 'Gå til næste ændring →',
# Media information
-'mediawarning' => "'''Advarsel''': Denne filtype kan muligvis indeholde skadelig kode.
+'mediawarning' => "'''Advarsel''': Denne filtype kan muligvis indeholde skadelig kode.
Du kan beskadige dit system hvis du udfører den.",
'imagemaxsize' => "Maksimal billedstørrelse<br />''(på filbeskrivelsessider)''",
'thumbsize' => 'Thumbnailstørrelse :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|side|sider}}',
-'file-info' => '(Filstørrelse: $1, MIME-Type: $2)',
-'file-info-size' => '($1 × $2 punkter, filstørrelse: $3, MIME-Type: $4)',
+'file-info' => 'Filstørrelse: $1, MIME-Type: $2',
+'file-info-size' => '$1 × $2 punkter, filstørrelse: $3, MIME-Type: $4',
'file-nohires' => '<small>Ingen højere opløsning fundet.</small>',
-'svg-long-desc' => '(SVG fil, basisstørrelse $1 × $2 punkters, størrelse: $3)',
+'svg-long-desc' => 'SVG fil, basisstørrelse $1 × $2 punkters, størrelse: $3',
'show-big-image' => 'Version i større opløsning',
'show-big-image-thumb' => '<small>Størrelse af forhåndsvisning: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'gentaget',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ramme|rammer}}',
+'file-info-png-looped' => 'gentaget',
+'file-info-png-repeat' => 'afspillede $1 {{PLURAL:$1|gang|gange}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|billede|billeder}}',
# Special:NewFiles
'newimages' => 'Galleri med de nyeste billeder',
@@ -2841,6 +2919,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
'exif-gpsareainformation' => 'GPS-områdets navn',
'exif-gpsdatestamp' => 'GPS-dato',
'exif-gpsdifferential' => 'GPS-differentialkorrektur',
+'exif-objectname' => 'Kort titel',
# EXIF attributes
'exif-compression-1' => 'Ukomprimeret',
@@ -2922,6 +3001,8 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
'exif-sensingmethod-7' => 'Triliniær sensor',
'exif-sensingmethod-8' => 'Farvesekventiel liniarsensor',
+'exif-filesource-3' => 'Digitalt stillbilledekamera',
+
'exif-scenetype-1' => 'Normal',
'exif-customrendered-0' => 'Standard',
@@ -2998,23 +3079,23 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
'limitall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'Bekræft e-mail-adressen',
-'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mail-adresse i din [[Special:Preferences|brugerprofil]].',
-'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mail-adresse (autentificering), før du kan bruge de udvidede e-mail-funktioner. Med et klik på kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik på dette link bekræftes, at e-mail-adressen er gyldig.',
-'confirmemail_pending' => 'En bekræftelsesmail er allerede sendt til dig. Hvis du først for nylig har oprettet brugerkontoen, vent da et par minutter på denne e-mail, før du bestiller en ny kode.',
-'confirmemail_send' => 'Send bekræftelseskode',
-'confirmemail_sent' => 'Bekræftelses-e-mail afsendt.',
-'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mail-adresse. Denne kode skal ikke bruges til anmeldelsen, den kræves dog til aktiveringen af e-mail-funktionerne indenfor Wikien.',
-'confirmemail_sendfailed' => 'Bekræftelsesmailen kunne ikke afsendes. Kontroller at e-mail-adressen er korrekt.
+'confirmemail' => 'Bekræft e-mail-adressen',
+'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mail-adresse i din [[Special:Preferences|brugerprofil]].',
+'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mail-adresse (autentificering), før du kan bruge de udvidede e-mail-funktioner. Med et klik på kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik på dette link bekræftes, at e-mail-adressen er gyldig.',
+'confirmemail_pending' => 'En bekræftelsesmail er allerede sendt til dig. Hvis du først for nylig har oprettet brugerkontoen, vent da et par minutter på denne e-mail, før du bestiller en ny kode.',
+'confirmemail_send' => 'Send bekræftelseskode',
+'confirmemail_sent' => 'Bekræftelses-e-mail afsendt.',
+'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mail-adresse. Denne kode skal ikke bruges til anmeldelsen, den kræves dog til aktiveringen af e-mail-funktionerne indenfor Wikien.',
+'confirmemail_sendfailed' => 'Bekræftelsesmailen kunne ikke afsendes. Kontroller at e-mail-adressen er korrekt.
Svarbesked fra mailserveren: $1',
-'confirmemail_invalid' => 'Ugyldig bekræftelseskode. Kodens gyldighed er muligvis udløbet.',
-'confirmemail_needlogin' => 'Du skal $1 for at bekræfte e-mail-adressen.',
-'confirmemail_success' => 'E-mail-adressen er nu bekræftet. Du kan nu logge på.',
-'confirmemail_loggedin' => 'E-mail-adressen er nu bekræftet.',
-'confirmemail_error' => 'Der skete en fejl ved bekræftelsen af e-mail-adressen.',
-'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mail-adressen',
-'confirmemail_body' => 'Hej,
+'confirmemail_invalid' => 'Ugyldig bekræftelseskode. Kodens gyldighed er muligvis udløbet.',
+'confirmemail_needlogin' => 'Du skal $1 for at bekræfte e-mail-adressen.',
+'confirmemail_success' => 'E-mail-adressen er nu bekræftet. Du kan nu logge på.',
+'confirmemail_loggedin' => 'E-mail-adressen er nu bekræftet.',
+'confirmemail_error' => 'Der skete en fejl ved bekræftelsen af e-mail-adressen.',
+'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mail-adressen',
+'confirmemail_body' => 'Hej,
Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mail-adresse til brugerkontoen "$2" på {{SITENAME}}.
@@ -3026,8 +3107,33 @@ Hvis denne e-mail-adresse *ikke* hører til den anførte brugerkonto, skal du i
--
{{SITENAME}}: {{fullurl:{{Mediawiki:mainpage}}}}',
-'confirmemail_invalidated' => 'E-mail-bekræftelse afvist',
-'invalidateemail' => 'Cancel e-mail confirmation',
+'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret emailadressen for kontoen "$2" til denne adresse på {{SITENAME}}.
+
+For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere emailfunktionerne på {{SITENAME}}, bedes du åbne følgende link i en browser:
+
+$3
+
+Hvis denne konto *ikke* tilhører dig, bedes du åbne følgende link, for at afbryde ændringen
+
+$5
+
+Denne bekræftelseskode udløber $4',
+'confirmemail_body_set' => 'En person, sandsynligvis dig, har fra IP-adressen $1,
+angivet denne e-mail-adresse til kontoen "$2" på {{SITENAME}}.
+
+For at bekræfte, at denne konto virkelig tilhører dig og genaktivere
+e-mail-funktioner på {{SITENAME}}, åbn dette link i din browser:
+
+$3
+
+Hvis kontoen ikke *ikke* tilhører dig, så følg dette link
+for at annullere e-mail-adressens bekræftelse:
+
+$5
+
+Denne bekræftelseskode vil udløbe den $4.',
+'confirmemail_invalidated' => 'E-mail-bekræftelse afvist',
+'invalidateemail' => 'Cancel e-mail confirmation',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-tilkobling er deaktiveret]',
@@ -3069,6 +3175,7 @@ Bekræft venligst, at du virkelig vil oprette denne side igen.",
'table_pager_first' => 'Første side',
'table_pager_last' => 'Sidste side',
'table_pager_limit' => 'Vis $1 indførsler pr. side',
+'table_pager_limit_label' => 'Elementer pr. side:',
'table_pager_limit_submit' => 'Start',
'table_pager_empty' => 'Ingen resultater',
@@ -3116,7 +3223,7 @@ Du kan også [[Special:Watchlist/edit|bruge standard editoren]].',
'watchlisttools-raw' => 'Rediger rå overvågningsliste',
# Core parser functions
-'unknown_extension_tag' => 'Unknown extension tag "$1"',
+'unknown_extension_tag' => 'Ukendt tag "$1"',
'duplicate-defaultsort' => 'Advarsel: Standardsorteringsnøglen "$2" tilsidesætter den tidligere sorteringsnøgle "$1".',
# Special:Version
@@ -3125,6 +3232,7 @@ Du kan også [[Special:Watchlist/edit|bruge standard editoren]].',
'version-specialpages' => 'Specialsider',
'version-parserhooks' => 'Oversætter-funktioner',
'version-variables' => 'Variabler',
+'version-skins' => 'Udseender',
'version-other' => 'Andet',
'version-mediahandlers' => 'Specialhåndtering af mediefiler',
'version-hooks' => 'Funktionstilføjelser',
@@ -3136,6 +3244,13 @@ Du kan også [[Special:Watchlist/edit|bruge standard editoren]].',
'version-hook-subscribedby' => 'Brugt af',
'version-version' => '(Version $1)',
'version-license' => 'Licens',
+'version-poweredby-credits' => "Denne wiki er drevet af'''[http://www.mediawiki.org/ MediaWiki ]''', copyright © 2001 - $1 $2.",
+'version-poweredby-others' => 'andre',
+'version-license-info' => 'MediaWiki er gratis software; du kan redistribuere det og/eller ændre det under betingelserne i GNU General Public License som offentliggjort af Free Software Foundation; enten version 2 af licensen eller (efter eget valg) enhver senere version.
+
+MediaWiki distribueres i håb om at det vil være nyttigt, men UDEN NOGEN GARANTI; uden selv de underforståede garantier SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Se GNU General Public License for yderligere detaljer.
+
+Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General Public License] sammen med dette program; og hvis ikke, så skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html læs den online].',
'version-software' => 'Installeret software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
@@ -3207,6 +3322,15 @@ Denne side oplister de tags som programmet kan mærke en redigering med, og dere
'tags-edit' => 'Redigér',
'tags-hitcount' => '{{PLURAL:$1|en ændring|$1 ændringer}}',
+# Special:ComparePages
+'comparepages' => 'Sammenlign sider',
+'compare-selector' => 'Sammenlign sideversioner',
+'compare-page1' => 'Side 1',
+'compare-page2' => 'Side 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Sammenlign',
+
# Database error messages
'dberr-header' => 'Wikien har et problem',
'dberr-problems' => 'Undskyld! Siden har tekniske problemer.',
@@ -3223,8 +3347,13 @@ Denne side oplister de tags som programmet kan mærke en redigering med, og dere
'htmlform-float-invalid' => 'Den angivne værdi er ikke et tal.',
'htmlform-int-toolow' => 'Den angivne værdi er under minimumsværdien på $1',
'htmlform-int-toohigh' => 'Den angivne værdi er over maksimumsværdien på $1',
+'htmlform-required' => 'Denne værdi skal angives',
'htmlform-submit' => 'Gem',
'htmlform-reset' => 'Annuller ændringer',
'htmlform-selectorother-other' => 'Anden',
+# SQLite database support
+'sqlite-has-fts' => '$1 med fuld-tekst søgnings support',
+'sqlite-no-fts' => '$1 uden fuld-tekst søgnings support',
+
);
diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php
index e6b0ec7a..e5f4c606 100644
--- a/languages/messages/MessagesDe.php
+++ b/languages/messages/MessagesDe.php
@@ -57,7 +57,7 @@
$capitalizeAllNouns = true;
$namespaceNames = array(
- NS_MEDIA => 'Media',
+ NS_MEDIA => 'Medium',
NS_SPECIAL => 'Spezial',
NS_TALK => 'Diskussion',
NS_USER => 'Benutzer',
@@ -89,60 +89,61 @@ $bookstoreList = array(
'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Doppelte Weiterleitungen' ),
- 'BrokenRedirects' => array( 'Kaputte Weiterleitungen' ),
+ 'DoubleRedirects' => array( 'Doppelte_Weiterleitungen' ),
+ 'BrokenRedirects' => array( 'Kaputte_Weiterleitungen' ),
'Disambiguations' => array( 'Begriffsklärungsverweise' ),
'Userlogin' => array( 'Anmelden' ),
'Userlogout' => array( 'Abmelden' ),
- 'CreateAccount' => array( 'Benutzerkonto anlegen' ),
+ 'CreateAccount' => array( 'Benutzerkonto_anlegen' ),
'Preferences' => array( 'Einstellungen' ),
'Watchlist' => array( 'Beobachtungsliste' ),
- 'Recentchanges' => array( 'Letzte Änderungen' ),
+ 'Recentchanges' => array( 'Letzte_Änderungen' ),
'Upload' => array( 'Hochladen' ),
'Listfiles' => array( 'Dateien', 'Dateiliste' ),
- 'Newimages' => array( 'Neue Dateien' ),
+ 'Newimages' => array( 'Neue_Dateien' ),
'Listusers' => array( 'Benutzer', 'Benutzerliste' ),
'Listgrouprights' => array( 'Gruppenrechte' ),
'Statistics' => array( 'Statistik' ),
- 'Randompage' => array( 'Zufällige Seite' ),
- 'Lonelypages' => array( 'Verwaiste Seiten' ),
- 'Uncategorizedpages' => array( 'Nicht kategorisierte Seiten' ),
- 'Uncategorizedcategories' => array( 'Nicht kategorisierte Kategorien' ),
- 'Uncategorizedimages' => array( 'Nicht kategorisierte Dateien' ),
- 'Uncategorizedtemplates' => array( 'Nicht kategorisierte Vorlagen' ),
- 'Unusedcategories' => array( 'Unbenutzte Kategorien' ),
- 'Unusedimages' => array( 'Unbenutzte Dateien' ),
- 'Wantedpages' => array( 'Gewünschte Seiten' ),
- 'Wantedcategories' => array( 'Gewünschte Kategorien' ),
- 'Wantedfiles' => array( 'Fehlende Dateien' ),
- 'Wantedtemplates' => array( 'Fehlende Vorlagen' ),
- 'Mostlinked' => array( 'Meistverlinkte Seiten' ),
- 'Mostlinkedcategories' => array( 'Meistbenutzte Kategorien' ),
- 'Mostlinkedtemplates' => array( 'Meistbenutzte Vorlagen' ),
- 'Mostimages' => array( 'Meistbenutzte Dateien' ),
- 'Mostcategories' => array( 'Meistkategorisierte Seiten' ),
- 'Mostrevisions' => array( 'Meistbearbeitete Seiten' ),
- 'Fewestrevisions' => array( 'Wenigstbearbeitete Seiten' ),
- 'Shortpages' => array( 'Kürzeste Seiten' ),
- 'Longpages' => array( 'Längste Seiten' ),
- 'Newpages' => array( 'Neue Seiten' ),
- 'Ancientpages' => array( 'Älteste Seiten' ),
+ 'Randompage' => array( 'Zufällige_Seite' ),
+ 'Lonelypages' => array( 'Verwaiste_Seiten' ),
+ 'Uncategorizedpages' => array( 'Nicht_kategorisierte_Seiten' ),
+ 'Uncategorizedcategories' => array( 'Nicht_kategorisierte_Kategorien' ),
+ 'Uncategorizedimages' => array( 'Nicht_kategorisierte_Dateien' ),
+ 'Uncategorizedtemplates' => array( 'Nicht_kategorisierte_Vorlagen' ),
+ 'Unusedcategories' => array( 'Unbenutzte_Kategorien' ),
+ 'Unusedimages' => array( 'Unbenutzte_Dateien' ),
+ 'Wantedpages' => array( 'Gewünschte_Seiten' ),
+ 'Wantedcategories' => array( 'Gewünschte_Kategorien' ),
+ 'Wantedfiles' => array( 'Fehlende_Dateien' ),
+ 'Wantedtemplates' => array( 'Fehlende_Vorlagen' ),
+ 'Mostlinked' => array( 'Meistverlinkte_Seiten' ),
+ 'Mostlinkedcategories' => array( 'Meistbenutzte_Kategorien' ),
+ 'Mostlinkedtemplates' => array( 'Meistbenutzte_Vorlagen' ),
+ 'Mostimages' => array( 'Meistbenutzte_Dateien' ),
+ 'Mostcategories' => array( 'Meistkategorisierte_Seiten' ),
+ 'Mostrevisions' => array( 'Meistbearbeitete_Seiten' ),
+ 'Fewestrevisions' => array( 'Wenigstbearbeitete_Seiten' ),
+ 'Shortpages' => array( 'Kürzeste_Seiten' ),
+ 'Longpages' => array( 'Längste_Seiten' ),
+ 'Newpages' => array( 'Neue_Seiten' ),
+ 'Ancientpages' => array( 'Älteste_Seiten' ),
'Deadendpages' => array( 'Sackgassenseiten' ),
- 'Protectedpages' => array( 'Geschützte Seiten' ),
- 'Protectedtitles' => array( 'Gesperrte Titel' ),
- 'Allpages' => array( 'Alle Seiten' ),
+ 'Protectedpages' => array( 'Geschützte_Seiten' ),
+ 'Protectedtitles' => array( 'Geschützte_Titel', 'Gesperrte_Titel' ),
+ 'Allpages' => array( 'Alle_Seiten' ),
'Prefixindex' => array( 'Präfixindex' ),
- 'Ipblocklist' => array( 'Liste der Sperren', 'Gesperrte IPs' ),
+ 'Ipblocklist' => array( 'Liste_der_Sperren', 'Gesperrte_IP-Adressen', 'Gesperrte_IPs' ),
+ 'Unblock' => array( 'Freigeben' ),
'Specialpages' => array( 'Spezialseiten' ),
'Contributions' => array( 'Beiträge' ),
'Emailuser' => array( 'E-Mail' ),
- 'Confirmemail' => array( 'E-Mail bestaetigen', 'E-Mail bestätigen' ),
+ 'Confirmemail' => array( 'E-Mail_bestaetigen', 'E-Mail_bestätigen' ),
'Whatlinkshere' => array( 'Linkliste', 'Verweisliste' ),
- 'Recentchangeslinked' => array( 'Änderungen an verlinkten Seiten' ),
+ 'Recentchangeslinked' => array( 'Änderungen_an_verlinkten_Seiten' ),
'Movepage' => array( 'Verschieben' ),
'Blockme' => array( 'Proxy-Sperre' ),
'Booksources' => array( 'ISBN-Suche' ),
@@ -153,33 +154,38 @@ $specialPageAliases = array(
'Blockip' => array( 'Sperren' ),
'Undelete' => array( 'Wiederherstellen' ),
'Import' => array( 'Importieren' ),
- 'Lockdb' => array( 'Datenbank sperren' ),
- 'Unlockdb' => array( 'Datenbank entsperren' ),
+ 'Lockdb' => array( 'Datenbank_sperren' ),
+ 'Unlockdb' => array( 'Datenbank_entsperren' ),
'Userrights' => array( 'Benutzerrechte' ),
'MIMEsearch' => array( 'MIME-Typ-Suche' ),
'FileDuplicateSearch' => array( 'Datei-Duplikat-Suche' ),
- 'Unwatchedpages' => array( 'Ignorierte Seiten', 'Unbeobachtete Seiten' ),
+ 'Unwatchedpages' => array( 'Ignorierte_Seiten', 'Unbeobachtete_Seiten' ),
'Listredirects' => array( 'Weiterleitungen' ),
'Revisiondelete' => array( 'Versionslöschung' ),
- 'Unusedtemplates' => array( 'Unbenutzte Vorlagen' ),
- 'Randomredirect' => array( 'Zufällige Weiterleitung' ),
- 'Mypage' => array( 'Meine Benutzerseite' ),
- 'Mytalk' => array( 'Meine Diskussionsseite' ),
- 'Mycontributions' => array( 'Meine Beiträge' ),
+ 'Unusedtemplates' => array( 'Unbenutzte_Vorlagen' ),
+ 'Randomredirect' => array( 'Zufällige_Weiterleitung' ),
+ 'Mypage' => array( 'Meine_Benutzerseite' ),
+ 'Mytalk' => array( 'Meine_Diskussionsseite' ),
+ 'Mycontributions' => array( 'Meine_Beiträge' ),
+ 'Myuploads' => array( 'Meine_hochgeladenen_Dateien' ),
+ 'PermanentLink' => array( 'Permanenter_Link' ),
'Listadmins' => array( 'Administratoren' ),
'Listbots' => array( 'Bots' ),
- 'Popularpages' => array( 'Beliebteste Seiten' ),
+ 'Popularpages' => array( 'Beliebteste_Seiten' ),
'Search' => array( 'Suche' ),
- 'Resetpass' => array( 'Passwort ändern', 'Passwort zurücksetzen' ),
- 'Withoutinterwiki' => array( 'Fehlende Interwikis' ),
- 'MergeHistory' => array( 'Versionsgeschichten vereinen' ),
+ 'Resetpass' => array( 'Passwort_ändern', 'Passwort_zurücksetzen' ),
+ 'Withoutinterwiki' => array( 'Fehlende_Interwikis' ),
+ 'MergeHistory' => array( 'Versionsgeschichten_vereinen' ),
'Filepath' => array( 'Dateipfad' ),
- 'Invalidateemail' => array( 'E-Mail nicht bestaetigen', 'E-Mail nicht bestätigen' ),
- 'Blankpage' => array( 'Leerseite', 'Leere Seite' ),
+ 'Invalidateemail' => array( 'E-Mail_nicht_bestaetigen', 'E-Mail_nicht_bestätigen' ),
+ 'Blankpage' => array( 'Leerseite', 'Leere_Seite' ),
'LinkSearch' => array( 'Weblink-Suche' ),
- 'DeletedContributions' => array( 'Gelöschte Beiträge' ),
+ 'DeletedContributions' => array( 'Gelöschte_Beiträge' ),
'Tags' => array( 'Markierungen' ),
- 'Activeusers' => array( 'Aktive Benutzer' ),
+ 'Activeusers' => array( 'Aktive_Benutzer' ),
+ 'ComparePages' => array( 'Seiten_vergleichen' ),
+ 'Badtitle' => array( 'Ungültiger_Titel' ),
+ 'DisableAccount' => array( 'Benutzerkonto_deaktivieren' ),
);
$datePreferences = array(
@@ -289,6 +295,7 @@ $magicWords = array(
'int' => array( '0', 'NACHRICHT:', 'INT:' ),
'sitename' => array( '1', 'PROJEKTNAME', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
+ 'nse' => array( '0', 'NR_URL:', 'NSE:' ),
'localurl' => array( '0', 'LOKALE_URL:', 'LOCALURL:' ),
'scriptpath' => array( '0', 'SKRIPTPFAD', 'SCRIPTPATH' ),
'stylepath' => array( '0', 'STYLEPFAD', 'STYLEPATH' ),
@@ -362,8 +369,7 @@ $messages = array(
'tog-editsection' => 'Links zum Bearbeiten einzelner Abschnitte anzeigen',
'tog-editsectiononrightclick' => 'Einzelne Abschnitte per Rechtsklick bearbeiten (benötigt JavaScript)',
'tog-showtoc' => 'Anzeigen eines Inhaltsverzeichnisses bei Seiten mit mehr als drei Ãœberschriften',
-'tog-rememberpassword' => 'Auf diesem Computer dauerhaft angemeldet bleiben',
-'tog-editwidth' => 'Eingabefeld erweitern, um den ganzen Bildschirm auszufüllen',
+'tog-rememberpassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
'tog-watchcreations' => 'Selbst erstellte Seiten automatisch beobachten',
'tog-watchdefault' => 'Selbst geänderte Seiten automatisch beobachten',
'tog-watchmoves' => 'Selbst verschobene Seiten automatisch beobachten',
@@ -374,16 +380,16 @@ $messages = array(
'tog-nocache' => 'Seitencache des Browsers deaktivieren',
'tog-enotifwatchlistpages' => 'Bei Änderungen an beobachteten Seiten E-Mails senden',
'tog-enotifusertalkpages' => 'Bei Änderungen an meiner Benutzer-Diskussionsseite E-Mails senden',
-'tog-enotifminoredits' => 'Auch bei kleinen Änderungen an beobachteten Seiten E-Mails senden',
+'tog-enotifminoredits' => 'Auch bei kleinen Änderungen an Seiten E-Mails senden',
'tog-enotifrevealaddr' => 'Meine E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen',
'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
'tog-oldsig' => 'Vorschau der aktuellen Signatur:',
'tog-fancysig' => 'Signatur als Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => 'Externen Editor als Standard benutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [http://www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-externaldiff' => 'Externes Programm für Versionsunterschiede als Standard benutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [http://www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
+'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [http://www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
+'tog-externaldiff' => 'Externes Programm für Versionsunterschiede standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [http://www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
'tog-showjumplinks' => '„Wechseln zu“-Links aktivieren',
'tog-uselivepreview' => 'Live-Vorschau nutzen (benötigt JavaScript) (experimentell)',
-'tog-forceeditsummary' => 'Warnen, wenn beim Speichern die Zusammenfassung fehlt',
+'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
'tog-watchlisthidebots' => 'Bearbeitungen durch Bots in der Beobachtungsliste ausblenden',
'tog-watchlisthideminor' => 'Kleine Bearbeitungen in der Beobachtungsliste ausblenden',
@@ -392,7 +398,7 @@ $messages = array(
'tog-watchlisthidepatrolled' => 'Kontrollierte Änderungen in der Beobachtungsliste ausblenden',
'tog-nolangconversion' => 'Konvertierung von Sprachvarianten deaktivieren',
'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende',
-'tog-diffonly' => 'Zeige beim Versionsvergleich nur die Unterschiede, nicht die vollständige Seite',
+'tog-diffonly' => 'Zeige beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite',
'tog-showhiddencats' => 'Zeige versteckte Kategorien',
'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
@@ -510,31 +516,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Abschnitt hinzufügen',
-'vector-action-delete' => 'Löschen',
-'vector-action-move' => 'Verschieben',
-'vector-action-protect' => 'Schützen',
-'vector-action-undelete' => 'Wiederherstellen',
-'vector-action-unprotect' => 'Freigeben',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Hilfeseite',
-'vector-namespace-image' => 'Datei',
-'vector-namespace-main' => 'Seite',
-'vector-namespace-media' => 'Medienseite',
-'vector-namespace-mediawiki' => 'MediaWiki-Systemnachricht',
-'vector-namespace-project' => 'Projektseite',
-'vector-namespace-special' => 'Spezialseite',
-'vector-namespace-talk' => 'Diskussion',
-'vector-namespace-template' => 'Vorlage',
-'vector-namespace-user' => 'Benutzerseite',
-'vector-view-create' => 'Erstellen',
-'vector-view-edit' => 'Bearbeiten',
-'vector-view-history' => 'Versionsgeschichte',
-'vector-view-view' => 'Lesen',
-'vector-view-viewsource' => 'Quelltext anzeigen',
-'actions' => 'Aktionen',
-'namespaces' => 'Namensräume',
-'variants' => 'Varianten',
+'vector-action-addsection' => 'Abschnitt hinzufügen',
+'vector-action-delete' => 'Löschen',
+'vector-action-move' => 'Verschieben',
+'vector-action-protect' => 'Schützen',
+'vector-action-undelete' => 'Wiederherstellen',
+'vector-action-unprotect' => 'Freigeben',
+'vector-simplesearch-preference' => 'Erweiterte Suchvorschläge aktivieren (nur Vector)',
+'vector-view-create' => 'Erstellen',
+'vector-view-edit' => 'Bearbeiten',
+'vector-view-history' => 'Versionsgeschichte',
+'vector-view-view' => 'Lesen',
+'vector-view-viewsource' => 'Quelltext anzeigen',
+'actions' => 'Aktionen',
+'namespaces' => 'Namensräume',
+'variants' => 'Varianten',
'errorpagetitle' => 'Fehler',
'returnto' => 'Zurück zur Seite $1.',
@@ -595,6 +591,9 @@ Zu viele Benutzer versuchen, diese Seite zu besuchen.
Bitte warte einige Minuten, bevor du es noch einmal versuchst.
$1',
+'pool-timeout' => 'Zeitablauf während des Wartens auf die Sperrung',
+'pool-queuefull' => 'Poolwarteschlange ist voll',
+'pool-errorunknown' => 'Unbekannter Fehler',
# 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' => 'Ãœber {{SITENAME}}',
@@ -760,7 +759,8 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupass
'yourname' => 'Benutzername:',
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort wiederholen:',
-'remembermypassword' => 'dauerhaft anmelden',
+'remembermypassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
+'securelogin-stick-https' => 'Nach dem Anmelden mit HTTPS verbunden bleiben',
'yourdomainname' => 'Deine Domain:',
'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.',
'login' => 'Anmelden',
@@ -777,6 +777,7 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupass
'gotaccount' => "Du hast bereits ein Benutzerkonto? '''$1'''.",
'gotaccountlink' => 'Anmelden',
'createaccountmail' => 'per E-Mail',
+'createaccountreason' => 'Grund:',
'badretype' => 'Die beiden Passwörter stimmen nicht überein.',
'userexists' => 'Dieser Benutzername ist schon vergeben. Bitte wähle einen anderen.',
'loginerror' => 'Fehler bei der Anmeldung',
@@ -795,6 +796,7 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupass
'wrongpasswordempty' => 'Es wurde kein Passwort eingegeben. Bitte versuche es erneut.',
'passwordtooshort' => 'Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.',
'password-name-match' => 'Dein Passwort muss sich von deinem Benutzernamen unterscheiden.',
+'password-login-forbidden' => 'Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.',
'mailmypassword' => 'Neues Passwort zusenden',
'passwordremindertitle' => 'Neues Passwort für ein {{SITENAME}}-Benutzerkonto',
'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
@@ -835,6 +837,9 @@ Bitte warte, bevor du es erneut probierst.',
'loginlanguagelabel' => 'Sprache: $1',
'suspicious-userlogout' => 'Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.',
+# E-mail sending
+'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
+
# Password reset dialog
'resetpass' => 'Passwort ändern',
'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschließen, musst du jetzt ein neues Passwort wählen.',
@@ -886,9 +891,10 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
'showlivepreview' => 'Live-Vorschau',
'showdiff' => 'Änderungen zeigen',
'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'anonpreviewwarning' => "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
'missingsummary' => "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
'missingcommenttext' => 'Dein Abschnitt enthält keinen Text.',
-'missingcommentheader' => "'''ACHTUNG:''' Du hast keine Überschrift im Feld „Betreff:“ eingegeben. Wenn du erneut auf „Seite speichern“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
+'missingcommentheader' => "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
'summary-preview' => 'Vorschau der Zusammenfassungszeile:',
'subject-preview' => 'Vorschau des Betreffs:',
'blockedtitle' => 'Benutzer ist gesperrt',
@@ -959,7 +965,11 @@ Zur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:',
'''Es wurde noch nicht gespeichert!'''",
'userjspreview' => "'''Beachte, dass du nur eine Vorschau deines Benutzer-JavaScript betrachtest.'''
'''Es wurde noch nicht gespeichert!'''",
-'userinvalidcssjstitle' => "'''Achtung:''' Skin „$1“ existiert nicht. Bedenke, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/monobook.css'' an Stelle von ''{{ns:user}}:Mustermann/Monobook.css''.",
+'sitecsspreview' => "'''Beachte, dass du nur eine Vorschau dieses CSS betrachtest.'''
+'''Es wurde noch nicht gespeichert!'''",
+'sitejspreview' => "'''Beachte, dass du nur eine Vorschau dieses JavaScript betrachtest.'''
+'''Es wurde noch nicht gespeichert!'''",
+'userinvalidcssjstitle' => "'''Achtung:''' Die Benutzeroberfläche „$1“ existiert nicht. Bedenke, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
'updated' => '(Geändert)',
'note' => "'''Hinweis:'''",
'previewnote' => "'''Dies ist nur eine Vorschau, die Seite wurde noch nicht gespeichert!'''",
@@ -997,8 +1007,6 @@ Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränku
Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast
(siehe $1 für weitere Details). '''ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
-'longpagewarning' => "'''Warnung:''' Diese Seite ist $1 KB groß; einige Browser könnten Probleme haben, Seiten zu bearbeiten, die größer als 32 KB sind.
-Überlege bitte, ob eine Aufteilung der Seite in kleinere Abschnitte möglich ist.",
'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist $1 KB groß. Dies ist größer als das erlaubte Maximum von $2 KB.'''
Er kann nicht gespeichert werden.",
'readonlywarning' => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass deine Änderungen derzeit nicht gespeichert werden können.
@@ -1172,6 +1180,8 @@ $1",
'logdelete-failure' => "'''Logbuchsichtbarkeit kann nicht geändert werden:'''
$1",
'revdel-restore' => 'Sichtbarkeit ändern',
+'revdel-restore-deleted' => 'gelöschte Versionen',
+'revdel-restore-visible' => 'sichtbare Versionen',
'pagehist' => 'Versionsgeschichte',
'deletedhist' => 'Gelöschte Versionen',
'revdelete-content' => 'Seiteninhalt',
@@ -1239,11 +1249,13 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
# Diffs
'history-title' => 'Versionsgeschichte von „$1“',
'difference' => '(Unterschied zwischen Versionen)',
+'difference-multipage' => '(Unterschied zwischen Seiten)',
'lineno' => 'Zeile $1:',
'compareselectedversions' => 'Gewählte Versionen vergleichen',
'showhideselectedversions' => 'Gewählte Versionen zeigen/verstecken',
'editundo' => 'rückgängig',
-'diff-multi' => '(Der Versionsvergleich bezieht {{PLURAL:$1|1 dazwischenliegende Version|$1 dazwischenliegende Versionen}} mit ein.)',
+'diff-multi' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem Benutzer|$2 Benutzern}} {{PLURAL:$1|wird|werden}} nicht angezeigt)',
+'diff-multi-manyusers' => '({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)',
# Search results
'searchresults' => 'Suchergebnisse',
@@ -1278,6 +1290,7 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
'searchprofile-everything-tooltip' => 'Gesamten Inhalt durchsuchen (inklusive Diskussionsseiten)',
'searchprofile-advanced-tooltip' => 'Suche in weiteren Namensräumen',
'search-result-size' => '$1 ({{PLURAL:$2|1 Wort|$2 Wörter}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Seite|$1 Seiten}} ({{PLURAL:$2|1 Unterkategorie|$2 Unterkategorien}}, {{PLURAL:$3|1 Datei|$3 Dateien}})',
'search-result-score' => 'Relevanz: $1 %',
'search-redirect' => '(Weiterleitung von „$1“)',
'search-section' => '(Abschnitt $1)',
@@ -1352,6 +1365,7 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
'contextlines' => 'Zeilen pro Treffer:',
'contextchars' => 'Zeichen pro Zeile:',
'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Byte):',
+'stub-threshold-disabled' => 'Deaktiviert',
'recentchangesdays' => 'Anzahl der Tage, die die Liste der „Letzten Änderungen“ standardmäßig umfassen soll:',
'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
'recentchangescount' => 'Anzahl der standardmäßig angezeigten Bearbeitungen:',
@@ -1385,6 +1399,7 @@ Hier ein zufällig generierter Wert, den du verwenden kannst: $1',
'prefs-files' => 'Dateien',
'prefs-custom-css' => 'Benutzerdefinierte CSS',
'prefs-custom-js' => 'Benutzerdefiniertes JavaScript',
+'prefs-common-css-js' => 'Gemeinsames CSS/JavaScript aller Benutzeroberflächen:',
'prefs-reset-intro' => 'Du kannst diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.
Dies kann nicht mehr rückgängig gemacht werden.',
'prefs-emailconfirm-label' => 'E-Mail-Bestätigung:',
@@ -1423,9 +1438,15 @@ Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt
'prefs-advancedrendering' => 'Erweiterte Optionen',
'prefs-advancedsearchoptions' => 'Erweiterte Optionen',
'prefs-advancedwatchlist' => 'Erweiterte Optionen',
-'prefs-display' => 'Anzeigeoptionen',
+'prefs-displayrc' => 'Anzeigeoptionen',
+'prefs-displaysearchoptions' => 'Anzeigeoptionen',
+'prefs-displaywatchlist' => 'Anzeigeoptionen',
'prefs-diffs' => 'Versionsvergleich',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-Mail-Adresse scheint gültig zu sein',
+'email-address-validity-invalid' => 'Eine gültige E-Mail-Adresse ist erforderlich.',
+
# User rights
'userrights' => 'Benutzerrechteverwaltung',
'userrights-lookup-user' => 'Gruppenzugehörigkeit verwalten',
@@ -1508,6 +1529,7 @@ Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt
'right-hideuser' => 'Benutzernamen sperren und verbergen',
'right-ipblock-exempt' => 'Ausnahme von IP-Sperren, Autoblocks und Rangesperren',
'right-proxyunbannable' => 'Ausnahme von automatischen Proxysperren',
+'right-unblockself' => 'Sich selbst entsperren',
'right-protect' => 'Seitenschutzstatus ändern',
'right-editprotected' => 'Geschützte Seiten bearbeiten (ohne Kaskadenschutz)',
'right-editinterface' => 'Benutzeroberfläche bearbeiten',
@@ -1530,7 +1552,6 @@ Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt
'right-siteadmin' => 'Datenbank sperren und entsperren',
'right-reset-passwords' => 'Passwort eines anderen Benutzers zurücksetzen',
'right-override-export-depth' => 'Exportiere Seiten einschließlich verlinkter Seiten bis zu einer Tiefe von 5',
-'right-versiondetail' => 'Detailinformation über die Software und ihre Versionsdaten einsehen',
'right-sendemail' => 'E-Mails an andere Benutzer senden',
# User rights log
@@ -1581,14 +1602,9 @@ Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt
'recentchanges-legend' => 'Anzeigeoptionen',
'recentchangestext' => "Auf dieser Seite kannst du die letzten Änderungen auf '''{{SITENAME}}''' nachverfolgen.",
'recentchanges-feed-description' => 'Verfolge mit diesem Feed die letzten Änderungen in {{SITENAME}}.',
-'recentchanges-label-legend' => 'Legende: $1.',
-'recentchanges-legend-newpage' => '$1 - neue Seite',
'recentchanges-label-newpage' => 'Neue Seite',
-'recentchanges-legend-minor' => '$1 - kleine Änderung',
'recentchanges-label-minor' => 'Kleine Änderung',
-'recentchanges-legend-bot' => '$1 - Änderung durch einen Bot',
'recentchanges-label-bot' => 'Änderung durch einen Bot',
-'recentchanges-legend-unpatrolled' => '$1 - nicht-kontrollierte Änderung',
'recentchanges-label-unpatrolled' => 'Nicht-kontrollierte Änderung',
'rcnote' => "{{PLURAL:$1|'''1''' Änderung|'''$1''' Änderungen}} in den {{PLURAL:$2|letzten 24 Stunden|letzten '''$2''' Tagen}}.
Stand: $4, $5 Uhr.",
@@ -1636,6 +1652,9 @@ Stand: $4, $5 Uhr.",
'upload_directory_missing' => 'Das Upload-Verzeichnis ($1) fehlt und konnte durch den Webserver auch nicht erstellt werden.',
'upload_directory_read_only' => 'Der Webserver hat keine Schreibrechte für das Upload-Verzeichnis ($1).',
'uploaderror' => 'Fehler beim Hochladen',
+'upload-recreate-warning' => "'''Achtung: Eine Datei dieses Namens wurde bereits gelöscht oder verschoben.'''
+
+Es folgt ein Auszug aus dem Lösch- und Verschiebungs-Logbuch dieser Datei.",
'uploadtext' => "Benutze dieses Formular, um neue Dateien hochzuladen.
Gehe zu der [[Special:FileList|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen. Siehe auch das [[Special:Log/upload|Datei-]] und [[Special:Log/delete|Lösch-Logbuch]].
@@ -1668,6 +1687,17 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
'filetype-unwanted-type' => "'''„.$1“''' ist ein unerwünschtes Dateiformat. Erlaubt {{PLURAL:$3|ist das Dateiformat|sind die Dateiformate}}: $2.",
'filetype-banned-type' => "'''„.$1“''' ist ein nicht erlaubtes Dateiformat. Erlaubt {{PLURAL:$3|ist das Dateiformat|sind die Dateiformate}}: $2.",
'filetype-missing' => 'Die hochzuladende Datei hat keine Erweiterung (z. B. „.jpg“).',
+'empty-file' => 'Die übertragene Datei ist leer',
+'file-too-large' => 'Die übertragene Datei ist zu groß',
+'filename-tooshort' => 'Der Dateiname ist zu kurz',
+'filetype-banned' => 'Diese Dateiendung ist gesperrt.',
+'verification-error' => 'Diese Datei hat die Dateiprüfung nicht bestanden.',
+'hookaborted' => 'Der Versuch, die Änderung durchzuführen, ist aufgrund eines Extension-Hooks fehlgeschlagen',
+'illegal-filename' => 'Der Dateiname ist nicht erlaubt',
+'overwrite' => 'Das Ãœberschreiben einer existierenden Datei ist nicht erlaubt',
+'unknown-error' => 'Ein unbekannter Fehler ist aufgetreten.',
+'tmp-create-error' => 'Temporäre Datei konnte nicht erstellt werden',
+'tmp-write-error' => 'Fehler beim Schreiben der temporären Datei',
'large-file' => 'Die Dateigröße sollte nach Möglichkeit $1 nicht überschreiten. Diese Datei ist $2 groß.',
'largefileserver' => 'Die Datei ist größer als die vom Server eingestellte Maximalgröße.',
'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrolliere, ob du die Datei wirklich hochladen willst.',
@@ -1693,13 +1723,14 @@ Wenn du diese Datei trotzdem hochladen möchtest, gehe bitte zurück und ändere
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Diese Datei ist ein Duplikat der folgenden {{PLURAL:$1|Datei|$1 Dateien}}:',
'file-deleted-duplicate' => 'Eine mit dieser identische Datei ([[:$1]]) wurde früher gelöscht. Sieh das Lösch-Logbuch ein, bevor du sie hochlädst.',
-'successfulupload' => 'Erfolgreich hochgeladen',
'uploadwarning' => 'Warnung',
'uploadwarning-text' => 'Bitte ändere unten die Dateibeschreibung und versuche es erneut.',
'savefile' => 'Datei speichern',
'uploadedimage' => 'hat „[[$1]]“ hochgeladen',
'overwroteimage' => 'hat eine neue Version von „[[$1]]“ hochgeladen',
'uploaddisabled' => 'Hochladen deaktiviert',
+'copyuploaddisabled' => 'Das Hochladen von URLs ist deaktiviert',
+'uploadfromurl-queued' => 'Dein Upload befindet sich nun in der Warteschlange.',
'uploaddisabledtext' => 'Das Hochladen von Dateien ist deaktiviert.',
'php-uploaddisabledtext' => 'Das Hochladen von Dateien wurde in PHP deaktiviert.
Bitte überprüfe die <code>file_uploads</code>-Einstellung.',
@@ -1734,6 +1765,14 @@ JD # Jenoptik
MGP # Pentax
PICT # verschiedene
#</pre> <!-- Diese Zeile darf nicht verändert werden!-->',
+'upload-success-subj' => 'Erfolgreich hochgeladen',
+'upload-success-msg' => 'Das Hochladen von [$2] war erfolgreich. Sie ist hier verfügbar: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Hochladefehler',
+'upload-failure-msg' => 'Es gab ein Problem mit deiner hochgeladenen Datei von [$2]:
+
+$1',
+'upload-warning-subj' => 'Hochladewarnung',
+'upload-warning-msg' => 'Es gab ein Problem beim Hochladen von [$2]. Bitte zum [[Special:Upload/stash/$1|Hochladeformular]] zurückkehren, um dieses Problem zu beheben.',
'upload-proto-error' => 'Falsches Protokoll',
'upload-proto-error-text' => 'Die URL muss mit <code>http://</code> oder <code>ftp://</code> beginnen.',
@@ -1795,6 +1834,7 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
'listfiles_search_for' => 'Suche nach Datei:',
'imgfile' => 'Datei',
'listfiles' => 'Dateiliste',
+'listfiles_thumb' => 'Vorschaubild',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Name',
'listfiles_user' => 'Benutzer',
@@ -1836,6 +1876,7 @@ Eine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.',
'uploadnewversion-linktext' => 'Eine neue Version dieser Datei hochladen',
'shared-repo-from' => 'aus $1',
'shared-repo' => 'einem gemeinsam genutzten Medienarchiv',
+'filepage.css' => '/* Das folgende CSS wird auf Dateibeschreibungsseiten, auch auf fremden Client-Wikis, geladen. */',
# File reversion
'filerevert' => 'Zurücksetzen von „$1“',
@@ -1907,8 +1948,8 @@ Eine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.',
'statistics-edits' => 'Seitenbearbeitungen',
'statistics-edits-average' => 'Bearbeitungen pro Seite im Durchschnitt',
'statistics-views-total' => 'Seitenaufrufe gesamt',
+'statistics-views-total-desc' => 'Aufrufe nicht vorhandener Seiten und von Spezialseiten werden nicht berücksichtigt',
'statistics-views-peredit' => 'Seitenaufrufe pro Bearbeitung',
-'statistics-jobqueue' => 'Länge der [http://www.mediawiki.org/wiki/Manual:Job_queue Auftragswarteschlange]',
'statistics-users' => 'Registrierte [[Special:ListUsers|Benutzer]]',
'statistics-users-active' => 'Aktive Benutzer',
'statistics-users-active-desc' => 'Benutzer mit Bearbeitungen {{PLURAL:$1|in den letzten 24 Stunden|in den vergangenen $1 Tagen}}',
@@ -1924,7 +1965,7 @@ Links aus Namensräumen werden hier nicht aufgelistet.',
'doubleredirects' => 'Doppelte Weiterleitungen',
'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf weitere Weiterleitungen verlinken.
Jede Zeile enthält Links zu der ersten und zweiten Weiterleitung sowie das Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.
-<s>Durchgestrichene</s> Einträge wurden bereits erledigt.',
+<del>Durchgestrichene</del> Einträge wurden bereits erledigt.',
'double-redirect-fixed-move' => '[[$1]] wurde verschoben und leitet nun nach [[$2]] weiter.',
'double-redirect-fixer' => 'RedirectBot',
@@ -1947,6 +1988,8 @@ Jede Zeile enthält Links zu der ersten und zweiten Weiterleitung sowie das Ziel
'nmembers' => '{{PLURAL:$1|1 Eintrag|$1 Einträge}}',
'nrevisions' => '{{PLURAL:$1|1 Bearbeitung|$1 Bearbeitungen}}',
'nviews' => '{{PLURAL:$1|1 Abfrage|$1 Abfragen}}',
+'nimagelinks' => 'Verwendet auf $1 {{PLURAL:$1|Seite|Seiten}}',
+'ntransclusions' => 'verwendet auf $1 {{PLURAL:$1|Seite|Seiten}}',
'specialpage-empty' => 'Die Seite enthält aktuell keine Einträge.',
'lonelypages' => 'Verwaiste Seiten',
'lonelypagestext' => 'Die folgenden Seiten werden nicht eingebunden oder es wird nicht auf sie in {{SITENAME}} verwiesen.',
@@ -2051,7 +2094,7 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
'sp-deletedcontributions-contribs' => 'Benutzerbeiträge',
# Special:LinkSearch
-'linksearch' => 'Weblink-Suche',
+'linksearch' => 'Weblinksuche',
'linksearch-pat' => 'Suchmuster:',
'linksearch-ns' => 'Namensraum:',
'linksearch-ok' => 'Suchen',
@@ -2083,7 +2126,7 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
'newuserlog-autocreate-entry' => 'Benutzerkonto wurde automatisch erstellt',
# Special:ListGroupRights
-'listgrouprights' => 'Benutzergruppen-Rechte',
+'listgrouprights' => 'Benutzergruppenrechte',
'listgrouprights-summary' => 'Dies ist eine Liste der in diesem Wiki definierten Benutzergruppen und der damit verbundenen Rechte.
Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgrouprights-helppage}}|hier]] gefunden werden.',
'listgrouprights-key' => '* <span class="listgrouprights-granted">Gewährtes Recht</span>
@@ -2102,34 +2145,41 @@ Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgroup
'listgrouprights-removegroup-self-all' => 'Kann alle Gruppen vom eigenen Konto entfernen',
# E-mail user
-'mailnologin' => 'Fehler beim E-Mail-Versand',
-'mailnologintext' => 'Du musst [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in deinen [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
-'emailuser' => 'E-Mail an diesen Benutzer',
-'emailpage' => 'E-Mail an Benutzer',
-'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
+'mailnologin' => 'Fehler beim E-Mail-Versand',
+'mailnologintext' => 'Du musst [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in deinen [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
+'emailuser' => 'E-Mail an diesen Benutzer',
+'emailpage' => 'E-Mail an Benutzer',
+'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer dir antworten kann.',
-'usermailererror' => 'Das E-Mail-Objekt gab einen Fehler zurück:',
-'defemailsubject' => '{{SITENAME}}-E-Mail',
-'noemailtitle' => 'Keine E-Mail-Adresse',
-'noemailtext' => 'Dieser Benutzer hat keine gültige E-Mail-Adresse angegeben.',
-'nowikiemailtitle' => 'E-Mail-Versand nicht möglich',
-'nowikiemailtext' => 'Dieser Benutzer möchte keine E-Mails von anderen Benutzern erhalten.',
-'email-legend' => 'E-Mail an einen anderen {{SITENAME}}-Benutzer senden',
-'emailfrom' => 'Von:',
-'emailto' => 'An:',
-'emailsubject' => 'Betreff:',
-'emailmessage' => 'Nachricht:',
-'emailsend' => 'Senden',
-'emailccme' => 'Sende eine Kopie der E-Mail an mich',
-'emailccsubject' => 'Kopie deiner Nachricht an $1: $2',
-'emailsent' => 'E-Mail verschickt',
-'emailsenttext' => 'Deine E-Mail wurde verschickt.',
-'emailuserfooter' => 'Diese E-Mail wurde von {{SITENAME}}-Benutzer „$1“ an „$2“ gesendet.',
+'usermailererror' => 'Das E-Mail-Objekt gab einen Fehler zurück:',
+'defemailsubject' => '{{SITENAME}}-E-Mail',
+'usermaildisabled' => 'E-Mail-Empfang deaktiviert',
+'usermaildisabledtext' => 'Du kannst in diesem Wiki keine E-Mails an andere Benutzer senden',
+'noemailtitle' => 'Keine E-Mail-Adresse',
+'noemailtext' => 'Dieser Benutzer hat keine gültige E-Mail-Adresse angegeben.',
+'nowikiemailtitle' => 'E-Mail-Versand nicht möglich',
+'nowikiemailtext' => 'Dieser Benutzer möchte keine E-Mails von anderen Benutzern erhalten.',
+'email-legend' => 'E-Mail an einen anderen {{SITENAME}}-Benutzer senden',
+'emailfrom' => 'Von:',
+'emailto' => 'An:',
+'emailsubject' => 'Betreff:',
+'emailmessage' => 'Nachricht:',
+'emailsend' => 'Senden',
+'emailccme' => 'Sende eine Kopie der E-Mail an mich',
+'emailccsubject' => 'Kopie deiner Nachricht an $1: $2',
+'emailsent' => 'E-Mail verschickt',
+'emailsenttext' => 'Deine E-Mail wurde verschickt.',
+'emailuserfooter' => 'Diese E-Mail wurde von {{SITENAME}}-Benutzer „$1“ an „$2“ gesendet.',
+
+# User Messenger
+'usermessage-summary' => 'Systemnachricht gespeichert.',
+'usermessage-editor' => 'System-Messenger',
+'usermessage-template' => 'MediaWiki:Benutzernachricht',
# Watchlist
'watchlist' => 'Beobachtungsliste',
'mywatchlist' => 'Beobachtungsliste',
-'watchlistfor' => "(von '''$1''')",
+'watchlistfor2' => 'Von $1 $2',
'nowatchlist' => 'Du hast keine Einträge auf deiner Beobachtungsliste.',
'watchlistanontext' => 'Du musst dich $1, um deine Beobachtungsliste zu sehen oder Einträge auf ihr zu bearbeiten.',
'watchnologin' => 'Du bist nicht angemeldet',
@@ -2192,6 +2242,8 @@ Es werden dir solange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du
Dein freundliches {{SITENAME}}-Benachrichtigungssystem
--
+Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{fullurl:{{#special:Preferences}}}}
+
Um die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{fullurl:{{#special:Watchlist}}/edit}}
Um die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL
@@ -2242,7 +2294,10 @@ Die letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int
'revertpage' => 'Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht und letzte Version von [[User:$1|$1]] wiederhergestellt',
'revertpage-nouser' => 'Änderungen von (Benutzername entfernt) rückgängig gemacht und letzte Version von [[User:$1|$1]] wiederhergestellt',
'rollback-success' => 'Die Änderungen von $1 wurden rückgängig gemacht und die letzte Version von $2 wurde wiederhergestellt.',
-'sessionfailure' => 'Es gab ein Problem mit der Ãœbertragung deiner Benutzerdaten.
+
+# Edit tokens
+'sessionfailure-title' => 'Sitzungsfehler',
+'sessionfailure' => 'Es gab ein Problem mit der Ãœbertragung deiner Benutzerdaten.
Diese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.
Bitte gehe zurück und versuche den Vorgang erneut auszuführen.',
@@ -2329,7 +2384,7 @@ Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
'undeletebtn' => 'Wiederherstellen',
'undeletelink' => 'ansehen/wiederherstellen',
'undeleteviewlink' => 'ansehen',
-'undeletereset' => 'Abbrechen',
+'undeletereset' => 'Zurücksetzen',
'undeleteinvert' => 'Auswahl umkehren',
'undeletecomment' => 'Grund:',
'undeletedarticle' => 'hat „[[$1]]“ wiederhergestellt',
@@ -2371,18 +2426,22 @@ $1',
'month' => 'und Monat:',
'year' => 'bis Jahr:',
-'sp-contributions-newbies' => 'Zeige nur Beiträge neuer Benutzer',
-'sp-contributions-newbies-sub' => 'Für Neulinge',
-'sp-contributions-newbies-title' => 'Benutzerbeiträge von neuen Benutzern',
-'sp-contributions-blocklog' => 'Sperr-Logbuch',
-'sp-contributions-deleted' => 'Gelöschte Beiträge',
-'sp-contributions-logs' => 'Logbücher',
-'sp-contributions-talk' => 'Diskussion',
-'sp-contributions-userrights' => 'Benutzerrechteverwaltung',
-'sp-contributions-blocked-notice' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:',
-'sp-contributions-search' => 'Suche nach Benutzerbeiträgen',
-'sp-contributions-username' => 'IP-Adresse oder Benutzername:',
-'sp-contributions-submit' => 'Suchen',
+'sp-contributions-newbies' => 'Zeige nur Beiträge neuer Benutzer',
+'sp-contributions-newbies-sub' => 'Für Neulinge',
+'sp-contributions-newbies-title' => 'Benutzerbeiträge von neuen Benutzern',
+'sp-contributions-blocklog' => 'Sperr-Logbuch',
+'sp-contributions-deleted' => 'Gelöschte Beiträge',
+'sp-contributions-uploads' => 'Hochgeladene Dateien',
+'sp-contributions-logs' => 'Logbücher',
+'sp-contributions-talk' => 'Diskussion',
+'sp-contributions-userrights' => 'Benutzerrechteverwaltung',
+'sp-contributions-blocked-notice' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:',
+'sp-contributions-blocked-notice-anon' => 'Diese IP-Adresse ist zurzeit gesperrt.
+Zur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:',
+'sp-contributions-search' => 'Suche nach Benutzerbeiträgen',
+'sp-contributions-username' => 'IP-Adresse oder Benutzername:',
+'sp-contributions-toponly' => 'Nur aktuelle Versionen zeigen',
+'sp-contributions-submit' => 'Suchen',
# What links here
'whatlinkshere' => 'Links auf diese Seite',
@@ -2443,7 +2502,6 @@ Zur Aufhebung der Sperre siehe die [[Special:IPBlockList|Liste aller aktiven Spe
'ipb-edit-dropdown' => 'Sperrgründe bearbeiten',
'ipb-unblock-addr' => '„$1“ freigeben',
'ipb-unblock' => 'IP-Adresse/Benutzer freigeben',
-'ipb-blocklist-addr' => 'Aktuelle Sperre für „$1“ anzeigen',
'ipb-blocklist' => 'Alle aktuellen Sperren anzeigen',
'ipb-blocklist-contribs' => 'Benutzerbeiträge von „$1“',
'unblockip' => 'IP-Adresse freigeben',
@@ -2513,6 +2571,8 @@ Siehe die [[Special:IPBlockList|Liste der gesperrten IP-Adressen und Benutzernam
'sorbs_create_account_reason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.',
'cant-block-while-blocked' => 'Du kannst keine anderen Benutzer sperren, während du selbst gesperrt bist.',
'cant-see-hidden-user' => 'Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das „hideuser“-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.',
+'ipbblocked' => 'Du kannst keine anderen Benutzer sperren oder entsperren, da du selbst gesperrt bist',
+'ipbnounblockself' => 'Du hast nicht die Berechtigung, dich selbst zu entsperren',
# Developer tools
'lockdb' => 'Datenbank sperren',
@@ -2546,6 +2606,17 @@ Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du ein
'''Warnung!'''
Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
Du solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
+'movepagetext-noredirectfixer' => "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.
+Der alte Titel wird danach zum neuen weiterleiten.
+Stelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfst.
+Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
+
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist leer oder eine Weiterleitung ohne Versionsgeschichte.
+Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine Seite überschreiben.
+
+'''Warnung!'''
+Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
+Du solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
'movepagetalktext' => "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''
*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder
*du wählst die unten stehende Option ab.
@@ -2572,7 +2643,7 @@ Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung
'cantmove-titleprotected' => 'Die Verschiebung kann nicht durchgeführt werden, da der Zieltitel zur Erstellung gesperrt ist.',
'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussionsseite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleiche die Inhalte von Hand ab.',
'movedto' => 'verschoben nach',
-'movetalk' => 'Die Diskussionsseite mitverschieben, wenn möglich',
+'movetalk' => 'Sofern möglich die Diskussionsseite mitverschieben',
'move-subpages' => 'Unterseiten verschieben (bis zu $1)',
'move-talk-subpages' => 'Unterseiten der Diskussionsseite verschieben (bis zu $1)',
'movepage-page-exists' => 'Die Seite „$1“ ist bereits vorhanden und kann nicht automatisch überschrieben werden.',
@@ -2602,6 +2673,7 @@ Die Seite „[[:$1]]“ existiert bereits. Möchtest du diese löschen, um die S
'immobile-source-page' => 'Diese Seite ist nicht verschiebbar.',
'immobile-target-page' => 'Es kann nicht auf diese Zielseite verschoben werden.',
'imagenocrossnamespace' => 'Dateien können nicht aus dem {{ns:file}}-Namensraum heraus verschoben werden',
+'nonfile-cannot-move-to-file' => 'Nichtdateien können nicht in den {{ns:file}}-Namensraum hinein verschoben werden',
'imagetypemismatch' => 'Die neue Dateierweiterung ist nicht mit der alten identisch',
'imageinvalidfilename' => 'Der Ziel-Dateiname ist ungültig',
'fix-double-redirects' => 'Nach dem Verschieben alle Weiterleitungen auf die Ursprungsseite bereinigen',
@@ -2636,12 +2708,12 @@ Alternativ ist der Export auch mit der Syntax [[{{#Special:Export}}/{{MediaWiki:
'export-pagelinks' => 'Verlinkte Seiten automatisch mit exportieren, bis zur Rekursionstiefe von:',
# Namespace 8 related
-'allmessages' => 'MediaWiki-Systemtexte',
+'allmessages' => 'MediaWiki-Systemnachrichten',
'allmessagesname' => 'Name',
'allmessagesdefault' => 'Standardtext',
'allmessagescurrent' => 'Aktueller Text',
'allmessagestext' => 'Dies ist eine Liste der MediaWiki-Systemtexte.
-Besuche die Seiten [http://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [http://translatewiki.net translatewiki.net], wenn du dich an der Lokalisierung von MediaWiki beteiligen möchtest.',
+Bitte besuche die Seiten [http://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [http://translatewiki.net translatewiki.net], sofern du dich an der Lokalisierung von MediaWiki beteiligen möchtest.',
'allmessagesnotsupportedDB' => 'Diese Spezialseite steht nicht zur Verfügung, da sie über den Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.',
'allmessages-filter-legend' => 'Filter',
'allmessages-filter' => 'Filter für angepassten Zustand:',
@@ -2682,6 +2754,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
'importstart' => 'Importiere Seite …',
'import-revision-count' => '– {{PLURAL:$1|1 Version|$1 Versionen}}',
'importnopages' => 'Keine Seite zum Importieren vorhanden.',
+'imported-log-entries' => '$1 {{PLURAL:$1|lLogbucheintrag|Logbucheinträge}} importiert.',
'importfailed' => 'Import fehlgeschlagen: $1',
'importunknownsource' => 'Unbekannte Importquelle',
'importcantopen' => 'Importdatei konnte nicht geöffnet werden',
@@ -2774,6 +2847,8 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
'tooltip-upload' => 'Hochladen starten',
'tooltip-rollback' => 'Macht alle letzten Änderungen der Seite, die vom gleichen Benutzer vorgenommen worden sind, durch nur einen Klick rückgängig.',
'tooltip-undo' => 'Macht lediglich diese eine Änderung rückgängig und zeigt das Resultat in der Vorschau an, damit in der Zusammenfassungszeile eine Begründung angegeben werden kann.',
+'tooltip-preferences-save' => 'Einstellungen speichern',
+'tooltip-summary' => 'Gib eine kurze Zusammenfassung ein',
# Stylesheets
'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
@@ -2914,14 +2989,17 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
'imagemaxsize' => "Maximale Bildgröße:<br />''(für Dateibeschreibungsseiten)''",
'thumbsize' => 'Standardgröße der Vorschaubilder (Thumbnails):',
'widthheightpage' => '$1×$2, {{PLURAL:$3|1 Seite|$3 Seiten}}',
-'file-info' => '(Dateigröße: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Dateigröße: $3, MIME-Typ: $4)',
+'file-info' => 'Dateigröße: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Dateigröße: $3, MIME-Typ: $4',
'file-nohires' => '<small>Keine höhere Auflösung vorhanden.</small>',
-'svg-long-desc' => '(SVG-Datei, Basisgröße: $1 × $2 Pixel, Dateigröße: $3)',
+'svg-long-desc' => 'SVG-Datei, Basisgröße: $1 × $2 Pixel, Dateigröße: $3',
'show-big-image' => 'Version in höherer Auflösung',
'show-big-image-thumb' => '<small>Größe der Voransicht: $1 × $2 Pixel</small>',
'file-info-gif-looped' => 'Endlosschleife',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Bilder}}',
+'file-info-png-looped' => 'Endlosschleife',
+'file-info-png-repeat' => '$1-{{PLURAL:$1|mal|mal}} abgespielt',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Bild|Bilder}}',
# Special:NewFiles
'newimages' => 'Neue Dateien',
@@ -3074,6 +3152,7 @@ Darauf folgende Seitenlinks in derselben Zeile definieren Ausnahmen, in deren Ko
'exif-gpsareainformation' => 'Name des GPS-Gebietes',
'exif-gpsdatestamp' => 'GPS-Datum',
'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
+'exif-objectname' => 'Kurztitel',
# EXIF attributes
'exif-compression-1' => 'Unkomprimiert',
@@ -3233,25 +3312,25 @@ Darauf folgende Seitenlinks in derselben Zeile definieren Ausnahmen, in deren Ko
'limitall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'E-Mail-Adresse bestätigen (Authentifizierung)',
-'confirmemail_noemail' => 'Du hast keine gültige E-Mail-Adresse in deinen [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
-'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizieren), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem du diese Webseite in deinem Webbrowser öffnest, bestätigst du, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
-'confirmemail_pending' => 'Es wurde dir bereits ein Bestätigungscode per E-Mail zugeschickt.
+'confirmemail' => 'E-Mail-Adresse bestätigen (Authentifizierung)',
+'confirmemail_noemail' => 'Du hast keine gültige E-Mail-Adresse in deinen [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
+'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizieren), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem du diese Webseite in deinem Webbrowser öffnest, bestätigst du, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
+'confirmemail_pending' => 'Es wurde dir bereits ein Bestätigungscode per E-Mail zugeschickt.
Wenn du dein Benutzerkonto erst vor kurzem erstellt hast, warte bitte noch ein paar Minuten auf die E-Mail, bevor du einen neuen Code anforderst.',
-'confirmemail_send' => 'Bestätigungscode zuschicken',
-'confirmemail_sent' => 'Bestätigungs-E-Mail wurde verschickt.',
-'confirmemail_oncreate' => 'Ein Bestätigungs-Code wurde an deine E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
-'confirmemail_sendfailed' => '{{SITENAME}} konnte die Bestätigungs-E-Mail nicht an dich versenden.
+'confirmemail_send' => 'Bestätigungscode zuschicken',
+'confirmemail_sent' => 'Bestätigungs-E-Mail wurde verschickt.',
+'confirmemail_oncreate' => 'Ein Bestätigungs-Code wurde an deine E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
+'confirmemail_sendfailed' => '{{SITENAME}} konnte die Bestätigungs-E-Mail nicht an dich versenden.
Bitte prüfe die E-Mail-Adresse auf ungültige Zeichen.
Rückmeldung des Mailservers: $1',
-'confirmemail_invalid' => 'Ungültiger Bestätigungscode. Möglicherweise ist der Bestätigungszeitraum verstrichen. Versuche bitte, die Bestätigung zu wiederholen.',
-'confirmemail_needlogin' => 'Du musst dich $1, um deine E-Mail-Adresse zu bestätigen.',
-'confirmemail_success' => 'Deine E-Mail-Adresse wurde erfolgreich bestätigt. Du kannst dich jetzt [[Special:UserLogin|anmelden]].',
-'confirmemail_loggedin' => 'Deine E-Mail-Adresse wurde erfolgreich bestätigt.',
-'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung deiner E-Mail-Adresse.',
-'confirmemail_subject' => '[{{SITENAME}}] Bestätigung der E-Mail-Adresse',
-'confirmemail_body' => 'Hallo,
+'confirmemail_invalid' => 'Ungültiger Bestätigungscode. Möglicherweise ist der Bestätigungszeitraum verstrichen. Versuche bitte, die Bestätigung zu wiederholen.',
+'confirmemail_needlogin' => 'Du musst dich $1, um deine E-Mail-Adresse zu bestätigen.',
+'confirmemail_success' => 'Deine E-Mail-Adresse wurde erfolgreich bestätigt. Du kannst dich jetzt [[Special:UserLogin|anmelden]].',
+'confirmemail_loggedin' => 'Deine E-Mail-Adresse wurde erfolgreich bestätigt.',
+'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung deiner E-Mail-Adresse.',
+'confirmemail_subject' => '[{{SITENAME}}] Bestätigung der E-Mail-Adresse',
+'confirmemail_body' => 'Hallo,
jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto „$2“ in {{SITENAME}} registriert.
@@ -3267,8 +3346,36 @@ Wenn du das genannte Benutzerkonto *nicht* registriert hast, folge diesem Link,
$5
Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
-'confirmemail_invalidated' => 'E-Mail-Adressbestätigung abbrechen',
-'invalidateemail' => 'E-Mail-Adressbestätigung abbrechen',
+'confirmemail_body_changed' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
+hat die E-Mail-Adresse des Benutzerkontos „$2“ zu dieser Adresse auf {{SITENAME}} geändert.
+
+Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört
+und um die E-Mail-Features auf {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
+
+$3
+
+Falls das Konto *nicht* dir gehört, folge diesem Link,
+um die E-Mail-Adress-Bestätigung abzubrechen:
+
+$5
+
+Dieser Bestätigungscode ist gültig bis $4.',
+'confirmemail_body_set' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
+hat die E-Mail-Adresse des Benutzerkontos „$2“ auf {{SITENAME}} zu dieser E-Mail-Adresse abgeändert.
+
+Um zu bestätigen, dass dieses Benutzerkonto wirklich zu dir gehört
+und um die E-Mail-Funktionen auf {{SITENAME}} wieder zu aktivieren, öffne bitte den folgenden Link in deinem Browser:
+
+$3
+
+Falls das Konto *nicht* zu dir gehört, bitte den nachfolgenden Link öffnen,
+um die Bestätigung der E-Mail-Adresse abzubrechen:
+
+$5
+
+Dieser Bestätigungscode ist gültig bis $4.',
+'confirmemail_invalidated' => 'E-Mail-Adressbestätigung abbrechen',
+'invalidateemail' => 'E-Mail-Adressbestätigung abbrechen',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Einbindung ist deaktiviert]',
@@ -3313,6 +3420,7 @@ Bitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
'table_pager_first' => 'Erste Seite',
'table_pager_last' => 'Letzte Seite',
'table_pager_limit' => 'Zeige $1 Einträge pro Seite',
+'table_pager_limit_label' => 'Positionen pro Seite:',
'table_pager_limit_submit' => 'Los',
'table_pager_empty' => 'Keine Ergebnisse',
@@ -3382,18 +3490,26 @@ Du kannst auch die [[Special:Watchlist/edit|Standard-Bearbeitungsseite]] benutze
'version-specialpages' => 'Spezialseiten',
'version-parserhooks' => 'Parser-Hooks',
'version-variables' => 'Variablen',
+'version-skins' => 'Benutzeroberflächen',
'version-other' => 'Anderes',
-'version-mediahandlers' => 'Medien-Handler',
+'version-mediahandlers' => 'Mediennutzung',
'version-hooks' => "Schnittstellen ''(Hooks)''",
'version-extension-functions' => 'Funktionsaufrufe',
-'version-parser-extensiontags' => "Parser-Erweiterungen ''(tags)''",
-'version-parser-function-hooks' => 'Parser-Funktionen',
+'version-parser-extensiontags' => "Parsererweiterungen ''(tags)''",
+'version-parser-function-hooks' => 'Parserfunktionen',
'version-skin-extension-functions' => 'Benutzeroberflächen-Erweiterungs-Funktionen',
'version-hook-name' => 'Schnittstellenname',
'version-hook-subscribedby' => 'Aufruf von',
'version-version' => '(Version $1)',
'version-svn-revision' => '(Version $2)',
'version-license' => 'Lizenz',
+'version-poweredby-credits' => "Diese Website nutzt '''[http://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'andere',
+'version-license-info' => "MediaWiki ist freie Software, d. h. sie kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/ oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
+
+MediaWiki wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings OHNE JEGLICHE GARANTIE und sogar ohne die implizierte Garantie einer MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
+
+Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License''] sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html online gelesen] werden.",
'version-software' => 'Installierte Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
@@ -3407,7 +3523,7 @@ Du kannst auch die [[Special:Watchlist/edit|Standard-Bearbeitungsseite]] benutze
Die Eingabe muss ohne den Zusatz „{{ns:file}}:“ erfolgen.',
# Special:FileDuplicateSearch
-'fileduplicatesearch' => 'Datei-Duplikat-Suche',
+'fileduplicatesearch' => 'Dateiduplikatsuche',
'fileduplicatesearch-summary' => 'Suche nach Datei-Duplikaten auf Basis ihres Hash-Wertes.
Die Eingabe muss ohne den Zusatz „{{ns:file}}:“ erfolgen.',
@@ -3463,6 +3579,15 @@ Die Eingabe muss ohne den Zusatz „{{ns:file}}:“ erfolgen.',
'tags-edit' => 'bearbeiten',
'tags-hitcount' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
+# Special:ComparePages
+'comparepages' => 'Seiten vergleichen',
+'compare-selector' => 'Seitenversionen vergleichen',
+'compare-page1' => 'Seite 1',
+'compare-page2' => 'Seite 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Vergleichen',
+
# Database error messages
'dberr-header' => 'Dieses Wiki hat ein Problem',
'dberr-problems' => 'Entschuldigung. Diese Seite hat momentan technische Schwierigkeiten.',
@@ -3479,8 +3604,13 @@ Die Eingabe muss ohne den Zusatz „{{ns:file}}:“ erfolgen.',
'htmlform-float-invalid' => 'Der angegebene Wert ist keine Zahl.',
'htmlform-int-toolow' => 'Der angegebene Wert ist unter dem Minimum von $1',
'htmlform-int-toohigh' => 'Der angegebene Wert ist über dem Maximum von $1',
+'htmlform-required' => 'Dieser Wert wird benötigt',
'htmlform-submit' => 'Speichern',
'htmlform-reset' => 'Änderungen rückgängig machen',
'htmlform-selectorother-other' => 'Andere',
+# SQLite database support
+'sqlite-has-fts' => 'Version $1 mit Unterstützung für die Volltextsuche',
+'sqlite-no-fts' => 'Version $1 ohne Unterstützung für die Volltextsuche',
+
);
diff --git a/languages/messages/MessagesDe_at.php b/languages/messages/MessagesDe_at.php
index 7dde115c..cf91692a 100644
--- a/languages/messages/MessagesDe_at.php
+++ b/languages/messages/MessagesDe_at.php
@@ -10,6 +10,7 @@
* @author Laximilian scoken
* @author Mucalexx
* @author Revolus
+ * @author Wdwd
* @author ✓
*/
@@ -18,7 +19,7 @@ $fallback = 'de';
$messages = array(
# Dates
'january' => 'Jänner',
-'february' => 'Feber',
+'february' => 'Februar',
'december' => 'Dezember',
'january-gen' => 'Jänners',
'february-gen' => 'Febers',
diff --git a/languages/messages/MessagesDe_ch.php b/languages/messages/MessagesDe_ch.php
index 8fc373e8..36328c91 100644
--- a/languages/messages/MessagesDe_ch.php
+++ b/languages/messages/MessagesDe_ch.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Kghbln
* @author MichaelFrey
* @author SVG
* @author The Evil IP address
@@ -28,9 +29,7 @@ Bitte versuche es in ein paar Minuten erneut.',
'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschliessen, musst du jetzt ein neues Passwort wählen.',
# Edit pages
-'longpagewarning' => "'''Warnung:''' Diese Seite ist $1 KB gross; einige Browser könnten Probleme haben, Seiten zu bearbeiten, die grösser als 32 KB sind.
-Überlege bitte, ob eine Aufteilung der Seite in kleinere Abschnitte möglich ist.",
-'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist $1 KB gross. Dies ist grösser als das erlaubte Maximum von $2 KB.'''
+'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist $1 KB gross. Dies ist grösser als das erlaubte Maximum von $2 KB.'''
Er kann nicht gespeichert werden.",
# Parser/template warnings
@@ -59,6 +58,7 @@ Er kann nicht gespeichert werden.",
'right-override-export-depth' => 'Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5',
# Upload
+'file-too-large' => 'Die übertragene Datei ist zu gross',
'large-file' => 'Die Dateigrösse sollte nach Möglichkeit $1 nicht überschreiten. Diese Datei ist $2 gross.',
'largefileserver' => 'Die Datei ist grösser als die vom Server eingestellte Maximalgrösse.',
'fileexists-extension' => "Eine Datei mit ähnlichem Namen existiert bereits: [[$2|thumb]]
@@ -94,17 +94,7 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
'maximum-size' => 'Maximalgrösse:',
# Block/unblock
-'ipbreason-dropdown' => '* Allgemeine Sperrgründe
-** Löschen von Seiten
-** Einstellen unsinniger Seiten
-** Fortgesetzte Verstösse gegen die Richtlinien für Weblinks
-** Verstoss gegen den Grundsatz „Keine persönlichen Angriffe“
-* Benutzerspezifische Sperrgründe
-** Ungeeigneter Benutzername
-** Neuanmeldung eines unbeschränkt gesperrten Benutzers
-* IP-spezifische Sperrgründe
-** Proxy, wegen Vandalismus einzelner Benutzer längerfristig gesperrt',
-'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.',
+'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.',
# Thumbnails
'thumbnail-more' => 'vergrössern',
@@ -117,8 +107,9 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
# Media information
'imagemaxsize' => "Maximale Bildgrösse:<br />''(für Dateibeschreibungsseiten)''",
'thumbsize' => 'Standardgrösse der Vorschaubilder (Thumbnails):',
-'file-info' => '(Dateigrösse: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Dateigrösse: $3, MIME-Typ: $4)',
+'file-info' => 'Dateigrösse: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Dateigrösse: $3, MIME-Typ: $4',
+'svg-long-desc' => 'SVG-Datei, Basisgrösse: $1 × $2 Pixel, Dateigrösse: $3',
'show-big-image-thumb' => '<small>Grösse der Voransicht: $1 × $2 Pixel</small>',
# Metadata
@@ -143,6 +134,13 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
'exif-lightsource-14' => 'Kaltweiss fluoreszierend (W 3900–4500 K)',
'exif-lightsource-15' => 'Weiss fluoreszierend (WW 3200–3700 K)',
+# Special:Version
+'version-license-info' => "MediaWiki ist freie Software, d. h. sie kann, gemäss den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/ oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
+
+MediaWiki wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings OHNE JEGLICHE GARANTIE und sogar ohne die implizierte Garantie einer MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
+
+Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License''] sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html online gelesen] werden.",
+
# Special:FileDuplicateSearch
'fileduplicatesearch-info' => '$1 × $2 Pixel<br />Dateigrösse: $3<br />MIME-Typ: $4',
diff --git a/languages/messages/MessagesDe_formal.php b/languages/messages/MessagesDe_formal.php
index 3d30f038..0d20961a 100644
--- a/languages/messages/MessagesDe_formal.php
+++ b/languages/messages/MessagesDe_formal.php
@@ -138,7 +138,7 @@ Möglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein ne
'anoneditwarning' => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie speichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
'missingsummary' => "'''Hinweis:''' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
'missingcommenttext' => 'Ihr Abschnitt enthält keinen Text.',
-'missingcommentheader' => "'''ACHTUNG:''' Sie haben keine Überschrift im Feld „Betreff:“ eingegeben. Wenn Sie erneut auf „Seite speichern“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
+'missingcommentheader' => "'''Achtung:''' Sie haben kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
'blockedtext' => "'''Ihr Benutzername oder Ihre IP-Adresse wurde gesperrt.'''
Die Sperrung wurde von $1 durchgeführt.
@@ -191,7 +191,11 @@ oder in den zugehörigen <span class="plainlinks">[{{fullurl:{{#special:Log}}|pa
'''Es wurde noch nicht gespeichert!'''",
'userjspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau Ihres Benutzer-JavaScript betrachten.'''
'''Es wurde noch nicht gespeichert!'''",
-'userinvalidcssjstitle' => "'''Warnung:''' Es existiert kein Skin „$1“. Bitte bedenken Sie, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also z.B. ''{{ns:user}}:Mustermann/monobook.css'' an Stelle von ''{{ns:user}}:Mustermann/Monobook.css''.",
+'sitecsspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau dieses CSS betrachten.'''
+'''Es wurde noch nicht gespeichert!'''",
+'sitejspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau dieses JavaScript betrachten.'''
+'''Es wurde noch nicht gespeichert!'''",
+'userinvalidcssjstitle' => "'''Achtung:''' Die Benutzeroberfläche „$1“ existiert nicht. Bedenken Sie, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn Sie jetzt speichern.',
'session_fail_preview' => "'''Ihre Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
Bitte versuchen Sie es erneut, indem Sie unter der folgenden Textvorschau nochmals auf „Seite speichern“ klicken.
@@ -220,8 +224,6 @@ Reichen Sie keine Texte ein, falls Sie nicht wollen, dass diese ohne Einschränk
Sie bestätigen hiermit auch, dass Sie diese Texte selbst geschrieben haben oder diese von einer gemeinfreien Quelle kopiert haben
(siehe $1 für weitere Details). '''ÜBERTRAGEN SIE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
-'longpagewarning' => "'''Warnung:''' Diese Seite ist $1 kB groß; einige Browser könnten Probleme haben, Seiten zu bearbeiten, die größer als 32 kB sind.
-Überlegen Sie bitte, ob eine Aufteilung der Seite in kleinere Abschnitte möglich ist.",
'longpageerror' => "'''Fehler: Der Text, den Sie zu speichern versuchen, ist $1 KB groß. Dies ist größer als das erlaubte Maximum von $2 KB.'''
Er kann nicht gespeichert werden.",
'readonlywarning' => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass Ihre Änderungen derzeit nicht gespeichert werden können.
@@ -360,6 +362,7 @@ Wenn Sie diese Datei trotzdem hochladen möchten, gehen Sie bitte zurück und ä
[[File:$1|thumb|center|$1]]',
'file-deleted-duplicate' => 'Eine mit dieser identische Datei ([[:$1]]) wurde früher gelöscht. Sehen Sie das Lösch-Logbuch ein, bevor Sie sie hochladen.',
'uploadwarning-text' => 'Bitte ändern Sie unten die Dateibeschreibung und versuchen Sie es erneut.',
+'uploadfromurl-queued' => 'Ihr Upload befindet sich nun in der Warteschlange.',
'php-uploaddisabledtext' => 'Das Hochladen von Dateien wurde in PHP deaktiviert.
Bitte überprüfen Sie die <code>file_uploads</code>-Einstellung.',
'filewasdeleted' => 'Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfen Sie zuerst den Eintrag im $1, bevor Sie die Datei wirklich speichern.',
@@ -454,7 +457,9 @@ Es werden Ihnen solange keine weiteren Benachrichtigungs-E-Mails gesendet, bis S
Das freundliche {{SITENAME}}-Benachrichtigungssystem
--
-Um die Einstellungen Ihrer Beobachtungsliste anzupassen, besuchen Sie: {{fullurl:{{#special:Watchlist}}/edit}}
+Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuchen Sie {{fullurl:{{#special:Preferences}}}}
+
+Um die Einstellungen Ihrer Beobachtungsliste anzupassen, besuchen Sie {{fullurl:{{#special:Watchlist}}/edit}}
Um diese Seite von Ihrer Beobachtungsliste zu entfernen, besuchen Sie $UNWATCHURL
@@ -465,7 +470,7 @@ Rückmeldungen und weitere Hilfe: {{fullurl:{{MediaWiki:Helppage}}}}',
'confirmdeletetext' => 'Sie sind dabei, eine Seite mit allen zugehörigen älteren Versionen zu löschen. Bitte bestätigen Sie, dass Sie sich der Konsequenzen bewusst sind, und dass Sie in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] handeln.',
'deletedtext' => '„<nowiki>$1</nowiki>“ wurde gelöscht. Im $2 finden Sie eine Liste der letzten Löschungen.',
-# Rollback
+# Edit tokens
'sessionfailure' => 'Es gab ein Problem mit der Ãœbertragung Ihrer Benutzerdaten.
Diese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung Ihrer Änderungen zu einem anderen Benutzer zu verhindern.
Bitte gehen Sie zurück und versuchen Sie den Vorgang erneut auszuführen.',
@@ -501,13 +506,15 @@ Bitte geben Sie den Grund für die Sperre an.',
'proxyblockreason' => 'Ihre IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktieren Sie Ihren Internet-Provider oder Ihre Systemadministratoren und informieren Sie sie über dieses mögliche Sicherheitsproblem.',
'cant-block-while-blocked' => 'Sie können keine anderen Benutzer sperren, während Sie selbst gesperrt sind.',
'cant-see-hidden-user' => 'Der Benutzer, den Sie versuchen zu sperren, wurde bereits gesperrt und verborgen. Da Sie das „hideuser“-Recht nicht haben, können Sie die Benutzersperre nicht sehen und nicht bearbeiten.',
+'ipbblocked' => 'Sie können keine anderen Benutzer sperren oder entsperren, da Sie selbst gesperrt sind',
+'ipbnounblockself' => 'Sie haben nicht die Berechtigung, sich selbst zu entsperren',
# Developer tools
'locknoconfirm' => 'Sie haben das Bestätigungsfeld nicht markiert.',
'lockdbsuccesstext' => 'Die {{SITENAME}}-Datenbank wurde gesperrt.<br />Bitte geben Sie die Datenbank [[Special:UnlockDB|wieder frei]], sobald die Wartung abgeschlossen ist.',
# Move page
-'movepagetext' => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
+'movepagetext' => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
Der alte Titel wird danach zum neuen weiterleiten.
Sie können Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.
Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfen.
@@ -519,26 +526,37 @@ Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie
'''Warnung!'''
Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
Sie sollten daher die Konsequenzen verstanden haben, bevor Sie jetzt fortfahren.",
-'movepagetalktext' => "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''
+'movepagetext-noredirectfixer' => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
+Der alte Titel wird danach zum neuen weiterleiten.
+Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfen.
+Sie sind dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
+
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist leer oder eine Weiterleitung ohne Versionsgeschichte.
+Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine Seite überschreiben.
+
+'''Warnung!'''
+Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
+Sie sollten daher die Konsequenzen verstanden haben, bevor Sie jetzt fortfahren.",
+'movepagetalktext' => "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''
*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder
*Sie wählen die unten stehende Option ab.
In diesen Fällen müssen Sie, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.
Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
-'moveuserpage-warning' => "'''Warnung:''' Sie sind dabei, eine Benutzerseite zu verschieben. Bitte bedenken Sie, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
-'movenologin' => 'Sie sind nicht angemeldet',
-'movenologintext' => 'Sie müssen ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.',
-'movenotallowed' => 'Sie haben keine Berechtigung, Seiten zu verschieben.',
-'movenotallowedfile' => 'Sie haben keine Berechtigung, Dateien zu verschieben.',
-'cant-move-user-page' => 'Sie haben keine Berechtigung, Benutzerhauptseiten zu verschieben.',
-'cant-move-to-user-page' => 'Sie haben nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).',
-'articleexists' => 'Unter diesem Namen existiert bereits eine Seite. Bitte wählen Sie einen anderen Namen.',
-'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussionsseite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
-'delete_and_move_text' => '== Löschung erforderlich ==
+'moveuserpage-warning' => "'''Warnung:''' Sie sind dabei, eine Benutzerseite zu verschieben. Bitte bedenken Sie, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+'movenologin' => 'Sie sind nicht angemeldet',
+'movenologintext' => 'Sie müssen ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.',
+'movenotallowed' => 'Sie haben keine Berechtigung, Seiten zu verschieben.',
+'movenotallowedfile' => 'Sie haben keine Berechtigung, Dateien zu verschieben.',
+'cant-move-user-page' => 'Sie haben keine Berechtigung, Benutzerhauptseiten zu verschieben.',
+'cant-move-to-user-page' => 'Sie haben nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).',
+'articleexists' => 'Unter diesem Namen existiert bereits eine Seite. Bitte wählen Sie einen anderen Namen.',
+'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussionsseite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
+'delete_and_move_text' => '== Löschung erforderlich ==
Die Seite „[[:$1]]“ existiert bereits. Möchten Sie diese löschen, um die Seite verschieben zu können?',
-'file-exists-sharedrepo' => 'Der gewählte Dateiname wird bereits in einem gemeinsam genutzten Repositorium verwendet.
+'file-exists-sharedrepo' => 'Der gewählte Dateiname wird bereits in einem gemeinsam genutzten Repositorium verwendet.
Bitte wählen Sie einen anderen Namen.',
# Export
@@ -551,7 +569,7 @@ Alternativ ist der Export auch mit der Syntax [[{{#Special:Export}}/{{MediaWiki:
# Namespace 8 related
'allmessagestext' => 'Dies ist eine Liste der MediaWiki-Systemtexte.
-Besuchen Sie die Seiten [http://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [http://translatewiki.net translatewiki.net], wenn Sie sich an der Lokalisierung von MediaWiki beteiligen möchten.',
+Bitte besuchen Sie die Seiten [http://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [http://translatewiki.net translatewiki.net], sofern Sie sich an der Lokalisierung von MediaWiki beteiligen möchten.',
# Special:Import
'import-interwiki-text' => 'Wählen Sie ein Wiki und eine Seite zum Importieren aus.
@@ -614,6 +632,20 @@ Wenn Sie das genannte Benutzerkonto *nicht* registriert haben, folgen Sie diesem
$5
Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
+'confirmemail_body_set' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst,
+hat die E-Mail-Adresse des Benutzerkontos „$2“ auf {{SITENAME}} zu dieser E-Mail-Adresse abgeändert.
+
+Um zu bestätigen, dass dieses Benutzerkonto wirklich zu Ihnen gehört
+und um die E-Mail-Funktionen auf {{SITENAME}} wieder zu aktivieren, öffnen Sie bitte den folgenden Link in Ihrem Browser:
+
+$3
+
+Falls das Konto *nicht* zu Ihnen gehört, bitte den nachfolgenden Link öffnen,
+um die Bestätigung der E-Mail-Adresse abzubrechen:
+
+$5
+
+Dieser Bestätigungscode ist gültig bis $4.',
# Delete conflict
'deletedwhileediting' => 'Achtung: Diese Seite wurde gelöscht, nachdem Sie angefangen haben sie zu bearbeiten!
diff --git a/languages/messages/MessagesDiq.php b/languages/messages/MessagesDiq.php
index bc20abb3..723e8f91 100644
--- a/languages/messages/MessagesDiq.php
+++ b/languages/messages/MessagesDiq.php
@@ -30,8 +30,7 @@ $messages = array(
'tog-editsection' => 'Vurnayışê qısımi be gıreyanê [bıvurne] ra feal ke',
'tog-editsectiononrightclick' => 'Qısıman be tıknayışê serrêze ra ebe gocega raşte bıvurne (JavaScript lazımo)',
'tog-showtoc' => 'Tabloyê tedeesteyan bımocne (de pelanê be hirê sernuşteyan ra vêşêri de)',
-'tog-rememberpassword' => 'Parola mı bia xo viri',
-'tog-editwidth' => 'Warey nuştey hera ke, ke verıniya pela cıdayışê nuştey tam baso',
+'tog-rememberpassword' => 'Parola mı nê cıgeyraoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}}).',
'tog-watchcreations' => 'Pelê ke mı afernayê, lista mına seyrkerdışi ke',
'tog-watchdefault' => 'Pelê ke mı vurnayê, lista mına seyrkerdışi ke',
'tog-watchmoves' => 'Pelê ke mı kırışnayê, lista mına seyrkerdışi ke',
@@ -177,31 +176,21 @@ $messages = array(
'faqpage' => 'Project: PZP',
# Vector skin
-'vector-action-addsection' => 'Qal berze cı',
-'vector-action-delete' => 'Bestere',
-'vector-action-move' => 'Bere',
-'vector-action-protect' => 'Bıpawe',
-'vector-action-undelete' => 'Esterıtışi peyser bıgê',
-'vector-action-unprotect' => 'Ake',
-'vector-namespace-category' => 'Kategoriye',
-'vector-namespace-help' => 'Pela peşti (yardımi)',
-'vector-namespace-image' => 'Dosya',
-'vector-namespace-main' => 'Pele',
-'vector-namespace-media' => 'Pela medya',
-'vector-namespace-mediawiki' => 'Mesac',
-'vector-namespace-project' => 'Pela procey',
-'vector-namespace-special' => 'Pela xase',
-'vector-namespace-talk' => 'Werênayış',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Pela karberi',
-'vector-view-create' => 'Vıraze',
-'vector-view-edit' => 'Bıvurne',
-'vector-view-history' => 'Tarixi bımocne',
-'vector-view-view' => 'Bıwane',
-'vector-view-viewsource' => 'Çımey bıvêne',
-'actions' => 'Karê kerdey',
-'namespaces' => 'Cayê namey',
-'variants' => 'Varyanti',
+'vector-action-addsection' => 'Qal berze cı',
+'vector-action-delete' => 'Bestere',
+'vector-action-move' => 'Bere',
+'vector-action-protect' => 'Bıpawe',
+'vector-action-undelete' => 'Esterıtışi peyser bıgê',
+'vector-action-unprotect' => 'Ake',
+'vector-simplesearch-preference' => 'Tewsiyanê cıgeyrayışiê raverberdeyan ake (Tenya vector skin de)',
+'vector-view-create' => 'Vıraze',
+'vector-view-edit' => 'Bıvurne',
+'vector-view-history' => 'Tarixi bımocne',
+'vector-view-view' => 'Bıwane',
+'vector-view-viewsource' => 'Çımey bıvêne',
+'actions' => 'Karê kerdey',
+'namespaces' => 'Cayê namey',
+'variants' => 'Varyanti',
'errorpagetitle' => 'Xeta',
'returnto' => 'Peyser ÅŸo $1.',
@@ -262,6 +251,9 @@ Hedê xo ra zêde karberi kenê ke seyrê na pele bıkerê.
Şıma rê zehmet, tenê vınderên, heta ke reyna kenê ke ena pele kewê.
$1',
+'pool-timeout' => 'Kılitbiyayışi sero wextê vınetışi',
+'pool-queuefull' => 'Rêza hewze pırra',
+'pool-errorunknown' => 'Xeta nêzanıtiye',
# 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' => 'Heqa {{SITENAME}} de',
@@ -429,7 +421,7 @@ Hesabê şıma biyo a.
'yourname' => 'Namey karberi',
'yourpassword' => 'Parola',
'yourpasswordagain' => 'Parola reyna bınusne:',
-'remembermypassword' => 'Na/In komputer de mı biya xo viri',
+'remembermypassword' => 'Parola mı biya xo viri (heta $1 {{PLURAL:$1|roc|roci}}).',
'yourdomainname' => 'Nameyê şıma yo meydani',
'externaldberror' => 'Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.',
'login' => 'Cıkewe',
@@ -446,6 +438,7 @@ Hesabê şıma biyo a.
'gotaccount' => "Hesabê şıma esto? '''$1'''.",
'gotaccountlink' => 'Cıkewe',
'createaccountmail' => 'mı rê e-mail sera parola bırışe',
+'createaccountreason' => 'Sebeb:',
'badretype' => 'Parolayê ke şıma nuşti yewbini nêtepışneni.',
'userexists' => 'No name ey yewna teno, yewna name bınuse.',
'loginerror' => 'Xetayê hesab ekerdışi',
@@ -556,10 +549,12 @@ Bıne vındere u newe ra dest pê bıkere.',
'showlivepreview' => 'Live preview',
'showdiff' => 'Vurnayışan bımocne',
'anoneditwarning' => 'Teme!: Şıma bı hesabê xo nıkewtê cı. Hurêndiya namey şıma dı IP-adresa şıma qeyd bena u asena.',
+'anonpreviewwarning' => "''Ti hama nicikewte. Qeyd kerdiş zerre tarixê pele de adresê IP yê tu keyd keno.''",
'missingsummary' => "'''DİQET:''' Şıma kılmnuşte nıkerd.
Eke şıma reyna butonê qaydker ser a ne pel bê kılmnuşte qayd beno.",
'missingcommenttext' => 'Cêr de yew xulasa binuse.',
-'missingcommentheader' => "'''Vir ardoğ:''' Şıma qey na mesela sername nuşte nênuşt eke şıma reyna buton3e qayd ker bıtıkni pel bê sername qayd beno.",
+'missingcommentheader' => "Vir ardoğ:''' Şıma qey na mesela sername nuşte nênuşt.
+Eke şıma reyna \"{{int:savearticle}}\" qayd ker bıtıkni pel bê sername qayd beno.",
'summary-preview' => 'Verqeydê qıssa:',
'subject-preview' => 'Mesela/Sername verqayd seyr kerdış:',
'blockedtitle' => 'Karber (eza) blok biyo',
@@ -628,7 +623,8 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
'userjsyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
'usercsspreview' => "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
'userjspreview' => "'''şıma tena test keni ya ziverqayn seyr keni - karberê JavaScript'i hema qayd nebiyo.'''",
-'userinvalidcssjstitle' => "''Hişyari:''' \"\$1\" no name de yew tema çino. tema- nameyê ey.css u .js ney dosyayi gani pê herfa hurdiye bınusiye , yani {{ns:user}}:bıngeh/'''M'''onobook.css ney, {{ns:user}}:bıngeh/'''m'''onobook.css.",
+'userinvalidcssjstitle' => "'''Teme:''' Mewzuyê \"\$1\" çıniyo.
+Dosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
'updated' => '(Biyo rocane)',
'note' => "'''Not:'''",
'previewnote' => "'''Teme! ena teyna verqeyda.'''
@@ -662,7 +658,6 @@ 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).',
-'longpagewarning' => "'''DİQET: Gırdêyê no pel $1 kilobayto; tayê browsers 32 kb u zêdê ney gırdêyan de rey rey xeta keno. No sebeb ra pel qısm qısm kere.'''",
'longpageerror' => "'''XETA: Dergêyê nuşteyi şıma benate (mabeynê) $1 kilobyte, u $2 kilobyte ra zêdo.
Qayd biyayişê ey mumkin niyo..'''",
'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'''
@@ -838,6 +833,8 @@ $1",
'logdelete-failure' => "'''Esayişê rocaneyi eyar nêbı:'''
$1",
'revdel-restore' => 'asayışi bıvurne',
+'revdel-restore-deleted' => 'revizyonê wedariyaye',
+'revdel-restore-visible' => 'revizyonanê esani',
'pagehist' => 'vere cûyê peli',
'deletedhist' => 'tarixê hewna şiyaye',
'revdelete-content' => 'mebhes',
@@ -942,6 +939,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
'searchprofile-everything-tooltip' => 'Tedeestey hemine cı geyre (pelanê mınaqeşey zi tey)',
'searchprofile-advanced-tooltip' => 'qe cayê nimeyî bigêre',
'search-result-size' => '$1 ({{PLURAL:$2|1 çekuye|$2 çekuy}})',
+'search-result-category-size' => '{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 ketegoriyê bini|$2 kategiryanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})',
'search-result-score' => 'Eleqa: $1%',
'search-redirect' => '(ber $1)',
'search-section' => '(qısmê $1)',
@@ -1050,6 +1048,7 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
'prefs-files' => 'Dosyey',
'prefs-custom-css' => 'CSSê xasi',
'prefs-custom-js' => 'JSê xasi',
+'prefs-common-css-js' => 'CSS/JavaScript pê şablonanê peran de pay biya:',
'prefs-reset-intro' => 'ena pele de şıma tercihanê xo şenê bıçarnê be tercihanê keyepelê ke verê coy eyar biy.
Na game tepeya nêerziyena.',
'prefs-emailconfirm-label' => 'Konfirmasyonê e-maili',
@@ -1087,7 +1086,7 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
'prefs-advancedrendering' => 'Tercihê raverberdey',
'prefs-advancedsearchoptions' => 'Tercihê raverberdey',
'prefs-advancedwatchlist' => 'Tercihê raverberdey',
-'prefs-display' => 'Tercihan bımocne',
+'prefs-displayrc' => 'Tercihan bımocne',
'prefs-diffs' => 'Diffs',
# User rights
@@ -1173,6 +1172,7 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
'right-hideuser' => 'Yew namey karberi şari ra dızdeni/miyanki bloke bıke',
'right-ipblock-exempt' => 'Blokanê IPi, oto-blokan u blokanê menzıli ra ravêre',
'right-proxyunbannable' => 'Blokanê otomatikiê proksiyan ra ravêre',
+'right-unblockself' => 'Inan a bike',
'right-protect' => 'Sewiyanê pawıtışi (mıhafezey) bıvurne u pelanê kılitbiyaiyan sero bıgureye.',
'right-editprotected' => 'Pelanê pawıtiyan sero bıgureye (bê pawıtena kaskadi (game be game))',
'right-editinterface' => 'Interfaceê karberi sero bıgureye',
@@ -1195,7 +1195,6 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
'right-siteadmin' => 'Database kilit bike u a bike',
'right-reset-passwords' => 'Parolayê karberanê binî reset bike',
'right-override-export-depth' => 'Peleyanê ke tede linkanê 5 ra zafyer estê ay export bike',
-'right-versiondetail' => 'Enformasyonê versiyonê software yê detayî bimocne',
'right-sendemail' => 'Karberanê binî ra e-mail bişirav',
# User rights log
@@ -1246,14 +1245,9 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
'recentchanges-legend' => 'Tercihê vurnayışanê peniyan',
'recentchangestext' => 'eno pele de ser wîkî de vurnayîşî penîyî teqib bike',
'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
-'recentchanges-label-legend' => 'NiÅŸan: $1.',
-'recentchanges-legend-newpage' => '$1 - pela newi',
'recentchanges-label-newpage' => 'Ena edît yew pela newî viraşt',
-'recentchanges-legend-minor' => '$1 - vurnayışo qıckek',
'recentchanges-label-minor' => 'Eno yew edîto qickek o',
-'recentchanges-legend-bot' => '$1 - vurnayışê boti',
'recentchanges-label-bot' => 'Eno vurnayış terefê yew boti ra vıraziyo',
-'recentchanges-legend-unpatrolled' => '$1 - edîto patrol nibiyo',
'recentchanges-label-unpatrolled' => 'Eno edît patrol nibiyo',
'rcnote' => "Bıni dı {{PLURAL:$1|is '''1''' vurnayış|peni '''$1''' vurnayışan estê}} {{PLURAL:$2|roc|'''$2''' roci}}, hetani $5, $4.",
'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver (heta '''$1''' mucnayiyo).",
@@ -1300,6 +1294,9 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
'upload_directory_missing' => 'Direktorê dosyayê ($1)î biyo vînî u webserver de nieşkeno viraziye.',
'upload_directory_read_only' => 'Direktorê dosyayê ($1)î webserver de nieşkeno binuse.',
'uploaderror' => 'Ğeletê bar kerdişî',
+'upload-recreate-warning' => "'''Diqet: Yew dosya pê ena name wedariya ya zi vurniya.'''
+
+Logê wedariyayiş u berdişi seba ena pele a ti ra xezir kerda:",
'uploadtext' => "Qey barkerdişê dosyayî, formê cêrinî bişuxulne.
Dosyayê ke vera cû bar biyê eke şima qayîl e ney dosyayan bivînê ya zî bigerî biewnê[[Special:FileList|listeyê dosyayê bar bîyaye]] (tekrar) bar bîyaye [[Special:Log/upload|rocaneyê barkerdişî]] de, hewn a şîyaye zî tîya de [[Special:Log/delete|rocaneyê hewn a kerdişî]] pawiyene.
@@ -1331,6 +1328,17 @@ wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişux
'filetype-unwanted-type' => "'''\".\$1\"''' na tewırê dosyayi nêwazyena. pêşniyaz biyaye {{PLURAL:\$3|tewırê dosyayi|tewırê dosyayi}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' na tewırê dosyayi re destur çino. nê tewıran de destur esto {{PLURAL:\$3|tewırê dosyayi|tewırê dosyayi}} \$2.",
'filetype-missing' => 'Ena dosya de extention (ze ".jpg") çini yo.',
+'empty-file' => 'Dosya ke ti ÅŸawit veng biy.',
+'file-too-large' => 'Dosya ke ti ÅŸawit zaf gird biy.',
+'filename-tooshort' => 'Namayê dosyayi zaf kilm a.',
+'filetype-banned' => 'Tipê ena dosya qedexe biya.',
+'verification-error' => 'Ena dosya taramayê dosyayi temam nikena.',
+'hookaborted' => 'Vurnayişê tu ke ti deneme kerd pê yew extensiyon ra iptal biya.',
+'illegal-filename' => 'Ena nameyê dosyayi kebul nibena.',
+'overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
+'unknown-error' => 'Yew xeteyê nizanyeni biya.',
+'tmp-create-error' => 'Yew dosyayê gecici niviraziyeya.',
+'tmp-write-error' => 'Dosyayê gecici de xeta biya.',
'large-file' => 'gırdîyê dosyayan re, na gırdî $1 ra wet pêşniyazi çino;
gırdîyê na dosyayi $2.',
'largefileserver' => 'Ena dosya zaf girde ke server kebul nikeno.',
@@ -1356,13 +1364,14 @@ eke şıma hhene zi qayili dosyaya xo bar keri ager3e u newe yew name bışuxuln
'file-exists-duplicate' => 'Ena pel yew kopyayê ena {{PLURAL:$1|pel|pelan}} o:',
'file-deleted-duplicate' => 'Jû dosya be zey na dosya ([[:$1]]) verê coy esteriyawa.
Semedê ancia barkerdışi dewamkerdış ra ver tarixê esterışê dosya gani qontrol kerê.',
-'successfulupload' => 'bar biyo',
'uploadwarning' => 'Îkazê bar kerdişî',
'uploadwarning-text' => 'Bînê de deskripyonê dosyayî bivurne u reyna qeyd bike.',
'savefile' => 'Dosya qeyd ke',
'uploadedimage' => '"[[$1]]" bar bi',
'overwroteimage' => 'yew versiyonê newvî ye "[[$1]]"î bar bike',
'uploaddisabled' => 'bar kerdişî iptal biyo',
+'copyuploaddisabled' => 'URL bar kerdiÅŸ kefiliyeyo.',
+'uploadfromurl-queued' => 'Bar kerdişê tu ha sira de vindeno.',
'uploaddisabledtext' => 'Bar kerdişê dosyayî iptal biyo',
'php-uploaddisabledtext' => 'barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.',
'uploadscripted' => 'Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.',
@@ -1382,6 +1391,13 @@ bar kerdış munasibo munasib niyo diqqet bıkerê.
qaydê hewna biyayeyan tiya de pêşkeş biya:",
'filename-bad-prefix' => "name yo ke şıma bar keni zey nameyê kamerayê dijital î, pê ney '''\"\$1\"''' destpêkeno .
kerem kere yewna nameyo eşkera bıvicinê.",
+'upload-success-subj' => 'bar biyo',
+'upload-success-msg' => 'Bar kerdişê tu itiya de esta: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem bar bike',
+'upload-failure-msg' => 'Bar kerdişê tu de yew problem esta:
+
+$1',
+'upload-warning-subj' => 'İqazê barkerdışi',
'upload-proto-error' => 'Porotokol raÅŸt ni yo.',
'upload-proto-error-text' => 'Bar kerdişê durî gani URLî estbiye ke pe <code>http://</code> ya zi <code>ftp://</code> başli beno.',
@@ -1556,7 +1572,6 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
'statistics-edits-average' => 'Ser her pele de amarê vurnayîşîyê averageyî',
'statistics-views-total' => 'Yekunî bivîne',
'statistics-views-peredit' => 'Ser her vurnayîşî de vînayîşî',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Derganiyê sirayê gure]',
'statistics-users' => 'Qeyd biye [[Special:ListUsers|karberî]]',
'statistics-users-active' => 'Karberê aktifi',
'statistics-users-active-desc' => '{{PLURAL:$1|roco peyin de|$1 roco peyin de}} karber ê ke kar kerdê.',
@@ -1569,7 +1584,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
'doubleredirects' => 'redireksiyonê herdi',
'doubleredirectstext' => 'no pel pelê ray motışani liste keno.
gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
-<s>serê ey nuşteyi</s> safi biye.',
+<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-fixer' => 'Fixerî redirek bike',
@@ -1748,34 +1763,40 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
'listgrouprights-removegroup-self-all' => 'şıma hesabê xo ra eşkeni heme gruban bıveci',
# E-mail user
-'mailnologin' => 'adresa erşawıtışi/ruşnayişi çina.',
-'mailnologintext' => 'qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.',
-'emailuser' => 'Ena karberi rê email bırışe',
-'emailpage' => 'karberi re e-mail bışaw',
-'emailpagetext' => 'no/na karberi re e-posta erşawıtışi de şıma pê forma cêrıni eşkeni kar bıkerî.
+'mailnologin' => 'adresa erşawıtışi/ruşnayişi çina.',
+'mailnologintext' => 'qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.',
+'emailuser' => 'Ena karberi rê email bırışe',
+'emailpage' => 'karberi re e-mail bışaw',
+'emailpagetext' => 'no/na karberi re e-posta erşawıtışi de şıma pê forma cêrıni eşkeni kar bıkerî.
[[Special:Preferences|tercihanê şıma ye karberi]] de adresa e-posta ya ke şıma dayo, na adres qısmê adresa e-postayi de "From (kam ra)" asena, no sebebi ra gırewtox/e eşkeno/a direk cewab bıdo şıma.',
-'usermailererror' => 'xizmetê e-postayi xeta da:',
-'defemailsubject' => '{{SITENAME}} e-posta',
-'noemailtitle' => 'adresa e-postayi çina',
-'noemailtext' => 'no/na karber yew e-postayo meqbul nêdawa/o',
-'nowikiemailtitle' => 'E-postayan re destur çino',
-'nowikiemailtext' => 'no/na karber/e, karberanê binani ra gırewtışê e-postayi tercih nêkerd.',
-'email-legend' => 'karberê {{SITENAME}} binan re e-posta bıerşaw',
-'emailfrom' => 'Kam ra',
-'emailto' => 'Kam rê',
-'emailsubject' => 'behs/mesela:',
-'emailmessage' => 'Mesaj',
-'emailsend' => 'bıerşawê/bıruşnê',
-'emailccme' => 'kopyayekê mesaji mı re bıerşaw',
-'emailccsubject' => '$2 kopyaya mesaj a ke şıma erşawıto/a $1:',
-'emailsent' => 'e-mail erÅŸawiya/ruÅŸiya',
-'emailsenttext' => 'e-mailê şıma erşawiya/ruşiya',
-'emailuserfooter' => 'na e-posta hetê ıney ra $1 erşawiya $2 no/na karberi/e re. pê fonksiyonê "Karberi/e re e-posta bıerşaw" no {{SITENAME}} keyepeli erşawiya.',
+'usermailererror' => 'xizmetê e-postayi xeta da:',
+'defemailsubject' => '{{SITENAME}} e-posta',
+'usermaildisabled' => 'E-mailê karberani kafiliyeya',
+'usermaildisabledtext' => 'Ti nieşkena ena wiki de karberanê binan rê e-mail bişave',
+'noemailtitle' => 'adresa e-postayi çina',
+'noemailtext' => 'no/na karber yew e-postayo meqbul nêdawa/o',
+'nowikiemailtitle' => 'E-postayan re destur çino',
+'nowikiemailtext' => 'no/na karber/e, karberanê binani ra gırewtışê e-postayi tercih nêkerd.',
+'email-legend' => 'karberê {{SITENAME}} binan re e-posta bıerşaw',
+'emailfrom' => 'Kam ra',
+'emailto' => 'Kam rê',
+'emailsubject' => 'behs/mesela:',
+'emailmessage' => 'Mesaj',
+'emailsend' => 'bıerşawê/bıruşnê',
+'emailccme' => 'kopyayekê mesaji mı re bıerşaw',
+'emailccsubject' => '$2 kopyaya mesaj a ke şıma erşawıto/a $1:',
+'emailsent' => 'e-mail erÅŸawiya/ruÅŸiya',
+'emailsenttext' => 'e-mailê şıma erşawiya/ruşiya',
+'emailuserfooter' => 'na e-posta hetê ıney ra $1 erşawiya $2 no/na karberi/e re. pê fonksiyonê "Karberi/e re e-posta bıerşaw" no {{SITENAME}} keyepeli erşawiya.',
+
+# User Messenger
+'usermessage-summary' => 'Mesajê sistemi caverd.',
+'usermessage-editor' => 'Mesaj berdoxe sistemi',
# Watchlist
'watchlist' => 'lista mına seyr-kerdışi',
'mywatchlist' => 'Lista mına seyr-kerdışi',
-'watchlistfor' => "(semedê '''$1''')",
+'watchlistfor2' => 'Semedê $1 ($2)',
'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
'watchnologin' => 'hesab akerde niyo',
@@ -1894,7 +1915,10 @@ oyo ke vurnayiÅŸo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-s
'revertpage-nouser' => '(nameyê karberi veteyo) no keso ke vuriyayiş kerdo vuriyayişê no kesi hetê no [[User:$1|$1]] kesi ra tepiya anciyayo',
'rollback-success' => 'vurnayişê no kesi $1 tepiya geriyayo u hetê no
$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.',
-'sessionfailure' => 'cıkewtışê hesabê şıma de yew problem aseno;
+
+# Edit tokens
+'sessionfailure-title' => 'Seans xeripiya',
+'sessionfailure' => 'cıkewtışê hesabê şıma de yew problem aseno;
no kar semedê dızdiyê hesabi ibtal biyo.
kerem kerê "tepiya" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.',
@@ -2025,19 +2049,22 @@ $1',
'month' => 'AÅŸm ra (u verniyer):',
'year' => 'Serre ra (u verênêr):',
-'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
-'sp-contributions-newbies-sub' => 'Qe hesebê newe',
-'sp-contributions-newbies-title' => 'Îştîrakê karberî ser hesabê neweyî',
-'sp-contributions-blocklog' => 'Cıkewtışê kılit-kerdışi',
-'sp-contributions-deleted' => 'vurnayîşê karberî wedariyayê',
-'sp-contributions-logs' => 'logî',
-'sp-contributions-talk' => 'werênayış',
-'sp-contributions-userrights' => 'Îdarayê heqqanê karberan',
-'sp-contributions-blocked-notice' => 'verniyê no/na karber/e geriyayo/a
+'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
+'sp-contributions-newbies-sub' => 'Qe hesebê newe',
+'sp-contributions-newbies-title' => 'Îştîrakê karberî ser hesabê neweyî',
+'sp-contributions-blocklog' => 'Cıkewtışê kılit-kerdışi',
+'sp-contributions-deleted' => 'vurnayîşê karberî wedariyayê',
+'sp-contributions-logs' => 'logî',
+'sp-contributions-talk' => 'werênayış',
+'sp-contributions-userrights' => 'Îdarayê heqqanê karberan',
+'sp-contributions-blocked-notice' => 'verniyê no/na karber/e geriyayo/a
qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
-'sp-contributions-search' => 'Ser iştariqi bıgeyr',
-'sp-contributions-username' => 'Adresa IPy ya ki namey karberi:',
-'sp-contributions-submit' => 'Cıgeyre',
+'sp-contributions-blocked-notice-anon' => 'Eno adresê IPi bloke biyo.
+Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
+'sp-contributions-search' => 'Ser iştariqi bıgeyr',
+'sp-contributions-username' => 'Adresa IPy ya ki namey karberi:',
+'sp-contributions-toponly' => 'Teyna revizyonanê tewr peniyan bimocne',
+'sp-contributions-submit' => 'Cıgeyre',
# What links here
'whatlinkshere' => 'Çı tiyay rê gırê beno',
@@ -2096,7 +2123,6 @@ qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
'ipb-edit-dropdown' => 'Sebebê blokî bivurne',
'ipb-unblock-addr' => '$1 a bik',
'ipb-unblock' => 'Yew adresê IPî ya zi nameyê karberî blok bike',
-'ipb-blocklist-addr' => 'Ser $1, blokî ke hama hebityeno',
'ipb-blocklist' => 'Blokî ke hama estê ey bivîne',
'ipb-blocklist-contribs' => 'Ser $1 îştîrakî',
'unblockip' => 'Hesabê karberî a bike',
@@ -2169,6 +2195,8 @@ labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no
şıma neeşkeni hesab bıvırazi',
'cant-block-while-blocked' => 'Ê ye ke verniyê şıma gırewtî şıma nêeşkeni verniyê ninan bıgeri',
'cant-see-hidden-user' => 'karber o ke şıma gêreni verniyê ey bıgeri ca ra verniyê ey gırewteyo u pinani kerdeyo.',
+'ipbblocked' => 'Ti nieşkena karberanê binan bloke bike ya zi a bike cunki ti bloke biya',
+'ipbnounblockself' => 'Ti nieÅŸkena xo a bike',
# Developer tools
'lockdb' => 'Database kilit bik',
@@ -2338,6 +2366,7 @@ karê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê kÄ
'importstart' => 'Pelan împort kenî',
'import-revision-count' => '$1 {{PLURAL:$1|revizyon|revizyon}}',
'importnopages' => 'Pel çino ke import bike',
+'imported-log-entries' => ' $1 {{PLURAL:$1|logê dekerdişi|loganê dekerdişan}} ard.',
'importfailed' => 'ÃŽmport nebiy: <nowiki>$1</nowiki>',
'importunknownsource' => 'Çimeyê tip ê împortî nizanyano',
'importcantopen' => 'Nieşkenî dosyayê împortî a bike',
@@ -2437,6 +2466,8 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
'tooltip-rollback' => '"Peyser biya" be yew tik pela îştirak(an)ê peyên|i(an) peyser ano.',
'tooltip-undo' => '"Undo" ena vurnayışê newi iptal kena u vurnayışê verni a kena.
Tı eşkeno yew sebeb bınus.',
+'tooltip-preferences-save' => 'Tercihê mı qeyd ke',
+'tooltip-summary' => 'Yew xulasaya kilm binuse',
# Metadata
'nodublincore' => 'medadatayi Dublin Core RDFyi qey ıney pêşkeşwani teber de verdiyayo.',
@@ -2527,19 +2558,22 @@ $1',
'nextdiff' => 'Vurnayışo newêr →',
# Media information
-'mediawarning' => "''Hişyari!''': Na dosya de belka kodê niyetxırabi estî.
-Beno ke zerar bıdo sistemê şuxulnayişê şıma.",
+'mediawarning' => "'''Teme''': Na dosya de belkia kodê xırabıni estê.
+Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
'imagemaxsize' => "Limitê ebat ê resimi:<br />''(qe pela deskripsiyonê dosyayan)''",
'thumbsize' => 'Ebadê Thumbnaili',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pele|peleyi}}',
-'file-info' => '(ebatê dosyayi: $1, MIME tip: $2)',
-'file-info-size' => '($1 × $2 pixelan, ebatê dosya: $3, MIME type: $4)',
+'file-info' => 'ebatê dosyayi: $1, MIME tip: $2',
+'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
'file-nohires' => '<small>Resolosyonê detayeri çino .</small>',
-'svg-long-desc' => '(SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3)',
+'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
'show-big-image' => 'Resolosyonê temami',
'show-big-image-thumb' => '<qıç>Ebatê ena verqeyd: $1 × $2 pixels</qıç>',
'file-info-gif-looped' => 'viyariye biyo',
'file-info-gif-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
+'file-info-png-looped' => 'atlama biyo',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|hew|hew}} kay biyê',
+'file-info-png-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
# Special:NewFiles
'newimages' => 'Galeyê dosyayanê newe',
@@ -2853,30 +2887,30 @@ Ma aya bini numnen.
'limitall' => 'hemi',
# E-mail address confirmation
-'confirmemail' => 'Adresê emaîlî xo konfirme bike',
-'confirmemail_noemail' => 'Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.',
-'confirmemail_text' => 'qey şuxulnayişê e-postayê wikiyi gani ewwil e-posyaê şıma tesdiq bıbo.
+'confirmemail' => 'Adresê emaîlî xo konfirme bike',
+'confirmemail_noemail' => 'Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.',
+'confirmemail_text' => 'qey şuxulnayişê e-postayê wikiyi gani ewwil e-posyaê şıma tesdiq bıbo.
adresa şıma re qey erşawıtışê e-postayê tesdiqi, butonê cêrıni bıtıknê.
e-posta yo ke erşawiyeno tede gıreyê kodê tesdiqi esto, gıreyi bıtıkne akerê u e-postayê xo tesdiq kerê.',
-'confirmemail_pending' => 'Yew codê konfirmasyonî ma ti ra şiravt;
+'confirmemail_pending' => 'Yew codê konfirmasyonî ma ti ra şiravt;
Eka ti newe hesabê xo viraşt, ti gani yew di dekika vindero u email xo kontrol bike, yani reyna yew hesab meviraz.',
-'confirmemail_send' => 'Yew kodê konfirmasyonî email mina bişirave',
-'confirmemail_sent' => 'Emailê konfirmasyonî şiravt',
-'confirmemail_oncreate' => 'Yew codê konfirmasyonî ma ti ra şiravt;
+'confirmemail_send' => 'Yew kodê konfirmasyonî email mina bişirave',
+'confirmemail_sent' => 'Emailê konfirmasyonî şiravt',
+'confirmemail_oncreate' => 'Yew codê konfirmasyonî ma ti ra şiravt;
Ena kod semed ci kewtîşî lazim niyo, feqat ti gani sistem rê eno kod bimocne ke ti opsiyonê emailî wîkî a bike.',
-'confirmemail_sendfailed' => '{{SITENAME}} nieşkenî ti ra yew emailê konfirmasyonî bişiravî.
+'confirmemail_sendfailed' => '{{SITENAME}} nieşkenî ti ra yew emailê konfirmasyonî bişiravî.
Rica keno ke adresê emailî xo kontrol bike.
Email ÅŸawitoÄŸ eno reyna ard: $1',
-'confirmemail_invalid' => 'Kodê konfirmasyonî raşt niyo.
+'confirmemail_invalid' => 'Kodê konfirmasyonî raşt niyo.
Wextê kod ê konfirmasyonî viyerto.',
-'confirmemail_needlogin' => ' $1 lazimo ke ti adresê emaîl ê xo konfirme bike.',
-'confirmemail_success' => 'Email adresê tu konfirme biy.
+'confirmemail_needlogin' => ' $1 lazimo ke ti adresê emaîl ê xo konfirme bike.',
+'confirmemail_success' => 'Email adresê tu konfirme biy.
Ti eÅŸkeno [[Special:UserLogin|ci kewt]].',
-'confirmemail_loggedin' => 'Eka email adresê tu konfirme biy.',
-'confirmemail_error' => 'Konfirmasyon ni biy, yew ÄŸelet esto.',
-'confirmemail_subject' => '{{SITENAME}} konfirmasyonê adres ê emalî',
-'confirmemail_body' => 'yew ten, muhtemelen şıma no IP-adresi ra,
+'confirmemail_loggedin' => 'Eka email adresê tu konfirme biy.',
+'confirmemail_error' => 'Konfirmasyon ni biy, yew ÄŸelet esto.',
+'confirmemail_subject' => '{{SITENAME}} konfirmasyonê adres ê emalî',
+'confirmemail_body' => 'yew ten, muhtemelen şıma no IP-adresi ra,
keyepelê {{SITENAME}}i de pê no $2 e-postayi hesab kerd a.
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.
@@ -2888,8 +2922,21 @@ eke şıma hesab *a nêkerdo*, qey ibtalê tesdiqkerdışê adresa e-postayi gı
$5
kodê tesdiqi heta ıney tarixi $4 meqbul o.',
-'confirmemail_invalidated' => 'Konfermasyonê adres ê emaîlî iptal biy',
-'invalidateemail' => 'confirmasyonê e-maili iptal bik',
+'confirmemail_body_changed' => 'Yew ten, muhtemelen şıma no IP-adresi $1 ra,
+keyepelê {{SITENAME}}i de pê no $2 e-postayi hesab kerd a.
+
+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 *a nêkerdo*, qey ibtalê tesdiqkerdışê 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',
# Scary transclusion
'scarytranscludedisabled' => '[Transcludê înterwîkîyî nihebityeno]',
@@ -2928,6 +2975,7 @@ Ma rica keno konfirme bike ke ti raştî wazeno eno pel bivirazo.",
'table_pager_first' => 'Pela jûyıne',
'table_pager_last' => 'Pela peyêne',
'table_pager_limit' => 'Jû pele de $1 unsuran bımocne',
+'table_pager_limit_label' => 'Her pele ra xacetan',
'table_pager_limit_submit' => 'Åži',
'table_pager_empty' => 'Netice çini yo',
@@ -2984,6 +3032,7 @@ Ti hem zi eÅŸkeno [[Special:Watchlist/edit|use the standard editor]].',
'version-specialpages' => 'Pelanê xasiyan',
'version-parserhooks' => 'Çengelê Parserî',
'version-variables' => 'Vurnayeyî',
+'version-skins' => 'Cıldi',
'version-other' => 'Bin',
'version-mediahandlers' => 'Kulbê medyayî',
'version-hooks' => 'Çengelî',
@@ -3065,6 +3114,15 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
'tags-edit' => 'bıvurne',
'tags-hitcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
+# Special:ComparePages
+'comparepages' => 'Peleyan miqeyese bike',
+'compare-selector' => 'Revizyonê pele miqayese bike',
+'compare-page1' => 'Pel 1',
+'compare-page2' => 'Pel 2',
+'compare-rev1' => 'Revizyonê 1i',
+'compare-rev2' => 'Revizyonê 2i',
+'compare-submit' => 'Miqayese',
+
# Database error messages
'dberr-header' => 'Ena Wiki de yew ÄŸelet esta',
'dberr-problems' => 'Qusir ma mevin! Site ma de nika ğeletê teknikî esto.',
@@ -3081,6 +3139,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
'htmlform-float-invalid' => 'Ena deÄŸer ke ti spesife kerd yew amar ni yo.',
'htmlform-int-toolow' => 'Ena değer ke ti spesife kerd maxsimumê $1î ra kilmyer o.',
'htmlform-int-toohigh' => 'Ena değer ke ti spesife kerd maxsimumê $1î ra zafyer o.',
+'htmlform-required' => 'Ena deger lazim o',
'htmlform-submit' => 'BiÅŸirav',
'htmlform-reset' => 'Vurnayişî reyna biyar',
'htmlform-selectorother-other' => 'Bin',
diff --git a/languages/messages/MessagesDk.php b/languages/messages/MessagesDk.php
deleted file mode 100644
index 83c67a4d..00000000
--- a/languages/messages/MessagesDk.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/** Danish
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- * @comment Deprecated code. Falls back to 'dk'.
- */
-
-$fallback = 'da';
diff --git a/languages/messages/MessagesDsb.php b/languages/messages/MessagesDsb.php
index 94b6d96a..8977bce0 100644
--- a/languages/messages/MessagesDsb.php
+++ b/languages/messages/MessagesDsb.php
@@ -61,94 +61,94 @@ $dateFormats = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dwójne dalejpósrědnjenja' ),
- 'BrokenRedirects' => array( 'Njefunkcioněrujuce dalejpósrědnjenja' ),
- 'Disambiguations' => array( 'Wótkaze ku rozjasnjenju wopśimjeśa' ),
- 'Userlogin' => array( 'Pśizjawiś se' ),
- 'Userlogout' => array( 'Wótzjawiś se' ),
- 'CreateAccount' => array( 'Wužywarske konto załožyś' ),
+ 'DoubleRedirects' => array( 'Dwójne_dalejpósrědnjenja' ),
+ 'BrokenRedirects' => array( 'Njefunkcioněrujuce_dalejpósrědnjenja' ),
+ 'Disambiguations' => array( 'Wótkaze_ku_rozjasnjenju_wopśimjeśa' ),
+ 'Userlogin' => array( 'Pśizjawiś_se' ),
+ 'Userlogout' => array( 'Wótzjawiś_se' ),
+ 'CreateAccount' => array( 'Wužywarske_konto_załožyś' ),
'Preferences' => array( 'Nastajenja' ),
'Watchlist' => array( 'Wobglědowańka' ),
- 'Recentchanges' => array( 'Aktualne změny' ),
+ 'Recentchanges' => array( 'Aktualne_změny' ),
'Upload' => array( 'UploadowaÅ›' ),
- 'Listfiles' => array( 'Lisćina datajow' ),
- 'Newimages' => array( 'Nowe dataje' ),
+ 'Listfiles' => array( 'Lisćina_datajow' ),
+ 'Newimages' => array( 'Nowe_dataje' ),
'Listusers' => array( 'Wužywarje' ),
- 'Listgrouprights' => array( 'Pšawa wužywarskich kupkow' ),
+ 'Listgrouprights' => array( 'Pšawa_wužywarskich_kupkow' ),
'Statistics' => array( 'Statistika' ),
- 'Randompage' => array( 'Pśipadny bok' ),
- 'Lonelypages' => array( 'Wósyrośone boki' ),
- 'Uncategorizedpages' => array( 'Njekategorizěrowane boki' ),
- 'Uncategorizedcategories' => array( 'Njekategorizěrowane kategorije' ),
- 'Uncategorizedimages' => array( 'Njekategorizěrowane dataje' ),
- 'Uncategorizedtemplates' => array( 'Njekategorizěrowane pśedłogi' ),
- 'Unusedcategories' => array( 'Njewužywane kategorije' ),
- 'Unusedimages' => array( 'Njewužywane dataje' ),
- 'Wantedpages' => array( 'Póžedane boki' ),
- 'Wantedcategories' => array( 'Póžedane kategorije' ),
- 'Wantedfiles' => array( 'Felujuce dataje' ),
- 'Wantedtemplates' => array( 'Felujuce pśedłogi' ),
- 'Mostlinked' => array( 'Boki na kótarež wjeźo nejwěcej wótkazow' ),
- 'Mostlinkedcategories' => array( 'Nejwěcej wužywane kategorije' ),
- 'Mostlinkedtemplates' => array( 'Nejwěcej wužywane pśedłogi' ),
- 'Mostimages' => array( 'Nejwěcej wužywane dataje' ),
- 'Mostcategories' => array( 'Boki z nejwěcej kategorijami' ),
- 'Mostrevisions' => array( 'Nejwěcej wobźěłane boki' ),
- 'Fewestrevisions' => array( 'Nejmjenjej wobźěłane boki' ),
- 'Shortpages' => array( 'Nejkrotše boki' ),
- 'Longpages' => array( 'Nejdlěše boki' ),
- 'Newpages' => array( 'Nowe boki' ),
- 'Ancientpages' => array( 'Nejstarše boki' ),
- 'Deadendpages' => array( 'Boki kenž su slěpe gasy' ),
- 'Protectedpages' => array( 'Šćitane boki' ),
- 'Protectedtitles' => array( 'Šćitane title' ),
- 'Allpages' => array( 'WÅ¡ykne boki' ),
- 'Prefixindex' => array( 'Indeks prefiksow' ),
- 'Ipblocklist' => array( 'Blokěrowane IPje' ),
- 'Specialpages' => array( 'Specialne boki' ),
+ 'Randompage' => array( 'Pśipadny_bok' ),
+ 'Lonelypages' => array( 'Wósyrośone_boki' ),
+ 'Uncategorizedpages' => array( 'Njekategorizěrowane_boki' ),
+ 'Uncategorizedcategories' => array( 'Njekategorizěrowane_kategorije' ),
+ 'Uncategorizedimages' => array( 'Njekategorizěrowane_dataje' ),
+ 'Uncategorizedtemplates' => array( 'Njekategorizěrowane_pśedłogi' ),
+ 'Unusedcategories' => array( 'Njewužywane_kategorije' ),
+ 'Unusedimages' => array( 'Njewužywane_dataje' ),
+ 'Wantedpages' => array( 'Póžedane_boki' ),
+ 'Wantedcategories' => array( 'Póžedane_kategorije' ),
+ 'Wantedfiles' => array( 'Felujuce_dataje' ),
+ 'Wantedtemplates' => array( 'Felujuce_pśedłogi' ),
+ 'Mostlinked' => array( 'Boki_na_kótarež_wjeźo_nejwěcej_wótkazow' ),
+ 'Mostlinkedcategories' => array( 'Nejwěcej_wužywane_kategorije' ),
+ 'Mostlinkedtemplates' => array( 'Nejwěcej_wužywane_pśedłogi' ),
+ 'Mostimages' => array( 'Nejwěcej_wužywane_dataje' ),
+ 'Mostcategories' => array( 'Boki_z_nejwěcej_kategorijami' ),
+ 'Mostrevisions' => array( 'Nejwěcej_wobźěłane_boki' ),
+ 'Fewestrevisions' => array( 'Nejmjenjej_wobźěłane_boki' ),
+ 'Shortpages' => array( 'Nejkrotše_boki' ),
+ 'Longpages' => array( 'Nejdlěše_boki' ),
+ 'Newpages' => array( 'Nowe_boki' ),
+ 'Ancientpages' => array( 'Nejstarše_boki' ),
+ 'Deadendpages' => array( 'Boki_kenž_su_slěpe_gasy' ),
+ 'Protectedpages' => array( 'Šćitane_boki' ),
+ 'Protectedtitles' => array( 'Šćitane_title' ),
+ 'Allpages' => array( 'WÅ¡ykne_boki' ),
+ 'Prefixindex' => array( 'Indeks_prefiksow' ),
+ 'Ipblocklist' => array( 'Blokěrowane_IPje' ),
+ 'Specialpages' => array( 'Specialne_boki' ),
'Contributions' => array( 'Pśinoski' ),
'Emailuser' => array( 'E-mail' ),
- 'Confirmemail' => array( 'E-mail wobkšuśiś' ),
- 'Whatlinkshere' => array( 'Lisćina wótkazow' ),
- 'Recentchangeslinked' => array( 'Změny na zalinkowanych bokach' ),
+ 'Confirmemail' => array( 'E-mail_wobkšuśiś' ),
+ 'Whatlinkshere' => array( 'Lisćina_wótkazow' ),
+ 'Recentchangeslinked' => array( 'Změny_na_zalinkowanych_bokach' ),
'Movepage' => array( 'Pśesunuś' ),
'Blockme' => array( 'Proksy-blokěrowanje' ),
- 'Booksources' => array( 'Pytaś pó ISBN' ),
+ 'Booksources' => array( 'Pytaś_pó_ISBN' ),
'Categories' => array( 'Kategorije' ),
'Export' => array( 'Eksportěrowaś' ),
'Version' => array( 'Wersija' ),
- 'Allmessages' => array( 'Systemowe powěsći' ),
+ 'Allmessages' => array( 'Systemowe_powěsći' ),
'Log' => array( 'Protokole' ),
'Blockip' => array( 'Blokěrowaś' ),
'Undelete' => array( 'Nawrośiś' ),
'Import' => array( 'Importěrowaś' ),
- 'Lockdb' => array( 'Datowu banku blokěrowaś' ),
- 'Unlockdb' => array( 'Datowu banku zasej spśistupniś' ),
- 'Userrights' => array( 'Pšawa wužywarjow' ),
- 'MIMEsearch' => array( 'Pytaś pó MIME-typje' ),
- 'FileDuplicateSearch' => array( 'Pytanje datajowych duplikatow' ),
- 'Unwatchedpages' => array( 'Boki kenž njejsu we wobglědowańkach' ),
+ 'Lockdb' => array( 'Datowu_banku_blokěrowaś' ),
+ 'Unlockdb' => array( 'Datowu_banku_zasej_spśistupniś' ),
+ 'Userrights' => array( 'Pšawa_wužywarjow' ),
+ 'MIMEsearch' => array( 'Pytaś_pó_MIME-typje' ),
+ 'FileDuplicateSearch' => array( 'Pytanje_datajowych_duplikatow' ),
+ 'Unwatchedpages' => array( 'Boki_kenž_njejsu_we_wobglědowańkach' ),
'Listredirects' => array( 'Pśesměrowanja' ),
- 'Revisiondelete' => array( 'Wulašowanje wersijow' ),
- 'Unusedtemplates' => array( 'Njewužywane pśedłogi' ),
- 'Randomredirect' => array( 'Pśipadne pśesměrowanje' ),
- 'Mypage' => array( 'Mój bok' ),
- 'Mytalk' => array( 'Mója diskusija' ),
- 'Mycontributions' => array( 'Móje pśinoski' ),
+ 'Revisiondelete' => array( 'Wulašowanje_wersijow' ),
+ 'Unusedtemplates' => array( 'Njewužywane_pśedłogi' ),
+ 'Randomredirect' => array( 'Pśipadne_pśesměrowanje' ),
+ 'Mypage' => array( 'Mój_bok' ),
+ 'Mytalk' => array( 'Mója_diskusija' ),
+ 'Mycontributions' => array( 'Móje_pśinoski' ),
'Listadmins' => array( 'Administratory' ),
'Listbots' => array( 'Boty' ),
- 'Popularpages' => array( 'Woblubowane boki' ),
+ 'Popularpages' => array( 'Woblubowane_boki' ),
'Search' => array( 'PytaÅ›' ),
- 'Resetpass' => array( 'Šćitne gronidło slědk stajiś' ),
- 'Withoutinterwiki' => array( 'Interwikije feluju' ),
- 'MergeHistory' => array( 'Stawizny wersijow zjadnośiś' ),
- 'Filepath' => array( 'Datajowa sćažka' ),
- 'Invalidateemail' => array( 'E-mail njewobkšuśis' ),
- 'Blankpage' => array( 'Prozny bok' ),
- 'LinkSearch' => array( 'Pytanje wótkazow' ),
- 'DeletedContributions' => array( 'Wulašowane pśinoski' ),
+ 'Resetpass' => array( 'Šćitne_gronidło_slědk_stajiś' ),
+ 'Withoutinterwiki' => array( 'Interwikije_feluju' ),
+ 'MergeHistory' => array( 'Stawizny_wersijow_zjadnośiś' ),
+ 'Filepath' => array( 'Datajowa_sćažka' ),
+ 'Invalidateemail' => array( 'E-mail_njewobkšuśis' ),
+ 'Blankpage' => array( 'Prozny_bok' ),
+ 'LinkSearch' => array( 'Pytanje_wótkazow' ),
+ 'DeletedContributions' => array( 'Wulašowane_pśinoski' ),
'Tags' => array( 'Toflicki' ),
- 'Activeusers' => array( 'Aktiwne wužywarje' ),
+ 'Activeusers' => array( 'Aktiwne_wužywarje' ),
);
$messages = array(
@@ -167,8 +167,7 @@ $messages = array(
'tog-editsection' => 'Wobźěłanje wótstawkow pśez wótkaze [wobźěłaś] zmóžniś',
'tog-editsectiononrightclick' => 'Wobźěłanje wótstawkow pśez kliknjenje z pšaweju tastu myški zmóžniś (JavaScript)',
'tog-showtoc' => 'Wopśimjeśe pokazaś, jolic ma bok wěcej nježli 3 nadpisma',
-'tog-rememberpassword' => 'Se stawnje na toś tom computerje pśizjawiś',
-'tog-editwidth' => 'Wobźěłowańske pólo póšyriś, aby se ceła wobrazowka połniła',
+'tog-rememberpassword' => 'Z toś tym wobglědowakom pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
'tog-watchcreations' => 'Boki, kótarež załožyjom, awtomatiski wobglědowaś',
'tog-watchdefault' => 'Boki, kótarež změnijom, awtomatiski wobglědowaś',
'tog-watchmoves' => 'Boki, kótarež som pśesunuł, awtomatiski wobglědowaś',
@@ -314,31 +313,21 @@ $messages = array(
'faqpage' => 'Project:FAQ (pšašanja a wótegrona)',
# Vector skin
-'vector-action-addsection' => 'Temu pśidaś',
-'vector-action-delete' => 'Wulašowaś',
-'vector-action-move' => 'Pśesunuś',
-'vector-action-protect' => 'Šćitaś',
-'vector-action-undelete' => 'Wótnowiś',
-'vector-action-unprotect' => 'Šćit wótpóraś',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Bok pomocy',
-'vector-namespace-image' => 'Dataja',
-'vector-namespace-main' => 'Bok',
-'vector-namespace-media' => 'Medijowy bok',
-'vector-namespace-mediawiki' => 'Powěźeńka',
-'vector-namespace-project' => 'Projektowy bok',
-'vector-namespace-special' => 'Specialny bok',
-'vector-namespace-talk' => 'Diskusija',
-'vector-namespace-template' => 'Pśedłoga',
-'vector-namespace-user' => 'Wužywarski bok',
-'vector-view-create' => 'Napóraś',
-'vector-view-edit' => 'Wobźěłaś',
-'vector-view-history' => 'Wersije a awtory',
-'vector-view-view' => 'CytaÅ›',
-'vector-view-viewsource' => 'Žrědło se woglědaś',
-'actions' => 'Akcije',
-'namespaces' => 'Mjenjowe rumy',
-'variants' => 'Warianty',
+'vector-action-addsection' => 'Temu pśidaś',
+'vector-action-delete' => 'Wulašowaś',
+'vector-action-move' => 'Pśesunuś',
+'vector-action-protect' => 'Šćitaś',
+'vector-action-undelete' => 'Wótnowiś',
+'vector-action-unprotect' => 'Šćit wótpóraś',
+'vector-simplesearch-preference' => 'Pólěpšone pytańske naraźenja zmóžniś (jano suknja Vector)',
+'vector-view-create' => 'Napóraś',
+'vector-view-edit' => 'Wobźěłaś',
+'vector-view-history' => 'Wersije a awtory',
+'vector-view-view' => 'CytaÅ›',
+'vector-view-viewsource' => 'Žrědło se woglědaś',
+'actions' => 'Akcije',
+'namespaces' => 'Mjenjowe rumy',
+'variants' => 'Warianty',
'errorpagetitle' => 'Zmólka',
'returnto' => 'Slědk k boku $1.',
@@ -399,6 +388,9 @@ Pśewjele wužywarjow wopytujo se toś ten bok woglědaś.
Pšosym pócakaj chylu, nježli až wopytujoš znowego na toś ten bok pśistup měś.
$1',
+'pool-timeout' => 'Pśekšocenje casa wob cakanje na zastajenje',
+'pool-queuefull' => 'Cakajucy rěd jo połny',
+'pool-errorunknown' => 'Njeznata zmólka',
# 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' => 'Wó {{GRAMMAR:lokatiw|{{SITENAME}}}}',
@@ -558,7 +550,8 @@ Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences
'yourname' => 'mě wužywarja',
'yourpassword' => 'šćitne gronidło:',
'yourpasswordagain' => 'Šćitne gronidło hyšći raz zapódaś:',
-'remembermypassword' => 'Šćitne gronidło na toś tom computerje składowaś',
+'remembermypassword' => 'Na toś tom licadle pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
+'securelogin-stick-https' => 'Pó pśizjawjenju z HTTPS zwězany wóstaś',
'yourdomainname' => 'Twója domejna',
'externaldberror' => 'Abo jo wustupiła eksterna zmólka awtentifikacije datoweje banki, abo njesmějoš swójo eksterne wužywarske konto aktualizěrowaś.',
'login' => 'Pśizjawiś se',
@@ -575,6 +568,7 @@ Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences
'gotaccount' => "Maš južo wužywarske konto? '''$1'''.",
'gotaccountlink' => 'Pśizjawiś se',
'createaccountmail' => 'z e-mailku',
+'createaccountreason' => 'Pśicyna:',
'badretype' => 'Šćitnej gronidle, kótarejž sy zapódał, se njemakajotej.',
'userexists' => 'Toś to wužywarske mě słuša južo drugemu wužywarjeju, pšosym wuzwól se druge.',
'loginerror' => 'Zmólka pśi pśizjawjenju',
@@ -593,6 +587,7 @@ Pśeglěduj pšawopis abo [[Special:UserLogin/signup|załož nowe konto]].',
'wrongpasswordempty' => 'Šćitne gronidło jo było prozne. Pšosym zapódaj jo hyšći raz.',
'passwordtooshort' => 'Gronidła deje nanejmjenjej {{PLURAL:$|1 znamuško|$1 znamušce|$1 znamuška|$1 znamuškow}} měś.',
'password-name-match' => 'Twójo gronidło musy se wót swójogo wužywarskego mjenja rozeznaś.',
+'password-login-forbidden' => 'Wužywanje toś togo wužywarskego mjenja a gronidła jo zakazane.',
'mailmypassword' => 'Nowe gronidło pśipósłaś',
'passwordremindertitle' => 'Nowe nachylne pótajmne słowo za {{SITENAME}}',
'passwordremindertext' => 'Něchten z IP-adresu $1 (nejskerjej ty) jo se wupšosył nowe gronidło za {{SITENAME}} ($4).
@@ -627,6 +622,9 @@ Móžoš toś te zdźělenje ignorowaś, jolic toś te konto jo se jano zamólnj
'loginlanguagelabel' => 'Rěc: $1',
'suspicious-userlogout' => 'Twójo póžedanje za wótzjawjenim jo se wótpokazało, dokulaž zda se, až jo se pósłało pśez wobškóźony wobglědowak abo pufrowański proksy',
+# E-mail sending
+'php-mail-error-unknown' => 'Njeznata zmólka w PHP-funkciji mail()',
+
# Password reset dialog
'resetpass' => 'Gronidło změniś',
'resetpass_announce' => 'Sy z nachylnym e-mailowym šćitnym gronidłom pśizjawjony. Aby pśizjawjenje zakóńcył, zapódaj how nowe šćitne gronidło:',
@@ -678,9 +676,10 @@ Sy snaź swójo gronidło južo wuspěšnje změnił abo nowe nachylne gronidło
'showlivepreview' => 'Livepśeglěd',
'showdiff' => 'Pśeměnjenja pokazaś',
'anoneditwarning' => "'''Warnowanje:''' Njejsy pśizjawjony. Změny w stawiznach togo boka składuju se z twójeju IP-adresu.",
+'anonpreviewwarning' => "''Njejsy pśizjawjony. Składowanje pśenosujo twóju IP-adresu do wobźěłowańskeje historije toś togo boka.''",
'missingsummary' => "'''Pokazka:''' Njejsy žedno zespominanje zapódał. Gaž kliknjoš na \"Składowaś\" składujo se bok bźez zespominanja.",
'missingcommenttext' => 'Pšosym zespominanje zapódaś.',
-'missingcommentheader' => "'''WARNOWANJE:''' Njejsy žedno nadpismo zapódał. Gaž kliknjoš na \"Składowaś\", składujo se twójo wobźěłanje mimo nadpisma.",
+'missingcommentheader' => "'''Glědaj:''' Njejsy temu/ nadpismo za toś ten komentar pódał. Gaž kliknjoš na \"{{int:savearticle}}\" znowego, składujo se twójo wobźěłanje mimo temy/nadpisma.",
'summary-preview' => 'Pśeglěd zespominanja:',
'subject-preview' => 'Pśeglěd nadpisma:',
'blockedtitle' => 'Wužywaŕ jo se blokěrował',
@@ -747,7 +746,11 @@ Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:'
'usercsspreview' => "'''Źiwaj na to, až wobglědujoš se jano pśeglěd swójogo wužywarskego CSS. Njejo se hyšći składował!'''",
'userjspreview' => "== Pśeglěd Wašogo wužywarskego JavaScripta ==
'''Glědaj:''' Pó składowanju musyš swójomu browseroju kazaś, aby nowu wersiju pokazał: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
-'userinvalidcssjstitle' => "'''Warnowanje:''' Njeeksistěrujo šat „$1“. Pšosym mysli na to, až wužywaju .css- a .js-boki mały pismik, na pś. ''{{ns:user}}:Pśikładowa/monobook.css'' město ''{{ns:user}}:Pśikładowa/Monobook.css''.",
+'sitecsspreview' => "'''Źiwaj na to, až wobglědujoš se jano pśeglěd toś ten CSS.'''
+'''Njejo se hyšći składował!'''",
+'sitejspreview' => "'''Źiwaj na to, až wobglědujoš se jano pśeglěd toś togo koda JavaScript.'''
+'''Njejo se hyšći składował!'''",
+'userinvalidcssjstitle' => "'''Warnowanje:''' Njeeksistěrujo šat „$1“. Pšosym mysli na to, až wužywaju .css- a .js-boki mały pismik, na pś. ''{{ns:user}}:Pśikładowa/vector.css'' město ''{{ns:user}}:Pśikładowa/Vector.css''.",
'updated' => '(Zaktualizěrowane)',
'note' => "'''Pokazka:'''",
'previewnote' => "'''To jo jano pśeglěd, bok njejo hyšći składowany!'''",
@@ -778,8 +781,6 @@ Ty teke wobkšuśijoš, až sy tekst sam napisał abo sy jen wót public domainy
'''NJEWÓZJAW WÓT COPYRIGHTA ŠĆITANE ŹĚÅA MIMO DOWÓLNOSĆI!'''",
'copyrightwarning2' => "PÅ¡osym buź se togo wÄ›dobny, až wÅ¡ykne pÅ›inoski na {{SITENAME}} mógu wót drugich wužywarjow se wobźěłaÅ›, narownaÅ› abo wulaÅ¡owaÅ›. Jolic až njocoÅ¡, až twój tekst se mimo zmilnosći wobźěłujo, ga pón jen how njeskÅ‚aduj.<br /> Ty teke wobkÅ¡uÅ›ijoÅ¡, až sy tekst sam napisaÅ‚ abo sy jen wót public domainy resp. wót pódobneje lichotneje resursy kopÄ›rowaÅ‚ (glÄ›daj $1 za dalÅ¡e detaile). '''NJEWÓZJAW WÓT COPYRIGHTA ŠĆITANE ŹĚÅA MIMO DOWÓLNOSĆI!'''",
-'longpagewarning' => "'''GLĚDAJ: Toś ten bok wopśimjejo $1 kilobajtow; někotare wobglŽŽědowaki mógu měś problemy z wobźěłowanim bokow, kótarež su wětše ako 32 kb.
-Pšosym pśemysli, jolic njamóžo se bok na mjeńše wótrězki rozdźěliś.'''",
'longpageerror' => "'''Zmólka: Tekst, kótaryž coš składowaś jo $1 KB wjeliki. To jo wěcej, ako dowólony maksimum ($2 KB). Składowanje njejo móžno.'''",
'readonlywarning' => "'''WARNOWANJE: Datowa banka jo se za wótwardowanje zacyniła, togodla njebuźo tuchylu móžno, twóje změny składowaś. Jolic až coš, ga móžoš tekst do tekstoweje dataje kopěrowaś a pózdźej składowaś.'''
@@ -953,6 +954,8 @@ $1",
'logdelete-failure' => "'''Protokolowa wiźobnosć njejo se dała nastajiś:'''
$1",
'revdel-restore' => 'Widobnosć změniś',
+'revdel-restore-deleted' => 'wulašowane wersije',
+'revdel-restore-visible' => 'widobne wersije',
'pagehist' => 'stawizny boka',
'deletedhist' => 'wulašowane stawizny',
'revdelete-content' => 'wopśimjeśe',
@@ -1019,11 +1022,13 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
# Diffs
'history-title' => 'Stawizny wersijow boka „$1“',
'difference' => '(rozdźěle mjazy wersijoma/wersijami)',
+'difference-multipage' => '(Rozdźěl mjazy bokami)',
'lineno' => 'Rědka $1:',
'compareselectedversions' => 'Wuzwólonej wersiji pśirownaś',
'showhideselectedversions' => 'Wubrane wersije pokazaÅ›/schowaÅ›',
'editundo' => 'wótwrośiś',
-'diff-multi' => '(Pśirownanje wersijow(u) wopśimjejo teke {{PLURAL:$1|mjaz tutyma lažecu wersiju|$1 mjaz tutyma lažecej wersiji|$1 mjaz tutyma lažece wersije}}.)',
+'diff-multi' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót {{PLURAL:$2|jadnogo wužywarja|$2 wužywarjowu|$2 wužywarjow|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót wěcej ako {{PLURAL:$2|jadnogo wužywarja|$2 wužywarjowu|$2 wužywarjow|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
# Search results
'searchresults' => 'Wuslědki pytanja',
@@ -1058,6 +1063,7 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
'searchprofile-everything-tooltip' => 'Cełe wopsímjeśe pśepytaś (inkluziwnje diskusijne boki)',
'searchprofile-advanced-tooltip' => 'W swójskich mjenjowych rumach pytaś',
'search-result-size' => '$1 ({{PLURAL:$2|1 słowow|$2 słowje|$2 słowa|$2 słowow}})',
+'search-result-category-size' => '{{PLURAL:$1|1 cłonk|$1 cłonka|$1 cłonki|$1 cłonkow}} ({{PLURAL:$2|1 pódkategorija|$2 pódkategoriji|$2 pódkategorije|$2 pódkategorijow}}, {{PLURAL:$3|1 dataja|$3 dataji|$3 dataje|$3 datajow}})',
'search-result-score' => 'Relewanca: $1 %',
'search-redirect' => '(pśesměrowanje $1)',
'search-section' => '(sekcija $1)',
@@ -1132,6 +1138,7 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
'contextlines' => 'Rědki na wuslědk:',
'contextchars' => 'Znamuška na rědku:',
'stub-threshold' => 'Formatěrowanje <a href="#" class="stub">wótkaza na zarodk</a> (w bytach):',
+'stub-threshold-disabled' => 'Znjemóžnjony',
'recentchangesdays' => 'Licba dnjow, kenž se pokazuju w "slědnych změnach":',
'recentchangesdays-max' => '(maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
'recentchangescount' => 'Licba změnow, kótaraž ma se pó standarźe pokazaś:',
@@ -1165,6 +1172,7 @@ How jo pśipadnje napórana gódnota, kótaruž móžoš wužywaś: $1',
'prefs-files' => 'Dataje',
'prefs-custom-css' => 'Swójski CSS',
'prefs-custom-js' => 'Swójski JS',
+'prefs-common-css-js' => 'Zgromadny CSS/JS za wšykne suknje:',
'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults. This cannot be undone.
Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standardne gódnoty sedła. To njedajo se anulěrowaś.',
'prefs-emailconfirm-label' => 'E-mailowe wobkšuśenje:',
@@ -1200,9 +1208,15 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'prefs-advancedrendering' => 'Rozšyrjone opcije',
'prefs-advancedsearchoptions' => 'Rozšyrjone opcije',
'prefs-advancedwatchlist' => 'Rozšyrjone opcije',
-'prefs-display' => 'Opcije se woglědaś',
+'prefs-displayrc' => 'Zwobraznjowańske opcije',
+'prefs-displaysearchoptions' => 'Zwobraznjowańske opcije',
+'prefs-displaywatchlist' => 'Zwobraznjowańske opcije',
'prefs-diffs' => 'Rozdźěle',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Zda se, až e-mailowa adresa jo płaśiwa',
+'email-address-validity-invalid' => 'Zapódaj płaśiwu e-mailowu adresu',
+
# User rights
'userrights' => 'Zastojanje wužywarskich pšawow',
'userrights-lookup-user' => 'Wužywarske kupki zastojaś',
@@ -1286,6 +1300,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'right-hideuser' => 'Wužywarske mě blokěrowaś a schowaś',
'right-ipblock-exempt' => 'Blokěrowanja IP, awtomatiske blokěrowanja a blokěrowanja wobcerkow se wobinuś',
'right-proxyunbannable' => 'Awtomatiske blokěrowanje proksyjow se wobinuś',
+'right-unblockself' => 'Wótblokěrowaś se samogo',
'right-protect' => 'Šćitowe schójźeńki změniś a šćitane boki wobźěłaś',
'right-editprotected' => 'Šćitane boki wobźěłaś (bśez kaskadowego šćita)',
'right-editinterface' => 'Wužywański pówjerch wobźěłaś',
@@ -1308,7 +1323,6 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'right-siteadmin' => 'Datowu banku zastajiś a zastajenje wótpóraś',
'right-reset-passwords' => 'Gronidła drugich wužywarjow slědk stajiś',
'right-override-export-depth' => 'Boki inkluziwnje wótkazanych bokow až do dłyma 5 eksportěrowaś',
-'right-versiondetail' => 'Nadrobne informacije wó wersiji softwary pokazaś',
'right-sendemail' => 'Drugim wužywarjam e-mail pósłaś',
# User rights log
@@ -1359,14 +1373,9 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'recentchanges-legend' => 'Opcije aktualnych změnow',
'recentchangestext' => "How móžoš slědne změny we '''{{GRAMMAR:lokatiw|{{SITENAME}}}}''' slědowaś.",
'recentchanges-feed-description' => 'Slěduj z toś tym zapódaśim nejaktualnjejše změny we {{GRAMMAR:lokatiw|{{SITENAME}}}}.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nowy bok',
'recentchanges-label-newpage' => 'Toś ta změna jo nowy bok napórała.',
-'recentchanges-legend-minor' => '$1 - snadna změna',
'recentchanges-label-minor' => 'To jo snadna změna',
-'recentchanges-legend-bot' => '$1 - změna bośika',
'recentchanges-label-bot' => 'Toś ta změna jo se pśez bośik wuwjadła.',
-'recentchanges-legend-unpatrolled' => '$1 - njepśekontrolěrowana změna',
'recentchanges-label-unpatrolled' => 'Toś ta změna hyšći njejo se pśekontrolěrowała',
'rcnote' => "Dołojce {{PLURAL:$1|jo '''1''' změna|stej slědnej '''$1''' změnje|su slědne '''$1''' změny}} w {{PLURAL:$2|slědnem dnju|slědnyma '''$2''' dnjoma|slědnych '''$2''' dnjach}}, staw wót $4, $5.",
'rcnotefrom' => "Dołojce pokazuju se změny wót '''$2''' (maks. '''$1''' zapisow).",
@@ -1413,6 +1422,9 @@ Boki na [[Special:Watchlist|wobglědowańce]] su '''tucne'''.",
'upload_directory_missing' => 'Nagrawański zapis ($1) felujo a njejo se pśez webserwer napóraś dał.',
'upload_directory_read_only' => 'Nagrawański zapisk ($1) njedajo se pśez webserwer pisaś.',
'uploaderror' => 'Nagrawańska zmólka',
+'upload-recreate-warning' => "'''Warnowanje: Dataja z tym mjenim jo se wulašowała abo pśeunuła.'''
+
+Protokola wulašowanjow a pśesunjenjow za toś ten bok stej how k twójej dispoziciji pódanej:",
'uploadtext' => "Wužyj toś ten formular za nagraśe nowych datajow.
Źi na [[Special:FileList|lisćinu nagratych datajow]], aby mógł južo nagrate dataje se wobglědaś abo pytaś, nagraśa protokolěruju se w [[Special:Log/upload|protokolu nagraśow]], wulašowanja w [[Special:Log/delete|protokolu wulašowanjow]].
@@ -1448,6 +1460,17 @@ Glědaj [[Special:NewFiles|galeriju nowych datajow]] za wizuelny pśeglěd.',
'filetype-banned-type' => "'''„.$1“''' jo njedowólony datajowy typ.
{{PLURAL:$3|Dowólony datajowy typ jo|Dowólenej datajowej typa stej|Dowólone datajowe typy su}} $2.",
'filetype-missing' => 'Dataja njama žedno rozšyrjenje (na pś. „.jpg“).',
+'empty-file' => 'Dataja, kótaruž sy wótpósłał, jo prozna była.',
+'file-too-large' => 'Dataja, kótaruž sy wótpósłał, jo pśewjelika była.',
+'filename-tooshort' => 'Datajowe mě jo pśekrotke.',
+'filetype-banned' => 'ToÅ› ten datajowy typ jo zakazany.',
+'verification-error' => 'Toś ta dataja njejo pśejšeła datajowe pśeglědanje.',
+'hookaborted' => 'Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjeńsku kokulu.',
+'illegal-filename' => 'Datajowe mě njejo dowólone.',
+'overwrite' => 'Pśepisowanje eksistujuceje dataje njejo dowólone.',
+'unknown-error' => 'Njeznata zmólka jo nastała.',
+'tmp-create-error' => 'Temporerna dataja njejo se dała napóraś.',
+'tmp-write-error' => 'Zmólka pśi pisanju temporerneje dataje.',
'large-file' => 'Pó móžnosći njedejała dataja wětša byś ako $1. Toś ta dataja jo $2 wjelika.',
'largefileserver' => 'Dataja jo wětša ako serwer dopušćijo.',
'emptyfile' => 'Dataja, kótaruž sy nagrał, jo prozna. Pśicyna móžo byś zmólka w mjenju dataje. Kontrolěruj pšosym, lěc coš dataju napšawdu nagraś.',
@@ -1471,13 +1494,14 @@ Jolic maš toś ten wobraz w połnem rozeznaśu, nagraj jen, howac změń pšosy
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Toś ta dataja jo duplikat {{PLURAL:$1|slědujuceje dataje|slědujuceju datajow|slědujucych datajow|slědujucych datajow}}:',
'file-deleted-duplicate' => 'Dataja, kótaraž jo identiska z toś teju dataju ([[:$1]]) jo se pjerwjej wulašowała. Ty měł stawizny wulašowanja toś teje dataje pśeglědaś, pjerwjej až pokšacujoš z jeje zasejnagrawanjom.',
-'successfulupload' => 'Nagraśe jo było wuspěšne.',
'uploadwarning' => 'Warnowanje',
'uploadwarning-text' => 'Pšosym změń slědujuce datajowe wopisanje a wopytaj hyšći raz.',
'savefile' => 'Dataju składowaś',
'uploadedimage' => 'jo "[[$1]]" nagrał.',
'overwroteimage' => 'Jo nowu wersiju "[[$1]]" nagrał.',
'uploaddisabled' => 'Nagrawanje jo se znjemóžniło.',
+'copyuploaddisabled' => 'Nagraśe pśez URL znjemóžnjone.',
+'uploadfromurl-queued' => 'Twójo nagraśe jo něnto w cakańskem rěźe.',
'uploaddisabledtext' => 'Nagraśa datajow su znjemóžnjone.',
'php-uploaddisabledtext' => 'Nagraśa PHP-datajow su znjemóžnjone. Pšosym pśekontrolěruj nastajenje file_uploads.',
'uploadscripted' => 'Toś ta dataja wopśimjejo HTML abo script code, kótaryž móžo wót browsera se zamólnje wuwjasć.',
@@ -1510,6 +1534,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- Njezměń nic na toś tej rědce! -->',
+'upload-success-subj' => 'Nagraśe jo było wuspěšne.',
+'upload-success-msg' => 'Twójo nagraśe z [$2] jo wuspěšne było. Stoj how k dispoziciji: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Nagrawański problem',
+'upload-failure-msg' => 'Jo był problem z twójim nagraśim wót [$2]:
+
+$1',
+'upload-warning-subj' => 'Nagrawańske warnowanje',
+'upload-warning-msg' => 'Jo był problem z twójim nagraśim z [$2]. Wroś k [[Special:Upload/stash/$1|nagrawańskemu formularoju]], aby wótpórał toś ten problem.',
'upload-proto-error' => 'Njekorektny protokol',
'upload-proto-error-text' => 'URL musy zachopiÅ› z <code>http://</code> abo <code>ftp://</code>.',
@@ -1567,6 +1599,7 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
'listfiles_search_for' => 'Za medijowym mjenim pytaÅ›:',
'imgfile' => 'dataja',
'listfiles' => 'Lisćina datajow',
+'listfiles_thumb' => 'Pśeglědowy wobraz',
'listfiles_date' => 'datum',
'listfiles_name' => 'mÄ› dataje',
'listfiles_user' => 'wužywaŕ',
@@ -1677,8 +1710,8 @@ Slědujuca lisćina pokazujo jano {{PLURAL:$1|prědny wótkaz|prědnej $1 wótka
'statistics-edits' => 'Změny bokow wót załoženja {{SITENAME}}',
'statistics-edits-average' => 'Změny na bok w pśerězku',
'statistics-views-total' => 'Zwobraznjenja dogromady',
+'statistics-views-total-desc' => 'Woglědanja na njeeksistěrujucych bokach a specialnych bokach njejsu zapśimjone',
'statistics-views-peredit' => 'Zwobraznjenja na změnu',
-'statistics-jobqueue' => 'Dłujkosć [http://www.mediawiki.org/wiki/Manual:Job_queue Job queue]',
'statistics-users' => 'Zregistrěrowane [[Special:ListUsers|wužywarje]]',
'statistics-users-active' => 'Aktiwne wužywarje',
'statistics-users-active-desc' => 'Wužywarje, kótarež su {{PLURAL:$1|cora|w slědnyma $1 dnjoma|w slědnych $1 dnjach|w slědnych $1 dnjach}} aktiwne byli',
@@ -1691,8 +1724,8 @@ Wótkazujśo lubjej na pótrjefjony bok.<br />
Bok wobjadnawa se ako bok wujasnjenja zapśimjeśa, gaž wótkazujo na nju [[MediaWiki:Disambiguationspage]].',
'doubleredirects' => 'Dwójne dalejpósrědnjenja',
-'doubleredirectstext' => 'Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.
-Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a teke na cel drugego dalejpósrědnjenja, což jo w normalnem paźe "napšawdny" celowy bok, na kótaryž by mógło prědne dalejpósrědnjenje pokazaś. <s>Pśešmarnjone</s> zapiski su južo wobstarane.',
+'doubleredirectstext' => 'Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.
+Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a teke na cel drugego dalejpósrědnjenja, což jo w normalnem paźe "napšawdny" celowy bok, na kótaryž by mógło prědne dalejpósrědnjenje pokazaś. <del>Pśešmarnjone</del> zapiski su južo wobstarane.',
'double-redirect-fixed-move' => '[[$1]] jo se pśesunuł, jo něnto dalejposrědnjenje do [[$2]]',
'double-redirect-fixer' => 'Pórěźaŕ dalejpósrědnjenjow',
@@ -1715,6 +1748,8 @@ Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a tek
'nmembers' => '$1 {{PLURAL:$1|zapis|zapisa|zapise}}',
'nrevisions' => '$1 {{PLURAL:$1|wobźěłanje|wobźěłani|wobźěłanja}}',
'nviews' => '$1 {{PLURAL:$1|wótpšašanje|wótpšašani|wótpšašanja}}',
+'nimagelinks' => 'Wužywa se na $1 {{PLURAL:$1|boku|bokoma|bokach|bokach}}',
+'ntransclusions' => 'wužywa se na $1 {{PLURAL:$1|boku|bokoma|bokach|bokach}}',
'specialpage-empty' => 'Toś ten bok njewopśimjejo tuchylu žedne zapise.',
'lonelypages' => 'Wósyrośone boki',
'lonelypagestext' => 'Slědujuce boki njejsu wótkazowe cele drugich bokow abo njezapśimuju se do drugich bokow w
@@ -1870,34 +1905,40 @@ Pódpěrane protokole: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Móžo wše kupki ze swójskego konta wótpóraś',
# E-mail user
-'mailnologin' => 'Njejo móžno e-mailku pósłaś.',
-'mailnologintext' => 'Dejš [[Special:UserLogin|pśizjawjony]] byś a płaśiwu e-mailowu adresu w swójich [[Special:Preferences|nastajenjach]] měś, aby drugim wužywarjam e-mail pósłał.',
-'emailuser' => 'Toś tomu wužywarjeju e-mail pósłaś',
-'emailpage' => 'E-mail wužywarjeju',
-'emailpagetext' => 'Móžoš slědujucy formular wužywaś, aby toś tomu wužywarjeju e-mail pósłał.
+'mailnologin' => 'Njejo móžno e-mailku pósłaś.',
+'mailnologintext' => 'Dejš [[Special:UserLogin|pśizjawjony]] byś a płaśiwu e-mailowu adresu w swójich [[Special:Preferences|nastajenjach]] měś, aby drugim wužywarjam e-mail pósłał.',
+'emailuser' => 'Toś tomu wužywarjeju e-mail pósłaś',
+'emailpage' => 'E-mail wužywarjeju',
+'emailpagetext' => 'Móžoš slědujucy formular wužywaś, aby toś tomu wužywarjeju e-mail pósłał.
E-mailowa adresa, kótaruž sy zapódał w [[Special:Preferences|swójich wužywarskich nastajenjach]], zjawi se ako adresa w pólu "Wót" e-maile, aby dostawaŕ móžo śi direktnje wótegroniś.',
-'usermailererror' => 'E-mailowy objekt jo zmólku wrośił.',
-'defemailsubject' => '{{SITENAME}} e-mail',
-'noemailtitle' => 'E-mailowa adresa felujo.',
-'noemailtext' => 'Toś ten wužywaŕ njejo pódał płaśiwu e-mailowu adresu.',
-'nowikiemailtitle' => 'Žedna e-mail dowólona',
-'nowikiemailtext' => 'Toś ten wužywaŕ njoco žednu e-mail wót drugich wužywarjow dostaś.',
-'email-legend' => 'Drugemu wužywarjeju {{SITENAME}} e-mail pósłaś',
-'emailfrom' => 'Wót:',
-'emailto' => 'Komu:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'Powěsć:',
-'emailsend' => 'Wótpósłaś',
-'emailccme' => 'Pósćel mě kopiju e-maila.',
-'emailccsubject' => 'Kopija Twójeje powěsći na $1: $2',
-'emailsent' => 'e-mail wótposłany',
-'emailsenttext' => 'Twój e-mail jo se wótpósłał.',
-'emailuserfooter' => 'Toś ta e-mailka jo se z pomocu funkcije "Toś tomu wužywarjeju e-mail pósłaś" na {{SITENAME}} wót $1 do $2 pósłała.',
+'usermailererror' => 'E-mailowy objekt jo zmólku wrośił.',
+'defemailsubject' => '{{SITENAME}} e-mail',
+'usermaildisabled' => 'Wužywarska e-mail znjemóžnjona',
+'usermaildisabledtext' => 'Njamóžoš w toś tym wikiju drugim wužywarjam e-mail pósłaś',
+'noemailtitle' => 'E-mailowa adresa felujo.',
+'noemailtext' => 'Toś ten wužywaŕ njejo pódał płaśiwu e-mailowu adresu.',
+'nowikiemailtitle' => 'Žedna e-mail dowólona',
+'nowikiemailtext' => 'Toś ten wužywaŕ njoco žednu e-mail wót drugich wužywarjow dostaś.',
+'email-legend' => 'Drugemu wužywarjeju {{SITENAME}} e-mail pósłaś',
+'emailfrom' => 'Wót:',
+'emailto' => 'Komu:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'Powěsć:',
+'emailsend' => 'Wótpósłaś',
+'emailccme' => 'Pósćel mě kopiju e-maila.',
+'emailccsubject' => 'Kopija Twójeje powěsći na $1: $2',
+'emailsent' => 'e-mail wótposłany',
+'emailsenttext' => 'Twój e-mail jo se wótpósłał.',
+'emailuserfooter' => 'Toś ta e-mailka jo se z pomocu funkcije "Toś tomu wužywarjeju e-mail pósłaś" na {{SITENAME}} wót $1 do $2 pósłała.',
+
+# User Messenger
+'usermessage-summary' => 'Systemowu powěźeńku zawóstajis.',
+'usermessage-editor' => 'Systemowy powěstnik',
# Watchlist
'watchlist' => 'Wobglědowańka',
'mywatchlist' => 'mója wobglědowańka',
-'watchlistfor' => "(za wužywarja '''$1''')",
+'watchlistfor2' => 'Za wužywarja $1 $2',
'nowatchlist' => 'Žedne zapise w twójej wobglědowańce.',
'watchlistanontext' => 'Dejš $1, aby mógał swóju wobglědowańku wiźeś abo zapise w njej wobźěłaś.',
'watchnologin' => 'Njepśizjawjony(a)',
@@ -2013,7 +2054,10 @@ Slědnu změnu k bokoju jo pśewjadł [[User:$3|$3]] ([[User talk:$3|diskusija]]
'revertpage' => 'Změny wužywarja [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]) su se wótwrośili a slědna wersija wužywarja [[User:$1|$1]] jo se wótnowiła.',
'revertpage-nouser' => 'Jo změny wót (wužywarske mě wótpórane) na slědnu wersiju wót [[User:$1|$1]] slědk stajił',
'rollback-success' => 'Změny wót $1 su se slědk wzeli a slědna wersija wót $2 jo zasej se nawrośiła.',
-'sessionfailure' => 'Problem z twójim wužywarskim pósejźenim jo se wujawił.
+
+# Edit tokens
+'sessionfailure-title' => 'Pósejźeńska zmólka',
+'sessionfailure' => 'Problem z twójim wužywarskim pósejźenim jo se wujawił.
Wěstoty dla jo akcija se pśetergnuła, aby se zadorało wopacnemu pśirědowanjoju twójeje změny drugemu wužywarjeju.
Pšosym nawroś se na bok, wót kótaregož sy pśišeł a wopytaj hyšći raz.',
@@ -2140,18 +2184,22 @@ $1',
'month' => 'wót mjaseca (a jěsnjej):',
'year' => 'wót lěta (a jěsnjej):',
-'sp-contributions-newbies' => 'Pśinoski jano za nowych wužywarjow pokazaś',
-'sp-contributions-newbies-sub' => 'Za nowackow',
-'sp-contributions-newbies-title' => 'Wužywarske pśinoski nowych kontow',
-'sp-contributions-blocklog' => 'Protokol blokěrowanjow',
-'sp-contributions-deleted' => 'Wulašowane wužywarske pśinoski',
-'sp-contributions-logs' => 'protokole',
-'sp-contributions-talk' => 'diskusija',
-'sp-contributions-userrights' => 'Zastojanje wužywarskich pšawow',
-'sp-contributions-blocked-notice' => 'Toś ten wužywaŕ jo tuchylu blokěrowany. Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:',
-'sp-contributions-search' => 'Pśinoski pytaś',
-'sp-contributions-username' => 'IP-adresa abo wužywarske mě:',
-'sp-contributions-submit' => 'PytaÅ›',
+'sp-contributions-newbies' => 'Pśinoski jano za nowych wužywarjow pokazaś',
+'sp-contributions-newbies-sub' => 'Za nowackow',
+'sp-contributions-newbies-title' => 'Wužywarske pśinoski nowych kontow',
+'sp-contributions-blocklog' => 'Protokol blokěrowanjow',
+'sp-contributions-deleted' => 'Wulašowane wužywarske pśinoski',
+'sp-contributions-uploads' => 'nagraśa',
+'sp-contributions-logs' => 'protokole',
+'sp-contributions-talk' => 'diskusija',
+'sp-contributions-userrights' => 'Zastojanje wužywarskich pšawow',
+'sp-contributions-blocked-notice' => 'Toś ten wužywaŕ jo tuchylu blokěrowany. Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:',
+'sp-contributions-blocked-notice-anon' => 'Toś ta IP-adresa jo tuchylu zablokěrowana.
+Nejnowšy zapisk protokola blokěrowanjow pódawa se dołojce ako referenca:',
+'sp-contributions-search' => 'Pśinoski pytaś',
+'sp-contributions-username' => 'IP-adresa abo wužywarske mě:',
+'sp-contributions-toponly' => 'Jano wuše wersije pokazaś',
+'sp-contributions-submit' => 'PytaÅ›',
# What links here
'whatlinkshere' => 'Wótkaze na toś ten bok',
@@ -2210,7 +2258,6 @@ Glědaj do [[Special:IPBlockList|lisćiny aktiwnych blokěrowanjow]], aby blokě
'ipb-edit-dropdown' => 'Pśicyny blokěrowanja wobźěłaś',
'ipb-unblock-addr' => '$1 dopušćiś',
'ipb-unblock' => 'Wužywarske mě abo IP-adresu dopušćiś',
-'ipb-blocklist-addr' => 'Eksistěrujuce blokěrowanja za $1',
'ipb-blocklist' => 'Wšykne aktualne blokěrowanja pokazaś',
'ipb-blocklist-contribs' => 'Pśinoski za $1',
'unblockip' => 'Wužywarja dopušćiś',
@@ -2279,6 +2326,8 @@ $1 jo južo zablokěrowany. Coš nastajenja změniś?',
'sorbs_create_account_reason' => 'Twója IP-adresa jo w DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} ako wócynjony proxy zapisana. Njejo móžno, nowe wužywarske konta załožowaś.',
'cant-block-while-blocked' => 'Njesmějoš žednych drugich wužywarjow blokěrowaś, mjaztym až ty sy blokěrowany.',
'cant-see-hidden-user' => 'Wužywaŕ, kótaregož wopytujoš blokěrowaś, jo južo zablokěrowany a schowany. Dokulaž njamaš pšawo wužywarja schowaś, njamóžoš blokěrowanje wužywarja wiźeś abo wobźěłaś.',
+'ipbblocked' => 'Njamóžoš drugich wužywarjow blokěrowaś abo wótblokěrowaś, dokulaž ty sam jo zablokěrowany',
+'ipbnounblockself' => 'Njesmějoš se samogo wótblokěrowaś',
# Developer tools
'lockdb' => 'Datowu banku zamknuÅ›',
@@ -2312,6 +2361,17 @@ Sy zagronity, až wótkaze wjedu tam, źož maju wjasć.
'''WARNOWANJE!'''
To móžo byś drastiska a njewocakowana změna za popularny bok;
pšosym zawěsć, až konsekwency rozmijoš, nježli až pókšacujoš.",
+'movepagetext-noredirectfixer' => "Z pomocu slědujucego formulara móžoš bok pśemjenjowaś, pśi comž se jogo wersije k nowemu mjenjoju pśesuwaju.
+Stary titel wordujo dalejpósrědnjeński bok k nowemu titeloju.
+Móžoš awtomatiski aktualizěrowaś dalejposrědkowanja, kótarež pokazuju na originalny titel.
+Jolic njocoš, pśeglědaj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|defektnymi daleposrědkowanjami]].
+Sy zagronity, až wótkaze wjedu tam, źož maju wjasć.
+
+Źiwaj na to, až se bok '''nje'''pśesuwa, jolic jo južo bok z nowym titelom, snaźkuli jo prozny abo dalejpósrědnjenje a njama stare wobźěłane wersije. To ma groniś, až móžoš bok zasej slědk pśemjenjowaś, jolic cyniš zmólku, a njemóžoš eksistěrujucy bok pśepisaś.
+
+'''WARNOWANJE!'''
+To móžo byś drastiska a njewocakowana změna za popularny bok;
+pšosym źiwaj na to, až rozumijoš konsekwency, nježli až pókšacujoš.",
'movepagetalktext' => "Pśisłušny diskusijny bok se sobu pśesunjo, '''ale nic gaž:'''
* eksistěrujo južo diskusijny bok z toś tym mjenim, abo gaž
* wótwólijoš toś tu funkciju.
@@ -2366,6 +2426,7 @@ Bok „[[:$1]]“ južo eksistěrujo. Coš jen wulašowaś, aby mógał toś ten
'immobile-source-page' => 'Toś ten bok njedajo se pśesunuś.',
'immobile-target-page' => 'Njejo móžno na toś ten celowy bok pśesunuś.',
'imagenocrossnamespace' => 'Dataja njedajo se pśesunuś do mjenjowego ruma, kótarež njejo za dataje.',
+'nonfile-cannot-move-to-file' => 'Njedataje njedaje se do datajowego mjenjowego ruma pśesunuś',
'imagetypemismatch' => 'Nowy datajowy sufiks swójomu typoju njewótpowědujo',
'imageinvalidfilename' => 'Mě celoweje dataje jo njepłaśiwe',
'fix-double-redirects' => 'Dalejpósrědnjenja, kótarež wótkazuju na originalny titel, aktualizěrowaś',
@@ -2444,6 +2505,7 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
'importstart' => 'Importěrowanje bokow...',
'import-revision-count' => '$1 {{PLURAL:$1|wersija|wersiji|wersije}}',
'importnopages' => 'Boki za importěrowanje njeeksistěruju.',
+'imported-log-entries' => '$1 {{PLURAL:$1|protokolowy zapisk importěrowany|protokolowej zapiska inmportěrowanej|protokolowe zapiski importěrowane|protokolowych zapiskow importěrowanych}}.',
'importfailed' => 'Zmólka pśi importěrowanju: $1',
'importunknownsource' => 'Njeznate źrědło importěrowanja.',
'importcantopen' => 'Dataja za importěrowanje njejo se dała wócyniś.',
@@ -2537,6 +2599,8 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
'tooltip-rollback' => '"Roolback" anulěrujo změny slědnego wužywarja na toś tom boku z jadnym kliknjenim.',
'tooltip-undo' => 'Anulěrujo toś tu změnu a wócynijo wobźěłański formular w pśeglědowem modusu.
W zespominanju dajo se pśicyna pódaś.',
+'tooltip-preferences-save' => 'Nastajenja składowaś',
+'tooltip-summary' => 'Zapódaj krotke zespominanje',
# Stylesheets
'common.css' => '/** Na toś tom městnje wustatkujo se CSS na wšykne šaty. */',
@@ -2647,14 +2711,17 @@ $1',
'imagemaxsize' => "Maksimalna wobrazowa wjelikosć:<br />'' (za boki datajowego wopisanja)''",
'thumbsize' => 'Rozměra miniaturow:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|bok|boka|boki|bokow}}',
-'file-info' => '(wjelikosć dataje: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 pikselow, wjelikosć dataje: $3, MIME-Typ: $4)',
+'file-info' => 'wjelikosć dataje: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 pikselow, wjelikosć dataje: $3, MIME-Typ: $4',
'file-nohires' => '<small>Wuše wótgranicowanje njeeksistěrujo.</small>',
-'svg-long-desc' => '(dataja SVG, nominalnje: $1 × $2 piksele, wjelikosć dataje: $3)',
+'svg-long-desc' => 'dataja SVG, nominalnje: $1 × $2 piksele, wjelikosć dataje: $3',
'show-big-image' => 'Połne optiske wótgranicowanje.',
'show-big-image-thumb' => '<small>wjelikosć pśeglěda: $1 × $2 pikselow</small>',
'file-info-gif-looped' => 'bźezkóńcna šlejfa',
'file-info-gif-frames' => '$1 {{PLURAL:$1|wobłuk|wobłuka|wobłuki|wobłukow}}',
+'file-info-png-looped' => 'Å¡lejfa',
+'file-info-png-repeat' => '{{PLURAL:$1|$1 raz|dwójcy|$1 raze|$1 razow}} wótegrata',
+'file-info-png-frames' => '$1 {{PLURAL:$1|wobłuk|wobłuka|wobłuki|wobłukow}}',
# Special:NewFiles
'newimages' => 'Nowe dataje',
@@ -2808,6 +2875,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
'exif-gpsareainformation' => 'MÄ› wobcerka GPS',
'exif-gpsdatestamp' => 'Datum GPS',
'exif-gpsdifferential' => 'Diferencialna korektura GPS',
+'exif-objectname' => 'Krotki titel',
# EXIF attributes
'exif-compression-1' => 'Njekompriměrowany',
@@ -2967,24 +3035,24 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
'limitall' => 'wšykne',
# E-mail address confirmation
-'confirmemail' => 'E-mailowu adresu wobkšuśiś.',
-'confirmemail_noemail' => 'W swójich [[Special:Preferences|nastajenjach]] njejsy płaśecu e-mailowu adresu zapódał.',
-'confirmemail_text' => '{{SITENAME}} pomina, až wobkšuśijoš swóju e-mailowu adresu, nježlic až móžoš e-mailowe funkcije wužywaś. Tłocyš-lic na tłocatko, dostanjoš e-mailku, w kótarejž jo wótkaz z wobkšuśenskim gronidłom. Tłocenje na wótkaz wobkšuśijo, až twója e-mailowa adresa jo korektna.',
-'confirmemail_pending' => 'Tebje jo južo jadno wobkšuśeńske gronidło se pśimailowało. Sy-lic swójo wužywarske konto akle gano wutwórił, ga pócakaj hyšći žedne minuty na e-mail, nježlic až pominaš nowe gronidło.',
-'confirmemail_send' => 'Wobkšuśeńske gronidło pósłaś',
-'confirmemail_sent' => 'Wobkšuśeńska e-mailka pósłana.',
-'confirmemail_oncreate' => 'Na Twóju adresu jo se wótpósłało wobkšuśeńske gronidło. Toś ten kod njejo notny za pśizjawjenje, ale za aktiwěrowanje e-mailowych funkcijow we wikiju.',
-'confirmemail_sendfailed' => '{{SITENAME}} njejo se mógła twóju wobkšuśensku e-mail pósłaś. Pšosym pśeglědaj swóju e-mailowu adresu na njepłaśiwe znamuška.
+'confirmemail' => 'E-mailowu adresu wobkšuśiś.',
+'confirmemail_noemail' => 'W swójich [[Special:Preferences|nastajenjach]] njejsy płaśecu e-mailowu adresu zapódał.',
+'confirmemail_text' => '{{SITENAME}} pomina, až wobkšuśijoš swóju e-mailowu adresu, nježlic až móžoš e-mailowe funkcije wužywaś. Tłocyš-lic na tłocatko, dostanjoš e-mailku, w kótarejž jo wótkaz z wobkšuśenskim gronidłom. Tłocenje na wótkaz wobkšuśijo, až twója e-mailowa adresa jo korektna.',
+'confirmemail_pending' => 'Tebje jo južo jadno wobkšuśeńske gronidło se pśimailowało. Sy-lic swójo wužywarske konto akle gano wutwórił, ga pócakaj hyšći žedne minuty na e-mail, nježlic až pominaš nowe gronidło.',
+'confirmemail_send' => 'Wobkšuśeńske gronidło pósłaś',
+'confirmemail_sent' => 'Wobkšuśeńska e-mailka pósłana.',
+'confirmemail_oncreate' => 'Na Twóju adresu jo se wótpósłało wobkšuśeńske gronidło. Toś ten kod njejo notny za pśizjawjenje, ale za aktiwěrowanje e-mailowych funkcijow we wikiju.',
+'confirmemail_sendfailed' => '{{SITENAME}} njejo se mógła twóju wobkšuśensku e-mail pósłaś. Pšosym pśeglědaj swóju e-mailowu adresu na njepłaśiwe znamuška.
E-mailowy program jo wrośił: $1',
-'confirmemail_invalid' => 'Njepłaśece wobkšuśeńske gronidło. Snaź jo kod mjaztym płaśiwosć zgubił.',
-'confirmemail_needlogin' => 'Dejš $1 aby swóju e-mailowu adresu wobkšuśił.',
-'confirmemail_success' => 'Twója e-mailowa adresa jo wobkšuśona
+'confirmemail_invalid' => 'Njepłaśece wobkšuśeńske gronidło. Snaź jo kod mjaztym płaśiwosć zgubił.',
+'confirmemail_needlogin' => 'Dejš $1 aby swóju e-mailowu adresu wobkšuśił.',
+'confirmemail_success' => 'Twója e-mailowa adresa jo wobkšuśona
Móžoš se něnto [[Special:UserLogin|pśizjawiś]] a se wikiju wijaseliś.',
-'confirmemail_loggedin' => 'Twója e-mailowa adresa jo něnto wobkšuśona.',
-'confirmemail_error' => 'Zmólka pśi wobkšuśenju e-mailoweje adresy.',
-'confirmemail_subject' => '{{SITENAME}} - Wobkšuśenje e-mailoweje adrese',
-'confirmemail_body' => 'Něchten, nejskerjej ty z adresy $1, jo na boku {{SITENAME}} wužywarske konto "$2" z toś teju e-mailoweju adresu zregistrěrował.
+'confirmemail_loggedin' => 'Twója e-mailowa adresa jo něnto wobkšuśona.',
+'confirmemail_error' => 'Zmólka pśi wobkšuśenju e-mailoweje adresy.',
+'confirmemail_subject' => '{{SITENAME}} - Wobkšuśenje e-mailoweje adrese',
+'confirmemail_body' => 'Něchten, nejskerjej ty z adresy $1, jo na boku {{SITENAME}} wužywarske konto "$2" z toś teju e-mailoweju adresu zregistrěrował.
Aby wobkšuśił, až toś to konto napšawdu śi słuša a aby e-mailowe funkcije na boce {{SITENAME}} aktiwěrował, wócyń toś ten wótkaz w swójim browserje:
@@ -2995,8 +3063,30 @@ Jolic až *njejsy* toś to konto zregistrěrował, slěduj toś tomu wótkazoju,
$5
Toś ten wobkšuśeński kod płaśi do $4.',
-'confirmemail_invalidated' => 'Emailowe wobkšuśenje pśetergnjone',
-'invalidateemail' => 'Emailowe wobkšuśenje pśetergnuś',
+'confirmemail_body_changed' => 'Něchten, nejskerjej ty z IP-adresy $1, jo e-mailowu adresu konta "$2" do toś teje adrese na {{GRAMMAR:lokatiw{{SITENAME}}}} změnił.
+
+Aby wobkšuśił, až toś to konto napšawdu śi słuša a aby e-mailowe funkcije na {{GRAMMAR:lokatiw{{SITENAME}}}} aktiwěrował, wócyń toś ten wótkaz w swójom wobglědowaku:
+
+$3
+
+Jolic toś to konto śi *nje*słuša, slěduj toś tomu wótkazoju, aby wobkśuśenje e-mejloweje adrese anulěrował:
+
+$5
+
+Toś ten wobkšuśeński kod płaśi až do $4.',
+'confirmemail_body_set' => 'Něchten, nejskerjej ty z IP-adresy $1, jo e-mailowu adresu konta "$2" do toś teje adrese na {{GRAMMAR:lokatiw{{SITENAME}}}} změnił.
+
+Aby wobkšuśił, až toś to konto napšawdu śi słuša a aby e-mailowe funkcije na {{GRAMMAR:lokatiw{{SITENAME}}}} aktiwěrował, wócyń toś ten wótkaz w swójom wobglědowaku:
+
+$3
+
+Jolic toś to konto śi *nje*słuša, slěduj toś tomu wótkazoju, aby wobkśuśenje e-mejloweje adrese anulěrował:
+
+$5
+
+Toś ten wobkšuśeński kod płaśi až do $4.',
+'confirmemail_invalidated' => 'Emailowe wobkšuśenje pśetergnjone',
+'invalidateemail' => 'Emailowe wobkšuśenje pśetergnuś',
# Scary transclusion
'scarytranscludedisabled' => '[Pśidawanje interwiki jo deaktiwěrowane]',
@@ -3036,6 +3126,7 @@ Pšosym wobkšuśiś, až napšawdu coš ten bok zasej wutwóriś.",
'table_pager_first' => 'Prědny bok',
'table_pager_last' => 'Slědny bok',
'table_pager_limit' => 'PokazaÅ› {{PLURAL:$1|$1 objekt|$1 objekta|$1 objekty}} na bok',
+'table_pager_limit_label' => 'Zapiski na bok:',
'table_pager_limit_submit' => 'Start',
'table_pager_empty' => 'Žedne wuslědki',
@@ -3103,6 +3194,7 @@ MóžoÅ¡ teke [[Special:Watchlist/edit|standardny wobźěłowaÅ„ski bok wužywaÅ
'version-specialpages' => 'Specialne boki',
'version-parserhooks' => 'Parserowe kokule',
'version-variables' => 'Wariable',
+'version-skins' => 'Suknje',
'version-other' => 'Druge',
'version-mediahandlers' => 'Pśeźěłaki medijow',
'version-hooks' => 'Kokule',
@@ -3114,6 +3206,13 @@ MóžoÅ¡ teke [[Special:Watchlist/edit|standardny wobźěłowaÅ„ski bok wužywaÅ
'version-hook-subscribedby' => 'Aboněrowany wót',
'version-version' => '(Wersija $1)',
'version-license' => 'Licenca',
+'version-poweredby-credits' => "Toś ten wiki spěchujo se wót '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'druge',
+'version-license-info' => 'MediaWiki jo licha softwara: móžoš ju pód wuměnjenjami licence GNU General Public License, wózjawjeneje wót załožby Free Software Foundation, rozdźěliś a/abo změniś: pak pód wersiju 2 licence pak pód někakeju pózdźejšeju wersiju.
+
+MediaWiki rozdźěla se w naźeji, až buźo wužitny, ale BŹEZ GARANTIJE: samo bźez wopśimjoneje garantije PŚEDAWAJOBNOSĆI abo PŚIGÓDNOSĆI ZA WĚSTY ZAMĚR. Glědaj GNU general Public License za dalšne drobnostki.
+
+Ty by dejał [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licence GNU General Public License] gromaźe z toś tym programom dostanu měś: jolic nic, napiš do załožby Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA abo [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html pśecytaj ju online].',
'version-software' => 'Instalěrowana software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Wersija',
@@ -3183,6 +3282,15 @@ Zapódaj datajowe mě bźez prefiksa "{{ns:file}}:".',
'tags-edit' => 'wobźěłaś',
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
+# Special:ComparePages
+'comparepages' => 'Boki pśirownaś',
+'compare-selector' => 'Wersije boka pśirownaś',
+'compare-page1' => 'Bok 1',
+'compare-page2' => 'Bok 2',
+'compare-rev1' => 'Wersija 1',
+'compare-rev2' => 'Wersija 2',
+'compare-submit' => 'Pśirownaś',
+
# Database error messages
'dberr-header' => 'ToÅ› ten wiki ma problem',
'dberr-problems' => 'Wódaj! Toś to sedło ma techniske śěžkosći.',
@@ -3199,8 +3307,13 @@ Zapódaj datajowe mě bźez prefiksa "{{ns:file}}:".',
'htmlform-float-invalid' => 'Gódnota, kótaruž sy pódał, njejo licba.',
'htmlform-int-toolow' => 'Gódnota, kótaruž sy pódał, jo mjeńša ako minimum $1',
'htmlform-int-toohigh' => 'Gódnota, kótaruž sy pódał, jo wětša ako maksimum $1',
+'htmlform-required' => 'Toś ta gódnota jo trěbna',
'htmlform-submit' => 'Wótpósłaś',
'htmlform-reset' => 'Změny anulěrowaś',
'htmlform-selectorother-other' => 'Druge',
+# SQLite database support
+'sqlite-has-fts' => 'Wersija $1 z pódpěru za połnotekstowe pytanje',
+'sqlite-no-fts' => 'Wersija $1 bźez pódpěry za połnotekstowe pytanje',
+
);
diff --git a/languages/messages/MessagesDz.php b/languages/messages/MessagesDz.php
index a68c2d42..662f85a3 100644
--- a/languages/messages/MessagesDz.php
+++ b/languages/messages/MessagesDz.php
@@ -171,7 +171,7 @@ $messages = array(
# Login and logout pages
'yourname' => 'ལག་ལེན་པའི་མིང་:',
'yourpassword' => 'ཆོག་ཡིག:',
-'remembermypassword' => 'གློག་རིག་དེ་གུར་ ངེ་གི་ནང་བསà¾à¾±à½¼à½‘་སེམས་à½à½¢à¼‹à½–ཞགà¼',
+'remembermypassword' => 'གློག་རིག་དེ་གུར་ ངེ་གི་ནང་བསà¾à¾±à½¼à½‘་སེམས་à½à½¢à¼‹à½–ཞག (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'ནང་བསà¾à¾±à½¼à½‘à¼',
'nav-login-createaccount' => 'ནང་བསà¾à¾±à½¼à½‘་འབད་ / རྩིས་à½à½¼à¼‹à½‚སརཔ་བཟོà¼',
'loginprompt' => '{{SITENAME}} ནང་ལུ་ ནང་བསà¾à¾±à½¼à½‘་འབད་ནིའི་དོན་ལུ་ à½à¾±à½¼à½‘་ཀྱིས་ ཀུ་ཀིསི་འདི་ལྕོགས་ཅན་བཟོ་དགོà¼',
@@ -266,8 +266,6 @@ $messages = array(
'copyrightwarning' => "{{SITENAME}} ལུ་ ཕུལ་མི་ཞལ་འདེབས་ཚུ་ $2 གི་འོག་ལུ་ གསར་བà½à½¼à½“་འབད་ནིའི་ཆ་འཇོག་གྲུབ་ཡོདཔ་(à½à¼‹à½‚སལ་གྱི་དོན་ལས་ $1 ལུ་བལྟ་)༠གལ་སྲིད་ à½à¾±à½¼à½‘་རའི་འབྲི་ལཱ་འདི་ ཞུན་དག་དང་ལོག་བཀྲམ་མ་འབད་ནི་ཨིན་པ་ཅིན་ ནཱ་ལུ་མ་ཕུལà¼<br />
དེ་མ་ཚད་à½à¾±à½¼à½‘་ཀྱིས་ ང་བཅས་ལུ་ དེ་à½à¾±à½¼à½‘་རང་གིས་བྲིས་འབྲིà½à¼‹à½‘ང་ མི་མང་ཌོ་མཱེན་ ཡང་ན་ རྒྱུ་à½à½´à½„ས་སྟོང་མར་ནང་ལས་འདྲ་བཤུས་བརà¾à¾±à½–ས་རà¾à¾±à½–་ཨིནམ་སྦེ་ བཤདཔ་ཨིན་པསà¼
'''གནང་བ་མེད་པར་ འདྲ་བཤུས་དབང་ཆ་ཅན་གྱི་ལཱ་མ་ཕུལ་!'''",
-'longpagewarning' => "'''ཉེན་བརྡ་: ཤོག་ལེབ་འདི་རིང་ཚད་ ཀི་ལོ་བའིཊིསི་ $1 ཡོདཔ་དང་ བརྡ་འཚོལ་ལ་ལོ་ཅིག་ནང་ ཀི་ལོ་བའིཊི་ ༣༢ ལས་ལྷག་སྟེ་ཡོད་པའི་ཤོག་ལེབ་ ཞུན་དག་འབད་ནི་ལུ་དཀའ་ངལ་འབྱུང་དོ་ཡོདཔ་ཨིནà¼
-ཤོག་ལེབ་འདི་ བགོ་བཤའ་རà¾à¾±à½–་སྟེ་ཆུང་ཀུ་བཟོ་ནི་ལུ་ཆ་འཇོག་འབད་གནང་à¼'''",
'templatesused' => 'ཤོག་ལེབ་འདི་གུ་ལག་ལེན་འà½à½–་ཡོད་པའི་ཊེམ་པེལེཊི:',
'templatesusedpreview' => 'སྔོན་ལྟ་འདི་ནང་ལག་ལེན་འà½à½–་ཡོད་པའི་ {{PLURAL:$1|Template|Templates}} :',
'template-protected' => '(ཉེན་སà¾à¾±à½¼à½–་འབད་ཡོདཔà¼)',
@@ -468,7 +466,6 @@ $messages = array(
# Watchlist
'watchlist' => 'ངེ་གི་བལྟ་ཞིབ་à½à½¼à¼‹à½¡à½²à½‚à¼',
'mywatchlist' => 'ངེ་གི་བལྟ་ཞིབ་à½à½¼à¼‹à½¡à½²à½‚à¼',
-'watchlistfor' => "('''$1''' གི་དོན་ལུ་)",
'addedwatch' => 'བལྟ་ཞིབ་à½à½¼à¼‹à½¡à½²à½‚་ལུ་à½à¼‹à½¦à¾à½¼à½„་རà¾à¾±à½–་ཅིà¼',
'addedwatchtext' => "ཤོག་ལེབ་ \"[[:\$1]]\" འདི་ à½à¾±à½¼à½‘་རའི་ [[Special:Watchlist|watchlist]] ལུ་ à½à¼‹à½¦à¾à½¼à½„་བརà¾à¾±à½–ས་ནུགà¼\\n
ཤོག་ལེབ་དེ་ལུ་མ་འོངས་བསྒྱུར་བཅོས་དང་ དེ་གི་འབྲེལ་ཡོད་བློ་ཤོག་འདི་ དེ་à½à½¢à¼‹à½à½¼à¼‹à½–ཀོད་འབད་ནི་དང་ འཇམ་à½à½¼à½„་à½à½¼à¼‹à½¦à¾¦à½ºà¼‹à½‚དམ་à½à¼‹à½–རà¾à¾±à½–་ཚུགས་ནི་གི་དོན་ལུ་ ཤོག་ལེབ་འདི་ [[Special:RecentChanges|list of recent changes]] ནང་ལུ་ '''མངོན་གསལ་''' སྦེ་འབྱུང་འོང་à¼",
@@ -658,9 +655,9 @@ $messages = array(
'nextdiff' => 'ཤུལ་མམ་གྱི་à½à¾±à½‘་པར་ →',
# Media information
-'file-info-size' => '($1 × $2 པིག་སེལ་ ཡིག་སྣོད་ཀྱི་ཚད་: $3 མའིམ་དབྱེ་བ་: $4)',
+'file-info-size' => '$1 × $2 པིག་སེལ་ ཡིག་སྣོད་ཀྱི་ཚད་: $3 མའིམ་དབྱེ་བ་: $4',
'file-nohires' => '<small>ཧུམ་ཆ་ལེགས་ཤོམ་མིན་འདུགà¼</small>',
-'svg-long-desc' => '(ཨེསི་བི་ཇི་ཡིག་སྣོད་ $1 × $2 པིག་སེལསི་ཆུང་སུ་ཅིག་ ཡིག་སྣོད་ཚད་: $3)',
+'svg-long-desc' => 'ཨེསི་བི་ཇི་ཡིག་སྣོད་ $1 × $2 པིག་སེལསི་ཆུང་སུ་ཅིག་ ཡིག་སྣོད་ཚད་: $3',
'show-big-image' => 'ཧུམ་ཆ་གང་à¼',
'show-big-image-thumb' => '<small>སྔོན་ལྟའི་ཚད་: $1 × $2 པིག་སེལསི་</small>',
diff --git a/languages/messages/MessagesEe.php b/languages/messages/MessagesEe.php
index f1c4aa2a..0a879a9c 100644
--- a/languages/messages/MessagesEe.php
+++ b/languages/messages/MessagesEe.php
@@ -96,7 +96,6 @@ $messages = array(
# Vector skin
'vector-action-delete' => 'Tutui',
'vector-action-move' => 'Ɖɔli eƒe nɔƒe',
-'vector-namespace-main' => 'Axa',
'vector-view-create' => 'Dze egɔme',
'vector-view-edit' => 'Trɔ asi le eŋu',
'vector-view-history' => 'KpÉ” xoxoawo',
@@ -189,6 +188,7 @@ $messages = array(
'viewsourcefor' => '$1 tɔwo',
# Login and logout pages
+'remembermypassword' => 'Ɖo ŋku nyeƒe dzesi ŋkɔ dzi le mɔ sia dzi (vaseɖe {{PLURAL:$1|ŋkeke|ŋkeke}} $1 megbe)',
'login' => 'Ge É–e eme',
'nav-login-createaccount' => 'GeÉ–e me / ÅŠlÉ” Å‹kÉ”',
'userlogin' => 'Ge É–e eme / Å‹lÉ” Å‹kÉ” daÉ–i',
@@ -419,7 +419,6 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
'listgrouprights-group' => 'Hame',
# Watchlist
-'watchlistfor' => "(na '''$1''')",
'watch' => 'Le ŋku ɖe eŋu',
'watchthispage' => 'Le Å‹ku É–e axa sia Å‹u',
'wlnote' => "Afisia wofia {{PLURAL:$1|tɔtrɔ '''1''' mamlea|tɔtrɔ '''$1''' mamleawo}} le {{PLURAL:$2|gaƒoƒo mamlea si|gaƒoƒo '''$2''' mamleawo siwo}} vayi la me.",
diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php
index 50c97012..da4fece4 100644
--- a/languages/messages/MessagesEl.php
+++ b/languages/messages/MessagesEl.php
@@ -8,9 +8,11 @@
* @file
*
* @author Assassingr
+ * @author Azimout
* @author Badseed
* @author Consta
* @author Crazymadlover
+ * @author Dada
* @author Dead3y3
* @author Demmy
* @author Evropi
@@ -132,10 +134,10 @@ $specialPageAliases = array(
'Emailuser' => array( 'EmailΧÏήστη' ),
'Confirmemail' => array( 'ΕπιβεβαίωσηEmail' ),
'Whatlinkshere' => array( 'ΤιΣυνδέειΕδώ' ),
- 'Recentchangeslinked' => array( 'ΠÏόσφατεςΑλλαγέςΣυνδεδεμένες', 'ΣχετικέςΑλλαγές' ),
+ 'Recentchangeslinked' => array( 'ΣυνδεδεμένεςΠÏόσφατεςΑλλαγές', 'ΣχετικέςΑλλαγές' ),
'Movepage' => array( 'ΜετακίνησηΣελίδας' ),
'Blockme' => array( 'ΦÏαγήΕμένα' ),
- 'Booksources' => array( 'ΒιβλίωνΠηγές' ),
+ 'Booksources' => array( 'ΠηγέςΒιβλίων' ),
'Categories' => array( 'ΚατηγοÏίες' ),
'Export' => array( 'Εξαγωγή' ),
'Version' => array( 'Έκδοση' ),
@@ -174,7 +176,7 @@ $specialPageAliases = array(
);
$fallback8bitEncoding = 'iso-8859-7';
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zαβγδεζηθικλμνξοπÏστυφχψωςΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίόÏÏŽÏŠÏ‹ÎΰΆΈΉΊΌΎÎΪΫ]+)(.*)$/sDu';
@@ -272,7 +274,7 @@ $magicWords = array(
'img_framed' => array( '1', 'με-πλαίσιο', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'χωÏίς-πλαίσιο', 'frameless' ),
'img_page' => array( '1', 'σελίδα=$1', 'σελίδα $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'κατακόÏυφα', 'κατακόÏυφα =$1', 'κατακόÏυφα $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_upright' => array( '1', 'κατακόÏυφα', 'κατακόÏυφα=$1', 'κατακόÏυφα $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'πλαίσιο', 'border' ),
'img_baseline' => array( '1', 'γÏαμμήβάσης', 'baseline' ),
'img_sub' => array( '1', 'δείκτης', 'sub' ),
@@ -360,8 +362,7 @@ $messages = array(
'tog-editsection' => 'ΕνεÏγοποίηση επεξεÏγασίας τμημάτων μέσω των συνδέσμων [επεξεÏγασία]',
'tog-editsectiononrightclick' => 'ΕνεÏγοποίηση επεξεÏγασίας τμήματος με δεξί κλικ στους τίτλους των τμημάτων (JavaScript)',
'tog-showtoc' => 'Εμφάνιση πίνακα πεÏιεχομένων (για σελίδες με πεÏισσότεÏες από Ï„Ïεις κεφαλίδες)',
-'tog-rememberpassword' => 'ΔιατήÏηση του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης σε αυτό τον υπολογιστή',
-'tog-editwidth' => 'Επέκταση του πλαίσιου επεξεÏγασίας στο μέγιστο μέγεθος',
+'tog-rememberpassword' => 'ΔιατήÏηση της σÏνδεσης μου σε αυτόν τον browser (για ένα μέγιστο $1 {{PLURAL:$1|ημέÏας|ημεÏών}})',
'tog-watchcreations' => 'ΠÏόσθεσε τις σελίδες που δημιουÏγώ στη λίστα παÏακολοÏθησής μου',
'tog-watchdefault' => 'ΠÏοσθήκη των σελίδων που επεξεÏγάζεστε στη λίστα παÏακολοÏθησης.',
'tog-watchmoves' => 'ΠÏόσθεσε τις σελίδες που μετακινώ στη λίστα παÏακολοÏθησής μου',
@@ -502,31 +503,21 @@ $messages = array(
'faqpage' => 'Project:Συχνές εÏωτήσεις (FAQ)',
# Vector skin
-'vector-action-addsection' => 'ΠÏοσθήκη θέματος',
-'vector-action-delete' => 'ΔιαγÏαφή',
-'vector-action-move' => 'Μετακίνηση',
-'vector-action-protect' => 'ΠÏοστασία',
-'vector-action-undelete' => 'ΕπαναφοÏά',
-'vector-action-unprotect' => 'ΆÏση Ï€Ïοστασίας',
-'vector-namespace-category' => 'ΚατηγοÏία',
-'vector-namespace-help' => 'Σελίδα βοήθειας',
-'vector-namespace-image' => 'ΑÏχείο',
-'vector-namespace-main' => 'Σελίδα',
-'vector-namespace-media' => 'Σελίδα μέσου',
-'vector-namespace-mediawiki' => 'Μήνυμα',
-'vector-namespace-project' => 'Σελίδα εγχειÏήματος',
-'vector-namespace-special' => 'Ειδική σελίδα',
-'vector-namespace-talk' => 'Συζήτηση',
-'vector-namespace-template' => 'ΠÏότυπο',
-'vector-namespace-user' => 'Σελίδα χÏήστη',
-'vector-view-create' => 'ΔημιουÏγία',
-'vector-view-edit' => 'ΕπεξεÏγασία',
-'vector-view-history' => 'ΠÏοβολή ιστοÏικοÏ',
-'vector-view-view' => 'Ανάγνωση',
-'vector-view-viewsource' => 'Εμφάνιση κώδικα',
-'actions' => 'ΕνέÏγειες',
-'namespaces' => 'ΠεÏιοχές ονομάτων',
-'variants' => 'ΠαÏαλλαγές',
+'vector-action-addsection' => 'ΠÏοσθήκη θέματος',
+'vector-action-delete' => 'ΔιαγÏαφή',
+'vector-action-move' => 'Μετακίνηση',
+'vector-action-protect' => 'ΠÏοστασία',
+'vector-action-undelete' => 'ΕπαναφοÏά',
+'vector-action-unprotect' => 'ΆÏση Ï€Ïοστασίας',
+'vector-simplesearch-preference' => 'ΕνεÏγοποίηση ενισχυμένων Ï€Ïοτάσεων αναζήτησης',
+'vector-view-create' => 'ΔημιουÏγία',
+'vector-view-edit' => 'ΕπεξεÏγασία',
+'vector-view-history' => 'ΠÏοβολή ιστοÏικοÏ',
+'vector-view-view' => 'Ανάγνωση',
+'vector-view-viewsource' => 'Εμφάνιση κώδικα',
+'actions' => 'ΕνέÏγειες',
+'namespaces' => 'ΠεÏιοχές ονομάτων',
+'variants' => 'ΠαÏαλλαγές',
'errorpagetitle' => 'Σφάλμα',
'returnto' => 'ΕπιστÏοφή στη σελίδα $1.',
@@ -587,6 +578,9 @@ $messages = array(
ΠαÏακαλοÏμε πεÏιμένετε λίγο Ï€Ïιν ξαναπÏοσπαθήσετε να μπείτε σε αυτή τη σελίδα.
$1',
+'pool-timeout' => 'Διάλειμμα αναμονής για το κλείδωμα',
+'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}}',
@@ -747,7 +741,8 @@ $2',
'yourname' => 'Όνομα χÏήστη:',
'yourpassword' => 'Κωδικός:',
'yourpasswordagain' => 'ΠληκτÏολογήστε ξανά τον κωδικό',
-'remembermypassword' => 'ΔιατήÏηση του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης σε αυτόν τον υπολογιστή',
+'remembermypassword' => 'ΔιατήÏηση του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης σε αυτόν τον υπολογιστή (για μέγιστο $1 {{PLURAL:$1|ημέÏα|ημέÏες}})',
+'securelogin-stick-https' => 'Μείνετε συνδεδεμένοι με HTTPS μετά την είσοδο',
'yourdomainname' => 'Το domain σας:',
'externaldberror' => 'Είτε συνέβη κάποιο σφάλμα εξωτεÏικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτÏαπεί να ενημεÏώσετε τον εξωτεÏικό σας λογαÏιασμό.',
'login' => 'Είσοδος',
@@ -764,6 +759,7 @@ $2',
'gotaccount' => "Έχετε ήδη έναν λογαÏιασμό; '''$1'''.",
'gotaccountlink' => 'Είσοδος',
'createaccountmail' => 'Με ηλεκτÏονικό ταχυδÏομείο',
+'createaccountreason' => 'Αιτία:',
'badretype' => 'Οι κωδικοί που έχετε δηλώσει δεν συμφωνοÏν Î¼ÎµÏ„Î±Î¾Ï Ï„Î¿Ï…Ï‚.',
'userexists' => 'Το όνομα χÏήστη που εισαγάγατε ήδη χÏησιμοποιείται. ΠαÏακαλοÏμε, διαλέξτε διαφοÏετικό.',
'loginerror' => 'Σφάλμα σÏνδεσης',
@@ -783,6 +779,7 @@ $2',
'wrongpasswordempty' => 'Ο κωδικός Ï€Ïόσβασης που εισάχθηκε ήταν κενός. ΠαÏακαλοÏμε Ï€Ïοσπαθήστε ξανά.',
'passwordtooshort' => 'Οι κωδικοί Ï€Ïέπει να πεÏιέχουν τουλάχιστον {{PLURAL:$1|1 χαÏακτήÏα|$1 χαÏακτήÏες}}.',
'password-name-match' => 'Ο κωδικός σου θα Ï€Ïέπει να είναι διαφοÏετικός από το όνομα χÏήστη σου.',
+'password-login-forbidden' => 'Η χÏήση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… ονόματος χÏήστη και ÏƒÏ…Î½Î¸Î·Î¼Î±Ï„Î¹ÎºÎ¿Ï Î­Ï‡Î¿Ï…Î½ απαγοÏευτεί.',
'mailmypassword' => 'Αποστολή νέου κωδικοÏ',
'passwordremindertitle' => 'ΚαινοÏÏγιος Ï€ÏοσωÏινός κωδικός για το {{SITENAME}}',
'passwordremindertext' => 'Κάποιος (πιθανώς εσείς, από την διεÏθυνση IP $1) ζήτησε να σας στείλουμε ένα νέο κωδικό Ï€Ïόσβασης για τον ιστότοπο {{SITENAME}} ($4). Ο κωδικός Ï€Ïόσβασης για το χÏήστη "$2" είναι Ï„ÏŽÏα "$3". Αν το κάνατε εσείς, θα Ï€Ïέπει να συνδεθείτε και να αλλάξετε τον κωδικό Ï€Ïόσβασης σας Ï„ÏŽÏα. Ο Ï€ÏοσωÏινός σας κωδικός Ï€Ïόσβασης θα λήξει σε {{PLURAL:$5|μια ημέÏα|$5 ημέÏες}}.
@@ -818,6 +815,9 @@ $2',
'loginlanguagelabel' => 'Γλώσσα: $1',
'suspicious-userlogout' => 'Το αίτημα αποσÏνδεσής σας απεÏÏίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετÏητή (browser) ή διακομιστή Ï€ÏοσωÏινής αποθήκευσης.',
+# E-mail sending
+'php-mail-error-unknown' => 'Άγνωστο σφάλμα στη συνάÏτηση της PHP mail()',
+
# Password reset dialog
'resetpass' => 'Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
'resetpass_announce' => 'Συνδεθήκατε με ένα Ï€ÏοσωÏινό κωδικό, σταλμένο με e-mail. Για να ολοκληÏώσετε την σÏνδεση, Ï€Ïέπει να στείλετε ένα νέο κωδικό εδώ:',
@@ -869,9 +869,11 @@ $2',
'showlivepreview' => 'Άμεση Ï€Ïοεπισκόπιση',
'showdiff' => 'Δείτε τις αλλαγές',
'anoneditwarning' => "'''ΠÏοσοχή:''' Δεν έχετε συνδεθεί. Η διεÏθυνση IP σας θα καταγÏαφεί στο ιστοÏικό επεξεÏγασίας αυτής της σελίδας.",
+'anonpreviewwarning' => "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγÏάψει την διεÏθυνσή IP σας στο ιστοÏικό επεξεÏγασίας αυτής της σελίδας.''",
'missingsummary' => "'''ΥπενθÏμιση:''' Δεν έχετε συμπληÏώσει τη σÏνοψη επεξεÏγασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεÏγασία σας θα αποθηκευτεί χωÏίς σÏνοψη.",
'missingcommenttext' => 'ΠαÏακαλώ εισάγετε ένα σχόλιο παÏακάτω.',
-'missingcommentheader' => "'''ΥπενθÏμιση:''' Δεν έχετε καθοÏίσει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεÏγασία σας θα αποθηκευτεί χωÏίς θέμα ή επικεφαλίδα.",
+'missingcommentheader' => "'''ΥπενθÏμιση:''' Δεν έχετε γÏάψει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο.
+Αν κάνετε πάλι κλικ στο κουμπί \"{{int:savearticle}}\", η επεξεÏγασία σας θα αποθηκευτεί χωÏίς θέμα ή επικεφαλίδα.",
'summary-preview' => 'ΠÏοεπισκόπηση σÏνοψης:',
'subject-preview' => 'ΠÏοεπισκόπηση θέματος/επικεφαλίδας:',
'blockedtitle' => 'Ο χÏήστης έχει υποστεί φÏαγή.',
@@ -935,7 +937,11 @@ $2',
'userjsyoucanpreview' => "'''ΧÏήσιμη συμβουλή:''' ΧÏησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS Ï€Ïιν την αποθηκεÏσετε.",
'usercsspreview' => "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/Ï€Ïοεπισκόπηση του CSS του χÏήστη -δεν το έχετε ακόμα αποθηκεÏσει! '''",
'userjspreview' => "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/Ï€Ïοεπισκόπηση του JavaScript του χÏήστη -δεν το έχετε ακόμα αποθηκεÏσει!'''",
-'userinvalidcssjstitle' => "'''ΠÏοσοχή:''' Δεν υπάÏχει skin με τίτλο \"\$1\". Θυμηθείτε οι Ï€ÏοσαÏμοσμένες σελίδες .css και .js χÏησιμοποιοÏν έναν τίτλο με μικÏά γÏάμματα, Ï€.χ. {{ns:user}}:Foo/monobook.css σε αντίθεση με το {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "''' Θυμηθείτε ότι κάνετε μόνο Ï€Ïοεπισκόπηση σ' αυτή τη CSS.'' '
+'' ' Δεν το έχετε σώσει ακόμη!'' '",
+'sitejspreview' => "''' Θυμηθείτε ότι κάνετε μόνο Ï€Ïοεπισκόπηση σ'αυτόν τον κώδικα JavaScript.'' '
+'' ' Δεν τον έχετε αποθηκεÏσει ακόμη!'' '",
+'userinvalidcssjstitle' => "'''ΠÏοσοχή:''' Δεν υπάÏχει skin με τίτλο \"\$1\". Θυμηθείτε οι Ï€ÏοσαÏμοσμένες σελίδες .css και .js χÏησιμοποιοÏν έναν τίτλο με μικÏά γÏάμματα, Ï€.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
'updated' => '(ΕνημεÏώθηκε)',
'note' => "'''ΠÏοσοχή: '''",
'previewnote' => "'''Σας υπενθυμίζουμε ότι βλέπετε μόνον την Ï€Ïοεπισκόπηση -δεν έχετε ακόμα αποθηκεÏσει τις αλλαγές σας!'''",
@@ -972,9 +978,6 @@ $2',
'copyrightwarning2' => "Σημειώστε ότι όλες οι συνεισφοÏές στον ιστότοπο {{SITENAME}} μποÏοÏν να υποστοÏν επεξεÏγασία, να αλλαχθοÏν, ή να αφαιÏεθοÏν από άλλους συνεισφέÏοντες. Αν δεν θέλετε τα γÏαπτά σας να υποστοÏν επεξεÏγασία κατά βοÏληση, τότε μην τα τοποθετήσετε σε αυτό το χώÏο.<br />
Επίσης μας υπόσχεστε πως ÏŒ,τι γÏάφετε είναι δικό σας, ή αντιγÏαμμένο από μια πηγή που είναι κοινό κτήμα, ή μια παÏόμοια ελεÏθεÏη πηγή (δείτε $1 για λεπτομέÏειες).
'''ΠΑΡΑΚΑΛΟΥΜΕ ÎΑ ΜΗΠΤΟΠΟΘΕΤΕΙΤΕ ΠÎΕΥΜΑΤΙΚΑ ΚΑΤΟΧΥΡΩΜΕÎΟ ΕΡΓΟ ΧΩΡΙΣ ΑΔΕΙΑ!'''",
-'longpagewarning' => "'''ΠΡΟΕΙΔΟΠΟΙΗΣΗ''': Η σελίδα έχει μέγεθος $1 kb.
-Είναι πιθανόν μεÏικοί browser να παÏουσιάσουν Ï€Ïοβλήματα στην επεξεÏγασία σελίδων της τάξης των 32 kb και άνω.
-ΜποÏείτε να αποφÏγετε το Ï€Ïόβλημα κόβοντας τη σελίδα σε μικÏότεÏα τμήματα.",
'longpageerror' => "'''ΣΦΑΛΜΑ: Το κείμενο που αποστείλατε έχει μήκος $1 κιλομπάιτ,
το οποίο είναι μεγαλÏτεÏο από το μέγιστο των $2 κιλομπάιτ. Δεν μποÏεί να αποθηκευτεί.'''",
'readonlywarning' => "'''ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η βάση δεδομένων έχει κλειδωθεί για συντήÏηση, έτσι δεν θα μποÏέσετε να αποθηκεÏσετε αυτά που έχετε επεξεÏγαστεί. ΜποÏείτε αν θέλετε να αποθηκεÏσετε το κείμενο σε αÏχείο κειμένου (με αποκοπή-και-επικόλληση) για να το χÏησιμοποιήσετε αÏγότεÏα.'''
@@ -1151,6 +1154,8 @@ $2',
'logdelete-failure' => "'''Η οÏατότητα του καταλόγου δεν μποÏοÏσε να Ïυθμιστεί:'''
$1",
'revdel-restore' => 'Αλλαγή οÏατότητας',
+'revdel-restore-deleted' => 'διαγÏαμμένες αναθεωÏήσεις',
+'revdel-restore-visible' => 'οÏατές αναθεωÏήσεις',
'pagehist' => 'ΙστοÏικό σελίδας',
'deletedhist' => 'ΔιαγÏαμμένο ιστοÏικό',
'revdelete-content' => 'πεÏιεχόμενο',
@@ -1218,11 +1223,15 @@ $1",
# Diffs
'history-title' => 'ΙστοÏικό εκδόσεων για τη σελίδα "$1"',
'difference' => '(ΔιαφοÏές Î¼ÎµÏ„Î±Î¾Ï Î±Î½Î±Î¸ÎµÏ‰Ïήσεων)',
+'difference-multipage' => '(ΔιαφοÏές Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ σελίδων)',
'lineno' => 'ΓÏαμμή $1:',
'compareselectedversions' => 'ΣÏγκÏιση των εκδόσεων που έχουν επιλεγεί',
'showhideselectedversions' => 'Εμφάνιση/απόκÏυψη των επιλεγμένων εκδοχών',
'editundo' => 'αναίÏεση',
-'diff-multi' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώÏηση|$1 ενδιάμεσες αναθεωÏήσεις}} δεν εμφανίζονται.)',
+'diff-multi' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώÏηση|$1 ενδιάμεσες αναθεωÏήσεις}} από {{PLURAL:$2|ένα χÏήστη|$2 χÏήστες}} δεν {{PLURAL:$1|εμφανίζεται|εμφανίζονται}})',
+'diff-multi-manyusers' => '({{Πληθυντικός: $ 1 | Μία ενδιάμεση αναθεώÏηση | $ 1 ενδιάμεσες αναθεωÏήσεις}} από πεÏισσότεÏο από $ 2 {{πληθυντικό: $ 2 | χÏήστη | χÏήστες}} δεν εμφανίζονται)
+
+({{Πληθυντικός: $ 1 | Μία ενδιάμεση αναθεώÏηση | $ 1 ενδιάμεσες αναθεωÏήσεις}} από πεÏισσότεÏο από $ 2 {{πληθυντικό: $ 2 | χÏήστη | χÏηστών}} δεν εμφανίζονται)',
# Search results
'searchresults' => 'Αποτελέσματα αναζήτησης',
@@ -1257,6 +1266,7 @@ $1",
'searchprofile-everything-tooltip' => 'Αναζήτηση σε όλο το πεÏιεχόμενο (συμπεÏιλαμβανομένων των σελίδων συζήτησης)',
'searchprofile-advanced-tooltip' => 'Αναζήτηση σε συγκεκÏιμένες πεÏιοχές',
'search-result-size' => '$1 ({{PLURAL:$2|1 λέξη|$2 λέξεις}})',
+'search-result-category-size' => '{{PLURAL:$1|1 μέλος|$1 μέλη}} ({{PLURAL:$2|1 υποκατηγοÏία|$2 υποκατηγοÏίες}}, {{PLURAL:$3|1 αÏχείο|$3 αÏχεία}})',
'search-result-score' => 'Σχετικότητα: $1%',
'search-redirect' => '(ανακατεÏθυνση $1)',
'search-section' => '(ενότητα $1)',
@@ -1331,6 +1341,7 @@ $1",
'contextlines' => 'ΣειÏές που θα εμφανίζονται ανά αποτέλεσμα',
'contextchars' => 'ΑÏιθμός χαÏακτήÏων στο εμφανιζόμενο κείμενο',
'stub-threshold' => 'Κατώφλι για μοÏφοποίηση <span class="mw-stub-example">συνδέσμου επεκτάσιμου</span>:',
+'stub-threshold-disabled' => 'ΑπενεÏγοποιημένο',
'recentchangesdays' => 'ΗμέÏες Ï€Ïος εμφάνιση στις Ï€Ïόσφατες αλλαγές:',
'recentchangesdays-max' => '($1 {{PLURAL:$1|ημέÏα|ημέÏες}} το μέγιστο)',
'recentchangescount' => 'ΑÏιθμός επεξεÏγασιών που να εμφανίζονται για Ï€Ïοεπιλογή.',
@@ -1364,6 +1375,7 @@ $1",
'prefs-files' => 'ΑÏχεία',
'prefs-custom-css' => 'ΠÏοκαθοÏισμένη CSS',
'prefs-custom-js' => 'ΠÏοκαθοÏισμένη JS',
+'prefs-common-css-js' => 'Κοινά CSS/JS για όλα τα skins:',
'prefs-reset-intro' => 'ΜποÏείτε να χÏησιμοποιήσετε αυτήν την σελίδα για να επαναÏÏυθμίσετε τις Ï€Ïοτιμήσεις σας στις Ï€Ïοεπιλογές του ιστότοπου. Αυτό δεν μποÏεί να αναστÏεφθεί.',
'prefs-emailconfirm-label' => 'Επιβεβαίωση e-mail:',
'prefs-textboxsize' => 'Μέγεθος πλαίσιου επεξεÏγασίας',
@@ -1400,9 +1412,15 @@ $1",
'prefs-advancedrendering' => 'ΠÏοηγμένες επιλογές',
'prefs-advancedsearchoptions' => 'ΠÏοηγμένες επιλογές',
'prefs-advancedwatchlist' => 'ΠÏοηγμένες επιλογές',
-'prefs-display' => 'Εμφάνιση επιλογών',
+'prefs-displayrc' => 'Εμφάνιση επιλογών',
+'prefs-displaysearchoptions' => 'Επιλογές εμφάνισης',
+'prefs-displaywatchlist' => 'Επιλογές εμφάνισης',
'prefs-diffs' => 'ΔιαφοÏές',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Η διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου φαίνεται έγκυÏη',
+'email-address-validity-invalid' => 'Εισάγετε μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+
# User rights
'userrights' => 'ΔιαχείÏιση δικαιωμάτων χÏηστών',
'userrights-lookup-user' => 'ΔιαχείÏιση ομάδων χÏηστών',
@@ -1486,6 +1504,7 @@ $1",
'right-hideuser' => 'ΦÏαγή ενός ονόματος χÏήστη, αποκÏÏπτοντάς το από το κοινό',
'right-ipblock-exempt' => 'ΠαÏάκαμψη φÏαγών σε διευθÏνσεις IP, αυτόματων φÏαγών και φÏαγών σε IP range',
'right-proxyunbannable' => 'ΠαÏάκαμψη αυτόματων φÏαγών σε proxies',
+'right-unblockself' => 'ΑναίÏεση φÏαγής του ÎµÎ±Ï…Ï„Î¿Ï Ï„Î¿Ï…Ï‚',
'right-protect' => 'Αλλαγή των επιπέδων Ï€Ïοστασίας και επεξεÏγασία Ï€Ïοστατευμένων σελίδων',
'right-editprotected' => 'ΕπεξεÏγασία Ï€Ïοστατευμένων σελίδων (χωÏίς διαδοχική Ï€Ïοστασία)',
'right-editinterface' => 'ΕπεξεÏγασία της διασÏνδεσης χÏήστη',
@@ -1508,7 +1527,6 @@ $1",
'right-siteadmin' => 'Κλείδωμα και ξεκλείδωμα της βάσης δεδομένων',
'right-reset-passwords' => 'ΑÏχικοποίηση κωδικών Ï€Ïόσβασης άλλων χÏηστών/χÏηστÏιών',
'right-override-export-depth' => 'Εξαγωγή σελίδων συμπεÏιλαμβάνοντας συνδεδεμένες σελίδες έως ένα βάθος 5 επιπέδων',
-'right-versiondetail' => 'ΠÏοβολή των εκτεταμένων πληÏοφοÏιών της έκδοσης λογισμικοÏ.',
'right-sendemail' => 'Αποστολή ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος σε άλλους χÏήστες',
# User rights log
@@ -1559,14 +1577,9 @@ $1",
'recentchanges-legend' => 'Επιλογές των Ï€Ïόσφατων αλλαγών',
'recentchangestext' => 'ΠαÏακολουθείστε σε αυτή τη σελίδα τις πιο Ï€Ïόσφατες αλλαγές στο Wiki.',
'recentchanges-feed-description' => 'ΠαÏακολουθείστε τις πιο Ï€Ïόσφατες αλλαγές στο wiki σε αυτή τη Ïοή δεδομένων.',
-'recentchanges-label-legend' => 'Λεζάντα: $1.',
-'recentchanges-legend-newpage' => '$1 - νέα σελίδα',
'recentchanges-label-newpage' => 'Αυτή η επεξεÏγασία δημιοÏÏγησε μια νέα σελίδα',
-'recentchanges-legend-minor' => '$1 - αλλαγή μικÏής κλίμακας',
'recentchanges-label-minor' => 'Αυτή είναι μια αλλαγή μικÏής κλίμακας',
-'recentchanges-legend-bot' => '$1 - αλλαγή bot',
'recentchanges-label-bot' => 'Αυτή η επεξεÏγασία έγινε από ένα bot',
-'recentchanges-legend-unpatrolled' => '$1 - μη ελεγμένη αλλαγή',
'recentchanges-label-unpatrolled' => 'Αυτή η αλλαγή δεν έχει ελεγχθεί ακόμα',
'rcnote' => "ΠαÏακάτω {{PLURAL:$1|υπάÏχει '''1''' αλλαγή|υπάÏχουν οι τελευταίες '''$1''' αλλαγές}} στο διάστημα {{PLURAL:$2|της τελευταίας ημέÏας|των τελευταίων '''$2''' ημεÏών}}, από τις $5, $4 και εξής.",
'rcnotefrom' => 'ΑκολουθοÏν οι αλλαγές από <b>$2</b> (εμφάνιση <b>$1</b> αλλαγών max).',
@@ -1613,6 +1626,9 @@ $1",
'upload_directory_missing' => 'Λείπει το αποθηκευτήÏιο επιφοÏτώσεων ($1) και δεν μποÏεί να δημιουÏγηθεί από τον webserver.',
'upload_directory_read_only' => 'Δεν είναι δυνατή η εγγÏαφή στον κατάλογο ($1) από τον server.',
'uploaderror' => 'Σφάλμα στη φόÏτωση αÏχείου',
+'upload-recreate-warning' => "'''ΠÏοειδοποίηση: Ένα αÏχείο με αυτό το όνομα έχει διαγÏαφεί ή μετακινηθεί.'''
+
+Το αÏχείο διαγÏαφών και μετακινήσεων για αυτή τη σελίδα παÏέχεται εδώ για διευκόλυνση:",
'uploadtext' => "ΜποÏείτε να χÏησιμοποιήσετε την παÏακάτω φόÏμα για να επιφοÏτώσετε αÏχεία. Για να δείτε ήδη επιφοÏτωμένα αÏχεία, πηγαίνετε στη [[Special:FileList|λίστα επιφοÏτωμένων αÏχείων]] ή στο [[Special:Log/upload|ιστοÏικό επιφοÏτώσεων]]. Οι διαγÏαφές έχουν καταγÏαφεί στη σελίδα [[Special:Log/delete|αÏχείο διαγÏαφών]].
Για να συμπεÏιληφθεί μια εικόνα σε μια σελίδα, χÏησιμοποιήστε συνδέσμους της μοÏφής:
@@ -1644,6 +1660,17 @@ $1",
{{PLURAL:\$3|ΠÏοτιμώμενος Ï„Ïπος αÏχείου είναι|ΠÏοτιμώμενοι Ï„Ïποι αÏχείων είναι}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' δεν είναι επιτÏεπόμενος Ï„Ïπος αÏχείου. {{PLURAL:\$3|ΕπιτÏεπόμενος Ï„Ïπος αÏχείων|ΕπιτÏεπόμενοι Ï„Ïποι αÏχείων}} είναι \$2.",
'filetype-missing' => 'Το αÏχείο δεν έχει καμία επέκταση (όπως ".jpg").',
+'empty-file' => 'Το αÏχείο που υποβλήθηκε ήταν άδειο.',
+'file-too-large' => 'Το αÏχείο που υποβλήθηκε είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿.',
+'filename-tooshort' => 'Το όνομα αÏχείου είναι Ï€Î¿Î»Ï Î¼Î¹ÎºÏÏŒ.',
+'filetype-banned' => 'Αυτός ο Ï„Ïπος αÏχείου έχει απαγοÏευτεί.',
+'verification-error' => 'Αυτό το αÏχείο δεν πέÏασε τον έλεγχο επαλήθευσης.',
+'hookaborted' => 'Η Ï„Ïοποποίηση που επιχειÏήσατε, ακυÏώθηκε από ένα άγκιστÏο επέκτασης.',
+'illegal-filename' => 'Αυτό το όνομα αÏχείου δεν επιτÏέπεται.',
+'overwrite' => 'Η αντικατάσταση ενός υπαÏχόντος αÏχείου δεν επιτÏέπεται.',
+'unknown-error' => 'ΠÏοέκυψε ένα άγνωστο σφάλμα.',
+'tmp-create-error' => 'Δεν ήταν δυνατή η δημιουÏγία Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου.',
+'tmp-write-error' => 'Λάθος κατά την εγγÏαφή Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου.',
'large-file' => 'ΠÏοτείνεται τα αÏχεία να μην είναι μεγαλÏτεÏα από $1; αυτό το αÏχείο είναι $2.',
'largefileserver' => 'Το μέγεθος Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… αÏχείο είναι μεγαλÏτεÏο από το μέγιστο μέγεθος που ο εξυπηÏετητής είναι Ïυθμισμένος να επιτÏέπει.',
'emptyfile' => 'Το αÏχείο που φοÏτώσατε φαίνεται να είναι κενό. Αυτό μποÏεί να οφείλεται σε λάθος πληκτÏολόγησης του ονόματος του αÏχείου. ΠαÏακαλοÏμε ελέγξτε εαν αυτό είναι Ï€Ïαγματικά το αÏχείο που θέλετε να φοÏτώσετε.',
@@ -1668,13 +1695,14 @@ $1",
Εάν θέλετε παÏ' όλ' αυτά να επιφοÏτώσετε το δικό σας αÏχείο, παÏακαλοÏμε πηγαίνετε πίσω και χÏησιμοποιήστε ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Αυτό το αÏχείο είναι διπλότυπο {{PLURAL:$1|Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… αÏχείου|αυτών των αÏχείων}}:',
'file-deleted-duplicate' => 'ΑÏχείο παÏόμοιο με αυτό εδώ ([[:$1]]) έχει Ï€Ïοηγουμένως διαγÏαφεί. Θα Ï€Ïέπει να ελέγξετε το ιστοÏικό διαγÏαφής του Ï€Ïιν να Ï€ÏοχωÏήσετε στην επαναφόÏτωσή του.',
-'successfulupload' => 'Επιτυχής φόÏτωση',
'uploadwarning' => 'ΠÏοειδοποίηση φόÏτωσης',
'uploadwarning-text' => 'ΠαÏακαλώ αλλάξτε την πεÏιγÏαφή του αÏχείου παÏακάτω και Ï€Ïοσπαθήστε ξανά.',
'savefile' => 'Αποθήκευση αÏχείου',
'uploadedimage' => 'Η φόÏτωση του "$1" ολοκληÏώθηκε.',
'overwroteimage' => 'ανέβασμα νέας έκδοσης του "[[$1]]"',
'uploaddisabled' => 'ΛυποÏμαστε, η φόÏτωση έχει απενεÏγοποιηθεί.',
+'copyuploaddisabled' => 'Το ανέβασμα μέσω URL έχει απενεÏγοποιηθεί.',
+'uploadfromurl-queued' => 'Το ανέβασμα σας βÏίσκεται στην ουÏά.',
'uploaddisabledtext' => 'Η φόÏτωση αÏχείων είναι απενεÏγοποιημένη.',
'php-uploaddisabledtext' => 'Οι επιφοÏτώσεις αÏχείων ειναι απενεÏγοποιημένες στην PHP. ΠαÏακαλοÏμε, ελέγξτε την ÏÏθμιση file_uploads.',
'uploadscripted' => 'Αυτό το αÏχείο πεÏιέχει κώδικα HTML ή script που μποÏεί να παÏεÏμηνευθεί από μεÏικοÏÏ‚ browser.',
@@ -1708,6 +1736,14 @@ JD # Jenoptik
MGP # Pentax
PICT # διάφοÏα
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'Επιτυχής φόÏτωση',
+'upload-success-msg' => 'Το ανέβασμα σας από [$2] ήταν επιτυχές.Είναι διαθέσιμο εδώ: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'ΠÏόβλημα στα ανέβασμα.',
+'upload-failure-msg' => 'ΥπήÏξε ένα Ï€Ïόβλημα με το φόÏτωσή σας από [$2]:
+
+$1',
+'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>.',
@@ -1723,22 +1759,23 @@ PICT # διάφοÏα
'upload-http-error' => 'Εμφανίστηκε κάποιο σφάλμα HTTP: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'Δεν επετÏάπη η Ï€Ïόσβαση',
-'img-auth-nopathinfo' => 'Υπολείπεται το PATH_INFO.
+'img-auth-accessdenied' => 'Δεν επετÏάπη η Ï€Ïόσβαση',
+'img-auth-nopathinfo' => 'Υπολείπεται το PATH_INFO.
Ο διακομιστής σας δεν είναι παÏαμετÏοποιημένος για να πεÏάσει αυτές τις πληÏοφοÏίες.
ΜποÏεί να είναι βασισμένος σε CGI και να μην υποστηÏίζει img_atuh.
Συμβουλευτείτε το http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => 'Η ζητοÏμενη διαδÏομή δεν βÏίσκεται στον διαμοÏφωμένο αÏχειοκατάλογο επιφοÏτώσεων',
-'img-auth-badtitle' => 'ΑδÏνατη η κατασκευή έγκυÏου τίτλου από "$1".',
-'img-auth-nologinnWL' => 'Δεν έχετε συνδεθεί και η "$1" δεν είναι στην άσπÏη λίστα.',
-'img-auth-nofile' => 'Το αÏχείο "$1" δεν υπάÏχει',
-'img-auth-isdir' => 'ΠÏοσπαθείτε να αποκτήσετε Ï€Ïόσβαση στον αÏχειοκατάλογο "$1".
+'img-auth-notindir' => 'Η ζητοÏμενη διαδÏομή δεν βÏίσκεται στον διαμοÏφωμένο αÏχειοκατάλογο επιφοÏτώσεων',
+'img-auth-badtitle' => 'ΑδÏνατη η κατασκευή έγκυÏου τίτλου από "$1".',
+'img-auth-nologinnWL' => 'Δεν έχετε συνδεθεί και η "$1" δεν είναι στην άσπÏη λίστα.',
+'img-auth-nofile' => 'Το αÏχείο "$1" δεν υπάÏχει',
+'img-auth-isdir' => 'ΠÏοσπαθείτε να αποκτήσετε Ï€Ïόσβαση στον αÏχειοκατάλογο "$1".
Μόνον η Ï€Ïόσβαση σε αÏχεία είναι επιτÏεπτή.',
-'img-auth-streaming' => 'Ροή "$1".',
-'img-auth-public' => 'Η λειτουÏγία του img_auth.php είναι να εξάγει αÏχεία από ένα ιδιωτικό wiki.
+'img-auth-streaming' => 'Ροή "$1".',
+'img-auth-public' => 'Η λειτουÏγία του img_auth.php είναι να εξάγει αÏχεία από ένα ιδιωτικό wiki.
Αυτό το wiki έχει Ïυθμιστεί ως δημόσιο wiki.
Για τη μεγαλÏτεÏη δυνατή ασφάλεια, η img_auth.php είναι απενεÏγοποιημένη.',
-'img-auth-noread' => 'Ο χÏήστης δεν έχει Ï€Ïόσβαση στο να διαβάσει το "$1".',
+'img-auth-noread' => 'Ο χÏήστης δεν έχει Ï€Ïόσβαση στο να διαβάσει το "$1".',
+'img-auth-bad-query-string' => 'Η διεÏθυνση URL έχει μια συμβολοσειÏά εÏωτήματος που δεν είναι έγκυÏη.',
# HTTP errors
'http-invalid-url' => 'ΆκυÏη διεÏθυνση URL: $1',
@@ -1770,6 +1807,7 @@ PICT # διάφοÏα
'listfiles_search_for' => 'Αναζήτηση για όνομα πολυμέσου:',
'imgfile' => 'αÏχείο',
'listfiles' => 'Κατάλογος εικόνων',
+'listfiles_thumb' => 'ΜικÏογÏαφία',
'listfiles_date' => 'ΗμεÏομηνία',
'listfiles_name' => 'Όνομα',
'listfiles_user' => 'ΧÏήστης',
@@ -1883,8 +1921,8 @@ PICT # διάφοÏα
'statistics-edits' => 'ΕπεξεÏγασίες σελίδων από τη δημιουÏγία του εγχειÏήματος {{SITENAME}}',
'statistics-edits-average' => 'Μέσος ÏŒÏος επεξεÏγασιών ανά σελίδα',
'statistics-views-total' => 'Συνολικές εμφανίσεις',
+'statistics-views-total-desc' => ' Επισκέψεις σε μη υπάÏχουσες σελίδες και ειδικές σελίδες δεν συμπεÏιλαμβάνονται',
'statistics-views-peredit' => 'Εμφανίσεις ανά επεξεÏγασία',
-'statistics-jobqueue' => 'Μήκος [http://www.mediawiki.org/wiki/Manual:Job_queue ουÏάς εÏγασιών]',
'statistics-users' => 'ΕγγεγÏαμμένοι [[Special:ListUsers|χÏήστες]]',
'statistics-users-active' => 'ΕνεÏγοί χÏήστες',
'statistics-users-active-desc' => 'ΧÏήστες που έχουν κάνει κάποια επεξεÏγασία μέσα σε {{PLURAL:$1|μέÏα|$1 μέÏες}}',
@@ -1897,7 +1935,7 @@ PICT # διάφοÏα
Μια σελίδα μεταχειÏίζεται ως σελίδα αποσαφήνισης αν χÏησιμοποιεί ένα Ï€Ïότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Διπλές ανακατευθÏνσεις',
-'doubleredirectstext' => 'Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθÏνουν σε άλλες σελίδες ανακατεÏθυνσης. Κάθε σειÏά πεÏιέχει συνδέσμους Ï€Ïος την Ï€Ïώτη και τη δεÏτεÏη σελίδα ανακατεÏθυνσης, όπως επίσης και την Ï€Ïώτη αÏάδα του κειμένου στη δεÏτεÏη σελίδα ανακατεÏθυνσης η οποία και είναι, κανονικά, ο Ï€Ïαγματικός Ï€ÏοοÏισμός της ανακατεÏθυνσης -εκεί δηλαδή όπου θα έπÏεπε να είχατε οδηγηθεί από την αÏχή. Τα <s>διεγÏαμμένα</s> λήμματα έχουν επιλυθεί.',
+'doubleredirectstext' => 'Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθÏνουν σε άλλες σελίδες ανακατεÏθυνσης. Κάθε σειÏά πεÏιέχει συνδέσμους Ï€Ïος την Ï€Ïώτη και τη δεÏτεÏη σελίδα ανακατεÏθυνσης, όπως επίσης και την Ï€Ïώτη αÏάδα του κειμένου στη δεÏτεÏη σελίδα ανακατεÏθυνσης η οποία και είναι, κανονικά, ο Ï€Ïαγματικός Ï€ÏοοÏισμός της ανακατεÏθυνσης -εκεί δηλαδή όπου θα έπÏεπε να είχατε οδηγηθεί από την αÏχή. Τα <del>διεγÏαμμένα</del> λήμματα έχουν επιλυθεί.',
'double-redirect-fixed-move' => 'Η [[$1]] έχει μετακινηθεί, Ï„ÏŽÏα είναι ανακατεÏθυνση στην [[$2]]',
'double-redirect-fixer' => 'ΔιοÏθωτής ανακατευθÏνσεων',
@@ -1920,6 +1958,8 @@ PICT # διάφοÏα
'nmembers' => '$1 {{PLURAL:$1|μέλος|μέλη}}',
'nrevisions' => '$1 {{PLURAL:$1|αναθεώÏηση|αναθεωÏήσεις}}',
'nviews' => '$1 {{PLURAL:$1|επίσκεψη|επισκέψεις}}',
+'nimagelinks' => 'ΧÏησιμοποιείται στο $1 {{PLURAL:$1|page|pages}}',
+'ntransclusions' => 'χÏησιμοποιείται στο $1 {{PLURAL:$1|page|pages}}',
'specialpage-empty' => 'Αυτή η σελίδα είναι κενή.',
'lonelypages' => 'ΟÏφανές σελίδες',
'lonelypagestext' => 'Οι ακόλουθες σελίδες δεν συνδέονται με ή δεν υπεÏκλείονται σε άλλες σελίδες στο {{SITENAME}}.',
@@ -2075,35 +2115,42 @@ PICT # διάφοÏα
'listgrouprights-removegroup-self-all' => 'ΜποÏεί να αφαιÏέσει όλες τις ομάδες από το δικό σας λογαÏιασμό',
# E-mail user
-'mailnologin' => 'Δεν υπάÏχει διεÏθυνση παÏαλήπτη.',
-'mailnologintext' => 'ΠÏέπει να έχετε [[Special:UserLogin|συνδεθεί]] και να έχετε δηλώσει
+'mailnologin' => 'Δεν υπάÏχει διεÏθυνση παÏαλήπτη.',
+'mailnologintext' => 'ΠÏέπει να έχετε [[Special:UserLogin|συνδεθεί]] και να έχετε δηλώσει
μια έγκυÏη ηλεκτÏονική διεÏθυνση στις [[Special:Preferences|ΠÏοτιμήσεις]]
για να στείλετε e-mail σε άλλους χÏήστες.',
-'emailuser' => 'Στείλτε μήνυμα σε αυτό τον χÏήστη',
-'emailpage' => 'Αποστολή μηνÏματος ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείο στο χÏήστη',
-'emailpagetext' => 'ΣυπληÏώνοντας την παÏακάτω φόÏμα θα στείλετε ένα μήνυμα εφόσον έχετε δηλώσει μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στις [[Special:Preferences|Ï€Ïοτιμήσεις χÏήστη]]. Αυτή θα εμφανιστεί ως διεÏθυνση αποστολέα του μηνÏματος, οÏτως ώστε ο παÏαλήπτης να μποÏέσει να σας απαντήσει.',
-'usermailererror' => 'Σφάλμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
-'defemailsubject' => 'ΗλεκτÏονικό ταχυδÏομείο {{SITENAME}}',
-'noemailtitle' => 'Δεν υπάÏχει ηλεκτÏονική διεÏθυνση.',
-'noemailtext' => 'Ο χÏήστης αυτός δεν έχει δηλώσει μια έγκυÏη ηλεκτÏονική διεÏθυνση.',
-'nowikiemailtitle' => 'Δεν επιτÏέπεται e-mail',
-'nowikiemailtext' => 'Αυτός ο χÏήστης έχει επιλέξει να μη δέχεται μηνÏματα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου από άλλους χÏήστες.',
-'email-legend' => 'Αποστολή μηνÏματος ηλ. ταχυδÏομείου σε έναν άλλο χÏήστη του βίκι {{SITENAME}}',
-'emailfrom' => 'Από:',
-'emailto' => 'ΠÏος:',
-'emailsubject' => 'Θέμα:',
-'emailmessage' => 'Μήνυμα:',
-'emailsend' => 'Αποστολή',
-'emailccme' => 'Στείλε μου ένα αντίγÏαφο του μηνÏματός μου με ηλεκτÏονικό ταχυδÏομείο.',
-'emailccsubject' => 'ΑντίγÏαφο του μηνυματός σας στο $1: $2',
-'emailsent' => 'Το μήνυμα έχει σταλεί',
-'emailsenttext' => 'Το μήνυμά σας έχει σταλεί.',
-'emailuserfooter' => 'Αυτό το ηλεκτÏονικό μήνυμα στάλθηκε από τον/την "$1" στον τον/την "$2" μέσω της λειτουÏγίας "αποστολής μηνυμάτων" στο {{SITENAME}}.',
+'emailuser' => 'Στείλτε μήνυμα σε αυτό τον χÏήστη',
+'emailpage' => 'Αποστολή μηνÏματος ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείο στο χÏήστη',
+'emailpagetext' => 'ΣυπληÏώνοντας την παÏακάτω φόÏμα θα στείλετε ένα μήνυμα εφόσον έχετε δηλώσει μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στις [[Special:Preferences|Ï€Ïοτιμήσεις χÏήστη]]. Αυτή θα εμφανιστεί ως διεÏθυνση αποστολέα του μηνÏματος, οÏτως ώστε ο παÏαλήπτης να μποÏέσει να σας απαντήσει.',
+'usermailererror' => 'Σφάλμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
+'defemailsubject' => 'ΗλεκτÏονικό ταχυδÏομείο {{SITENAME}}',
+'usermaildisabled' => 'To e-mail χÏήστη είναι απενεÏγοποιημένο',
+'usermaildisabledtext' => 'Είναι αδÏνατη η αποστολή e-mail σε άλλους χÏήστες σε αυτό το wiki',
+'noemailtitle' => 'Δεν υπάÏχει ηλεκτÏονική διεÏθυνση.',
+'noemailtext' => 'Ο χÏήστης αυτός δεν έχει δηλώσει μια έγκυÏη ηλεκτÏονική διεÏθυνση.',
+'nowikiemailtitle' => 'Δεν επιτÏέπεται e-mail',
+'nowikiemailtext' => 'Αυτός ο χÏήστης έχει επιλέξει να μη δέχεται μηνÏματα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου από άλλους χÏήστες.',
+'email-legend' => 'Αποστολή μηνÏματος ηλ. ταχυδÏομείου σε έναν άλλο χÏήστη του βίκι {{SITENAME}}',
+'emailfrom' => 'Από:',
+'emailto' => 'ΠÏος:',
+'emailsubject' => 'Θέμα:',
+'emailmessage' => 'Μήνυμα:',
+'emailsend' => 'Αποστολή',
+'emailccme' => 'Στείλε μου ένα αντίγÏαφο του μηνÏματός μου με ηλεκτÏονικό ταχυδÏομείο.',
+'emailccsubject' => 'ΑντίγÏαφο του μηνυματός σας στο $1: $2',
+'emailsent' => 'Το μήνυμα έχει σταλεί',
+'emailsenttext' => 'Το μήνυμά σας έχει σταλεί.',
+'emailuserfooter' => 'Αυτό το ηλεκτÏονικό μήνυμα στάλθηκε από τον/την "$1" στον τον/την "$2" μέσω της λειτουÏγίας "αποστολής μηνυμάτων" στο {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'ΦεÏγετε από τις ειδοποιήσεις συστήματος.',
+'usermessage-editor' => 'ΜηνÏματα συστήματος',
+'usermessage-template' => 'MediaWiki:UserMessage',
# Watchlist
'watchlist' => 'Λίστα παÏακολοÏθησης',
'mywatchlist' => 'Λίστα παÏακολοÏθησης',
-'watchlistfor' => "(για '''$1''')",
+'watchlistfor2' => 'Για τον/την $1 ($2)',
'nowatchlist' => 'Δεν υπάÏχουν εγγÏαφές στη λίστα παÏακολοÏθησης.',
'watchlistanontext' => 'ΠαÏακαλώ $1 για να δείτε ή να επεξεÏγαστείτε στοιχεία στη λίστα παÏακολοÏθησής σας.',
'watchnologin' => 'Δεν έχετε συνδεθεί.',
@@ -2150,25 +2197,28 @@ PICT # διάφοÏα
'enotif_anon_editor' => 'ανώνυμος χÏήστης $1',
'enotif_body' => '{{GENDER:$WATCHINGUSERNAME|Αγαπητέ|Αγαπητή}} $WATCHINGUSERNAME,
-Η σελίδα $PAGETITLE του εγχειÏήματος {{SITENAME}} $CHANGEDORCREATED στις $PAGEEDITDATE από {{GENDER:$PAGEEDITOR|το χÏήστη|την χÏήστÏια}} $PAGEEDITOR -ακολουθήστε το σÏνδεσμο $PAGETITLE_URL για να δείτε την Ï„Ïέχουσα αναθεώÏηση.
+Η σελίδα $PAGETITLE του εγχειÏήματος {{SITENAME}} $CHANGEDORCREATED στις $PAGEEDITDATE από {{GENDER:$PAGEEDITOR|τον χÏήστη|την χÏήστη}} $PAGEEDITOR - ακολουθήστε το σÏνδεσμο $PAGETITLE_URL για να δείτε την Ï„Ïέχουσα αναθεώÏηση.
$NEWPAGE
ΠεÏιγÏαφή επεξεÏγασίας: $PAGESUMMARY $PAGEMINOREDIT
-Επικοινωνήστε με {{GENDER:$PAGEEDITOR|το συγκεκÏιμένο χÏήστη|τη συγκεκÏιμένη χÏήστÏια}} :
+Επικοινωνήστε με {{GENDER:$PAGEEDITOR|το συγκεκÏιμένο χÏήστη|τη συγκεκÏιμένη χÏήστη}} :
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
Δεν θα υπάÏξουν άλλες ειδοποιήσεις για πεÏαιτέÏω αλλαγές αν δεν επισκεφθείτε τη σελίδα.
ΜποÏείτε επίσης να επαναφέÏετε την επιλογή ειδοποίησης για όλες τις παÏακολουθοÏμενες σελίδες στη λίστα παÏακολοÏθησής σας.
-Φιλικά,
-Tο σÏστημα ειδοποίησης του εγχειÏήματος {{SITENAME}}
+ Φιλικά,
+ Tο σÏστημα ειδοποίησης του εγχειÏήματος {{SITENAME}}
--
+Για να αλλάξετε τις Ï€Ïοτιμήσεις της ειδοποιήσεων email, ακολουθήστε το σÏνδεσμο:
+{{fullurl:{{#special:Preferences}}}}
+
Για να αλλάξετε τις Ï€Ïοτιμήσεις της λίστας παÏακολοÏθησής σας, ακολουθήστε το σÏνδεσμο:
-{{fullurl:Special:Watchlist/edit}}
+{{fullurl:{{#special:Watchlist}}/edit}}
Για να διαγÏάψετε την σελίδα από την λίστα παÏακολοÏθησής σας:
$UNWATCHURL
@@ -2223,7 +2273,10 @@ $UNWATCHURL
'revertpage' => 'Ανάκληση των αλλαγών $2 (επιστÏοφή στην Ï€ÏοηγοÏμενη αναθεώÏηση $1)',
'revertpage-nouser' => 'ΑναστÏάφηκαν οι επεξεÏγασίες από τον (όνομα χÏήστη αφαιÏέθηκε) στη τελευταία έκδοση από τον/την [[User:$1|$1]]',
'rollback-success' => 'ΑνεστÏαμμένες εκδόσεις από $1, αλλάχθηκαν στην Ï€ÏοηγοÏμενη έκδοση από $2.',
-'sessionfailure' => 'ΥπάÏχει Ï€Ïόβλημα με τη σÏνδεσή σας -η ενέÏγεια αυτή ακυÏώθηκε Ï€Ïοληπτικά για την αντιμετώπιση τυχόν πειÏατείας συνόδου (session hijacking). ΠαÏακαλoÏμε πατήστε "ΕπιστÏοφή", ξαναφοÏτώστε τη σελίδα από την οποία φθάσατε εδώ και Ï€Ïοσπαθήστε ξανά.',
+
+# Edit tokens
+'sessionfailure-title' => 'Η συνεδÏία απέτυχε',
+'sessionfailure' => 'ΥπάÏχει Ï€Ïόβλημα με τη σÏνδεσή σας -η ενέÏγεια αυτή ακυÏώθηκε Ï€Ïοληπτικά για την αντιμετώπιση τυχόν πειÏατείας συνόδου (session hijacking). ΠαÏακαλoÏμε πατήστε "ΕπιστÏοφή", ξαναφοÏτώστε τη σελίδα από την οποία φθάσατε εδώ και Ï€Ïοσπαθήστε ξανά.',
# Protect
'protectlogpage' => 'ΚαταγÏαφές Ï€Ïοστασίας (κλειδώματος)',
@@ -2355,19 +2408,22 @@ $1',
'month' => 'Από τον μήνα (και νωÏίτεÏα):',
'year' => 'Από τη χÏονιά (και νωÏίτεÏα):',
-'sp-contributions-newbies' => 'Εμφάνισε τις συνεισφοÏές μόνο των νέων λογαÏιασμών',
-'sp-contributions-newbies-sub' => 'Για νέους λογαÏιασμοÏÏ‚',
-'sp-contributions-newbies-title' => 'ΣυνεισφοÏές χÏηστών για νέους λογαÏιασμοÏÏ‚',
-'sp-contributions-blocklog' => 'ΑÏχείο καταγÏαφής φÏαγών',
-'sp-contributions-deleted' => 'διαγÏαμμένες συνεισφοÏές χÏήστη',
-'sp-contributions-logs' => 'καταγÏαφές',
-'sp-contributions-talk' => 'συζήτηση',
-'sp-contributions-userrights' => 'διαχείÏιση δικαιωμάτων χÏηστών',
-'sp-contributions-blocked-notice' => '{{GENDER:$1|Αυτός ο χÏήστης|Αυτή η χÏήστης}} έχει αποκλειστεί επί του παÏόντος.
+'sp-contributions-newbies' => 'Εμφάνισε τις συνεισφοÏές μόνο των νέων λογαÏιασμών',
+'sp-contributions-newbies-sub' => 'Για νέους λογαÏιασμοÏÏ‚',
+'sp-contributions-newbies-title' => 'ΣυνεισφοÏές χÏηστών για νέους λογαÏιασμοÏÏ‚',
+'sp-contributions-blocklog' => 'ΑÏχείο καταγÏαφής φÏαγών',
+'sp-contributions-deleted' => 'διαγÏαμμένες συνεισφοÏές χÏήστη',
+'sp-contributions-uploads' => 'επιφοÏτώσεις',
+'sp-contributions-logs' => 'καταγÏαφές',
+'sp-contributions-talk' => 'συζήτηση',
+'sp-contributions-userrights' => 'διαχείÏιση δικαιωμάτων χÏηστών',
+'sp-contributions-blocked-notice' => '{{GENDER:$1|Αυτός ο χÏήστης|Αυτή η χÏήστης}} έχει αποκλειστεί επί του παÏόντος.
Η πιο Ï€Ïόσφατη καταχώÏηση του αÏχείου καταγÏαφής φÏαγών παÏέχεται παÏακάτω για αναφοÏά:',
-'sp-contributions-search' => 'Αναζήτηση για συνεισφοÏές',
-'sp-contributions-username' => 'ΔιεÏθυνση IP ή όνομα χÏήστη:',
-'sp-contributions-submit' => 'Αναζήτηση',
+'sp-contributions-blocked-notice-anon' => 'Αυτή η διεÏθυνση IP υπόκειται επί του παÏόντος σε φÏαγή',
+'sp-contributions-search' => 'Αναζήτηση για συνεισφοÏές',
+'sp-contributions-username' => 'ΔιεÏθυνση IP ή όνομα χÏήστη:',
+'sp-contributions-toponly' => 'Δείξε μόνο τις τελευταίες αναθεωÏήσεις',
+'sp-contributions-submit' => 'Αναζήτηση',
# What links here
'whatlinkshere' => 'ΑναφοÏές στη σελίδα',
@@ -2428,7 +2484,6 @@ $1',
'ipb-edit-dropdown' => 'ΕπεξεÏγασία λόγων φÏαγής',
'ipb-unblock-addr' => 'ΤεÏμάτισε τη φÏαγή του/της $1',
'ipb-unblock' => 'ΤεÏμάτισε τη φÏαγή για ένα όνομα χÏήστη ή μια διεÏθυνση IP',
-'ipb-blocklist-addr' => 'Δες τις υπάÏχουσες φÏαγές για $1',
'ipb-blocklist' => 'Δες τις υπάÏχουσες φÏαγές',
'ipb-blocklist-contribs' => 'ΣυνεισφοÏές για τον/την $1',
'unblockip' => 'ΆÏση φÏαγής χÏήστη',
@@ -2500,6 +2555,8 @@ $1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετÎ
'cant-block-while-blocked' => 'Δεν μποÏείτε να φÏάξετε άλλους χÏήστες ενώ είστε φÏαγμένος/η.',
'cant-see-hidden-user' => 'Ο χÏήστης που Ï€Ïοσπαθείτε να αποκλείσετε έχει ήδη αποκλειστεί και αποκÏυφτεί.
Δεδομένου ότι δεν έχετε το δικαίωμα hideuser, δεν μποÏείτε να δείτε ή να επεξεÏγαστείτε την φÏαγή του χÏήστη.',
+'ipbblocked' => 'Δεν μποÏείτε να βάλετε ή να αναιÏέσετε φÏαγή σε άλλους χÏήστες, επειδή είστε εσείς υπό φÏαγή',
+'ipbnounblockself' => 'Δεν έχετε το δικαίωμα να βγάλετε την φÏαγή από τον εαυτό σας',
# Developer tools
'lockdb' => 'Κλείδωμα βάσης δεδομένων',
@@ -2534,6 +2591,18 @@ $1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετÎ
'''ΠΡΟΣΟΧΗ!'''
Η μετονομασία σελίδας είναι μια αιφνίδια και δÏαστική αλλαγή όταν Ï€Ïόκειται για δημοφιλείς σελίδες.
ΠαÏακαλοÏμε, Ï€Ïιν το αποφασίσετε, να εξετάσετε Ï€Ïοσεκτικά τις πιθανές επιπτώσεις αυτής της ενέÏγειας.",
+'movepagetext-noredirectfixer' => "ΧÏησιμοποιώντας τη φόÏμα που ακολουθεί μποÏείτε να μετονομάσετε σελίδες και να μεταφέÏετε όλο το ιστοÏικό τους στο νέο όνομα.
+Ο παλιός τίτλος της σελίδας θα γίνει μια σελίδα ανακατεÏθυνσης στο νέο τίτλο.
+ΜποÏείτε να ενημεÏώσετε τις ανακατευθÏνσεις που οδηγοÏν στον αÏχικό τίτλο αυτόματα.
+Αν επιλέξετε να μην γίνει, θα Ï€Ïέπει να ελέγξετε τις [[Special:DoubleRedirects|διπλές]] και τις [[Special:BrokenRedirects|κατεστÏαμμένες ανακατευθÏνσεις]].
+Είστε υπεÏθυνος να επιβεβαιώσετε ότι οι σÏνδεσμοι εξακολουθοÏν να οδηγοÏν Ï€Ïος τις κατευθÏνσεις που Ï€Ïέπει.
+
+Λάβετε υπόψη σας ότι η σελίδα '''δεν''' θα μετακινηθεί αν υπάÏχει ήδη μια άλλη σελίδα κάτω από το νέο τίτλο, εκτός αν η σελίδα αυτή είναι κενή ή είναι ανακατεÏθυνση χωÏίς ιστοÏικό επεξεÏγασίας.
+Αυτό σημαίνει ότι, στην πεÏίπτωση που έχετε κάνει λάθος, μποÏείτε να μετονομάσετε μια σελίδα ξαναδίνοντας της την αÏχική της ονομασία αλλά δεν μποÏείτε να αντικαταστήσετε μια υπάÏχουσα σελίδα.
+
+'''ΠΡΟΣΟΧΗ!'''
+Η μετονομασία σελίδας είναι μια αιφνίδια και δÏαστική αλλαγή όταν Ï€Ïόκειται για δημοφιλείς σελίδες.
+ΠαÏακαλοÏμε, Ï€Ïιν το αποφασίσετε, να εξετάσετε Ï€Ïοσεκτικά τις πιθανές επιπτώσεις αυτής της ενέÏγειας.",
'movepagetalktext' => "Η σελίδα συζήτησης που αντιστοιχεί, εάν υπάÏχει, θα μετακινηθεί αυτόματα μαζί με αυτήν '''έκτός αν:'''
*Μετακινείτε τη σελίδα σε διαφοÏετική πεÏιοχή (namespace),
*ΥπάÏχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή, ή
@@ -2589,6 +2658,7 @@ $1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετÎ
'immobile-source-page' => 'Αυτή η σελίδα δεν είναι δυνατό να μετακινηθεί.',
'immobile-target-page' => 'Δεν μποÏεί να μετακινηθεί σε αυτόν τον τίτλο.',
'imagenocrossnamespace' => 'Δεν είναι δυνατή η μετακίνηση του αÏχείου σε πεÏιοχή ονομάτων που δεν αφοÏά αÏχεία',
+'nonfile-cannot-move-to-file' => ' Δεν είναι δυνατή η μετακίνηση μη αÏχείων σε αÏχείο ονομάτων',
'imagetypemismatch' => 'Η νέα επέκταση του αÏχείου δεν ταιÏιάζει με τον Ï„Ïπο του',
'imageinvalidfilename' => 'Το όνομα αÏχείου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ άκυÏο',
'fix-double-redirects' => 'ΕνημεÏώστε όποια ανακατεÏθυνση σκοπεÏει Ï€Ïος τον αÏχικό τίτλο',
@@ -2667,6 +2737,7 @@ $1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετÎ
'importstart' => 'Η εισαγωγή των σελίδων είναι σε εξέλιξη...',
'import-revision-count' => '$1 {{PLURAL:$1|αναθεώÏηση|αναθεωÏήσεις}}',
'importnopages' => 'Δεν υπάÏχουν σελίδες για εισαγωγή.',
+'imported-log-entries' => '{{PLURAL:$1|ΚαταχωÏήθηκε 1 αÏχείο καταγÏαφής|ΚαταχωÏήθηκαν $1 αÏχεία καταγÏαφής}}.',
'importfailed' => 'Η εισαγωγή απέτυχε: $1',
'importunknownsource' => 'Άγνωστος Ï„Ïπος πηγής για την εισαγωγή',
'importcantopen' => 'Το αÏχείο εισαγωγής δεν ήταν δυνατόν να ανοιχθεί',
@@ -2760,6 +2831,8 @@ $1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετÎ
'tooltip-rollback' => 'Η "αναστÏοφή" ακυÏώνει τις τελευταίες επεξεÏγασίες σε αυτή τη σελίδα με ένα κλικ',
'tooltip-undo' => 'Η "ακÏÏωση" ακυÏώνει αυτήν την επεξεÏγασία και ανοίγει την φόÏμα επεξεÏγασίας σε κατάσταση Ï€Ïοεπισκόπησης.
ΕπιτÏέπει την Ï€Ïοσθήκη αιτιολόγησης στην πεÏίληψη',
+'tooltip-preferences-save' => 'Αποθήκευση Ï€Ïοτιμήσεων',
+'tooltip-summary' => 'Εισάγετε μια σÏντομη πεÏίληψη',
# Stylesheets
'common.css' => '/* Το τοποθετημένο εδώ CSS θα εφαÏμοστεί σε όλα τα skins */',
@@ -2881,19 +2954,22 @@ $1',
'nextdiff' => 'Επόμενη επεξεÏγασία →',
# Media information
-'mediawarning' => "'''ΠÏοειδοποίηση''': Το αÏχείο αυτό μποÏεί να πεÏιέχει κακοπÏοαίÏετο κώδικα.
+'mediawarning' => "'''ΠÏοειδοποίηση''': Το αÏχείο αυτό μποÏεί να πεÏιέχει κακοπÏοαίÏετο κώδικα.
Εκτελώντας το, μποÏεί να βλάψει το σÏστημα του υπολογιστή σας.",
'imagemaxsize' => "ÎŒÏιο μεγέθους εικόνων:<br />''(στις σελίδες πεÏιγÏαφής εικόνων)''",
'thumbsize' => 'Μέγεθος μικÏογÏαφίας:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|σελίδα|σελίδες}}',
-'file-info' => '(μέγεθος αÏχείου: $1, Ï„Ïπος MIME: $2)',
-'file-info-size' => '($1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3, Ï„Ïπος MIME: $4)',
+'file-info' => 'μέγεθος αÏχείου: $1, Ï„Ïπος MIME: $2',
+'file-info-size' => '$1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3, Ï„Ïπος MIME: $4',
'file-nohires' => '<small>Δεν διατίθεται υψηλότεÏη ανάλυση.</small>',
-'svg-long-desc' => "(ΑÏχείο SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3)",
+'svg-long-desc' => "ΑÏχείο SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3",
'show-big-image' => 'ΠλήÏης ανάλυση',
'show-big-image-thumb' => '<small>Μέγεθος αυτής της Ï€Ïοεπισκόπησης: $1 × $2 εικονοστοιχεία</small>',
'file-info-gif-looped' => 'πεÏιτυλιγμένο',
'file-info-gif-frames' => '$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}',
+'file-info-png-looped' => 'Σε άπειÏο βÏόγχο',
+'file-info-png-repeat' => 'έπαιξε $1 {{PLURAL:$1|φοÏά|φοÏές}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}',
# Special:NewFiles
'newimages' => 'Πινακοθήκη νέων εικόνων',
@@ -2983,7 +3059,7 @@ $1',
'exif-isospeedratings' => 'Βαθμολόγηση ταχÏτητας ISO',
'exif-oecf' => 'ΟπτικοηλεκτÏονικός συντελεστής μετατÏοπής',
'exif-shutterspeedvalue' => 'APEX ταχÏτητα κλείστÏου',
-'exif-aperturevalue' => 'ΔιάφÏαγμα',
+'exif-aperturevalue' => 'ΔιάφÏαγμα APEX',
'exif-brightnessvalue' => 'APEX φωτεινότητα',
'exif-exposurebiasvalue' => 'ΠÏοτεÏαιότητα έκθεσης',
'exif-maxaperturevalue' => 'Μέγιστο διάφÏαγμα ξηÏάς',
@@ -3048,6 +3124,7 @@ $1',
'exif-gpsareainformation' => 'Όνομα πεÏιοχής GPS',
'exif-gpsdatestamp' => 'ΗμεÏομηνία GPS',
'exif-gpsdifferential' => 'ΔιαφοÏική διόÏθωση GPS',
+'exif-objectname' => 'Συνοπτικός τίτλος',
# EXIF attributes
'exif-compression-1' => 'Έχει αποσυμπιεστεί.',
@@ -3205,27 +3282,27 @@ $1',
'limitall' => 'όλες',
# E-mail address confirmation
-'confirmemail' => 'Επιβεβαίωση διεÏθυνσης e-mail',
-'confirmemail_noemail' => 'Δεν έχετε οÏίσει μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στις [[Special:Preferences|Ï€Ïοτιμήσεις χÏήστη]] σας.',
-'confirmemail_text' => 'Το σÏστημα χÏειάζεται να επαληθεÏσει τη διεÏθυνση e-mail που δώσατε για να χÏησιμοποιήσετε τις δυνατότητες αλληλογÏαφίας. Κάνετε κλικ στο παÏακάτω κουμπί και θα σας αποσταλεί μήνυμα επαλήθευσης στη διεÏθυνσή σας. Στο μήνυμα αυτό θα εμφανίζεται ένας σÏνδεσμος που Θα πεÏιέχει τον κωδικό επαλήθευσης -ακολουθήστε το σÏνδεσμο αυτό για να μποÏέσει το σÏστημα να επαληθεÏσει τη διεÏθυνση αλληλογÏαφίας σας.',
-'confirmemail_pending' => 'Ένας κωδικός επιβεβαίωσης σας έχει ήδη σταλεί μέσω μηνÏματος e-mail. Αν δημιουÏγήσατε
+'confirmemail' => 'Επιβεβαίωση διεÏθυνσης e-mail',
+'confirmemail_noemail' => 'Δεν έχετε οÏίσει μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στις [[Special:Preferences|Ï€Ïοτιμήσεις χÏήστη]] σας.',
+'confirmemail_text' => 'Το σÏστημα χÏειάζεται να επαληθεÏσει τη διεÏθυνση e-mail που δώσατε για να χÏησιμοποιήσετε τις δυνατότητες αλληλογÏαφίας. Κάνετε κλικ στο παÏακάτω κουμπί και θα σας αποσταλεί μήνυμα επαλήθευσης στη διεÏθυνσή σας. Στο μήνυμα αυτό θα εμφανίζεται ένας σÏνδεσμος που Θα πεÏιέχει τον κωδικό επαλήθευσης -ακολουθήστε το σÏνδεσμο αυτό για να μποÏέσει το σÏστημα να επαληθεÏσει τη διεÏθυνση αλληλογÏαφίας σας.',
+'confirmemail_pending' => 'Ένας κωδικός επιβεβαίωσης σας έχει ήδη σταλεί μέσω μηνÏματος e-mail. Αν δημιουÏγήσατε
Ï€Ïόσφατα το λογαÏιασμό σας, μποÏεί να θέλετε να πεÏιμένετε μεÏικά λεπτά
για να φτάσει αυτό Ï€Ïιν Ï€Ïοσπαθήσετε να ζητήσετε ένα νέο κωδικό.',
-'confirmemail_send' => 'Αποστολή ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÏ€Î±Î»Î®Î¸ÎµÏ…ÏƒÎ·Ï‚ με e-mail .',
-'confirmemail_sent' => 'Στάλθηκε το μήνυμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου για επιβεβαίωση.',
-'confirmemail_oncreate' => 'Ένας κωδικός επιβεβαίωσης σας έχει σταλεί στην διεÏθυνση e-mail σας.
+'confirmemail_send' => 'Αποστολή ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÏ€Î±Î»Î®Î¸ÎµÏ…ÏƒÎ·Ï‚ με e-mail .',
+'confirmemail_sent' => 'Στάλθηκε το μήνυμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου για επιβεβαίωση.',
+'confirmemail_oncreate' => 'Ένας κωδικός επιβεβαίωσης σας έχει σταλεί στην διεÏθυνση e-mail σας.
Αυτός ο κωδικός δεν είναι απαÏαίτητος για να συνδεθείτε, αλλά θα χÏειαστεί
να τον παÏέχετε Ï€Ïιν ενεÏγοποιήσετε οποιαδήποτε χαÏακτηÏιστικά βασισμένα σε e-mail, σε αυτό το wiki.',
-'confirmemail_sendfailed' => 'Δεν ήταν δυνατή η αποστολή του e-mail επαλήθευσης από το {{SITENAME}}. Ελέγξτε την ηλεκτÏονική διεÏθυνση που συμπληÏώσατε για άκυÏους χαÏακτήÏες.
+'confirmemail_sendfailed' => 'Δεν ήταν δυνατή η αποστολή του e-mail επαλήθευσης από το {{SITENAME}}. Ελέγξτε την ηλεκτÏονική διεÏθυνση που συμπληÏώσατε για άκυÏους χαÏακτήÏες.
Το Ï€ÏόγÏαμμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου επέστÏεψε το ακόλουθο μήνυμα: $1',
-'confirmemail_invalid' => 'Λάθος κωδικός επαλήθευσης. Είναι πιθανόν ο κωδικός σας να έχει λήξει.',
-'confirmemail_needlogin' => 'ΧÏειάζετε να $1 για να επιβεβαιώσετε τη διεÏθυνση e-mail σας.',
-'confirmemail_success' => 'Η ηλεκτÏονική σας διεÏθυνση σας επαληθεÏτηκε. ΜποÏείτε πλέον να συνδεθείτε και να απολαÏσετε τις δυνατότητες του Wiκi.',
-'confirmemail_loggedin' => 'Η ηλεκτÏονική σας διεÏθυνση επαληθεÏτηκε.',
-'confirmemail_error' => 'ΠαÏουσιάστηκε λάθος κατά την αποθήκευση των Ïυθμίσεών σας.',
-'confirmemail_subject' => 'Επαλήθευση ηλεκτÏονικής διεÏθυνσης του {{SITENAME}}',
-'confirmemail_body' => 'Κάποιος -πιθανόν εσείς- από τη διεÏθυνση IP $1, δημιοÏÏγησε στον ιστότοπο {{SITENAME}} το λογαÏιασμό χÏήστη "$2" με αυτή την ηλεκτÏονική διεÏθυνση.
+'confirmemail_invalid' => 'Λάθος κωδικός επαλήθευσης. Είναι πιθανόν ο κωδικός σας να έχει λήξει.',
+'confirmemail_needlogin' => 'ΧÏειάζετε να $1 για να επιβεβαιώσετε τη διεÏθυνση e-mail σας.',
+'confirmemail_success' => 'Η ηλεκτÏονική σας διεÏθυνση σας επαληθεÏτηκε. ΜποÏείτε πλέον να συνδεθείτε και να απολαÏσετε τις δυνατότητες του Wiκi.',
+'confirmemail_loggedin' => 'Η ηλεκτÏονική σας διεÏθυνση επαληθεÏτηκε.',
+'confirmemail_error' => 'ΠαÏουσιάστηκε λάθος κατά την αποθήκευση των Ïυθμίσεών σας.',
+'confirmemail_subject' => 'Επαλήθευση ηλεκτÏονικής διεÏθυνσης του {{SITENAME}}',
+'confirmemail_body' => 'Κάποιος -πιθανόν εσείς- από τη διεÏθυνση IP $1, δημιοÏÏγησε στον ιστότοπο {{SITENAME}} το λογαÏιασμό χÏήστη "$2" με αυτή την ηλεκτÏονική διεÏθυνση.
Για να επιβεβαιώσετε ότι αυτός ο λογαÏιασμός χÏήστη ανήκει Ï€Ïαγματικά σε εσάς και για να ενεÏγοποιηθοÏν οι δυνατότητες e-mail του {{SITENAME}}, ακολουθήστε αυτό το σÏνδεσμο:
@@ -3236,8 +3313,19 @@ $3
$5
Ο κωδικός επιβεβαίωσης θα λήξει στις $4.',
-'confirmemail_invalidated' => 'Η επιβεβαίωσης της διεÏθυνσης e-mail ακυÏώθηκε',
-'invalidateemail' => 'ΑκÏÏωση επιβεβαίωσης της διεÏθυνσης e-mail',
+'confirmemail_body_changed' => 'Κάποιος - πιθανόν εσείς - από τη διεÏθυνση IP $1, άλλαξε στον ιστότοπο {{SITENAME}} την ηλεκτÏονική διεÏθυνση του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Ï‡Ïήστη "$2".
+
+Για να επιβεβαιώσετε ότι αυτός ο λογαÏιασμός χÏήστη ανήκει Ï€Ïαγματικά σε εσάς και για να ενεÏγοποιηθοÏν οι δυνατότητες e-mail του {{SITENAME}}, ακολουθήστε αυτό το σÏνδεσμο:
+
+$3
+
+Αν ο λογαÏιασμός *δεν* ανήκει σε σας, ακολουθήστε τον παÏακάτω σÏνδεσμο για να ακυÏώσετε την επιβεβαίωση της διεÏθυνσης e-mail:
+
+$5
+
+Αυτός ο κωδικός επιβεβαίωσης θα λήξει στις $4.',
+'confirmemail_invalidated' => 'Η επιβεβαίωσης της διεÏθυνσης e-mail ακυÏώθηκε',
+'invalidateemail' => 'ΑκÏÏωση επιβεβαίωσης της διεÏθυνσης e-mail',
# Scary transclusion
'scarytranscludedisabled' => '[Η ενσωμάτωση εξωτεÏικών ιστοσελίδων σε αυτό το Wiki είναι απενεÏγοποιημένη.]',
@@ -3277,6 +3365,7 @@ $1',
'table_pager_first' => 'ΠÏώτη σελίδα',
'table_pager_last' => 'Τελευταία σελίδα',
'table_pager_limit' => 'Εμφάνισε $1 στοιχεία ανά σελίδα',
+'table_pager_limit_label' => 'Στοιχεία ανά σελίδα:',
'table_pager_limit_submit' => 'Πήγαινε',
'table_pager_empty' => 'Κανένα αποτέλεσμα',
@@ -3332,6 +3421,7 @@ $1',
'version-specialpages' => 'Ειδικές σελίδες',
'version-parserhooks' => 'ΆγκιστÏα του ÏƒÏ…Î½Ï„Î±ÎºÏ„Î¹ÎºÎ¿Ï Î±Î½Î±Î»Ï…Ï„Î®',
'version-variables' => 'ΠαÏάμετÏοι',
+'version-skins' => 'ΠÏοσόψεις',
'version-other' => 'Άλλα',
'version-mediahandlers' => 'ΧειÏιστές των μέσων',
'version-hooks' => 'ΆγκιστÏα',
@@ -3343,6 +3433,13 @@ $1',
'version-hook-subscribedby' => 'ΥπογεγÏαμμένο από',
'version-version' => '(Έκδοση $1)',
'version-license' => 'Άδεια χÏήσης',
+'version-poweredby-credits' => "Αυτό το βίκι Ï„Ïοφοδοτείται από '''[http://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 για πεÏισσότεÏες λεπτομέÏειες.
+
+ Θα Ï€Ïέπει να έχετε λάβει [((SERVER)) ((SCRIPTPATH)) / COPYING ένα αντίγÏαφο της GNU General Public License] μαζί με αυτό το Ï€ÏόγÏαμμα.Αν όχι, γÏάψτε Ï€Ïος το Free Software Foundation, Inc, 51 Franklin Street, πέμπτο ÏŒÏοφο , Boston, MA 02110-1301, USA ή [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το online].",
'version-software' => 'Εγκατεστημένο λογισμικό',
'version-software-product' => 'ΠÏοϊόν',
'version-software-version' => 'Έκδοση',
@@ -3413,6 +3510,15 @@ $1',
'tags-edit' => 'επεξεÏγασία',
'tags-hitcount' => '$1 {{PLURAL:$1|αλλαγή|αλλαγές}}',
+# Special:ComparePages
+'comparepages' => 'ΣυγκÏίνετε τις σελίδες',
+'compare-selector' => 'ΣυγκÏίνετε τις αναθεωÏήσεις των σελίδων',
+'compare-page1' => 'Σελίδα 1',
+'compare-page2' => 'Σελίδα 2',
+'compare-rev1' => 'ΑναθεώÏηση 1',
+'compare-rev2' => 'ΑναθεώÏηση 2',
+'compare-submit' => 'ΣυγκÏίνετε',
+
# Database error messages
'dberr-header' => 'Αυτό το βίκι έχει ένα Ï€Ïόβλημα',
'dberr-problems' => 'ΛυποÏμαστε! Αυτός ο ιστότοπος αντιμετωπίζει τεχνικές δυσκολίες.',
@@ -3429,8 +3535,13 @@ $1',
'htmlform-float-invalid' => 'Η τιμή που οÏίσατε δεν είναι ένας αÏιθμός.',
'htmlform-int-toolow' => 'Η αξία που θέσατε είναι πιο κάτω από το ελάχιστο ÏŒÏιο $1',
'htmlform-int-toohigh' => 'Η τιμή που θέσατε είναι πιο πάνω από το μέγιστο ÏŒÏιο $1',
+'htmlform-required' => 'Η τιμή αυτή είναι απαÏαίτητη',
'htmlform-submit' => 'Υποβολή',
'htmlform-reset' => 'ΑναστÏοφή αλλαγών',
'htmlform-selectorother-other' => 'Άλλο',
+# SQLite database support
+'sqlite-has-fts' => '$1 με υποστήÏιξη αναζήτησης πλήÏους κειμένου',
+'sqlite-no-fts' => '$1 χωÏίς την υποστήÏιξη αναζήτησης πλήÏους κειμένου',
+
);
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index d7f06fa6..e851696f 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -88,8 +88,8 @@ $linkPrefixExtension = false;
$namespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Special',
- NS_MAIN => '',
- NS_TALK => 'Talk',
+ NS_MAIN => '',
+ NS_TALK => 'Talk',
NS_USER => 'User',
NS_USER_TALK => 'User_talk',
# NS_PROJECT set by $wgMetaNamespace
@@ -268,7 +268,7 @@ $magicWords = array(
'safesubst' => array( 0, 'SAFESUBST:' ),
'msgnw' => array( 0, 'MSGNW:' ),
'img_thumbnail' => array( 1, 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( 1, 'thumbnail=$1', 'thumb=$1'),
+ 'img_manualthumb' => array( 1, 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( 1, 'right' ),
'img_left' => array( 1, 'left' ),
'img_none' => array( 1, 'none' ),
@@ -295,14 +295,15 @@ $magicWords = array(
'nse' => array( 0, 'NSE:' ),
'localurl' => array( 0, 'LOCALURL:' ),
'localurle' => array( 0, 'LOCALURLE:' ),
+ 'articlepath' => array( 0, 'ARTICLEPATH' ),
'server' => array( 0, 'SERVER' ),
'servername' => array( 0, 'SERVERNAME' ),
'scriptpath' => array( 0, 'SCRIPTPATH' ),
'stylepath' => array( 0, 'STYLEPATH' ),
'grammar' => array( 0, 'GRAMMAR:' ),
'gender' => array( 0, 'GENDER:' ),
- 'notitleconvert' => array( 0, '__NOTITLECONVERT__', '__NOTC__'),
- 'nocontentconvert' => array( 0, '__NOCONTENTCONVERT__', '__NOCC__'),
+ 'notitleconvert' => array( 0, '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( 0, '__NOCONTENTCONVERT__', '__NOCC__' ),
'currentweek' => array( 1, 'CURRENTWEEK' ),
'currentdow' => array( 1, 'CURRENTDOW' ),
'localweek' => array( 1, 'LOCALWEEK' ),
@@ -311,6 +312,7 @@ $magicWords = array(
'revisionday' => array( 1, 'REVISIONDAY' ),
'revisionday2' => array( 1, 'REVISIONDAY2' ),
'revisionmonth' => array( 1, 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( 1, 'REVISIONMONTH1' ),
'revisionyear' => array( 1, 'REVISIONYEAR' ),
'revisiontimestamp' => array( 1, 'REVISIONTIMESTAMP' ),
'revisionuser' => array( 1, 'REVISIONUSER' ),
@@ -352,6 +354,9 @@ $magicWords = array(
'staticredirect' => array( 1, '__STATICREDIRECT__' ),
'protectionlevel' => array( 1, 'PROTECTIONLEVEL' ),
'formatdate' => array( 0, 'formatdate', 'dateformat' ),
+ 'url_path' => array( 0, 'PATH' ),
+ 'url_wiki' => array( 0, 'WIKI' ),
+ 'url_query' => array( 0, 'QUERY' ),
);
/**
@@ -373,6 +378,7 @@ $specialPageAliases = array(
'Watchlist' => array( 'Watchlist' ),
'Recentchanges' => array( 'RecentChanges' ),
'Upload' => array( 'Upload' ),
+ 'UploadStash' => array( 'UploadStash' ),
'Listfiles' => array( 'ListFiles', 'FileList', 'ImageList' ),
'Newimages' => array( 'NewFiles', 'NewImages' ),
'Listusers' => array( 'ListUsers', 'UserList' ),
@@ -407,6 +413,7 @@ $specialPageAliases = array(
'Allpages' => array( 'AllPages' ),
'Prefixindex' => array( 'PrefixIndex' ) ,
'Ipblocklist' => array( 'BlockList', 'ListBlocks', 'IPBlockList' ),
+ 'Unblock' => array( 'Unblock' ),
'Specialpages' => array( 'SpecialPages' ),
'Contributions' => array( 'Contributions' ),
'Emailuser' => array( 'EmailUser' ),
@@ -437,6 +444,7 @@ $specialPageAliases = array(
'Mypage' => array( 'MyPage' ),
'Mytalk' => array( 'MyTalk' ),
'Mycontributions' => array( 'MyContributions' ),
+ 'Myuploads' => array( 'MyUploads' ),
'Listadmins' => array( 'ListAdmins' ),
'Listbots' => array( 'ListBots' ),
'Popularpages' => array( 'PopularPages' ),
@@ -451,6 +459,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'DeletedContributions' ),
'Tags' => array( 'Tags' ),
'Activeusers' => array( 'ActiveUsers' ),
+ 'ComparePages' => array( 'ComparePages' ),
+ 'Badtitle' => array( 'Badtitle' ),
+ 'DisableAccount' => array( 'DisableAccount' ),
);
/**
@@ -580,9 +591,9 @@ $preloadedMessages = array(
'whatlinkshere',
);
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Default messages
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Allowed characters in keys are: A-Z, a-z, 0-9, underscore (_) and
# hyphen (-). If you need more characters, you may be able to change
# the regex in MagicWord::initRegex
@@ -623,8 +634,7 @@ XHTML id names.
'tog-editsection' => 'Enable section editing via [edit] links',
'tog-editsectiononrightclick' => 'Enable section editing by right clicking on section titles (requires JavaScript)',
'tog-showtoc' => 'Show table of contents (for pages with more than 3 headings)',
-'tog-rememberpassword' => 'Remember my login on this computer',
-'tog-editwidth' => 'Widen the edit box to fill the entire screen',
+'tog-rememberpassword' => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Add pages I create to my watchlist',
'tog-watchdefault' => 'Add pages I edit to my watchlist',
'tog-watchmoves' => 'Add pages I move to my watchlist',
@@ -632,7 +642,7 @@ XHTML id names.
'tog-minordefault' => 'Mark all edits minor by default',
'tog-previewontop' => 'Show preview before edit box',
'tog-previewonfirst' => 'Show preview on first edit',
-'tog-nocache' => 'Disable page caching',
+'tog-nocache' => 'Disable browser page caching',
'tog-enotifwatchlistpages' => 'E-mail me when a page on my watchlist is changed',
'tog-enotifusertalkpages' => 'E-mail me when my user talk page is changed',
'tog-enotifminoredits' => 'E-mail me also for minor edits of pages',
@@ -640,8 +650,8 @@ XHTML id names.
'tog-shownumberswatching' => 'Show the number of watching users',
'tog-oldsig' => 'Preview of existing signature:',
'tog-fancysig' => 'Treat signature as wikitext (without an automatic link)',
-'tog-externaleditor' => 'Use external editor by default (for experts only, needs special settings on your computer)',
-'tog-externaldiff' => 'Use external diff by default (for experts only, needs special settings on your computer)',
+'tog-externaleditor' => 'Use external editor by default (for experts only, needs special settings on your computer. [http://www.mediawiki.org/wiki/Manual:External_editors More information.])',
+'tog-externaldiff' => 'Use external diff by default (for experts only, needs special settings on your computer. [http://www.mediawiki.org/wiki/Manual:External_editors More information.])',
'tog-showjumplinks' => 'Enable "jump to" accessibility links',
'tog-uselivepreview' => 'Use live preview (requires JavaScript) (experimental)',
'tog-forceeditsummary' => 'Prompt me when entering a blank edit summary',
@@ -774,31 +784,21 @@ XHTML id names.
'sitesubtitle' => '', # do not translate or duplicate this message to other languages
# Vector skin
-'vector-action-addsection' => 'Add topic',
-'vector-action-delete' => 'Delete',
-'vector-action-move' => 'Move',
-'vector-action-protect' => 'Protect',
-'vector-action-undelete' => 'Undelete',
-'vector-action-unprotect' => 'Unprotect',
-'vector-namespace-category' => 'Category',
-'vector-namespace-help' => 'Help page',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Page',
-'vector-namespace-media' => 'Media page',
-'vector-namespace-mediawiki' => 'Message',
-'vector-namespace-project' => 'Project page',
-'vector-namespace-special' => 'Special page',
-'vector-namespace-talk' => 'Discussion',
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => 'User page',
-'vector-view-create' => 'Create',
-'vector-view-edit' => 'Edit',
-'vector-view-history' => 'View history',
-'vector-view-view' => 'Read',
-'vector-view-viewsource' => 'View source',
-'actions' => 'Actions',
-'namespaces' => 'Namespaces',
-'variants' => 'Variants',
+'vector-action-addsection' => 'Add topic',
+'vector-action-delete' => 'Delete',
+'vector-action-move' => 'Move',
+'vector-action-protect' => 'Protect',
+'vector-action-undelete' => 'Undelete',
+'vector-action-unprotect' => 'Unprotect',
+'vector-simplesearch-preference' => 'Enable enhanced search suggestions (Vector skin only)',
+'vector-view-create' => 'Create',
+'vector-view-edit' => 'Edit',
+'vector-view-history' => 'View history',
+'vector-view-view' => 'Read',
+'vector-view-viewsource' => 'View source',
+'actions' => 'Actions',
+'namespaces' => 'Namespaces',
+'variants' => 'Variants',
'errorpagetitle' => 'Error',
'returnto' => 'Return to $1.',
@@ -861,6 +861,9 @@ Too many users are trying to view this page.
Please wait a while before you try to access this page again.
$1',
+'pool-timeout' => 'Timeout waiting for the lock',
+'pool-queuefull' => 'Pool queue is full',
+'pool-errorunknown' => 'Unknown error',
# 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' => 'About {{SITENAME}}',
@@ -1007,9 +1010,9 @@ Query: $2',
'actionthrottled' => 'Action throttled',
'actionthrottledtext' => 'As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.
Please try again in a few minutes.',
-'protectedpagetext' => 'This page has been locked to prevent editing.',
+'protectedpagetext' => 'This page has been protected to prevent editing.',
'viewsourcetext' => 'You can view and copy the source of this page:',
-'protectedinterface' => 'This page provides interface text for the software, and is locked to prevent abuse.',
+'protectedinterface' => 'This page provides interface text for the software, and is protected to prevent abuse.',
'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
Changes to this page will affect the appearance of the user interface for other users.
For translations, please consider using [http://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
@@ -1038,7 +1041,8 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Username:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Retype password:',
-'remembermypassword' => 'Remember my login on this computer',
+'remembermypassword' => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'securelogin-stick-https' => 'Stay connected to HTTPS after login',
'yourdomainname' => 'Your domain:',
'externaldberror' => 'There was either an authentication database error or you are not allowed to update your external account.',
'login' => 'Log in',
@@ -1055,6 +1059,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
'gotaccount' => 'Already have an account? $1.',
'gotaccountlink' => 'Log in',
'createaccountmail' => 'By e-mail',
+'createaccountreason' => 'Reason:',
'badretype' => 'The passwords you entered do not match.',
'userexists' => 'Username entered already in use.
Please choose a different name.',
@@ -1067,11 +1072,11 @@ Please enable them, then log in with your new username and password.',
'nocookieslogin' => '{{SITENAME}} uses cookies to log in users.
You have cookies disabled.
Please enable them and try again.',
-'noname' => 'You have not specified a valid user name.',
+'noname' => 'You have not specified a valid username.',
'loginsuccesstitle' => 'Login successful',
'loginsuccess' => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
'nosuchuser' => 'There is no user by the name "$1".
-User names are case sensitive.
+Usernames are case sensitive.
Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
'nosuchusershort' => 'There is no user by the name "<nowiki>$1</nowiki>".
Check your spelling.',
@@ -1083,6 +1088,7 @@ Please try again.',
Please try again.',
'passwordtooshort' => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
'password-name-match' => 'Your password must be different from your username.',
+'password-login-forbidden' => 'The use of this username and password has been forbidden.',
'mailmypassword' => 'E-mail new password',
'passwordremindertitle' => 'New temporary password for {{SITENAME}}',
'passwordremindertext' => 'Someone (probably you, from IP address $1) requested a new
@@ -1105,6 +1111,7 @@ Before any other e-mail is sent to the account, you will have to follow the inst
To prevent abuse, only one password reminder will be sent per {{PLURAL:$1|hour|$1 hours}}.',
'loginstart' => '', # do not translate or duplicate this message to other languages
'loginend' => '', # do not translate or duplicate this message to other languages
+'signupstart' => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
'signupend' => '{{int:loginend}}', # do not translate or duplicate this message to other languages
'mailerror' => 'Error sending mail: $1',
'acct_creation_throttle_hit' => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
@@ -1136,6 +1143,11 @@ Please wait before trying again.',
* Nederlands|nl', # do not translate or duplicate this message to other languages
'suspicious-userlogout' => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+# E-mail sending
+'pear-mail-error' => '$1', # do not translate or duplicate this message to other languages
+'php-mail-error' => '$1', # do not translate or duplicate this message to other languages
+'php-mail-error-unknown' => "Unknown error in PHP's mail() function",
+
# Password reset dialog
'resetpass' => 'Change password',
'resetpass_announce' => 'You logged in with a temporary e-mailed code.
@@ -1190,15 +1202,16 @@ You may have already successfully changed your password or requested a new tempo
'showdiff' => 'Show changes',
'anoneditwarning' => "'''Warning:''' You are not logged in.
Your IP address will be recorded in this page's edit history.",
+'anonpreviewwarning' => "''You are not logged in. Saving will record your IP address in this page's edit history.''",
'missingsummary' => "'''Reminder:''' You have not provided an edit summary.
-If you click Save again, your edit will be saved without one.",
+If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
'missingcommenttext' => 'Please enter a comment below.',
'missingcommentheader' => "'''Reminder:''' You have not provided a subject/headline for this comment.
If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
'summary-preview' => 'Summary preview:',
'subject-preview' => 'Subject/headline preview:',
'blockedtitle' => 'User is blocked',
-'blockedtext' => "'''Your user name or IP address has been blocked.'''
+'blockedtext' => "'''Your username or IP address has been blocked.'''
The block was made by $1.
The reason given is ''$2''.
@@ -1277,8 +1290,12 @@ The latest block log entry is provided below for reference:',
'''It has not yet been saved!'''",
'userjspreview' => "'''Remember that you are only testing/previewing your user JavaScript.'''
'''It has not yet been saved!'''",
+'sitecsspreview' => "'''Remember that you are only previewing this CSS.'''
+'''It has not yet been saved!'''",
+'sitejspreview' => "'''Remember that you are only previewing this JavaScript code.'''
+'''It has not yet been saved!'''",
'userinvalidcssjstitle' => "'''Warning:''' There is no skin \"\$1\".
-Remember that custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/monobook.css as opposed to {{ns:user}}:Foo/Monobook.css.",
+Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
'updated' => '(Updated)',
'note' => "'''Note:'''",
'previewnote' => "'''Remember that this is only a preview.'''
@@ -1304,7 +1321,7 @@ This sometimes happens when you are using a buggy web-based anonymous proxy serv
The upper text area contains the page text as it currently exists.
Your changes are shown in the lower text area.
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 \"Save page\".",
+'''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.'''
@@ -1321,21 +1338,19 @@ If you do not want your writing to be edited mercilessly, then do not submit it
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).
'''Do not submit copyrighted work without permission!'''",
'editpage-tos-summary' => '-', # do not translate or duplicate this message to other languages
-'longpagewarning' => "'''Warning:''' This page is $1 kilobytes long;
-some browsers may have problems editing pages approaching or longer than 32kb.
-Please consider breaking the page into smaller sections.",
+'longpage-hint' => '-', # do not translate or duplicate this message to other languages
'longpageerror' => "'''Error: The text you have submitted is $1 kilobytes long, which is longer than the maximum of $2 kilobytes.'''
It cannot be saved.",
'readonlywarning' => "'''Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.'''
You may wish to cut-n-paste the text into a text file and save it for later.
The administrator who locked it offered this explanation: $1",
-'protectedpagewarning' => "'''Warning: This page has been locked so that only users with administrator privileges can edit it.'''
+'protectedpagewarning' => "'''Warning: This page has been protected so that only users with administrator privileges can edit it.'''
The latest log entry is provided below for reference:",
-'semiprotectedpagewarning' => "'''Note:''' This page has been locked so that only registered users can edit it.
+'semiprotectedpagewarning' => "'''Note:''' This page has been protected so that only registered users can edit it.
The latest log entry is provided below for reference:",
-'cascadeprotectedwarning' => "'''Warning:''' This page has been locked so that only users with administrator privileges can edit it, because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
-'titleprotectedwarning' => "'''Warning: This page has been locked so that [[Special:ListGroupRights|specific rights]] are needed to create it.'''
+'cascadeprotectedwarning' => "'''Warning:''' This page has been protected so that only users with administrator privileges can edit it, because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
+'titleprotectedwarning' => "'''Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.'''
The latest log entry is provided below for reference:",
'templatesused' => '{{PLURAL:$1|Template|Templates}} used on this page:',
'templatesusedpreview' => '{{PLURAL:$1|Template|Templates}} used in this preview:',
@@ -1394,11 +1409,10 @@ Please check the comparison below to verify that this is what you want to do, an
'undo-summary' => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
# Account creation failure
-'cantcreateaccounttitle' => 'Cannot create account',
-'cantcreateaccount-text' => "Account creation from this IP address ('''$1''') has been blocked by [[User:$3|$3]].
+'cantcreateaccounttitle' => 'Cannot create account',
+'cantcreateaccount-text' => "Account creation from this IP address ('''$1''') has been blocked by [[User:$3|$3]].
The reason given by $3 is ''$2''",
-'cantcreateaccount-nonblock-text' => '', # do not translate or duplicate this message to other languages
# History pages
'viewpagelogs' => 'View logs for this page',
@@ -1436,7 +1450,7 @@ It may have been deleted from the wiki, or renamed.
Try [[Special:Search|searching on the wiki]] for relevant new pages.',
# Revision deletion
-'rev-deleted-comment' => '(comment removed)',
+'rev-deleted-comment' => '(edit summary removed)',
'rev-deleted-user' => '(username removed)',
'rev-deleted-event' => '(log action removed)',
'rev-deleted-user-contribs' => '[username or IP address removed - edit hidden from contributions]',
@@ -1510,6 +1524,8 @@ $1",
'logdelete-failure' => "'''Log visibility could not be set:'''
$1",
'revdel-restore' => 'change visibility',
+'revdel-restore-deleted' => 'deleted revisions',
+'revdel-restore-visible' => 'visible revisions',
'pagehist' => 'Page history',
'deletedhist' => 'Deleted history',
'revdelete-content' => 'content',
@@ -1580,11 +1596,13 @@ Note that using the navigation links will reset this column.',
# Diffs
'history-title' => 'Revision history of "$1"',
'difference' => '(Difference between revisions)',
+'difference-multipage' => '(Difference between pages)',
'lineno' => 'Line $1:',
'compareselectedversions' => 'Compare selected revisions',
'showhideselectedversions' => 'Show/hide selected revisions',
'editundo' => 'undo',
-'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} not shown)',
+'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
+'diff-multi-manyusers' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
# Search results
'search-summary' => '', # do not translate or duplicate this message to other languages
@@ -1605,8 +1623,9 @@ Note that using the navigation links will reset this column.',
'shown-title' => 'Show $1 {{PLURAL:$1|result|results}} per page',
'viewprevnext' => 'View ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Search options',
-'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" on this wiki'''",
+'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" on this wiki.'''",
'searchmenu-new' => "'''Create the page \"[[:\$1]]\" on this wiki!'''",
+'searchmenu-new-nocreate' => '', # do not translate or duplicate this message to other languages
'searchhelp-url' => 'Help:Contents',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Browse pages with this prefix]]',
'searchmenu-help' => '[[{{MediaWiki:Searchhelp-url}}|{{int:help}}]]?', # do not translate or duplicate this message to other languages
@@ -1621,6 +1640,7 @@ Note that using the navigation links will reset this column.',
'searchprofile-everything-tooltip' => 'Search all of content (including talk pages)',
'searchprofile-advanced-tooltip' => 'Search in custom namespaces',
'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 words}})',
+'search-result-category-size' => '{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})',
'search-result-score' => 'Relevance: $1%',
'search-redirect' => '(redirect $1)',
'search-section' => '(section $1)',
@@ -1716,6 +1736,7 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
'contextlines' => 'Lines per hit:',
'contextchars' => 'Context per line:',
'stub-threshold' => 'Threshold for <a href="#" class="stub">stub link</a> formatting (bytes):',
+'stub-threshold-disabled' => 'Disabled',
'recentchangesdays' => 'Days to show in recent changes:',
'recentchangesdays-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'recentchangescount' => 'Number of edits to show by default:',
@@ -1749,6 +1770,7 @@ Here's a randomly-generated value you can use: $1",
'prefs-files' => 'Files',
'prefs-custom-css' => 'Custom CSS',
'prefs-custom-js' => 'Custom JavaScript',
+'prefs-common-css-js' => 'Shared CSS/JavaScript for all skins:',
'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults.
This cannot be undone.',
'prefs-emailconfirm-label' => 'E-mail confirmation:',
@@ -1791,9 +1813,15 @@ You can also choose to let others contact you through your user or talk page wit
'prefs-advancedrendering' => 'Advanced options',
'prefs-advancedsearchoptions' => 'Advanced options',
'prefs-advancedwatchlist' => 'Advanced options',
-'prefs-display' => 'Display options',
+'prefs-displayrc' => 'Display options',
+'prefs-displaysearchoptions' => 'Display options',
+'prefs-displaywatchlist' => 'Display options',
'prefs-diffs' => 'Diffs',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail address appears valid',
+'email-address-validity-invalid' => 'Enter a valid e-mail address',
+
# User rights
'userrights' => 'User rights management',
'userrights-summary' => '', # do not translate or duplicate this message to other languages
@@ -1879,6 +1907,7 @@ You can also choose to let others contact you through your user or talk page wit
'right-hideuser' => 'Block a username, hiding it from the public',
'right-ipblock-exempt' => 'Bypass IP blocks, auto-blocks and range blocks',
'right-proxyunbannable' => 'Bypass automatic blocks of proxies',
+'right-unblockself' => 'Unblock themselves',
'right-protect' => 'Change protection levels and edit protected pages',
'right-editprotected' => 'Edit protected pages (without cascading protection)',
'right-editinterface' => 'Edit the user interface',
@@ -1901,7 +1930,6 @@ You can also choose to let others contact you through your user or talk page wit
'right-siteadmin' => 'Lock and unlock the database',
'right-reset-passwords' => "Reset other users' passwords",
'right-override-export-depth' => 'Export pages including linked pages up to a depth of 5',
-'right-versiondetail' => 'Show the extended software version information',
'right-sendemail' => 'Send e-mail to other users',
# User rights log
@@ -1953,14 +1981,9 @@ You can also choose to let others contact you through your user or talk page wit
'recentchanges-legend' => 'Recent changes options',
'recentchangestext' => 'Track the most recent changes to the wiki on this page.',
'recentchanges-feed-description' => 'Track the most recent changes to the wiki in this feed.',
-'recentchanges-label-legend' => 'Legend: $1.',
-'recentchanges-legend-newpage' => '$1 - new page',
'recentchanges-label-newpage' => 'This edit created a new page',
-'recentchanges-legend-minor' => '$1 - minor edit',
'recentchanges-label-minor' => 'This is a minor edit',
-'recentchanges-legend-bot' => '$1 - bot edit',
'recentchanges-label-bot' => 'This edit was performed by a bot',
-'recentchanges-legend-unpatrolled' => '$1 - unpatrolled edit',
'recentchanges-label-unpatrolled' => 'This edit has not yet been patrolled',
'rcnote' => "Below {{PLURAL:$1|is '''1''' change|are the last '''$1''' changes}} in the last {{PLURAL:$2|day|'''$2''' days}}, as of $5, $4.",
'rcnotefrom' => "Below are the changes since '''$2''' (up to '''$1''' shown).",
@@ -2013,6 +2036,9 @@ Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
'upload_directory_read_only' => 'The upload directory ($1) is not writable by the webserver.',
'uploaderror' => 'Upload error',
'upload-summary' => '', # do not translate or duplicate this message to other languages
+'upload-recreate-warning' => "'''Warning: A file by that name has been deleted or moved.'''
+
+The deletion and move log for this page are provided here for convenience:",
'uploadtext' => "Use the form below to upload files.
To view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
@@ -2049,6 +2075,17 @@ Preferred {{PLURAL:\$3|file type is|file types are}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' is not a permitted file type.
Permitted {{PLURAL:\$3|file type is|file types are}} \$2.",
'filetype-missing' => 'The file has no extension (like ".jpg").',
+'empty-file' => 'The file you submitted was empty.',
+'file-too-large' => 'The file you submitted was too large.',
+'filename-tooshort' => 'The filename is too short.',
+'filetype-banned' => 'This type of file is banned.',
+'verification-error' => 'This file did not pass file verification.',
+'hookaborted' => 'The modification you tried to make was aborted by an extension hook.',
+'illegal-filename' => 'The filename is not allowed.',
+'overwrite' => 'Overwriting an existing file is not allowed.',
+'unknown-error' => 'An unknown error occured.',
+'tmp-create-error' => 'Could not create temporary file.',
+'tmp-write-error' => 'Error writing temporary file.',
'large-file' => 'It is recommended that files are no larger than $1;
this file is $2.',
'largefileserver' => 'This file is bigger than the server is configured to allow.',
@@ -2079,15 +2116,16 @@ If you still want to upload your file, please go back and use a new name.
If you still want to upload your file, please go back and use a new name.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'This file is a duplicate of the following {{PLURAL:$1|file|files}}:',
-'file-deleted-duplicate' => "A file identical to this file ([[$1]]) has previously been deleted.
+'file-deleted-duplicate' => "A file identical to this file ([[:$1]]) has previously been deleted.
You should check that file's deletion history before proceeding to re-upload it.",
-'successfulupload' => 'Successful upload',
'uploadwarning' => 'Upload warning',
'uploadwarning-text' => 'Please modify the file description below and try again.',
'savefile' => 'Save file',
'uploadedimage' => 'uploaded "[[$1]]"',
'overwroteimage' => 'uploaded a new version of "[[$1]]"',
'uploaddisabled' => 'Uploads disabled.',
+'copyuploaddisabled' => 'Upload by URL disabled.',
+'uploadfromurl-queued' => 'Your upload has been queued.',
'uploaddisabledtext' => 'File uploads are disabled.',
'php-uploaddisabledtext' => 'File uploads are disabled in PHP.
Please check the file_uploads setting.',
@@ -2124,6 +2162,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- leave this line exactly as it is -->', # only translate this message to other languages if you have to change it
+'upload-success-subj' => 'Successful upload',
+'upload-success-msg' => 'Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Upload problem',
+'upload-failure-msg' => 'There was a problem with your upload from [$2]:
+
+$1',
+'upload-warning-subj' => 'Upload warning',
+'upload-warning-msg' => 'There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.',
'upload-proto-error' => 'Incorrect protocol',
'upload-proto-error-text' => 'Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.',
@@ -2191,6 +2237,7 @@ A click on a column header changes the sorting.',
'listfiles_search_for' => 'Search for media name:',
'imgfile' => 'file',
'listfiles' => 'File list',
+'listfiles_thumb' => 'Thumbnail',
'listfiles_date' => 'Date',
'listfiles_name' => 'Name',
'listfiles_user' => 'User',
@@ -2236,6 +2283,7 @@ The description on its [$2 file description page] there is shown below.',
'shared-repo-from' => 'from $1',
'shared-repo' => 'a shared repository',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons', # only translate this message to other languages if you have to change it
+'filepage.css' => '/* CSS placed here is included on the file description page, also included on foreign client wikis */', # only translate this message to other languages if you have to change it
# File reversion
'filerevert' => 'Revert $1',
@@ -2270,7 +2318,7 @@ The description on its [$2 file description page] there is shown below.',
# MIME search
'mimesearch' => 'MIME search',
-'mimesearch-summary' => 'This page enables the filtering of files for its MIME type.
+'mimesearch-summary' => 'This page enables the filtering of files for their MIME type.
Input: contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'mimetype' => 'MIME type:',
'download' => 'download',
@@ -2314,8 +2362,8 @@ Remember to check for other links to the templates before deleting them.',
'statistics-edits' => 'Page edits since {{SITENAME}} was set up',
'statistics-edits-average' => 'Average edits per page',
'statistics-views-total' => 'Views total',
+'statistics-views-total-desc' => 'Views to non-existing pages and special pages are not included',
'statistics-views-peredit' => 'Views per edit',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job queue] length',
'statistics-users' => 'Registered [[Special:ListUsers|users]]',
'statistics-users-active' => 'Active users',
'statistics-users-active-desc' => 'Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}',
@@ -2333,7 +2381,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
'doubleredirects-summary' => '', # do not translate or duplicate this message to other languages
'doubleredirectstext' => 'This page lists pages which redirect to other redirect pages.
Each row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the "real" target page, which the first redirect should point to.
-<s>Crossed out</s> entries have been solved.',
+<del>Crossed out</del> entries have been solved.',
'double-redirect-fixed-move' => '[[$1]] has been moved.
It now redirects to [[$2]].',
'double-redirect-fixer' => 'Redirect fixer',
@@ -2359,6 +2407,8 @@ It now redirects to [[$2]].',
'nmembers' => '$1 {{PLURAL:$1|member|members}}',
'nrevisions' => '$1 {{PLURAL:$1|revision|revisions}}',
'nviews' => '$1 {{PLURAL:$1|view|views}}',
+'nimagelinks' => 'Used on $1 {{PLURAL:$1|page|pages}}',
+'ntransclusions' => 'used on $1 {{PLURAL:$1|page|pages}}',
'specialpage-empty' => 'There are no results for this report.',
'lonelypages' => 'Orphaned pages',
'lonelypages-summary' => '', # do not translate or duplicate this message to other languages
@@ -2458,7 +2508,7 @@ Please note that other web sites may link to a file with a direct URL, and so ma
'log' => 'Logs',
'all-logs-page' => 'All public logs',
'alllogstext' => 'Combined display of all available logs of {{SITENAME}}.
-You can narrow down the view by selecting a log type, the user name (case-sensitive), or the affected page (also case-sensitive).',
+You can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).',
'logempty' => 'No matching items in log.',
'log-title-wildcard' => 'Search titles starting with this text',
@@ -2553,34 +2603,41 @@ There may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] a
'listgrouprights-removegroup-self-all' => 'Remove all groups from own account',
# E-mail user
-'mailnologin' => 'No send address',
-'mailnologintext' => 'You must be [[Special:UserLogin|logged in]] and have a valid e-mail address in your [[Special:Preferences|preferences]] to send e-mail to other users.',
-'emailuser' => 'E-mail this user',
-'emailpage' => 'E-mail user',
-'emailpagetext' => 'You can use the form below to send an e-mail message to this user.
+'mailnologin' => 'No send address',
+'mailnologintext' => 'You must be [[Special:UserLogin|logged in]] and have a valid e-mail address in your [[Special:Preferences|preferences]] to send e-mail to other users.',
+'emailuser' => 'E-mail this user',
+'emailpage' => 'E-mail user',
+'emailpagetext' => 'You can use the form below to send an e-mail message to this user.
The e-mail address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the e-mail, so the recipient will be able to reply directly to you.',
-'usermailererror' => 'Mail object returned error:',
-'defemailsubject' => '{{SITENAME}} e-mail',
-'noemailtitle' => 'No e-mail address',
-'noemailtext' => 'This user has not specified a valid e-mail address.',
-'nowikiemailtitle' => 'No e-mail allowed',
-'nowikiemailtext' => 'This user has chosen not to receive e-mail from other users.',
-'email-legend' => 'Send an e-mail to another {{SITENAME}} user',
-'emailfrom' => 'From:',
-'emailto' => 'To:',
-'emailsubject' => 'Subject:',
-'emailmessage' => 'Message:',
-'emailsend' => 'Send',
-'emailccme' => 'E-mail me a copy of my message.',
-'emailccsubject' => 'Copy of your message to $1: $2',
-'emailsent' => 'E-mail sent',
-'emailsenttext' => 'Your e-mail message has been sent.',
-'emailuserfooter' => 'This e-mail was sent by $1 to $2 by the "E-mail user" function at {{SITENAME}}.',
+'usermailererror' => 'Mail object returned error:',
+'defemailsubject' => '{{SITENAME}} e-mail',
+'usermaildisabled' => 'User e-mail disabled',
+'usermaildisabledtext' => 'You cannot send e-mail to other users on this wiki',
+'noemailtitle' => 'No e-mail address',
+'noemailtext' => 'This user has not specified a valid e-mail address.',
+'nowikiemailtitle' => 'No e-mail allowed',
+'nowikiemailtext' => 'This user has chosen not to receive e-mail from other users.',
+'email-legend' => 'Send an e-mail to another {{SITENAME}} user',
+'emailfrom' => 'From:',
+'emailto' => 'To:',
+'emailsubject' => 'Subject:',
+'emailmessage' => 'Message:',
+'emailsend' => 'Send',
+'emailccme' => 'E-mail me a copy of my message.',
+'emailccsubject' => 'Copy of your message to $1: $2',
+'emailsent' => 'E-mail sent',
+'emailsenttext' => 'Your e-mail message has been sent.',
+'emailuserfooter' => 'This e-mail was sent by $1 to $2 by the "E-mail user" function at {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Leaving system message.',
+'usermessage-editor' => 'System messenger',
+'usermessage-template' => 'MediaWiki:UserMessage', # only translate this message to other languages if you have to change it
# Watchlist
'watchlist' => 'My watchlist',
'mywatchlist' => 'My watchlist',
-'watchlistfor' => "(for '''$1''')",
+'watchlistfor2' => 'For $1 $2',
'nowatchlist' => 'You have no items on your watchlist.',
'watchlistanontext' => 'Please $1 to view or edit items on your watchlist.',
'watchnologin' => 'Not logged in',
@@ -2703,13 +2760,16 @@ The last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe
'revertpage-nouser' => 'Reverted edits by (username removed) to last revision by [[User:$1|$1]]',
'rollback-success' => 'Reverted edits by $1;
changed back to last revision by $2.',
-'sessionfailure' => 'There seems to be a problem with your login session;
+
+# Edit tokens
+'sessionfailure-title' => 'Session failure',
+'sessionfailure' => 'There seems to be a problem with your login session;
this action has been canceled as a precaution against session hijacking.
Go back to the previous page, reload that page and then try again.',
# Protect
'protectlogpage' => 'Protection log',
-'protectlogtext' => 'Below is a list of page locks and unlocks.
+'protectlogtext' => 'Below is a list of page protections and page unprotections.
See the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.',
'protectedarticle' => 'protected "[[$1]]"',
'modifiedarticleprotection' => 'changed protection level for "[[$1]]"',
@@ -2779,9 +2839,9 @@ You can change this page's protection level, but it will not affect the cascadin
'undeletepagetext' => 'The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.
The archive may be periodically cleaned out.',
'undelete-fieldset-title' => 'Restore revisions',
-'undeleteextrahelp' => "To restore the page's entire history, leave all checkboxes deselected and click '''''Restore'''''.
-To perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''Restore'''''.
-Clicking '''''Reset''''' will clear the comment field and all checkboxes.",
+'undeleteextrahelp' => "To restore the page's entire history, leave all checkboxes deselected and click '''''{{int:undeletebtn}}'''''.
+To perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''{{int:undeletebtn}}'''''.
+Clicking '''''{{int:undeletereset}}''''' will clear the comment field and all checkboxes.",
'undeleterevisions' => '$1 {{PLURAL:$1|revision|revisions}} archived',
'undeletehistory' => 'If you restore the page, all revisions will be restored to the history.
If a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.',
@@ -2841,22 +2901,26 @@ $1',
'month' => 'From month (and earlier):',
'year' => 'From year (and earlier):',
-'sp-contributions-newbies' => 'Show contributions of new accounts only',
-'sp-contributions-newbies-sub' => 'For new accounts',
-'sp-contributions-newbies-title' => 'User contributions for new accounts',
-'sp-contributions-blocklog' => 'block log',
-'sp-contributions-deleted' => 'deleted user contributions',
-'sp-contributions-logs' => 'logs',
-'sp-contributions-talk' => 'talk',
-'sp-contributions-userrights' => 'user rights management',
-'sp-contributions-blocked-notice' => 'This user is currently blocked.
+'sp-contributions-newbies' => 'Show contributions of new accounts only',
+'sp-contributions-newbies-sub' => 'For new accounts',
+'sp-contributions-newbies-title' => 'User contributions for new accounts',
+'sp-contributions-blocklog' => 'block log',
+'sp-contributions-deleted' => 'deleted user contributions',
+'sp-contributions-uploads' => 'uploads',
+'sp-contributions-logs' => 'logs',
+'sp-contributions-talk' => 'talk',
+'sp-contributions-userrights' => 'user rights management',
+'sp-contributions-blocked-notice' => 'This user is currently blocked.
+The latest block log entry is provided below for reference:',
+'sp-contributions-blocked-notice-anon' => 'This IP address is currently blocked.
The latest block log entry is provided below for reference:',
-'sp-contributions-search' => 'Search for contributions',
-'sp-contributions-username' => 'IP address or username:',
-'sp-contributions-submit' => 'Search',
-'sp-contributions-explain' => '', # only translate this message to other languages if you have to change it
-'sp-contributions-footer' => '-', # do not translate or duplicate this message to other languages
-'sp-contributions-footer-anon' => '-', # do not translate or duplicate this message to other languages
+'sp-contributions-search' => 'Search for contributions',
+'sp-contributions-username' => 'IP address or username:',
+'sp-contributions-toponly' => 'Only show edits that are latest revisions',
+'sp-contributions-submit' => 'Search',
+'sp-contributions-explain' => '', # only translate this message to other languages if you have to change it
+'sp-contributions-footer' => '-', # do not translate or duplicate this message to other languages
+'sp-contributions-footer-anon' => '-', # do not translate or duplicate this message to other languages
# What links here
'whatlinkshere' => 'What links here',
@@ -2919,7 +2983,6 @@ See [[Special:IPBlockList|IP block list]] to review blocks.',
'ipb-edit-dropdown' => 'Edit block reasons',
'ipb-unblock-addr' => 'Unblock $1',
'ipb-unblock' => 'Unblock a username or IP address',
-'ipb-blocklist-addr' => 'Existing blocks for $1',
'ipb-blocklist' => 'View existing blocks',
'ipb-blocklist-contribs' => 'Contributions for $1',
'unblockip' => 'Unblock user',
@@ -2999,6 +3062,8 @@ You cannot create an account',
'cant-block-while-blocked' => 'You cannot block other users while you are blocked.',
'cant-see-hidden-user' => "The user you are trying to block has already been blocked and hidden.
Since you do not have the hideuser right, you cannot see or edit the user's block.",
+'ipbblocked' => 'You cannot block or unblock other users, because you are yourself blocked',
+'ipbnounblockself' => 'You are not allowed to unblock yourself',
# Developer tools
'lockdb' => 'Lock database',
@@ -3037,6 +3102,17 @@ This means that you can rename a page back to where it was renamed from if you m
'''Warning!'''
This can be a drastic and unexpected change for a popular page;
please be sure you understand the consequences of this before proceeding.",
+'movepagetext-noredirectfixer' => "Using the form below will rename a page, moving all of its history to the new name.
+The old title will become a redirect page to the new title.
+Be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
+You are responsible for making sure that links continue to point where they are supposed to go.
+
+Note that the page will '''not''' be moved if there is already a page at the new title, unless it is empty or a redirect and has no past edit history.
+This means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.
+
+'''Warning!'''
+This can be a drastic and unexpected change for a popular page;
+please be sure you understand the consequences of this before proceeding.",
'movepagetalktext' => "The associated talk page will be automatically moved along with it '''unless:'''
*A non-empty talk page already exists under the new name, or
*You uncheck the box below.
@@ -3094,13 +3170,14 @@ cannot move a page over itself.',
'immobile-source-page' => 'This page is not movable.',
'immobile-target-page' => 'Cannot move to that destination title.',
'imagenocrossnamespace' => 'Cannot move file to non-file namespace',
+'nonfile-cannot-move-to-file' => 'Cannot move non-file to file namespace',
'imagetypemismatch' => 'The new file extension does not match its type',
'imageinvalidfilename' => 'The target file name is invalid',
'fix-double-redirects' => 'Update any redirects that point to the original title',
'move-leave-redirect' => 'Leave a redirect behind',
-'protectedpagemovewarning' => "'''Warning:''' This page has been locked so that only users with administrator privileges can move it.
+'protectedpagemovewarning' => "'''Warning:''' This page has been protected so that only users with administrator privileges can move it.
The latest log entry is provided below for reference:",
-'semiprotectedpagemovewarning' => "'''Note:''' This page has been locked so that only registered users can move it.
+'semiprotectedpagemovewarning' => "'''Note:''' This page has been protected so that only registered users can move it.
The latest log entry is provided below for reference:",
'move-over-sharedrepo' => '== File exists ==
[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.',
@@ -3174,6 +3251,7 @@ Save it to your computer and upload it here.',
'importstart' => 'Importing pages...',
'import-revision-count' => '$1 {{PLURAL:$1|revision|revisions}}',
'importnopages' => 'No pages to import.',
+'imported-log-entries' => 'Imported $1 {{PLURAL:$1|log entry|log entries}}.',
'importfailed' => 'Import failed: <nowiki>$1</nowiki>',
'importunknownsource' => 'Unknown import source type',
'importcantopen' => 'Could not open import file',
@@ -3267,6 +3345,12 @@ Please try again.',
'accesskey-compareselectedversions' => 'v', # do not translate or duplicate this message to other languages
'accesskey-watch' => 'w', # do not translate or duplicate this message to other languages
'accesskey-upload' => 's', # do not translate or duplicate this message to other languages
+'accesskey-preferences-save' => 's', # do not translate or duplicate this message to other languages
+'accesskey-summary' => 'b', # do not translate or duplicate this message to other languages
+'accesskey-userrights-set' => 's', # do not translate or duplicate this message to other languages
+'accesskey-blockip-block' => 's', # do not translate or duplicate this message to other languages
+'accesskey-export' => 's', # do not translate or duplicate this message to other languages
+'accesskey-import' => 's', # do not translate or duplicate this message to other languages
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Your user page',
@@ -3333,6 +3417,8 @@ You can view its source',
'tooltip-upload' => 'Start upload',
'tooltip-rollback' => '"Rollback" reverts edit(s) to this page of the last contributor in one click',
'tooltip-undo' => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
+'tooltip-preferences-save' => 'Save preferences',
+'tooltip-summary' => 'Enter a short summary',
# Stylesheets
'common.css' => '/* CSS placed here will be applied to all skins */', # only translate this message to other languages if you have to change it
@@ -3340,7 +3426,7 @@ You can view its source',
'nostalgia.css' => '/* CSS placed here will affect users of the Nostalgia skin */', # only translate this message to other languages if you have to change it
'cologneblue.css' => '/* CSS placed here will affect users of the Cologne Blue skin */', # only translate this message to other languages if you have to change it
'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */', # only translate this message to other languages if you have to change it
-'myskin.css' => '/* CSS placed here will affect users of the Myskin skin */', # only translate this message to other languages if you have to change it
+'myskin.css' => '/* CSS placed here will affect users of the MySkin skin */', # only translate this message to other languages if you have to change it
'chick.css' => '/* CSS placed here will affect users of the Chick skin */', # only translate this message to other languages if you have to change it
'simple.css' => '/* CSS placed here will affect users of the Simple skin */', # only translate this message to other languages if you have to change it
'modern.css' => '/* CSS placed here will affect users of the Modern skin */', # only translate this message to other languages if you have to change it
@@ -3354,7 +3440,7 @@ You can view its source',
'nostalgia.js' => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */', # only translate this message to other languages if you have to change it
'cologneblue.js' => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */', # only translate this message to other languages if you have to change it
'monobook.js' => '/* Any JavaScript here will be loaded for users using the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.js' => '/* Any JavaScript here will be loaded for users using the Myskin skin */', # only translate this message to other languages if you have to change it
+'myskin.js' => '/* Any JavaScript here will be loaded for users using the MySkin skin */', # only translate this message to other languages if you have to change it
'chick.js' => '/* Any JavaScript here will be loaded for users using the Chick skin */', # only translate this message to other languages if you have to change it
'simple.js' => '/* Any JavaScript here will be loaded for users using the Simple skin */', # only translate this message to other languages if you have to change it
'modern.js' => '/* Any JavaScript here will be loaded for users using the Modern skin */', # only translate this message to other languages if you have to change it
@@ -3379,7 +3465,7 @@ You can view its source',
# Spam protection
'spamprotectiontitle' => 'Spam protection filter',
-'spamprotectiontext' => 'The page you wanted to save was blocked by the spam filter.
+'spamprotectiontext' => 'The text you wanted to save was blocked by the spam filter.
This is probably caused by a link to a blacklisted external site.',
'spamprotectionmatch' => 'The following text is what triggered our spam filter: $1',
'spambot_username' => 'MediaWiki spam cleanup',
@@ -3419,8 +3505,7 @@ This is probably caused by a link to a blacklisted external site.',
'math_unknown_function' => 'unknown function',
'math_lexing_error' => 'lexing error',
'math_syntax_error' => 'syntax error',
-'math_image_error' => 'PNG conversion failed;
-check for correct installation of latex, dvips, gs, and convert',
+'math_image_error' => 'PNG conversion failed; check for correct installation of latex and dvipng (or dvips + gs + convert)',
'math_bad_tmpdir' => 'Cannot write to or create math temp directory',
'math_bad_output' => 'Cannot write to or create math output directory',
'math_notexvc' => 'Missing texvc executable; please see math/README to configure.',
@@ -3467,14 +3552,17 @@ By executing it, your system may be compromised.",
'thumbsize' => 'Thumbnail size:',
'widthheight' => '$1×$2', # only translate this message to other languages if you have to change it
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|page|pages}}',
-'file-info' => '(file size: $1, MIME type: $2)',
-'file-info-size' => '($1 × $2 pixels, file size: $3, MIME type: $4)',
+'file-info' => 'file size: $1, MIME type: $2',
+'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
'file-nohires' => '<small>No higher resolution available.</small>',
-'svg-long-desc' => '(SVG file, nominally $1 × $2 pixels, file size: $3)',
+'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
'show-big-image' => 'Full resolution',
'show-big-image-thumb' => '<small>Size of this preview: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'looped',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'file-info-png-looped' => 'looped',
+'file-info-png-repeat' => 'played $1 {{PLURAL:$1|time|times}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
# Special:NewFiles
'newimages' => 'Gallery of new files',
@@ -3598,8 +3686,8 @@ Others will be hidden by default.
'exif-colorspace' => 'Color space',
'exif-componentsconfiguration' => 'Meaning of each component',
'exif-compressedbitsperpixel' => 'Image compression mode',
-'exif-pixelydimension' => 'Valid image width',
-'exif-pixelxdimension' => 'Valid image height',
+'exif-pixelydimension' => 'Image width',
+'exif-pixelxdimension' => 'Image height',
'exif-makernote' => 'Manufacturer notes',
'exif-usercomment' => 'User comments',
'exif-relatedsoundfile' => 'Related audio file',
@@ -3616,10 +3704,10 @@ Others will be hidden by default.
'exif-spectralsensitivity' => 'Spectral sensitivity',
'exif-isospeedratings' => 'ISO speed rating',
'exif-oecf' => 'Optoelectronic conversion factor',
-'exif-shutterspeedvalue' => 'Shutter speed',
-'exif-aperturevalue' => 'Aperture',
-'exif-brightnessvalue' => 'Brightness',
-'exif-exposurebiasvalue' => 'Exposure bias',
+'exif-shutterspeedvalue' => 'APEX shutter speed',
+'exif-aperturevalue' => 'APEX aperture',
+'exif-brightnessvalue' => 'APEX brightness',
+'exif-exposurebiasvalue' => 'APEX exposure bias',
'exif-maxaperturevalue' => 'Maximum land aperture',
'exif-subjectdistance' => 'Subject distance',
'exif-meteringmode' => 'Metering mode',
@@ -3683,6 +3771,7 @@ Others will be hidden by default.
'exif-gpsareainformation' => 'Name of GPS area',
'exif-gpsdatestamp' => 'GPS date',
'exif-gpsdifferential' => 'GPS differential correction',
+'exif-objectname' => 'Short title',
# Make & model, can be wikified in order to link to the camera and model name
'exif-make-value' => '$1', # do not translate or duplicate this message to other languages
@@ -3738,9 +3827,9 @@ Others will be hidden by default.
'exif-meteringmode-0' => 'Unknown',
'exif-meteringmode-1' => 'Average',
-'exif-meteringmode-2' => 'CenterWeightedAverage',
+'exif-meteringmode-2' => 'Center weighted average',
'exif-meteringmode-3' => 'Spot',
-'exif-meteringmode-4' => 'MultiSpot',
+'exif-meteringmode-4' => 'Multi-Spot',
'exif-meteringmode-5' => 'Pattern',
'exif-meteringmode-6' => 'Partial',
'exif-meteringmode-255' => 'Other',
@@ -3789,7 +3878,7 @@ Others will be hidden by default.
'exif-sensingmethod-7' => 'Trilinear sensor',
'exif-sensingmethod-8' => 'Color sequential linear sensor',
-'exif-filesource-3' => 'DSC', # only translate this message to other languages if you have to change it
+'exif-filesource-3' => 'Digital still camera',
'exif-scenetype-1' => 'A directly photographed image',
@@ -3867,31 +3956,31 @@ Others will be hidden by default.
'limitall' => 'all',
# E-mail address confirmation
-'confirmemail' => 'Confirm e-mail address',
-'confirmemail_noemail' => 'You do not have a valid e-mail address set in your [[Special:Preferences|user preferences]].',
-'confirmemail_text' => '{{SITENAME}} requires that you validate your e-mail address before using e-mail features.
+'confirmemail' => 'Confirm e-mail address',
+'confirmemail_noemail' => 'You do not have a valid e-mail address set in your [[Special:Preferences|user preferences]].',
+'confirmemail_text' => '{{SITENAME}} requires that you validate your e-mail address before using e-mail features.
Activate the button below to send a confirmation mail to your address.
The mail will include a link containing a code;
load the link in your browser to confirm that your e-mail address is valid.',
-'confirmemail_pending' => 'A confirmation code has already been e-mailed to you;
+'confirmemail_pending' => 'A confirmation code has already been e-mailed to you;
if you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.',
-'confirmemail_send' => 'Mail a confirmation code',
-'confirmemail_sent' => 'Confirmation e-mail sent.',
-'confirmemail_oncreate' => 'A confirmation code was sent to your e-mail address.
+'confirmemail_send' => 'Mail a confirmation code',
+'confirmemail_sent' => 'Confirmation e-mail sent.',
+'confirmemail_oncreate' => 'A confirmation code was sent to your e-mail address.
This code is not required to log in, but you will need to provide it before enabling any e-mail-based features in the wiki.',
-'confirmemail_sendfailed' => '{{SITENAME}} could not send your confirmation mail.
+'confirmemail_sendfailed' => '{{SITENAME}} could not send your confirmation mail.
Please check your e-mail address for invalid characters.
Mailer returned: $1',
-'confirmemail_invalid' => 'Invalid confirmation code.
+'confirmemail_invalid' => 'Invalid confirmation code.
The code may have expired.',
-'confirmemail_needlogin' => 'You need to $1 to confirm your e-mail address.',
-'confirmemail_success' => 'Your e-mail address has been confirmed.
+'confirmemail_needlogin' => 'You need to $1 to confirm your e-mail address.',
+'confirmemail_success' => 'Your e-mail address has been confirmed.
You may now [[Special:UserLogin|log in]] and enjoy the wiki.',
-'confirmemail_loggedin' => 'Your e-mail address has now been confirmed.',
-'confirmemail_error' => 'Something went wrong saving your confirmation.',
-'confirmemail_subject' => '{{SITENAME}} e-mail address confirmation',
-'confirmemail_body' => 'Someone, probably you, from IP address $1,
+'confirmemail_loggedin' => 'Your e-mail address has now been confirmed.',
+'confirmemail_error' => 'Something went wrong saving your confirmation.',
+'confirmemail_subject' => '{{SITENAME}} e-mail address confirmation',
+'confirmemail_body' => 'Someone, probably you, from IP address $1,
has registered an account "$2" with this e-mail address on {{SITENAME}}.
To confirm that this account really does belong to you and activate
@@ -3905,8 +3994,36 @@ to cancel the e-mail address confirmation:
$5
This confirmation code will expire at $4.',
-'confirmemail_invalidated' => 'E-mail address confirmation canceled',
-'invalidateemail' => 'Cancel e-mail confirmation',
+'confirmemail_body_changed' => 'Someone, probably you, from IP address $1,
+has changed the e-mail address of the account "$2" to this address on {{SITENAME}}.
+
+To confirm that this account really does belong to you and reactivate
+e-mail features on {{SITENAME}}, open this link in your browser:
+
+$3
+
+If the account does *not* belong to you, follow this link
+to cancel the e-mail address confirmation:
+
+$5
+
+This confirmation code will expire at $4.',
+'confirmemail_body_set' => 'Someone, probably you, from IP address $1,
+has set the e-mail address of the account "$2" to this address on {{SITENAME}}.
+
+To confirm that this account really does belong to you and reactivate
+e-mail features on {{SITENAME}}, open this link in your browser:
+
+$3
+
+If the account does *not* belong to you, follow this link
+to cancel the e-mail address confirmation:
+
+$5
+
+This confirmation code will expire at $4.',
+'confirmemail_invalidated' => 'E-mail address confirmation canceled',
+'invalidateemail' => 'Cancel e-mail confirmation',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki transcluding is disabled]',
@@ -3962,6 +4079,7 @@ Please confirm that you really want to recreate this page.",
'table_pager_first' => 'First page',
'table_pager_last' => 'Last page',
'table_pager_limit' => 'Show $1 items per page',
+'table_pager_limit_label' => 'Items per page:',
'table_pager_limit_submit' => 'Go',
'table_pager_empty' => 'No results',
@@ -4113,6 +4231,7 @@ You can also [[Special:Watchlist/edit|use the standard editor]].',
'version-specialpages' => 'Special pages',
'version-parserhooks' => 'Parser hooks',
'version-variables' => 'Variables',
+'version-skins' => 'Skins',
'version-other' => 'Other',
'version-mediahandlers' => 'Media handlers',
'version-hooks' => 'Hooks',
@@ -4125,6 +4244,13 @@ You can also [[Special:Watchlist/edit|use the standard editor]].',
'version-version' => '(Version $1)',
'version-svn-revision' => '(r$2)', # only translate this message to other languages if you have to change it
'version-license' => 'License',
+'version-poweredby-credits' => "This wiki is powered by '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'others',
+'version-license-info' => 'MediaWiki 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.
+
+MediaWiki 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 [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
'version-software' => 'Installed software',
'version-software-product' => 'Product',
'version-software-version' => 'Version',
@@ -4196,6 +4322,15 @@ Enter the filename without the "{{ns:file}}:" prefix.',
'tags-edit' => 'edit',
'tags-hitcount' => '$1 {{PLURAL:$1|change|changes}}',
+# Special:ComparePages
+'comparepages' => 'Compare pages',
+'compare-selector' => 'Compare page revisions',
+'compare-page1' => 'Page 1',
+'compare-page2' => 'Page 2',
+'compare-rev1' => 'Revision 1',
+'compare-rev2' => 'Revision 2',
+'compare-submit' => 'Compare',
+
# Database error messages
'dberr-header' => 'This wiki has a problem',
'dberr-problems' => 'Sorry!
@@ -4213,8 +4348,13 @@ This site is experiencing technical difficulties.',
'htmlform-float-invalid' => 'The value you specified is not a number.',
'htmlform-int-toolow' => 'The value you specified is below the minimum of $1',
'htmlform-int-toohigh' => 'The value you specified is above the maximum of $1',
+'htmlform-required' => 'This value is required',
'htmlform-submit' => 'Submit',
'htmlform-reset' => 'Undo changes',
'htmlform-selectorother-other' => 'Other',
+# SQLite database support
+'sqlite-has-fts' => '$1 with full-text search support',
+'sqlite-no-fts' => '$1 without full-text search support',
+
);
diff --git a/languages/messages/MessagesEn_gb.php b/languages/messages/MessagesEn_gb.php
index c6dc017f..d10e3636 100644
--- a/languages/messages/MessagesEn_gb.php
+++ b/languages/messages/MessagesEn_gb.php
@@ -15,21 +15,18 @@
$specialPageAliases = array(
'Uncategorizedpages' => array( 'UncategorisedPages' ),
'Uncategorizedcategories' => array( 'UncategorisedCategories' ),
- 'Uncategorizedimages' => array( 'UncategorisedImages' ),
+ 'Uncategorizedimages' => array( 'UncategorisedFiles', 'UncategorisedImages' ),
'Uncategorizedtemplates' => array( 'UncategorisedTemplates' ),
);
$messages = array(
-# Main script and global functions
-'nosuchactiontext' => 'The action specified by the URL is not recognised by the wiki',
-
# Miscellaneous special pages
'uncategorizedpages' => 'Uncategorised pages',
'uncategorizedcategories' => 'Uncategorised categories',
'uncategorizedimages' => 'Uncategorised files',
'uncategorizedtemplates' => 'Uncategorised templates',
-# Rollback
+# Edit tokens
'sessionfailure' => 'There seems to be a problem with your login session;
this action has been cancelled as a precaution against session hijacking.
Go back to the previous page, reload that page and then try again.',
diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php
index 77fa3572..86df4fae 100644
--- a/languages/messages/MessagesEo.php
+++ b/languages/messages/MessagesEo.php
@@ -31,146 +31,266 @@
*/
$namespaceNames = array(
- NS_MEDIA => 'Media',
- NS_SPECIAL => 'Speciala',
+ NS_MEDIA => 'Aŭdvidaĵo',
+ NS_SPECIAL => 'Specialaĵo',
NS_TALK => 'Diskuto',
- NS_USER => 'Vikipediisto',
- NS_USER_TALK => 'Vikipediista_diskuto',
- NS_PROJECT_TALK => '$1_diskuto',
+ NS_USER => 'Uzanto',
+ NS_USER_TALK => 'Uzanto-Diskuto',
+ NS_PROJECT_TALK => '$1-Diskuto',
NS_FILE => 'Dosiero',
- NS_FILE_TALK => 'Dosiera_diskuto',
+ NS_FILE_TALK => 'Dosiero-Diskuto',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_diskuto',
+ NS_MEDIAWIKI_TALK => 'MediaWiki-Diskuto',
NS_TEMPLATE => 'Åœablono',
- NS_TEMPLATE_TALK => 'Åœablona_diskuto',
+ NS_TEMPLATE_TALK => 'Åœablono-Diskuto',
NS_HELP => 'Helpo',
- NS_HELP_TALK => 'Helpa_diskuto',
+ NS_HELP_TALK => 'Helpo-Diskuto',
NS_CATEGORY => 'Kategorio',
- NS_CATEGORY_TALK => 'Kategoria_diskuto',
+ NS_CATEGORY_TALK => 'Kategorio-Diskuto',
+);
+
+$namespaceAliases = array(
+ 'Speciala' => NS_SPECIAL,
+ 'Vikipediisto' => NS_USER,
+ 'Vikipediista_diskuto' => NS_USER_TALK,
+ 'Uzulo' => NS_USER,
+ 'Uzanto' => NS_USER,
+ 'Uzula_diskuto' => NS_USER_TALK,
+ 'Uzanta_diskuto' => NS_USER_TALK,
+ '$1_diskuto' => NS_PROJECT_TALK,
+ 'Dosiera_diskuto' => NS_FILE_TALK,
+ 'MediaVikio' => NS_MEDIAWIKI,
+ 'MediaWiki_diskuto' => NS_MEDIAWIKI_TALK,
+ 'MediaVikia_diskuto' => NS_MEDIAWIKI_TALK,
+ 'Åœablona_diskuto' => NS_TEMPLATE_TALK,
+ 'Helpa_diskuto' => NS_HELP_TALK,
+ 'Kategoria_diskuto' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Duoblaj alidirektiloj' ),
- 'BrokenRedirects' => array( 'Rompitaj alidirektiloj' ),
+ 'DoubleRedirects' => array( 'Duoblaj_alidirektiloj' ),
+ 'BrokenRedirects' => array( 'Rompitaj_alidirektiloj' ),
'Disambiguations' => array( 'Apartigiloj' ),
'Userlogin' => array( 'Ensaluti' ),
'Userlogout' => array( 'Elsaluti' ),
- 'CreateAccount' => array( 'Krei konton' ),
+ 'CreateAccount' => array( 'Krei_konton' ),
'Preferences' => array( 'Preferoj' ),
'Watchlist' => array( 'Atentaro' ),
- 'Recentchanges' => array( 'Lastaj ÅanÄoj' ),
+ 'Recentchanges' => array( 'Lastaj_ÅanÄoj' ),
'Upload' => array( 'AlÅuti' ),
'Listfiles' => array( 'Bildolisto' ),
- 'Newimages' => array( 'Novaj bildoj' ),
- 'Listusers' => array( 'Listo de uzantoj' ),
- 'Listgrouprights' => array( 'Gruprajtoj de uzantoj' ),
+ 'Newimages' => array( 'Novaj_bildoj' ),
+ 'Listusers' => array( 'Listo_de_uzantoj' ),
+ 'Listgrouprights' => array( 'Gruprajtoj_de_uzantoj' ),
'Statistics' => array( 'Statistikoj' ),
- 'Randompage' => array( 'Hazarda paÄo' ),
- 'Lonelypages' => array( 'Neligitaj paÄoj' ),
- 'Uncategorizedpages' => array( 'PaÄoj sen kategorio' ),
- 'Uncategorizedcategories' => array( 'Kategorioj sen kategorio' ),
- 'Uncategorizedimages' => array( 'Bildoj sen kategorio' ),
- 'Uncategorizedtemplates' => array( 'Åœablonoj sen kategorio' ),
- 'Unusedcategories' => array( 'Malplenaj kategorioj' ),
- 'Unusedimages' => array( 'Neuzataj bildoj' ),
- 'Wantedpages' => array( 'Dezirataj paÄoj', 'Rompitaj ligiloj' ),
- 'Wantedcategories' => array( 'Dezirataj kategorioj' ),
- 'Wantedfiles' => array( 'Dezirataj dosieroj' ),
- 'Wantedtemplates' => array( 'Dezirataj Åablonoj' ),
- 'Mostlinked' => array( 'Plej ligitaj paÄoj' ),
- 'Mostlinkedcategories' => array( 'Plej ligitaj kategorioj', 'Plej uzataj kategorioj' ),
- 'Mostlinkedtemplates' => array( 'Plej ligitaj Åablonoj', 'Plej uzataj Åablonoj' ),
- 'Mostimages' => array( 'Plej multaj bildoj' ),
- 'Mostcategories' => array( 'Plej multaj kategorioj' ),
- 'Mostrevisions' => array( 'Plej multaj revizioj' ),
- 'Fewestrevisions' => array( 'Plej malmultaj revizioj' ),
- 'Shortpages' => array( 'Mallongaj paÄoj' ),
- 'Longpages' => array( 'Longaj paÄoj' ),
- 'Newpages' => array( 'Novaj paÄoj' ),
- 'Ancientpages' => array( 'Malnovaj paÄoj' ),
- 'Deadendpages' => array( 'PaÄoj sen interna ligilo' ),
- 'Protectedpages' => array( 'Protektitaj paÄoj' ),
- 'Protectedtitles' => array( 'Protektitaj titoloj' ),
- 'Allpages' => array( 'Ĉiuj paÄoj' ),
- 'Prefixindex' => array( 'Indekso de prefiksoj' ),
- 'Ipblocklist' => array( 'Forbarlisto de IP-adresoj' ),
- 'Specialpages' => array( 'Specialaj paÄoj' ),
+ 'Randompage' => array( 'Hazarda_paÄo' ),
+ 'Lonelypages' => array( 'Neligitaj_paÄoj' ),
+ 'Uncategorizedpages' => array( 'PaÄoj_sen_kategorio' ),
+ 'Uncategorizedcategories' => array( 'Kategorioj_sen_kategorio' ),
+ 'Uncategorizedimages' => array( 'Bildoj_sen_kategorio' ),
+ 'Uncategorizedtemplates' => array( 'Åœablonoj_sen_kategorio' ),
+ 'Unusedcategories' => array( 'Malplenaj_kategorioj' ),
+ 'Unusedimages' => array( 'Neuzataj_bildoj' ),
+ 'Wantedpages' => array( 'Dezirataj_paÄoj', 'Rompitaj_ligiloj' ),
+ 'Wantedcategories' => array( 'Dezirataj_kategorioj' ),
+ 'Wantedfiles' => array( 'Dezirataj_dosieroj' ),
+ 'Wantedtemplates' => array( 'Dezirataj_Åablonoj' ),
+ 'Mostlinked' => array( 'Plej_ligitaj_paÄoj' ),
+ 'Mostlinkedcategories' => array( 'Plej_ligitaj_kategorioj', 'Plej_uzataj_kategorioj' ),
+ 'Mostlinkedtemplates' => array( 'Plej_ligitaj_Åablonoj', 'Plej_uzataj_Åablonoj' ),
+ 'Mostimages' => array( 'Plej_ligitaj_bildoj' ),
+ 'Mostcategories' => array( 'Plej_multaj_kategorioj' ),
+ 'Mostrevisions' => array( 'Plej_multaj_revizioj' ),
+ 'Fewestrevisions' => array( 'Plej_malmultaj_revizioj' ),
+ 'Shortpages' => array( 'Mallongaj_paÄoj' ),
+ 'Longpages' => array( 'Longaj_paÄoj' ),
+ 'Newpages' => array( 'Novaj_paÄoj' ),
+ 'Ancientpages' => array( 'Malnovaj_paÄoj' ),
+ 'Deadendpages' => array( 'PaÄoj_sen_interna_ligilo' ),
+ 'Protectedpages' => array( 'Protektitaj_paÄoj' ),
+ 'Protectedtitles' => array( 'Protektitaj_titoloj' ),
+ 'Allpages' => array( 'Ĉiuj_paÄoj' ),
+ 'Prefixindex' => array( 'Indekso_de_prefiksoj' ),
+ 'Ipblocklist' => array( 'Forbarlisto_de_IP-adresoj', 'IP-adresa_forbarlisto' ),
+ 'Unblock' => array( 'Malforbari' ),
+ 'Specialpages' => array( 'Specialaj_paÄoj' ),
'Contributions' => array( 'Kontribuoj' ),
- 'Emailuser' => array( 'RetpoÅti uzanton' ),
- 'Confirmemail' => array( 'Konfirmi per retpoÅto' ),
- 'Whatlinkshere' => array( 'Kio ligas ĉi tien?' ),
- 'Recentchangeslinked' => array( 'Rilataj ÅanÄoj' ),
- 'Movepage' => array( 'Alinomigi paÄon' ),
- 'Blockme' => array( 'Forbari min' ),
- 'Booksources' => array( 'Citoj el libroj' ),
+ 'Emailuser' => array( 'RetpoÅti_uzanton' ),
+ 'Confirmemail' => array( 'Konfirmi_per_retpoÅto' ),
+ 'Whatlinkshere' => array( 'Kio_ligas_ĉi_tien?' ),
+ 'Recentchangeslinked' => array( 'Rilataj_ÅanÄoj' ),
+ 'Movepage' => array( 'Alinomigi_paÄon' ),
+ 'Blockme' => array( 'Forbari_min' ),
+ 'Booksources' => array( 'Citoj_el_libroj' ),
'Categories' => array( 'Kategorioj' ),
'Export' => array( 'Eksporti' ),
'Version' => array( 'Versio' ),
- 'Allmessages' => array( 'Ĉiuj mesaÄoj' ),
- 'Log' => array( 'Loglibro', 'Loglibroj' ),
- 'Blockip' => array( 'Forbari IP-adreson' ),
+ 'Allmessages' => array( 'Ĉiuj_mesaÄoj' ),
+ 'Log' => array( 'Protokolo', 'Protokoloj' ),
+ 'Blockip' => array( 'Forbari_IP-adreson' ),
'Undelete' => array( 'Restarigi' ),
'Import' => array( 'Importi' ),
- 'Popularpages' => array( 'Popularaj paÄoj' ),
+ 'Lockdb' => array( 'Åœlosi_datumbazon' ),
+ 'Unlockdb' => array( 'MalÅlosi_datumbazon' ),
+ 'Userrights' => array( 'Rajtoj_de_uzantoj' ),
+ 'MIMEsearch' => array( 'MIME-Serĉo' ),
+ 'FileDuplicateSearch' => array( 'Serĉi_pri_duoblaj_dosieroj' ),
+ 'Unwatchedpages' => array( 'Neatentitaj_paÄoj' ),
+ 'Listredirects' => array( 'Listigi_alidirektojn' ),
+ 'Revisiondelete' => array( 'Forigi_revizion' ),
+ 'Unusedtemplates' => array( 'Neuzataj_Åablonoj' ),
+ 'Randomredirect' => array( 'Hazarda_alidirekto' ),
+ 'Mypage' => array( 'MiaPaÄo', 'Mia_paÄo' ),
+ 'Mytalk' => array( 'Mia_diskutpaÄo', 'MiaDiskutpaÄo' ),
+ 'Mycontributions' => array( 'Miaj_kontribuoj', 'MiajKontribuoj' ),
+ 'Myuploads' => array( 'Miaj_alÅutaĵoj' ),
+ 'Listadmins' => array( 'Listigi_administrantojn' ),
+ 'Listbots' => array( 'Listigi_robotojn' ),
+ 'Popularpages' => array( 'Popularaj_paÄoj' ),
'Search' => array( 'Serĉi' ),
+ 'Resetpass' => array( 'ÅœanÄi_pasvorton' ),
+ 'Withoutinterwiki' => array( 'Sen_intervikia_ligilo' ),
+ 'MergeHistory' => array( 'Kunigi_historion' ),
+ 'Filepath' => array( 'Dosiero-pado' ),
+ 'Invalidateemail' => array( 'Malvalidigi_retpoÅton' ),
+ 'Blankpage' => array( 'Malplena_paÄo' ),
+ 'LinkSearch' => array( 'Serĉi_ligilon' ),
+ 'DeletedContributions' => array( 'Forigitaj_kontribuoj' ),
'Tags' => array( 'Etikedoj' ),
+ 'Activeusers' => array( 'Aktivaj_uzantoj' ),
);
$magicWords = array(
- 'redirect' => array( '0', '#ALIDIREKTU', '#REDIRECT' ),
- 'nogallery' => array( '0', '__SENGALERIO__', '__NOGALLERY__' ),
- 'currentmonth' => array( '1', 'NUNAMONATO', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'redirect' => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
+ 'notoc' => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__I__', '__T__', '__INDEKSO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__SRS__', '__NES__', '__SENREDAKTISEKCIOJN__', '__SENREDAKTISEKCION__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__SENTITOLO__', '__NH__', '__ST__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'NUNAMONATO', 'NUNAMONATO2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'NUNAMONATO1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NUNAMONATNOMO', 'NUNAMONATONOMO', 'NUNAMONATANOMO', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NUNAMONATNOMOGEN', 'NUNAMONATONOMOGEN', 'NUNAMONATANOMOGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'NUNAMONATNOMOMAL', 'NUNAMONATONOMOMAL', 'NUNAMONATANOMOMAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'NUNATAGO', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NUNATAGO2', 'CURRENTDAY2' ),
'currentdayname' => array( '1', 'NUNATAGNOMO', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'NUNAJARO', 'CURRENTYEAR' ),
'currenttime' => array( '1', 'NUNATEMPO', 'CURRENTTIME' ),
- 'localdayname' => array( '1', 'LOKATAGNOMO', 'LOCALDAYNAME' ),
+ 'currenthour' => array( '1', 'NUNAHORO', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKAMONATO', 'LOKAMONATO2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKAMONATO1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKAMONATNOMO', 'LOKAMONATONOMO', 'LOKAMONATANOMO', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKAMONATNOMOGEN', 'LOKAMONATONOMOGEN', 'LOKAMONATANOMOGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKAMONATNOMOMAL', 'LOKAMONATONOMOMAL', 'LOKAMONATANOMOMAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKATAGO', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKATAGO2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKATAGNOMO', 'LOKATAGONOMO', 'LOKATAGANOMO', 'LOCALDAYNAME' ),
'localyear' => array( '1', 'LOKAJARO', 'LOCALYEAR' ),
'localtime' => array( '1', 'LOKATEMPO', 'LOCALTIME' ),
'localhour' => array( '1', 'LOKAHORO', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NOMBRODEPAÄœOJ', 'NOMBRODEPAGXOJ', 'NUMBEROFPAGES' ),
'numberofarticles' => array( '1', 'NOMBRODEARTIKOLOJ', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'NOMBRODEDOSIEROJ', 'NUMBEROFFILES' ),
'numberofusers' => array( '1', 'NOMBRODEUZANTOJ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NOMBRODEAKTIVAJUZANTOJ', 'NUMBEROFACTIVEUSERS' ),
'numberofedits' => array( '1', 'NOMBRODEREDAKTOJ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'PAÄœNOMO', 'PAGXNOMO', 'PAGENAME' ),
+ 'numberofviews' => array( '1', 'NOMBRODEVIZITOJ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'PAÄœONOMO', 'PAGXONOMO', 'PAÄœNOMO', 'PAGXNOMO', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PAÄœONOMOO', 'PAGXONOMOO', 'PAÄœNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NOMSPACO', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
+ 'fullpagename' => array( '1', 'TUTAPAÄœONOMO', 'TUTAPAGXONOMO', 'TUTAPAÄœNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'TUTAPAÄœONOMOO', 'TUTAPAGXONOMOO', 'TUTAPAÄœNOMOO', 'TUTAPAGXNOMOO', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'SUBPAÄœONOMO', 'SUBPAGXONOMO', 'SUBPAÄœNOMO', 'SUBPAGXNOMO', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'SUBPAÄœONOMOO', 'SUBPAGXONOMOO', 'SUBPAÄœNOMOO', 'SUBPAGXNOMOO', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'PATRAPAÄœONOMO', 'PATRAPAGXONOMO', 'PATRAPAÄœNOMO', 'PATRAPAGXNOMO', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'PATRAPAÄœONOMOO', 'PATRAPAGXONOMOO', 'PATRAPAÄœNOMOO', 'PATRAPAGXNOMOO', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'DISKUTPAÄœONOMO', 'DISKUTPAGXONOMO', 'DISKUTPAÄœNOMO', 'DISKUTPAGXNOMO', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'DISKUTPAÄœONOMOO', 'DISKUTPAGXONOMOO', 'DISKUTPAÄœNOMOO', 'DISKUTPAGXNOMOO', 'TALKPAGENAMEE' ),
+ 'msg' => array( '0', 'MSĜ:', 'MSGX:', 'MSG:' ),
+ 'subst' => array( '0', 'ANSTAT:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'SEKURANSTAT:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'NVMSĜ:', 'NVMSGX:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'eta', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'eta=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'dekstra', 'right' ),
- 'img_left' => array( '1', 'maldekstra', 'left' ),
+ 'img_right' => array( '1', 'dekstra', 'dekstre', 'right' ),
+ 'img_left' => array( '1', 'maldekstra', 'maldekstre', 'left' ),
+ 'img_none' => array( '1', 'nenio', 'none' ),
'img_width' => array( '1', '$1ra', '$1px' ),
'img_center' => array( '1', 'centra', 'meza', 'center', 'centre' ),
- 'img_framed' => array( '1', 'kadro', 'framed', 'enframed', 'frame' ),
+ 'img_framed' => array( '1', 'kadro', 'enkadrita', 'enkadrite', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'senkadra', 'frameless' ),
+ 'img_page' => array( '1', 'paÄo=$1', 'paÄo $1', 'pagxo=$1', 'pagxo $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'kadra', 'kadrita', 'kadrigita', 'kadrite', 'kadrigite', 'border' ),
+ 'img_sub' => array( '1', 'sube', 'sub' ),
+ 'img_super' => array( '1', 'supre', 'super', 'sup' ),
+ 'img_top' => array( '1', 'alte', 'top' ),
+ 'img_text_top' => array( '1', 'tekst-alte', 'text-top' ),
+ 'img_middle' => array( '1', 'meze', 'middle' ),
+ 'img_bottom' => array( '1', 'malalte', 'bottom' ),
'img_text_bottom' => array( '1', 'suba-teksto', 'text-bottom' ),
- 'sitename' => array( '1', 'TTT-NOMO', 'SITENAME' ),
+ 'img_link' => array( '1', 'ligilo=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'alternative=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ENE:', 'INT:' ),
+ 'sitename' => array( '1', 'TTT-NOMO', 'RETPAÄœNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
+ 'nse' => array( '0', 'NSO:', 'NSE:' ),
+ 'localurl' => array( '0', 'LOKATTT:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
'server' => array( '0', 'SERVILO', 'SERVER' ),
- 'servername' => array( '0', 'NOMODESERVILO', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTO-VOJO', 'SCRIPTPATH' ),
+ 'servername' => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'STILO-VOJO', 'STILOVOJO', 'STILVOJO', 'STYLEPATH' ),
'grammar' => array( '0', 'GRAMATIKO:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SEKSO:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__NEKONVERTUTITOLON__', '__NKT__', '__NTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__NEKONVERTUENHAVON__', '__NKH__', '__NCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'NUNASEMAJNO', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'LOKASEMAJNO', 'LOCALWEEK' ),
'revisionyear' => array( '1', 'JARODEREVIZIO', 'REVISIONYEAR' ),
'plural' => array( '0', 'PLURALA:', 'PLURAL:' ),
- 'lc' => array( '0', 'MINUSKLA:', 'LC:' ),
- 'uc' => array( '0', 'MAJUSKLA:', 'UC:' ),
- 'newsectionlink' => array( '1', '__LIGLIOALNOVASEKCIO__', '__NEWSECTIONLINK__' ),
+ 'fullurl' => array( '0', 'TUTATTT:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'TUTATTTT:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'MALMAJUSKLEUNUA:', 'MINUSKLEUNUA:', 'MMU:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'MAJUSKLEUNUA:', 'MALMINUSKLEUNUA:', 'MU:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MALMAJUSKLE:', 'MINUSKLE:', 'LC:' ),
+ 'uc' => array( '0', 'MAJUSKLE:', 'MALMINUSKLE:', 'UC:' ),
+ 'displaytitle' => array( '1', 'MONTRUTITOLON:', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LIGILOALNOVASEKCIO__', '__NSL__', '__LNS__', '__LANS__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__SENLIGILOALNOVASEKCIO__', '__NNSL__', '__SLNS__', '__SLANS__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'NUNAVERSIO', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'NUNATEMPINDIKO', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKATEMPINDIKO', 'LOCALTIMESTAMP' ),
'language' => array( '0', '#LINGVO:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'ENHAVA-LINGVO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAÄœOJENNOMSPACO', 'PAGXOJENNOMSPACO', 'PAÄœOJENS', 'PAGXOJENNS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
'numberofadmins' => array( '1', 'NOMBRODEADMINOJ', 'NUMBEROFADMINS' ),
'special' => array( '0', 'speciala', 'special' ),
'defaultsort' => array( '1', 'DEFAŬLTORDIGO:', 'DEFAUXLTORDIGO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'tag' => array( '0', 'etikedo', 'tag' ),
- 'hiddencat' => array( '1', '__KAÅœITAKATEGORIO__', '__HIDDENCAT__' ),
- 'pagesize' => array( '1', 'PEZODEPAÄœO', 'PAGESIZE' ),
- 'noindex' => array( '1', '__NENIUINDEKSO__', '__NOINDEX__' ),
+ 'filepath' => array( '0', 'DOSIERO-VORO', 'DOSIERVOJO', 'FILEPATH:' ),
+ 'tag' => array( '0', 'marko', 'etikedo', 'tag' ),
+ 'hiddencat' => array( '1', '__KK__', '__KAÅœITAKATEGORIO__', '__KASXITAKATEGORIO__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAÄœOJENKATEGORIO', 'PAGXOJENKATEGORIO', 'PAÄœOJENKAT', 'PAGXOJENKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PAÄœOPEZO', 'PAGXOPEZO', 'PEZODEPAÄœO', 'PEZODEPAGXO', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKSU__', '__INDEKSI__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NEINDEKSU__', '__NIU__', '__NOINDEX__' ),
+ 'url_path' => array( '0', 'VOJO', 'PATH' ),
+ 'url_wiki' => array( '0', 'VIKIO', 'WIKI' ),
+ 'url_query' => array( '0', 'INFORMPETO', 'QUERY' ),
);
-$separatorTransformTable = array(',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => ' ', '.' => ',' );
$datePreferences = false;
$defaultDateFormat = 'dmy';
$dateFormats = array(
'dmy time' => 'H:i',
- 'dmy date' => 'j. M Y',
- 'dmy both' => 'H:i, j. M Y',
+ 'dmy date' => 'j M. Y',
+ 'dmy both' => 'H:i, j M. Y',
);
$messages = array(
@@ -182,15 +302,14 @@ $messages = array(
'tog-hidepatrolled' => 'KaÅi patrolitajn redaktojn en lastaj ÅanÄoj',
'tog-newpageshidepatrolled' => 'KaÅi patrolitajn paÄojn de listo de novaj paÄoj',
'tog-extendwatchlist' => 'Etendi la atentaron por montri ĉiujn ÅanÄojn, ne nur la plej lastajn',
-'tog-usenewrc' => 'Uzi progresan "Lastaj ÅœanÄoj" (bezonas JavaSkripton)',
+'tog-usenewrc' => 'Uzi progresan "Lastaj ÅanÄoj" (bezonas JavaSkripton)',
'tog-numberheadings' => 'AÅ­tomate numerigi sekciojn',
'tog-showtoolbar' => 'Montri eldonilaron',
'tog-editondblclick' => 'Redakti per duobla alklako (JavaScript)',
'tog-editsection' => 'Montri [redakti]-ligilojn por sekcioj',
'tog-editsectiononrightclick' => 'Åœalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (kun JavaScript)',
-'tog-showtoc' => 'Montri liston de enhavoj (por paÄojn kun pli ol 3 sekciojn)',
-'tog-rememberpassword' => 'Memori mian pasvorton por ĉi tiu komputilo',
-'tog-editwidth' => 'Plenekranigi la redaktilon',
+'tog-showtoc' => 'Montri enhavliston (por paÄoj kun pli ol 3 sekcioj)',
+'tog-rememberpassword' => 'Memori mian ensalutadon ĉe ĉi tiu retumilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
'tog-watchcreations' => 'Aldoni de mi kreitajn paÄojn al mia atentaro',
'tog-watchdefault' => 'Aldoni al mia atentaro paÄojn redaktitajn de mi',
'tog-watchmoves' => 'Aldoni paÄojn, kiujn mi movas, al mia atentaro',
@@ -337,31 +456,21 @@ $messages = array(
'faqpage' => 'Project:Oftaj demandoj',
# Vector skin
-'vector-action-addsection' => 'Aldoni temon',
-'vector-action-delete' => 'Forigi',
-'vector-action-move' => 'Alinomigi',
-'vector-action-protect' => 'Protekti',
-'vector-action-undelete' => 'Malforigi',
-'vector-action-unprotect' => 'Malprotekti',
-'vector-namespace-category' => 'Kategorio',
-'vector-namespace-help' => 'HelpopaÄo',
-'vector-namespace-image' => 'Dosiero',
-'vector-namespace-main' => 'PaÄo',
-'vector-namespace-media' => 'Dosiera paÄo',
-'vector-namespace-mediawiki' => 'MesaÄo',
-'vector-namespace-project' => 'Projekta paÄo',
-'vector-namespace-special' => 'Speciala paÄo',
-'vector-namespace-talk' => 'Diskuto',
-'vector-namespace-template' => 'Åœablono',
-'vector-namespace-user' => 'UzantopaÄo',
-'vector-view-create' => 'Krei',
-'vector-view-edit' => 'Redakti',
-'vector-view-history' => 'Vidi historion',
-'vector-view-view' => 'Legi',
-'vector-view-viewsource' => 'Vidi fonton',
-'actions' => 'Agoj',
-'namespaces' => 'Nomspacoj',
-'variants' => 'Variantoj',
+'vector-action-addsection' => 'Aldoni temon',
+'vector-action-delete' => 'Forigi',
+'vector-action-move' => 'Alinomigi',
+'vector-action-protect' => 'Protekti',
+'vector-action-undelete' => 'Malforigi',
+'vector-action-unprotect' => 'Malprotekti',
+'vector-simplesearch-preference' => 'Ebligi plibonigitajn serĉajn sugestojn (nur Vektora etoso)',
+'vector-view-create' => 'Krei',
+'vector-view-edit' => 'Redakti',
+'vector-view-history' => 'Vidi historion',
+'vector-view-view' => 'Legi',
+'vector-view-viewsource' => 'Vidi fonton',
+'actions' => 'Agoj',
+'namespaces' => 'Nomspacoj',
+'variants' => 'Variantoj',
'errorpagetitle' => 'Eraro',
'returnto' => 'Reiri al $1.',
@@ -422,6 +531,9 @@ Tro da uzantoj provas vidi ĉi tiun paÄon.
Bonvolu atendi iom antaÅ­ vi provas atingi Äin denove.
$1',
+'pool-timeout' => 'Tempolimo atingis atendante Ålosadon',
+'pool-queuefull' => 'Atendovico de servilaro estas plena.',
+'pool-errorunknown' => 'Nekonata eraro',
# 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' => 'Pri {{SITENAME}}',
@@ -590,7 +702,8 @@ Ne forgesu fari viajn [[Special:Preferences|{{SITENAME}}-preferojn]].',
'yourname' => 'Salutnomo:',
'yourpassword' => 'Pasvorto:',
'yourpasswordagain' => 'Retajpu pasvorton',
-'remembermypassword' => 'Rememori mian pasvorton',
+'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
+'securelogin-stick-https' => 'Resti konektita al HTTPS post ensalutado',
'yourdomainname' => 'Via domajno',
'externaldberror' => 'AÅ­ estis datenbaza eraro rilate al ekstera aÅ­tentikigado, aÅ­ vi ne rajtas Äisdatigi vian eksteran konton.',
'login' => 'Ensaluti',
@@ -607,6 +720,7 @@ Ne forgesu fari viajn [[Special:Preferences|{{SITENAME}}-preferojn]].',
'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
'gotaccountlink' => 'Ensaluti',
'createaccountmail' => 'retpoÅte',
+'createaccountreason' => 'Kialo:',
'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
'userexists' => 'Salutnomo enigita jam estas uzata.
Bonvolu elekti alian nomon.',
@@ -627,6 +741,7 @@ Kontrolu vian literumadon, aÅ­ [[Special:UserLogin/signup|kreu novan konton]].',
'wrongpasswordempty' => 'Vi tajpis malplenan pasvorton. Bonvolu provi denove.',
'passwordtooshort' => 'Pasvortoj devas esti almenaÅ­ $1 {{PLURAL:$1|1 signon|$1 signojn}}.',
'password-name-match' => 'Via pasvorto devas nepre malsami vian salutnomon.',
+'password-login-forbidden' => 'Estas malpermesite uzi tiun ĉi uzulnomon kaj pasvorton.',
'mailmypassword' => 'RetpoÅti novan pasvorton',
'passwordremindertitle' => 'Rememorigo el {{SITENAME}} pri perdita pasvorto',
'passwordremindertext' => 'Iu (probable vi, el IP-adreso $1) petis novan
@@ -668,6 +783,9 @@ Bonvolu Äisatendi antaÅ­ retrovi.',
'loginlanguagelabel' => 'Lingvo: $1',
'suspicious-userlogout' => 'Via peto por elsaluti estis malpermesita ĉar verÅajne Äi estis sendita de trompita retumilo aÅ­ kaÅiganta proksima servilo.',
+# E-mail sending
+'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
+
# Password reset dialog
'resetpass' => 'ÅœanÄi pasvorton',
'resetpass_announce' => 'Vi ensalutis kun provizora retpoÅtita pasvorto. Por kompleti ensalutadon, vi devas fari novan pasvorton ĉi tien:',
@@ -719,10 +837,11 @@ Vi eble jam ÅanÄis vian pasvorton aÅ­ petis novan provizoran pasvorton.',
'showlivepreview' => 'Aktiva antaÅ­vido',
'showdiff' => 'Montri ÅanÄojn',
'anoneditwarning' => 'Vi ne estas ensalutinta. Via IP-adreso enregistriÄos en la Åango-historio de tiu ĉi paÄo.',
+'anonpreviewwarning' => "''Vi ne estas ensalutita. La konservo de la paÄo registros vian IP-adreson en kronologio de ĉi tiu paÄo.''",
'missingsummary' => "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
'missingcommenttext' => 'Bonvolu entajpi komenton malsupre.',
-'missingcommentheader' => "'''Atento:''' Vi ne donis temo/subtitolo por ĉi tiu komento.
-Se vi klakos Konservi denove, via redakto estos konservita sen Äi.",
+'missingcommentheader' => "'''Atenton:''' Vi ne provizis temon aŭ subtitolon por ĉi tiu komento.
+Se vi klakos \"Konservi\" denove, via redakto estos konservita sen Äi.",
'summary-preview' => 'Resuma antaÅ­rigardo:',
'subject-preview' => 'AntaÅ­rigardo de Temo/Subitolo:',
'blockedtitle' => 'La uzanto estas forbarita.',
@@ -793,7 +912,10 @@ La lasta protokolero estas jene montrata por via referenco:',
'usercsspreview' => "'''Notu ke vi nur antaÅ­vidas vian uzanto-CSS.
Äœi ne jam estis konservita!'''",
'userjspreview' => "'''Memoru ke vi nun nur provas kaj antaÅ­rigardas vian uzantan javaskripton, Äi ne estas jam konservita'''",
-'userinvalidcssjstitle' => "'''Averto:''' Ne ekzistas aspekto \"\$1\". Rememoru ke individuaj .css-aj kaj .js-aj paÄoj uzas minusklan titolon, ekz. {{ns:user}}:Foo/monobook.css kontraÅ­e al {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Konsciu ke vi nur antaŭrigardas tiun ĉi CSS.'''
+'''Äœi ne jam estis savita!''",
+'sitejspreview' => "'''Konsciu ke vi nur antaŭrigardas tiun ĉi Ĝavaskripta kodon''. ''Ĝi ne jam estis konservita''.",
+'userinvalidcssjstitle' => "'''Averto:''' Ne ekzistas aspekto \"\$1\". 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!'''",
@@ -832,9 +954,6 @@ Vi ankaÅ­ ĵuras, ke vi mem verkis la tekston, aÅ­ ke vi kopiis Äin el fonto se
'copyrightwarning2' => "Bonvolu noti ke ĉiuj kontribuoj al {{SITENAME}} povas esti reredaktita, ÅanÄita aÅ­ forigita de aliaj kontribuantoj. Se vi ne deziras ke viaj verkoj estu senkompate reredaktitaj, ne publikigu ilin ĉi tie.<br />
Vi ankaÅ­ promesu al ni ke vi verkis tion mem aÅ­ kopiis el publika domajno aÅ­ simila libera fonto (vidu $1 por detaloj).
'''NE PROPONU KOPIRAJTITAJN VERKOJN SEN PERMESO!'''",
-'longpagewarning' => "'''AVERTO: Tiu ĉi paÄo longas $1 kilobitokojn; kelkaj retumiloj
-povas fuÅi redaktante paÄojn je longo proksime aÅ­ preter 32 kb.
-Se eble, bonvolu disigi la paÄon al malpli grandajn paÄerojn.'''",
'longpageerror' => "'''Eraro: La teksto, kiun vi prezentis, longas $1 kilobajtojn, kio estas pli longa ol la maksimumo de $2 kilobajtoj. Äœi ne povas esti konservita.'''",
'readonlywarning' => "'''AVERTO: La datumbazo estas Ålosita por teknika laboro, do vi ne povas konservi viajn redaktojn ĉi-momente.
Vi eble volus elkopii kaj englui la tekston al tekstdosiero por konservi Äin por posta uzo.'''
@@ -1011,6 +1130,8 @@ $1",
'logdelete-failure' => "'''Protokola videbleco ne estis akordebla:'''
$1",
'revdel-restore' => 'ÅœanÄi videblecon',
+'revdel-restore-deleted' => 'forigitaj revizioj',
+'revdel-restore-visible' => 'videblaj revizioj',
'pagehist' => 'PaÄa historio',
'deletedhist' => 'Forigita historio',
'revdelete-content' => 'enhavon',
@@ -1079,11 +1200,13 @@ Certigu ke ĉi tiu ÅanÄo tenos kontinuecon de la historia paÄo.',
# Diffs
'history-title' => 'Redakto-historio de "$1"',
'difference' => '(Malsamoj inter versioj)',
+'difference-multipage' => '(Diferenco inter paÄoj)',
'lineno' => 'Linio $1:',
'compareselectedversions' => 'Kompari la elektitajn versiojn',
'showhideselectedversions' => 'Montri/kaÅi elektitajn versiojn',
'editundo' => 'malfari',
-'diff-multi' => '({{PLURAL:$1|Unu meza versio|$1 mezaj versioj}} ne montrata.)',
+'diff-multi' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de pli ol {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
# Search results
'searchresults' => 'Serĉrezultoj',
@@ -1118,6 +1241,7 @@ Certigu ke ĉi tiu ÅanÄo tenos kontinuecon de la historia paÄo.',
'searchprofile-everything-tooltip' => 'Traserĉi ĉiun enhavon (inkluzivante diskuto-paÄojn)',
'searchprofile-advanced-tooltip' => 'Serĉi en specialaj nomspacoj',
'search-result-size' => '$1 ({{PLURAL:$2|1 vorto|$2 vortoj}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membroj}} ({{PLURAL:$2|1 subkategorio|$2 subkategorioj}}, {{PLURAL:$3|1 dosiero|$3 dosieroj}})',
'search-result-score' => 'Trafeco: $1%',
'search-redirect' => '(alidirektilo $1)',
'search-section' => '(sekcio $1)',
@@ -1194,6 +1318,7 @@ indekso pro troÅarÄita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
'contextlines' => 'Montri liniojn el paÄoj po:',
'contextchars' => 'Montri literojn el linioj Äis po:',
'stub-threshold' => 'Ago-sojlo por formatigo de <a href="#" class="stub">ligil-Äermo (anglalingve: "stub link")</a> (bitikoj):',
+'stub-threshold-disabled' => 'Malebligita',
'recentchangesdays' => 'Tagoj montrendaj en lastaj ÅanÄoj:',
'recentchangesdays-max' => '(maksimume $1 {{PLURAL:$1|tago|tagoj}})',
'recentchangescount' => 'Nombro de redaktoj por montri defaÅ­lte:',
@@ -1227,6 +1352,7 @@ Jen hazarde generita valoro por via uzo: $1',
'prefs-files' => 'Dosieroj',
'prefs-custom-css' => 'Propra CSS',
'prefs-custom-js' => 'Propra JS',
+'prefs-common-css-js' => 'Komuna CSS/JS por ĉiuj etosoj:',
'prefs-reset-intro' => 'Vi povas uzi ĉi tiun paÄon por restarigi viajn agordojn al la originalaj defaÅ­ltoj.
Ĉi tiel ne estus malfarebla.',
'prefs-emailconfirm-label' => 'RetpoÅta konfirmado:',
@@ -1264,9 +1390,15 @@ Vi povas ankaÅ­ elekti permesigi aliaj uzantoj kontakti vin per via uzanto-paÄo
'prefs-advancedrendering' => 'Progresaj opcioj',
'prefs-advancedsearchoptions' => 'Progresaj opcioj',
'prefs-advancedwatchlist' => 'Progresaj opcioj',
-'prefs-display' => 'Montraj opcioj',
+'prefs-displayrc' => 'Montraj opcioj',
+'prefs-displaysearchoptions' => 'Montraj opcioj',
+'prefs-displaywatchlist' => 'Montraj opcioj',
'prefs-diffs' => 'Diferencoj',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Åœajnas ke la retpoÅtadreso estas valida',
+'email-address-validity-invalid' => 'Tajpu validan retpoÅtadreson',
+
# User rights
'userrights' => 'Prizorgi rajtojn de uzantoj',
'userrights-lookup-user' => 'Administri grupojn de uzantoj',
@@ -1350,6 +1482,7 @@ Vi povas ankaÅ­ elekti permesigi aliaj uzantoj kontakti vin per via uzanto-paÄo
'right-hideuser' => 'Forbari salutnomon, kaÅante Äin de la publiko',
'right-ipblock-exempt' => 'Preterpasi IP-forbarojn, aÅ­tomatajn forbarojn, kaj Äeneralajn forbarojn',
'right-proxyunbannable' => 'Preterpasi aÅ­tomatajn forbarojn de prokuriloj',
+'right-unblockself' => 'Malforbari oni mem',
'right-protect' => 'ÅœanÄi protektniveloj kaj redakti protektitajn paÄojn',
'right-editprotected' => 'Redakti protektitajn paÄojn (sen kaskada protektado)',
'right-editinterface' => 'Redakti la uzulan interfacon',
@@ -1372,7 +1505,6 @@ Vi povas ankaÅ­ elekti permesigi aliaj uzantoj kontakti vin per via uzanto-paÄo
'right-siteadmin' => 'Åœlosi kaj malÅlosi la datumbazon',
'right-reset-passwords' => 'ReÅanÄi pasvortojn de aliaj uzantoj',
'right-override-export-depth' => 'Eksporti paÄojn inkluzivante ligitajn paÄojn Äis profundeco de 5',
-'right-versiondetail' => 'Montri la informon pri la etendita programara versio',
'right-sendemail' => 'Sendi retpoÅton al aliaj uzantoj',
# User rights log
@@ -1423,14 +1555,9 @@ Vi povas ankaÅ­ elekti permesigi aliaj uzantoj kontakti vin per via uzanto-paÄo
'recentchanges-legend' => 'Opcioj pri lastaj ÅanÄoj',
'recentchangestext' => 'Per ĉi tiu paÄo vi povas sekvi la plej lastajn ÅanÄojn en la {{SITENAME}}.',
'recentchanges-feed-description' => 'Sekvi la plej lastatempajn ÅanÄojn al la vikio en ĉi tiu fonto.',
-'recentchanges-label-legend' => 'Klarigeto: $1.',
-'recentchanges-legend-newpage' => '$1 - nova paÄo',
'recentchanges-label-newpage' => 'Ĉi tiu redakto kreis novan paÄon',
-'recentchanges-legend-minor' => '$1 - eta redakto',
'recentchanges-label-minor' => 'Ĉi tiu estas eta redakto',
-'recentchanges-legend-bot' => '$1 - robota redakto',
'recentchanges-label-bot' => 'Ĉi tiu redakto estis farita per roboto.',
-'recentchanges-legend-unpatrolled' => '$1 - nepatrolita redakto',
'recentchanges-label-unpatrolled' => 'Ĉi tiu redakto ne jam estis patrolata.',
'rcnote' => "Jen la {{PLURAL:$1|lasta '''1''' ÅanÄo|lastaj '''$1''' ÅanÄoj}} dum la {{PLURAL:$2|lasta tago|lastaj '''$2''' tagoj}}, ekde $5, $4.",
'rcnotefrom' => "Jen la ÅanÄoj ekde '''$2''' (lastaj Äis '''$1''').",
@@ -1477,6 +1604,9 @@ PaÄoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
'upload_directory_missing' => 'La alÅuta dosierujo ($1) estas nek trovebla nek kreebla de la retservilo.',
'upload_directory_read_only' => 'La TTT-servilo ne povas alskribi la alÅuto-dosierujon ($1).',
'uploaderror' => 'Eraro okazis dum alÅuto',
+'upload-recreate-warning' => "''Atenton: dosiero kun tiu nomo estis forigita aÅ­ alinomita.'''
+
+La forigo kaj mova protokoloj por ĉi tiu paÄo estas provizitaj ĉi tie por oportuno:",
'uploadtext' => "Uzu la jenan formularon por alÅuti dosierojn.
Vidi aÅ­ serĉi antaÅ­e alÅutitajn bildojn, iru al [[Special:FileList|Listo de alÅutitaj dosieroj]]; (re)alÅutaĵoj ankaÅ­ estas registrita en la [[Special:Log/upload|Protokolo de alÅutoj]], forigoj en la [[Special:Log/delete|protokolo de forigoj]].
@@ -1510,6 +1640,17 @@ Por inkluzivi la dosieron en paÄon, skribu ligilon laÅ­ la formoj
'filetype-unwanted-type' => "'''\".\$1\"''' estas nevolata dosiero-tipo. {{PLURAL:\$3|Preferata dosiero-tipo|Prefereataj dosiero-tipoj}} estas \$2.",
'filetype-banned-type' => "'''\".\$1\"''' ne estas permesita dosiero-tipo. {{PLURAL:\$3|Permesita dosiero-tipo|Permesitaj dosiero-tipoj}} estas \$2.",
'filetype-missing' => 'Ĉi tiu dosiero ne inkluzivas finaĵon de dosiernomo (kiel ".jpg").',
+'empty-file' => 'La dosiero kiun vi alÅutis estis malplena.',
+'file-too-large' => 'La dosiero kiun vi alÅutis estis tro granda.',
+'filename-tooshort' => 'La dosiera nomo estas tro mallonga.',
+'filetype-banned' => 'Ĉi tiu tipo de dosiero estas malpermesita.',
+'verification-error' => 'Ĉi tiu dosiero ne pasis dosieran konfirmon.',
+'hookaborted' => 'La ÅanÄo kiun vi provis fari estis haltigita de etendaĵa hoko.',
+'illegal-filename' => 'La dosiernomo ne estas permesata.',
+'overwrite' => 'AnstataÅ­igo de ekzistanta dosiero ne permesitas.',
+'unknown-error' => 'Malkonata eraro okazis.',
+'tmp-create-error' => 'Ne povis krei intertempan dosieron.',
+'tmp-write-error' => 'Eraro dum skribado de portempa dosiero.',
'large-file' => 'Estas rekomendite, ke dosieroj ne superas grandon de $1 bitokoj;
tiu ĉi tiu dosiero pezas $2 bitokojn.',
'largefileserver' => 'Ĉi tiu dosiero estas pli granda ol permesas la servilaj preferoj.',
@@ -1538,13 +1679,14 @@ Se vi ankoraÅ­ volas alÅuti vian dosieron, bonvolu reprovi kun nova nomo.
Se vi ankoraÅ­ volas alÅuti vian dosieron, bonvolu retroigi kaj uzi novan nomon.[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ĉi tiu dosiero estas duplikato de la {{PLURAL:$1|jena dosiero|jenaj dosieroj}}:',
'file-deleted-duplicate' => 'Duplikata dosiero de ĉi tiu dosiero ([[:$1]]) estis antaÅ­e forigita. Vi legu la forigan historion de tiu dosiero antaÅ­ provi realÅuti Äin.',
-'successfulupload' => 'AlÅuto sukcesis!',
'uploadwarning' => 'AlÅuta averto',
'uploadwarning-text' => 'Bonvolu ÅanÄi la dosieran priskribon kaj reprovi.',
'savefile' => 'Konservi dosieron',
'uploadedimage' => 'alÅutis "[[$1]]"',
'overwroteimage' => 'alÅutis novan version de "[[$1]]"',
'uploaddisabled' => 'AlÅutado estas malÅaltita',
+'copyuploaddisabled' => 'AlÅuto de URL malfunkciigita.',
+'uploadfromurl-queued' => 'Via alÅuto estis vicatendigata.',
'uploaddisabledtext' => 'AlÅutado de dosieroj estas malebligita.',
'php-uploaddisabledtext' => 'Dosiera alÅutado estas malÅalta en PHP. Bonvolu kontroli la preferon file_uploads.',
'uploadscripted' => 'HTML-aĵo aÅ­ skriptokodaĵo troviÄas en tiu ĉi tiu dosiero, kiun TTT-foliumilo eble interpretus erare.',
@@ -1563,6 +1705,14 @@ Se vi ankoraÅ­ volas alÅuti vian dosieron, bonvolu retroigi kaj uzi novan nomon
Vi konsideru ĉu taÅ­gas alÅuti ĉi tiu dosiero.
jen la protokolo pri forigado por ĉi tiu dosiero por via oportuneco:",
'filename-bad-prefix' => "La nomo de la dosiero kiun vi alÅutas komencas kun '''\"\$1\"''', kiu estas nepriskriba nomo ofte aÅ­tomate donata de ciferecaj fotiloj. Bonvolu elekti pli priskriban nomon por via bildo.",
+'upload-success-subj' => 'AlÅuto sukcesis!',
+'upload-success-msg' => 'Via alÅuto el [$2] sukcesis. Äœi disponeblas ĉi tie [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'AlÅuta problemo',
+'upload-failure-msg' => 'Estis problemo kun via alÅuto de [$2]:
+
+$1',
+'upload-warning-subj' => 'Averto pri alÅutado',
+'upload-warning-msg' => 'Okazis problemo pro via alÅuto el [$2]. Vi povas reveni al la [[Special:Upload/stash/$1|alÅutan formularon]] por korektigi ĉi tiun problemon.',
'upload-proto-error' => 'Malvalida protokolo',
'upload-proto-error-text' => 'Fora alÅuto devas URL-on komence de <code>http://</code> aÅ­ <code>ftp://</code>.',
@@ -1612,7 +1762,7 @@ Por optimuma sekureco, img_auth.php estas malÅalta.',
'upload-curl-error28-text' => 'La retejo atendas tro sen respondo. Bonvolu verigi ke la retejo ankoraÅ­ funkcias kaj reprovi. Vi eble volus trovi dum malpli okupa tempo.',
'license' => 'Permesiloj:',
-'license-header' => 'Licencado:',
+'license-header' => 'Permesiloj:',
'nolicense' => 'Neniu elektita',
'license-nopreview' => '(AntaÅ­vido ne montrebla)',
'upload_source_url' => ' (valida, publike atingebla URL-o)',
@@ -1625,6 +1775,7 @@ Klaku la kolumnan titolon por ÅanÄi la direkton de ordigo.',
'listfiles_search_for' => 'Serĉi dosieran nomon:',
'imgfile' => 'dosiero',
'listfiles' => 'Listo de alÅutitaj dosieroj',
+'listfiles_thumb' => 'Bildeto',
'listfiles_date' => 'Dato',
'listfiles_name' => 'Nomo',
'listfiles_user' => 'Uzanto',
@@ -1634,7 +1785,7 @@ Klaku la kolumnan titolon por ÅanÄi la direkton de ordigo.',
# File description page
'file-anchor-link' => 'Dosiero',
-'filehist' => 'Historio de dosiero',
+'filehist' => 'Dosiera historio',
'filehist-help' => 'Klaku daton/tempon por rigardi la dosieron kiel Äin Åajnitan tiame.',
'filehist-deleteall' => 'forigi ĉiujn',
'filehist-deleteone' => 'forigi',
@@ -1738,8 +1889,8 @@ Bonvolu kontroli aliajn ligilojn al la Åablonoj antaÅ­ ol forigi ilin.',
'statistics-edits' => 'PaÄaj redaktoj ekde {{SITENAME}} estis starigita',
'statistics-edits-average' => 'AveraÄa kvanto de redaktoj je paÄo',
'statistics-views-total' => 'Vidoj entutaj',
+'statistics-views-total-desc' => 'Ne inkluzivante vidojn al ne-ekzistantaj paÄoj kaj specialaj paÄoj',
'statistics-views-peredit' => 'Vidoj po redakto',
-'statistics-jobqueue' => 'Longeco de [http://www.mediawiki.org/wiki/Manual:Job_queue vico de prokrastita reenkategoriado]',
'statistics-users' => 'Registritaj [[Special:ListUsers|uzantoj]]',
'statistics-users-active' => 'Aktivaj uzantoj',
'statistics-users-active-desc' => 'Uzantoj kiuj faris agon en la {{PLURAL:$1|lasta tago|lastaj $1 tagoj}}',
@@ -1754,7 +1905,7 @@ PaÄo estas traktata kiel apartigilo se Äi uzas Åablonon kiu estas ligita de [
'doubleredirects' => 'Duoblaj alidirektadoj',
'doubleredirectstext' => 'Ĉi tiu paÄo montras paÄojn kiuj alidirektas al aliaj alidirektiloj.
Ĉiu vico enhavas ligilojn ĉe la unua kaj dua alidirektadoj, kaj la unua linio de la dua alidirektado, kiu Äenerale montras la "veran" celpaÄon, kiu celu la unuan alidirektadon.
-<s>Forstrekitaj</s> listeroj estis riparitaj.',
+<del>Forstrekitaj</del> listeroj estis riparitaj.',
'double-redirect-fixed-move' => '[[$1]] estis alinomita; Äi nun alidirektas al [[$2]]',
'double-redirect-fixer' => 'Alidirektila riparilo',
@@ -1777,6 +1928,8 @@ PaÄo estas traktata kiel apartigilo se Äi uzas Åablonon kiu estas ligita de [
'nmembers' => '{{PLURAL:$1|unu membro|$1 membroj}}',
'nrevisions' => '$1 {{PLURAL:$1|versio|versioj}}',
'nviews' => '{{PLURAL:$1|unufoje|$1 fojojn}}',
+'nimagelinks' => 'Uzita en $1 {{PLURAL:$1|paÄo|paÄoj}}',
+'ntransclusions' => 'uzita en $1 {{PLURAL:$1|paÄo|paÄoj}}',
'specialpage-empty' => 'Ne estas rezultoj por ĉi tiu raporto.',
'lonelypages' => 'Neligitaj paÄoj',
'lonelypagestext' => 'La jenaj paÄoj ne estas ligitaj de aÅ­ transikluzivita en aliaj paÄoj en {{SITENAME}}.',
@@ -1935,34 +2088,40 @@ Estas [[{{MediaWiki:Listgrouprights-helppage}}|aldona informo]] pri individuaj r
'listgrouprights-removegroup-self-all' => 'Povas forigi ĉiujn grupojn de propra konto',
# E-mail user
-'mailnologin' => 'Neniu alsendota adreso',
-'mailnologintext' => 'Vi nepre estu [[Special:UserLogin|salutanta]] kaj havanta validan retpoÅtadreson en viaj [[Special:Preferences|preferoj]] por retpoÅti al aliaj uzantoj.',
-'emailuser' => 'RetpoÅti ĉi tiun uzanton',
-'emailpage' => 'RetpoÅti uzanton',
-'emailpagetext' => 'Vi povas uzi la jenan paÄon por sendi retpoÅtan mesaÄon al ĉi tiu uzanto.
+'mailnologin' => 'Neniu alsendota adreso',
+'mailnologintext' => 'Vi nepre estu [[Special:UserLogin|salutanta]] kaj havanta validan retpoÅtadreson en viaj [[Special:Preferences|preferoj]] por retpoÅti al aliaj uzantoj.',
+'emailuser' => 'RetpoÅti ĉi tiun uzanton',
+'emailpage' => 'RetpoÅti uzanton',
+'emailpagetext' => 'Vi povas uzi la jenan paÄon por sendi retpoÅtan mesaÄon al ĉi tiu uzanto.
La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel la "De" adreso de la retpoÅto, do la ricevonto eblos respondi rekte al vi.',
-'usermailererror' => 'Resendita retmesaÄa erarsubjekto:',
-'defemailsubject' => '{{SITENAME}} retmesaÄo',
-'noemailtitle' => 'Neniu retpoÅtadreso',
-'noemailtext' => 'Ĉi tiu uzanto ne donis validan retadreson.',
-'nowikiemailtitle' => 'RetpoÅto ne permesita',
-'nowikiemailtext' => 'Ĉi tiu uzanto elektis ne ricevi retpoÅton de aliaj uzantoj.',
-'email-legend' => 'Sendi retpoÅton al alia {{SITENAME}}-uzanto',
-'emailfrom' => 'De:',
-'emailto' => 'Al:',
-'emailsubject' => 'Temo:',
-'emailmessage' => 'MesaÄo:',
-'emailsend' => 'Sendi',
-'emailccme' => 'RetpoÅti al mi kopion de mia mesaÄo.',
-'emailccsubject' => 'Kopio de via mesaÄo al $1: $2',
-'emailsent' => 'RetmesaÄo sendita',
-'emailsenttext' => 'Via retmesaÄo estas sendita.',
-'emailuserfooter' => 'Ĉi tiun retpoÅton sendis $1 al $2 per funkcio "Email user" ĉe {{SITENAME}}.',
+'usermailererror' => 'Resendita retmesaÄa erarsubjekto:',
+'defemailsubject' => '{{SITENAME}} retmesaÄo',
+'usermaildisabled' => 'Uzula retpoÅto malÅaltis',
+'usermaildisabledtext' => 'Vi ne povas sendi retpoÅton al aliaj uzantoj en ĉi tiu vikio',
+'noemailtitle' => 'Neniu retpoÅtadreso',
+'noemailtext' => 'Ĉi tiu uzanto ne donis validan retadreson.',
+'nowikiemailtitle' => 'RetpoÅto ne permesita',
+'nowikiemailtext' => 'Ĉi tiu uzanto elektis ne ricevi retpoÅton de aliaj uzantoj.',
+'email-legend' => 'Sendi retpoÅton al alia {{SITENAME}}-uzanto',
+'emailfrom' => 'De:',
+'emailto' => 'Al:',
+'emailsubject' => 'Temo:',
+'emailmessage' => 'MesaÄo:',
+'emailsend' => 'Sendi',
+'emailccme' => 'RetpoÅti al mi kopion de mia mesaÄo.',
+'emailccsubject' => 'Kopio de via mesaÄo al $1: $2',
+'emailsent' => 'RetmesaÄo sendita',
+'emailsenttext' => 'Via retmesaÄo estas sendita.',
+'emailuserfooter' => 'Ĉi tiun retpoÅton sendis $1 al $2 per funkcio "Email user" ĉe {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Lasanta sisteman mesaÄon.',
+'usermessage-editor' => 'MesaÄanto de sistemo',
# Watchlist
'watchlist' => 'Atentaro',
'mywatchlist' => 'Atentaro',
-'watchlistfor' => '(por <b>$1</b>)',
+'watchlistfor2' => 'Por $1 $2',
'nowatchlist' => 'Vi ne jam elektis priatenti iun ajn paÄon.',
'watchlistanontext' => 'Bonvolu $1 por vidi aÅ­ redakti erojn en via atentaro.',
'watchnologin' => 'Ne ensalutinta',
@@ -2075,7 +2234,10 @@ La lasta redaktinto estis [[User:$3|$3]] ([[User talk:$3|diskuto]]{{int:pipe-sep
'revertpage' => 'Malfaris redaktojn de [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuto]]) al la lasta versio de [[User:$1|$1]]',
'revertpage-nouser' => 'Restarigita redaktoj de (salutnomo forigita) al lasta revizio de [[User:$1|$1]]',
'rollback-success' => 'Restaris redaktojn de $1; ÅanÄis al lasta versio de $2.',
-'sessionfailure' => 'Åœajnas ke estas problemo kun via ensalutado;
+
+# Edit tokens
+'sessionfailure-title' => 'Seanco malsukcesis',
+'sessionfailure' => 'Åœajnas ke estas problemo kun via ensalutado;
Ĉi ago estis nuligita por malhelpi fiensalutadon.
Bonvolu alklalki la reirbutonon kaj reÅarÄi la paÄon el kiu vi venas, kaj provu denove.',
@@ -2207,18 +2369,22 @@ $1',
'month' => 'Ekde monato (kaj pli frue):',
'year' => 'Ekde jaro (kaj pli frue):',
-'sp-contributions-newbies' => 'Montri nur kontribuojn de novaj kontoj',
-'sp-contributions-newbies-sub' => 'Kontribuoj de novaj uzantoj. Forigitaj paÄoj ne estas montritaj.',
-'sp-contributions-newbies-title' => 'Uzulaj kontribuoj de novaj kontoj',
-'sp-contributions-blocklog' => 'Protokolo de forbaroj',
-'sp-contributions-deleted' => 'forigitaj kontribuoj de uzantoj',
-'sp-contributions-logs' => 'protokoloj',
-'sp-contributions-talk' => 'diskuto',
-'sp-contributions-userrights' => 'administri rajtojn de uzantoj',
-'sp-contributions-blocked-notice' => 'La uzanto nune estas forbarita. Jen la lasta blokada listero en protokolo:',
-'sp-contributions-search' => 'Serĉado de kontribuoj',
-'sp-contributions-username' => 'IP-adreso aÅ­ salutnomo:',
-'sp-contributions-submit' => 'Serĉi',
+'sp-contributions-newbies' => 'Montri nur kontribuojn de novaj kontoj',
+'sp-contributions-newbies-sub' => 'Kontribuoj de novaj uzantoj. Forigitaj paÄoj ne estas montritaj.',
+'sp-contributions-newbies-title' => 'Uzulaj kontribuoj de novaj kontoj',
+'sp-contributions-blocklog' => 'Protokolo de forbaroj',
+'sp-contributions-deleted' => 'forigitaj kontribuoj de uzantoj',
+'sp-contributions-uploads' => 'alÅutoj',
+'sp-contributions-logs' => 'protokoloj',
+'sp-contributions-talk' => 'diskuto',
+'sp-contributions-userrights' => 'administri rajtojn de uzantoj',
+'sp-contributions-blocked-notice' => 'La uzanto nune estas forbarita. Jen la lasta blokada listero en protokolo:',
+'sp-contributions-blocked-notice-anon' => 'Ĉi tiu IP-adreso estas nune forbarita.
+Jen la lasta ero de la forbara protokolo:',
+'sp-contributions-search' => 'Serĉado de kontribuoj',
+'sp-contributions-username' => 'IP-adreso aÅ­ salutnomo:',
+'sp-contributions-toponly' => 'Montru nur ÅanÄojn kiuj estas la plej lastaj revizioj',
+'sp-contributions-submit' => 'Serĉi',
# What links here
'whatlinkshere' => 'Ligiloj ĉi tien',
@@ -2277,7 +2443,6 @@ Vidu la [[Special:IPBlockList|liston de IP-forbaroj]] por kontroli.',
'ipb-edit-dropdown' => 'Redakti kialojn por forbaro.',
'ipb-unblock-addr' => 'Restarigi $1',
'ipb-unblock' => 'Malforbari salutnomon aÅ­ IP-adreson',
-'ipb-blocklist-addr' => 'Ekzistantaj forbaroj por $1',
'ipb-blocklist' => 'Vidi ekzistantajn forbarojn',
'ipb-blocklist-contribs' => 'Kontribuoj de $1',
'unblockip' => 'Malforbari IP-adreson/nomon',
@@ -2291,7 +2456,7 @@ forbarita IP-adreso/nomo la povon enskribi en la vikio.',
'ipblocklist-username' => 'Salutnomo aÅ­ IP-adreso:',
'ipblocklist-sh-userblocks' => '$1 kontaj forbaroj',
'ipblocklist-sh-tempblocks' => '$1 provizoraj forbaroj',
-'ipblocklist-sh-addressblocks' => '$1 unuopaj IP-adresaj foraroj',
+'ipblocklist-sh-addressblocks' => '$1 unuopaj IP-adresaj forbaroj',
'ipblocklist-submit' => 'Serĉi',
'ipblocklist-localblock' => 'Loka forbaro',
'ipblocklist-otherblocks' => '{{PLURAL:$1|Alia forbaro|Aliaj forbaroj}}',
@@ -2346,6 +2511,8 @@ $1 estas jam forbarita. Ĉu vi volas ÅanÄi la opciojn?',
'sorbs_create_account_reason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}. Vi ne rajtas krei konton.',
'cant-block-while-blocked' => 'Vi ne povas forbari aliajn uzantojn dum vi estas forbarita.',
'cant-see-hidden-user' => 'La uzanto kiun vi provas forbari jam estis forbarita kaj kaÅita. Kiel vi ne havas la rajton kaÅi uzanton, vi ne povas vidi aÅ­ redakti la forbaron de la uzanto.',
+'ipbblocked' => 'Vi ne povas forbari aŭ malforbari aliajn uzantojn, ĉar vi mem estas forbarita',
+'ipbnounblockself' => 'Vi ne rajtas malforbari vin mem',
# Developer tools
'lockdb' => 'Åœlosi datumbazon',
@@ -2387,6 +2554,17 @@ Pro tio, vi ja povos removi la paÄon je la antaÅ­a titolo se vi mistajpus, kaj
'''AVERTO!'''
Tio povas esti drasta kaj neatendita ÅanÄo por populara paÄo;
bonvolu certigi vin, ke vi komprenas ties konsekvencojn antaÅ­ ol vi antaÅ­eniru.",
+'movepagetext-noredirectfixer' => "Per jena formularo vi povas alinomigi paÄon, kaj movi tutan Äian redaktohistorion al la nova nomo.
+La antaÅ­a titolo alidirektigos onin al la nova titolo.
+Kontrolu pri [[Special:DoubleRedirects|duoblajn]] aÅ­ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].
+Vi respondecas pri tio ke ligoj restas montrantaj Äustadirekten.
+
+Konsciu ke la paÄo '''ne'' estas movota se jam ekzistas paÄo havanta la novan titolon, krom se Äi maplenas aÅ­ estas alidirektilo sen antaÅ­a redaktohistorio.
+Tio ĉi signifas ke vi povas alinomigi paÄon reen al antaÅ­a nomo se vi eraras, kaj vi ke vi ne povas anstataÅ­igi ekzistantan paÄon.
+
+'''Averto!''
+Eblas ke tio ĉi estas drasta kaj neatendita ÅanÄo de populara paÄo;
+AntaÅ­ daÅ­rigi, bonvolu certiÄi, ke vi komprenas la konsekvencojn de tiuj ĉi ÅanÄo.",
'movepagetalktext' => "La movo aÅ­tomate kunportos la diskuto-paÄon, se tia ekzistas, '''krom se:'''
*Vi movas la paÄon tra nomspacoj (ekz de ''Nomo'' je ''User:Nomo''),
*Ne malplena diskuto-paÄo jam ekzistas je la nova nomo, aÅ­
@@ -2445,6 +2623,7 @@ La celartikolo "[[:$1]]" jam ekzistas. Ĉu vi volas forigi Äin por krei spacon
'immobile-source-page' => 'Ĉi tiu paÄo ne estas movebla.',
'immobile-target-page' => 'Ne povas movi al tiu destina titolo.',
'imagenocrossnamespace' => 'Ne povas movi dosieron al nedosiera nomspaco',
+'nonfile-cannot-move-to-file' => 'Ne povas movi ne-dosieron al dosiera nomspaco',
'imagetypemismatch' => 'La nova dosierfinaĵo ne kongruas Äian dosiertipon.',
'imageinvalidfilename' => 'La cela dosiernomo estas nevalida',
'fix-double-redirects' => 'Äœisdatigi iujn alidirektilojn kiuj direktas al la originala titolo',
@@ -2525,6 +2704,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'importstart' => 'Importante paÄojn...',
'import-revision-count' => '$1 {{PLURAL:$1|versio|versioj}}',
'importnopages' => 'Neniu paÄo por importi.',
+'imported-log-entries' => '{{PLURAL:$1|Protokollinio|Protokollinioj}} $1 {{PLURAL:$1|importita|importitaj}}',
'importfailed' => 'Malsukcesis la importo: $1',
'importunknownsource' => 'Nekonata fonta speco de alÅuto',
'importcantopen' => 'Ne povas malfermi import-dosieron',
@@ -2617,6 +2797,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'tooltip-upload' => 'EkalÅuti',
'tooltip-rollback' => '"Restarigi antaÅ­an" restarigas redakto(j)n al ĉi tiu paÄo de la lasta kontribuanto per unu klako.',
'tooltip-undo' => '"Malfari" malfaris ĉi tiun redakton kaj malfermas la redakto-paÄon en antaÅ­vida reÄimo. Permesas aldoni kialon en la resumo.',
+'tooltip-preferences-save' => 'Konservi preferojn',
+'tooltip-summary' => 'Enigu mallongan resumon',
# Metadata
'nodublincore' => 'Dublin Core RDF metadatumo estas malebligita por ĉi servilo.',
@@ -2713,19 +2895,21 @@ $1',
'nextdiff' => 'Pli nova redakto →',
# Media information
-'mediawarning' => "'''Warning''': This file type may contain malicious code.
-By executing it, your system may be compromised.",
+'mediawarning' => "'''Atenton!''': Ĉi tiu dosiero eble enhavas malican kodadon, per Äia ruligo via sistemo povus endanÄeriÄi.",
'imagemaxsize' => "Limo por bildoj:<br />''(por dosieraj priskribo-paÄoj)''",
'thumbsize' => 'Grandeco de bildetoj:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|paÄo|paÄoj}}',
-'file-info' => '(pezo de dosiero: $1, MIME-tipo: $2)',
-'file-info-size' => '($1 × $2 rastrumeroj, dosiera grandeco: $3, MIME-tipo: $4)',
+'file-info' => 'pezo de dosiero: $1, MIME-tipo: $2',
+'file-info-size' => '$1 × $2 rastrumeroj, dosiera grandeco: $3, MIME-tipo: $4',
'file-nohires' => '<small>Nenia pli granda distingivo havebla.</small>',
-'svg-long-desc' => '(SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3)',
+'svg-long-desc' => 'SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3',
'show-big-image' => 'Plena distingivo',
'show-big-image-thumb' => '<small>Grandeco de ĉi antaŭvido: $1 × $2 rastrumeroj</small>',
'file-info-gif-looped' => 'ripeta GIF',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ĉelo|ĉeloj}}',
+'file-info-png-looped' => 'ripetita',
+'file-info-png-repeat' => 'Ludis $1 fojo{{PLURAL:$1||j}}n',
+'file-info-png-frames' => '$1 kadro{{PLURAL:$1||j}}',
# Special:NewFiles
'newimages' => 'Galerio de novaj dosieroj',
@@ -2880,6 +3064,7 @@ Sekvaj ligilo en la sama linio estas konsiderata kiel esceptoj (paÄoj kiel la b
'exif-gpsareainformation' => 'Nomo de GPS areo',
'exif-gpsdatestamp' => 'GPS dato',
'exif-gpsdifferential' => 'GPS diferenca korektado',
+'exif-objectname' => 'Mallonga titolo',
# EXIF attributes
'exif-compression-1' => 'Nedensigita',
@@ -2961,6 +3146,8 @@ Sekvaj ligilo en la sama linio estas konsiderata kiel esceptoj (paÄoj kiel la b
'exif-sensingmethod-7' => 'Trilinia sensilo',
'exif-sensingmethod-8' => 'Sensilo de laÅ­vicaj liniaj koloroj',
+'exif-filesource-3' => 'Cifereca senmova fotilo',
+
'exif-scenetype-1' => 'Rekte fotita bildo',
'exif-customrendered-0' => 'Norma proceso',
@@ -3037,25 +3224,25 @@ Sekvaj ligilo en la sama linio estas konsiderata kiel esceptoj (paÄoj kiel la b
'limitall' => 'ĉiuj',
# E-mail address confirmation
-'confirmemail' => 'Konfirmi retadreson',
-'confirmemail_noemail' => 'Vi ne havas validan retpoÅtan adreson notitan en viaj [[Special:Preferences|Preferoj]].',
-'confirmemail_text' => 'Ĉi tiu vikio postulas ke vi validigu vian retadreson antaÅ­ ol uzadi la retmesaÄpreferojn. Bonvolu alklaki la suban butonon por sendi konfirmesaÄon al via adreso. La mesaÄo entenos ligilon kun kodo; bonvolu alÅuti la ligilon en vian foliumilon por konfirmi ke via retadreso validas.',
-'confirmemail_pending' => 'Konfirma kodo estis jam repoÅtis al vi; se vi lastatempe kreis vian konton, vi eble volus atenti kelkajn minutojn por Äi aliÄi antaÅ­ vi petus novan kodon.',
-'confirmemail_send' => 'RetmesaÄi konfirmkodon',
-'confirmemail_sent' => 'Konfirma retmesaÄo estas sendita.',
-'confirmemail_oncreate' => 'Konfirma kodo estis sendita al via retpoÅta adreso.
+'confirmemail' => 'Konfirmi retadreson',
+'confirmemail_noemail' => 'Vi ne havas validan retpoÅtan adreson notitan en viaj [[Special:Preferences|Preferoj]].',
+'confirmemail_text' => 'Ĉi tiu vikio postulas ke vi validigu vian retadreson antaÅ­ ol uzadi la retmesaÄpreferojn. Bonvolu alklaki la suban butonon por sendi konfirmesaÄon al via adreso. La mesaÄo entenos ligilon kun kodo; bonvolu alÅuti la ligilon en vian foliumilon por konfirmi ke via retadreso validas.',
+'confirmemail_pending' => 'Konfirma kodo estis jam repoÅtis al vi; se vi lastatempe kreis vian konton, vi eble volus atenti kelkajn minutojn por Äi aliÄi antaÅ­ vi petus novan kodon.',
+'confirmemail_send' => 'RetmesaÄi konfirmkodon',
+'confirmemail_sent' => 'Konfirma retmesaÄo estas sendita.',
+'confirmemail_oncreate' => 'Konfirma kodo estis sendita al via retpoÅta adreso.
Ĉi kodo ne estas bezonata ensaluti, sed vi bezonos doni Äin antaÅ­ uzante iujn ajn retpoÅt-bazitajn ecojn de la vikio.',
-'confirmemail_sendfailed' => '{{SITENAME}} ne eblis sendi vian konfirmretmesaÄon.
+'confirmemail_sendfailed' => '{{SITENAME}} ne eblis sendi vian konfirmretmesaÄon.
Bonvolu kontroli vian retadreson por nevalidaj signoj.
RetpoÅta programo respondis: $1',
-'confirmemail_invalid' => 'Nevalida konfirmkodo. La kodo eble ne plu validas.',
-'confirmemail_needlogin' => 'Vi devas $1 por konfirmi vian retpoÅtan adreson.',
-'confirmemail_success' => 'Via retadreso estas konfirmita. Vi povas nun ensaluti kaj Äui la vikion.',
-'confirmemail_loggedin' => 'Via retadreso estas nun konfirmita.',
-'confirmemail_error' => 'Io misokazis dum konservo de via konfirmo.',
-'confirmemail_subject' => 'Konfirmo de retadreso por {{SITENAME}}',
-'confirmemail_body' => 'Iu, verÅajne vi, ĉe la IP-adreso $1,
+'confirmemail_invalid' => 'Nevalida konfirmkodo. La kodo eble ne plu validas.',
+'confirmemail_needlogin' => 'Vi devas $1 por konfirmi vian retpoÅtan adreson.',
+'confirmemail_success' => 'Via retadreso estas konfirmita. Vi povas nun ensaluti kaj Äui la vikion.',
+'confirmemail_loggedin' => 'Via retadreso estas nun konfirmita.',
+'confirmemail_error' => 'Io misokazis dum konservo de via konfirmo.',
+'confirmemail_subject' => 'Konfirmo de retadreso por {{SITENAME}}',
+'confirmemail_body' => 'Iu, verÅajne vi, ĉe la IP-adreso $1,
enregistrigis konton "$2" ĉe {{SITENAME}} kun ĉi retadreso ĉe {{SITENAME}}.
Konfirmi ke ĉi tiu konto ja apartenas al vi kaj por malÅlosi
@@ -3070,8 +3257,35 @@ $5
Ĉi tiu konfirmokodo eksvalidiÄos je $4.',
-'confirmemail_invalidated' => 'Konfirmado de retadreso estas nuligita',
-'invalidateemail' => 'Nuligi konfirmadon de retadreso',
+'confirmemail_body_changed' => 'Iu, verÅajne vi, de IP-adreso $1,
+ÅanÄis la retadreson de la konto "$2" al ĉi tiu adreso en {{SITENAME}}.
+
+Por konfirmi, ke ĉi tiu konto ja apartenas al vi kaj reaktivigi
+retpoÅtajn ecojn en {{SITENAME}}, sekvu ĉi tiun ligilon en via retumilo:
+
+$3
+
+Se la konto *ne* apartenas al vi, sekvu ĉi tiun ligilon
+por nuligi la retadresan konfirmadon:
+
+$5
+
+Ĉi tiu konfirmkodo malvalidiÄos je $4.',
+'confirmemail_body_set' => 'Iu, supozeble vi mem, je IP-adreso $1,
+agordis la retpoÅadreson de konto "$2" al ĉi tiu adreso je {{SITENAME}}.
+
+Por konfirmi ke ĉi tiu konto vere apertenas al vi kaj refunkciigi la retpoÅtfunkciojn je {{SITENAME}}, bonvolu
+malfermi la jenon ligon per via foliumilo:
+
+$3
+
+Se ĉi tiu konto *ne* apertenas al vi, bonvolu sekvi jenan ligon por nuligi la konfirmon pir la retpoÅadreso:
+
+$5
+
+Ĉi tiu konfirma kodo eksvalidiÄos je $4',
+'confirmemail_invalidated' => 'Konfirmado de retadreso estas nuligita',
+'invalidateemail' => 'Nuligi konfirmadon de retadreso',
# Scary transclusion
'scarytranscludedisabled' => '[Intervikia transinkluzivado estas malebligita.]',
@@ -3087,7 +3301,7 @@ $1',
# Delete conflict
'deletedwhileediting' => "'''Averto''': Ĉi tiu paÄo estis forigita post vi ekredaktis!",
-'confirmrecreate' => "Uzanto [[User:$1|$1]] ([[User talk:$1|diskuto]]) forigis ĉi paÄon post vi ekredaktis Äin kun kialo:
+'confirmrecreate' => "Uzanto [[User:$1|$1]] ([[User talk:$1|diskuto]]) forigis ĉi tiun paÄon post vi ekredaktis Äin kun kialo:
: ''$2''
Bonvolu konfirmi ke vi ja volas rekrei la paÄon.",
'recreate' => 'Rekrei',
@@ -3111,6 +3325,7 @@ Bonvolu konfirmi ke vi ja volas rekrei la paÄon.",
'table_pager_first' => 'Unua paÄo',
'table_pager_last' => 'Lasta paÄo',
'table_pager_limit' => 'Montri $1 aĵojn por paÄo',
+'table_pager_limit_label' => 'Eroj por paÄo:',
'table_pager_limit_submit' => 'Ek',
'table_pager_empty' => 'Neniaj rezultoj',
@@ -3165,6 +3380,7 @@ Vi povas ankaÅ­ [[Special:Watchlist/edit|redakti norme]].',
'version-specialpages' => 'Specialaj paÄoj',
'version-parserhooks' => 'Sintaksaj hokoj',
'version-variables' => 'Variabloj',
+'version-skins' => 'Etosoj',
'version-other' => 'Alia',
'version-mediahandlers' => 'Mediaj traktiloj',
'version-hooks' => 'Hokoj',
@@ -3176,6 +3392,13 @@ Vi povas ankaÅ­ [[Special:Watchlist/edit|redakti norme]].',
'version-hook-subscribedby' => 'Abonita de',
'version-version' => '(Versio $1)',
'version-license' => 'Permesilo',
+'version-poweredby-credits' => "Ĉi tiu vikio funkcias per '''[http://www.mediawiki.org/ MediaWiki]''', aŭtorrajto ©&thinsp;2001–$1 $2.",
+'version-poweredby-others' => 'aliaj',
+'version-license-info' => 'MediaWiki estas libera programaro. Vi povas redistribui Äin kaj/aÅ­ modifi Äin sub la kondiĉoj de la GNU General Public Licens (GNU Äœenerala Publika Permesilo) en ties eldono de la Free Software Foundation (Libera Softvara Fondaĵo) - aÅ­ versio 2 de la Permesilo, aÅ­ (laÅ­ via elekto) iu ajn posta versio.
+
+Tiun ĉi verkon ni distribuas esperante, ke Äi utilos, sed SEN IA AJN GARANTIO; eĉ sen la implica garantio de SURMERKATIGEBLECO aÅ­ TAŬGECO POR IA DIFINITA CELO. Vidu GNU General Public License por pliaj detaloj.
+
+Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU General Public License] kune kun tiu ĉi programo; se ne, skribu al Free Software Foundation, Inc., 59 Temple Place, Suite 350, Boston, MA 02111-1307 USA aÅ­ [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html legu Äin interrete].',
'version-software' => 'Instalita programaro',
'version-software-product' => 'Produkto',
'version-software-version' => 'Versio',
@@ -3246,6 +3469,15 @@ Enigu la dosiernomon sen la "{{ns:file}}:" prefikso.',
'tags-edit' => 'redakti',
'tags-hitcount' => '$1 {{PLURAL:$1|ÅanÄo|ÅanÄoj}}',
+# Special:ComparePages
+'comparepages' => 'Kompari paÄojn',
+'compare-selector' => 'Kompari reviziojn de paÄo',
+'compare-page1' => 'PaÄo 1',
+'compare-page2' => 'PaÄo 2',
+'compare-rev1' => 'Revizio 1',
+'compare-rev2' => 'Revizio 2',
+'compare-submit' => 'Komparu',
+
# Database error messages
'dberr-header' => 'Ĉi tiu vikio havas problemon',
'dberr-problems' => 'Bedaŭrinde, ĉi tiu retejo suferas pro teknikaj problemoj.',
@@ -3262,8 +3494,13 @@ Enigu la dosiernomon sen la "{{ns:file}}:" prefikso.',
'htmlform-float-invalid' => 'La valoro, kiun vi specifis, ne estas numero.',
'htmlform-int-toolow' => 'La valoro, kiun vi specifis, estas sub la minimumo de $1',
'htmlform-int-toohigh' => 'La valoro, kiun vi specifis, estas super la maksimumo de $1',
+'htmlform-required' => 'Ĉi tiu valoro estas deviga',
'htmlform-submit' => 'Ek!',
'htmlform-reset' => 'Malfari ÅanÄojn',
'htmlform-selectorother-other' => 'Alia',
+# SQLite database support
+'sqlite-has-fts' => '$1 kun tut-teksta subteno',
+'sqlite-no-fts' => '$1 sen tut-teksta subteno',
+
);
diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php
index 4cbf8810..3064a51c 100644
--- a/languages/messages/MessagesEs.php
+++ b/languages/messages/MessagesEs.php
@@ -23,6 +23,7 @@
* @author Clerc
* @author Crazymadlover
* @author Cvmontuy
+ * @author Danke7
* @author David0811
* @author Dferg
* @author Diego Grez
@@ -38,6 +39,7 @@
* @author Jens Liebenau
* @author Jurock
* @author Lin linao
+ * @author Linterweb
* @author Locos epraix
* @author Mahadeva
* @author Manuelt15
@@ -60,6 +62,7 @@
* @author Toniher
* @author Translationista
* @author Urhixidur
+ * @author VegaDark
* @author XalD
* @author לערי ריינה×רט
*/
@@ -89,59 +92,60 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'RedireccionesDobles', 'Redirecciones dobles' ),
- 'BrokenRedirects' => array( 'RedireccionesRotas', 'Redirecciones rotas' ),
+ 'DoubleRedirects' => array( 'RedireccionesDobles', 'Redirecciones_dobles' ),
+ 'BrokenRedirects' => array( 'RedireccionesRotas', 'Redirecciones_rotas' ),
'Disambiguations' => array( 'Desambiguaciones', 'Desambiguación' ),
- 'Userlogin' => array( 'Entrar', 'Entrada usuario' ),
- 'Userlogout' => array( 'Salida usuario', 'Salir' ),
- 'CreateAccount' => array( 'Crear cuenta', 'CrearCuenta' ),
+ 'Userlogin' => array( 'Entrar', 'Entrada_del_usuario' ),
+ 'Userlogout' => array( 'Salida_del_usuario', 'Salir' ),
+ 'CreateAccount' => array( 'Crear_una_cuenta', 'CrearCuenta' ),
'Preferences' => array( 'Preferencias' ),
- 'Watchlist' => array( 'Seguimiento', 'Lista de seguimiento' ),
- 'Recentchanges' => array( 'CambiosRecientes', 'Cambios recientes' ),
- 'Upload' => array( 'SubirArchivo', 'Subir archivo' ),
- 'Listfiles' => array( 'ListaImágenes', 'Lista de imágenes' ),
- 'Newimages' => array( 'NuevasImágenes', 'Nuevas imágenes' ),
- 'Listusers' => array( 'ListaUsuarios', 'Lista de usuarios' ),
- 'Listgrouprights' => array( 'ListaDerechosGrupos', 'Derechos de grupos de usuarios' ),
+ 'Watchlist' => array( 'Seguimiento', 'Lista_de_seguimiento' ),
+ 'Recentchanges' => array( 'CambiosRecientes', 'Cambios_recientes' ),
+ 'Upload' => array( 'SubirArchivo', 'Subir_archivo' ),
+ 'Listfiles' => array( 'ListaImágenes', 'Lista_de_imágenes' ),
+ 'Newimages' => array( 'NuevasImágenes', 'Nuevas_imágenes' ),
+ 'Listusers' => array( 'ListaUsuarios', 'Lista_de_usuarios' ),
+ 'Listgrouprights' => array( 'ListaDerechosGrupos', 'Derechos_de_grupos_de_usuarios' ),
'Statistics' => array( 'Estadísticas' ),
- 'Randompage' => array( 'Aleatoria', 'Aleatorio', 'Página aleatoria' ),
- 'Lonelypages' => array( 'PáginasHuérfanas', 'Páginas huérfanas' ),
- 'Uncategorizedpages' => array( 'PáginasSinCategorizar', 'Páginas sin categorizar' ),
- 'Uncategorizedcategories' => array( 'CategoríasSinCategorizar', 'Categorías sin categorizar' ),
- 'Uncategorizedimages' => array( 'ImágenesSinCategorizar', 'Imágenes sin categorizar' ),
- 'Uncategorizedtemplates' => array( 'PlantillasSinCategorizar', 'Plantillas sin categorizar' ),
- 'Unusedcategories' => array( 'CategoríasSinUso', 'Categorías sin uso' ),
- 'Unusedimages' => array( 'ImágenesSinUso', 'Imágenes sin uso' ),
- 'Wantedpages' => array( 'PáginasRequeridas', 'Páginas requeridas' ),
- 'Wantedcategories' => array( 'CategoríasRequeridas', 'Categorías requeridas' ),
- 'Wantedfiles' => array( 'ArchivosRequeridos', 'Archivos requeridos' ),
- 'Wantedtemplates' => array( 'PlantillasRequeridas', 'Plantillas requeridas' ),
- 'Mostlinked' => array( 'MásEnlazados', 'Más enlazados' ),
- 'Mostlinkedcategories' => array( 'CategoríasMásUsadas', 'Categorías más usadas' ),
- 'Mostlinkedtemplates' => array( 'PlantillasMásUsadas', 'Plantillas más usadas' ),
- 'Mostimages' => array( 'MásImágenes', 'Con más imágenes' ),
- 'Mostcategories' => array( 'MásCategorizadas', 'Más categorizadas' ),
- 'Mostrevisions' => array( 'MásEdiciones', 'Más ediciones' ),
- 'Fewestrevisions' => array( 'MenosEdiciones', 'Menos ediciones' ),
- 'Shortpages' => array( 'PáginasCortas', 'Páginas cortas' ),
- 'Longpages' => array( 'PáginasLargas', 'Páginas largas' ),
- 'Newpages' => array( 'PáginasNuevas', 'Páginas nuevas' ),
- 'Ancientpages' => array( 'PáginasAntiguas', 'Páginas antiguas' ),
- 'Deadendpages' => array( 'PáginasSinSalida', 'Páginas sin salida' ),
- 'Protectedpages' => array( 'PáginasProtegidas', 'Páginas protegidas' ),
- 'Protectedtitles' => array( 'TítulosProtegidos', 'Títulos protegidos' ),
- 'Allpages' => array( 'Todas', 'Todas las páginas' ),
- 'Prefixindex' => array( 'PáginasPorPrefijo', 'Páginas por prefijo' ),
- 'Ipblocklist' => array( 'UsuariosBloqueados', 'Lista de usuarios bloqueados' ),
- 'Specialpages' => array( 'PáginasEspeciales', 'Páginas especiales' ),
+ 'Randompage' => array( 'Aleatoria', 'Aleatorio', 'Página_aleatoria' ),
+ 'Lonelypages' => array( 'PáginasHuérfanas', 'Páginas_huérfanas' ),
+ 'Uncategorizedpages' => array( 'PáginasSinCategorizar', 'Páginas_sin_categorizar' ),
+ 'Uncategorizedcategories' => array( 'CategoríasSinCategorizar', 'Categorías_sin_categorizar' ),
+ 'Uncategorizedimages' => array( 'ImágenesSinCategorizar', 'Imágenes_sin_categorizar' ),
+ 'Uncategorizedtemplates' => array( 'PlantillasSinCategorizar', 'Plantillas_sin_categorizar' ),
+ 'Unusedcategories' => array( 'CategoríasSinUso', 'Categorías_sin_uso' ),
+ 'Unusedimages' => array( 'ImágenesSinUso', 'Imágenes_sin_uso' ),
+ 'Wantedpages' => array( 'PáginasRequeridas', 'Páginas_requeridas' ),
+ 'Wantedcategories' => array( 'CategoríasRequeridas', 'Categorías_requeridas' ),
+ 'Wantedfiles' => array( 'ArchivosRequeridos', 'Archivos_requeridos' ),
+ 'Wantedtemplates' => array( 'PlantillasRequeridas', 'Plantillas_requeridas' ),
+ 'Mostlinked' => array( 'MásEnlazados', 'Más_enlazados' ),
+ 'Mostlinkedcategories' => array( 'CategoríasMásUsadas', 'Categorías_más_usadas' ),
+ 'Mostlinkedtemplates' => array( 'PlantillasMásUsadas', 'Plantillas_más_usadas' ),
+ 'Mostimages' => array( 'MásImágenes', 'Con_más_imágenes' ),
+ 'Mostcategories' => array( 'MásCategorizadas', 'Más_categorizadas' ),
+ 'Mostrevisions' => array( 'MásEdiciones', 'Más_ediciones' ),
+ 'Fewestrevisions' => array( 'MenosEdiciones', 'Menos_ediciones' ),
+ 'Shortpages' => array( 'PáginasCortas', 'Páginas_cortas' ),
+ 'Longpages' => array( 'PáginasLargas', 'Páginas_largas' ),
+ 'Newpages' => array( 'PáginasNuevas', 'Páginas_nuevas' ),
+ 'Ancientpages' => array( 'PáginasAntiguas', 'Páginas_antiguas' ),
+ 'Deadendpages' => array( 'PáginasSinSalida', 'Páginas_sin_salida' ),
+ 'Protectedpages' => array( 'PáginasProtegidas', 'Páginas_protegidas' ),
+ 'Protectedtitles' => array( 'TítulosProtegidos', 'Títulos_protegidos' ),
+ 'Allpages' => array( 'Todas', 'Todas_las_páginas' ),
+ 'Prefixindex' => array( 'PáginasPorPrefijo', 'Páginas_por_prefijo' ),
+ 'Ipblocklist' => array( 'UsuariosBloqueados', 'Lista_de_usuarios_bloqueados' ),
+ 'Unblock' => array( 'Desbloquear' ),
+ 'Specialpages' => array( 'PáginasEspeciales', 'Páginas_especiales' ),
'Contributions' => array( 'Contribuciones' ),
'Emailuser' => array( 'MandarEmailUsuario' ),
- 'Confirmemail' => array( 'ConfirmarEmail', 'Confirmar e-mail' ),
- 'Whatlinkshere' => array( 'LoQueEnlazaAquí', 'Lo que enlaza aquí' ),
- 'Recentchangeslinked' => array( 'CambiosEnEnlazadas', 'Cambios en enlazadas' ),
- 'Movepage' => array( 'MoverPágina', 'Mover página' ),
+ 'Confirmemail' => array( 'ConfirmarEmail', 'Confirmar_e-mail' ),
+ 'Whatlinkshere' => array( 'LoQueEnlazaAquí', 'Lo_que_enlaza_aquí' ),
+ 'Recentchangeslinked' => array( 'CambiosEnEnlazadas', 'Cambios_en_enlazadas' ),
+ 'Movepage' => array( 'MoverPágina', 'Mover_página' ),
'Blockme' => array( 'Bloquearme' ),
- 'Booksources' => array( 'FuentesDeLibros', 'Fuentes de libros' ),
+ 'Booksources' => array( 'FuentesDeLibros', 'Fuentes_de_libros' ),
'Categories' => array( 'Categorías' ),
'Export' => array( 'Exportar' ),
'Version' => array( 'Versión' ),
@@ -150,33 +154,34 @@ $specialPageAliases = array(
'Blockip' => array( 'Bloquear' ),
'Undelete' => array( 'Restaurar' ),
'Import' => array( 'Importar' ),
- 'Lockdb' => array( 'BloquearBasedeDatos', 'Bloquear base de datos' ),
- 'Unlockdb' => array( 'DesbloquearBasedeDatos', 'Desbloquear base de datos' ),
- 'Userrights' => array( 'PermisosUsuarios', 'Permisos de usuarios' ),
- 'MIMEsearch' => array( 'BuscarPorMIME', 'Buscar por MIME' ),
- 'FileDuplicateSearch' => array( 'BuscarArchivosDuplicados', 'Buscar archivos duplicados' ),
- 'Unwatchedpages' => array( 'PáginasSinVigilar', 'Páginas sin vigilar' ),
- 'Listredirects' => array( 'TodasLasRedirecciones', 'Todas las redirecciones' ),
- 'Revisiondelete' => array( 'BorrarRevisión', 'Borrar revisión' ),
- 'Unusedtemplates' => array( 'PlantillasSinUso', 'Plantillas sin uso' ),
- 'Randomredirect' => array( 'RedirecciónAleatoria', 'Redirección aleatoria' ),
- 'Mypage' => array( 'MiPágina', 'Mi página' ),
- 'Mytalk' => array( 'MiDiscusión', 'Mi discusión' ),
- 'Mycontributions' => array( 'MisContribuciones', 'Mis contribuciones' ),
- 'Listadmins' => array( 'ListaDeAdministradores', 'Lista de administradores' ),
- 'Listbots' => array( 'ListaDeBots', 'Lista de bots' ),
- 'Popularpages' => array( 'PáginasMásVisitadas', 'PáginasPopulares', 'Páginas más visitadas' ),
+ 'Lockdb' => array( 'BloquearBasedeDatos', 'Bloquear_base_de_datos' ),
+ 'Unlockdb' => array( 'DesbloquearBasedeDatos', 'Desbloquear_base_de_datos' ),
+ 'Userrights' => array( 'PermisosUsuarios', 'Permisos_de_usuarios' ),
+ 'MIMEsearch' => array( 'BuscarPorMIME', 'Buscar_por_MIME' ),
+ 'FileDuplicateSearch' => array( 'BuscarArchivosDuplicados', 'Buscar_archivos_duplicados' ),
+ 'Unwatchedpages' => array( 'PáginasSinVigilar', 'Páginas_sin_vigilar' ),
+ 'Listredirects' => array( 'TodasLasRedirecciones', 'Todas_las_redirecciones' ),
+ 'Revisiondelete' => array( 'BorrarRevisión', 'Borrar_revisión' ),
+ 'Unusedtemplates' => array( 'PlantillasSinUso', 'Plantillas_sin_uso' ),
+ 'Randomredirect' => array( 'RedirecciónAleatoria', 'Redirección_aleatoria' ),
+ 'Mypage' => array( 'MiPágina', 'Mi_página' ),
+ 'Mytalk' => array( 'MiDiscusión', 'Mi_discusión' ),
+ 'Mycontributions' => array( 'MisContribuciones', 'Mis_contribuciones' ),
+ 'Listadmins' => array( 'ListaDeAdministradores', 'Lista_de_administradores' ),
+ 'Listbots' => array( 'ListaDeBots', 'Lista_de_bots' ),
+ 'Popularpages' => array( 'PáginasMásVisitadas', 'PáginasPopulares', 'Páginas_más_visitadas' ),
'Search' => array( 'Buscar' ),
- 'Resetpass' => array( 'Cambiar contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear contraseña' ),
- 'Withoutinterwiki' => array( 'SinInterwikis', 'Sin interwikis' ),
- 'MergeHistory' => array( 'FusionarHistorial', 'Fusionar historial' ),
- 'Filepath' => array( 'RutaDeArchivo', 'Ruta de archivo' ),
- 'Invalidateemail' => array( 'InvalidarEmail', 'Invalidar e-mail' ),
- 'Blankpage' => array( 'BlanquearPágina', 'Blanquear página' ),
- 'LinkSearch' => array( 'BúsquedaDeEnlaces', 'Búsqueda de enlaces' ),
- 'DeletedContributions' => array( 'ContribucionesBorradas', 'Contribuciones Borradas' ),
+ 'Resetpass' => array( 'Cambiar_contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear_contraseña' ),
+ 'Withoutinterwiki' => array( 'SinInterwikis', 'Sin_interwikis' ),
+ 'MergeHistory' => array( 'FusionarHistorial', 'Fusionar_historial' ),
+ 'Filepath' => array( 'RutaDeArchivo', 'Ruta_de_archivo' ),
+ 'Invalidateemail' => array( 'InvalidarEmail', 'Invalidar_e-mail' ),
+ 'Blankpage' => array( 'BlanquearPágina', 'Blanquear_página' ),
+ 'LinkSearch' => array( 'BúsquedaDeEnlaces', 'Búsqueda_de_enlaces' ),
+ 'DeletedContributions' => array( 'ContribucionesBorradas', 'Contribuciones_Borradas' ),
'Tags' => array( 'Etiquetas' ),
'Activeusers' => array( 'UsuariosActivos' ),
+ 'ComparePages' => array( 'CompararPáginas' ),
);
$magicWords = array(
@@ -192,12 +197,12 @@ $magicWords = array(
'currentmonthname' => array( '1', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'GENERADORNOMBREMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA ACTUAL', 'DIA ACTUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA ACTUAL2', 'DIA ACTUAL2', 'CURRENTDAY2' ),
+ 'currentday' => array( '1', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
'currentdayname' => array( '1', 'NOMBREDÃAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AÑOACTUAL', 'AÑO ACTUAL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HORAACTUAL', 'HORA ACTUAL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HORA MINUTOS ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
+ 'currentyear' => array( '1', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
@@ -235,18 +240,19 @@ $magicWords = array(
'subjectpagename' => array( '1', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'img_thumbnail' => array( '1', 'miniaturadeimagen', 'miniatura', 'thumbnail', 'thumb' ),
+ 'img_thumbnail' => array( '1', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'derecha', 'dcha', 'der', 'right' ),
'img_left' => array( '1', 'izquierda', 'izda', 'izq', 'left' ),
'img_none' => array( '1', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
'img_center' => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
'img_framed' => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sinmarco', 'sin enmarcar', 'sinenmarcar', 'frameless' ),
+ 'img_frameless' => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
'img_page' => array( '1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'page=$1', 'page $1' ),
'img_border' => array( '1', 'borde', 'border' ),
- 'img_link' => array( '1', 'vínculo=$1', 'vinculo=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
'sitename' => array( '1', 'NOMBREDESITIO', 'SITENAME' ),
+ 'ns' => array( '0', 'EN:', 'NS:' ),
'localurl' => array( '0', 'URLLOCAL', 'LOCALURL:' ),
'localurle' => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
'server' => array( '0', 'SERVIDOR', 'SERVER' ),
@@ -283,10 +289,10 @@ $magicWords = array(
'localtimestamp' => array( '1', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'numberofadmins' => array( '1', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
+ 'numberofadmins' => array( '1', 'NÚMEROADMINIISTRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
'formatnum' => array( '0', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
'special' => array( '0', 'especial', 'special' ),
- 'defaultsort' => array( '1', 'ORDENPREDETERMINADO:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'defaultsort' => array( '1', 'ORDENAR:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
'tag' => array( '0', 'etiqueta', 'ETIQUETA', 'tag' ),
'hiddencat' => array( '1', '__CATEGORÃAOCULTA__', '__HIDDENCAT__' ),
@@ -308,7 +314,7 @@ $dateFormats = array(
'dmy both' => 'H:i j M Y',
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
$messages = array(
@@ -327,20 +333,19 @@ $messages = array(
'tog-editsection' => 'Habilitar la edición de secciones usando el enlace [editar]',
'tog-editsectiononrightclick' => 'Habilitar la edición de secciones presionando el botón de la derecha en los títulos de secciones (requiere JavaScript)',
'tog-showtoc' => 'Mostrar el índice (para páginas con más de 3 encabezados)',
-'tog-rememberpassword' => 'Recordar la contraseña entre sesiones',
-'tog-editwidth' => 'Ampliar el cuadro de edición para llenar toda la pantalla',
+'tog-rememberpassword' => 'Recordar mi nombre de usuario y contraseña entre sesiones en este navegador (por un máximo de $1 {{PLURAL:$1|día|días}})',
'tog-watchcreations' => 'Vigilar las páginas que yo cree',
'tog-watchdefault' => 'Vigilar las páginas que yo modifique',
'tog-watchmoves' => 'Vigilar las páginas que renombre',
'tog-watchdeletion' => 'Vigilar las páginas que borre',
-'tog-minordefault' => 'Marcar todas las ediciones como menores por defecto',
-'tog-previewontop' => 'Mostrar la previsualización antes de la caja de edición en lugar de después',
-'tog-previewonfirst' => 'Mostrar previsualización al comenzar a editar',
-'tog-nocache' => 'Deshabilitar la caché de páginas',
-'tog-enotifwatchlistpages' => 'Envíame un correo cuando haya cambios en una página vigilada',
-'tog-enotifusertalkpages' => 'Notifícame cuando cambia mi página de discusión de usuario',
-'tog-enotifminoredits' => 'Notifícame también los cambios menores de página',
-'tog-enotifrevealaddr' => 'Mostrar mi dirección de correo electrónico en los correos de notificación',
+'tog-minordefault' => 'Marcar todas las ediciones como menores de manera predeterminada',
+'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-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' => 'Vista previa de firma existente:',
'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
@@ -468,37 +473,27 @@ $messages = array(
'qbedit' => 'Editar',
'qbpageoptions' => 'Opciones de página',
'qbpageinfo' => 'Información de página',
-'qbmyoptions' => 'Mis opciones',
+'qbmyoptions' => 'Mis páginas',
'qbspecialpages' => 'Páginas especiales',
'faq' => 'Preguntas más frecuentes',
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Añadir tema',
-'vector-action-delete' => 'Borrar',
-'vector-action-move' => 'Mover',
-'vector-action-protect' => 'Proteger',
-'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Desproteger',
-'vector-namespace-category' => 'Categoría',
-'vector-namespace-help' => 'Página de ayuda',
-'vector-namespace-image' => 'Archivo',
-'vector-namespace-main' => 'Página',
-'vector-namespace-media' => 'Página de multimedia',
-'vector-namespace-mediawiki' => 'Mensaje',
-'vector-namespace-project' => 'Página de proyecto',
-'vector-namespace-special' => 'Página especial',
-'vector-namespace-talk' => 'Discusión',
-'vector-namespace-template' => 'Plantilla',
-'vector-namespace-user' => 'Página de usuario',
-'vector-view-create' => 'Crear',
-'vector-view-edit' => 'Editar',
-'vector-view-history' => 'Ver historial',
-'vector-view-view' => 'Leer',
-'vector-view-viewsource' => 'Ver fuente',
-'actions' => 'Acciones',
-'namespaces' => 'Espacios de nombres',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Añadir tema',
+'vector-action-delete' => 'Borrar',
+'vector-action-move' => 'Mover',
+'vector-action-protect' => 'Proteger',
+'vector-action-undelete' => 'Restaurar',
+'vector-action-unprotect' => 'Desproteger',
+'vector-simplesearch-preference' => 'Activar sugerencias de búsqueda mejoradas (piel Vector solamente)',
+'vector-view-create' => 'Crear',
+'vector-view-edit' => 'Editar',
+'vector-view-history' => 'Ver historial',
+'vector-view-view' => 'Leer',
+'vector-view-viewsource' => 'Ver fuente',
+'actions' => 'Acciones',
+'namespaces' => 'Espacios de nombres',
+'variants' => 'Variantes',
'errorpagetitle' => 'Error',
'returnto' => 'Volver a $1.',
@@ -530,7 +525,7 @@ $messages = array(
'newpage' => 'Página nueva',
'talkpage' => 'Discutir esta página',
'talkpagelinktext' => 'Discusión',
-'specialpage' => 'Página Especial',
+'specialpage' => 'Página especial',
'personaltools' => 'Herramientas personales',
'postcomment' => 'Nueva sección',
'articlepage' => 'Ver artículo',
@@ -559,6 +554,9 @@ Hay demasiados usuarios que están tratando de ver esta página.
Espera un momento antes de tratar de acceder nuevamente a esta página.
$1',
+'pool-timeout' => 'Tiempo limite agotado para el bloqueo',
+'pool-queuefull' => 'La cola de trabajo está llena',
+'pool-errorunknown' => 'Error desconocido',
# 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' => 'Acerca de {{SITENAME}}',
@@ -573,7 +571,7 @@ $1',
'edithelppage' => 'Help:Cómo se edita una página',
'helppage' => 'Help:Ayuda',
'mainpage' => 'Página principal',
-'mainpage-description' => 'Página Principal',
+'mainpage-description' => 'Página principal',
'policy-url' => 'Project:Políticas',
'portal' => 'Portal de la comunidad',
'portal-url' => 'Project:Portal de la comunidad',
@@ -591,7 +589,7 @@ $1',
'retrievedfrom' => 'Obtenido de «$1»',
'youhavenewmessages' => 'Tienes $1 ($2).',
'newmessageslink' => 'mensajes nuevos',
-'newmessagesdifflink' => 'ultima modificación',
+'newmessagesdifflink' => 'última modificación',
'youhavenewmessagesmulti' => 'Tienes nuevos mensajes en $1',
'editsection' => 'editar',
'editold' => 'editar',
@@ -723,7 +721,8 @@ No olvides personalizar [[Special:Preferences|tus preferencias]].',
'yourname' => 'Nombre de usuario:',
'yourpassword' => 'Contraseña:',
'yourpasswordagain' => 'Confirma la contraseña:',
-'remembermypassword' => 'Quiero que me recuerden entre sesiones.',
+'remembermypassword' => 'Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})',
+'securelogin-stick-https' => 'Permanecer conectado a HTTPS después de iniciar sesión',
'yourdomainname' => 'Dominio',
'externaldberror' => 'Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.',
'login' => 'Entrar',
@@ -737,9 +736,10 @@ No olvides personalizar [[Special:Preferences|tus preferencias]].',
'nologin' => "¿No tienes una cuenta? '''$1'''.",
'nologinlink' => 'Crear una cuenta',
'createaccount' => 'Cree una nueva cuenta',
-'gotaccount' => '¿Ya tiene una cuenta de usuario? $1.',
+'gotaccount' => '¿Ya tienes una cuenta? $1.',
'gotaccountlink' => 'Entrar',
'createaccountmail' => 'por correo electrónico',
+'createaccountreason' => 'Razón:',
'badretype' => 'Las contraseñas no coinciden.',
'userexists' => 'El nombre indicado ya está en uso.
Por favor, indica un nombre diferente.',
@@ -761,6 +761,7 @@ Revisa la ortografía, o [[Special:UserLogin/signup|crea una nueva cuenta]].',
Por favor, inténtalo de nuevo.',
'passwordtooshort' => 'Las contraseñas deben tener al menos {{PLURAL:$1|1 caracter|$1 caracteres}}.',
'password-name-match' => 'Tu contraseña debe ser diferente de tu nombre de usuario.',
+'password-login-forbidden' => 'El uso de este nombre de usuario y contraseña han sido prohibidos.',
'mailmypassword' => 'Enviar una nueva contraseña por correo electrónico',
'passwordremindertitle' => 'Recordatorio de contraseña de {{SITENAME}}',
'passwordremindertext' => 'Alguien (probablemente tú, desde la dirección IP $1) solicitó que te enviáramos una nueva contraseña para tu cuenta en {{SITENAME}} ($4).
@@ -799,6 +800,9 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
'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é.',
+# E-mail sending
+'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP',
+
# Password reset dialog
'resetpass' => 'Cambiar la contraseña',
'resetpass_announce' => 'Has iniciado sesión con una contraseña temporal que fue enviada por correo electrónico.
@@ -825,7 +829,7 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
'italic_tip' => 'Texto en cursiva',
'link_sample' => 'Título del enlace',
'link_tip' => 'Enlace interno',
-'extlink_sample' => 'http://www.example.com Título del enlace',
+'extlink_sample' => 'http://www.ejemplo.com Título del enlace',
'extlink_tip' => 'Enlace externo (recuerda añadir el prefijo http://)',
'headline_sample' => 'Texto de titular',
'headline_tip' => 'Titular de nivel 2',
@@ -852,9 +856,10 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
'showdiff' => 'Mostrar cambios',
'anoneditwarning' => "'''Aviso:''' No has iniciado sesión con una cuenta de usuario.
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.',
-'missingcommentheader' => "'''Atención:''' No has escrito un título para este comentario. Si haces clic nuevamente en Grabar tu edición se grabará sin él.",
+'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:',
'blockedtitle' => 'El usuario está bloqueado',
@@ -931,7 +936,11 @@ La última entrada del registro de bloqueos es provista debajo para mayor refere
'''¡Aún no se ha guardado!'''",
'userjspreview' => "'''¡Recuerda que solo estás previsualizando tu JavaScript de usuario.'''
'''¡Aún no se ha guardado!'''",
-'userinvalidcssjstitle' => "'''Aviso:''' No existe la máscara \"\$1\". Recuerda que las páginas personalizadas ''.css'' y ''.js'' tienen un título en minúsculas. Por ejemplo, {{ns:user}}:Ejemplo/monobook.css en vez de {{ns:user}}:Ejemplo/Monobook.css.",
+'sitecsspreview' => "'''Recuerda que sólo estás previsualizando este CSS'''
+'''¡Aún no se ha guardado!'''",
+'sitejspreview' => "'''Recuerda que sólo estás previsualizando este código JavaScript.'''
+'''¡Aún no se ha guardado!'''",
+'userinvalidcssjstitle' => "'''Aviso:''' No existe la skin «$1». Recuerda que las páginas personalizadas ''.css'' y ''.js'' tienen un título en minúsculas. Por ejemplo, {{ns:user}}:Ejemplo/vector.css en vez de {{ns:user}}:Ejemplo/Vector.css.",
'updated' => '(Actualizado)',
'note' => "'''Nota:'''",
'previewnote' => "'''¡Recuerda que esto es solo una previsualización.'''
@@ -961,13 +970,11 @@ Si quieres grabar tus cambios, has de trasladarlos al área superior.
'storedversion' => 'Versión almacenada',
'nonunicodebrowser' => "'''Atención: Tu navegador no cumple la norma Unicode. Se ha activado un sistema de edición alternativo que le permitirá editar artículos con seguridad: los caracteres no ASCII aparecerán en la caja de edición como códigos hexadecimales.'''",
'editingold' => "'''Aviso: Estás editando una versión antigua de esta página.'''
-Si la guardas, los cambios hechos desde esa revisión se perderán.",
+Si la guardas, se perderán los cambios realizados desde esta revisión.",
'yourdiff' => 'Diferencias',
'copyrightwarning' => "Por favor observa que todas las contribuciones a {{SITENAME}} se consideran hechas públicas bajo la $2 (véase $1 para más detalles). Si no deseas la modificación y distribución libre de tu obra, entonces no la pongas aquí.<br />También nos aseguras que tú escribiste esto y te pertenecen de los derechos de autor, o lo copiaste desde el dominio público u otra fuente libre. '''¡No uses escritos con copyright sin permiso!'''",
'copyrightwarning2' => "Por favor, ten en cuenta que todas las contribuciones a {{SITENAME}} pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, entonces no las pongas aquí.<br />También nos aseguras que tú escribiste esto y te pertenecen de los derechos de autor, o lo copiaste desde el dominio público u otra fuente libre. (véase $1 para más detalles).
'''¡No uses escritos con copyright sin permiso!'''",
-'longpagewarning' => "'''Atención: Esta página tiene un tamaño de $1 kilobytes; algunos navegadores pueden tener problemas editando páginas de 32 kB o más.
-Por favor considere la posibilidad de dividir esta página en secciones más pequeñas.'''",
'longpageerror' => "'''Error: El texto que has enviado ocupa $1 kilobytes, que excede el máximo de $2 kilobytes. No se puede guardar.'''",
'readonlywarning' => "'''Aviso: La base de datos ha sido bloqueada por cuestiones de mantenimiento, así que no podrás guardar tus modificaciones en este momento.
Puedes copiar y pegar el texto en un archivo y guardarlo para más tarde.'''
@@ -1146,6 +1153,8 @@ $1",
'logdelete-failure' => "'''La visibilidad del registro no pudo ser ajustada:'''
$1",
'revdel-restore' => 'cambiar visibilidad',
+'revdel-restore-deleted' => 'revisiones borradas',
+'revdel-restore-visible' => 'revisiones visibles',
'pagehist' => 'Historial de la página',
'deletedhist' => 'Historial borrado',
'revdelete-content' => 'contenido',
@@ -1215,11 +1224,13 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
# Diffs
'history-title' => 'Historial de revisiones para «$1»',
'difference' => '(Diferencias entre revisiones)',
+'difference-multipage' => '(Diferencia entre las páginas)',
'lineno' => 'Línea $1:',
'compareselectedversions' => 'Comparar versiones seleccionadas',
'showhideselectedversions' => 'Mostrar/ocultar versiones seleccionadas',
'editundo' => 'deshacer',
-'diff-multi' => '({{PLURAL:$1|Una edición intermedia no se muestra|$1 ediciones intermedias no se muestran}}.)',
+'diff-multi' => '(No se {{PLURAL:$1|muestra una edición intermedia realizada|muestran $1 ediciones intermedias realizadas}} por {{PLURAL:$2|un usuario|$2 usuarios}})',
+'diff-multi-manyusers' => '(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})',
# Search results
'searchresults' => 'Resultados de la búsqueda',
@@ -1254,6 +1265,7 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
'searchprofile-everything-tooltip' => 'Buscar en todo el contenido (incluyendo páginas de discusión)',
'searchprofile-advanced-tooltip' => 'Buscar en espacios de nombres personalizados',
'search-result-size' => '$1 ({{PLURAL:$2|1 palabra|$2 palabras}})',
+'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 fichero|$3 ficheros}})',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(redirige desde $1)',
'search-section' => '(sección $1)',
@@ -1330,6 +1342,7 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
'contextlines' => 'Número de líneas de contexto por resultado',
'contextchars' => 'Caracteres de contexto por línea',
'stub-threshold' => 'Límite para formato de <a href="#" class="stub">enlace a esbozo</a> (bytes):',
+'stub-threshold-disabled' => 'Desactivado',
'recentchangesdays' => 'Días a mostrar en cambios recientes:',
'recentchangesdays-max' => '(máximo {{PLURAL:$1|un día|$1 días}})',
'recentchangescount' => 'Número de ediciones a mostrar de manera predeterminada:',
@@ -1362,6 +1375,7 @@ Cualquiera que conozca la clave en este campo será capaz de leer tu lista de se
'prefs-files' => 'Archivos',
'prefs-custom-css' => 'CSS personalizado',
'prefs-custom-js' => 'JavaScript personalizado',
+'prefs-common-css-js' => 'CSS/JS compartido para todas las skins:',
'prefs-reset-intro' => 'Puedes usar esta página para restaurar tus preferencias a las predeterminadas del sitio.
Esto no se puede deshacer.',
'prefs-emailconfirm-label' => 'Confirmación de correo electrónico:',
@@ -1398,9 +1412,15 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'prefs-advancedrendering' => 'Opciones avanzadas',
'prefs-advancedsearchoptions' => 'Opciones avanzadas',
'prefs-advancedwatchlist' => 'Opciones avanzadas',
-'prefs-display' => 'Opciones de mostrado',
+'prefs-displayrc' => 'Opciones de mostrado',
+'prefs-displaysearchoptions' => 'Opciones de visualización',
+'prefs-displaywatchlist' => 'Opciones de visualización',
'prefs-diffs' => 'Diferencias',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'La dirección de correo electrónico parece ser válida',
+'email-address-validity-invalid' => 'Introduce una dirección de correo válida',
+
# User rights
'userrights' => 'Configuración de permisos de usuarios',
'userrights-lookup-user' => 'Configurar grupos de usuarios',
@@ -1430,7 +1450,7 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'group-bot' => 'Bots',
'group-sysop' => 'Administradores',
'group-bureaucrat' => 'Burócratas',
-'group-suppress' => 'Supresores',
+'group-suppress' => 'Supresores de ediciones',
'group-all' => '(todos)',
'group-user-member' => 'usuario',
@@ -1438,7 +1458,7 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'group-bot-member' => 'bot',
'group-sysop-member' => 'administrador',
'group-bureaucrat-member' => 'burócrata',
-'group-suppress-member' => 'supresor',
+'group-suppress-member' => 'supresor de ediciones',
'grouppage-user' => '{{ns:project}}:Usuarios',
'grouppage-autoconfirmed' => '{{ns:project}}:Usuarios autoconfirmados',
@@ -1484,13 +1504,14 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'right-hideuser' => 'Bloquear un nombre de usuario, haciéndolo invisible',
'right-ipblock-exempt' => 'Pasar por encima de bloqueos de IPs, auto-bloqueos y bloqueos de rangos.',
'right-proxyunbannable' => 'Pasar por encima de bloqueos automáticos de proxies',
+'right-unblockself' => 'Desbloquearse',
'right-protect' => 'Cambiar niveles de protección y editar páginas protegidas',
'right-editprotected' => 'Editar páginas protegidas (sin la protección «en cascada»)',
'right-editinterface' => 'Editar la interfaz de usuario',
'right-editusercssjs' => 'Editar las páginas de CSS y JS de otros usuarios',
'right-editusercss' => 'Editar las páginas de CSS de otros usuarios',
'right-edituserjs' => 'Editar las páginas de JS de otros usuarios',
-'right-rollback' => 'Revertir rápidamente las ediciones del último usuario que modificó una página particular',
+'right-rollback' => 'Revertir rápidamente las ediciones del último usuario que modificó una página en particular',
'right-markbotedits' => 'Marcar ediciones deshechas como ediciones de un bot',
'right-noratelimit' => 'No afectado por límites de frecuencia',
'right-import' => 'Importar páginas desde otras wikis',
@@ -1506,7 +1527,6 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'right-siteadmin' => 'Bloquear y desbloquear la base de datos',
'right-reset-passwords' => 'Reajustar la contraseña de otros usuarios',
'right-override-export-depth' => 'Exporta páginas incluyendo aquellas enlazadas hasta una profundidad de 5',
-'right-versiondetail' => 'Mostrar información ampliada de la versión del software',
'right-sendemail' => 'Enviar un correo electrónico a otros usuarios',
# User rights log
@@ -1557,14 +1577,9 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'recentchanges-legend' => 'Opciones sobre cambios recientes',
'recentchangestext' => 'Sigue los cambios más recientes de la wiki en esta página.',
'recentchanges-feed-description' => 'Seguir los cambios más recientes en el wiki en este feed.',
-'recentchanges-label-legend' => 'Leyenda: $1.',
-'recentchanges-legend-newpage' => '$1 - página nueva',
'recentchanges-label-newpage' => 'Esta edición creó una nueva página',
-'recentchanges-legend-minor' => '$1 - edición menor',
'recentchanges-label-minor' => 'Esta es una edición menor',
-'recentchanges-legend-bot' => '$1 - edición de bot',
'recentchanges-label-bot' => 'Esta edición fue realizada por un robot',
-'recentchanges-legend-unpatrolled' => '$1 - edición sin patrullar',
'recentchanges-label-unpatrolled' => 'Esta edición todavía no se ha patrullado',
'rcnote' => "Debajo {{PLURAL:$1|hay '''1''' cambio efectuado|están los últimos '''$1''' cambios efectuados}} en {{PLURAL:$2|el último día|los últimos '''$2''' días}}, hasta el $4, $5.",
'rcnotefrom' => 'A continuación se muestran los cambios desde <b>$2</b> (hasta <b>$1</b>).',
@@ -1610,6 +1625,9 @@ También puede permitir a otros usuarios que te contacten a través de tu págin
'upload_directory_missing' => 'El directorio de subida de archivos ($1) no existe, y no puede ser creado por el servidor.',
'upload_directory_read_only' => 'El servidor web no puede escribir en el directorio de subida de archivos ($1).',
'uploaderror' => 'Error al intentar subir archivo',
+'upload-recreate-warning' => "'''Aviso: Un archivo con ese nombre ha sido eliminado o renombrado.'''
+
+A continuación se muestra el registro de borrados y traslados de esta página:",
'uploadtext' => "Utiliza el siguiente formulario para subir archivos.
Para ver o buscar archivos subidos con anterioridad, ve a la [[Special:FileList|lista de archivos subidos]].
Los archivos subidos quedarán registrados además en el [[Special:Log/upload|registro de archivos subidos]] y los borrados en el [[Special:Log/delete|registro de borrados]].
@@ -1645,6 +1663,17 @@ Mira la [[Special:NewFiles|galería de archivos nuevos]] para una descripción v
'filetype-banned-type' => "'''«.$1»''' no está entre los tipos de fichero permitidos.
{{PLURAL:$3|El único tipo permitido es|Los tipos permitidos son}} $2.",
'filetype-missing' => 'El archivo no tiene extensión (como «.jpg»).',
+'empty-file' => 'El archivo que enviaste estaba vacío.',
+'file-too-large' => 'El archivo que enviste era demasiado grande.',
+'filename-tooshort' => 'El nombre de archivo es demasiado corto.',
+'filetype-banned' => 'El tipo de archivo está prohibido.',
+'verification-error' => 'Este archivo no pasó la verificación de archivos.',
+'hookaborted' => 'La modificación que ha intentado realizar fue cancelada por un adicional de extensión.',
+'illegal-filename' => 'El nombre de archivo no está permitido.',
+'overwrite' => 'Sobrescribir un archivo existente no está permitido.',
+'unknown-error' => 'Ocurrió un error desconocido.',
+'tmp-create-error' => 'No se pudo crear archivo temporal.',
+'tmp-write-error' => 'Error al escribir archivo temporal.',
'large-file' => 'Se recomienda que los archivos no sean mayores de $1; este archivo ocupa $2.',
'largefileserver' => 'El tamaño de este archivo es mayor del que este servidor admite por configuración.',
'emptyfile' => 'El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.',
@@ -1668,13 +1697,14 @@ Si tiene esta imagen a toda resolución súbala, si no, por favor cambie el nomb
Si todavía quiere subir su archivo, por favor, regrese a la página anterior y use otro nombre. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Este archivo es un duplicado {{PLURAL:$1|del siguiente|de los siguientes}}:',
'file-deleted-duplicate' => 'Un archivo idéntico a este ([[:$1]]) ha sido borrado con anterioridad. Debes comprobar el historial de borrado del archivo ante de volver a subirlo.',
-'successfulupload' => 'Subida con éxito',
'uploadwarning' => 'Advertencia de subida de archivo',
'uploadwarning-text' => 'Por favor, modifique la descripción del archivo abajo indicada e inténtelo de nuevo.',
'savefile' => 'Guardar archivo',
'uploadedimage' => 'subió «[[$1]]»',
'overwroteimage' => 'subió una nueva versión de «[[$1]]»',
'uploaddisabled' => 'Subida de archivos deshabilitada',
+'copyuploaddisabled' => 'Carga por URL deshabilitada.',
+'uploadfromurl-queued' => 'Tu carga ha sido enviada a la cola.',
'uploaddisabledtext' => 'No es posible subir archivos.',
'php-uploaddisabledtext' => 'La subida de archivos está deshabilitada en PHP. Por favor compruebe <code>file_uploads</code> en php.ini.',
'uploadscripted' => 'Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.',
@@ -1696,6 +1726,14 @@ A continuación se muestra el registro de borrado de este archivo:",
'filename-bad-prefix' => "El nombre del archivo que estás subiendo comienza por '''«$1»''', un nombre nada descriptivo de su contenido. Es un típico nombre de los que asignan automáticamente las cámaras digitales.
Por favor, elige un nombre más descriptivo.",
+'upload-success-subj' => 'Subida con éxito',
+'upload-success-msg' => 'Tu carga de [$2] fue existosa. Está disponible aquí: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema en la carga',
+'upload-failure-msg' => 'Hubo un problema durante la carga desde [$2]:
+
+$1',
+'upload-warning-subj' => 'Alerta de carga',
+'upload-warning-msg' => 'Hubo un problema con tu carga de [$2]. Puedes regresar al [[Special:Upload/stash/$1|formulario de carga]] para corregir este problema.',
'upload-proto-error' => 'Protocolo incorrecto',
'upload-proto-error-text' => 'Para subir archivos desde otra página la URL debe comenzar por <code>http://</code> o <code>ftp://</code>.',
@@ -1708,22 +1746,23 @@ Por favor, elige un nombre más descriptivo.",
'upload-http-error' => 'Ha ocurrido un error HTTP: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'Acceso denegado',
-'img-auth-nopathinfo' => 'Falta PATH_INFO.
+'img-auth-accessdenied' => 'Acceso denegado',
+'img-auth-nopathinfo' => 'Falta PATH_INFO.
Tu servidor no está configurado para pasar esta información.
Puede que este basado en CGI y no sea compatible con img_auth.
Véase http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => 'Ruta solicitad no esá en el directorio de cargas configurado',
-'img-auth-badtitle' => 'Incapaz de construir un título válido de «$1».',
-'img-auth-nologinnWL' => 'No has iniciado sesión y «$1» no está en la lista blanca.',
-'img-auth-nofile' => 'El archivo «$1» no existe.',
-'img-auth-isdir' => 'Estás tratando de acceder a un directorio «$1».
+'img-auth-notindir' => 'Ruta solicitad no esá en el directorio de cargas configurado',
+'img-auth-badtitle' => 'Incapaz de construir un título válido de «$1».',
+'img-auth-nologinnWL' => 'No has iniciado sesión y «$1» no está en la lista blanca.',
+'img-auth-nofile' => 'El archivo «$1» no existe.',
+'img-auth-isdir' => 'Estás tratando de acceder a un directorio «$1».
Solo se permite el acceso a los archivos.',
-'img-auth-streaming' => 'Streaming «$1».',
-'img-auth-public' => 'La función de img_auth.php es mostrar archivos desde una wiki privada.
+'img-auth-streaming' => 'Streaming «$1».',
+'img-auth-public' => 'La función de img_auth.php es mostrar archivos desde una wiki privada.
Esta wiki está configurada como pública.
Para óptima seguridad, img_auth.php está desactivado.',
-'img-auth-noread' => 'El usuario no tiene acceso para leer «$1».',
+'img-auth-noread' => 'El usuario no tiene acceso para leer «$1».',
+'img-auth-bad-query-string' => 'La dirección URL tiene una cadena de consulta no válida.',
# HTTP errors
'http-invalid-url' => 'URL inválida: $1',
@@ -1755,6 +1794,7 @@ Al hacer clic en el encabezado de una columna se cambia el orden.',
'listfiles_search_for' => 'Buscar por nombre de imagen:',
'imgfile' => 'archivo',
'listfiles' => 'Lista de archivos',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Fecha',
'listfiles_name' => 'Nombre',
'listfiles_user' => 'Usuario',
@@ -1870,8 +1910,8 @@ Entrada: contenttype/subtype, p. ej. <tt>image/jpeg</tt>.',
'statistics-edits' => 'Ediciones en páginas desde que {{SITENAME}} fue instalado',
'statistics-edits-average' => 'Media de ediciones por página',
'statistics-views-total' => 'Visitas totales',
+'statistics-views-total-desc' => 'No se incluyen accesos a páginas no existentes ni páginas especiales',
'statistics-views-peredit' => 'Visitas por edición',
-'statistics-jobqueue' => 'Longitud de la [http://www.mediawiki.org/wiki/Manual:Job_queue cola de trabajo]',
'statistics-users' => '[[Special:ListUsers|Usuarios]] registrados',
'statistics-users-active' => 'Usuarios activos',
'statistics-users-active-desc' => 'Usuarios que han ejecutado una acción en {{PLURAL:$1|el último día|los últimos $1 días}}',
@@ -1885,8 +1925,8 @@ Una página es considerada página de desambiguación si utiliza la plantilla qu
'doubleredirects' => 'Redirecciones dobles',
'doubleredirectstext' => 'Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.
-Cada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo "real" al que la primera redirección debería apuntar.
-Las entradas <s>tachadas</s> han sido resueltas.',
+Cada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.
+Las entradas <del>tachadas</del> han sido resueltas.',
'double-redirect-fixed-move' => '[[$1]] ha sido trasladado, ahora es una redirección a [[$2]]',
'double-redirect-fixer' => 'Corrector de redirecciones',
@@ -1909,6 +1949,8 @@ Las entradas <s>tachadas</s> han sido resueltas.',
'nmembers' => '$1 {{PLURAL:$1|artículo|artículos}}',
'nrevisions' => '$1 {{PLURAL:$1|revisión|revisiones}}',
'nviews' => '$1 {{PLURAL:$1|vista|vistas}}',
+'nimagelinks' => 'Usado en {{PLURAL:$1|una página|$1 páginas}}',
+'ntransclusions' => 'usado en {{PLURAL:$1|una página|$1 páginas}}',
'specialpage-empty' => 'Esta página está vacía.',
'lonelypages' => 'Páginas huérfanas',
'lonelypagestext' => 'Las siguientes páginas no están enlazadas ni transcluídas en otras páginas de {{SITENAME}}.',
@@ -1962,7 +2004,7 @@ Por favor note que otros sitios web pueden vincular a un archivo con un URL dire
'nopagetext' => 'La página destino que ha especificado no existe.',
'pager-newer-n' => '{{PLURAL:$1|1 siguiente|$1 siguientes}}',
'pager-older-n' => '{{PLURAL:$1|1 anterior|$1 anteriores}}',
-'suppress' => 'Supervisor',
+'suppress' => 'Supresor de ediciones',
# Book sources
'booksources' => 'Fuentes de libros',
@@ -2065,34 +2107,40 @@ Puede haber información adicional sobre privilegios individuales en [[{{MediaWi
'listgrouprights-removegroup-self-all' => 'Eliminar todos los grupos de tu propia cuenta',
# E-mail user
-'mailnologin' => 'Ninguna dirección de envio',
-'mailnologintext' => 'Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.',
-'emailuser' => 'Enviar correo electrónico a este usuario',
-'emailpage' => 'Correo electrónico a usuario',
-'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a este usuario.
+'mailnologin' => 'Ninguna dirección de envio',
+'mailnologintext' => 'Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.',
+'emailuser' => 'Enviar correo electrónico a este usuario',
+'emailpage' => 'Correo electrónico a usuario',
+'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a este usuario.
La dirección electrónica que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el remitente para que el destinatario pueda responderte.',
-'usermailererror' => 'El sistema de correo devolvió un error:',
-'defemailsubject' => 'Correo de {{SITENAME}}',
-'noemailtitle' => 'No hay dirección de correo electrónico',
-'noemailtext' => 'Este usuario no ha especificado una dirección de correo electrónico válida.',
-'nowikiemailtitle' => 'correos electrónicos no permitidos',
-'nowikiemailtext' => 'Este usuario ha elegido no recibir correos electrónicos de otros usuarios.',
-'email-legend' => 'Enviar un correo electrónico a otro usuario de {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'Para:',
-'emailsubject' => 'Asunto:',
-'emailmessage' => 'Mensaje:',
-'emailsend' => 'Enviar',
-'emailccme' => 'Enviarme una copia de mi mensaje.',
-'emailccsubject' => 'Copia de tu mensaje a $1: $2',
-'emailsent' => 'Correo electrónico enviado',
-'emailsenttext' => 'Se ha enviado tu mensaje de correo electrónico.',
-'emailuserfooter' => 'Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar correo electrónico a este usuario» en {{SITENAME}}.',
+'usermailererror' => 'El sistema de correo devolvió un error:',
+'defemailsubject' => 'Correo de {{SITENAME}}',
+'usermaildisabled' => 'Correo electrónico del usuario deshabilitado',
+'usermaildisabledtext' => 'No puedes enviar correos electrónicos a otros usuarios en esta wiki',
+'noemailtitle' => 'No hay dirección de correo electrónico',
+'noemailtext' => 'Este usuario no ha especificado una dirección de correo electrónico válida.',
+'nowikiemailtitle' => 'correos electrónicos no permitidos',
+'nowikiemailtext' => 'Este usuario ha elegido no recibir correos electrónicos de otros usuarios.',
+'email-legend' => 'Enviar un correo electrónico a otro usuario de {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'Para:',
+'emailsubject' => 'Asunto:',
+'emailmessage' => 'Mensaje:',
+'emailsend' => 'Enviar',
+'emailccme' => 'Enviarme una copia de mi mensaje.',
+'emailccsubject' => 'Copia de tu mensaje a $1: $2',
+'emailsent' => 'Correo electrónico enviado',
+'emailsenttext' => 'Se ha enviado tu mensaje de correo electrónico.',
+'emailuserfooter' => 'Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar correo electrónico a este usuario» en {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Dejando un mensaje de sistema.',
+'usermessage-editor' => 'Mensajero del sistema',
# Watchlist
'watchlist' => 'Lista de seguimiento',
'mywatchlist' => 'Lista de seguimiento',
-'watchlistfor' => "(para '''$1''')",
+'watchlistfor2' => 'Para $1 $2',
'nowatchlist' => 'No tienes ninguna página en tu lista de seguimiento.',
'watchlistanontext' => 'Para ver o editar las entradas de tu lista de seguimiento es necesario $1.',
'watchnologin' => 'No has iniciado sesión',
@@ -2193,7 +2241,7 @@ Véase $2 para un registro de los borrados recientes.',
** Vandalismo',
'delete-edit-reasonlist' => 'Editar razones de borrado',
'delete-toobig' => 'Esta página tiene un historial muy grande, con más de $1 {{PLURAL:$1|revisión|revisiones}}. Borrar este tipo de páginas ha sido restringido para prevenir posibles problemas en {{SITENAME}}.',
-'delete-warning-toobig' => 'Esta página tiene un historial de más de {{PLURAL:$1|revisión|revisiones}}. Eliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}. Ten cuidado al borrar.',
+'delete-warning-toobig' => 'Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}. Eliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}. Ten cuidado al borrar.',
# Rollback
'rollback' => 'Revertir ediciones',
@@ -2210,7 +2258,10 @@ La última edición fue hecha por [[User:$3|$3]] ([[User talk:$3|discusión]]{{i
'revertpage' => 'Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]',
'revertpage-nouser' => 'Revertidas ediciones hechas por (nombre de usuario eliminado) a la última revisión hecha por [[User:$1|$1]]',
'rollback-success' => 'Revertidas las ediciones de $1; recuperada la última versión de $2.',
-'sessionfailure' => 'Parece que hay un problema con tu sesión;
+
+# Edit tokens
+'sessionfailure-title' => 'Error de sesión',
+'sessionfailure' => 'Parece que hay un problema con tu sesión;
esta acción ha sido cancelada como medida de precaución contra secuestros de sesión.
Por favor, pulsa «Atrás», recarga la página de la que viniste e inténtalo de nuevo.',
@@ -2339,18 +2390,22 @@ $1',
'month' => 'Desde el mes (y anterior):',
'year' => 'Desde el año (y anterior):',
-'sp-contributions-newbies' => 'Mostrar solo las contribuciones de usuarios nuevos',
-'sp-contributions-newbies-sub' => 'Para cuentas nuevas',
-'sp-contributions-newbies-title' => 'Contribuciones de usuarios nuevos',
-'sp-contributions-blocklog' => 'registro de bloqueos',
-'sp-contributions-deleted' => 'contribuciones de usuario borradas',
-'sp-contributions-logs' => 'registros',
-'sp-contributions-talk' => 'discusión',
-'sp-contributions-userrights' => 'administración de derechos de usuarios',
-'sp-contributions-blocked-notice' => 'Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:',
-'sp-contributions-search' => 'Buscar contribuciones',
-'sp-contributions-username' => 'Dirección IP o nombre de usuario:',
-'sp-contributions-submit' => 'Buscar',
+'sp-contributions-newbies' => 'Mostrar solo las contribuciones de usuarios nuevos',
+'sp-contributions-newbies-sub' => 'Para cuentas nuevas',
+'sp-contributions-newbies-title' => 'Contribuciones de usuarios nuevos',
+'sp-contributions-blocklog' => 'registro de bloqueos',
+'sp-contributions-deleted' => 'contribuciones de usuario borradas',
+'sp-contributions-uploads' => 'subidas',
+'sp-contributions-logs' => 'registros',
+'sp-contributions-talk' => 'discusión',
+'sp-contributions-userrights' => 'administración de derechos de usuarios',
+'sp-contributions-blocked-notice' => 'Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:',
+'sp-contributions-blocked-notice-anon' => 'Esta dirección IP se encuentra actualmente bloqueada.
+A continuación se muestra la última entrada del registro de bloqueos para mayor referencia.',
+'sp-contributions-search' => 'Buscar contribuciones',
+'sp-contributions-username' => 'Dirección IP o nombre de usuario:',
+'sp-contributions-toponly' => 'Mostrar solamente revisiones top',
+'sp-contributions-submit' => 'Buscar',
# What links here
'whatlinkshere' => 'Lo que enlaza aquí',
@@ -2411,7 +2466,6 @@ Véase la [[Special:IPBlockList|lista de bloqueos]] para revisarlo.',
'ipb-edit-dropdown' => 'Editar motivo del bloqueo',
'ipb-unblock-addr' => 'Desbloquear $1',
'ipb-unblock' => 'Desbloquear un usuario o una IP',
-'ipb-blocklist-addr' => 'Bloqueos vigentes de $1',
'ipb-blocklist' => 'Ver bloqueos vigentes',
'ipb-blocklist-contribs' => 'Contribuciones de $1',
'unblockip' => 'Desbloquear usuario',
@@ -2481,6 +2535,8 @@ Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado
'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta',
'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloqueado.',
'cant-see-hidden-user' => 'El usuario que está intentando bloquear ya ha sido bloqueado y oculto. Puesto que usted no tiene el derecho hideuser, usted no puede ver o editar los bloqueos del usuario.',
+'ipbblocked' => 'No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado',
+'ipbnounblockself' => 'No puedes desbloquearte',
# Developer tools
'lockdb' => 'Bloquear la base de datos',
@@ -2515,6 +2571,17 @@ Esto significa que podrás renombrar una página a su título original si has co
'''¡Aviso!'''
Este puede ser un cambio drástico e inesperado para una página popular;
por favor, asegúrate de entender las consecuencias del procedimiento antes de seguir adelante.",
+'movepagetext-noredirectfixer' => "Usando el siguiente formulario se renombrará una página, moviendo todo su historial al nuevo nombre.
+El título anterior se convertirá en una redirección al nuevo título.
+Asegúrate de no dejar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].
+Tú eres responsable de hacer que los enlaces sigan apuntando adonde se supone que deberían hacerlo.
+
+Recuerda que la página '''no''' será renombrada si ya existe una página con el nuevo título, a no ser que sea una página vacía o una redirección sin historial.
+Esto significa que podrás renombrar una página a su título original si has cometido un error, pero que no podrás sobrescribir una página existente.
+
+'''¡Aviso!'''
+Este puede ser un cambio drástico e inesperado para una página popular;
+por favor, asegúrate de entender las consecuencias del procedimiento antes de seguir adelante.",
'movepagetalktext' => "La página de discusión asociada, si existe, será renombrada automáticamente '''a menos que:'''
*Esté moviendo la página entre espacios de nombres diferentes,
*Una página de discusión no vacía ya exista con el nombre nuevo, o
@@ -2571,6 +2638,7 @@ La página de destino ("[[:$1]]") ya existe. ¿Quiere borrarla para permitir al
'immobile-source-page' => 'Esta página no se puede renombrar.',
'immobile-target-page' => 'No se puede trasladar a tal título.',
'imagenocrossnamespace' => 'No se puede trasladar el fichero a otro espacio de nombres',
+'nonfile-cannot-move-to-file' => 'No es posible mover un no-archivo al espacio de nombres de archivo',
'imagetypemismatch' => 'La nueva extensión de archivo no corresponde con su tipo',
'imageinvalidfilename' => 'El nombre del fichero de destino no es válido',
'fix-double-redirects' => 'Actualizar las redirecciones que apuntan al título original',
@@ -2649,6 +2717,7 @@ Todas las importaciones transwiki se registran en el [[Special:Log/import|regist
'importstart' => 'Importando páginas...',
'import-revision-count' => '$1 {{PLURAL:$1|revisión|revisiones}}',
'importnopages' => 'No hay páginas que importar.',
+'imported-log-entries' => 'Importados $1 {{PLURAL:$1|entradas de registro|entradas de registro}}.',
'importfailed' => 'La importación ha fallado: $1',
'importunknownsource' => 'Tipo de fuente de importación desconocida',
'importcantopen' => 'No se pudo importar el archivo',
@@ -2692,7 +2761,7 @@ No hay un directorio temporal.',
'tooltip-pt-anonlogin' => 'Te invitamos a registrarte, aunque no es obligatorio',
'tooltip-pt-logout' => 'Salir de la sesión',
'tooltip-ca-talk' => 'Discusión acerca del artículo',
-'tooltip-ca-edit' => 'Puedes editar esta página. Por favor, usa el botón de previsualización antes de grabar.',
+'tooltip-ca-edit' => 'Puedes editar esta página. Utiliza el botón de previsualización antes de guardar',
'tooltip-ca-addsection' => 'Inicia una nueva sección',
'tooltip-ca-viewsource' => 'Esta página está protegida; sólo puedes ver su código fuente',
'tooltip-ca-history' => 'Versiones anteriores de esta página y sus autores',
@@ -2706,8 +2775,8 @@ No hay un directorio temporal.',
'tooltip-search' => 'Buscar en este wiki',
'tooltip-search-go' => 'Ir al artículo con este nombre exacto si existe',
'tooltip-search-fulltext' => 'Busca este texto en las páginas',
-'tooltip-p-logo' => 'Portada',
-'tooltip-n-mainpage' => 'Visitar la Portada',
+'tooltip-p-logo' => 'Visitar la página principal',
+'tooltip-n-mainpage' => 'Visitar la página principal',
'tooltip-n-mainpage-description' => 'Visitar la página principal',
'tooltip-n-portal' => 'Acerca del proyecto, lo que puedes hacer, dónde encontrar información',
'tooltip-n-currentevents' => 'Información de contexto sobre acontecimientos actuales',
@@ -2745,6 +2814,8 @@ No hay un directorio temporal.',
'tooltip-rollback' => '«Revertir» revierte todas las ediciones del último usuario con un solo clic.',
'tooltip-undo' => '«Deshacer» revierte la edición seleccionada y abre la página de edición en el modo de previsualización.
Permite añadir una razón al resumen de edición.',
+'tooltip-preferences-save' => 'Guardar preferencias',
+'tooltip-summary' => 'Ingresar un breve resumen',
# Stylesheets
'common.css' => '/* Los estilos CSS definidos aquí aplicarán a todas las pieles (skins) */',
@@ -2867,14 +2938,17 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
'imagemaxsize' => "Límite de tamaño de imagen:<br />''(para páginas de descripción de archivo)''",
'thumbsize' => 'Tamaño de las vistas en miniatura:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:|página|páginas}}',
-'file-info' => '(tamaño de archivo: $1; tipo MIME: $2)',
-'file-info-size' => '($1 × $2 píxeles; tamaño de archivo: $3; tipo MIME: $4)',
+'file-info' => 'tamaño de archivo: $1; tipo MIME: $2',
+'file-info-size' => '$1 × $2 píxeles; tamaño de archivo: $3; tipo MIME: $4',
'file-nohires' => '<small>No disponible a mayor resolución.</small>',
-'svg-long-desc' => '(archivo SVG, nominalmente $1 × $2 píxeles, tamaño de archivo: $3)',
+'svg-long-desc' => 'archivo SVG, nominalmente $1 × $2 píxeles, tamaño de archivo: $3',
'show-big-image' => 'Resolución original',
'show-big-image-thumb' => '<small>Tamaño de esta vista previa: $1 × $2 píxeles</small>',
'file-info-gif-looped' => 'bucleado',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'file-info-png-looped' => 'bucleado',
+'file-info-png-repeat' => 'reproducido $1 {{PLURAL:$1|vez|veces}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|marco|marcos}}',
# Special:NewFiles
'newimages' => 'Galería de imágenes nuevas',
@@ -3029,9 +3103,10 @@ Existen otros campos que se mantendrán ocultos por defecto.
'exif-gpsareainformation' => 'Nombre de la área GPS',
'exif-gpsdatestamp' => 'Fecha GPS',
'exif-gpsdifferential' => 'Corrección diferencial de GPS',
+'exif-objectname' => 'Título breve',
# EXIF attributes
-'exif-compression-1' => 'No comprimida',
+'exif-compression-1' => 'Sin comprimir',
'exif-unknowndate' => 'Fecha desconocida',
@@ -3110,6 +3185,8 @@ Existen otros campos que se mantendrán ocultos por defecto.
'exif-sensingmethod-7' => 'Sensor trilineal',
'exif-sensingmethod-8' => 'Sensor lineal secuencial de color',
+'exif-filesource-3' => 'Cámara digital',
+
'exif-scenetype-1' => 'Una imagen directamente fotografiada',
'exif-customrendered-0' => 'Proceso normal',
@@ -3186,26 +3263,26 @@ Existen otros campos que se mantendrán ocultos por defecto.
'limitall' => 'Todos',
# E-mail address confirmation
-'confirmemail' => 'Confirmar dirección de correo electrónico',
-'confirmemail_noemail' => 'No tienes una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]].',
-'confirmemail_text' => '{{SITENAME}} requiere la validación de tu dirección de correo antes de usarlo. Pulsa el botón de abajo para enviar la confirmación.
+'confirmemail' => 'Confirmar dirección de correo electrónico',
+'confirmemail_noemail' => 'No tienes una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]].',
+'confirmemail_text' => '{{SITENAME}} requiere la validación de tu dirección de correo antes de usarlo. Pulsa el botón de abajo para enviar la confirmación.
El correo incluirá un enlace con un código. Introdúcelo para confirmar la validez de tu dirección.',
-'confirmemail_pending' => 'Ya se te ha enviado un código de confirmación; si creaste una cuenta recientemente, puede que tengas que esperar unos minutos para que te llegue antes de intentar pedir un nuevo código.',
-'confirmemail_send' => 'Envíar el código de confimación.',
-'confirmemail_sent' => 'Confirmación de correo enviada.',
-'confirmemail_oncreate' => 'Se ha enviado un código de confirmación a tu dirección de correo electrónico.
+'confirmemail_pending' => 'Ya se te ha enviado un código de confirmación; si creaste una cuenta recientemente, puede que tengas que esperar unos minutos para que te llegue antes de intentar pedir un nuevo código.',
+'confirmemail_send' => 'Envíar el código de confimación.',
+'confirmemail_sent' => 'Confirmación de correo enviada.',
+'confirmemail_oncreate' => 'Se ha enviado un código de confirmación a tu dirección de correo electrónico.
Este código no es necesario para entrar, pero necesitarás darlo antes de activar cualquier función basada en correo electrónico en el wiki.',
-'confirmemail_sendfailed' => 'No fue posible enviar el correo de confirmación. Por favor, comprueba la validez de la dirección de correo.
+'confirmemail_sendfailed' => 'No fue posible enviar el correo de confirmación. Por favor, comprueba la validez de la dirección de correo.
El servidor indicó el error: $1',
-'confirmemail_invalid' => 'Código de confirmación incorrecto. El código debe haber expirado.',
-'confirmemail_needlogin' => 'Necesitas $1 para confirmar tu dirección electrónica.',
-'confirmemail_success' => 'Su dirección de correo ha sido confirmada
+'confirmemail_invalid' => 'Código de confirmación incorrecto. El código debe haber expirado.',
+'confirmemail_needlogin' => 'Necesitas $1 para confirmar tu dirección electrónica.',
+'confirmemail_success' => 'Su dirección de correo ha sido confirmada
Ahora puedes [[Special:UserLogin|identificarte]] y colaborar en el wiki.',
-'confirmemail_loggedin' => 'Tu dirección de correo electrónico ha sido confirmada.',
-'confirmemail_error' => 'Algo salió mal al guardar su confirmación.',
-'confirmemail_subject' => 'confirmación de la dirección de correo de {{SITENAME}}',
-'confirmemail_body' => 'Alguien, probablemente usted mismo, ha registrado desde la dirección IP $1 la cuenta "$2" en {{SITENAME}}, utilizando esta dirección de correo.
+'confirmemail_loggedin' => 'Tu dirección de correo electrónico ha sido confirmada.',
+'confirmemail_error' => 'Algo salió mal al guardar su confirmación.',
+'confirmemail_subject' => 'confirmación de la dirección de correo de {{SITENAME}}',
+'confirmemail_body' => 'Alguien, probablemente usted mismo, ha registrado desde la dirección IP $1 la cuenta "$2" en {{SITENAME}}, utilizando esta dirección de correo.
Para confirmar que esta cuenta realmente le pertenece y activar el correo en {{SITENAME}}, siga este enlace:
@@ -3216,8 +3293,32 @@ Si la cuenta *no* es suya, siga este otro enlace para cancelar la confirmación
$5
El código de confirmación expirará en $4.',
-'confirmemail_invalidated' => 'La confirmación de la dirección de correo electrónico ha sido cancelada',
-'invalidateemail' => 'Cancelar confirmación de correo electrónico',
+'confirmemail_body_changed' => 'Alguien, probablemente tú,
+ha modificado la dirección de correo electrónico asociado a la cuenta "$2" hacia esta en {{SITENAME}}, desde la dirección IP $1.
+
+Para confirmar que esta cuenta realmente te pertenece y reactivar las funciones de correo electrónico en {{SITENAME}}, abre este enlace en su navegador:
+
+$3
+
+Si la cuenta *no* te pertenece, sigue el siguiente enlace para cancelar la confirmación:
+
+$5
+
+Este código de confirmación expirará el $4.',
+'confirmemail_body_set' => 'Alguien, probablemente tu desde la dirección IP $1,
+ha cambiado la dirección de correo electrónico de la cuenta $2 a esta dirección en {{SITENAME}}.
+
+Para confirmar que esta cuenta realmente te pertenece y reactivar las capacidades del correo electrónico en {{SITENAME}}, abre este enlace en tu navegador:
+
+$3
+
+Si la cuenta *no* te pertenece sigue entonces este otro enlace para cancelar la confirmación del correo electrónico:
+
+$5
+
+Este código de confirmación caducará el $4.',
+'confirmemail_invalidated' => 'La confirmación de la dirección de correo electrónico ha sido cancelada',
+'invalidateemail' => 'Cancelar confirmación de correo electrónico',
# Scary transclusion
'scarytranscludedisabled' => '[Transclusión interwiki está deshabilitada]',
@@ -3258,6 +3359,7 @@ $1",
'table_pager_first' => 'Primera página',
'table_pager_last' => 'Última página',
'table_pager_limit' => 'Mostrar $1 elementos por página',
+'table_pager_limit_label' => 'Items por página:',
'table_pager_limit_submit' => 'Ir',
'table_pager_empty' => 'No hay resultados',
@@ -3316,6 +3418,7 @@ También puedes [[Special:Watchlist/edit|usar el editor estándar]].',
'version-specialpages' => 'Páginas especiales',
'version-parserhooks' => 'Extensiones del analizador sintáctico',
'version-variables' => 'Variables',
+'version-skins' => 'Pieles',
'version-other' => 'Otro',
'version-mediahandlers' => 'Manejadores multimedia',
'version-hooks' => 'Extensiones',
@@ -3327,6 +3430,13 @@ También puedes [[Special:Watchlist/edit|usar el editor estándar]].',
'version-hook-subscribedby' => 'Suscrito por',
'version-version' => '(Versión $1)',
'version-license' => 'Licencia',
+'version-poweredby-credits' => "Este wiki funciona gracias a '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'otros',
+'version-license-info' => 'MediaWiki es software libre; puedes redistribuírlo y/o modificarlo bajo los términos de la Licencia General Pública GNU publicada por la Fundación del Software Libre; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
+
+MediaWiki es distribuído con la esperanza de que será útil, pero SIN NINGUNA GARANTÃA; ni siquiera con la garantía implícita de COMERCIALIZACIÓN ó ADAPTACIÓN A UN PROPÓSITO PARTICULAR. Véase la Licencia Pública General GNU para mayores detalles.
+
+Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública General GNU] junto a este programa; si no es así, escríbale a la Fundación del Software Libre, Inc., Calle Franklin 51, Quinto Piso, Boston, MA 02110-1301, EE.UU. ó [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html léela en línea].',
'version-software' => 'Software instalado',
'version-software-product' => 'Producto',
'version-software-version' => 'Versión',
@@ -3349,8 +3459,8 @@ Ingrese el nombre del archivo sin el prefijo "{{ns:file}}:".',
'fileduplicatesearch-filename' => 'Nombre del fichero:',
'fileduplicatesearch-submit' => 'Buscar',
'fileduplicatesearch-info' => '$1 × $2 píxeles<br />Tamaño: $3<br />Tipo MIME: $4',
-'fileduplicatesearch-result-1' => 'El archivo "$1" no tiene duplicados idénticos.',
-'fileduplicatesearch-result-n' => 'El archivo "$1" tiene {{PLURAL:$2|1 duplicado idéntico|$2 duplicados idénticos}}.',
+'fileduplicatesearch-result-1' => 'El archivo «$1» no tiene duplicados idénticos.',
+'fileduplicatesearch-result-n' => 'El archivo «$1» tiene {{PLURAL:$2|1 duplicado idéntico|$2 duplicados idénticos}}.',
# Special:SpecialPages
'specialpages' => 'Páginas especiales',
@@ -3359,20 +3469,20 @@ Ingrese el nombre del archivo sin el prefijo "{{ns:file}}:".',
* <strong class="mw-specialpagerestricted">Páginas especiales restringidas.</strong>',
'specialpages-group-maintenance' => 'Reportes de mantenimiento',
'specialpages-group-other' => 'Otras páginas especiales',
-'specialpages-group-login' => 'Registrarse / entrar',
+'specialpages-group-login' => 'Iniciar sesión / Registrarse',
'specialpages-group-changes' => 'Cambios recientes y registros',
'specialpages-group-media' => 'Páginas sobre archivos',
'specialpages-group-users' => 'Usuarios y permisos',
'specialpages-group-highuse' => 'Páginas sobre usos',
'specialpages-group-pages' => 'Listas de páginas',
'specialpages-group-pagetools' => 'Herramientas de páginas',
-'specialpages-group-wiki' => 'Datos sobre la wiki y herramientas',
+'specialpages-group-wiki' => 'Herramientas y datos del wiki',
'specialpages-group-redirects' => 'Búsquedas y redirecciones',
'specialpages-group-spam' => 'Herramientas anti-SPAM',
# Special:BlankPage
'blankpage' => 'Página vacía',
-'intentionallyblankpage' => 'Esta pagina está en blanco intencionadamente',
+'intentionallyblankpage' => 'Esta pagina está en blanco de manera intencionada.',
# External image whitelist
'external_image_whitelist' => ' #Deja esta línea exactamente como está<pre>
@@ -3397,12 +3507,21 @@ Ingrese el nombre del archivo sin el prefijo "{{ns:file}}:".',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
+# Special:ComparePages
+'comparepages' => 'Comparar páginas',
+'compare-selector' => 'Comparar revisiones de página',
+'compare-page1' => 'Página 1',
+'compare-page2' => 'Página 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
-'dberr-header' => 'Esta wiki tiene un problema',
+'dberr-header' => 'Este wiki tiene un problema',
'dberr-problems' => 'Lo sentimos. Este sitio está experimentando dificultades técnicas.',
'dberr-again' => 'Prueba a recargar dentro de unos minutos.',
'dberr-info' => '(No se puede contactar con la base de datos del servidor: $1)',
-'dberr-usegoogle' => 'Mientras tanto puede probar buscando a través de Google.',
+'dberr-usegoogle' => 'Mientras tanto puedes probar buscando a través de Google.',
'dberr-outofdate' => 'Ten en cuenta que su índice de nuestro contenido puede estar desactualizado.',
'dberr-cachederror' => 'La siguiente es una página guardada de la página solicitada, y puede no estar actualizada.',
@@ -3413,8 +3532,13 @@ Ingrese el nombre del archivo sin el prefijo "{{ns:file}}:".',
'htmlform-float-invalid' => 'El valor que ha especificado no es un número.',
'htmlform-int-toolow' => 'El valor que especificaste está debajo del mínimo de $1',
'htmlform-int-toohigh' => 'El valor que especificaste está arriba del máximo de $1',
+'htmlform-required' => 'Este valor es obligatorio',
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Deshacer cambios',
'htmlform-selectorother-other' => 'Otro',
+# SQLite database support
+'sqlite-has-fts' => '$1 con soporte para búsqueda de texto completo',
+'sqlite-no-fts' => '$1 sin soporte para búsqueda de texto completo',
+
);
diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php
index 54c9e9f5..48c2b883 100644
--- a/languages/messages/MessagesEt.php
+++ b/languages/messages/MessagesEt.php
@@ -14,6 +14,7 @@
* @author KaidoKikkas
* @author KalmerE.
* @author Ker
+ * @author Kyng
* @author Pikne
* @author Silvar
* @author Võrok
@@ -95,24 +96,24 @@ $specialPageAliases = array(
'Confirmemail' => array( 'E-posti_aadressi_kinnitamine' ),
'Whatlinkshere' => array( 'Lingid_siia' ),
'Recentchangeslinked' => array( 'Seotud_muudatused' ),
- 'Movepage' => array( 'Teisalda' ),
- 'Booksources' => array( 'Otsi_raamatut' ),
+ 'Movepage' => array( 'Teisaldamine', 'Teisalda' ),
+ 'Booksources' => array( 'Raamatuotsimine', 'Otsi_raamatut' ),
'Categories' => array( 'Kategooriad' ),
'Export' => array( 'Lehekülgede_eksport' ),
'Version' => array( 'Versioon' ),
'Allmessages' => array( 'Kõik_sõnumid' ),
'Log' => array( 'Logid' ),
'Blockip' => array( 'Blokeerimine' ),
- 'Undelete' => array( 'Taasta_lehekülg' ),
+ 'Undelete' => array( 'Lehekülje_taastamine', 'Taasta_lehekülg' ),
'Import' => array( 'Lehekülgede_import' ),
- 'Lockdb' => array( 'Lukusta_andmebaas' ),
- 'Unlockdb' => array( 'Ava_andmebaas' ),
+ 'Lockdb' => array( 'Andmebaasi_lukustamine', 'Lukusta_andmebaas' ),
+ 'Unlockdb' => array( 'Andmebaasi_avamine', 'Ava_andmebaas' ),
'Userrights' => array( 'Kasutaja_õigused' ),
'MIMEsearch' => array( 'MIME_otsing' ),
- 'FileDuplicateSearch' => array( 'Otsi_faili_duplikaate' ),
+ 'FileDuplicateSearch' => array( 'Faili_duplikaatide_otsimine', 'Otsi_faili_duplikaate' ),
'Unwatchedpages' => array( 'Jälgimata_leheküljed' ),
'Listredirects' => array( 'Ãœmbersuunamised' ),
- 'Revisiondelete' => array( 'Kustuta_muudatus' ),
+ 'Revisiondelete' => array( 'Muudatuse_kustutamine', 'Kustuta_muudatus' ),
'Unusedtemplates' => array( 'Kasutamata_mallid' ),
'Randomredirect' => array( 'Juhuslik_ümbersuunamine' ),
'Mypage' => array( 'Minu_lehekülg' ),
@@ -121,20 +122,20 @@ $specialPageAliases = array(
'Listadmins' => array( 'Ãœlemaloend' ),
'Listbots' => array( 'Robotiloend' ),
'Popularpages' => array( 'Loetumad_leheküljed' ),
- 'Search' => array( 'Otsi' ),
- 'Resetpass' => array( 'Muuda_parool' ),
+ 'Search' => array( 'Otsimine', 'Otsi' ),
+ 'Resetpass' => array( 'Parooli_muutmine', 'Muuda_parool' ),
'Withoutinterwiki' => array( 'Ilma_keelelinkideta' ),
'MergeHistory' => array( 'Liitmisajalugu' ),
'Filepath' => array( 'Failitee' ),
- 'Invalidateemail' => array( 'Tühista_e-posti_kinnitus' ),
+ 'Invalidateemail' => array( 'E-posti_kinnituse_tühistamine', 'Tühista_e-posti_kinnitus' ),
'Blankpage' => array( 'Tühi_leht' ),
- 'LinkSearch' => array( 'Otsi_välislinke' ),
+ 'LinkSearch' => array( 'Välislinkide_otsimine', 'Otsi_välislinke' ),
'DeletedContributions' => array( 'Kustutatud_kaastöö' ),
'Tags' => array( 'Märgised' ),
'Activeusers' => array( 'Teguskasutajad' ),
);
-#Lisasin eestimaised poed, aga võõramaiseid ei julenud kustutada.
+# Lisasin eestimaised poed, aga võõramaiseid ei julenud kustutada.
$bookstoreList = array(
'Apollo' => 'http://www.apollo.ee/search.php?keyword=$1&search=OTSI',
'minu Raamat' => 'http://www.raamat.ee/advanced_search_result.php?keywords=$1',
@@ -176,6 +177,7 @@ $magicWords = array(
'numberofusers' => array( '1', 'KASUTAJAMÄÄR', 'NUMBEROFUSERS' ),
'numberofactiveusers' => array( '1', 'TEGUSKASUTAJAMÄÄR', 'NUMBEROFACTIVEUSERS' ),
'numberofedits' => array( '1', 'REDIGEERIMISMÄÄR', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'VAATAMISTEARV', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'LEHEKÃœLJENIMI', 'PAGENAME' ),
'pagenamee' => array( '1', 'LEHEKÃœLJENIMI1', 'PAGENAMEE' ),
'namespace' => array( '1', 'NIMERUUM', 'NAMESPACE' ),
@@ -201,6 +203,7 @@ $magicWords = array(
'img_center' => array( '1', 'keskel', 'center', 'centre' ),
'img_framed' => array( '1', 'raam', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'raamita', 'frameless' ),
+ 'img_page' => array( '1', 'lehekülg=$1', 'lehekülg_$1', 'page=$1', 'page $1' ),
'img_border' => array( '1', 'ääris', 'border' ),
'sitename' => array( '1', 'KOHANIMI', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
@@ -219,6 +222,7 @@ $magicWords = array(
'ucfirst' => array( '0', 'ESIST:', 'UCFIRST:' ),
'lc' => array( '0', 'VT:', 'LC:' ),
'uc' => array( '0', 'ST:', 'UC:' ),
+ 'displaytitle' => array( '1', 'PEALKIRI', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__UUEALAOSALINK__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__UUEALAOSALINGITA__', '__NONEWSECTIONLINK__' ),
'currenttimestamp' => array( '1', 'HETKEAJATEMPEL', 'CURRENTTIMESTAMP' ),
@@ -238,7 +242,7 @@ $magicWords = array(
'formatdate' => array( '0', 'kuupäevavormindus', 'formatdate', 'dateformat' ),
);
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$linkTrail = '/^([äöõšüža-z]+)(.*)$/sDu';
$datePreferences = array(
@@ -288,8 +292,7 @@ $messages = array(
'tog-editsection' => '[redigeeri] lingid peatükkide muutmiseks',
'tog-editsectiononrightclick' => 'Peatükkide redigeerimine paremklõpsuga alampealkirjadel (JavaScript)',
'tog-showtoc' => 'Näita sisukorda (lehtedel, millel on rohkem kui 3 pealkirja)',
-'tog-rememberpassword' => 'Parooli meeldejätmine tulevasteks seanssideks',
-'tog-editwidth' => 'Laienda toimetamisaken ekraani laiuseks',
+'tog-rememberpassword' => 'Parooli meeldejätmine tulevasteks seanssideks (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
'tog-watchcreations' => 'Lisa minu loodud lehed jälgimisloendisse',
'tog-watchdefault' => 'Jälgi uusi ja muudetud artikleid',
'tog-watchmoves' => 'Lisa minu teisaldatud leheküljed jälgimisloendisse',
@@ -429,31 +432,21 @@ ning [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide kasutusjuhendit].'
'faqpage' => 'Project:KKK',
# Vector skin
-'vector-action-addsection' => 'Lisa teema',
-'vector-action-delete' => 'Kustuta',
-'vector-action-move' => 'Teisalda',
-'vector-action-protect' => 'Kaitse',
-'vector-action-undelete' => 'Taasta',
-'vector-action-unprotect' => 'Tühista kaitse',
-'vector-namespace-category' => 'Kategooria',
-'vector-namespace-help' => 'Abilehekülg',
-'vector-namespace-image' => 'Fail',
-'vector-namespace-main' => 'Artikkel',
-'vector-namespace-media' => 'Meedialeht',
-'vector-namespace-mediawiki' => 'Sõnum',
-'vector-namespace-project' => 'Projektileht',
-'vector-namespace-special' => 'Erileht',
-'vector-namespace-talk' => 'Arutelu',
-'vector-namespace-template' => 'Mall',
-'vector-namespace-user' => 'Kasutaja leht',
-'vector-view-create' => 'Loo',
-'vector-view-edit' => 'Redigeeri',
-'vector-view-history' => 'Näita ajalugu',
-'vector-view-view' => 'Vaata',
-'vector-view-viewsource' => 'Vaata lähteteksti',
-'actions' => 'Toimingud',
-'namespaces' => 'Nimeruumid',
-'variants' => 'Variandid',
+'vector-action-addsection' => 'Lisa teema',
+'vector-action-delete' => 'Kustuta',
+'vector-action-move' => 'Teisalda',
+'vector-action-protect' => 'Kaitse',
+'vector-action-undelete' => 'Taasta',
+'vector-action-unprotect' => 'Tühista kaitse',
+'vector-simplesearch-preference' => 'Luba täiustatud otsinguvihjed (ainult Vektori-kujunduses)',
+'vector-view-create' => 'Loo',
+'vector-view-edit' => 'Redigeeri',
+'vector-view-history' => 'Näita ajalugu',
+'vector-view-view' => 'Vaata',
+'vector-view-viewsource' => 'Vaata lähteteksti',
+'actions' => 'Toimingud',
+'namespaces' => 'Nimeruumid',
+'variants' => 'Variandid',
'errorpagetitle' => 'Viga',
'returnto' => 'Naase lehele $1',
@@ -466,7 +459,7 @@ ning [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide kasutusjuhendit].'
'history' => 'Artikli ajalugu',
'history_short' => 'Ajalugu',
'updatedmarker' => 'uuendatud pärast viimast külastust',
-'info_short' => 'Info',
+'info_short' => 'Teave',
'printableversion' => 'Prinditav versioon',
'permalink' => 'Püsilink',
'print' => 'Prindi',
@@ -514,6 +507,7 @@ Liiga palju kasutajaid üritab korraga seda lehte vaadata.
Palun oota hetk enne kui uuesti proovid.
$1',
+'pool-errorunknown' => 'Teadmata tõrge',
# 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:genitive|{{SITENAME}}}} tiitelandmed',
@@ -681,7 +675,7 @@ Sinu konto on loodud.
'yourname' => 'Kasutajanimi:',
'yourpassword' => 'Parool:',
'yourpasswordagain' => 'Sisesta parool uuesti:',
-'remembermypassword' => 'Jäta parool meelde',
+'remembermypassword' => 'Jäta parool meelde (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
'yourdomainname' => 'Sinu domeen:',
'externaldberror' => 'Esines autentimistõrge või sul pole õigust konto andmeid muuta.',
'login' => 'Logi sisse',
@@ -698,6 +692,7 @@ Sinu konto on loodud.
'gotaccount' => "Kui sul on juba konto, '''$1'''.",
'gotaccountlink' => 'logi sisse',
'createaccountmail' => 'e-posti teel',
+'createaccountreason' => 'Põhjus:',
'badretype' => 'Sisestatud paroolid ei lange kokku.',
'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
Palun valige uus nimi.',
@@ -719,6 +714,7 @@ Kontrollige kirjapilti või [[Special:UserLogin/signup|looge uus kasutajakonto]]
'passwordtooshort' => 'Parool on liiga lühike.
See peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.',
'password-name-match' => 'Parool peab kasutajanimest erinema.',
+'password-login-forbidden' => 'Selle kasutajanime ja parooli kasutamine on keelatud.',
'mailmypassword' => 'Saada e-posti teel uus parool',
'passwordremindertitle' => '{{SITENAME}} – ajutine parool',
'passwordremindertext' => 'Keegi IP-aadressiga $1, tõenäoliselt sa ise, palus, et talle saadetaks {{GRAMMAR:elative|{{SITENAME}}}} uus parool ($4). Kasutaja "$2" ajutiseks paroolis seati "$3". Kui soovid tõepoolest uut parooli, pead sisse logima ja uue parooli valima. Ajutine parool aegub {{PLURAL:$5|ühe päeva|$5 päeva}} pärast.
@@ -807,11 +803,12 @@ Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist sa
'showdiff' => 'Näita muudatusi',
'anoneditwarning' => "'''Hoiatus:''' Sa pole sisse logitud.
Selle lehe redigeerimislogisse salvestatakse su IP-aadress.",
+'anonpreviewwarning' => "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
'missingsummary' => "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.
Kui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
'missingcommenttext' => 'Palun sisesta siit allapoole kommentaar.',
-'missingcommentheader' => "'''Meeldetuletus:''' Sa ei ole kirjutanud kommentaarile teemat/pealkirja.
-Kui vajutad uuesti <em>Salvesta</em>, siis salvestatakse kommentaar ilma teema/pealkirjata.",
+'missingcommentheader' => "'''Meeldetuletus:''' Sa pole kirjutanud kommentaarile teemat ega pealkirja.
+Kui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar kummatagi.",
'summary-preview' => 'Resümee eelvaade:',
'subject-preview' => 'Alaosa pealkirja eelvaade:',
'blockedtitle' => 'Kasutaja on blokeeritud',
@@ -881,8 +878,12 @@ Allpool on toodud viimane blokeerimislogi sissekanne:',
'userjsyoucanpreview' => "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
'usercsspreview' => "'''Ära unusta, et seda versiooni sinu isiklikust stiililehest pole veel salvestatud!'''",
'userjspreview' => "'''Ära unusta, et see versioon sinu isiklikust JavaScriptist on alles salvestamata!'''",
+'sitecsspreview' => "'''Pea meeles, et see on vaid selle stiililehe eelvaade.'''
+'''Seda pole veel salvestatud!'''",
+'sitejspreview' => "'''Pea meeles, et see on vaid selle JavaScripti-koodi eelvaade.'''
+'''Seda pole veel salvestatud!'''",
'userinvalidcssjstitle' => "'''Hoiatus:''' Kujundust nimega \"\$1\" ei ole.
-Ära unusta, et kasutaja isiklikud .css- ja .js-lehed kasutavad väiketähega algavaid nimesid, näiteks {{ns:user}}:Juhan Julm/monobook.css ja mitte {{ns:user}}:Juhan Julm/Monobook.css.",
+Ära unusta, et kasutaja isiklikud .css- ja .js-lehed kasutavad väiketähega algavaid nimesid, näiteks {{ns:user}}:Juhan Julm/vector.css ja mitte {{ns:user}}:Juhan Julm/Vector.css.",
'updated' => '(Värskendatud)',
'note' => "'''Meeldetuletus:'''",
'previewnote' => "'''Ära unusta, et see on kõigest eelvaade!'''
@@ -922,7 +923,6 @@ Te kinnitate ka, et kirjutasite selle ise või võtsite selle kopeerimiskitsendu
'copyrightwarning2' => "Pea silmas, et teised kaastöölised võivad kogu {{GRAMMAR:inessive|{{SITENAME}}}} tehtud kaastööd muuta või eemaldada. Kui sa ei soovi, et su kirjutatut halastamatult redigeeritakse, siis ära seda siia salvesta.<br />
Sa kinnitad ka, et kirjutasid selle ise või võtsid selle kopeerimiskitsenduseta allikast (vaata ka $1).
'''Ära saada autoriõigusega kaitstud materjali loata!'''",
-'longpagewarning' => "'''HOIATUS: Selle lehekülje pikkus ületab $1 kilobaiti. Mõne brauseri puhul valmistab raskusi juba 32-le kilobaidile läheneva pikkusega lehekülgede redigeerimine. Palun kaaluge selle lehekülje sisu jaotamist lühemate lehekülgede vahel.'''",
'longpageerror' => "'''Viga: Lehekülje suurus on $1 kilobaiti. Lehekülge ei saa salvestada, kuna see on pikem kui maksimaalsed $2 kilobaiti.'''",
'readonlywarning' => "'''Hoiatus: Andmebaas on lukustatud hooldustöödeks, nii et praegu ei saa parandusi salvestada.'''
Võid teksti hilisemaks kasutamiseks alles hoida tekstifailina.
@@ -1095,6 +1095,8 @@ $1",
'logdelete-failure' => "'''Logi nähtavust ei saanud paika:'''
$1",
'revdel-restore' => 'Muuda nähtavust',
+'revdel-restore-deleted' => 'kustutatud redaktsioonid',
+'revdel-restore-visible' => 'nähtavad redaktsioonid',
'pagehist' => 'Lehekülje ajalugu',
'deletedhist' => 'Kustutatud ajalugu',
'revdelete-content' => 'sisu',
@@ -1164,11 +1166,13 @@ Navigeerimislinkide kasutamine tühistab redaktsioonide valiku.',
# Diffs
'history-title' => 'Lehekülje "$1" muudatuste ajalugu',
'difference' => '(Erinevused redaktsioonide vahel)',
+'difference-multipage' => '(Lehekülgede erinevus)',
'lineno' => 'Rida $1:',
'compareselectedversions' => 'Võrdle valitud redaktsioone',
'showhideselectedversions' => 'Näita/peida valitud versioonid',
'editundo' => 'eemalda',
-'diff-multi' => '({{PLURAL:$1|Ühte vahepealset muudatust|$1 vahepealset muudatust}} ei näidata.)',
+'diff-multi' => '({{PLURAL:$1|Ühte|$1}} vahepealset {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ühte|$1}} vahepealset rohkem kui {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
# Search results
'searchresults' => 'Otsingu tulemused',
@@ -1203,6 +1207,7 @@ Navigeerimislinkide kasutamine tühistab redaktsioonide valiku.',
'searchprofile-everything-tooltip' => 'Otsi kogu sisust (k.a aruteluleheküljed)',
'searchprofile-advanced-tooltip' => 'Otsi kohandatud nimeruumidest',
'search-result-size' => '$1 ({{PLURAL:$2|1 sõna|$2 sõna}})',
+'search-result-category-size' => '{{PLURAL:$1|1 lehekülg|$1 lehekülge}} ({{PLURAL:$2|1 alamkategooria|$2 alamkategooriat}}, {{PLURAL:$3|1 fail|$3 faili}})',
'search-result-score' => 'Vastavus: $1%',
'search-redirect' => '(ümbersuunamine $1)',
'search-section' => '(alaosa $1)',
@@ -1281,6 +1286,7 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
'contextlines' => 'Ridu vastes:',
'contextchars' => 'Kaasteksti rea kohta:',
'stub-threshold' => '<a href="#" class="stub">Nii</a> lingitud lehekülje suuruse ülempiir (baitides):',
+'stub-threshold-disabled' => 'Välja lülitatud',
'recentchangesdays' => 'Mitu päeva näidata viimastes muudatustes:',
'recentchangesdays-max' => 'Ülemmäär $1 {{PLURAL:$1|päev|päeva}}',
'recentchangescount' => 'Mitut redaktsiooni vaikimisi näidata:',
@@ -1314,6 +1320,7 @@ Siin on juhuslik väärtus, mida saad kasutada: $1',
'prefs-files' => 'Failid',
'prefs-custom-css' => 'kohandatud CSS',
'prefs-custom-js' => 'kohandatud JS',
+'prefs-common-css-js' => 'Kõigi kujunduste ühine CSS/JS:',
'prefs-reset-intro' => 'Sellel leheküljel saad oma eelistused lähtestada võrgukoha vaike-eelistusteks.
Toimingut ei saa hiljem tühistada.',
'prefs-emailconfirm-label' => 'E-posti kinnitus:',
@@ -1350,9 +1357,15 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'prefs-advancedrendering' => 'Täpsemad eelistused',
'prefs-advancedsearchoptions' => 'Täpsemad eelistused',
'prefs-advancedwatchlist' => 'Täpsemad eelistused',
-'prefs-display' => 'Kuvasätted',
+'prefs-displayrc' => 'Kuvasätted',
+'prefs-displaysearchoptions' => 'Kuvasätted',
+'prefs-displaywatchlist' => 'Kuvasätted',
'prefs-diffs' => 'Erinevused',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Sobiv e-posti aadress',
+'email-address-validity-invalid' => 'Sisesta sobiv e-posti aadress.',
+
# User rights
'userrights' => 'Kasutaja õiguste muutmine',
'userrights-lookup-user' => 'Kasutajarühma muutmine',
@@ -1436,6 +1449,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'right-hideuser' => 'Blokeerida kasutajanimi, peites selle avalikkuse eest',
'right-ipblock-exempt' => 'Mööduda automaatsetest blokeeringutest ning aadressivahemiku- ja IP-blokeeringutest',
'right-proxyunbannable' => 'Mööduda automaatsetest puhverserveri blokeeringutest',
+'right-unblockself' => 'Enda blokeeringut eemaldada',
'right-protect' => 'Muuta kaitsetasemeid ja redigeerida kaitstud lehekülgi',
'right-editprotected' => 'Muuta kaitstud lehekülgi, millel ei ole kaskaadkaitset',
'right-editinterface' => 'Muuta kasutajaliidest',
@@ -1458,7 +1472,6 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'right-siteadmin' => 'Panna lukku ja lukust lahti teha andmebaasi',
'right-reset-passwords' => 'Määrata teistele kasutajatele paroole',
'right-override-export-depth' => 'Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni',
-'right-versiondetail' => 'Näha tarkvaraversiooni laiendatud teavet',
'right-sendemail' => 'Saata teistele kasutajatele e-kirju',
# User rights log
@@ -1509,14 +1522,9 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'recentchanges-legend' => 'Viimaste muudatuste seaded',
'recentchangestext' => 'Jälgi sellel leheküljel viimaseid muudatusi.',
'recentchanges-feed-description' => 'Jälgi vikisse tehtud viimaseid muudatusi.',
-'recentchanges-label-legend' => 'Märkide selgitused: $1.',
-'recentchanges-legend-newpage' => '$1 – uus lehekülg',
'recentchanges-label-newpage' => 'See muudatus lõi uue lehekülje',
-'recentchanges-legend-minor' => '$1 – pisimuudatus',
'recentchanges-label-minor' => 'See on pisiparandus',
-'recentchanges-legend-bot' => '$1 – roboti muudatus',
'recentchanges-label-bot' => 'Selle muudatuse sooritas robot',
-'recentchanges-legend-unpatrolled' => '$1 – kontrollimata muudatus',
'recentchanges-label-unpatrolled' => 'Seda muudatust ei ole veel kontrollitud',
'rcnote' => "Allpool on esitatud {{PLURAL:$1|'''1''' muudatus|viimased '''$1''' muudatust}} viimase {{PLURAL:$2|päeva|'''$2''' päeva}} jooksul, seisuga $4, kell $5.",
'rcnotefrom' => "Allpool on toodud muudatused alates: '''$2''' (näidatakse kuni '''$1''' muudatust)",
@@ -1564,6 +1572,9 @@ Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on '''rasvaselt''' esile
'upload_directory_missing' => 'Ãœleslaadimiskaust $1 puudub ja veebiserver ei saa seda luua.',
'upload_directory_read_only' => 'Veebiserveril ei õnnestu üleslaadimiste kataloogi ($1) kirjutada.',
'uploaderror' => 'Faili laadimine ebaõnnestus',
+'upload-recreate-warning' => "'''Hoiatus: Sellise nimega fail on kustutatud või teisaldatud.'''
+
+Selle lehe kustutamis- ja teisaldamislogi on kuvatud siin:",
'uploadtext' => "Järgnevat vormi võid kasutada failide üleslaadimiseks.
Et näha või leida eelnevalt üles laaditud faile vaata [[Special:FileList|failide nimekirja]].
@@ -1598,6 +1609,17 @@ Faili lisamiseks artiklile kasuta linki ühel kujul järgnevatest:
Eelistatud {{PLURAL:\$3|failitüüp on|failitüübid on}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' ei ole lubatud failitüüp. Lubatud {{PLURAL:\$3|failitüüp|failitüübid}} on \$2.",
'filetype-missing' => 'Failil puudub laiend (nagu näiteks ".jpg").',
+'empty-file' => 'Saadetud fail oli tühi.',
+'file-too-large' => 'Saadetud fail oli liiga suur.',
+'filename-tooshort' => 'Failinimi on liiga lühike.',
+'filetype-banned' => 'See failitüüp on keelatud.',
+'verification-error' => 'See fail ei läbinud failikontrolli.',
+'hookaborted' => 'Ühe laiendusmooduli ühendus takistab sinu soovitud muudatuse tegemist.',
+'illegal-filename' => 'Keelatud failinimi.',
+'overwrite' => 'Olemasoleva faili ülekirjutamine ei ole lubatud.',
+'unknown-error' => 'Tundmatu tõrge.',
+'tmp-create-error' => 'Ajutise faili loomine ebaõnnestus.',
+'tmp-write-error' => 'Viga ajutise faili kirjutamisel.',
'large-file' => 'On soovitatav, et üleslaaditavad failid ei oleks suuremad kui $1. Selle faili suurus on $2.',
'largefileserver' => 'Antud fail on suurem lubatud failisuurusest.',
'emptyfile' => 'Fail, mille Te üles laadisite, paistab olevat tühi.
@@ -1627,13 +1649,14 @@ Kui soovid siiski oma faili üles laadida, siis palun mine tagasi ja kasuta teis
'file-exists-duplicate' => 'See fail on {{PLURAL:$1|järgneva faili|järgnevate failide}} duplikaat:',
'file-deleted-duplicate' => 'Selle failiga ([[:$1]]) identne fail on hiljuti kustutatud.
Vaata selle faili kustutamise ajalugu enne jätkamist.',
-'successfulupload' => 'Üleslaadimine õnnestus',
'uploadwarning' => 'Ãœleslaadimise hoiatus',
'uploadwarning-text' => 'Muuda allpool olevat faili kirjeldust ning proovi uuesti.',
'savefile' => 'Salvesta fail',
'uploadedimage' => 'laadis üles faili "[[$1]]"',
'overwroteimage' => 'laadis üles faili "[[$1]]" uue versiooni',
'uploaddisabled' => 'Ãœleslaadimine hetkel keelatud',
+'copyuploaddisabled' => 'Internetiaadressilt üleslaadimine on keelatud.',
+'uploadfromurl-queued' => 'Üleslaadimine on järjekorras.',
'uploaddisabledtext' => 'Faili üleslaadimine on keelatud.',
'php-uploaddisabledtext' => 'Failide üleslaadmine on PHP seadetes keelatud.
Palun vaata <code>file_uploads</code> sätet.',
@@ -1655,6 +1678,14 @@ Peaksid kaaluma, kas selle faili üleslaadimise jätkamine on sobilik.
Selle faili kustutamislogi on toodud siinsamas:",
'filename-bad-prefix' => "Üleslaaditava faili nimi algab eesliitega '''\"\$1\"''', mis on omane digikaamera antud ebamäärastele nimedele.
Palun vali oma failile kirjeldavam nimi.",
+'upload-success-subj' => 'Üleslaadimine õnnestus',
+'upload-success-msg' => 'Üleslaadimine allikast [$2] läks edukalt. See on leitav siit: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Ãœleslaadimisprobleem',
+'upload-failure-msg' => 'Ãœleslaadimisel allikast [$2] ilmnes probleem:
+
+$1',
+'upload-warning-subj' => 'Ãœleslaadimishoiatus',
+'upload-warning-msg' => 'Üleslaadimisel allikast [$2] tekkis probleem. Probleemi eemaldamiseks võid naasta [[Special:Upload/stash/$1|üleslaadimisvormi]] juurde.',
'upload-proto-error' => 'Vigane protokoll',
'upload-proto-error-text' => 'Teiselt saidilt üleslaadimiseks peab URL algama <code>http://</code> või <code>ftp://</code>.',
@@ -1720,6 +1751,7 @@ Tulba päisel klõpsamine muudab sortimist.',
'listfiles_search_for' => 'Nimeotsing:',
'imgfile' => 'fail',
'listfiles' => 'Piltide loend',
+'listfiles_thumb' => 'Pisipilt',
'listfiles_date' => 'Kuupäev',
'listfiles_name' => 'Nimi',
'listfiles_user' => 'Kasutaja',
@@ -1831,8 +1863,8 @@ Sisesta kujul tüüp/alamtüüp, näiteks <tt>image/jpeg</tt>.',
'statistics-edits' => 'Redigeerimisi alates {{GRAMMAR:genitive|{{SITENAME}}}} loomisest',
'statistics-edits-average' => 'Keskmiselt redigeerimisi lehekülje kohta',
'statistics-views-total' => 'Lehekülje vaatamisi kokku',
+'statistics-views-total-desc' => 'Olematute lehekülgede või erilehekülgede vaatamised on välja arvatud',
'statistics-views-peredit' => 'Vaatamisi redaktsiooni kohta',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Tööjärje] pikkus',
'statistics-users' => 'Registreeritud [[Special:ListUsers|kasutajaid]]',
'statistics-users-active' => 'Aktiivseid kasutajaid',
'statistics-users-active-desc' => 'Kasutajad, kes on viimase {{PLURAL:$1|päeva|$1 päeva}} jooksul tegutsenud',
@@ -1847,7 +1879,7 @@ Lehekülg loetakse täpsustusleheküljeks, kui see kasutab malli, millele viitab
'doubleredirects' => 'Kahekordsed ümbersuunamised',
'doubleredirectstext' => 'Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.
Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise ümbersuunamislehe sihtmärk, mis tavaliselt on esialgse ümbersuunamise tegelik siht, millele see otse osutama peakski.
-<s>Läbikriipsutatud</s> kirjed on kohendatud.',
+<del>Läbikriipsutatud</del> kirjed on kohendatud.',
'double-redirect-fixed-move' => '[[$1]] on teisaldatud, see suunab nüüd leheküljele [[$2]].',
'double-redirect-fixer' => 'Ãœmbersuunamiste parandaja',
@@ -1870,6 +1902,8 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise Ã
'nmembers' => '$1 {{PLURAL:$1|liige|liiget}}',
'nrevisions' => '$1 {{PLURAL:$1|redaktsioon|redaktsiooni}}',
'nviews' => '$1 {{PLURAL:$1|külastus|külastust}}',
+'nimagelinks' => 'Kasutuses {{PLURAL:$1|ühel leheküljel|$1 leheküljel}}',
+'ntransclusions' => 'kasutuses {{PLURAL:$1|ühel leheküljel|$1 leheküljel}}',
'specialpage-empty' => 'Vasteid ei leidu.',
'lonelypages' => 'Viitamata leheküljed',
'lonelypagestext' => 'Järgmistele lehekülgedele ei ole linki ühelgi Viki leheküljel, samuti ei ole nad kasutusel teiste lehekülgede osana.',
@@ -2028,33 +2062,39 @@ Toetatud protokollid: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Eemaldada ennast kõigist rühmadest',
# E-mail user
-'mailnologin' => 'Saatja aadress puudub',
-'mailnologintext' => 'Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.',
-'emailuser' => 'Saada sellele kasutajale e-kiri',
-'emailpage' => 'Saada kasutajale e-kiri',
-'emailpagetext' => 'Kui see kasutaja on oma eelistuste lehel sisestanud e-posti aadressi, saad alloleva vormi kaudu talle kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli "Kellelt" e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste lehel]].',
-'usermailererror' => 'Saatmise viga:',
-'defemailsubject' => 'E-kiri {{GRAMMAR:elative|{{SITENAME}}}}',
-'noemailtitle' => 'E-posti aadressi pole',
-'noemailtext' => 'See kasutaja pole määranud kehtivat e-posti aadressi.',
-'nowikiemailtitle' => 'E-kirja saatmine ei ole lubatud',
-'nowikiemailtext' => 'See kasutaja ei soovi e-posti teistelt kasutajatelt.',
-'email-legend' => 'Saada e-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale',
-'emailfrom' => 'Kellelt:',
-'emailto' => 'Kellele:',
-'emailsubject' => 'Pealkiri:',
-'emailmessage' => 'Sõnum:',
-'emailsend' => 'Saada',
-'emailccme' => 'Saada mulle koopia.',
-'emailccsubject' => 'Koopia sinu sõnumist kasutajale $1: $2',
-'emailsent' => 'E-post saadetud',
-'emailsenttext' => 'Sinu teade on e-kirjaga saadetud.',
-'emailuserfooter' => 'Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu "Saada sellele kasutajale e-kiri" abil.',
+'mailnologin' => 'Saatja aadress puudub',
+'mailnologintext' => 'Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.',
+'emailuser' => 'Saada sellele kasutajale e-kiri',
+'emailpage' => 'Saada kasutajale e-kiri',
+'emailpagetext' => 'Kui see kasutaja on oma eelistuste lehel sisestanud e-posti aadressi, saad alloleva vormi kaudu talle kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli "Kellelt" e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste lehel]].',
+'usermailererror' => 'Saatmise viga:',
+'defemailsubject' => 'E-kiri {{GRAMMAR:elative|{{SITENAME}}}}',
+'usermaildisabled' => 'Kasutajatele e-kirjade saatmine keelatud',
+'usermaildisabledtext' => 'Selles vikis ei saa teistele kasutajatele e-kirju saata.',
+'noemailtitle' => 'E-posti aadressi pole',
+'noemailtext' => 'See kasutaja pole määranud kehtivat e-posti aadressi.',
+'nowikiemailtitle' => 'E-kirja saatmine ei ole lubatud',
+'nowikiemailtext' => 'See kasutaja ei soovi e-posti teistelt kasutajatelt.',
+'email-legend' => 'Saada e-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale',
+'emailfrom' => 'Kellelt:',
+'emailto' => 'Kellele:',
+'emailsubject' => 'Pealkiri:',
+'emailmessage' => 'Sõnum:',
+'emailsend' => 'Saada',
+'emailccme' => 'Saada mulle koopia.',
+'emailccsubject' => 'Koopia sinu sõnumist kasutajale $1: $2',
+'emailsent' => 'E-post saadetud',
+'emailsenttext' => 'Sinu teade on e-kirjaga saadetud.',
+'emailuserfooter' => 'Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu "Saada sellele kasutajale e-kiri" abil.',
+
+# User Messenger
+'usermessage-summary' => 'Jätan süsteemiteate.',
+'usermessage-editor' => 'Süsteemiteadete edastaja',
# Watchlist
'watchlist' => 'Jälgimisloend',
'mywatchlist' => 'Jälgimisloend',
-'watchlistfor' => "(kasutajale '''$1''')",
+'watchlistfor2' => 'Kasutaja $1 $2 jaoks',
'nowatchlist' => 'Sinu jälgimisloend on tühi.',
'watchlistanontext' => 'Oma jälgimisloendi nägemiseks ja muutmiseks pead $1.',
'watchnologin' => 'Ei ole sisse logitud',
@@ -2117,6 +2157,9 @@ Abivalmilt
{{GRAMMAR:genitive|{{SITENAME}}}} teavitussüsteem
--
+E-kirjatsi saabuvate teavituste sätteid saad muuta leheküljel
+{{fullurl:{{#special:Preferences}}}}.
+
Oma jälgimisloendi sätete muutmiseks mine leheküljele
{{fullurl:Special:Watchlist/edit}}.
@@ -2173,7 +2216,10 @@ Lehte muutis viimasena [[User:$3|$3]] ([[User talk:$3|arutelu]]{{int:pipe-separa
'revertpage-nouser' => 'Tühistati eemaldatud nimega kasutaja tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].',
'rollback-success' => 'Tühistati $1 muudatus;
pöörduti tagasi viimasele muudatusele, mille tegi $2.',
-'sessionfailure' => 'Sinu sisselogimisseansiga näib probleem olevat.
+
+# Edit tokens
+'sessionfailure-title' => 'Seansiviga',
+'sessionfailure' => 'Sinu sisselogimisseansiga näib probleem olevat.
See toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.
Mine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.',
@@ -2307,18 +2353,22 @@ $1',
'month' => 'Alates kuust (ja varasemad):',
'year' => 'Alates aastast (ja varasemad):',
-'sp-contributions-newbies' => 'Näita ainult uute kasutajate kaastööd.',
-'sp-contributions-newbies-sub' => 'Uute kontode kaastöö',
-'sp-contributions-newbies-title' => 'Uute kasutajate kaastöö',
-'sp-contributions-blocklog' => 'blokeerimised',
-'sp-contributions-deleted' => 'kustutatud kaastöö',
-'sp-contributions-logs' => 'logid',
-'sp-contributions-talk' => 'arutelu',
-'sp-contributions-userrights' => 'kasutaja õiguste muutmine',
-'sp-contributions-blocked-notice' => 'See kasutaja on parajasti blokeeritud. Allpool on toodud kõige hilisem blokeerimislogi sissekanne:',
-'sp-contributions-search' => 'Kaastöö otsimine',
-'sp-contributions-username' => 'IP-aadress või kasutajanimi:',
-'sp-contributions-submit' => 'Otsi',
+'sp-contributions-newbies' => 'Näita ainult uute kasutajate kaastööd',
+'sp-contributions-newbies-sub' => 'Uute kontode kaastöö',
+'sp-contributions-newbies-title' => 'Uute kasutajate kaastöö',
+'sp-contributions-blocklog' => 'blokeerimised',
+'sp-contributions-deleted' => 'kustutatud kaastöö',
+'sp-contributions-uploads' => 'üleslaadimised',
+'sp-contributions-logs' => 'logid',
+'sp-contributions-talk' => 'arutelu',
+'sp-contributions-userrights' => 'kasutaja õiguste muutmine',
+'sp-contributions-blocked-notice' => 'See kasutaja on parajasti blokeeritud. Allpool on toodud kõige hilisem blokeerimislogi sissekanne:',
+'sp-contributions-blocked-notice-anon' => 'See IP-aadress on parajasti blokeeritud.
+Allpool on toodud viimane blokeerimislogi sissekanne:',
+'sp-contributions-search' => 'Kaastöö otsimine',
+'sp-contributions-username' => 'IP-aadress või kasutajanimi:',
+'sp-contributions-toponly' => 'Ainult uusimad redaktsioonid',
+'sp-contributions-submit' => 'Otsi',
# What links here
'whatlinkshere' => 'Lingid siia',
@@ -2378,7 +2428,6 @@ Kehtivaid blokeeringuid vaata [[Special:IPBlockList|blokeeringute loendist]].',
'ipb-edit-dropdown' => 'Muuda blokeeringu põhjuseid',
'ipb-unblock-addr' => 'Kustuta $1 blokeering',
'ipb-unblock' => 'Kasutaja või IP-aadressi vabastamine blokeerimisest',
-'ipb-blocklist-addr' => 'Kasutaja $1 blokeeringud',
'ipb-blocklist' => 'Vaata kehtivaid keelde',
'ipb-blocklist-contribs' => 'Kasutaja $1 kaastöö',
'unblockip' => 'Blokeerimise eemaldamine',
@@ -2449,6 +2498,8 @@ See kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.',
Sa ei saa kasutajakontot luua.',
'cant-block-while-blocked' => 'Teisi kasutajaid ei saa blokeerida, kui oled ise blokeeritud.',
'cant-see-hidden-user' => 'Kasutaja, keda blokeerida üritad, on juba blokeeritud ning peidetud. Kuna sul pole õigust blokeerida kasutajanimesid, peites need avalikkuse eest, ei saa sa selle kasutaja blokeeringut vaadata ega muuta.',
+'ipbblocked' => 'Sa ei saa teisi blokeerida ega nende blokeeringuid eemaldada, sest oled ise blokeeritud.',
+'ipbnounblockself' => 'Sul pole lubatud enda blokeeringut eemaldada.',
# Developer tools
'lockdb' => 'Lukusta andmebaas',
@@ -2486,6 +2537,17 @@ See tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, k
'''Hoiatus!'''
Tegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;
enne jätkamist teadvusta palun tagajärgi.",
+'movepagetext-noredirectfixer' => "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.
+Praeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.
+Kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].
+Sinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.
+
+Pane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.
+See tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.
+
+'''Hoiatus!'''
+Tegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;
+enne jätkamist teadvusta palun tagajärgi.",
'movepagetalktext' => "Koos artiklileheküljega teisaldatakse automaatselt ka arutelulehekülg, '''välja arvatud juhtudel, kui:'''
*uue pealkirja all on juba arutelulehekülg, mis pole tühi;
*jätad alloleva märkeruudu valimata.
@@ -2540,6 +2602,7 @@ Kas kustutad selle, et luua võimalus teisaldamiseks?',
'immobile-source-page' => 'Lehekülg ei ole teisaldatav.',
'immobile-target-page' => 'Soovitud pealkirja alla ei saa teisaldada.',
'imagenocrossnamespace' => 'Faili ei saa teisaldada mõnda muusse nimeruumi',
+'nonfile-cannot-move-to-file' => 'Failinimeruumi saab ainult faile teisaldada.',
'imagetypemismatch' => 'Uus faililaiend ei sobi selle tüübiga',
'imageinvalidfilename' => 'Sihtmärgi nimi on vigane',
'fix-double-redirects' => 'Värskenda kõik siia viitavad ümbersuunamislehed uuele pealkirjale',
@@ -2619,6 +2682,7 @@ Salvesta see oma arvutisse ja laadi siia üles.',
'importstart' => 'Impordin lehekülgi...',
'import-revision-count' => '$1 {{PLURAL:$1|versioon|versiooni}}',
'importnopages' => 'Ei olnud imporditavaid lehekülgi.',
+'imported-log-entries' => 'Imporditi $1 {{PLURAL:$1|logisissekanne|logisissekannet}}.',
'importfailed' => 'Importimine ebaõnnestus: <nowiki>$1</nowiki>',
'importunknownsource' => 'Unknown import source type
Tundmatu tüüpi algallikas',
@@ -2718,6 +2782,8 @@ Saad vaadata selle lähteteksti.',
'tooltip-rollback' => 'Tühistab ühe klõpsuga viimase kaastöölise tehtud muudatused.',
'tooltip-undo' => '"Eemalda" tühistab selle muudatuse ja avab teksti eelvaatega redigeerimisakna.
Samuti võimaldab see resümee reale põhjenduse lisamist.',
+'tooltip-preferences-save' => 'Salvesta eelistused',
+'tooltip-summary' => 'Kirjuta lühike kokkuvõte',
# Stylesheets
'common.css' => '/* Siinset CSS-i kasutavad kõik kujundused. */',
@@ -2830,14 +2896,17 @@ Selle avamine võib su arvutit kahjustada.",
'imagemaxsize' => "Pildi suuruse ülemmäär:<br />''(faili kirjeldusleheküljel)''",
'thumbsize' => 'Pisipildi suurus:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|lehekülg|lehekülge}}',
-'file-info' => '(faili suurus: $1, MIME tüüp: $2)',
-'file-info-size' => '($1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4)',
+'file-info' => 'faili suurus: $1, MIME tüüp: $2',
+'file-info-size' => '$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4',
'file-nohires' => '<small>Sellest suuremat pilti pole.</small>',
-'svg-long-desc' => '(SVG fail, algsuurus $1 × $2 pikslit, faili suurus: $3)',
+'svg-long-desc' => 'SVG fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
'show-big-image' => 'Originaalsuurus',
'show-big-image-thumb' => '<small>Selle eelvaate suurus: $1 × $2 pikslit</small>',
'file-info-gif-looped' => 'korduv',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
+'file-info-png-looped' => 'korduv',
+'file-info-png-repeat' => 'mängitud $1 {{PLURAL:$1|korra|korda}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
# Special:NewFiles
'newimages' => 'Uute meediafailide galerii',
@@ -2966,6 +3035,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
'exif-gpsdestdistance' => 'Sihtmärgi kaugus',
'exif-gpsareainformation' => 'GPS-ala nimi',
'exif-gpsdatestamp' => 'GPS kuupäev',
+'exif-objectname' => 'Lühipealkiri',
# EXIF attributes
'exif-compression-1' => 'Pakkimata',
@@ -3112,25 +3182,25 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
'limitall' => 'iga',
# E-mail address confirmation
-'confirmemail' => 'E-posti aadressi kinnitamine',
-'confirmemail_noemail' => 'Sul ei ole e-aadress määratud [[Special:Preferences|eelistustes]].',
-'confirmemail_text' => 'Enne kui saad e-postiga seotud teenuseid kasutada, pead oma e-posti aadressi õigsust kinnitama. Allpool olevat nuppu klõpsates saadetakse sulle e-posti teel kinnituskood. Aadressi kinnitamiseks klõpsa e-kirjas olevat linki.',
-'confirmemail_pending' => 'Kinnituskood on juba saadetud. Kui tegid konto hiljuti, oota palun mõni minut selle saabumist, enne kui üritad uuesti.',
-'confirmemail_send' => 'Saada kinnituskood',
-'confirmemail_sent' => 'Kinnitus-e-kiri saadetud.',
-'confirmemail_oncreate' => 'Kinnituskood saadeti e-posti aadressile. See kood ei ole vajalik sisselogimisel, kuid seda on vaja, et kasutada vikis e-postipõhiseid toiminguid.',
-'confirmemail_sendfailed' => 'Kinnitus-e-kirja ei õnnestunud saata.
+'confirmemail' => 'E-posti aadressi kinnitamine',
+'confirmemail_noemail' => 'Sul ei ole e-aadress määratud [[Special:Preferences|eelistustes]].',
+'confirmemail_text' => 'Enne kui saad e-postiga seotud teenuseid kasutada, pead oma e-posti aadressi õigsust kinnitama. Allpool olevat nuppu klõpsates saadetakse sulle e-posti teel kinnituskood. Aadressi kinnitamiseks klõpsa e-kirjas olevat linki.',
+'confirmemail_pending' => 'Kinnituskood on juba saadetud. Kui tegid konto hiljuti, oota palun mõni minut selle saabumist, enne kui üritad uuesti.',
+'confirmemail_send' => 'Saada kinnituskood',
+'confirmemail_sent' => 'Kinnitus-e-kiri saadetud.',
+'confirmemail_oncreate' => 'Kinnituskood saadeti e-posti aadressile. See kood ei ole vajalik sisselogimisel, kuid seda on vaja, et kasutada vikis e-postipõhiseid toiminguid.',
+'confirmemail_sendfailed' => 'Kinnitus-e-kirja ei õnnestunud saata.
Kontrolli aadressi õigsust.
Veateade e-kirja saatmisel: $1',
-'confirmemail_invalid' => 'Vigane kinnituskood, kinnituskood võib olla aegunud.',
-'confirmemail_needlogin' => 'Pead oma e-posti aadressi kinnitamiseks $1.',
-'confirmemail_success' => 'Sinu e-posti aadress on kinnitatud
+'confirmemail_invalid' => 'Vigane kinnituskood, kinnituskood võib olla aegunud.',
+'confirmemail_needlogin' => 'Pead oma e-posti aadressi kinnitamiseks $1.',
+'confirmemail_success' => 'Sinu e-posti aadress on kinnitatud
Võid nüüd [[Special:UserLogin|sisse logida]].',
-'confirmemail_loggedin' => 'Sinu e-posti aadress on nüüd kinnitatud.',
-'confirmemail_error' => 'Viga kinnituskoodi salvestamisel.',
-'confirmemail_subject' => '{{GRAMMAR:genitive|{{SITENAME}}}} e-posti aadressi kinnitamine',
-'confirmemail_body' => 'Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto "$2".
+'confirmemail_loggedin' => 'Sinu e-posti aadress on nüüd kinnitatud.',
+'confirmemail_error' => 'Viga kinnituskoodi salvestamisel.',
+'confirmemail_subject' => '{{GRAMMAR:genitive|{{SITENAME}}}} e-posti aadressi kinnitamine',
+'confirmemail_body' => 'Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto "$2".
Kinnitamaks, et see kasutajakonto tõepoolest kuulub sulle ning e-posti teenuste aktiveerimiseks, ava oma võrgulehitsejas järgnev link:
@@ -3141,8 +3211,32 @@ Kui see *pole* sinu loodud konto, ava järgnev link kinnituse tühistamiseks:
$5
Kinnituskood aegub kuupäeval $4.',
-'confirmemail_invalidated' => 'E-posti aadressi kinnitamine tühistati',
-'invalidateemail' => 'E-posti aadressi kinnituse tühistamine',
+'confirmemail_body_changed' => 'Keegi IP-aadressilt $1, ilmselt sa ise,
+muutis {{GRAMMAR:inessive|{{SITENAME}}}} konto "$2" e-posti aadressiks selle aadressi.
+
+Kinnitamaks, et see konto tõepoolest kuulub sulle ja e-posti teenuste taasaktiveerimiseks, ava oma veebilehitsejas järgnev link:
+
+$3
+
+Kui see *pole* sinu konto, ava järgnev link
+kinnituse tühistamiseks:
+
+$5
+
+Kinnituskood aegub kuupäeval $4.',
+'confirmemail_body_set' => 'Keegi, arvatavasti sina ise, IP-aadressilt $1 on {{GRAMMAR:genitive|{{SITENAME}}}} konto "$2" e-posti aadressiks määranud selle aadressi.
+
+Kinnitamaks, et see konto kuulub tõesti sulle ja {{GRAMMAR:genitive|{{SITENAME}}}} e-posti funktsioonide taasaktiveerimiseks ava oma võrgulehitsejas järgmine link:
+
+$3
+
+Kui konto *ei* kuulu sulle, kasuta e-posti aadressi kinnituse tühistamiseks järgmist linki:
+
+$5
+
+Selle kinnituskoodi aegumistähtaeg on $4.',
+'confirmemail_invalidated' => 'E-posti aadressi kinnitamine tühistati',
+'invalidateemail' => 'E-posti aadressi kinnituse tühistamine',
# Scary transclusion
'scarytranscludetoolong' => '[URL on liiga pikk]',
@@ -3176,6 +3270,7 @@ Palun kinnita, et soovid tõesti selle lehekülje taasluua.",
'table_pager_first' => 'Esimene lehekülg',
'table_pager_last' => 'Viimane lehekülg',
'table_pager_limit' => 'Näita leheküljel $1 üksust',
+'table_pager_limit_label' => 'Üksusi lehekülje kohta:',
'table_pager_limit_submit' => 'Mine',
'table_pager_empty' => 'Ei ole tulemusi',
@@ -3232,6 +3327,7 @@ Sa võid [[Special:Watchlist/edit|kasutada ka harilikku tekstiredaktorit]].',
'version-specialpages' => 'Erileheküljed',
'version-parserhooks' => 'Süntaksianalüsaatori lisad (Parser hooks)',
'version-variables' => 'Muutujad',
+'version-skins' => 'Kujundused',
'version-other' => 'Muu',
'version-mediahandlers' => 'Meediatöötlejad',
'version-hooks' => 'Redaktsioon',
@@ -3243,6 +3339,13 @@ Sa võid [[Special:Watchlist/edit|kasutada ka harilikku tekstiredaktorit]].',
'version-hook-subscribedby' => 'Tellijad',
'version-version' => '(Versioon $1)',
'version-license' => 'Litsents',
+'version-poweredby-credits' => "See viki kasutab '''[http://www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001-$1 $2.",
+'version-poweredby-others' => 'teised',
+'version-license-info' => "MediaWiki on vaba tarkvara; tohid seda taaslevitada ja/või selle põhjal teisendeid luua vastavalt Vaba Tarkvara Fondi avaldatud GNU Üldise Avaliku Litsentsi versioonis 2 või hilisemas seatud tingimustele.
+
+MediaWiki tarkvara levitatakse lootuses, et see on kasulik, aga '''igasuguse tagatiseta''', ka kaudse tagatiseta teose '''turustatavuse''' või '''müügikõlblikkuse''' kohta. Üksikasjad leiad GNU Üldisest Avalikust Litsentsist.
+
+GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks selle programmiga kaasas olema; kui pole, kirjuta aadressil Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA või [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html loe seda võrgust].",
'version-software' => 'Paigaldatud tarkvara',
'version-software-product' => 'Toode',
'version-software-version' => 'Versioon',
@@ -3313,6 +3416,15 @@ Sisesta faili nimi eesliiteta "{{ns:file}}:".',
'tags-edit' => 'muuda',
'tags-hitcount' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
+# Special:ComparePages
+'comparepages' => 'Lehekülgede kõrvutamine',
+'compare-selector' => 'Lehekülje redaktsioonide kõrvutamine',
+'compare-page1' => 'Lehekülg 1',
+'compare-page2' => 'Lehekülg 2',
+'compare-rev1' => 'Redaktsioon&nbsp;1',
+'compare-rev2' => 'Redaktsioon&nbsp;2',
+'compare-submit' => 'Kõrvuta',
+
# Database error messages
'dberr-header' => 'Selles vikis on probleem',
'dberr-problems' => 'Kahjuks on sellel saidil tehnilisi probleeme',
@@ -3329,6 +3441,7 @@ Sisesta faili nimi eesliiteta "{{ns:file}}:".',
'htmlform-float-invalid' => 'Määratud väärtus ei ole arvuline.',
'htmlform-int-toolow' => 'Antud suurus on väiksem kui minimaalne $1',
'htmlform-int-toohigh' => 'Antud suurus on suurem kui maksimaalne $1',
+'htmlform-required' => 'See väärtus on nõutav',
'htmlform-submit' => 'Saada',
'htmlform-reset' => 'Tühista muudatused',
'htmlform-selectorother-other' => 'Muu',
diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php
index ab65c77c..190fa97b 100644
--- a/languages/messages/MessagesEu.php
+++ b/languages/messages/MessagesEu.php
@@ -138,8 +138,7 @@ $messages = array(
'tog-editsection' => 'Atalak [aldatu] loturen bitartez aldatzeko aukera gaitu',
'tog-editsectiononrightclick' => 'Atalen izenburuetan klik eginez atala<br />aldatzea gaitu (JavaScript)',
'tog-showtoc' => 'Edukien taula erakutsi (3 goiburukotik gorako orrialdeentzako)',
-'tog-rememberpassword' => 'Nire saioa ordenagailu honetan gogoratu (gomendatua)',
-'tog-editwidth' => 'Testuaren taula zabaldu pantaila osoa bete dadin',
+'tog-rememberpassword' => 'Nire saioa ordenagailu honetan gorde ({{PLURAL:$1|egun baterako| $1 egunerako}} gehienez)',
'tog-watchcreations' => 'Sortzen ditudan orrialdeak nire segimendu zerrendara gehitu',
'tog-watchdefault' => 'Aldatzen ditudan orrialdeak nire segimendu zerrendara gehitu',
'tog-watchmoves' => 'Izena aldatutako orrialdeak segimendu zerrendan erakutsi',
@@ -262,7 +261,7 @@ $messages = array(
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]',
-'about' => 'Honi Buruz',
+'about' => 'Honi buruz',
'article' => 'Artikulua',
'newwindow' => '(leiho berrian irekitzen da)',
'cancel' => 'Utzi',
@@ -285,31 +284,21 @@ $messages = array(
'faqpage' => 'Project:Maiz egindako galderak',
# Vector skin
-'vector-action-addsection' => 'Mintzagaia gehitu',
-'vector-action-delete' => 'Ezabatu',
-'vector-action-move' => 'Mugitu',
-'vector-action-protect' => 'Babestu',
-'vector-action-undelete' => 'Berreskuratu',
-'vector-action-unprotect' => 'Babesgabetu',
-'vector-namespace-category' => 'Kategoria',
-'vector-namespace-help' => 'Laguntza-orria',
-'vector-namespace-image' => 'Fitxategi',
-'vector-namespace-main' => 'Orrialde',
-'vector-namespace-media' => 'Ikus-entzunezkoen orrialdea',
-'vector-namespace-mediawiki' => 'Mezua',
-'vector-namespace-project' => 'Proiektu-orrialde',
-'vector-namespace-special' => 'Orrialde berezia',
-'vector-namespace-talk' => 'Eztabaida',
-'vector-namespace-template' => 'Txantiloi',
-'vector-namespace-user' => 'Erabiltzaile-orria',
-'vector-view-create' => 'Sortu',
-'vector-view-edit' => 'Aldatu',
-'vector-view-history' => 'Historia ikusi',
-'vector-view-view' => 'Irakurri',
-'vector-view-viewsource' => 'Kodea ikusia',
-'actions' => 'Ekintzak',
-'namespaces' => 'Izen-tarteak',
-'variants' => 'Aldaerak',
+'vector-action-addsection' => 'Mintzagaia gehitu',
+'vector-action-delete' => 'Ezabatu',
+'vector-action-move' => 'Mugitu',
+'vector-action-protect' => 'Babestu',
+'vector-action-undelete' => 'Berreskuratu',
+'vector-action-unprotect' => 'Babesgabetu',
+'vector-simplesearch-preference' => 'Baimendu bilaketa gomendio hobetuak (Vector itxurarekin bakarrik)',
+'vector-view-create' => 'Sortu',
+'vector-view-edit' => 'Aldatu',
+'vector-view-history' => 'Historia ikusi',
+'vector-view-view' => 'Irakurri',
+'vector-view-viewsource' => 'Kodea ikusia',
+'actions' => 'Ekintzak',
+'namespaces' => 'Izen-tarteak',
+'variants' => 'Aldaerak',
'errorpagetitle' => 'Errorea',
'returnto' => '$1(e)ra itzuli.',
@@ -370,6 +359,8 @@ Erabiltzaile gehiegi ari da orrialde hau ikusi nahiean.
Mesedez itxaron ezazu unetxo bat orrialde honetara berriz sartzen saiatu baino lehen.
$1',
+'pool-queuefull' => 'Prozesuen zerrenda beteta dago',
+'pool-errorunknown' => 'Errore ezezaguna',
# 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}}(e)ri buruz',
@@ -533,7 +524,8 @@ Zure kontua sortu egin da. Ez ahaztu [[Special:Preferences|{{SITENAME}}(e)ko hob
'yourname' => 'Erabiltzaile izena',
'yourpassword' => 'Pasahitza:',
'yourpasswordagain' => 'Pasahitza berriz',
-'remembermypassword' => 'Nire saioa ordenagailu honetan gogoratu (gomendaturikoa)',
+'remembermypassword' => 'Nire saioa ordenagailu honetan gogoratu ({{PLURAL:$1|egun baterako|$1 egunetarako }} gehienez)',
+'securelogin-stick-https' => 'Mantendu konektatua HTTPSra sartu ondoren',
'yourdomainname' => 'Zure domeinua',
'externaldberror' => 'Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.',
'login' => 'Saioa hasi',
@@ -550,6 +542,7 @@ Zure kontua sortu egin da. Ez ahaztu [[Special:Preferences|{{SITENAME}}(e)ko hob
'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
'gotaccountlink' => 'Saioa hasi',
'createaccountmail' => 'e-postaz',
+'createaccountreason' => 'Arrazoia:',
'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago.
Mesedez, beste bat aukeratu.',
@@ -570,6 +563,7 @@ Egiaztatu ondo idatzi duzun, edo [[Special:UserLogin/signup|kontu berria sor eza
'wrongpasswordempty' => 'Pasahitza hutsik dago. Saiatu berriz.',
'passwordtooshort' => 'Pasahitzek {{PLURAL:$1|karaktere 1|$1 karaktere}} gutxienez eduki behar dituzte.',
'password-name-match' => 'Zure pasahitza ezin da zure erabiltzaile-izen bera izan.',
+'password-login-forbidden' => 'Erabiltzaile izen eta pasahitz hau erabiltzea debekaturik dago.',
'mailmypassword' => 'Pasahitza berria e-postaz bidali',
'passwordremindertitle' => 'Pasahitzaren gogorarazpena {{SITENAME}}(e)tik',
'passwordremindertext' => 'Norbaitek (ziurrenik zuk, $1 IP helbidetik) pasahitz berri bat
@@ -612,6 +606,9 @@ Berriro saiatu aurretik itxaron ezazu, mesedez.',
'loginlanguagelabel' => 'Hizkuntza: $1',
'suspicious-userlogout' => 'Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHPren mail() funtzioan arazo ezezagun bat egon da.',
+
# Password reset dialog
'resetpass' => 'Pasahitza aldatu',
'resetpass_announce' => 'E-postaz jasotako kode tenporal baten bidez saioa hasi duzu. Saioa hasierarekin jarraitzeko, pasahitz berri bat definitu beharra daukazu:',
@@ -663,9 +660,10 @@ Agian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat
'showlivepreview' => 'Zuzeneko aurrebista',
'showdiff' => 'Aldaketak erakutsi',
'anoneditwarning' => "'''Oharra:''' Ez duzu saioa hasi. Zure IP helbidea orrialde honetako historian gordeko da.",
+'anonpreviewwarning' => "''Ez duzu saioa hasi. Gordez gero, zure IP helbidea grabatuko da orri honen edizio historian.''",
'missingsummary' => "'''Gogorarazpena:''' Ez duzu aldaketa laburpen bat zehaztu. Berriz ere gordetzeko aukeratzen baduzu, laburpen mezurik gordeko da.",
'missingcommenttext' => 'Mesedez, iruzkin bat idatzi jarraian.',
-'missingcommentheader' => "'''Oharra:''' Ez duzu iruzkin honentzako gai/goiburuko bat ezarri. Berriz gordetzeko aukeratzen baduzu, hutsune horrekin gorde egingo da.",
+'missingcommentheader' => "'''Oharra:''' Ez duzu iruzkin honetarako gairik edo goiburukorik ezarri. «{{int:Savearticle}}» klikatzen baduzu, hutsune horrekin gordeko da.",
'summary-preview' => 'Laburpenaren aurreikuspena:',
'subject-preview' => 'Gaia/Izenburuaren aurreikuspena:',
'blockedtitle' => 'Erabiltzailea blokeatuta dago',
@@ -735,7 +733,11 @@ Azken blokeoaren erregistroa ageri da behean, erreferentzia gisa:',
'usercsspreview' => "'''Ez ahaztu zure CSS kodea aurreikusten zabiltzala.'''
'''Oraindik gorde gabe dago!'''",
'userjspreview' => "'''Gogoratu zure JavaScript kodea probatu/aurreikusten zabiltzala, oraindik ez da gorde!'''",
-'userinvalidcssjstitle' => "'''Oharra:''' Ez da \"\$1\" itxura existitzen. Kontuan izan .css eta .js fitxategi pertsonalizatuen izenak letra xehez idatzi behar direla; adibidez, {{ns:user}}:Adibide/monobook.css, eta ez {{ns:user}}:Adibide/Monobook.css.",
+'sitecsspreview' => "'''Ez ahaztu zure CSS kodea aurreikusten zabiltzala.'''
+'''Oraindik gorde gabe dago!'''",
+'sitejspreview' => "'''Gogoratu zure JavaScript kodea probatu/aurreikusten zabiltzala'''
+'''Oraindik ez da gorde!'''",
+'userinvalidcssjstitle' => "'''Oharra:''' Ez da \"\$1\" itxura existitzen. Kontuan izan .css eta .js fitxategi pertsonalizatuen izenak letra xehez idatzi behar direla; adibidez, {{ns:user}}:Adibide/vector.css, eta ez {{ns:user}}:Adibide/Vector.css.",
'updated' => '(Eguneratua)',
'note' => "'''Oharra:'''",
'previewnote' => "'''Gogoratu hau aurreikusketa bat dela, beraz gorde egin beharko duzu!'''",
@@ -769,7 +771,6 @@ Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza pub
'copyrightwarning2' => "Mesedez, kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak besteek aldatu edo ezabatu ditzaketela. Ez baduzu besteek aldaketak egitea nahi, ez ezazu bidali.<br />
Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara (ikus $1 informazio gehiagorako).
'''EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!'''",
-'longpagewarning' => "'''OHARRA: Orrialde honek $1 kilobyteko tamaina du; nabigatzaile batzuek arazoak izan litzakete 32 kb-tik gorako testuekin. Mesedez, saiatu orrialdea atal txikiagoetan banatzen.'''",
'longpageerror' => "'''ERROREA: Bidali duzun testuak $1 kilobyteko luzera du, eta $2 kilobyteko maximoa baino luzeagoa da. Ezin da gorde.'''",
'readonlywarning' => "'''OHARRA: Datu-basea blokeatu egin da mantenu lanak burutzeko, beraz ezingo dituzu orain zure aldaketak gorde. Testua fitxategi baten kopiatu dezakezu, eta beranduago erabiltzeko gorde.
@@ -943,6 +944,8 @@ $1",
'logdelete-failure' => "'''Erregistroaren ikusgaitasuna ezin da honela ezarri:'''
$1",
'revdel-restore' => 'Ikusgarritasuna aldatu',
+'revdel-restore-deleted' => 'ezabatutako berraztertzeak',
+'revdel-restore-visible' => 'ageriko berrikuspenak',
'pagehist' => 'Orriaren historia',
'deletedhist' => 'Ezabatutako historia',
'revdelete-content' => 'edukia',
@@ -1012,11 +1015,12 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
# Diffs
'history-title' => '"$1" orrialdearen historia laburpena',
'difference' => '(Bertsioen arteko ezberdintasunak)',
+'difference-multipage' => '(Orrialdeen arteko ezberdintasunak)',
'lineno' => '$1. lerroa:',
'compareselectedversions' => 'Hautatutako bertsioak alderatu',
'showhideselectedversions' => 'Erakutsi/izkutatu aukeratutako berrikuspenak',
'editundo' => 'desegin',
-'diff-multi' => '({{PLURAL:$1|Ez da tarteko berrikuspen 1|Ez dira tarteko $1 berrikuspen}} erakusten.)',
+'diff-multi' => '({{PLURAL:$1|Ez da tarteko berrikuspen bat|Ez dira tarteko $1 berrikuspen}} erakusten {{PLURAL:$2|lankide batena|$2 lankiderena}}.)',
# Search results
'searchresults' => 'Bilaketaren emaitzak',
@@ -1051,6 +1055,7 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
'searchprofile-everything-tooltip' => 'Bilatu eduki guztian (lankide orrialdeak barne)',
'searchprofile-advanced-tooltip' => 'Lankideen izen zehatzetan bilatu',
'search-result-size' => '$1 ({{PLURAL:$2|hitz bat|$2 hitz}})',
+'search-result-category-size' => '{{PLURAL:$1|kide 1|$1 kide}} ({{PLURAL:$2|azpikategoria 1|$2 azpikategoria}}, {{PLURAL:$3|fitxategi 1|$3 fitxategi}})',
'search-result-score' => 'Garrantzia: %$1',
'search-redirect' => '($1 birzuzenketa)',
'search-section' => '($1 atala)',
@@ -1126,6 +1131,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'contextlines' => 'Lerro emaitzako:',
'contextchars' => 'Lerro bakoitzeko karaktere kopurua:',
'stub-threshold' => '<a href="#" class="stub">stub link</a> formaturako atalasea (byteak):',
+'stub-threshold-disabled' => 'Ezgaitua',
'recentchangesdays' => 'Aldaketa berrietan erakutsi beharreko egun kopurua:',
'recentchangesdays-max' => '(gehienez {{PLURAL:$1|egun $1|$1 egun}})',
'recentchangescount' => 'Erakusteko aldaketa kopurua, lehenetsita:',
@@ -1156,6 +1162,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'prefs-files' => 'Fitxategiak',
'prefs-custom-css' => 'CSS pertsonalizatua',
'prefs-custom-js' => 'JS pertsonalizatua',
+'prefs-common-css-js' => 'Azal mota guztietan elkarbanatutako CSS/JS:',
'prefs-emailconfirm-label' => 'E-posta baieztapena:',
'prefs-textboxsize' => 'Editatze lehioaren tamaina',
'youremail' => 'E-posta:',
@@ -1191,9 +1198,15 @@ Gainera beste lankideek zurekin kontakta dezakete zure lankide edo lankide_eztab
'prefs-advancedrendering' => 'Aukera aurreratuak',
'prefs-advancedsearchoptions' => 'Aukera aurreratuak',
'prefs-advancedwatchlist' => 'Aukera aurreratuak',
-'prefs-display' => 'Aukerak erakutsi',
+'prefs-displayrc' => 'Aukerak erakutsi',
+'prefs-displaysearchoptions' => 'Aukerak erakutsi',
+'prefs-displaywatchlist' => 'Aukerak erakutsi',
'prefs-diffs' => 'Ezberdintasunak',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-posta helbidea zuzena dela dirudi',
+'email-address-validity-invalid' => 'E-posta helbide zuzena idatzi',
+
# User rights
'userrights' => 'Erabiltzaile baimenen kudeaketa',
'userrights-lookup-user' => 'Erabiltzaile taldeak kudeatu',
@@ -1277,6 +1290,7 @@ Gainera beste lankideek zurekin kontakta dezakete zure lankide edo lankide_eztab
'right-hideuser' => 'Erabiltzaile izen bat blokeatu, publikotik izkutatuz',
'right-ipblock-exempt' => 'IP blokeoen, auto-blokeoen eta maila blokeoen gainetik pasa.',
'right-proxyunbannable' => 'Proxyen blokeo automatikoen gainetik pasa',
+'right-unblockself' => 'Beren burua desblokeatu',
'right-protect' => 'Orrialde babestuak aldatu eta babes maila aldatu',
'right-editprotected' => 'Babestutako orrialdeak aldatu (babes jauzirik gabe)',
'right-editinterface' => 'Erabiltzailearen interfazea aldatu',
@@ -1299,7 +1313,6 @@ Gainera beste lankideek zurekin kontakta dezakete zure lankide edo lankide_eztab
'right-siteadmin' => 'Databasea blokeatu eta desblokeatu',
'right-reset-passwords' => 'Bese erabiltzaile batzuen pasahitzak berritu',
'right-override-export-depth' => '5eko sakonerararteko loturiko orrialdeak barne esportatu',
-'right-versiondetail' => 'Software bertsio zabalduaren informazioa erakutsi',
'right-sendemail' => 'Beste erabiltzaileei e-posta bidali',
# User rights log
@@ -1350,14 +1363,9 @@ Gainera beste lankideek zurekin kontakta dezakete zure lankide edo lankide_eztab
'recentchanges-legend' => 'Azken aldaketen aukerak',
'recentchangestext' => 'Orrialde honetan wiki honetan egindako azken aldaketak erakusten dira.',
'recentchanges-feed-description' => 'Sindikazio honetan wikian eginiko azkeneko aldaketak jarrai daitezke.',
-'recentchanges-label-legend' => 'Legenda: $1',
-'recentchanges-legend-newpage' => '$1 - orrialde berria',
'recentchanges-label-newpage' => 'Aldaketa honek orrialde berri bat sortu du',
-'recentchanges-legend-minor' => '$1 - aldaketa txikia',
'recentchanges-label-minor' => 'Hau aldaketa txikia da',
-'recentchanges-legend-bot' => '$1 - bot aldaketa',
'recentchanges-label-bot' => 'Aldaketa hau bot batek egin du',
-'recentchanges-legend-unpatrolled' => '$1 - patruilatu gabeko aldaketa',
'recentchanges-label-unpatrolled' => 'Aldaketa hau ez da oraindik patruilatua izan',
'rcnote' => "Beheko azken {{PLURAL:$2|eguneko|'''$2''' egunetako}} azken {{PLURAL:$1|aldaketa|'''$1''' aldaketak}} hurrengo datan egin ziren: $5, $4.",
'rcnotefrom' => 'Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).',
@@ -1434,6 +1442,16 @@ Orrialde baten irudi bat txertatzeko, erabili kode hauetako bat:
'filetype-banned-type' => '\'\'\'".$1"\'\'\' ez dago baimendutako fitxategi moten artean.
Baimendutako fitxategi {{PLURAL:$3|mota $2 da|motak $2 dira}}.',
'filetype-missing' => 'Fitxategi honek ez du luzapenik (adibidez, ".jpg").',
+'empty-file' => 'Bidali duzun fitxategia hutsik dago.',
+'file-too-large' => 'Bidali duzun fitxategia handiegia zen.',
+'filename-tooshort' => 'Fitxategiaren izena laburregia da.',
+'filetype-banned' => 'Mota horretako fitxategiak debekatuta daude.',
+'verification-error' => 'Fitxategiak ez du egiaztapena gainditu.',
+'illegal-filename' => 'Fitxategiaren izena ez da onartzen.',
+'overwrite' => 'Jada existitzen den fitxategi bat ezin da berridatzi.',
+'unknown-error' => 'Ezezaguna den errorea gertatu da.',
+'tmp-create-error' => 'Ezin izan da behin-behineko fitxategirik sortu.',
+'tmp-write-error' => 'Errorea behin-behineko fitxategia idazten.',
'large-file' => 'Ez da gomendagarria fitxategiak $1 baino handiagoak izatea; fitxategi honen tamaina: $2.',
'largefileserver' => 'Fitxategi hau zerbitzariak baimentzen duena baino handiagoa da.',
'emptyfile' => 'Badirudi igotzen ari zaren fitxategia hutsik dagoela. Mesedez, egiaztatu fitxategi hori dela igo nahi duzuna.',
@@ -1459,13 +1477,14 @@ Oraindik fitxategia igo nahi baduzu, mesedez atzera itzuli eta igo fitxategia iz
Oraindik ere fitxategia igo nahi baduzu atzera itzuli eta izen berri bat erabili, mesedez. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Fitxategi hau beste fitxategi {{PLURAL:$1|honen|hauen}} kopia bat da:',
'file-deleted-duplicate' => 'Fitxategi honen ([[:$1]]) fitxategi berbera aldez aurretik ezabatua izan da. Fitxategi horren ezabaketa-erregistroa begiratu beharko zenuke berriz igo baino lehen.',
-'successfulupload' => 'Igoera arrakastatsua',
'uploadwarning' => 'Igotzeko oharra',
'uploadwarning-text' => 'Aldatu beheko fitxategiaren deskribapena, mesedez, eta saiatu berriz.',
'savefile' => 'Fitxategia gorde',
'uploadedimage' => '"[[$1]]" igo da',
'overwroteimage' => '"[[$1]]"ren bertsio berri bat igo',
'uploaddisabled' => 'Igoerak ezgaituta daude',
+'copyuploaddisabled' => 'URL bidezko igoera desaktibatuta.',
+'uploadfromurl-queued' => 'Zure igoera ilaran jarri da.',
'uploaddisabledtext' => 'Fitxategiak igotzea ezgaituta dago.',
'php-uploaddisabledtext' => 'Fitxategi igoerak PHP-n ezinduta daude. Ikusi fitxategi_igoerak mesedez.',
'uploadscripted' => 'Fitxategi honek web zerbitzariak modu ezegokian interpretatu lezakeen HTML edo script kodea dauka.',
@@ -1485,6 +1504,13 @@ Kontuan izan fitxategia igotzea egokia ote den.
Fitxategi honen ezabaketa erregistroa jarraian ikus dezakezu:",
'filename-bad-prefix' => "Igotzen ari zaren fitxategiaren izena '''\"\$1\"'''ekin hasten da, normalki kamera digitalek automatikoki ezartzen duten izen ez deskriptibo bat.
Aukera ezazu, mesedez, fitxategi izen deskriptiboago bat.",
+'upload-success-subj' => 'Igoera arrakastatsua',
+'upload-success-msg' => 'Zure [$2] igoera arrakastatsua izan da. Hemen duzu eskuragarri: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Igoera-arazoa',
+'upload-failure-msg' => 'Hurrengo arazoa egon da zure [$2] igoerarekin:
+
+$1',
+'upload-warning-subj' => 'Igoera oharra',
'upload-proto-error' => 'Protokolo ezegokia',
'upload-proto-error-text' => 'Kanpo igoerak <code>http://</code> edo <code>ftp://</code> hasiera duen URLa izan behar du.',
@@ -1539,6 +1565,7 @@ Zutabe baten goi-buruaren egin klik sailkatzeko era aldatzeko.',
'listfiles_search_for' => 'Irudiaren izenagatik bilatu:',
'imgfile' => 'fitxategia',
'listfiles' => 'Fitxategien zerrenda',
+'listfiles_thumb' => 'Iruditxoa',
'listfiles_date' => 'Data',
'listfiles_name' => 'Izena',
'listfiles_user' => 'Erabiltzailea',
@@ -1646,7 +1673,6 @@ Ondorengo zerrendak fitxategira dauden {{PLURAL:$1|lehen lotura|lehen $1 loturak
'statistics-edits-average' => 'Bataz-besteko aldaketak orrialdeko',
'statistics-views-total' => 'Ikusitako orrialdeak guztira',
'statistics-views-peredit' => 'Ikusitako orrialdeak aldaketa bakoitzeko',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Lan zerrendaren] luzera',
'statistics-users' => 'Izen-emandako [[Special:ListUsers|lankideak]]',
'statistics-users-active' => 'Lankide aktiboak',
'statistics-users-active-desc' => 'Aurreko {{PLURAL:$1|egunean|egunetan}} jardueraren bat gauzatu duten erabiltzaileak',
@@ -1657,7 +1683,7 @@ Ondorengo zerrendak fitxategira dauden {{PLURAL:$1|lehen lotura|lehen $1 loturak
'disambiguations-text' => "Jarraian azaltzen diren orrialdeek '''argipen orrialde''' baterako lotura dute. Kasu bakoitzean dagokion artikulu zuzenarekin izan beharko lukete lotura.<br />Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspage]] orrialdean agertzen den txantiloietako bat duenean.",
'doubleredirects' => 'Birzuzenketa bikoitzak',
-'doubleredirectstext' => 'Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara <s>zuzendu</s> beharko luke.',
+'doubleredirectstext' => 'Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara <del>zuzendu</del> beharko luke.',
'double-redirect-fixed-move' => '[[$1]] mugitu da eta orain [[$2]](e)ra birzuzenketa bat da',
'double-redirect-fixer' => 'Birzuzenketa zuzentzailea',
@@ -1833,34 +1859,39 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
'listgrouprights-removegroup-self-all' => 'Talde guztiak norbere kontutik ezabatu',
# E-mail user
-'mailnologin' => 'Bidalketa helbiderik ez',
-'mailnologintext' => 'Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].',
-'emailuser' => 'Erabiltzaile honi e-posta bidali',
-'emailpage' => 'Erabiltzaileari e-posta bidali',
-'emailpagetext' => 'Erabiltzaile honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.
+'mailnologin' => 'Bidalketa helbiderik ez',
+'mailnologintext' => 'Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].',
+'emailuser' => 'Erabiltzaile honi e-posta bidali',
+'emailpage' => 'Erabiltzaileari e-posta bidali',
+'emailpagetext' => 'Erabiltzaile honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.
[[Special:Preferences|Hobespenetan]] daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.',
-'usermailererror' => 'Mail objektuak errore hau itzuli du:',
-'defemailsubject' => 'E-posta {{SITENAME}}(e)tik',
-'noemailtitle' => 'Posta helbiderik ez',
-'noemailtext' => 'Erabiltzaile honek ez du baliozko e-posta helbiderik zehaztu.',
-'nowikiemailtitle' => 'Ezin da e-postarik bidali',
-'nowikiemailtext' => 'Erabiltzaile honek beste erabiltzaileengandik e-postak ez jasotzea hautatu du.',
-'email-legend' => 'Bidali e-posta bat {{SITENAME}}(e)ko beste lankide bati',
-'emailfrom' => 'Nork:',
-'emailto' => 'Nori:',
-'emailsubject' => 'Gaia:',
-'emailmessage' => 'Mezua:',
-'emailsend' => 'Mezua',
-'emailccme' => 'Mezu honen kopia bat niri bidali.',
-'emailccsubject' => 'Zure mezuaren kopia $1(r)i: $2',
-'emailsent' => 'Mezua bidali egin da',
-'emailsenttext' => 'Zure e-posta mezua bidali egin da.',
-'emailuserfooter' => 'E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko "E-posta bidali" funtzioa erabiliz.',
+'usermailererror' => 'Mail objektuak errore hau itzuli du:',
+'defemailsubject' => 'E-posta {{SITENAME}}(e)tik',
+'usermaildisabled' => 'Erabiltzailearen e-maila desaktibatuta',
+'usermaildisabledtext' => 'Wiki honetan ezin diezu beste erabiltzaileei posta elektronikorik bidali',
+'noemailtitle' => 'Posta helbiderik ez',
+'noemailtext' => 'Erabiltzaile honek ez du baliozko e-posta helbiderik zehaztu.',
+'nowikiemailtitle' => 'Ezin da e-postarik bidali',
+'nowikiemailtext' => 'Erabiltzaile honek beste erabiltzaileengandik e-postak ez jasotzea hautatu du.',
+'email-legend' => 'Bidali e-posta bat {{SITENAME}}(e)ko beste lankide bati',
+'emailfrom' => 'Nork:',
+'emailto' => 'Nori:',
+'emailsubject' => 'Gaia:',
+'emailmessage' => 'Mezua:',
+'emailsend' => 'Mezua',
+'emailccme' => 'Mezu honen kopia bat niri bidali.',
+'emailccsubject' => 'Zure mezuaren kopia $1(r)i: $2',
+'emailsent' => 'Mezua bidali egin da',
+'emailsenttext' => 'Zure e-posta mezua bidali egin da.',
+'emailuserfooter' => 'E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko "E-posta bidali" funtzioa erabiliz.',
+
+# User Messenger
+'usermessage-editor' => 'Sistemako mezularia',
# Watchlist
'watchlist' => 'Nire jarraipen zerrenda',
'mywatchlist' => 'Nire jarraipen zerrenda',
-'watchlistfor' => "('''$1''')",
+'watchlistfor2' => '$1 ($2)',
'nowatchlist' => 'Zure jarraipen zerrenda hutsik dago.',
'watchlistanontext' => 'Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.',
'watchnologin' => 'Saioa hasi gabe',
@@ -1921,6 +1952,9 @@ Horrez gain, orrialdeen oharpen konfigurazioa leheneratu dezakezu jarraipen zerr
Adeitasunez {{SITENAME}}(e)ko oharpen sistema
--
+Zure epostaren jakinarazpenen konfigurazioa aldatzeko, ikus
+{{fullurl:{{#special:Preferences}}}}
+
Zure jarraipen zerrendako konfigurazioa aldatzeko, ikus
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -1977,7 +2011,10 @@ beste norbaitek editatu du edo jada desegin du.
'editcomment' => "Aldaketaren laburpena: \"''\$1''\".",
'revertpage' => '$2ren aldaketak ezabatu dira, $1ren azken bertsiora itzuliz.',
'rollback-success' => '$1(r)en aldaketak desegin dira, $2(r)en azken bertsiora itzuliz.',
-'sessionfailure' => 'Badirudi saioarekin arazoren bat dagoela; bandalismoak saihesteko ekintza hau ezeztatu egin da. Mesedez, nabigatzaileko "atzera" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.',
+
+# Edit tokens
+'sessionfailure-title' => 'Saio-akatsa',
+'sessionfailure' => 'Badirudi saioarekin arazoren bat dagoela; bandalismoak saihesteko ekintza hau ezeztatu egin da. Mesedez, nabigatzaileko "atzera" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.',
# Protect
'protectlogpage' => 'Babes erregistroa',
@@ -2115,6 +2152,7 @@ $1',
'sp-contributions-newbies-title' => 'Lankideen ekarpenak lankide berrietn',
'sp-contributions-blocklog' => 'Blokeaketa erregistroa',
'sp-contributions-deleted' => 'lankide-ekarpen ezabatuak',
+'sp-contributions-uploads' => 'igoerak',
'sp-contributions-logs' => 'erregistroak',
'sp-contributions-talk' => 'eztabaida',
'sp-contributions-userrights' => 'erabiltzaile-baimenen kudeaketa',
@@ -2122,6 +2160,7 @@ $1',
Blokeo erregistroa azken sarrera ematen da azpian erreferentziarako:',
'sp-contributions-search' => 'Ekarpenentzako bilaketa',
'sp-contributions-username' => 'IP helbidea edo erabiltzaile izena:',
+'sp-contributions-toponly' => 'Azken aldaketak direnak soilik erakutsi',
'sp-contributions-submit' => 'Bilatu',
# What links here
@@ -2145,7 +2184,7 @@ Blokeo erregistroa azken sarrera ematen da azpian erreferentziarako:',
# Block/unblock
'blockip' => 'Erabiltzailea blokeatu',
-'blockip-title' => 'Lankidea blokeatu',
+'blockip-title' => 'Erabiltzailea blokeatu',
'blockip-legend' => 'Erabiltzailea blokeatu',
'blockiptext' => 'IP helbide edo erabiltzaile izen bati idazketa baimenak kentzeko beheko formularioa erabil dezakezu. Ekintza hau bandalismoa saihesteko baino ez da burutu behar, eta beti ere [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz. Blokeoaren arrazoi bat ere zehaztu ezazu (adibidez, orrialde batzuk zehaztuz).',
'ipaddress' => 'IP Helbidea',
@@ -2181,7 +2220,6 @@ Ikus [[Special:IPBlockList|IP blokeoen zerrenda]] blokeoak aztertzeko.',
'ipb-edit-dropdown' => 'Blokeatzeko arrazoiak aldatu',
'ipb-unblock-addr' => '$1 lankide edo IP helbideari blokeoa baliogabetu',
'ipb-unblock' => 'Erabiltzaile izen edo IP helbide bati blokeoa kendu',
-'ipb-blocklist-addr' => '$1(r)en blokeoak ikusi',
'ipb-blocklist' => 'Blokeaketak ikusi',
'ipb-blocklist-contribs' => '$1(r)en ekarpenak',
'unblockip' => 'Erabiltzailea desblokeatu',
@@ -2189,7 +2227,7 @@ Ikus [[Special:IPBlockList|IP blokeoen zerrenda]] blokeoak aztertzeko.',
'ipusubmit' => 'Blokeoa ezabatu',
'unblocked' => '[[User:$1|$1]] desblokeatu egin da',
'unblocked-id' => '$1 blokeaketa ezabatu da',
-'ipblocklist' => 'Blokeatutako IP helbide eta erabiltzaileak',
+'ipblocklist' => 'Blokeatutako erabiltzaileak',
'ipblocklist-legend' => 'Blokeatutako erabiltzaile bat bilatu',
'ipblocklist-username' => 'Erabiltzaile izena edo IP helbidea:',
'ipblocklist-sh-userblocks' => 'Kontuaren blokeoak $1',
@@ -2249,6 +2287,8 @@ Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
'sorbsreason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan.',
'sorbs_create_account_reason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan. Ezin duzu kontua sortu.',
'cant-block-while-blocked' => 'Blokeatuta zauden bitartean ezin dituzu beste lankideak blokeatu.',
+'ipbblocked' => 'Ezin dituzu beste erabiltzaileak blokeatu edo desblokeatu, zu zeu blokeatuta zaudelako',
+'ipbnounblockself' => 'Ez duzu baimenik zure buruari blokeoa kentzeko',
# Developer tools
'lockdb' => 'Datu-basea blokeatu',
@@ -2405,7 +2445,7 @@ Mesedez bisitatu [http://www.mediawiki.org/wiki/Localisation MediaWiki] eta [htt
'import-interwiki-namespace' => 'Helburuko izen-tartea:',
'import-upload-filename' => 'Fitxategiaren izena:',
'import-comment' => 'Iruzkina:',
-'importtext' => 'Mesedez, jatorrizko wikitik orrialdea esportatzeko Special:Export tresna erabil ezazu, zure diskoan gorde eta jarraian hona igo.',
+'importtext' => 'Mesedez, jatorrizko wikitik orrialdea esportatzeko [[Special:Export|esportazio tresna]] erabil ezazu, zure diskoan gorde eta jarraian hona igo.',
'importstart' => 'Orrialdeak inportatzen...',
'import-revision-count' => '{{PLURAL:$1|berrikuspen 1|$1 berrikuspen}}',
'importnopages' => 'Ez dago orrialderik inportatzeko.',
@@ -2504,6 +2544,8 @@ Fitxategiaren atal bat baino ez zen igo.',
'tooltip-rollback' => '"Desegin" ekintzak orriaren azken egilearen ekarpena ezabatzen du klik batean',
'tooltip-undo' => '"Desegin" botoiak egindako aldaketa ezeztatzen du eta aurreikuspen bista erakusten du.
Laburpenean arrazoi bat gehitzea baimentzen du',
+'tooltip-preferences-save' => 'Hobespenak gorde',
+'tooltip-summary' => 'Laburpen labur bat sar ezazu',
# Stylesheets
'common.css' => '/** Hemen idatzitako CSS kodeak itxura guztietan izango du eragina */',
@@ -2612,14 +2654,16 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
'imagemaxsize' => "Irudiaren tamainaren muga:<br />''(fitxategi deskribapen-orrietarako)''",
'thumbsize' => 'Irudi txikiaren tamaina:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|orri|orri}}',
-'file-info' => '(fitxategiaren tamaina: $1, MIME mota: $2)',
-'file-info-size' => '($1 × $2 pixel, fitxategiaren tamaina: $3, MIME mota: $4)',
+'file-info' => 'fitxategiaren tamaina: $1, MIME mota: $2',
+'file-info-size' => '$1 × $2 pixel, fitxategiaren tamaina: $3, MIME mota: $4',
'file-nohires' => '<small>Ez dago bereizmen handiagorik.</small>',
-'svg-long-desc' => '(SVG fitxategia, nominaldi $1 × $2 pixel, fitxategiaren tamaina: $3)',
+'svg-long-desc' => 'SVG fitxategia, nominaldi $1 × $2 pixel, fitxategiaren tamaina: $3',
'show-big-image' => 'Bereizmen handikoa',
'show-big-image-thumb' => '<small>Aurreikuspen honen neurria: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'kiribildua',
'file-info-gif-frames' => '{{PLURAL:$1|Irudi $1|$1 irudi}}',
+'file-info-png-looped' => 'begiztatua',
+'file-info-png-frames' => '{{PLURAL:$1|Frame bat|$1 frame}}',
# Special:NewFiles
'newimages' => 'Fitxategi berrien galeria',
@@ -2694,8 +2738,8 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
'exif-colorspace' => 'Kolore tartea',
'exif-componentsconfiguration' => 'Osagai bakoitzaren esanahia',
'exif-compressedbitsperpixel' => 'Irudi konpresio mota',
-'exif-pixelydimension' => 'Baliozko irudi zabalera',
-'exif-pixelxdimension' => 'Baliozko irudi altuera',
+'exif-pixelydimension' => 'Irudiaren zabalera',
+'exif-pixelxdimension' => 'Irudiaren altuera',
'exif-makernote' => 'Egilearen oharrak',
'exif-usercomment' => 'Erabiltzailearen iruzkinak',
'exif-relatedsoundfile' => 'Harremanetan dagoen audio fitxategia',
@@ -2712,9 +2756,9 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
'exif-spectralsensitivity' => 'Sentiberatasun espektrala',
'exif-isospeedratings' => 'ISO abiadura',
'exif-oecf' => 'Aldatze faktore optoelektronikoa',
-'exif-shutterspeedvalue' => 'Argazkiaren abiadura',
-'exif-aperturevalue' => 'Irekiera',
-'exif-brightnessvalue' => 'Distira',
+'exif-shutterspeedvalue' => 'APEX argazkiaren itxiera-abiadura',
+'exif-aperturevalue' => 'APEX irekiera',
+'exif-brightnessvalue' => 'APEX distira',
'exif-exposurebiasvalue' => 'Esposizio biasa',
'exif-maxaperturevalue' => 'Gehienezko landa irekiera',
'exif-subjectdistance' => 'Subjetuarekiko distantzia',
@@ -2779,6 +2823,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
'exif-gpsareainformation' => 'GPS eskualdearen izena',
'exif-gpsdatestamp' => 'GPS data',
'exif-gpsdifferential' => 'GPSaren zuzenketa diferentziala',
+'exif-objectname' => 'Izenburua laburra',
# EXIF attributes
'exif-compression-1' => 'Konprimatu gabe',
@@ -2880,7 +2925,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
'exif-sensingmethod-7' => 'Hiru lerroko sentsorea',
'exif-sensingmethod-8' => 'Kolore sekuentzialeko sentsore linearra',
-'exif-filesource-3' => 'DSC',
+'exif-filesource-3' => 'Argazki kamera digitala',
'exif-scenetype-1' => 'Zuzenean argazkia atera zaion irudi bat',
@@ -3025,6 +3070,7 @@ $1',
'table_pager_first' => 'Lehen orrialdea',
'table_pager_last' => 'Azken orrialdea',
'table_pager_limit' => 'Orrialdeko $1 elementu erakutsi',
+'table_pager_limit_label' => 'Gaiak orrialdeko:',
'table_pager_limit_submit' => 'Joan',
'table_pager_empty' => 'Emaitzik ez',
@@ -3092,6 +3138,8 @@ Halaber [[Special:Watchlist/edit|aldatzaile estandarra]] erabil dezakezu.',
'version-hook-subscribedby' => 'Hauen harpidetzarekin',
'version-version' => '(Bertsioa $1)',
'version-license' => 'Lizentzia',
+'version-poweredby-credits' => "Wiki hau '''[http://www.mediawiki.org/ MediaWiki]'''k sustatzen du (copyright © 2001-$1 $2).",
+'version-poweredby-others' => 'beste batzuk',
'version-software' => 'Instalatutako softwarea',
'version-software-product' => 'Produktua',
'version-software-version' => 'Bertsioa',
@@ -3162,6 +3210,15 @@ Fitxategiaren izena sartu "{{ns:file}}:" aurrizkia gabe.',
'tags-edit' => 'aldatu',
'tags-hitcount' => '$1 {{PLURAL:$1|aldaketa|aldaketa}}',
+# Special:ComparePages
+'comparepages' => 'Orrialdeak alderatu',
+'compare-selector' => 'Orrialde-berrikuspenak alderatu',
+'compare-page1' => '1. orrialdea',
+'compare-page2' => '2. orrialdea',
+'compare-rev1' => '1. berrikuspena',
+'compare-rev2' => '2. berrikuspena',
+'compare-submit' => 'Alderatu',
+
# Database error messages
'dberr-header' => 'Wiki honek arazo bat du',
'dberr-problems' => 'Barkatu! Webgune honek zailtasun teknikoak jasaten ari da.',
@@ -3178,6 +3235,7 @@ Fitxategiaren izena sartu "{{ns:file}}:" aurrizkia gabe.',
'htmlform-float-invalid' => 'Zuk zehaztutako balioa ez da zenbakia.',
'htmlform-int-toolow' => 'Zuk zehaztutako balioa $1 minimoaren azpitik dago',
'htmlform-int-toohigh' => 'Zuk zehaztutako balioa $1 maximoaren gainetik dago',
+'htmlform-required' => 'Balio hori beharrezkoa da',
'htmlform-submit' => 'Bidali',
'htmlform-reset' => 'Aldaketak desegin',
'htmlform-selectorother-other' => 'Beste bat',
diff --git a/languages/messages/MessagesExt.php b/languages/messages/MessagesExt.php
index 069690af..3be9daf7 100644
--- a/languages/messages/MessagesExt.php
+++ b/languages/messages/MessagesExt.php
@@ -12,6 +12,10 @@
* @author Urhixidur
*/
+$namespaceNames = array(
+ NS_TEMPLATE => 'Prantilla',
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Surrayal atihus:',
@@ -28,8 +32,7 @@ $messages = array(
'tog-editsection' => 'Premitil eital mensahis gastandu el atihu [eital]',
'tog-editsectiononrightclick' => 'Premitil eital secionis pulsandu el botón de la derecha<br /> enus entítulus de secionis (JavaScript)',
'tog-showtoc' => 'Muestral cuairu e continius (pa páhinas con mas de 3 entítulus)',
-'tog-rememberpassword' => 'Recordal la mi cuenta nesti ordinaol',
-'tog-editwidth' => "Encajal el cuairu d'eición al anchu la pantalla",
+'tog-rememberpassword' => 'Recordal la mi cuenta nesti ordinaol (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Vehilal las páhinas que yo crei',
'tog-watchdefault' => "Vehilal las páhinas qu'eiti",
'tog-watchmoves' => 'Vehilal las páhinas que rellami',
@@ -166,31 +169,20 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Añiil tema',
-'vector-action-delete' => 'Esborral',
-'vector-action-move' => 'Mual',
-'vector-action-protect' => 'Protegel',
-'vector-action-undelete' => 'Esborral',
-'vector-action-unprotect' => 'Esprotegel',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => "Página d'ayua",
-'vector-namespace-image' => 'Archivu',
-'vector-namespace-main' => 'Página',
-'vector-namespace-media' => 'Página Murtimeya',
-'vector-namespace-mediawiki' => 'Mensaji',
-'vector-namespace-project' => 'Página el proyeutu',
-'vector-namespace-special' => 'Página especial',
-'vector-namespace-talk' => 'Caraba',
-'vector-namespace-template' => 'Cuairu',
-'vector-namespace-user' => "Página d'usuáriu",
-'vector-view-create' => 'Crial',
-'vector-view-edit' => 'Eital',
-'vector-view-history' => 'Guipal estorial',
-'vector-view-view' => 'Leyel',
-'vector-view-viewsource' => 'Guipal cóigu',
-'actions' => 'Acionis',
-'namespaces' => 'Espáciu nombris',
-'variants' => 'Variantis',
+'vector-action-addsection' => 'Añiil tema',
+'vector-action-delete' => 'Esborral',
+'vector-action-move' => 'Mual',
+'vector-action-protect' => 'Protegel',
+'vector-action-undelete' => 'Esborral',
+'vector-action-unprotect' => 'Esprotegel',
+'vector-view-create' => 'Crial',
+'vector-view-edit' => 'Eital',
+'vector-view-history' => 'Guipal estorial',
+'vector-view-view' => 'Leyel',
+'vector-view-viewsource' => 'Guipal cóigu',
+'actions' => 'Acionis',
+'namespaces' => 'Espáciu nombris',
+'variants' => 'Variantis',
'errorpagetitle' => 'Marru',
'returnto' => 'Gorvel a $1.',
@@ -406,7 +398,7 @@ Alcuerdati de chambal las tus [[Special:Preferences|preferéncias de {{SITENAME}
'yourname' => "Nombri d'usuáriu:",
'yourpassword' => 'Consínia:',
'yourpasswordagain' => 'Escrebi e nuevu la consínia:',
-'remembermypassword' => 'Recordal la mi cuenta nesti ordinaol',
+'remembermypassword' => 'Recordal la mi cuenta nesti ordinaol (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'El tu domiñu:',
'externaldberror' => "Marru d'autentificación esterna e la basi e datus, u bien nu t'alcuentras autorizau p'atualizal la tu cuenta esterna.",
'login' => 'Entral',
@@ -586,7 +578,7 @@ u [{{fullurl:{{FULLPAGENAME}}|action=edit}} eital ésta]</span>.',
'usercsspreview' => "'''Alcuerdati que solu estás previsoreandu el tu CSS d'usuáriu.'''
'''Entovia nu está emburacau!'''",
'userjspreview' => "'''Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d´usuáriu, entovia nu está emburacau!'''",
-'userinvalidcssjstitle' => "'''Avisu:''' Nu desisti el skin \"\$1\". Alcuerdati que las páhinas presonalizás .css i .js tienin el su entítulu en menúsculas, p.s. {{ns:user}}:Foo/monobook.css en lugal de {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Avisu:''' Nu desisti el skin \"\$1\". Alcuerdati que las páhinas presonalizás .css i .js tienin el su entítulu en menúsculas, p.s. {{ns:user}}:Foo/vector.css en lugal de {{ns:user}}:Foo/Vector.css.",
'updated' => '(Atualizau)',
'note' => "'''Nota:'''",
'previewnote' => "'''Agora solu estás previsoreandu; entovia nu están emburacaus los chambus!'''",
@@ -622,7 +614,6 @@ Pol otra parti, al pursal el botón \"emburacal\" mos estás asigurandu que lo e
'copyrightwarning2' => "Tolas contribucionis a {{SITENAME}} puein sel eitás, chambás, u esborrás pol otrus colabutaoris. Si nu estás dalcuerdu, altonci nu emburaquis ná.<br />
Pol otra parti, al pursal el botón \"emburacal\" mos estás asigurandu que lo escrebiu á siu hechu pol tí, u copiau dun domiñu púbricu u recursu semilal (lei \$1 pa mas detallis).
'''Cudia: Nu emburaquis labutus con Copyright sin premisu!'''",
-'longpagewarning' => "'''Avisu: Esta páhina tieni un grandol de $1 kilobytes; angunus escrucaoris puein tenel pobremas al eital páhinas con mas de 32 kB. Pol favol, consieri la posibiliá e devidil esta páhina en secionis mas chiqueninas.'''",
'longpageerror' => "'''Marru: El testu qu'as empuntau ocupa $1 kbs (siendu polo tantu mayol de $2 kbs). Nu es posibri emburacal.'''",
'readonlywarning' => "'''Alverténcia: La bassi datus s'alcuentra cerrá pol mantenimientu nesti momentu,
razón pola que nu pueis emburacal los tus chambus agora.'''
@@ -1122,7 +1113,6 @@ Si entovia quieris empuntal el archivu, pol favol, güervi atrás i empuntalu co
Si acontinas queriendu empuntal el archivu, vai alatrás i escambia el nombri el archivu.
[[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Esti archivu es un dupricau {{PLURAL:$1|el siguienti archivu|los siguientis archivus}}:',
-'successfulupload' => 'Empuntu satisfatoriu',
'uploadwarning' => 'Avisu d´empuntu',
'savefile' => 'Emburacal archivu',
'uploadedimage' => 'emputau "[[$1]]"',
@@ -1141,6 +1131,7 @@ Si acontinas queriendu empuntal el archivu, vai alatrás i escambia el nombri el
Eberias arreparal en si es convenienti acontinal empuntandu el archivu u nu.
Velaquí el antigu rustrihu d´esborrau pa esti archivu:",
'filename-bad-prefix' => "El nombri del archivu qu'estás empuntandu esmiença pol '''\"\$1\"''', es izil, es un nombri nu descritivu (típicu nombri dau autumaticamenti pol cámaras dehitalis). Pol favol, chamba el nombri del tu archivu.",
+'upload-success-subj' => 'Empuntu satisfatoriu',
'upload-proto-error' => 'Protocolu encorretu',
'upload-proto-error-text' => 'El empuntu remotu prehisa e "URLs" qu´esmiencin pol <code>http://</code> u <code>ftp://</code>.',
@@ -1438,7 +1429,6 @@ La direción email qu'aigas escrebiu enas tus preferéncias apaicirá cumu remit
# Watchlist
'watchlist' => 'La mi lista e seguimientu',
'mywatchlist' => 'La mi lista e seguimientu',
-'watchlistfor' => "(pa '''$1''')",
'nowatchlist' => 'La tu lista e seguimientu está vacia.',
'watchlistanontext' => 'Pa vel u eital las entrás ena tu lista e seguimientu es mestel $1.',
'watchnologin' => 'Nu estás rustriu',
@@ -1550,7 +1540,9 @@ La úrtima eición á siu hecha pol [[User:$3|$3]] ([[User talk:$3|Caraba]]).',
'editcomment' => "La síntesis la eición hue: \"''\$1''\".",
'revertpage' => 'Ãn siu revertias las eicionis de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]]); chambau a la úrtima velsión de [[User:$1|$1]]',
'rollback-success' => 'Revertias las eicionis de $1; chambau a la úrtima velsión de $2.',
-'sessionfailure' => "Paci qu'ai un pobrema cola tu sesión; pol precaución
+
+# Edit tokens
+'sessionfailure' => "Paci qu'ai un pobrema cola tu sesión; pol precaución
s'á cancelau l'ación solicitá. Pursa nel botón \"Atrás\" del
tu escrucaol pa cargal otra vezi la páhina i güervi a ententalu.",
@@ -1723,7 +1715,6 @@ Escrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan
'ipb-edit-dropdown' => 'Eital las razonis el tarugu',
'ipb-unblock-addr' => 'Desatarugal $1',
'ipb-unblock' => 'Desatarugal un nombri d´usuáriu u direción IP',
-'ipb-blocklist-addr' => 'Tarugus dessistentis de $1',
'ipb-blocklist' => 'Vel tarugus desistentis',
'ipb-blocklist-contribs' => 'Contribucionis de $1',
'unblockip' => 'Desatarugal usuáriu',
@@ -2067,10 +2058,10 @@ $1',
# Media information
'thumbsize' => 'Grandol el cuairu:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|página|páginas}}',
-'file-info' => '(grandol el archivu: $1, MIME type: $2)',
-'file-info-size' => '($1 × $2 pixel, grandol el archivu: $3, MIME type: $4)',
+'file-info' => 'grandol el archivu: $1, MIME type: $2',
+'file-info-size' => '$1 × $2 pixel, grandol el archivu: $3, MIME type: $4',
'file-nohires' => '<small>Nu disponibri a mayol resolución.</small>',
-'svg-long-desc' => '(archivu SVG, $1 × $2 pixelis, grandol: $3)',
+'svg-long-desc' => 'archivu SVG, $1 × $2 pixelis, grandol: $3',
'show-big-image' => 'Resolución máisima',
'show-big-image-thumb' => '<small>Grandol al previsoreal: $1 × $2 pixelis</small>',
diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php
index 7fb78b64..25eb1cec 100644
--- a/languages/messages/MessagesFa.php
+++ b/languages/messages/MessagesFa.php
@@ -29,7 +29,7 @@
$namespaceNames = array(
NS_MEDIA => 'مدیا',
NS_SPECIAL => 'ویژه',
- NS_MAIN => '',
+ NS_MAIN => '',
NS_TALK => 'بحث',
NS_USER => 'کاربر',
NS_USER_TALK => 'بحث_کاربر',
@@ -47,6 +47,8 @@ $namespaceNames = array(
);
$namespaceAliases = array(
+ 'رسانه' => NS_MEDIA,
+ 'رسانه‌ای' => NS_MEDIA,
'تصویر' => NS_FILE,
'بحث_تصویر' => NS_FILE_TALK,
);
@@ -55,8 +57,8 @@ $specialPageAliases = array(
'DoubleRedirects' => array( 'تغییرمسیرهای_دوتایی' ),
'BrokenRedirects' => array( 'تغییرمسیرهای_خراب' ),
'Disambiguations' => array( 'ابهام‌زدایی' ),
- 'Userlogin' => array( 'ورود_به_سیستم' ),
- 'Userlogout' => array( 'خروج_از_سیستم' ),
+ 'Userlogin' => array( 'ورود_به_سامانه' ),
+ 'Userlogout' => array( 'خروج_از_سامانه' ),
'CreateAccount' => array( 'ایجاد_حساب_کاربری' ),
'Preferences' => array( 'ترجیحات' ),
'Watchlist' => array( 'Ùهرست_پی‌گیری' ),
@@ -96,6 +98,7 @@ $specialPageAliases = array(
'Allpages' => array( 'تمام_صÙحه‌ها' ),
'Prefixindex' => array( 'نمایه_پیشوندی' ),
'Ipblocklist' => array( 'Ùهرست_بستن_نشانی_آی‌پی' ),
+ 'Unblock' => array( 'باز_کردن' ),
'Specialpages' => array( 'صÙحه‌های_ویژه' ),
'Contributions' => array( 'مشارکت‌ها' ),
'Emailuser' => array( 'نامه_به_کاربر' ),
@@ -140,6 +143,8 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'مشارکت‌های_حذÙ_شده' ),
'Tags' => array( 'برچسب‌ها' ),
'Activeusers' => array( 'کاربران_Ùعال' ),
+ 'ComparePages' => array( 'مقایسه_صÙحات' ),
+ 'Badtitle' => array( 'عنوان_نامناسب' ),
);
@@ -172,12 +177,12 @@ $defaultUserOptionOverrides = array(
/**
- * A list of date format preference keys which can be selected in user
+ * A list of date format preference keys which can be selected in user
* preferences. New preference keys can be added, provided they are supported
- * by the language class's timeanddate(). Only the 5 keys listed below are
+ * by the language class's timeanddate(). Only the 5 keys listed below are
* supported by the wikitext converter (DateFormatter.php).
*
- * The special key "default" is an alias for either dmy or mdy depending on
+ * The special key "default" is an alias for either dmy or mdy depending on
* $wgAmericanDates
*/
$datePreferences = array(
@@ -192,14 +197,14 @@ $datePreferences = array(
/**
* The date format to use for generated dates in the user interface.
- * This may be one of the above date preferences, or the special value
- * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
+ * This may be one of the above date preferences, or the special value
+ * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
* if $wgAmericanDates is false.
*/
$defaultDateFormat = 'dmy or mdy';
/**
- * Associative array mapping old numeric date formats, which may still be
+ * Associative array mapping old numeric date formats, which may still be
* stored in user preferences, to the new string formats.
*/
$datePreferenceMigrationMap = array(
@@ -211,8 +216,8 @@ $datePreferenceMigrationMap = array(
/**
* These are formats for dates generated by MediaWiki (as opposed to the wikitext
- * DateFormatter). Documentation for the format string can be found in
- * Language.php, search for sprintfDate.
+ * DateFormatter). Documentation for the format string can be found in
+ * Language.php, search for sprintfDate.
*
* This array is automatically inherited by all subclasses. Individual keys can be
* overridden.
@@ -230,15 +235,15 @@ $dateFormats = array(
'ymd time' => 'â€H:i',
'ymd date' => 'â€Y/n/j میلادی',
'ymd both' => 'â€Y/n/j میلادی، ساعت H:i',
-
+
'persian time' => 'â€H:i',
- 'persian date' => 'â€xij xiF xiY',
+ 'persian date' => 'â€xij xiF xiY',
'persian both' => 'â€xij xiF xiYØŒ ساعت H:i',
-
+
'hebrew time' => 'â€H:i',
'hebrew date' => 'â€xij xjF xjY',
'hebrew both' => 'â€H:i, xij xjF xjY',
-
+
'ISO 8601 time' => 'xnH:xni:xns',
'ISO 8601 date' => 'xnY-xnm-xnd',
@@ -258,12 +263,12 @@ $magicWords = array(
'currentmonthname' => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'نام‌ماه‌اضاÙÙ‡', 'نام_ماه_اضاÙÙ‡', 'نام‌ماه‌کنونی‌اضاÙÙ‡', 'نام_ماه_کنونی_اضاÙÙ‡', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', 'مخÙÙ‌نام‌ماه', 'مخÙÙ_نام_ماه', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'روز', 'CURRENTDAY' ),
+ 'currentday' => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
'currentday2' => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
'currentdayname' => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'زمان', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ساعت', 'CURRENTHOUR' ),
+ 'currenttime' => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonth1' => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
@@ -275,45 +280,46 @@ $magicWords = array(
'localyear' => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
'localtime' => array( '1', 'زمان‌محلی', 'زمان_محلی', 'LOCALTIME' ),
'localhour' => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'تعداد_صÙحه‌ها', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'تعدادمقاله‌ها', 'تعداد_مقاله‌ها', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'تعدادپرونده‌ها', 'تعداد_پرونده‌ها', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'تعدادکاربران', 'تعداد_کاربران', 'NUMBEROFUSERS' ),
+ 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'تعدادکاربران', 'NUMBEROFUSERS' ),
'numberofactiveusers' => array( '1', 'کاربران‌Ùعال', 'کاربران_Ùعال', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'تعدادویرایش‌ها', 'تعداد_ویرایش‌ها', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'تعدادبازدید', 'تعداد_بازدید', 'NUMBEROFVIEWS' ),
+ 'numberofedits' => array( '1', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'نام‌صÙحه', 'نام_صÙحه', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'نشانی‌صÙحه', 'نشانی_صÙحه', 'PAGENAMEE' ),
+ 'pagenamee' => array( '1', 'نام‌صÙحه‌کد', 'نام_صÙحه_کد', 'PAGENAMEE' ),
'namespace' => array( '1', 'Ùضای‌نام', 'Ùضای_نام', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'نشانی‌Ùضای‌نام', 'نشانی_Ùضای_نام', 'NAMESPACEE' ),
+ 'namespacee' => array( '1', 'Ùضای‌نام‌کد', 'Ùضای_نام_کد', 'NAMESPACEE' ),
'talkspace' => array( '1', 'Ùضای‌بحث', 'Ùضای_بحث', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'نشانی‌بحث', 'نشانی_بحث', 'TALKSPACEE' ),
+ 'talkspacee' => array( '1', 'Ùضای‌بحث‌کد', 'Ùضای_بحث_کد', 'TALKSPACEE' ),
'subjectspace' => array( '1', 'Ùضای‌موضوع', 'Ùضای‌مقاله', 'Ùضای_موضوع', 'Ùضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'نشانی‌Ùضای‌موضوع', 'نشانی‌Ùضای‌مقاله', 'نشانی_Ùضای_موضوع', 'نشانی_Ùضای_مقاله', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'subjectspacee' => array( '1', 'Ùضای‌موضوع‌کد', 'Ùضای‌مقاله‌کد', 'Ùضای_موضوع_کد', 'Ùضای_مقاله_کد', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
'fullpagename' => array( '1', 'نام‌کامل‌صÙحه', 'نام_کامل_صÙحه', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'نشانی‌کامل‌صÙحه', 'نشانی_کامل_صÙحه', 'FULLPAGENAMEE' ),
+ 'fullpagenamee' => array( '1', 'نام‌کامل‌صÙحه‌کد', 'نام_کامل_صÙحه_کد', 'FULLPAGENAMEE' ),
'subpagename' => array( '1', 'نام‌زیرصÙحه', 'نام_زیرصÙحه', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'نشانی‌زیرصÙحه', 'نشانی_زیرصÙحه', 'SUBPAGENAMEE' ),
+ 'subpagenamee' => array( '1', 'نام‌زیرصÙحه‌کد', 'نام_زیرصÙحه_کد', 'SUBPAGENAMEE' ),
'basepagename' => array( '1', 'نام‌صÙحه‌مبنا', 'نام_صÙحه_مبنا', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'نشانی‌صÙحه‌مبنا', 'نشانی_صÙحه‌مبنا', 'BASEPAGENAMEE' ),
+ 'basepagenamee' => array( '1', 'نام‌صÙحه‌مبناکد', 'نام_صÙحه_مبنا_کد', 'BASEPAGENAMEE' ),
'talkpagename' => array( '1', 'نام‌صÙحه‌بحث', 'نام_صÙحه_بحث', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'نشانی‌صÙحه‌بحث', 'نشانی_صÙحه_بحث', 'TALKPAGENAMEE' ),
+ 'talkpagenamee' => array( '1', 'نام‌صÙحه‌بحث‌کد', 'نام_صÙحه_بحث_کد', 'TALKPAGENAMEE' ),
'subjectpagename' => array( '1', 'نام‌صÙحه‌موضوع', 'نام‌صÙحه‌مقاله', 'نام_صÙحه_موضوع', 'نام_صÙحه_مقاله', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'نشانی‌صÙحه‌موضوع', 'نشانی‌صÙحه‌مقاله', 'نشانی_صÙحه_موضوع', 'نشانی_صÙحه_مقاله', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'subjectpagenamee' => array( '1', 'نام‌صÙحه‌موضوع‌کد', 'نام‌صÙحه‌مقاله‌کد', 'نام_صÙحه_موضوع_کد', 'نام_صÙحه_مقاله_کد', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
'subst' => array( '0', 'جایگزین:', 'جا:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'جایگزین_امن:', 'جام:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'پیغام‌بی‌بسط:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'بندانگشتی', 'انگشتدان', 'انگشتی', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'بندانگشتی=$1', 'انگشتدانهای=$1', 'انگشتی=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_manualthumb' => array( '1', 'بندانگشتی=$1', 'انگشتدان=$1', 'انگشتی=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'راست', 'right' ),
'img_left' => array( '1', 'Ú†Ù¾', 'left' ),
'img_none' => array( '1', 'هیچ', 'none' ),
'img_width' => array( '1', '$1پیکسل', '$1px' ),
'img_center' => array( '1', 'وسط', 'center', 'centre' ),
'img_framed' => array( '1', 'قاب', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'بی‌قاب', 'بیقاب', 'frameless' ),
- 'img_page' => array( '1', 'صÙحه=$1', 'صÙحه $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'ایستاده', 'ایستاده=$1', 'ایستاده $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_frameless' => array( '1', 'بی‌قاب', 'بیقاب', 'بی_قاب', 'frameless' ),
+ 'img_page' => array( '1', 'صÙحه=$1', 'صÙحه_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'ایستاده', 'ایستاده=$1', 'ایستاده_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'حاشیه', 'border' ),
'img_baseline' => array( '1', 'همکÙ', 'baseline' ),
'img_sub' => array( '1', 'زیر', 'sub' ),
@@ -325,18 +331,19 @@ $magicWords = array(
'img_text_bottom' => array( '1', 'متن-پایین', 'text-bottom' ),
'img_link' => array( '1', 'پیوند=$1', 'link=$1' ),
'img_alt' => array( '1', 'جایگزین=$1', 'alt=$1' ),
- 'int' => array( '0', 'محتوى:', 'INT:' ),
+ 'int' => array( '0', 'ترجمه:', 'INT:' ),
'sitename' => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
'ns' => array( '0', 'ÙÙ†:', 'NS:' ),
- 'nse' => array( '0', 'Ùنم:', 'NSE:' ),
+ 'nse' => array( '0', 'ÙÙ†Ú©:', 'NSE:' ),
'localurl' => array( '0', 'نشانی:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'نشانی‌نشانی:', 'LOCALURLE:' ),
- 'server' => array( '0', 'کارگذار', 'SERVER' ),
- 'servername' => array( '0', 'نام‌کارگذار', 'نام_کارگذار', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'مسیر', 'مسیر سند', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'مسیر سبک', 'STYLEPATH' ),
- 'grammar' => array( '0', 'دستورزبان:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'جنسیت', 'GENDER:' ),
+ 'localurle' => array( '0', 'نشانی‌کد:', 'نشانی_کد:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'مسیرمقاله', 'مسیر_مقاله', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'سرور', 'کارساز', 'SERVER' ),
+ 'servername' => array( '0', 'نام‌کارساز', 'نام_کارساز', 'نام‌سرور', 'نام_سرور', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'مسیرسند', 'مسیر_سند', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'مسیرسبک', 'مسیر_سبک', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
'notitleconvert' => array( '0', '__عنوان‌تبدیل‌نشده__', '__NOTITLECONVERT__', '__NOTC__' ),
'nocontentconvert' => array( '0', '__محتواتبدیل‌نشده__', '__NOCONTENTCONVERT__', '__NOCC__' ),
'currentweek' => array( '1', 'Ù‡Ùته', 'CURRENTWEEK' ),
@@ -347,37 +354,38 @@ $magicWords = array(
'revisionday' => array( '1', 'روزنسخه', 'روز_نسخه', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'روزنسخه۲', 'روز_نسخه۲', 'روز_نسخه_۲', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'ماه‌نسخه', 'ماه_نسخه', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'ماه‌نسخه۱', 'ماه_نسخه_۱', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'سال‌نسخه', 'سال_نسخه', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'نشان‌زمان‌نسخه', 'نشان_زمان_نسخه', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'کاربرنسخه', 'REVISIONUSER' ),
+ 'revisiontimestamp' => array( '1', 'زمان‌یونیسکی‌نسخه', 'زمان‌نسخه', 'زمان_یونیکسی_نسخه', 'زمان_نسخه', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'کاربرنسخه', 'کاربر_نسخه', 'REVISIONUSER' ),
'plural' => array( '0', 'جمع:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'نشانی‌کامل:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'نشانی‌نشانی‌کامل:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ابتداکوچک:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ابتدابزرگ:', 'UCFIRST:' ),
+ 'fullurl' => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
'lc' => array( '0', 'Ú©:', 'LC:' ),
'uc' => array( '0', 'ب:', 'UC:' ),
'raw' => array( '0', 'خام:', 'RAW:' ),
'displaytitle' => array( '1', 'عنوان‌ظاهری', 'عنوان_ظاهری', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'ع', 'R' ),
+ 'rawsuffix' => array( '1', 'Ù†', 'R' ),
'newsectionlink' => array( '1', '__بخش‌جدید__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__بی‌پیوندبخش__', '__NONEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__بی‌پیوندبخش__', '__بی‌پیوند‌بخش‌جدید__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'نسخه‌کنونی', 'نسخه_کنونی', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'کدنشانی:', 'URLENCODE:' ),
'anchorencode' => array( '0', 'کدلنگر:', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'نشان‌زمان‌کنونی', 'نشان_زمان_کنونی', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'نشان‌زمان‌محلی', 'نشان_زمان_محلی', 'LOCALTIMESTAMP' ),
+ 'currenttimestamp' => array( '1', 'زمان‌یونیکسی', 'زمان_یونیکسی', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'زمان‌یونیکسی‌محلی', 'زمان_یونیکسی_محلی', 'LOCALTIMESTAMP' ),
'directionmark' => array( '1', 'علامت‌جهت', 'علامت_جهت', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#زبان:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'زبان‌محتوا', 'زبان_محتوا', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'صÙحه‌درÙضای‌نام', 'صÙحه_در_Ùضای_نام', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'تعدادمدیران', 'تعداد_مدیران', 'NUMBEROFADMINS' ),
+ 'pagesinnamespace' => array( '1', 'صÙحه‌درÙضای‌نام:', 'صÙحه_در_Ùضای_نام:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'تعدادمدیران', 'NUMBEROFADMINS' ),
'formatnum' => array( '0', 'آرایش‌عدد', 'آرایش_عدد', 'FORMATNUM' ),
'padleft' => array( '0', 'لبه‌چپ', 'لبه_چپ', 'PADLEFT' ),
'padright' => array( '0', 'لبه‌راست', 'لبه_راست', 'PADRIGHT' ),
'special' => array( '0', 'ویژه', 'special' ),
- 'defaultsort' => array( '1', 'ترتیب', 'ترتیب‌پیش‌Ùرض', 'ترتیب_پیش_Ùرض', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'مسیرپرونده:', 'مسیر_پرونده', 'FILEPATH:' ),
+ 'defaultsort' => array( '1', 'ترتیب:', 'ترتیب‌پیش‌Ùرض:', 'ترتیب_پیش_Ùرض:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'مسیرپرونده:', 'مسیر_پرونده:', 'FILEPATH:' ),
'tag' => array( '0', 'برچسب', 'tag' ),
'hiddencat' => array( '1', '__رده‌پنهان__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'صÙحه‌دررده', 'صÙحه_در_رده', 'PAGESINCATEGORY', 'PAGESINCAT' ),
@@ -388,6 +396,9 @@ $magicWords = array(
'staticredirect' => array( '1', '__تغییرمسیرثابت__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'سطح‌حغاطت', 'سطح_Ø­Ùاظت', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'آرایش‌تاریخ', 'آرایش_تاریخ', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'مسیر', 'PATH' ),
+ 'url_wiki' => array( '0', 'ویکی', 'WIKI' ),
+ 'url_query' => array( '0', 'دستور', 'QUERY' ),
);
# Harakat are intentionally not included in the linkTrail. Their addition should
@@ -405,53 +416,52 @@ $imageFiles = array(
$messages = array(
# User preference toggles
'tog-underline' => 'زیر پیوندها خط کشیده شود',
-'tog-highlightbroken' => 'قالب‌بندی پیوندهای ناقص <a href="" class="new">به این شکل</a> (امکان دیگر: به این شکل<a href="" class="internal">؟</a>).',
-'tog-justify' => 'تمام‌چین‌کردن بندها',
-'tog-hideminor' => 'نشان ندادن تغییرات جزئی در Ùهرست تغییرات اخیر',
-'tog-hidepatrolled' => 'نهÙتن ویرایش‌های گشت خورده در تغییرات اخیر',
-'tog-newpageshidepatrolled' => 'نهÙتن صÙحه‌های نهگبانی شده از Ùهرست صÙحه‌های تازه',
-'tog-extendwatchlist' => 'گسترش Ùهرست پی‌گیری‌ها برای نشان‌دادن همهٔ تغییرات، Ùˆ نه Ùقط موارد اخیر',
-'tog-usenewrc' => 'استÙاده از تغییرات اخیر گسترش یاÙته (نیازمند جاوااسکریپت)',
+'tog-highlightbroken' => 'پیوندهای ناقص <a href="" class="new">به این شکل</a> قالب‌بندی شوند (امکان دیگر: به این شکل<a href="" class="internal">؟</a>).',
+'tog-justify' => 'بندها به صورت تمام‌چین نمایش یابند',
+'tog-hideminor' => 'تغییرات جزئی از Ùهرست تغییرات اخیر پنهان شوند',
+'tog-hidepatrolled' => 'ویرایش‌های گشت خورده از تغییرات اخیر پنهان شوند',
+'tog-newpageshidepatrolled' => 'صÙحه‌های نهگبانی شده از Ùهرست صÙحه‌های تازه پنهان شوند',
+'tog-extendwatchlist' => 'Ùهرست پی‌گیری‌ها گسترش داده شود تا همهٔ تغییرات را نشان دهد، Ùˆ نه Ùقط موارد اخیر',
+'tog-usenewrc' => 'از تغییرات اخیر گسترش یاÙته استÙاده شود (نیازمند جاوااسکریپت)',
'tog-numberheadings' => 'شماره‌گذاری خودکار عناوین',
-'tog-showtoolbar' => 'نمایش نوار ابزار جعبهٔ ویرایش',
-'tog-editondblclick' => 'ویرایش صÙحه‌ها با دوکلیک (جاوااسکریپت)',
-'tog-editsection' => 'به کار انداختن ویرایش قسمت‌ها از طریق پیوندهای [ویرایش]',
-'tog-editsectiononrightclick' => 'به کار انداختن ویرایش قسمت‌ها با کلیک راست<br />روی عناوین قسمت‌ها (جاوااسکریپت)',
-'tog-showtoc' => 'نمایش Ùهرست مندرجات<br />(برای مقاله‌های با بیش از Û³ سرÙصل)',
-'tog-rememberpassword' => 'گذرواژه برای نشست‌های بعدی بماند',
-'tog-editwidth' => 'اÙزایش پهنای جعبهٔ ویرایش تا حدی Ú©Ù‡ تمام صÙحه را پر کند',
-'tog-watchcreations' => 'اÙزودن صÙحه‌های ایجادشده توسط من به Ùهرست پی‌گیری‌ها.',
-'tog-watchdefault' => 'اÙزودن صÙحه‌هایی Ú©Ù‡ ویرایش می‌کنم به Ùهرست پی‌گیری‌ها',
-'tog-watchmoves' => 'اÙزودن صÙحه‌هایی Ú©Ù‡ منتقل می‌کنم به Ùهرست پی‌گیری‌ها',
-'tog-watchdeletion' => 'اÙزودن صÙحه‌هایی Ú©Ù‡ حذ٠می‌کنم به Ùهرست پی‌گیری‌های من',
-'tog-minordefault' => 'پیش‌Ùرض همهٔ ویرایش‌ها «جزئی» باشد',
-'tog-previewontop' => 'نمایش پیش‌نمایش قبل از جعبهٔ ویرایش و نه پس از آن',
-'tog-previewonfirst' => 'پیش‌نمایش هنگام اولین ویرایش',
-'tog-nocache' => 'از کار انداختن حاÙظهٔ نهانی مرورگر',
-'tog-enotifwatchlistpages' => 'اگر صÙحه‌ای Ú©Ù‡ پی‌گیری می‌کنم تغییر کرد به من پست الکترونیکی بÙرست.',
-'tog-enotifusertalkpages' => 'هنگامی Ú©Ù‡ در صÙحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه الکترونیکی بÙرست',
-'tog-enotifminoredits' => 'برای تغییرات جزئی در صÙحه‌ها هم به من نامه الکترونیکی بÙرست',
-'tog-enotifrevealaddr' => 'نشانی پست الکترونیکی من را در نامه‌های اطلاع‌رسانی نمایش بده',
-'tog-shownumberswatching' => 'نشان‌دادن شمار کاربران پی‌گیری‌کننده',
+'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد (نیازمند جاوااسکریپت)',
+'tog-editondblclick' => 'ویرایش صÙحه‌ها با دوکلیک (نیازمند جاوااسکریپت)',
+'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] Ùعال باشد',
+'tog-editsectiononrightclick' => 'ویرایش بخش‌ها با کلیک راست روی عناوین قسمت‌ها Ùعال باشد (نیازمند جاوااسکریپت)',
+'tog-showtoc' => 'Ùهرست مندرجات نمایش یابد (برای صÙحه‌های دارای بیش از Û³ عنوان)',
+'tog-rememberpassword' => 'گذرواژه من را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این مرورگر به خاطر بسپار',
+'tog-watchcreations' => 'صÙحه‌هایی Ú©Ù‡ می‌سازم به Ùهرست پی‌گیری‌هایم اÙزوده شود',
+'tog-watchdefault' => 'صÙحه‌هایی Ú©Ù‡ ویرایش می‌کنم به Ùهرست پی‌گیری‌هایم اÙزوده شود',
+'tog-watchmoves' => 'صÙحه‌هایی Ú©Ù‡ منتقل می‌کنم به Ùهرست پی‌گیری‌هایم اÙزوده شود',
+'tog-watchdeletion' => 'صÙحه‌هایی Ú©Ù‡ حذ٠می‌کنم به Ùهرست پی‌گیری‌هایم اÙزوده شود',
+'tog-minordefault' => 'همهٔ ویرایش‌ها به طور پیش‌Ùرض به عنوان «جزئی» علامت بخورد',
+'tog-previewontop' => 'پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد',
+'tog-previewonfirst' => 'پیش‌نمایش هنگام اولین ویرایش نمایش یابد',
+'tog-nocache' => 'حاÙظهٔ نهانی مرورگر از کار انداخته شود',
+'tog-enotifwatchlistpages' => 'اگر صÙحه‌ای Ú©Ù‡ پی‌گیری می‌کنم تغییر کرد به من نامه الکترونیکی Ùرستاده شود',
+'tog-enotifusertalkpages' => 'هنگامی Ú©Ù‡ در صÙحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه الکترونیکی Ùرستاده شود',
+'tog-enotifminoredits' => 'برای تغییرات جزئی در صÙحه‌ها هم به من نامه الکترونیکی Ùرستاده شود',
+'tog-enotifrevealaddr' => 'نشانی پست الکترونیکی من را در نامه‌های اطلاع‌رسانی نمایش یابد',
+'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده را نمایش یابد',
'tog-oldsig' => 'پیش‌نمایش امضای موجود:',
-'tog-fancysig' => 'امضا را به صورت ویکی‌متن در نظر بگیر (بدون درج خودکار پیوند)',
+'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرÙته شود (بدون درج خودکار پیوند)',
'tog-externaleditor' => 'استÙاده از ویرایشگر خارجی به‌طور پیش‌Ùرض (Ùقط برای کاربران پیشرÙته، نیازمند تنظیمات ویژه در رایانه شما است. [http://www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر.])',
'tog-externaldiff' => 'استÙاده از تÙاوت‌گیر (diff) خارجی به‌طور پیش‌Ùرض (Ùقط برای کاربران پیشرÙته، نیازمند تنظیمات ویژه در رایانه شما است. [http://www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر.])',
-'tog-showjumplinks' => 'نمایش پیوندهای پرشی در Ùهرست مندرجات',
-'tog-uselivepreview' => 'استÙاده از پیش‌نمایش زنده (جاوااسکریپت) (آزمایشی)',
-'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع بده',
-'tog-watchlisthideown' => 'نهÙتن ویرایش‌های من در Ùهرست پی‌گیری‌ها',
-'tog-watchlisthidebots' => 'نهÙتن ویرایش‌های ربات‌ها در Ùهرست پی‌گیری‌ها',
-'tog-watchlisthideminor' => 'نهÙتن ویرایش‌های جزئی از Ùهرست پی‌گیری‌های من',
-'tog-watchlisthideliu' => 'ویرایش‌های کاربران وارد شده به سامانه را از Ùهرست پی‌گیری‌های من پنهان Ú©Ù†',
-'tog-watchlisthideanons' => 'ویرایش‌های کاربران ناشناس را از Ùهرست پی‌گیری‌های من پنهان Ú©Ù†',
-'tog-watchlisthidepatrolled' => 'نهÙتن ویرایش‌های گشت‌خورده از Ùهرست پیگیری',
-'tog-nolangconversion' => 'غیرÙعال کردن تبدیل زبان‌ها',
-'tog-ccmeonemails' => 'رونوشت نامه‌های الکترونیکی Ú©Ù‡ به دیگران ارسال می‌کنم به خودم بÙرست',
+'tog-showjumplinks' => 'پیوندهای دسترسی‌پذیری «پرش به» Ùعال باشد',
+'tog-uselivepreview' => 'استÙاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)',
+'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود',
+'tog-watchlisthideown' => 'ویرایش‌های خودم در Ùهرست پی‌گیری‌ها پنهان شود',
+'tog-watchlisthidebots' => 'ویرایش‌های ربات‌ها در Ùهرست پی‌گیری‌ها پنهان شود',
+'tog-watchlisthideminor' => 'ویرایش‌های جزئی در Ùهرست پی‌گیری‌ها پنهان شود',
+'tog-watchlisthideliu' => 'ویرایش‌های کاربران وارد شده به سامانه در Ùهرست پی‌گیری‌ها پنهان شود',
+'tog-watchlisthideanons' => 'ویرایش‌های کاربران ناشناس در Ùهرست پی‌گیری‌های من پنهان شود',
+'tog-watchlisthidepatrolled' => 'ویرایش‌های گشت‌خورده در Ùهرست پی‌گیری‌ها پنهان شود',
+'tog-nolangconversion' => 'تبدیل گویش‌ها غیرÙعال شود',
+'tog-ccmeonemails' => 'رونوشت نامه‌های الکترونیکی Ú©Ù‡ به دیگران ارسال می‌کنم به خودم Ùرستاده شود',
'tog-diffonly' => 'محتوای صÙحه، زیر تÙاوت نمایش داده نشود',
-'tog-showhiddencats' => 'رده‌های پنهان را نمایش بده',
-'tog-noconvertlink' => 'غیرÙعال کردن تبدیل پیوند',
-'tog-norollbackdiff' => 'بعد از واگردانی تÙاوت را نشان نده',
+'tog-showhiddencats' => 'رده‌های پنهان را نمایش یابد',
+'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرÙعال شود',
+'tog-norollbackdiff' => 'بعد از واگردانی تÙاوت نشان داده نشود',
'underline-always' => 'همیشه',
'underline-never' => 'هرگز',
@@ -521,7 +531,7 @@ $messages = array(
'category_header' => 'مقاله‌های ردهٔ «$1»',
'subcategories' => 'زیررده‌ها',
'category-media-header' => 'پرونده‌های ردهٔ «$1»',
-'category-empty' => 'این رده شامل هیچ صÙحه یا پرونده‌ای نمی‌شود.',
+'category-empty' => "''این رده در حال حاضر حاوی هیچ صÙحه یا پرونده‌ای نیست.''",
'hidden-categories' => '{{PLURAL:$1|ردهٔ پنهان|رده‌های پنهان}}',
'hidden-category-category' => 'رده‌های پنهان',
'category-subcat-count' => '{{PLURAL:$2|این رده تنها حاوی زیرردهٔ زیر است.|{{PLURAL:$1|این زیررده|این $1 زیررده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 زیررده است.}}',
@@ -563,35 +573,25 @@ $messages = array(
'qbpageinfo' => 'باÙت',
'qbmyoptions' => 'صÙحه‌های من',
'qbspecialpages' => 'صÙحه‌های ویژه',
-'faq' => 'سوال‌های متداول',
-'faqpage' => 'Project:سوال‌های متداول',
+'faq' => 'پرسش‌های متداول',
+'faqpage' => 'Project:پرسش‌های متداول',
# Vector skin
-'vector-action-addsection' => 'اÙزودن عنوان',
-'vector-action-delete' => 'حذÙ',
-'vector-action-move' => 'انتقال',
-'vector-action-protect' => 'محاÙظت',
-'vector-action-undelete' => 'احیا',
-'vector-action-unprotect' => 'به در آوردن از محاÙظت',
-'vector-namespace-category' => 'رده',
-'vector-namespace-help' => 'صÙحهٔ راهنما',
-'vector-namespace-image' => 'پرونده',
-'vector-namespace-main' => 'صÙحه',
-'vector-namespace-media' => 'صÙحهٔ رسانه',
-'vector-namespace-mediawiki' => 'پیغام',
-'vector-namespace-project' => 'صÙحهٔ پروژه',
-'vector-namespace-special' => 'صÙحهٔ ویژه',
-'vector-namespace-talk' => 'بحث',
-'vector-namespace-template' => 'الگو',
-'vector-namespace-user' => 'صÙحهٔ کاربر',
-'vector-view-create' => 'ایجاد',
-'vector-view-edit' => 'ویرایش',
-'vector-view-history' => 'نمایش تاریخچه',
-'vector-view-view' => 'خواندن',
-'vector-view-viewsource' => 'نمایش مبدأ',
-'actions' => 'عملکردها',
-'namespaces' => 'Ùضاهای نام',
-'variants' => 'گویش‌ها',
+'vector-action-addsection' => 'اÙزودن عنوان',
+'vector-action-delete' => 'حذÙ',
+'vector-action-move' => 'انتقال',
+'vector-action-protect' => 'محاÙظت',
+'vector-action-undelete' => 'احیا',
+'vector-action-unprotect' => 'به در آوردن از محاÙظت',
+'vector-simplesearch-preference' => 'Ùعال کردن پیشنهادهای جستجوی پیشرÙته (Ùقط در پوسته برداری)',
+'vector-view-create' => 'ایجاد',
+'vector-view-edit' => 'ویرایش',
+'vector-view-history' => 'نمایش تاریخچه',
+'vector-view-view' => 'خواندن',
+'vector-view-viewsource' => 'نمایش مبدأ',
+'actions' => 'عملکردها',
+'namespaces' => 'Ùضاهای نام',
+'variants' => 'گویش‌ها',
'errorpagetitle' => 'خطا',
'returnto' => 'بازگشت به $1.',
@@ -603,7 +603,7 @@ $messages = array(
'searcharticle' => 'برو',
'history' => 'تاریخچهٔ صÙحه',
'history_short' => 'تاریخچه',
-'updatedmarker' => 'به‌روزشده از پس از آخرین باری که سرزده‌ام.',
+'updatedmarker' => 'به‌روزشده از پس از آخرین باری که سرزده‌ام',
'info_short' => 'اطلاعات',
'printableversion' => 'نسخهٔ قابل چاپ',
'permalink' => 'پیوند پایدار',
@@ -641,17 +641,20 @@ $messages = array(
'otherlanguages' => 'زبان‌های دیگر',
'redirectedfrom' => '(تغییر مسیر از $1)',
'redirectpagesub' => 'صÙحهٔ تغییر مسیر',
-'lastmodifiedat' => 'این صÙحه آخرین بار در $2ØŒ $1 تغییر یاÙته‌است.',
-'viewcount' => 'این صÙحه {{PLURAL:$1|یک|$1}} بار دیده شده است.',
+'lastmodifiedat' => 'این صÙحه آخرین بار در $1 ساعت $2 تغییر یاÙته‌است.',
+'viewcount' => 'از این صÙحه {{PLURAL:$1|یک|$1}} بار بازدید شده است.',
'protectedpage' => 'صÙحهٔ محاÙظت‌شده',
'jumpto' => 'پرش به:',
'jumptonavigation' => 'ناوبری',
'jumptosearch' => 'جستجو',
-'view-pool-error' => 'شوربختانه کارسازها در حال حاضر دچار بار اضاÙÛŒ هستند.
+'view-pool-error' => 'متاسÙانه سرورها در حال حاضر دچار بار اضاÙÛŒ هستند.
تعداد زیادی از کاربران تلاش می‌کنند Ú©Ù‡ این صÙحه را ببینند.
لطÙاً قبل از تلاش دوباره برای دیدن این صÙحه مدتی صبر کنید.
$1',
+'pool-timeout' => 'اتمام مهلت انتظار برای Ù‚ÙÙ„',
+'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}}',
@@ -674,18 +677,19 @@ $1',
'privacypage' => 'Project:سیاست_Ø­Ùظ_اسرار',
'badaccess' => 'خطای دسترسی',
-'badaccess-group0' => 'شما اجازهٔ اجرای عمل درخواسته را ندارید.',
+'badaccess-group0' => 'شما اجازهٔ اجرای عملی که درخواست کرده‌اید را ندارید.',
'badaccess-groups' => 'عملی که درخواست کرده‌اید منحصر به کاربران {{PLURAL:$2|این گروه|این گروه‌ها}} است: $1.',
'versionrequired' => 'نسخهٔ $1 از نرم‌اÙزار مدیاویکی لازم است',
-'versionrequiredtext' => 'برای دیدن این صÙحه به نسخهٔ $1 از نرم‌اÙزار مدیاویکی نیاز دارید. برای اطلاع از نسخهٔ نرم‌اÙزار نصب شده در این ویکی به [[Special:Version|این صÙحه]] مراجعه کنید.',
+'versionrequiredtext' => 'برای دیدن این صÙحه به نسخهٔ $1 از نرم‌اÙزار مدیاویکی نیاز دارید.
+به [[Special:Version|این صÙحه]] مراجعه کنید.',
'ok' => 'تأیید',
'retrievedfrom' => 'برگرÙته از «$1»',
'youhavenewmessages' => '$1 دارید ($2).',
'newmessageslink' => 'پیام‌های جدید',
'newmessagesdifflink' => 'آخرین تغییر',
-'youhavenewmessagesmulti' => 'پیغامهای جدیدی در $1 دارید.',
+'youhavenewmessagesmulti' => 'پیام‌های جدیدی در $1 دارید.',
'editsection' => 'ویرایش',
'editold' => 'ویرایش',
'viewsourceold' => 'نمایش مبدأ',
@@ -697,14 +701,14 @@ $1',
'hidetoc' => 'نهÙتن',
'thisisdeleted' => 'نمایش یا احیای $1؟',
'viewdeleted' => 'نمایش $1؟',
-'restorelink' => '{{PLURAL:$1|$1|$1}} ویرایش حذÙ‌شده',
+'restorelink' => '{{PLURAL:$1|یک|$1}} ویرایش حذÙ‌شده',
'feedlinks' => 'خبرخوان:',
-'feed-invalid' => 'اشکال در آبونمان خبرخوان',
-'feed-unavailable' => 'خبرخوان‌ها قابل استÙاده نیستند',
-'site-rss-feed' => 'خبرخوان RSS برای $1',
-'site-atom-feed' => 'خبرخوان Atom برای $1',
-'page-rss-feed' => 'خبرخوان RSS برای «$1»',
-'page-atom-feed' => 'خبرخوان Atom برای «$1»',
+'feed-invalid' => 'نوع خوراک خبرخوان مجاز نیست.',
+'feed-unavailable' => 'خوراک‌های خبرخوان در دسترس نیستند',
+'site-rss-feed' => 'خوراک آراس‌اس برای $1',
+'site-atom-feed' => 'خوراک اتم برای $1',
+'page-rss-feed' => 'خوراک آراس‌اس برای «$1»',
+'page-atom-feed' => 'خوراک اتم برای «$1»',
'feed-atom' => 'اتم',
'feed-rss' => 'آراس‌اس',
'red-link-title' => '$1 (صÙحه وجود ندارد)',
@@ -718,7 +722,7 @@ $1',
'nstab-image' => 'پرونده',
'nstab-mediawiki' => 'پیغام',
'nstab-template' => 'الگو',
-'nstab-help' => 'راهنما',
+'nstab-help' => 'صÙحهٔ راهنما',
'nstab-category' => 'رده',
# Main script and global functions
@@ -727,31 +731,32 @@ $1',
شما ممکن است نشانی اینترنتی را اشتباه وارد کرده باشید یا یک پیوند نادرست را دنبال کرده باشید.
هم‌چنین ممکن است ایرادی در {{SITENAME}} وجود داشته باشد.',
'nosuchspecialpage' => 'چنین صÙحهٔ ویژه‌ای وجود ندارد',
-'nospecialpagetext' => '<strong>شما صÙحهٔ ویژه‌ٔ غیر مجازی را درخواست کرده‌اید.</strong>
+'nospecialpagetext' => '<strong>شما صÙحهٔ ویژهٔ غیر مجازی را درخواست کرده‌اید.</strong>
Ùهرستی از صÙحه‌های ویژهٔ مجاز در [[Special:SpecialPages|{{int:specialpages}}]] وجود دارد.',
# General errors
'error' => 'خطا',
'databaseerror' => 'خطای پایگاه داده',
-'dberrortext' => 'اشکالی در دستور Ùرستاده شده به پایگاه داده رخ داد.
+'dberrortext' => 'اشکال نحوی در درخواست Ùرستاده شده به پایگاه داده رخ داد.
دلیل این مشکل می‌تواند ایرادی در نرم‌اÙزار باشد.
-این آخرین دستوری بود Ú©Ù‡ برای پایگاه داده Ùرستاده شد:
-<div style="direction:ltr;"><blockquote><tt>$1</tt></blockquote></div>
-این دستور از درون عملگر «<span style="direction:ltr;"><tt>$2</tt></span>» Ùرستاده شد.
+آخرین درخواست Ú©Ù‡ برای پایگاه داده Ùرستاد شد این بود:
+<blockquote style="direction:ltr;"><tt>$1</tt></blockquote>
+این درخواست از درون عملگر «<span class="ltr"><tt>$2</tt></span>» Ùرستاده شد.
پایگاه داده این خطا را بازگرداند:
-<div style="direction:ltr;"><tt>$3: $4</tt></div>',
-'dberrortextcl' => 'اشکالی در دستور Ùرستاده شده به پایگاه داده رخ داد.
-آخرین دستوری Ú©Ù‡ برای پایگاه داده Ùرستاد شد این بود:
-<div style="direction:ltr;">$1</div>
-این دستور از درون عملگر «<span style="direction:ltr;">$2</span>» Ùرستاده شد.
+<div class="ltr"><tt>$3: $4</tt></div>',
+'dberrortextcl' => 'اشکال نحوی در درخواست Ùرستاده شده به پایگاه داده رخ داد.
+آخرین درخواست Ú©Ù‡ برای پایگاه داده Ùرستاد شد این بود:
+<div class="ltr">$1</div>
+این درخواست از درون عملگر «<span class="ltr">$2</span>» Ùرستاده شد.
پایگاه داده این خطا را بازگرداند:
-<div style="direction:ltr;">$3: $4</div>',
-'laggedslavemode' => 'هشدار: صÙحه ممکن است به‌روزرسانی‌های اخیر را شامل نگردد.',
+<div class="ltr">$3: $4</div>',
+'laggedslavemode' => "'''هشدار:''' صÙحه ممکن است به‌روزرسانی‌های اخیر را شامل نگردد.",
'readonly' => 'پایگاه داده Ù‚ÙÙ„ شد',
-'enterlockreason' => 'دلیلی برای Ù‚ÙÙ„ کردن ذکر کنید، Ùˆ تقریبی از زمانی Ú©Ù‡ Ù‚ÙÙ„ برداشته خواهد شد در آن بیاورید',
-'readonlytext' => 'پایگاه داده در حال حاضر در برابر تغییرات Ùˆ ایجاد مداخل Ù‚ÙÙ„ شده است. احتمالاً علت آن بهینه‌سازی Ùˆ رسیدگی‌های معمول است Ú©Ù‡ بعد از انجام آن وضع به حالت عادی باز خواهد گشت. توضیح مدیری Ú©Ù‡ آن را Ù‚ÙÙ„ کرده است بدین شرح است:
-<p>$1',
+'enterlockreason' => 'دلیلی برای Ù‚ÙÙ„ کردن ذکر کنید، Ú©Ù‡ حاوی تقریبی از زمانی باشد Ú©Ù‡ Ù‚ÙÙ„ برداشته خواهد شد',
+'readonlytext' => 'پایگاه داده در حال حاضر در برابر تغییرات Ùˆ ایجاد مداخل Ù‚ÙÙ„ شده است. احتمالاً علت آن بهینه‌سازی Ùˆ رسیدگی‌های معمول است Ú©Ù‡ بعد از انجام آن وضع به حالت عادی باز خواهد گشت.
+
+مدیری Ú©Ù‡ آن را Ù‚ÙÙ„ کرده است این توضیح را ارائه کرده: $1',
'missing-article' => 'پایگاه داده متن صÙحه‌ای به نام «$1» $2 را Ú©Ù‡ باید می‌یاÙت، نیاÙت.
این مشکل معمولاً بر اثر ادامه دادن پیوندهای تاریخ‌گذشتهٔ تÙاوت یا تاریخچهٔ صÙحه‌هایی رخ می‌دهد Ú©Ù‡ حذ٠شده‌اند.
@@ -760,15 +765,15 @@ $1',
لطÙاً این مسئله را، با ذکر URLØŒ به یکی از مدیران گزارش کنید.',
'missingarticle-rev' => '(نسخهٔ شماره: $1)',
'missingarticle-diff' => '(تÙاوت: $1ØŒ $2)',
-'readonly_lag' => 'پایگاه داده به طور خودکار Ù‚ÙÙ„ شده‌است تا نسخه‌های پشتیبان با نسخهٔ اصلی هماهنگ شوند.',
+'readonly_lag' => 'پایگاه داده به طور خودکار Ù‚ÙÙ„ شده‌است تا نسخه‌های پشتیبان با نسخهٔ اصلی هماهنگ شوند',
'internalerror' => 'خطای داخلی',
'internalerror_info' => 'خطای داخلی: $1',
'fileappenderrorread' => 'در طی الحاق امکان خواندن «$1» وجود نداشت.',
-'fileappenderror' => 'نمی‌توان «$1» را به «$2» الحاق کرد.',
-'filecopyerror' => 'نتوانستم از پروندهٔ «$1» روی «$2» نسخه‌برداری کنم.',
-'filerenameerror' => 'نتوانستم پروندهٔ «$1» را به «$2» تغییر نام دهم.',
-'filedeleteerror' => 'نتوانستم پروندهٔ «$1» را حذ٠کنم',
-'directorycreateerror' => 'امکان ایجاد پوشه $1 وجود ندارد.',
+'fileappenderror' => 'نشد «$1» را به «$2» الحاق کرد.',
+'filecopyerror' => 'نشد از پروندهٔ «$1» روی «$2» نسخه‌برداری شود.',
+'filerenameerror' => 'نشد پروندهٔ «$1» به «$2» تغییر نام یابد.',
+'filedeleteerror' => 'نشد پروندهٔ «$1» حذ٠شود.',
+'directorycreateerror' => 'امکان ایجاد پوشه $1 وجود نداشت.',
'filenotfound' => 'پروندهٔ «$1» یاÙت نشد.',
'fileexistserror' => 'امکان نوشتن روی پرونده $1 وجود ندارد: پرونده از قبل وجود دارد.',
'unexpected' => 'مقدار غیرمنتظره: «$1»=«$2».',
@@ -777,11 +782,13 @@ $1',
'cannotdelete' => 'امکان حذ٠صÙحه یا تصویر «$1» وجود ندارد.
ممکن است قبلاً Ùرد دیگری آن را حذ٠کرده باشد.',
'badtitle' => 'عنوان بد',
-'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرست بود.',
-'perfcached' => 'داده‌های زیر از حاÙظهٔ موقت Ùراخوانی شده‌اند Ùˆ ممکن است کاملاً به‌روز نباشند:',
-'perfcachedts' => 'داده‌های زیر از حاÙظهٔ موقت Ùراخوانی شده‌اند Ùˆ آخرین به‌روزرسانی $1 است',
-'querypage-no-updates' => 'امکان به روز رسانی این صÙحه Ùعلاً غیرÙعال شده‌است.',
-'wrong_wfQuery_params' => 'پارامترهای wfQuery() نادرست است<br />
+'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرست بود.
+ممکن است حاوی یک یا چند نویسه باشد Ú©Ù‡ در عنوان‌ها نمی‌توانند استÙاده شوند.',
+'perfcached' => 'داده‌های زیر از حاÙظهٔ موقت Ùراخوانی شده‌اند Ùˆ ممکن است کاملاً به‌روز نباشند.',
+'perfcachedts' => 'داده‌های زیر از حاÙظهٔ موقت Ùراخوانی شده‌اند Ùˆ آخرین بار در $1 به‌روزرسانی شده است.',
+'querypage-no-updates' => 'امکان به‌روزرسانی این صÙحه Ùعلاً غیرÙعال شده‌است.
+اطلاعات این صÙحه Ù…Ú©Ù† است به‌روز نباشد.',
+'wrong_wfQuery_params' => 'پارامترهای wfQuery()‎ نادرست است<br />
تابع: $1<br />
پرس‌وجو: $2',
'viewsource' => 'نمایش مبدأ',
@@ -790,39 +797,41 @@ $1',
'actionthrottledtext' => 'به منظور جلوگیری از هرزنگاری، شما اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.
لطÙاً پس از چند دقیقه دوباره تلاش کنید.',
'protectedpagetext' => 'این صÙحه برای جلوگیری از ویرایش Ù‚ÙÙ„ شده‌است.',
-'viewsourcetext' => 'می‌توانید متن مبدأ این صÙحه را مشاهده کنید یا از آن نسخه بردارید',
+'viewsourcetext' => 'می‌توانید متن مبدأ این صÙحه را مشاهده کنید یا از آن نسخه بردارید:',
'protectedinterface' => 'این صÙحه ارائه‌دهندهٔ متنی برای رابط کاربر این نرم‌اÙزار است Ùˆ به منظور پیشگیری از خرابکاری Ù‚ÙÙ„ شده‌است.',
'editinginterface' => "'''هشدار:''' شما صÙحه‌ای را ویرایش می‌کنید Ú©Ù‡ شامل متنی است Ú©Ù‡ در رابط کاربر این نرم‌اÙزار به کار رÙته‌است.
تغییر این صÙحه منجر به تغییر ظاهر رابط کاربر این نرم‌اÙزار برای دیگر کاربران خواهد شد.
برای ترجمه، لطÙاً از [http://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]ØŒ پروژهٔ ترجمهٔ مدیاویکی، استÙاده کنید.",
-'sqlhidden' => '(دستور SQL پنهان شده)',
+'sqlhidden' => '(دستور اس‌کیوال پنهان شده)',
'cascadeprotected' => 'این صÙحه در مقابل ویرایش محاÙظت شده‌است برای اینکه در {{PLURAL:$1|صÙحهٔ|صÙحه‌های}} محاÙظت‌شدهٔ زیر Ú©Ù‡ گزینهٔ «آبشاری» در {{PLURAL:$1|آن|آنها}} انتخاب شده‌است، قرار گرÙته‌است:
$2',
'namespaceprotected' => "شما اجازهٔ ویرایش صÙحه‌های Ùضای نام '''$1''' را ندارید.",
'customcssjsprotected' => 'شما اجازهٔ ویرایش این صÙحه را ندارید، چرا Ú©Ù‡ حاوی تنظیم‌های شخصی یک کاربر دیگر است.',
-'ns-specialprotected' => 'صÙحه‌های Ùضای نام {{ns:special}} غیر قابل ویرایش هستند.',
-'titleprotected' => "از ایجاد صÙحه‌ای با این عنوان توسط [[User:$1|$1]] جلوگیری شده‌است. دلیل ذکر شده از این قرار است: ''$2''.",
+'ns-specialprotected' => 'صÙحه‌های ویژه غیر قابل ویرایش هستند.',
+'titleprotected' => "از ایجاد صÙحه‌ای با این عنوان توسط [[User:$1|$1]] جلوگیری شده‌است.
+دلیل ذکر شده از این قرار است: ''$2''.",
# Virus scanner
-'virus-badscanner' => "تنظیمات بد: پویشگر ویروس ناشناخته: ''$1''",
+'virus-badscanner' => "پیکربندی بد: پویشگر ویروس ناشناخته: ''$1''",
'virus-scanfailed' => 'پویش ناموÙÙ‚ (کد $1)',
'virus-unknownscanner' => 'ضدویروس ناشناخته:',
# Login and logout pages
-'logouttext' => "'''اکنون از سامانه خارج شدید.'''
+'logouttext' => "'''اینک از سامانه خارج شدید.'''
-شما می‌توانید به استÙادهٔ گمنام از {{SITENAME}} ادامه دهید، یا می‌توانید با همین کاربر یا کاربر دیگری [[Special:UserLogin|به سامانه وارد شوید]].
+شما می‌توانید به استÙادهٔ گمنام از {{SITENAME}} ادامه دهید، یا می‌توانید با همین حساب یا حساب دیگری [[Special:UserLogin|به سامانه وارد شوید]].
توجه کنید Ú©Ù‡ تا زمانی Ú©Ù‡ میانگیر مرورگرتان را پاک کنید، بعضی صÙحه‌ها ممکن است به Ø´Ú©Ù„ÛŒ نمایش یابند Ú©Ù‡ انگار هنوز وارد سامانه هستید.",
'welcomecreation' => '==$1، خوش آمدید!==
حساب شما ایجاد شد.
-Ùراموش نکنید Ú©Ù‡ [[Special:Preferences|ترجیحات {{SITENAME}}]] خود را تنظیم کنید.',
-'yourname' => 'نام کاربری شما',
-'yourpassword' => 'گذرواژهٔ شما',
+Ùراموش نکنید Ú©Ù‡ [[Special:Preferences|ترجیحات {{SITENAME}}]] را برای خود را تغییر دهید.',
+'yourname' => 'نام کاربری',
+'yourpassword' => 'گذرواژهٔ',
'yourpasswordagain' => 'گذرواژه را دوباره وارد کنید',
-'remembermypassword' => 'گذرواژه را به یاد بسپار.',
-'yourdomainname' => 'دامنهٔ شما',
-'externaldberror' => 'خطایی در ارتباط با پایگاه داده رخ داده‌است یا این که شما اجازه به روز رسانی حساب بیرونی خود را ندارید.',
+'remembermypassword' => 'گذرواژه را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این رایانه به خاطر بسپار',
+'securelogin-stick-https' => 'پس از ورود به سامانه به HTTPS متصل بمان',
+'yourdomainname' => 'دامنهٔ شما:',
+'externaldberror' => 'خطایی در ارتباط با پایگاه داده رخ داده‌است یا این که شما اجازه به‌روزرسانی حساب خارجی خود را ندارید.',
'login' => 'ورود به سامانه',
'nav-login-createaccount' => 'ورود به سامانه / ایجاد حساب کاربری',
'loginprompt' => 'برای ورود به {{SITENAME}} باید کوکی‌ها را Ùعال کنید.',
@@ -831,12 +840,13 @@ $2',
'logout' => 'خروج از سامانه',
'userlogout' => 'خروج از سامانه',
'notloggedin' => 'به سامانه وارد نشده‌اید',
-'nologin' => "نام کاربری ندارید؟ '''$1'''.",
+'nologin' => 'نام کاربری ندارید؟ $1.',
'nologinlink' => 'یک حساب جدید بسازید',
'createaccount' => 'ایجاد حساب کاربری',
'gotaccount' => "حساب کاربری دارید؟ '''$1'''.",
'gotaccountlink' => 'وارد شوید',
'createaccountmail' => 'با پست الکترونیکی',
+'createaccountreason' => 'دلیل:',
'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
'userexists' => 'نام کاربری‌ای Ú©Ù‡ وارد کردید قبلاً استÙاده شده‌است.
لطÙاً یک نام دیگر انتخاب کنید.',
@@ -851,20 +861,26 @@ $2',
لطÙاً کوکی‌ها را به کار بیندازید Ùˆ دوباره تلاش کنید.',
'noname' => 'شما نام کاربری معتبری مشخص نکرده‌اید.',
'loginsuccesstitle' => 'ورود موÙقیت‌آمیز به سامانه',
-'loginsuccess' => 'شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.',
+'loginsuccess' => "'''شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.'''",
'nosuchuser' => 'کاربری با نام «$1» وجود ندارد.
نام کاربری به بزرگی و کوچکی حرو٠حساس است.
املای نام را بررسی کنید، یا [[Special:UserLogin/signup|یک حساب کاربری جدید بسازید]].',
-'nosuchusershort' => "هیچ کاربری با نام ''<nowiki>$1</nowiki>'' وجود ندارد. املایتان را وارسی کنید.",
+'nosuchusershort' => "هیچ کاربری با نام ''<nowiki>$1</nowiki>'' وجود ندارد.
+املایتان را وارسی کنید.",
'nouserspecified' => 'باید یک نام کاربری مشخص کنید.',
'login-userblocked' => 'این کاربر بسته شده‌است. ورود به سامانه مجاز نیست.',
-'wrongpassword' => 'گذرواژه‌ای Ú©Ù‡ وارد کردید نادرست است. لطÙاً دوباره تلاش کنید.',
-'wrongpasswordempty' => 'گذرواژه‌ای که وارد کرده‌اید، خالی است. خواهشمندیم دوباره تلاش کنید.',
+'wrongpassword' => 'گذرواژه‌ای که وارد کردید نادرست است.
+لطÙاً دوباره تلاش کنید.',
+'wrongpasswordempty' => 'گذرواژه‌ای که وارد کرده‌اید، خالی است.
+لطÙاً دوباره تلاش کنید.',
'passwordtooshort' => 'گذرواژه باید دست Ú©Ù… {{PLURAL:$1|$1 حرÙ|$1 حرÙ}} داشته باشد.',
'password-name-match' => 'گذرواژهٔ شما باید با نام کاربری شما تÙاوت داشته باشد.',
-'mailmypassword' => 'گذرواژهٔ جدید Ùرستاده شود',
+'password-login-forbidden' => 'استÙاده از این نام کاربری Ùˆ گذرواژه ممنوع است.',
+'mailmypassword' => 'گذرواژهٔ جدید با پست الکترونیکی Ùرستاده شود',
'passwordremindertitle' => 'یادآور گذرواژهٔ {{SITENAME}}',
-'passwordremindertext' => 'یک Ù†Ùر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری‌ شما در {{SITENAME}} درخواست کرده‌است ($4). یک گذرواژهٔ موقت برای کاربر «$2» ساخته شده Ùˆ برابر با «$3» قرار داده شده‌است. اگر هد٠شما همین بوده‌است، شما باید اکنون به سامانه وارد شوید Ùˆ گذرواژهٔ جدیدی برگزینید.
+'passwordremindertext' => 'یک Ù†Ùر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری‌ شما در {{SITENAME}} درخواست کرده‌است ($4).
+ک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شده‌است.
+اگر هد٠شما همین بوده‌است، شما باید اکنون به سامانه وارد شوید و گذرواژهٔ جدیدی برگزینید.
گذرواژهٔ موقت شما ظر٠{{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.
اگر کس دیگری این درخواست را کرده‌است یا این که شما گذرواژهٔ پیشین خود را به یاد آورده‌اید و دیگر تمایل به تغییر آن ندارید، می‌توانید این پیغام را نادیده بگیرید و همان گذرواژهٔ پیشین را به کار برید.',
@@ -873,44 +889,47 @@ $2',
'passwordsent' => 'یک گذرواژهٔ جدید به نشانی الکترونیکی ثبت شده برای کاربر «$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' => 'نشانی پست الکترونیکی شما <strong>هنوز تصدیق نشده است.</strong> هیچ نامهٔ الکترونیکی‌ای برای هر یک از ویژگی‌های زیر ارسال نخواهد شد.',
+'emailnotauthenticated' => 'نشانی پست الکترونیکی شما <strong>هنوز تصدیق نشده است.
+برای هیچ یک از ویژگی‌های زیر نامهٔ الکترونیکی ارسال نخواهد شد.',
'noemailprefs' => 'برای راه‌اندازی این قابلیت‌ها یک نشانی پست الکترونیکی مشخص کنید.',
'emailconfirmlink' => 'نشانی پست الکترونیکی خود را تأیید کنید',
'invalidemailaddress' => 'نشانی واردشدهٔ پست الکترونیک قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.
لطÙاً نشانی‌ای با ساختار صحیح وارد کنید Ùˆ یا بخش مربوط را خالی بگذارید.',
-'accountcreated' => 'حساب ایجاد شد.',
+'accountcreated' => 'حساب ایجاد شد',
'accountcreatedtext' => 'حساب کاربری $1 ایجاد شده‌است.',
'createaccount-title' => 'ایجاد حساب کاربری در {{SITENAME}}',
-'createaccount-text' => 'یک Ù†Ùر برای $2 یک حساب کاربری در {{SITENAME}} ایجاد کرده‌است ($4).
-گذرواژهٔ «$2« چنین است: $3
-
+'createaccount-text' => 'یک Ù†Ùر برای پست الکترونیک شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)ØŒ Ú©Ù‡ گذرواژهٔ آن چنین است: $3
شما باید به سامانه وارد شوید تا گذرواژهٔ خود را تغییر بدهید.
اگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.',
'usernamehasherror' => 'نام کاربری نمی‌تواند شامل نویسه‌های درهم باشد',
'login-throttled' => 'شما به تازگی چندین بار برای ورود به سامانه تلاش کرده‌اید.
-لطÙاً پیش از آن Ú©Ù‡ دوباره تلاش کنید، صبر کنید.',
+لطÙاً پیش از آن Ú©Ù‡ دوباره تلاش کنید مدتی صبر کنید.',
'loginlanguagelabel' => 'زبان: $1',
'suspicious-userlogout' => 'درخواست شما برای خروج از سامانه رد شد زیرا به نظر می‌رسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.',
+# E-mail sending
+'php-mail-error-unknown' => 'خطای ناشناخته در تابع mail()‎ پی‌اچ‌پی',
+
# Password reset dialog
'resetpass' => 'تغییر گذرواژه',
'resetpass_announce' => 'شما با کد موقتی ارسال شده وارد شده‌اید.
برای انجام Ùرایند ورود به سامانه باید گذروازهٔ جدیدی وارد کنید:',
'resetpass_text' => '<!-- اینجا متن اضاÙÙ‡ کنید -->',
'resetpass_header' => 'تغییر گذرواژهٔ حساب کاربری',
-'oldpassword' => 'گذرواژهٔ پیشین',
+'oldpassword' => 'گذرواژهٔ پیشین:',
'newpassword' => 'گذرواژهٔ جدید:',
'retypenew' => 'گذرواژهٔ جدید را دوباره وارد کنید',
'resetpass_submit' => 'تنظیم گذرواژه و ورود به سامانه',
-'resetpass_success' => 'گذرواژهٔ شما با موÙقیت تغییر داده شد.
+'resetpass_success' => 'گذرواژهٔ شما با موÙقیت تغییر داده شد!
در حال وارد کردن شما به سامانه...',
'resetpass_forbidden' => 'نمی‌توان گذرواژه‌ها را تغییر داد',
'resetpass-no-info' => 'برای دسترسی مستقیم به این صÙحه شما باید به سامانه وارد شده باشید.',
@@ -935,12 +954,12 @@ $2',
'math_tip' => 'Ùرمول ریاضی (LaTeX)',
'nowiki_sample' => 'اینجا متن قالب‌بندی‌نشده وارد شود',
'nowiki_tip' => 'نادیده گرÙتن قالب‌بندی ویکی',
-'image_sample' => 'مثال.jpg',
+'image_sample' => 'Example.jpg',
'image_tip' => 'تصویر داخل متن',
-'media_sample' => 'مثال.ogg',
-'media_tip' => 'پیوند پروندهٔ رسانه',
+'media_sample' => 'Example.ogg',
+'media_tip' => 'پیوند پرونده',
'sig_tip' => 'امضای شما و برچسب زمان',
-'hr_tip' => 'خط اÙÙ‚ÛŒ (در کاربرد آن امساک کنید)',
+'hr_tip' => 'خط اÙÙ‚ÛŒ (از آن Ú©Ù… استÙاده کنید)',
# Edit pages
'summary' => 'خلاصه:',
@@ -954,12 +973,15 @@ $2',
'showdiff' => 'نمایش تغییرات',
'anoneditwarning' => "'''هشدار:''' شما به سامانه وارد نشده‌اید.
نشانی آی‌پی شما در تاریخچهٔ ویرایش این صÙحه ثبت خواهد شد.",
-'missingsummary' => "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید. اگر دوباره ''ذخیره'' را کلیک کنید ویرایشتان بدون خلاصه ذخیره خواهد شد.",
+'anonpreviewwarning' => "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود Ú©Ù‡ نشانی آی‌پی شما در تاریخچهٔ این صÙحه ثبت گردد.''",
+'missingsummary' => "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.
+اگر دوباره دکمهٔ «{{int:savearticle}}» را Ùشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
'missingcommenttext' => 'لطÙاً توضیحی در زیر بیÙزایید.',
-'missingcommentheader' => "یادآوری: '''شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.''' اگر دوباره دکمهٔ ذخیره را Ùشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+'missingcommentheader' => "'''یادآوری:''' شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.
+اگر دوباره دکمهٔ «{{int:savearticle}}» را Ùشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
'summary-preview' => 'پیش‌نمایش خلاصه:',
'subject-preview' => 'پیش‌نمایش موضوع/عنوان:',
-'blockedtitle' => 'کاربر بسته شد.',
+'blockedtitle' => 'کاربر بسته شد',
'blockedtext' => "'''دسترسی نام کاربری یا نشانی آی‌پی شما بسته شده است.'''
این کار توسط $1 انجام شده‌است.
@@ -1005,7 +1027,7 @@ $2',
ممکن است در مدتی Ú©Ù‡ شما صÙحه را مشاهده می‌کردید این بخش جا به جا یا حذ٠شده باشد.',
'loginreqtitle' => 'ورود به سامانه لازم است',
'loginreqlink' => 'به سامانه وارد شوید',
-'loginreqpagetext' => 'برای دیدن صÙحه‌های دیگر باید $1 کنید.',
+'loginreqpagetext' => 'برای دیدن صÙحه‌های دیگر باید $1.',
'accmailtitle' => 'گذرواژه Ùرستاده شد.',
'accmailtext' => "یک گذرواژهٔ تصادÙÛŒ ساخته شده برای [[User talk:$1|$1]] برای $2 ارسال شد.
@@ -1025,62 +1047,76 @@ $2',
'noarticletext-nopermission' => 'در حال حاضر این صÙحه متنی ندارد.
شما می‌توانید در دیگر صÙحه‌ها [[Special:Search/{{PAGENAME}}|دنبال عنوان این صÙحه بگردید]]ØŒ
یا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را جستجو کنید]</span>.',
-'userpage-userdoesnotexist' => 'حساب کاربر «$1» ثبت نشده است. اطمینان حاصلی کنید Ú©Ù‡ می‌خواهید این صÙحه را ایجاد یا ویرایش کنید.',
+'userpage-userdoesnotexist' => 'حساب کاربر «$1» ثبت نشده است.
+اطمینان حاصلی کنید Ú©Ù‡ می‌خواهید این صÙحه را ایجاد یا ویرایش کنید.',
'userpage-userdoesnotexist-view' => 'حساب کاربری «$1» ثبت نشده‌است.',
'blocked-notice-logextract' => 'دسترسی این کاربر در حال حاضر بسته است.
آخرین مورد سیاهه قطع دسترسی در زیر آمده‌است:',
-'clearyourcache' => "'''نکته:''' پس از ذخیره‌سازی ممکن است برای دیدن تغییرات نیاز باشد Ú©Ù‡ حاÙظهٔ نهانی مرورگر خود را خالی کنید. '''موزیلا / ÙایرÙاکس / Safari:''' کلید '''Shift''' را نگه‌دارید Ùˆ روی دکمهٔ '''Reload''' کلیک کنید، یا کلید‌های '''Ctrl-Shift-R''' را با هم Ùشار دهید (در رایانه‌های اپل مکینتاش کلید‌های '''Cmd-Shift-R''')Ø› '''اینترنت اکسپلورر:''' کلید '''Ctrl''' نگه‌دارید Ùˆ روی دکمهٔ '''Refresh''' کلیک‌ کنید، یا کلید‌های '''Ctrl-F5''' را با هم Ùشار دهید؛ '''Konqueror:''' روی دکمهٔ '''Reload''' کلیک کنید Ùˆ یا کلید '''F5''' را Ùشار دهید؛ '''اÙپرا:''' کاربران اÙپرا ممکن است لازم باشد Ú©Ù‡ بطور کامل حاÙظهٔ نهانی مرورگر را در منوی ''Tools&rarr;Preferences'' خالی کنند.",
+'clearyourcache' => "'''نکته: پس از ذخیره‌سازی ممکن است برای دیدن تغییرات نیاز باشد Ú©Ù‡ حاÙظهٔ نهانی مرورگر خود را خالی کنید.'''
+'''موزیلا / ÙایرÙاکس / ساÙاری:''' کلید ''Shift'' را نگه‌دارید Ùˆ روی دکمهٔ ''Reload'' کلیک کنید، یا کلید‌های ''Ctrl-F5'' یا ''Ctrl-R'' را با هم Ùشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ''Cmd-R'')Ø›
+'''کانکوئرر:''' روی دکمهٔ ''Reload'' کلیک کنید Ùˆ یا کلید ''F5'' را Ùشار دهید؛
+'''اپرا:''' حاÙظهٔ نهانی مرورگر را از طریق منوی ''Tools &rarr; Preferences'' خالی کنید؛
+'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگه‌دارید Ùˆ روی دکمهٔ ''Refresh'' کلیک‌ کنید، یا کلید‌های ''Ctrl-F5'' را با هم Ùشار دهید.",
'usercssyoucanpreview' => "'''نکته:''' قبل از این Ú©Ù‡ Ùایل CSS یا JS خود را ذخیره کنید، با استÙاده از دکمه '''{{int:showpreview}}''' آن را آزمایش کنید.",
'userjsyoucanpreview' => "'''نکته:''' قبل از این Ú©Ù‡ Ùایل CSS یا JS خود را ذخیره کنید، با استÙاده از دکمه '''{{int:showpreview}}''' آن را آزمایش کنید.",
-'usercsspreview' => "'''Ùراموش نکنید Ú©Ù‡ سی‌اس‌اس کاربریتان Ùقط پیش‌نمایش یاÙته‌است Ùˆ هنوز ذخیره نشده‌است!'''",
-'userjspreview' => "'''Ùراموش مکنید Ú©Ù‡ شما Ùقط دارید جاوااسکریپت کاربریتان را امتحان می‌کنید/پیش‌نمایشش را می‌بینید. هنوز ذخیره نشده‌است!'''",
+'usercsspreview' => "'''Ùراموش مکنید Ú©Ù‡ شما Ùقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''
+'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
+'userjspreview' => "'''به یاد داشته باشید Ú©Ù‡ شما Ùقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''
+'''این جاوااسکریپت هنوز ذخیره نشده‌است!'''",
+'sitecsspreview' => "'''به یاد داشته باشید Ú©Ù‡ شما Ùقط مشاهده‌گر پیش‌نمایش این سی‌اس‌اس هستید.'''
+'''این سی‌اس‌اس هنوز ذخیره نشده ‌است!'''",
+'sitejspreview' => "'''به یاد داشته باشید Ú©Ù‡ شما Ùقط مشاهده‌گر پیش‌نمایش این جاوااسکریپت هستید.'''
+'''این جاوااسکریپت هنوز ذخیره نشده ‌است!'''",
'userinvalidcssjstitle' => "'''هشدار:''' پوسته‌ای به نام «$1» وجود ندارد.
-به یاد داشته باشید Ú©Ù‡ صÙحه‌های شخصی &#8206;.css Ùˆ &#8206;.js باید عنوانی با حرو٠کوچک داشته باشند؛ نمونه: {{ns:user}}:ÙÙˆ/monobook.css در مقابل {{ns:user}}:ÙÙˆ/Monobook.css.",
+به یاد داشته باشید Ú©Ù‡ صÙحه‌های شخصی ‎.css Ùˆ ‎.js باید عنوانی با حرو٠کوچک داشته باشند؛ نمونه: {{ns:user}}:ÙÙˆ/vector.css در مقابل {{ns:user}}:ÙÙˆ/Vector.css.",
'updated' => '(به‌روز شد)',
'note' => "'''نکته:'''",
-'previewnote' => "'''توجه کنید Ú©Ù‡ این Ùقط پیش‌نمایش است، Ùˆ ذخیره نشده است!'''",
-'previewconflict' => 'این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است،
-به شکلی که اگر بخواهید متن را ذخیره کنید نشان داده خواهد شد.',
+'previewnote' => "'''به یاد داشته باشید Ú©Ù‡ این Ùقط پیش‌نمایش است.'''
+تغییرات شما هنوز ذخیره نشده است!",
+'previewconflict' => 'این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به Ø´Ú©Ù„ÛŒ Ú©Ù‡ اگر متن را ذخیره کنید نمایش خواهد یاÙت.',
'session_fail_preview' => "'''شرمنده! به دلیل از دست رÙتن اطلاعات نشست کاربری، نمی‌توانیم ویرایش شما را پردازش کنیم.'''
لطÙاً دوباره سعی کنید.
-در صورتی که باز هم با همین پیام مواجه شدید، از سامانه [[Special:UserLogout|خارج شوید]] و مجدداً وارد شوید.",
+در صورتی که باز هم با همین پیام مواجه شدید، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
'session_fail_preview_html' => "'''متاسÙانه امکان ثبت ویرایش شما به خاطر از دست رÙتن اطلاعات نشست کاربری وجود ندارد.'''
''با توجه به این Ú©Ù‡ در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام Ùعال است، پیش‌نمایش صÙحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''
'''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''
اگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
-'token_suffix_mismatch' => "'''ویرایش شما ذخیره نشد، زیرا مرورگر شما نویسه‌های نقطه‌گذاری را از هم پاشیده‌است.
-ویرایش شما ذخیره نشد تا از خراب شدن متن صÙحه جلوگیری شود.
-گاهی این اشکال زمانی پیش می‌آید Ú©Ù‡ شما از یک برنامه تحت وب حدواسط (web-based proxy) استÙاده کنید.'''",
+'token_suffix_mismatch' => "'''ویرایش شما ذخیره نشد، زیرا مرورگر شما نویسه‌های نقطه‌گذاری را از هم پاشیده‌است.'''
+ویرایش شما مردود شد تا از خراب شدن متن صÙحه جلوگیری شود.
+گاهی این اشکال زمانی پیش می‌آید Ú©Ù‡ شما از یک پروکسی تحت وب استÙاده کنید.",
'editing' => 'در حال ویرایش $1',
'editingsection' => 'در حال ویرایش $1 (بخش)',
'editingcomment' => 'در حال ویرایش $1 (بخش جدید)',
'editconflict' => 'تعارض ویرایشی: $1',
-'explainconflict' => 'از وقتی شما ویرایش این صÙحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.
+'explainconflict' => "از وقتی شما ویرایش این صÙحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.
ناحیهٔ متنی بالایی شامل متن صÙحه به Ø´Ú©Ù„ Ùعلی آن است.
تغییرات شما در ناحیهٔ متنی پایینی نشان داده شده است.
شما باید تغییراتتان را با متن Ùعلی ترکیب کنید.
-وقتی «ذخیرهٔ صÙحه» را Ùشار دهید، <b>Ùقط</b> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.',
+وقتی دکمهٔ «{{int:savearticle}}» را Ùشار دهید '''Ùقط''' متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
'yourtext' => 'متن شما',
-'storedversion' => 'نسخهٔ ضبط‌شده',
-'nonunicodebrowser' => "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.''' کاراکترهای غیر ASCII به صورت اعداد در مبنای شانزده به شما نشان داده می‌شوند.",
+'storedversion' => 'نسخهٔ ذخیره شده',
+'nonunicodebrowser' => "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''
+راه حلی به کار گرÙته شده تا شما بتوانید صÙحه‌ها را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
'editingold' => "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صÙحه هستید.'''
چنان‌چه صÙحه را ذخیره کنید، هر تغییری Ú©Ù‡ پس از این نسخه انجام شده‌است از بین خواهد رÙت.",
'yourdiff' => 'تÙاوت‌ها',
-'copyrightwarning' => "لطÙاً توجه داشته باشید Ú©Ù‡ Ùرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} تحت «$2» منتشر می‌شوند (برای جزئیات بیشتر به $1 مراجعه کنید). اگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شده Ùˆ به دلخواه توزیع شود، اینجا Ù†Ùرستیدشان.<br />
-همینطور شما دارید به ما قول می‌دهید Ú©Ù‡ خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید. '''کارهای دارای حق انحصاری تکثیر (copyright) را بی‌اجازه Ù†Ùرستید!'''",
-'copyrightwarning2' => "لطÙاً توجه داشته باشید Ú©Ù‡ Ùرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} تحت «اجازه‌نامهٔ مستندات آزاد گنو» منتشر می‌شوند (برای جزئیات بیشتر به $1 مراجعه کنید). اگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شده Ùˆ به دلخواه توزیع شود، اینجا Ù†Ùرستیدشان.<br />
-همینطور شما دارید به ما قول می‌دهید Ú©Ù‡ خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید. '''کارهای دارای حق انحصاری تکثیر (copyright) را بی‌اجازه Ù†Ùرستید!'''",
-'longpagewarning' => "'''هشدار''': طول این صÙحه $1 کیلوبایت است؛
-بعضی مرورگرها ممکن است با ویرایش صÙحه‌های نزدیک به Û³Û² کیلوبایت یا طولانی‌تر از آن مشکل داشته باشند.
-لطÙاً تقسیم این صÙحه به قسمت‌های کوچکتر را مد نظر داشته باشید.",
-'longpageerror' => "'''خطا: متنی که ارسال کرده‌اید $1 کیلوبایت طول دارد. این مقدار از مقدار بیشینهٔ $2 کیلوبایت بیشتر است. نمی‌توان ذخیره‌اش کرد.'''",
-'readonlywarning' => "'''هشدار: پایگاه داده برای نگهداری Ù‚ÙÙ„ شده است، به همین خاطر نمی‌توانید ویرایش‌هایتان را همین الآن ذخیره کنید.
-اگر می‌خواهید متن را در یک پروندهٔ متنی ببرید و بچسبانید و برای آینده ذخیره‌اش کنید.
-
-مدیری Ú©Ù‡ پایگاه داده را Ù‚ÙÙ„ کرد این توضیح را ارائه کرد: $1'''",
-'protectedpagewarning' => "'''هشدار: این صÙحه Ù‚ÙÙ„ شده است تا Ùقط کاربران با امتیاز مدیر (یا بالاتر) بتوانند ویرایشش کنند.'''
+'copyrightwarning' => "لطÙاً توجه داشته باشید Ú©Ù‡ Ùرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} تحت «$2» منتشر می‌شوند (برای جزئیات بیشتر به $1 مراجعه کنید).
+اگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شده Ùˆ به دلخواه توزیع شود، اینجا Ù†Ùرستیدشان.<br />
+همچنین شما دارید به ما قول می‌دهید که خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید.
+'''کارهای دارای حق تکثیر (copyright) را بی‌اجازه Ù†Ùرستید!'''",
+'copyrightwarning2' => "لطÙاً توجه داشته باشید Ú©Ù‡ Ùرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} ممکن است توسط دیگر مشارکت‌کنندگان ویرایش شوند، تغییر یابند یا حذ٠شوند.
+اگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شود، اینجا Ù†Ùرستیدشان.<br />
+همچنین شما دارید به ما قول می‌دهید که خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید (برای جزئیات بیشتر به $1 مراجعه کنید).
+ '''کارهای دارای حق تکثیر (copyright) را بی‌اجازه Ù†Ùرستید!'''",
+'longpageerror' => "'''خطا: متنی که ارسال کرده‌اید $1 کیلوبایت طول دارد. این مقدار از مقدار بیشینهٔ $2 کیلوبایت بیشتر است.'''
+نمی‌توان آن را ذخیره کرد.",
+'readonlywarning' => "'''هشدار: پایگاه داده برای نگهداری Ù‚ÙÙ„ شده است، به همین خاطر نمی‌توانید ویرایش‌هایتان را همین الآن ذخیره کنید.'''
+اگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.
+
+مدیری Ú©Ù‡ آن را Ù‚ÙÙ„ کرده است این توضیح را ارائه کرده: $1",
+'protectedpagewarning' => "'''هشدار: این صÙحه Ù‚ÙÙ„ شده است تا Ùقط کاربران با امتیاز مدیر بتوانند ویرایشش کنند.'''
آخرین موارد سیاهه در زیر آمده است:",
'semiprotectedpagewarning' => "'''توجه:''' این صÙحه Ù‚ÙÙ„ شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن‌ باشند.
آخرین موارد سیاهه در زیر آمده‌است:",
@@ -1089,63 +1125,63 @@ $2',
ٱحرین موارد سیاهه در زیر آمده است:",
'templatesused' => '{{PLURAL:$1|الگوی|الگوهای}} استÙاده شده در این صÙحه:',
'templatesusedpreview' => '{{PLURAL:$1|الگوی|الگوهای}} استÙاده شده در این پیش‌نمایش:',
-'templatesusedsection' => '{{PLURAL:$1|الگوی|الگوهای}} استÙاده‌شده در این بخش:',
+'templatesusedsection' => '{{PLURAL:$1|الگوی|الگوهای}} استÙاده شده در این بخش:',
'template-protected' => '(Ø­Ùاظت‌شده)',
-'template-semiprotected' => '(نیمه Ø­Ùاظت‌شده)',
+'template-semiprotected' => '(نیمه‌حÙاظت‌شده)',
'hiddencategories' => 'این صÙحه در {{PLURAL:$1|یک ردهٔ پنهان|$1 ردهٔ پنهان}} قرار دارد:',
'edittools' => '<!-- متن این قسمت زیر صÙحه‌های ویرایش Ùˆ بارگذاری نشان داده می‌شود -->',
-'nocreatetitle' => 'ایجاد صÙحه محدود شده‌است.',
-'nocreatetext' => 'این وبگاه قابلیت ایجاد صÙحه‌های جدید را محدود کرده‌است.
+'nocreatetitle' => 'ایجاد صÙحه محدود شده‌است',
+'nocreatetext' => '{{SITENAME}} قابلیت ایجاد صÙحه‌های جدید را محدود کرده‌است.
می‌توانید بازگردید Ùˆ صÙحه‌ای موجود را ویرایش کنید یا اینکه [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].',
-'nocreate-loggedin' => 'شما اجازهٔ ایجاد صÙحه‌های جدید ندارید.',
+'nocreate-loggedin' => 'شما اجازه ندارد صÙحه‌های جدید بسازید.',
'sectioneditnotsupported-title' => 'ویرایش بخش‌ها پشتیبانی نمی‌شود',
-'sectioneditnotsupported-text' => 'این صÙحه از ویرایش بخش‌ها پشتیبانی نمی‌کند',
+'sectioneditnotsupported-text' => 'این صÙحه از ویرایش بخش‌ها پشتیبانی نمی‌کند.',
'permissionserrors' => 'خطای سطح دسترسی',
'permissionserrorstext' => 'شما اجازهٔ انجام این کار را به {{PLURAL:$1|دلیل|دلایل}} زیر ندارید:',
-'permissionserrorstext-withaction' => 'شما اجازهٔ $2 را به {{PLURAL:$1|دلیل|دلایل}} رو به رو ندارید:',
-'recreate-moveddeleted-warn' => "'''هشدار: شما در حال ایجاد صÙحه‌ای هستید Ú©Ù‡ قبلاً حذ٠شده بود.'''
+'permissionserrorstext-withaction' => 'شما اجازهٔ $2 را به {{PLURAL:$1|دلیل|دلایل}} زیر ندارید:',
+'recreate-moveddeleted-warn' => "'''هشدار: شما در حال ایجاد صÙحه‌ای هستید Ú©Ù‡ قبلاً حذ٠شده است.'''
در نظر داشته باشید Ú©Ù‡ آیا ادامهٔ ویرایش این صÙحه کار درستی است یا نه.
-در ادامه سیاههٔ حذ٠و انتقال این صÙحه برای راحتی نمایش داده شده‌است:",
+برای راحتی، سیاههٔ حذ٠و انتقال برای این صÙحه در زیر آمده است:",
'moveddeleted-notice' => 'این صÙحه حذ٠شده‌است.
-در ادامه سیاههٔ حذ٠و انتقال این صÙحه نمایش داده شده‌است.',
+در زیر سیاههٔ حذ٠و انتقال این صÙحه نمایش داده شده‌است.',
'log-fulllog' => 'مشاهدهٔ سیاههٔ کامل',
'edit-hook-aborted' => 'ویرایش توسط قلاب لغو شد.
توضیحی در این مورد داده نشد.',
-'edit-gone-missing' => 'امکان به روز کردن صÙحه وجود ندارد.
-به نظرمیرسد Ú©Ù‡ صÙحه حذ٠شده باشد.',
+'edit-gone-missing' => 'امکان به‌روز کردن صÙحه وجود ندارد.
+به نظرمی‌رسد Ú©Ù‡ صÙحه حذ٠شده باشد.',
'edit-conflict' => 'تعارض ویرایشی.',
'edit-no-change' => 'ویرایش شما نادیده گرÙته شد، زیرا تغییری در متن داده نشده بود.',
'edit-already-exists' => 'امکان ساختن صÙحه جدید وجود ندارد.
این صÙحه از قبل وجود دارد.',
# Parser/template warnings
-'expensive-parserfunction-warning' => 'هشدار: این صÙحه حاوی تعدادی زیادی Ùراخوانی دستورهای تجزیه‌گر است.
+'expensive-parserfunction-warning' => "'''هشدار:''' این صÙحه حاوی تعدادی زیادی Ùراخوانی دستورهای تجزیه‌گر است.
-تعداد آن‌ها باید کمتر از $2 {{PLURAL:$2|Ùراخوانی|Ùراخوانی}} باشد، Ùˆ اینک {{PLURAL:$1|$1 Ùراخوانی|$1 Ùراخوانی}} است.',
-'expensive-parserfunction-category' => 'صÙحه‌هایی Ú©Ù‡ حاوی تعداد زیادی Ùراخوانی دستورهای تجزیه‌گر هستند',
+تعداد آن‌ها باید کمتر از $2 {{PLURAL:$2|Ùراخوانی|Ùراخوانی}} باشد، Ùˆ اینک {{PLURAL:$1|$1 Ùراخوانی|$1 Ùراخوانی}} است.",
+'expensive-parserfunction-category' => 'صÙحه‌هایی Ú©Ù‡ حاوی تعداد زیادی Ùراخوانی سنگین دستورهای تجزیه‌گر هستند',
'post-expand-template-inclusion-warning' => 'هشدار: الگو بیش از اندازه بزرگ است.
برخی الگوها ممکن است شامل نشوند.',
'post-expand-template-inclusion-category' => 'صÙحه‌هایی Ú©Ù‡ در آن‌ها تعداد الگوهای به کار رÙته بیش از اندازه است',
-'post-expand-template-argument-warning' => 'هشدار: این صÙحه شامل دست Ú©Ù… یک پارامتر الگو است Ú©Ù‡ بیش از اندازه بزرگ است.
-این پارامترها نادیده گرÙته شدند.',
+'post-expand-template-argument-warning' => "'''هشدار:''' این صÙحه شامل دست Ú©Ù… یک پارامتر الگو است Ú©Ù‡ بیش از اندازه بزرگ است.
+این پارامترها نادیده گرÙته شدند.",
'post-expand-template-argument-category' => 'صÙحه‌های دارای الگوهایی با پارامترهای نادیده گرÙته شده',
'parser-template-loop-warning' => 'حلقه در الگو پیدا شد: [[$1]]',
'parser-template-recursion-depth-warning' => 'محدودیت عمق بازگشت الگو رد شد ($1)',
-'language-converter-depth-warning' => 'تجاوز از محدودیت عمق مبدل زبانی ($1)',
+'language-converter-depth-warning' => 'محدودیت عمق مبدل زبانی رد شد ($1)',
# "Undo" feature
'undo-success' => 'این ویرایش را می‌توان خنثی کرد.
لطÙاً تÙاوت زیر را بررسی کنید تا تأیید کنید Ú©Ù‡ این چیزی است Ú©Ù‡ می‌خواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثی‌سازی ویرایش را به پایان ببرید.',
-'undo-failure' => 'به علت تعارض با ویرایش‌های میانی، این ویرایش را خنثی نشد.',
+'undo-failure' => 'به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.',
'undo-norev' => 'این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذ٠شده‌است.',
'undo-summary' => 'خنثی‌سازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])',
# Account creation failure
-'cantcreateaccounttitle' => 'نمی‌توان حساب باز کرد.',
+'cantcreateaccounttitle' => 'نمی‌توان حساب باز کرد',
'cantcreateaccount-text' => "امكان ساختن حساب کاربری از این این نشانی آی‌پی ('''$1''') توسط [[User:$3|$3]] سلب شده است.
-دلیل ارائه شده چنین بوده است: $2",
+دلیل ارائه شده توسط $3 چنین است: $2",
# History pages
'viewpagelogs' => 'نمایش سیاهه‌های مربوط به این صÙحه',
@@ -1155,7 +1191,7 @@ $2',
'revisionasof' => 'نسخهٔ $1',
'revision-info' => 'ویرایش در تاریخ $1 توسط $2',
'previousrevision' => '→ نسخهٔ قدیمی‌تر',
-'nextrevision' => 'نسخهٔ جدیدترâ†',
+'nextrevision' => 'نسخهٔ جدیدتر â†',
'currentrevisionlink' => 'نمایش نسخهٔ Ùعلی',
'cur' => 'Ùعلی',
'next' => 'بعدی',
@@ -1175,12 +1211,13 @@ $2',
'history-feed-title' => 'تاریخچهٔ ویرایش‌ها',
'history-feed-description' => 'تاریخچهٔ ویرایشهای صÙحه در ویکی',
'history-feed-item-nocomment' => '$1 در $2',
-'history-feed-empty' => 'صÙحهٔ درخواسته وجود ندارد. ممکن است Ú©Ù‡ از ویکی حذ٠یا اینکه نامش تغییر داده شده باشد.
-[[Special:Search|جستجوی]] صÙحه‌های جدید مرتبط٠موجود در این ویکی را هم بیازمایید. شاید اÙاقه کرد.',
+'history-feed-empty' => 'صÙحهٔ درخواست شده وجود ندارد.
+ممکن است که از ویکی حذ٠یا اینکه نامش تغییر داده شده باشد.
+صÙحه‌های جدید را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].',
# Revision deletion
'rev-deleted-comment' => '(خلاصه ویرایش حذ٠شد)',
-'rev-deleted-user' => '(نام کاربری حذ٠شده‌است)',
+'rev-deleted-user' => '(نام کاربری حذ٠شد)',
'rev-deleted-event' => '(مورد پاک شد)',
'rev-deleted-user-contribs' => '[نام کاربری یا نشانی آی‌پی حذ٠شده - ویرایش مخÙÛŒ شده در مشارکت‌ها]',
'rev-deleted-text-permission' => "این ویرایش از این صÙحه '''حذ٠شده‌است'''.
@@ -1211,24 +1248,25 @@ $2',
'rev-delundel' => 'نمایش/نهÙتن',
'rev-showdeleted' => 'نمایش',
'revisiondelete' => 'حذÙ/احیای نسخه‌ها',
-'revdelete-nooldid-title' => 'هیچ نسخه‌ای انتخاب نشده‌است',
-'revdelete-nooldid-text' => 'نسخه یا نسخه‌هایی از صÙحهٔ مورد نظر را Ú©Ù‡ می‌خواهید تحت تاثیر قرار بگیرند انتخاب نکرده‌اید.',
+'revdelete-nooldid-title' => 'نسخه هد٠غیرمجاز',
+'revdelete-nooldid-text' => 'شما نسخه‌های هد٠را برای انجام این عمل مشخص نکرده‌اید یا این نسخه‌ها وجود ندارند، یا این که شما می‌خواهید آخرین نسخه را پنهان کنید.',
'revdelete-nologtype-title' => 'نوع سیاهه مشخص نشده‌است',
'revdelete-nologtype-text' => 'شما هیچ نوع سیاهه‌ای را برای این کار مشخص نکردید.',
'revdelete-nologid-title' => 'مدخل غیر مجاز در سیاهه',
-'revdelete-nologid-text' => 'شما یا یک رخداد در سیاههٔ هد٠مشخص نکردید یا موردی را مشخص کردید که وجود ندارد.',
+'revdelete-nologid-text' => 'شما یا رویدادی را در سیاههٔ هد٠مشخص نکردید یا موردی را مشخص کردید که وجود ندارد.',
'revdelete-no-file' => 'پروندهٔ مشخص شده وجود ندارد.',
'revdelete-show-file-confirm' => 'آیا مطمئن هستید که می‌خواهید یک نسخهٔ حذ٠شده از پروندهٔ «<nowiki>$1</nowiki>» مورخ $2 ساعت $3 را ببینید؟',
-'revdelete-show-file-submit' => 'بلی',
-'revdelete-selected' => "'''{{PLURAL:$2|نسخهٔ|نسخه‌های}} انتخاب شده از '''$1:''''''",
+'revdelete-show-file-submit' => 'بله',
+'revdelete-selected' => "'''{{PLURAL:$2|نسخهٔ|نسخه‌های}} انتخاب شده از [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|مورد|موارد}} انتخاب شده از سیاهه:'''",
'revdelete-text' => "'''نسخه‌ها Ùˆ موارد حذ٠شده کماکان از طریق تاریخچهٔ صÙحه Ùˆ سیاهه‌ها قابل مشاهده هستند، اما بخش‌هایی از محتوای آن‌ها توسط عموم قابل مشاهده نخواهد بود.'''
سایر مدیران {{SITENAME}} هنوز می‌توانند این محتوای پنهان را ببینند و از همین طریق موارد حذ٠شده را احیا کنند، مگر آن که محدودیت‌های دیگری اعمال گردد.",
'revdelete-confirm' => 'لطÙاً تأیید کنید Ú©Ù‡ می‌خواهید این کار را انجام دهید، عواقب آن را درک می‌کنید Ùˆ این کار را طبق [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.',
'revdelete-suppress-text' => "Ùرونشانی باید '''تنها''' برای موارد زیر استÙاده شود:
+* اطلاعات به طور بالقوه اÙتراآمیز
* اطلاعات نامناسب شخصی
*: ''نشانی منزل، شماره تلÙن، شماره تامین اجتماعی Ùˆ غیره.''",
-'revdelete-legend' => 'تنظیم محدودیت‌های نسخه:',
+'revdelete-legend' => 'تنظیم محدودیت‌های پیدایی',
'revdelete-hide-text' => 'نهÙتن متن نسخه',
'revdelete-hide-image' => 'نهÙتن محتویات پرونده',
'revdelete-hide-name' => 'نهÙتن عمل Ùˆ هدÙ',
@@ -1243,7 +1281,7 @@ $2',
'revdelete-log' => 'دلیل:',
'revdelete-submit' => 'اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده',
'revdelete-logentry' => 'تغییر پیدایی نسخه در [[$1]]',
-'logdelete-logentry' => 'تغییر پیدایی مورد در [[$1]]',
+'logdelete-logentry' => 'تغییر پیدایی رویداد در [[$1]]',
'revdelete-success' => "'''پیدایی نسخه با موÙقیت به روز شد.'''",
'revdelete-failure' => "'''پیدایی نسخه‌ها قابل به روز کردن نیست:'''
$1",
@@ -1251,6 +1289,8 @@ $1",
'logdelete-failure' => "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''
$1",
'revdel-restore' => 'تغییر پیدایی',
+'revdel-restore-deleted' => 'نسخه‌های حذ٠شده',
+'revdel-restore-visible' => 'نسخه‌های پیدا',
'pagehist' => 'تاریخچهٔ صÙحه',
'deletedhist' => 'تاریخچهٔ حذ٠شده',
'revdelete-content' => 'مقدار',
@@ -1261,21 +1301,22 @@ $1",
'revdelete-hid' => '$1 را پنهان کرد',
'revdelete-unhid' => '$1 را از حالت پنهان در آورد',
'revdelete-log-message' => '$1 برای $2 {{PLURAL:$2|نسخه|نسخه}}',
-'logdelete-log-message' => '$1 برای $2 {{PLURAL:$2|رخداد|رخداد}}',
+'logdelete-log-message' => '$1 برای $2 {{PLURAL:$2|رویداد|رویداد}}',
'revdelete-hide-current' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر می‌باشد و قابل پنهان کردن نیست.',
'revdelete-show-no-access' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.',
'revdelete-modify-no-access' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.',
'revdelete-modify-missing' => 'خطا در پنهان کردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!',
-'revdelete-no-change' => "'''هشدار:''' مورد مورخ $2 ساعت $1 از قبل تنظیمات پیدایی درخواست شده را دارا می‌باشد.",
+'revdelete-no-change' => "'''هشدار:''' مورد مورخ $2 ساعت $1 از قبل تنظیمات پیدایی درخواست شده را دارا بود.",
'revdelete-concurrent-change' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: به نظر می‌رسد Ú©Ù‡ در مدتی Ú©Ù‡ شما برای تغییر وضعیت آن تلاش می‌کردید وضعیت آن توسط Ùرد دیگری تغییر یاÙته است.
لطÙاً سیاهه‌ها را بررسی کنید.',
'revdelete-only-restricted' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: شما نمی‌توانید موارد را از دید مدیران پنهان کنید مگر آن که یکی دیگر از گزینه‌های پنهان‌سازی را نیز انتخاب کنید.',
'revdelete-reason-dropdown' => '*دلایل متداول حذÙ
** نقض حق تکثیر
-** اطلاعات Ùردی نامناسب',
-'revdelete-otherreason' => 'دلایل دیگر/اضاÙÛŒ:',
+** اطلاعات Ùردی نامناسب
+** اطلاعات به طور بالقوه اÙتراآمیز',
+'revdelete-otherreason' => 'دلیل دیگر/اضاÙÛŒ:',
'revdelete-reasonotherlist' => 'دلیل دیگر',
-'revdelete-edit-reasonlist' => 'ویرایش Ùهرست دلایل',
+'revdelete-edit-reasonlist' => 'ویرایش دلایل حذÙ',
'revdelete-offender' => 'نویسنده نسخه:',
# Suppression log
@@ -1285,20 +1326,18 @@ $1",
# History merging
'mergehistory' => 'ادغام تاریخچه صÙحه‌ها',
-'mergehistory-header' => "این صÙحه به شما این امکان را می‌دهد Ú©Ù‡ نسخه‌های تاریخچهٔ یک مقاله را با یک مقاله دیگر ادغام کنید.
-اطمینان حاصل کنید که این تغییر به توالی زمانی ویرایش‌ها لطمه نخواهد زد.
-
-'''دست Ú©Ù… نسخه Ùعلی صÙحهٔ مبدأ باید باقی بماند.'''",
+'mergehistory-header' => 'این صÙحه به شما این امکان را می‌دهد Ú©Ù‡ نسخه‌های تاریخچهٔ یک مقاله را با یک مقاله دیگر ادغام کنید.
+اطمینان حاصل کنید که این تغییر به توالی زمانی ویرایش‌ها لطمه نخواهد زد.',
'mergehistory-box' => 'ادغام نسخه‌های دو صÙحه:',
'mergehistory-from' => 'صÙحهٔ مبدأ:',
'mergehistory-into' => 'صÙحه مقصد:',
-'mergehistory-list' => 'تاریخچه قابل ادغام',
-'mergehistory-merge' => 'این نسخه‌های [[:$1]] قابل ادغام با [[:$2]] هستند.
-از ستون دکمه‌های رادیویی استÙاده کنید تا نسخه‌هایی Ú©Ù‡ تا قبل از یک زمان مشخص ایجاد شده‌اند را انتخاب کنید..
-توجه کنید که کلیک روی پیوندها باعث پاک شدن تنظیماتی که تا آن لحظه اعمال کرده‌اید می‌شود.',
+'mergehistory-list' => 'تاریخچهٔ قابل ادغام',
+'mergehistory-merge' => 'نسخه‌های زیر از [[:$1]] قابل ادغام با [[:$2]] هستند.
+از ستون دکمه‌های رادیویی استÙاده کنید تا نسخه‌هایی Ú©Ù‡ تا قبل از یک زمان مشخص ایجاد شده‌اند را انتخاب کنید.
+توجه کنید که کلیک روی پیوندها باعث می‌شود ستون به حالت اولیه برگردد.',
'mergehistory-go' => 'نمایش تاریخچه قابل ادغام',
'mergehistory-submit' => 'ادغام نسخه‌ها',
-'mergehistory-empty' => 'هیچ‌یک از نسخه‌ها قابل ادغام نیستند',
+'mergehistory-empty' => 'هیچ‌یک از نسخه‌ها قابل ادغام نیستند.',
'mergehistory-success' => '$3 نسخه از [[:$1]] با موÙقیت در [[:$2]] ادغام {{PLURAL:$3|شد|شدند}}.',
'mergehistory-fail' => 'ادغام تاریخچه ممکن نیست، لطÙاً گزینه‌های صÙحه Ùˆ زمان را بازبینی کنید.',
'mergehistory-no-source' => 'صÙحهٔ مبدأ $1 وجود ندارد.',
@@ -1319,24 +1358,25 @@ $1",
# Diffs
'history-title' => 'تاریخچه ویرایش‌های «$1»',
'difference' => '(تÙاوت بین نسخه‌ها)',
+'difference-multipage' => '(تÙاوت بین صÙحات)',
'lineno' => 'سطر $1:',
'compareselectedversions' => 'مقایسهٔ نسخه‌های انتخاب‌شده',
'showhideselectedversions' => 'نمایش/نهÙتن نسخه‌های انتخاب شده',
'editundo' => 'خنثی‌سازی',
-'diff-multi' => '({{PLURAL:$1||$1&nbsp;}}ویرایش میانی نشان داده نشده‌است.)',
+'diff-multi' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
+'diff-multi-manyusers' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
# Search results
'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' => 'عنوان مقاله تطبیق می‌کند',
-'notitlematches' => 'عنوان هیچ مقاله‌ای نمی‌خورد',
-'textmatches' => 'متن مقاله تطبیق می‌کند',
-'notextmatches' => 'متن هیچ مقاله‌ای نمی‌خورد',
+'titlematches' => 'تطبیق عنوان مقاله',
+'notitlematches' => 'عنوان هیچ مقاله‌ای مطابقت ندارد',
+'textmatches' => 'تطبیق متن مقاله',
+'notextmatches' => 'متن هیچ مقاله‌ای مطابقت ندارد',
'prevn' => '{{PLURAL:$1|$1}}تای قبلی',
'nextn' => '{{PLURAL:$1|$1}}تای بعدی',
'prevn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} قبلی',
@@ -1344,7 +1384,7 @@ $1",
'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صÙحه',
'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'گزینه‌های جستجو',
-'searchmenu-exists' => "* صÙحهٔ '''[[$1]]'''",
+'searchmenu-exists' => "'''صÙحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
'searchmenu-new' => "'''صÙحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
'searchhelp-url' => 'Help:راهنما',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|مرور صÙحه‌های با این پیشوند]]',
@@ -1359,12 +1399,13 @@ $1",
'searchprofile-everything-tooltip' => 'جستجوی تمام محتوا (شامل صÙحه‌های بحث)',
'searchprofile-advanced-tooltip' => 'جستجو در Ùضاهای نام دلخواه',
'search-result-size' => '$1 ({{PLURAL:$2|یک کلمه|$2 کلمه}})',
-'search-result-score' => 'ارتباط: $1%',
+'search-result-category-size' => '{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})',
+'search-result-score' => 'ارتباط: $1٪',
'search-redirect' => '(تغییر مسیر $1)',
'search-section' => '(بخش $1)',
'search-suggest' => 'آیا منظورتان این بود: $1',
'search-interwiki-caption' => 'پروژه‌های خواهر',
-'search-interwiki-default' => '$1 :نتیجه',
+'search-interwiki-default' => '$1 نتیجه:',
'search-interwiki-more' => '(بیشتر)',
'search-mwsuggest-enabled' => 'با پیشنهاد',
'search-mwsuggest-disabled' => 'هیچ پیشنهادی نیست',
@@ -1373,8 +1414,8 @@ $1",
'searcheverything-enable' => 'جستجو در تمام Ùضاهای نام',
'searchrelated' => 'مرتبط',
'searchall' => 'همه',
-'showingresults' => "نمایش {{PLURAL:$1|'''1''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از #'''$2'''.",
-'showingresultsnum' => "نمایش '''$3''' {{PLURAL:$3|نتیجه|نتیجه}} در پایین، آغاز از #'''$2'''.",
+'showingresults' => "نمایش حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از شماره '''$2'''.",
+'showingresultsnum' => "نمایش حداکثر '''$3''' {{PLURAL:$3|نتیجه|نتیجه}} در پایین، آغاز از شماره '''$2'''.",
'showingresultsheader' => "{{PLURAL:$5|نتیجهٔ '''$1''' از '''$3'''|نتایج '''$1 تا $2''' از '''$3'''}} برای '''$4'''",
'nonefound' => "'''نکته''': تنها بعضی از Ùضاهای نام به طور پیش‌Ùرض جستجو می‌شوند.
برای جستجوی تمام Ùضاهای نام (شامل صÙحه‌های بحث، الگوها Ùˆ غیره) به عبارت جستجوی خود پیشوند ''all:‎'' را بیÙزایید، یا نام Ùضای نام دلخواه را به عنوان پیشوند استÙاده کنید.",
@@ -1388,10 +1429,12 @@ $1",
'powersearch-toggleall' => 'همه',
'powersearch-togglenone' => 'هیچ کدام',
'search-external' => 'جستجوی خارجی',
-'searchdisabled' => 'با عرض شرمندگی، جستجوی Ú©Ù„ متن موقتاً از کار انداخته شده است. می‌توانید از جستجوی Google در پایین استÙاده کنید. نتایج حاصل از جستجو با این روش ممکن است به‌روز نباشند.',
+'searchdisabled' => 'جستجو در {{SITENAME}} Ùعال نیست.
+موقتاً می‌توانید از جستجوی Google استÙاده کنید.
+توجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.',
# Quickbar
-'qbsettings' => 'تنظیمات نوار سریع',
+'qbsettings' => 'نوار سریع',
'qbsettings-none' => 'نباشد',
'qbsettings-fixedleft' => 'ثابت چپ',
'qbsettings-fixedright' => 'ثابت راست',
@@ -1401,7 +1444,7 @@ $1",
# Preferences page
'preferences' => 'ترجیحات',
'mypreferences' => 'ترجیحات من',
-'prefs-edits' => 'تعداد ویرایش‌ها',
+'prefs-edits' => 'تعداد ویرایش‌ها:',
'prefsnologin' => 'به سامانه وارد نشده‌اید',
'prefsnologintext' => 'برای تنظیم ترجیحات کاربر باید <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} به سامانه وارد شوید]</span>.',
'changepassword' => 'تغییر گذرواژه',
@@ -1417,23 +1460,24 @@ $1",
'prefs-watchlist-days-max' => 'حداکثر ۷ روز',
'prefs-watchlist-edits' => 'تعداد ویرایشهای نشان‌داده در Ùهرست پی‌گیری‌های گسترش‌یاÙته:',
'prefs-watchlist-edits-max' => 'حداکثر تعداد: ۱۰۰۰',
-'prefs-watchlist-token' => 'نشانهٔ Ùهرست پی‌گیری:',
+'prefs-watchlist-token' => 'رمز Ùهرست پی‌گیری:',
'prefs-misc' => 'تنظیمات متÙرقه',
'prefs-resetpass' => 'تغییر گذرواژه',
'prefs-email' => 'گزینه‌های پست الکترونیک',
'prefs-rendering' => 'نمایش صÙحه',
-'saveprefs' => 'ذخیرهٔ ترجیحات',
+'saveprefs' => 'ذخیره',
'resetprefs' => 'صÙر کردن ترجیحات',
-'restoreprefs' => 'باز گرداندن تمام تنظیمات پیش‌Ùرض',
+'restoreprefs' => 'برگرداندن تمام تنظیمات پیش‌Ùرض',
'prefs-editing' => 'در حال ویرایش',
'prefs-edit-boxsize' => 'اندازهٔ پنجرهٔ ویرایش.',
-'rows' => 'تعداد سطرها',
-'columns' => 'تعداد ستون‌ها',
-'searchresultshead' => 'تنظیمات نتیجهٔ جستجو',
-'resultsperpage' => 'تعداد نتایج در هر صÙحه',
+'rows' => 'تعداد سطرها:',
+'columns' => 'تعداد ستون‌ها:',
+'searchresultshead' => 'جستجو',
+'resultsperpage' => 'تعداد نتایج در هر صÙحه:',
'contextlines' => 'تعداد سطرها در هر نتیجه',
'contextchars' => 'تعداد نویسه‌های اطرا٠در سطر',
-'stub-threshold' => 'آستانهٔ ویرایش پیوندهای <a href="#" class="stub">ناقص</a>:',
+'stub-threshold' => 'آستانهٔ ویرایش پیوندهای <a href="#" class="stub">ناقص</a> (بایت):',
+'stub-threshold-disabled' => 'غیرÙعال',
'recentchangesdays' => 'تعداد روزهای نمایش داده‌شده در تغییرات اخیر:',
'recentchangesdays-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
'recentchangescount' => 'تعداد پیش‌Ùرض ویرایش‌های نمایش یاÙته:',
@@ -1467,29 +1511,34 @@ $1",
'prefs-files' => 'پرونده‌ها',
'prefs-custom-css' => 'سی‌اس‌اس شخصی',
'prefs-custom-js' => 'جاوااسکریپت شخصی',
-'prefs-reset-intro' => 'شما می‌توانید از این صÙحه برای بازگرداندن تنظیمات خود به پیش‌Ùرض استÙاده کنید. این کار بازگشت‌ناپذیر است.',
+'prefs-common-css-js' => 'سی‌اس‌اس/جاوااسکریپت مشترک برای تمام پوسته‌ها:',
+'prefs-reset-intro' => 'شما می‌توانید از این صÙحه برای بازگرداندن تنظیمات خود به پیش‌Ùرض وب‌گاه استÙاده کنید.
+این کار بازگشت‌ناپذیر است.',
'prefs-emailconfirm-label' => 'تأیید پست الکترونیکی:',
'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
-'youremail' => 'پست الکترونیکی شما:',
+'youremail' => 'پست الکترونیکی:',
'username' => 'نام کاربری:',
'uid' => 'شمارهٔ کاربری:',
-'prefs-memberingroups' => 'عضویت در {{PLURAL:$1|گروه|گروه‌ها}}:',
+'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
'prefs-registration' => 'زمان ثبت‌نام:',
'yourrealname' => 'نام واقعی:',
'yourlanguage' => 'زبان:',
'yourvariant' => 'گویش:',
-'yournick' => 'امضا:',
+'yournick' => 'امضای حدید:',
'prefs-help-signature' => 'نظرهای نوشته شده در صÙحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به طور خودکار به امضای شما Ùˆ مهر تاریخ تبدیل خواهد شد.',
-'badsig' => 'امضای خام غیرمجاز؛ لطÙاً برچسب‌های HTML را بررسی کنید.',
+'badsig' => 'امضای خام غیرمجاز.
+لطÙاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.',
'badsiglength' => 'امضای شما بیش از اندازه طولانی است.
امضا باید کمتر از $1 {{PLURAL:$1|نویسه|نویسه}} طول داشته باشد.',
'yourgender' => 'جنسیت:',
'gender-unknown' => 'مشخص نشده',
'gender-male' => 'مذکر',
'gender-female' => 'مونث',
-'prefs-help-gender' => 'اختیاری: به منظور خطاب گرÙتن با جنسیت صحیح توسط نرم‌اÙزار به کار می‌رود. این اطلاعات عمومی خواهد بود.',
+'prefs-help-gender' => 'اختیاری: به منظور خطاب گرÙتن با جنسیت صحیح توسط نرم‌اÙزار به کار می‌رود.
+این اطلاعات عمومی خواهد بود.',
'email' => 'پست الکترونیکی',
-'prefs-help-realname' => '*نام واقعی (اختیاری): اگر تصمیم به ذکر آن بگیرید هنگام ارجاع به آثارتان Ùˆ انتساب آنها به شما از نام واقعی‌تان استÙاده خواهد شد.',
+'prefs-help-realname' => 'نام واقعی اختیاری است
+اگر تصمیم بگیرید آن را وارد کنید، هنگام ارجاع به آثارتان Ùˆ انتساب آنها به شما از نام واقعی‌تان استÙاده خواهد شد.',
'prefs-help-email' => '* نشانی پست الکترونیکی اختیاری است اما ارسال یک گذرواژه جدید در صورتی Ú©Ù‡ گذرواژه خود را Ùراموش کردید ممکن می‌سازد.
شما هم‌چنین می‌توانید انتخاب کنید Ú©Ù‡ کاربران از طریق صÙحهٔ کاربری یا صÙحهٔ بحث کاربری، بدون Ùاش شدن هویت‌‌ Ùˆ نشانی واقعی پست الکترونیک‌تان، با شما تماس بگیرند.',
'prefs-help-email-required' => 'نشانی پست الکترونیکی الزامی است.',
@@ -1503,9 +1552,15 @@ $1",
'prefs-advancedrendering' => 'گزینه‌های پیشرÙته',
'prefs-advancedsearchoptions' => 'گزینه‌های پیشرÙته',
'prefs-advancedwatchlist' => 'گزینه‌های پیشرÙته',
-'prefs-display' => 'گزینه‌های نمایش',
+'prefs-displayrc' => 'گزینه‌های نمایش',
+'prefs-displaysearchoptions' => 'گزینه‌های نمایش',
+'prefs-displaywatchlist' => 'گزینه‌های نمایش',
'prefs-diffs' => 'تÙاوت‌ها',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'نشانی پست الکترونیکی معتبر به نظر می رسد',
+'email-address-validity-invalid' => 'نشانی پست الکترونیکی معتبر وارد کنید',
+
# User rights
'userrights' => 'مدیریت اختیارات کاربر',
'userrights-lookup-user' => 'مدیریت گروه‌های کاربری',
@@ -1516,9 +1571,10 @@ $1",
'saveusergroups' => 'ثبت گروه‌های کاربری',
'userrights-groupsmember' => 'عضو:',
'userrights-groupsmember-auto' => 'عضو ضمنی:',
-'userrights-groups-help' => 'شما می‌توانید گروه‌هایی که کاربر در آن قرار دارد را تغییر دهید.
-یک جعبه علامت خورده به این معنی است که کاربر در آن گروه قرار دارد.
-یک جعبه خالی به این معنی است که کاربر در آن گروه قرار ندارد.',
+'userrights-groups-help' => 'شما می‌توانید گروه‌هایی که کاربر در آن قرار دارد را تغییر دهید:
+* یک جعبه علامت خورده به این معنی است که کاربر در آن گروه قرار دارد.
+* یک جعبه خالی به این معنی است که کاربر در آن گروه قرار ندارد.
+* علامت * به این معنی است Ú©Ù‡ اگر آن گروه را اضاÙÙ‡ کنید نمی‌توانید بعداً برش دارید، یا برعکس.',
'userrights-reason' => 'دلیل:',
'userrights-no-interwiki' => 'شما اجازه تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.',
'userrights-nodatabase' => 'پایگاه داده $1 وجود ندارد یا محلی نیست.',
@@ -1567,12 +1623,12 @@ $1",
'right-reupload' => 'بارگذاری مجدد پرونده‌ای که از قبل وجود دارد',
'right-reupload-own' => 'بارگذاری مجدد پرونده‌ای که پیش از این توسط همان کاربر بارگذاری شده‌است',
'right-reupload-shared' => 'باطل ساختن پرونده‌های مشترک به صورت محلی',
-'right-upload_by_url' => 'بارگذاری پرونده از یک نشانی اینترنتی (URL)',
+'right-upload_by_url' => 'بارگذاری پرونده از یک نشانی اینترنتی',
'right-purge' => 'خالی کردن میانگیر صÙحه بدون مشاهدهٔ صÙحهٔ تأیید',
'right-autoconfirmed' => 'ویرایش صÙحه‌های نیمه Ø­Ùاظت‌شده',
'right-bot' => 'تلقی‌شده به عنوان یک Ùرآیند خودکار',
'right-nominornewtalk' => 'ویرایش جزئی صÙحه‌های بحث به Ø´Ú©Ù„ÛŒ Ú©Ù‡ باعث اعلان پیغام جدید نشود',
-'right-apihighlimits' => 'استÙاده از حداکثر محدودیت API',
+'right-apihighlimits' => 'سق٠بالاتر استÙاده از API',
'right-writeapi' => 'استÙاده از API مربوط به نوشتن',
'right-delete' => 'حذ٠صÙحه',
'right-bigdelete' => 'حذ٠صÙحه‌هایی Ú©Ù‡ تاریخچهٔ بزرگی دارند',
@@ -1588,35 +1644,35 @@ $1",
'right-hideuser' => 'قطع دسترسی کاربر و پنهان کردن آن از دید عموم',
'right-ipblock-exempt' => 'تاثیر نپذیرÙتن از قطع دسترسی‌های آی‌پی، خودکار یا Ùاصله‌ای',
'right-proxyunbannable' => 'تاثیر نپذیرÙتن از قطع دسترسی خودکار پروکسی‌ها',
-'right-protect' => 'تغییر میزان Ø­Ùاظت صÙحه‌ها Ùˆ ویرایش صÙحه‌های Ø­Ùاظت شده',
-'right-editprotected' => 'ویرایش صÙحه‌های Ø­Ùاظت شده (به شرط نبود Ø­Ùاظت آبشاری)',
+'right-unblockself' => 'دسترسی خود را باز کنند',
+'right-protect' => 'تغییر میزان محاÙظت صÙحه‌ها Ùˆ ویرایش صÙحه‌های محاÙظت شده',
+'right-editprotected' => 'ویرایش صÙحه‌های محاÙظت شده (به شرط نبود محاÙظت آبشاری)',
'right-editinterface' => 'ویرایش رابط کاربری',
'right-editusercssjs' => 'ویرایش صÙحه‌های CSS Ùˆ JS دیگر کاربرها',
'right-editusercss' => 'ویرایش صÙحه‌های CSS دیگر کاربرها',
'right-edituserjs' => 'ویرایش صÙحه‌های JS دیگر کاربرها',
'right-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری Ú©Ù‡ یک صÙحه را ویرایش کرده‌است',
'right-markbotedits' => 'علامت زدن ویرایش‌های واگردانی شده به عنوان ویرایش ربات',
-'right-noratelimit' => 'تاثیر ناپذیر از محدودیت سرعت',
+'right-noratelimit' => 'تاثیر نپذیرÙتن از محدودیت سرعت',
'right-import' => 'وارد کردن صÙحه از ویکی‌های دیگر',
'right-importupload' => 'وارد کردن صÙحه از طریق بارگذاری پرونده',
-'right-patrol' => 'به ویرایش‌های دیگران برچسب گشت بزند',
-'right-autopatrol' => 'به ویرایش‌های خودش به صورت خودکار برچسب گشت خورده بزند',
-'right-patrolmarks' => 'مشاهدهٔ برچسب گشت‌زنی تغییرات اخیر',
+'right-patrol' => 'گشت زدن به ویرایش‌های دیگران',
+'right-autopatrol' => 'گشن زدن خودکار به ویرایش‌های خودش',
+'right-patrolmarks' => 'مشاهدهٔ برچسب گشت تغییرات اخیر',
'right-unwatchedpages' => 'مشاهدهٔ Ùهرست صÙحه‌هایی Ú©Ù‡ پیگیری نمی‌شوند',
'right-trackback' => 'ثبت یک بازتاب',
'right-mergehistory' => 'ادغام تاریخچهٔ صÙحه‌ها',
'right-userrights' => 'ویرایش تمام اختیارات کاربرها',
'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر',
'right-siteadmin' => 'Ù‚ÙÙ„ کردن Ùˆ باز کردن پایگاه داده',
-'right-reset-passwords' => 'از نو تنظیم کردن گذرواژهٔ دیگر کاربران',
+'right-reset-passwords' => 'صÙر کردن گذرواژهٔ دیگر کاربران',
'right-override-export-depth' => 'برون‌ریزی صÙحه‌ها شامل صÙحه‌های پیوند شده تا عمق Ûµ',
-'right-versiondetail' => 'نمایش اطلاعات Ù…Ùصل نسخهٔ نرم‌اÙزار',
-'right-sendemail' => 'ارسال پست الکترونیک به دیگر کاربران',
+'right-sendemail' => 'ارسال نامه الکترونیکی به دیگر کاربران',
# User rights log
'rightslog' => 'سیاههٔ اختیارات کاربر',
'rightslogtext' => 'این سیاههٔ تغییرات اختیارات کاربر است.',
-'rightslogentry' => 'عضویت $1 را از گروه $2 به $3 تغییر داد.',
+'rightslogentry' => 'عضویت $1 را از گروه $2 به $3 تغییر داد',
'rightsnone' => '(هیچ)',
# Associated actions - in the sentence "You do not have permission to X"
@@ -1642,12 +1698,12 @@ $1",
'action-undelete' => 'احیای این صÙحه',
'action-suppressrevision' => 'مشاهده و احیای ویرایش‌های حذ٠شده',
'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
-'action-block' => 'قطع دسترسی این کاربر برای ویرایش',
-'action-protect' => 'تغییر سطح محاÙظت از این صÙحه',
+'action-block' => 'قطع دسترسی ویرایش این کاربر',
+'action-protect' => 'تغییر سطح محاÙظت این صÙحه',
'action-import' => 'وارد کردن این صÙحه از یک ویکی دیگر',
'action-importupload' => 'وارد کردن این صÙحه از طریق بارگذاری پرونده',
-'action-patrol' => 'به ویرایش دیگران برچسب گشت بزنید',
-'action-autopatrol' => 'به ویرایش خودتان برچسب گشت بزنید',
+'action-patrol' => 'گشت زدن ویرایش دیگران',
+'action-autopatrol' => 'گشت زدن ویرایش خودتان',
'action-unwatchedpages' => 'مشاهدهٔ صÙحه‌های پی‌گیری نشده',
'action-trackback' => 'ثبت یک بازتاب',
'action-mergehistory' => 'ادغام تاریخچهٔ این صÙحه',
@@ -1660,17 +1716,12 @@ $1",
'recentchanges' => 'تغییرات اخیر',
'recentchanges-legend' => 'گزینه‌های تغییرات اخیر',
'recentchangestext' => 'آخرین تغییرات ویکی را در این صÙحه پی‌گیری کنید.',
-'recentchanges-feed-description' => 'ردیابی آخرین تغییرات این ویکی در این خورد.',
-'recentchanges-label-legend' => 'شرح: $1.',
-'recentchanges-legend-newpage' => '$1 - صÙحهٔ جدید',
-'recentchanges-label-newpage' => 'این ویرایش یک صÙحهٔ جدید ایجاد کرده‌است',
-'recentchanges-legend-minor' => '$1 - ویرایش جزئی',
+'recentchanges-feed-description' => 'آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.',
+'recentchanges-label-newpage' => 'این ویرایش یک صÙحهٔ جدید ایجاد کرد',
'recentchanges-label-minor' => 'این ویرایش جزئی است',
-'recentchanges-legend-bot' => '$1 - ویرایش ربات',
'recentchanges-label-bot' => 'این ویرایش توسط یک ربات انجام شده‌است',
-'recentchanges-legend-unpatrolled' => '$1 - ویرایش گشت‌زنی نشده',
'recentchanges-label-unpatrolled' => 'این ویرایش هنوز گشت‌زنی نشده‌است',
-'rcnote' => "در زیر {{PLURAL:$1|'''۱''' تغییر|آخرین '''$1''' تغییر}} در آخرین {{PLURAL:$2|روز|'''$2''' روز}} را، تا $5، $4 می‌بینید.",
+'rcnote' => "در زیر {{PLURAL:$1|'''۱''' تغییر|آخرین '''$1''' تغییر}} در آخرین {{PLURAL:$2|روز|'''$2''' روز}} را، تا $4 ساعت $5 می‌بینید.",
'rcnotefrom' => 'در زیر تغییرات از تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشان داده می‌شود).',
'rclistfrom' => 'نمایش تغییرات جدید با شروع از $1',
'rcshowhideminor' => '$1 ویرایش‌های جزئی',
@@ -1679,7 +1730,7 @@ $1",
'rcshowhideanons' => '$1 کاربران ناشناس',
'rcshowhidepatr' => '$1 ویرایش‌های گشت‌خورده',
'rcshowhidemine' => '$1 ویرایش‌های من',
-'rclinks' => 'نمایش آخرین $1 تغییر در $2 روز اخیر؛ $3',
+'rclinks' => 'نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3',
'diff' => 'تÙاوت',
'hist' => 'تاریخچه',
'hide' => 'نهÙتن',
@@ -1689,11 +1740,11 @@ $1",
'boteditletter' => 'ر',
'sectionlink' => 'â†',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|کاربر|کاربر}} پی‌گیری‌کننده]',
-'rc_categories' => 'محدود به رده‌ها بشود (بین رده‌ها نویسهٔ | را قرار دهید)',
+'rc_categories' => 'محدود به این رده‌ها (رده‌ها را با «|» جدا کنید)',
'rc_categories_any' => 'هر کدام',
'newsectionsummary' => '/* $1 */ بخش جدید',
'rc-enhanced-expand' => 'نمایش جزئیات (نیازمند جاوااسکریپت)',
-'rc-enhanced-hide' => 'Ù†Ùتن جزئیات',
+'rc-enhanced-hide' => 'نهÙتن جزئیات',
# Recent changes linked
'recentchangeslinked' => 'تغییرات مرتبط',
@@ -1713,24 +1764,26 @@ $1",
'reuploaddesc' => 'بازگشت به Ùرم بارگذاری',
'upload-tryagain' => 'ارسال توضیحات تغییر یاÙته پرونده',
'uploadnologin' => 'به سامانه وارد نشده‌اید',
-'uploadnologintext' => 'برای بار کردن پرونده‌ها باید [[Special:UserLogin|به سامانه وارد شوید]].',
+'uploadnologintext' => 'برای بارگذاری پرونده‌ها باید [[Special:UserLogin|به سامانه وارد شوید]].',
'upload_directory_missing' => 'شاخهٔ بارگذاری ($1) وجود ندارد و قابل ایجاد نیست.',
'upload_directory_read_only' => 'شاخهٔ بارگذاری ($1) از طر٠کارگزار وب قابل نوشتن نیست.',
-'uploaderror' => 'خطا در بار کردن',
+'uploaderror' => 'خطای بارگذاری',
+'upload-recreate-warning' => "'''هشدار: پرونده‌ای با این نام حذ٠یا منتقل شده است.'''
+
+برای راحتی، سیاههٔ حذ٠و انتقال برای این صÙحه در زیر آمده است:",
'uploadtext' => "از Ùرم زیر برای بارگذاری کردن پرونده‌های جدید استÙاده کنید.
-برای دیدن پرونده‌هایی Ú©Ù‡ قبلاً بارگذاری شده‌اند به [[Special:FileList|Ùهرست پرونده‌ها]] بروید. بارگذاری مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] Ùˆ حذ٠پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.
+برای دیدن پرونده‌هایی Ú©Ù‡ قبلاً بارگذاری شده‌اند به [[Special:FileList|Ùهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] Ùˆ حذ٠پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.
بعد از این Ú©Ù‡ پرونده‌ای را بارگذاری کردید، به این سه Ø´Ú©Ù„ می‌توانید آن را در صÙحه‌ها استÙاده کنید:
-
*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' برای استÙاده از نسخه کامل پرونده
*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' برای استÙاده از یک نسخه Û²Û°Û° پیکسلی از پرونده درون یک جعبه در سمت Ú†Ù¾ متن Ú©Ù‡ عبارت alt text در آن به عنوان توضیح استÙاده شده
*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
'upload-permitted' => 'انواع مجاز پرونده‌ها: $1.',
'upload-preferred' => 'انواع ترجیح‌داده شده پرونده‌ها: $1.',
-'upload-prohibited' => 'انواع غیر مجاز پرونده‌ها: $1.',
-'uploadlog' => 'سیاههٔ بارکردن‌ها',
-'uploadlogpage' => 'سیاههٔ بارکردن‌ها',
-'uploadlogpagetext' => 'Ùهرست زیر Ùهرستی از آخرین بارکردن‌های پرونده‌های است.
+'upload-prohibited' => 'انواع غیرمجاز پرونده‌ها: $1.',
+'uploadlog' => 'سیاههٔ بارگذاری‌ها',
+'uploadlogpage' => 'سیاههٔ بارگذاری‌ها',
+'uploadlogpagetext' => 'Ùهرست زیر Ùهرستی از آخرین بارگذاری پرونده‌ها است.
برای مرور دیداری [[Special:NewFiles|نگارخانهٔ پرونده‌های جدید]] را ببینید.',
'filename' => 'نام پرونده',
'filedesc' => 'خلاصه',
@@ -1741,56 +1794,75 @@ $1",
'uploadedfiles' => 'پرونده‌های بارشده',
'ignorewarning' => 'چشم‌پوشی از هشدار و ذخیرهٔ پرونده.',
'ignorewarnings' => 'چشم‌پوشی از همهٔ هشدارها',
-'minlength1' => 'اسم پرونده دست کم باید یک حر٠باشد.',
+'minlength1' => 'نام پرونده دست کم باید یک حر٠باشد.',
'illegalfilename' => 'نام پرونده «$1» نویسه‌هایی را شامل می‌شود Ú©Ù‡ در نام صÙحه‌ها مجاز نیستند.
لطÙاً نام پرونده را تغییر دهید Ùˆ آن را دوباره بارگذاری کنید.',
'badfilename' => 'نام پرونده به «$1» تغییر کرد.',
'filetype-mime-mismatch' => 'پسوند پرونده با نوع MIME آن مطابقت ندارد.',
-'filetype-badmime' => 'پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگزاری مجاز نیستند.',
+'filetype-badmime' => 'پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگذاری مجاز نیستند.',
'filetype-bad-ie-mime' => 'این پرونده را نمی‌توانید بارگذاری کنید زیرا اینترنت اکسپلورر آن را به عنوان «$1» تشخیص می‌دهد، که یک نوع پروندهٔ غیر مجاز و احتمالاً خطرناک است.',
-'filetype-unwanted-type' => "&lrm;'''\".\$1\"''' یک نوع پرونده ناخواسته است.
-{{PLURAL:\$3|نوع پرونده ترجیح داده شده|انواع پرونده ترجیح داد شده}} از این قرار است: \$2 .",
+'filetype-unwanted-type' => "'''«‎.‎$1»''' یک نوع پرونده ناخواسته است.
+{{PLURAL:$3|نوع پرونده ترجیح داده شده|انواع پرونده ترجیح داده شده}} از این قرار است: $2 .",
'filetype-banned-type' => "&lrm;'''\".\$1\"''' یک نوع پرونده غیرمجاز است.
{{PLURAL:\$3|نوع پرونده مجاز|انواع پرونده مجاز}} از این قرار است: \$2 .",
'filetype-missing' => 'این پرونده پسوند (مثلاً «‎.jpg») ندارد.',
-'large-file' => 'توصیه می‌شود که پرونده‌ها بزرگتر از $1 نباشند: این پرونده $2 است.',
-'largefileserver' => 'این پرونده از اندازه‌ای Ú©Ù‡ در پیکربندی خادم به عنوان سق٠اندازهٔ پرونده درنظر گرÙته‌ شده‌است، بزرگتر است.',
-'emptyfile' => 'پروندهٔ بارشده خالی بنظر می‌رسد. این مساله ممکن است به دلیل خطای تایپی در نام پرونده رخ داده باشد. لطÙاً تأیید کنید Ú©Ù‡ می‌خواهید این پرونده را با همین شرایط بار کنید.',
-'fileexists' => "پرونده‌ای با همین نام از قبل موجود است.
-اگر مطمئن نیستید Ú©Ù‡ می‌خواهید آن پرونده را تغییر دهید، لطÙاً '''<tt>[[:$1]]</tt>''' را بررسی کنید.
-[[$1|انگشتی]] [[$1|thumb]]",
+'empty-file' => 'پرونده‌ای که ارسال کردید خالی بود.',
+'file-too-large' => 'پرونده‌ای که ارسال کردید بیش از اندازه بزرگ بود.',
+'filename-tooshort' => 'نام پرونده بیش از اندازه کوتاه است.',
+'filetype-banned' => 'این نوع پرونده ممنوع است.',
+'verification-error' => 'پرونده از آزمون تأیید پرونده گذر نکرد.',
+'hookaborted' => 'تغییری Ú©Ù‡ می‌خواستید ایجاد کنید توسط یک قلاب اÙزونه خاتمه ناگهانی داده شد.',
+'illegal-filename' => 'نام پرونده مجاز نیست.',
+'overwrite' => 'نوشتن روی یک پرونده موجود مجاز نیست.',
+'unknown-error' => 'خطای ناشناخته‌ای رخ داد.',
+'tmp-create-error' => 'امکان ساخت پرونده موقت وجود نداشت.',
+'tmp-write-error' => 'خطا در نوشتن پرونده موقت.',
+'large-file' => 'توصیه می‌شود که پرونده‌ها بزرگتر از $1 نباشند؛
+اندازهٔ این پرونده $2 است.',
+'largefileserver' => 'این پرونده از اندازه‌ای که سرور پیکربندی شده تا بپذیرد بزرگتر است.',
+'emptyfile' => 'پروندهٔ بارشده خالی به نظر می‌رسد.
+این مساله ممکن است به دلیل خطای تایپی در نام پرونده رخ داده باشد.
+لطÙاً تأیید کنید Ú©Ù‡ می‌خواهید این پرونده را با همین شرایط بارگذاری کنید.',
+'fileexists' => "پرونده‌ای با همین نام از قبل موجود است، اگر مطمئن نیستید Ú©Ù‡ می‌خواهید آن پرونده را تغییر دهید، لطÙاً '''<tt>[[:$1]]</tt>''' را بررسی کنید.
+[[$1|thumb]]",
'filepageexists' => "صÙحهٔ توضیح برای این پرونده از قبل در '''<tt>[[:$1]]</tt>''' ایجاد شده‌است، اما پرونده‌ای با این نام وجود ندارد.
خلاصه‌ای Ú©Ù‡ وارد می‌کنید در صÙحهٔ توضیح نمایش نخواهد یاÙت.
-برای آن که خلاصه شما نمایش یابد، باید آن را به صورت دستی ویرایش کنید. [[$1|انگشتی]]",
+برای آن که خلاصه شما نمایش یابد، باید آن را به صورت دستی ویرایش کنید.
+[[$1|thumb]]",
'fileexists-extension' => "پرونده‌ای با نام مشابه وجود دارد: [[$2|thumb]]
-* نام پرونده‌ای که بارگزاری کردید این بود:'''<tt>[[:$1]]</tt>'''
+* نام پرونده‌ای که بارگذاری کردید این بود:'''<tt>[[:$1]]</tt>'''
* نام پرونده‌ای که از قبل موجود است این است:'''<tt>[[:$2]]</tt>'''
لطÙاً یک نام دیگر انتخاب کنید.",
-'fileexists-thumbnail-yes' => "به نظر می‌رسد که این پرونده، یک تصویر کوچک شده (بندانگشتی یا thumbnail) باشد. [[$1|انگشتی]]
+'fileexists-thumbnail-yes' => "به نظر می‌رسد که این پرونده، یک تصویر کوچک شده (''بندانگشتی'' یا ''thumbnail'') باشد.
+[[$1|thumb]]
لطÙاً پروندهٔ '''<tt>[[:$1]]</tt>''' را بررسی کنید.
اگر پرونده‌ای Ú©Ù‡ بررسی کردید، همین تصویر در اندازهٔ اصلی‌اش است، نیازی به بارگذاری یک نسخهٔ بندانگشتی اضاÙÙ‡ نیست.",
'file-thumbnail-no' => "نام پرونده با '''<tt>$1</tt>''' آغاز می‌شود.
-به نظر می‌رسد که این پرونده، یک تصویر بندانگشتی ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.
+به نظر می‌رسد که این پرونده، یک تصویر ''بندانگشتی'' ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.
اگر تصویر با اندازهٔ اصلی را دارید، آن را بارگذاری کنید؛ در غیر این صورت، نام پرونده را تغییر دهید.",
'fileexists-forbidden' => 'در حال حاضر، پرونده‌ای به همین نام وجود دارد، و قابل رونویسی نیست.
-اگر هم‌چنان می‌خواهید Ú©Ù‡ پروندهٔ خود را بارگذاری کنید، لطÙاً برگردید Ùˆ نام دیگری برگزینید.
+اگر هم‌چنان می‌خواهید Ú©Ù‡ پروندهٔ خود را بارگذاری کنید، لطÙاً برگردید Ùˆ نام دیگری استÙاده کنید.
[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'در حال‌ حاضر، پرونده‌ای با همین نام در انبارهٔ مشترک پرونده‌ها وجود دارد.
-اگر هنوز می‌خواهید پرونده خود را بار کنید، لطÙاً برگردید Ùˆ پروندهٔ موردنظر خود را با نام دیگری بار کنید. [[File:$1|thumb|center|$1]]',
+اگر هنوز می‌خواهید پرونده خود را بار کنید، لطÙاً برگردید Ùˆ پروندهٔ موردنظر خود را با نام دیگری بار کنید.
+[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'به نظر می‌رسد این پرونده نسخه‌ای تکراری از {{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر باشد:',
'file-deleted-duplicate' => 'یک پرونده نظیر این پرونده ([[:$1]]) قبلاً حذ٠شده‌است.
شما باید تاریخچهٔ حذ٠آن پرونده را قبل از بارگذاری مجدد آن ببینید.',
-'successfulupload' => 'بار کردن با موÙقیت انجام شد',
-'uploadwarning' => 'هشدار بار کردن',
+'uploadwarning' => 'هشدار بارگذاری',
'uploadwarning-text' => 'لطÙاً توضیحات پرونده را در زیر تغییر دهید Ùˆ دوباره تلاش کنید.',
'savefile' => 'ذخیرهٔ پرونده',
'uploadedimage' => '«[[$1]]» را بارگذاری کرد',
'overwroteimage' => 'نسخه جدیدی از «[[$1]]» را بارگذاری کرد',
-'uploaddisabled' => 'شرمنده، بار کردن از کار اÙتاده است.',
-'uploaddisabledtext' => 'امکان بارگذاری پرونده غیرÙعال شده‌است.',
-'php-uploaddisabledtext' => 'بارگذاری پرونده‌های پی‌اچ‌پی غیر Ùعال است. لطÙاً تنظیمات file_uploads را بررسی کنید.',
-'uploadscripted' => 'این صÙحه حاوی اسکریپت یا کدی اچ‌تی‌ام‌ال است Ú©Ù‡ ممکن است به‌نادرست توسط مرورگر وب تÙسیر شود.',
-'uploadvirus' => 'این پرونده ویروس دارد! جزئیات : $1',
+'uploaddisabled' => 'بارگذاری غیرÙعال است.',
+'copyuploaddisabled' => 'بارگذاری از طریق نشانی اینترنتی غیرÙعال است.',
+'uploadfromurl-queued' => 'بارگذاری شما به ص٠اضاÙÙ‡ شد.',
+'uploaddisabledtext' => 'امکان بارگذاری پرونده غیرÙعال است.',
+'php-uploaddisabledtext' => 'بارگذاری پرونده‌های پی‌اچ‌پی غیرÙعال است.
+لطÙاً تنظیمات file_uploads را بررسی کنید.',
+'uploadscripted' => 'این صÙحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است Ú©Ù‡ ممکن است به‌نادرست توسط مرورگر وب تÙسیر شود.',
+'uploadvirus' => 'این پرونده ویروس دارد!
+جزئیات : $1',
'upload-source' => 'پرونده منبع',
'sourcefilename' => 'نام پروندهٔ اصلی:',
'sourceurl' => 'نشانی منبع:',
@@ -1799,19 +1871,28 @@ $1",
'upload-description' => 'توضیحات پرونده',
'upload-options' => 'گزینه‌های بارگذاری',
'watchthisupload' => 'پی‌گیری این پرونده',
-'filewasdeleted' => 'پرونده‌ای با همین نام پیشتر بارگذاری و پس از آن پاک شده‌است. بهتر است پیش از بارگذاری مجدد نگاهی به $1 بیندازید.',
+'filewasdeleted' => 'پرونده‌ای با همین نام پیشتر بارگذاری و پس از آن پاک شده‌است.
+شما باید $1 را قبل از بارگذاری مجدد آن ببینید.',
'upload-wasdeleted' => "'''هشدار: شما در حال بارگذاری پرونده‌ای هستید که پیش از این حذ٠شده است.'''
-شما باید بیندیشید که آیا بارگذاری مجدد پرونده مناسب است یا خیر.
-سیاهه حذ٠مربوط به این پرونده در زیر آمده است:",
+در نظر داشته باشید که آیا بارگذاری مجدد آن کار درستی است یا نه.
+برای راحتی، سیاههٔ حذ٠مربوط به این پرونده در زیر آمده است:",
'filename-bad-prefix' => "نام پرونده‌ای که بارگذاری می‌کنید با '''$1''' آغاز می‌شود که یک پیشوند مخصوص تصاویر ثبت شده توسط دوربین‌های دیجیتال است.
لطÙاً نامی بهتر برای پرونده برگزینید.",
+'upload-success-subj' => 'بارگذاری با موÙقیت انجام شد',
+'upload-success-msg' => 'بارگذاری شما از [$2] موÙÙ‚ بود. این پرونده در اینجا قابل دسترسی است: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'مشکل در بارگذاری',
+'upload-failure-msg' => 'مشکلی در بارگذاری شما از [$2] وجود داشت:
+
+$1',
+'upload-warning-subj' => 'هشدار بارگذاری',
+'upload-warning-msg' => 'Ùرم بارگذاری مشکلی داشت [$2]. شما می‌توانید به [[Special:Upload/stash/$1|Ùرم بارگذاری]] بازگردید تا این اشکال را رÙع کنید.',
-'upload-proto-error' => 'قرارداد نادرست',
+'upload-proto-error' => 'پروتکل نادرست',
'upload-proto-error-text' => 'بارگذاری از دوردست به نشانی‌هایی که با <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code> آغاز شوند نیاز دارد.',
'upload-file-error' => 'خطای داخلی',
'upload-file-error-text' => 'هنگام تلاش برای ایجاد یک پروندهٔ موقت در کارگزار یک خطای داخلی رخ داد.
-لطÙاً با یکی از [[Special:ListUsers/sysop|مدیران]] تماس بگیرید.',
+لطÙاً با یک [[Special:ListUsers/sysop|مدیر]] تماس بگیرید.',
'upload-misc-error' => 'خطایی نامعلوم در بارگذاری',
'upload-misc-error-text' => 'هنگام بارگذاری، خطایی نامعلوم رخ داد.
لطÙاً اطمینان حاصل کنید Ú©Ù‡ نشانی اینترنتی معتبر Ùˆ قابل دسترسی است Ùˆ بعد دوباره تلاش کنید.
@@ -1823,14 +1904,14 @@ $1",
# img_auth script messages
'img-auth-accessdenied' => 'منع دسترسی',
'img-auth-nopathinfo' => 'PATH_INFO موجود نیست.
-کارساز شما برای رد کردن این مقدار تنظیم نشده‌است.
+سرور شما برای رد کردن این مقدار تنظیم نشده‌است.
ممکن است کارساز مبتنی بر سی‌جی‌آی باشد و از img_auth پشتیبانی نکند.
http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
-'img-auth-notindir' => 'مسیر درخواست شده در شاخهٔ بارگذاری تنظیم نشده‌است.',
+'img-auth-notindir' => 'مسیر درخواست شده در شاخهٔ بارگذاری تنظیم‌شده قرار ندارد.',
'img-auth-badtitle' => 'امکان ایجاد یک عنوان مجاز از «$1» وجود ندارد.',
'img-auth-nologinnWL' => 'شما به سامانه وارد نشده‌اید Ùˆ «$1» در Ùهرست سÙید قرار ندارد.',
'img-auth-nofile' => 'پرونده «$1» وجود ندارد.',
-'img-auth-isdir' => 'شما می‌خواهید به شاخهٔ «$1» دسترسی پیدا کنید.
+'img-auth-isdir' => 'شما تلاش کرده‌اید به شاخهٔ «$1» دسترسی پیدا کنید.
تنها دسترسی به پرونده مجاز است.',
'img-auth-streaming' => 'در حال جاری ساختن «$1».',
'img-auth-public' => 'عملکرد img_auth.php برونداد پرونده‌ها از یک ویکی خصوصی است.
@@ -1841,19 +1922,22 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
# HTTP errors
'http-invalid-url' => 'نشانی نامعتبر: $1',
-'http-invalid-scheme' => 'نشانی‌های اینترنتی با طرح «$1» پشتیبانی نمی‌شوند',
-'http-request-error' => 'درخواست اچ‌تی‌تی‌پی ناموÙÙ‚ به علت خطای ناشناخته',
+'http-invalid-scheme' => 'نشانی‌های اینترنتی با طرح «$1» پشتیبانی نمی‌شوند.',
+'http-request-error' => 'درخواست اچ‌تی‌تی‌پی به علت خطایی ناشناخته، ناموÙÙ‚ بود.',
'http-read-error' => 'خطای خواندن اچ‌تی‌تی‌پی.',
'http-timed-out' => 'مهلت درخواست اچ‌تی‌تی‌پی به سر رسید.',
'http-curl-error' => 'خطا در آوردن نشانی اینترنتی: $1',
-'http-host-unreachable' => 'دسترسی به نشانی اینترنتی ممکن نشد',
+'http-host-unreachable' => 'دسترسی به نشانی اینترنتی ممکن نشد.',
'http-bad-status' => 'در حین درخواست اچ‌تی‌تی‌پی خطایی رخ داد: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'دسترسی به URL ممکن نشد.',
-'upload-curl-error6-text' => 'URL داده شده قابل دسترسی نیست. لطÙاً درستی آن Ùˆ اینکه وب‌گاه برقرار است را بازرسی کنید.',
-'upload-curl-error28' => 'زمان بارگذاری سر آمد.',
-'upload-curl-error28-text' => 'این وب‌گاه بیش از اندازه در پاسخ تعلل کرد. لطÙاً بررسی کنید Ú©Ù‡ آیا وب‌گاه Ùعال Ùˆ برخط است یا نه. سپس لختی درنگ کنید Ùˆ دوباره تلاش نمایید. شاید بد نباشد Ú©Ù‡ در زمان خلوت‌تری دوباره تلاش کنید.',
+'upload-curl-error6' => 'دسترسی به نشانی اینترنتی ممکن نشد',
+'upload-curl-error6-text' => 'نشانی اینترنتی داده شده قابل دسترسی نیست.
+لطÙاً درستی آن Ùˆ اینکه وب‌گاه برقرار است را بررسی کنید.',
+'upload-curl-error28' => 'مهلت بارگذاری به سر رسید',
+'upload-curl-error28-text' => 'این وب‌گاه بیش از اندازه در پاسخ تعلل کرد.
+لطÙاً بررسی کنید Ú©Ù‡ آیا وب‌گاه Ùعال Ùˆ برخط است یا نه، سپس لختی درنگ کنید Ùˆ دوباره تلاش نمایید.
+شاید بد نباشد که در زمان خلوت‌تری دوباره تلاش کنید.',
'license' => 'اجازه‌نامه:',
'license-header' => 'اجازه‌نامه',
@@ -1869,6 +1953,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'listfiles_search_for' => 'جستجو به دنبال نام پرونده چندرسانه‌ای:',
'imgfile' => 'پرونده',
'listfiles' => 'Ùهرست پرونده‌ها',
+'listfiles_thumb' => 'بندانگشتی',
'listfiles_date' => 'تاریخ',
'listfiles_name' => 'نام',
'listfiles_user' => 'کاربر',
@@ -1878,16 +1963,16 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
# File description page
'file-anchor-link' => 'پرونده',
-'filehist' => 'تاریخچه پرونده',
+'filehist' => 'تاریخچهٔ پرونده',
'filehist-help' => 'روی تاریخ‌ها کلیک کنید تا نسخهٔ مربوط را ببینید.',
'filehist-deleteall' => 'حذ٠همه',
'filehist-deleteone' => 'حذ٠این مورد',
'filehist-revert' => 'واگردانی',
'filehist-current' => 'نسخهٔ کنونی',
-'filehist-datetime' => 'تاریخ',
-'filehist-thumb' => 'بند انگشتی',
-'filehist-thumbtext' => 'تصویر بند انگشتی از نسخه تا $1',
-'filehist-nothumb' => 'Ùاقد بند انگشتی',
+'filehist-datetime' => 'تاریخ/ساعت',
+'filehist-thumb' => 'بندانگشتی',
+'filehist-thumbtext' => 'تصویر بندانگشتی از نسخهٔ مورخ $1',
+'filehist-nothumb' => 'Ùاقد بندانگشتی',
'filehist-user' => 'کاربر',
'filehist-dimensions' => 'ابعاد',
'filehist-filesize' => 'اندازهٔ پرونده',
@@ -1895,7 +1980,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'filehist-missing' => 'پروندهٔ ناموجود',
'imagelinks' => 'پیوندهای پرونده',
'linkstoimage' => '{{PLURAL:$1|صÙحهٔ|صÙحه‌های}} زیر به این تصویر پیوند {{PLURAL:$1|دارد|دارند}}:',
-'linkstoimage-more' => 'بیش از $1 صÙحه به این پرونده پیوند {{PLURAL:$1|می‌دهد|می‌دهند}}.
+'linkstoimage-more' => 'بیش از $1 صÙحه به این پرونده پیوند {{PLURAL:$1|دارد|دارند}}.
Ùهرست زیر تنها {{PLURAL:$1|اولین پیوند|اولین $1 پیوند}} به این صÙحه را نشان می‌دهد.
[[Special:WhatLinksHere/$2|Ùهرست کامل]] نیز موجود است.',
'nolinkstoimage' => 'هیچ صÙحه‌ای به این تصویر پیوند ندارد.',
@@ -1909,19 +1994,19 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
توضیحات موجود در [$2 صÙحهٔ توضیحات پرونده] در آنجا، در زیر نشان داده شده‌است.',
'filepage-nofile' => 'پرونده‌ای با این نام وجود ندارد.',
'filepage-nofile-link' => 'پرونده‌ای با این نام وجود ندارد، اما شما می‌توانید آن را [$1 بارگذاری کنید].',
-'uploadnewversion-linktext' => 'بارکردن نسخهٔ جدیدی از پرونده',
+'uploadnewversion-linktext' => 'بارگذاری نسخهٔ جدیدی از پرونده',
'shared-repo-from' => 'از $1',
'shared-repo' => 'یک مخزن مشترک',
# File reversion
'filerevert' => 'واگردانی $1',
-'filerevert-backlink' => '→ $1',
+'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'واگردانی پرونده',
-'filerevert-intro' => "شما در حال واگردانی '''[[Media:$1|$1]]''' به [نسخهٔ $4 مورخ $2، $3] هستید.",
+'filerevert-intro' => "شما در حال واگردانی '''[[Media:$1|$1]]''' به [$4 نسخهٔ مورخ $2 ساعت $3] هستید.",
'filerevert-comment' => 'دلیل:',
-'filerevert-defaultcomment' => 'واگردانی به نسخهٔ $1، $2',
+'filerevert-defaultcomment' => 'واگردانی به نسخهٔ $1 ساعت $2',
'filerevert-submit' => 'برو',
-'filerevert-success' => "''[[Media:$1|$1]]''' به [نسخهٔ $4 مورخ $2، $3] واگردانده شد.",
+'filerevert-success' => "''[[Media:$1|$1]]''' به [$4 نسخهٔ مورخ $2 ساعت $3] واگردانده شد.",
'filerevert-badversion' => 'نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.',
# File deletion
@@ -1929,25 +2014,25 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'حذ٠پرونده',
'filedelete-intro' => "شما در حال حذ٠کردن پروندهٔ '''[[Media:$1|$1]]''' به همراه تمام تاریخچه‌اش هستید.",
-'filedelete-intro-old' => '<span class="plainlinks">شما در حال حذ٠نسخه \'\'\'[[Media:$1|$1]]\'\'\' به تاریخ [$4 $3، $2] هستید.</span>',
+'filedelete-intro-old' => "شما در حال حذ٠نسخه '''[[Media:$1|$1]]''' مورخ [$4 $2 ساعت $3] هستید.",
'filedelete-comment' => 'دلیل:',
'filedelete-submit' => 'حذÙ',
'filedelete-success' => "'''$1''' حذ٠شد.",
-'filedelete-success-old' => "نسخهٔ '''[[Media:$1|$1]]''' به تاریخ $3، $2 حذ٠شد.",
+'filedelete-success-old' => "نسخهٔ '''[[Media:$1|$1]]''' مورخ $2 ساعت $3 حذ٠شد.",
'filedelete-nofile' => "'''$1''' وجود ندارد.",
-'filedelete-nofile-old' => "نسخه بایگانی شده‌ای از '''$1''' با مشخصات داده شده، وجود ندارد..",
+'filedelete-nofile-old' => "نسخهٔ بایگانی‌شده‌ای از '''$1''' با مشخصات داده شده، وجود ندارد.",
'filedelete-otherreason' => 'دلیل دیگر/اضاÙÛŒ:',
'filedelete-reason-otherlist' => 'دلیل دیگر',
-'filedelete-reason-dropdown' => '
-*دلایل متداول حذÙ
+'filedelete-reason-dropdown' => '*دلایل متداول حذÙ
** نقض حق تکثیر
-** پرونده تکراری',
-'filedelete-edit-reasonlist' => 'ویرایش Ùهرست دلایل',
-'filedelete-maintenance' => 'حذ٠و احیای پرونده‌ها در مدت نگهداری به طور موقت غیر Ùعال است.',
+** پروندهٔ تکراری',
+'filedelete-edit-reasonlist' => 'ویرایش دلایل حذÙ',
+'filedelete-maintenance' => 'حذ٠و احیای پرونده‌ها در مدت نگهداری به طور موقت غیرÙعال است.',
# MIME search
'mimesearch' => 'جستجوی بر اساس MIME',
-'mimesearch-summary' => 'با Ú©Ù…Ú© این صÙحه شما می‌توانید پرونده‌هایی Ú©Ù‡ یک نوع MIME به خصوص دارند را پیدا کنید. باید اطلاعات MIME را به صورت contenttype/subtype وارد کنید، نظیر <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'با Ú©Ù…Ú© این صÙحه شما می‌توانید پرونده‌هایی Ú©Ù‡ یک نوع MIME به خصوص دارند را پیدا کنید.
+ورودی: به صورت contenttype/subtype ، نظیر <tt>image/jpeg</tt>.',
'mimetype' => 'نوع MIME:',
'download' => 'بارگیری',
@@ -1955,7 +2040,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'unwatchedpages' => 'صÙحه‌های پی‌گیری‌نشده',
# List redirects
-'listredirects' => 'Ùهرست صÙحه‌های تغییر مسیر',
+'listredirects' => 'Ùهرست صÙحه‌های تغییرمسیر',
# Unused templates
'unusedtemplates' => 'الگوهای استÙاده‌نشده',
@@ -1965,11 +2050,11 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
# Random page
'randompage' => 'صÙحهٔ تصادÙÛŒ',
-'randompage-nopages' => 'هیچ صÙحه‌ای در این {{PLURAL:$2|Ùضای نام|Ùضاهای نام}} موجود نیست: $1',
+'randompage-nopages' => 'هیچ صÙحه‌ای در این {{PLURAL:$2|Ùضای نام|Ùضاهای نام}} موجود نیست: $1.',
# Random redirect
-'randomredirect' => 'تغییر مسیر تصادÙÛŒ',
-'randomredirect-nopages' => 'هیج صÙحهٔ تغییر مسیری در Ùضای نام «$1» موجود نیست.',
+'randomredirect' => 'تغییرمسیر تصادÙÛŒ',
+'randomredirect-nopages' => 'هیج صÙحهٔ تغییرمسیری در Ùضای نام «$1» موجود نیست.',
# Statistics
'statistics' => 'آمار',
@@ -1978,15 +2063,15 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'statistics-header-views' => 'آمار بازدیدها',
'statistics-header-users' => 'آمار کاربران',
'statistics-header-hooks' => 'آمارهای دیگر',
-'statistics-articles' => 'صÙحه محتویات',
+'statistics-articles' => 'صÙحه‌های محتوایی',
'statistics-pages' => 'صÙحه‌ها',
-'statistics-pages-desc' => 'تمام صÙحه‌های این ویکی، از جمله صÙحه‌های بحث، تغییر مسیر Ùˆ غیره',
+'statistics-pages-desc' => 'تمام صÙحه‌های این ویکی، از جمله صÙحه‌های بحث، تغییرمسیر Ùˆ غیره',
'statistics-files' => 'پرونده‌های بارگذاری شده',
'statistics-edits' => 'ویرایش صÙحه‌ها از هنگامی Ú©Ù‡ {{SITENAME}} راه‌اندازی شده',
-'statistics-edits-average' => 'متوسط ویرایش‌ها بر روی صÙحات',
+'statistics-edits-average' => 'متوسط ویرایش‌ها به ازای هر صÙحه',
'statistics-views-total' => 'مجموع بازدیدها',
+'statistics-views-total-desc' => 'بازدید صÙحه‌های ناموجود Ùˆ صÙحه‌های ویژه شامل نشده‌است',
'statistics-views-peredit' => 'تعداد بازدید به ازای هر ویرایش',
-'statistics-jobqueue' => 'طول [http://www.mediawiki.org/wiki/Manual:Job_queue ص٠کار]',
'statistics-users' => '[[Special:ListUsers|کاربران]] ثبت‌نام کرده',
'statistics-users-active' => 'کاربران Ùعال',
'statistics-users-active-desc' => 'کاربرانی Ú©Ù‡ در {{PLURAL:$1|روز|$1 روز}} قبل Ùعالیتی انجام داده‌اند',
@@ -2001,9 +2086,9 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'doubleredirects' => 'تغییرمسیرهای دوتایی',
'doubleredirectstext' => 'این صÙحه Ùهرستی از صÙحه‌های تغییر مسیری را ارائه می‌کند Ú©Ù‡ به صÙحهٔ تغییر مسیر دیگری اشاره می‌کنند.
هر سطر دربردارندهٔ پیوندهایی به تغییر مسیر اول Ùˆ دوم Ùˆ همچنین مقصد تغییر مسیر دوم است، Ú©Ù‡ معمولاً صÙحهٔ مقصد واقعی است Ùˆ نخستین تغییر مسیر باید به آن اشاره کند.
-موارد <s>خط خورده</s> درست شده‌اند.',
+موارد <del>خط خورده</del> درست شده‌اند.',
'double-redirect-fixed-move' => '[[$1]] انتقال داده شده‌است، و در حال حاضر تغییر مسیری به [[$2]] است',
-'double-redirect-fixer' => 'تعمیرکار تغییر مسیرها',
+'double-redirect-fixer' => 'تعمیرکار تغییرمسیرها',
'brokenredirects' => 'تغییرمسیرهای خراب',
'brokenredirectstext' => 'تغییرمسیرهای زیر به یک صÙحهٔ ناموجود پیوند دارند:',
@@ -2022,17 +2107,19 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'ncategories' => '$1 {{PLURAL:$1|رده|رده}}',
'nlinks' => '$1 {{PLURAL:$1|پیوند|پیوند}}',
'nmembers' => '$1 {{PLURAL:$1|عضو|عضو}}',
-'nrevisions' => '$1 {{PLURAL:$1|ویرایش|ویرایش}}',
-'nviews' => '$1 {{PLURAL:$1|نمایش|نمایش}}',
-'specialpage-empty' => 'این صÙحه تÙهی‌است.',
+'nrevisions' => '$1 {{PLURAL:$1|نسخه|نسخه}}',
+'nviews' => '$1 {{PLURAL:$1|بازدید|بازدید}}',
+'nimagelinks' => 'مورد استÙاده در $1 {{PLURAL:$1|صÙحه|صÙحه}}',
+'ntransclusions' => 'در $1 {{PLURAL:$1|صÙحه|صÙحه}} استÙاده شده‌است',
+'specialpage-empty' => 'نتیجه‌ای برای این گزارش وجود ندارد.',
'lonelypages' => 'صÙحه‌های یتیم',
'lonelypagestext' => 'به صÙحه‌های زیر از هیچ صÙحهٔ دیگری در {{SITENAME}} پیوند داده نشده‌است Ùˆ در هیچ صÙحهٔ دیگری گنجانده نشده‌اند.',
'uncategorizedpages' => 'صÙحه‌های رده‌بندی نشده',
'uncategorizedcategories' => 'رده‌های رده‌بندی نشده',
-'uncategorizedimages' => 'تصویرهای رده‌بندی‌نشده',
+'uncategorizedimages' => 'پرونده‌های رده‌بندی نشده',
'uncategorizedtemplates' => 'الگوهای رده‌بندی نشده',
-'unusedcategories' => 'رده‌های بی‌استÙاده',
-'unusedimages' => 'تصویرهای استÙاده‌نشده',
+'unusedcategories' => 'رده‌های استÙاده نشده',
+'unusedimages' => 'پرونده‌های استÙاده نشده',
'popularpages' => 'صÙحه‌های محبوب',
'wantedcategories' => 'رده‌های مورد نیاز',
'wantedpages' => 'صÙحه‌های مورد نیاز',
@@ -2043,17 +2130,17 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'mostlinkedcategories' => 'رده‌هایی که بیشتر از همه به آنها پیوند شده است',
'mostlinkedtemplates' => 'الگوهایی که بیشتر از همه به آنها پیوند شده است',
'mostcategories' => 'مقاله‌هایی که بیشترین تعداد رده را دارند',
-'mostimages' => 'تصاویری که بیشتر از همه به آنها پیوند شده است',
-'mostrevisions' => 'مقاله‌هایی که بیشتر از بقیه ویرایش شده‌اند',
+'mostimages' => 'پرونده‌هایی که بیشتر از همه به آنها پیوند شده است',
+'mostrevisions' => 'صÙحه‌های دارای بیشترین نسخه',
'prefixindex' => 'تمام صÙحه‌ها با پیشوند',
'shortpages' => 'صÙحه‌های کوتاه',
'longpages' => 'صÙحه‌های بلند',
'deadendpages' => 'صÙحه‌های بن‌بست',
-'deadendpagestext' => 'صÙحه‌های زیر به هیچ صÙحهٔ دیگر در این ویکی پیوند ندارند.',
-'protectedpages' => 'صÙحه‌های Ø­Ùاظت‌شده',
-'protectedpages-indef' => 'Ùقط Ø­Ùاظت‌های بی‌پایان',
+'deadendpagestext' => 'صÙحه‌های زیر به هیچ صÙحهٔ دیگری در {{SITENAME}} پیوند ندارند.',
+'protectedpages' => 'صÙحه‌های محاÙظت‌شده',
+'protectedpages-indef' => 'Ùقط محاÙظت‌های بی‌پایان',
'protectedpages-cascade' => 'Ùقط محاÙظت‌های آبشاری',
-'protectedpagestext' => 'صÙحه‌های زیر در برابر ویرایش یا انتقال Ø­Ùاظت شده‌اند:',
+'protectedpagestext' => 'صÙحه‌های زیر در برابر ویرایش یا انتقال محاÙظت شده‌اند:',
'protectedpagesempty' => 'در حال حاضر هیچ‌صÙحه‌ای محاÙظت نشده‌است.',
'protectedtitles' => 'عنوان‌های محاÙظت شده',
'protectedtitlestext' => 'عنوان‌های زیر از ایجاد محاÙظت شده‌اند',
@@ -2084,7 +2171,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'booksources-search-legend' => 'جستجوی منابع کتاب',
'booksources-isbn' => 'شابک:',
'booksources-go' => 'برو',
-'booksources-text' => 'در زیر Ùهرستی از پیوندها به وبگاه‌های دیگر آمده‌است Ú©Ù‡ کتاب‌های نو Ùˆ دست دوم می‌Ùروشند، Ùˆ هم‌چنین ممکن است اطلاعات بیشتری راجع به کتاب مورد نظر شما داشته‌باشند:',
+'booksources-text' => 'در زیر Ùهرستی از پیوندها به وبگاه‌های دیگر آمده‌است Ú©Ù‡ کتاب‌های نو Ùˆ دست دوم می‌Ùروشند، Ùˆ همچنین ممکن است اطلاعات بیشتری راجع به کتاب مورد نظر شما داشته باشند:',
'booksources-invalid-isbn' => 'شابک داده شده مجاز به نظر نمی‌رسد؛ از جهت اشکالات هنگام کپی کردن از منبع اصلی بررسی کنید.',
# Special:Log
@@ -2115,7 +2202,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'allpages-bad-ns' => '{{SITENAME}} دارای Ùضای نام «$1» نیست.',
# Special:Categories
-'categories' => 'رده‌های صÙحه',
+'categories' => 'رده‌ها',
'categoriespagetext' => '{{PLURAL:$1|ردهٔ|رده‌های}} زیر حاوی صÙحه یا پرونده {{PLURAL:$1|است|هستند}}.
[[Special:UnusedCategories|رده‌های استÙاده نشده]] در اینجا نمایش داده نشده‌اند.
هم‌چنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.',
@@ -2133,7 +2220,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'linksearch-pat' => 'جستجوی الگو:',
'linksearch-ns' => 'Ùضای نام:',
'linksearch-ok' => 'جستجو',
-'linksearch-text' => 'نشانه‌هایی مانند "*.wikipedia.org" را می‌توان استÙاده کرد.<br />پروتکل‌های پشتیبانی‌شده: <tt>$1</tt>',
+'linksearch-text' => 'نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استÙاده کرد.<br />
+پروتکل‌های پشتیبانی‌شده: <tt>$1</tt>',
'linksearch-line' => '$1 از $2 پیوند دارد',
'linksearch-error' => 'نشانه‌ها Ùقط در ابتدای نام میزبان اینترنتی می‌توانند استÙاده شوند.',
@@ -2154,7 +2242,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
# Special:Log/newusers
'newuserlogpage' => 'سیاههٔ ایجاد کاربر',
-'newuserlogpagetext' => 'این سیاهه‌ای از نامهای کاربری٠تازه‌ساخته‌شده است',
+'newuserlogpagetext' => 'این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.',
'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
'newuserlog-create-entry' => 'کاربر جدید',
'newuserlog-create2-entry' => 'حساب کاربری جدید $1 را ایجاد کرد',
@@ -2176,59 +2264,62 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'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-self-all' => 'می‌تواند حساب خود را به تمام گروه‌ها اضاÙÙ‡ کند',
+'listgrouprights-removegroup-self-all' => 'می‌تواند حساب خود را از تمام گروه‌ها حذ٠کند',
# E-mail user
-'mailnologin' => 'نشانی‌ای از Ùرستنده وجود ندارد.',
-'mailnologintext' => 'برای Ùرستادن پست الکترونیکی به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] Ùˆ نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
-'emailuser' => 'نامه به این کاربر',
-'emailpage' => 'پست الکترونیکی به کاربر',
-'emailpagetext' => 'شما می‌توانید از Ùرم زیر برای ارسال یک نامه الکترونیکی به این کاربر استÙاده کنید.
+'mailnologin' => 'نشانی‌ای از Ùرستنده موجود نیست',
+'mailnologintext' => 'برای Ùرستادن پست الکترونیکی به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] Ùˆ نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
+'emailuser' => 'نامه به این کاربر',
+'emailpage' => 'پست الکترونیکی به کاربر',
+'emailpagetext' => 'شما می‌توانید از Ùرم زیر برای ارسال یک نامه الکترونیکی به این کاربر استÙاده کنید.
نشانی پست الکترونیکی‌ای Ú©Ù‡ در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی Ùرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
-'usermailererror' => 'پست الکترونیکی دچار خطا شد:',
-'defemailsubject' => 'پست الکترونیکی {{SITENAME}}',
-'noemailtitle' => 'نشانی پست الکترونیکی موجود نیست',
-'noemailtext' => 'این کاربر نشانی پست الکترونیکی معتبری مشخص نکرده است،
-یا تصمیم گرÙته از کاربران دیگر پست الکترونیکی دریاÙت نکند.',
-'nowikiemailtitle' => 'اجازهٔ ارسال نامهٔ الکترونیکی داده نشده‌است',
-'nowikiemailtext' => 'این کاربر انتخاب کرده Ú©Ù‡ از دیگر کاربران نامهٔ الکترونیکی دریاÙت نکند.',
-'email-legend' => 'ارسال نامه الکترونیکی به یک کاربر دیگر {{SITENAME}}',
-'emailfrom' => 'از:',
-'emailto' => 'به:',
-'emailsubject' => 'عنوان:',
-'emailmessage' => 'پیغام:',
-'emailsend' => 'Ùرستاده شود',
-'emailccme' => 'رونوشت پیغام را برایم بÙرست.',
-'emailccsubject' => 'رونوشت پیغام شما به $1: $2',
-'emailsent' => 'پست الکترونیکی Ùرستاده شد',
-'emailsenttext' => 'پیغام پست الکترونیکی شما Ùرستاده شد.',
-'emailuserfooter' => 'این نامهٔ الکترونیکی با استÙاده از ویژگی «پست الکترونیکی به کاربر» {{SITENAME}} توسط $1 به $2 Ùرستاده شد.',
+'usermailererror' => 'پست الکترونیکی دچار خطا شد:',
+'defemailsubject' => 'پست الکترونیکی {{SITENAME}}',
+'usermaildisabled' => 'پست الکترونیکی کاربر غیرقعال است',
+'usermaildisabledtext' => 'شما در این ویکی نمی‌توانید به دیگر کاربران پست الکترونیکی بÙرستید',
+'noemailtitle' => 'نشانی پست الکترونیکی موجود نیست',
+'noemailtext' => 'این کاربر نشانی پست الکترونیکی معتبری مشخص نکرده است،',
+'nowikiemailtitle' => 'اجازهٔ ارسال نامهٔ الکترونیکی داده نشده‌است',
+'nowikiemailtext' => 'این کاربر انتخاب کرده Ú©Ù‡ از دیگر کاربران نامهٔ الکترونیکی دریاÙت نکند.',
+'email-legend' => 'ارسال نامه الکترونیکی به یک کاربر دیگر {{SITENAME}}',
+'emailfrom' => 'از:',
+'emailto' => 'به:',
+'emailsubject' => 'عنوان:',
+'emailmessage' => 'پیغام:',
+'emailsend' => 'Ùرستاده شود',
+'emailccme' => 'رونوشت پیغام را برایم بÙرست.',
+'emailccsubject' => 'رونوشت پیغام شما به $1: $2',
+'emailsent' => 'پست الکترونیکی Ùرستاده شد',
+'emailsenttext' => 'پیغام پست الکترونیکی شما Ùرستاده شد.',
+'emailuserfooter' => 'این نامهٔ الکترونیکی با استÙاده از ویژگی «پست الکترونیکی به کاربر» {{SITENAME}} توسط $1 به $2 Ùرستاده شد.',
+
+# User Messenger
+'usermessage-summary' => 'گذاشتن پیغام سامانه.',
+'usermessage-editor' => 'پیغامگیر سامانه',
# Watchlist
'watchlist' => 'Ùهرست پی‌گیری‌های من',
'mywatchlist' => 'پی‌گیری‌های من',
-'watchlistfor' => "(برای '''$1''')",
+'watchlistfor2' => 'برای $1 $2',
'nowatchlist' => 'در Ùهرست پی‌گیری‌های شما هیچ موردی نیست.',
'watchlistanontext' => 'برای مشاهده Ùˆ ویرایش Ùهرست پی‌گیری‌های خود از $1 استÙاده کنید.',
'watchnologin' => 'به سامانه وارد نشده‌اید',
'watchnologintext' => 'برای تغییر Ùهرست پی‌گیری‌هایتان باید [[Special:UserLogin|به سامانه وارد شوید]].',
-'addedwatch' => 'به Ùهرست پی‌گیری اضاÙÙ‡ شد',
-'addedwatchtext' => "صÙحهٔ «<nowiki>$1</nowiki>» به [[Special:Watchlist|Ùهرست پی‌گیری‌های]] شما اضاÙÙ‡ شد.
-تغییرات این صÙحه Ùˆ صÙحهٔ بحث متناظرش در آینده در اینجا Ùهرست خواهد شد. به‌علاوه، این صÙحه، برای واضح‌تر دیده شدن در [[Special:RecentChanges|Ùهرست تغییرات اخیر]] به Ø´Ú©Ù„ <b>سیاه</b> خواهد آمد.
-
-اگر بعداً می‌خواستید این صÙحه از Ùهرست پی‌گیریهایتان برداشته شود، روی «'''توق٠پی‌گیری'''» در بالای صÙحه کلیک کنید.",
+'addedwatch' => 'به Ùهرست پی‌گیری اÙزوده شد',
+'addedwatchtext' => 'صÙحهٔ «<nowiki>$1</nowiki>» به [[Special:Watchlist|Ùهرست پی‌گیری‌های]] شما اضاÙÙ‡ شد.
+تغییرات این صÙحه Ùˆ صÙحهٔ بحث متناظرش در آینده در اینجا Ùهرست خواهد شد؛ به‌علاوه، این صÙحه، برای واضح‌تر دیده شدن در [[Special:RecentChanges|Ùهرست تغییرات اخیر]] به Ø´Ú©Ù„ <b>پررنگ</b> نمایش خواهد یاÙت.',
'removedwatch' => 'از Ùهرست پی‌گیری‌ها برداشته شد',
'removedwatchtext' => 'صÙحهٔ «<nowiki>[[:$1]]</nowiki>» از [[Special:Watchlist|Ùهرست پی‌گیری‌های شما]] برداشته شد.',
'watch' => 'پی‌گیری',
'watchthispage' => 'پی‌گیری این صÙحه',
'unwatch' => 'توق٠پی‌گیری',
'unwatchthispage' => 'توق٠پی‌گیری',
-'notanarticle' => 'مقاله نیست',
-'notvisiblerev' => 'این نسخه حذ٠شده‌است',
+'notanarticle' => 'صÙحه محتوایی نیست',
+'notvisiblerev' => 'آخرین نسخه توسط کاربری دیگر حذ٠شده‌است',
'watchnochange' => 'هیچ یک از موارد در حال پی‌گیری شما در دورهٔ زمانی نمایش‌یاÙته ویرایش نشده است.',
-'watchlist-details' => 'بدون احتساب صÙحه‌های بحث، {{PLURAL:$1|$1 صÙحه|$1 صÙحه}} در Ùهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارند|دارد}}.',
-'wlheader-enotif' => '*اطلاع‌رسانی ایمیلی امکان‌پذیر است.',
+'watchlist-details' => 'بدون احتساب صÙحه‌های بحث، {{PLURAL:$1|$1 صÙحه|$1 صÙحه}} در Ùهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارتد}}.',
+'wlheader-enotif' => '*اطلاع‌رسانی از طریق پست الکترونیکی امکان‌پذیر است.',
'wlheader-showupdated' => "*صÙحه‌هایی Ú©Ù‡ پس از آخرین سرزدنتان به آنها تغییر کرده‌اند '''پررنگ''' نشان داده شده‌اند.",
'watchmethod-recent' => 'بررسی ویرایش‌های اخیر برای صÙحه‌های مورد پی‌گیری',
'watchmethod-list' => 'بررسی صÙحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
@@ -2247,14 +2338,14 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'enotif_newpagetext' => 'این یک صÙحهٔ تازه‌است.',
'enotif_impersonal_salutation' => 'کاربر {{SITENAME}}',
'changed' => 'تغییر یاÙته',
-'created' => 'ایجاد شد',
+'created' => 'ایجاد شده',
'enotif_subject' => 'صÙحهٔ «$PAGETITLE» {{SITENAME}} به دست $PAGEEDITOR $CHANGEDORCREATED‌است.',
'enotif_lastvisited' => 'برای دیدن همهٔ تغییرات از آخرین باری که سر زده‌اید $1 را ببینید.',
'enotif_lastdiff' => 'برای نمایش این تغییر $1 را ببینید.',
'enotif_anon_editor' => 'کاربر ناشناس $1',
'enotif_body' => '$WATCHINGUSERNAME گرامی،
-صÙحهٔ «$PAGETITLE» {{SITENAME}} در $PAGEEDITDATE به دست $PAGEEDITOR $CHANGEDORCREATED است. برای دیدن نسخهٔ کنونی به $PAGETITLE_URL بروید.
+صÙحهٔ «$PAGETITLE» {{SITENAME}} در $PAGEEDITDATE به‌دست $PAGEEDITOR $CHANGEDORCREATED است. برای دیدن نسخهٔ کنونی $PAGETITLE_URL را ببینید.
$NEWPAGE
@@ -2267,17 +2358,17 @@ $NEWPAGE
تا هنگامی Ú©Ù‡ به صÙحه سر نزده‌اید، در صورت رخ‌دادن٠احتمالی٠تغییرات٠بیشتر، اعلانیه‌ای برای شما Ùرستاده نخواهد شد.
شما همچنین می‌توانید در صÙحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی پستی را صÙر کنید.
-خاکسار شما،
-
-سامانهٔ آگاهی‌رسانی {{SITENAME}}.
+ دوستدار شما، سامانهٔ آگاهی‌رسانی {{SITENAME}}
--
+برای تغییر تنظیمات Ùهرست آگاهی‌رسانی رایانامه‌ای شما به {{fullurl:{{#special:Watchlist}}/edit}} بروید.
+
برای تغییر تنظیمات Ùهرست پی‌گیری‌هایتان به {{fullurl:{{#special:Watchlist}}/edit}} بروید.
برای حذ٠صÙحه از Ùهرصت پی‌گیری‌هایتان به $UNWATCHURL بروید.
بازخورد و کمک بیشتر:
-{{fullurl:{{ns:help}}:Contents}}',
+{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
'deletepage' => 'حذ٠صÙحه',
@@ -2309,7 +2400,7 @@ $NEWPAGE
** درخواست کاربر
** نقض حق تکثیر
** خرابکاری',
-'delete-edit-reasonlist' => 'ویرایش Ùهرست دلایل',
+'delete-edit-reasonlist' => 'ویرایش دلایل حذÙ',
'delete-toobig' => 'این صÙحه تاریخچهٔ ویرایشی بزرگی دارد، Ú©Ù‡ شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.
به منظور جلوگیری از خرابکاری احتمالی حذ٠این گونه صÙحه‌ها در {{SITENAME}} محدود شده‌است.',
'delete-warning-toobig' => 'این صÙحه تاریخچهٔ ویرایشی بزرگی دارد، Ú©Ù‡ شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.
@@ -2330,28 +2421,34 @@ $NEWPAGE
'revertpage' => 'ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد',
'revertpage-nouser' => 'ویرایش‌های انجام شده توسط (نام کاربری حذ٠شده) به آخرین ویرایش توسط [[User:$1|$1]] واگردانی شد.',
'rollback-success' => 'ویرایش‌های $1 واگردانی شد؛ صÙحه به ویرایش $2 برگردانده شد.',
-'sessionfailure' => 'به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛ عمل درخواست شده به‌عنوان اقدام پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد. لطÙاً دکمهٔ «بازگشت» را در مرورگر خود بÙشارید Ùˆ صÙحه‌ای Ú©Ù‡ از آن به اینجا رسیده‌اید را دوباره Ùراخوانی کنید، سپس مجدداً سعی کنید.',
+
+# Edit tokens
+'sessionfailure-title' => 'خطای نشست کاربری',
+'sessionfailure' => 'به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛ عمل درخواست شده به‌عنوان اقدام پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد. لطÙاً دکمهٔ «بازگشت» را در مرورگر خود بÙشارید Ùˆ صÙحه‌ای Ú©Ù‡ از آن به اینجا رسیده‌اید را دوباره Ùراخوانی کنید، سپس مجدداً سعی کنید.',
# Protect
'protectlogpage' => 'سیاههٔ_محاÙظت',
-'protectlogtext' => 'در زیر Ùهرست Ù‚ÙÙ„ کردن‌ها/ازقÙل‌درآوردن‌های صÙحه‌ها آمده است.
-برای اطلاعات بیشتر به [[{{ns:project}}:سیاست Ø­Ùاظت از صÙحه‌ها]] مراجعه کنید.',
+'protectlogtext' => 'در زیر Ùهرست محاÙظت کردن‌ها/از محاÙظت درآوردن‌های صÙحه‌ها آمده است.
+برای اطلاعات بیشتر به [[{{ns:project}}:سیاست محاÙظت از صÙحه‌ها]] مراجعه کنید.',
'protectedarticle' => '«[[$1]]» را محاÙظت کرد',
'modifiedarticleprotection' => 'وضعیت محاÙظت «[[$1]]» را تغییر داد',
'unprotectedarticle' => '[[$1]] را از محاÙظت به در آورد',
'movedarticleprotection' => 'تنظیمات محاÙظت را از «[[$2]]» به «[[$1]]» منتقل کرد',
'protect-title' => 'تغییر وضعیت محاÙظت «$1»',
'prot_1movedto2' => '$1 به $2 منتقل شد',
-'protect-legend' => 'تأیید Ø­Ùاظت',
+'protect-legend' => 'تأیید محاÙظت',
'protectcomment' => 'دلیل:',
'protectexpiry' => 'زمان سرآمدن:',
'protect_expiry_invalid' => 'زمان سرآمدن نامعتبر است.',
'protect_expiry_old' => 'زمان سرآمدن در گذشته‌است.',
-'protect-unchain-permissions' => 'باز کردن سایر گزینه‌های Ø­Ùاظت',
-'protect-text' => "شما می‌توانید سطح Ø­Ùاظت صÙحهٔ '''<nowiki>$1</nowiki>''' را ببینید Ùˆ از اینجا آن را تغییر دهید.",
-'protect-locked-blocked' => 'شما در مدتی Ú©Ù‡ دسترسی‌تان قطع است نمی‌توانید سطح Ø­Ùاظت صÙحه‌ها را تغییر دهید. تنظیمات Ùعلی صÙحهٔ $1 به این قرار است:',
-'protect-locked-dblock' => 'به دلیل Ù‚ÙÙ„ شدن پایگاه داده، امکان تغییر سطح Ø­Ùاظت صÙحه وجود ندارد. تنظیمات Ùعلی صÙحهٔ $1 به این قرار است:',
-'protect-locked-access' => 'حساب کاربری شما اجازهٔ تغییر سطح Ø­Ùاظت صÙحه را ندارد. تنظیمات Ùعلی صÙحهٔ $1 به این قرار است:',
+'protect-unchain-permissions' => 'باز کردن سایر گزینه‌های محاÙظت',
+'protect-text' => "شما می‌توانید سطح محاÙظت صÙحهٔ '''<nowiki>$1</nowiki>''' را ببینید Ùˆ از اینجا آن را تغییر دهید.",
+'protect-locked-blocked' => 'شما در مدتی Ú©Ù‡ دسترسی‌تان قطع است نمی‌توانید سطح محاÙظت صÙحه‌ها را تغییر دهید.
+تنظیمات Ùعلی صÙحهٔ $1 از این قرار است:',
+'protect-locked-dblock' => 'به دلیل Ù‚ÙÙ„ شدن پایگاه داده، امکان تغییر سطح محاÙظت صÙحه وجود ندارد.
+تنظیمات Ùعلی صÙحهٔ $1 به این قرار است:',
+'protect-locked-access' => 'حساب کاربری شما اجازهٔ تغییر سطح محاÙظت صÙحه را ندارد.
+تنظیمات Ùعلی صÙحهٔ $1 به این قرار است:',
'protect-cascadeon' => 'این صÙحه در حال حاضر محاÙظت شده‌است زیرا در {{PLURAL:$1|صÙحهٔ|صÙحه‌های}} زیر Ú©Ù‡ گزینهٔ محاÙظت آبشاری {{PLURAL:$1|آن|آن‌ها}} Ùعال است،
شما می‌توانید سطح محاÙظت این صÙحه را تغییر بدهید اما این کار تاثیری بر محاÙظت آبشاری صÙحه نخواهد گذاشت.',
'protect-default' => 'همهٔ کاربرها',
@@ -2362,7 +2459,7 @@ $NEWPAGE
'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
'protect-expiry-indefinite' => 'بی‌پایان',
'protect-cascade' => 'محاÙظت آبشاری - از همهٔ صÙحه‌هایی Ú©Ù‡ در این صÙحه آمده‌اند نیز محاÙظت می‌شود.',
-'protect-cantedit' => 'شما نمی‌تواند وضعیت Ø­Ùاظت این صÙحه را تغییر دهید، چون اجازه ویرایش آن را ندارید.',
+'protect-cantedit' => 'شما نمی‌تواند وضعیت محاÙظت این صÙحه را تغییر دهید، چون اجازه ویرایش آن را ندارید.',
'protect-othertime' => 'زمانی دیگر:',
'protect-othertime-op' => 'زمانی دیگر',
'protect-existing-expiry' => 'زمان انقضای موجود: $2، $3',
@@ -2458,18 +2555,22 @@ $1',
'month' => 'در این ماه (و پیش از آن):',
'year' => 'در این سال (و قبل از آن)',
-'sp-contributions-newbies' => 'Ùقط مشارکت‌های تازه‌واردان نمایش داده شود',
-'sp-contributions-newbies-sub' => 'برای تازه‌کاران',
-'sp-contributions-newbies-title' => 'مشارکت‌های کاربری برای حساب‌های تازه‌کار',
-'sp-contributions-blocklog' => 'سیاههٔ بسته‌شدن‌ها',
-'sp-contributions-deleted' => 'مشارکت‌های حذ٠شدهٔ کاربر',
-'sp-contributions-logs' => 'سیاهه‌ها',
-'sp-contributions-talk' => 'بحث',
-'sp-contributions-userrights' => 'مدیریت اختیارات کاربر',
-'sp-contributions-blocked-notice' => 'این کاربر در حال حاضر بسته شده‌است. آخرین سیاههٔ بسته شدن در زیر آمده‌است:',
-'sp-contributions-search' => 'جستجوی مشارکت‌ها',
-'sp-contributions-username' => 'نشانی آی‌پی یا نام کاربری:',
-'sp-contributions-submit' => 'جستجو',
+'sp-contributions-newbies' => 'Ùقط مشارکت‌های تازه‌واردان نمایش داده شود',
+'sp-contributions-newbies-sub' => 'برای تازه‌کاران',
+'sp-contributions-newbies-title' => 'مشارکت‌های کاربری برای حساب‌های تازه‌کار',
+'sp-contributions-blocklog' => 'سیاههٔ بسته‌شدن‌ها',
+'sp-contributions-deleted' => 'مشارکت‌های حذ٠شدهٔ کاربر',
+'sp-contributions-uploads' => 'بارگذاری‌ها',
+'sp-contributions-logs' => 'سیاهه‌ها',
+'sp-contributions-talk' => 'بحث',
+'sp-contributions-userrights' => 'مدیریت اختیارات کاربر',
+'sp-contributions-blocked-notice' => 'این کاربر در حال حاضر بسته شده‌است. آخرین سیاههٔ بسته شدن در زیر آمده‌است:',
+'sp-contributions-blocked-notice-anon' => 'این نشانی آی‌پی در حال حاضر بسته است.
+آخرین سیاههٔ بسته شدن در زیر آمده‌است:',
+'sp-contributions-search' => 'جستجوی مشارکت‌ها',
+'sp-contributions-username' => 'نشانی آی‌پی یا نام کاربری:',
+'sp-contributions-toponly' => 'تنها نسخه‌های بالایی را نمایش بده',
+'sp-contributions-submit' => 'جستجو',
# What links here
'whatlinkshere' => 'پیوندها به این صÙحه',
@@ -2484,7 +2585,7 @@ $1',
'whatlinkshere-prev' => '{{PLURAL:$1|قبلی|$1 مورد قبلی}}',
'whatlinkshere-next' => '{{PLURAL:$1|بعدی|$1 مورد بعدی}}',
'whatlinkshere-links' => '↠پیوندها',
-'whatlinkshere-hideredirs' => '$1 تغییرمسیر',
+'whatlinkshere-hideredirs' => '$1 تغییر مسیر',
'whatlinkshere-hidetrans' => '$1 تراگنجانش',
'whatlinkshere-hidelinks' => '$1 پیوند',
'whatlinkshere-hideimages' => '$1 پیوند به تصویر',
@@ -2530,7 +2631,6 @@ $1',
'ipb-edit-dropdown' => 'دلایل قطع دسترسی',
'ipb-unblock-addr' => 'بازکردن $1',
'ipb-unblock' => 'باز کردن نام کاربری یا نشانی آی‌پی',
-'ipb-blocklist-addr' => 'بستن‌های موجود برای $1',
'ipb-blocklist' => 'دیدن٠بَست‌های موجود',
'ipb-blocklist-contribs' => 'مشارکت‌های $1',
'unblockip' => 'باز کردن کاربر',
@@ -2565,8 +2665,10 @@ $1',
'autoblocker' => 'به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استÙاده شده‌است.
دلیل قطع دسترسی $1 چنین است: «$2»',
'blocklogpage' => 'سیاههٔ_بسته‌شدن‌ها',
-'blocklog-showlog' => 'دسترسی این کاربر قبلاً بسته شده‌است. سیاههٔ قطع دسترسی در زیر نمایش یاÙته است:',
-'blocklog-showsuppresslog' => 'دسترسی این کاربر قبلاً بسته شده Ùˆ این کاربر پنهان شده‌است. سیاههٔ قطع دسترسی در زیر نمایش یاÙته است:',
+'blocklog-showlog' => 'دسترسی این کاربر در گذشته بسته شده‌است.
+سیاههٔ قطع دسترسی در زیر نمایش یاÙته است:',
+'blocklog-showsuppresslog' => 'دسترسی این کاربر قبلاً بسته شده و این کاربر پنهان شده‌است.
+سیاههٔ قطع دسترسی در زیر نمایش یاÙته است:',
'blocklogentry' => '«[[$1]]» را $2 بست $3',
'reblock-logentry' => 'تنظیم‌های قطع دسترسی [[$1]] را تغییر داد به پایان قطع دسترسی در $2 $3',
'blocklogtext' => 'این سیاهه‌ای از اعمال بستن و باز کردن کاربرها است.
@@ -2574,7 +2676,7 @@ $1',
برای Ùهرست محرومیت‌ها Ùˆ بسته‌شدن‌های عملیاتی در لحظهٔ حاضر، به [[Special:IPBlockList|Ùهرست آی‌پی‌های بسته]] مراجعه کنید.',
'unblocklogentry' => '«$1» را باز کرد',
'block-log-flags-anononly' => 'Ùقط کاربران گمنام',
-'block-log-flags-nocreate' => 'قابلیت ایجاد حساب غیرÙعال شد.',
+'block-log-flags-nocreate' => 'قابلیت ایجاد حساب غیرÙعال شد',
'block-log-flags-noautoblock' => 'قطع دسترسی خودکار غیرÙعال شد',
'block-log-flags-noemail' => 'پست الکترونیکی مسدود شد',
'block-log-flags-nousertalk' => 'صÙحهٔ بحث خود را نمی‌تواند ویرایش کند',
@@ -2604,6 +2706,8 @@ $1',
شما اجازهٔ ساختن حساب کاربری ندارید.',
'cant-block-while-blocked' => 'در مدتی که دسترسی شما بسته است نمی‌توانید دسترسی کاربران دیگر را قطع کنید.',
'cant-see-hidden-user' => 'کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.',
+'ipbblocked' => 'شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.',
+'ipbnounblockself' => 'شما مجاز به باز کردن دسترسی خود نیستید.',
# Developer tools
'lockdb' => 'Ù‚ÙÙ„ کردن پایگاه داده',
@@ -2640,6 +2744,17 @@ $1',
'''هشدار!'''
انتقال صÙحه‌ها به نام جدید ممکن است تغییر اساسی Ùˆ غیرمنتظره‌ای برای صÙحه‌های محبوب باشد؛
لطÙاً مطمئن شوید Ú©Ù‡ قبل از انتقال دادن صÙحه، عواقب این کار را درک می‌کنید.",
+'movepagetext-noredirectfixer' => "استÙاده از Ùرم زیر سبب تغییر نام یک صÙحه Ùˆ انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.
+نام پیشین تغییر مسیری به نام جدید خواهد شد.
+برای اطمینان [[Special:DoubleRedirects|تغییر مسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییر مسیهای خراب]] را بررسی کنید.
+دربارهٔ اینکه پیوندها جایی که قرار است بروند را دنبال کنند، شما مسئول هستید.
+
+توجه کنید Ú©Ù‡ اگر نام جدید از قبل ایجاد شده باشد، انتقال انجام نخواهد گرÙت، مگر در حالتی Ú©Ù‡ صÙحه خالی باشد Ùˆ یا تغییر مسیر باشد Ùˆ تاریخچهٔ ویرایشی دیگری نداشته باشد.
+این بدان معناست Ú©Ù‡ اگر صÙحه را اشتباهی منتقل کردید می‌توانید این تغییر را وابگردانید، اما نمی‌توانید به صÙحه‌ای Ú©Ù‡ از قبل موجود است انتقال دهید.
+
+'''هشدار!'''
+انتقال صÙحه‌های محبوب می‌تواند غیر منتظره باشد.
+لطÙاً مطمئن شوید Ú©Ù‡ از نتیجهٔ کار آگاهید.",
'movepagetalktext' => "صÙحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد '''مگر اینکه''' :
* در حال انتقال صÙحه از این Ùضای نام به Ùضای نام دیگری باشید،
* یک صÙحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا
@@ -2688,7 +2803,7 @@ $1',
'delete_and_move' => 'حذ٠و انتقال',
'delete_and_move_text' => '== نیاز به حذ٠==
-مقاله‌ٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذ٠کنید تا انتقال ممکن شود؟',
+مقالهٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذ٠کنید تا انتقال ممکن شود؟',
'delete_and_move_confirm' => 'بله، صÙحه حذ٠شود',
'delete_and_move_reason' => 'حذ٠برای ممکن‌شدن انتقال',
'selfmove' => 'عنوان‌های صÙحهٔ مبدأ Ùˆ مقصد یکی است؛ انتقال صÙحه به خودش ممکن نیست.',
@@ -2698,6 +2813,7 @@ $1',
'immobile-source-page' => 'این صÙحه قابل انتقال نیست.',
'immobile-target-page' => 'امکان انتقال به این عنوان مقصد وجود ندارد.',
'imagenocrossnamespace' => 'امکان انتقال تصویر به Ùضای نام غیر تصویر وجود ندارد',
+'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر تصویر به Ùضای نام تصویر وجود ندارد',
'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
'imageinvalidfilename' => 'نام پروندهٔ هد٠غیر مجاز است',
'fix-double-redirects' => 'به روز کردن تمامی تغییر مسیرهایی که به مقالهٔ اصلی اشاره می‌کنند',
@@ -2776,6 +2892,7 @@ $1',
'importstart' => 'در حال درون‌ریزی صÙحه‌ها...',
'import-revision-count' => '$1 {{PLURAL:$1|ویرایش|ویرایش}}',
'importnopages' => 'صÙحه‌ای برای درون‌ریزی نیست.',
+'imported-log-entries' => '$1 {{PLURAL:$1|مورد سیاهه|مورد سیاهه}} درون ریزی شد.',
'importfailed' => 'درون‌ریزی صÙحه‌ها شکست خورد: $1',
'importunknownsource' => 'نوع مأخذ درون‌ریزی معلوم نیست',
'importcantopen' => 'پروندهٔ درون‌ریزی صÙحه‌ها باز نشد',
@@ -2868,6 +2985,8 @@ $1',
'tooltip-upload' => 'شروع بارگذاری',
'tooltip-rollback' => '«واگردانی» ویرایش(های) آخرین ویرایش‌کننده در این صÙحه را با یک کلیک باز می‌گرداند.',
'tooltip-undo' => '«خنثی‌سازی» این ویرایش را خنثی می‌کند Ùˆ Ùرم ویرایش را در حالت پیش‌نمایش باز می‌کند تا امکان اÙزودن دلیلی در خلاصه ویرایش را بدهد.',
+'tooltip-preferences-save' => 'ذخیره کردن ترجیحات',
+'tooltip-summary' => 'خلاصه‌ای وارد کنید',
# Stylesheets
'common.css' => '/* دستورات این بخش همهٔ کاربران را تحت تاثیر قرار می‌دهند. */',
@@ -2891,10 +3010,10 @@ $1',
'nocredits' => 'اطلاعات سازندگان این صÙحه موجود نیست.',
# Spam protection
-'spamprotectiontitle' => 'پالایه هرزنگاری‌ها',
+'spamprotectiontitle' => 'پالایهٔ هرزنگاری‌ها',
'spamprotectiontext' => 'از ذخیره کردن صÙحه توسط صاÙÛŒ هرزنگاری‌ها جلوگیری شد.
معمولاً این اتÙاق زمانی می‌اÙتد Ú©Ù‡ متن جدید صÙحه، حاوی پیوندی به یک نشانی وب خارجی باشد.',
-'spamprotectionmatch' => 'متن زیر چیزی‌است که پالایه هرزه‌نگاری ما را به کارانداخت: $1',
+'spamprotectionmatch' => 'متن زیر چیزی‌است که پالایهٔ هرزه‌نگاری ما را به کارانداخت: $1',
'spambot_username' => 'هرزه‌تمیزکار٠مدیاویکی',
'spam_reverting' => 'واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.',
'spam_blanking' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال خالی کردن',
@@ -2953,7 +3072,7 @@ $1',
'patrol-log-header' => 'این سیاهه‌ای از ویرایش‌های گشت‌خورده است.',
'patrol-log-line' => 'به $1 از $2 برچسب گشت زد $3',
'patrol-log-auto' => '(خودکار)',
-'patrol-log-diff' => 'نسخه $1',
+'patrol-log-diff' => 'نسخهٔ $1',
'log-show-hide-patrol' => 'سیاههٔ گشت‌زنی $1',
# Image deletion
@@ -2979,13 +3098,16 @@ $1',
'widthheight' => '$1 در $2',
'widthheightpage' => '$1×$2ØŒ $3 {{PLURAL:$3|صÙحه|صÙحه}}',
'file-info' => 'اندازهٔ پرونده: $1، نوع MIME $2',
-'file-info-size' => '(<span dir=ltr>$1 X $2</span> پیکسل، اندازهٔ پرونده: $3، نوع MIME پرونده: $4)',
+'file-info-size' => '<span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3، نوع MIME پرونده: $4',
'file-nohires' => '<small>تÙکیک‌پذیری بالاتری در دسترس نیست.</small>',
-'svg-long-desc' => '(پرونده SVG، با ابعاد $1 × $2 پیکسل، اندازه پرونده: $3)',
+'svg-long-desc' => 'پروندهٔ اس‌وی‌جی، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
'show-big-image' => 'تصویر با تÙکیک‌پذیری بالاتر',
'show-big-image-thumb' => '<small>اندازهٔ این پیش‌نمایش: <span dir="ltr">$1 × $2</span> پیکسل</small>',
'file-info-gif-looped' => 'حلقه‌ای',
'file-info-gif-frames' => '$1 {{PLURAL:$1|قاب|قاب}}',
+'file-info-png-looped' => 'حلقه‌ای',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|بار|بار}} پخش شد',
+'file-info-png-frames' => '$1 {{PLURAL:$1|قاب|قاب}}',
# Special:NewFiles
'newimages' => 'نگارخانهٔ پرونده‌های جدید',
@@ -3139,6 +3261,7 @@ $1',
'exif-gpsareainformation' => 'نام ناحیهٔ جی‌پی‌اس',
'exif-gpsdatestamp' => 'تاریخ جی‌پی‌اس',
'exif-gpsdifferential' => 'تصحیح جزئی جی‌پی‌اس',
+'exif-objectname' => 'عنوان کوتاه',
# EXIF attributes
'exif-compression-1' => 'غیرÙشرده',
@@ -3301,27 +3424,27 @@ $1',
'limitall' => 'همه',
# E-mail address confirmation
-'confirmemail' => 'تأیید نشانی پست الکترونیکی',
-'confirmemail_noemail' => 'شما در صÙحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی پست الکترونیکی معتبری وارد نکرده‌اید.',
-'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار پست الکترونیکی خود، پیش از استÙاده از خدمات پست الکترونیکی در اینجا می‌کند. دکمهٔ زیرین را Ùعال کنید تا نامهٔ تأییدی به نشانی پست الکترونیکی شما Ùرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود Ú©Ù‡ حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی پست الکترونیکی شما مسجل شود.',
-'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت الکترونیکی Ùرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد Ú©Ù‡ پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
-'confirmemail_send' => 'Ù¾Ùست‌کردن یک کد تأیید',
-'confirmemail_sent' => 'نامهٔ الکترونیکی تأییدی Ùرستاده شد.',
-'confirmemail_oncreate' => 'یک کد تأییدی به نشانی پست الکترونیکی شما Ùرستاده شد.
+'confirmemail' => 'تأیید نشانی پست الکترونیکی',
+'confirmemail_noemail' => 'شما در صÙحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی پست الکترونیکی معتبری وارد نکرده‌اید.',
+'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار پست الکترونیکی خود، پیش از استÙاده از خدمات پست الکترونیکی در اینجا می‌کند. دکمهٔ زیرین را Ùعال کنید تا نامهٔ تأییدی به نشانی پست الکترونیکی شما Ùرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود Ú©Ù‡ حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی پست الکترونیکی شما مسجل شود.',
+'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت الکترونیکی Ùرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد Ú©Ù‡ پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
+'confirmemail_send' => 'Ù¾Ùست‌کردن یک کد تأیید',
+'confirmemail_sent' => 'نامهٔ الکترونیکی تأییدی Ùرستاده شد.',
+'confirmemail_oncreate' => 'یک کد تأییدی به نشانی پست الکترونیکی شما Ùرستاده شد.
برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راه‌اندازی امکانات وابسته به پست الکترونیکی در این ویکی به آن نیاز خواهید داشت.',
-'confirmemail_sendfailed' => 'Ùرستادن پست الکترونیکی تأییدی ممکن نشد.
+'confirmemail_sendfailed' => 'Ùرستادن پست الکترونیکی تأییدی ممکن نشد.
نشانی پست الکترونیکی را از نظر وجود نویسه‌های نامعتبر بررسی کنید.
پاسخ سامانه ارسال پست الکترونیکی: $1',
-'confirmemail_invalid' => 'کد تأیید نامعتبر است. ممکن است که منقضی شده باشد.',
-'confirmemail_needlogin' => 'برای تأیید نشانی پست الکترونیکی‌تان نیاز به $1 دارید.',
-'confirmemail_success' => 'نشانی پست الکترونیکی شما تأیید شده‌است.
+'confirmemail_invalid' => 'کد تأیید نامعتبر است. ممکن است که منقضی شده باشد.',
+'confirmemail_needlogin' => 'برای تأیید نشانی پست الکترونیکی‌تان نیاز به $1 دارید.',
+'confirmemail_success' => 'نشانی پست الکترونیکی شما تأیید شده‌است.
اینک می‌توانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
-'confirmemail_loggedin' => 'نشانی پست الکترونیکی شما تأیید شد.',
-'confirmemail_error' => 'هنگام ذخیرهٔ تأیید شما به مشکلی برخورده شد.',
-'confirmemail_subject' => 'تأیید نشانی پست الکترونیکی شما {{SITENAME}}',
-'confirmemail_body' => 'یک Ù†Ùر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» Ùˆ این نشانی پست الکترونیکی در {{SITENAME}} ایجاد کرده‌است.
+'confirmemail_loggedin' => 'نشانی پست الکترونیکی شما تأیید شد.',
+'confirmemail_error' => 'هنگام ذخیرهٔ تأیید شما به مشکلی برخورده شد.',
+'confirmemail_subject' => 'تأیید نشانی پست الکترونیکی شما {{SITENAME}}',
+'confirmemail_body' => 'یک Ù†Ùر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» Ùˆ این نشانی پست الکترونیکی در {{SITENAME}} ایجاد کرده‌است.
برای تأیید این Ú©Ù‡ این حساب واقعاً متعلق به شماست Ùˆ نیز برای Ùعال‌سازی امکانات پست الکترونیک {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
@@ -3334,8 +3457,30 @@ $5
این کد٠تأیید در تاریخ $4 منقضی خواهد شد.
</div>',
-'confirmemail_invalidated' => 'تأیید نشانی پست الکترونیکی لغو شد',
-'invalidateemail' => 'لغو کردن تأیید نشانی پست الکترونیکی',
+'confirmemail_body_changed' => 'یک Ù†Ùر، احتمالأ خود شما، از نشانی آی‌پی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را تغییر داده‌است.
+
+برای تأیید این Ú©Ù‡ این حساب واقعاً به شما تعلق دارد Ùˆ Ùعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}ØŒ پیوند زیر را در مرورگرتان باز کنید:
+
+$3
+
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+
+$5
+
+این تأییدیه در $4 منقضی می‌گردد.',
+'confirmemail_body_set' => 'یک Ù†Ùر، احتمالأ خود شما، از نشانی آی‌پی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
+
+برای تأیید این Ú©Ù‡ این حساب واقعاً به شما تعلق دارد Ùˆ Ùعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}ØŒ پیوند زیر را در مرورگرتان باز کنید:
+
+$3
+
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+
+$5
+
+این تأییدیه در $4 منقضی می‌گردد.',
+'confirmemail_invalidated' => 'تأیید نشانی پست الکترونیکی لغو شد',
+'invalidateemail' => 'لغو کردن تأیید نشانی پست الکترونیکی',
# Scary transclusion
'scarytranscludedisabled' => '[تراگنجانش بین‌ویکیانه Ùعال نیست]',
@@ -3379,6 +3524,7 @@ $1',
'table_pager_first' => 'صÙحهٔ نخست',
'table_pager_last' => 'صÙحهٔ آخر',
'table_pager_limit' => 'نمایش $1 مورد در هر صÙحه',
+'table_pager_limit_label' => 'تعداد موارد در هر صÙحه:',
'table_pager_limit_submit' => 'برو',
'table_pager_empty' => 'هیچ نتیجه',
@@ -3498,6 +3644,7 @@ $1',
'version-specialpages' => 'صÙحه‌های ویژه',
'version-parserhooks' => 'قلاب‌های تجزیه‌گر',
'version-variables' => 'متغیرها',
+'version-skins' => 'پوسته‌ها',
'version-other' => 'غیره',
'version-mediahandlers' => 'به‌دست‌گیرنده‌های رسانه‌ها',
'version-hooks' => 'قلاب‌ها',
@@ -3510,6 +3657,13 @@ $1',
'version-version' => '(نسخه $1)',
'version-svn-revision' => '(&رلم;r$2)',
'version-license' => 'اجازه‌نامه',
+'version-poweredby-credits' => "این ویکی توسط '''[http://www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محÙوظ است © 2001-$1 $2.",
+'version-poweredby-others' => 'دیگران',
+'version-license-info' => 'مدیاویکی یک نرم‌اÙزار رایگان است؛ Ú©Ù‡ شما می‌توانید آن را تحت گنو ال‌جی‌پی‌ال Ú©Ù‡ توسط بنیاد نرم‌اÙزارهای رایگان منتشر شده‌است، باز نشر کنید؛ یا نسخهٔ Û² از این محوز، یا (بنا به اختیار) نسخه‌های بعدی.
+
+مدیاویکی منتشر شده‌است به امید اینکه Ù…Ùید واقع شود، بدون هیچ گونه ضمانتی»؛ بدون ضمانت ضمنی Ú©Ù‡ تجاری یا برای یک کار خاصی مناسب باشد. برای اطلاعات بیشتر مجوز گنو جی‌پی‌ال را مشاهده کنید.
+
+شما می‌بایست یک [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] را همراه این برنامه دریاÙت کرده باشید؛ اگر نه، بنویسید برای شرکت بنیاد نرم‌اÙزارهای رایگان، 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html به صورت بر خط بخوانید].',
'version-software' => 'نسخهٔ نصب‌شده',
'version-software-product' => 'محصول',
'version-software-version' => 'نسخه',
@@ -3578,6 +3732,15 @@ $1',
'tags-edit' => 'ویرایش',
'tags-hitcount' => '$1 {{PLURAL:$1|تغییر|تغییر}}',
+# Special:ComparePages
+'comparepages' => 'مقایسه صÙحه‌ها',
+'compare-selector' => 'مقایسه نسخه‌های صÙحه‌ها',
+'compare-page1' => 'صÙحه Û±',
+'compare-page2' => 'صÙحه Û²',
+'compare-rev1' => 'نسخه ۱',
+'compare-rev2' => 'نسخه ۲',
+'compare-submit' => 'مقایسه',
+
# Database error messages
'dberr-header' => 'این ویکی یک ایراد دارد',
'dberr-problems' => 'شرمنده!
@@ -3595,8 +3758,13 @@ $1',
'htmlform-float-invalid' => 'مقداری که وارد کردید یک عدد نیست.',
'htmlform-int-toolow' => 'مقداری که وارد کردید کمتر از $1 است',
'htmlform-int-toohigh' => 'مقداری که وارد کردید بیشتر از $1 است',
+'htmlform-required' => 'این مقدار مورد نیاز است',
'htmlform-submit' => 'ارسال',
'htmlform-reset' => 'خنثی کردن تغییرات',
'htmlform-selectorother-other' => 'دیگر',
+# SQLite database support
+'sqlite-has-fts' => '$1 با پشتیبانی از جستجو در متن کامل',
+'sqlite-no-fts' => '$1 بدون پشتیبانی از جستجو در متن کامل',
+
);
diff --git a/languages/messages/MessagesFf.php b/languages/messages/MessagesFf.php
index 7ad0888d..e7b5cf23 100644
--- a/languages/messages/MessagesFf.php
+++ b/languages/messages/MessagesFf.php
@@ -10,7 +10,7 @@
* @author Amkoullel
*/
-$fallback='fr';
+$fallback = 'fr';
$messages = array(
'mytalk' => 'kaldigal am',
diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php
index 3d450299..53953584 100644
--- a/languages/messages/MessagesFi.php
+++ b/languages/messages/MessagesFi.php
@@ -27,7 +27,7 @@
* @author לערי ריינה×רט
*/
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$namespaceNames = array(
NS_MEDIA => 'Media',
@@ -161,6 +161,7 @@ $magicWords = array(
'img_top' => array( '1', 'ylös', 'ylhäällä', 'top' ),
'img_middle' => array( '1', 'keskellä', 'middle' ),
'img_bottom' => array( '1', 'alas', 'alhaalla', 'bottom' ),
+ 'img_link' => array( '1', 'linkki=$1', 'link=$1' ),
'sitename' => array( '1', 'SIVUSTONIMI', 'SITENAME' ),
'ns' => array( '0', 'NA:', 'NS:' ),
'localurl' => array( '0', 'PAIKALLINENOSOITE:', 'LOCALURL:' ),
@@ -190,7 +191,7 @@ $magicWords = array(
'language' => array( '0', '#KIELI:', '#LANGUAGE:' ),
'numberofadmins' => array( '1', 'YLLÄPITÄJÄMÄÄRÄ', 'NUMBEROFADMINS' ),
'formatnum' => array( '0', 'MUOTOILELUKU', 'FORMATNUM' ),
- 'defaultsort' => array( '1', 'OLETUSAAKKOSTUS', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'defaultsort' => array( '1', 'AAKKOSTUS:', 'OLETUSAAKKOSTUS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'TIEDOSTOPOLKU:', 'FILEPATH:' ),
'hiddencat' => array( '1', '__PIILOLUOKKA__', '__HIDDENCAT__' ),
'pagesize' => array( '1', 'SIVUKOKO', 'PAGESIZE' ),
@@ -243,6 +244,7 @@ $specialPageAliases = array(
'Allpages' => array( 'Kaikki_sivut' ),
'Prefixindex' => array( 'Etuliiteluettelo' ),
'Ipblocklist' => array( 'Muokkausestot' ),
+ 'Unblock' => array( 'Poista_esto' ),
'Specialpages' => array( 'Toimintosivut' ),
'Contributions' => array( 'Muokkaukset' ),
'Emailuser' => array( 'Lähetä_sähköpostia' ),
@@ -287,6 +289,8 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Poistetut_muokkaukset' ),
'Tags' => array( 'Merkinnät' ),
'Activeusers' => array( 'Aktiiviset_käyttäjät' ),
+ 'ComparePages' => array( 'Vertaa_sivuja' ),
+ 'Badtitle' => array( 'Kelpaamaton_otsikko' ),
);
$linkTrail = '/^([a-zäö]+)(.*)$/sDu';
@@ -307,8 +311,7 @@ $messages = array(
'tog-editsection' => 'Näytä muokkauslinkit jokaisen osion yläpuolella',
'tog-editsectiononrightclick' => 'Muokkaa osioita napsauttamalla otsikkoa hiiren oikealla painikkeella (JavaScript)',
'tog-showtoc' => 'Näytä sisällysluettelo sivuille, joilla yli 3 otsikkoa',
-'tog-rememberpassword' => 'Muista kirjautuminen eri istuntojen välillä',
-'tog-editwidth' => 'Laajenna muokkauskenttä sivun levyiseksi',
+'tog-rememberpassword' => 'Muista kirjautumisen tässä selaimessa (enintään $1 {{PLURAL:$1|päivä|päivää}})',
'tog-watchcreations' => 'Lisää luomani sivut tarkkailulistalle',
'tog-watchdefault' => 'Lisää muokkaamani sivut tarkkailulistalle',
'tog-watchmoves' => 'Lisää siirtämäni sivut tarkkailulistalle',
@@ -464,31 +467,21 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'faqpage' => 'Project:Usein kysytyt kysymykset',
# Vector skin
-'vector-action-addsection' => 'Lisää aihe',
-'vector-action-delete' => 'Poista',
-'vector-action-move' => 'Siirrä',
-'vector-action-protect' => 'Suojaa',
-'vector-action-undelete' => 'Palauta',
-'vector-action-unprotect' => 'Muuta suojausta',
-'vector-namespace-category' => 'Luokka',
-'vector-namespace-help' => 'Ohjesivu',
-'vector-namespace-image' => 'Tiedosto',
-'vector-namespace-main' => 'Sivu',
-'vector-namespace-media' => 'Mediasivu',
-'vector-namespace-mediawiki' => 'Järjestelmäviesti',
-'vector-namespace-project' => 'Projektisivu',
-'vector-namespace-special' => 'Toimintosivu',
-'vector-namespace-talk' => 'Keskustelu',
-'vector-namespace-template' => 'Malline',
-'vector-namespace-user' => 'Käyttäjäsivu',
-'vector-view-create' => 'Luo',
-'vector-view-edit' => 'Muokkaa',
-'vector-view-history' => 'Näytä historia',
-'vector-view-view' => 'Lue',
-'vector-view-viewsource' => 'Näytä lähdekoodi',
-'actions' => 'Toiminnot',
-'namespaces' => 'Nimiavaruudet',
-'variants' => 'Muuttujat',
+'vector-action-addsection' => 'Lisää aihe',
+'vector-action-delete' => 'Poista',
+'vector-action-move' => 'Siirrä',
+'vector-action-protect' => 'Suojaa',
+'vector-action-undelete' => 'Palauta',
+'vector-action-unprotect' => 'Muuta suojausta',
+'vector-simplesearch-preference' => 'Ota käyttöön parannetut hakuehdotukset (vain Vector-ulkoasu)',
+'vector-view-create' => 'Luo',
+'vector-view-edit' => 'Muokkaa',
+'vector-view-history' => 'Näytä historia',
+'vector-view-view' => 'Lue',
+'vector-view-viewsource' => 'Näytä lähdekoodi',
+'actions' => 'Toiminnot',
+'namespaces' => 'Nimiavaruudet',
+'variants' => 'Muuttujat',
'errorpagetitle' => 'Virhe',
'returnto' => 'Palaa sivulle $1.',
@@ -549,6 +542,9 @@ Liian monta käyttäjää yrittää tarkastella tätä sivua.
Odota hetki ennen kuin yrität uudelleen.
$1',
+'pool-timeout' => 'Lukon aikakatkaisu.',
+'pool-queuefull' => 'Lukkojono on täysi.',
+'pool-errorunknown' => 'Tuntematon virhe.',
# 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' => 'Tietoja {{GRAMMAR:elative|{{SITENAME}}}}',
@@ -707,7 +703,8 @@ Käyttäjätunnuksesi on luotu.
'yourname' => 'Käyttäjätunnus',
'yourpassword' => 'Salasana',
'yourpasswordagain' => 'Salasana uudelleen',
-'remembermypassword' => 'Muista minut',
+'remembermypassword' => 'Muista minut (enintään $1 {{PLURAL:$1|päivä|päivää}})',
+'securelogin-stick-https' => 'Jatka salatun yhteyden käyttämistä sisäänkirjautumisen jälkeen',
'yourdomainname' => 'Verkkonimi',
'externaldberror' => 'Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.',
'login' => 'Kirjaudu sisään',
@@ -724,6 +721,7 @@ Käyttäjätunnuksesi on luotu.
'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
'gotaccountlink' => 'kirjautua sisään',
'createaccountmail' => 'sähköpostitse',
+'createaccountreason' => 'Syy',
'badretype' => 'Syöttämäsi salasanat ovat erilaiset.',
'userexists' => 'Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.',
'loginerror' => 'Sisäänkirjautumisvirhe',
@@ -741,6 +739,7 @@ Käyttäjätunnuksesi on luotu.
'wrongpasswordempty' => 'Et voi antaa tyhjää salasanaa.',
'passwordtooshort' => 'Salasanan täytyy olla vähintään {{PLURAL:$1|yhden merkin pituinen|$1 merkkiä pitkä}}.',
'password-name-match' => 'Salasanasi täytyy olla eri kuin käyttäjätunnuksesi.',
+'password-login-forbidden' => 'Tämän käyttäjänimen ja salasanan käyttö on estetty.',
'mailmypassword' => 'Lähetä uusi salasana sähköpostitse',
'passwordremindertitle' => 'Salasanamuistutus {{GRAMMAR:elative|{{SITENAME}}}}',
'passwordremindertext' => 'Joku IP-osoitteesta $1 pyysi {{GRAMMAR:partitive|{{SITENAME}}}} ($4) lähettämään uuden salasanan. Väliaikainen salasana käyttäjälle $2 on nyt $3. Kirjaudu sisään ja vaihda salasana. Väliaikainen salasana vanhenee {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.
@@ -773,6 +772,9 @@ Odota ennen kuin yrität uudelleen.',
'loginlanguagelabel' => 'Kieli: $1',
'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.',
+# E-mail sending
+'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
+
# Password reset dialog
'resetpass' => 'Muuta salasana',
'resetpass_announce' => 'Kirjauduit sisään sähköpostitse lähetetyllä väliaikaissalasanalla. Päätä sisäänkirjautuminen asettamalla uusi salasana.',
@@ -825,9 +827,10 @@ Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikai
'showdiff' => 'Näytä muutokset',
'anoneditwarning' => "'''Varoitus:''' Et ole kirjautunut sisään.
IP-osoitteesi kirjataan tämän sivun muutoshistoriaan.",
+'anonpreviewwarning' => "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
'missingsummary' => 'Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.',
'missingcommenttext' => 'Kirjoita viesti alle.',
-'missingcommentheader' => 'Et ole antanut otsikkoa kommentillesi. Valitse <em>Tallenna</em>, jos et halua antaa otsikkoa.',
+'missingcommentheader' => 'Et ole antanut otsikkoa kommentillesi. Napsauta â€{{int:savearticle}}â€, jos et halua antaa otsikkoa.',
'summary-preview' => 'Yhteenvedon esikatselu:',
'subject-preview' => 'Otsikon esikatselu:',
'blockedtitle' => 'Pääsy estetty',
@@ -900,7 +903,11 @@ Alla on viimeisin estolokin tapahtuma:',
'userjsyoucanpreview' => 'Voit testata uutta JavaScriptiä ennen tallennusta käyttämällä painiketta â€{{int:showpreview}}â€.',
'usercsspreview' => "'''Tämä on CSS:n esikatselu. Muutoksia ei ole vielä tallennettu.'''",
'userjspreview' => "'''Tämä on JavaScriptin esikatselu.'''",
-'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/monobook.css eikä {{ns:user}}:Matti Meikäläinen/Monobook.css.",
+'sitecsspreview' => "'''Huomaa, että tämä on vasta CSS:n esikatselu.'''
+'''Muutoksia ei ole vielä tallennettu.'''",
+'sitejspreview' => "'''Huomaa, että tämä on vasta JavaScript-koodin esikatselu.'''
+'''Muutoksia ei ole vielä tallennettu.'''",
+'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!'''",
@@ -928,7 +935,6 @@ 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Ä!'''",
-'longpagewarning' => '<center>Tämän sivun tekstiosuus on $1 binäärikilotavua pitkä. Harkitse, voisiko sivun jakaa pienempiin osiin.</center>',
'longpageerror' => "'''Sivun koko on $1 binäärikilotavua. Sivua ei voida tallentaa, koska enimmäiskoko on $2 binäärikilotavua.'''",
'readonlywarning' => "'''Varoitus: Tietokanta on lukittu huoltoa varten, joten voi olla ettet pysty tallentamaan muokkauksiasi juuri nyt.''' Saattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.
@@ -1098,6 +1104,8 @@ $1",
'logdelete-failure' => "'''Lokin näkyvyyttä ei voitu asettaa:'''
$1",
'revdel-restore' => 'Muuta näkyvyyttä',
+'revdel-restore-deleted' => 'poistetut muutokset',
+'revdel-restore-visible' => 'näkyvät muutokset',
'pagehist' => 'Sivun muutoshistoria',
'deletedhist' => 'Poistettujen versioiden historia',
'revdelete-content' => 'sisällön',
@@ -1162,11 +1170,13 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
# Diffs
'history-title' => 'Sivun $1 muutoshistoria',
'difference' => 'Versioiden väliset erot',
+'difference-multipage' => '(Sivujen välinen eroavaisuus)',
'lineno' => 'Rivi $1:',
'compareselectedversions' => 'Vertaile valittuja versioita',
'showhideselectedversions' => 'Näytä tai piilota valitut versiot',
'editundo' => 'kumoa',
-'diff-multi' => '(Versioiden välissä {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta}}.)',
+'diff-multi' => '(Näytettyjen versioiden välissä on {{PLURAL:$1|yksi muokkaus|$1 versiota, jotka ovat {{PLURAL:$2|yhden käyttäjän tekemiä|$2 eri käyttäjän tekemiä}}}}.)',
+'diff-multi-manyusers' => '(Versioiden välissä on {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta, jotka on tehnyt {{PLURAL:$2|yksi käyttäjä|yli $2 eri käyttäjää}}}}.)',
# Search results
'searchresults' => 'Hakutulokset',
@@ -1203,6 +1213,7 @@ $1 {{int:pipe-separator}} $2',
'searchprofile-everything-tooltip' => 'Etsi kaikkialta (myös keskustelusivut)',
'searchprofile-advanced-tooltip' => 'Etsi määritellyistä nimiavaruuksista',
'search-result-size' => '$1 ({{PLURAL:$2|1 sana|$2 sanaa}})',
+'search-result-category-size' => '{{PLURAL:$1|1 jäsen|$1 jäsentä}} ({{PLURAL:$2|1 alaluokka|$2 alaluokkaa}}, {{PLURAL:$3|1 tiedosto|$3 tiedostoa}})',
'search-result-score' => 'Asiaankuuluvuus: $1%',
'search-redirect' => '(ohjaus $1)',
'search-section' => '(osio $1)',
@@ -1278,6 +1289,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
'contextlines' => 'Rivien määrä tulosta kohti',
'contextchars' => 'Sisällön merkkien määrä riviä kohden',
'stub-threshold' => '<a href="#" class="stub">Tynkäsivun</a> osoituskynnys',
+'stub-threshold-disabled' => 'Ei käytössä',
'recentchangesdays' => 'Näytettävien päivien määrä tuoreissa muutoksissa',
'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena',
@@ -1311,6 +1323,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'prefs-files' => 'Tiedostot',
'prefs-custom-css' => 'Käyttäjäkohtainen CSS-tyylisivu',
'prefs-custom-js' => 'Käyttäjäkohtainen JavaScript-sivu',
+'prefs-common-css-js' => 'Yhteiset CSS- ja JavaScript-sivut kaikille ulkoasuille',
'prefs-reset-intro' => 'Voit käyttää tätä sivua palauttaaksesi kaikki asetuksesi sivuston oletusasetuksiin. Tätä ei voi kumota.',
'prefs-emailconfirm-label' => 'Sähköpostin varmistus',
'prefs-textboxsize' => 'Muokkauskentän koko',
@@ -1345,9 +1358,15 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'prefs-advancedrendering' => 'Lisäasetukset',
'prefs-advancedsearchoptions' => 'Lisäasetukset',
'prefs-advancedwatchlist' => 'Lisäasetukset',
-'prefs-display' => 'Perusasetukset',
+'prefs-displayrc' => 'Perusasetukset',
+'prefs-displaysearchoptions' => 'Näyttöasetukset',
+'prefs-displaywatchlist' => 'Näyttöasetukset',
'prefs-diffs' => 'Erot',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Sähköpostiosoite vaikuttaa kelvolliselta',
+'email-address-validity-invalid' => 'Virheellinen sähköpostiosoite',
+
# User rights
'userrights' => 'Käyttöoikeuksien hallinta',
'userrights-lookup-user' => 'Käyttöoikeuksien hallinta',
@@ -1431,6 +1450,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'right-hideuser' => 'Estää käyttäjätunnus ja piilottaa se näkyvistä',
'right-ipblock-exempt' => 'Ohittaa IP-, automaattiset ja osoitealue-estot',
'right-proxyunbannable' => 'Ohittaa automaattiset välityspalvelinestot',
+'right-unblockself' => 'Poistaa esto itseltään',
'right-protect' => 'Muuttaa sivujen suojauksia ja muokata suojattuja sivuja',
'right-editprotected' => 'Muokata suojattuja sivuja (pois lukien laajennettu sisällytyssuojaus)',
'right-editinterface' => 'Muokata käyttöliittymätekstejä',
@@ -1453,7 +1473,6 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'right-siteadmin' => 'Lukita tietokanta',
'right-reset-passwords' => 'Alustaa muiden käyttäjien salasanoja',
'right-override-export-depth' => 'Viedä sivuja sisältäen viitatut sivut viiden syvyydellä',
-'right-versiondetail' => 'Nähdä laajennetut tiedot ohjelmistoversiosta',
'right-sendemail' => 'Lähettää sähköpostia muille käyttäjille',
# User rights log
@@ -1504,14 +1523,9 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'recentchanges-legend' => 'Tuoreiden muutosten asetukset',
'recentchangestext' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
'recentchanges-feed-description' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
-'recentchanges-label-legend' => 'Merkkien selitykset: $1',
-'recentchanges-legend-newpage' => '$1 – uusi sivu',
'recentchanges-label-newpage' => 'Tämä muutos loi uuden sivun',
-'recentchanges-legend-minor' => '$1 – pieni muutos',
'recentchanges-label-minor' => 'Tämä on pieni muutos',
-'recentchanges-legend-bot' => '$1 – botin muutos',
'recentchanges-label-bot' => 'Tämän muutoksen suoritti botti',
-'recentchanges-legend-unpatrolled' => '$1 – tarkastamaton muutos',
'recentchanges-label-unpatrolled' => 'Tätä muutosta ei ole vielä tarkastettu',
'rcnote' => 'Alla on {{PLURAL:$1|yksi muutos|$1 tuoreinta muutosta}} {{PLURAL:$2|yhden päivän|$2 viime päivän}} ajalta $4 kello $5 asti.',
'rcnotefrom' => 'Alla on muutokset <b>$2</b> lähtien. Enintään <b>$1</b> merkintää näytetään.',
@@ -1557,6 +1571,9 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'upload_directory_missing' => 'Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.',
'upload_directory_read_only' => 'Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon â€<tt>$1</tt>â€.',
'uploaderror' => 'Tallennusvirhe',
+'upload-recreate-warning' => "'''Varoitus: Tiedosto tällä nimellä on poistettu tai siirretty.'''
+
+Poisto- ja siirtoloki tälle sivulle näkyy alla:",
'uploadtext' => "Voit tallentaa tiedostoja alla olevalla lomakkeella. [[Special:FileList|Tiedostoluettelo]] sisältää listan tallennetuista tiedostoista. Tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]], ja poistot [[Special:Log/delete|poistolokiin]].
Voit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:
@@ -1587,6 +1604,17 @@ Voit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:
'filetype-unwanted-type' => "'''.$1''' ei ole toivottu tiedostomuoto. {{PLURAL:$3|Suositeltu tiedostomuoto on|Suositeltuja tiedostomuotoja ovat}} $2.",
'filetype-banned-type' => "'''.$1''' ei ole sallittu tiedostomuoto. {{PLURAL:$3|Sallittu tiedostomuoto on|Sallittuja tiedostomuotoja ovat}} $2.",
'filetype-missing' => 'Tiedostolta puuttuu tiedostopääte – esimerkiksi <tt>.jpg</tt>.',
+'empty-file' => 'Lähettämäsi tiedosto oli tyhjä.',
+'file-too-large' => 'Lähettämäsi tiedosto oli liian suuri.',
+'filename-tooshort' => 'Tiedostonimi on liian lyhyt.',
+'filetype-banned' => 'Tämä tiedostomuoto on estetty.',
+'verification-error' => 'Tämä tiedosto ei läpäissyt tiedoston tarkistusta.',
+'hookaborted' => 'Laajennuksen kytköspiste keskeytti muutoksen, jota yritit tehdä.',
+'illegal-filename' => 'Tiedostonimi ei ole sallittu.',
+'overwrite' => 'Olemassa olevan tiedoston korvaaminen ei ole sallittu.',
+'unknown-error' => 'Tapahtui tuntematon virhe.',
+'tmp-create-error' => 'Väliaikaistiedostoa ei voitu luoda.',
+'tmp-write-error' => 'Virhe kirjoitettaessa väliaikaistiedostoon.',
'large-file' => 'Tiedostojen enimmäiskoko on $1. Lähettämäsi tiedoston koko on $2.',
'largefileserver' => 'Tämä tiedosto on suurempi kuin mitä palvelin sallii.',
'emptyfile' => 'Tiedosto, jota yritit lähettää, näyttää olevan tyhjä. Tarkista, että kirjoitit polun ja nimen oikein ja että se ei ole liian suuri kohdepalvelimelle.',
@@ -1610,13 +1638,14 @@ Jos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapaukses
'fileexists-shared-forbidden' => 'Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:',
'file-deleted-duplicate' => 'Tiedosto, joka on identtinen tämän tiedoston kanssa ([[:$1]]) on aiemmin poistettu. Katso kyseisen tiedoston poistoloki ennen kuin jatkat uudelleentallentamista.',
-'successfulupload' => 'Tallennus onnistui',
'uploadwarning' => 'Tallennusvaroitus',
'uploadwarning-text' => 'Muuta alla olevaa tiedostokuvausta ja yritä uudelleen.',
'savefile' => 'Tallenna',
'uploadedimage' => 'tallensi tiedoston [[$1]]',
'overwroteimage' => 'tallensi uuden version [[$1]]',
'uploaddisabled' => 'Tiedostojen tallennus ei ole käytössä.',
+'copyuploaddisabled' => 'Tallennus URL:n kautta on poistettu käytöstä.',
+'uploadfromurl-queued' => 'Tallennuksesi on siirretty jonoon.',
'uploaddisabledtext' => 'Tiedostojen tallennus on poistettu käytöstä.',
'php-uploaddisabledtext' => 'PHP:n tiedostojen lähetys ei ole käytössä. Tarkista asetukset kohdasta file_uploads.',
'uploadscripted' => 'Tämä tiedosto sisältää HTML-koodia tai skriptejä, jotka selain saattaa virheellisesti suorittaa.',
@@ -1634,6 +1663,14 @@ Jos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapaukses
Harkitse, haluatko jatkaa tämän tiedoston tallentamista. Tiedoston poistoloki näkyy tässä:",
'filename-bad-prefix' => "Tallentamasi tiedoston nimi alkaa merkkijonolla '''$1''', joka on yleensä digitaalikameroiden automaattisesti antama nimi, joka ei kuvaa tiedoston sisältöä. Anna tiedostolle kuvaavampi nimi.",
+'upload-success-subj' => 'Tallennus onnistui',
+'upload-success-msg' => 'Tallennuksesi [$2] onnistui. Tiedosto on saatavilla täällä: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Tallennusongelma',
+'upload-failure-msg' => 'Tiedoston tallentaminen osoitteesta [$2] ei onnistunut:
+
+$1',
+'upload-warning-subj' => 'Tallennusvaroitus',
+'upload-warning-msg' => 'Tiedoston tallennuksessasi oli ongelmia [$2]. Voit palata [[Special:Upload/stash/$1|tallennussivulle]] ja korjata ongelman.',
'upload-proto-error' => 'Virheellinen protokolla',
'upload-proto-error-text' => 'Etälähetys on mahdollista vain osoitteista, jotka alkavat merkkijonolla <code>http://</code> tai <code>ftp://</code>.',
@@ -1691,6 +1728,7 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
'listfiles_search_for' => 'Nimihaku',
'imgfile' => 'tiedosto',
'listfiles' => 'Tiedostoluettelo',
+'listfiles_thumb' => 'Pienoiskuva',
'listfiles_date' => 'Päiväys',
'listfiles_name' => 'Nimi',
'listfiles_user' => 'Tallentaja',
@@ -1803,8 +1841,8 @@ Tiedot [$2 tiedoston kuvaussivulta] näkyvät alla.',
'statistics-edits' => 'Muokkauksia {{GRAMMAR:genitive|{{SITENAME}}}} perustamisen jälkeen',
'statistics-edits-average' => 'Keskimäärin yhtä sivua muokattu',
'statistics-views-total' => 'Sivuja katsottu yhteensä',
+'statistics-views-total-desc' => 'Näyttökertoihin eivät sisälly toimintosivut eikä sivut, joita ei ole olemassa',
'statistics-views-peredit' => 'Sivuja katsottu muokkausta kohden',
-'statistics-jobqueue' => 'Ohjelmiston suorittamia [http://www.mediawiki.org/wiki/Manual:Job_queue ylläpitotöitä jonossa]',
'statistics-users' => 'Rekisteröityneitä [[Special:ListUsers|käyttäjiä]]',
'statistics-users-active' => 'Aktiivisia käyttäjiä',
'statistics-users-active-desc' => 'Käyttäjät, jotka ovat suorittaneet jonkin toiminnon {{PLURAL:$1|edellisen päivän|edellisten $1 päivän}} aikana.',
@@ -1817,7 +1855,7 @@ Tiedot [$2 tiedoston kuvaussivulta] näkyvät alla.',
'doubleredirects' => 'Kaksinkertaiset ohjaukset',
'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteen ensimmäiseen riviin, eli yleensä â€oikeaan†kohteeseen, johon ensimmäisen ohjauksen pitäisi osoittaa.
-<s>Yliviivatut</s> kohteet on korjattu.',
+<del>Yliviivatut</del> kohteet on korjattu.',
'double-redirect-fixed-move' => '[[$1]] on siirretty, ja se ohjaa nyt sivulle [[$2]]',
'double-redirect-fixer' => 'Ohjausten korjaaja',
@@ -1840,6 +1878,8 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
'nmembers' => '$1 {{PLURAL:$1|jäsen|jäsentä}}',
'nrevisions' => '$1 {{PLURAL:$1|muutos|muutosta}}',
'nviews' => '$1 {{PLURAL:$1|lataus|latausta}}',
+'nimagelinks' => 'Käytössä $1 {{PLURAL:$1|sivulla}}',
+'ntransclusions' => 'käytössä $1 {{PLURAL:$1|sivulla}}',
'specialpage-empty' => 'Tämä sivu on tyhjä.',
'lonelypages' => 'Yksinäiset sivut',
'lonelypagestext' => 'Seuraaviin sivuihin ei ole linkkejä tai sisällytyksiä muualta wikistä.',
@@ -1998,33 +2038,39 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
'listgrouprights-removegroup-self-all' => 'Voi poistaa itsensä kaikista ryhmistä',
# E-mail user
-'mailnologin' => 'Lähettäjän osoite puuttuu',
-'mailnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
-'emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
-'emailpage' => 'Lähetä sähköpostia käyttäjälle',
-'emailpagetext' => 'Jos tämä käyttäjä on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.',
-'usermailererror' => 'Postitus palautti virheen:',
-'defemailsubject' => 'Sähköpostia sivustolta {{SITENAME}}',
-'noemailtitle' => 'Ei sähköpostiosoitetta',
-'noemailtext' => 'Tämä käyttäjä ei ole määritellyt kelvollista sähköpostiosoitetta.',
-'nowikiemailtitle' => 'Sähköpostin lähettäminen ei sallittu',
-'nowikiemailtext' => 'Tämä käyttäjä ei halua sähköpostia muilta käyttäjiltä.',
-'email-legend' => 'Sähköpostin lähetys {{GRAMMAR:genitive|{{SITENAME}}}} käyttäjälle',
-'emailfrom' => 'Lähettäjä',
-'emailto' => 'Vastaanottaja',
-'emailsubject' => 'Aihe',
-'emailmessage' => 'Viesti',
-'emailsend' => 'Lähetä',
-'emailccme' => 'Lähetä kopio viestistä minulle.',
-'emailccsubject' => 'Kopio lähettämästäsi viestistä osoitteeseen $1: $2',
-'emailsent' => 'Sähköposti lähetetty',
-'emailsenttext' => 'Sähköpostiviestisi on lähetetty.',
-'emailuserfooter' => 'Tämän sähköpostin lähetti $1 käyttäjälle $2 käyttämällä â€Lähetä sähköpostia†-toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.',
+'mailnologin' => 'Lähettäjän osoite puuttuu',
+'mailnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
+'emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
+'emailpage' => 'Lähetä sähköpostia käyttäjälle',
+'emailpagetext' => 'Jos tämä käyttäjä on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.',
+'usermailererror' => 'Postitus palautti virheen:',
+'defemailsubject' => 'Sähköpostia sivustolta {{SITENAME}}',
+'usermaildisabled' => 'Käyttäjien sähköposti poistettu käytöstä',
+'usermaildisabledtext' => 'Et voi lähettää sähköpostia muille käyttäjille tässä wikissä',
+'noemailtitle' => 'Ei sähköpostiosoitetta',
+'noemailtext' => 'Tämä käyttäjä ei ole määritellyt kelvollista sähköpostiosoitetta.',
+'nowikiemailtitle' => 'Sähköpostin lähettäminen ei sallittu',
+'nowikiemailtext' => 'Tämä käyttäjä ei halua sähköpostia muilta käyttäjiltä.',
+'email-legend' => 'Sähköpostin lähetys {{GRAMMAR:genitive|{{SITENAME}}}} käyttäjälle',
+'emailfrom' => 'Lähettäjä',
+'emailto' => 'Vastaanottaja',
+'emailsubject' => 'Aihe',
+'emailmessage' => 'Viesti',
+'emailsend' => 'Lähetä',
+'emailccme' => 'Lähetä kopio viestistä minulle.',
+'emailccsubject' => 'Kopio lähettämästäsi viestistä osoitteeseen $1: $2',
+'emailsent' => 'Sähköposti lähetetty',
+'emailsenttext' => 'Sähköpostiviestisi on lähetetty.',
+'emailuserfooter' => 'Tämän sähköpostin lähetti $1 käyttäjälle $2 käyttämällä â€Lähetä sähköpostia†-toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.',
+
+# User Messenger
+'usermessage-summary' => 'Jätetään järjestelmäviesti.',
+'usermessage-editor' => 'Järjestelmäviestittäjä',
# Watchlist
'watchlist' => 'Tarkkailulista',
'mywatchlist' => 'Tarkkailulista',
-'watchlistfor' => '$1',
+'watchlistfor2' => 'Käyttäjälle $1 $2',
'nowatchlist' => 'Tarkkailulistallasi ei ole sivuja.',
'watchlistanontext' => 'Sinun täytyy $1, jos haluat käyttää tarkkailulistaa.',
'watchnologin' => 'Et ole kirjautunut sisään',
@@ -2136,7 +2182,10 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
'revertpage' => 'Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.',
'revertpage-nouser' => 'Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.',
'rollback-success' => 'Käyttäjän â€$1†tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän $2 versioon.',
-'sessionfailure' => 'Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena istuntokaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja yritä uudelleen.',
+
+# Edit tokens
+'sessionfailure-title' => 'Istuntovirhe',
+'sessionfailure' => 'Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena istuntokaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja yritä uudelleen.',
# Protect
'protectlogpage' => 'Suojausloki',
@@ -2256,18 +2305,22 @@ $1',
'month' => 'Kuukausi',
'year' => 'Vuosi',
-'sp-contributions-newbies' => 'Näytä uusien tulokkaiden muutokset',
-'sp-contributions-newbies-sub' => 'Uusien tulokkaiden muokkaukset',
-'sp-contributions-newbies-title' => 'Uusien tulokkaiden muokkaukset',
-'sp-contributions-blocklog' => 'estot',
-'sp-contributions-deleted' => 'poistetut muokkaukset',
-'sp-contributions-logs' => 'lokit',
-'sp-contributions-talk' => 'keskustelu',
-'sp-contributions-userrights' => 'käyttöoikeuksien hallinta',
-'sp-contributions-blocked-notice' => 'Tämä käyttäjä on tällä hetkellä estetty. Alla on viimeisin estolokin tapahtuma:',
-'sp-contributions-search' => 'Etsi muokkauksia',
-'sp-contributions-username' => 'IP-osoite tai käyttäjätunnus',
-'sp-contributions-submit' => 'Hae',
+'sp-contributions-newbies' => 'Näytä uusien tulokkaiden muutokset',
+'sp-contributions-newbies-sub' => 'Uusien tulokkaiden muokkaukset',
+'sp-contributions-newbies-title' => 'Uusien tulokkaiden muokkaukset',
+'sp-contributions-blocklog' => 'estot',
+'sp-contributions-deleted' => 'poistetut muokkaukset',
+'sp-contributions-uploads' => 'tallennukset',
+'sp-contributions-logs' => 'lokit',
+'sp-contributions-talk' => 'keskustelu',
+'sp-contributions-userrights' => 'käyttöoikeuksien hallinta',
+'sp-contributions-blocked-notice' => 'Tämä käyttäjä on tällä hetkellä estetty. Alla on viimeisin estolokin tapahtuma:',
+'sp-contributions-blocked-notice-anon' => 'Tämä IP-osoite on tällä hetkellä estetty.
+Alla on viimeisin estolokin tapahtuma:',
+'sp-contributions-search' => 'Etsi muokkauksia',
+'sp-contributions-username' => 'IP-osoite tai käyttäjätunnus',
+'sp-contributions-toponly' => 'Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita',
+'sp-contributions-submit' => 'Hae',
# What links here
'whatlinkshere' => 'Tänne viittaavat sivut',
@@ -2326,7 +2379,6 @@ Nykyiset estot löytyvät [[Special:IPBlockList|estolistalta]].',
'ipb-edit-dropdown' => 'Muokkaa estosyitä',
'ipb-unblock-addr' => 'Poista käyttäjän $1 esto',
'ipb-unblock' => 'Poista käyttäjän tai IP-osoitteen muokkausesto',
-'ipb-blocklist-addr' => 'Käyttäjän $1 estot',
'ipb-blocklist' => 'Näytä estot',
'ipb-blocklist-contribs' => 'Käyttäjän $1 muokkaukset',
'unblockip' => 'Muokkauseston poisto',
@@ -2395,6 +2447,8 @@ $1 on jo estetty. Haluatko muuttaa eston asetuksia?',
'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBLin mustalla listalla. Et voi luoda käyttäjätunnusta.',
'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä ollessasi estetty.',
'cant-see-hidden-user' => 'Käyttäjä, jota yrität estää on jo estetty ja piilotettu. Koska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muokata käyttäjän estoa.',
+'ipbblocked' => 'Et voi estää tai poistaa estoja muilta käyttäjiltä, koska itse olet estettynä',
+'ipbnounblockself' => 'Et ole oikeutettu poistamaan estoa itseltäsi',
# Developer tools
'lockdb' => 'Lukitse tietokanta',
@@ -2426,6 +2480,13 @@ Huomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan s
Tämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.
Tämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
+'movepagetext-noredirectfixer' => "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.
+
+Tarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.
+
+Huomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi milloin kyseessä on tyhjä sivu tai ohjaus, jolla ei ole muokkaushistoriaa. Tämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.
+
+Tämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
'movepagetalktext' => "Sivuun mahdollisesti kytketty keskustelusivu siirretään automaattisesti, '''paitsi jos''':
*Siirrät sivua nimiavaruudesta toiseen
*Kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai
@@ -2480,6 +2541,7 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
'immobile-source-page' => 'Tämä sivu ei ole siirrettävissä.',
'immobile-target-page' => 'Kyseiselle kohdenimelle ei voi siirtää.',
'imagenocrossnamespace' => 'Tiedostoja ei voi siirtää pois tiedostonimiavaruudesta.',
+'nonfile-cannot-move-to-file' => 'Sivuja ei voi siirtää tiedostonimiavaruuteen.',
'imagetypemismatch' => 'Uusi tiedostopääte ei vastaa tiedoston tyyppiä',
'imageinvalidfilename' => 'Kohdenimi on virheellinen',
'fix-double-redirects' => 'Päivitä kaikki tänne viittaavat ohjaukset ohjaamaan uudelle nimelle',
@@ -2559,6 +2621,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'importstart' => 'Tuodaan sivuja...',
'import-revision-count' => '$1 {{PLURAL:$1|versio|versiota}}',
'importnopages' => 'Ei tuotavia sivuja.',
+'imported-log-entries' => 'Tuotu $1 {{PLURAL:$1|lokitapahtuma|lokitapahtumaa}}.',
'importfailed' => 'Tuonti epäonnistui: $1',
'importunknownsource' => 'Tuntematon lähdetyyppi',
'importcantopen' => 'Tuontitiedoston avaus epäonnistui',
@@ -2651,6 +2714,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'tooltip-upload' => 'Aloita tallennus',
'tooltip-rollback' => 'Palauttaminen kumoaa viimeisimmän muokkaajan yhden tai useamman muutoksen yhdellä kertaa.',
'tooltip-undo' => 'Kumoaminen palauttaa tämän muutoksen ja avaa artikkelin esikatselussa. Yhteenvetokenttään voi kirjoittaa palautuksen syyn.',
+'tooltip-preferences-save' => 'Tallenna asetukset',
+'tooltip-summary' => 'Kirjoita lyhyt yhteenveto',
# Stylesheets
'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
@@ -2767,13 +2832,16 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
'thumbsize' => 'Pikkukuvien koko',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|sivu|sivua}}',
'file-info' => '$1, MIME-tyyppi: $2',
-'file-info-size' => '($1×$2 px, $3, MIME-tyyppi: $4)',
+'file-info-size' => '$1×$2 px, $3, MIME-tyyppi: $4',
'file-nohires' => '<small>Tarkempaa kuvaa ei ole saatavilla.</small>',
-'svg-long-desc' => '(SVG-tiedosto; oletustarkkuus $1×$2 kuvapistettä; tiedostokoko $3)',
+'svg-long-desc' => 'SVG-tiedosto; oletustarkkuus $1×$2 kuvapistettä; tiedostokoko $3',
'show-big-image' => 'Korkeatarkkuuksinen versio',
'show-big-image-thumb' => '<small>Esikatselun koko: $1×$2 px</small>',
'file-info-gif-looped' => 'toistuva',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kehys|kehystä}}',
+'file-info-png-looped' => 'toistuva',
+'file-info-png-repeat' => 'toistettu $1 {{PLURAL:$1|kertaa|kertaa}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kehys|kehystä}}',
# Special:NewFiles
'newimages' => 'Uudet tiedostot',
@@ -2927,6 +2995,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
'exif-gpsareainformation' => 'GPS-alueen nimi',
'exif-gpsdatestamp' => 'GPS-päivämäärä',
'exif-gpsdifferential' => 'GPS-differentiaalikorjaus',
+'exif-objectname' => 'Lyhyt otsikko',
# EXIF attributes
'exif-compression-1' => 'Pakkaamaton',
@@ -3084,23 +3153,23 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
'limitall' => 'kaikki',
# E-mail address confirmation
-'confirmemail' => 'Varmenna sähköpostiosoite',
-'confirmemail_noemail' => 'Sinulla ei ole kelvollista sähköpostiosoitetta [[Special:Preferences|asetuksissasi]].',
-'confirmemail_text' => 'Tämä wiki vaatii sähköpostiosoitteen varmentamisen, ennen kuin voit käyttää sähköpostitoimintoja. Lähetä alla olevasta painikkeesta varmennusviesti osoitteeseesi. Viesti sisältää linkin, jonka avaamalla varmennat sähköpostiosoitteesi.',
-'confirmemail_pending' => 'Varmennusviesti on jo lähetetty. Jos loit tunnuksen äskettäin, odota muutama minuutti viestin saapumista, ennen kuin yrität uudelleen.',
-'confirmemail_send' => 'Lähetä varmennusviesti',
-'confirmemail_sent' => 'Varmennusviesti lähetetty.',
-'confirmemail_oncreate' => 'Varmennusviesti lähetettiin sähköpostiosoitteeseesi. Varmennuskoodia ei tarvita sisäänkirjautumiseen, mutta se täytyy antaa, ennen kuin voit käyttää sähköpostitoimintoja tässä wikissä.',
-'confirmemail_sendfailed' => 'Varmennusviestin lähettäminen epäonnistui. Tarkista, onko osoitteessa kiellettyjä merkkejä.
+'confirmemail' => 'Varmenna sähköpostiosoite',
+'confirmemail_noemail' => 'Sinulla ei ole kelvollista sähköpostiosoitetta [[Special:Preferences|asetuksissasi]].',
+'confirmemail_text' => 'Tämä wiki vaatii sähköpostiosoitteen varmentamisen, ennen kuin voit käyttää sähköpostitoimintoja. Lähetä alla olevasta painikkeesta varmennusviesti osoitteeseesi. Viesti sisältää linkin, jonka avaamalla varmennat sähköpostiosoitteesi.',
+'confirmemail_pending' => 'Varmennusviesti on jo lähetetty. Jos loit tunnuksen äskettäin, odota muutama minuutti viestin saapumista, ennen kuin yrität uudelleen.',
+'confirmemail_send' => 'Lähetä varmennusviesti',
+'confirmemail_sent' => 'Varmennusviesti lähetetty.',
+'confirmemail_oncreate' => 'Varmennusviesti lähetettiin sähköpostiosoitteeseesi. Varmennuskoodia ei tarvita sisäänkirjautumiseen, mutta se täytyy antaa, ennen kuin voit käyttää sähköpostitoimintoja tässä wikissä.',
+'confirmemail_sendfailed' => 'Varmennusviestin lähettäminen epäonnistui. Tarkista, onko osoitteessa kiellettyjä merkkejä.
Postitusohjelma palautti: $1',
-'confirmemail_invalid' => 'Varmennuskoodi ei kelpaa. Koodi on voinut vanhentua.',
-'confirmemail_needlogin' => 'Sinun täytyy $1, jotta voisit varmistaa sähköpostiosoitteesi.',
-'confirmemail_success' => 'Sähköpostiosoitteesi on nyt varmennettu. Voit kirjautua sisään.',
-'confirmemail_loggedin' => 'Sähköpostiosoitteesi on nyt varmennettu.',
-'confirmemail_error' => 'Jokin epäonnistui varmennuksen tallentamisessa.',
-'confirmemail_subject' => '{{GRAMMAR:genitive|{{SITENAME}}}} sähköpostiosoitteen varmennus',
-'confirmemail_body' => 'Joku IP-osoitteesta $1 on rekisteröinyt {{GRAMMAR:inessive|{{SITENAME}}}} tunnuksen $2 tällä sähköpostiosoitteella.
+'confirmemail_invalid' => 'Varmennuskoodi ei kelpaa. Koodi on voinut vanhentua.',
+'confirmemail_needlogin' => 'Sinun täytyy $1, jotta voisit varmistaa sähköpostiosoitteesi.',
+'confirmemail_success' => 'Sähköpostiosoitteesi on nyt varmennettu. Voit kirjautua sisään.',
+'confirmemail_loggedin' => 'Sähköpostiosoitteesi on nyt varmennettu.',
+'confirmemail_error' => 'Jokin epäonnistui varmennuksen tallentamisessa.',
+'confirmemail_subject' => '{{GRAMMAR:genitive|{{SITENAME}}}} sähköpostiosoitteen varmennus',
+'confirmemail_body' => 'Joku IP-osoitteesta $1 on rekisteröinyt {{GRAMMAR:inessive|{{SITENAME}}}} tunnuksen $2 tällä sähköpostiosoitteella.
Varmenna, että tämä tunnus kuuluu sinulle avaamalla seuraava linkki selaimellasi:
@@ -3111,8 +3180,30 @@ Jos et ole rekisteröinyt tätä tunnusta, peruuta sähköpostiosoitteen varmenn
$5
Varmennuskoodi vanhenee $4.',
-'confirmemail_invalidated' => 'Sähköpostiosoitteen varmennus peruutettiin',
-'invalidateemail' => 'Sähköpostiosoitteen varmennuksen peruuttaminen',
+'confirmemail_body_changed' => 'Joku IP-osoitteesta $1 on vaihtanut {{GRAMMAR:inessive|{{SITENAME}}}} tunnuksen $2 sähköpostiosoitteeksi tämän osoitteen.
+
+Varmenna, että tämä tunnus kuuluu sinulle ja uudelleenaktivoi sähköpostitoiminnot avaamalla seuraava linkki selaimellasi:
+
+$3
+
+Jos tunnus ei kuulu sinulle, peruuta sähköpostiosoitteen varmennus avaamalla seuraava linkki:
+
+$5
+
+Varmennuskoodi vanhenee $4.',
+'confirmemail_body_set' => 'Joku, todennäköisesti sinä, IP-osoitteesta $1 on vaihtanut {{GRAMMAR:inessive|{{SITENAME}}}} tunnuksen $2 sähköpostiosoitteeksi tämän osoitteen.
+
+Varmenna, että tämä tunnus kuuluu sinulle ja aktivoi sähköpostitoiminnot uudelleen avaamalla seuraava linkki selaimellasi:
+
+$3
+
+Jos tunnus ei kuulu sinulle, peruuta sähköpostiosoitteen varmennus avaamalla seuraava linkki:
+
+$5
+
+Varmennuskoodi vanhenee $4.',
+'confirmemail_invalidated' => 'Sähköpostiosoitteen varmennus peruutettiin',
+'invalidateemail' => 'Sähköpostiosoitteen varmennuksen peruuttaminen',
# Scary transclusion
'scarytranscludedisabled' => '[Wikienvälinen sisällytys ei ole käytössä]',
@@ -3157,6 +3248,7 @@ Varmista, että haluat luoda sivun uudelleen.",
'table_pager_first' => 'Ensimmäinen sivu',
'table_pager_last' => 'Viimeinen sivu',
'table_pager_limit' => 'Näytä $1 nimikettä sivulla',
+'table_pager_limit_label' => 'Kohteita sivua kohden:',
'table_pager_limit_submit' => 'Hae',
'table_pager_empty' => 'Ei tuloksia',
@@ -3217,6 +3309,7 @@ Voit myös muokata listaa [[Special:Watchlist/edit|tavalliseen tapaan]].',
'version-specialpages' => 'Toimintosivut',
'version-parserhooks' => 'Jäsenninkytkökset',
'version-variables' => 'Muuttujat',
+'version-skins' => 'Ulkoasut',
'version-other' => 'Muut',
'version-mediahandlers' => 'Median käsittelijät',
'version-hooks' => 'Kytköspisteet',
@@ -3228,6 +3321,13 @@ Voit myös muokata listaa [[Special:Watchlist/edit|tavalliseen tapaan]].',
'version-hook-subscribedby' => 'Kytkökset',
'version-version' => '(Versio $1)',
'version-license' => 'Lisenssi',
+'version-poweredby-credits' => "Tämä wiki käyttää '''[http://www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'muut',
+'version-license-info' => 'MediaWiki on vapaa ohjelmisto – voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai halutessasi mikä tahansa myöhemmän version mukaisesti.
+
+MediaWikiä levitetään siinä toivossa, että se olisi hyödyllinen, mutta ilman mitään takuuta; ilman edes hiljaista takuuta kaupallisesti hyväksyttävästä laadusta tai soveltuvuudesta tiettyyn tarkoitukseen. Katso GPL-lisenssistä lisää yksityiskohtia.
+
+Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General Public Licensestä] tämän ohjelman mukana. Jos et saanut kopiota, kirjoita siitä osoitteeseen Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA tai [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lue se Internetissä].',
'version-software' => 'Asennettu ohjelmisto',
'version-software-product' => 'Tuote',
'version-software-version' => 'Versio',
@@ -3295,6 +3395,15 @@ Kirjoita tiedostonimi ilman â€{{ns:file}}:â€-etuliitettä.',
'tags-edit' => 'muokkaa',
'tags-hitcount' => '$1 {{PLURAL:$1|muutos|muutosta}}',
+# Special:ComparePages
+'comparepages' => 'Vertaile sivuja',
+'compare-selector' => 'Vertaile sivuversioita',
+'compare-page1' => 'Sivu 1',
+'compare-page2' => 'Sivu 2',
+'compare-rev1' => 'Versio 1',
+'compare-rev2' => 'Versio 2',
+'compare-submit' => 'Vertaile',
+
# Database error messages
'dberr-header' => 'Wikissä on tietokantaongelma',
'dberr-problems' => 'Tällä sivustolla on teknisiä ongelmia.',
@@ -3311,8 +3420,13 @@ Kirjoita tiedostonimi ilman â€{{ns:file}}:â€-etuliitettä.',
'htmlform-float-invalid' => 'Antamasi arvo ei ole numero.',
'htmlform-int-toolow' => 'Annettu arvo on pienempi kuin alaraja $1',
'htmlform-int-toohigh' => 'Annettu arvo on suurempi kuin yläraja $1',
+'htmlform-required' => 'Tämä arvo on vaadittu',
'htmlform-submit' => 'Lähetä',
'htmlform-reset' => 'Kumoa muutokset',
'htmlform-selectorother-other' => 'Muu',
+# SQLite database support
+'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle',
+'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle',
+
);
diff --git a/languages/messages/MessagesFj.php b/languages/messages/MessagesFj.php
index 09334406..0bb30c62 100644
--- a/languages/messages/MessagesFj.php
+++ b/languages/messages/MessagesFj.php
@@ -102,7 +102,7 @@ $messages = array(
'yourname' => 'Yaca vakayagataki',
'yourpassword' => 'Yaca vuni',
'yourpasswordagain' => 'Vola tale na Yaca vuni',
-'remembermypassword' => 'Nanuma na yacaqu ena komipiuta oqo',
+'remembermypassword' => 'Nanuma na yacaqu ena komipiuta oqo (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Curu mai',
'userlogin' => 'Curu mai / Dolava nomu Akaude',
'logout' => 'Curu yani',
diff --git a/languages/messages/MessagesFo.php b/languages/messages/MessagesFo.php
index 18b064a8..44203628 100644
--- a/languages/messages/MessagesFo.php
+++ b/languages/messages/MessagesFo.php
@@ -124,8 +124,7 @@ $messages = array(
'tog-editsection' => 'Rætta greinpart við hjálp av [rætta]-ávísing',
'tog-editsectiononrightclick' => 'Rætta greinpart við at høgraklikkja á yvirskrift av greinparti (JavaScript)',
'tog-showtoc' => 'Vís innihaldsyvurlit (Til greinir við meira enn trimun greinpartum)',
-'tog-rememberpassword' => 'Minst til loyniorð næstu ferð',
-'tog-editwidth' => 'Rættingarkassin hevur fulla breid',
+'tog-rememberpassword' => 'Minst til loyniorð næstu ferð (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Legg síður, sum eg stovni, í mítt eftirlit',
'tog-watchdefault' => 'Vaka yvur nýggjum og broyttum greinum',
'tog-minordefault' => 'Merk sum standard allar broytingar sum smærri',
@@ -385,7 +384,7 @@ Tín konto er nú stovnað. Gloym ikki at broyta tínar {{SITENAME}} innstilling
'yourname' => 'Títt brúkaranavn:',
'yourpassword' => 'Títt loyniorð:',
'yourpasswordagain' => 'Skriva loyniorð umaftur:',
-'remembermypassword' => 'Minst til loyniorðið hjá mær.',
+'remembermypassword' => 'Minst til loyniorðið hjá mær (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Rita inn',
'nav-login-createaccount' => 'Stovna kontu ella rita inn',
'loginprompt' => 'Cookies má verða sett til fyri at innrita á {{SITENAME}}.',
@@ -485,9 +484,6 @@ Ert tú ein dulnevndur brúkari, og kennir, at óvikomandi viðmerkingar eru ven
'copyrightwarning' => "Alt íkast til {{SITENAME}} er útgivið undir $2 (sí $1 fyri smálutir). Vilt tú ikki hava skriving tína broytta miskunnarleyst og endurspjadda frítt, so send hana ikki inn.<br />
Við at senda arbeiði títt inn, lovar tú, at tú hevur skrivað tað, ella at tú hevur avritað tað frá tilfeingi ið er almenn ogn &mdash; hetta umfatar '''ikki''' flestu vevsíður.
'''SEND IKKI UPPHAVSRÆTTARVART TILFAR UTTAN LOYVI!'''",
-'longpagewarning' => "'''ÃVARING: Henda síðan er $1 kilobýt long.
-Summir sneytarar kunnu hava trupulleikar við at viðgerða síður upp ímóti ella longri enn 32 kb.
-Vinarliga umhugsa at býta síðuna sundur í styttri pettir.'''",
'protectedpagewarning' => "'''ÃVARING: Henda síðan er friðað, so at einans brúkarar við umboðsstjóraheimildum kunnu broyta hana.'''",
'semiprotectedpagewarning' => "'''Viðmerking:''' Hendan grein er læst soleiðis at bert skrásetir brúkaris kunnu rætta hana.",
'templatesused' => 'Fyrimyndir brúktar á hesu síðu:',
@@ -638,27 +634,27 @@ Vinarliga umhugsa at býta síðuna sundur í styttri pettir.'''",
'recentchangeslinked-toolbox' => 'Viðkomandi broytingar',
# Upload
-'upload' => 'Legg fílu upp',
-'uploadbtn' => 'Legg fílu upp',
-'uploadnologin' => 'Ikki ritað inn',
-'uploadnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
+'upload' => 'Legg fílu upp',
+'uploadbtn' => 'Legg fílu upp',
+'uploadnologin' => 'Ikki ritað inn',
+'uploadnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
fyri at leggja fílur upp.',
-'uploadlog' => 'fílu logg',
-'uploadlogpage' => 'Fílugerðabók',
-'filename' => 'Fílunavn',
-'filedesc' => 'Samandráttur',
-'fileuploadsummary' => 'Samandráttur:',
-'filestatus' => 'Upphavsrættar støða:',
-'filesource' => 'Kelda:',
-'uploadedfiles' => 'Upplagdar fílur',
-'ignorewarnings' => 'Ikki vísa ávaringar',
-'badfilename' => 'Myndin er umnevnd til "$1".',
-'successfulupload' => 'Upplegging væleydnað',
-'savefile' => 'Goym fílu',
-'uploadedimage' => 'sent "[[$1]]" upp',
-'sourcefilename' => 'Keldufílunavn:',
-'destfilename' => 'Málfílunavn:',
-'watchthisupload' => 'Hav eftirlit við hesi síðuni',
+'uploadlog' => 'fílu logg',
+'uploadlogpage' => 'Fílugerðabók',
+'filename' => 'Fílunavn',
+'filedesc' => 'Samandráttur',
+'fileuploadsummary' => 'Samandráttur:',
+'filestatus' => 'Upphavsrættar støða:',
+'filesource' => 'Kelda:',
+'uploadedfiles' => 'Upplagdar fílur',
+'ignorewarnings' => 'Ikki vísa ávaringar',
+'badfilename' => 'Myndin er umnevnd til "$1".',
+'savefile' => 'Goym fílu',
+'uploadedimage' => 'sent "[[$1]]" upp',
+'sourcefilename' => 'Keldufílunavn:',
+'destfilename' => 'Málfílunavn:',
+'watchthisupload' => 'Hav eftirlit við hesi síðuni',
+'upload-success-subj' => 'Upplegging væleydnað',
'upload-file-error' => 'Innvortis brek',
@@ -815,7 +811,6 @@ ella hevur hann valt ikki at taka ímóti t-posti frá øðrum brúkarum.',
# Watchlist
'watchlist' => 'Mítt eftirlit',
'mywatchlist' => 'Mítt eftirlit',
-'watchlistfor' => "(fyri '''$1''')",
'nowatchlist' => 'Tú hevur ongar lutir í eftirlitinum.',
'watchnologin' => 'Tú hevur ikki ritað inn',
'addedwatch' => 'Lagt undir eftirlit',
@@ -1091,8 +1086,8 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
# Media information
'imagemaxsize' => 'Avmarka myndir á myndalýsingarsíðum til:',
'thumbsize' => 'Smámyndastødd:',
-'file-info-size' => '($1 × $2 pixel, stødd fílu: $3, MIME-slag: $4)',
-'svg-long-desc' => '(SVG fíle, nominelt $1 × $2 pixel, fíle stødd: $3)',
+'file-info-size' => '$1 × $2 pixel, stødd fílu: $3, MIME-slag: $4',
+'svg-long-desc' => 'SVG fíle, nominelt $1 × $2 pixel, fíle stødd: $3',
# Special:NewFiles
'newimages' => 'Nýggjar myndir',
diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php
index 8552a338..5c26fffe 100644
--- a/languages/messages/MessagesFr.php
+++ b/languages/messages/MessagesFr.php
@@ -36,6 +36,7 @@
* @author Kropotkine 113
* @author Litlok
* @author Louperivois
+ * @author Lucyin
* @author McDutchie
* @author Meithal
* @author Moyg
@@ -53,6 +54,7 @@
* @author Urhixidur
* @author Verdy p
* @author Wyz
+ * @author Yumeki
* @author Zetud
* @author Горан Ðнђелковић
* @author לערי ריינה×רט
@@ -172,10 +174,10 @@ $magicWords = array(
'img_none' => array( '1', 'néant', 'neant', 'none' ),
'img_center' => array( '1', 'centré', 'center', 'centre' ),
'img_framed' => array( '1', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sans_cadre', 'sans cadre', 'non encadré', 'non encadre', 'frameless' ),
+ 'img_frameless' => array( '1', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
'img_upright' => array( '1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'bordure', 'border' ),
- 'img_baseline' => array( '1', 'ligne de base', 'base', 'baseline' ),
+ 'img_baseline' => array( '1', 'ligne_de_base', 'base', 'baseline' ),
'img_sub' => array( '1', 'indice', 'ind', 'sub' ),
'img_super' => array( '1', 'exposant', 'exp', 'super', 'sup' ),
'img_top' => array( '1', 'haut', 'top' ),
@@ -189,6 +191,7 @@ $magicWords = array(
'nse' => array( '0', 'ESPACENX:', 'NSE:' ),
'localurl' => array( '0', 'URLLOCALE:', 'LOCALURL:' ),
'localurle' => array( '0', 'URLLOCALEX:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'CHEMINARTICLE', 'ARTICLEPATH' ),
'server' => array( '0', 'SERVEUR', 'SERVER' ),
'servername' => array( '0', 'NOMSERVEUR', 'SERVERNAME' ),
'scriptpath' => array( '0', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
@@ -205,6 +208,7 @@ $magicWords = array(
'revisionday' => array( '1', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'JOUR2VERSION', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'MOISVERSION', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'MOISVERSION1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'ANNEEVERSION', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'UTILISATEURVERSION', 'REVISIONUSER' ),
@@ -247,92 +251,93 @@ $magicWords = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Doubles redirections', 'DoublesRedirections', 'Redirections doubles', 'RedirectionsDoubles' ),
- 'BrokenRedirects' => array( 'Redirections cassées', 'RedirectionCassées', 'Redirections cassees', 'RedirectionsCassees' ),
- 'Disambiguations' => array( 'Homonymies', 'Homonymie', 'Pages d\'homonymie' ),
+ 'DoubleRedirects' => array( 'Doubles_redirections', 'DoublesRedirections', 'Redirections_doubles', 'RedirectionsDoubles' ),
+ 'BrokenRedirects' => array( 'Redirections_cassées', 'RedirectionCassées', 'Redirections_cassees', 'RedirectionsCassees' ),
+ 'Disambiguations' => array( 'Homonymies', 'Homonymie', 'Pages_d\'homonymie' ),
'Userlogin' => array( 'Connexion', 'Identification' ),
'Userlogout' => array( 'Déconnexion', 'Deconnexion' ),
- 'CreateAccount' => array( 'Créer un compte', 'CréerUnCompte', 'CréerCompte' ),
+ 'CreateAccount' => array( 'Créer_un_compte', 'CréerUnCompte', 'CréerCompte' ),
'Preferences' => array( 'Préférences' ),
- 'Watchlist' => array( 'Liste de suivi', 'ListeDeSuivi', 'Suivi' ),
- 'Recentchanges' => array( 'Modifications récentes', 'Modifications recentes', 'ModificationsRécentes', 'ModificationsRecentes' ),
+ 'Watchlist' => array( 'Liste_de_suivi', 'ListeDeSuivi', 'Suivi' ),
+ 'Recentchanges' => array( 'Modifications_récentes', 'Modifications_recentes', 'ModificationsRécentes', 'ModificationsRecentes' ),
'Upload' => array( 'Téléverser', 'Televerser', 'Téléversement', 'Televersement', 'Téléchargement', 'Telechargement' ),
- 'Listfiles' => array( 'Liste des fichiers', 'ListeDesFichiers', 'Liste des images', 'ListeDesImages' ),
- 'Newimages' => array( 'Nouveaux fichiers', 'NouveauxFichiers', 'Nouvelles images', 'NouvellesImages' ),
- 'Listusers' => array( 'Liste des utilisateurs', 'ListeDesUtilisateurs', 'Utilisateurs' ),
- 'Listgrouprights' => array( 'Liste des droits de groupe', 'ListeDesDroitsDeGroupes' ),
+ 'Listfiles' => array( 'Liste_des_fichiers', 'ListeDesFichiers', 'Liste_des_images', 'ListeDesImages' ),
+ 'Newimages' => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
+ 'Listusers' => array( 'Liste_des_utilisateurs', 'ListeDesUtilisateurs', 'Utilisateurs' ),
+ 'Listgrouprights' => array( 'Liste_des_droits_de_groupe', 'ListeDesDroitsDeGroupes' ),
'Statistics' => array( 'Statistiques', 'Stats' ),
- 'Randompage' => array( 'Page au hasard', 'PageAuHasard', 'Au hasard', 'AuHasard', 'Aléatoire', 'Aleatoire' ),
- 'Lonelypages' => array( 'Pages orphelines', 'PagesOrphelines' ),
- 'Uncategorizedpages' => array( 'Pages non catégorisées', 'PagesNonCatégorisées', 'Pages non categorisees', 'PagesNonCategorisees', 'Pages sans catégorie', 'PagesSansCatégorie', 'Pages sans categorie', 'PagesSansCategorie' ),
- 'Uncategorizedcategories' => array( 'Catégories non catégorisées', 'CatégoriesNonCatégorisées', 'Categories non categorisees', 'CategoriesNonCategorisees', 'Catégories sans catégorie', 'CatégoriesSansCatégorie', 'Categories sans categorie', 'CategoriesSansCategorie' ),
- 'Uncategorizedimages' => array( 'Fichiers non catégorisés', 'FichiersNonCatégorisés', 'Fichiers non categorises', 'FichiersNonCategorises', 'Fichiers sans catégorie', 'FichiersSansCatégorie', 'Fichiers sans categorie', 'FichiersSansCategorie', 'Images non catégorisées', 'ImagesNonCatégorisées', 'Images non categorisees', 'ImagesNonCategorisees', 'Images sans catégorie', 'ImagesSansCatégorie', 'Images sans categorie', 'ImagesSansCategorie' ),
- 'Uncategorizedtemplates' => array( 'Modèles non catégorisés', 'ModèlesNonCatégorisés', 'Modeles non categorises', 'ModelesNonCategorises', 'Modèles sans catégorie', 'ModèlesSansCatégorie', 'Modeles sans catégorie', 'ModelesSansCatégorie' ),
- 'Unusedcategories' => array( 'Catégories inutilisées', 'CatégoriesInutilisées', 'Categories inutilisees', 'CategoriesInutilisees', 'Catégories non utilisées', 'CatégoriesNonUtilisées', 'Categories non utilisees', 'CategoriesNonUtilisees' ),
- 'Unusedimages' => array( 'Fichiers inutilisés', 'FichiersInutilisés', 'Fichiers inutilises', 'FichiersInutilises', 'Fichiers non utilisés', 'FichiersNon utilisés', 'Fichiers non utilises', 'FichiersNon utilises', 'Images inutilisées', 'ImagesInutilisées', 'Images inutilisees', 'ImagesInutilisees', 'Images non utilisées', 'ImagesNonUtilisées', 'Images non utilisees', 'ImagesNonUtilisees' ),
- 'Wantedpages' => array( 'Pages demandées', 'PagesDemandées', 'Pages demandees', 'PagesDemandees', 'Liens brisés', 'LiensBrisés', 'Liens brises', 'LiensBrises' ),
- 'Wantedcategories' => array( 'Catégories demandées', 'CatégoriesDemandées', 'Categories demandees', 'CategoriesDemandees' ),
- 'Wantedfiles' => array( 'Fichiers demandés', 'FichiersDemandés', 'Fichiers demandes', 'FichiersDemandes' ),
- 'Wantedtemplates' => array( 'Modèles demandés', 'ModèlesDemandés', 'Modeles demandes', 'ModelesDemandes' ),
- 'Mostlinked' => array( 'Pages les plus liées', 'PagesLesPlusLiées', 'Pages les plus liees', 'PagesLesPlusLiees', 'Les plus liées', 'LesPlusLiées', 'Les plus liees', 'LesPlusLiees' ),
- 'Mostlinkedcategories' => array( 'Catégories les plus liées', 'CatégoriesLesPlusLiées', 'Categories les plus liees', 'CategoriesLesPlusLiees', 'Catégories les plus utilisées', 'CatégoriesLesPlusUtilisées', 'Categories les plus utilisees', 'CategoriesLesPlusUtilisees' ),
- 'Mostlinkedtemplates' => array( 'Modèles les plus liés', 'ModèlesLesPlusLiés', 'Modeles les plus lies', 'ModelesLesPlusLies', 'Modèles les plus utilisés', 'ModèlesLesPlusUtilisés', 'Modeles les plus utilises', 'ModelesLesPlusUtilises' ),
- 'Mostimages' => array( 'Fichiers les plus liés', 'FichiersLesPlusLiés', 'Fichiers les plus lies', 'FichiersLesPlusLies', 'Fichiers les plus utilisés', 'FichiersLesPlusUtilisés', 'Fichiers les plus utilises', 'FichiersLesPlusUtilises', 'Images les plus liées', 'ImagesLesPlusLiées', 'Images les plus liees', 'ImagesLesPlusLiees', 'Images les plus utilisées', 'ImagesLesPlusUtilisées', 'Images les plus utilisees', 'ImagesLesPlusUtilisees' ),
- 'Mostcategories' => array( 'Pages les plus catégorisées', 'PagesLesPlusCatégorisées', 'Pages les plus categorisees', 'PagesLesPlusCategorisees', 'Les plus catégorisés', 'LesPlusCatégorisés', 'Les plus categorises', 'LesPlusCategorises' ),
- 'Mostrevisions' => array( 'Pages les plus modifiées', 'PagesLesPlusModifiées', 'Pages les plus modifiees', 'PagesLesPlusModifiees', 'Les plus modifiés', 'LesPlusModifiés', 'Les plus modifies', 'LesPlusModifies' ),
- 'Fewestrevisions' => array( 'Pages les moins modifiées', 'PagesLesMoinsModifiées', 'Pages les moins modifiees', 'PagesLesMoinsModifiees', 'Les moins modifiés', 'LesMoinsModifiés', 'Les moins modifies', 'LesMoinsModifies' ),
- 'Shortpages' => array( 'Pages courtes', 'PagesCourtes' ),
- 'Longpages' => array( 'Pages longues', 'PagesLongues' ),
- 'Newpages' => array( 'Nouvelles pages', 'NouvellesPages', 'Pages récentes', 'PagesRécentes', 'Pages recentes', 'PagesRecentes' ),
- 'Ancientpages' => array( 'Pages anciennes', 'PagesAnciennes', 'Anciennes pages', 'AnciennesPages' ),
- 'Deadendpages' => array( 'Pages en impasse', 'PagesEnImpasse' ),
- 'Protectedpages' => array( 'Pages protégées', 'PagesProtégées', 'Pages protegees', 'PagesProtegees' ),
- 'Protectedtitles' => array( 'Titres protégés', 'TitresProtégés', 'Titres proteges', 'TitresProteges' ),
- 'Allpages' => array( 'Toutes les pages', 'ToutesLesPages' ),
+ 'Randompage' => array( 'Page_au_hasard', 'PageAuHasard', 'Au_hasard', 'AuHasard', 'Aléatoire', 'Aleatoire' ),
+ 'Lonelypages' => array( 'Pages_orphelines', 'PagesOrphelines' ),
+ 'Uncategorizedpages' => array( 'Pages_non_catégorisées', 'PagesNonCatégorisées', 'Pages_non_categorisees', 'PagesNonCategorisees', 'Pages_sans_catégorie', 'PagesSansCatégorie', 'Pages_sans_categorie', 'PagesSansCategorie' ),
+ 'Uncategorizedcategories' => array( 'Catégories_non_catégorisées', 'CatégoriesNonCatégorisées', 'Categories_non_categorisees', 'CategoriesNonCategorisees', 'Catégories_sans_catégorie', 'CatégoriesSansCatégorie', 'Categories_sans_categorie', 'CategoriesSansCategorie' ),
+ 'Uncategorizedimages' => array( 'Fichiers_non_catégorisés', 'FichiersNonCatégorisés', 'Fichiers_non_categorises', 'FichiersNonCategorises', 'Fichiers_sans_catégorie', 'FichiersSansCatégorie', 'Fichiers_sans_categorie', 'FichiersSansCategorie', 'Images_non_catégorisées', 'ImagesNonCatégorisées', 'Images_non_categorisees', 'ImagesNonCategorisees', 'Images_sans_catégorie', 'ImagesSansCatégorie', 'Images_sans_categorie', 'ImagesSansCategorie' ),
+ 'Uncategorizedtemplates' => array( 'Modèles_non_catégorisés', 'ModèlesNonCatégorisés', 'Modeles_non_categorises', 'ModelesNonCategorises', 'Modèles_sans_catégorie', 'ModèlesSansCatégorie', 'Modeles_sans_catégorie', 'ModelesSansCatégorie' ),
+ 'Unusedcategories' => array( 'Catégories_inutilisées', 'CatégoriesInutilisées', 'Categories_inutilisees', 'CategoriesInutilisees', 'Catégories_non_utilisées', 'CatégoriesNonUtilisées', 'Categories_non_utilisees', 'CategoriesNonUtilisees' ),
+ 'Unusedimages' => array( 'Fichiers_inutilisés', 'FichiersInutilisés', 'Fichiers_inutilises', 'FichiersInutilises', 'Fichiers_non_utilisés', 'FichiersNon_utilisés', 'Fichiers_non_utilises', 'FichiersNon_utilises', 'Images_inutilisées', 'ImagesInutilisées', 'Images_inutilisees', 'ImagesInutilisees', 'Images_non_utilisées', 'ImagesNonUtilisées', 'Images_non_utilisees', 'ImagesNonUtilisees' ),
+ 'Wantedpages' => array( 'Pages_demandées', 'PagesDemandées', 'Pages_demandees', 'PagesDemandees', 'Liens_brisés', 'LiensBrisés', 'Liens_brises', 'LiensBrises' ),
+ 'Wantedcategories' => array( 'Catégories_demandées', 'CatégoriesDemandées', 'Categories_demandees', 'CategoriesDemandees' ),
+ 'Wantedfiles' => array( 'Fichiers_demandés', 'FichiersDemandés', 'Fichiers_demandes', 'FichiersDemandes' ),
+ 'Wantedtemplates' => array( 'Modèles_demandés', 'ModèlesDemandés', 'Modeles_demandes', 'ModelesDemandes' ),
+ 'Mostlinked' => array( 'Pages_les_plus_liées', 'PagesLesPlusLiées', 'Pages_les_plus_liees', 'PagesLesPlusLiees', 'Les_plus_liées', 'LesPlusLiées', 'Les_plus_liees', 'LesPlusLiees' ),
+ 'Mostlinkedcategories' => array( 'Catégories_les_plus_liées', 'CatégoriesLesPlusLiées', 'Categories_les_plus_liees', 'CategoriesLesPlusLiees', 'Catégories_les_plus_utilisées', 'CatégoriesLesPlusUtilisées', 'Categories_les_plus_utilisees', 'CategoriesLesPlusUtilisees' ),
+ 'Mostlinkedtemplates' => array( 'Modèles_les_plus_liés', 'ModèlesLesPlusLiés', 'Modeles_les_plus_lies', 'ModelesLesPlusLies', 'Modèles_les_plus_utilisés', 'ModèlesLesPlusUtilisés', 'Modeles_les_plus_utilises', 'ModelesLesPlusUtilises' ),
+ 'Mostimages' => array( 'Fichiers_les_plus_liés', 'FichiersLesPlusLiés', 'Fichiers_les_plus_lies', 'FichiersLesPlusLies', 'Fichiers_les_plus_utilisés', 'FichiersLesPlusUtilisés', 'Fichiers_les_plus_utilises', 'FichiersLesPlusUtilises', 'Images_les_plus_liées', 'ImagesLesPlusLiées', 'Images_les_plus_liees', 'ImagesLesPlusLiees', 'Images_les_plus_utilisées', 'ImagesLesPlusUtilisées', 'Images_les_plus_utilisees', 'ImagesLesPlusUtilisees' ),
+ 'Mostcategories' => array( 'Pages_les_plus_catégorisées', 'PagesLesPlusCatégorisées', 'Pages_les_plus_categorisees', 'PagesLesPlusCategorisees', 'Les_plus_catégorisés', 'LesPlusCatégorisés', 'Les_plus_categorises', 'LesPlusCategorises' ),
+ 'Mostrevisions' => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
+ 'Fewestrevisions' => array( 'Pages_les_moins_modifiées', 'PagesLesMoinsModifiées', 'Pages_les_moins_modifiees', 'PagesLesMoinsModifiees', 'Les_moins_modifiés', 'LesMoinsModifiés', 'Les_moins_modifies', 'LesMoinsModifies' ),
+ 'Shortpages' => array( 'Pages_courtes', 'PagesCourtes' ),
+ 'Longpages' => array( 'Pages_longues', 'PagesLongues' ),
+ 'Newpages' => array( 'Nouvelles_pages', 'NouvellesPages', 'Pages_récentes', 'PagesRécentes', 'Pages_recentes', 'PagesRecentes' ),
+ 'Ancientpages' => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
+ 'Deadendpages' => array( 'Pages_en_impasse', 'PagesEnImpasse' ),
+ 'Protectedpages' => array( 'Pages_protégées', 'PagesProtégées', 'Pages_protegees', 'PagesProtegees' ),
+ 'Protectedtitles' => array( 'Titres_protégés', 'TitresProtégés', 'Titres_proteges', 'TitresProteges' ),
+ 'Allpages' => array( 'Toutes_les_pages', 'ToutesLesPages' ),
'Prefixindex' => array( 'Index', 'Préfixes', 'Prefixes' ),
- 'Ipblocklist' => array( 'Liste des blocages', 'ListeDesBlocages', 'Blocages', 'Utilisateurs bloqués', 'UtilisateursBloqués', 'Utilisateurs bloques', 'UtilisateursBloques', 'IP bloquées', 'IPBloquees', 'IPBloquées' ),
- 'Specialpages' => array( 'Pages spéciales', 'PagesSpéciales', 'Pages speciales', 'PagesSpeciales' ),
- 'Emailuser' => array( 'Envoyer un courriel', 'EnvoyerUnCourriel', 'Courriel', 'Envoyer un e-mail', 'EnvoyerUnEMail', 'E-mail', 'EMail' ),
- 'Confirmemail' => array( 'Confirmer le courriel', 'ConfirmerLeCourriel' ),
- 'Whatlinkshere' => array( 'Pages liées', 'PagesLiées', 'Pages liees', 'PagesLiees' ),
- 'Recentchangeslinked' => array( 'Suivi des liens', 'SuiviDesLiens' ),
- 'Movepage' => array( 'Renommer une page', 'Renommer', 'Renommage' ),
+ 'Ipblocklist' => array( 'Liste_des_blocages', 'ListeDesBlocages', 'Blocages', 'Utilisateurs_bloqués', 'UtilisateursBloqués', 'Utilisateurs_bloques', 'UtilisateursBloques', 'IP_bloquées', 'IPBloquees', 'IPBloquées' ),
+ 'Unblock' => array( 'Débloquer', 'Déblocage' ),
+ 'Specialpages' => array( 'Pages_spéciales', 'PagesSpéciales', 'Pages_speciales', 'PagesSpeciales' ),
+ 'Emailuser' => array( 'Envoyer_un_courriel', 'EnvoyerUnCourriel', 'Courriel', 'Envoyer_un_e-mail', 'EnvoyerUnEMail', 'E-mail', 'EMail' ),
+ 'Confirmemail' => array( 'Confirmer_l\'adresse_de_contact', 'Confirmer_le_courriel', 'ConfirmerLeCourriel' ),
+ 'Whatlinkshere' => array( 'Pages_liées', 'PagesLiées', 'Pages_liees', 'PagesLiees' ),
+ 'Recentchangeslinked' => array( 'Suivi_des_liens', 'SuiviDesLiens' ),
+ 'Movepage' => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
'Blockme' => array( 'Bloquez-moi', 'Bloquezmoi' ),
- 'Booksources' => array( 'Ouvrages de référence', 'Ouvrages de reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche ISBN', 'Recherche isbn', 'RechercheISBN', 'Rechercheisbn' ),
+ 'Booksources' => array( 'Ouvrages_de_référence', 'Ouvrages_de_reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche_ISBN', 'Recherche_isbn', 'RechercheISBN', 'Rechercheisbn' ),
'Categories' => array( 'Catégories' ),
'Export' => array( 'Exporter', 'Exportation' ),
- 'Allmessages' => array( 'Messages système', 'Messages systeme', 'Messagessystème', 'Messagessysteme' ),
+ 'Allmessages' => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
'Log' => array( 'Journal', 'Journaux' ),
'Blockip' => array( 'Bloquer', 'Blocage' ),
'Undelete' => array( 'Restaurer', 'Restauration' ),
'Import' => array( 'Importer', 'Importation' ),
- 'Lockdb' => array( 'Verrouiller la base', 'Verrouillerlabase', 'Verrouiller base', 'Verrouillerbase', 'Verrouiller BD', 'VerrouillerBD', 'Verrouiller bd', 'Verrouillerbd' ),
- 'Unlockdb' => array( 'Déverrouiller la base', 'Déverrouillerlabase', 'Deverrouiller la base', 'Deverrouillerlabase', 'Déverrouiller base', 'Déverrouillerbase', 'Deverrouiller base', 'Deverrouillerbase', 'Déverrouiller BD', 'DéverrouillerBD', 'Deverrouiller BD', 'DeverrouillerBD', 'Déverrouiller bd', 'Déverrouillerbd', 'Deverrouiller bd', 'Deverrouillerbd' ),
- 'Userrights' => array( 'Permissions', 'Droits', 'Droits des utilisateurs' ),
- 'MIMEsearch' => array( 'Recherche MIME', 'RechercheMIME', 'Recherche mime', 'Recherchemime' ),
- 'FileDuplicateSearch' => array( 'Recherche fichier en double', 'RechercheFichierEnDouble' ),
- 'Unwatchedpages' => array( 'Pages non suivies', 'Pagesnonsuivies' ),
- 'Listredirects' => array( 'Liste des redirections', 'Listedesredirections', 'Liste des redirects', 'Listedesredirects', 'Liste redirections', 'Listeredirections', 'Liste redirects', 'Listeredirects' ),
- 'Revisiondelete' => array( 'Versions supprimées', 'Versions supprimees', 'Versionsupprimées', 'Versionsupprimees' ),
- 'Unusedtemplates' => array( 'Modèles inutilisés', 'Modèlesinutilisés', 'Modeles inutilises', 'Modelesinutilises', 'Modèles non utilisés', 'Modèlesnonutilisés', 'Modeles non utilises', 'Modelesnonutilises' ),
- 'Randomredirect' => array( 'Redirection au hasard', 'Redirect au hasard', 'Redirectionauhasard', 'Redirectauhasard', 'Redirection aléatoire', 'Redirect aléatoire', 'Redirectionaléatoire', 'Redirectaléatoire', 'Redirection aleatoire', 'Redirect aleatoire', 'Redirectionaleatoire', 'Redirectaleatoire' ),
- 'Mypage' => array( 'Ma page', 'Mapage' ),
- 'Mytalk' => array( 'Mes discussions', 'Mesdiscussions' ),
- 'Mycontributions' => array( 'Mes contributions', 'Mescontributions' ),
- 'Listadmins' => array( 'Liste des administrateurs', 'Listedesadministrateurs', 'Liste des admins', 'Listedesadmins', 'Liste admins', 'Listeadmins' ),
- 'Listbots' => array( 'Liste des bots', 'ListedesBots' ),
- 'Popularpages' => array( 'Pages les plus visitées', 'Pages les plus visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
+ 'Lockdb' => array( 'Verrouiller_la_base', 'Verrouillerlabase', 'Verrouiller_base', 'Verrouillerbase', 'Verrouiller_BD', 'VerrouillerBD', 'Verrouiller_bd', 'Verrouillerbd' ),
+ 'Unlockdb' => array( 'Déverrouiller_la_base', 'Déverrouillerlabase', 'Deverrouiller_la_base', 'Deverrouillerlabase', 'Déverrouiller_base', 'Déverrouillerbase', 'Deverrouiller_base', 'Deverrouillerbase', 'Déverrouiller_BD', 'DéverrouillerBD', 'Deverrouiller_BD', 'DeverrouillerBD', 'Déverrouiller_bd', 'Déverrouillerbd', 'Deverrouiller_bd', 'Deverrouillerbd' ),
+ 'Userrights' => array( 'Permissions', 'Droits', 'Droits_des_utilisateurs' ),
+ 'MIMEsearch' => array( 'Recherche_MIME', 'RechercheMIME', 'Recherche_mime', 'Recherchemime' ),
+ 'FileDuplicateSearch' => array( 'Recherche_fichier_en_double', 'RechercheFichierEnDouble' ),
+ 'Unwatchedpages' => array( 'Pages_non_suivies', 'Pagesnonsuivies' ),
+ 'Listredirects' => array( 'Liste_des_redirections', 'Listedesredirections', 'Liste_des_redirects', 'Listedesredirects', 'Liste_redirections', 'Listeredirections', 'Liste_redirects', 'Listeredirects' ),
+ 'Revisiondelete' => array( 'Versions_supprimées', 'Versions_supprimees', 'Versionsupprimées', 'Versionsupprimees' ),
+ 'Unusedtemplates' => array( 'Modèles_inutilisés', 'Modèlesinutilisés', 'Modeles_inutilises', 'Modelesinutilises', 'Modèles_non_utilisés', 'Modèlesnonutilisés', 'Modeles_non_utilises', 'Modelesnonutilises' ),
+ 'Randomredirect' => array( 'Redirection_au_hasard', 'Redirect_au_hasard', 'Redirectionauhasard', 'Redirectauhasard', 'Redirection_aléatoire', 'Redirect_aléatoire', 'Redirectionaléatoire', 'Redirectaléatoire', 'Redirection_aleatoire', 'Redirect_aleatoire', 'Redirectionaleatoire', 'Redirectaleatoire' ),
+ 'Mypage' => array( 'Ma_page', 'Mapage' ),
+ 'Mytalk' => array( 'Mes_discussions', 'Mesdiscussions' ),
+ 'Mycontributions' => array( 'Mes_contributions', 'Mescontributions' ),
+ 'Listadmins' => array( 'Liste_des_administrateurs', 'Listedesadministrateurs', 'Liste_des_admins', 'Listedesadmins', 'Liste_admins', 'Listeadmins' ),
+ 'Listbots' => array( 'Liste_des_bots', 'ListedesBots' ),
+ 'Popularpages' => array( 'Pages_les_plus_visitées', 'Pages_les_plus_visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
'Search' => array( 'Recherche', 'Rechercher', 'Chercher' ),
- 'Resetpass' => array( 'Changement du mot de passe', 'ChangementDuMotDePasse' ),
- 'Withoutinterwiki' => array( 'Sans interwiki', 'Sansinterwiki', 'Sans interwikis', 'Sansinterwikis' ),
- 'MergeHistory' => array( 'Fusionner les historiques', 'FusionnerHistoriques', 'Fusionner l\'historique', 'Fusionnerlhistorique' ),
- 'Filepath' => array( 'Chemin du fichier', 'CheminDuFichier', 'CheminFichier' ),
- 'Invalidateemail' => array( 'Invalider le courriel', 'Invalider courriel', 'InvaliderCourriel' ),
- 'Blankpage' => array( 'Page blanche', 'PageBlanche' ),
- 'LinkSearch' => array( 'Recherche de lien', 'Recherche de liens' ),
- 'DeletedContributions' => array( 'Contributions supprimées', 'ContributionsSupprimées', 'ContributionSupprimees' ),
+ 'Resetpass' => array( 'Changement_du_mot_de_passe', 'ChangementDuMotDePasse' ),
+ 'Withoutinterwiki' => array( 'Sans_interwiki', 'Sansinterwiki', 'Sans_interwikis', 'Sansinterwikis' ),
+ 'MergeHistory' => array( 'Fusionner_les_historiques', 'FusionnerHistoriques', 'Fusionner_l\'historique', 'Fusionnerlhistorique' ),
+ 'Filepath' => array( 'Chemin_du_fichier', 'CheminDuFichier', 'CheminFichier' ),
+ 'Invalidateemail' => array( 'Invalider_le_courriel', 'Invalider_courriel', 'InvaliderCourriel' ),
+ 'Blankpage' => array( 'Page_blanche', 'PageBlanche' ),
+ 'LinkSearch' => array( 'Recherche_de_lien', 'Recherche_de_liens' ),
+ 'DeletedContributions' => array( 'Contributions_supprimées', 'ContributionsSupprimées', 'ContributionSupprimees' ),
'Tags' => array( 'Balises' ),
- 'Activeusers' => array( 'Utilisateurs actifs', 'UtilisateursActifs' ),
+ 'Activeusers' => array( 'Utilisateurs_actifs', 'UtilisateursActifs' ),
);
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -353,8 +358,7 @@ $messages = array(
'tog-editsection' => 'Activer les modifications de sections grâce aux liens « [modifier] »',
'tog-editsectiononrightclick' => 'Un clic droit sur un titre de section permet de modifier celle-ci (nécessite JavaScript)',
'tog-showtoc' => 'Afficher la table des matières (pour les pages ayant plus de 3 sections)',
-'tog-rememberpassword' => 'Se souvenir de mon identification sur cet ordinateur avec un fichier témoin (<i>cookie</i>)',
-'tog-editwidth' => 'Afficher la fenêtre de modification en pleine largeur',
+'tog-rememberpassword' => 'Se souvenir de mon identification avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
'tog-watchcreations' => 'Ajouter les pages que je crée à ma liste de suivi',
'tog-watchdefault' => 'Ajouter les pages que je modifie à ma liste de suivi',
'tog-watchmoves' => 'Ajouter les pages que je renomme à ma liste de suivi',
@@ -500,31 +504,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Ajouter un sujet',
-'vector-action-delete' => 'Supprimer',
-'vector-action-move' => 'Renommer',
-'vector-action-protect' => 'Protéger',
-'vector-action-undelete' => 'Rétablir',
-'vector-action-unprotect' => 'Déprotéger',
-'vector-namespace-category' => 'Catégorie',
-'vector-namespace-help' => 'Aide',
-'vector-namespace-image' => 'Fichier',
-'vector-namespace-main' => 'Page',
-'vector-namespace-media' => 'Page de média',
-'vector-namespace-mediawiki' => 'Message',
-'vector-namespace-project' => 'Page de projet',
-'vector-namespace-special' => 'Page spéciale',
-'vector-namespace-talk' => 'Discussion',
-'vector-namespace-template' => 'Modèle',
-'vector-namespace-user' => 'Page utilisateur',
-'vector-view-create' => 'Créer',
-'vector-view-edit' => 'Modifier',
-'vector-view-history' => 'Afficher l’historique',
-'vector-view-view' => 'Lire',
-'vector-view-viewsource' => 'Voir la source',
-'actions' => 'Actions',
-'namespaces' => 'Espaces de noms',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Ajouter un sujet',
+'vector-action-delete' => 'Supprimer',
+'vector-action-move' => 'Renommer',
+'vector-action-protect' => 'Protéger',
+'vector-action-undelete' => 'Rétablir',
+'vector-action-unprotect' => 'Déprotéger',
+'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-view' => 'Lire',
+'vector-view-viewsource' => 'Voir la source',
+'actions' => 'Actions',
+'namespaces' => 'Espaces de noms',
+'variants' => 'Variantes',
'errorpagetitle' => 'Erreur',
'returnto' => 'Revenir à la page $1.',
@@ -585,6 +579,9 @@ Trop d’utilisateurs cherchent à consulter cette page.
Veuillez attendre un moment avant de retenter l’accès à cette page.
$1',
+'pool-timeout' => 'Délai dépassé durant l’attente du verrou',
+'pool-queuefull' => 'La file de travail est pleine',
+'pool-errorunknown' => 'Erreur inconnue',
# 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' => 'À propos de {{SITENAME}}',
@@ -749,7 +746,8 @@ N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{S
'yourname' => 'Nom d’utilisateur :',
'yourpassword' => 'Mot de passe :',
'yourpasswordagain' => 'Confirmez le mot de passe :',
-'remembermypassword' => "Me reconnecter automatiquement à la prochaine visite (avec un témoin ou ''cookie'')",
+'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites (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.',
'login' => 'Connexion',
@@ -766,6 +764,7 @@ N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{S
'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
'gotaccountlink' => 'Connectez-vous',
'createaccountmail' => 'par courriel',
+'createaccountreason' => 'Motif :',
'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
'userexists' => 'Le nom d’utilisateur que vous avez saisi est déjà utilisé.
Veuillez en choisir un autre.',
@@ -786,6 +785,7 @@ Vérifiez l’orthographe, ou [[Special:UserLogin/signup|créez un nouveau compt
'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.",
'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
@@ -826,6 +826,9 @@ Veuillez attendre avant d’essayer à nouveau.',
'loginlanguagelabel' => 'Langue : $1',
'suspicious-userlogout' => 'Votre demande de déconnexion a été refusée car il semble qu’elle a été envoyée par un navigateur cassé ou la mise en cache d’un proxy.',
+# E-mail sending
+'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
+
# Password reset dialog
'resetpass' => 'Changer de mot de passe',
'resetpass_announce' => 'Vous vous êtes enregistré{{GENDER:||e|(e)}} avec un mot de passe temporaire envoyé par courriel. Pour terminer l’enregistrement, vous devez entrer un nouveau mot de passe ici :',
@@ -877,6 +880,7 @@ Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mo
'showlivepreview' => 'Aperçu rapide',
'showdiff' => 'Modifications en cours',
'anoneditwarning' => "'''Attention :''' vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
+'anonpreviewwarning' => "''Vous n’êtes pas identifié. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
'missingsummary' => "'''Rappel :''' vous n’avez pas encore fourni le résumé de votre modification.
Si vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
'missingcommenttext' => 'Veuillez entrer un commentaire ci-dessous.',
@@ -953,7 +957,11 @@ La dernière entrée du registre des blocages est indiquée ci-dessous à titre
'usercsspreview' => "'''Rappelez-vous que vous n’êtes qu’en train de prévisualiser votre propre feuille CSS.'''
'''Elle n’a pas encore été enregistrée !'''",
'userjspreview' => "'''Rappelez-vous que vous êtes en train de visualiser ou de tester votre code JavaScript et qu’il n’a pas encore été enregistré !'''",
-'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/monobook.css et non {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Souvenez-vous que vous êtes seulement en train de prévisualiser cette feuille de style.'''
+'''Elle n’a pas encore été enregistrée !'''",
+'sitejspreview' => "'''Souvenez-vous que vous êtes seulement en train de prévisualiser ce code Javascript.'''
+'''Il n’a pas encore été enregistré !'''",
+'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' => "'''Attention, ce texte n’est qu’une prévisualisation et n’a pas encore été publié !'''",
@@ -991,8 +999,6 @@ Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’
'copyrightwarning2' => "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d’autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />
Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).
'''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
-'longpagewarning' => "'''AVERTISSEMENT : cette page a une longueur de $1 Kio ;
-certains navigateurs Web gèrent mal la modification des pages approchant ou dépassant 32 Kio. Peut-être devriez-vous diviser la page en sections plus petites.'''",
'longpageerror' => "'''ERREUR : Le texte que vous avez soumis fait $1 Kio, ce qui dépasse la limite fixée à $2 Kio. Le texte ne peut pas être sauvegardé.'''",
'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.'''
Vous pouvez copier le texte dans un fichier texte et le conserver pour plus tard.
@@ -1162,6 +1168,8 @@ $1",
'logdelete-failure' => "'''La visibilité du journal n’a pas pu être définie :'''
$1",
'revdel-restore' => 'modifier la visibilité',
+'revdel-restore-deleted' => 'révisions supprimées',
+'revdel-restore-visible' => 'révisions visibles',
'pagehist' => 'Historique de la page',
'deletedhist' => 'Historique supprimé',
'revdelete-content' => 'contenu',
@@ -1228,13 +1236,15 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
'mergelogpagetext' => 'Voici la liste des fusions de l’historique d’une page dans celui d’une autre les plus récentes.',
# Diffs
-'history-title' => 'Historique des versions de « $1 »',
+'history-title' => 'Historique des versions de «&nbsp;$1&nbsp;»',
'difference' => '(Différences entre les versions)',
+'difference-multipage' => '(Différence entre les pages)',
'lineno' => 'Ligne $1 :',
'compareselectedversions' => 'Comparer les versions sélectionnées',
'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
'editundo' => 'défaire',
-'diff-multi' => '({{PLURAL:$1|Une version intermédiaire masquée|$1 versions intermédiaires masquées}})',
+'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}})",
# Search results
'searchresults' => 'Résultats de la recherche',
@@ -1269,6 +1279,7 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
'searchprofile-everything-tooltip' => 'Rechercher dans tout le site (y compris dans les pages de discussion)',
'searchprofile-advanced-tooltip' => 'Choisir les espaces de noms pour la recherche',
'search-result-size' => '$1 ($2 mot{{PLURAL:$2||s}})',
+'search-result-category-size' => '$1 membre{{PLURAL:$1||s}} ($2 sous-catégorie{{PLURAL:$2||s}}, $3 fichier{{PLURAL:$3||s}})',
'search-result-score' => 'Pertinence : $1%',
'search-redirect' => '(redirection depuis $1)',
'search-section' => '(section $1)',
@@ -1344,6 +1355,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
'contextlines' => 'Nombre de lignes par réponse :',
'contextchars' => 'Nombre de caractères de contexte par ligne :',
'stub-threshold' => 'Limite supérieure pour les <a href="#" class="stub">liens vers les ébauches</a> (octets) :',
+'stub-threshold-disabled' => 'Désactivé',
'recentchangesdays' => 'Nombre de jours à afficher dans les modifications récentes :',
'recentchangesdays-max' => '(maximum $1 jour{{PLURAL:$1||s}})',
'recentchangescount' => 'Nombre de modifications à afficher par défaut :',
@@ -1377,6 +1389,7 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
'prefs-files' => 'Fichiers',
'prefs-custom-css' => 'CSS personnalisé',
'prefs-custom-js' => 'JavaScript personnalisé',
+'prefs-common-css-js' => 'JavaScript et CSS partagé pour tous les habillages :',
'prefs-reset-intro' => 'Vous pouvez utiliser cette page pour restaurer vos préférences aux valeurs par défaut du site. Ceci ne peut pas être défait.',
'prefs-emailconfirm-label' => 'Confirmation du courriel :',
'prefs-textboxsize' => 'Taille de la fenêtre de modification',
@@ -1414,9 +1427,15 @@ Vous pouvez également décider de laisser les autres vous contacter via votre p
'prefs-advancedrendering' => 'Options avancées',
'prefs-advancedsearchoptions' => 'Options avancées',
'prefs-advancedwatchlist' => 'Options avancées',
-'prefs-display' => 'Options d’affichage',
+'prefs-displayrc' => 'Options d’affichage',
+'prefs-displaysearchoptions' => 'Options d’affichage',
+'prefs-displaywatchlist' => 'Options d’affichage',
'prefs-diffs' => 'Différences',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Semble valide',
+'email-address-validity-invalid' => 'Une adresse valide est nécessaire !',
+
# User rights
'userrights' => 'Gestion des droits des utilisateurs',
'userrights-lookup-user' => 'Gestion des groupes d’utilisateurs',
@@ -1451,7 +1470,7 @@ Vous pouvez également décider de laisser les autres vous contacter via votre p
'group-user-member' => 'utilisateur',
'group-autoconfirmed-member' => 'utilisateur enregistré',
-'group-bot-member' => 'bot',
+'group-bot-member' => 'robot',
'group-sysop-member' => 'administrateur',
'group-bureaucrat-member' => 'bureaucrate',
'group-suppress-member' => 'superviseur',
@@ -1500,6 +1519,7 @@ Vous pouvez également décider de laisser les autres vous contacter via votre p
'right-hideuser' => 'Bloquer un utilisateur en masquant son nom au public',
'right-ipblock-exempt' => 'Ne pas être affecté par les IP bloquées, les blocages automatiques et les blocages de plages d’IP',
'right-proxyunbannable' => 'Ne pas être affecté par les blocages automatiques de serveurs mandataires',
+'right-unblockself' => 'Se débloquer eux-mêmes',
'right-protect' => 'Modifier le niveau de protection des pages et modifier les pages protégées',
'right-editprotected' => 'Modifier les pages protégées (sans protection en cascade)',
'right-editinterface' => 'Modifier l’interface utilisateur',
@@ -1522,7 +1542,6 @@ Vous pouvez également décider de laisser les autres vous contacter via votre p
'right-siteadmin' => 'Verrouiller ou déverrouiller la base de données',
'right-reset-passwords' => 'Changer le mot de passe d’autres utilisateurs',
'right-override-export-depth' => 'Exporter les pages en incluant les pages liées jusqu’à une profondeur de 5 niveaux',
-'right-versiondetail' => 'Voir les informations étendues sur les versions des logiciels',
'right-sendemail' => 'Envoyer un courriel aux autres utilisateurs',
# User rights log
@@ -1573,14 +1592,9 @@ Vous pouvez également décider de laisser les autres vous contacter via votre p
'recentchanges-legend' => 'Options des modifications récentes',
'recentchangestext' => 'Piste les changements les plus récents du wiki sur cette page.',
'recentchanges-feed-description' => 'Suivre les dernières modifications de ce wiki dans un flux.',
-'recentchanges-label-legend' => 'Légende : $1.',
-'recentchanges-legend-newpage' => '$1 - nouvelle page',
'recentchanges-label-newpage' => 'Cette modification a créé une nouvelle page',
-'recentchanges-legend-minor' => '$1 - modification mineure',
'recentchanges-label-minor' => 'Cette modification est mineure',
-'recentchanges-legend-bot' => '$1 - modification faite par un robot',
'recentchanges-label-bot' => 'Cette modification a été effectuée par un robot.',
-'recentchanges-legend-unpatrolled' => '$1 - modification non patrouillée',
'recentchanges-label-unpatrolled' => 'Cette modification n’a pas encore été patrouillée.',
'rcnote' => 'Voici {{PLURAL:$1|la dernière modification effectuée|les $1 dernières modifications effectuées}} durant {{PLURAL:$2|la dernière journée|les <b>$2</b> derniers jours}} jusqu’à $5 le $4.',
'rcnotefrom' => "Voici les modifications effectuées depuis le '''$2''' ('''$1''' au maximum).",
@@ -1626,6 +1640,9 @@ Vous pouvez également décider de laisser les autres vous contacter via votre p
'upload_directory_missing' => 'Le répertoire de téléversement ($1) est introuvable et n’a pas pu être créé par le serveur web.',
'upload_directory_read_only' => 'Le répertoire de téléversement ($1) n’est pas accessible en écriture depuis le serveur web.',
'uploaderror' => 'Erreur de téléversement',
+'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 téléverser des fichiers sur le serveur.
Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. Les téléversements sont aussi enregistrés dans le [[Special:Log/upload|journal des téléversements]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
@@ -1660,6 +1677,17 @@ Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentatio
'filetype-banned-type' => "'''« .$1 »''' n’est pas une extension de fichier autorisée.
{{PLURAL:$3|Le type de fichiers accepté est|Les types de fichiers acceptés sont}} $2.",
'filetype-missing' => 'Le fichier n’a aucune extension (comme « .jpg » par exemple).',
+'empty-file' => 'Le fichier que vous avez soumis était vide.',
+'file-too-large' => 'Le fichier que vous avez soumis était trop grand.',
+'filename-tooshort' => 'Le nom du fichier est trop court.',
+'filetype-banned' => 'Ce type de fichier est interdit.',
+'verification-error' => 'Ce fichier ne passe pas la vérification des fichiers.',
+'hookaborted' => 'La modification que vous avez essayé de faire a été arrêtée par un crochet d’une extension.',
+'illegal-filename' => 'Le nom du fichier n’est pas autorisé.',
+'overwrite' => 'Écraser un fichier existant n’est pas autorisé.',
+'unknown-error' => 'Une erreur inconnue s’est produite.',
+'tmp-create-error' => 'Impossible de créer le fichier temporaire.',
+'tmp-write-error' => 'Erreur d’écriture du fichier temporaire.',
'large-file' => 'Les fichiers téléversés ne devraient pas dépasser $1 ; ce fichier fait $2.',
'largefileserver' => 'La taille de ce fichier est supérieure au maximum autorisé.',
'emptyfile' => 'Le fichier que vous voulez téléverser semble vide.
@@ -1687,13 +1715,14 @@ Si vous voulez toujours téléverser votre fichier, merci de retourner en arriè
Si vous voulez toujours téléverser votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ce fichier est un doublon {{PLURAL:$1|du fichier suivant|des fichiers suivants}} :',
'file-deleted-duplicate' => 'Un fichier identique à celui-ci ([[:$1]]) a déjà été supprimé. Vous devriez vérifier le journal des suppressions de ce fichier avant de le téléverser à nouveau.',
-'successfulupload' => 'Téléversement effectué avec succès',
'uploadwarning' => 'Attention !',
'uploadwarning-text' => 'Modifiez la description du fichier et essayez de nouveau.',
'savefile' => 'Sauvegarder le fichier',
'uploadedimage' => 'a téléversé « [[$1]] »',
'overwroteimage' => 'a téléversé une nouvelle version de « [[$1]] »',
'uploaddisabled' => 'Désolé, le téléversement de fichiers est désactivé.',
+'copyuploaddisabled' => 'Téléversement de fichier par URL désactivé.',
+'uploadfromurl-queued' => 'Votre téléversement a été mis dans la file d’attente.',
'uploaddisabledtext' => 'Le téléversement de fichiers est désactivé sur ce wiki.',
'php-uploaddisabledtext' => 'Le téléversement de fichiers a été désactivé dans PHP. Vérifiez l’option de configuration file_uploads.',
'uploadscripted' => 'Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.',
@@ -1727,6 +1756,14 @@ JD # Jenoptik
MGP # Pentax
PICT # divers
#</pre><!-- laisser cette ligne telle quelle -->',
+'upload-success-subj' => 'Téléversement effectué avec succès',
+'upload-success-msg' => 'Votre téléversement depuis [$2] a réussi. Il est disponible ici : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problème de téléversement',
+'upload-failure-msg' => 'Il y a eu un problème avec votre import depuis [$2] :
+
+$1',
+'upload-warning-subj' => 'Avertissement lors du téléversement',
+'upload-warning-msg' => 'Un problème est survenu lors de votre téléversement depuis [$2]. Vous pouvez revenir au [[Special:Upload/stash/$1|formulaire de téléversement]] pour le résoudre.',
'upload-proto-error' => 'Protocole incorrect',
'upload-proto-error-text' => 'Le téléversement requiert des URL commençant par <code>http://</code> ou <code>ftp://</code>.',
@@ -1789,6 +1826,7 @@ Cliquer sur un en-tête de colonne permet de changer l’ordre d’affichage.',
'listfiles_search_for' => 'Rechercher un nom de média :',
'imgfile' => 'fichier',
'listfiles' => 'Liste de fichiers',
+'listfiles_thumb' => 'Miniature',
'listfiles_date' => 'Date',
'listfiles_name' => 'Nom',
'listfiles_user' => 'Utilisateur',
@@ -1904,8 +1942,8 @@ N’oubliez pas de vérifier s’il n’y a pas d’autres liens vers les modèl
'statistics-edits' => 'Modifications de pages depuis l’installation de {{SITENAME}}',
'statistics-edits-average' => 'Nombre moyen de modifications par page',
'statistics-views-total' => 'Visites',
+'statistics-views-total-desc' => 'Les vues des pages non existantes et des pages spéciales ne sont pas incluses',
'statistics-views-peredit' => 'Visites par modification',
-'statistics-jobqueue' => 'Longueur de la [http://www.mediawiki.org/wiki/Manual:Job_queue liste d’attente de traitement]',
'statistics-users' => '[[Special:ListUsers|Utilisateurs]] enregistrés',
'statistics-users-active' => 'Utilisateurs actifs',
'statistics-users-active-desc' => 'Utilisateurs ayant fait au moins une action durant {{PLURAL:$1|le dernier jours|les $1 derniers jours}}',
@@ -1920,7 +1958,7 @@ Une page est considérée comme une page d’homonymie si elle inclut (directeme
'doubleredirects' => 'Doubles redirections',
'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
Chaque entrée contient des liens vers la première et la seconde redirections, ainsi que la première ligne de texte de la seconde page, ce qui fournit habituellement la « vraie » page cible, vers laquelle la première redirection devrait rediriger.
-Les entrées <s>barrées</s> ont été résolues.',
+Les entrées <del>barrées</del> ont été résolues.',
'double-redirect-fixed-move' => 'Cette redirection, dont la cible [[$1]] a été renommée, mène maintenant vers [[$2]].',
'double-redirect-fixer' => 'Correcteur de redirection',
@@ -1943,6 +1981,8 @@ Les entrées <s>barrées</s> ont été résolues.',
'nmembers' => '$1 membre{{PLURAL:$1||s}}',
'nrevisions' => '$1 version{{PLURAL:$1||s}}',
'nviews' => '$1 consultation{{PLURAL:$1||s}}',
+'nimagelinks' => 'Utilisé sur $1 {{PLURAL:$1|page|pages}}',
+'ntransclusions' => 'Utilisé sur $1 {{PLURAL:$1|page|pages}}',
'specialpage-empty' => 'Il n’y a aucun résultat à afficher.',
'lonelypages' => 'Pages orphelines',
'lonelypagestext' => 'Les pages suivantes ne sont ni pointées, ni incluses par d’autres pages du wiki.',
@@ -2100,34 +2140,40 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
'listgrouprights-removegroup-self-all' => 'Peut se retirer tous les groupes de son propre compte',
# E-mail user
-'mailnologin' => 'Pas d’adresse d’expéditeur',
-'mailnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d’autres utilisateurs.',
-'emailuser' => 'Lui envoyer un courriel',
-'emailpage' => 'Envoyer un courriel à l’utilisateur',
-'emailpagetext' => 'Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à cet utilisateur.
+'mailnologin' => 'Pas d’adresse d’expéditeur',
+'mailnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d’autres utilisateurs.',
+'emailuser' => 'Lui envoyer un courriel',
+'emailpage' => 'Envoyer un courriel à l’utilisateur',
+'emailpagetext' => 'Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à cet utilisateur.
L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.',
-'usermailererror' => 'Erreur dans l’objet du courriel :',
-'defemailsubject' => 'Courriel de {{SITENAME}}',
-'noemailtitle' => 'Aucune adresse de courriel',
-'noemailtext' => 'Cet utilisateur n’a pas spécifié une adresse de courriel valide.',
-'nowikiemailtitle' => 'Pas de courriel autorisé',
-'nowikiemailtext' => 'Cet utilisateur a choisi de ne pas recevoir de courriel de la part d’autre utilisateurs.',
-'email-legend' => 'Envoyer un courriel à un autre utilisateur de {{SITENAME}}',
-'emailfrom' => 'Expéditeur :',
-'emailto' => 'Destinataire :',
-'emailsubject' => 'Objet :',
-'emailmessage' => 'Message :',
-'emailsend' => 'Envoyer',
-'emailccme' => 'M’envoyer par courriel une copie de mon message.',
-'emailccsubject' => 'Copie de votre message à $1 : $2',
-'emailsent' => 'Courriel envoyé',
-'emailsenttext' => 'Votre message a été envoyé par courriel.',
-'emailuserfooter' => 'Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l’utilisateur » de {{SITENAME}}.',
+'usermailererror' => 'Erreur dans l’objet du courriel :',
+'defemailsubject' => 'Courriel de {{SITENAME}}',
+'usermaildisabled' => 'L’envoi de courriels entre utilisateurs est désactivé',
+'usermaildisabledtext' => 'Vous ne pouvez pas envoyer de courriels à d’autres utilisateurs sur ce wiki',
+'noemailtitle' => 'Aucune adresse de courriel',
+'noemailtext' => 'Cet utilisateur n’a pas spécifié une adresse de courriel valide.',
+'nowikiemailtitle' => 'Pas de courriel autorisé',
+'nowikiemailtext' => 'Cet utilisateur a choisi de ne pas recevoir de courriel de la part d’autre utilisateurs.',
+'email-legend' => 'Envoyer un courriel à un autre utilisateur de {{SITENAME}}',
+'emailfrom' => 'Expéditeur :',
+'emailto' => 'Destinataire :',
+'emailsubject' => 'Objet :',
+'emailmessage' => 'Message :',
+'emailsend' => 'Envoyer',
+'emailccme' => 'M’envoyer par courriel une copie de mon message.',
+'emailccsubject' => 'Copie de votre message à $1 : $2',
+'emailsent' => 'Courriel envoyé',
+'emailsenttext' => 'Votre message a été envoyé par courriel.',
+'emailuserfooter' => 'Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l’utilisateur » de {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'A laissé un message système.',
+'usermessage-editor' => 'Messager du système',
# Watchlist
'watchlist' => 'Liste de suivi',
'mywatchlist' => 'Liste de suivi',
-'watchlistfor' => "(pour '''$1''')",
+'watchlistfor2' => 'Pour $1 $2',
'nowatchlist' => 'Votre liste de suivi ne référence aucune page.',
'watchlistanontext' => 'Veuillez vous $1 pour visualiser ou modifier les éléments de votre liste de suivi.',
'watchnologin' => 'Non connecté',
@@ -2186,6 +2232,9 @@ Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pa
Votre système de notification de {{SITENAME}}
--
+Pour modifier les paramètres de notification par courriel, visitez
+{{fullurl:{{#special:Preferences}}}}
+
Pour modifier les paramètres de votre liste de suivi, visitez
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2246,7 +2295,10 @@ La dernière modification de la page a été effectuée par [[User:$3|$3]] ([[Us
'revertpage-nouser' => 'Révocation des modifications par (nom d’utilisateur supprimé) à la dernière version par [[User:$1|$1]]',
'rollback-success' => 'Révocation des modifications effectuées par $1 ;
rétablissement de la dernière version par $2.',
-'sessionfailure' => 'Votre session de connexion semble avoir des problèmes ;
+
+# Edit tokens
+'sessionfailure-title' => 'Erreur de session',
+'sessionfailure' => 'Votre session de connexion semble avoir des problèmes ;
cette action a été annulée en prévention d’un piratage de session.
Veuillez cliquer sur « Précédent », rechargez la page d’où vous venez, puis réessayez.',
@@ -2382,18 +2434,22 @@ $1',
'month' => 'À partir du mois (et précédents) :',
'year' => 'À partir de l’année (et précédentes) :',
-'sp-contributions-newbies' => 'Ne montrer que les contributions des nouveaux utilisateurs',
-'sp-contributions-newbies-sub' => 'Parmi les nouveaux comptes',
-'sp-contributions-newbies-title' => 'Contributions d’utilisateurs parmi les nouveaux comptes',
-'sp-contributions-blocklog' => 'journal des blocages',
-'sp-contributions-deleted' => 'contributions supprimées',
-'sp-contributions-logs' => 'journaux',
-'sp-contributions-talk' => 'discuter',
-'sp-contributions-userrights' => 'gérer les droits',
-'sp-contributions-blocked-notice' => 'Cet utilisateur est actuellement bloqué. La dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :',
-'sp-contributions-search' => 'Rechercher les contributions',
-'sp-contributions-username' => 'Adresse IP ou nom d’utilisateur :',
-'sp-contributions-submit' => 'Rechercher',
+'sp-contributions-newbies' => 'Ne montrer que les contributions des nouveaux utilisateurs',
+'sp-contributions-newbies-sub' => 'Parmi les nouveaux comptes',
+'sp-contributions-newbies-title' => 'Contributions d’utilisateurs parmi les nouveaux comptes',
+'sp-contributions-blocklog' => 'journal des blocages',
+'sp-contributions-deleted' => 'contributions supprimées',
+'sp-contributions-uploads' => 'imports',
+'sp-contributions-logs' => 'journaux',
+'sp-contributions-talk' => 'discuter',
+'sp-contributions-userrights' => 'gérer les droits',
+'sp-contributions-blocked-notice' => 'Cet utilisateur est actuellement bloqué. La dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :',
+'sp-contributions-blocked-notice-anon' => 'Cette adresse IP est actuellement bloquée.
+La dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :',
+'sp-contributions-search' => 'Rechercher les contributions',
+'sp-contributions-username' => 'Adresse IP ou nom d’utilisateur :',
+'sp-contributions-toponly' => 'Ne montrer que les articles dont je suis le dernier contributeur',
+'sp-contributions-submit' => 'Rechercher',
# What links here
'whatlinkshere' => 'Pages liées',
@@ -2454,7 +2510,6 @@ Consultez la [[Special:IPBlockList|liste des adresses IP et comptes bloqués]] p
'ipb-edit-dropdown' => 'Modifier les motifs de blocage par défaut',
'ipb-unblock-addr' => 'Débloquer $1',
'ipb-unblock' => 'Débloquer un compte utilisateur ou une adresse IP',
-'ipb-blocklist-addr' => 'Blocages existants pour $1',
'ipb-blocklist' => 'Voir les blocages existants',
'ipb-blocklist-contribs' => 'Contributions pour $1',
'unblockip' => 'Débloquer un utilisateur ou une adresse IP',
@@ -2528,6 +2583,8 @@ Veuillez contacter votre fournisseur d’accès Internet ou votre support techni
Vous ne pouvez pas créer un compte.',
'cant-block-while-blocked' => 'Vous ne pouvez pas bloquer d’autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.',
'cant-see-hidden-user' => "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
+'ipbblocked' => 'Vous ne pouvez pas bloquer ou débloquer d’autres utilisateurs, parce que vous êtes vous-même bloqué',
+'ipbnounblockself' => 'Vous n’êtes pas autorisé à vous débloquer vous-même',
# Developer tools
'lockdb' => 'Verrouiller la base de données',
@@ -2559,6 +2616,15 @@ Notez que la page ne sera '''pas''' renommée s’il existe déjà une page avec
'''Attention !'''
Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
+'movepagetext-noredirectfixer' => "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.
+L’ancien titre deviendra une page de redirection vers le nouveau titre.
+Vérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].
+Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.
+
+Notez que la page ne sera '''pas''' déplacée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné, et il est impossible d’écraser une page existante.
+
+'''Attention !'''
+Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
'movepagetalktext' => "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''
* vous déplacez la page vers un autre espace de noms, ou
* une page de discussion non vide existe déjà sous le nouveau nom, ou
@@ -2616,6 +2682,7 @@ impossible de renommer une page sur elle-même.',
'immobile-source-page' => 'Cette page n’est pas renommable.',
'immobile-target-page' => 'Il n’est pas possible de renommer la page vers ce titre.',
'imagenocrossnamespace' => 'Impossible de renommer un fichier vers un espace de noms autre que fichier.',
+'nonfile-cannot-move-to-file' => "Impossible de renommer quelque chose d’autre qu'un fichier vers l’espace de noms fichier.",
'imagetypemismatch' => 'La nouvelle extension de ce fichier ne correspond pas à son type.',
'imageinvalidfilename' => 'Le nom du fichier cible est incorrect',
'fix-double-redirects' => 'Mettre à jour les redirections pointant vers le titre original',
@@ -2694,6 +2761,7 @@ Sauvegardez-le sur votre disque dur puis téléversez-le ici.',
'importstart' => 'Importation des pages…',
'import-revision-count' => '$1 version{{PLURAL:$1||s}}',
'importnopages' => 'Aucune page à importer.',
+'imported-log-entries' => '$1 {{PLURAL:$1|entrée|entrées}} du journal {{PLURAL:$1|importée|importées}}.',
'importfailed' => 'Échec de l’importation : <nowiki>$1</nowiki>',
'importunknownsource' => 'Type inconnu de la source à importer',
'importcantopen' => 'Impossible d’ouvrir le fichier à importer',
@@ -2792,6 +2860,8 @@ Vous pouvez toutefois en visualiser la source.',
'tooltip-rollback' => '« Révoquer » annule en un clic la ou les modification(s) de cette page par son dernier contributeur.',
'tooltip-undo' => '« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
Permet de rétablir la version précédente et d’ajouter un motif dans la boîte de résumé.',
+'tooltip-preferences-save' => 'Sauvegarder les préférences',
+'tooltip-summary' => 'Entrez un bref résumé',
# Stylesheets
'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
@@ -2917,17 +2987,20 @@ $1',
# Media information
'mediawarning' => "'''Attention :''' ce type de fichier peut contenir du code malveillant.
Si vous l’exécutez, votre système peut être compromis.",
-'imagemaxsize' => "Taille maximale des images :<br />''(pour les pages de description de fichiers)''",
+'imagemaxsize' => "Taille maximale des images :<br />''(pour les pages de description de fichier)''",
'thumbsize' => 'Taille de la miniature :',
'widthheightpage' => '$1 × $2, $3 page{{PLURAL:$3||s}}',
'file-info' => 'Taille du fichier : $1, type MIME : $2',
-'file-info-size' => '($1 × $2 pixels, taille du fichier : $3, type MIME : $4)',
+'file-info-size' => '$1 × $2 pixels, taille du fichier : $3, type MIME : $4',
'file-nohires' => '<small>Pas de plus haute résolution disponible.</small>',
-'svg-long-desc' => '(Fichier SVG, résolution de $1 × $2 pixels, taille : $3)',
+'svg-long-desc' => 'Fichier SVG, résolution de $1 × $2 pixels, taille : $3',
'show-big-image' => 'Image en plus haute résolution',
'show-big-image-thumb' => '<small>Taille de cet aperçu : $1 × $2 pixels</small>',
'file-info-gif-looped' => 'en boucle',
'file-info-gif-frames' => '$1 {{PLURAL:$1|image|images}}',
+'file-info-png-looped' => 'en boucle',
+'file-info-png-repeat' => 'joué $1 {{PLURAL:$1|fois|fois}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|image|images}}',
# Special:NewFiles
'newimages' => 'Galerie des nouveaux fichiers',
@@ -3080,6 +3153,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
'exif-gpsareainformation' => 'Nom de la zone GPS',
'exif-gpsdatestamp' => 'Date GPS',
'exif-gpsdifferential' => 'Correction différentielle GPS',
+'exif-objectname' => 'Titre court',
# EXIF attributes
'exif-compression-1' => 'Non compressé',
@@ -3242,31 +3316,31 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
'limitall' => 'tous',
# E-mail address confirmation
-'confirmemail' => 'Confirmer l’adresse de courriel',
-'confirmemail_noemail' => 'Vous n’avez pas défini une adresse de courriel valide dans vos [[Special:Preferences|préférences]].',
-'confirmemail_text' => 'Ce wiki nécessite la vérification de votre adresse de courriel avant de pouvoir utiliser toute fonction de messagerie.
+'confirmemail' => 'Confirmer l’adresse de courriel',
+'confirmemail_noemail' => 'Vous n’avez pas défini une adresse de courriel valide dans vos [[Special:Preferences|préférences]].',
+'confirmemail_text' => 'Ce wiki nécessite la vérification de votre adresse de courriel avant de pouvoir utiliser toute fonction de messagerie.
Utilisez le bouton ci-dessous pour envoyer un courriel de confirmation à votre adresse.
Le courriel inclura un lien comportant un code à usage unique et limité dans le temps ;
chargez ce lien dans votre navigateur pour confirmer que votre adresse de courriel est valide.',
-'confirmemail_pending' => 'Un code de confirmation vous a déjà été envoyé par courriel ;
+'confirmemail_pending' => 'Un code de confirmation vous a déjà été envoyé par courriel ;
si vous venez de créer votre compte, veuillez attendre quelques minutes que le courriel arrive avant de demander un nouveau code.',
-'confirmemail_send' => 'Envoyer un code de confirmation',
-'confirmemail_sent' => 'Courriel de confirmation envoyé',
-'confirmemail_oncreate' => 'Un code de confirmation a été envoyé à votre adresse de courriel.
+'confirmemail_send' => 'Envoyer un code de confirmation',
+'confirmemail_sent' => 'Courriel de confirmation envoyé',
+'confirmemail_oncreate' => 'Un code de confirmation a été envoyé à votre adresse de courriel.
Ce code n’est pas requis pour vous identifier sur ce wiki, mais vous devrez le fournir pour activer toute fonction de messagerie.',
-'confirmemail_sendfailed' => '{{SITENAME}} n’a pas pu vous envoyer le courriel de confirmation.
+'confirmemail_sendfailed' => '{{SITENAME}} n’a pas pu vous envoyer le courriel de confirmation.
Veuillez vérifiez que votre adresse de courriel ne comprend aucun caractère incorrect.
Le programme d’envoi de courriel a retourné l’indication suivante : $1',
-'confirmemail_invalid' => 'Code de confirmation incorrect.
+'confirmemail_invalid' => 'Code de confirmation incorrect.
Celui-ci a peut-être expiré.',
-'confirmemail_needlogin' => 'Vous devez vous $1 pour confirmer votre adresse de courriel.',
-'confirmemail_success' => 'Votre adresse de courriel a été confirmée.
+'confirmemail_needlogin' => 'Vous devez vous $1 pour confirmer votre adresse de courriel.',
+'confirmemail_success' => 'Votre adresse de courriel a été confirmée.
Vous pouvez maintenant vous [[Special:UserLogin|{{MediaWiki:Loginreqlink}}]] et profiter du wiki.',
-'confirmemail_loggedin' => 'Votre adresse de courriel est maintenant confirmée.',
-'confirmemail_error' => 'Un problème est survenu lors de l’enregistrement de votre confirmation.',
-'confirmemail_subject' => 'Confirmation d’adresse de courriel pour {{SITENAME}}',
-'confirmemail_body' => 'Quelqu’un, probablement vous, à partir de l’adresse IP $1,
+'confirmemail_loggedin' => 'Votre adresse de courriel est maintenant confirmée.',
+'confirmemail_error' => 'Un problème est survenu lors de l’enregistrement de votre confirmation.',
+'confirmemail_subject' => 'Confirmation d’adresse de courriel pour {{SITENAME}}',
+'confirmemail_body' => 'Quelqu’un, probablement vous, à partir de l’adresse IP $1,
a enregistré un compte « $2 » avec cette adresse de courriel
sur le site {{SITENAME}}.
@@ -3283,8 +3357,38 @@ confirmation de votre adresse courriel :
$5
Ce code de confirmation expirera le $4.',
-'confirmemail_invalidated' => 'Confirmation de l’adresse courriel annulée',
-'invalidateemail' => 'Annuler la confirmation de l’adresse de courriel',
+'confirmemail_body_changed' => 'Quelqu’un, probablement vous, à partir de l’adresse IP $1,
+a modifié l’adresse de courriel associée au compte « $2 » de {{SITENAME}}
+en cette adresse.
+
+Pour confirmer que ce compte vous appartient vraiment et afin
+de réactiver les fonctions de messagerie sur {{SITENAME}},
+veuillez suivre ce lien dans votre navigateur :
+
+$3
+
+Si ce compte ne vous appartient *pas*, n’ouvrez pas ce lien ;
+vous pouvez suivre l’autre lien ci-dessous pour annuler la
+confirmation de votre adresse courriel :
+
+$5
+
+Ce code de confirmation expirera le $4.',
+'confirmemail_body_set' => "Quelqu'un, probablement vous, de l'adresse IP address $1,
+a modifié l'adresse de courriel du compte « $2 » à cette adresse sur {{SITENAME}}.
+
+Pour confirmer que ce compte vous appartient et réactiver les fonctions de courriel
+sur {{SITENAME}}, ouvrez ce lien dans votre navigateur web :
+
+$3
+
+Si le compte ne vous appartient PAS, suivez plutôt ce lien pour annuler la confirmation de l'adresse de courriel :
+
+$5
+
+Ce code de confirmation expirera le $4.",
+'confirmemail_invalidated' => 'Confirmation de l’adresse courriel annulée',
+'invalidateemail' => 'Annuler la confirmation de l’adresse de courriel',
# Scary transclusion
'scarytranscludedisabled' => '[La transclusion interwiki est désactivée]',
@@ -3330,7 +3434,8 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
'table_pager_first' => 'Première page',
'table_pager_last' => 'Dernière page',
'table_pager_limit' => 'Afficher $1 éléments par page',
-'table_pager_limit_submit' => 'Accéder',
+'table_pager_limit_label' => 'Résultats par page :',
+'table_pager_limit_submit' => 'Envoyer',
'table_pager_empty' => 'Aucun résultat',
# Auto-summaries
@@ -3346,7 +3451,7 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
'size-gigabytes' => '$1 Go',
# Live preview
-'livepreview-loading' => 'Chargement…',
+'livepreview-loading' => 'Chargement...',
'livepreview-ready' => 'Chargement … terminé !',
'livepreview-failed' => 'L’aperçu rapide a échoué !
Essayez la prévisualisation normale.',
@@ -3399,6 +3504,7 @@ Vous pouvez aussi [[Special:Watchlist/edit|utiliser l’éditeur normal]].',
'version-specialpages' => 'Pages spéciales',
'version-parserhooks' => 'Greffons du parseur',
'version-variables' => 'Variables',
+'version-skins' => 'Habillages',
'version-other' => 'Divers',
'version-mediahandlers' => 'Manipulateurs de médias',
'version-hooks' => 'Greffons',
@@ -3410,6 +3516,13 @@ Vous pouvez aussi [[Special:Watchlist/edit|utiliser l’éditeur normal]].',
'version-hook-subscribedby' => 'Abonnés :',
'version-version' => '(Version $1)',
'version-license' => 'Licence',
+'version-poweredby-credits' => "Ce wiki fonctionne grâce à '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'autres',
+'version-license-info' => "MediaWiki est un logiciel libre, vous pouvez le redistribuer et / ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.
+
+MediaWiki est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.
+
+Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licence Publique Générale GNU] avec ce programme, sinon, écrivez à la Free Software Foundation, Inc, 51, rue Franklin, cinquième étage, Boston, MA 02110-1301, États-Unis ou [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lisez-la en ligne].",
'version-software' => 'Logiciels installés',
'version-software-product' => 'Produit',
'version-software-version' => 'Version',
@@ -3480,6 +3593,15 @@ Entrez le nom du fichier sans le préfixe « {{ns:file}}: ».',
'tags-edit' => 'modifier',
'tags-hitcount' => '$1 modification{{PLURAL:$1||s}}',
+# Special:ComparePages
+'comparepages' => 'Comparer des pages',
+'compare-selector' => 'Comparer les versions des pages',
+'compare-page1' => 'Page 1',
+'compare-page2' => 'Page 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Comparer',
+
# Database error messages
'dberr-header' => 'Ce wiki a un problème',
'dberr-problems' => 'Désolé ! Ce site rencontre des difficultés techniques.',
@@ -3496,8 +3618,13 @@ Entrez le nom du fichier sans le préfixe « {{ns:file}}: ».',
'htmlform-float-invalid' => 'La valeur que vous avez spécifiée n’est pas un nombre.',
'htmlform-int-toolow' => 'La valeur que vous avez spécifiée est plus petite que le minimum de $1',
'htmlform-int-toohigh' => 'La valeur que vous avez spécifiée est plus grande que le maximum de $1',
+'htmlform-required' => 'Cette valeur est requise',
'htmlform-submit' => 'Soumettre',
'htmlform-reset' => 'Défaire les modifications',
'htmlform-selectorother-other' => 'Autre',
+# SQLite database support
+'sqlite-has-fts' => '$1 avec recherche en texte intégral supportée',
+'sqlite-no-fts' => '$1 sans recherche en texte intégral supportée',
+
);
diff --git a/languages/messages/MessagesFrc.php b/languages/messages/MessagesFrc.php
index aaeb1311..99b4e749 100644
--- a/languages/messages/MessagesFrc.php
+++ b/languages/messages/MessagesFrc.php
@@ -29,8 +29,7 @@ $messages = array(
'tog-editsection' => 'Changer une section avec les liens [changer]',
'tog-editsectiononrightclick' => 'Changer une section en faisant un clic droit sus son nom (JavaScript)',
'tog-showtoc' => 'Montrer la table des matières (pour les pages avec plus que 3 têtes)',
-'tog-rememberpassword' => 'Garder mon mot de passe',
-'tog-editwidth' => 'Montrer la fenêtre des changements en pleine largeur',
+'tog-rememberpassword' => 'Garder mon mot de passe (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Additionner les pages que je crée à ma liste des pages guettées',
'tog-watchdefault' => 'Additionner les pages que je change à ma liste des pages guettées',
'tog-watchmoves' => 'Additionner les pages que je renomme à ma liste des pages guettées',
@@ -327,7 +326,7 @@ Votre compte a été créé. Oubliez pas de changer votre réglage sus {{SITENA
'yourname' => "Nom d'useur:",
'yourpassword' => 'Mot de passe:',
'yourpasswordagain' => 'Mot de passe encore:',
-'remembermypassword' => 'Se rappeler de mon mot de passe:',
+'remembermypassword' => 'Se rappeler de mon mot de passe (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Votre domaine:',
'externaldberror' => "Soit y avait une erreur avec la base d'information de certification extérieur, soit vous avez pas la permission de renouveler votre compte extérieur.",
'login' => 'Connecter',
@@ -472,7 +471,7 @@ Vous pouvez [[Special:Search/{{PAGENAME}}|charcher pour le titre de cette page]]
'usercsspreview' => "'''Rappelez-vous que vous êtes après regarder votre feuille CSS qu'a pas encore été sauvée!'''",
'userjspreview' => "'''Rappelez-vous que vous êtes juste après regarder ou tester votre code JavaScript qu'a pas encore été sauvé!'''",
'userinvalidcssjstitle' => "'''Attention:''' Y a pas de style \"\$1\". Rappelez-vous qu'il faut user les petites lettres dans le sujet des pages personnelles avec les extensions .css et .js.
-Exemple: {{ns:user}}:Foo/monobook.css (bon) {{ns:user}}:Foo/Monobook.css (mauvais)",
+Exemple: {{ns:user}}:Foo/vector.css (bon) {{ns:user}}:Foo/Vector.css (mauvais)",
'updated' => '(Renouvelé)',
'note' => "'''Notez:'''",
'previewnote' => "'''Ça ici, c'est juste une vue d'avance; les changements ont pas encore été sauvés!'''",
@@ -500,7 +499,6 @@ Il foudra que vous mettez vos changements dans le texte qu'est là asteur.
'yourdiff' => 'Différences',
'copyrightwarning' => "Notez donc que toutes les contributions à {{SITENAME}} sont considérées d'être libérées sous le $2 (voyez $1 pour les détails). Si vous voulez pas que votre écriture soye changée sans pitié et redistribuée à volonté, mettez donc pas votre écriture ici.<br /> Vous êtes après nous promettre aussi que vous l'avez écrit vous-même ou que vous l'avez copié du domain public ou un autre ressource libre. ''' METTEZ PAS DE L'OUVRAGE SOUS COPYRIGHT ICI SANS PERMISSION!'''",
'copyrightwarning2' => "Notez donc que toutes les contributions à {{SITENAME}} pourriont être changées ou ôtées par des autres useurs. Si vous voulez pas que votre écriture soye changée sans pitié, mettez donc pas votre écriture ici.<br /> Vous êtes après nous promettre aussi que vous l'avez écrit vous-même ou que vous l'avez copié du domain public ou un autre ressource libre (voyez $1 pour les détails). ''' METTEZ PAS DE L'OUVRAGE SOUS COPYRIGHT ICI SANS PERMISSION!'''",
-'longpagewarning' => "'''ATTENTION: Cette page a une taille de $1 kilobytes; ça pourrait créer des problèmes quand un useur assaye de changer une page qu'a une taille qu'est plus grande que 32 kb. Considérez donc de couper la page en morceaux plus courts.'''",
'longpageerror' => "'''ERREUR: Le texte que vous avec mis a une taille de $1 kilobytes qu'est plus grande que le maximum de $2 kilobytes. Ça peut pas être sauvé.'''",
'readonlywarning' => "'''ATTENTION: La base d'information a été barrée, ça fait, vous serez pas capable de sauver votres changements asteur. Vous ferait mieux de copier et coller le texte dans un dossier texte et le sauver pour plus tard.'''",
'protectedpagewarning' => "'''ATTENTION: Cette page a été barrée pour que ça peuve être changée juste par les administrateurs.'''",
diff --git a/languages/messages/MessagesFrp.php b/languages/messages/MessagesFrp.php
index 0df90297..fd086718 100644
--- a/languages/messages/MessagesFrp.php
+++ b/languages/messages/MessagesFrp.php
@@ -51,94 +51,94 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redirèccions dobles', 'RedirèccionsDobles' ),
- 'BrokenRedirects' => array( 'Redirèccions câsses', 'RedirèccionsCâsses' ),
- 'Disambiguations' => array( 'Homonimia', 'Homonimies', 'Pâges d\'homonimia', 'PâgesDHomonimia' ),
+ 'DoubleRedirects' => array( 'Redirèccions_dobles', 'RedirèccionsDobles' ),
+ 'BrokenRedirects' => array( 'Redirèccions_câsses', 'RedirèccionsCâsses' ),
+ 'Disambiguations' => array( 'Homonimia', 'Homonimies', 'Pâges_d\'homonimia', 'PâgesDHomonimia' ),
'Userlogin' => array( 'Branchiér', 'Branchement' ),
'Userlogout' => array( 'Dèbranchiér', 'Dèbranchement' ),
- 'CreateAccount' => array( 'Fâre un compto', 'FâreUnCompto' ),
+ 'CreateAccount' => array( 'Fâre_un_compto', 'FâreUnCompto' ),
'Preferences' => array( 'Prèferences' ),
- 'Watchlist' => array( 'Lista de survelyence', 'ListaDeSurvelyence', 'Survelyence' ),
- 'Recentchanges' => array( 'Dèrriérs changements', 'DèrriérsChangements' ),
+ 'Watchlist' => array( 'Lista_de_survelyence', 'ListaDeSurvelyence', 'Survelyence' ),
+ 'Recentchanges' => array( 'Dèrriérs_changements', 'DèrriérsChangements' ),
'Upload' => array( 'Tèlèchargiér', 'Tèlèchargement' ),
- 'Listfiles' => array( 'Lista des fichiérs', 'ListaDesFichiérs', 'Lista de les émâges', 'ListaDeLesÉmâges' ),
- 'Newimages' => array( 'Novéls fichiérs', 'NovélsFichiérs', 'Émâges novèles', 'ÉmâgesNovèles' ),
- 'Listusers' => array( 'Lista ux utilisators', 'ListaUxUtilisators', 'Utilisators' ),
- 'Listgrouprights' => array( 'Lista des drêts a les tropes d\'utilisators', 'ListaDesDrêtsALesTropesDUtilisators' ),
+ 'Listfiles' => array( 'Lista_des_fichiérs', 'ListaDesFichiérs', 'Lista_de_les_émâges', 'ListaDeLesÉmâges' ),
+ 'Newimages' => array( 'Novéls_fichiérs', 'NovélsFichiérs', 'Émâges_novèles', 'ÉmâgesNovèles' ),
+ 'Listusers' => array( 'Lista_ux_utilisators', 'ListaUxUtilisators', 'Utilisators' ),
+ 'Listgrouprights' => array( 'Lista_des_drêts_a_les_tropes_d\'utilisators', 'ListaDesDrêtsALesTropesDUtilisators' ),
'Statistics' => array( 'Statistiques' ),
- 'Randompage' => array( 'Pâge a l\'hasârd', 'PâgeALHasârd' ),
- 'Lonelypages' => array( 'Pâges orfenes', 'PâgesOrfenes' ),
- 'Uncategorizedpages' => array( 'Pâges sen catègorie', 'PâgesSenCatègorie' ),
- 'Uncategorizedcategories' => array( 'Catègories sen catègorie', 'CatègoriesSenCatègorie' ),
- 'Uncategorizedimages' => array( 'Fichiérs sen catègorie', 'FichiérsSenCatègorie', 'Émâges sen catègorie', 'ÉmâgesSenCatègorie' ),
- 'Uncategorizedtemplates' => array( 'Modèlos sen catègorie', 'ModèlosSenCatègorie' ),
- 'Unusedcategories' => array( 'Catègories inutilisâs', 'CatègoriesInutilisâs' ),
- 'Unusedimages' => array( 'Fichiérs inutilisâs', 'FichiérsInutilisâs', 'Émâges inutilisâs', 'ÉmâgesInutilisâs' ),
- 'Wantedpages' => array( 'Pâges les ples demandâs', 'PâgesLesPlesDemandâs', 'Lims câssos', 'LimsCâssos' ),
- 'Wantedcategories' => array( 'Catègories les ples demandâs', 'CatègoriesLesPlesDemandâs' ),
- 'Wantedfiles' => array( 'Fichiérs los ples demandâs', 'FichiérsLosPlesDemandâs' ),
- 'Wantedtemplates' => array( 'Modèlos los ples demandâs', 'ModèlosLosPlesDemandâs' ),
- 'Mostlinked' => array( 'Pâges les ples liyês', 'PâgesLesPlesLiyês' ),
- 'Mostlinkedcategories' => array( 'Catègories les ples liyês', 'CatègoriesLesPlesLiyês', 'Catègories les ples utilisâs', 'CatègoriesLesPlesUtilisâs' ),
- 'Mostlinkedtemplates' => array( 'Modèlos los ples liyês', 'ModèlosLosPlesLiyês', 'Modèlos los ples utilisâs', 'ModèlosLosPlesUtilisâs' ),
- 'Mostimages' => array( 'Fichiérs los ples liyês', 'FichiérsLosPlesLiyês', 'Fichiérs los ples utilisâs', 'FichiérsLosPlesUtilisâs', 'Émâges les ples liyês', 'ÉmâgesLesPlesLiyês', 'Émâges les ples utilisâs', 'ÉmâgesLesPlesUtilisâs' ),
- 'Mostcategories' => array( 'Pâges utilisent lo més de catègories', 'PâgesUtilisentLoMésDeCatègories' ),
- 'Mostrevisions' => array( 'Pâges les ples changiês', 'PâgesLesPlesChangiês' ),
- 'Fewestrevisions' => array( 'Pâges les muens changiês', 'PâgesLesMuensChangiês' ),
- 'Shortpages' => array( 'Pâges côrtes', 'PâgesCôrtes' ),
- 'Longpages' => array( 'Pâges longes', 'PâgesLonges' ),
- 'Newpages' => array( 'Pâges novèles', 'PâgesNovèles' ),
- 'Ancientpages' => array( 'Pâges les muens dèrriérement changiês', 'PâgesLesMuensDèrriérementChangiês' ),
- 'Deadendpages' => array( 'Pâges en cul-de-sac', 'PâgesEnCulDeSac' ),
- 'Protectedpages' => array( 'Pâges protègiês', 'PâgesProtègiês' ),
- 'Protectedtitles' => array( 'Titros protègiês', 'TitrosProtègiês' ),
- 'Allpages' => array( 'Totes les pâges', 'TotesLesPâges' ),
- 'Prefixindex' => array( 'Endèxe des prèfixos', 'EndèxeDesPrèfixos' ),
- 'Ipblocklist' => array( 'Lista des blocâjos', 'ListaDesBlocâjos', 'Blocâjos', 'Utilisators blocâs', 'UtilisatorsBlocâs', 'Adrèces IP blocâs', 'AdrècesIPBlocâs' ),
- 'Specialpages' => array( 'Pâges spèciâles', 'PâgesSpèciâles' ),
+ 'Randompage' => array( 'Pâge_a_l\'hasârd', 'PâgeALHasârd' ),
+ 'Lonelypages' => array( 'Pâges_orfenes', 'PâgesOrfenes' ),
+ 'Uncategorizedpages' => array( 'Pâges_sen_catègorie', 'PâgesSenCatègorie' ),
+ 'Uncategorizedcategories' => array( 'Catègories_sen_catègorie', 'CatègoriesSenCatègorie' ),
+ 'Uncategorizedimages' => array( 'Fichiérs_sen_catègorie', 'FichiérsSenCatègorie', 'Émâges_sen_catègorie', 'ÉmâgesSenCatègorie' ),
+ 'Uncategorizedtemplates' => array( 'Modèlos_sen_catègorie', 'ModèlosSenCatègorie' ),
+ 'Unusedcategories' => array( 'Catègories_inutilisâs', 'CatègoriesInutilisâs' ),
+ 'Unusedimages' => array( 'Fichiérs_inutilisâs', 'FichiérsInutilisâs', 'Émâges_inutilisâs', 'ÉmâgesInutilisâs' ),
+ 'Wantedpages' => array( 'Pâges_les_ples_demandâs', 'PâgesLesPlesDemandâs', 'Lims_câssos', 'LimsCâssos' ),
+ 'Wantedcategories' => array( 'Catègories_les_ples_demandâs', 'CatègoriesLesPlesDemandâs' ),
+ 'Wantedfiles' => array( 'Fichiérs_los_ples_demandâs', 'FichiérsLosPlesDemandâs' ),
+ 'Wantedtemplates' => array( 'Modèlos_los_ples_demandâs', 'ModèlosLosPlesDemandâs' ),
+ 'Mostlinked' => array( 'Pâges_les_ples_liyês', 'PâgesLesPlesLiyês' ),
+ 'Mostlinkedcategories' => array( 'Catègories_les_ples_liyês', 'CatègoriesLesPlesLiyês', 'Catègories_les_ples_utilisâs', 'CatègoriesLesPlesUtilisâs' ),
+ 'Mostlinkedtemplates' => array( 'Modèlos_los_ples_liyês', 'ModèlosLosPlesLiyês', 'Modèlos_los_ples_utilisâs', 'ModèlosLosPlesUtilisâs' ),
+ 'Mostimages' => array( 'Fichiérs_los_ples_liyês', 'FichiérsLosPlesLiyês', 'Fichiérs_los_ples_utilisâs', 'FichiérsLosPlesUtilisâs', 'Émâges_les_ples_liyês', 'ÉmâgesLesPlesLiyês', 'Émâges_les_ples_utilisâs', 'ÉmâgesLesPlesUtilisâs' ),
+ 'Mostcategories' => array( 'Pâges_utilisent_lo_més_de_catègories', 'PâgesUtilisentLoMésDeCatègories' ),
+ 'Mostrevisions' => array( 'Pâges_les_ples_changiês', 'PâgesLesPlesChangiês' ),
+ 'Fewestrevisions' => array( 'Pâges_les_muens_changiês', 'PâgesLesMuensChangiês' ),
+ 'Shortpages' => array( 'Pâges_côrtes', 'PâgesCôrtes' ),
+ 'Longpages' => array( 'Pâges_longes', 'PâgesLonges' ),
+ 'Newpages' => array( 'Pâges_novèles', 'PâgesNovèles' ),
+ 'Ancientpages' => array( 'Pâges_les_muens_dèrriérement_changiês', 'PâgesLesMuensDèrriérementChangiês' ),
+ 'Deadendpages' => array( 'Pâges_en_cul-de-sac', 'PâgesEnCulDeSac' ),
+ 'Protectedpages' => array( 'Pâges_protègiês', 'PâgesProtègiês' ),
+ 'Protectedtitles' => array( 'Titros_protègiês', 'TitrosProtègiês' ),
+ 'Allpages' => array( 'Totes_les_pâges', 'TotesLesPâges' ),
+ 'Prefixindex' => array( 'Endèxe_des_prèfixos', 'EndèxeDesPrèfixos' ),
+ 'Ipblocklist' => array( 'Lista_des_blocâjos', 'ListaDesBlocâjos', 'Blocâjos', 'Utilisators_blocâs', 'UtilisatorsBlocâs', 'Adrèces_IP_blocâs', 'AdrècesIPBlocâs' ),
+ 'Specialpages' => array( 'Pâges_spèciâles', 'PâgesSpèciâles' ),
'Contributions' => array( 'Contribucions' ),
- 'Emailuser' => array( 'Mandar un mèssâjo', 'MandarUnMèssâjo', 'Mèssâjo' ),
- 'Confirmemail' => array( 'Confirmar l\'adrèce èlèctronica', 'ConfirmarLAdrèceÈlèctronica' ),
- 'Whatlinkshere' => array( 'Pâges liyês', 'PâgesLiyês' ),
- 'Recentchangeslinked' => array( 'Survelyence des lims', 'SurvelyenceDesLims' ),
- 'Movepage' => array( 'Renomar una pâge', 'RenomarUnaPâge', 'Changement de nom', 'ChangementDeNom' ),
+ 'Emailuser' => array( 'Mandar_un_mèssâjo', 'MandarUnMèssâjo', 'Mèssâjo' ),
+ 'Confirmemail' => array( 'Confirmar_l\'adrèce_èlèctronica', 'ConfirmarLAdrèceÈlèctronica' ),
+ 'Whatlinkshere' => array( 'Pâges_liyês', 'PâgesLiyês' ),
+ 'Recentchangeslinked' => array( 'Survelyence_des_lims', 'SurvelyenceDesLims' ),
+ 'Movepage' => array( 'Renomar_una_pâge', 'RenomarUnaPâge', 'Changement_de_nom', 'ChangementDeNom' ),
'Blockme' => array( 'Blocâd-mè', 'BlocâdMè' ),
- 'Booksources' => array( 'Ôvres de refèrence', 'ÔvresDeRefèrence' ),
+ 'Booksources' => array( 'Ôvres_de_refèrence', 'ÔvresDeRefèrence' ),
'Categories' => array( 'Catègories' ),
'Export' => array( 'Èxportar', 'Èxportacion' ),
'Version' => array( 'Vèrsion' ),
- 'Allmessages' => array( 'Mèssâjos sistèmo', 'MèssâjosSistèmo' ),
+ 'Allmessages' => array( 'Mèssâjos_sistèmo', 'MèssâjosSistèmo' ),
'Log' => array( 'Jornal', 'Jornals' ),
'Blockip' => array( 'Blocar', 'Blocâjo' ),
'Undelete' => array( 'Refâre', 'Rèstoracion' ),
'Import' => array( 'Importar', 'Importacion' ),
- 'Lockdb' => array( 'Vèrrolyér la bâsa de balyês', 'VèrrolyérLaBâsaDeBalyês' ),
- 'Unlockdb' => array( 'Dèvèrrolyér la bâsa de balyês', 'DèvèrrolyérLaBâsaDeBalyês' ),
- 'Userrights' => array( 'Drêts d\'utilisator', 'DrêtsDUtilisator' ),
- 'MIMEsearch' => array( 'Rechèrche per tipo de contegnu MIME', 'RechèrchePerTipoDeContegnuMIME' ),
- 'FileDuplicateSearch' => array( 'Rechèrche des fichiérs en doblo', 'RechèrcheDesFichiérsEnDoblo' ),
- 'Unwatchedpages' => array( 'Pâges pas siuvues', 'PâgesPasSiuvues' ),
- 'Listredirects' => array( 'Lista de les redirèccions', 'ListaDeLesRedirèccions' ),
- 'Revisiondelete' => array( 'Vèrsions suprimâs', 'VèrsionsSuprimâs' ),
- 'Unusedtemplates' => array( 'Modèlos inutilisâs', 'ModèlosInutilisâs' ),
- 'Randomredirect' => array( 'Redirèccion a l\'hasârd', 'RedirèccionALHasârd' ),
- 'Mypage' => array( 'Ma pâge', 'MaPâge' ),
- 'Mytalk' => array( 'Mes discussions', 'MesDiscussions' ),
- 'Mycontributions' => array( 'Mes contribucions', 'MesContribucions' ),
- 'Listadmins' => array( 'Lista ux administrators', 'ListaUxAdministrators' ),
- 'Listbots' => array( 'Lista ux bots', 'ListaUxBots' ),
- 'Popularpages' => array( 'Pâges les ples consultâs', 'PâgesLesPlesConsultâs' ),
+ 'Lockdb' => array( 'Vèrrolyér_la_bâsa_de_balyês', 'VèrrolyérLaBâsaDeBalyês' ),
+ 'Unlockdb' => array( 'Dèvèrrolyér_la_bâsa_de_balyês', 'DèvèrrolyérLaBâsaDeBalyês' ),
+ 'Userrights' => array( 'Drêts_d\'utilisator', 'DrêtsDUtilisator' ),
+ 'MIMEsearch' => array( 'Rechèrche_per_tipo_de_contegnu_MIME', 'RechèrchePerTipoDeContegnuMIME' ),
+ 'FileDuplicateSearch' => array( 'Rechèrche_des_fichiérs_en_doblo', 'RechèrcheDesFichiérsEnDoblo' ),
+ 'Unwatchedpages' => array( 'Pâges_pas_siuvues', 'PâgesPasSiuvues' ),
+ 'Listredirects' => array( 'Lista_de_les_redirèccions', 'ListaDeLesRedirèccions' ),
+ 'Revisiondelete' => array( 'Vèrsions_suprimâs', 'VèrsionsSuprimâs' ),
+ 'Unusedtemplates' => array( 'Modèlos_inutilisâs', 'ModèlosInutilisâs' ),
+ 'Randomredirect' => array( 'Redirèccion_a_l\'hasârd', 'RedirèccionALHasârd' ),
+ 'Mypage' => array( 'Ma_pâge', 'MaPâge' ),
+ 'Mytalk' => array( 'Mes_discussions', 'MesDiscussions' ),
+ 'Mycontributions' => array( 'Mes_contribucions', 'MesContribucions' ),
+ 'Listadmins' => array( 'Lista_ux_administrators', 'ListaUxAdministrators' ),
+ 'Listbots' => array( 'Lista_ux_bots', 'ListaUxBots' ),
+ 'Popularpages' => array( 'Pâges_les_ples_consultâs', 'PâgesLesPlesConsultâs' ),
'Search' => array( 'Rechèrchiér', 'Rechèrche' ),
- 'Resetpass' => array( 'Changement de mot de pâssa', 'ChangementDeMotDePâssa' ),
- 'Withoutinterwiki' => array( 'Pâges sen lims entèrlengoues', 'PâgesSenLimsEntèrlengoues', 'Pâges sen lims entèrvouiqui', 'PâgesSenLimsEntèrvouiqui' ),
- 'MergeHistory' => array( 'Fusionar los historicos', 'FusionarLosHistoricos' ),
- 'Filepath' => array( 'Chemin d\'accès du fichiér', 'CheminDAccèsDuFichiér' ),
- 'Invalidateemail' => array( 'Envalidar l\'adrèce èlèctronica', 'EnvalidarLAdrèceÈlèctronica' ),
- 'Blankpage' => array( 'Pâge voueda', 'PâgeVoueda' ),
- 'LinkSearch' => array( 'Rechèrche de lims', 'RechèrcheDeLims' ),
- 'DeletedContributions' => array( 'Contribucions suprimâs', 'ContribucionsSuprimâs' ),
+ 'Resetpass' => array( 'Changement_de_mot_de_pâssa', 'ChangementDeMotDePâssa' ),
+ 'Withoutinterwiki' => array( 'Pâges_sen_lims_entèrlengoues', 'PâgesSenLimsEntèrlengoues', 'Pâges_sen_lims_entèrvouiqui', 'PâgesSenLimsEntèrvouiqui' ),
+ 'MergeHistory' => array( 'Fusionar_los_historicos', 'FusionarLosHistoricos' ),
+ 'Filepath' => array( 'Chemin_d\'accès_du_fichiér', 'CheminDAccèsDuFichiér' ),
+ 'Invalidateemail' => array( 'Envalidar_l\'adrèce_èlèctronica', 'EnvalidarLAdrèceÈlèctronica' ),
+ 'Blankpage' => array( 'Pâge_voueda', 'PâgeVoueda' ),
+ 'LinkSearch' => array( 'Rechèrche_de_lims', 'RechèrcheDeLims' ),
+ 'DeletedContributions' => array( 'Contribucions_suprimâs', 'ContribucionsSuprimâs' ),
'Tags' => array( 'Balises' ),
- 'Activeusers' => array( 'Utilisators actifs', 'UtilisatorsActifs' ),
+ 'Activeusers' => array( 'Utilisators_actifs', 'UtilisatorsActifs' ),
);
$magicWords = array(
@@ -205,11 +205,11 @@ $magicWords = array(
'img_none' => array( '1', 'vouedo', 'néant', 'neant', 'none' ),
'img_center' => array( '1', 'centrâ', 'centré', 'center', 'centre' ),
'img_framed' => array( '1', 'encâdrâ', 'câdro', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sen câdro', 'sans_cadre', 'sans cadre', 'non encadré', 'non encadre', 'frameless' ),
+ 'img_frameless' => array( '1', 'sen_câdro', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
'img_page' => array( '1', 'pâge=$1', 'pâge $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'bordura', 'bordure', 'border' ),
- 'img_baseline' => array( '1', 'legne de bâsa', 'ligne de base', 'base', 'baseline' ),
+ 'img_baseline' => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'baseline' ),
'img_sub' => array( '1', 'segno', 'indice', 'ind', 'sub' ),
'img_super' => array( '1', 'èxposent', 'èxp', 'exposant', 'exp', 'super', 'sup' ),
'img_top' => array( '1', 'd\'amont', 'haut', 'top' ),
@@ -279,7 +279,7 @@ $magicWords = array(
'numberingroup' => array( '1', 'NOMBRO_D_UTILISATORS_DENS_LA_TROPA', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__REDIRÈCCION_IMOBILA__', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'NIVÉL_DE_PROTÈCCION', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'format de dâta', 'formatdate', 'dateformat' ),
+ 'formatdate' => array( '0', 'format_de_dâta', 'formatdate', 'dateformat' ),
);
$linkTrail = '/^([a-zàâçéèêîœôû·’æäåÄăëēïīòöÅùü‘]+)(.*)$/sDu';
@@ -316,8 +316,7 @@ $messages = array(
'tog-editsection' => 'Activar los lims « [changiér] » por changiér una sèccion',
'tog-editsectiononrightclick' => 'Fâre un clic drêt sur un titro de sèccion pèrmèt de changiér ceta (at fôta de JavaScript)',
'tog-showtoc' => 'Fâre vêre la trâbla de les matiéres (por les pâges qu’ont més de 3 sèccions)',
-'tog-rememberpassword' => "Sè rapelar de mon mot de pâssa sur ceti ordenator (tèmouen (''cookie''))",
-'tog-editwidth' => 'Fâre vêre la fenétra d’èdicion en plêna largior',
+'tog-rememberpassword' => 'Sè rapelar de mon branchement sur ceti navigator (por $1 jorn{{PLURAL:$1||s}} u més)',
'tog-watchcreations' => 'Apondre les pâges que fé a ma lista de survelyence',
'tog-watchdefault' => 'Apondre les pâges que chanjo a ma lista de survelyence',
'tog-watchmoves' => 'Apondre les pâges que renomo a ma lista de survelyence',
@@ -418,8 +417,8 @@ $messages = array(
'pagecategories' => 'Catègorie{{PLURAL:$1||s}}',
'category_header' => 'Pâges dens la catègorie « $1 »',
'subcategories' => 'Sot-catègories',
-'category-media-header' => 'Fichiérs multimèdia dens la catègorie « $1 »',
-'category-empty' => "''Ora, ceta catègorie contint gins de pâge, de sot-catègorie ou ben de fichiér multimèdia.''",
+'category-media-header' => 'Fichiérs mèdia dens la catègorie « $1 »',
+'category-empty' => "''Ora, ceta catègorie contint gins de pâge ou ben de fichiér mèdia.''",
'hidden-categories' => '{{PLURAL:$1|Catègorie cachiê|Catègories cachiês}}',
'hidden-category-category' => 'Catègories cachiês',
'category-subcat-count' => 'Ceta catègorie at {{PLURAL:$2|ren que la sot-catègorie|$2 sot-catègories, que {{PLURAL:$1|cela|les $1}}}} ce-desot.',
@@ -463,31 +462,21 @@ $messages = array(
'faqpage' => 'Project:FDQ',
# Vector skin
-'vector-action-addsection' => 'Apondre un sujèt',
-'vector-action-delete' => 'Suprimar',
-'vector-action-move' => 'Renomar',
-'vector-action-protect' => 'Protègiér',
-'vector-action-undelete' => 'Refâre',
-'vector-action-unprotect' => 'Dèprotègiér',
-'vector-namespace-category' => 'Catègorie',
-'vector-namespace-help' => 'Éde',
-'vector-namespace-image' => 'Fichiér',
-'vector-namespace-main' => 'Pâge',
-'vector-namespace-media' => 'Pâge du fichiér multimèdia',
-'vector-namespace-mediawiki' => 'Mèssâjo',
-'vector-namespace-project' => 'Pâge du projèt',
-'vector-namespace-special' => 'Pâge spèciâla',
-'vector-namespace-talk' => 'Discussion',
-'vector-namespace-template' => 'Modèlo',
-'vector-namespace-user' => 'Pâge utilisator',
-'vector-view-create' => 'Fâre',
-'vector-view-edit' => 'Changiér',
-'vector-view-history' => 'Fâre vêre l’historico',
-'vector-view-view' => 'Liére',
-'vector-view-viewsource' => 'Vêre lo tèxto sôrsa',
-'actions' => 'Accions',
-'namespaces' => 'Èspâços de noms',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Apondre un sujèt',
+'vector-action-delete' => 'Suprimar',
+'vector-action-move' => 'Renomar',
+'vector-action-protect' => 'Protègiér',
+'vector-action-undelete' => 'Refâre',
+'vector-action-unprotect' => 'Dèprotègiér',
+'vector-simplesearch-preference' => 'Activar los consèlys de rechèrche mèlyorâs (solament por « Vèctor »)',
+'vector-view-create' => 'Fâre',
+'vector-view-edit' => 'Changiér',
+'vector-view-history' => 'Fâre vêre l’historico',
+'vector-view-view' => 'Liére',
+'vector-view-viewsource' => 'Vêre lo tèxto sôrsa',
+'actions' => 'Accions',
+'namespaces' => 'Èspâços de noms',
+'variants' => 'Variantes',
'errorpagetitle' => 'Èrror',
'returnto' => 'Tornar a la pâge $1.',
@@ -548,6 +537,9 @@ Trop d’utilisators chèrchont a arrevar a ceta pâge.
Volyéd atendre un moment devant que vos tâchiéd de tornar arrevar a ceta pâge.
$1',
+'pool-timeout' => 'Dèpassement du dèlê pendent l’atenta du vèrrolyâjo',
+'pool-queuefull' => 'La fela d’ôvra est plêna',
+'pool-errorunknown' => 'Èrror encognua',
# 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' => 'A propôs de {{SITENAME}}',
@@ -607,7 +599,7 @@ Vêde la [[Special:Version|pâge de les vèrsions]].',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Pâge',
'nstab-user' => 'Pâge utilisator',
-'nstab-media' => 'Pâge du fichiér multimèdia',
+'nstab-media' => 'Pâge de mèdia',
'nstab-special' => 'Pâge spèciâla',
'nstab-project' => 'Pâge du projèt',
'nstab-image' => 'Fichiér',
@@ -716,7 +708,8 @@ Oubliâd pas de pèrsonalisar voutres [[Special:Preferences|prèferences dessus
'yourname' => 'Voutron nom d’utilisator :',
'yourpassword' => 'Mot de pâssa :',
'yourpasswordagain' => 'Confirmâd lo mot de pâssa :',
-'remembermypassword' => "Sè rapelar de mon mot de pâssa sur ceti ordenator (tèmouen (''cookie''))",
+'remembermypassword' => 'Sè rapelar de mon branchement sur ceti navigator (por $1 jorn{{PLURAL:$1||s}} u més)',
+'securelogin-stick-https' => 'Réstar branchiê en HTTPS aprés lo branchement',
'yourdomainname' => 'Voutron domêno :',
'externaldberror' => 'Ou ben una èrror est arrevâ avouéc la bâsa de balyês d’ôtenticacion de defôr, ou ben vos éte pas ôtorisâ a betar a jorn voutron compto de defôr.',
'login' => 'Branchement',
@@ -733,6 +726,7 @@ Oubliâd pas de pèrsonalisar voutres [[Special:Preferences|prèferences dessus
'gotaccount' => "Vos avéd ja un compto ? '''$1'''.",
'gotaccountlink' => 'Branchiéd-vos',
'createaccountmail' => 'per mèssageria èlèctronica',
+'createaccountreason' => 'Rêson :',
'badretype' => 'Los mots de pâssa que vos éd buchiês sont pas pariérs.',
'userexists' => 'Lo nom d’utilisator que vos éd buchiê est ja utilisâ.
Nen volyéd chouèsir un ôtro.',
@@ -759,6 +753,7 @@ Volyéd tornar èprovar.',
Volyéd tornar èprovar.',
'passwordtooshort' => 'Voutron mot de pâssa dêt contegnir u muens $1 caractèro{{PLURAL:$1||s}}.',
'password-name-match' => 'Voutron mot de pâssa dêt étre difèrent de voutron nom d’utilisator.',
+'password-login-forbidden' => 'L’usâjo de cél nom d’utilisator et de cél mot de pâssa at étâ dèfendu.',
'mailmypassword' => 'Recêvre un mot de pâssa novél per mèssageria èlèctronica',
'passwordremindertitle' => 'Mot de pâssa temporèro novél por {{SITENAME}}',
'passwordremindertext' => 'Quârqu’un (probâblament vos, avouéc l’adrèce IP $1) at demandâ un mot de pâssa
@@ -767,8 +762,8 @@ l’utilisator « $2 » et est « $3 ». S’o ére voutra entencion, vos vos de
branchiér et pués chouèsir un mot de pâssa novél.
Voutron mot de pâssa temporèro èxpirerat dens $5 jorn{{PLURAL:$5||s}}.
-Se vos éte pas l’ôtor de cela demanda, ou ben se vos vos rapelâd ora
-de voutron viely mot de pâssa et que vos souhètâd pas més nen changiér, vos
+Se cela demanda vint pas de vos, ou ben se vos vos rapelâd ora
+de voutron mot de pâssa et que vos souhètâd pas més nen changiér, vos
pouede ignorar ceti mèssâjo et continuar a utilisar voutron viely mot de pâssa.',
'noemail' => 'Niona adrèce èlèctronica at étâ encartâ por l’utilisator « $1 ».',
'noemailcreate' => 'Vos dête balyér una adrèce èlèctronica valida',
@@ -802,6 +797,9 @@ Volyéd atendre devant que tornar èprovar.',
'loginlanguagelabel' => 'Lengoua : $1',
'suspicious-userlogout' => "Voutra demanda de dèbranchement at étâ refusâ perce que semble qu’el at étâ mandâ per un navigator câsso ou ben la misa en cache d’un sèrvor mandatèro (''proxy'').",
+# E-mail sending
+'php-mail-error-unknown' => 'Èrror encognua dens la fonccion mail() de PHP.',
+
# Password reset dialog
'resetpass' => 'Changiér lo mot de pâssa',
'resetpass_announce' => 'Vos vos éte branchiê avouéc un mot de pâssa temporèro mandâ per mèssageria èlèctronica.
@@ -839,7 +837,7 @@ Vos éd pôt-étre ja changiê voutron mot de pâssa avouéc reusséta ou ben de
'image_sample' => 'Ègzemplo.jpg',
'image_tip' => 'Fichiér entrebetâ',
'media_sample' => 'Ègzemplo.ogg',
-'media_tip' => 'Lim de vers un fichiér multimèdia',
+'media_tip' => 'Lim de vers un fichiér mèdia',
'sig_tip' => 'Voutra signatura avouéc la dâta',
'hr_tip' => 'Legne plana (pas nen abusar)',
@@ -855,11 +853,12 @@ Vos éd pôt-étre ja changiê voutron mot de pâssa avouéc reusséta ou ben de
'showdiff' => 'Fâre vêre los changements',
'anoneditwarning' => "'''Atencion :''' vos éte pas branchiê.
Voutra adrèce IP serat encartâ dens l’historico de ceta pâge.",
+'anonpreviewwarning' => "''Vos éte pas branchiê. Sôvar encarterat voutra adrèce IP dens l’historico des changements de la pâge.''",
'missingsummary' => "'''Rapèl :''' vos éd p’oncor balyê lo rèsumâ de voutron changement.
Se vos tornâd clicar dessus « {{int:savearticle}} », voutron changement serat sôvâ sen novél avèrtissement.",
'missingcommenttext' => 'Volyéd fâre voutron comentèro ce-desot.',
'missingcommentheader' => "'''Rapèl :''' vos éd p’oncor balyê de sujèt ou ben de titro a ceti comentèro.
-Se vos tornâd clicar dessus « Sôvar ceta pâge », voutron changement serat sôvâ sen novél avèrtissement.",
+Se vos tornâd clicar dessus « {{int:savearticle}} », voutron changement serat sôvâ sen titro.",
'summary-preview' => 'Prèvisualisacion du rèsumâ :',
'subject-preview' => 'Prèvisualisacion du sujèt / titro :',
'blockedtitle' => 'L’utilisator est blocâ.',
@@ -937,8 +936,12 @@ La dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :',
'''El at p’oncor étâ sôvâ !'''",
'userjspreview' => "'''Rapelâd-vos que vos éte solament aprés èprovar ou ben prèvisualisar voutron code JavaScript.'''
'''Il at p’oncor étâ sôvâ !'''",
+'sitecsspreview' => "'''Rapelâd-vos que vos éte solament aprés prèvisualisar cela fôlye CSS.'''
+'''El at p’oncor étâ sôvâ !'''",
+'sitejspreview' => "'''Rapelâd-vos que vos éte solament aprés èprovar ou ben prèvisualisar cél code JavaScript.'''
+'''Il at p’oncor étâ sôvâ !'''",
'userinvalidcssjstitle' => "'''Atencion :''' ègziste gins d’habelyâjo « $1 ».
-Rapelâd-vos que les pâges a sè avouéc èxtensions .css et .js utilisont des titros en petiôtes lètres, per ègzemplo {{ns:user}}:Foo/monobook.css et pas {{ns:user}}:Foo/Monobook.css.",
+Rapelâd-vos que les pâges a sè avouéc èxtensions .css et .js utilisont des titros en petiôtes lètres, per ègzemplo {{ns:user}}:Foo/vector.css et pas {{ns:user}}:Foo/Vector.css.",
'updated' => '(Betâ a jorn)',
'note' => "'''Nota :'''",
'previewnote' => "'''Rapelâd-vos que ceti tèxto est ren qu’una prèvisualisacion.'''
@@ -981,9 +984,6 @@ Vos nos assurâd asse-ben que vos éd cen ècrit vos-mémo, ou ben que vos l’Ã
Se vos voléd pas que voutros ècrits seyont changiês sen gins de rèstriccion, adonc los volyéd pas sometre ique.<br />
Vos nos assurâd asse-ben que vos éd cen ècrit vos-mémo, ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico, ou ben d’una ressôrsa abada (vêde $1 por més de dètalys).
'''Utilisâd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !'''",
-'longpagewarning' => "'''ATENCION :''' ceta pâge at una longior de $1 Kio ;
-quârques navigators administront mâl lo changement de les pâges aprochient ou ben dèpassent 32 Kio.
-Pôt-étre devriâd-vos divisar la pâge en sèccions ples petiôtes.",
'longpageerror' => "'''ÈRROR : lo tèxto que vos éd somês fât $1 Kio, cen que dèpâsse la limita fixâ a $2 Kio.'''
Lo tèxto pôt pas étre sôvâ.",
'readonlywarning' => "'''Atencion : la bâsa de balyês at étâ vèrrolyê por mantegnence, vos porréd vêr pas sôvar voutros changements d’abôrd.'''
@@ -1164,10 +1164,12 @@ $1",
'logdelete-failure' => "'''La visibilitât du jornal at pas possu étre dèfenia :'''
$1",
'revdel-restore' => 'Changiér la visibilitât',
+'revdel-restore-deleted' => 'vèrsions suprimâs',
+'revdel-restore-visible' => 'vèrsions visibles',
'pagehist' => 'Historico de la pâge',
'deletedhist' => 'Historico suprimâ',
'revdelete-content' => 'contegnu',
-'revdelete-summary' => 'rèsumâ de changement',
+'revdelete-summary' => 'rèsumâ du changement',
'revdelete-uname' => 'nom d’utilisator',
'revdelete-restricted' => 'at aplicâ les rèstriccions ux administrators',
'revdelete-unrestricted' => 'rèstriccions enlevâs por los administrators',
@@ -1233,11 +1235,13 @@ Notâd bien que l’usâjo des lims de navigacion tornerat inicialisar cela colo
# Diffs
'history-title' => 'Historico de les vèrsions de « $1 »',
'difference' => '(Difèrences entre les vèrsions)',
+'difference-multipage' => '(Difèrences entre les pâges)',
'lineno' => 'Legne $1 :',
'compareselectedversions' => 'Comparar les vèrsions chouèsies',
'showhideselectedversions' => 'Fâre vêre / cachiér les vèrsions chouèsies',
'editundo' => 'dèfâre',
-'diff-multi' => '({{PLURAL:$1|Yona vèrsion entèrmèdièra cachiê|$1 vèrsions entèrmèdières cachiês}}.)',
+'diff-multi' => '({{PLURAL:$1|Yona vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per {{PLURAL:$2|yon utilisator|$2 utilisators}} {{PLURAL:$1|est pas montrâ|sont pas montrâs}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Yona vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per més de $2 utilisator{{PLURAL:$2||s}} {{PLURAL:$1|est pas montrâ|sont pas montrâs}})',
# Search results
'searchresults' => 'Rèsultats de la rechèrche',
@@ -1263,15 +1267,16 @@ Notâd bien que l’usâjo des lims de navigacion tornerat inicialisar cela colo
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechèrchiér les pâges que començont per ceti prèfixo]]',
'searchprofile-articles' => 'Pâges de contegnu',
'searchprofile-project' => 'Pâges d’éde et du projèt',
-'searchprofile-images' => 'Fichiérs multimèdia',
+'searchprofile-images' => 'Multimèdia',
'searchprofile-everything' => 'Tot',
'searchprofile-advanced' => 'Rechèrche avanciê',
'searchprofile-articles-tooltip' => 'Rechèrchiér dens $1',
'searchprofile-project-tooltip' => 'Rechèrchiér dens $1',
-'searchprofile-images-tooltip' => 'Rechèrchiér des fichiérs multimèdia',
+'searchprofile-images-tooltip' => 'Rechèrchiér des fichiérs mèdia',
'searchprofile-everything-tooltip' => 'Rechèrchiér dens tot lo seto (les pâges de discussion avouéc)',
'searchprofile-advanced-tooltip' => 'Chouèsir los èspâços de noms por la rechèrche',
'search-result-size' => '$1 ($2 mot{{PLURAL:$2||s}})',
+'search-result-category-size' => '$1 membro{{PLURAL:$1||s}} ($2 sot-catègorie{{PLURAL:$2||s}}, $3 fichiér{{PLURAL:$3||s}})',
'search-result-score' => 'Rapôrt : $1 %',
'search-redirect' => '(redirèccion dês $1)',
'search-section' => '(sèccion $1)',
@@ -1318,7 +1323,7 @@ Atencion, lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
'mypreferences' => 'Prèferences',
'prefs-edits' => 'Nombro de changements :',
'prefsnologin' => 'Pas branchiê',
-'prefsnologintext' => 'Vos dête étre <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} branchiê]</span> por changiér voutres prèferences d’utilisator.',
+'prefsnologintext' => 'Vos dête étre <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} branchiê]</span> por changiér voutres prèferences utilisator.',
'changepassword' => 'Changement du mot de pâssa',
'prefs-skin' => 'Habelyâjo',
'skin-preview' => 'Prèvisualisar',
@@ -1349,6 +1354,7 @@ Atencion, lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
'contextlines' => 'Nombro de legnes per rèponsa :',
'contextchars' => 'Nombro de caractèros de contèxto per legne :',
'stub-threshold' => 'Limita d’amont por los <a href="#" class="stub">lims de vers los començons</a> (octèts) :',
+'stub-threshold-disabled' => 'Dèsactivâ',
'recentchangesdays' => 'Nombro de jorns a fâre vêre dens los dèrriérs changements :',
'recentchangesdays-max' => '$1 jorn{{PLURAL:$1||s}} u més',
'recentchangescount' => 'Nombro de changements a fâre vêre per dèfôt :',
@@ -1382,6 +1388,7 @@ Vê-que una valor fêta per hasârd que vos pouede utilisar : $1',
'prefs-files' => 'Fichiérs',
'prefs-custom-css' => 'CSS pèrsonalisâ',
'prefs-custom-js' => 'JavaScript pèrsonalisâ',
+'prefs-common-css-js' => 'CSS / JS partagiê por tôs los habelyâjos :',
'prefs-reset-intro' => 'Vos pouede utilisar ceta pâge por rètablir voutres prèferences a les valors du seto per dèfôt.
Cen pôt pas étre dèfêt.',
'prefs-emailconfirm-label' => 'Confirmacion de la mèssageria èlèctronica :',
@@ -1411,7 +1418,7 @@ Ceta enformacion serat publica.',
'prefs-help-email' => 'U chouèx : endicar voutra adrèce èlèctronica pèrmèt de vos mandar un mot de pâssa novél se vos oubliâd lo voutro.
Vos pouede asse-ben dècidar de lèssiér los ôtros sè veriér vers vos avouéc voutra pâge de discussion, sen avêr fôta de dèvouèlar voutra identitât.',
'prefs-help-email-required' => 'Una adrèce èlèctronica est nècèssèra.',
-'prefs-info' => 'Enformacion de bâsa',
+'prefs-info' => 'Enformacions de bâsa',
'prefs-i18n' => 'Entèrnacionalisacion',
'prefs-signature' => 'Signatura',
'prefs-dateformat' => 'Format de les dâtes',
@@ -1421,9 +1428,15 @@ Vos pouede asse-ben dècidar de lèssiér los ôtros sè veriér vers vos avoué
'prefs-advancedrendering' => 'Chouèx avanciês',
'prefs-advancedsearchoptions' => 'Chouèx avanciês',
'prefs-advancedwatchlist' => 'Chouèx avanciês',
-'prefs-display' => 'Chouèx de visualisacion',
+'prefs-displayrc' => 'Chouèx de visualisacion',
+'prefs-displaysearchoptions' => 'Chouèx de visualisacion',
+'prefs-displaywatchlist' => 'Chouèx de visualisacion',
'prefs-diffs' => 'Difèrences',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'L’adrèce èlèctronica semble valida',
+'email-address-validity-invalid' => 'Buchiéd una adrèce èlèctronica valida',
+
# User rights
'userrights' => 'Administracion des drêts d’utilisator',
'userrights-lookup-user' => 'Administracion a les tropes d’utilisators',
@@ -1507,6 +1520,7 @@ Vos pouede asse-ben dècidar de lèssiér los ôtros sè veriér vers vos avoué
'right-hideuser' => 'Blocar un utilisator en cachient son nom u publico',
'right-ipblock-exempt' => 'Pas étre afèctâ per les adrèces IP blocâs, los blocâjos ôtomaticos et los blocâjos de plages d’adrèces IP',
'right-proxyunbannable' => "Pas étre afèctâ per los blocâjos ôtomaticos de sèrvors mandatèros (''proxies'')",
+'right-unblockself' => 'Sè dèblocar lor-mémos',
'right-protect' => 'Changiér lo nivél de protèccion de les pâges et changiér les pâges protègiês',
'right-editprotected' => 'Changiér les pâges protègiês (sen protèccion en cascâda)',
'right-editinterface' => 'Changiér l’entèrface de la programeria',
@@ -1529,7 +1543,6 @@ Vos pouede asse-ben dècidar de lèssiér los ôtros sè veriér vers vos avoué
'right-siteadmin' => 'Vèrrolyér ou dèvèrrolyér la bâsa de balyês',
'right-reset-passwords' => 'Changiér lo mot de pâssa d’ôtros utilisators',
'right-override-export-depth' => 'Èxportar les pâges en encllusent les pâges liyês tant qu’a una provondior de 5 nivéls',
-'right-versiondetail' => 'Vêre les enformacions ètendues sur les vèrsions de les programeries',
'right-sendemail' => 'Mandar un mèssâjo ux ôtros utilisators',
# User rights log
@@ -1580,14 +1593,9 @@ Vos pouede asse-ben dècidar de lèssiér los ôtros sè veriér vers vos avoué
'recentchanges-legend' => 'Chouèx des dèrriérs changements',
'recentchangestext' => 'Siude los dèrriérs changements du vouiqui sur ceta pâge.',
'recentchanges-feed-description' => 'Siude los dèrriérs changements du vouiqui dens ceti flux.',
-'recentchanges-label-legend' => 'Lègenda : $1.',
-'recentchanges-legend-newpage' => '$1 - pâge novèla',
'recentchanges-label-newpage' => 'Ceti changement at fêt una pâge novèla.',
-'recentchanges-legend-minor' => '$1 - petiôt changement',
'recentchanges-label-minor' => 'Ceti changement est petiôt.',
-'recentchanges-legend-bot' => '$1 - changement fêt per un bot',
'recentchanges-label-bot' => 'Ceti changement at étâ fêt per un bot.',
-'recentchanges-legend-unpatrolled' => '$1 - changement pas survelyê',
'recentchanges-label-unpatrolled' => 'Ceti changement at p’oncor étâ survelyê.',
'rcnote' => "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|lo jorn passâ|los '''$2''' jorns passâs}} tant qu’a $5 lo $4.",
'rcnotefrom' => "Vê-que los changements fêts dês lo '''$2''' ('''$1''' u més).",
@@ -1634,6 +1642,9 @@ Les pâges de voutra [[Special:Watchlist|lista de survelyence]] sont '''en grâs
'upload_directory_missing' => 'Lo rèpèrtouèro de tèlèchargement ($1) est entrovâblo et pués at pas possu étre fêt per lo sèrvor vouèbe.',
'upload_directory_read_only' => 'Lo rèpèrtouèro de tèlèchargement ($1) est pas accèssiblo en ècritura dês lo sèrvor vouèbe.',
'uploaderror' => 'Èrror pendent lo tèlèchargement',
+'upload-recreate-warning' => "'''Atencion : un fichiér avouéc cél nom at étâ suprimâ ou ben dèplaciê.'''
+
+Los jornals de les suprèssions et des changements de nom de cela pâge sont montrâs ce-desot :",
'uploadtext' => "Utilisâd ceti formulèro por tèlèchargiér des fichiérs sur lo sèrvor.
Por vêre ou rechèrchiér des émâges mandâs dês devant, vêde la [[Special:FileList|lista de les émâges]].
Los tèlèchargements sont asse-ben encartâs dens lo [[Special:Log/upload|jornal des tèlèchargements]], et les suprèssions dens lo [[Special:Log/delete|jornal de les suprèssions]].
@@ -1646,7 +1657,7 @@ Por encllure un fichiér dens una pâge, utilisâd un lim de la fôrma :
'upload-preferred' => 'Formats de fichiérs prèferâs : $1.',
'upload-prohibited' => 'Formats de fichiérs dèfendus : $1.',
'uploadlog' => 'Jornal des tèlèchargements',
-'uploadlogpage' => 'Jornal des tèlèchargements de fichiérs multimèdia',
+'uploadlogpage' => 'Jornal des tèlèchargements',
'uploadlogpagetext' => 'Vê-que la lista des dèrriérs fichiérs tèlèchargiês sur lo sèrvor.
Vêde la [[Special:NewFiles|galerie des novéls fichiérs]] por una presentacion ples visuâla.',
'filename' => 'Nom du fichiér',
@@ -1670,6 +1681,17 @@ Lo volyéd renomar et pués lo tornar tèlèchargiér.',
'filetype-banned-type' => "'''« .$1 »''' est un format de fichiér pas ôtorisâ.
{{PLURAL:$3|Lo tipo de fichiérs accèptâ est|Los tipos de fichiérs accèptâs sont}} $2.",
'filetype-missing' => 'Lo fichiér at gins d’èxtension (coment « .jpg » per ègzemplo).',
+'empty-file' => 'Lo fichiér que vos éd somês ére vouedo.',
+'file-too-large' => 'Lo fichiér que vos éd somês ére trop grant.',
+'filename-tooshort' => 'Lo nom du fichiér est trop côrt.',
+'filetype-banned' => 'Cél tipo de fichiér est dèfendu.',
+'verification-error' => 'Cél fichiér pâsse pas lo contrôlo des fichiérs.',
+'hookaborted' => 'Lo changement que vos éd tâchiê de fâre at étâ arrètâ per un grèfon d’una èxtension.',
+'illegal-filename' => 'Lo nom du fichiér est pas ôtorisâ.',
+'overwrite' => 'Ècllafar un fichiér ègzistent est pas ôtorisâ.',
+'unknown-error' => 'Una èrror encognua est arrevâ.',
+'tmp-create-error' => 'Empossiblo de fâre lo fichiér temporèro.',
+'tmp-write-error' => 'Èrror d’ècritura du fichiér temporèro.',
'large-file' => 'Los fichiérs tèlèchargiês devriant pas étre ples grant que $1 ;
cél fichiér fât $2.',
'largefileserver' => 'La talye de cél fichiér est d’amont lo nivél lo ples hôt ôtorisâ.',
@@ -1703,13 +1725,14 @@ Se vos voléd adés tèlèchargiér voutron fichiér, volyéd tornar arriér et
'file-exists-duplicate' => 'Cél fichiér est un doblo {{PLURAL:$1|de ceti fichiér|de cetos fichiérs}} :',
'file-deleted-duplicate' => 'Un fichiér pariér a ceti ([[:$1]]) at ja étâ suprimâ.
Vos devriâd controlar lo jornal de les suprèssions de cél fichiér devant que lo tornar tèlèchargiér.',
-'successfulupload' => 'Tèlèchargement fêt avouéc reusséta',
'uploadwarning' => 'Atencion !',
'uploadwarning-text' => 'Changiéd la dèscripcion du fichiér et pués tornâd èprovar.',
'savefile' => 'Sôvar lo fichiér',
'uploadedimage' => 'at tèlèchargiê « [[$1]] »',
'overwroteimage' => 'at tèlèchargiê una novèla vèrsion de « [[$1]] »',
'uploaddisabled' => 'Tèlèchargements dèsactivâs',
+'copyuploaddisabled' => 'Tèlèchargement de fichiér per URL dèsactivâ.',
+'uploadfromurl-queued' => 'Voutron tèlèchargement at étâ betâ dens la fela d’atenta.',
'uploaddisabledtext' => 'Lo tèlèchargement de fichiérs est dèsactivâ.',
'php-uploaddisabledtext' => 'Lo tèlèchargement de fichiérs at étâ dèsactivâ dens PHP.
Volyéd controlar lo chouèx de configuracion « file_uploads ».',
@@ -1745,6 +1768,14 @@ JD # Jenoptik
MGP # Pentax
PICT # de totes sôrtes
#</pre> <!-- lèssiéd ceta legne justo d’ense -->',
+'upload-success-subj' => 'Tèlèchargement fêt avouéc reusséta',
+'upload-success-msg' => 'Voutron tèlèchargement dês [$2] at reussi. Il est disponiblo ique : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problèmo de tèlèchargement',
+'upload-failure-msg' => 'Y at avu un problèmo avouéc voutron tèlèchargement dês [$2] :
+
+$1',
+'upload-warning-subj' => 'Avèrtissement pendent lo tèlèchargement',
+'upload-warning-msg' => 'Un problèmo est arrevâ pendent voutron tèlèchargement dês [$2]. Vos pouede tornar u [[Special:Upload/stash/$1|formulèro de tèlèchargement]] por trovar la solucion.',
'upload-proto-error' => 'Protocolo fôx',
'upload-proto-error-text' => 'Lo tèlèchargement a distance at fôta des URLs que començont per <code>http://</code> ou ben <code>ftp://</code>.',
@@ -1808,9 +1839,10 @@ Vos pouede asse-ben tornar èprovar a una hora de muendra afluence.',
'listfiles-summary' => 'Ceta pâge spèciâla montre tôs los fichiérs tèlèchargiês.
Per dèfôt, los dèrriérs fichiérs tèlèchargiês sont montrâs d’amont la lista.
Clicar sur un en-téta de colona pèrmèt de changiér l’ôrdre de visualisacion.',
-'listfiles_search_for' => 'Rechèrchiér un nom d’un fichiér multimèdia :',
+'listfiles_search_for' => 'Rechèrchiér un nom de mèdia :',
'imgfile' => 'fichiér',
'listfiles' => 'Lista des fichiérs',
+'listfiles_thumb' => 'Figura',
'listfiles_date' => 'Dâta',
'listfiles_name' => 'Nom',
'listfiles_user' => 'Utilisator',
@@ -1854,6 +1886,7 @@ La dèscripcion de sa [$2 pâge de dèscripcion] est montrâ ce-desot.',
'uploadnewversion-linktext' => 'Tèlèchargiér una novèla vèrsion de ceti fichiér',
'shared-repo-from' => 'de $1',
'shared-repo' => 'un dèpôt de fichiérs partagiê',
+'filepage.css' => '/* Lo code CSS betâ ique est encllu dens la pâge de dèscripcion du fichiér, et pués dens los vouiquis cliants ètrangiérs. */',
# File reversion
'filerevert' => 'Rètablir $1',
@@ -1925,8 +1958,8 @@ Oubliâd pas de controlar s’y at pas d’ôtros lims de vers los modèlos deva
'statistics-edits' => 'Changements de pâges dês l’enstalacion de {{SITENAME}}',
'statistics-edits-average' => 'Nombro moyen de changements per pâge',
'statistics-views-total' => 'Soma de les visualisacions',
+'statistics-views-total-desc' => 'Les visualisacions de les pâges pas ègzistentes et de les pâges spèciâles sont pas encllues',
'statistics-views-peredit' => 'Visualisacions per changement',
-'statistics-jobqueue' => 'Longior de la [http://www.mediawiki.org/wiki/Manual:Job_queue lista d’atenta de trètament]',
'statistics-users' => '[[Special:ListUsers|Utilisators]] encartâs',
'statistics-users-active' => 'Utilisators actifs',
'statistics-users-active-desc' => 'Utilisators qu’ont fêt u muens una accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
@@ -1941,7 +1974,7 @@ Una pâge est trètâ coment una pâge d’homonimia s’encllut (tot drêt ou b
'doubleredirects' => 'Redirèccions dobles',
'doubleredirectstext' => 'Vê-que la lista de les pâges que redirijont vers des pâges que sont lor-mémes des pâges de redirèccion.
Châque entrâ contint des lims de vers la premiére et la seconda redirèccion, et pués la premiére legne de tèxto de la seconda pâge, cen que balye habituèlament la « veré » pâge ciba, de vers laquinta la premiére redirèccion devrêt redirigiér.
-Les entrâs <s>barrâs</s> ont étâ solucionâs.',
+Les entrâs <del>barrâs</del> ont étâ solucionâs.',
'double-redirect-fixed-move' => 'Cela redirèccion, que la ciba [[$1]] at étâ renomâ, mène ora vers [[$2]].',
'double-redirect-fixer' => 'Corrèctor de redirèccion',
@@ -1964,6 +1997,8 @@ Les entrâs <s>barrâs</s> ont étâ solucionâs.',
'nmembers' => '$1 membro{{PLURAL:$1||s}}',
'nrevisions' => '$1 vèrsion{{PLURAL:$1||s}}',
'nviews' => '$1 visualisacion{{PLURAL:$1||s}}',
+'nimagelinks' => 'Utilisâ dessus $1 pâge{{PLURAL:$1||s}}',
+'ntransclusions' => 'utilisâ dessus $1 pâge{{PLURAL:$1||s}}',
'specialpage-empty' => 'Y at gins de rèsultat a fâre vêre.',
'lonelypages' => 'Pâges orfenes',
'lonelypagestext' => 'Cetes pâges sont pas liyês ou ben encllues dês d’ôtres pâges de {{SITENAME}}.',
@@ -2057,7 +2092,7 @@ Contint sûrement yon ou ben un mouél de caractèros que pôvont pas étre util
# Special:Categories
'categories' => 'Catègories',
-'categoriespagetext' => '{{PLURAL:$1|Ceta catègorie est utilisâ|Cetes catègories sont utilisâs}} per des pâges ou ben des fichiérs multimèdia.
+'categoriespagetext' => '{{PLURAL:$1|Ceta catègorie contint|Cetes catègories contegnont}} des pâges ou ben des fichiérs mèdia.
Les [[Special:UnusedCategories|catègories inutilisâs]] sont pas montrâs ique.
Vêde asse-ben les [[Special:WantedCategories|catègories les ples demandâs]].',
'categoriesfrom' => 'Fâre vêre les catègories dês :',
@@ -2123,34 +2158,40 @@ Y pôt avêr [[{{MediaWiki:Listgrouprights-helppage}}|més d’enformacions]] su
'listgrouprights-removegroup-self-all' => 'Sè pôt enlevar totes les tropes de son prôpro compto',
# E-mail user
-'mailnologin' => 'Gins d’adrèce d’èxpèdior',
-'mailnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê]] et avêr endicâ una adrèce èlèctronica valida dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.',
-'emailuser' => 'Lui mandar un mèssâjo',
-'emailpage' => 'Mandar un mèssâjo a l’utilisator',
-'emailpagetext' => 'Vos pouede utilisar lo formulèro ce-desot por mandar un mèssâjo a ceti utilisator.
+'mailnologin' => 'Gins d’adrèce d’èxpèdior',
+'mailnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê]] et avêr endicâ una adrèce èlèctronica valida dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.',
+'emailuser' => 'Lui mandar un mèssâjo',
+'emailpage' => 'Mandar un mèssâjo a l’utilisator',
+'emailpagetext' => 'Vos pouede utilisar lo formulèro ce-desot por mandar un mèssâjo a ceti utilisator.
L’adrèce èlèctronica que vos éd endicâ dens voutres [[Special:Preferences|prèferences]] aparètrat dedens lo champ « Èxpèdior » de voutron mèssâjo ; d’ense, lo dèstinatèro vos porrat rèpondre tot drêt.',
-'usermailererror' => 'Èrror dens lo sujèt du mèssâjo :',
-'defemailsubject' => 'Mèssâjo de {{SITENAME}}',
-'noemailtitle' => 'Dèstinatèro sen adrèce èlèctronica',
-'noemailtext' => 'Ceti utilisator at pas spècefiâ una adrèce èlèctronica valida.',
-'nowikiemailtitle' => 'Gins de mèssageria èlèctronica ôtorisâ',
-'nowikiemailtext' => 'Ceti utilisator at chouèsi de pas recêvre de mèssâjo de la pârt d’ôtros utilisators.',
-'email-legend' => 'Mandar un mèssâjo a un ôtro utilisator de {{SITENAME}}',
-'emailfrom' => 'Èxpèdior :',
-'emailto' => 'Dèstinatèro :',
-'emailsubject' => 'Sujèt :',
-'emailmessage' => 'Mèssâjo :',
-'emailsend' => 'Mandar',
-'emailccme' => 'Mè mandar per mèssageria èlèctronica una copia de mon mèssâjo.',
-'emailccsubject' => 'Copia de voutron mèssâjo a $1 : $2',
-'emailsent' => 'Mèssâjo mandâ',
-'emailsenttext' => 'Voutron mèssâjo at étâ mandâ per mèssageria èlèctronica.',
-'emailuserfooter' => 'Ceti mèssâjo at étâ mandâ per « $1 » a « $2 » per la fonccion « Lui mandar un mèssâjo » de {{SITENAME}}.',
+'usermailererror' => 'Èrror dens lo sujèt du mèssâjo :',
+'defemailsubject' => 'Mèssâjo de {{SITENAME}}',
+'usermaildisabled' => 'L’èxpèdicion de mèssâjos entre-mié utilisators est dèsactivâ',
+'usermaildisabledtext' => 'Vos pouede pas mandar des mèssâjos a d’ôtros utilisators sur ceti vouiqui',
+'noemailtitle' => 'Dèstinatèro sen adrèce èlèctronica',
+'noemailtext' => 'Ceti utilisator at pas spècefiâ una adrèce èlèctronica valida.',
+'nowikiemailtitle' => 'Gins de mèssageria èlèctronica ôtorisâ',
+'nowikiemailtext' => 'Ceti utilisator at chouèsi de pas recêvre de mèssâjo de la pârt d’ôtros utilisators.',
+'email-legend' => 'Mandar un mèssâjo a un ôtro utilisator de {{SITENAME}}',
+'emailfrom' => 'Èxpèdior :',
+'emailto' => 'Dèstinatèro :',
+'emailsubject' => 'Sujèt :',
+'emailmessage' => 'Mèssâjo :',
+'emailsend' => 'Mandar',
+'emailccme' => 'Mè mandar per mèssageria èlèctronica una copia de mon mèssâjo.',
+'emailccsubject' => 'Copia de voutron mèssâjo a $1 : $2',
+'emailsent' => 'Mèssâjo mandâ',
+'emailsenttext' => 'Voutron mèssâjo at étâ mandâ per mèssageria èlèctronica.',
+'emailuserfooter' => 'Ceti mèssâjo at étâ mandâ per « $1 » a « $2 » per la fonccion « Lui mandar un mèssâjo » de {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'At lèssiê un mèssâjo sistèmo.',
+'usermessage-editor' => 'Mèssagiér du sistèmo',
# Watchlist
'watchlist' => 'Lista de survelyence',
'mywatchlist' => 'Lista de survelyence',
-'watchlistfor' => "(por '''$1''')",
+'watchlistfor2' => 'Por $1 $2',
'nowatchlist' => 'Voutra lista de survelyence contint gins d’èlèment.',
'watchlistanontext' => 'Vos volyéd $1 por fâre vêre ou changiér los èlèments de voutra lista de survelyence.',
'watchnologin' => 'Pas branchiê',
@@ -2211,6 +2252,9 @@ Vos pouede asse-ben tornar inicialisar los drapéls de notificacion por totes le
Voutron sistèmo de notificacion de {{SITENAME}}
--
+Por changiér los paramètres de notificacion per mèssageria èlèctronica, visitâd
+{{fullurl:{{#special:Preferences}}}}
+
Por changiér los paramètres de voutra lista de survelyence, visitâd
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2272,7 +2316,10 @@ Lo dèrriér changement de la pâge at étâ fêt per [[User:$3|$3]] ([[User tal
'revertpage-nouser' => 'Rèvocacion des changements per (nom d’utilisator suprimâ) a la dèrriére vèrsion per [[User:$1|$1]]',
'rollback-success' => 'Rèvocacion des changements fêts per $1 ;
rètablissement de la dèrriére vèrsion per $2.',
-'sessionfailure' => 'Voutra sèance de branchement semble avêr des problèmos ;
+
+# Edit tokens
+'sessionfailure-title' => 'Èrror de sèance',
+'sessionfailure' => 'Voutra sèance de branchement semble avêr des problèmos ;
cela accion at étâ anulâ en prèvencion d’un piratâjo de sèance.
Volyéd clicar dessus « Devant », rechargiér la pâge de yô que vos vegnéd, et pués tornar èprovar.',
@@ -2409,19 +2456,23 @@ $1',
'month' => 'Dês lo mês (et devant) :',
'year' => 'Dês l’an (et devant) :',
-'sp-contributions-newbies' => 'Fâre vêre ren que les contribucions ux novéls utilisators',
-'sp-contributions-newbies-sub' => 'Permié los comptos novéls',
-'sp-contributions-newbies-title' => 'Contribucions d’utilisators permié los comptos novéls',
-'sp-contributions-blocklog' => 'jornal des blocâjos',
-'sp-contributions-deleted' => 'contribucions suprimâs',
-'sp-contributions-logs' => 'jornals',
-'sp-contributions-talk' => 'discutar',
-'sp-contributions-userrights' => 'administrar los drêts d’utilisator',
-'sp-contributions-blocked-notice' => 'Ceti utilisator est ora blocâ.
+'sp-contributions-newbies' => 'Fâre vêre ren que les contribucions ux novéls utilisators',
+'sp-contributions-newbies-sub' => 'Permié los comptos novéls',
+'sp-contributions-newbies-title' => 'Contribucions d’utilisators permié los comptos novéls',
+'sp-contributions-blocklog' => 'jornal des blocâjos',
+'sp-contributions-deleted' => 'contribucions suprimâs',
+'sp-contributions-uploads' => 'tèlèchargements',
+'sp-contributions-logs' => 'jornals',
+'sp-contributions-talk' => 'discutar',
+'sp-contributions-userrights' => 'administrar los drêts d’utilisator',
+'sp-contributions-blocked-notice' => 'Ceti utilisator est ora blocâ.
+La dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :',
+'sp-contributions-blocked-notice-anon' => 'Ceta adrèce IP est ora blocâ.
La dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :',
-'sp-contributions-search' => 'Rechèrchiér les contribucions',
-'sp-contributions-username' => 'Adrèce IP ou ben nom d’utilisator :',
-'sp-contributions-submit' => 'Rechèrchiér',
+'sp-contributions-search' => 'Rechèrchiér les contribucions',
+'sp-contributions-username' => 'Adrèce IP ou ben nom d’utilisator :',
+'sp-contributions-toponly' => 'Montrar ren que les novèles vèrsions',
+'sp-contributions-submit' => 'Rechèrchiér',
# What links here
'whatlinkshere' => 'Pâges liyês',
@@ -2482,7 +2533,6 @@ Vêde la [[Special:IPBlockList|lista ux utilisators et a les adrèces IP blocâs
'ipb-edit-dropdown' => 'Changiér les rêsons de blocâjo',
'ipb-unblock-addr' => 'Dèblocar $1',
'ipb-unblock' => 'Dèblocar un compto utilisator ou ben una adrèce IP',
-'ipb-blocklist-addr' => 'Blocâjos ègzistents por $1',
'ipb-blocklist' => 'Vêde los blocâjos ègzistents',
'ipb-blocklist-contribs' => 'Contribucions por $1',
'unblockip' => 'Dèblocar l’utilisator',
@@ -2559,6 +2609,8 @@ Vos volyéd veriér vers voutron fornissor d’accès u Malyâjo ou ben voutra a
Vos pouede pas fâre un compto.",
'cant-block-while-blocked' => 'Vos pouede pas blocar d’ôtros utilisators tant que vos éte blocâ.',
'cant-see-hidden-user' => 'L’utilisator que vos tâchiéd de blocar at ja étâ blocâ et cachiê. Pas èyent lo drêt hideuser, vos pouede pas vêre ou ben changiér lo blocâjo a l’utilisator.',
+'ipbblocked' => 'Vos pouede pas blocar ou ben dèblocar d’ôtros utilisators, perce que vos éte vos-mémo blocâ',
+'ipbnounblockself' => 'Vos éte pas ôtorisâ a vos dèblocar vos-mémo',
# Developer tools
'lockdb' => 'Vèrrolyér la bâsa de balyês',
@@ -2596,6 +2648,17 @@ Cen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se
'''ATENCION !'''
Cen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;
assurâd-vos de nen avêr comprês les consèquences devant que continuar.",
+'movepagetext-noredirectfixer' => "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.
+Lo viely titro vindrat una pâge de redirèccion de vers lo titro novél.
+Controlâd bien les [[Special:DoubleRedirects|redirèccions dobles]] ou ben [[Special:BrokenRedirects|câsses]].
+Vos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.
+
+Notâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.
+Cen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.
+
+'''ATENCION !'''
+Cen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;
+assurâd-vos de nen avêr comprês les consèquences devant que continuar.",
'movepagetalktext' => "La pâge de discussion associyê, se presente, serat renomâ ôtomaticament avouéc '''a muens que :'''
* una pâge de discussion pas voueda ègziste ja avouéc lo novél nom, ou ben
* vos pouentâd pas la câsa ce-desot.
@@ -2636,7 +2699,7 @@ Nen volyéd chouèsir un ôtro.',
'movelogpagetext' => 'Vê-que la lista de totes les pâges renomâs ou dèplaciês.',
'movesubpage' => 'Sot-pâge{{PLURAL:$1||s}}',
'movesubpagetext' => 'Cela pâge at $1 {{PLURAL:$1|sot-pâge montrâ|sot-pâges montrâs}} ce-desot.',
-'movenosubpage' => 'Cela pâge at gins de sot-pâge.',
+'movenosubpage' => 'Ceta pâge at gins de sot-pâge.',
'movereason' => 'Rêson :',
'revertmove' => 'rètablir',
'delete_and_move' => 'Suprimar et renomar',
@@ -2653,6 +2716,7 @@ empossiblo de renomar una pâge sur lyé-méma.',
'immobile-source-page' => 'Cela pâge est pas renomâbla.',
'immobile-target-page' => 'Empossiblo de renomar la pâge vers cél titro.',
'imagenocrossnamespace' => 'Empossiblo de renomar un fichiér vers un èspâço de noms ôtro que « {{ns:file}} ».',
+'nonfile-cannot-move-to-file' => 'Empossiblo de renomar quârque-ren d’ôtro qu’un fichiér vers l’èspâço de noms « {{ns:file}} ».',
'imagetypemismatch' => 'La novèla èxtension de cél fichiér corrèspond pas a son tipo.',
'imageinvalidfilename' => 'Lo nom du fichiér ciba est fôx',
'fix-double-redirects' => 'Betar a jorn les redirèccions que pouentont vers lo titro originâl',
@@ -2733,6 +2797,7 @@ Sôvâd-lo sur voutron ordenator et pués tèlèchargiéd-lo ique.',
'importstart' => 'Importacion de les pâges...',
'import-revision-count' => '$1 vèrsion{{PLURAL:$1||s}}',
'importnopages' => 'Gins de pâge a importar.',
+'imported-log-entries' => '$1 entrâ{{PLURAL:$1||s}} du jornal importâ{{PLURAL:$1||s}}.',
'importfailed' => 'Falyita de l’importacion : <nowiki>$1</nowiki>',
'importunknownsource' => 'Tipo de la sôrsa a importar encognu',
'importcantopen' => 'Empossiblo d’uvrir lo fichiér a importar',
@@ -2807,13 +2872,13 @@ Portant, vos en pouede vêre lo tèxto sôrsa.',
'tooltip-feed-atom' => 'Flux Atom por ceta pâge',
'tooltip-t-contributions' => 'Vêre la lista de les contribucions a ceti utilisator',
'tooltip-t-emailuser' => 'Mandar un mèssâjo a ceti utilisator',
-'tooltip-t-upload' => 'Tèlèchargiér una émâge ou ben un fichiér multimèdia sur lo sèrvor',
+'tooltip-t-upload' => 'Tèlèchargiér des fichiérs',
'tooltip-t-specialpages' => 'Lista de totes les pâges spèciâles',
'tooltip-t-print' => 'Vèrsion emprimâbla de ceta pâge',
'tooltip-t-permalink' => 'Lim fixo de vers ceta vèrsion de la pâge',
'tooltip-ca-nstab-main' => 'Vêre la pâge de contegnu',
'tooltip-ca-nstab-user' => 'Vêre la pâge utilisator',
-'tooltip-ca-nstab-media' => 'Vêre la pâge du fichiér multimèdia',
+'tooltip-ca-nstab-media' => 'Vêre la pâge de mèdia',
'tooltip-ca-nstab-special' => 'O est una pâge spèciâla, vos la pouede pas changiér.',
'tooltip-ca-nstab-project' => 'Vêre la pâge du projèt',
'tooltip-ca-nstab-image' => 'Vêre la pâge du fichiér',
@@ -2832,6 +2897,8 @@ Portant, vos en pouede vêre lo tèxto sôrsa.',
'tooltip-rollback' => '« Rèvocar » anule en yon clic lo ou ben los changement(s) de ceta pâge per son dèrriér contributor.',
'tooltip-undo' => '« Dèfâre » rèvoque ceti changement et ôvre la fenétra d’èdicion en fôrma de prèvisualisacion.
Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la bouèta de rèsumâ.',
+'tooltip-preferences-save' => 'Encartar les prèferences',
+'tooltip-summary' => 'Buchiéd un côrt rèsumâ',
# Stylesheets
'common.css' => '/* Lo code CSS betâ ique serat aplicâ a tôs los habelyâjos. */',
@@ -2964,14 +3031,17 @@ Se vos l’ègzécutâd, voutron sistèmo pôt étre compromês.",
'imagemaxsize' => "Format lo ples grant de les émâges :<br />''(por les pâges de dèscripcion d’émâges)''",
'thumbsize' => 'Talye de la figura :',
'widthheightpage' => '$1 × $2, $3 pâge{{PLURAL:$3||s}}',
-'file-info' => '(Talye du fichiér : $1, tipo MIME : $2)',
-'file-info-size' => '($1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4)',
+'file-info' => 'Talye du fichiér : $1, tipo MIME : $2',
+'file-info-size' => '$1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4',
'file-nohires' => '<small>Gins de rèsolucion ples hôta disponibla.</small>',
-'svg-long-desc' => '(Fichiér SVG, rèsolucion de $1 × $2 pixèls, talye : $3)',
+'svg-long-desc' => 'Fichiér SVG, rèsolucion de $1 × $2 pixèls, talye : $3',
'show-big-image' => 'Émâge en rèsolucion ples hôta',
'show-big-image-thumb' => '<small>Talye de ceti apèrçu : $1 × $2 pixèls</small>',
'file-info-gif-looped' => 'en boclla',
'file-info-gif-frames' => '$1 émâge{{PLURAL:$1||s}}',
+'file-info-png-looped' => 'en boclla',
+'file-info-png-repeat' => 'jouyê $1 côp{{PLURAL:$1||s}}',
+'file-info-png-frames' => '$1 émâge{{PLURAL:$1||s}}',
# Special:NewFiles
'newimages' => 'Galerie des novéls fichiérs',
@@ -3127,6 +3197,7 @@ Los ôtros champs seront cachiês per dèfôt.
'exif-gpsareainformation' => 'Nom de la zona GPS',
'exif-gpsdatestamp' => 'Dâta GPS',
'exif-gpsdifferential' => 'Corrèccion difèrencièla GPS',
+'exif-objectname' => 'Titro côrt',
# EXIF attributes
'exif-compression-1' => 'Pas comprèssâ',
@@ -3289,48 +3360,77 @@ Los ôtros champs seront cachiês per dèfôt.
'limitall' => 'tôs',
# E-mail address confirmation
-'confirmemail' => 'Confirmar l’adrèce èlèctronica',
-'confirmemail_noemail' => 'Vos éd pas dèfeni una adrèce èlèctronica valida dens voutres [[Special:Preferences|prèferences]].',
-'confirmemail_text' => '{{SITENAME}} at fôta du contrôlo de voutra adrèce èlèctronica devant que povêr utilisar tota fonccion de mèssageria.
+'confirmemail' => 'Confirmar l’adrèce èlèctronica',
+'confirmemail_noemail' => 'Vos éd pas dèfeni una adrèce èlèctronica valida dens voutres [[Special:Preferences|prèferences]].',
+'confirmemail_text' => '{{SITENAME}} at fôta du contrôlo de voutra adrèce èlèctronica devant que povêr utilisar tota fonccion de mèssageria.
Utilisâd lo boton ce-desot por mandar un mèssâjo de confirmacion a voutra adrèce.
Lo mèssâjo encllurat un lim que contint un code a usâjo solèt et limitâ dens lo temps ;
chargiéd cél lim dens voutron navigator por confirmar que voutra adrèce èlèctronica est valida.',
-'confirmemail_pending' => 'Un code de confirmacion vos at ja étâ mandâ per mèssageria èlèctronica ;
+'confirmemail_pending' => 'Un code de confirmacion vos at ja étâ mandâ per mèssageria èlèctronica ;
se vos vegnéd de fâre voutron compto, volyéd atendre doux-três menutes que lo mèssâjo arreve devant que demandar un code novél.',
-'confirmemail_send' => 'Mandar un code de confirmacion',
-'confirmemail_sent' => 'Mèssâjo de confirmacion mandâ.',
-'confirmemail_oncreate' => 'Un code de confirmacion at étâ mandâ a voutra adrèce èlèctronica.
+'confirmemail_send' => 'Mandar un code de confirmacion',
+'confirmemail_sent' => 'Mèssâjo de confirmacion mandâ.',
+'confirmemail_oncreate' => 'Un code de confirmacion at étâ mandâ a voutra adrèce èlèctronica.
Cél code est pas nècèssèro por sè branchiér, mas vos lo devréd balyér por activar tota fonccionalitât liyê a la mèssageria èlèctronica sur ceti vouiqui.',
-'confirmemail_sendfailed' => '{{SITENAME}} vos at pas possu mandar lo mèssâjo de confirmacion.
+'confirmemail_sendfailed' => '{{SITENAME}} vos at pas possu mandar lo mèssâjo de confirmacion.
Volyéd controlar que voutra adrèce èlèctronica contint gins de caractèro dèfendu.
Lo programo d’èxpèdicion de mèssâjo at retornâ ceta endicacion : $1',
-'confirmemail_invalid' => 'Code de confirmacion fôx.
+'confirmemail_invalid' => 'Code de confirmacion fôx.
Ceti at pôt-étre èxpirâ.',
-'confirmemail_needlogin' => 'Vos vos dête $1 por confirmar voutra adrèce èlèctronica.',
-'confirmemail_success' => 'Voutra adrèce èlèctronica at étâ confirmâ.
+'confirmemail_needlogin' => 'Vos vos dête $1 por confirmar voutra adrèce èlèctronica.',
+'confirmemail_success' => 'Voutra adrèce èlèctronica at étâ confirmâ.
Ora, vos vos pouede [[Special:UserLogin|branchiér]] et profitar du vouiqui.',
-'confirmemail_loggedin' => 'Ora, voutra adrèce èlèctronica est confirmâ.',
-'confirmemail_error' => 'Un problèmo est arrevâ pendent l’encartâjo de voutra confirmacion.',
-'confirmemail_subject' => 'Confirmacion d’adrèce èlèctronica por {{SITENAME}}',
-'confirmemail_body' => 'Quârqu’un, probâblament vos, avouéc l’adrèce IP $1,
-at encartâ un compto « $2 » avouéc ceta adrèce èlèctronica sur lo seto {{SITENAME}}.
+'confirmemail_loggedin' => 'Ora, voutra adrèce èlèctronica est confirmâ.',
+'confirmemail_error' => 'Un problèmo est arrevâ pendent l’encartâjo de voutra confirmacion.',
+'confirmemail_subject' => 'Confirmacion d’adrèce èlèctronica por {{SITENAME}}',
+'confirmemail_body' => 'Quârqu’un, probâblament vos, avouéc l’adrèce IP $1,
+at encartâ un compto « $2 » avouéc cela adrèce èlèctronica dessus {{SITENAME}}.
Por confirmar que cél compto est franc a vos et por
activar les fonccions de mèssageria dessus {{SITENAME}},
-volyéd siuvre ceti lim dens voutron navigator :
+volyéd uvrir ceti lim dens voutron navigator :
+
+$3
+
+Se vos éd *pas* encartâ lo compto, siude ceti lim
+por anular la confirmacion de l’adrèce èlèctronica :
+
+$5
+
+Cél code de confirmacion èxpirerat lo $4.',
+'confirmemail_body_changed' => 'Quârqu’un, probâblament vos, avouéc l’adrèce IP $1,
+at changiê l’adrèce èlèctronica du compto « $2 » a cela adrèce dessus {{SITENAME}}.
+
+Por confirmar que cél compto est franc a vos et por
+reactivar les fonccions de mèssageria dessus {{SITENAME}},
+volyéd uvrir ceti lim dens voutron navigator :
$3
-Se vos éd *pas* encartâ cél compto, uvréd pas ceti lim ;
-vos pouede siuvre l’ôtro lim ce-desot por anular la
-confirmacion de voutra adrèce èlèctronica :
+Se lo compto est *pas* a vos, siude ceti lim
+por anular la confirmacion de l’adrèce èlèctronica :
$5
Cél code de confirmacion èxpirerat lo $4.',
-'confirmemail_invalidated' => 'Confirmacion de l’adrèce èlèctronica anulâ',
-'invalidateemail' => 'Anular la confirmacion de l’adrèce èlèctronica',
+'confirmemail_body_set' => 'Quârqu’un, probâblament vos, avouéc l’adrèce IP $1,
+at changiê l’adrèce èlèctronica du compto « $2 » a cela adrèce dessus {{SITENAME}}.
+
+Por confirmar que cél compto est franc a vos et por
+reactivar les fonccions de mèssageria dessus {{SITENAME}},
+volyéd uvrir ceti lim dens voutron navigator :
+
+$3
+
+Se lo compto est *pas* a vos, siude ceti lim
+por anular la confirmacion de l’adrèce èlèctronica :
+
+$5
+
+Cél code de confirmacion èxpirerat lo $4.',
+'confirmemail_invalidated' => 'Confirmacion de l’adrèce èlèctronica anulâ',
+'invalidateemail' => 'Anular la confirmacion de l’adrèce èlèctronica',
# Scary transclusion
'scarytranscludedisabled' => '[La transcllusion entèrvouiqui est dèsactivâ]',
@@ -3377,6 +3477,7 @@ Volyéd confirmar que vos voléd franc refâre cela pâge.",
'table_pager_first' => 'Premiére pâge',
'table_pager_last' => 'Dèrriére pâge',
'table_pager_limit' => 'Montrar $1 èlèment{{PLURAL:$1||s}} per pâge',
+'table_pager_limit_label' => 'Rèsultats per pâge :',
'table_pager_limit_submit' => 'Listar',
'table_pager_empty' => 'Gins de rèsultat',
@@ -3499,8 +3600,9 @@ Vos pouede asse-ben utilisar l’[[Special:Watchlist/edit|èditor normal]].',
'version-specialpages' => 'Pâges spèciâles',
'version-parserhooks' => 'Grèfons du parsor',
'version-variables' => 'Variâbles',
+'version-skins' => 'Habelyâjos',
'version-other' => 'De totes sôrtes',
-'version-mediahandlers' => 'Maneyors de fichiérs multimèdia',
+'version-mediahandlers' => 'Maneyors de mèdia',
'version-hooks' => 'Grèfons',
'version-extension-functions' => 'Fonccions d’èxtension de dedens',
'version-parser-extensiontags' => 'Balises d’èxtension du parsor',
@@ -3511,6 +3613,13 @@ Vos pouede asse-ben utilisar l’[[Special:Watchlist/edit|èditor normal]].',
'version-version' => '(Vèrsion $1)',
'version-svn-revision' => '(v$2)',
'version-license' => 'Licence',
+'version-poweredby-credits' => "Ceti vouiqui fonccione grâce a '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'ôtros',
+'version-license-info' => 'MediaWiki est una programeria abada ; cen vôt dére que vos la pouede tornar distribuar et / ou changiér d’aprés los tèrmos de la Licence Publica G·ènèrala GNU coment publeyê per la Free Software Foundation ; seye la vèrsion 2 de la Licence, ou ben (a voutron chouèx) tota novèla vèrsion.
+
+MediaWiki est distribuâ dens l’èsperance que serat utila, mas SEN GINS DE GARANTIA ; sen mémo la garantia emplicita de COMÈRCIALISACION ou ben d’ADAPTACION A UN USÂJO PARTICULIÉR. Vêde la Licence Publica G·ènèrala GNU por més de dètalys.
+
+Vos devriâd avêr reçu una [{{SERVER}}{{SCRIPTPATH}}/COPYING copia de la Licence Publica G·ènèrala GNU] avouéc cél programo, ôtrament, ècrîde a la « Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA » ou ben [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html liéséd-la en legne].',
'version-software' => 'Programeries enstalâs',
'version-software-product' => 'Marchandie',
'version-software-version' => 'Vèrsion',
@@ -3545,7 +3654,7 @@ Buchiéd lo nom du fichiér sen lo prèfixo « {{ns:file}}: ».',
'specialpages-group-other' => 'Ôtres pâges spèciâles',
'specialpages-group-login' => 'Branchement / encartâjo',
'specialpages-group-changes' => 'Dèrriérs changements et jornals',
-'specialpages-group-media' => 'Rapôrts et tèlèchargements de fichiérs multimèdia',
+'specialpages-group-media' => 'Rapôrts et tèlèchargements de fichiérs mèdia',
'specialpages-group-users' => 'Utilisators et drêts apondus',
'specialpages-group-highuse' => 'Pâges d’usâjo important',
'specialpages-group-pages' => 'Listes de pâges',
@@ -3581,6 +3690,15 @@ Buchiéd lo nom du fichiér sen lo prèfixo « {{ns:file}}: ».',
'tags-edit' => 'changiér',
'tags-hitcount' => '$1 changement{{PLURAL:$1||s}}',
+# Special:ComparePages
+'comparepages' => 'Comparar des pâges',
+'compare-selector' => 'Comparar les vèrsions de les pâges',
+'compare-page1' => 'Pâge 1',
+'compare-page2' => 'Pâge 2',
+'compare-rev1' => 'Vèrsion 1',
+'compare-rev2' => 'Vèrsion 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
'dberr-header' => 'Ceti vouiqui at un problèmo',
'dberr-problems' => 'Dèsolâ ! Ceti seto rencontre des dificultâts tècniques.',
@@ -3597,8 +3715,13 @@ Buchiéd lo nom du fichiér sen lo prèfixo « {{ns:file}}: ».',
'htmlform-float-invalid' => 'La valor que vos éd spècefiâ est pas un nombro.',
'htmlform-int-toolow' => 'La valor que vos éd spècefiâ est en-desot du muens de $1',
'htmlform-int-toohigh' => 'La valor que vos éd spècefiâ est en-dessus du més de $1',
+'htmlform-required' => 'Ceta valor est nècèssèra',
'htmlform-submit' => 'Sometre',
'htmlform-reset' => 'Dèfâre los changements',
'htmlform-selectorother-other' => 'Ôtro',
+# SQLite database support
+'sqlite-has-fts' => '$1 avouéc rechèrche en tèxto complèt recognua',
+'sqlite-no-fts' => '$1 sen rechèrche en tèxto complèt recognua',
+
);
diff --git a/languages/messages/MessagesFrr.php b/languages/messages/MessagesFrr.php
index 22bccddd..34883af2 100644
--- a/languages/messages/MessagesFrr.php
+++ b/languages/messages/MessagesFrr.php
@@ -15,6 +15,8 @@
$fallback = 'de';
+$linkTrail = '/^([a-zäöüßåÄÄ‘Ä“]+)(.*)$/sDu';
+
$messages = array(
# User preference toggles
'tog-underline' => 'Linke unerstrike:',
@@ -31,8 +33,7 @@ $messages = array(
'tog-editsection' => 'Ferbininge tun wisen foon änkelte oufsnaase',
'tog-editsectiononrightclick' => 'Änkelte stöögne ma ruchts kliken beårbe (brükt JavaScript)',
'tog-showtoc' => 'Wis en inhåltsferteeknis for side ma mäs ås trii ouerschrafte',
-'tog-rememberpassword' => 'aw diheere komputer foon duur önjmälde',
-'tog-editwidth' => 'Önjjeewefälj ütwide, am di hiilj bilschirm üttufeelen',
+'tog-rememberpassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for $1 {{PLURAL:$1|däi|deege}})',
'tog-watchcreations' => 'Seelew måågede side automatisch bekiike',
'tog-watchdefault' => 'Seelew änrede side automaatisch bekiike',
'tog-watchmoves' => 'Seelew ferschääwene side automaatisch bekiike',
@@ -48,8 +49,9 @@ $messages = array(
'tog-shownumberswatching' => 'Wis di tål foon wåchende brükere',
'tog-oldsig' => 'Forbekiik foon e aktuäle signatuur:',
'tog-fancysig' => 'Signatuur behoonle ås wikitäkst',
-'tog-externaleditor' => 'Gewöönlik äksterne ediitor for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde)',
-'tog-externaldiff' => 'Gewöönlik äkstern program for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde)',
+'tog-externaleditor' => 'Gewöönlik äksterne ediitor for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde
+[http://www.mediawiki.org/wiki/Manual:External_editors Mör informatsjoone.])',
+'tog-externaldiff' => 'Gewöönlik äkstern program for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde[http://www.mediawiki.org/wiki/Manual:External_editors Mör informatsjoone.])',
'tog-showjumplinks' => '"Schafte tu"-ferbininge aktiwiire',
'tog-uselivepreview' => 'Live-forbekiik ferwiinje (brükt JavaScript) (äksperimentäl)',
'tog-forceeditsummary' => 'Woorschoue, wan bai dåt spiikern jü tuhuupefooting breecht',
@@ -178,31 +180,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Stuk haanetufoue',
-'vector-action-delete' => 'Strike',
-'vector-action-move' => 'Ferschüwe',
-'vector-action-protect' => 'Sääkere',
-'vector-action-undelete' => 'Wi mååge',
-'vector-action-unprotect' => 'Frijeewe',
-'vector-namespace-category' => 'Kategorii',
-'vector-namespace-help' => 'Heelpsid',
-'vector-namespace-image' => 'Dootäi',
-'vector-namespace-main' => 'Sid',
-'vector-namespace-media' => 'Meediesid',
-'vector-namespace-mediawiki' => 'Berucht',
-'vector-namespace-project' => 'Prujäktsid',
-'vector-namespace-special' => 'Spetsjåålsid',
-'vector-namespace-talk' => 'Diskusjoon',
-'vector-namespace-template' => 'Forlååge',
-'vector-namespace-user' => 'Brükersid',
-'vector-view-create' => 'Mååge',
-'vector-view-edit' => 'Beårbe',
-'vector-view-history' => 'Dootäifärsjoone',
-'vector-view-view' => 'Lees',
-'vector-view-viewsource' => 'Kwältäkst önjkiike',
-'actions' => 'Aksjoone',
-'namespaces' => 'Noomerüme',
-'variants' => 'Fariante',
+'vector-action-addsection' => 'Stuk haanetufoue',
+'vector-action-delete' => 'Strike',
+'vector-action-move' => 'Ferschüwe',
+'vector-action-protect' => 'Sääkere',
+'vector-action-undelete' => 'Wi mååge',
+'vector-action-unprotect' => 'Frijeewe',
+'vector-simplesearch-preference' => 'Erwiderde säkforsliike aktiwiire (bloot vector)',
+'vector-view-create' => 'Mååge',
+'vector-view-edit' => 'Beårbe',
+'vector-view-history' => 'Dootäifärsjoone',
+'vector-view-view' => 'Lees',
+'vector-view-viewsource' => 'Kwältäkst önjkiike',
+'actions' => 'Aksjoone',
+'namespaces' => 'Noomerüme',
+'variants' => 'Fariante',
'errorpagetitle' => 'Fäägel',
'returnto' => 'Tubääg tu jü side $1.',
@@ -432,7 +424,8 @@ Ferjees ai, din [[Special:Preferences|{{SITENAME}}-önjstalinge]] önjtupååsen
'yourname' => 'Brükernoome:',
'yourpassword' => 'Pååsuurd:',
'yourpasswordagain' => 'Schriw pååsuurd nuch iinjsen:',
-'remembermypassword' => 'aw diheere komputer foon duur önjmälde',
+'remembermypassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for {{PLURAL:$1|däi|deege}})',
+'securelogin-stick-https' => 'Eefter önjmälding ma HTTPS ferbünen bliwe',
'yourdomainname' => 'Din domain:',
'externaldberror' => 'Önjtwider deer läit en fäägel bai jü äkstärn autentifisiiring for, unti dü möist din äkstärn brükerkonto äi aktualisiire.',
'login' => 'Önjmälde',
@@ -449,6 +442,7 @@ Ferjees ai, din [[Special:Preferences|{{SITENAME}}-önjstalinge]] önjtupååsen
'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
'gotaccountlink' => 'Önjmälde',
'createaccountmail' => 'ouer E-mail',
+'createaccountreason' => 'Grün:',
'badretype' => 'Da biise pååsuurde stime ai oueriinj.',
'userexists' => 'Dideer brükernoome as ål ferjääwen. Wees sü gödj en ouderen tu kiisen.',
'loginerror' => 'Fäägel bai önjmälding',
@@ -554,9 +548,12 @@ Möölikerwise heest dü din pååsuurd ål ma erfolch änred heest unti en nai
'showlivepreview' => 'Live-forkiik',
'showdiff' => 'Änringe wise',
'anoneditwarning' => "Dü beårbest jüdeer sid ünönjmälded. Wan dü spikerst, wård din aktuäle IP-adräs önj e fesjoonshistoori aptiikned än as deerma for åltens '''ålgemiin''' sichtboor.",
+'anonpreviewwarning' => "''Dü bast ai önjmälded. Bai t spiikern wårt din IP-adräs önj e fersjoonshistoori awtiikned.''",
'missingsummary' => "'''Haanewising:\"' Dü heest niinj tuhuupefooting önjjääwen.
Wan dü wider aw \"Sid spiikre\" klikst, wårt din änring suner tuhuupefooting ouernümen.",
'missingcommenttext' => 'Jeew en tuhuupefooting önj.',
+'missingcommentheader' => "'''PÅÅS AW:''' dü heest niinj keer/ouerschraft önjjääwen.
+Wan dü wider aw \"{{int:savearticle}}\" klakst, wårt din beårbing suner ouerschaft spiikerd.",
'summary-preview' => 'Forlök foon jü tuhuupfootingssid:',
'subject-preview' => 'Forkiik foon dåt subjäkt:',
'blockedtitle' => 'Brüker as späred',
@@ -598,7 +595,7 @@ For informasjoon füliet di leeste üttooch üt dåt benjüterspär-logbök:',
'''DÃ¥t as nuch ai spiikerd!'''",
'userjspreview' => "'''Påås aw dåt dü bloot din brüker JavaScript präiwest/forbekiikest.'''
'''DÃ¥t as nuch ai spiikerd!'''",
-'userinvalidcssjstitle' => "''Woorschauing:''' Skin \"\$1\"jeeft dåt ai. Betånk, dåt brükerspetsiifische .css- än .js-side ma en latj bökstääw önjfånge mönje, ålsü biispelswise ''{{ns:user}}:Münsterkjarl/monobook.css'' önj stää foon ''{{ns:user}}:Münsterkjarl/Monobook.css''.",
+'userinvalidcssjstitle' => "''Woorschauing:''' Skin \"\$1\"jeeft dåt ai. Betånk, dåt brükerspetsiifische .css- än .js-side ma en latj bökstääw önjfånge mönje, ålsü biispelswise ''{{ns:user}}:Münsterkjarl/vector.css'' önj stää foon ''{{ns:user}}:Münsterkjarl/Vector.css''.",
'updated' => '(Änred)',
'note' => "'''Påås aw:'''",
'previewnote' => "'''Dåtheer as bloot en forlök, jü sid wörd nuch ai spikred!'''",
@@ -615,8 +612,6 @@ Wan dü spiikerst, wårde åle naiere färsjoone ouerschraawen.",
'yourdiff' => 'Ferschääle',
'copyrightwarning' => "''' Hål kopiir niinj webside, da ai din äine san, brük niinj uurhääwerruchtlik schütsede wärke suner ferloof foon di uurhääwer!'''<br />
Dü jeefst üs heerma dan tusååge, dåt dü di täkst '''seelew ferfooted''' hääst, dåt di täkst ålgemiingödj '''(public domain)''' as, unti dåt di '''uurhääwer''' sin '''tustiming''' jääwen heet. For di fål jüdeer täkst ål ouersweer ütdänj wörd, wis hål aw jü diskusjoonssid deeraw haane. <i>Beåcht hål, dåt åle {{SITENAME}}-tujeefte automaatisch uner jü „$2“ stönje (sii $1 for detaile). For di fål dü ai mååst, dåt diin årbe heer foon oudere feränred än språåt wårt, dan kröög ai aw „sid spikre“.</i>",
-'longpagewarning' => "'''Woorschauing:''' Jüheer sid as $1 KB grut; hu browsere köön probleeme heewe, side tu beårben, da gruter san as 32 KB.
- Ouerläi hål, weer en ouddiiling foon e sid önj latjere oufsnaase möölik as.",
'longpageerror' => "'''FÄÄGEL: Di täkst, di dü tu spiikren ferseechst, as $11 KB grut. Dåt as gruter ås dåt tuleet maksimum foon $2 KB - spiikren ai möölik.'''",
'readonlywarning' => "'''PÅÅS AW: Jü dootenbånk wörd for unerhult spärd, sü dåt din änringe tutids ai spiikerd wårde koone.
Wees sü gödj än sääkre di täkst lokool aw din kompjuuter än fersäk tu n lääsern tidpunkt, da änringe tu ouerdreegen.'''.
@@ -711,7 +706,7 @@ Grün foon jü späre: ''$2''",
'history-feed-empty' => 'Jü önjfordied sid bestoont ai. Flicht wörd jü sleeked unti ferschääwen. [[Special:Search|Döörsäk]] {{SITENAME}} aw pååsende naie side.',
# Revision deletion
-'rev-deleted-comment' => '(Beårbingskomäntoor wächnümen)',
+'rev-deleted-comment' => '(Tuhuupefooting wächnümen)',
'rev-deleted-user' => '(Brükernoome wächhååld)',
'rev-deleted-event' => '(Logbökaksjoon wächhååld)',
'rev-deleted-user-contribs' => '[Benjüternoome unti IP-adräs wächhååld - beårbing üt baidråge ferstäägen]',
@@ -775,6 +770,8 @@ $1",
'logdelete-failure' => "'''Logböksachtboorhäid köö ai änred wårde:'''
$1",
'revdel-restore' => 'sichtboorhäid änre',
+'revdel-restore-deleted' => 'sleekede färsjoone',
+'revdel-restore-visible' => 'sachtboore färsjoone',
'pagehist' => 'Färsjoonshistoori',
'deletedhist' => 'Straagene färsjoone',
'revdelete-content' => 'wat önj e side stoont',
@@ -829,6 +826,7 @@ Stal sääker, dåt jü färsjoonshistoori foon en sid histoorisch koräkt as.',
# Diffs
'history-title' => 'Färsjoonshistoori foon "$1"',
'difference' => '(Ferschääl twasche Färsjoone)',
+'difference-multipage' => '(Ferschääl twasche side)',
'lineno' => 'Ra $1:',
'compareselectedversions' => 'Wäälde färsjoone ferglike',
'showhideselectedversions' => 'Wäälde färsjoone wise/fersteege',
@@ -856,6 +854,8 @@ Stal sääker, dåt jü färsjoonshistoori foon en sid histoorisch koräkt as.',
'searchhelp-url' => 'Help:Inhåltsfertiiknis',
'searchprofile-articles' => 'Artiikle',
'searchprofile-project' => 'Heelp än Prujäktside',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-advanced' => 'Ãœtwided',
'searchprofile-articles-tooltip' => 'Säk önj $1',
'searchprofile-project-tooltip' => 'Säk önj $1',
'searchprofile-advanced-tooltip' => 'Onj mör noomerüme säke',
@@ -894,12 +894,40 @@ Stal sääker, dåt jü färsjoonshistoori foon en sid histoorisch koräkt as.',
'qbsettings-none' => 'Niinj',
# Preferences page
-'preferences' => 'Önjstalinge',
-'mypreferences' => 'Önjstalinge',
-'allowemail' => 'E-Mail foon oudere brükere tulätje',
-'prefs-searchoptions' => 'Säkmöölikhäide',
-'prefs-namespaces' => 'Noomerüme',
-'defaultns' => 'Ouers säk önj jüheer noomerüme:',
+'preferences' => 'Önjstalinge',
+'mypreferences' => 'Önjstalinge',
+'prefsnologin' => 'Ai önjmälded',
+'changepassword' => 'Pååsuurd änre',
+'skin-preview' => 'Forlök',
+'prefs-math' => 'TeX',
+'prefs-personal' => 'Brüker dooten',
+'prefs-rc' => 'Leeste änringe',
+'prefs-watchlist-days-max' => 'Ai lunger as 7 deege',
+'prefs-watchlist-edits-max' => 'Ai mör as 1000',
+'prefs-misc' => 'Dit än dat',
+'prefs-resetpass' => 'Pååsuurd änre',
+'saveprefs' => 'Önjstalinge sääkere',
+'localtime' => 'lokaal tid',
+'timezoneregion-africa' => 'Afrikaa',
+'timezoneregion-america' => 'Ameerikaa',
+'timezoneregion-antarctica' => 'Antarktikaa',
+'timezoneregion-arctic' => 'Arktis',
+'timezoneregion-asia' => 'Aasien',
+'timezoneregion-australia' => 'Austraalien',
+'timezoneregion-europe' => 'Euroopa',
+'allowemail' => 'E-Mail foon oudere brükere tulätje',
+'prefs-searchoptions' => 'Säkmöölikhäide',
+'prefs-namespaces' => 'Noomerüme',
+'defaultns' => 'Ouers säk önj jüheer noomerüme:',
+'default' => 'Forinstaling',
+'prefs-files' => 'Dååtäie',
+'email' => 'e-mail',
+'prefs-signature' => 'Signatuur',
+'prefs-advancedediting' => 'Ütwided möölikhäide',
+'prefs-advancedrc' => 'Ütwided möölikhäide',
+'prefs-advancedrendering' => 'Ütwided möölikhäide',
+'prefs-advancedsearchoptions' => 'Ütwided möölikhäide',
+'prefs-advancedwatchlist' => 'Ütwided möölikhäide',
# Groups
'group-user' => 'Brükere',
@@ -1042,7 +1070,6 @@ Stal sääker, dåt jü färsjoonshistoori foon en sid histoorisch koräkt as.',
# Watchlist
'watchlist' => 'Eefterkiikliste',
'mywatchlist' => 'Eefterkiikliste',
-'watchlistfor' => "(for '''$1''')",
'addedwatch' => 'Tu eefterkiiksid tubaifäiged',
'addedwatchtext' => 'Jü sid „[[:$1]]“ wörd tu din [[Special:Watchlist|eefterkiiklist]] tubaifäiged.
@@ -1142,7 +1169,7 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
# Block/unblock
'blockip' => 'IP-adräs/brüker späre',
'ipboptions' => '2 stüne:2 hours,1 däi:1 day,3 deege:3 days,1 wääg:1 week,2 wääge:2 weeks,1 moune:1 month,3 moune:3 months,6 moune:6 months,1 iir:1 year,suner iinje:infinite',
-'ipblocklist' => 'Spärd IP-adräse än brükernoome',
+'ipblocklist' => 'Spärd brükere',
'expiringblock' => 'iinjet aw e $1 am e klook $2',
'blocklink' => 'späre',
'unblocklink' => 'frijeewe',
@@ -1281,9 +1308,9 @@ Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming
'nextdiff' => 'Tu di näist färsjoons-unerschiis →',
# Media information
-'file-info-size' => '($1 × $2 pixele, dååtäigrutelse: $3, MIME-typ: $4)',
+'file-info-size' => '$1 × $2 pixele, dååtäigrutelse: $3, MIME-typ: $4',
'file-nohires' => '<small>Niinj huuger apliising as deer.</small>',
-'svg-long-desc' => '(SVG-dåtäi, basisgrutelse: $1 × $2 pixel, dåtäigrutelse: $3)',
+'svg-long-desc' => 'SVG-dåtäi, basisgrutelse: $1 × $2 pixel, dåtäigrutelse: $3',
'show-big-image' => 'Färsjon önj huuger apliising',
'show-big-image-thumb' => '<small>Grutelse foon jü forlök: $1 × $2 pixele</small>',
@@ -1330,7 +1357,14 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
'watchlisttools-edit' => 'normåål beårbe',
'watchlisttools-raw' => 'Listeformoot beårbe (import/äksport)',
+# Special:Version
+'version-software' => 'Instaliird software',
+'version-software-version' => 'Färsjoon',
+
# Special:SpecialPages
'specialpages' => 'Spetsjåålside',
+# HTML forms
+'htmlform-selectorother-other' => 'Oudere',
+
);
diff --git a/languages/messages/MessagesFur.php b/languages/messages/MessagesFur.php
index 1874a053..e2026e5d 100644
--- a/languages/messages/MessagesFur.php
+++ b/languages/messages/MessagesFur.php
@@ -113,7 +113,7 @@ $dateFormats = array(
'dmy both' => 'j "di" M Y "a lis" H:i',
);
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$messages = array(
# User preference toggles
@@ -128,8 +128,7 @@ $messages = array(
'tog-editsection' => 'Inserìs un leam [cambie] pe editazion veloç di une sezion',
'tog-editsectiononrightclick' => 'Modifiche une sezion fracant cul tast diestri<br /> sui titui des sezions (JavaScript)',
'tog-showtoc' => 'Mostre la tabele dai contignûts pes pagjinis cun plui di 3 sezions',
-'tog-rememberpassword' => 'Visiti tes prossimis sessions',
-'tog-editwidth' => 'Slargje il spazi de modifiche par jemplâ dut il visôr',
+'tog-rememberpassword' => 'Visiti di me su chest sgarfadôr (par un massim di $1 {{PLURAL:$1|zornade|zornadis}})',
'tog-watchdefault' => 'Zonte in automatic lis pagjinis che o cambii inte liste di chês tignudis di voli',
'tog-minordefault' => 'Imposte come opzion predeterminade ducj i cambiaments come piçui',
'tog-previewontop' => 'Mostre anteprime parsore dal spazi pe modifiche',
@@ -221,6 +220,7 @@ $messages = array(
'category-file-count' => '{{PLURAL:$2|Cheste categorie e conten dome un file, mostrât ca sot.|Cheste categorie e conten {{PLURAL:$1|un file, mostrât|$1 files, mostrâts}} ca sot, suntun totâl di $2.}}',
'category-file-count-limited' => 'Cheste categorie e conten {{PLURAL:$1|il file mostrât|i $1 files mostrâts}} ca sot.',
'listingcontinuesabbrev' => 'cont.',
+'noindex-category' => 'Pagjinis no indicizadis',
'mainpagetext' => "'''MediaWiki e je stade instalade cun sucès.'''",
@@ -246,24 +246,20 @@ $messages = array(
'faq' => 'Domandis plui frecuentis',
# Vector skin
-'vector-action-addsection' => 'Gnove sezion',
-'vector-action-delete' => 'Elimine',
-'vector-action-move' => 'Môf',
-'vector-action-protect' => 'Protêç',
-'vector-namespace-category' => 'Categorie',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pagjine',
-'vector-namespace-mediawiki' => 'Messaç',
-'vector-namespace-template' => 'Model',
-'vector-namespace-user' => 'Pagjine dal utent',
-'vector-view-create' => 'Cree',
-'vector-view-edit' => 'Cambie',
-'vector-view-history' => 'Cjale il storic',
-'vector-view-view' => 'Lei',
-'vector-view-viewsource' => 'Cjale risultive',
-'actions' => 'Azions',
-'namespaces' => 'Spazis dai nons',
-'variants' => 'Variants',
+'vector-action-addsection' => 'Gnove sezion',
+'vector-action-delete' => 'Elimine',
+'vector-action-move' => 'Môf',
+'vector-action-protect' => 'Protêç',
+'vector-action-undelete' => 'Recupere',
+'vector-action-unprotect' => 'No stâ protezi',
+'vector-view-create' => 'Cree',
+'vector-view-edit' => 'Cambie',
+'vector-view-history' => 'Cjale il storic',
+'vector-view-view' => 'Lei',
+'vector-view-viewsource' => 'Cjale risultive',
+'actions' => 'Azions',
+'namespaces' => 'Spazis dai nons',
+'variants' => 'Variants',
'errorpagetitle' => 'Erôr',
'returnto' => 'Torne a $1.',
@@ -420,7 +416,7 @@ La tô identitât e je stade creade. No stâ dismenteâti di gambiâ lis prefere
'yourname' => 'Non utent',
'yourpassword' => 'Peraule clâf',
'yourpasswordagain' => 'Torne a scrivile',
-'remembermypassword' => 'Visiti di me',
+'remembermypassword' => 'Visiti di me di une session a chê altre (fin a $1 {{PLURAL:$1|zornade|zornadis}})',
'yourdomainname' => 'Il to domini',
'login' => 'Jentre',
'nav-login-createaccount' => 'Regjistriti o jentre',
@@ -436,6 +432,7 @@ La tô identitât e je stade creade. No stâ dismenteâti di gambiâ lis prefere
'gotaccount' => "Âstu za une identitât? '''$1'''.",
'gotaccountlink' => 'Jentre',
'createaccountmail' => 'par pueste eletroniche',
+'createaccountreason' => 'Reson:',
'badretype' => 'Lis peraulis clâfs inseridis no son compagnis.',
'userexists' => 'Il non utent inserît al è za doprât. Sielç par plasê un non diferent.',
'loginerror' => 'Erôr te jentrade',
@@ -506,7 +503,7 @@ Prime di ricevi cualsisei altri messaç di pueste, tu scugnis seguî lis istruzi
# Edit pages
'summary' => 'Somari:',
'subject' => 'Argoment (intestazion):',
-'minoredit' => 'Cheste al è un piçul cambiament',
+'minoredit' => 'Chest al è un piçul cambiament',
'watchthis' => 'Ten di voli cheste pagjine',
'savearticle' => 'Salve la pagjine',
'preview' => 'Anteprime',
@@ -549,6 +546,8 @@ La password par cheste identitât e pues jessi cambiade su la pagjine ''[[Specia
'noarticletext' => 'Par cumò nol è nuie in cheste pagjine.
Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts],
o ben [{{fullurl:{{FULLPAGENAME}}|action=edit}} cambiâ cheste pagjine]</span>.',
+'noarticletext-nopermission' => 'Par cumò nol è nuie in cheste pagjine.
+Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts].',
'userpage-userdoesnotexist' => 'La identitât "$1" no je di un utent regjistrât. Controle che tu vuelis pardabon creâ o modificâ cheste pagjine.',
'clearyourcache' => "'''Ocjo: dopo vê salvât, tu podaressis scugnî netâ la cache dal to sgarfadôr par viodi i cambiaments.''' Par '''Mozilla / Firefox / Safari''': frache ''Torne a cjamâ'' tignint jù ancje il tast des maiusculis, o se no frache ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' su Mac); par '''Konqueror''': frache ''Reload'' o il tast ''F5''; par '''Opera''' al pues jessi necessari disvuedâ dal dut la cache doprant il menù ''Tools → Preferencis''; par '''Internet Explorer:''' ten fracât il tast ''Ctrl'' cuant che tu cjalcjis su ''Aggiorna'' o frache ''Ctrl-F5''.",
'updated' => '(Inzornât)',
@@ -567,7 +566,6 @@ Tu varâs di inserî di gnûf i tiei cambiaments tal test esistint.
'copyrightwarning' => "Note: ducj i contribûts a {{SITENAME}} a si considerin come dâts fûr sot de licence $2 (cjale $1 pai detais). Se no tu vuelis che i tiei tescj a podedin jessi modificâts e tornâts a dâ fûr di ognidun cence limits, no stâ mandâju a {{SITENAME}}.<br />
Cun di plui, inviant il test tu declaris che tu âs scrit tu chest o tu lu âs copiât di une sorzint tal domini public o di une sorzint libare.
'''NO STÂ MANDÂ MATERIÂL CUVIERT DAL DIRIT DI AUTÔR CENCE AUTORIZAZION!'''",
-'longpagewarning' => "'''ATENZION: cheste pagjine e je grande $1 kilobytes; cualchi sgarfadôr al podarès vê problemis a modificâ pagjinis di 32 kb o plui grandis. Considere par plasê la pussibilitât di dividi la pagjine in sezions plui piçulis.'''",
'readonlywarning' => "'''ATENZION: La base di dâts e je blocade par vie de manutenzion, par cui no si podin salvâ lis modifichis par cumò. Par no pierdilis, tu puedis copiâ e tacâ il test inserît fin cumò e salvâlu intun file di test.'''
L'aministradôr che al à blocât la base di dâts al à ufiert chest spiegazion: $1",
@@ -584,13 +582,18 @@ L'aministradôr che al à blocât la base di dâts al à ufiert chest spiegazion
'permissionserrorstext-withaction' => 'No tu âs i permès che a coventin par $2, {{PLURAL:$1|par il motîf|pai motîfs}} ca sot:',
'recreate-moveddeleted-warn' => "'''Atenzion: tu stâs par tornâ a creâ une pagjine che e je stade eliminade timp fa.'''
-Siguriti che sedi pardabon oportun lâ indevant cun la modifiche di cheste pagjine.
-Ve ca par comoditât l'elenc des eliminazions precedentis par cheste pagjine:",
+Siguriti che sedi pardabon oportun lâ indevant cul cambiament di cheste pagjine.
+Ve ca par comoditât la liste des eliminazions e dai moviments par cheste pagjine:",
'moveddeleted-notice' => 'Cheste pagjine e je stade eliminade.
Il regjistri di eliminazion e di spostament pe pagjine a son mostrâts ca sot par informazion.',
'log-fulllog' => 'Viôt dut il regjistri',
'edit-no-change' => 'Il cambiament al è stât ignorât parcè che no tu âs cambiât nuie tal test.',
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Atenzion:''' La dimension dai modei includûts e je masse grande.
+Cualchi model nol vignarà includût.",
+'post-expand-template-inclusion-category' => 'Pagjinis dulà che la dimension pe inclusion dai modei e je stade superade',
+
# History pages
'viewpagelogs' => 'Cjale i regjistris relatîfs a cheste pagjine.',
'nohistory' => 'Nol è presint un storic dai cambiaments par cheste pagjine.',
@@ -610,6 +613,7 @@ Il regjistri di eliminazion e di spostament pe pagjine a son mostrâts ca sot pa
Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la version precedente, '''p''' = piçul cambiament",
'history-fieldset-title' => 'Sgarfe tal storic',
+'history-show-deleted' => 'Dome chei eliminâts',
'histfirst' => 'Prime',
'histlast' => 'Ultime',
'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
@@ -627,9 +631,15 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'revdelete-radio-same' => '(no stâ cambiâ)',
'revdelete-radio-set' => 'Sì',
'revdelete-radio-unset' => 'No',
+'revdelete-logentry' => 'cambiât la visibilitât de revision di "[[$1]]"',
'revdel-restore' => 'cambie visibilitât',
+'revdel-restore-deleted' => 'revisions eliminadis',
+'revdel-restore-visible' => 'revisions visibilis',
'pagehist' => 'Storic de pagjine',
+'revdelete-content' => 'contignût',
'revdelete-uname' => 'non utent',
+'revdelete-hid' => 'platât $1',
+'revdelete-log-message' => '$1 par $2 {{PLURAL:$2|revision|revisions}}',
'revdelete-reasonotherlist' => 'Altri motîf',
# Merge log
@@ -641,61 +651,65 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'lineno' => 'Rie $1:',
'compareselectedversions' => 'Confronte versions selezionadis',
'editundo' => 'anule',
-'diff-multi' => '({{PLURAL:$1|Une version intermedie no mostrade|$1 versions intermediis no mostradis}}.)',
+'diff-multi' => '({{PLURAL:$1|Une revision intermedie|$1 revisions intermediis}} di {{PLURAL:$2|un utent no mostrade|$2 utents no mostradis}})',
# Search results
-'searchresults' => 'Risultâts de ricercje',
-'searchresults-title' => 'Risultâts de ricercje di "$1"',
-'searchresulttext' => 'Par plui informazions su lis ricercjis in {{SITENAME}}, cjale [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Ricercje di \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|dutis lis pagjinis che a scomencin par "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|dutis lis pagjinis che a pontin a "$1"]])',
-'searchsubtitleinvalid' => 'Pal test "$1"',
-'toomanymatches' => 'Masse risultâts, prove par plasê une ricercje divierse.',
-'titlematches' => 'Corispondencis tai titui des pagjinis',
-'notitlematches' => 'Nissune corispondence tai titui des pagjinis',
-'textmatches' => 'Corispondencis tal test des pagjinis',
-'notextmatches' => 'Nissune corispondence tal test des pagjinis',
-'prevn' => 'precedents {{PLURAL:$1|$1}}',
-'nextn' => 'prossims {{PLURAL:$1|$1}}',
-'prevn-title' => '$1 {{PLURAL:$1|risultât precedent|risultâts precedents}}',
-'nextn-title' => '$1 {{PLURAL:$1|risultât sucessîf|risultâts sucessîfs}}',
-'shown-title' => 'Mostre $1 {{PLURAL:$1|risultât|risultâts}} par pagjine',
-'viewprevnext' => 'Cjale ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-legend' => 'Opzions de ricercje',
-'searchmenu-exists' => "'''E je une pagjine di non \"[[:\$1]]\" su cheste wiki'''",
-'searchmenu-new' => "'''Cree la pagjine \"[[:\$1]]\" su cheste wiki!'''",
-'searchhelp-url' => 'Help:Contignûts',
-'searchprofile-articles' => 'Pagjinis di contignûts',
-'searchprofile-project' => 'Pagjinis di jutori e sul progjet',
-'searchprofile-images' => 'Multimedia',
-'searchprofile-everything' => 'Dut',
-'searchprofile-advanced' => 'Avançade',
-'searchprofile-articles-tooltip' => 'Cîr in $1',
-'searchprofile-project-tooltip' => 'Cîr in $1',
-'searchprofile-images-tooltip' => 'Cîr files',
-'search-result-size' => '$1 ({{PLURAL:$2|une peraule|$2 peraulis}})',
-'search-result-score' => 'Rilevance: $1%',
-'search-redirect' => '(re-indreçament $1)',
-'search-section' => '(sezion $1)',
-'search-suggest' => 'Forsit tu cirivis: $1',
-'search-interwiki-caption' => 'Progjets fradis',
-'search-interwiki-default' => 'Risultâts di $1:',
-'search-interwiki-more' => '(altri)',
-'search-mwsuggest-enabled' => 'cui sugjeriments',
-'search-mwsuggest-disabled' => 'cence i sugjeriments',
-'mwsuggest-disable' => 'Disative i sugjeriments AJAX',
-'searchall' => 'ducj',
-'showingresults' => "Ca sot {{PLURAL:$1|al è fin a '''1''' risultât|a son fin a '''$1''' risultâts}} scomençant dal numar '''$2'''.",
-'showingresultsnum' => "Ca sot {{PLURAL:$3|al è '''1''' risultât|a son '''$3''' risultâts}} scomençant dal numar '''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|Risultât '''$1''' su '''$3'''|Risultâts '''$1 - $2''' su '''$3'''}} par '''$4'''",
-'nonefound' => "'''Note''': la ricercje e ven fate normalmentri dome in cualchi spazi dai nons. Prove a scrivi ''all:'' prime dal test di cjatâ par cirî in ducj i nons dai spazis (includint lis pagjinis di discussion, i modei e v.i.) o se no dopre il non dal spazi desiderât come prefìs.",
-'search-nonefound' => 'Nissun risultât par cheste ricercje.',
-'powersearch' => 'Cîr',
-'powersearch-legend' => 'Ricercje avanzade',
-'powersearch-ns' => 'Cîr tai spazis dai nons:',
-'powersearch-redir' => 'Elenc re-indreçaments',
-'powersearch-field' => 'Cîr',
-'search-external' => 'Ricercje esterne',
-'searchdisabled' => 'La ricercje in {{SITENAME}} no je ative. Tu puedis doprâ Google intant. Sta atent che lis lôr tabelis sul contignût di {{SITENAME}} a puedin jessi pôc inzornadis.',
+'searchresults' => 'Risultâts de ricercje',
+'searchresults-title' => 'Risultâts de ricercje di "$1"',
+'searchresulttext' => 'Par plui informazions su lis ricercjis in {{SITENAME}}, cjale [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Ricercje di \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|dutis lis pagjinis che a scomencin par "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|dutis lis pagjinis che a pontin a "$1"]])',
+'searchsubtitleinvalid' => 'Pal test "$1"',
+'toomanymatches' => 'Masse risultâts, prove par plasê une ricercje divierse.',
+'titlematches' => 'Corispondencis tai titui des pagjinis',
+'notitlematches' => 'Nissune corispondence tai titui des pagjinis',
+'textmatches' => 'Corispondencis tal test des pagjinis',
+'notextmatches' => 'Nissune corispondence tal test des pagjinis',
+'prevn' => 'precedents {{PLURAL:$1|$1}}',
+'nextn' => 'prossims {{PLURAL:$1|$1}}',
+'prevn-title' => '$1 {{PLURAL:$1|risultât precedent|risultâts precedents}}',
+'nextn-title' => '$1 {{PLURAL:$1|risultât sucessîf|risultâts sucessîfs}}',
+'shown-title' => 'Mostre $1 {{PLURAL:$1|risultât|risultâts}} par pagjine',
+'viewprevnext' => 'Cjale ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Opzions de ricercje',
+'searchmenu-exists' => "'''E je une pagjine di non \"[[:\$1]]\" su cheste wiki'''",
+'searchmenu-new' => "'''Cree la pagjine \"[[:\$1]]\" su cheste wiki!'''",
+'searchhelp-url' => 'Help:Contignûts',
+'searchprofile-articles' => 'Pagjinis di contignûts',
+'searchprofile-project' => 'Pagjinis di jutori e sul progjet',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Dut',
+'searchprofile-advanced' => 'Avançade',
+'searchprofile-articles-tooltip' => 'Cîr in $1',
+'searchprofile-project-tooltip' => 'Cîr in $1',
+'searchprofile-images-tooltip' => 'Cîr files',
+'searchprofile-everything-tooltip' => 'Cîr ducj i gjenars di contignûts (ancje lis pagjinis di discussion)',
+'searchprofile-advanced-tooltip' => 'Cîr tai spazis dai nons personalizâts',
+'search-result-size' => '$1 ({{PLURAL:$2|une peraule|$2 peraulis}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membri|$1 membris}} ({{PLURAL:$2|1 sotcategorie|$2 sotcategoriis}}, {{PLURAL:$3|1 file|$3 files}})',
+'search-result-score' => 'Rilevance: $1%',
+'search-redirect' => '(re-indreçament $1)',
+'search-section' => '(sezion $1)',
+'search-suggest' => 'Forsit tu cirivis: $1',
+'search-interwiki-caption' => 'Progjets fradis',
+'search-interwiki-default' => 'Risultâts di $1:',
+'search-interwiki-more' => '(altri)',
+'search-mwsuggest-enabled' => 'cui sugjeriments',
+'search-mwsuggest-disabled' => 'cence i sugjeriments',
+'mwsuggest-disable' => 'Disative i sugjeriments AJAX',
+'searchrelated' => 'leâts',
+'searchall' => 'ducj',
+'showingresults' => "Ca sot {{PLURAL:$1|al è fin a '''1''' risultât|a son fin a '''$1''' risultâts}} scomençant dal numar '''$2'''.",
+'showingresultsnum' => "Ca sot {{PLURAL:$3|al è '''1''' risultât|a son '''$3''' risultâts}} scomençant dal numar '''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Risultât '''$1''' su '''$3'''|Risultâts '''$1 - $2''' su '''$3'''}} par '''$4'''",
+'nonefound' => "'''Note''': la ricercje e ven fate normalmentri dome in cualchi spazi dai nons. Prove a scrivi ''all:'' prime dal test di cjatâ par cirî in ducj i nons dai spazis (includint lis pagjinis di discussion, i modei e v.i.) o se no dopre il non dal spazi desiderât come prefìs.",
+'search-nonefound' => 'Nissun risultât par cheste ricercje.',
+'powersearch' => 'Cîr',
+'powersearch-legend' => 'Ricercje avanzade',
+'powersearch-ns' => 'Cîr tai spazis dai nons:',
+'powersearch-redir' => 'Elenc re-indreçaments',
+'powersearch-field' => 'Cîr',
+'search-external' => 'Ricercje esterne',
+'searchdisabled' => 'La ricercje in {{SITENAME}} no je ative. Tu puedis doprâ Google intant. Sta atent che lis lôr tabelis sul contignût di {{SITENAME}} a puedin jessi pôc inzornadis.',
# Quickbar
'qbsettings' => 'Sbare svelte',
@@ -821,6 +835,10 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'recentchanges-legend' => 'Opzions dai ultins cambiaments',
'recentchangestext' => 'Cheste pagjine e mostre i plui recents cambiaments inte {{SITENAME}}.',
'recentchanges-feed-description' => 'Chest canâl al ripuarte i cambiaments plui recents ai contignûts di cheste wiki.',
+'recentchanges-label-newpage' => 'Chest cambiament al à creât une gnove pagjine',
+'recentchanges-label-minor' => 'Chest al è un piçul cambiament',
+'recentchanges-label-bot' => 'Chest cambiament al è stât eseguît di un bot',
+'recentchanges-label-unpatrolled' => 'Chest cambiament nol è stât ancjemò verificât',
'rcnote' => "Ca sot tu cjatis {{PLURAL:$1|l'ultin cambiament|i ultins '''$1''' cambiaments}} al sît {{PLURAL:$2|intes ultimis 24 oris|tes ultimis '''$2''' zornadis}}; i dâts a son inzornâts ai $4 a lis $5.",
'rcnotefrom' => "Ca sot i cambiaments dal '''$2''' (fintremai al '''$1''').",
'rclistfrom' => 'Mostre i ultins cambiaments dal $1',
@@ -882,7 +900,6 @@ Par includi une figure intune pagjine, dopre un leam inte form
'badfilename' => 'File non gambiât in "$1".',
'filetype-missing' => 'Il file nol à une estension (par esempli ".jpg").',
'file-exists-duplicate' => 'Chest file al è un duplicât {{PLURAL:$1|dal file |dai files ca sot:}}',
-'successfulupload' => 'Cjamât sù cun sucès',
'savefile' => 'Salve file',
'uploadedimage' => 'cjamât sù "$1"',
'overwroteimage' => 'al à cjamât une gnove version di «[[$1]]»',
@@ -891,6 +908,7 @@ Par includi une figure intune pagjine, dopre un leam inte form
'sourcefilename' => 'Non dal file origjinâl:',
'destfilename' => 'Non dal file di destinazion:',
'watchthisupload' => 'Ten di voli chest file',
+'upload-success-subj' => 'Cjamât sù cun sucès',
'upload-unknown-size' => 'Dimension no cognossude',
@@ -913,6 +931,7 @@ Par includi une figure intune pagjine, dopre un leam inte form
'file-anchor-link' => 'Figure',
'filehist' => 'Storic dal file',
'filehist-help' => 'Frache suntune date/ore par viodi il file cemût che al jere in chel moment.',
+'filehist-revert' => 'ripristine',
'filehist-current' => 'atuâl',
'filehist-datetime' => 'Date/Ore',
'filehist-thumb' => 'Miniature',
@@ -925,6 +944,8 @@ Par includi une figure intune pagjine, dopre un leam inte form
'linkstoimage' => '{{PLURAL:$1|La pagjine ca sot e je leade|Lis $1 pagjinis ca sot a son leadis}} a cheste figure:',
'nolinkstoimage' => 'No son pagjinis leadis a chest file.',
'sharedupload' => 'Chest file al è ven di $1 e al pues jessi doprât di altris progjets.',
+'sharedupload-desc-here' => 'Chest file al ven di $1 e al pues jessi doprât di altris progjets.
+La descrizion su la sô [$2 pagjine di descrizion] e je mostrade ca sot.',
'uploadnewversion-linktext' => 'Cjame sù une gnove version di chest file',
'shared-repo-from' => 'di $1',
@@ -970,13 +991,13 @@ Par includi une figure intune pagjine, dopre un leam inte form
'statistics-edits-average' => 'Medie dai cambiaments par ogni pagjine',
'statistics-views-total' => 'Viodudis totâls',
'statistics-views-peredit' => 'Viodudis par cambiament',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Code dai procès] di eseguî in background',
'statistics-users' => '[[Special:ListUsers|Utents]] regjistrâts',
'statistics-users-active' => 'Utents atîfs',
'statistics-users-active-desc' => 'Utents che a àn fat une azion {{PLURAL:$1|intal ultin dì|intai ultins $1 dîs}}',
'statistics-mostpopular' => 'Pagjinis plui visitadis',
-'disambiguations' => 'Pagjinis di disambiguazion',
+'disambiguations' => 'Pagjinis di disambiguazion',
+'disambiguationspage' => 'Template:disambig',
'doubleredirects' => 'Re-indreçaments doplis',
@@ -1078,9 +1099,10 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
'sp-deletedcontributions-contribs' => 'contribûts',
# Special:LinkSearch
-'linksearch' => 'Leams esternis',
-'linksearch-ns' => 'Spazi dai nons:',
-'linksearch-ok' => 'Cîr',
+'linksearch' => 'Leams esternis',
+'linksearch-ns' => 'Spazi dai nons:',
+'linksearch-ok' => 'Cîr',
+'linksearch-line' => '$1 al à un leam di $2',
# Special:ListUsers
'listusersfrom' => 'Mostre i utents scomençant di:',
@@ -1130,7 +1152,7 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
# Watchlist
'watchlist' => 'Tignûts di voli',
'mywatchlist' => 'Tignûts di voli',
-'watchlistfor' => "(par '''$1''')",
+'watchlistfor2' => 'Par $1 $2',
'nowatchlist' => 'Nissun element al è tignût di voli.',
'watchnologin' => 'No tu sês jentrât',
'watchnologintext' => "Tu 'nd âs di [[Special:UserLogin|jentrâ]] par modificâ la liste des pagjinis tignudis di voli.",
@@ -1180,6 +1202,7 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
'confirmdeletetext' => 'Tu stâs par eliminâ par simpri une pagjine insieme cun dut il so storic.
Par plasê, da la conferme che tu vuelis fâlu, che tu capissis lis conseguencis e che tu lu stâs fasint tal rispiet de [[{{MediaWiki:Policy-url}}|politiche dal progjet]].',
'actioncomplete' => 'Azion completade',
+'actionfailed' => 'Azion falide',
'deletedtext' => '"<nowiki>$1</nowiki>" al è stât eliminât.
Cjale $2 par une liste des ultimis eliminazions.',
'deletedarticle' => 'eliminât "[[$1]]"',
@@ -1232,6 +1255,7 @@ Tu puedis cambiâ il nivel di protezion di cheste pagjine, ma chest nol varà ef
'viewdeletedpage' => 'Viôt lis pagjinis eliminadis',
'undeletebtn' => 'Ripristine',
'undeletelink' => 'viôt/ripristine',
+'undeleteviewlink' => 'viôt',
'undeleteinvert' => 'Invertìs selezion',
'undeletecomment' => 'Reson:',
'undeletedarticle' => 'al à recuperât "[[$1]]"',
@@ -1258,10 +1282,12 @@ Tu puedis cambiâ il nivel di protezion di cheste pagjine, ma chest nol varà ef
'sp-contributions-newbies-sub' => 'Pai gnûfs utents',
'sp-contributions-blocklog' => 'Regjistri dai blocs',
'sp-contributions-deleted' => 'contribûts dal utent eliminâts',
+'sp-contributions-uploads' => 'cjamadis',
'sp-contributions-logs' => 'regjistris',
'sp-contributions-talk' => 'discussion',
'sp-contributions-search' => 'Cîr contribûts',
'sp-contributions-username' => 'Direzion IP o non utent:',
+'sp-contributions-toponly' => 'Mostre dome i cambiaments che a son lis ultimis revisions pe pagjine',
'sp-contributions-submit' => 'Cîr',
# What links here
@@ -1455,6 +1481,7 @@ Par plasê va su [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisat
'tooltip-upload' => 'Scomence la cjamade',
'tooltip-rollback' => '"Rollback" al anule il/i cambiament/s a cheste pagjine fats dal ultin utent cuntun sôl clic',
'tooltip-undo' => '"Anule" al permet di anulâ chest cambiament e al vierç il modul pal cambiament te modalitât di anteprime. Al permet cussì di zontâ une reson tal somari.',
+'tooltip-summary' => 'Inserìs un curt somari',
# Stylesheets
'monobook.css' => '/* modifiche chest file par personalizâ la skin monobook par dut il sît */',
@@ -1493,7 +1520,9 @@ Par plasê va su [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisat
'mw_math_mathml' => 'MathML se pussibil (sperimentâl)',
# Patrol log
+'patrol-log-line' => 'al à segnât $1 di $2 come verificade $3',
'patrol-log-auto' => '(in automatic)',
+'patrol-log-diff' => 'revision $1',
# Browsing diffs
'previousdiff' => '↠Difarence precedente',
@@ -1503,9 +1532,9 @@ Par plasê va su [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisat
'thumbsize' => 'Dimension miniature:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagjine|pagjinis}}',
'file-info' => 'Dimensions: $1, gjenar MIME: $2',
-'file-info-size' => '($1 × $2 pixel, dimensions: $3, gjenar MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, dimensions: $3, gjenar MIME: $4',
'file-nohires' => '<small>No son disponibilis versions cun risoluzion plui alte.</small>',
-'svg-long-desc' => '(file tal formât SVG, dimensions nominâls $1 × $2 pixels, dimensions dal file: $3)',
+'svg-long-desc' => 'file tal formât SVG, dimensions nominâls $1 × $2 pixels, dimensions dal file: $3',
'show-big-image' => 'Version a risoluzion plene',
'show-big-image-thumb' => '<small>Dimensions di cheste anteprime: $1 × $2 pixels</small>',
@@ -1670,6 +1699,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
'blankpage' => 'Pagjine vueide',
# Special:Tags
+'tag-filter' => 'Filtre par [[Special:Tags|etichetis]]:',
'tag-filter-submit' => 'Filtre',
'tags-edit' => 'cambie',
'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php
index 32691766..ec83c95e 100644
--- a/languages/messages/MessagesFy.php
+++ b/languages/messages/MessagesFy.php
@@ -137,7 +137,7 @@ $specialPageAliases = array(
'Filepath' => array( 'Triempad' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zàáèéìíòóùúâêîôûäëïöü]+)(.*)$/sDu';
$messages = array(
@@ -156,8 +156,7 @@ $messages = array(
'tog-editsection' => 'Jou [bewurk]-keppelings foar seksjebewurking',
'tog-editsectiononrightclick' => 'Rjochtsklik op sekjsetitels jout seksjebewurking (freget JavaScript)',
'tog-showtoc' => 'Ynhâldsopjefte, foar siden mei mear as twa koppen',
-'tog-rememberpassword' => 'Oare kear fansels oanmelde',
-'tog-editwidth' => 'Bewurkingsfjild oer folsleine breedte fan it skerm sjen litte',
+'tog-rememberpassword' => 'Oare kear fansels oanmelde (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => "Set siden dy't jo begjinne yn jo folchlist",
'tog-watchdefault' => "Sides dy't jo feroare hawwe folgje",
'tog-watchmoves' => "Siden dy't jo werneamd hawwe folgje",
@@ -300,29 +299,18 @@ $messages = array(
'faqpage' => 'Project:Faak stelde fragen',
# Vector skin
-'vector-action-delete' => 'Fuortsmite',
-'vector-action-move' => 'Werneam',
-'vector-action-protect' => 'Beskermje',
-'vector-action-undelete' => 'Tebeksette',
-'vector-action-unprotect' => 'Beskerming fuorthelje',
-'vector-namespace-category' => 'Kategory',
-'vector-namespace-help' => 'Helpside',
-'vector-namespace-image' => 'Triem',
-'vector-namespace-main' => 'Side',
-'vector-namespace-media' => 'Mediaside',
-'vector-namespace-mediawiki' => 'Berjocht',
-'vector-namespace-project' => 'Projektside',
-'vector-namespace-special' => 'Bysûndere siden',
-'vector-namespace-talk' => 'Oerlis',
-'vector-namespace-template' => 'Berjocht',
-'vector-namespace-user' => 'Meidogger',
-'vector-view-create' => 'Oanmeitsje',
-'vector-view-edit' => 'Wizigje',
-'vector-view-history' => 'Skiednis sjen litte',
-'vector-view-view' => 'Lês',
-'vector-view-viewsource' => 'Besjoch de boarne',
-'namespaces' => 'Nammeromten',
-'variants' => 'Farianten',
+'vector-action-delete' => 'Fuortsmite',
+'vector-action-move' => 'Werneam',
+'vector-action-protect' => 'Beskermje',
+'vector-action-undelete' => 'Tebeksette',
+'vector-action-unprotect' => 'Beskerming fuorthelje',
+'vector-view-create' => 'Oanmeitsje',
+'vector-view-edit' => 'Wizigje',
+'vector-view-history' => 'Skiednis sjen litte',
+'vector-view-view' => 'Lês',
+'vector-view-viewsource' => 'Besjoch de boarne',
+'namespaces' => 'Nammeromten',
+'variants' => 'Farianten',
'errorpagetitle' => 'Fout',
'returnto' => 'Werom nei "$1".',
@@ -537,7 +525,7 @@ Ferjit net se oan jo foarkar oan te passen.',
'yourname' => 'Jo meidochnamme:',
'yourpassword' => 'Jo wachtwurd',
'yourpasswordagain' => 'Jo wachtwurd (nochris)',
-'remembermypassword' => 'Oare kear fansels oanmelde.',
+'remembermypassword' => 'Oare kear fansels oanmelde (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Jo domein:',
'externaldberror' => 'Der is in fout by it oanmelden by de database of jo hawwe gjin tastimming om jo ekstern account by te wurkjen.',
'login' => 'Oanmelde',
@@ -712,7 +700,7 @@ Kontrolearje oft jo dizze side wol oanmeitsje/bewurkje wolle.',
'userjsyoucanpreview' => "'''Tip:''' Brûk de knop 'Earst oerlêze' om jo nije JS te testen foar it fêstlizzen.",
'usercsspreview' => "'''Dit is allinne mar it oerlêzen fan jo persoanlike CSS. Hy is noch net fêstlein!'''",
'userjspreview' => "'''Tink derom: jo besjogge no jo persoanlike JavaScript. De side is net fêstlein!'''",
-'userinvalidcssjstitle' => "'''Warskôging:''' der is gjin skin \"\$1\". Tink derom: jo eigen .css- en .js-siden begjinne mei in lytse letter, bygelyks {{ns:user}}:Namme/monobook.css ynsté fan {{ns:user}}:Namme/Monobook.css.",
+'userinvalidcssjstitle' => "'''Warskôging:''' der is gjin skin \"\$1\". Tink derom: jo eigen .css- en .js-siden begjinne mei in lytse letter, bygelyks {{ns:user}}:Namme/vector.css ynsté fan {{ns:user}}:Namme/Vector.css.",
'updated' => '(Bewurke)',
'note' => "'''Opmerking:'''",
'previewnote' => "'''Tink der om dat dizze side noch net fêstlein is!'''",
@@ -751,9 +739,6 @@ Hjirby sizze jo tagelyk ta, dat jo dizze tekst sels skreaun hawwe, of oernommen
As jo net wolle dat jo teksten yngeand oanpast wurde troch oaren, set se hjir dan net.<br />
Jo sizze ek ta dat jo de oarspronklike auteur binne fan dit materiaal, of dat jo it kopiearre hawwe út in boarne yn it publike domein, of in soartgelikense frije boarne (sjuch $1 foar details).
'''BRUK GJIN MATERIAAL DAT BESKERME WURDT TROCH AUTEURSRJOCHT, OF JO MOATTE DER TASTIMMING FOAR HAWWE!'''",
-'longpagewarning' => "'''Warskôging: Dizze side is $1 kilobyte lang;
-der binne blêders dy't problemen hawwe mei siden fan tsjin de 32 kb of langer.
-Besykje de side yn lytsere stikken te brekken.'''",
'longpageerror' => "'''FOUT: de tekst dy't jo tafoege hawwe is $1 kilobyte grut, wat grutter is as it maksimum fan $2 kilobytes.
Bewarjen is net mûglik.'''",
'readonlywarning' => "'''Warskôging: De databank is ôfsletten foar ûnderhâld, dus jo kinne jo bewurkings no net fêstlizze. Bewarje de tekst foar lettere pleatsing yn in teksttriem.'''
@@ -1207,7 +1192,6 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
'right-siteadmin' => 'De database blokkearje en wer frij jaan',
'right-reset-passwords' => "Wachtwurden fan oare meidoggers op 'e nij ynstelle",
'right-override-export-depth' => 'Alle siden oant en mei in keppelingsdjipte fan fiif fuortskriuwe',
-'right-versiondetail' => 'Utwreide ferzjeynformaasje sjenlitte',
# User rights log
'rightslog' => 'Rjochten-loch',
@@ -1257,13 +1241,9 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
'recentchanges-legend' => 'Opsjes foar resinte feroarings',
'recentchangestext' => 'De lêste feroarings fan de {{SITENAME}}.',
'recentchanges-feed-description' => 'Mei dizze feed kinne jo de nijste feroarings yn dizze wiki besjen.',
-'recentchanges-legend-newpage' => '$1 - nije side',
'recentchanges-label-newpage' => 'Mei dizze wiziging is in nije side makke',
-'recentchanges-legend-minor' => '$1 - tekstwiziging',
'recentchanges-label-minor' => 'Dit is in tekstwiziging',
-'recentchanges-legend-bot' => '$1 - robotbewurking',
'recentchanges-label-bot' => 'Dizze wiziging is troch in robot makke',
-'recentchanges-legend-unpatrolled' => '$1 - ûnkontrolearre wiziging',
'recentchanges-label-unpatrolled' => 'Dizze wiziging is noch net neisjûn',
'rcnote' => "Dit {{PLURAL:$1|is de lêste feroaring|binne de lêste '''$1''' feroarings}} yn de lêste {{PLURAL:$2|dei|'''$2''' dagen}}, fan $4 $5.",
'rcnotefrom' => 'Dit binne de feroarings sûnt <b>$2</b> (maksimaal <b>$1</b>).',
@@ -1372,7 +1352,6 @@ As jo de triem dochs noch oanbiede wolle, gean dan werom en kies in oare namme.
'file-exists-duplicate' => 'Dizze triem is idintyk oan {{PLURAL:$1|de folgjende triem|de folgjende triemmen}}:',
'file-deleted-duplicate' => "In bestân idintyk oan dit bestân ([[:$1]]) is foarhinne fuorthelle.
Rieplachtsje it fuorthel-logboek foar't jo fierder geane.",
-'successfulupload' => 'Oanbieden slagge.',
'uploadwarning' => 'Oanbied-warskôging',
'savefile' => 'Lis triem fêst',
'uploadedimage' => ' "[[$1]]" oanbean',
@@ -1407,6 +1386,7 @@ JD # Jenoptik
MGP # Pentax
PICT # ferskaat
#</pre> <!-- lit dizze line exakt sa't er is -->",
+'upload-success-subj' => 'Oanbieden slagge.',
'upload-proto-error' => 'Ferkeard protokol',
'upload-proto-error-text' => "Oanbieden mei dizze metoade freget URL's dy't begjinne mei <code>http://</code> of <code>ftp://</code>.",
@@ -1551,7 +1531,6 @@ Ferjit net de "Wat is hjirmei keppele" nei te gean foar it fuortheljen fan dit s
'statistics-edits-average' => 'Trochstrings tal bewurkings per side',
'statistics-views-total' => 'Totaal oantal werjûne siden',
'statistics-views-peredit' => 'Werjûne siden per bewurking',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job-queue-langte]',
'statistics-users' => 'Registrearre [[Special:ListUsers|brûkers]]',
'statistics-users-active' => 'Aktive brûkers',
'statistics-users-active-desc' => "Brûkers dy't yn 'e ôfrûne {{PLURAL:$1|dei|$1 dagen}} in hanneling útfierd hawwe",
@@ -1756,7 +1735,6 @@ De ûntfanger kin dus daliks nei jo reagearje.',
# Watchlist
'watchlist' => 'Folchlist',
'mywatchlist' => 'Folchlist',
-'watchlistfor' => "(foar '''$1''')",
'nowatchlist' => 'Jo hawwe gjin siden op jo folchlist.',
'watchnologin' => 'Net oanmeld yn',
'watchnologintext' => 'Jo moatte [[Special:UserLogin|oanmeld]] wêze om jo folchlist te feroarjen.',
@@ -2006,7 +1984,6 @@ Meld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
(List fan [[Special:IPBlockList|útslette meidoggers]].)',
'ipb-unblock-addr' => 'Lit $1 yn',
'ipb-unblock' => 'Lit in meidogger of IP-adres yn',
-'ipb-blocklist-addr' => 'Besteande útsluting foar $1 besjen',
'ipb-blocklist' => 'Besteande útslutings besjen',
'unblockip' => 'Lit meidogger wer ta',
'unblockiptext' => 'Brûk dizze fjilden om in meidogger wer skriuwtagong te jaan.',
@@ -2245,10 +2222,10 @@ Gean nei oft latex, dvips, en gs goed ynstallearre binne en set om',
# Media information
'imagemaxsize' => 'Behein ôfmjittings fan ôfbyld op beskriuwingsside ta:',
'thumbsize' => 'Mjitte fan miniatueren:',
-'file-info' => '(triemgrutte: $1, MIME-type: $2)',
-'file-info-size' => '($1 × $2 pixel, triemgrutte: $3, MIME type: $4)',
+'file-info' => 'triemgrutte: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 pixel, triemgrutte: $3, MIME type: $4',
'file-nohires' => '<small>Gjin hegere resolúsje beskikber.</small>',
-'svg-long-desc' => '(SVG-triem, nominaal $1 × $2 pixels, triemgrutte: $3)',
+'svg-long-desc' => 'SVG-triem, nominaal $1 × $2 pixels, triemgrutte: $3',
'show-big-image' => 'Hegere resolúsje',
'show-big-image-thumb' => '<small>Grutte fan dizze ôfbylding: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php
index 5ff74ace..79e1f818 100644
--- a/languages/messages/MessagesGa.php
+++ b/languages/messages/MessagesGa.php
@@ -108,8 +108,7 @@ $messages = array(
'tog-editsection' => 'Cumasaigh mír-eagarthóireacht le naisc mar seo: [athrú]',
'tog-editsectiononrightclick' => 'Cumasaigh mír-eagarthóireacht le deaschliceáil<br /> ar cheannteidil (JavaScript)',
'tog-showtoc' => "Taispeáin an clár ábhair (d'ailt le níos mó ná 3 ceannteidil)",
-'tog-rememberpassword' => "Cuimhnigh ar m'fhocal faire ar an ríomhaire seo",
-'tog-editwidth' => 'Cuir uasmhéid ar an mbosca eagair',
+'tog-rememberpassword' => 'Cuimhnigh orm ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})',
'tog-watchcreations' => 'Cuir ar mo liosta faire leathanaigh a chruthaím',
'tog-watchdefault' => 'Déan faire ar leathanaigh a athraím',
'tog-watchmoves' => 'Cuir ar mo liosta faire leathanaigh a athainmnaím',
@@ -248,25 +247,20 @@ agus an [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar ú
'faqpage' => 'Project:Ceisteanna_Coiteanta',
# Vector skin
-'vector-action-addsection' => 'Cuir topaic leis',
-'vector-action-delete' => 'Scrios',
-'vector-action-move' => 'Athainmnigh',
-'vector-action-protect' => 'Glasáil',
-'vector-action-undelete' => 'Díscrios',
-'vector-action-unprotect' => 'Díghlasáil',
-'vector-namespace-category' => 'Catagóir',
-'vector-namespace-image' => 'Comhad',
-'vector-namespace-main' => 'Leathanach',
-'vector-namespace-mediawiki' => 'Teachtaireacht',
-'vector-namespace-special' => 'Leathanach speisialta',
-'vector-view-create' => 'Cruthaigh',
-'vector-view-edit' => 'Athraigh an lch seo',
-'vector-view-history' => 'Féach ar stair',
-'vector-view-view' => 'Léigh',
-'vector-view-viewsource' => 'Féach ar fhoinse',
-'actions' => 'Gníomhartha',
-'namespaces' => 'Ainmspásanna',
-'variants' => 'Leaganacha Malartacha',
+'vector-action-addsection' => 'Cuir topaic leis',
+'vector-action-delete' => 'Scrios',
+'vector-action-move' => 'Athainmnigh',
+'vector-action-protect' => 'Glasáil',
+'vector-action-undelete' => 'Díscrios',
+'vector-action-unprotect' => 'Díghlasáil',
+'vector-view-create' => 'Cruthaigh',
+'vector-view-edit' => 'Athraigh an lch seo',
+'vector-view-history' => 'Féach ar stair',
+'vector-view-view' => 'Léigh',
+'vector-view-viewsource' => 'Féach ar fhoinse',
+'actions' => 'Gníomhartha',
+'namespaces' => 'Ainmspásanna',
+'variants' => 'Leaganacha Malartacha',
'errorpagetitle' => 'Earráid',
'returnto' => 'Fill ar ais go $1.',
@@ -322,6 +316,8 @@ agus an [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar ú
'jumpto' => 'Léim go:',
'jumptonavigation' => 'nascleanúint',
'jumptosearch' => 'cuardaigh',
+'pool-timeout' => 'Thar am ag feitheamh leis an nglas',
+'pool-errorunknown' => 'Earráid anaithnid',
# 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' => 'Maidir leis an {{SITENAME}}',
@@ -490,7 +486,7 @@ Cruthaíodh do chuntas. Ná déan dearmad athrú a dhéanamh ar do chuid [[Speci
'yourname' => "D'ainm úsáideora",
'yourpassword' => "D'fhocal faire",
'yourpasswordagain' => "Athiontráil d'fhocal faire",
-'remembermypassword' => 'Cuimhnigh orm',
+'remembermypassword' => "Cuimhnigh ar m'fhocal faire ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})",
'yourdomainname' => "D'fhearann",
'externaldberror' => 'Bhí earráid bhunachair sonraí ann maidir le fíordheimhniú seachtrach, nóThere was either an external authentication database error or you are not allowed to update your external account.',
'login' => 'Logáil isteach',
@@ -507,6 +503,7 @@ Cruthaíodh do chuntas. Ná déan dearmad athrú a dhéanamh ar do chuid [[Speci
'gotaccount' => "An bhfuil cuntas agat cheana féin? '''$1'''.",
'gotaccountlink' => 'Logáil isteach',
'createaccountmail' => 'le ríomhphost',
+'createaccountreason' => 'Fáth:',
'badretype' => "D'iontráil tú dhá fhocal faire difriúla.",
'userexists' => 'Tá an ainm úsáideora sin in úsáid cheana féin.<br />
Roghnaigh ainm eile agus bain triail eile as.',
@@ -564,6 +561,9 @@ Iontráil seoladh dea-fhormáidte le do thoil, nó glan an réimse sin.',
'usernamehasherror' => 'Ní cheadaítear hais a úsáid in ainm úsáideora',
'loginlanguagelabel' => 'Teanga: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'Earráid anaithnid i bhfeidhm mail() de chuid PHP',
+
# Password reset dialog
'resetpass' => "Athraigh d'fhocal faire",
'resetpass_announce' => "Tá tú logáilte isteach le cód sealadach a seoladh chugat i r-phost.
@@ -656,7 +656,7 @@ níor sábháladh é go fóill!'''",
'userjspreview' => "'''Cuimhnigh nach bhfuil seo ach réamhamharc do JavaScript úsáideora
- níor sábháladh é go fóill!'''",
'userinvalidcssjstitle' => "'''Rabhadh:''' Níl an craiceann \"\$1\" ann.
-Cuimhnigh go n-úsáideann leathanaigh shaincheaptha .css agus .js teideal i gcás íochtar, m.sh. {{ns:user}}:Foo/monobook.css i leapa {{ns:user}}:Foo/Monobook.css.",
+Cuimhnigh go n-úsáideann leathanaigh shaincheaptha .css agus .js teideal i gcás íochtar, m.sh. {{ns:user}}:Foo/vector.css i leapa {{ns:user}}:Foo/Vector.css.",
'updated' => '(Leasaithe)',
'note' => "'''Tabhair faoi deara:'''",
'previewnote' => "'''Cuimhnigh nach bhfuil ach réamhamharc sa leathanach seo, agus nach sábháladh fós é!'''",
@@ -684,9 +684,6 @@ Ina theannta sin, geallann tú gur scríobh tú féin an dréacht seo, nó gur c
Murar mian leat go gcuirfí do chuid scríbhinne in eagar go héadrócaireach, ná cuir isteach anseo í.<br />
Ina theannta sin, geallann tú gur scríobh tú féin an dréacht seo, nó gur chóipeáil tú é ó fhoinse san fhearann poiblí nó acmhainn eile saor ó chóipcheart (féach ar $1 le haghaidh tuilleadh eolais).
'''Nà CUIR ISTEACH OBAIR LE CÓIPCHEART GAN CHEAD!'''",
-'longpagewarning' => "'''Rabhadh:''' Tá an leathanach seo $1 cilibheart i bhfad;
-ní féidir le roinnt brabhsálaithe leathanaigh a athrú má tá siad thart ar 32kb, nó níos fada.
-Féach más féidir, le do thoil an leathanach a roinnt ina chodanna níos bige.",
'longpageerror' => "'''EARRÃID: Tá an téacs a chuir isteach $1 cilibheart ar fad, sin níos faide ná $2 cilibheart, an uasmhéid.
Ní féidir é a shábháil.'''",
'readonlywarning' => "'''Rabhadh: Glasáladh an bunachar sonraí chun cothabháil a dhéanamh, agus mar sin ní féidir leat do chuid athruithe a shábháil go díreach anois.
@@ -862,6 +859,7 @@ Bain triail as ''all:'' a chur roimh d'iarratas chun an t-inneachar ar fad (leat
'resultsperpage' => 'Torthaí le taispeáint ó leathanach:',
'contextlines' => 'Línte le taispeáint do gach toradh:',
'contextchars' => 'Litreacha chomhthéacs ar gach líne:',
+'stub-threshold-disabled' => 'Díchumasaithe',
'recentchangesdays' => 'Méid laethanta le taispeáint sna hathruithe is déanaí:',
'recentchangesdays-max' => '(uasmhéid $1 {{PLURAL:$1|lá|lá}})',
'recentchangescount' => 'Méid athrú le taispeáint:',
@@ -971,12 +969,7 @@ do chuid dreachtaí a chur i leith tusa.',
'recentchanges-legend' => 'Roghanna do na hathruithe is déanaí',
'recentchangestext' => 'Déan faire ar na hathruithe is déanaí sa vicí ar an leathanach seo.',
'recentchanges-feed-description' => 'Rianaigh na n-athruite vicí is déanaí sa fotha seo.',
-'recentchanges-label-legend' => 'Eochair eolais: $1.',
-'recentchanges-legend-newpage' => '$1 - leathanach nua',
-'recentchanges-legend-minor' => '$1 - mionathrú',
-'recentchanges-legend-bot' => '$1 - athrú de chuid róbó',
'recentchanges-label-bot' => 'Chomhlíon róbó an t-athrú seo',
-'recentchanges-legend-unpatrolled' => '$1 - athrú neamh-phatrólaithe',
'rcnote' => "Is {{PLURAL:$1|é seo a leanas <strong>an t-athrú amháin</strong>|iad seo a leanas na <strong>$1</strong> athruithe is déanaí}} {{PLURAL:$2|ar feadh an lae dheireanaigh|ar feadh na '''$2''' lá deireanacha}}, as $5, $4.",
'rcnotefrom' => 'Is iad seo a leanas na hathruithe ó <b>$2</b> (go dti <b>$1</b> taispeánaithe).',
'rclistfrom' => 'Taispeáin athruithe nua ó $1 anuas.',
@@ -1046,7 +1039,6 @@ an comhad agus déan athiarracht, más é do thoil é.',
míchruinneas é seo san ainm chomhaid. Seiceáil más é an comhad seo atá le huaslódáil agat.",
'fileexists-forbidden' => 'Tá comhad eile leis an ainm seo ann fós, agus ní féidie é a forscríobh.
Má theastáilann uait do chomhad a uaslódáil fós, téigh ar ais agus úsáid ainm nua, le do thoil. [[File:$1|thumb|center|$1]]',
-'successfulupload' => "D'éirigh leis an uaslódáil",
'uploadwarning' => 'Rabhadh suaslódála',
'savefile' => 'Sábháil comhad',
'uploadedimage' => 'uaslódáladh "[[$1]]"',
@@ -1057,6 +1049,7 @@ Má theastáilann uait do chomhad a uaslódáil fós, téigh ar ais agus úsáid
'destfilename' => 'Comhadainm sprice:',
'upload-maxfilesize' => 'Méad comhad is mó: $1',
'watchthisupload' => 'Déan faire ar an leathanach seo',
+'upload-success-subj' => "D'éirigh leis an uaslódáil",
'upload-proto-error' => 'Prótacal mícheart',
'upload-file-error' => 'Earráid inmheánach',
@@ -1287,7 +1280,6 @@ Beidh do seoladh ríomhphoist a d\'iontráil tú i [[Special:Preferences|do chui
# Watchlist
'watchlist' => 'Mo liosta faire',
'mywatchlist' => 'Mo liosta faire',
-'watchlistfor' => "(le '''$1''')",
'nowatchlist' => 'Níl aon rud ar do liosta faire.',
'watchlistanontext' => "$1, le d'thoil, chun míreanna ar do liosta faire a fheiceáil ná a athrú.",
'watchnologin' => 'Níl tú logáilte isteach',
@@ -1853,10 +1845,10 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
B'fheidir go gcuirfear do chóras i gcontúirt dá rithfeá é.",
'imagemaxsize' => "Teorainn mhéid íomhá:<br />''(leathanaigh thuarascáil chomhaid)''",
'thumbsize' => 'Méid mionsamhlacha:',
-'file-info' => '(méid comhad : $1, saghas MIME: $2)',
-'file-info-size' => '($1 × $2 picteilín, méid comhaid: $3, cineál MIME: $4)',
+'file-info' => 'méid comhad : $1, saghas MIME: $2',
+'file-info-size' => '$1 × $2 picteilín, méid comhaid: $3, cineál MIME: $4',
'file-nohires' => '<small>Níl aon taifeach is mó ar fáil.</small>',
-'svg-long-desc' => '(Comhad SVG, ainmniúil $1 × $2 picteilíni, méid comhaid: $3)',
+'svg-long-desc' => 'Comhad SVG, ainmniúil $1 × $2 picteilíni, méid comhaid: $3',
'show-big-image' => 'Taispeáin leagan ardtaifigh den íomhá',
'show-big-image-thumb' => '<small>Méid an réamhamhairc seo: $1 × $2 picteilín</small>',
diff --git a/languages/messages/MessagesGag.php b/languages/messages/MessagesGag.php
index 5c95e77d..8c62d9a6 100644
--- a/languages/messages/MessagesGag.php
+++ b/languages/messages/MessagesGag.php
@@ -29,8 +29,7 @@ $messages = array(
'tog-editsection' => 'Bölümleri [diiştir] baalantılarılan diiştirmää hakkı ver',
'tog-editsectiononrightclick' => 'Bölüm başlıına saa tuşla basarak bölümü düzmää izin ver.(JavaScript)',
'tog-showtoc' => 'İçindäkiler tablițasını düz<br />(3-tän çok başlıı olan sayfalar için)',
-'tog-rememberpassword' => 'Parolu hatırla',
-'tog-editwidth' => 'Diiştirmää eri brauzer penceräsi büüklüktä olsun',
+'tog-rememberpassword' => 'Parolu hatırla (en fazla $1 {{PLURAL:$1|gün|gün}})',
'tog-watchcreations' => 'Yarattıım sayfaları bakmaa listama ekle',
'tog-watchdefault' => 'Diişmäk yapılan sayfayı bakmaa listasına ekle',
'tog-watchmoves' => 'Bakmaa listama ekle o sayfaları angılarını taşıdım',
@@ -75,18 +74,18 @@ $messages = array(
'thu' => 'Per',
'fri' => 'Cumaa',
'sat' => 'Cts',
-'january' => 'Yanvar',
-'february' => 'Fevral',
-'march' => 'Marta',
-'april' => 'Aprel',
-'may_long' => 'May',
-'june' => 'İyün',
-'july' => 'İyül',
-'august' => 'Avgust',
-'september' => 'Sentäbri',
-'october' => 'Oktäbri',
-'november' => 'Noyabri',
-'december' => 'Dekabri',
+'january' => 'Büük ay',
+'february' => 'Küçük ay',
+'march' => 'Baba Marta',
+'april' => 'Çiçek ay',
+'may_long' => 'Hederlez',
+'june' => 'Kirez ay',
+'july' => 'Orak ay',
+'august' => 'Harman ay',
+'september' => 'Ceviz ay',
+'october' => 'Canavar ay',
+'november' => 'Kasım',
+'december' => 'Kırım ay',
'january-gen' => 'Büük ay',
'february-gen' => 'Küçük ay',
'march-gen' => 'Baba Marta',
@@ -156,6 +155,7 @@ $messages = array(
# Vector skin
'vector-view-edit' => 'DiiÅŸtir',
+'vector-view-view' => 'Oku',
'errorpagetitle' => 'Yannış',
'returnto' => '$1 dön.',
@@ -314,7 +314,7 @@ Esapınız açıldı. Unutmayın [[Special:Preferences|{{SITENAME}} preferences]
'yourname' => 'Kullanıcı adınız',
'yourpassword' => 'Parol',
'yourpasswordagain' => 'Parolu enidän yaz',
-'remembermypassword' => 'Parolu hatırla.',
+'remembermypassword' => 'Parolu hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
'yourdomainname' => 'Domen adınız',
'login' => 'Gir',
'nav-login-createaccount' => 'Gir / esap yarat',
@@ -438,7 +438,6 @@ lițenziyası şartları içindä (detallar için $1'a bakınız).
Herliim istemeersiniz ani sizin tekstlär serbest yayılsın hem diiştirilsin übür kullanıcılar tarafınnan, onnarı erleştirmeyniz buraya.<br />
Hem siz garantiyada bulunêrsiniz ani eklemäklerin avtorusunuz, yaki onnarı kopiya ettiniz kaynaktan angısı izin verer teksti serbest yaymaa hem diiştirmää.<br />
'''<center>AVTORLUK KORUNMAK HAKKILAN KORUNMAYAN MATERÄ°ALLAR EKLEMEYNÄ°Z!</center>'''",
-'longpagewarning' => "'''BAK: Bu sayfanın ölçüsü $1 kilobayt; ölçüsü 32 kb-a yakın yaki onnan çok sayfalar bir takım brauzerlärdä var nicä yannış görünsün. Savaşênız onu bölümnerä ayırmaa.'''",
'templatesused' => 'Bu sayfada kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
'templatesusedpreview' => '{{PLURAL:$1|Şablon|Şablonnar}} ani bu ön siirdä kullanıldı:',
'templatesusedsection' => 'Bu bölümde kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
@@ -657,6 +656,7 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
'statistics-edits' => '{{SITENAME}} kurulmaa beeri yapmaa sayfa diişmäkleri',
'statistics-edits-average' => 'Her yapraktaki diişmäklerin sayısı',
'statistics-views-total' => 'Hepsi resimlär',
+'statistics-views-total-desc' => 'Var nica olmadı hem maasus yapraklarından resim eklenmee',
'statistics-views-peredit' => 'Diişmäk başına resimlär',
'statistics-users' => 'Registratlı [[Special:ListUsers|kullanıcılar]]',
'statistics-users-active' => 'Aktivli kullanıcılar',
@@ -746,7 +746,6 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
# Watchlist
'watchlist' => 'Bakmaa listam',
'mywatchlist' => 'Bakmaa listam',
-'watchlistfor' => "('''$1''' için)",
'addedwatch' => 'Bakmaa listasına registrat edildi.',
'addedwatchtext' => '"<nowiki>$1</nowiki>" adlı sayfa [[Special:Watchlist|bakmaa listanıza]] registrat olundu.
@@ -939,6 +938,8 @@ Yalvarêrêz başka bir ad seçmää.',
'tooltip-search' => '{{SITENAME}} içindä ara',
'tooltip-search-go' => 'Herliim varsa, git salt bu adlı bir sayfaa',
'tooltip-search-fulltext' => 'Bu tekst için sayfaları aara',
+'tooltip-p-logo' => '
+Dönün baş yapraa',
'tooltip-n-mainpage' => 'Dönün baş yapraa',
'tooltip-n-mainpage-description' => 'Dönün baş yapraa',
'tooltip-n-portal' => 'Proyekt uurunda, ne nändä, nelär var nicä yapmaa',
@@ -979,9 +980,9 @@ Yalvarêrêz başka bir ad seçmää.',
'nextdiff' => 'Geerki versiyalan aradaki fark →',
# Media information
-'file-info-size' => '($1 × $2 piksel, fayl ölçüsü: $3, MIME tipi: $4)',
+'file-info-size' => '$1 × $2 piksel, fayl ölçüsü: $3, MIME tipi: $4',
'file-nohires' => '<small>Taa üüksek aydınnıklı versiya bulunmêêr.</small>',
-'svg-long-desc' => '(SVG faylı, nominal $1 × $2 piksel, fayl ölçüsü: $3)',
+'svg-long-desc' => 'SVG faylı, nominal $1 × $2 piksel, fayl ölçüsü: $3',
'show-big-image' => 'Taman aydınnık',
'show-big-image-thumb' => '<small>Ön siir ölçüsü: $1 × $2 piksel</small>',
diff --git a/languages/messages/MessagesGan_hans.php b/languages/messages/MessagesGan_hans.php
index 2b298308..b928663d 100644
--- a/languages/messages/MessagesGan_hans.php
+++ b/languages/messages/MessagesGan_hans.php
@@ -46,8 +46,7 @@ $messages = array(
'tog-editsection' => 'å¯ä»¥ç”¨[编写]链接æ¥ç¼–写个别段è½',
'tog-editsectiononrightclick' => 'å¯ä»¥æŒ‰å³é”®æ¥ç¼–写åªæŠŠå­æ®µè½ï¼ˆJavaScript)',
'tog-showtoc' => '超过三åªæ ‡é¢˜å°±æ˜¾åˆ°ç›®å½•',
-'tog-rememberpassword' => '到个åªç”µè„‘记到å¶ð ®¶å¯†ç ',
-'tog-editwidth' => '加阔修改æ åˆ°å®Œä¸ªè¤å¹•',
+'tog-rememberpassword' => '到个åªç”µè„‘记到å¶ð ®¶å¯†ç  (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'æ‹¿å¶å¼€å˜žð ®¶é¡µé¢åŠ åˆ°å¶ð ®¶ç›‘视列表',
'tog-watchdefault' => 'æ‹¿å¶æ”¹å˜žð ®¶é¡µé¢åŠ åˆ°å¶ð ®¶ç›‘视列表',
'tog-watchmoves' => 'æ‹¿å¶åŠ¨å˜žð ®¶é¡µé¢åŠ åˆ°å¶ð ®¶ç›‘视列表',
@@ -193,31 +192,20 @@ $messages = array(
'faqpage' => 'Project:问得蛮多𠮶问题',
# Vector skin
-'vector-action-addsection' => '添主题',
-'vector-action-delete' => '删å¥',
-'vector-action-move' => '移å¥',
-'vector-action-protect' => '护到',
-'vector-action-undelete' => '望下删å¥ð ®¶é¡µé¢',
-'vector-action-unprotect' => '解除ä¿æŠ¤',
-'vector-namespace-category' => '分类',
-'vector-namespace-help' => '帮助页',
-'vector-namespace-image' => '档案',
-'vector-namespace-main' => '页é¢',
-'vector-namespace-media' => '媒体页',
-'vector-namespace-mediawiki' => '介é¢',
-'vector-namespace-project' => '计划页',
-'vector-namespace-special' => '特别页',
-'vector-namespace-talk' => '谈詑',
-'vector-namespace-template' => '模æ¿',
-'vector-namespace-user' => '用户页',
-'vector-view-create' => '创建',
-'vector-view-edit' => '编辑',
-'vector-view-history' => '望下历å²',
-'vector-view-view' => '读',
-'vector-view-viewsource' => '望下原始ç ',
-'actions' => '动作',
-'namespaces' => '空间å',
-'variants' => 'å˜æ¢',
+'vector-action-addsection' => '添主题',
+'vector-action-delete' => '删å¥',
+'vector-action-move' => '移å¥',
+'vector-action-protect' => '护到',
+'vector-action-undelete' => '望下删å¥ð ®¶é¡µé¢',
+'vector-action-unprotect' => '解除ä¿æŠ¤',
+'vector-view-create' => '创建',
+'vector-view-edit' => '编辑',
+'vector-view-history' => '望下历å²',
+'vector-view-view' => '读',
+'vector-view-viewsource' => '望下原始ç ',
+'actions' => '动作',
+'namespaces' => '空间å',
+'variants' => 'å˜æ¢',
'errorpagetitle' => '错误',
'returnto' => '回到$1。',
@@ -426,7 +414,7 @@ $2',
'yourname' => '用户å:',
'yourpassword' => '密ç ï¼š',
'yourpasswordagain' => '输过é“密ç ï¼š',
-'remembermypassword' => '让电脑记到密ç ',
+'remembermypassword' => 'è®©ç”µè„‘è®°åˆ°å¯†ç  (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => '倷𠮶域å:',
'externaldberror' => '外部验è¯æ•°æ®åº“出错,或倷更新伓正倷𠮶外部å¸æˆ·ã€‚',
'login' => '登入',
@@ -443,6 +431,7 @@ $2',
'gotaccount' => "有喽å¸æˆ·ï¼Ÿ '''$1'''.",
'gotaccountlink' => '登入',
'createaccountmail' => '通过email',
+'createaccountreason' => '原因:',
'badretype' => '倷输𠮶密ç ä¼“åˆã€‚',
'userexists' => '倷输𠮶用户å系人家𠮶,选过åªå–½ï¼',
'loginerror' => '登入错误',
@@ -575,7 +564,7 @@ $2',
'userjsyoucanpreview' => "'''æ示:''' 存到å‰è¯·ç”¨'望å–èµ·'æ¥æµ‹å–倷𠮶新JS 。",
'usercsspreview' => "'''注æ„倷å•ç³»åˆ°é¢„览倷个人𠮶 CSS,内容哈冇ä¿å­˜ï¼'''",
'userjspreview' => "'''注æ„倷å•ç³»åˆ°æµ‹è¯•ï¼é¢„览倷个人𠮶 JavaScript,内容哈冇ä¿å­˜ï¼'''",
-'userinvalidcssjstitle' => "'''警告:''' 冇\"\$1\"𠮶皮肤。请记到自定义𠮶 .css åŒ .js 页è¦ç”¨å°å†™ã€‚å°±è¯ï¼Œ{{ns:user}}:Foo/monobook.css ä¼“ç­‰åŒ {{ns:user}}:Foo/Monobook.css。",
+'userinvalidcssjstitle' => "'''警告:''' 冇\"\$1\"𠮶皮肤。请记到自定义𠮶 .css åŒ .js 页è¦ç”¨å°å†™ã€‚å°±è¯ï¼Œ{{ns:user}}:Foo/vector.css ä¼“ç­‰åŒ {{ns:user}}:Foo/Vector.css。",
'updated' => '(更新正喽)',
'note' => "'''注æ„:'''",
'previewnote' => "'''请记到个光系预览,内容哈冇ä¿å­˜ï¼'''",
@@ -609,8 +598,6 @@ $2',
'copyrightwarning2' => "请记得别𠮶人编得正ã€æ”¹å¾—正或者删得正倷到{{SITENAME}}𠮶全部贡献。è¦ç³»å€·ä¼“想自家𠮶编辑好嚟嚟拖改å¥ï¼Œå”‰å°±èŽ«é€’交。<br />
倷都è¦è¯æ­£å€·ð ®¶æ–‡å­—系倷自家写𠮶,或者系公有领域或别𠮶自由资æºå¤åˆ¶åˆ°ð ®¶ï¼ˆæœ›å–$1有别𠮶资料)。
'''冇任何许å¯ð ®¶æƒ…况下请莫递交有版æƒð ®¶ä½œå“ï¼'''",
-'longpagewarning' => "'''警告:个页有$1 kilobyteså’长;有𠮶æµè§ˆå™¨ä¼šç¼–伓正超å¥32 kb𠮶页é¢ã€‚
-请考虑å–拿佢分到细嚸𠮶å°æ®µè½ã€‚'''",
'longpageerror' => "'''错误:倷递交𠮶文字有$1 kilobyteså’长,佢长过最大𠮶$2 kilobytes。存伓正倷递交𠮶文字。'''",
'readonlywarning' => "'''警告: æ•°æ®åº“é”到嘞进行定期修护,眼下倷存伓正倷𠮶改动。倷å¯ä»¥æ‹¿ä½¢å­˜åˆ°æ–‡æ¡£å†è‘—。'''",
'protectedpagewarning' => "'''警告: 个页已ç»å—ä¿æŠ¤ï¼Œå•åªç®¡ç†å‘˜æƒé™ð ®¶ç”¨æˆ·æ‰æ”¹å¾—正。'''",
@@ -963,7 +950,6 @@ $2',
'file-thumbnail-no' => "个åªæ¡£æ¡ˆå系以'''<tt>$1</tt>'''开头。佢好åƒä¸€åªå›¾åƒð ®¶ç¼©å°ç‰ˆ''(缩图)''。如果倷有个åªå›¾åƒð ®¶å®Œæ•´ç‰ˆï¼Œä¼“然请å†æ”¹è¿‡åªæ¡£å。",
'fileexists-forbidden' => '个åªæ¡£æ¡ˆå已存在;请回头并æ¢è¿‡åªæ–°ð ®¶å称æ¥ä¸Šä¼ ä¸ªåªæ¡£æ¡ˆã€‚[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => '到共用档案库里度有嘞åŒå𠮶档案;请回头并æ¢è¿‡åªæ–°ð ®¶å称æ¥ä¸Šä¼ ä¸ªåªæ¡£æ¡ˆã€‚[[File:$1|thumb|center|$1]]',
-'successfulupload' => '上传正嘞',
'uploadwarning' => '上传警告',
'savefile' => 'ä¿å­˜ç›˜æ¡ˆ',
'uploadedimage' => '上传正嘞"[[$1]]"',
@@ -981,6 +967,7 @@ $2',
倷è¦æƒ³æ­£ç³»çœŸð ®¶ä¸Šä¼ ä¸ªåªæ¡£æ¡ˆã€‚
为到方便起è§ï¼Œä¸ªåªæ¡£æ¡ˆð ®¶åˆ é™¤è®°å½•åˆ°ä¸‹åº•æ供嘞:",
'filename-bad-prefix' => "倷上传𠮶档案å系以'''\"\$1\"'''åšå¼€å¤´ð ®¶ï¼Œé€šå¸¸ä¸ªç§å†‡æ„义𠮶å字系数ç ç›¸æœºåº¦ð ®¶è‡ªåŠ¨ç¼–排。请到倷𠮶档案拣过åªæ›´åŠ æœ‰æ„义𠮶å字。",
+'upload-success-subj' => '上传正嘞',
'upload-proto-error' => 'å定错误',
'upload-proto-error-text' => '远程上传è¦æ±‚ URL 用 <code>http://</code> 或 <code>ftp://</code> 开头。',
@@ -1254,7 +1241,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => '监视列表',
'mywatchlist' => 'å¶ð ®¶ç›‘视列表',
-'watchlistfor' => "('''$1'''𠮶监视列表')",
'nowatchlist' => '倷𠮶监视列表什哩都冇有。',
'watchlistanontext' => '请$1眵å–或改å–倷𠮶监视列表。',
'watchnologin' => '冇登入',
@@ -1347,7 +1333,9 @@ $NEWPAGE
'editcomment' => "编辑介ç»: \"''\$1''\"。",
'revertpage' => '返回由[[Special:Contributions/$2|$2]] ([[User talk:$2|对è¯]])𠮶编辑;æ¢å¤åˆ°[[User:$1|$1]]𠮶最末一åªç‰ˆæœ¬',
'rollback-success' => '返回由$1𠮶编辑;æ¢å¤åˆ°$2𠮶最末一åªç‰ˆæœ¬ã€‚',
-'sessionfailure' => '倷𠮶登入好åƒæœ‰åš¸é—®é¢˜ï¼Œä¸ºåˆ°é˜²èŒƒæœªç„¶ï¼Œä¸ªåªåŠ¨ä½œæ‹–å–消嘞。
+
+# Edit tokens
+'sessionfailure' => '倷𠮶登入好åƒæœ‰åš¸é—®é¢˜ï¼Œä¸ºåˆ°é˜²èŒƒæœªç„¶ï¼Œä¸ªåªåŠ¨ä½œæ‹–å–消嘞。
请按å–“åŽé€€â€å†è¯•è¿‡å•°ï¼',
@@ -1509,7 +1497,6 @@ $1',
'ipb-edit-dropdown' => '编写å°é”原因',
'ipb-unblock-addr' => '解å°$1',
'ipb-unblock' => '解å°ç”¨æˆ·å或IP地å€',
-'ipb-blocklist-addr' => '望å–$1ç›®å‰ð ®¶å°ç¦',
'ipb-blocklist' => '望å–ç›®å‰ð ®¶å°ç¦',
'unblockip' => '解å°IP地å€',
'unblockiptext' => '用下底𠮶表格去æ¢å¤æ—©å…ˆæ‹–å°ð ®¶IP𠮶编写æƒã€‚',
@@ -1848,10 +1835,10 @@ $1',
'imagemaxsize' => '档案解释页𠮶图åƒå¤§ç»†é™åˆ¶åˆ°:',
'thumbsize' => '缩略图大细:',
'widthheightpage' => '$1×$2,$3页',
-'file-info' => '(档案大细: $1, MIME 类型: $2)',
-'file-info-size' => '($1 × $2 åƒç´ ï¼Œæ¡£æ¡ˆå¤§ç»†ï¼š$3 ,MIME类型:$4)',
+'file-info' => '档案大细: $1, MIME 类型: $2',
+'file-info-size' => '$1 × $2 åƒç´ ï¼Œæ¡£æ¡ˆå¤§ç»†ï¼š$3 ,MIME类型:$4',
'file-nohires' => '<small>冇更高分辨率𠮶图åƒã€‚</small>',
-'svg-long-desc' => '(SVG档案,表é¢å¤§ç»†ï¼š $1 × $2 åƒç´ ï¼Œæ¡£æ¡ˆå¤§ç»†ï¼š$3)',
+'svg-long-desc' => 'SVG档案,表é¢å¤§ç»†ï¼š $1 × $2 åƒç´ ï¼Œæ¡£æ¡ˆå¤§ç»†ï¼š$3',
'show-big-image' => '完整分辨率',
'show-big-image-thumb' => '<small>个幅缩略图𠮶分辨率: $1 × $2 åƒç´ </small>',
diff --git a/languages/messages/MessagesGan_hant.php b/languages/messages/MessagesGan_hant.php
index 89fabb83..13193193 100644
--- a/languages/messages/MessagesGan_hant.php
+++ b/languages/messages/MessagesGan_hant.php
@@ -69,8 +69,7 @@ $messages = array(
'tog-editsection' => 'å¯ä»¥ç”¨[編寫]連çµä¾†ç·¨å¯«å€‹åˆ¥æ®µè½',
'tog-editsectiononrightclick' => 'å¯ä»¥æŒ‰å³éµä¾†ç·¨å¯«éš»æŠŠå­æ®µè½ï¼ˆJavaScript)',
'tog-showtoc' => '超éŽä¸‰éš»æ¨™é¡Œå°±é¡¯åˆ°ç›®éŒ„',
-'tog-rememberpassword' => '到箇隻電腦記到å¶å—°å¯†ç¢¼',
-'tog-editwidth' => '加闊修改欄到完個螢幕',
+'tog-rememberpassword' => '到箇隻電腦記到å¶å—°å¯†ç¢¼ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'æ‹¿å¶é–‹å˜žå—°é é¢åŠ åˆ°å¶å—°ç›£è¦–列表',
'tog-watchdefault' => 'æ‹¿å¶æ”¹å˜žå—°é é¢åŠ åˆ°å¶å—°ç›£è¦–列表',
'tog-watchmoves' => 'æ‹¿å¶å‹•å˜žå—°é é¢åŠ åˆ°å¶å—°ç›£è¦–列表',
@@ -216,31 +215,20 @@ $messages = array(
'faqpage' => 'Project:å•å¾—蠻多嗰å•é¡Œ',
# Vector skin
-'vector-action-addsection' => '添主題',
-'vector-action-delete' => '刪å¥',
-'vector-action-move' => '移å¥',
-'vector-action-protect' => '護到',
-'vector-action-undelete' => '望下刪å¥å—°é é¢',
-'vector-action-unprotect' => '解除ä¿è­·',
-'vector-namespace-category' => '分類',
-'vector-namespace-help' => '幫助é ',
-'vector-namespace-image' => '檔案',
-'vector-namespace-main' => 'é é¢',
-'vector-namespace-media' => '媒體é ',
-'vector-namespace-mediawiki' => '介é¢',
-'vector-namespace-project' => '計劃é ',
-'vector-namespace-special' => '特別é ',
-'vector-namespace-talk' => '談詑',
-'vector-namespace-template' => '模æ¿',
-'vector-namespace-user' => '用戶é ',
-'vector-view-create' => '創建',
-'vector-view-edit' => '編輯',
-'vector-view-history' => '望下歷å²',
-'vector-view-view' => '讀',
-'vector-view-viewsource' => '望下原始碼',
-'actions' => '動作',
-'namespaces' => '空間å',
-'variants' => '變æ›',
+'vector-action-addsection' => '添主題',
+'vector-action-delete' => '刪å¥',
+'vector-action-move' => '移å¥',
+'vector-action-protect' => '護到',
+'vector-action-undelete' => '望下刪å¥å—°é é¢',
+'vector-action-unprotect' => '解除ä¿è­·',
+'vector-view-create' => '創建',
+'vector-view-edit' => '編輯',
+'vector-view-history' => '望下歷å²',
+'vector-view-view' => '讀',
+'vector-view-viewsource' => '望下原始碼',
+'actions' => '動作',
+'namespaces' => '空間å',
+'variants' => '變æ›',
'errorpagetitle' => '錯誤',
'returnto' => '去歸$1。',
@@ -449,7 +437,7 @@ $2',
'yourname' => '用戶å:',
'yourpassword' => '密碼:',
'yourpasswordagain' => '輸éŽé“密碼:',
-'remembermypassword' => '讓電腦記到密碼',
+'remembermypassword' => '讓電腦記到密碼 (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => '倷嗰域å:',
'externaldberror' => '外部驗證資料庫出錯,或倷更新伓正倷嗰外部帳戶。',
'login' => '登入',
@@ -466,6 +454,7 @@ $2',
'gotaccount' => "有å˜å¸³æˆ¶ï¼Ÿ '''$1'''.",
'gotaccountlink' => '登入',
'createaccountmail' => '通éŽemail',
+'createaccountreason' => '原因:',
'badretype' => '倷輸嗰密碼伓åˆã€‚',
'userexists' => '倷輸嗰用戶å係人家嗰,é¸éŽéš»å˜ï¼',
'loginerror' => '登入錯誤',
@@ -600,7 +589,7 @@ $2',
'userjsyoucanpreview' => "'''æ示:''' 存到å‰è«‹ç”¨'望å–èµ·'來測å–倷嗰新JS 。",
'usercsspreview' => "'''注æ„倷單係到é è¦½å€·å€‹äººå—° CSS,內容哈冇ä¿å­˜ï¼'''",
'userjspreview' => "'''注æ„倷單係到測試ï¼é è¦½å€·å€‹äººå—° JavaScript,內容哈冇ä¿å­˜ï¼'''",
-'userinvalidcssjstitle' => "'''警告:''' 冇\"\$1\"嗰皮膚。請記到自定義嗰 .css åŒ .js é è¦ç”¨å°å¯«ã€‚就話,{{ns:user}}:Foo/monobook.css ä¼“ç­‰åŒ {{ns:user}}:Foo/Monobook.css。",
+'userinvalidcssjstitle' => "'''警告:''' 冇\"\$1\"嗰皮膚。請記到自定義嗰 .css åŒ .js é è¦ç”¨å°å¯«ã€‚就話,{{ns:user}}:Foo/vector.css ä¼“ç­‰åŒ {{ns:user}}:Foo/Vector.css。",
'updated' => '(更新正å˜ï¼‰',
'note' => "'''注æ„:'''",
'previewnote' => "'''請記到箇光係é è¦½ï¼Œå…§å®¹å“ˆå†‡ä¿å­˜ï¼'''",
@@ -634,8 +623,6 @@ $2',
'copyrightwarning2' => "請記得別嗰人編得正ã€æ”¹å¾—正或者刪得正倷到{{SITENAME}}嗰全部貢ç»ã€‚è¦ä¿‚倷伓想自家嗰編輯好嚟嚟拕改å¥ï¼Œå”‰å°±èŽ«éžäº¤ã€‚<br />
倷都è¦è©±æ­£å€·å—°æ–‡å­—係倷自家寫嗰,或者係公有領域或別嗰自由資æºè¤‡è£½åˆ°å—°ï¼ˆæœ›å–$1有別嗰資料)。
'''冇任何許å¯å—°æƒ…æ³ä¸‹è«‹èŽ«éžäº¤æœ‰ç‰ˆæ¬Šå—°ä½œå“ï¼'''",
-'longpagewarning' => "'''警告:箇é æœ‰$1 kilobyteså’長;有嗰ç€è¦½å™¨æœƒç·¨ä¼“正超å¥32 kbå—°é é¢ã€‚
-請考慮å–拿佢分到細嚸嗰å°æ®µè½ã€‚'''",
'longpageerror' => "'''錯誤:倷éžäº¤å—°æ–‡å­—有$1 kilobyteså’長,佢長éŽæœ€å¤§å—°$2 kilobytes。存伓正倷éžäº¤å—°æ–‡å­—。'''",
'readonlywarning' => "'''警告: 資料庫鎖到嘞進行定期修護,眼下倷存伓正倷嗰改動。倷å¯ä»¥æ‹¿ä½¢å­˜åˆ°æ–‡æª”å†è‘—。'''",
'protectedpagewarning' => "'''警告: 箇é å·²ç¶“å—ä¿è­·ï¼Œå–®åªç®¡ç†å“¡è¨±å¯æ¬Šå—°ç”¨æˆ¶æ‰æ”¹å¾—正。'''",
@@ -990,7 +977,6 @@ $2',
'file-thumbnail-no' => "箇隻檔案å係以'''<tt>$1</tt>'''開頭。佢好åƒä¸€éš»åœ–åƒå—°ç¸®å°ç‰ˆ''(縮圖)''。如果倷有箇隻圖åƒå—°å®Œæ•´ç‰ˆï¼Œä¼“然請å†æ”¹éŽéš»æª”å。",
'fileexists-forbidden' => '箇隻檔案å已存在;請回頭並æ›éŽéš»æ–°å—°å稱來上傳箇隻檔案。[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => '到共用檔案庫裡度有嘞åŒå嗰檔案;請回頭並æ›éŽéš»æ–°å—°å稱來上傳箇隻檔案。[[File:$1|thumb|center|$1]]',
-'successfulupload' => '上傳正嘞',
'uploadwarning' => '上傳警告',
'savefile' => 'ä¿å­˜æª”案',
'uploadedimage' => '上傳正嘞"[[$1]]"',
@@ -1008,6 +994,7 @@ $2',
倷è¦æƒ³æ­£ä¿‚真嗰上傳箇隻檔案。
為到方便起見,箇隻檔案嗰刪除記錄到下底æ供嘞:",
'filename-bad-prefix' => "倷上傳嗰檔案å係以'''\"\$1\"'''åšé–‹é ­å—°ï¼Œé€šå¸¸ç®‡ç¨®å†‡æ„義嗰å字係數碼相機度嗰自動編排。請到倷嗰檔案æ€éŽéš»æ›´åŠ æœ‰æ„義嗰å字。",
+'upload-success-subj' => '上傳正嘞',
'upload-proto-error' => 'å”定錯誤',
'upload-proto-error-text' => 'é ç¨‹ä¸Šå‚³è¦æ±‚ URL 用 <code>http://</code> 或 <code>ftp://</code> 開頭。',
@@ -1131,7 +1118,6 @@ $2',
'statistics-edits-average' => 'æ¯é å—°å¹³å‡ç·¨è¼¯æ•¸',
'statistics-views-total' => '查看嗰統共數',
'statistics-views-peredit' => 'æ¯åˆ°ç·¨è¼¯æŸ¥çœ‹æ•¸',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue 工作隊列]嗰長度',
'statistics-users' => '註冊éŽå—°[[Special:ListUsers|用戶]]',
'statistics-users-active' => 'æ´»èºç”¨æˆ¶',
'statistics-users-active-desc' => 'é ­$1æ—¥æ“作éŽå—°ç”¨æˆ¶',
@@ -1283,7 +1269,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => '監視列表',
'mywatchlist' => 'å¶å—°ç›£è¦–列表',
-'watchlistfor' => "('''$1'''嗰監視列表')",
'nowatchlist' => '倷嗰監視列表什哩都冇有。',
'watchlistanontext' => 'è«‹$1眵å–或改å–倷嗰監視列表。',
'watchnologin' => '冇登入',
@@ -1376,7 +1361,9 @@ $NEWPAGE
'editcomment' => "編輯介紹: \"''\$1''\"。",
'revertpage' => '返回由[[Special:Contributions/$2|$2]] ([[User talk:$2|å°è©±]])嗰編輯;æ¢å¾©åˆ°[[User:$1|$1]]嗰最末一隻版本',
'rollback-success' => '返回由$1嗰編輯;æ¢å¾©åˆ°$2嗰最末一隻版本。',
-'sessionfailure' => '倷嗰登入好åƒæœ‰åš¸å•é¡Œï¼Œç‚ºåˆ°é˜²ç¯„未然,箇隻動作拕å–消嘞。
+
+# Edit tokens
+'sessionfailure' => '倷嗰登入好åƒæœ‰åš¸å•é¡Œï¼Œç‚ºåˆ°é˜²ç¯„未然,箇隻動作拕å–消嘞。
請按å–“後退â€å†è©¦éŽå›‰ï¼',
@@ -1538,7 +1525,6 @@ $1',
'ipb-edit-dropdown' => '編寫å°éŽ–原因',
'ipb-unblock-addr' => '解å°$1',
'ipb-unblock' => '解å°ç”¨æˆ¶å或IP地å€',
-'ipb-blocklist-addr' => '望å–$1ç›®å‰å—°å°ç¦',
'ipb-blocklist' => '望å–ç›®å‰å—°å°ç¦',
'unblockip' => '解å°IP地å€',
'unblockiptext' => '用下底嗰表格去æ¢å¾©æ—©å…ˆæ‹•å°å—°IP嗰編寫權。',
@@ -1877,10 +1863,10 @@ $1',
'imagemaxsize' => '檔案解釋é å—°åœ–åƒå¤§ç´°é™åˆ¶åˆ°:',
'thumbsize' => '縮略圖大細:',
'widthheightpage' => '$1×$2,$3é ',
-'file-info' => '(檔案大細: $1, MIME 類型: $2)',
-'file-info-size' => '($1 × $2 åƒç´ ï¼Œæª”案大細:$3 ,MIME類型:$4)',
+'file-info' => '檔案大細: $1, MIME 類型: $2',
+'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大細:$3 ,MIME類型:$4',
'file-nohires' => '<small>冇更高解åƒåº¦å—°åœ–åƒã€‚</small>',
-'svg-long-desc' => '(SVG檔案,表é¢å¤§ç´°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大細:$3)',
+'svg-long-desc' => 'SVG檔案,表é¢å¤§ç´°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大細:$3',
'show-big-image' => '完整解æžåº¦',
'show-big-image-thumb' => '<small>箇幅縮略圖嗰解æžåº¦: $1 × $2 åƒç´ </small>',
diff --git a/languages/messages/MessagesGd.php b/languages/messages/MessagesGd.php
index 56e8b6d4..e37d46a0 100644
--- a/languages/messages/MessagesGd.php
+++ b/languages/messages/MessagesGd.php
@@ -31,8 +31,7 @@ $messages = array(
'tog-editsection' => 'Cuir am comas deasachadh earainn le ceanglaichean [deasaich]',
'tog-editsectiononrightclick' => "Cuir an comas deasachadh earainn le briogadh deas air tiotal de dh'earrainn (feumaidh seo JavaScript)",
'tog-showtoc' => 'Seall an clàr-innse (air duilleagan air a bheil barrachd air 3 ceann-sgrìobhaidhean)',
-'tog-rememberpassword' => "Cuimhnichear air a' choimpiutair seo gu bheil mi air logadh a-steach",
-'tog-editwidth' => 'Leudaich am bogsa deasachaidh air fad na sgrìn',
+'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|latha|latha|làithean|latha}})",
'tog-watchcreations' => 'Cuir duilleagan a chruthaicheas mi air mo chlàr-faire',
'tog-watchdefault' => 'Cuir duilleagan a dheasaicheas mi air mo chlàr-faire',
'tog-watchmoves' => 'Cuir duilleagan a ghluaiseas mi air mo chlàr-faire',
@@ -173,31 +172,20 @@ $messages = array(
'faqpage' => 'Project:CÀBHA',
# Vector skin
-'vector-action-addsection' => 'Cuir ris cuspair',
-'vector-action-delete' => 'Sguab às',
-'vector-action-move' => 'Gluais',
-'vector-action-protect' => 'Dìon',
-'vector-action-undelete' => 'Neo-dhèan an sguabadh às',
-'vector-action-unprotect' => 'Neo-dhìon',
-'vector-namespace-category' => 'Roinn',
-'vector-namespace-help' => 'An duilleag cobharach',
-'vector-namespace-image' => 'Faidhle',
-'vector-namespace-main' => 'Duilleag',
-'vector-namespace-media' => 'Duilleag mheadhanan',
-'vector-namespace-mediawiki' => 'Teachdaireachd',
-'vector-namespace-project' => "Duilleag a' phròiseict",
-'vector-namespace-special' => 'Duilleag shònraichte',
-'vector-namespace-talk' => 'Deasbaireachd',
-'vector-namespace-template' => 'Teamplaid',
-'vector-namespace-user' => "Duilleag a' chleachdaiche",
-'vector-view-create' => 'Cruthaich',
-'vector-view-edit' => 'Deasaich',
-'vector-view-history' => 'Seall an eachdraidh',
-'vector-view-view' => 'Leugh',
-'vector-view-viewsource' => 'Seall an tùs',
-'actions' => 'Gnìomhan',
-'namespaces' => 'Namespaces',
-'variants' => 'Tionndaidhean',
+'vector-action-addsection' => 'Cuir ris cuspair',
+'vector-action-delete' => 'Sguab às',
+'vector-action-move' => 'Gluais',
+'vector-action-protect' => 'Dìon',
+'vector-action-undelete' => 'Neo-dhèan an sguabadh às',
+'vector-action-unprotect' => 'Neo-dhìon',
+'vector-view-create' => 'Cruthaich',
+'vector-view-edit' => 'Deasaich',
+'vector-view-history' => 'Seall an eachdraidh',
+'vector-view-view' => 'Leugh',
+'vector-view-viewsource' => 'Seall an tùs',
+'actions' => 'Gnìomhan',
+'namespaces' => 'Namespaces',
+'variants' => 'Tionndaidhean',
'errorpagetitle' => 'Mearachd',
'returnto' => 'Till dhan duilleag a leanas: $1',
@@ -416,7 +404,7 @@ Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a
'yourname' => 'Ainm-cleachdaiche:',
'yourpassword' => 'Am facal-faire agad',
'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
-'remembermypassword' => 'Cuimhnichear air a’ choimpiutair seo gu bheil mi logged a-stigh',
+'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|làithean}})",
'login' => 'Log a-steach',
'nav-login-createaccount' => 'Log a-steach / cruthaich cunntas',
'userlogin' => 'Log a-steach / cruthaich cunntas',
@@ -763,7 +751,6 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
# Watchlist
'watchlist' => 'Mo chlàr-faire',
'mywatchlist' => 'Mo chlàr-faire',
-'watchlistfor' => "(do '''$1''')",
'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
'addedwatch' => 'Air a chur ri do chlàr-faire',
'addedwatchtext' => "Chaidh an duilleag \"[[:\$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].
@@ -899,7 +886,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
<br />Faic [[Special:IPBlockList|Liosta nan IP baicte]] na bacaidhean a dh'ath-sgrùdadh.",
'unblockip' => 'Neo-bhac an cleachdaiche',
'ipusubmit' => 'Thoir air falbh am bacadh seo',
-'ipblocklist' => 'Liosta de sheòlaidhean IP is ainmean chleachdaichean a chaidh a bhacadh',
+'ipblocklist' => 'Cleachdaichean a chaidh a bhacadh',
'blocklink' => 'bac',
'unblocklink' => 'neo-bhac',
'change-blocklink' => 'mùth bacadh',
@@ -1047,9 +1034,9 @@ Tadhail air [http://www.mediawiki.org/wiki/Localisation Ionadaileadh MediaWiki]
'nextdiff' => 'Deasachadh nas ùire →',
# Media information
-'file-info-size' => '($1 × $2 pixel, meud an fhaidhle: $3, seòrsa MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, meud an fhaidhle: $3, seòrsa MIME: $4',
'file-nohires' => '<small>Chan eil dùmhlachd-bhreacaidh nas fhearr ri fhaighinn.</small>',
-'svg-long-desc' => '(Faidhle SVG, a-rèir ainm $1 × $2 pixel, meud faidhle: $3)',
+'svg-long-desc' => 'Faidhle SVG, a-rèir ainm $1 × $2 pixel, meud faidhle: $3',
'show-big-image' => 'Dùmhlachd-bhreacaidh shlàn',
'show-big-image-thumb' => '<small>Meud an ro-sheallaidh seo: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesGl.php b/languages/messages/MessagesGl.php
index dd145f81..f2bc3178 100644
--- a/languages/messages/MessagesGl.php
+++ b/languages/messages/MessagesGl.php
@@ -55,93 +55,97 @@ $dateFormats = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redireccións dobres' ),
- 'BrokenRedirects' => array( 'Redireccións rotas' ),
+ 'DoubleRedirects' => array( 'Redireccións_dobres' ),
+ 'BrokenRedirects' => array( 'Redireccións_rotas' ),
'Disambiguations' => array( 'Homónimos' ),
'Userlogin' => array( 'Rexistro' ),
- 'Userlogout' => array( 'Saír ao anonimato' ),
- 'CreateAccount' => array( 'Crear unha conta' ),
+ 'Userlogout' => array( 'Saír_ao_anonimato' ),
+ 'CreateAccount' => array( 'Crear_unha_conta' ),
'Preferences' => array( 'Preferencias' ),
- 'Watchlist' => array( 'Lista de vixilancia' ),
- 'Recentchanges' => array( 'Cambios recentes' ),
+ 'Watchlist' => array( 'Lista_de_vixilancia' ),
+ 'Recentchanges' => array( 'Cambios_recentes' ),
'Upload' => array( 'Cargar' ),
- 'Listfiles' => array( 'Lista de imaxes' ),
- 'Newimages' => array( 'Imaxes novas' ),
- 'Listusers' => array( 'Lista de usuarios' ),
- 'Listgrouprights' => array( 'Lista de dereitos segundo o grupo' ),
+ 'Listfiles' => array( 'Lista_de_imaxes' ),
+ 'Newimages' => array( 'Imaxes_novas' ),
+ 'Listusers' => array( 'Lista_de_usuarios' ),
+ 'Listgrouprights' => array( 'Lista_de_dereitos_segundo_o_grupo' ),
'Statistics' => array( 'Estatísticas' ),
- 'Randompage' => array( 'Ao chou', 'Páxina aleatoria' ),
- 'Lonelypages' => array( 'Páxinas orfas' ),
- 'Uncategorizedpages' => array( 'Páxinas sen categoría' ),
- 'Uncategorizedcategories' => array( 'Categorías sen categoría' ),
- 'Uncategorizedimages' => array( 'Imaxes sen categoría' ),
- 'Uncategorizedtemplates' => array( 'Modelos sen categoría' ),
- 'Unusedcategories' => array( 'Categorías sen uso' ),
- 'Unusedimages' => array( 'Imaxes sen uso' ),
- 'Wantedpages' => array( 'Páxinas requiridas', 'Ligazóns rotas' ),
- 'Wantedcategories' => array( 'Categorías requiridas' ),
- 'Wantedfiles' => array( 'Ficheiros requiridos' ),
- 'Wantedtemplates' => array( 'Modelos requiridos' ),
- 'Mostlinked' => array( 'Páxinas máis ligadas' ),
- 'Mostlinkedcategories' => array( 'Categorías máis ligadas' ),
- 'Mostlinkedtemplates' => array( 'Modelos máis enlazados' ),
- 'Mostimages' => array( 'Máis imaxes' ),
- 'Mostcategories' => array( 'Máis categorías' ),
- 'Mostrevisions' => array( 'Máis revisións' ),
- 'Fewestrevisions' => array( 'Menos revisións' ),
- 'Shortpages' => array( 'Páxinas curtas' ),
- 'Longpages' => array( 'Páxinas longas' ),
- 'Newpages' => array( 'Páxinas novas' ),
- 'Ancientpages' => array( 'Páxinas máis antigas' ),
- 'Deadendpages' => array( 'Páxinas mortas' ),
- 'Protectedpages' => array( 'Páxinas protexidas' ),
- 'Protectedtitles' => array( 'Títulos protexidos' ),
- 'Allpages' => array( 'Todas as páxinas' ),
- 'Prefixindex' => array( 'Ãndice de prefixos' ),
- 'Ipblocklist' => array( 'Lista dos bloqueos a enderezos IP' ),
- 'Specialpages' => array( 'Páxinas especiais' ),
+ 'Randompage' => array( 'Ao_chou', 'Páxina_aleatoria' ),
+ 'Lonelypages' => array( 'Páxinas_orfas' ),
+ 'Uncategorizedpages' => array( 'Páxinas_sen_categoría' ),
+ 'Uncategorizedcategories' => array( 'Categorías_sen_categoría' ),
+ 'Uncategorizedimages' => array( 'Imaxes_sen_categoría' ),
+ 'Uncategorizedtemplates' => array( 'Modelos_sen_categoría' ),
+ 'Unusedcategories' => array( 'Categorías_sen_uso' ),
+ 'Unusedimages' => array( 'Imaxes_sen_uso' ),
+ 'Wantedpages' => array( 'Páxinas_requiridas', 'Ligazóns_rotas' ),
+ 'Wantedcategories' => array( 'Categorías_requiridas' ),
+ 'Wantedfiles' => array( 'Ficheiros_requiridos' ),
+ 'Wantedtemplates' => array( 'Modelos_requiridos' ),
+ 'Mostlinked' => array( 'Páxinas_máis_ligadas' ),
+ 'Mostlinkedcategories' => array( 'Categorías_máis_ligadas' ),
+ 'Mostlinkedtemplates' => array( 'Modelos_máis_ligados' ),
+ 'Mostimages' => array( 'Ficheiros_máis_ligados' ),
+ 'Mostcategories' => array( 'Páxinas_con_máis_categorías' ),
+ 'Mostrevisions' => array( 'Páxinas_con_máis_revisións' ),
+ 'Fewestrevisions' => array( 'Páxinas_con_menos_revisións' ),
+ 'Shortpages' => array( 'Páxinas_curtas' ),
+ 'Longpages' => array( 'Páxinas_longas' ),
+ 'Newpages' => array( 'Páxinas_novas' ),
+ 'Ancientpages' => array( 'Páxinas_máis_antigas' ),
+ 'Deadendpages' => array( 'Páxinas_mortas' ),
+ 'Protectedpages' => array( 'Páxinas_protexidas' ),
+ 'Protectedtitles' => array( 'Títulos_protexidos' ),
+ 'Allpages' => array( 'Todas_as_páxinas' ),
+ 'Prefixindex' => array( 'Ãndice_de_prefixos' ),
+ 'Ipblocklist' => array( 'Lista_de_bloqueos', 'Lista_dos_bloqueos_a_enderezos_IP' ),
+ 'Unblock' => array( 'Desbloquear' ),
+ 'Specialpages' => array( 'Páxinas_especiais' ),
'Contributions' => array( 'Contribucións' ),
- 'Emailuser' => array( 'Correo electrónico de usuario' ),
- 'Confirmemail' => array( 'Confirmar correo electrónico' ),
- 'Whatlinkshere' => array( 'Páxinas que ligan con esta' ),
- 'Recentchangeslinked' => array( 'Cambios relacionados' ),
- 'Movepage' => array( 'Mover páxina' ),
+ 'Emailuser' => array( 'Correo_electrónico' ),
+ 'Confirmemail' => array( 'Confirmar_o_correo_electrónico' ),
+ 'Whatlinkshere' => array( 'Páxinas_que_ligan_con_esta' ),
+ 'Recentchangeslinked' => array( 'Cambios_relacionados' ),
+ 'Movepage' => array( 'Mover_a_páxina' ),
'Blockme' => array( 'Bloquearme' ),
- 'Booksources' => array( 'Fontes bibliográficas' ),
+ 'Booksources' => array( 'Fontes_bibliográficas' ),
'Categories' => array( 'Categorías' ),
'Export' => array( 'Exportar' ),
'Version' => array( 'Versión' ),
- 'Allmessages' => array( 'Todas as mensaxes' ),
+ 'Allmessages' => array( 'Todas_as_mensaxes' ),
'Log' => array( 'Rexistros' ),
- 'Blockip' => array( 'Bloquear enderezo IP' ),
+ 'Blockip' => array( 'Bloquear', 'Bloquear_o_enderezo_IP', 'Bloquear_o_usuario' ),
'Undelete' => array( 'Restaurar' ),
'Import' => array( 'Importar' ),
- 'Lockdb' => array( 'Pechar a base de datos' ),
- 'Unlockdb' => array( 'Abrir a base de datos' ),
- 'Userrights' => array( 'Dereitos de usuario' ),
- 'MIMEsearch' => array( 'Procura MIME' ),
- 'FileDuplicateSearch' => array( 'Procura de ficheiros duplicados' ),
- 'Unwatchedpages' => array( 'Páxinas sen vixiar' ),
- 'Listredirects' => array( 'Lista de redireccións' ),
- 'Revisiondelete' => array( 'Revisións borradas' ),
- 'Unusedtemplates' => array( 'Modelos non usados' ),
- 'Randomredirect' => array( 'Redirección aleatoria' ),
- 'Mypage' => array( 'A miña páxina de usuario' ),
- 'Mytalk' => array( 'A miña conversa' ),
- 'Mycontributions' => array( 'As miñas contribucións' ),
- 'Listadmins' => array( 'Lista de administradores' ),
- 'Listbots' => array( 'Lista de bots' ),
- 'Popularpages' => array( 'Páxinas populares' ),
+ 'Lockdb' => array( 'Pechar_a_base_de_datos' ),
+ 'Unlockdb' => array( 'Abrir_a_base_de_datos' ),
+ 'Userrights' => array( 'Dereitos_de_usuario' ),
+ 'MIMEsearch' => array( 'Procura_MIME' ),
+ 'FileDuplicateSearch' => array( 'Procura_de_ficheiros_duplicados' ),
+ 'Unwatchedpages' => array( 'Páxinas_sen_vixiar' ),
+ 'Listredirects' => array( 'Lista_de_redireccións' ),
+ 'Revisiondelete' => array( 'Revisións_borradas' ),
+ 'Unusedtemplates' => array( 'Modelos_non_usados' ),
+ 'Randomredirect' => array( 'Redirección_aleatoria' ),
+ 'Mypage' => array( 'A_miña_páxina_de_usuario' ),
+ 'Mytalk' => array( 'A_miña_conversa' ),
+ 'Mycontributions' => array( 'As_miñas_contribucións' ),
+ 'Listadmins' => array( 'Lista_de_administradores' ),
+ 'Listbots' => array( 'Lista_de_bots' ),
+ 'Popularpages' => array( 'Páxinas_populares' ),
'Search' => array( 'Procurar' ),
- 'Resetpass' => array( 'Cambiar contrasinal' ),
- 'Withoutinterwiki' => array( 'Sen interwiki' ),
- 'MergeHistory' => array( 'Fusionar Historiais' ),
- 'Filepath' => array( 'Enderezo de ficheiro' ),
- 'Invalidateemail' => array( 'Invalidar o enderezo de correo electrónico' ),
- 'Blankpage' => array( 'Baleirar a páxina' ),
- 'LinkSearch' => array( 'Buscar ligazóns web' ),
- 'DeletedContributions' => array( 'Contribucións borradas' ),
+ 'Resetpass' => array( 'Cambiar_o_contrasinal' ),
+ 'Withoutinterwiki' => array( 'Sen_interwiki' ),
+ 'MergeHistory' => array( 'Fusionar_os_historiais' ),
+ 'Filepath' => array( 'Ruta_do_ficheiro' ),
+ 'Invalidateemail' => array( 'Invalidar_o_enderezo_de_correo_electrónico' ),
+ 'Blankpage' => array( 'Baleirar_a_páxina' ),
+ 'LinkSearch' => array( 'Buscar_ligazóns_web' ),
+ 'DeletedContributions' => array( 'Contribucións_borradas' ),
'Tags' => array( 'Etiquetas' ),
+ 'Activeusers' => array( 'Usuarios_activos' ),
+ 'ComparePages' => array( 'Comparar_as_páxinas' ),
+ 'Badtitle' => array( 'Título_incorrecto' ),
);
$magicWords = array(
@@ -149,9 +153,11 @@ $magicWords = array(
'notoc' => array( '0', '__SENÃNDICE__', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
'nogallery' => array( '0', '__SENGALERÃA__', '__SEMGALERIA__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__FORZAROÃNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
- 'toc' => array( '0', '__Ãndice__', '__TDC__', '__SUMÃRIO__', '__TOC__' ),
+ 'toc' => array( '0', '__ÃNDICE__', '__TDC__', '__SUMÃRIO__', '__TOC__' ),
'noeditsection' => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NOMEDOMESACTUAL', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
'currentmonthabbrev' => array( '1', 'ABREVIATURADOMESACTUAL', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
'currentday' => array( '1', 'DÃAACTUAL', 'DIAATUAL', 'CURRENTDAY' ),
@@ -160,6 +166,7 @@ $magicWords = array(
'currentyear' => array( '1', 'ANOACTUAL', 'ANOATUAL', 'CURRENTYEAR' ),
'currenthour' => array( '1', 'HORAACTUAL', 'HORAATUAL', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
'localmonthabbrev' => array( '1', 'ABREVIATURADOMESLOCAL', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
'localday' => array( '1', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
@@ -178,13 +185,13 @@ $magicWords = array(
'subpagename' => array( '1', 'NOMEDASUBPÃXINA', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
'basepagename' => array( '1', 'NOMEDAPÃXINABASE', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
'talkpagename' => array( '1', 'NOMEDAPÃXINADECONVERSA', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
- 'img_manualthumb' => array( '1', 'miniatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_manualthumb' => array( '1', 'miniatura=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'dereita', 'direita', 'right' ),
'img_left' => array( '1', 'esquerda', 'left' ),
'img_none' => array( '1', 'ningún', 'nenhum', 'none' ),
'img_center' => array( '1', 'centro', 'center', 'centre' ),
'img_page' => array( '1', 'páxina=$1', 'páxina $1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'borde', 'borda', 'border' ),
+ 'img_border' => array( '1', 'bordo', 'borda', 'border' ),
'grammar' => array( '0', 'GRAMÃTICA:', 'GRAMMAR:' ),
'displaytitle' => array( '1', 'AMOSAROTÃTULO', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__LIGAZÓNDANOVASECCIÓN__', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
@@ -197,7 +204,7 @@ $magicWords = array(
'pagesize' => array( '1', 'TAMAÑODAPÃXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -215,8 +222,7 @@ $messages = array(
'tog-editsection' => 'Permitir a edición de seccións vía as ligazóns [editar]',
'tog-editsectiononrightclick' => 'Permitir a edición de seccións premendo co botón dereito <br /> nos títulos das seccións (JavaScript)',
'tog-showtoc' => 'Mostrar o índice (para páxinas con máis de tres cabeceiras)',
-'tog-rememberpassword' => 'Lembrar o meu contrasinal neste ordenador',
-'tog-editwidth' => 'Alargar a caixa de edición para encher toda a pantalla',
+'tog-rememberpassword' => 'Lembrar o meu contrasinal neste navegador (ata $1 {{PLURAL:$1|día|días}})',
'tog-watchcreations' => 'Engadir as páxinas creadas por min á miña lista de artigos vixiados',
'tog-watchdefault' => 'Engadir as páxinas que edite á miña lista de vixilancia',
'tog-watchmoves' => 'Engadir as páxinas que mova á miña lista de vixilancia',
@@ -362,31 +368,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Engadir un comentario',
-'vector-action-delete' => 'Borrar',
-'vector-action-move' => 'Mover',
-'vector-action-protect' => 'Protexer',
-'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Desprotexer',
-'vector-namespace-category' => 'Categoría',
-'vector-namespace-help' => 'Páxina de axuda',
-'vector-namespace-image' => 'Ficheiro',
-'vector-namespace-main' => 'Páxina',
-'vector-namespace-media' => 'Páxina de multimedia',
-'vector-namespace-mediawiki' => 'Mensaxe',
-'vector-namespace-project' => 'Páxina do proxecto',
-'vector-namespace-special' => 'Páxina especial',
-'vector-namespace-talk' => 'Conversa',
-'vector-namespace-template' => 'Modelo',
-'vector-namespace-user' => 'Páxina de usuario',
-'vector-view-create' => 'Crear',
-'vector-view-edit' => 'Editar',
-'vector-view-history' => 'Ver o historial',
-'vector-view-view' => 'Ler',
-'vector-view-viewsource' => 'Ver o código fonte',
-'actions' => 'Accións',
-'namespaces' => 'Espazos de nomes',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Engadir un comentario',
+'vector-action-delete' => 'Borrar',
+'vector-action-move' => 'Mover',
+'vector-action-protect' => 'Protexer',
+'vector-action-undelete' => 'Restaurar',
+'vector-action-unprotect' => 'Desprotexer',
+'vector-simplesearch-preference' => 'Activar as suxestións de procura melloradas (soamente na aparencia vector)',
+'vector-view-create' => 'Crear',
+'vector-view-edit' => 'Editar',
+'vector-view-history' => 'Ver o historial',
+'vector-view-view' => 'Ler',
+'vector-view-viewsource' => 'Ver o código fonte',
+'actions' => 'Accións',
+'namespaces' => 'Espazos de nomes',
+'variants' => 'Variantes',
'errorpagetitle' => 'Erro',
'returnto' => 'Volver a "$1".',
@@ -447,6 +443,9 @@ Hai moitos usuarios intentando ver esta páxina.
Por favor, agarde un anaco antes de intentar acceder á páxina de novo.
$1',
+'pool-timeout' => 'Tempo límite de espera para o peche',
+'pool-queuefull' => 'A cola está chea',
+'pool-errorunknown' => 'Erro descoñecido',
# 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' => 'Acerca de {{SITENAME}}',
@@ -613,12 +612,13 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
'yourname' => 'Nome de usuario:',
'yourpassword' => 'Contrasinal:',
'yourpasswordagain' => 'Insira o seu contrasinal outra vez:',
-'remembermypassword' => 'Lembrar o meu contrasinal neste ordenador',
+'remembermypassword' => 'Lembrar o meu contrasinal neste ordenador (ata $1 {{PLURAL:$1|día|días}})',
+'securelogin-stick-https' => 'Permanecer conectado mediante as HTTPS despois de acceder',
'yourdomainname' => 'O seu dominio',
'externaldberror' => 'Ou ben se produciu un erro da base de datos na autenticación externa ou ben non se lle permite actualizar a súa conta externa.',
'login' => 'Acceder ao sistema',
'nav-login-createaccount' => 'Rexistro',
-'loginprompt' => "Debe habilitar as ''cookies'' para acceder a {{SITENAME}}.",
+'loginprompt' => 'Debe habilitar as cookies para acceder a {{SITENAME}}.',
'userlogin' => 'Rexistro',
'userloginnocreate' => 'Rexistro',
'logout' => 'Saír ao anonimato',
@@ -630,6 +630,7 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
'gotaccount' => "Xa ten unha conta? '''$1'''.",
'gotaccountlink' => 'Acceda ao sistema',
'createaccountmail' => 'Por correo electrónico',
+'createaccountreason' => 'Motivo:',
'badretype' => 'Os contrasinais que inseriu non coinciden entre si.',
'userexists' => 'O nome de usuario que pretende usar xa está en uso.
Escolla un nome diferente.',
@@ -658,6 +659,7 @@ Por favor, insira outro.',
Por favor, inténteo de novo.',
'passwordtooshort' => 'Os contrasinais deben conter, como mínimo, {{PLURAL:$1|1 carácter|$1 caracteres}}.',
'password-name-match' => 'O seu contrasinal debe ser diferente do seu nome de usuario.',
+'password-login-forbidden' => 'O uso deste nome de usuario e contrasinal foi prohibido.',
'mailmypassword' => 'Enviádeme un contrasinal novo por correo',
'passwordremindertitle' => 'Novo contrasinal temporal para {{SITENAME}}',
'passwordremindertext' => 'Alguén (probablemente vostede, desde o enderezo IP $1) solicitou un novo
@@ -700,6 +702,9 @@ Por favor, agarde antes de probar outra vez.',
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => 'Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.',
+# E-mail sending
+'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP',
+
# Password reset dialog
'resetpass' => 'Cambiar o contrasinal',
'resetpass_announce' => 'Debe rexistrarse co código temporal que recibiu por correo electrónico. Para finalizar o rexistro debe indicar un novo contrasinal aquí:',
@@ -750,13 +755,14 @@ Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal
'showpreview' => 'Mostrar a vista previa',
'showlivepreview' => 'Vista previa',
'showdiff' => 'Mostrar os cambios',
-'anoneditwarning' => "'''Aviso:''' non accedeu ao sistema.
+'anoneditwarning' => "'''Aviso:''' Non accedeu ao sistema.
O seu enderezo IP quedará rexistrado no historial de revisións desta páxina.",
+'anonpreviewwarning' => "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
'missingsummary' => "'''Aviso:''' esqueceu incluír o texto do campo resumo.
Se preme en \"Gardar a páxina\" a súa edición gardarase sen ningunha descrición da edición.",
'missingcommenttext' => 'Por favor, escriba un comentario a continuación.',
-'missingcommentheader' => "'''Aviso:''' non escribiu ningún texto no asunto/cabeceira deste comentario.
-Se preme en \"Gardar a páxina\", a súa edición gardarase sen el.",
+'missingcommentheader' => "'''Aviso:''' non escribiu ningún texto no asunto/título deste comentario.
+Se preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
'summary-preview' => 'Vista previa do resumo:',
'subject-preview' => 'Vista previa do asunto/título:',
'blockedtitle' => 'O usuario está bloqueado',
@@ -831,8 +837,12 @@ Velaquí está a última entrada do rexistro de bloqueos, por se quere consultal
'''Este aínda non foi gardado!'''",
'userjspreview' => "'''Lembre que só está probando/previsualizando o seu JavaScript de usuario.'''
'''Este aínda non foi gardado!'''",
+'sitecsspreview' => "'''Lembre que só está vendo a vista previa deste CSS.'''
+'''Este aínda non foi gardado!'''",
+'sitejspreview' => "'''Lembre que só está vendo a vista previa deste código JavaScript.'''
+'''Este aínda non foi gardado!'''",
'userinvalidcssjstitle' => "'''Aviso:''' non hai ningún tema chamado \"\$1\".
-Lembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo {{ns:user}}:Foo/monobook.css no canto de {{ns:user}}:Foo/Monobook.css.",
+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!'''",
@@ -871,9 +881,6 @@ Ao mesmo tempo, prométanos que o que escribiu é da súa autoría ou que está
'copyrightwarning2' => "Por favor, decátese de que todas as súas contribucións a {{SITENAME}} poden ser editadas, alteradas ou eliminadas por outras persoas. Se non quere que os seus escritos sexan editados sen piedade, non os publique aquí.<br />
Do mesmo xeito, comprométese a que o que vostede escriba sexa da súa autoría ou copiado dunha fonte de dominio público ou recurso público semellante (vexa $1 para detalles).
'''NON ENVÃE SEN PERMISO TRABALLOS CON DEREITOS DE COPIA!'''",
-'longpagewarning' => "'''ATENCIÓN: esta páxina ten $1 kilobytes;
-algúns navegadores poden ter problemas editando páxinas de 32kb ou máis.
-Por favor, considere partir a páxina en seccións máis pequenas.'''",
'longpageerror' => "'''Erro: o texto que pretende gardar ocupa $1 kilobytes, e existe un límite dun máximo de $2 kilobytes.'''
Polo tanto, non se pode gardar.",
'readonlywarning' => "'''ATENCIÓN: a base de datos foi fechada para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.
@@ -1053,6 +1060,8 @@ $1",
'logdelete-failure' => "'''A visibilidade do rexistro non pode ser fixada:'''
$1",
'revdel-restore' => 'cambiar a visibilidade',
+'revdel-restore-deleted' => 'revisións borradas',
+'revdel-restore-visible' => 'revisións visibles',
'pagehist' => 'Historial da páxina',
'deletedhist' => 'Historial de borrado',
'revdelete-content' => 'o contido',
@@ -1120,11 +1129,13 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
# Diffs
'history-title' => 'Historial de revisións de "$1"',
'difference' => '(Diferenzas entre revisións)',
+'difference-multipage' => '(Diferenzas entre páxinas)',
'lineno' => 'Liña $1:',
'compareselectedversions' => 'Comparar as versións seleccionadas',
'showhideselectedversions' => 'Mostrar/Agochar as versións seleccionadas',
'editundo' => 'desfacer',
-'diff-multi' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial.)',
+'diff-multi' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por {{PLURAL:$2|un usuario|$2 usuarios}}.)',
+'diff-multi-manyusers' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por máis {{PLURAL:$2|dun usuario|de $2 usuarios}}.)',
# Search results
'searchresults' => 'Resultados da procura',
@@ -1159,6 +1170,7 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
'searchprofile-everything-tooltip' => 'Procurar en todo o contido (incluíndo páxinas de conversa)',
'searchprofile-advanced-tooltip' => 'Procurar nos espazos de nomes elixidos',
'search-result-size' => '$1 ({{PLURAL:$2|1 palabra|$2 palabras}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 ficheiro|$3 ficheiros}})',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(redirixido desde "$1")',
'search-section' => '(sección "$1")',
@@ -1236,6 +1248,7 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
'contextlines' => 'Número de liñas por resultado:',
'contextchars' => 'Número de caracteres de contexto por liña:',
'stub-threshold' => 'Límite superior para o formato de <a href="#" class="stub">ligazóns de bosquexo</a> (bytes):',
+'stub-threshold-disabled' => 'Desactivado',
'recentchangesdays' => 'Número de días a mostrar nos cambios recentes:',
'recentchangesdays-max' => '(máximo {{PLURAL:$1|un día|$1 días}})',
'recentchangescount' => 'Número de edicións a mostrar por defecto:',
@@ -1269,6 +1282,7 @@ Velaquí un valor xerado ao chou que pode usar: $1',
'prefs-files' => 'Ficheiros',
'prefs-custom-css' => 'CSS personalizado',
'prefs-custom-js' => 'JS personalizado',
+'prefs-common-css-js' => 'CSS/JS compartido por todas as aparencias:',
'prefs-reset-intro' => 'Pode usar esta páxina para restablecer as súas preferencias ás que veñen dadas por defecto.
Este cambio non se poderá desfacer.',
'prefs-emailconfirm-label' => 'Confirmación do correo:',
@@ -1306,9 +1320,15 @@ Tamén pode deixar que outras persoas se poñan en contacto con vostede desde a
'prefs-advancedrendering' => 'Opcións avanzadas',
'prefs-advancedsearchoptions' => 'Opcións avanzadas',
'prefs-advancedwatchlist' => 'Opcións avanzadas',
-'prefs-display' => 'Opcións de visualización',
+'prefs-displayrc' => 'Opcións de visualización',
+'prefs-displaysearchoptions' => 'Opcións de visualización',
+'prefs-displaywatchlist' => 'Opcións de visualización',
'prefs-diffs' => 'Diferenzas',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'O enderezo de correo electrónico semella válido',
+'email-address-validity-invalid' => 'Escriba un enderezo de correo electrónico válido',
+
# User rights
'userrights' => 'Xestión dos dereitos de usuario',
'userrights-lookup-user' => 'Administrar os grupos do usuario',
@@ -1392,6 +1412,7 @@ Tamén pode deixar que outras persoas se poñan en contacto con vostede desde a
'right-hideuser' => 'Bloquear un usuario, agochándollo ao público',
'right-ipblock-exempt' => 'Evitar bloqueos de IPs, autobloqueos e bloqueos de rango',
'right-proxyunbannable' => 'Evitar os bloqueos autamáticos a proxies',
+'right-unblockself' => 'Desbloqueárense a si mesmos',
'right-protect' => 'Trocar os niveis de protección e editar páxinas protexidas',
'right-editprotected' => 'Editar páxinas protexidas (que non teñan protección en serie)',
'right-editinterface' => 'Editar a interface de usuario',
@@ -1414,7 +1435,6 @@ Tamén pode deixar que outras persoas se poñan en contacto con vostede desde a
'right-siteadmin' => 'Fechar e abrir a base de datos',
'right-reset-passwords' => 'Restablecer os contrasinais doutros usuarios',
'right-override-export-depth' => 'Exportar páxinas incluíndo as páxinas ligadas ata unha profundidade de 5',
-'right-versiondetail' => 'Mostrar a información ampliada da versión do software',
'right-sendemail' => 'Enviar correos electrónicos a outros usuarios',
# User rights log
@@ -1465,14 +1485,9 @@ Tamén pode deixar que outras persoas se poñan en contacto con vostede desde a
'recentchanges-legend' => 'Opcións dos cambios',
'recentchangestext' => 'Siga, nesta páxina, as modificacións máis recentes no wiki.',
'recentchanges-feed-description' => 'Siga os cambios máis recentes deste wiki nesta fonte de novas.',
-'recentchanges-label-legend' => 'Lenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova páxina',
'recentchanges-label-newpage' => 'Esta edición creou unha nova páxina',
-'recentchanges-legend-minor' => '$1 - edición pequena',
'recentchanges-label-minor' => 'Esta é unha edición pequena',
-'recentchanges-legend-bot' => '$1 - edición feita por un bot',
'recentchanges-label-bot' => 'Esta edición foi realizada por un bot',
-'recentchanges-legend-unpatrolled' => '$1 - edición non patrullada',
'recentchanges-label-unpatrolled' => 'Esta edición aínda non foi comprobada',
'rcnote' => "Embaixo {{PLURAL:$1|amósase '''1''' cambio|amósanse os últimos '''$1''' cambios}} {{PLURAL:$2|no último día|nos últimos '''$2''' días}} ata as $5 do $4.",
'rcnotefrom' => "A continuación amósanse os cambios desde as '''$4''' do '''$3''' (móstranse ata '''$1''').",
@@ -1519,6 +1534,9 @@ As páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''neg
'upload_directory_missing' => 'Falta o directorio de carga ($1) e non pode ser creado polo servidor da páxina web.',
'upload_directory_read_only' => 'Non se pode escribir no directorio de subida ($1) do servidor web.',
'uploaderror' => 'Erro ao cargar',
+'upload-recreate-warning' => "'''Atención: borrouse ou trasladouse un ficheiro con ese nome.'''
+
+Velaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
'uploadtext' => "Use o formulario de embaixo para cargar ficheiros.
Para ver ou procurar imaxes subidas con anterioridade vaia á [[Special:FileList|lista de imaxes]]; os envíos tamén se rexistran no [[Special:Log/upload|rexistro de cargas]] e as eliminacións no [[Special:Log/delete|rexistro de borrados]].
@@ -1554,6 +1572,17 @@ Por favor, cambie o nome do ficheiro e intente cargalo de novo.',
'filetype-banned-type' => "'''\".\$1\"''' non é un tipo de ficheiro permitido.
{{PLURAL:\$3|O tipo de ficheiro permitido é|Os tipos de ficheiros permitidos son}} \$2.",
'filetype-missing' => 'O ficheiro non conta cunha extensión (como ".jpg").',
+'empty-file' => 'O ficheiro que enviou estaba baleiro.',
+'file-too-large' => 'O ficheiro que enviou era grande de máis.',
+'filename-tooshort' => 'O nome do ficheiro é curto de máis.',
+'filetype-banned' => 'Este tipo de ficheiro está prohibido.',
+'verification-error' => 'O ficheiro non pasou a comprobación de ficheiros.',
+'hookaborted' => 'O asociador da extensión cancelou a modificación que intentou realizar.',
+'illegal-filename' => 'O nome do ficheiro non está permitido.',
+'overwrite' => 'Non está permitido sobrescribir un ficheiro existente.',
+'unknown-error' => 'Houbo un erro descoñecido.',
+'tmp-create-error' => 'Non se puido crear o ficheiro temporal.',
+'tmp-write-error' => 'Houbo un erro ao gravar o ficheiro temporal.',
'large-file' => 'Recoméndase que o tamaño dos ficheiros non supere os $1; este ficheiro ocupa $2.',
'largefileserver' => 'Este ficheiro é de maior tamaño có permitido pola configuración do servidor.',
'emptyfile' => 'O ficheiro que cargou semella estar baleiro.
@@ -1583,13 +1612,14 @@ Se aínda quere cargar o seu ficheiro, volva atrás e use outro nome.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Este ficheiro é un duplicado {{PLURAL:$1|do seguinte|dos seguintes}}:',
'file-deleted-duplicate' => 'Un ficheiro idéntico a este ("[[:$1]]") foi borrado previamente. Debería comprobar o historial de borrados do ficheiro antes de proceder a cargalo de novo.',
-'successfulupload' => 'A carga realizouse correctamente',
'uploadwarning' => 'Advertencia ao cargar o ficheiro',
'uploadwarning-text' => 'Por favor, modifique a descrición do ficheiro e inténteo de novo.',
'savefile' => 'Gardar o ficheiro',
'uploadedimage' => 'cargou "[[$1]]"',
'overwroteimage' => 'enviou unha nova versión de "[[$1]]"',
'uploaddisabled' => 'Sentímolo, a subida de ficheiros está desactivada.',
+'copyuploaddisabled' => 'A carga mediante URL está desactivada.',
+'uploadfromurl-queued' => 'A súa carga púxese á cola.',
'uploaddisabledtext' => 'A carga de ficheiros está desactivada.',
'php-uploaddisabledtext' => 'As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.',
'uploadscripted' => 'Este ficheiro contén HTML ou código (script code) que pode producir erros ao ser interpretado polo navegador.',
@@ -1624,6 +1654,14 @@ JD # Jenoptik
MGP # Pentax
PICT # varias
#</pre> <!-- deixe esta liña exactamente como está -->',
+'upload-success-subj' => 'A carga realizouse correctamente',
+'upload-success-msg' => 'A súa carga desde [$2] rematou correctamente e está dispoñible aquí: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema ao cargar',
+'upload-failure-msg' => 'Houbo un problema durante a carga desde [$2]:
+
+$1',
+'upload-warning-subj' => 'Advertencia ao cargar',
+'upload-warning-msg' => 'Houbo un problema durante a carga desde [$2]. Pode volver ao [[Special:Upload/stash/$1|formulario de subidas]] para corrixilo.',
'upload-proto-error' => 'Protocolo erróneo',
'upload-proto-error-text' => 'A carga remota require URLs que comecen por <code>http://</code> ou <code>ftp://</code>.',
@@ -1689,6 +1727,7 @@ Premendo nunha cabeceira da columna cambia a ordenación.',
'listfiles_search_for' => 'Buscar polo nome do ficheiro multimedia:',
'imgfile' => 'ficheiro',
'listfiles' => 'Lista de imaxes',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Usuario',
@@ -1732,6 +1771,7 @@ A descrición da [$2 páxina de descrición do ficheiro] móstrase a continuaciÃ
'uploadnewversion-linktext' => 'Cargar unha nova versión deste ficheiro',
'shared-repo-from' => 'de $1',
'shared-repo' => 'repositorio compartido',
+'filepage.css' => '/** O CSS que se coloque aquí será incluído na páxina de descrición do ficheiro, así como nos wikis de clientes estranxeiros */',
# File reversion
'filerevert' => 'Desfacer $1',
@@ -1803,8 +1843,8 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
'statistics-edits' => 'Edicións nas páxinas des que se creou {{SITENAME}}',
'statistics-edits-average' => 'Media de edicións por páxina',
'statistics-views-total' => 'Visitas totais',
+'statistics-views-total-desc' => 'Non se inclúen as visitas ás páxinas inexistentes e especiais',
'statistics-views-peredit' => 'Visitas por edición',
-'statistics-jobqueue' => 'Lonxitude da [http://www.mediawiki.org/wiki/Manual:Job_queue cola de traballos]',
'statistics-users' => '[[Special:ListUsers|Usuarios]] rexistrados',
'statistics-users-active' => 'Usuarios activos',
'statistics-users-active-desc' => 'Usuarios que teñen levado a cabo unha acción {{PLURAL:$1|no último día|nos últimos $1 días}}',
@@ -1819,7 +1859,7 @@ Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que
'doubleredirects' => 'Redireccións dobres',
'doubleredirectstext' => 'Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.
Cada ringleira contén ligazóns cara á primeira e segunda redireccións, así como a primeira liña de texto da segunda páxina, que é frecuentemente o artigo "real", á que a primeira redirección debera apuntar.
-As entradas <s>riscadas</s> xa foron resoltas.',
+As entradas <del>riscadas</del> xa foron resoltas.',
'double-redirect-fixed-move' => 'A páxina "[[$1]]" foi movida, agora é unha redirección cara a "[[$2]]"',
'double-redirect-fixer' => 'Amañador de redireccións',
@@ -1842,6 +1882,8 @@ As entradas <s>riscadas</s> xa foron resoltas.',
'nmembers' => '$1 {{PLURAL:$1|páxina|páxinas}}',
'nrevisions' => '$1 {{PLURAL:$1|revisión|revisións}}',
'nviews' => 'vista {{PLURAL:$1|unha vez|$1 veces}}',
+'nimagelinks' => 'Empregada {{PLURAL:$1|nunha páxina|en $1 páxinas}}',
+'ntransclusions' => 'empregado en $1 {{PLURAL:$1|páxina|páxinas}}',
'specialpage-empty' => 'Non hai resultados para o que solicitou.',
'lonelypages' => 'Páxinas orfas',
'lonelypagestext' => 'As seguintes páxinas non teñen ningunha ligazón que apunte cara a elas desde outra páxina de {{SITENAME}}.',
@@ -1998,34 +2040,40 @@ Se quere máis información acerca dos dereitos individuais, pode atopala [[{{Me
'listgrouprights-removegroup-self-all' => 'Pode eliminar todos os grupos pola súa propia conta',
# E-mail user
-'mailnologin' => 'Non existe enderezo para o envío',
-'mailnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.',
-'emailuser' => 'Enviar un correo electrónico a este usuario',
-'emailpage' => 'Enviar un correo electrónico a un usuario',
-'emailpagetext' => 'Pode usar o formulario de embaixo para enviar unha mensaxe de correo electrónico a este usuario.
+'mailnologin' => 'Non existe enderezo para o envío',
+'mailnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.',
+'emailuser' => 'Enviar un correo electrónico a este usuario',
+'emailpage' => 'Enviar un correo electrónico a un usuario',
+'emailpagetext' => 'Pode usar o formulario de embaixo para enviar unha mensaxe de correo electrónico a este usuario.
O correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]] aparecerá no campo "De:" do correo, polo que o receptor da mensaxe poderalle responder.',
-'usermailererror' => 'O obxecto enviado deu unha mensaxe de erro:',
-'defemailsubject' => 'Correo electrónico de {{SITENAME}}',
-'noemailtitle' => 'Sen enderezo de correo electrónico',
-'noemailtext' => 'Este usuario non especificou un enderezo de correo electrónico válido.',
-'nowikiemailtitle' => 'Sen correo electrónico habilitado',
-'nowikiemailtext' => 'Este usuario elixiu non recibir correos electrónicos doutros usuarios.',
-'email-legend' => 'Enviar un correo electrónico a outro usuario de {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'Para:',
-'emailsubject' => 'Asunto:',
-'emailmessage' => 'Mensaxe:',
-'emailsend' => 'Enviar',
-'emailccme' => 'Enviar unha copia da mensaxe para min.',
-'emailccsubject' => 'Copia da súa mensaxe para $1: $2',
-'emailsent' => 'Mensaxe enviada',
-'emailsenttext' => 'A súa mensaxe de correo electrónico foi enviada.',
-'emailuserfooter' => 'Este correo electrónico foi enviado por $1 a $2 mediante a función "Enviar un correo electrónico a este usuario" de {{SITENAME}}.',
+'usermailererror' => 'O obxecto enviado deu unha mensaxe de erro:',
+'defemailsubject' => 'Correo electrónico de {{SITENAME}}',
+'usermaildisabled' => 'O correo electrónico do usuario está desactivado',
+'usermaildisabledtext' => 'Non pode enviar correos electrónicos a outros usuarios deste wiki',
+'noemailtitle' => 'Sen enderezo de correo electrónico',
+'noemailtext' => 'Este usuario non especificou un enderezo de correo electrónico válido.',
+'nowikiemailtitle' => 'Sen correo electrónico habilitado',
+'nowikiemailtext' => 'Este usuario elixiu non recibir correos electrónicos doutros usuarios.',
+'email-legend' => 'Enviar un correo electrónico a outro usuario de {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'Para:',
+'emailsubject' => 'Asunto:',
+'emailmessage' => 'Mensaxe:',
+'emailsend' => 'Enviar',
+'emailccme' => 'Enviar unha copia da mensaxe para min.',
+'emailccsubject' => 'Copia da súa mensaxe para $1: $2',
+'emailsent' => 'Mensaxe enviada',
+'emailsenttext' => 'A súa mensaxe de correo electrónico foi enviada.',
+'emailuserfooter' => 'Este correo electrónico foi enviado por $1 a $2 mediante a función "Enviar un correo electrónico a este usuario" de {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Mensaxe deixada polo sistema.',
+'usermessage-editor' => 'Editor das mensaxes do sistema',
# Watchlist
'watchlist' => 'A miña lista de vixilancia',
'mywatchlist' => 'A miña lista de vixilancia',
-'watchlistfor' => "(de '''$1''')",
+'watchlistfor2' => 'De $1 $2',
'nowatchlist' => 'Non ten elementos na súa lista de vixilancia.',
'watchlistanontext' => 'Faga o favor de $1 no sistema para ver ou editar os elementos da súa lista de vixilancia.',
'watchnologin' => 'Non accedeu ao sistema',
@@ -2086,6 +2134,10 @@ Pode borrar os indicadores de aviso de notificación para o conxunto das páxina
O sistema de aviso de {{SITENAME}}
--
+Para cambiar as notificacións por correo electrónico, visite
+{{fullurl:{{#special:Preferences}}}}
+
+
Para cambiar a súa lista de vixilancia, visite
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2145,7 +2197,10 @@ A última edición fíxoa [[User:$3|$3]] ([[User talk:$3|conversa]]{{int:pipe-se
'revertpage-nouser' => 'Desfixéronse as edicións de (nome eliminado); cambiado á última versión feita por [[User:$1|$1]]',
'rollback-success' => 'Desfixéronse as edicións de $1;
volveuse á última edición, feita por $2.',
-'sessionfailure' => 'Parece que hai un problema co rexistro da súa sesión;
+
+# Edit tokens
+'sessionfailure-title' => 'Erro de sesión',
+'sessionfailure' => 'Parece que hai un problema co rexistro da súa sesión;
esta acción cancelouse como precaución fronte ao secuestro de sesións.
Prema no botón "atrás", volva cargar a páxina da que proviña e inténteo de novo.',
@@ -2278,18 +2333,22 @@ $1',
'month' => 'Desde o mes de (e anteriores):',
'year' => 'Desde o ano (e anteriores):',
-'sp-contributions-newbies' => 'Mostrar só as contribucións das contas de usuario novas',
-'sp-contributions-newbies-sub' => 'Contribucións dos usuarios novos',
-'sp-contributions-newbies-title' => 'Contribucións dos usuarios novos',
-'sp-contributions-blocklog' => 'rexistro de bloqueos',
-'sp-contributions-deleted' => 'contribucións borradas do usuario',
-'sp-contributions-logs' => 'rexistros',
-'sp-contributions-talk' => 'conversa',
-'sp-contributions-userrights' => 'xestión dos dereitos de usuario',
-'sp-contributions-blocked-notice' => 'Este usuario está bloqueado. Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:',
-'sp-contributions-search' => 'Busca de contribucións',
-'sp-contributions-username' => 'Enderezo IP ou nome de usuario:',
-'sp-contributions-submit' => 'Procurar',
+'sp-contributions-newbies' => 'Mostrar só as contribucións das contas de usuario novas',
+'sp-contributions-newbies-sub' => 'Contribucións dos usuarios novos',
+'sp-contributions-newbies-title' => 'Contribucións dos usuarios novos',
+'sp-contributions-blocklog' => 'rexistro de bloqueos',
+'sp-contributions-deleted' => 'contribucións borradas do usuario',
+'sp-contributions-uploads' => 'cargas',
+'sp-contributions-logs' => 'rexistros',
+'sp-contributions-talk' => 'conversa',
+'sp-contributions-userrights' => 'xestión dos dereitos de usuario',
+'sp-contributions-blocked-notice' => 'Este usuario está bloqueado. Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:',
+'sp-contributions-blocked-notice-anon' => 'Este enderezo IP está bloqueado.
+Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:',
+'sp-contributions-search' => 'Busca de contribucións',
+'sp-contributions-username' => 'Enderezo IP ou nome de usuario:',
+'sp-contributions-toponly' => 'Mostrar só as últimas revisións',
+'sp-contributions-submit' => 'Procurar',
# What links here
'whatlinkshere' => 'Páxinas que ligan con esta',
@@ -2350,7 +2409,6 @@ Olle a [[Special:IPBlockList|lista de enderezos IP e usuarios bloqueados]] para
'ipb-edit-dropdown' => 'Editar os motivos de bloqueo',
'ipb-unblock-addr' => 'Desbloquear a "$1"',
'ipb-unblock' => 'Desbloquear un usuario ou enderezo IP',
-'ipb-blocklist-addr' => 'Bloqueos vixentes de "$1"',
'ipb-blocklist' => 'Ver os bloqueos vixentes',
'ipb-blocklist-contribs' => 'Contribucións de "$1"',
'unblockip' => 'Desbloquear o usuario',
@@ -2422,6 +2480,8 @@ Por favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte tÃ
Polo tanto, non pode crear unha conta",
'cant-block-while-blocked' => 'Non pode bloquear outros usuarios mentres vostede estea bloqueado.',
'cant-see-hidden-user' => 'O usuario que intenta bloquear xa foi bloqueado e agochado. Dado que non ten o dereito necesario para agochar usuarios, non pode ver ou editar o bloqueo do usuario.',
+'ipbblocked' => 'Non pode bloquear ou desbloquear outros usuarios porque vostede está bloqueado',
+'ipbnounblockself' => 'Non ten os permisos necesarios para desbloquearse a si mesmo',
# Developer tools
'lockdb' => 'Fechar base de datos',
@@ -2458,6 +2518,17 @@ Isto significa que pode volver renomear unha páxina ao seu nome antigo se comet
'''ATENCIÓN!'''
Este cambio nunha páxina popular pode ser drástico e inesperado;
por favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
+'movepagetext-noredirectfixer' => "Ao usar o formulario de embaixo vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.
+O título vello vaise converter nunha páxina de redirección ao novo título.
+Asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
+Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
+
+Teña en conta que a páxina '''non''' será movida se xa existe unha páxina co novo título, a menos que estea baleira ou sexa unha redirección e que non teña historial de edicións.
+Isto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.
+
+'''ATENCIÓN!'''
+Este cambio nunha páxina popular pode ser drástico e inesperado;
+por favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
'movepagetalktext' => "A páxina de conversa asociada, se existe, será automaticamente movida con esta '''agás que''':
*Estea a mover a páxina empregando espazos de nomes,
*Xa exista unha páxina de conversa con ese nome, ou
@@ -2514,6 +2585,7 @@ Quérea eliminar para facer sitio para mover?',
'immobile-source-page' => 'Esta páxina non se pode mover.',
'immobile-target-page' => 'Non se pode mover a ese título.',
'imagenocrossnamespace' => 'Non se pode mover o ficheiro a un espazo de nomes que non o admite',
+'nonfile-cannot-move-to-file' => 'Non se pode mover algo que non é un ficheiro ao espazo de nomes reservado aos ficheiros',
'imagetypemismatch' => 'A nova extensión do fiheiro non coincide co seu tipo',
'imageinvalidfilename' => 'O nome da imaxe é inválido',
'fix-double-redirects' => 'Actualizar calquera redirección que apunte cara ao título orixinal',
@@ -2593,6 +2665,7 @@ Gárdeo no seu disco duro e cárgueo aquí.',
'importstart' => 'Importando páxinas...',
'import-revision-count' => '$1 {{PLURAL:$1|revisión|revisións}}',
'importnopages' => 'Non hai páxinas para importar.',
+'imported-log-entries' => '{{PLURAL:$1|Importouse unha entrada|Importáronse $1 entradas}} do rexisto.',
'importfailed' => 'A importación fallou: $1',
'importunknownsource' => 'Fonte de importación descoñecida',
'importcantopen' => 'Non se pode abrir o ficheiro importado',
@@ -2685,6 +2758,8 @@ Gárdeo no seu disco duro e cárgueo aquí.',
'tooltip-upload' => 'Comezar a enviar',
'tooltip-rollback' => '"Reverter" desfai, cun só clic, a(s) edición(s) feita(s) nesta páxina polo último colaborador.',
'tooltip-undo' => '"Desfacer" reverte esta edición e abre o formulario de edición nun modo previo. Permite engadir un motivo no resumo de edición.',
+'tooltip-preferences-save' => 'Gardar as preferencias',
+'tooltip-summary' => 'Escriba un breve resumo',
# Stylesheets
'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
@@ -2816,13 +2891,16 @@ O seu sistema pode quedar comprometido se o executa.",
'thumbsize' => 'Tamaño da miniatura:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|páxina|páxinas}}',
'file-info' => 'Tamaño do ficheiro: $1, tipo MIME: $2',
-'file-info-size' => '($1 × $2 píxeles, tamaño do ficheiro: $3, tipo MIME: $4)',
+'file-info-size' => '$1 × $2 píxeles, tamaño do ficheiro: $3, tipo MIME: $4',
'file-nohires' => '<small>Non se dispón dunha resolución máis grande.</small>',
-'svg-long-desc' => '(ficheiro SVG, nominalmente $1 × $2 píxeles, tamaño do ficheiro: $3)',
+'svg-long-desc' => 'ficheiro SVG, nominalmente $1 × $2 píxeles, tamaño do ficheiro: $3',
'show-big-image' => 'Imaxe na máxima resolución',
'show-big-image-thumb' => '<small>Tamaño desta presentación da imaxe: $1 × $2 píxeles</small>',
'file-info-gif-looped' => 'en bucle',
'file-info-gif-frames' => '$1 {{PLURAL:$1|fotograma|fotogramas}}',
+'file-info-png-looped' => 'en bucle',
+'file-info-png-repeat' => 'reproducido $1 {{PLURAL:$1|vez|veces}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogramas}}',
# Special:NewFiles
'newimages' => 'Galería de imaxes novas',
@@ -2980,6 +3058,7 @@ Os demais agocharanse por omisión.
'exif-gpsareainformation' => 'Nome da área GPS',
'exif-gpsdatestamp' => 'Data do GPS',
'exif-gpsdifferential' => 'Corrección diferencial do GPS',
+'exif-objectname' => 'Título curto',
# EXIF attributes
'exif-compression-1' => 'Sen comprimir',
@@ -3061,6 +3140,8 @@ Os demais agocharanse por omisión.
'exif-sensingmethod-7' => 'Sensor trilineal',
'exif-sensingmethod-8' => 'Sensor secuencial da liña de cor',
+'exif-filesource-3' => 'Cámara fotográfica dixital',
+
'exif-scenetype-1' => 'Unha imaxe fotografada directamente',
'exif-customrendered-0' => 'Procesamento normal',
@@ -3137,29 +3218,29 @@ Os demais agocharanse por omisión.
'limitall' => 'todas',
# E-mail address confirmation
-'confirmemail' => 'Confirmar o enderezo de correo electrónico',
-'confirmemail_noemail' => 'Non ten rexistrado ningún enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias de usuario]].',
-'confirmemail_text' => '{{SITENAME}} require que lle dea validez ao seu enderezo de correo electrónico antes de utilizar as funcións relacionadas con el.
+'confirmemail' => 'Confirmar o enderezo de correo electrónico',
+'confirmemail_noemail' => 'Non ten rexistrado ningún enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias de usuario]].',
+'confirmemail_text' => '{{SITENAME}} require que lle dea validez ao seu enderezo de correo electrónico antes de utilizar as funcións relacionadas con el.
Prema no botón de embaixo para enviar un correo de confirmación ao seu enderezo.
O correo incluirá unha ligazón cun código:
faga clic nesta ligazón para abrila no seu navegador web e así confirmar que o seu enderezo é válido.',
-'confirmemail_pending' => 'Envióuselle un código de confirmación ao enderezo de correo electrónico;
+'confirmemail_pending' => 'Envióuselle un código de confirmación ao enderezo de correo electrónico;
se creou a conta hai pouco debe esperar uns minutos antes de solicitar un novo código.',
-'confirmemail_send' => 'Enviar por correo elecrónico un código de confirmación',
-'confirmemail_sent' => 'Correo electrónico de confirmación enviado.',
-'confirmemail_oncreate' => 'Envióuselle un código de confirmación ao enderezo de correo electrónico. Este código non é imprescindible para entrar no wiki, pero é preciso para activar as funcións do wiki baseadas no correo.',
-'confirmemail_sendfailed' => '{{SITENAME}} non puido enviar a mensaxe de confirmación do correo.
+'confirmemail_send' => 'Enviar por correo elecrónico un código de confirmación',
+'confirmemail_sent' => 'Correo electrónico de confirmación enviado.',
+'confirmemail_oncreate' => 'Envióuselle un código de confirmación ao enderezo de correo electrónico. Este código non é imprescindible para entrar no wiki, pero é preciso para activar as funcións do wiki baseadas no correo.',
+'confirmemail_sendfailed' => '{{SITENAME}} non puido enviar a mensaxe de confirmación do correo.
Por favor, comprobe que no enderezo de correo electrónico non haxa caracteres inválidos.
O programa de correo informa do seguinte: $1',
-'confirmemail_invalid' => 'O código de confirmación non é válido.
+'confirmemail_invalid' => 'O código de confirmación non é válido.
Pode ser que caducase.',
-'confirmemail_needlogin' => 'Necesita $1 para confirmar o seu enderezo de correo electrónico.',
-'confirmemail_success' => 'Confirmouse o seu enderezo de correo electrónico. Agora xa pode [[Special:UserLogin|acceder ao sistema]] e facer uso do wiki.',
-'confirmemail_loggedin' => 'Xa se confirmou o seu enderezo de correo electrónico.',
-'confirmemail_error' => 'Houbo un problema ao gardar a súa confirmación.',
-'confirmemail_subject' => '{{SITENAME}} - Verificación do enderezo de correo electrónico',
-'confirmemail_body' => 'Alguén, probablemente vostede, desde o enderezo IP $1,
+'confirmemail_needlogin' => 'Necesita $1 para confirmar o seu enderezo de correo electrónico.',
+'confirmemail_success' => 'Confirmouse o seu enderezo de correo electrónico. Agora xa pode [[Special:UserLogin|acceder ao sistema]] e facer uso do wiki.',
+'confirmemail_loggedin' => 'Xa se confirmou o seu enderezo de correo electrónico.',
+'confirmemail_error' => 'Houbo un problema ao gardar a súa confirmación.',
+'confirmemail_subject' => '{{SITENAME}} - Verificación do enderezo de correo electrónico',
+'confirmemail_body' => 'Alguén, probablemente vostede, desde o enderezo IP $1,
rexistrou a conta "$2" con este enderezo de correo electrónico en {{SITENAME}}.
Para confirmar que realmente esta conta lle pertence a vostede e activar
@@ -3173,8 +3254,36 @@ para cancelar a confirmación do enderezo de correo electrónico:
$5
O código de confirmación caduca o $6 ás $7.',
-'confirmemail_invalidated' => 'A confirmación do enderezo de correo electrónico foi cancelada',
-'invalidateemail' => 'Cancelar a confirmación do correo electrónico',
+'confirmemail_body_changed' => 'Alguén, probablemente vostede, desde o enderezo IP $1,
+cambiou o enderezo de correo electrónico da conta "$2" a estoutro en {{SITENAME}}.
+
+Para confirmar que realmente esta conta lle pertence a vostede e reactivar
+as características do correo electrónico en {{SITENAME}}, abra esta ligazón no seu navegador:
+
+$3
+
+Se a conta *non* é súa, siga estoutra ligazón
+para cancelar a confirmación do enderezo de correo electrónico:
+
+$5
+
+O código de confirmación caduca o $6 ás $7.',
+'confirmemail_body_set' => 'Alguén, probablemente vostede, desde o enderezo IP $1,
+estableceu este enderezo de correo electrónico como o da conta "$2" en {{SITENAME}}.
+
+Para confirmar que realmente esta conta lle pertence a vostede e reactivar
+as características do correo electrónico en {{SITENAME}}, abra esta ligazón no seu navegador:
+
+$3
+
+Se a conta *non* é súa, siga estoutra ligazón
+para cancelar a confirmación do enderezo de correo electrónico:
+
+$5
+
+O código de confirmación caduca o $6 ás $7.',
+'confirmemail_invalidated' => 'A confirmación do enderezo de correo electrónico foi cancelada',
+'invalidateemail' => 'Cancelar a confirmación do correo electrónico',
# Scary transclusion
'scarytranscludedisabled' => '[A transclusión interwiki está desactivada]',
@@ -3214,6 +3323,7 @@ Por favor, confirme que realmente quere recrear esta páxina.",
'table_pager_first' => 'Primeira páxina',
'table_pager_last' => 'Última páxina',
'table_pager_limit' => 'Mostrar $1 elementos por páxina',
+'table_pager_limit_label' => 'Elementos por páxina:',
'table_pager_limit_submit' => 'Ir',
'table_pager_empty' => 'Sen resultados',
@@ -3223,6 +3333,9 @@ Por favor, confirme que realmente quere recrear esta páxina.",
'autoredircomment' => 'Redirixida cara a "[[$1]]"',
'autosumm-new' => 'Nova páxina: "$1"',
+# Size units
+'size-kilobytes' => '$1 kB',
+
# Live preview
'livepreview-loading' => 'Cargando...',
'livepreview-ready' => 'Cargando… Listo!',
@@ -3270,6 +3383,7 @@ Tamén pode [[Special:Watchlist/edit|empregar o editor normal]].',
'version-specialpages' => 'Páxinas especiais',
'version-parserhooks' => 'Asociadores analíticos',
'version-variables' => 'Variábeis',
+'version-skins' => 'Aparencias',
'version-other' => 'Outros',
'version-mediahandlers' => 'Executadores de multimedia',
'version-hooks' => 'Asociadores',
@@ -3281,6 +3395,13 @@ Tamén pode [[Special:Watchlist/edit|empregar o editor normal]].',
'version-hook-subscribedby' => 'Subscrito por',
'version-version' => '(Versión $1)',
'version-license' => 'Licenza',
+'version-poweredby-credits' => "Este wiki está desenvolvido por '''[http://www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autor © 2001-$1 $2.",
+'version-poweredby-others' => 'outros',
+'version-license-info' => 'MediaWiki é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.
+
+MediaWiki distribúese coa esperanza de que poida ser útil, pero SEN NINGUNHA GARANTÃA; nin sequera a garantía implícita de COMERCIALIZACIÓN ou ADECUACIÓN A UNHA FINALIDADE ESPECÃFICA. Olle a licenza pública xeral GNU para obter máis detalles.
+
+Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza pública xeral GNU] xunto ao programa; se non é así, escriba á Free Software Foundation, Inc., 51 da rúa Franklin, quinto andar, Boston, MA 02110-1301, Estados Unidos ou [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lea a licenza en liña].',
'version-software' => 'Software instalado',
'version-software-product' => 'Produto',
'version-software-version' => 'Versión',
@@ -3351,6 +3472,15 @@ Introduza o nome do ficheiro sen o prefixo "{{ns:file}}:".',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
+# Special:ComparePages
+'comparepages' => 'Comparar páxinas',
+'compare-selector' => 'Comparar as revisións de dúas páxinas',
+'compare-page1' => 'Páxina 1',
+'compare-page2' => 'Páxina 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
'dberr-header' => 'Este wiki ten un problema',
'dberr-problems' => 'Sentímolo! Este sitio está experimentando dificultades técnicas.',
@@ -3367,8 +3497,13 @@ Introduza o nome do ficheiro sen o prefixo "{{ns:file}}:".',
'htmlform-float-invalid' => 'O valor que especificou non é un número.',
'htmlform-int-toolow' => 'O valor que especificou está por baixo do mínimo de $1',
'htmlform-int-toohigh' => 'O valor que especificou está por riba do máximo de $1',
+'htmlform-required' => 'Este valor é obrigatorio',
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfacer os cambios',
'htmlform-selectorother-other' => 'Outra',
+# SQLite database support
+'sqlite-has-fts' => '$1 con soporte para procuras de texto completo',
+'sqlite-no-fts' => '$1 sen soporte para procuras de texto completo',
+
);
diff --git a/languages/messages/MessagesGlk.php b/languages/messages/MessagesGlk.php
index 99435678..14353d3a 100644
--- a/languages/messages/MessagesGlk.php
+++ b/languages/messages/MessagesGlk.php
@@ -9,6 +9,7 @@
*
* @author AminSanaei
* @author Varg
+ * @author محک
*/
$fallback = 'fa';
@@ -45,8 +46,8 @@ $messages = array(
# 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).
'currentevents' => 'تازه چیؤن',
-'mainpage' => 'گت ولگ',
-'mainpage-description' => 'گت ولگ',
+'mainpage' => 'گت صÙحه',
+'mainpage-description' => 'گت صÙحه',
'portal' => 'امه جیگا',
'privacy' => 'رازبداری',
diff --git a/languages/messages/MessagesGn.php b/languages/messages/MessagesGn.php
index 8a95d712..83537e62 100644
--- a/languages/messages/MessagesGn.php
+++ b/languages/messages/MessagesGn.php
@@ -189,7 +189,7 @@ $messages = array(
'yourname' => 'Hero',
'yourpassword' => 'Ne remiñemi',
'yourpasswordagain' => 'Repita ne remiñemi',
-'remembermypassword' => "Aipota chemomandu'ajepi amba'apo jave.",
+'remembermypassword' => "Aipota chemomandu'ajepi amba'apo jave (for a maximum of $1 {{PLURAL:$1|day|days}})",
'login' => 'Terañemboguapy/Ke',
'nav-login-createaccount' => 'Terañemboguapy/Ke',
'userlogin' => 'Terañemboguapy/Ke',
@@ -230,13 +230,11 @@ $messages = array(
'newarticletext' => "Rehapykuehókuri peteĩ joaju peteĩ kuatiarogue ndaipórivape.
Nde remoheñoisérõ ko kuatiarogue, eñepyrũkatu ehai.
Reikotevẽvérõ marandu, emoñe'ẽ kuatiarogue ñepytyvõ rehegua. Oiméramo reikereínte térã rejavyhaguére, upéicharõ terehojey [[{{MediaWiki:Helppage}}|kuatiarogue mboyveguápe]].",
-'userinvalidcssjstitle' => "'''Aviso:''' No existe la piel \"\$1\". Recuerda que las páginas personalizadas .css y .js tienen un título en minúsculas, p.e. Usuario:Foo/monobook.css en vez de Usuario:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Aviso:''' No existe la piel \"\$1\". Recuerda que las páginas personalizadas .css y .js tienen un título en minúsculas, p.e. Usuario:Foo/vector.css en vez de Usuario:Foo/Vector.css.",
'editing' => 'Ojehaihína $1',
'editingsection' => 'Ojehaihína $1 (vore)',
'editingcomment' => 'Ojehaihína $1 (comentario)',
'yourtext' => "Mba'ehaipyre",
-'longpagewarning' => "'''Ejesarekóke: ko kuatiarogue, tuichakuépe, oguereko $1 kb; heta kundahára ikatu iñapañuãi jehaijeýpe kuatiarogue ohaságui 32 kb.
-Aipórõ, eñeha'ãna emboja'o ne rembiapo, vore michĩvévape.'''",
# History pages
'cur' => "ko'ag̃agua",
@@ -518,7 +516,7 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
'spam_blanking' => 'Todas las revisiones contienen enlaces a $1, blanqueando',
# Media information
-'file-info' => "(tamaño de jehai'aty: $1; tipo MIME: $2)",
+'file-info' => "tamaño de jehai'aty: $1; tipo MIME: $2",
# Special:NewFiles
'newimages' => "Ta'ãnga pyahu renda",
diff --git a/languages/messages/MessagesGot.php b/languages/messages/MessagesGot.php
index 660df6d6..6ca593f7 100644
--- a/languages/messages/MessagesGot.php
+++ b/languages/messages/MessagesGot.php
@@ -367,7 +367,6 @@ $messages = array(
# Watchlist
'watchlist' => 'ðŒ¼ðŒ´ðŒ¹ðŒ½ð‰ðƒ ð…ðŒ¹ð„ðŒ°ðŒ½ðŒ³ðƒðŒ»ðŒ´ðŒ¹ðƒð„ðŒ°',
'mywatchlist' => 'ðŒ¼ðŒ´ðŒ¹ðŒ½ð‰ðƒ ð…ðŒ¹ð„ðŒ°ðŒ½ðŒ³ðƒðŒ»ðŒ´ðŒ¹ðƒð„ðŒ°',
-'watchlistfor' => "(fáur '''$1''')",
'watch' => 'ð…ðŒ°ð‚ðŒ°ðŒ½',
'watchthispage' => 'ð…ðŒ°ð‚ðŒ°ðŒ½ ðƒðŒ´ðŒ¹ðŒ³ð‰',
'unwatch' => 'ðŒ½ðŒ¹ð…ðŒ°ð‚ðŒ°ðŒ½',
diff --git a/languages/messages/MessagesGrc.php b/languages/messages/MessagesGrc.php
index 72052be4..32fcbd12 100644
--- a/languages/messages/MessagesGrc.php
+++ b/languages/messages/MessagesGrc.php
@@ -51,8 +51,7 @@ $messages = array(
'tog-editsection' => 'Τμήματος μεταγÏαφὴν διὰ τῶν συνδέσμων «[μεταγÏάφειν]» καθιστάναι δυνατήν',
'tog-editsectiononrightclick' => 'Καθιστάναι δυνατὸν τὸ μεταγÏάφειν τμήματα διὰ τοῦ á¼Ï€á½¶ τῶν á¼Ï€Î¹Î³Ïαφῶν τῶν τμημάτων θλίβειν δεξιῶς (ἀπαιτεῖται JavaScript)',
'tog-showtoc' => 'ΔεικνÏναι πίνακα πεÏιεχομένων (á¼Î½ δέλτοις πεÏιεχοÏσαις πλείους τῶν 3 á¼Ï€Î¹ÎºÎµÏ†Î±Î»Î¯Î´Ï‰Î½)',
-'tog-rememberpassword' => 'Ἐνθυμεῖσθαι τὴν á¼Î¼á½´Î½ σÏνδεσιν á¼Î½ τῇδε τῇ ὑπολογιστικῇ μηχανῇ',
-'tog-editwidth' => 'Πλαίσιον μεταγÏαφῆς εἰς πλῆÏες μέγεθος',
+'tog-rememberpassword' => 'Ἐνθυμεῖσθαι τὴν á¼Î¼á½´Î½ σÏνδεσιν á¼Î½ τῇδε τῇ ὑπολογιστικῇ μηχανῇ (μέγιστον $1 {{PLURAL:$1|ἡμέÏα|ἡμέÏαι}})',
'tog-watchcreations' => 'ΠÏοστιθέναι Ï„á½°Ï‚ δέλτους ἃς ποιῶ τοῖς á¼Ï†Î¿Ïωμένοις μου',
'tog-watchdefault' => 'ΠÏοστιθέναι Ï„á½°Ï‚ δέλτους ἃς μεταγÏάφω τοῖς á¼Ï†Î¿Ïωμένοις μου',
'tog-watchmoves' => 'ΠÏοστιθέναι Ï„á½°Ï‚ δέλτους ἃς κινῶ τοῖς á¼Ï†Î¿Ïωμένοις μου',
@@ -196,31 +195,20 @@ $messages = array(
'faqpage' => 'Project:Πολλάκις αἰτηθέντα',
# Vector skin
-'vector-action-addsection' => 'Θέμα Ï€Ïοστιθέναι',
-'vector-action-delete' => 'ΣβεννÏναι',
-'vector-action-move' => 'Κινεῖν',
-'vector-action-protect' => 'Φυλάττειν',
-'vector-action-undelete' => 'Ἀποκαθιστάναι',
-'vector-action-unprotect' => 'Μὴ φυλάττειν',
-'vector-namespace-category' => 'ΚατηγοÏία',
-'vector-namespace-help' => 'Δέλτος βοηθείας',
-'vector-namespace-image' => 'ἈÏχεῖον',
-'vector-namespace-main' => 'Δέλτος',
-'vector-namespace-media' => 'Δέλτος μέσων',
-'vector-namespace-mediawiki' => 'Ἀγγελία',
-'vector-namespace-project' => 'Δέλτος á¼Î³Ï‡ÎµÎ¹Ïήματος',
-'vector-namespace-special' => 'Εἰδικὴ δέλτος',
-'vector-namespace-talk' => 'Διάλεξις',
-'vector-namespace-template' => 'ΠÏότυπον',
-'vector-namespace-user' => 'Δέλτος χÏωμένου',
-'vector-view-create' => 'Ποιεῖν',
-'vector-view-edit' => 'ΜεταγÏάφειν',
-'vector-view-history' => 'ἹστοÏίαν á½Ïᾶν',
-'vector-view-view' => 'Ἀναγνῶναι',
-'vector-view-viewsource' => 'ὉÏᾶν τὴν πηγήν',
-'actions' => 'ΔÏάσεις',
-'namespaces' => 'Ὀνοματεῖα',
-'variants' => 'ΠαÏαλλαγαί',
+'vector-action-addsection' => 'Θέμα Ï€Ïοστιθέναι',
+'vector-action-delete' => 'ΣβεννÏναι',
+'vector-action-move' => 'Κινεῖν',
+'vector-action-protect' => 'Φυλάττειν',
+'vector-action-undelete' => 'Ἀποκαθιστάναι',
+'vector-action-unprotect' => 'Μὴ φυλάττειν',
+'vector-view-create' => 'Ποιεῖν',
+'vector-view-edit' => 'ΜεταγÏάφειν',
+'vector-view-history' => 'ἹστοÏίαν á½Ïᾶν',
+'vector-view-view' => 'Ἀναγνῶναι',
+'vector-view-viewsource' => 'ὉÏᾶν τὴν πηγήν',
+'actions' => 'ΔÏάσεις',
+'namespaces' => 'Ὀνοματεῖα',
+'variants' => 'ΠαÏαλλαγαί',
'errorpagetitle' => 'Σφάλμα',
'returnto' => 'Ἐπανιέναι εἰς $1.',
@@ -439,7 +427,7 @@ $2',
'yourname' => 'Ὄνομα χÏωμένου:',
'yourpassword' => 'Σῆμα:',
'yourpasswordagain' => 'Ἀνατυπῶσαι σÏνθημα:',
-'remembermypassword' => 'Μίμνῃσκε á¼Î½Î¸Î¬Î´Îµ τὸ συνδεῖσθαι',
+'remembermypassword' => 'Μίμνῃσκε á¼Î½Î¸Î¬Î´Îµ συνδεῖσθαι (μέγιστον $1 {{PLURAL:$1|ἡμέÏα|ἡμέÏαι}})',
'yourdomainname' => 'Ὁ τομεÏÏ‚ σου:',
'externaldberror' => 'Συνέβη εἴτε σφάλμα τι πιστοποιήσεως τῆς βάσεως δεδομένων εἴτε οá½Îº ἔξεστί σοι á¼Î½Î·Î¼ÎµÏοῦν τὸν á¼Î¾Ï‰Ï„εÏικὸν λογισμόν σου.',
'login' => 'Συνδεῖσθαι',
@@ -456,6 +444,7 @@ $2',
'gotaccount' => "ἎÏα λογισμὸν ἤδη τινὰ ἔχεις; '''$1'''.",
'gotaccountlink' => 'Συνδεῖσθαι',
'createaccountmail' => 'ἠλεκτÏονικῇ á¼Ï€Î¹ÏƒÏ„ολῇ',
+'createaccountreason' => 'Αἰτία',
'badretype' => 'Τὰ εἰσηγμένα ὑπá¼ÏƒÎ¿á¿¦ συνθήματα οá½Ï‡ á¼Ïμόττουσιν.',
'userexists' => 'Τὸ εἰσηγμένον ὄνομα ἤδη κεχÏησμένον á¼ÏƒÏ„ίν.
Ἐπίλεξον ὄνομα διάφοÏόν τι.',
@@ -608,7 +597,7 @@ $2',
'''Internet Explorer:''' á¼Ïητυειν τὸ ''Ctrl'' á¼Î½á¿· θλίβεις τὸ ''Refresh,'' á¼¢ πίεσον ''Ctrl-F5''.",
'usercssyoucanpreview' => "'''Βουλή:''' ΧÏῆσον Ï„á¿· κομβίῳ 'ΔεικνÏναι Ï€ÏοθεώÏησιν' ἵνα δοκιμάσῃς τὴν νέαν σου CSS Ï€Ïὸ τοῦ καταγÏάφειν.",
'userjsyoucanpreview' => "'''Βουλή:''' ΧÏῆσον Ï„á¿· κομβίῳ 'ΔεικνÏναι Ï€ÏοθεώÏησιν' ἵνα δοκιμάσῃς τὴν νέαν σου JS Ï€Ïὸ τοῦ καταγÏάφειν.",
-'userinvalidcssjstitle' => "'''ΠÏοσοχή:''' Οá½Ï‡ ὑφίσταται ''skin'' \"\$1\". Μέμνησο: αἱ Ï€ÏοσηÏμοσμέναι δέλτοι .css καὶ .js χÏῶνται á¼Ï€ÏŽÎ½Ï…μον τι ἔχον πεζὰ γÏάμματα, Ï€.χ. {{ns:user}}:Foo/monobook.css á¼Î½ ἀντίθεσει Ï€Ïὸς τὸν {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''ΠÏοσοχή:''' Οá½Ï‡ ὑφίσταται ''skin'' \"\$1\". Μέμνησο: αἱ Ï€ÏοσηÏμοσμέναι δέλτοι .css καὶ .js χÏῶνται á¼Ï€ÏŽÎ½Ï…μον τι ἔχον πεζὰ γÏάμματα, Ï€.χ. {{ns:user}}:Foo/vector.css á¼Î½ ἀντίθεσει Ï€Ïὸς τὸν {{ns:user}}:Foo/Vector.css.",
'updated' => '(ἘνημεÏωθέν)',
'note' => "'''Ἐπισήμανσις:'''",
'previewnote' => "'''Ἥδε á¼ÏƒÏ„ὶ Ï€ÏοθεώÏησις, οá½Ï‡á½¶ καταγÏαφὴ τῶν μεταβολῶν!'''",
@@ -629,9 +618,6 @@ $2',
Βεβαιοῦτε ἡμᾶς πεÏὶ τῆς καινοπÏεπείας ὅτου á¼”Ïγου γÏαφομένου ὑφ'ὑμῶν á¼Î½Î¸Î¬Î´Îµ. Βεβαιοῦτε ἡμᾶς, á¼Ï€á¼´ÏƒÎ·Ï‚, πεÏὶ τῆς μὴ á¼ÎºÏ‡Ï‰Ïήσεως εἰς ἀλλοτÏίους Ï€Ïὸς ὑμᾶς τοῦ δικαιώματος δημοσιεÏσεως καὶ ὀνήσεως οὗ, ἥντινα ἔκτασιν αá½Ï„ὸ ἔχει.
<br />
'''ΠΑΡΑΚΑΛΟΥΜΕΠΥΜΑΣ ΙÎΑ ΜΗ ΑÎΑΡΤΗΤΕ ΚΕΙΜΕÎΑ ΑΛΛΟΤΡΙΩΠΕΙ ΜΗ ΕΧΗΤΕ ΤΗΠΑΔΕΙΑΠΤΟΥ ΚΑΤΟΧΟΥ ΤΩΠΠÎΕΥΜΑΤΙΚΩΠΔΙΚΑΙΩΜΑΤΩÎ!'''",
-'longpagewarning' => "'''ΠΡΟΣΟΧΗ: Ἡδε ἡ δέλτος μῆκος $1 kb / χδ (χιλιοδυφιολέξεων ἢ χιλιάδων λέξεων ''δυ''αδικῶν ψη''φί''ων) ἔχει.
-Ἐνδέχεται πλοηγητήÏια τινὰ Ï€Ïοβληματικῶς μεταγÏάφειν δέλτους Ï€Ïοσεγγίζοντας Ï„á½° á¼¢ μακÏυτέÏας τῶν 32 kb.
-ΘεωÏήσατε τὸ διασπάσειν τὴν δέλτον εἰς μικÏώτεÏα τεμάχια.'''",
'protectedpagewarning' => "'''ΠΡΟΣΟΧΗ: Ἥδε ἡ δέλτος κεκλῃσμένη á¼ÏƒÏ„ὶν οὕτως ὥστε μόνον χÏώμενοι ἔχοντες Ï€Ïονόμια á¼Ï€Î¹Ï„Ïόπων δÏνωνται μεταγÏάψειν αá½Ï„ήν.'''",
'semiprotectedpagewarning' => "'''ΠΡΟΣΟΧΗ: Ἥδε ἡ δέλτος κεκλῃσμένη á¼ÏƒÏ„ὶν οὕτως ὥστε μόνον χÏώμενοι ἔχοντες Ï€Ïονόμια á¼Ï€Î¹Ï„Ïόπων δÏνωνται μεταγÏάψειν αá½Ï„ήν.'''",
'templatesused' => '{{PLURAL:$1|ΠÏότυπον κεχÏησμένον|ΠÏότυπα κεχÏησμένα}} á¼Î½ τοιαÏτῃ δέλτῳ:',
@@ -751,6 +737,8 @@ $1",
'logdelete-failure' => "'''Ἡ á½Ïατότης τοῦ καταλόγου μὴ ῥυθμίσιμος ἦν:'''
$1",
'revdel-restore' => 'Ἀλλάττειν á½Ïατότητα',
+'revdel-restore-deleted' => 'á¼ÏƒÎ²ÎµÏƒÎ¼Î­Î½Î±Î¹ ἀναθεωÏήσεις',
+'revdel-restore-visible' => 'á½Ïαταὶ ἀναθεωÏήσεις',
'pagehist' => 'ἹστοÏία δέλτου',
'deletedhist' => 'ἹστοÏία διαγεγÏαμμένη',
'revdelete-content' => 'πεÏιεχόμενον',
@@ -802,6 +790,7 @@ $1",
# Diffs
'history-title' => 'Αἱ Ï€ÏότεÏαι á¼ÎºÎ´ÏŒÏƒÎµÎ¹Ï‚ τῆς δέλτου "$1"',
'difference' => '(Τὰ μεταβεβλημένα)',
+'difference-multipage' => '(ΔιαφοÏá½° μεταξὺ δέλτων)',
'lineno' => 'ΓÏαμμή $1:',
'compareselectedversions' => 'ΣυγκÏίνειν Ï„á½°Ï‚ á¼Ï€ÎµÎ¹Î»ÎµÎ³Î¼Î­Î½Î±Ï‚ δέλτους',
'showhideselectedversions' => 'ΔεικνÏειν/κÏÏπτειν Ï„á½°Ï‚ á¼Ï€ÎµÎ¹Î»ÎµÎ³Î¼Î­Î½Î±Ï‚ á¼ÎºÎ´ÏŒÏƒÎµÎ¹Ï‚',
@@ -915,6 +904,7 @@ $1",
'contextlines' => 'ΣειÏαὶ ἀνά ἀποτέλεσμα:',
'contextchars' => 'Συναφὲς κείμενον ἀνά σειÏάν:',
'stub-threshold' => 'Ἄνω φÏάγμα διὰ τοῦς <a href="#" class="stub">συνδέσμους Ï€Ïὸς λείμματα</a> (δυφία):',
+'stub-threshold-disabled' => 'ἈπενεÏγηθέν',
'recentchangesdays' => 'Αἱ ἡμέÏαι αἱ δεικτέαι á¼Î½ ταῖς Ï€Ïοσφάτοις ἀλλαγαῖς:',
'recentchangesdays-max' => '(τὸ μέγιστον $1 {{PLURAL:$1|ἡμέÏα|ἡμέÏαι}})',
'recentchangescount' => 'Δεικτέος Ï€ÏοκαθωÏισμένως á¼€Ïιθμὸς μεταγÏαφῶν:',
@@ -977,7 +967,7 @@ $1",
'prefs-advancedrendering' => 'ΠÏοηγμέναι á¼Ï€Î¹Î»Î¿Î³Î±Î¯',
'prefs-advancedsearchoptions' => 'ΠÏοηγμέναι á¼Ï€Î¹Î»Î¿Î³Î±Î¯',
'prefs-advancedwatchlist' => 'ΠÏοηγμέναι á¼Ï€Î¹Î»Î¿Î³Î±Î¯',
-'prefs-display' => 'Ἐπίδειξις á¼Ï€Î¹Î»Î¿Î³á¿¶Î½',
+'prefs-displayrc' => 'Ἐπίδειξις á¼Ï€Î¹Î»Î¿Î³á¿¶Î½',
'prefs-diffs' => 'ΔιαφοÏαί',
# User rights
@@ -1078,7 +1068,6 @@ $1",
'right-siteadmin' => 'ΦÏάττειν καὶ ἀποφÏάττειν τὴν βάσιν δεδομένων',
'right-reset-passwords' => 'ἈναÏÏυθμίζειν συνθήματα ἄλλων χÏωμένων',
'right-override-export-depth' => 'Ἐξάγειν δέλτους πεÏιλαμβανομένων συνδεδεμένων δέλτων ἕως βάθος τι 5 á¼Ï€Î¹Ï€Î­Î´Ï‰Î½',
-'right-versiondetail' => 'ΔεικνÏναι Ï„á½°Ï‚ á¼ÎºÏ„εταμένας Ï€Ïστεις τῆς á¼ÎºÎ´ÏŒÏƒÎµÏ‰Ï‚ λογισμικοῦ.',
# User rights log
'rightslog' => 'Κατάλογος δικαιωμάτων χÏωμένων',
@@ -1128,14 +1117,9 @@ $1",
'recentchanges-legend' => 'Ἐπιλογαὶ Ï€Ïοσφάτων μεταβολῶν',
'recentchangestext' => 'ἈνιχνεÏσειν Ï„á½°Ï‚ πλείω Ï€Ïόσφατους ἀλλαγὰς οῦ βίκι á¼Î½ τῇδε τῇ δέλτῳ.',
'recentchanges-feed-description' => 'ΠαÏακολουθεῖν Ï„á½°Ï‚ πλείω Ï€Ïοσφάτους ἀλλαγὰς τοῦ βίκι á¼Î½ ταÏτῃ πεÏιλήψει.',
-'recentchanges-label-legend' => 'Ὑπόμνημα: $1.',
-'recentchanges-legend-newpage' => '$1 - νέα δέλτος',
'recentchanges-label-newpage' => 'Ἥδε ἡ μεταγÏαφὴ á¼Ï€Î¿Î¯Î·ÏƒÎµÎ½ νέαν δέλτον τινά',
-'recentchanges-legend-minor' => '$1 - μικÏá½° μεταγÏαφή',
'recentchanges-label-minor' => 'Ἥδε μικÏá½° μεταγÏαφή á¼ÏƒÏ„ιν',
-'recentchanges-legend-bot' => '$1 - μεταγÏαφὴ ὑπὸ αá½Ï„ομάτου τινός',
'recentchanges-label-bot' => 'Ἥδε ἡ μεταγÏαφὴ á¼Ï„ελέσθη ὑπὸ αá½Ï„ομάτου τινός',
-'recentchanges-legend-unpatrolled' => '$1 - ἀφÏοÏÏητος μεταγÏαφή',
'recentchanges-label-unpatrolled' => 'Ἥδε ἡ μεταγÏαφὴ μὴ á¼Î»ÎµÎ³Î¼Î­Î½Î· á¼ÏƒÏ„ίν',
'rcnote' => "ΚατωτέÏω {{PLURAL:$1|á¼ÏƒÏ„ὶ '''1''' ἀλλαγὴ|εἰσὶν αἱ τελευταῖαι '''$1''' ἀλλαγαὶ}} á¼Î½ {{PLURAL:$2|τῇ τελευταίᾳ ἡμέÏá¾³|ταῖς τελευταίαις '''$2''' ἡμέÏαις}}, ἕως καὶ $5, $4.",
'rcnotefrom' => "Ἰδοῦ αἱ ἀλλαγαὶ á¼Îº τοῦ '''$2''' (ἕως τὸ '''$1''').",
@@ -1217,7 +1201,6 @@ $1",
* Ὄνομα ὑπάÏχοντος á¼€Ïχείου: '''<tt>[[:$2]]</tt>'''
Ἐπίλεξον διάφοÏον ὄνομά τι.",
'file-exists-duplicate' => 'Τὸ á¼€Ïχεῖον á¼ÏƒÏ„ὶ διπλότυπον τοῦ/τῶν ἑξῆς {{PLURAL:$1|á¼€Ïχείου|á¼€Ïχείων}}:',
-'successfulupload' => 'ἘπιφόÏτισις á¼Ï€Î¹Ï„υχής',
'uploadwarning' => 'ΠÏομήνυσις á¼Ï€Î¹Ï†Î¿Ïτίσεως',
'savefile' => 'Σῴζειν á¼€Ïχεῖον',
'uploadedimage' => 'á¼Ï€Î¹Ï€ÎµÏ†Î¿Ïτισμένον "[[$1]]"',
@@ -1236,6 +1219,7 @@ $1",
'upload-description' => 'ΠεÏιγÏαφὴ á¼€Ïχείου',
'upload-options' => 'ἘπιφόÏτωσις á¼Ï€Î¹Î»Î¿Î³á¿¶Î½',
'watchthisupload' => 'ἘφοÏᾶν τόδε τὸ á¼€Ïχεῖον',
+'upload-success-subj' => 'ἘπιφόÏτισις á¼Ï€Î¹Ï„υχής',
'upload-proto-error' => 'Ἐσφαλμένον Ï€Ïωθυπόμνημα',
'upload-proto-error-text' => 'Ἡ ἀπόμακÏος á¼Ï€Î¹Ï†ÏŒÏτισις ἀπαιτεῖ URL ἔχον Ï€Ïόθεμα <code>http://</code> á¼¢ <code>ftp://</code>.',
@@ -1374,7 +1358,6 @@ $1",
'statistics-edits-average' => 'Μέσος á¼€Ïιθμὸς μεταγÏαφῶν ἀνὰ δέλτον',
'statistics-views-total' => 'Συνολικαὶ á¼Ï€Î¹Î¸ÎµÏ‰Ïήσεις',
'statistics-views-peredit' => 'ἘπιθεωÏήσεις ἀνὰ μεταγÏαφή',
-'statistics-jobqueue' => 'ΜάκÏος [http://www.mediawiki.org/wiki/Manual:Job_queue καταλόγου ἀναμένοντων]',
'statistics-users' => 'ἘγγεγÏαμμένοι [[Special:ListUsers|χÏώμενοι]]',
'statistics-users-active' => 'ἘνεÏγοὶ χÏώμενοι <small>(χÏώμενοι οἳ have edited or performed an action διάφοÏον τῆς ποιήσεως λογισμοῦ á¼Î½ Ï„á¿· παÏελθόντι μηνί)</small>',
'statistics-users-active-desc' => 'ΧÏώμενοι δÏαστήÏιοι á¼Î½ Ï„á¿· παÏελθόντι μηνί {{PLURAL:$1|ἡμέÏα|$1 ἡμέÏαι}}',
@@ -1384,7 +1367,7 @@ $1",
'disambiguationspage' => 'Template:σαφήνισις',
'doubleredirects' => 'ἈναδιευθÏνσεις διπλότυπαι',
-'doubleredirectstext' => 'Ἥδε ἡ δέλτος συγκαταλέγει δέλτους Î±á¼µÏ€ÎµÏ á¼€Î½Î±ÎºÎ±Ï„ÎµÏ…Î¸Ïνουσι Ï€Ïὸς ἑτέÏας δέλτους ἀνακατευθÏνσεως. Πᾶσα σειÏά πεÏιέχει συνδέσμους Ï€Ïὸς τὴν τε Ï€Ïώτην καὶ τὴν τε δευτέÏαν δέλτον ἀνακατευθÏνσεως καὶ τὸν τε Ï€ÏοοÏισμὸν τῆς δευτέÏας δέλτου ἀνακατευθÏνσεως á¼¥Ï€ÎµÏ á¼ÏƒÏ„ὶ συνήθως ὠπÏαγματικὸς Ï€ÏοοÏισμὸς τῆς ἀνακατευθÏνσεως ὅπου σὲ ἔδει δεδεγμένος εἶναι. Τὰ <s>διαγεγÏαμμένα</s> λήμματα á¼Ï€Î¹Î»Î­Î»Ï…νται.',
+'doubleredirectstext' => 'Ἥδε ἡ δέλτος συγκαταλέγει δέλτους Î±á¼µÏ€ÎµÏ á¼€Î½Î±ÎºÎ±Ï„ÎµÏ…Î¸Ïνουσι Ï€Ïὸς ἑτέÏας δέλτους ἀνακατευθÏνσεως. Πᾶσα σειÏά πεÏιέχει συνδέσμους Ï€Ïὸς τὴν τε Ï€Ïώτην καὶ τὴν τε δευτέÏαν δέλτον ἀνακατευθÏνσεως καὶ τὸν τε Ï€ÏοοÏισμὸν τῆς δευτέÏας δέλτου ἀνακατευθÏνσεως á¼¥Ï€ÎµÏ á¼ÏƒÏ„ὶ συνήθως ὠπÏαγματικὸς Ï€ÏοοÏισμὸς τῆς ἀνακατευθÏνσεως ὅπου σὲ ἔδει δεδεγμένος εἶναι. Τὰ <del>διαγεγÏαμμένα</del> λήμματα á¼Ï€Î¹Î»Î­Î»Ï…νται.',
'double-redirect-fixed-move' => 'Ἡ [[$1]] κεκίνηται, τὸ νῦν ἀναδιευθÏνεται Ï€Ïὸς τὴν [[$2]]',
'double-redirect-fixer' => 'ΔιοÏθωτὴς ἀναδιευθÏνσεων',
@@ -1570,7 +1553,6 @@ $1",
# Watchlist
'watchlist' => 'Τὰ á¼Ï†Î¿Ïώμενά μου',
'mywatchlist' => 'Τὰ á¼Ï†Î¿Ïώμενά μου',
-'watchlistfor' => "(διὰ '''$1''')",
'nowatchlist' => 'Οá½Î´á½²Î½ τεμάχιον á¼Î½ τῇ á¼Ï†Î¿Ïοδιαλογῇ σου.',
'watchlistanontext' => '$1 Ï€Ïὸ τοῦ á½Ïᾶν á¼¢ τοῦ μεταγÏάφειν τεμάχια τινὰ á¼Î½ τῇ á¼Ï†Î¿Ïοδιαλογῇ σου.',
'watchnologin' => 'Μὴ συνδεδεμένος',
@@ -1848,7 +1830,6 @@ $1',
'ipb-edit-dropdown' => 'ΜεταγÏάφειν Ï„á½°Ï‚ αἰτίας διαγÏαφῆς',
'ipb-unblock-addr' => 'ἈποφÏάττειν $1',
'ipb-unblock' => 'ἈποφÏάττειν ὄνομα χÏωμένου τι á¼¢ IP-διεÏθυνσιν τινά',
-'ipb-blocklist-addr' => 'ὉÏᾶν Ï„á½°Ï‚ ὑπάÏχουσας φÏαγὰς διὰ $1',
'ipb-blocklist' => 'ὉÏᾶν Ï„á½°Ï‚ ὑπάÏχουσας φÏαγὰς',
'ipb-blocklist-contribs' => 'ἜÏανοι τοῦ $1',
'unblockip' => 'ἈποφÏάττειν χÏώμενον',
@@ -2232,10 +2213,10 @@ $1',
'imagemaxsize' => "á½Ïιον μεγέθους εἰκόνος:<br />''(á¼Î½ πεÏιπτώσει δέλτων πεÏιγÏαφῆς á¼€Ïχείων)''",
'thumbsize' => 'Μέγεθος μικÏογÏαφίας:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|δέλτος|δέλτοι}}',
-'file-info' => '(μέγεθος á¼€Ïχείου: $1, Ï„á½Ï€Î¿Ï‚ MIME: $2)',
-'file-info-size' => '($1 × $2 εἰκονοστοιχεῖα, μέγεθος á¼€Ïχείου: $3, Ï„Ïπος MIME: $4)',
+'file-info' => 'μέγεθος á¼€Ïχείου: $1, Ï„á½Ï€Î¿Ï‚ MIME: $2',
+'file-info-size' => '$1 × $2 εἰκονοστοιχεῖα, μέγεθος á¼€Ïχείου: $3, Ï„Ïπος MIME: $4',
'file-nohires' => '<small>Οὠδιατίθεται ὑψηλοτέÏα ἀνάλυσις.</small>',
-'svg-long-desc' => '(á¼€Ïχεῖον SVG, ὀνομαστὶ $1 × $2 εἰκονοστοιχεῖα, μέγεθος á¼€Ïχείου: $3)',
+'svg-long-desc' => 'á¼€Ïχεῖον SVG, ὀνομαστὶ $1 × $2 εἰκονοστοιχεῖα, μέγεθος á¼€Ïχείου: $3',
'show-big-image' => 'ΠλήÏης ἀνάλυσις',
'show-big-image-thumb' => '<small>Τῆσδε τῆς Ï€ÏοθεωÏήσεως μέγεθος: $1 × $2 εἰκονοστοιχεῖα</small>',
'file-info-gif-looped' => 'ἄπειÏος βÏόγχος',
@@ -2608,6 +2589,7 @@ $1',
'table_pager_first' => 'Ἡ δέλτος ἡ Ï€Ïώτη',
'table_pager_last' => 'Δέλτος á¼ÏƒÏ‡Î¬Ï„η',
'table_pager_limit' => 'ΔεικνÏναι $1 στοιχεῖα ἀνἀ δέλτον',
+'table_pager_limit_label' => 'Τεμάχια ἀνὰ δέλτον:',
'table_pager_limit_submit' => 'Ἰέναι',
'table_pager_empty' => 'Οá½Î´á½²Î½ ἀποτέλεσμα',
@@ -2675,6 +2657,7 @@ $1',
'version-hook-subscribedby' => 'ὙπογεγÏαφυῖα ὑπὸ',
'version-version' => '(Ἔκδοσις $1)',
'version-license' => 'Ἄδεια',
+'version-poweredby-others' => 'ἄλλα',
'version-software' => 'Ἐγκατεστημένον λογισμικόν',
'version-software-product' => 'ΠÏοϊόν',
'version-software-version' => 'Ἔκδοσις',
@@ -2741,6 +2724,9 @@ $1',
'tags-edit' => 'μεταγÏαφή',
'tags-hitcount' => '$1 {{PLURAL:$1|μεταβολή|μεταβολαί}}',
+# Special:ComparePages
+'compare-submit' => 'ΣυγκÏίνειν',
+
# Database error messages
'dberr-header' => 'Τόδε τὸ βίκι ἔχει Ï€Ïόβλημα',
'dberr-problems' => 'Συγγνώμην! Ἐμπεφανίκασι τεχνικαὶ δυσχέÏειαι.',
diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php
index c1894426..c6eb7450 100644
--- a/languages/messages/MessagesGsw.php
+++ b/languages/messages/MessagesGsw.php
@@ -14,6 +14,7 @@
* @author MaxSem
* @author Melancholie
* @author MichaelFrey
+ * @author Purodha
* @author Remember the dot
* @author Spacebirdy
* @author Strommops
@@ -131,8 +132,7 @@ $messages = array(
'tog-editsection' => 'Gleicher aazeige für ds Bearbeite vo einzelnen Absätz',
'tog-editsectiononrightclick' => 'Einzelni Absätz ändere mit Rächtsclick (Javascript)',
'tog-showtoc' => 'Inhaltsverzeichnis aazeige bi Artikle mit meh als drei Ãœberschrifte',
-'tog-rememberpassword' => 'Passwort spychere (Cookie)',
-'tog-editwidth' => 'Fäld zum Täkscht yygee mit dr volle Breiti',
+'tog-rememberpassword' => 'Mit däm Browser duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})',
'tog-watchcreations' => 'Sälber gmachti Sytene beobachte',
'tog-watchdefault' => 'Vo dir nöi gmachti oder verändereti Syte beobachte',
'tog-watchmoves' => 'Sälber verschobeni Sytene beobachte',
@@ -273,31 +273,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Abschnitt zuefiege',
-'vector-action-delete' => 'Lesche',
-'vector-action-move' => 'Verschiebe',
-'vector-action-protect' => 'Schitze',
-'vector-action-undelete' => 'Widerhärstelle',
-'vector-action-unprotect' => 'Frej gee',
-'vector-namespace-category' => 'Kategorii',
-'vector-namespace-help' => 'Hilfssyte',
-'vector-namespace-image' => 'Datei',
-'vector-namespace-main' => 'Syte',
-'vector-namespace-media' => 'Mediesyte',
-'vector-namespace-mediawiki' => 'Syschtemnochricht',
-'vector-namespace-project' => 'Projäktsyte',
-'vector-namespace-special' => 'Spezialsyte',
-'vector-namespace-talk' => 'Diskussion',
-'vector-namespace-template' => 'Vorlag',
-'vector-namespace-user' => 'Benutzersyte',
-'vector-view-create' => 'Aalege',
-'vector-view-edit' => 'Bearbeite',
-'vector-view-history' => 'Versionsgschicht',
-'vector-view-view' => 'Läse',
-'vector-view-viewsource' => 'Quälltext aaluege',
-'actions' => 'Aktione',
-'namespaces' => 'Namensryym',
-'variants' => 'Variante',
+'vector-action-addsection' => 'Abschnitt zuefiege',
+'vector-action-delete' => 'Lesche',
+'vector-action-move' => 'Verschiebe',
+'vector-action-protect' => 'Schitze',
+'vector-action-undelete' => 'Widerhärstelle',
+'vector-action-unprotect' => 'Frej gee',
+'vector-simplesearch-preference' => 'Erwytereti Suechvorschleg aktiviere (nume Vector)',
+'vector-view-create' => 'Aalege',
+'vector-view-edit' => 'Bearbeite',
+'vector-view-history' => 'Versionsgschicht',
+'vector-view-view' => 'Läse',
+'vector-view-viewsource' => 'Quälltext aaluege',
+'actions' => 'Aktione',
+'namespaces' => 'Namensryym',
+'variants' => 'Variante',
'errorpagetitle' => 'Fähler',
'returnto' => 'Zruck zur Syte $1.',
@@ -358,6 +348,10 @@ S versueche grad zvyl Benutzer die Syte aazluege.
Bitte wart e paar Minute, voreb Du s nomol versuechsch.
$1',
+'pool-timeout' => '
+Di maximal Wartezyt fir e Lock isch umme',
+'pool-queuefull' => 'D Warteschlang isch voll',
+'pool-errorunknown' => 'Nit bekannte Fähler',
# 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' => 'Ãœber {{GRAMMAR:akkusativ|{{SITENAME}}}}',
@@ -520,7 +514,8 @@ Vergiss nid, dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] aazpasse.',
'yourname' => 'Dyy Benutzername',
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort no mol yygee:',
-'remembermypassword' => 'Passwort spychere',
+'remembermypassword' => 'Uf däm Computer duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})',
+'securelogin-stick-https' => 'Noch em Aamälde mit HTTPS verbunde blybe',
'yourdomainname' => 'Dyyni Domäne',
'externaldberror' => 'Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.',
'login' => 'Aamälde',
@@ -537,6 +532,7 @@ Vergiss nid, dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] aazpasse.',
'gotaccount' => "Du häsch scho a Konto? '''$1'''",
'gotaccountlink' => '»Login fir Benutzer, wu scho aagmäldet sin«',
'createaccountmail' => 'iber E-Mail',
+'createaccountreason' => 'Grund:',
'badretype' => 'Di beidi Passwörter stimme nid zämme.',
'userexists' => 'Dä Benutzername git s scho.
Bitte nimm e andere.',
@@ -557,6 +553,7 @@ Iberprief d Schrybwys, oder mäld Di as [[Special:UserLogin/signup|neje Benutzer
'wrongpasswordempty' => 'Du hesch vergässe dyy Passwort yyzgee. Bitte versuech s nomol.',
'passwordtooshort' => 'Passwerter mien zmindescht {{PLURAL:$1|1 Zeiche|$1 Zeiche}} haa.',
'password-name-match' => 'Dyy Passwort muess sich vu Dyynem Benutzername unterscheide.',
+'password-login-forbidden' => 'D Verwändig vu däm Benutzernamen un Passwort isch verbotte.',
'mailmypassword' => 'Es nöis Passwort schicke',
'passwordremindertitle' => 'Nei Passwort fir {{SITENAME}}',
'passwordremindertext' => 'Ebber mit dr IP-Adress $1 het e nej Passwort fir d Aamäldig bi {{SITENAME}} ($4) aagfordert, wahrschyyns Du sälber.
@@ -600,6 +597,9 @@ Wänn s Benutzerkonto us Versäh aaglait woren isch, chasch die Nochricht ignori
'loginlanguagelabel' => 'Sproch: $1',
'suspicious-userlogout' => 'Dyy Versuech di abzmälde isch abbroche wore, wel s uusgsäh het, wie wänn s vun eme bschedigte Browser oder eme Cacheproxy uus gsändet woren isch.',
+# E-mail sending
+'php-mail-error-unknown' => 'Nit bekannte Fähler mit dr Funktion mail() vu PHP',
+
# Password reset dialog
'resetpass' => 'Passwort fir s Benutzerkonto ändere oder zrucksetze',
'resetpass_announce' => 'Aamäldig mit em Code, wu per Mail zuegschickt woren isch. Zum d Aamäldig abzschliesse, muesch jetz e nej Passwort wehle.',
@@ -651,9 +651,10 @@ Villicht hesch Dyy Passwort scho gänderet oder e nej temporär Passwort aagford
'showlivepreview' => 'Live-Vorschau',
'showdiff' => 'Zeig Änderige',
'anoneditwarning' => "'''Warnig:''' Si sin nit aagmäldet. Ihri IP-Adrässe wird in de Gschicht vo däm Artikel gspeicheret.",
+'anonpreviewwarning' => "''Du bisch nit aagmäldet. Bim Spychere wird Dyy IP-Adräss yydrait in d Versionsgschicht vu däre Syte.''",
'missingsummary' => "'''Obacht:''' Du hesch kei Zämefassig aagee. Wenn du nomol uf Spychere drucksch, wird d Änderung ohni gspychert.",
'missingcommenttext' => 'Bitte gib Dyy Kommentar unte yy.',
-'missingcommentheader' => "'''ACHTIG:''' Du hesch kei Iberschrift im Fäld „Betreff:“ yygee. Wänn nomol uf „Syte spichere“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
+'missingcommentheader' => "'''ACHTIG:''' Du hesch kei Iberschrift im Fäld „Betreff:“ yygee. Wänn nomol uf „{{int:savearticle}}“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
'summary-preview' => 'Vorschou vor Zämefassig:',
'subject-preview' => 'Vorschau vum Betreff:',
'blockedtitle' => 'Benutzer isch gsperrt.',
@@ -730,7 +731,11 @@ As Information chunnt do ne aktuälle Uuszug us em Benutzersperr-Logbuech:',
'''Mozilla:''' ''Strg-Shift-R'', '''IE:''' ''Strg-F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
'userjspreview' => "== Vorschau vu Dyynem Benutzer-Javascript. ==
'''Gib acht:''' Noch em Spychere muesch Dyy Browser aawyse di nej Version z lade: '''Mozilla:''' ''Strg-Shift-R'', '''IE:''' ''Strg-F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
-'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/monobook.css'' statt ''{{ns:user}}:Mustermann/Monobook.css''.",
+'sitecsspreview' => "'''Obacht: Du luegsch nume ne Vorschau vu däm CSS aa.'''
+'''S isch nonig gspycheret wore!'''",
+'sitejspreview' => "'''Obacht: Du luegsch nume ne Vorschau vu däm JavaScript aa.'''
+'''S isch nonig gspycheret wore!'''",
+'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!'''",
@@ -768,7 +773,6 @@ 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!'''",
-'longpagewarning' => '<span style="color:#ff0000">WARNIG:</span> Die Syten isch $1 kB gross; elteri Browser chönnte Problem ha, Sytene z bearbeite wo grösser sy als 32 kB. Überleg bitte, öb du Abschnitt vo dere Syte zu eigete Sytene chönntsch usboue.',
'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.'''",
'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.'''
@@ -940,6 +944,8 @@ $1",
'logdelete-failure' => "'''Logbuchsichtbarkeit cha nit gänderet wäre:'''
$1",
'revdel-restore' => 'Sichtbarkeit ändere',
+'revdel-restore-deleted' => 'gleschti Versione',
+'revdel-restore-visible' => 'sichtbari Versione',
'pagehist' => 'Versionsgeschicht',
'deletedhist' => 'Gleschti Versione',
'revdelete-content' => 'Syteinhalt',
@@ -1006,11 +1012,13 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
# Diffs
'history-title' => 'Versionsgschicht vo „$1“',
'difference' => '(Unterschide zwüsche Versione)',
+'difference-multipage' => '(Unterschid zwische Syte)',
'lineno' => 'Zyle $1:',
'compareselectedversions' => 'Usgwählti Versione verglyche',
'showhideselectedversions' => 'Uusgwehlti Versione zeige/verstecke',
'editundo' => 'rückgängig',
-'diff-multi' => '(Der Versioneverglych zeigt ou d Änderige vo {{PLURAL:$1|1 Version|$1 Versione}} derzwüsche.)',
+'diff-multi' => '({{PLURAL:$1|Ei Version|$1 Versione}} vu {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt, wird|wu derzwische lige, wäre}} nit aazeigt)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ei Version|$1 Versione}} vu meh {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt un nit aazeigt wird|wu derzwische lige un nit aazeigt wäre}})',
# Search results
'searchresults' => 'Suech-Ergäbnis',
@@ -1045,6 +1053,7 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
'searchprofile-everything-tooltip' => 'Gsamte Inhalt dursueche (au d Diskussionssyte)',
'searchprofile-advanced-tooltip' => 'Suech in wytere Namensryym',
'search-result-size' => '$1 ({{PLURAL:$2|1 Wort|$2 Werter}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Kategorii|$1 Kategorie}} ({{PLURAL:$2|1 Unterkategorii|$2 Unterkategorie}}, {{PLURAL:$3|1 Datei|$3 Dateie}})',
'search-result-score' => 'Relevanz: $1 %',
'search-redirect' => '(Wyterleitig $1)',
'search-section' => '(Abschnitt $1)',
@@ -1119,6 +1128,7 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
'contextlines' => 'Zyle pro Träffer',
'contextchars' => 'Zeiche pro Zyle',
'stub-threshold' => 'Gleichformatierig <a href="#" class="stub">vu chleine Syte</a> (in Byte):',
+'stub-threshold-disabled' => 'Deaktiviert',
'recentchangesdays' => 'Aazahl vu dr Täg, wu d Lischt vu dr „Letschte Änderige“ standardmässig soll umfasse:',
'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Tag|Täg}})',
'recentchangescount' => 'Aazahl vu Bearbeitige, wu standardmässig aazeigt wäre:',
@@ -1152,6 +1162,7 @@ Do het s e zuefellig generierte Wärt, wu du chasch bruche: $1',
'prefs-files' => 'Bilder',
'prefs-custom-css' => 'Benutzerdefinierti CSS',
'prefs-custom-js' => 'Benutzerdefiniert JS',
+'prefs-common-css-js' => 'Gmeinsam CSS/JS fir alli Skin:',
'prefs-reset-intro' => 'Du chasch die Syte verwände go d Yystellige uf dr Standard zrucksetze.
Des cha nimmi ruckgängig gmacht wäre.',
'prefs-emailconfirm-label' => 'E-Mail-Bstätigung:',
@@ -1188,9 +1199,15 @@ Des cha nimmi ruckgängig gmacht wäre.',
'prefs-advancedrendering' => 'Erwytereti Optione',
'prefs-advancedsearchoptions' => 'Erwytereti Optione',
'prefs-advancedwatchlist' => 'Erwytereti Optione',
-'prefs-display' => 'Aazeigoptione',
+'prefs-displayrc' => 'Aazeigoptione',
+'prefs-displaysearchoptions' => 'Aazeigoptione',
+'prefs-displaywatchlist' => 'Aazeigoptione',
'prefs-diffs' => 'Versionsverglych',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Siht giltig uus',
+'email-address-validity-invalid' => 'S brucht e giltigi Adräss!',
+
# User rights
'userrights' => 'Benutzerrächtsverwaltig',
'userrights-lookup-user' => 'Verwalt d Gruppezuegherigkeit',
@@ -1273,6 +1290,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
'right-hideuser' => 'E Benutzername sperre un verberge',
'right-ipblock-exempt' => 'Uusnahm vu IP-Sperrine, Autoblock und Rangesperre',
'right-proxyunbannable' => 'Uusnahm vu automatische Proxysperrine',
+'right-unblockself' => 'Sich sälber entsperre',
'right-protect' => 'Syteschutzstatus ändere',
'right-editprotected' => 'Gschitzti Syte bearbeite (ohni Kaskadeschutz)',
'right-editinterface' => 'Benutzerinterface bearbeite',
@@ -1295,7 +1313,6 @@ Des cha nimmi ruckgängig gmacht wäre.',
'right-siteadmin' => 'Datebank sperre un entsperre',
'right-reset-passwords' => 'S Passwort vun eme andere Benutzer zrucksetze',
'right-override-export-depth' => 'Exportier Syte mitsamt dr vergleichte Syte bis zuen ere Tiefi vu 5',
-'right-versiondetail' => 'Detailinformatione iber d Software un d Versione aazeige',
'right-sendemail' => 'E-Mail an anderi Benutzer schicke',
# User rights log
@@ -1346,14 +1363,9 @@ Des cha nimmi ruckgängig gmacht wäre.',
'recentchanges-legend' => 'Optione vu dr Aazeig',
'recentchangestext' => 'Uff däre Syte chönne Si die letschte Änderige in däm Wiki aaluege.',
'recentchanges-feed-description' => 'Di letschten Änderige vo {{SITENAME}} i däm Feed abonniere.',
-'recentchanges-label-legend' => 'Legänd: $1.',
-'recentchanges-legend-newpage' => '$1 - neji Syte',
'recentchanges-label-newpage' => 'Die Bearbeitig het e neji Syte aagleit',
-'recentchanges-legend-minor' => '$1 - chleini Änderig',
'recentchanges-label-minor' => 'Des isch e chleini Änderig',
-'recentchanges-legend-bot' => '$1 - Bott-Bearbeitig',
'recentchanges-label-bot' => 'Die Bearbeitig isch dur e Bott uusgfiert wore',
-'recentchanges-legend-unpatrolled' => '$1 - nit-gsichteti Bearbeitig',
'recentchanges-label-unpatrolled' => 'Die Bearbeitig isch nonig vun eme Fäldhieter aagluegt wore',
'rcnote' => "Azeigt {{PLURAL:$1|wird '''1''' Änderig|wärde di letschte '''$1''' Änderige}} {{PLURAL:$2|vom letschte Tag|i de letschte '''$2''' Täg}} (Stand: $4, $5)",
'rcnotefrom' => 'Des sin d Ändrige syter <b>$2</b> (bis zem <b>$1</b> zeigt).',
@@ -1400,6 +1412,9 @@ Sytene, wo zu dyre [[Special:Watchlist|Beobachtigslischte]] ghöre, erschyne '''
'upload_directory_missing' => 'S Upload-Verzeichnis ($1) fählt un het au dur dr Netzserver nit chenne aagleit wäre.',
'upload_directory_read_only' => 'Dr Netzserver het kei Schryybrächt fir s Upload-Verzeichnis ($1).',
'uploaderror' => 'Fähler bim Uffelade',
+'upload-recreate-warning' => "'''Warnig: E Datei mit däm Name isch scho mol glescht oder verschobe wore.'''
+
+Do het s e Uuszug us em Lesch- un eme Verschiebigslogbuech:",
'uploadtext' => "Verwänd des Formular unte zum Dateie uffelade.
Zum friejer uffegladeni Dateie aazluege oder z sueche lueg uf dr [[Special:FileList|Lischt vu uffegladene Dateie]],
Weli Dateie uffeglade sin, sihsch im [[Special:Log/upload|Logbuech vu dr uffegladene Dateie]], weli glescht sin im [[Special:Log/delete|Lesch-Logbuech]]
@@ -1433,6 +1448,17 @@ Lueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick
'filetype-unwanted-type' => "'''„.$1“''' isch e Dateiformat, wu nit gwinscht isch. Erlaubt {{PLURAL:$3|isch s Dateiformat|sin d Dateiformat}}: $2.",
'filetype-banned-type' => "'''„.$1“''' isch e Dateiformat, wu nit erlaubt isch. Erlaubt {{PLURAL:$3|isch s Dateiformat|sin d Dateiformat}}: $2.",
'filetype-missing' => 'D Datei, wu soll uffeglade wäre, het kei Erwyterig (z. B. „.jpg“).',
+'empty-file' => 'D Datei, wu Du ibertrait hesch, isch läär.',
+'file-too-large' => 'D Datei, wu Du ibertrait hesch, isch z groß.',
+'filename-tooshort' => 'Dr Dateiname isch z churz.',
+'filetype-banned' => 'Dää Dateityp isch gsperrt.',
+'verification-error' => 'Die Datei het d Dateipriefig nit bstande.',
+'hookaborted' => 'D Änderig, wu Du versuecht hesch, isch wäg eme Erwyterigs-Hooks abbroche wore.',
+'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-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.',
'emptyfile' => 'Di uffeglade Datei isch schyyns läär. Dr Grund cha ne Tippfähler im Dateiname syy. Bitte iberprief, eb du die Datei wirkli wit uffelade.',
@@ -1459,13 +1485,14 @@ Wänn Du die Datei einewäg wit uffelade, gang bitte zruck un ändere dr Name.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Die Datei isch e Duplikat vu {{PLURAL:$1|däre Datei|däne $1 Dateie}}:',
'file-deleted-duplicate' => 'E identischi Version vu däre Datei ([[:$1]]) isch friejer scho mol glescht wore. Iberprief s Leschlogbuech, voreb Du si uffeladesch.',
-'successfulupload' => 'Erfolgryych uffegelade',
'uploadwarning' => 'Warnig',
'uploadwarning-text' => 'Bitte tue unte d Dateibsschryybig ändere un versuech s nomol.',
'savefile' => 'Datei spychere',
'uploadedimage' => 'het „[[$1]]“ ufeglade',
'overwroteimage' => 'het e neiji Version vu „[[$1]]“ uffeglade',
'uploaddisabled' => 'Uffelade deaktiviert',
+'copyuploaddisabled' => 'S Uffelade iber URL isch abschalte wore.',
+'uploadfromurl-queued' => 'Dyy Uffeladig isch jetz in dr Warteschlang.',
'uploaddisabledtext' => 'S Uffelade vu Dateie isch deaktiviert.',
'php-uploaddisabledtext' => 'S Uffelade vu PHP-Dateie isch deaktiviert wore. Bitte iberprief d file_uploads-Yystellig.',
'uploadscripted' => 'In däre Datei git s HTML- oder Scriptcode, wu fälschligerwyys vun eme Webbrowser usgfiert chennt were.',
@@ -1485,6 +1512,14 @@ Bitte prief, eb s dr Richtlinie entspricht, wänn Du die Datei no mol uffeladesc
Zue Dyynere Information chunnt do s Lesch-Logbuech mit dr Begrindig fir di friejer Leschig:",
'filename-bad-prefix' => "Dr Dateiname fangt mit '''„$1“''' aa. Des isch isch normalerwyys dr Dateiname, wu vun ere Digitalkamera vorgee wird un d Datei nit bschryybt.
Bitte gib dr Datei e Name, wu dr Inhalt besser bschryybt.",
+'upload-success-subj' => 'Erfolgryych uffegelade',
+'upload-success-msg' => 'Dyyni vu [$2] uffeglade Datei isch jetz do verfiegbar: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Fähler bim Uffelade',
+'upload-failure-msg' => 'S het e Probläm gee mit Dyyre vu [$2] uffegladene Datei:
+
+$1',
+'upload-warning-subj' => 'Warnig bim Uffelade',
+'upload-warning-msg' => 'S het e Probläm gee bim Uffelade vu [$2]. Du chasch zruckgoh zum [[Special:Upload/stash/$1|Ufffeladformular]] go des Probläm lese.',
'upload-proto-error' => 'Falschs Protokoll',
'upload-proto-error-text' => 'D URL muess mit <code>http://</code> oder <code>ftp://</code> aafange.',
@@ -1545,6 +1580,7 @@ Us Sicherheitsgrinde isch img_auth.php deaktiviert.',
'listfiles_search_for' => 'Suech noch Datei:',
'imgfile' => 'Datei',
'listfiles' => 'Lischte vo Bilder',
+'listfiles_thumb' => 'Vorschaubilder',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Name',
'listfiles_user' => 'Benutzer',
@@ -1656,8 +1692,8 @@ Iberprief anderi Gleicher zue dr Vorlage, voreb Du die leschesch.',
'statistics-edits' => 'Sytebearbeitige',
'statistics-edits-average' => 'Bearbeitige pro Syte im Durchschnitt',
'statistics-views-total' => 'Sytenufruef insgsamt',
+'statistics-views-total-desc' => 'Ufruef vu Syte un Spezialsyte, wu s nit git, wäre nit berucksichtigt',
'statistics-views-peredit' => 'Sytenufruef pro Bearbeitig',
-'statistics-jobqueue' => 'Längi vu dr [http://www.mediawiki.org/wiki/Manual:Job_queue Uftragswarteschlang]',
'statistics-users' => 'Regischtrierti [[Special:ListUsers|Benutzer]]',
'statistics-users-active' => 'Aktivi Benutzer',
'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
@@ -1670,7 +1706,7 @@ Iberprief anderi Gleicher zue dr Vorlage, voreb Du die leschesch.',
'doubleredirects' => 'Doppleti Wyterleitige (Redirects)',
'doubleredirectstext' => 'Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige vergleiche.
In jedere Zyylete het s Gleicher zue dr erschte un dr zwote Wyterleitig un s Ziil vu dr zwote Wyterleitig, wu normalerwys di gwinscht Ziilsyten isch. Do sott eigetli scho di erscht Wyterleitig druf zeige.
-<s>Durgstricheni</s> Yytreg sin scho erledigt wore.',
+<del>Durgstricheni</del> Yytreg sin scho erledigt wore.',
'double-redirect-fixed-move' => 'doppleti Wyterleitig ufglest: [[$1]] → [[$2]]',
'double-redirect-fixer' => 'DoubleRedirectBot',
@@ -1693,6 +1729,8 @@ In jedere Zyylete het s Gleicher zue dr erschte un dr zwote Wyterleitig un s Zii
'nmembers' => '$1 {{PLURAL:$1|Syte|Sytene}}',
'nrevisions' => '$1 {{PLURAL:$1|Revision|Revisione}}',
'nviews' => '$1 {{PLURAL:$1|Betrachtig|Betrachtige}}',
+'nimagelinks' => 'Brucht uf $1 {{PLURAL:$1|Syte|Syte}}',
+'ntransclusions' => 'brucht uf $1 {{PLURAL:$1|Syte|Syte}}',
'specialpage-empty' => 'In dr Syte het s no kei aktuälli Yytreg.',
'lonelypages' => 'Verwaisti Sytene',
'lonelypagestext' => 'Die Syte wäre nit yybunde oder s wird nit uf si verwiise in {{SITENAME}}.',
@@ -1848,34 +1886,40 @@ Zuesätzligi Informatione iber einzelni Rächt git s [[{{MediaWiki:Listgrouprigh
'listgrouprights-removegroup-self-all' => 'Cha alli Gruppe us em eigene Benutzerkonto useneh',
# E-mail user
-'mailnologin' => 'Du bisch nid aagmäldet oder hesch keis Mail aaggä',
-'mailnologintext' => 'Du muesch [[Special:UserLogin|aagmäldet syy]] un e bstätigti E-Mail-Adräss in Dyyne [[Special:Preferences|Yystellige]] aagee ha, fir dass epper anderem es E-Mail chasch schicke.',
-'emailuser' => 'Es Mail schrybe',
-'emailpage' => 'E-Mail an Benutzer',
-'emailpagetext' => 'Du chasch im Benutzer mit däm Formular e E-Mail schicke.
+'mailnologin' => 'Du bisch nid aagmäldet oder hesch keis Mail aaggä',
+'mailnologintext' => 'Du muesch [[Special:UserLogin|aagmäldet syy]] un e bstätigti E-Mail-Adräss in Dyyne [[Special:Preferences|Yystellige]] aagee ha, fir dass epper anderem es E-Mail chasch schicke.',
+'emailuser' => 'Es Mail schrybe',
+'emailpage' => 'E-Mail an Benutzer',
+'emailpagetext' => 'Du chasch im Benutzer mit däm Formular e E-Mail schicke.
As Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yytrait, ass dr Benutzer Dir cha Antwort gee.',
-'usermailererror' => 'S Mail-Objekt het e Fähler zruckgee:',
-'defemailsubject' => '{{SITENAME}}-E-Mail',
-'noemailtitle' => 'Kei e-Mail-Adrässe',
-'noemailtext' => 'Dää Benutzer het kei bstätigti E-Mail-Adräss aagee oder wet kei E-Mail vo andere Benutzer.',
-'nowikiemailtitle' => 'Kei E-Mail Versand mögli',
-'nowikiemailtext' => 'De Benutzer möcht kei E-Mails vo andri Benutzer erhalte',
-'email-legend' => 'E-Mail an e andere {{SITENAME}}-Benutzer schicke',
-'emailfrom' => 'Vu:',
-'emailto' => 'An:',
-'emailsubject' => 'Beträff:',
-'emailmessage' => 'Nochricht:',
-'emailsend' => 'Abschicke',
-'emailccme' => 'Schick e Kopii vu dr E-Mail a mii',
-'emailccsubject' => 'Kopii vu Dyynere Nochricht an $1: $2',
-'emailsent' => 'E-Mail furtgschickt',
-'emailsenttext' => 'Dys E-Mail isch verschickt worde.',
-'emailuserfooter' => 'Die E-Mail isch vum {{SITENAME}}-Benutzer „$1“ an „$2“ gschickt wore.',
+'usermailererror' => 'S Mail-Objekt het e Fähler zruckgee:',
+'defemailsubject' => '{{SITENAME}}-E-Mail',
+'usermaildisabled' => 'Benutzer-E-Mail abgstellt',
+'usermaildisabledtext' => 'Du chasch in däm Wiki kei E-Mail an anderi Benutzer schicke',
+'noemailtitle' => 'Kei e-Mail-Adrässe',
+'noemailtext' => 'Dää Benutzer het kei bstätigti E-Mail-Adräss aagee oder wet kei E-Mail vo andere Benutzer.',
+'nowikiemailtitle' => 'Kei E-Mail Versand mögli',
+'nowikiemailtext' => 'De Benutzer möcht kei E-Mails vo andri Benutzer erhalte',
+'email-legend' => 'E-Mail an e andere {{SITENAME}}-Benutzer schicke',
+'emailfrom' => 'Vu:',
+'emailto' => 'An:',
+'emailsubject' => 'Beträff:',
+'emailmessage' => 'Nochricht:',
+'emailsend' => 'Abschicke',
+'emailccme' => 'Schick e Kopii vu dr E-Mail a mii',
+'emailccsubject' => 'Kopii vu Dyynere Nochricht an $1: $2',
+'emailsent' => 'E-Mail furtgschickt',
+'emailsenttext' => 'Dys E-Mail isch verschickt worde.',
+'emailuserfooter' => 'Die E-Mail isch vum {{SITENAME}}-Benutzer „$1“ an „$2“ gschickt wore.',
+
+# User Messenger
+'usermessage-summary' => 'Systemnochricht gspycheret.',
+'usermessage-editor' => 'System-Messenger',
# Watchlist
'watchlist' => 'Beobachtigslischte',
'mywatchlist' => 'Beobachtigslischte',
-'watchlistfor' => "(für '''$1''')",
+'watchlistfor2' => 'Fir $1 $2',
'nowatchlist' => 'Du hesch ke Yträg uf dyre Beobachtigslischte.',
'watchlistanontext' => 'Du muesch Di $1 go Dyyni Beobachtungslischt z säh oder go Yytreg uf ere bearbeite.',
'watchnologin' => 'Du bisch nit aagmäldet',
@@ -1991,7 +2035,10 @@ Di letscht Änderig het [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-se
'revertpage' => 'Ruckgängig gmacht zue dr letschte Änderig vo [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) mit de letzte Version vo [[User:$1|$1]] widerhergstellt',
'revertpage-nouser' => 'Bearbeitige ruckgängig gmacht vu (Benutzername uusegnuu), letschti Fassig vu [[User:$1|$1]] widerhärgstellt',
'rollback-success' => 'D Änderige vu $1 sin ruckgängig gmacht wore un di letscht Version vu $2 isch widerhärgstellt wore.',
-'sessionfailure' => 'S het e Probläm mit em Ibertrage vu Dyyne Benutzerdate gee.
+
+# Edit tokens
+'sessionfailure-title' => 'Sitzigsfähler',
+'sessionfailure' => 'S het e Probläm mit em Ibertrage vu Dyyne Benutzerdate gee.
Die Aktion isch wäge däm us Sicherheitsgrind abbroche wore go ne falschi Zueornig vu Dyyne Änderige zuen eme andere Benutzer verhindere.
Bitte gang zruck, tue d Syte nej lade un versuech s nomol.',
@@ -2119,18 +2166,22 @@ $1',
'month' => 'u Monet:',
'year' => 'bis Jahr:',
-'sp-contributions-newbies' => 'Zeig nume Biträg vo neie Benutzer',
-'sp-contributions-newbies-sub' => 'vo nöji Benützer',
-'sp-contributions-newbies-title' => 'Benutzerbyytreg vu neije Benutzer',
-'sp-contributions-blocklog' => 'Sperrlogbuech',
-'sp-contributions-deleted' => 'gleschti Bytreg',
-'sp-contributions-logs' => 'Logbiecher',
-'sp-contributions-talk' => 'Diskussion',
-'sp-contributions-userrights' => 'Benutzerrächtsverwaltig',
-'sp-contributions-blocked-notice' => 'Dää Benutzer isch zur Zyt gsperrt. Do chunnt dr aktuäll Yytrag us em Benutzersperr-Logbuech:',
-'sp-contributions-search' => 'Suech no Benutzerbiträg',
-'sp-contributions-username' => 'IP-Adress oder Benutzername:',
-'sp-contributions-submit' => 'Sueche',
+'sp-contributions-newbies' => 'Zeig nume Biträg vo neie Benutzer',
+'sp-contributions-newbies-sub' => 'vo nöji Benützer',
+'sp-contributions-newbies-title' => 'Benutzerbyytreg vu neije Benutzer',
+'sp-contributions-blocklog' => 'Sperrlogbuech',
+'sp-contributions-deleted' => 'gleschti Bytreg',
+'sp-contributions-uploads' => 'Uffegladeni Dateie',
+'sp-contributions-logs' => 'Logbiecher',
+'sp-contributions-talk' => 'Diskussion',
+'sp-contributions-userrights' => 'Benutzerrächtsverwaltig',
+'sp-contributions-blocked-notice' => 'Dää Benutzer isch zur Zyt gsperrt. Do chunnt dr aktuäll Yytrag us em Benutzersperr-Logbuech:',
+'sp-contributions-blocked-notice-anon' => 'Die IP-Adräss isch zur Zyt gsperrt.
+Do chunnt dr aktuäll Yytrag us em Benutzersperr-Logbuech:',
+'sp-contributions-search' => 'Suech no Benutzerbiträg',
+'sp-contributions-username' => 'IP-Adress oder Benutzername:',
+'sp-contributions-toponly' => 'Nume aktuälli Versione zeige',
+'sp-contributions-submit' => 'Sueche',
# What links here
'whatlinkshere' => 'Was verwyst do druff?',
@@ -2192,7 +2243,6 @@ Go d Sperri ufhebe lueg d [[Special:IPBlockList|Lisch vu allene aktive Sperrine]
'ipb-edit-dropdown' => 'Sperrgrind bearbeite',
'ipb-unblock-addr' => '„$1“ frejgee',
'ipb-unblock' => 'IP-Adräss/Benutzer frejgee',
-'ipb-blocklist-addr' => 'Aktuälli Sperri fir „$1“ aazeige',
'ipb-blocklist' => 'Alli aktuälle Sperrine aazeige',
'ipb-blocklist-contribs' => 'Benutzerbyytreg fir „$1“',
'unblockip' => 'IP-Adräss frejgee',
@@ -2200,7 +2250,7 @@ Go d Sperri ufhebe lueg d [[Special:IPBlockList|Lisch vu allene aktive Sperrine]
'ipusubmit' => 'Die Sperri useneh',
'unblocked' => '[[User:$1|$1]] isch frejgee wore',
'unblocked-id' => 'Sperr-ID $1 isch freijgee wore',
-'ipblocklist' => 'Liste vo blockierten IP-Adrässen u Benutzernäme',
+'ipblocklist' => 'Gsperrti Benutzer',
'ipblocklist-legend' => 'Suech no eme gsperrte Benutzer',
'ipblocklist-username' => 'Benutzername oder IP-Adräss:',
'ipblocklist-sh-userblocks' => 'Benutzersperrine $1',
@@ -2259,6 +2309,8 @@ Go d Sperri ufhebe lueg d [[Special:IPBlockList|Lisch vu allene aktive Sperrine]
'sorbs_create_account_reason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet. S Aalege vu neije Benutzer isch nit megli.',
'cant-block-while-blocked' => 'Du derfsch kei anderi Benutzer sperre, derwylscht Du sälber gsperrt bisch.',
'cant-see-hidden-user' => 'Dr Benutzer, wu Du versuechsch z sperre, isch scho gsperrt un versteckt wore. Du chasch d Sperri vu däm Benutzer nit säh oder bearbeite, wel du s „hideuser“-Rächt nit hesch.',
+'ipbblocked' => 'Du chasch keini andere Benutzer sperre oder entsperre, wel Du sälber gsperrt bisch',
+'ipbnounblockself' => 'Du derfsch di nit sälber entsperre',
# Developer tools
'lockdb' => 'D Datebank sperre',
@@ -2281,6 +2333,17 @@ Go d Sperri ufhebe lueg d [[Special:IPBlockList|Lisch vu allene aktive Sperrine]
'move-page' => '„$1“ verschiebe',
'move-page-legend' => 'Artikel verschiebe',
'movepagetext' => 'Mit däm Formular chasch du en Artikel verschiebe, u zwar mit syre komplette Versionsgschicht. Der alt Titel leitet zum nöie wyter, aber Links ufen alt Titel blyben unveränderet.',
+'movepagetext-noredirectfixer' => "Mit däm Formular unte chasch e Syte umnänne, indäm Du si mitsamt allene Versione uf e neje Titel verschiebsch.
+Dr alt Titel leitet derno zum neje wyter.
+Stell sicher, ass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|kaputtige Wyterleitige]] iberpriefsch.
+Du bisch derfir verantwortli, ass Link wyter uf s korräkt Ziil verwyyse.
+
+D Syte wird '''nit''' verschobe, wänn s scho ne Syte git mit em vorgsähne Titel, ußer sälli isch läär oder e Wyterletig ohni ne Versionsgschicht.
+Des bedytet, ass Du d Umnännig chasch ruckgängig mache, wänn Du ne Fähler gmacht hesch. Du chasch aber kei Syte iberschryybe.
+
+'''Warnig!'''
+D Verschiebig cha großi un nit erwarteti Folge haa fir hyfig bsuechti Syte.
+Du sottsch wäge däm d Konsequänze verstande haa, voreb Du jetz wytermachsch.",
'movepagetalktext' => "D Diskussionssyte wird mitverschobe, '''ussert:'''
*Du verschiebsch d Syten i nen andere Namensruum, oder
*es git scho ne Diskussionssyte mit däm Namen oder
@@ -2336,6 +2399,7 @@ D Syte „[[:$1]]“ gits scho. Wottsch du si lösche, zume Platz zum verschiebe
'immobile-source-page' => 'Die Syte cha nüt verschobe werde.',
'immobile-target-page' => 'Uf die Ziilsyte cha nüt verschobe werde.',
'imagenocrossnamespace' => 'Dateie chönne nüt ussem {{ns:file}}-Namensruum use verschobe werde',
+'nonfile-cannot-move-to-file' => 'Nit-Dateie chenne nit in dr Datei-Namensruum verschobe wäre',
'imagetypemismatch' => 'D nöii Dateierwiiterig passt nüt zu sym Typ',
'imageinvalidfilename' => 'De Name vo dr Ziildatei isch ungültig',
'fix-double-redirects' => 'Alli Wyterleitige, wo uf de alte Titel zeige, aktualisiere',
@@ -2411,6 +2475,7 @@ Alli Transwiki-Import-Aktione werde im [[Special:Log/import|Import-Logbuech]] pr
'importstart' => 'Importiere Syte …',
'import-revision-count' => '– {{PLURAL:$1|1 Vérsion|$1 Vérsiona}}',
'importnopages' => 'Es isch kei Syte doo wo mer importiere chönnt.',
+'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',
@@ -2503,6 +2568,8 @@ Alli Transwiki-Import-Aktione werde im [[Special:Log/import|Import-Logbuech]] pr
'tooltip-upload' => 'Aafange mit ufelade',
'tooltip-rollback' => 'Mach alli letschti Ändrige uf dere Syte, wo vo däm Benutzer gmacht worre sin, ruggängig.',
'tooltip-undo' => 'Mach numme die eint Ändrig rugggängig, un zeig e Vorschau aa. Doodurch chasch in dr Zammefassig e Begründig aagää.',
+'tooltip-preferences-save' => 'Yystellige spychere',
+'tooltip-summary' => 'Gib e churzi Zämmefassig yy',
# Metadata
'nodublincore' => 'Dublin-Core-RDF-Metadate sin fir dää Server deaktiviert.',
@@ -2595,14 +2662,17 @@ $1',
'imagemaxsize' => "Maximali Gressi vu Bilder :<br />'' (uf Bildbschrybigs-Syte)''",
'thumbsize' => 'Bildvorschou-Gröössi:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|1 Syte|$3 Syte}}',
-'file-info' => '(Dateigressi: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Dateigrößi: $3, MIME-Typ: $4)',
+'file-info' => 'Dateigressi: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Dateigrößi: $3, MIME-Typ: $4',
'file-nohires' => '<small>Kei höcheri Uflösig verfüegbar.</small>',
-'svg-long-desc' => '(SVG-Datei, Basisgrößi: $1 × $2 Pixel, Dateigrößi: $3)',
+'svg-long-desc' => 'SVG-Datei, Basisgrößi: $1 × $2 Pixel, Dateigrößi: $3',
'show-big-image' => 'Originalgrößi',
'show-big-image-thumb' => '<small>Greßi vu däre Vorschau: $1 × $2 Pixel</small>',
'file-info-gif-looped' => 'Ändlosschlupf',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Ramme|Ramme}}',
+'file-info-png-looped' => 'Ändlosschlupf',
+'file-info-png-repeat' => 'het $1 {{PLURAL:$1|Mol|Mol}} gspilt',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Ramme|Ramme}}',
# Special:NewFiles
'newimages' => 'Gallery vo noie Bilder',
@@ -2758,6 +2828,7 @@ Anderi Metadate sy standardmäßig versteckt.
'exif-gpsareainformation' => 'Name vum GPS-Biet',
'exif-gpsdatestamp' => 'GPS-Datum',
'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
+'exif-objectname' => 'Churztitel',
# EXIF attributes
'exif-compression-1' => 'Uukomprimiert',
@@ -2915,24 +2986,24 @@ Anderi Metadate sy standardmäßig versteckt.
'limitall' => 'alli',
# E-mail address confirmation
-'confirmemail' => 'Bstätigung vo Ihre E-Poscht-Adräss',
-'confirmemail_noemail' => 'Du hesch in dyne [[Special:Preferences|persönliche Ystellige]] e kei E-Mail-Adress ygää.',
-'confirmemail_text' => 'Dermit du di erwyterete Mailfunktione chasch bruuche, muesch du die E-Mail-Adrässe, wo du hesch aaggä, la bestätige. Klick ufe Chnopf unte; das schickt dir es Mail. I däm Mail isch e Link; we du däm Link folgsch, de tuesch dadermit bestätige, das die E-Mail-Adrässe dyni isch.',
-'confirmemail_pending' => 'Es isch Dir scho en Code zum Bestätige zuegschiggt worde. Falls du Dyn Konto grad erscht aagleit hesch, muesch villicht noo e weng warte bis d E-Mail ytrifft, bevor du en nöie Code aafordresch.',
-'confirmemail_send' => 'Bestätigungs-Mail verschicke',
-'confirmemail_sent' => 'Es isch dir es Mail zur Adrässbestätigung gschickt worde.',
-'confirmemail_oncreate' => 'En Code isch aa dyni E-Mail-Adress zum bestätige gschiggt worde. Du bruuch de Code zwar nüt zum dich aamälde, er wird aber zum aktiviere vo de E-Mail-Funktione in däm Wiki bruucht.',
-'confirmemail_sendfailed' => '{{SITENAME}} het d E-Mail zum bestätige nüt chönne verschigge.
+'confirmemail' => 'Bstätigung vo Ihre E-Poscht-Adräss',
+'confirmemail_noemail' => 'Du hesch in dyne [[Special:Preferences|persönliche Ystellige]] e kei E-Mail-Adress ygää.',
+'confirmemail_text' => 'Dermit du di erwyterete Mailfunktione chasch bruuche, muesch du die E-Mail-Adrässe, wo du hesch aaggä, la bestätige. Klick ufe Chnopf unte; das schickt dir es Mail. I däm Mail isch e Link; we du däm Link folgsch, de tuesch dadermit bestätige, das die E-Mail-Adrässe dyni isch.',
+'confirmemail_pending' => 'Es isch Dir scho en Code zum Bestätige zuegschiggt worde. Falls du Dyn Konto grad erscht aagleit hesch, muesch villicht noo e weng warte bis d E-Mail ytrifft, bevor du en nöie Code aafordresch.',
+'confirmemail_send' => 'Bestätigungs-Mail verschicke',
+'confirmemail_sent' => 'Es isch dir es Mail zur Adrässbestätigung gschickt worde.',
+'confirmemail_oncreate' => 'En Code isch aa dyni E-Mail-Adress zum bestätige gschiggt worde. Du bruuch de Code zwar nüt zum dich aamälde, er wird aber zum aktiviere vo de E-Mail-Funktione in däm Wiki bruucht.',
+'confirmemail_sendfailed' => '{{SITENAME}} het d E-Mail zum bestätige nüt chönne verschigge.
Bitte überprüef d E-Mail-Adress uf ungültigi Zeiche.
Ruggmäldig vum Mailserver: $1',
-'confirmemail_invalid' => 'De Bestätigscode isch ungültig. Es isch mögli das er abgloffe isch. In däm Fall chasch probiere d Bestätigung z widerhole.',
-'confirmemail_needlogin' => 'Du muesch dich $1, zume dyni E-Mail-Adress bstätige.',
-'confirmemail_success' => 'Dyni E-Mail-Adräss isch bstätiget worde. Du chasch di jitz aamälde.',
-'confirmemail_loggedin' => 'Dyni E-Mail-Adräss isch jitz bstätigt.',
-'confirmemail_error' => 'Öbis isch bim Bestätige vo dynrer E-Mail-Adress schief gloffe.',
-'confirmemail_subject' => '{{SITENAME}} E-Mail-Adrässbstätigung',
-'confirmemail_body' => 'Salü
+'confirmemail_invalid' => 'De Bestätigscode isch ungültig. Es isch mögli das er abgloffe isch. In däm Fall chasch probiere d Bestätigung z widerhole.',
+'confirmemail_needlogin' => 'Du muesch dich $1, zume dyni E-Mail-Adress bstätige.',
+'confirmemail_success' => 'Dyni E-Mail-Adräss isch bstätiget worde. Du chasch di jitz aamälde.',
+'confirmemail_loggedin' => 'Dyni E-Mail-Adräss isch jitz bstätigt.',
+'confirmemail_error' => 'Öbis isch bim Bestätige vo dynrer E-Mail-Adress schief gloffe.',
+'confirmemail_subject' => '{{SITENAME}} E-Mail-Adrässbstätigung',
+'confirmemail_body' => 'Salü
{{SITENAME}}-BenutzerIn «$2» — das bisch allwäg Du — het sech vor IP-Adrässen $1 uus mit deren e-Mail-Adrässe bi {{SITENAME}} aagmäldet.
@@ -2947,8 +3018,36 @@ $5
De Bstätigungs-Code isch gültig bis $4.
Fründlechi Grüess',
-'confirmemail_invalidated' => 'D E-Mail-Adressbestätig isch abbroche worde',
-'invalidateemail' => 'S Bestätige vo dr E-Mail-Adress abbreche',
+'confirmemail_body_changed' => 'Eber mit dr IP-Adräss $1, wahrschyns Du sälber,
+het d E-Mail-Adräss vum Benutzerkonto „$2“ uf die Adräss gänderet uf {{SITENAME}}.
+
+Go bstetige, ass des Benutzerkonto wirkli Dir ghert
+un go d E-Mail-Feature uf {{SITENAME}} reaktiviere, mach des Gleich in Dyym Browser uf:
+
+$3
+
+Wänn des Konto imfall *nit* Dir ghert, gang däm Gleich noo
+go d E-Mail-Adräss-Bstetigung abbräche:
+
+$5
+
+Dää Bstetigungscode isch giltig bis am $4.',
+'confirmemail_body_set' => 'Eber mit dr IP-Adräss $1, wahrschyns Du sälber,
+het d E-Mail-Adräss vum Benutzerkonto „$2“ uf die Adräss gänderet uf {{SITENAME}}.
+
+Go bstetige, ass des Benutzerkonto wirkli Dir ghert
+un go d E-Mail-Feature uf {{SITENAME}} reaktiviere, mach des Gleich in Dyym Browser uf:
+
+$3
+
+Wänn des Konto imfall *nit* Dir ghert, gang däm Gleich noo
+go d E-Mail-Adräss-Bstetigung abbräche:
+
+$5
+
+Dää Bstetigungscode isch giltig bis am $4.',
+'confirmemail_invalidated' => 'D E-Mail-Adressbestätig isch abbroche worde',
+'invalidateemail' => 'S Bestätige vo dr E-Mail-Adress abbreche',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Yybindig isch deaktiviert]',
@@ -2989,6 +3088,7 @@ Bitte bstätig, ass Du die Syte wirkli wit nej aalege.",
'table_pager_first' => 'Erschti Syte',
'table_pager_last' => 'Letschti Syte',
'table_pager_limit' => 'Zeig $1 Yträg pro Syte aa',
+'table_pager_limit_label' => 'Yyträg pro Syte:',
'table_pager_limit_submit' => 'Gang',
'table_pager_empty' => 'Kei Ergebniss',
@@ -3042,6 +3142,7 @@ Du chasch au d [[Special:Watchlist/edit|Standard-Bearbeitigssyte]] bruuche.',
'version-specialpages' => 'Spezialsyte',
'version-parserhooks' => 'Parser-Schnittstelle',
'version-variables' => 'Variable',
+'version-skins' => 'Benutzeroberflechine',
'version-other' => 'Anders',
'version-mediahandlers' => 'Medie-Handler',
'version-hooks' => "Schnittstelle ''(Hook)''",
@@ -3053,6 +3154,13 @@ Du chasch au d [[Special:Watchlist/edit|Standard-Bearbeitigssyte]] bruuche.',
'version-hook-subscribedby' => 'Ufruef vu',
'version-version' => '(Version $1)',
'version-license' => 'Lizänz',
+'version-poweredby-credits' => "Die Websyte nutzt '''[http://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'anderi',
+'version-license-info' => 'MediaWiki isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.
+
+Des Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber OHNI JEDI GARANTI un sogar ohni di impliziert Garanti vun ere MÄRTGÄNGIGKEIT oder EIGNIG FIR E BSTIMMTE ZWÄCK. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.
+
+E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott zämme mit däm Programm verteilt wore syy. Wänn des nit eso isch, cha ne Kopi bi dr Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftli aagforderet oder [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html online gläse] wäre.',
'version-software' => 'Installierti Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
@@ -3122,6 +3230,15 @@ D Yygab muess ohni dr Zuesatz „{{ns:file}}:“ erfolge.',
'tags-edit' => 'bearbeite',
'tags-hitcount' => '$1 {{PLURAL:$1|Änderig|Änderige}}',
+# Special:ComparePages
+'comparepages' => 'Syte verglyyche',
+'compare-selector' => 'Syteversione verglyyche',
+'compare-page1' => 'Syte 1',
+'compare-page2' => 'Syte 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Verglyyche',
+
# Database error messages
'dberr-header' => 'Des Wiki het e Probläm',
'dberr-problems' => 'Excusez! Die Seite het im Momänt tächnischi Schwirigkeite.',
@@ -3138,8 +3255,13 @@ D Yygab muess ohni dr Zuesatz „{{ns:file}}:“ erfolge.',
'htmlform-float-invalid' => 'D Wärt, wu du aagee hesch, isch kei Zahl.',
'htmlform-int-toolow' => 'Dr Wärt, wu aagee hesch, isch unter em Minimum vu $1',
'htmlform-int-toohigh' => 'Dr Wärt, wu aagee hesch, isch iber em Maximum vu $1',
+'htmlform-required' => 'Dää Wert wird brucht',
'htmlform-submit' => 'Ibertrage',
'htmlform-reset' => 'Änderige ruckgängig mache',
'htmlform-selectorother-other' => 'Anderi',
+# SQLite database support
+'sqlite-has-fts' => '$1 mit Unterstitzig vu dr Volltextsuechi',
+'sqlite-no-fts' => '$1 ohni Unterstitzig vu dr Volltextsuechi',
+
);
diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php
index c01231fc..3db79a61 100644
--- a/languages/messages/MessagesGu.php
+++ b/languages/messages/MessagesGu.php
@@ -36,12 +36,12 @@ $namespaceNames = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'દà«àªµàª¿ પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨' ),
- 'BrokenRedirects' => array( 'ખંડિત પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨' ),
+ 'DoubleRedirects' => array( 'દà«àªµàª¿_પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨' ),
+ 'BrokenRedirects' => array( 'ખંડિત_પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨' ),
'Disambiguations' => array( 'અસંદિગà«àª§àª¤àª¾' ),
'Userlogin' => array( 'સભà«àª¯àªªà«àª°àªµà«‡àª¶' ),
'Userlogout' => array( 'સભà«àª¯àª¨àª¿àªµà«‡àª¶' ),
- 'CreateAccount' => array( 'ખાતà«àª‚ ખોલો' ),
+ 'CreateAccount' => array( 'ખાતà«àª‚_ખોલો' ),
'Preferences' => array( 'પસંદ' ),
'Watchlist' => array( 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ' ),
'Recentchanges' => array( 'તાજાફેરફારો' ),
@@ -51,40 +51,40 @@ $specialPageAliases = array(
'Listusers' => array( 'યાદીસભà«àª¯à«‹', 'સભà«àª¯àª¯àª¾àª¦à«€' ),
'Listgrouprights' => array( 'યાદીસમà«àª¹àª…ધિકારો', 'સભà«àª¯àª¸àª®à«àª¹àª…ધિકારો' ),
'Statistics' => array( 'આંકડાકીયમાહિતી' ),
- 'Randompage' => array( 'યાદચà«àª›', 'કોઈ પણ àªàª•' ),
+ 'Randompage' => array( 'યાદચà«àª›', 'કોઈ_પણ_àªàª•' ),
'Lonelypages' => array( 'àªàª•àª¾àª•à«€àªªàª¾àª¨àª¾àª‚', 'અનાથપાનાં' ),
- 'Uncategorizedpages' => array( 'અવરà«àª—િકૃત પાનાં' ),
- 'Uncategorizedcategories' => array( 'અવરà«àª—િકૃત શà«àª°à«‡àª£à«€àª“' ),
- 'Uncategorizedimages' => array( 'અવરà«àª—િકૃત ફાઇલો', 'અવરà«àª—િકૃત ચિતà«àª°à«‹' ),
- 'Uncategorizedtemplates' => array( 'અવરà«àª—િકૃત ઢાંચા' ),
- 'Unusedcategories' => array( 'વણવપરાયેલી શà«àª°à«‡àª£à«€àª“' ),
- 'Unusedimages' => array( 'વણવપરાયેલ ફાઇલો', 'વણવપરાયેલ ચિતà«àª°à«‹' ),
- 'Wantedpages' => array( 'જોઇતા પાનાં', 'તà«àª°à«àªŸàª• કડી' ),
- 'Wantedcategories' => array( 'જોઇતી શà«àª°à«‡àª£à«€àª“' ),
- 'Wantedfiles' => array( 'જોઇતી ફાઇલો' ),
- 'Wantedtemplates' => array( 'જોઇતા ઢાંચા' ),
- 'Mostlinked' => array( 'સૌથીવધૠજોડાયેલાં પાનાં', 'સૌથીવધૠજોડાયેલ' ),
- 'Mostlinkedcategories' => array( 'સૌથીવધà«àªœà«‹àª¡àª¾àª¯à«‡àª²à«€ શà«àª°à«‡àª£à«€', 'સૌથીવધà«àªµàªªàª°àª¾àª¯à«‡àª²à«€ શà«àª°à«‡àª£à«€àª“' ),
- 'Mostlinkedtemplates' => array( 'સૌથીવધૠજોડાયેલાં ઢાંચા', 'સૌથી વધà«àªµàªªàª°àª¾àª¯à«‡àª²àª¾àª‚ ઢાંચા' ),
- 'Mostimages' => array( 'સૌથી વધà«àªœà«‹àª¡àª¾àª¯à«‡àª²à«€ ફાઇલો', 'મહતà«àª¤àª® ફાઇલો', 'મહતà«àª¤àª® ચિતà«àª°à«‹' ),
- 'Mostcategories' => array( 'મોટાભાગની શà«àª°à«‡àª£à«€àª“' ),
- 'Mostrevisions' => array( 'મહતà«àª¤àª® પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨' ),
- 'Fewestrevisions' => array( 'લઘà«àª¤à«àª¤àª® પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨' ),
+ 'Uncategorizedpages' => array( 'અવરà«àª—િકૃત_પાનાં' ),
+ 'Uncategorizedcategories' => array( 'અવરà«àª—િકૃત_શà«àª°à«‡àª£à«€àª“' ),
+ 'Uncategorizedimages' => array( 'અવરà«àª—િકૃત_ફાઇલો', 'અવરà«àª—િકૃત_ચિતà«àª°à«‹' ),
+ 'Uncategorizedtemplates' => array( 'અવરà«àª—િકૃત_ઢાંચા' ),
+ 'Unusedcategories' => array( 'વણવપરાયેલી_શà«àª°à«‡àª£à«€àª“' ),
+ 'Unusedimages' => array( 'વણવપરાયેલ_ફાઇલો', 'વણવપરાયેલ_ચિતà«àª°à«‹' ),
+ 'Wantedpages' => array( 'જોઇતા_પાનાં', 'તà«àª°à«àªŸàª•_કડી' ),
+ 'Wantedcategories' => array( 'જોઇતી_શà«àª°à«‡àª£à«€àª“' ),
+ 'Wantedfiles' => array( 'જોઇતી_ફાઇલો' ),
+ 'Wantedtemplates' => array( 'જોઇતા_ઢાંચા' ),
+ 'Mostlinked' => array( 'સૌથીવધà«_જોડાયેલાં_પાનાં', 'સૌથીવધà«_જોડાયેલ' ),
+ 'Mostlinkedcategories' => array( 'સૌથીવધà«àªœà«‹àª¡àª¾àª¯à«‡àª²à«€_શà«àª°à«‡àª£à«€', 'સૌથીવધà«àªµàªªàª°àª¾àª¯à«‡àª²à«€_શà«àª°à«‡àª£à«€àª“' ),
+ 'Mostlinkedtemplates' => array( 'સૌથીવધà«_જોડાયેલાં_ઢાંચા', 'સૌથી_વધà«àªµàªªàª°àª¾àª¯à«‡àª²àª¾àª‚_ઢાંચા' ),
+ 'Mostimages' => array( 'સૌથી_વધà«àªœà«‹àª¡àª¾àª¯à«‡àª²à«€_ફાઇલો', 'મહતà«àª¤àª®_ફાઇલો', 'મહતà«àª¤àª®_ચિતà«àª°à«‹' ),
+ 'Mostcategories' => array( 'મોટાભાગની_શà«àª°à«‡àª£à«€àª“' ),
+ 'Mostrevisions' => array( 'મહતà«àª¤àª®_પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨' ),
+ 'Fewestrevisions' => array( 'લઘà«àª¤à«àª¤àª®_પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨' ),
'Shortpages' => array( 'ટà«àª‚કાપાનાં' ),
'Longpages' => array( 'લાંબાપાના' ),
'Newpages' => array( 'નવાપાનાં' ),
'Ancientpages' => array( 'પà«àª°àª¾àªšà«€àª¨àªªàª¾àª¨àª¾àª‚' ),
'Deadendpages' => array( 'મૃતાંતપાનાં' ),
'Protectedpages' => array( 'સંરકà«àª·àª¿àª¤àªªàª¾àª¨àª¾àª‚' ),
- 'Protectedtitles' => array( 'સંરકà«àª·àª¿àª¤ શિરà«àª·àª•à«‹' ),
+ 'Protectedtitles' => array( 'સંરકà«àª·àª¿àª¤_શિરà«àª·àª•à«‹' ),
'Allpages' => array( 'બધાંપાનાં' ),
'Prefixindex' => array( 'ઉપસરà«àª—' ),
'Specialpages' => array( 'ખાસપાનાં' ),
'Contributions' => array( 'પà«àª°àª¦àª¾àª¨' ),
'Emailuser' => array( 'સભà«àª¯àª¨à«‡àª‡àª®à«‡àª²' ),
'Confirmemail' => array( 'ઇમેઇલખાતરીકરો' ),
- 'Whatlinkshere' => array( 'અહિં શà«àª‚ જોડાય છે?' ),
- 'Recentchangeslinked' => array( 'તાજેતરનાં ફેરફારો', 'સંલગà«àª¨ ફેરફારો' ),
+ 'Whatlinkshere' => array( 'અહિં_શà«àª‚_જોડાય_છે?' ),
+ 'Recentchangeslinked' => array( 'તાજેતરનાં_ફેરફારો', 'સંલગà«àª¨_ફેરફારો' ),
'Movepage' => array( 'પાનà«àª‚ખસેડો' ),
'Booksources' => array( 'પà«àª¸à«àª¤àª•àª¸à«àª°à«‹àª¤' ),
'Categories' => array( 'શà«àª°à«‡àª£à«€àª“' ),
@@ -92,16 +92,16 @@ $specialPageAliases = array(
'Version' => array( 'સંસà«àª•àª°àª£' ),
'Allmessages' => array( 'બધાંસંદેશા' ),
'Log' => array( 'લૉગ', 'લૉગà«àª¸' ),
- 'Blockip' => array( 'પà«àª°àª¤àª¿àª¬àª‚ધ', 'IP પર પà«àª°àª¤àª¿àª¬àª‚ધ', 'સભà«àª¯àªªàª° પà«àª°àª¤àª¿àª¬àª‚ધ' ),
+ 'Blockip' => array( 'પà«àª°àª¤àª¿àª¬àª‚ધ', 'IP_પર_પà«àª°àª¤àª¿àª¬àª‚ધ', 'સભà«àª¯àªªàª°_પà«àª°àª¤àª¿àª¬àª‚ધ' ),
'Undelete' => array( 'પà«àª¨àªƒàªªà«àª°àª¾àªªà«àª¤' ),
'Import' => array( 'આયાત' ),
'Userrights' => array( 'સભà«àª¯àª¾àª§àª¿àª•àª¾àª°' ),
- 'FileDuplicateSearch' => array( 'ફાઇલપà«àª°àª¤àª¿àª•à«ƒàª¤àª¿ શોધ' ),
- 'Unwatchedpages' => array( 'વણજોયેલા પાનાં' ),
+ 'FileDuplicateSearch' => array( 'ફાઇલપà«àª°àª¤àª¿àª•à«ƒàª¤àª¿_શોધ' ),
+ 'Unwatchedpages' => array( 'વણજોયેલા_પાનાં' ),
'Listredirects' => array( 'પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨àª¯àª¾àª¦à«€' ),
- 'Revisiondelete' => array( 'રદકરેલà«àª‚ સà«àª§àª¾àª°à«‹' ),
- 'Unusedtemplates' => array( 'વણવપરાયેલાં ઢાંચા' ),
- 'Randomredirect' => array( 'યાદચà«àª› પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨' ),
+ 'Revisiondelete' => array( 'રદકરેલà«àª‚_સà«àª§àª¾àª°à«‹' ),
+ 'Unusedtemplates' => array( 'વણવપરાયેલાં_ઢાંચા' ),
+ 'Randomredirect' => array( 'યાદચà«àª›_પà«àª¨àªƒàª®àª¾àª°à«àª—દરà«àª¶àª¨' ),
'Mypage' => array( 'મારૂપાનà«àª‚' ),
'Mytalk' => array( 'મારીચરà«àªšàª¾' ),
'Mycontributions' => array( 'મારૂપà«àª°àª¦àª¾àª¨' ),
@@ -109,14 +109,14 @@ $specialPageAliases = array(
'Listbots' => array( 'યાદીબૉટ' ),
'Popularpages' => array( 'લોકપà«àª°àª¿àª¯àªªàª¾àª¨àª¾àª‚' ),
'Search' => array( 'શોધ' ),
- 'Resetpass' => array( 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલો', 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ પà«àª¨: સà«àª¥àª¾àªªàª¨' ),
+ 'Resetpass' => array( 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾_બદલો', 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾_પà«àª¨:_સà«àª¥àª¾àªªàª¨' ),
'Withoutinterwiki' => array( 'આંતરવિકિવિહીન' ),
- 'MergeHistory' => array( 'વિલિનિકરણ ઈતિહાસ' ),
+ 'MergeHistory' => array( 'વિલિનિકરણ_ઈતિહાસ' ),
'Filepath' => array( 'ફાઇલપથ' ),
- 'Invalidateemail' => array( 'અમાનà«àª¯ ઇ-મેઇલ' ),
- 'Blankpage' => array( 'કોરૂં પાનà«àª‚' ),
- 'LinkSearch' => array( 'કડી શોધ' ),
- 'DeletedContributions' => array( 'હટાવેલાં યોગદાન' ),
+ 'Invalidateemail' => array( 'અમાનà«àª¯_ઇ-મેઇલ' ),
+ 'Blankpage' => array( 'કોરૂં_પાનà«àª‚' ),
+ 'LinkSearch' => array( 'કડી_શોધ' ),
+ 'DeletedContributions' => array( 'હટાવેલાં_યોગદાન' ),
'Tags' => array( 'ટેગ' ),
);
@@ -149,8 +149,7 @@ $messages = array(
'tog-editsection' => 'વિભાગોમાં [ફેરફાર કરો] કડી દà«àªµàª¾àª°àª¾ વિભાગીય ફેરફાર લાગૠકરો.',
'tog-editsectiononrightclick' => 'વિભાગના મથાળાં ને રાઇટ કà«àª²àª¿àª• દà«àªµàª¾àª°àª¾ ફેરફાર કરવાની રીત અપનાવો. (જાવાસà«àª•à«àª°àª¿àªªà«àªŸ જરૂરી)',
'tog-showtoc' => 'અનà«àª•à«àª°àª®àª£àª¿àª•àª¾ દરà«àª¶àª¾àªµà«‹ (૩થી વધૠપેટા-મથાળા વાળા લેખો માટે)',
-'tog-rememberpassword' => 'આ કમà«àªªà«àª¯à«‚ટર પર મારી લોગ-ઇન વિગતો યાદ રાખો',
-'tog-editwidth' => 'આખા પડદા પર જોવા માટે ફેરફાર બોકà«àª¸àª¨à«€ પà«àª°à«€ પહોળાઇ રાખો',
+'tog-rememberpassword' => 'આ કમà«àªªà«àª¯à«‚ટર પર મારી લોગ-ઇન વિગતો યાદ રાખો (મહતà«àª¤àª® $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
'tog-watchcreations' => 'મેં લખેલા નવા લેખો મારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ઉમેરો',
'tog-watchdefault' => 'હà«àª‚ ફેરફાર કરૂં તે પાના મારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ઉમેરો',
'tog-watchmoves' => 'હà«àª‚ જેનà«àª‚ નામ બદલà«àª‚ તે પાના મારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ઉમેરો',
@@ -298,31 +297,21 @@ $messages = array(
'faqpage' => 'Project:વારંવાર પà«àª›àª¾àª¤àª¾ પà«àª°àª¶à«àª¨à«‹',
# Vector skin
-'vector-action-addsection' => 'નવી ચરà«àªšàª¾',
-'vector-action-delete' => 'રદ કરો',
-'vector-action-move' => 'ખસેડો',
-'vector-action-protect' => 'સà«àª°àª•à«àª·àª¿àª¤ કરો',
-'vector-action-undelete' => 'રદ કરેલà«àª‚ પાછà«àª‚ વાળો',
-'vector-action-unprotect' => 'અસà«àª°àª•à«àª·àª¿àª¤',
-'vector-namespace-category' => 'શà«àª°à«‡àª£à«€',
-'vector-namespace-help' => 'મદદ માટેનà«àª‚ પાનà«àª‚',
-'vector-namespace-image' => 'ફાઇલ',
-'vector-namespace-main' => 'પાનà«àª‚',
-'vector-namespace-media' => 'માધà«àª¯àª® પાનà«àª‚',
-'vector-namespace-mediawiki' => 'સંદેશ',
-'vector-namespace-project' => 'યોજના પાનà«àª‚',
-'vector-namespace-special' => 'ખાસ પાનà«àª‚',
-'vector-namespace-talk' => 'ચરà«àªšàª¾',
-'vector-namespace-template' => 'ઢાંચો',
-'vector-namespace-user' => 'સભà«àª¯àª¨à«àª‚ પાનà«àª‚',
-'vector-view-create' => 'બનાવો',
-'vector-view-edit' => 'ફેરફાર કરો',
-'vector-view-history' => 'ઈતિહાસ જà«àª“',
-'vector-view-view' => 'વાંચો',
-'vector-view-viewsource' => 'સà«àª¤à«àª°à«‹àª¤ જà«àª“',
-'actions' => 'કà«àª°àª¿àª¯àª¾àª“',
-'namespaces' => 'નામાવકાશો',
-'variants' => 'ભિનà«àª¨ રૂપો',
+'vector-action-addsection' => 'નવી ચરà«àªšàª¾',
+'vector-action-delete' => 'રદ કરો',
+'vector-action-move' => 'ખસેડો',
+'vector-action-protect' => 'સà«àª°àª•à«àª·àª¿àª¤ કરો',
+'vector-action-undelete' => 'રદ કરેલà«àª‚ પાછà«àª‚ વાળો',
+'vector-action-unprotect' => 'અસà«àª°àª•à«àª·àª¿àª¤',
+'vector-simplesearch-preference' => 'શોધ સંબંધી વિશિષà«àª  સà«àªàª¾àªµàª¨àª¾ પરà«àª¯àª¾àª¯àª¨à«‡ સકà«àª°à«€àª¯ કરો (Vector skin only)',
+'vector-view-create' => 'બનાવો',
+'vector-view-edit' => 'ફેરફાર કરો',
+'vector-view-history' => 'ઈતિહાસ જà«àª“',
+'vector-view-view' => 'વાંચો',
+'vector-view-viewsource' => 'સà«àª¤à«àª°à«‹àª¤ જà«àª“',
+'actions' => 'કà«àª°àª¿àª¯àª¾àª“',
+'namespaces' => 'નામાવકાશો',
+'variants' => 'ભિનà«àª¨ રૂપો',
'errorpagetitle' => 'તà«àª°à«àªŸàª¿',
'returnto' => '$1 પર પાછા જાઓ.',
@@ -385,6 +374,9 @@ $messages = array(
આ પાનà«àª‚ ફરી જોતા પહેલાં કૃપયા થોડો સમય પà«àª°àª¤àª¿àª•à«àª·àª¾ કરો.
$1',
+'pool-timeout' => 'સમય સમાપà«àª¤ - સà«àª¥àª—િતતા પà«àª°àª¤àª¿àª•à«àª·à«€àª¤',
+'pool-queuefull' => '(Pool) કતાર પૂરી ભરેલી',
+'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}} વિષે',
@@ -554,7 +546,8 @@ $2',
'yourname' => 'સભà«àª¯ નામ:',
'yourpassword' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾:',
'yourpasswordagain' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ (પાસવરà«àª¡) ફરી લખો',
-'remembermypassword' => 'આ કોમà«àª¯à«‚ટર પર મારી લૉગ ઇન વિગતો ધà«àª¯àª¾àª¨àª®àª¾àª‚ રાખો',
+'remembermypassword' => 'આ કોમà«àª¯à«‚ટર પર મારી લૉગ ઇન વિગતો ધà«àª¯àª¾àª¨àª®àª¾àª‚ રાખો (વધà«àª®àª¾àª‚ વધૠ$1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
+'securelogin-stick-https' => 'લોગ-ઈન કરà«àª¯àª¾ પછી HTTPS સાથે જોડાયેલા રહો.',
'yourdomainname' => 'તમારૂં ડોમેઇન:',
'externaldberror' => 'પà«àª°àª®àª¾àª£àª­à«‚તતાની તà«àª°à«àªŸà«€ આવી અથવા તમારૂ બહારનૠખાતà«àª‚ અપડેટ કરવાનો અધિકાર તમને નથી.',
'login' => 'પà«àª°àªµà«‡àª¶ કરો (લૉગ ઇન કરીને)',
@@ -571,6 +564,7 @@ $2',
'gotaccount' => "પહેલેથી ખાતà«àª‚ ખોલેલà«àª‚ છે? '''$1'''.",
'gotaccountlink' => 'પà«àª°àªµà«‡àª¶à«‹ (લૉગ ઇન કરો)',
'createaccountmail' => 'ઇ-મેઇલ દà«àªµàª¾àª°àª¾',
+'createaccountreason' => 'કારણ:',
'badretype' => 'તમે દાખલ કરેલ ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ મળતી આવતી નથી.',
'userexists' => 'દાખલ કરેલà«àª‚ સભà«àª¯ નામ વપરાશમાં છે.</br>
કૃપયા અનà«àª¯ નામ પસંદ કરો.',
@@ -601,6 +595,7 @@ $2',
ફરીથી પà«àª°àª¯àª¤à«àª¨ કરો.',
'passwordtooshort' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾àª®àª¾àª‚ ઓછામાં {{PLURAL:$1|ઓછો àªàª• અકà«àª·àª° હોવો |ઓછા $1 અકà«àª·àª° હોવા}} જોઇàª.',
'password-name-match' => 'તમારી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ તમારા સભà«àª¯àª¨àª¾àª® કરતાં અલગ જ હોવી જોઇàª.',
+'password-login-forbidden' => 'આ સભà«àª¯àª¨àª¾àª® અને ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ વાપરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ છે.',
'mailmypassword' => 'પાસવરà«àª¡ ઇ-મેલમાં મોકલો',
'passwordremindertitle' => '{{SITENAME}} માટેની નવી કામચલાઉ ગà«àªªà«àª¤ સંજà«àªžàª¾',
'passwordremindertext' => 'કોઇકે (કદાચ તમે IP àªàª¡à«àª°à«‡àª¸ $1 પરથી) {{SITENAME}} ($4) માટે નવી ગà«àªªà«àª¤ સજà«àªžàª¾ (પાસવરà«àª¡) માટે વિનંતી કરેલ છે.
@@ -643,6 +638,9 @@ Please log in again after you receive it.
'loginlanguagelabel' => 'ભાષા: $1',
'suspicious-userlogout' => 'લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. àªàª® લાગે છે કે તેને તૃટિ પામેલ બà«àª°àª¾àª‰àªàª° કે પà«àª°à«‹àª•à«àª¸à«€ દà«àªµàª¾àª°àª¾ મોકલાઈ હતી.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHPની મેલ() કામગીરીમાં અજà«àªžàª¾àª¤ તà«àª°à«àªŸàª¿',
+
# Password reset dialog
'resetpass' => 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલો',
'resetpass_announce' => 'તમે હંગામી ઇમેઇલ કોડ સાથે લોગ ઇન કરà«àª¯à«àª‚.
@@ -694,9 +692,12 @@ Please log in again after you receive it.
'showdiff' => 'ફેરફારો',
'anoneditwarning' => "'''ચેતવણી:''' તમે તમારા સભà«àª¯ નામથી પà«àª°àªµà«‡àª¶ કરà«àª¯à«‹ નથી.
આ પાનાનાં ઇતિહાસમાં તમારૂં આઇ.પી. (IP) àªàª¡à«àª°à«‡àª¸ નોંધવામાં આવશે.",
+'anonpreviewwarning' => 'તમે સભà«àª¯àª¨àª¾àª®àª¥à«€ પà«àª°àªµà«‡àª¶ કરà«àª¯à«‹ નથી,આ પાનà«àª‚ ઈતિહાસમાંતમારા IP સરનામાના નામે સાચવવામાં આવશે',
'missingsummary' => "'''ચેતવણી:''' તમે ફેરફારનો સારંશ નથી આપà«àª¯à«‹.
જો તમે \"{{int:savearticle}}\" પર કà«àª²à«€àª• કરશો તો તમરો ફેરફારા સારાàªàª¶àª¾àªµàª—રાસાચવવામાં આવશે",
'missingcommenttext' => 'કૃપા કરી નીચે ટીપà«àªªàª£à«€ લખો.',
+'missingcommentheader' => "'''યાદ દેવડાવà«àª‚:'''તમે તમારી ટિપà«àªªàª£à«€ ને શીરà«àª·àª•/મથાળૠઆપà«àª¯à«àª‚ નથી.
+જો તમે \"{{int:savearticle}}\" પર ફરીથી કà«àª²àª¿àª• કરશો, તો તમારા ફેરરારો મથાળા વગર સચવાશે.",
'summary-preview' => 'સારાંશ પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨:',
'subject-preview' => 'વિષય/શિરà«àª·àª• પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨:',
'blockedtitle' => 'સભà«àª¯ પà«àª°àª¤àª¿àª¬àª‚ધિત છે',
@@ -774,6 +775,12 @@ Please log in again after you receive it.
'''હજી સીધà«àª‚ તે સચવાયà«àª‚ નથી!'''",
'userjspreview' => "'''યાદ રહે કે તમે તમારા સભà«àª¯ JavaScript નà«àª‚ અવલોકન કરો છે.'''
'''હજી સીધà«àª‚ તે સચવાયà«àª‚ નથી!'''",
+'sitecsspreview' => "'''યાદ રહે કે તમે તમારા સભà«àª¯ CSS નà«àª‚ અવલોકન કરો છે.'''
+'''હજી સીધà«àª‚ તે સચવાયà«àª‚ નથી!'''",
+'sitejspreview' => "'''યાદ રહે કે તમે તમારા સભà«àª¯ JavaScript નà«àª‚ અવલોકન કરો છે.'''
+'''હજી સીધà«àª‚ તે સચવાયà«àª‚ નથી!'''",
+'userinvalidcssjstitle' => "'''ચેતવણી:''' કોઇ પણ \"\$1\" પટલ નથી.
+સભà«àª¯ રચિત .css અને .js પાના બીજી અંગà«àª°à«‡àªœà«€ બારખડી શીરà«àª·àª• વાપરે છે, દા. ત. {{ns:user}}:Foo/vector.css નહીં કે {{ns:user}}:Foo/Vector.css.",
'updated' => '(સંવરà«àª§à«€àª¤)',
'note' => "'''નોંધ:'''",
'previewnote' => "'''આ ફકà«àª¤ પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨ છે;'''
@@ -815,9 +822,6 @@ Please log in again after you receive it.
જો આપ ના ચાહતા હોવ કે તમારા યોગદાનમાં અનà«àª¯ કોઇ વà«àª¯àª•à«àª¤àª¿ બેધડક પણે ફેરફાર કરે તો અહીં યોગદાન કરશો નહી.<br />
સાથે સાથે તમે અમને àªàª® પણ ખાતરી આપી રહà«àª¯àª¾ છો કે આ લખાણ તમે મૌલિક રીતે લખà«àª¯à«àª‚ છે, અથવાતો પબà«àª²àª¿àª• ડોમેઇન કે તેવા અનà«àª¯ મà«àª•à«àª¤ સà«àª¤à«àª°à«‹àª¤àª®àª¾àª‚થી લીધà«àª‚ છે (વધૠમાહિતી માટે $1 જà«àª“).
'''પરવાનગી વગર પà«àª°àª•àª¾àª¶àª¨àª¾àª§àª¿àª•àª¾àª°àª¥à«€ સà«àª°àª•à«àª·àª¿àª¤ કારà«àª¯ અહીં પà«àª°àª•àª¾àª¶àª¿àª¤ ના કરશો!'''",
-'longpagewarning' => "'''ચેતવણી: આ પાનà«àª‚ $1 કિલોબાઇટà«àª¸ લાંબૠછે;
-કેટલાંક બà«àª°àª¾àª‰àªàª°à«‹àª®àª¾àª‚ લગભગ ૩૨ કિલોબાઇટà«àª¸ જેટલાં કે તેથી મોટાં પાનાઓમાં ફેરફાર કરવામાં મà«àª¶à«àª•à«‡àª²à«€ પડી શકે છે.
-બને તà«àª¯àª¾àª‚ સà«àª§à«€ પાનાને નાનાં વિભાગોમાં વિભાજીત કરી નાંખો.'''",
'longpageerror' => "'''તà«àª°à«àªŸàª¿: તમે લખેલ લેખ $1 કિલોબાઇટ લાંબો છે, જે $2 કિલોબાઇટની મહતà«àª¤àª® સીમા કરતાં વધૠછે.'''
તેને સાચવી ન શકાયા.",
'readonlywarning' => "'''ચેતવણી: માહિતીસંચ સમારકામ માટે બંધ કરાયો છે, તમે તમારા ફેરફારો હમણા સાચવી નહીં શકો.'''
@@ -997,6 +1001,8 @@ $1",
'logdelete-failure' => "'''લોગની દà«àª°àª¶à«àª¯àª¤àª¾ ગોઠવી ન શકાઈ :'''
$1",
'revdel-restore' => 'દૃષà«àªŸàª¿àª•à«àª·àª®àª¤àª¾ બદલો',
+'revdel-restore-deleted' => 'હટાવેલા પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹',
+'revdel-restore-visible' => 'દà«àª°àª¶à«àª¯ પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹',
'pagehist' => 'પાનાનો ઇતિહાસ',
'deletedhist' => 'રદ કરેલનો ઇતિહાસ',
'revdelete-content' => 'સામગà«àª°à«€',
@@ -1065,11 +1071,13 @@ $1",
# Diffs
'history-title' => '"$1"ના ફેરફારોનો ઇતિહાસ',
'difference' => '(પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹ વચà«àªšà«‡àª¨à«‹ તફાવત)',
+'difference-multipage' => '(પાનાઓ વચà«àªšà«‡àª¨à«‹ ફેરફાર)',
'lineno' => 'લીટી $1:',
'compareselectedversions' => 'પસંદ કરેલા સરખાવો',
'showhideselectedversions' => 'પસંદ કરેલા બતાવો / સંતાડો',
'editundo' => 'રદ કરો',
-'diff-multi' => '({{PLURAL:$1|વચગાળાનà«àª‚ àªàª• પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨|વચગાળાનાં $1 પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹}} દરà«àª¶àª¾àªµà«‡àª² નથી.)',
+'diff-multi' => '{{PLURAL:$2|àªàª• સભà«àª¯àª કરેલà«àª‚|$2 સભà«àª¯à«‹àª કરેલા}} ({{PLURAL:$1|વચગાળાનà«àª‚ àªàª• પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ દરà«àª¶àª¾àªµà«àª¯àª‚|વચગાળાનાં $1 પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹ દરà«àª¶àª¾àªµà«àª¯àª¾àª‚}} નથી.)',
+'diff-multi-manyusers' => '{{PLURAL:$2|àªàª• સભà«àª¯àª કરેલà«àª‚|$2 સભà«àª¯à«‹àª કરેલા}} ({{PLURAL:$1|વચગાળાનà«àª‚ àªàª• પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ દરà«àª¶àª¾àªµà«àª¯àª‚|વચગાળાનાં $1 પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹ દરà«àª¶àª¾àªµà«àª¯àª¾àª‚}} નથી.)',
# Search results
'searchresults' => 'પરિણામોમાં શોધો',
@@ -1104,6 +1112,7 @@ $1",
'searchprofile-everything-tooltip' => 'બધે જ શોધો (ચરà«àªšàª¾àª¨àª¾àª‚ પાના સહિત)',
'searchprofile-advanced-tooltip' => 'સà«àª¥àª¾àª¨à«€àª¯ નામસà«àª¥àª³à«‹àª®àª¾àª‚ શોધો:',
'search-result-size' => '$1 ({{PLURAL:$2|1 શબà«àª¦|$2 શબà«àª¦à«‹}})',
+'search-result-category-size' => '{{PLURAL:$1|1 સભà«àª¯|$1 સભà«àª¯à«‹}} ({{PLURAL:$2|1 ઉપ શà«àª°à«‡àª£à«€|$2 ઉપ શà«àª°à«‡àª£à«€àª“}}, {{PLURAL:$3|1 ફાઇલ|$3 ફાઇલો}})',
'search-result-score' => 'પà«àª°àª¸à«àª¤à«àª¤àª¿: $1%',
'search-redirect' => '(અનà«àª¯àª¤à«àª° પà«àª°àª¸à«àª¥àª¾àª¨ $1)',
'search-section' => '(વિભાગ $1)',
@@ -1181,6 +1190,7 @@ $1",
'contextlines' => 'પà«àª°àª¤àª¿ પરિણામ માં હરોળ',
'contextchars' => 'સંદરà«àª­ પà«àª°àª¤àª¿ હરોળ',
'stub-threshold' => '<a href="#" class="stub">stub link</a>નાફોરà«àª®àª®à«‡àªŸàª¿àª‚ગ માટે શરૂઆતિ પગથિયà«àª‚ (બાઈટà«àª¸):',
+'stub-threshold-disabled' => 'નિષà«àª•à«àª°à«€àª¯àª¾àª¨à«àªµà«€àª¤',
'recentchangesdays' => 'તાજા ફેરફારોમાં દેખાડવાના દિવસો',
'recentchangesdays-max' => 'મહતà«àª¤àª® $1 {{PLURAL:$1|દિવસ|દિવસો}}',
'recentchangescount' => 'સમાનà«àª¯ પણે ફલકમાં બતાવવાના ફેરફારોની સંખà«àª¯àª¾',
@@ -1214,6 +1224,7 @@ $1",
'prefs-files' => 'ફાઇલ',
'prefs-custom-css' => 'ખાસ CSS',
'prefs-custom-js' => 'સભà«àª¯ નિરà«àª®àª¿àª¤ JavaScript',
+'prefs-common-css-js' => 'બધા જ ફલક માટે સહીયારી CSS/JavaScript',
'prefs-reset-intro' => 'તમી આ પાનાનો ઉપયોગ કરીને તમારા વિકલà«àªªà«‹ ની ગોઠવણી મૂળના વિકલà«àªªà«‹ સમાન ગોઠવી શકો છો.
આને ઉલટાવી ન શકાય.',
'prefs-emailconfirm-label' => 'ઇ-મેલ પà«àª·à«àªŸà«€',
@@ -1253,8 +1264,15 @@ HTML નાકà«àª‚ ચકાસો',
'prefs-advancedrendering' => 'અદà«àª¯àª¤àª¨ વિકલà«àªªà«‹',
'prefs-advancedsearchoptions' => 'અદà«àª¯àª¤àª¨ વિકલà«àªªà«‹',
'prefs-advancedwatchlist' => 'અદà«àª¯àª¤àª¨ વિકલà«àªªà«‹',
+'prefs-displayrc' => ' પà«àª°àª¦àª°à«àª¶àª¨ વિકલà«àªªà«‹',
+'prefs-displaysearchoptions' => ' પà«àª°àª¦àª°à«àª¶àª¨ વિકલà«àªªà«‹',
+'prefs-displaywatchlist' => ' પà«àª°àª¦àª°à«àª¶àª¨ વિકલà«àªªà«‹',
'prefs-diffs' => 'ફરક',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ઈ-મેલ યોગà«àª¯ લાગે છે.',
+'email-address-validity-invalid' => 'પà«àª°àª®àª¾àª£àª­à«‚ત શૈલિમાં ઈ-મેલ àªàª¡à«àª°à«‡àª¸ લખો',
+
# User rights
'userrights' => 'સભà«àª¯ હકà«àª• પà«àª°àª¬àª‚ધન',
'userrights-lookup-user' => 'સભà«àª¯ સમà«àª¹à«‹ નà«àª‚ પà«àª°àª¬àª‚ધન કરો',
@@ -1338,6 +1356,7 @@ HTML નાકà«àª‚ ચકાસો',
'right-hideuser' => 'સભà«àª¯àª¨àª¾àª® પર પà«àª°àª¤àª¿àª¬àª‚ધ મૂકો જેથી તે લોકોને ન દેખાય.',
'right-ipblock-exempt' => 'IP દà«àªµàª¾àª°àª¾, સà«àªµàª¯àª‚ ચાલિત રીતે અને સમૂહ રોકને અવગનીને આગળ વધો',
'right-proxyunbannable' => 'અવેજીના અવયંચાલિત ખંડોને ટાળો',
+'right-unblockself' => 'તેમને જાતે અપà«àª°àª¤àª¿àª¬àª‚ધિત થવા દો',
'right-protect' => 'સંરકà«àª·àª£ સà«àª¤àª° બદલો અને સંરકà«àª·à«€àª¤ પાનામાં ફેરફાર કરો.',
'right-editprotected' => 'સંરકà«àª·àª¿àª¤ પાનામાં ફેરફાર કરો (પગથિયામય સà«àª°àª•à«àª·àª¾ વગર)',
'right-editinterface' => 'સભà«àª¯ સંભાષણ પટલમાં ફેરફાર કરો',
@@ -1459,6 +1478,8 @@ HTML નાકà«àª‚ ચકાસો',
'upload_directory_missing' => 'ફાઇલ ચડાવવાની ડાયરેકà«àªŸàª°à«€ ($1) ગાયબ છે અને વેબસરà«àªµàª° દà«àªµàª¾àª°àª¾ તેની રચના ન કરી શકાઇ.',
'upload_directory_read_only' => 'ચઢાવેલી ડાયરેકà«àªŸàª°à«€ ($1) ઠવેબ બà«àª°àª¾àª‰àªàª° દà«àªµàª¾àª°àª¾ લેખન યોગà«àª¯ નથી.',
'uploaderror' => 'ફાઇલ ચઢાવમાં ચૂક',
+'upload-recreate-warning' => "'''ચેતવણી: આ નામની àªàª• ફાઇલ ભૂંસાડી કે હટાવી દેવાઇ છે. '''
+તમારા સંદરà«àª­ માટે પાના ભૂંસાવવાનો અને હટાવવાની સૂચિ અહીં આપેલ છે.:",
'uploadtext' => "ફાઈલ ચડાવવા માટે નીચેનà«àª‚ ફોરà«àª® વાપરો.
પહેલા ચડાવાયેલી ફાઇલ અહીં જà«àª“ કે શોધો [[Special:FileList|list of uploaded files]], (પà«àª¨àªƒ) ચડાવેલી ફાઇલ પણ લોગમાં અહીં દરà«àª¶àª¾àªµàª¾àª‡ છે. [[Special:Log/upload|upload log]], હટાવાયેલી ફાઇલોની યાદિ [[Special:Log/delete|deletion log]].
@@ -1491,6 +1512,17 @@ HTML નાકà«àª‚ ચકાસો',
'filetype-unwanted-type' => "'''\".\$1\"''' ઠàªàª• બિન જરૂરી ફાઇલ પà«àª°àª•àª¾àª° છે.
ઇચà«àª›àª¨à«€àª¯ {{PLURAL:\$3|ફાઇલ પà«àª°àª•àª¾àª°|ફાઇલ પà«àª°àª•àª¾àª°à«‹}} \$2 છે.",
'filetype-missing' => 'ફાઇલને કોઇ વિસà«àª¤àª¾àª° શબà«àª¦ નથી (જેમકે ".jpg").',
+'empty-file' => 'તમે ચડાવેલી ફાઈલ ખાલી છે',
+'file-too-large' => 'તમે ચડાવેલી ફાઈલ ખૂબ મોટી છે',
+'filename-tooshort' => 'ફાઇલ નામ ખૂબ ટૂંકà«àª‚ છે',
+'filetype-banned' => 'આ પà«àª°àª•àª¾àª°àª¨à«€ ફાઈલ પà«àª°àª¤àª¿àª¬àª‚ધિત છે.',
+'verification-error' => 'આ ફાઇલ ઠચકાસણી કસોટી પાર ન કરી',
+'hookaborted' => 'તમે કરેલ ફેરફારો વિસà«àª¤àª¾àª°à«€àª¤ ખૂંટા દà«àªµàª¾àª°àª¾ રોકી દેવાયા.',
+'illegal-filename' => 'ફાઈલા નામને પરવાનગી નથી',
+'overwrite' => 'વિહરમાન ફાઇલ પર પà«àª¨àª°à«àª²à«‡àª–ન કરવાની પરવાનગી નથી',
+'unknown-error' => 'અજà«àªžàª¾àª¤ ચૂક થઈ',
+'tmp-create-error' => 'હંગામી ફાઇલ ન બનાવી શકાઇ',
+'tmp-write-error' => 'હંગામી ફાઇલ લખવામાં ખામી',
'large-file' => 'ફાઇલ $1 કરતાં મોટી ન હોય તે ઇચà«àª›àª¨à«€àª¯ છે.
આ ફાઇલનà«àª‚ કદ $2 છે.',
'largefileserver' => 'સરવરે પરવાનગી આપેલ કદ કરતાં આ ફાઇલ મોટી છે.',
@@ -1528,6 +1560,8 @@ HTML નાકà«àª‚ ચકાસો',
'uploadedimage' => '"[[$1]]" ચઢાવà«àª¯à«àª‚',
'overwroteimage' => ' "[[$1]]" ની નવી આવૃતà«àª¤àª¿ ચઢાવો.',
'uploaddisabled' => 'ફાઇલ ચઢાવ પà«àª°àª¤àª¿àª¬àª‚ધિત',
+'copyuploaddisabled' => 'URL દà«àªµàª¾àª° ફાઇલ ચઢાવ પà«àª°àª¤àª¿àª¬àª‚ધિત',
+'uploadfromurl-queued' => 'તમારી ચઢાવેલી ફાઇલ કતારમાં ઉમેરાઇ છે.',
'uploaddisabledtext' => 'ફાઇલ ચઢાવવà«àª‚ નિષà«àª•à«àª°à«€àª¯ બનાવà«àª¯à«àª‚ છે',
'php-uploaddisabledtext' => 'PHPમાં ફાઇલ અપલોડ નિષà«àª•à«àª°à«€àª¯ કરી દેવાયો છે.
ફાઇલ ચડાવવાના વિકલà«àªª ફરી તપાસો.',
@@ -1550,6 +1584,14 @@ HTML નાકà«àª‚ ચકાસો',
પાનà«àª‚ હટાવà«àª¯àª¾àª‚ પહેલાનાં બધા ફેરફારોની સૂચિ તમારી અનà«àª•à«‚ળતા માટે અહીં આપી છે:",
'filename-bad-prefix' => "તમે ચડાવેલી ફાઇલનà«àª‚ નામ '''\"\$1\"''' થી શરૂ થાય છે, જેમાં ફાઇલની માહિતી વિષે વરà«àª£àª¨ નથી. લાગે ચે તે ડિજીટલ કેમેરા દà«àªµàª¾àª°àª¾ સામાનà«àª¯ રીતે સà«àªµàª¯àª‚ચાલિત રીતે અપાતà«àª‚ છબીનà«àª‚ નામ છે.
કૃપયા તમે ચડાવેલી ફાઇલ માટે àªàª• વરà«àª£àª¨àª¾àª¤à«àª®àª• નામ આપો.",
+'upload-success-subj' => 'ફાઇલ ચડાવ સફળ',
+'upload-success-msg' => '[$2]થી તમારà«àª ફાઇલ ચડાવ સફળ રહà«àª¯à«‹. તે અહીઠઉપલબà«àª§ છે. : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'ફાઇલ ચઢાવ મà«àª¶à«àª•à«‡àª²à«€',
+'upload-failure-msg' => 'તમરા ફાઇલ ચડાવવામાં [$2]થી અડચણ થઇ:
+
+$1',
+'upload-warning-subj' => 'ફાઇલ ચઢાવ ચેતવણી',
+'upload-warning-msg' => '[$2]થી કરાયેલ તમારા ચડાવા માં તકલીફ હતી. તમે [[Special:Upload/stash/$1|upload form]] પર ફરી જઇ આ તà«àª°à«àªŸàª¿ હટાવી ફરી ફાઇલ ચડાવો',
'upload-proto-error' => 'ખોટો શિષà«àªŸàª¾àªšàª¾àª°',
'upload-proto-error-text' => 'દà«àª°àª¨àª¾ ફાઇલ ચઢાવના URL ની શરૂઆત <code>http://</code> કે <code>ftp://</code>થી થવી જોઇàª.',
@@ -1615,6 +1657,7 @@ HTML નાકà«àª‚ ચકાસો',
'listfiles_search_for' => 'મિડિયા નામ શોધો:',
'imgfile' => 'ફાઇલ',
'listfiles' => 'ફાઇલોની યાદી',
+'listfiles_thumb' => 'લઘà«àªšàª¿àª¤à«àª°',
'listfiles_date' => 'તારીખ',
'listfiles_name' => 'નામ',
'listfiles_user' => 'સભà«àª¯',
@@ -1731,6 +1774,7 @@ HTML નાકà«àª‚ ચકાસો',
'statistics-edits' => '{{SITENAME}} શરૂ થયા પછી ફેરફાર થયેલ પાના',
'statistics-edits-average' => 'દર પાના પર સરાસરી ફેરફારો',
'statistics-views-total' => 'સરવાળો',
+'statistics-views-total-desc' => 'અવિહરમાન પાના અને ખાસ પાના આમા શામિલ નથી.',
'statistics-views-peredit' => 'પà«àª°àª¤àª¿ ફેરફાર ના દેખાવ',
'statistics-users' => 'નોંધણી થયેલ [[Special:ListUsers|users]]',
'statistics-users-active' => 'સકà«àª°à«€àª¯ સભà«àª¯à«‹',
@@ -1744,6 +1788,8 @@ HTML નાકà«àª‚ ચકાસો',
આ પાનાને સંદિગà«àª§ વાકà«àª¯à«‹ વાળા પાના તà«àª¯àª¾àª°à«‡ કહી શકાય જà«àª¯àª¾àª°à«‡ તે [[MediaWiki:Disambiguationspage]] નામના ઢાંચા સાથે જોડાયેલા હોય.",
'doubleredirects' => 'બનણà«àª‚ દિશાનિરà«àª¦à«‡àª¶àª¿àª¤',
+'doubleredirectstext' => 'આ પાનà«àª‚ દિશા નિરà«àª¦à«‡àª¶àª¿àª¤ પાના પર થયેલા દિશા નિરà«àª¦à«‡àª¶àª¿àª¤ પાનાની યાદિ બતાવે છે.
+દરેક લિટીમાં પાના પà«àª°àª¥àª® અને દà«àªµà«€àª¤à«€àª¯ દિશા નિરà«àª¦à«‡àª¶àª¨ કà«àª¡à«€ બતાવે છે, તે સિવાય દà«àªµà«€àª¤à«€àª¯ દિશા નિરà«àª¦à«‡àª¶àª¨àª¨à«àª‚ લકà«àª·à«àª¯ પણ બતાવે છે કે મોટે ભાગે મૂળ પાનà«àª‚ હોઇ શકે છેૢ જેના પર પà«àª°àª¥àª® દિશા નિરà«àª¦à«‡àª¶àª¨ લકà«àª·àª¿àª¤ છે. <del>Crossed out</del> લિટીઓ નો ઉતà«àª¤àª° મેળવાયો છે.',
'double-redirect-fixed-move' => '[[$1]] હટાવી દેવાયà«àª‚ છે.
હવે તે [[$2]] પરાનિરà«àª¦à«‡àª¶à«€àª¤ છે.',
'double-redirect-fixer' => 'નિરà«àª¦à«‡àª¶àª¨ સમારનાર',
@@ -1767,6 +1813,8 @@ HTML નાકà«àª‚ ચકાસો',
'nmembers' => '$1 {{PLURAL:$1|સદસà«àª¯|સદસà«àª¯à«‹}}',
'nrevisions' => '$1 {{PLURAL:$1|પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨|પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹}}',
'nviews' => '$1 {{PLURAL:$1|દેખાવ|દેખાવો}}',
+'nimagelinks' => '$1 {{PLURAL:$1|પાના|પાનાઓ}} પર વપરાયો',
+'ntransclusions' => '$1 {{PLURAL:$1|પાના|પાનાઓ}} પર વપરાયો',
'specialpage-empty' => 'આ પાનà«àª‚ ખાલી છે.',
'lonelypages' => 'અનાથ પાના',
'lonelypagestext' => 'નીચે બતાવેલા પાના {{SITENAME}} પર કે થી કડી દà«àªµàª¾àª°àª¾ જોડાયેલ નથી',
@@ -1925,34 +1973,40 @@ HTML નાકà«àª‚ ચકાસો',
'listgrouprights-removegroup-self-all' => 'બધા જૂથને તેમના પોતાના ખાતામાંથી હટાવો',
# E-mail user
-'mailnologin' => 'મેળવનારનà«àª‚ સરનામà«àª‚ નથી',
-'mailnologintext' => 'અનà«àª¯ સભà«àª¯àª¨à«‡ ઇ-મેલ મોકલવા માટે તમે [[Special:UserLogin|logged in]] પà«àª°àªµà«‡àª¶ કરેલ હોવો જોઈઠઅને તમારા[[Special:Preferences|preferences]] વિકલà«àªªà«‹àª®àª¾àª‚ તમારા ઈ-મેલ સરનામાની પà«àª·à«àªŸàª¿ થયેલી હોવી જોઈàª',
-'emailuser' => 'સભà«àª¯àª¨à«‡ ઇ-મેલ કરો',
-'emailpage' => 'ઈ-મેલ સભà«àª¯',
-'emailpagetext' => 'તમે નીચે દરà«àª¶àª¾àªµà«‡àª² ફોરà«àª® વાપરી ઇ-મેલ મોકલી શકો છો.
+'mailnologin' => 'મેળવનારનà«àª‚ સરનામà«àª‚ નથી',
+'mailnologintext' => 'અનà«àª¯ સભà«àª¯àª¨à«‡ ઇ-મેલ મોકલવા માટે તમે [[Special:UserLogin|logged in]] પà«àª°àªµà«‡àª¶ કરેલ હોવો જોઈઠઅને તમારા[[Special:Preferences|preferences]] વિકલà«àªªà«‹àª®àª¾àª‚ તમારા ઈ-મેલ સરનામાની પà«àª·à«àªŸàª¿ થયેલી હોવી જોઈàª',
+'emailuser' => 'સભà«àª¯àª¨à«‡ ઇ-મેલ કરો',
+'emailpage' => 'ઈ-મેલ સભà«àª¯',
+'emailpagetext' => 'તમે નીચે દરà«àª¶àª¾àªµà«‡àª² ફોરà«àª® વાપરી ઇ-મેલ મોકલી શકો છો.
તમે તમારી માહિતીમાં [[Special:Preferences|your user preferences]] જે ઇ-મેલ લખà«àª¯à«‹ હશે તે દà«àªµàª¾àª°àª¾ ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.',
-'usermailererror' => 'મેલ વસà«àª¤à« પાઠવવામાં તà«àª°à«àªŸàª¿',
-'defemailsubject' => '{{SITENAME}} ઈ-મેલ',
-'noemailtitle' => 'ઈ-મેલ àªàª¡à«àª°à«‡àª¸ નથી',
-'noemailtext' => 'આ સભà«àª¯àª વૈધ ઇ-મેલ સરનામà«àª‚ નથી આપà«àª¯à«àª‚.',
-'nowikiemailtitle' => 'કોઇ પણ ઇ મેલની રજા નથી',
-'nowikiemailtext' => 'અનà«àª¯ સભà«àª¯à«‹ ઇ-મેલ ન મોકલે તેવી આ સભà«àª¯àª¨à«€ પસંદગી છે.',
-'email-legend' => 'અનà«àª¯ {{SITENAME}} સભà«àª¯ નેઈ-મેલ મોકલો',
-'emailfrom' => 'પà«àª°à«‡àª·àª•:',
-'emailto' => 'પà«àª°àª¤àª¿:',
-'emailsubject' => 'વિષય:',
-'emailmessage' => 'સંદેશો:',
-'emailsend' => 'મોકલો',
-'emailccme' => 'મારા ઈ-મેલની પà«àª°àª¤ મને મોકલો',
-'emailccsubject' => 'તમારો સંદેશની પà«àª°àª¤ $1: $2 માàª',
-'emailsent' => 'ઈ-મેલ મોકલી દેવાયો',
-'emailsenttext' => 'તમારો ઈ-મેલ મોકલી દેવાયો છે',
-'emailuserfooter' => 'આ ઈ-મેલ $1 દà«àªµàª¾àª°àª¾ $2ને "E-mail user" સૂતà«àª° {{SITENAME}} પર મોકલાવાયà«àª‚ છે.',
+'usermailererror' => 'મેલ વસà«àª¤à« પાઠવવામાં તà«àª°à«àªŸàª¿',
+'defemailsubject' => '{{SITENAME}} ઈ-મેલ',
+'usermaildisabled' => 'સભà«àª¯àª¨à«‹ ઈ-મેલ નિષà«àª•à«àª°àª¿àª¯ કરાયો',
+'usermaildisabledtext' => 'તમે આ વિકિ પર અનà«àª¯ સભà«àª¯à«‹àª¨à«‡ ઇ-મેલ મોકલી ન શકો',
+'noemailtitle' => 'ઈ-મેલ àªàª¡à«àª°à«‡àª¸ નથી',
+'noemailtext' => 'આ સભà«àª¯àª વૈધ ઇ-મેલ સરનામà«àª‚ નથી આપà«àª¯à«àª‚.',
+'nowikiemailtitle' => 'કોઇ પણ ઇ મેલની રજા નથી',
+'nowikiemailtext' => 'અનà«àª¯ સભà«àª¯à«‹ ઇ-મેલ ન મોકલે તેવી આ સભà«àª¯àª¨à«€ પસંદગી છે.',
+'email-legend' => 'અનà«àª¯ {{SITENAME}} સભà«àª¯ નેઈ-મેલ મોકલો',
+'emailfrom' => 'પà«àª°à«‡àª·àª•:',
+'emailto' => 'પà«àª°àª¤àª¿:',
+'emailsubject' => 'વિષય:',
+'emailmessage' => 'સંદેશો:',
+'emailsend' => 'મોકલો',
+'emailccme' => 'મારા ઈ-મેલની પà«àª°àª¤ મને મોકલો',
+'emailccsubject' => 'તમારો સંદેશની પà«àª°àª¤ $1: $2 માàª',
+'emailsent' => 'ઈ-મેલ મોકલી દેવાયો',
+'emailsenttext' => 'તમારો ઈ-મેલ મોકલી દેવાયો છે',
+'emailuserfooter' => 'આ ઈ-મેલ $1 દà«àªµàª¾àª°àª¾ $2ને "E-mail user" સૂતà«àª° {{SITENAME}} પર મોકલાવાયà«àª‚ છે.',
+
+# User Messenger
+'usermessage-summary' => 'પà«àª°àª£àª¾àª²à«€ સંદેશા મૂકાયો',
+'usermessage-editor' => 'તંતà«àª° સંદેશાઓ',
# Watchlist
'watchlist' => 'મારી ધà«àª¯àª¾àª¨àª¸à«‚ચી',
'mywatchlist' => 'મારી ધà«àª¯àª¾àª¨àª¸à«‚ચિ',
-'watchlistfor' => "('''$1'''ને માટે)",
+'watchlistfor2' => 'ધà«àª¯àª¾àª¨ સૂચિ $1 $2',
'nowatchlist' => 'તમારી ધà«àª¯àª¾àª¨ સૂચિ ખાલી છે',
'watchlistanontext' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિની વસà«àª¤à«àª“ જોવા અને ફેરફાર કરવા $1 કરો',
'watchnologin' => 'પà«àª°àªµà«‡àª¶ કરેલ નથી',
@@ -2076,7 +2130,10 @@ Deleting it may disrupt database operations of {{SITENAME}};',
'revertpage-nouser' => ' (સભà«àª¯ નામ હટાવà«àª¯à«àª‚) દà«àªµàª¾àª°àª¾ થયેલ ફેરફારને [[User:$1|$1]]ના દà«àªµàª¾àª°àª¾ થયેલ છેલà«àª²àª¾ પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ પર પાછા લઇ જવાયા',
'rollback-success' => '$1 દà«àªµàª¾àª°àª¾ થયેલા ફેરફારો ઉલટાવાયા
તેને $2 દà«àªµàª¾àª°àª¾ થયેલ સંપાદન સà«àª§à«€ લઇ જવાયà«àª‚',
-'sessionfailure' => 'તમારા પà«àª°àªµà«‡àª¶ સતà«àª°àª®àª¾àª‚ કઈંક તà«àª°à«àªŸàª¿ છે ;
+
+# Edit tokens
+'sessionfailure-title' => 'સતà«àª° નિષà«àª«àª³',
+'sessionfailure' => 'તમારા પà«àª°àªµà«‡àª¶ સતà«àª°àª®àª¾àª‚ કઈંક તà«àª°à«àªŸàª¿ છે ;
સતà«àª° અપહરણ ની શકà«àª¯àª¤àª¾ ન રહે તેમાટે આ સતà«àª° રદà«àª¦à« કરવામાં આવે છે.
પાછળ જોયેલા પાને પાછા જાઓ , અને ફરી પà«àª°àª¯àª¤à«àª¨ કરો .',
@@ -2212,19 +2269,23 @@ Clicking '''''{{int:undeletereset}}''''' will clear the comment field and all ch
'month' => ':મહિનાથી (અને પહેલાનાં)',
'year' => ':વરà«àª·àª¥à«€ (અને પહેલાનાં)',
-'sp-contributions-newbies' => 'માતà«àª° નવા ખà«àª²à«‡àª²àª¾àª‚ ખાતાઓનà«àª‚ યોગદાન બતાવો',
-'sp-contributions-newbies-sub' => 'નવા ખાતાઓ માટે',
-'sp-contributions-newbies-title' => 'નવા ખાતાના સભà«àª¯à«‹àª¨à«àª‚ યોગદાન',
-'sp-contributions-blocklog' => 'પà«àª°àª¤àª¿àª¬àª‚ધ સૂચિ',
-'sp-contributions-deleted' => 'સભà«àª¯àª¨à«àª‚ ભૂંસેલà«àª‚ યોગદાન',
-'sp-contributions-logs' => 'લૉગ',
-'sp-contributions-talk' => 'યોગદાનકરà«àª¤àª¾àª¨à«€ ચરà«àªšàª¾',
-'sp-contributions-userrights' => 'સભà«àª¯ હકà«àª• પà«àª°àª¬àª‚ધન',
-'sp-contributions-blocked-notice' => 'આ સભà«àª¯ પà«àª°àª¤àª¿àª¬àª‚ધિત છે
+'sp-contributions-newbies' => 'માતà«àª° નવા ખà«àª²à«‡àª²àª¾àª‚ ખાતાઓનà«àª‚ યોગદાન બતાવો',
+'sp-contributions-newbies-sub' => 'નવા ખાતાઓ માટે',
+'sp-contributions-newbies-title' => 'નવા ખાતાના સભà«àª¯à«‹àª¨à«àª‚ યોગદાન',
+'sp-contributions-blocklog' => 'પà«àª°àª¤àª¿àª¬àª‚ધ સૂચિ',
+'sp-contributions-deleted' => 'સભà«àª¯àª¨à«àª‚ ભૂંસેલà«àª‚ યોગદાન',
+'sp-contributions-uploads' => 'ખાસ યોગદાન / ચડાવેલ ફાઇલ',
+'sp-contributions-logs' => 'લૉગ',
+'sp-contributions-talk' => 'યોગદાનકરà«àª¤àª¾àª¨à«€ ચરà«àªšàª¾',
+'sp-contributions-userrights' => 'સભà«àª¯ હકà«àª• પà«àª°àª¬àª‚ધન',
+'sp-contributions-blocked-notice' => 'આ સભà«àª¯ પà«àª°àª¤àª¿àª¬àª‚ધિત છે
તમારા સંદરà«àª­ માટે પà«àª°àª¤àª¿àª¬àª‚ધિત સભà«àª¯à«‹àª¨à«€ યાદિ આપી છે',
-'sp-contributions-search' => 'યોગદાન શોધો',
-'sp-contributions-username' => 'IP સરનામà«àª‚ અથવા સભà«àª¯àª¨àª¾àª®:',
-'sp-contributions-submit' => 'શોધો',
+'sp-contributions-blocked-notice-anon' => 'આ IP સરનામà«àª‚ હમણા પà«àª°àª¤àª¿àª¬àª‚ધિત છે
+તમરા સંદરà«àª­ માટે તાજી પà«àª°àª¤àª¿àª¬àª‚ધ યાદિ આપી છે.',
+'sp-contributions-search' => 'યોગદાન શોધો',
+'sp-contributions-username' => 'IP સરનામà«àª‚ અથવા સભà«àª¯àª¨àª¾àª®:',
+'sp-contributions-toponly' => 'તાજેતરમાં થયેલા ફેરફારો જબતાવો',
+'sp-contributions-submit' => 'શોધો',
# What links here
'whatlinkshere' => 'અહિયાં શà«àª‚ જોડાય છે',
@@ -2362,6 +2423,8 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'cant-block-while-blocked' => 'જà«àª¯àª¾àª°à«‡ તમે પોતે પà«àª°àª¤àª¿àª¬àª‚ધિત હોવ તà«àª¯àª¾àª°à«‡ અનà«àª¯ સભà«àª¯à«‹àª¨à«‡ પà«àª°àª¤àª¿àª¬àª‚ધિત ન કરી શકો',
'cant-see-hidden-user' => 'તમે જે સભà«àª¯ પર રોક લગાવવા પà«àª°àª¯àª¤à«àª¨ કરો છો તે ના પર પહેલેથી રોક લગાવાયેલી છે.
તમને સભà«àª¯ છà«àªªàª¾àªµà«‹ / બતાવોના અધિકારો ન હોવાથી, તમે સભà«àª¯ પર રોક લગાવેલ તે નોંધ જોઇ નથી શકતા.',
+'ipbblocked' => 'તમે અનà«àª¯ સભà«àª¯à«‹àª¨à«‡ પà«àª°àª¤àª¿àª¬àª‚ધિત ન કરી શકો, તમે પોતે પà«àª°àª¤àª¿àª¬àª‚ધિત છો.',
+'ipbnounblockself' => 'તમે પોતાને અપà«àª°àª¤àª¿àª¬àª‚ધિત ન કરી શકો',
# Developer tools
'lockdb' => 'માહિતીસંચય તાળà«àª‚ વાસો',
@@ -2398,6 +2461,18 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'''ચેતવણી!'''
લોકપà«àª°àª¿àª¯ પાનાં સાથે આવà«àª‚ કરવà«àª‚ બિનઅપેકà«àª·àª¿àª¤ અને જોરદાર પરિણામકારક નિવડી શકે છે;
આગળ વધતાં પહેલાં આની અસરોનો પà«àª°à«‡ પà«àª°à«‹ તાગ મેળવી લેવો આવશà«àª¯àª• છે.",
+'movepagetext-noredirectfixer' => "નીચેનà«àª‚ ફોરà«àª® વાપરવાથી આ પાનાનà«àª‚ નામ બદલાઇ જશે અને તેમાં રહેલી બધી મહિતિ નવા નામે બનેલાં પાનામાં ખસેડાઇ જશે.
+જà«àª¨à«àª‚ પાનà«àª‚, નવા બનેલા પાના તરફ વાળતà«àª‚ થશે.
+તમે આવા અનà«àª¯àª¤à«àª° વાળેલાં પનાઓને આપોઆપ જ તેના મà«àª³ શીરà«àª·àª• સાથે જોડી શકશો.
+જો તમે તેમ કરવા ના ઇચà«àª›àª¤àª¾ હોવ તો, [[Special:DoubleRedirects|બેવડા]] અથવા [[Special:BrokenRedirects|તà«àª°à«àªŸàª• કડી વાળા]] અનà«àª¯àª¤à«àª° વાળેલા પાનાઓની યાદી ચકાસીને ખાતરી કરી લેશો.
+કડી જે પાના પર લઈ જવી જોઈઠતે જ પાના સાથે જોડે તેની ખાતરી કરી લેવી તે તમારી જવાબદારી છે.
+
+ઠવાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળà«àª‚ પાનà«àª‚ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ હશે તો જà«àª¨à«àª‚ પાનà«àª‚ '''નહી ખસે''', સિવાયકે તે પાનà«àª‚ ખાલી હોય અથવા તે પણ અનà«àª¯àª¤à«àª° વાળતà«àª‚ પાનà«àª‚ હોય અને તેનો કોઈ ઇતિહાસ ના હોય.
+આનો અરà«àª¥ àªàª® થાય છે કે જો તમે કોઈ તબકà«àª•à«‡ ભà«àª² કરશો તો જે પાનાનà«àª‚ નામ બદલવાનો પà«àª°àª¯àª¤à«àª¨ કરતા હોવ તેને તમે ફરી પાછા જà«àª¨àª¾ નામ પર જ પાછà«àª‚ વાળી શકશો, અને બીજà«àª‚ કે પહેલેથી બનેલા પાનાનà«àª‚ નામ તમે નામફેર કરવા માટે ના વાપરી શકો.
+
+'''ચેતવણી!'''
+લોકપà«àª°àª¿àª¯ પાનાં સાથે આવà«àª‚ કરવà«àª‚ બિનઅપેકà«àª·àª¿àª¤ અને જોરદાર પરિણામકારક નિવડી શકે છે;
+આગળ વધતાં પહેલાં આની અસરોનો પà«àª°à«‡ પà«àª°à«‹ તાગ મેળવી લેવો આવશà«àª¯àª• છે.",
'movepagetalktext' => "આની સાથે સાથે તેનà«àª‚ સંલગà«àª¨ ચરà«àªšàª¾àª¨à«àª‚ પાનà«àª‚ પણ ખસેડવામાં આવશે, '''સિવાયકે:'''
*નવા નામ વાળà«àª‚ ચરà«àªšàª¾àª¨à«àª‚ પાનà«àª‚ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ હોય અને તેમાં લખાણ હોય, અથવા
*નીચેનાં ખાનામાંથી ખરાની નિશાની તમે દૂર કરી હોય.
@@ -2455,6 +2530,7 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'immobile-source-page' => 'આ પાનà«àª‚ ખસેડી નહીં શકાય',
'immobile-target-page' => 'તે લકà«àª·à«àª¯ શીરà«àª·àª• પર ન ખસેડી શકાયા.',
'imagenocrossnamespace' => 'ફાઇલ ને બિન-ફાઇલ નામસà«àª¥àª³àª®àª¾àª‚ ન ખસેડી શકાય',
+'nonfile-cannot-move-to-file' => 'ફાઇલ ન હોય તેમને ફાઇલ નામ સà«àª¥àª³àª®àª¾àª‚ ન ખસેડી શકાય',
'imagetypemismatch' => 'નવો ફાઈલ વિસà«àª¤àª¾àª° શબà«àª¦ તેના પà«àª°àª•àª¾àª°àª¾àª¨à«‡ નથી મળતો',
'imageinvalidfilename' => 'લકà«àª·à«àª¯ ફાઈલ અવૈધ છે',
'fix-double-redirects' => 'મૂળ શીરà«àª·àª• તરફ નિરà«àª¦à«‡àª¶àª¨ કરતા દિશા નિરà«àª¦à«‡àª¶àª•à«‹ અધà«àª¯àª¤àª¨ કરો',
@@ -2535,6 +2611,7 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'importstart' => 'આયાત કામ જારી છે....',
'import-revision-count' => '$1 {{PLURAL:$1|પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨|પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹}}',
'importnopages' => 'આયાત કરવા માટે કોઇ પાનà«àª‚ નથી!',
+'imported-log-entries' => 'આયાતી $1 {{PLURAL:$1|log entry|log entries}}.',
'importfailed' => 'આયાત નિષà«àª«àª³: <nowiki>$1</nowiki>',
'importunknownsource' => 'અજà«àªžàª¾àª¤ આયાતી સà«àª¤à«àª°à«‹àª¤ પà«àª°àª•àª¾àª°',
'importcantopen' => 'આયાતી ફાઈલ નાખોલી શકાઈ',
@@ -2632,6 +2709,8 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'tooltip-rollback' => '"પાછà«àª‚ વાળો" àªàª• જ કà«àª²àª¿àª•àª®àª¾àª‚ છેલà«àª²àª¾ સભà«àª¯àª આ પાનામાં કરેલા બધા ફેરફારો પાછા વાળશે',
'tooltip-undo' => '"રદ કરો" આ ફેરફારને પાછો વાળશે અને ફેરફાર પછીનà«àª‚ પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨ ફોરà«àª® નવા પાના તરીકે ખà«àª²àª¶à«‡.
તે તમને \'સારાંશ\'માં કારણ જણાવવા દેશે.',
+'tooltip-preferences-save' => 'પસંદ સાચવો',
+'tooltip-summary' => 'ટૂંક સારાંશ ઉમેરો',
# Metadata
'nodublincore' => 'સરà«àªµàª° માટે Dublin Core RDF metadata નિષà«àª•à«àª°à«€àª¯ કરાયો.',
@@ -2719,16 +2798,22 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'nextdiff' => 'પછીનો ફેરફાર →',
# Media information
+'mediawarning' => "'''ચેતવણી''': આ ફાઇલમાં દà«àª·à«àªŸ સોચનાઓ હોઇ શકે.
+તેને ચલવતા, તમારા સંગણકને ભય છે.",
'imagemaxsize' => "ચિતà«àª°àª¨àª¾ કદની મરà«àª¯àª¾àª¦àª¾:<br />''(for file description pages)''",
'thumbsize' => 'લઘà«àªšàª¿àª¤à«àª° કદ',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|પાનà«àª‚|પાના}}',
-'file-info-size' => '($1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4)',
+'file-info' => 'ફાઇલ કદ : $1, MIME પà«àª°àª•àª¾àª°: $2',
+'file-info-size' => '$1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4',
'file-nohires' => '<small>આથી વધૠઆવરà«àª¤àª¨ ઉપલબà«àª§ નથી.</small>',
-'svg-long-desc' => '(SVG ફાઇલ, માતà«àª° $1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3)',
+'svg-long-desc' => 'SVG ફાઇલ, માતà«àª° $1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3',
'show-big-image' => 'મહતà«àª¤àª® આવરà«àª¤àª¨',
'show-big-image-thumb' => '<small>આ પà«àª°à«àªµàª¾àªµàª²à«‹àª•àª¨àª¨à«àª‚ પરિમાણ: $1 × $2 પીકà«àª¸àª²</small>',
'file-info-gif-looped' => 'આવરà«àª¤àª¨ (લà«àªª)',
'file-info-gif-frames' => ' $1 {{PLURAL:$1|છબી|છબીઓ}}',
+'file-info-png-looped' => 'આવરà«àª¤àª¨',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|વખત|વખત}} કરાયà«àª‚',
+'file-info-png-frames' => '$1 {{PLURAL:$1|છà«àª¬à«€|છબીઓ}}',
# Special:NewFiles
'newimages' => 'નવી ફાઇલોની àªàª¾àª‚ખી',
@@ -2884,6 +2969,7 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'exif-gpsareainformation' => 'GPS કà«àª·à«‡àª¤à«àª°àª¨à«àª‚ નામ',
'exif-gpsdatestamp' => 'GPS તારીખ',
'exif-gpsdifferential' => 'GPS ફેરફારનો સà«àª§àª¾àª°à«‹',
+'exif-objectname' => 'લઘૠશીરà«àª·àª•',
# EXIF attributes
'exif-compression-1' => 'અસંકોચિત',
@@ -3041,30 +3127,54 @@ $1 પહેલેથી પà«àª°àª¤àª¿àª¬àª‚ધિત છે.
'limitall' => 'બધા',
# E-mail address confirmation
-'confirmemail' => 'તમારા ઇ-મેઇલ સરનામાની પà«àª·à«àªŸàª¿ કરો',
-'confirmemail_noemail' => 'તમારા [[Special:Preferences|user preferences]] માં વૈધ ઈ-મેલ સરનામà«àª‚ નથી.',
-'confirmemail_text' => '{{SITENAME}} માં તમારા ઇ-મેલ સરનામાની પà«àª·à«àªŸàª¿ થયેલી હોવી જરૂરી છે.
+'confirmemail' => 'તમારા ઇ-મેઇલ સરનામાની પà«àª·à«àªŸàª¿ કરો',
+'confirmemail_noemail' => 'તમારા [[Special:Preferences|user preferences]] માં વૈધ ઈ-મેલ સરનામà«àª‚ નથી.',
+'confirmemail_text' => '{{SITENAME}} માં તમારા ઇ-મેલ સરનામાની પà«àª·à«àªŸàª¿ થયેલી હોવી જરૂરી છે.
નીચેના બટન પર કà«àª²àª¿àª• કરો અને પà«àª·à«àªŸàª¿ કરનાર ઇ-મેલ પાઠવો.
આ મેલમાં કોડ ધરાવતી àªàª• કડી પણ મોકલાવાશે;
ઈ-મેલની પà«àª·à«àªŸàª¿ કરવા તે કડી તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ સકà«àª°à«€àª¯ કરો.',
-'confirmemail_pending' => 'પà«àª·à«àªŸàª¿ કરતà«àª‚ કોડ તમને ઇ-મેલ કરી દેવાયો છે;
+'confirmemail_pending' => 'પà«àª·à«àªŸàª¿ કરતà«àª‚ કોડ તમને ઇ-મેલ કરી દેવાયો છે;
તમે જો હાલમાં તમારà«àª‚ ખાતà«àª‚ ખોલà«àª¯à«àª‚ હોય, તો તમે અમà«àª• કà«àª·àª£à«‹ પà«àª°àª¤àª¿àª•à«àª·àª¾ કરી અને નવા કોડની વિનંતી કરવાનà«àª‚ ટાળી શકો.',
-'confirmemail_send' => 'ઈ-મેલ બહાલી સંકેત ઇ-મેલમાં મોકલો',
-'confirmemail_sent' => 'બહાલીનો ઇ-મેલ મોકલી દેવાયો છે',
-'confirmemail_oncreate' => 'પà«àª·à«àªŸàª¿àª•à«‹àª¡ તમને ઇમેલ દà«àªµàª¾àª°àª¾ મોકલવામાં આવà«àª¯à«‹ છે.
+'confirmemail_send' => 'ઈ-મેલ બહાલી સંકેત ઇ-મેલમાં મોકલો',
+'confirmemail_sent' => 'બહાલીનો ઇ-મેલ મોકલી દેવાયો છે',
+'confirmemail_oncreate' => 'પà«àª·à«àªŸàª¿àª•à«‹àª¡ તમને ઇમેલ દà«àªµàª¾àª°àª¾ મોકલવામાં આવà«àª¯à«‹ છે.
પà«àª°àªµà«‡àª¶ કરવા માટ તમને આ કોડની જરૂર નથી. પણ ઇ-મેલ આધારિત વિકિ સેવાઓ વાપરવા આની જરૂર છે.',
-'confirmemail_sendfailed' => '{{SITENAME}} તમારો પà«àª·à«àªŸàª¿ કરનાર ઇ-મેલ નહીં મોકલી શકી.
+'confirmemail_sendfailed' => '{{SITENAME}} તમારો પà«àª·à«àªŸàª¿ કરનાર ઇ-મેલ નહીં મોકલી શકી.
કૃપયા તમારો ઇ-મેલ તપાસી અવૈધ અકà«àª·àª°à«‹ હોય તો તપાસો.
મેલની પહોંચ પાછી ફરી: $1',
-'confirmemail_invalid' => 'અવૈધ બહાલી સંકેત
+'confirmemail_invalid' => 'અવૈધ બહાલી સંકેત
સંકેત કાલાતિત થયà«àª‚ હોય',
-'confirmemail_needlogin' => 'તમારે ઈ-મેલ ને બહાલી આપવા $1 કરવà«àª‚ પડશે',
-'confirmemail_success' => 'તમારા ઈ-મેલની પà«àª·à«àªŸàª¿ થઈ ગઈ છે.
+'confirmemail_needlogin' => 'તમારે ઈ-મેલ ને બહાલી આપવા $1 કરવà«àª‚ પડશે',
+'confirmemail_success' => 'તમારા ઈ-મેલની પà«àª·à«àªŸàª¿ થઈ ગઈ છે.
તમે હવે પà«àª°àªµà«‡àª¶ [[Special:UserLogin|log in]] કરી વિકિનો આનંદ ઉઠાવી શકો.',
-'confirmemail_loggedin' => 'તમારા ઇ-મેલ સરનામાની પà«àª·à«àªŸàª¿ કરાઇ છે.',
-'confirmemail_error' => 'પà«àª·à«àªŸàª¿ સાચવતા કોઈ તà«àª°à«àªŸàª¿ રહી ગઈ',
-'confirmemail_subject' => '{{SITENAME}} ઈ-મેલ સરનામાની પà«àª·à«àªŸàª¿',
-'confirmemail_body' => 'કોઇકે, કદાચ તમે પોતે જ , IP સરનામા $1 પરથી,
+'confirmemail_loggedin' => 'તમારા ઇ-મેલ સરનામાની પà«àª·à«àªŸàª¿ કરાઇ છે.',
+'confirmemail_error' => 'પà«àª·à«àªŸàª¿ સાચવતા કોઈ તà«àª°à«àªŸàª¿ રહી ગઈ',
+'confirmemail_subject' => '{{SITENAME}} ઈ-મેલ સરનામાની પà«àª·à«àªŸàª¿',
+'confirmemail_body' => 'કોઇકે, કદાચ તમે પોતે જ , IP સરનામા $1 પરથી,
+ "$2" ખાતાનà«àª‚ ઇ-મેલ સરનામà«àª‚ બદલà«àª¯à«àª‚ {{SITENAME}} પર છે.
+
+ઠવાતની પà«àª·à«àªŸàª¿ કરવા માટે કે આ àª-મેલ ખાતà«àª‚ તમારà«àª‚ જ છે અને {{SITENAME}}ના ઇ-મેલ સંબંધિત વિકલà«àªªà«‹ સકà«àª°à«€àª¯ કરવા માટે અપેલ કડીને તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ સકà«àª°à«€àª¯ કરો. :
+
+$3
+
+જો ખાતà«àª‚ તમારà«àª‚ ના હોય તો,આકડીનેઅનà«àª¸àª°à«€àªˆ-મેલાખાતાનીપà«àª·à«àªŸàª¿àª¨à«€àª¨à«‹àª‚ધણીને રદà«àª¦ કરો:
+
+$5
+
+આ પà«àª·à«àªŸàª¿ કોડ $4 ના કાલાતિત થશે.',
+'confirmemail_body_changed' => 'કોઇકે, કદાચ તમે પોતે જ , IP સરનામા $1 પરથી,
+ "$2" ખાતાનà«àª‚ ઇ-મેલ સરનામà«àª‚ બદલà«àª¯à«àª‚ {{SITENAME}} પર છે.
+
+ઠવાતની પà«àª·à«àªŸàª¿ કરવા માટે કે આ àª-મેલ ખાતà«àª‚ તમારà«àª‚ જ છે અને {{SITENAME}}ના ઇ-મેલ સંબંધિત વિકલà«àªªà«‹ સકà«àª°à«€àª¯ કરવા માટે અપà«à«‡àª² કડીને તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ સકà«àª°à«€àª¯ કરો. :
+
+$3
+
+જો ખાતà«àª‚ તમારà«àª‚ ના હોય તો,આકડીનેઅનà«àª¸àª°à«€àªˆ-મેલાખાતાનીપà«àª·à«àªŸàª¿àª¨à«€àª¨à«‹àª‚ધણીને રદà«àª¦ કરો:
+
+$5
+
+આ પà«àª·à«àªŸàª¿ કોડા $4 ના કાલાતિત થશે.',
+'confirmemail_body_set' => 'કોઇકે, કદાચ તમે પોતે જ , IP સરનામા $1 પરથી,
"$2" ખાતાનà«àª‚ ઇ-મેલ સરનામà«àª‚ બદલà«àª¯à«àª‚ {{SITENAME}} પર છે.
ઠવાતની પà«àª·à«àªŸàª¿ કરવા માટે કે આ àª-મેલ ખાતà«àª‚ તમારà«àª‚ જ છે અને {{SITENAME}}ના ઇ-મેલ સંબંધિત વિકલà«àªªà«‹ સકà«àª°à«€àª¯ કરવા માટે અપેલ કડીને તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ સકà«àª°à«€àª¯ કરો. :
@@ -3076,8 +3186,8 @@ $3
$5
આ પà«àª·à«àªŸàª¿ કોડ $4 ના કાલાતિત થશે.',
-'confirmemail_invalidated' => 'ઇ-મેલ સરનામાનà«àª‚ બહાલીકરણ રદà«àª¦',
-'invalidateemail' => 'ઇ-મેલ બહાલી રદà«àª¦ કરો',
+'confirmemail_invalidated' => 'ઇ-મેલ સરનામાનà«àª‚ બહાલીકરણ રદà«àª¦',
+'invalidateemail' => 'ઇ-મેલ બહાલી રદà«àª¦ કરો',
# Scary transclusion
'scarytranscludedisabled' => 'આંતરવિકિ આંશિક સંદરà«àª­à«€àª•àª°àª£ નિષà«àª•à«àª°à«€àª¯',
@@ -3117,6 +3227,7 @@ $1',
'table_pager_first' => 'પહેલà«àª‚ પાનà«àª‚',
'table_pager_last' => 'છેલà«àª²à«‚ં પાનà«àª‚',
'table_pager_limit' => 'પà«àª°àª¤àª¿ પાને $1 વસà«àª¤à« બતાવો',
+'table_pager_limit_label' => 'વસà«àª¤àª¿àª“ પà«àª°àª¤àª¿ પાને',
'table_pager_limit_submit' => 'જાઓ',
'table_pager_empty' => 'કોઇ પરિણામ નથી',
@@ -3139,19 +3250,26 @@ $1',
'lag-warn-high' => 'માહિતીસંચ સરà«àªµàª°àª¨àª¾ લાંબાગાળાને કારણે $1 {{PLURAL:$1|સેકંડ|સેકંડો}} પછી કરેલા ફેરફાર જોઇ શકાશે નહીં',
# Watchlist editor
-'watchlistedit-numitems' => 'તમારી ધà«àª¯àª¾àª¨ સૂચિ {{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹}} ધરાવે છે, ચરà«àªšàª¾àª¨àª¾ પાના સિવાય.',
-'watchlistedit-noitems' => 'તમારી ધà«àª¯àª¾àª¨ સૂચિમાં કોઇ શીરà«àª·àª• નથી.',
-'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' => 'શિરà«àª·àª•:',
-'watchlistedit-raw-submit' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ અધà«àª¯àª¤àª¨ બનાવો',
-'watchlistedit-raw-done' => 'તમારી ધà«àª¯àª¾àª¨àª¾ સૂચિ અધà«àª¯àª¤àª¨ કરાઈ.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹}} ઉમેરાયા :',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹ }} હટાવાયા :',
+'watchlistedit-numitems' => 'તમારી ધà«àª¯àª¾àª¨ સૂચિ {{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹}} ધરાવે છે, ચરà«àªšàª¾àª¨àª¾ પાના સિવાય.',
+'watchlistedit-noitems' => 'તમારી ધà«àª¯àª¾àª¨ સૂચિમાં કોઇ શીરà«àª·àª• નથી.',
+'watchlistedit-normal-title' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ માં ફેરફાર કરો',
+'watchlistedit-normal-legend' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિમાંથી આશીરà«àª·àª•à«‹ કાઢી નાખો',
+'watchlistedit-normal-explain' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિના શીરà«àª·àª•à«‹ અહીં બતાવà«àª¯àª¾àª‚ છે.
+કોઇ શીરà«àª·àª• હતાવવા માટે , તેની બાજà«àª‚ નà«àª‚ ખાનà«àª‚ અંકિત કરો , અને "{{int:Watchlistedit-normal-submit}}"ના પર કà«àª²àª¿àª• કરો.
+તમે [[Special:Watchlist/raw|edit the raw list]]માં બદલાવ પણ કરી શકો.',
+'watchlistedit-normal-submit' => 'શીરà«àª·àª•à«‹ હટાવો',
+'watchlistedit-normal-done' => '{{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹ }} ને તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાંથી હટાવાયા:',
+'watchlistedit-raw-title' => 'કાચી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ફેરફાર કરો',
+'watchlistedit-raw-legend' => 'કાચી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ફેરફાર કરો',
+'watchlistedit-raw-explain' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિના શીરà«àª·àª•à«‹ અહીં બતાવà«àª¯àª¾àª‚ છે , તેમાં વસà«àª¤à« ઓ ઉમેરીઠઅને હટાવીને તેમાં ફેરફાર કરી શકાય છે;
+àªàª• શીરà«àª·àª• પà«àª°àª¤àª¿ લિટી.
+જà«àª¯àª¾àª°à«‡ કારà«àª¯ સમાપà«àª¤ થાય તà«àª¯àª¾àª°à«‡, અહીં કà«àª²àª¿àª• કરો "{{int:Watchlistedit-raw-submit}}".
+તેમે [[Special:Watchlist/edit|use the standard editor]] પણ કરી શકો.',
+'watchlistedit-raw-titles' => 'શિરà«àª·àª•:',
+'watchlistedit-raw-submit' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ અધà«àª¯àª¤àª¨ બનાવો',
+'watchlistedit-raw-done' => 'તમારી ધà«àª¯àª¾àª¨àª¾ સૂચિ અધà«àª¯àª¤àª¨ કરાઈ.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹}} ઉમેરાયા :',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 શીરà«àª·àª• |$1 શીરà«àª·àª•à«‹ }} હટાવાયા :',
# Watchlist editing tools
'watchlisttools-view' => 'બંધબેસતાં ફેરફારો નિહાળો',
@@ -3168,6 +3286,7 @@ $1',
'version-specialpages' => 'ખાસ પાનાં',
'version-parserhooks' => 'પદચà«àª›à«‡àª¦ ખૂંટો',
'version-variables' => 'સહગà«àª£àª•à«‹',
+'version-skins' => 'ફલક',
'version-other' => 'અનà«àª¯',
'version-mediahandlers' => 'દà«àª°àª¶à«àª¯àª¶à«àª°àª¾àªµà«àª¯ માધà«àª¯àª®àª¨àª¾ ધારક',
'version-hooks' => 'ખૂંટા',
@@ -3179,6 +3298,13 @@ $1',
'version-hook-subscribedby' => 'દà«àªµà«àª°àª¾àª°àª¾ લાભાનà«àªµà«€àª¤',
'version-version' => '(આવૃતà«àª¤àª¿ $1)',
'version-license' => 'પરવાનો',
+'version-poweredby-credits' => "આ વિકિ '''[http://www.mediawiki.org/ MediaWiki]''' દà«àªµàª¾àª°àª¾ ચાલે છે, પà«àª°àª•àª¾àª¶àª¨àª¾àª§àª¿àª•àª¾àª° © 2001-$1 $2.",
+'version-poweredby-others' => 'અનà«àª¯à«‹',
+'version-license-info' => 'મિડિયાવિકિ àªàª• મà«àª•à«àª¤ સોફà«àªŸàªµà«‡àª° છે. તમે તેનà«àª‚ પà«àª¨àªƒàªµàª¿àª¤àª°àª£ કરી શકો છો અને/અથવા તેને the Free Software Foundation દà«àªµàª¾àª°àª¾ પà«àª°àª•àª¾àª¶àª¿àª¤ GNU General Public License હેઠળ તેના સંસà«àª•àª°àª£ 2 ને કે તે પછીના સંસà«àª•àª°àª£ મઠારી શકો છો .
+
+મિડિયા વિકિ ને તે આશાથી વિતરીત કરાયà«àª‚ છે કે તે લોકોને ઉપયોગિ થશે કોઇ વોરેંટી વિના અથવા કોઇ કારà«àª¯ સંબધી વેચાણકે તેની યોગà«àª¯àª¤àª¾ બદà«àª¦àª² ખાતà«àª°à«€ સિવાય. વધારે માહિતે માટે GNU General Public Licens જà«àª“.
+
+આ પà«àª°à«‹àª—à«àª°àª¾àª® સાથે તમને [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License]ની કૉપી મળી હશે. જો ન મલી હોય તો અહીં લખશો the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA કે [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html ઓનલાઇન વાંચો ].',
'version-software' => 'બેસાડેલા સોફà«àªŸàªµà«‡àª°',
'version-software-product' => 'ઉતà«àªªàª¾àª¦',
'version-software-version' => 'આવૃતà«àª¤àª¿',
@@ -3202,6 +3328,9 @@ $1',
# Special:SpecialPages
'specialpages' => 'ખાસ પાનાં',
+'specialpages-note' => '----
+* સામાનà«àª¯ ખાસ પાનાઓ.
+* <strong class="mw-specialpagerestricted">Restricted special pages.</strong>',
'specialpages-group-maintenance' => 'સમારકામ અહેવાલ',
'specialpages-group-other' => 'અનà«àª¯ ખાસ પાનાઓ',
'specialpages-group-login' => 'પà«àª°àªµà«‡àª¶ / નોંધણી કરો',
@@ -3242,6 +3371,15 @@ $1',
'tags-edit' => 'ફેરફાર કરો',
'tags-hitcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+# Special:ComparePages
+'comparepages' => 'પાનાં સરખાવો',
+'compare-selector' => 'પાનાનાં પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ સરખાવો',
+'compare-page1' => 'પાનà«àª‚ ૧',
+'compare-page2' => 'પાનà«àª‚ ૨',
+'compare-rev1' => 'પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ ૧',
+'compare-rev2' => 'પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ ૨',
+'compare-submit' => 'સરખાવો',
+
# Database error messages
'dberr-header' => 'આ વિકિમાં તકલીફ છે',
'dberr-problems' => 'દિલગીરી!
@@ -3259,8 +3397,13 @@ $1',
'htmlform-float-invalid' => 'તમે લખેલ વિકલà«àªª અંક નથી',
'htmlform-int-toolow' => '$1 આ કિંમત આ નà«àª¯à«‚નતમ કિંમત છે',
'htmlform-int-toohigh' => 'તમે પà«àª°à«€ પાડેલ માહિતી મહતà«àª¤àª® $1થી વધૠછે',
+'htmlform-required' => 'આ કિàªàª®àª¤ જોઈઠછે',
'htmlform-submit' => 'જમા કરો',
'htmlform-reset' => 'ફેરફાર ઉલટાવો',
'htmlform-selectorother-other' => 'અનà«àª¯',
+# SQLite database support
+'sqlite-has-fts' => '$1 પૂરà«àª£ શબà«àª¦ શોધ સહીત',
+'sqlite-no-fts' => '$1 પૂરà«àª£ શબà«àª¦ શોધ વિકલà«àªª વગર',
+
);
diff --git a/languages/messages/MessagesGv.php b/languages/messages/MessagesGv.php
index 94203c98..733026db 100644
--- a/languages/messages/MessagesGv.php
+++ b/languages/messages/MessagesGv.php
@@ -42,7 +42,7 @@ $messages = array(
'tog-numberheadings' => 'Cur earrooyn gyn smooinaght er kione-linnaghyn',
'tog-showtoolbar' => 'Taishbynee barr greieyn (ta feme ec er JavaScript)',
'tog-editondblclick' => 'Reagh duillagyn lesh crig dooblit (ta feme ec er JavaScript)',
-'tog-rememberpassword' => "Cooinnee m'ockle arrey er y cho-earrooder shoh",
+'tog-rememberpassword' => 'Cooinnee my fys loggal stiagh er y cho-earrooder shoh (rish wheesh as $1 {{PLURAL:$1|laa|laa|laa|laaghyn}})',
'tog-watchcreations' => 'Cur duillagyn ta crooit aym lesh my rolley arrey',
'tog-watchdefault' => 'Cur duillagyn ta reaghit aym lesh my rolley arrey',
'tog-watchmoves' => 'Cur duillagyn ta scughit aym lesh my rolley arrey',
@@ -167,29 +167,19 @@ $messages = array(
'faqpage' => 'Project:FC',
# Vector skin
-'vector-action-addsection' => 'Cooish noa',
-'vector-action-delete' => 'Scryss',
-'vector-action-move' => 'Scughey',
-'vector-action-protect' => 'Coadee',
-'vector-action-undelete' => 'Jee-scryss',
-'vector-action-unprotect' => 'Jee-choadee',
-'vector-namespace-category' => 'Ronney',
-'vector-namespace-help' => 'Duillag choonee',
-'vector-namespace-image' => 'Coadan',
-'vector-namespace-main' => 'Duillag',
-'vector-namespace-mediawiki' => 'Çhaghteraght',
-'vector-namespace-project' => 'Duillag shalee',
-'vector-namespace-special' => 'Duillag er lheh',
-'vector-namespace-talk' => 'Resoonaght',
-'vector-namespace-template' => 'Clowan',
-'vector-namespace-user' => 'Duillag ymmydeyr',
-'vector-view-create' => 'Croo',
-'vector-view-edit' => 'Reaghey',
-'vector-view-history' => 'Jeeagh er shennaghys',
-'vector-view-view' => 'Lhaih',
-'vector-view-viewsource' => 'Jeeagh er bun',
-'actions' => 'Obbraghyn',
-'namespaces' => 'Reamyssyn',
+'vector-action-addsection' => 'Cooish noa',
+'vector-action-delete' => 'Scryss',
+'vector-action-move' => 'Scughey',
+'vector-action-protect' => 'Coadee',
+'vector-action-undelete' => 'Jee-scryss',
+'vector-action-unprotect' => 'Jee-choadee',
+'vector-view-create' => 'Croo',
+'vector-view-edit' => 'Reaghey',
+'vector-view-history' => 'Jeeagh er shennaghys',
+'vector-view-view' => 'Lhaih',
+'vector-view-viewsource' => 'Jeeagh er bun',
+'actions' => 'Obbraghyn',
+'namespaces' => 'Reamyssyn',
'errorpagetitle' => 'Marranys',
'returnto' => 'Goll er ash gys $1.',
@@ -243,6 +233,7 @@ $messages = array(
'jumpto' => 'Gow gys:',
'jumptonavigation' => 'stiureydys',
'jumptosearch' => 'ronsaghey',
+'pool-errorunknown' => 'Doilleeid gyn enney er',
# 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' => 'Mychione {{SITENAME}}',
@@ -334,7 +325,7 @@ Ny jean jarrood dty [[Special:Preferences|{{SITENAME}} hosheeaghtyn]] y arraghey
'yourname' => "Dt'ennym ymmydeyr",
'yourpassword' => 'Fockle yn arrey:',
'yourpasswordagain' => "Aascreeu d'ockle arrey:",
-'remembermypassword' => "Cooinnee m'ockle arrey",
+'remembermypassword' => "Cooinnee m'ockle arrey (rish wheesh as $1 {{PLURAL:$1|laa|laa|laa|laaghyn}})",
'login' => 'Log stiagh',
'nav-login-createaccount' => 'Log stiagh / croo coontys',
'loginprompt' => 'Shegin dhyt cur pooar da minniagyn dy loggal stiagh ayns {{SITENAME}}.',
@@ -349,6 +340,7 @@ Ny jean jarrood dty [[Special:Preferences|{{SITENAME}} hosheeaghtyn]] y arraghey
'gotaccount' => "Vel coontys ayd hannah? '''$1'''.",
'gotaccountlink' => 'Log stiagh',
'createaccountmail' => 'er post-L',
+'createaccountreason' => 'Fa:',
'loginerror' => 'Marranys log stiagh',
'createaccounterror' => 'Cha dod shin croo coontys: $1',
'noname' => 'Cha honree uss ennym ymmydeyr fondagh',
@@ -912,7 +904,6 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
# Watchlist
'watchlist' => 'My rolley arrey',
'mywatchlist' => 'My rolley arrey',
-'watchlistfor' => "(son '''$1''')",
'watchnologin' => 'Cha nel oo loggit stiagh',
'addedwatch' => 'Currit rish y rolley arrey',
'addedwatchtext' => "Va'n duillag \"[[:\$1]]\" currit lesh dty [[Special:Watchlist|rolley arrey]].<br />
@@ -1267,9 +1258,9 @@ T'eh lhiggey da oyr y chur 'sy ghiare-choontey.",
# Media information
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|duillag|duillagyn}}',
-'file-info-size' => '($1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}}, mooadys y choadan: $3, sorçh MIME: $4)',
+'file-info-size' => '$1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}}, mooadys y choadan: $3, sorçh MIME: $4',
'file-nohires' => '<small>Cha nel jeeskeaylley ny smoo ry-gheddyn.</small>',
-'svg-long-desc' => '(coadan SVG, $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}} dy ennymagh, mooadys y choadan: $3)',
+'svg-long-desc' => 'coadan SVG, $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}} dy ennymagh, mooadys y choadan: $3',
'show-big-image' => 'Jeeskeaylley ymlane',
'show-big-image-thumb' => '<small>Mooadys y roie-haishbynys shoh: $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}}</small>',
diff --git a/languages/messages/MessagesHa.php b/languages/messages/MessagesHa.php
index 93fdc70d..08116137 100644
--- a/languages/messages/MessagesHa.php
+++ b/languages/messages/MessagesHa.php
@@ -26,8 +26,7 @@ $messages = array(
'tog-editsection' => 'A lamunta gyara sashe ta hanyar zaruruwan [gyarawa]',
'tog-editsectiononrightclick' => 'A lamunta gyara shashe da kilikin dama a kan kanun shashe (ana buƙatar JavaScript)',
'tog-showtoc' => 'A nuna jadawalin kanu (cikin shafuna masu fiye da kanu 3)',
-'tog-rememberpassword' => 'A adana bayanan loginkina a wannan kwamfyuta',
-'tog-editwidth' => 'A faÉ—aÉ—a sararin gyarawa ya cika duka bangon',
+'tog-rememberpassword' => 'A adana bayanan loginkina a wannan kwamfyuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'A daɗa shafunan da na ƙirƙira a cikin jerina na kan ido',
'tog-watchdefault' => 'A daÉ—a shafunan da na gyara a cikin jerina na kan ido',
'tog-watchmoves' => 'A daÉ—a shafunan da na gusar a cikin jerina na kan ido',
@@ -142,12 +141,10 @@ $messages = array(
'qbspecialpages' => 'Shafuna na musamman',
# Vector skin
-'vector-action-delete' => 'Soke',
-'vector-action-move' => 'Gusarwa',
-'vector-action-protect' => 'A kare',
-'vector-namespace-category' => 'Rukuni',
-'vector-namespace-main' => 'Shafi',
-'vector-view-create' => 'Ƙirƙira',
+'vector-action-delete' => 'Soke',
+'vector-action-move' => 'Gusarwa',
+'vector-action-protect' => 'A kare',
+'vector-view-create' => 'Ƙirƙira',
'errorpagetitle' => 'TangarÉ—a',
'returnto' => 'Koma $1',
@@ -239,13 +236,14 @@ Tana yiyuwa yana da harafi ko haruffa da ba su karɓuwa cikin kanu.",
# Login and logout pages
'yourname' => "Sunan ma'aikaci:",
'yourpassword' => 'Kalmar sirri:',
-'remembermypassword' => 'Adana bayannan logina a wannan kwafyuta',
+'remembermypassword' => 'Adana bayannan logina a wannan kwafyuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Logi',
'nav-login-createaccount' => 'logi / sabon akwanti',
'userlogin' => 'Logi / sabon akwanti',
'logout' => 'Ban kwana',
'userlogout' => 'Ban kwana',
'nologinlink' => 'BuÉ—a sabon akwanti',
+'createaccountreason' => 'Dalili:',
'mailmypassword' => 'Aiken kalmar sirri ta Imel',
# Password reset dialog
@@ -504,7 +502,6 @@ Ku gwada tare da amfani da \"all:\" don bincikar duka shafunan (har da shafunan
# Watchlist
'watchlist' => 'Jerina na bin sawu',
'mywatchlist' => 'Jerina na bin sawu',
-'watchlistfor' => "(na '''$1''')",
'addedwatch' => 'An daÉ—a a cikin jerin bin sawu',
'addedwatchtext' => "An daÉ—a shafin \"[[:\$1]]\" a cikin [[Special:Watchlist|jerinku na bin sawu]].
A nan ne kuma za a yi rajistan dukkan sauye-sauye ga shafin ko shafinsa na muhawara, kuma sunan shafin zai kasance '''mai gwaɓi''' a cikin [[Special:RecentChanges|jerin sauye-sauyen baya-bayan nan]] don sauƙin gani.",
@@ -728,9 +725,9 @@ Tana ba da damar bayyana dalilin soke gyaran.',
'nextdiff' => 'Gyaran gaba →',
# Media information
-'file-info-size' => '(pikisal $1 × $2, girman fayil: $3, irin MIME: $4)',
+'file-info-size' => 'pikisal $1 × $2, girman fayil: $3, irin MIME: $4',
'file-nohires' => '<small>Babu wata babbar saƙa.</small>',
-'svg-long-desc' => '(Fayil kin SVG, saƙar fikisal $1 x $2, girman fayil: $3)',
+'svg-long-desc' => 'Fayil kin SVG, saƙar fikisal $1 x $2, girman fayil: $3',
'show-big-image' => 'Cikakkar saƙa',
'show-big-image-thumb' => '<small>Girman wanna rigya-gani: pikisal $1 × $2</small>',
diff --git a/languages/messages/MessagesHak.php b/languages/messages/MessagesHak.php
index abbeb321..546c4bbb 100644
--- a/languages/messages/MessagesHak.php
+++ b/languages/messages/MessagesHak.php
@@ -25,8 +25,7 @@ $messages = array(
'tog-editsection' => 'Yún-chún thûng-ko tiám-kit [phiên-siá] lièn-kiet phiên-cho thon-loÌk',
'tog-editsectiononrightclick' => 'Yún-chún yu-kit phêu-thì phiên-chho thon-loÌk (JavaScript)',
'tog-showtoc' => 'Hién-sá¹³ muk-liuÌk (chṳ̂m-tui yit-chông chhêu-ko sâm-ke phêu-thì ke vùn-chông)',
-'tog-rememberpassword' => 'Hâ-yit-chhá¹³ tên-ngiÌp ki-heÌt meÌt-meÌt',
-'tog-editwidth' => 'Phiên-cho làn-vi yí-kîn yû chui-thai khôn-yùng',
+'tog-rememberpassword' => 'Hâ-yit-chhá¹³ tên-ngiÌp ki-heÌt meÌt-meÌt (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Chiông ngô chhóng-chho ke vùn-chông kâ-thiâm to ngô-ke kam-sá¹³ lieÌt-péu chûng',
'tog-watchdefault' => 'Chiông ngô kiên-kói ke vùn-chông kâ-thiâm to ngô-ke kam-sá¹³ lieÌt-péu chûng',
'tog-watchmoves' => 'Chiông ngô yì-thung ke vùn-chông kâ-ngiÌp ngô-ke kam-sá¹³ lieÌt-péu',
@@ -152,24 +151,13 @@ $messages = array(
'faqpage' => 'Project:Sòng-kien mun-thì kié-tap',
# Vector skin
-'vector-action-delete' => 'Chhù-thet',
-'vector-action-move' => 'Yì-thung',
-'vector-action-protect' => 'Pó-fu',
-'vector-action-unprotect' => 'Kié-chhù pó-fu',
-'vector-namespace-category' => 'Fûn-lui',
-'vector-namespace-help' => 'Pông-chhu sot-mìn',
-'vector-namespace-image' => 'Tóng-on',
-'vector-namespace-main' => 'Vùn-chông',
-'vector-namespace-media' => 'Chhiòn-thí hong-mien',
-'vector-namespace-mediawiki' => 'Sin-sit',
-'vector-namespace-project' => 'Kie-vaÌk hong-mien',
-'vector-namespace-special' => 'ThiÌt-sû hong-mien',
-'vector-namespace-talk' => 'Thó-lun',
-'vector-namespace-template' => 'Mù-pán',
-'vector-namespace-user' => 'Yung-fu thiàu-muk',
-'vector-view-create' => 'Tshóng-kien',
-'vector-view-edit' => 'Phiên-siá',
-'vector-view-viewsource' => 'Ngièn-sá¹³Ì-tóng',
+'vector-action-delete' => 'Chhù-thet',
+'vector-action-move' => 'Yì-thung',
+'vector-action-protect' => 'Pó-fu',
+'vector-action-unprotect' => 'Kié-chhù pó-fu',
+'vector-view-create' => 'Tshóng-kien',
+'vector-view-edit' => 'Phiên-siá',
+'vector-view-viewsource' => 'Ngièn-sá¹³Ì-tóng',
'errorpagetitle' => 'Chho-ngu',
'returnto' => 'Fán-fì to $1.',
@@ -356,7 +344,7 @@ Ngì khó-yî ki-siuÌk yî ngiaÌk-miàng fông-sá¹³t sá¹³Ì-yung {{SITENAME}},
'yourname' => 'Yung-fu-miàng',
'yourpassword' => 'MeÌt-ma:',
'yourpasswordagain' => 'Chai-chhá¹³ sû-ngiÌp meÌt-ma:',
-'remembermypassword' => 'Hâ-chhá¹³ tên-ngiÌp ki-heÌt pi-meÌt.',
+'remembermypassword' => 'Hâ-chhá¹³ tên-ngiÌp ki-heÌt pi-meÌt (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Ngì ke mióng',
'externaldberror' => 'Liá-ke khó-nèn he chhut-yì ngoi-phu ngiam-chá¹³n chṳ̂-liau-khu chho-ngu feÌt-chá ngì pûn-ngìn kim-chá¹³Ì kiên-sîn ngì-ke ngoi-phu chong-ho.',
'login' => 'Tên-ngiÌp',
@@ -373,6 +361,7 @@ Ngì khó-yî ki-siuÌk yî ngiaÌk-miàng fông-sá¹³t sá¹³Ì-yung {{SITENAME}},
'gotaccount' => "Yí-kîn yúng-yû chong-ho? '''$1'''.",
'gotaccountlink' => 'Tên-ngiÌp',
'createaccountmail' => 'thûng-ko e-mail',
+'createaccountreason' => 'Ngièn-yîn:',
'badretype' => 'Ngì só sû-ngiÌp ke pi-meÌt pin mò siông-thùng.',
'userexists' => 'Ngì sû-ngiÌp ke yung-fu miàng-chhṳ̂n yí-kîn chhùn-chhai, chhiáng nang-ngoi sién yit-ke.',
'loginerror' => 'Tên-liuÌk chho-ngu',
@@ -487,7 +476,7 @@ Tshiáng chhai kien-liÌpï¼piên-sip liá-ke vùn-tsông tshièn siên kiám-ts
'userjsyoucanpreview' => "'''Thì-sṳ:''' Chhai pó-chhùn chhièn chhiáng yung 'hién-sṳ yi-ko' on-néu lòi chhet-chhṳ ngì sîn-ke JS.",
'usercsspreview' => "'''Chu-yi ngì chak-he chhai yi-liau ngì ke-ngìn CSS, hàn-mò tú-chhùn!'''",
'userjspreview' => "'''Chu-yi ngì chak-he chhai chhet-chhá¹³ ï¼ yi-liau ngì ke-ngìn JavaScript, hàn-mò tú-chhùn!'''",
-'userinvalidcssjstitle' => "'''Kín-ko:''' Put chhùn-chhai mien-pán \"\$1\". chu-yi chhá¹³-thin ke .css lâu .js hong yeu sá¹³Ì-yung séu-siá phêu-thì, yì-yi, {{ns:user}}:Foo/monobook.css put-thùng yî {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Kín-ko:''' Put chhùn-chhai mien-pán \"\$1\". chu-yi chhá¹³-thin ke .css lâu .js hong yeu sá¹³Ì-yung séu-siá phêu-thì, yì-yi, {{ns:user}}:Foo/vector.css put-thùng yî {{ns:user}}:Foo/Vector.css.",
'updated' => '(Yí-kîn kiên-sîn)',
'note' => "'''Chu-yi:'''",
'previewnote' => "'''Chhiáng ki-heÌt liá-ke chak-he yi-liau, nui-yùng hàn-mò pó-chhùn!'''",
@@ -515,7 +504,6 @@ Ngì yin-tông chiông ngì só-cho ke siù-chho kâ-ngiÌp hien-yû ke nui-yùn
Kó-yèn ngì chhin-mò hî-mong ngì-ke ngì-ke vùn-sṳ pûn-ngìn ngim-yi chhùng-siû lâu chai san-pu, chhiáng mò-yeu thì-kâu.<br />
Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chá¹³n ngì só thì-kâu ke nui-yùng he chhá¹³-kí só chok,feÌt-chá lòi-chhá¹³ yit-ke mò-su pán-khièn pó-fu feÌt-he he siông-thùng chhá¹³-yù ke lòi-ngièn (Chhâm-siòng $1 ke se-chiet).
''' Mò-yeu chhai hàn-mò su-khièn ke chhìn-khóng-hâ fat-péuï¼'''",
-'longpagewarning' => "'''Kín-ko: Pún-chông chhòng-thu thaÌt-tó $1 kBï¼›mêu-chúng hi-khí chiông-voi mò-fap phiên-chhut chhòng-ko 32 kB ke vùn-chông. Chhiáng kháu-li chiông pún-chông chhiet kot-sṳ̀n kí-ke séu thon-loÌk.'''",
'longpageerror' => "'''Chho-ngu: Ngì só thì-kâu ke vùn-sá¹³ chhòng-thu yû $1KB, liá thai-yî $2KB ke chui-thai chhá¹³Ìt, ke-vùn-chông put-nèn pûn tú-chhùn.'''",
'readonlywarning' => "'''Kín-ko: chṳ̂-liau-khu pûn-ngìn fûng-só yîn-vi chin-hàng vì-fu, só-yî muk-chhièn mò-fap pó-chhùn ngì-ke siù-chho. Ngì feÌt-hí hî-mong chhai-siên chiông pún-thon vùn-sá¹³ fuÌk-chá¹³ pin pó-chhùn to vùn-sá¹³ vùn-khien, yèn-heu tén-yit-ha chai siù-chho.'''",
'protectedpagewarning' => "'''Kín-ko: Pún-chông yí-kîn pûn pó-fu, chá¹³Ì-yû yúng-yû Kón-lî-yèn hí-khó-khièn ke yung-fu chhòi-nèn siù-chho.'''",
@@ -850,7 +838,6 @@ Hó-chhiong yit-puk thù-hìn ke suk-thù pán-pún ''(thù-hìn)''.
Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
'fileexists-forbidden' => 'Yí-kîn chhùn-chhai ke siông-thùng miàng-chhṳ̂n ke tóng-on; chhiáng fì-chón pin yung yit-ke sîn-ke miàng-chhṳ̂n lòi song-chhòn chhá¹³Ì tóng-on.[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Chhai khiung-hióng tóng-on-khu chûng yí-kîn chhùn-chhai chhá¹³Ì miàng-chhṳ̂n ke tóng-on; Chhiáng fì-chón pin yung yit-ke sîn-ke miàng-chhṳ̂n lòi song-chhòn chhá¹³Ì tóng-on. [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'Sông-chhòn sṳ̀n-kûng',
'uploadwarning' => 'Sông-chai kín-ko',
'savefile' => 'Pó-chhùn vùn-khien',
'uploadedimage' => 'yí-kîn song-chhòn "[[$1]]"',
@@ -862,6 +849,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
'destfilename' => 'Muk-phêu tóng-on miàng',
'watchthisupload' => 'Kam-sṳ pún tóng-on',
'filewasdeleted' => 'Chṳ̂-chhièn yí-kîn yû yit-ke thùng-miàng tóng-on pûn song-chhòn heu yu-pûn chhù-thet. Chhai song-chhòn chhá¹³Ì tóng-on chṳ̂-chhièn sî-yeu kiám-chhà $1.',
+'upload-success-subj' => 'Sông-chhòn sṳ̀n-kûng',
'upload-proto-error' => 'HiaÌp-ngi chho-ngu',
'upload-proto-error-text' => 'Yén-chhàng song-chhòn yêu-khiù URL yung <code>http://</code> feÌt-chá <code>ftp://</code> khôi-thèu.',
@@ -1080,7 +1068,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Kam-sá¹³ lieÌt-péu',
'mywatchlist' => 'Ngài-ke kam-sá¹³ lieÌt-péu',
-'watchlistfor' => "('''$1''' ke kam-sá¹³ lieÌt-péu)",
'nowatchlist' => 'Ngì ke kam-sá¹³ lieÌt-péu he khûng-hî.',
'watchlistanontext' => 'Chhiáng $1 yî kiám-sá¹³ feÌt-chá phiên-chho ngì-ke kam-sá¹³ lieÌt-péu.',
'watchnologin' => 'Hàn-mò tên-ngiÌp',
@@ -1152,6 +1139,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'alreadyrolled' => 'Mò-fap fî-fuÌk yù [[User:$2|$2]] ([[User talk:$2|thó-lun]]) chin-hàng ke [[$1]] ke chui-heu phiên-siÌp; khì-thâ ngìn yí-kîn phiên-siá feÌt-he fî-fuÌk liáu ke-hong. Chui-heu phiên-siÌp-chá: [[User:$3|$3]] ([[User talk:$3|Thó-lun]])。',
'editcomment' => "Phiên-siá sot-mìn he: \"''\$1''\"。",
'revertpage' => 'Fî-fuÌk yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) ke phiên-cho; kiên-kói fì-fuÌk [[User:$1|$1]] ke chui-heu yit-ke pán-pún',
+
+# Edit tokens
'sessionfailure' => 'Ngì-ke tên-ngiÌp sá¹³-fû yû mun-thì, vi-liáu fòng-chá¹³Ì sêu-sit pûn làn-chiet, pún-chhá¹³ chhâu-chok yí-kîn chhí-sêu, chhiáng-on "song-yit-chông" chhùng-sîn chai-ngiÌp.',
# Protect
@@ -1302,7 +1291,6 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
'ipb-edit-dropdown' => 'Phiên-siá chhà-fûng ngièn-yîn',
'ipb-unblock-addr' => 'Kié-chhù fûng-kim $1',
'ipb-unblock' => 'Kié-chhù kim-fûng yung-fu miàng feÌt-chá IP thi-tiám',
-'ipb-blocklist-addr' => 'Chhà-chhut $1-ke fûng-kim ki-liuÌk',
'ipb-blocklist' => 'Kiám-sá¹³ fûng-kim lieÌt-péu',
'unblockip' => 'Kié-chhù kim-fûng IP thi-tiám',
'unblockiptext' => 'Yung ha-mien ke péu-tân lòi fî-fuÌk siên-chhièn pûn kim-fûng ke IP thi-tiám ke siá-sû-khièn.',
@@ -1615,10 +1603,10 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'mediawarning' => "'''Kín-ko''': Ke-tóng-on khó-nèn pâu-hàm ok-yi am-ho, chṳp-hàng kì khó-nèn tui ngì-ke ne-thúng tai-lòi ngùi-hiám.",
'imagemaxsize' => 'Chhai thù-chhiong mèu-siá chông tui thù-chhiong thai-séu han-chṳ he:',
'thumbsize' => 'LioÌk-thù thai-séu:',
-'file-info' => '(tóng-on thai-séu: $1, MIME lui-hìn: $2)',
-'file-info-size' => '($1 × $2 chhiong-su, tóng-on thai-séu:$3 ,MIME lui-hìn:$4)',
+'file-info' => 'tóng-on thai-séu: $1, MIME lui-hìn: $2',
+'file-info-size' => '$1 × $2 chhiong-su, tóng-on thai-séu:$3 ,MIME lui-hìn:$4',
'file-nohires' => '<small>Mò kien-kô kié-chhiong-thu khó-yî thì-kiûng.</small>',
-'svg-long-desc' => '(SVG tóng-on, péu-mien thai-séu: $1 × $2 siong-su, tóng-on thai-séu: $3)',
+'svg-long-desc' => 'SVG tóng-on, péu-mien thai-séu: $1 × $2 siong-su, tóng-on thai-séu: $3',
'show-big-image' => 'Vàn-cháng ke kié-chhiong-thu',
'show-big-image-thumb' => '<small>Liá-ke puk-suk-thù ke kié-chhiong-thu he: $1 × $2 chhiong-su</small>',
diff --git a/languages/messages/MessagesHaw.php b/languages/messages/MessagesHaw.php
index 94f60461..e79281b9 100644
--- a/languages/messages/MessagesHaw.php
+++ b/languages/messages/MessagesHaw.php
@@ -91,8 +91,7 @@ $messages = array(
'tog-hideminor' => 'E hÅ«nÄ i nÄ ho‘opololei iki ma nÄ loli hou',
'tog-editondblclick' => 'Ho‘opololei i nÄ â€˜ao‘ao ma ke kÅmi pÄlua (JavaScript)',
'tog-showtoc' => 'HÅ‘ike i ka papa kuhikuhi',
-'tog-rememberpassword' => 'Hoʻomanaʻo iaʻu',
-'tog-editwidth' => 'HoÊ»olaulÄ ka pahu loli i ke Äkea holoÊ»okoÊ»a o ka papakaumaka',
+'tog-rememberpassword' => 'HoÊ»omanaÊ»o iaÊ»u ma kÄ“ia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lÄ|mau lÄ}})',
'tog-watchcreations' => 'Ho‘ohui i nÄ â€˜ao‘ao i hana ai au i ka‘u papa nÄnÄ pono',
'tog-watchdefault' => 'Ho‘ohui i nÄ â€˜ao‘ao i ho‘opololei ai au i ka‘u papa nÄnÄ pono',
'tog-watchmoves' => 'Ho‘ohui i nÄ â€˜ao‘ao i ne‘e ai au i ka‘u papa nÄnÄ pono',
@@ -332,7 +331,7 @@ Mai poina e hoÊ»ololi i [[Special:Preferences|kÄu makemake ma {{SITENAME}}]].',
'yourname' => "Inoa mea ho'ohana",
'yourpassword' => 'ʻŌlelo hÅ«nÄ:',
'yourpasswordagain' => "Hua'Ålelo huna hou",
-'remembermypassword' => 'Hoʻomanaʻo iaʻu',
+'remembermypassword' => 'HoÊ»omanaÊ»o iaÊ»u ma kÄ“ia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lÄ|mau lÄ}})',
'login' => 'ʻEʻe',
'nav-login-createaccount' => 'Ê»EÊ»e / E kÄinoa',
'loginprompt' => 'Pono Ê»oe e hoÊ»Ä i nÄ makana (cookies) no ka Ê»eÊ»e Ê»ana i {{SITENAME}}.',
@@ -347,6 +346,7 @@ Mai poina e hoÊ»ololi i [[Special:Preferences|kÄu makemake ma {{SITENAME}}]].',
'gotaccount' => "He moÊ»okÄki kÄu? '''$1'''.",
'gotaccountlink' => 'ʻEʻe',
'createaccountmail' => 'no ka leka uila',
+'createaccountreason' => 'Kumu:',
'badretype' => 'Ê»AÊ»ole like nÄ Ê»Ålelo hÅ«nÄ Äu i hoÊ»okomo ai',
'userexists' => 'Lilo ka inoa mea ho‘ohana.
E koho i kekahi inoa, ke ‘olu‘olu.',
@@ -662,7 +662,6 @@ E Ê»oluÊ»olu, e hÅÊ»oia i ka hoÊ»okÅ«kÅ« Ê»ana i lalo, a laila, e mÄlama i nÄ
# Watchlist
'watchlist' => 'KaÊ»u papa nÄnÄ pono',
'mywatchlist' => 'Ka‘u papa nÄnÄ pono',
-'watchlistfor' => "(no '''$1''')",
'removedwatch' => 'Wehe Ê»ia mai kÄu papa nÄnÄ pono',
'removedwatchtext' => 'Wehe Ê»ia Ê»o "[[:$1]]" mai [[Special:Watchlist|kÄu papa nÄnÄ pono]].',
'watch' => 'E kia‘i',
@@ -832,6 +831,7 @@ Hiki iÄ Ê»oe ke Ê»ikena i kÄna molekumu.',
'nextdiff' => 'Hoʻololi hou aʻe →',
# Media information
+'file-info-size' => '$1 x $2 kiʻiʻuku, nui faila: $3, ʻano MIME: $4',
'show-big-image' => 'Miomio piha',
# Special:NewFiles
diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php
index 98236680..c71e3095 100644
--- a/languages/messages/MessagesHe.php
+++ b/languages/messages/MessagesHe.php
@@ -9,11 +9,13 @@
*
* @author Agbad
* @author Amire80
+ * @author Drorsnir
* @author Ijon
* @author Rotem Dan (July 2003)
* @author Rotem Liss (March 2006 on)
* @author Rotemliss
* @author YaronSh
+ * @author ערן
* @author שומבלע
*/
@@ -152,6 +154,7 @@ $magicWords = array(
'nse' => array( '0', 'מרחב ×©× ×ž×§×•×“×“:', 'NSE:' ),
'localurl' => array( '0', 'כתובת יחסית:', 'LOCALURL:' ),
'localurle' => array( '0', 'כתובת יחסית מקודד:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'נתיב הדפי×', 'ARTICLEPATH' ),
'server' => array( '0', 'כתובת השרת', 'שרת', 'SERVER' ),
'servername' => array( '0', '×©× ×”×©×¨×ª', 'SERVERNAME' ),
'scriptpath' => array( '0', 'נתיב הקבצי×', 'SCRIPTPATH' ),
@@ -168,6 +171,7 @@ $magicWords = array(
'revisionday' => array( '1', '×™×•× ×’×¨×¡×”', 'REVISIONDAY' ),
'revisionday2' => array( '1', '×™×•× ×’×¨×¡×” 2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'חודש גרסה', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'חודש גרסה 1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'שנת גרסה', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'זמן גרסה', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'כותב גרסה', 'REVISIONUSER' ),
@@ -209,6 +213,9 @@ $magicWords = array(
'staticredirect' => array( '1', '__הפניה_קבועה__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'רמת הגנה', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'עיצוב ת×ריך', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'נתיב', 'PATH' ),
+ 'url_wiki' => array( '0', 'ויקי', 'WIKI' ),
+ 'url_query' => array( '0', 'ש×ילתה', 'QUERY' ),
);
$specialPageAliases = array(
@@ -222,6 +229,7 @@ $specialPageAliases = array(
'Watchlist' => array( 'רשימת_המעקב', 'רשימת_מעקב', 'רשימת_המעקב_שלי' ),
'Recentchanges' => array( 'שינויי×_×חרוני×' ),
'Upload' => array( 'העל××”', 'העל×ת_קובץ_לשרת' ),
+ 'UploadStash' => array( 'מ×גר_העל×ות' ),
'Listfiles' => array( 'רשימת_קבצי×', 'רשימת_תמונות', 'קבצי×', 'תמונות' ),
'Newimages' => array( 'קבצי×_חדשי×', 'תמונות_חדשות', 'גלריית_קבצי×_חדשי×', 'גלריית_תמונות_חדשות' ),
'Listusers' => array( 'רשימת_משתמשי×', 'משתמשי×' ),
@@ -256,6 +264,7 @@ $specialPageAliases = array(
'Allpages' => array( 'כל_הדפי×' ),
'Prefixindex' => array( 'דפי×_המתחילי×_ב' ),
'Ipblocklist' => array( 'רשימת_חסומי×', 'רשימת_משתמשי×_חסומי×', 'משתמשי×_חסומי×' ),
+ 'Unblock' => array( 'שחרור_חסימה' ),
'Specialpages' => array( 'דפי×_מיוחדי×' ),
'Contributions' => array( 'תרומות', 'תרומות_המשתמש' ),
'Emailuser' => array( 'שליחת_דו×ר_למשתמש' ),
@@ -300,6 +309,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'תרומות_מחוקות' ),
'Tags' => array( 'תגיות' ),
'Activeusers' => array( 'משתמשי×_פעילי×' ),
+ 'ComparePages' => array( 'השוו×ת_דפי×' ),
+ 'Badtitle' => array( 'כותרת_שגויה' ),
+ 'DisableAccount' => array( 'ביטול_חשבון' ),
);
$namespaceNames = array(
@@ -342,8 +354,7 @@ $messages = array(
'tog-editsection' => 'עריכת פסק×ות ב×מצעות ×§×™×©×•×¨×™× ×ž×”×¦×•×¨×” [עריכה]',
'tog-editsectiononrightclick' => 'עריכת פסק×ות על ידי לחיצה ימנית על כותרות הפסק×ות (דרוש JavaScript)',
'tog-showtoc' => 'הצגת תוכן ×¢× ×™×™× ×™× (עבור ×“×¤×™× ×¢× ×™×•×ª×¨ מ־3 כותרות)',
-'tog-rememberpassword' => 'זכירת הכניסה שלי במחשב זה',
-'tog-editwidth' => 'הרחבת תיבת העריכה כך ×©×ª×ž×œ× ×ת החלון כולו',
+'tog-rememberpassword' => 'זכירת הכניסה שלי בדפדפן ×–×” (למשך עד {{PLURAL:$1|×™×•× ×חד|$1 ימי×|יומיי×}})',
'tog-watchcreations' => 'מעקב ×חרי ×“×¤×™× ×©×™×¦×¨×ª×™',
'tog-watchdefault' => 'מעקב ×חרי ×“×¤×™× ×©×¢×¨×›×ª×™',
'tog-watchmoves' => 'מעקב ×חרי ×“×¤×™× ×©×”×¢×‘×¨×ª×™',
@@ -358,7 +369,7 @@ $messages = array(
'tog-enotifrevealaddr' => 'חשיפת כתובת הדו×"ל שלך בהודעות דו×ר',
'tog-shownumberswatching' => 'הצגת מספר ×”×ž×©×ª×ž×©×™× ×”×¢×•×§×‘×™× ×חרי הדף',
'tog-oldsig' => 'תצוגה מקדימה של החתימה הקיימת:',
-'tog-fancysig' => 'לפרש ×ת החתימה כקוד ויקי (×œ×œ× ×§×™×©×•×¨ ×וטומטי)',
+'tog-fancysig' => 'פירוש החתימה כקוד ויקי (×œ×œ× ×§×™×©×•×¨ ×וטומטי)',
'tog-externaleditor' => 'שימוש בעורך חיצוני כברירת מחדל (×œ×ž×©×ª×ž×©×™× ×ž×•×ž×—×™× ×‘×œ×‘×“, דורש הגדרות מיוחדות במחשב. [http://www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
'tog-externaldiff' => 'שימוש בתוכנת השוו×ת הגרס×ות החיצונית כברירת מחדל (×œ×ž×©×ª×ž×©×™× ×ž×•×ž×—×™× ×‘×œ×‘×“, דורש הגדרות מיוחדות במחשב. [http://www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "קפוץ ×ל"',
@@ -489,31 +500,21 @@ $messages = array(
'faqpage' => 'Project:ש×לות ותשובות',
# Vector skin
-'vector-action-addsection' => 'הוספת נוש×',
-'vector-action-delete' => 'מחיקה',
-'vector-action-move' => 'העברה',
-'vector-action-protect' => '×”×’× ×”',
-'vector-action-undelete' => 'ביטול מחיקה',
-'vector-action-unprotect' => 'הסרת הגנה',
-'vector-namespace-category' => 'קטגוריה',
-'vector-namespace-help' => 'דף עזרה',
-'vector-namespace-image' => 'קובץ',
-'vector-namespace-main' => 'דף',
-'vector-namespace-media' => 'דף מדיה',
-'vector-namespace-mediawiki' => 'הודעה',
-'vector-namespace-project' => 'דף מיז×',
-'vector-namespace-special' => 'דף מיוחד',
-'vector-namespace-talk' => 'שיחה',
-'vector-namespace-template' => 'תבנית',
-'vector-namespace-user' => 'דף משתמש',
-'vector-view-create' => 'יצירה',
-'vector-view-edit' => 'עריכה',
-'vector-view-history' => 'הצגת היסטוריה',
-'vector-view-view' => 'קרי××”',
-'vector-view-viewsource' => 'הצגת מקור',
-'actions' => 'פעולות',
-'namespaces' => 'מרחבי ש×',
-'variants' => 'גרס×ות שפה',
+'vector-action-addsection' => 'הוספת נוש×',
+'vector-action-delete' => 'מחיקה',
+'vector-action-move' => 'העברה',
+'vector-action-protect' => '×”×’× ×”',
+'vector-action-undelete' => 'ביטול מחיקה',
+'vector-action-unprotect' => 'הסרת הגנה',
+'vector-simplesearch-preference' => 'הפעלת הצעות החיפוש המשופרות (בעיצוב וקטור בלבד)',
+'vector-view-create' => 'יצירה',
+'vector-view-edit' => 'עריכה',
+'vector-view-history' => 'הצגת היסטוריה',
+'vector-view-view' => 'קרי××”',
+'vector-view-viewsource' => 'הצגת מקור',
+'actions' => 'פעולות',
+'namespaces' => 'מרחבי ש×',
+'variants' => 'גרס×ות שפה',
'errorpagetitle' => 'שגי××”',
'returnto' => 'חזרה לדף $1.',
@@ -574,6 +575,9 @@ $messages = array(
×× × ×”×ž×ª×™× ×• זמן מה לפני שתנסו שוב לצפות בדף.
$1',
+'pool-timeout' => 'זמן ההמתנה ×œ×¡×™×•× ×”× ×¢×™×œ×” עבר',
+'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}}',
@@ -734,7 +738,8 @@ $2',
'yourname' => '×©× ×ž×©×ª×ž×©:',
'yourpassword' => 'סיסמה:',
'yourpasswordagain' => 'הקש סיסמה שנית:',
-'remembermypassword' => 'זכירת הכניסה במחשב זה',
+'remembermypassword' => 'זכירת הכניסה שלי בדפדפן ×”×–×” (ל{{PLURAL:$1|×™×•× ×חד|Ö¾$1 ימי×|יומיי×}} לכל היותר)',
+'securelogin-stick-https' => 'המשך שימוש ב־HTTPS ×חרי הכניסה',
'yourdomainname' => '×”×ª×—×•× ×©×œ×š:',
'externaldberror' => 'הייתה שגי××” בבסיס ×”× ×ª×•× ×™× ×©×œ ההזדהות, ×ו ש××™× ×›× ×¨×©××™× ×œ×¢×“×›×Ÿ ×ת ×—×©×‘×•× ×›× ×”×—×™×¦×•× ×™.',
'login' => 'כניסה לחשבון',
@@ -751,6 +756,7 @@ $2',
'gotaccount' => 'כבר נרשמת×? $1.',
'gotaccountlink' => 'כניסה לחשבון',
'createaccountmail' => 'ב×מצעות דו×"ל',
+'createaccountreason' => 'סיבה:',
'badretype' => 'הסיסמ×ות ×©×”×–× ×ª× ×ינן מת×ימות.',
'userexists' => '×©× ×”×ž×©×ª×ž×© ×©×‘×—×¨×ª× × ×ž×¦× ×‘×©×™×ž×•×©.
×× × ×‘×—×¨×• ×©× ×חר.',
@@ -775,6 +781,7 @@ $2',
'wrongpasswordempty' => 'הסיסמה ×©×”×§×œ×“×ª× ×¨×™×§×”. ×× × × ×¡×• שוב.',
'passwordtooshort' => 'סיסמ×ות חייבות להיות ב×ורך {{PLURAL:$1|תו ×חד|$1 תווי×}} לפחות.',
'password-name-match' => '×¡×™×¡×ž×ª×›× ×—×™×™×‘×ª להיות שונה ×ž×©× ×”×ž×©×ª×ž×© שלכ×.',
+'password-login-forbidden' => 'השימוש ×‘×©× ×”×ž×©×ª×ž×© והסיסמה ×”×לה × ×סר.',
'mailmypassword' => 'שלחו לי סיסמה חדשה',
'passwordremindertitle' => 'סיסמה זמנית חדשה מ{{grammar:תחילית|{{SITENAME}}}}',
'passwordremindertext' => 'מישהו (ככל הנר××” ×ת×, מכתובת ×”Ö¾IP מספר $1) ביקש סיסמה
@@ -789,7 +796,8 @@ $2',
'passwordsent' => 'סיסמה חדשה נשלחה לכתובת הדו×ר ×”×לקטרוני הרשומה עבור "$1".
×× × ×”×™×›× ×¡×• חזרה ל×תר ×חרי שתקבלו ×ותה.',
'blocked-mailpassword' => 'כתובת ×”Ö¾IP ×©×œ×›× ×—×¡×•×ž×” מעריכה, ולפיכך ××™× ×›× ×ž×•×¨×©×™× ×œ×”×©×ª×ž×© ב×פשרות שחזור הסיסמה כדי למנוע ניצול לרעה של התכונה.',
-'eauthentsent' => 'דו×"ל ×ימות נשלח לכתובת הדו×"ל שקבעת. לפני שדברי דו×"ל ××—×¨×™× × ×©×œ×—×™× ×œ×—×©×‘×•×Ÿ ×”×–×”, תצטרך לפעול לפי ההור×ות בדו×"ל כדי ×œ×•×•×“× ×©×”×“×•×"ל ×”×•× ×כן שלך.',
+'eauthentsent' => 'דו×"ל ×ימות נשלח לכתובת הדו×"ל שקבעת.
+לפני שדברי דו×"ל ××—×¨×™× ×™×™×©×œ×—×• לחשבון ×”×–×”, ×™×”×™×” עליך לפעול לפי ההור×ות בדו×"ל, כדי ל×שר שהחשבון ×כן שייך לך.',
'throttled-mailpassword' => 'כבר נעשה שימוש ב×פשרות שחזור הסיסמה ב{{PLURAL:$1|שעה ×”×חרונה|Ö¾$1 השעות ×”×חרונות}}. כדי למנוע ניצול לרעה, רק דו×ר ×חד ×›×–×” יכול להישלח כל {{PLURAL:$1|שעה ×חת|$1 שעות}}.',
'mailerror' => 'שגי××” בשליחת דו×ר: $1',
'acct_creation_throttle_hit' => '×ž×‘×§×¨×™× ×‘×תר ×–×” דרך כתובת ×”Ö¾IP ×©×œ×›× ×›×‘×¨ יצרו {{PLURAL:$1|חשבון ×חד|$1 חשבונות}} ×‘×™×•× ×”×חרון. זהו ×”×ž×§×¡×™×ž×•× ×”×ž×•×ª×¨ בתקופה זו.
@@ -812,6 +820,9 @@ $2',
'loginlanguagelabel' => 'שפה: $1',
'suspicious-userlogout' => '×‘×§×©×ª×›× ×œ×¦×ת מהחשבון נדחתה כיוון שנר××” ×©×”×™× × ×©×œ×—×” על ידי דפדפן שבור ×ו שרת פרוקסי ×¢× ×–×™×›×¨×•×Ÿ מטמון.',
+# E-mail sending
+'php-mail-error-unknown' => 'שגי××” ×œ× ×™×“×•×¢×” בפונקציה mail() של PHP',
+
# Password reset dialog
'resetpass' => 'שינוי סיסמה',
'resetpass_announce' => '× ×›× ×¡×ª× ×‘×מצעות סיסמה זמנית שנשלחה ××œ×™×›× ×‘×“×•×"ל.
@@ -862,10 +873,12 @@ $2',
'showlivepreview' => 'תצוגה מקדימה מהירה',
'showdiff' => 'הצגת שינויי×',
'anoneditwarning' => "'''×זהרה:''' ××™× ×›× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ. כתובת ×”Ö¾IP ×©×œ×›× ×ª×™×¨×©× ×‘×”×™×¡×˜×•×¨×™×™×ª העריכות של הדף.",
+'anonpreviewwarning' => "''××™× ×›× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ. שמירה ×ª×’×¨×•× ×œ×›×ª×•×‘×ª ×”Ö¾IP ×©×œ×›× ×œ×”×™×¨×©× ×‘×”×™×¡×˜×•×¨×™×™×ª העריכות של הדף.''",
'missingsummary' => "'''תזכורת:''' ×œ× ×”×–× ×ª× ×ª×§×¦×™×¨ עריכה.
×× ×ª×œ×—×¦×• שוב על הכפתור \"{{int:savearticle}}\", ×¢×¨×™×›×ª×›× ×ª×™×©×ž×¨ בלעדיו.",
'missingcommenttext' => '×× × ×”×§×œ×™×“×• ×ת ההודעה למטה.',
-'missingcommentheader' => "'''תזכורת:''' ×œ× ×”×–× ×ª× × ×•×©×/כותרת להודעה זו. ×× ×ª×œ×—×¦×• שוב על כפתור השמירה, ×¢×¨×™×›×ª×›× ×ª×™×©×ž×¨ בלעדיו.",
+'missingcommentheader' => "'''תזכורת:''' ×œ× ×”×–× ×ª× × ×•×©×/כותרת להודעה זו.
+×× ×ª×œ×—×¦×• שוב על הכפתור \"{{int:savearticle}}\", ×¢×¨×™×›×ª×›× ×ª×™×©×ž×¨ בלעדיו.",
'summary-preview' => 'תצוגה מקדימה של התקציר:',
'subject-preview' => 'תצוגה מקדימה של הנוש×/הכותרת:',
'blockedtitle' => 'המשתמש חסו×',
@@ -940,7 +953,12 @@ $2',
'''×”×•× ×˜×¨× × ×©×ž×¨!'''",
'userjspreview' => "'''זכרו שזו רק בדיקה/תצוגה מקדימה של סקריפט ×”Ö¾JavaScript שלכ×.'''
'''×”×•× ×˜×¨× × ×©×ž×¨!'''",
-'userinvalidcssjstitle' => "'''×זהרה''': העיצוב \"\$1\" ×ינו קיי×. זכרו שדפי CSS ו־JavaScript מות××ž×™× ×ישית ×ž×©×ª×ž×©×™× ×‘×›×•×ª×¨×ª ×¢× ×ותיות קטנות – למשל, {{ns:user}}:דוגמה/monobook.css ×•×œ× {{ns:user}}:דוגמה/Monobook.css. כמו כן, יש להקפיד על שימוש ב־/ ×•×œ× ×‘Ö¾\\.",
+'sitecsspreview' => "'''זכרו שזו רק תצוגה מקדימה של גליון ה־CSS הזה.'''
+'''×”×•× ×˜×¨× × ×©×ž×¨!'''",
+'sitejspreview' => "'''זכרו שזו רק תצוגה מקדימה של קוד ה־JavaScript הזה.'''
+'''×”×•× ×˜×¨× × ×©×ž×¨!'''",
+'userinvalidcssjstitle' => "'''×זהרה''': העיצוב \"\$1\" ×ינו קיי×.
+דפי .css ו־.js מות××ž×™× ×ישית ×ž×©×ª×ž×©×™× ×‘×›×•×ª×¨×ª ×¢× ×ותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ×•×œ× {{ns:user}}:דוגמה/Vector.css.",
'updated' => '(מעודכן)',
'note' => "'''הערה:'''",
'previewnote' => "'''זכרו שזו רק תצוגה מקדימה.'''
@@ -976,9 +994,6 @@ $2',
'yourdiff' => 'הבדלי×',
'copyrightwarning' => "'''שימו לב:''' ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}} ×ª×¤×•×¨×¡× ×ª×—×ª תנ××™ הרישיון $2 (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על ידי ×חרי×, שתופץ לעיני כל, וש××—×¨×™× ×™×•×›×œ×• להעתיק ממנה בציון המקור – ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על ידי זכויות יוצרי×. '''×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!'''",
'copyrightwarning2' => "'''שימו לב:''' ×ª×•×¨×ž×™× ××—×¨×™× ×¢×©×•×™×™× ×œ×¢×¨×•×š ×ו ××£ להסיר ×ת ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}}. ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על ידי ×חרי×, ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על ידי זכויות ×™×•×¦×¨×™× (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). '''×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!'''",
-'longpagewarning' => "'''×זהרה:''' גודל דף ×–×” ×”×•× $1 קילובייטי×.
-×‘×“×¤×“×¤× ×™× ×ž×¡×•×™×ž×™× ×™×”×™×• בעיות בעריכת דף הגדול מ־32 קילובייטי×.
-×× × ×©×™×§×œ×• לחלק דף ×–×” ×œ×“×¤×™× ×§×˜× ×™× ×™×•×ª×¨.",
'longpageerror' => "'''שגי××”: הטקסט ×©×©×œ×—×ª× ×”×•× ×‘×ורך $1 קילובייטי×, ×ך ×סור לו להיות ×רוך יותר ×ž×”×ž×§×¡×™×ž×•× ×©×œ $2 קילובייטי×.'''
×œ× × ×™×ª×Ÿ לשומרו.",
'readonlywarning' => "'''×זהרה: בסיס ×”× ×ª×•× ×™× × × ×¢×œ לצורך תחזוקה. בזמן ×–×” ××™ ×פשר לשמור ×ת הטקסט הערוך.'''
@@ -1009,7 +1024,7 @@ $2',
'permissionserrorstext-withaction' => '××™× ×›× ×ž×•×¨×©×™× $2, {{PLURAL:$1|מהסיבה הב××”|מהסיבות הב×ות}}:',
'recreate-moveddeleted-warn' => "'''×זהרה: ×”× ×›× ×™×•×¦×¨×™× ×“×£ חדש שנמחק בעבר.'''
-×× × ×©×§×œ×• ×× ×™×”×™×” ×–×” נכון להמשיך לערוך ×ת הדף.
+כד××™ לשקול ×× ×™×”×™×” ×–×” נכון להמשיך לערוך ×ת הדף.
יומני המחיקות וההעברות של הדף ×ž×•×¦×’×™× ×œ×”×œ×Ÿ:",
'moveddeleted-notice' => 'דף זה נמחק.
יומני המחיקות וההעברות של הדף ×ž×•×¦×’×™× ×œ×”×œ×Ÿ.',
@@ -1154,6 +1169,8 @@ $1",
'logdelete-failure' => "'''×œ× × ×™×ª×Ÿ ×”×™×” לבצע ×ת הסתרת פעולת היומן:'''
$1",
'revdel-restore' => 'שינוי ההצגה',
+'revdel-restore-deleted' => 'גרס×ות מחוקות',
+'revdel-restore-visible' => 'גרס×ות גלויות',
'pagehist' => 'היסטוריית הדף',
'deletedhist' => 'הגרס×ות המחוקות',
'revdelete-content' => 'התוכן',
@@ -1223,11 +1240,13 @@ $1",
# Diffs
'history-title' => 'היסטוריית הגרס×ות של $1',
'difference' => '(×”×‘×“×œ×™× ×‘×™×Ÿ גרס×ות)',
+'difference-multipage' => '(×”×‘×“×œ×™× ×‘×™×Ÿ דפי×)',
'lineno' => 'שורה $1:',
'compareselectedversions' => 'השוו×ת הגרס×ות שנבחרו',
'showhideselectedversions' => 'הצגת/הסתרת הגרס×ות שנבחרו',
'editundo' => 'ביטול',
-'diff-multi' => '({{PLURAL:$1|גרסת ×‘×™× ×™×™× ×חת ××™× ×” מוצגת|$1 גרס×ות ×‘×™× ×™×™× ×ינן מוצגות}})',
+'diff-multi' => '({{PLURAL:$1|גרסת ×‘×™× ×™×™× ×חת|$1 גרס×ות ביניי×}} של {{PLURAL:$2|משתמש ×חד|$2 משתמשי×}} {{PLURAL:$1|××™× ×” מוצגת|×ינן מוצגות}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|גרסת ×‘×™× ×™×™× ×חת|$1 גרס×ות ביניי×}} של יותר מ{{PLURAL:$2|משתמש ×חד|Ö¾$2 משתמשי×}} ×ינן מוצגות)',
# Search results
'searchresults' => 'תוצ×ות החיפוש',
@@ -1262,6 +1281,7 @@ $1",
'searchprofile-everything-tooltip' => 'חיפוש בכל התוכן (למעט דפי השיחה)',
'searchprofile-advanced-tooltip' => 'חיפוש במרחבי ×©× ×ž×•×ª××ž×™× ×ישית',
'search-result-size' => '$1 ({{PLURAL:$2|מילה ×חת|$2 מילי×}})',
+'search-result-category-size' => '{{PLURAL:$1|חבר ×חד|$1 חברי×}} ({{PLURAL:$2|קטגוריית משנה ×חת|$2 קטגוריות משנה}}, {{PLURAL:$3|קובץ ×חד|$3 קבצי×}})',
'search-result-score' => 'רלוונטיות: $1%',
'search-redirect' => '(הפניה $1)',
'search-section' => '(פסקה $1)',
@@ -1336,6 +1356,7 @@ $1",
'contextlines' => 'שורות לכל תוצ××”:',
'contextchars' => 'מספר תווי קונטקסט בשורה:',
'stub-threshold' => 'סף לעיצוב <a href="#" class="stub">קישורי×</a> ×œ×§×¦×¨×ž×¨×™× (בתי×):',
+'stub-threshold-disabled' => 'מבוטל',
'recentchangesdays' => 'מספר ×”×™×ž×™× ×©×™×•×¦×’×• בדף ×”×©×™× ×•×™×™× ×”×חרוני×:',
'recentchangesdays-max' => 'לכל היותר {{PLURAL:$1|×™×•× ×חד|$1 ימי×}}',
'recentchangescount' => 'מספר העריכות שיוצגו כברירת מחדל:',
@@ -1369,6 +1390,7 @@ $1",
'prefs-files' => 'קבצי×',
'prefs-custom-css' => 'קובץ CSS מות×× ×ישית',
'prefs-custom-js' => 'קובץ JavaScript מות×× ×ישית',
+'prefs-common-css-js' => 'קובצי CSS/JavaScript ×ž×©×•×ª×¤×™× ×œ×›×œ העיצובי×:',
'prefs-reset-intro' => 'ב××¤×©×¨×•×ª×›× ×œ×”×©×ª×ž×© בדף ×–×” כדי להחזיר ×ת ההעדפות ×©×œ×›× ×œ×”×’×“×¨×•×ª ברירת המחדל של ×”×תר.
×œ× × ×™×ª×Ÿ לבטל פעולה זו.',
'prefs-emailconfirm-label' => '×ימות כתובת דו×"ל:',
@@ -1408,9 +1430,15 @@ $1",
'prefs-advancedrendering' => '×פשרויות מתקדמות',
'prefs-advancedsearchoptions' => '×פשרויות מתקדמות',
'prefs-advancedwatchlist' => '×פשרויות מתקדמות',
-'prefs-display' => '×פשרויות תצוגה',
+'prefs-displayrc' => '×פשרויות תצוגה',
+'prefs-displaysearchoptions' => '×פשרויות תצוגה',
+'prefs-displaywatchlist' => '×פשרויות תצוגה',
'prefs-diffs' => '×”×‘×“×œ×™× ×‘×™×Ÿ גרס×ות',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'כתובת הדו×ר ×”×לקטרוני נר×ית תקינה',
+'email-address-validity-invalid' => 'יש להקליד כתובת דו×ר ×לקטרוני תקינה',
+
# User rights
'userrights' => 'ניהול הרש×ות משתמש',
'userrights-lookup-user' => 'ניהול קבוצות משתמש',
@@ -1494,6 +1522,7 @@ $1",
'right-hideuser' => 'חסימת ×©× ×ž×©×ª×ž×© תוך הסתרתו מהציבור',
'right-ipblock-exempt' => 'עקיפת חסימות של כתובת IP, חסימות ×וטומטיות וחסימות טווח',
'right-proxyunbannable' => 'עקיפת חסימות ×וטומטיות של שרתי פרוקסי',
+'right-unblockself' => 'שחרור חסימה של עצמ×',
'right-protect' => 'שינוי רמות ×”×’× ×” ועריכת ×“×¤×™× ×ž×•×’× ×™×',
'right-editprotected' => 'עריכת ×“×¤×™× ×ž×•×’× ×™× (×œ×œ× ×”×’× ×” מדורגת)',
'right-editinterface' => 'עריכת ממשק המשתמש',
@@ -1516,7 +1545,6 @@ $1",
'right-siteadmin' => 'נעילת וביטול נעילת בסיס הנתוני×',
'right-reset-passwords' => '×יפוס סיסמ×ות של ×ž×©×ª×ž×©×™× ×חרי×',
'right-override-export-depth' => '×™×™×¦×•× ×“×¤×™× ×›×•×œ×œ ×“×¤×™× ×ž×§×•×©×¨×™× ×¢×“ עומק של חמישה',
-'right-versiondetail' => 'צפייה במידע המורחב על גרסת התוכנה',
'right-sendemail' => 'שליחת דו×ר ×לקטרוני ×œ×ž×©×ª×ž×©×™× ×חרי×',
# User rights log
@@ -1567,14 +1595,9 @@ $1",
'recentchanges-legend' => '×פשרויות ×‘×©×™× ×•×™×™× ×”×חרוני×',
'recentchangestext' => 'ניתן לעקוב ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.',
'recentchanges-feed-description' => 'ניתן לעקוב ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.',
-'recentchanges-label-legend' => 'מקר×: $1',
-'recentchanges-legend-newpage' => '$1 - דף חדש',
'recentchanges-label-newpage' => 'בעריכה זו נוצר דף חדש',
-'recentchanges-legend-minor' => '$1 - עריכה משנית',
'recentchanges-label-minor' => 'זוהי עריכה משנית',
-'recentchanges-legend-bot' => '$1 - עריכה של בוט',
'recentchanges-label-bot' => 'עריכה זו בוצעה על ידי בוט',
-'recentchanges-legend-unpatrolled' => '$1 - עריכה ×©×œ× × ×‘×“×§×”',
'recentchanges-label-unpatrolled' => 'עריכה זו ×˜×¨× × ×‘×“×§×”',
'rcnote' => "להלן {{PLURAL:$1|השינוי ×”×חרון|'''$1''' ×”×©×™× ×•×™×™× ×”×חרוני×}} {{PLURAL:$2|×‘×™×•× ×”×חרון|ב־$2 ×”×™×ž×™× ×”×חרוני×}}, עד $5, $4:",
'rcnotefrom' => 'להלן <b>$1</b> ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• החל מת×ריך <b>$2</b>:',
@@ -1623,6 +1646,9 @@ $1",
'upload_directory_missing' => 'שרת ×”×ינטרנט ×ינו יכול ליצור ×ת תיקיית ההעל×ות ($1) החסרה.',
'upload_directory_read_only' => 'שרת ×”×ינטרנט ×ינו יכול לכתוב בתיקיית ההעל×ות ($1).',
'uploaderror' => 'שגי××” בהעל×ת הקובץ',
+'upload-recreate-warning' => "'''×זהרה: קובץ ×‘×©× ×–×” נמחק ×ו הועבר.'''
+
+יומני המחיקות וההעברות של הדף ×ž×•×¦×’×™× ×œ×”×œ×Ÿ:",
'uploadtext' => "השתמשו בטופס להלן כדי להעלות קבצי×.
כדי לר×ות ×ו לחפש ×§×‘×¦×™× ×©×”×•×¢×œ×• בעבר ×× × ×¤× ×• ל[[Special:FileList|רשימת ×”×§×‘×¦×™× ×©×”×•×¢×œ×•]], וכמו כן, העל×ות (כולל העל×ות של גרסה חדשה) מוצגות ב[[Special:Log/upload|יומן ההעל×ות]], ומחיקות ב[[Special:Log/delete|יומן המחיקות]].
@@ -1656,9 +1682,20 @@ $1",
{{PLURAL:\$3|סוג הקובץ המומלץ הו×|סוגי ×”×§×‘×¦×™× ×”×ž×•×ž×œ×¦×™× ×”×}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' ×”×•× ×¡×•×’ קובץ ×סור להעל××”. {{PLURAL:\$3|סוג הקובץ המותר הו×|סוגי ×”×§×‘×¦×™× ×”×ž×•×ª×¨×™× ×”×}} \$2.",
'filetype-missing' => 'לקובץ ×ין סיומת (כדוגמת ".jpg").',
+'empty-file' => 'הקובץ ששלחת היה ריק',
+'file-too-large' => 'הקובץ ששלחת היה גדול מדי',
+'filename-tooshort' => '×©× ×”×§×•×‘×¥ קצר מדי',
+'filetype-banned' => 'סוג הקובץ ×”×–×” ×סור להעל××”',
+'verification-error' => 'קובץ ×–×” ×œ× ×¢×‘×¨ ×ת תהליך ×ימות הקבצי×',
+'hookaborted' => 'השינוי שניסית לבצע הופסק על ידי מבנה Hook של הרחבה',
+'illegal-filename' => '×©× ×”×§×•×‘×¥ ×ינו מותר להעל××”',
+'overwrite' => 'דריסת קובץ ×§×™×™× ××™× ×” מותרת',
+'unknown-error' => '×ירעה שגי××” בלתי ידועה',
+'tmp-create-error' => '×œ× × ×™×ª×Ÿ ליצור קובץ זמני',
+'tmp-write-error' => 'שגי××” בכתיבה לקובץ הזמני',
'large-file' => 'מומלץ ×©×”×§×‘×¦×™× ×œ× ×™×”×™×• ×’×“×•×œ×™× ×™×•×ª×¨ מ־$1 (גודל הקובץ ×©×”×¢×œ×™×ª× ×”×•× $2).',
'largefileserver' => 'גודל הקובץ ×©×”×¢×œ×™×ª× ×—×•×¨×’ ממגבלת השרת.',
-'emptyfile' => 'הקובץ ×©×”×¢×œ×™×ª× ×¨×™×§. ייתכן שהסיבה לכך ×”×™× ×©×’×™×ת הקלדה ×‘×©× ×”×§×•×‘×¥. ×× × ×•×“×ו שזהו הקובץ שברצונך להעלות.',
+'emptyfile' => 'נר××” שהקובץ ×©×”×¢×œ×™×ª× ×¨×™×§. ייתכן שהסיבה לכך ×”×™× ×©×’×™×ת הקלדה ×‘×©× ×”×§×•×‘×¥. ×× × ×•×“×ו שזהו הקובץ ×©×‘×¨×¦×•× ×›× ×œ×”×¢×œ×•×ª.',
'fileexists' => "קובץ ×‘×©× ×–×” כבר קיי×, ×× × ×‘×“×§×• ×ת '''<tt>[[:$1]]</tt>''' ×× ××™× ×›× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×—×œ×™×£ ×ותו.
[[$1|thumb]]",
'filepageexists' => "דף תי×ור הקובץ עבור קובץ ×–×” כבר נוצר ב'''<tt>[[:$1]]</tt>''', ×ך ×œ× ×§×™×™× ×§×•×‘×¥ ×‘×©× ×–×”.
@@ -1682,13 +1719,14 @@ $1",
'file-exists-duplicate' => 'קובץ ×–×” ×–×”×” {{PLURAL:$1|לקובץ הב×|×œ×§×‘×¦×™× ×”×‘××™×}}:',
'file-deleted-duplicate' => 'קובץ זהה לקובץ זה ([[:$1]]) נמחק בעבר.
×× × ×‘×“×§×• ×ת היסטוריית המחיקה של הקובץ לפני שתעלו ×ותו מחדש.',
-'successfulupload' => 'העל×ת הקובץ הושלמה בהצלחה',
'uploadwarning' => '×זהרת העל×ת קבצי×',
'uploadwarning-text' => '×× × ×©× ×• ×ת תי×ור הקובץ שלמטה ונסו שוב.',
'savefile' => 'שמירת קובץ',
'uploadedimage' => 'העלה ×ת הקובץ [[$1]]',
'overwroteimage' => 'העלה גרסה חדשה של הקובץ [[$1]]',
'uploaddisabled' => 'העל×ת ×§×‘×¦×™× ×ž×‘×•×˜×œ×ª.',
+'copyuploaddisabled' => 'העל×ת ×§×‘×¦×™× ×ž×›×ª×•×‘×ª URL מבוטלת.',
+'uploadfromurl-queued' => 'העל××ª×›× ×”×•×¢×‘×¨×” לתור המשימות.',
'uploaddisabledtext' => '×פשרות העל×ת ×”×§×‘×¦×™× ×ž×‘×•×˜×œ×ª.',
'php-uploaddisabledtext' => '×פשרות העל×ת ×”×§×‘×¦×™× ×ž×‘×•×˜×œ×ª ברמת PHP. ×× × ×‘×“×§×• ×ת ההגדרה file_uploads.',
'uploadscripted' => 'הקובץ כולל קוד סקריפט ×ו HTML שעשוי להתפרש ×ו להתבצע בטעות על ידי הדפדפן.',
@@ -1722,6 +1760,14 @@ JD # Jenoptik
MGP # Pentax
PICT # שונות
#</pre> <!-- × × ×œ×”×©×יר שורה זו בדיוק כפי ×©×”×™× -->',
+'upload-success-subj' => 'ההעל××” הושלמה בהצלחה',
+'upload-success-msg' => 'ההעל××” מהכתובת [$2] הושלמה בהצלחה. הקובץ ×©×”×¢×œ×™×ª× ×–×ž×™×Ÿ ×›×ן: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'בעיה בהעל××”',
+'upload-failure-msg' => 'הייתה בעיה ×¢× ×”×§×•×‘×¥ ×©×”×¢×œ×™×ª× ×ž×”×›×ª×•×‘×ª [$2]:
+
+$1',
+'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>.',
@@ -1783,6 +1829,7 @@ PICT # שונות
'listfiles_search_for' => 'חיפוש קובץ מדיה בש×:',
'imgfile' => 'קובץ',
'listfiles' => 'רשימת קבצי×',
+'listfiles_thumb' => 'תמונה ממוזערת',
'listfiles_date' => 'ת×ריך',
'listfiles_name' => 'ש×',
'listfiles_user' => 'משתמש',
@@ -1827,6 +1874,7 @@ PICT # שונות
'shared-repo-from' => 'מתוך $1',
'shared-repo' => '×ž×§×•× ×יחסון משותף',
'shared-repo-name-wikimediacommons' => 'ויקישיתוף',
+'filepage.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן יוכללו בדף תי×ור הקובץ, כולל ב×תרי ויקי ×–×¨×™× */',
# File reversion
'filerevert' => 'שחזור $1',
@@ -1900,8 +1948,8 @@ PICT # שונות
'statistics-edits' => 'העריכות מ××– תחילת הפעולה של {{SITENAME}}',
'statistics-edits-average' => 'מספר העריכות הממוצע לדף',
'statistics-views-total' => 'מספר הצפיות הכולל',
+'statistics-views-total-desc' => 'צפיות ×‘×“×¤×™× ×©××™× × ×§×™×™×ž×™× ×•×‘×“×¤×™× ×ž×™×•×—×“×™× ×ינן כלולות',
'statistics-views-peredit' => 'מספר הצפיות לעריכה',
-'statistics-jobqueue' => '×ורך [http://www.mediawiki.org/wiki/Manual:Job_queue תור המשימות]',
'statistics-users' => '×”[[Special:ListUsers|משתמשי×]] הרשומי×',
'statistics-users-active' => '×”×ž×©×ª×ž×©×™× ×”×¤×¢×™×œ×™×',
'statistics-users-active-desc' => '×ž×©×ª×ž×©×™× ×©×‘×™×¦×¢×• פעולה כלשהי ב{{PLURAL:$1|×™×•× ×”×חרון|Ö¾$1 ×”×™×ž×™× ×”×חרוני×}}',
@@ -1916,7 +1964,7 @@ PICT # שונות
'doubleredirects' => 'הפניות כפולות',
'doubleredirectstext' => 'ההפניות הב×ות מפנות לדפי הפניה ×חרי×.
כל שורה מכילה קישור להפניות הר×שונה והשנייה, וכן ×ת היעד של ההפניה השנייה, ×©×”×™× ×œ×¨×•×‘ היעד ×”"×מיתי" של ההפניה, ×ליו ×מורה ההפניה הר×שונה להצביע.
-×¢×¨×›×™× <s>מחוקי×</s> כבר תוקנו.',
+×¢×¨×›×™× <del>מחוקי×</del> כבר תוקנו.',
'double-redirect-fixed-move' => '[[$1]] הועבר. כעת ×”×•× ×”×¤× ×™×” לדף [[$2]].',
'double-redirect-fixer' => 'מתקן הפניות',
@@ -1939,6 +1987,8 @@ PICT # שונות
'nmembers' => '{{PLURAL:$1|דף ×חד|$1 דפי×}}',
'nrevisions' => '{{PLURAL:$1|גרסה ×חת|$1 גרס×ות}}',
'nviews' => '{{PLURAL:$1|צפייה ×חת|$1 צפיות}}',
+'nimagelinks' => 'בשימוש ב{{PLURAL:$1|דף ×חד|Ö¾$1 דפי×}}',
+'ntransclusions' => 'בשימוש ב{{PLURAL:$1|דף ×חד|Ö¾$1 דפי×}}',
'specialpage-empty' => '×ין תוצ×ות.',
'lonelypages' => '×“×¤×™× ×™×ª×•×ž×™×',
'lonelypagestext' => '×”×“×¤×™× ×”×‘××™× ××™× × ×ž×§×•×©×¨×™× ×ž×“×¤×™× ××—×¨×™× ×‘×תר ×–×” ו××™× × ×ž×•×›×œ×œ×™× ×‘×”×.',
@@ -2095,34 +2145,40 @@ PICT # שונות
'listgrouprights-removegroup-self-all' => 'הסרת כל הקבוצות מהחשבון ×”×ישי',
# E-mail user
-'mailnologin' => '×ין כתובת לשליחה',
-'mailnologintext' => '×¢×œ×™×›× [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר ×œ×¢×¦×ž×›× ×›×ª×•×‘×ª דו×ר ×לקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] ×©×œ×›× ×›×“×™ לשלוח דו×ר למשתמש ×חר.',
-'emailuser' => 'שליחת דו×ר ×לקטרוני למשתמש ×–×”',
-'emailpage' => 'שליחת דו×ר למשתמש',
-'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דו×ר ×לקטרוני למשתמש ×–×”.
+'mailnologin' => '×ין כתובת לשליחה',
+'mailnologintext' => '×¢×œ×™×›× [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר ×œ×¢×¦×ž×›× ×›×ª×•×‘×ª דו×ר ×לקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] ×©×œ×›× ×›×“×™ לשלוח דו×ר למשתמש ×חר.',
+'emailuser' => 'שליחת דו×ר ×לקטרוני למשתמש ×–×”',
+'emailpage' => 'שליחת דו×ר למשתמש',
+'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דו×ר ×לקטרוני למשתמש ×–×”.
כתובת הדו×ר ×”×לקטרוני ×©×›×ª×‘×ª× ×‘[[Special:Preferences|העדפות המשתמש שלכ×]] תופיע ככתובת ממנה נשלחה ההודעה, כדי ל×פשר תגובה ישירה למכתב.',
-'usermailererror' => '×ובייקט הדו×ר החזיר שגי××”:',
-'defemailsubject' => 'דו×"ל {{SITENAME}}',
-'noemailtitle' => '×ין כתובת דו×ר ×לקטרוני',
-'noemailtext' => 'משתמש ×–×” ×œ× ×”×–×™×Ÿ כתובת דו×ר ×לקטרוני חוקית.',
-'nowikiemailtitle' => 'שליחת דו×"ל ××™× ×” ×פשרית',
-'nowikiemailtext' => 'משתמש ×–×” בחר ×©×œ× ×œ×§×‘×œ דו×ר ×לקטרוני ×ž×ž×©×ª×ž×©×™× ×חרי×.',
-'email-legend' => 'שליחת דו×ר ×לקטרוני למשתמש ×חר של {{SITENAME}}',
-'emailfrom' => 'מ×ת:',
-'emailto' => '×ל:',
-'emailsubject' => 'נוש×:',
-'emailmessage' => 'הודעה:',
-'emailsend' => 'שליחה',
-'emailccme' => '× × ×œ×©×œ×•×— לי בדו×ר ×”×לקטרוני העתק של הודעתי.',
-'emailccsubject' => 'העתק של הודעתך למשתמש $1: $2',
-'emailsent' => 'הדו×ר נשלח',
-'emailsenttext' => 'הודעת הדו×ר ×”×לקטרוני שלך נשלחה.',
-'emailuserfooter' => 'דו×ר ×–×” נשלח על ידי $1 למשתמש $2 ב×מצעות תכונת "שליחת דו×ר ×לקטרוני למשתמש ×–×”" ב{{grammar:תחילית|{{SITENAME}}}}.',
+'usermailererror' => '×ובייקט הדו×ר החזיר שגי××”:',
+'defemailsubject' => 'דו×"ל {{SITENAME}}',
+'usermaildisabled' => 'שליחת דו×"ל ×œ×ž×©×ª×ž×©×™× ×ž×‘×•×˜×œ×ª',
+'usermaildisabledtext' => '××™× ×›× ×¨×©××™× ×œ×©×œ×•×— דו×ר ×לקטרוני ×œ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×תר ×–×”',
+'noemailtitle' => '×ין כתובת דו×ר ×לקטרוני',
+'noemailtext' => 'משתמש ×–×” ×œ× ×”×–×™×Ÿ כתובת דו×ר ×לקטרוני חוקית.',
+'nowikiemailtitle' => 'שליחת דו×"ל ××™× ×” ×פשרית',
+'nowikiemailtext' => 'משתמש ×–×” בחר ×©×œ× ×œ×§×‘×œ דו×ר ×לקטרוני ×ž×ž×©×ª×ž×©×™× ×חרי×.',
+'email-legend' => 'שליחת דו×ר ×לקטרוני למשתמש ×חר של {{SITENAME}}',
+'emailfrom' => 'מ×ת:',
+'emailto' => '×ל:',
+'emailsubject' => 'נוש×:',
+'emailmessage' => 'הודעה:',
+'emailsend' => 'שליחה',
+'emailccme' => '× × ×œ×©×œ×•×— לי בדו×ר ×”×לקטרוני העתק של הודעתי.',
+'emailccsubject' => 'העתק של הודעתך למשתמש $1: $2',
+'emailsent' => 'הדו×ר נשלח',
+'emailsenttext' => 'הודעת הדו×ר ×”×לקטרוני שלך נשלחה.',
+'emailuserfooter' => 'דו×ר ×–×” נשלח על ידי $1 למשתמש $2 ב×מצעות תכונת "שליחת דו×ר ×לקטרוני למשתמש ×–×”" ב{{grammar:תחילית|{{SITENAME}}}}.',
+
+# User Messenger
+'usermessage-summary' => 'הש×רת הודעת מערכת.',
+'usermessage-editor' => 'שולח הודעות המערכת',
# Watchlist
'watchlist' => 'רשימת המעקב שלי',
'mywatchlist' => 'רשימת המעקב שלי',
-'watchlistfor' => "(עבור '''$1''')",
+'watchlistfor2' => 'עבור $1 $2',
'nowatchlist' => '×ין ×“×¤×™× ×‘×¨×©×™×ž×ª המעקב.',
'watchlistanontext' => '×¢×œ×™×›× $1 כדי לצפות ×ו לערוך ×¤×¨×™×˜×™× ×‘×¨×©×™×ž×ª המעקב.',
'watchnologin' => '×œ× × ×›× ×¡×ª× ×œ×—×©×‘×•×Ÿ',
@@ -2182,6 +2238,9 @@ $NEWPAGE
מערכת ההודעות של {{SITENAME}}
--
+כדי לשנות ×ת ההגדרות של הודעות הדו×"ל הנשלחות ×ליכ×, בקרו בדף
+{{fullurl:{{#special:Preferences}}}}
+
כדי לשנות ×ת הגדרות רשימת המעקב, בקרו בדף
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2238,7 +2297,10 @@ $UNWATCHURL
'revertpage' => 'שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה ×”×חרונה של [[User:$1|$1]]',
'revertpage-nouser' => 'שוחזר מעריכות של (×©× ×”×ž×©×ª×ž×© הוסר) לעריכה ×”×חרונה של [[User:$1|$1]]',
'rollback-success' => 'שוחזר מעריכה של $1 לעריכה ×”×חרונה של $2',
-'sessionfailure' => 'נר××” שיש בעיה ×‘×—×™×‘×•×¨×›× ×œ×תר;
+
+# Edit tokens
+'sessionfailure-title' => 'בעיה בחיבור',
+'sessionfailure' => 'נר××” שיש בעיה ×‘×—×™×‘×•×¨×›× ×œ×תר;
×¤×¢×•×œ×ª×›× ×‘×•×˜×œ×” ×›×מצעי זהירות נגד התחזות לתקשורת ממחשבכ×.
×× × ×—×–×¨×• לדף הקוד×, העלו ×ותו מחדש ונסו שוב.',
@@ -2368,19 +2430,23 @@ $1',
'month' => 'עד החודש:',
'year' => 'עד השנה:',
-'sp-contributions-newbies' => 'הצגת תרומות של ×ž×©×ª×ž×©×™× ×—×“×©×™× ×‘×œ×‘×“',
-'sp-contributions-newbies-sub' => 'עבור ×ž×©×ª×ž×©×™× ×—×“×©×™×',
-'sp-contributions-newbies-title' => 'תרומות של ×ž×©×ª×ž×©×™× ×—×“×©×™×',
-'sp-contributions-blocklog' => 'יומן חסימות',
-'sp-contributions-deleted' => 'תרומות משתמש מחוקות',
-'sp-contributions-logs' => 'יומני×',
-'sp-contributions-talk' => 'שיחה',
-'sp-contributions-userrights' => 'ניהול הרש×ות משתמש',
-'sp-contributions-blocked-notice' => 'משתמש ×–×” ×—×¡×•× ×›×¨×’×¢.
+'sp-contributions-newbies' => 'הצגת תרומות של ×ž×©×ª×ž×©×™× ×—×“×©×™× ×‘×œ×‘×“',
+'sp-contributions-newbies-sub' => 'עבור ×ž×©×ª×ž×©×™× ×—×“×©×™×',
+'sp-contributions-newbies-title' => 'תרומות של ×ž×©×ª×ž×©×™× ×—×“×©×™×',
+'sp-contributions-blocklog' => 'יומן חסימות',
+'sp-contributions-deleted' => 'תרומות משתמש מחוקות',
+'sp-contributions-uploads' => 'העל×ות',
+'sp-contributions-logs' => 'יומני×',
+'sp-contributions-talk' => 'שיחה',
+'sp-contributions-userrights' => 'ניהול הרש×ות משתמש',
+'sp-contributions-blocked-notice' => 'משתמש ×–×” ×—×¡×•× ×›×¨×’×¢.
הפעולה ×”×חרונה ביומן החסימות מוצגת להלן:',
-'sp-contributions-search' => 'חיפוש תרומות',
-'sp-contributions-username' => '×©× ×ž×©×ª×ž×© ×ו כתובת IP:',
-'sp-contributions-submit' => 'חיפוש',
+'sp-contributions-blocked-notice-anon' => 'כתובת IP זו חסומה כרגע.
+הפעולה ×”×חרונה ביומן החסימות מוצגת להלן:',
+'sp-contributions-search' => 'חיפוש תרומות',
+'sp-contributions-username' => '×©× ×ž×©×ª×ž×© ×ו כתובת IP:',
+'sp-contributions-toponly' => 'הצגת עריכות שהן הגרס×ות ×”×חרונות בלבד',
+'sp-contributions-submit' => 'חיפוש',
# What links here
'whatlinkshere' => '×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
@@ -2445,7 +2511,6 @@ $1',
'ipb-edit-dropdown' => 'עריכת סיבות החסימה',
'ipb-unblock-addr' => 'הסרת חסימה של $1',
'ipb-unblock' => 'הסרת חסימה של ×©× ×ž×©×ª×ž×© ×ו כתובת IP',
-'ipb-blocklist-addr' => 'החסימות הנוכחיות של $1',
'ipb-blocklist' => 'הצגת החסימות הנוכחיות',
'ipb-blocklist-contribs' => 'התרומות של $1',
'unblockip' => 'שחרור חסימה',
@@ -2514,6 +2579,8 @@ $1 כבר נחס×. ×”×× ×‘×¨×¦×•× ×›× ×œ×©× ×•×ª ×ת הגדרות החסי×
'sorbs_create_account_reason' => 'כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב־DNSBL ש×תר ×–×” משתמש בו. ××™× ×›× ×™×›×•×œ×™× ×œ×™×¦×•×¨ חשבון.',
'cant-block-while-blocked' => '××™× ×›× ×™×›×•×œ×™× ×œ×—×¡×•× ×ž×©×ª×ž×©×™× ××—×¨×™× ×›×©××ª× ×—×¡×•×ž×™×.',
'cant-see-hidden-user' => 'המשתמש ש××ª× ×ž× ×¡×™× ×œ×—×¡×•× ×›×‘×¨ × ×—×¡× ×•×”×•×¡×ª×¨. כיוון ש×ין ×œ×›× ×ת ההרש××” לחסימת משתמש והסתרתו, ××™× ×›× ×¨×©××™× ×œ×¦×¤×•×ª בחסימת המשתמש ×ו לערוך ×ותה.',
+'ipbblocked' => '××™× ×›× ×™×›×•×œ×™× ×œ×—×¡×•× ×ו לשחרר ×ת ×—×¡×™×ž×ª× ×©×œ ×ž×©×ª×ž×©×™× ×חרי×, כיוון ש××ª× ×¢×¦×ž×›× ×—×¡×•×ž×™×',
+'ipbnounblockself' => '××™× ×›× ×¨×©××™× ×œ×©×—×¨×¨ ×ת חסימתכ×',
# Developer tools
'lockdb' => 'נעילת בסיס נתוני×',
@@ -2553,6 +2620,17 @@ $1 כבר נחס×. ×”×× ×‘×¨×¦×•× ×›× ×œ×©× ×•×ª ×ת הגדרות החסי×
'''×זהרה!'''
שינוי זה עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופולרי;
×× × ×•×“×ו ש××ª× ×ž×‘×™× ×™× ×ת השלכות המעשה לפני ש××ª× ×ž×ž×©×™×›×™×.",
+'movepagetext-noredirectfixer' => "שימוש בטופס שלהלן ישנה ×ת שמו של דף, ויעביר ×ת כל ההיסטוריה שלו ×œ×©× ×—×“×©.
+×”×©× ×”×™×©×Ÿ יהפוך לדף הפניה ×ל הדף ×¢× ×”×©× ×”×—×“×©.
+×× × ×•×“×ו ש×ין [[Special:DoubleRedirects|הפניות כפולות]] ×ו [[Special:BrokenRedirects|שבורות]].
+××ª× ×חר××™× ×œ×•×•×“× ×©×›×œ ×”×§×™×©×•×¨×™× ×™×ž×©×™×›×• להצביע ×œ×ž×§×•× ×©×ליו ×”× ××ž×•×¨×™× ×œ×”×¦×‘×™×¢.
+
+שימו לב: הדף '''ל×''' יועבר ×× ×›×‘×¨ יש דף תחת ×”×©× ×”×—×“×©, ××œ× ×× ×”×“×£ ×”×–×” ריק, ×ו ×©×”×•× ×”×¤× ×™×”, ו×ין לו היסטוריית עריכות קודמות.
+פירוש הדבר ש×פשר לשנות חזרה ×ת שמו של דף ×œ×©× ×”×ž×§×•×¨×™ ×× × ×¢×©×ª×” טעות, ×•×©×œ× × ×™×ª×Ÿ לדרוס דף קיי×.
+
+'''×זהרה!'''
+שינוי זה עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופולרי;
+×× × ×•×“×ו ש××ª× ×ž×‘×™× ×™× ×ת השלכות המעשה לפני ש××ª× ×ž×ž×©×™×›×™×.",
'movepagetalktext' => 'דף השיחה של דף ×–×” יועבר ×וטומטית, ××œ× ××:
* ×§×™×™× ×“×£ שיחה ש×ינו ריק תחת ×”×©× ×”×—×“×© ×ליו מועבר הדף, ×ו
* ×”×¡×¨×ª× ×ת הסימון בתיבה שלהלן.
@@ -2607,6 +2685,7 @@ $1 כבר נחס×. ×”×× ×‘×¨×¦×•× ×›× ×œ×©× ×•×ª ×ת הגדרות החסי×
'immobile-source-page' => 'דף ×–×” ×ינו ניתן להעברה.',
'immobile-target-page' => '×œ× × ×™×ª×Ÿ להעביר ×ל כותרת יעד זו.',
'imagenocrossnamespace' => '×œ× × ×™×ª×Ÿ להעביר קובץ למרחב ×©× ×חר',
+'nonfile-cannot-move-to-file' => '×œ× × ×™×ª×Ÿ להעביר דף ש×ינו קובץ למרחב קובץ',
'imagetypemismatch' => 'סיומת הקובץ החדשה ××™× ×” מת×ימה לסוג הקובץ',
'imageinvalidfilename' => '×©× ×§×•×‘×¥ היעד ×ינו תקין',
'fix-double-redirects' => 'עדכון הפניות לכותרת הדף המקורית',
@@ -2688,6 +2767,7 @@ $1 כבר נחס×. ×”×× ×‘×¨×¦×•× ×›× ×œ×©× ×•×ª ×ת הגדרות החסי×
'importstart' => '×ž×™×™×‘× ×“×¤×™×…',
'import-revision-count' => '{{PLURAL:$1|גרסה ×חת|$1 גרס×ות}}',
'importnopages' => '×ין ×“×¤×™× ×œ×™×™×‘×•×.',
+'imported-log-entries' => '{{PLURAL:$1|יוב××” פעולת יומן ×חת|יוב×ו $1 פעולות יומן}}.',
'importfailed' => '×”×™×™×‘×•× × ×›×©×œ: <nowiki>$1</nowiki>',
'importunknownsource' => 'סוג ×™×™×‘×•× ×‘×œ×ª×™ ידוע',
'importcantopen' => 'פתיחת קובץ ×”×™×™×‘×•× × ×›×©×œ×”',
@@ -2780,6 +2860,8 @@ $1 כבר נחס×. ×”×× ×‘×¨×¦×•× ×›× ×œ×©× ×•×ª ×ת הגדרות החסי×
'tooltip-upload' => 'התחלת ההעל××”',
'tooltip-rollback' => 'שחזור בלחיצה ×חת של העריכה ×ו העריכות של ×”×ª×•×¨× ×”×חרון לדף ×–×”',
'tooltip-undo' => 'פתיחת חלון העריכה במצב תצוגה מקדימה כדי לשחזר ×ת העריכה, תוך ×פשרות להוספת סיבה בתקציר העריכה',
+'tooltip-preferences-save' => 'שמירת ההעדפות',
+'tooltip-summary' => 'להכנסת תקציר קצר',
# Stylesheets
'common.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על כל ×”×¢×™×¦×•×‘×™× */',
@@ -2911,14 +2993,17 @@ $1',
'imagemaxsize' => 'גודל תמונה מרבי:<br />(לדפי תי×ור קובץ)',
'thumbsize' => 'הקטנה לגודל של:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|דף ×חד|$3 דפי×}}',
-'file-info' => '(גודל הקובץ: $1, סוג MIME: $2)',
-'file-info-size' => '($1 × $2 פיקסלי×, גודל הקובץ: $3, סוג MIME: $4)',
+'file-info' => 'גודל הקובץ: $1, סוג MIME: $2',
+'file-info-size' => '$1 × $2 פיקסלי×, גודל הקובץ: $3, סוג MIME: $4',
'file-nohires' => '<small>×ין גרסת רזולוציה גבוהה יותר.</small>',
-'svg-long-desc' => '(קובץ SVG, הגודל המקורי: $1 × $2 פיקסלי×, גודל הקובץ: $3)',
+'svg-long-desc' => 'קובץ SVG, הגודל המקורי: $1 × $2 פיקסלי×, גודל הקובץ: $3',
'show-big-image' => 'תמונה ברזולוציה גבוהה יותר',
'show-big-image-thumb' => '<small>גודל התצוגה הזו: $1 × $2 פיקסלי×</small>',
'file-info-gif-looped' => 'בלול××”',
'file-info-gif-frames' => '{{PLURAL:$1|תמונה ×חת|$1 תמונות}}',
+'file-info-png-looped' => 'בלול××”',
+'file-info-png-repeat' => 'הוצג {{PLURAL:$1|×¤×¢× ×חת|$1 פעמי×|פעמיי×}}',
+'file-info-png-frames' => '{{PLURAL:$1|תמונה ×חת|$1 תמונות}}',
# Special:NewFiles
'newimages' => 'גלריית ×§×‘×¦×™× ×—×“×©×™×',
@@ -3073,6 +3158,7 @@ $1',
'exif-gpsareainformation' => '×©× ×זור ×”Ö¾GPS',
'exif-gpsdatestamp' => 'ת×ריך ×”Ö¾GPS',
'exif-gpsdifferential' => 'תיקון דיפרנצי×לי של ×”Ö¾GPS',
+'exif-objectname' => 'כותרת קצרה',
# EXIF attributes
'exif-compression-1' => '×œ× ×“×—×•×¡',
@@ -3232,25 +3318,25 @@ $1',
'limitall' => 'הכול',
# E-mail address confirmation
-'confirmemail' => '×ימות כתובת דו×"ל',
-'confirmemail_noemail' => '×ין ×œ×›× ×›×ª×•×‘×ª דו×"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלכ×.',
-'confirmemail_text' => '×תר ×–×” דורש שת×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתשתמשו בשירותי הדו×"ל. לחצו על הכפתור למטה כדי לשלוח דו×"ל ×¢× ×§×•×“ ×ימות לכתובת הדו×"ל שהזנת×. טענו ×ת הקישור בדפדפן ×©×œ×›× ×›×“×™ ל×שר שכתובת הדו×"ל תקפה.',
-'confirmemail_pending' => 'קוד ×ימות דו×"ל כבר נשלח ×ליכ×; ×× ×™×¦×¨×ª× ×ת החשבון ל×חרונה, ייתכן שתרצו לחכות מספר דקות עד שיגיע לפני שתנסו לבקש קוד חדש.',
-'confirmemail_send' => 'לשלוח קוד ×ימות',
-'confirmemail_sent' => 'הדו×"ל ×¢× ×§×•×“ ×”×ימות נשלח.',
-'confirmemail_oncreate' => 'קוד ×ימות דו×"ל נשלח לכתובת הדו×"ל שלכ×. הקוד ×”×–×” ×ינו נדרש לכניסה, ×ך תצטרכו לספקו כדי להשתמש בכל תכונה מבוססת דו×"ל ב×תר ×–×”.',
-'confirmemail_sendfailed' => '{{SITENAME}} ×œ× ×”×¦×œ×™×— לשלוח ×œ×›× ×”×•×“×¢×ª דו×"ל ×¢× ×§×•×“ ×”×ימות.
+'confirmemail' => '×ימות כתובת דו×"ל',
+'confirmemail_noemail' => '×ין ×œ×›× ×›×ª×•×‘×ª דו×"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלכ×.',
+'confirmemail_text' => '×תר ×–×” דורש שת×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתשתמשו בשירותי הדו×"ל. לחצו על הכפתור למטה כדי לשלוח דו×"ל ×¢× ×§×•×“ ×ימות לכתובת הדו×"ל שהזנת×. טענו ×ת הקישור בדפדפן ×©×œ×›× ×›×“×™ ל×שר שכתובת הדו×"ל תקפה.',
+'confirmemail_pending' => 'קוד ×ימות דו×"ל כבר נשלח ×ליכ×; ×× ×™×¦×¨×ª× ×ת החשבון ל×חרונה, ייתכן שתרצו לחכות מספר דקות עד שיגיע לפני שתנסו לבקש קוד חדש.',
+'confirmemail_send' => 'לשלוח קוד ×ימות',
+'confirmemail_sent' => 'הדו×"ל ×¢× ×§×•×“ ×”×ימות נשלח.',
+'confirmemail_oncreate' => 'קוד ×ימות דו×"ל נשלח לכתובת הדו×"ל שלכ×. הקוד ×”×–×” ×ינו נדרש לכניסה, ×ך תצטרכו לספקו כדי להשתמש בכל תכונה מבוססת דו×"ל ב×תר ×–×”.',
+'confirmemail_sendfailed' => '{{SITENAME}} ×œ× ×”×¦×œ×™×— לשלוח ×œ×›× ×”×•×“×¢×ª דו×"ל ×¢× ×§×•×“ ×”×ימות.
×× × ×‘×“×§×• ש×ין ×ª×•×•×™× ×©×’×•×™×™× ×‘×›×ª×•×‘×ª הדו×"ל.
תוכנת שליחת הדו×"ל החזירה ×ת ההודעה הב××”: $1',
-'confirmemail_invalid' => 'קוד ×”×ימות שגוי. ייתכן שפג תוקפו.',
-'confirmemail_needlogin' => '×¢×œ×™×›× ×œ×‘×¦×¢ $1 כדי ל×מת ×ת כתובת הדו×"ל שלכ×.',
-'confirmemail_success' => 'כתובת הדו×"ל ×©×œ×›× ×ושרה.
+'confirmemail_invalid' => 'קוד ×”×ימות שגוי. ייתכן שפג תוקפו.',
+'confirmemail_needlogin' => '×¢×œ×™×›× ×œ×‘×¦×¢ $1 כדי ל×מת ×ת כתובת הדו×"ל שלכ×.',
+'confirmemail_success' => 'כתובת הדו×"ל ×©×œ×›× ×ושרה.
כעת ב××¤×©×¨×•×ª×›× [[Special:UserLogin|להיכנס לחשבון שלכ×]] וליהנות מה×תר.',
-'confirmemail_loggedin' => 'כתובת הדו×"ל ×©×œ×›× ×ושרה כעת.',
-'confirmemail_error' => 'שגי××” בשמירת קוד ×”×ימות.',
-'confirmemail_subject' => 'קוד ×ימות דו×"ל מ{{grammar:תחילית|{{SITENAME}}}}',
-'confirmemail_body' => 'מישהו, כנר××” ××ª× (מכתובת ×”Ö¾IP הזו: $1),
+'confirmemail_loggedin' => 'כתובת הדו×"ל ×©×œ×›× ×ושרה כעת.',
+'confirmemail_error' => 'שגי××” בשמירת קוד ×”×ימות.',
+'confirmemail_subject' => 'קוד ×ימות דו×"ל מ{{grammar:תחילית|{{SITENAME}}}}',
+'confirmemail_body' => 'מישהו, כנר××” ××ª× (מכתובת ×”Ö¾IP הזו: $1),
×¨×©× ×ת החשבון "$2" ×¢× ×›×ª×•×‘×ª הדו×"ל הזו ב{{grammar:תחילית|{{SITENAME}}}}.
כדי ל×מת שחשבון ×–×” ב×מת שייך ×œ×›× ×•×œ×”×¤×¢×™×œ ×ת שירותי הדו×"ל ב×תר, ×× × ×¤×ª×—×• ×ת הכתובת הב××” בדפדפן שלכ×:
@@ -3262,8 +3348,32 @@ $3
$5
קוד ×”×ימות יפקע ב־$4.',
-'confirmemail_invalidated' => '×ימות כתובת הדו×"ל בוטל',
-'invalidateemail' => 'ביטול ×”×ימות של כתובת הדו×"ל',
+'confirmemail_body_changed' => 'מישהו, כנר××” ××ª× (מכתובת ×”Ö¾IP הזו: $1),
+שינה ×ת כתובת הדו×"ל של החשבון "$2" לכתובת הזו ב{{grammar:תחילית|{{SITENAME}}}}.
+
+כדי ל×מת שחשבון ×–×” ב×מת שייך ×œ×›× ×•×œ×”×¤×¢×™×œ מחדש ×ת שירותי הדו×"ל ב×תר, ×× × ×¤×ª×—×• ×ת הכתובת הב××” בדפדפן שלכ×:
+
+$3
+
+×× ×”×—×©×‘×•×Ÿ *×ינו* שייך לכ×, השתמשו בקישור ×”×‘× ×›×“×™ לבטל ×ת ×ימות כתובת הדו×"ל:
+
+$5
+
+קוד ×”×ימות יפקע ב־$4.',
+'confirmemail_body_set' => 'מישהו, כנר××” ××ª× (מכתובת ×”Ö¾IP הזו: $1),
+הגדיר ×ת כתובת הדו×"ל של החשבון "$2" לכתובת הזו ב{{grammar:תחילית|{{SITENAME}}}}.
+
+כדי ל×מת שחשבון ×–×” ב×מת שייך ×œ×›× ×•×œ×”×¤×¢×™×œ מחדש ×ת שירותי הדו×"ל ב×תר, ×× × ×¤×ª×—×• ×ת הכתובת הב××” בדפדפן שלכ×:
+
+$3
+
+×× ×”×—×©×‘×•×Ÿ *×ינו* שייך לכ×, השתמשו בקישור ×”×‘× ×›×“×™ לבטל ×ת ×ימות כתובת הדו×"ל:
+
+$5
+
+קוד ×”×ימות יפקע ב־$4.',
+'confirmemail_invalidated' => '×ימות כתובת הדו×"ל בוטל',
+'invalidateemail' => 'ביטול ×”×ימות של כתובת הדו×"ל',
# Scary transclusion
'scarytranscludedisabled' => '[הכללת ×“×¤×™× ×‘×™×Ÿ ××ª×¨×™× ×ž×‘×•×˜×œ×ª]',
@@ -3303,6 +3413,7 @@ $1',
'table_pager_first' => 'הדף הר×שון',
'table_pager_last' => 'הדף ×”×חרון',
'table_pager_limit' => 'הצגת $1 ×¤×¨×™×˜×™× ×‘×“×£',
+'table_pager_limit_label' => 'מספר ×¤×¨×™×˜×™× ×‘×“×£:',
'table_pager_limit_submit' => 'הצגה',
'table_pager_empty' => '×œ×œ× ×ª×•×¦×ות',
@@ -3423,6 +3534,7 @@ $1',
'version-specialpages' => '×“×¤×™× ×ž×™×•×—×“×™×',
'version-parserhooks' => 'הרחבות מפענח',
'version-variables' => 'משתני×',
+'version-skins' => 'עיצובי×',
'version-other' => '×חר',
'version-mediahandlers' => 'מציגי מדיה',
'version-hooks' => 'מבני Hook',
@@ -3434,6 +3546,13 @@ $1',
'version-hook-subscribedby' => 'הפונקציה הרושמת',
'version-version' => '(גרסה $1)',
'version-license' => 'רישיון',
+'version-poweredby-credits' => "×תר הוויקי ×”×–×” מופעל על ידי '''[http://www.mediawiki.org/ מדיה־ויקי]''', © 2001-$1 $2.",
+'version-poweredby-others' => '×חרי×',
+'version-license-info' => "מדיה־ויקי ×”×™× ×ª×•×›× ×” חופשית; ב××¤×©×¨×•×ª×›× ×œ×”×¤×™×¥ ×ותה מחדש ו/×ו לשנות ×ותה לפי תנ××™ הרישיון הציבורי הכללי של גנו ×”×ž×¤×•×¨×¡× ×¢×œ ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון ×–×”, ×ו (לפי בחירתכ×) כל גרסה מ×וחרת יותר.
+
+מדיה־ויקי מופצת בתקווה ×©×”×™× ×ª×”×™×” שימושית, ×ך '''×œ×œ× ×›×œ הבטחה ל×חריות'''; ×פילו ×œ× ×חריות משתמעת של '''יכולת להיסחר''' ×ו '''הת×מה לרישיון מסוי×'''. ר×ו ×ת הרישיון הציבורי הכללי של גנו ×œ×¤×¨×˜×™× × ×•×¡×¤×™×.
+
+×”×™×™×ª× ×¦×¨×™×›×™× ×œ×§×‘×œ [{{SERVER}}{{SCRIPTPATH}}/COPYING העתק של הרישיון הציבורי הכללי של גנו] יחד ×¢× ×ª×•×›× ×” זו; ×× ×œ×, כתבו למוסד לתוכנה חופשית: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ×ו [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html קר×ו ×ותו ברשת].",
'version-software' => 'תוכנות מותקנות',
'version-software-product' => 'תוכנה',
'version-software-version' => 'גרסה',
@@ -3504,6 +3623,15 @@ $1',
'tags-edit' => 'עריכה',
'tags-hitcount' => '{{PLURAL:$1|שינוי ×חד|$1 שינויי×}}',
+# Special:ComparePages
+'comparepages' => 'השוו×ת דפי×',
+'compare-selector' => 'השוו×ת גרס×ות של דפי×',
+'compare-page1' => 'דף 1',
+'compare-page2' => 'דף 2',
+'compare-rev1' => 'גרסה 1',
+'compare-rev2' => 'גרסה 2',
+'compare-submit' => 'השוו××”',
+
# Database error messages
'dberr-header' => 'בעיה בוויקי',
'dberr-problems' => 'מצטערי×! קיימת בעיה טכנית ב×תר ×–×”.',
@@ -3520,8 +3648,13 @@ $1',
'htmlform-float-invalid' => 'הערך ×©×¦×™×™× ×ª× ×ינו מספר.',
'htmlform-int-toolow' => 'הערך ×©×¦×™×™× ×ª× ×”×•× ×ž×ª×—×ª למינימו×, $1',
'htmlform-int-toohigh' => 'הערך ×©×¦×™×™× ×ª× ×”×•× ×ž×¢×œ למקסימו×, $1',
+'htmlform-required' => 'ערך זה דרוש',
'htmlform-submit' => 'שליחה',
'htmlform-reset' => 'ביטול השינויי×',
'htmlform-selectorother-other' => '×חר',
+# SQLite database support
+'sqlite-has-fts' => '$1 ×¢× ×ª×ž×™×›×” בחיפוש בטקסט מל×',
+'sqlite-no-fts' => '$1 ×œ×œ× ×ª×ž×™×›×” בחיפוש בטקסט מל×',
+
);
diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php
index c65105e9..c4a78533 100644
--- a/languages/messages/MessagesHi.php
+++ b/languages/messages/MessagesHi.php
@@ -9,10 +9,12 @@
*
* @author Akansha
* @author Aksi great
+ * @author Bhawani Gautam
* @author Bhawani Gautam Rhk
* @author Charu
* @author Dineshjk
* @author Hemant wikikosh1
+ * @author Htt
* @author Kaustubh
* @author Kiranmayee
* @author Krinkle
@@ -78,8 +80,7 @@ $messages = array(
'tog-editsection' => '[संपादित करें] कड़ियों दà¥à¤µà¤¾à¤°à¤¾ विभाग संपादन करने की अनà¥à¤®à¤¤à¥€ दें',
'tog-editsectiononrightclick' => 'विभाग शीरà¥à¤·à¤•à¤ªà¤° दायाठकà¥à¤²à¥€à¤• करके संपादन करने की अनà¥à¤®à¤¤à¥€ दें (जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿ)',
'tog-showtoc' => 'अनà¥à¤•à¥à¤°à¤® दरà¥à¤¶à¤¾à¤¯à¥‡à¤‚ (जिन पनà¥à¤¨à¥‹à¤‚पर तीन से जà¥à¤¯à¤¾à¤¦à¤¾ विभाग हो)',
-'tog-rememberpassword' => 'इस संगणक पर मेरा कूटशबà¥à¤¦ याद रखें',
-'tog-editwidth' => 'संपादन कोषà¥à¤ à¤• को पूरे पट की चौड़ाई में दिखाà¤à¤',
+'tog-rememberpassword' => 'इस बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर मेरा कूटशबà¥à¤¦ (अधिकतम $1 {{PLURAL:$1|दिन तक|दिनों तक}}) याद रखें',
'tog-watchcreations' => 'मेरे दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤®à¤¿à¤¤ पृषà¥à¤ à¥‹à¤‚ को मेरी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में जोड़ें',
'tog-watchdefault' => 'मेरे दà¥à¤µà¤¾à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ पृषà¥à¤ à¥‹à¤‚ को मेरी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में जोड़ें',
'tog-watchmoves' => 'मेरे दà¥à¤µà¤¾à¤°à¤¾ नाम-परिवरà¥à¤¤à¤¿à¤¤ पृषà¥à¤ à¥‹à¤‚ को मेरी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में जोड़ें',
@@ -148,7 +149,7 @@ $messages = array(
'august' => 'अगसà¥à¤¤',
'september' => 'सितमà¥à¤¬à¤°',
'october' => 'अकà¥à¤Ÿà¥‚बर',
-'november' => 'नवंबर',
+'november' => 'नवमà¥à¤¬à¤°',
'december' => 'दिसमà¥à¤¬à¤°',
'january-gen' => 'जनवरी',
'february-gen' => 'फ़रवरी',
@@ -158,7 +159,7 @@ $messages = array(
'june-gen' => 'जून',
'july-gen' => 'जà¥à¤²à¤¾à¤ˆ',
'august-gen' => 'अगसà¥à¤¤',
-'september-gen' => 'सितंबर',
+'september-gen' => 'सितमà¥à¤¬à¤°',
'october-gen' => 'अकà¥à¤Ÿà¥‚बर',
'november-gen' => 'नवमà¥à¤¬à¤°',
'december-gen' => 'दिसमà¥à¤¬à¤°',
@@ -201,9 +202,9 @@ $messages = array(
* [http://www.mediawiki.org/wiki/Manual:FAQ मीडियाविकिके बारे में पà¥à¤°à¤¾à¤¯: पूछे जाने वाले सवाल]
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिसà¥à¤Ÿ]',
-'about' => 'अबाउट',
+'about' => 'के बारे में',
'article' => 'लेख',
-'newwindow' => '(नया विंडो में खà¥à¤²à¤¤à¤¾ है)',
+'newwindow' => '(नई खिड़की में खà¥à¤²à¤¤à¤¾ है)',
'cancel' => 'रदà¥à¤¦ करें',
'moredotdotdot' => 'और...',
'mypage' => 'मेरा पृषà¥à¤ ',
@@ -224,35 +225,25 @@ $messages = array(
'faqpage' => 'Project:अकà¥à¤¸à¤° पूछे जाने वाले सवाल',
# Vector skin
-'vector-action-addsection' => 'विषय जोड़ें',
-'vector-action-delete' => 'मिटाà¤à¤',
-'vector-action-move' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करें',
-'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें',
-'vector-action-undelete' => 'मिटाना वापस लें',
-'vector-action-unprotect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ हटाà¤à¤',
-'vector-namespace-category' => 'शà¥à¤°à¥‡à¤£à¥€',
-'vector-namespace-help' => 'सहायता पनà¥à¤¨à¤¾',
-'vector-namespace-image' => 'संचका',
-'vector-namespace-main' => 'पनà¥à¤¨à¤¾',
-'vector-namespace-media' => 'माधà¥à¤¯à¤® पनà¥à¤¨à¤¾',
-'vector-namespace-mediawiki' => 'संदेश',
-'vector-namespace-project' => 'परियोजना पनà¥à¤¨à¤¾',
-'vector-namespace-special' => 'खास पनà¥à¤¨à¤¾',
-'vector-namespace-talk' => 'वारà¥à¤¤à¤¾',
-'vector-namespace-template' => 'साà¤à¤šà¤¾',
-'vector-namespace-user' => 'सदसà¥à¤¯ पनà¥à¤¨à¤¾',
-'vector-view-create' => 'बनाà¤à¤‚',
-'vector-view-edit' => 'संपादन',
-'vector-view-history' => 'इतिहास देखें',
-'vector-view-view' => 'पढ़ें',
-'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤ देखें',
-'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾à¤à¤‚',
-'namespaces' => 'नामसà¥à¤¥à¤¾à¤¨',
-'variants' => 'संसà¥à¤•à¤°à¤£',
+'vector-action-addsection' => 'विषय जोड़ें',
+'vector-action-delete' => 'मिटाà¤à¤',
+'vector-action-move' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करें',
+'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें',
+'vector-action-undelete' => 'मिटाना वापस लें',
+'vector-action-unprotect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ हटाà¤à¤',
+'vector-simplesearch-preference' => 'संवरà¥à¤§à¤¿à¤¤ खोज सà¥à¤à¤¾à¤µ सकà¥à¤·à¤® करें। (केवल वॅकà¥à¤Ÿà¤° सà¥à¤•à¤¿à¤¨ हेतà¥)',
+'vector-view-create' => 'बनाà¤à¤',
+'vector-view-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
+'vector-view-history' => 'इतिहास देखें',
+'vector-view-view' => 'पढ़ें',
+'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤ देखें',
+'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾à¤à¤‚',
+'namespaces' => 'नामसà¥à¤¥à¤¾à¤¨',
+'variants' => 'संसà¥à¤•à¤°à¤£',
'errorpagetitle' => 'तà¥à¤°à¥à¤Ÿà¤¿',
'returnto' => 'लौटें $1.',
-'tagline' => 'विकिपीडिया, à¤à¤• मà¥à¤•à¥à¤¤ जà¥à¤žà¤¾à¤¨à¤•à¥‹à¤· से',
+'tagline' => '{{SITENAME}} से',
'help' => 'सहायता',
'search' => 'खोजिà¤',
'searchbutton' => 'खोजिà¤',
@@ -266,10 +257,10 @@ $messages = array(
'permalink' => 'सà¥à¤¥à¤¾à¤¯à¥€ कड़ी',
'print' => 'मà¥à¤¦à¥à¤°à¤¾à¤‚कन करें',
'edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
-'create' => 'बनाà¤à¤‚',
+'create' => 'बनाà¤à¤',
'editthispage' => 'इस पृषà¥à¤  को बदलें',
'create-this-page' => 'इस लेख को लिखें',
-'delete' => 'हटाà¤à¤‚',
+'delete' => 'विलोपित करें',
'deletethispage' => 'इस पृषà¥à¤  को हटायें',
'undelete_short' => '{{PLURAL:$1|à¤à¤• हटायागया|$1 हटायागये}} बदलाव वापस लायें',
'protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें',
@@ -295,7 +286,7 @@ $messages = array(
'viewhelppage' => 'सहायता पृषà¥à¤  देखें',
'categorypage' => 'शà¥à¤°à¥‡à¤£à¥€ पृषà¥à¤  देखें',
'viewtalkpage' => 'चरà¥à¤šà¤¾ देखें',
-'otherlanguages' => 'अनà¥à¤¯ भाषाà¤à¤‚',
+'otherlanguages' => 'अनà¥à¤¯ भाषाà¤à¤',
'redirectedfrom' => '($1 से भेजा गया)',
'redirectpagesub' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶ पृषà¥à¤ ',
'lastmodifiedat' => 'इस पनà¥à¤¨à¥‡ का पिछला बदलाव $1 को $2 बजे हà¥à¤† था।',
@@ -309,6 +300,9 @@ $messages = array(
कृपया कà¥à¤› समय पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर फिर से इस पृषà¥à¤  तक जाने का पà¥à¤°à¤¯à¤¾à¤¸ करें।
$1',
+'pool-timeout' => 'तालाबनà¥à¤¦à¥€ के लिठपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ समय समापà¥à¤¤',
+'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}} के बारे में',
@@ -320,7 +314,7 @@ $1',
'disclaimers' => 'असà¥à¤µà¥€à¤•à¤°à¤£',
'disclaimerpage' => 'Project:साधारण असà¥à¤µà¥€à¤•à¤°à¤£',
'edithelp' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सहायता',
-'edithelppage' => 'Help:संपादन',
+'edithelppage' => 'सहायता:समà¥à¤ªà¤¾à¤¦à¤¨',
'helppage' => 'Help:सहायता',
'mainpage' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
'mainpage-description' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
@@ -471,7 +465,8 @@ $2',
'yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
'yourpassword' => 'कूटशबà¥à¤¦ :',
'yourpasswordagain' => 'पासवरà¥à¤¡ दà¥à¤¬à¤¾à¤°à¤¾ लिखें',
-'remembermypassword' => 'इस कंपà¥à¤¯à¥‚टर पर मेरी लॉग-इन सूचना याद रखें।',
+'remembermypassword' => 'इस बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर मेरा लॉगिन याद रखें (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} के लिà¤)',
+'securelogin-stick-https' => ' पà¥à¤°à¤µà¥‡à¤¶ के बाद HTTPS से जà¥à¤¡à¤¼à¥‡ रह',
'yourdomainname' => 'आपका डोमेन:',
'externaldberror' => 'बाहà¥à¤¯ पà¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤°à¤£ डाटाबेसमें समसà¥à¤¯à¤¾ हà¥à¤ˆ हैं या फिर आपको अपना बाहà¥à¤¯ खाता अपडेट करने की अनà¥à¤®à¤¤à¤¿ नहीं हैं ।',
'login' => 'लॉग इन',
@@ -488,6 +483,7 @@ $2',
'gotaccount' => "पहलेसे आपका खाता हैं? '''$1'''.",
'gotaccountlink' => 'लॉग इन',
'createaccountmail' => 'ई-मेल दà¥à¤µà¤¾à¤°à¤¾',
+'createaccountreason' => 'कारण:',
'badretype' => 'आपने जो पासवरà¥à¤¡ दिये हैं वे à¤à¤• दूसरे से नहीं मिलते। फिर से लिखें।',
'userexists' => 'आपने दिया हà¥à¤† सदसà¥à¤¯à¤¨à¤¾à¤® पहले से इसà¥à¤¤à¥‡à¤®à¤¾à¤²à¤®à¥‡à¤‚ हैं ।
कृपया अनà¥à¤¯ सदसà¥à¤¯à¤¨à¤¾à¤® चà¥à¤¨à¤¿à¤¯à¥‡à¤‚ ।',
@@ -514,6 +510,7 @@ $2',
'wrongpasswordempty' => 'कूटशबà¥à¤¦ खाली है; फिरसे यतà¥à¤¨ किजीये ।',
'passwordtooshort' => 'आपका कूटशबà¥à¤¦ कम से कम {{PLURAL:$1|1 अकà¥à¤·à¤°|$1 अकà¥à¤·à¤°à¥‡}} होने चाहिये।',
'password-name-match' => 'आपका कूटशबà¥à¤¦, आपके सदसà¥à¤¯à¤¨à¤¾à¤® से भिनà¥à¤¨ होना चाहिà¤à¥¤',
+'password-login-forbidden' => 'इस पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® और कूटशबà¥à¤¦ का उपयोग वरà¥à¤œà¤¿à¤¤ है।',
'mailmypassword' => 'डाक दà¥à¤µà¤¾à¤°à¤¾ नया कूटशबà¥à¤¦ भेजें',
'passwordremindertitle' => '{{SITENAME}} के लिया नया असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦',
'passwordremindertext' => 'किसी ने (शायद आपने ही, $1 आईपी पते से) {{SITENAME}} ($4) पर इसà¥à¤¤à¥‡à¤®à¤¾à¤² के लिये नया कूटशबà¥à¤¦ मंगाया है। पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ "$2" के लिठà¤à¤• असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦ बना दिया गया है, और यह अभी "$3" है। यदि आपकी यही मंशा थी, तो अब आपको सतà¥à¤°à¤¾à¤°à¤‚भ करके à¤à¤• नया कूटशबà¥à¤¦ चà¥à¤¨à¤¨à¤¾ होगा।
@@ -600,13 +597,14 @@ $2',
'preview' => 'à¤à¤²à¤•',
'showpreview' => 'à¤à¤²à¤• दिखाà¤à¤',
'showlivepreview' => 'सीधी à¤à¤²à¤•',
-'showdiff' => 'बदलाव दिखाà¤à¤‚',
+'showdiff' => 'बदलाव दिखाà¤à¤',
'anoneditwarning' => "'''सावधान:''' आपने सतà¥à¤°à¤¾à¤°à¤‚भ नहीं किया है। इस पृषà¥à¤  के संपादन इतिहास में आपका आइपी पता अंकित किया जाà¤à¤—ा।",
+'anonpreviewwarning' => '"आप लॉगà¥à¤¡ इन नहीं हैं। पनà¥à¤¨à¤¾ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करने पर आपका आइपी पता इस पनà¥à¤¨à¥‡ के इतिहास में रिकॉरà¥à¤¡ किया जायेगा।"',
'missingsummary' => "'''तकाज़ा (सà¥à¤®à¤°à¤£-पतà¥à¤°):''' आपने संपादन सारांश नहीं दिया हà¥à¤† हैं ।
अगर आप दà¥à¤¬à¤¾à¤°à¤¾ संजोयेंपर कà¥à¤²à¥€à¤• करते हैं तो आपका संपादन बिना सारांश दिये संजोया जायेगा ।",
'missingcommenttext' => 'कृपया नीचे टिपà¥à¤ªà¤£à¥€ दें ।',
-'missingcommentheader' => "'''सà¥à¤®à¤°à¤£-पतà¥à¤°:''' आपने इस टिपà¥à¤ªà¤£à¥€à¤•à¥‹ शीरà¥à¤·à¤• नहीं दिया हैं ।
-अगर आप दà¥à¤¬à¤¾à¤°à¤¾ संजोयें पर कà¥à¤²à¥€à¤• करें तो आपके बदलाव संजोयें जायेंगे ।",
+'missingcommentheader' => "'''सà¥à¤®à¤°à¤£-पतà¥à¤°:''' आपने इस टिपà¥à¤ªà¤£à¥€ को शीरà¥à¤·à¤• नहीं दिया है।
+अगर आप दोबारा \"{{int:savearticle}}\" पर कà¥à¤²à¤¿à¤• करें तो आपके बदलाव संजोयें जायेंगे।",
'summary-preview' => 'सारांशकी à¤à¤²à¤•:',
'subject-preview' => 'विषय/शीरà¥à¤·à¤• की à¤à¤²à¤•:',
'blockedtitle' => 'सदसà¥à¤¯ अवरà¥à¤¦à¥à¤§ है',
@@ -662,10 +660,10 @@ $2',
इसलिये उनकी पहचान के लिये हम उनका आईपी पते का पà¥à¤°à¤¯à¥‹à¤— करना पड़ता है।
आईपी पता कई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤“ं के लिठà¤à¤• सा हो सकता है।
यदि आप à¤à¤• बेनामी पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ हैं और आपको लगता है कि आपके बारे में अपà¥à¤°à¤¾à¤¸à¤‚गिक टीका टिपà¥à¤ªà¤£à¥€ की गई है तो कृपया [[Special:UserLogin/signup|सदसà¥à¤¯à¤¤à¤¾ लें]] या [[Special:UserLogin|सतà¥à¤°à¤¾à¤°à¤‚भ करें]] ताकि अनà¥à¤¯ बेनामी पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤“ं में से आपको अलग से पहचाना जा सके।''",
-'noarticletext' => 'फ़िलहाल इस पनà¥à¤¨à¥‡ पर कोई सामगà¥à¤°à¥€ नहीं है।
-आप अनà¥à¤¯à¥‹à¤‚ पनà¥à¤¨à¥‹à¤‚ में [[Special:Search/{{PAGENAME}}|इस सामगà¥à¤°à¥€ की खोज]] कर सकते हैं,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिटà¥à¤ à¥‹à¤‚ में खोज कर सकते हैं],
-या [{{fullurl:{{FULLPAGENAME}}|action=edit}} इस पनà¥à¤¨à¥‡ को संपादित कर सकते हैं]</span>।',
+'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>।',
@@ -688,10 +686,10 @@ $2',
'''यह अभी तक संजोई नहीं गई है!'''",
'userjspreview' => "'''आप अपने जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿà¤•à¥€ सिरà¥à¤« à¤à¤²à¤• देख रहें हैं, वह अभीतक संजोई नहीं हैं इसका खयाल रखें ।'''",
'userinvalidcssjstitle' => "'''ताक़ीद:''' \"\$1\" नामसे कोई तà¥à¤µà¤šà¤¾ नहीं हैं ।
-कृपया धà¥à¤¯à¤¾à¤¨ में रहें की बदली हà¥à¤ˆ .css और .js फ़ाईलें नीचे सà¥à¤¤à¤°à¤•à¥€ लिपी का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करती हैं, उदा. {{ns:user}}:Foo/monobook.css के विरà¥à¤§ {{ns:user}}:Foo/Monobook.css ।",
+कृपया धà¥à¤¯à¤¾à¤¨ में रहें की बदली हà¥à¤ˆ .css और .js फ़ाईलें नीचे सà¥à¤¤à¤°à¤•à¥€ लिपी का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करती हैं, उदा. {{ns:user}}:Foo/vector.css के विरà¥à¤§ {{ns:user}}:Foo/Vector.css ।",
'updated' => '(अदà¥à¤¯à¤¤à¤¨à¥€à¤¤)',
'note' => "'''सूचना:'''",
-'previewnote' => "'''याद रखें, यह केवल à¤à¤• à¤à¤²à¤• है और अभी तक सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नहीं किया गया है!'''",
+'previewnote' => "'''याद रखें, यह केवल à¤à¤• à¤à¤²à¤• है और अभी तक सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नहीं किया गया है!'''",
'previewconflict' => 'उपरी बदलाव संजोये जाने के बाद उपरी पाठ इस à¤à¤²à¤•à¤•à¥‡ अनà¥à¤¸à¤¾à¤° दिखाया जायेगा।',
'session_fail_preview' => "'''माफ किजीयें! आपके बदलाव सेशन डाटा के नषà¥à¤Ÿ होने के कारण संजोयें नहीं गयें हैं।
कृपया पà¥à¤¨: यतà¥à¤¨ करें। अगर इसके बाद भी à¤à¤¸à¤¾ ही होता हैं तो कॄपया लॉग आउट करके फिरसे लॉग इन करें।'''",
@@ -725,8 +723,6 @@ $2',
अगर आपको अपने लिखे हà¥à¤ पाठ में संपादन होना नामंजूर हैं तो कृपया यहां पर मत लिखें।<br />
आप हमें यह भी वचन देतें हैं कि यह आपने खà¥à¤¦ लिखा हैं या फिर कोई पबà¥à¤²à¤¿à¤• डोमेन या à¤à¤¸à¥‡ ही किसी मà¥à¤•à¥à¤¤ सà¥à¤°à¥‹à¤¤à¤¸à¥‡ कापी किया हैं। (अधिक जानकारी के लिये $1 देखें)।
'''कॉपीराइट वाले लेखों को, बिना अनà¥à¤®à¤¤à¤¿ के, यहाठन डाले।'''",
-'longpagewarning' => "'''सूचना: यह पनà¥à¤¨à¤¾ $1 किलोबाईटà¥à¤¸à¤•à¤¾ है; कà¥à¤› बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°à¥à¤¸ 32kb से जà¥à¤¯à¤¾à¤¦à¤¾ बडे पनà¥à¤¨à¥‹à¤‚को ठीक से नहीं दिखा सकते या संपादित करने में असà¥à¤µà¤¿à¤§à¤¾ हो सकती है ।
-कृपया इस पनà¥à¤¨à¥‡à¤•à¥‡ उससे कम आकारके विभाग बनाईये ।'''",
'longpageerror' => "'''गलती: आपने दिया हà¥à¤† पाठ $1 कीलोबाईट लंबा हैं, जो $2 केबी के मरà¥à¤¯à¤¾à¤¦à¤¾ से बाहर हैं।
इसे संजोया नहीं जा सकता।'''",
'readonlywarning' => "'''सावधान: आà¤à¤•à¤¡à¤¼à¤•à¥‹à¤· को रख रखाव के लियें बंद कर दिया गया हैं, इसलिये अभी आपके बदलाव संजोठनहीं जा सकते।
@@ -737,11 +733,11 @@ $2',
'semiprotectedpagewarning' => 'अरà¥à¤§ संरकà¥à¤·à¤¿à¤¤ पृषà¥à¤  चेतावनी',
'cascadeprotectedwarning' => "'''सावधान:''' यह लेख निमà¥à¤¨à¤²à¤¿à¤–ीत सà¥à¤°à¤•à¥à¤·à¤¾-सीढी {{PLURAL:$1|पनà¥à¤¨à¥‡ से|पनà¥à¤¨à¥‹à¤‚ से}} जà¥à¤¡à¤¾ हà¥à¤† होने के कारण सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ हà¥à¤† हैं, और सिरà¥à¤« पà¥à¤°à¤¬à¤‚धक ही इसमें बदलाव कर सकतें हैं:",
'titleprotectedwarning' => 'शीरà¥à¤·à¤• चेतावनी सà¥à¤°à¤•à¥à¤·à¤¿à¤¤',
-'templatesused' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ पà¥à¤°à¤¯à¥‹à¤— साà¤à¤šà¤¾',
-'templatesusedpreview' => 'पà¥à¤°à¤¯à¥à¤•à¥à¤¤ अनà¥à¤­à¤¾à¤— साà¤à¤šà¤¾',
+'templatesused' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ पà¥à¤°à¤¯à¥‹à¤— {{PLURAL:$1|साà¤à¤šà¤¾|साà¤à¤šà¥‡}}',
+'templatesusedpreview' => 'पà¥à¤°à¤¯à¥à¤•à¥à¤¤ अनà¥à¤­à¤¾à¤— {{PLURAL:$1|साà¤à¤šà¤¾|साà¤à¤šà¥‡}}',
'templatesusedsection' => 'पà¥à¤°à¤¯à¥à¤•à¥à¤¤ अनà¥à¤­à¤¾à¤— टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸',
'template-protected' => '(सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
-'template-semiprotected' => '(अरà¥à¤§-सà¥à¤°à¤•à¥à¤·à¥€à¤¤)',
+'template-semiprotected' => '(अरà¥à¤§-सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
'hiddencategories' => 'यह लेख निमà¥à¤¨à¤²à¤¿à¤–ित {{PLURAL:$1|1 छà¥à¤ªà¤¾à¤ˆ हà¥à¤ˆ शà¥à¤°à¥‡à¤£à¥€à¤®à¥‡à¤‚|$1 छà¥à¤ªà¤¾à¤ˆà¤‚ हà¥à¤ˆà¤‚ शà¥à¤°à¥‡à¤£à¤¿à¤¯à¥‹à¤‚में}} हैं:',
'edittools' => '<!-- यहां दिया हà¥à¤† पाठ संपादन और अपलोड फ़ारà¥à¤® के नीचे दरà¥à¤¶à¤¾à¤¯à¤¾ जायेगा। -->',
'nocreatetitle' => 'लेख निरà¥à¤®à¤¾à¤£à¤®à¥‡à¤‚ पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध',
@@ -811,9 +807,9 @@ $2',
'last' => 'पिछला',
'page_first' => 'पहला',
'page_last' => 'आखिरी',
-'histlegend' => 'फरà¥à¤• चयन: फरà¥à¤• देखनेके लिये पà¥à¤°à¤¾à¤¨à¥‡ अवतरणोंके आगे दिये गये रेडियो बॉकà¥à¤¸à¤ªà¤° कà¥à¤²à¥€à¤• करें तथा à¤à¤¨à¥à¤Ÿà¤° करें अथवा नीचे दिये हà¥à¤ बटनपर कà¥à¤²à¥€à¤• करें<br />
-लिजेंड: (चालू) = सदà¥à¤¯ अवतरणके बीचमें फरà¥à¤•,
-(आखिरी) = पिछले अवतरणके बीचमें फरà¥à¤•, छो = छोटा बदलाव ।',
+'histlegend' => 'अनà¥à¤¤à¤° चयन: अनà¥à¤¤à¤° देखने के लिठपà¥à¤°à¤¾à¤¨à¥‡ अवतरणों के आगे दिठगठरेडियो बॉकà¥à¤¸ पर कà¥à¤²à¤¿à¤• करें तथा à¤à¤£à¥à¤Ÿà¤° करें अथवा नीचे दिठहà¥à¤ बटनपर कà¥à¤²à¤¿à¤• करें<br />
+लिजणà¥à¤¡: (चालू) = सदà¥à¤¯ अवतरण के बीचमें अनà¥à¤¤à¤°,
+(आखिरी) = पिछले अवतरण के बीचमें अनà¥à¤¤à¤°, छो = छोटा बदलाव।',
'history-fieldset-title' => 'इतिहास का विचरण करें',
'history-show-deleted' => 'इतिहास शो नषà¥à¤Ÿ',
'histfirst' => 'सबसे पà¥à¤°à¤¾à¤¨à¤¾',
@@ -897,6 +893,8 @@ $2',
'logdelete-failure' => "'''चिटà¥à¤ à¥‡ की दरà¥à¤¶à¤¨à¥€à¤¯à¤¤à¤¾ का जमाव नहीं किया जा सका:'''
$1",
'revdel-restore' => 'दृशà¥à¤¯à¤¤à¤¾ बदलें',
+'revdel-restore-deleted' => 'हटाठगठसंशोधन',
+'revdel-restore-visible' => 'दृशà¥à¤¯ संशोधन',
'pagehist' => 'पनà¥à¤¨à¥‡ का इतिहास',
'deletedhist' => 'हटाया हà¥à¤† इतिहास',
'revdelete-content' => 'कंटेंट',
@@ -966,8 +964,9 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
# Diffs
'history-title' => '"$1" का अवतरण इतिहास',
'difference' => '(संसà¥à¤•à¤°à¤£à¥‹à¤‚ में अंतर)',
+'difference-multipage' => '(पृषà¥à¤ à¥‹à¤‚ के बीच अनà¥à¤¤à¤°)',
'lineno' => 'पंकà¥à¤¤à¤¿ $1:',
-'compareselectedversions' => 'च़यन किये हà¥à¤ अवतरणोंमें फरà¥à¤• देखियें',
+'compareselectedversions' => 'चà¥à¤¨à¥‡ हà¥à¤ अवतरणों की तà¥à¤²à¤¨à¤¾ करें',
'showhideselectedversions' => 'चयनित संसà¥à¤•à¤°à¤£ दिखाà¤à¤/छिपाà¤à¤',
'editundo' => 'पूरà¥à¤µà¤µà¤¤ करें',
'diff-multi' => '({{PLURAL:$1|बीच वाला à¤à¤• अवतरण|बीचवाले $1 अवतरण}} दरà¥à¤¶à¤¾à¤¯à¥‡ नहीं हैं ।)',
@@ -988,14 +987,14 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'prevn-title' => '{{PLURAL:$1|पिछला १ परिणाम| पिछले $1 परिणाम}}',
'nextn-title' => '{{PLURAL:$1|अगला १ परिणाम| अगले $1 परिणाम}}',
'shown-title' => 'हर पनà¥à¤¨à¥‡ पर {{PLURAL:$1|परिणाम|परिणाम}} दिखाà¤à¤',
-'viewprevnext' => 'देख़ें ($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => 'देखें ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'खोज विकलà¥à¤ª',
'searchmenu-exists' => "'''इस विकि पर \"[[:\$1]]\" नाम से à¤à¤• पनà¥à¤¨à¤¾ है'''",
'searchmenu-new' => "'''इस विकि पर \"[[:\$1]]\" नाम से पनà¥à¤¨à¤¾ बनाà¤à¤!'''",
'searchhelp-url' => 'Help:सहायता',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|इस उपसरà¥à¤— वाले पनà¥à¤¨à¥‡ देखें]]',
'searchprofile-articles' => 'सामगà¥à¤°à¥€ वाले पनà¥à¤¨à¥‡',
-'searchprofile-project' => 'मदद व परियोजना वाले पनà¥à¤¨à¥‡',
+'searchprofile-project' => 'सहायता और परियोजना वाले पृषà¥à¤ ',
'searchprofile-images' => 'बहà¥à¤®à¤¾à¤§à¥à¤¯à¤®',
'searchprofile-everything' => 'सब कà¥à¤›',
'searchprofile-advanced' => 'उनà¥à¤¨à¤¤',
@@ -1005,6 +1004,7 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'searchprofile-everything-tooltip' => '(वारà¥à¤¤à¤¾ पनà¥à¤¨à¥‹à¤‚ सहित) सारी सामगà¥à¤°à¥€ में खोजें',
'searchprofile-advanced-tooltip' => 'विशेष नामसà¥à¤¥à¤¾à¤¨à¥‹à¤‚ में खोजें',
'search-result-size' => '$1 ({{PLURAL:$2|1 शबà¥à¤¦|$2 शबà¥à¤¦}})',
+'search-result-category-size' => '{{PLURAL:$1|1 सदसà¥à¤¯|$1 सदसà¥à¤¯}} ({{PLURAL:$2|1 उपशà¥à¤°à¥‡à¤£à¥€|$2 उपशà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤‚}}, {{PLURAL:$3|1 सञà¥à¤šà¤¿à¤•à¤¾|$3 सञà¥à¤šà¤¿à¤•à¤¾à¤à¤‚}})',
'search-result-score' => 'संबदà¥à¤§: $1%',
'search-redirect' => '($1 को अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤)',
'search-section' => '(विभाग $1)',
@@ -1081,6 +1081,7 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'contextlines' => 'पà¥à¤°à¤¤à¤¿ हिट कतारें:',
'contextchars' => 'पà¥à¤°à¤¤à¤¿ कतार संदरà¥à¤­:',
'stub-threshold' => '<a href="#" class="stub">आधार कड़ियों</a> का जà¥à¤¯à¤¾à¤¦à¤¾à¤¸à¥‡ जà¥à¤¯à¤¾à¤¦à¤¾ आकार (बाईटà¥à¤¸):',
+'stub-threshold-disabled' => 'अकà¥à¤·à¤® किया गया',
'recentchangesdays' => 'हाल में हà¥à¤ बदलावोंमें दरà¥à¤¶à¤¾à¤¨à¥‡ के दिन:',
'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिन|दिन}}',
'recentchangescount' => 'मूल रूप से कितने संपादन दिखाà¤à¤:',
@@ -1114,6 +1115,7 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'prefs-files' => 'फ़ाईलें',
'prefs-custom-css' => 'खासमखास सीà¤à¤¸à¤à¤¸',
'prefs-custom-js' => 'खासमखास जेà¤à¤¸',
+'prefs-common-css-js' => 'सभी तà¥à¤µà¤šà¤¾à¤“ं के लिठसाà¤à¤¾ सीà¤à¤¸à¤à¤¸/जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ:',
'prefs-reset-intro' => 'आप इस पनà¥à¤¨à¥‡ के जरिठअपनी वरीयताओं को सà¥à¤¥à¤² की मूल वरीयताओं के समान बना सकते हैं।
इसके बाद आप वापस पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर नहीं आ सकेंगे।',
'prefs-emailconfirm-label' => 'डाक पà¥à¤·à¥à¤Ÿà¤¿:',
@@ -1123,7 +1125,7 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'uid' => 'सदसà¥à¤¯ कà¥à¤°à¤®à¤¾à¤‚क:',
'prefs-memberingroups' => 'निमà¥à¤¨à¤²à¤¿à¤–ित {{PLURAL:$1|गà¥à¤°à¥à¤ª का|गà¥à¤°à¥à¤ªà¥‹à¤‚ का}} सदसà¥à¤¯:',
'prefs-registration' => 'पंजीकरण समय:',
-'yourrealname' => 'आपका असली नाम*',
+'yourrealname' => 'वासà¥à¤¤à¤µà¤¿à¤• नाम:',
'yourlanguage' => 'भाषा:',
'yourvariant' => 'वेरियंट:',
'yournick' => 'आपका उपनाम (दसà¥à¤¤à¤–त/सही के लिये)',
@@ -1152,9 +1154,15 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'prefs-advancedrendering' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ª',
'prefs-advancedsearchoptions' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ª',
'prefs-advancedwatchlist' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ª',
-'prefs-display' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
+'prefs-displayrc' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
+'prefs-displaysearchoptions' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
+'prefs-displaywatchlist' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
'prefs-diffs' => 'अंतर',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ईमेल पता वैध पà¥à¤°à¤¤à¥€à¤¤ होता है',
+'email-address-validity-invalid' => 'à¤à¤• वैध ईमेल पता पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ करें',
+
# User rights
'userrights' => 'सदसà¥à¤¯ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
'userrights-lookup-user' => 'सदसà¥à¤¯ गà¥à¤°à¥à¤ªà¥‹à¤‚का वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ करें',
@@ -1238,6 +1246,7 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'right-hideuser' => 'à¤à¤• सदसà¥à¤¯à¤¨à¤¾à¤® लोगोंसे छà¥à¤ªà¤¾à¤¯à¥‡à¤‚',
'right-ipblock-exempt' => 'आइपी बà¥à¤²à¥‰à¤•à¥à¤¸ को नजर अंदाज करें',
'right-proxyunbannable' => 'पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ होनेपर बà¥à¤²à¥‰à¤•à¥à¤¸ को नजर अंदाज करें',
+'right-unblockself' => 'सà¥à¤µà¤¯à¤‚ खà¥à¤²à¤¨à¤¾',
'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° बदलें',
'right-editprotected' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पनà¥à¤¨à¥‡ बदलें',
'right-editinterface' => 'सदसà¥à¤¯à¥‹à¤‚का इंटरफेस बदलें',
@@ -1260,7 +1269,6 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'right-siteadmin' => 'डाटाबेस को ताला लगायें या खोलें',
'right-reset-passwords' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ के कूटशबà¥à¤¦ बदलना',
'right-override-export-depth' => 'पनà¥à¤¨à¥‹à¤‚ का निरà¥à¤¯à¤¾à¤¤, ५वीं गहराई तक के हवाले वाले पनà¥à¤¨à¥‹à¤‚ समेत',
-'right-versiondetail' => 'विसà¥à¤¤à¥ƒà¤¤ तंतà¥à¤°à¤¾à¤‚श संसà¥à¤•à¤°à¤£ जानकारी देखना',
'right-sendemail' => 'सही ईमेल भेजें',
# User rights log
@@ -1311,14 +1319,9 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'recentchanges-legend' => 'हाल के परिवरà¥à¤¤à¤¨ संबंधी विकलà¥à¤ª',
'recentchangestext' => 'इस विकिपर हाल में हà¥à¤ बदलाव इस पनà¥à¤¨à¥‡ पर देखें जा सकतें हैं।',
'recentchanges-feed-description' => 'इस फ़ीडमें होनेवाले विकिपर हाल में हà¥à¤ बदलाव देखियें ।',
-'recentchanges-label-legend' => 'आखà¥à¤¯à¤¾à¤¨: $1।',
-'recentchanges-legend-newpage' => '$1 - नया पनà¥à¤¨à¤¾',
'recentchanges-label-newpage' => 'इस संपादन से नया पनà¥à¤¨à¤¾ बना',
-'recentchanges-legend-minor' => '$1 - छोटा संपादन',
-'recentchanges-label-minor' => 'यह à¤à¤• छोटा संपादन है',
-'recentchanges-legend-bot' => '$1 - यांतà¥à¤°à¤¿à¤• संपादन',
+'recentchanges-label-minor' => 'यह à¤à¤• छोटा समà¥à¤ªà¤¾à¤¦à¤¨ है',
'recentchanges-label-bot' => 'यह à¤à¤• यांतà¥à¤°à¤¿à¤• संपादन था',
-'recentchanges-legend-unpatrolled' => '$1 - बिना निगरानी का संपादन',
'recentchanges-label-unpatrolled' => 'इस संपादन की अभी निगरानी नहीं हà¥à¤ˆ है',
'rcnote' => "$5, $4 के पहले के {{PLURAL:$2|'''१''' दिन|'''$2''' दिनों}} में {{PLURAL:$1|हà¥à¤† '''१''' बदलाव इस पà¥à¤°à¤•à¤¾à¤° है| हà¥à¤ '''$1''' बदलाव इस पà¥à¤°à¤•à¤¾à¤° हैं}}।",
'rcnotefrom' => "नीचे '''$2''' से हà¥à¤ ('''$1''' या कम) बदलाव दरà¥à¤¶à¤¾à¤¯à¥‡ गये है ।",
@@ -1365,6 +1368,8 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'upload_directory_missing' => 'चढ़ाने के लिठनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ ($1) मौजूद नहीं है, और न ही जालसेवक इसका निरà¥à¤®à¤¾à¤£ कर पाया।',
'upload_directory_read_only' => 'अपलोड डाइरेकà¥à¤Ÿà¤°à¥€ ($1) में सरà¥à¤µà¤° लिख नहीं पा रहा हैं।',
'uploaderror' => 'अपलोड à¤à¤°à¤°',
+'upload-recreate-warning' => "'''चेतावनी: उस नाम की सञà¥à¤šà¤¿à¤•à¤¾ हटाई या सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤¿à¤¤ की जा चà¥à¤•à¥€ है।'''
+इस पृषà¥à¤  का विनषà¥à¤Ÿ और सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤¿à¤¤ अभिलेख सनà¥à¤¦à¤°à¥à¤­ के लिठदिया गया है:",
'uploadtext' => "संचिका चढ़ाने के लिठनीचे दिठपरà¥à¤šà¥‡ का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें।
[[Special:FileList|चढ़ाई गई संचिकाओं की सूची]] से आप पहले चढ़ाई जा चà¥à¤•à¥€ संचिकाओं को देख सकते हैं या उनमें खोज सकते हैं। दोबारा चढ़ाई गई संचिकाओं को [[Special:Log/upload|चढ़ाने के चिटà¥à¤ à¥‡]] में देखें, और मिटाई संचिकाओं के लिठ[[Special:Log/delete|मिटाने के चिटà¥à¤ à¥‡]] देखें।
@@ -1400,6 +1405,17 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
'filetype-banned-type' => "'''\".\$1\"''' à¤à¤• वांछित संचिका पà¥à¤°à¤•à¤¾à¤° नहीं है।
वांछित संचिका पà¥à¤°à¤•à¤¾à¤° {{PLURAL:\$3|है|हैं}} \$2।",
'filetype-missing' => 'इस फ़ाईल को à¤à¤•à¥à¤¸à¥à¤Ÿà¥‡à¤‚शन नहीं हैं (उदा ".jpg")।',
+'empty-file' => 'फ़ाइल पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ खाली था',
+'file-too-large' => 'फ़ाइल पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ बहà¥à¤¤ बड़ा था.',
+'filename-tooshort' => 'फ़ाइल का नाम बहà¥à¤¤ छोटा है।',
+'filetype-banned' => 'इस पà¥à¤°à¤•à¤¾à¤° की फ़ाइल पर पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध लगा दिया है',
+'verification-error' => 'यह सञà¥à¤šà¤¿à¤•à¤¾, सञà¥à¤šà¤¿à¤•à¤¾ सतà¥à¤¯à¤¾à¤ªà¤¨ में अनà¥à¤¤à¥à¤¤à¥€à¤°à¥à¤£ रही।',
+'hookaborted' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¤¾à¤¸à¤°à¤¤ संशोधन विसà¥à¤¤à¤¾à¤° हूक दà¥à¤µà¤¾à¤°à¤¾ निरसà¥à¤¤ किया गया।',
+'illegal-filename' => 'फ़ाइल नाम की अनà¥à¤®à¤¤à¤¿ नहीं है',
+'overwrite' => ' मौजूदा फ़ाइल को अधिलेखित करने की अनà¥à¤®à¤¤à¤¿ नहीं है',
+'unknown-error' => 'à¤à¤• अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ.',
+'tmp-create-error' => 'असà¥à¤¥à¤¾à¤ˆ फ़ाइल नहीं बना सका',
+'tmp-write-error' => 'असà¥à¤¥à¤¾à¤¯à¥€ फाइल को लिखने में तà¥à¤°à¥à¤Ÿà¤¿.',
'large-file' => 'फ़ाईलें $1 से कम आकार की होना आवशà¥à¤¯à¤• हैं;
यह फ़ाईल $2 आकार की हैं।',
'largefileserver' => 'इस फ़ाईल का आकार निरà¥à¤§à¤¾à¤°à¤¿à¤¤ आकार से जà¥à¤¯à¤¾à¤¦à¤¾ हैं।',
@@ -1427,13 +1443,14 @@ $2, $1 की तिथि के आइटम को छà¥à¤ªà¤¾à¤¨à¥‡ मेà
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'यह संचिका निमà¥à¤¨à¤²à¤¿à¤–ित {{PLURAL:$1|संचिका|संचिकाओं}} की पà¥à¤°à¤¤à¤¿ है:',
'file-deleted-duplicate' => 'इसी संचिका ([[:$1]]) के समान à¤à¤• और संचिका पहले मिटाई गई थी। इसे फिर से चढ़ाने के पहले आपको इस संचिका के मिटाने के इतिहास को देख लेना चाहिà¤à¥¤',
-'successfulupload' => 'अपलोड हो गईं',
'uploadwarning' => 'अपलोड वारà¥à¤¨à¤¿à¤‚ग',
'uploadwarning-text' => 'फ़ाइल विवरण को संशोधित कर फिर कोशिश करें.',
'savefile' => 'फ़ाईल संजोयें',
'uploadedimage' => '"[[$1]]" को चढाया गया हैं',
'overwroteimage' => '"[[$1]]" का नया अवतरण अपलोड किया',
'uploaddisabled' => 'अपलोड पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित हैं',
+'copyuploaddisabled' => 'यूआरà¤à¤² दà¥à¤µà¤¾à¤°à¤¾ अपलोड अकà¥à¤·à¤®à¤¿à¤¤à¥¤',
+'uploadfromurl-queued' => 'आपका अपलोड पंकà¥à¤¤à¤¿à¤¬à¤¦à¥à¤§ किया गया।',
'uploaddisabledtext' => 'संचिका चढ़ाना बंद है।',
'php-uploaddisabledtext' => 'पीà¤à¤šà¤ªà¥€ में संचिका चढ़ाना बंद है।
कृपया file_uploads जमाव की जाà¤à¤š करें।',
@@ -1469,6 +1486,12 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'अपलोड हो गईं',
+'upload-success-msg' => 'आपका [$2] अपलोड पà¥à¤°à¤ªà¤¤à¥à¤° असफल रहा। यह यहां: [[:{{ns:file}}:$1]] उपलबà¥à¤§ है',
+'upload-failure-subj' => 'अपलोड समसà¥à¤¯à¤¾',
+'upload-failure-msg' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ [$2] से अपलोड के साथ à¤à¤• समसà¥à¤¯à¤¾ थी:',
+'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> से शà¥à¤°à¥ होना आवशà¥à¤¯à¤• हैं।',
@@ -1534,6 +1557,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization को देखेंà
'listfiles_search_for' => 'इस मीडिया नाम से खोजें:',
'imgfile' => 'सञà¥à¤šà¤¿à¤•à¤¾',
'listfiles' => 'चितà¥à¤° सूची',
+'listfiles_thumb' => 'अंगूठानख',
'listfiles_date' => 'दिनांक',
'listfiles_name' => 'नाम',
'listfiles_user' => 'सदसà¥à¤¯',
@@ -1649,8 +1673,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization को देखेंà
'statistics-edits' => '{{SITENAME}} का जमाव होने के बाद से पनà¥à¤¨à¥‹à¤‚ के संपादन',
'statistics-edits-average' => 'पà¥à¤°à¤¤à¤¿ पनà¥à¤¨à¤¾ औसत संपादन',
'statistics-views-total' => 'कà¥à¤² दृषà¥à¤¯',
+'statistics-views-total-desc' => 'अविदà¥à¤¯à¤®à¤¾à¤¨ पृषà¥à¤ à¥‹à¤‚ और विशेष पृषà¥à¤ à¥‹à¤‚ के लिठदृशà¥à¤¯ समà¥à¤®à¤¿à¤²à¤¿à¤¤ नहीं हैं',
'statistics-views-peredit' => 'दृषà¥à¤¯ पà¥à¤°à¤¤à¤¿ संपादन',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue कारà¥à¤¯ पंकà¥à¤¤à¤¿] की लंबाई',
'statistics-users' => 'पंजीकृत [[Special:ListUsers|सदसà¥à¤¯]]',
'statistics-users-active' => 'सकà¥à¤°à¤¿à¤¯ सदसà¥à¤¯',
'statistics-users-active-desc' => 'पिछले {{PLURAL:$1|à¤à¤• दिन|$1 दिनों}} में कà¥à¤› गतिविधि रखने वाले सदसà¥à¤¯',
@@ -1663,9 +1687,9 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization को देखेंà
यदि कोई पृषà¥à¤  à¤à¤¸à¥‡ सांचे का पà¥à¤°à¤¯à¥‹à¤— करता है, जो की [[MediaWiki:Disambiguationspage]] से जà¥à¤¡à¤¼à¤¾ हà¥à¤† है, तो उसे असमंजश पृषà¥à¤  समà¤à¤¾ जाता है।",
'doubleredirects' => 'दà¥à¤—à¥à¤¨à¥€-अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¥‡',
-'doubleredirectstext' => 'यह पनà¥à¤¨à¤¾ उन पनà¥à¤¨à¥‹à¤‚ की सूची देता है जो अनà¥à¤¯ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ पनà¥à¤¨à¥‹à¤‚ की ओर पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ होते हैं।
+'doubleredirectstext' => 'यह पनà¥à¤¨à¤¾ उन पनà¥à¤¨à¥‹à¤‚ की सूची देता है जो अनà¥à¤¯ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ पनà¥à¤¨à¥‹à¤‚ की ओर पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ होते हैं।
हर कतार में पहले और दूसरे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ की कड़ियाà¤, तथा दूसरे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ का लकà¥à¤·à¥à¤¯ भी है, आमतौर पर यही "वासà¥à¤¤à¤µà¤¿à¤•" लकà¥à¤·à¥à¤¯à¤¿à¤¤ पृषà¥à¤  होगा, और पहला पà¥à¤¨à¤°à¥à¤¦à¥‡à¤¶à¤¨ वासà¥à¤¤à¤µ में इसी को लकà¥à¤·à¥à¤¯à¤¿à¤¤ होना चाहिठथा।
-<s>à¤à¤• दूसरे को काटने वाली</s> पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¤¾à¤ सà¥à¤²à¤à¤¾ दी गई हैं।',
+<del>à¤à¤• दूसरे को काटने वाली</del> पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¤¾à¤ सà¥à¤²à¤à¤¾ दी गई हैं।',
'double-redirect-fixed-move' => '[[$1]] की जगह बदली जा चà¥à¤•à¥€ है।
अब यह [[$2]] की ओर पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ होता है।',
'double-redirect-fixer' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ मिसà¥à¤¤à¥à¤°à¥€',
@@ -1689,6 +1713,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization को देखेंà
'nmembers' => '{{PLURAL:$1|à¤à¤• सदसà¥à¤¯|$1 सदसà¥à¤¯}}',
'nrevisions' => '$1 {{PLURAL:$1|रूपानà¥à¤¤à¤°|रूपानà¥à¤¤à¤°à¥‡à¤‚}}',
'nviews' => '{{PLURAL:$1|à¤à¤•|$1}} बार देखा गया है',
+'nimagelinks' => '$1 {{PLURAL:$1|page|पृषà¥à¤ à¥‹à¤‚}} पर पà¥à¤°à¤¯à¥à¤•à¥à¤¤',
+'ntransclusions' => '$1 {{PLURAL:$1|page|पृषà¥à¤ à¥‹à¤‚}} पर पà¥à¤°à¤¯à¥à¤•à¥à¤¤',
'specialpage-empty' => 'इस बà¥à¤¯à¥Œà¤°à¥‡ के लिये कोई परिणाम नहीं हैं।',
'lonelypages' => 'अकेले पनà¥à¤¨à¥‡',
'lonelypagestext' => 'निमà¥à¤¨à¥‹à¤•à¥à¤¤ पनà¥à¤¨à¥‡ के न तो {{SITENAME}} के अनà¥à¤¯ पनà¥à¤¨à¥‹à¤‚ में हवाले हैं और न ही वे किसी और पनà¥à¤¨à¥‡ के अंदर जड़े हà¥à¤ हैं।',
@@ -1844,34 +1870,40 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization को देखेंà
'listgrouprights-removegroup-self-all' => 'अपने खाते से सभी समूह हटाà¤à¤',
# E-mail user
-'mailnologin' => 'पानेवाले का à¤à¤¡à¥à¤°à¥‡à¤¸ दिया नहीं',
-'mailnologintext' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ को इ-मेल भेजने के लिये आपने [[Special:UserLogin|लॉग इन]] किया होना जरूरी हैं और आपकी [[Special:Preferences|वरीयताओंमें]] वैध इ-मेल à¤à¤¡à¥à¤°à¥‡à¤¸ होना आवशà¥à¤¯à¤• हैं।',
-'emailuser' => 'इस सदसà¥à¤¯ को ई-मेल भेजें',
-'emailpage' => 'सदसà¥à¤¯ को इ-मेल करें',
-'emailpagetext' => 'नीचे दिठपरà¥à¤šà¥‡ को जरिठआप इस सदसà¥à¤¯ को डाक भेज सकते हैं।
+'mailnologin' => 'पानेवाले का à¤à¤¡à¥à¤°à¥‡à¤¸ दिया नहीं',
+'mailnologintext' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ को इ-मेल भेजने के लिये आपने [[Special:UserLogin|लॉग इन]] किया होना जरूरी हैं और आपकी [[Special:Preferences|वरीयताओंमें]] वैध इ-मेल à¤à¤¡à¥à¤°à¥‡à¤¸ होना आवशà¥à¤¯à¤• हैं।',
+'emailuser' => 'इस सदसà¥à¤¯ को ई-मेल भेजें',
+'emailpage' => 'सदसà¥à¤¯ को इ-मेल करें',
+'emailpagetext' => 'नीचे दिठपरà¥à¤šà¥‡ को जरिठआप इस सदसà¥à¤¯ को डाक भेज सकते हैं।
आपने जो पता [[Special:Preferences|अपनी सदसà¥à¤¯ वरीयताओं]] में दिया था वह इस डाक के "पà¥à¤°à¥‡à¤·à¤•" के तौर पर आà¤à¤—ा, अतः पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾ आपको सीधे जवाब दे सकेंगे।',
-'usermailererror' => 'मेल ऑबà¥à¤œà¥‡à¤•à¥à¤Ÿ ने यह गलती बताई हैं:',
-'defemailsubject' => 'विकिपीडिया ई-मेल',
-'noemailtitle' => 'इ-मेल à¤à¤¡à¥à¤°à¥‡à¤¸ नहीं',
-'noemailtext' => 'इस सदसà¥à¤¯ ने वैध डाक पता नहीं दिया है।',
-'nowikiemailtitle' => 'डाक की अनà¥à¤®à¤¤à¤¿ नहीं है',
-'nowikiemailtext' => 'इस सदसà¥à¤¯ ने अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤“ं से डाक न पà¥à¤°à¤¾à¤ªà¥à¤¤ करने का फ़ैसला लिया हà¥à¤† है।',
-'email-legend' => 'किसी और {{SITENAME}} सदसà¥à¤¯ को डाक भेजें',
-'emailfrom' => 'पà¥à¤°à¥‡à¤·à¤•:',
-'emailto' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾:',
-'emailsubject' => 'विषय:',
-'emailmessage' => 'संदेश:',
-'emailsend' => 'भेजें',
-'emailccme' => 'मेरे इ-मेल की कापी मà¥à¤à¥‡ भी भेजें।',
-'emailccsubject' => 'आपके इ-मेल की कापी जो $1 को भेजा गया: $2',
-'emailsent' => 'ई-मेल भेज दिया गया है।',
-'emailsenttext' => 'आपका ई-मेल संदेश भेज दिया गया है ।',
-'emailuserfooter' => 'यह डाक {{SITENAME}} की "सदसà¥à¤¯ डाक" सà¥à¤µà¤¿à¤§à¤¾ के जरिठ$1 से $2 को भेजी गई थी।',
+'usermailererror' => 'मेल ऑबà¥à¤œà¥‡à¤•à¥à¤Ÿ ने यह गलती बताई हैं:',
+'defemailsubject' => 'विकिपीडिया ई-मेल',
+'usermaildisabled' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ ईमेल अकà¥à¤·à¤® किया गया',
+'usermaildisabledtext' => 'आप इस विकि पर ई मेल अनà¥à¤¯ यूज़रà¥à¤¸ को नहीं भेज सकते हैं',
+'noemailtitle' => 'इ-मेल à¤à¤¡à¥à¤°à¥‡à¤¸ नहीं',
+'noemailtext' => 'इस सदसà¥à¤¯ ने वैध डाक पता नहीं दिया है।',
+'nowikiemailtitle' => 'डाक की अनà¥à¤®à¤¤à¤¿ नहीं है',
+'nowikiemailtext' => 'इस सदसà¥à¤¯ ने अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤“ं से डाक न पà¥à¤°à¤¾à¤ªà¥à¤¤ करने का फ़ैसला लिया हà¥à¤† है।',
+'email-legend' => 'किसी और {{SITENAME}} सदसà¥à¤¯ को डाक भेजें',
+'emailfrom' => 'पà¥à¤°à¥‡à¤·à¤•:',
+'emailto' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾:',
+'emailsubject' => 'विषय:',
+'emailmessage' => 'संदेश:',
+'emailsend' => 'भेजें',
+'emailccme' => 'मेरे इ-मेल की कापी मà¥à¤à¥‡ भी भेजें।',
+'emailccsubject' => 'आपके इ-मेल की कापी जो $1 को भेजा गया: $2',
+'emailsent' => 'ई-मेल भेज दिया गया है।',
+'emailsenttext' => 'आपका ई-मेल संदेश भेज दिया गया है ।',
+'emailuserfooter' => 'यह डाक {{SITENAME}} की "सदसà¥à¤¯ डाक" सà¥à¤µà¤¿à¤§à¤¾ के जरिठ$1 से $2 को भेजी गई थी।',
+
+# User Messenger
+'usermessage-summary' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ सनà¥à¤¦à¥‡à¤¶ छोड़ रहा है।',
+'usermessage-editor' => 'सिसà¥à¤Ÿà¤® दूत',
# Watchlist
'watchlist' => 'मेरी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची',
'mywatchlist' => 'मेरी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची',
-'watchlistfor' => "('''$1''' के लिये)",
+'watchlistfor2' => '$1 $2 के लिà¤',
'nowatchlist' => 'आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमें कोईभी लेख नहीं हैं।',
'watchlistanontext' => 'अपने धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमें होने वाले लेख देखने या फिर संपादित करने के लिये कॄपया $1 करें।',
'watchnologin' => 'लॉग इन नहीं किया हैं',
@@ -1993,7 +2025,10 @@ $NEWPAGE
'revertpage-nouser' => '(पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नाम हटाया गया है) दà¥à¤µà¤¾à¤°à¤¾ किठगठसंपादन को वापस पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ में ला कर इसके पहले के [[User:$1|$1]] दà¥à¤µà¤¾à¤°à¤¾ बने संसà¥à¤•à¤°à¤£ को फिर से ताज़ा संसà¥à¤•à¤°à¤£ बनाà¤à¤à¥¤',
'rollback-success' => '$1 के संपादन हटायें;
$2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण को पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया।',
-'sessionfailure' => 'à¤à¤¸à¤¾ पà¥à¤°à¤¤à¥€à¤¤ होता है की आपके लोगिन सतà¥à¤° के साथ कोई समसà¥à¤¯à¤¾ है।
+
+# Edit tokens
+'sessionfailure-title' => 'सतà¥à¤° विफलता',
+'sessionfailure' => 'à¤à¤¸à¤¾ पà¥à¤°à¤¤à¥€à¤¤ होता है की आपके लोगिन सतà¥à¤° के साथ कोई समसà¥à¤¯à¤¾ है।
सतà¥à¤° अपहरण से बचाने के लिठसावधानी के तौर पर आपका यह कà¥à¤°à¤¿à¤¯à¤¾à¤•à¤²à¤¾à¤ª रदà¥à¤¦ कर दिया गया है।
कृपया "back" पर वार करें और पृषà¥à¤  को दà¥à¤¬à¤¾à¤°à¤¾ से लोड करें, तब दà¥à¤¬à¤¾à¤°à¤¾ कोशिश करें।',
@@ -2129,18 +2164,22 @@ $1',
'month' => 'इस महिनेसे (और पà¥à¤°à¤¾à¤¨à¥‡à¤‚):',
'year' => 'इस सालसे (और पà¥à¤°à¤¾à¤¨à¥‡):',
-'sp-contributions-newbies' => 'सिरà¥à¤« नये सदसà¥à¤¯à¥‹à¤‚का योगदान दरà¥à¤¶à¤¾à¤¯à¥‡à¤‚',
-'sp-contributions-newbies-sub' => 'नये सदसà¥à¤¯à¥‹à¤‚के लिये',
-'sp-contributions-newbies-title' => 'नठसदसà¥à¤¯à¥‹à¤‚ दà¥à¤µà¤¾à¤°à¤¾ योगदान',
-'sp-contributions-blocklog' => 'बà¥à¤²à¥‰à¤• सूची',
-'sp-contributions-deleted' => 'सदसà¥à¤¯à¥‹à¤‚ को योगदान जो हटाठजा चà¥à¤•à¥‡ हैं',
-'sp-contributions-logs' => 'चिटà¥à¤ à¥‡',
-'sp-contributions-talk' => 'वारà¥à¤¤à¤¾',
-'sp-contributions-userrights' => 'सदसà¥à¤¯ अधिकार पà¥à¤°à¤¬à¤‚धन',
-'sp-contributions-blocked-notice' => 'यह सदसà¥à¤¯ फ़िलहाल अवरोधित हैं। सदंरà¥à¤­ के लिठताज़ातरीन अवरोध चिटà¥à¤ à¤¾ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ नीचे है:',
-'sp-contributions-search' => 'योगदान के लिये खोज',
-'sp-contributions-username' => 'आईपी à¤à¤¡à¥à¤°à¥‡à¤¸ या सदसà¥à¤¯à¤¨à¤¾à¤®:',
-'sp-contributions-submit' => 'खोजिà¤',
+'sp-contributions-newbies' => 'सिरà¥à¤« नये सदसà¥à¤¯à¥‹à¤‚का योगदान दरà¥à¤¶à¤¾à¤¯à¥‡à¤‚',
+'sp-contributions-newbies-sub' => 'नये सदसà¥à¤¯à¥‹à¤‚के लिये',
+'sp-contributions-newbies-title' => 'नठसदसà¥à¤¯à¥‹à¤‚ दà¥à¤µà¤¾à¤°à¤¾ योगदान',
+'sp-contributions-blocklog' => 'बà¥à¤²à¥‰à¤• सूची',
+'sp-contributions-deleted' => 'सदसà¥à¤¯à¥‹à¤‚ को योगदान जो हटाठजा चà¥à¤•à¥‡ हैं',
+'sp-contributions-uploads' => 'अपलोड',
+'sp-contributions-logs' => 'चिटà¥à¤ à¥‡',
+'sp-contributions-talk' => 'वारà¥à¤¤à¤¾',
+'sp-contributions-userrights' => 'सदसà¥à¤¯ अधिकार पà¥à¤°à¤¬à¤‚धन',
+'sp-contributions-blocked-notice' => 'यह सदसà¥à¤¯ फ़िलहाल अवरोधित हैं। सदंरà¥à¤­ के लिठताज़ातरीन अवरोध चिटà¥à¤ à¤¾ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ नीचे है:',
+'sp-contributions-blocked-notice-anon' => 'यह आईपी पता अभी अवरोधित है।
+नवीनतम अवरोध अभिलेख पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ सनà¥à¤¦à¤°à¥à¤­ के लिठनीचे दी गई है:',
+'sp-contributions-search' => 'योगदान के लिये खोज',
+'sp-contributions-username' => 'आईपी à¤à¤¡à¥à¤°à¥‡à¤¸ या सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'sp-contributions-toponly' => 'केवल उन समà¥à¤ªà¤¾à¤¦à¤¨à¥‹à¤‚ को दिखाà¤à¤ जो नवीनतम संशोधन हैं',
+'sp-contributions-submit' => 'खोजिà¤',
# What links here
'whatlinkshere' => 'यहाठके हवाले कहाठकहाठहैं',
@@ -2201,7 +2240,6 @@ $1',
'ipb-edit-dropdown' => 'बà¥à¤²à¥‰à¤• कारण संपादित करें',
'ipb-unblock-addr' => '$1 को अनबà¥à¤²à¥‰à¤• करें',
'ipb-unblock' => 'सदसà¥à¤¯ अथवा आईपी à¤à¤¡à¥à¤°à¥‡à¤¸ को अनबà¥à¤²à¥‰à¤• करें',
-'ipb-blocklist-addr' => '$1 के मौजूदा अवरोध',
'ipb-blocklist' => 'सदà¥à¤¯ बà¥à¤²à¥‰à¤• देखें',
'ipb-blocklist-contribs' => '$1 के लिठयोगदान',
'unblockip' => 'सदसà¥à¤¯ को अनबà¥à¤²à¥‰à¤• करें',
@@ -2229,7 +2267,7 @@ $1',
'ipblocklist-empty' => 'बà¥à¤²à¥‰à¤• सूची खाली हैं।',
'ipblocklist-no-results' => 'पूछे गये आईपी à¤à¤¡à¥à¤°à¥‡à¤¸ / सदसà¥à¤¯à¤¨à¤¾à¤® पर बà¥à¤²à¥‰à¤• नहीं हैं।',
'blocklink' => 'अवरोधित करें',
-'unblocklink' => 'अवरोध हटाà¤à¤‚',
+'unblocklink' => 'अवरोध हटाà¤à¤',
'change-blocklink' => 'विभाग बदलें',
'contribslink' => 'योगदान',
'autoblocker' => 'आपका IP पता सà¥à¤µà¤¤: बाधà¥à¤¯ है, जो की हाल ही में "[[User:$1|$1]]" दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— किया गया है।
@@ -2275,6 +2313,8 @@ $1 पहले ही अवरोधित है।
'sorbs_create_account_reason' => '{{SITENAME}} के DNSBL ने आपका आईपी à¤à¤¡à¥à¤°à¥‡à¤¸ ओपन पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ करके सूचित किया हैं। आप खाता खोल नहीं सकतें।',
'cant-block-while-blocked' => 'आप खà¥à¤¦ ही अवरोधित हैं इसलिठइस समय आप औरों को अवरोधित नहीं कर सकते हैं।',
'cant-see-hidden-user' => 'कठबोली छà¥à¤ªà¤¾ उपयोगकरà¥à¤¤à¤¾ देखना',
+'ipbblocked' => 'आप अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤“ं को अवरोधित या अनवरोधित नहीं कर सकते, कà¥à¤¯à¥‹à¤‚कि आप सà¥à¤µà¤¯à¤‚ अवरोधित हैं',
+'ipbnounblockself' => 'आपको सà¥à¤µà¤¯à¤‚ को अनवरोधित करने की अनà¥à¤®à¤¤à¤¿ नहीं है',
# Developer tools
'lockdb' => 'डाटाबेस लॉक करें',
@@ -2352,7 +2392,7 @@ $1 पहले ही अवरोधित है।
'1movedto2' => '[[$1]] का नाम बदलकर [[$2]] कर दिया गया है',
'1movedto2_redir' => '[[$1]] यह लेख का नाम बदल कर [[$2]] कर दिया गया हैं (अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤)',
'move-redirect-suppressed' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ नहीं किया गया',
-'movelogpage' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण सूची',
+'movelogpage' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤£ सूची',
'movelogpagetext' => 'नाम बदले गये लेखोंकी सूची नीचे दी गई हैं।',
'movesubpage' => '{{PLURAL:$1|उप पनà¥à¤¨à¤¾|उप पनà¥à¤¨à¥‡}}',
'movesubpagetext' => 'नीचे $1 {{PLURAL:$1|पनà¥à¤¨à¤¾ दिखाया गया है, जो इस पनà¥à¤¨à¥‡ का उप पनà¥à¤¨à¤¾ है|पनà¥à¤¨à¤¾ दिखाया गया है, जो इस पनà¥à¤¨à¥‡ के उप पनà¥à¤¨à¥‡ हैं}}।',
@@ -2373,6 +2413,7 @@ $1 पहले ही अवरोधित है।
'immobile-source-page' => 'इस पनà¥à¤¨à¥‡ का सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण नहीं किया जा सकता है।',
'immobile-target-page' => 'इस गंतवà¥à¤¯ शीरà¥à¤·à¤• पर नहीं ले जाया जा सकता है।',
'imagenocrossnamespace' => 'संचिका को ग़ैर-संचिका नामसà¥à¤¥à¤¾à¤¨ में सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित नहीं किया जा सकता है',
+'nonfile-cannot-move-to-file' => 'असञà¥à¤šà¤¿à¤•à¤¾ को सञà¥à¤šà¤¿à¤•à¤¾ नामसà¥à¤¥à¤¾à¤¨ में नहीं ले जाया जा सकता',
'imagetypemismatch' => 'संचिका का नया विसà¥à¤¤à¤¾à¤° उसकी किसà¥à¤® से मेल नहीं खा रहा है',
'imageinvalidfilename' => 'लकà¥à¤·à¥à¤¯à¤¿à¤¤ संचिका नाम अवैध है',
'fix-double-redirects' => 'मूल शीरà¥à¤·à¤• तक जाने वाले सभी पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‹à¤‚ को भी बदलें',
@@ -2481,10 +2522,10 @@ $1 पहले ही अवरोधित है।
'tooltip-pt-anonuserpage' => 'आप जिस आईपी से बदलाव कर रहें हैं उसका सदसà¥à¤¯ पान',
'tooltip-pt-mytalk' => 'आपका वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾',
'tooltip-pt-anontalk' => 'इस आईपी à¤à¤¡à¥à¤°à¥‡à¤¸à¤¸à¥‡ हà¥à¤ बदलावों के बारे में वारà¥à¤¤à¤¾',
-'tooltip-pt-preferences' => 'आपकी वरीयताà¤à¤‚',
+'tooltip-pt-preferences' => 'आपकी वरीयताà¤à¤',
'tooltip-pt-watchlist' => 'आपने धà¥à¤¯à¤¾à¤¨ दिये हà¥à¤ पनà¥à¤¨à¥‹à¤‚की सूची',
'tooltip-pt-mycontris' => 'आपके योगदानों की सूची',
-'tooltip-pt-login' => 'आपसे सतà¥à¤°à¤¾à¤°à¤‚भ करने की गà¥à¤œà¤¼à¤¾à¤°à¤¿à¤¶ है; लेकिन यह लाज़मी नहीं है',
+'tooltip-pt-login' => 'आपको सतà¥à¤°à¤¾à¤°à¤®à¥à¤­ करने के लिठपà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¿à¤¤ किया जाता है; लेकिन यह अनिवारà¥à¤¯ नहीं है',
'tooltip-pt-anonlogin' => 'आप लॉग इन करें, जबकि यह अतà¥à¤¯à¤¾à¤µà¤¶à¥à¤¯à¤• नहीं हैं।',
'tooltip-pt-logout' => 'सतà¥à¤°à¤¾à¤¨à¥à¤¤',
'tooltip-ca-talk' => 'सामगà¥à¤°à¥€ पनà¥à¤¨à¥‡ के बारे में वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
@@ -2506,11 +2547,11 @@ $1 पहले ही अवरोधित है।
'tooltip-p-logo' => 'मà¥à¤– पृषà¥à¤ ',
'tooltip-n-mainpage' => 'मà¥à¤–पृषà¥à¤  पर जाà¤à¤',
'tooltip-n-mainpage-description' => 'मà¥à¤–पृषà¥à¤  पर जाà¤à¤',
-'tooltip-n-portal' => 'परियोजना के बारे में, आप कà¥à¤¯à¤¾ कर सकतें हैं, मदद कहाठसे लें',
+'tooltip-n-portal' => 'परियोजना के बारे में, आप कà¥à¤¯à¤¾ कर सकतें हैं, सहायता कहाठसे लें',
'tooltip-n-currentevents' => 'हालकी घटनाओं की पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤¾à¤ªà¥à¤¤ करें',
-'tooltip-n-recentchanges' => 'विकि में हाल में हà¥à¤ बदलावों की फ़ेरहिसà¥à¤¤',
+'tooltip-n-recentchanges' => 'विकि में हाल में हà¥à¤ बदलावों की सूची',
'tooltip-n-randompage' => 'किसी à¤à¤• लेख पर जाà¤à¤',
-'tooltip-n-help' => 'पता लगाने की जगह',
+'tooltip-n-help' => 'पता लगाने का सà¥à¤¥à¤¾à¤¨',
'tooltip-t-whatlinkshere' => 'यहाठका हवाला देने वाले सभी विकि पनà¥à¤¨à¥‹à¤‚ की सूची',
'tooltip-t-recentchangeslinked' => 'यहां जà¥à¤¡à¥‡ हà¥à¤ सभी पनà¥à¤¨à¥‹à¤‚में हà¥à¤ हाल के बदलाव',
'tooltip-feed-rss' => 'इस पनà¥à¤¨à¥‡ की आरà¤à¤¸à¤à¤¸ फ़ीड',
@@ -2535,13 +2576,15 @@ $1 पहले ही अवरोधित है।
'tooltip-save' => 'अपने बदलाव सà¤à¤œà¥‹à¤à¤',
'tooltip-preview' => 'अपने बदलावों की à¤à¤²à¤• देखें, कृपया सà¤à¤œà¥‹à¤¨à¥‡ से पहले इसका इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें!',
'tooltip-diff' => 'इस पाठà¥à¤¯à¤®à¥‡à¤‚ आपने किये हà¥à¤ बदलाव देखें।',
-'tooltip-compareselectedversions' => 'इस पनà¥à¤¨à¥‡à¤•à¥‡ चà¥à¤¨à¥‡ हà¥à¤ अवतरणोंमें फरà¥à¤• दिखायें ।',
+'tooltip-compareselectedversions' => 'इस पृषà¥à¤  के चà¥à¤¨à¥‡ हà¥à¤ अवतरणों में अनà¥à¤¤à¤° देखें।',
'tooltip-watch' => 'इस पनà¥à¤¨à¥‡ को अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में डालें।',
'tooltip-recreate' => 'यह पनà¥à¤¨à¤¾ पहले हटाया होने के बावजूद फिरसे बनायें',
'tooltip-upload' => 'अपलोड शà¥à¤°à¥‚ करें',
'tooltip-rollback' => '"वापस ले जाà¤à¤" इस पनà¥à¤¨à¥‡ के पिछले योगदाता के बदलाव à¤à¤• ही चटके में ग़ायब कर देता है।',
'tooltip-undo' => '"पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाà¤à¤" इस बदलाव को वापस ले जा के संपादन परà¥à¤šà¥‡ को à¤à¤²à¤• रीति में दिखलाता है।
इसके जरिठसारांश में पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ में लाने का कारण लिखा जा सकता है।',
+'tooltip-preferences-save' => 'वरीयताà¤à¤‚ सहेजें',
+'tooltip-summary' => 'à¤à¤• संकà¥à¤·à¤¿à¤ªà¥à¤¤ सारांश दरà¥à¤œ करें',
# Stylesheets
'common.css' => '/* यहां रखी css सभी तà¥à¤µà¤šà¤¾à¤“ंपर असर करेगी */',
@@ -2641,18 +2684,19 @@ $1',
'nextdiff' => 'ताज़ा संपादन →',
# Media information
-'mediawarning' => "'''सूचना''': इस फ़ाईलमें गलत कोड होने की आशंका हैं, इसे चलानेसे आपके सिसà¥à¤Ÿà¤®à¤®à¥‡à¤‚ परेशानियां हो सकती हैं।",
+'mediawarning' => 'चेतावनी मीडिया',
'imagemaxsize' => "छवि आकार सीमा:<br />''(संचिका वरà¥à¤£à¤¨ पनà¥à¤¨à¥‹à¤‚ के लिà¤)''",
'thumbsize' => 'अंगूठानख आकार:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|पनà¥à¤¨à¤¾|पनà¥à¤¨à¥‡}}',
-'file-info' => '(फ़ाईल का आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2)',
-'file-info-size' => '($1 × $2 चितà¥à¤°à¤¤à¤¤à¥à¤µ, संचिका का आकार: $3, माइम पà¥à¤°à¤•à¤¾à¤°: $4)',
+'file-info' => 'फ़ाईल का आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2',
+'file-info-size' => '$1 × $2 चितà¥à¤°à¤¤à¤¤à¥à¤µ, संचिका का आकार: $3, माइम पà¥à¤°à¤•à¤¾à¤°: $4',
'file-nohires' => '<small>इससे जà¥à¤¯à¤¾à¤¦à¤¾ रिज़ोलà¥à¤¯à¥‚शन उपलबà¥à¤§ नहीं हैं.</small>',
-'svg-long-desc' => '(SVG फ़ाईल, साधारणत: $1 × $2 पीकà¥à¤¸à¥‡à¤²à¥à¤¸, फ़ाईलका आकार: $3)',
+'svg-long-desc' => 'SVG फ़ाईल, साधारणत: $1 × $2 पीकà¥à¤¸à¥‡à¤²à¥à¤¸, फ़ाईलका आकार: $3',
'show-big-image' => 'समà¥à¤ªà¥‚रà¥à¤£ रिज़ोलà¥à¤¯à¥‚शन',
'show-big-image-thumb' => '<small>इस à¤à¤²à¤• का आकार: $1 × $2 पीकà¥à¤¸à¥‡à¤²à¥à¤¸</small>',
'file-info-gif-looped' => 'चकà¥à¤°à¤¿à¤¤',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ढाà¤à¤šà¤¾|ढाà¤à¤šà¥‡}}',
+'file-info-png-looped' => 'चकà¥à¤°à¤¿à¤¤',
# Special:NewFiles
'newimages' => 'नई फ़ाईलà¥à¤¸à¤•à¥€ गैलरी',
@@ -2807,6 +2851,7 @@ $1',
'exif-gpsareainformation' => 'GPS विभागका नाम',
'exif-gpsdatestamp' => 'GPS दिनांक',
'exif-gpsdifferential' => 'GPS डिफरनà¥à¤¶à¤¿à¤¯à¤° करेकà¥à¤¶à¤¨',
+'exif-objectname' => 'लघॠशीरà¥à¤·à¤•',
# EXIF attributes
'exif-compression-1' => 'अनकॉमà¥à¤ªà¥à¤°à¥‡à¤¸à¥à¤¸à¥à¤¡',
@@ -2953,7 +2998,7 @@ $1',
'exif-gpsdirection-m' => 'मैगà¥à¤¨à¥‡à¤Ÿà¤¿à¤• दिशा',
# External editor support
-'edit-externally' => 'बाहरी पà¥à¤°à¤£à¤¾à¤²à¥€à¤•à¤¾ इसà¥à¤¤à¥‡à¤®à¤¾à¤² करते हà¥à¤ इस फ़ाईल को संपादित करें ।',
+'edit-externally' => 'बाहरी पà¥à¤°à¤£à¤¾à¤²à¥€ का उपयोग करते हà¥à¤ इस सञà¥à¤šà¤¿à¤•à¤¾ को समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें ।',
'edit-externally-help' => '(और जानकारी के लिठ[http://www.mediawiki.org/wiki/Manual:External_editors जमाव निरà¥à¤¦à¥‡à¤¶] देखें)',
# 'all' in various places, this might be different for inflected languages
@@ -3154,6 +3199,7 @@ $1',
'version-specialpages' => 'विशेष पनà¥à¤¨à¥‡',
'version-parserhooks' => 'पारà¥à¤¸à¤° हूक',
'version-variables' => 'वेरिà¤à¤¬à¤²',
+'version-skins' => 'तà¥à¤µà¤šà¤¾à¤à¤‚',
'version-other' => 'अनà¥à¤¯',
'version-mediahandlers' => 'मीडिया संचालक',
'version-hooks' => 'हूक',
@@ -3191,7 +3237,7 @@ $1',
'fileduplicatesearch-result-n' => 'फ़ाईल "$1" में {{PLURAL:$2|1 दà¥à¤µà¤¿à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿|$2 दà¥à¤µà¤¿à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿à¤¯à¤¾à¤}} मिले हैं।',
# Special:SpecialPages
-'specialpages' => 'खास पनà¥à¤¨à¥‡',
+'specialpages' => 'विशेष पृषà¥à¤ ',
'specialpages-note' => '----
* साधारण विशेष पृषà¥à¤ à¥¤
* <strong class="mw-specialpagerestricted">पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित विशेष पृषà¥à¤ à¥¤</strong>',
@@ -3235,6 +3281,15 @@ $1',
'tags-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
'tags-hitcount' => '$1 {{PLURAL:$1|बदलाव|बदलाव}}',
+# Special:ComparePages
+'comparepages' => 'पृषà¥à¤ à¥‹à¤‚ की तà¥à¤²à¤¨à¤¾ करें',
+'compare-selector' => 'पृषà¥à¤  संशोधन की तà¥à¤²à¤¨à¤¾ करें',
+'compare-page1' => 'पृषà¥à¤  १',
+'compare-page2' => 'पृषà¥à¤  २',
+'compare-rev1' => 'पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ १',
+'compare-rev2' => 'पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ २',
+'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करें',
+
# Database error messages
'dberr-header' => 'इस विकि को कà¥à¤› दिकà¥à¤•à¤¤ आ रही है',
'dberr-problems' => 'कà¥à¤·à¤®à¤¾ करें! इस जालसà¥à¤¥à¤² को कà¥à¤› तकनीकी परेशानियों का सामना करना पड़ रहा है।',
@@ -3251,8 +3306,12 @@ $1',
'htmlform-float-invalid' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ मान संखà¥à¤¯à¤¾ नहीं है।',
'htmlform-int-toolow' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ मान नà¥à¤¯à¥‚नतम $1 से कम है',
'htmlform-int-toohigh' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ मान अधिकतम $1 से ज़à¥à¤¯à¤¾à¤¦à¤¾ है',
+'htmlform-required' => 'इस मान की आवशà¥à¤¯à¤•à¤¤à¤¾ है',
'htmlform-submit' => 'जमा करें',
'htmlform-reset' => 'बदलाव पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाà¤à¤',
'htmlform-selectorother-other' => 'अनà¥à¤¯',
+# SQLite database support
+'sqlite-has-fts' => '$1 पूरà¥à¤£ पाठ खोज समरà¥à¤¥à¤¨ के साथ',
+
);
diff --git a/languages/messages/MessagesHif_deva.php b/languages/messages/MessagesHif_deva.php
deleted file mode 100644
index 78dc35fe..00000000
--- a/languages/messages/MessagesHif_deva.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/** फ़ीजी हिनà¥à¤¦à¥€ (फ़ीजी हिनà¥à¤¦à¥€)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- * @author Girmitya
- * @author Thakurji
- */
-
-$messages = array(
-'talkpagelinktext' => 'बातचीत',
-
-# 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).
-'mainpage' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
-
-);
diff --git a/languages/messages/MessagesHif_latn.php b/languages/messages/MessagesHif_latn.php
index 3429ac57..9104bc6b 100644
--- a/languages/messages/MessagesHif_latn.php
+++ b/languages/messages/MessagesHif_latn.php
@@ -29,8 +29,7 @@ $messages = array(
'tog-editsection' => '[Badlao] ke jorr se section ke badlao se enable karo',
'tog-editsectiononrightclick' => 'Bhaag ke title pe right click kare pe bhaag ke badle ke laabu karo (JavaScript)',
'tog-showtoc' => 'Dhyan suchi dekhao (uu panna khatir jon me tiin se jaada heading hai)',
-'tog-rememberpassword' => 'Ii computer me hamaar login yaad rakho',
-'tog-editwidth' => 'Badlao ke dabba ke barrhae ke screen ke fill karo',
+'tog-rememberpassword' => 'Ii browser me (jaada se jaada $1 {{PLURAL:$1|din|din}}) talak hamaar login ke yaad rakho.',
'tog-watchcreations' => 'Hamaar banawa waala panna ke hamaar dhyaan suchi me jorro',
'tog-watchdefault' => 'Ham se badla gae panna ke hamaar dhyaan suchi me jorro',
'tog-watchmoves' => 'Uu panna jiske naam ham badla hai ke hamaar dhyaan suchi me jorro',
@@ -175,31 +174,21 @@ $messages = array(
'faqpage' => 'Project:Sab time puchhe waala sawal',
# Vector skin
-'vector-action-addsection' => 'Topic jorro',
-'vector-action-delete' => 'Mitao',
-'vector-action-move' => 'Naam badlo',
-'vector-action-protect' => 'Bachao',
-'vector-action-undelete' => 'Pahile jaise karo',
-'vector-action-unprotect' => 'Nai bachao',
-'vector-namespace-category' => 'Vibhag',
-'vector-namespace-help' => 'Madat waala panna',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Panna',
-'vector-namespace-media' => 'Chapa aur awaaj waala panna',
-'vector-namespace-mediawiki' => 'Sandes',
-'vector-namespace-project' => 'Project panna',
-'vector-namespace-special' => 'Khaas panna',
-'vector-namespace-talk' => 'Salah',
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => 'Sadasya ke panna',
-'vector-view-create' => 'Banao',
-'vector-view-edit' => 'Badlo',
-'vector-view-history' => 'Itihaas dekho',
-'vector-view-view' => 'Parrho',
-'vector-view-viewsource' => 'Source dekho',
-'actions' => 'Karam',
-'namespaces' => 'Naam',
-'variants' => 'Antar',
+'vector-action-addsection' => 'Topic jorro',
+'vector-action-delete' => 'Mitao',
+'vector-action-move' => 'Naam badlo',
+'vector-action-protect' => 'Bachao',
+'vector-action-undelete' => 'Pahile jaise karo',
+'vector-action-unprotect' => 'Nai bachao',
+'vector-simplesearch-preference' => 'Aur achchhaa se khoje salah do (Khaali vector skin)',
+'vector-view-create' => 'Banao',
+'vector-view-edit' => 'Badlo',
+'vector-view-history' => 'Itihaas dekho',
+'vector-view-view' => 'Parrho',
+'vector-view-viewsource' => 'Source dekho',
+'actions' => 'Karam',
+'namespaces' => 'Naam',
+'variants' => 'Antar',
'errorpagetitle' => 'Galti',
'returnto' => '$1 pe lauto.',
@@ -260,6 +249,9 @@ Bahut dher sadasya ii panna ke dekhe maange hae.
Meharbani kar ke, thora deri sabur kar ke ii panna ke fir se kholo.
$1',
+'pool-timeout' => 'Lock ke wait kare waala time khalaas hoe gais hae',
+'pool-queuefull' => 'Pool ke line bhar gais hae',
+'pool-errorunknown' => 'Pata nahi kaisan galti hae',
# 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}} ke baare me',
@@ -424,7 +416,8 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]] ke badle nai bhulna.',
'yourname' => 'Username:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Password fir se type karo:',
-'remembermypassword' => 'Ii computer pe hamaar login yaad rakho',
+'remembermypassword' => 'Ii computer pe hamaar login yaad rakho (jaada se jaada $1 {{PLURAL:$1|din|din}} talak)',
+'securelogin-stick-https' => 'Login kare ke baad HTTPS se connected raho',
'yourdomainname' => 'Aap ke domain:',
'externaldberror' => 'Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.',
'login' => 'Log in karo',
@@ -441,17 +434,18 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]] ke badle nai bhulna.',
'gotaccount' => "Aap ke pas pahile se account hai ki nai? '''$1'''.",
'gotaccountlink' => 'Log in',
'createaccountmail' => 'e-mail se',
-'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hai.',
-'userexists' => 'Ii username aur koi ke hai.
-Duusra username choose karo.',
-'loginerror' => 'Login me galti hai',
+'createaccountreason' => 'Kaaran:',
+'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hae.',
+'userexists' => 'Ii username aur koi ke hae.
+Duusra username ke choose karo.',
+'loginerror' => 'Login me kuchh wrong hae',
'createaccounterror' => 'Account ke nai banae sakaa hae: $1',
-'nocookiesnew' => 'Aap ke account banae dewa gais hai lekin aap loggen in nai hai.
-{{SITENAME}} me sadasya ke login khatir cookies hai.
-Aap cookies ke disabled karaa hai.
+'nocookiesnew' => 'Aap ke account banae dewa gais hae lekin aap logged in nai hae.
+{{SITENAME}} me sadasya ke login khatir cookies hae.
+Aap cookies ke rok diya hae.
Cookies ke enable kar ke, aapan nawaa username aur password se login karo.',
-'nocookieslogin' => '{{SITENAME}} me sadasya ke login khatir cookies hai.
-Aap cookies ke disabled karaa hai.
+'nocookieslogin' => '{{SITENAME}} me sadasya ke login khatir cookies hae.
+Aap cookies ke disabled karaa hae.
Cookies ke enable kar ke fir se kosis karo.',
'noname' => 'Aap achchha user name ke nai specify karaa hai.',
'loginsuccesstitle' => 'Login safal bhais',
@@ -467,6 +461,7 @@ Aapan spelling check karo.',
'wrongpasswordempty' => 'Koi password nai likha gais hai. Fir se kosis karo.',
'passwordtooshort' => 'Password me kamti se kamti {{PLURAL:$1|1 character|$1 characters}} hoe ke chahi.',
'password-name-match' => 'Aap ke password ke aap ke username se different rahe ke chaahi.',
+'password-login-forbidden' => 'Ii sadasya ke naam aur password ke kaam me laae ke ijaajat nai hae.',
'mailmypassword' => 'Nawaa password ke E-mail karo',
'passwordremindertitle' => '{{SITENAME}} ke khatir nawaa temporary password',
'passwordremindertext' => 'Koi (hoe sake hai aap, IP address $1 se)
@@ -505,6 +500,9 @@ Thora deri baad fir se kosis karna.',
'loginlanguagelabel' => 'Bhasa: $1',
'suspicious-userlogout' => 'Aap ke log out kare ke maang ke na kar dewa gais hae kaahe ki ii janaawe hae ki ii maang ke ek tuuta browser nai to caching proxy bhejis hae.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
+
# Password reset dialog
'resetpass' => 'Password ke badlo',
'resetpass_announce' => 'Aap ek temporary e-mailed code se login bhaya hai
@@ -556,11 +554,12 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
'showdiff' => 'Badlao dekhao',
'anoneditwarning' => "'''Sawadhaan:''' Aap login nai karaa hai
Aap ke IP address ii panna ke edit itihaas me record karaa jaai.",
+'anonpreviewwarning' => '"Aap log in nai bhaya hae. Ii panna ke bachae pe aap ke IP address ke panna ke badlao ke itihass me likha jaai."',
'missingsummary' => "'''Suchna:''' Aap badlao ke sanchhit me nai likha hai.
Agar aap Save ke fir se click karaa tab, aap ke badlao bina summary ke save kar lewa jaai.",
'missingcommenttext' => 'Meharbani kar ke niche aapan vichar deo.',
-'missingcommentheader' => "'''Suchna:''' Aap ii vichar ke vishay nai likha hai.
-Agar aap Save pe click karaa tab bina vishay ke iske save kar lewa jaai.",
+'missingcommentheader' => "'''Chetauni:''' Aap ii vichar ke vishay nai likha hai.
+Agar aap \"{{int:savearticle}}\" pe click karaa tab bina vishay ke iske bachae lewa jaai.",
'summary-preview' => 'Sanchhep jhalak:',
'subject-preview' => 'Suchi ke jhalak:',
'blockedtitle' => 'Sadasya ke rok dewa gais hai',
@@ -636,8 +635,12 @@ Sab se nawaa block log entry, aap ke reference ke khatir, niche dewa gais hae:'
'usercsspreview' => "'''Yaad rakhna ki aap khali aapan CSS ke jhalak dekhta hai.
Iske abhi save nai karaa gais hai!'''",
'userjspreview' => "'''Yaad rakhna ki aap khali aapan JavaScript ke testing/previewing karta hai, iske abhi save nai karaa gais hai!'''",
+'sitecsspreview' => " '''Yaad rakhna ki aap ii CSS ke khaali preview kartaa hae.'''
+'''Iske abhi talak bachawa nai gais hae!'''",
+'sitejspreview' => " '''Yaad rakhna ki aap ii JavaScript code ke khaali preview kartaa hae.'''
+'''Iske abhi talak bachawa nai gais hae!'''",
'userinvalidcssjstitle' => "'''Warning:''' Koi skin \"\$1\" nai hai.
-Yaad rakhna ki custom .css aur .js panna owercase title use kare hai, jaise ki {{ns:user}}:Foo/monobook.css aur{{ns:user}}:Foo/Monobook.css nai.",
+Yaad rakhna ki custom .css aur .js panna owercase title use kare hai, jaise ki {{ns:user}}:Foo/vector.css aur{{ns:user}}:Foo/Vector.css nai.",
'updated' => '(Update kar dewa gais hai)',
'note' => "'''Dhyan rakkho:'''",
'previewnote' => "'''Ii khali ek jhalak dekhae hai; badlao abhi save nai bhae hai!'''",
@@ -677,8 +680,6 @@ Aap ii bhi waada kartaa hai ki iske aap likha hai aur koi duusra jagah se copy n
Agar aap nai mangta ki koi aur aap ke yogdaan ke badle, tab aap hian par nai likho.<br />
Aap ii bhi kasam khata hai ki aap iske apne se likha hai aur kahin se copy nai karaa hai (Aur jaankari khatir $1 ke dekho).
''' COPYRIGHT WORK KE BINA AUNUMATI KE SUBMIT NAI KARNA!'''",
-'longpagewarning' => "'''Chetauni:''' Ii panna $1 kilobytes lamba hae; kuch browsers sait etna barra panna ke khole nai pai.
-Meherbani kar ke ii panna ke chota chota tukrra me kar do.",
'longpageerror' => "'''ERROR: Jon text aap submit karaa hai uu $1 kilobytes lamba hai, ii maximum $2 kilobytes se lamba hai.
Iske save nai karaa jae sake hai.'''",
'readonlywarning' => "'''WARNING: Database ke maintenance khatir band kar dewa gais hai, tab abhi aap aapan badlao ke save nai kare paega.
@@ -786,7 +787,7 @@ Saait iske wiki me se mitae dewa gae hoi, nai to iske naam badal dewa gae hoi.
Try karo [[Special:Search|wiki me khije ke]] aur nawaa panna ke.',
# Revision deletion
-'rev-deleted-comment' => '(comment ke hatae dewa gais hai)',
+'rev-deleted-comment' => '(badlao ke summary ke hatae dewa gais hae)',
'rev-deleted-user' => '(username ke hatae dewa gais hai)',
'rev-deleted-event' => '(log action ke hatae dewa gais hai)',
'rev-deleted-user-contribs' => '[Sadasya ke naam nai to IP address ke hatae dewa gais hae- yogdaan se badlao ke lukae dewa gais hae]',
@@ -857,6 +858,8 @@ $1",
'logdelete-failure' => "'''Log ke nai dekhawa jaae sake hae:'''
$1",
'revdel-restore' => 'Badlo ki ii dekhe me kaise lage hae',
+'revdel-restore-deleted' => 'mitawa gais badlao',
+'revdel-restore-visible' => 'badlao, jiske aap dekhe saktaa hae',
'pagehist' => 'Panna ke itihaas',
'deletedhist' => 'Mitawa gae itihass',
'revdelete-content' => 'suchi',
@@ -926,11 +929,13 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
# Diffs
'history-title' => '"$1" ke sansodhan ke itihaas',
'difference' => '(Badlao me farak)',
+'difference-multipage' => '(Panna ke biich ke antar)',
'lineno' => 'Rekha $1:',
'compareselectedversions' => 'Chuna gae version ke compare karo',
'showhideselectedversions' => 'Chuna gae versions ke dekhao/lukao',
'editundo' => 'Pahile jaise kar do',
-'diff-multi' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} nai dekhawa jae hai.)',
+'diff-multi' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} karis hae, ke nai dekhawa jae hai.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} se jaada log karin hae, ke nai dekhawa jae hai.)',
# Search results
'searchresults' => 'Khoj ke natija',
@@ -965,6 +970,7 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
'searchprofile-everything-tooltip' => 'Sab content me khojo (baat waala panna bhi)',
'searchprofile-advanced-tooltip' => 'Custom namespaces me khojo',
'search-result-size' => '$1 ({{PLURAL:$2|1 sabd|$2 sabd}})',
+'search-result-category-size' => ' {{PLURAL:$1|1 sadasya|$1 sadasya}} ({{PLURAL:$2|1 chhota vibhag|$2 chhota vibhag}}, {{PLURAL:$3|1 file|$3 files}})',
'search-result-score' => 'Len den: $1%',
'search-redirect' => '(redirect $1)',
'search-section' => '(section $1)',
@@ -1042,6 +1048,7 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
'contextlines' => 'Ek hit me ketnaa line hae:',
'contextchars' => 'Ek line me ketnaa context hae:',
'stub-threshold' => 'Threshold ke khatir <a href="#" class="stub">stub link</a> formatting (bytes):',
+'stub-threshold-disabled' => 'Band kar dewa gais hae',
'recentchangesdays' => 'Nawaa badlao me ketna roj dekhawa jaae:',
'recentchangesdays-max' => '(sab se jaada $1 {{PLURAL:$1|din|din}})',
'recentchangescount' => 'Default se ketnaa badlao ke dekhae ke chaahi:',
@@ -1075,6 +1082,7 @@ Hian pe ek, apne se banaa sabd hae, jiske aap kaam me laae saktaa hae: $1',
'prefs-files' => 'File ke naam',
'prefs-custom-css' => 'CSS ke aapan khatir badlo',
'prefs-custom-js' => 'Ruchi ke anusar JS',
+'prefs-common-css-js' => 'Sab skins ke khatir, baata gais CSS/JavaScript',
'prefs-reset-intro' => 'Aap ii panna ke kaam me laae ke site defaults ke aapan preferences ke reset kare sakta hai.
Iske pahile jaise nai karaa jaawe sake hai.',
'prefs-emailconfirm-label' => 'E-mail ke confirm karaa jaawe hai:',
@@ -1112,9 +1120,15 @@ Aap duusra log ke aap se aapan user_talk panna se aap ke contact kar le de sakta
'prefs-advancedrendering' => 'Uchchaa pasand',
'prefs-advancedsearchoptions' => 'Uchchaa pasand',
'prefs-advancedwatchlist' => 'Uchchaa pasand',
-'prefs-display' => 'Dekhae waala option',
+'prefs-displayrc' => 'Choice dekhao',
+'prefs-displaysearchoptions' => 'Choice dekhao',
+'prefs-displaywatchlist' => 'Choice dekhao',
'prefs-diffs' => 'Farka',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail address kanuni hae',
+'email-address-validity-invalid' => 'Ek kanuni e-mail ke likho',
+
# User rights
'userrights' => 'Sadasya ke adhikaar ke chalao',
'userrights-lookup-user' => 'Sadasya ke group ke manage karo',
@@ -1198,6 +1212,7 @@ Aap duusra log ke aap se aapan user_talk panna se aap ke contact kar le de sakta
'right-hideuser' => 'Username ke roko, jisse ki janta iske dekhe nai sake',
'right-ipblock-exempt' => 'IP blocks, auto-blocks aur range blocks ke bagal se aae jao',
'right-proxyunbannable' => 'Proxies ke automatic blocks ke bypass karo',
+'right-unblockself' => 'Apne ke unblock karo',
'right-protect' => 'Protection level ke badlo aur bachawa gais panna ke badlo',
'right-editprotected' => 'Bachawa gais panna ke badlo (without cascading protection)',
'right-editinterface' => 'User interface ke badlo',
@@ -1220,7 +1235,6 @@ Aap duusra log ke aap se aapan user_talk panna se aap ke contact kar le de sakta
'right-siteadmin' => 'Database ke band karo aur kholo',
'right-reset-passwords' => 'Duusra sadasya ke password ke badlo',
'right-override-export-depth' => 'Panna aur jurra panna, 5 ke gahirrai talak, ke export karo',
-'right-versiondetail' => 'Program ke baare me aur jaankari dekhao',
'right-sendemail' => 'Duusra sadasya ke lage e-mail bhejo',
# User rights log
@@ -1271,14 +1285,9 @@ Aap duusra log ke aap se aapan user_talk panna se aap ke contact kar le de sakta
'recentchanges-legend' => 'Nawaa badlao options',
'recentchangestext' => 'Wiki me ii panna ke nawaa badlao pe dhyan rakho.',
'recentchanges-feed-description' => 'Abhi haali me bhae ii wiki ke feed me ke track karo.',
-'recentchanges-label-legend' => 'Matlab: $1',
-'recentchanges-legend-newpage' => '$1 - nawaa panna',
'recentchanges-label-newpage' => 'Ii badlao ek nawaa panna banais hae',
-'recentchanges-legend-minor' => '$1 - chhota badlao',
'recentchanges-label-minor' => 'Ii ek chhota badlao hae',
-'recentchanges-legend-bot' => '$1 - bot se badlao',
'recentchanges-label-bot' => 'Ii badlao ke ek bot karis hae',
-'recentchanges-legend-unpatrolled' => '$1 - bina pahraa dewa gais badlao',
'recentchanges-label-unpatrolled' => 'Ii badlao pe abhi pahraa nai dewa gais hae.',
'rcnote' => "Niche {{PLURAL:$1|hai '''1''' badlao|aakhri hai '''$1''' badlao}} pahile {{PLURAL:$2|din|'''$2''' din}}, $5, $4 talak.",
'rcnotefrom' => "Niche '''$2''' se badlao hai ('''$1''' tak )",
@@ -1325,6 +1334,8 @@ Panna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae '''mota''' kara gais
'upload_directory_missing' => 'Upload directory ($1) nai hai aur webserver iske nai banae sakis hai.',
'upload_directory_read_only' => 'Upload directory ($1) ke webserver nai likhe sake hai.',
'uploaderror' => 'Upload nai hoe paais hai',
+'upload-recreate-warning' => '"\'Chetauni: Ii naam ke file ke mitae dewa gais rahaa, nai to naam badla gais rahaa."\'
+Hian pe mitae waala suchi aur naam badle waala suchi ke aap ke dekhe ke khatir dewa gais hae:',
'uploadtext' => "Niche waala form ke use kar ke file upload karo.
Pahile upload karaa file ke dekhe khatir [[Special:FileList|list of uploaded files]] jao, (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
@@ -1360,6 +1371,17 @@ Maange waala {{PLURAL:\$3|file ke rakam hai|file ke rakam hai}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' ke rakam ke file hian pe allowed nai hai.
Allowed {{PLURAL:\$3|rakam ke file hai|rakam ke fle hai}} \$2.",
'filetype-missing' => 'File ke koi extension nai hai (jaise ki ".jpg").',
+'empty-file' => 'Aap ke bheja gais panna khaali hae.',
+'file-too-large' => 'Aap ke bheja gais panna bahut barraa hae.',
+'filename-tooshort' => 'File ke naam bahut chhota hae.',
+'filetype-banned' => 'Ii rakam ke file ke rok dewa gais hae.',
+'verification-error' => 'Ii file ke verify nai karaa jaae sakaa hae.',
+'hookaborted' => 'Jon chij ke aap badle mangaa rahaa, ke extension hook rok diis hae.',
+'illegal-filename' => 'Ii naam ke file ke banae ke ijajat nai hae.',
+'overwrite' => 'Abhi ke file ke uppar fir se likhe ke ijajat nai hae.',
+'unknown-error' => 'Ek anjaan galti hoe gais hae.',
+'tmp-create-error' => 'Temporary file ke nai banae sakaa hae.',
+'tmp-write-error' => 'Temporary file me likhe me galti hoe gais hae.',
'large-file' => 'Ii salah hai ki file ke size $1 se barraa nai rahe;
ii file hai $2',
'largefileserver' => 'Ii file, jetna ki server allow kare hai, se barraa hai.',
@@ -1388,13 +1410,14 @@ Agar jo aap fir bhi aapan file ke upload kare mangta hai, tab pichhe jaae ke naw
Agar jo aap fir bhi aapan file upload kare manta hai tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ii file following file ke duplicate hai {{PLURAL:$1|file|files}}:',
'file-deleted-duplicate' => 'Yahii rakam ke ek aur file ([[:$1]]) ke pahile delete karaa gais hai. Aap ke file ke deletion history ke check kare ke chaahi, upload kare se pahile.',
-'successfulupload' => 'Upload safal bhais',
'uploadwarning' => 'Upload ke baare me chetauni',
'uploadwarning-text' => 'Meharbani kar ke file ke baaare me aur jankari ke niche badal ke aur fir se kosis karo.',
'savefile' => 'File ke save karo',
'uploadedimage' => '"[[$1]]" ke upload kar dewa gae',
'overwroteimage' => '"[[$1]]" ke nawaa version ke upload karaa gais hai',
'uploaddisabled' => 'Uploads ke disable kar dewa gais hai',
+'copyuploaddisabled' => 'URL se upload kare pe rok lagae dewa gais hae.',
+'uploadfromurl-queued' => 'Aap ke upload ke line me kar dewa gais hae.',
'uploaddisabledtext' => 'File uploads ke disable kar dewa gais hai.',
'php-uploaddisabledtext' => 'File uploads ke PHP me disable kar dewa gais hai. Meharbani kar ke file_uploads setting ke check karo.',
'uploadscripted' => 'Ii file me HTML nai to script code hai jiske web browser erroneously interpret kare sake hai.',
@@ -1414,6 +1437,14 @@ Aap ke ii soche ke chaahi ki ii file ke upload karna appropriate hai ki nai.
Aap ke subidha khatir deletion log hian pe hai:",
'filename-bad-prefix' => "Jon file aap upload kartaa hai uske naam '''\"\$1\"''' se suruu hoe hai, jon ki non-descriptive naam hai jiske jaada kar ke digital camera automatically assign kare hai.
Meharbaani kar ke aur jaada descriptive filename chose karo.",
+'upload-success-subj' => 'Upload safal bhais',
+'upload-success-msg' => 'Aap ke upload [$2] se safal bhais. Iske hian pe dekhe saktaa hae: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Upload kare me kuchh karrbarr hoe gais hae',
+'upload-failure-msg' => 'Aap ke [$2] se uploadkare me kuchh garrbarr hoe gais hae:
+
+$1',
+'upload-warning-subj' => 'Upload ke baare me chetauni',
+'upload-warning-msg' => '[$2] se upload kare me kuch karrbarr hoe gais hae. Aap [[Special:Upload/stash/$1|upload form]] me laut ke ii garrbarri ke sidha kare sakta hae.',
'upload-proto-error' => 'Protocol right nai hai',
'upload-proto-error-text' => 'Duur ke upload maange hai URLs jon ki suruu hoe hai <code>http://</code> nai to <code>ftp://</code>.',
@@ -1479,6 +1510,7 @@ Column header me click kare se sorting badal jaai.',
'listfiles_search_for' => 'Media ke naam khojo:',
'imgfile' => 'file',
'listfiles' => 'Chapa ke suchi',
+'listfiles_thumb' => 'Chhota chapa',
'listfiles_date' => 'Tarik',
'listfiles_name' => 'Naam',
'listfiles_user' => 'Sadasya',
@@ -1593,8 +1625,8 @@ Templates ke delete kare se pahile duusra links ke bhi check kare ke nai bhulna.
'statistics-edits' => '{{SITENAME}} ke suruu hoe se panna ke badlao',
'statistics-edits-average' => 'Average badlao per panna',
'statistics-views-total' => 'Views kul jorr',
+'statistics-views-total-desc' => 'Jon pana abhi banawa nai gais hae aur khaas panna ke include nai karaa gais hae',
'statistics-views-peredit' => 'Views per badlao',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job queue] lambai',
'statistics-users' => 'Registered [[Special:ListUsers|sadasya]]',
'statistics-users-active' => 'Active sadasya',
'statistics-users-active-desc' => 'Sadasya jon ki pichhle {{PLURAL:$1|din|$1 din}} me kuchh karin hai.',
@@ -1607,9 +1639,9 @@ 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]]",
'doubleredirects' => 'Dugna redirects',
-'doubleredirectstext' => 'Ii panna uu panna ke suchi de hai jon ki duusra redirect panna pe redirect kare hai.
+'doubleredirectstext' => 'Ii panna uu panna ke suchi de hai jon ki duusra redirect panna pe redirect kare hai.
Sab row me pahila aur duusra redirect ke jorr hae, aur isme duusra redirect ke nisana bhi hae, jon ki jaada kar ke "aslii" nisana waala panna, jon ki pahila redirect ke dekhae hae.
-<s>Mitawa gais</s> entires ke solve kar dewa gais hae.',
+<del>Mitawa gais</del> entires ke solve kar dewa gais hae.',
'double-redirect-fixed-move' => '[[$1]] ke naam badal dewa gais hai, ab ii [[$2]] pe redirect kare hai',
'double-redirect-fixer' => 'Redirect ke banae waala',
@@ -1632,6 +1664,8 @@ Sab row me pahila aur duusra redirect ke jorr hae, aur isme duusra redirect ke n
'nmembers' => '$1 {{PLURAL:$1|sadasya|sadasya}}',
'nrevisions' => '$1 {{PLURAL:$1|badlao|badlao}}',
'nviews' => '$1 {{PLURAL:$1|dafe dekha gais hai|dafe dekha gais hai}}',
+'nimagelinks' => '$1 {{PLURAL:$1|panna|panna}} me kaam me lawa gais hae',
+'ntransclusions' => '$1 {{PLURAL:$1|panna|panna}} me kaam me lawa gais hae',
'specialpage-empty' => 'Ii report khatir koi results nai hai.',
'lonelypages' => 'Akele waala panna',
'lonelypagestext' => 'Niche ke panna ke duusra paana jorre nai to transclude nai kare hai {{SITENAME}} me.',
@@ -1790,34 +1824,40 @@ Support karaa gais protocol: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Sab group ke aapan account se hatae saktaa hai',
# E-mail user
-'mailnologin' => 'Koi bheje waala address nai hai',
-'mailnologintext' => 'Duusra logan ke lage e-mail bheje ke khatir aap ke [[Special:UserLogin|logged in]] aur [[Special:Preferences|preferences]] me thik e-mail hoew ke chaahi.',
-'emailuser' => 'Ii user ke E-mail karo',
-'emailpage' => 'User ke e-mail karo',
-'emailpagetext' => 'Aap niche ke form ke use kar ke ii sadasya ke e-mail bheje sakta hae.
+'mailnologin' => 'Koi bheje waala address nai hai',
+'mailnologintext' => 'Duusra logan ke lage e-mail bheje ke khatir aap ke [[Special:UserLogin|logged in]] aur [[Special:Preferences|preferences]] me thik e-mail hoew ke chaahi.',
+'emailuser' => 'Ii user ke E-mail karo',
+'emailpage' => 'User ke e-mail karo',
+'emailpagetext' => 'Aap niche ke form ke use kar ke ii sadasya ke e-mail bheje sakta hae.
Jon e-mail address aap [[Special:Preferences|your user preferences]] me enter karaa rahaa, "From" ke e-mail rahii, jisse ki e-mail receive kare waala aap ke sidha reply kare sake hae.',
-'usermailererror' => 'Mail object error return karis hai:',
-'defemailsubject' => '{{SITENAME}} e-mail',
-'noemailtitle' => 'E-mail address nai hai',
-'noemailtext' => 'Ii sadasya thiik e-mail address nai diis hai.',
-'nowikiemailtitle' => 'Koi e-mail ke ijajat nai hai',
-'nowikiemailtext' => 'Ii sadasya e-mail nai le ke decide karis hai.',
-'email-legend' => 'Duusra {{SITENAME}} ke sadasya ke lage ek e-mail bhejo',
-'emailfrom' => 'Iske lage se:',
-'emailto' => 'Iske lage:',
-'emailsubject' => 'Vishay:',
-'emailmessage' => 'Sandes:',
-'emailsend' => 'Bhejo',
-'emailccme' => 'Hamaar khabar ke ek copy ke hamaar lage e-mail karo.',
-'emailccsubject' => 'Aapke $1 ke khatir khabar ke copy: $2',
-'emailsent' => 'E-mail ke bhej dewa gais hai',
-'emailsenttext' => 'Aap ke e-mail sandes ke bhej dewa gais hai.',
-'emailuserfooter' => 'Ii e-mail ke $1, $2 ke lage "E-mail user" function ke {{SITENAME}}se kaam me laae ke bhejis hai.',
+'usermailererror' => 'Mail object error return karis hai:',
+'defemailsubject' => '{{SITENAME}} e-mail',
+'usermaildisabled' => 'Sadasya ke e-mail ke rok dewa gais hae',
+'usermaildisabledtext' => 'Aap ii wiki ke duusra sadasya ke e-mail nai bheje saktaa hae',
+'noemailtitle' => 'E-mail address nai hai',
+'noemailtext' => 'Ii sadasya thiik e-mail address nai diis hai.',
+'nowikiemailtitle' => 'Koi e-mail ke ijajat nai hai',
+'nowikiemailtext' => 'Ii sadasya e-mail nai le ke decide karis hai.',
+'email-legend' => 'Duusra {{SITENAME}} ke sadasya ke lage ek e-mail bhejo',
+'emailfrom' => 'Iske lage se:',
+'emailto' => 'Iske lage:',
+'emailsubject' => 'Vishay:',
+'emailmessage' => 'Sandes:',
+'emailsend' => 'Bhejo',
+'emailccme' => 'Hamaar khabar ke ek copy ke hamaar lage e-mail karo.',
+'emailccsubject' => 'Aapke $1 ke khatir khabar ke copy: $2',
+'emailsent' => 'E-mail ke bhej dewa gais hai',
+'emailsenttext' => 'Aap ke e-mail sandes ke bhej dewa gais hai.',
+'emailuserfooter' => 'Ii e-mail ke $1, $2 ke lage "E-mail user" function ke {{SITENAME}}se kaam me laae ke bhejis hai.',
+
+# User Messenger
+'usermessage-summary' => 'System sandesh likha jaae hae.',
+'usermessage-editor' => 'System ke sandes de waala',
# Watchlist
'watchlist' => 'Hamaar dhyan suchi',
'mywatchlist' => 'Hamaar dhyaan suchi',
-'watchlistfor' => "('''$1''' ke khatir)",
+'watchlistfor2' => '$1 $2 ke khatir',
'nowatchlist' => 'Aap ke dhyan suchi me koi chij nai hai.',
'watchlistanontext' => 'Aapan dhyan suchi me ke dekhe nai to badle ke khatir meharbani kar ke $1 karo.',
'watchnologin' => 'Logged in nai hai',
@@ -1938,7 +1978,10 @@ Ii panna ke pichla badla [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separat
'revertpage-nouser' => '(sadasya ke namm ke hatae dewa gais hae) se karaa gais badlao ke [[User:$1|$1]] ke badlao ke rakam kar dewa gais hae.',
'rollback-success' => '$1 ke badlao ke pahile jaise kar dewa gais hai;
badal ke $2 ke aakhri version kar dewa gais hai.',
-'sessionfailure' => 'Aap ke login session me kuch karrbarr hai.
+
+# Edit tokens
+'sessionfailure-title' => 'Session fail hoe gais hae',
+'sessionfailure' => 'Aap ke login session me kuch karrbarr hai.
iske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.
Meharbani kar ke "back" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.',
@@ -2077,19 +2120,23 @@ $1',
'month' => 'Mahina se (aur pahile):',
'year' => 'Saal se (aur pahile):',
-'sp-contributions-newbies' => 'Khaali nawaa account ke yogdaan dekhao',
-'sp-contributions-newbies-sub' => 'Nawaa account khatir',
-'sp-contributions-newbies-title' => 'Nawaa account ke sadasya ke yogdaan',
-'sp-contributions-blocklog' => 'Suchi roko',
-'sp-contributions-deleted' => 'Mitawa gais adasya ke yogdaan',
-'sp-contributions-logs' => 'logs',
-'sp-contributions-talk' => 'baat',
-'sp-contributions-userrights' => 'sadasya ke adhikaar ke manage karo',
-'sp-contributions-blocked-notice' => 'Ii sadasya ke hian pe ijajat nai hae.
+'sp-contributions-newbies' => 'Khaali nawaa account ke yogdaan dekhao',
+'sp-contributions-newbies-sub' => 'Nawaa account khatir',
+'sp-contributions-newbies-title' => 'Nawaa account ke sadasya ke yogdaan',
+'sp-contributions-blocklog' => 'Suchi roko',
+'sp-contributions-deleted' => 'Mitawa gais adasya ke yogdaan',
+'sp-contributions-uploads' => 'upload karaa gais file',
+'sp-contributions-logs' => 'logs',
+'sp-contributions-talk' => 'baat',
+'sp-contributions-userrights' => 'sadasya ke adhikaar ke manage karo',
+'sp-contributions-blocked-notice' => 'Ii sadasya ke hian pe ijajat nai hae.
Pahile waala block log entry ke reference ke khatir niche dekhawa jaawe hae:',
-'sp-contributions-search' => 'Yogdaan ke khojo',
-'sp-contributions-username' => 'IP Address nai to username:',
-'sp-contributions-submit' => 'Khojo',
+'sp-contributions-blocked-notice-anon' => 'Ii IP address abhi rok dewa gais hae.
+Sab se nawaa roke ke suchi ke, aap ke khatir, niche dewa gais hae.',
+'sp-contributions-search' => 'Yogdaan ke khojo',
+'sp-contributions-username' => 'IP Address nai to username:',
+'sp-contributions-toponly' => 'Khaali sab se nawaa badlao ke dekhao',
+'sp-contributions-submit' => 'Khojo',
# What links here
'whatlinkshere' => 'Hian konchij jurre hae',
@@ -2150,7 +2197,6 @@ Ii rukawat pe fir se bichar kare ke khatir [[Special:IPBlockList|IP block list]]
'ipb-edit-dropdown' => 'Badlao ke roke ke kaaran',
'ipb-unblock-addr' => '$1 ke rukawat ke khalaas karo',
'ipb-unblock' => 'Ek username nai to IP address ke rukawat ke khalaas karo',
-'ipb-blocklist-addr' => '$1 ke abhi ke rukawat',
'ipb-blocklist' => 'Abhi ke rukawat ke dekho',
'ipb-blocklist-contribs' => '$1 ke yogdaan',
'unblockip' => 'Sadasya ke rukawat ke khalaas karo',
@@ -2158,7 +2204,7 @@ Ii rukawat pe fir se bichar kare ke khatir [[Special:IPBlockList|IP block list]]
'ipusubmit' => 'Ii rukawat ke hatao',
'unblocked' => '[[User:$1|$1]] ke rukawat ke khalaas kar dewa gais hai',
'unblocked-id' => 'Roko $1 ke khalaas kar dewa gais hai',
-'ipblocklist' => 'Roka gais IP addresses aur usernames',
+'ipblocklist' => 'Roka gais sadasya',
'ipblocklist-legend' => 'Ek roka gais sadasya ke khojo',
'ipblocklist-username' => 'Username nai to IP address:',
'ipblocklist-sh-userblocks' => '$1 account rukawat',
@@ -2228,6 +2274,8 @@ Aap ke ek account banae ke ijajat nai hai',
'cant-block-while-blocked' => 'Aap, jab ki apne blocked hai, duusra sadasya ke block nai kare sakta hai.',
'cant-see-hidden-user' => 'Jon sadasya ke aap roke mangtaa hae ke pahile rok ke lukae dewa gais hae.
Jab ki aap ke lage hideuser adhikaar nai hae, tab aap ii sadasya ke rukawat ke nai dekhe aur badle saktaa hae.',
+'ipbblocked' => 'Aap duusra sadasya ke roke nai to kohle nai sakta hae, kaahe ki aap ke bhi rokaa gais hae',
+'ipbnounblockself' => 'Aap apne ke khole nai saktaa hae',
# Developer tools
'lockdb' => 'Database ke band karo',
@@ -2320,6 +2368,7 @@ panna ke wahi ke uppar nai save karaa jaae sake hai.',
'immobile-source-page' => 'Ii panna ke naam nai badla jaawe sake hai.',
'immobile-target-page' => 'Uu jagah pe nai move kare sakta hai.',
'imagenocrossnamespace' => 'File ke non-file namespace me hatae ke nai kare sakta hai',
+'nonfile-cannot-move-to-file' => 'Ek chij jon ki file nai hae ke file waala jagha pe nai kare sakta hae',
'imagetypemismatch' => 'Nawaa file extension uske type se nai match kare hai.',
'imageinvalidfilename' => 'Jon naam pe aap badle mangtaa hai valid nai hai',
'fix-double-redirects' => 'Update any redirects that point to the original title',
@@ -2400,6 +2449,7 @@ Aapan computer me save kar ke hian pe upload karo.',
'importstart' => 'Panna ke import karta hai...',
'import-revision-count' => '$1 {{PLURAL:$1|badlao|badlao}}',
'importnopages' => 'Koi panna import kare ke nai hai.',
+'imported-log-entries' => '$1 {{PLURAL:$1|log entry|log entry}} ke lawa gais hae.',
'importfailed' => 'Import fail hoe gais: <nowiki>$1</nowiki>',
'importunknownsource' => 'Ayaat kare waala jagha ke rakam nai maalum.',
'importcantopen' => 'Import file ke khole nai sakaa',
@@ -2497,6 +2547,8 @@ Meharbani kar ke, fir se kosis karo.',
'tooltip-rollback' => '"Rollback" ii panna ke badlao ke isse pahile waala badlao pe, ek click me, kar dewe hai',
'tooltip-undo' => '"Undo" ii badlao ke pahile jaise kar de hai aur edit form ke preview mode me khole hai.
Ii summary me ek kaaran jorre ke ijajat de hai.',
+'tooltip-preferences-save' => 'Pasand ke bachao',
+'tooltip-summary' => 'Thora sabd me likho',
# Metadata
'nodublincore' => 'Ii server ke khatir Dublin Core RDF metadata ke disable kar dewa gais hai',
@@ -2592,14 +2644,17 @@ Iske execute kare se aap ke system me garrbarr hoe sake hae.",
'imagemaxsize' => "Chapa jaada se jaada ketnaa barraahoe sake hai:<br />''(file ke baare me panna)''",
'thumbsize' => 'Anguutha ke nakkhuun etna barraa:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|panna|panna}}',
-'file-info' => '(file etnaa barraa: $1, MIME rakam: $2)',
-'file-info-size' => '($1 × $2 pixel, file ke size: $3, MIME type: $4)',
+'file-info' => 'file etnaa barraa: $1, MIME rakam: $2',
+'file-info-size' => '$1 × $2 pixel, file ke size: $3, MIME type: $4',
'file-nohires' => '<small>Aur achchha resolution nai hai.</small>',
-'svg-long-desc' => '(SVG file, naam kare ke khatir $1 × $2 pixels, file size: $3)',
+'svg-long-desc' => 'SVG file, naam kare ke khatir $1 × $2 pixels, file size: $3',
'show-big-image' => 'Puura resolution',
'show-big-image-thumb' => '<small>Ii preview ke size: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'Ghuum ghumae ke wahii jagha pe aawe hae',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'file-info-png-looped' => 'ghum ghumae ke wahii jagha pe aae hae',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|dafe|dafe}} bajawa gais hae',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
# Special:NewFiles
'newimages' => 'Nawaa files ke gallery',
@@ -2669,8 +2724,8 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'exif-colorspace' => 'Rang ke jagha',
'exif-componentsconfiguration' => 'Har ek component ke matlab',
'exif-compressedbitsperpixel' => 'Chapa ke compression mode',
-'exif-pixelydimension' => 'Chapa ke thik chaurrai',
-'exif-pixelxdimension' => 'Chapa ke thik uunchai',
+'exif-pixelydimension' => 'Chaapa ke thiik chaurrai',
+'exif-pixelxdimension' => 'Chaapa ke thiik uunchai',
'exif-makernote' => 'Manufacturer se jaankari',
'exif-usercomment' => 'Sadasysa ke bichar',
'exif-relatedsoundfile' => 'Saathe waala awaaj waala file',
@@ -2686,9 +2741,9 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'exif-spectralsensitivity' => 'Ketna achchhaa se ujaala ke pakrre sake hae',
'exif-isospeedratings' => 'ISO ke raftaar rating',
'exif-oecf' => 'Optoelectronic conversion factor',
-'exif-shutterspeedvalue' => 'Shutter ke raftaar',
-'exif-aperturevalue' => 'Aperture',
-'exif-brightnessvalue' => 'Chamak',
+'exif-shutterspeedvalue' => 'APEX shutter ke raftaar',
+'exif-aperturevalue' => 'APEX aperture',
+'exif-brightnessvalue' => 'APEX chamak',
'exif-exposurebiasvalue' => 'Exposure bias',
'exif-maxaperturevalue' => 'Sab se jaada land aperture',
'exif-subjectdistance' => 'Chij se duuri',
@@ -2775,6 +2830,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'table_pager_first' => 'Pahila panna',
'table_pager_last' => 'Aakhri panna',
'table_pager_limit' => 'Ek panna pe $1 chij dekhao',
+'table_pager_limit_label' => 'Ek panna me etna chij rahe hae:',
'table_pager_limit_submit' => 'Jaao',
# Auto-summaries
@@ -2790,9 +2846,10 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'watchlisttools-raw' => 'Dhyan suchi ke apne sampadan karo',
# Special:Version
-'version' => 'Badlao',
-'version-specialpages' => 'Khaas panna',
-'version-other' => 'Duusra',
+'version' => 'Badlao',
+'version-specialpages' => 'Khaas panna',
+'version-other' => 'Duusra',
+'version-poweredby-others' => 'duusra waala',
# Special:FilePath
'filepath-submit' => 'Jaao',
@@ -2817,6 +2874,15 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'tags-edit' => 'badlo',
'tags-hitcount' => '$1 {{PLURAL:$1|badlao|badlao}}',
+# Special:ComparePages
+'comparepages' => 'Panna ke biich me antar dekho',
+'compare-selector' => 'Panna ke badlao ke biih me antar dekho',
+'compare-page1' => 'Panna 1',
+'compare-page2' => 'Panna 2',
+'compare-rev1' => 'Badlao 1',
+'compare-rev2' => 'Badlao 2',
+'compare-submit' => 'Antar dekho',
+
# Database error messages
'dberr-header' => 'Ii wiki me kuchh garrbarr hae',
diff --git a/languages/messages/MessagesHil.php b/languages/messages/MessagesHil.php
index 96ea5a3c..37ea3c6a 100644
--- a/languages/messages/MessagesHil.php
+++ b/languages/messages/MessagesHil.php
@@ -29,7 +29,7 @@ $messages = array(
'tog-editsection' => 'Sugtan ang pag-ilis sang seksyon paagi sa [ilisan] nga mga tabid',
'tog-editsectiononrightclick' => 'Sugtan ang pag-ilis sang seksyon paagi sa pagtum-ok sang natoo sa mouse sa titulo sang seksyon (nagakinahanglan sang JavaScript)',
'tog-showtoc' => 'Ipakita ang sinulatan sang nagabug-os (para sang mga panid nga may yara sang masobra sa 3 nga pangolohan)',
-'tog-rememberpassword' => 'Dumdumon ang akon pagsulod sa sini nga kompyuter',
+'tog-rememberpassword' => 'Dumdumon ang akon password sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
'tog-watchcreations' => 'Idugang ang mga panid nga akon pagahimoon sa akon ginabantayan',
'tog-watchdefault' => 'Idugang ang mga panid nga akon gina-ilisan sa akon ginabantayan',
'tog-watchmoves' => 'Idugang ang mga panid nga akon pagasaylohon sa akon ginabantayan',
@@ -173,20 +173,21 @@ $messages = array(
'faqpage' => 'Project:MMP',
# Vector skin
-'vector-action-addsection' => 'Magdugang sang topiko',
-'vector-action-delete' => 'Panason',
-'vector-action-move' => 'Saylohon',
-'vector-action-protect' => 'Pangapinan',
-'vector-action-undelete' => 'Dulaon ang pagpanas',
-'vector-action-unprotect' => 'Dulaon ang pagpangapin',
-'vector-view-create' => 'Himuon',
-'vector-view-edit' => 'Ilisan',
-'vector-view-history' => 'Lantawon ang kasaysayan',
-'vector-view-view' => 'Magbasa',
-'vector-view-viewsource' => 'Lantawon ang ginhalinan',
-'actions' => 'Mga hulag',
-'namespaces' => 'Ngalan-espasyo',
-'variants' => 'Mga nagkalain-lain',
+'vector-action-addsection' => 'Magdugang sang topiko',
+'vector-action-delete' => 'Panason',
+'vector-action-move' => 'Saylohon',
+'vector-action-protect' => 'Pangapinan',
+'vector-action-undelete' => 'Dulaon ang pagpanas',
+'vector-action-unprotect' => 'Dulaon ang pagpangapin',
+'vector-simplesearch-preference' => 'Sugtan ang mas ginpamaayo nga suhestiyon sa pagpangita (Para sa vector nga panit lamang)',
+'vector-view-create' => 'Himuon',
+'vector-view-edit' => 'Ilisan',
+'vector-view-history' => 'Lantawon ang kasaysayan',
+'vector-view-view' => 'Magbasa',
+'vector-view-viewsource' => 'Lantawon ang ginhalinan',
+'actions' => 'Mga hulag',
+'namespaces' => 'Ngalan-espasyo',
+'variants' => 'Mga nagkalain-lain',
'errorpagetitle' => 'Sala/Eror',
'returnto' => 'Balik sa $1.',
@@ -247,6 +248,9 @@ Tuman ka damo nga manuggamit ang luyag makakita sang sini nga panid.
Palihog maghulat sang malip-ot nga tini-on bag-o magsulod sa sini nga pahina liwat.
$1',
+'pool-timeout' => 'Pag-untat nagahulat para sa kandado',
+'pool-queuefull' => 'Ang pila sang linaw puno na',
+'pool-errorunknown' => 'Wala mahibaluan nga sala',
# 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' => 'Nahanungod sa {{SITENAME}}',
@@ -415,7 +419,8 @@ Indi pagkalimti ang pag-ilis sang imo mga [[Special:Preferences|{{SITENAME}} pag
'yourname' => 'Ngalan sang Manog-gamit:',
'yourpassword' => 'Kontra-senyas:',
'yourpasswordagain' => 'Suliton ang kontra-senyas:',
-'remembermypassword' => 'Dumdumon ang akon pagsulod sa sini nga kompyuter',
+'remembermypassword' => 'Dumdumon ang akon pagsulod sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
+'securelogin-stick-https' => 'Magpabilin nga nakatakod sa HTTPS pagkatapos magsulod',
'yourdomainname' => 'Imo dominyo',
'externaldberror' => 'Mahimo nga may ara sang sala sa pagpamatood sang database ukon wala ka sa lugar nga magbag-o sang imo pang-guha nga akawnt.',
'login' => 'Mag sulod',
@@ -432,6 +437,7 @@ Indi pagkalimti ang pag-ilis sang imo mga [[Special:Preferences|{{SITENAME}} pag
'gotaccount' => 'May yara ka na sang akawnt? $1.',
'gotaccountlink' => 'Mag sulod',
'createaccountmail' => 'Paagi sa e-mail',
+'createaccountreason' => 'Rason:',
'badretype' => 'Ang mga pasword nga imo gintum-ok wala naga-santo.',
'userexists' => 'Ang gamit-pangalan nga imo ginbutang ginagamit na.
Palihog magpili sang lain nga pangalan.',
@@ -460,6 +466,7 @@ Palihog tilawi liwat butang.',
Palihog tilawi liwat butang.',
'passwordtooshort' => 'Ang mga pasword dapat indi magnubo sa {{PLURAL:$1|isa ka letra|$1 ka letra}}.',
'password-name-match' => 'Ang imo pasword dapat lain sa imo gamit-pangalan.',
+'password-login-forbidden' => 'Wala ginatugotan ang paggamit sang sini nga gamit-pangalan kag pasword.',
'mailmypassword' => 'i-E-mail ang bag-o na pasword',
'passwordremindertitle' => 'Bag-o nga temporaryo nga pasword para sa {{SITENAME}}',
'passwordremindertext' => 'May yara nga nagpangayo (basi ikaw, may IP address nga $1) sang bag-o
@@ -503,6 +510,9 @@ Palihog maghulat anay bag-o tilawan liwat.',
'loginlanguagelabel' => 'Hambalanon: $1',
'suspicious-userlogout' => 'Ang imo pagpangabay nga mag-guha ginpungga bangud nga ini mahimo nga ginpadala sang guba nga brawser ukon sang proksy nga nagapang-tago.',
+# E-mail sending
+'php-mail-error-unknown' => 'Wala nahibaluan nga sala sa kapuslanan nga sulat() sang PHP.',
+
# Password reset dialog
'resetpass' => 'Ilisan ang pasword',
'resetpass_announce' => 'Nagsulod ka paagi sang temporary nga kod nga gin-email.
@@ -554,9 +564,12 @@ Mahimo nga madinalag-on mo nga nga gin-ilisan ang imo pasword ukon nagpangabay k
'showdiff' => 'Ipakita ang inislan',
'anoneditwarning' => "'''Pa-andam:''' Wala ka pa nakasulod.
Igasulat ang imo IP adres sa historya sini nga inislan na pahina.",
+'anonpreviewwarning' => "''Wala ka pa nakasulod. Igasulat ang imo IP adres sa historya sini nga inislan na pahina.''",
'missingsummary' => "'''Pahanumdom:''' Wala ka naghatag sang malip-ot nga pagsaysay sang imo gin-ilisan.
Kon tum-okon mo liwat ang \"{{int:savearticle}}\", ang imo gin-ilisan pagatiponon nga wala sini.",
'missingcommenttext' => 'Palihog butangi sang komento sa idalom.',
+'missingcommentheader' => "'''Pahanumdom:''' Wala ka naghatag sang topiko/ulo sang topiko para sa sini nga komento.
+Kon tum-okon mo liwat ang \"{{int:savearticle}}\", ang imo gin-ilisan pagatiponon nga wala sini.",
'summary-preview' => 'Kabilugan nga prebyu:',
'subject-preview' => 'Prebyu sang topiko/ulo sang topiko:',
'blockedtitle' => 'Ang manuggamit ginapunggan',
@@ -636,6 +649,12 @@ Ang pinaka-ulihi nga log sa pagpuggong yara sa idalom para mahibaluan nimo:',
'''Wala pa ini matipon!'''",
'userjspreview' => "'''Tandai nga ginalantaw/ginatilawan mo pa lang ang imo JavaScript sang manuggamit.'''
'''Wala pa ini matipon!'''",
+'sitecsspreview' => "'''Tandai nga ginalantaw mo pa lang ang ini nga CSS.'''
+'''Wala pa ini matipon!'''",
+'sitejspreview' => "'''Tandai nga ginalantaw mo pa lang ang ini nga kodigo sang JavaScript.'''
+'''Wala pa ini matipon!'''",
+'userinvalidcssjstitle' => "'''Aviso:''' Wala sang panit nga \"\$1\".
+Sa mga pahungod nga mga panid nga .css and .js magamit sang titulo nga may gagmay nga letra (lowercase), e.g. {{ns:user}}:Foo/vector.css kontra sa {{ns:user}}:Foo/Vector.css.",
'updated' => '(Suno sa oras)',
'note' => "'''Pansinon:'''",
'previewnote' => "'''Tandaan nga prebyu lamang ini.'''
@@ -857,6 +876,8 @@ $1",
'logdelete-failure' => "'''Ang pagkakitaon sang log indi mahimo nga maplastar:'''
$1",
'revdel-restore' => 'pagbag-o sang makita',
+'revdel-restore-deleted' => 'mga ginpanas nga pagbag-o',
+'revdel-restore-visible' => 'mga makita nga pagbag-o',
'pagehist' => 'Kasaysayan sang panid',
'deletedhist' => 'Ginpanas nga kasaysayan',
'revdelete-content' => 'kaundan',
@@ -878,55 +899,225 @@ Indi ka mahimo nga magsulod diri.',
'revdelete-no-change' => "'''Pahibalo:''' ang bagay nga may petsa $2, $1 nagpangabay na sang mga siting sa pagpakita.",
'revdelete-concurrent-change' => 'May sala sa pagbag-o sang bagay nga may petsa nga $2, $1: ang iya kahimtangan nagaguwa nga gin-ilisan sang iban samtang ginatuyo mo ini nga bag-uhon.
Palihog sekyar sang mga logs.',
+'revdelete-only-restricted' => 'May sala sa pagtago sang bagay nga may petsa nga $2, $1: indi mo makakas ang mga bagay nga makita sang mga administrador kon wala ka man nagpili sang isa sa mga pililian sa pagkakita.',
+'revdelete-reason-dropdown' => '*Masami nga rason sang pagdula
+** Paglapas sang kinamatarong-kontra-pagkopya
+** Indi nagakadapat nga impormasyon pangkaugalingon
+** Mahimo nagapangguba-kinamatarong nga impormasyon',
+'revdelete-otherreason' => 'Iban/dugang nga rason:',
+'revdelete-reasonotherlist' => 'Iban nga rason',
+'revdelete-edit-reasonlist' => 'Ilisan ang pagdula sang mga rason',
+'revdelete-offender' => 'Ang nagbuhat sang pagbag-o:',
+
+# Suppression log
+'suppressionlog' => 'Log sang pagkakas',
+
+# History merging
+'mergehistory' => 'Isugpon ang mga kasaysayan sang panid',
+'mergehistory-header' => 'Ang ini nga panid nagapasugpon sa imo sang mga pagbag-o sang kasaysayan sang isa ka panid nga ginhalinan pakadto sa mas bag-o nga panid.
+Palihog seguraduhon nga ang ini nga pagbag-o magapabilin sang pagpadayon sang panid sang kasaysayan.',
+'mergehistory-box' => 'Isugpon ang mga pagbag-o sang duha ka panid:',
+'mergehistory-from' => 'Gihalinan nga panid:',
+'mergehistory-into' => 'Pakadtuan nga panid:',
+'mergehistory-list' => 'Mahimo masugpon nga kasaysayan sang pagbag-o',
+'mergehistory-merge' => 'Ang masunod nga mga pagbag-o sang [[:$1]] mahimo masugpon sa [[:$2]].
+Gamita ang mga buton nga radio sa pagsugpon lamang sa mga pagbag-o nga gintuga sa kag bag-o ang tion nga ginbutang.
+Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
+'mergehistory-go' => 'Ipakita ang mga mahimo masugpon nga mga pagbag-o',
+'mergehistory-submit' => 'Isugpon ang mga pagbag-o',
+'mergehistory-empty' => 'Wala sing pagbag-o nga mahimo masugpon.',
+'mergehistory-success' => '$3 {{PLURAL:$3|ka pagbag-o|ka mga pagbag-o}} sang [[:$1]] madinalag-on nga ginsugpon sa [[:$2]].',
+'mergehistory-fail' => 'Wala mahuman ang pagsugpon sang kasaysayan, palihog lantawa liwat ang panid kag ang parametro sang tion.',
+'mergehistory-no-source' => 'Ang ginhalin nga panid nga $1 wala naga-eksister.',
+'mergehistory-no-destination' => 'Ang tuyo lab-oton nga panid nga $1 wala naga-eksister.',
+'mergehistory-invalid-source' => 'Kinahanglan nga ang ginhalinan nga panid matood-tood nga titulo.',
+'mergehistory-invalid-destination' => 'Ang palakadtuan nga panid kinahanglan nga matood nga titulo.',
+'mergehistory-autocomment' => 'Ginsugpon ang [[:$1]] sa [[:$2]]',
+'mergehistory-comment' => 'Ginsugpon ang [[:$1]] sa [[:$2]]: $3',
+'mergehistory-same-destination' => 'Ang ginhalinan kag palakadtuan nga mga panid indi mahimo nga pareho',
+'mergehistory-reason' => 'Rason:',
# Merge log
-'revertmerge' => 'Di pag-upod',
+'mergelog' => 'Isugpon ang log',
+'pagemerge-logentry' => 'ginsugpon ang [[$1]] sa [[$2]] (mga pagbag-o asta $3)',
+'revertmerge' => 'Di pag-upod',
+'mergelogpagetext' => 'Sa dalom isa ka lista sang mga pinaka-ulihe nga pagsugpon sang isa ka kasaysayan sang panid sa isa pa gid.',
# Diffs
-'history-title' => 'Rebisyon sang historya sa "$1"',
-'difference' => '(Naglain sa tunga sang mga rebisyon)',
-'lineno' => 'Linya $1:',
-'compareselectedversions' => 'I-kompara ang pinilian nga mga rebisyon',
-'editundo' => 'bawi-on ang pag ilis',
+'history-title' => 'Rebisyon sang historya sa "$1"',
+'difference' => '(Naglain sa tunga sang mga rebisyon)',
+'difference-multipage' => '(Kinala-in sang mga panid)',
+'lineno' => 'Linya $1:',
+'compareselectedversions' => 'I-kompara ang pinilian nga mga rebisyon',
+'showhideselectedversions' => 'Ipakita/taguon ang mga ginpili nga pagbag-o',
+'editundo' => 'bawi-on ang pag ilis',
+'diff-multi' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang {{PLURAL:$2|isa ka manuggamit|$2 ka mga manuggamit}} nga wala ginpakita)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang masobra $2 ka {{PLURAL:$2|manuggamit|mga manuggamit}} nga wala ginpakita)',
# Search results
-'searchresults' => 'Resulta sang Pagpangita',
-'searchresults-title' => 'Resulta sang Pagpangita para "$1"',
-'searchresulttext' => 'Para sa madamu pa nga impormasyon parti sa pagpangita {{SITENAME}}, lantawa [[{{MediaWiki:Helppage}}|{{int:bulig}}]].',
-'searchsubtitle' => 'Nagpangita ka para \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|tanan nga pahina gasugod sa "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|tanan nga pahina nga naga tabid kay "$1"]])',
-'searchsubtitleinvalid' => "Nangita ka para '''$1'''",
-'notitlematches' => 'Wala sang parehas nga titulo ka pahina',
-'notextmatches' => 'Wala sang pahina nga parehas teksto',
-'prevn' => 'antes {{PLURAL:$1|$1}}',
-'nextn' => 'dasun {{PLURAL:$1|$1}}',
-'viewprevnext' => 'Tan-awon ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size' => '$1 ({{PLURAL:$2|1 pulong|$2 pulong}})',
-'search-redirect' => '(gindirekta liwat $1)',
-'search-section' => '(seksiyon $1)',
-'search-suggest' => 'Ang buot mo silingon: $1',
-'search-interwiki-caption' => 'Mga Utod proyekto',
-'search-interwiki-default' => '$1 mga resulta:',
-'search-interwiki-more' => '(damu)',
-'search-mwsuggest-enabled' => 'may suhestiyon',
-'search-mwsuggest-disabled' => 'wala suhestiyon',
-'nonefound' => "'''Tandaan''': Ang iban lang nga mga ngalan-espasyo ay ginapangita nga daan.
+'searchresults' => 'Resulta sang Pagpangita',
+'searchresults-title' => 'Resulta sang Pagpangita para "$1"',
+'searchresulttext' => 'Para sa madamu pa nga impormasyon parti sa pagpangita {{SITENAME}}, lantawa [[{{MediaWiki:Helppage}}|{{int:bulig}}]].',
+'searchsubtitle' => 'Nagpangita ka para \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|tanan nga pahina gasugod sa "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|tanan nga pahina nga naga tabid kay "$1"]])',
+'searchsubtitleinvalid' => "Nangita ka para '''$1'''",
+'toomanymatches' => 'Tuman ka madamo nga pareho ang nagbalik, palihog tilaw sang lain nga pagpangita',
+'titlematches' => 'Mga pareho nga titulo sang panid',
+'notitlematches' => 'Wala sang parehas nga titulo ka pahina',
+'textmatches' => 'Mga pareho nga teksto sang panid',
+'notextmatches' => 'Wala sang pahina nga parehas teksto',
+'prevn' => 'antes {{PLURAL:$1|$1}}',
+'nextn' => 'dasun {{PLURAL:$1|$1}}',
+'prevn-title' => 'Nagligad nga $1 {{PLURAL:$1|resulta|mga resulta}}',
+'nextn-title' => 'Madason nga $1 {{PLURAL:$1|resulta|mga resulta}}',
+'shown-title' => 'Magpakita sang $1 ka {{PLURAL:$1|resulta|mga resulta}} kada panid',
+'viewprevnext' => 'Tan-awon ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'Mga pililian sa pagpangita',
+'searchmenu-exists' => "'''May yara sang panid nga ginhingalanan nga \"[[:\$1]]\" sa sini nga wiki.'''",
+'searchmenu-new' => "'''Gintuga ang panid nga \"[[:\$1]]\" sa sini nga wiki!'''",
+'searchhelp-url' => 'Help:Mga Unod',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Magbasa-basa sang mga panid gamit ang ini nga unpali]]',
+'searchprofile-articles' => 'Mga panid sang unod',
+'searchprofile-project' => 'Mga panid sang Bulig kag Proyekto',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Tanan-tanan',
+'searchprofile-advanced' => 'Mas mauna',
+'searchprofile-articles-tooltip' => 'Pangitaa sa $1',
+'searchprofile-project-tooltip' => 'Pangitaa sa $1',
+'searchprofile-images-tooltip' => 'Mangita sang mga hilera',
+'searchprofile-everything-tooltip' => 'Pangitaon ang tanan nga kaundan (dala na ang mga panid sang pag-estorya)',
+'searchprofile-advanced-tooltip' => 'Pangitaon sa pahungod nga espasyo sang pangalan',
+'search-result-size' => '$1 ({{PLURAL:$2|1 pulong|$2 pulong}})',
+'search-result-category-size' => '{{PLURAL:$1|1 ka miyembro|$1 ka mga miyembro}} ({{PLURAL:$2|1 ka subcategoriya|$2 ka mga subcategoriya}}, {{PLURAL:$3|1 ka hilera|$3 ka mga hilera}})',
+'search-result-score' => 'Pagkaangot: $1%',
+'search-redirect' => '(gindirekta liwat $1)',
+'search-section' => '(seksiyon $1)',
+'search-suggest' => 'Ang buot mo silingon: $1',
+'search-interwiki-caption' => 'Mga Utod proyekto',
+'search-interwiki-default' => '$1 mga resulta:',
+'search-interwiki-more' => '(damu)',
+'search-mwsuggest-enabled' => 'may suhestiyon',
+'search-mwsuggest-disabled' => 'wala suhestiyon',
+'search-relatedarticle' => 'Konektado',
+'mwsuggest-disable' => 'Untaton ang mga suhestiyon sang AJAX',
+'searcheverything-enable' => 'Pangitaon sa tanan nga espasyo sang pangalan',
+'searchrelated' => 'konektado',
+'searchall' => 'tanan',
+'showingresults' => "Ginapakita sa dalom pakadto sa {{PLURAL:$1|'''1''' ka resulta|'''$1''' ka mga resulta}} umpisa ang #'''$2'''.",
+'showingresultsnum' => "Ginapakita sa dalom ang {{PLURAL:$3|'''1''' ka resulta|'''$3''' ka mga resulta}} umpisa ang #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Resulta nga '''$1''' sang '''$3'''|Mga resulta nga '''$1 - $2''' sang '''$3'''}} para sa '''$4'''",
+'nonefound' => "'''Tandaan''': Ang iban lang nga mga ngalan-espasyo ay ginapangita nga daan.
Testingan mo i-prefiks ang imo pamangkot upod sang ''tanan:'' para makita mo ang tanan nga unod (dala na dira ang pahina paghisayranay, templeyts, etc), o gamita amg imo nanamian nga ngalan-espasyo bilang prefiks.",
-'powersearch' => 'Abanse nga pagpangita',
-'powersearch-legend' => 'Abanse nga pagpangita',
-'powersearch-ns' => 'Pangita sa mga ngalan-espasyo:',
-'powersearch-redir' => 'Lista sang mga gin direkta liwat',
-'powersearch-field' => 'Pangita-on si',
+'search-nonefound' => 'Wala sang mga resulta nga nagsanto sa imo nga ginapangita.',
+'powersearch' => 'Abanse nga pagpangita',
+'powersearch-legend' => 'Abanse nga pagpangita',
+'powersearch-ns' => 'Pangita sa mga ngalan-espasyo:',
+'powersearch-redir' => 'Lista sang mga gin direkta liwat',
+'powersearch-field' => 'Pangita-on si',
+'powersearch-togglelabel' => 'Tsekan:',
+'powersearch-toggleall' => 'Tanan',
+'powersearch-togglenone' => 'Wala',
+'search-external' => 'Pagpangita sa guwa',
+'searchdisabled' => 'Ang pagpangita sa {{SITENAME}} gin-untat.
+Mahimo ka nga magpangita gamit ang Google sa sini nga tion.
+Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga madaan na.',
+
+# Quickbar
+'qbsettings' => 'Bar nga mahapos',
+'qbsettings-none' => 'Wala',
+'qbsettings-fixedleft' => 'Gintadlong sa wala',
+'qbsettings-fixedright' => 'Gintadlong sa too',
+'qbsettings-floatingleft' => 'Nagalutaw sa wala',
+'qbsettings-floatingright' => 'Nagalutaw sa too',
# Preferences page
-'preferences' => 'Mga Ginabasehan',
-'mypreferences' => 'Akon pagpalabi',
-'prefsnologin' => 'Wala naka-sulod',
-'skin-preview' => 'Ipakita subong',
-'prefs-rc' => 'Mga Bag-o nga Inislan',
-'searchresultshead' => 'Pangita-a',
-'youremail' => 'E-mail:',
-'username' => 'Ngalan sang Manog-gamit:',
-'email' => 'E-mail',
+'preferences' => 'Mga Ginabasehan',
+'mypreferences' => 'Akon pagpalabi',
+'prefs-edits' => 'Numero sang mga gin-ilisan:',
+'prefsnologin' => 'Wala naka-sulod',
+'prefsnologintext' => 'Kinahanglan nga ikaw <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakasulod]</span> agod nga mabuhat ang pag-ilis sang mga ginapalabi.',
+'changepassword' => 'Ilisan ang pasword',
+'prefs-skin' => 'Panit',
+'skin-preview' => 'Ipakita subong',
+'datedefault' => 'Wala sang pagpalabi',
+'prefs-datetime' => 'Petsa kag oras',
+'prefs-personal' => 'Profayl sang manuggamit',
+'prefs-rc' => 'Mga Bag-o nga Inislan',
+'prefs-watchlist' => 'Lista sang mga ginabantayan',
+'prefs-watchlist-days' => 'Mga adlaw nga ipakita sa lista sang ginabantayan:',
+'prefs-watchlist-days-max' => 'Indi magsobra 7 ka adlaw',
+'prefs-watchlist-edits' => 'Ang pinakataas nga beses sang pag-ilis nga ipakita sa ginpalawig nga lista sang ginabantayan:',
+'prefs-watchlist-edits-max' => 'Pinakataas nga numero: 1000',
+'prefs-watchlist-token' => 'Token sang lista sang ginabantayan:',
+'prefs-misc' => 'Misc',
+'prefs-resetpass' => 'Ilisan ang pasword',
+'prefs-email' => 'Mga pililian sang e-mail',
+'prefs-rendering' => 'Hitsura',
+'saveprefs' => 'Itipunon',
+'resetprefs' => 'Panason ang mga wala matipon nga mga pagbag-o',
+'restoreprefs' => 'Ibalik ang tanan nga default settings',
+'prefs-editing' => 'Pag-ilis',
+'prefs-edit-boxsize' => 'Ang kadakoon sang bintana sang pag-ilis.',
+'rows' => 'Mga linya:',
+'columns' => 'Mga kulumna:',
+'searchresultshead' => 'Pangita-a',
+'resultsperpage' => 'Mga pag-igu kada panid:',
+'stub-threshold' => 'Suludlan sang <a href="#" class="stub">stub sang link</a> nga pagkay-o (bytes):',
+'stub-threshold-disabled' => 'Gin-untat',
+'recentchangesdays' => 'Adlaw nga nabilin sa pagpakita sang mga bag-o nga pag-ilis:',
+'recentchangesdays-max' => 'Indi magtaas sa $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
+'recentchangescount' => 'Numero sang mga pag-ilis nga ipakita by default:',
+'prefs-help-recentchangescount' => 'Nadala diri ang mga bag-o nga gin-ilisan, kasaysayan sang mga panid, kag mga log.',
+'prefs-help-watchlist-token' => 'Ang pagsulat sa sini nga lugar gamit ang sekreto nga yabi magatuga sang RSS feed para sa lista sang imo ginabantayn.
+Ang bisan sin-o nga nakahibalo sang sini nga yabi sa sini nga lugar mahimo nga makabasa sang imo lista, gani magpili sang segurado nga balor.
+Ini isa ka wala pinilian nga balor nga imo mahimo gamiton: $1',
+'savedprefs' => 'Ang imo mga pagpalabi gintipon na.',
+'timezonelegend' => 'Sona sang oras:',
+'localtime' => 'Lokal nga oras:',
+'timezoneuseoffset' => 'Iban pa (ibutang ang offset)',
+'timezoneoffset' => 'Offset¹:',
+'servertime' => 'Oras sang server:',
+'guesstimezone' => 'Butangan halin sa brawser',
+'timezoneregion-africa' => 'Africa',
+'timezoneregion-america' => 'America',
+'timezoneregion-antarctica' => 'Antarctica',
+'timezoneregion-arctic' => 'Arctico',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Kadagatan sang Atlantico',
+'timezoneregion-australia' => 'Australia',
+'timezoneregion-europe' => 'Europa',
+'timezoneregion-indian' => 'Kadagatan sang India',
+'timezoneregion-pacific' => 'Kadagatan sang Pacifico',
+'allowemail' => 'Paganahon ang e-mail halin sa iban nga manuggamit',
+'prefs-searchoptions' => 'Mga pililian sa pagpangita',
+'prefs-namespaces' => 'Ngalan-espasyo',
+'defaultns' => 'Kon indi magpangita na lang sa sini nga mga ngalan-espasyo',
+'default' => 'default',
+'prefs-files' => 'Mga hilera',
+'prefs-custom-css' => 'Ginhungod nga CSS',
+'prefs-custom-js' => 'Ginhungod nga JavaScript',
+'prefs-common-css-js' => 'Ginaparte nga CSS?JavaScript para sa tanan nga panit:',
+'prefs-reset-intro' => 'Indi mo magamit ang ini nga panid agod mailisan ang imo mga pagpalabi sa mga default sang site.
+Indi na ini maliwat pa.',
+'prefs-emailconfirm-label' => 'Paagkumperma sang e-mail:',
+'prefs-textboxsize' => 'Kadakoon sang bintana sang pag-ilis',
+'youremail' => 'E-mail:',
+'username' => 'Ngalan sang Manog-gamit:',
+'uid' => 'ID sang manuggamit:',
+'prefs-memberingroups' => 'Miyembro sang {{PLURAL:$1|grupo|mga grupo}}:',
+'prefs-registration' => 'Oras sang pagparehistro:',
+'yourrealname' => 'Matood-tood nga pangalan:',
+'yourlanguage' => 'Lenguahe:',
+'yournick' => 'Bag-o nga pirma:',
+'prefs-help-signature' => 'Ang mga kumento sa mga panid sang pag-estorya kinahanglan nga napirmahan sang "<nowiki>~~~~</nowiki>" nga pagasayluhon sa imo pirma sang stamp sang oras.',
+'badsig' => 'Indi mabaton nga hilaw nga pirma.
+Palihog lantaw sang mga tag sang HTML.',
+'badsiglength' => 'Ang imo pirma tuman ka lawig.
+Ini indi dapat nga magsobra sa $1 {{PLURAL:$1|ka karakter|ka mga karakter}} ang kalabaon.',
+'yourgender' => 'Gender:',
+'gender-unknown' => 'Wala masigurado',
+'gender-male' => 'Lalaki',
+'gender-female' => 'Babayi',
+'email' => 'E-mail',
# Groups
'group-sysop' => 'Mga Administrador',
@@ -1054,7 +1245,6 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
# Watchlist
'watchlist' => 'Akon Ginabantayan',
'mywatchlist' => 'Akon Ginabantayan',
-'watchlistfor' => "(para '''$1''')",
'watchnologin' => 'Wala naka-sulod',
'addedwatch' => 'Nadugang sa lista sang lantaw',
'addedwatchtext' => "Ang pahina \"[[:\$1]]\" ay nadugang sa imo [[Special:Watchlist|lista sang pagtan-aw]].
@@ -1285,9 +1475,9 @@ Gapasugot sa pagdugang sang rason sa kabilugan.',
'nextdiff' => 'Mas bag-o nga gin-islan →',
# Media information
-'file-info-size' => '($1 × $2 piksel, kadakuon sang file: $3, MIME type: $4)',
+'file-info-size' => '$1 × $2 piksel, kadakuon sang file: $3, MIME type: $4',
'file-nohires' => '<small>Wala sang yara na taas nga resolusyon.</small>',
-'svg-long-desc' => '(SVG file, nominalya $1 × $2 piksels, kadakuon sang file: $3)',
+'svg-long-desc' => 'SVG file, nominalya $1 × $2 piksels, kadakuon sang file: $3',
'show-big-image' => 'Kabilogan nga resolusyon',
'show-big-image-thumb' => '<small>Kadakuon sa sini nga prebyu: $1 × $2 piksels</small>',
diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php
index 2ee02afd..e0046d3c 100644
--- a/languages/messages/MessagesHr.php
+++ b/languages/messages/MessagesHr.php
@@ -13,6 +13,7 @@
* @author Demicx
* @author Dnik
* @author Ex13
+ * @author Excaliboor
* @author Herr Mlinka
* @author Luka Krstulovic
* @author MayaSimFan
@@ -94,6 +95,7 @@ $specialPageAliases = array(
'Allpages' => array( 'Sve_stranice' ),
'Prefixindex' => array( 'Prefiks_indeks', 'Stranice_po_prefiksu' ),
'Ipblocklist' => array( 'Blokirane_adrese' ),
+ 'Unblock' => array( 'Odblokiraj' ),
'Specialpages' => array( 'Posebne_stranice' ),
'Contributions' => array( 'Doprinosi' ),
'Emailuser' => array( 'ElektroniÄka_poÅ¡ta', 'E-mail' ),
@@ -128,7 +130,7 @@ $specialPageAliases = array(
'Listbots' => array( 'Botovi' ),
'Popularpages' => array( 'Popularne_stranice' ),
'Search' => array( 'Traži' ),
- 'Resetpass' => array( 'Ponovno_postavi_lozinku' ),
+ 'Resetpass' => array( 'Izmijeni_lozinku' ),
'Withoutinterwiki' => array( 'Bez_međuwikipoveznica', 'Bez_interwikija' ),
'MergeHistory' => array( 'Spoji_povijest' ),
'Filepath' => array( 'Putanja_datoteke' ),
@@ -137,6 +139,7 @@ $specialPageAliases = array(
'LinkSearch' => array( 'Traži_poveznice', 'Traži_linkove' ),
'DeletedContributions' => array( 'Obrisani_doprinosi' ),
'Tags' => array( 'Oznake' ),
+ 'Activeusers' => array( 'Aktivni_suradnici' ),
);
$magicWords = array(
@@ -296,7 +299,7 @@ $dateFormats = array(
'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$fallback8bitEncoding = 'iso-8859-2';
@@ -318,8 +321,7 @@ $messages = array(
'tog-editsection' => 'Prikaži poveznice za uređivanje pojedinih odlomaka',
'tog-editsectiononrightclick' => 'Pritiskom na desnu tipku miša otvori uređivanje pojedinih odlomaka (JavaScript)',
'tog-showtoc' => 'U Älancima s viÅ¡e od tri odlomka prikaži tablicu sadržaja.',
-'tog-rememberpassword' => 'Zapamti lozinku između prijava',
-'tog-editwidth' => 'Proširi okvir za uređivanje preko cijele širine ekrana',
+'tog-rememberpassword' => 'Zapamti moju lozinku u ovom pregledniku (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
'tog-watchcreations' => 'Dodaj Älanke koje kreiram na moj popis praćenja',
'tog-watchdefault' => 'Dodaj sve nove i izmijenjene stranice u popis praćenja',
'tog-watchmoves' => 'Dodaj sve stranice koje premjestim na popis praćenja',
@@ -460,31 +462,21 @@ i [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide VodiÄ za suradnike]
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Dodaj temu',
-'vector-action-delete' => 'Izbriši',
-'vector-action-move' => 'Premjesti',
-'vector-action-protect' => 'Zaštiti',
-'vector-action-undelete' => 'Vrati',
-'vector-action-unprotect' => 'Ukloni zaštitu',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Stranica pomoći',
-'vector-namespace-image' => 'Datoteka',
-'vector-namespace-main' => 'Stranica',
-'vector-namespace-media' => 'Mediji',
-'vector-namespace-mediawiki' => 'Poruka',
-'vector-namespace-project' => 'Stranica projekta',
-'vector-namespace-special' => 'Posebna stranica',
-'vector-namespace-talk' => 'Razgovor',
-'vector-namespace-template' => 'Predložak',
-'vector-namespace-user' => 'SuradniÄka stranica',
-'vector-view-create' => 'ZapoÄni',
-'vector-view-edit' => 'Uredi',
-'vector-view-history' => 'Vidi stare izmjene',
-'vector-view-view' => 'ÄŒitaj',
-'vector-view-viewsource' => 'Vidi izvor',
-'actions' => 'Radnje',
-'namespaces' => 'Imenski prostori',
-'variants' => 'InaÄice',
+'vector-action-addsection' => 'Dodaj temu',
+'vector-action-delete' => 'Izbriši',
+'vector-action-move' => 'Premjesti',
+'vector-action-protect' => 'Zaštiti',
+'vector-action-undelete' => 'Vrati',
+'vector-action-unprotect' => 'Ukloni zaštitu',
+'vector-simplesearch-preference' => 'Omogući poboljšane prijedloge za pretraživanje (samo izgled Vector)',
+'vector-view-create' => 'ZapoÄni',
+'vector-view-edit' => 'Uredi',
+'vector-view-history' => 'Vidi stare izmjene',
+'vector-view-view' => 'ÄŒitaj',
+'vector-view-viewsource' => 'Vidi izvor',
+'actions' => 'Radnje',
+'namespaces' => 'Imenski prostori',
+'variants' => 'InaÄice',
'errorpagetitle' => 'Pogreška',
'returnto' => 'Vrati se na $1.',
@@ -545,6 +537,9 @@ Previše suradnika pokušava vidjeti ovu stranicu.
Molimo malo priÄekajte prije nego Å¡to opet pokuÅ¡ate pristupiti ovoj stranici.
$1',
+'pool-timeout' => "Istek vremena (''timeout'') Äekajući zakljuÄavanje",
+'pool-queuefull' => 'Red Äekanja je pun',
+'pool-errorunknown' => 'Nepoznata pogreška',
# 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' => 'O projektu {{SITENAME}}',
@@ -706,7 +701,8 @@ Ne zaboravite prilagoditi [[Special:Preferences|{{SITENAME}} postavke]].',
'yourname' => 'SuradniÄko ime',
'yourpassword' => 'Lozinka:',
'yourpasswordagain' => 'Ponovno upišite lozinku',
-'remembermypassword' => 'Trajno zapamti moju lozinku.',
+'remembermypassword' => 'Zapamti moju lozinku na ovom raÄunalu (najduže $1 {{PLURAL:$1|dan|dana}})',
+'securelogin-stick-https' => 'Ostani spojen na HTTPS nakon prijave',
'yourdomainname' => 'Vaša domena',
'externaldberror' => 'DoÅ¡lo je do pogreÅ¡ke s vanjskom autorizacijom ili Vam nije dopuÅ¡teno osvježavanje vanjskog suradniÄkog raÄuna.',
'login' => 'Prijavi se',
@@ -723,6 +719,7 @@ Ne zaboravite prilagoditi [[Special:Preferences|{{SITENAME}} postavke]].',
'gotaccount' => "Već imate suradniÄki raÄun? '''$1'''.",
'gotaccountlink' => 'Prijavite se',
'createaccountmail' => 'poštom',
+'createaccountreason' => 'Razlog:',
'badretype' => 'Unesene lozinke nisu istovjetne.',
'userexists' => 'Uneseno suradniÄko ime već je u upotrebi.
Unesite neko drugo ime.',
@@ -743,6 +740,7 @@ Provjerite jeste li toÄno upisali, ili [[Special:UserLogin/signup|otvorite novi
'wrongpasswordempty' => 'Niste unijeli lozinku. Pokušajte ponovno.',
'passwordtooshort' => 'Lozinka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.',
'password-name-match' => 'VaÅ¡a lozinka mora biti razliÄita od VaÅ¡eg suradniÄkog imena.',
+'password-login-forbidden' => 'Uporaba ovog suradniÄkog imena i lozinke nije dozvoljena.',
'mailmypassword' => 'Pošalji mi novu lozinku',
'passwordremindertitle' => '{{SITENAME}}: nova lozinka.',
'passwordremindertext' => 'Netko je (vjerojatno Vi, s IP adrese $1) zatražio novu lozinku za projekt {{SITENAME}} ($4).
@@ -783,6 +781,9 @@ Molimo Vas da priÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).',
+# E-mail sending
+'php-mail-error-unknown' => 'Nepoznata pogreška u PHP-mail() funkciji',
+
# Password reset dialog
'resetpass' => 'Promijeni lozinku',
'resetpass_announce' => 'Prijavljeni ste s privremenom lozinkom. Da završite proces mijenjanja lozinke, upišite ovdje novu lozinku:',
@@ -833,9 +834,10 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
'showlivepreview' => 'Pregled kako će izgledati, uživo',
'showdiff' => 'Prikaži promjene',
'anoneditwarning' => "'''Upozorenje:''' Niste prijavljeni pod suradniÄkim imenom. VaÅ¡a IP adresa bit će zabilježena u popisu izmjena ove stranice.",
+'anonpreviewwarning' => "''Niste prijavljeni. Spremanjem će Vaše IP adrese ostati zabilježene u starim izmjenama ove stranice.''",
'missingsummary' => "'''Podsjetnik:''' Niste unijeli sažetak promjena. Ako ponovno kliknete na \"SaÄuvaj stranicu\", VaÅ¡e će promjene biti snimljene bez sažetka.",
'missingcommenttext' => 'Molim unesite sažetak.',
-'missingcommentheader' => "'''Upozorenje:''' Niste napisali sažetak ovog predmeta. Ako ponovno kliknete \"SaÄuvaj stranicu\", vaÅ¡ će predmet biti snimljen bez sažetka.",
+'missingcommentheader' => "'''Podsjetnik:''' Niste napisali sažetak ovog komentara. Ako ponovno kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
'summary-preview' => 'Pregled sažetka:',
'subject-preview' => 'Pregled predmeta:',
'blockedtitle' => 'Suradnik je blokiran',
@@ -903,7 +905,11 @@ Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
'userjsyoucanpreview' => "'''Savjet:''' Rabite dugme \"{{int:showpreview}}\" za testiranje svog novog JavaScripta prije snimanja.",
'usercsspreview' => "'''Ne zaboravite: samo isprobavate/pregledavate svoj suradniÄki CSS. JoÅ¡ nije snimljen!'''",
'userjspreview' => "'''Ne zaboravite: samo isprobavate/pregledavate svoj suradniÄki JavaScript, i da joÅ¡ nije snimljen!'''",
-'userinvalidcssjstitle' => "'''Upozorenje:''' Nema suÄelja pod imenom \"\$1\". Ne zaboravite da imena stranica s .css and .js kodom poÄinju malim slovom, npr. {{ns:user}}:Mate/monobook.css, a ne {{ns:user}}:Mate/Monobook.css.",
+'sitecsspreview' => "'''Ne zaboravite ovo je samo pregled ovog CSS-a.'''
+'''JoÅ¡ uvijek nije saÄuvan!'''",
+'sitejspreview' => "'''Ne zaboravite ovo je samo pregled JavaScript kôda.'''
+'''JoÅ¡ uvijek nije saÄuvan!'''",
+'userinvalidcssjstitle' => "'''Upozorenje:''' Nema suÄelja pod imenom \"\$1\". Ne zaboravite da imena stranica s .css and .js kodom poÄinju malim slovom, npr. {{ns:user}}:Mate/vector.css, a ne {{ns:user}}:Mate/Vector.css.",
'updated' => '(Ažurirano)',
'note' => "'''Napomena:'''",
'previewnote' => "'''Ne zaboravite da je ovo samo pregled kako će stranica izgledati i da stranica još nije snimljena!'''",
@@ -938,8 +944,6 @@ ove stranice. Ako je saÄuvate, sve će promjene uÄinjene nakon ove inaÄice bi
TakoÄ‘er nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz neÄeg Å¡to je u javnom vlasniÅ¡tvu ili pod sliÄnom slobodnom licencijom.
'''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
'copyrightwarning2' => "Molimo uoÄite da svi suradnici mogu mijenjati sve doprinose na {{SITENAME}}. Ako ne želite da se VaÅ¡e pisanje nemilosrdno ureÄ‘uje, nemojte ga slati ovdje.<br /> TakoÄ‘er nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz neÄeg Å¡to je u javnom vlasniÅ¡tvu ili pod sliÄnom slobodnom licencijom (vidi $1 za detalje). '''NE POSTAVLJAJTE RADOVE ZAÅ TIĆENE AUTORSKIM PRAVIMA BEZ DOPUÅ TENJA!'''",
-'longpagewarning' => 'PAŽNJA: Ova stranica je dugaÄka $1 kilobajta; neki bi preglednici mogli imati problema pri ureÄ‘ivanju stranica koje se približavaju ili su duže od 32 kb.
-Molimo razmislite o rastavljanju stranice na manje odjeljke.',
'longpageerror' => "'''GREŠKA: Tekst koji ste unijeli dug je $1 kilobajta, što je više od maksimalnih $2 kilobajta. Nije ga moguće snimiti.'''",
'readonlywarning' => "'''UPOZORENJE: Baza podataka je zakljuÄana zbog održavanja, pa trenutaÄno ne možete saÄuvati svoje
promjene. Najbolje je da kopirate i zaljepite tekst u tekstualnu datoteku te je snimite za kasnije.'''
@@ -1111,6 +1115,8 @@ $1",
'logdelete-failure' => "'''Vidljivost evidencije ne može biti postavljena:'''
$1",
'revdel-restore' => 'Promijeni dostupnost',
+'revdel-restore-deleted' => 'izbrisane izmjene',
+'revdel-restore-visible' => 'vidljive izmjene',
'pagehist' => 'Povijest stranice',
'deletedhist' => 'Obrisana povijest',
'revdelete-content' => 'sadržaj',
@@ -1179,11 +1185,13 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
# Diffs
'history-title' => 'Povijest izmjena stranice "$1"',
'difference' => '(Usporedba meÄ‘u inaÄicama)',
+'difference-multipage' => '(Razlika između stranica)',
'lineno' => 'Redak $1:',
'compareselectedversions' => 'Usporedi odabrane inaÄice',
'showhideselectedversions' => 'Otkrij/sakrij odabrane izmjene',
'editundo' => 'ukloni ovu izmjenu',
-'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna meÄ‘uinaÄica|Nisu prikazane $1 meÄ‘uinaÄice|Nije prikazano $1 meÄ‘uinaÄica}})',
+'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna meÄ‘uinaÄica|Nisu prikazane $1 meÄ‘uinaÄice|Nije prikazano $1 meÄ‘uinaÄica}} {{PLURAL:$2|jednog|$2|$2}} suradnika)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna meÄ‘uinaÄica|Nisu prikazane $1 meÄ‘uinaÄice|Nije prikazano $1 meÄ‘uinaÄica}} viÅ¡e od {{PLURAL:$2|jednog|$2|$2}} suradnika)',
# Search results
'searchresults' => 'Rezultati pretrage',
@@ -1218,6 +1226,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
'searchprofile-everything-tooltip' => 'Pretraži sav sadržaj (ukljuÄujući i stranice za razgovor)',
'searchprofile-advanced-tooltip' => 'Traži u zadanom imenskom prostoru',
'search-result-size' => '$1 ({{PLURAL:$2|1 rijeÄ|$2 rijeÄi}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Älan|$1 Älana|$1 Älanova}} ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})',
'search-result-score' => 'Povezanost: $1%',
'search-redirect' => '(preusmjeravanje $1)',
'search-section' => '(odlomak $1)',
@@ -1292,6 +1301,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
'contextlines' => 'Koliko redova teksta po pogotku',
'contextchars' => 'Koliko znakova po retku',
'stub-threshold' => 'Prag za formatiranje poput <a href="#" class="stub">poveznice mrve</a>:',
+'stub-threshold-disabled' => 'Onemogućeno',
'recentchangesdays' => 'Broj dana prikazanih u nedavnim promjenama:',
'recentchangesdays-max' => '(maksimalno $1 {{PLURAL:$1|dan|dana}})',
'recentchangescount' => 'Broj izmjena za prikaz kao zadano:',
@@ -1323,6 +1333,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
'prefs-files' => 'Datoteke',
'prefs-custom-css' => 'Prilagođen CSS',
'prefs-custom-js' => 'Prilagođen JS',
+'prefs-common-css-js' => 'Dijeljeni CSS/JS za sve izglede:',
'prefs-reset-intro' => 'Možete koristiti ovu stranicu za povrat Vaših postavki na prvotne postavke. Ovo se ne može poništiti.',
'prefs-emailconfirm-label' => 'Potvrda e-mail adrese:',
'prefs-textboxsize' => 'VeliÄina prozora za ureÄ‘ivanje',
@@ -1359,9 +1370,15 @@ Možete omogućiti drugima da Vas kontaktiraju na suradniÄkoj stranici ili stra
'prefs-advancedrendering' => 'Napredne opcije',
'prefs-advancedsearchoptions' => 'Napredne opcije',
'prefs-advancedwatchlist' => 'Napredne opcije',
-'prefs-display' => 'Prikaži opcije',
+'prefs-displayrc' => 'Prikaži opcije',
+'prefs-displaysearchoptions' => 'Opcije prikaza',
+'prefs-displaywatchlist' => 'Opcije prikaza',
'prefs-diffs' => 'razl',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail adresa se pokazuje ispravnom',
+'email-address-validity-invalid' => 'Unesite valjanu e-mail adresu',
+
# User rights
'userrights' => 'Upravljanje suradniÄkim pravima',
'userrights-lookup-user' => 'Upravljaj suradniÄkim skupinama',
@@ -1445,6 +1462,7 @@ Možete omogućiti drugima da Vas kontaktiraju na suradniÄkoj stranici ili stra
'right-hideuser' => 'Blokiranje suradniÄkog imena, skrivajući ga od javnosti',
'right-ipblock-exempt' => 'Imunitet na IP blokiranje, auto-blok i blokiranje opsega',
'right-proxyunbannable' => 'Imunitet na automatska blokiranja posrednika (proxya)',
+'right-unblockself' => 'Odblokirati se',
'right-protect' => 'Mijenjanje razina zaštićivanja i uređivanje zaštićenih stranica',
'right-editprotected' => 'Uređivanje zaštićenih stranica (s prenosivom zaštitom)',
'right-editinterface' => 'UreÄ‘ivanje suradniÄkog suÄelja',
@@ -1467,7 +1485,6 @@ Možete omogućiti drugima da Vas kontaktiraju na suradniÄkoj stranici ili stra
'right-siteadmin' => 'ZakljuÄavanje i otkljuÄavanje baze podataka',
'right-reset-passwords' => "Poništi (''resetiraj'') lozinku drugog suradnika",
'right-override-export-depth' => 'Izvezi stranice ukljuÄujući i povezane stranice do dubine od 5',
-'right-versiondetail' => 'Prikaži informaciju o proÅ¡irenoj inaÄici softvera',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
# User rights log
@@ -1518,14 +1535,9 @@ Možete omogućiti drugima da Vas kontaktiraju na suradniÄkoj stranici ili stra
'recentchanges-legend' => 'Izbornik nedavnih promjena',
'recentchangestext' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
'recentchanges-feed-description' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
-'recentchanges-label-legend' => 'Kazalo: $1.',
-'recentchanges-legend-newpage' => '$1 - nova stranica',
'recentchanges-label-newpage' => 'Ova izmjena stvorila je novu stranicu',
-'recentchanges-legend-minor' => '$1 - manja izmjena',
'recentchanges-label-minor' => 'Ovo je manja izmjena',
-'recentchanges-legend-bot' => '$1 - izmjena bota',
'recentchanges-label-bot' => 'Ovu izmjenu napravio je bot',
-'recentchanges-legend-unpatrolled' => '$1 - nepregledana izmjena',
'recentchanges-label-unpatrolled' => 'Ova izmjena još nije pregledana',
'rcnote' => "{{PLURAL:$1|Slijedi zadnja '''$1''' promjena|Slijede zadnje '''$1''' promjene|Slijedi zadnjih '''$1''' promjena}} u {{PLURAL:$2|zadnjem '''$2''' danu|zadnja '''$2''' dana|zadnjih '''$2''' dana}}, od $5, $4.",
'rcnotefrom' => 'Slijede promjene od <b>$2</b> (prikazano ih je do <b>$1</b>).',
@@ -1571,6 +1583,9 @@ Možete omogućiti drugima da Vas kontaktiraju na suradniÄkoj stranici ili stra
'upload_directory_missing' => 'Mapa za datoteke ($1) nedostaje i webserver ju ne može napraviti.',
'upload_directory_read_only' => 'Server ne može pisati u direktorij za postavljanje ($1).',
'uploaderror' => 'Pogreška kod postavljanja',
+'upload-recreate-warning' => "'''Upozorenje: datoteka s tim imenom je izbrisana ili premještena.'''
+
+Evidencije brisanja i premještanja prikazane su ovdje:",
'uploadtext' => "Ovaj obrazac služi za postavljanje datoteka.
Za pregledavanje i pretraživanje već postavljenih datoteka vidi [[Special:FileList|popis postavljenih datoteka]], (ponovljena) postavljanja su također u [[Special:Log/upload|popisu postavljanja]], a brisanja u [[Special:Log/delete|popisu brisanja]].
@@ -1602,6 +1617,17 @@ Da biste na stranicu stavili datoteku, koristite poveznice tipa
'filetype-unwanted-type' => "'''\".\$1\"''' je neželjena vrsta datoteke. {{PLURAL:\$3|PreporuÄena vrsta je|PreporuÄene vrste su}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' je nedopuštena vrsta datoteke. {{PLURAL:\$3|Dopuštena vrsta je|Dopuštene vrste su}} \$2.",
'filetype-missing' => 'Datoteka nema nastavak koji određuje tip (poput ".jpg").',
+'empty-file' => 'Datoteka koju ste poslali je prazna.',
+'file-too-large' => 'Datoteka koju ste poslali bila je prevelika.',
+'filename-tooshort' => 'Ime datoteke je prekratko.',
+'filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'verification-error' => 'Ova datoteka nije prošla provjeru datoteke.',
+'hookaborted' => 'Izmjena koju ste pokušali napraviti prekinuta je od strane ekstenzije.',
+'illegal-filename' => 'Ime datoteke nije dopušteno.',
+'overwrite' => 'Postaviti preko postojeće datoteke nije dozvoljeno.',
+'unknown-error' => 'Nepoznata pogreška.',
+'tmp-create-error' => 'Ne mogu stvoriti privremenu datoteku.',
+'tmp-write-error' => 'Pogreška prilikom pisanja privremene datoteke.',
'large-file' => 'PreporuÄljivo je da datoteke ne prelaze $1; Ova datoteka je $2.',
'largefileserver' => 'VeliÄina ove datoteke veća je od one dopuÅ¡tene postavkama poslužitelja.',
'emptyfile' => 'Datoteka koju ste postavili je prazna. Možda se radi o krivo utipkanom imenu datoteke. Provjerite želite li zaista postaviti ovu datoteku.',
@@ -1627,13 +1653,14 @@ Ako i dalje želite postaviti svoju datoteku, molimo vratite se i odaberite novo
Ako još uvijek želite postaviti svoju datoteku, idite nazad i postavite ju pod drugim imenom. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ova datoteka je duplikat {{PLURAL:$1|sljedeće datoteke|sljedećih datoteka}}:',
'file-deleted-duplicate' => 'Datoteka istovjetna ovoj datoteci ([[:$1]]) prethodno je obrisana. Provjerite evidenciju brisanja za tu datoteke datoteku prije nego Å¡to nastavite s ponovnim postavljanjem.',
-'successfulupload' => 'Postavljanje uspješno.',
'uploadwarning' => 'Upozorenje kod postavljanja',
'uploadwarning-text' => 'Molimo izmijenite opis datoteke ispod i pokušajte kasnije.',
'savefile' => 'SaÄuvaj datoteku',
'uploadedimage' => 'postavljeno "$1"',
'overwroteimage' => 'postavljena nova inaÄica od "[[$1]]"',
'uploaddisabled' => 'Postavljanje je onemogućeno',
+'copyuploaddisabled' => 'Postavljanje URL-om onemogućeno.',
+'uploadfromurl-queued' => 'VaÅ¡e postavljanje je na Äekanju.',
'uploaddisabledtext' => 'Postavljanje datoteka je onemogućeno.',
'php-uploaddisabledtext' => 'Postavljanja datoteka su onemogućena u PHP-u. Molimo provjerite postavke za postavljanje datoteka.',
'uploadscripted' => 'Ova datoteka sadrži HTML ili skriptu, što može dovesti do grešaka u web pregledniku.',
@@ -1652,6 +1679,14 @@ Ako još uvijek želite postaviti svoju datoteku, idite nazad i postavite ju pod
Razmislite je li prigodno nastaviti s postavljanjem ove datoteke.
Slijedi evidencija brisanja ove datoteke s obrazloženjem prethodnog brisanja:",
'filename-bad-prefix' => "Ime datoteke koju snimate poÄinje s '''\"\$1\"''', Å¡to je ime koje slikama tipiÄno dodjeljuju digitalni fotoaparati. Molimo izaberite bolje ime (neko koje bolje opisuje sliku nego \$1).",
+'upload-success-subj' => 'Postavljanje uspješno.',
+'upload-success-msg' => 'Vaša datoteka iz [$2] je uspješno postavljena. Dostupna je ovdje: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Greška pri postavljanju',
+'upload-failure-msg' => 'Došlo je do problema s Vašim postavljanjem datoteke [$2]:
+
+$1',
+'upload-warning-subj' => 'Upozorenje kod postavljanja',
+'upload-warning-msg' => 'Došlo je do problema s Vašim postavljanjem datoteke iz [$2]. Možete se vratiti u [[Special:Upload/stash/$1|obrazac za postavljanje]] i ispraviti problem.',
'upload-proto-error' => 'Protokol nije valjan',
'upload-proto-error-text' => 'Udaljeno snimanje zahtijeva URL-ove koji poÄinju sa <code>http://</code> ili <code>ftp://</code>.',
@@ -1714,6 +1749,7 @@ Poredak datoteka mijenja se pritiskom na naslov stupca.',
'listfiles_search_for' => 'Traži ime slike:',
'imgfile' => 'datoteka',
'listfiles' => 'Popis slika',
+'listfiles_thumb' => 'Smanjeni pregled',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Naziv slike',
'listfiles_user' => 'Suradnik',
@@ -1825,8 +1861,8 @@ Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vo
'statistics-edits' => 'Broj uređivanja od nastanka projekta {{SITENAME}}',
'statistics-edits-average' => 'ProsjeÄan broj ureÄ‘ivanja po stranici',
'statistics-views-total' => 'Posjeta ukupno',
+'statistics-views-total-desc' => 'Posjeti nepostojećim i posebnim stranicama nisu ukljuÄeni',
'statistics-views-peredit' => 'Posjeta po uređivanju',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Red poslova]',
'statistics-users' => 'Prijavljeni [[Special:ListUsers|suradnici]]',
'statistics-users-active' => 'Aktivni suradnici',
'statistics-users-active-desc' => 'Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}',
@@ -1842,7 +1878,7 @@ Stranica se tretira kao razdvojbena stranica ako koristi predložak na kojega vo
'doubleredirectstext' => 'Ova stranica sadrži popis stranica koje preusmjeravju na druge stranice za preusmjeravanje.
Svaki redak sadrži poveznice na prvo i drugo preusmjeravanje, kao i odredište drugog preusmjeravanja
koja obiÄno ukazuje na "pravu" odrediÅ¡nu stranicu, na koju bi trebalo pokazivati prvo preusmjeravanje.
-<s>Precrtane</s> stavke su riješene.',
+<del>Precrtane</del> stavke su riješene.',
'double-redirect-fixed-move' => '[[$1]] je premješten, sada je preusmjeravanje na [[$2]]',
'double-redirect-fixer' => 'PopravljaÄ preusmjeravanja',
@@ -1865,6 +1901,8 @@ koja obiÄno ukazuje na "pravu" odrediÅ¡nu stranicu, na koju bi trebalo pokaziva
'nmembers' => '$1 {{PLURAL:$1|Älan|Älanova}}',
'nrevisions' => '$1 {{PLURAL:$1|inaÄica|inaÄice|inaÄica}}',
'nviews' => '$1 {{PLURAL:$1|put pogledano|puta pogledano|puta pogledano}}',
+'nimagelinks' => 'Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}',
+'ntransclusions' => 'koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}',
'specialpage-empty' => 'Nema rezultata za traženi izvještaj.',
'lonelypages' => 'Stranice siroÄad',
'lonelypagestext' => 'Sljedeće stranice nemaju poveznicu na druge stranice niti su ukljuÄene transkluzijom u druge stranice projekta {{SITENAME}}.',
@@ -2020,36 +2058,42 @@ Dodatne informacije o pojedinim pravim se mogu pronaći [[{{MediaWiki:Listgroupr
'listgrouprights-removegroup-self-all' => 'Uklonite sve skupine iz vlastitog raÄuna',
# E-mail user
-'mailnologin' => 'Nema adrese pošiljaoca',
-'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
+'mailnologin' => 'Nema adrese pošiljaoca',
+'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
i imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]
da bi mogli slati poštu drugim suradnicima.',
-'emailuser' => 'Pošalji e-poštu ovom suradniku',
-'emailpage' => 'Pošalji e-poštu suradniku',
-'emailpagetext' => 'Možete koristiti ovaj obrazac za slanje elektroniÄke poÅ¡te ovom suradniku.
+'emailuser' => 'Pošalji e-poštu ovom suradniku',
+'emailpage' => 'Pošalji e-poštu suradniku',
+'emailpagetext' => 'Možete koristiti ovaj obrazac za slanje elektroniÄke poÅ¡te ovom suradniku.
E-mail adresa iz Vaših [[Special:Preferences|postavki]] nalazit će se u "From" polju poruke i primatelj će Vam moći izravno odgovoriti.',
-'usermailererror' => 'Sustav pošte javio je pogrešku:',
-'defemailsubject' => '{{SITENAME}} elektroniÄka poÅ¡ta (e-mail)',
-'noemailtitle' => 'Nema adrese primaoca',
-'noemailtext' => 'Ovaj suradnik nije odredio valjanu e-mail adresu.',
-'nowikiemailtitle' => 'E-mail nije dozvoljen',
-'nowikiemailtext' => 'Ovaj suradnik je odluÄio ne primati e-mail od drugih suradnika.',
-'email-legend' => 'PoÅ¡alji elektroniÄku poÅ¡tu drugom suradniku projekta {{SITENAME}}',
-'emailfrom' => 'Od:',
-'emailto' => 'Za:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'Poruka:',
-'emailsend' => 'Pošalji',
-'emailccme' => 'Pošalji mi e-mailom kopiju moje poruke.',
-'emailccsubject' => 'Kopija Vaše poruke suradniku $1: $2',
-'emailsent' => 'E-mail poslan',
-'emailsenttext' => 'Vaša poruka je poslana.',
-'emailuserfooter' => 'Ovaj e-mail je poslan od $1 za $2 koriÅ¡tenjem "elektroniÄke poÅ¡te" s projekta {{SITENAME}}.',
+'usermailererror' => 'Sustav pošte javio je pogrešku:',
+'defemailsubject' => '{{SITENAME}} elektroniÄka poÅ¡ta (e-mail)',
+'usermaildisabled' => 'SuradniÄka e-poÅ¡ta je onemogućena',
+'usermaildisabledtext' => 'Ne možete slati e-poštu drugim suradnicima na ovom wikiju',
+'noemailtitle' => 'Nema adrese primaoca',
+'noemailtext' => 'Ovaj suradnik nije odredio valjanu e-mail adresu.',
+'nowikiemailtitle' => 'E-mail nije dozvoljen',
+'nowikiemailtext' => 'Ovaj suradnik je odluÄio ne primati e-mail od drugih suradnika.',
+'email-legend' => 'PoÅ¡alji elektroniÄku poÅ¡tu drugom suradniku projekta {{SITENAME}}',
+'emailfrom' => 'Od:',
+'emailto' => 'Za:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'Poruka:',
+'emailsend' => 'Pošalji',
+'emailccme' => 'Pošalji mi e-mailom kopiju moje poruke.',
+'emailccsubject' => 'Kopija Vaše poruke suradniku $1: $2',
+'emailsent' => 'E-mail poslan',
+'emailsenttext' => 'Vaša poruka je poslana.',
+'emailuserfooter' => 'Ovaj e-mail je poslan od $1 za $2 koriÅ¡tenjem "elektroniÄke poÅ¡te" s projekta {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Ostavljanje poruke sustava.',
+'usermessage-editor' => 'UreÄ‘ivaÄ sistemskih poruka',
# Watchlist
'watchlist' => 'Moj popis praćenja',
'mywatchlist' => 'Moj popis praćenja',
-'watchlistfor' => "(suradnika '''$1''')",
+'watchlistfor2' => 'Za $1 $2',
'nowatchlist' => 'Na VaÅ¡em popisu praćenja nema nijednog Älanka.',
'watchlistanontext' => 'Molimo Vas $1 kako biste mogli vidjeti ili uređivati Vaš popis praćenih stranica.',
'watchnologin' => 'Niste prijavljeni',
@@ -2166,7 +2210,10 @@ Posljednju promjenu napravio je [[User:$3|$3]] ([[User talk:$3|Razgovor]]{{int:p
'revertpage' => 'Uklonjena promjena suradnika $2, vraćeno na zadnju inaÄicu suradnika $1',
'revertpage-nouser' => 'Vraćene izmjene suradnika (suradniÄko ime uklonjeno) na posljednju inaÄicu suradnika [[User:$1|$1]]',
'rollback-success' => 'Uklonjeno ureÄ‘ivanje suradnika $1; vraćeno na zadnju inaÄicu suradnika $2.',
-'sessionfailure' => 'UoÄili smo problem s VaÅ¡om prijavom. Zadnja naredba nije izvrÅ¡ena kako bi se izbjegla zloupotreba. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovno je uÄitate i zatim pokuÅ¡ate opet.',
+
+# Edit tokens
+'sessionfailure-title' => 'Prekid sesije',
+'sessionfailure' => 'UoÄili smo problem s VaÅ¡om prijavom. Zadnja naredba nije izvrÅ¡ena kako bi se izbjegla zloupotreba. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovno je uÄitate i zatim pokuÅ¡ate opet.',
# Protect
'protectlogpage' => 'Evidencija zaštićivanja',
@@ -2295,18 +2342,22 @@ $1',
'month' => 'Od mjeseca (i ranije):',
'year' => 'Od godine (i ranije):',
-'sp-contributions-newbies' => 'Prikaži samo doprinose novih suradnika',
-'sp-contributions-newbies-sub' => 'Za nove suradnike',
-'sp-contributions-newbies-title' => 'Doprinosi novih suradnika',
-'sp-contributions-blocklog' => 'Evidencija blokiranja',
-'sp-contributions-deleted' => 'obrisani suradniÄki doprinosi',
-'sp-contributions-logs' => 'evidencije',
-'sp-contributions-talk' => 'razgovor',
-'sp-contributions-userrights' => 'upravljanje suradniÄkim pravima',
-'sp-contributions-blocked-notice' => 'Ovaj suradnik je trenutaÄno blokiran. Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
-'sp-contributions-search' => 'Pretraži doprinose',
-'sp-contributions-username' => 'IP adresa ili suradnik:',
-'sp-contributions-submit' => 'Traži',
+'sp-contributions-newbies' => 'Prikaži samo doprinose novih suradnika',
+'sp-contributions-newbies-sub' => 'Za nove suradnike',
+'sp-contributions-newbies-title' => 'Doprinosi novih suradnika',
+'sp-contributions-blocklog' => 'Evidencija blokiranja',
+'sp-contributions-deleted' => 'obrisani suradniÄki doprinosi',
+'sp-contributions-uploads' => "snimljene datoteke (''uploads'')",
+'sp-contributions-logs' => 'evidencije',
+'sp-contributions-talk' => 'razgovor',
+'sp-contributions-userrights' => 'upravljanje suradniÄkim pravima',
+'sp-contributions-blocked-notice' => 'Ovaj suradnik je trenutaÄno blokiran. Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
+'sp-contributions-blocked-notice-anon' => 'Ova IP adresa je trenutaÄno blokirana.
+Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
+'sp-contributions-search' => 'Pretraži doprinose',
+'sp-contributions-username' => 'IP adresa ili suradnik:',
+'sp-contributions-toponly' => 'Prikaži samo najnovije izmjene',
+'sp-contributions-submit' => 'Traži',
# What links here
'whatlinkshere' => 'Å to vodi ovamo',
@@ -2369,7 +2420,6 @@ Pogledaj [[Special:IPBlockList|popis blokiranih IP adresa]] za pregled.',
'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
'ipb-unblock-addr' => 'Odblokiraj $1',
'ipb-unblock' => 'Odblokiraj suradniÄko ime ili IP adresu',
-'ipb-blocklist-addr' => 'Postojeća blokiranja za $1',
'ipb-blocklist' => 'Vidi postojeća blokiranja',
'ipb-blocklist-contribs' => 'Doprinosi za $1',
'unblockip' => 'Deblokiraj suradnika',
@@ -2438,6 +2488,8 @@ $1 je već blokiran. Želite promijeniti postavke blokiranja?',
'sorbs_create_account_reason' => 'VaÅ¡a IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL. Ne možete otvoriti raÄun.',
'cant-block-while-blocked' => 'Ne možete blokirati druge suradnike dok ste blokirani.',
'cant-see-hidden-user' => 'Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.',
+'ipbblocked' => 'Ne možete blokirati ili odblokirati druge suradnike, jer ste blokirani',
+'ipbnounblockself' => 'Nije Vam dopušteno odblokirati se',
# Developer tools
'lockdb' => 'ZakljuÄaj bazu podataka',
@@ -2473,6 +2525,17 @@ To znaÄi: 1. ako pogrijeÅ¡ite, možete opet preimenovati stranicu na stari nasl
'''Upozorenje!'''
Ovo može biti drastiÄna i neoÄekivana promjena kad su u pitanju popularne stranice. Molimo dobro razmislite prije nego Å¡to preimenujete stranicu.",
+'movepagetext-noredirectfixer' => "Pomoću donjeg 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.
+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.
+
+'''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:'''
*premještate stranicu iz jednog prostora u drugi,
*pod novim imenom već postoji stranica za razgovor s nekim sadržajem, ili
@@ -2530,6 +2593,7 @@ OdrediÅ¡ni Älanak "[[:$1]]" već postoji. Želite li ga obrisati da biste napra
'immobile-source-page' => 'Ova stranica je se ne može premjestiti.',
'immobile-target-page' => 'Ne mogu premjestiti na željeni naslov.',
'imagenocrossnamespace' => 'Datoteka ne može biti premještena u imenski prostor koji nije za datoteke',
+'nonfile-cannot-move-to-file' => 'Ne mogu premjestiti nešto što nije datoteka u imenski prostor za datoteke',
'imagetypemismatch' => 'Ekstenzija nove datoteke se ne poklapa sa svojim tipom.',
'imageinvalidfilename' => 'Ciljano ime datoteke je nevaljano',
'fix-double-redirects' => 'Ažuriraj sva preusmjeravanja koja vode na originalni naslov',
@@ -2608,6 +2672,7 @@ Snimite je na svoje raÄunalo i postavite je ovdje.',
'importstart' => 'Uvozim stranice...',
'import-revision-count' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
'importnopages' => 'Nema stranica za uvoz.',
+'imported-log-entries' => '{{PLURAL:$1|Uvezen $1 unos u evidenciju|Uvezena $1 unosa u evidenciju|Uvezeno $1 unosa u evidenciju}}.',
'importfailed' => 'Uvoz nije uspio: $1',
'importunknownsource' => 'Nepoznat tip stranica za uvoz',
'importcantopen' => 'Ne mogu otvoriti datoteku za uvoz',
@@ -2700,6 +2765,8 @@ Snimite je na svoje raÄunalo i postavite je ovdje.',
'tooltip-upload' => "Pokreni snimanje (''upload'')",
'tooltip-rollback' => '"Ukloni" uklanja uređivanja zadnjeg suradnika na ovoj stranici.',
'tooltip-undo' => '"Ukloni ovu izmjenu" uklanja ovu izmjenu i otvara okvir za uređivanje. Omogućava unošenje razloga u sažetak.',
+'tooltip-preferences-save' => 'Spremi postavke',
+'tooltip-summary' => 'Unesite kratki sažetak',
# Stylesheets
'common.css' => '/** Uređivanje ove CSS datoteke će se odraziti na sve skinove */',
@@ -2810,14 +2877,17 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
'imagemaxsize' => "OgraniÄi veliÄinu slike:<br />''(za stranicu s opisom datoteke)''",
'thumbsize' => 'VeliÄina sliÄice (umanjene inaÄice slike):',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|stranica|stranice}}',
-'file-info' => '(veliÄina datoteke: $1, MIME tip: $2)',
-'file-info-size' => '($1 × $2 piksela, veliÄina datoteke: $3, MIME tip: $4)',
+'file-info' => 'veliÄina datoteke: $1, MIME tip: $2',
+'file-info-size' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME tip: $4',
'file-nohires' => '<small>Viša rezolucija nije dostupna.</small>',
-'svg-long-desc' => '(SVG datoteka, nominalno $1 × $2 piksela, veliÄina datoteke: $3)',
+'svg-long-desc' => 'SVG datoteka, nominalno $1 × $2 piksela, veliÄina datoteke: $3',
'show-big-image' => 'Vidi sliku u punoj veliÄini (rezoluciji)',
'show-big-image-thumb' => '<small>VeliÄina pretpregleda: $1 × $2 piksela</small>',
'file-info-gif-looped' => 'animacija se ponavlja',
'file-info-gif-frames' => '$1 {{PLURAL:$1|okvir|okvira}}',
+'file-info-png-looped' => 'animacija se ponavlja',
+'file-info-png-repeat' => 'prikazano $1 {{PLURAL:$1|puta|puta|puta}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|okvir|okvira}}',
# Special:NewFiles
'newimages' => 'Galerija novih datoteka',
@@ -2974,6 +3044,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
'exif-gpsareainformation' => 'Ime GPS podruÄja',
'exif-gpsdatestamp' => 'GPS datum',
'exif-gpsdifferential' => 'GPS diferencijalna korekcija',
+'exif-objectname' => 'Kratki naslov',
# EXIF attributes
'exif-compression-1' => 'Nesažeto',
@@ -3133,26 +3204,26 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
'limitall' => 'sve',
# E-mail address confirmation
-'confirmemail' => 'Potvrda e-mail adrese',
-'confirmemail_noemail' => 'Niste unijeli važeću e-mail adresu u VaÅ¡e [[Special:Preferences|suradniÄke postavke]].',
-'confirmemail_text' => 'U ovom wikiju morate prije korištenja e-mail naredbi potvrditi svoju e-mail adresu. Kliknite na gumb ispod kako biste poslali poruku s potvrdom na Vašu adresu. U poruci će biti poveznica koju morate otvoriti u svom web pregledniku i time potvrditi svoju e-mail adresu.',
-'confirmemail_pending' => 'Već Vam je e-mailom poslan potvrdni kôd;
+'confirmemail' => 'Potvrda e-mail adrese',
+'confirmemail_noemail' => 'Niste unijeli važeću e-mail adresu u VaÅ¡e [[Special:Preferences|suradniÄke postavke]].',
+'confirmemail_text' => 'U ovom wikiju morate prije korištenja e-mail naredbi potvrditi svoju e-mail adresu. Kliknite na gumb ispod kako biste poslali poruku s potvrdom na Vašu adresu. U poruci će biti poveznica koju morate otvoriti u svom web pregledniku i time potvrditi svoju e-mail adresu.',
+'confirmemail_pending' => 'Već Vam je e-mailom poslan potvrdni kôd;
ako ste upravo otvorili suradniÄki raÄun, molimo priÄekajte joÅ¡ nekoliko minuta da e-mail stigne prije nego Å¡to zatražite novi kôd.',
-'confirmemail_send' => 'Pošalji kôd za potvrdu e-mail adrese',
-'confirmemail_sent' => 'Poruka s potvrdom je poslana.',
-'confirmemail_oncreate' => 'Potvrdni kôd poslan je na Vašu e-mail adresu.
+'confirmemail_send' => 'Pošalji kôd za potvrdu e-mail adrese',
+'confirmemail_sent' => 'Poruka s potvrdom je poslana.',
+'confirmemail_oncreate' => 'Potvrdni kôd poslan je na Vašu e-mail adresu.
Ovaj kôd nije potreban za prijavljivanje, no bit će Vam potreban kako biste osposobili neke od postavki na Wikipediji koje ukljuÄuju elektroniÄku poÅ¡tu.',
-'confirmemail_sendfailed' => 'Projekt {{SITENAME}} nije uspio poslati Vaš potvrdni e-mail.
+'confirmemail_sendfailed' => 'Projekt {{SITENAME}} nije uspio poslati Vaš potvrdni e-mail.
Provjerite sadrži li adresa nedopuštene znakove.
Poruka o pogrešci e-mail poslužitelja: $1',
-'confirmemail_invalid' => 'Pogrešna potvrda. Kôd je možda istekao.',
-'confirmemail_needlogin' => 'Molimo $1 kako biste potvrdili Vašu e-mail adresu.',
-'confirmemail_success' => 'Vaša je e-mail adresa potvrđena. Možete se prijaviti i uživati u wikiju.',
-'confirmemail_loggedin' => 'Vaša je e-mail adresa potvrđena.',
-'confirmemail_error' => 'Došlo je do greške kod snimanja Vaše potvrde.',
-'confirmemail_subject' => '{{SITENAME}}: potvrda e-mail adrese',
-'confirmemail_body' => 'Netko, vjerojatno Vi, s IP adrese $1 je otvorio
+'confirmemail_invalid' => 'Pogrešna potvrda. Kôd je možda istekao.',
+'confirmemail_needlogin' => 'Molimo $1 kako biste potvrdili Vašu e-mail adresu.',
+'confirmemail_success' => 'Vaša je e-mail adresa potvrđena. Možete se prijaviti i uživati u wikiju.',
+'confirmemail_loggedin' => 'Vaša je e-mail adresa potvrđena.',
+'confirmemail_error' => 'Došlo je do greške kod snimanja Vaše potvrde.',
+'confirmemail_subject' => '{{SITENAME}}: potvrda e-mail adrese',
+'confirmemail_body' => 'Netko, vjerojatno Vi, s IP adrese $1 je otvorio
suradniÄki raÄun pod imenom "$2" s ovom e-mail adresom na {{SITENAME}}.
Kako biste potvrdili da je ovaj suradniÄki raÄun uistinu VaÅ¡ i
@@ -3166,8 +3237,36 @@ Ako to *niste* Vi, slijedite ovaj link za poništavanje potvrde:
$5
Valjanost ovog potvrdnog koda istjeÄe na $4.',
-'confirmemail_invalidated' => 'Potvrda E-mail adrese je otkazana',
-'invalidateemail' => 'PoniÅ¡ti potvrÄ‘ivanje elektroniÄke poÅ¡te',
+'confirmemail_body_changed' => 'Netko, vjerojatno Vi, s IP adrese $1,
+promijenio je adresu e-poÅ¡te suradniÄkog raÄuna "$2" u ovu adresu na {{SITENAME}}.
+
+Kako biste potvrdili da je ovaj suradniÄki raÄun uistinu VaÅ¡ te ukljuÄili
+mogućnosti e-pošte na {{SITENAME}}, otvorite u Vašem pregledniku sljedeću poveznicu:
+
+$3
+
+Ukoliko suradniÄki raÄun *ne* pripada Vama, slijedite ovu poveznicu
+za poništavanje potvrde adrese e-pošte:
+
+$5
+
+Valjanost ovog potvrdnog koda istjeÄe $4.',
+'confirmemail_body_set' => 'Netko, najvjerojatnije vi, s IP adrese $1,
+otvorio je suradniÄki raÄun pod imenom "$2" s ovom e-mail adresom na {{SITENAME}}.
+
+Kako biste potvrdili da je ovaj suradniÄki raÄun uistinu vaÅ¡ i ukljuÄili
+e-mail naredbe na {{SITENAME}}, otvorite u vašem pregledniku sljedeću poveznicu:
+
+$3
+
+Ako ovaj suradniÄki raÄun *ne* pripada vama, slijedite ovaj link
+kako biste poništili potvrdu e-mail adrese:
+
+$5
+
+Valjanost ovog potvrdnog koda istjeÄe u $4',
+'confirmemail_invalidated' => 'Potvrda E-mail adrese je otkazana',
+'invalidateemail' => 'PoniÅ¡ti potvrÄ‘ivanje elektroniÄke poÅ¡te',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki transkluzija iskljuÄena]',
@@ -3207,6 +3306,7 @@ Potvrdite namjeru vraćanja ovog Älanka.",
'table_pager_first' => 'Prva stranica',
'table_pager_last' => 'Zadnja stranica',
'table_pager_limit' => 'Prikaži $1 slika po stranici',
+'table_pager_limit_label' => 'Stavke po stranici:',
'table_pager_limit_submit' => 'Idi',
'table_pager_empty' => 'Nema rezultata',
@@ -3262,6 +3362,7 @@ Također možete koristiti [[Special:Watchlist/edit|standardni editor]].',
'version-specialpages' => 'Posebne stranice',
'version-parserhooks' => 'Kuke parsera',
'version-variables' => 'Varijable',
+'version-skins' => 'Izgledi',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'Rukovatelji medijima',
'version-hooks' => 'Kuke',
@@ -3273,6 +3374,13 @@ Također možete koristiti [[Special:Watchlist/edit|standardni editor]].',
'version-hook-subscribedby' => 'Pretplaćeno od',
'version-version' => '(InaÄica $1)',
'version-license' => 'Licencija',
+'version-poweredby-credits' => "Ovaj wiki pogoni '''[http://www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.",
+'version-poweredby-others' => 'ostali',
+'version-license-info' => 'MediaWiki je slobodni softver; možete ga distribuirati i/ili mijenjati pod uvjetima GNU opće javne licencije u obliku u kojem ju je objavila Free Software Foundation; bilo verzije 2 licencije, ili (Vama na izbor) bilo koje kasnije verzije.
+
+MediaWiki je distribuiran u nadi da će biti koristan, no BEZ IKAKVOG JAMSTVA; Äak i bez impliciranog jamstva MOGUĆNOSTI PRODAJE ili PRIKLADNOSTI ZA ODREÄENU NAMJENU. Pogledajte GNU opću javnu licenciju za viÅ¡e detalja.
+
+Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne licencije] uz ovaj program; ako ne, piÅ¡ite na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, ili je [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html proÄitajte online].',
'version-software' => 'Instalirani softver',
'version-software-product' => 'Proizvod',
'version-software-version' => 'Verzija',
@@ -3342,6 +3450,15 @@ Unesite ime datoteke bez prefiksa "{{ns:file}}:"',
'tags-edit' => 'uredi',
'tags-hitcount' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
+# Special:ComparePages
+'comparepages' => 'Usporedite stranice',
+'compare-selector' => 'Usporedite inaÄice stranice',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Izmjena 1',
+'compare-rev2' => 'Izmjena 2',
+'compare-submit' => 'Usporedite',
+
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
'dberr-problems' => 'IspriÄavamo se! Ova stranica ima tehniÄkih poteÅ¡koća.',
@@ -3358,8 +3475,13 @@ Unesite ime datoteke bez prefiksa "{{ns:file}}:"',
'htmlform-float-invalid' => 'Vrijednost koju ste naveli nije broj.',
'htmlform-int-toolow' => 'Vrijednost koju ste naveli je ispod minimuma od $1',
'htmlform-int-toohigh' => 'Vrijednost koju ste naveli je iznad maksimuma od $1',
+'htmlform-required' => 'Ova vrijednost je potrebna',
'htmlform-submit' => 'Pošalji',
'htmlform-reset' => 'Poništi izmjene',
'htmlform-selectorother-other' => 'Drugi',
+# SQLite database support
+'sqlite-has-fts' => '$1 s podrškom pretraživanja cijelog teksta',
+'sqlite-no-fts' => '$1 bez podrške pretraživanja cijelog teksta',
+
);
diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php
index 208fe192..13114943 100644
--- a/languages/messages/MessagesHsb.php
+++ b/languages/messages/MessagesHsb.php
@@ -42,59 +42,59 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dwójne daleposrědkowanja' ),
- 'BrokenRedirects' => array( 'Skóncowane daleposrědkowanja' ),
- 'Disambiguations' => array( 'Rozjasnjenja wjazmyslnosće' ),
+ 'DoubleRedirects' => array( 'Dwójne_daleposrědkowanja' ),
+ 'BrokenRedirects' => array( 'Skóncowane_daleposrědkowanja' ),
+ 'Disambiguations' => array( 'Rozjasnjenja_wjazmyslnosće' ),
'Userlogin' => array( 'Přizwjewić' ),
'Userlogout' => array( 'Wotzjewić' ),
- 'CreateAccount' => array( 'Konto wutworić' ),
+ 'CreateAccount' => array( 'Konto_wutworić' ),
'Preferences' => array( 'Nastajenja' ),
'Watchlist' => array( 'Wobkedźbowanki' ),
- 'Recentchanges' => array( 'Aktualne změny' ),
+ 'Recentchanges' => array( 'Aktualne_změny' ),
'Upload' => array( 'Nahraće' ),
'Listfiles' => array( 'Dataje' ),
- 'Newimages' => array( 'Nowe dataje' ),
+ 'Newimages' => array( 'Nowe_dataje' ),
'Listusers' => array( 'Wužiwarjo' ),
- 'Listgrouprights' => array( 'Skupinske prawa' ),
+ 'Listgrouprights' => array( 'Prawa_skupinow' ),
'Statistics' => array( 'Statistika' ),
- 'Randompage' => array( 'Připadna strona' ),
- 'Lonelypages' => array( 'Wosyroćene strony' ),
- 'Uncategorizedpages' => array( 'Njekategorizowane strony' ),
- 'Uncategorizedcategories' => array( 'Njekategorizowane kategorije' ),
- 'Uncategorizedimages' => array( 'Njekategorizowane dataje' ),
- 'Uncategorizedtemplates' => array( 'Njekategorizowane předłohi' ),
- 'Unusedcategories' => array( 'Njewužiwane kategorije' ),
- 'Unusedimages' => array( 'Njewužiwane dataje' ),
- 'Wantedpages' => array( 'Požadane strony' ),
- 'Wantedcategories' => array( 'Požadane kategorije' ),
- 'Wantedfiles' => array( 'Falowace dataje' ),
- 'Wantedtemplates' => array( 'Falowace předłohi' ),
- 'Mostlinked' => array( 'Z najwjace stronami zwjazane strony' ),
- 'Mostlinkedcategories' => array( 'Najhusćišo wužiwane kategorije' ),
- 'Mostlinkedtemplates' => array( 'Najhusćišo wužiwane předłohi' ),
- 'Mostimages' => array( 'Z najwjace stronami zwjazane dataje' ),
- 'Mostcategories' => array( 'Strony z najwjace kategorijemi' ),
- 'Mostrevisions' => array( 'Strony z najwjace wersijemi' ),
- 'Fewestrevisions' => array( 'Strony z najmjenje wersijemi' ),
- 'Shortpages' => array( 'Najkrótše strony' ),
- 'Longpages' => array( 'Najdlěše strony' ),
- 'Newpages' => array( 'Nowe strony' ),
- 'Ancientpages' => array( 'Najstarše strony' ),
- 'Deadendpages' => array( 'Strony bjez wotkazow' ),
- 'Protectedpages' => array( 'Å kitane strony' ),
- 'Protectedtitles' => array( 'Å kitane titule' ),
- 'Allpages' => array( 'WÅ¡Ä› strony' ),
+ 'Randompage' => array( 'Připadna_strona' ),
+ 'Lonelypages' => array( 'Wosyroćene_strony' ),
+ 'Uncategorizedpages' => array( 'Njekategorizowane_strony' ),
+ 'Uncategorizedcategories' => array( 'Njekategorizowane_kategorije' ),
+ 'Uncategorizedimages' => array( 'Njekategorizowane_dataje' ),
+ 'Uncategorizedtemplates' => array( 'Njekategorizowane_předłohi' ),
+ 'Unusedcategories' => array( 'Njewužiwane_kategorije' ),
+ 'Unusedimages' => array( 'Njewužiwane_dataje' ),
+ 'Wantedpages' => array( 'Požadane_strony' ),
+ 'Wantedcategories' => array( 'Požadane_kategorije' ),
+ 'Wantedfiles' => array( 'Falowace_dataje' ),
+ 'Wantedtemplates' => array( 'Falowace_předłohi' ),
+ 'Mostlinked' => array( 'Z_najwjace_stronami_zwjazane_strony' ),
+ 'Mostlinkedcategories' => array( 'Najhusćišo_wužiwane_kategorije' ),
+ 'Mostlinkedtemplates' => array( 'Najhusćišo_wužiwane_předłohi' ),
+ 'Mostimages' => array( 'Z_najwjace_stronami_zwjazane_dataje' ),
+ 'Mostcategories' => array( 'Strony_z_najwjace_kategorijemi' ),
+ 'Mostrevisions' => array( 'Strony_z_najwjace_wersijemi' ),
+ 'Fewestrevisions' => array( 'Strony_z_najmjenje_wersijemi' ),
+ 'Shortpages' => array( 'Najkrótše_strony' ),
+ 'Longpages' => array( 'Najdlěše_strony' ),
+ 'Newpages' => array( 'Nowe_strony' ),
+ 'Ancientpages' => array( 'Najstarše_strony' ),
+ 'Deadendpages' => array( 'Strony_bjez_wotkazow' ),
+ 'Protectedpages' => array( 'Å kitane_strony' ),
+ 'Protectedtitles' => array( 'Å kitane_titule' ),
+ 'Allpages' => array( 'Wšě_strony' ),
'Prefixindex' => array( 'Prefiksindeks' ),
- 'Ipblocklist' => array( 'Blokowane IP-adresy' ),
- 'Specialpages' => array( 'Specialne strony' ),
+ 'Ipblocklist' => array( 'Blokowane_IP-adresy' ),
+ 'Specialpages' => array( 'Specialne_strony' ),
'Contributions' => array( 'Přinoški' ),
'Emailuser' => array( 'E-Mejl' ),
- 'Confirmemail' => array( 'E-Mejl potwjerdźić' ),
- 'Whatlinkshere' => array( 'Lisćina wotkazow' ),
- 'Recentchangeslinked' => array( 'Změny zwjazanych stronow' ),
+ 'Confirmemail' => array( 'E-Mejl_potwjerdźić' ),
+ 'Whatlinkshere' => array( 'Lisćina_wotkazow' ),
+ 'Recentchangeslinked' => array( 'Změny_zwjazanych_stronow' ),
'Movepage' => array( 'Přesunyć' ),
- 'Blockme' => array( 'Blokowanje proksijow' ),
- 'Booksources' => array( 'Pytanje po ISBN' ),
+ 'Blockme' => array( 'Blokowanje_proksijow' ),
+ 'Booksources' => array( 'Pytanje_po_ISBN' ),
'Categories' => array( 'Kategorije' ),
'Export' => array( 'Eksport' ),
'Version' => array( 'Wersija' ),
@@ -103,32 +103,33 @@ $specialPageAliases = array(
'Blockip' => array( 'Blokować' ),
'Undelete' => array( 'Wobnowić' ),
'Import' => array( 'Importować' ),
- 'Lockdb' => array( 'Datowu banku zamknyć' ),
- 'Unlockdb' => array( 'Datowu banku wotamknyć' ),
+ 'Lockdb' => array( 'Datowu_banku_zamknyć' ),
+ 'Unlockdb' => array( 'Datowu_banku_wotamknyć' ),
'Userrights' => array( 'Prawa' ),
- 'MIMEsearch' => array( 'Pytanje po MIME' ),
- 'FileDuplicateSearch' => array( 'Duplikatowe pytanje' ),
- 'Unwatchedpages' => array( 'Njewobkedźbowane strony' ),
+ 'MIMEsearch' => array( 'Pytanje_po_MIME' ),
+ 'FileDuplicateSearch' => array( 'Duplikatowe_pytanje' ),
+ 'Unwatchedpages' => array( 'Njewobkedźbowane_strony' ),
'Listredirects' => array( 'Daleposrědkowanja' ),
- 'Revisiondelete' => array( 'Wušmórnjenje wersijow' ),
- 'Unusedtemplates' => array( 'Njewužiwane předłohi' ),
- 'Randomredirect' => array( 'Připadne daleposrědkowanje' ),
- 'Mypage' => array( 'Moja wužiwarska strona' ),
- 'Mytalk' => array( 'Moja diskusijna strona' ),
- 'Mycontributions' => array( 'Moje přinoški' ),
+ 'Revisiondelete' => array( 'Wušmórnjenje_wersijow' ),
+ 'Unusedtemplates' => array( 'Njewužiwane_předłohi' ),
+ 'Randomredirect' => array( 'Připadne_daleposrědkowanje' ),
+ 'Mypage' => array( 'Moja_wužiwarska_strona' ),
+ 'Mytalk' => array( 'Moja_diskusijna_strona' ),
+ 'Mycontributions' => array( 'Moje_přinoški' ),
'Listadmins' => array( 'Administratorojo' ),
'Listbots' => array( 'Boćiki' ),
- 'Popularpages' => array( 'Najwoblubowaniše strony' ),
+ 'Popularpages' => array( 'Najwoblubowaniše_strony' ),
'Search' => array( 'Pytać' ),
- 'Resetpass' => array( 'Hesło wróćo stajić' ),
- 'Withoutinterwiki' => array( 'Falowace mjezyrÄ›Äne wotkazy' ),
- 'MergeHistory' => array( 'Stawizny zjednoćić' ),
- 'Filepath' => array( 'Datajowy puć' ),
- 'Invalidateemail' => array( 'Njepłaćiwa e-mejl' ),
- 'Blankpage' => array( 'Prózdna strona' ),
- 'LinkSearch' => array( 'Wotkazowe pytanje' ),
- 'DeletedContributions' => array( 'ZniÄene pÅ™inoÅ¡ki' ),
+ 'Resetpass' => array( 'Hesło_wróćo_stajić' ),
+ 'Withoutinterwiki' => array( 'Falowace_mjezyrÄ›Äne_wotkazy' ),
+ 'MergeHistory' => array( 'Stawizny_zjednoćić' ),
+ 'Filepath' => array( 'Datajowy_puć' ),
+ 'Invalidateemail' => array( 'Njepłaćiwa_e-mejl' ),
+ 'Blankpage' => array( 'Prózdna_strona' ),
+ 'LinkSearch' => array( 'Wotkazowe_pytanje' ),
+ 'DeletedContributions' => array( 'ZniÄene_pÅ™inoÅ¡ki' ),
'Tags' => array( 'TafliÄki' ),
+ 'Activeusers' => array( 'Aktiwni_wužiwarjo' ),
);
$messages = array(
@@ -147,8 +148,7 @@ $messages = array(
'tog-editsection' => 'Wobdźěłowanje jednotliwych wotrězkow přez wotkazy [wobdźěłać] zmóžnić',
'tog-editsectiononrightclick' => 'Wobdźěłowanje jednotliwych wotrězkow přez kliknjenje z prawej tastu<br />na nadpisma wotrězkow zmóžnić (JavaScript)',
'tog-showtoc' => 'Zapis wobsaha pokazać (za strony z wjace haÄ 3 nadpismami)',
-'tog-rememberpassword' => 'HesÅ‚o na tutym liÄaku skÅ‚adować',
-'tog-editwidth' => 'Wobdźěłowanske polo wušěrić, zo by so cyła wobrazowka pjelniła',
+'tog-rememberpassword' => 'Přizjewjenje na tutym wobhladowaku sej spomjatkować (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
'tog-watchcreations' => 'Strony, kotrež wutworjam, swojim wobkedźbowankam přidać',
'tog-watchdefault' => 'Strony, kotrež wobdźěłuju, swojim wobkedźbowankam přidać',
'tog-watchmoves' => 'Sam přesunjene strony wobkedźbowankam přidać',
@@ -294,31 +294,21 @@ $messages = array(
'faqpage' => 'Project:Husto stajene prašenja (FAQ)',
# Vector skin
-'vector-action-addsection' => 'Temu přidać',
-'vector-action-delete' => 'wušmórnyć',
-'vector-action-move' => 'přesunyć',
-'vector-action-protect' => 'škitać',
-'vector-action-undelete' => 'Wobnowić',
-'vector-action-unprotect' => 'Škit wotstronić',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Strona pomocy',
-'vector-namespace-image' => 'Dataja',
-'vector-namespace-main' => 'Strona',
-'vector-namespace-media' => 'Medijowa strona',
-'vector-namespace-mediawiki' => 'Powěsć',
-'vector-namespace-project' => 'Projektowa strona',
-'vector-namespace-special' => 'Specialna strona',
-'vector-namespace-talk' => 'Diskusija',
-'vector-namespace-template' => 'Předłoha',
-'vector-namespace-user' => 'Wužiwarska strona',
-'vector-view-create' => 'Wutworić',
-'vector-view-edit' => 'Wobdźěłać',
-'vector-view-history' => 'Stawizny',
-'vector-view-view' => 'Čitać',
-'vector-view-viewsource' => 'Žórło sej wobhladać',
-'actions' => 'Akcije',
-'namespaces' => 'Mjenowe rumy',
-'variants' => 'Warianty',
+'vector-action-addsection' => 'Temu přidać',
+'vector-action-delete' => 'wušmórnyć',
+'vector-action-move' => 'přesunyć',
+'vector-action-protect' => 'škitać',
+'vector-action-undelete' => 'Wobnowić',
+'vector-action-unprotect' => 'Škit wotstronić',
+'vector-simplesearch-preference' => 'Polěpšene pytanske namjety zmóžnić (jenož šat Vector)',
+'vector-view-create' => 'Wutworić',
+'vector-view-edit' => 'Wobdźěłać',
+'vector-view-history' => 'Stawizny',
+'vector-view-view' => 'Čitać',
+'vector-view-viewsource' => 'Žórło sej wobhladać',
+'actions' => 'Akcije',
+'namespaces' => 'Mjenowe rumy',
+'variants' => 'Warianty',
'errorpagetitle' => 'Zmylk',
'returnto' => 'Wróćo k stronje $1.',
@@ -379,6 +369,9 @@ Přewjele wužiwarjow pospytuje sej tutu stronu wobhladać.
ProÅ¡u woÄakÅ„ chwilku, prjedy haÄ pospytujeÅ¡ sej tutu stronu hišće raz wobhladać.
$1',
+'pool-timeout' => 'Timeout, doniž zawrjenje skónÄene njeje.',
+'pool-queuefull' => 'Poolowa Äakanska rynka je poÅ‚na',
+'pool-errorunknown' => 'Njeznaty zmylk:',
# 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' => 'Wo {{GRAMMAR:lokatiw|{{SITENAME}}}}',
@@ -542,7 +535,8 @@ Twoje konto bu wutworjene. Njezabudź swoje nastajenja za [[Special:Preferences|
'yourname' => 'Wužiwarske mjeno',
'yourpassword' => 'Hesło:',
'yourpasswordagain' => 'Hesło znowa zapodać',
-'remembermypassword' => 'HesÅ‚o na tutym liÄaku sej spomjatkować',
+'remembermypassword' => 'Na tutym liÄaku pÅ™izjewjeny wostać (za maksimalnje $1 {{PLURAL:$1|dźeÅ„|dnjej|dny|dnjow}})',
+'securelogin-stick-https' => 'Po přizjewjenju z HTTPS zwjazany wostać',
'yourdomainname' => 'Twoja domejna',
'externaldberror' => 'Běše pak eksterny zmylk awtentifikacije datoweje banki, pak njesměš swoje eksterne konto aktualizować.',
'login' => 'Přizjewić',
@@ -559,6 +553,7 @@ Twoje konto bu wutworjene. Njezabudź swoje nastajenja za [[Special:Preferences|
'gotaccount' => "Maš hižo wužiwarske konto? '''$1'''.",
'gotaccountlink' => 'Přizjewić',
'createaccountmail' => 'z mejlku',
+'createaccountreason' => 'PÅ™iÄina:',
'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa. Wubjer druhe mjeno.',
'loginerror' => 'Zmylk při přizjewjenju',
@@ -578,6 +573,7 @@ Přepruwuj swój prawopis abo [[Special:UserLogin/signup|wutwor nowe konto]].',
'wrongpasswordempty' => 'Hesło, kotrež sy zapodał, běše prózdne. Prošu spytaj hišće raz.',
'passwordtooshort' => 'Hesła dyrbja znajmjeńša {{PLURAL:$1|1 znamješko|$1 znamješce|$1 znamješka|$1 znamješkow}} měć.',
'password-name-match' => 'Twoje hesło dyrbi so wot twojeho wužiwarskeho mjena rozeznać.',
+'password-login-forbidden' => 'Wužiwanje tutoho wužiwarskeho mjena a heska je zakazane.',
'mailmypassword' => 'Nowe hesło e-mejlować',
'passwordremindertitle' => 'Skedźbnjenje na hesło z {{GRAMMAR:genitiw|{{SITENAME}}}}',
'passwordremindertext' => 'Něchtó z IP-adresu $1 (najskerje ty) je wo nowe hesło za přizjewjenje za {{GRAMMAR:akuzatiw|{{SITENAME}}}} ($4) prosył. Nachwilne hesło za wužiwarja "$2" je so wutworiło a je nětko "$3". Jeli je to twój wotpohlad było dyrbiš so nětko přizjewić a nowe hesło wubrać. Twoje nachwilne hesło spadnje za {{PLURAL:$5|jeden dźeń|$5 dnjej|$5 dny|$5 dnjow}}.
@@ -609,6 +605,9 @@ MóžeÅ¡ tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiÅ
'loginlanguagelabel' => 'RÄ›Ä: $1',
'suspicious-userlogout' => 'Twoje naprašowanje za wotzjewjenje bu wotpokazane, dokelž zda so, jako by so přez wobškodźeny wobhladowak abo pufrowacy proksy pósłało',
+# E-mail sending
+'php-mail-error-unknown' => 'Njeznaty zmylk w PHP-funkciji mail()',
+
# Password reset dialog
'resetpass' => 'Hesło změnić',
'resetpass_announce' => 'Sy so z nachwilnym e-mejlowanym hesÅ‚om pÅ™izjewiÅ‚. Zo by pÅ™izjewjenje zakónÄiÅ‚, dyrbiÅ¡ nÄ›tko nowe hesÅ‚o postajić.',
@@ -660,9 +659,10 @@ Snano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło poža
'showlivepreview' => 'Hnydomny přehlad',
'showdiff' => 'Změny pokazać',
'anoneditwarning' => '<b>Kedźbu:</b> Njejsy přizjewjeny. Změny so z twojej IP-adresu składuja.',
+'anonpreviewwarning' => "''Njejsy přizjewjeny. Składowanje přenošuje twoju IP-adresu do wobdźěłowanskeje historije tuteje strony.''",
'missingsummary' => '<b>Kedźbu:</b> Njejsy žane zjeće zapodał. Jeli hišće raz na „Składować†kliknješ so twoje změny bjez komentara składuja.',
'missingcommenttext' => 'Prošu zapodaj zjeće.',
-'missingcommentheader' => '<b>Kedźbu:</b> Njejsy nadpis za tutón komentar podał. Jeli na „Składować†kliknješ, składuje so twoja změna bjez nadpisa.',
+'missingcommentheader' => "'''Kedźbu:''' Njejsy temu/nadpis za tutón komentar podał. Jeli na „{{int:savearticle}}†kliknješ, składuje so twoja změna bjez temy/nadpisa.",
'summary-preview' => 'Přehlad zjeća:',
'subject-preview' => 'Přehlad temy:',
'blockedtitle' => 'Wužiwar je zablokowany',
@@ -725,7 +725,11 @@ Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach
'userjspreview' => "== Přehlad twojeho wosobinskeho JavaScript ==
'''Kedźbu:''' Po składowanju dyrbiš pufrowak swojeho wobhladowaka wuprózdnić '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
-'userinvalidcssjstitle' => "'''Warnowanje:''' Skin z mjenom „$1†njeeksistuje. Prošu mysli na to, zo wosobinske strony .css a .js titul z małym pismikom wuwziwaja, na př. {{ns:user}}:Foo/monobook.css město {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Wobkedźbujće, zo sej jenož přehlad tutoho CSS wobhladuješ.'''
+'''Wón hišće składowany njeje!'''",
+'sitejspreview' => "'''Wobkedźbujće, zo sej jenož přehlad tutoho JavaScriptoweho koda wobhladuješ.'''
+'''Wón hišće składowany njeje!'''",
+'userinvalidcssjstitle' => "'''Warnowanje:''' Skin z mjenom „$1†njeeksistuje. Prošu mysli na to, zo wosobinske strony .css a .js titul z małym pismikom wuwziwaja, na př. {{ns:user}}:Foo/vector.css město {{ns:user}}:Foo/Vector.css.",
'updated' => '(Zaktualizowany)',
'note' => "'''Kedźbu:'''",
'previewnote' => "'''Kedźbu, to je jenož přehlad, změny hišće składowane njejsu!'''",
@@ -761,7 +765,6 @@ Kopěrowanje tekstow, kiž su přez awtorske prawa škitane, je zakazane! '''NJE
Lubiš nam tež, zo sy jón sam napisał abo ze zjawneje domejny abo z podobneho swobodneho žórła kopěrował (hlej $1 za podrobnosće).
'''NJESKÅADUJ PŘINOÅ KI Z COPYRIGHTOM BJEZ DOWOLNOSĆE!'''",
-'longpagewarning' => "'''KEDŹBU: Strona wobsahuje $1 kB; někotre wobhladowaki maja problemy, strony wobdźěłać, kotrež wobsahuja 32 kB abo wjace. Prošu přemysli sej stronu do mjeńšich wotrězkow rozrjadować.'''",
'longpageerror' => "'''ZMYLK: Tekst, kotryž sy spytał składować wobsahuje $1 kB, maksimalna wulkosć pak je $2 kB. Njehodźi so składować.'''",
'readonlywarning' => "'''KEDŹBU: Datowa banka bu wothladanja dla zawrjena, tohodla njemóžeš swoje změny nětko składować. Móžeš tekst do tekstoweje dataje přesunyć a jón za pozdźišo składować.'''
@@ -932,6 +935,8 @@ $1",
'logdelete-failure' => "'''Protokolowa widźomnosć njeda so nastajić:'''
$1",
'revdel-restore' => 'Widźomnosć změnić',
+'revdel-restore-deleted' => 'zhašane wersije',
+'revdel-restore-visible' => 'widźomne wersije',
'pagehist' => 'Stawizny strony',
'deletedhist' => 'Wušmórnjene stawizny',
'revdelete-content' => 'wobsah',
@@ -998,11 +1003,13 @@ Zawěsć, zo tuta změna stawiznisku kontinuitu strony wobchowuje.',
# Diffs
'history-title' => 'Stawizny wersijow strony „$1“',
'difference' => '(rozdźěl mjez wersijomaj)',
+'difference-multipage' => '(Rozdźěl mjez stronami)',
'lineno' => 'Rjadka $1:',
'compareselectedversions' => 'Wubranej wersiji přirunać',
'showhideselectedversions' => 'Wubrane wersije pokazać/schować',
'editundo' => 'cofnyć',
-'diff-multi' => '<small>(Přirunanje wersijow zapřija {{PLURAL:$1|jednu mjez nimaj ležacu wersiju|dwě mjez nimaj ležacej wersiji|$1 mjez nimaj ležace wersije|$1 mjez nimaj ležacych wersijow}}.)</small>',
+'diff-multi' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot {{PLURAL:$2|jednoho wužiwarja|$2 wužiwarjow|$2 wužiwarjow|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot wjace haÄ {{PLURAL:$2|jednoho wužiwarja|$2 wužiwarjow|$2 wužiwarjow|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
# Search results
'searchresults' => 'Pytanske wuslědki',
@@ -1037,6 +1044,7 @@ Zawěsć, zo tuta změna stawiznisku kontinuitu strony wobchowuje.',
'searchprofile-everything-tooltip' => 'Cyły wobsah přepytać (inkluziwnje diskusijne strony)',
'searchprofile-advanced-tooltip' => 'W swójskich mjenowych rumach pytać',
'search-result-size' => '$1 ({{PLURAL:$2|1 słowo|$2 słowje|$2 słowa|$2 słowow}})',
+'search-result-category-size' => '{{PLURAL:$1|1 ÄÅ‚on|$1 ÄÅ‚onaj|$1 ÄÅ‚onojo|$1 ÄÅ‚onow}} ({{PLURAL:$2|1 podkategorija|$2 podkategoriji|$2 podkategorije|$2 podkategorijow}}, {{PLURAL:$3|1 dataja|$3 dataji|$3 dataje|$3 datajow}})',
'search-result-score' => 'Relewanca: $1 %',
'search-redirect' => '(Daleposrědkowanje $1)',
'search-section' => '(wotrězk $1)',
@@ -1112,6 +1120,7 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
'contextlines' => 'Rjadki na wuslědk:',
'contextchars' => 'Kontekst na rjadku:',
'stub-threshold' => 'Wotkazowe formatowanje <a href="#" class="stub">małych stronow</a> (w bajtach):',
+'stub-threshold-disabled' => 'Znjemóžnjeny',
'recentchangesdays' => 'LiÄba dnjow w lisćinje aktualnych zmÄ›now:',
'recentchangesdays-max' => '(Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
'recentchangescount' => 'LiÄba stronow, kotraž ma so po standardźe pokazać:',
@@ -1145,6 +1154,7 @@ Tu je připadnje wupłodźena hódnota, kotruž móžeš wužiwać: $1',
'prefs-files' => 'Dataje',
'prefs-custom-css' => 'Swójski CSS',
'prefs-custom-js' => 'Swójski JS',
+'prefs-common-css-js' => 'Zhromadny CSS/JS za w32 Å¡aty:',
'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults. This cannot be undone.
Móžeš tutu stronu wužiwać, zo by swoje nastajenja na standardne hódnoty sydła wróćo stajić. To njeda so anulować.',
'prefs-emailconfirm-label' => 'E-mejlowe wobkrućenje:',
@@ -1181,9 +1191,15 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'prefs-advancedrendering' => 'Rozšěrjene opcije',
'prefs-advancedsearchoptions' => 'Rozšěrjene opcije',
'prefs-advancedwatchlist' => 'Rozšěrjene opcije',
-'prefs-display' => 'Opcije sej wobhladać',
+'prefs-displayrc' => 'Zwobraznjenske opcije',
+'prefs-displaysearchoptions' => 'Zwobraznjenske opcije',
+'prefs-displaywatchlist' => 'Zwobraznjenske opcije',
'prefs-diffs' => 'Rozdźěle',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Zda so, zo e-mejlowa adresa je płaćiwa',
+'email-address-validity-invalid' => 'Zapodaj płaćiwu e-mejlowu adresu',
+
# User rights
'userrights' => 'Zrjadowanje wužiwarskich prawow',
'userrights-lookup-user' => 'Wužiwarske skupiny zrjadować',
@@ -1267,6 +1283,7 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'right-hideuser' => 'Wužiwarske mjeno blokować a schować',
'right-ipblock-exempt' => 'Blokowanja IP, awtomatiske blokowanje a blokowanja wobwodow wobeńć',
'right-proxyunbannable' => 'Automatiske blokowanja proksyjow wobeńć',
+'right-unblockself' => 'Swójske blokowanje zběhnyć',
'right-protect' => 'Škitowe schodźenki změnić a škitanu stronu wobdźěłać',
'right-editprotected' => 'Škitane strony wobdźěłać (bjez kaskadoweho škita)',
'right-editinterface' => 'Wužiwarski powjerch wobdźěłać',
@@ -1289,7 +1306,6 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'right-siteadmin' => 'Datowu banku zawrěć a wotewrěć',
'right-reset-passwords' => 'Hesła druhich wužiwarjow wróćo stajić',
'right-override-export-depth' => 'Strony inkluziwnje wotkazanych stronow haÄ do hÅ‚ubokosće 5 eksportować',
-'right-versiondetail' => 'Nadrobne informacije wo wersiji softwary pokazać',
'right-sendemail' => 'Druhim wužiwarjam e-mejl pósłać',
# User rights log
@@ -1340,14 +1356,9 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'recentchanges-legend' => 'Opcije aktualnych změnow',
'recentchangestext' => 'Na tutej stronje móžeš najaktualniše změny w {{GRAMMAR:lokatiw|{{SITENAME}}}} wobkedźbować.',
'recentchanges-feed-description' => 'Slěduj najaktualniše změny {{GRAMMAR:genitiw|{{SITENAME}}}} w tutym kanalu.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nowa strona',
'recentchanges-label-newpage' => 'Tuta změna je nowu stronu wutworiła',
-'recentchanges-legend-minor' => '$1 - snadna změna',
'recentchanges-label-minor' => 'To je snadna změna',
-'recentchanges-legend-bot' => '$1 - změna boćika',
'recentchanges-label-bot' => 'Tuta změna bu přez roboćik přewjedźena',
-'recentchanges-legend-unpatrolled' => '$1 - njepřepruwowana změna',
'recentchanges-label-unpatrolled' => 'Tuta změnu hišće njebu přepruwowana',
'rcnote' => "Deleka {{PLURAL:\$1|je '''1''' změna|stej poslednjej '''\$1''' změnje|su poslednje '''\$1''' změny|je poslednich '''\$1''' změnow}} za {{PLURAL:\$2|posledny dźeń|poslednjej '''\$2''' dnjej|poslednje '''\$2''' dny|poslednich '''\$2''' dnjow}}, staw wot \$4, \$5.
<div id=\"rc-legend\" style=\"float:right;font-size:84%;margin-left:5px;\"> <b>Legenda</b><br />
@@ -1397,6 +1408,9 @@ Strony na [[Special:Watchlist|wobkedźbowankach]] su '''tuÄne'''.",
'upload_directory_missing' => 'Zapis nahraćow ($1) faluje a njeda so přez webserwer wutworić.',
'upload_directory_read_only' => 'Nahrawanski zapis ($1) njehodźi so přez webserwer popisować.',
'uploaderror' => 'Zmylk při nahrawanju',
+'upload-recreate-warning' => "'''Warnowanje: Dataja z tym mjenom je so zhašała abo přesunyła.'''
+
+Protokolej zhašenjow a přesunjenjow za tutu stronu stej tu k dobroćiwemu wužiwanju podatej:",
'uploadtext' => "Wužij slědowacy formular, zo by nowe dataje nahrał.
Zo by prjedy nahrate dataje wobhladał abo pytał dźi k [[Special:FileList|lisćinje nahratych datajow]], nahraća so tež w [[Special:Log/upload|protokolu nahraćow]], wušmórnjenja [[Special:Log/delete|protokolu wušmornjenjow]] protokoluja.
@@ -1431,6 +1445,17 @@ Hlej [[Special:NewFiles|galeriju nowych datajow]] za wizuelny přehlad.',
'filetype-banned-type' => "'''\".\$1\"''' njeje dowoleny datajowy typ.
{{PLURAL:\$3|Dowoleny datajowy typ je|Dowolenej datajowej typaj stej|Dowolene datajowe typy su|Dowolene datajowe typy su}} \$2.",
'filetype-missing' => 'Dataja nima kóncowku (na přikład „.jpg“).',
+'empty-file' => 'Dataja, kotruž sy wotpósłał, bě prózdna.',
+'file-too-large' => 'Dataja, kotruž sy wotpósłał, bě přewulka.',
+'filename-tooshort' => 'Datajowe mjeno je překrótke.',
+'filetype-banned' => 'Tutón datajowy typ je zatamany.',
+'verification-error' => 'Tuta dataja žane datajowe přepruwowanje njepřeběhny.',
+'hookaborted' => 'Změna, kotruž pospytowaše přewjesć, bu přez rozšěrjensku hoku přetorhnjena.',
+'illegal-filename' => 'Datajowe mjeno njeje dowolene.',
+'overwrite' => 'Přepisowanje eksistowaceje dataje njeje dowolene.',
+'unknown-error' => 'Njeznaty zmylk je wustupił.',
+'tmp-create-error' => 'Temporerna dataja njeda so wutworić.',
+'tmp-write-error' => 'Zmylk při pisanju temporerneje dataje.',
'large-file' => 'DoporuÄa so, zo dataje wjetÅ¡e haÄ $1 njejsu; tuta dataja ma $2.',
'largefileserver' => 'Dataja je wjetÅ¡a haÄ serwer dowoluje.',
'emptyfile' => 'Dataja, kotruž sy nahraÅ‚, zda so prózdna być. Z pÅ™iÄinu móhÅ‚ pisanski zmylk w mjenje dataje być. ProÅ¡u pruwuj haÄ chceÅ¡ ju woprawdźe nahrać.',
@@ -1456,13 +1481,14 @@ Jeli maš tutón wobraz z połnym rozeznaćom, nahraj tutón, hewak změń proš
'fileexists-shared-forbidden' => 'Dataja z tutym mjenom hižo eksistuje w zhromadnej chowarni. Jeli hišće chceš swoju dataju nahrać, dźi prošu wróćo a wužij nowe mjeno. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Tuta dataja je duplikat {{PLURAL:$1|slědowaceje dataje|slědowaceju datajow|slědowacych datajow|slědowacych datajow}}:',
'file-deleted-duplicate' => 'Dataja, kotraž je identiska z tutej dataju ([[:$1]]), je so prjedy zniÄiÅ‚a. Ty měł stawizny zniÄenja tuteje dataje pÅ™epruwować, prjedy pokroÄujeÅ¡ z jeje zasonahrawanjom.',
-'successfulupload' => 'Dataja bu wuspěšnje nahrata',
'uploadwarning' => 'Warnowanje',
'uploadwarning-text' => 'Prošu změń slědowace datajowe wopisanje a spytaj hišće raz.',
'savefile' => 'Dataju składować',
'uploadedimage' => 'je dataju „[[$1]]†nahrał',
'overwroteimage' => 'je nowu wersiju dataje „[[$1]]“ nahrał',
'uploaddisabled' => 'Wodaj, nahraće je znjemóžnjene.',
+'copyuploaddisabled' => 'Nahraće přez URL znjemóžnjene.',
+'uploadfromurl-queued' => 'Twoje nahraće je nÄ›tko w Äakanskim rynku.',
'uploaddisabledtext' => 'Nahraće datajow je znjemóžnjene.',
'php-uploaddisabledtext' => 'Nahraća PHP-datajow su znjemóžnjene. Prošu skontroluj nastajenje file_uploads.',
'uploadscripted' => 'Dataja wobsahuje HTML- abo skriptowy kod, kotryž móhł so mylnje přez wobhladowak wuwjesć.',
@@ -1496,6 +1522,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- Njezměń tutu linku! -->',
+'upload-success-subj' => 'Dataja bu wuspěšnje nahrata',
+'upload-success-msg' => 'Twoje nahraće z [$2] je wuspěšne było: Steji tu k dispoziciji: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Nahrawanski problem',
+'upload-failure-msg' => 'Bě problem z twojim nahraćom [$2]:
+
+$1',
+'upload-warning-subj' => 'Nahraćowe warnowanje',
+'upload-warning-msg' => 'Bě problem z twojim nahraćom [$2]. Wróć so k [[Special:Upload/stash/$1|nahrawanskemu formularej]], zo by tutón problem wotstronił.',
'upload-proto-error' => 'WopaÄny protokol',
'upload-proto-error-text' => 'URL dyrbi so z <code>http://</code> abo <code>ftp://</code> zapoÄeć.',
@@ -1553,6 +1587,7 @@ Za optimalnu wěstotu je img_auth.php znjemóžnjeny.',
'listfiles_search_for' => 'Za mjenom wobraza pytać:',
'imgfile' => 'dataja',
'listfiles' => 'Lisćina datajow',
+'listfiles_thumb' => 'Wobrazk',
'listfiles_date' => 'datum',
'listfiles_name' => 'mjeno dataje',
'listfiles_user' => 'wužiwar',
@@ -1663,8 +1698,8 @@ Slědowaca lisćina pokazuje jenož {{PLURAL:$1|prěni wotkaz strony|prěnjej $1
'statistics-edits' => 'Změny stronow wot załoženja {{SITENAME}}',
'statistics-edits-average' => 'Změny na stronu w přerězku',
'statistics-views-total' => 'Zwobraznjenja dohromady',
+'statistics-views-total-desc' => 'Pohlady do njeeksistowacych stronow a specialnych stronow njejsu zapřijate',
'statistics-views-peredit' => 'Zwobraznjenja na změnu',
-'statistics-jobqueue' => 'Dołhosć [http://www.mediawiki.org/wiki/Manual:Job_queue Job queue]',
'statistics-users' => 'Zregistrowani [[Special:ListUsers|wužiwarjo]]',
'statistics-users-active' => 'Aktiwni wužiwarjo',
'statistics-users-active-desc' => 'Wužiwarjo, kotÅ™iž su {{PLURAL:$1|wÄera|w zaÅ„dźenymaj $1 dnjomaj|w zaÅ„dźenych $1 dnjach|w zaÅ„dźenych $1 dnjach}} aktiwni byli',
@@ -1676,7 +1711,7 @@ Slědowaca lisćina pokazuje jenož {{PLURAL:$1|prěni wotkaz strony|prěnjej $1
'doubleredirects' => 'Dwójne daleposrědkowanja',
'doubleredirectstext' => 'Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.
-Kóžda rjadka wobsahuje wotkazy k prÄ›njemu a druhemu daleposrÄ›dkowanju kaž tež cil druheho daleposrÄ›dkowanja, kotryž je zwjetÅ¡a "woprawdźita" cilowa strona, na kotruž prÄ›nje daleposrÄ›dkowanje měło pokazać. <s>PÅ™eÅ¡mórnjene</s> zapiski su hižo sÄinjene.',
+Kóžda rjadka wobsahuje wotkazy k prÄ›njemu a druhemu daleposrÄ›dkowanju kaž tež cil druheho daleposrÄ›dkowanja, kotryž je zwjetÅ¡a "woprawdźita" cilowa strona, na kotruž prÄ›nje daleposrÄ›dkowanje měło pokazać. <del>PÅ™eÅ¡mórnjene</del> zapiski su hižo sÄinjene.',
'double-redirect-fixed-move' => '[[$1]] bu přesunjeny, je nětko daleposrědkowanje do [[$2]]',
'double-redirect-fixer' => 'Porjedźer daleposrědkowanjow',
@@ -1699,6 +1734,8 @@ Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž t
'nmembers' => '{{PLURAL:$1|$1 ÄÅ‚on|$1 ÄÅ‚onaj|$1 ÄÅ‚ony|$1 ÄÅ‚onow}}',
'nrevisions' => '$1 {{PLURAL:$1|wobdźěłanje|wobdźěłani|wobdźěłanja|wobdźěłanjow}}',
'nviews' => '$1 {{PLURAL:$1|jedyn wopyt|wopytaj|wopyty|wopytow}}',
+'nimagelinks' => 'Wužiwa so na $1 {{PLURAL:$1|stronje|stronomaj|stronach|stronach}}',
+'ntransclusions' => 'wužiwa so na $1 {{PLURAL:$1|stronje|stronomaj|stronach|stronach}}',
'specialpage-empty' => 'Tuchwilu žane zapiski.',
'lonelypages' => 'Wosyroćene strony',
'lonelypagestext' => 'Slědowace strony njejsu wotkazowe cile druhich stronow abo njezapřijimaja so do druhich stronow w {{SITENAME}}.',
@@ -1852,34 +1889,40 @@ Hlej tež [[Special:WantedCategories|požadane kategorije]].',
'listgrouprights-removegroup-self-all' => 'Móže wšě skupiny ze swójskeho konta wotstronić',
# E-mail user
-'mailnologin' => 'Njejsy přizjewjeny.',
-'mailnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być a płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo by druhim wužiwarjam mejlki pósłać móhł.',
-'emailuser' => 'Wužiwarjej mejlku pósłać',
-'emailpage' => 'Wužiwarjej mejlku pósłać',
-'emailpagetext' => 'Móžeš slědowacy formular wužiwać, zo by tutomu wužiwarjej e-mejlku pósłał.
+'mailnologin' => 'Njejsy přizjewjeny.',
+'mailnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być a płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo by druhim wužiwarjam mejlki pósłać móhł.',
+'emailuser' => 'Wužiwarjej mejlku pósłać',
+'emailpage' => 'Wužiwarjej mejlku pósłać',
+'emailpagetext' => 'Móžeš slědowacy formular wužiwać, zo by tutomu wužiwarjej e-mejlku pósłał.
E-mejlowa adresa, kotruž sy w [[Special:Preferences|swojich wužiwarskich nastajenjach]] zapodał, zjewi so jako adresa "Wot" e-mejlki, tak zo přijimowar móže ći direktnje wotmołwić.',
-'usermailererror' => 'E-mejlowy objekt je zmylk wróćił:',
-'defemailsubject' => 'Powěsć z {{grammar:genitiw|{{SITENAME}}}}',
-'noemailtitle' => 'Žana e-mejlowa adresa podata',
-'noemailtext' => 'Tutón wužiwar njeje płaćiwu e-mejlowu adresu podał.',
-'nowikiemailtitle' => 'Žana e-mejl dowolena',
-'nowikiemailtext' => 'Tutón wužiwar nochce žane e-mejlki wot druhich wužiwarjow dóstać.',
-'email-legend' => 'E-mejlku druhemu wužiwarjej {{GRAMMAR:genitiw|{{SITENAME}}}} pósłać',
-'emailfrom' => 'Wot:',
-'emailto' => 'Komu:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'Powěsć:',
-'emailsend' => 'Wotesłać',
-'emailccme' => 'E-mejluj mi kopiju mojeje powěsće.',
-'emailccsubject' => 'Kopija twojeje powěsće wužiwarjej $1: $2',
-'emailsent' => 'Mejlka wotesłana',
-'emailsenttext' => 'Twoja mejlka bu wotesłana.',
-'emailuserfooter' => 'Tuta e-mejlka bu z pomocu funkcije "Wužiwarjej mejlku pósłać" na {{SITENAME}} wot $1 do $2 pósłana.',
+'usermailererror' => 'E-mejlowy objekt je zmylk wróćił:',
+'defemailsubject' => 'Powěsć z {{grammar:genitiw|{{SITENAME}}}}',
+'usermaildisabled' => 'Wužiwarska e-mejl znjemóžnjena',
+'usermaildisabledtext' => 'Njemóžeš na tutym wikiju druhim wužiwarjam e-mejl pósłać',
+'noemailtitle' => 'Žana e-mejlowa adresa podata',
+'noemailtext' => 'Tutón wužiwar njeje płaćiwu e-mejlowu adresu podał.',
+'nowikiemailtitle' => 'Žana e-mejl dowolena',
+'nowikiemailtext' => 'Tutón wužiwar nochce žane e-mejlki wot druhich wužiwarjow dóstać.',
+'email-legend' => 'E-mejlku druhemu wužiwarjej {{GRAMMAR:genitiw|{{SITENAME}}}} pósłać',
+'emailfrom' => 'Wot:',
+'emailto' => 'Komu:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'Powěsć:',
+'emailsend' => 'Wotesłać',
+'emailccme' => 'E-mejluj mi kopiju mojeje powěsće.',
+'emailccsubject' => 'Kopija twojeje powěsće wužiwarjej $1: $2',
+'emailsent' => 'Mejlka wotesłana',
+'emailsenttext' => 'Twoja mejlka bu wotesłana.',
+'emailuserfooter' => 'Tuta e-mejlka bu z pomocu funkcije "Wužiwarjej mejlku pósłać" na {{SITENAME}} wot $1 do $2 pósłana.',
+
+# User Messenger
+'usermessage-summary' => 'Systemowu zdźělenku zawostajić.',
+'usermessage-editor' => 'Systemowy powěstnik',
# Watchlist
'watchlist' => 'wobkedźbowanki',
'mywatchlist' => 'wobkedźbowanki',
-'watchlistfor' => '(za wužiwarja <b>$1</b>)',
+'watchlistfor2' => 'Za wužiwarja $1 $2',
'nowatchlist' => 'Nimaš žane strony w swojich wobkedźbowankach.',
'watchlistanontext' => 'Dyrbiš so $1, zo by swoje wobkedźbowanki wobhladać abo wobdźěłać móhł.',
'watchnologin' => 'Njejsy přizjewjeny.',
@@ -1997,7 +2040,10 @@ Poslednja změna bě wot wužiwarja [[User:$3|$3]] ([[User talk:$3|Diskusija]]{{
'revertpage' => 'Změny [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]) cofnjene a nawróćene k poslednjej wersiji wužiwarja [[User:$1|$1]]',
'revertpage-nouser' => 'Staji změny wot (wužiwarske mjeno wotstronjene) na předchadnu wersiju wot [[User:$1|$1]] wróćo',
'rollback-success' => 'Změny wužiwarja $1 cofnjene; wróćo na wersiju wužiwarja $2.',
-'sessionfailure' => 'Zda so, zo je problem z twojim pÅ™izjewjenjom; tuta akcija bu wÄ›stosće dla pÅ™ećiwo zadobywanju do posedźenja znjemóžniÅ‚a. ProÅ¡u klikÅ„ na "Wróćo" a zaÄitaj stronu, z kotrejež pÅ™iÅ„dźeÅ¡, znowa; potom spytaj hišće raz.',
+
+# Edit tokens
+'sessionfailure-title' => 'Posedźenski zmylk',
+'sessionfailure' => 'Zda so, zo je problem z twojim pÅ™izjewjenjom; tuta akcija bu wÄ›stosće dla pÅ™ećiwo zadobywanju do posedźenja znjemóžniÅ‚a. ProÅ¡u klikÅ„ na "Wróćo" a zaÄitaj stronu, z kotrejež pÅ™iÅ„dźeÅ¡, znowa; potom spytaj hišće raz.',
# Protect
'protectlogpage' => 'Protokol Å¡kita',
@@ -2121,18 +2167,22 @@ $1',
'month' => 'wot měsaca (a do toho):',
'year' => 'wot lěta (a do toho):',
-'sp-contributions-newbies' => 'jenož pÅ™inoÅ¡ki nowaÄkow pokazać',
-'sp-contributions-newbies-sub' => 'Za nowaÄkow',
-'sp-contributions-newbies-title' => 'Wužiwarske přinoški za nowe konta',
-'sp-contributions-blocklog' => 'protokol zablokowanjow',
-'sp-contributions-deleted' => 'wušmórnjene wužiwarske přinoški',
-'sp-contributions-logs' => 'protokole',
-'sp-contributions-talk' => 'diskusija',
-'sp-contributions-userrights' => 'Zrjadowanje wužiwarskich prawow',
-'sp-contributions-blocked-notice' => 'Tutón wužiwar je tuchwilu zablokowany. Najnowši protokolowy zapisk so deleka jako referenca podawa:',
-'sp-contributions-search' => 'Přinoški pytać',
-'sp-contributions-username' => 'IP-adresa abo wužiwarske mjeno:',
-'sp-contributions-submit' => 'OK',
+'sp-contributions-newbies' => 'jenož pÅ™inoÅ¡ki nowaÄkow pokazać',
+'sp-contributions-newbies-sub' => 'Za nowaÄkow',
+'sp-contributions-newbies-title' => 'Wužiwarske přinoški za nowe konta',
+'sp-contributions-blocklog' => 'protokol zablokowanjow',
+'sp-contributions-deleted' => 'wušmórnjene wužiwarske přinoški',
+'sp-contributions-uploads' => 'nahraća',
+'sp-contributions-logs' => 'protokole',
+'sp-contributions-talk' => 'diskusija',
+'sp-contributions-userrights' => 'Zrjadowanje wužiwarskich prawow',
+'sp-contributions-blocked-notice' => 'Tutón wužiwar je tuchwilu zablokowany. Najnowši protokolowy zapisk so deleka jako referenca podawa:',
+'sp-contributions-blocked-notice-anon' => 'Tuta IP-adresa je tuchwilu zablokowana.
+Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
+'sp-contributions-search' => 'Přinoški pytać',
+'sp-contributions-username' => 'IP-adresa abo wužiwarske mjeno:',
+'sp-contributions-toponly' => 'Jenož wyše wersije pokazać',
+'sp-contributions-submit' => 'OK',
# What links here
'whatlinkshere' => 'Å to wotkazuje sem',
@@ -2192,7 +2242,6 @@ $1',
'ipb-edit-dropdown' => 'pÅ™iÄiny zablokowanjow wobdźěłać',
'ipb-unblock-addr' => 'zablokowanje wužiwarja „$1“ zběhnyć',
'ipb-unblock' => 'zablokowanje wužiwarja abo IP-adresy zběhnyć',
-'ipb-blocklist-addr' => 'Eksistowace zablokowanja za "$1"',
'ipb-blocklist' => 'tuchwilne blokowanja zwobraznić',
'ipb-blocklist-contribs' => 'Přinoški za $1',
'unblockip' => 'Zablokowanje zběhnyć',
@@ -2260,6 +2309,8 @@ $1 je hižo zablokowany. Chceš nastajenja změnić?',
'sorbs_create_account_reason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana. Njemóžeš konto wutworić.',
'cant-block-while-blocked' => 'Njemóžeš druhich wužiwarjow blokować, mjeztym zo ty sy zablokowany.',
'cant-see-hidden-user' => 'Wužiwar, kotrehož pospytuješ blokować, bu hižo zablokowany a schowany. Dokelž nimaš prawo wužiwarja schować, njemóžeš blokowanje wužiwarja widźeć abo wobdźěłać.',
+'ipbblocked' => 'Njemóžeš druhich wužiwarjow blokować abo wotblokować, dokelž ty sam sy zablokowany',
+'ipbnounblockself' => 'Njesměš so samoho wotblokować',
# Developer tools
'lockdb' => 'Datowu banku zamknyć',
@@ -2287,6 +2338,17 @@ $1 je hižo zablokowany. Chceš nastajenja změnić?',
Wobkedźbuj, zo strona so <b>nje</b> pÅ™esunje, jeli strona z nowym titlom hizo eksistuje, chibazo wona je prózdna abo dalesposrÄ›dkowanje a nima zaÅ¡Å‚e stawizny. To woznamjenja, zo móžeÅ¡ stronu tam wróćo pÅ™emjenować, hdźež bu runje pÅ™emjenowana, jeli zmylk ÄiniÅ¡ a njemóžeÅ¡ wobstejacu stronu pÅ™episować.
<b>KEDŹBU!</b> Móže to drastiska a njewoÄakowana zmÄ›na za woblubowanu stronu być; proÅ¡u budź sej wÄ›sty, zo sćěwki rozumiÅ¡, prjedy haÄ pokroÄujeÅ¡.',
+'movepagetext-noredirectfixer' => "Wužiwajo slědowacy formular, móžeš stronu přemjenować a wšě jich daty do stawiznow noweho titula přesunyć.
+Stary titul budźe dalesposrědkowanska strona k nowemu titulej.
+Skontroluj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|wobškodźenymi dalesposrědkowanjemi]].
+Sy za to zamołwity, zo wotkazy na tón cil pokazuja, na kotryž maja pokazować.
+
+Dźiwaj na to, zo strona so '''nje'''přesunje, jeli je hižo strona z nowym titulom, chibazo wona je prózdna abo dalesposrědkowanje a nima stawizny změnow.
+To woznamjenja, zo móžeÅ¡ stronu do stareho mjena wróćopÅ™emjenować, jeli ÄiniÅ¡ zmylk a njemóžeÅ¡ eksistowacu stronu pÅ™episać.
+
+'''Warnowanje!'''
+To móže drastiska a njewoÄakowana zmÄ›na za woblubowanu stronu być:
+proÅ¡u wuwÄ›domće sej konsekwency, prjedy haÄ pokroÄujeÅ¡.",
'movepagetalktext' => 'Přisłušna diskusijna strona přesunje so awtomatisce hromadźe z njej, <b>chibazo:</b>
*Njeprózdna diskusijna strona pod nowym mjenom hižo eksistuje abo
*wotstronjeÅ¡ hóÄku z kašćika deleka.
@@ -2341,6 +2403,7 @@ Cilowa strona „[[:$1]]†hižo eksistuje. ChceÅ¡ ju wuÅ¡mórnyć, zo by so pÅ
'immobile-source-page' => 'Strona njeda so přesunyć.',
'immobile-target-page' => 'Njemóžno do teje ciloweje strony přesunyć.',
'imagenocrossnamespace' => 'Wobraz njeda so do druheho mjenoweho ruma haÄ wobraz pÅ™esunyć',
+'nonfile-cannot-move-to-file' => 'Njedataje njedadźa so do datajoweho mjenoweho ruma přesunyć',
'imagetypemismatch' => 'Nowa dataja swojemu typej njewotpowěduje',
'imageinvalidfilename' => 'Mjeno ciloweje dataje je njepłaćiwe',
'fix-double-redirects' => 'Daleposrědkowanja aktualizować, kotrež na prěnjotny titul pokazuja',
@@ -2416,6 +2479,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'importstart' => 'Importuju…',
'import-revision-count' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}}',
'importnopages' => 'Žane strony za importowanje.',
+'imported-log-entries' => '$1 {{PLURAL:$1|protokolowy zapisk importowany|protokolowej zapiskaj importowanej|protokolowe zapiski importowane|protokolowych zapiskow importowanych}}.',
'importfailed' => 'Import zwrěšćił: $1',
'importunknownsource' => 'Njeznate importowe žórło',
'importcantopen' => 'Importowa dataja njeda so woÄinjeć.',
@@ -2508,6 +2572,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'tooltip-upload' => 'nahraće startować',
'tooltip-rollback' => '"Rollback" anuluje změny strony poslednjeho sobudźěłaćerja přez jedne kliknjenje.',
'tooltip-undo' => 'anuluje tutu zmÄ›nu a woÄinja wobdźěłowanski formular w pÅ™ehladowym modusu. Zmóžnja pÅ™iÄinu w zjeću pÅ™idać.',
+'tooltip-preferences-save' => 'Nastajenja składować',
+'tooltip-summary' => 'Zapodaj krótke zjeće',
# Stylesheets
'common.css' => '/* CSS w tutej dataji budźe so na wšěch stronow wuskutkować. */',
@@ -2620,13 +2686,16 @@ $1',
'widthheight' => '$1x$2',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|strona|stronje|strony|stronow}}',
'file-info' => 'Wulkosć dataje: $1, typ MIME: $2',
-'file-info-size' => '($1 × $2 pikselow, wulkosć dataje: $3, typ MIME: $4)',
+'file-info-size' => '$1 × $2 pikselow, wulkosć dataje: $3, typ MIME: $4',
'file-nohires' => '<small>Za tutu dataju žane wyše rozeznaće njeje.</small>',
-'svg-long-desc' => '(SVG-dataja, zakładna wulkosć: $1 × $2 pikselow, datajowa wulkosć: $3)',
+'svg-long-desc' => 'SVG-dataja, zakładna wulkosć: $1 × $2 pikselow, datajowa wulkosć: $3',
'show-big-image' => 'Wersija z wyšim rozeznaćom',
'show-big-image-thumb' => '<small>Wulkosć miniaturki: $1 × $2 pikselow</small>',
'file-info-gif-looped' => 'BjezkónÄna sekla',
'file-info-gif-frames' => '$1 {{PLURAL:$1|wobłuk|wobłukaj|wobłuki|wobłukow}}',
+'file-info-png-looped' => 'Sekla',
+'file-info-png-repeat' => '{{PLURAL:$1|$1 raz|dwójce|$1 razy|$1 razow}} wotehrata',
+'file-info-png-frames' => '$1 {{PLURAL:$1|wobłuk|wobłukaj|wobłuki|wobłukow}}',
# Special:NewFiles
'newimages' => 'Nowe dataje',
@@ -2779,6 +2848,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
'exif-gpsareainformation' => 'Mjeno wobwoda GPS',
'exif-gpsdatestamp' => 'Datum GPS',
'exif-gpsdifferential' => 'Diferencialna korektura GPS',
+'exif-objectname' => 'Krótki titul',
# EXIF attributes
'exif-compression-1' => 'Njekomprimowany',
@@ -2936,23 +3006,23 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
'limitall' => 'wšě',
# E-mail address confirmation
-'confirmemail' => 'Emailowu adresu wobkrućić',
-'confirmemail_noemail' => 'Njejsy płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] podał.',
-'confirmemail_text' => 'Tutón wiki žada, zo swoju e-mejlowu adresu wobkrućiÅ¡, prjedy haÄ e-mejlowe funkcije wužijeÅ¡. Zaktiwuzij tłóÄatko deleka, zo by swojej adresy wobkrućensku mejlku pósÅ‚aÅ‚. Mejlka zapÅ™ijmje wotkaz, kotryž kod wobsahuje; woÄiÅ„ wotkaz we swojim wobhladowaku, zo by wobkrućiÅ‚, zo twoja e-mejlowa adresa je pÅ‚aćiwa.',
-'confirmemail_pending' => ' Potwjerdźenski kod bu hižo z e-mejlu pÅ™ipósÅ‚any. Jeli sy runje swoje konto wutworiÅ‚, woÄakaj proÅ¡u nÄ›kotre mjeÅ„Å¡iny, prjedy haÄ sej nowy kod žadaÅ¡.',
-'confirmemail_send' => 'Wobkrućenski kod pósłać',
-'confirmemail_sent' => 'Wobkrućenska mejlka bu wotesłana.',
-'confirmemail_oncreate' => 'Wobkrućenski kod bu na twoju e-mejlowu adresu pósłany. Tutón kod za přizjewjenje trěbne njeje, trjebaš jón pak, zo by e-mejlowe funkcije we wikiju aktiwizował.',
-'confirmemail_sendfailed' => '{{SITENAME}} njemóžeše twoje potwjerdźensku e-mejlku pósłać. Přepytaj prošu swoju e-mejlowu adresu za njepłaćiwymi znamješkami.
+'confirmemail' => 'Emailowu adresu wobkrućić',
+'confirmemail_noemail' => 'Njejsy płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] podał.',
+'confirmemail_text' => 'Tutón wiki žada, zo swoju e-mejlowu adresu wobkrućiÅ¡, prjedy haÄ e-mejlowe funkcije wužijeÅ¡. Zaktiwuzij tłóÄatko deleka, zo by swojej adresy wobkrućensku mejlku pósÅ‚aÅ‚. Mejlka zapÅ™ijmje wotkaz, kotryž kod wobsahuje; woÄiÅ„ wotkaz we swojim wobhladowaku, zo by wobkrućiÅ‚, zo twoja e-mejlowa adresa je pÅ‚aćiwa.',
+'confirmemail_pending' => ' Potwjerdźenski kod bu hižo z e-mejlu pÅ™ipósÅ‚any. Jeli sy runje swoje konto wutworiÅ‚, woÄakaj proÅ¡u nÄ›kotre mjeÅ„Å¡iny, prjedy haÄ sej nowy kod žadaÅ¡.',
+'confirmemail_send' => 'Wobkrućenski kod pósłać',
+'confirmemail_sent' => 'Wobkrućenska mejlka bu wotesłana.',
+'confirmemail_oncreate' => 'Wobkrućenski kod bu na twoju e-mejlowu adresu pósłany. Tutón kod za přizjewjenje trěbne njeje, trjebaš jón pak, zo by e-mejlowe funkcije we wikiju aktiwizował.',
+'confirmemail_sendfailed' => '{{SITENAME}} njemóžeše twoje potwjerdźensku e-mejlku pósłać. Přepytaj prošu swoju e-mejlowu adresu za njepłaćiwymi znamješkami.
E-mejlowy program je wróćił: $1',
-'confirmemail_invalid' => 'Njepłaćiwy wobkrućacy kod. Kod je snano spadnył.',
-'confirmemail_needlogin' => 'Dyrbiš so $1, zo by e-mejlowu adresu wobkrućić móhł.',
-'confirmemail_success' => 'Twoja e-mejlowa adresa bu wobkrućena. Móžeš so nětko přizjewić.',
-'confirmemail_loggedin' => 'Twoja e-mejlowa adresu bu nětko wobkrućena.',
-'confirmemail_error' => 'Zmylk při wobkrućenju twojeje e-mailoweje adresy.',
-'confirmemail_subject' => '{{SITENAME}} – wobkrućenje e-mejloweje adresy',
-'confirmemail_body' => 'Něchtó, najskerje ty z IP-adresu $1, je wužiwarske konto "$2" z tutej e-mejlowej adresu we {{GRAMMAR:lokatiw|{{SITENAME}}}} zregistrował.
+'confirmemail_invalid' => 'Njepłaćiwy wobkrućacy kod. Kod je snano spadnył.',
+'confirmemail_needlogin' => 'Dyrbiš so $1, zo by e-mejlowu adresu wobkrućić móhł.',
+'confirmemail_success' => 'Twoja e-mejlowa adresa bu wobkrućena. Móžeš so nětko přizjewić.',
+'confirmemail_loggedin' => 'Twoja e-mejlowa adresu bu nětko wobkrućena.',
+'confirmemail_error' => 'Zmylk při wobkrućenju twojeje e-mailoweje adresy.',
+'confirmemail_subject' => '{{SITENAME}} – wobkrućenje e-mejloweje adresy',
+'confirmemail_body' => 'Něchtó, najskerje ty z IP-adresu $1, je wužiwarske konto "$2" z tutej e-mejlowej adresu we {{GRAMMAR:lokatiw|{{SITENAME}}}} zregistrował.
Zo by so wobkrućiÅ‚o, zo tute konto woprawdźe tebi sÅ‚uÅ¡a a zo bychu so e-mejlowe funkcije we {{GRAMMAR:lokatiw|{{SITENAME}}}} zaktiwizowali, woÄiÅ„ tutón wotkaz w swojim wobhladowaku:
@@ -2963,8 +3033,32 @@ Jeli *njej*sy konto zregistrował, slěduj wotkaz, zo by wobkrućenje e-mejlowej
$5
Tute wobkrućenski kod spadnje $4.',
-'confirmemail_invalidated' => 'E-mejlowe potwjerdźenje přetorhnjene',
-'invalidateemail' => 'E-mejlowe potwjerdźenje přetorhnyć',
+'confirmemail_body_changed' => 'Něchtó, najskerje ty z IP-adresu $1, je e-mejlowu adresu konta "$2" do tuteje adresy na {{GRAMMAR:lokatiw|{{SITENAME}}}} změnił.
+
+Zo by so wobkrućiÅ‚o, zo tute konto woprawdźe tebi sÅ‚uÅ¡a a zo bychu so e-mejlowe funkcije na {{GRAMMAR:lokatiw|{{SITENAME}}}} znowa zaktiwizowali, woÄiÅ„ tutón wotkaz w swojim wobhladowaku:
+
+$3
+
+Jeli konto ći *nje*słuša, slěduj wotkaz, zo by wobkrućenje e-mejloweje adresy přetorhnył:
+
+$5
+
+Tute wobkrućenski kod spadnje $4.',
+'confirmemail_body_set' => 'Něchtó, najskerje ty, wot IP-adresy $1,
+je e-mejlowu adresu konta "$2" na {{GRAMMAR:lokatiw|{{STENAME}}}} na tutu adresu stajił.
+
+Zo by wobkrućiÅ‚, zo tute konto ći woprawdźe sÅ‚uÅ¡a a zo bychu so e-mejlowe funkcije na {{GRAMMAR:lokatiw|{{STENAME}}}} znowa aktiwizowali, woÄiÅ„ tutón wotkaz w swojim wobhladowaku:
+
+$3
+
+Jeli konto ći *nje*słuša, slěduj tutón wotkaz,
+zo by wobkrućenje e-mejloweje adresy přetorhnył:
+
+$5
+
+Tutón wobkrućenski kod spadnje $4.',
+'confirmemail_invalidated' => 'E-mejlowe potwjerdźenje přetorhnjene',
+'invalidateemail' => 'E-mejlowe potwjerdźenje přetorhnyć',
# Scary transclusion
'scarytranscludedisabled' => '[ZapÅ™ijeće mjezyrÄ›Änych wotkazow je znjemóžnjene]',
@@ -3004,6 +3098,7 @@ Prošu potwjerdź, zo chceš tutu stronu woprawdźe znowa wutworić.",
'table_pager_first' => 'prěnja strona',
'table_pager_last' => 'poslednja strona',
'table_pager_limit' => '$1 {{PLURAL:$1|wuslědk|wuslědkaj|wuslědki|wuslědkow}} na stronu pokazać',
+'table_pager_limit_label' => 'Zapiski na stronu:',
'table_pager_limit_submit' => 'Wotpósłać',
'table_pager_empty' => 'Žane wuslědki',
@@ -3066,6 +3161,7 @@ MóžeÅ¡ tež [[Special:Watchlist/edit|standardnu wobdźěłowansku stronu]] wuÅ
'version-specialpages' => 'Specialne strony',
'version-parserhooks' => 'Parserowe hoki',
'version-variables' => 'Wariable',
+'version-skins' => 'Å aty',
'version-other' => 'Druhe',
'version-mediahandlers' => 'Předźěłaki medijow',
'version-hooks' => 'Hoki',
@@ -3077,6 +3173,13 @@ MóžeÅ¡ tež [[Special:Watchlist/edit|standardnu wobdźěłowansku stronu]] wuÅ
'version-hook-subscribedby' => 'Abonowany wot',
'version-version' => '(Wersija $1)',
'version-license' => 'Licenca',
+'version-poweredby-credits' => "Tutón wiki so wot '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2 podpěruje.",
+'version-poweredby-others' => 'druzy',
+'version-license-info' => 'MediaWiki je swobodna softwara: móžeš ju pod wuměnjenjemi licency GNU General Public License, wozjewjeneje wot załožby Free Software Foundation, rozdźělić a/abo změnić: pak pod wersiju 2 licency pak pod někajkej pozdźišej wersiju.
+
+MediaWiki so w nadźiji rozdźěla, zo budźe wužitny, ale BJEZ GARANTIJU: samo bjez wobsahowaneje garantije PŘEDAWAJOMNOSĆE abo PŘIHÓDNOSĆE ZA WĚSTY ZAMĚR. Hlej GNU general Public License za dalše podrobnosće.
+
+Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public License] hromadźe z tutym programom dóstanu měć: jeli nic, napisaj do zaÅ‚ožby Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA abo [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html pÅ™eÄitaj ju online].',
'version-software' => 'Instalowana software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Wersija',
@@ -3146,6 +3249,15 @@ Zapodaj datajowe mjeno '''bjez''' prefiksa \"{{ns:file}}:\".",
'tags-edit' => 'změnić',
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
+# Special:ComparePages
+'comparepages' => 'Strony přirunać',
+'compare-selector' => 'Wersije strony přirunać',
+'compare-page1' => 'Strona 1',
+'compare-page2' => 'Strona 2',
+'compare-rev1' => 'Wersija 1',
+'compare-rev2' => 'Wersija 2',
+'compare-submit' => 'Přirunać',
+
# Database error messages
'dberr-header' => 'Tutón wiki ma problem',
'dberr-problems' => 'Wodaj! Tute sydło ma techniske ćežkosće.',
@@ -3162,8 +3274,13 @@ Zapodaj datajowe mjeno '''bjez''' prefiksa \"{{ns:file}}:\".",
'htmlform-float-invalid' => 'Hódnota, kotruž sy podaÅ‚, liÄba njeje.',
'htmlform-int-toolow' => 'Hódnota, kotruž sy zapodaÅ‚, je mjeÅ„Å¡a haÄ minimum $1.',
'htmlform-int-toohigh' => 'Hódnota, kotruž sy zapodaÅ‚, je wjetÅ¡a haÄ maksimum $1.',
+'htmlform-required' => 'Tuta hódnota je trěbna',
'htmlform-submit' => 'Wotpósłać',
'htmlform-reset' => 'Změny cofnyć',
'htmlform-selectorother-other' => 'Druhe',
+# SQLite database support
+'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
+'sqlite-no-fts' => '$1 połnotekstowe pytanje njepodpěruje',
+
);
diff --git a/languages/messages/MessagesHt.php b/languages/messages/MessagesHt.php
index 91b0d87d..f2a48eea 100644
--- a/languages/messages/MessagesHt.php
+++ b/languages/messages/MessagesHt.php
@@ -23,8 +23,8 @@ $namespaceNames = array(
NS_USER => 'Itilizatè',
NS_USER_TALK => 'Diskisyon_Itilizatè',
NS_PROJECT_TALK => 'Diskisyon_$1',
- NS_FILE => 'Imaj',
- NS_FILE_TALK => 'Diskisyon_Imaj',
+ NS_FILE => 'Fichye',
+ NS_FILE_TALK => 'Diskisyon_Fichye',
NS_MEDIAWIKI => 'MedyaWiki',
NS_MEDIAWIKI_TALK => 'Diskisyon_MedyaWiki',
NS_TEMPLATE => 'Modèl',
@@ -35,36 +35,44 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Diskisyon_Kategori',
);
+$namespaceAliases = array(
+ 'Imaj' => NS_USER,
+ 'Diskisyon_Imaj' => NS_USER_TALK,
+);
+
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'RedireksyonDouble' ),
+ 'DoubleRedirects' => array( 'RedireksyonDoub' ),
'BrokenRedirects' => array( 'RedireksyonKase' ),
- 'Disambiguations' => array( 'Disanbigyasyon', 'Klarifikasyon' ),
- 'Userlogin' => array( 'Login', 'AntreLòg' ),
- 'Userlogout' => array( 'Dekoneksyon', 'ExitLòg' ),
- 'CreateAccount' => array( 'KreyeKonpt' ),
+ 'Disambiguations' => array( 'Tokay' ),
+ 'Userlogin' => array( 'Koneksyon' ),
+ 'Userlogout' => array( 'Dekoneksyon' ),
+ 'CreateAccount' => array( 'KreyeKont' ),
'Preferences' => array( 'Preferans' ),
'Watchlist' => array( 'LisSwivi' ),
'Recentchanges' => array( 'ChanjmanResan' ),
- 'Upload' => array( 'Telechaje' ),
- 'Listfiles' => array( 'LisImaj' ),
+ 'Upload' => array( 'Chaje' ),
+ 'UploadStash' => array( 'ChajePil' ),
+ 'Listfiles' => array( 'LisFichye', 'Lis_Fichye', 'LisImaj' ),
'Newimages' => array( 'NouvoImaj' ),
- 'Listusers' => array( 'LisItilizatè', 'LisYonItilizatè' ),
- 'Listgrouprights' => array( 'LisDwaGroup' ),
+ 'Listusers' => array( 'LisItilizatè' ),
+ 'Listgrouprights' => array( 'LisDwaGwoup' ),
'Statistics' => array( 'Estatistik' ),
- 'Randompage' => array( 'Randonm', 'PajRandonm' ),
- 'Lonelypages' => array( 'PajSolitè', 'PajOfelen' ),
- 'Uncategorizedpages' => array( 'PajEnkategorize' ),
- 'Uncategorizedcategories' => array( 'KategoriEnkategorize' ),
- 'Uncategorizedimages' => array( 'ImageEnkategorize' ),
- 'Uncategorizedtemplates' => array( 'TenmplaEnkategorize' ),
+ 'Randompage' => array( 'Oaza', 'PajOaza' ),
+ 'Lonelypages' => array( 'PajPoukontli', 'PajOfelen' ),
+ 'Uncategorizedpages' => array( 'PajPakategorize' ),
+ 'Uncategorizedcategories' => array( 'KategoriPakategorize' ),
+ 'Uncategorizedimages' => array( 'ImajPakategorize' ),
+ 'Uncategorizedtemplates' => array( 'ModèlPakategorize' ),
'Unusedcategories' => array( 'KategoriPaItilize' ),
- 'Unusedimages' => array( 'ImajePaItilize' ),
- 'Wantedpages' => array( 'PajBezwen', 'LyenKase' ),
- 'Wantedcategories' => array( 'KategoriBezwen' ),
- 'Mostlinked' => array( 'PlisLenke' ),
- 'Mostlinkedcategories' => array( 'KategoriPlisLenke', 'KategoriPlisItilize' ),
- 'Mostlinkedtemplates' => array( 'TenmplaPlisLenke', 'TenmplaPlisItilize' ),
- 'Mostimages' => array( 'PlisImaj' ),
+ 'Unusedimages' => array( 'FichyePaItilize', 'ImajPaItilize' ),
+ 'Wantedpages' => array( 'PajNouBezwen', 'LyenKase' ),
+ 'Wantedcategories' => array( 'KategoriNouBezwen' ),
+ 'Wantedfiles' => array( 'FichyeNouBezwen' ),
+ 'Wantedtemplates' => array( 'ModèlNouBezwen' ),
+ 'Mostlinked' => array( 'PajPlisLye', 'PlisLye' ),
+ 'Mostlinkedcategories' => array( 'KategoriPlisLye', 'KategoriPlisItilize' ),
+ 'Mostlinkedtemplates' => array( 'ModèlPlisLye', 'ModèlPlisItilize' ),
+ 'Mostimages' => array( 'ImajPlisLye', 'PlisFichye', 'PlisImaj' ),
'Mostcategories' => array( 'PlisKategori' ),
'Mostrevisions' => array( 'PlisRevizyon' ),
'Fewestrevisions' => array( 'MwensRevizyon' ),
@@ -72,54 +80,62 @@ $specialPageAliases = array(
'Longpages' => array( 'PajLong' ),
'Newpages' => array( 'PajNouvo' ),
'Ancientpages' => array( 'PajAnsyen' ),
- 'Deadendpages' => array( 'PajMòtèl' ),
- 'Protectedpages' => array( 'PajProteje' ),
- 'Protectedtitles' => array( 'TitProteje' ),
+ 'Deadendpages' => array( 'PajEnpas' ),
+ 'Protectedpages' => array( 'PajPwoteje' ),
+ 'Protectedtitles' => array( 'TitPwoteje' ),
'Allpages' => array( 'ToutPaj' ),
- 'Prefixindex' => array( 'PrefixEndèx' ),
- 'Ipblocklist' => array( 'LisIPBloke' ),
+ 'Prefixindex' => array( 'EndèksPrefiks' ),
+ 'Ipblocklist' => array( 'LisBloke', 'LisIPBloke' ),
+ 'Unblock' => array( 'Debloke' ),
'Specialpages' => array( 'PajEspesyal' ),
- 'Contributions' => array( 'Kontribisyon' ),
- 'Emailuser' => array( 'EmèlItilizatè' ),
- 'Confirmemail' => array( 'VerifyeEmèl' ),
- 'Whatlinkshere' => array( 'SakLenkeLa' ),
- 'Recentchangeslinked' => array( 'LyenChajmanResan', 'Chanjman Relativ' ),
+ 'Contributions' => array( 'Kontribisyon', 'Kontrib' ),
+ 'Emailuser' => array( 'ImèlItilizatè' ),
+ 'Confirmemail' => array( 'VerifyeImèl' ),
+ 'Whatlinkshere' => array( 'SakLye' ),
+ 'Recentchangeslinked' => array( 'LyenChanjmanResan', 'ChanjmanAk' ),
'Movepage' => array( 'DeplasePaj' ),
- 'Blockme' => array( 'Bloke-m' ),
+ 'Blockme' => array( 'BlokeM' ),
'Booksources' => array( 'SousLiv' ),
'Categories' => array( 'Kategori' ),
- 'Export' => array( 'Expòt' ),
+ 'Export' => array( 'Ekspòte' ),
'Version' => array( 'Vèsyon' ),
'Allmessages' => array( 'ToutMesaj' ),
- 'Log' => array( 'Jounal', 'Lòg yo' ),
- 'Blockip' => array( 'BlokeIP' ),
+ 'Log' => array( 'Jounal' ),
+ 'Blockip' => array( 'Bloke', 'BlokeIP', 'BlokeItilizatè' ),
'Undelete' => array( 'Restore' ),
- 'Import' => array( 'Enpòt' ),
+ 'Import' => array( 'Enpòte' ),
'Lockdb' => array( 'KadnaseDB' ),
'Unlockdb' => array( 'DekadnaseDB' ),
- 'Userrights' => array( 'DwaItilizatè' ),
- 'MIMEsearch' => array( 'BouskayMIME' ),
- 'FileDuplicateSearch' => array( 'BouskeFilDouplike' ),
+ 'Userrights' => array( 'DwaItilizatè', 'FèSysop', 'FèBot' ),
+ 'MIMEsearch' => array( 'ChacheMIME' ),
+ 'FileDuplicateSearch' => array( 'ChacheFichyeDoub' ),
'Unwatchedpages' => array( 'PajPaSiveye' ),
- 'Listredirects' => array( 'RedireksyonLis' ),
+ 'Listredirects' => array( 'LisRedireksyon' ),
'Revisiondelete' => array( 'RevizyonSiprime' ),
- 'Unusedtemplates' => array( 'TanmplaVyèj' ),
- 'Randomredirect' => array( 'RedireksyonRandonm' ),
+ 'Unusedtemplates' => array( 'ModèlVyèj' ),
+ 'Randomredirect' => array( 'RedireksyonOaza' ),
'Mypage' => array( 'PajMwen' ),
- 'Mytalk' => array( 'Diskisyon-m' ),
- 'Mycontributions' => array( 'Kontribisyon-m' ),
- 'Listadmins' => array( 'AdminLis' ),
- 'Listbots' => array( 'RoboLis' ),
+ 'Mytalk' => array( 'DiskisyonM' ),
+ 'Mycontributions' => array( 'KontribisyonM' ),
+ 'Myuploads' => array( 'ChajmanM' ),
+ 'PermanentLink' => array( 'LyenPouToutTan' ),
+ 'Listadmins' => array( 'LisAdmin' ),
+ 'Listbots' => array( 'LisWobo' ),
'Popularpages' => array( 'PajPopilè' ),
'Search' => array( 'Chache', 'Fouye' ),
- 'Resetpass' => array( 'ResètMoPas' ),
+ 'Resetpass' => array( 'ChanjeMopas', 'ResètMopas' ),
'Withoutinterwiki' => array( 'SanEntèwiki' ),
- 'MergeHistory' => array( 'MeleIstwa' ),
- 'Filepath' => array( 'ChemenFil' ),
- 'Invalidateemail' => array( 'EnvalideEmèl' ),
+ 'MergeHistory' => array( 'FizyoneIstwa' ),
+ 'Filepath' => array( 'ChemenFichye' ),
+ 'Invalidateemail' => array( 'EnvalideImèl' ),
'Blankpage' => array( 'PajVid' ),
- 'LinkSearch' => array( 'BouskeLyen' ),
+ 'LinkSearch' => array( 'ChacheLyen' ),
'DeletedContributions' => array( 'SiprimeKontribisyon' ),
+ 'Tags' => array( 'Etikèt' ),
+ 'Activeusers' => array( 'ItilizatèAktif' ),
+ 'ComparePages' => array( 'KonparePaj' ),
+ 'Badtitle' => array( 'MovèTit' ),
+ 'DisableAccount' => array( 'DeaktiveKont' ),
);
$linkTrail = '/^([a-zàèòÀÈÒ]+)(.*)$/sDu';
@@ -140,8 +156,7 @@ $messages = array(
'tog-editsection' => 'Pemèt modifye yon seksyon grasa lyen [modifye] yo',
'tog-editsectiononrightclick' => 'Pemèt modifye yon seksyon lè ou klike a dwat sou tit seksyon an (sa mande JavaScript)',
'tog-showtoc' => 'Montre tab de matyè yo (pou tout paj ki gen plis pase 3 tit)',
-'tog-rememberpassword' => 'Sonje login mwen nan òdinatè sa',
-'tog-editwidth' => 'Montre fenèt pou modifikasyon yo nan mitan paj lan',
+'tog-rememberpassword' => 'Sonje mopas mwen nan òdinatè sa (pou $1 {{PLURAL:$1|jou|jou}} maximum)',
'tog-watchcreations' => 'Mete paj mwen kreye yo nan lis swivi mwen.',
'tog-watchdefault' => 'Mete paj mwen edite yo nan lis swivi mwen',
'tog-watchmoves' => 'Mete paj mwen deplase yo nan lis swivi mwen',
@@ -286,26 +301,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Ajoute yon sijè',
-'vector-action-delete' => 'Efase',
-'vector-action-move' => 'Chanje non',
-'vector-action-protect' => 'Pwoteje',
-'vector-action-undelete' => 'Retabli',
-'vector-action-unprotect' => 'Pa pwoteje',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Èd',
-'vector-namespace-image' => 'Imaj',
-'vector-namespace-main' => 'Paj',
-'vector-namespace-mediawiki' => 'Mesaj',
-'vector-namespace-template' => 'Modèl',
-'vector-view-create' => 'Kreye',
-'vector-view-edit' => 'Modifye',
-'vector-view-history' => 'Gade istorik',
-'vector-view-view' => 'Li',
-'vector-view-viewsource' => 'Wè kòd tèks sa a',
-'actions' => 'Aksyon yo',
-'namespaces' => 'Espas non yo',
-'variants' => 'Varyant yo',
+'vector-action-addsection' => 'Ajoute yon sijè',
+'vector-action-delete' => 'Efase',
+'vector-action-move' => 'Chanje non',
+'vector-action-protect' => 'Pwoteje',
+'vector-action-undelete' => 'Retabli',
+'vector-action-unprotect' => 'Pa pwoteje',
+'vector-simplesearch-preference' => 'Aktive sijèsyon rechèch ranfòse yo (pou estil Vector sèlman)',
+'vector-view-create' => 'Kreye',
+'vector-view-edit' => 'Modifye',
+'vector-view-history' => 'Gade istorik',
+'vector-view-view' => 'Li',
+'vector-view-viewsource' => 'Wè kòd tèks sa a',
+'actions' => 'Aksyon yo',
+'namespaces' => 'Espas non yo',
+'variants' => 'Varyant yo',
'errorpagetitle' => 'Erè',
'returnto' => 'Ritounen nan paj $1.',
@@ -366,6 +376,9 @@ Genyen trop itilizatè k ap eseye gade paj sa.
Tanpri tann yon tikras tan anvan ou eseye gade paj sa ankò.
$1',
+'pool-timeout' => 'Tan ekoule pou defè seri a',
+'pool-queuefull' => 'Fil pou travay la plen',
+'pool-errorunknown' => 'Erè nou pa konnen',
# 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' => 'Apwopo {{SITENAME}}',
@@ -528,7 +541,8 @@ Kont ou an kreye. Pa bliye pèsonalize l nan [[Special:Preferences|preferans ou
'yourname' => 'Non itilizatè ou an :',
'yourpassword' => 'Mopas ou an :',
'yourpasswordagain' => 'Mete mopas ou an ankò :',
-'remembermypassword' => 'Anrejistre mopas mwen an nan òdinatè mwen an',
+'remembermypassword' => 'Sonje mopas mwen an nan òdinatè mwen an (pou yon maximum de $1 {{PLURAL:$1|jou|jou}})',
+'securelogin-stick-https' => 'Kontinye itilize HTTPS toujou apre koneksyon',
'yourdomainname' => 'Domèn ou an',
'externaldberror' => 'Li sanble ke yon erè pwodui ak bazdone a pou idantifikasyon ki pa nan sistèm an, oubyen ou pa otorize pou mete a jou kont ou genyen nan lòt sistèm yo.',
'login' => 'Konekte ou',
@@ -545,6 +559,7 @@ Kont ou an kreye. Pa bliye pèsonalize l nan [[Special:Preferences|preferans ou
'gotaccount' => "Ou deja genyen yon kont ? '''$1'''.",
'gotaccountlink' => 'Idantifye ou',
'createaccountmail' => 'pa imèl',
+'createaccountreason' => 'Rezon:',
'badretype' => 'Mopas ou bay yo pa parèy ditou.',
'userexists' => 'Non itilizatè ou bay an deja itilize pa yon lòt moun. Chwazi yon lòt souple.',
'loginerror' => 'Erè nan idantifikasyon ou an',
@@ -564,6 +579,7 @@ Byen gade ke ou te byen ekri non ou, oubyen [[Special:UserLogin/signup|kreye yon
'wrongpasswordempty' => 'Ou pa antre mopas ou an. Eseye ankò.',
'passwordtooshort' => 'Mopas ou an twò kout. Li dwe genyen omwens {{PLURAL:$1|1 karaktè|$1 karaktè}}.',
'password-name-match' => 'Mopas ou dwe diferan ak non itilizatè ou.',
+'password-login-forbidden' => 'Nou pa gendwa pran non itilizatè ak mopas sa yo.',
'mailmypassword' => 'Voye mwen yon nouvo mopas pa imèl',
'passwordremindertitle' => 'Nouvo mopas tanporè, li pap dire (yon kout tan) pou pajwèb sa a {{SITENAME}}',
'passwordremindertext' => 'Kèk moun (ou menm oubyen yon moun ki genyen adrès IP sa a $1) mande pou nou voye w yon nouvo mopas pou {{SITENAME}} ($4).
@@ -595,6 +611,9 @@ Pa pòte atansyon pou mesaj sa si kont sa kreye pa erè.',
'loginlanguagelabel' => 'Lang : $1',
'suspicious-userlogout' => 'Demand ou te fè pou dekonekte w te refize paske sanble li te voye pa yon navigatè ki fè erè oubyen li soti nan yon proksi pou kach.',
+# E-mail sending
+'php-mail-error-unknown' => 'Erè nou pa konnen nan fonksyon mail() PHP a.',
+
# Password reset dialog
'resetpass' => 'Chanje mopas ou an',
'resetpass_announce' => 'Ou konekte ou ak yon mopas ki valab yon moman; mopas sa te voye pa imèl. Pou ou kapab fini anrejistreman an, ou dwe mete yon nouvo mopas la :',
@@ -643,11 +662,12 @@ Gendwa ou te deja modifye li oubyen ou te mande yon nouvo mopas tanporè.',
'showlivepreview' => 'Gade pou wè (Kout je rapid)',
'showdiff' => 'Montre chanjman yo',
'anoneditwarning' => "'''Pòte atansyon :''' ou pa konekte nan sistèm nan. Adrès IP ou a ap anrejistre nan istorik paj sa a.",
+'anonpreviewwarning' => "''Ou pa konekte. Anrejistre ap kenbe adrès IP ou a nan istorik paj sa a.''",
'missingsummary' => "'''Souple :''' ou poko bay rezime modifikasyon ou fè an
Si ou klike sou \"{{int:savearticle}}\" ankò, piblikasyon sa ap fèt san li bay lòt avètisman.",
'missingcommenttext' => 'Souple, ekri komantè ou an pli ba nan paj sa.',
'missingcommentheader' => "'''Pòte atansyon :''' ou pa bay komantè ou an yon sijè/tit .
-Si ou klike sou \"Pibliye\", edisyon ou an pap genyen yon tit.",
+Si ou klike sou \"{{int:savearticle}}\", modifikasyon ou an pap genyen yon tit.",
'summary-preview' => 'Kout je nan rezime an anvan li anrejistre:',
'subject-preview' => 'Yon kout je sou sijè/tit sa:',
'blockedtitle' => 'itilizatè a bloke.',
@@ -711,7 +731,11 @@ Dènye jounal pou blokaj yo parèt anba kòm referans:',
'usercsspreview' => "'''Sonje ke w ap voye yon kout je sou sa w ekri nan fèy CSS pa ou sa.'''
''Li poko anrejistre !'''",
'userjspreview' => "'''Sonje ke ou ap voye kout je sou fèy JavaScript ou ekri a, li poko anrejistre !'''",
-'userinvalidcssjstitle' => "'''Pòte atnasyon :''' estil \"\$1\" sa pa egziste. Raple ou ke paj pèsonèl ou yo ak ekstansyon .css epi .js ap itilize tit/sijè nan lèt miniskil, pa egzanp {{ns:user}}:Foo/monobook.css se pa {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Sonje ke w ap voye yon kout je sou sa w ekri nan fèy CSS sa a.'''
+'''Li poko anrejistre !'''",
+'sitejspreview' => "'''Sonje ke w ap voye yon kout je sou kòd JavaScript sa a.'''
+'''Li poko anrejistre !'''",
+'userinvalidcssjstitle' => "'''Pòte atansyon :''' estil \"\$1\" pa egziste. Paj pèsonalize ak ekstansyon .css epi .js yo ap itilize tit/sijè nan lèt miniskil, pa egzanp {{ns:user}}:Foo/vector.css se pa {{ns:user}}:Foo/Vector.css.",
'updated' => '(Li gen dènye vèsyon sou li)',
'note' => "'''Nòt :'''",
'previewnote' => "'''Atansyon, tèks sa a se yon kout je, li poko anrejistre !'''",
@@ -745,8 +769,6 @@ W ap pwomèt tou ke sa w ap ekri a se ou menm menm ki ekri li oubyen ke ou kopye
Si ou pa vle pou sa ou ekri pataje oubyen modifye, ou pa dwe soumèt li isit.<br />
W ap pwomèt tou ke sa w ap ekri a se ou menm menm ki ekri li oubyen ke ou kopye li de yon sous ki nan domèn piblik, ou byen you sous ki lib (gade $1 pou konnen pi plis).
'''PA ITILIZE TRAVAY KI ANBA DWA DOTÈ SI OTÈ PA T BAY OTORIZASYON LI TOUTBON !'''",
-'longpagewarning' => "'''AVÈTISMAN : paj sa a genyen yon gwosè ki pase $1 Kio ;
-Kèk bwozè (firefox,ie,opera,safari...) pa kapab afiche byen byen modifikasyon ki parèt nan paj ki genyen plis oubyen près 32 Kio. Oumèt dekoupe paj an nan 2 mòso oubyen ak seksyon pli piti.'''",
'longpageerror' => "'''ERÈ : Tèks ou anrejistre a ap fè $1 Ko, tay sa a depase kapasite limit nou kapab aksepte kounye a: $2 Ko. Nou pa kapab anrejistre tèks sa. Eseye ritounen nan paj ou te ye anvan pou kopye modifikasyon ou yo.'''",
'readonlywarning' => "'''Atansyon: Bazdone a bare pou fè travay sou li, kidonk ou pap kapab anrejistre modifikasyon ou yo kounye a.'''
Petèt ou ta renmen kopye-kole teks sa a nan yon fichye teks epi anrejistre l pou pita.
@@ -880,7 +902,7 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
'lineno' => 'Liy $1 :',
'compareselectedversions' => 'Konpare vèsyon ki seleksyone yo',
'editundo' => 'Revoke',
-'diff-multi' => '({{PLURAL:$1|Yon revizyon nan mitan evolisyon ki kache|$1 revizyon yo nan mitan evolisyon ki kache}})',
+'diff-multi' => '(Genyen {{PLURAL:$1|yon revizyon|$1 revizyon yo}} ki te fèt pa {{PLURAL:$2|yon itilizatè|$2 itilizatè yo}} nan mitan evolisyon ki kache)',
# Search results
'searchresults' => 'Rezilta yo pou rechèch la',
@@ -1115,7 +1137,6 @@ Gade tou [[Special:WantedCategories|kategori moun mande]].',
# Watchlist
'watchlist' => 'Lis swivi mwen',
'mywatchlist' => 'Lis swivi mwen',
-'watchlistfor' => "(pou itilizatè '''$1''')",
'addedwatch' => 'Ajoute nan lis swivi',
'addedwatchtext' => 'Paj « [[:$1]] » te byen ajoute nan [[Special:Watchlist|lis swivi ou an]].
Depi kounye a, tout modifikasyon nan paj sa a ak nan paj diskisyon li pral parèt <b>fonse</b> nan [[Special:RecentChanges|lis chanjman ki fèk fèt]] pou ou ka wè yo pi byen.',
@@ -1340,9 +1361,9 @@ Li pèmèt retabli vèsyon ki te anvan li epi ajoute yon rezon ki esplike poukis
'nextdiff' => 'Modifikasyon swivan →',
# Media information
-'file-info-size' => '($1 × $2 piksèl, lajè fichye a : $3, tip MIME li ye : $4)',
+'file-info-size' => '$1 × $2 piksèl, gwosè fichye a : $3, tip MIME li ye : $4',
'file-nohires' => '<small>Pa genyen rezolisyon ki pi wo ki disponib.</small>',
-'svg-long-desc' => '(Fichye SVG, rezolisyon pou de $1 × $2 piksèl, lajè : $3)',
+'svg-long-desc' => 'Fichye SVG, rezolisyon de $1 × $2 piksèl, gwosè fichye : $3',
'show-big-image' => 'Pi bon rezolisyon',
'show-big-image-thumb' => '<small>Lajè apèsi sa a : $1 × $2 piksèl</small>',
diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php
index 363bd59e..8a57c6aa 100644
--- a/languages/messages/MessagesHu.php
+++ b/languages/messages/MessagesHu.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Alquen
* @author Balasyum
* @author Bdamokos
* @author Bennó
@@ -20,6 +21,7 @@
* @author Gondnok
* @author Hunyadym
* @author KossuthRad
+ * @author Misibacsi
* @author Samat
* @author Terik
* @author Tgr
@@ -57,95 +59,96 @@ $namespaceAliases = array(
);
$fallback8bitEncoding = "iso8859-2";
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Kettős átirányítások', 'Dupla átirányítások' ),
- 'BrokenRedirects' => array( 'Nem létező lapra mutató átirányítások', 'Hibás átirányítások' ),
- 'Disambiguations' => array( 'Egyértelműsítő lapok' ),
+ 'DoubleRedirects' => array( 'Kettős_átirányítások', 'Dupla_átirányítások' ),
+ 'BrokenRedirects' => array( 'Nem_létező_lapra_mutató_átirányítások', 'Hibás_átirányítások' ),
+ 'Disambiguations' => array( 'Egyértelműsítő_lapok' ),
'Userlogin' => array( 'Belépés' ),
'Userlogout' => array( 'Kilépés' ),
- 'CreateAccount' => array( 'Szerkesztői fiók létrehozása', 'Felhasználói fiók létrehozása' ),
+ 'CreateAccount' => array( 'Szerkesztői_fiók_létrehozása', 'Felhasználói_fiók_létrehozása' ),
'Preferences' => array( 'Beállításaim' ),
'Watchlist' => array( 'Figyelőlistám' ),
- 'Recentchanges' => array( 'Friss változtatások' ),
+ 'Recentchanges' => array( 'Friss_változtatások' ),
'Upload' => array( 'Feltöltés' ),
- 'Listfiles' => array( 'Fájlok listája', 'Képek listája', 'Fájllista', 'Képlista' ),
- 'Newimages' => array( 'Új fájlok', 'Új képek', 'Új képek galériája' ),
- 'Listusers' => array( 'Szerkesztők listája', 'Szerkesztők', 'Felhasználók' ),
- 'Listgrouprights' => array( 'Szerkesztői csoportok jogai' ),
+ 'Listfiles' => array( 'Fájlok_listája', 'Képek_listája', 'Fájllista', 'Képlista' ),
+ 'Newimages' => array( 'Új_fájlok', 'Új_képek', 'Új_képek_galériája' ),
+ 'Listusers' => array( 'Szerkesztők_listája', 'Szerkesztők', 'Felhasználók' ),
+ 'Listgrouprights' => array( 'Szerkesztői_csoportok_jogai' ),
'Statistics' => array( 'Statisztika', 'Statisztikák' ),
- 'Randompage' => array( 'Lap találomra' ),
- 'Lonelypages' => array( 'Ãrva lapok', 'Magányos lapok' ),
- 'Uncategorizedpages' => array( 'Kategorizálatlan lapok' ),
- 'Uncategorizedcategories' => array( 'Kategorizálatlan kategóriák' ),
- 'Uncategorizedimages' => array( 'Kategorizálatlan fájlok', 'Kategorizálatlan képek' ),
- 'Uncategorizedtemplates' => array( 'Kategorizálatlan sablonok' ),
- 'Unusedcategories' => array( 'Nem használt kategóriák' ),
- 'Unusedimages' => array( 'Nem használt képek' ),
- 'Wantedpages' => array( 'Keresett lapok' ),
- 'Wantedcategories' => array( 'Keresett kategóriák' ),
- 'Wantedfiles' => array( 'Keresett fájlok' ),
- 'Wantedtemplates' => array( 'Keresett sablonok' ),
- 'Mostlinked' => array( 'Legtöbbet hivatkozott lapok' ),
- 'Mostlinkedcategories' => array( 'Legtöbbet hivatkozott kategóriák' ),
- 'Mostlinkedtemplates' => array( 'Legtöbbet hivatkozott sablonok' ),
- 'Mostimages' => array( 'Legtöbbet használt fájlok', 'Legtöbbet használt képek' ),
- 'Mostcategories' => array( 'Legtöbb kategóriába tartozó lapok' ),
- 'Mostrevisions' => array( 'Legtöbbet szerkesztett lapok' ),
- 'Fewestrevisions' => array( 'Legkevesebbet szerkesztett lapok' ),
- 'Shortpages' => array( 'Rövid lapok' ),
- 'Longpages' => array( 'Hosszú lapok' ),
- 'Newpages' => array( 'Új lapok' ),
- 'Ancientpages' => array( 'Régóta nem változott szócikkek' ),
+ 'Randompage' => array( 'Lap_találomra' ),
+ 'Lonelypages' => array( 'Ãrva_lapok', 'Magányos_lapok' ),
+ 'Uncategorizedpages' => array( 'Kategorizálatlan_lapok' ),
+ 'Uncategorizedcategories' => array( 'Kategorizálatlan_kategóriák' ),
+ 'Uncategorizedimages' => array( 'Kategorizálatlan_fájlok', 'Kategorizálatlan_képek' ),
+ 'Uncategorizedtemplates' => array( 'Kategorizálatlan_sablonok' ),
+ 'Unusedcategories' => array( 'Nem_használt_kategóriák' ),
+ 'Unusedimages' => array( 'Nem_használt_képek' ),
+ 'Wantedpages' => array( 'Keresett_lapok' ),
+ 'Wantedcategories' => array( 'Keresett_kategóriák' ),
+ 'Wantedfiles' => array( 'Keresett_fájlok' ),
+ 'Wantedtemplates' => array( 'Keresett_sablonok' ),
+ 'Mostlinked' => array( 'Legtöbbet_hivatkozott_lapok' ),
+ 'Mostlinkedcategories' => array( 'Legtöbbet_hivatkozott_kategóriák' ),
+ 'Mostlinkedtemplates' => array( 'Legtöbbet_hivatkozott_sablonok' ),
+ 'Mostimages' => array( 'Legtöbbet_használt_fájlok', 'Legtöbbet_használt_képek' ),
+ 'Mostcategories' => array( 'Legtöbb_kategóriába_tartozó_lapok' ),
+ 'Mostrevisions' => array( 'Legtöbbet_szerkesztett_lapok' ),
+ 'Fewestrevisions' => array( 'Legkevesebbet_szerkesztett_lapok' ),
+ 'Shortpages' => array( 'Rövid_lapok' ),
+ 'Longpages' => array( 'Hosszú_lapok' ),
+ 'Newpages' => array( 'Új_lapok' ),
+ 'Ancientpages' => array( 'Régóta_nem_változott_szócikkek' ),
'Deadendpages' => array( 'Zsákutcalapok' ),
- 'Protectedpages' => array( 'Védett lapok' ),
- 'Protectedtitles' => array( 'Védett címek' ),
- 'Allpages' => array( 'Az összes lap listája' ),
- 'Prefixindex' => array( 'Keresés előtag szerint' ),
- 'Ipblocklist' => array( 'Blokkolt IP-címek listája' ),
- 'Specialpages' => array( 'Speciális lapok' ),
- 'Contributions' => array( 'Szerkesztő közreműködései' ),
- 'Emailuser' => array( 'E-mail küldése', 'E-mail küldése ezen szerkesztőnek' ),
- 'Confirmemail' => array( 'Emailcím megerősítése' ),
- 'Whatlinkshere' => array( 'Mi hivatkozik erre' ),
- 'Recentchangeslinked' => array( 'Kapcsolódó változtatások' ),
- 'Movepage' => array( 'Lap átnevezése' ),
+ 'Protectedpages' => array( 'Védett_lapok' ),
+ 'Protectedtitles' => array( 'Védett_címek' ),
+ 'Allpages' => array( 'Az_összes_lap_listája' ),
+ 'Prefixindex' => array( 'Keresés_előtag_szerint' ),
+ 'Ipblocklist' => array( 'Blokkolt_IP-címek_listája' ),
+ 'Unblock' => array( 'Blokkolás_feloldása' ),
+ 'Specialpages' => array( 'Speciális_lapok' ),
+ 'Contributions' => array( 'Szerkesztő_közreműködései' ),
+ 'Emailuser' => array( 'E-mail_küldése', 'E-mail_küldése_ezen_szerkesztőnek' ),
+ 'Confirmemail' => array( 'Emailcím_megerősítése' ),
+ 'Whatlinkshere' => array( 'Mi_hivatkozik_erre' ),
+ 'Recentchangeslinked' => array( 'Kapcsolódó_változtatások' ),
+ 'Movepage' => array( 'Lap_átnevezése' ),
'Blockme' => array( 'Blokkolj' ),
'Booksources' => array( 'Könyvforrások' ),
'Categories' => array( 'Kategóriák' ),
- 'Export' => array( 'Lapok exportálása' ),
+ 'Export' => array( 'Lapok_exportálása' ),
'Version' => array( 'Névjegy', 'Verziószám', 'Verzió' ),
'Allmessages' => array( 'Rendszerüzenetek' ),
'Log' => array( 'Rendszernaplók', 'Naplók', 'Napló' ),
'Blockip' => array( 'Blokkolás' ),
- 'Undelete' => array( 'Törölt lapváltozatok visszaállítása' ),
- 'Import' => array( 'Lapok importálása' ),
- 'Lockdb' => array( 'Adatbázis lezárása' ),
- 'Unlockdb' => array( 'Adatbázis lezárás feloldása' ),
- 'Userrights' => array( 'Szerkesztők jogai', 'Szerkesztői jogok', 'Szerkesztőjogok', 'Szerkesztő jogai' ),
- 'MIMEsearch' => array( 'Keresés MIME-típus alapján' ),
- 'FileDuplicateSearch' => array( 'Duplikátumok keresése' ),
- 'Unwatchedpages' => array( 'Nem figyelt lapok' ),
- 'Listredirects' => array( 'Ãtirányítások listája' ),
- 'Revisiondelete' => array( 'Változat törlése' ),
- 'Unusedtemplates' => array( 'Nem használt sablonok' ),
- 'Randomredirect' => array( 'Ãtirányítás találomra' ),
+ 'Undelete' => array( 'Törölt_lapváltozatok_visszaállítása' ),
+ 'Import' => array( 'Lapok_importálása' ),
+ 'Lockdb' => array( 'Adatbázis_lezárása' ),
+ 'Unlockdb' => array( 'Adatbázis_lezárás_feloldása' ),
+ 'Userrights' => array( 'Szerkesztők_jogai', 'Szerkesztői_jogok', 'Szerkesztőjogok', 'Szerkesztő_jogai' ),
+ 'MIMEsearch' => array( 'Keresés_MIME-típus_alapján' ),
+ 'FileDuplicateSearch' => array( 'Duplikátumok_keresése' ),
+ 'Unwatchedpages' => array( 'Nem_figyelt_lapok' ),
+ 'Listredirects' => array( 'Ãtirányítások_listája' ),
+ 'Revisiondelete' => array( 'Változat_törlése' ),
+ 'Unusedtemplates' => array( 'Nem_használt_sablonok' ),
+ 'Randomredirect' => array( 'Ãtirányítás_találomra' ),
'Mypage' => array( 'Lapom', 'Userlapom' ),
'Mytalk' => array( 'Vitám', 'Vitalapom', 'Uservitalapom' ),
'Mycontributions' => array( 'Közreműködéseim' ),
- 'Listadmins' => array( 'Adminisztrátorok', 'Adminisztrátorok listája', 'Sysopok' ),
- 'Listbots' => array( 'Botok', 'Botok listája' ),
- 'Popularpages' => array( 'Népszerű oldalak' ),
+ 'Listadmins' => array( 'Adminisztrátorok', 'Adminisztrátorok_listája', 'Sysopok' ),
+ 'Listbots' => array( 'Botok', 'Botok_listája' ),
+ 'Popularpages' => array( 'Népszerű_oldalak' ),
'Search' => array( 'Keresés' ),
'Resetpass' => array( 'Jelszócsere' ),
- 'Withoutinterwiki' => array( 'Nyelvközi hivatkozás nélküli lapok', 'Wikiközi hivatkozás nélküli lapok', 'Interwikilinkek nélküli lapok' ),
- 'MergeHistory' => array( 'Laptörténetek egyesítése', 'Laptörténet-egyesítés' ),
- 'Filepath' => array( 'Fájl elérési útja', 'Fájl elérési út' ),
- 'Invalidateemail' => array( 'E-mail cím érvénytelenítése' ),
- 'Blankpage' => array( 'Ãœres lap' ),
- 'LinkSearch' => array( 'Hivatkozás keresés' ),
- 'DeletedContributions' => array( 'Törölt szerkesztések' ),
+ 'Withoutinterwiki' => array( 'Nyelvközi_hivatkozás_nélküli_lapok', 'Wikiközi_hivatkozás_nélküli_lapok', 'Interwikilinkek_nélküli_lapok' ),
+ 'MergeHistory' => array( 'Laptörténetek_egyesítése', 'Laptörténet-egyesítés' ),
+ 'Filepath' => array( 'Fájl_elérési_útja', 'Fájl_elérési_út' ),
+ 'Invalidateemail' => array( 'E-mail_cím_érvénytelenítése' ),
+ 'Blankpage' => array( 'Ãœres_lap' ),
+ 'LinkSearch' => array( 'Hivatkozás_keresés' ),
+ 'DeletedContributions' => array( 'Törölt_szerkesztések' ),
'Tags' => array( 'Címkék' ),
);
@@ -309,8 +312,7 @@ $messages = array(
'tog-editsection' => '[szerkesztés] linkek az egyes szakaszok szerkesztéséhez',
'tog-editsectiononrightclick' => 'Szakaszok szerkesztése a szakaszcímre való jobb kattintással (JavaScript-alapú)',
'tog-showtoc' => 'Tartalomjegyzék megjelenítése a három fejezetnél többel rendelkező cikkeknél',
-'tog-rememberpassword' => 'Emlékezzen rám ezen a számítógépen',
-'tog-editwidth' => 'Teljes szélességű szerkesztőablak',
+'tog-rememberpassword' => 'Emlékezzen rám ezzel a böngészővel (legfeljebb $1 napig)',
'tog-watchcreations' => 'Az általam létrehozott lapok felvétele a figyelőlistára',
'tog-watchdefault' => 'Az általam szerkesztett lapok felvétele a figyelőlistára',
'tog-watchmoves' => 'Az általam átnevezett lapok felvétele a figyelőlistára',
@@ -455,31 +457,21 @@ $messages = array(
'faqpage' => 'Project:GyIK',
# Vector skin
-'vector-action-addsection' => 'Új szakasz nyitása',
-'vector-action-delete' => 'Törlés',
-'vector-action-move' => 'Ãtnevezés',
-'vector-action-protect' => 'Lapvédelem',
-'vector-action-undelete' => 'Visszaállítás',
-'vector-action-unprotect' => 'Védelem feloldása',
-'vector-namespace-category' => 'Kategória',
-'vector-namespace-help' => 'Segítséglap',
-'vector-namespace-image' => 'Fájl',
-'vector-namespace-main' => 'Szócikk',
-'vector-namespace-media' => 'Médialap',
-'vector-namespace-mediawiki' => 'Rendszerüzenet',
-'vector-namespace-project' => 'Projektlap',
-'vector-namespace-special' => 'Speciális lap',
-'vector-namespace-talk' => 'Megbeszélés',
-'vector-namespace-template' => 'Sablon',
-'vector-namespace-user' => 'Szerkesztői lap',
-'vector-view-create' => 'Létrehozás',
-'vector-view-edit' => 'Szerkesztés',
-'vector-view-history' => 'Laptörténet',
-'vector-view-view' => 'Olvasás',
-'vector-view-viewsource' => 'A lap forrása',
-'actions' => 'Műveletek',
-'namespaces' => 'Névterek',
-'variants' => 'Változók',
+'vector-action-addsection' => 'Új szakasz nyitása',
+'vector-action-delete' => 'Törlés',
+'vector-action-move' => 'Ãtnevezés',
+'vector-action-protect' => 'Lapvédelem',
+'vector-action-undelete' => 'Visszaállítás',
+'vector-action-unprotect' => 'Védelem feloldása',
+'vector-simplesearch-preference' => 'Továbbfejlesztett keresési javaslatok engedélyezése (csak Vector felületen)',
+'vector-view-create' => 'Létrehozás',
+'vector-view-edit' => 'Szerkesztés',
+'vector-view-history' => 'Laptörténet',
+'vector-view-view' => 'Olvasás',
+'vector-view-viewsource' => 'A lap forrása',
+'actions' => 'Műveletek',
+'namespaces' => 'Névterek',
+'variants' => 'Változók',
'errorpagetitle' => 'Hiba',
'returnto' => 'Vissza a(z) $1 laphoz.',
@@ -540,6 +532,9 @@ Túl sok felhasználó próbálta megtekinteni ezt az oldalt.
Kérlek, várj egy kicsit, mielőtt újrapróbálkoznál a lap megtekintésével.
$1',
+'pool-timeout' => 'Letelt a várakozási idő a zároláshoz',
+'pool-queuefull' => 'A pool sor megtelt',
+'pool-errorunknown' => 'Ismeretlen hiba',
# 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' => 'A {{SITENAME}} wikiről',
@@ -700,7 +695,8 @@ Ne felejtsd el átnézni a [[Special:Preferences|személyes beállításaidat]].
'yourname' => 'Szerkesztőneved:',
'yourpassword' => 'Jelszavad:',
'yourpasswordagain' => 'Jelszavad ismét:',
-'remembermypassword' => 'Ne léptessen ki a böngésző bezárásakor.',
+'remembermypassword' => 'Emlékezzen rám ezen a számítógépen (legfeljebb $1 napig)',
+'securelogin-stick-https' => 'Kapcsolódás HTTPS-en keresztül bejelentkezés után is',
'yourdomainname' => 'A domainneved:',
'externaldberror' => 'Hiba történt a külső adatbázis hitelesítése közben, vagy nem vagy jogosult a külső fiókod frissítésére.',
'login' => 'Bejelentkezés',
@@ -717,6 +713,7 @@ Ne felejtsd el átnézni a [[Special:Preferences|személyes beállításaidat]].
'gotaccount' => "Ha már korábban regisztráltál, '''$1'''!",
'gotaccountlink' => 'Bejelentkezés',
'createaccountmail' => 'e-mailben',
+'createaccountreason' => 'Indoklás:',
'badretype' => 'A megadott jelszavak nem egyeznek.',
'userexists' => 'A megadott szerkesztőnév már foglalt.
Kérlek, válassz másikat!',
@@ -728,7 +725,7 @@ Nálad ezek le vannak tiltva.
Engedélyezd őket, majd próbáld meg újra.',
'noname' => 'Érvénytelen szerkesztőnevet adtál meg.',
'loginsuccesstitle' => 'Sikeres bejelentkezés',
-'loginsuccess' => "'''Most már be vagy jelentkezve a(z) {{SITENAME}} wikibe „$1†néven.'''",
+'loginsuccess' => "'''Sikeresen bejelentkeztél a(z) {{SITENAME}} wikibe „$1†néven.'''",
'nosuchuser' => 'Nem létezik „$1†nevű szerkesztő.
A szerkesztőnevek kis- és nagybetű-érzékenyek.
Ellenőrizd, hogy helyesen írtad-e be, vagy [[Special:UserLogin/signup|hozz létre egy új fiókot]].',
@@ -740,6 +737,7 @@ Ellenőrizd, hogy helyesen írtad-e be.',
'wrongpasswordempty' => 'Nem adtál meg jelszót. Próbáld meg újra.',
'passwordtooshort' => 'A jelszónak legalább {{PLURAL:$1|egy|$1}} karakterből kell állnia.',
'password-name-match' => 'A jelszavadnak különböznie kell a szerkesztőnevedtől.',
+'password-login-forbidden' => 'Ezen felhasználónév és jelszó használata tiltott.',
'mailmypassword' => 'Új jelszó küldése e-mailben',
'passwordremindertitle' => 'Ideiglenes jelszó a(z) {{SITENAME}} wikire',
'passwordremindertext' => 'Valaki (vélhetően te, a(z) $1 IP-címről) új jelszót kért a(z)
@@ -779,6 +777,9 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
'loginlanguagelabel' => 'Nyelv: $1',
'suspicious-userlogout' => 'A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
+
# Password reset dialog
'resetpass' => 'Jelszó módosítása',
'resetpass_announce' => 'Az e-mailben elküldött ideiglenes kóddal jelentkeztél be. A bejelentkezés befejezéséhez meg kell megadnod egy új jelszót:',
@@ -830,10 +831,11 @@ Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben
'showlivepreview' => 'Élő előnézet',
'showdiff' => 'Változtatások megtekintése',
'anoneditwarning' => "'''Figyelem:''' Nem vagy bejelentkezve, ha szerkesztesz, az IP-címed látható lesz a laptörténetben.",
+'anonpreviewwarning' => "''Nem vagy bejelentkezve. A mentéskor az IP-címed rögzítve lesz a laptörténetben.''",
'missingsummary' => "'''Emlékeztető:''' Nem adtál meg szerkesztési összefoglalót. Ha összefoglaló nélkül akarod elküldeni a szöveget, kattints újra a mentésre.",
'missingcommenttext' => 'Kérjük, hogy írj összefoglalót szerkesztésedhez.',
'missingcommentheader' => "'''Emlékeztető:''' Nem adtad meg a megjegyzés tárgyát vagy címét.
-Ha ismét a Mentés gombra kattintasz, akkor a szerkesztésed nélküle kerül mentésre.",
+Ha ismét a „{{int:savearticle}}†gombra kattintasz, akkor a szerkesztésed nélküle kerül mentésre.",
'summary-preview' => 'A szerkesztési összefoglaló előnézete:',
'subject-preview' => 'A téma/főcím előnézete:',
'blockedtitle' => 'A szerkesztő blokkolva van',
@@ -910,7 +912,11 @@ A blokkolási napló legutóbbi ide vonatkozó bejegyzése a következő:',
'userjsyoucanpreview' => "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}†gombot az új JavaScipted teszteléséhez.",
'usercsspreview' => "'''Ne felejtsd el, hogy ez csak a felhasználói CSS-ed előnézete és még nincs elmentve!'''",
'userjspreview' => "'''Ne felejtsd el, hogy még csak teszteled a felhasználói JavaScriptedet, és még nincs elmentve!'''",
-'userinvalidcssjstitle' => "'''Figyelem:''' Nincs „$1†nevű felület. A felületekhez tartozó .css/.js oldalak kisbetűvel kezdődnek, például ''{{ns:user}}:Gipsz Jakab/monobook.css'' és nem ''{{ns:user}}:Gipsz Jakab/Monobook.css''.",
+'sitecsspreview' => "'''Ne feledd, hogy csak a CSS előnézetét látod.'''
+'''Még nincs elmentve!'''",
+'sitejspreview' => "'''Ne feledd, hogy a JavaScript-kódnak csak az előnézetét látod.'''
+'''Még nincs elmentve!'''",
+'userinvalidcssjstitle' => "'''Figyelem:''' Nincs „$1†nevű felület. A felületekhez tartozó .css/.js oldalak kisbetűvel kezdődnek, például ''{{ns:user}}:Gipsz Jakab/vector.css'' és nem ''{{ns:user}}:Gipsz Jakab/Vector.css''.",
'updated' => '(frissítve)',
'note' => "'''Megjegyzés:'''",
'previewnote' => "'''Ne feledd, hogy ez csak előnézet, a változtatásaid még nincsenek elmentve!'''",
@@ -948,9 +954,6 @@ Azt is megígéred, hogy ezt magadtól írtad, vagy egy közkincsből vagy más
Ha nem akarod, hogy az írásodat módosítsák, akkor ne küldd be.<br />
Azt is megígéred, hogy ezt magadtól írtad, vagy egy közkincsből vagy más szabad forrásból másoltad (lásd a(z) $1 lapot a részletekért).
'''NE KÃœLDJ BE JOGVÉDETT MUNKÃT ENGEDÉLY NÉLKÃœL!'''",
-'longpagewarning' => "'''FIGYELEM: Ez a lap $1 kilobájt hosszú;
-néhány böngészőnek problémát okoz a 32 kB-os vagy nagyobb lapok szerkesztése.
-Fontold meg a lap kisebb szakaszokra bontását.'''",
'longpageerror' => "'''HIBA: Az általad beküldött szöveg $1 kilobájt hosszú, ami több az engedélyezett $2 kilobájtnál.
A szerkesztést nem lehet elmenteni.'''",
'readonlywarning' => "'''FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet.
@@ -1128,6 +1131,8 @@ $1",
'logdelete-failure' => "'''Nem sikerült módosítani a naplóbejegyzés láthatóságát:'''
$1",
'revdel-restore' => 'Láthatóság megváltoztatása',
+'revdel-restore-deleted' => 'törölt lapváltozatok',
+'revdel-restore-visible' => 'látható lapváltozatok',
'pagehist' => 'Laptörténet',
'deletedhist' => 'Törölt változatok',
'revdelete-content' => 'a tartalmát',
@@ -1191,11 +1196,13 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
# Diffs
'history-title' => 'A(z) „$1†laptörténete',
'difference' => '(Változatok közti eltérés)',
+'difference-multipage' => '(Lapok közti eltérés)',
'lineno' => '$1. sor:',
'compareselectedversions' => 'Kiválasztott változatok összehasonlítása',
'showhideselectedversions' => 'Kiválasztott változatok láthatóságának beállítása',
'editundo' => 'visszavonás',
-'diff-multi' => '({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva)',
+'diff-multi' => '({{PLURAL:$2|egy|$2}} szerkesztő {{PLURAL:$1|egy|$1}} közbeeső változata nincs mutatva)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)',
# Search results
'searchresults' => 'A keresés eredménye',
@@ -1230,6 +1237,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
'searchprofile-everything-tooltip' => 'Minden névtérben keres (a vitalapokat is beleértve)',
'searchprofile-advanced-tooltip' => 'Keresés adott névterekben',
'search-result-size' => '$1 ({{PLURAL:$2|egy|$2}} szó)',
+'search-result-category-size' => '$1 oldal, $2 alkategória, $3 fájl',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(átirányítva innen: $1)',
'search-section' => '($1 szakasz)',
@@ -1304,6 +1312,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
'contextlines' => 'Találatonként mutatott sorok száma:',
'contextchars' => 'Soronkénti szövegkörnyezet (karakterszám):',
'stub-threshold' => 'A hivatkozások <a href="#" class="stub">csonkként</a> történő formázásának határa (bájtban):',
+'stub-threshold-disabled' => 'Kikapcsolva',
'recentchangesdays' => 'A friss változtatásokban mutatott napok száma:',
'recentchangesdays-max' => '(maximum {{PLURAL:$1|egy|$1}} nap)',
'recentchangescount' => 'Az alapértelmezettként mutatott szerkesztések száma:',
@@ -1337,6 +1346,7 @@ Itt van egy véletlenszerűen generált érték, amit használhatsz: $1',
'prefs-files' => 'Fájlok',
'prefs-custom-css' => 'saját CSS',
'prefs-custom-js' => 'saját JS',
+'prefs-common-css-js' => 'Közös CSS/JS az összes felület számára:',
'prefs-reset-intro' => 'Ezen a lapon állíthatod vissza a beállításaidat az oldal alapértelmezett értékeire.
A műveletet nem lehet visszavonni.',
'prefs-emailconfirm-label' => 'E-mail cím megerősítése:',
@@ -1374,9 +1384,15 @@ Ezen kívül más szerkesztők is kapcsolatba lépjenek veled a szerkesztői vag
'prefs-advancedrendering' => 'Haladó beállítások',
'prefs-advancedsearchoptions' => 'Haladó beállítások',
'prefs-advancedwatchlist' => 'Haladó beállítások',
-'prefs-display' => 'Megjelenítési beállítások',
+'prefs-displayrc' => 'Megjelenítési beállítások',
+'prefs-displaysearchoptions' => 'Megjelenítési beállítások',
+'prefs-displaywatchlist' => 'Megjelenítési beállítások',
'prefs-diffs' => 'Eltérések (diffek)',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Az e-mail cím érvényesnek tűnik',
+'email-address-validity-invalid' => 'Ãrj be egy érvényes e-mail címet',
+
# User rights
'userrights' => 'Szerkesztői jogok beállítása',
'userrights-lookup-user' => 'Szerkesztőcsoportok beállítása',
@@ -1459,6 +1475,7 @@ Ezen kívül más szerkesztők is kapcsolatba lépjenek veled a szerkesztői vag
'right-hideuser' => 'felhasználói név blokkolása és elrejtése a külvilág elől',
'right-ipblock-exempt' => 'IP-, auto- és tartományblokkok megkerülése',
'right-proxyunbannable' => 'proxyk automatikus blokkjainak megkerülése',
+'right-unblockself' => 'saját felhasználói fiók blokkjának feloldása',
'right-protect' => 'védelmi szintek megváltoztatása és védett lapok szerkesztése',
'right-editprotected' => 'kaszkád védelem nélküli védett lapok szerkesztése',
'right-editinterface' => 'felhasználói felület szerkesztése',
@@ -1481,7 +1498,6 @@ Ezen kívül más szerkesztők is kapcsolatba lépjenek veled a szerkesztői vag
'right-siteadmin' => 'adatbázis lezárása, felnyitása',
'right-reset-passwords' => 'Más felhasználók jelszavának visszaállítása',
'right-override-export-depth' => 'Lapok exportálása a hivatkozott lapokkal együtt, legfeljebb 5-ös mélységig',
-'right-versiondetail' => 'kibővített szoftververzió-információk tekintése',
'right-sendemail' => 'e-mail küldése más felhasználóknak',
# User rights log
@@ -1532,14 +1548,9 @@ Ezen kívül más szerkesztők is kapcsolatba lépjenek veled a szerkesztői vag
'recentchanges-legend' => 'A friss változások beállításai',
'recentchangestext' => 'Ezen a lapon a wikiben történt legutóbbi változásokat lehet nyomonkövetni.',
'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
-'recentchanges-label-legend' => 'Jelmagyarázat: $1.',
-'recentchanges-legend-newpage' => '$1 – új lap',
'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
-'recentchanges-legend-minor' => '$1 – apró szerkesztés',
'recentchanges-label-minor' => 'Ez egy apró szerkesztés',
-'recentchanges-legend-bot' => '$1 – botszerkesztés',
'recentchanges-label-bot' => 'Ezt a szerkesztést egy bot hajtotta végre',
-'recentchanges-legend-unpatrolled' => '$1 – nem ellenőrzött szerkesztés',
'recentchanges-label-unpatrolled' => 'Ezt a szerkesztést még nem ellenőrizték',
'rcnote' => "Alább az utolsó '''{{PLURAL:$2|egy|$2}}''' nap utolsó '''{{PLURAL:$1|egy|$1}}''' változtatása látható. A lap generálásának időpontja $4, $5.",
'rcnotefrom' => 'Alább a <b>$2</b> óta történt változások láthatóak (<b>$1</b> db).',
@@ -1586,6 +1597,9 @@ A [[Special:Watchlist|figyelőlistádon]] szereplő lapok '''félkövérrel''' v
'upload_directory_missing' => 'A feltöltési könyvtár ($1) nem létezik vagy nem tudja létrehozni a kiszolgáló.',
'upload_directory_read_only' => 'A kiszolgálónak nincs írási jogosultsága a feltöltési könyvtárban ($1).',
'uploaderror' => 'Feltöltési hiba',
+'upload-recreate-warning' => "'''Figyelmeztetés: az ilyen nevű fájlt törölték vagy átnevezték.'''
+
+Az oldalhoz tartozó törlési és átnevezési naplóbejegyzések:",
'uploadtext' => "Az alábbi űrlap használatával tölthetsz fel fájlokat.
A korábban feltöltött képek megtekintéséhez vagy a köztük való kereséshez menj a [[Special:FileList|feltöltött fájlok listájához]], a feltöltések, újrafeltöltések a [[Special:Log/upload|feltöltési naplóban]], a törlések a [[Special:Log/delete|törlési naplóban]] vannak jegyezve.
@@ -1619,6 +1633,17 @@ Az ajánlott {{PLURAL:$3|típus|típusok}}: $2.",
'filetype-banned-type' => "A(z) '''„.$1â€''' nem megengedett fájltípus.
Az engedélyezett {{PLURAL:$3|típus|típusok}}: $2.",
'filetype-missing' => 'A fájlnak nincs kiterjesztése (pl. „.jpgâ€).',
+'empty-file' => 'Az elküldött fájl üres volt.',
+'file-too-large' => 'Az elküldött fájl túl nagy volt.',
+'filename-tooshort' => 'A fájlnév túl rövid.',
+'filetype-banned' => 'Az ilyen típusú fájlok tiltva vannak.',
+'verification-error' => 'Ez a fájl nem felelt meg az ellenőrzésen (hibás, rossz kiterjesztés, stb.).',
+'hookaborted' => 'A módosítást, amit próbáltál elvégezni megszakította egy kiterjesztés-hook.',
+'illegal-filename' => 'A fájlnév nem engedélyezett.',
+'overwrite' => 'Nem engedélyezett felülírni egy létező fájlt.',
+'unknown-error' => 'Ismeretlen hiba történt.',
+'tmp-create-error' => 'Nem sikerült létrehozni az ideiglenes fájlt.',
+'tmp-write-error' => 'Hiba az ideiglenes fájl írásakor.',
'large-file' => 'Javasoljuk, hogy ne tölts fel olyan fájlokat, melyek nagyobbak, mint $1;
ez a fájl $2.',
'largefileserver' => 'A fájl mérete meghaladja a kiszolgálón beállított maximális értéket.',
@@ -1646,13 +1671,14 @@ Ha még mindig fel szeretnéd tölteni a fájlt, menj vissza, és adj meg egy ú
'fileexists-shared-forbidden' => 'Egy ugyanilyen nevű fájl már létezik a közös fájlmegosztóban; kérlek menj vissza és válassz egy másik nevet a fájlnak, ha még mindig fel akarod tölteni! [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ez a következő {{PLURAL:$1|fájl|fájlok}} duplikátuma:',
'file-deleted-duplicate' => 'Egy ehhez hasonló fájlt ([[:$1]]) korábban már töröltek. Ellenőrizd a fájl törlési naplóját, mielőtt újra feltöltenéd.',
-'successfulupload' => 'A feltöltés sikerült',
'uploadwarning' => 'Feltöltési figyelmeztetés',
'uploadwarning-text' => 'Kérlek módosítsd a fájl leírását alább, majd próbáld újra.',
'savefile' => 'Fájl mentése',
'uploadedimage' => '„[[$1]]†felküldve',
'overwroteimage' => 'feltöltötte a(z) „[[$1]]†fájl új változatát',
'uploaddisabled' => 'Feltöltések kikapcsolva',
+'copyuploaddisabled' => 'A feltöltés URL alapján le van tiltva.',
+'uploadfromurl-queued' => 'A feltöltésed a várakozási sorba került.',
'uploaddisabledtext' => 'A fájlfeltöltés nem engedélyezett.',
'php-uploaddisabledtext' => 'A PHP-s fájlfeltöltés le van tiltva. Ellenőrizd a file_uploads beállítást.',
'uploadscripted' => 'Ez a fájl olyan HTML- vagy parancsfájlkódot tartalmaz, melyet tévedésből egy webböngésző esetleg értelmezni próbálhatna.',
@@ -1684,6 +1710,14 @@ JD # Jenoptik
MGP # Pentax
PICT # ált.
#</pre> <!-- ezt a sort hagyd így -->',
+'upload-success-subj' => 'A feltöltés sikerült',
+'upload-success-msg' => 'A feltöltés (innen $2) sikeres volt. A feltöltésed itt érhető el: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Feltöltési hiba',
+'upload-failure-msg' => 'Probléma történt a feltöltéseddel (innen: $2):
+
+$1',
+'upload-warning-subj' => 'Feltöltési figyelmeztetés',
+'upload-warning-msg' => 'Hiba történt a feltöltéseddel innen: [$2]. Visszatérhetsz a [[Special:Upload/stash/$1|feltöltéshez]], hogy orvosold a hibát.',
'upload-proto-error' => 'Hibás protokoll',
'upload-proto-error-text' => 'A távoli feltöltéshez <code>http://</code> vagy <code>ftp://</code> kezdetű URL-ekre van szükség.',
@@ -1743,6 +1777,7 @@ Az oszlopok címeire kattintva változtathatod meg a rendezést.',
'listfiles_search_for' => 'Keresés fájl nevére:',
'imgfile' => 'fájl',
'listfiles' => 'Fájllista',
+'listfiles_thumb' => 'Bélyegkép',
'listfiles_date' => 'Dátum',
'listfiles_name' => 'Név',
'listfiles_user' => 'feltöltő',
@@ -1856,8 +1891,8 @@ Ellenőrizd a meglévő hivatkozásokat, mielőtt törölnéd őket.',
'statistics-edits' => 'Szerkesztések száma a(z) {{SITENAME}} indulása óta',
'statistics-edits-average' => 'Szerkesztések átlagos száma laponként',
'statistics-views-total' => 'Összes megtekintés',
+'statistics-views-total-desc' => 'A nem létező és speciális lapok megtekintési adatai nincsenek beleszámolva.',
'statistics-views-peredit' => 'Megtekintések szerkesztésenként',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue A szerver által végrehajtandó feladatok] száma',
'statistics-users' => 'Regisztrált [[Speciális:Szerkesztők listája|szerkesztők]]',
'statistics-users-active' => 'Aktív szerkesztők',
'statistics-users-active-desc' => 'Szerkesztők, akik csináltak valamit az elmúlt {{PLURAL:$1|egy|$1}} napban',
@@ -1872,7 +1907,7 @@ Egy oldal egyértelműsítő lapnak számít, ha tartalmazza a [[MediaWiki:Disam
'doubleredirects' => 'Dupla átirányítások',
'doubleredirectstext' => 'Ez a lap azokat a lapokat listázza, melyek átirányító lapokra irányítanak át.
Minden sor tartalmaz egy hivatkozást az első, valamint a második átirányításra, valamint a második átirányítás céljára, ami általában a valódi céllap, erre kellene az első átirányításnak mutatnia.
-Az <s>áthúzott</s> sorok a lista elkészülése óta javítva lettek.',
+Az <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.',
'double-redirect-fixed-move' => '[[$1]] átnevezve, a továbbiakban átirányításként működik a(z) [[$2]] lapra',
'double-redirect-fixer' => 'Ãtirányításjavító',
@@ -1895,6 +1930,8 @@ Az <s>áthúzott</s> sorok a lista elkészülése óta javítva lettek.',
'nmembers' => '{{PLURAL:$1|egy|$1}} elem',
'nrevisions' => '{{PLURAL:$1|egy|$1}} változat',
'nviews' => '{{PLURAL:$1|egy|$1}} megtekintés',
+'nimagelinks' => '{{PLURAL:$1|Egy|$1}} lapon van használva',
+'ntransclusions' => '{{PLURAL:$1|egy|$1}} lapon van használva',
'specialpage-empty' => 'Ez az oldal üres.',
'lonelypages' => 'Ãrva lapok',
'lonelypagestext' => 'A következő lapok nincsenek linkelve vagy beillesztve más lapokra a(z) {{SITENAME}} wikin.',
@@ -2052,34 +2089,40 @@ Az egyes csoportokról további információt [[{{MediaWiki:Listgrouprights-help
'listgrouprights-removegroup-self-all' => 'az összes csoporból eltávolíthatja a saját fiókját',
# E-mail user
-'mailnologin' => 'Nincs feladó',
-'mailnologintext' => 'Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].',
-'emailuser' => 'E-mail küldése ezen szerkesztőnek',
-'emailpage' => 'E-mail küldése',
-'emailpagetext' => 'A szerkesztő e-mail-címére ezen űrlap kitöltésével üzenetet tudsz küldeni.
+'mailnologin' => 'Nincs feladó',
+'mailnologintext' => 'Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].',
+'emailuser' => 'E-mail küldése ezen szerkesztőnek',
+'emailpage' => 'E-mail küldése',
+'emailpagetext' => 'A szerkesztő e-mail-címére ezen űrlap kitöltésével üzenetet tudsz küldeni.
Feladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címed fog szerepelni, így a címzett közvetlenül neked tud majd válaszolni.',
-'usermailererror' => 'A levélküldő objektum hibával tért vissza:',
-'defemailsubject' => '{{SITENAME}} e-mail',
-'noemailtitle' => 'Nincs e-mail cím',
-'noemailtext' => 'Ez a szerkesztő nem adott meg érvényes e-mail címet.',
-'nowikiemailtitle' => 'Nem küldhető e-mail üzenet',
-'nowikiemailtext' => 'Ez a szerkesztő nem kíván másoktól e-mail üzeneteket fogadni.',
-'email-legend' => 'E-mail küldése egy másik {{SITENAME}}-szerkesztőnek',
-'emailfrom' => 'Feladó:',
-'emailto' => 'Címzett:',
-'emailsubject' => 'Téma:',
-'emailmessage' => 'Ãœzenet:',
-'emailsend' => 'Küldés',
-'emailccme' => 'Az üzenet másolatát küldje el nekem is e-mailben.',
-'emailccsubject' => '$1 szerkesztőnek küldött $2 tárgyú üzenet másolata',
-'emailsent' => 'E-mail elküldve',
-'emailsenttext' => 'Az e-mail üzenetedet elküldtem.',
-'emailuserfooter' => 'Ezt az e-mailt $1 küldte $2 számára, az „E-mail küldése ezen szerkesztőnek†funkció használatával a(z) {{SITENAME}} wikin.',
+'usermailererror' => 'A levélküldő objektum hibával tért vissza:',
+'defemailsubject' => '{{SITENAME}} e-mail',
+'usermaildisabled' => 'Email fogadás letiltva',
+'usermaildisabledtext' => 'Nem küldhetsz emailt más felhasználóknak ezen a wikin',
+'noemailtitle' => 'Nincs e-mail cím',
+'noemailtext' => 'Ez a szerkesztő nem adott meg érvényes e-mail címet.',
+'nowikiemailtitle' => 'Nem küldhető e-mail üzenet',
+'nowikiemailtext' => 'Ez a szerkesztő nem kíván másoktól e-mail üzeneteket fogadni.',
+'email-legend' => 'E-mail küldése egy másik {{SITENAME}}-szerkesztőnek',
+'emailfrom' => 'Feladó:',
+'emailto' => 'Címzett:',
+'emailsubject' => 'Téma:',
+'emailmessage' => 'Ãœzenet:',
+'emailsend' => 'Küldés',
+'emailccme' => 'Az üzenet másolatát küldje el nekem is e-mailben.',
+'emailccsubject' => '$1 szerkesztőnek küldött $2 tárgyú üzenet másolata',
+'emailsent' => 'E-mail elküldve',
+'emailsenttext' => 'Az e-mail üzenetedet elküldtem.',
+'emailuserfooter' => 'Ezt az e-mailt $1 küldte $2 számára, az „E-mail küldése ezen szerkesztőnek†funkció használatával a(z) {{SITENAME}} wikin.',
+
+# User Messenger
+'usermessage-summary' => 'Rendszerüzenet megadása.',
+'usermessage-editor' => 'Rendszerüzenetek',
# Watchlist
'watchlist' => 'Figyelőlistám',
'mywatchlist' => 'Figyelőlistám',
-'watchlistfor' => "('''$1''' részére)",
+'watchlistfor2' => '$1 részére $2',
'nowatchlist' => 'Nincs lap a figyelőlistádon.',
'watchlistanontext' => 'A figyelőlistád megtekintéséhez és szerkesztéséhez $1.',
'watchnologin' => 'Nem vagy bejelentkezve',
@@ -2195,7 +2238,10 @@ Az utolsó szerkesztést [[User:$3|$3]] ([[User talk:$3|vita]]{{int:pipe-separat
'revertpage' => 'Visszaállítottam a lap korábbi változatát: [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]]) szerkesztéséről [[User:$1|$1]] szerkesztésére',
'revertpage-nouser' => 'Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére',
'rollback-success' => '$1 szerkesztéseit visszaállítottam $2 utolsó változatára.',
-'sessionfailure' => 'Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;
+
+# Edit tokens
+'sessionfailure-title' => 'Munkamenethiba',
+'sessionfailure' => 'Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;
ez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.
Kérjük, hogy nyomd meg a "vissza" gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.',
@@ -2331,18 +2377,22 @@ $1',
'month' => 'E hónap végéig:',
'year' => 'Eddig az évig:',
-'sp-contributions-newbies' => 'Csak a nemrég regisztrált szerkesztők közreműködéseinek mutatása',
-'sp-contributions-newbies-sub' => 'Új szerkesztők lapjai',
-'sp-contributions-newbies-title' => 'Új szerkesztők közreműködései',
-'sp-contributions-blocklog' => 'Blokkolási napló',
-'sp-contributions-deleted' => 'törölt szerkesztések',
-'sp-contributions-logs' => 'naplók',
-'sp-contributions-talk' => 'vitalap',
-'sp-contributions-userrights' => 'szerkesztői jogok beállítása',
-'sp-contributions-blocked-notice' => 'Ez a szerkesztő blokkolva van. A blokknapló legutóbbi ide vonatkozó bejegyzése a következő:',
-'sp-contributions-search' => 'Közreműködések szűrése',
-'sp-contributions-username' => 'IP-cím vagy felhasználónév:',
-'sp-contributions-submit' => 'Keresés',
+'sp-contributions-newbies' => 'Csak a nemrég regisztrált szerkesztők közreműködéseinek mutatása',
+'sp-contributions-newbies-sub' => 'Új szerkesztők lapjai',
+'sp-contributions-newbies-title' => 'Új szerkesztők közreműködései',
+'sp-contributions-blocklog' => 'Blokkolási napló',
+'sp-contributions-deleted' => 'törölt szerkesztések',
+'sp-contributions-uploads' => 'feltöltések',
+'sp-contributions-logs' => 'naplók',
+'sp-contributions-talk' => 'vitalap',
+'sp-contributions-userrights' => 'szerkesztői jogok beállítása',
+'sp-contributions-blocked-notice' => 'Ez a szerkesztő blokkolva van. A blokknapló legutóbbi ide vonatkozó bejegyzése a következő:',
+'sp-contributions-blocked-notice-anon' => 'Ez az IP-cím blokkolva van.
+A blokknapló legutóbbi ide vonatkozó bejegyzése a következő:',
+'sp-contributions-search' => 'Közreműködések szűrése',
+'sp-contributions-username' => 'IP-cím vagy felhasználónév:',
+'sp-contributions-toponly' => 'Csak a jelenleg utolsónak számító változtatásokat mutassa',
+'sp-contributions-submit' => 'Keresés',
# What links here
'whatlinkshere' => 'Mi hivatkozik erre',
@@ -2403,7 +2453,6 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
'ipb-edit-dropdown' => 'Blokkolási okok szerkesztése',
'ipb-unblock-addr' => '$1 blokkjának feloldása',
'ipb-unblock' => 'Felhasználónév vagy IP-cím blokkolásának feloldása',
-'ipb-blocklist-addr' => '$1 aktív blokkjai',
'ipb-blocklist' => 'Létező blokkok megtekintése',
'ipb-blocklist-contribs' => '$1 közreműködései',
'unblockip' => 'Blokk feloldása',
@@ -2470,6 +2519,8 @@ $1 már blokkolva van. Meg szeretnéd változtatni a beállításokat?',
'sorbs_create_account_reason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán. Nem hozhatsz létre fiókot.',
'cant-block-while-blocked' => 'Nem blokkolhatsz más szerkesztőket, miközben te magad blokkolva vagy.',
'cant-see-hidden-user' => 'A felhasználó, akit blokkolni próbáltál már blokkolva és rejtve van. Mivel nincs felhasználó elrejtése jogosultságod, nem láthatod és nem szerkesztheted a felhasználó blokkját.',
+'ipbblocked' => 'Nem blokkolhatsz és nem oldhatod fel más felhasználók blokkjait, mert te magad is blokkolva vagy',
+'ipbnounblockself' => 'Nincs jogosultságod feloldani a saját felhasználói fiókod blokkját',
# Developer tools
'lockdb' => 'Adatbázis zárolása',
@@ -2511,6 +2562,16 @@ Ez azt jelenti, hogy vissza tudsz nevezni egy tévedésbÅ‘l átnevezett lapot, Ã
'''FIGYELEM!'''
Népszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;
győződj meg a folytatás előtt arról, hogy tisztában vagy-e a következményekkel.",
+'movepagetext-noredirectfixer' => "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.
+A régi cím az új címre való átirányítás lesz.
+Ellenőrizd a [[Special:DoubleRedirects|dupla]] és a [[Special:BrokenRedirects|hibás átirányításoknál]], hogy a linkek továbbra is oda mutatnak, ahová mutatniuk kell.
+
+A lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres, vagy átirányítás, aminek nincs laptörténete.
+Ez azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, de nem tudsz egy már létező lapot véletlenül felülírni.
+
+'''Figyelem!'''
+Népszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;
+győződj meg a folytatás előtt arról, hogy tisztában vagy-e a következményekkel.",
'movepagetalktext' => "A laphoz tartozó vitalap automatikusan átneveződik, '''kivéve, ha:'''
*már létezik egy nem üres vitalap az új helyen,
*nem jelölöd be a lenti pipát.
@@ -2566,6 +2627,7 @@ Az átnevezés céljaként megadott „[[:$1]]†szócikk már létezik. Ha az
'immobile-source-page' => 'Ez a lap nem nevezhető át.',
'immobile-target-page' => 'A lap nem helyezhető át a megadott címre.',
'imagenocrossnamespace' => 'A fájlok nem helyezhetőek át más névtérbe',
+'nonfile-cannot-move-to-file' => 'Nem fájlok nem nevezhetők át fájlnévtérbe',
'imagetypemismatch' => 'Az új kiterjesztés nem egyezik meg a fájl típusával',
'imageinvalidfilename' => 'A célnév érvénytelen',
'fix-double-redirects' => 'Az eredeti címre mutató hivatkozások frissítése',
@@ -2650,6 +2712,7 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
'importstart' => 'Lapok importálása...',
'import-revision-count' => '$1 {{PLURAL:$1|revision|változatok}}',
'importnopages' => 'Nincs importálandó lap.',
+'imported-log-entries' => 'Importálva $1 logbejegyzés.',
'importfailed' => 'Az importálás nem sikerült: $1',
'importunknownsource' => 'Ismeretlen import forrástípus',
'importcantopen' => 'Nem nyitható meg az importfájl',
@@ -2742,6 +2805,8 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
'tooltip-upload' => 'Feltöltés indítása',
'tooltip-rollback' => '„Visszaállításâ€: egy kattintással visszavonja az utolsó felhasználó egy vagy több szerkesztését.',
'tooltip-undo' => '„Visszavonásâ€: visszavonja ezt a szerkesztést, valamint megnyitja a szerkesztÅ‘t elÅ‘nézet módban. A szerkesztési összefoglalóban meg lehet adni a visszavonás okát.',
+'tooltip-preferences-save' => 'Beállítások mentése',
+'tooltip-summary' => 'Adj meg egy rövid összefoglalót',
# Stylesheets
'common.css' => '/* Közös CSS az összes felületnek */',
@@ -2862,14 +2927,17 @@ A futtatása során kárt tehet a számítógépedben.",
'imagemaxsize' => "A képek mérete, legfeljebb:<br />''(a leírólapokon)''",
'thumbsize' => 'Bélyegkép mérete:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|egy|$3}} oldal',
-'file-info' => '(fájlméret: $1, MIME-típus: $2)',
-'file-info-size' => '($1 × $2 képpont, fájlméret: $3, MIME-típus: $4)',
+'file-info' => 'fájlméret: $1, MIME-típus: $2',
+'file-info-size' => '$1 × $2 képpont, fájlméret: $3, MIME-típus: $4',
'file-nohires' => '<small>Nem érhető el nagyobb felbontású változat.</small>',
-'svg-long-desc' => '(SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3)',
+'svg-long-desc' => 'SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3',
'show-big-image' => 'A kép nagyfelbontású változata',
'show-big-image-thumb' => '<small>Az előnézet mérete: $1 × $2 képpont</small>',
'file-info-gif-looped' => 'ismétlődik',
'file-info-gif-frames' => '{{PLURAL:$1|egy|$1}} képkocka',
+'file-info-png-looped' => 'ismétlődik',
+'file-info-png-repeat' => 'lejátszva {{PLURAL:$1|egy|$1}} alkalommal',
+'file-info-png-frames' => '{{PLURAL:$1|egy|$1}} képkocka',
# Special:NewFiles
'newimages' => 'Új fájlok galériája',
@@ -3024,6 +3092,7 @@ tartalmazni fogja. A többi alapértelmezésként rejtett marad.
'exif-gpsareainformation' => 'GPS terület neve',
'exif-gpsdatestamp' => 'GPS dátum',
'exif-gpsdifferential' => 'GPS különbözeti korrekció',
+'exif-objectname' => 'Rövid cím',
# EXIF attributes
'exif-compression-1' => 'Nem tömörített',
@@ -3105,6 +3174,8 @@ tartalmazni fogja. A többi alapértelmezésként rejtett marad.
'exif-sensingmethod-7' => 'Háromvonalas érzékelő',
'exif-sensingmethod-8' => 'Színsorrendi vonalas érzékelő',
+'exif-filesource-3' => 'Digitális fényképezőgép',
+
'exif-scenetype-1' => 'Egy közvetlenül lefotózott kép',
'exif-customrendered-0' => 'Normál feldolgozás',
@@ -3181,26 +3252,26 @@ tartalmazni fogja. A többi alapértelmezésként rejtett marad.
'limitall' => 'mind',
# E-mail address confirmation
-'confirmemail' => 'E-mail cím megerősítése',
-'confirmemail_noemail' => 'Nincs érvényes e-mail cím megadva a [[Special:Preferences|beállításaidnál]].',
-'confirmemail_text' => 'Meg kell erősítened az e-mail címed, mielőtt használhatnád a(z) {{SITENAME}} levelezési rendszerét. Nyomd meg az alsó gombot, hogy kaphass egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot. Töltsd be a kódot a böngésződbe, hogy aktiválhasd az e-mail címedet.',
-'confirmemail_pending' => 'A megerősítő kódot már elküldtük neked e-mailben, kérjük, várj türelemmel, amíg a szükséges adatok megérkeznek az e-mailcímedre, és csak akkor kérj új kódot, ha valami technikai malőr folytán értelmes időn belül nem kapod meg a levelet.',
-'confirmemail_send' => 'Küldd el a kódot',
-'confirmemail_sent' => 'Kaptál egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot.',
-'confirmemail_oncreate' => 'A megerősítő kódot elküldtük az e-mail címedre.
+'confirmemail' => 'E-mail cím megerősítése',
+'confirmemail_noemail' => 'Nincs érvényes e-mail cím megadva a [[Special:Preferences|beállításaidnál]].',
+'confirmemail_text' => 'Meg kell erősítened az e-mail címed, mielőtt használhatnád a(z) {{SITENAME}} levelezési rendszerét. Nyomd meg az alsó gombot, hogy kaphass egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot. Töltsd be a kódot a böngésződbe, hogy aktiválhasd az e-mail címedet.',
+'confirmemail_pending' => 'A megerősítő kódot már elküldtük neked e-mailben, kérjük, várj türelemmel, amíg a szükséges adatok megérkeznek az e-mailcímedre, és csak akkor kérj új kódot, ha valami technikai malőr folytán értelmes időn belül nem kapod meg a levelet.',
+'confirmemail_send' => 'Küldd el a kódot',
+'confirmemail_sent' => 'Kaptál egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot.',
+'confirmemail_oncreate' => 'A megerősítő kódot elküldtük az e-mail címedre.
Ez a kód nem szükséges a belépéshez, de meg kell adnod,
mielőtt a wiki e-mail alapú szolgáltatásait igénybe veheted.',
-'confirmemail_sendfailed' => 'Nem sikerült elküldeni a megerősítő e-mailt.
+'confirmemail_sendfailed' => 'Nem sikerült elküldeni a megerősítő e-mailt.
Ellenőrizd, hogy nem írtál-e érvénytelen karaktert a címbe.
A levelező üzenete: $1',
-'confirmemail_invalid' => 'Nem megfelelő kód. A kódnak lehet, hogy lejárt a felhasználhatósági ideje.',
-'confirmemail_needlogin' => 'Meg kell $1 erősíteni az e-mail címedet.',
-'confirmemail_success' => 'Az e-mail címed megerősítve. Most már beléphetsz a wikibe.',
-'confirmemail_loggedin' => 'E-mail címed megerősítve.',
-'confirmemail_error' => 'Hiba az e-mail címed megerősítése során.',
-'confirmemail_subject' => '{{SITENAME}} e-mail cím megerősítés',
-'confirmemail_body' => 'Valaki, valószínűleg te, ezzel az e-mail címmel regisztrált
+'confirmemail_invalid' => 'Nem megfelelő kód. A kódnak lehet, hogy lejárt a felhasználhatósági ideje.',
+'confirmemail_needlogin' => 'Meg kell $1 erősíteni az e-mail címedet.',
+'confirmemail_success' => 'Az e-mail címed megerősítve. Most már beléphetsz a wikibe.',
+'confirmemail_loggedin' => 'E-mail címed megerősítve.',
+'confirmemail_error' => 'Hiba az e-mail címed megerősítése során.',
+'confirmemail_subject' => '{{SITENAME}} e-mail cím megerősítés',
+'confirmemail_body' => 'Valaki, valószínűleg te, ezzel az e-mail címmel regisztrált
"$2" néven a(z) {{SITENAME}} wikin, a(z) $1 IP-címről.
Annak érdekében, hogy megerősítsd, ez az azonosító valóban hozzád tartozik,
@@ -3214,8 +3285,36 @@ e-mail cím megerősíthetőségének visszavonásához:
$5
A megerősítésre szánt kód felhasználhatósági idejének lejárata: $4.',
-'confirmemail_invalidated' => 'E-mail-cím megerősíthetősége visszavonva',
-'invalidateemail' => 'E-mail-cím megerősíthetőségének visszavonása',
+'confirmemail_body_changed' => 'Valaki (vélhetően te, a(z) $1 IP-címről) megváltoztatta a(z) „$2†felhasználói fiók email címét a {{SITENAME}} wikin erre a címre.
+
+Annak érdekében, hogy megerősítsd, ez az azonosító valóban hozzád tartozik,
+és hogy újra aktiváld az e-mail címedet, nyisd meg az alábbi linket a böngésződben:
+
+$3
+
+Ha ez *nem* te vagy, kattints erre a linkre az
+e-mail cím megerősíthetőségének visszavonásához:
+
+$5
+
+A megerősítésre szánt kód felhasználhatósági idejének lejárata: $4.',
+'confirmemail_body_set' => 'Valaki, valószínűleg te, ezt az email címet adta meg
+„$2†nevű {{SITENAME}}-fiókjához a következő IP-címről: $1.
+
+Ha meg szeretnéd erősíteni, hogy a fiók valóban hozzád tartozik,
+így aktiválva a(z) {{SITENAME}} e-mailes funkcióit, nyisd meg az
+alábbi linket a böngésződben:
+
+$3
+
+Ha a fiók *nem* hozzád tartozik, kövesd az alábbi linket a
+megerősítés visszavonásához:
+
+$5
+
+Ez a megerősítő e-mail $4-ig érvényes.',
+'confirmemail_invalidated' => 'E-mail-cím megerősíthetősége visszavonva',
+'invalidateemail' => 'E-mail-cím megerősíthetőségének visszavonása',
# Scary transclusion
'scarytranscludedisabled' => '[Wikiközi beillesztés le van tiltva]',
@@ -3258,6 +3357,7 @@ Kérlek erősítsd meg, hogy tényleg újra akarod-e írni a lapot.",
'table_pager_first' => 'Első oldal',
'table_pager_last' => 'Utolsó oldal',
'table_pager_limit' => 'Laponként $1 tétel megjelenítése',
+'table_pager_limit_label' => 'Elemek száma oldalanként:',
'table_pager_limit_submit' => 'Ugrás',
'table_pager_empty' => 'Nincs találat',
@@ -3313,6 +3413,7 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
'version-specialpages' => 'Speciális lapok',
'version-parserhooks' => 'Értelmező hookok',
'version-variables' => 'Változók',
+'version-skins' => 'Felületek',
'version-other' => 'Egyéb',
'version-mediahandlers' => 'Médiafájl-kezelők',
'version-hooks' => 'Hookok',
@@ -3324,6 +3425,13 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
'version-hook-subscribedby' => 'Használja',
'version-version' => '(verzió: $1)',
'version-license' => 'Licenc',
+'version-poweredby-credits' => "Ez a wiki '''[http://www.mediawiki.org/ MediaWiki]''' szoftverrel működik, copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'mások',
+'version-license-info' => 'A MediaWiki szabad szoftver, terjeszthető és / vagy módosítható a GNU General Public License alatt, amit a Free Software Foundation közzétett; vagy a 2-es verziójú licenc, vagy (az Ön választása alapján) bármely későbbi verzió szerint.
+
+A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉLKÃœL, anélkül, hogy PIACKÉPES vagy HASZNÃLHATÓ LENNE EGY ADOTT CÉLRA. Lásd a GNU General Public License-t a további részletekért.
+
+Önnek kapnia kellett [{{SERVER}}{{SCRIPTPATH}}/COPYING egy példányt a GNU General Public License-ből] ezzel a programmal együtt, ha nem, írjon a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA címre vagy [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html olvassa el online].',
'version-software' => 'Telepített szoftverek',
'version-software-product' => 'Termék',
'version-software-version' => 'Verzió',
@@ -3393,6 +3501,15 @@ Add meg a fájl nevét „{{ns:file}}:†előtag nélkül.',
'tags-edit' => 'szerkesztés',
'tags-hitcount' => '{{PLURAL:$1|Egy|$1}} változtatás',
+# Special:ComparePages
+'comparepages' => 'Lapok összehasonlítása',
+'compare-selector' => 'Lapváltozatok összehasonlítása',
+'compare-page1' => '1. lap',
+'compare-page2' => '2. lap',
+'compare-rev1' => '1. változat',
+'compare-rev2' => '2. változat',
+'compare-submit' => 'Összehasonlítás',
+
# Database error messages
'dberr-header' => 'A wikivel problémák vannak',
'dberr-problems' => 'Sajnáljuk, de az oldallal technikai problémák vannak.',
@@ -3409,8 +3526,13 @@ Add meg a fájl nevét „{{ns:file}}:†előtag nélkül.',
'htmlform-float-invalid' => 'A megadott érték nem szám.',
'htmlform-int-toolow' => 'A megadott érték a minimum, $1 alatt van',
'htmlform-int-toohigh' => 'A megadott érték a maximum, $1 felett van',
+'htmlform-required' => 'Az érték megadása kötelező',
'htmlform-submit' => 'Elküldés',
'htmlform-reset' => 'Változtatások visszavonása',
'htmlform-selectorother-other' => 'egyéb',
+# SQLite database support
+'sqlite-has-fts' => '$1 teljes szöveges keresés támogatással',
+'sqlite-no-fts' => '$1 teljes szöveges keresés támogatása nélkül',
+
);
diff --git a/languages/messages/MessagesHy.php b/languages/messages/MessagesHy.php
index f7cba157..744cc353 100644
--- a/languages/messages/MessagesHy.php
+++ b/languages/messages/MessagesHy.php
@@ -285,8 +285,7 @@ $messages = array(
'tog-editsection' => 'Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ [Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬] Õ°Õ²Õ¸Ö‚Õ´Õ¨ Õ¡Õ´Õ¥Õ¶ Õ¢Õ¡ÕªÕ¶Õ« Õ°Õ¡Õ´Õ¡Ö€',
'tog-editsectiononrightclick' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€Õ¶Õ¡Õ£Ö€Õ« Õ¡Õ» Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¡Ö€Õ´Õ¡Õ´Õ¢ (JavaScript)',
'tog-showtoc' => 'Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ (3 Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬ Õ¾Õ¥Ö€Õ¶Õ¡Õ£Ö€Õ¥Ö€ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ§Õ»Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€)',
-'tog-rememberpassword' => 'Õ€Õ«Õ·Õ¥Õ¬ Õ«Õ´ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ°Õ¡Õ·Õ«Õ¾Õ¨ Õ¡ÕµÕ½ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´',
-'tog-editwidth' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¡Õ´Õ¢Õ¸Õ²Õ» Õ¬Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢',
+'tog-rememberpassword' => 'Õ€Õ«Õ·Õ¥Õ¬ Õ«Õ´ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ°Õ¡Õ·Õ«Õ¾Õ¨ Õ¡ÕµÕ½ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ«Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¡Õ® Õ§Õ»Õ¥Ö€Õ¨ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ«Õ¶',
'tog-watchdefault' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¡Õ® Õ§Õ»Õ¥Ö€Õ¨ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ«Õ¶',
'tog-watchmoves' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ«Õ´ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¡Õ® Õ§Õ»Õ¥Ö€Õ¨ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ«Õ¶',
@@ -432,31 +431,20 @@ $messages = array(
'faqpage' => 'Project:Õ€ÕÕ€',
# Vector skin
-'vector-action-addsection' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´',
-'vector-action-delete' => 'Õ‹Õ¶Õ»Õ¥Õ¬',
-'vector-action-move' => 'ÕÕ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬',
-'vector-action-protect' => 'ÕŠÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¥Õ¬',
-'vector-action-undelete' => 'ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬',
-'vector-action-unprotect' => 'Õ€Õ¡Õ¶Õ¥Õ¬ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¸Ö‚Õ´Õ«Ö',
-'vector-namespace-category' => 'Ô¿Õ¡Õ¿Õ¥Õ£Õ¸Ö€Õ«Õ¡',
-'vector-namespace-help' => 'Õ•Õ£Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ§Õ»',
-'vector-namespace-image' => 'Õ–Õ¡ÕµÕ¬',
-'vector-namespace-main' => 'Ô·Õ»',
-'vector-namespace-media' => 'Õ„Õ¥Õ¤Õ«Õ¡Õ¡ÕµÕ« Õ§Õ»',
-'vector-namespace-mediawiki' => 'ÕˆÖ‚Õ²Õ¥Ö€Õ±',
-'vector-namespace-project' => 'Õ†Õ¡Õ­Õ¡Õ£Õ®Õ« Õ§Õ»',
-'vector-namespace-special' => 'ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ² Õ§Õ»',
-'vector-namespace-talk' => 'Õ”Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´',
-'vector-namespace-template' => 'Ô¿Õ¡Õ²Õ¡ÕºÕ¡Ö€',
-'vector-namespace-user' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ§Õ»',
-'vector-view-create' => 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬',
-'vector-view-edit' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬',
-'vector-view-history' => 'Ô´Õ«Õ¿Õ¥Õ¬ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
-'vector-view-view' => 'Ô¿Õ¡Ö€Õ¤Õ¡Õ¬',
-'vector-view-viewsource' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ¥Õ¬Õ¡Õ¿Õ¥Ö„Õ½Õ¿Õ¨',
-'actions' => 'Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
-'namespaces' => 'Ô±Õ¶Õ¾Õ¡Õ¶Õ¡Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶Õ¥Ö€',
-'variants' => 'ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€',
+'vector-action-addsection' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´',
+'vector-action-delete' => 'Õ‹Õ¶Õ»Õ¥Õ¬',
+'vector-action-move' => 'ÕÕ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬',
+'vector-action-protect' => 'ÕŠÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¥Õ¬',
+'vector-action-undelete' => 'ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬',
+'vector-action-unprotect' => 'Õ€Õ¡Õ¶Õ¥Õ¬ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¸Ö‚Õ´Õ«Ö',
+'vector-view-create' => 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬',
+'vector-view-edit' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬',
+'vector-view-history' => 'Ô´Õ«Õ¿Õ¥Õ¬ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
+'vector-view-view' => 'Ô¿Õ¡Ö€Õ¤Õ¡Õ¬',
+'vector-view-viewsource' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ¥Õ¬Õ¡Õ¿Õ¥Ö„Õ½Õ¿Õ¨',
+'actions' => 'Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
+'namespaces' => 'Ô±Õ¶Õ¾Õ¡Õ¶Õ¡Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶Õ¥Ö€',
+'variants' => 'ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€',
'errorpagetitle' => 'ÕÕ­Õ¡Õ¬',
'returnto' => 'ÕŽÕ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ $1Ö‰',
@@ -579,7 +567,7 @@ $1',
'nstab-media' => 'Õ„Õ¥Õ¤Õ«Õ¡ Õ§Õ»',
'nstab-special' => 'ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ² Õ§Õ»',
'nstab-project' => 'Õ†Õ¡Õ­Õ¡Õ£Õ®Õ« Õ§Õ»',
-'nstab-image' => 'Õ–Õ¡ÕµÕ¬',
+'nstab-image' => 'Õ†Õ«Õ·Ö„',
'nstab-mediawiki' => 'ÕˆÖ‚Õ²Õ¥Ö€Õ±',
'nstab-template' => 'Ô¿Õ¡Õ²Õ¡ÕºÕ¡Ö€',
'nstab-help' => 'Õ•Õ£Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ§Õ»',
@@ -680,7 +668,7 @@ $2',
'yourname' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶.',
'yourpassword' => 'Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼.',
'yourpasswordagain' => 'Ô¿Ö€Õ¯Õ¶Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨.',
-'remembermypassword' => 'Õ€Õ«Õ·Õ¥Õ¬ Õ«Õ´ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨',
+'remembermypassword' => 'Õ€Õ«Õ·Õ¥Õ¬ Õ«Õ´ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡ÕµÕ½ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´ ($1 {{PLURAL:$1|Ö…Ö€Õ«Ö|Ö…Ö€Õ«Ö}} Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬ ÕªÕ¡Õ´Õ¯Õ¥Õ¿Õ¸Õ¾)',
'yourdomainname' => 'ÕÕ¥Ö€ Õ¤Õ¸Õ´Õ¥Õ¶Õ¨.',
'externaldberror' => 'ÕÕ¥Õ²Õ« Õ§ Õ¸Ö‚Õ¶Õ¥ÖÕ¥Õ¬ Õ¾Õ¡Õ¾Õ¥Ö€Õ¡ÖÕ´Õ¡Õ¶ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ« Õ½Õ­Õ¡Õ¬, Õ¯Õ¡Õ´ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¢Õ¡Õ¾Õ¡Ö€Õ¡Ö€ Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ°Õ¡Õ·Õ¾Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'login' => 'Õ„Õ¿Õ¶Õ¥Õ¬',
@@ -870,7 +858,7 @@ $2',
'userjsyoucanpreview' => "'''Õ€Õ¸Ö‚Õ·Õ¸Ö‚Õ´.''' Ô·Õ»Õ¨ Õ°Õ«Õ·Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Ö…Õ£Õ¿Õ¾Õ¥Ö„ «{{int:showpreview}}» Õ¯Õ¸Õ³Õ¡Õ¯Õ«ÖÕ Õ±Õ¥Ö€ Õ¶Õ¸Ö€ JS-Õ¶Õ«Õ·Ö„Õ¨ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰",
'usercsspreview' => "'''Õ†Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ¤Õ¸Ö‚Ö„ Õ´Õ«Õ¡ÕµÕ¶ Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´ Õ¥Ö„ Õ±Õ¥Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« CSS-Õ¶Õ«Õ·Ö„Õ¨. Õ¡ÕµÕ¶ Õ¤Õ¥Õ¼ Õ°Õ«Õ·Õ¾Õ¡Õ® Õ¹Õ§Õ›Ö‰'''",
'userjspreview' => "'''Õ†Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ¤Õ¸Ö‚Ö„ Õ´Õ«Õ¡ÕµÕ¶ Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´ Õ¥Ö„ Õ±Õ¥Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« JavaScript-Õ¶Õ«Õ·Ö„Õ¨. Õ¡ÕµÕ¶ Õ¤Õ¥Õ¼ Õ°Õ«Õ·Õ¾Õ¡Õ® Õ¹Õ§Õ›Ö‰'''",
-'userinvalidcssjstitle' => "'''Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´.''' «$1» Õ¿Õ¥Õ½Ö„ Õ¹Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Ö‰ Ô» Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ .css Ö‡ .js Õ§Õ»Õ¥Ö€Õ¨ Õ¸Ö‚Õ¶Õ¥Õ¶ ÖƒÕ¸Ö„Ö€Õ¡Õ¿Õ¡Õ¼ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€, Ö…Ö€.Õ Â«{{ns:user}}:ÕˆÕ´Õ¶/monobook.css», Ö‡ Õ¸Õ¹ Õ©Õ¥ «{{ns:user}}:ÕˆÕ´Õ¶/Monobook.css»։",
+'userinvalidcssjstitle' => "'''Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´.''' «$1» Õ¿Õ¥Õ½Ö„ Õ¹Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Ö‰ Ô» Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ .css Ö‡ .js Õ§Õ»Õ¥Ö€Õ¨ Õ¸Ö‚Õ¶Õ¥Õ¶ ÖƒÕ¸Ö„Ö€Õ¡Õ¿Õ¡Õ¼ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€, Ö…Ö€.Õ Â«{{ns:user}}:ÕˆÕ´Õ¶/vector.css», Ö‡ Õ¸Õ¹ Õ©Õ¥ «{{ns:user}}:ÕˆÕ´Õ¶/Vector.css»։",
'updated' => '(Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¡Õ®)',
'note' => "'''Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´.'''",
'previewnote' => "'''ÕÕ¡ Õ´Õ«Õ¡ÕµÕ¶ Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´Õ¶ Õ§. Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¤Õ¥Õ¼ Õ¹Õ¥Õ›Õ¶ Õ°Õ«Õ·Õ¾Õ¥Õ¬Ö‰'''",
@@ -901,7 +889,6 @@ $2',
Õ†ÕµÕ¸Ö‚Õ©Õ¶ Õ¡ÕµÕ½Õ¿Õ¥Õ² Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬Õ¸Õ¾Õ Õ¤Õ¸Ö‚Ö„ Õ¶Õ¡Ö‡ Õ°Õ¡Õ¾Õ¡Õ½Õ¿Õ«Õ¡ÖÕ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ´Õ¥Õ¦, Õ¸Ö€ Õ¡ÕµÕ¶ Õ£Ö€Õ¾Õ¡Õ® Õ§ Õ±Õ¥Ö€ Õ¯Õ¸Õ²Õ´Õ«Ö Õ¯Õ¡Õ´ Õ¾Õ¥Ö€ÖÕ¾Õ¡Õ® Õ§ Õ¡Õ¦Õ¡Õ¿ Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ´ Ö‡ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¡ÕµÕ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Õ² Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ«ÖÖ‰
'''ԱՌԱՆՑ Ô¹ÕˆÕ’Õ…Ô¼ÕÕŽÕˆÕ’Ô¹Õ…Ô±Õ† Õ„Ô»Õ› ÕÔµÕ‚Ô±Ô´ÕÔµÕ” Õ€ÔµÕ‚Ô»Õ†Ô±Ô¿Ô±Õ…Ô»Õ† Ô»ÕÔ±ÕŽÕˆÕ’Õ†Õ”Õ†ÔµÕÕˆÕŽ ÕŠÔ±Õ‡ÕÕŠÔ±Õ†ÕŽÔ±Ô¾ Õ†Õ…ÕˆÕ’Ô¹ÔµÕÖ‰'''",
'copyrightwarning2' => "Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ« Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬, Õ¸Ö€ {{SITENAME}} Õ¯Õ¡ÕµÖ„Õ¸Ö‚Õ´ Õ¡Ö€Õ¾Õ¡Õ® Õ¢Õ¸Õ¬Õ¸Ö€ Õ¶Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¾Õ¥Õ¬, Õ¾Õ¥Ö€Õ¡Õ´Õ·Õ¡Õ¯Õ¾Õ¥Õ¬ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ¸Ö‚Ö€Õ«Õ· Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«ÖÖ‰ ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´, Õ¸Ö€ Õ±Õ¥Ö€ Õ¶ÕµÕ¸Ö‚Õ©Õ¨ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¾Õ«, Õ¡ÕºÕ¡ Õ´Õ«Õ› Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Ö„ Õ¡ÕµÕ¶ Õ¡ÕµÕ½Õ¿Õ¥Õ²Ö‰<br /> Ô´Õ¸Ö‚Ö„ Õ¶Õ¡Ö‡ Õ°Õ¡Õ¾Õ¡Õ½Õ¿Õ«Õ¡ÖÕ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ´Õ¥Õ¦, Õ¸Ö€ Õ¶ÕµÕ¸Ö‚Õ©Õ¨ Õ£Ö€Õ¾Õ¡Õ® Õ§ Õ±Õ¥Ö€ Õ¯Õ¸Õ²Õ´Õ«Ö Õ¯Õ¡Õ´ Õ¾Õ¥Ö€ÖÕ¾Õ¡Õ® Õ§ Õ¡Õ¦Õ¡Õ¿ Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ´ Ö‡ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Õ² Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ«Ö (Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¿Õ¥Õ½ $1)Ö‰ '''Õ„Ô»Õ› ÕÔµÕ‚Ô±Ô´ÕÔµÕ” Õ€ÔµÕ‚Ô»Õ†Ô±Ô¿Ô±Õ…Ô»Õ† Ô»ÕÔ±ÕŽÕˆÕ’Õ†Õ”Õ†ÔµÕÕˆÕŽ ÕŠÔ±Õ‡ÕÕŠÔ±Õ†ÕŽÔ±Ô¾ Õ†Õ…ÕˆÕ’Ô¹ÔµÕ Ô±ÕŒÔ±Õ†Õ‘ Ô¹ÕˆÕ’Õ…Ô¼Ô±ÕÕÕˆÕ’Ô¹Õ…Ô±Õ†Ö‰'''",
-'longpagewarning' => "'''Ô¶Ô³ÕˆÕ’Õ‡Ô±Õ‘ÕˆÕ’Õ„. Ô±ÕµÕ½ Õ§Õ»Õ« Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ§ $1 Õ¯Õ«Õ¬Õ¸Õ¢Õ¡ÕµÕ©Ö‰ ÕˆÖ€Õ¸Õ· Õ¢Ö€Õ¡Õ¸Ö‚Õ¦Õ¥Ö€Õ¶Õ¥Ö€ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¤ÕªÕ¾Õ¡Ö€Õ¡Õ¶Õ¡Õ¬ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ 32 Ô¿Ô² Ö‡ Õ¡Õ¾Õ¥Õ¬ Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ§Õ»Õ¥Ö€Õ¨Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ« Õ¿Ö€Õ¸Õ°Õ¸Ö‚Õ´Õ¨ ÖƒÕ¸Ö„Ö€ Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö€Õ«Ö‰'''",
'longpageerror' => "'''ÕÔ½Ô±Ô¼. Õ†Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ¡Õ® Õ¿Õ¥Ö„Õ½Õ¿Õ¨ Õ¸Ö‚Õ¶Õ« $1 Õ¯Õ«Õ¬Õ¸Õ¢Õ¡ÕµÕ© Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶, Õ«Õ¶Õ¹Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¸Ö‚Õ´ Õ§ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® $2 Ô¿Ô² Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Õ¹Õ¡ÖƒÕ¨Ö‰ Ô·Õ»Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ°Õ«Õ·Õ¾Õ¥Õ¬Ö‰'''",
'readonlywarning' => "'''Ô¶Ô³ÕˆÕ’Õ‡Ô±Õ‘ÕˆÕ’Õ„. ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡Õ¶ Õ¯Õ¸Õ²ÕºÕ¾Õ¥Õ¬ Õ§ Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾, Ö‡ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ°Õ«Õ·Õ¥Õ¬ Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¡ÕµÕ½ ÕºÕ¡Õ°Õ«Õ¶Ö‰
Õ€Õ¡Õ¾Õ¡Õ¶Õ¡Õ¢Õ¡Ö€ Õ«Õ´Õ¡Õ½Õ¿ Õ¸Ö‚Õ¶Õ« ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ¨ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ¶Õ«Õ·Ö„Õ« Õ´Õ¥Õ» Ö‡ ÕºÕ¡Õ°Õ¥Õ¬ Õ¡ÕµÕ¶Õ Õ°Õ¥Õ¿Õ¡Õ£Õ¡ÕµÕ¸Ö‚Õ´ Õ¶Õ¡Õ­Õ¡Õ£Õ®Õ¸Ö‚Õ´ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰'''
@@ -1056,7 +1043,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'searchprofile-advanced' => 'Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ®',
'searchprofile-articles-tooltip' => 'ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ $1Õ¸Ö‚Õ´',
'searchprofile-project-tooltip' => 'ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ $1Õ¸Ö‚Õ´',
-'searchprofile-images-tooltip' => 'Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´',
+'searchprofile-images-tooltip' => 'Õ†Õ«Õ·Ö„Õ¥Ö€Õ« Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´',
'searchprofile-everything-tooltip' => 'ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ§Õ»Õ¥Ö€Õ¸Ö‚Õ´ (Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´ Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶)',
'searchprofile-advanced-tooltip' => 'ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ Õ¶Õ·Õ¾Õ¡Õ® Õ¡Õ¶Õ¾Õ¡Õ¶Õ¡Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶Õ¥Ö€Õ¸Ö‚Õ´',
'search-result-size' => '$1 ({{PLURAL:$2|1 Õ¢Õ¡Õ¼|$2 Õ¢Õ¡Õ¼}})',
@@ -1203,7 +1190,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'prefs-advancedrendering' => 'Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ¨Õ¶Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€',
'prefs-advancedsearchoptions' => 'Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ¨Õ¶Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€',
'prefs-advancedwatchlist' => 'Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ¨Õ¶Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€',
-'prefs-display' => 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€',
+'prefs-displayrc' => 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€',
'prefs-diffs' => 'ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
# User rights
@@ -1244,7 +1231,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
# Rights
'right-edit' => 'Õ§Õ»Õ¥Ö€Õ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´',
-'right-upload' => 'Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´',
+'right-upload' => 'Õ†Õ«Õ·Ö„Õ¥Ö€Õ« Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´',
'right-delete' => 'Ô·Õ»Õ¥Ö€Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´',
# User rights log
@@ -1262,14 +1249,9 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'recentchanges-legend' => 'ÕŽÕ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
'recentchangestext' => 'Õ€Õ¥Õ¿Ö‡Õ¥Ö„ Õ¾Õ«Ö„Õ«Õ¸Ö‚Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Õ¶ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´Ö‰',
'recentchanges-feed-description' => 'Õ€Õ¥Õ¿Ö‡Õ¥Ö„ Õ¾Õ«Ö„Õ«Õ¸Ö‚Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Õ¶ Õ¡ÕµÕ½ Õ½Õ¶Õ¸Ö‚ÖÕ´Õ¡Õ¶ Õ´Õ¥Õ»Ö‰',
-'recentchanges-label-legend' => 'Ô¼Õ¥Õ£Õ¥Õ¶Õ¤. $1',
-'recentchanges-legend-newpage' => '$1 - Õ¶Õ¸Ö€ Õ§Õ»',
'recentchanges-label-newpage' => 'Ô±ÕµÕ½ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ´Õ¢ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ¶Õ¸Ö€ Õ§Õ»',
-'recentchanges-legend-minor' => '$1 - Õ¹Õ¶Õ¹Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´',
'recentchanges-label-minor' => 'ÕÕ¡ Õ¹Õ¶Õ¹Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´ Õ§',
-'recentchanges-legend-bot' => '$1 - Õ¢Õ¸Õ¿Õ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´',
'recentchanges-label-bot' => 'Ô±ÕµÕ½ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ§ Õ¢Õ¸Õ¿Õ« Õ¯Õ¸Õ²Õ´Õ«Ö',
-'recentchanges-legend-unpatrolled' => '$1 - Õ¹ÕºÕ¡Ö€Õ¥Õ¯Õ¾Õ¡Õ® Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´',
'recentchanges-label-unpatrolled' => 'Ô±ÕµÕ½ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ¤Õ¥Õ¼ Õ¹Õ« ÕºÕ¡Ö€Õ¥Õ¯Õ¾Õ¥Õ¬',
'rcnote' => 'ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ Õ¾Õ¥Ö€Õ»Õ«Õ¶ <strong>$1</strong> ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€Õ»Õ«Õ¶ <strong>$2</strong> {{PLURAL:$2|Ö…Ö€Õ¾Õ¡|Ö…Ö€Õ¾Õ¡}} Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´Õ $5, $4-Õ« Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢Ö‰',
'rcnotefrom' => "ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ½Õ¯Õ½Õ¡Õ®Õ '''$2''' (Õ´Õ«Õ¶Õ¹Ö‡Õ '''$1''')Ö‰",
@@ -1314,7 +1296,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'upload_directory_read_only' => 'ÕŽÕ¥Õ¢-Õ½Õ¥Ö€Õ¾Õ¥Ö€Õ¨ Õ¹Õ¸Ö‚Õ¶Õ« Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„ Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ ($1)Ö‰',
'uploaderror' => 'Ô²Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ½Õ­Õ¡Õ¬',
'uploadtext' => "Õ†Õ«Õ·Ö„ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ½Õ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ±Ö‡Õ¨Ö‰
-Õ†Õ¡Õ­Õ¯Õ«Õ¶Õ¸Ö‚Õ´ Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ¤Õ«Õ¿Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ Õ¸Ö€Õ¸Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡ÕµÖÕ¥Õ¬Õ¥Ö„ [[Special:FileList|Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨]]Ö‰ Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ£Ö€Õ¡Õ¶ÖÕ¾Õ¸Ö‚Õ´ Õ¥Õ¶ [[Special:Log/upload|Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¸Ö‚Õ´]], Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨Õ [[Special:Log/delete|Õ»Õ¶Õ»Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¸Ö‚Õ´]]Ö‰
+Õ†Õ¡Õ­Õ¯Õ«Õ¶Õ¸Ö‚Õ´ Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö„Õ¥Ö€Õ¨ Õ¤Õ«Õ¿Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ Õ¸Ö€Õ¸Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡ÕµÖÕ¥Õ¬Õ¥Ö„ [[ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²:ÕŠÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«ÖÕ¡Õ¶Õ¯Õ¨|Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö„Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨]]Ö‰ Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ£Ö€Õ¡Õ¶ÖÕ¾Õ¸Ö‚Õ´ Õ¥Õ¶ [[ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²:ÕÕ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶/upload|Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¸Ö‚Õ´]], Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨Õ [[ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²:ÕÕ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶/delete|Õ»Õ¶Õ»Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¸Ö‚Õ´]]Ö‰
Ô±ÕµÕ½ Õ¶Õ«Õ·Ö„Õ¨ Õ¸Ö€Ö‡Õ§ Õ§Õ»Õ¸Ö‚Õ´ Õ¨Õ¶Õ¤Õ£Ö€Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ°Õ²Õ´Õ¡Õ¶ Õ±Ö‡Õ¥Ö€Õ¨.
* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Õ†Õ«Õ·Ö„.jpg]]</nowiki>''' - Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¹Õ¡ÖƒÕ« ÕºÕ¡Õ¿Õ¯Õ¥Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€,
@@ -1322,8 +1304,8 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Õ†Õ«Õ·Ö„.ogg]]</nowiki>''' - Õ¶Õ«Õ·Ö„Õ«Õ¶ Õ¸Ö‚Õ²Õ«Õ² Õ°Õ²Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€",
'uploadlog' => 'Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
'uploadlogpage' => 'Ô²Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
-'uploadlogpagetext' => 'ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ§ Õ¡Õ´Õ¥Õ¶Õ¡Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨Ö‰
-ÕÕ¥Õ›Õ½ [[Special:NewFiles|Õ¶Õ¸Ö€ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ½Ö€Õ¡Õ°Õ¨]]Õ Õ¡Õ¾Õ¥Õ¬Õ« ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¡Õ¾Õ¸Ö€ Õ¤Õ«Õ¿Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
+'uploadlogpagetext' => 'ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ§ Õ¡Õ´Õ¥Õ¶Õ¡Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö„Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨Ö‰
+ÕÕ¥Õ›Õ½ [[ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²:Õ†Õ¸Ö€ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€|Õ¶Õ¸Ö€ Õ¶Õ«Õ·Ö„Õ¥Ö€Õ« Õ½Ö€Õ¡Õ°Õ¨]]Õ Õ¡Õ¾Õ¥Õ¬Õ« ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¡Õ¾Õ¸Ö€ Õ¤Õ«Õ¿Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'filename' => 'Õ†Õ«Õ·Ö„Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´',
'filedesc' => 'Ô±Õ´ÖƒÕ¸ÖƒÕ¸Ö‚Õ´',
'fileuploadsummary' => 'Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ',
@@ -1335,7 +1317,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'minlength1' => 'Õ†Õ«Õ·Ö„Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ« Õ¡Õ¼Õ¶Õ¾Õ¡Õ¦Õ¶ Õ´Õ¥Õ¯ Õ¿Õ¡Õ¼',
'illegalfilename' => '«$1» նիշքի անվանումը պարունակում է սիմվոլներ, որոնք անթույլատրելի են էջերի անվանումներում։ Խնդրում ենք վերանվանել նիշքը և այն կրկին բեռնել։',
'badfilename' => 'Պատկերի վերանվանվել է «$1» անվանման։',
-'filetype-badmime' => '«$1» MIME-տեսակով ֆայլերի բեռնումը արգելված է։',
+'filetype-badmime' => '«$1» MIME-տեսակով նիշքերի բեռնումը արգելված է։',
'filetype-missing' => 'Õ†Õ«Õ·Ö„Õ¨ Õ¹Õ¸Ö‚Õ¶Õ« Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¸Ö‚Õ´ (Ö…Ö€Õ«Õ¶Õ¡Õ¯Õ Â«.jpg»)Ö‰',
'large-file' => 'Ô½Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ§ Õ¿Ö€Õ¾Õ¸Ö‚Õ´ Õ¹Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ $1 Õ¢Õ¡ÕµÕ©Õ«Ö Õ´Õ¥Õ® Õ¶Õ«Õ·Ö„Õ¥Ö€. Õ¡ÕµÕ½ Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ¶ Õ§Õ $2 Õ¢Õ¡ÕµÕ©Ö‰',
'largefileserver' => 'Ô±ÕµÕ½ Õ¶Õ«Õ·Ö„Õ¨ Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ«Õ¹Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¡Õ® Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Õ¹Õ¡ÖƒÕ«Ö Õ´Õ¥Õ® Õ§Ö‰',
@@ -1353,14 +1335,13 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
Õ€Õ¡Õ¾Õ¡Õ¶Õ¡Õ¢Õ¡Ö€ Õ½Õ¡ ÖƒÕ¸Ö„Ö€Õ¡ÖÕ¾Õ¡Õ® ÕºÕ¡Õ¿Õ³Õ¥Õ¶ Õ§ ''(ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ«Õ¯)''Ö‰
ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¡ÕµÕ½ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¨ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¬Õ¸Ö‚Õ®Õ¡Õ¹Õ¡ÖƒÕ¸Õ¾ Õ¸Ö‚Õ¶Õ¥Ö„, Õ¡ÕºÕ¡ Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡ÕµÕ¶, Õ°Õ¡Õ¯Õ¡Õ¼Õ¡Õ¯ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´Õ Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¶Õ«Õ·Ö„Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨Ö‰",
'fileexists-forbidden' => 'Ô±ÕµÕ½ÕºÕ«Õ½Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢ Õ¶Õ«Õ·Ö„ Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ«Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ°Õ¥Õ¿ Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ Ö‡ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¶Õ«Õ·Ö„Õ¨ Õ¶Õ¸Ö€ Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢Ö‰ [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Ô±ÕµÕ½ÕºÕ«Õ½Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢ Õ¶Õ«Õ·Ö„ Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ¨Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¦Õ¥Õ¿Õ¥Õ²Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ°Õ¥Õ¿ Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ Ö‡ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¶Õ«Õ·Ö„Õ¨ Õ¶Õ¸Ö€ Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢Ö‰ [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§',
+'fileexists-shared-forbidden' => 'Ô±ÕµÕ½ÕºÕ«Õ½Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢ Õ¶Õ«Õ·Ö„ Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ« Õ¶Õ«Õ·Ö„Õ¥Ö€Õ« Õ¨Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¦Õ¥Õ¿Õ¥Õ²Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ°Õ¥Õ¿ Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ Ö‡ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¶Õ«Õ·Ö„Õ¨ Õ¶Õ¸Ö€ Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢Ö‰ [[File:$1|thumb|center|$1]]',
'uploadwarning' => 'Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´',
'savefile' => 'Õ€Õ«Õ·Õ¥Õ¬ Õ¶Õ«Õ·Ö„Õ¨',
'uploadedimage' => 'Õ¢Õ¥Õ¼Õ¶Õ¾Õ¥Ö Â«[[$1]]»',
'overwroteimage' => 'Õ¢Õ¥Õ¼Õ¶Õ¾Õ¥Ö Â«[[$1]]» Õ¶Õ«Õ·Ö„Õ« Õ¶Õ¸Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯',
'uploaddisabled' => 'Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¥Õ¶',
-'uploaddisabledtext' => 'Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§Ö‰',
+'uploaddisabledtext' => 'Õ†Õ«Õ·Ö„Õ¥Ö€Õ« Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§Ö‰',
'uploadscripted' => 'Ô±ÕµÕ½ Õ¶Õ«Õ·Ö„Õ¨ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ HTML-Õ¯Õ¸Õ¤ Õ¯Õ¡Õ´ Õ£Ö€Õ¾Õ¡Õ®Ö„ (Õ½Õ¯Ö€Õ«ÕºÕ¿), Õ¸Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ½Õ­Õ¡Õ¬ Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¾Õ¥Õ¬ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ«Õ¹Õ« Õ¯Õ¸Õ²Õ´Õ«ÖÖ‰',
'uploadvirus' => 'Õ†Õ«Õ·Ö„Õ¨ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ վիրո՜ւս։ ÕÕ¥Õ½ $1',
'sourcefilename' => 'ÕÕ¯Õ¦Õ¢Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¶Õ«Õ·Ö„Õ',
@@ -1372,6 +1353,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¾Õ¥Ö€Õ¡Õ¶Õ¡ÕµÕ¥Õ¬ Õ¶Õ«Õ·Ö„Õ« Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¡Õ°Õ¡Ö€Õ´Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨Ö‰
Ô±ÕµÕ½ Õ¶Õ«Õ·Ö„Õ« Õ»Õ¶Õ»Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ§ Õ½Õ¿Õ¸Ö€Ö‡.",
'filename-bad-prefix' => "Ô²Õ¥Õ¼Õ¶Õ¾Õ¸Õ² Õ¶Õ«Õ·Ö„Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨ Õ½Õ¯Õ½Õ¾Õ¸Ö‚Õ´ Õ§ '''<tt>«$1»</tt>''' Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢, Õ¸Ö€Õ¨ Õ¸Õ¹-Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¡Õ¯Õ¡Õ¶ Õ§ Ö‡ Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¢Õ¡Ö€ Õ¿Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ©Õ¾Õ¡ÕµÕ«Õ¶ Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¹Õ¡Õ¯Õ¡Õ¶ Õ¡ÕºÕ¡Ö€Õ¡Õ¿Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«ÖÖ‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ« Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¡Õ¯Õ¡Õ¶ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´ Õ±Õ¥Ö€ Õ¶Õ«Õ·Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€Ö‰",
+'upload-success-subj' => 'Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§',
'upload-proto-error' => 'ÕÕ­Õ¡Õ¬ ÕºÖ€Õ¸Õ¿Õ¸Õ¯Õ¸Õ¬',
'upload-proto-error-text' => 'Õ€Õ¥Õ¼Õ¡Õ¾Õ¸Ö€ Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¸Ö‚Õ´ Õ§ URL-Õ°Õ¡Õ½ÖÕ¥, Õ¸Ö€Õ¨ Õ½Õ¯Õ½Õ¾Õ¸Ö‚Õ´ Õ§ <code>http://</code> Õ¯Õ¡Õ´ <code>ftp://</code> Õ¶Õ¡Õ­Õ¡Õ®Õ¡Õ¶ÖÕ¸Õ¾Ö‰',
@@ -1396,7 +1378,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
# Special:ListFiles
'listfiles_search_for' => 'ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢.',
'imgfile' => 'Õ¶Õ«Õ·Ö„',
-'listfiles' => 'Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯',
+'listfiles' => 'Õ†Õ«Õ·Ö„Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯',
'listfiles_date' => 'Õ•Ö€/ÔºÕ¡Õ´',
'listfiles_name' => 'Ô±Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´',
'listfiles_user' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö',
@@ -1405,7 +1387,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'listfiles_count' => 'ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯',
# File description page
-'file-anchor-link' => 'Õ–Õ¡ÕµÕ¬',
+'file-anchor-link' => 'Õ†Õ«Õ·Ö„',
'filehist' => 'Õ†Õ«Õ·Ö„Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'filehist-help' => 'Õ„Õ¡Õ¿Õ¶Õ¡Õ°Õ¡Ö€Õ¥Ö„ Ö…Ö€Õ¾Õ¡Õ¶/ÕªÕ¡Õ´Õ«Õ¶Õ Õ¶Õ«Õ·Ö„Õ« Õ¡ÕµÕ¤ ÕºÕ¡Õ°Õ«Õ¶ Õ¿Õ¥Õ½Ö„Õ¨ Õ¤Õ«Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'filehist-deleteall' => 'Õ»Õ¶Õ»Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨',
@@ -1492,7 +1474,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'statistics-edits-average' => 'Ô·Õ»Õ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Õ«Õ¶ Õ©Õ«Õ¾Õ¨',
'statistics-views-total' => 'Ô¸Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¤Õ«Õ¿Õ¸Ö‚Õ´Õ¶Õ¥Ö€',
'statistics-views-peredit' => 'Ô´Õ«Õ¿Õ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¡Õ´Õ¥Õ¶ Õ´Õ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Ô±Õ¼Õ¡Õ»Õ¡Õ¤Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ« Õ°Õ¥Ö€Õ©Õ«] Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
'statistics-users' => 'Ô³Ö€Õ¡Õ¶ÖÕ¾Õ¡Õ® [[Special:ListUsers|Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€]]',
'statistics-users-active' => 'Ô±Õ¯Õ¿Õ«Õ¾ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€',
'statistics-users-active-desc' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ¸Ö€Ö‡Õ§ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¥Õ¶ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ {{PLURAL:$1|Ö…Ö€Õ¾Õ¡|$1 Ö…Ö€Õ¾Õ¡}} Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´',
@@ -1662,7 +1643,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Ô»Õ´ Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖÕ¡Õ¶Õ¯Õ¨',
'mywatchlist' => 'Ô»Õ´ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ¨',
-'watchlistfor' => "('''$1'''-Õ« Õ°Õ¡Õ´Õ¡Ö€)",
'nowatchlist' => 'ÕÕ¥Ö€ Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖÕ¡Õ¶Õ¯Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§Ö‰',
'watchlistanontext' => 'Ô±Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ $1Õ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ¨ Õ¤Õ«Õ¿Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'watchnologin' => 'Õ‰Õ¥Ö„ Õ´Õ¿Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£',
@@ -1762,7 +1742,9 @@ $NEWPAGE
'editcomment' => "Խմբագրման մեկնաբանումն էր. «''$1''»։",
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´]]) Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ¥Õ¿ Õ¥Õ¶ Õ·Ö€Õ»Õ¾Õ¥Õ¬ [[User:$1|$1]] Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ«Õ¶Ö‰',
'rollback-success' => 'Õ€Õ¥Õ¿ Õ¥Õ¶ Õ·Ö€Õ»Õ¾Õ¥Õ¬ $1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨. Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¾Õ¥Õ¬ Õ§ $2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ«Õ¶Ö‰',
-'sessionfailure' => 'Ô¿Õ¡Ö€Õ®Õ¥Õ½ Õ­Õ¶Õ¤Õ«Ö€ Õ§ Õ¡Õ¼Õ¡Õ»Õ¡ÖÕ¥Õ¬ Õ¯Õ¡ÕºÕ¾Õ¡Õ® Õ±Õ¥Ö€ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Õ½Õ¥Õ½Õ«Õ¡ÕµÕ« Õ°Õ¥Õ¿.
+
+# Edit tokens
+'sessionfailure' => 'Ô¿Õ¡Ö€Õ®Õ¥Õ½ Õ­Õ¶Õ¤Õ«Ö€ Õ§ Õ¡Õ¼Õ¡Õ»Õ¡ÖÕ¥Õ¬ Õ¯Õ¡ÕºÕ¾Õ¡Õ® Õ±Õ¥Ö€ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Õ½Õ¥Õ½Õ«Õ¡ÕµÕ« Õ°Õ¥Õ¿.
Õ¡ÕµÕ½ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¢Õ¥Õ¯Õ¡Õ¶Õ¾Õ¥Õ¬ Õ§ Õ½Õ¥Õ½Õ«Õ¡ÕµÕ« Õ°Õ¡ÖƒÕ·Õ¿Õ¡Õ¯Õ´Õ¡Õ¶ Õ¯Õ¡Õ¶Õ­Õ´Õ¡Õ¶ Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾Ö‰
Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ½Õ¥Õ²Õ´Õ¥Õ¬ «back» Õ¯Õ¸Õ³Õ¡Õ¯Õ¨ Ö‡ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡ÕµÕ¶ Õ§Õ»Õ¨ Õ¸Ö€Õ¿Õ¥Õ²Õ«Ö Õ¥Õ¯Õ¥Õ¬ Õ¥Ö„ Õ¸Ö‚ ÖƒÕ¸Ö€Õ±Õ¥Õ¬ Õ¯Ö€Õ¯Õ«Õ¶Ö‰',
@@ -1820,8 +1802,9 @@ $NEWPAGE
'undeleteextrahelp' => "Ô·Õ»Õ« Õ¬Ö€Õ«Õ¾ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¡Ö€Õ¯Õ²Õ¥Ö€Õ¨ Õ©Õ¸Õ²Õ¥Ö„ Õ¡Õ¼Õ¡Õ¶Ö Õ¶Õ·Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Ö‡ Õ½Õ¥Õ²Õ´Õ¥Ö„ '''«Վերականգնել»''' Õ¯Õ¸Õ³Õ¡Õ¯Õ¨Ö‰ Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ« Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¶Õ·Õ¥Ö„ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ´Õ¡Õ¶ Õ¥Õ¶Õ©Õ¡Õ¯Õ¡ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¡Ö€Õ¯Õ²Õ¥Ö€Õ¨ Ö‡ Õ½Õ¥Õ²Õ´Õ¥Ö„ '''«Վերականգնել»'''Ö‰ '''«Մաքրել»''' Õ¯Õ¸Õ³Õ¡Õ¯Õ«Õ¶ Õ½Õ¥Õ²Õ´Õ¥Õ¬Õ«Õ½ Õ¯Õ´Õ¡Ö„Ö€Õ¾Õ« Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ Ö‡ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¶Õ·Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨Ö‰",
'undeleterevisions' => 'Õ¡Ö€Õ­Õ«Õ¾Õ¸Ö‚Õ´ Õ¯Õ¡ $1 Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯',
'undeletehistory' => 'ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Ö„ Õ§Õ»Õ¨, Õ¶Ö€Õ¡ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¥Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¥Õ»Ö‰
-ÔµÕ©Õ¥ Õ§Õ»Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ¶Õ¸Ö€ Õ§Õ» Õ¶Õ¸Ö‚ÕµÕ¶ Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢, Õ¡ÕºÕ¡ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Õ¯Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¥Õ¶ Õ¶Õ¡Õ­Õ¯Õ«Õ¶ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¥Õ», Ö‡ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¹Õ¥Õ¶ ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¾Õ«Ö‰ Õ†Õ¡Ö‡ Õ« Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¶Õ¡Õ¶ Õ¥Õ¶ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ´Õ¡Õ¶ Õ°Õ¥Õ¿Ö‡Õ¡Õ¶Ö„Õ¸Õ¾Ö‰',
-'undeleterevdel' => 'ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ¹Õ« Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ«, Õ¥Õ©Õ¥ Õ¡ÕµÕ¶ Õ¢Õ¥Ö€Õ¥Õ¬Õ¸Ö‚ Õ§ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ« Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ« Õ»Õ¶Õ»Õ´Õ¡Õ¶Ö‰ Ô±ÕµÕ½ÕºÕ«Õ½Õ« Õ¤Õ¥ÕºÖ„Õ¥Ö€Õ¸Ö‚Õ´ Õ°Õ¡Ö€Õ¯Õ¡Õ¾Õ¸Ö€ Õ§ Õ¶Õ·Õ¸Ö‚Õ´Õ«Ö Õ°Õ¡Õ¶Õ¥Õ¬ Õ¯Õ¡Õ´ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨Ö‰ Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ¡ÕµÕ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ¤Õ¸Ö‚Ö„ Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¤Õ«Õ¿Õ¥Õ¬Õ¸Ö‚, Õ¹Õ¥Õ¶ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ«Ö‰',
+ÔµÕ©Õ¥ Õ§Õ»Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ¶Õ¸Ö€ Õ§Õ» Õ¶Õ¸Ö‚ÕµÕ¶ Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢, Õ¡ÕºÕ¡ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Õ¯Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¥Õ¶ Õ§Õ»Õ« Õ¶Õ¡Õ­Õ¯Õ«Õ¶ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¥Õ», Ö‡ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¹Õ¥Õ¶ ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¾Õ«Ö‰',
+'undeleterevdel' => 'ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ¹Õ« Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ«, Õ¥Õ©Õ¥ Õ¡ÕµÕ¶ Õ¢Õ¥Ö€Õ¥Õ¬Õ¸Ö‚ Õ§ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ« Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ« Õ»Õ¶Õ»Õ´Õ¡Õ¶Ö‰
+Ô±ÕµÕ½ÕºÕ«Õ½Õ« Õ¤Õ¥ÕºÖ„Õ¥Ö€Õ¸Ö‚Õ´ Õ°Õ¡Ö€Õ¯Õ¡Õ¾Õ¸Ö€ Õ§ Õ¶Õ·Õ¸Ö‚Õ´Õ«Ö Õ°Õ¡Õ¶Õ¥Õ¬ Õ¯Õ¡Õ´ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨Ö‰',
'undeletehistorynoadmin' => 'Ô·Õ»Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ§Ö‰ Õ‹Õ¶Õ»Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨ Ö‡ Õ§Õ»Õ¨ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¡Õ® Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ Õ½Õ¿Õ¸Ö€Ö‡Ö‰ Ô±ÕµÕ½ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¢Õ¸Ö‚Õ¶ Õ¿Õ¥Ö„Õ½Õ¿Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¤Õ«Õ¿Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö€Õ¡Õ¿Õ¸Ö€Õ¶Õ¥Ö€Õ¨Ö‰',
'undelete-revision' => '«$1» Õ§Õ»Õ« $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯ ($2 ÕºÕ¡Õ°Õ¸Õ¾).',
'undeleterevision-missing' => 'ÕÕ­Õ¡Õ¬ Õ¯Õ¡Õ´ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Ö‰ Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¤Õ¸Ö‚Ö„ Õ¡Õ¶ÖÕ¥Õ¬ Õ¥Ö„ Õ½Õ­Õ¡Õ¬ Õ°Õ²Õ´Õ¡Õ´Õ¢, Õ¯Õ¡Õ´ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¥Õ¬ Õ§, Õ¯Õ¡Õ´ Õ§Õ¬ Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ¡Ö€Õ­Õ«Õ¾Õ«ÖÖ‰',
@@ -1932,7 +1915,6 @@ $1',
'ipb-edit-dropdown' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¶Õ¥Ö€Õ¨',
'ipb-unblock-addr' => 'Ô±Õ¶Õ¡Ö€Õ£Õ¥Õ¬Õ¥Õ¬ $1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ«Õ¶',
'ipb-unblock' => 'Ô±Õ¶Õ¡Ö€Õ£Õ¥Õ¬Õ¥Õ¬ Õ¸Ö€Ö‡Õ§ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö Õ¯Õ¡Õ´ IP-Õ°Õ¡Õ½ÖÕ¥',
-'ipb-blocklist-addr' => '$1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ£Õ¸Ö€Õ®Õ¸Õ² Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨',
'ipb-blocklist' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ² Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨',
'ipb-blocklist-contribs' => '$1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¶Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´Õ¨',
'unblockip' => 'Ô±Õ¶Õ¡Ö€Õ£Õ¥Õ¬Õ¥Õ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ«Õ¶',
@@ -2044,7 +2026,7 @@ $1',
«[[:$1]]» Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢ Õ§Õ» Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ«Ö‰ ÕˆÖ‚Õ¦Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¶ Õ»Õ¶Õ»Õ¥Õ¬Õ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¸Ö‚Õ´Õ¨ Õ«Ö€Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'delete_and_move_confirm' => 'Ô±ÕµÕ¸, Õ»Õ¶Õ»Õ¥Õ¬ Õ§Õ»Õ¨',
-'delete_and_move_reason' => 'ÕÕ¶Õ»Õ¾Õ¡Õ® Õ§Õ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ¿Õ¥Õ² Õ¡Õ¦Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€',
+'delete_and_move_reason' => 'Õ‹Õ¶Õ»Õ¾Õ¡Õ® Õ§Õ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ¿Õ¥Õ² Õ¡Õ¦Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€',
'selfmove' => 'ÔµÕ¬Õ¡Õ¯Õ¥Õ¿Õ¡ÕµÕ«Õ¶ Ö‡ Õ¶Õ¸Ö€ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´ Õ¥Õ¶. Õ¡Õ¶Õ°Õ¶Õ¡Ö€ Õ§ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬ Õ§Õ»Õ¨ Õ«Õ¶Ö„Õ¶ Õ«Ö€Õ¥Õ¶Ö‰',
'move-leave-redirect' => 'Ô¹Õ¸Õ²Õ¶Õ¥Õ¬ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Ö‰',
@@ -2074,7 +2056,7 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
# Thumbnails
'thumbnail-more' => 'Ô¸Õ¶Õ¤Õ¡Ö€Õ±Õ¡Õ¯Õ¥Õ¬',
-'filemissing' => 'Õ†Õ´Õ¡Õ¶ Ö†Õ¡ÕµÕ¬ Õ¹Õ¯Õ¡',
+'filemissing' => 'Õ†Õ´Õ¡Õ¶ Õ¶Õ«Õ·Ö„ Õ¹Õ¯Õ¡',
'thumbnail_error' => 'ÕŠÕ¡Õ¿Õ¯Õ¥Ö€Õ«Õ¯Õ« Õ½Õ¿Õ¥Õ²Õ®Õ´Õ¡Õ¶ Õ½Õ­Õ¡Õ¬. $1',
'djvu_page_error' => 'DjVu Õ§Õ»Õ¨ Õ¬Õ¡ÕµÕ¶Õ¸Ö‚ÕµÕ©Õ«Ö Õ¤Õ¸Ö‚Ö€Õ½ Õ§',
'djvu_no_xml' => 'Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ XML DjVu Õ¶Õ«Õ·Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€',
@@ -2276,19 +2258,19 @@ $1',
'nextdiff' => 'Հաջորդ խմբագրում →',
# Media information
-'mediawarning' => "'''Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´'''. Õ¡ÕµÕ½ Ö†Õ¡ÕµÕ¬Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¾Õ¶Õ¡Õ½Õ¡Õ¯Õ¡Ö€ Õ®Ö€Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ¯Õ¸Õ¤, Õ¸Ö€Õ« Õ¯Õ¡Õ¿Õ¡Ö€Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¾Õ¿Õ¡Õ¶Õ£Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨Ö‰",
+'mediawarning' => "'''Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´'''. Õ¡ÕµÕ½ Õ¶Õ«Õ·Ö„Õ« Õ¿Õ¥Õ½Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¾Õ¶Õ¡Õ½Õ¡Õ¯Õ¡Ö€ Õ®Ö€Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ¯Õ¸Õ¤Ö‰ Ô±ÕµÕ¶ Õ¯Õ«Ö€Õ¡Ö€Õ¯Õ¥Õ¬Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¾Õ¿Õ¡Õ¶Õ£Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨Ö‰",
'imagemaxsize' => 'ÕŠÕ¡Õ¿Õ¯Õ¥Ö€Õ« Õ§Õ»Õ¸Ö‚Õ´ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ« Õ¹Õ¡ÖƒÕ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´.',
'thumbsize' => 'ÕŠÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« ÖƒÕ¸Ö„Ö€Õ¡ÖÕ¾Õ¡Õ® Õ¹Õ¡Öƒ.',
'widthheightpage' => '$1 × $2, $3 էջեր',
-'file-info' => '(Ö†Õ¡ÕµÕ¬Õ« Õ¹Õ¡Öƒ. $1, MIME-Õ¿Õ¥Õ½Õ¡Õ¯. $2)',
-'file-info-size' => '($1 × $2 ÖƒÕ«Ö„Õ½Õ¥Õ¬, Ö†Õ¡ÕµÕ¬Õ« Õ¹Õ¡ÖƒÕ $3, MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ $4)',
+'file-info' => 'Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ $1, MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ $2',
+'file-info-size' => '$1 × $2 ÖƒÕ«Ö„Õ½Õ¥Õ¬, Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ¨Õ $3, MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ¨Õ $4',
'file-nohires' => '<small>Ô²Õ¡Ö€Õ±Ö€ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯ Õ¹Õ¯Õ¡Ö‰</small>',
-'svg-long-desc' => '(SVG-ֆայլ, անվանապես $1 × $2 փիքսել, ֆայլի չափ. $3)',
+'svg-long-desc' => 'SVG-Õ¶Õ«Õ·Ö„, Õ¡Õ¶Õ¾Õ¡Õ¶Õ¡ÕºÕ¥Õ½ $1 × $2 ÖƒÕ«Ö„Õ½Õ¥Õ¬, Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ¨Õ $3',
'show-big-image' => 'Ô¼Ö€Õ«Õ¾ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢',
'show-big-image-thumb' => '<small>Նախադիտման չափ. $1 × $2 փիքսել</small>',
# Special:NewFiles
-'newimages' => 'Õ†Õ¸Ö€ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ½Ö€Õ¡Õ°',
+'newimages' => 'Õ†Õ¸Ö€ Õ¶Õ«Õ·Ö„Õ¥Ö€Õ« Õ½Ö€Õ¡Õ°',
'imagelisttext' => "ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ§ '''$1''' {{PLURAL:$1|Õ¶Õ«Õ·Ö„Õ«}} ÖÕ¡Õ¶Õ¯Õ Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ¨Õ½Õ¿ $2Ö‰",
'showhidebots' => '($1 Õ¢Õ¸Õ¿Õ¥Ö€Õ«Õ¶)',
'noimages' => 'ÕÕ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö‚ Õ¢Õ¡Õ¶ Õ¹Õ¯Õ¡Ö‰',
@@ -2333,7 +2315,7 @@ $1',
# External editor support
'edit-externally' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ¶Õ«Õ·Ö„Õ¨ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ«Õ¹Õ¸Õ¾',
-'edit-externally-help' => '(Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¿Õ¥Õ½ [http://www.mediawiki.org/wiki/Manual:External_editors setup instructions])',
+'edit-externally-help' => '(Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¿Õ¥Õ½ [http://www.mediawiki.org/wiki/Manual:External_editors Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ´Õ¡Õ¶ Õ°Ö€Õ¡Õ°Õ¡Õ¶Õ£Õ¶Õ¥Ö€Õ¨])',
# 'all' in various places, this might be different for inflected languages
'recentchangesall' => 'Õ¢Õ¸Õ¬Õ¸Ö€',
diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php
index cafe9736..d7863f22 100644
--- a/languages/messages/MessagesIa.php
+++ b/languages/messages/MessagesIa.php
@@ -14,7 +14,7 @@
* @author לערי ריינה×רט
*/
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$namespaceNames = array(
NS_MEDIA => 'Multimedia',
@@ -41,93 +41,95 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redirectiones duple' ),
- 'BrokenRedirects' => array( 'Redirectiones rupte' ),
+ 'DoubleRedirects' => array( 'Redirectiones_duple' ),
+ 'BrokenRedirects' => array( 'Redirectiones_rupte' ),
'Disambiguations' => array( 'Disambiguationes' ),
- 'Userlogin' => array( 'Aperir session', 'Identificar' ),
- 'Userlogout' => array( 'Clauder session', 'Disconnecter' ),
- 'CreateAccount' => array( 'Crear conto' ),
+ 'Userlogin' => array( 'Aperir_session', 'Identificar' ),
+ 'Userlogout' => array( 'Clauder_session', 'Disconnecter' ),
+ 'CreateAccount' => array( 'Crear_conto' ),
'Preferences' => array( 'Preferentias' ),
'Watchlist' => array( 'Observatorio' ),
- 'Recentchanges' => array( 'Modificationes recente' ),
+ 'Recentchanges' => array( 'Modificationes_recente' ),
'Upload' => array( 'Incargar', 'Cargar' ),
- 'Listfiles' => array( 'Lista de files', 'Lista de imagines' ),
- 'Newimages' => array( 'Nove files', 'Nove imagines' ),
- 'Listusers' => array( 'Lista de usatores' ),
- 'Listgrouprights' => array( 'Lista del derectos de gruppos' ),
+ 'Listfiles' => array( 'Lista_de_files', 'Lista_de_imagines' ),
+ 'Newimages' => array( 'Nove_files', 'Nove_imagines' ),
+ 'Listusers' => array( 'Lista_de_usatores' ),
+ 'Listgrouprights' => array( 'Lista_del_derectos_de_gruppos' ),
'Statistics' => array( 'Statisticas' ),
- 'Randompage' => array( 'Aleatori', 'Pagina aleatori' ),
- 'Lonelypages' => array( 'Paginas orphanate' ),
- 'Uncategorizedpages' => array( 'Paginas non categorisate' ),
- 'Uncategorizedcategories' => array( 'Categorias non categorisate' ),
- 'Uncategorizedimages' => array( 'Files non categorisate', 'Imagines non categorisate' ),
- 'Uncategorizedtemplates' => array( 'Patronos non categorisate' ),
- 'Unusedcategories' => array( 'Categorias non usate' ),
- 'Unusedimages' => array( 'Files non usate', 'Imagines non usate' ),
- 'Wantedpages' => array( 'Paginas desirate', 'Ligamines rupte' ),
- 'Wantedcategories' => array( 'Categorias desirate' ),
- 'Wantedfiles' => array( 'Files desirate' ),
- 'Wantedtemplates' => array( 'Patronos desirate' ),
- 'Mostlinked' => array( 'Paginas le plus ligate', 'Le plus ligate' ),
- 'Mostlinkedcategories' => array( 'Categorias le plus ligate', 'Categorias le plus usate' ),
- 'Mostlinkedtemplates' => array( 'Patronos le plus ligate', 'Patronos le plus usate' ),
- 'Mostimages' => array( 'Files le plus ligate', 'Le plus files', 'Le plus imagines' ),
- 'Mostcategories' => array( 'Le plus categorias' ),
- 'Mostrevisions' => array( 'Le plus versiones' ),
- 'Fewestrevisions' => array( 'Le minus versiones' ),
- 'Shortpages' => array( 'Paginas curte' ),
- 'Longpages' => array( 'Paginas longe' ),
- 'Newpages' => array( 'Paginas nove', 'Nove paginas' ),
- 'Ancientpages' => array( 'Paginas ancian' ),
- 'Deadendpages' => array( 'Paginas sin exito' ),
- 'Protectedpages' => array( 'Paginas protegite' ),
- 'Protectedtitles' => array( 'Titulos protegite' ),
- 'Allpages' => array( 'Tote le paginas' ),
- 'Prefixindex' => array( 'Indice de prefixos' ),
- 'Ipblocklist' => array( 'Lista de blocadas', 'Lista de blocadas IP' ),
- 'Specialpages' => array( 'Paginas special' ),
+ 'Randompage' => array( 'Aleatori', 'Pagina_aleatori' ),
+ 'Lonelypages' => array( 'Paginas_orphanate' ),
+ 'Uncategorizedpages' => array( 'Paginas_non_categorisate' ),
+ 'Uncategorizedcategories' => array( 'Categorias_non_categorisate' ),
+ 'Uncategorizedimages' => array( 'Files_non_categorisate', 'Imagines_non_categorisate' ),
+ 'Uncategorizedtemplates' => array( 'Patronos_non_categorisate' ),
+ 'Unusedcategories' => array( 'Categorias_non_usate' ),
+ 'Unusedimages' => array( 'Files_non_usate', 'Imagines_non_usate' ),
+ 'Wantedpages' => array( 'Paginas_desirate', 'Ligamines_rupte' ),
+ 'Wantedcategories' => array( 'Categorias_desirate' ),
+ 'Wantedfiles' => array( 'Files_desirate' ),
+ 'Wantedtemplates' => array( 'Patronos_desirate' ),
+ 'Mostlinked' => array( 'Paginas_le_plus_ligate', 'Le_plus_ligate' ),
+ 'Mostlinkedcategories' => array( 'Categorias_le_plus_ligate', 'Categorias_le_plus_usate' ),
+ 'Mostlinkedtemplates' => array( 'Patronos_le_plus_ligate', 'Patronos_le_plus_usate' ),
+ 'Mostimages' => array( 'Files_le_plus_ligate', 'Le_plus_files', 'Le_plus_imagines' ),
+ 'Mostcategories' => array( 'Le_plus_categorias' ),
+ 'Mostrevisions' => array( 'Le_plus_versiones' ),
+ 'Fewestrevisions' => array( 'Le_minus_versiones' ),
+ 'Shortpages' => array( 'Paginas_curte' ),
+ 'Longpages' => array( 'Paginas_longe' ),
+ 'Newpages' => array( 'Paginas_nove', 'Nove_paginas' ),
+ 'Ancientpages' => array( 'Paginas_ancian' ),
+ 'Deadendpages' => array( 'Paginas_sin_exito' ),
+ 'Protectedpages' => array( 'Paginas_protegite' ),
+ 'Protectedtitles' => array( 'Titulos_protegite' ),
+ 'Allpages' => array( 'Tote_le_paginas' ),
+ 'Prefixindex' => array( 'Indice_de_prefixos' ),
+ 'Ipblocklist' => array( 'Lista_de_blocadas', 'Lista_de_blocadas_IP' ),
+ 'Specialpages' => array( 'Paginas_special' ),
'Contributions' => array( 'Contributiones' ),
- 'Emailuser' => array( 'Inviar e-mail a un usator' ),
- 'Confirmemail' => array( 'Confirmar e-mail' ),
- 'Whatlinkshere' => array( 'Referentias a iste pagina' ),
- 'Recentchangeslinked' => array( 'Modificationes recente ligate', 'Modificationes connexe' ),
- 'Movepage' => array( 'Renominar pagina' ),
- 'Blockme' => array( 'Blocar me' ),
- 'Booksources' => array( 'Fontes de libros' ),
+ 'Emailuser' => array( 'Inviar_e-mail_a_un_usator' ),
+ 'Confirmemail' => array( 'Confirmar_e-mail' ),
+ 'Whatlinkshere' => array( 'Referentias_a_iste_pagina' ),
+ 'Recentchangeslinked' => array( 'Modificationes_recente_ligate', 'Modificationes_connexe' ),
+ 'Movepage' => array( 'Renominar_pagina' ),
+ 'Blockme' => array( 'Blocar_me' ),
+ 'Booksources' => array( 'Fontes_de_libros' ),
'Categories' => array( 'Categorias' ),
'Export' => array( 'Exportar' ),
- 'Allmessages' => array( 'Tote le messages' ),
+ 'Allmessages' => array( 'Tote_le_messages' ),
'Log' => array( 'Registro', 'Registros' ),
- 'Blockip' => array( 'Blocar', 'Blocar IP', 'Blocar usator' ),
+ 'Blockip' => array( 'Blocar', 'Blocar_IP', 'Blocar_usator' ),
'Undelete' => array( 'Restaurar' ),
'Import' => array( 'Importar' ),
- 'Lockdb' => array( 'Blocar BDD' ),
- 'Unlockdb' => array( 'Disblocar BDD' ),
- 'Userrights' => array( 'Derectos de usatores' ),
- 'MIMEsearch' => array( 'Recerca MIME' ),
- 'FileDuplicateSearch' => array( 'Recerca de files duplice' ),
- 'Unwatchedpages' => array( 'Paginas non observate' ),
- 'Listredirects' => array( 'Lista de redirectiones' ),
- 'Revisiondelete' => array( 'Deletion de versiones' ),
- 'Unusedtemplates' => array( 'Patronos non usate' ),
- 'Randomredirect' => array( 'Redirection aleatori' ),
- 'Mypage' => array( 'Mi pagina' ),
- 'Mytalk' => array( 'Mi discussion' ),
- 'Mycontributions' => array( 'Mi contributiones' ),
- 'Listadmins' => array( 'Lista de administratores' ),
- 'Listbots' => array( 'Lista de robots' ),
- 'Popularpages' => array( 'Paginas popular' ),
+ 'Lockdb' => array( 'Blocar_BDD' ),
+ 'Unlockdb' => array( 'Disblocar_BDD' ),
+ 'Userrights' => array( 'Derectos_de_usatores' ),
+ 'MIMEsearch' => array( 'Recerca_MIME' ),
+ 'FileDuplicateSearch' => array( 'Recerca_de_files_duplice' ),
+ 'Unwatchedpages' => array( 'Paginas_non_observate' ),
+ 'Listredirects' => array( 'Lista_de_redirectiones' ),
+ 'Revisiondelete' => array( 'Deletion_de_versiones' ),
+ 'Unusedtemplates' => array( 'Patronos_non_usate' ),
+ 'Randomredirect' => array( 'Redirection_aleatori' ),
+ 'Mypage' => array( 'Mi_pagina' ),
+ 'Mytalk' => array( 'Mi_discussion' ),
+ 'Mycontributions' => array( 'Mi_contributiones' ),
+ 'Listadmins' => array( 'Lista_de_administratores' ),
+ 'Listbots' => array( 'Lista_de_robots' ),
+ 'Popularpages' => array( 'Paginas_popular' ),
'Search' => array( 'Recerca' ),
- 'Resetpass' => array( 'Cambiar contrasigno' ),
- 'Withoutinterwiki' => array( 'Sin interwiki' ),
- 'MergeHistory' => array( 'Fusionar historia' ),
- 'Filepath' => array( 'Cammino al file' ),
- 'Invalidateemail' => array( 'Invalidar e-mail' ),
- 'Blankpage' => array( 'Pagina vacue' ),
- 'LinkSearch' => array( 'Recerca de ligamines' ),
- 'DeletedContributions' => array( 'Contributiones delite' ),
+ 'Resetpass' => array( 'Cambiar_contrasigno' ),
+ 'Withoutinterwiki' => array( 'Sin_interwiki' ),
+ 'MergeHistory' => array( 'Fusionar_historia' ),
+ 'Filepath' => array( 'Cammino_al_file' ),
+ 'Invalidateemail' => array( 'Invalidar_e-mail' ),
+ 'Blankpage' => array( 'Pagina_vacue' ),
+ 'LinkSearch' => array( 'Recerca_de_ligamines' ),
+ 'DeletedContributions' => array( 'Contributiones_delite' ),
'Tags' => array( 'Etiquettas' ),
- 'Activeusers' => array( 'Usatores active' ),
+ 'Activeusers' => array( 'Usatores_active' ),
+ 'ComparePages' => array( 'Comparar_paginas' ),
+ 'Badtitle' => array( 'Titulo_invalide' ),
);
$messages = array(
@@ -146,8 +148,7 @@ $messages = array(
'tog-editsection' => 'Activar le modification de sectiones con ligamines "[modificar]"',
'tog-editsectiononrightclick' => 'Activar modification de sectiones con clic-a-dextra super lor titulos (require JavaScript)',
'tog-showtoc' => 'Monstrar tabula de contento (in paginas con plus de 3 sectiones)',
-'tog-rememberpassword' => 'Memorar mi contrasigno in iste computator',
-'tog-editwidth' => 'Maximisar le latitude del quadro de modification',
+'tog-rememberpassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
'tog-watchcreations' => 'Adder le paginas que io crea a mi observatorio',
'tog-watchdefault' => 'Adder le paginas que io modifica a mi observatorio',
'tog-watchmoves' => 'Adder le paginas que io renomina a mi observatorio',
@@ -293,31 +294,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Adder topico',
-'vector-action-delete' => 'Deler',
-'vector-action-move' => 'Renominar',
-'vector-action-protect' => 'Proteger',
-'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Disproteger',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Pagina de adjuta',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'Pagina de multimedia',
-'vector-namespace-mediawiki' => 'Message',
-'vector-namespace-project' => 'Pagina de projecto',
-'vector-namespace-special' => 'Pagina special',
-'vector-namespace-talk' => 'Discussion',
-'vector-namespace-template' => 'Patrono',
-'vector-namespace-user' => 'Pagina de usator',
-'vector-view-create' => 'Crear',
-'vector-view-edit' => 'Modificar',
-'vector-view-history' => 'Vider historia',
-'vector-view-view' => 'Leger',
-'vector-view-viewsource' => 'Vider texto fonte',
-'actions' => 'Actiones',
-'namespaces' => 'Spatios de nomines',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Adder topico',
+'vector-action-delete' => 'Deler',
+'vector-action-move' => 'Renominar',
+'vector-action-protect' => 'Proteger',
+'vector-action-undelete' => 'Restaurar',
+'vector-action-unprotect' => 'Disproteger',
+'vector-simplesearch-preference' => 'Activar le suggestiones de recerca meliorate (solmente in apparentia Vector)',
+'vector-view-create' => 'Crear',
+'vector-view-edit' => 'Modificar',
+'vector-view-history' => 'Vider historia',
+'vector-view-view' => 'Leger',
+'vector-view-viewsource' => 'Vider texto fonte',
+'actions' => 'Actiones',
+'namespaces' => 'Spatios de nomines',
+'variants' => 'Variantes',
'errorpagetitle' => 'Error',
'returnto' => 'Retornar a $1.',
@@ -378,6 +369,9 @@ Troppo de usatores tenta vider iste pagina.
Per favor attende un momento ante que tu essaya acceder novemente a iste pagina.
$1',
+'pool-timeout' => 'Tempore limite excedite attendente le serratura',
+'pool-queuefull' => 'Le cauda commun de processos es plen',
+'pool-errorunknown' => 'Error incognite',
# 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' => 'A proposito de {{SITENAME}}',
@@ -545,7 +539,8 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
'yourname' => 'Nomine de usator:',
'yourpassword' => 'Contrasigno:',
'yourpasswordagain' => 'Repete contrasigno:',
-'remembermypassword' => 'Memorar mi contrasigno in iste computator',
+'remembermypassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
+'securelogin-stick-https' => 'Remaner connectite via HTTPS post apertura de session',
'yourdomainname' => 'Tu dominio:',
'externaldberror' => 'O il occurreva un error in le base de datos de authentication, o tu non ha le autorisation de actualisar tu conto externe.',
'login' => 'Aperir session',
@@ -562,6 +557,7 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
'gotaccount' => "Tu jam ha un conto? '''$1'''.",
'gotaccountlink' => 'Aperir session',
'createaccountmail' => 'per e-mail',
+'createaccountreason' => 'Motivo:',
'badretype' => 'Le duo contrasignos que tu scribeva non es identic.',
'userexists' => 'Le nomine de usator que tu entrava es ja in uso.
Selige un altere nomine.',
@@ -588,6 +584,7 @@ Verifica le orthographia.',
'wrongpasswordempty' => 'Tu non entrava un contrasigno. Per favor reprova.',
'passwordtooshort' => 'Le contrasignos debe continer al minus {{PLURAL:$1|1 character|$1 characteres}}.',
'password-name-match' => 'Tu contrasigno debe esser differente de tu nomine de usator.',
+'password-login-forbidden' => 'Le uso de iste nomine de usator e contrasigno ha essite prohibite.',
'mailmypassword' => 'Inviar un nove contrasigno in e-mail',
'passwordremindertitle' => 'Nove contrasigno temporari pro {{SITENAME}}',
'passwordremindertext' => 'Alcuno (probabilemente tu, ab le adresse IP $1) requestava un nove
@@ -632,6 +629,9 @@ Per favor attende ante de probar lo novemente.',
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => 'Le requesta de clauder le session ha essite refusate proque illo pare haber essite inviate per un navigator o proxy de cache defectuose.',
+# E-mail sending
+'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
+
# Password reset dialog
'resetpass' => 'Cambiar contrasigno',
'resetpass_announce' => 'Tu ha aperite un session con un codice temporari que tu recipeva in e-mail.
@@ -685,11 +685,12 @@ Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasig
'showdiff' => 'Detaliar modificationes',
'anoneditwarning' => "'''Attention:''' Tu non ha aperite un session.
Tu adresse IP essera registrate in le historia de modificationes de iste pagina.",
+'anonpreviewwarning' => "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
'missingsummary' => "'''Rememoration:''' Tu non ha specificate un summario del modification.
Si tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
'missingcommenttext' => 'Per favor entra un commento infra.',
-'missingcommentheader' => "'''Memento:''' Tu non entrava un subjecto/titulo pro iste commento.
-Si tu clicca super Publicar de novo, tu commento essera publicate sin subjecto/titulo.",
+'missingcommentheader' => "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.
+Si tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
'summary-preview' => 'Previsualisation del summario:',
'subject-preview' => 'Previsualisation del subjecto/titulo:',
'blockedtitle' => 'Le usator es blocate',
@@ -764,8 +765,12 @@ Le ultime entrata del registro de blocadas es reproducite ci infra pro informati
'''Le modificationes non ha ancora essite salveguardate!'''",
'userjspreview' => "'''Non oblida que isto es solmente un test/previsualisation de tu JavaScript personalisate.'''
'''Illo non ha ancora essite salveguardate!'''",
-'userinvalidcssjstitle' => "'''Attention:''' Le stilo \"\$1\" non existe.
-Memora que le paginas .css and .js personalisate usa un titulo in minusculas, p.ex. {{ns:user}}:Foo/monobook.css e non {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Non oblida que isto es solmente un previsualisation de iste CSS.'''
+'''Le modificationes non ha ancora essite salveguardate!'''",
+'sitejspreview' => "'''Non oblida que isto es solmente un previsualisation de iste codice JavaScript.'''
+'''Le modificationes non ha ancora essite salveguardate!'''",
+'userinvalidcssjstitle' => "'''Attention:''' Le apparentia \"\$1\" non existe.
+Memora que le paginas .css and .js personalisate usa un titulo in minusculas, p.ex. {{ns:user}}:Foo/vector.css e non {{ns:user}}:Foo/Vector.css.",
'updated' => '(Actualisate)',
'note' => "'''Nota:'''",
'previewnote' => "'''Isto es solmente un previsualisation.'''
@@ -809,9 +814,6 @@ In addition, tu nos garanti que tu es le autor de isto, o que tu lo ha copiate d
Si tu non vole que tu scripto sia modificate impietosemente, alora non lo submitte hic.<br />
In addition, tu nos garanti que tu es le autor de isto, o que tu lo ha copiate de un ressource a dominio public o alteremente libere de derectos (vide $1 pro detalios).
'''Non submitte material subjecte a copyright sin autorisation expresse!'''",
-'longpagewarning' => "'''Attention:''' Iste pagina occupa $1 kilobytes;
-alcun navigatores pote presentar problemas in modificar paginas de 32 kilobytes o plus.
-Per favor considera divider le pagina in sectiones minus grande.",
'longpageerror' => "'''Error: Le texto que tu submitteva occupa $1 kilobytes, excedente le maximo de $2 kilobytes.'''
Illo non pote esser salveguardate.",
'readonlywarning' => "'''Attention: Le base de datos ha essite blocate pro mantenentia, ergo tu non pote salveguardar tu modificationes in iste momento.'''
@@ -990,6 +992,8 @@ $1",
'logdelete-failure' => "'''Le visibilitate del registro non poteva esser cambiate:'''
$1",
'revdel-restore' => 'Cambiar visibilitate',
+'revdel-restore-deleted' => 'versiones delite',
+'revdel-restore-visible' => 'versiones visibile',
'pagehist' => 'Historia del pagina',
'deletedhist' => 'Historia delite',
'revdelete-content' => 'contento',
@@ -1059,11 +1063,13 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
# Diffs
'history-title' => 'Historia de versiones de "$1"',
'difference' => '(Differentia inter versiones)',
+'difference-multipage' => '(Differentia inter paginas)',
'lineno' => 'Linea $1:',
'compareselectedversions' => 'Comparar versiones seligite',
'showhideselectedversions' => 'Revelar/celar le versiones seligite',
'editundo' => 'disfacer',
-'diff-multi' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} non es monstrate)',
+'diff-multi' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per {{PLURAL:$2|un usator|$2 usatores}} non es monstrate)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per plus de $2 {{PLURAL:$2|usator|usatores}} non es monstrate)',
# Search results
'searchresults' => 'Resultatos del recerca',
@@ -1098,6 +1104,7 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
'searchprofile-everything-tooltip' => 'Cercar in tote le contento (includente le paginas de discussion)',
'searchprofile-advanced-tooltip' => 'Cercar in spatios de nomines personalisate',
'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 parolas}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 file|$3 files}})',
'search-result-score' => 'Relevantia: $1%',
'search-redirect' => '(redirection ab $1)',
'search-section' => '(section $1)',
@@ -1175,6 +1182,7 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
'contextlines' => 'Lineas per resultato:',
'contextchars' => 'Characteres de contexto per linea:',
'stub-threshold' => 'Limite pro formatar le ligamines in <a href="#" class="stub">stilo de peciettas</a> (bytes):',
+'stub-threshold-disabled' => 'Disactivate',
'recentchangesdays' => 'Numero de dies a monstrar in modificationes recente:',
'recentchangesdays-max' => '(non plus de $1 {{PLURAL:$1|die|dies}})',
'recentchangescount' => 'Numero de modificationes a monstrar per predefinition:',
@@ -1208,6 +1216,7 @@ Ecce un valor aleatorimente generate que tu pote usar: $1',
'prefs-files' => 'Files',
'prefs-custom-css' => 'CSS personalisate',
'prefs-custom-js' => 'JS personalisate',
+'prefs-common-css-js' => 'CSS/JS commun a tote le apparentias:',
'prefs-reset-intro' => 'Iste pagina es pro reinitialisar tu preferentias al valores predefinite del sito.
Le operation non pote esser disfacite.',
'prefs-emailconfirm-label' => 'Confirmation del e-mail:',
@@ -1245,9 +1254,15 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'prefs-advancedrendering' => 'Optiones avantiate',
'prefs-advancedsearchoptions' => 'Optiones avantiate',
'prefs-advancedwatchlist' => 'Optiones avantiate',
-'prefs-display' => 'Optiones de visualisation',
+'prefs-displayrc' => 'Optiones de presentation',
+'prefs-displaysearchoptions' => 'Optiones de presentation',
+'prefs-displaywatchlist' => 'Optiones de presentation',
'prefs-diffs' => 'Differentias',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Sembla valide',
+'email-address-validity-invalid' => 'Un adresse valide es obligatori!',
+
# User rights
'userrights' => 'Gestion de derectos de usator',
'userrights-lookup-user' => 'Gerer gruppos de usatores',
@@ -1331,6 +1346,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'right-hideuser' => 'Blocar un nomine de usator, celante lo del publico',
'right-ipblock-exempt' => 'Contornar le blocadas de adresses IP, blocadas automatic e blocadas de intervallos IP',
'right-proxyunbannable' => 'Contornar le blocadas automatic de proxy',
+'right-unblockself' => 'Disblocar se mesme',
'right-protect' => 'Cambiar nivellos de protection e modificar paginas protegite',
'right-editprotected' => 'Modificar paginas protegite (sin cascada)',
'right-editinterface' => 'Modificar le interfacie de usator',
@@ -1353,7 +1369,6 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'right-siteadmin' => 'Blocar e disblocar le base de datos',
'right-reset-passwords' => 'Redefinir le contrasigno de altere usatores',
'right-override-export-depth' => 'Exportar paginas includente paginas ligate usque a un profunditate de 5',
-'right-versiondetail' => 'Monstrar le informationes complete super le versiones del software',
'right-sendemail' => 'Inviar e-mail a altere usatores',
# User rights log
@@ -1404,14 +1419,9 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'recentchanges-legend' => 'Optiones del modificationes recente',
'recentchangestext' => 'Seque le plus recente modificationes a {{SITENAME}} in iste pagina.',
'recentchanges-feed-description' => 'Seque le modificationes le plus recente al wiki in iste syndication.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nove pagina',
'recentchanges-label-newpage' => 'Iste modification creava un nove pagina',
-'recentchanges-legend-minor' => '$1 - modification minor',
'recentchanges-label-minor' => 'Isto es un modification minor',
-'recentchanges-legend-bot' => '$1 - modification robot',
'recentchanges-label-bot' => 'Iste modification ha essite effectuate per un robot',
-'recentchanges-legend-unpatrolled' => '$1 - modification non patruliate',
'recentchanges-label-unpatrolled' => 'Iste modification non ha ancora essite patruliate',
'rcnote' => "Infra es {{PLURAL:$1|'''1''' modification|le ultime '''$1''' modificationes}} in le ultime {{PLURAL:$2|die|'''$2''' dies}}, actualisate le $4 a $5.",
'rcnotefrom' => 'infra es le modificationes a partir de <b>$2</b> (usque a <b>$1</b>).',
@@ -1458,6 +1468,9 @@ Le paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras
'upload_directory_missing' => 'Le directorio de incargamento ($1) manca, e le servitor de web non poteva crear lo.',
'upload_directory_read_only' => 'Le servitor web non ha le permission de scriber in le directorio de incargamento ($1).',
'uploaderror' => 'Error de incargamento',
+'upload-recreate-warning' => "'''Attention: Un file con iste nomine ha ja essite delite o renominate.'''
+
+Le registro de deletiones e renominationes pro iste pagina es fornite hic pro major commoditate:",
'uploadtext' => "Con le formulario sequente tu pote incargar un nove file in le wiki.
Pro vider o cercar files ja incargate, visita le [[Special:FileList|lista de files incargate]]. In ultra, le (re)incargamentos es registrate in le [[Special:Log/upload|registro de incargamentos]], le deletiones in le [[Special:Log/delete|registro de deletiones]].
@@ -1493,6 +1506,17 @@ Le {{PLURAL:\$3|typo|typos}} de file preferite es \$2.",
'filetype-banned-type' => "Le typo de file '''\".\$1\"''' non es permittite.
Le {{PLURAL:\$3|typo|typos}} de file permittite es \$2.",
'filetype-missing' => 'Le nomine del file non ha un extension (como ".jpg").',
+'empty-file' => 'Le file submittite es vacue',
+'file-too-large' => 'Le file submittite es troppo grande',
+'filename-tooshort' => 'Le nomine del file es troppo curte',
+'filetype-banned' => 'Iste typo de file es prohibite',
+'verification-error' => 'Iste file non passava le verification de files',
+'hookaborted' => 'Le modification que tu ha tentate facer ha essite abortate per un extension.',
+'illegal-filename' => 'Le nomine del file non es permittite.',
+'overwrite' => 'Superscriber un file existente non es permittite.',
+'unknown-error' => 'Un error incognite ha occurrite.',
+'tmp-create-error' => 'Non poteva crear file temporari.',
+'tmp-write-error' => 'Error durante le scriptura in le file temporari.',
'large-file' => 'Es recommendate que le files non sia plus grande de $1;
iste file occupa $2.',
'largefileserver' => 'Le grandor de iste file excede le limite configurate in le servitor.',
@@ -1522,13 +1546,14 @@ Si tu vole ancora incargar iste file, per favor retorna e usa un nove nomine. [[
Si tu vole totevia incargar iste file, per favor retorna e usa un nove nomine. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Iste file es un duplicato del sequente {{PLURAL:$1|file|files}}:',
'file-deleted-duplicate' => 'Un file identic a iste file ([[:$1]]) esseva ja delite anteriormente. Tu deberea verificar le registro de deletiones concernente iste file ante de re-incargar lo.',
-'successfulupload' => 'Incargamento succedite',
'uploadwarning' => 'Advertimento de incargamento',
'uploadwarning-text' => 'Per favor modifica le description del file ci infra e reproba.',
'savefile' => 'Salveguardar file',
'uploadedimage' => 'incargava "[[$1]]"',
'overwroteimage' => 'incargava un nove version de "[[$1]]"',
'uploaddisabled' => 'Incargamento de files disactivate',
+'copyuploaddisabled' => 'Incargamento per URL disactivate.',
+'uploadfromurl-queued' => 'Tu incargamento ha essite mittite in cauda.',
'uploaddisabledtext' => 'Le incargamento de files es disactivate.',
'php-uploaddisabledtext' => 'Le incargamento de files PHP es disactivate. Per favor verifica le configuration file_uploads.',
'uploadscripted' => 'Iste file contine codice de HTML o de script que pote esser interpretate erroneemente per un navigator del web.',
@@ -1563,6 +1588,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- non modificar de alcun modo iste linea -->',
+'upload-success-subj' => 'Incargamento succedite',
+'upload-success-msg' => 'Le incargamento de [$2] ha succedite. Illo es disponibile hic: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema de incargamento',
+'upload-failure-msg' => 'Il ha occurrite un problema con tu incargamento ab [$2]:
+
+$1',
+'upload-warning-subj' => 'Advertimento de incargamento',
+'upload-warning-msg' => 'Occurreva un problema con le incargamento de [$2]. Tu pote retornar al [[Special:Upload/stash/$1|formulario de incargamento]] pro corriger iste problema.',
'upload-proto-error' => 'Protocollo incorrecte',
'upload-proto-error-text' => 'Le incargamento remote require que le adresses URL comencia con <code>http://</code> o <code>ftp://</code>.',
@@ -1629,6 +1662,7 @@ Tu pote reordinar le lista con un clic super le titulo de un columna.',
'listfiles_search_for' => 'Cercar un nomine de media:',
'imgfile' => 'file',
'listfiles' => 'Lista de files',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nomine',
'listfiles_user' => 'Usator',
@@ -1743,8 +1777,8 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
'statistics-edits' => 'Modificationes de paginas depost le installation de {{SITENAME}}',
'statistics-edits-average' => 'Media del modificationes per pagina',
'statistics-views-total' => 'Visitas total',
+'statistics-views-total-desc' => 'Le visitas a paginas inexistente e special non es includite',
'statistics-views-peredit' => 'Visitas per modification',
-'statistics-jobqueue' => 'Longor del [http://www.mediawiki.org/wiki/Manual:Job_queue cauda de actiones]',
'statistics-users' => '[[Special:ListUsers|Usatores]] registrate',
'statistics-users-active' => 'Usatores active',
'statistics-users-active-desc' => 'Usatores qui ha facite un action durante le {{PLURAL:$1|die|$1 dies}} passate',
@@ -1759,7 +1793,7 @@ Un pagina se tracta como pagina de disambiguation si illo usa un patrono al qual
'doubleredirects' => 'Redirectiones duple',
'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
Cata linea contine ligamines al prime e al secunde redirection, con le destination del secunde redirection. Iste es normalmente le "ver" pagina de destination, al qual le prime redirection tamben deberea punctar.
-Le entratas <s>cancellate</s> ha essite resolvite.',
+Le entratas <del>cancellate</del> ha essite resolvite.',
'double-redirect-fixed-move' => '[[$1]] ha essite renominate, illo es ora un redirection verso [[$2]]',
'double-redirect-fixer' => 'Corrector de redirectiones',
@@ -1782,6 +1816,8 @@ Le entratas <s>cancellate</s> ha essite resolvite.',
'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
'nrevisions' => '$1 {{PLURAL:$1|version|versiones}}',
'nviews' => '$1 {{PLURAL:$1|visita|visitas}}',
+'nimagelinks' => 'Usate in $1 {{PLURAL:$1|pagina|paginas}}',
+'ntransclusions' => 'usate in $1 {{PLURAL:$1|pagina|paginas}}',
'specialpage-empty' => 'Il non ha resultatos pro iste reporto.',
'lonelypages' => 'Paginas orphanate',
'lonelypagestext' => 'Le sequente paginas non es ligate ni transcludite in altere paginas in {{SITENAME}}.',
@@ -1940,37 +1976,43 @@ Il pote haber [[{{MediaWiki:Listgrouprights-helppage}}|informationes additional]
'listgrouprights-removegroup-self-all' => 'Pote remover tote le gruppos del proprie conto',
# E-mail user
-'mailnologin' => 'Necun adresse de invio',
-'mailnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]]
+'mailnologin' => 'Necun adresse de invio',
+'mailnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]]
e haber un adresse de e-mail valide in tu [[Special:Preferences|preferentias]]
pro inviar e-mail a altere usatores.',
-'emailuser' => 'Inviar e-mail a iste usator',
-'emailpage' => 'Inviar e-mail al usator',
-'emailpagetext' => 'Le formulario infra es pro inviar un message de e-mail a iste usator.
+'emailuser' => 'Inviar e-mail a iste usator',
+'emailpage' => 'Inviar e-mail al usator',
+'emailpagetext' => 'Le formulario infra es pro inviar un message de e-mail a iste usator.
Le adresse de e-mail que tu indicava in [[Special:Preferences|tu preferentias de usator]] apparera
como le adresse del expeditor del e-mail, de modo que le destinatario pote responder directemente a te.',
-'usermailererror' => 'Le objecto de e-mail retornava le error:',
-'defemailsubject' => 'E-mail de {{SITENAME}}',
-'noemailtitle' => 'Nulle adresse de e-mail',
-'noemailtext' => 'Iste usator non ha specificate un adresse de e-mail valide.',
-'nowikiemailtitle' => 'E-mail non permittite',
-'nowikiemailtext' => 'Iste usator ha optate pro non reciper e-mail de altere usatores.',
-'email-legend' => 'Inviar e-mail a un altere usator de {{SITENAME}}',
-'emailfrom' => 'Expeditor:',
-'emailto' => 'Destinatario:',
-'emailsubject' => 'Subjecto:',
-'emailmessage' => 'Message:',
-'emailsend' => 'Inviar',
-'emailccme' => 'Inviar me un copia de mi message.',
-'emailccsubject' => 'Copia de tu message a $1: $2',
-'emailsent' => 'E-mail inviate',
-'emailsenttext' => 'Tu message de e-mail ha essite inviate.',
-'emailuserfooter' => 'Iste e-mail esseva inviate per $1 a $2 con le function "Inviar e-mail al usator" a {{SITENAME}}.',
+'usermailererror' => 'Le objecto de e-mail retornava le error:',
+'defemailsubject' => 'E-mail de {{SITENAME}}',
+'usermaildisabled' => 'E-mail a usatores disactivate',
+'usermaildisabledtext' => 'Tu non pote inviar e-mail a altere usatores in iste wiki',
+'noemailtitle' => 'Nulle adresse de e-mail',
+'noemailtext' => 'Iste usator non ha specificate un adresse de e-mail valide.',
+'nowikiemailtitle' => 'E-mail non permittite',
+'nowikiemailtext' => 'Iste usator ha optate pro non reciper e-mail de altere usatores.',
+'email-legend' => 'Inviar e-mail a un altere usator de {{SITENAME}}',
+'emailfrom' => 'Expeditor:',
+'emailto' => 'Destinatario:',
+'emailsubject' => 'Subjecto:',
+'emailmessage' => 'Message:',
+'emailsend' => 'Inviar',
+'emailccme' => 'Inviar me un copia de mi message.',
+'emailccsubject' => 'Copia de tu message a $1: $2',
+'emailsent' => 'E-mail inviate',
+'emailsenttext' => 'Tu message de e-mail ha essite inviate.',
+'emailuserfooter' => 'Iste e-mail esseva inviate per $1 a $2 con le function "Inviar e-mail al usator" a {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Lassante un message de systema.',
+'usermessage-editor' => 'Messagero del systema',
# Watchlist
'watchlist' => 'Mi observatorio',
'mywatchlist' => 'Mi observatorio',
-'watchlistfor' => "(pro '''$1''')",
+'watchlistfor2' => 'De $1 $2',
'nowatchlist' => 'Tu non ha paginas sub observation.',
'watchlistanontext' => 'Tu debe $1 pro poter vider o modificar entratas in tu observatorio.',
'watchnologin' => 'Tu non ha aperite un session',
@@ -2023,7 +2065,7 @@ $NEWPAGE
Summario del redactor: $PAGESUMMARY $PAGEMINOREDIT
-Contactar le redactor:
+Pro contactar le redactor:
e-mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
@@ -2032,8 +2074,11 @@ Como alternativa tu pote reinitialisar le optiones de notification pro tote le p
Le systema de notification de {{SITENAME}}, a tu servicio
---
-Pro cambiar le configuration de tu observatorio, visita
+--
+Pro configurar le notification per e-mail, visita
+{{fullurl:{{#special:Preferences}}}}
+
+Pro configurar le observatorio, visita
{{fullurl:{{#special:Watchlist}}/edit}}
Pro retirar le pagina de tu observatorio, visita
@@ -2095,7 +2140,10 @@ Le ultime modification esseva facite per [[User:$3|$3]] ([[User talk:$3|discussi
'revertpage-nouser' => 'Reverteva modificationes per (nomine de usator removite) al ultime version per [[User:$1|$1]]',
'rollback-success' => 'Revocava modificationes per $1;
retornava al version per $2.',
-'sessionfailure' => 'Il pare haber un problema con tu session de conto;
+
+# Edit tokens
+'sessionfailure-title' => 'Error de session',
+'sessionfailure' => 'Il pare haber un problema con tu session de conto;
iste action ha essite cancellate como precaution contra le sequestramento de sessiones.
Per favor preme "retro" e recarga le pagina de ubi tu ha venite, postea reprova.',
@@ -2233,18 +2281,22 @@ $1',
'month' => 'A partir del mense (e anterior):',
'year' => 'A partir del anno (e anterior):',
-'sp-contributions-newbies' => 'Monstrar contributiones de nove contos solmente',
-'sp-contributions-newbies-sub' => 'Pro nove contos',
-'sp-contributions-newbies-title' => 'Contributiones de nove contos de usator',
-'sp-contributions-blocklog' => 'Registro de blocadas',
-'sp-contributions-deleted' => 'contributiones delite de usatores',
-'sp-contributions-logs' => 'registros',
-'sp-contributions-talk' => 'discussion',
-'sp-contributions-userrights' => 'gestion de derectos de usator',
-'sp-contributions-blocked-notice' => 'Iste usator es actualmente blocate. Le ultime entrata del registro de blocadas es reproducite ci infra pro information:',
-'sp-contributions-search' => 'Cercar contributiones',
-'sp-contributions-username' => 'Adresse IP o nomine de usator:',
-'sp-contributions-submit' => 'Cercar',
+'sp-contributions-newbies' => 'Monstrar contributiones de nove contos solmente',
+'sp-contributions-newbies-sub' => 'Pro nove contos',
+'sp-contributions-newbies-title' => 'Contributiones de nove contos de usator',
+'sp-contributions-blocklog' => 'Registro de blocadas',
+'sp-contributions-deleted' => 'contributiones delite de usatores',
+'sp-contributions-uploads' => 'incargamentos',
+'sp-contributions-logs' => 'registros',
+'sp-contributions-talk' => 'discussion',
+'sp-contributions-userrights' => 'gestion de derectos de usator',
+'sp-contributions-blocked-notice' => 'Iste usator es actualmente blocate. Le ultime entrata del registro de blocadas es reproducite ci infra pro information:',
+'sp-contributions-blocked-notice-anon' => 'Iste adresse IP es actualmente blocate.
+Le ultime entrata del registro de blocadas es reproducite hic infra pro information:',
+'sp-contributions-search' => 'Cercar contributiones',
+'sp-contributions-username' => 'Adresse IP o nomine de usator:',
+'sp-contributions-toponly' => 'Monstrar solmente le versiones recente',
+'sp-contributions-submit' => 'Cercar',
# What links here
'whatlinkshere' => 'Referentias a iste pagina',
@@ -2308,7 +2360,6 @@ Vide le [[Special:IPBlockList|lista de adresses IP blocate]] pro revider le bloc
'ipb-edit-dropdown' => 'Modificar le motivos pro blocar',
'ipb-unblock-addr' => 'Disblocar $1',
'ipb-unblock' => 'Disblocar un nomine de usator o un adresse IP',
-'ipb-blocklist-addr' => 'Blocadas existente pro $1',
'ipb-blocklist' => 'Vider blocadas existente',
'ipb-blocklist-contribs' => 'Contributiones de $1',
'unblockip' => 'Disblocar adresse IP',
@@ -2382,6 +2433,8 @@ Per favor contacta tu providitor de servicio internet o supporto technic e infor
Tu non pote crear un conto',
'cant-block-while-blocked' => 'Tu non pote blocar altere usatores durante que tu mesme es blocate.',
'cant-see-hidden-user' => 'Le usator que tu tenta blocar ha ja essite blocate e celate. Post que tu non ha le derecto hideuser, tu non pote vider o modificar le blocada del usator.',
+'ipbblocked' => 'Tu non pote blocar o disblocar altere usatores, proque tu mesme es blocate',
+'ipbnounblockself' => 'Tu non ha le permission de disblocar te mesme',
# Developer tools
'lockdb' => 'Blocar base de datos',
@@ -2424,6 +2477,17 @@ Isto vole dicer que tu pote renominar un pagina retro a su titulo original si tu
'''ATTENTION!'''
Isto pote esser un cambio drastic e inexpectate pro un pagina popular;
per favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
+'movepagetext-noredirectfixer' => "Per medio del formulario infra tu pote renominar un pagina, transferente tote su historia al nove nomine.
+Le titulo anterior devenira un pagina de redirection verso le nove titulo.
+Assecura te de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
+Tu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.
+
+Nota que le pagina '''non''' essera renominate si existe ja un pagina sub le nove titulo, salvo si illo es vacue o un redirection e non ha un historia de modificationes passate.
+Isto vole dicer que tu pote renominar un pagina retro a su titulo original si tu ha committite un error, ben que tu non pote superscriber un pagina existente.
+
+'''Attention!'''
+Isto pote esser un cambio drastic e inexpectate pro un pagina popular;
+per favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
'movepagetalktext' => "Le pagina de discussion associate essera automaticamente renominate conjunctemente con illo '''a minus que''':
*Un pagina de discussion non vacue ja existe sub le nove nomine, o
*Tu dismarca le quadrato infra.
@@ -2481,6 +2545,7 @@ non pote renominar un pagina al mesme titulo.',
'immobile-source-page' => 'Iste pagina non es renominabile.',
'immobile-target-page' => 'Non pote renominar a iste titulo de destination.',
'imagenocrossnamespace' => 'Impossibile renominar un file verso un spatio de nomines non-file',
+'nonfile-cannot-move-to-file' => 'Impossibile renominar un non-file verso le spatio de nomines file',
'imagetypemismatch' => 'Le nove extension del nomine del file non corresponde al typo del file',
'imageinvalidfilename' => 'Le nomine del file de destination es invalide',
'fix-double-redirects' => 'Actualisar tote le redirectiones que puncta verso le titulo original',
@@ -2559,6 +2624,7 @@ Salveguarda lo in tu computator e incarga lo hic.',
'importstart' => 'Importation de paginas in curso…',
'import-revision-count' => '$1 {{PLURAL:$1|version|versiones}}',
'importnopages' => 'Nulle paginas a importar.',
+'imported-log-entries' => '$1 {{PLURAL:$1|entrata|entratas}} del registro importate.',
'importfailed' => 'Importation fallite: <nowiki>$1</nowiki>',
'importunknownsource' => 'Typo del origine de importation non cognoscite',
'importcantopen' => 'Impossibile aperir le file de importation',
@@ -2653,6 +2719,8 @@ Per favor usa le previsualisation ante de publicar.',
'tooltip-rollback' => '"Revocar" reverte le modification(es) de iste pagina del ultime contributor con un singule clic.',
'tooltip-undo' => '"Disfacer" reverte iste modification e aperi le formulario de modification in modo de previsualisation.
Es possibile adder un motivo in le summario.',
+'tooltip-preferences-save' => 'Confirmar preferentias',
+'tooltip-summary' => 'Entra un curte summario',
# Stylesheets
'common.css' => '/* Le CSS placiate hic se applicara a tote le stilos */',
@@ -2785,14 +2853,17 @@ Le execution de illo pote compromitter le securitate de tu systema.",
'imagemaxsize' => "Dimension maxime de imagines:<br />''(pro paginas de description de files)''",
'thumbsize' => 'Dimension del miniaturas:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagina|paginas}}',
-'file-info' => '(grandor del file: $1, typo MIME: $2)',
-'file-info-size' => '($1 × $2 pixel, grandor del file: $3, typo MIME: $4)',
+'file-info' => 'grandor del file: $1, typo MIME: $2',
+'file-info-size' => '$1 × $2 pixel, grandor del file: $3, typo MIME: $4',
'file-nohires' => '<small>Non disponibile in resolution plus alte.</small>',
-'svg-long-desc' => '(File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3)',
+'svg-long-desc' => 'File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
'show-big-image' => 'Plen resolution',
'show-big-image-thumb' => '<small>Dimensiones de iste previsualisation: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'repetente',
'file-info-gif-frames' => '$1 {{PLURAL:$1|photogramma|photogrammas}}',
+'file-info-png-looped' => 'repetente',
+'file-info-png-repeat' => 'repetite $1 {{PLURAL:$1|vice|vices}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|photogramma|photogrammas}}',
# Special:NewFiles
'newimages' => 'Galeria de nove files',
@@ -2948,6 +3019,7 @@ Le alteres essera initialmente celate.
'exif-gpsareainformation' => 'Nomine de area GPS',
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Correction differential GPS',
+'exif-objectname' => 'Titulo curte',
# EXIF attributes
'exif-compression-1' => 'Non comprimite',
@@ -3107,31 +3179,31 @@ Le alteres essera initialmente celate.
'limitall' => 'totes',
# E-mail address confirmation
-'confirmemail' => 'Confirmar adresse de e-mail',
-'confirmemail_noemail' => 'Tu non ha configurate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]].',
-'confirmemail_text' => '{{SITENAME}} require que tu valida tu adresse de e-mail ante que tu usa functiones involvente e-mail.
+'confirmemail' => 'Confirmar adresse de e-mail',
+'confirmemail_noemail' => 'Tu non ha configurate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]].',
+'confirmemail_text' => '{{SITENAME}} require que tu valida tu adresse de e-mail ante que tu usa functiones involvente e-mail.
Activa le button infra pro inviar un message de confirmation a tu adresse.
Le message includera un ligamine continente un codice;
visita le ligamine in tu navigator pro confirmar que tu adresse de e-mail es valide.',
-'confirmemail_pending' => 'Un codice de confirmation ha ja essite inviate a te;
+'confirmemail_pending' => 'Un codice de confirmation ha ja essite inviate a te;
si tu ha recentemente create tu conto, es recommendate attender le arrivata de illo durante alcun minutas ante de provar requestar un nove codice.',
-'confirmemail_send' => 'Inviar un codice de confirmation',
-'confirmemail_sent' => 'Message de confirmation inviate.',
-'confirmemail_oncreate' => 'Un codice de confirmation ha essite inviate a tu adresse de e-mail.
+'confirmemail_send' => 'Inviar un codice de confirmation',
+'confirmemail_sent' => 'Message de confirmation inviate.',
+'confirmemail_oncreate' => 'Un codice de confirmation ha essite inviate a tu adresse de e-mail.
Iste codice non es necessari pro aperir un session, ma es requirite pro activar omne functiones a base de e-mail in le wiki.',
-'confirmemail_sendfailed' => '{{SITENAME}} non poteva inviar te le message de confirmation.
+'confirmemail_sendfailed' => '{{SITENAME}} non poteva inviar te le message de confirmation.
Per favor verifica que tu adresse de e-mail non ha characteres invalide.
Le servitor de e-mail retornava: $1',
-'confirmemail_invalid' => 'Codice de confirmation invalide.
+'confirmemail_invalid' => 'Codice de confirmation invalide.
Es possibile que le codice ha expirate.',
-'confirmemail_needlogin' => 'Tu debe $1 pro confirmar tu adresse de e-mail.',
-'confirmemail_success' => 'Tu adresse de e-mail ha essite confirmate.
+'confirmemail_needlogin' => 'Tu debe $1 pro confirmar tu adresse de e-mail.',
+'confirmemail_success' => 'Tu adresse de e-mail ha essite confirmate.
Tu pote ora aperir un session e fruer te del wiki.',
-'confirmemail_loggedin' => 'Tu adresse de e-mail ha ora essite confirmate.',
-'confirmemail_error' => 'Un problema occurreva durante le salveguarda de tu confirmation.',
-'confirmemail_subject' => 'Confirmation del adresse de e-mail pro {{SITENAME}}',
-'confirmemail_body' => 'Un persona, probabilemente tu, usante le adresse IP $1,
+'confirmemail_loggedin' => 'Tu adresse de e-mail ha ora essite confirmate.',
+'confirmemail_error' => 'Un problema occurreva durante le salveguarda de tu confirmation.',
+'confirmemail_subject' => 'Confirmation del adresse de e-mail pro {{SITENAME}}',
+'confirmemail_body' => 'Un persona, probabilemente tu, usante le adresse IP $1,
ha registrate un conto "$2" con iste adresse de e-mail in {{SITENAME}}.
Pro confirmar que iste conto es de facto tue, e pro activar le functiones
@@ -3145,8 +3217,36 @@ pro cancellar le confirmation del adresse de e-mail:
$5
Iste codice de confirmation expirara a $4.',
-'confirmemail_invalidated' => 'Confirmation del adresse de e-mail cancellate',
-'invalidateemail' => 'Cancellar confirmation del adresse de e-mail',
+'confirmemail_body_changed' => 'Un persona, probabilemente tu, usante le adresse IP $1,
+ha cambiate le adresse de e-mail del conto "$2" a iste adresse in {{SITENAME}}.
+
+Pro confirmar que iste conto es de facto tue, e pro reactivar le functiones
+de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
+
+$3
+
+Si le conto *non* pertine a te, seque iste ligamine
+pro cancellar le confirmation del adresse de e-mail:
+
+$5
+
+Iste codice de confirmation expirara a $4.',
+'confirmemail_body_set' => 'Un persona, probabilemente tu, usante le adresse IP $1,
+ha specificate que iste adresse de e-mail pertine al conto "$2" in {{SITENAME}}.
+
+Pro confirmar que iste conto es de facto tue, e pro reactivar le functiones
+de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
+
+$3
+
+Si le conto *non* pertine a te, seque iste ligamine
+pro cancellar le confirmation del adresse de e-mail:
+
+$5
+
+Iste codice de confirmation expirara a $4.',
+'confirmemail_invalidated' => 'Confirmation del adresse de e-mail cancellate',
+'invalidateemail' => 'Cancellar confirmation del adresse de e-mail',
# Scary transclusion
'scarytranscludedisabled' => '[Le transclusion interwiki es disactivate]',
@@ -3186,6 +3286,7 @@ Per favor confirma que tu realmente vole recrear iste pagina.",
'table_pager_first' => 'Prime pagina',
'table_pager_last' => 'Ultime pagina',
'table_pager_limit' => 'Monstrar $1 entratas per pagina',
+'table_pager_limit_label' => 'Elementos per pagina:',
'table_pager_limit_submit' => 'Ir',
'table_pager_empty' => 'Nulle resultato',
@@ -3242,6 +3343,7 @@ Tu pote etiam [[Special:Watchlist/edit|usar le editor standard]].',
'version-specialpages' => 'Paginas special',
'version-parserhooks' => 'Uncinos del analysator syntactic',
'version-variables' => 'Variabiles',
+'version-skins' => 'Apparentias',
'version-other' => 'Altere',
'version-mediahandlers' => 'Executores de media',
'version-hooks' => 'Uncinos',
@@ -3253,6 +3355,13 @@ Tu pote etiam [[Special:Watchlist/edit|usar le editor standard]].',
'version-hook-subscribedby' => 'Subscribite per',
'version-version' => '(Version $1)',
'version-license' => 'Licentia',
+'version-poweredby-credits' => "Iste wiki es actionate per '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'alteres',
+'version-license-info' => 'MediaWiki es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.
+
+Iste programma es distribuite in le sperantia que illo sia utile, ma SIN GARANTIA; sin mesmo le implicite garantia de COMMERCIALISATION o APTITUDE PRO UN PROPOSITO PARTICULAR. Vide le Licentia Public General de GNU pro plus detalios.
+
+Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Licentia Public General de GNU] con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/copyleft/gpl.html lege lo in linea].',
'version-software' => 'Software installate',
'version-software-product' => 'Producto',
'version-software-version' => 'Version',
@@ -3323,6 +3432,15 @@ Entra le nomine del file sin le prefixo \"{{ns:file}}:\".",
'tags-edit' => 'modificar',
'tags-hitcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
+# Special:ComparePages
+'comparepages' => 'Comparar paginas',
+'compare-selector' => 'Comparar versiones de pagina',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
'dberr-header' => 'Iste wiki ha un problema',
'dberr-problems' => 'Pardono! Iste sito ha incontrate difficultates technic.',
@@ -3339,8 +3457,13 @@ Entra le nomine del file sin le prefixo \"{{ns:file}}:\".",
'htmlform-float-invalid' => 'Le valor que tu specificava non es un numero.',
'htmlform-int-toolow' => 'Le valor que tu specificava es sub le minimo de $1',
'htmlform-int-toohigh' => 'Le valor que tu specificava es super le maximo de $1',
+'htmlform-required' => 'Iste valor es obligatori',
'htmlform-submit' => 'Submitter',
'htmlform-reset' => 'Disfacer modificationes',
'htmlform-selectorother-other' => 'Altere',
+# SQLite database support
+'sqlite-has-fts' => '$1 con supporto de recerca de texto integre',
+'sqlite-no-fts' => '$1 sin supporto de recerca de texto integre',
+
);
diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php
index 9754805a..84da5303 100644
--- a/languages/messages/MessagesId.php
+++ b/languages/messages/MessagesId.php
@@ -23,7 +23,7 @@
* @author לערי ריינה×רט
*/
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$namespaceNames = array(
NS_MEDIA => 'Media',
@@ -134,7 +134,7 @@ $magicWords = array(
'img_page' => array( '1', 'hal=$1', 'halaman=$1', 'hal $1', 'halaman $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'lurus', 'lurus=$1', 'lurus $1', 'tegak', 'tegak=$1', 'tegak $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'tepi', 'batas', 'border' ),
- 'img_baseline' => array( '1', 'gada', 'garis dasar', 'baseline' ),
+ 'img_baseline' => array( '1', 'gada', 'garis_dasar', 'baseline' ),
'img_sub' => array( '1', 'upa', 'sub' ),
'img_top' => array( '1', 'atas', 'top' ),
'img_text_top' => array( '1', 'atek', 'atas-teks', 'text-top' ),
@@ -193,7 +193,7 @@ $magicWords = array(
'special' => array( '0', 'istimewa', 'spesial', 'special' ),
'defaultsort' => array( '1', 'URUTANBAKU:', 'UBUR:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'LOKASIBERKAS:', 'LOBER:', 'FILEPATH:' ),
- 'tag' => array( '0', 'kata kunci', 'takun', 'tag' ),
+ 'tag' => array( '0', 'kata_kunci', 'takun', 'tag' ),
'hiddencat' => array( '1', '__KATEGORITERSEMBUNYI__', '__KATSEM__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'HALAMANDIKATEGORI', 'HALDIKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'BESARHALAMAN', 'BESMAN', 'PAGESIZE' ),
@@ -206,94 +206,96 @@ $magicWords = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Pengalihan ganda', 'PengalihanGanda' ),
- 'BrokenRedirects' => array( 'Pengalihan rusak', 'PengalihanRusak' ),
+ 'DoubleRedirects' => array( 'Pengalihan_ganda', 'PengalihanGanda' ),
+ 'BrokenRedirects' => array( 'Pengalihan_rusak', 'PengalihanRusak' ),
'Disambiguations' => array( 'Disambiguasi' ),
- 'Userlogin' => array( 'Masuk log', 'MasukLog' ),
- 'Userlogout' => array( 'Keluar log', 'KeluarLog' ),
- 'CreateAccount' => array( 'Buat akun', 'BuatAkun' ),
+ 'Userlogin' => array( 'Masuk_log', 'MasukLog' ),
+ 'Userlogout' => array( 'Keluar_log', 'KeluarLog' ),
+ 'CreateAccount' => array( 'Buat_akun', 'BuatAkun' ),
'Preferences' => array( 'Preferensi' ),
- 'Watchlist' => array( 'Daftar pantauan', 'DaftarPantauan' ),
- 'Recentchanges' => array( 'Perubahan terbaru', 'PerubahanTerbaru' ),
+ 'Watchlist' => array( 'Daftar_pantauan', 'DaftarPantauan' ),
+ 'Recentchanges' => array( 'Perubahan_terbaru', 'PerubahanTerbaru', 'RC', 'PT' ),
'Upload' => array( 'Pengunggahan', 'Pemuatan', 'Unggah' ),
- 'Listfiles' => array( 'Daftar berkas', 'DaftarBerkas' ),
- 'Newimages' => array( 'Berkas baru', 'BerkasBaru' ),
- 'Listusers' => array( 'Daftar pengguna', 'DaftarPengguna' ),
- 'Listgrouprights' => array( 'Daftar hak kelompok', 'DaftarHakKelompok', 'DaftarHak' ),
+ 'Listfiles' => array( 'Daftar_berkas', 'DaftarBerkas' ),
+ 'Newimages' => array( 'Berkas_baru', 'BerkasBaru' ),
+ 'Listusers' => array( 'Daftar_pengguna', 'DaftarPengguna' ),
+ 'Listgrouprights' => array( 'Daftar_hak_kelompok', 'DaftarHakKelompok', 'DaftarHak' ),
'Statistics' => array( 'Statistik' ),
- 'Randompage' => array( 'Halaman sembarang', 'HalamanSembarang' ),
- 'Lonelypages' => array( 'Halaman yatim', 'Halaman tak bertuan', 'HalamanYatim', 'HalamanTakBertuan' ),
- 'Uncategorizedpages' => array( 'Halaman tak terkategori', 'HalamanTakTerkategori' ),
- 'Uncategorizedcategories' => array( 'Kategori tak terkategori', 'KategoriTakTerkategori' ),
- 'Uncategorizedimages' => array( 'Berkas tak terkategori', 'BerkasTakTerkategori' ),
- 'Uncategorizedtemplates' => array( 'Templat tak terkategori', 'TemplatTakTerkategori' ),
- 'Unusedcategories' => array( 'Kategori kosong', 'KategoriKosong', 'Kategori tak terpakai', 'KategoriTakTerpakai' ),
- 'Unusedimages' => array( 'Berkas tak terpakai', 'BerkasTakTerpakai', 'Berkas tak digunakan', 'BerkasTakDigunakan' ),
- 'Wantedpages' => array( 'Halaman yang diinginkan', 'HalamanDiinginkan' ),
- 'Wantedcategories' => array( 'Kategori yang diinginkan', 'KategoriDiinginkan' ),
- 'Wantedfiles' => array( 'Berkas yang diinginkan', 'BerkasDiinginkan' ),
- 'Wantedtemplates' => array( 'Templat yang diinginkan', 'TemplatDiinginkan' ),
- 'Mostlinked' => array( 'Halaman paling digunakan', 'HalamanPalingDigunakan' ),
- 'Mostlinkedcategories' => array( 'Kategori paling digunakan', 'KategoriPalingDigunakan' ),
- 'Mostlinkedtemplates' => array( 'Templat paling digunakan', 'TemplatPalingDigunakan' ),
- 'Mostimages' => array( 'Berkas paling digunakan', 'BerkasPalingDigunakan' ),
- 'Mostcategories' => array( 'Kategori terbanyak', 'KategoriTerbanyak' ),
- 'Mostrevisions' => array( 'Perubahan terbanyak', 'PerubahanTerbanyak' ),
- 'Fewestrevisions' => array( 'Perubahan tersedikit', 'PerubahanTersedikit' ),
- 'Shortpages' => array( 'Halaman pendek', 'HalamanPendek' ),
- 'Longpages' => array( 'Halaman panjang', 'HalamanPanjang' ),
- 'Newpages' => array( 'Halaman baru', 'HalamanBaru' ),
- 'Ancientpages' => array( 'Artikel lama', 'ArtikelLama' ),
- 'Deadendpages' => array( 'Halaman buntu', 'HalamanBuntu' ),
- 'Protectedpages' => array( 'Halaman yang dilindungi', 'HalamanDilindungi' ),
- 'Protectedtitles' => array( 'Judul yang dilindungi', 'JudulDilindungi' ),
- 'Allpages' => array( 'Daftar halaman', 'DaftarHalaman' ),
- 'Prefixindex' => array( 'Indeks awalan', 'IndeksAwalan' ),
- 'Ipblocklist' => array( 'Daftar pemblokiran', 'DaftarPemblokiran' ),
- 'Specialpages' => array( 'Halaman istimewa', 'HalamanIstimewa' ),
- 'Contributions' => array( 'Kontribusi pengguna', 'KontribusiPengguna', 'Kontribusi' ),
- 'Emailuser' => array( 'Surel pengguna', 'SurelPengguna' ),
- 'Confirmemail' => array( 'Konfirmasi surel', 'KonfirmasiSurel' ),
- 'Whatlinkshere' => array( 'Pranala balik', 'PranalaBalik' ),
- 'Recentchangeslinked' => array( 'Perubahan terkait', 'PerubahanTerkait' ),
- 'Movepage' => array( 'Pindahkan halaman', 'PindahkanHalaman' ),
- 'Blockme' => array( 'Blokir saya', 'BlokirSaya' ),
- 'Booksources' => array( 'Sumber buku', 'SumberBuku' ),
- 'Categories' => array( 'Daftar kategori', 'DaftarKategori', 'Kategori' ),
+ 'Randompage' => array( 'Halaman_sembarang', 'HalamanSembarang' ),
+ 'Lonelypages' => array( 'Halaman_yatim', 'Halaman_tak_bertuan', 'HalamanYatim', 'HalamanTakBertuan' ),
+ 'Uncategorizedpages' => array( 'Halaman_tak_terkategori', 'HalamanTakTerkategori' ),
+ 'Uncategorizedcategories' => array( 'Kategori_tak_terkategori', 'KategoriTakTerkategori' ),
+ 'Uncategorizedimages' => array( 'Berkas_tak_terkategori', 'BerkasTakTerkategori' ),
+ 'Uncategorizedtemplates' => array( 'Templat_tak_terkategori', 'TemplatTakTerkategori' ),
+ 'Unusedcategories' => array( 'Kategori_kosong', 'KategoriKosong', 'Kategori_tak_terpakai', 'KategoriTakTerpakai' ),
+ 'Unusedimages' => array( 'Berkas_tak_terpakai', 'BerkasTakTerpakai', 'Berkas_tak_digunakan', 'BerkasTakDigunakan' ),
+ 'Wantedpages' => array( 'Halaman_yang_diinginkan', 'HalamanDiinginkan' ),
+ 'Wantedcategories' => array( 'Kategori_yang_diinginkan', 'KategoriDiinginkan' ),
+ 'Wantedfiles' => array( 'Berkas_yang_diinginkan', 'BerkasDiinginkan' ),
+ 'Wantedtemplates' => array( 'Templat_yang_diinginkan', 'TemplatDiinginkan' ),
+ 'Mostlinked' => array( 'Halaman_paling_digunakan', 'HalamanPalingDigunakan' ),
+ 'Mostlinkedcategories' => array( 'Kategori_paling_digunakan', 'KategoriPalingDigunakan' ),
+ 'Mostlinkedtemplates' => array( 'Templat_paling_digunakan', 'TemplatPalingDigunakan' ),
+ 'Mostimages' => array( 'Berkas_paling_digunakan', 'BerkasPalingDigunakan' ),
+ 'Mostcategories' => array( 'Kategori_terbanyak', 'KategoriTerbanyak' ),
+ 'Mostrevisions' => array( 'Perubahan_terbanyak', 'PerubahanTerbanyak' ),
+ 'Fewestrevisions' => array( 'Perubahan_tersedikit', 'PerubahanTersedikit' ),
+ 'Shortpages' => array( 'Halaman_pendek', 'HalamanPendek' ),
+ 'Longpages' => array( 'Halaman_panjang', 'HalamanPanjang' ),
+ 'Newpages' => array( 'Halaman_baru', 'HalamanBaru' ),
+ 'Ancientpages' => array( 'Halaman_lama', 'HalamanLama' ),
+ 'Deadendpages' => array( 'Halaman_buntu', 'HalamanBuntu' ),
+ 'Protectedpages' => array( 'Halaman_yang_dilindungi', 'HalamanDilindungi' ),
+ 'Protectedtitles' => array( 'Judul_yang_dilindungi', 'JudulDilindungi' ),
+ 'Allpages' => array( 'Daftar_halaman', 'DaftarHalaman' ),
+ 'Prefixindex' => array( 'Indeks_awalan', 'IndeksAwalan' ),
+ 'Ipblocklist' => array( 'Daftar_pemblokiran', 'DaftarPemblokiran' ),
+ 'Unblock' => array( 'Pembatalan_pemblokiran', 'PembatalanPemblokiran' ),
+ 'Specialpages' => array( 'Halaman_istimewa', 'HalamanIstimewa' ),
+ 'Contributions' => array( 'Kontribusi_pengguna', 'KontribusiPengguna', 'Kontribusi' ),
+ 'Emailuser' => array( 'Surel_pengguna', 'SurelPengguna' ),
+ 'Confirmemail' => array( 'Konfirmasi_surel', 'KonfirmasiSurel' ),
+ 'Whatlinkshere' => array( 'Pranala_balik', 'PranalaBalik' ),
+ 'Recentchangeslinked' => array( 'Perubahan_terkait', 'PerubahanTerkait' ),
+ 'Movepage' => array( 'Pindahkan_halaman', 'PindahkanHalaman' ),
+ 'Blockme' => array( 'Blokir_saya', 'BlokirSaya' ),
+ 'Booksources' => array( 'Sumber_buku', 'SumberBuku' ),
+ 'Categories' => array( 'Daftar_kategori', 'DaftarKategori', 'Kategori' ),
'Export' => array( 'Ekspor' ),
'Version' => array( 'Versi' ),
- 'Allmessages' => array( 'Pesan sistem', 'PesanSistem' ),
+ 'Allmessages' => array( 'Pesan_sistem', 'PesanSistem' ),
'Log' => array( 'Catatan' ),
- 'Blockip' => array( 'Blokir pengguna', 'BlokirPengguna' ),
- 'Undelete' => array( 'Pembatalan penghapusan', 'PembatalanPenghapusan' ),
+ 'Blockip' => array( 'Blokir_pengguna', 'BlokirPengguna' ),
+ 'Undelete' => array( 'Pembatalan_penghapusan', 'PembatalanPenghapusan' ),
'Import' => array( 'Impor' ),
- 'Lockdb' => array( 'Kunci basis data', 'KunciBasisData' ),
- 'Unlockdb' => array( 'Buka kunci basis data', 'BukaKunciBasisData' ),
- 'Userrights' => array( 'Hak pengguna', 'HakPengguna' ),
- 'MIMEsearch' => array( 'Pencarian MIME', 'PencarianMIME' ),
- 'FileDuplicateSearch' => array( 'Pencarian berkas duplikat', 'PencarianBerkasDuplikat' ),
- 'Unwatchedpages' => array( 'Halaman tak terpantau', 'HalamanTakTerpantau' ),
- 'Listredirects' => array( 'Daftar pengalihan', 'DaftarPengalihan' ),
- 'Revisiondelete' => array( 'Hapus revisi', 'HapusRevisi' ),
- 'Unusedtemplates' => array( 'Templat tak terpakai', 'TemplatTakTerpakai' ),
- 'Randomredirect' => array( 'Pengalihan sembarang', 'PengalihanSembarang' ),
- 'Mypage' => array( 'Halaman saya', 'HalamanSaya' ),
- 'Mytalk' => array( 'Pembicaraan saya', 'PembicaraanSaya' ),
- 'Mycontributions' => array( 'Kontribusi saya', 'KontribusiSaya' ),
- 'Listadmins' => array( 'Daftar pengurus', 'DaftarPengurus' ),
- 'Listbots' => array( 'Daftar bot', 'DaftarBot' ),
- 'Popularpages' => array( 'Halaman populer', 'HalamanPopuler' ),
+ 'Lockdb' => array( 'Kunci_basis_data', 'KunciBasisData' ),
+ 'Unlockdb' => array( 'Buka_kunci_basis_data', 'BukaKunciBasisData' ),
+ 'Userrights' => array( 'Hak_pengguna', 'HakPengguna' ),
+ 'MIMEsearch' => array( 'Pencarian_MIME', 'PencarianMIME' ),
+ 'FileDuplicateSearch' => array( 'Pencarian_berkas_duplikat', 'PencarianBerkasDuplikat' ),
+ 'Unwatchedpages' => array( 'Halaman_tak_terpantau', 'HalamanTakTerpantau' ),
+ 'Listredirects' => array( 'Daftar_pengalihan', 'DaftarPengalihan' ),
+ 'Revisiondelete' => array( 'Hapus_revisi', 'HapusRevisi' ),
+ 'Unusedtemplates' => array( 'Templat_tak_terpakai', 'TemplatTakTerpakai' ),
+ 'Randomredirect' => array( 'Pengalihan_sembarang', 'PengalihanSembarang' ),
+ 'Mypage' => array( 'Halaman_saya', 'HalamanSaya' ),
+ 'Mytalk' => array( 'Pembicaraan_saya', 'PembicaraanSaya' ),
+ 'Mycontributions' => array( 'Kontribusi_saya', 'KontribusiSaya' ),
+ 'Listadmins' => array( 'Daftar_pengurus', 'DaftarPengurus' ),
+ 'Listbots' => array( 'Daftar_bot', 'DaftarBot' ),
+ 'Popularpages' => array( 'Halaman_populer', 'HalamanPopuler' ),
'Search' => array( 'Pencarian', 'Cari' ),
- 'Resetpass' => array( 'Ganti sandi', 'GantiSandi' ),
- 'Withoutinterwiki' => array( 'Tanpa interwiki', 'TanpaInterwiki' ),
- 'MergeHistory' => array( 'Riwayat penggabungan', 'RiwayatPenggabungan' ),
- 'Filepath' => array( 'Lokasi arsip', 'LokasiArsip' ),
- 'Invalidateemail' => array( 'Batalkan validasi surel', 'BatalkanValidasiSurel' ),
- 'Blankpage' => array( 'Halaman kosong', 'HalamanKosong' ),
- 'LinkSearch' => array( 'Pencarian pranala', 'PencarianPranala' ),
- 'DeletedContributions' => array( 'Kontribusi yang dihapus', 'KontribusiDihapus' ),
+ 'Resetpass' => array( 'Ganti_sandi', 'GantiSandi' ),
+ 'Withoutinterwiki' => array( 'Tanpa_interwiki', 'TanpaInterwiki' ),
+ 'MergeHistory' => array( 'Riwayat_penggabungan', 'RiwayatPenggabungan' ),
+ 'Filepath' => array( 'Lokasi_arsip', 'LokasiArsip' ),
+ 'Invalidateemail' => array( 'Batalkan_validasi_surel', 'BatalkanValidasiSurel' ),
+ 'Blankpage' => array( 'Halaman_kosong', 'HalamanKosong' ),
+ 'LinkSearch' => array( 'Pranala_luar', 'PranalaLuar', 'Pencarian_pranala', 'PencarianPranala' ),
+ 'DeletedContributions' => array( 'Kontribusi_yang_dihapus', 'KontribusiDihapus' ),
'Tags' => array( 'Tag' ),
- 'Activeusers' => array( 'Pengguna aktif', 'PenggunaAktif' ),
+ 'Activeusers' => array( 'Pengguna_aktif', 'PenggunaAktif' ),
+ 'ComparePages' => array( 'Bandingkan_halaman', 'BandingkanHalaman' ),
);
$messages = array(
@@ -312,8 +314,7 @@ $messages = array(
'tog-editsection' => 'Fungsikan penyuntingan subbagian melalui pranala [sunting]',
'tog-editsectiononrightclick' => 'Fungsikan penyuntingan subbagian dengan mengeklik kanan pada judul bagian (JavaScript)',
'tog-showtoc' => 'Perlihatkan daftar isi (untuk halaman yang mempunyai lebih dari 3 subbagian)',
-'tog-rememberpassword' => 'Ingat kata sandi saya di komputer ini',
-'tog-editwidth' => 'Perlebar kotak suntingan hingga seluruh layar',
+'tog-rememberpassword' => 'Ingat kata sandi saya di peramban ini (selama $1 {{PLURAL:$1|hari|hari}})',
'tog-watchcreations' => 'Tambahkan halaman yang saya buat ke daftar pantauan',
'tog-watchdefault' => 'Tambahkan halaman yang saya sunting ke daftar pantauan',
'tog-watchmoves' => 'Tambahkan halaman yang saya pindahkan ke daftar pantauan',
@@ -346,6 +347,7 @@ $messages = array(
'tog-ccmeonemails' => 'Kirimkan saya salinan surel yang saya kirimkan ke orang lain',
'tog-diffonly' => 'Jangan tampilkan isi halaman di bawah perbedaan suntingan',
'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
+'tog-noconvertlink' => 'Matikan konversi judul pranala',
'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
'underline-always' => 'Selalu',
@@ -461,31 +463,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Bagian baru',
-'vector-action-delete' => 'Hapus',
-'vector-action-move' => 'Pindahkan',
-'vector-action-protect' => 'Lindungi',
-'vector-action-undelete' => 'Pembatalan penghapusan',
-'vector-action-unprotect' => 'Pelindungan',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Bantuan',
-'vector-namespace-image' => 'Berkas',
-'vector-namespace-main' => 'Halaman',
-'vector-namespace-media' => 'Media',
-'vector-namespace-mediawiki' => 'Pesan',
-'vector-namespace-project' => 'Proyek',
-'vector-namespace-special' => 'Istimewa',
-'vector-namespace-talk' => 'Diskusi',
-'vector-namespace-template' => 'Templat',
-'vector-namespace-user' => 'Pengguna',
-'vector-view-create' => 'Buat',
-'vector-view-edit' => 'Sunting',
-'vector-view-history' => 'Versi terdahulu',
-'vector-view-view' => 'Baca',
-'vector-view-viewsource' => 'Lihat sumber',
-'actions' => 'Tindakan',
-'namespaces' => 'Ruang nama',
-'variants' => 'Varian',
+'vector-action-addsection' => 'Bagian baru',
+'vector-action-delete' => 'Hapus',
+'vector-action-move' => 'Pindahkan',
+'vector-action-protect' => 'Lindungi',
+'vector-action-undelete' => 'Pembatalan penghapusan',
+'vector-action-unprotect' => 'Pelindungan',
+'vector-simplesearch-preference' => 'Aktifkan pencarian saran yang disempurnakan (hanya kulit Vector)',
+'vector-view-create' => 'Buat',
+'vector-view-edit' => 'Sunting',
+'vector-view-history' => 'Versi terdahulu',
+'vector-view-view' => 'Baca',
+'vector-view-viewsource' => 'Lihat sumber',
+'actions' => 'Tindakan',
+'namespaces' => 'Ruang nama',
+'variants' => 'Varian',
'errorpagetitle' => 'Kesalahan',
'returnto' => 'Kembali ke $1.',
@@ -546,6 +538,9 @@ Terlalu banyak pengguna berusaha melihat halaman ini.
Tunggu sebentar sebelum Anda mencoba lagi mengakses halaman ini.
$1',
+'pool-timeout' => 'Lewat waktu menunggu kunci',
+'pool-queuefull' => 'Kumpulan antrean penuh',
+'pool-errorunknown' => 'Kesalahan yang tidak diketahui',
# 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' => 'Tentang {{SITENAME}}',
@@ -599,6 +594,7 @@ $1',
'site-atom-feed' => 'Umpan Atom $1',
'page-rss-feed' => 'Umpan RSS "$1"',
'page-atom-feed' => 'Umpan Atom "$1"',
+'feed-atom' => 'Atom',
'red-link-title' => '$1 (halaman belum tersedia)',
# Short words for each namespace, by default used in the namespace tab in monobook
@@ -703,7 +699,8 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|p
'yourname' => 'Nama pengguna:',
'yourpassword' => 'Kata sandi:',
'yourpasswordagain' => 'Ulangi kata sandi:',
-'remembermypassword' => 'Ingat kata sandi saya di komputer ini',
+'remembermypassword' => 'Ingat kata sandi saya di komputer ini (selama $1 {{PLURAL:$1|hari|hari}})',
+'securelogin-stick-https' => 'Tetap terhubung ke HTTPS setelah masuk',
'yourdomainname' => 'Domain Anda:',
'externaldberror' => 'Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.',
'login' => 'Masuk log',
@@ -720,6 +717,7 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|p
'gotaccount' => "Sudah terdaftar sebagai pengguna? '''$1'''.",
'gotaccountlink' => 'Masuk log',
'createaccountmail' => 'melalui surel',
+'createaccountreason' => 'Alasan:',
'badretype' => 'Kata sandi yang Anda masukkan salah.',
'userexists' => 'Nama pengguna yang Anda pilih sudah dipakai oleh orang lain.
Silakan pilih nama yang lain.',
@@ -741,6 +739,7 @@ Silakan periksa kembali ejaan Anda.',
'wrongpasswordempty' => 'Anda tidak memasukkan kata sandi. Silakan coba lagi.',
'passwordtooshort' => 'Kata sandi paling tidak harus terdiri dari {{PLURAL:$1|1 karakter|$1 karakter}}.',
'password-name-match' => 'Kata sandi Anda harus berbeda dari nama pengguna Anda.',
+'password-login-forbidden' => 'Penggunaan nama pengguna dan sandi ini telah dilarang.',
'mailmypassword' => 'Kirim kata sandi baru',
'passwordremindertitle' => 'Peringatan kata sandi dari {{SITENAME}}',
'passwordremindertext' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta kata sandi baru untuk {{SITENAME}} ($4). Kata sandi sementara untuk pengguna "$2" telah dibuatkan dan diset menjadi "$3". Jika memang Anda yang mengajukan permintaan ini, Anda perlu masuk log dan memilih kata sandi baru sekarang. Kata sandi sementara Anda akan kedaluwarsa dalam waktu {{PLURAL:$5|satu hari|$5 hari}}.
@@ -776,6 +775,9 @@ Silakan menunggu sebelum mencoba lagi.',
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
+# E-mail sending
+'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
+
# Password reset dialog
'resetpass' => 'Ganti kata sandi',
'resetpass_announce' => 'Anda telah masuk log dengan kode sementara yang dikirim melalui surel. Untuk melanjutkan, Anda harus memasukkan kata sandi baru di sini:',
@@ -827,9 +829,10 @@ Anda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sa
'showlivepreview' => 'Pratayang langsung',
'showdiff' => 'Lihat perubahan',
'anoneditwarning' => 'Anda tidak terdaftar masuk. Alamat IP Anda akan tercatat dalam sejarah (versi terdahulu) halaman ini.',
+'anonpreviewwarning' => "''Anda belum masuk log. Menyimpan halaman akan menyebabkan alamat IP Anda tercatat pada riwayat suntingan laman ini.''",
'missingsummary' => "'''Peringatan:''' Anda tidak memasukkan ringkasan penyuntingan. Jika Anda kembali menekan tombol Simpan, suntingan Anda akan disimpan tanpa ringkasan penyuntingan.",
'missingcommenttext' => 'Harap masukkan komentar di bawah ini.',
-'missingcommentheader' => "'''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan Simpan, suntingan Anda akan disimpan tanpa komentar tersebut.",
+'missingcommentheader' => "''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"{{int:savearticle}}\", suntingan Anda akan disimpan tanpa komentar tersebut.",
'summary-preview' => 'Pratayang ringkasan:',
'subject-preview' => 'Pratayang subyek/tajuk:',
'blockedtitle' => 'Pengguna diblokir',
@@ -902,7 +905,11 @@ Entri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan.',
'usercsspreview' => "'''Ingatlah bahwa Anda sedang menampilkan pratayang dari CSS Anda.
Pratayang ini belum disimpan!'''",
'userjspreview' => "'''Ingatlah bahwa yang Anda lihat hanyalah pratayang JavaScript Anda, dan bahwa pratayang tersebut belum disimpan!'''",
-'userinvalidcssjstitle' => "'''Peringatan:''' Kulit \"\$1\" tidak ditemukan. Harap diingat bahwa halaman .css dan .js menggunakan huruf kecil, contoh {{ns:user}}:Foo/monobook.css dan bukannya {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Ingatlah bahwa Anda hanya menampilkan pratayang dari CSS ini.'''
+'''Perubahan belum disimpan!'''",
+'sitejspreview' => "'''Ingatlah bahwa Anda hanya menampilkan pratayang dari kode JavaScript ini.'''
+'''Perubahan belum disimpan!'''",
+'userinvalidcssjstitle' => "'''Peringatan:''' Kulit \"\$1\" tidak ditemukan. Harap diingat bahwa halaman .css dan .js menggunakan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannya {{ns:user}}:Foo/Vector.css.",
'updated' => '(Diperbarui)',
'note' => "'''Catatan:'''",
'previewnote' => "'''Ingatlah bahwa ini hanyalah pratayang yang belum disimpan!'''",
@@ -938,9 +945,6 @@ Jika Anda menyimpannya, perubahan-perubahan yang dibuat sejak revisi ini akan hi
'yourdiff' => 'Perbedaan',
'copyrightwarning' => "Perhatikan bahwa semua kontribusi terhadap {{SITENAME}} dianggap dilisensikan sesuai dengan $2 (lihat $1 untuk informasi lebih lanjut). Jika Anda tidak ingin tulisan Anda disunting dan disebarkan ke halaman web yang lain, jangan kirimkan ke sini.<br />Anda juga berjanji bahwa ini adalah hasil karya Anda sendiri, atau disalin dari sumber milik umum atau sumber bebas yang lain. '''JANGAN KIRIMKAN KARYA YANG DILINDUNGI HAK CIPTA TANPA IZIN!'''",
'copyrightwarning2' => "Perhatikan bahwa semua kontribusi terhadap {{SITENAME}} dapat disunting, diubah, atau dihapus oleh penyumbang lainnya. Jika Anda tidak ingin tulisan Anda disunting orang lain, jangan kirimkan ke sini.<br />Anda juga berjanji bahwa ini adalah hasil karya Anda sendiri, atau disalin dari sumber milik umum atau sumber bebas yang lain (lihat $1 untuk informasi lebih lanjut). '''JANGAN KIRIMKAN KARYA YANG DILINDUNGI HAK CIPTA TANPA IZIN!'''",
-'longpagewarning' => "'''PERINGATAN: Halaman ini panjangnya adalah $1 kilobita;
-beberapa penjelajah web lawas mungkin mengalami masalah dalam menyunting halaman yang panjangnya 32 kb atau lebih.
-Harap pertimbangkan untuk memecah halaman menjadi beberapa bagian yang lebih kecil.'''",
'longpageerror' => "'''KESALAHAN: Teks yang Anda kirimkan sebesar $1 kilobita, yang berarti lebih besar dari jumlah maksimum $2 kilobita. Teks tidak dapat disimpan.'''",
'readonlywarning' => "'''PERINGATAN: Basis data sedang dikunci karena pemeliharaan, sehingga saat ini Anda tidak dapat menyimpan hasil suntingan Anda.
Anda mungkin perlu menyalin teks suntingan Anda ini dan menyimpannya ke sebuah berkas teks dan memuatkannya lagi setelah pemeliharaan selesai.'''
@@ -1115,6 +1119,8 @@ $1",
'logdelete-failure' => "'''Aturan penyembunyian tidak dapat diterapkan:'''
$1",
'revdel-restore' => 'Ubah tampilan',
+'revdel-restore-deleted' => 'Suntingan yang telah dihapus',
+'revdel-restore-visible' => 'tampilan revisi',
'pagehist' => 'Versi terdahulu halaman',
'deletedhist' => 'Sejarah yang dihapus',
'revdelete-content' => 'konten',
@@ -1183,11 +1189,13 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
# Diffs
'history-title' => 'Riwayat revisi dari "$1"',
'difference' => '(Perbedaan antarrevisi)',
+'difference-multipage' => '(Perbedaan antarhalaman)',
'lineno' => 'Baris $1:',
'compareselectedversions' => 'Bandingkan versi terpilih',
'showhideselectedversions' => 'Tampilkan/sembunyikan versi terpilih',
'editundo' => 'batalkan',
-'diff-multi' => '({{PLURAL:$1|Satu|$1}} revisi antara tak ditampilkan.)',
+'diff-multi' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh lebih dari $2 {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
# Search results
'searchresults' => 'Hasil pencarian',
@@ -1222,6 +1230,7 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
'searchprofile-everything-tooltip' => 'Pencarian di seluruh situs (termasuk halaman pembicaraan)',
'searchprofile-advanced-tooltip' => 'Pencarian di ruang nama tertentu',
'search-result-size' => '$1 ({{PLURAL:$2|1 kata|$2 kata}})',
+'search-result-category-size' => '{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})',
'search-result-score' => 'Relevansi: $1%',
'search-redirect' => '(pengalihan $1)',
'search-section' => '(bagian $1)',
@@ -1298,6 +1307,7 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
'contextlines' => 'Baris ditampilkan per hasil:',
'contextchars' => 'Karakter untuk konteks per baris:',
'stub-threshold' => 'Ambang batas untuk format <a href="#" class="stub">pranala rintisan</a>:',
+'stub-threshold-disabled' => 'Dinonaktifkan',
'recentchangesdays' => 'Jumlah hari yang ditampilkan di perubahan terbaru:',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|hari|hari}})',
'recentchangescount' => 'Standar jumlah suntingan yang ditampilkan:',
@@ -1330,6 +1340,7 @@ Berikut ini adalah nilai acak yang dapat Anda gunakan: $1',
'prefs-files' => 'Berkas',
'prefs-custom-css' => 'CSS pribadi',
'prefs-custom-js' => 'JS pribadi',
+'prefs-common-css-js' => 'CSS/JS berbagi untuk semua kulit:',
'prefs-reset-intro' => 'Anda dapat menggunakan halaman ini untuk mengembalikan preferensi Anda ke setelan baku situs.
Pengembalian preferensi tidak dapat dibatalkan.',
'prefs-emailconfirm-label' => 'Konfirmasi surel:',
@@ -1368,9 +1379,15 @@ Anda juga dapat memilih untuk memungkinkan orang lain menghubungi Anda melalui h
'prefs-advancedrendering' => 'Opsi lanjutan',
'prefs-advancedsearchoptions' => 'Opsi lanjutan',
'prefs-advancedwatchlist' => 'Opsi lanjutan',
-'prefs-display' => 'Pilihan tampilan',
+'prefs-displayrc' => 'Pilihan tampilan',
+'prefs-displaysearchoptions' => 'Pilihan tampilan',
+'prefs-displaywatchlist' => 'Pilihan tampilan',
'prefs-diffs' => 'Beda',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Alamat surel tampaknya sah',
+'email-address-validity-invalid' => 'Masukkan alamat surel yang sah',
+
# User rights
'userrights' => 'Manajemen hak pengguna',
'userrights-lookup-user' => 'Mengatur kelompok pengguna',
@@ -1454,6 +1471,7 @@ Anda juga dapat memilih untuk memungkinkan orang lain menghubungi Anda melalui h
'right-hideuser' => 'Memblokir nama pengguna dan menyembunyikannya dari publik',
'right-ipblock-exempt' => 'Mengabaikan pemblokiran IP, pemblokiran otomatis, dan rentang pemblokiran',
'right-proxyunbannable' => 'Mengabaikan pemblokiran otomatis atas proksi',
+'right-unblockself' => 'Melepaskan blokir diri sendiri',
'right-protect' => 'Mengubah tingkat pelindungan dan menyunting halaman yang dilindungi',
'right-editprotected' => 'Menyunting halaman yang dilindungi (tanpa pelindungan runtun)',
'right-editinterface' => 'Menyunting antarmuka pengguna',
@@ -1476,7 +1494,6 @@ Anda juga dapat memilih untuk memungkinkan orang lain menghubungi Anda melalui h
'right-siteadmin' => 'Mengunci dan membuka kunci basis data',
'right-reset-passwords' => 'Mereset kata sandi pengguna lain',
'right-override-export-depth' => 'Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5',
-'right-versiondetail' => 'Melihat informasi versi piranti lunak yang lebih lengkap',
'right-sendemail' => 'Mengirim surel ke pengguna lain',
# User rights log
@@ -1528,14 +1545,9 @@ Anda juga dapat memilih untuk memungkinkan orang lain menghubungi Anda melalui h
'recentchangestext' => "Temukan perubahan terbaru dalam wiki di halaman ini. Keterangan: (beda) = perubahan, (versi) = sejarah revisi, '''B''' = halaman baru, '''k''' = suntingan kecil, '''b''' = suntingan bot, (± ''bita'') = jumlah penambahan/pengurangan isi, → = suntingan bagian, ↠= ringkasan otomatis.
----",
'recentchanges-feed-description' => 'Temukan perubahan terbaru dalam wiki di umpan ini.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - halaman baru',
'recentchanges-label-newpage' => 'Suntingan ini membuat halaman baru',
-'recentchanges-legend-minor' => '$1 - suntingan kecil',
'recentchanges-label-minor' => 'Ini adalah suntingan kecil',
-'recentchanges-legend-bot' => '$1 - suntingan bot',
'recentchanges-label-bot' => 'Suntingan ini dilakukan oleh bot',
-'recentchanges-legend-unpatrolled' => '$1 - suntingan belum terpatroli',
'recentchanges-label-unpatrolled' => 'Suntingan ini belum terpatroli',
'rcnote' => "Berikut adalah {{PLURAL:$1|'''1'''|'''$1'''}} perubahan terbaru dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} terakhir, sampai $4 pukul $5.",
'rcnotefrom' => 'Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).',
@@ -1581,6 +1593,9 @@ Anda juga dapat memilih untuk memungkinkan orang lain menghubungi Anda melalui h
'upload_directory_missing' => 'Direktori pemuatan ($1) tidak ditemukan dan tidak dapat dibuat oleh server web.',
'upload_directory_read_only' => 'Direktori pemuatan ($1) tidak dapat ditulis oleh server web.',
'uploaderror' => 'Kesalahan pemuatan',
+'upload-recreate-warning' => "'''Peringatan: Berkas dengan nama itu telah dihapus atau dipindahkan.'''
+
+Log penghapusan dan pemindahan laman ini adalah sebagai berikut:",
'uploadtext' => "Gunakan formulir di bawah untuk mengunggah berkas.
Untuk menampilkan atau mencari berkas yang sebelumnya dimuat, gunakan [[Special:FileList|daftar berkas]]. Pengunggahan (ulang) juga tercatat dalam [[Special:Log/upload|log pengunggahan]], sementara penghapusan tercatat dalam [[Special:Log/delete|log penghapusan]].
@@ -1615,6 +1630,17 @@ Lihat [[Special:NewFiles|galeri berkas baru]] untuk tampilan visual.',
'filetype-banned-type' => "'''\".\$1\"''' termasuk dalam jenis berkas yang tidak diijinkan.
{{PLURAL:\$3|Jenis berkas yang diijinkan adalah|Jenis berkas yang diijinkan adalah}} \$2.",
'filetype-missing' => 'Berkas tak memiliki ekstensi (misalnya ".jpg").',
+'empty-file' => 'Berkas yang Anda kirim kosong.',
+'file-too-large' => 'Ukuran berkas yang Anda muat terlalu besar.',
+'filename-tooshort' => 'Nama berkas terlalu pendek.',
+'filetype-banned' => 'Jenis berkas ini dilarang.',
+'verification-error' => 'Berkas ini tidak lulus verifikasi.',
+'hookaborted' => 'Modifikasi yang coba Anda lakukan dibatalkan oleh suatu kaitan ekstensi.',
+'illegal-filename' => 'Nama berkas tidak diperbolehkan.',
+'overwrite' => 'Tidak diizinkan untuk menimpa berkas yang telah ada.',
+'unknown-error' => 'Terjadi sebuah kesalahan yang tidak diketahui.',
+'tmp-create-error' => 'Tidak dapat membuat berkas sementara.',
+'tmp-write-error' => 'Kesalahan sewaktu menulis berkas sementara.',
'large-file' => 'Ukuran berkas disarankan untuk tidak melebihi $1 bita; berkas ini berukuran $2 bita.',
'largefileserver' => 'Berkas ini lebih besar dari pada yang diizinkan server.',
'emptyfile' => 'Berkas yang Anda muatkan kelihatannya kosong. Hal ini mungkin disebabkan karena adanya kesalahan ketik pada nama berkas. Silakan pastikan apakah Anda benar-benar ingin memuatkan berkas ini.',
@@ -1638,13 +1664,14 @@ Jika Anda masih ingin memuat berkas Anda, silakan kembali dan gunakan nama baru.
Jika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Berkas ini berduplikasi dengan {{PLURAL:$1|berkas|berkas-berkas}} berikut:',
'file-deleted-duplicate' => 'Sebuah berkas yang identik dengan berkas ini ([[:$1]]) sudah pernah dihapuskan sebelumnya. Anda harus memeriksa sejarah penghapusan berkas tersebut sebelum melanjutkan memuat ulang berkas ini.',
-'successfulupload' => 'Berhasil dimuat',
'uploadwarning' => 'Peringatan pemuatan',
'uploadwarning-text' => 'Mohon perbaiki keterangan berkas di bawah dan coba lagi.',
'savefile' => 'Simpan berkas',
'uploadedimage' => 'memuat "[[$1]]"',
'overwroteimage' => 'memuat versi baru dari "[[$1]]"',
'uploaddisabled' => 'Maaf, fasilitas pemuatan dimatikan.',
+'copyuploaddisabled' => 'Pengunggahan dengan URL dimatikan.',
+'uploadfromurl-queued' => 'Pengunggahan Anda telah terantri.',
'uploaddisabledtext' => 'Pemuatan berkas tidak diizinkan.',
'php-uploaddisabledtext' => 'Pemuatan berkas dimatikan di PHP. Silakan cek pengaturan file_uploads.',
'uploadscripted' => 'Berkas ini mengandung HTML atau kode yang dapat diinterpretasikan dengan keliru oleh penjelajah web.',
@@ -1663,6 +1690,14 @@ Jika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain
Anda harus mempertimbangkan apakah perlu untuk melanjutkan pemuatan berkas ini.
Log penghapusan berkas adalah sebagai berikut:",
'filename-bad-prefix' => "Nama berkas yang Anda muat diawali dengan '''\"\$1\"''', yang merupakan nama non-deskriptif yang biasanya diberikan secara otomatis oleh kamera digital. Harap pilih nama lain yang lebih deskriptif untuk berkas Anda.",
+'upload-success-subj' => 'Berhasil dimuat',
+'upload-success-msg' => 'Pengunggahan Anda dari [$2] berhasil. Hasilnya tersedia di sini: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Masalah pengunggahan',
+'upload-failure-msg' => 'Ada masalah dengan unggahan Anda dari [$2]:
+
+$1',
+'upload-warning-subj' => 'Peringatan pemuatan',
+'upload-warning-msg' => 'Terjadi masalah dengan unggahan Anda dari [$2]. Anda dapat kembali ke [[Special:Upload/stash/$1|formulir pengunggahan]] untuk memerbaiki masalah ini.',
'upload-proto-error' => 'Protokol tak tepat',
'upload-proto-error-text' => 'Pemuatan jarak jauh membutuhkan URL yang diawali dengan <code>http://</code> atau <code>ftp://</code>.',
@@ -1724,6 +1759,7 @@ Klik pada kepala kolom untuk mengubah urutan.',
'listfiles_search_for' => 'Cari nama berkas:',
'imgfile' => 'berkas',
'listfiles' => 'Daftar berkas',
+'listfiles_thumb' => 'Miniatur',
'listfiles_date' => 'Tanggal',
'listfiles_name' => 'Nama',
'listfiles_user' => 'Pengguna',
@@ -1767,6 +1803,7 @@ Deskripsi dari [$2 halaman deskripsinya] ditunjukkan di bawah ini.',
'uploadnewversion-linktext' => 'Muatkan versi yang lebih baru dari berkas ini',
'shared-repo-from' => 'dari $1',
'shared-repo' => 'suatu repositori bersama',
+'filepage.css' => '/* CSS yang ditempatkan di sini disertakan pada halaman deskripsi berkas, juga disertakan pada klien wiki asing */',
# File reversion
'filerevert' => 'Kembalikan $1',
@@ -1811,7 +1848,7 @@ Deskripsi dari [$2 halaman deskripsinya] ditunjukkan di bawah ini.',
# Unused templates
'unusedtemplates' => 'Templat yang tak digunakan',
-'unusedtemplatestext' => 'Daftar berikut adalah semua halaman pada ruang nama {{ns:template}} yang tidak dipakai di halaman manapun.
+'unusedtemplatestext' => 'Daftar berikut adalah semua halaman pada ruang nama {{ns:template}} yang tidak dipakai di halaman mana pun.
Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
'unusedtemplateswlh' => 'pranala lain',
@@ -1837,8 +1874,8 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
'statistics-edits' => 'Jumlah suntingan sejak {{SITENAME}} dimulai',
'statistics-edits-average' => 'Rata-rata suntingan per halaman',
'statistics-views-total' => 'Jumlah penampilan halaman',
+'statistics-views-total-desc' => 'Tampilan ke halaman yang tidak ada dan halaman khusus yang tidak dimasukkan',
'statistics-views-peredit' => 'Jumlah penampilan per suntingan',
-'statistics-jobqueue' => 'Jumlah [http://www.mediawiki.org/wiki/Manual:Job_queue antrean pekerjaan]',
'statistics-users' => 'Jumlah [[Special:ListUsers|pengguna terdaftar]]',
'statistics-users-active' => 'Jumlah pengguna aktif',
'statistics-users-active-desc' => 'Pengguna yang telah melakukan suatu aktivitas dalam {{PLURAL:$1|sehari|$1 hari}} terakhir.',
@@ -1851,9 +1888,9 @@ Halaman-halaman tersebut seharusnya berpaut ke topik-topik yang sesuai.<br />
Suatu halaman dianggap sebagai halaman disambiguasi apabila halaman tersebut menggunakan templat yang terhubung ke [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'Pengalihan ganda',
-'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
+'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
Setiap baris memuat pranala ke pengalihan pertama dan pengalihan kedua serta target dari pengalihan kedua yang umumnya adalah halaman yang "sebenarnya". Halaman peralihan pertama seharusnya dialihkan ke halaman yang bukan merupakan halaman peralihan.
-Nama yang telah <s>dicoret</s> berarti telah dibetulkan.',
+Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
'double-redirect-fixed-move' => '[[$1]] telah dipindahkan menjadi halaman peralihan ke [[$2]]',
'double-redirect-fixer' => 'Revisi pengalihan',
@@ -1876,9 +1913,11 @@ Nama yang telah <s>dicoret</s> berarti telah dibetulkan.',
'nmembers' => '$1 {{PLURAL:$1|isi|isi}}',
'nrevisions' => '$1 {{PLURAL:$1|revisi|revisi}}',
'nviews' => 'dilihat $1 {{PLURAL:$1|kali|kali}}',
+'nimagelinks' => 'Digunakan pada $1 {{PLURAL:$1|halaman|halaman}}',
+'ntransclusions' => 'digunakan pada $1 {{PLURAL:$1|halaman|halaman}}',
'specialpage-empty' => 'Tak ada yang perlu dilaporkan.',
'lonelypages' => 'Halaman tanpa pranala balik',
-'lonelypagestext' => 'Halaman-halaman berikut tidak memiliki pranala dari atau ditransklusikan ke halaman manapun di {{SITENAME}}.',
+'lonelypagestext' => 'Halaman-halaman berikut tidak memiliki pranala dari atau ditransklusikan ke halaman mana pun di {{SITENAME}}.',
'uncategorizedpages' => 'Halaman yang tak terkategori',
'uncategorizedcategories' => 'Kategori yang tak terkategori',
'uncategorizedimages' => 'Berkas yang tak terkategori',
@@ -1901,7 +1940,7 @@ Nama yang telah <s>dicoret</s> berarti telah dibetulkan.',
'shortpages' => 'Halaman pendek',
'longpages' => 'Halaman panjang',
'deadendpages' => 'Halaman buntu',
-'deadendpagestext' => 'Halaman-halaman berikut tidak memiliki pranala ke halaman manapun di wiki ini.',
+'deadendpagestext' => 'Halaman-halaman berikut tidak memiliki pranala ke halaman mana pun di wiki ini.',
'protectedpages' => 'Halaman yang dilindungi',
'protectedpages-indef' => 'Hanya untuk pelindungan dengan jangka waktu tak terbatas',
'protectedpages-cascade' => 'Hanya pelindungan runtun',
@@ -1920,7 +1959,7 @@ Nama yang telah <s>dicoret</s> berarti telah dibetulkan.',
'ancientpages' => 'Halaman terlama',
'move' => 'Pindahkan',
'movethispage' => 'Pindahkan halaman ini',
-'unusedimagestext' => 'Berkas berikut ada tapi tidak disertakan di halaman manapun.
+'unusedimagestext' => 'Berkas berikut ada tapi tidak disertakan di halaman mana pun.
Harap perhatikan bahwa situs web lain mungkin memiliki pranala ke suatu berkas dengan URL langsung, dan karenanya masih terdaftar di sini meskipun sudah tidak digunakan aktif.',
'unusedcategoriestext' => 'Kategori berikut ada, walaupun tidak ada halaman atau kategori lain yang menggunakannya.',
'notargettitle' => 'Tidak ada sasaran',
@@ -2030,34 +2069,40 @@ Lihat pula [[Special:WantedCategories|kategori yang diinginkan]].',
'listgrouprights-removegroup-self-all' => 'Menghapus semua kelompok dari akun sendiri',
# E-mail user
-'mailnologin' => 'Tidak ada alamat surel',
-'mailnologintext' => 'Anda harus [[Special:UserLogin|masuk log]] dan mempunyai alamat surel yang sah di dalam [[Special:Preferences|preferensi]] untuk mengirimkan surel kepada pengguna lain.',
-'emailuser' => 'Surel pengguna',
-'emailpage' => 'Kirim surel ke pengguna ini',
-'emailpagetext' => 'Anda dapat menggunakan formulir di bawah ini untuk mengirimkan surel ke pengguna ini.
+'mailnologin' => 'Tidak ada alamat surel',
+'mailnologintext' => 'Anda harus [[Special:UserLogin|masuk log]] dan mempunyai alamat surel yang sah di dalam [[Special:Preferences|preferensi]] untuk mengirimkan surel kepada pengguna lain.',
+'emailuser' => 'Surel pengguna',
+'emailpage' => 'Kirim surel ke pengguna ini',
+'emailpagetext' => 'Anda dapat menggunakan formulir di bawah ini untuk mengirimkan surel ke pengguna ini.
Alamat surel yang Anda masukkan di [[Special:Preferences|preferensi akun Anda]] akan muncul sebagai alamat "Dari" dalam surel tersebut, sehingga penerima dapat langsung membalas kepada Anda.',
-'usermailererror' => 'Kesalahan objek surat:',
-'defemailsubject' => 'Surel {{SITENAME}}',
-'noemailtitle' => 'Tidak ada alamat surel',
-'noemailtext' => 'Pengguna ini tidak memberikan suatu alamat surel yang valid.',
-'nowikiemailtitle' => 'Surel tak diizinkan',
-'nowikiemailtext' => 'Pengguna ini telah memilih untuk tidak menerima surel dari pengguna lain.',
-'email-legend' => 'Kirim surel ke pengguna {{SITENAME}} lainnya',
-'emailfrom' => 'Dari:',
-'emailto' => 'Untuk:',
-'emailsubject' => 'Perihal:',
-'emailmessage' => 'Pesan:',
-'emailsend' => 'Kirim',
-'emailccme' => 'Kirimkan saya salinan pesan saya.',
-'emailccsubject' => 'Salinan pesan Anda untuk $1: $2',
-'emailsent' => 'Surel terkirim',
-'emailsenttext' => 'Surel Anda telah dikirimkan.',
-'emailuserfooter' => 'Surel ini dikirimkan oleh $1 kepada $2 menggunakan fungsi "Suratepengguna" di {{SITENAME}}.',
+'usermailererror' => 'Kesalahan objek surat:',
+'defemailsubject' => 'Surel {{SITENAME}}',
+'usermaildisabled' => 'Surel pengguna dinonaktifkan',
+'usermaildisabledtext' => 'Anda tidak dapat mengirim surel pada pengguna lain di wiki ini',
+'noemailtitle' => 'Tidak ada alamat surel',
+'noemailtext' => 'Pengguna ini tidak memberikan suatu alamat surel yang valid.',
+'nowikiemailtitle' => 'Surel tak diizinkan',
+'nowikiemailtext' => 'Pengguna ini telah memilih untuk tidak menerima surel dari pengguna lain.',
+'email-legend' => 'Kirim surel ke pengguna {{SITENAME}} lainnya',
+'emailfrom' => 'Dari:',
+'emailto' => 'Untuk:',
+'emailsubject' => 'Perihal:',
+'emailmessage' => 'Pesan:',
+'emailsend' => 'Kirim',
+'emailccme' => 'Kirimkan saya salinan pesan saya.',
+'emailccsubject' => 'Salinan pesan Anda untuk $1: $2',
+'emailsent' => 'Surel terkirim',
+'emailsenttext' => 'Surel Anda telah dikirimkan.',
+'emailuserfooter' => 'Surel ini dikirimkan oleh $1 kepada $2 menggunakan fungsi "Suratepengguna" di {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Tinggalkan pesan sistem.',
+'usermessage-editor' => 'Penyampai pesan sistem',
# Watchlist
'watchlist' => 'Daftar pantauan',
'mywatchlist' => 'Pantauan saya',
-'watchlistfor' => "(untuk '''$1''')",
+'watchlistfor2' => 'Untuk $1 $2',
'nowatchlist' => 'Daftar pantauan Anda kosong.',
'watchlistanontext' => 'Silakan $1 untuk melihat atau menyunting daftar pantauan Anda.',
'watchnologin' => 'Belum masuk log',
@@ -2112,16 +2157,19 @@ Hubungi penyunting:
surel: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Tidak akan ada pemberitahuan lainnya dalam rangka perubahan lebih lanjut kecuali anda mengunjungi halaman ini.
-Anda juga dapat menset ulang tanda pemberitahuan untuk semua halaman pantauan anda pada daftar pantauan anda.
+Kami tidak akan mengirim pemberitahuan lain bila ada perubahan lebih lanjut sampai Anda mengunjungi halaman ini.
+Anda juga dapat menyetel ulang tanda pemberitahuan untuk semua halaman pantauan pada daftar pantauan Anda.
- Sistem pemberitahuan anda di {{SITENAME}}
+ Sistem pemberitahuan situs {{SITENAME}}
--
-Untuk mengubah preferensi daftar pantauan anda, kunjungi
+Untuk mengubah setelan pemberitahuan surel, kunjungi
+{{fullurl:{{#special:Preferences}}}}
+
+Untuk mengubah setelan daftar pantauan, kunjungi
{{fullurl:{{#special:Watchlist}}/edit}}
-Untuk menghapus halaman dari daftar pantauan anda, kunjungi
+Untuk menghapus halaman dari daftar pantauan, kunjungi
$UNWATCHURL
Umpan balik dan bantuan lebih lanjut:
@@ -2175,7 +2223,10 @@ Suntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:p
'revertpage' => 'â†Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dikembalikan ke versi terakhir oleh [[User:$1|$1]]',
'revertpage-nouser' => 'Pengembalian suntingan oleh (pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]',
'rollback-success' => 'Pengembalian suntingan oleh $1; dikembalikan ke versi terakhir oleh $2.',
-'sessionfailure' => 'Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol "kembali" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.',
+
+# Edit tokens
+'sessionfailure-title' => 'Kegagalan sesi',
+'sessionfailure' => 'Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol "kembali" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.',
# Protect
'protectlogpage' => 'Log pelindungan',
@@ -2300,18 +2351,22 @@ $1',
'month' => 'Sejak bulan (dan sebelumnya):',
'year' => 'Sejak tahun (dan sebelumnya):',
-'sp-contributions-newbies' => 'Hanya dari para pengguna baru',
-'sp-contributions-newbies-sub' => 'Untuk pengguna baru',
-'sp-contributions-newbies-title' => 'Kontribusi pengguna baru',
-'sp-contributions-blocklog' => 'Log pemblokiran',
-'sp-contributions-deleted' => 'kontribusi pengguna yang dihapus',
-'sp-contributions-logs' => 'log',
-'sp-contributions-talk' => 'bicara',
-'sp-contributions-userrights' => 'pengelolaan hak pengguna',
-'sp-contributions-blocked-notice' => 'Pengguna ini sedang di blok. log pemblokiran terakhir ditampilkan berikut untuk referensi:',
-'sp-contributions-search' => 'Cari kontribusi',
-'sp-contributions-username' => 'Alamat IP atau nama pengguna:',
-'sp-contributions-submit' => 'Cari',
+'sp-contributions-newbies' => 'Hanya dari para pengguna baru',
+'sp-contributions-newbies-sub' => 'Untuk pengguna baru',
+'sp-contributions-newbies-title' => 'Kontribusi pengguna baru',
+'sp-contributions-blocklog' => 'Log pemblokiran',
+'sp-contributions-deleted' => 'kontribusi pengguna yang dihapus',
+'sp-contributions-uploads' => 'unggahan',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'bicara',
+'sp-contributions-userrights' => 'pengelolaan hak pengguna',
+'sp-contributions-blocked-notice' => 'Pengguna ini sedang di blok. log pemblokiran terakhir ditampilkan berikut untuk referensi:',
+'sp-contributions-blocked-notice-anon' => 'Alamat IP ini diblokir pada saat ini.
+Catatan log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:',
+'sp-contributions-search' => 'Cari kontribusi',
+'sp-contributions-username' => 'Alamat IP atau nama pengguna:',
+'sp-contributions-toponly' => 'Tampilkan hanya revisi teratas',
+'sp-contributions-submit' => 'Cari',
# What links here
'whatlinkshere' => 'Pranala balik',
@@ -2373,7 +2428,6 @@ Lihat [[Special:IPBlockList|Daftar IP]] untuk meninjau kembali pemblokiran.',
'ipb-edit-dropdown' => 'Sunting alasan pemblokiran',
'ipb-unblock-addr' => 'Hilangkan blokir $1',
'ipb-unblock' => 'Hilangkan blokir seorang pengguna atau suatu alamat IP',
-'ipb-blocklist-addr' => 'Blokir yang diterapkan untuk $1',
'ipb-blocklist' => 'Lihat blokir yang diterapkan',
'ipb-blocklist-contribs' => 'Kontribusi untuk $1',
'unblockip' => 'Hilangkan blokir terhadap alamat IP atau pengguna',
@@ -2443,6 +2497,8 @@ $1 sudah diblokir. Apakah Anda ingin mengubah set pemblokiran yang bersangkutan?
'sorbs_create_account_reason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.',
'cant-block-while-blocked' => 'Anda tidak dapat memblokir pengguna lain ketika Anda sendiri sedang diblokir.',
'cant-see-hidden-user' => 'Pengguna yang anda coba blokir telah di blokir dan di sembunyikan. Selama anda tidak memiliki hak sembunyikan pengguna, anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.',
+'ipbblocked' => 'Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena anda sendiri diblokir',
+'ipbnounblockself' => 'Anda tidak diizinkan untuk membuka blokir sendiri',
# Developer tools
'lockdb' => 'Kunci basis data',
@@ -2470,6 +2526,17 @@ Pastikan Anda [[Special:UnlockDB|membuka kuncinya]] setelah pemeliharaan selesai
Perhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan. Ini berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.
'''Peringatan:''' Ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer. Pastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
+'movepagetext-noredirectfixer' => "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.
+Judul yang lama akan menjadi halaman peralihan menuju judul yang baru.
+Pastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].
+Anda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.
+
+Perhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.
+Ini berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.
+
+'''Peringatan:'''
+Hal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;
+Pastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
'movepagetalktext' => "Halaman pembicaraan yang berkaitan juga akan dipindahkan secara otomatis '''kecuali apabila:'''
*Sebuah halaman pembicaraan yang tidak kosong telah ada di bawah judul baru, atau
@@ -2524,6 +2591,7 @@ Halaman yang dituju, "[[:$1]]", telah mempunyai isi. Apakah Anda hendak menghapu
'immobile-source-page' => 'Halaman ini tidak dapat dipindahkan.',
'immobile-target-page' => 'Tidak dapat memindahkan ke judul tujuan tersebut.',
'imagenocrossnamespace' => 'Tidak dapat memindahkan berkas ke ruang nama non-berkas',
+'nonfile-cannot-move-to-file' => 'Tidak dapat memindahkan non-berkas ke ruang nama berkas',
'imagetypemismatch' => 'Ekstensi yang diberikan tidak cocok dengan tipe berkas',
'imageinvalidfilename' => 'Nama berkas tujuan tidak sah',
'fix-double-redirects' => 'Perbaiki semua pengalihan ganda yang mungkin terjadi',
@@ -2605,6 +2673,7 @@ Simpan ke komputer Anda dan unggah ke sini.',
'importstart' => 'Mengimpor halaman...',
'import-revision-count' => '$1 {{PLURAL:$1|revisi|revisi}}',
'importnopages' => 'Tidak ada halaman untuk diimpor.',
+'imported-log-entries' => 'Telah diimpor $1 {{PLURAL:$1|entri log|entri log}}.',
'importfailed' => 'Impor gagal: $1',
'importunknownsource' => 'Sumber impor tidak dikenali',
'importcantopen' => 'Berkas impor tidak dapat dibuka',
@@ -2697,6 +2766,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
'tooltip-upload' => 'Mulai pemuatan',
'tooltip-rollback' => 'Mengembalikan suntingan-suntingan di halaman ini ke kontributor terakhir dalam satu kali klik.',
'tooltip-undo' => 'Mengembalikan revisi ini dan membuka kotak penyuntingan dengan mode pratayang. Alasan dapat ditambahkan di kotak ringkasan.',
+'tooltip-preferences-save' => 'Simpan preferensi',
+'tooltip-summary' => 'Masukkan sebuah ringkasan pendek',
# Stylesheets
'common.css' => '/* CSS yang ada di sini akan diterapkan untuk semua kulit. */',
@@ -2821,14 +2892,17 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
'imagemaxsize' => "Batas ukuran gambar:<br />''(untuk halaman deskripsi berkas)''",
'thumbsize' => 'Ukuran miniatur:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|halaman|halaman}}',
-'file-info' => '(ukuran berkas: $1, tipe MIME: $2)',
-'file-info-size' => '($1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4)',
+'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
+'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
'file-nohires' => '<small>Tak tersedia resolusi yang lebih tinggi.</small>',
-'svg-long-desc' => '(Berkas SVG, nominal $1 × $2 piksel, besar berkas: $3)',
+'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, besar berkas: $3',
'show-big-image' => 'Resolusi penuh',
'show-big-image-thumb' => '<small>Ukuran pratayang ini: $1 × $2 piksel</small>',
'file-info-gif-looped' => 'melingkar',
'file-info-gif-frames' => '$1 {{PLURAL:$1||}}frame',
+'file-info-png-looped' => 'ulang',
+'file-info-png-repeat' => 'dimainkan $1 {{PLURAL:$1|kali|kali}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|bingkai|bingkai}}',
# Special:NewFiles
'newimages' => 'Berkas baru',
@@ -2987,6 +3061,7 @@ Pranala-pranala selanjutnya pada baris yang sama dianggap sebagai pengecualian,
'exif-gpsareainformation' => 'Nama wilayah GPS',
'exif-gpsdatestamp' => 'Tanggal GPS',
'exif-gpsdifferential' => 'Koreksi diferensial GPS',
+'exif-objectname' => 'Judul singkat',
# EXIF attributes
'exif-compression-1' => 'Tak terkompresi',
@@ -3146,27 +3221,27 @@ Pranala-pranala selanjutnya pada baris yang sama dianggap sebagai pengecualian,
'limitall' => 'semua',
# E-mail address confirmation
-'confirmemail' => 'Konfirmasi alamat surel',
-'confirmemail_noemail' => 'Anda tidak memberikan alamat surel yang sah di [[Special:Preferences|preferensi pengguna]] Anda.',
-'confirmemail_text' => '{{SITENAME}} mengharuskan Anda untuk melakukan konfirmasi atas alamat surel Anda sebelum fitur-fitur surel dapat digunakan.
+'confirmemail' => 'Konfirmasi alamat surel',
+'confirmemail_noemail' => 'Anda tidak memberikan alamat surel yang sah di [[Special:Preferences|preferensi pengguna]] Anda.',
+'confirmemail_text' => '{{SITENAME}} mengharuskan Anda untuk melakukan konfirmasi atas alamat surel Anda sebelum fitur-fitur surel dapat digunakan.
Tekan tombol di bawah ini untuk mengirimi Anda sebuah surel yang berisi kode konfirmasi yang berupa sebuah alamat internet.
Salin alamat tersebut ke penjelajah web Anda dan buka alamat tersebut untuk melakukan konfirmasi sehingga menginformasikan bahwa alamat surel Anda valid.',
-'confirmemail_pending' => 'Suatu kode konfirmasi telah dikirimkan kepada Anda; jika Anda baru saja membuat akun Anda, silakan tunggu beberapa menit untuk surat tersebut tiba sebelum mencoba untuk meminta satu kode baru.',
-'confirmemail_send' => 'Kirim kode konfirmasi',
-'confirmemail_sent' => 'Surel berisi kode konfirmasi telah dikirim.',
-'confirmemail_oncreate' => 'Suatu kode konfirmasi telah dikirimkan ke alamat surel Anda. Kode ini tidak dibutuhkan untuk masuk log, tapi dibutuhkan sebelum menggunakan semua fitur yang menggunakan surel di wiki ini.',
-'confirmemail_sendfailed' => '{{SITENAME}} tidak berhasil mengirimkan surat konfirmasi Anda.
+'confirmemail_pending' => 'Suatu kode konfirmasi telah dikirimkan kepada Anda; jika Anda baru saja membuat akun Anda, silakan tunggu beberapa menit untuk surat tersebut tiba sebelum mencoba untuk meminta satu kode baru.',
+'confirmemail_send' => 'Kirim kode konfirmasi',
+'confirmemail_sent' => 'Surel berisi kode konfirmasi telah dikirim.',
+'confirmemail_oncreate' => 'Suatu kode konfirmasi telah dikirimkan ke alamat surel Anda. Kode ini tidak dibutuhkan untuk masuk log, tapi dibutuhkan sebelum menggunakan semua fitur yang menggunakan surel di wiki ini.',
+'confirmemail_sendfailed' => '{{SITENAME}} tidak berhasil mengirimkan surat konfirmasi Anda.
Harap cek kemungkinan karakter ilegal pada alamat surel.
Aplikasi pengiriman surel menginformasikan: $1',
-'confirmemail_invalid' => 'Kode konfirmasi salah. Kode tersebut mungkin sudah kedaluwarsa.',
-'confirmemail_needlogin' => 'Anda harus melakukan $1 untuk mengkonfirmasikan alamat surel Anda.',
-'confirmemail_success' => 'Alamat surel Anda telah dikonfirmasi.
+'confirmemail_invalid' => 'Kode konfirmasi salah. Kode tersebut mungkin sudah kedaluwarsa.',
+'confirmemail_needlogin' => 'Anda harus melakukan $1 untuk mengkonfirmasikan alamat surel Anda.',
+'confirmemail_success' => 'Alamat surel Anda telah dikonfirmasi.
Sekarang Anda dapat [[Special:UserLogin|masuk log]] dan mulai menggunakan wiki.',
-'confirmemail_loggedin' => 'Alamat surel Anda telah dikonfirmasi.',
-'confirmemail_error' => 'Terjadi kesalahan sewaktu menyimpan konfirmasi Anda.',
-'confirmemail_subject' => 'Konfirmasi alamat surel {{SITENAME}}',
-'confirmemail_body' => 'Seseorang, mungkin Anda, dari alamat IP $1, telah mendaftarkan akun "$2" dengan alamat surel ini di {{SITENAME}}.
+'confirmemail_loggedin' => 'Alamat surel Anda telah dikonfirmasi.',
+'confirmemail_error' => 'Terjadi kesalahan sewaktu menyimpan konfirmasi Anda.',
+'confirmemail_subject' => 'Konfirmasi alamat surel {{SITENAME}}',
+'confirmemail_body' => 'Seseorang, mungkin Anda, dari alamat IP $1, telah mendaftarkan akun "$2" dengan alamat surel ini di {{SITENAME}}.
Untuk mengonfirmasikan bahwa akun ini benar dimiliki oleh Anda sekaligus mengaktifkan fitur surel di {{SITENAME}}, ikuti pranala berikut pada penjelajah web Anda:
@@ -3178,8 +3253,36 @@ Klik pada pranala ini untuk membatalkan konfirmasi alamat surel:
$5
Kode konfirmasi ini akan kedaluwarsa pada $4.',
-'confirmemail_invalidated' => 'Konfirmasi alamat surel dibatalkan',
-'invalidateemail' => 'Batalkan konfirmasi surel',
+'confirmemail_body_changed' => 'Seseorang, mungkin Anda, dari alamat IP $1,
+telah mengubah surel dari akun "$2" pada alamat ini di {{SITENAME}}.
+
+Untuk mengkonfirmasi bahwa akun ini adalah benar milik Anda sekaligus mengaktifkan
+kembali fitur surel pada {{SITENAME}}, ikuti pranala berikut pada browser Anda:
+
+$3
+
+Jika akun ini *bukan* milik Anda, ikuti pranala berikut
+untuk membatalkan konfirmasi alamat surel:
+
+$5
+
+Kode konfirmasi ini akan kedaluwarsa pada $4.',
+'confirmemail_body_set' => 'Seseorang, mungkin Anda, dari alamat IP $1,
+telah mengubah surel dari akun "$2" pada alamat ini di {{SITENAME}}.
+
+Untuk mengonfirmasi bahwa akun ini adalah milik Anda sekaligus mengaktifkan
+kembali fitur surel pada {{SITENAME}}, ikuti pranala berikut pada browser Anda:
+
+$3
+
+Jika akun ini *bukan* milik Anda, ikuti pranala berikut
+untuk membatalkan konfirmasi alamat surel:
+
+$5
+
+Kode konfirmasi ini akan kedaluwarsa pada $4.',
+'confirmemail_invalidated' => 'Konfirmasi alamat surel dibatalkan',
+'invalidateemail' => 'Batalkan konfirmasi surel',
# Scary transclusion
'scarytranscludedisabled' => '[Transklusi interwiki dimatikan]',
@@ -3219,6 +3322,7 @@ Silakan konfirmasi jika Anda ingin membuat ulang halaman ini.",
'table_pager_first' => 'Halaman pertama',
'table_pager_last' => 'Halaman terakhir',
'table_pager_limit' => 'Tampilkan $1 entri per halaman',
+'table_pager_limit_label' => 'Item per halaman:',
'table_pager_limit_submit' => 'Tuju ke',
'table_pager_empty' => 'Tidak ditemukan',
@@ -3317,6 +3421,7 @@ Anda juga dapat [[Special:Watchlist/edit|menggunakan penyunting standar Anda]].'
'version-specialpages' => 'Halaman istimewa',
'version-parserhooks' => 'Kait parser',
'version-variables' => 'Variabel',
+'version-skins' => 'Kulit',
'version-other' => 'Lain-lain',
'version-mediahandlers' => 'Penanganan media',
'version-hooks' => 'Kait',
@@ -3328,6 +3433,13 @@ Anda juga dapat [[Special:Watchlist/edit|menggunakan penyunting standar Anda]].'
'version-hook-subscribedby' => 'Dilanggani oleh',
'version-version' => '(Versi $1)',
'version-license' => 'Lisensi',
+'version-poweredby-credits' => "Wiki ini didukung oleh '''[http://www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
+'version-poweredby-others' => 'lainnya',
+'version-license-info' => 'MediaWiki adalah perangkat lunak bebas; Anda diperbolehkan untuk mendistribusikan dan/atau memodfikasinya dengan persyaratan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation; versi 2 atau terbaru.
+
+MediaWiki didistribusikan dengan harapan dapat digunakan, tetapi TANPA JAMINAN APA PUN; tanpa jaminan PERDAGANGAN atau KECOCOKAN UNTUK TUJUAN TERTENTU. Lihat Lisensi Publik Umum GNU untuk informasi lebih lanjut.
+
+Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi Publik Umum GNU] bersama dengan program ini; jika tidak, kirim surat ke Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atau [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html baca daring].',
'version-software' => 'Perangkat lunak terinstal',
'version-software-product' => 'Produk',
'version-software-version' => 'Versi',
@@ -3398,6 +3510,15 @@ Keterangan tampilan:
'tags-edit' => 'sunting',
'tags-hitcount' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
+# Special:ComparePages
+'comparepages' => 'Bandingkan halaman',
+'compare-selector' => 'Bandingkan revisi halaman',
+'compare-page1' => 'Halaman 1',
+'compare-page2' => 'Halaman 2',
+'compare-rev1' => 'Revisi 1',
+'compare-rev2' => 'Revisi 2',
+'compare-submit' => 'Bandingkan',
+
# Database error messages
'dberr-header' => 'Wiki ini bermasalah',
'dberr-problems' => 'Maaf! Situs ini mengalami masalah teknis.',
@@ -3414,8 +3535,13 @@ Keterangan tampilan:
'htmlform-float-invalid' => 'Yang Anda masukkan bukan merupakan angka.',
'htmlform-int-toolow' => 'Nilai yang Anda masukkan terlalu rendah di bawah nilai minimum $1',
'htmlform-int-toohigh' => 'Nilai yang Anda masukkan melebihi nilai maksimum $1',
+'htmlform-required' => 'Nilai ini diperlukan',
'htmlform-submit' => 'Kirim',
'htmlform-reset' => 'Batalkan perubahan',
'htmlform-selectorother-other' => 'Lain-lain',
+# SQLite database support
+'sqlite-has-fts' => '$1 dengan dukungan pencarian teks lengkap',
+'sqlite-no-fts' => '$1 tanpa dukungan pencarian teks lengkap',
+
);
diff --git a/languages/messages/MessagesIe.php b/languages/messages/MessagesIe.php
index 307bf3ca..cbf2ea61 100644
--- a/languages/messages/MessagesIe.php
+++ b/languages/messages/MessagesIe.php
@@ -205,7 +205,7 @@ Ne oblivia de mutar tui [[Special:Preferences|preferenties de {{SITENAME}}]].',
'yourname' => 'Nómine de usator:',
'yourpassword' => 'Parol-clave:',
'yourpasswordagain' => 'Parol-clave denov:',
-'remembermypassword' => 'Memorar mi passa-parol (per cookie)',
+'remembermypassword' => 'Memorar mi passa-parol (per cookie) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Tui dominia:',
'login' => 'Aperter session',
'nav-login-createaccount' => 'Crear un conto o intrar',
@@ -370,13 +370,43 @@ Tui changes ancor ne ha esset conservat!",
'recentchangeslinked-toolbox' => 'Changes referet',
# Upload
-'upload' => 'Cargar file',
-'uploadbtn' => 'Cargar file',
-'uploadlogpage' => 'Diarium de cargament',
-'filedesc' => 'Descrition',
-'savefile' => 'Conservar file',
-'uploadedimage' => 'cargat "[[$1]]"',
-'watchthisupload' => 'Vigilar ti file',
+'upload' => 'Cargar file',
+'uploadbtn' => 'Cargar file',
+'upload-permitted' => 'Tipes de file permisset: $1.',
+'upload-preferred' => 'Tipes de file preferet: $1.',
+'upload-prohibited' => 'Tipes de file prohibit: $1.',
+'uploadlogpage' => 'Diarium de cargament',
+'filedesc' => 'Descrition',
+'unknown-error' => 'Un errore desconosset ocurret.',
+'savefile' => 'Conservar file',
+'uploadedimage' => 'cargat "[[$1]]"',
+'upload-maxfilesize' => 'Mesura maxim de file: $1',
+'upload-description' => 'Descrition de file',
+'upload-options' => 'Optiones de cargament',
+'watchthisupload' => 'Vigilar ti file',
+'upload-failure-subj' => 'Problema de cargament',
+'upload-failure-msg' => 'Ta esset un problema che tui cargament:
+$1',
+
+'upload-proto-error' => 'Protocol incorect',
+'upload-proto-error-text' => 'Cargament distant exige comense che <code>http://</code> o <code>ftp://</code>.',
+'upload-file-error' => 'Errore intern',
+'upload-file-error-text' => 'Un errore intern ocurret quande atentant crear un file temporari in li servitor.
+Pleser parla che un [[Special:ListUsers/sysop|administrator]].',
+'upload-misc-error' => 'Errore desconosset de cargament',
+'upload-misc-error-text' => 'Un errore desconosset ocurret durante li cargament.
+Pleser verificar que li URL es valid e accessibil e prova denov.
+Si li problema persister, parla che un [[Special:ListUsers/sysop|administrator]].',
+'upload-http-error' => 'Un errore HTTP ocurret: $1',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Ne esset possibil ear in li URL',
+'upload-curl-error6-text' => 'Li URL preferet ne esset visitat.
+Pleser vide denov que li URL es corect e si li loc es disponibil.',
+'upload-curl-error28' => 'For de témpor por cargament de files',
+'upload-curl-error28-text' => 'Ti loc demorat mult témpor por responder.
+Pleser vider se li loc es disponibil, atende un témpor e prova denov.
+Vu posse provar in un témpor minu activ.',
# Special:ListFiles
'imgfile' => 'archive',
@@ -653,6 +683,8 @@ Tui changes ancor ne ha esset conservat!",
'tooltip-upload' => 'Comensar cargament de file',
'tooltip-rollback' => '"Rollback" reverte redaction(es) de ti págine executet per li ultim contributor in un claccar',
'tooltip-undo' => '"Undo" reverte ti redaction e inaugura li forme de redaction in modo de prevision. It concede adjuntent un rason in li summarium.',
+'tooltip-preferences-save' => 'Conservar preferenties',
+'tooltip-summary' => 'Intrar un summarium curt',
# Browsing diffs
'previousdiff' => '↠Redaction anteriori',
diff --git a/languages/messages/MessagesIg.php b/languages/messages/MessagesIg.php
index 2112e366..9ea296c1 100644
--- a/languages/messages/MessagesIg.php
+++ b/languages/messages/MessagesIg.php
@@ -10,6 +10,54 @@
* @author Ukabia
*/
+$namespaceNames = array(
+ NS_MEDIA => 'Nká',
+ NS_SPECIAL => 'Ihü_kárírí',
+ NS_TALK => 'Okwu',
+ NS_USER => 'Ọ\'bànifé',
+ NS_USER_TALK => 'Okwu_á»\'bànifé',
+ NS_PROJECT_TALK => 'Okwu_$1',
+ NS_FILE => 'Ãkwúkwó_orünotu',
+ NS_FILE_TALK => 'Okwu_ákwúkwó_orünotu',
+ NS_MEDIAWIKI => 'NkáWiki',
+ NS_MEDIAWIKI_TALK => 'Okwu_NkáWiki',
+ NS_TEMPLATE => 'Àtụ',
+ NS_TEMPLATE_TALK => 'Okwu_àtụ',
+ NS_HELP => 'Nkwádá»',
+ NS_HELP_TALK => 'Okwu_nkwádá»',
+ NS_CATEGORY => 'Ébéoná»r',
+ NS_CATEGORY_TALK => 'Okwu_ébéoná»r',
+);
+
+$specialPageAliases = array(
+ 'Userlogin' => array( 'Ọ\'bàniféÃBànyé' ),
+ 'Userlogout' => array( 'Ọ\'bàniféÃFụtá' ),
+ 'Preferences' => array( 'Ọtúm_dá»sẹrẹ_ihem' ),
+ 'Upload' => array( 'TinyéIheNélú' ),
+ 'Allpages' => array( 'IhüNílé' ),
+ 'Specialpages' => array( 'IhüKá' ),
+ 'Export' => array( 'MÄ“Ká»Fùtá' ),
+ 'Undelete' => array( 'Ãbàkàshịkwàlà' ),
+ 'Import' => array( 'BàÃfé' ),
+ 'Mypage' => array( 'IhüNkèm' ),
+ 'Mytalk' => array( 'OkwuNkèm' ),
+ 'Filepath' => array( 'Uzá»rAkwúkwóOrünotu' ),
+ 'Blankpage' => array( 'HịcháIhü' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#KÚFÙ', '#REDIRECT' ),
+ 'fullpagename' => array( '1', 'ÃHÀNÃLÉNKÈIHÃœ', 'FULLPAGENAME' ),
+ 'msg' => array( '0', 'OZI:', 'MSG:' ),
+ 'img_right' => array( '1', 'áká_ịkẹngạ', 'right' ),
+ 'img_left' => array( '1', 'áká_èkpè', 'left' ),
+ 'img_top' => array( '1', 'élú', 'top' ),
+ 'img_middle' => array( '1', 'ẹtítì', 'middle' ),
+ 'img_text_bottom' => array( '1', 'okpúrù-ede', 'text-bottom' ),
+ 'displaytitle' => array( '1', 'ZIÃSHÃ', 'DISPLAYTITLE' ),
+ 'pagesize' => array( '1', 'ÀSÃIHÃœ', 'PAGESIZE' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Okpürụ ahiri jikodo:',
@@ -26,8 +74,7 @@ $messages = array(
'tog-editsection' => 'Gbanyé orürü nkeji shi [rüwá] jikodo',
'tog-editsectiononrightclick' => 'Kpa na áká nri à gbanyé orürü nkeji na ishi nkeji (ö chá»rá» JavaScript)',
'tog-showtoc' => 'Zi agada ihe níle (maka ihü nwere ishis ká áto)',
-'tog-rememberpassword' => 'Chetá edemede éjim a banyé na orunótuá',
-'tog-editwidth' => 'Më akbati orü öbodobo kó juö ihu gbúrugbúru',
+'tog-rememberpassword' => 'Chetá edemede éjim a banyé na orunótuá (nke ukwu nke rürü {{PLURAL:$1|chi|chi}} $1)',
'tog-watchcreations' => 'Tinyé ihüm na eké na ndetu ihem ne lé',
'tog-watchdefault' => 'Tinyé ihü m na rüoru élu na ndetu ihem ne lé',
'tog-watchmoves' => 'Tinyé ihü m na puzié na ndetu ihe m ne lé',
@@ -171,31 +218,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Tinyé Okwu',
-'vector-action-delete' => 'Gbakashia',
-'vector-action-move' => 'Páfụ',
-'vector-action-protect' => 'Cẹdolu',
-'vector-action-undelete' => 'à gbàkashikwà',
-'vector-action-unprotect' => 'É cẹdolu',
-'vector-namespace-category' => 'Ébéoná»r',
-'vector-namespace-help' => 'Ihü I nye áká',
-'vector-namespace-image' => 'Ãkwúkwó orunotu',
-'vector-namespace-main' => 'Ihü',
-'vector-namespace-media' => 'Ihü nkà',
-'vector-namespace-mediawiki' => 'Ozi',
-'vector-namespace-project' => 'Ihü orürü',
-'vector-namespace-special' => 'Ihü mkpà',
-'vector-namespace-talk' => 'Akíkó',
-'vector-namespace-template' => 'Àtụ',
-'vector-namespace-user' => "Ihü á»'bànifé",
-'vector-view-create' => 'Ké',
-'vector-view-edit' => 'Rüwa',
-'vector-view-history' => 'Le akíkó mbu',
-'vector-view-view' => 'Guwá',
-'vector-view-viewsource' => 'Zi mkpurụ',
-'actions' => 'Mmèmé',
-'namespaces' => 'Ãmááhà',
-'variants' => 'Nke ichè ichè',
+'vector-action-addsection' => 'Tinyé Okwu',
+'vector-action-delete' => 'Gbakashia',
+'vector-action-move' => 'Páfụ',
+'vector-action-protect' => 'Cẹdolu',
+'vector-action-undelete' => 'à gbàkashikwà',
+'vector-action-unprotect' => 'É cẹdolu',
+'vector-simplesearch-preference' => 'Kwe okwu ụmá nchöwa di (akpụkpỠVector náni)',
+'vector-view-create' => 'Ké',
+'vector-view-edit' => 'Rüwa',
+'vector-view-history' => 'Le akíkó mbu',
+'vector-view-view' => 'Guwá',
+'vector-view-viewsource' => 'Zi mkpurụ',
+'actions' => 'Mmèmé',
+'namespaces' => 'Ãmááhà',
+'variants' => 'Nke ichè ichè',
'errorpagetitle' => 'Nsogbú',
'returnto' => 'Ganata na $1.',
@@ -397,7 +434,7 @@ E chefụkwạlạ I gbanwere [[Special:Preferences|{{SITENAME}} iheichá»rá»]]
'yourname' => "Ãhà á»'bànifé:",
'yourpassword' => 'Okwúngáfè:',
'yourpasswordagain' => 'Detuari mkpurụ okwu ejị a gafẹ:',
-'remembermypassword' => 'Chetá edemede éjim a banyé na orunótuá',
+'remembermypassword' => 'Chetá edemede éjim a banyé na orunótuá (nke ukwu nke rürü {{PLURAL:$1|chi|chi}} $1)',
'yourdomainname' => 'Obí gi:',
'login' => 'Banyé',
'nav-login-createaccount' => 'Banyé / ké buwá',
@@ -413,6 +450,7 @@ E chefụkwạlạ I gbanwere [[Special:Preferences|{{SITENAME}} iheichá»rá»]]
'gotaccount' => 'I nwerecha buwa? $1.',
'gotaccountlink' => 'Banyé',
'createaccountmail' => 'na e-mail',
+'createaccountreason' => 'Mgbaghaputa:',
'badretype' => 'Mkpurụ okwu ejị a gafẹ é jëghị.',
'userexists' => "Ãhè á»'bànifé tírí di na áká onye ozor.
Bíkó nwèré áhà nke ozor.",
@@ -614,6 +652,7 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
'revdelete-radio-unset' => 'Mbà',
'revdelete-log' => 'Mgbághapụtà:',
'revdel-restore' => 'gbanwe á»tù á» gị zí',
+'revdel-restore-deleted' => 'orürü gbakashịrị',
'pagehist' => 'Ãkíkó mbu maka ihüá',
'deletedhist' => 'Ãkíkó mbu bakashịrị',
'revdelete-content' => 'iheníle',
@@ -737,6 +776,7 @@ Nwàné ótù okwu íshí na ihe à nè tú jí ''háníle:'' à tuó ihe nílé
'searchresultshead' => 'Chöwá',
'resultsperpage' => 'Nlé na ihü:',
'contextlines' => 'Ahịrị na nke nlé:',
+'stub-threshold-disabled' => 'Ãpụgị òkò',
'timezonelegend' => 'Nkeji ogẹ:',
'localtime' => 'Ogẹ ebeaná»r:',
'servertime' => 'Ógè orunotu òdìbá»:',
@@ -830,10 +870,6 @@ Nwàné ótù okwu íshí na ihe à nè tú jí ''háníle:'' à tuó ihe nílé
'recentchanges' => 'Gbanwere mere ogẹ di nso',
'recentchanges-legend' => 'Nràlụ màkà Ihe gbanwere ubwá',
'recentchanges-feed-description' => 'Chóputà ihe ógẹ ǹsò na wiki ímé órírí nke á.',
-'recentchanges-label-legend' => 'Edemede ndetu: $1',
-'recentchanges-legend-newpage' => '$1 - ihü ohúrù',
-'recentchanges-legend-minor' => '$1 - orü ntákírí',
-'recentchanges-legend-bot' => '$1 - orü bot',
'rcnote' => "Na àlà {{PLURAL:$1|bu gbanwere '''1'''|bu gbanwere mgbèdè nke '''$1'''}} na mgbèdè {{PLURAL:$2|chi|chi '''$2'''}}, na mgbe $5, $4.",
'rclistfrom' => 'Zìrí ihe gbanwere á»húrù shí $1',
'rcshowhideminor' => 'orü ntákírí $1',
@@ -886,6 +922,7 @@ Ihü ná»r na [[Special:Watchlist|ndétu ihe à ne lé]] di na mkpụrụ edemed
'sourceurl' => 'URL mkpá»lógwù:',
'upload-description' => 'Nkówá ákwúkwó orunotu',
'watchthisupload' => 'Lèwá ákwúkwó orunotunị',
+'upload-warning-subj' => 'NdỠntị màkà ntínyé',
# HTTP errors
'http-read-error' => 'Nsogbu à gü HTTP.',
@@ -1082,7 +1119,6 @@ Ubwa, o na ga [[$2]].',
# Watchlist
'watchlist' => 'Ndetu ihem ne lé',
'mywatchlist' => 'Ndetu ihem ne lé',
-'watchlistfor' => "(maka '''$1''')",
'addedwatch' => 'Tìrì na ndétu nlé',
'addedwatchtext' => "Ihü \"[[:\$1]]\" à bányéré [[Special:Watchlist|ndétu ihe à ne lé]].
Ihe gi gbanwe na ógè gi bya nà ihüá na ihü okwu ya gi di ndétu ngáhù, na ihü gi da na mkpụrụ édé '''sírí íke''' ímé [[Special:RecentChanges|ndétu gbanwere méré na ogè nso]] ka ȯ dí òfelè à hü ya.",
@@ -1426,8 +1462,9 @@ Biko meríáríá ozor.',
'nextdiff' => 'Orü nke ohúrù →',
# Media information
-'file-info-size' => '($1 × $2 pixel, ívù akwukwo orunótu: $3, MIME nke: $4)',
+'file-info-size' => '$1 × $2 pixel, ívù akwukwo orunótu: $3, MIME nke: $4',
'file-nohires' => '<small>Nke káchá mmá na ányá àdíghị.</small>',
+'svg-long-desc' => "ákwúkwó orunotu SVG, nà áhà pixel $1 × $2, ívụ ákwú'notu: $3",
'show-big-image' => 'Hü ya ka o dị',
'show-big-image-thumb' => '<small>Ãvù nlétú nke: pixel $1 × $2</small>',
'file-info-gif-looped' => 'etemte',
@@ -1559,6 +1596,7 @@ Nke ozor gí zonari na áká onwe ha.
'table_pager_first' => 'Ihü mbu',
'table_pager_last' => 'Ihü lara azu',
'table_pager_limit' => 'Zí nke $1 màkà ihe na ótù ihü',
+'table_pager_limit_label' => 'Ihe ga di na ótù ihü:',
'table_pager_limit_submit' => 'Gá',
'table_pager_empty' => 'Odígị ihe fútárá',
@@ -1628,12 +1666,22 @@ Nke ozor gí zonari na áká onwe ha.
'tags-edit' => 'rüwa',
'tags-hitcount' => '$1 {{PLURAL:$1|gbanwere|gbanwere}}',
+# Special:ComparePages
+'comparepages' => 'Má àtù ihü',
+'compare-selector' => 'Má àtù orü dírí na élú ihü',
+'compare-page1' => 'Ihü 1',
+'compare-page2' => 'Ihü 2',
+'compare-rev1' => 'Orübà 1',
+'compare-rev2' => 'Orübà 2',
+'compare-submit' => 'Má àtù',
+
# Database error messages
'dberr-header' => 'Wiki nka nwere nsogbu',
'dberr-problems' => 'Ndó!
Ãmá nka nwere nsogbu ime ime.',
# HTML forms
+'htmlform-required' => 'Ọgụgụ nke gi dị',
'htmlform-submit' => 'Dànyé',
'htmlform-reset' => 'Emekwàlà gbanwere',
'htmlform-selectorother-other' => 'Nke ozor',
diff --git a/languages/messages/MessagesIke_cans.php b/languages/messages/MessagesIke_cans.php
index 53887726..f49b06ed 100644
--- a/languages/messages/MessagesIke_cans.php
+++ b/languages/messages/MessagesIke_cans.php
@@ -11,7 +11,7 @@
$messages = array(
# User preference toggles
-'tog-rememberpassword' => 'áƒá–…á‘‘ á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–… ᖃᑯá’á–… áŠá‘áƒá“ᓇᓯᕗᖅ á…ᕙᓗᒪᔪᖅ ᖃᕆᑕá…á”­á–…',
+'tog-rememberpassword' => 'áƒá–…á‘‘ á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–… ᖃᑯá’á–… áŠá‘áƒá“ᓇᓯᕗᖅ á…ᕙᓗᒪᔪᖅ ᖃᕆᑕá…á”­á–… (for a maximum of $1 {{PLURAL:$1|day|days}})',
# Dates
'sunday' => 'ᓴᓇᑦᑕáƒá“•',
@@ -148,7 +148,7 @@ $messages = array(
'yourname' => 'á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–…',
'yourpassword' => 'á…áƒá‘­á±á‘ŽáŠ á¸á“šá™µá“´á…á‘Ž',
'yourpasswordagain' => 'á‘•á’ªá‘ᒪᓃᖅṠáƒá’ƒá“¯á’á–…á‘á–… á…áƒá‘­á±á‘ŽáŠ á¸á“šá™µá“´á…á‘Ž',
-'remembermypassword' => 'áƒá–…á‘‘ á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–… ᖃᑯá’á–… áŠá‘áƒá“ᓇᓯᕗᖅ á…ᕙᓗᒪᔪᖅ ᖃᕆᑕá…á”­á–…',
+'remembermypassword' => 'áƒá–…á‘‘ á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–… ᖃᑯá’á–… áŠá‘áƒá“ᓇᓯᕗᖅ á…ᕙᓗᒪᔪᖅ ᖃᕆᑕá…á”­á–… (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'áŠá‘¯á“ᓇá³á–…',
'loginprompt' => 'á±á’‹áŠá“•á’ƒ áƒá’ªá‘áŠá–… ᖃᕆᑕá…á”­á–… ᖂᑮᔅ(Cookies) á±á•á–„á‘Ž áŠá‘¯á“ᓇá³á–… á…áƒá‘­á±á‘ŽáŠ.',
'userlogin' => 'áŠá‘¯á“ᓇá³á–… / á±á•á–„Ṡᑮᓇá…ᔭᒃᑯᕕᖕᒥ á‘ᖅᑯᖅᓯᕕᒃ',
diff --git a/languages/messages/MessagesIke_latn.php b/languages/messages/MessagesIke_latn.php
index 23c9d567..27663980 100644
--- a/languages/messages/MessagesIke_latn.php
+++ b/languages/messages/MessagesIke_latn.php
@@ -11,7 +11,7 @@
$messages = array(
# User preference toggles
-'tog-rememberpassword' => 'Iqtuu uikipitia atiq qakugiq atuinnasivuq uvalumaq qaritaujaq',
+'tog-rememberpassword' => 'Iqtuu uikipitia atiq qakugiq atuinnasivuq uvalumaq qaritaujaq (for a maximum of $1 {{PLURAL:$1|day|days}})',
# Dates
'sunday' => 'sanattaili',
@@ -128,7 +128,7 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
'yourname' => 'uikipitia atiq',
'yourpassword' => 'uikipitia palanngasauti',
'yourpasswordagain' => 'tamatumaniiqpaa iksigaqtuq uikipitia palanngasauti',
-'remembermypassword' => 'iqtuu uikipitia atiq qakakuq atuinnasivuq uvalumajuq qaritaujaq',
+'remembermypassword' => 'iqtuu uikipitia atiq qakakuq atuinnasivuq uvalumajuq qaritaujaq (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'akunnapuq',
'loginprompt' => 'pigialik imatuaq qaritaujaq quukiis (Cookies) pirqaati akunnapuq {{SITENAME}}.',
'userlogin' => 'akunnapuq / pirqaapaa kiinaijakkuvingmi tuqkuqsivik',
diff --git a/languages/messages/MessagesIlo.php b/languages/messages/MessagesIlo.php
index 8e85935b..0653dcd5 100644
--- a/languages/messages/MessagesIlo.php
+++ b/languages/messages/MessagesIlo.php
@@ -27,8 +27,7 @@ $messages = array(
'tog-editsection' => 'Pagbalinen ti panagedit iti benneg babaen ti [edit] a panilpo',
'tog-editsectiononrightclick' => 'Pagmayaten ti section editing babaen ti panang-right click kadagiti section titles (JavaScript)',
'tog-showtoc' => 'Ipakita dagiti linaon (para kadagiti panid nga addaan ad-adu ngem 3 a headings)',
-'tog-rememberpassword' => 'Laglagipen ti iseserrekko kadaytoy a kompiuter',
-'tog-editwidth' => 'Ti kahon ti edit ket addaan sibubukel a kaakaba',
+'tog-rememberpassword' => 'Laglagipen ti iseserrekko kadaytoy a kompiuter (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Inayon dagiti inaramidko a pampanid iti listaan ti bambantayak',
'tog-watchdefault' => 'Inayon dagiti ed-editek a pampanid iti listaan ti bambantayak',
'tog-watchmoves' => 'Inayon dagiti inyakarko a pampanid iti listaan ti bambantayak',
@@ -345,7 +344,7 @@ Dimo liplipatan a sukatan dagiti preferenciam iti [[Special:Preferences|{{SITENA
'yourname' => 'Nagan:',
'yourpassword' => 'Pasesbalikas:',
'yourpasswordagain' => 'Uliten ti pasesbalikas',
-'remembermypassword' => 'Laglagipennak',
+'remembermypassword' => 'Laglagipennak (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Ti bukodmo a domain:',
'login' => 'Sumrek',
'nav-login-createaccount' => 'Mangaramid iti account wenno ag-login',
@@ -494,9 +493,6 @@ Ti agdama nga IP addressmo ket $3, ket ti block ID ket #$5. Pangngaasim ta irama
No dimo kayat a ti sinuratmo ket maedit wenno mabalbaliwan nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno kinopiam ngem iti maysa a nawaya a pagtagikuaan ti publiko wenno pumadmad a libre a pagtaudan (kitaen ti $1 para iti detalie).
'''SAAN A MANGIPAN ITI ADDAAN COPYRIGHT NGA OBRA NO AWANAN PAMMALUBOS!'''",
-'longpagewarning' => "'''BALLAAG: Agatiddog daytoy a panid iti $1 a kilobytes;
-amangan ta sumagmamano a browsers ket agparikut iti panagedit iti pampanid a dandani 32 kb, wenno ad-adu pay, ti kaatiddogna.
-Pangngaasim ta padasem a pasetpasetem ti panid iti babbabassit a benneg.'''",
'longpageerror' => "'''BIDDUT: Ti texto nga insumitem ket agatiddog iti $1 a kilobytes, nga at-atiddog nga amang ngem ti maximum a $2 a kilobytes.
Isut' gapuna a saan a maidulin.'''",
'protectedpagewarning' => "'''BALLAAG: Daytoy a panid ket nabalunetan tapno dagiti laeng agar-aramat nga addaan previlehio a sysop wenno administrador ti makabalbaliw itoy.'''",
@@ -825,7 +821,6 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''naipuskol''
'filetype-badmime' => 'Dagiti files a kas MIME type "$1" ket saan a mapalubosan a maipan.',
'filetype-unwanted-type' => "Ti '''\".\$1\"''' ket di mabalin a file type. Dagiti mayat a file types ket \$2.",
'filetype-banned-type' => "Ti '''\".\$1\"''' ket saan a mapalubosan a file type. Dagiti mabalin a file types ket \$2.",
-'successfulupload' => 'Balligi ti panag-upload',
'uploadwarning' => 'Ballaag iti panagipan',
'savefile' => 'Idulin ti file',
'uploadedimage' => 'naipanen ti "[[$1]]"',
@@ -837,6 +832,7 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''naipuskol''
'destfilename' => 'Destinasion a filename:',
'upload-maxfilesize' => 'Maximum a file size: $1',
'watchthisupload' => 'Bantayan daytoy a panid',
+'upload-success-subj' => 'Balligi ti panag-upload',
'upload-proto-error' => 'Saan a husto a protocol',
'upload-proto-error-text' => 'Dagiti remote upload ket kasapulan a dagiti URLs ket mangrugi iti <code>http://</code> wenno <code>ftp://</code>.',
@@ -1060,7 +1056,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Dagiti bambantayak',
'mywatchlist' => 'Dagiti bambantayak',
-'watchlistfor' => "(para ken ni '''$1''')",
'nowatchlist' => 'Awan ti pampanid iti listaan dagiti bambantayam.',
'watchnologin' => 'Saan a nakastrek',
'watchnologintext' => 'Nasken a [[Special:UserLogin|naka-loginka]] tapno mabaliwam dagiti bambantayam a panid.',
@@ -1494,10 +1489,10 @@ itsek ti husto a panangikapet iti latex, dvips, gs, samo i-convert',
# Media information
'thumbsize' => 'Kakasla kuko a rukod:',
'widthheightpage' => '$1×$2, $3 a {{PLURAL:$3|panid|pampanid}}',
-'file-info' => '(kadakkel ti file: $1, MIME type: $2)',
-'file-info-size' => '($1 × $2 a pixel, kadakkel ti file: $3, MIME type: $4)',
+'file-info' => 'kadakkel ti file: $1, MIME type: $2',
+'file-info-size' => '$1 × $2 a pixel, kadakkel ti file: $3, MIME type: $4',
'file-nohires' => '<small>Awan mabalin a nangatngato a resolusion.</small>',
-'svg-long-desc' => '(SVG a file, babassit ngem $1 × $2 pixels, kadakkel ti file: $3)',
+'svg-long-desc' => 'SVG a file, babassit ngem $1 × $2 pixels, kadakkel ti file: $3',
'show-big-image' => 'Sibubukel a resolusion',
'show-big-image-thumb' => '<small>Rukod daytoy a preview: $1 × $2 a pixels</small>',
diff --git a/languages/messages/MessagesInh.php b/languages/messages/MessagesInh.php
index a1391a7c..9943ac14 100644
--- a/languages/messages/MessagesInh.php
+++ b/languages/messages/MessagesInh.php
@@ -19,44 +19,49 @@ $messages = array(
'tog-highlightbroken' => 'Йоаца Iинкаш хьахокха <a href="" class="new">ишта</a> (е вешта<a href="" class="internal">?</a>).',
'tog-justify' => 'Яздам оагIува шоралца хьанийÑъе',
'tog-hideminor' => 'ЗIамига хувцамаш керда дIахувцама дагаршкахь къайлаÑккха',
+'tog-hidepatrolled' => 'Керда хувцама дагарчеча дIанийÑÑŠÑ Ñ…ÑƒÐ²Ñ†Ð°Ð¼Ð°Ñˆ къайлаÑккха',
+'tog-newpageshidepatrolled' => 'Керда оагIувни дагарчеча дIанийÑÑŠÑ Ñ…ÑƒÐ²Ñ†Ð°Ð¼Ð°Ñˆ къайлаÑккха',
'tog-extendwatchlist' => 'Ð¨ÐµÑ€ÑŠÑ Ñ‚ÐµÑ€ÐºÐ°Ð¼Ð° дагарче, маÑÑайола хувцамаш чулоацаш',
'tog-usenewrc' => 'Ð¢Ð¾Ð°Ñ ÐºÐµÑ€Ð´Ð° хувцама дагаршкара пайда Ñца (JavaScript Ñша)',
-'tog-numberheadings' => 'Кертера-деша таьрахь автоматичеÑки оттайе',
-'tog-showtoolbar' => 'Хувцамаш еж йоа панель инÑтрументов хьокха (JavaScript)',
-'tog-editondblclick' => 'ОагIув хувца шозза клик йича (JavaScript)',
-'tog-editsection' => 'Ð¥Iара дакъа "хувца" ÑÑылк хьахьокха',
-'tog-editsectiononrightclick' => 'Дакъа хувца дакъа-цIерах аьтта клик йича (JavaScript)',
-'tog-showtoc' => 'Оглавление хьокха (цу оагIувна кхьаннена дукхагIа дакъа йеле)',
-'tog-rememberpassword' => 'У компьютеретъ Ñе цIи дагалаца',
-'tog-editwidth' => 'Хувцамаш еж йоа моттиг шера хьалийтта',
-'tog-watchcreations' => 'Ðз хьаеж йоа оагIонаш Ñо хьежача ÑпиÑкаех Ñ‚Iатоха',
-'tog-watchdefault' => 'Ðз нийÑъйеж йоа оагIонаш Ñо хьежача ÑпиÑкаех Ñ‚Iатоха',
-'tog-watchmoves' => 'Ðз цIи хийца оагIонаш Ñо хьежача ÑпиÑкаех Ñ‚Iатоха',
-'tog-watchdeletion' => 'Ðз дIаÑькха оагIонаш Ñо хьежача ÑпиÑкаех Ñ‚Iатоха',
-'tog-minordefault' => 'Ериг еж йоа хувцамаш лоархIаме йоацаж Ñен белгалде',
-'tog-previewontop' => 'Хувцамаш еж бIарахьажа хьалха',
-'tog-previewonfirst' => 'Эггара хьалха хувцамаш еж бIарахьажа хьалха',
-'tog-nocache' => 'ОагIувна кеш е дехка',
-'tog-enotifwatchlistpages' => 'Э-майл хьадайта Ñуна Ñо хьежача оагIув хийцача',
-'tog-enotifusertalkpages' => 'Э-майл хьадайта Ñуна аз къамÑл деж оагIув хийцача',
-'tog-enotifminoredits' => 'Э-майл хьадайта Ñуна лоархIаме йоацаж йоа хувцамаш йиеча',
-'tog-enotifrevealaddr' => 'Хьокха Ñа Ñ-майл',
-'tog-shownumberswatching' => 'Хьокха маÑÑа Ñег хьежаш ба',
-'tog-fancysig' => 'Йоалача беÑÑа кулг Ñздар (автоматичеÑки ÑÑылк йоацаж)',
-'tog-externaleditor' => 'Ший йоала редактор харжа',
-'tog-externaldiff' => 'ДиÑта де ший йоалла програм харжа',
-'tog-showjumplinks' => '"Дехьадала" ÑÑылк хьахьокха',
+'tog-numberheadings' => 'Кертера-деша таьрахь ший лоIамаца оттайе',
+'tog-showtoolbar' => 'ГIалатнийcдара юкъе лакхера гIирÑий гартакх хьахокха (JavaScript)',
+'tog-editondblclick' => 'Шозза цлицкацa oагIув хувца (JavaScript)',
+'tog-editsection' => 'Ð¥Iара дакъа "хувца" Ñха Iинк хьахокха',
+'tog-editsectiononrightclick' => 'Декъам хувца кертмугIа аьтта цлицка Ñ (JavaScript)',
+'tog-showtoc' => 'Кортанче хьокха (кхьаннена дукхагIа кертмугIанаш йoлa оагIувна)',
+'tog-rememberpassword' => '(укх $1 {{PLURAL:$1|ден|деношкахь}}) мара Ñа чувалара/чуÑлара дагалоаца дезаш дац',
+'tog-watchcreations' => 'Ðз ÑÑŒ йола оагIувнаш теркама дагарчеча чуÑккха',
+'tog-watchdefault' => 'Ðз хийца йола оагIувнаш теркама дагарчеча чуÑккха',
+'tog-watchmoves' => 'Ðз цIи хийца йола оагIувнаш теркама дагарчеча чуÑккха',
+'tog-watchdeletion' => 'Ðз дIаÑккха йола оагIувнаш теркама дагарчеча чуÑккха',
+'tog-minordefault' => 'Теркамза хувцамаш лоархIамза белгалде',
+'tog-previewontop' => 'ГIалатнийÑдара кора хьалхе бIаргтаÑÑам оттае',
+'tog-previewonfirst' => 'ГIалатнийÑдаре дехьавоалаш/йоалаш бIаргтаÑÑам хьахьокха',
+'tog-nocache' => 'Укхазара оагIувнаший лочкъараш дIадоаде',
+'tog-enotifwatchlistpages' => 'ОагIувнаший хувцамахь теркама дагарчера лаьца, д-фоштаца хоам бе',
+'tog-enotifusertalkpages' => 'Са дувцама оагIув тIа хувцамаш хилача, д-фоштаца хоам бе',
+'tog-enotifminoredits' => 'Геттара зIамига хувцамаш хилача, д-фоштаца хоам бе',
+'tog-enotifrevealaddr' => 'ЗIÑ‹ хоамаш Ñ‚Iа Ñа фоштмоттиг хьахьокха',
+'tog-shownumberswatching' => 'Ший теркама дагарченгахь оагIув чулаьца бола дакъалаьцархой таьрах хьахьокха',
+'tog-fancysig' => 'Ший кулга Ñздара вики-хоамбаккхам (ший лоIаме Iинка йоацаш)',
+'tog-externaleditor' => 'Ðрена гIалатнийÑдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархара ший-тайпара оттам Ñша; [http://www.mediawiki.org/wiki/Manual:External_editors хьажа Ñша])',
+'tog-externaldiff' => 'Ðрена бIаÑакхоÑÑа болхоагIувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархара ший-тайпара оттам Ñша; [http://www.mediawiki.org/wiki/Manual:External_editors хьажа Ñша])',
+'tog-showjumplinks' => '"Дехьадала" Ñха новкъоÑтала Iинк хьахьокха',
'tog-uselivepreview' => 'Сиха бIарахьажар (JavaScript) (ЭкÑпериментально)',
-'tog-forceeditsummary' => 'Хоам бе Ñуна хувцамаш малагIа ер ÑпиÑка йеце',
-'tog-watchlisthideown' => 'Ðз йа хувцамаш Ñо хьежача ÑпиÑкаех ма хьокха',
-'tog-watchlisthidebots' => "Бот'ыз йа хувцамаш Ñо хьежача ÑпиÑкаех ма хьокха",
-'tog-watchlisthideminor' => 'ЛоархIаме йоацаж йоа хувцамаш Ñо хьежача ÑпиÑкаех ма хьокха',
-'tog-ccmeonemails' => 'Вуужаште аз дIадьахта Ñ-майл Ñуна а хьадайта',
-'tog-diffonly' => 'ДиÑта къал йоалаж йоа оагIувна дакъа ма хьаокха',
+'tog-forceeditsummary' => 'Хоам бе, хувцамий лоацам белгал даь деци',
+'tog-watchlisthideown' => 'Са хувцамаш теркама дагарчера къайладаккха',
+'tog-watchlisthidebots' => 'БIатий хувцамаш теркама дагарчера къайладаккха',
+'tog-watchlisthideminor' => 'Са зIамига хувцамаш теркама дагарчера къайладаккха',
+'tog-watchlisthideliu' => 'Чубаьнна дакъалаьцархой хувцамаш теркама дагaрчеча къайлаÑккха',
+'tog-watchlisthideanons' => 'ЦIи йоаца дакъалаьцархой хувцамаш теркама дагрчеча къайлаÑккха',
+'tog-watchlisthidepatrolled' => 'Теркама дагарчера дIанийÑÑŠÑ Ñ…ÑƒÐ²Ñ†Ð°Ð¼Ð°Ñˆ къайлаÑккха',
+'tog-ccmeonemails' => 'Ðз дакъалаьцархошоа дахта каьхаташ Ñа д-фошта Ñ‚Iа хьатIадайта',
+'tog-diffonly' => 'ДиÑта къал йоалаж йола оагIувна дакъа ма хьокха',
+'tog-showhiddencats' => 'Къайла цатегаш хьахьокха',
'underline-always' => 'МаÑÑаза',
'underline-never' => 'ЦIаккха',
-'underline-default' => 'Браузер наÑтройкаш хьаÑца',
+'underline-default' => 'МазбIарглокхарий оттамаш хайрамбе',
# Dates
'sunday' => 'КIиранди',
@@ -111,14 +116,21 @@ $messages = array(
'dec' => 'Чант.',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Цатег|Цатегаш}}',
-'category_header' => '"$1" Цатегчу оагIувнаш',
-'subcategories' => 'Чурацатегаш',
-'category-media-header' => '"$1" Цатегчу паьлаш',
-'category-empty' => "''Укх цатегчоа цхьаккха оагIувнаш е паьлаш Ñц.''",
-'hidden-categories' => '{{PLURAL:$1|Къайла цатег|Къайла цатегаш}}',
-'hidden-category-category' => 'Къайла цатегаш',
-'listingcontinuesabbrev' => 'дIахо',
+'pagecategories' => '{{PLURAL:$1|Цатег|Цатегаш}}',
+'category_header' => '"$1" Цатегчу оагIувнаш',
+'subcategories' => 'Чурацатегаш',
+'category-media-header' => '"$1" Цатегчу паьлаш',
+'category-empty' => "''Укх цатегчоа цхьаккха оагIувнаш е паьлаш Ñц.''",
+'hidden-categories' => '{{PLURAL:$1|Къайла цатег|Къайла цатегаш}}',
+'hidden-category-category' => 'Къайла цатегаш',
+'category-subcat-count' => '{{PLURAL:$2|Йола цатег Ñ‚Iехьара бухцатег чулоаца.|{{PLURAL:$1|$1 бухцатег хьахекха Ñ|$1 бухцатегаш хьахекха Ñ}} $2 йолачара.}}',
+'category-subcat-count-limited' => 'Укх цатегий {{PLURAL:$1|$1 кIалцатег|$1 кIалцатегаш}}.',
+'category-article-count' => '{{PLURAL:$2|Йола цатег цхьа оагIув мара чулоацац.|{{PLURAL:$1|$1 оагIув хьахекха Ñ|$1 оагIувнаш хьахекха Ñ}} укх цатега $2 йолачарахь.}}',
+'category-article-count-limited' => 'Укх цатегчоахь {{PLURAL:$1|$1 оагIув|$1 оагIувнаш|}}.',
+'category-file-count' => '{{PLURAL:$2|Укх цатего ца паьла мара чулоацац.|{{PLURAL:$1|$1 паьла хьахьекха Ñ|$1 паьлаш хьахьекха Ñ}} укх цатегий $2 долачаьрахь.}}',
+'category-file-count-limited' => 'Укх цатегчоахь {{PLURAL:$1|$1 паьл|$1 паьлаш}}.',
+'listingcontinuesabbrev' => 'дIахо',
+'noindex-category' => 'Моттигза оагIувнаш',
'about' => 'Лоацам',
'article' => 'Йоазув',
@@ -143,20 +155,21 @@ $messages = array(
'faqpage' => 'Project:КаÑÑ‚-каÑта хаттараш',
# Vector skin
-'vector-action-addsection' => 'БIагал тIатоха',
-'vector-action-delete' => 'ДIадаккха',
-'vector-action-move' => 'ЦIи хувца',
-'vector-action-protect' => 'Лораде',
-'vector-action-undelete' => 'Юхаоттаде',
-'vector-action-unprotect' => 'Лорам тIерaбаккха',
-'vector-view-create' => 'Кхоллам',
-'vector-view-edit' => 'Хувцар',
-'vector-view-history' => 'ИÑкар',
-'vector-view-view' => 'Дешам',
-'vector-view-viewsource' => 'ЗIембаккхама бIаргтаÑÑам',
-'actions' => 'Дулархам',
-'namespaces' => 'ЦIерий аренаш',
-'variants' => 'Дошаламаш',
+'vector-action-addsection' => 'БIагал тIатоха',
+'vector-action-delete' => 'ДIадаккха',
+'vector-action-move' => 'ЦIи хувца',
+'vector-action-protect' => 'Лораде',
+'vector-action-undelete' => 'Юхаоттаде',
+'vector-action-unprotect' => 'Лорам тIерaбаккха',
+'vector-simplesearch-preference' => 'Яьржа лахарий довзамаш чуÑккха (Vector skin only)',
+'vector-view-create' => 'Кхоллам',
+'vector-view-edit' => 'Хувцар',
+'vector-view-history' => 'ИÑкар',
+'vector-view-view' => 'Дешам',
+'vector-view-viewsource' => 'ЗIембаккхама бIаргтаÑÑам',
+'actions' => 'Дулархам',
+'namespaces' => 'ЦIерий аренаш',
+'variants' => 'Дошаламаш',
'errorpagetitle' => 'ГIалат',
'returnto' => '$1 оагIув тIа юхавалар',
@@ -212,6 +225,8 @@ $messages = array(
'jumpto' => 'Укхаза дехьавала:',
'jumptonavigation' => 'никътахкар',
'jumptosearch' => 'леха',
+'pool-queuefull' => 'Хаттарий цIа хьалдизад',
+'pool-errorunknown' => 'Довзаш доаца гIалат',
# 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}}',
@@ -251,7 +266,7 @@ $messages = array(
'viewsourceold' => 'xьадоагIа къайладоагIа Ñ‚Iа бIаргтаÑÑа',
'editlink' => 'хувца',
'viewsourcelink' => 'xьадоагIа къайладоагIа Ñ‚Iа бIаргтаÑÑа',
-'editsectionhint' => ' Тоабдакъа хувца: $1',
+'editsectionhint' => 'Декъам хувца: $1',
'toc' => 'Чулоацам',
'showtoc' => 'хьахокха',
'hidetoc' => 'къайладаккха',
@@ -278,31 +293,54 @@ $messages = array(
'nstab-category' => 'Цатег',
# Main script and global functions
-'nosuchaction' => 'Цу тайпара дулархам бац',
+'nosuchaction' => 'Цу тайпара дулархам бац',
+'nosuchspecialpage' => 'Изза мо гIооагIув Ñц',
# General errors
-'missing-article' => 'Кораде дезаш хинна оагIувни Ñздам корадаьдац «$1» $2.
+'error' => 'ГIалат',
+'missing-article' => 'Кораде дезаш хинна оагIувни Ñздам корадаьдац «$1» $2.
Из мо гIалат нийÑалуш хула, Ñаг тишъенна Iинкаца, дадаьккха дола оагIувни хувца иÑкара Ñ‚Iа чувала гIиртача.
Ðаггахь Ñанна из иштта деци, шоана гIирÑа Iалаш деча гIалат ÐºÐ¾Ñ€Ð°Ñ Ñ…Ð¸Ð»Ð° мега.
Дехар да, [[Special:ListUsers/sysop|мазакулгалхочоа]] хоам бе, URL хьахокхаш.',
-'viewsource' => 'Тахкам',
+'missingarticle-rev' => '(бIаргоагIув № $1)',
+'internalerror' => 'Чура гIалат',
+'internalerror_info' => 'Чура гIалат: $1',
+'badtitle' => 'Мегаш йоаца цIи',
+'badtitletext' => 'Дехаш дола оагIувни цIи, нийÑа Ñц, ÑÑŒÑÑа Ñ Ðµ меттаюкъара е викиюкъара цIи харцахь Ñ. ЦIера юкъе мегаш доаца харакъаш нийÑадена хила мегаш да.',
+'viewsource' => 'Тахкам',
# Login and logout pages
'yourname' => 'Дакъалаьцархочунна цIи:',
'yourpassword' => 'КъайладоагIа:',
'yourpasswordagain' => 'КъайладоагIа юха IоÑзаде:',
-'login' => 'Чувала',
+'remembermypassword' => '(укх $1 {{PLURAL:$1|ден|деношкахь}}) мара Ñа чувалара/чуÑлара дагалоаца дезаш дац',
+'yourdomainname' => 'Шун цIеноагIув:',
+'login' => 'Чувала/Ñла',
'nav-login-createaccount' => 'ЦIи Ñккха/Ший oагIув ела',
+'loginprompt' => 'Укх болхaоагIуваца доттагIал лаца, шун "cookies" йийла хьалдеза.',
'userlogin' => 'ЦIи Ñккха/ОагIув ела',
-'userloginnocreate' => 'Чувала',
-'logout' => 'Ðравала',
-'userlogout' => 'Ðравала',
+'userloginnocreate' => 'Чувала/Ñла',
+'logout' => 'Ðравала/Ñла',
+'userlogout' => 'Ðравала/Ñла',
'notloggedin' => 'Оаш шоай цIи хьааьннадац',
+'nologin' => "Теркама йоазув Ñц? '''$1'''.",
'nologinlink' => 'Лархама йоазув де',
-'gotaccountlink' => 'Чувала',
+'createaccount' => 'Керда дакъалаьцархо кхолла',
+'gotaccount' => "Укхаза дIаÑзабенна дий шо? '''$1'''.",
+'gotaccountlink' => 'Чувала/Ñла',
+'createaccountmail' => 'Д-фоштаца',
+'createaccountreason' => 'Бахьан:',
'mailmypassword' => 'Керда къайладоагIа хьаÑца',
+'loginlanguagelabel' => 'Мотт: $1',
+
+# Password reset dialog
+'oldpassword' => 'Къаьна къайладоагI:',
+'newpassword' => 'Керда къайладоагI:',
+'retypenew' => 'Керда къайладоагIа юха IоÑзаде:',
+'resetpass-submit-loggedin' => 'КъайладогIа дIахувца',
+'resetpass-submit-cancel' => 'Юхавал/Ñлa',
# Edit page toolbar
'bold_sample' => 'Сома Ñздам',
@@ -312,44 +350,82 @@ $messages = array(
'link_sample' => 'Iинка кертмугI',
'link_tip' => 'ЧураIинк',
'extlink_sample' => 'Iинка кертдош http://www.example.com',
+'extlink_tip' => 'Ðрена Iинка (http:// тамагIахь дийца ма ле)',
'headline_sample' => 'KертмугIa Ñздама',
'headline_tip' => '2-гIа кертмугIa лагIа',
'nowiki_sample' => 'Укхаза кийчаде дезаш доаца Ñздам оттаде',
+'nowiki_tip' => 'Вики-бIаÑоттамахь теркам ма бе',
'image_tip' => 'ЧуÑккха паьла',
'media_tip' => 'Паьла Iинк',
'sig_tip' => 'Шун кулгаÑздар а, Ñ…Iанзара ха а',
'hr_tip' => 'Мухала мугI (могаш тайпара къеззига хайраде)',
# Edit pages
-'summary' => 'Хувцамий белгалдер',
-'subject' => 'БIагал/кертмугI:',
-'minoredit' => 'ЗIамига хувцам',
-'watchthis' => 'Укх оагIува теркам бе',
-'savearticle' => 'ОагIув хьаÑзде',
-'preview' => 'Хьалхе бIаргтаÑÑар',
-'showpreview' => 'Хьалхе бIаргтaÑÑар',
-'showlivepreview' => 'Сиха бIаргтаÑÑар',
-'showdiff' => 'Даь хувцамаш',
-'anoneditwarning' => 'Зем хила! Шо кха чудаьннадац. Шун IP-моттиг укх хийца оагIув иÑкаречу дIаÑздаь хургъе.',
-'summary-preview' => 'Лоацам ба:',
-'newarticle' => '(Kерда)',
-'noarticletext' => "У Ñахьате укх оагIув Ñ‚Iа Ñздам доацаш да.
+'summary' => 'Хувцамий белгалдер',
+'subject' => 'БIагал/кертмугI:',
+'minoredit' => 'ЗIамига хувцам',
+'watchthis' => 'Укх оагIува теркам бе',
+'savearticle' => 'ОагIув хьаÑзде',
+'preview' => 'Хьалхе бIаргтаÑÑар',
+'showpreview' => 'Хьалхе бIаргтaÑÑар',
+'showlivepreview' => 'Сиха бIаргтаÑÑар',
+'showdiff' => 'Даь хувцамаш',
+'anoneditwarning' => 'Зем хила! Шо кха чудаьннадац. Шун IP-моттиг укх хийца оагIув иÑкаречу дIаÑздаь хургъе.',
+'summary-preview' => 'Лоацам ба:',
+'subject-preview' => 'КортÑздам:',
+'blockedtitle' => 'Дакъалаьцархо чIега бела ва/Ñ',
+'blockednoreason' => 'бахьан доацаш да',
+'loginreqlink' => 'чувала/Ñла',
+'accmailtitle' => 'КъайладоагI дIадахатад',
+'newarticle' => '(Kерда)',
+'newarticletext' => 'Шо йоаца оагIув тIа Iинкаца дехьадаьннад.
+Из хьае, кIалхагIа доала корачу Ñздам очуÑзаде (кхета хала дале [[{{MediaWiki:Helppage}}|новкъоÑтала оагIув Ñ‚Iа]] бIаргтаÑÑа).
+Цаховш укхаза нийÑадена дале, юхавала/Ñла Ñха тоIобама Ñ‚Iа пIелга тоIобе.',
+'noarticletext' => "У Ñахьате укх оагIув Ñ‚Iа Ñздам доацаш да.
[[Special:Search/{{PAGENAME}}|цу тайпара цIи дувцам кораде]] кхыдола йоазувашкахь йийша Ñ ÑˆÑƒÐ½, вешта
<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола таптарий йоазо карае], е
'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цIи йоалаш оагIув ела]'''</span>.",
-'note' => "'''ХIамоалар:'''",
-'editing' => 'ГIалатнийÑдар: $1',
-'yourtext' => 'Хьа Ñздам',
-'copyrightwarning' => "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, Ñ‚Iахьежама кIала уллаш, оаш мел чуÑккхаш дола хоамаш, Ñздамаш долга.
+'noarticletext-nopermission' => 'Укх Ñахьате укх оагIув Ñ‚Iа Ñздам дац.
+Шун йийшаÑ, кхыдола йоазувнашкахь [[Special:Search/{{PAGENAME}}|дола цIерий хаттам корае]] е <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} нийÑамий тептара йоазувнаш корае].</span>',
+'note' => "'''ХIамоалар:'''",
+'previewnote' => "'''Хьалхе бIаргтаÑÑам мара бац, Ñздам кха Ñздаь дац!'''",
+'editing' => 'ГIалатнийÑдар: $1',
+'editingsection' => 'ГIалатнийÑдар $1 (оагIувдакъа)',
+'editingcomment' => 'ГIалатнийÑдар $1 (керда декъам)',
+'editconflict' => 'ГIалатнийÑдара кховÑам: $1',
+'yourtext' => 'Хьа Ñздам',
+'copyrightwarning' => "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, Ñ‚Iахьежама кIала уллаш, оаш мел чуÑккхаш дола хоамаш, Ñздамаш долга.
Ðаггахь Ñанна шоай Ñздамаш пурам доацаш мала волашву Ñаго хувца е кхы дола моттиге Ñздердолаш, безам беци, укхаз IочуцаÑздеча, дикаьгIа да.<br />
Оаш дош лу, даь дола хувцама да волга/йолга, е оаш пурам долаш IочуÑздеш да кхычера меттигара шоай Ñздамаш/хоамаш.<br />
'''ЯЗДÐРХОЙ БОКЪОЦРЛОРÐДЕШ ДОЛРХIÐÐœÐШ, ЦÐРРПУРÐÐœ ДОÐЦÐШ, IОЧУМÐЯЗÐДЕ!'''",
-'template-protected' => ' (лорам лаьца бa)',
+'templatesused' => 'Укх бIаргоагIувни оагIув Ñ‚Iа Ð»ÐµÐ»Ð°Ñ {{PLURAL:$1|Куцкеп|Куцкепаш}}:',
+'templatesusedpreview' => 'Хьалхе бIаргтаÑÑама оагIув Ñ‚Iа леладеш дола {{PLURAL:$1|Куцкеп|Куцкепаш}}:',
+'template-protected' => ' (лорам лаьца бa)',
+'template-semiprotected' => '(дакъа-лорам)',
+'hiddencategories' => 'Ер оагIув укх {{PLURAL:$1|къайла цатегаца|къайла цатегашца}} дакъа лоаца:',
+'permissionserrorstext-withaction' => '$2 де бокъо Ñц {{PLURAL:$1|из бахьан долаш|из бахьанаш долаш}}:',
+'recreate-moveddeleted-warn' => "'''Зем бе! Шо хьалххе дайоаккхаш хина оагIув хьае гIарта.'''
+
+Хьажа, бокъонцахь езаш йолга.
+КIалхагIа укх оагIуви дIадаккхамeи цIи хувцамeи тептараш хьекха да.",
+'moveddeleted-notice' => 'Ер оагIув дIаÑккха хиннай.
+ÐовкъоÑтала, кIалха дIадаккхама а хувцама а тептарашкера нийÑама йоазувнаш хьахьекха Ñ.',
+'log-fulllog' => 'Деррига таптара бIаргтаÑÑа',
+'edit-conflict' => 'Хувцамий кховÑам.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Зембакхам: дагара куцкепаш чулоаца дуÑтам геттара доккха да.
+Цхьадола куцкепаш чулоацалургдац.',
+'post-expand-template-inclusion-category' => 'Чулоаца куцкепий мегаш дола дуÑтам дукхалена Ñ‚Iехьайоала оагIувнаш',
+'post-expand-template-argument-warning' => 'Зем бе! Ер оагIув цаI куцкепа аьладош мара чулоацац, юхадаÑтара Ñел доккха дуÑтам йолаш.
+Цу тайпара аьладешаш IокIаладаьккха да.',
+'post-expand-template-argument-category' => 'Куцкепий теркамза аьладешаш чулоаца оагIувнаш',
# History pages
'viewpagelogs' => 'Укх оагIува тептараш хокха',
'currentrev-asof' => '$1 Ñ‚Iа Ñггара Ñ‚Iехьара доржам',
'revisionasof' => '$1 доржам',
+'revision-info' => '$1; $2 хувцам',
'previousrevision' => '↠Xьалхарча',
'nextrevision' => 'TIадоагIа →',
'currentrevisionlink' => 'Дола доржам',
@@ -358,10 +434,17 @@ $messages = array(
'last' => 'хьалх.',
'page_first' => 'хьалхара',
'page_last' => 'тIехьара',
+'histlegend' => "Кхетам: (Ñ…Iанз.) = Ñ…Iанза йолачунна бIаргоагIувни хьакъоаÑтам ба; (хьалх.) = хьалха хинначунна бIаргоагIувни хьакъоаÑтам ба; '''зI''' = зIамига хьахувцам ба.",
'history-fieldset-title' => 'ИÑкара бIаргтаÑÑа',
+'history-show-deleted' => 'ДIадаьккхараш мара',
'histfirst' => 'къаьнараш',
'histlast' => 'ха Ñннараш',
+# Revision feed
+'history-feed-title' => 'Хувцамий иÑкар',
+'history-feed-description' => 'Укх оагIуви вики Ñ‚Iа хувцамий иÑкар',
+'history-feed-item-nocomment' => '$1гIара $2гIачу',
+
# Revision deletion
'rev-delundel' => 'хьахокха/къайлаÑккха',
'rev-showdeleted' => 'хьахокха',
@@ -369,57 +452,103 @@ $messages = array(
'revdelete-radio-set' => 'XIаа',
'revdelete-radio-unset' => 'A',
'revdelete-log' => 'Бахьан',
+'revdelete-logentry' => '[[$1]] доржама оагIувни бIаÑанче хийцай',
'revdel-restore' => ' БIаÑанче хувца',
+'revdel-restore-deleted' => 'дIадаьккха доржамаш',
+'revdel-restore-visible' => 'бIаргагушдола доржамаш',
'pagehist' => 'ОагIува иÑкар',
+'deletedhist' => 'ДIадакхамий иÑкар',
+'revdelete-content' => 'чулоацаро',
+'revdelete-summary' => 'хувцамий лоацам',
'revdelete-uname' => 'дакъалаьцархочунна цIи',
+'revdelete-hid' => 'къайла Ñ $1',
+'revdelete-log-message' => '$1ара $2чунна {{PLURAL:$2|доржама|доржамий}}',
+
+# History merging
+'mergehistory-list' => 'Ð’IашагIатоха хувцамий иÑкар',
+'mergehistory-go' => 'ВIашагIатоха хувцамаш хьахьокха',
+'mergehistory-submit' => 'Хувцамаш вIашагIатоха',
+'mergehistory-empty' => 'Ð’IашагIатохара хувцамаш кораÑÑц',
+'mergehistory-reason' => 'Бахьан:',
# Merge log
'revertmerge' => ' Декъа',
# Diffs
'history-title' => '"$1" хувцамий иÑкар',
+'difference' => '(Доржамашкахь юкъера къоаÑтамаш)',
'lineno' => 'МугI $1:',
'compareselectedversions' => 'Хьаржа доржамаша тарона тIа хьажа',
-'editundo' => 'белгалдаккха',
+'editundo' => 'юхавала/Ñла',
+'diff-multi' => '({{PLURAL:$1|$1 юкъара доржам хьахьекха дац|$1 юкъара доржамаш хьахьекха дац}} {{PLURAL:$2|$2 дакъалаьцархочунна|$2 дакъалаьцархоший}})',
# Search results
-'searchresults' => 'Тахкама гIулакххилар',
-'searchresults-title' => '"$1" тахка',
-'searchresulttext' => 'Хьахьоадайтама оагIувнаш Ñ‚Iа тахкамахь лаьца лоаца маIандар Ñца [[{{MediaWiki:Helppage}}|новкъоÑтала декъамага]] хьажа.',
-'searchsubtitle' => 'Хоаттамахь лаьца «[[:$1]]» ([[Special:Prefixindex/$1|цу цIерахь ювалу оагIувнаш]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|цу цIерахь Iинкаш еж йола]])',
-'searchsubtitleinvalid' => "'''$1''' хаттара",
-'notitlematches' => 'ОагIувни цIераш вIашагIа кхеташ Ñц',
-'notextmatches' => 'ОагIувнаша Ñдамий вIашагIакхетараш дац',
-'prevn' => '{{PLURAL:$1|хьалхарча $1|хьалхарчаш $1|хьалхарчаш $1}}',
-'nextn' => '{{PLURAL:$1|тlехьайоагlар $1|тlехьайоагlараш $1|тlехьайоагlараш $1}}',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) хьажа',
-'searchhelp-url' => 'Help:Чулоацам',
-'search-result-size' => ' $1 ({{PLURAL:$2|1 дош|$2 дешаш}})',
-'search-redirect' => '($1 дехьачуÑккхар)',
-'search-section' => ' (дакъа $1)',
-'search-suggest' => 'Iа лохар из хила мега: $1',
-'search-interwiki-caption' => 'Гаргалона хьахьоадайтамаш',
-'search-interwiki-default' => '$1 толамчаш:',
-'search-interwiki-more' => '(кха)',
-'search-mwsuggest-enabled' => ' Хьехамашца',
-'search-mwsuggest-disabled' => ' Хьехамаш боацаш',
-'nonefound' => "'''Зем лаца.''' Цхьа дола цIера аренаш мара лахалац.
+'searchresults' => 'Тахкама гIулакххилар',
+'searchresults-title' => '"$1" тахка',
+'searchresulttext' => 'Хьахьоадайтама оагIувнаш Ñ‚Iа тахкамахь лаьца лоаца маIандар Ñца [[{{MediaWiki:Helppage}}|новкъоÑтала декъамага]] хьажа.',
+'searchsubtitle' => 'Хоаттамахь лаьца «[[:$1]]» ([[Special:Prefixindex/$1|цу цIерахь ювалу оагIувнаш]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|цу цIерахь Iинкаш еж йола]])',
+'searchsubtitleinvalid' => "'''$1''' хаттара",
+'notitlematches' => 'ОагIувни цIераш вIашагIа кхеташ Ñц',
+'notextmatches' => 'ОагIувнаша Ñдамий вIашагIакхетараш дац',
+'prevn' => '{{PLURAL:$1|хьалхарча $1|хьалхарчаш $1|хьалхарчаш $1}}',
+'nextn' => '{{PLURAL:$1|тlехьайоагlар $1|тlехьайоагlараш $1|тlехьайоагlараш $1}}',
+'prevn-title' => '{{PLURAL:$1|$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}',
+'nextn-title' => '{{PLURAL:$1|$1 тIехьара йоазув|$1 тIехьара йоазувнаш}}',
+'shown-title' => 'Укх оагIувни $1 {{PLURAL:$1|йоазув|йоазувнаш}} хьахокха',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) хьажа',
+'searchmenu-exists' => "'''Укх вики-хьахьоадайтама чу ер оагув \"[[:\$1]]\" Ñ'''",
+'searchmenu-new' => "'''Укх \"[[:\$1]]\" вики-хьахьоадайтамчоахь оагIув де!'''",
+'searchhelp-url' => 'Help:Чулоацам',
+'searchprofile-articles' => 'ЛардоагIувнаш',
+'searchprofile-project' => 'Дагарчеи хьахьоадайтамеи оагIувнаш',
+'searchprofile-images' => 'Медифаг',
+'searchprofile-everything' => 'МаÑÑана',
+'searchprofile-advanced' => 'Шера Ñ',
+'searchprofile-articles-tooltip' => '$1чу лахар',
+'searchprofile-project-tooltip' => '$1чу лахар',
+'searchprofile-images-tooltip' => 'Паьлий лахар',
+'searchprofile-everything-tooltip' => 'МаÑÑадола оагIувний лахар (дувцама оагIувнаш чулоацаш)',
+'searchprofile-advanced-tooltip' => 'IочуÑÐ·ÑŒÑ Ñ†Iераренашкахь лаха',
+'search-result-size' => ' $1 ({{PLURAL:$2|1 дош|$2 дешаш}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|$3 паьла|$3 паьлий|$3 паьлий}})',
+'search-redirect' => '($1 дехьачуÑккхар)',
+'search-section' => ' (дакъа $1)',
+'search-suggest' => 'Iа лохар из хила мега: $1',
+'search-interwiki-caption' => 'Гаргалона хьахьоадайтамаш',
+'search-interwiki-default' => '$1 толамчаш:',
+'search-interwiki-more' => '(кха)',
+'search-mwsuggest-enabled' => ' Хьехамашца',
+'search-mwsuggest-disabled' => ' Хьехамаш боацаш',
+'searchrelated' => 'гаргара',
+'searchall' => 'деррига',
+'showingresultsheader' => "{{PLURAL:$5|'''$1''' толамче укх '''$3''' долачарахь|'''$1 — $2''' толамчаш укх '''$3''' долачарахь}} '''$4'''а",
+'nonefound' => "'''Зем лаца.''' Цхьа дола цIера аренаш мара лахалац.
''all:'' Ñха Ñ‚Iаоттарга пайдабе, маÑÑадола цIеран аренашкахь (дакъалаьцархой дуцамаш а, куцкепаш а, кхы дара а чулоацаш), е деза цIера аренаш IочуÑзаде.",
-'powersearch' => ' Доккха тахкар',
-'powersearch-legend' => ' Доккха тахкар',
-'powersearch-ns' => ' ЦIерий аренашкахь лахар',
-'powersearch-redir' => 'ДIа-хьа оагIувнаш гойта',
-'powersearch-field' => 'Лахар',
+'search-nonefound' => 'ДIахаттама нийÑамаш корадаьдац.',
+'powersearch' => ' Доккха тахкар',
+'powersearch-legend' => ' Доккха тахкар',
+'powersearch-ns' => ' ЦIерий аренашкахь лахар',
+'powersearch-redir' => 'ДIа-хьа оагIувнаш гойта',
+'powersearch-field' => 'Лахар',
+'powersearch-toggleall' => 'Деррига',
+'powersearch-togglenone' => 'Цхьаккха',
+
+# Quickbar
+'qbsettings-none' => 'Цхьаккха',
# Preferences page
'preferences' => 'Оттамаш',
'mypreferences' => 'Оттамаш',
'prefsnologin' => 'Шо чудаьнна дац',
-'changepassword' => 'КъайладогIа дIахувцар',
+'changepassword' => 'КъайладоaгIа дIахувцар',
'prefs-skin' => 'БIагала куц',
'skin-preview' => 'Хьажа',
'prefs-datetime' => 'Таьрахьеи Ñахьатеи',
'prefs-personal' => 'Хьа хьай далам',
+'prefs-rc' => 'Керда хувцамаш',
+'prefs-watchlist' => 'Теркама дагарче',
+'prefs-watchlist-days' => 'Ден дукхал',
+'prefs-resetpass' => 'КъайладогIа хувца',
'prefs-rendering' => 'ТIера бIаÑа',
'saveprefs' => 'Дита',
'prefs-editing' => 'ГIалатнийÑдар',
@@ -444,62 +573,113 @@ $messages = array(
'yourlanguage' => 'Мотт:',
'gender-male' => 'МаIа',
'gender-female' => 'Кхал',
+'email' => 'Д-фошт',
'prefs-signature' => 'КулгÑздар',
# User rights
-'userrights-user-editname' => 'Дакъалаьцархочунна цIи IоÑзаде',
-'editusergroup' => 'Дакъалаьцархочунна тоабаш хувца',
-'saveusergroups' => 'Дакъалаьцархочунна тоабаш дита',
-'userrights-groupsmember' => 'Тоабий дакъалаьцархо:',
+'userrights-user-editname' => 'Дакъалаьцархочунна цIи IоÑзаде',
+'editusergroup' => 'Дакъалаьцархочунна тоабаш хувца',
+'saveusergroups' => 'Дакъалаьцархочунна тоабаш дита',
+'userrights-groupsmember' => 'Тоабий дакъалаьцархо:',
+'userrights-reason' => 'Бахьан:',
+'userrights-changeable-col' => 'Оаш хувца мегаш йола тоабаш',
+'userrights-unchangeable-col' => 'Оаш хувца мегаш йоаца тоабаш',
# Groups
+'group' => 'Тоаб:',
+'group-user' => 'Дакъалаьцархой',
+'group-bot' => 'БIаташ',
'group-sysop' => 'Мазакулгалхой',
+'group-all' => '(деррига)',
-'group-user-member' => 'дакъалаьцархо',
+'group-user-member' => 'дакъалаьцархо',
+'group-bot-member' => 'бIат',
+'group-sysop-member' => 'мазакулгалхо',
'grouppage-user' => '{{ns:project}}:Дакъалаьцархой',
+'grouppage-bot' => '{{ns:project}}:БIаташ',
'grouppage-sysop' => '{{ns:project}}:Мазакулгалхой',
# Rights
-'right-read' => 'ОагIувнаш деша',
-'right-edit' => 'ОагIувнаш хувца',
+'right-read' => 'ОагIувнаш деша',
+'right-edit' => 'ОагIувнаш хувца',
+'right-createtalk' => 'дувцама оагIувний хьакхоллам',
+'right-move' => 'ОагIувний цIи хувца',
+'right-movefile' => 'Паьлий цIи хувца',
# User rights log
-'rightslog' => 'Дакъалаьцархочунна бокъона тептар',
+'rightslog' => 'Дакъалаьцархочунна бокъона тептар',
+'rightsnone' => '(а)',
# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'Укх оагIуви дешам',
'action-edit' => 'Ер оагIув хувца',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|хувцам|хувцамаш}}',
-'recentchanges' => 'Керда хувцамаш',
-'recentchanges-legend' => 'Керда хувцамий оттамаш',
-'rclistfrom' => '$1 тIара хувцамаш хьахокха',
-'rcshowhideminor' => 'зIамига хувцамаш $1',
-'rcshowhideliu' => 'Чубаьнначара дакъалаьцархочий $1',
-'rcshowhideanons' => 'цIиÑьккханза дакъалаьцархой $1',
-'rcshowhidemine' => '$1 Ñай хувцамаш',
-'diff' => 'кхы.',
-'hist' => 'иÑкар',
-'hide' => 'Къайладаккха',
-'show' => 'Хьахокха',
-'minoreditletter' => 'м',
-'newpageletter' => 'Ð',
-'boteditletter' => 'б',
+'nchanges' => '$1 {{PLURAL:$1|хувцам|хувцамаш}}',
+'recentchanges' => 'Керда хувцамаш',
+'recentchanges-legend' => 'Керда хувцамий оттамаш',
+'recentchangestext' => 'КIалхагIа лоарамий доаламе Ñ‚Iехьара оагIувний хувцамаш дIаÑзадаь да{{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-feed-description' => 'Укх ларамца тIехьара викихувцамашт теркам бе.',
+'recentchanges-label-newpage' => 'Укх хувцамаца керда оагIув даь хиннад',
+'recentchanges-label-minor' => 'ЗIамига хувцам Ñ',
+'recentchanges-label-bot' => 'Ер хувцам бIатаца Ñ Ðµ',
+'recentchanges-label-unpatrolled' => 'Ер хувцам ший моттиге кха дIадехьаÑккхаÑц.',
+'rcnote' => "{{PLURAL:$1|Тlехьара '''$1''' хувцам|Тlехьара '''$1''' хувцамаш}} дола '''$2''' {{PLURAL:$2|ден|деношкахь}}, укх Ñахьате $5 $4.",
+'rcnotefrom' => 'КIалхагIа хувцамаш хьахьекха Ñ <strong>$2</strong> денза (<strong>$1</strong> кхачалца).',
+'rclistfrom' => '$1 тIара хувцамаш хьахокха',
+'rcshowhideminor' => 'зIамига хувцамаш $1',
+'rcshowhidebots' => '$1 шабелхалой',
+'rcshowhideliu' => 'Чубаьнначара дакъалаьцархочий $1',
+'rcshowhideanons' => 'цIиÑьккханза дакъалаьцархой $1',
+'rcshowhidepatr' => '$1 теркам даь хувцамаш',
+'rcshowhidemine' => '$1 Ñай хувцамаш',
+'rclinks' => '$2 динахь<br />$3 $1 хинна тIехьара хувцамаш хьахокха',
+'diff' => 'кхы.',
+'hist' => 'иÑкар',
+'hide' => 'Къайладаккха',
+'show' => 'Хьахокха',
+'minoreditletter' => 'м',
+'newpageletter' => 'Ð',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'Ма дарра чулоацамаш хьахокха (JavaScriptаца)',
+'rc-enhanced-hide' => 'Ма дарра чулоацамаш къайладаккха',
# Recent changes linked
-'recentchangeslinked' => 'Гаргалона хувцамаш',
-'recentchangeslinked-summary' => "Ер, Iинк Ñ Ð¹Ð¾Ð»Ð° оагIув (е укх цатегачу чуйоагIараш), дукха ха йоацаш хьийца оагIувнашки дагарче Ñ.
+'recentchangeslinked' => 'Гаргалона хувцамаш',
+'recentchangeslinked-toolbox' => 'Гаргалона хувцамаш',
+'recentchangeslinked-title' => '$1ца хьалаьца хувцамаш',
+'recentchangeslinked-noresult' => 'Укх заманашка гаргарон оагIувнаш Ñ‚Iа хувцамаш хиннаÑц.',
+'recentchangeslinked-summary' => "Ер, Iинк Ñ Ð¹Ð¾Ð»Ð° оагIув (е укх цатегачу чуйоагIараш), дукха ха йоацаш хьийца оагIувнашки дагарче Ñ.
[[Special:Watchlist|Шун теркама дагаршкахь]] чуйоагIа оагIувнаш '''Ð±ÐµÐ»Ð³Ð°Ð»ÑŠÑ Ñ'''.",
-'recentchangeslinked-page' => 'ОагIува цIи',
+'recentchangeslinked-page' => 'ОагIува цIи',
+'recentchangeslinked-to' => 'ОагIувнаш тIа хувцамаш хьахокха, хьахекха йола оагIув тIа Iинкаш еш йола.',
# Upload
-'upload' => 'Паьл чуÑккха',
+'upload' => 'Паьл чуÑккха',
+'uploadlogpage' => 'ЧуÑккхамий тептар',
+'filedesc' => 'Лоаца лоацам',
+'fileuploadsummary' => 'Лоаца лоацам:',
+'uploadedimage' => '"[[$1]]" чуÑккхай',
+
+'license' => 'ЦIийÑздар',
+'license-header' => 'ЦIийÑздар',
+
+# Special:ListFiles
+'imgfile' => 'паьл',
+'listfiles' => 'Паьлий дагарче',
+'listfiles_date' => 'Денха',
+'listfiles_name' => 'Паьла цIи',
+'listfiles_user' => 'Дакъалаьцархо',
+'listfiles_size' => 'ДуÑтам',
+'listfiles_description' => 'Лоацам',
+'listfiles_count' => 'Доржамаш',
# File description page
'file-anchor-link' => 'Паьл',
'filehist' => 'Паьла иÑкар',
'filehist-help' => 'Хьалхе паьла мишта хиннай хьожаpгволаш/хьожаpгйолаш, дентаьрах/Ñахьата Ñ‚Iа пIелга Ñ‚Iообе.',
+'filehist-revert' => 'юхаÑккха',
'filehist-current' => 'xIанзара',
'filehist-datetime' => 'Дентаьрахь/Ха',
'filehist-thumb' => 'ЗIамигаÑуртанче',
@@ -511,15 +691,19 @@ $messages = array(
'filehist-missing' => 'Паьла йоацаш Ñ',
'imagelinks' => 'Паьла Iинкаш',
'linkstoimage' => '{{PLURAL:$1|ТIехьайоагIа $1 оагIув Iинк ду|ТIехьайоагIа $1 оагIувнаш Iинкаш ду}} укх паьла тIа:',
+'nolinkstoimage' => 'Йола паьлат Iинк ю оагIувнаш дац',
'sharedupload' => 'Ер паьла $1чера Ñ, кхыча хьахьоадайтамча хьахайраде йийшайолаш Ñ.',
+'sharedupload-desc-here' => 'Ер паьл $1чара Ñ, кхыдола хьахьоадайтамача хайрамбе йийш йолаш да.
+Цунна [$2 лоацама оагIувца] лоаца маIандар кIалхагIа латта.',
'uploadnewversion-linktext' => 'Укх паьлий керда бIаÑа чуÑккха',
# File reversion
'filerevert-comment' => 'Бахьан:',
# File deletion
-'filedelete-comment' => 'Бахьан:',
-'filedelete-submit' => 'ДIадаккха',
+'filedelete-comment' => 'Бахьан:',
+'filedelete-submit' => 'ДIадаккха',
+'filedelete-reason-otherlist' => 'Кхыдола бахьан',
# MIME search
'download' => 'хьачуÑккха',
@@ -527,12 +711,27 @@ $messages = array(
# Unwatched pages
'unwatchedpages' => 'Теркамза оагIувнаш',
+# Random page
+'randompage' => 'Дагадоаца йоазув',
+
# Statistics
-'statistics' => 'Дагара куц',
+'statistics' => 'Дагара куц',
+'statistics-pages' => 'ОагIувний',
+
+'disambiguationspage' => 'Template: ЦаI маIандоацар',
+
+'brokenredirects-edit' => 'хувца',
+'brokenredirects-delete' => 'дIадаккха',
+
+'withoutinterwiki-submit' => 'Хьахокха',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|бIат|бIаташ}}',
'nmembers' => '$1 {{PLURAL:$1|дакъалаьцархо|дакъалаьцархой}}',
+'prefixindex' => 'ОагIувнаший хьалхера цIи хьагойтар',
+'shortpages' => 'Лоаца оагIувнаш',
+'longpages' => 'Доккхий оагIувнаш',
+'usercreated' => '$1ара $2чуча даь да',
'newpages' => 'Керда оагIувнаш',
'move' => 'ЦIи хувца',
'movethispage' => 'Укх оагIува цIи хувца',
@@ -549,7 +748,10 @@ $messages = array(
# Special:AllPages
'allpages' => 'Еррига оагIувнаш',
+'alphaindexline' => '$1гIара $2гIачу',
'prevpage' => '($1) хьалхара оагIув',
+'allpagesfrom' => 'Цу тайпара ювлаж йола оагIувнаш белгал е:',
+'allpagesto' => 'Укх оагIувнаш тIа бIарга дита:',
'allarticles' => 'Еррига оагIувнаш',
'allpagessubmit' => 'Кхоачашде',
@@ -557,8 +759,9 @@ $messages = array(
'categories' => 'Цатегаш',
# Special:LinkSearch
-'linksearch' => 'ЧураIинкаш',
-'linksearch-ok' => 'Лаха',
+'linksearch' => 'ЧураIинкаш',
+'linksearch-ok' => 'Лаха',
+'linksearch-line' => '$1 тIа Iинк $2 юкъера',
# Special:Log/newusers
'newuserlogpage' => 'Дакъалаьцархоший дIаÑзбeнна таптар',
@@ -568,11 +771,12 @@ $messages = array(
'listgrouprights-members' => '(тоабий дагарче)',
# E-mail user
-'emailuser' => 'Дакъалаьцархочоа Д-фошт:',
+'emailuser' => 'Дакъалаьцархочоа д-фошт:',
# Watchlist
'watchlist' => 'Теркама дагарче',
'mywatchlist' => 'Теркама дагарче',
+'watchlistfor2' => '$1 $2 царна',
'addedwatch' => 'Теркама оагIув Ñ‚Iа дIатIаÑккха Ñ',
'addedwatchtext' => '"[[:$1]]" оагIув, шун [[Special:Watchlist|теркама дагаршкахь]] чуÑккха Ñ.
Техьара мел йола укх оагIувни хувцамаш цу дагаршкахь хоам беш хургьÑ. Вешта [[Special:RecentChanges|керда хувцама дагаршкаехь]] Ñома къоалмаца хьакъоаÑтлуш хургьÑ.',
@@ -581,6 +785,8 @@ $messages = array(
'watch' => 'Тохкам бе',
'watchthispage' => 'Укх оагIува теркам бе',
'unwatch' => 'Лора ма де',
+'watchlist-details' => 'Шун теркама дагарченгахь йола $1 {{PLURAL:$1|оагIув|оагIувнаш}}, дувцама оагIувнаш ца лоархаш.',
+'wlshowlast' => 'Тlехьара $1 Ñахьаташ $2 денош $3 хьахокха',
'watchlist-options' => 'Зем баккха дагарена хувцамаш',
# Displayed when you click the "watch" button and it is in the process of watching
@@ -589,7 +795,10 @@ $messages = array(
# Delete
'deletepage' => 'ОагIув дIаÑккха',
+'confirmdeletetext' => 'Оаш оагIувни (е Ñурти) барча дIадаккхар хьайийхай кха еррига хувцамий иÑкар долама ковчера.
+Дехар да, жоп дала, шоай из бокъонцахь де безам болаш да, шоай даьчоахь хургдолчоахь кхеташ долга, [[{{MediaWiki:Policy-url}}]] декъамачу IоÑзадаь дола адаташ ца из деш долга.',
'actioncomplete' => 'Дулархам баьб',
+'actionfailed' => 'Оттам даьдац',
'deletedtext' => '"<nowiki>$1</nowiki>" дIаÑккха хиннай.
ТIехьара дIадаьккха дагарчена хьожаргволаш/хьожаргьйолаш, $2 хьажа.',
'deletedarticle' => ' "[[$1]]" дIадаьккхад',
@@ -603,6 +812,8 @@ $messages = array(
# Protect
'protectlogpage' => 'Лорама тептар',
+'protectedarticle' => '"[[$1]]" оагIув лорам деж Ñ',
+'modifiedarticleprotection' => '"[[$1]]" оагIувни лорама лагIа хувцаеннай',
'protectcomment' => 'Бахьан:',
'protectexpiry' => 'Кхоачалуш латта:',
'protect_expiry_invalid' => 'Чаккхабоала лорама харца ха',
@@ -628,7 +839,9 @@ $messages = array(
'restriction-upload' => 'Чудаккхар',
# Undelete
-'undeletelink' => 'БIаргтаÑÑа/юхаметтаоттаде',
+'undeletelink' => 'БIаргтаÑÑа/юхаметтаоттаде',
+'undeleteviewlink' => 'бIаргтаÑÑа',
+'undeletedarticle' => '"[[$1]]" юха Ð¾Ñ‚Ñ‚Ð°Ñ Ñ',
# Namespace form on various pages
'namespace' => 'ЦIерий аренаш',
@@ -639,40 +852,69 @@ $messages = array(
'contributions' => 'Дакъалаьцархочунна къахьегам',
'contributions-title' => '$1 дакъалаьцархочунна къахьегам',
'mycontris' => 'Са къахьегам',
+'contribsub2' => '$1 ($2) баь болх',
'uctop' => '(тIехьара)',
'month' => 'Цхьа бутт хьалхагIа (кха хьалхагIа)',
'year' => 'Цхьа шу хьалхагIа (кха хьалхагIа):',
+'sp-contributions-newbies' => 'Керда даÑÐ·ÑŒÑ Ð¹Ð¾Ð°Ð·Ð¾Ð½Ð°Ñ‡ÐµÑ€Ð° мара баь бола къахьегам ма хокха',
'sp-contributions-blocklog' => 'чIегаш',
+'sp-contributions-uploads' => 'чуÑккхамаш',
+'sp-contributions-logs' => 'тептараш',
'sp-contributions-talk' => 'дувцам',
'sp-contributions-search' => 'Къахьегама лахар',
'sp-contributions-username' => 'IP-моттиг е цIи:',
+'sp-contributions-toponly' => 'ТIехьара доржамаш лоархаш дола хувцамаш мара ма хьокха',
'sp-contributions-submit' => 'Хьалаха',
# What links here
-'whatlinkshere' => 'Iинкаш укхаза',
-'whatlinkshere-page' => 'ОагIув',
-'isredirect' => 'дIа-хьа оагIув',
-'istemplate' => 'чудаккхар',
-'isimage' => 'Сурта Iинк',
-'whatlinkshere-links' => '↠Iинкаш',
-'whatlinkshere-hidelinks' => '$1 Iинкаш',
-'whatlinkshere-filters' => 'ЦIенъераш',
+'whatlinkshere' => 'Iинкаш укхаза',
+'whatlinkshere-title' => '"$1" тIа Iинкаш еш йола оагIувнаш',
+'whatlinkshere-page' => 'ОагIув',
+'linkshere' => "ТIехьара оагIувнаш '''[[:$1]]''' тIа Iинкаш ю:",
+'nolinkshere' => "'''[[:$1]]''' оагIув Ñ‚Iа, кхыдола оагIувашкара Iинкаш йоацаш Ñ",
+'isredirect' => 'дIа-хьа оагIув',
+'istemplate' => 'чудаккхар',
+'isimage' => 'Сурта Iинк',
+'whatlinkshere-prev' => '{{PLURAL:$1|хьахайоагIа|хьалхайоагIараш}} $1',
+'whatlinkshere-next' => '{{PLURAL:$1|тIехьайоагIа|тIехьайоагIараш}} $1',
+'whatlinkshere-links' => '↠Iинкаш',
+'whatlinkshere-hideredirs' => '$1 дIа-хьа чуÑккхамаш',
+'whatlinkshere-hidetrans' => '$1 чуÑккхамаш',
+'whatlinkshere-hidelinks' => '$1 Iинкаш',
+'whatlinkshere-hideimages' => '$1 ÑуртIинкаш',
+'whatlinkshere-filters' => 'ЦIенъераш',
# Block/unblock
'blockip' => 'Дакъалаьцархочунна чIега бола',
+'ipboptions' => '2 Ñахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,Ñиха ца луш:infinite',
'ipblocklist' => 'ЧIега бела дакъалаьцархой',
'blocklink' => 'чIегa тоха',
'unblocklink' => 'чIега баÑта',
'change-blocklink' => 'ЧIегатохар хувца',
'contribslink' => 'къахьегам',
'blocklogpage' => 'ЧIегаш тoха таптар',
+'blocklogentry' => '[[$1]] чIега белаб, $2 $3 ха Ñлалца',
+'unblocklogentry' => '$1 юха ÑÑта Ñ',
'block-log-flags-nocreate' => 'Лархамий дагарчена цIи Ñккхар пурам Ñнза Ñ.',
'blockme' => 'ЧIега бола Ñона',
'proxyblocksuccess' => 'Хьадаьд.',
# Move page
'move-page-legend' => 'ОагIува цIи хувца',
+'movepagetext' => "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргьÑ, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.
+КIаьнара цIерахь керда цIерий дIачудаккхам хургда.
+КIаьнара цIера Ñ‚Iа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургьÑ.
+Из оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаÑккха дIачудаккхамий]] кардоламахь хьажа.
+Оаш жоп лу, шоай чуÑккха йола Iинкаш, даим болхбеш хургдолга.
+
+Зем бахка, оагIувни цIи хувцалургьÑц, изза мо цIи йолаш оагIув хилача.
+Йолаш йола оагIув хувца йийш Ñц, амма хийца йола оагIув юха хьахувца йийш Ñ.
+
+'''Хоамхайтар'''
+
+ЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.
+Дехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
'movepagetalktext' => "ТIатеха дувцама оагIув, ший лоIамахь цIи хувлургьÑ, '''ер дага а доацар, доаца:'''
*Изза мо цIи йолаш ÑÑŒÑÑа дувцама оагIув Ñ Ðµ
@@ -690,6 +932,8 @@ $messages = array(
'talkexists' => "'''ОагIувни цIи хьийца хиннай, амма дувцама оагIувни цIи хувца мегаш Ñц, изза мо цIи йолаш оагIув йоландаь. Дехар да, кулга новкъоÑталца цхьанна вIашагIатоха уш.'''",
'movedto' => 'керда цIи тилла Ñ',
'movetalk' => 'МаIан чулоаца дувцама оагIувни цIи хувца',
+'1movedto2' => '[[$1]] цIи цу тIа [[$2]] хийцай',
+'1movedto2_redir' => '[[$1]] цIи хийцай [[$2]] дIа-хьа оагIува тIа гIолла',
'movelogpage' => 'Хувцама тептар',
'movereason' => 'Бахьан',
'revertmove' => 'юхаÑккха',
@@ -699,12 +943,14 @@ $messages = array(
# Namespace 8 related
'allmessagesname' => 'ЦIи',
+'allmessagesdefault' => 'Сатийна улла Ñздам',
'allmessages-filter-all' => 'Дерригаш',
'allmessages-language' => 'Мотт:',
'allmessages-filter-submit' => 'Дехьавала',
# Thumbnails
-'thumbnail-more' => 'Хьадоккхаде',
+'thumbnail-more' => 'Хьадоккхаде',
+'thumbnail_error' => 'ЗIамигаÑуртанчий кхеллама гIалат: $1',
# Special:Import
'import-upload-filename' => 'ПаьлацIи:',
@@ -715,8 +961,8 @@ $messages = array(
'tooltip-pt-preferences' => ' Шун оттамаш',
'tooltip-pt-watchlist' => 'Оаш хувцамаш тIа бIарглакха оагIувнаша дагарче',
'tooltip-pt-mycontris' => 'Шун хувцамаш',
-'tooltip-pt-login' => 'Укхаза хьай цIи аьле чувала йийша Ñ, амма чуцаваьлача Ñ…Iамма а дац',
-'tooltip-pt-logout' => 'Ðравала',
+'tooltip-pt-login' => 'Укхаза хьай цIи аьле чувала/чуÑла йийша Ñ, амма чуцаваьлача/чуцаÑлача Ñ…Iамма а дац',
+'tooltip-pt-logout' => 'Ðравала/Ñла',
'tooltip-ca-talk' => 'ОагIува чулоацамий дувцам',
'tooltip-ca-edit' => 'Ер оагIув хувца йийшйолаш Ñ. Дехар да, Iалаш елаьхь, хьалхе бIаргтаÑÑама оагIув Ñ‚Iа бIаргтаÑÑа.',
'tooltip-ca-addsection' => 'Керда декъам хьаде',
@@ -730,6 +976,7 @@ $messages = array(
'tooltip-search' => ' Цу тайпара дош лаха {{SITENAME}}',
'tooltip-search-go' => ' Изза мо цIи йолаш оагIув тIa дехьавала',
'tooltip-search-fulltext' => ' Изза мо Ñздам долаш оагIувнаш лаха',
+'tooltip-p-logo' => 'Кертера оагIув тIа дехьавала',
'tooltip-n-mainpage' => 'Кертера оагIув тIа дехьавала',
'tooltip-n-mainpage-description' => 'Кертера оагIув тIа дехьавала',
'tooltip-n-portal' => 'Хьахьоадайтамахь лаьца, хьа де йийшдар, фа а мичча а йоала',
@@ -762,12 +1009,20 @@ $messages = array(
'tooltip-watch' => 'Ер оагIув теркам беча каьхата Ñ‚Iа Ñккха',
'tooltip-rollback' => 'ГIалaтанийÑадаро Ñ‚Iехьара Ñ Ð¹Ð¾Ð»Ð° хувцамаш, пIелг тоIоби дIаÑккха.',
'tooltip-undo' => 'Я хувцам дIаÑккхи, бIаргатаÑÑар хьахокха, кара дале, дIаÑккха бахьан IочуÑзаде моттигаца.',
+'tooltip-summary' => 'Лоаца чулоацам IочуÑзаде',
+
+# Patrol log
+'patrol-log-line' => '$1 долачаьрахь $2 $3 хьажав/хьажай',
+'patrol-log-diff' => '$1 доржам',
# Browsing diffs
-'previousdiff' => 'Хьалхара хувцам',
+'previousdiff' => '↠Хьалхара хувцам',
'nextdiff' => 'ТIайоагIа хувцам',
# Media information
+'file-info-size' => '$1 × $2 фихÑам, паьла дуÑтам: $3, MIME-тайп: $4',
+'file-nohires' => '<small>Укхал доккхагIа доржам дац</small>',
+'svg-long-desc' => 'SVG-паьл, $1 × $2 фихелашца, паьла дуÑтам: $3',
'show-big-image' => 'Хьадоккхадаь Ñурт',
# Special:NewFiles
@@ -781,6 +1036,12 @@ $messages = array(
МугIарена хьалхара Iинк, Ñурт Iоттае пурам доаца Iинка, хила еза.
Цу мугIар Ñ‚Iа Ñ‚IехьайоагIа Iинкаш, арадаккхар мо лоархаш хургьÑ, вешта аьлча, йоазувашка чуIоттаде мегаш дола Ñурт Ñанна ларха мега.',
+# Metadata
+'metadata' => 'МетахIамаш',
+'metadata-help' => 'ÐŸÐ°ÑŒÐ»Ð°Ñ Ñ‡ÑƒÐ»Ð¾Ð°Ñ†Ð°, кхыдола Ñ…Iамаш, таьрахьа Ñуртдоаккхаргца е Ñ‚IагIолладоаккхаргца чудаккхаш дола. Ð¥ÑŒÐ°Ñ Ð¿Ð°ÑŒÐ», гIалатахь мукъадаьккха хинна дале, хьахокхаш дола Ñурт, деррига Ñ…Iамаш чулоацаргдац.',
+'metadata-expand' => 'Кхыдола хIамаш хьахокха',
+'metadata-collapse' => 'Кхыдола хIамаш къайладаккха',
+
# EXIF tags
'exif-imagewidth' => 'Шерал',
'exif-imagelength' => 'Лакхал',
@@ -793,6 +1054,10 @@ $messages = array(
'exif-scenecapturetype-1' => 'ЛаьттабIаÑа',
'exif-scenecapturetype-2' => 'Сурт',
+# External editor support
+'edit-externally' => 'Йола болхоагIувца паьла гIалатахь мукъаÑккха',
+'edit-externally-help' => '(ма даррачунга хьажа [http://www.mediawiki.org/wiki/Manual:External_editors хьаоттама кулгалхо])',
+
# 'all' in various places, this might be different for inflected languages
'recentchangesall' => 'деррига',
'imagelistall' => 'деррига',
@@ -801,6 +1066,9 @@ $messages = array(
'monthsall' => 'деррига',
'limitall' => 'деррига',
+# action=purge
+'confirm_purge_button' => 'ХIаа',
+
# Multipage image navigation
'imgmultigo' => 'Дехьавала!',
'imgmultigoto' => '$1 оагIув тIа дехьавала',
@@ -811,10 +1079,16 @@ $messages = array(
# Watchlist editing tools
'watchlisttools-view' => 'Дагарчера оагIувнаш тIа хувцамаш',
'watchlisttools-edit' => 'Дагарче хьажа/хувца',
+'watchlisttools-raw' => 'Яздам мо хувца',
+
+# Core parser functions
+'duplicate-defaultsort' => 'Зем бе. Сатийна дIа-хьа хьоржама доагI "$2" хьалхара Ñатийна дIа-хьа хьоржама доагI "$1" хьахьоржа.',
# Special:Version
-'version' => 'Доржам',
-'version-specialpages' => 'ГIулакхий оагIувнаш',
+'version' => 'Доржам',
+'version-specialpages' => 'ГIулакхий оагIувнаш',
+'version-version' => '(Доржам $1)',
+'version-software-version' => 'Доржам',
# Special:FilePath
'filepath' => 'Паьлачу никъ',
@@ -823,9 +1097,39 @@ $messages = array(
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'ПаьлацIи:',
+'fileduplicatesearch-submit' => 'Лаха',
# Special:SpecialPages
-'specialpages' => 'ГIулакхий оагIувнаш',
+'specialpages' => 'ГIулакхий оагIувнаш',
+'specialpages-group-users' => 'Дакъалаьцархой, цара бокъо',
+'specialpages-group-pages' => 'ОагIувний дагарченаш',
+'specialpages-group-pagetools' => 'ОагIувнаша гIирÑаш',
+
+# External image whitelist
+'external_image_whitelist' => '#Ер мугI ший долаш тайпара дита<pre>
+#КаÑÑ‚-каÑта оаламаш укхаза дIаÑзаде(юкъе дола дакъа //)
+#арара Ñуртий URLца дIанийÑалургда уш.
+#Пайдан дола, Ñурташ мо хьахьекха хургьÑ, дахIодараш, Ñурта Ñ‚Iа Iинкаш мо хуpÐ³ÑŒÑ Ñ…ÑŒÐ°Ñ…ÑŒÐµÐºÑ…Ð°.
+#Укх # тамагIалгаца дIадувлаш дола мугIанаш, оалам мо лоархаш да.
+#МугIанаш Ñздaтакха каьда да
+
+#КаÑÑ‚-каÑта оаламаш укх мугIа лакхе дIаÑзаде. Из мугI ший долаш тайпара дита<pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Йоазоний]] цIенаÑрг:',
+'tags-title' => 'Йоазонаш',
+'tags-tag' => 'Йоазон цIи',
+'tags-edit' => 'хувца',
+'tags-hitcount' => '$1 {{PLURAL:$1|хувцам|хувцамаш}}',
+
+# Special:ComparePages
+'compare-page1' => '1. ОагIув',
+'compare-page2' => '2. ОагIув',
+'compare-rev1' => '1. Доржам',
+'compare-rev2' => '2. Доржам',
+
+# Database error messages
+'dberr-header' => 'Укх Ð²Ð¸ÐºÐ¸Ñ Ñ…Ð°Ð»Ð¾Ð½Ð°Ñˆ ловш латта',
# HTML forms
'htmlform-submit' => 'ДIадахийта',
diff --git a/languages/messages/MessagesIo.php b/languages/messages/MessagesIo.php
index 30446e1f..b62597d9 100644
--- a/languages/messages/MessagesIo.php
+++ b/languages/messages/MessagesIo.php
@@ -122,8 +122,7 @@ $messages = array(
'tog-editsection' => 'Kapabligez redakto di secioni per [redaktar]-ligamini',
'tog-editsectiononrightclick' => 'Kapabligez redakto di secioni kande on dextra-klikus tituli di secioni (JavaScript bezonesas)',
'tog-showtoc' => 'Montrez indexo (por pagini havanta plu multa kam 3 tituli)',
-'tog-rememberpassword' => 'Memorez mea pasovorto en ica komputoro',
-'tog-editwidth' => 'Larjigez la redakto-buxo por ke ol okupas la tota skreno',
+'tog-rememberpassword' => "Memorez mea pasovorto en ca ''browser'' (maxime $1 {{PLURAL:$1|dio|dii}})",
'tog-watchcreations' => 'Adjuntez pagini kreota da me ad mea surveyaji',
'tog-watchdefault' => 'Adjuntez pagini redaktota da me ad mea surveyaji',
'tog-watchmoves' => 'Adjuntez pagini movota da me ad mea surveyaji',
@@ -248,27 +247,20 @@ $messages = array(
'qbspecialpages' => 'Specala pagini',
# Vector skin
-'vector-action-addsection' => 'Adjuntar topiko',
-'vector-action-delete' => 'Efacar',
-'vector-action-move' => 'Movar',
-'vector-action-protect' => 'Protektar',
-'vector-action-undelete' => 'Rekuperar',
-'vector-action-unprotect' => 'Desprotektar',
-'vector-namespace-category' => 'Kategorio',
-'vector-namespace-help' => 'Helpo-pagino',
-'vector-namespace-image' => 'Failo',
-'vector-namespace-main' => 'Pagino',
-'vector-namespace-mediawiki' => 'Mesajo',
-'vector-namespace-special' => 'Specala pagino',
-'vector-namespace-talk' => 'Diskuto',
-'vector-namespace-template' => 'Shablono',
-'vector-namespace-user' => 'Uzanto-pagino',
-'vector-view-create' => 'Krear',
-'vector-view-edit' => 'Redaktar',
-'vector-view-history' => 'Vidar versionaro',
-'vector-view-view' => 'Lektar',
-'vector-view-viewsource' => 'Vidar fonto',
-'namespaces' => 'Nomari',
+'vector-action-addsection' => 'Adjuntar topiko',
+'vector-action-delete' => 'Efacar',
+'vector-action-move' => 'Movar',
+'vector-action-protect' => 'Protektar',
+'vector-action-undelete' => 'Rekuperar',
+'vector-action-unprotect' => 'Desprotektar',
+'vector-view-create' => 'Krear',
+'vector-view-edit' => 'Redaktar',
+'vector-view-history' => 'Vidar versionaro',
+'vector-view-view' => 'Lektar',
+'vector-view-viewsource' => 'Vidar fonto',
+'actions' => 'Agi',
+'namespaces' => 'Nomari',
+'variants' => 'Varianti',
'errorpagetitle' => 'Eroro',
'returnto' => 'Retrovenar a $1.',
@@ -435,7 +427,7 @@ Voluntez, ne obliviez chanjor vua [[Special:Preferences|preferaji en {{SITENAME}
'yourname' => 'Vua uzantonomo:',
'yourpassword' => 'Pasovorto:',
'yourpasswordagain' => 'Riskribez la pasovorto:',
-'remembermypassword' => 'Memorez mea pasovorto inter sesioni en ca komputoro',
+'remembermypassword' => 'Memorez mea pasovorto en ca komputoro (maximo: $1 {{PLURAL:$1|dio|dii}})',
'yourdomainname' => 'Vua domano:',
'login' => 'Enirar',
'nav-login-createaccount' => 'Enirar',
@@ -451,6 +443,7 @@ Voluntez, ne obliviez chanjor vua [[Special:Preferences|preferaji en {{SITENAME}
'gotaccount' => "Ka vu ja havas konto? '''$1'''.",
'gotaccountlink' => 'Enirar',
'createaccountmail' => 'per e-posto',
+'createaccountreason' => 'Motivo:',
'badretype' => 'La pasovorti vu donis ne esas sama.',
'userexists' => 'La uzantonomo, quan vu skribis, ja selektesis antee.
Voluntez, elektez ula diferanta uzantonomo.',
@@ -588,9 +581,6 @@ Se vu gardus ol, la chanji facita pos ita revizo perdesos.'''",
Se vu ne deziras ke altri modifikez vua artikli od oli distributesez libere, lore voluntez ne skribar oli hike.<br />
Publikigante vua skribajo hike, vu asertas ke olu skribesis da vu ipsa o kopiesis de libera fonto.
'''NE SENDEZ ARTIKLI KUN ''COPYRIGHT'' SEN PERMISO!'''",
-'longpagewarning' => "'''EGARDEZ''': Ica pagino esas $1 kilobicoki longa;
-Ula navigili posible havas problemi redaktante pagini proximeskanta o plu longa kam 32kb.
-Voluntez konsideras separar la pagino aden plu mikra secioni.",
'protectedpagewarning' => "'''AVERTO: Ica pagino esas blokusita, do nur ''sysop''-i povas redaktar olu.'''",
'templatesused' => '{{PLURAL:$1|Shablono|Shabloni}} uzata en ica pagino:',
'templatesusedpreview' => '{{PLURAL:$1|Shablono|Shabloni}} uzata en ica prevido:',
@@ -644,6 +634,8 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
'revdelete-radio-unset' => 'No',
'revdelete-log' => 'Motivo:',
'revdel-restore' => 'chanjar videbleso',
+'revdel-restore-deleted' => 'efacita revizadi',
+'revdel-restore-visible' => 'videbla revizadi',
'pagehist' => 'Pagino-versionaro',
'deletedhist' => 'Efacita versionaro',
'revdelete-content' => 'kontenajo',
@@ -669,48 +661,51 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
'editundo' => 'des-facez',
# Search results
-'searchresults' => 'Rezultaji dil sercho',
-'searchresults-title' => 'Sercho-rezultaji por "$1"',
-'searchresulttext' => 'Por plusa informo pri quale serchar en {{SITENAME}}, videz [[{{MediaWiki:Helppage}}|help]].',
-'searchsubtitle' => 'Vu serchis \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|omna pagini komencanta kun "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|omna pagini liganta ad "$1"]])',
-'searchsubtitleinvalid' => "Vu serchis '''$1'''",
-'titlematches' => 'Koincidi de titulo di artiklo',
-'notitlematches' => 'No esas koincidi en la tituli dil artikli',
-'textmatches' => 'Koincidi de texto di artiklo',
-'notextmatches' => 'Nula paginala texto fitas',
-'prevn' => 'antea {{PLURAL:$1|$1}}',
-'nextn' => 'sequanta {{PLURAL:$1|$1}}',
-'viewprevnext' => 'Vidar ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-new' => "'''Kreez la pagino \"[[:\$1]]\" in ca wiki!'''",
-'searchhelp-url' => 'Help:Helpo',
-'searchprofile-articles' => 'Artikli',
-'searchprofile-project' => 'Helpo',
-'searchprofile-images' => "''Media''",
-'searchprofile-everything' => 'Omno',
-'search-result-size' => '$1 ({{PLURAL:$2|1 vorto|$2 vorti}})',
-'search-result-score' => 'Importo: $1%',
-'search-redirect' => '(ridirektilo $1)',
-'search-section' => '(seciono $1)',
-'search-suggest' => 'Ka vu volis dicar: $1',
-'search-interwiki-caption' => 'Altra projekti',
-'search-interwiki-default' => 'Rezultaji di $1:',
-'search-interwiki-more' => '(plusa)',
-'search-mwsuggest-enabled' => 'kun sugestaji',
-'search-mwsuggest-disabled' => 'sen sugestaji',
-'searchall' => 'omna',
-'showingresults' => "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
-'showingresultsnum' => "Montrante infre {{PLURAL:$3|'''1''' rezulto|'''$3''' rezulti}}, qui komencas kun numero #'''$2'''.",
-'nonefound' => "'''Atencez''': Nespecigite, nur ula nomari esas serchata.
+'searchresults' => 'Rezultaji dil sercho',
+'searchresults-title' => 'Sercho-rezultaji por "$1"',
+'searchresulttext' => 'Por plusa informo pri quale serchar en {{SITENAME}}, videz [[{{MediaWiki:Helppage}}|help]].',
+'searchsubtitle' => 'Vu serchis \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|omna pagini komencanta kun "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|omna pagini liganta ad "$1"]])',
+'searchsubtitleinvalid' => "Vu serchis '''$1'''",
+'titlematches' => 'Koincidi de titulo di artiklo',
+'notitlematches' => 'No esas koincidi en la tituli dil artikli',
+'textmatches' => 'Koincidi de texto di artiklo',
+'notextmatches' => 'Nula paginala texto fitas',
+'prevn' => 'antea {{PLURAL:$1|$1}}',
+'nextn' => 'sequanta {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Vidar ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-new' => "'''Kreez la pagino \"[[:\$1]]\" in ca wiki!'''",
+'searchhelp-url' => 'Help:Helpo',
+'searchprofile-articles' => 'Temala pagini',
+'searchprofile-project' => 'Helpo',
+'searchprofile-images' => "''Media''",
+'searchprofile-everything' => 'Omno',
+'searchprofile-articles-tooltip' => 'Serchez en $1',
+'searchprofile-project-tooltip' => 'Serchez en $1',
+'searchprofile-images-tooltip' => 'Serchez arkivi',
+'search-result-size' => '$1 ({{PLURAL:$2|1 vorto|$2 vorti}})',
+'search-result-score' => 'Importo: $1%',
+'search-redirect' => '(ridirektilo $1)',
+'search-section' => '(seciono $1)',
+'search-suggest' => 'Ka vu volis dicar: $1',
+'search-interwiki-caption' => 'Altra projekti',
+'search-interwiki-default' => 'Rezultaji di $1:',
+'search-interwiki-more' => '(plusa)',
+'search-mwsuggest-enabled' => 'kun sugestaji',
+'search-mwsuggest-disabled' => 'sen sugestaji',
+'searchall' => 'omna',
+'showingresults' => "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
+'showingresultsnum' => "Montrante infre {{PLURAL:$3|'''1''' rezulto|'''$3''' rezulti}}, qui komencas kun numero #'''$2'''.",
+'nonefound' => "'''Atencez''': Nespecigite, nur ula nomari esas serchata.
Probez prefixizar vua demando kun ''all:'' por serchar omna kontenajo (inkluzanta debato-pagini, shabloni, edc.), od uzar la dezirata nomaro kom prefixo.",
-'powersearch' => 'Avancita sercho',
-'powersearch-legend' => 'Avancita sercho',
-'powersearch-ns' => 'Serchez en nomari:',
-'powersearch-redir' => 'Listar ridirekti',
-'powersearch-field' => 'Serchar',
-'powersearch-toggleall' => 'Omna',
-'powersearch-togglenone' => 'Nula',
-'search-external' => 'Extera sercho',
-'searchdisabled' => 'La sercho en la kompleta texto desaktivigesis temporale pro superkargo dil servanto. Ni esperas riaktivigar ol pos facar ula proxima aktualigi. Dum ica tempo, vu povas serchar per Google.',
+'powersearch' => 'Avancita sercho',
+'powersearch-legend' => 'Avancita sercho',
+'powersearch-ns' => 'Serchez en nomari:',
+'powersearch-redir' => 'Listar ridirekti',
+'powersearch-field' => 'Serchar',
+'powersearch-toggleall' => 'Omna',
+'powersearch-togglenone' => 'Nula',
+'search-external' => 'Extera sercho',
+'searchdisabled' => 'La sercho en la kompleta texto desaktivigesis temporale pro superkargo dil servanto. Ni esperas riaktivigar ol pos facar ula proxima aktualigi. Dum ica tempo, vu povas serchar per Google.',
# Quickbar
'qbsettings' => 'Preferaji pri "Quickbar"',
@@ -834,35 +829,33 @@ Ol mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.',
'action-browsearchive' => 'serchar pagini efacita',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|chanjo|chanji}}',
-'recentchanges' => 'Recenta chanji',
-'recentchanges-legend' => 'Recenta chanji preferaji',
-'recentchangestext' => 'Regardez la maxim recenta chanji en Wiki per ica pagino.',
-'recentchanges-legend-newpage' => '$1 - nova pagino',
-'recentchanges-label-newpage' => 'Ca redaktajo kreis nova pagino',
-'recentchanges-legend-minor' => '$1 - mikra redaktajo',
-'recentchanges-label-minor' => 'Ica es mikra redaktajo',
-'recentchanges-legend-bot' => '$1 - redakto da roboto',
-'rcnote' => "Infre esas la lasta {{PLURAL:$1|'''1''' chanjo|'''$1''' chanji}} dum la lasta {{PLURAL:$2|dio|'''$2''' dii}} ye $5, $4.",
-'rcnotefrom' => "Infre esas la lasta chanji depos '''$2''' (montrita til '''$1''').",
-'rclistfrom' => 'Montrar nova chanji startante de $1',
-'rcshowhideminor' => '$1 mikra redakti',
-'rcshowhidebots' => '$1 roboti',
-'rcshowhideliu' => '$1 enirinta uzanti',
-'rcshowhideanons' => '$1 anonima uzanti',
-'rcshowhidemine' => '$1 mea redakti',
-'rclinks' => 'Montrar la lasta $1 chanji dum la lasta $2 dii<br />$3',
-'diff' => 'dif',
-'hist' => 'vers',
-'hide' => 'Celar',
-'show' => 'Montrar',
-'minoreditletter' => 'm',
-'newpageletter' => 'N',
-'boteditletter' => 'r',
-'rc_categories_any' => 'Ula',
-'newsectionsummary' => '/* $1 */ nova seciono',
-'rc-enhanced-expand' => 'Montrar detali (JavaScript bezonesas)',
-'rc-enhanced-hide' => 'Celar detali',
+'nchanges' => '$1 {{PLURAL:$1|chanjo|chanji}}',
+'recentchanges' => 'Recenta chanji',
+'recentchanges-legend' => 'Recenta chanji preferaji',
+'recentchangestext' => 'Regardez la maxim recenta chanji en Wiki per ica pagino.',
+'recentchanges-label-newpage' => 'Ca redaktajo kreis nova pagino',
+'recentchanges-label-minor' => 'Ica es mikra redaktajo',
+'recentchanges-label-bot' => 'Ta chanjo facita da bot',
+'rcnote' => "Infre esas la lasta {{PLURAL:$1|'''1''' chanjo|'''$1''' chanji}} dum la lasta {{PLURAL:$2|dio|'''$2''' dii}} ye $5, $4.",
+'rcnotefrom' => "Infre esas la lasta chanji depos '''$2''' (montrita til '''$1''').",
+'rclistfrom' => 'Montrar nova chanji startante de $1',
+'rcshowhideminor' => '$1 mikra redakti',
+'rcshowhidebots' => '$1 roboti',
+'rcshowhideliu' => '$1 enirinta uzanti',
+'rcshowhideanons' => '$1 anonima uzanti',
+'rcshowhidemine' => '$1 mea redakti',
+'rclinks' => 'Montrar la lasta $1 chanji dum la lasta $2 dii<br />$3',
+'diff' => 'dif',
+'hist' => 'vers',
+'hide' => 'Celar',
+'show' => 'Montrar',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'r',
+'rc_categories_any' => 'Ula',
+'newsectionsummary' => '/* $1 */ nova seciono',
+'rc-enhanced-expand' => 'Montrar detali (JavaScript bezonesas)',
+'rc-enhanced-hide' => 'Celar detali',
# Recent changes linked
'recentchangeslinked' => 'Relatanta chanji',
@@ -875,33 +868,35 @@ Pagini en [[Special:Watchlist|vua surveryo-listo]] esas '''dika'''.",
'recentchangeslinked-to' => 'Montrez chanji a pagini ligita a la specigita pagino vice',
# Upload
-'upload' => 'Adkargar arkivo',
-'uploadbtn' => 'Adkargar arkivo',
-'reuploaddesc' => 'Retrovenar al adkargo-formularo.',
-'uploadnologin' => 'Vu ne eniris',
-'uploadnologintext' => 'Vu mustas [[Special:UserLogin|enirir]] por adkargar arkivi.',
-'uploaderror' => 'Eroro dum adkargo',
-'uploadlog' => 'adkargo-registraro',
-'uploadlogpage' => 'Adkargo-registraro',
-'uploadlogpagetext' => 'Infre esas listo di la plu recenta adkargaji.
+'upload' => 'Adkargar arkivo',
+'uploadbtn' => 'Adkargar arkivo',
+'reuploaddesc' => 'Retrovenar al adkargo-formularo.',
+'uploadnologin' => 'Vu ne eniris',
+'uploadnologintext' => 'Vu mustas [[Special:UserLogin|enirir]] por adkargar arkivi.',
+'uploaderror' => 'Eroro dum adkargo',
+'uploadlog' => 'adkargo-registraro',
+'uploadlogpage' => 'Adkargo-registraro',
+'uploadlogpagetext' => 'Infre esas listo di la plu recenta adkargaji.
Videz rezumo plu vidala en la [[Special:NewFiles|galerio di nova arkivi]].',
-'filename' => 'Arkivo-nomo',
-'filedesc' => 'Titulo',
-'fileuploadsummary' => 'Rezumo:',
-'filestatus' => 'Stando di kopiyuro:',
-'filesource' => 'Fonto:',
-'uploadedfiles' => 'Adkargita arkivi',
-'ignorewarning' => 'Ignorar la averto e gardar la arkivo irgakaze.',
-'badfilename' => 'La imajo-nomo chanjesis a "$1".',
-'fileexists' => "Arkivo kun ica nomo ja existas.
+'filename' => 'Arkivo-nomo',
+'filedesc' => 'Titulo',
+'fileuploadsummary' => 'Rezumo:',
+'filestatus' => 'Stando di kopiyuro:',
+'filesource' => 'Fonto:',
+'uploadedfiles' => 'Adkargita arkivi',
+'ignorewarning' => 'Ignorar la averto e gardar la arkivo irgakaze.',
+'badfilename' => 'La imajo-nomo chanjesis a "$1".',
+'fileexists' => "Arkivo kun ica nomo ja existas.
Volutez kontrolar '''<tt>[[:$1]]</tt>''' se vu ne esas certa pri chanjar olu.
[[$1|thumb]]",
-'successfulupload' => 'Adcharjo sucesoza',
-'uploadwarning' => 'Averto pri la adkargo di arkivo',
-'savefile' => 'Registragar arkivo',
-'uploadedimage' => 'adkargita "[[$1]]"',
-'uploaddisabled' => 'Pardonez, la adkargo esas desaktiva.',
-'watchthisupload' => 'Surveyar ica arkivo',
+'uploadwarning' => 'Averto pri la adkargo di arkivo',
+'savefile' => 'Registragar arkivo',
+'uploadedimage' => 'adkargita "[[$1]]"',
+'uploaddisabled' => 'Pardonez, la adkargo esas desaktiva.',
+'watchthisupload' => 'Surveyar ica arkivo',
+'upload-success-subj' => 'Adcharjo sucesoza',
+
+'license-header' => 'Licencizo',
# Special:ListFiles
'imgfile' => 'arkivo',
@@ -1088,7 +1083,6 @@ Volutez kontrolar '''<tt>[[:$1]]</tt>''' se vu ne esas certa pri chanjar olu.
# Watchlist
'watchlist' => 'Mea surveyaji',
'mywatchlist' => 'Mea surveyaji',
-'watchlistfor' => "(por '''$1''')",
'nowatchlist' => 'Vu ne havas objekti en vua listo di surveyaji.',
'watchnologin' => 'Vu ne startis sesiono',
'watchnologintext' => 'Vu mustas [[Special:UserLogin|enirir]] por modifikar vua surveyaji.',
@@ -1198,6 +1192,7 @@ restauris ad lasta versiono da $2.',
'undeleterevisions' => '$1 {{PLURAL:$1|revizo|revizi}} konservita',
'undeletebtn' => 'Restaurar',
'undeletelink' => 'vidar/restaurar',
+'undeleteviewlink' => 'videz',
'undeletecomment' => 'Komento:',
'undeletedarticle' => 'restaurita "[[$1]]"',
'undelete-search-box' => 'Serchez efacita pagini',
@@ -1425,6 +1420,7 @@ Voluntez vizitar [http://www.mediawiki.org/wiki/Localisation MediaWiki Lokizado]
'tooltip-rollback' => '"Retrorular" desfacas omna chanji ad ca pagino da la lasta kontributanto per un kliko',
'tooltip-undo' => '"Desfacez" nuligas ca versiono e apertas la redakto-pagino en prevido-modo.
Vu darfos adjuntar kauso en la rezumo.',
+'tooltip-summary' => 'Skribez kurta rezumo',
# Metadata
'notacceptable' => 'La servanto di {{SITENAME}} ne povas provizar datumi en formato quan vua kliento povas komprenar.',
@@ -1452,6 +1448,7 @@ Vu darfos adjuntar kauso en la rezumo.',
# Patrol log
'patrol-log-auto' => '(automata)',
+'patrol-log-diff' => 'revizado $1',
# Browsing diffs
'previousdiff' => '↠Plu anciena versiono',
@@ -1509,6 +1506,9 @@ Vu darfos adjuntar kauso en la rezumo.',
'exif-gpsspeed-k' => 'Kilometri per horo',
'exif-gpsspeed-m' => 'Milii per horo',
+# External editor support
+'edit-externally' => 'Chanjez ta arkivo per externa programo',
+
# 'all' in various places, this might be different for inflected languages
'recentchangesall' => 'omna',
'imagelistall' => 'omna',
diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php
index 8721d4ac..c063804d 100644
--- a/languages/messages/MessagesIs.php
+++ b/languages/messages/MessagesIs.php
@@ -212,7 +212,7 @@ $specialPageAliases = array(
'Invalidateemail' => array( 'Rangt netfang' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkPrefixExtension = true;
$linkTrail = '/^([áðéíóúýþæöa-z-–]+)(.*)$/sDu';
@@ -232,8 +232,7 @@ $messages = array(
'tog-editsection' => 'Virkja hlutabreytingu með [breyta] tenglum',
'tog-editsectiononrightclick' => 'Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir (JavaScript)',
'tog-showtoc' => 'Sýna efnisyfirlit (fyrir síður með meira en 3 fyrirsagnir)',
-'tog-rememberpassword' => 'Munda innskráninguna mína á þessari tölvu',
-'tog-editwidth' => 'Breytingarkassi hefur fulla breidd',
+'tog-rememberpassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
'tog-watchcreations' => 'Bæta síðum sem ég bý til á vaktlistann minn',
'tog-watchdefault' => 'Bæta síðum sem ég breyti á vaktlistann minn',
'tog-watchmoves' => 'Bæta síðum sem ég færi á vaktlistann minn',
@@ -376,31 +375,20 @@ $messages = array(
'faqpage' => 'Project:Algengar spurningar',
# Vector skin
-'vector-action-addsection' => 'Bæta við umræðu',
-'vector-action-delete' => 'Eyða',
-'vector-action-move' => 'Færa',
-'vector-action-protect' => 'Vernda',
-'vector-action-undelete' => 'Hætta við eyðingu',
-'vector-action-unprotect' => 'Afvernda',
-'vector-namespace-category' => 'Flokkur',
-'vector-namespace-help' => 'Hjálparsíða',
-'vector-namespace-image' => 'Skrá',
-'vector-namespace-main' => 'Síða',
-'vector-namespace-media' => 'Margmiðlunarsíða',
-'vector-namespace-mediawiki' => 'Melding',
-'vector-namespace-project' => 'Verkefnissíða',
-'vector-namespace-special' => 'Kerfissíða',
-'vector-namespace-talk' => 'Umræða',
-'vector-namespace-template' => 'Snið',
-'vector-namespace-user' => 'Notandasíða',
-'vector-view-create' => 'Skapa',
-'vector-view-edit' => 'Breyta',
-'vector-view-history' => 'Breytingaskrá',
-'vector-view-view' => 'Lesa',
-'vector-view-viewsource' => 'Sýna frumkóða',
-'actions' => 'Aðgerðir',
-'namespaces' => 'Nafnrými',
-'variants' => 'Útgáfur',
+'vector-action-addsection' => 'Bæta við umræðu',
+'vector-action-delete' => 'Eyða',
+'vector-action-move' => 'Færa',
+'vector-action-protect' => 'Vernda',
+'vector-action-undelete' => 'Hætta við eyðingu',
+'vector-action-unprotect' => 'Afvernda',
+'vector-view-create' => 'Skapa',
+'vector-view-edit' => 'Breyta',
+'vector-view-history' => 'Breytingaskrá',
+'vector-view-view' => 'Lesa',
+'vector-view-viewsource' => 'Sýna frumkóða',
+'actions' => 'Aðgerðir',
+'namespaces' => 'Nafnrými',
+'variants' => 'Útgáfur',
'errorpagetitle' => 'Villa',
'returnto' => 'Aftur á: $1.',
@@ -616,7 +604,7 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}}-stillingunum]] þínum
'yourname' => 'Notandanafn:',
'yourpassword' => 'Lykilorð:',
'yourpasswordagain' => 'Endurrita lykilorð:',
-'remembermypassword' => 'Muna innskráningu mína á þessari tölvu',
+'remembermypassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
'yourdomainname' => 'Þitt lén:',
'login' => 'Innskrá',
'nav-login-createaccount' => 'Innskrá / Búa til aðgang',
@@ -654,6 +642,7 @@ Athugaðu hvort um innsláttavillu er að ræða eða [[Special:UserLogin/signup
'wrongpasswordempty' => 'Lykilorðsreiturinn var auður. Vinsamlegast reyndu aftur.',
'passwordtooshort' => 'Lykilorð skal vera að minnsta kosti {{plural: $1 |einn stafur|$1 stafir}}.',
'password-name-match' => 'Þarf að lykilorð þitt sé öðruvísi notandanafni þínu',
+'password-login-forbidden' => 'Notkun þessa notendanafns og lykilorðs er ekki leyfileg.',
'mailmypassword' => 'Senda nýtt lykilorð með tölvupósti',
'passwordremindertitle' => 'Nýtt tímabundið aðgangsorð fyrir {{SITENAME}}',
'passwordremindertext' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt
@@ -837,9 +826,6 @@ Vinsamlegast reyndu aftur síðar. Ef það virkar ekki heldur skaltu reyna að
Ef þú vilt ekki að textanum verði breytt skaltu ekki senda hann inn hér.<br />
Þú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).
'''EKKI SENDA INN HÖFUNDARRÉTTARVARIà EFNI ÃN LEYFIS RÉTTHAFA!'''",
-'longpagewarning' => "'''VIÃVÖRUN: Þessi síða er $1 kílóbæta löng; sumir
-vafrar gætu átt erfitt með að gera breytingar á síðum sem nálgast eða eru lengri en 32 kb.
-Vinsamlegast íhugaðu að skipta síðunni niður í smærri einingar.'''",
'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er $1 kílóbæti að lengd, en hámarkið er $2 kílóbæti. Ekki er hægt að vista textann.'''",
'readonlywarning' => "'''AÃVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.
Þú kannt að vilja að klippa og líma textann í textaskjal og vista hann fyrir síðar.'''
@@ -1243,14 +1229,9 @@ Ef þú kýst að gefa það upp, verður það notað til að gefa þér heiðu
'recentchanges-legend' => 'Stillingar nýlegra breytinga',
'recentchangestext' => 'Hér geturðu fylgst með nýjustu breytingunum.',
'recentchanges-feed-description' => 'Hér er hægt að fylgjast með nýlegum breytingum á {{SITENAME}}.',
-'recentchanges-label-legend' => 'Skýring: $1.',
-'recentchanges-legend-newpage' => '$1 - ný síða',
'recentchanges-label-newpage' => 'Þessi breyting skapaði nýja síðu',
-'recentchanges-legend-minor' => '$1 - smá breyting',
'recentchanges-label-minor' => 'Þetta er minniháttar breyting',
-'recentchanges-legend-bot' => '$1 - breyting vélmennis',
'recentchanges-label-bot' => 'Þessi breytingar var gerð af vélmenni',
-'recentchanges-legend-unpatrolled' => '$1 - breyting án eftirlits',
'recentchanges-label-unpatrolled' => 'Þessi breyting hefur ekki verið yfirfarin',
'rcnote' => "Að neðan {{PLURAL:$1|er '''1''' breyting|eru síðustu '''$1''' breytingar}} síðast {{PLURAL:$2|liðinn dag|liðna '''$2''' daga}}, frá $5, $4.",
'rcnotefrom' => "Að neðan eru breytingar síðan '''$2''' (allt að '''$1''' sýndar).",
@@ -1330,7 +1311,6 @@ Gjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.',
'large-file' => 'Það er mælt með að skrár séu ekki stærri en $1; þessi skrá er $2.',
'fileexists' => "Skrá með þessu nafni er þegar til, skoðaðu '''<tt>[[:$1]]</tt>''' ef þú ert óviss um hvort þú viljir breyta henni, ekki verður skrifað yfir gömlu skránna hlaðiru inn nýrri með sama nafni heldur verður núverandi útgáfa geymd í útgáfusögu.
[[$1|thumb]]",
-'successfulupload' => 'Innhlaðning tókst',
'uploadwarning' => 'Aðvörun',
'savefile' => 'Vista',
'uploadedimage' => 'hlóð inn „[[$1]]“',
@@ -1342,6 +1322,7 @@ Gjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.',
'upload-maxfilesize' => 'Hámarks skráarstærð: $1',
'watchthisupload' => 'Vakta þessa skrá',
'filewasdeleted' => 'Skrá af sama nafni hefur áður verið hlaðið inn og síðan eytt. Þú ættir að athuga $1 áður en þú hleður skránni inn.',
+'upload-success-subj' => 'Innhlaðning tókst',
'upload-proto-error' => 'Vitlaus samskiptaregla',
'upload-file-error' => 'Innri villa',
@@ -1455,7 +1436,6 @@ Hér fyrir neðan er afrit af [$2 skráarsíðunni þar].',
'statistics-edits-average' => 'Meðal breytingafjöldi á síðu',
'statistics-views-total' => 'Uppflettingar alls',
'statistics-views-peredit' => 'Uppflettingar á hverja breytingu (meðaltal)',
-'statistics-jobqueue' => 'Lengd [http://www.mediawiki.org/wiki/Manual:Job_queue vinnuraðar]',
'statistics-users' => 'Skráðir [[Special:ListUsers|notendur]]',
'statistics-users-active' => 'Virkir notendur',
'statistics-users-active-desc' => 'Notendur sem hafa framkvæmt aðgerð {{PLURAL:$1|síðastliðin dag|síðastliðna $1 daga}}',
@@ -1629,7 +1609,6 @@ Sjá einnig [[Special:WantedCategories|eftirsótta flokka]].',
# Watchlist
'watchlist' => 'Vaktlistinn',
'mywatchlist' => 'Vaktlistinn',
-'watchlistfor' => "(fyrir '''$1''')",
'nowatchlist' => 'Vaktlistinn er tómur.',
'watchlistanontext' => 'Vinsamlegast $1 til að skoða eða breyta vaktlistanum þínum.',
'watchnologin' => 'Óinnskráð(ur)',
@@ -1876,7 +1855,6 @@ Sjá [[Special:IPBlockList|bannaðar notendur og vistföng]] fyrir yfirlit yfir
'ipb-edit-dropdown' => 'Breyta ástæðu fyrir banni',
'ipb-unblock-addr' => 'Afbanna $1',
'ipb-unblock' => 'Afbanna notanda eða vistfang',
-'ipb-blocklist-addr' => 'Núverandi bönn fyrir $1',
'ipb-blocklist' => 'Sjá núverandi bönn',
'ipb-blocklist-contribs' => 'Framlög fyrir $1',
'unblockip' => 'Afbanna notanda',
@@ -2205,10 +2183,10 @@ Allir innflutningar eru skráð í [[Special:Log/import|innflutningsskránna]].'
'imagemaxsize' => 'Takmarka myndir á skráarlýsingasíðum við:',
'thumbsize' => 'Stærð smámynda:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|síða|síður}}',
-'file-info' => '(stærð skráar: $1, MIME-tegund: $2)',
-'file-info-size' => '($1 × $2 dílar, stærð skráar: $3, MIME-gerð: $4)',
+'file-info' => 'stærð skráar: $1, MIME-tegund: $2',
+'file-info-size' => '$1 × $2 dílar, stærð skráar: $3, MIME-gerð: $4',
'file-nohires' => '<small>Það er engin hærri upplausn til.</small>',
-'svg-long-desc' => '(SVG-skrá, að nafni til $1 × $2 dílar, skráarstærð: $3)',
+'svg-long-desc' => 'SVG-skrá, að nafni til $1 × $2 dílar, skráarstærð: $3',
'show-big-image' => 'Mesta upplausn',
'show-big-image-thumb' => '<small>Myndin er í upplausninni $1 × $2 </small>',
diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php
index 162e1103..76e67a13 100644
--- a/languages/messages/MessagesIt.php
+++ b/languages/messages/MessagesIt.php
@@ -11,6 +11,7 @@
* @author Airon90
* @author Andria
* @author Beta16
+ * @author Blaisorblade
* @author Broc
* @author BrokenArrow
* @author Brownout
@@ -24,6 +25,7 @@
* @author Felis
* @author FollowTheMedia
* @author Gianfranco
+ * @author HalphaZ
* @author Klutzy
* @author Marco 27
* @author Martorell
@@ -33,9 +35,11 @@
* @author Nemo bis
* @author Nick1915
* @author Od1n
+ * @author Oile11
* @author Omnipaedista
* @author PaoloRomano
* @author Pietrodn
+ * @author Pinodd
* @author Ramac
* @author Remember the dot
* @author S.Örvarr.S
@@ -44,6 +48,7 @@
* @author Tonyfroio
* @author Trixt
* @author Una giornata uggiosa '94
+ * @author Vajotwo
* @author Xpensive
* @author לערי ריינה×רט
*/
@@ -72,7 +77,7 @@ $namespaceAliases = array(
'Discussioni_immagine' => NS_FILE_TALK,
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$dateFormats = array(
'mdy time' => 'H:i',
@@ -110,7 +115,7 @@ $specialPageAliases = array(
'Uncategorizedcategories' => array( 'CategorieSenzaCategorie' ),
'Uncategorizedimages' => array( 'ImmaginiSenzaCategorie' ),
'Uncategorizedtemplates' => array( 'TemplateSenzaCategorie' ),
- 'Unusedcategories' => array( 'CategorieNonUsate' ),
+ 'Unusedcategories' => array( 'CategorieNonUsate', 'CategorieVuote' ),
'Unusedimages' => array( 'ImmaginiNonUsate' ),
'Wantedpages' => array( 'PagineRichieste' ),
'Wantedcategories' => array( 'CategorieRichieste' ),
@@ -132,7 +137,8 @@ $specialPageAliases = array(
'Protectedtitles' => array( 'TitoliProtetti' ),
'Allpages' => array( 'TutteLePagine' ),
'Prefixindex' => array( 'Prefissi' ),
- 'Ipblocklist' => array( 'IPBloccati', 'ElencoBlocchi' ),
+ 'Ipblocklist' => array( 'IPBloccati', 'ElencoBlocchi', 'Blocchi' ),
+ 'Unblock' => array( 'ElencoSblocchi', 'Sblocchi' ),
'Specialpages' => array( 'PagineSpeciali' ),
'Contributions' => array( 'Contributi', 'ContributiUtente' ),
'Emailuser' => array( 'InviaEMail' ),
@@ -160,10 +166,10 @@ $specialPageAliases = array(
'Revisiondelete' => array( 'CancellaRevisione' ),
'Unusedtemplates' => array( 'TemplateNonUsati' ),
'Randomredirect' => array( 'RedirectCasuale' ),
- 'Mypage' => array( 'MiaPaginaUtente' ),
+ 'Mypage' => array( 'MiaPaginaUtente', 'MiaPagina' ),
'Mytalk' => array( 'MieDiscussioni' ),
'Mycontributions' => array( 'MieiContributi' ),
- 'Listadmins' => array( 'Amministratori', 'ElencoAmministratori' ),
+ 'Listadmins' => array( 'Amministratori', 'ElencoAmministratori', 'Admin' ),
'Listbots' => array( 'Bot', 'ElencoBot' ),
'Popularpages' => array( 'PaginePiùVisitate' ),
'Search' => array( 'Ricerca', 'Cerca' ),
@@ -177,6 +183,8 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'ContributiCancellati' ),
'Tags' => array( 'Etichette' ),
'Activeusers' => array( 'UtentiAttivi' ),
+ 'ComparePages' => array( 'ComparaPagine' ),
+ 'Badtitle' => array( 'TitoloErrato' ),
);
$magicWords = array(
@@ -228,7 +236,10 @@ $magicWords = array(
'language' => array( '0', '#LINGUA', '#LANGUAGE:' ),
'numberofadmins' => array( '1', 'NUMEROADMIN', 'NUMBEROFADMINS' ),
'special' => array( '0', 'speciale', 'special' ),
+ 'pagesincategory' => array( '1', 'PAGINEINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'DIMENSIONEPAGINA', 'PESOPAGINA', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDICE__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NOINDICE__', '__NOINDEX__' ),
'protectionlevel' => array( '1', 'LIVELLOPROTEZIONE', 'PROTECTIONLEVEL' ),
);
@@ -250,8 +261,7 @@ $messages = array(
'tog-editsection' => 'Modifica delle sezioni tramite il collegamento [modifica]',
'tog-editsectiononrightclick' => 'Modifica delle sezioni tramite clic destro sul titolo (richiede JavaScript)',
'tog-showtoc' => "Mostra l'indice per le pagine con più di 3 sezioni",
-'tog-rememberpassword' => 'Ricorda la password su questo computer (richiede di accettare i cookie)',
-'tog-editwidth' => 'Aumenta al massimo la larghezza della casella di modifica',
+'tog-rememberpassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
'tog-watchcreations' => 'Aggiungi le pagine create agli osservati speciali',
'tog-watchdefault' => 'Aggiungi le pagine modificate agli osservati speciali',
'tog-watchmoves' => 'Aggiungi le pagine spostate agli osservati speciali',
@@ -399,31 +409,21 @@ I seguenti collegamenti sono in lingua inglese:
'faqpage' => 'Project:Domande frequenti',
# Vector skin
-'vector-action-addsection' => 'Aggiungi discussione',
-'vector-action-delete' => 'Cancella',
-'vector-action-move' => 'Sposta',
-'vector-action-protect' => 'Proteggi',
-'vector-action-undelete' => 'Recupera',
-'vector-action-unprotect' => 'Sblocca',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Aiuto',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'File multimediale',
-'vector-namespace-mediawiki' => 'Messaggio',
-'vector-namespace-project' => 'Pagina di servizio',
-'vector-namespace-special' => 'Pagina speciale',
-'vector-namespace-talk' => 'Discussione',
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => 'Utente',
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Modifica',
-'vector-view-history' => 'Visualizza cronologia',
-'vector-view-view' => 'Leggi',
-'vector-view-viewsource' => 'Visualizza sorgente',
-'actions' => 'Azioni',
-'namespaces' => 'Namespace',
-'variants' => 'Varianti',
+'vector-action-addsection' => 'Aggiungi discussione',
+'vector-action-delete' => 'Cancella',
+'vector-action-move' => 'Sposta',
+'vector-action-protect' => 'Proteggi',
+'vector-action-undelete' => 'Recupera',
+'vector-action-unprotect' => 'Sblocca',
+'vector-simplesearch-preference' => 'Abilita i suggerimenti di ricerca avanzata (solo per la skin Vector)',
+'vector-view-create' => 'Crea',
+'vector-view-edit' => 'Modifica',
+'vector-view-history' => 'Visualizza cronologia',
+'vector-view-view' => 'Leggi',
+'vector-view-viewsource' => 'Visualizza sorgente',
+'actions' => 'Azioni',
+'namespaces' => 'Namespace',
+'variants' => 'Varianti',
'errorpagetitle' => 'Errore',
'returnto' => 'Torna a $1.',
@@ -484,6 +484,9 @@ Troppi utenti stanno tentando di visualizzare questa pagina.
Attendere qualche minuto prima di riprovare a caricare la pagina.
$1',
+'pool-timeout' => "Timeout durante l'attesa dello sblocco",
+'pool-queuefull' => 'La coda del pool è piena',
+'pool-errorunknown' => 'Errore sconosciuto',
# 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' => 'Informazioni su {{SITENAME}}',
@@ -647,7 +650,8 @@ L'account è stato creato correttamente. Non dimenticare di personalizzare le [[
'yourname' => 'Nome utente:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Ripeti la password:',
-'remembermypassword' => 'Ricorda la password su questo computer',
+'remembermypassword' => 'Ricorda la password su questo computer (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
+'securelogin-stick-https' => 'Resta connesso attraverso HTTPS dopo il login',
'yourdomainname' => 'Specificare il dominio',
'externaldberror' => 'Si è verificato un errore con il server di autenticazione esterno, oppure non si dispone delle autorizzazioni necessarie per aggiornare il proprio accesso esterno.',
'login' => 'Entra',
@@ -664,6 +668,7 @@ L'account è stato creato correttamente. Non dimenticare di personalizzare le [[
'gotaccount' => "Hai già un accesso? '''$1'''.",
'gotaccountlink' => 'Entra',
'createaccountmail' => 'via e-mail',
+'createaccountreason' => 'Motivo:',
'badretype' => 'Le password inserite non coincidono tra loro.',
'userexists' => 'Il nome utente inserito è già utilizzato.
Scegliere un nome utente diverso.',
@@ -682,6 +687,7 @@ Scegliere un nome utente diverso.',
'wrongpasswordempty' => 'Non è stata inserita alcuna password. Riprovare.',
'passwordtooshort' => 'Le password devono contenere almeno {{PLURAL:$1|1 carattere|$1 caratteri}}.',
'password-name-match' => 'La password deve essere diversa dal nome utente.',
+'password-login-forbidden' => "L'uso di questo nome utente e password è stato proibito.",
'mailmypassword' => 'Invia una nuova password al mio indirizzo e-mail',
'passwordremindertitle' => 'Servizio Password Reminder di {{SITENAME}}',
'passwordremindertext' => 'Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l\'invio di una nuova password di accesso a {{SITENAME}} ($4).
@@ -719,6 +725,9 @@ Riprovare più tardi.',
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => 'La tua richiesta di disconnessione è stata negata perché sembra inviata da un browser non funzionante o un proxy di caching.',
+# E-mail sending
+'php-mail-error-unknown' => 'Errore sconosciuto nella funzione PHP mail()',
+
# Password reset dialog
'resetpass' => 'Cambia la password',
'resetpass_announce' => "L'accesso è stato effettuato con un codice temporaneo, inviato via e-mail. Per completare l'accesso è necessario impostare una nuova password:",
@@ -770,9 +779,10 @@ La password potrebbe essere stata già cambiata, oppure potrebbe essere stata ri
'showlivepreview' => "Funzione ''Live preview''",
'showdiff' => 'Mostra cambiamenti',
'anoneditwarning' => "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato l'indirizzo IP.",
+'anonpreviewwarning' => "''Non hai eseguito il login. Salvando il tuo indirizzo IP sarà registrato nella cronologia di questa voce.''",
'missingsummary' => "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo '''Salva la pagina''' la modifica verrà salvata con l'oggetto vuoto.",
'missingcommenttext' => 'Inserire un commento qui sotto.',
-'missingcommentheader' => "'''Attenzione:''' Non è stata specificata l'intestazione di questo commento. Premendo di nuovo '''Salva la pagina''' la modifica verrà salvata senza intestazione.",
+'missingcommentheader' => "'''Attenzione:''' non è stata specificato l'oggetto/l'intestazione di questo commento. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza intestazione.",
'summary-preview' => "Anteprima dell'oggetto:",
'subject-preview' => 'Anteprima oggetto/intestazione:',
'blockedtitle' => 'Utente bloccato.',
@@ -838,7 +848,9 @@ L'ultimo elemento del registro dei blocchi è riportato di seguito per informazi
'userjsyoucanpreview' => "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo JavaScript prima di salvarlo.",
'usercsspreview' => "'''Questa è solo un'anteprima del proprio CSS personale. Le modifiche non sono ancora state salvate!'''",
'userjspreview' => "'''Questa è solo un'anteprima per provare il proprio JavaScript personale; le modifiche non sono ancora state salvate!'''",
-'userinvalidcssjstitle' => "'''Attenzione:''' Non esiste alcuna skin con nome \"\$1\". Si noti che le pagine per i .css e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/monobook.css e non {{ns:user}}:Esempio/Monobook.css.",
+'sitecsspreview' => "Questa è solo un'anteprima del CSS. Le modifiche non sono ancora state salvate!'''",
+'sitejspreview' => "Questa è solo un'anteprima per provare il JavaScript; le modifiche non sono ancora state salvate!'''",
+'userinvalidcssjstitle' => "'''Attenzione:''' Non esiste alcuna skin con nome \"\$1\". Si noti che le pagine per i .css e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/vector.css e non {{ns:user}}:Esempio/Vector.css.",
'updated' => '(Aggiornato)',
'note' => "'''NOTA:'''",
'previewnote' => "'''Questa è solo un'anteprima; le modifiche alla pagina NON sono ancora state salvate!'''",
@@ -873,7 +885,6 @@ Con l'invio del testo dichiari inoltre, sotto la tua responsabilità, che il tes
'copyrightwarning2' => "Nota: tutti i contributi inviati a {{SITENAME}} possono essere modificati, stravolti o cancellati da parte degli altri partecipanti. Se non desideri che i tuoi testi possano essere modificati senza alcun riguardo, non inviarli a questo sito.<br />
Con l'invio del testo dichiari inoltre, sotto la tua responsabilità, che il testo è stato scritto da te personalmente oppure che è stato copiato da una fonte di pubblico dominio o analogamente libera (vedi $1 per maggiori dettagli).
'''NON INVIARE MATERIALE COPERTO DA DIRITTO DI AUTORE SENZA AUTORIZZAZIONE!'''",
-'longpagewarning' => "'''ATTENZIONE: Questa pagina è lunga $1 kilobyte; alcuni browser potrebbero presentare dei problemi nella modifica di pagine che si avvicinano o superano i 32 KB. Valuta l'opportunità di suddividere la pagina in sezioni più piccole.'''",
'longpageerror' => "'''ERRORE: Il testo inviato è lungo $1 kilobyte, più della dimensione massima consentita ($2 kilobyte). Il testo non può essere salvato.'''",
'readonlywarning' => "'''ATTENZIONE: Il database è stato bloccato per manutenzione, è quindi impossibile salvare le modifiche in questo momento. Per non perderle, è possibile copiare quanto inserito finora nella casella di modifica, incollarlo in un programma di elaborazione testi e salvarlo in attesa dello sblocco del database.'''
@@ -1045,6 +1056,8 @@ $1",
'logdelete-failure' => "'''La visibilità dell'evento non può essere impostata:'''
$1",
'revdel-restore' => 'cambia la visibilità',
+'revdel-restore-deleted' => 'revisioni cancellate',
+'revdel-restore-visible' => 'revisioni visibili',
'pagehist' => 'Cronologia della pagina',
'deletedhist' => 'Cronologia cancellata',
'revdelete-content' => 'contenuto',
@@ -1107,11 +1120,13 @@ $1",
# Diffs
'history-title' => 'Cronologia delle modifiche di "$1"',
'difference' => '(Differenze fra le revisioni)',
+'difference-multipage' => '(Differenze fra le pagine)',
'lineno' => 'Riga $1:',
'compareselectedversions' => 'Confronta le versioni selezionate',
'showhideselectedversions' => 'Mostra/nascondi versioni selezionate',
'editundo' => 'annulla',
-'diff-multi' => '({{PLURAL:$1|Una revisione intermedia non mostrata|$1 revisioni intermedie non mostrate}}.)',
+'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non mostrate)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non mostrate)',
# Search results
'searchresults' => 'Risultati della ricerca',
@@ -1146,6 +1161,7 @@ $1",
'searchprofile-everything-tooltip' => 'Cerca ovunque (incluse le pagine di discussione)',
'searchprofile-advanced-tooltip' => 'Cerca nei namespace personalizzati',
'search-result-size' => '$1 ({{PLURAL:$2|una parola|$2 parole}})',
+'search-result-category-size' => '{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sottocategoria|$2 sottocategorie}}, {{PLURAL:$3|1 file|$3 files}})',
'search-result-score' => 'Rilevanza: $1%',
'search-redirect' => '(redirect $1)',
'search-section' => '(sezione $1)',
@@ -1220,6 +1236,7 @@ $1",
'contextlines' => 'Righe di testo per ciascun risultato:',
'contextchars' => 'Numero di caratteri di contesto:',
'stub-threshold' => 'Valore minimo per i <a href="#" class="stub">collegamenti agli stub</a>, in byte:',
+'stub-threshold-disabled' => 'Disattivato',
'recentchangesdays' => 'Numero di giorni da mostrare nelle ultime modifiche:',
'recentchangesdays-max' => '(massimo $1 {{PLURAL:$1|giorno|giorni}})',
'recentchangescount' => 'Numero di modifiche da mostrare per default:',
@@ -1251,6 +1268,7 @@ $1",
'prefs-files' => 'File',
'prefs-custom-css' => 'CSS personalizzato',
'prefs-custom-js' => 'JS personalizzato',
+'prefs-common-css-js' => 'CSS/JS condiviso per tutte le skin:',
'prefs-reset-intro' => "È possibile usare questa pagina per reimpostare le proprie preferenze a quelle predefinite del sito.
L'operazione non può essere annullata.",
'prefs-emailconfirm-label' => "Conferma dell'e-mail:",
@@ -1286,9 +1304,15 @@ L'operazione non può essere annullata.",
'prefs-advancedrendering' => 'Opzioni avanzate',
'prefs-advancedsearchoptions' => 'Opzioni avanzate',
'prefs-advancedwatchlist' => 'Opzioni avanzate',
-'prefs-display' => 'Opzioni di visualizzazione',
+'prefs-displayrc' => 'Opzioni di visualizzazione',
+'prefs-displaysearchoptions' => 'Opzioni di visualizzazione',
+'prefs-displaywatchlist' => 'Opzioni di visualizzazione',
'prefs-diffs' => 'Differenze',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "L'indirizzo e-mail sembra valido",
+'email-address-validity-invalid' => 'Inserisci un indirizzo e-mail valido',
+
# User rights
'userrights' => 'Gestione dei permessi relativi agli utenti',
'userrights-lookup-user' => 'Gestione dei gruppi utente',
@@ -1372,6 +1396,7 @@ L'operazione non può essere annullata.",
'right-hideuser' => 'Blocca un nome utente, nascondendolo al pubblico',
'right-ipblock-exempt' => 'Ignora i blocchi degli IP, i blocchi automatici e i blocchi di range di IP',
'right-proxyunbannable' => 'Scavalca i blocchi sui proxy',
+'right-unblockself' => 'Sblocca se stesso',
'right-protect' => 'Cambia i livelli di protezione',
'right-editprotected' => 'Modifica pagine protette',
'right-editinterface' => "Modifica l'interfaccia utente",
@@ -1394,7 +1419,6 @@ L'operazione non può essere annullata.",
'right-siteadmin' => 'Blocca e sblocca il database',
'right-reset-passwords' => 'Reimposta le password di altri utenti',
'right-override-export-depth' => 'Esporta le pagine includendo le pagine collegate fino ad una profondità di 5',
-'right-versiondetail' => 'Mostra le informazioni complete del software',
'right-sendemail' => 'Invia e-mail ad altri utenti',
# User rights log
@@ -1445,14 +1469,9 @@ L'operazione non può essere annullata.",
'recentchanges-legend' => 'Opzioni ultime modifiche',
'recentchangestext' => 'Questa pagina presenta le modifiche più recenti ai contenuti del sito.',
'recentchanges-feed-description' => 'Questo feed riporta le modifiche più recenti ai contenuti del sito.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nuova pagina',
'recentchanges-label-newpage' => 'Questa modifica ha creato una nuova pagina',
-'recentchanges-legend-minor' => '$1 - modifica minore',
'recentchanges-label-minor' => 'Questa è una modifica minore',
-'recentchanges-legend-bot' => '$1 - modifica bot',
'recentchanges-label-bot' => 'Questa modifica è stata effettuata da un bot',
-'recentchanges-legend-unpatrolled' => '$1 - modifica non verificata',
'recentchanges-label-unpatrolled' => 'Questa modifica non è stata ancora verificata',
'rcnote' => "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le '''$1''' modifiche più recenti apportate}} al sito {{PLURAL:$2|nelle ultime 24 ore|negli scorsi '''$2''' giorni}}; i dati sono aggiornati alle $5 del $4.",
'rcnotefrom' => "Di seguito sono elencate le modifiche apportate a partire da '''$2''' (fino a '''$1''').",
@@ -1499,6 +1518,8 @@ Le pagine contenute nella propria lista degli [[Special:Watchlist|Osservati spec
'upload_directory_missing' => 'La directory di upload ($1) non esiste e non può essere creata dal server web.',
'upload_directory_read_only' => 'Il server web non è in grado di scrivere nella directory di upload ($1).',
'uploaderror' => 'Errore nel caricamento',
+'upload-recreate-warning' => "'Attenzione'': un file con questo nome è stato cancellato o spostato.'''
+Ill log delle cancellazioni e degli spostamenti di questa pagina viene qui riportato per comodità:",
'uploadtext' => "Usare il modulo sottostante per caricare nuovi file. Per visualizzare o ricercare i file già caricati, consultare il [[Special:FileList|log dei file caricati]]. Caricamenti di file e di nuove versioni di file sono registrati nel [[Special:Log/upload|log degli upload]], le cancellazioni nell'[[Special:Log/delete|apposito]].
Per inserire un file all'interno di una pagina, fare un collegamento di questo tipo:
@@ -1530,6 +1551,17 @@ Consultare la [[Special:NewFiles|galleria dei nuovi file]] per una visione d'ins
'filetype-unwanted-type' => "Caricare file di tipo '''\".\$1\"''' è sconsigliato. {{PLURAL:\$3|Il tipo di file consigliato è|I tipi di file consigliati sono}} \$2.",
'filetype-banned-type' => "Caricare file di tipo '''\".\$1\"''' non è consentito. {{PLURAL:\$3|Il tipo di file consentito è|I tipi di file consentiti sono}} \$2.",
'filetype-missing' => 'Il file è privo di estensione (ad es. ".jpg").',
+'empty-file' => 'Il file che hai inviato è vuoto.',
+'file-too-large' => 'Il file che hai inviato è troppo grande.',
+'filename-tooshort' => 'Il nome del file è troppo breve.',
+'filetype-banned' => 'Questo tipo di file è vietato.',
+'verification-error' => 'Questo file non ha superato la verifica.',
+'hookaborted' => "La modifica che si è tentato di fare è stata interrotta da un hook di un'estensione.",
+'illegal-filename' => 'Il nome del file non è ammesso.',
+'overwrite' => 'Sovrascrivere un file esistente non è permesso.',
+'unknown-error' => 'Si è verificato un errore sconosciuto.',
+'tmp-create-error' => 'Impossibile creare il file temporaneo.',
+'tmp-write-error' => 'Errore di scrittura del file temporaneo.',
'large-file' => 'Si raccomanda di non superare le dimensioni di $1 per ciascun file; questo file è grande $2.',
'largefileserver' => 'Il file supera le dimensioni consentite dalla configurazione del server.',
'emptyfile' => 'Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.',
@@ -1551,13 +1583,14 @@ Se si dispone dell'immagine nella risoluzione originale, si prega di caricarla.
'fileexists-shared-forbidden' => "Un file con questo nome esiste già nell'archivio di risorse multimediali condivise. Se si desidera ancora caricare il file, tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Questo file è un duplicato {{PLURAL:$1|del seguente|dei seguenti}} file:',
'file-deleted-duplicate' => 'Un file identico a questo ([[:$1]]) è stato cancellato in passato. Verificare la cronologia delle cancellazioni prima di caricarlo di nuovo.',
-'successfulupload' => 'Caricamento completato',
'uploadwarning' => 'Avviso di caricamento',
'uploadwarning-text' => 'Per favore modifica qui sotto la descrizione del file e prova di nuovo.',
'savefile' => 'Salva file',
'uploadedimage' => 'ha caricato "[[$1]]"',
'overwroteimage' => 'ha caricato una nuova versione di "[[$1]]"',
'uploaddisabled' => 'Il caricamento dei file è temporaneamente sospeso.',
+'copyuploaddisabled' => 'Il caricamento tramite URL è disabilitato.',
+'uploadfromurl-queued' => 'Il caricamento è stato accodato.',
'uploaddisabledtext' => 'Il caricamento dei file non è attivo.',
'php-uploaddisabledtext' => 'Il caricamento di file tramite PHP è disabilitato. Controlla la configurazione di file_uploads.',
'uploadscripted' => 'Questo file contiene codice HTML o di script, che potrebbe essere interpretato erroneamente da un browser web.',
@@ -1590,6 +1623,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- lascia questa riga esattamente com\'è -->',
+'upload-success-subj' => 'Caricamento completato',
+'upload-success-msg' => "L'upload da [$2] è riuscito. Il file è disponibile qui: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => "Problema nell'upload",
+'upload-failure-msg' => 'Si è verificato un problema con il caricamento da [$2]:
+
+$1',
+'upload-warning-subj' => 'Avviso di caricamento',
+'upload-warning-msg' => "C'è stato un problema con il caricamento da [$2]. Si può tornare al [[Special:Upload/stash/$1|form di upload]] per correggere questo problema.",
'upload-proto-error' => 'Protocollo errato',
'upload-proto-error-text' => "Per l'upload remoto è necessario specificare URL che iniziano con <code>http://</code> oppure <code>ftp://</code>.",
@@ -1602,22 +1643,23 @@ PICT # misc.
'upload-http-error' => 'Si è verificato un errore HTTP: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'Accesso negato',
-'img-auth-nopathinfo' => 'PATH_INFO mancante.
+'img-auth-accessdenied' => 'Accesso negato',
+'img-auth-nopathinfo' => 'PATH_INFO mancante.
Il server non è impostato per passare questa informazione.
Potrebbe essere basato su CGI e non può supportare img_auth.
Consultare http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => 'Il percorso richiesto non si trova nella directory di upload configurata.',
-'img-auth-badtitle' => 'Impossibile costruire un titolo valido da "$1".',
-'img-auth-nologinnWL' => 'Non si è effettuato l\'accesso e "$1" non è nella whitelist.',
-'img-auth-nofile' => 'File "$1" non esiste.',
-'img-auth-isdir' => 'Si sta tentando di accedere a una directory "$1".
+'img-auth-notindir' => 'Il percorso richiesto non si trova nella directory di upload configurata.',
+'img-auth-badtitle' => 'Impossibile costruire un titolo valido da "$1".',
+'img-auth-nologinnWL' => 'Non si è effettuato l\'accesso e "$1" non è nella whitelist.',
+'img-auth-nofile' => 'File "$1" non esiste.',
+'img-auth-isdir' => 'Si sta tentando di accedere a una directory "$1".
Solo l\'accesso ai file è consentito.',
-'img-auth-streaming' => '"$1" in streaming.',
-'img-auth-public' => 'La funzione di img_auth.php è di dare in output file da un sito wiki privato.
+'img-auth-streaming' => '"$1" in streaming.',
+'img-auth-public' => 'La funzione di img_auth.php è di dare in output file da un sito wiki privato.
Questo sito è configurato come un wiki pubblico.
Per una sicurezza ottimale, img_auth.php è disattivato.',
-'img-auth-noread' => 'L\'utente non ha accesso alla lettura di "$1".',
+'img-auth-noread' => 'L\'utente non ha accesso alla lettura di "$1".',
+'img-auth-bad-query-string' => "L'URL contiene una stringa di query non valida.",
# HTTP errors
'http-invalid-url' => 'URL non valido: $1',
@@ -1649,6 +1691,7 @@ Per modificare l'ordinamento, fare clic sull'intestazione della colonna prescelt
'listfiles_search_for' => 'Ricerca immagini per nome:',
'imgfile' => 'file',
'listfiles' => 'Elenco dei file',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Utente',
@@ -1692,6 +1735,7 @@ Di seguito viene mostrata la descrizione presente nella [$2 pagina di descrizion
'uploadnewversion-linktext' => 'Carica una nuova versione di questo file',
'shared-repo-from' => 'da $1',
'shared-repo' => 'un archivio condiviso',
+'filepage.css' => '/* Il CSS qui posto viene incluso nella pagina di descrizione del file, inclusa anche su wiki client stranieri */',
# File reversion
'filerevert' => 'Ripristina $1',
@@ -1761,8 +1805,8 @@ Di seguito viene mostrata la descrizione presente nella [$2 pagina di descrizion
'statistics-edits' => "Modifiche a partire dall'installazione di {{SITENAME}}",
'statistics-edits-average' => 'Media delle modifiche per pagina',
'statistics-views-total' => 'Visualizzazioni totali',
+'statistics-views-total-desc' => 'Visualizzazioni di pagine inesistenti e pagine speciali non sono incluse',
'statistics-views-peredit' => 'Visualizzazioni per modifica',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Coda dei processi] da eseguire in background',
'statistics-users' => '[[Special:ListUsers|Utenti]] registrati',
'statistics-users-active' => 'Utenti attivi',
'statistics-users-active-desc' => "Utenti che hanno effettuato un'azione {{PLURAL:$1|nell'ultimo giorno|negli ultimi $1 giorni}}",
@@ -1775,7 +1819,7 @@ Di seguito viene mostrata la descrizione presente nella [$2 pagina di descrizion
'doubleredirects' => 'Redirect doppi',
'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
Ciascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione "corretta" alla quale dovrebbe puntare anche il primo redirect.
-I redirect <s>cancellati</s> sono stati corretti.',
+I redirect <del>cancellati</del> sono stati corretti.',
'double-redirect-fixed-move' => '[[$1]] è stata spostata automaticamente, ora è un redirect a [[$2]]',
'double-redirect-fixer' => 'Correttore di redirect',
@@ -1798,6 +1842,8 @@ I redirect <s>cancellati</s> sono stati corretti.',
'nmembers' => '$1 {{PLURAL:$1|elemento|elementi}}',
'nrevisions' => '$1 {{PLURAL:$1|revisione|revisioni}}',
'nviews' => '$1 {{PLURAL:$1|visita|visite}}',
+'nimagelinks' => 'Utilizzato su $1 {{PLURAL:$1|pagina|pagine}}',
+'ntransclusions' => 'tilizzato su $1 {{PLURAL:$1|pagina|pagine}}',
'specialpage-empty' => 'Questa pagina speciale è attualmente vuota.',
'lonelypages' => 'Pagine orfane',
'lonelypagestext' => 'Le pagine indicate di seguito sono prive di collegamenti provenienti da altre pagine di {{SITENAME}} e non sono incluse in nessuna pagina del sito.',
@@ -1955,33 +2001,40 @@ Potrebbero esserci [[{{MediaWiki:Listgrouprights-helppage}}|ulteriori informazio
'listgrouprights-removegroup-self-all' => 'Può rimuovere tutti i gruppi dal proprio account',
# E-mail user
-'mailnologin' => 'Nessun indirizzo cui inviare il messaggio',
-'mailnologintext' => 'Per inviare messaggi e-mail ad altri utenti è necessario [[Special:UserLogin|accedere al sito]] e aver registrato un indirizzo valido nelle proprie [[Special:Preferences|preferenze]].',
-'emailuser' => "Scrivi all'utente",
-'emailpage' => "Invia un messaggio e-mail all'utente",
-'emailpagetext' => 'Usare il modulo sottostante per inviare un messaggio e-mail all\'utente indicato. L\'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo "Da:" del messaggio per consentire al destinatario di rispondere direttamente.',
-'usermailererror' => "L'oggetto mail ha restituito l'errore:",
-'defemailsubject' => 'Messaggio da {{SITENAME}}',
-'noemailtitle' => 'Nessun indirizzo e-mail',
-'noemailtext' => 'Questo utente non ha indicato un indirizzo e-mail valido.',
-'nowikiemailtitle' => 'E-mail non permessa',
-'nowikiemailtext' => 'Questo utente ha scelto di non ricevere messaggi di posta elettronica dagli altri utenti.',
-'email-legend' => 'Invia un messaggio e-mail a un altro utente di {{SITENAME}}',
-'emailfrom' => 'Da:',
-'emailto' => 'A:',
-'emailsubject' => 'Oggetto:',
-'emailmessage' => 'Messaggio:',
-'emailsend' => 'Invia',
-'emailccme' => 'Invia in copia al mio indirizzo.',
-'emailccsubject' => 'Copia del messaggio inviato a $1: $2',
-'emailsent' => 'Messaggio inviato',
-'emailsenttext' => 'Il messaggio e-mail è stato inviato.',
-'emailuserfooter' => 'Questa e-mail è stata inviata da $1 a $2 attraverso la funzione "Invia un messaggio e-mail all\'utente" su {{SITENAME}}.',
+'mailnologin' => 'Nessun indirizzo cui inviare il messaggio',
+'mailnologintext' => 'Per inviare messaggi e-mail ad altri utenti è necessario [[Special:UserLogin|accedere al sito]] e aver registrato un indirizzo valido nelle proprie [[Special:Preferences|preferenze]].',
+'emailuser' => "Scrivi all'utente",
+'emailpage' => "Invia un messaggio e-mail all'utente",
+'emailpagetext' => 'Usare il modulo sottostante per inviare un messaggio e-mail all\'utente indicato. L\'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo "Da:" del messaggio per consentire al destinatario di rispondere direttamente.',
+'usermailererror' => "L'oggetto mail ha restituito l'errore:",
+'defemailsubject' => 'Messaggio da {{SITENAME}}',
+'usermaildisabled' => 'e-mail utente disabilitata',
+'usermaildisabledtext' => 'Non è possibile inviare e-mail ad altri utenti su questo wiki',
+'noemailtitle' => 'Nessun indirizzo e-mail',
+'noemailtext' => 'Questo utente non ha indicato un indirizzo e-mail valido.',
+'nowikiemailtitle' => 'E-mail non permessa',
+'nowikiemailtext' => 'Questo utente ha scelto di non ricevere messaggi di posta elettronica dagli altri utenti.',
+'email-legend' => 'Invia un messaggio e-mail a un altro utente di {{SITENAME}}',
+'emailfrom' => 'Da:',
+'emailto' => 'A:',
+'emailsubject' => 'Oggetto:',
+'emailmessage' => 'Messaggio:',
+'emailsend' => 'Invia',
+'emailccme' => 'Invia in copia al mio indirizzo.',
+'emailccsubject' => 'Copia del messaggio inviato a $1: $2',
+'emailsent' => 'Messaggio inviato',
+'emailsenttext' => 'Il messaggio e-mail è stato inviato.',
+'emailuserfooter' => 'Questa e-mail è stata inviata da $1 a $2 attraverso la funzione "Invia un messaggio e-mail all\'utente" su {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Messaggio di sistema',
+'usermessage-editor' => 'Messaggero di sistema',
+'usermessage-template' => 'MediaWiki:MessaggioUtente',
# Watchlist
'watchlist' => 'Osservati speciali',
'mywatchlist' => 'osservati speciali',
-'watchlistfor' => "(dell'utente '''$1''')",
+'watchlistfor2' => "Dell'utente $1 $2",
'nowatchlist' => 'La lista degli osservati speciali è vuota.',
'watchlistanontext' => "Per visualizzare e modificare l'elenco degli osservati speciali è necessario $1.",
'watchnologin' => 'Accesso non effettuato',
@@ -2041,14 +2094,17 @@ Non verranno inviate altre notifiche in caso di ulteriori cambiamenti, a meno ch
Il sistema di notifica di {{SITENAME}}, al tuo servizio
--
-Per modificare le impostazioni della lista degli osservati speciali, visita
-{{fullurl:Special:Watchlist/edit}}
+Per modificare le impostazioni delle notifiche via e-mail, visita
+{{fullurl:{{#special:Preferences}}}}
-Per cancellare la pagina della lista degli osservati speciali, visita
+Per modificare la lista degli osservati speciali, visita
+{{fullurl:{{#special:Watchlist}}/edit}}
+
+Per rimuovere la pagina dalla lista degli osservati speciali, visita
$UNWATCHURL
-Per dare il tuo feedback e ricevere ulteriore assistenza:
-{{fullurl:Help:Aiuto}}',
+Per commentare e ricevere aiuto:
+{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
'deletepage' => 'Cancella pagina',
@@ -2095,7 +2151,10 @@ La modifica più recente alla pagina è stata apportata da [[User:$3|$3]] ([[Use
'revertpage' => 'Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]',
'revertpage-nouser' => 'Annullate le modifiche di (nome utente rimosso), riportata alla versione precedente di [[User:$1|$1]]',
'rollback-success' => "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
-'sessionfailure' => "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
+
+# Edit tokens
+'sessionfailure-title' => 'Sessione fallita',
+'sessionfailure' => "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
# Protect
'protectlogpage' => 'Protezioni',
@@ -2220,18 +2279,21 @@ $1',
'month' => 'Dal mese (e precedenti):',
'year' => "Dall'anno (e precedenti):",
-'sp-contributions-newbies' => 'Mostra solo i contributi dei nuovi utenti',
-'sp-contributions-newbies-sub' => 'Per i nuovi utenti',
-'sp-contributions-newbies-title' => 'Contributi dei nuovi utenti',
-'sp-contributions-blocklog' => 'blocchi',
-'sp-contributions-deleted' => 'contributi utente cancellati',
-'sp-contributions-logs' => 'registri',
-'sp-contributions-talk' => 'discussione',
-'sp-contributions-userrights' => 'gestione dei permessi',
-'sp-contributions-blocked-notice' => "Questo utente è attualmente bloccato. L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
-'sp-contributions-search' => 'Ricerca contributi',
-'sp-contributions-username' => 'Indirizzo IP o nome utente:',
-'sp-contributions-submit' => 'Ricerca',
+'sp-contributions-newbies' => 'Mostra solo i contributi dei nuovi utenti',
+'sp-contributions-newbies-sub' => 'Per i nuovi utenti',
+'sp-contributions-newbies-title' => 'Contributi dei nuovi utenti',
+'sp-contributions-blocklog' => 'blocchi',
+'sp-contributions-deleted' => 'contributi utente cancellati',
+'sp-contributions-uploads' => 'caricamenti',
+'sp-contributions-logs' => 'registri',
+'sp-contributions-talk' => 'discussione',
+'sp-contributions-userrights' => 'gestione dei permessi',
+'sp-contributions-blocked-notice' => "Questo utente è attualmente bloccato. L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
+'sp-contributions-blocked-notice-anon' => "Questo indirizzo IP è attualmente bloccato. Di seguito è riportato l'ultimo elemento del registro dei blocchi:",
+'sp-contributions-search' => 'Ricerca contributi',
+'sp-contributions-username' => 'Indirizzo IP o nome utente:',
+'sp-contributions-toponly' => 'Mostra solo i contributi che sono le ultime revisioni per la pagina',
+'sp-contributions-submit' => 'Ricerca',
# What links here
'whatlinkshere' => 'Puntano qui',
@@ -2292,7 +2354,6 @@ Consultare la [[Special:IPBlockList|lista degli IP bloccati]] per vedere i blocc
'ipb-edit-dropdown' => 'Modifica i motivi per il blocco',
'ipb-unblock-addr' => 'Sblocca $1',
'ipb-unblock' => 'Sblocca un utente o un indirizzo IP',
-'ipb-blocklist-addr' => 'Blocchi attivi per $1',
'ipb-blocklist' => 'Elenca i blocchi attivi',
'ipb-blocklist-contribs' => 'Contributi di $1',
'unblockip' => "Sblocca l'utente",
@@ -2360,6 +2421,8 @@ L'utente $1 è già bloccato. Modificare le impostazioni?",
'sorbs_create_account_reason' => 'Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
'cant-block-while-blocked' => 'Non è possibile bloccare altri utenti mentre si è bloccati.',
'cant-see-hidden-user' => 'L\'utente che si sta tentando di bloccare è stato già bloccato e nascosto. Poiché non hai il permesso "hideuser", non è possibile visualizzare o modificare il blocco dell\'utente.',
+'ipbblocked' => 'Non puoi bloccare o sbloccare altri utenti, perché tu stesso sei bloccato',
+'ipbnounblockself' => 'Non puoi sbloccare te stesso',
# Developer tools
'lockdb' => 'Blocca il database',
@@ -2388,6 +2451,12 @@ Si noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuov
'''ATTENZIONE:'''
Un cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
+'movepagetext-noredirectfixer' => "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Controlla che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.
+
+Si noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia vuota o costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.
+
+'''ATTENZIONE:'''
+Un cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
'movepagetalktext' => "La corrispondente pagina di discussione, se esiste, sarà spostata automaticamente insieme alla pagina principale, '''tranne che nei seguenti casi''':
* lo spostamento della pagina è tra namespace diversi;
* in corrispondenza del nuovo titolo esiste già una pagina di discussione (non vuota);
@@ -2444,6 +2513,7 @@ La pagina specificata come destinazione "[[:$1]]" esiste già. Vuoi cancellarla
'immobile-source-page' => 'Questa pagina non può essere spostata.',
'immobile-target-page' => 'Non è possibile spostare sul titolo indicato.',
'imagenocrossnamespace' => 'Non è possibile spostare un file fuori dal relativo namespace.',
+'nonfile-cannot-move-to-file' => 'Non è possibile spostare un file fuori dal relativo namespace.',
'imagetypemismatch' => 'La nuova estensione del file non corrisponde al tipo dello stesso',
'imageinvalidfilename' => "Il nome dell'immagine non è valido",
'fix-double-redirects' => 'Aggiorna tutti i redirect che puntano al titolo originale',
@@ -2518,10 +2588,11 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'import-interwiki-namespace' => 'Namespace di destinazione:',
'import-upload-filename' => 'Nome file:',
'import-comment' => 'Oggetto:',
-'importtext' => 'Si prega di esportare il file dal sito wiki di origine con la funzione Special:Export, salvarlo sul proprio disco e poi caricarlo qui.',
+'importtext' => 'Si prega di esportare il file dal sito wiki di origine con la [[Special:Export|funzione di esportazione]], salvarlo sul proprio disco e poi caricarlo qui.',
'importstart' => 'Importazione delle pagine in corso...',
'import-revision-count' => '{{PLURAL:$1|una revisione importata|$1 revisioni importate}}',
'importnopages' => 'Nessuna pagina da importare.',
+'imported-log-entries' => 'Importat{{PLURAL:$1|o|i}} $1 {{PLURAL:$1|evento|eventi}} di log.',
'importfailed' => 'Importazione non riuscita: <nowiki>$1</nowiki>',
'importunknownsource' => "Tipo di origine sconosciuto per l'importazione",
'importcantopen' => 'Impossibile aprire il file di importazione',
@@ -2614,6 +2685,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'tooltip-upload' => 'Inizia il caricamento',
'tooltip-rollback' => '"Rollback" annulla le modifiche a questa pagina dell\'ultimo contributore con un solo clic.',
'tooltip-undo' => '"Annulla" permette di annullare questa modifica e apre il modulo di modifica in modalità di anteprima. Permette di inserire una motivazione nell\'oggetto della modifica.',
+'tooltip-preferences-save' => 'Salva le preferenze',
+'tooltip-summary' => 'Inserire una breve sintesi',
# Stylesheets
'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
@@ -2732,14 +2805,17 @@ $1',
'imagemaxsize' => "Dimensione massima delle immagini:<br />''(per le pagine di descrizione del file)''",
'thumbsize' => 'Grandezza delle miniature:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagina|pagine}}',
-'file-info' => '(dimensione del file: $1, tipo MIME: $2)',
-'file-info-size' => '($1 × $2 pixel, dimensione del file: $3, tipo MIME: $4)',
+'file-info' => 'dimensione del file: $1, tipo MIME: $2',
+'file-info-size' => '$1 × $2 pixel, dimensione del file: $3, tipo MIME: $4',
'file-nohires' => '<small>Non sono disponibili versioni a risoluzione più elevata.</small>',
-'svg-long-desc' => '(file in formato SVG, dimensioni nominali $1 × $2 pixel, dimensione del file: $3)',
+'svg-long-desc' => 'file in formato SVG, dimensioni nominali $1 × $2 pixel, dimensione del file: $3',
'show-big-image' => 'Versione ad alta risoluzione',
'show-big-image-thumb' => '<small>Dimensioni di questa anteprima: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'ciclico',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frame}}',
+'file-info-png-looped' => 'ciclico',
+'file-info-png-repeat' => 'ripetuto $1 {{PLURAL:$1|volta|volte}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frame}}',
# Special:NewFiles
'newimages' => 'Galleria dei nuovi file',
@@ -2826,7 +2902,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
'exif-spectralsensitivity' => 'Sensibilità spettrale',
'exif-isospeedratings' => 'Sensibilità ISO',
'exif-oecf' => 'Fattore di conversione optoelettronica',
-'exif-shutterspeedvalue' => 'Tempo di esposizione',
+'exif-shutterspeedvalue' => "Velocità dell'otturatore APEX",
'exif-aperturevalue' => 'Apertura APEX',
'exif-brightnessvalue' => 'Luminosità APEX',
'exif-exposurebiasvalue' => 'Correzione esposizione',
@@ -2892,6 +2968,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
'exif-gpsareainformation' => 'Nome della zona GPS',
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Correzione differenziale GPS',
+'exif-objectname' => 'Titolo breve',
# EXIF attributes
'exif-compression-1' => 'Nessuno',
@@ -2982,6 +3059,8 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
'exif-sensingmethod-7' => 'Sensore trilineare',
'exif-sensingmethod-8' => 'Sensore lineare colore sequenziale',
+'exif-filesource-3' => 'Fotocamera digitale',
+
'exif-scenetype-1' => 'Fotografia diretta',
'exif-customrendered-0' => 'Processo normale',
@@ -3058,28 +3137,28 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
'limitall' => 'tutti',
# E-mail address confirmation
-'confirmemail' => 'Conferma indirizzo e-mail',
-'confirmemail_noemail' => 'Non è stato indicato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].',
-'confirmemail_text' => "{{SITENAME}} richiede la verifica dell'indirizzo e-mail prima di poter usare le relative funzioni. Premere il pulsante qui sotto per inviare una richiesta di conferma al proprio indirizzo; nel messaggio è presente un collegamento che contiene un codice. Visitare il collegamento con il proprio browser per confermare che l'indirizzo e-mail è valido.",
-'confirmemail_pending' => "Il codice di conferma è già stato spedito via posta elettronica; se l'account è stato
+'confirmemail' => 'Conferma indirizzo e-mail',
+'confirmemail_noemail' => 'Non è stato indicato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].',
+'confirmemail_text' => "{{SITENAME}} richiede la verifica dell'indirizzo e-mail prima di poter usare le relative funzioni. Premere il pulsante qui sotto per inviare una richiesta di conferma al proprio indirizzo; nel messaggio è presente un collegamento che contiene un codice. Visitare il collegamento con il proprio browser per confermare che l'indirizzo e-mail è valido.",
+'confirmemail_pending' => "Il codice di conferma è già stato spedito via posta elettronica; se l'account è stato
creato di recente, si prega di attendere l'arrivo del codice per qualche minuto prima
di tentare di richiederne uno nuovo.",
-'confirmemail_send' => 'Invia un codice di conferma via e-mail.',
-'confirmemail_sent' => 'Messaggio e-mail di conferma inviato.',
-'confirmemail_oncreate' => "Un codice di conferma è stato spedito all'indirizzo
+'confirmemail_send' => 'Invia un codice di conferma via e-mail.',
+'confirmemail_sent' => 'Messaggio e-mail di conferma inviato.',
+'confirmemail_oncreate' => "Un codice di conferma è stato spedito all'indirizzo
di posta elettronica indicato. Il codice non è necessario per accedere al sito,
ma è necessario fornirlo per poter abilitare tutte le funzioni del sito che fanno
uso della posta elettronica.",
-'confirmemail_sendfailed' => '{{SITENAME}} non può inviare il messaggio e-mail di conferma. Verificare che il proprio indirizzo e-mail non contenga caratteri non validi.
+'confirmemail_sendfailed' => '{{SITENAME}} non può inviare il messaggio e-mail di conferma. Verificare che il proprio indirizzo e-mail non contenga caratteri non validi.
Messaggio di errore del mailer: $1',
-'confirmemail_invalid' => 'Codice di conferma non valido. Il codice potrebbe essere scaduto.',
-'confirmemail_needlogin' => 'È necessario $1 per confermare il proprio indirizzo e-mail.',
-'confirmemail_success' => "L'indirizzo e-mail è confermato. Ora è possibile [[Special:UserLogin|eseguire l'accesso]] e fare pieno uso del sito.",
-'confirmemail_loggedin' => "L'indirizzo e-mail è stato confermato.",
-'confirmemail_error' => 'Errore nel salvataggio della conferma.',
-'confirmemail_subject' => "{{SITENAME}}: richiesta di conferma dell'indirizzo",
-'confirmemail_body' => 'Qualcuno, probabilmente tu stesso dall\'indirizzo IP $1, ha registrato l\'account "$2" su {{SITENAME}} indicando questo indirizzo e-mail.
+'confirmemail_invalid' => 'Codice di conferma non valido. Il codice potrebbe essere scaduto.',
+'confirmemail_needlogin' => 'È necessario $1 per confermare il proprio indirizzo e-mail.',
+'confirmemail_success' => "L'indirizzo e-mail è confermato. Ora è possibile [[Special:UserLogin|eseguire l'accesso]] e fare pieno uso del sito.",
+'confirmemail_loggedin' => "L'indirizzo e-mail è stato confermato.",
+'confirmemail_error' => 'Errore nel salvataggio della conferma.',
+'confirmemail_subject' => "{{SITENAME}}: richiesta di conferma dell'indirizzo",
+'confirmemail_body' => 'Qualcuno, probabilmente tu stesso dall\'indirizzo IP $1, ha registrato l\'account "$2" su {{SITENAME}} indicando questo indirizzo e-mail.
Per confermare che l\'account ti appartiene veramente e attivare le funzioni relative all\'invio di e-mail su {{SITENAME}}, apri il collegamento seguente con il tuo browser:
@@ -3090,8 +3169,36 @@ Se *non* hai registrato tu l\'account, segui questo collegamento per annullare l
$5
Questo codice di conferma scadrà automaticamente alle $4.',
-'confirmemail_invalidated' => 'Richiesta di conferma indirizzo e-mail annullata',
-'invalidateemail' => 'Annulla richiesta di conferma e-mail',
+'confirmemail_body_changed' => 'Qualcuno, probabilmente tu stesso dall\'indirizzo IP $1,
+ha modificato l\'indirizzo e-mail dell\'account "$2" su {{SITENAME}} indicando questo indirizzo e-mail.
+
+Per confermare che l\'account ti appartiene veramente e riattivare le funzioni relative all\'invio
+di e-mail su {{SITENAME}}, apri il collegamento seguente con il tuo browser:
+
+$3
+
+Se l\'account *non* ti appartiene, segui questo collegamento
+per annullare la conferma dell\'indirizzo e-mail:
+
+$5
+
+Questo codice di conferma scadrà automaticamente alle $4.',
+'confirmemail_body_set' => 'Qualcuno, probabilmente tu stesso dall\'indirizzo IP $1,
+ha impostato l\'indirizzo e-mail dell\'account "$2" su {{SITENAME}} indicando questo indirizzo e-mail.
+
+Per confermare che l\'account ti appartiene veramente e riattivare le funzioni relative all\'invio
+di e-mail su {{SITENAME}}, apri il collegamento seguente con il tuo browser:
+
+$3
+
+Se l\'account *non* ti appartiene, segui questo collegamento
+per annullare la conferma dell\'indirizzo e-mail:
+
+$5
+
+Questo codice di conferma scadrà automaticamente alle $4.',
+'confirmemail_invalidated' => 'Richiesta di conferma indirizzo e-mail annullata',
+'invalidateemail' => 'Annulla richiesta di conferma e-mail',
# Scary transclusion
'scarytranscludedisabled' => "[L'inclusione di pagine tra siti wiki non è attiva]",
@@ -3130,6 +3237,7 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
'table_pager_first' => 'Prima pagina',
'table_pager_last' => 'Ultima pagina',
'table_pager_limit' => 'Mostra $1 file per pagina',
+'table_pager_limit_label' => 'Elementi per pagina:',
'table_pager_limit_submit' => 'Vai',
'table_pager_empty' => 'Nessun risultato',
@@ -3194,6 +3302,7 @@ Si noti che è anche possibile [[Special:Watchlist/edit|modificare la lista con
'version-specialpages' => 'Pagine speciali',
'version-parserhooks' => 'Hook del parser',
'version-variables' => 'Variabili',
+'version-skins' => 'Skin',
'version-other' => 'Altro',
'version-mediahandlers' => 'Gestori di contenuti multimediali',
'version-hooks' => 'Hook',
@@ -3205,6 +3314,13 @@ Si noti che è anche possibile [[Special:Watchlist/edit|modificare la lista con
'version-hook-subscribedby' => 'Sottoscrizioni',
'version-version' => '(Versione $1)',
'version-license' => 'Licenza',
+'version-poweredby-credits' => "Questo wiki è alimentato da '''[http://www.mediawiki.org/ MediaWiki ]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'altri',
+'version-license-info' => 'MediaWiki è software libero; è lecito redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.
+
+MediaWiki è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO. Si veda la GNU General Public License per maggiori dettagli.
+
+Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia di una copia della GNU General Public License]; in caso contrario, in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [http://www.softwarelibero.it/gnudoc/gpl.it.txt leggerla in rete].',
'version-software' => 'Software installato',
'version-software-product' => 'Prodotto',
'version-software-version' => 'Versione',
@@ -3274,6 +3390,15 @@ Inserire il nome del file senza il prefisso \"{{ns:file}}:\"",
'tags-edit' => 'modifica',
'tags-hitcount' => '$1 {{PLURAL:$1|modifica|modifiche}}',
+# Special:ComparePages
+'comparepages' => 'Confronta le pagine',
+'compare-selector' => 'Confronta le revisioni di una pagina',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Revisione 1',
+'compare-rev2' => 'Revisione 2',
+'compare-submit' => 'Confronta',
+
# Database error messages
'dberr-header' => 'Questa wiki ha un problema',
'dberr-problems' => 'Questo sito sta avendo dei problemi tecnici.',
@@ -3290,8 +3415,13 @@ Inserire il nome del file senza il prefisso \"{{ns:file}}:\"",
'htmlform-float-invalid' => 'Il valore specificato non è un numero.',
'htmlform-int-toolow' => 'Il valore specificato è inferiore al minimo di $1',
'htmlform-int-toohigh' => 'Il valore specificato è superiore al massimo di $1',
+'htmlform-required' => 'Questo valore è necessario',
'htmlform-submit' => 'Invia',
'htmlform-reset' => 'Annulla modifiche',
'htmlform-selectorother-other' => 'Altro',
+# SQLite database support
+'sqlite-has-fts' => '$1 con la possibilità di ricerca completa nel testo',
+'sqlite-no-fts' => '$1 senza la possibilità di ricerca completa nel testo',
+
);
diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php
index 23b81006..07fad450 100644
--- a/languages/messages/MessagesJa.php
+++ b/languages/messages/MessagesJa.php
@@ -21,8 +21,10 @@
* @author Hisagi
* @author Hosiryuhosi
* @author Iwai.masaharu
+ * @author Joe Elkins
* @author JtFuruhata
* @author Kahusi
+ * @author Kanon und wikipedia
* @author Kkkdc
* @author Klutzy
* @author Koba-chan
@@ -38,6 +40,7 @@
* @author W.CC
* @author Web comic
* @author Whym
+ * @author Yanajin66
* @author לערי ריינה×רט
* @author 欅
* @author é’å­å®ˆæ­Œ
@@ -64,25 +67,33 @@ $dateFormats = array(
$namespaceNames = array(
NS_MEDIA => 'メディア',
NS_SPECIAL => '特別',
- NS_TALK => 'ノート',
+ NS_TALK => 'トーク',
NS_USER => '利用者',
- NS_USER_TALK => '利用者â€ä¼šè©±',
- NS_PROJECT_TALK => '$1â€ãƒŽãƒ¼ãƒˆ',
+ NS_USER_TALK => '利用者・トーク',
+ NS_PROJECT_TALK => '$1・トーク',
NS_FILE => 'ファイル',
- NS_FILE_TALK => 'ファイルâ€ãƒŽãƒ¼ãƒˆ',
+ NS_FILE_TALK => 'ファイル・トーク',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWikiâ€ãƒŽãƒ¼ãƒˆ',
- NS_TEMPLATE => 'Template',
- NS_TEMPLATE_TALK => 'Templateâ€ãƒŽãƒ¼ãƒˆ',
- NS_HELP => 'Help',
- NS_HELP_TALK => 'Helpâ€ãƒŽãƒ¼ãƒˆ',
- NS_CATEGORY => 'Category',
- NS_CATEGORY_TALK => 'Categoryâ€ãƒŽãƒ¼ãƒˆ',
+ NS_MEDIAWIKI_TALK => 'MediaWiki・トーク',
+ NS_TEMPLATE => 'テンプレート',
+ NS_TEMPLATE_TALK => 'テンプレート・トーク',
+ NS_HELP => 'ヘルプ',
+ NS_HELP_TALK => 'ヘルプ・トーク',
+ NS_CATEGORY => 'カテゴリ',
+ NS_CATEGORY_TALK => 'カテゴリ・トーク',
);
$namespaceAliases = array(
- 'ç”»åƒ' => NS_FILE,
- 'ç”»åƒâ€ãƒŽãƒ¼ãƒˆ' => NS_FILE_TALK,
+ 'ノート' => NS_TALK,
+ '利用者â€ä¼šè©±' => NS_USER_TALK,
+ '$1â€ãƒŽãƒ¼ãƒˆ' => NS_PROJECT_TALK,
+ 'ç”»åƒ' => NS_FILE,
+ 'ç”»åƒâ€ãƒŽãƒ¼ãƒˆ' => NS_FILE_TALK,
+ 'ファイルâ€ãƒŽãƒ¼ãƒˆ' => NS_FILE_TALK,
+ 'MediaWikiâ€ãƒŽãƒ¼ãƒˆ' => NS_MEDIAWIKI_TALK,
+ 'Templateâ€ãƒŽãƒ¼ãƒˆ' => NS_TEMPLATE_TALK,
+ 'Helpâ€ãƒŽãƒ¼ãƒˆ' => NS_HELP_TALK,
+ 'Categoryâ€ãƒŽãƒ¼ãƒˆ' => NS_CATEGORY_TALK
);
$specialPageAliases = array(
@@ -130,20 +141,21 @@ $specialPageAliases = array(
'Allpages' => array( 'ページ一覧', '全ページ' ),
'Prefixindex' => array( 'å‰æ–¹ä¸€è‡´ãƒšãƒ¼ã‚¸ä¸€è¦§', '始点指定ページ一覧' ),
'Ipblocklist' => array( 'ブロック一覧', 'ブロックã®ä¸€è¦§' ),
+ 'Unblock' => array( 'ブロック解除' ),
'Specialpages' => array( '特別ページ一覧' ),
'Contributions' => array( '投稿記録' ),
'Emailuser' => array( 'メールé€ä¿¡', 'ウィキメール' ),
'Confirmemail' => array( 'メールアドレスã®ç¢ºèª' ),
'Whatlinkshere' => array( 'リンク元' ),
'Recentchangeslinked' => array( '関連ページã®æ›´æ–°çŠ¶æ³', 'リンク先ã®æ›´æ–°çŠ¶æ³' ),
- 'Movepage' => array( '移動' ),
+ 'Movepage' => array( '移動', 'ページã®ç§»å‹•' ),
'Blockme' => array( '自己ブロック' ),
'Booksources' => array( '文献資料' ),
'Categories' => array( 'カテゴリ', 'カテゴリ一覧' ),
'Export' => array( 'データ書ã出ã—', 'データー書ã出ã—', 'エクスãƒãƒ¼ãƒˆ' ),
'Version' => array( 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±', 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³' ),
'Allmessages' => array( 'メッセージ一覧', 'システムメッセージã®ä¸€è¦§', '表示メッセージã®ä¸€è¦§' ),
- 'Log' => array( 'ログ', '記録' ),
+ 'Log' => array( '記録', 'ログ' ),
'Blockip' => array( '投稿ブロック', 'ブロック' ),
'Undelete' => array( '復帰' ),
'Import' => array( 'データå–ã‚Šè¾¼ã¿', 'データーå–ã‚Šè¾¼ã¿', 'インãƒãƒ¼ãƒˆ' ),
@@ -154,11 +166,11 @@ $specialPageAliases = array(
'FileDuplicateSearch' => array( 'é‡è¤‡ãƒ•ã‚¡ã‚¤ãƒ«æ¤œç´¢' ),
'Unwatchedpages' => array( 'ウォッãƒã•ã‚Œã¦ã„ãªã„ページ' ),
'Listredirects' => array( 'リダイレクト一覧', 'リダイレクトã®ä¸€è¦§', 'リダイレクトリスト' ),
- 'Revisiondelete' => array( '特定版削除' ),
+ 'Revisiondelete' => array( '版指定削除', '特定版削除' ),
'Unusedtemplates' => array( '使ã‚ã‚Œã¦ã„ãªã„テンプレート', '未使用テンプレート' ),
- 'Randomredirect' => array( 'ãŠã¾ã‹ã›ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ' ),
+ 'Randomredirect' => array( 'ãŠã¾ã‹ã›è»¢é€', 'ãŠã¾ã‹ã›ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ' ),
'Mypage' => array( '利用者ページ', 'マイページ', 'マイ・ページ' ),
- 'Mytalk' => array( '会話ページ', 'マイトーク', 'マイ・トーク' ),
+ 'Mytalk' => array( 'トークページ', '会話ページ', 'マイトーク', 'マイ・トーク' ),
'Mycontributions' => array( '自分ã®æŠ•ç¨¿è¨˜éŒ²' ),
'Listadmins' => array( '管ç†è€…一覧' ),
'Listbots' => array( 'ボット一覧', 'Bot一覧' ),
@@ -174,6 +186,8 @@ $specialPageAliases = array(
'DeletedContributions' => array( '削除ã•ã‚ŒãŸæŠ•ç¨¿è¨˜éŒ²', '削除ã•ã‚ŒãŸæŠ•ç¨¿å±¥æ­´', '削除歴' ),
'Tags' => array( 'タグ一覧' ),
'Activeusers' => array( '活動中ã®åˆ©ç”¨è€…', '活動中ã®åˆ©ç”¨è€…一覧' ),
+ 'ComparePages' => array( 'ページã®æ¯”較' ),
+ 'Badtitle' => array( 'ä¸æ­£ãªãƒšãƒ¼ã‚¸å' ),
);
$magicWords = array(
@@ -182,28 +196,30 @@ $magicWords = array(
'nogallery' => array( '0', '__ギャラリーéžè¡¨ç¤º__', '__ギャラリーéžè¡¨ç¤ºï¼¿ï¼¿', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__目次強制__', '__目次強制__', '__FORCETOC__' ),
'toc' => array( '0', '__目次__', '__目次__', '__TOC__' ),
- 'noeditsection' => array( '0', '__セクション編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤ºï¼¿ï¼¿', '__NOEDITSECTION__' ),
+ 'noeditsection' => array( '0', '__節編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤ºï¼¿ï¼¿', '__NOEDITSECTION__' ),
'noheader' => array( '0', '__見出ã—éžè¡¨ç¤º__', '__見出ã—éžè¡¨ç¤ºï¼¿ï¼¿', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'å”定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'å”定月1', 'å”定月1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'å”定月å', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'çœç•¥å”定月', 'å”定月çœç•¥', 'å”定月çœç•¥å½¢', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'å”定日', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'å”定日2', 'å”定日2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'å”定曜日', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'å”定年', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'å”定時間', 'å”定時刻', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'å”定時', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ç¾åœ°æœˆ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'ç¾åœ°æœˆ1', 'ç¾åœ°æœˆï¼‘', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ç¾åœ°æœˆå', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'çœç•¥ç¾åœ°æœˆ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ç¾åœ°æ—¥', 'ローカルデイ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ç¾åœ°æ—¥2', 'ç¾åœ°æ—¥ï¼’', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ç¾åœ°æ›œæ—¥', 'ローカルデイãƒãƒ¼ãƒ ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ç¾åœ°å¹´', 'ローカルイヤー', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ç¾åœ°æ™‚é–“', 'ローカルタイム', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ç¾åœ°æ™‚', 'LOCALHOUR' ),
+ 'currentmonth' => array( '1', 'ç¾åœ¨ã®æœˆ', 'å”定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ç¾åœ¨ã®æœˆ1', 'å”定月1', 'å”定月1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ç¾åœ¨ã®æœˆå', 'å”定月å', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ç¾åœ¨ã®æœˆå±žæ ¼', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ç¾åœ¨ã®æœˆçœç•¥å½¢', 'çœç•¥å”定月', 'å”定月çœç•¥', 'å”定月çœç•¥å½¢', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ç¾åœ¨ã®æ—¥', 'å”定日', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ç¾åœ¨ã®æ—¥2', 'å”定日2', 'å”定日2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ç¾åœ¨ã®æ›œæ—¥å', 'å”定曜日', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ç¾åœ¨ã®å¹´', 'å”定年', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ç¾åœ¨ã®æ™‚刻', 'å”定時間', 'å”定時刻', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ç¾åœ¨ã®æ™‚', 'å”定時', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', '地方時ã®æœˆ', 'ç¾åœ°æœˆ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', '地方時ã®æœˆ1', 'ç¾åœ°æœˆ1', 'ç¾åœ°æœˆï¼‘', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', '地方時ã®æœˆå1', 'ç¾åœ°æœˆå', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', '地方時ã®æœˆå±žæ ¼', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', '地方時ã®æœˆçœç•¥å½¢', 'çœç•¥ç¾åœ°æœˆ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', '地方時ã®æ—¥', 'ç¾åœ°æ—¥', 'ローカルデイ', 'LOCALDAY' ),
+ 'localday2' => array( '1', '地方時ã®æ—¥2', 'ç¾åœ°æ—¥2', 'ç¾åœ°æ—¥ï¼’', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', '地方時ã®æ›œæ—¥å', 'ç¾åœ°æ›œæ—¥', 'ローカルデイãƒãƒ¼ãƒ ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', '地方時ã®å¹´', 'ç¾åœ°å¹´', 'ローカルイヤー', 'LOCALYEAR' ),
+ 'localtime' => array( '1', '地方時ã®æ™‚刻', 'ç¾åœ°æ™‚é–“', 'ローカルタイム', 'LOCALTIME' ),
+ 'localhour' => array( '1', '地方時ã®æ™‚', 'ç¾åœ°æ™‚', 'LOCALHOUR' ),
'numberofpages' => array( '1', 'ページ数', 'NUMBEROFPAGES' ),
'numberofarticles' => array( '1', '記事数', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'ファイル数', 'NUMBEROFFILES' ),
@@ -215,21 +231,24 @@ $magicWords = array(
'pagenamee' => array( '1', 'ページåE', 'ページåï¼¥', 'PAGENAMEE' ),
'namespace' => array( '1', 'åå‰ç©ºé–“', 'NAMESPACE' ),
'namespacee' => array( '1', 'åå‰ç©ºé–“E', 'åå‰ç©ºé–“ï¼¥', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'フルページå', '完全ãªãƒšãƒ¼ã‚¸å', '完全ãªè¨˜äº‹å', '完全ページå', '完全記事å', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'フルページåE', '完全ãªãƒšãƒ¼ã‚¸åE', 'フルページåï¼¥', '完全ãªãƒšãƒ¼ã‚¸åï¼¥', 'FULLPAGENAMEE' ),
+ 'talkspace' => array( '1', 'トーク空間', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'トーク空間E', 'トーク空間E', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', '主空間', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', '主空間E', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', '完全ãªãƒšãƒ¼ã‚¸å', 'フルページå', '完全ãªè¨˜äº‹å', '完全記事å', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', '完全ãªãƒšãƒ¼ã‚¸åE', 'フルページåE', 'フルページåï¼¥', '完全ãªãƒšãƒ¼ã‚¸åï¼¥', 'FULLPAGENAMEE' ),
'subpagename' => array( '1', 'サブページå', 'SUBPAGENAME' ),
'subpagenamee' => array( '1', 'サブページåE', 'サブページåï¼¥', 'SUBPAGENAMEE' ),
'basepagename' => array( '1', '親ページå', 'BASEPAGENAME' ),
'basepagenamee' => array( '1', '親ページåE', '親ページåï¼¥', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', '会話ページå', 'トークページå', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', '会話ページåE', 'トークページåE', '会話ページåï¼¥', 'トークページåï¼¥', 'TALKPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'トークページå', '会話ページå', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'トークページåE', '会話ページåE', '会話ページåï¼¥', 'トークページåï¼¥', 'TALKPAGENAMEE' ),
'subjectpagename' => array( '1', '主ページå', '記事ページå', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', '主ページåE', '記事ページåE', '主ページåï¼¥', '記事ページåï¼¥', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'メッセージ:', 'MSG:' ),
'subst' => array( '0', '展開:', '展開:', 'SUBST:' ),
+ 'safesubst' => array( '0', '安全展開:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'ウィキ無効メッセージ:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'サムãƒã‚¤ãƒ«', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', '代替画åƒ=$1', 'サムãƒã‚¤ãƒ«=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'å³', 'right' ),
@@ -240,46 +259,70 @@ $magicWords = array(
'img_framed' => array( '1', 'フレーム', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'フレームãªã—', 'frameless' ),
'img_page' => array( '1', 'ページ=$1', 'ページ $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'ボーダー', 'border' ),
- 'img_baseline' => array( '1', 'ベースライン', 'baseline' ),
+ 'img_upright' => array( '1', 'å³ä¸Š', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', '境界', 'ボーダー', 'border' ),
+ 'img_baseline' => array( '1', '下線', 'ベースライン', 'baseline' ),
'img_sub' => array( '1', '下付ã', 'sub' ),
'img_super' => array( '1', '上付ã', 'super', 'sup' ),
+ 'img_top' => array( '1', '上端', 'top' ),
+ 'img_text_top' => array( '1', '文上端', 'text-top' ),
+ 'img_middle' => array( '1', '中心', 'middle' ),
+ 'img_bottom' => array( '1', '下端', 'bottom' ),
+ 'img_text_bottom' => array( '1', '文下端', 'text-bottom' ),
'img_link' => array( '1', 'リンク=$1', 'link=$1' ),
'img_alt' => array( '1', '代替文=$1', 'alt=$1' ),
'int' => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'INT:' ),
'sitename' => array( '1', 'サイトå', 'サイトãƒãƒ¼ãƒ ', 'SITENAME' ),
'ns' => array( '0', 'åå‰ç©ºé–“:', 'åå‰ç©ºé–“:', 'å空:', 'å空:', 'NS:' ),
+ 'nse' => array( '0', 'åå‰ç©ºé–“E:', 'NSE:' ),
'localurl' => array( '0', 'ローカルURL:', 'ローカルURL:', 'LOCALURL:' ),
'localurle' => array( '0', 'ローカルURLE:', 'ローカルURLE:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', '記事パス', 'ARTICLEPATH' ),
'server' => array( '0', 'サーãƒãƒ¼', 'サーãƒ', 'SERVER' ),
'servername' => array( '0', 'サーãƒãƒ¼å', 'サーãƒãƒ¼ãƒãƒ¼ãƒ ', 'サーãƒå', 'サーãƒãƒãƒ¼ãƒ ', 'SERVERNAME' ),
'scriptpath' => array( '0', 'スクリプトパス', 'SCRIPTPATH' ),
'stylepath' => array( '0', 'スタイルパス', 'STYLEPATH' ),
+ 'grammar' => array( '0', '文法:', 'GRAMMAR:' ),
'gender' => array( '0', '性別:', '性別:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦ï¼¿ï¼¿', '__タイトルéžè¡¨ç¤º__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__内容変æ›æŠ‘制__', '__内容変æ›æŠ‘制__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'å”定週', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'ç¾åœ°é€±', 'ローカルウィーク', 'LOCALWEEK' ),
- 'revisionid' => array( '1', 'リビジョンID', '差分ID', 'リビジョンID', '差分ID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'リビジョン日', '差分日', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'リビジョン日2', '差分日2', 'リビジョン日2', '差分日2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'リビジョン月', '差分月', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'リビジョン年', '差分年', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'リビジョンタイムスタンプ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'リビジョンユーザー', 'リビジョンユーザ', 'リビジョン利用者', '差分利用者', 'REVISIONUSER' ),
+ 'notitleconvert' => array( '0', '__タイトル変æ›ç„¡åŠ¹__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦ï¼¿ï¼¿', '__タイトルéžè¡¨ç¤º__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__内容変æ›ç„¡åŠ¹__', '__内容変æ›æŠ‘制__', '__内容変æ›æŠ‘制__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ç¾åœ¨ã®é€±', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ç¾åœ¨ã®æ›œæ—¥ç•ªå·', 'CURRENTDOW' ),
+ 'localweek' => array( '1', '地方時ã®é€±', 'ç¾åœ°é€±', 'ローカルウィーク', 'LOCALWEEK' ),
+ 'localdow' => array( '1', '地方時ã®æ›œæ—¥ç•ªå·', 'LOCALDOW' ),
+ 'revisionid' => array( '1', '版ã®ID', 'リビジョンID', '差分ID', 'リビジョンID', '差分ID', 'REVISIONID' ),
+ 'revisionday' => array( '1', '版ã®æ—¥', 'リビジョン日', '差分日', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', '版ã®æ—¥2', 'リビジョン日2', '差分日2', 'リビジョン日2', '差分日2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', '版ã®æœˆ', 'リビジョン月', '差分月', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', '版ã®æœˆ1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', '版ã®å¹´', 'リビジョン年', '差分年', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', '版ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'リビジョンタイムスタンプ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', '版ã®åˆ©ç”¨è€…', 'リビジョンユーザー', 'リビジョンユーザ', 'リビジョン利用者', '差分利用者', 'REVISIONUSER' ),
'plural' => array( '0', '複数:', '複数:', 'PLURAL:' ),
'fullurl' => array( '0', '完全ãªURL:', 'フルURL:', '完全ãªï¼µï¼²ï¼¬ï¼š', 'フルURL:', 'FULLURL:' ),
'fullurle' => array( '0', '完全ãªURLE:', 'フルURLE:', '完全ãªï¼µï¼²ï¼¬ï¼¥ï¼š', 'フルURLE:', 'FULLURLE:' ),
- 'newsectionlink' => array( '1', '__æ–°ã—ã„セクションリンク__', '__新セクションリンク__', '__新ã—ã„セクションリンク__', '__新セクションリンク__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__æ–°ã—ã„セクションリンクéžè¡¨ç¤º__', '__新ã—ã„セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__新セクションリンクéžè¡¨ç¤º__', '__新セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'MediaWikiãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'メディアウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'CURRENTVERSION' ),
+ 'lcfirst' => array( '0', '先頭å°æ–‡å­—:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', '先頭大文字:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'å°æ–‡å­—:', 'LC:' ),
+ 'uc' => array( '0', '大文字:', 'UC:' ),
+ 'raw' => array( '0', '生:', 'RAW:' ),
+ 'displaytitle' => array( '1', '表示タイトル:', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', '生', 'R' ),
+ 'newsectionlink' => array( '1', '__æ–°ã—ã„節リンク__', '__æ–°ã—ã„セクションリンク__', '__新セクションリンク__', '__新ã—ã„セクションリンク__', '__新セクションリンク__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__æ–°ã—ã„節リンクéžè¡¨ç¤º__', '__æ–°ã—ã„セクションリンクéžè¡¨ç¤º__', '__新ã—ã„セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__新セクションリンクéžè¡¨ç¤º__', '__新セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'ウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'MediaWikiãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'メディアウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'URLエンコード:', 'URLエンコード:', 'URLENCODE:' ),
- 'currenttimestamp' => array( '1', 'å”定タイムスタンプ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ç¾åœ°ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ローカルタイムスタンプ', 'LOCALTIMESTAMP' ),
+ 'anchorencode' => array( '0', 'アンカー用エンコード', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ç¾åœ¨ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'å”定タイムスタンプ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', '地方時ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ç¾åœ°ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ローカルタイムスタンプ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'æ–¹å‘å°', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#言語:', '#言語:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', '内容言語', '記事言語', 'プロジェクト言語', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
'pagesinnamespace' => array( '1', 'åå‰ç©ºé–“内ページ数', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
'numberofadmins' => array( '1', '管ç†è€…æ•°', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'æ•°æ•´å½¢', 'FORMATNUM' ),
+ 'padleft' => array( '0', '補充左', 'PADLEFT' ),
+ 'padright' => array( '0', '補充å³', 'PADRIGHT' ),
'special' => array( '0', '特別', 'special' ),
'defaultsort' => array( '1', 'デフォルトソート:', 'デフォルトソート:', 'デフォルトソートキー:', 'デフォルトカテゴリソート:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'ファイルパス:', 'ファイルパス:', 'FILEPATH:' ),
@@ -290,9 +333,12 @@ $magicWords = array(
'index' => array( '1', '__インデックス__', '__インデックス__', '__INDEX__' ),
'noindex' => array( '1', '__インデックス拒å¦__', '__インデックス拒å¦ï¼¿ï¼¿', '__NOINDEX__' ),
'numberingroup' => array( '1', 'グループ人数', 'グループ所属人数', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹ï¼¿ï¼¿', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹__', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹ï¼¿ï¼¿', '__STATICREDIRECT__' ),
+ 'staticredirect' => array( '1', '__é™çš„転é€__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹ï¼¿ï¼¿', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹__', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹ï¼¿ï¼¿', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'ä¿è­·ãƒ¬ãƒ™ãƒ«', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', '日付整形', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'パス', 'PATH' ),
+ 'url_wiki' => array( '0', 'ウィキ', 'WIKI' ),
+ 'url_query' => array( '0', 'クエリー', 'QUERY' ),
);
$messages = array(
@@ -311,8 +357,7 @@ $messages = array(
'tog-editsection' => '[編集]リンクã‹ã‚‰ç¯€ã‚’編集ã§ãるよã†ã«ã™ã‚‹',
'tog-editsectiononrightclick' => '節見出ã—ã®å³ã‚¯ãƒªãƒƒã‚¯ã§ç¯€ç·¨é›†ã‚’è¡Œãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ï¼ˆJavaScriptãŒå¿…è¦ï¼‰',
'tog-showtoc' => '目次を表示ã™ã‚‹ï¼ˆ4ã¤ä»¥ä¸Šã®è¦‹å‡ºã—ãŒã‚るページ)',
-'tog-rememberpassword' => 'ã“ã®ã‚³ãƒ³ãƒ”ューターã«ãƒ­ã‚°ã‚¤ãƒ³æƒ…報をä¿å­˜ã™ã‚‹',
-'tog-editwidth' => '編集ボックスをウィンドウã®å¹…ã„ã£ã±ã„ã«è¡¨ç¤ºã™ã‚‹',
+'tog-rememberpassword' => 'ã“ã®ãƒ–ラウザã«ãƒ­ã‚°ã‚¤ãƒ³æƒ…報をä¿æŒã™ã‚‹ï¼ˆæœ€å¤§$1{{PLURAL:$1|æ—¥}})',
'tog-watchcreations' => '自分ãŒä½œæˆã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
'tog-watchdefault' => '自分ãŒç·¨é›†ã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
'tog-watchmoves' => '自分ãŒç§»å‹•ã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
@@ -458,31 +503,21 @@ $messages = array(
'faqpage' => 'Project:よãã‚る質å•ã¨å›žç­”',
# Vector skin
-'vector-action-addsection' => '話題追加',
-'vector-action-delete' => '削除',
-'vector-action-move' => '移動',
-'vector-action-protect' => 'ä¿è­·',
-'vector-action-undelete' => '復帰',
-'vector-action-unprotect' => 'ä¿è­·è§£é™¤',
-'vector-namespace-category' => 'カテゴリ',
-'vector-namespace-help' => 'ヘルプページ',
-'vector-namespace-image' => 'ファイル',
-'vector-namespace-main' => 'ページ',
-'vector-namespace-media' => 'メディアページ',
-'vector-namespace-mediawiki' => 'メッセージ',
-'vector-namespace-project' => 'プロジェクトページ',
-'vector-namespace-special' => '特別ページ',
-'vector-namespace-talk' => 'è­°è«–',
-'vector-namespace-template' => 'テンプレート',
-'vector-namespace-user' => '利用者ページ',
-'vector-view-create' => '作æˆ',
-'vector-view-edit' => '編集',
-'vector-view-history' => '履歴表示',
-'vector-view-view' => '閲覧',
-'vector-view-viewsource' => 'ソース表示',
-'actions' => 'æ“作',
-'namespaces' => 'åå‰ç©ºé–“',
-'variants' => '変種',
+'vector-action-addsection' => '話題追加',
+'vector-action-delete' => '削除',
+'vector-action-move' => '移動',
+'vector-action-protect' => 'ä¿è­·',
+'vector-action-undelete' => '復帰',
+'vector-action-unprotect' => 'ä¿è­·è§£é™¤',
+'vector-simplesearch-preference' => '検索語ã®æ案機能を拡張ã™ã‚‹ï¼ˆãƒ™ã‚¯ã‚¿ãƒ¼å¤–装ã®ã¿ï¼‰',
+'vector-view-create' => '作æˆ',
+'vector-view-edit' => '編集',
+'vector-view-history' => '履歴表示',
+'vector-view-view' => '閲覧',
+'vector-view-viewsource' => 'ソース表示',
+'actions' => 'æ“作',
+'namespaces' => 'åå‰ç©ºé–“',
+'variants' => '変種',
'errorpagetitle' => 'エラー',
'returnto' => '$1ã«æˆ»ã‚‹ã€‚',
@@ -543,6 +578,9 @@ $messages = array(
ã—ã°ã‚‰ã時間を置ã„ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã¿ã¦ãã ã•ã„。
$1',
+'pool-timeout' => 'ロック待ã¡ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ',
+'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}}ã«ã¤ã„ã¦',
@@ -710,7 +748,8 @@ $2',
'yourname' => '利用者å:',
'yourpassword' => 'パスワード:',
'yourpasswordagain' => 'パスワードå†å…¥åŠ›ï¼š',
-'remembermypassword' => 'ã“ã®ã‚³ãƒ³ãƒ”ューターã«ãƒ­ã‚°ã‚¤ãƒ³æƒ…報をä¿å­˜ã™ã‚‹',
+'remembermypassword' => 'ã“ã®ãƒ–ラウザーã«ãƒ­ã‚°ã‚¤ãƒ³æƒ…報をä¿å­˜ã™ã‚‹ (最長$1日間)',
+'securelogin-stick-https' => 'ログイン後ã«HTTPS接続を維æŒ',
'yourdomainname' => 'ドメイン:',
'externaldberror' => '外部ã®èªè¨¼ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‹ã€ã¾ãŸã¯å¤–部アカウント情報ã®æ›´æ–°ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'login' => 'ログイン',
@@ -727,6 +766,7 @@ $2',
'gotaccount' => 'æ—¢ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’æŒã£ã¦ã„ã‚‹å ´åˆã€$1。',
'gotaccountlink' => 'ログインã—ã¦ãã ã•ã„',
'createaccountmail' => 'メールã§é€ä¿¡',
+'createaccountreason' => 'ç†ç”±ï¼š',
'badretype' => '入力ã—ãŸãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。',
'userexists' => '入力ã•ã‚ŒãŸåˆ©ç”¨è€…åã¯ã™ã§ã«ä½¿ã‚ã‚Œã¦ã„ã¾ã™ã€‚
ã»ã‹ã®åå‰ã‚’é¸ã‚“ã§ãã ã•ã„。',
@@ -755,6 +795,7 @@ $2',
ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。',
'passwordtooshort' => 'パスワードã¯{{PLURAL:$1|$1文字}}以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。',
'password-name-match' => 'パスワードã¯åˆ©ç”¨è€…åã¨ç•°ãªã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'password-login-forbidden' => 'ã“ã®ã‚ˆã†ãªåˆ©ç”¨è€…åã¨ãƒ‘スワードを使用ã™ã‚‹ã“ã¨ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'mailmypassword' => 'æ–°ã—ã„パスワードを電å­ãƒ¡ãƒ¼ãƒ«ã§é€ã‚‹',
'passwordremindertitle' => '{{SITENAME}}ã®ä»®ãƒ‘スワード通知',
'passwordremindertext' => '誰ã‹ï¼ˆãŠãらã自身ã€IPアドレス$1ã‹ã‚‰ï¼‰ãŒ{{SITENAME}}($4)ã®ãƒ­ã‚°ã‚¤ãƒ³ç”¨ãƒ‘スワードã®å†ç™ºè¡Œã‚’申請ã—ã¾ã—ãŸã€‚
@@ -795,6 +836,9 @@ $2',
'loginlanguagelabel' => '言語: $1',
'suspicious-userlogout' => '壊れãŸãƒ–ラウザもã—ãã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ»ãƒ—ロキシã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€ãƒ­ã‚°ã‚¢ã‚¦ãƒˆè¦æ±‚ã¯æ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚',
+# E-mail sending
+'php-mail-error-unknown' => 'PHPã®mail()関数ã§ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼',
+
# Password reset dialog
'resetpass' => 'パスワードã®å¤‰æ›´',
'resetpass_announce' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã•ã‚ŒãŸä»®ãƒ‘スワードã§ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã¾ã™ã€‚
@@ -848,10 +892,12 @@ $2',
'showdiff' => '差分を表示',
'anoneditwarning' => "'''警告:'''ログインã—ã¦ã„ã¾ã›ã‚“。
ã“ã®ã¾ã¾æŠ•ç¨¿ã‚’è¡Œã£ãŸå ´åˆã€ä½¿ç”¨ä¸­ã®IPアドレスãŒã“ã®ãƒšãƒ¼ã‚¸ã®ç·¨é›†å±¥æ­´ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚",
+'anonpreviewwarning' => "''ログインã—ã¦ã„ã¾ã›ã‚“。投稿をä¿å­˜ã™ã‚‹ã¨ã€ã“ã®ãƒšãƒ¼ã‚¸ã®å±¥æ­´ã«ä½¿ç”¨ä¸­ã®IPアドレスãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚''",
'missingsummary' => "'''注æ„:'''è¦ç´„欄ãŒç©ºæ¬„ã§ã™ã€‚
「{{int:savearticle}}ã€ã‚’ã‚‚ã†ä¸€åº¦ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ç·¨é›†ã¯è¦ç´„ãªã—ã§ä¿å­˜ã•ã‚Œã¾ã™ã€‚",
'missingcommenttext' => '以下ã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’入力ã—ã¦ãã ã•ã„。',
-'missingcommentheader' => "'''注æ„:''' é¡Œå・見出ã—ãŒç©ºæ¬„ã§ã™ã€‚投稿ボタンをもã†ä¸€åº¦æŠ¼ã™ã¨ã€è¦ç´„ãªã—ã®ã¾ã¾æŠ•ç¨¿ã•ã‚Œã¾ã™ã€‚",
+'missingcommentheader' => "'''注æ„::'' ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã«å¯¾ã™ã‚‹é¡Œå・見出ã—ãŒç©ºæ¬„ã§ã™ã€‚
+「{{int:savearticle}}ã€ãƒœã‚¿ãƒ³ã‚’ã‚‚ã†ä¸€åº¦æŠ¼ã™ã¨ã€ç·¨é›†ã¯è¦ç´„ãªã—ã§ä¿å­˜ã•ã‚Œã¾ã™ã€‚",
'summary-preview' => 'è¦ç´„ã®ãƒ—レビュー:',
'subject-preview' => 'é¡Œå・見出ã—ã®ãƒ—レビュー:',
'blockedtitle' => '利用者ã¯ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™',
@@ -929,7 +975,12 @@ IPアドレスã¯è¤‡æ•°ã®åˆ©ç”¨è€…ã®é–“ã§å…±æœ‰ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒã‚ã‚Š
'''ã¾ã ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼'''",
'userjspreview' => "'''利用者JavaScriptを試験ã€ãƒ—レビューã—ã¦ã„ã¾ã™ã€‚'''
'''ã¾ã ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼'''",
-'userinvalidcssjstitle' => "'''警告:''' 「$1ã€ã¨ã„ã†ã‚¹ã‚­ãƒ³ã¯ã‚ã‚Šã¾ã›ã‚“。.css 㨠.js ページを編集ã™ã‚‹éš›ã«ã¯ã‚µãƒ–ページåã‚’å°æ–‡å­—ã«ã™ã‚‹ã“ã¨ã‚’忘れãªã„ã§ãã ã•ã„。例ãˆã° {{ns:user}}:Hoge/Monobook.css ã§ã¯ãªã {{ns:user}}:Hoge/monobook.css ã¨ãªã‚Šã¾ã™ã€‚",
+'sitecsspreview' => "'''ã“ã“ã§ã¯ã€CSSをプレビューã—ã¦ã„ã‚‹ã ã‘ã«éŽãŽã¾ã›ã‚“。'''
+'''ã¾ã ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼'''",
+'sitejspreview' => "'''ã“ã“ã§ã¯ã€JavaScriptをプレビューã—ã¦ã„ã‚‹ã ã‘ã«éŽãŽã¾ã›ã‚“。'''
+'''ã¾ã ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼'''",
+'userinvalidcssjstitle' => "'''警告:'''「$1ã€ã¨ã„ã†å¤–装ã¯ã‚ã‚Šã¾ã›ã‚“。
+.cssã¨.jsページを編集ã™ã‚‹éš›ã«ã¯ã€ãƒšãƒ¼ã‚¸åã‚’å°æ–‡å­—ã«ã™ã‚‹ã“ã¨ã‚’忘れãªã„ã§ãã ã•ã„(例ãˆã°ã€{{ns:user}}:Hoge/Vector.cssã§ã¯ãªã{{ns:user}}:Hoge/vector.cssã¨ãªã‚Šã¾ã™ï¼‰ã€‚",
'updated' => '(更新)',
'note' => "'''ãŠçŸ¥ã‚‰ã›ï¼š'''",
'previewnote' => "'''ã“ã‚Œã¯ãƒ—レビューã§ã™ã€‚'''
@@ -971,7 +1022,6 @@ IPアドレスã¯è¤‡æ•°ã®åˆ©ç”¨è€…ã®é–“ã§å…±æœ‰ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒã‚ã‚Š
自信ã®æŠ•ç¨¿ãŒä»–人ã«ã‚ˆã£ã¦é æ…®ãªã編集ã•ã‚Œã‚‹ã“ã¨ã‚’望ã¾ãªã„å ´åˆã¯ã€ã“ã“ã«ã¯æŠ•ç¨¿ã—ãªã„ã§ãã ã•ã„。<br />
ã¾ãŸã€æŠ•ç¨¿ã•ã‚Œã‚‹ã‚‚ã®ã¯ã€è‡ªèº«ã«ã‚ˆã£ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ã‹ã€ãƒ‘ブリック・ドメインã€ã¾ãŸã¯ãã‚Œã«é¡žã™ã‚‹ãƒ•ãƒªãƒ¼ãªè³‡æ–™ã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’ç´„æŸã—ã¦ãã ã•ã„(詳細ã¯$1ã‚’å‚照)。
'''著作権ä¿è­·ã•ã‚Œã¦ã„る作å“ã‚’ã€è¨±è«¾ãªã—ã«æŠ•ç¨¿ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ï¼'''",
-'longpagewarning' => "'''警告:''' ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚µã‚¤ã‚ºã¯ $1 キロãƒã‚¤ãƒˆã§ã™ã€‚一部ã®ãƒ–ラウザã«ã¯ 32 キロãƒã‚¤ãƒˆä»¥ä¸Šã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã¨å•é¡ŒãŒèµ·ãã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã™ã€‚ページをセクションã«åˆ†ã‘ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。",
'longpageerror' => "'''エラー:投稿ã•ã‚ŒãŸæ–‡ç« ã¯ã¯$1キロãƒã‚¤ãƒˆã®é•·ã•ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯æŠ•ç¨¿ã§ãる最大ã®é•·ã•ã§ã‚ã‚‹$2キロãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ã€‚'''
ã“ã®ç·¨é›†ã¯ä¿å­˜ã§ãã¾ã›ã‚“。",
'readonlywarning' => "'''警告:データベースãŒãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ç¾åœ¨ã¯ç·¨é›†ã‚’ä¿å­˜ã§ãã¾ã›ã‚“。'''
@@ -1151,6 +1201,8 @@ $1",
'logdelete-failure' => "'''記録ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚'''
$1",
'revdel-restore' => '閲覧レベルを変更',
+'revdel-restore-deleted' => '削除ã•ã‚ŒãŸç‰ˆ',
+'revdel-restore-visible' => '閲覧å¯èƒ½ãªç‰ˆ',
'pagehist' => 'ページã®å±¥æ­´',
'deletedhist' => '削除ã•ã‚ŒãŸå±¥æ­´',
'revdelete-content' => '本文',
@@ -1221,11 +1273,13 @@ $1",
# Diffs
'history-title' => '「$1ã€ã®å¤‰æ›´å±¥æ­´',
'difference' => '(版間ã§ã®å·®åˆ†ï¼‰',
+'difference-multipage' => '(ページ間ã®å·®åˆ†ï¼‰',
'lineno' => '$1行:',
'compareselectedversions' => 'é¸æŠžã—ãŸç‰ˆåŒå£«ã‚’比較',
'showhideselectedversions' => 'é¸æŠžã—ãŸç‰ˆã‚’表示もã—ãã¯éžè¡¨ç¤º',
'editundo' => 'å–り消ã—',
-'diff-multi' => '({{PLURAL:$1|é–“ã®$1版}}分ãŒéžè¡¨ç¤º)',
+'diff-multi' => '($2人ã®åˆ©ç”¨è€…ã«ã‚ˆã‚‹ã€é–“ã®$1版ãŒéžè¡¨ç¤ºï¼‰',
+'diff-multi-manyusers' => '($2人以上ã®åˆ©ç”¨è€…ã«ã‚ˆã‚‹ã€é–“ã®$1版ãŒéžè¡¨ç¤ºï¼‰',
# Search results
'searchresults' => '検索çµæžœ',
@@ -1260,6 +1314,7 @@ $1",
'searchprofile-everything-tooltip' => '全ページ(トークページå«ã‚€ï¼‰ã‚’検索',
'searchprofile-advanced-tooltip' => '特定ã®åå‰ç©ºé–“を検索',
'search-result-size' => '$1($2å˜èªžï¼‰',
+'search-result-category-size' => '$1件($2下ä½ã‚«ãƒ†ã‚´ãƒªã€$3ファイル)',
'search-result-score' => '関連度:$1%',
'search-redirect' => '($1を転é€ï¼‰',
'search-section' => '($1ã®ç¯€ï¼‰',
@@ -1337,6 +1392,7 @@ $1",
'contextlines' => '1件ã‚ãŸã‚Šã®è¡Œæ•°ï¼š',
'contextchars' => '1è¡Œã‚ãŸã‚Šã®æ–‡å­—数:',
'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹é–¾å€¤ï¼ˆãƒã‚¤ãƒˆï¼‰ï¼š',
+'stub-threshold-disabled' => '無効',
'recentchangesdays' => '最近ã®æ›´æ–°ã«è¡¨ç¤ºã™ã‚‹æ—¥æ•°ï¼š',
'recentchangesdays-max' => '(最大$1{{PLURAL:$1|日|日間}})',
'recentchangescount' => '既定ã§è¡¨ç¤ºã™ã‚‹ä»¶æ•°ï¼š',
@@ -1370,6 +1426,7 @@ $1",
'prefs-files' => 'ファイル',
'prefs-custom-css' => 'カスタムCSS',
'prefs-custom-js' => 'カスタムJS',
+'prefs-common-css-js' => 'ã™ã¹ã¦ã®å¤–装ã«å…±é€šã®CSSã¨JavaScript:',
'prefs-reset-intro' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’使ã†ã¨ã€è‡ªèº«ã®å€‹äººè¨­å®šã‚’ã“ã®ã‚µã‚¤ãƒˆã®æ—¢å®šã®ã‚‚ã®ã«å†è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
ã“ã®æ“作ã¯å–り消ã—ãŒã§ãã¾ã›ã‚“。',
'prefs-emailconfirm-label' => 'メール確èªï¼š',
@@ -1409,9 +1466,15 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'prefs-advancedrendering' => '詳細設定',
'prefs-advancedsearchoptions' => '詳細設定',
'prefs-advancedwatchlist' => '詳細設定',
-'prefs-display' => '表示ã®è¨­å®š',
+'prefs-displayrc' => '表示ã®è¨­å®š',
+'prefs-displaysearchoptions' => '表示ã®è¨­å®š',
+'prefs-displaywatchlist' => '表示ã®è¨­å®š',
'prefs-diffs' => '差分',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => '有効ãªã‚ˆã†ã§ã™',
+'email-address-validity-invalid' => '有効ãªã‚¢ãƒ‰ãƒ¬ã‚¹ãŒå¿…è¦ã§ã™!',
+
# User rights
'userrights' => '利用者権é™ã®ç®¡ç†',
'userrights-lookup-user' => '利用者グループを管ç†',
@@ -1495,6 +1558,7 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'right-hideuser' => '利用者åブロックã—ã€å…¬é–‹è¨˜éŒ²ã‹ã‚‰éš ã™',
'right-ipblock-exempt' => 'IPブロックã€è‡ªå‹•ãƒ–ロックã€åºƒåŸŸãƒ–ロックを回é¿',
'right-proxyunbannable' => 'プロキシã®è‡ªå‹•ãƒ–ロックを回é¿',
+'right-unblockself' => '自分自身ã«å¯¾ã™ã‚‹ãƒ–ロックを解除',
'right-protect' => 'ä¿è­·ãƒ¬ãƒ™ãƒ«ã®å¤‰æ›´ã¨ä¿è­·ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã®ç·¨é›†',
'right-editprotected' => 'ä¿è­·ãƒšãƒ¼ã‚¸ã®ç·¨é›†ï¼ˆé€£ç¶šä¿è­·ã‚’除ã)',
'right-editinterface' => 'ユーザーインターフェースã®ç·¨é›†',
@@ -1517,7 +1581,6 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'right-siteadmin' => 'データベースã®ãƒ­ãƒƒã‚¯ãŠã‚ˆã³ãƒ­ãƒƒã‚¯è§£é™¤',
'right-reset-passwords' => 'ä»–ã®åˆ©ç”¨è€…ã®ãƒ‘スワードをå†è¨­å®šã™ã‚‹',
'right-override-export-depth' => 'リンク先ページを5階層ã¾ã§å«ã‚ã¦æ›¸ã出ã™',
-'right-versiondetail' => 'ソフトウェアã®è©³ç´°ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã™ã‚‹',
'right-sendemail' => 'ä»–ã®åˆ©ç”¨è€…ã¸é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹',
# User rights log
@@ -1568,14 +1631,9 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'recentchanges-legend' => '最近ã®æ›´æ–°ã®ã‚ªãƒ—ション',
'recentchangestext' => '最近ã®æ›´æ–°ã¯ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ç¢ºèªã§ãã¾ã™ã€‚',
'recentchanges-feed-description' => 'ã“ã®ãƒ•ã‚£ãƒ¼ãƒ‰ã§ãã®ã‚¦ã‚£ã‚­ã¸ã®æœ€è¿‘ã®æ›´æ–°ã‚’追跡。',
-'recentchanges-label-legend' => '凡例: $1',
-'recentchanges-legend-newpage' => '$1 - æ–°ã—ã„ページ',
'recentchanges-label-newpage' => 'ã“ã®ç·¨é›†ã§æ–°ã—ã„ページãŒä½œæˆã•ã‚Œã¾ã—ãŸ',
-'recentchanges-legend-minor' => '$1 - 細部ã®ç·¨é›†',
'recentchanges-label-minor' => 'ã“ã‚Œã¯ç´°éƒ¨ã®ç·¨é›†ã§ã™',
-'recentchanges-legend-bot' => '$1 - ボットã«ã‚ˆã‚‹ç·¨é›†',
'recentchanges-label-bot' => 'ã“ã®ç·¨é›†ã¯ãƒœãƒƒãƒˆã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¾ã—ãŸ',
-'recentchanges-legend-unpatrolled' => '$1 - パトロールã•ã‚Œã¦ã„ãªã„編集',
'recentchanges-label-unpatrolled' => 'ã“ã®ç·¨é›†ã¯ã¾ã å·¡å›žã•ã‚Œã¦ã„ã¾ã›ã‚“',
'rcnote' => "以下ã¯ã€$4$5ã¾ã§ã®{{PLURAL:$2|1æ—¥|ç›´å‰'''$2'''日間}}ã«ãªã•ã‚ŒãŸ'''$1'''件ã®å¤‰æ›´ã§ã™ã€‚",
'rcnotefrom' => "以下ã¯ã€'''$2'''以é™ã®æ›´æ–°ã§ã™ï¼ˆæœ€å¤§'''$1'''件)。",
@@ -1623,6 +1681,9 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'upload_directory_missing' => 'アップロード先ディレクトリー($1)ãŒè¦‹ã¤ã‹ã‚‰ãšã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ã«ã‚ˆã£ã¦ä½œæˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'upload_directory_read_only' => 'アップロード先ディレクトリー($1)ã«ã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ãŒæ›¸ãè¾¼ã‚ã¾ã›ã‚“。',
'uploaderror' => 'アップロードã®ã‚¨ãƒ©ãƒ¼',
+'upload-recreate-warning' => "'''警告:ãã®åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ä»¥å‰ã«å‰Šé™¤ã¾ãŸã¯ç§»å‹•ã•ã‚Œã¦ã„ã¾ã™ã€‚'''
+
+å‚考ã®ãŸã‚ã€ã“ã®ãƒšãƒ¼ã‚¸ã®å‰Šé™¤ã¨ç§»å‹•ã®è¨˜éŒ²ã‚’以下ã«ç¤ºã—ã¾ã™ï¼š",
'uploadtext' => "ファイルをアップロードã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’利用ã—ã¦ãã ã•ã„。
以å‰ã«ã‚¢ãƒƒãƒ—ロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®è¡¨ç¤ºã¨æ¤œç´¢ã«ã¯[[Special:FileList|{{int:listfiles}}]]を使用ã—ã€ï¼ˆå†ï¼‰ã‚¢ãƒƒãƒ—ロードã¯[[Special:Log/upload|アップロード記録]]ã«ã€å‰Šé™¤ã¯[[Special:Log/delete|削除記録]]ã«ã‚‚記録ã•ã‚Œã¾ã™ã€‚
@@ -1658,6 +1719,17 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'filetype-banned-type' => "'''「.$1ã€''' ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„ファイル形å¼ã§ã™ã€‚
許å¯ã•ã‚Œã¦ã„ã‚‹{{PLURAL:$3|ファイル形å¼}}ã¯$2ã§ã™ã€‚",
'filetype-missing' => 'ファイルã«ã€ã€Œ.jpgã€ã®ã‚ˆã†ãªæ‹¡å¼µå­ãŒã‚ã‚Šã¾ã›ã‚“。',
+'empty-file' => 'é€ä¿¡ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ç©ºã§ã—ãŸã€‚',
+'file-too-large' => 'é€ä¿¡ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯å¤§ãã™ãŽã¾ã™ã€‚',
+'filename-tooshort' => 'ファイルåãŒçŸ­ã™ãŽã¾ã™ã€‚',
+'filetype-banned' => 'ã“ã®å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'verification-error' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æ¤œè¨¼ã‚·ã‚¹ãƒ†ãƒ ã«åˆæ ¼ã—ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'hookaborted' => '拡張機能ã®ãƒ•ãƒƒã‚¯ã«ã‚ˆã£ã¦ã€ä¿®æ­£ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸã€‚',
+'illegal-filename' => 'ãã®ãƒ•ã‚¡ã‚¤ãƒ«åã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'overwrite' => '既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ä¸Šæ›¸ãã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'unknown-error' => 'ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'tmp-create-error' => '一時ファイルを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'tmp-write-error' => '一時ファイルã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼',
'large-file' => 'ファイルサイズã¯$1ãƒã‚¤ãƒˆã‚ˆã‚Šå¤§ããã—ãªã„ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ã€‚
ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯$2ãƒã‚¤ãƒˆã§ã™ã€‚',
'largefileserver' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ã‚µãƒ¼ãƒãƒ¼è¨­å®šã§è¨±ã•ã‚Œã¦ã„る最大サイズより大ãã„ã§ã™ã€‚',
@@ -1690,13 +1762,14 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'file-exists-duplicate' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ä»¥ä¸‹ã®{{PLURAL:$1|ファイル}}ã¨é‡è¤‡ã—ã¦ã„ã¾ã™ï¼š',
'file-deleted-duplicate' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆ[[:$1]])ã¨åŒä¸€ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒä»¥å‰ã«å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚
å†åº¦ã‚¢ãƒƒãƒ—ロードをã™ã‚‹å‰ã«ã€ä»¥å‰å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®å‰Šé™¤è¨˜éŒ²ã‚’確èªã—ã¦ãã ã•ã„。',
-'successfulupload' => 'アップロードæˆåŠŸ',
'uploadwarning' => 'アップロード警告',
'uploadwarning-text' => '下記ã®ãƒ•ã‚¡ã‚¤ãƒ«è§£èª¬ã‚’修正ã—ã¦å†è©¦è¡Œã—ã¦ãã ã•ã„。',
'savefile' => 'ファイルをä¿å­˜',
'uploadedimage' => '「[[$1]]ã€ã‚’アップロードã—ã¾ã—ãŸã€‚',
'overwroteimage' => '「[[$1]]ã€ã®æ–°ã—ã„版をアップロードã—ã¾ã—ãŸ',
'uploaddisabled' => 'アップロード機能ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'copyuploaddisabled' => 'URLã‹ã‚‰ã®ã‚¢ãƒƒãƒ—ロードã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'uploadfromurl-queued' => 'アップロードãŒã€ã‚­ãƒ¥ãƒ¼ã«è¿½åŠ ã•ã‚Œã¾ã—ãŸã€‚',
'uploaddisabledtext' => 'ファイルã®ã‚¢ãƒƒãƒ—ロードã¯ã€ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
'php-uploaddisabledtext' => 'ファイルã®ã‚¢ãƒƒãƒ—ロードãŒPHPã§ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚
file_uploadsã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。',
@@ -1733,6 +1806,14 @@ JD # Jenoptik
MGP # ペンタックス
PICT # ãã®ä»–
#</pre> <!-- ã“ã®è¡Œã¯ãã®ã¾ã¾ã«ã—ã¦ãŠã„ã¦ãã ã•ã„ -->',
+'upload-success-subj' => 'アップロードæˆåŠŸ',
+'upload-success-msg' => '[$2]ã‹ã‚‰ã®ã‚¢ãƒƒãƒ—ロードã«æˆåŠŸã—ã¾ã—ãŸã€‚[[:{{ns:file}}:$1]]ã‹ã‚‰åˆ©ç”¨å¯èƒ½ã§ã™ã€‚',
+'upload-failure-subj' => 'アップロードã§ç™ºç”Ÿã—ãŸå•é¡Œ',
+'upload-failure-msg' => '[$2]ã‹ã‚‰ã®ã‚¢ãƒƒãƒ—ロード中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸï¼š
+
+$1',
+'upload-warning-subj' => 'アップロードã®è­¦å‘Š',
+'upload-warning-msg' => '[$2] ã‹ã‚‰ã‚¢ãƒƒãƒ—ロードã—よã†ã¨ã—ãŸãƒ‡ãƒ¼ã‚¿ã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚ [[Special:Upload/stash/$1|アップロードã®ãƒ•ã‚©ãƒ¼ãƒ ]]ã«æˆ»ã£ã¦å•é¡Œã‚’修正ã—ã¦ãã ã•ã„。',
'upload-proto-error' => 'ä¸æ­£ãªãƒ—ロトコル',
'upload-proto-error-text' => '外部アップロード機能ã§ã¯ã€<code>http://</code>ã‹<code>ftp://</code>ã§å§‹ã¾ã£ã¦ã„ã‚‹URLãŒå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
@@ -1799,6 +1880,7 @@ URLãŒæ­£ã—ã„ã‚‚ã®ã§ã‚ã‚‹ã‹ã€æŒ‡å®šã—ãŸã‚µã‚¤ãƒˆãŒç¾åœ¨ä½¿ç”¨å¯èƒ½ã
'listfiles_search_for' => 'メディアåã§æ¤œç´¢ï¼š',
'imgfile' => 'ファイル',
'listfiles' => 'ファイル一覧',
+'listfiles_thumb' => 'サムãƒã‚¤ãƒ«',
'listfiles_date' => '日時',
'listfiles_name' => 'åå‰',
'listfiles_user' => '利用者',
@@ -1913,8 +1995,8 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'statistics-edits' => '{{SITENAME}}ãŒç«‹ã¡ä¸ŠãŒã£ã¦ã‹ã‚‰ã®ç·¨é›†å›žæ•°ã®ç·è¨ˆ',
'statistics-edits-average' => '1ページã‚ãŸã‚Šã®ç·¨é›†å›žæ•°',
'statistics-views-total' => 'ç·é–²è¦§å›žæ•°',
+'statistics-views-total-desc' => '存在ã—ãªã„ページã¨ç‰¹åˆ¥ãƒšãƒ¼ã‚¸ã«å¯¾ã™ã‚‹é–²è¦§ã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“',
'statistics-views-peredit' => '閲覧回数ã«å¯¾ã™ã‚‹ç·¨é›†å›žæ•°ã®å‰²åˆ',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue ジョブ・キュー]ã®é•·ã•',
'statistics-users' => '[[Special:ListUsers|利用者]]',
'statistics-users-active' => '活動中ã®åˆ©ç”¨è€…',
'statistics-users-active-desc' => 'éŽåŽ»$1{{PLURAL:$1|日間}}ã«ä½•ã‚‰ã‹ã®æ“作を行ã£ãŸåˆ©ç”¨è€…',
@@ -1927,7 +2009,9 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
[[MediaWiki:Disambiguationspage]]ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚ŒãŸãƒ†ãƒ³ãƒ—レートを使用ã—ã¦ã„るページã¯ã€æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã¾ã™ã€‚",
'doubleredirects' => '二é‡è»¢é€',
-'doubleredirectstext' => 'ã“ã‚Œã¯ä»–ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒšãƒ¼ã‚¸ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¦ã„るページã®ä¸€è¦§ã§ã™ã€‚å„è¡Œã¯å§‹ç‚¹ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¨ãã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆãƒšãƒ¼ã‚¸ã€ãŠã‚ˆã³ã€ãã®ã¾ãŸãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¦ã„ã‚‹å…ˆã®ãƒšãƒ¼ã‚¸ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚3ã¤ç›®ã®ãƒšãƒ¼ã‚¸ãŒãŸã„ã¦ã„ã¯ã€ŒçœŸã®ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã§ã‚ã‚Šã€1ã¤ç›®ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¯ãã“を直接指ã™ã¹ãã§ã™ã€‚<s>打ã¡æ¶ˆã—ç·š</s>ã®ã¯ã„ã£ãŸé …ç›®ã¯æ—¢ã«ä¿®æ­£ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'doubleredirectstext' => 'ã“ã‚Œã¯ä»–ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã®ä¸€è¦§ã§ã™ã€‚
+å„è¡Œã«ã¯ã€æœ€åˆã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¨ã€ãã®è»¢é€å…ˆã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã€ãã®ã¾ãŸè»¢é€å…ˆã¸ã®ãƒªãƒ³ã‚¯ãŒè¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚多ãã®å ´åˆã€æœ€çµ‚ã®è»¢é€å…ˆãŒæ­£ã—ã„転é€å…ˆã§ã‚ã‚Šã€æœ€åˆã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¯ç›´æŽ¥æœ€å¾Œã®è»¢é€å…ˆã«å‘ã‘ã‚‹ã¹ãã§ã™ã€‚
+<del>打ã¡æ¶ˆã—ç·š</del>ã®ã¯ã„ã£ãŸé …ç›®ã¯æ—¢ã«ä¿®æ­£ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'double-redirect-fixed-move' => '[[$1]]ãŒç§»å‹•ã•ã‚Œã¦ã„ã¾ã™ã€‚
[[$2]]ã«è»¢é€ã•ã‚Œã¾ã™ã€‚',
'double-redirect-fixer' => '転é€ä¿®æ­£ä¿‚',
@@ -1951,6 +2035,8 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'nmembers' => '$1é …ç›®',
'nrevisions' => '$1版',
'nviews' => '$1回ã®é–²è¦§',
+'nimagelinks' => '$1ページã§ä½¿ç”¨',
+'ntransclusions' => '$1ページã§ä½¿ç”¨',
'specialpage-empty' => 'åˆè‡´ã™ã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。',
'lonelypages' => '孤立ã—ã¦ã„るページ',
'lonelypagestext' => '以下ã®ãƒšãƒ¼ã‚¸ã¯ã€{{SITENAME}}ã®ä»–ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã‚‚å‚照読ã¿è¾¼ã¿ã‚‚ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
@@ -2108,34 +2194,40 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'listgrouprights-removegroup-self-all' => '自身ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰å…¨ã‚°ãƒ«ãƒ¼ãƒ—を除去å¯èƒ½',
# E-mail user
-'mailnologin' => 'é€ä¿¡ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“',
-'mailnologintext' => 'ä»–ã®åˆ©ç”¨è€…å®›ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€[[Special:UserLogin|ログイン]]ã—ã€[[Special:Preferences|個人設定]]ã§æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
-'emailuser' => 'ã“ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡',
-'emailpage' => '利用者ã«ãƒ¡ãƒ¼ãƒ«é€ä¿¡',
-'emailpagetext' => '下ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’通ã˜ã¦ã€ã“ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+'mailnologin' => 'é€ä¿¡ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“',
+'mailnologintext' => 'ä»–ã®åˆ©ç”¨è€…å®›ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€[[Special:UserLogin|ログイン]]ã—ã€[[Special:Preferences|個人設定]]ã§æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'emailuser' => 'ã“ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡',
+'emailpage' => '利用者ã«ãƒ¡ãƒ¼ãƒ«é€ä¿¡',
+'emailpagetext' => '下ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’通ã˜ã¦ã€ã“ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
[[Special:Preferences|利用者ã®å€‹äººè¨­å®š]]ã§ç™»éŒ²ã—ãŸé›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒã€Œå·®å‡ºäººã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ã—ã¦è¡¨ç¤ºã•ã‚Œã€å—信者ã¯è¿”事を直接出ã›ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚',
-'usermailererror' => 'メールãŒä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸï¼š',
-'defemailsubject' => '{{SITENAME}} é›»å­ãƒ¡ãƒ¼ãƒ«',
-'noemailtitle' => 'メールアドレスãŒã‚ã‚Šã¾ã›ã‚“',
-'noemailtext' => 'ã“ã®åˆ©ç”¨è€…ã¯æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’登録ã—ã¦ã„ã¾ã›ã‚“。',
-'nowikiemailtitle' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ä¸è¨±å¯',
-'nowikiemailtext' => 'ã“ã®åˆ©ç”¨è€…ã¯ä»–ã®åˆ©ç”¨è€…ã‹ã‚‰ãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–らãªã„設定ã«ã—ã¦ã„ã¾ã™ã€‚',
-'email-legend' => '{{SITENAME}}ã®ä»–ã®åˆ©ç”¨è€…ã«é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹',
-'emailfrom' => '差出人:',
-'emailto' => '宛先:',
-'emailsubject' => '件å:',
-'emailmessage' => '本文:',
-'emailsend' => 'é€ä¿¡',
-'emailccme' => '自分宛ã«æŽ§ãˆã‚’é€ä¿¡ã™ã‚‹ã€‚',
-'emailccsubject' => '$1ã«é€ä¿¡ã—ãŸãƒ¡ãƒ¼ãƒ«ã®æŽ§ãˆï¼š$2',
-'emailsent' => 'メールをé€ã‚Šã¾ã—ãŸ',
-'emailsenttext' => 'メールã¯ç„¡äº‹é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚',
-'emailuserfooter' => 'ã“ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã¯$1ã‹ã‚‰$2ã¸ã€{{SITENAME}}ã®ã€Œåˆ©ç”¨è€…ã¸ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã€æ©Ÿèƒ½ã‚’使ã£ã¦é€ã‚‰ã‚Œã¾ã—ãŸã€‚',
+'usermailererror' => 'メールãŒä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸï¼š',
+'defemailsubject' => '{{SITENAME}} é›»å­ãƒ¡ãƒ¼ãƒ«',
+'usermaildisabled' => '利用者メール機能ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™',
+'usermaildisabledtext' => 'ã“ã®ã‚¦ã‚£ã‚­ä¸Šã§ä»–ã®åˆ©ç”¨è€…ã¸ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。',
+'noemailtitle' => 'メールアドレスãŒã‚ã‚Šã¾ã›ã‚“',
+'noemailtext' => 'ã“ã®åˆ©ç”¨è€…ã¯æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’登録ã—ã¦ã„ã¾ã›ã‚“。',
+'nowikiemailtitle' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ä¸è¨±å¯',
+'nowikiemailtext' => 'ã“ã®åˆ©ç”¨è€…ã¯ä»–ã®åˆ©ç”¨è€…ã‹ã‚‰ãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–らãªã„設定ã«ã—ã¦ã„ã¾ã™ã€‚',
+'email-legend' => '{{SITENAME}}ã®ä»–ã®åˆ©ç”¨è€…ã«é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹',
+'emailfrom' => '差出人:',
+'emailto' => '宛先:',
+'emailsubject' => '件å:',
+'emailmessage' => '本文:',
+'emailsend' => 'é€ä¿¡',
+'emailccme' => '自分宛ã«æŽ§ãˆã‚’é€ä¿¡ã™ã‚‹ã€‚',
+'emailccsubject' => '$1ã«é€ä¿¡ã—ãŸãƒ¡ãƒ¼ãƒ«ã®æŽ§ãˆï¼š$2',
+'emailsent' => 'メールをé€ã‚Šã¾ã—ãŸ',
+'emailsenttext' => 'メールã¯ç„¡äº‹é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚',
+'emailuserfooter' => 'ã“ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã¯$1ã‹ã‚‰$2ã¸ã€{{SITENAME}}ã®ã€Œåˆ©ç”¨è€…ã¸ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã€æ©Ÿèƒ½ã‚’使ã£ã¦é€ã‚‰ã‚Œã¾ã—ãŸã€‚',
+
+# User Messenger
+'usermessage-summary' => 'システムメッセージを残ã™ã€‚',
+'usermessage-editor' => 'システムメッセンジャー',
# Watchlist
'watchlist' => 'ウォッãƒãƒªã‚¹ãƒˆ',
'mywatchlist' => 'ウォッãƒãƒªã‚¹ãƒˆ',
-'watchlistfor' => "(利用者: '''$1''')",
+'watchlistfor2' => '利用者: $1 $2',
'nowatchlist' => 'ウォッãƒãƒªã‚¹ãƒˆã«é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“。',
'watchlistanontext' => 'ウォッãƒãƒªã‚¹ãƒˆã«å…¥ã£ã¦ã„る項目を表示ã¾ãŸã¯ç·¨é›†ã™ã‚‹ã«ã¯ã€$1ã—ã¦ãã ã•ã„。',
'watchnologin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
@@ -2174,8 +2266,8 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'changed' => '変更',
'created' => '作æˆ',
'enotif_subject' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$PAGETITLEã€ãŒ$PAGEEDITORã«ã‚ˆã£ã¦$CHANGEDORCREATEDã•ã‚Œã¾ã—ãŸ',
-'enotif_lastvisited' => '最後ã«é–²è¦§ã—ãŸå¾Œã«è¡Œãªã‚ã‚ŒãŸå…¨ã¦ã®ã®å¤‰æ›´ã¯ã€$1ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
-'enotif_lastdiff' => 'ã“ã®å¤‰æ›´å†…容を表示ã™ã‚‹ã«ã¯$1ã‚’ã”覧ãã ã•ã„。',
+'enotif_lastvisited' => '最後ã«é–²è¦§ã—ãŸå¾Œã«è¡Œãªã‚ã‚ŒãŸå…¨ã¦ã®å¤‰æ›´ã¯ã€ $1 ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
+'enotif_lastdiff' => 'ã“ã®å¤‰æ›´å†…容を表示ã™ã‚‹ã«ã¯ $1 ã‚’ã”覧ãã ã•ã„。',
'enotif_anon_editor' => '匿å利用者:$1',
'enotif_body' => '$WATCHINGUSERNAMEã•ã‚“
@@ -2195,9 +2287,14 @@ $NEWPAGE
{{SITENAME}}通知システム
--
-ウォッãƒãƒªã‚¹ãƒˆã®è¨­å®šã¯ã€{{fullurl:{{#special:Watchlist}}/edit}}ã§å¤‰æ›´ã§ãã¾ã™ã€‚
+メール通知ã®è¨­å®šã¯ã€æ¬¡ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰å¤‰æ›´ã—ã¦ãã ã•ã„。
+{{fullurl:{{#special:Preferences}}}}
+
+ウォッãƒãƒªã‚¹ãƒˆã®è¨­å®šã¯ã€æ¬¡ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰å¤‰æ›´ã—ã¦ä¸‹ã•ã„。
+{{fullurl:{{#special:Watchlist}}/edit}}
-ã“ã®ãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã™ã‚‹ã«ã¯$UNWATCHURLã‚’ã”覧ãã ã•ã„。
+ã“ã®ãƒšãƒ¼ã‚¸ã¯ã€æ¬¡ã®ãƒšãƒ¼ã‚¸ã§ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚
+$UNWATCHURL
ã”æ„見ã€ãŠå•ã„åˆã‚ã›ï¼š
{{fullurl:{{MediaWiki:Helppage}}}}',
@@ -2254,7 +2351,10 @@ $NEWPAGE
'revertpage-nouser' => '(利用者å削除)ã«ã‚ˆã‚‹ç·¨é›†ã‚’[[User:$1|$1]]ã«ã‚ˆã‚‹æœ€æ–°ç‰ˆã¸å·®ã—戻ã—ã¾ã—ãŸ',
'rollback-success' => '$1ã«ã‚ˆã‚‹ç·¨é›†ã‚’å·®ã—戻ã—ã¾ã—ãŸã€‚
$2ã«ã‚ˆã‚‹æœ€å¾Œã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
-'sessionfailure' => 'ログインã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+
+# Edit tokens
+'sessionfailure-title' => 'セッションã®å¤±æ•—',
+'sessionfailure' => 'ログインã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
セッション乗ã£å–りを防ããŸã‚ã«æ“作ã¯å–り消ã•ã‚Œã¾ã—ãŸã€‚
å‰ã®ãƒšãƒ¼ã‚¸ã¸æˆ»ã£ã¦å†åº¦èª­ã¿è¾¼ã‚“ã å¾Œã«ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。',
@@ -2390,19 +2490,23 @@ $1',
'month' => 'ã“れ以å‰ã®æœˆï¼š',
'year' => 'ã“れ以å‰ã®å¹´ï¼š',
-'sp-contributions-newbies' => 'æ–°è¦åˆ©ç”¨è€…ã®æŠ•ç¨¿ã®ã¿è¡¨ç¤º',
-'sp-contributions-newbies-sub' => 'æ–°è¦åˆ©ç”¨è€…ã®ã¿',
-'sp-contributions-newbies-title' => 'æ–°è¦åˆ©ç”¨è€…ã®æŠ•ç¨¿è¨˜éŒ²',
-'sp-contributions-blocklog' => 'ブロック記録',
-'sp-contributions-deleted' => '利用者ã®å‰Šé™¤ã•ã‚ŒãŸæŠ•ç¨¿è¨˜éŒ²',
-'sp-contributions-logs' => '記録',
-'sp-contributions-talk' => 'トーク',
-'sp-contributions-userrights' => '利用者権é™ã®ç®¡ç†',
-'sp-contributions-blocked-notice' => 'ã“ã®åˆ©ç”¨è€…ã¯ç¾åœ¨ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚
+'sp-contributions-newbies' => 'æ–°è¦åˆ©ç”¨è€…ã®æŠ•ç¨¿ã®ã¿è¡¨ç¤º',
+'sp-contributions-newbies-sub' => 'æ–°è¦åˆ©ç”¨è€…ã®ã¿',
+'sp-contributions-newbies-title' => 'æ–°è¦åˆ©ç”¨è€…ã®æŠ•ç¨¿è¨˜éŒ²',
+'sp-contributions-blocklog' => 'ブロック記録',
+'sp-contributions-deleted' => '利用者ã®å‰Šé™¤ã•ã‚ŒãŸæŠ•ç¨¿è¨˜éŒ²',
+'sp-contributions-uploads' => 'アップロード',
+'sp-contributions-logs' => '記録',
+'sp-contributions-talk' => 'トーク',
+'sp-contributions-userrights' => '利用者権é™ã®ç®¡ç†',
+'sp-contributions-blocked-notice' => 'ã“ã®åˆ©ç”¨è€…ã¯ç¾åœ¨ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚
å‚考ã®ãŸã‚ã«æœ€æ–°ã®ãƒ–ロック記録項目を以下ã«è¡¨ç¤ºã—ã¾ã™ï¼š',
-'sp-contributions-search' => '投稿ã®æ¤œç´¢',
-'sp-contributions-username' => 'IPアドレスã¾ãŸã¯åˆ©ç”¨è€…å:',
-'sp-contributions-submit' => '検索',
+'sp-contributions-blocked-notice-anon' => 'ã“ã®IPアドレスã¯ç¾åœ¨ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚
+å‚考ã®ãŸã‚ã«æœ€è¿‘ã®ãƒ–ロック記録項目を以下ã«è¡¨ç¤ºã—ã¾ã™ï¼š',
+'sp-contributions-search' => '投稿ã®æ¤œç´¢',
+'sp-contributions-username' => 'IPアドレスã¾ãŸã¯åˆ©ç”¨è€…å:',
+'sp-contributions-toponly' => '最新版ã®ç·¨é›†ã®ã¿ã‚’表示',
+'sp-contributions-submit' => '検索',
# What links here
'whatlinkshere' => 'リンク元',
@@ -2463,7 +2567,6 @@ $1',
'ipb-edit-dropdown' => 'ブロックç†ç”±ã‚’編集ã™ã‚‹',
'ipb-unblock-addr' => '$1ã®ãƒ–ロックを解除',
'ipb-unblock' => '利用者ã¾ãŸã¯IPアドレスã®ãƒ–ロックを解除ã™ã‚‹',
-'ipb-blocklist-addr' => '$1 ã«å¯¾ã™ã‚‹ç¾åœ¨æœ‰åŠ¹ãªãƒ–ロック',
'ipb-blocklist' => 'ç¾åœ¨æœ‰åŠ¹ãªãƒ–ロックを表示',
'ipb-blocklist-contribs' => '$1ã®æŠ•ç¨¿',
'unblockip' => 'ブロックを解除ã™ã‚‹',
@@ -2541,6 +2644,8 @@ $1ã¯ã€ã™ã§ã«ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚
'cant-block-while-blocked' => 'ブロック中ã¯ã€ä»–ã®åˆ©ç”¨è€…をブロックã§ãã¾ã›ã‚“。',
'cant-see-hidden-user' => '投稿ブロックã—よã†ã¨ã—ãŸåˆ©ç”¨è€…ã¯ã€æ—¢ã«ãƒ–ロックã•ã‚Œéš ã•ã‚Œã¦ã„ã¾ã™ã€‚
hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲覧ã¾ãŸã¯ç·¨é›†ã§ãã¾ã›ã‚“。',
+'ipbblocked' => '自身ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ä»–ã®åˆ©ç”¨è€…ã®ãƒ–ロックやブロック解除をã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“',
+'ipbnounblockself' => '自分自身ã«å¯¾ã™ã‚‹ãƒ–ロックを解除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“',
# Developer tools
'lockdb' => 'データベースã®ãƒ­ãƒƒã‚¯',
@@ -2575,6 +2680,17 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'''注æ„ï¼'''
よã閲覧ã•ã‚Œã‚‹ãƒšãƒ¼ã‚¸ã‚„ã€ä»–ã®å¤šãã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„るページを移動ã™ã‚‹ã¨äºˆæœŸã›ã¬çµæžœãŒèµ·ã“ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ページã®ç§»å‹•ã«ä¼´ã†å½±éŸ¿ã‚’よã考ãˆã¦ã‹ã‚‰è¸ã¿åˆ‡ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。",
+'movepagetext-noredirectfixer' => "下ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’利用ã™ã‚‹ã¨ã€ãƒšãƒ¼ã‚¸åãŒå¤‰æ›´ã•ã‚Œã€ãã®å±¥æ­´ã‚‚変更先ã¸ç§»å‹•ã—ã¾ã™ã€‚
+å¤ã„ページã¯å¤‰æ›´å…ˆã¸ã®è»¢é€ãƒšãƒ¼ã‚¸ã¨ãªã‚Šã¾ã™ã€‚
+自動的ãªä¿®æ­£ã‚’é¸æŠžã—ãªã„å ´åˆã¯ã€[[Special:DoubleRedirects|二é‡ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ]]ã‚„[[Special:BrokenRedirects|è¿·å­ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ]]を確èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+リンクを正ã—ã維æŒã™ã‚‹ã®ã¯ç§»å‹•ã—ãŸäººã®è²¬ä»»ã§ã™ã€‚
+
+移動先ãŒã™ã§ã«å­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ã€ãã®ãƒšãƒ¼ã‚¸ãŒç©ºã¾ãŸã¯ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã§ã€ã‹ã¤éŽåŽ»ã®ç‰ˆã‚’æŒãŸãªã„å ´åˆã‚’除ã„ã¦ç§»å‹•'''ã§ãã¾ã›ã‚“'''。
+ã¤ã¾ã‚Šã€é–“é•ãˆã¦ãƒšãƒ¼ã‚¸åを変更ã—ãŸå ´åˆã«ã¯å…ƒã«æˆ»ã›ã¾ã™ã€‚ã¾ãŸç§»å‹•ã«ã‚ˆã£ã¦æ—¢å­˜ã®ãƒšãƒ¼ã‚¸ã‚’上書ãã—ã¦ã—ã¾ã†ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
+
+'''注æ„ï¼'''
+よã閲覧ã•ã‚Œã‚‹ãƒšãƒ¼ã‚¸ã‚„ã€ä»–ã®å¤šãã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„るページを移動ã™ã‚‹ã¨äºˆæœŸã›ã¬çµæžœãŒèµ·ã“ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+ページã®ç§»å‹•ã«ä¼´ã†å½±éŸ¿ã‚’よã考ãˆã¦ã‹ã‚‰ç§»å‹•ã—ã¦ãã ã•ã„。",
'movepagetalktext' => '関連付ã‘られãŸãƒˆãƒ¼ã‚¯ãƒšãƒ¼ã‚¸ã¯ã€è‡ªå‹•çš„ã«ä¸€ç·’ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚ãŸã ã—ã“ã‚Œã¯ã€ä»¥ä¸‹ã®å ´åˆã‚’除ãã¾ã™ã€‚
* 空ã§ãªã„トークページãŒæ–°ã—ã„åå‰ã§å­˜åœ¨ã™ã‚‹å ´åˆ
* 下ã®ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ã‚’消ã—ãŸå ´åˆ
@@ -2632,6 +2748,7 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'immobile-source-page' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ç§»å‹•ã§ãã¾ã›ã‚“。',
'immobile-target-page' => '目的ã®ãƒšãƒ¼ã‚¸åã¸ã¯ç§»å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。',
'imagenocrossnamespace' => 'ファイルåå‰ç©ºé–“以外ã«ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’移動ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。',
+'nonfile-cannot-move-to-file' => 'ファイルã§ãªã„ã‚‚ã®ã‚’ã€ãƒ•ã‚¡ã‚¤ãƒ«åå‰ç©ºé–“ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“',
'imagetypemismatch' => 'æ–°ã—ã„ファイルã®æ‹¡å¼µå­ãŒãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ã‚¤ãƒ—ã¨ä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“。',
'imageinvalidfilename' => '対象ファイルåãŒä¸æ­£ã§ã™',
'fix-double-redirects' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãŒã‚ã‚Œã°ãã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’修正ã™ã‚‹',
@@ -2712,6 +2829,7 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'importstart' => 'ページをå–り込んã§ã„ã¾ã™ãƒ»ãƒ»ãƒ»',
'import-revision-count' => '$1版',
'importnopages' => 'å–り込むページãŒã‚ã‚Šã¾ã›ã‚“。',
+'imported-log-entries' => '$1件ã®{{PLURAL:$1|記録項目}}ã‚’å–ã‚Šè¾¼ã¿ã¾ã—ãŸã€‚',
'importfailed' => 'å–ã‚Šè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸï¼š<nowiki>$1</nowiki>',
'importunknownsource' => 'å–ã‚Šè¾¼ã¿å…ƒã®ã‚¿ã‚¤ãƒ—ãŒä¸æ˜Žã§ã™',
'importcantopen' => 'å–ã‚Šè¾¼ã¿ãƒ•ã‚¡ã‚¤ãƒ«ãŒé–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ',
@@ -2809,6 +2927,8 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'tooltip-upload' => 'アップロードを開始',
'tooltip-rollback' => '「巻ã戻ã—ã€ã¯ã€ã“ã®ãƒšãƒ¼ã‚¸ã®æœ€å¾Œã®ç·¨é›†è€…ã«ã‚ˆã‚‹ã“ã®ãƒšãƒ¼ã‚¸ã¸ã®ç·¨é›†ã‚’1クリックã§å·®ã—戻ã—ã¾ã™',
'tooltip-undo' => '「å–り消ã—ã€ã¯ã“ã®ç·¨é›†ã‚’å·®ã—戻ã—ã€ç·¨é›†ç”»é¢ã‚’プレビューをã¤ã‘ã¦é–‹ãã¾ã™ã€‚è¦ç´„欄ã«å–り消ã—ã®ç†ç”±ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
+'tooltip-preferences-save' => '設定をä¿å­˜',
+'tooltip-summary' => '短ã„è¦ç´„を入力ã—ã¦ãã ã•ã„',
# Stylesheets
'common.css' => '/* ã“ã“ã«æ›¸ã„ãŸCSSã¯ã™ã¹ã¦ã®å¤–装ã«å映ã•ã‚Œã¾ã™ */',
@@ -2935,19 +3055,22 @@ $1',
'nextdiff' => 'æ–°ã—ã„編集→',
# Media information
-'mediawarning' => "'''警告:''' ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ‚ªæ„ã®ã‚るコードをå«ã‚“ã§ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
-実行ã™ã‚‹ã¨ã‚³ãƒ³ãƒ”ューターãŒå±å®³ã‚’被る場åˆãŒã‚ã‚Šã¾ã™ã€‚",
+'mediawarning' => "'''警告:'''ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ‚ªæ„ã®ã‚るコードをå«ã‚“ã§ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
+実行ã™ã‚‹ã¨ã‚·ã‚¹ãƒ†ãƒ ãŒæ£„権ã«ã•ã‚‰ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚",
'imagemaxsize' => "ç”»åƒã®ã‚µã‚¤ã‚ºåˆ¶é™ï¼š<br />''(ファイルページã«å¯¾ã™ã‚‹ï¼‰''",
'thumbsize' => 'サムãƒã‚¤ãƒ«ã®å¤§ãã•ï¼š',
'widthheightpage' => '$1×$2ã€$3ページ',
-'file-info' => '(ファイルサイズ: $1, MIMEタイプ: $2)',
-'file-info-size' => '($1 × $2 ピクセル, ファイルサイズ: $3, MIMEタイプ: $4)',
+'file-info' => 'ファイルサイズ:$1ã€MIMEタイプ:$2',
+'file-info-size' => '$1×$2ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºï¼š$3ã€MIMEタイプ:$4',
'file-nohires' => '<small>高解åƒåº¦ç‰ˆã¯ã‚ã‚Šã¾ã›ã‚“。</small>',
-'svg-long-desc' => '(SVGファイル, $1 × $2 ピクセル, ファイルサイズ: $3)',
+'svg-long-desc' => 'SVGファイルã€$1×$2ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºï¼š$3',
'show-big-image' => '高解åƒåº¦ã§ã®ç”»åƒ',
'show-big-image-thumb' => '<small>ã“ã®ãƒ—レビューã®ã‚µã‚¤ã‚ºï¼š$1×$2ピクセル</small>',
'file-info-gif-looped' => 'ループã—ã¾ã™',
'file-info-gif-frames' => '$1フレーム',
+'file-info-png-looped' => 'ç¹°ã‚Šè¿”ã—',
+'file-info-png-repeat' => '$1回å†ç”Ÿã—ã¾ã—ãŸ',
+'file-info-png-frames' => '$1フレーム',
# Special:NewFiles
'newimages' => 'æ–°ã—ã„ファイルã®ã‚®ãƒ£ãƒ©ãƒªãƒ¼',
@@ -3117,6 +3240,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'GPSエリアå',
'exif-gpsdatestamp' => 'GPS測ä½æ—¥æ™‚',
'exif-gpsdifferential' => 'ディファレンシャル補正',
+'exif-objectname' => '短ã„タイトル',
# EXIF attributes
'exif-compression-1' => 'éžåœ§ç¸®',
@@ -3279,31 +3403,31 @@ Variants for Chinese language
'limitall' => 'ã™ã¹ã¦',
# E-mail address confirmation
-'confirmemail' => 'メールアドレスã®ç¢ºèª',
-'confirmemail_noemail' => '[[Special:Preferences|個人設定]]ã§æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。',
-'confirmemail_text' => '{{SITENAME}}ã§ã¯ã€ãƒ¡ãƒ¼ãƒ«æ©Ÿèƒ½ã‚’利用ã™ã‚‹å‰ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç¢ºèªãŒå¿…è¦ã§ã™ã€‚
+'confirmemail' => 'メールアドレスã®ç¢ºèª',
+'confirmemail_noemail' => '[[Special:Preferences|個人設定]]ã§æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'confirmemail_text' => '{{SITENAME}}ã§ã¯ã€ãƒ¡ãƒ¼ãƒ«æ©Ÿèƒ½ã‚’利用ã™ã‚‹å‰ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç¢ºèªãŒå¿…è¦ã§ã™ã€‚
以下ã®ãƒœã‚¿ãƒ³ã‚’押ã™ã¨ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ç¢ºèªãƒ¡ãƒ¼ãƒ«ãŒé€ã‚‰ã‚Œã¾ã™ã€‚
メールã«ã¯ç¢ºèªç”¨ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒªãƒ³ã‚¯ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚
ãã®ãƒªãƒ³ã‚¯ã‚’ブラウザーã§èª­ã¿è¾¼ã‚“ã§ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æ­£å½“性を確èªã—ã¦ãã ã•ã„。',
-'confirmemail_pending' => '確èªãƒ¡ãƒ¼ãƒ«ã¯æ—¢ã«é€ä¿¡ã•ã‚Œã¦ã„ã¾ã™ã€‚
+'confirmemail_pending' => '確èªãƒ¡ãƒ¼ãƒ«ã¯æ—¢ã«é€ä¿¡ã•ã‚Œã¦ã„ã¾ã™ã€‚
ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ãŸã°ã‹ã‚Šã§ã‚ã‚Œã°ã€ãƒ¡ãƒ¼ãƒ«ãŒå±Šãã¾ã§æ•°åˆ†ã»ã©å¾…ãŸãªã‘ã‚Œã°ãªã‚‰ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。',
-'confirmemail_send' => '確èªç”¨ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã™ã‚‹',
-'confirmemail_sent' => '確èªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚',
-'confirmemail_oncreate' => 'メールアドレスã®æ­£å½“性を確èªã™ã‚‹ãŸã‚ã®ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚“ã ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚
+'confirmemail_send' => '確èªç”¨ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã™ã‚‹',
+'confirmemail_sent' => '確èªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚',
+'confirmemail_oncreate' => 'メールアドレスã®æ­£å½“性を確èªã™ã‚‹ãŸã‚ã®ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚“ã ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚
ã“ã®ç¢ºèªã‚’è¡Œã‚ãªãã¦ã‚‚ログインã¯ã§ãã¾ã™ãŒã€ç¢ºèªã™ã‚‹ã¾ã§ãƒ¡ãƒ¼ãƒ«é€šçŸ¥ã®æ©Ÿèƒ½ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚',
-'confirmemail_sendfailed' => '{{SITENAME}}ã¯ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+'confirmemail_sendfailed' => '{{SITENAME}}ã¯ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
メールアドレスã«ä¸æ­£ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。
メールサーãƒãƒ¼ã‹ã‚‰ã®è¿”答:$1',
-'confirmemail_invalid' => '確èªç”¨ã‚³ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。
+'confirmemail_invalid' => '確èªç”¨ã‚³ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。
ã“ã®ã‚³ãƒ¼ãƒ‰ã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚',
-'confirmemail_needlogin' => 'メールアドレスを確èªã™ã‚‹ãŸã‚ã«$1ãŒå¿…è¦ã§ã™ã€‚',
-'confirmemail_success' => 'メールアドレスã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
+'confirmemail_needlogin' => 'メールアドレスを確èªã™ã‚‹ãŸã‚ã«$1ãŒå¿…è¦ã§ã™ã€‚',
+'confirmemail_success' => 'メールアドレスã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
[[Special:UserLogin|ログイン]]ã—ã¦ã‚¦ã‚£ã‚­ã‚’使用ã§ãã¾ã™ã€‚',
-'confirmemail_loggedin' => 'メールアドレスã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚',
-'confirmemail_error' => '確èªæƒ…報をä¿å­˜ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
-'confirmemail_subject' => '{{SITENAME}} メールアドレスã®ç¢ºèª',
-'confirmemail_body' => 'ã ã‚Œã‹ãŒã€IPアドレス$1ã‹ã‚‰ã€
+'confirmemail_loggedin' => 'メールアドレスã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚',
+'confirmemail_error' => '確èªæƒ…報をä¿å­˜ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'confirmemail_subject' => '{{SITENAME}} メールアドレスã®ç¢ºèª',
+'confirmemail_body' => 'ã ã‚Œã‹ãŒã€IPアドレス$1ã‹ã‚‰ã€
ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§{{SITENAME}}ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã€Œ$2ã€ã‚’登録ã—ã¾ã—ãŸã€‚
ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒæœ¬å½“ã«è‡ªåˆ†ã®ã‚‚ã®ã§ã‚ã‚‹ã‹ç¢ºèªã—ã¦ã€
@@ -3317,8 +3441,36 @@ $3
$5
ã“ã®ç¢ºèªç”¨ã‚³ãƒ¼ãƒ‰ã¯ã€$4ã«æœŸé™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚',
-'confirmemail_invalidated' => 'メールアドレスã®ç¢ºèªãŒä¸­æ­¢ã•ã‚Œã¾ã—ãŸ',
-'invalidateemail' => 'メールアドレスã®èªè¨¼ä¸­æ­¢',
+'confirmemail_body_changed' => 'ã ã‚Œã‹ãŒã€IPアドレス$1ã‹ã‚‰
+{{SITENAME}}ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã€Œ$2ã€ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚
+
+ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒæœ¬å½“ã«è‡ªåˆ†ã®ã‚‚ã®ã§ã‚ã‚‹ãªã‚‰ã°ã€
+{{SITENAME}}ã®ãƒ¡ãƒ¼ãƒ«æ©Ÿèƒ½ã‚’å†ã³æœ‰åŠ¹åŒ–ã«ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®URLをブラウザーã§é–‹ã„ã¦ãã ã•ã„:
+
+$3
+
+ã‚‚ã—自分ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ãªã„å ´åˆã¯ã€
+次ã®URLをブラウザーã§é–‹ã„ã¦ã€é›»å­ãƒ¡ãƒ¼ãƒ«ç¢ºèªã‚’中止ã—ã¦ãã ã•ã„:
+
+$5
+
+ã“ã®ç¢ºèªç”¨ã‚³ãƒ¼ãƒ‰ã¯$4ã«æœŸé™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚',
+'confirmemail_body_set' => 'ã ã‚Œã‹ãŒã€IPアドレス$1ã‹ã‚‰
+{{SITENAME}}ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã€Œ$2ã€ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«è¨­å®šã—ã¾ã—ãŸã€‚
+
+ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒæœ¬å½“ã«è‡ªåˆ†ã®ã‚‚ã®ã§ã‚ã‚‹ãªã‚‰ã°ã€
+{{SITENAME}}ã®ãƒ¡ãƒ¼ãƒ«æ©Ÿèƒ½ã‚’å†ã³æœ‰åŠ¹åŒ–ã«ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®URLをブラウザーã§é–‹ã„ã¦ãã ã•ã„:
+
+$3
+
+ã‚‚ã—自分ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ãªã„å ´åˆã¯ã€
+次ã®URLをブラウザーã§é–‹ã„ã¦ã€é›»å­ãƒ¡ãƒ¼ãƒ«ç¢ºèªã‚’中止ã—ã¦ãã ã•ã„:
+
+$5
+
+ã“ã®ç¢ºèªç”¨ã‚³ãƒ¼ãƒ‰ã¯$4ã«æœŸé™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚',
+'confirmemail_invalidated' => 'メールアドレスã®ç¢ºèªãŒä¸­æ­¢ã•ã‚Œã¾ã—ãŸ',
+'invalidateemail' => 'メールアドレスã®èªè¨¼ä¸­æ­¢',
# Scary transclusion
'scarytranscludedisabled' => '[ウィキ間ã®å‚照読ã¿è¾¼ã¿ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™]',
@@ -3362,6 +3514,7 @@ $1',
'table_pager_first' => '最åˆã®ãƒšãƒ¼ã‚¸',
'table_pager_last' => '最後ã®ãƒšãƒ¼ã‚¸',
'table_pager_limit' => '1ページã«$1項目を表示',
+'table_pager_limit_label' => 'ページã‚ãŸã‚Šã®é …目数:',
'table_pager_limit_submit' => '実行',
'table_pager_empty' => 'çµæžœãªã—',
@@ -3484,6 +3637,7 @@ $1',
'version-specialpages' => '特別ページ',
'version-parserhooks' => '構文解æžãƒ•ãƒƒã‚¯',
'version-variables' => '変数',
+'version-skins' => 'スキン',
'version-other' => 'ãã®ä»–',
'version-mediahandlers' => 'メディアãƒãƒ³ãƒ‰ãƒ©ãƒ¼',
'version-hooks' => 'フック',
@@ -3495,6 +3649,13 @@ $1',
'version-hook-subscribedby' => '使用個所',
'version-version' => '(ãƒãƒ¼ã‚¸ãƒ§ãƒ³$1)',
'version-license' => 'ライセンス',
+'version-poweredby-credits' => "ã“ã®ã‚¦ã‚£ã‚­ã¯ã€'''[http://www.mediawiki.org/ MediaWiki]'''(copyright © 2001-$1 $2)ã§å‹•ä½œã—ã¦ã„ã¾ã™ã€‚",
+'version-poweredby-others' => 'ãã®ä»–',
+'version-license-info' => 'MediaWikiã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚ã‚ãªãŸã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ã®ç™ºè¡Œã™ã‚‹GNU一般公衆利用許諾書 (GNU General Public License)(ãƒãƒ¼ã‚¸ãƒ§ãƒ³2ã€ã¾ãŸã¯ãれ以é™ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ï¼‰ã®è¦ç´„ã«ã‚‚ã¨ã¥ãã€ã“ã®ãƒ©ã‚¤ãƒ–ラリã®å†é…布や改変をã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€å•†ç”¨ã‚ã‚‹ã„ã¯ç‰¹å®šã®ç›®çš„ã«é©ã™ã‚‹ã‹ã©ã†ã‹ã‚‚å«ã‚ã¦ã€æš—黙的ã«ã‚‚ã€ä¸€åˆ‡ä¿è¨¼ã•ã‚Œã¾ã›ã‚“。詳ã—ãã¯ã€GNU一般公衆利用許諾書をã”覧下ã•ã„。
+
+ã‚ãªãŸã¯ã“ã®ãƒ—ログラムã¨å…±ã«ã€[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書ã®è¤‡è£½]ã‚’å—ã‘å–ã£ãŸã¯ãšã§ã™ã€‚ã‚‚ã—å—ã‘å–ã£ã¦ã„ãªã‘ã‚Œã°ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£(the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)ã¾ã§è«‹æ±‚ã™ã‚‹ã‹ã€[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html オンラインã§é–²è¦§]ã—ã¦ãã ã•ã„。',
'version-software' => 'インストール済ã¿ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢',
'version-software-product' => '製å“',
'version-software-version' => 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
@@ -3564,6 +3725,15 @@ $1',
'tags-edit' => '編集',
'tags-hitcount' => '$1回ã®å¤‰æ›´',
+# Special:ComparePages
+'comparepages' => 'ページã®æ¯”較',
+'compare-selector' => 'ページã®ç‰ˆã‚’比較',
+'compare-page1' => 'ページ1',
+'compare-page2' => 'ページ2',
+'compare-rev1' => '版1',
+'compare-rev2' => '版2',
+'compare-submit' => '比較ã™ã‚‹',
+
# Database error messages
'dberr-header' => 'å•é¡Œç™ºç”Ÿä¸­ã§ã™',
'dberr-problems' => '申ã—訳ã‚ã‚Šã¾ã›ã‚“ï¼
@@ -3581,8 +3751,13 @@ $1',
'htmlform-float-invalid' => '指定ã•ã‚ŒãŸå€¤ã¯æ•°å€¤ã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
'htmlform-int-toolow' => '指定ã•ã‚ŒãŸå€¤ãŒ$1ã®æœ€å°å€¤æœªæº€ã§ã™',
'htmlform-int-toohigh' => '指定ã•ã‚ŒãŸå€¤ãŒ$1ã®æœ€å¤§å€¤ã‚’超ãˆã¦ã„ã¾ã™',
+'htmlform-required' => 'ã“ã®å€¤ã¯å¿…è¦ã§ã™',
'htmlform-submit' => 'é€ä¿¡',
'htmlform-reset' => '変更をå–り消ã™',
'htmlform-selectorother-other' => 'ãã®ä»–',
+# SQLite database support
+'sqlite-has-fts' => '$1(全文検索ã‚り)',
+'sqlite-no-fts' => '$1(全文検索ãªã—)',
+
);
diff --git a/languages/messages/MessagesJut.php b/languages/messages/MessagesJut.php
index 0162ef6a..21b9709c 100644
--- a/languages/messages/MessagesJut.php
+++ b/languages/messages/MessagesJut.php
@@ -28,8 +28,7 @@ $messages = array(
'tog-editsection' => 'Redigær åfsnet ve hjælp åf [redigær]-henvesnenger',
'tog-editsectiononrightclick' => 'Redigær åfsnet ve at klikke på deres titler (JavaScript)',
'tog-showtoc' => 'Ves endholtsførtegnelse (i artikler ve mære end tre åfsnet)',
-'tog-rememberpassword' => 'Husk adgengskode til næste besÃ¸Ä frÃ¥ denne kompjuter',
-'tog-editwidth' => 'Redigærengsboksen har fuld bredde',
+'tog-rememberpassword' => 'Husk adgengskode til næste besÃ¸Ä frÃ¥ denne kompjuter (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Tilføj sider a åpretter til miin åvervågnengsliste',
'tog-watchdefault' => 'Tilføj sider a redigærer til miin åvervågnengsliste',
'tog-watchmoves' => 'Tilføj sider a flytter til miin åvervågnengsliste',
@@ -314,7 +313,7 @@ Førespørgsel: $2',
# Login and logout pages
'yourname' => 'Dit brugernav',
'yourpassword' => 'Din adgangskode',
-'remembermypassword' => 'Husk min adgangskode til næste gang.',
+'remembermypassword' => 'Husk min adgangskode til næste gang (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'LoÄ pÃ¥',
'nav-login-createaccount' => 'Ã…pret æ konto æller loÄ pÃ¥',
'loginprompt' => 'Du skal have cookies slÃ¥et til før at kunne loÄge pÃ¥ {{SITENAME}}.',
@@ -409,8 +408,6 @@ Du ken ekke bruge æ funksje 'e-mail til denne bruger' vemendre der er ångevet
'copyrightwarning' => "'''Husk: åpskrev engen websider, søm ekke tilhører dig selv, brug engen åphavsretsligt beskyttede værker uden tilladelse frå'n ejer!'''<br />
Du lover os hermed, at du selv '''har skrevet skrevselenger''', at skrevselenger tilhører ålmenheden, er ('''åpværer hus'''), æller at æ '''åphavsrets-endehaver''' har gevet sen '''tilladelse'''. Ves denne skrevselenger ålerede er åfentliggkort andre steder, skrev det venligst på æ diskusjesside.
<i>Bemærk venligst, at ål {{SITENAME}}-ertikler åtomatisk står under „$2“ (se $1 før lileskrevselenger). Ves du ekke vel, at dit arbejde her ændres og udbredes åf andre, så tryk ekke på „Gem“.</i>",
-'longpagewarning' => "'''ADVARSEL: Denne side er $1 kilobyte stor; nogle browsere ken have pårblæmer ve at redigære sider der nærmer sig æller er større end 32 kb.
-Åvervej æ side'm ken åpdeles i mendre dæle.'''",
'templatesused' => 'Skablåner der er brugt på denne side:',
'templatesusedpreview' => 'Følgende skablåner bruges åf denne ertikelførhåndsvesnenge:',
'template-protected' => '(skrevebeskyttet)',
@@ -631,7 +628,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
# Watchlist
'watchlist' => 'Åvervågnengsliste',
'mywatchlist' => 'Åvervågnengsliste',
-'watchlistfor' => "(før '''$1''')",
'addedwatch' => 'Tilføjet til din åvervågnengsliste',
'addedwatchtext' => "Æ side \"[[:\$1]]\" er blevet tilføjet til din [[Special:Watchlist|åvervågningsliste]]. Fremtidige ændrenger til denne side og den tilhørende diskusjeside hvil bleve listet der, og æ side hvil fremstå '''fremhævet''' i'n [[Special:RecentChanges|liste ve de seneste ændrenger]] før at gøre det lettere at finde den. Hves du senere hvilst fjerne'n side frå din åvervågningsliste, så klik \"Fjern åvervågnenge\".",
'removedwatch' => 'Fjernet frå åvervågnengsliste',
@@ -821,9 +817,9 @@ navn du harst valgt er ekke gyldegt. Vælg et andet navn.',
'nextdiff' => 'Gå til næste førskel →',
# Media information
-'file-info-size' => '($1 × $2 pixel, gøretstørrelse: $3, MIME-senenge: $4)',
+'file-info-size' => '$1 × $2 pixel, gøretstørrelse: $3, MIME-senenge: $4',
'file-nohires' => '<small>Engen højere åpløsnenge fundet.</small>',
-'svg-long-desc' => '(SVG gøret, wønetstørrelse $1 × $2 pixel, gøretstørrelse: $3)',
+'svg-long-desc' => 'SVG gøret, wønetstørrelse $1 × $2 pixel, gøretstørrelse: $3',
'show-big-image' => 'Hersenenge i større åpløsnenge',
'show-big-image-thumb' => '<small>Størrelse åf førhåndsvesnenge: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesJv.php b/languages/messages/MessagesJv.php
index 4107b7b6..22ab73d7 100644
--- a/languages/messages/MessagesJv.php
+++ b/languages/messages/MessagesJv.php
@@ -60,8 +60,7 @@ $messages = array(
'tog-editsection' => 'Fungsèkna panyuntingan sub-bagian ngliwati pranala [sunting]',
'tog-editsectiononrightclick' => 'Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (JavaScript)',
'tog-showtoc' => 'Tuduhna daftar isi (kanggo kaca sing nduwé luwih saka 3 sub-bagian)',
-'tog-rememberpassword' => 'Éling tembung sandi ing saben sési',
-'tog-editwidth' => 'Jembarna kothak suntingan nganti ukuran layar kebak',
+'tog-rememberpassword' => 'Émut tembung sandi kula ing peramban punika (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
'tog-watchcreations' => 'Tambahna kaca sing tak-gawé ing daftar pangawasan',
'tog-watchdefault' => 'Tambahna kaca sing tak-sunting ing daftar pangawasan',
'tog-watchmoves' => 'Tambahkan kaca sing tak-pindhah ing daftar pangawasan',
@@ -207,31 +206,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Tambah topik',
-'vector-action-delete' => 'Busak',
-'vector-action-move' => 'Pindhahna',
-'vector-action-protect' => 'Reksa',
-'vector-action-undelete' => 'Batalna pambusakan',
-'vector-action-unprotect' => 'Batalna pangreksan',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Pitulung',
-'vector-namespace-image' => 'Berkas',
-'vector-namespace-main' => 'Kaca',
-'vector-namespace-media' => 'Kaca media',
-'vector-namespace-mediawiki' => 'Pesen',
-'vector-namespace-project' => 'Kaca proyèk',
-'vector-namespace-special' => 'Kaca istiméwa',
-'vector-namespace-talk' => 'Dhiskusi',
-'vector-namespace-template' => 'Cithakan',
-'vector-namespace-user' => 'Kaca panganggo',
-'vector-view-create' => 'Gawé',
-'vector-view-edit' => 'Sunting',
-'vector-view-history' => 'Sajarah kaca',
-'vector-view-view' => 'Waca',
-'vector-view-viewsource' => 'Pirsani sumber',
-'actions' => 'Tindakan',
-'namespaces' => 'Ruang jeneng',
-'variants' => 'Varian',
+'vector-action-addsection' => 'Tambah topik',
+'vector-action-delete' => 'Busak',
+'vector-action-move' => 'Pindhahna',
+'vector-action-protect' => 'Reksa',
+'vector-action-undelete' => 'Batalna pambusakan',
+'vector-action-unprotect' => 'Batalna pangreksan',
+'vector-simplesearch-preference' => 'Aktifaken pamrayogi pamadosan ingkang kasampurnakaken (namung kulit vektor)',
+'vector-view-create' => 'Gawé',
+'vector-view-edit' => 'Sunting',
+'vector-view-history' => 'Sajarah kaca',
+'vector-view-view' => 'Waca',
+'vector-view-viewsource' => 'Pirsani sumber',
+'actions' => 'Tindakan',
+'namespaces' => 'Ruang jeneng',
+'variants' => 'Varian',
'errorpagetitle' => 'Kasalahan',
'returnto' => 'Bali menyang $1.',
@@ -292,6 +281,9 @@ Kakèhan panganggo sing nyoba mbukak kaca iki.
Entèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .
$1',
+'pool-timeout' => 'Kelangkung wekdal nengga kunci',
+'pool-queuefull' => 'Kempalan antrian kebak',
+'pool-errorunknown' => 'Kalepata ingkang mboten dipun mangertosi',
# 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' => 'Prakara {{SITENAME}}',
@@ -447,7 +439,8 @@ Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|pr
'yourname' => 'Asma pangangeman',
'yourpassword' => 'Tembung sandhi:',
'yourpasswordagain' => 'Balènana tembung sandhi',
-'remembermypassword' => 'Éling tembung sandhi',
+'remembermypassword' => 'Émut tembung sandi kula (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
+'securelogin-stick-https' => 'Tetep kahubung dhumateng HTTPS sasampunipun mlebet log',
'yourdomainname' => 'Dhomain panjenengan',
'externaldberror' => 'Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.',
'login' => 'Mlebu log',
@@ -464,6 +457,7 @@ Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|pr
'gotaccount' => "Wis kagungan akun? '''$1'''.",
'gotaccountlink' => 'Mlebu',
'createaccountmail' => 'liwat layang e-mail',
+'createaccountreason' => 'Alesan:',
'badretype' => 'Sandhi panjenengan ora gathuk',
'userexists' => 'Asma panganggo sing panjenengan pilih wis kanggo.
Mangga pilih asma liyané.',
@@ -484,6 +478,7 @@ Coba dipriksa manèh pasang aksarané, utawa [[Special:UserLogin/signup|gawé ak
'wrongpasswordempty' => 'Panjenengan ora milih tembung sandhi. Mangga dicoba manèh.',
'passwordtooshort' => 'Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.',
'password-name-match' => 'Tembung sandi panjenengan kudu béda karo jeneng panganggo panjenengan.',
+'password-login-forbidden' => 'Pangginaan nami panganggé lan sandi puniki sampun kapenggak.',
'mailmypassword' => 'Kirim tembung sandhi anyar',
'passwordremindertitle' => 'Pèngetan tembung sandhi saka {{SITENAME}}',
'passwordremindertext' => 'Ana wong (mbokmanawa panjenengan dhéwé, saka alamat IP $1) nyuwun supaya dikirimi tembung sandhi anyar kanggo {{SITENAME}} ($4). Tembung sandi sawetara kanggo panganggo "$2" wis digawé lan saiki "$3". Yèn panjenengan pancèn nggayuh iki, mangga énggal mlebu log lan ngganti tembung sandi saiki.
@@ -634,7 +629,7 @@ Log pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:',
'usercsspreview' => "'''Pèngeten yèn panjenengan namung mirsani pratilik CSS panjenengan.''''
'''Pratilik iku durung kasimpen!'''",
'userjspreview' => "'''Pèngeten yèn sing panjenengan pirsani namung pratilik JavaScript panjenengan, lan menawa pratilik iku dèrèng kasimpen!'''",
-'userinvalidcssjstitle' => "'''Pènget:''' Kulit \"\$1\" ora ditemokaké. Muga dipèngeti yèn kaca .css lan .js nggunakaké huruf cilik, conto {{ns:user}}:Foo/monobook.css lan dudu {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Pènget:''' Kulit \"\$1\" ora ditemokaké. Muga dipèngeti yèn kaca .css lan .js nggunakaké huruf cilik, conto {{ns:user}}:Foo/vector.css lan dudu {{ns:user}}:Foo/Vector.css.",
'updated' => '(Dianyari)',
'note' => "'''Cathetan:'''",
'previewnote' => "'''Mugi dipun-gatosaken bilih punika nembé awujud pratilik kémawon, dèrèng kasimpen!'''",
@@ -667,7 +662,6 @@ Panjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis
Menawa panjenengan ora kersa menawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />
Panjenengan uga janji menawa apa-apa sing katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
'copyrightwarning2' => "Mangga digatèkaké yèn kabèh kontribusi marang {{SITENAME}} bisa disunting, diowahi, utawa dibusak déning penyumbang liyané. Yèn panjenengan ora kersa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
-'longpagewarning' => "'''PÈNGET: Kaca iki dawané $1 kilobita; sawetara panjlajah wèb mbokmenawa ngalami masalah kanggo nyunting kaca sing dawané 32 kb utawa luwih. Muga digalih dhisik mbokmenawa kaca iki bisa dipérang dadi pirang-pirang kaca sing luwih cilik.'''",
'longpageerror' => "'''KALUPUTAN: Tèks sing panjenengan kirim gedhéné $1 kilobita, sing tegesé luwih gedhé tinimbang cacah maksimum $2 kilobita. Tèks iki ora bisa disimpen.'''",
'readonlywarning' => "'''PÈNGET: Basis data lagi dikunci amerga ana pangopènan, dadi saiki panjenengan ora bisa nyimpen kasil panyuntingan panjenengan. Panjenengan mbokmenawa prelu mindhahaké kasil panyuntingan panjenengan iki menyang panggonan liya kanggo disimpen bésuk.'''
@@ -1073,7 +1067,9 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
'prefs-advancedrendering' => 'Opsi lanjutan',
'prefs-advancedsearchoptions' => 'Opsi lanjutan',
'prefs-advancedwatchlist' => 'Opsi lanjutan',
-'prefs-display' => 'Opsi tampilan',
+'prefs-displayrc' => 'Opsi tampilan',
+'prefs-displaysearchoptions' => 'Opsi tampilan',
+'prefs-displaywatchlist' => 'Opsi tampilan',
'prefs-diffs' => 'Prabédan',
# User rights
@@ -1179,7 +1175,6 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
'right-siteadmin' => 'Kunci lan buka kunci basis data',
'right-reset-passwords' => 'Setèl ulang tembung sandi panganggo liya',
'right-override-export-depth' => "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
-'right-versiondetail' => 'Tuduhaké informasi vèrsi piranti alus sing luwih pepak',
'right-sendemail' => 'Ngirim layang listrik (e-mail) menyang panganggo liya',
# User rights log
@@ -1230,14 +1225,9 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
'recentchanges-legend' => 'Pilihan owah-owahan pungkasan',
'recentchangestext' => 'Runutna owah-owahan pungkasan ing wiki iki ing kaca iki.',
'recentchanges-feed-description' => "Urutna owah-owahan anyar ing wiki ing ''feed'' iki.",
-'recentchanges-label-legend' => 'Katrangan: $1.',
-'recentchanges-legend-newpage' => '$1 - kaca anyar',
'recentchanges-label-newpage' => 'Suntingan iki gawé kaca anyar',
-'recentchanges-legend-minor' => '$1 - suntingan sithik',
'recentchanges-label-minor' => 'Iki suntingan sithik',
-'recentchanges-legend-bot' => '$1 - suntingan bot',
'recentchanges-label-bot' => 'Suntingan iki diayahi déning bot',
-'recentchanges-legend-unpatrolled' => '$1 - suntingan ora kapatroli',
'recentchanges-label-unpatrolled' => 'Suntingan iki durung dipatroli',
'rcnote' => 'Ing ngisor iki kapacak {{PLURAL:$1|pangowahan|owah-owahan}} pungkasan ing <strong>$2</strong> dina pungkasan ing $5, $4.',
'rcnotefrom' => 'Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).',
@@ -1338,7 +1328,6 @@ mbalik lan gunakna jeneng liya.
Yèn isih ngersakaké ngunggahaké, mangga berkas diunggahaké manèh mawa jeneng liya. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Berkas iki duplikat utawa padha karo {{PLURAL:$1|berkas|berkas-berkas}} ing ngisor:',
'file-deleted-duplicate' => 'Sawijining berkas persis berkas iki ([[:$1]]) wis tau dibusak. Mangga panjenengan priksani sajarah pambusakan berkas kasebut sadurungé nerusaké ngunggahaké berkas kuwi manèh.',
-'successfulupload' => 'Kasil diamot',
'uploadwarning' => 'Pèngetan pangunggahan berkas',
'savefile' => 'Simpen berkas',
'uploadedimage' => 'gambar "[[$1]]" kaunggahaké',
@@ -1364,6 +1353,11 @@ Mangga priksanen $1 sadurungé ngunggahaké berkas iku manèh.',
Panjenengan kudu nggalih perlu utawa ora mbanjuraké pangunggahan berkas ini.
Log pambusakan berkas iki kaya mangkéné:",
'filename-bad-prefix' => "Jeneng berkas sing panjenengan unggahaké, diawali mawa '''\"\$1\"''', sing sawijining jeneng non-dèskriptif sing biasané diwènèhaké sacara otomatis déning kamera digital. Mangga milih jeneng liyané sing luwih dèskriptif kanggo berkas panjenengan.",
+'upload-success-subj' => 'Kasil diamot',
+'upload-failure-msg' => 'Ana prakara karo pangunggahan panjenengan seka [$2]:
+$1',
+'upload-warning-subj' => 'Pèngetan pangunggahan berkas',
+'upload-warning-msg' => 'Ana masalah ing pangunggahan panjenengan saka [$2]. Panjenengan bisa bali menyang [[Special:Upload/stash/$1|upload form]] kanggo mrantasi masalah iki',
'upload-proto-error' => 'Protokol ora bener',
'upload-proto-error-text' => 'Pangunggahan jarah adoh mbutuhaké URL sing diawali karo <code>http://</code> utawa <code>ftp://</code>.',
@@ -1518,7 +1512,6 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
'statistics-edits-average' => 'Rata-rata suntingan saben kaca',
'statistics-views-total' => 'Gunggung panampilan kaca',
'statistics-views-peredit' => 'Gunggung/cacahing panampilan saben suntingan',
-'statistics-jobqueue' => 'Dawaning [http://www.mediawiki.org/wiki/Manual:Job_queue antrian pegawéan]',
'statistics-users' => 'Gunggung [[Special:ListUsers|panganggo kadaftar]]',
'statistics-users-active' => 'Para panganggo aktif',
'statistics-users-active-desc' => 'Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan',
@@ -1531,9 +1524,9 @@ Kaca-kaca iku sajatiné kuduné nyambung menyang topik-topik sing bener.<br />
Sawijining kaca dianggep minangka kaca disambiguasi yèn kaca iku nganggo cithakan sing nyambung menyang [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'Pangalihan dobel',
-'doubleredirectstext' => 'Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.
+'doubleredirectstext' => 'Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.
Saben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing "sajatiné", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.
-Jeneng sing wis <s>dicorèk</s> tegesé wis rampung didandani.',
+Jeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.',
'double-redirect-fixed-move' => '[[$1]] wis kapindhahaké, saiki dadi kaca peralihan menyang [[$2]]',
'double-redirect-fixer' => 'Révisi pangalihan',
@@ -1718,6 +1711,7 @@ Informasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki
Alamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi panjenengan]] bakal dadi alamat "Saka" jroning layang-e kasebut, mula panampa layang-e bakal bisa mbalesi langsung menyang panjenengan.',
'usermailererror' => 'Kaluputan obyèk layang:',
'defemailsubject' => 'Layang e-mail {{SITENAME}}',
+'usermaildisabled' => 'E-mail panganggo dinonaktifaké',
'noemailtitle' => 'Ora ana alamat layang e-mail',
'noemailtext' => 'Panganggo iki ora mènèhi alamat layang-e sing absah.',
'nowikiemailtitle' => 'Layang-e ora diidinaké',
@@ -1737,7 +1731,7 @@ Alamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi
# Watchlist
'watchlist' => 'Daftar artikel pilihan',
'mywatchlist' => 'Daftar pangawasanku',
-'watchlistfor' => "(kanggo '''$1''')",
+'watchlistfor2' => 'Kanggo $1 $2',
'nowatchlist' => 'Daftar pangawasan panjenengan kosong.',
'watchlistanontext' => 'Mangga $1 kanggo mirsani utawa nyunting daftar pangawasan panjenengan.',
'watchnologin' => 'Durung mlebu log',
@@ -1849,7 +1843,10 @@ Suntingan pungkasan dilakoni déning [[User:$3|$3]] ([[User talk:$3|Wicara]]{{in
'revertpage' => 'Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dipunwangsulaken dhateng ing vèrsi pungkasan déning [[User:$1|$1]]',
'rollback-success' => 'Suntingan dibalèkaké déning $1;
diowahi bali menyang vèrsi pungkasan déning $2.',
-'sessionfailure' => 'Katoné ana masalah karo sèsi log panjenengan; log panjenengan wis dibatalaké kanggo nyegah pambajakan. Mangga mencèt tombol "back" lan unggahaké manèh kaca sadurungé mlebu log, lan coba manèh.',
+
+# Edit tokens
+'sessionfailure-title' => 'Sèsi gagal',
+'sessionfailure' => 'Katoné ana masalah karo sèsi log panjenengan; log panjenengan wis dibatalaké kanggo nyegah pambajakan. Mangga mencèt tombol "back" lan unggahaké manèh kaca sadurungé mlebu log, lan coba manèh.',
# Protect
'protectlogpage' => 'Log pangreksan',
@@ -2052,7 +2049,6 @@ Pirsani [[Special:IPBlockList|Daftar blokir IP]] kanggo ninjo ulang pamblokiran.
'ipb-edit-dropdown' => 'Sunting alesan pamblokiran',
'ipb-unblock-addr' => 'Ilangna blokir $1',
'ipb-unblock' => 'Ilangna blokir sawijining panganggo utawa alamat IP',
-'ipb-blocklist-addr' => 'Blokir sing dipatrapaké kanggo $1',
'ipb-blocklist' => 'Ndeleng blokir sing lagi ditrapaké',
'ipb-blocklist-contribs' => 'Kontribusi kanggo $1',
'unblockip' => 'Jabel blokir marang alamat IP utawa panganggo',
@@ -2459,10 +2455,10 @@ $1',
'imagemaxsize' => "Wates ukuran gambar:<br />''(kanggo kaca dhèskripsi berkas)''",
'thumbsize' => 'Ukuran gambar cilik (thumbnail):',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|kaca|kaca}}',
-'file-info' => '(ukuran berkas: $1, tipe MIME: $2)',
-'file-info-size' => '($1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4)',
+'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
+'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
'file-nohires' => '<small>Ora ana résolusi sing luwih dhuwur.</small>',
-'svg-long-desc' => '(Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3)',
+'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3',
'show-big-image' => 'Résolusi kebak',
'show-big-image-thumb' => '<small>Ukuran pratayang iki: $1 × $2 piksel</small>',
'file-info-gif-looped' => 'mubeng',
@@ -2984,6 +2980,14 @@ Katrangan tampilan:
'tags-edit' => 'sunting',
'tags-hitcount' => '$1 {{PLURAL:$1|pangowahan|pangowahan}}',
+# Special:ComparePages
+'comparepages' => 'Bandhingna kaca',
+'compare-selector' => 'Bandhingna révisi kaca',
+'compare-page1' => 'Kaca 1',
+'compare-page2' => 'Kaca 2',
+'compare-rev1' => 'Révisi 1',
+'compare-rev2' => 'Révisi 2',
+
# Database error messages
'dberr-header' => 'Wiki iki duwé masalah',
'dberr-problems' => 'Nyuwun ngapura! Situs iki ngalami masalah tèknis.',
diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php
index d4b27fc5..5659a203 100644
--- a/languages/messages/MessagesKa.php
+++ b/languages/messages/MessagesKa.php
@@ -8,10 +8,12 @@
* @file
*
* @author Alsandro
+ * @author Andrijko Z.
* @author BRUTE
* @author Dato deutschland
* @author David1010
* @author Dawid Deutschland
+ * @author ITshnik
* @author Malafaya
* @author Reedy
* @author Sopho
@@ -25,8 +27,8 @@ $namespaceNames = array(
NS_MEDIA => 'მედიáƒ',
NS_SPECIAL => 'სპეციáƒáƒšáƒ£áƒ áƒ˜',
NS_TALK => 'გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
- NS_USER => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი',
- NS_USER_TALK => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
+ NS_USER => 'მáƒáƒœáƒáƒ¬áƒ˜áƒšáƒ”',
+ NS_USER_TALK => 'მáƒáƒœáƒáƒ¬áƒ˜áƒšáƒ˜áƒ¡_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
NS_PROJECT_TALK => '$1_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
NS_FILE => 'ფáƒáƒ˜áƒšáƒ˜',
NS_FILE_TALK => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
@@ -42,12 +44,14 @@ $namespaceNames = array(
$namespaceAliases = array(
'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_USER_TALK,
- 'სურáƒáƒ—ი' => NS_FILE,
- 'სურáƒáƒ—ი_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_FILE_TALK,
- 'მედიáƒáƒ•áƒ˜áƒ™áƒ˜_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_MEDIAWIKI_TALK,
- 'თáƒáƒ áƒ’ი_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_TEMPLATE_TALK,
- 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_HELP_TALK,
- 'კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_CATEGORY_TALK,
+ 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი' => NS_USER,
+ 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_USER_TALK,
+ 'სურáƒáƒ—ი' => NS_FILE,
+ 'სურáƒáƒ—ი_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_FILE_TALK,
+ 'მედიáƒáƒ•áƒ˜áƒ™áƒ˜_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_MEDIAWIKI_TALK,
+ 'თáƒáƒ áƒ’ი_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_TEMPLATE_TALK,
+ 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_HELP_TALK,
+ 'კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ_გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
@@ -103,9 +107,10 @@ $magicWords = array(
'redirect' => array( '0', '#გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ', '#REDIRECT' ),
'nogallery' => array( '0', '__უგáƒáƒšáƒ”რეáƒ__', '__NOGALLERY__' ),
'subst' => array( '0', 'მიდგმ:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'მინიáƒáƒ¢áƒ˜áƒ£áƒ áƒ', 'მინი', 'thumbnail', 'thumb' ),
+ 'img_thumbnail' => array( '1', 'მინიáƒáƒ¢áƒ˜áƒ£áƒ áƒ', 'მინი', 'მინიáƒáƒ¡áƒšáƒ˜', 'ცერáƒáƒ“ენáƒ', 'thumbnail', 'thumb' ),
'img_right' => array( '1', 'მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ•', 'right' ),
'img_left' => array( '1', 'მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ•', 'left' ),
+ 'img_width' => array( '1', '$1პქ', '$1px' ),
'img_center' => array( '1', 'ცენტრი', 'center', 'centre' ),
);
@@ -128,8 +133,7 @@ $messages = array(
'tog-editsection' => 'სექციის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ნებáƒáƒ áƒ—ვრ[რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული] ბმულების გáƒáƒ•áƒšáƒ˜áƒ—',
'tog-editsectiononrightclick' => 'სექციის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ნებáƒáƒ áƒ—ვრმáƒáƒ áƒ¯áƒ•áƒ”ნრღილáƒáƒ™áƒ–ე დáƒáƒ­áƒ”რით<br />სექციის სáƒáƒ—áƒáƒ£áƒ áƒ”ბზე (ჯáƒáƒ•áƒáƒ¡áƒ™áƒ áƒ˜áƒžáƒ¢áƒ˜)',
'tog-showtoc' => 'áƒáƒ©áƒ•áƒ”ნე სáƒáƒ áƒ©áƒ”ვი (სáƒáƒ› ქვესáƒáƒ—áƒáƒ£áƒ áƒ–ე მეტის მქáƒáƒœáƒ” გვერდებისთვის)',
-'tog-rememberpassword' => 'სესიებს შáƒáƒ áƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბáƒ',
-'tog-editwidth' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის დáƒáƒ¤áƒáƒ¡ სრული სიგáƒáƒœáƒ” áƒáƒ¥áƒ•áƒ¡',
+'tog-rememberpassword' => 'დáƒáƒ›áƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ” áƒáƒ› კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რზე (მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღე|დღე}})',
'tog-watchcreations' => 'დáƒáƒáƒ›áƒáƒ¢áƒ” ჩემი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¡ ჩემს მიერ შექმნილი გვერდები',
'tog-watchdefault' => 'დáƒáƒáƒ›áƒáƒ¢áƒ” ჩემი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¡ ჩემს მიერ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული გვერდები',
'tog-watchmoves' => 'ჩáƒáƒ¡áƒ•áƒ˜ გვერდები, რáƒáƒ›áƒšáƒ”ბიც მე გáƒáƒ“áƒáƒ›áƒáƒ¥áƒ•áƒ¡, ჩემს კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜',
@@ -275,31 +279,21 @@ $messages = array(
'faqpage' => 'Project:ხშირი შეკითხვები',
# Vector skin
-'vector-action-addsection' => 'თემის ჩáƒáƒ›áƒáƒ¢áƒ”ბáƒ',
-'vector-action-delete' => 'წáƒáƒ¨áƒšáƒ',
-'vector-action-move' => 'გáƒáƒ“áƒáƒ¢áƒáƒœáƒ',
-'vector-action-protect' => 'დáƒáƒªáƒ•áƒ',
-'vector-action-undelete' => 'áƒáƒ¦áƒ“გენáƒ',
-'vector-action-unprotect' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ',
-'vector-namespace-category' => 'კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ',
-'vector-namespace-help' => 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბის გვერდი',
-'vector-namespace-image' => 'ფáƒáƒ˜áƒšáƒ˜',
-'vector-namespace-main' => 'გვერდი',
-'vector-namespace-media' => 'მედირგვერდი',
-'vector-namespace-mediawiki' => 'შეტყáƒáƒ‘ინებáƒ',
-'vector-namespace-project' => 'პრáƒáƒ”ქტის გვერდი',
-'vector-namespace-special' => 'სპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდი',
-'vector-namespace-talk' => 'გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
-'vector-namespace-template' => 'თáƒáƒ áƒ’ი',
-'vector-namespace-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდი',
-'vector-view-create' => 'შექმნáƒ',
-'vector-view-edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'vector-view-history' => 'ისტáƒáƒ áƒ˜áƒ',
-'vector-view-view' => 'შემáƒáƒ¬áƒ›áƒ”ბული სტáƒáƒ¢áƒ˜áƒ',
-'vector-view-viewsource' => 'წყáƒáƒ áƒáƒ¡ ხილვáƒ',
-'actions' => 'მáƒáƒ¥áƒ›áƒ”დებები',
-'namespaces' => 'სáƒáƒ®áƒ”ლთრსივრცე',
-'variants' => 'ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბი',
+'vector-action-addsection' => 'თემის ჩáƒáƒ›áƒáƒ¢áƒ”ბáƒ',
+'vector-action-delete' => 'წáƒáƒ¨áƒšáƒ',
+'vector-action-move' => 'გáƒáƒ“áƒáƒ¢áƒáƒœáƒ',
+'vector-action-protect' => 'დáƒáƒªáƒ•áƒ',
+'vector-action-undelete' => 'áƒáƒ¦áƒ“გენáƒ',
+'vector-action-unprotect' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ',
+'vector-simplesearch-preference' => 'ძებნის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული მინიშნებების ჩáƒáƒ áƒ—ვრ(მხáƒáƒšáƒáƒ“ ვექტáƒáƒ áƒ£áƒšáƒ˜ იერსáƒáƒ®áƒ˜áƒ¡áƒ—ვის)',
+'vector-view-create' => 'შექმნáƒ',
+'vector-view-edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+'vector-view-history' => 'ისტáƒáƒ áƒ˜áƒ',
+'vector-view-view' => 'შემáƒáƒ¬áƒ›áƒ”ბული სტáƒáƒ¢áƒ˜áƒ',
+'vector-view-viewsource' => 'წყáƒáƒ áƒáƒ¡ ხილვáƒ',
+'actions' => 'მáƒáƒ¥áƒ›áƒ”დებები',
+'namespaces' => 'სáƒáƒ®áƒ”ლთრსივრცე',
+'variants' => 'ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბი',
'errorpagetitle' => 'შეცდáƒáƒ›áƒ',
'returnto' => 'დáƒáƒ‘რუნდი $1-ზე.',
@@ -360,6 +354,9 @@ $messages = array(
გთხáƒáƒ•áƒ— დáƒáƒ”ლáƒáƒ“áƒáƒ— დრგáƒáƒ˜áƒ›áƒ”რáƒáƒ— მáƒáƒ—ხáƒáƒ•áƒœáƒ ცáƒáƒ¢áƒ მáƒáƒ’ვიáƒáƒœáƒ”ბით.
$1',
+'pool-timeout' => 'ბლáƒáƒ™áƒ˜áƒ áƒ”ბის ლáƒáƒ“ინის დრრáƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ',
+'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}}-ის შესáƒáƒ®áƒ”ბ',
@@ -524,7 +521,8 @@ $2',
'yourname' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი:',
'yourpassword' => 'პáƒáƒ áƒáƒšáƒ˜:',
'yourpasswordagain' => 'ხელმეáƒáƒ áƒ”დ შეიყვáƒáƒœáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
-'remembermypassword' => 'დáƒáƒ›áƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”',
+'remembermypassword' => 'დáƒáƒ›áƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ” áƒáƒ› კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რზე (მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღე}})',
+'securelogin-stick-https' => 'გáƒáƒáƒ’რძელეთ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ HTTPS-თáƒáƒœ შესვლის შემდეგ',
'yourdomainname' => 'თქვენი დáƒáƒ›áƒ”ნი',
'externaldberror' => 'სáƒáƒ’áƒáƒ áƒ”რმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ£áƒ¢áƒ”ნტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒáƒ, áƒáƒœ თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ უფლებები სáƒáƒ’áƒáƒ áƒ”რáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ცვლილებების შესáƒáƒ¢áƒáƒœáƒáƒ“.',
'login' => 'შესვლáƒ',
@@ -541,6 +539,7 @@ $2',
'gotaccount' => "უკვე რეგისტრირებული ხáƒáƒ áƒ—? '''$1'''",
'gotaccountlink' => 'შესვლáƒ',
'createaccountmail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ—',
+'createaccountreason' => 'მიზეზი:',
'badretype' => 'თქვენს მიერ შეყვáƒáƒœáƒ˜áƒšáƒ˜ პáƒáƒ áƒáƒšáƒ”ბი ერთმáƒáƒœáƒ”თს áƒáƒ  ემთხვევáƒ.',
'userexists' => 'შეყვáƒáƒœáƒ˜áƒšáƒ˜ სáƒáƒ®áƒ”ლი უკვე გáƒáƒ›áƒáƒ§áƒ”ნებულიáƒ. გთხáƒáƒ•áƒ— áƒáƒ˜áƒ áƒ©áƒ˜áƒáƒ— სხვრსáƒáƒ®áƒ”ლი.',
'loginerror' => 'შეცდáƒáƒ›áƒ შესვლáƒáƒ¨áƒ˜',
@@ -561,6 +560,7 @@ $2',
'passwordtooshort' => 'შეტáƒáƒœáƒ˜áƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”áƒ.
იგი უნდრშეიცáƒáƒ•áƒ“ეს მინიმუმ $1 სიმბáƒáƒšáƒáƒ¡.',
'password-name-match' => 'შეტáƒáƒœáƒ˜áƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜ უნდრგáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ“ებáƒáƒ“ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლისგáƒáƒœ.',
+'password-login-forbidden' => 'áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლისრდრპáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ.',
'mailmypassword' => 'áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ’ზáƒáƒ•áƒœáƒ',
'passwordremindertitle' => 'áƒáƒ®áƒáƒšáƒ˜ დრáƒáƒ”ბითი პáƒáƒ áƒáƒšáƒ˜ {{SITENAME}}-თვის',
'passwordremindertext' => "ვიღáƒáƒªáƒáƒ› (შესáƒáƒ«áƒšáƒáƒ თქვენ, IP მისáƒáƒ›áƒáƒ áƒ—ით $1) მáƒáƒ˜áƒ—ხáƒáƒ•áƒ
@@ -604,6 +604,9 @@ $1 სáƒáƒáƒ—ში.',
'loginlanguagelabel' => 'ენáƒ: $1',
'suspicious-userlogout' => 'თქვენი მáƒáƒ—ხáƒáƒ•áƒœáƒ გáƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ გáƒáƒ£áƒ¥áƒ›áƒ”ბულიáƒ, რáƒáƒ“გáƒáƒœáƒáƒª იგი გáƒáƒ•áƒ¡ ქეშირებáƒáƒ“ი პრáƒáƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒœ áƒáƒ áƒáƒ™áƒáƒ áƒ”ქტული ბრáƒáƒ£áƒ–ერის მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ¡.',
+# E-mail sending
+'php-mail-error-unknown' => 'áƒáƒ›áƒáƒ£áƒªáƒœáƒáƒ‘ი შეცდáƒáƒ›áƒ PHP-ის mail() ფუნქციáƒáƒ¨áƒ˜',
+
# Password reset dialog
'resetpass' => 'შეცვáƒáƒšáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
'resetpass_announce' => 'თქვენ შემáƒáƒ®áƒ•áƒ”დით დრáƒáƒ”ბით ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ კáƒáƒ“ით. რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბისთვის, უნდრშექმნáƒáƒ— áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜ áƒáƒ¥:',
@@ -655,10 +658,11 @@ $1 სáƒáƒáƒ—ში.',
'showlivepreview' => 'შáƒáƒ•áƒ˜ ნიმუში',
'showdiff' => 'ცვლილებების ჩვენებáƒ',
'anoneditwarning' => "'''გáƒáƒ¤áƒ áƒ—ხილებáƒ:''' თქვენ áƒáƒ  ხáƒáƒ áƒ— რეგისტრირებული. თქვენი IP მისáƒáƒ›áƒáƒ áƒ—ი ჩáƒáƒ˜áƒ¬áƒ”რებრáƒáƒ› გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜.",
+'anonpreviewwarning' => "''თქვენ áƒáƒ  შესულხáƒáƒ áƒ— სისტემáƒáƒ¨áƒ˜. თქვენი IP მისáƒáƒ›áƒáƒ áƒ—ი შეინáƒáƒ®áƒ”ბრგვერდის ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜. ''",
'missingsummary' => "'''შეხსენებáƒ:''' თქვენ áƒáƒ  მიგითითებიáƒáƒ— რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის რეზიუმე.
თუ ისევ დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”ბთ შენáƒáƒ®áƒ•áƒáƒ–ე, თქვენი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრრეზიუმეს გáƒáƒ áƒ”შე დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ“ებáƒ.",
'missingcommenttext' => 'გთხáƒáƒ•áƒ— კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ შეიყვáƒáƒœáƒáƒ— ქვემáƒáƒ—.',
-'missingcommentheader' => "'''შეხსენებáƒ:''' თქვენ áƒáƒ› კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡áƒ—ვის სáƒáƒ—áƒáƒ£áƒ áƒ˜/თემრáƒáƒ  მიგითითებიáƒáƒ—. თუ შენáƒáƒ®áƒ•áƒáƒ–ე დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”ბთ, თქვენი ცვლილებრმის გáƒáƒ áƒ”შე იქნებრშენáƒáƒ®áƒ£áƒšáƒ˜.",
+'missingcommentheader' => "'''შეხსენებáƒ:''' თქვენ áƒáƒ› კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡áƒ—ვის სáƒáƒ—áƒáƒ£áƒ áƒ˜/თემრáƒáƒ  მიგითითებიáƒáƒ—. თუ შენáƒáƒ®áƒ•áƒáƒ–ე \"{{int:savearticle}}\" დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒ”ბთ, თქვენი ცვლილებრმის გáƒáƒ áƒ”შე იქნებრშენáƒáƒ®áƒ£áƒšáƒ˜.",
'summary-preview' => 'რეზიუმეს წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვáƒ:',
'subject-preview' => 'თემის/სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვáƒ:',
'blockedtitle' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბლáƒáƒ™áƒ˜áƒ áƒ”ბულიáƒ',
@@ -734,7 +738,11 @@ $1 სáƒáƒáƒ—ში.',
'userjsyoucanpreview' => "'''რჩევáƒ:''' შენáƒáƒ®áƒ•áƒáƒ›áƒ“ე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ღილáƒáƒ™áƒ˜ \"{{int:showpreview}}\" თქვენი áƒáƒ®áƒáƒšáƒ˜ JS ტესტირებისთვის.",
'usercsspreview' => "'''გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› თქვენ მხáƒáƒšáƒáƒ“ წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვáƒáƒ¡ უყურებთ თქვენს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის CSS-ს, ის ჯერ შენáƒáƒ®áƒ£áƒšáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡!'''",
'userjspreview' => "'''გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› თქვენ მხáƒáƒšáƒáƒ“ ტესტირებáƒáƒ¡ უკეთებთ áƒáƒœ áƒáƒ™áƒ•áƒ˜áƒ áƒ“ებით წინáƒáƒ¡áƒ¬áƒáƒ  ხედს თქვენი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ჯáƒáƒ•áƒáƒ¡áƒ™áƒ áƒ˜áƒžáƒ¢áƒ¡ - ის ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბული!'''",
-'userinvalidcssjstitle' => "'''ყურáƒáƒ“ღებáƒ:''' გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემრ«$1» áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒžáƒáƒ•áƒœáƒ˜. გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› .css დრ.js გვერდებს უნდრჰქáƒáƒœáƒ“ეს მხáƒáƒšáƒáƒ“ ზეხáƒáƒ–ური სáƒáƒ—áƒáƒ£áƒ áƒ˜, მáƒáƒ’. «{{ns:user}}:ვიღáƒáƒªáƒ/monobook.css», დრáƒáƒ áƒ «{{ns:user}}:ვიღáƒáƒªáƒ/Monobook.css».",
+'sitecsspreview' => "'''გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› თქვენ áƒáƒ› CSS-ის მხáƒáƒšáƒáƒ“ წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვáƒáƒ¡ უყურებთ.'''
+'''ის ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბული!'''",
+'sitejspreview' => "'''გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› თქვენ áƒáƒ› JavaScript კáƒáƒ“ის მხáƒáƒšáƒáƒ“ წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვáƒáƒ¡ უყურებთ.'''
+'''ის ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბული!'''",
+'userinvalidcssjstitle' => "'''ყურáƒáƒ“ღებáƒ:''' გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემრ«$1» áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒžáƒáƒ•áƒœáƒ˜. გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› .css დრ.js გვერდებს უნდრჰქáƒáƒœáƒ“ეს მხáƒáƒšáƒáƒ“ ზეხáƒáƒ–ური სáƒáƒ—áƒáƒ£áƒ áƒ˜, მáƒáƒ’. «{{ns:user}}:ვიღáƒáƒªáƒ/vector.css», დრáƒáƒ áƒ «{{ns:user}}:ვიღáƒáƒªáƒ/Vector.css».",
'updated' => '(გáƒáƒœáƒáƒ®áƒšáƒ“áƒ)',
'note' => "'''შენიშვნáƒ:'''",
'previewnote' => "'''ეს მხáƒáƒšáƒáƒ“ ნიმუშიáƒ; ცვლილებები ჯერ áƒáƒ  შენáƒáƒ®áƒ£áƒšáƒ!'''",
@@ -769,7 +777,6 @@ $1 სáƒáƒáƒ—ში.',
*თუ áƒáƒ  გსურთ, რáƒáƒ› თქვენი ნáƒáƒ›áƒ£áƒ¨áƒ”ვáƒáƒ áƒ˜ შეუზღუდáƒáƒ•áƒáƒ“ იქნეს რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული, მáƒáƒ¡ áƒáƒ¥ ნუ გáƒáƒœáƒáƒ—áƒáƒ•áƒ¡áƒ”ბთ.<br />
*თქვენ áƒáƒ’რეთვე პირáƒáƒ‘áƒáƒ¡ დებთ, რáƒáƒ› თქვენს მიერ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბული ტექსტი თქვენი დáƒáƒ¬áƒ”რილიáƒ, áƒáƒœ გáƒáƒ“მáƒáƒ¬áƒ”რილირსáƒáƒ–áƒáƒ’áƒáƒ“áƒáƒ”ბრივი დáƒáƒ›áƒ”ნიდáƒáƒœ áƒáƒœ მსგáƒáƒ•áƒ¡áƒ˜ თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ წყáƒáƒ áƒáƒ“áƒáƒœ. (იხ. $1 დეტáƒáƒšáƒ”ბისთვის).
*'''ნუ შემáƒáƒ˜áƒ¢áƒáƒœáƒ— სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებებით დáƒáƒªáƒ£áƒš ნáƒáƒ¨áƒ áƒáƒ›áƒ¡ áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ¡ ნებáƒáƒ áƒ—ვის გáƒáƒ áƒ”შე!'''",
-'longpagewarning' => "'''გáƒáƒ¤áƒ áƒ—ხილებáƒ: ეს გვერდი $1 კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒ; ზáƒáƒ’იერთ ბრáƒáƒ£áƒ–ერს უჭირს გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ, რáƒáƒ›áƒ”ლთრზáƒáƒ›áƒ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრ32 კბ-ს. გთხáƒáƒ•áƒ— იქáƒáƒœáƒ˜áƒáƒ— მხედეველáƒáƒ‘áƒáƒ¨áƒ˜ შედáƒáƒ áƒ”ბით მცირე სექციებáƒáƒ“ გვერდის გáƒáƒ§áƒáƒ¤áƒ.'''",
'longpageerror' => "'''შეცდáƒáƒ›áƒ: თქვენს მიერ შემáƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ტექსტი $1 კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒ, რáƒáƒª áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბ $2 კბ-ს. მისი შენáƒáƒ®áƒ•áƒ შეუძლებელიáƒ.'''",
'readonlywarning' => "'''გáƒáƒ¤áƒ áƒ—ხილებáƒ''': მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რდáƒáƒ®áƒ£áƒ áƒ£áƒšáƒ˜áƒ პერიáƒáƒ“ული შემáƒáƒ¬áƒ›áƒ”ბისთვის, შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ თქვენ ვერ შეძლებთ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ¡ áƒáƒ› მáƒáƒ›áƒ”ნტში.
სáƒáƒ¡áƒ£áƒ áƒ•áƒ”ლირტექსტის áƒáƒ¡áƒšáƒ˜ შეინáƒáƒ®áƒáƒ— ტექსტურ რედáƒáƒ¥áƒ¢áƒáƒ áƒ¨áƒ˜ დრმáƒáƒ’ვიáƒáƒœáƒ”ბით შემáƒáƒ˜áƒ¢áƒáƒœáƒáƒ—.
@@ -948,6 +955,8 @@ $1",
'logdelete-failure' => "'''ჟურნáƒáƒšáƒ˜áƒ¡ ხილვáƒáƒ“áƒáƒ‘რáƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებული:'''
$1",
'revdel-restore' => 'ხილვáƒáƒ“áƒáƒ‘ის შეცვლáƒ',
+'revdel-restore-deleted' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ვერსიები',
+'revdel-restore-visible' => 'ხილვáƒáƒ“ი ვერსიები',
'pagehist' => 'გვერდის ისტáƒáƒ áƒ˜áƒ',
'deletedhist' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ისტáƒáƒ áƒ˜áƒ',
'revdelete-content' => 'შინáƒáƒáƒ áƒ¡áƒ˜',
@@ -1012,11 +1021,13 @@ $1",
# Diffs
'history-title' => '"$1" ცვლილებáƒáƒ—რისტáƒáƒ áƒ˜áƒ',
'difference' => '(სხვáƒáƒáƒ‘რვერსიებს შáƒáƒ áƒ˜áƒ¡)',
+'difference-multipage' => '(გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბრგვერდებს შáƒáƒ áƒ˜áƒ¡)',
'lineno' => 'ხáƒáƒ–ი $1:',
'compareselectedversions' => 'áƒáƒ áƒ©áƒ”ული ვერსიების შედáƒáƒ áƒ”ბáƒ',
'showhideselectedversions' => 'ჩვენებáƒ/დáƒáƒ›áƒáƒšáƒ•áƒ áƒáƒ áƒ©áƒ”ული ვერსიებისáƒ',
'editundo' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
-'diff-multi' => '({{PLURAL:$1|ერთი|$1}} შურვერსირáƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒ©áƒ•áƒ”ნები.)',
+'diff-multi' => '({{PLURAL:$2|ერთი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის|$2 მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების}} {{PLURAL:$1|ერთი შუáƒáƒšáƒ”დური ვერსიáƒ|$1 შუáƒáƒšáƒ”დური ვერსიები}} áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒ©áƒ•áƒ”ნები.)',
+'diff-multi-manyusers' => '({{PLURAL:$2|ერთი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის|$2 მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების}} {{PLURAL:$1|ერთი შუáƒáƒšáƒ”დური ვერსიáƒ|$1 შუáƒáƒšáƒ”დური ვერსიები}}, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒ©áƒ•áƒ”ნები.)',
# Search results
'searchresults' => 'ძიების შედეგები',
@@ -1051,6 +1062,7 @@ $1",
'searchprofile-everything-tooltip' => 'ყველრგვერდზე ძიებრ(მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდები)',
'searchprofile-advanced-tooltip' => 'ძიებრსáƒáƒ®áƒ”ლთრმáƒáƒªáƒ”მულ სივრცეში',
'search-result-size' => '$1 ($2 სიტყვáƒ)',
+'search-result-category-size' => '{{PLURAL:$1|$1 ელემენტი|$1 ელემენტი|$1 ელემენტები}} ({{PLURAL:$2|$2 ქვეკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ|$2 ქვეკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი|$2 ქვეკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი}}, {{PLURAL:$3|$3 ფáƒáƒ˜áƒšáƒ˜|$3 ფáƒáƒ˜áƒšáƒ˜|$3 ფáƒáƒ˜áƒšáƒ˜}})',
'search-result-score' => 'რელევáƒáƒœáƒ¢áƒ£áƒ áƒáƒ‘რ$1 %',
'search-redirect' => '(გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრ$1)',
'search-section' => '(სექცირ$1)',
@@ -1126,6 +1138,7 @@ $1",
'contextlines' => 'სტრიქáƒáƒœáƒ”ბი შედეგის მიხედვით',
'contextchars' => 'კáƒáƒœáƒ¢áƒ”ქსტი სტრიქáƒáƒœáƒ”ბის მიხედვით',
'stub-threshold' => 'გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის გáƒáƒ¡áƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებლáƒáƒ“<a href="#" class="stub">მáƒáƒªáƒ”მულირესკიზების ბმულებიáƒ</a> (ბáƒáƒ˜áƒ¢áƒ”ბში):',
+'stub-threshold-disabled' => 'გáƒáƒ—იშულიáƒ',
'recentchangesdays' => 'დღეების ჩვენებრბáƒáƒšáƒ ცვლილებებში:',
'recentchangesdays-max' => 'მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღე}}',
'recentchangescount' => 'რედáƒáƒ¥áƒªáƒ˜áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რსáƒáƒ©áƒ•áƒ”ნებლáƒáƒ“:',
@@ -1159,6 +1172,7 @@ $1",
'prefs-files' => 'ფáƒáƒ˜áƒšáƒ”ბი',
'prefs-custom-css' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის CSS',
'prefs-custom-js' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის JS',
+'prefs-common-css-js' => 'ზáƒáƒ’áƒáƒ“ი CSS/JS ყველრთემისთვის:',
'prefs-reset-intro' => 'ეს გვერდი შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებული იქნეს თქვენი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ შესáƒáƒªáƒ•áƒšáƒ”ლáƒáƒ“ სáƒáƒ¬áƒ§áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ–ე. áƒáƒ› მáƒáƒ¥áƒ›áƒ”დების დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის შემთხვევáƒáƒ¨áƒ˜, თქვენ ვეღáƒáƒ  შეძლებთ მის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒáƒ¡.',
'prefs-emailconfirm-label' => 'ელ–ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ:',
'prefs-textboxsize' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ',
@@ -1196,9 +1210,15 @@ $1",
'prefs-advancedrendering' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული პáƒáƒ áƒáƒ›áƒ”ტრები',
'prefs-advancedsearchoptions' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული პáƒáƒ áƒáƒ›áƒ”ტრები',
'prefs-advancedwatchlist' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
-'prefs-display' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
+'prefs-displayrc' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
+'prefs-displaysearchoptions' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
+'prefs-displaywatchlist' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
'prefs-diffs' => 'სხვáƒáƒáƒ‘რვერსიებს შáƒáƒ áƒ˜áƒ¡',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი სწáƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ£áƒ áƒ”ბáƒ',
+'email-address-validity-invalid' => 'მიუთითეთ სწáƒáƒ áƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი',
+
# User rights
'userrights' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების მáƒáƒ áƒ—ვáƒ',
'userrights-lookup-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების მáƒáƒ áƒ—ვáƒ',
@@ -1282,6 +1302,7 @@ $1",
'right-hideuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ დრმისი დáƒáƒ›áƒáƒšáƒ•áƒ სáƒáƒ–áƒáƒ’áƒáƒ“áƒáƒ”ბისგáƒáƒœ',
'right-ipblock-exempt' => 'IP ბლáƒáƒ™áƒ˜áƒ¡, áƒáƒ•áƒ¢áƒáƒ‘ლáƒáƒ™áƒ˜áƒ¡ დრდიáƒáƒžáƒáƒ–áƒáƒœáƒ—რბლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ¡áƒ•áƒšáƒ',
'right-proxyunbannable' => 'პრáƒáƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒ•áƒ¢áƒáƒ‘ლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ',
+'right-unblockself' => 'მáƒáƒ®áƒ¡áƒœáƒáƒœ ბლáƒáƒ™áƒ˜ თვითáƒáƒœ',
'right-protect' => 'გვერდების დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლრდრდáƒáƒªáƒ£áƒšáƒ˜ გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'right-editprotected' => 'დáƒáƒªáƒ£áƒšáƒ˜ გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ(იერáƒáƒ áƒ¥áƒ˜áƒ£áƒšáƒ˜ დáƒáƒªáƒ•áƒ˜áƒ¡ გáƒáƒ áƒ”შე)',
'right-editinterface' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერფეისის შეცვლáƒ',
@@ -1304,7 +1325,6 @@ $1",
'right-siteadmin' => 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ დრგáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ',
'right-reset-passwords' => 'სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების პáƒáƒ áƒáƒšáƒ”ბის ჩáƒáƒ¨áƒ•áƒ”ბáƒ',
'right-override-export-depth' => 'გვერდების ექსპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბáƒ, დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული გვერდების ჩáƒáƒ—ვლით 5-მდე სიიღრმით',
-'right-versiondetail' => 'დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ხილვრპრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒáƒ–ე',
'right-sendemail' => 'გáƒáƒ’უგზáƒáƒ•áƒœáƒ” ელექტრáƒáƒœáƒ£áƒšáƒ˜ ფáƒáƒ¡áƒ¢áƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს',
# User rights log
@@ -1355,14 +1375,9 @@ $1",
'recentchanges-legend' => 'ბáƒáƒšáƒ ცვლილებების პáƒáƒ áƒáƒ›áƒ”ტრები',
'recentchangestext' => 'უთვáƒáƒšáƒ—ვáƒáƒšáƒ”თ ვიკიში ბáƒáƒšáƒ ცვლილებებს áƒáƒ› გვერდზე.',
'recentchanges-feed-description' => 'ვიკის უáƒáƒ®áƒšáƒ”სი ცვლილებების მეთვáƒáƒšáƒ§áƒ£áƒ áƒ”áƒáƒ‘რáƒáƒ› áƒáƒ áƒ®áƒ¨áƒ˜.',
-'recentchanges-label-legend' => 'ლეგენდáƒ: $1.',
-'recentchanges-legend-newpage' => '$1 - áƒáƒ®áƒáƒšáƒ˜ გვერდი',
'recentchanges-label-newpage' => 'áƒáƒ› რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბით შეიქმნრáƒáƒ®áƒáƒšáƒ˜ გვერდი',
-'recentchanges-legend-minor' => '$1 - მცირე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'recentchanges-label-minor' => 'ეს áƒáƒ áƒ˜áƒ¡ მცირე შესწáƒáƒ áƒ”ბáƒ',
-'recentchanges-legend-bot' => '$1 — ბáƒáƒ¢áƒ˜áƒ¡ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'recentchanges-label-bot' => 'ეს áƒáƒ áƒ˜áƒ¡ ბáƒáƒ¢áƒ˜áƒ¡ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'recentchanges-legend-unpatrolled' => '$1 - გáƒáƒ“áƒáƒ£áƒ›áƒáƒ¬áƒ›áƒ”ბელი შესწáƒáƒ áƒ”ბáƒ',
'recentchanges-label-unpatrolled' => 'ეს რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრგáƒáƒ“áƒáƒ£áƒ›áƒáƒ¬áƒ›áƒ”ბელიáƒ',
'rcnote' => "ქვემáƒáƒ— იხილეთ ბáƒáƒšáƒ '''$1''' ცვლილებრუკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი '''$2''' დღის მáƒáƒœáƒ«áƒ˜áƒšáƒ–ე, $5, $4 მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ით.",
'rcnotefrom' => "ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ ცვლილებები '''$2'''-დáƒáƒœ (ნáƒáƒ©áƒ•áƒ”ნებირ'''$1''').",
@@ -1409,6 +1424,9 @@ $1",
'upload_directory_missing' => 'შესáƒáƒœáƒáƒ®áƒ˜ დირექტáƒáƒ áƒ˜áƒ ($1) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს დრმისი áƒáƒ¦áƒ“გენრვებ-სერვერის მიერ შეუძლებელიáƒ.',
'upload_directory_read_only' => 'ვებსერვერი ვერ იწერს áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის დირექტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ ($1).',
'uploaderror' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ',
+'upload-recreate-warning' => "'''ყურáƒáƒ“ღებáƒ. ფáƒáƒ˜áƒšáƒ˜ áƒáƒ› სáƒáƒ®áƒ”ლით წáƒáƒ˜áƒ¨áƒáƒšáƒ áƒáƒœ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნáƒ.''
+
+ჟურნáƒáƒšáƒ˜ იხილეთ ქვემáƒáƒ—:",
'uploadtext' => "áƒáƒ› ფáƒáƒ áƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ თქვენ შეძლებთ სერვერზე ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒáƒ¡.
áƒáƒ“რე áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“ მიმáƒáƒ áƒ—ეთ [[Special:FileList|áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ულ ფáƒáƒ˜áƒšáƒ—რსიáƒáƒ¡]].áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ”ბი áƒáƒ¡áƒ”ვე ჩáƒáƒ˜áƒ¬áƒ”რებრ[[Special:Log/upload|áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒáƒ—რჟურნáƒáƒšáƒ¨áƒ˜]], ხáƒáƒšáƒ წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ”ბი ჩáƒáƒ˜áƒ¬áƒ”რებრ[[Special:Log/delete|წáƒáƒ¨áƒšáƒáƒ—რჟურნáƒáƒšáƒ¨áƒ˜]].
@@ -1443,6 +1461,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' მიუღებელი ფáƒáƒ˜áƒšáƒ˜áƒ¡ ტიპიáƒ.
მიღებული ფáƒáƒ˜áƒšáƒ˜áƒ¡ {{PLURAL:\$3|ტიპიáƒ|ტიპებიáƒ}} \$2.",
'filetype-missing' => 'ფáƒáƒ˜áƒšáƒ¡ áƒáƒ  áƒáƒ¥áƒ•áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ(მáƒáƒ’.: ".jpg").',
+'empty-file' => 'áƒáƒ áƒ©áƒ”ული ფáƒáƒ˜áƒšáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ.',
+'file-too-large' => 'ფáƒáƒ˜áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ',
+'filename-tooshort' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ზედმეტáƒáƒ“ მáƒáƒ™áƒšáƒ”áƒ',
+'filetype-banned' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ ეს ტიპი áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ',
+'verification-error' => 'áƒáƒ› ფáƒáƒ˜áƒšáƒ›áƒ áƒáƒ  გáƒáƒ˜áƒáƒ áƒ შემáƒáƒ¬áƒ›áƒ”ბის პრáƒáƒªáƒ”დურáƒ.',
+'hookaborted' => 'თქვენ მიერ შემáƒáƒ—áƒáƒ•áƒáƒ–ებული ცვლილებრმáƒáƒ˜áƒœáƒ˜áƒ¨áƒœáƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜.',
+'illegal-filename' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ ეს სáƒáƒ®áƒ”ლი áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ.',
+'overwrite' => 'áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ შეცვლრმიუღებელიáƒ.',
+'unknown-error' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეცდáƒáƒ›áƒ.',
+'tmp-create-error' => 'შეუძლებელირდრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ შექმნáƒ.',
+'tmp-write-error' => 'დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ წერისáƒáƒ¡ შეცდáƒáƒ›áƒ.',
'large-file' => 'სáƒáƒ¡áƒ£áƒ áƒ•áƒ”ლირფáƒáƒ˜áƒšáƒ˜ áƒáƒ  áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბáƒáƒ“ეს $1-ს; ეს ფáƒáƒ˜áƒšáƒ˜áƒ $2.',
'largefileserver' => 'ეს ფáƒáƒ˜áƒšáƒ˜ სერვერის მიერ დáƒáƒ¨áƒ•áƒ”ბულ ზáƒáƒ›áƒáƒ¡ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბáƒ.',
'emptyfile' => 'თქვენს მიერ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ. შესáƒáƒ«áƒšáƒáƒ, შეცდáƒáƒ›áƒ მáƒáƒ®áƒ“რფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის áƒáƒ™áƒ áƒ”ფის დრáƒáƒ¡. გთხáƒáƒ•áƒ— შეáƒáƒ›áƒáƒ¬áƒ›áƒáƒ— ნáƒáƒ›áƒ“ვილáƒáƒ“ გსურთ თუ áƒáƒ áƒ áƒáƒ› ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ.',
@@ -1467,13 +1496,14 @@ $1",
'fileexists-shared-forbidden' => 'ფáƒáƒ˜áƒšáƒ˜ áƒáƒ› სáƒáƒ®áƒ”ლწáƒáƒ“ებით უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ”რთრსáƒáƒªáƒáƒ•áƒ¨áƒ˜. თუ შეიძლებáƒ, უკáƒáƒœ დáƒáƒ‘რუნდით დრჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ ფáƒáƒ˜áƒšáƒ˜ სხვრსáƒáƒ®áƒ”ლწáƒáƒ“ებით. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'ეს ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒ˜áƒ¡ შემდეგი {{PLURAL:$1|შემდეგი ფáƒáƒ˜áƒšáƒ˜áƒ¡|Ñშემდეგი ფáƒáƒ˜áƒšáƒ”ბის}} დუბლიკáƒáƒ¢áƒ˜:',
'file-deleted-duplicate' => 'მსგáƒáƒ•áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜ ([[:$1]]) უკვე წáƒáƒ¨áƒšáƒ˜áƒšáƒ. გთხáƒáƒ•áƒ—, გáƒáƒ”ცáƒáƒœáƒ˜áƒ— ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ ისტáƒáƒ áƒ˜áƒáƒ¡, მáƒáƒœáƒáƒ›áƒ“ე ვიდრე მáƒáƒ¡ ხელმეáƒáƒ áƒ”დ áƒáƒ¢áƒ•áƒ˜áƒ áƒ¢áƒáƒ•áƒ—.',
-'successfulupload' => 'წáƒáƒ áƒ›áƒáƒ¢áƒ”ბული გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
'uploadwarning' => 'გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეხსენებáƒ',
'uploadwarning-text' => 'გთხáƒáƒ•áƒ— ჩáƒáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რრქვევით დრხელმეáƒáƒ áƒ”დ სცáƒáƒ“áƒáƒ—.',
'savefile' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ',
'uploadedimage' => 'დáƒáƒ›áƒáƒ¢áƒ”ბრ"[[$1]]"',
'overwroteimage' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ულირ"[[$1]]"-ის áƒáƒ®áƒáƒšáƒ˜ ვერსიáƒ',
'uploaddisabled' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრშეუძლებელიáƒ',
+'copyuploaddisabled' => 'URL áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრგáƒáƒ¦áƒ˜áƒ¨áƒ£áƒšáƒ˜áƒ',
+'uploadfromurl-queued' => 'თქვენი áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრრიგში ჩáƒáƒ“გáƒ.',
'uploaddisabledtext' => 'ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრშეუძლებელიáƒ.',
'php-uploaddisabledtext' => 'ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრშეჩერებულირPHP-ით. გთხáƒáƒ•áƒ— შეáƒáƒ›áƒáƒ¬áƒ›áƒáƒ— file_uploads-ის მნიშვნელáƒáƒ‘áƒ.',
'uploadscripted' => 'ფáƒáƒ˜áƒšáƒ˜ შეიცáƒáƒ•áƒ¡ HTML-კáƒáƒ“ს, áƒáƒœ სკრიპტს, რáƒáƒ›áƒ”ლიც ბრáƒáƒ£áƒ–ერმრშეიძლებრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ”დ გáƒáƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒ¡.',
@@ -1493,6 +1523,14 @@ $1",
გთხáƒáƒ•áƒ— დáƒáƒ¤áƒ˜áƒ¥áƒ áƒ“ეთ რáƒáƒ›áƒ“ენáƒáƒ“ მიზáƒáƒœáƒ¨áƒ”წáƒáƒœáƒ˜áƒšáƒ˜áƒ áƒáƒ› ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¥ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ.
ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ქვემáƒáƒ— áƒáƒ› ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ ისტáƒáƒ áƒ˜áƒ:",
'filename-bad-prefix' => "áƒáƒ¡áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვი ფáƒáƒ˜áƒšáƒ˜ იწყებრ'''«$1»''', რáƒáƒª áƒáƒ áƒ˜áƒ¡ ფáƒáƒ¢áƒáƒ™áƒáƒ›áƒ”რის მიერ სურáƒáƒ—ებისთვის მიცემული სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ სáƒáƒ®áƒ”ლი. გთხáƒáƒ•áƒ— áƒáƒ˜áƒ áƒ©áƒ˜áƒáƒ— ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ›áƒ¬áƒ”რი უკეთესი სáƒáƒ®áƒ”ლი.",
+'upload-success-subj' => 'წáƒáƒ áƒ›áƒáƒ¢áƒ”ბული გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
+'upload-success-msg' => 'თქვენი áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ[$2] შეგიძლიáƒáƒ— იხილáƒáƒ— áƒáƒ¥: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის პრáƒáƒ‘ლემáƒ',
+'upload-failure-msg' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡ პრáƒáƒ‘ლემრშეიქმნრ[$2]:
+
+$1',
+'upload-warning-subj' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისთვის გáƒáƒ¤áƒ áƒ—ხილებáƒ',
+'upload-warning-msg' => '[$2]-ის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡ დáƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ áƒ“რშეცდáƒáƒ›áƒ. შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ¬áƒáƒ áƒ”ბლáƒáƒ“ დáƒáƒ‘რუნდით [[Special:Upload/stash/$1|áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის ფáƒáƒ áƒ›áƒ]]ზე.',
'upload-proto-error' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜',
'upload-proto-error-text' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ მისáƒáƒ›áƒáƒ áƒ—ი, რáƒáƒ›áƒ”ლიც იწყებრ<code>http://</code> or <code>ftp://</code>-ით.',
@@ -1557,6 +1595,7 @@ $1",
'listfiles_search_for' => 'ძიებრსურáƒáƒ—ის სáƒáƒ®áƒ”ლის მიხედვით:',
'imgfile' => 'ფáƒáƒ˜áƒšáƒ˜',
'listfiles' => 'სურáƒáƒ—ების სიáƒ',
+'listfiles_thumb' => 'მინიáƒáƒ¢áƒ£áƒ áƒ',
'listfiles_date' => 'თáƒáƒ áƒ˜áƒ¦áƒ˜',
'listfiles_name' => 'სáƒáƒ®áƒ”ლი',
'listfiles_user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი',
@@ -1670,8 +1709,8 @@ $1",
'statistics-edits' => 'გვერდის შესწáƒáƒ áƒ”ბები {{SITENAME}}-ის შექმნიდáƒáƒœ',
'statistics-edits-average' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის სáƒáƒ”რთრრáƒáƒáƒ“ენáƒáƒ‘რგვერდზე',
'statistics-views-total' => 'სულ ხილვáƒ',
+'statistics-views-total-desc' => 'სáƒáƒ—ვáƒáƒšáƒáƒ•áƒ¨áƒ˜ áƒáƒ  მიიღებრáƒáƒ áƒáƒ áƒ¡áƒ”ბული დრსáƒáƒ›áƒ£áƒ¨áƒáƒ გვერდების გáƒáƒ“áƒáƒ®áƒ”დვáƒ',
'statistics-views-peredit' => 'შესწáƒáƒ áƒ”ბáƒáƒ—რხილვáƒ',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue დáƒáƒ•áƒáƒšáƒ”ბáƒáƒ—რსიის] სიგრძე',
'statistics-users' => 'დáƒáƒ áƒ”გისტრირებული [[Special:ListUsers|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები]]',
'statistics-users-active' => 'áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები',
'statistics-users-active-desc' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები, რáƒáƒ›áƒšáƒ”ბმáƒáƒª გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლეს ქმედებრ{{PLURAL:$1|ბáƒáƒšáƒ $1 დღე|ბáƒáƒšáƒ $1 დღის|ბáƒáƒšáƒ $1 დღეების}}',
@@ -1686,7 +1725,7 @@ $1",
'doubleredirects' => 'áƒáƒ áƒ›áƒáƒ’ი გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ',
'doubleredirectstext' => 'áƒáƒ› გვერდზე ჩáƒáƒ›áƒáƒ—ვლილირგვერდები, რáƒáƒ›áƒšáƒ”ბიც გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებულირსხვრგáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების გვერდებზე.
ყáƒáƒ•áƒ”ლი მწკრივი შეიცáƒáƒ•áƒ¡ ბმულებს პირველ დრმეáƒáƒ áƒ” გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒ–ე, áƒáƒ’რეთვე მეáƒáƒ áƒ” გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების ტექსტის პირველ სტრიქáƒáƒœáƒ¡, რáƒáƒ›áƒ”ლშიც ჩვეულებრივ მითითებულირრეáƒáƒšáƒ£áƒ áƒ˜ “სáƒáƒ›áƒ˜áƒ–ნე†გვერდის სáƒáƒ—áƒáƒ£áƒ áƒ˜. სáƒáƒ­áƒ˜áƒ áƒáƒ, რáƒáƒ› პირველი გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒª უთითებდეს áƒáƒ› გვერდზე.
-<s>გáƒáƒ“áƒáƒ®áƒáƒ–ული</s> მáƒáƒœáƒáƒªáƒ”მები უკვე გáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
+<del>გáƒáƒ“áƒáƒ®áƒáƒ–ული</del> მáƒáƒœáƒáƒªáƒ”მები უკვე გáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
'double-redirect-fixed-move' => '[[$1]] გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒš იქნáƒ.
áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ ის გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებულირ[[$2]]-ზე.',
'double-redirect-fixer' => 'გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრშემსწáƒáƒ áƒ”ბელი',
@@ -1710,6 +1749,8 @@ $1",
'nmembers' => '$1 წევრი',
'nrevisions' => '$1 რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'nviews' => '$1 ჩვენებáƒ',
+'nimagelinks' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრ$1 {{PLURAL:$1|გვერდზე}}',
+'ntransclusions' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრ$1 {{PLURAL:$1|გვერდზე}}',
'specialpage-empty' => 'ეს გვერდი ცáƒáƒ áƒ˜áƒ”ლიáƒ.',
'lonelypages' => 'áƒáƒ‘áƒáƒšáƒ˜ გვერდები',
'lonelypagestext' => 'შემდეგი გვერდები áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული áƒáƒœ ბმული სხვრგვერდებიდáƒáƒœ {{SITENAME}}-ში áƒáƒ  მისáƒáƒ›áƒáƒ áƒ—დებáƒ.',
@@ -1867,33 +1908,39 @@ $1",
'listgrouprights-removegroup-self-all' => 'შეუძლირთáƒáƒ•áƒ˜áƒ¡áƒ˜ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ ყველრჯგუფის წáƒáƒ¨áƒšáƒ.',
# E-mail user
-'mailnologin' => 'გáƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული.',
-'mailnologintext' => 'თქვენ უნდრ[[Special:UserLogin|წáƒáƒ áƒáƒ“გენილი იყáƒáƒ— სისტემისáƒáƒ“მი]] დრგქáƒáƒœáƒ“ეთ წესიერი ელექტრáƒáƒœáƒ£áƒšáƒ˜ ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი თქვენს [[Special:Preferences|კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜]] იმისთვის, რáƒáƒ› გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒáƒ— წერილების სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს.',
-'emailuser' => 'გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ”თ იმეილი áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
-'emailpage' => 'ელ. ფáƒáƒ¡áƒ¢áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
-'emailpagetext' => 'თუ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრთáƒáƒ•áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრებში ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მáƒáƒ¥áƒ›áƒ”დი მისáƒáƒ›áƒáƒ áƒ—ი მიუთითáƒ, ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ áƒ›áƒ˜áƒ¡ შევსებისáƒáƒ¡ შეგიძლიáƒáƒ— მისთვის შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•áƒœáƒ. ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი, რáƒáƒ›áƒ”ლიც [[Special:Preferences|თქვენს პáƒáƒ áƒáƒ›áƒ”ტრებში]] მიუთითეთ, დáƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ áƒ“ებრ“გáƒáƒ›áƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡â€ ველში, რáƒáƒ—რáƒáƒ“რესáƒáƒ¢áƒ›áƒ პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒªáƒ”მრშეძლáƒáƒ¡.',
-'usermailererror' => 'ელ. ფáƒáƒ¡áƒ¢áƒ დáƒáƒ‘რუნდრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ:',
-'defemailsubject' => 'წერილი ვიკიპედიიდáƒáƒœ, თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ ქáƒáƒ áƒ—ული ენციკლáƒáƒžáƒ”დიიდáƒáƒœ.',
-'noemailtitle' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი მითითებული áƒáƒ  áƒáƒ áƒ˜áƒ¡',
-'noemailtext' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრáƒáƒ  მიუთითრმáƒáƒ¥áƒ›áƒ”დი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი.',
-'nowikiemailtitle' => 'წერილების გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•áƒ—.',
-'nowikiemailtext' => 'áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრგáƒáƒ›áƒáƒ®áƒáƒ¢áƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისგáƒáƒœ წერილების áƒáƒ  მიღების სურვილი.',
-'email-legend' => 'წერილის გáƒáƒ’ზáƒáƒ•áƒœáƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისáƒáƒ“მი {{grammar:genitive|{{SITENAME}}}}',
-'emailfrom' => 'გáƒáƒ›áƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜:',
-'emailto' => 'áƒáƒ“რესáƒáƒ¢áƒ˜:',
-'emailsubject' => 'თემáƒ:',
-'emailmessage' => 'შეტყáƒáƒ‘ინებáƒ:',
-'emailsend' => 'გáƒáƒ’ზáƒáƒ•áƒœáƒ',
-'emailccme' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ— გáƒáƒ›áƒáƒ›áƒ˜áƒ’áƒáƒ•áƒœáƒ”თ áƒáƒ¡áƒšáƒ˜.',
-'emailccsubject' => 'შეტყáƒáƒ‘ინების áƒáƒ¡áƒšáƒ˜ გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ”თ $1: $2',
-'emailsent' => 'ელ. ფáƒáƒ¡áƒ¢áƒ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ',
-'emailsenttext' => 'თქვენი ელ. შეტყáƒáƒ‘ინებრგáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ.',
-'emailuserfooter' => 'ეს ელ. შეტყáƒáƒ‘ინებრ$1-მრგáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ $2-ს "გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს ელ. შეტყáƒáƒ‘ინებáƒ" ფუნქციით {{SITENAME}}-დáƒáƒœ.',
+'mailnologin' => 'გáƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული.',
+'mailnologintext' => 'თქვენ უნდრ[[Special:UserLogin|წáƒáƒ áƒáƒ“გენილი იყáƒáƒ— სისტემისáƒáƒ“მი]] დრგქáƒáƒœáƒ“ეთ წესიერი ელექტრáƒáƒœáƒ£áƒšáƒ˜ ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი თქვენს [[Special:Preferences|კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜]] იმისთვის, რáƒáƒ› გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒáƒ— წერილების სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს.',
+'emailuser' => 'გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ”თ იმეილი áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
+'emailpage' => 'ელ. ფáƒáƒ¡áƒ¢áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
+'emailpagetext' => 'თუ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრთáƒáƒ•áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრებში ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მáƒáƒ¥áƒ›áƒ”დი მისáƒáƒ›áƒáƒ áƒ—ი მიუთითáƒ, ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ áƒ›áƒ˜áƒ¡ შევსებისáƒáƒ¡ შეგიძლიáƒáƒ— მისთვის შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•áƒœáƒ. ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი, რáƒáƒ›áƒ”ლიც [[Special:Preferences|თქვენს პáƒáƒ áƒáƒ›áƒ”ტრებში]] მიუთითეთ, დáƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ áƒ“ებრ“გáƒáƒ›áƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡â€ ველში, რáƒáƒ—რáƒáƒ“რესáƒáƒ¢áƒ›áƒ პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒªáƒ”მრშეძლáƒáƒ¡.',
+'usermailererror' => 'ელ. ფáƒáƒ¡áƒ¢áƒ დáƒáƒ‘რუნდრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ:',
+'defemailsubject' => 'წერილი ვიკიპედიიდáƒáƒœ, თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ ქáƒáƒ áƒ—ული ენციკლáƒáƒžáƒ”დიიდáƒáƒœ.',
+'usermaildisabled' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის e-mail გáƒáƒ—იშულიáƒ',
+'usermaildisabledtext' => 'თქვენ ვერ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ— e-mail-ს.',
+'noemailtitle' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი მითითებული áƒáƒ  áƒáƒ áƒ˜áƒ¡',
+'noemailtext' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრáƒáƒ  მიუთითრმáƒáƒ¥áƒ›áƒ”დი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი.',
+'nowikiemailtitle' => 'წერილების გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•áƒ—.',
+'nowikiemailtext' => 'áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრგáƒáƒ›áƒáƒ®áƒáƒ¢áƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისგáƒáƒœ წერილების áƒáƒ  მიღების სურვილი.',
+'email-legend' => 'წერილის გáƒáƒ’ზáƒáƒ•áƒœáƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისáƒáƒ“მი {{grammar:genitive|{{SITENAME}}}}',
+'emailfrom' => 'გáƒáƒ›áƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜:',
+'emailto' => 'áƒáƒ“რესáƒáƒ¢áƒ˜:',
+'emailsubject' => 'თემáƒ:',
+'emailmessage' => 'შეტყáƒáƒ‘ინებáƒ:',
+'emailsend' => 'გáƒáƒ’ზáƒáƒ•áƒœáƒ',
+'emailccme' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ— გáƒáƒ›áƒáƒ›áƒ˜áƒ’áƒáƒ•áƒœáƒ”თ áƒáƒ¡áƒšáƒ˜.',
+'emailccsubject' => 'შეტყáƒáƒ‘ინების áƒáƒ¡áƒšáƒ˜ გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ”თ $1: $2',
+'emailsent' => 'ელ. ფáƒáƒ¡áƒ¢áƒ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ',
+'emailsenttext' => 'თქვენი ელ. შეტყáƒáƒ‘ინებრგáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ.',
+'emailuserfooter' => 'ეს ელ. შეტყáƒáƒ‘ინებრ$1-მრგáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ $2-ს "გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს ელ. შეტყáƒáƒ‘ინებáƒ" ფუნქციით {{SITENAME}}-დáƒáƒœ.',
+
+# User Messenger
+'usermessage-summary' => 'სისტემური შეტყáƒáƒ‘ინების დáƒáƒ¢áƒáƒ•áƒ”ბáƒ.',
+'usermessage-editor' => 'სისტემური მესენჯერი',
# Watchlist
'watchlist' => 'ჩემი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒ',
'mywatchlist' => 'ჩემი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒ',
-'watchlistfor' => "('''$1'''-თვის)",
+'watchlistfor2' => '$1 ($2) თვის',
'nowatchlist' => 'თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სირცáƒáƒ áƒ˜áƒ”ლიáƒ.',
'watchlistanontext' => '$1
@@ -2013,7 +2060,10 @@ $UNWATCHURL
'revertpage' => '[[Special:Contributions/$2|$2]]-ის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრგáƒáƒ£áƒ¥áƒ›áƒ“áƒ; áƒáƒ¦áƒ“გრბáƒáƒšáƒáƒ¡ [[User:$1|$1]]-ის მიერ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული ვერსიáƒ',
'revertpage-nouser' => 'გáƒáƒ£áƒ¥áƒ›áƒ“რ(მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი წáƒáƒ˜áƒ¨áƒáƒšáƒ) მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ [[User:$1|$1]] ბáƒáƒšáƒ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”áƒáƒ–ე.',
'rollback-success' => 'გáƒáƒ£áƒ¥áƒ›áƒ“რშესწáƒáƒ áƒ”ბრ$1; დáƒáƒ‘რუნებრვერსიáƒáƒ–ე $2.',
-'sessionfailure' => 'ჩáƒáƒœáƒ¡, რáƒáƒ› პრáƒáƒ‘ლემáƒáƒ თქვენი რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ სესიისáƒáƒ—ვის;
+
+# Edit tokens
+'sessionfailure-title' => 'სეáƒáƒœáƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ',
+'sessionfailure' => 'ჩáƒáƒœáƒ¡, რáƒáƒ› პრáƒáƒ‘ლემáƒáƒ თქვენი რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ სესიისáƒáƒ—ვის;
ეს მáƒáƒ¥áƒ›áƒ”დებრშეჩერდრთქვენი სესიáƒáƒ¨áƒ˜ შემáƒáƒ­áƒ áƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“.
გთხáƒáƒ•áƒ—, დáƒáƒáƒ¬áƒ™áƒáƒžáƒ£áƒœáƒáƒ— ღილáƒáƒ™áƒ¡ "უკáƒáƒœ" დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ ჩáƒáƒ áƒ—áƒáƒ— გვერდი, რáƒáƒ›áƒšáƒ˜áƒ“áƒáƒœáƒáƒª შემáƒáƒ®áƒ•áƒ”დით დრსცáƒáƒ“áƒáƒ— გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბით.',
@@ -2141,18 +2191,22 @@ $1',
'month' => 'თვე:',
'year' => 'წელი:',
-'sp-contributions-newbies' => 'მხáƒáƒšáƒáƒ“ áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების წვლილის ჩვენებáƒ',
-'sp-contributions-newbies-sub' => 'áƒáƒ®áƒáƒšáƒ‘ედებისთვის',
-'sp-contributions-newbies-title' => 'ბáƒáƒšáƒáƒ¡ დáƒáƒ áƒ”გისტრირებულ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრწვლილი',
-'sp-contributions-blocklog' => 'ბლáƒáƒ™áƒ˜áƒ áƒ”ბის ისტáƒáƒ áƒ˜áƒ',
-'sp-contributions-deleted' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ შესწáƒáƒ”ბები',
-'sp-contributions-logs' => 'ჟურნáƒáƒšáƒ”ბი',
-'sp-contributions-talk' => 'გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
-'sp-contributions-userrights' => 'áƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების მáƒáƒ áƒ—ვáƒ',
-'sp-contributions-blocked-notice' => 'ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ. ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რი წáƒáƒ¨áƒšáƒáƒ—რჟურნáƒáƒšáƒ˜áƒ“áƒáƒœ:',
-'sp-contributions-search' => 'წვლილის ძიებáƒ',
-'sp-contributions-username' => 'IP მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒœ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
-'sp-contributions-submit' => 'ძიებáƒ',
+'sp-contributions-newbies' => 'მხáƒáƒšáƒáƒ“ áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების წვლილის ჩვენებáƒ',
+'sp-contributions-newbies-sub' => 'áƒáƒ®áƒáƒšáƒ‘ედებისთვის',
+'sp-contributions-newbies-title' => 'ბáƒáƒšáƒáƒ¡ დáƒáƒ áƒ”გისტრირებულ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრწვლილი',
+'sp-contributions-blocklog' => 'ბლáƒáƒ™áƒ˜áƒ áƒ”ბის ისტáƒáƒ áƒ˜áƒ',
+'sp-contributions-deleted' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ შესწáƒáƒ”ბები',
+'sp-contributions-uploads' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვები',
+'sp-contributions-logs' => 'ჟურნáƒáƒšáƒ”ბი',
+'sp-contributions-talk' => 'გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
+'sp-contributions-userrights' => 'áƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების მáƒáƒ áƒ—ვáƒ',
+'sp-contributions-blocked-notice' => 'ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ. ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რი წáƒáƒ¨áƒšáƒáƒ—რჟურნáƒáƒšáƒ˜áƒ“áƒáƒœ:',
+'sp-contributions-blocked-notice-anon' => 'ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ.
+ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რი წáƒáƒ¨áƒšáƒáƒ—რჟურნáƒáƒšáƒ˜áƒ“áƒáƒœ:',
+'sp-contributions-search' => 'წვლილის ძიებáƒ',
+'sp-contributions-username' => 'IP მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒœ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
+'sp-contributions-toponly' => 'áƒáƒ©áƒ•áƒ”ნე მხáƒáƒšáƒáƒ“ ბáƒáƒšáƒ ვერსიები',
+'sp-contributions-submit' => 'ძიებáƒ',
# What links here
'whatlinkshere' => 'ბმული გვერდზე',
@@ -2216,7 +2270,6 @@ $1',
'ipb-edit-dropdown' => 'დáƒáƒ‘ლáƒáƒ™áƒ•áƒ˜áƒ¡ მიზეზების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'ipb-unblock-addr' => 'ბლáƒáƒ™áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ $1',
'ipb-unblock' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლზე áƒáƒœ IP მისáƒáƒ›áƒáƒ áƒ—ზე ბლáƒáƒ™áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ',
-'ipb-blocklist-addr' => 'მáƒáƒ¥áƒ›áƒ”დი ბლáƒáƒ™áƒ˜áƒ áƒ”ბრ$1-თვის',
'ipb-blocklist' => 'იხილე áƒáƒ áƒ¡áƒ”ბული ბლáƒáƒ™áƒ˜áƒ áƒ”ბები',
'ipb-blocklist-contribs' => '$1 მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვლილი',
'unblockip' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელზე ბლáƒáƒ™áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ',
@@ -2285,6 +2338,8 @@ $1',
'sorbs_create_account_reason' => 'თქვენი IP-მისáƒáƒ›áƒáƒ áƒ—ი ითვლებრღირპრáƒáƒ¥áƒ¡áƒ˜áƒ“ DNSBL-ის áƒáƒœáƒáƒ®áƒ›áƒáƒ“. თქვენ ვერ შექმნით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¡.',
'cant-block-while-blocked' => 'თქვენ ვერ დáƒáƒ‘ლáƒáƒ™áƒáƒ•áƒ— სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს, რáƒáƒ“გáƒáƒœáƒáƒª თáƒáƒ•áƒáƒ“ ხáƒáƒ áƒ— დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜.',
'cant-see-hidden-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი, რáƒáƒ›áƒšáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡áƒáƒª ცდილáƒáƒ—, უკვე დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ დრდáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ. რáƒáƒ“გáƒáƒœáƒáƒª თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— დáƒáƒ›áƒáƒšáƒ£áƒš მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებთáƒáƒœ მუშáƒáƒáƒ‘ის ნებáƒáƒ áƒ—ვáƒ, თქვენ ვერ შეცვლით áƒáƒ› ბლáƒáƒ™áƒ¡.',
+'ipbblocked' => 'თქვენ ვერ დáƒáƒ‘ლáƒáƒ™áƒáƒ•áƒ— áƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ— ბლáƒáƒ™áƒ¡ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს, რáƒáƒ“გáƒáƒœáƒáƒª თáƒáƒ•áƒáƒ“ ხáƒáƒ áƒ— დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜.',
+'ipbnounblockself' => 'თქვენ ვერ მáƒáƒ®áƒ¡áƒœáƒáƒ— ბლáƒáƒ™áƒ¡ სáƒáƒ™áƒ£áƒ—áƒáƒ  თáƒáƒ•áƒ¡',
# Developer tools
'lockdb' => 'ჩáƒáƒ™áƒ”ტე მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒ',
@@ -2312,6 +2367,15 @@ $1',
გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› გვერდი áƒáƒ  გáƒáƒ“áƒáƒ•áƒ, თუ áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ— სტáƒáƒ¢áƒ˜áƒ უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ áƒ“რიმ შემთხვევისáƒ, თუ ის ცáƒáƒ áƒ˜áƒ”ლირáƒáƒœ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒ დრáƒáƒ  áƒáƒ¥áƒ•áƒ¡ გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ისტáƒáƒ áƒ˜áƒ. ეს ნიშნáƒáƒ•áƒ¡, რáƒáƒ› თქვენ შეგიძლიáƒáƒ— დáƒáƒ£áƒ‘რუნáƒáƒ— ძველი სáƒáƒ®áƒ”ლი გვერდს, თუ შეცდáƒáƒ›áƒ დáƒáƒ£áƒ¨áƒ•áƒ˜áƒ—, მáƒáƒ’რáƒáƒ› áƒáƒ  შეგიძლიáƒáƒ— ზემáƒáƒ— გáƒáƒ“áƒáƒáƒ¬áƒ”რáƒáƒ— áƒáƒ áƒ¡áƒ”ბულ გვერდს.
<b>გáƒáƒ¤áƒ áƒ—ხილებთ!</b> áƒáƒ› მáƒáƒ¥áƒ›áƒ”დებáƒáƒ› შეიძლებრმნიშვნელáƒáƒ•áƒáƒœáƒ˜ დრმáƒáƒ£áƒšáƒáƒ“ნელი ცვლილებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ˜áƒ¡ პáƒáƒžáƒ£áƒšáƒáƒ áƒ£áƒš გვერდზე; სáƒáƒœáƒáƒ› გáƒáƒáƒ’რძელებდეთ, გთხáƒáƒ•áƒ— დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ“ეთ, რáƒáƒ› თქვენ გესმით თქვენი ქმედების შედეგები.',
+'movepagetext-noredirectfixer' => "ქვემáƒáƒ— მáƒáƒªáƒ”მული ფáƒáƒ áƒ›áƒ გვერდს სáƒáƒ®áƒ”ლს გáƒáƒ“áƒáƒáƒ áƒ¥áƒ›áƒ”ვს, რáƒáƒª გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ¡ მáƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბულ ისტáƒáƒ áƒ˜áƒáƒ¡áƒáƒª áƒáƒ®áƒáƒš სáƒáƒ®áƒ”ლზე.
+ძველი სáƒáƒ—áƒáƒ£áƒ áƒ˜ გáƒáƒ®áƒ“ებრგáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების გვერდი áƒáƒ®áƒáƒš სáƒáƒ—áƒáƒ£áƒ áƒ–ე.
+შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ [[Special:DoubleRedirects|áƒáƒ áƒ›áƒáƒ’ი]] áƒáƒœ [[Special:BrokenRedirects|გáƒáƒ›áƒ¬áƒ§áƒ“áƒáƒ áƒ˜]] გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებები.
+თქვენ ხáƒáƒ áƒ— პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡áƒ›áƒ’ებელი, რáƒáƒ› ბმულები მკითხველს დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ”ბისáƒáƒ›áƒ”ბრ მიიყვáƒáƒœáƒ¡.
+
+გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› გვერდი áƒáƒ  გáƒáƒ“áƒáƒ•áƒ, თუ áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ— სტáƒáƒ¢áƒ˜áƒ უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ áƒ“რიმ შემთხვევისáƒ, თუ ის ცáƒáƒ áƒ˜áƒ”ლირáƒáƒœ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒ დრáƒáƒ  áƒáƒ¥áƒ•áƒ¡ გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ისტáƒáƒ áƒ˜áƒ. ეს ნიშნáƒáƒ•áƒ¡, რáƒáƒ› თქვენ შეგიძლიáƒáƒ— დáƒáƒ£áƒ‘რუნáƒáƒ— ძველი სáƒáƒ®áƒ”ლი გვერდს, თუ შეცდáƒáƒ›áƒ დáƒáƒ£áƒ¨áƒ•áƒ˜áƒ—, მáƒáƒ’რáƒáƒ› áƒáƒ  შეგიძლიáƒáƒ— ზემáƒáƒ— გáƒáƒ“áƒáƒáƒ¬áƒ”რáƒáƒ— áƒáƒ áƒ¡áƒ”ბულ გვერდს.
+
+'''გáƒáƒ¤áƒ áƒ—ხილებთ!'''
+áƒáƒ› მáƒáƒ¥áƒ›áƒ”დებáƒáƒ› შეიძლებრმნიშვნელáƒáƒ•áƒáƒœáƒ˜ დრმáƒáƒ£áƒšáƒáƒ“ნელი ცვლილებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ˜áƒ¡ პáƒáƒžáƒ£áƒšáƒáƒ áƒ£áƒš გვერდზე; სáƒáƒœáƒáƒ› გáƒáƒáƒ’რძელებდეთ, გთხáƒáƒ•áƒ— დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ“ეთ, რáƒáƒ› თქვენ გესმით თქვენი ქმედების შედეგები.",
'movepagetalktext' => "დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდი áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ“áƒáƒ•áƒ მáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“, '''გáƒáƒ áƒ“რიმ შემთხვევისáƒ, თუ''':
*გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდი áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ— დრგáƒáƒ áƒ™áƒ•áƒ”ული შინáƒáƒáƒ áƒ¡áƒ˜áƒ— უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, áƒáƒœ
*თქვენ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ— ნიშნულს ქვევით დáƒáƒ¤áƒáƒ–ე.
@@ -2367,6 +2431,7 @@ $1',
'immobile-source-page' => 'áƒáƒ› გვეერდის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ.',
'immobile-target-page' => 'შეუძლებელირმáƒáƒªáƒ”მულ სáƒáƒ®áƒ”ლზე გáƒáƒ“áƒáƒ¢áƒáƒœáƒ.',
'imagenocrossnamespace' => 'შეუძლებელირფáƒáƒ˜áƒšáƒ¡ მიეცეს სáƒáƒ®áƒ”ლი სáƒáƒ®áƒ”ლთრსხვრსივრციდáƒáƒœ',
+'nonfile-cannot-move-to-file' => 'შეუძლებელირáƒáƒ áƒáƒ¤áƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლთრსივრცეში',
'imagetypemismatch' => 'ფáƒáƒ˜áƒšáƒ¡ áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრáƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბრმის ტიპს',
'imageinvalidfilename' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ‘áƒáƒšáƒáƒ სáƒáƒ®áƒ”ლი შეცდáƒáƒ›áƒáƒ¡ შეიცáƒáƒ•áƒ¡',
'fix-double-redirects' => 'ძველ სáƒáƒ—áƒáƒ£áƒ áƒ–ე მიმთითებელი გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ',
@@ -2446,6 +2511,7 @@ $1',
'importstart' => 'გვერდების იმპáƒáƒ áƒ¢áƒ˜...',
'import-revision-count' => '$1 ცვლილებáƒ',
'importnopages' => 'იმპáƒáƒ áƒ¢áƒ˜áƒ¡áƒ—ვის გვერდები áƒáƒ  áƒáƒ áƒ˜áƒ¡.',
+'imported-log-entries' => 'გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ {{PLURAL:$1|ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რი|ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რი}} $1.',
'importfailed' => 'იმპáƒáƒ áƒ¢áƒ˜ ვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ: $1',
'importunknownsource' => 'იმპáƒáƒ áƒ¢áƒ˜áƒ¡ წყáƒáƒ áƒáƒ¡ ტიპი უცნáƒáƒ‘იáƒ',
'importcantopen' => 'იმპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜ áƒáƒ  გáƒáƒ˜áƒ®áƒ¡áƒœáƒ',
@@ -2538,6 +2604,8 @@ $1',
'tooltip-upload' => 'დáƒáƒ˜áƒ¬áƒ§áƒ”თ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
'tooltip-rollback' => 'ბáƒáƒšáƒ რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ მიერ გáƒáƒ™áƒ”თებული ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრერთი დáƒáƒ­áƒ”რით',
'tooltip-undo' => 'შეტáƒáƒœáƒ˜áƒšáƒ˜ ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრდრწინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვის ჩვენებáƒ, გáƒáƒ£áƒ¥áƒ›áƒ”ბის მიზეზის სქáƒáƒšáƒ˜áƒáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“.',
+'tooltip-preferences-save' => 'შეინáƒáƒ®áƒ”თ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
+'tooltip-summary' => 'შეიყვáƒáƒœáƒ”თ მáƒáƒ™áƒšáƒ” სქáƒáƒšáƒ˜áƒ',
# Stylesheets
'common.css' => '/** áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS ყველრგáƒáƒ áƒ”კáƒáƒœáƒ–ე იმáƒáƒ¥áƒ›áƒ”დებს */',
@@ -2645,14 +2713,17 @@ $1',
'imagemaxsize' => "სურáƒáƒ—ის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ <br />''áƒáƒ¦áƒ¬áƒ”რილáƒáƒ‘ის გვერდზე:''",
'thumbsize' => 'შემცირებული ზáƒáƒ›áƒ:',
'widthheightpage' => '$1×$2, $3 გვერდი',
-'file-info' => '(ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $1, MIME ტიპი: $2)',
-'file-info-size' => '($1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3, MIME ტიპი: $4)',
+'file-info' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $1, MIME ტიპი: $2',
+'file-info-size' => '$1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3, MIME ტიპი: $4',
'file-nohires' => '<small>უფრრმáƒáƒ¦áƒáƒšáƒ˜ გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რáƒáƒ  áƒáƒ áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბელი.</small>',
-'svg-long-desc' => '(ფáƒáƒ˜áƒšáƒ˜ SVG, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒáƒ“ $1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3)',
+'svg-long-desc' => 'ფáƒáƒ˜áƒšáƒ˜ SVG, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒáƒ“ $1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3',
'show-big-image' => 'სრული გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘áƒ',
'show-big-image-thumb' => '<small>ზáƒáƒ›áƒ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვისáƒáƒ¡: $1 × $2 პიქსელი</small>',
'file-info-gif-looped' => 'დáƒáƒ áƒ’áƒáƒšáƒ˜áƒšáƒ˜',
'file-info-gif-frames' => '$1 კáƒáƒ“რი',
+'file-info-png-looped' => 'დáƒáƒ áƒ’áƒáƒšáƒ˜áƒšáƒ˜',
+'file-info-png-repeat' => 'დáƒáƒ™áƒ áƒ£áƒšáƒ˜áƒ $1 {{PLURAL:$1|ჯერ}}',
+'file-info-png-frames' => '$1 კáƒáƒ“რი',
# Special:NewFiles
'newimages' => 'áƒáƒ®áƒáƒšáƒ˜ ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒšáƒ”რეáƒ',
@@ -2808,6 +2879,7 @@ $1',
'exif-gpsareainformation' => 'GPS მხáƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლწáƒáƒ“ებáƒ',
'exif-gpsdatestamp' => 'GPS-ის მáƒáƒœáƒáƒªáƒ”მი',
'exif-gpsdifferential' => 'დიფერენციáƒáƒšáƒ£áƒ áƒ˜ შესწáƒáƒ áƒ”ბáƒ',
+'exif-objectname' => 'მáƒáƒ™áƒšáƒ” სáƒáƒ—áƒáƒ£áƒ áƒ˜',
# EXIF attributes
'exif-compression-1' => 'შეუკუმშáƒáƒ•áƒ˜',
@@ -2966,32 +3038,32 @@ $1',
'limitall' => 'ყველáƒ',
# E-mail address confirmation
-'confirmemail' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ',
-'confirmemail_noemail' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ¡ მითითებული მáƒáƒ áƒ—ებული ელმისáƒáƒ›áƒáƒ áƒ—ი [[Special:Preferences|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒ›áƒ”ტრებში]].',
-'confirmemail_text' => '{{SITENAME}} ითხáƒáƒ•áƒ¡ თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒáƒ¡, სáƒáƒœáƒáƒ› ელ.
+'confirmemail' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ',
+'confirmemail_noemail' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ¡ მითითებული მáƒáƒ áƒ—ებული ელმისáƒáƒ›áƒáƒ áƒ—ი [[Special:Preferences|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒ›áƒ”ტრებში]].',
+'confirmemail_text' => '{{SITENAME}} ითხáƒáƒ•áƒ¡ თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒáƒ¡, სáƒáƒœáƒáƒ› ელ.
ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ ფუნქციების გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ¡ შეძლებთ.
გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”თ ღილáƒáƒ™áƒ˜ ქვემáƒáƒ— თქვენს მისáƒáƒ›áƒáƒ áƒ—ზე დáƒáƒ›áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელი შეტყáƒáƒ‘ინების გáƒáƒ¡áƒáƒ’ზáƒáƒ•áƒœáƒáƒ“.
თქვენს ელ. წერილში მითითებული იქნებრბმული შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ზე;
გáƒáƒ®áƒ¡áƒ”ნით ბმული თქვენს ბრáƒáƒ£áƒ–ერში თქვენი ელ.
ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის გáƒáƒ¡áƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბლáƒáƒ“.',
-'confirmemail_pending' => 'წერილი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ით უკვე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ.
+'confirmemail_pending' => 'წერილი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ით უკვე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ.
თუ თქვენ áƒáƒ›áƒ¬áƒáƒ›áƒ¡ შექმენით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ გთხáƒáƒ•áƒ— დáƒáƒšáƒáƒ“áƒáƒ— ცáƒáƒ¢áƒ ხáƒáƒœáƒ˜ კáƒáƒ“ის áƒáƒ®áƒšáƒáƒ“ მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ›áƒ“ე.',
-'confirmemail_send' => 'დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
-'confirmemail_sent' => 'დáƒáƒ›áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელი შეტყáƒáƒ‘ინებრგáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ.',
-'confirmemail_oncreate' => 'წერილი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ით გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ თქვენს მიერ მითთებულ სáƒáƒ¤áƒáƒ¡áƒ¢áƒ ყუთზე.
+'confirmemail_send' => 'დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
+'confirmemail_sent' => 'დáƒáƒ›áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელი შეტყáƒáƒ‘ინებრგáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ.',
+'confirmemail_oncreate' => 'წერილი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ით გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ თქვენს მიერ მითთებულ სáƒáƒ¤áƒáƒ¡áƒ¢áƒ ყუთზე.
მáƒáƒªáƒ”მული კáƒáƒ“ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ სáƒáƒ­áƒ˜áƒ áƒ სისტემáƒáƒ¨áƒ˜ შესვლისთვის, თუმცრთქვენ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გინáƒáƒ— იგი.
მáƒáƒœáƒáƒ›, სáƒáƒœáƒáƒ› მიიღებთ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ¡ პრáƒáƒ”ქტში.',
-'confirmemail_sendfailed' => 'შეუძლებელირდáƒáƒ›áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელი შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•áƒœáƒ.
+'confirmemail_sendfailed' => 'შეუძლებელირდáƒáƒ›áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბელი შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•áƒœáƒ.
გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ მისáƒáƒ›áƒáƒ áƒ—ის შემáƒáƒ“გენელი სიმბáƒáƒšáƒáƒ”ბის სისწáƒáƒ áƒ”.
სერვერის პáƒáƒ¡áƒ£áƒ®áƒ˜: $1',
-'confirmemail_invalid' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ი. შესáƒáƒ«áƒšáƒáƒ კáƒáƒ“ი ძáƒáƒšáƒáƒ“áƒáƒ™áƒáƒ áƒ’ული იყáƒáƒ¡.',
-'confirmemail_needlogin' => 'თქვენ გჭირდებáƒáƒ— $1 თქვენი ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ¡áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბლáƒáƒ“.',
-'confirmemail_success' => 'თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბულიáƒ. áƒáƒ®áƒšáƒ შეგიძლიáƒáƒ— ვიკიში [[Special:UserLogin|შესვლáƒ]].',
-'confirmemail_loggedin' => 'თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრმიღებულიáƒ.',
-'confirmemail_error' => 'შეცდáƒáƒ›áƒ მáƒáƒ®áƒ“რთქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის დრáƒáƒ¡.',
-'confirmemail_subject' => '{{SITENAME}} ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ',
-'confirmemail_body' => 'ვიღáƒáƒªáƒáƒ›, შესáƒáƒ«áƒšáƒáƒ თქვენ, IP მისáƒáƒ›áƒáƒ áƒ—ით $1, დáƒáƒáƒ áƒ”გისტრირეთ
+'confirmemail_invalid' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ი. შესáƒáƒ«áƒšáƒáƒ კáƒáƒ“ი ძáƒáƒšáƒáƒ“áƒáƒ™áƒáƒ áƒ’ული იყáƒáƒ¡.',
+'confirmemail_needlogin' => 'თქვენ გჭირდებáƒáƒ— $1 თქვენი ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ¡áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბლáƒáƒ“.',
+'confirmemail_success' => 'თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბულიáƒ. áƒáƒ®áƒšáƒ შეგიძლიáƒáƒ— ვიკიში [[Special:UserLogin|შესვლáƒ]].',
+'confirmemail_loggedin' => 'თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრმიღებულიáƒ.',
+'confirmemail_error' => 'შეცდáƒáƒ›áƒ მáƒáƒ®áƒ“რთქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის დრáƒáƒ¡.',
+'confirmemail_subject' => '{{SITENAME}} ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ',
+'confirmemail_body' => 'ვიღáƒáƒªáƒáƒ›, შესáƒáƒ«áƒšáƒáƒ თქვენ, IP მისáƒáƒ›áƒáƒ áƒ—ით $1, დáƒáƒáƒ áƒ”გისტრირეთ
áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ "$2" áƒáƒ› ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ით áƒáƒ¥ {{SITENAME}}.
იმის დáƒáƒ¡áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბლáƒáƒ“, რáƒáƒ› ეს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ ნáƒáƒ›áƒ“ვილáƒáƒ“ თქვენ გეკუთვნით
@@ -3002,8 +3074,38 @@ $3
თუ ეს თქვენ *áƒáƒ * იყáƒáƒ•áƒ˜áƒ—, მáƒáƒ¨áƒ˜áƒœ ნუ შეხვáƒáƒšáƒ— áƒáƒ› ბმულზე.
დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ის ვáƒáƒ“რáƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ”ბრ$4-თვის.',
-'confirmemail_invalidated' => 'ელ–ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრგáƒáƒ£áƒ¥áƒ›áƒ“áƒ',
-'invalidateemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
+'confirmemail_body_changed' => 'ვიღáƒáƒªáƒáƒ›, შესáƒáƒ«áƒšáƒáƒ თქვენ, IP მისáƒáƒ›áƒáƒ áƒ—ით $1,
+შეცვáƒáƒšáƒ áƒáƒœáƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ იმეილი "$2" áƒáƒ› ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ით {{SITENAME}}-ზე.
+
+იმის დáƒáƒ¡áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბლáƒáƒ“, რáƒáƒ› ეს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ ნáƒáƒ›áƒ“ვილáƒáƒ“ თქვენ გეკუთვნით
+დრელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ების გáƒáƒ“áƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბლáƒáƒ“ {{SITENAME}} გვერდზე,
+
+გáƒáƒ®áƒ¡áƒ”ნით ეს ბმული თქვენს ბრáƒáƒ£áƒ–ერში:
+
+$3
+
+თუ ეს თქვენ *áƒáƒ * იყáƒáƒ•áƒ˜áƒ—, მáƒáƒ¨áƒ˜áƒœ ნუ შეხვáƒáƒšáƒ— მიყევით áƒáƒ› ბმულს იმეილის შემáƒáƒ¬áƒ›áƒ”ბის გáƒáƒ¡áƒáƒ—იშáƒáƒ“.
+
+$5
+
+წერილი მáƒáƒ«áƒ•áƒ”ლდებრ$4.',
+'confirmemail_body_set' => 'ვიღáƒáƒªáƒáƒ›, შესáƒáƒ«áƒšáƒáƒ თქვენ, IP მისáƒáƒ›áƒáƒ áƒ—ით $1,
+შეცვáƒáƒšáƒ áƒáƒœáƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ იმეილი "$2" áƒáƒ› ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ით {{SITENAME}}-ზე.
+
+იმის დáƒáƒ¡áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბლáƒáƒ“, რáƒáƒ› ეს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ ნáƒáƒ›áƒ“ვილáƒáƒ“ თქვენ გეკუთვნით
+დრელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ების გáƒáƒ“áƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბლáƒáƒ“ {{SITENAME}} გვერდზე,
+
+გáƒáƒ®áƒ¡áƒ”ნით ეს ბმული თქვენს ბრáƒáƒ£áƒ–ერში:
+
+$3
+
+თუ ეს თქვენ *áƒáƒ * იყáƒáƒ•áƒ˜áƒ—, მáƒáƒ¨áƒ˜áƒœ ნუ შეხვáƒáƒšáƒ— მიყევით áƒáƒ› ბმულს იმეილის შემáƒáƒ¬áƒ›áƒ”ბის გáƒáƒ¡áƒáƒ—იშáƒáƒ“.
+
+$5
+
+წერილი მáƒáƒ«áƒ•áƒ”ლდებრ$4.',
+'confirmemail_invalidated' => 'ელ–ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრგáƒáƒ£áƒ¥áƒ›áƒ“áƒ',
+'invalidateemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» გáƒáƒ—იშულიáƒ]',
@@ -3043,6 +3145,7 @@ $1',
'table_pager_first' => 'პირველი გვერდი',
'table_pager_last' => 'ბáƒáƒšáƒ გვერდი',
'table_pager_limit' => 'áƒáƒ©áƒ•áƒ”ნეთ $1 ელემნტი გვერდზე',
+'table_pager_limit_label' => 'ჩáƒáƒœáƒáƒ¬áƒ”რი გვერდზე:',
'table_pager_limit_submit' => 'áƒáƒ©áƒ•áƒ”ნე',
'table_pager_empty' => 'შედეგები áƒáƒ áƒáƒ',
@@ -3105,6 +3208,7 @@ $1',
'version-specialpages' => 'სპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდები',
'version-parserhooks' => 'სინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ ჰუკები',
'version-variables' => 'Ñмфдуифвуиш',
+'version-skins' => 'იერსáƒáƒ®áƒ”',
'version-other' => 'სხვáƒ',
'version-mediahandlers' => 'მედირდáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბáƒ',
'version-hooks' => 'ჰუკებш',
@@ -3116,6 +3220,13 @@ $1',
'version-hook-subscribedby' => 'ჩáƒáƒ¬áƒ”რილიáƒ',
'version-version' => '(ვერსირ$1)',
'version-license' => 'ლიცენზიáƒ',
+'version-poweredby-credits' => "ეს ვიკი მუშáƒáƒáƒ‘ს '''[http://www.mediawiki.org/ MediaWiki]'''-ს ძრáƒáƒ•áƒ–ე, copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'სხვები',
+'version-license-info' => 'MediaWiki áƒáƒ áƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ; შეგიძლიáƒáƒ— მისი გáƒáƒ•áƒ áƒªáƒ”ლებრáƒáƒœ/დრმáƒáƒ“იფიცირებრGNU General Public License ლიცენზიის პირáƒáƒ‘ების შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“. რáƒáƒ’áƒáƒ áƒª გáƒáƒ›áƒáƒ¥áƒ•áƒ”ყნებულირთáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ˜áƒ¡ ფáƒáƒœáƒ“ის მიერ; áƒáƒœ ლიცენზიის მეáƒáƒ áƒ” ვერსიáƒáƒ¨áƒ˜, áƒáƒœ (თქვენი áƒáƒ–რით) უფრრáƒáƒ®áƒáƒšáƒ¨áƒ˜.
+
+MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› ის სáƒáƒ¡áƒáƒ áƒ’ებლრიქნებáƒ, მáƒáƒ’რáƒáƒ› გáƒáƒ áƒáƒœáƒ¢áƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ”შე; კáƒáƒ›áƒ”რციული ღირებულების ნáƒáƒ’ულისხმევი გáƒáƒ áƒáƒœáƒ¢áƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ”შეც კი áƒáƒœ რáƒáƒ˜áƒ›áƒ” მიზნისთვის სáƒáƒ áƒ’ებლის მისáƒáƒ¦áƒ”ბáƒáƒ“. მეტი დეტáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის, იხილეთ GNU General Public License.
+
+áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ თქვენ უნდრმიგეღáƒáƒ— [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License ლიცენზიის áƒáƒ¡áƒšáƒ˜]; თუ áƒáƒ  მიგიღიáƒáƒ—, მისწერეთ თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ˜áƒ¡ ფáƒáƒœáƒ“ს, Free Software Foundation, Inc., ფრáƒáƒœáƒ™áƒšáƒ˜áƒœáƒ˜áƒ¡ ქუჩრ51, მეხუთე სáƒáƒ áƒ—ული, ბáƒáƒ¡áƒ¢áƒáƒœáƒ˜, MA 02110-1301, áƒáƒ¨áƒ¨, áƒáƒœ [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html წáƒáƒ˜áƒ™áƒ˜áƒ—ხეთ იგი ინტერნეტში].',
'version-software' => 'დáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒ˜áƒ áƒ”ბული პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ',
'version-software-product' => 'პრáƒáƒ“უქტი',
'version-software-version' => 'ვერსიáƒ',
@@ -3183,6 +3294,15 @@ $1',
'tags-edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'tags-hitcount' => '$1 ცვლილებáƒ',
+# Special:ComparePages
+'comparepages' => 'გვერდების შედáƒáƒ áƒ”ბáƒ',
+'compare-selector' => 'გვერდების ვერსიების შედáƒáƒ áƒ”ბáƒ',
+'compare-page1' => '1 გვერდი',
+'compare-page2' => '2 გვერდი',
+'compare-rev1' => 'პირველი ვერსიáƒ',
+'compare-rev2' => 'მეáƒáƒ áƒ” ვერსიáƒ',
+'compare-submit' => 'შედáƒáƒ áƒ”ბáƒ',
+
# Database error messages
'dberr-header' => 'ეს ვიკი გáƒáƒœáƒ˜áƒªáƒ“ის პრáƒáƒ‘ლემáƒáƒ¡',
'dberr-problems' => 'ბáƒáƒ“იში! სáƒáƒ˜áƒ¢áƒ–ე დრáƒáƒ”ბითი ტექნიკური პრáƒáƒ‘ლემებიáƒ',
@@ -3199,8 +3319,13 @@ $1',
'htmlform-float-invalid' => 'თქვენს მიერ მითითებული მნიშვნელáƒáƒ‘რáƒáƒ  áƒáƒ áƒ˜áƒ¡ რიცხვი.',
'htmlform-int-toolow' => 'თქვენს მიერ მითითებული მნიშვნელáƒáƒ‘რმინიმუმზე დáƒáƒ‘áƒáƒšáƒ˜áƒ — $1',
'htmlform-int-toohigh' => 'თქვენს მიერ მითითებული მნიშვნელáƒáƒ‘რმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ¡ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრ— $1',
+'htmlform-required' => 'ეს მნიშვნელáƒáƒ‘რსáƒáƒ­áƒ˜áƒ áƒáƒ',
'htmlform-submit' => 'შენáƒáƒ®áƒ•áƒ',
'htmlform-reset' => 'ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
'htmlform-selectorother-other' => 'სხვáƒ',
+# SQLite database support
+'sqlite-has-fts' => '$1 სრული ტექსტის ძიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რით',
+'sqlite-no-fts' => '$1 სრული ტექსტის ძიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რის გáƒáƒ áƒ”შე',
+
);
diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php
index 9027b90c..b16ade96 100644
--- a/languages/messages/MessagesKaa.php
+++ b/languages/messages/MessagesKaa.php
@@ -164,8 +164,7 @@ $messages = array(
'tog-editsection' => "Bo'limlerdi [o'zgertiw] siltew arqalı o'zgertiwdi qos",
'tog-editsectiononrightclick' => "Bo'lim atamasın on' jaqqa basıp o'zgertiwdi qos (JavaScript)",
'tog-showtoc' => "Mazmunın ko'rset (3-ten artıq bo'limi bar betlerge)",
-'tog-rememberpassword' => "Menin' kirgenimdi usı kompyuterde saqlap qal",
-'tog-editwidth' => "O'zgertiw maydanının' enin tolıq ekrang'a sozıw",
+'tog-rememberpassword' => "Menin' kirgenimdi usı kompyuterde saqlap qal (en' ko'bi menen $1 {{PLURAL:$1|ku'nge|ku'nge}} shekem)",
'tog-watchcreations' => 'Men jaratqan betlerdi baqlaw dizimime qos',
'tog-watchdefault' => "Men o'zgeris kiritken betlerdi baqlaw dizimime qos",
'tog-watchmoves' => "Men ko'shirgen betlerdi baqlaw dizimime qos",
@@ -299,31 +298,20 @@ $messages = array(
'faqpage' => 'Project:KBS',
# Vector skin
-'vector-action-addsection' => 'Tema qosıw',
-'vector-action-delete' => "O'shiriw",
-'vector-action-move' => "Ko'shiriw",
-'vector-action-protect' => "Qorg'aw",
-'vector-action-undelete' => 'Qayta tiklew',
-'vector-action-unprotect' => "Qorg'amaw",
-'vector-namespace-category' => 'Kategoriya',
-'vector-namespace-help' => 'Anıqlama beti',
-'vector-namespace-image' => 'Fayl',
-'vector-namespace-main' => 'Bet',
-'vector-namespace-media' => 'Media beti',
-'vector-namespace-mediawiki' => 'Xabar',
-'vector-namespace-project' => 'Proyekt beti',
-'vector-namespace-special' => 'Arnawlı bet',
-'vector-namespace-talk' => 'Diskussiya',
-'vector-namespace-template' => 'Shablon',
-'vector-namespace-user' => 'Paydalanıwshı beti',
-'vector-view-create' => 'Jaratıw',
-'vector-view-edit' => "O'zgertiw",
-'vector-view-history' => "Tariyxın ko'riw",
-'vector-view-view' => 'Oqıw',
-'vector-view-viewsource' => "Deregin ko'riw",
-'actions' => "Ha'reketler",
-'namespaces' => "Ä°simler ko'plikleri",
-'variants' => 'Variantlar',
+'vector-action-addsection' => 'Tema qosıw',
+'vector-action-delete' => "O'shiriw",
+'vector-action-move' => "Ko'shiriw",
+'vector-action-protect' => "Qorg'aw",
+'vector-action-undelete' => 'Qayta tiklew',
+'vector-action-unprotect' => "Qorg'amaw",
+'vector-view-create' => 'Jaratıw',
+'vector-view-edit' => "O'zgertiw",
+'vector-view-history' => "Tariyxın ko'riw",
+'vector-view-view' => 'Oqıw',
+'vector-view-viewsource' => "Deregin ko'riw",
+'actions' => "Ha'reketler",
+'namespaces' => "Ä°simler ko'plikleri",
+'variants' => 'Variantlar',
'errorpagetitle' => 'Qatelik',
'returnto' => '$1 betine qaytıw.',
@@ -541,7 +529,7 @@ Akkauntın'ız jaratıldı.
'yourname' => 'Paydalanıwshı atı:',
'yourpassword' => 'Parol:',
'yourpasswordagain' => "Paroldi qayta kiritin':",
-'remembermypassword' => "Menin' kirgenimdi usı kompyuterde saqlap qal",
+'remembermypassword' => "Menin' kirgenimdi usı kompyuterde saqlap qal (en' ko'bi menen $1 {{PLURAL:$1|ku'nge|ku'nge}} shekem)",
'yourdomainname' => "Sizin' domen:",
'login' => 'Kiriw',
'nav-login-createaccount' => 'Kiriw / akkaunt jaratıw',
@@ -665,7 +653,7 @@ Kiriw protsessin juwmaqlaw ushın jan'a parolin'izdi usı jerge kiritin':",
\"Saqlaw\"dı ja'ne bassan'ız, o'zgerislerin'iz hesh qanday kommentariysiz saqlanadı.",
'missingcommenttext' => "Kommentariydi to'mende kiritin'.",
'missingcommentheader' => "'''Eskertpe:''' Bul kommentariy ushın atama ko'rsetpedin'iz.
-Eger ja'ne \"Saqlaw\"dı bassan'ız, o'zgerislerin'iz olsız saqlanadı.",
+Eger ja'ne \"{{int:savearticle}}\" bassan'ız, o'zgerislerin'iz olsız saqlanadı.",
'summary-preview' => "Juwmag'ın ko'rip shıg'ıw:",
'subject-preview' => 'Atamanı aldınnan qaraw:',
'blockedtitle' => "Paydalanıwshı bloklang'an",
@@ -724,7 +712,6 @@ Qaytadan ha'reket qılıp ko'rin'. Eger bul payda bermese, [[Special:UserLogout|
Qosqan u'lesin'iz o'zin'izdin' jazg'anın'ız yamasa ashıq tu'rdegi derekten alıng'anlig'ına wa'de berin'.
'''AVTORLIQ HUQUQI MENEN QORG'ALG'AN MAG'LIWMATLARDI RUXSATSIZ JAYLASTIRMAN'!'''",
'copyrightwarning2' => "Este tutın', {{SITENAME}} proyektindegi barlıq u'lesler basqa paydalanıwshılar arqalı o'zgertiliwi yamasa o'shiriliwi mu'mkin. Eger siz tekstin'izdin' erkin tarqatılıwın ha'mde qa'legen paydalanıwshı o'zgertiwin qa'lemesen'iz, bul jerge jaylastırmag'anın'ız maqul.<br /> Qosqan u'lesin'iz o'zin'izdin' jazg'anın'ız yamasa ashıq tu'rdegi derekten alıng'anlig'ına wa'de berin' (qosımsha mag'lıwmat ushın $1 hu'jjetin qaran'). '''AVTORLIQ HUQUQI MENEN QORG'ALG'AN MAG'LIWMATLARDI RUXSATSIZ JAYLASTIRMAN'!'''",
-'longpagewarning' => "'''ESLETPE: Bul bettin' ha'jmi $1 kilobayt, geybir brauzerler 32 kBqa jaqın yamasa onnan u'lken bolg'an betlerdi o'zgertiwde qıyınshılıqlarg'a tuwra keliwi mu'mkin. Betti kishi bo'leklerge bo'liw haqqında oylap ko'rin'.'''",
'semiprotectedpagewarning' => "'''Eskertiw:''' Bul bet qulplang'an, onı tek registratsiyadan o'tken paydalanıwshılar g'ana o'zgerte aladı.
To'mende en' aqırg'ı jurnal mag'lıwmatları berilgen.",
'templatesused' => "Bul bette qollanılg'an {{PLURAL:$1|shablon|shablonlar}}:",
@@ -853,7 +840,7 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
'lineno' => 'Qatar No $1:',
'compareselectedversions' => "Saylang'an nusqalardı salıstırıw",
'editundo' => 'qaytar',
-'diff-multi' => "(Aradag'ı {{PLURAL:$1|bir nusqa|$1 nusqa}} ko'rsetilmeydi.)",
+'diff-multi' => "({{PLURAL:$2|bir paydalanıwshı|$2 paydalanıwshı}} ta'repinen {{PLURAL:$1|aralıq bir nusqa|aralıq $1 nusqa}} ko'rsetilmeydi.)",
# Search results
'searchresults' => "Ä°zlew na'tiyjeleri",
@@ -1110,14 +1097,9 @@ Siz ja'ne de basqa paydalanıwshılarg'a siz benen (adresin'izdi bilmegen halda)
'recentchanges-legend' => "Aqırg'ı o'zgerisler sazlawları",
'recentchangestext' => "Bul bette usı wikidegi ha'zirgi o'zgerisler baqlanadı.",
'recentchanges-feed-description' => "Wikidin' usı ag'ımındag'ı en' aqırg'ı o'zgerislerin baqlaw.",
-'recentchanges-label-legend' => "Sha'rtli belgiler: $1.",
-'recentchanges-legend-newpage' => '$1 - taza bet',
'recentchanges-label-newpage' => "Bul o'zgeris arqalı taza bet jaratıldı",
-'recentchanges-legend-minor' => "$1 - kishi o'zgeris",
'recentchanges-label-minor' => "Bul kishi o'zgeris",
-'recentchanges-legend-bot' => "$1 - bot kiritken o'zgeris",
'recentchanges-label-bot' => "Bul o'zgeristi bot kiritti",
-'recentchanges-legend-unpatrolled' => "$1 - baqlanbag'an o'zgeris",
'recentchanges-label-unpatrolled' => "Bul o'zgeris ele baqlanbag'an",
'rcnote' => "To'mende $4, $5 waqtındag'ı aqırg'ı {{PLURAL:$2|ku'ndegi|'''$2''' ku'ndegi}} {{PLURAL:$1|'''1''' o'zgeris ko'rsetilgen|aqırg'ı '''$1''' o'zgeris ko'rsetilgen}}.",
'rcnotefrom' => "To'mende '''$2''' baslap '''$1''' shekemgi o'zgerisler ko'rsetilgen.",
@@ -1154,42 +1136,42 @@ Siz ja'ne de basqa paydalanıwshılarg'a siz benen (adresin'izdi bilmegen halda)
'recentchangeslinked-to' => "Kerisinshe, berilgen betke silteytug'ın betlerdegi o'zgerislerdi ko'rset",
# Upload
-'upload' => 'Fayldı aploud qılıw',
-'uploadbtn' => 'Aploud!',
-'reuploaddesc' => "Aploudtı biykar etiw ha'm aploud formasına qaytıw",
-'uploadnologin' => 'Kirilmegen',
-'uploadnologintext' => "Fayllardı aploud qılıw ushın [[Special:UserLogin|kiriwin'iz]] kerek.",
-'uploaderror' => "Aploud qa'tesi",
-'upload-permitted' => "Ruxsat etilgen fayl tu'rleri: $1.",
-'upload-preferred' => "Unamlı fayl tu'rleri: $1.",
-'upload-prohibited' => "Ruxsat etilmegen fayl tu'rleri: $1.",
-'uploadlog' => 'aploud jurnalı',
-'uploadlogpage' => 'Aploud jurnalı',
-'filename' => 'Fayl atı',
-'filedesc' => 'Juwmaq',
-'fileuploadsummary' => 'Juwmaq:',
-'filestatus' => 'Avtorlıq huqıqı statusı:',
-'filesource' => 'Fayl deregi:',
-'uploadedfiles' => "Aploud qılıng'an faillar",
-'ignorewarning' => 'Eskertiwlerdi esapqa almay fayldı saqla',
-'ignorewarnings' => 'Hesh qanday eskertiwdi esapqa alma',
-'minlength1' => "Fail atı keminde bir ha'ripten turıwı sha'rt.",
-'badfilename' => 'Fayl atı bug\'an o\'zgertildi: "$1".',
-'filetype-badmime' => '"$1" MIME tu\'rli fayllardı aploud qılıw ruxsat etilmeydi.',
-'filetype-missing' => 'Bul faildın ken\'eytpesi (mısalı ".jpg") joq.',
-'largefileserver' => "Bul faildın mo'lsheri serverdin' ruxsatınan u'lken.",
-'successfulupload' => 'Tabıslı aploud',
-'uploadwarning' => 'Aploud eskertiwi',
-'savefile' => 'Fayldı saqla',
-'uploadedimage' => '«[[$1]]» faylı aploud qılındı',
-'overwroteimage' => '"[[$1]]" faylının\' jan\'a nusqası aploud qılındı',
-'uploaddisabled' => 'Aploudqa ruxsat berilmegen',
-'uploaddisabledtext' => "Fayllardı aploud qılıw toqtatılg'an.",
-'uploadvirus' => "Bul failda virus bar! Mag'lıwmat: $1",
-'sourcefilename' => "Derektin' fayl atı:",
-'destfilename' => 'Belgilengen fail atı:',
-'upload-maxfilesize' => "Fayldın' maksimal ko'lemi: $1",
-'watchthisupload' => 'Bul fayldı baqlaw',
+'upload' => 'Fayldı aploud qılıw',
+'uploadbtn' => 'Aploud!',
+'reuploaddesc' => "Aploudtı biykar etiw ha'm aploud formasına qaytıw",
+'uploadnologin' => 'Kirilmegen',
+'uploadnologintext' => "Fayllardı aploud qılıw ushın [[Special:UserLogin|kiriwin'iz]] kerek.",
+'uploaderror' => "Aploud qa'tesi",
+'upload-permitted' => "Ruxsat etilgen fayl tu'rleri: $1.",
+'upload-preferred' => "Unamlı fayl tu'rleri: $1.",
+'upload-prohibited' => "Ruxsat etilmegen fayl tu'rleri: $1.",
+'uploadlog' => 'aploud jurnalı',
+'uploadlogpage' => 'Aploud jurnalı',
+'filename' => 'Fayl atı',
+'filedesc' => 'Juwmaq',
+'fileuploadsummary' => 'Juwmaq:',
+'filestatus' => 'Avtorlıq huqıqı statusı:',
+'filesource' => 'Fayl deregi:',
+'uploadedfiles' => "Aploud qılıng'an faillar",
+'ignorewarning' => 'Eskertiwlerdi esapqa almay fayldı saqla',
+'ignorewarnings' => 'Hesh qanday eskertiwdi esapqa alma',
+'minlength1' => "Fail atı keminde bir ha'ripten turıwı sha'rt.",
+'badfilename' => 'Fayl atı bug\'an o\'zgertildi: "$1".',
+'filetype-badmime' => '"$1" MIME tu\'rli fayllardı aploud qılıw ruxsat etilmeydi.',
+'filetype-missing' => 'Bul faildın ken\'eytpesi (mısalı ".jpg") joq.',
+'largefileserver' => "Bul faildın mo'lsheri serverdin' ruxsatınan u'lken.",
+'uploadwarning' => 'Aploud eskertiwi',
+'savefile' => 'Fayldı saqla',
+'uploadedimage' => '«[[$1]]» faylı aploud qılındı',
+'overwroteimage' => '"[[$1]]" faylının\' jan\'a nusqası aploud qılındı',
+'uploaddisabled' => 'Aploudqa ruxsat berilmegen',
+'uploaddisabledtext' => "Fayllardı aploud qılıw toqtatılg'an.",
+'uploadvirus' => "Bul failda virus bar! Mag'lıwmat: $1",
+'sourcefilename' => "Derektin' fayl atı:",
+'destfilename' => 'Belgilengen fail atı:',
+'upload-maxfilesize' => "Fayldın' maksimal ko'lemi: $1",
+'watchthisupload' => 'Bul fayldı baqlaw',
+'upload-success-subj' => 'Tabıslı aploud',
'upload-proto-error' => 'Nadurıs protokol',
'upload-file-error' => "Ä°shki qa'telik",
@@ -1459,7 +1441,6 @@ Ja'nede [[Special:WantedCategories|kerekli kategoriyalardı]] qarap ko'rin'.",
# Watchlist
'watchlist' => 'Betlerdi baqlaw dizimi',
'mywatchlist' => "Menin' baqlaw dizimim",
-'watchlistfor' => "('''$1''' ushın)",
'nowatchlist' => "Baqlaw dizimin'iz bos.",
'watchlistanontext' => "Baqlaw dizimin'izdegilerdi qaraw yamasa o'zgertiw ushın $1 kerek.",
'watchnologin' => 'Kirilmegen',
@@ -1873,10 +1854,10 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'thumbsize' => "Miniatyuranın' ha'jmi:",
'widthheight' => '$1 × $2',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|bet|bet}}',
-'file-info' => "(fayldın' ha'jmi: $1, MIME tu'ri: $2)",
-'file-info-size' => "($1 × $2 piksel, fayldın' ha'jmi: $3, MIME tu'ri: $4)",
+'file-info' => "fayldın' ha'jmi: $1, MIME tu'ri: $2",
+'file-info-size' => "$1 × $2 piksel, fayldın' ha'jmi: $3, MIME tu'ri: $4",
'file-nohires' => '<small>Bunnan joqarı imkaniyatlı tabılmadı.</small>',
-'svg-long-desc' => "(SVG fayl, $1 × $2 piksel belgilengen, fayldın' ha'jmi: $3)",
+'svg-long-desc' => "SVG fayl, $1 × $2 piksel belgilengen, fayldın' ha'jmi: $3",
'show-big-image' => 'Joqarı imkaniyatlı',
'show-big-image-thumb' => "<small>Bul aldinnan ko'riwdin' ha'jmi: $1 × $2 piksel</small>",
diff --git a/languages/messages/MessagesKab.php b/languages/messages/MessagesKab.php
index 5c3d88c7..13cd867e 100644
--- a/languages/messages/MessagesKab.php
+++ b/languages/messages/MessagesKab.php
@@ -52,8 +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',
-'tog-editwidth' => 'Tankult n ubeddel tesɛa tehri ettmam',
+'tog-rememberpassword' => 'Cfu ɣef yisem n wemseqdac inu di uselkim-agi (for a maximum of $1 {{PLURAL:$1|day|days}})',
'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',
@@ -336,7 +335,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.',
+'remembermypassword' => 'Cfu É£ef wawal n tbaá¸nit inu di uselkim-agi (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Taɣult inek',
'externaldberror' => 'Yella ugul aberrani n database neɣ ur tettalaseḠara ad tbeddleḠisem an wemseqdac aberrani inek.',
'login' => 'Kcem',
@@ -475,7 +474,7 @@ Ma tÉ£elá¹­eá¸, wekki kan É£ef tqeffalt "Back/Précédent" n browser/explorateu
'userjsyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tÉ›erá¸eḠJS amynut inek uqbel ad tesmektiá¸.",
'usercsspreview' => "'''Smekti belli aql-ak twaliḠCSS inek kan, mazal ur yettusmekti ara!'''",
'userjspreview' => "'''Smekti belli aql-ak tÉ›erá¸eḠJavaScript inek kan, mazal ur yettusmekti ara!'''",
-'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/monobook.css akk d {{ns:user}}:Foo/Monobook.css.',
+'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!'''",
@@ -508,8 +507,6 @@ Aqlak teggaleḠbelli tureḠwagi d keÄÄ, neÉ£ teddmiá¸-t seg taÉ£ult azaye
'copyrightwarning2' => "Ssen belli akk tikkin deg {{SITENAME}} zemren ad ttubeddlen neÉ£ ttumḥan sÉ£ur imdanen wiyaá¸. Lukan ur tebÉ£iḠara aru inek yettubeddel neÉ£ yettwazen u yettwaru deg imkanen nniá¸en, ihi ur t-tazneḠara dagi.<br />
Aqlak teggaleḠbelli tureḠwagi d keÄÄ, neÉ£ teddmiá¸-t seg taÉ£ult azayez neÉ£ iÉ£bula tilelliyin (ẓer $1 akken ad tessneḠkter).
'''UR TEFKIḌ ARA AXDAM S COPYRIGHT MEBLA TURAGT!'''",
-'longpagewarning' => "'''AƔTAL: Asebter-agi yesɛa $1 kilobytes/kilooctets; kra n browsers/explorateur ur zemren ara ad beddlen isebtar i yesɛan 32 kB/ko neɣ kter.
-G leɛnayek frec asebter-nni.'''",
'longpageerror' => "'''AGUL: Aá¸ris i tefkiḠyesÉ›a $1 kB/ko, tiddi-yagi kter n $2 kB/ko, ur yezmir ara ad yesmekti.'''",
'readonlywarning' => "'''AƔTAL: Database d tamsekker akken ad teddwaxdem,
ihi ur tezmireḠara ad tesmektiḠibeddlen inek tura. Smekti aá¸ris inek
@@ -785,7 +782,6 @@ Ma llant kif-kif ur tt-taznepd ara.",
Ma tesɛiḠtugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.",
'fileexists-forbidden' => 'Tugna s yisem kif-kif tewǧed yagi; g leɛnayek uɣal u beddel isem-is. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Tugna s yisem kif-kif tewǧed yagi; g leɛnayek uɣal u beddel isem-is. [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'Azen yekfa',
'uploadwarning' => 'AÉ£tal deg wazan n ufayluwen',
'savefile' => 'Smekti afaylu',
'uploadedimage' => '"[[$1]]" yettwazen',
@@ -797,6 +793,7 @@ Ma tesɛiḠtugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
'destfilename' => 'Anda iruḥ afaylu',
'watchthisupload' => 'Æass asebter-agi',
'filewasdeleted' => 'Afaylu s yisem-agi yettwazen umbeÉ›d yettumḥa. Ssenqed $1 qbel ad tazniḠtikelt nniá¸en.',
+'upload-success-subj' => 'Azen yekfa',
'upload-proto-error' => 'Agul deg protokol',
'upload-proto-error-text' => 'Assekcam yenṭerr URL i yebdan s <code>http://</code> neɣ <code>ftp://</code>.',
@@ -994,7 +991,6 @@ 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',
-'watchlistfor' => "(n '''$1''')",
'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',
@@ -1078,9 +1074,11 @@ Tadhelt:
'deletecomment' => 'Ayɣer',
# Rollback
-'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]]',
+'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]]',
+
+# Edit tokens
'sessionfailure' => 'Yella ugul akk d takmect inek;
Axdam-agi yebá¹­el axaá¹­er waqila yella wemdan nniá¸en i yeddem isem n wemseqdac inek.
G leÉ›nayek wekki É£ef taqeffalt "Back/Précédent" n browser/explorateur inek, umbeÉ›d wekki É£ef "Actualiser/reload" akk ad tÉ›erá¸eḠtikelt nniá¸en.',
@@ -1381,8 +1379,8 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'mediawarning' => "'''Aɣtal''': Waqila afaylu-yagi yesɛa angal aḥraymi, lukan a t-tesseqdceḠyezmer ad ixesser aselkim inek.",
'imagemaxsize' => 'Ḥedded tiddi n tugniwin deg yiglamen n tugniwim i:',
'thumbsize' => 'Tiddi n tugna tamecṭuḥt:',
-'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-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' => '<small>Ulac resolution i tameqqrant fell-as.</small>',
'show-big-image' => 'Resolution tameqqrant',
'show-big-image-thumb' => '<small>Tiddi n pre-timeẓriwt-agi: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesCkb_latn.php b/languages/messages/MessagesKbd.php
index 25e5dbde..bf4cdef7 100644
--- a/languages/messages/MessagesCkb_latn.php
+++ b/languages/messages/MessagesKbd.php
@@ -1,12 +1,12 @@
<?php
-/** Sorani (Latin script) (Soranî (latînî))
+/** Kabardian
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
*
* @ingroup Language
* @file
- *
+ * @comment falls back to Kabardian (Cyrillic)
*/
-$fallback = 'ckb-arab';
+$fallback = 'kbd-cyrl';
diff --git a/languages/messages/MessagesKbd_cyrl.php b/languages/messages/MessagesKbd_cyrl.php
new file mode 100644
index 00000000..42678226
--- /dev/null
+++ b/languages/messages/MessagesKbd_cyrl.php
@@ -0,0 +1,1332 @@
+<?php
+/** Kabardian (Cyrillic) (КъÑбÑÑ€Ð´ÐµÐ¸Ð±Ð·Ñ / QabardjajÉ™bza (Cyrillic))
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Bogups
+ * @author Marina
+ * @author Ðлёшка
+ * @author Ð¢Ð°Ð¼Ñ Ð‘Ð°Ð»ÑŠÐºÑŠÑрхÑ
+ */
+
+$fallback = 'ru';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'ТехьÑпIÑÑ…ÑÑ€ щIÑÑ‚Ñ…ÑŠÑн:',
+'tog-highlightbroken' => 'ЩымыIÑ Ñ‚ÐµÑ…ÑŒÑпIÑÑ…ÑÑ€ къÑгъÑлъÑгъуÑн <a href="" class="new">мыбы хуÑду</a> (ар Ð¼Ñ‹Ñ…ÑŠÑƒÐ¼Ñ Ð¼Ñ‹Ð¿Ñ…ÑƒÑдÑу<a href="" class="internal">?</a>).',
+'tog-justify' => 'БгъуагъкIÑ Ð½Ð°Ð¿ÑкIуÑцIÑ‹Ñ€ зÑгъÑзÑхуÑн',
+'tog-hideminor' => 'ГъÑпщкIун: кIуÑдкIÑ Ð·Ñ‹Ñ…ÑмылÑжьыхьа, щIÑÑƒÑ ÑхъуÑжа тхылъым',
+'tog-hidepatrolled' => 'ГъÑпшкIун гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ‰IÑлъыплъахÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ гъÑÑ‚ÑÑ€ÑзыгъуÑщIÑÑ…ÑÑ€',
+'tog-newpageshidepatrolled' => 'ГъÑпшкIун напÑкIуÑцI щIÑлъыплъахÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ напÑкIуÑцI-щIÑÑ…ÑÑ€',
+'tog-extendwatchlist' => 'ЩӀÑлъыплъыгъуÑм и тхылъышхуÑ, ÑужырÑй къуÑдейхÑм нÑмыщӀу зÑхъуÑÐºÓ€Ñ‹Ð³ÑŠÑƒÑ Ð¿Ñори Ñ…Ñту',
+'tog-usenewrc' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ó€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ нÑхъыфӀыр къÑгъÑÑÑбÑпын (JavaScript хуÑныкъуÑ)',
+'tog-numberheadings' => 'ПÑалъащхьÑÑ…Ñм автоматику номер Ñтын',
+'tog-showtoolbar' => 'ГъÑÑ‚ÑÑ€Ñзыным идежь Ð¸Ñ‰Ñ…ÑŒÑ Ð¿Ñнелыр гъÑлъÑгъуÑн (JavaScript)',
+'tog-editondblclick' => 'Ð¢Ó€ÑƒÐ°Ð½Ñ Ñ‚ÐµÐºÑŠÑƒÐ·ÑгъуÑÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀхÑÑ€ гъÑÑ‚ÑÑ€Ñзын (requires JavaScript)',
+'tog-editsection' => 'ЛъÑÐ½Ñ‹ÐºÑŠÑƒÑ ÐºÑŠÑÑ Ñ‚ÐµÑ…ÑŒÑÐ¿Ó€Ñ [гъÑÑ‚ÑÑ€Ñзын] гъÑлъÑгъуÑн',
+'tog-editsectiononrightclick' => 'ПÑалъашъхьÑм, дзыгъуÑм и ижырабгъу текъузÑгъуÑÐ¼ÐºÓ€Ñ ÑекциÑÑ…ÑÑ€ гъÑÑ‚ÑÑ€Ñзын (JavaScript)',
+'tog-showtoc' => 'ЗÑÑ…ÑлъыгъуÑÑ€ гъÑлъÑгъуÑн (пÑÑлъашъхьищ нÑхъыбу Ð·Ð¸Ó€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀхÑм)',
+'tog-rememberpassword' => 'Компутерым Ñи логиныр щыхъумÑн (мы нÑхъыбу $1 {{PLURAL:$1|махуÑ|маху}})',
+'tog-watchcreations' => 'Ð¡Ñ ÑщIа напÑкIуÑцIÑ…ÑÑ€ ÑызыкIÑлъыплъ тхылъым Ñ…ÑлъхьÑн',
+'tog-watchdefault' => 'Ð¡Ñ ÑхъуÑжа напÑкIуÑцIÑ…ÑÑ€ ÑызыкIÑлъыплъ тхылъым Ñ…ÑлъхьÑн',
+'tog-watchmoves' => 'Зи цIÑ ÑхъуÑжа напÑкIуÑцIÑ…ÑÑ€ ÑызыкIÑлъыплъ тхылъым Ñ…ÑлъхьÑн',
+'tog-watchdeletion' => 'Ð¡Ñ Ñ‚ÐµÐ·Ð³ÑŠÑкIыжа напÑкIуÑцIÑ…ÑÑ€ ÑызыкIÑлъыплъ тхылъым Ñ…ÑлъхьÑн',
+'tog-minordefault' => 'ГулъытÑгъуÑÑˆÑ…ÑƒÑ Ð·Ð¸Ð¼Ñ‹Ó€Ñ Ñ…ÑƒÑду щӀын гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€',
+'tog-previewontop' => 'ЯпÑ-еплъыр гъÑÑ‚ÑÑ€Ñзыным и пхырыплъым Ð¸Ð¿Ñ Ð¸Ð³ÑŠÑƒÐ²Ñн',
+'tog-previewonfirst' => 'ЯпÑ-еплъыр гъÑÑ‚ÑÑ€Ñзыным кӀуÑным Ð¸Ð¿ÐºÓ€Ñ Ð³ÑŠÑлъÑгъуÑн',
+'tog-nocache' => 'Кеш щӀыныр гъÑункӀыфӀын напÑкӀуÑцӀ браузерым Ñ…ÑÑ‚Ñ…Ñм',
+'tog-enotifwatchlistpages' => 'ПочтÑм къÑӀохун, тхылъ кӀÑлъыплъыгъуÑм Ñ…ÑÑ‚ напÑкӀуÑцӀхÑм Ñ Ð·ÑхъуÑкӀыгъуÑÑ…Ñм',
+'tog-enotifusertalkpages' => 'ПочтÑм къÑӀохун аккаунтым и напÑкӀуÑцӀ тепÑÑлъыхьыгъуÑм и зÑхъуÑкӀыгъуÑÑ…Ñм',
+'tog-enotifminoredits' => 'ПочтÑм къÑӀохун зÑхъуÑÐºÓ€Ñ‹Ð³ÑŠÑƒÑ Ñ†Ó€Ñ‹ÐºÓ€Ñƒ халъхьÑми',
+'tog-enotifrevealaddr' => 'Хъыбар къÑӀохугъуÑÑ…Ñм Ñи Ð¿Ð¾Ñ‡Ñ‚Ñ Ð°Ð´Ñ€ÐµÑÑ‹Ñ€ гъÑлъÑгъуÑн',
+'tog-shownumberswatching' => 'ÐапÑкӀуÑцӀыр Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ кӀÑлъыплъыгъуÑÑ…Ñм Ñ…ÑзгъÑхьахÑм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€ гъÑлъÑгъуÑн',
+'tog-oldsig' => 'Ó€ÑпÑщӀÑдз щыӀÑм и ÑпÑ-еплъ',
+'tog-fancysig' => 'Викитхылъ Ó€ÑпÑщӀÑдз Ӏыгъын (Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸ÐºÑ Ñ‚ÐµÑ…ÑŒÑпӀÑншу)',
+'tog-externaleditor' => 'Ð¥Ñмыт редакторыр къÑгъÑÑÑбÑпын (компутырым абым теухуа тегъÑпÑÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ…ÑƒÑныкъуÑ)',
+'tog-externaldiff' => 'Ð¥Ñмыт программÑÑ€ къÑгъÑÑÑбÑпын зÑгъÑлъытÑн шъхьÑÐºÓ€Ñ (компутырым абым теухуа тегъÑпÑÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ…ÑƒÑныкъуÑ)',
+'tog-showjumplinks' => 'ДÑÓ€ÑпыкъуÑгъу техьÑÐ¿Ó€Ñ Â«Ñ‚ÐµÑ…ÑŒÑн» Ñ…ÑгъÑнÑн',
+'tog-uselivepreview' => 'ЯпÑ-еплъ щӀÑÑ…Ñ‹Ñ€ къÑгъÑÑÑбÑпын (JavaScript хуÑныкъуÑ) (ÑкÑперементалу)',
+'tog-forceeditsummary' => 'КъÑӀохун, гъÑÑ‚ÑÑ€ÑзыгъуÑм и тепÑÑлъыхьыпӀÑм зыри имытхамÑ',
+'tog-watchlisthideown' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑпшкIуÑн Ñи гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€',
+'tog-watchlisthidebots' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑпшкIуÑн ботхÑм Ñ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€',
+'tog-watchlisthideminor' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑпшкIуÑн гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ†Ó€Ñ‹ÐºÓ€ÑƒÑ…ÑÑ€',
+'tog-watchlisthideliu' => 'ЗыкъÑзӀуÑÑ‚Ð°ÑƒÑ Ñ…ÑÑ‚Ñ…Ñм Ñ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€ гъÑпшкӀун',
+'tog-watchlisthideanons' => 'ЗыкъÑзмыӀуÑÑ‚Ð°ÑƒÑ Ñ…ÑÑ‚Ñ…Ñм Ñ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€ гъÑпшкӀун',
+'tog-watchlisthidepatrolled' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑпшкIуÑн патрулым Ñ…ÑкӀа гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€',
+'tog-ccmeonemails' => 'Ðдрей Ñ…ÑÑ‚Ñ…Ñм Ñ Ñ…ÑƒÑзгъÑÑ…ÑŒ хъыбархÑм Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñидеи егъÑхьын',
+'tog-diffonly' => 'ИмыгъÑлъÑгъуÑну, нÑпÑкӀуÑцӀым Ñ…ÑÑ‚Ñ‹Ñ€ Ñ‚Ó€ÑƒÐ°Ð½Ñ Ð·ÑгъÑлъытÑгъуÑм щхьÑкӀÑ',
+'tog-showhiddencats' => 'ГъÑпшкӀуа категориÑÑ…ÑÑ€ къÑгъÑлъÑгъуÑн',
+'tog-norollbackdiff' => 'ИмыгъÑлъÑгъуÑну зÑщхьÑщыкӀыгъуÑÑ€, гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ ихыжьа Ñуж',
+
+'underline-always' => 'Сыт щыгъуи',
+'underline-never' => 'ЗÑи',
+'underline-default' => 'Браузерым и зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€ къÑгъÑÑÑбÑпын',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'ХьÑрыф тхыгъÑм и типыр гъÑÑ‚ÑÑ€ÑзыгъуÑм дежь',
+'editfont-default' => 'ХьÑрыф тхыгъÑÑ€ браузер зÑгъÑзÑхуÑгъуÑм къыхÑхауÑ',
+'editfont-monospace' => 'ПропорциÑÐ½ÑˆÑ Ñ…ÑŒÑрыф тхыгъÑ',
+'editfont-sansserif' => 'Мы антикуу Ñ…ÑŒÑрыф тхыгъÑÑ€',
+'editfont-serif' => 'Ðнтику Ñ…ÑŒÑрыф тхыгъÑÑ€',
+
+# 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' => 'ШыщхьÑӀум и',
+'september-gen' => 'ФокӀадÑм и',
+'october-gen' => 'ЖÑпуÑгъуÑм и',
+'november-gen' => 'ЩакӀуÑгъуÑм и',
+'december-gen' => 'ДыгъÑгъазÑм и',
+'jan' => 'ЩIш',
+'feb' => 'Мзе',
+'mar' => 'Гъп',
+'apr' => 'Мжьхь',
+'may' => 'Ðкъ',
+'jun' => 'Мкъу',
+'jul' => 'Бдз',
+'aug' => 'ШIу',
+'sep' => 'ФдÑ',
+'oct' => 'ЖÑп',
+'nov' => 'ЩкIу',
+'dec' => 'Дгъз',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориÑÑ…ÑÑ€}}',
+'category_header' => 'ÐапÑкIуÑцIÑ…ÑÑ€ "$1" категориÑм',
+'subcategories' => 'КатегориÑцӀыкӀухÑÑ€',
+'category-media-header' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ "$1" Ñ…ÑÑ‚ файлхÑÑ€',
+'category-empty' => '"Мы категорием иджыпÑту зыри илъкъым."',
+'hidden-categories' => '{{PLURAL:$1|ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð³ÑŠÑпшкӀуа|ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð³ÑŠÑпшкӀуахÑÑ€}}',
+'hidden-category-category' => 'ÐšÐ°Ñ‚Ð¸Ð³Ð¾Ñ€Ð¸Ñ Ð³ÑŠÑпшкӀуахÑÑ€',
+'category-subcat-count' => '{{PLURAL:$2|Мы категориÑм хиубыдÑÑ€ категориÑпхырыт къуÑдей.|{{PLURAL:$1|ГъÑлъÑгъуар $1 категориÑпхырыт|ГъÑлъÑгъуар $1 категориÑпхырыту|ГъÑлъÑгъуар $1 категориÑпхырытхÑм}} $2 Ñщыщ.}}',
+'category-subcat-count-limited' => 'Мы категориÑм {{PLURAL:$1|категориÑпхырыт $1|категориÑпхырытхÑÑ€ $1}}.',
+'category-article-count' => '{{PLURAL:$2|Мы категориÑм зы напÑкӀуцӀ нÑÑ…ÑŠ Ñ…Ñткъым.|{{PLURAL:$1|ГъÑлъÑгъуар $1 напÑкӀуÑцӀ|ГъÑлъÑгъуар $1 напÑкӀуÑцӀу|ГъÑлъÑгъуар $1 напÑкӀуÑцхӀу}} категориÑм ÐµÑƒÑ $2.}}',
+'category-article-count-limited' => 'Мы категориÑм Ñ…ÑÑ‚Ñ‹Ñ€ {{PLURAL:$1|напÑкӀуÑцӀу $1|напÑкӀуÑÑ†Ó€Ñ…Ñ $1}}.',
+'category-file-count' => '{{PLURAL:$2|Мы категориÑм файлу Ñ…ÑÑ‚ къуÑдер.|{{PLURAL:$1|Файлу гъÑлъÑгъуар $1|Файлу гъÑлъÑгъуахÑÑ€ $1}} категориÑм щыщ $2.}}',
+'category-file-count-limited' => 'Мы категориÑм Ñ…ÑÑ‚ {{PLURAL:$1|файл|$1 файлхÑÑ€}}',
+'listingcontinuesabbrev' => '(кӀÑлъыкуÑгъуÑ)',
+'index-category' => 'Ð˜Ð½Ð´ÐµÐºÑ Ð·Ñ‹Ñ€Ð°Ñ‚ напÑкӀуÑцӀхÑÑ€',
+'noindex-category' => 'ÐапÑкӀуÑцӀ Ð¸Ð½Ð´ÐµÐºÑ Ð·Ñ‹Ñ…ÑƒÑмыныкуъÑÑ…ÑÑ€',
+
+'mainpagetext' => "'''«MediaWiki» узыншу Ñ…Ñгъува.'''",
+'mainpagedocfooter' => 'Мы виким и лÑÐ¶ÑŒÑ‹Ð³ÑŠÑ Ñ…ÑŠÑ‹Ð±Ð°Ñ€Ñ…ÑÑ€ здÑбгъуÑтыфынур [http://meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 дÑÓ€ÑпыкъуÑгъу тхылъым].
+
+
+== КъыщхьÑпÑÐ³ÑŠÑƒÑ Ñ…ÑŠÑƒÑ„Ñ‹Ð½ÑƒÑ…ÑÑ€ ==
+* [http://www.mediawiki.org/wiki/Manual:Configuration_settings ЗÑгъÑзÑхуÑÐ³ÑŠÑƒÑ Ð³ÑƒÑÑ€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ];
+* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-м ÑƒÐ¿Ñ‰Ó€Ñ Ð½Ð°Ñ…ÑŠÑ‹Ð±Ñƒ ÑÑ‚Ñ…ÑÐ¼Ñ€Ñ Ñ Ð¶ÑуапхÑмрÑ];
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и верÑÐ¸Ñ Ñ‰Ó€ÑÑƒÑ ÐºÑŠÑжахÑм Ñ ÐºÑŠÑӀохугъуÑ].',
+
+'about' => 'И гугъу',
+'article' => 'ТхыгъÑ',
+'newwindow' => '(щӀÑÑƒÑ Ð·ÑӀухын)',
+'cancel' => 'ЩӀегъуÑжын',
+'moredotdotdot' => 'Иджыри...',
+'mypage' => 'Си напÑкӀуÑцӀ',
+'mytalk' => 'Си тепÑÑлъыхьыгъуÑм и напÑкӀуÑцӀ',
+'anontalk' => 'Мы IP адреÑым и тепÑÑлъыхьыгъуÑ',
+'navigation' => 'ÐавигацÑ',
+'and' => '&#32;икIи',
+
+# Cologne Blue skin
+'qbfind' => 'ЛъыхъуÑн',
+'qbbrowse' => 'Ð¥ÑплъÑн',
+'qbedit' => 'ГъÑÑ‚ÑÑ€Ñзын',
+'qbpageoptions' => 'ÐапÑкӀуÑцӀым и зÑгъÑзÑхуÑгъуÑÑ€',
+'qbpageinfo' => 'ÐапÑкIуÑцIым теухуауÑ',
+'qbmyoptions' => 'Уи зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€',
+'qbspecialpages' => 'Специал напÑкӀуÑцӀхÑÑ€',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Ð¢ÐµÑƒÑ…ÑƒÐ³ÑŠÑƒÑ Ñ‰Ó€ÑÑƒÑ Ñ‰Ó€ÑдзÑн',
+'vector-action-delete' => 'Ихын',
+'vector-action-move' => 'ЦӀÑÑ€ хъуÑжын',
+'vector-action-protect' => 'ХъумÑн',
+'vector-action-undelete' => 'ЗыфӀÑгъÑувÑжын',
+'vector-action-unprotect' => 'ХъумÑныр техыжын',
+'vector-simplesearch-preference' => 'ЛъыхъуÑÐ³ÑŠÑƒÑ Ð½ÑÑ…ÑŠ зÑÑ…ÑÑ…Ð°ÑƒÑ Ð´ÑÓ€ÑпыкъуÑгъухÑÑ€ Ñ…ÑгъÑнÑн (Векторым шъхьÑÐºÓ€Ñ ÐºÑŠÑƒÑдей)',
+'vector-view-create' => 'ЩӀын',
+'vector-view-edit' => 'ГъÑÑ‚ÑÑ€Ñзын',
+'vector-view-history' => 'ТхыдÑм еплъын',
+'vector-view-view' => 'ЕджÑн',
+'vector-view-viewsource' => 'КъызхÑкӀам еплъын',
+'actions' => 'ЩӀыгъÑÑ…ÑÑ€',
+'namespaces' => 'ЦӀÑÑ…Ñм Ñ Ð¿Ó€ÑÑ€',
+'variants' => 'ВариантхÑÑ€',
+
+'errorpagetitle' => 'ЩыуагъÑ',
+'returnto' => '$1 напÑкӀуÑцӀым гъÑзÑжын.',
+'tagline' => 'Къыздихар {{grammar:genitive|{{SITENAME}}}}',
+'help' => 'ДÑÓ€ÑпыкъуÑгъуÑ',
+'search' => 'КъÑгъуÑтын',
+'searchbutton' => 'КъÑгъуÑтын',
+'go' => 'ЕкӀуÑкӀын',
+'searcharticle' => 'ЕкӀуÑкӀын',
+'history' => 'ТхыдÑ',
+'history_short' => 'ТхыдÑ',
+'updatedmarker' => 'Си Ñужырей ихьÑгъуÑм Ñуж къÑгъÑщӀÑÑ€ÑщӀа',
+'info_short' => 'ИнформациÑ',
+'printableversion' => 'КъыдÑгъÑкӀыным теухуа верÑиÑ',
+'permalink' => 'ТехьÑÐ¿Ó€Ñ Ð·ÑмыхъуÑкӀ',
+'print' => 'КъыдÑгъÑкӀын',
+'edit' => 'ГъÑÑ‚ÑÑ€Ñзын',
+'create' => 'ЩIын',
+'editthispage' => 'Мы напÑкIуÑцIÑ‹Ñ€ гъÑÑ‚ÑÑ€Ñзын',
+'create-this-page' => 'Мыбы и напÑкӀуÑцӀ щӀын',
+'delete' => 'Ихын',
+'deletethispage' => 'Мы напÑкӀуÑцӀыр ихын',
+'undelete_short' => 'ЗÑÑ„Ó€ÑгъÑувÑжын $1 {{PLURAL:$1|гъÑÑ‚ÑÑ€ÑзыгъуÑ|гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€}}',
+'protect' => 'ХъумÑн',
+'protect_change' => 'зÑхъуÑкӀын',
+'protectthispage' => 'Мы напÑкӀуÑцӀыр хъумÑн',
+'unprotect' => 'ХъумÑныр техыжын',
+'unprotectthispage' => 'Мы напÑкӀуÑцӀым хъумÑныр техыжын',
+'newpage' => 'ÐапÑкӀуÑцӀыщӀÑ',
+'talkpage' => 'ÐапÑкIуÑцIым тепÑÑлъыхьын',
+'talkpagelinktext' => 'ТепÑÑлъыхьыгъуÑ',
+'specialpage' => 'ЛÑÐ¶Ñ‹Ð³ÑŠÑ Ð½Ð°Ð¿ÑкӀуÑцӀ',
+'personaltools' => 'Уи Ó€ÑмÑпÑымÑÑ…ÑÑ€',
+'postcomment' => 'ЛъÑныкъуÑщӀÑ',
+'articlepage' => 'ТхыгъÑм Ñ…ÑплъÑн',
+'talk' => 'ТепÑÑлъÑхьыгъуÑ',
+'views' => 'ЗыхÑплъахÑÑ€',
+'toolbox' => 'Ó€ÑмÑпÑымÑÑ…ÑÑ€',
+'userpage' => 'ЦӀыхухÑтым и напÑкӀуÑцӀым еплъын',
+'projectpage' => 'ПроÑктым и напÑкӀуÑцӀым еплъын',
+'imagepage' => 'Файлым и напÑкIуÑцIым еплъын',
+'mediawikipage' => 'ТхыгъÑм и напÑкIуÑцIым еплъын',
+'templatepage' => 'Шаблоным и напÑкIуÑцIым Ñ…ÑплъÑн',
+'viewhelppage' => 'ЩIÑупщIÑм и напÑкIуÑцI',
+'categorypage' => 'Категорием и напÑкIуÑцIым Ñ…ÑплъÑн',
+'viewtalkpage' => 'ТепÑÑлъыхьыгъуÑм еплъын',
+'otherlanguages' => 'ÐÑмыщӀ бзÑÑ…ÑмкӀÑ',
+'redirectedfrom' => '($1 мыбы къыхÑкIащ)',
+'redirectpagesub' => 'ÐапÑкӀуÑцӀ-егъÑкӀуÑкӀа',
+'lastmodifiedat' => 'Иужь дыдÑу напÑкӀуÑцӀыр щахъуÑжар: $1, $2 Ñ‚ÑлайхÑм ирихьÑлӀÑу.',
+'viewcount' => 'Мы напÑкӀуÑцӀым Ӏухьа {{PLURAL:$1|-Ñ€Ñ}}.',
+'protectedpage' => 'ХъумÑным щӀÑÑ‚ напÑкӀуÑцӀ',
+'jumpto' => 'Мыбы кӀуÑн:',
+'jumptonavigation' => 'навигацÑ',
+'jumptosearch' => 'лъыхъуÑн',
+'view-pool-error' => 'ДжыпÑту ÑерверхÑм гугъу Ñтелъ
+Мы напÑкӀуÑцӀым еплъын кӀÑлъÑӀуÑгъу куÑд къÑкӀуа.
+ТӀÑкӀу ежи, Ñужым иджыри Ð·Ñ Ñ‚ÐµÑ…ÑŒÑж.
+
+$1',
+'pool-timeout' => 'ТеубыдыгъуÑм и зÑманыр икӀа',
+'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' => '{{grammar:genitive|{{SITENAME}}}} -м теухуауÑ',
+'aboutpage' => 'Project:ТеухуауÑ',
+'copyright' => 'Мыбы итыр къÑутӀыпщащ зытещӀыхьари: $1.',
+'copyrightpage' => '{{ns:project}}:ЗиIÑдакъÑм и пӀалъÑ',
+'currentevents' => 'КъекӀуÑкӀ IуÑхугъуÑÑ…ÑÑ€',
+'currentevents-url' => 'Project:Хъыбар екӀуÑкӀхÑÑ€',
+'disclaimers' => 'ЖÑуап Ӏыгъыныр зыщхьÑщыхын',
+'disclaimerpage' => 'Project:ПщÑрылъу къÑмыштÑн',
+'edithelp' => 'ГъÑÑ‚ÑÑ€Ñзыным и щӀÑупщӀÑ',
+'edithelppage' => 'Help:ГъÑÑ‚ÑÑ€Ñзыным и дÑIÑпыкъуÑгъу',
+'helppage' => 'Help:ДÑÓ€ÑпыкъуÑгъу',
+'mainpage' => 'ÐапÑкӀуÑцӀ нÑхъыщхьÑ',
+'mainpage-description' => 'ÐапÑкӀуÑцӀ нÑхъыщхьÑ',
+'policy-url' => 'Project:ХабзÑÑ…ÑÑ€',
+'portal' => 'ЛъÑÐ¿ÐºÑŠÑ‹Ð³ÑŠÑƒÑ Ó€ÑƒÑ…ÑŒÑпӀÑ',
+'portal-url' => 'Project:ЛъÑÐ¿ÐºÑŠÑ‹Ð³ÑŠÑƒÑ Ó€ÑƒÑ…ÑŒÑпӀÑ',
+'privacy' => 'Конфиденциалым теухуа хабзÑÑ€',
+'privacypage' => 'Project:Конфиденциалым теухуа хабзÑÑ€',
+
+'badaccess' => 'ТехьÑным Ñ‰Ñ‹ÑƒÐ°Ð³ÑŠÑ Ð¸Ó€Ñщ',
+'badaccess-group0' => 'ЕбгъÑжьа ӀохугъуÑÑ€ быщӀÑн Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым.',
+'badaccess-groups' => 'ЕгъÑжьа ӀохугъуÑÑ€ зыщӀÑн Ð¿Ó€Ð°Ð»ÑŠÑ Ð·Ð¸Ó€ÑÑ€ {{PLURAL:$2|гупхÑм|гупым}} $1 Ñ…ÑÑ‚Ñ…Ñра',
+
+'versionrequired' => 'MediaWiki и верÑÐ¸Ñ $1 хуÑныкъуÑщ',
+'versionrequiredtext' => 'Мы напÑкӀуÑцӀым елÑжьын щхьÑÐºÓ€Ñ MediaWiki верÑÐ¸Ñ $1 хуÑныкъуÑ. Еплъ [[Special:Version|къагъÑÑÑбÑп ПО-Ñ…Ñм Ñ ÐºÑŠÑӀохугъуÑ]].',
+
+'ok' => 'ОК',
+'retrievedfrom' => 'Къыздырахар: "$1"',
+'youhavenewmessages' => 'КъыпхуÑÐºÓ€ÑƒÐ°ÑƒÑ ÑƒÐ¸Ó€Ñ $1 ($2).',
+'newmessageslink' => 'тхыгъÑщIÑÑ…ÑÑ€',
+'newmessagesdifflink' => 'иужьрей зÑхъуÑкІыныгъÑÑ€',
+'youhavenewmessagesmulti' => 'КъыпхуÑÐºÓ€ÑƒÐ°ÑƒÑ ÑƒÐ¸Ó€Ñ Ñ‚Ñ…Ñ‹Ð³ÑŠÑщӀÑÑ…ÑÑ€ $1 идеж',
+'editsection' => 'гъÑÑ‚ÑÑ€Ñзын',
+'editold' => 'гъÑÑ‚ÑÑ€Ñзын',
+'viewsourceold' => 'къызыхÑкӀа кодым еплъын',
+'editlink' => 'гъÑÑ‚ÑÑ€Ñзын',
+'viewsourcelink' => 'къызыхÑкӀа кодым еплъын',
+'editsectionhint' => 'СекцÑÑ€ гъÑÑ‚ÑÑ€Ñзын: $1',
+'toc' => 'Ð¥ÑтхахÑÑ€',
+'showtoc' => 'гъÑлъÑгъуÑн',
+'hidetoc' => 'гъÑпшкӀун',
+'thisisdeleted' => 'Еплъын Ð¸Ñ Ð·ÑÑ„Ó€ÑгъÑувÑжын $1?',
+'viewdeleted' => 'Еплъын $1?',
+'restorelink' => '{{PLURAL:$1|$1 гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð¸Ñ…Ð°Ñ€|$1 гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð¸Ñ…Ð°Ñ…ÑÑ€|$1 гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð¸Ñ…Ñ‹Ð¶Ð°Ñ…ÑÑ€}}',
+'feedlinks' => 'ХуÑду:',
+'feed-invalid' => 'Ó€ÑпÑщӀÑдз тыныгъÑм и типыр Ñ‚ÑÑ€Ñзкъым.',
+'feed-unavailable' => 'Ð¡Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‚Ñ‹Ð½Ñ‹Ð³ÑŠÑÑ…ÑÑ€ хъухÑкъым',
+'site-rss-feed' => '$1 — RSS-тыныгъÑ',
+'site-atom-feed' => '$1 — Atom-тыныгъÑ',
+'page-rss-feed' => '$1 — RSS-тыныгъÑ',
+'page-atom-feed' => '$1 — Atom-тыныгъÑ',
+'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-mediawiki' => 'ТхыгъÑ',
+'nstab-template' => 'Шаблон',
+'nstab-help' => 'ДÑIÑпыкъуÑгъу',
+'nstab-category' => 'КатегориÑ',
+
+# Main script and global functions
+'nosuchaction' => 'ÐпхуÑÐ´Ñ Ó€Ð¾Ñ…ÑƒÐ³ÑŠÑƒÑ Ñ‰Ñ‹Ó€Ñкъым',
+'nosuchactiontext' => 'Ó€Ð¾Ñ…ÑƒÐ³ÑŠÑƒÑ URL-м етар Ñ‚ÑÑ€Ñзкъым.
+URL щиптхÑм Ñ…ÑукъуÑÐ³ÑŠÑƒÑ Ð±Ñ‹Ñ‰Ó€Ð° хъунщ Ð¸Ñ Ñ‚ÐµÑ…ÑÐ¿Ó€Ñ Ð½ÑÐ¼Ñ‹Ñ‰Ó€Ñ‹Ð¼ÐºÓ€Ñ ÑƒÐºÓ€ÑƒÐ°.
+Ðбым нÑмыщӀу проÑкт {{SITENAME}} хуÑкъуÑÐ³ÑŠÑƒÑ Ð·ÑриӀÑÑ€ игъÑлъÑгъуÑфыну.',
+'nosuchspecialpage' => 'ÐпхуÑÐ´Ñ Ð»ÑÐ¶Ñ‹Ð³ÑŠÑ Ð½Ð°Ð¿ÑкӀуÑцӀ щыӀÑкъым',
+'nospecialpagetext' => '<strong>ÐапÑкӀуÑцӀ лÑÐ¶Ñ‹Ð³ÑŠÑ ÑƒÐ·Ð»ÑŠÑ‹Ñ…ÑŠÑƒÑм хуÑÐ´Ñ Ñ‰Ñ‹Ó€Ñкъым.</strong>
+
+ÐапÑкӀуÑцӀ лÑÐ¶Ñ‹Ð³ÑŠÑ Ñ‰Ñ‹Ó€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ: [[Special:SpecialPages|{{int:specialpages}}]].',
+
+# General errors
+'error' => 'ЩыуагъÑ',
+'databaseerror' => 'ӀохугъуÑлъÑм и щыуагъÑ',
+'dberrortext' => 'ӀохугъуÑлъÑм и щӀÑлъÑуÑн ÑинтакÑиÑым и Ñ‰Ñ‹ÑƒÐ°Ð³ÑŠÑ ÐºÑŠÐ°Ñ…ÑкӀа.
+Ðбым Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ ÐºÑŠÑтыным Ñ‰Ñ‹ÑƒÐ°Ð³ÑŠÑ Ð¸Ó€Ñфыну къокӀыр.
+Яужырей ӀохугъуÑлъÑм и щӀÑлъÑуÑныр:
+<blockquote><tt>$1</tt></blockquote>
+функциÑм къыхÑкӀа <tt>«$2»</tt>.
+ӀохугъуÑлъÑм щыуагъÑÑ€ къитыжащ <tt>«$3: $4»</tt>.',
+'dberrortextcl' => 'ӀохугъуÑлъÑм и щӀÑлъÑуÑн ÑинтакÑиÑым и Ñ‰Ñ‹ÑƒÐ°Ð³ÑŠÑ ÐºÑŠÐ°Ñ…ÑкӀа.
+Яужырей ӀохугъуÑлъÑм и щӀÑлъÑуÑныр:
+$1
+«$2» функциÑм къыхÑкӀа.
+ӀохугъуÑлъÑм щыуагъÑÑ€ къитыжащ «$3: $4».',
+'laggedslavemode' => 'Гу лъытÑ: напÑкӀуÑцӀым ÑужырÑй къÑгъÑщӀÑрыщӀÑгъуÑÑ…ÑÑ€ Ñ…ÑмылъынкӀи мÑхъур.',
+'readonly' => 'ӀохугъуÑлъÑм итхÑныр Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰',
+'enterlockreason' => 'ТеубыдÑгъуÑÑ€ къызхÑÐºÓ€Ð°Ð¼Ñ€Ñ Ð·Ñман зÑрекӀуÑÐºÓ€Ñ‹Ð½ÑƒÐ¼Ñ€Ñ ÐºÑŠÑӀоху.',
+'readonlytext' => 'ТхыгъÑщӀÑÑ…ÑÑ€ Ñ…ÑлъхьÑÐ½Ñ‹Ð¼Ñ€Ñ Ð¿ÑмыщӀ зÑхъуÑÐºÓ€Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ó€Ñ‹Ð½Ñ‹Ð¼Ñ€Ñ Ð¸Ð´Ð¶Ñ‹Ð¿Ñту Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰: план-лÑÐ¶ÑŒÑ‹Ð³ÑŠÑ Ð¸Ñ€Ð°Ð³ÑŠÑкӀуÑкӀхÑм теухуауÑ.
+ÐдминиÑтратÑÑ€ зÑтезубыдам къиӀохур мыра:
+$1',
+'missing-article' => 'ӀохугъуÑлъÑм зыщÑÐ»ÑŠÐ°Ó€ÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀым и тхылъ Ñ…Ñлъкъым, къÑгъуÑтын хуÑÑÑ‚ÑÑ€, «$1» $2.
+ÐпхуÑду щыхъур гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…Ñм Ñ Ñ‚ÐµÑ…ÑŒÑÐ¿Ó€Ñ Ð¶ÑŒÑ‹ хъуахÑм щытехьÑкӀÑ, напÑкӀуÑцӀ ирахыжам.
+Ð›Ð°Ð¶ÑŒÑ Ð·Ð¸Ó€ÑÑ€ армырамÑ, Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ Ñ‚Ñ‹Ð³ÑŠÑм и Ñ‰Ñ‹ÑƒÐ°Ð³ÑŠÑ ÐºÑŠÑбгъуÑта хъунщ.
+[[Special:ListUsers/sysop|ТхьÑмадÑм]] ар къыхуÑӀоху, URL-ри игъуÑу.',
+'missingarticle-rev' => '(верÑÐ¸Ñ â„– $1)',
+'missingarticle-diff' => '(зÑщхьÑщыкӀыгъуÑ: $1, $2)',
+'readonly_lag' => 'ӀохугъуÑлъÑÑ€ зÑман гуÑÑ€ÑÐºÓ€Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸ÐºÑƒ зÑтриубыда зÑхъуÑÐºÓ€Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ó€Ñ‹Ð½Ñ‹Ð¼ щхьÑкӀÑ, ӀохугъуÑлъÑм и Ñ‚Ó€ÑƒÐ°Ð½Ñ Ñерверым ÑпÑрем теху ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸Ñ€Ð¸Ð¼Ð³ÑŠÑкӀуÑкӀ щыкӀÑ.',
+'internalerror' => 'И кӀуÑцӀ щыуагъÑ',
+'internalerror_info' => 'И кӀуÑцӀ щыуагъÑ: $1',
+'fileappenderrorread' => 'Ð¥ÑлъхьÑгъуÑм идежь «$1» гурыӀуÑÐ³ÑŠÑƒÑ Ñ…ÑŠÑƒÐ°ÐºÑŠÑ‹Ð¼.',
+'fileappenderror' => '«$2»-м «$1»-Ñ€ щӀÑрылъхьÑн хъуакъым.',
+'filecopyerror' => '«$1»-м и ÐºÐ¾Ð¿Ð¸Ñ Â«$2»-м хуÑкӀуÑкъым.',
+'filerenameerror' => '«$1»-м и цӀÑÑ€ «$2»-ÐºÓ€Ñ Ð·ÑхъуÑкӀыфкъым.',
+'filedeleteerror' => 'Файл «$1»-р ирихыфкъым.',
+'directorycreateerror' => '«$1»-м и Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ñ‰Ó€Ñ‹Ñ„ÐºÑŠÑ‹Ð¼.',
+'filenotfound' => 'Файл «$1»-Ñ€ игъуÑтыфкъым.',
+'fileexistserror' => 'Файл «$1»-Ñ€ иритхÑфкъым: апхуÑÐ´Ñ Ñ„Ð°Ð¹Ð» щыӀÑщ.',
+'unexpected' => 'МыхьÑÐ½Ñ Ñ‚ÐµÐ¼Ñ‹Ñ…ÑƒÑ: «$1»=«$2».',
+'formerror' => 'ЩыуагъÑ: Ó€Ð¾Ñ…ÑƒÐ³ÑŠÑƒÑ Ñ„Ð¾Ñ€Ð¼ÑÑ€ егъÑхьын хъукъым',
+'badarticleerror' => 'РлÑжьыгъÑÑ€ мы напÑкӀуÑцӀым егъÑкӀуÑкӀыфынукъым.',
+'cannotdelete' => 'ÐапÑкӀуÑцӀыр Ð¸Ñ Ñ„Ð°Ð¹Ð» «$1»-Ñ€ ихыфкъым.
+ÐÑмыщӀ гуÑÑ€Ñм ирихагъÑнкӀ хъун.',
+'badtitle' => 'ЦӀÑÑ€ хъунукъым',
+'badtitletext' => 'УзщӀÑÑƒÐ¿Ñ‰Ó€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым и цӀÑÑ€ Ñ‚ÑÑ€Ñзкъым, нÑщӀ, мытÑÑ€Ñзу интервикир Ð¸Ñ Ð±Ð·Ñ-зÑхуÑкур щытщ. И цӀÑм дÑÐ¼Ñ‹Ð³ÑŠÑ ÐµÐ¼Ñ‹ÐºÓ€ÑƒÑÐ°Ð»ÑŠÑ Ñ…ÑтынкӀи хъун.',
+'perfcached' => 'Мы ӀохугъуÑÑ…ÑÑ€ кÑшым къыхахÑ, Ñужырей зÑхъуÑкӀыгъуÑÑ…ÑÑ€ химыубыдÑнкӀи мÑхъу.',
+'perfcachedts' => 'Мы ӀохугъуÑÑ…ÑÑ€ кÑшым къыхахÑ, ÑÑƒÐ¶Ñ‹Ñ€ÐµÑƒÑ ÐºÑŠÑ‹Ñ‰Ñ‹Ð³ÑŠÑщӀÑÑ€ÑщӀыжар $1.',
+'querypage-no-updates' => 'Мы напÑкӀуÑцӀым и къÑгъÑщӀÑÑ€ÑщӀыныр джыпÑту Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
+Ó€Ð¾Ñ…ÑƒÐ³ÑŠÑƒÑ Ð¼Ñ‹Ð´Ðµ Ñ…ÑÑ‚Ñ…ÑÑ€ Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ…ÑŠÑƒÐ½ÑƒÐºÑŠÑ‹Ð¼.',
+'wrong_wfQuery_params' => 'Параметыр емыкӀу wfQuery-м()<br />
+ФункциÑ: $1<br />
+ЩӀÑлъÑуÑгъуÑ: $2',
+'viewsource' => 'Ð¥ÑплъÑн',
+'viewsourcefor' => '$1 щхьÑкӀÑ',
+'actionthrottled' => 'ЩӀÑхыгъÑм ÑƒÐ±Ñ‹Ð´Ñ‹Ð³ÑŠÑ Ð¸Ó€Ñ',
+'actionthrottledtext' => 'Ðнти-Ñпамым пÑщытыным шъхьÑкӀÑ, зÑÐ¼Ð°Ð½Ñ‹Ð³ÑŠÑƒÑ ÐºÓ€ÑщӀым уигугъÑÑ€ куÑду и къÑгъÑÑÑбÑпыныр Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
+ДÑÐºÑŠÐ¸ÐºÑŠÑ Ð·Ñ‹Ñ‚Ó€ÑƒÑ‰ тегъÑкӀи, иджыри Ð·Ñ Ñ‰Ó€Ñ‹Ð¶.',
+'protectedpagetext' => 'Мы напÑкӀуÑцӀыр и гъÑÑ‚ÑÑ€Ñзыным Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰',
+'viewsourcetext' => 'Мы напÑкӀуÑцӀым и нÑÑ…ÑŠÑ‹Ñ‰Ñ…ÑŒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ñ€ мыбдежьым уÑплъыфыну, и копиÑри ипхыфыну:',
+'protectedinterface' => 'Мы напÑкӀуÑцӀым Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ Ñ…Ñтщ, программÑтыныгъÑм еуÑ. ХьÑуÑйн имыӀÑн щхьÑкӀÑ, и гъÑÑ‚ÑÑ€Ñзыныр Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.',
+'editinginterface' => "'''Гу лъытÑ:''' БгъÑÑ‚ÑÑ€Ñз напÑкӀуÑцӀым интерфÑÐ¹Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ Ñ…Ñтщ, программÑтыгъÑм еуÑ.
+И зÑхъуÑкӀыгъуÑм интерфÑйÑым и ÑурÑтым Ñ…ÑуÑну адрей цӀыхухÑÑ‚Ñ…Ñм щхьÑкӀÑ.
+ЗÑдзÑкӀыным шъхьÑÐºÓ€Ñ ÐºÑŠÑбгъÑÑÑбÑпыну нÑхъыфӀыр [http://translatewiki.net/wiki/Main_Page?setlang=ru translatewiki.net], MediaWiki-м и локализациÑм и проÑктщ.",
+'sqlhidden' => '(SQL щӀÑупщӀÑгъуÑÑ€ гъÑлъÑгъуакъым)',
+'cascadeprotected' => 'ЗÑхъуÑкӀыныгъÑм Ñ‰Ñ‹Ñ…ÑŠÑƒÐ¼Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ напÑкӀуÑцӀыр, Ñ…ÑгъÑÑ…ÑŒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚ {{PLURAL:$1|ÑÑƒÐ¶ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ итым| ÑÑƒÐ¶ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ итхÑм}} каÑкад хъумÑныгъÑм:
+$2',
+'namespaceprotected' => "ÐŸÓ€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым напÑкӀуÑцӀ '''$1''' Ñ…ÑÑ‚Ñ…ÑÑ€ бгъÑÑ‚ÑÑ€Ñзын.",
+'customcssjsprotected' => 'Мы напÑкӀуÑцӀыр бгъÑÑ‚ÑÑ€Ñзын Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым, нÑмыщӀ цӀыхухÑтым и зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€ зÑрхÑтым щхьÑкӀÑ.',
+'ns-specialprotected' => 'Специал напÑкӀуÑцӀхÑÑ€ гъÑÑ‚ÑÑ€Ñзын хъунукъым.',
+'titleprotected' => 'ÐпхуÑÐ´Ñ Ñ†Ó€Ñ Ð·Ð¸Ó€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ щӀыныр цӀыхухÑÑ‚ [[User:$1|$1]]-м триубыда.
+ÐÑ€ къызхÑкӀар: "\'\'$2\'\'".',
+
+# Virus scanner
+'virus-badscanner' => "ЗÑгъÑзÑхуÑгъуÑм и щÑуÑгъуÑ: вируÑÑ…Ñм ÑуÑ, Ñ…ÑÑ‰Ó€Ñ‹ÐºÓ€Ñ‹Ð³ÑŠÑ Ð·Ð¸Ð¼Ñ‹Ó€Ñ ÑканÑÑ€: ''$1''",
+'virus-scanfailed' => 'СканÑÑ€ щӀыным и щÑуÑÐ³ÑŠÑƒÑ (кодыр $1)',
+'virus-unknownscanner' => 'Ñ…ÑÑ‰Ó€Ñ‹ÐºÓ€Ñ‹Ð³ÑŠÑ Ð·Ð¸Ð¼Ñ‹Ó€Ñ Ð°Ð½Ñ‚Ð¸Ð²Ð¸Ñ€ÑƒÑ:',
+
+# Login and logout pages
+'logouttext' => "'''ДжыпÑту ÑƒÐ¸ÐºÓ€Ñ‹Ð¶Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚.'''
+
+УихьÑжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъÑцӀыху Ð¸Ñ [[Special:UserLogin|зыкъегъÑцӀыхун аргуÑру]] уи цӀÑÐ¼ÐºÓ€Ñ Ð¸Ñ Ð½ÑмыщӀымкӀÑ.
+ÐапÑкӀуÑцӀ гуÑÑ€ÑÑ…ÑÑ€ ÑпÑми хуÑду къикӀыфынухÑ, ÑиÑтемÑм уимыкӀыжьа хуÑду. ÐпхуÑду щымытын щхьÑÐºÓ€Ñ Ð±Ñ€Ð°ÑƒÐ·ÑÑ€ кÑшыр къÑгъÑщӀырыщӀын хуÑй.",
+'welcomecreation' => '== КъеблагъÑ, $1! ==
+Уи аккаунтыр Ñ…ÑŒÑзырщ.
+ЗыщумгъÑÐ³ÑŠÑƒÐ¿ÑˆÑ Ñайтым уи [[Special:Preferences|перÑонал зÑгъÑзÑхуÑгъуÑ]] быщӀын.',
+'yourname' => 'Уи цӀÑÑ€:',
+'yourpassword' => 'ПÑролыр:',
+'yourpasswordagain' => 'Иджыри Ð·Ñ Ð¿Ñролыр:',
+'remembermypassword' => 'СызÑрихьÑÑ€ компьютерым щыIыгъын (махуÑу $1 {{PLURAL:$1|щIимыгъуу|щIимыгъуу}})',
+'securelogin-stick-https' => 'HTTPS -Ð¼ÐºÓ€Ñ Ð¸Ñ…ÑŒÐ° нÑужми ирилÑжьÑн',
+'yourdomainname' => 'Уи доменыр:',
+'externaldberror' => 'ЩÑуÑÐ³ÑŠÑƒÑ Ñ…ÑŠÑƒÐ°, Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‰ÐµÐºÓ€ÑƒÑкӀым Ð¸Ñ Ð°Ð¿Ñ…ÑƒÑдиз Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñƒ щыткъым, уи нÑÐºÑƒÐ³ÑŠÑƒÑ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ñ‹Ñ€ зÑпхъуÑкӀын.',
+'login' => 'СиÑтемÑм зыкъегъÑцIыхуын',
+'nav-login-createaccount' => 'ИхьÑн/щӀÑÑƒÑ Ð·Ð¸Ñ‚Ñ…Ñн',
+'loginprompt' => '«Cookies» уиӀÑн хуÑй, ÑиÑтемÑм уихьÑн щхьÑкӀÑ.',
+'userlogin' => 'ИхьÑн/зыхÑÑ‚Ñ…Ñн',
+'userloginnocreate' => 'СиÑтемÑм зыкъегъÑцӀыхуын',
+'logout' => 'ИкӀыжын',
+'userlogout' => 'ИкӀыжын',
+'notloggedin' => 'СиÑтемÑм зÑкъебгъÑцӀыхуакъым',
+'nologin' => "Ðккаунт щыӀÑкъÑ? '''$1'''.",
+'nologinlink' => 'Ðккаунт щІын',
+'createaccount' => 'Ðккаун щӀÑÑƒÑ Ñ‰Ó€Ñ‹Ð½',
+'gotaccount' => "Ðккаунт щыӀу щыт? '''$1'''.",
+'gotaccountlink' => 'СиÑтемÑм зыкъегъÑцӀыху',
+'createaccountmail' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚ÑмкӀÑ',
+'createaccountreason' => 'ЩхьÑуÑыгъуÑ:',
+'badretype' => 'Парол иптхахÑÑ€ зÑтеху щытхÑкъым.',
+'userexists' => 'ЦыхухÑÑ‚Ñ‹Ñ†Ó€Ñ Ð¸Ð¿Ñ‚Ñ…Ð°Ñ€ пÑмыкӀ гуÑÑ€Ñм къегъÑÑÑбÑп.
+ПÑмыкӀ Ñ†Ó€Ñ ÐºÑŠÑ‹Ñ…ÑÑ….',
+'loginerror' => 'Логиныр Ñ‚ÑÑ€Ñзкъым',
+'createaccounterror' => 'ИщӀыфкъым аккаунт: $1',
+'nocookiesnew' => 'ЦыхухÑтым и аккаунтыр щӀащ Ð°ÑƒÑ Ð·Ñ‹ÐºÑŠÐ¸Ð³ÑŠÑÑ†Ó€Ñ‹Ñ…ÑƒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼.
+{{SITENAME}} къигъÑÑÑбÑпыр «cookies» Ñ…ÑÑ‚Ñ…Ñм зыкъагъÑцӀыхун щхьÑкӀÑ.
+Уиде «cookies» къÑÐ¼Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
+КъÑбда Ñуж, зыкъебгъÑцӀыхуфыну уицӀÑ-парол щӀÑÑ…ÑмкӀÑ.',
+'nocookieslogin' => '{{SITENAME}} къигъÑÑÑбÑпыр «cookies» цӀыхухÑÑ‚Ñ…ÑÑ€ къигъÑцӀыхун щхьÑкӀÑ.
+Ð£Ñ Ð°Ñ€ Ð±Ð³ÑŠÐ¾Ð½ÐºÓ€Ñ‹Ñ„Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚.
+Ð¥ÑгъÑнÑжьи иджыри Ð·Ñ Ñ‰Ó€Ñ‹Ð¶.',
+'noname' => 'ЦӀыхухÑÑ‚Ñ‹Ñ†Ó€Ñ Ñ…ÑŠÑƒÐ½ÑƒÑ€ иптхакъым.',
+'loginsuccesstitle' => 'ЗыкъегъÑцӀыхуныр Ñ„Ó€Ñ‹ÑƒÑ Ð·ÑÑ„Ó€ÑкӀа.',
+'loginsuccess' => "'''Иджы Ñ†Ó€Ñ \"\$1\" зепхьу улÑжьÑфыну.'''",
+'nosuchuser' => '"$1" Ñ†Ó€Ñ Ð·ÐµÐ·Ñ‹Ñ…ÑŒÑ Ñ†Ó€Ñ‹Ñ…ÑƒÑ…ÑÑ‚ щыӀÑкъым.
+ЦӀыхухÑтыцӀÑÑ…ÑÑ€ гурышхъу Ñ‰Ñ‹Ñ‚Ñ…Ñ Ñ…ÑŒÑрыф региÑтырымкӀÑ.
+ЦӀÑÑ€ Ñ‚ÑÑ€Ñзу Ð¿Ñ‚Ñ…Ð°Ð¼Ñ ÐµÐ¿Ð»ÑŠ Ð¸Ñ [[Special:UserLogin/signup|аккаунт щӀÑÑƒÑ Ñ‰Ó€Ñ‹]].',
+'nosuchusershort' => 'ЦӀыхухÑÑ‚ "<nowiki>$1</nowiki>" щыӀÑкъым.
+ЦӀÑÑ€ Ñ‚ÑÑ€Ñзу Ð¸Ñ‚Ñ…Ð°Ð¼Ñ ÐµÐ¿Ð»ÑŠ.',
+'nouserspecified' => 'ЦӀыхухÑтыцӀÑÑ€ иптхÑн хуÑй.',
+'login-userblocked' => 'Мы цӀыхухÑÑ‚Ñ‹Ñ€ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰. ИхьÑныр хуадÑкъым.',
+'wrongpassword' => 'Парол иптхар Ñ‚ÑÑ€Ñзкъым.
+Иджыри Ð·Ñ Ñ‰Ó€Ñ‹Ð¶.',
+'wrongpasswordempty' => 'Паролыр здитын хуÑÑ€ нÑщӀ.
+Иджыри Ð·Ñ ÐµÐ¿Ð»ÑŠ.',
+'passwordtooshort' => 'Паролым Ñ„Ó€ÑкӀын хуÑй {{PLURAL:$1|1 дÑмыгъÑ|$1 дÑмыгъÑÑ…Ñм}} Ñ…ÑÑ‚ бжыгъÑÑ€.',
+'password-name-match' => 'Парол итхар цӀыхухÑтыцӀÑм темыху щытын хуÑйщ.',
+'password-login-forbidden' => 'ÐпхуÑÐ´Ñ Ñ†Ó€Ñ‹Ñ…ÑƒÑ…Ñтым ÐµÑƒÑ Ñ†Ó€ÑÑ€Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ€Ñ ÐºÑŠÑбгъÑщхьÑÐ¿Ñ Ñ…ÑŠÑƒÐ½ÑƒÐºÑŠÑ‹Ð¼.',
+'mailmypassword' => 'ПÑÑ€Ð¾Ð»Ñ‹Ñ‰Ó€Ñ ÐºÑŠÐµÓ€Ñ‹Ñ…Ñ‹Ð½',
+'passwordremindertitle' => 'Парол къÑгъÑщӀÑÐ¶Ñ‹Ð³ÑŠÑƒÑ Ñ†Ó€Ñ‹Ñ…ÑƒÑ…ÑÑ‚ {{SITENAME}}-м.',
+'passwordremindertext' => 'ЗгуÑÑ€Ñм (уÑÑ€Ð°ÑƒÑ Ñ…ÑŠÑƒÐ½, IP Ð°Ð´Ñ€ÐµÑ $1-мкӀÑ) ищӀыну щӀÑлъÑӀуа
+парол щӀÑÑƒÑ {{SITENAME}} ($4) щхьÑкӀÑ. ЦӀыхухÑÑ‚ $2
+щхьÑÐºÓ€Ñ Ð¿Ð°Ñ€Ð¾Ð» щӀÑÑ… щӀащ: $3. ÐÑ€ уи щӀÑлъÑӀуÑгъу щытамÑ,
+ÑиÑтемÑм зыкъебгъÑцӀыхун хуÑй, Ñужм парол щӀÑÑƒÑ ÐºÑŠÑ‹Ñ…Ñпхын.
+Уи парол щӀÑÑ…Ñ‹Ñ€ зÑрлÑжÑнур $5 {{PLURAL:$5|махуÑ|махуÑкӀÑ}}.
+
+ЩӀÑлъÑӀуÑгъуÑÑ€ парол зÑхъуÑкӀыным йомыгъÑхьамÑ, уи паролыр къÑпщӀÑжауÑ,
+зÑпхъуÑкӀыну ухомемÑ, мы тхылъ къыпхуÑкӀуам гу лъумыту
+уи парол уиÑÑ€ ÑпÑм хуÑдуи къÑгъÑÑÑбÑпыфыну.',
+'noemail' => 'ЦӀыхухÑÑ‚ $1 зицӀÑм и ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚ÑÑ€ итхатÑкъым.',
+'noemailcreate' => 'Уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ Ñ‚ÑÑ€Ñзу иптхÑн хуÑй.',
+'passwordsent' => 'Парол щӀÑÑ€ цӀыхухÑÑ‚ $1 ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñ Ð¸Ñ€Ð¸Ñ‚Ñ…Ð°Ð¼ егъÑÑ…ÑŒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
+Уи паролыр къыпӀÑкӀÑхьа Ñуж ÑиÑтемÑм иджыри Ð·Ñ Ð·Ñ‹ÐºÑŠÐµÐ³ÑŠÑцӀыху.',
+'blocked-mailpassword' => 'Уи IP-адреÑÑ‹Ñ€ бгъÑÑ‚ÑÑ€Ñзын Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым, абым щхьÑÐºÓ€Ñ Ð¿Ð°Ñ€Ð¾Ð» къÑщӀÑжын функциÑри Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.',
+'eauthentsent' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñ Ð°Ð´Ñ€ÐµÑ Ð¸Ñ‚Ñ…Ð°Ð¼ тхылъ егъÑхьащ, зÑхъуÑкӀыныгъÑм и пӀалъÑм теухуауÑ. Ртхылъым зÑгъÑзÑхуÑгъуÑгъуÑÑ…ÑÑ€ итщ, быщӀын хуÑÑƒÑ Ð° ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹Ñ€ уÑуÑÐµÐ¹ÑƒÑ Ð·Ñрщытыр гъÑзÑнщӀÑн щхьÑкӀÑ.',
+'throttled-mailpassword' => 'Парол къÑгъÑщӀÑжын функциÑÑ€ къÑгъÑщхьÑпа {{PLURAL:$1|ÑÑÑ…ÑŒÑÑ‚|$1 ÑÑÑ…ÑŒÑÑ‚Ñ…Ñм}}.
+ЗÑÑ€Ð°Ð½Ñ‹Ð³ÑŠÑƒÑ Ð°Ð±Ñ‹Ð¼ къыхÑмкӀын щхьÑкӀÑ, къÑбгъÑщхьÑÐ¿Ñ Ð·Ñрыхъунур {{PLURAL:$1|ÑÑÑ…ÑŒÑтым|$1 ÑÑÑ…ÑŒÑÑ‚Ñ…Ñм}}.',
+'mailerror' => 'ÐŸÐ¾Ñ‡Ñ‚Ñ ÐµÐ³ÑŠÑхьыным и щыуÑгъуÑ: $1',
+'acct_creation_throttle_hit' => 'ЖÑÑˆÐ¼Ð°Ñ…ÑƒÑ Ð±Ð»ÑкӀам уи IP-адреÑÑ‹Ð¼ÐºÓ€Ñ Ñ‰Ó€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰ {{PLURAL:$1|1 аккаунт|$1 аккаунту}}, абым Ñ„Ó€ÑкӀ хъунукъым зÑман кӀуамкӀÑ.
+ЗÑрыхъумкӀÑ, цӀыхухÑÑ‚ а IP-адреÑÑ‹Ñ€ зиӀÑÑ€ джыпÑту аккаунт щӀÑÑƒÑ ÑщӀыфынукъым.',
+'emailauthenticated' => 'Уи Ð¿Ð¾Ñ‡Ñ‚Ñ Ð°Ð´Ñ€ÐµÑ $2 гъÑзÑнщӀащ $3',
+'emailnotauthenticated' => 'Уи Ð¿Ð¾Ñ‡Ñ‚Ñ Ð°Ð´Ñ€ÐµÑÑ‹Ñ€ иджыри гъÑзÑÐ½Ñ‰Ó€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼, вики-Ð³ÑŠÐ°ÐºÓ€ÑƒÑ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм елÑжыр Ð³ÑŠÐ¾Ð½ÐºÓ€Ñ‹Ñ„Ó€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚.',
+'noemailprefs' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ итхатÑкъым, вики-гъакӀуÑм и Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм елÑжьыр гъонкӀыфӀа.',
+'emailconfirmlink' => 'Уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑым хуÑзахуÑн',
+'invalidemailaddress' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ къиштÑкъым, форматым зÑртемыхуÑм щхьÑкӀÑ.
+ÐдреÑÑ‹Ñ€ Ñ‚ÑÑ€Ñзу Ð¸Ñ‚Ñ…Ñ Ð¸Ñ Ñатырыр нÑщӀу къÑгъанÑ.',
+'accountcreated' => 'Ðккаунтыр Ñ…ÑŒÑзырщ',
+'accountcreatedtext' => 'ЦӀыхухÑÑ‚ $1 и аккаунтыр Ñ…ÑŒÑзырщ.',
+'createaccount-title' => 'Ðккаунт щӀын {{SITENAME}} щхьÑкӀÑ',
+'createaccount-text' => 'ЗгуÑÑ€Ñм аккаун «$2» ищӀащ, {{SITENAME}} ($4) проÑктым и Ñерверым деж, парол «$3» иту, уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹Ñ€ иритхауÑ. Уи паролыр зÑпхъуÑÐºÓ€Ð¼Ñ Ð½ÑÑ…ÑŠÑ‹Ñ„Ó€.
+
+Ðккаунтыр щауÑгъуÑÐºÓ€Ñ Ñ‰Ó€Ð°Ð¼Ñ Ð¼Ñ‹ тхылъым гу лъумытÑ.',
+'usernamehasherror' => 'ЦӀыхухÑтыцӀÑм дÑÐ¼Ñ‹Ð³ÑŠÑ Ð·Ñтебза Ñ…ÑÑ‚ хъунукъым',
+'login-throttled' => 'СиÑтемÑм зыкъебгъÑцӀыхуну амалыншу куÑдыщÑÑ€Ñ ÑƒÐ¿Ñ‹Ð»ÑŠÐ°.
+ТӀÑкӀу ежÑн хуÑй, Ñ…ÑŠÑрзыну, аргуÑру зыкъебгъÑцӀыхуным щхьÑкӀÑ.',
+'loginlanguagelabel' => 'БзÑ: $1',
+'suspicious-userlogout' => 'Ð¡ÐµÐ°Ð½Ñ Ñ‰Ñ‹Ð³ÑŠÑтын узкӀÑлъÑӀуар гъÑзÑнщӀакъым, Ð¼Ñ‹ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ Ð±Ñ€Ð°ÑƒÐ·Ñрым Ð¸Ñ ÐºÑш зыщӀ прокÑим иригъÑхьа хуÑду ещхьщ.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Ð¥ÑÑ‰Ó€Ñ‹ÐºÓ€Ñ‹Ð³ÑŠÑƒÑ Ð·Ñ‹Ð¼Ñ‹Ó€Ñ Ñ…ÑукъуÑÐ³ÑŠÑƒÑ PHP-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ mail()',
+
+# Password reset dialog
+'resetpass' => 'ПÑролым и хъуÑжын',
+'resetpass_announce' => 'Парол щӀÑÑ…ÐºÓ€Ñ ÑиÑтемÑм зыкъебгъÑцӀыхуа, уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм къыпхуÑкӀуамкӀÑ. СиÑтемÑм зыкъегъÑцӀыхуныр нÑбгъÑÑын щхьÑкӀÑ, парол Ñ‰Ó€Ñ Ñ‚ÐµÐ±Ð³ÑŠÑƒÐ²Ñн хуÑй.',
+'resetpass_header' => 'Ðккаунтым и парол зÑхъуÑкӀыгъуÑ',
+'oldpassword' => 'Паролыжьыр:',
+'newpassword' => 'ПаролыщIÑÑ€:',
+'retypenew' => 'ПаролыщIÑÑ€ Ð¸Ð´Ð¶Ñ‹Ñ€Ñ Ð·Ñ Ð¸Ñ‚Ñ…Ñж:',
+'resetpass_submit' => 'Паролыр итхи ихьÑ',
+'resetpass_success' => 'Уи паролыр хъуÑжа хъуащ! ИджыпÑту ÑиÑтемÑм йохьÑ...',
+'resetpass_forbidden' => 'Паролыр зÑхъуÑкӀа хъунукъым',
+'resetpass-no-info' => 'Мы напÑкӀуÑцӀым уелÑжьыным щхьÑÐºÓ€Ñ ÑиÑтемÑм зыкъебгъÑцӀыхун хуÑй.',
+'resetpass-submit-loggedin' => 'Паролыр зÑхъуÑкӀын',
+'resetpass-submit-cancel' => 'ЩӀегъуÑжын',
+'resetpass-wrong-oldpass' => 'Парол щӀÑÑ…Ñ‹Ñ€ Ð¸Ñ Ñ‰Ñ‹Ó€ÑÑ€ Ñ‚ÑÑ€Ñзкъым.
+Уи паролыр узыншу зÑпхъуÑкӀагъÑн Ð¸Ñ Ñ‰Ó€ÑÑƒÑ Ñ‰Ó€ÑÑ… парол узщӀÑлъÑӀуар узыншу зÑÑ„Ó€ÑкӀа.',
+'resetpass-temp-password' => 'ЩӀÑÑ… паролыр:',
+
+# Edit page toolbar
+'bold_sample' => 'Ӏуву щӀын Ñ…ÑŒÑрыфхÑÑ€',
+'bold_tip' => 'Ӏуву щӀын Ñ…ÑŒÑрыфхÑÑ€',
+'italic_sample' => 'ТекÑÑ‚Ñ‹Ñ€ укъуÑншауÑ',
+'italic_tip' => 'ХьÑрыфхÑÑ€ укъÑÐ½ÑˆÐ°ÑƒÑ Ñ‰Ó€Ñ‹Ð½',
+'link_sample' => 'ТехьÑпӀÑм и цIÑÑ€',
+'link_tip' => 'КІуÑцІ техьÑпІÑ',
+'extlink_sample' => 'http://www.example.com техьÑпӀÑÑ…Ñм Ñ Ð¿ÑÑлъащхьÑ',
+'extlink_tip' => 'ТехьÑÐ¿Ó€Ñ Ð·ÑIухар (зыщывмыгъÑÐ³ÑŠÑƒÐ¿Ñ‰Ñ http:// префикÑÑ‹Ñ€)',
+'headline_sample' => 'ПÑалъащхьÑм и тхылъ',
+'headline_tip' => 'Ð¢Ð†ÑƒÐ°Ð½Ñ Ñ‰Ñ…ÑŒÑÐ³ÑŠÑ Ð¿ÑалъащхьÑ',
+'math_sample' => 'Мыбдеж Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ñ Ð¸Ñ‚Ñ…Ñ',
+'math_tip' => 'МатематикÑм тещIÑ‹Ñ…ÑŒÐ°ÑƒÑ Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ñ (LaTeX)',
+'nowiki_sample' => 'Ð¤Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ñ‹Ñ‰Ó€Ð° тхыгъÑÑ€ мыбдеж игъÑувÑ',
+'nowiki_tip' => 'Вики-форматыр Iухын',
+'image_tip' => 'Файл кӀуÑцӀылъу',
+'media_tip' => 'Файлым и техьÑпӀÑ',
+'sig_tip' => 'Уи Ó€ÑпÑщӀÑÐ´Ð·Ñ‹Ð¼Ñ€Ñ Ð·Ñман щытехуÑмрÑ',
+'hr_tip' => 'ЩӀÑÑ‚Ñ…ÑŠÑÐ³ÑŠÑƒÑ Ñ‰Ó€Ñ‹Ñ…ÑŒ (куÑÐ´Ñ€Ñ ÐºÑŠÑвмыгъÑмÑбÑп)',
+
+# Edit pages
+'summary' => 'ХъуÑжахÑм тепÑÑлъыхь:',
+'subject' => 'ТемÑ/пÑалъащхьÑ:',
+'minoredit' => 'МащIÑу хъуÑжа',
+'watchthis' => 'Мы напÑкӀуÑцIÑ‹Ñ€ узкӀÑлъыплъхÑм Ñ Ñ‚Ñ‹Ð»ÑŠÑ‹Ð¼ Ñ…ÑлъхьÑн',
+'savearticle' => 'ÐапÑкӀуÑцIÑ‹Ñ€ итхÑн',
+'preview' => 'ЯпÑ-еплъ',
+'showpreview' => 'Ð¥ÑплъÑн ÑÐ¿Ñ Ñ‰Ó€Ñ‹ÐºÓ€Ñ',
+'showlivepreview' => 'ЩӀÑÑ… ÑпÑ-еплъ',
+'showdiff' => 'ЗÑхъуÑÐºÓ€Ñ‹Ð½Ñ‹Ð³ÑŠÑ Ñ…ÑлъхьахÑÑ€',
+'anoneditwarning' => "'''Гу лъытÑ!''': ЗыкъебгъÑцӀыхуакъым ÑиÑтемÑм. Уи IP-адреÑÑ‹Ñ€ иритхÑнущ напÑкӀуÑцӀым и зÑхъуÑÐºÓ€Ñ‹Ð½Ñ‹Ð³ÑŠÑ Ñ‚Ñ…Ñ‹Ð´Ñм.",
+'anonpreviewwarning' => "''СиÑтемÑм зыкъебгъÑцӀыхуакъым. ИтхÑным уи IP-адреÑÑ‹Ñ€ къыринÑну напÑкӀуÑцӀым и зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´Ñм.''",
+'missingsummary' => "'''Гу лъытÑ.''' ЗÑхъуÑкӀыгъуÑм тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ ÐºÓ€ÑщӀу ептакъым. ЕтӀуану «{{int:savearticle}}» тепкъузÑÐ¼Ñ ÑƒÐ¸ зÑхъуÑкӀыгъуÑÑ€ тепÑÑлъыхьыншÑу иритхÑнущ.",
+'missingcommenttext' => 'Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ ÑƒÐ¸ тхыгъÑÑ€ итхÑ.',
+'missingcommentheader' => "'''Гу лъытÑ.''' ТепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ ÐºÑŠÑбгъÑнам пÑÑÐ»ÑŠÐ°Ñ‰Ñ…ÑŒÑ ÐµÐ¿Ñ‚Ð°ÐºÑŠÑ‹Ð¼.
+ЕтӀуану «{{int:savearticle}}» тепкъузÑÐ¼Ñ ÑƒÐ¸ гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ пÑÑлъащхьÑншу иритхÑнущ.",
+'summary-preview' => 'ÐннотациÑÑ€:',
+'subject-preview' => 'ПÑÑÐ»ÑŠÐ°Ñ‰Ñ…ÑŒÑ Ñ…ÑŠÑƒÐ½ÑƒÑ€:',
+'blockedtitle' => 'ЦӀыхухÑÑ‚Ñ‹Ñ€ теубыдащ',
+'blockedtext' => "'''Уи аккаунтыр Ð¸Ñ IP-адреÑÑ‹Ñ€ теубыдащ.'''
+
+Тезубыдар Ñ‚Ñ…ÑŒÑÐ¼Ð°Ð´Ñ $1.
+ÐÑ€ къызхÑÐºÓ€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ñ€: ''«$2»''.
+
+* ТеубыдыгъÑÑ€ щыкӀÑдзар: $8
+* ТеубыдыгъÑÑ€ щиухыр: $6
+* Ð¢ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ð·Ñрщытар: $7
+
+Ð¢Ñ…Ñ‹Ð³ÑŠÑ ÐºÑŠÑ‹Ñ…ÑƒÑбгъÑнÑфыну цӀыхухÑÑ‚ $1 -м Ð¸Ñ Ð¿ÑмыкӀ узыхуÑй [[{{MediaWiki:Grouppage-sysop}}|Ñ‚Ñ…ÑŒÑмадÑм]], теубыдыгъÑм тепÑÑлъыхьыным щхьÑкӀÑ.
+Гу Ð»ÑŠÑ‹Ñ‚Ñ Ñ‚Ñ…Ñ‹Ð³ÑŠÑ Ð·ÑрумгъÑхьыфынур Ñ‚Ñ…ÑŒÑмадÑм дежь, ÑиÑтемÑм зыкъебгъÑцӀыхуауÑ, уи Ð°Ð´Ñ€ÐµÑ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚ÑÑ€ ÐºÑŠÑƒÐ¼Ñ‹Ð»ÑŠÑ‹Ñ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð¼Ñ [[Special:Preferences|уи зÑгъÑзÑхуÑгъуÑÑ…Ñм]], абым пÑмыкӀыу Ñ‚Ñ…Ñ‹Ð³ÑŠÑ ÐµÐ³ÑŠÑхьынхÑри Ð¿Ñ…ÑƒÐ°Ð¼Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð¼Ñ ÑƒÐ¸ теубыдÑгъуÑм.
+Уи IP-адреÑÑ‹Ñ€ - $3, теубыдыгъуÑм и идентификаторыр - #$5.
+Уи тхыгъÑÑ…Ñм ахÑÑ€ Ð¸Ð³ÑŠÑƒÐ²ÑƒÑ€Ñ Ñ‰Ó€Ñ‹.",
+'autoblockedtext' => 'Уи IP-адреÑÑ‹Ñ€ аутоматикÑÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°Ñ‰, ар къызхÑкӀар ÑпÑм Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð° цӀыхухÑÑ‚ гуÑÑ€Ñм къызÑригъÑÑÑбÑпам щхьÑкӀÑ. ТхьÑÐ¼Ð°Ð´Ñ Ñ‚ÐµÐ·ÑƒÐ±Ñ‹Ð´Ð°Ð¼ ($1) къитхыр мыращ:
+
+:«$2»
+
+* ТеубыдыгъÑÑ€ щыкӀÑдзар: $8
+* ТеубыдыгъÑÑ€ щиухыр: $6
+* Ð¢ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ð·Ñрщытар: $7
+
+Ð¢Ñ…Ñ‹Ð³ÑŠÑ Ñ…ÑƒÑбгъÑхьыфыну цӀыхухÑÑ‚ $1-м Ð¸Ñ Ð¿ÑмыкӀ узыхуÑй [[{{MediaWiki:Grouppage-sysop}}|Ñ‚Ñ…ÑŒÑмадÑм]], теубыдыгъÑм тепÑÑлъыхьыным щхьÑкӀÑ.
+Гу Ð»ÑŠÑ‹Ñ‚Ñ Ñ‚Ñ…Ñ‹Ð³ÑŠÑ Ð·ÑрумгъÑхьыфынур Ñ‚Ñ…ÑŒÑмадÑм дежь, ÑиÑтемÑм зыкъебгъÑцӀыхуауÑ, уи Ð°Ð´Ñ€ÐµÑ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚ÑÑ€ ÐºÑŠÑƒÐ¼Ñ‹Ð»ÑŠÑ‹Ñ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð¼Ñ [[Special:Preferences|уи зÑгъÑзÑхуÑгъуÑÑ…Ñм]], абым пÑмыкӀыу Ñ‚Ñ…Ñ‹Ð³ÑŠÑ ÐµÐ³ÑŠÑхьынхÑри Ð¿Ñ…ÑƒÐ°Ð¼Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð¼Ñ ÑƒÐ¸ теубыдÑгъуÑм.
+
+Уи IP-адреÑÑ‹Ñ€ - $3, теубыдыгъуÑм и идентификаторыр - #$5.
+Уи тхыгъÑÑ…Ñм ахÑÑ€ Ð¸Ð³ÑŠÑƒÐ²ÑƒÑ€Ñ Ñ‰Ó€Ñ‹.',
+'blockednoreason' => 'щхьÑуÑыгъуÑÑ€ итхакъым',
+'blockedoriginalsource' => 'Ð˜Ñ‰Ó€Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ «$1» и тхыгъÑÑ€ гъÑлъÑгъуа.',
+'blockededitsource' => "ИщӀагъым гъÑлъÑгъуа Ñ‚Ñ…Ñ‹Ð³ÑŠÑ '''уи зÑхъуÑкӀыгъуÑÑ…ÑÑ€''' напÑкӀуÑцӀ «$1» щыщхÑÑ€.",
+'whitelistedittitle' => 'ЗÑпхъуÑкӀыфыным щхьÑÐºÓ€Ñ ÑиÑтемÑм зыкъебгъÑцӀыхун хуÑй.',
+'whitelistedittext' => '$1 ухуÑныкъу щытщ, напÑкӀуÑцӀхÑÑ€ зÑпхъуÑкӀыным щхьÑкӀÑ.',
+'confirmedittext' => 'Уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ бгъÑзÑнкӀÑн хуÑйщ, напÑкӀуÑцӀхÑÑ€ бгъÑÑ‚ÑÑ€Ñзыным ипÑкӀÑ.
+[[Special:Preferences|ЗÑгъÑзÑхуÑÐ³ÑŠÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀым]] уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ итхи гъÑзанкӀÑ.',
+'nosuchsectiontitle' => 'ЛъÑныкъуÑгъуÑÑ€ игъуÑтыфкъым',
+'nosuchsectiontext' => 'ЛъÑныкъуÑгъ щымыӀÑÑ€ бгъÑÑ‚ÑÑ€Ñзыным упылъ.
+Ð˜Ñ€Ð°Ñ…Ð°ÑƒÑ Ð¸Ñ Ð¿ÑмыкӀ пӀÑм Ð¸Ñ€Ð°Ð³ÑŠÑƒÐ²Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ñ„Ñ‹Ð½Ñƒ, мы напÑкӀуÑцӀым уÑплъыху.',
+'loginreqtitle' => 'ЗыкъебгъÑцӀыхун хуÑй',
+'loginreqlink' => 'зыкъегъÑцӀыхун',
+'loginreqpagetext' => '$1 ухуейщ адрей напÑкӀуÑцӀхÑм уеплъын щхьÑкӀÑ',
+'accmailtitle' => 'ПÑролыр егъÑхьащ.',
+'accmailtext' => "ЦӀыхухÑÑ‚ [[User talk:$1|$1-м]] щхьÑÐºÓ€Ñ Ð´ÑÐ¼Ñ‹Ð³ÑŠÑ Ð·ÑÑ…ÑдзыгъÑншу парол зÑÑ…Ñгъувар $2 адреÑым егъÑхьа.
+СиÑтемÑм региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ñ‰Ó€Ð° Ñуж ''[[Special:ChangePassword|паролыр зÑпхъуÑкӀыфыну]].''",
+'newarticle' => '(ЩIÑуÑ)',
+'newarticletext' => 'ÐапÑкӀуÑцӀ иджыри щымыӀÑм утехуащ техьÑпӀÑмкÑ.
+ÐÑ€ быщӀын щхьÑкӀÑ, и щӀагъым щӀÑÑ‚ игъувапӀÑм тхылъ Ð¸Ñ‚Ñ…Ñ (еплъ [[{{MediaWiki:Helppage}}|щӀÑупщӀÑгъуÑÑ…Ñм Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ]]).
+ГъуÑщÑгъуÑÐºÓ€Ñ Ð¼Ñ‹Ð±Ñ‹Ð¼ утехуамÑ, уи браузерым гъÑзÑÐ¶Ñ‹Ð³ÑŠÑƒÑ Ð¸Ó€Ñм текъузи зÑÑ„Ñкащ.',
+'anontalkpagetext' => "----''Мы напÑкӀуÑцӀ тепÑÑлъыхьыгъуÑÑ€ аноним цӀыхухÑтым ей, аккаунт зымыщӀам Ð¸Ñ ÐºÑŠÑзмыгъÑÑÑбÑпым.
+Ðбым щхьÑÐºÓ€Ñ IP-адреÑÑ‹Ð¼ÐºÓ€Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¸Ñ€Ð°Ñ‚Ñ‹Ñ€.
+Ðноним цӀыхухÑту ущытмÑ, Ñ‚Ñ…Ñ‹Ð³ÑŠÑ ÐºÑŠÑ‹Ð¿Ñ…ÑƒÑÐºÓ€ÑƒÐ°ÑƒÑ ÑƒÐ¸Ð³ÑƒÐ³ÑŠÑмÑ, [[Special:UserLogin/signup|аккаунт щӀы]] Ð¸Ñ [[Special:UserLogin|ÑиÑтемÑм зыкъегъÑцӀыху]], ÑпÑÐºÓ€Ñ Ñ…ÑукъуÑÐ³ÑŠÑƒÑ Ð¿ÑмыкӀ цӀыхухÑÑ‚ анÑнимхÑм Ñм ухÑмыхуÑн щхьÑкӀÑ.''",
+'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-view' => 'ЦӀыхухÑÑ‚ «$1»-м и аккаунтым региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¸Ó€Ñкъым.',
+'blocked-notice-logextract' => 'Мы цӀыхухÑÑ‚Ñ‹Ñ€ иджыпÑту Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
+Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ñ‹Ð³ÑŠÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ и Ñужырей итхÑгъуÑÑ€ гъÑлъÑгъуа:',
+'clearyourcache' => "'''КъÑохугъуÑ:'''Итха Ñуж зÑхъуÑкӀыгъу хъуар къÑнÑн щхьÑкӀÑ, уи браузÑрым и кÑшыр гъÑкъÑбзÑн хуÑй: '''Mozilla / Firefox''': ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari''': ''Cmd+Shift+R'', '''Konqueror''': ''F5'', '''Opera''': ''Tools→Preferences''-Ð¼ÐºÓ€Ñ ÑƒÐ¸ÐºÓ€Ñ‹Ð½ хуÑй.",
+'usercssyoucanpreview' => "'''ДÑÓ€ÑпыкъуÑгъу пÑалъÑ.''' Ð¢ÐµÐºÑŠÑƒÐ·Ñ Â«{{int:showpreview}}» уи CSS-файлым еплъын щхьÑÐºÓ€Ñ Ð¸Ñ‚Ñ…Ñным ипÑкӀÑ.",
+'userjsyoucanpreview' => "'''ДÑÓ€ÑпыкъуÑгъу пÑалъÑ.''' Ð¢ÐµÐºÑŠÑƒÐ·Ñ Â«{{int:showpreview}}» уи JS-файл щӀÑм еплъыным щхьÑÐºÓ€Ñ Ð¸Ñ‚Ñ…Ñным ипÑкӀÑ.",
+'usercsspreview' => 'Уигу игъÑлъ, мыр иджыри уи CSS-файлым и пыухыкӀа еплъыгъуÑкъым , ар иджыри хъумакъым.',
+'userjspreview' => "'''ЗыщумгъÑгъупшÑ, мыр ÑпÑ-еплъ къуÑдей уи javascript-файлым, иджыри Ð¸Ñ‚Ñ…Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼!'''",
+'sitecsspreview' => "'''ЗыщумгъÑгъупшÑ, мыр ÑпÑ-еплъ къуÑÐ´ÐµÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰ мы CSS-м.'''
+'''Иджыри Ð¸Ñ‚Ñ…Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼!'''",
+'sitejspreview' => "'''ЗыщумгъÑгъупшÑ, мыр ÑпÑ-еплъ къуÑÐ´ÐµÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰ мы JavaScript-кодым.'''
+'''Иджыри Ð¸Ñ‚Ñ…Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼!'''",
+'userinvalidcssjstitle' => "'''Гу лъытÑ:''' лÑжьыгъÑÑ€ зтеухуа «$1»-Ñ€ къÑгъуÑÑ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼. ЗыщумыгъÑгъупшÑ, лÑÐ¶ÑŒÑ‹Ð³ÑŠÑ Ð½Ð°Ð¿ÑкӀуÑцӀ .css, .js-Ñ…Ñм Ñ†Ó€Ñ ÑÓ€Ñн хуÑйхÑ, ÑÑÑ‚Ñ‹Ñ€ Ñ…ÑŒÑрыф нÑÑ…ÑŠ ÑÑ…Ñмыту, мыбым хуÑду «{{ns:user}}:ЗгуÑÑ€Ñ/vector.css», щытын хуÑйхÑкъым мыбым хуÑду: «{{ns:user}}:ЗгуÑÑ€Ñ/Vector.css».",
+'updated' => '(КъÑгъÑщӀырыщӀащ)',
+'note' => "'''ГулъытыгъуÑ:'''",
+'previewnote' => "'''Мыр ÑпÑ-еплъ къуÑдей, тхылъыр иджыри итхакъым!'''",
+'previewconflict' => 'Мы ÑпÑ-еплъым тхылъыр редакторым и Ð¸Ñ‰Ñ…ÑŒÑ Ð»ÑŠÑныкъуÑм дежь егъÑÐ»ÑŠÑ‹Ð³ÑŠÑƒÑ Ð·Ñрщытыным хуÑду, иптхÑн ÑƒÐ¸Ð³ÑƒÐ³ÑŠÑ Ñ…ÑŠÑƒÐ¼Ñ.',
+'session_fail_preview' => "'''Ð¥ÑукъуÑÐ³ÑŠÑƒÑ ÐºÑŠÑ‹Ñ…ÑкӀа, Ñерверым у гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ къиштÑфакъым ÑеÑÑиÑм и идентификациÑÑ€ Ñ„Ó€ÑкӀуÑдри.
+Иджыри Ð·Ñ Ñ‰Ó€Ñ‹Ð¶ÑŒÐ¸ еплъ.
+Ð¥ÑукъуÑгъуÑÑ€ иджыри Ð·Ñ ÐºÑŠÑ‹Ñ…ÑкӀмÑ, ÑиÑтемÑм [[Special:UserLogout|икӀи]] аргуÑру зыкъегъÑцӀыху.'''",
+'session_fail_preview_html' => "'''Ð¥ÑукъуÑÐ³ÑŠÑƒÑ ÐºÑŠÑ‹Ñ…ÑкӀа, Ñерверым у гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ къиштÑфакъым ÑеÑÑиÑм и идентификациÑÑ€ Ñ„Ó€ÑкӀуÑдри.'''
+
+'''{{SITENAME}} ÐºÑŠÐ°Ð±Ð·Ñ HTML нÑÑ…ÑŠ къÑбгъÑÑÑбÑпын зÑримыдÑм щхьÑкӀÑ, ÑпÑ-еплъыр Ð³ÑŠÐ¾Ð½ÐºÓ€Ñ‹Ñ„Ó€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰, JavaScript-теуÑнхÑÑ€ къÑмыхъуным щхьÑкӀÑ.'''
+
+'''Ó€ÑÐ¹Ð³ÑŠÑƒÑ Ð·ÐµÐ·Ð¼Ñ‹Ñ…ÑŒÑ Ð³ÑŠÑÑ‚ÑÑ€Ñзыгъу Ñ‰Ñ‹Ñ‚Ð¼Ñ ÑƒÐ¸ гугъÑÑ€ иджыри Ð·Ñ ÐµÐ¿Ð»ÑŠ хъумÑ.
+Ð•Ñ‚Ó€ÑƒÐ°Ð½Ñ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑри мыхъумÑ, ÑиÑтемÑм [[Special:UserLogout|икӀи]] аргуÑру зыкъегъÑцӀыху.'''",
+'token_suffix_mismatch' => "'''Уи гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ къÑÑˆÑ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼, уи программÑм Ñ‚ÑÑ€Ñзу дÑÐ¼Ñ‹Ð³ÑŠÑ Ð¿Ñ‹Ð³ÑŠÑувÑÑ…Ñм зÑремылÑжьым щхьÑкӀÑ
+гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð»ÑŠÑныкъуÑгъым. ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ къыкӀимыштар тхыгъÑм и тхылъыр ÐºÑŠÑƒÐ°Ð½ÑˆÑ Ð¼Ñ‹Ñ…ÑŠÑƒÐ½ щхьÑкӀÑ.
+ÐпхуÑÐ´Ñ Ñ…ÑукъуÑгъуÑÑ…ÑÑ€ къызхÑкӀыфынур аноним зыщӀ уÑб-прокÑихÑм, Ñ…ÑукъуÑÐ³ÑŠÑƒÑ Ð·Ñ‹Ñ…ÑлъхÑм.'''",
+'editing' => 'ГъÑÑ‚ÑÑ€Ñзын: $1',
+'editingsection' => 'ГъÑÑ‚ÑÑ€Ñзын $1 (ÑекцÑÑ€)',
+'editingcomment' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ $1 (лъÑныкъуÑгъу/ÑÐµÐºÑ†Ð¸Ñ Ñ‰Ó€Ñ)',
+'editconflict' => 'Редактированием зÑпÑщӀÑуÑныгъÑ: $1',
+'explainconflict' => ' Мы напÑкӀуÑцӀыр редактировать пщӀыху , зыгуÑрым зÑхъуÑÐºÓ€Ñ‹Ð½Ñ‹Ð³ÑŠÑ Ñ…Ð¸Ð»ÑŠÑ…ÑŒÐ°Ñ‰.
+Редактированием и Ð¸Ñ‰Ñ…ÑŒÑ Ñ‰Ñ…ÑŒÑгъумбжÑм щыболъагъу иджыпÑту напÑкӀуÑцӀым ит текÑÑ‚Ñ‹Ñ€.
+ИщӀагъ щхьÑгъумбжÑм ÑƒÑ Ð¿Ñ‰Ó€Ð° зÑхъуÑкӀыныгъÑÑ€ итщ.
+Уи зÑхъуÑкӀыныгъÑÑ…ÑÑ€ ищӀагъым къихи Ð¸Ñ‰Ñ…ÑŒÑ Ñ‰Ñ…ÑŒÑгъумбжÑм хьы.
+«{{int:savearticle}} -м» щытепкъузÑÐºÓ€Ñ Ð¸Ñ‰Ñ…ÑŒÑ Ñ‰Ñ…ÑŒÑгъумбжÑм ит текÑÑ‚Ñ‹Ñ€ ихъумÑнущ.',
+'yourtext' => 'Уи текÑÑ‚Ñ‹Ñ€',
+'storedversion' => 'Хъума щытыкӀÑÑ€',
+'nonunicodebrowser' => "'''ХуÑÑакъ: Уи браузерым Йуникодыр къыштÑкъым. ТхыгъÑÑ…Ñм Ñ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑм дежь мы ASCII щыту хъуа дÑмыгъÑÑ…ÑÑ€ Ñ ÐºÐ¾Ð´ÐºÓ€Ñ Ð·ÑхъуÑÐºÓ€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ð½ÑƒÑ…Ñ.'''",
+'editingold' => "'''ХуÑÑакъ. ÐапÑкӀуÑцӀ жьы хъуа верÑиÑÑ€ богъÑÑ‚ÑÑ€Ñзыр.'''
+Иптха Ñуж пÑмыкӀ верÑиÑÑ…Ñм зÑхъуÑÐºÑ‹Ð³ÑŠÑƒÑ Ñ‰Ñ‹Ó€ÑÑƒÑ Ñ…ÑŠÑƒÐ°Ñ…ÑÑ€ кӀуÑдынухÑ.",
+'yourdiff' => 'ЗÑщхьÑщыкӀыныгъÑÑ…ÑÑ€',
+'copyrightwarning' => "Гу лъытÑ! Ð¥ÑлъхьÑгъу, зÑхъуÑкӀыгъу хъуар Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ $2 къалъытÑну (еплъ $1).
+УхуÑÐ¼ÐµÐ¼Ñ ÑƒÐ¸ тхыгъÑÑ…ÑÑ€ хуиту зÑбгырагъÑкӀыну, ÑгъÑÑ‚ÑÑ€Ñзыну Ð·Ñ‹Ñ…ÑƒÐµÑƒÑ Ñ…ÑŠÑƒÐ°Ð¼, мыбдежьым йомылъхьÑ.<br />
+Ðбым пÑмыкӀыу мы тхыгъÑÑ…Ñм ÑƒÑ Ð·Ð¸IÑдакъу ущыту лъытÑÐ³ÑŠÑƒÑ Ð¸Ð±Ð¾Ñ‚, Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ñ ÐºÑŠÐ¸Ð¿Ñ…Ð°ÑƒÑ
+хуиту зÑÑ…ÑгъÑкӀынрÑ, гъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð½Ñ€Ñ Ð·Ð¸Ó€Ñ Ñ‚Ñ…Ñ‹Ð³ÑŠÑм.<br />
+'''ЗИIЭДÐКЪЭМ И ПӀÐЛЪЭ УИМЫӀУ, ТХЫЛЪ МЫБДЕЖЬ ХОМЫЛЪХЬЭ!'''",
+'copyrightwarning2' => "Гу лъытÑ, Ñ…Ñплъхьу хъуар пÑмыкӀ Ñ…ÑÑ‚Ñ…Ñм ÑгъÑÑ‚ÑÑ€Ñзыфыну Ð¸Ñ Ð¸Ñ€Ð°Ñ…Ñ‹Ñ„Ñ‹Ð½Ñƒ.
+ЗгуÑÑ€Ñм уи тхыгъÑÑ…ÑÑ€ зÑригъÑзÑхуÑну/зÑрихъуÑкӀыну ухуÑÐ¼ÐµÐ¼Ñ Ð¼Ñ‹Ð±Ð´Ðµ йомылъхьÑ.<br />
+Ðбым пÑмыкӀыу, Ñ‚Ñ…Ñ‹Ð³ÑŠÑ Ð¸Ð¿Ð»ÑŠÑ…ÑŒÑÑ€ уи Ó€ÑдакъÑм къыкӀÑÐºÓ€Ð°ÑƒÑ Ð±Ð¾Ð³ÑŠÑувыр Ð¸Ñ Ñ…ÑƒÐ¸Ñ‚Ñƒ хъыбар зÑÑ…ÑгъÑкӀыпӀÑм къыхÑÐ¿Ñ…Ð°ÑƒÑ (еплъ $1).
+'''ӀЭДÐКЪЭПӀÐЛЪЭ ХУИТ ЗИМЫӀЭ ТХЫГЪЭ МЫБДЕМ ЙОМЫЛЪХЬЭ!'''",
+'longpageerror' => 'ЩЫУÐГЪЭ: птхы текÑтым килобайт $1 Ñ…ÑŒÑлъагъыу иӀÑщ, ар пыухыкӀа Ñ…ÑŒÑлъагъ гъÑува $2 нÑÑ…ÑŠÑ€Ñ Ð½ÑхъыбÑщ.
+ÐапÑкӀуÑцӀыр пхъумÑфынукъым.',
+'readonlywarning' => "'''ГУ ЛЪЫТЭ. ХъыбархÑм Ñ Ð±Ð°Ð·ÑÑ€ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰, лÑÐ¶ÑŒÑ‹Ð³ÑŠÑ Ñдежьым зÑрекӀуÑкӀым щхьÑкӀÑ, джыпÑту уи зÑхъуÑкӀыгъуÑÑ…ÑÑ€ иптхÑфынукъым.
+Уи тхыгъÑÑ…ÑÑ€ файлым къÑбгъÑнÑфыну, Ñужым иптхÑфыным щхьÑкӀÑ.'''
+
+ТхтÑÐ¼Ð°Ð´Ñ Ñ…ÑŠÑ‹Ð±Ð°Ñ€Ñ…Ñм Ñ Ð±Ð°Ð·ÑÑ€ тезубыдам къÑӀохугъу къигъÑнар: $1",
+'protectedpagewarning' => "'''Гу лъытÑ. Мы напÑкӀуÑцӀыр зÑхъуÑкӀыгъуÑÑ…Ñм щхьÑÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰, зÑзхъуÑкӀыфыну Ð¿Ó€Ð°Ð»ÑŠÑ Ð·Ð¸Ó€ÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑкъуÑдейхÑра.'''
+Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ñ‚Ñ…Ñ‹Ð´Ñтхылъым и Ñужырей тхыгъÑÑ€ итщ:",
+'semiprotectedpagewarning' => "'''Гу лъытÑ.''' Мы напÑкӀуÑцӀыр зÑхъуÑкӀыгъуÑÑ…Ñм щхьÑÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð°Ñ‰, зÑзхъуÑкӀыфыну Ð¿Ó€Ð°Ð»ÑŠÑ Ð·Ð¸Ó€ÑÑ…ÑÑ€ цӀыхухÑткъуÑйхÑра.
+Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ñ‚Ñ…Ñ‹Ð´Ñтхылъым и Ñужырей тхыгъÑÑ€ итщ:",
+'cascadeprotectedwarning' => "'''Гу лъытÑ:''' Мы напÑкӀуÑцӀыр згъÑÑ‚ÑÑ€ÑзыфынухÑÑ€ «ТхьÑмадÑÑ…Ñр» щыщ гупым Ñ…ÑÑ‚Ñ…Ñра, {{PLURAL:$1|напÑкӀуÑцӀ къыкӀÑлъыкӀуÑм щхьÑкӀÑ|напÑкӀуÑцӀ къыкӀÑлъыкӀуÑÑ…Ñм щхьÑкӀÑ}} каÑкад хъунÑÐ½Ñ‹Ð³ÑŠÑ Ð·Ñрателъым теухуауÑ:",
+'titleprotectedwarning' => "'''Гу лъытÑ. Мы напÑкӀуÑцӀыр зÑхъуÑкӀыныгъÑÑ…Ñм щхьÑÐºÓ€Ñ ÑÑ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰, зÑзхъуÑкӀыфынухÑÑ€ [[Special:ListGroupRights|абым теухуа пӀалъÑ]] Ð·Ð¸Ó€Ñ Ñ†Ó€Ñ‹Ñ…ÑƒÑ…ÑÑ‚Ñ…Ñм.'''
+Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ñ‚Ñ…Ñ‹Ð´Ñтхылъым и Ñужырей тхыгъÑÑ€ итщ:",
+'templatesused' => '{{PLURAL:$1|Шаблон|ШаблонхÑÑ€}} напÑкӀуÑцӀым и верÑÐ¸Ñ ÐµÐºÓ€ÑƒÑкӀым Ñ…ÑÑ‚Ñ…ÑÑ€:',
+'templatesusedpreview' => '{{PLURAL:$1|Шаблон|ШаблонхÑÑ€}} напÑкӀуÑцӀым и ÑпÑ-еплъым Ñ…ÑÑ‚Ñ…ÑÑ€:',
+'templatesusedsection' => 'Мы лъÑныкъуÑгъум {{PLURAL:$1|Шаблон къагъÑщхьÑпар|Шаблон къагъÑщхьÑпахÑÑ€}}:',
+'template-protected' => '(теубыдащ)',
+'template-semiprotected' => '(иныкъуÑÑ€ теубыдащ)',
+'hiddencategories' => 'Мы напÑкӀуÑцӀыр зхÑÑ…ÑŒÑÑ€ $1 {{PLURAL:$1|1 ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·ÑхуÑща|$1 ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·ÑхуÑщахÑÑ€}}:',
+'nocreatetitle' => 'ÐапÑкӀуÑцӀ щӀыныр тубыдащ',
+'nocreatetext' => 'Мы Ñайтым деж ныпÑкӀуÑцӀ щӀÑÑƒÑ Ñ‰Ó€Ñ‹Ð½Ñ…Ñм щхьÑÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ñ‹Ó€Ñщ.
+БгъÑзÑжу, напÑкӀуÑцӀ щыӀÑÑ€ бгъÑÑ‚ÑÑ€Ñзыфынущ, [[Special:UserLogin|ÑиÑтемÑÐ¼Ñ Ð·Ñ‹ÐºÑŠÐµÐ³ÑŠÑцӀыхун Ð¸Ñ Ñ‰Ó€ÑÑƒÑ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚ щӀын]].',
+'nocreate-loggedin' => 'ÐапÑкӀуÑÑ†Ó€Ñ‹Ñ‰Ó€Ñ Ð¿Ñ‰Ó€Ñ‹Ð½Ñƒ Ñ…ÑƒÐ¸Ñ‚Ñ‹Ð½Ñ‹Ð³ÑŠÑ ÑƒÐ¸Ó€Ñкъым.',
+'sectioneditnotsupported-title' => 'ЛъÑныкъуÑгъухÑм Ñ Ð³ÑŠÑÑ‚ÑÑ€Ñзыныр къиштÑкъым',
+'sectioneditnotsupported-text' => 'Мы напÑкӀуÑцӀым лъÑныкъуÑгъу гъÑÑ‚ÑÑ€Ñзыныр къиштÑкъым',
+'permissionserrors' => 'ТехьÑным и Ñ…ÑукъуÑгъуÑ',
+'permissionserrorstext' => 'Уи гугъÑÑ€ пщӀын Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым, {{PLURAL:$1|ар зтеухуар|ахÑÑ€ зтеухуахÑÑ€}}:',
+'permissionserrorstext-withaction' => "«'''$2'''» ӀохугъуÑÑ€ пщӀÑну Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым, {{PLURAL:$1|ар зтеухуар|ахÑÑ€ зтеухуахÑÑ€}}:",
+'recreate-moveddeleted-warn' => "'''Гу лъытÑ. ÐапÑкӀуÑцӀ пщӀыну узыпылъыр ÑпÑм Ð¸Ñ€Ð°Ñ…Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð°Ñ‰.'''
+
+ÐÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ…Ñлъу щыт напÑкӀуÑцӀыр щӀыжынÑм щхьÑкӀÑ?
+Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ñ‚Ñ…Ñ‹Ð´Ñтхылъ итщ напÑкӀуÑцӀым и ихыгъÑÑ…ÑÐ¼Ñ€Ñ Ð¸ цӀÑзÑхъуÑкӀынхÑÐ¼Ñ€Ñ Ñ‚ÐµÑƒÑ…ÑƒÐ°Ñ…Ñм.",
+'moveddeleted-notice' => 'Мы напÑкӀуÑцӀыр Ð¸Ñ…Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ð°Ñ‚.
+ЩӀÑупщӀÑгъуÑÑ…Ñм щхьÑÐºÓ€Ñ Ð¸Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ñ‚ÐµÑƒÑ…ÑƒÐ° тхыгъÑÑ…ÑÑ€ итщ тхыдÑтхылъым щыщу.',
+'log-fulllog' => 'ТхыдÑÑ‚Ñ…Ñ‹Ð³ÑŠÑ Ð¿Ñом еплъын',
+'edit-hook-aborted' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ Ñ…Ñхыжьа.
+Зтеухуар кÑÓ€Ð¾Ñ…ÑƒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼.',
+'edit-gone-missing' => 'ÐапÑкӀуÑцӀыр къÑгъÑщӀÑрыщӀа хъунукъым.
+Ð˜Ñ€Ð°Ñ…Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñƒ хъунщ.',
+'edit-conflict' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ…Ñм Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ñ‰.',
+'edit-no-change' => 'Уи гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ хахыжащ, тхыгъÑм зÑхъуÑÐºÓ€Ñ‹Ð³ÑŠÑƒÑ Ð·ÑрхÑмыхьÑм щхьÑкӀÑ.',
+'edit-already-exists' => 'ÐапÑкӀуÑÑ†Ó€Ñ‹Ñ‰Ó€Ñ Ñ‰Ó€Ñ‹Ñ„Ñ‹Ð½ÑƒÐºÑŠÑ‹Ð¼.
+ЩыӀÑщ апхуÑдÑ.',
+
+# Parser/template warnings
+'expensive-parserfunction-warning' => 'Гу лъытÑ. Мы напÑкӀуÑцӀым реÑурÑÑ‹ÑˆÑ…ÑƒÑ Ñ…ÑÐ·Ñ‹Ð»ÑŠÑ…ÑŒÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÑƒÑд Ñ…Ñлъщ.
+
+Ð¥ÑлъхьÑÐ³ÑŠÑƒÑ Ñ…Ñтыфынур здынÑгъÑÑар $2 {{PLURAL:$2|Ñ…ÑлъхьÑгъу|Ñ…ÑлъхьÑгъуÑху}}, мыбдежым хуÑныкъу щӀын хуÑйр {{PLURAL:$1|$1 Ñ…ÑлъхьÑгъуÑ|$1 Ñ…ÑлъхьÑгъу}}.',
+'expensive-parserfunction-category' => 'РеÑурÑÑ‹ÑˆÑ…ÑƒÑ Ñ…ÑÐ·Ñ‹Ð»ÑŠÑ…ÑŒÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÑƒÑду зыхÑлъ напÑкӀуÑцӀхÑÑ€',
+'post-expand-template-inclusion-warning' => "'''Гу лъытÑ:''' шаблон Ñ…ÑÑ‚Ñ…Ñм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€ зÑÑ„Ó€ÑкӀыгъуÑм къехъу щытщ.
+ШаблонхÑм Ñщыщ гуÑÑ€ÑÑ…ÑÑ€ Ñ…ÑгъÑÐºÓ€Ñ‹Ð¶Ð°ÑƒÑ ÐºÑŠÑнÑнухÑщ.",
+'post-expand-template-inclusion-category' => 'ÐапÑкӀуÑцӀхÑÑ€, шаблон Ñ Ñ…ÑÑ‚Ñ…Ñм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€ зÑÑ„Ó€ÑкӀыгъуÑм къехъу щытхÑÑ€',
+'post-expand-template-argument-warning' => "'''Гу лъытÑ:''' Мы напÑкӀуÑцӀым шаблоным и зы аргумент Ñ…ÑÑ‚, зÑгъÑзÑнщӀÑным щхьÑÐºÓ€Ñ Ð¸Ð½Ñ‹Ñ‰Ñƒ щыту.
+ÐпхуÑÐ´Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ…Ñм гулъытÑÐ³ÑŠÑƒÑ Ð¸Ñ€Ð°Ð¼Ñ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.",
+'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' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ хахыжьыфынущ. ВерÑиÑÑ…Ñм Ñ Ð·ÑгъÑÐ¿ÑˆÑ‹Ð³ÑŠÑƒÑ ÐµÐ³ÑŠÑкӀуÑкӀ, узхуÑныкъуÑÑ…ÑÑ€Ð°Ð¼Ñ Ð¿Ñ‰Ó€Ð°Ð¼ еплъи «ÐапÑкӀуÑцӀыр итхÑн»-ым текъузÑ, зÑхъуÑкӀыгъуÑÑ…ÑÑ€ Ñ…ÑÑ…ÑŒÑным щхьÑкӀÑ.',
+'undo-failure' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ Ñ…Ñхыжа хъунукъым, гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…Ñм Ñ Ð·ÑпхыгъуÑÑ€ зÑремыкӀуÑкӀыфым щхьÑкӀÑ',
+'undo-norev' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ Ñ…Ñхыжа хъунукъым зÑрщымыӀÑм щхьÑÐºÓ€Ñ Ð¸Ñ Ñ…Ñхыжагъыху щытщ.',
+'undo-summary' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ…Ñхыжыныр $1 цӀыхухÑÑ‚ [[Special:Contributions/$2|$2]] ([[User talk:$2|тепÑÑлъыхьыгъуÑ]])',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Ðккаунтыр щӀыфынукъым',
+'cantcreateaccount-text' => "Ðккаунт щӀыныр мы IP-адреÑÑ‹ÐºÓ€Ñ (<b>$1</b>) Ñ‚Ñ€Ð¸ÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰ [[User:$3|цӀыхухÑÑ‚ $3]].
+
+$3 ар Ð·Ñ‚ÐµÑƒÑ…ÑƒÐ°ÑƒÑ ÐºÑŠÐ¸Ñ‚Ñ…Ñ‹Ñ€: ''$2''",
+
+# History pages
+'viewpagelogs' => 'Мы напÑкӀуÑцIым щхьÑÐºÓ€Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ñ€ гъÑлъÑгъуÑн',
+'nohistory' => 'Мы напÑкӀуÑцӀым и зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´Ñ Ð¸Ó€Ñкъым.',
+'currentrev' => 'КъекӀуÑкӀ верÑиÑÑ€',
+'currentrev-asof' => 'ВерÑÐ¸Ñ ÐµÐºÓ€ÑƒÑкӀыр $1 дежь',
+'revisionasof' => '$1 верÑие',
+'revision-info' => 'ВерÑиÑÑ€ $1; $2',
+'previousrevision' => 'â† Ð˜Ð¿Ñ Ð¸Ñ‚Ñ‹Ñ€',
+'nextrevision' => 'КъыкӀÑлъыкӀуÑÑ€ →',
+'currentrevisionlink' => 'КъекӀуÑкӀ верÑиер',
+'cur' => 'къекӀуÑкӀыр',
+'next' => 'кӀÑлъыкӀуÑÑ€',
+'last' => 'ипÑ.',
+'page_first' => 'ипÑÑ€',
+'page_last' => 'иужьдыдÑÑ€',
+'histlegend' => "ГулъытыгъуÑ: ({{int:екӀуÑкӀ}}) — екӀуÑкӀ верÑиÑм зÑрыщхьÑщыкӀ; ({{int:ÑпÑрыт}}) — ÑпÑрыт верÑиÑм зÑрышъхьÑщыкӀ; '''{{int:цӀыкӀу}}''' — цӀыкӀу зÑхъуÑкӀыгъуÑ",
+'history-fieldset-title' => 'ТхыдÑм Ñ…ÑплъÑн',
+'history-show-deleted' => 'ТегъÑкIыжам Ñ„IÑкI',
+'histfirst' => 'жьыдыдÑÑ…ÑÑ€',
+'histlast' => 'КуÑд мыщIахÑÑ€',
+'historysize' => '($1 {{PLURAL:$1|байту|байтху}})',
+'historyempty' => '(нÑщIщ)',
+
+# Revision feed
+'history-feed-title' => 'ЗÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´ÑÑ€',
+'history-feed-description' => 'Мы напÑкӀуÑцӀым и зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´ÑÑ€ виким дежь',
+'history-feed-item-nocomment' => '$1-Ð¼Ñ€Ñ $2-мрÑ',
+'history-feed-empty' => 'ÐапÑкӀуÑцӀ узхуÑныкъуÑÑ€ щыӀÑкъым.
+Ð˜Ñ€Ð°Ñ…Ð°ÑƒÑ Ð¸Ñ Ð¸ цӀÑÑ€ зÑрахъуÑÐºÓ€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ñ„Ñ‹Ð½ÑƒÑ‰
+Ðбым ещхь напÑкӀуÑцӀхÑм [[Special:Search|виким лъыхъиу]] Ñплъ.',
+
+# Revision deletion
+'rev-deleted-comment' => '(тепÑÑлъыхьыгъуÑÑ…ÑÑ€ ихащ)',
+'rev-deleted-user' => '(Ó€ÑдакъÑм и цӀÑÑ€ ихащ)',
+'rev-deleted-event' => '(тхыгъÑÑ€ ихащ)',
+'rev-deleted-user-contribs' => '[цӀыхухÑтым и цӀÑÑ€ Ð¸Ñ Ð¸ IP-адреÑÑ‹Ñ€ Ð¸Ñ…Ð°Ñ…Ñ â€” гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€ напÑкӀуÑцӀ Ñ…ÑлъхьÑм ихах]',
+'rev-deleted-text-permission' => "Мы верÑÐ¸Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым ер '''ихащ'''.
+Ðбым теухуа тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ð±Ð³ÑŠÑƒÑтыфынкӀи мÑхъур [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ихыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].",
+'rev-deleted-text-unhide' => "Мы верÑÐ¸Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым ер '''ихащ'''.
+Ðбым теухуа тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ð±Ð³ÑŠÑƒÑтыфынкӀи мÑхъур [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ихыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].
+Ð£Ñ [$1 мы верÑиÑм уÑплъыфыну], Ñ‚Ñ…ÑŒÑмаду узÑрщытым щхьÑкӀÑ.",
+'rev-suppressed-text-unhide' => "Мы верÑÐ¸Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым ер '''гъÑпшкӀуа'''.
+Ðбым теухуа тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ð±Ð³ÑŠÑƒÑтыфынкӀи мÑхъур [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} гъÑпшкӀугъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].
+Ð£Ñ [$1 мы верÑиÑм уÑплъыфыну], Ñ‚Ñ…ÑŒÑмаду узÑрщытым щхьÑкӀÑ.",
+'rev-deleted-text-view' => "Мы верÑÐ¸Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым ер '''ихащ'''.
+Ð£Ñ ÑƒÐµÐ¿Ð»ÑŠÑ‹Ñ„Ñ‹Ð½ÑƒÑ‰ абым, Ñ‚Ñ…ÑŒÑмаду узÑрщытым щхьÑкӀÑ. ИхыгъуÑÑ€ зтеухуар итынкӀи мÑхъур [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ихыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].",
+'rev-suppressed-text-view' => "Мы верÑÐ¸Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым ер '''гъÑпшкӀуауÑ''' щытащ.
+Ð£Ñ ÑƒÐµÐ¿Ð»ÑŠÑ‹Ñ„Ñ‹Ð½ÑƒÑ‰ абым, Ñ‚Ñ…ÑŒÑмаду узÑрщытым щхьÑкӀÑ. ИхыгъуÑÑ€ зтеухуар итынкӀи мÑхъур [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} гъÑпшкӀугъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].",
+'rev-deleted-no-diff' => "ВерÑиÑÑ…Ñм Ñ Ð·ÑгъÑпшÑÐ³ÑŠÑƒÑ ÐµÐ±Ð³ÑŠÑкӀуÑкӀыфынукъым, напÑкӀуÑцӀым и зы верÑиÑÑ€ '''ихауÑ''' зÑрщытым щхьÑкӀÑ.
+Ðтым теухуа пÑÐ°Ð»ÑŠÑ Ð±Ð³ÑŠÑƒÑтыфынкӀи мÑхъур [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ихыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].",
+'rev-suppressed-no-diff' => "Мы верÑиÑÑ…Ñм Ñ Ð·ÑгъÑÐ¿ÑˆÑ‹Ð³ÑŠÑƒÑ ÐµÐ±Ð³ÑŠÑкӀуÑкӀыфынукъым, абыхÑм Ñ Ð·Ñ‹Ñ€ '''ихауÑ''' зÑрщытым щхьÑкӀÑ.",
+'rev-deleted-unhide-diff' => "ÐапÑкӀуÑцӀым и зы верÑиÑÑ€ '''ихащ'''.
+Ðбым теухуа пÑÐ°Ð»ÑŠÑ Ð±Ð³ÑŠÑƒÑтыфынкӀи хъунщ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ихыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].
+ТхьÑмадÑÑ…Ñм уахÑтщи ÑƒÑ [$1 мы верÑиÑм уÑплъыфынущ].",
+'rev-suppressed-unhide-diff' => "ЗÑгъÑпшыгъуÑм и зы верÑиÑÑ€ '''гъÑпшкӀуауÑ''' щытат.
+Ðбым теухуа пÑÐ°Ð»ÑŠÑ Ñ‰Ñ‹Ó€ÑнкӀи мÑхъур [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} гъÑпшкӀугъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].
+ТхьÑмаду ущытщи ÑƒÑ [$1 верÑÐ¸Ñ Ð·ÑщхьÑкӀыгъуÑм] уÑплъыфынущ, аткӀи улъÑжьыну ухуÑймÑ.",
+'rev-deleted-diff-view' => "ЗÑгъÑпшыгъуÑм и зы верÑиÑÑ€ '''ихащ'''.
+ТхьÑмаду ущытщи зÑгъÑпшыгъуÑÑ€ ебгъÑкӀуÑкӀыфынущ, теухуа пÑÐ°Ð»ÑŠÑ Ð±Ð³ÑŠÑƒÑтыфынущ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ихыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].",
+'rev-suppressed-diff-view' => "ЗÑгъÑпшыгъуÑм и зы верÑиÑÑ€ '''гъÑпшкӀуащ'''.
+ТхьÑмаду ущытщи зÑгъÑпшыгъуÑÑ€ ебгъÑкӀуÑкӀыфынущ, теухуа пÑÐ°Ð»ÑŠÑ Ð±Ð³ÑŠÑƒÑтыфынущ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} гъÑпшкӀугъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼].",
+'rev-delundel' => 'зÑӀухын/зÑӀулъхьÑн',
+'rev-showdeleted' => 'гъÑлъÑгъуÑн',
+'revisiondelete' => 'Ихын/напÑкӀуÑцӀым и верÑиÑÑ…ÑÑ€ игъувÑжын',
+'revdelete-nooldid-title' => 'ВерÑÐ¸Ñ Ð»ÑŠÑшыр ÐµÑ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼',
+'revdelete-nooldid-text' => 'ВерÑÑ Ð»ÑŠÑшыр (Ð¸Ñ Ð²ÐµÑ€ÑиÑÑ…ÑÑ€) ÐµÐ¿Ñ‚Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ÐºÑŠÑ‹Ð¼, уигугъÑÑ€ пщӀыным щхьÑкӀÑ.',
+'revdelete-nologtype-title' => 'Тхылъым и типыр зхуÑдÑÑ€ етакъым',
+'revdelete-nologtype-text' => 'Тхылъым и типыр ептакъым, лÑÐ¶ÑŒÑ‹Ð³ÑŠÑ Ð·Ð´ÐµÐ±Ð³ÑŠÑкӀуÑкӀыным уигугъÑÑ€.',
+'revdelete-nologid-title' => 'Тхылъым и Ñ…ÑукъуÑÐ³ÑŠÑ Ñ…ÑÑ‚Ñ…ÑгъуÑ',
+'revdelete-nologid-text' => 'ТхыгъÑм и лъÑшыгъу хъун хуеÑÑ€ иптхакъым уи гугъÑÑ€ быщӀын Ñ…ÑŒÑÐºÓ€Ñ Ð¸Ñ Ð»ÑŠÑшыгъуÑÑ€ щыӀÑкъым.',
+'revdelete-no-file' => 'КъÑгъÑлъÑгъуа файлыр щыӀÑкъым.',
+'revdelete-show-file-confirm' => 'ÐÑ€ÑÐ·Ñ‹ÑƒÑ ÑƒÑ‰Ñ‹Ñ‚ уеплъыну файл ихам и верÑÐ¸Ñ Â«<nowiki>$1</nowiki>» $2, $3 ?',
+'revdelete-show-file-submit' => 'ÐÑ‹Ñ‚Ó€Ñ',
+'revdelete-selected' => "'''{{PLURAL:$2|ВерÑÐ¸Ñ Ñ…Ñхар|ВерÑÐ¸Ñ Ñ…ÑхахÑÑ€}} напÑкӀуÑцӀ [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Тхылъ Ñ…Ñхар|Тхылъ Ñ…ÑхахÑÑ€}} тхыгъÑм:'''",
+'revdelete-text' => 'ÐапÑкӀуÑцӀхÑм Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ñ…Ð°Ñ…ÑÐ¼Ñ€Ñ Ñ…ÑŠÑ‹Ð±Ð°Ñ€ щекӀуÑкӀахÑÐ¼Ñ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым и тхыдÑÐ¼Ñ€Ñ Ñ‚Ñ…Ñ‹Ð³ÑŠÑÐ¼Ñ€Ñ Ð³ÑŠÑлъÑÐ³ÑŠÑƒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ð½ÑƒÑ‰, абыхÑм Ñ Ð»ÑŠÑныкъуÑгъу гуÑÑ€ÑÑ…ÑÑ€ цӀыхухÑÑ‚Ñ…Ñм щхьÑÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ð½ÑƒÑ‰.
+ТхьÑÐ¼Ð°Ð´Ñ {{SITENAME}} проÑктым щыщхÑм Ð¿Ó€Ð°Ð»ÑŠÑ ÑÓ€Ñнущ теубыда тхыгъÑÑ…Ñм екӀуÑлъÑн, а интерфейÑымкӀи зÑфӀагъувÑжын, Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ñ‹Ð³ÑŠÑ Ð½ÑÑ…ÑŠ ину Ñтемылъу щымыт къуÑдеймÑ.',
+'revdelete-confirm' => 'ÐÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ ÐµÑ‚, быщӀÑÑ€ зÑÑ€ уи гугъÑÑ€, къыхÑкӀынур къызÑрыбгурыӀуÑÑ€, быщӀу Ñ…ÑŠÑƒÐ°Ð¼ÐºÓ€Ñ [[{{MediaWiki:Policy-url}}|хабзÑм]] узÑремыбакъуÑÑ€.',
+'revdelete-suppress-text' => "ГъÑпшкӀугъÑÑ€ щекӀуÑкӀыфыну '''къуÑдер''' мыбым хуÑдÑм:
+
+* Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐµÐ¼Ñ‹ÐºÓ€Ñƒ итмÑ
+*: '''ÑƒÐ½Ð°Ð³ÑŠÑƒÑ Ð°Ð´Ñ€ÐµÑÑ‹Ñ€, телефон номерхÑÑ€, паÑпортым и номерыр абыхÑм ÑхуÑдÑÑ…ÑÑ€.'''",
+'revdelete-legend' => 'Ð£Ð±Ñ‹Ð´Ñ‹Ð³ÑŠÑƒÑ ÐµÑ‚Ñ‹Ð½:',
+'revdelete-hide-text' => 'ÐапÑкӀуÑцӀым мы и верÑÐ¸Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ñ€ гъÑпшкӀун',
+'revdelete-hide-image' => 'Файлым Ñ…Ñлъыр гъÑпшкӀун',
+'revdelete-hide-name' => 'ЛъÑжыгъÑÐ¼Ñ€Ñ Ñ…ÑÑ‚Ñ‹Ð¼Ñ€Ñ Ð³ÑŠÑпшкӀун',
+'revdelete-hide-comment' => 'ЗÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚ÐµÐ¿ÑÑлъыхьыгъуÑÑ€ гъÑпшкӀун',
+'revdelete-hide-user' => 'Ó€ÑдакъÑм и цӀÑÑ€ гъÑпшкӀун',
+'revdelete-hide-restricted' => 'ТхьÑмадÑÑ…Ñми ÑÑ„Ó€ÑгъÑпшкӀун къÑӀохугъуÑÑ…ÑÑ€',
+'revdelete-radio-same' => '(зÑмыхъуÑкӀын)',
+'revdelete-radio-set' => 'ÐÑ‹Ñ‚Ó€Ñ',
+'revdelete-radio-unset' => 'ХьÑуÑ',
+'revdelete-suppress' => 'ТхьÑмадÑÑ…Ñми ÑÑ„Ó€ÑгъÑпшкӀун къÑӀохугъуÑÑ…ÑÑ€',
+'revdelete-unsuppress' => 'ВерÑÐ¸Ñ Ð·ÑÑ„Ó€ÑгъувÑжахÑм теубыдыгъуÑÑ…ÑÑ€ Ñтехыжын',
+'revdelete-log' => 'Зытеухуар:',
+'revdelete-submit' => 'КъÑгъÑщхьÑпÑн {{PLURAL:$1|верÑÐ¸Ñ Ñ…Ñхам|верÑÐ¸Ñ Ñ…ÑхахÑм}}',
+'revdelete-logentry' => 'ÐапÑкӀуÑцӀ [[$1]]-м и верÑÐ¸Ñ Ð³ÑŠÑлъÑгъуÑныр зÑÑхъуÑкӀащ',
+'logdelete-logentry' => 'Хъыбар [[$1]]-м и гъÑлъÑгъуÑныр зÑхъуÑкӀащ',
+'revdelete-success' => "'''ВерÑиÑм и гъÑлъÑгъуÑныр узыншу и зÑхъуÑкӀыгъуÑÑ€ зÑÑ„Ó€ÑкӀащ.'''",
+'revdelete-failure' => "'''ВерÑиÑм и гъÑлъÑгъуÑныр зÑхъуÑкӀа хъунукъым:'''
+$1",
+'logdelete-success' => 'Хъыбарым и гъÑлъÑгъуÑныр зÑхъуÑкӀащ.',
+'logdelete-failure' => "'''Тхылъым и гъÑлъÑгъуÑныр зÑÑ„Ó€Ñгъувакъым:'''
+$1",
+'revdel-restore' => 'лъагъукӀÑÑ€ хъуÑжын',
+'revdel-restore-deleted' => 'Иха верÑиÑÑ…ÑÑ€',
+'revdel-restore-visible' => 'гъÑлъÑгъуа верÑиÑÑ…ÑÑ€',
+'pagehist' => 'ÐапÑкӀуÑцӀым и тхыдÑ',
+'deletedhist' => 'ИхыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´Ñ',
+'revdelete-content' => 'Ñ…ÑÑ‚Ñ‹Ñ€',
+'revdelete-summary' => 'зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚ÐµÐ¿ÑÑлъыхьыгъуÑ',
+'revdelete-uname' => 'цӀыхухÑтым и цӀÑÑ€',
+'revdelete-restricted' => 'теубыдыгъуÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм ÑтохуÑ',
+'revdelete-unrestricted' => 'теубыдыгъуÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм Ñтеха',
+'revdelete-hid' => 'гъÑпшкӀуар $1',
+'revdelete-unhid' => 'гъÑлъÑгъуар $1',
+'revdelete-log-message' => '$1 $2 щхьÑÐºÓ€Ñ {{PLURAL:$2|верÑиÑÑ…ÑÑ€|верÑиÑÑ…Ñм|верÑиÑÑ…Ñм}}',
+'logdelete-log-message' => '$1 $2 щхьÑÐºÓ€Ñ {{PLURAL:$2|хъыбархÑÑ€|хъыбархÑм|хъыбархÑм}}',
+'revdelete-hide-current' => 'Ð¥Ñтхам и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2, $1: мыр верÑÐ¸Ñ ÐµÐºÓ€ÑƒÑкӀ.
+ÐÑ€ гъÑÐ¿ÑˆÐºÓ€ÑƒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ñ„Ñ‹Ð½Ñƒ.',
+'revdelete-show-no-access' => 'Тхылъым и зÑтехыгъÑм и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2, $1: а тхыгъÑÑ€ зÑрхÑÑ‚Ñ‹Ñ€ «теубыда» хуÑду.
+УихьÑну Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым.',
+'revdelete-modify-no-access' => 'Тхылъым и зÑхъуÑкӀыгъуÑм и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2, $1: а тхыгъÑÑ€ зÑрхÑÑ‚Ñ‹Ñ€ «теубыда» хуÑду.
+УихьÑну Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым.',
+'revdelete-modify-missing' => 'Тхылъ зÑхъуÑкӀыгъуÑм и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ ID $1, хъыбарбазÑм Ñ…Ñмыту щытщ!',
+'revdelete-no-change' => "'''Гу лъытÑ:''' тхылъ $2, $1 иӀÑху щытщ уÑкӀÑÐ»ÑŠÐ°Ó€ÑƒÑ Ð³ÑŠÑлъÑгъуÑн зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€.",
+'revdelete-concurrent-change' => 'Тхылъым и зÑхъуÑкӀыгъуÑм и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2, $1: и ÑтатуÑÑ‹Ñ€ пÑмыкӀ гуÑÑ€Ñм зÑрихъуÑкӀа щытщ, ÑƒÑ Ð°Ñ€ быщӀын уигугъÑÑ….
+ТхыдÑтхылъым Ñ…ÑплъÑ.',
+'revdelete-only-restricted' => 'Тхылъым и гъÑпшкӀугъÑм и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2 $1:Ñ‚Ñ…ÑŒÑмадÑÑ…ÑÑ€ емыплъыфыну тхыгъÑÑ€ бгъÑпшкӀуфыну, гъÑпшкӀугъÑÑ…Ñм Ñ Ð·Ñ‹Ð¼ щыщым Ñ…ÑдÑÐ³ÑŠÑƒÑ ÐºÑŠÑмыну.',
+'revdelete-reason-dropdown' => '* Ð¥ÑхыгъуÑÑ…Ñм Ñ ÑтандартыгъуÑÑ€
+** Ó€ÑдакъÑпӀалъÑм и ебакъуÑгъуÑ
+** ЕмыкӀу къÑӀохугъуÑ',
+'revdelete-otherreason' => 'ПÑмыкӀ теухуÑгъуÑ/щӀыгъуапхъÑ:',
+'revdelete-reasonotherlist' => 'ПÑмыкӀ теухугъуÑ',
+'revdelete-edit-reasonlist' => 'ТеухугъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ñ€ гъÑÑ‚ÑÑ€Ñзын',
+'revdelete-offender' => 'ÐапÑкӀуÑцӀым и верÑиÑÑ€ зи Ó€ÑдакъÑÑ€:',
+
+# Suppression log
+'suppressionlog' => 'ГъÑпшкӀугъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'suppressionlogtext' => 'Ð˜Ñ‰Ó€Ð°Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ð³ÑŠÑлъÑÐ³ÑŠÑƒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚ Ñужырей ихыгъуÑÑ…ÑÐ¼Ñ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´ÑгъуÑÑ…ÑÐ¼Ñ€Ñ Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ, Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм ÑмгъÑлъÑгъуа хъыбархÑÑ€ Ñ…Ñтху.
+Еплъ [[Special:IPBlockList|IP-теубыдыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ]], екӀуÑкӀ теубыдÑгъуÑÑ…ÑÑ€ лъагъун щхьÑкӀÑ.',
+
+# Merge log
+'revertmerge' => 'ЗыхÑдзын',
+
+# Diffs
+'history-title' => '$1 - зÑхъуÑкIыныгъÑм и тхыдÑ',
+'difference' => '(ІÑмалхÑм Ñ Ð·ÑрызыщхьÑщыкІыгъуÑÑ€)',
+'lineno' => 'Сатыр $1:',
+'compareselectedversions' => 'Ð¥Ñха верÑиÑÑ…ÑÑ€ зÑгъÑпщÑн',
+'editundo' => 'щӀегъуÑжын',
+
+# Search results
+'searchresults' => 'ЛъыхъуÑным къыхÑкӀахÑÑ€',
+'searchresults-title' => 'Ммыбы "$1" и лъыхъуÑным къыхÑкӀахÑÑ€',
+'searchresulttext' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½ÑÑ…ÑŠÑ‹Ð±Ñ ÑƒÑ…ÑƒÑныкъуÑÐ¼Ñ Ð¿Ñ€Ð¾Ñктым дежь напÑкӀуÑцӀ лъыхъуÑнымкӀÑ, еплъ [[{{MediaWiki:Helppage}}|щӀÑупщӀÑÐ³ÑŠÑƒÑ Ð»ÑŠÑныкъуÑм]].',
+'searchsubtitle' => 'ЛъыхъуÑÐ³ÑŠÑƒÑ Â«[[:$1]]» ([[Special:Prefixindex/$1|напÑкӀуÑцӀу хъуар, апхуÑдÑцӀÑÐºÓ€Ñ ÐºÑŠÑжьу]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|апхуÑдÑцӀÑм техьÑÑ…ÑÑ€]])',
+'searchsubtitleinvalid' => "ЩӀÑупщӀÑÐ³ÑŠÑƒÑ '''$1'''",
+'notitlematches' => 'ЗÑÑ‚ÐµÑ…ÑƒÑ Ñ…Ñткъым напÑкIуÑцIÑ…Ñм Ñ Ñ†IÑм',
+'notextmatches' => 'ЗÑÑ‚ÐµÑ…ÑƒÑ Ñ…Ñткъым напÑкIуÑцIÑ…Ñм кІуÑцІылъхÑм',
+'prevn' => 'ÑÐ¿Ñ Ð¸Ñ‚Ð°Ñ€ {{PLURAL:$1|$1}}',
+'nextn' => 'Ñуж кӀуÑÑ€ {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Еплъын ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-articles-tooltip' => 'ЛъыхъуÑн $1-м',
+'searchprofile-project-tooltip' => 'ЛъыхъуÑн $1-м',
+'search-result-size' => '$1 ({{PLURAL:$2|пÑалъÑу $2|пÑалъÑу $2|пÑалъÑу $2}})',
+'search-redirect' => '(егъÑкӀуÑкӀын $1)',
+'search-section' => '(ÑÐµÐºÑ†Ñ $1)',
+'search-suggest' => 'Узлъыхъуар мыра хъунщ: $1',
+'search-interwiki-caption' => 'ПроÑкт къыдÑщӀхÑÑ€',
+'search-interwiki-default' => '$1 къыхÑкӀар:',
+'search-interwiki-more' => '(иджыри)',
+'search-mwsuggest-enabled' => 'чÑнджÑш иӀÑу',
+'search-mwsuggest-disabled' => 'чÑнджÑщыншÑу',
+'nonefound' => "'''ГулъытыгъуÑ.''' ТÑÑ€Ñзу Ð¸Ð¼Ñ‹Ñ‚Ñ…Ð°Ð¼Ñ ÑƒÐ·Ñ…ÑƒÑныкъуÑÑ€, лъыхъуÑгъуÑÑ€ лъÑныкъу хъуамкӀи ирегъÑкӀуÑкӀ. КъÑгъÑÑÑбÑп ''all:'' пыгъувÑгъуÑÑ€, зÑгъÑзÑхуÑÐ³ÑŠÑƒÑ Ð¸Ó€Ñн щхьÑÐºÓ€Ñ (Ñ…ÑÑ‚Ñ…Ñм Ñ Ñ‚ÐµÐ¿ÑÑлъыхьыныгъÑÑ€, шаблонхÑÑ€, нымыщӀхÑÑ€ Ð´Ð¶Ð¾ÑƒÑ Ñ…Ð¸ÑƒÐ±Ñ‹Ð´Ñным щхьÑ), Ð¸Ñ ÑƒÐ·Ñ…ÑƒÑÐ½Ñ‹ÐºÑŠÑƒÑ Ð»ÑŠÑныкъуÑÑ€ итхÑ.",
+'powersearch' => 'Ð£Ð±Ð³ÑŠÑƒÐ°ÑƒÑ Ð»ÑŠÑ‹Ñ…ÑŠÑƒ',
+'powersearch-legend' => 'Ð£Ð±Ð³ÑŠÑƒÐ°ÑƒÑ Ð»ÑŠÑ‹Ñ…ÑŠÑƒ',
+'powersearch-ns' => 'ЦIÑзÑÑ…ÑтыгъуÑм щылъыхъуÑн',
+'powersearch-redir' => 'ЕгъÑзÑкӀахÑри гъÑлъÑгъуÑн',
+'powersearch-field' => 'ЛъыхъуÑн',
+
+# Preferences page
+'preferences' => 'ЗÑгъÑзÑхуÑпхъÑÑ…ÑÑ€',
+'mypreferences' => 'Си зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€',
+'prefs-edits' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ…Ñм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€:',
+'prefsnologin' => 'СиÑтемÑм зыкъебгъÑцӀыхуакъым',
+'prefsnologintext' => 'ЦӀыхухÑтым и зÑгъÑзÑхуÑгъуÑÑ…Ñм уелÑжьын щхьÑÐºÓ€Ñ ÑиÑтемÑм <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} зыкъебгъÑцӀыхун хуÑй]</span>',
+'prefs-skin' => 'ЗÑÑ„Ó€ÑгъувÑным и теухуапхъÑ',
+'prefs-math' => 'формулÑÑ…ÑÑ€ гъÑлъÑгъуÑн',
+'prefs-datetime' => 'МахуÑÐ¼Ñ€Ñ Ð·ÑманымрÑ',
+'prefs-personal' => 'ÐÑ‹Ð±Ð¶Ñ‹Ð³ÑŠÑƒÑ ÐºÑŠÑӀохугъуÑ',
+'prefs-rc' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ó€ÑÑ…ÑÑ€',
+'prefs-watchlist' => 'ЩӀÑлъыплъыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'prefs-watchlist-days' => 'МахуÑÑ…Ñм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€:',
+'prefs-watchlist-days-max' => 'Махуибл мынÑхъыбу',
+'prefs-watchlist-edits' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€ нÑхъыбÑдыду, кӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑлъÑгъуар:',
+'prefs-watchlist-edits-max' => 'ÐÑхъыбÑдыду: 1000',
+'prefs-watchlist-token' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ и токен:',
+'prefs-misc' => 'ÐÑмыщӀ зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€',
+'prefs-resetpass' => 'Паролыр зÑхъуÑкӀын',
+'prefs-email' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и опциÑÑ…ÑÑ€',
+'prefs-rendering' => 'СурÑÑ‚Ñ‹Ñ€',
+'prefs-editing' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑ',
+'prefs-edit-boxsize' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑм и нÑкӀубгъум и инагъыр',
+'searchresultshead' => 'КъÑгъуÑтын',
+
+# Groups
+'group-sysop' => 'ТхьÑмадÑÑ…ÑÑ€',
+
+'grouppage-sysop' => '{{ns:project}}:ТхьÑмадÑÑ…ÑÑ€',
+
+# User rights log
+'rightslog' => 'Ð¥Ñтым Ð¿Ó€Ð°Ð»ÑŠÑ Ð¸Ó€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'мы напÑкIуÑцIÑ‹Ñ€ гъÑÑ‚ÑÑ€Ñзын',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|зÑхъуÑкӀыгъуÑ|зÑхъуÑкӀыгъуÑÑ…ÑÑ€}}',
+'recentchanges' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ‰IÑÑ…ÑÑ€',
+'recentchanges-legend' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ó€ÑÑ…Ñм Ñ Ð·ÑгъÑзÑхуÑгъуÑ',
+'recentchanges-feed-description' => 'Вики и иужырей зÑхъуÑкӀыгъeÑÑ…Ñм кӀÑлъыплъын мы нÑтыным.',
+'rcnote' => "{{PLURAL:$1|Яужырей '''$1''' зÑхъуÑкыгъуÑ|Яужырей '''$1''' зÑхъуÑкыгъуÑÑ…ÑÑ€}} '''$2''' {{PLURAL:$2|махуÑ|махуÑм}}, зÑман $5 $4.",
+'rclistfrom' => 'ЗÑхъуÑкӀыгъуÑÑ…ÑÑ€ гъÑлъÑгъуÑн $1 щыкӀÑдзауÑ',
+'rcshowhideminor' => '$1 мащІÑу ÑхъуÑжахÑÑ€',
+'rcshowhidebots' => 'Боту $1',
+'rcshowhideliu' => 'ЦӀыхухÑту, ихьахÑÑ€ $1',
+'rcshowhideanons' => '$1 анонимну',
+'rcshowhidemine' => '$1 ÑгъÑÑ‚ÑÑ€ÑзахÑÑ€',
+'rclinks' => 'ЗÑхъуÑкӀыгъуÑÑ…ÑÑ€ ÑужырейхÑÑ€ $1 гъÑлъÑгъуÑн $2 махуÑ<br />$3',
+'diff' => 'зÑмылI.',
+'hist' => 'тхыдÑ',
+'hide' => 'ГъÑпшкӀун',
+'show' => 'ГъÑлъÑгъуÑн',
+'minoreditletter' => 'цӀ',
+'newpageletter' => 'Ð',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'ÐÑÑ…ÑŠÑ‹Ð±Ñ ÐºÑŠÑгъÑлъагъуÑн (JavaScript къегъÑÑÑбÑп)',
+'rc-enhanced-hide' => 'ГъÑхуа жыІÑÑ…ÑÑ€ Іухын',
+
+# Recent changes linked
+'recentchangeslinked' => 'ЗÑпыщӀа гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€',
+'recentchangeslinked-feed' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð·ÑпхахÑÑ€',
+'recentchangeslinked-toolbox' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð·ÑпхахÑÑ€',
+'recentchangeslinked-title' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð·ÑпыщӀахÑÑ€ $1 щхьÑкӀÑ',
+'recentchangeslinked-summary' => "ÐапÑкӀуÑцӀхÑм Ñ Ñужырей зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ, напÑкӀуÑцӀ гъÑлъÑгъуар Ð·Ñ‚ÐµÑ…ÑŒÑ (Ð¸Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð³ÑŠÑлъÑгъуам Ñ…ÑÑ…ÑŒÑ).
+ÐапÑкӀуÑцӀ Ñ…ÑÑ‚Ñ…ÑÑ€ [[Special:Watchlist|уи щӀÑлъыплъыгъуÑм]] '''къыхÑгÑкӀауÑ''' щытщ",
+'recentchangeslinked-page' => 'ÐапÑкӀуÑцӀым и цӀÑÑ€:',
+'recentchangeslinked-to' => 'ПхÑнжу, къÑгъÑлъÑгъуÑн напÑкІуÑцІхÑм Ñ Ñ…ÑŠÑƒÑжахÑÑ€, къыхÑпха напÑкІуÑцІым къекІуÑкІхÑм',
+
+# Upload
+'upload' => 'Файл илъхьÑн',
+'uploadnologin' => 'СиÑтемÑм зыкъебгъÑцӀыхуакъым',
+'uploadlogpage' => 'ИралъхьахÑм и тхыдÑ-тхылъыр',
+'uploadedimage' => 'изылъхьар "[[$1]]"',
+
+# File description page
+'filehist' => 'Файлым и тхыдÑ',
+'filehist-help' => 'МахуÑ/зÑманым Ñ‚ÐµÐºÑŠÑƒÐ·Ñ Ñ„Ð°Ð¹Ð»Ñ‹Ñ€ дÑпщÑщ дÑуÑду щытами уеплъынумÑ',
+'filehist-current' => 'иджырер',
+'filehist-datetime' => 'МахуÑ/ЗÑман',
+'filehist-thumb' => 'КӀÑщӀу',
+'filehist-thumbtext' => 'КӀÑщӀу $1 верÑиÑм щхьÑкӀÑ',
+'filehist-user' => 'ЦӀыхухÑÑ‚',
+'filehist-dimensions' => 'инагъыр',
+'filehist-comment' => 'ГулъытыгъуÑ',
+'imagelinks' => 'Файлым и техьÑпӀÑÑ…ÑÑ€',
+'linkstoimage' => '{{PLURAL:$1|Мы напÑкӀуÑцӀыр $1 тохьÑ|Мы напÑкӀуÑцӀхÑÑ€ $1 тохьÑÑ…Ñ}} мы файлым:',
+'sharedupload' => 'Мы файлыр $1 Ñщыщ, нÑмыщӀ проÑктхÑми къагъÑÑÑбÑпыфыну.',
+'uploadnewversion-linktext' => 'Файлым и верÑиÑÑ‰Ó€Ñ Ð¸Ð»ÑŠÑ…ÑŒÑн',
+
+# Random page
+'randompage' => 'Ð¢Ñ…Ñ‹Ð³ÑŠÑ Ð³ÑƒÑÑ€Ñ ÑƒÑ…Ñмыду еплъын',
+
+# Statistics
+'statistics' => 'СтатиÑтикÑ',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|байт|байту|байтхÑÑ€}}',
+'nmembers' => '$1 {{PLURAL:$1|лъÑныкъуÑ|лъÑныкъуÑм|лъÑныкъуÑÑ…ÑÑ€}}',
+'prefixindex' => 'Мы Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð·Ñ‹Ó€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀу хъуар',
+'newpages' => 'ÐапÑкӀуÑцӀыщӀÑÑ…ÑÑ€',
+'move' => 'ЦӀÑÑ€ хъуÑжын',
+'movethispage' => 'Мы напÑкӀуÑцӀым и цӀÑÑ€ хъуÑжын',
+'pager-newer-n' => '{{PLURAL:$1|нÑÑ…ÑŠ щӀÑÑƒÑ 1|нÑÑ…ÑŠ щӀÑуÑху $1}}',
+'pager-older-n' => '{{PLURAL:$1|нÑÑ…ÑŠ Ð¶ÑŒÑ‹ÑƒÑ 1|нÑÑ…ÑŠ жьыху $1}}',
+
+# Book sources
+'booksources' => 'Тхылъ къыздихар',
+'booksources-search-legend' => 'Тхылъым и хъыбар лъыхъуÑн',
+'booksources-go' => 'КъÑгъуÑтын',
+
+# Special:Log
+'log' => 'ТхылъхÑÑ€',
+
+# Special:AllPages
+'allpages' => 'ÐапÑкIуÑцIухъуар',
+'alphaindexline' => '$1-м щыщIÑÐ´Ð·Ð°ÑƒÑ $2-м нÑÑ',
+'prevpage' => 'ЯпÑÑ€ÐµÑƒÑ ÐºÓ€ÑƒÐ° напÑкӀуÑцӀыр ($1)',
+'allpagesfrom' => 'МыбыкIÑ Ñ‰IÐ¸Ð´Ð·Ñ Ð½Ð°Ð¿ÑкIуÑцIÑ…ÑÑ€ къихын:',
+'allpagesto' => 'Къихыныр къÑгъÑувыIÑн:',
+'allarticles' => 'ÐапÑкIуÑцIухъуар',
+'allpagessubmit' => 'ЩIын',
+
+# Special:LinkSearch
+'linksearch' => 'КІуÑцІ техьÑпІÑÑ…ÑÑ€',
+
+# Special:Log/newusers
+'newuserlogpage' => 'ЦӀыхухÑÑ‚Ñ…Ñм Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'newuserlog-create-entry' => 'ЦӀыхухÑтыщӀÑ',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(гупым и тхылъ)',
+
+# E-mail user
+'emailuser' => 'Ð¢Ñ…Ñ‹Ð³ÑŠÑ Ñ…ÑƒÑтхын',
+
+# Watchlist
+'watchlist' => 'Си кӀÑлъыплъыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'mywatchlist' => 'СызыкӀÑлъыплъхÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'addedwatch' => 'КӀÑлъыплъыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ Ñ…Ñтхащ',
+'addedwatchtext' => 'ÐапÑкӀуцӀ «[[:$1]]» уи [[Special:Watchlist|щӀÑлъыплъыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼]] халъхьа.
+Ð¯ÑƒÐ¶ÐºÓ€Ñ Ð¼Ñ‹ напÑкӀуÑцӀым и зÑхъуÑкӀыныгъÑÑ…ÑÐ¼Ñ€Ñ Ð°Ð±Ñ‹Ð¼ епха напÑкӀуÑцӀ тепÑÑлъыхьыныгъÑÐ¼Ñ€Ñ Ð¼Ñ‹ тхылъым къыхÑкӀху хъунущ, икӀи Ñ…ÑŒÑрыф бгъуÑÑƒÑ ÐºÑŠÑ‹Ñ…ÑгъÑÐºÓ€Ð°ÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀ [[Special:RecentChanges|зÑхъуÑÐºÓ€Ñ‹Ð½Ñ‹Ð³ÑŠÑ Ñ‰Ó€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠÑÑ…Ñм]] Ñ…Ñтыну, нÑхъыфӀу къÑлъÑгъуным щхьÑкӀÑ.',
+'removedwatch' => 'ЩӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ Ñ…ÑгъÑкӀыжащ',
+'removedwatchtext' => 'ÐапÑкӀуÑцӀ «[[:$1]]» уи [[Special:Watchlist|щӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼]] Ñ…ÑгъÑкӀа.',
+'watch' => 'КӀÑлъплъын',
+'watchthispage' => 'ÐапÑкӀуÑцӀым кӀÑлъыплъын',
+'unwatch' => 'КӀÑлъымыплъын',
+'watchlist-details' => 'Уи щӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ $1 {{PLURAL:$1|напÑкӀуÑцӀ|напÑкӀуÑцӀу}}, напÑкӀуÑцӀ тепÑÑлъыхьыгъуÑÑ…ÑÑ€ Ñ…Ñмыту',
+'wlshowlast' => 'ГъÑлъÑгъуÑн кӀуа $1 ÑÑÑ…ÑŒÑтым $2 Ð¼Ð°Ñ…ÑƒÑ $3',
+'watchlist-options' => 'ЩӀÑлъыплъыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ зÑгъÑзÑхуÑгъуÑ',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'СызыкӀÑлъыплъ тхылъым Ñ…ÑлъхьÑн...',
+'unwatching' => 'СызыкӀÑлъыплъ тхылъым Ñ…Ñхын',
+
+# Delete
+'deletepage' => 'ÐапÑкӀуÑцӀыр ихын',
+'confirmdeletetext' => 'ÐапÑкІуÑцІыр (Ð¸Ñ ÑурÑÑ‚Ñ‹Ñ€) зÑрщыту ирахыным, и Ñ‚Ñ…Ñ‹Ð´Ñ Ð·ÑхъуÑкІыгъуÑри игъуÑу ущІÑлъÑуащ.
+Иджыри зÑ, Ð°Ñ€Ð°Ð·Ñ‹Ð³ÑŠÑƒÑ ÐµÑ‚Ñ‹Ð½ щхьÑÐºÐ†Ñ Ð°Ð±Ñ‹Ð¼ техьÑж, уи гугъÑм къыхÑкІынур къÑзÑрыбгурыІуÑÑ€ гъÑунÑхуным щхьÑкІÑ, а быщІÑри [[{{MediaWiki:Policy-url}}]] итым и хабзÑм зÑртехуÑÑ€.',
+'actioncomplete' => 'ЛÑжьыгъÑÑ€ гъÑзÑнщIащ',
+'deletedtext' => '«<nowiki>$1</nowiki>» ираха.
+Еплъ $2 ÑÑƒÐ¶Ñ‹Ñ€ÐµÑƒÑ Ð¸Ñ€Ð°Ñ…Ð°Ñ…Ñм ÑрахахÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ.',
+'deletedarticle' => 'ихащ «[[$1]]»',
+'dellogpage' => 'ИрахыжахÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'deletecomment' => 'ЩхьÑуÑыгъуÑ:',
+'deleteotherreason' => 'ÐÑгъуÑщӀ щхьÑуÑыгъуÑ/щӀыгъупхъÑ:',
+'deletereasonotherlist' => 'ÐÑгъуÑщӀ щхьÑуÑыгъуÑ',
+
+# Rollback
+'rollbacklink' => 'къегъÑзÑн',
+
+# Protect
+'protectlogpage' => 'Протектым и тхылъ',
+'protectedarticle' => 'ХъумÑным щӀÑÑ‚ напÑкӀуÑцӀ «[[$1]]»',
+'modifiedarticleprotection' => 'ÐапÑкӀуÑцӀ "[[$1]]" и хъумÑныгъÑпӀÑÑ€ зÑхъуÑÐºÓ€Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰',
+'protectcomment' => 'ЩхьÑуÑыгъуÑ:',
+'protectexpiry' => 'Еухыр:',
+'protect_expiry_invalid' => 'ХъумÑным и зÑманыр щиухар Ñ‚ÑÑ€Ñзкъым.',
+'protect_expiry_old' => 'Ð˜ÑƒÑ…Ñ‹Ð³ÑŠÑƒÑ Ð·Ñманыр - блÑкӀам.',
+'protect-text' => "Мыбдежым уÑплъыфыну икӀи напÑкӀуÑцӀ '''<nowiki>$1</nowiki>''' и хъумÑныгъÑÑ€ зÑпхъуÑкӀыфыну.",
+'protect-locked-access' => "Уи аккаунтым Ð¿Ó€Ð°Ð»ÑŠÑ Ð¸Ó€ÑÑ€ ирикъукъым хъумÑныгъÑÑ€ зÑхъуÑкӀыным щхьÑкӀÑ. ЕкӀуÑкӀ зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€ напÑкӀуÑцӀ '''$1''' щхьÑкÑ:",
+'protect-cascadeon' => 'Мы напÑкӀуÑцӀыр хъумÑным щӀÑтщ, ар зытеухуар {{PLURAL:$1|ÑÑƒÐ¶ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ итым| ÑÑƒÐ¶ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ итхÑм}} каÑкад хъумÑÐ½Ñ‹Ð³ÑŠÑ Ð·Ñратетым щхьÑкӀÑ. Мы напÑкӀуÑцӀым и хъумÑныгъÑÑ€ зÑпхъуÑкӀыфыну, Ð°ÑƒÑ ÐºÐ°Ñкад хъумÑныгъÑм ар зыкӀи къыхуÑхъунукъым.',
+'protect-default' => 'ХъумÑншÑщ',
+'protect-fallback' => '"$1" Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÑ…ÑƒÑныкъуÑщ',
+'protect-level-autoconfirmed' => 'ЦӀыхухÑтыщӀÑÐ¼Ñ€Ñ Ñ‰Ó€ÑÑƒÑ ÐºÑŠÑ‹Ñ…Ñ‹Ñ…ÑŒÐ°Ñ…ÑÐ¼Ñ€Ñ Ñ‰Ñ‹Ñ…ÑŠÑƒÐ¼Ñн',
+'protect-level-sysop' => 'ТхьÑмадÑÑ…Ñм Ñ„Ó€ÑкӀа',
+'protect-summary-cascade' => 'каÑкаду',
+'protect-expiring' => 'йокӀыр $1 (UTC)',
+'protect-cascade' => 'ÐапÑкӀуÑцӀыр хъумÑн, напÑкӀуÑцӀым Ñ…ÑÑ‚Ñ…Ñри (каÑÐºÐ°Ð´Ð½Ñ Ñ…ÑŠÑƒÐ¼ÑныгъÑ)',
+'protect-cantedit' => 'Мы напÑкӀуÑцӀым и хъумÑныгъÑÑ€ пхъуÑжыфынукъым, абым щхьÑÐºÓ€Ñ Ð¿Ó€Ð°Ð»ÑŠÑ Ð·Ñ‹Ñ…ÑƒÑныкъуÑÑ€ уиӀÑкъым.',
+'restriction-type' => 'ПӀалъÑÑ€:',
+'restriction-level' => 'ХуитыныгъÑм и уровень:',
+
+# Undelete
+'undeletelink' => 'Ñ…ÑплъÑн/Ð¸Ð¿Ó€Ñ Ð¸Ð³ÑŠÑувÑжын',
+'undeletedarticle' => 'зыщIыжар "[[$1]]"',
+
+# Namespace form on various pages
+'namespace' => 'ЦIÑÑ…Ñм и проÑтранÑтвÑ:',
+'invert' => 'Гу лъытÑн',
+'blanknamespace' => '(ÐÑхъыщхьÑ)',
+
+# Contributions
+'contributions' => 'ЦӀыхухÑтым и Ñ…ÑлъхьÑгъуÑÑ…ÑÑ€',
+'contributions-title' => 'Ð¥Ñтым и Ñ…ÑлъхьÑÐ³ÑŠÑƒÑ $1',
+'mycontris' => 'Си Ñ…ÑлъхьÑгъуÑÑ…ÑÑ€',
+'contribsub2' => 'Ð¥ÑлъхьÑÐ³ÑŠÑƒÑ $1 ($2)',
+'uctop' => '(Ñужырер)',
+'month' => 'МазÑм щыщIÑÐ´Ð·Ð°ÑƒÑ (икIи нÑÑ…ÑŠ паÑÑу):',
+'year' => 'Мы илъÑÑым щыщIÑÐ´Ð·Ð°ÑƒÑ (е нÑхъпаÑÑжу):',
+
+'sp-contributions-newbies' => 'Ðккаунт щӀÑÑ…Ñм Ñ Ñ…ÑлъхьÑÐ³ÑŠÑƒÑ ÐºÑŠÑƒÑдер гъÑлъÑгъуÑн',
+'sp-contributions-blocklog' => 'теубыдыныгъÑÑ…ÑÑ€',
+'sp-contributions-search' => 'Ð¥ÑлъхьÑгъуÑм лъыхъуÑн',
+'sp-contributions-username' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ñ Ñ…Ñтым и цIÑÑ€:',
+'sp-contributions-submit' => 'КъÑгъуÑтын',
+
+# What links here
+'whatlinkshere' => 'ТехьÑпӀÑÑ…ÑÑ€ мыбдеж',
+'whatlinkshere-title' => '«$1» Ñ‚ÐµÑ…ÑŒÑ Ð½Ð°Ð¿ÑкІуÑцІхÑÑ€',
+'whatlinkshere-page' => 'ÐапÑкIуÑцI:',
+'linkshere' => "Мыбым '''[[:$1]]''' Ñ‚Ð¾Ñ…ÑŒÑ Ð½Ð°Ð¿ÑкӀуÑцӀхÑÑ€:",
+'isredirect' => 'напÑкIуÑцI-егъÑкIуÑкIа',
+'istemplate' => 'Ñ…ÑгъÑÑ…ÑŒÑныгъÑ',
+'isimage' => 'ÑурÑтым и техьÑпӀÑ',
+'whatlinkshere-prev' => '{{PLURAL:$1|ÑпÑрыт|ÑпÑрытхÑÑ€ $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|къыкӀÑлъыкӀуÑÑ€|къыкӀÑлъыкӀуÑÑ…ÑÑ€ $1}}',
+'whatlinkshere-links' => '↠техьÑпӀÑÑ…ÑÑ€',
+'whatlinkshere-hideredirs' => '$1 уезыгъÑкІуÑкІхÑÑ€',
+'whatlinkshere-hidetrans' => '$1 Ñ…ÑÑ‚Ñ…ÑныгъÑÑ…ÑÑ€',
+'whatlinkshere-hidelinks' => '$1 техьÑпӀÑÑ…ÑÑ€',
+'whatlinkshere-filters' => 'ФилтырхÑÑ€',
+
+# Block/unblock
+'blockip' => 'ТеубыдÑн',
+'ipboptions' => 'ÑÑÑ…ÑŒÑтитӀ:2 hours,1 махуÑ:1 day,махуищ:3 days,1 Ñ‚Ñ…ÑŒÑмахуÑ:1 week,Ñ‚Ñ…ÑŒÑмахуитӀ:2 weeks,1 мазÑ:1 month,мазищ:3 months,мазих:6 months,1 илъÑÑ:1 year,Ñытщыгъуи:infinite',
+'ipblocklist' => 'IP-адреÑÑ€Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚ зÑтеубыдахÑÑ€',
+'blocklink' => 'гъÑбыдÑн',
+'unblocklink' => 'зÑӀухыжьын',
+'change-blocklink' => 'теубыдыгъуÑÑ€ зÑхъуÑкӀын',
+'contribslink' => 'Ñ…ÑлъхьÑгъуÑ',
+'blocklogpage' => 'ТеубыдыныгъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'blocklogentry' => 'Триубыда [[$1]] $2 $3 нÑгъунÑ',
+'unblocklogentry' => 'ТеубыдыныгъÑÑ€ $1 триха',
+'block-log-flags-nocreate' => 'аккаунт региÑтрациÑÑ…ÑÑ€ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰',
+
+# Move page
+'movepagetext' => "ИщӀагъым щӀÑÑ‚ формÑÑ€ къÑбгъÑÑÑбÑпмÑ, напÑкӀуÑцӀым и цӀÑÑ€ зÑпхъуÑкӀыну, и зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´Ñ-тхылъри дÑщӀыгъу Ð¿Ó€Ñ Ñ‰Ó€Ñм иувÑнущ.
+И цӀÑжъым и цӀÑщӀÑÐ¼ÐºÓ€Ñ Ñ‚Ñ€Ð¸Ð³ÑŠÑ‹Ñ…ÑŒÑƒÑ€Ñ Ð¸Ñ‰Ó€Ñ‹Ð½ÑƒÑ‰.
+Ðвтоматику къÑбгъÑщӀÑÑ€ÑщӀыжьыфыну тегъÑÑ…ÑŒÑпӀÑÑ€, цӀÑжьым тетыр.
+ÐÑ€ умыщӀÑмÑ, щӀÑлъыплъ, [[Special:DoubleRedirects|тӀуанÑ]] Ð¸Ñ [[Special:BrokenRedirects|зÑбгырыдза тегъÑÑ…ÑŒÑпӀÑÑ…ÑÑ€]] щымыӀÑмÑ.
+Уи пщÑм илъщ техьÑпÑÑ…ÑÑ€ зыхуÑÐ½Ñ‹ÐºÑŠÑƒÑ Ð»ÑŠÑныкъуÑÐ¼ÐºÓ€Ñ Ñ‚Ñ€Ð°Ð³ÑŠÑÑ…ÑŒÑным щхьÑкӀÑ.
+
+Гу лъытÑ! ÐапÑкӀуÑцӀым и цӀÑÑ€ зÑхъуÑкӀынукъым, апхуÑдÑÑ†Ó€Ñ Ð·Ñрихьу напÑкӀуÑцӀ щыӀÑÑ…ÑмÑ, Ð¸Ñ Ñ‚ÐµÐ³ÑŠÑÑƒÐ²Ð°ÑƒÑ Ð¸Ñ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´ÑÑ€ нÑщӀу щытмÑ.
+Ðбым къикӀыр напÑкӀуÑцӀым и цӀÑÑƒÑ Ñ‰Ñ‹Ñ‚Ð°Ñ€ аргуÑру тепӀуÑжыфынущ, зÑрихьа къуÑÐ´ÐµÑƒÑ Ñ‰Ñ‹Ñ‚Ð°Ð¼, щуÑгъуÑÐºÓ€Ñ Ð·ÑпхъуÑкӀамÑ, Ð°ÑƒÑ Ñ‰Ñ‹ÑƒÑгъуÑÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ щыӀÑÑ€ тебгъÑкӀыфынукъым.
+
+'''ГУЛЪЫТЫГЪУЭ!'''
+ЦӀÑзÑхъуÑкӀыным напÑкӀуцӀ ''цӀÑрыӀуÑÑ…Ñм'' гузÑвÑÐ³ÑŠÑƒÑ ÑƒÐ·Ñмжа бжыгъÑÑ…ÑÑ€ къыхÑкӀыфынущ.
+ÐÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ð¸Ó€Ñн щхьÑÐºÓ€Ñ Ð¸Ð´Ð¶Ñ‹Ñ€Ð¸ Ð·Ñ ÐµÐ³ÑƒÑˆÑ‹Ð¿Ñ Ð° быщӀÑм къыхÑкӀынур къызÑрыбгурыӀуÑÑ€.",
+'movepagetalktext' => "ÐапÑкӀуÑц тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ…Ñлъхьами автоматику и цӀÑÑ€ зÑхъуÑкӀыну, '''мыбы хуÑдÑÑ…Ñм щымыхъукӀÑ:'''
+
+* Мы нÑщӀу, напÑкӀуÑцӀ тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ‰Ñ‹Ó€Ñщ, апхуÑÐ´Ñ Ñ†Ó€Ñ Ð·Ñрихьу иÑ
+* ИщӀыгъ-игъувапӀÑм деж щӀÑптхъакъым.
+
+ÐпхуÑдÑм дежь, напÑкӀуÑцӀхÑÑ€ уÑÑ€-уÑру Ó€ÑрыщӀу зÑÑ…ÑбгъÑÑ…ÑŒÑжынущ, хуÑныкъу щытмÑ.",
+'movearticle' => 'ÐапÑкӀуÑцӀым и цӀÑÑ€ хъуÑжын',
+'newtitle' => 'ЩIÑÑƒÑ Ð¸ цIÑÑ€',
+'move-watch' => 'ÐапÑкІуÑцІыр узыкІÑлъыплъ къебжÑкІым Ñ…ÑÑ‚Ñ…Ñн',
+'movepagebtn' => 'ÐапÑкӀуÑцӀым и цӀÑÑ€ хъуÑжын',
+'pagemovedsub' => 'ÐапÑкIуÑцIым и цIÑÑ€ хъуÑжащ',
+'movepage-moved' => "'''«$1» напÑкIуÑцIым и цIÑÑ€ хъуÑжащ мыпхуÑдÑу: «$2»'''",
+'articleexists' => 'ÐпхуÑÐ´Ñ Ñ†Ó€Ñ Ð·ÐµÐ·Ñ‹Ñ…ÑŒÑ Ð½Ð°Ð¿ÑкӀуÑц щыӀÑщ, Ð¸Ñ Ñ…ÑƒÑÐ¼Ñ‹ÐºÓ€ÑƒÑ Ñ†Ó€Ñ Ð¸Ð¿Ñ‚Ñ…Ð°.
+ÐÑмыщӀ Ñ†Ó€Ñ ÐºÑŠÑ‹Ñ…Ñхын Ñ…ÑƒÐµÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.',
+'talkexists' => "'''ÐапÑкӀуÑцӀым и цӀÑÑ€ зÑхъуÑкӀащ, Ð°ÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀ тепÑÑлъыхьыгъуÑм и цӀÑÑ€ зÑпхъуÑкӀ хъукъым, апхуÑÐ´Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ зÑрщыӀÑм щхьÑкӀÑ. УÑÑ€-уÑру Ó€ÑÑ€Ñ‹Ñ‰Ó€ÐºÓ€Ñ Ð·ÑÑ…ÑбгъÑÑ…ÑŒÑн хуÑйхÑ.'''",
+'movedto' => 'зÑдзÑкIащ мыпхуÑдÑу',
+'movetalk' => 'ÐапÑкӀуÑцӀ тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ‚ÐµÑƒÑ…ÑƒÐ°Ð¼ и цӀÑÑ€ зÑхъуÑкӀын',
+'1movedto2' => '«[[$1]]» - мыбы къикӀыу «[[$2]]» - мыпхуÑдÑу и цӀÑÑ€ хъуÑжын',
+'1movedto2_redir' => '«[[$1]]»-м и цӀÑÑ€ хъуÑжащ «[[$2]]» къегъÑзÑкӀам ищхьÑкӀÑ',
+'movelogpage' => 'ЦӀÑхъуÑкӀынхÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'movereason' => 'ЩхьÑуÑыгъуÑ:',
+'revertmove' => 'гъÑзÑжын',
+
+# Export
+'export' => 'ÐапÑкIуÑцIÑ…ÑÑ€ ÑкÑпорт щIын',
+
+# Thumbnails
+'thumbnail-more' => 'Ин щIын',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Уи Ñ…ÑтыгъуÑм и напÑкӀуÑцӀ',
+'tooltip-pt-mytalk' => 'Уи тепÑÑлъыхьуÑгъуÑм напÑкIуÑцIÑ‹Ñ€',
+'tooltip-pt-preferences' => 'Уи зÑгъÑзÑхуапхъÑÑ…ÑÑ€',
+'tooltip-pt-watchlist' => 'ÐапÑкӀуÑцӀхÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ, зи зÑхъуÑкӀыныгъÑÑ…Ñм узкÑлъыплъ',
+'tooltip-pt-mycontris' => 'Уи гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'tooltip-pt-login' => 'Мыбдеж ÑиÑтемÑм зиптхÑфынущ, Ð°ÑƒÑ Ð°Ñ€ Ó€ÑмалыншÑкъым.',
+'tooltip-pt-logout' => 'ИкӀыжын',
+'tooltip-ca-talk' => 'ÐапÑкӀуÑцӀым итым тепÑÑлъыхьын',
+'tooltip-ca-edit' => 'ÐапÑкӀуÑцӀыр пхъуÑж хъунущ. ИптхÑным Ð¸Ð¿Ñ ÐºÑŠÐ¸Ñ…ÑƒÑу еплъыж.',
+'tooltip-ca-addsection' => 'КъудамÑщIÑ Ñ‰IÑдзÑн',
+'tooltip-ca-viewsource' => 'Мы напÑкIуÑцIÑ‹Ñ€ и зÑхъуÑкIыныгъÑÑ€ гъÑбыдащ, Ð°ÑƒÑ ÑƒÑ…ÑƒÐ¸Ñ‚Ñ‰ къызыхÑкIа текÑтым уеплъынууи копие пщIынууи',
+'tooltip-ca-history' => 'ÐапÑкӀуÑцӀым и зÑхъуÑкӀынÑÐ³ÑŠÑ Ñ‚Ñ…Ñ‹Ð´Ñтхылъ',
+'tooltip-ca-protect' => 'ХъуÑжьынхÑм мы напÑкӀуÑцӀыр щыхъумÑн',
+'tooltip-ca-delete' => 'Мы напÑкIуÑцIÑ‹Ñ€ ихын',
+'tooltip-ca-move' => 'ÐапÑкӀуÑцӀым и цӀÑÑ€ хъуÑжын',
+'tooltip-ca-watch' => 'Мы напÑкIуÑцIÑ‹Ñ€ узыкІÑлъыплъ тхылъым Ñ…ÑлъхьÑн',
+'tooltip-ca-unwatch' => 'Мы напÑкIуÑцIÑ‹Ñ€ узыкІÑлъыплъ тхылъым Ñ…Ñхын',
+'tooltip-search' => 'Мы пÑалъÑÑ€ къÑлъыхъуÑн',
+'tooltip-search-go' => 'МыпхуÑÐ´Ð°Ð±Ð·Ñ Ñ†Ó€Ñ Ð·Ð¸Ó€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым кӀуÑн',
+'tooltip-search-fulltext' => 'Мы тхылъыр зыхÑÑ‚ напÑкӀуÑцӀхÑÑ€ къÑгъуÑтын',
+'tooltip-n-mainpage' => 'ÐапÑкӀуÑцӀ нÑхъыщхьÑм кӀуÑн',
+'tooltip-n-mainpage-description' => 'ÐапÑкӀуÑцӀ нÑхъыщхьÑм кӀуÑн',
+'tooltip-n-portal' => 'ПроÑтым теухуауÑ, ÑƒÑ ÐµÐ¿Ñ‰Ó€Ñфынур, дÑÐ½Ñ ÑÑ‹Ñ‚ щыӀÑми',
+'tooltip-n-currentevents' => 'Хъыбар къекуÑкӀхÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'tooltip-n-recentchanges' => 'Иужьырей зÑхъуÑкӀыныгъÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'tooltip-n-randompage' => 'ЗÑрамыщӀÑÐºÓ€Ñ Ñ…Ñха напÑкӀуÑцӀ еплъын',
+'tooltip-n-help' => 'ПроÑктым и дÑÓ€ÑпыкъуÑÐ³ÑŠÑƒÑ Â«{{SITENAME}}»',
+'tooltip-t-whatlinkshere' => 'Мы напÑкӀуÑцым и цӀÑÑ€ къÑзыӀу хъуам Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'tooltip-t-recentchangeslinked' => 'Мы напÑкӀуÑцӀым зызÑÑ…ÑƒÐ¸Ð³ÑŠÐ°Ð·Ñ Ð½Ð°Ð¿ÑкӀуÑцӀхÑм Ñ Ñужьрей зÑхъуÑкӀыныгъÑÑ…ÑÑ€',
+'tooltip-feed-rss' => 'ÐапÑкІуÑцІым щхьÑÐºÓ€Ñ RSS пыщІÑн',
+'tooltip-feed-atom' => 'ÐапÑкІуÑцІым щхьÑÐºÓ€Ñ Atom пыщІÑн',
+'tooltip-t-contributions' => 'ÐапÑкӀуÑцÑм Ñ Ñ‚Ó€Ñ…Ñ‹Ð»ÑŠ, мы Ñ…Ñтым зÑрихъуÑкӀаху',
+'tooltip-t-emailuser' => 'Мы Ñ…Ñтым и e-mail-м хуÑтхын',
+'tooltip-t-upload' => 'Файл илъхьÑн',
+'tooltip-t-specialpages' => 'ЛÑÐ¶ÑŒÑ‹Ð³ÑŠÑ Ð½Ð°Ð¿ÑкӀуÑцӀхÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+'tooltip-t-print' => 'ÐапÑкӀуÑцӀым и верÑие, къыкӀÑгъÑкӀыным щхьа',
+'tooltip-t-permalink' => 'Мы напÑкуÑцым и верÑÐ¸Ñ Ð·ÑмыхъуÑкӀым и техьÑпӀÑ',
+'tooltip-ca-nstab-main' => 'ТхыгъÑм кӀуÑцӀылъыр',
+'tooltip-ca-nstab-user' => 'ЦӀыхухÑтым и напÑкӀуÑцӀыр къÑгъÑлъÑгъуÑн',
+'tooltip-ca-nstab-special' => 'ЛÑÐ¶Ñ‹Ð³ÑŠÑ Ð½Ð°Ð¿ÑкӀуÑцӀ, гъÑÑ‚ÑÑ€Ñзыным щхьÑÐºÓ€Ñ Ð·ÑÑ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰',
+'tooltip-ca-nstab-project' => 'ÐапÑкІуÑцІым и проÑкт',
+'tooltip-ca-nstab-image' => 'Файлым и напÑкӀуÑцӀ',
+'tooltip-ca-nstab-template' => 'Шаблоным и напÑкӀуÑцӀ',
+'tooltip-ca-nstab-category' => 'КатегориÑм и напÑкӀуÑцӀ',
+'tooltip-minoredit' => 'ЗÑхъуÑкІыныгъÑÑ€ Ð¶ÑŒÐ³ÑŠÐµÐ¹ÑƒÑ ÐºÑŠÑлъытÑн',
+'tooltip-save' => 'Уи гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€ хъумÑн',
+'tooltip-preview' => 'ÐапÑкІуÑцІым и ÑпÑ-еплъ, итхÑным Ð¸Ð¿Ñ ÐºÑŠÑгъÑÑÑбÑп!',
+'tooltip-diff' => 'ЯпÑрей тхыгъÑм и хуÑлъытыгъуÑÐºÓ€Ñ Ð·ÑхъуÑÐºÓ€Ñ‹Ð½Ñ‹Ð³ÑŠÑ Ñ…Ð°Ð»ÑŠÑ…ÑŒÑÑ…ÑÑ€ гъÑлъÑгъуÑн.',
+'tooltip-compareselectedversions' => 'ВерÑÐ¸Ñ Ñ‚Ó€ÑƒÑƒÑ Ñ…Ñхам Ñ Ð·ÑщхьÑщыкыгъуÑÑ€ гъÑлъÑгъуÑн',
+'tooltip-watch' => 'Мы напÑкIуÑцIÑ‹Ñ€ уи кӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ Ñ…ÑлъхьÑн',
+'tooltip-rollback' => 'Зы текъузÑкIÑ Ð·ÑхъуÑкIыныгъÑÑ…ÑÑ€ Ӏухын, Ñужырей редакторым ищIахÑÑ€',
+'tooltip-undo' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ…Ñлъхьар Ó€ÑƒÑ…Ð°ÑƒÑ ÑпÑ-еплъ щӀын, Ñ…Ñхыжыным гурыӀуÑÐ³ÑŠÑƒÑ Ð¸Ó€Ñƒ гъÑлъÑгъуÑным щхьÑкӀÑ.',
+
+# Browsing diffs
+'previousdiff' => ' ↠ЯпÑрыт гъÑÑ‚ÑÑ€ÑзыгъуÑÑ€',
+'nextdiff' => 'КъыкIÑлъыкIÑƒÑ Ð³ÑŠÑÑ‚ÑÑ€ÑзыгъуÑÑ€ →',
+
+# Media information
+'file-info-size' => '$1 × $2 пикÑелу, файлым и инагъыр: $3, MIME-тип: $4',
+'file-nohires' => '<small>Ин плъыфÑу къÑгъÑлъÑгъуÑн щыIÑкъым.</small>',
+'svg-long-desc' => 'SVG файл, номиналу $1 × $2 пикÑел, файлым и инагъыр: $3',
+'show-big-image' => 'СурÑÑ‚Ñ‹Ñ€ нÑÑ…ÑŠ къабзÑу',
+'show-big-image-thumb' => '<small>ЯпÑ-еплъым и инагъ: пикÑел: $1 × $2</small>',
+
+# Bad image list
+'bad_image_list' => 'Форматыр зÑрщытын хуÑÑ€:
+
+Ð“ÑƒÐ»Ñ‹Ñ‚Ñ Ð·Ð¸Ó€Ñнур тхылъым и дÑмыгъÑÑ…Ñм (Ñатыр дÑÐ¼Ñ‹Ð³ÑŠÑ * къежьÑÑ…ÑÑ€).
+Сатырым и техьÑÐ¿Ó€Ñ ÑпÑрейм ÑурÑÑ‚ Ð¸Ð¿Ð»ÑŠÑ…ÑŒÑ Ð¼Ñ‹Ñ…ÑŠÑƒÐ½ÑƒÐ¼ и техьÑÐ¿Ó€Ñ Ð¸Ó€Ñн хуÑй.
+Яужырыт техьÑпӀÑÑ…ÑÑ€ Ñ…ÑгъÑкӀа хуÑду къилъытÑну, ÑурÑÑ‚Ñ‹Ñ€ Ð·Ð´Ð¸Ð¿Ð»ÑŠÑ Ñ…ÑŠÑƒÐ½Ñƒ тхыгъÑÑ…ÑÑ€.',
+
+# Metadata
+'metadata' => 'МетаданнÑÑ…ÑÑ€',
+'metadata-help' => 'Файлым дÑÓ€ÑпыкъуÑгъу кÑӀуÑÑ‚ÑгъуÑÑ…ÑÑ€ Ñ…Ñлъ, диджитал камерÑÑ…Ñм Ð¸Ñ ÑканерхÑм халъхьÑÑ…ÑÑ€. Файлыр Ñ…Ñлъхьа Ñуж ÑгъÑÑ‚ÑÑ€ÑзамÑ, къÑӀуÑÑ‚ÑÐ³ÑŠÑƒÑ Ð³ÑƒÑÑ€ÑÑ…ÑÑ€ ÑурÑÑ‚ итым ехÑм темыхуÑÐ½ÐºÓ€Ñ Ñ…ÑŠÑƒÐ½ÑƒÑ‰.',
+'metadata-expand' => 'ДÑÑпыкъуÑгъу кÑӀуÑÑ‚ÑгъуÑÑ…ÑÑ€ гъÑлъÑгъуÑн',
+'metadata-collapse' => 'ДÑÑпыкъуÑгъу кÑӀуÑÑ‚ÑгъуÑÑ…ÑÑ€ гъÑпшкӀун',
+'metadata-fields' => 'МетаданнÑÑ…ÑÑ€, мыбы кърибжÑкІхÑÑ€ къызÑрыгуÑкІыу ÑурÑтым и напÑкІуÑцІым къщридзÑнущ, адрейхÑÑ€ гъÑпщкІуау щытынущ.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength',
+
+# External editor support
+'edit-externally' => 'Файлыр гъÑÑ‚ÑÑ€Ñзын, нÑгъуÑщӀ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ Ð¸ ÑÑбÑпкӀÑ',
+'edit-externally-help' => '(нÑхъыбу еплъ [http://www.mediawiki.org/wiki/Manual:External_editors илъхьÑным и тепÑÑлъыхьыгъуÑ])',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'пÑори',
+'namespacesall' => 'пÑори',
+'monthsall' => 'пÑори',
+
+# Multipage image navigation
+'imgmultipageprev' => 'ÑпÑрыт напÑкӀуÑцӀыр',
+'imgmultipagenext' => 'къыкӀÑÐ»ÑŠÑ‹ÐºÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀыр',
+
+# Table pager
+'table_pager_next' => 'КъыкӀÑÐ»ÑŠÑ‹ÐºÓ€ÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀыр',
+'table_pager_prev' => 'ЯпÑрыт напÑкӀуÑцӀыр',
+'table_pager_first' => 'ЯпÑрей напÑкӀуÑцӀыр',
+'table_pager_last' => 'Яужырей напÑкӀуÑцӀыр',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Тхылъым Ñ…ÑÑ‚ напÑкIуÑцIÑ…Ñм щыщу хъуÑжахÑÑ€',
+'watchlisttools-edit' => 'Еплъын/гъÑÑ‚ÑÑ€Ñзын тхылъыр',
+'watchlisttools-raw' => 'Тхылъ хуÑдÑу гъÑÑ‚ÑÑ€Ñзын',
+
+# Special:Version
+'version-specialpages' => 'ЛÑÐ¶Ñ‹Ð³ÑŠÑ Ð½Ð°Ð¿ÑкӀуÑцӀ',
+
+# Special:SpecialPages
+'specialpages' => 'СпецнапÑкӀуÑцӀхÑÑ€',
+
+);
diff --git a/languages/messages/MessagesKiu.php b/languages/messages/MessagesKiu.php
index d2a4de64..4da8cd3c 100644
--- a/languages/messages/MessagesKiu.php
+++ b/languages/messages/MessagesKiu.php
@@ -29,8 +29,7 @@ href="" class="internal"}?{/a}) basne.',
'tog-editsection' => 'Vurnaena qısımi ebe gireunê [bıvurne] ra feal ke',
'tog-editsectiononrightclick' => 'Qısımu be teqnaena serrêze ra ebe gozaga raste bıvurne (JavaScript lazımo)',
'tog-showtoc' => 'Tabloê tedeesteu basne (de pelunê be hirê sernustu ra jêdêri de)',
-'tog-rememberpassword' => 'Parola mı bia ho viri',
-'tog-editwidth' => 'Warê nustey hira ke, ke verıniya pela cıdaena nustey tam baso',
+'tog-rememberpassword' => 'Parola mı nê cıcêraoği de bia ho viri (serba tewr jêde $1 {{PLURAL:$1|roze|rozu}}).',
'tog-watchcreations' => 'Pelê ke mı afernê, lista mına şêrkerdişi ke',
'tog-watchdefault' => 'Pelê ke mı vurnê, lista mına şêrkerdişi ke',
'tog-watchmoves' => 'Pelê ke mı kırısnê, lista mına şêrkerdişi ke',
@@ -175,31 +174,21 @@ href="" class="internal"}?{/a}) basne.',
'faqpage' => 'Project:PZP',
# Vector skin
-'vector-action-addsection' => 'Mewzu ilawe ke',
-'vector-action-delete' => 'Bestere',
-'vector-action-move' => 'Bere',
-'vector-action-protect' => 'Bısevekne',
-'vector-action-undelete' => 'Esterıtene peyser bıcê',
-'vector-action-unprotect' => 'Rake',
-'vector-namespace-category' => 'Kategoriye',
-'vector-namespace-help' => 'Pela phoÅŸti',
-'vector-namespace-image' => 'Dosya',
-'vector-namespace-main' => 'Pele',
-'vector-namespace-media' => 'Pela weseti',
-'vector-namespace-mediawiki' => 'Mesac',
-'vector-namespace-project' => 'Pela procey',
-'vector-namespace-special' => 'Pela xususiye',
-'vector-namespace-talk' => 'Hurênais',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Pela karberi',
-'vector-view-create' => 'Vıraze',
-'vector-view-edit' => 'Bıvurne',
-'vector-view-history' => 'Tarixi basne',
-'vector-view-view' => 'Bıwane',
-'vector-view-viewsource' => 'Çımey bıvêne',
-'actions' => 'Kerdey',
-'namespaces' => 'Caê namey',
-'variants' => 'Varyanti',
+'vector-action-addsection' => 'Mewzu ilawe ke',
+'vector-action-delete' => 'Bestere',
+'vector-action-move' => 'Bere',
+'vector-action-protect' => 'Bısevekne',
+'vector-action-undelete' => 'Esterıtene peyser bıcê',
+'vector-action-unprotect' => 'Rake',
+'vector-simplesearch-preference' => 'Tewsiyunê cıcêraişiê raverberdu rake (Teyna vector skin de)',
+'vector-view-create' => 'Vıraze',
+'vector-view-edit' => 'Bıvurne',
+'vector-view-history' => 'Tarixi basne',
+'vector-view-view' => 'Bıwane',
+'vector-view-viewsource' => 'Çımey bıvêne',
+'actions' => 'Kerdey',
+'namespaces' => 'Caê namey',
+'variants' => 'Varyanti',
'errorpagetitle' => 'Xeta',
'returnto' => 'Peyser so $1.',
@@ -260,6 +249,9 @@ Hedê ho ra jêde karberi kenê ke şêrê na pele bıkerê.
Sıma rê zamet, tenê vınderê, hata ke reyna kenê ke na pele kuyê.
$1',
+'pool-timeout' => 'Kilıtbiyaene sero waxtê vınetişi',
+'pool-queuefull' => 'Rêza hewze pırra',
+'pool-errorunknown' => 'Xeta nêzanıtiye',
# 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' => 'Heqa {{SITENAME}} de',
@@ -421,71 +413,74 @@ Sebebê ho ''$2'' dero.",
'virus-unknownscanner' => "''antivirus''o nêzanıte:",
# Login and logout pages
-'logouttext' => "'''Sıma nıka cı ra veciyê.'''
+'logouttext' => "'''Sıma nıka cı ra veciyê.'''
Sıma şikinê dızdêni {{SITENAME}} de dewam kerê, ya jê eyni karberi ya ki jê jüyê de bini [[Special:UserLogin|oncia cıkuyê]].
Beno ke taê peli sıma hona cıkote asnenê, hata ke sıma ''browser cache''ê ho kerd pak.",
-'welcomecreation' => '== Xêr amê, $1! ==
+'welcomecreation' => '== Xêr amê, $1! ==
Hesabê sıma vıraciya.
Vurnaena [[Special:Preferences|melumatanê {{SITENAME}}]] ho vira mekerê.',
-'yourname' => 'Namê karberi:',
-'yourpassword' => 'Parola:',
-'yourpasswordagain' => 'Parola tekrar ke:',
-'remembermypassword' => 'Mı na komputeri de biya ho viri',
-'yourdomainname' => 'Bandıra sıma:',
-'externaldberror' => 'Cıfeteliyaisê naskerdene de ya xeta esta ya ki tebera vırastena hesabê sıma rê destur çino.',
-'login' => 'Cıkuye',
-'nav-login-createaccount' => 'Cıkuye / hesab vıraze',
-'loginprompt' => "Cıkotena {{SITENAME}} rê gunê ''cookies'' akerdey bê.",
-'userlogin' => 'Cıkuye / hesab vıraze',
-'userloginnocreate' => 'Cıkuye',
-'logout' => 'Veciye',
-'userlogout' => 'Veciye',
-'notloggedin' => 'Cı nêkota',
-'nologin' => "Hesabê sıma çino? '''$1'''.",
-'nologinlink' => 'Jü hesab rake',
-'createaccount' => 'Hesab vıraze',
-'gotaccount' => "Hesabê sıma ke esto? '''$1'''.",
-'gotaccountlink' => 'Cıkuye',
-'createaccountmail' => 'e-poste sera',
-'badretype' => 'Parola sıma nêvêrena.',
-'userexists' => 'No namê karberi guretiyo.
+'yourname' => 'Namê karberi:',
+'yourpassword' => 'Parola:',
+'yourpasswordagain' => 'Parola tekrar ke:',
+'remembermypassword' => 'Cıkotena mı na komputeri de bia ho viri ($1 {{PLURAL:$1|roze|rozu}} ra seba zu zêdêrêni)',
+'securelogin-stick-https' => 'Cıkotene ra dıme HTTPS rê giredae bımane',
+'yourdomainname' => 'Bandıra sıma:',
+'externaldberror' => 'Cıfeteliyaisê naskerdene de ya xeta esta ya ki tebera vırastena hesabê sıma rê destur çino.',
+'login' => 'Cıkuye',
+'nav-login-createaccount' => 'Cıkuye / hesab vıraze',
+'loginprompt' => "Cıkotena {{SITENAME}} rê gunê ''cookies'' akerdey bê.",
+'userlogin' => 'Cıkuye / hesab vıraze',
+'userloginnocreate' => 'Cıkuye',
+'logout' => 'Veciye',
+'userlogout' => 'Veciye',
+'notloggedin' => 'Cı nêkota',
+'nologin' => "Hesabê sıma çino? '''$1'''.",
+'nologinlink' => 'Jü hesab rake',
+'createaccount' => 'Hesab vıraze',
+'gotaccount' => "Hesabê sıma ke esto? '''$1'''.",
+'gotaccountlink' => 'Cıkuye',
+'createaccountmail' => 'e-poste sera',
+'createaccountreason' => 'Sebeb:',
+'badretype' => 'Parola sıma nêvêrena.',
+'userexists' => 'No namê karberi guretiyo.
Kerem ke, namêna weçine.',
-'loginerror' => 'Xeta cıkotene',
-'createaccounterror' => 'Hesab nêvırajino: $1',
-'nocookiesnew' => 'Hesabê karberi vıraziya, hama sıma nêşikiyay cı kuyê.
+'loginerror' => 'Xeta cıkotene',
+'createaccounterror' => 'Hesab nêvırajino: $1',
+'nocookiesnew' => 'Hesabê karberi vıraziya, hama sıma nêşikiyay cı kuyê.
Serba rakerdena hesabi çerezê {{SITENAME}}i gurêninê.
Sıma çerezi qapan kerdi.
Ravêri ine rakerê, dıma be name u parola sımawa newiye cı kuyê.',
-'nocookieslogin' => 'Serba rakerdena hesabi çerezê {{SITENAME}}i gurêninê.
+'nocookieslogin' => 'Serba rakerdena hesabi çerezê {{SITENAME}}i gurêninê.
Sıma çerezi qapan kerdi.
Ravêri ine rakerê u reyna bıcerrebnê.',
-'noname' => 'Ebe namê do vêrdoği ra cınêkota.',
-'loginsuccesstitle' => 'Cıkotene biye ra',
-'loginsuccess' => "'''Sıta {{SITENAME}} de ebe namê karberi \"\$1\" kota cı.'''",
-'nosuchuser' => 'Ebe namê "$1"i jü karber çino.
+'noname' => 'Ebe namê do vêrdoği ra cınêkota.',
+'loginsuccesstitle' => 'Cıkotene biye ra',
+'loginsuccess' => "'''Sıta {{SITENAME}} de ebe namê karberi \"\$1\" kota cı.'''",
+'nosuchuser' => 'Ebe namê "$1"i jü karber çino.
Nustena namunê karberu de herfa pil u qıze rê diqet kerê.
Nustena ho qonrol kerê, ya ki [[Special:UserLogin/signup|jü hesabo newe rakerê]].',
-'nosuchusershort' => 'Karberê do ebe namê "<nowiki>$1</nowiki>" çino.
+'nosuchusershort' => 'Karberê do ebe namê "<nowiki>$1</nowiki>" çino.
Nustena cı qontrol ke.',
-'nouserspecified' => 'Gunê namê jü karberi bıdekernê.',
-'login-userblocked' => 'No karber engel biyo. Cıkotene rê mısade cı nêdino.',
-'wrongpassword' => 'Parola ğelete kota cı.
+'nouserspecified' => 'Gunê namê jü karberi bıdekernê.',
+'login-userblocked' => 'No karber engel biyo. Cıkotene rê mısade cı nêdino.',
+'wrongpassword' => 'Parola ğelete kota cı.
Kerem ke, oncia bıcerrebne.',
-'wrongpasswordempty' => 'Parola thale kota cı.
+'wrongpasswordempty' => 'Parola thale kota cı.
Kerem ke, oncia bıcerrebne.',
-'passwordtooshort' => 'Paroley tewr senık ebe {{PLURAL:$1|1 karakter|$1 karakteru}} gunê derg bê.',
-'password-name-match' => 'Parola sıma namê sımaê karberi ra gunê ferqın bo.',
-'mailmypassword' => 'E-mail sera parola newiye bırusne',
-'passwordremindertitle' => 'Serba {{SITENAME}} parola newiya vêrdoğe',
-'noemail' => 'Adresa de e-posteya ke ebe namê karberi "$1" beqeyda, çina.',
-'mailerror' => 'Xeta rusnaena e-postey: $1',
-'emailconfirmlink' => 'Adresa e-postê ho tesdiq ke',
-'accountcreated' => 'Hesab vırajiya',
-'accountcreatedtext' => 'Serba $1i hesabê karberi vırajiya.',
-'createaccount-title' => 'Serba {{SITENAME}}i vırajiyaene hesabê karberi',
-'usernamehasherror' => 'Namê karberi de karakteri gunê têwerte ra mebê',
-'loginlanguagelabel' => 'Zon: $1',
+'passwordtooshort' => 'Paroley tewr senık ebe {{PLURAL:$1|1 karakter|$1 karakteru}} gunê derg bê.',
+'password-name-match' => 'Parola sıma namê sımaê karberi ra gunê ferqın bo.',
+'password-login-forbidden' => 'Namê nê karberi u gurenaena parola qedeğen biya.',
+'mailmypassword' => 'E-mail sera parola newiye bırusne',
+'passwordremindertitle' => 'Serba {{SITENAME}} parola newiya vêrdoğe',
+'noemail' => 'Adresa de e-posteya ke ebe namê karberi "$1" beqeyda, çina.',
+'mailerror' => 'Xeta rusnaena e-postey: $1',
+'emailconfirmlink' => 'Adresa e-postê ho tesdiq ke',
+'accountcreated' => 'Hesab vırajiya',
+'accountcreatedtext' => 'Serba $1i hesabê karberi vırajiya.',
+'createaccount-title' => 'Serba {{SITENAME}}i vırajiyaene hesabê karberi',
+'usernamehasherror' => 'Namê karberi de karakteri gunê têwerte ra mebê',
+'loginlanguagelabel' => 'Zon: $1',
# Password reset dialog
'resetpass' => 'Parola bıvurne',
@@ -559,6 +554,8 @@ ya ki [{{fullurl:{{FULLPAGENAME}}|action=edit}} na pele bıvurnê]</span>.',
'userpage-userdoesnotexist' => 'Hesabê karberi "$1" qeyd nêbiyo.
Kerem ke, tı ke wazena na pele vırazê/bıvurnê, qontrol ke.',
'userpage-userdoesnotexist-view' => 'Hesabê karberi "$1" qeyd nêbiyo.',
+'userinvalidcssjstitle' => "'''Teme:''' Mewzuyê \"\$1\" çino.
+Dosyunê ebe namê .css u .js'y de herfa hurdiye bıgurêne, mesela hurêndia {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
'updated' => '(Bi rozane)',
'note' => "'''Not:'''",
'previewnote' => "'''Bıfıkıriye ke no teyna jü verqayto.'''
@@ -884,10 +881,6 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
'recentchanges' => 'Vurnaisê peyêni',
'recentchanges-legend' => 'Alternatifê vurnaisunê peyênu',
'recentchanges-feed-description' => 'Na weiyekerdena wiki de vurnaisê tewrpeyêne ke biyê ine teqib ke.',
-'recentchanges-label-legend' => 'Arezekerdeni: $1.',
-'recentchanges-legend-newpage' => '$1 - pela newiye',
-'recentchanges-legend-minor' => '$1 vurnaiso qızkek',
-'recentchanges-legend-bot' => '$1 - vurnaisê boti',
'rcnote' => "Cêr {{PLURAL:$1|'''1''' vurnaiso peyên|'''$1''' vurnaisê peyêni}} be {{PLURAL:$2|roza peyêne|'''$2''' rozunê peyênunê}} $5, $4 ra estê.",
'rclistfrom' => '$1 ra hata nıka vurnaisunê newu bıasne',
'rcshowhideminor' => '$1 vurnaisê qızkeki',
@@ -1070,7 +1063,6 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
# Watchlist
'watchlist' => 'Pela mına şêrkerdene',
'mywatchlist' => 'Lista mına şêrkerdışi',
-'watchlistfor' => "(serba '''$1''')",
'addedwatch' => 'Kerd be lista şêrkerdişi ser',
'addedwatchtext' => "Pela \"[[:\$1]]\"i ilawe biye be [[Special:Watchlist|pela şêrkerdişi]].
Nara dıme, vurnaisê na pele u pela hurênaisê dawa alaqedare ita bena lista, u pele [[Special:RecentChanges|lista vurnaisunê peyênu]] de '''qolınd''' asena ke cı ra asan weçiniyo.",
@@ -1337,9 +1329,9 @@ Serba areze-kerdene qaytê ''math/README''y ke.",
'nextdiff' => 'Vurnaena newêre →',
# Media information
-'file-info-size' => '($1 × $2 piksel, gırsênia dosya: $3, MIME tipê cı: $4)',
+'file-info-size' => '$1 × $2 piksel, gırsênia dosya: $3, MIME tipê cı: $4',
'file-nohires' => '<small>Tewrêna berz rovıleşiyaene nêbena.</small>',
-'svg-long-desc' => '(Dosya SVGy, seha ke $1 × $2 pixels, gırşênia dosya: $3)',
+'svg-long-desc' => 'Dosya SVGy, seha ke $1 × $2 pixels, gırşênia dosya: $3',
'show-big-image' => 'Rovıleşiyaena tame',
'show-big-image-thumb' => '<small>Gırsênia verqayti: $1 × $2 piksel</small>',
@@ -1463,4 +1455,8 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
# Special:BlankPage
'blankpage' => 'Pela thale',
+# Special:ComparePages
+'compare-page1' => 'Pele 1',
+'compare-page2' => 'Pele 2',
+
);
diff --git a/languages/messages/MessagesKk_arab.php b/languages/messages/MessagesKk_arab.php
index 440ad6b7..75d3a5d4 100644
--- a/languages/messages/MessagesKk_arab.php
+++ b/languages/messages/MessagesKk_arab.php
@@ -164,9 +164,9 @@ $dateFormats = array(
'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
'persian time' => 'â€H:i',
- 'persian date' => 'â€xij xiF xiY',
+ 'persian date' => 'â€xij xiF xiY',
'persian both' => 'â€xij xiF xiYØŒ H:i',
-
+
'hebrew time' => 'â€H:i',
'hebrew date' => 'â€xjj xjF xjY',
'hebrew both' => 'â€H:iØŒ xjj xjF xjY',
@@ -180,7 +180,7 @@ $dateFormats = array(
* Magic words
* Customisable syntax for wikitext and elsewhere.
*
- * IDs must be valid identifiers, they can't contain hyphens.
+ * IDs must be valid identifiers, they can't contain hyphens.
*
* Note to translators:
* Please include the English words as synonyms. This allows people
@@ -398,9 +398,9 @@ $specialPageAliases = array(
'Invalidateemail' => array( 'قۇپتاماۋ_حاتى' ),
);
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Default messages
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
$messages = array(
# User preference toggles
@@ -416,8 +416,7 @@ $messages = array(
'tog-editsection' => 'بولىمدەردى [وڭدەۋ] سىلتەمەسىمەن وڭدەۋىن قوس',
'tog-editsectiononrightclick' => 'ٴبولىم تاقىرىبىن وڭ نۇقۋمەن وڭدەۋىن قوس (JavaScript)',
'tog-showtoc' => 'مازمۇنىن كورسەت (3-تەن ارتا ٴبولىمى بارىلارعا)',
-'tog-rememberpassword' => 'كىرگەنىمدى وسى كومپيۋتەردە ۇمىتپا',
-'tog-editwidth' => 'كىرىستىرۋ ورنى تولىق ەنىمەن',
+'tog-rememberpassword' => 'كىرگەنىمدى وسى كومپيۋتەردە ۇمىتپا (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'مەن باستاعان بەتتەردى باقىلاۋ تىزىمىمە ۇستە',
'tog-watchdefault' => 'مەن وڭدەگەن بەتتەردى باقىلاۋ تىزىمىمە ۇستە',
'tog-watchmoves' => 'مەن جىلجىتقان بەتتەردى باقىلاۋ تىزىمىمە ۇستە',
@@ -757,7 +756,7 @@ $2',
'yourname' => 'قاتىسۋشى اتىڭىز:',
'yourpassword' => 'قۇپىييا ٴسوزىڭىز:',
'yourpasswordagain' => 'قۇپىييا ٴسوزدى قايتالاڭىز:',
-'remembermypassword' => 'مەنىڭ كىرگەنىمدى بۇل كومپيۋتەردە ۇمىتپا',
+'remembermypassword' => 'مەنىڭ كىرگەنىمدى بۇل كومپيۋتەردە ۇمىتپا (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'جەلى ۇيشىگىڭىز:',
'externaldberror' => 'وسى ارادا نە شەتتىك راستاۋ دەرەكقورىندا قاتە بولدى, نەمەسە شەتتىك تىركەلگىڭىزدى جاڭالاۋ رۇقساتى جوق.',
'login' => 'كىرۋ',
@@ -937,7 +936,7 @@ IP مەكەنجايىڭىز بۇل بەتتىڭ تۇزەتۋ تارىيحىندØ
'usercsspreview' => "'''مىناۋ CSS ٴماتىنىن تەك قاراپ شىعۋ ەكەنىن ۇمىتپاڭىز, ول ٴالى ساقتالعان جوق!'''",
'userjspreview' => "'''مىناۋ JavaScript قاتىسۋشى باعدارلاماسىن تەكسەرۋ/قاراپ شىعۋ ەكەنىن ۇمىتپاڭىز, ول ٴالى ساقتالعان جوق!'''",
'userinvalidcssjstitle' => "'''قۇلاقتاندىرۋ:''' وسى ارادا «$1» دەگەن ەش مانەر جوق.
-قاتىسۋشىنىڭ .css جانە .js Ùايل اتاۋى كىشى ارىپپپەن جازىلۋ ٴتىيىستى ەكەنىن ۇمىتپاڭىز, مىسالعا {{ns:user}}:Foo/monobook.css دەگەندى {{ns:user}}:Foo/Monobook.css دەگەنمەن سالىستىرىپ قاراڭىز.",
+قاتىسۋشىنىڭ .css جانە .js Ùايل اتاۋى كىشى ارىپپپەن جازىلۋ ٴتىيىستى ەكەنىن ۇمىتپاڭىز, مىسالعا {{ns:user}}:Foo/vector.css دەگەندى {{ns:user}}:Foo/Vector.css دەگەنمەن سالىستىرىپ قاراڭىز.",
'updated' => '(جاڭارتىلعان)',
'note' => "'''اڭعارتپا:'''",
'previewnote' => "'''مىناۋ تەك قاراپ شىعۋ ەكەنىن ۇمىتپاڭىز;
@@ -977,9 +976,6 @@ IP مەكەنجايىڭىز بۇل بەتتىڭ تۇزەتۋ تارىيحىندØ
ەگەر جازۋىڭىزدىڭ ەركىن وڭدەلۋىن قالاماساڭىز, مىندا جارىييالاماۋىڭىز ٴجون.<br />
تاعى دا, بۇل ماعلۇمات ٴوزىڭىز جازعانىڭىزعا, نە قوعام قازىناسىنان نەمەسە سونداي اشىق قورلاردان كوشىرىلگەنىنە بىزگە ۋادە بەرەسىز (كوبىرەك اقپارات ٴۇشىن $1 قۋجاتىن قاراڭىز).
'''اۋتورلىق قۇقىقپەن قورعاۋلى ماعلۇماتتى رۇقساتسىز جارىييالاماڭىز!'''",
-'longpagewarning' => "'''قۇلاقتاندىرۋ: بۇل بەتتىڭ مولشەرى — $1 kB;
-كەيبىر شولعىشتاردا بەت مولشەرى 32 kB جەتسە نە ونى اسسا وڭدەۋ كۇردەلى بولۋى مۇمكىن.
-بەتتى بىرنەشە كىشكىن بولىمدەرگە ٴبولىپ كورىڭىز.'''",
'longpageerror' => "'''قاتەلىك: جونەلتپەك ٴماتىنىڭىزدىن مولشەرى — $1 KB, ەڭ كوبى $2 KB رۇقسات ەتىلگەن مولشەرىنەن اسقان.
بۇل ساقتاي الىنبايدى.'''",
'readonlywarning' => "'''قۇلاقتاندىرۋ: دەرەكقور باپتاۋ ٴۇشىن قۇلىپتالعان, سوندىقتان ٴدال قازىر وڭدەمەڭىزدى ساقتاي المايسىز.
@@ -1465,7 +1461,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
'fileexists-shared-forbidden' => 'وسىلاي اتالعان Ùايل ورتاق قويمادا الداقاشان بار;
كەرى قايتىڭىز دا, وسى Ùايلدى جاڭا اتىمەن قوتارىپ بەرىڭىز. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'بۇل Ùايل كەلەسى {{PLURAL:$1|Ùايلدىڭ|Ùايلدارىنىڭ}} تەلنۇسقاسى:',
-'successfulupload' => 'ٴساتتى قوتارىپ بەرىلدى',
'uploadwarning' => 'قوتارىپ بەرۋ جونىندە قۇلاقتاندىرۋ',
'savefile' => 'Ùايلدى ساقتاۋ',
'uploadedimage' => '«[[$1]]» Ùايلىن قوتارىپ بەردى',
@@ -1486,6 +1481,7 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
قولايلى بولۋى ٴۇشىن بۇل Ùايلدىڭ جويۋ جۋرنالى كەلتىرىلگەن:",
'filename-bad-prefix' => "قوتارىپ بەرمەك Ùايلىڭىزدىڭ اتاۋى '''«$1» ''' دەپ باستالادى, مىناداي سىيپاتتاۋسىز اتاۋدى ادەتتە ساندىق كامەرالار وزدىكتىك بەرەدى.
Ùايلىڭىزعا سىيپاتتىلاۋ اتاۋدى تاڭداڭىز.",
+'upload-success-subj' => 'ٴساتتى قوتارىپ بەرىلدى',
'upload-proto-error' => 'بۇرىس حاتتاما',
'upload-proto-error-text' => 'شەتتەن قوتارىپ بەرۋ ٴۇشىن URL جايلارى <code>http://</code> نەمەسە <code>ftp://</code> دەگەندەردەن باستالۋ ٴجون.',
@@ -1781,7 +1777,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'باقىلاۋ ٴتىزىمى',
'mywatchlist' => 'باقىلاۋىم',
-'watchlistfor' => "('''$1''' باقىلاۋلارى)",
'nowatchlist' => 'باقىلاۋ تىزىمىڭىزدە ەش دانا جوق',
'watchlistanontext' => 'باقىلاۋ تىزىمىڭىزدەگى دانالاردى قاراۋ, نە وڭدەۋ ٴۇشىن $1 كەرەك.',
'watchnologin' => 'كىرمەگەنسىز',
@@ -1897,7 +1892,9 @@ $NEWPAGE
'revertpage' => '[[{{#special:Contributions}}/$2|$2]] ([[{{ns:user_talk}}:$2|تالقىلاۋى]]) وڭدەمەلەرىنەن [[{{ns:user}}:$1|$1]] سوڭعى نۇسقاسىنا قايتاردى',
'rollback-success' => '$1 وڭدەمەلەرىنەن قايتارعان;
$2 سوڭعى نۇسقاسىنا وزگەرتتى.',
-'sessionfailure' => 'كىرۋ سەسسىيياسىندا شاتاق بولعان سىيياقتى;
+
+# Edit tokens
+'sessionfailure' => 'كىرۋ سەسسىيياسىندا شاتاق بولعان سىيياقتى;
سەسسىيياعا شابۋىلداۋداردان قورعانۋ ٴۇشىن, وسى ارەكەت توقتاتىلدى.
«ارتقا» دەگەندى باسىڭىز, جانە بەتتى قايتا جۇكتەڭىز دە, قايتا بايقاپ كورىڭىز.',
@@ -2080,7 +2077,6 @@ $1',
'ipb-edit-dropdown' => 'بۇعاتتاۋ سەبەپتەرىن وڭدەۋ',
'ipb-unblock-addr' => '$1 دەگەندى بۇعاتتاماۋ',
'ipb-unblock' => 'قاتىسۋشى اتىن نەمەسە IP مەكەنجايىن بۇعاتتاماۋ',
-'ipb-blocklist-addr' => '$1 ٴۇشىن بار بۇعاتتاۋلاردى قاراۋ',
'ipb-blocklist' => 'بار بۇعاتتاۋلاردى قاراۋ',
'unblockip' => 'قاتىسۋشىنى بۇعاتتاماۋ',
'unblockiptext' => 'تومەندەگى ٴپىشىندى الدىنداعى IP مەكەنجايىمەن نە اتىمەن بۇعاتتالعان قاتىسۋشىعا جازۋ قاتىناۋىن قالپىنا كەلتىرىۋى ٴۇشىن قولدانىڭىز.',
@@ -2471,9 +2467,9 @@ $1',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3 بەت',
'file-info' => 'Ùايل مولشەرى: $1, MIME ٴتۇرى: $2',
-'file-info-size' => '($1 × $2 نۇكتە, Ùايل مولشەرى: $3, MIME ٴتۇرى: $4)',
+'file-info-size' => '$1 × $2 نۇكتە, Ùايل مولشەرى: $3, MIME ٴتۇرى: $4',
'file-nohires' => '<small>جوعارى اجىراتىلىمدىعى جەتىمسىز.</small>',
-'svg-long-desc' => '(SVG Ùايلى, كەسىمدى $1 × $2 نۇكتە, Ùايل مولشەرى: $3)',
+'svg-long-desc' => 'SVG Ùايلى, كەسىمدى $1 × $2 نۇكتە, Ùايل مولشەرى: $3',
'show-big-image' => 'جوعارى اجىراتىلىمدى',
'show-big-image-thumb' => '<small>قاراپ شىعۋ مولشەرى: $1 × $2 نۇكتە</small>',
diff --git a/languages/messages/MessagesKk_cyrl.php b/languages/messages/MessagesKk_cyrl.php
index cc90e913..61f1d13b 100644
--- a/languages/messages/MessagesKk_cyrl.php
+++ b/languages/messages/MessagesKk_cyrl.php
@@ -84,7 +84,7 @@ $namespaceAliases = array(
'ارنايى' => NS_SPECIAL,
'تالقىلاۋ' => NS_TALK,
'قاتىسۋشى' => NS_USER,
- 'قاتىسۋشى_تالقىلاۋى'=> NS_USER_TALK,
+ 'قاتىسۋشى_تالقىلاۋى' => NS_USER_TALK,
'$1_تالقىلاۋى' => NS_PROJECT_TALK,
'سۋرەت' => NS_FILE,
'سۋرەت_تالقىلاۋى' => NS_FILE_TALK,
@@ -137,9 +137,9 @@ $dateFormats = array(
'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
'persian time' => 'H:i',
- 'persian date' => 'xij xiF xiY',
+ 'persian date' => 'xij xiF xiY',
'persian both' => 'xij xiF xiY, H:i',
-
+
'hebrew time' => 'H:i',
'hebrew date' => 'xjj xjF xjY',
'hebrew both' => 'H:i, xjj xjF xjY',
@@ -374,8 +374,7 @@ $messages = array(
'tog-editsection' => 'Бөлімдерді [өңдеу] ÑілтемеÑімен өңдеуін қоÑ',
'tog-editsectiononrightclick' => 'Бөлім тақырыбын оң нұқумен өңдеуін Ò›Ð¾Ñ (JavaScript)',
'tog-showtoc' => 'Мазмұнын көрÑет (3-тен арта бөлімі барыларға)',
-'tog-rememberpassword' => 'Кіргенімді оÑÑ‹ компьютерде ұмытпа',
-'tog-editwidth' => 'КіріÑтіру орны толық енімен',
+'tog-rememberpassword' => 'Кіргенімді оÑÑ‹ компьютерде ұмытпа (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Мен баÑтаған беттерді бақылау тізіміме Ò¯Ñте',
'tog-watchdefault' => 'Мен өңдеген беттерді бақылау тізіміме Ò¯Ñте',
'tog-watchmoves' => 'Мен жылжытқан беттерді бақылау тізіміме Ò¯Ñте',
@@ -506,30 +505,19 @@ $messages = array(
'faqpage' => 'Project:Жиі қойылған Ñауалдар',
# Vector skin
-'vector-action-addsection' => 'Тақырып қоÑу',
-'vector-action-delete' => 'Жою',
-'vector-action-move' => 'Жылжыту',
-'vector-action-protect' => 'Қорғау',
-'vector-action-undelete' => 'Жоймау',
-'vector-action-unprotect' => 'Қорғамау',
-'vector-namespace-category' => 'Санат',
-'vector-namespace-help' => 'Ðнықтама',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Бет',
-'vector-namespace-media' => 'ТаÑпа беті',
-'vector-namespace-mediawiki' => 'Хабар',
-'vector-namespace-project' => 'Жоба беті',
-'vector-namespace-special' => 'Ðрнайы бет',
-'vector-namespace-talk' => 'Талқылау',
-'vector-namespace-template' => 'Үлгі',
-'vector-namespace-user' => 'Жеке бет',
-'vector-view-create' => 'БаÑтау',
-'vector-view-edit' => 'Өңдеу',
-'vector-view-history' => 'Тарихы',
-'vector-view-view' => 'Оқу',
-'vector-view-viewsource' => 'Қайнар көзін қарау',
-'actions' => 'Әрекеттер',
-'namespaces' => 'ЕÑім аÑлары',
+'vector-action-addsection' => 'Тақырып қоÑу',
+'vector-action-delete' => 'Жою',
+'vector-action-move' => 'Жылжыту',
+'vector-action-protect' => 'Қорғау',
+'vector-action-undelete' => 'Жоймау',
+'vector-action-unprotect' => 'Қорғамау',
+'vector-view-create' => 'БаÑтау',
+'vector-view-edit' => 'Өңдеу',
+'vector-view-history' => 'Тарихы',
+'vector-view-view' => 'Оқу',
+'vector-view-viewsource' => 'Қайнар көзін қарау',
+'actions' => 'Әрекеттер',
+'namespaces' => 'ЕÑім аÑлары',
'errorpagetitle' => 'Қателік',
'returnto' => '$1 дегенге қайта келу.',
@@ -743,7 +731,7 @@ $2',
'yourname' => 'ҚатыÑушы атыңыз:',
'yourpassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңіз:',
'yourpasswordagain' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайталаңыз:',
-'remembermypassword' => 'Менің кіргенімді бұл компьютерде ұмытпа',
+'remembermypassword' => 'Менің кіргенімді бұл компьютерде ұмытпа (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Желі үйшігіңіз:',
'externaldberror' => 'ОÑÑ‹ арада не шеттік раÑтау дерекқорында қате болды, немеÑе шеттік тіркелгіңізді жаңалау Ñ€Ò±Ò›Ñаты жоқ.',
'login' => 'Кіру',
@@ -924,7 +912,7 @@ IP мекенжайыңыз бұл беттің түзету тарихында
'usercsspreview' => "'''Мынау CSS мәтінін тек қарап шығу екенін ұмытпаңыз, ол әлі Ñақталған жоқ!'''",
'userjspreview' => "'''Мынау JavaScript қатыÑушы бағдарламаÑын текÑеру/қарап шығу екенін ұмытпаңыз, ол әлі Ñақталған жоқ!'''",
'userinvalidcssjstitle' => "'''Құлақтандыру:''' ОÑÑ‹ арада «$1» деген еш мәнер жоқ.
-ҚатыÑушының .css және .js файл атауы кіші әріпппен жазылу тиіÑÑ‚Ñ– екенін ұмытпаңыз, мыÑалға {{ns:user}}:Foo/monobook.css дегенді {{ns:user}}:Foo/Monobook.css дегенмен ÑалыÑтырып қараңыз.",
+ҚатыÑушының .css және .js файл атауы кіші әріпппен жазылу тиіÑÑ‚Ñ– екенін ұмытпаңыз, мыÑалға {{ns:user}}:Foo/vector.css дегенді {{ns:user}}:Foo/Vector.css дегенмен ÑалыÑтырып қараңыз.",
'updated' => '(Жаңартылған)',
'note' => "'''Ðңғартпа:'''",
'previewnote' => "'''Мынау тек қарап шығу екенін ұмытпаңыз;
@@ -964,9 +952,6 @@ IP мекенжайыңыз бұл беттің түзету тарихында
Егер жазуыңыздың еркін өңделуін қаламаÑаңыз, мында жариÑламауыңыз жөн.<br />
Тағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынаÑынан немеÑе Ñондай ашық қорлардан көшірілгеніне бізге уәде береÑіз (көбірек ақпарат үшін $1 қужатын қараңыз).
'''ÐУТОРЛЫҚ ҚҰҚЫҚПЕРҚОРҒÐУЛЫ ÐœÐҒЛҰМÐТТЫ РҰҚСÐТСЫЗ ЖÐРИЯЛÐÐœÐҢЫЗ!'''",
-'longpagewarning' => "'''ҚҰЛÐҚТÐÐДЫРУ: Бұл беттің мөлшері — $1 kB;
-кейбір шолғыштарда бет мөлшері 32 kB жетÑе не оны аÑÑа өңдеу күрделі болуы мүмкін.
-Бетті бірнеше кішкін бөлімдерге бөліп көріңіз.'''",
'longpageerror' => "'''ÒšÐТЕЛІК: Жөнелтпек мәтініңіздін мөлшері — $1 KB, ең көбі $2 KB Ñ€Ò±Ò›Ñат етілген мөлшерінен аÑқан.
Бұл Ñақтай алынбайды.'''",
'readonlywarning' => "'''ҚҰЛÐҚТÐÐДЫРУ: Дерекқор баптау үшін құлыпталған, Ñондықтан дәл қазір өңдемеңізді Ñақтай алмайÑыз.
@@ -1360,11 +1345,7 @@ $3 келтірілген Ñебебі: ''$2''",
'recentchanges-legend' => 'Жуықтағы өзгеріÑтер баптаулары',
'recentchangestext' => 'Бұл бетте оÑÑ‹ уикидегі болған жуықтағы өзгеріÑтер байқалады.',
'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең Ñоңғы өзгеріÑтер қадағаланады.',
-'recentchanges-label-legend' => 'Шартты белгілер: $1',
-'recentchanges-legend-newpage' => '$1 - жаңа бет',
-'recentchanges-legend-minor' => '$1 - шағын өңдеме',
'recentchanges-label-minor' => 'Бұл шағын өңдеме',
-'recentchanges-legend-bot' => '$1 - бот өңдемеÑÑ–',
'rcnote' => "$3 кезіне дейін — төменде Ñоңғы {{PLURAL:$2|күндегі|'''$2''' күндегі}}, Ñоңғы '''$1''' Ó©Ð·Ð³ÐµÑ€Ñ–Ñ ÐºÓ©Ñ€Ñетіледі.",
'rcnotefrom' => "'''$2''' кезінен бері — төменде '''$1''' жеткенше дейін өзгеріÑтер көрÑетіледі.",
'rclistfrom' => '$1 кезінен бері — жаңа өзгеріÑтерді көрÑет.',
@@ -1461,7 +1442,6 @@ $3 келтірілген Ñебебі: ''$2''",
'fileexists-shared-forbidden' => 'ОÑылай аталған файл ортақ қоймада алдақашан бар;
кері қайтыңыз да, оÑÑ‹ файлды жаңа атымен қотарып беріңіз. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Бұл файл келеÑÑ– {{PLURAL:$1|файлдың|файлдарының}} телнұÑқаÑÑ‹:',
-'successfulupload' => 'Сәтті қотарып берілді',
'uploadwarning' => 'Қотарып беру жөнінде құлақтандыру',
'savefile' => 'Файлды Ñақтау',
'uploadedimage' => '«[[$1]]» файлын қотарып берді',
@@ -1482,6 +1462,7 @@ $3 келтірілген Ñебебі: ''$2''",
Қолайлы болуы үшін бұл файлдың жою журналы келтірілген:",
'filename-bad-prefix' => "Қотарып бермек файлыңыздың атауы '''«$1» ''' деп баÑталады, мынадай ÑипаттауÑыз атауды әдетте Ñандық камералар өздіктік береді.
Файлыңызға Ñипаттылау атауды таңдаңыз.",
+'upload-success-subj' => 'Сәтті қотарып берілді',
'upload-proto-error' => 'Ð‘Ò±Ñ€Ñ‹Ñ Ñ…Ð°Ñ‚Ñ‚Ð°Ð¼Ð°',
'upload-proto-error-text' => 'Шеттен қотарып беру үшін URL жайлары <code>http://</code> немеÑе <code>ftp://</code> дегендерден баÑталу жөн.',
@@ -1777,7 +1758,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Бақылау тізімі',
'mywatchlist' => 'Бақылауым',
-'watchlistfor' => "('''$1''' бақылаулары)",
'nowatchlist' => 'Бақылау тізіміңізде еш дана жоқ',
'watchlistanontext' => 'Бақылау тізіміңіздегі даналарды қарау, не өңдеу үшін $1 керек.',
'watchnologin' => 'КірмегенÑіз',
@@ -1893,7 +1873,9 @@ $NEWPAGE
'revertpage' => '[[{{#special:Contributions}}/$2|$2]] ([[{{ns:user_talk}}:$2|талқылауы]]) өңдемелерінен [[{{ns:user}}:$1|$1]] Ñоңғы нұÑқаÑына қайтарды',
'rollback-success' => '$1 өңдемелерінен қайтарған;
$2 Ñоңғы нұÑқаÑына өзгертті.',
-'sessionfailure' => 'Кіру ÑеÑÑиÑÑында шатақ болған ÑиÑқты;
+
+# Edit tokens
+'sessionfailure' => 'Кіру ÑеÑÑиÑÑында шатақ болған ÑиÑқты;
ÑеÑÑиÑға шабуылдаудардан қорғану үшін, оÑÑ‹ әрекет тоқтатылды.
«Ðртқа» дегенді баÑыңыз, және бетті қайта жүктеңіз де, қайта байқап көріңіз.',
@@ -2076,7 +2058,6 @@ $1',
'ipb-edit-dropdown' => 'Бұғаттау Ñебептерін өңдеу',
'ipb-unblock-addr' => '$1 дегенді бұғаттамау',
'ipb-unblock' => 'ҚатыÑушы атын немеÑе IP мекенжайын бұғаттамау',
-'ipb-blocklist-addr' => '$1 үшін бар бұғаттауларды қарау',
'ipb-blocklist' => 'Бар бұғаттауларды қарау',
'unblockip' => 'ҚатыÑушыны бұғаттамау',
'unblockiptext' => 'Төмендегі пішінді алдындағы IP мекенжайымен не атымен бұғатталған қатыÑушыға жазу қатынауын қалпына келтіріуі үшін қолданыңыз.',
@@ -2469,9 +2450,9 @@ $1',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3 бет',
'file-info' => 'Файл мөлшері: $1, MIME түрі: $2',
-'file-info-size' => '($1 × $2 нүкте, файл мөлшері: $3, MIME түрі: $4)',
+'file-info-size' => '$1 × $2 нүкте, файл мөлшері: $3, MIME түрі: $4',
'file-nohires' => '<small>Жоғары ажыратылымдығы жетімÑіз.</small>',
-'svg-long-desc' => '(SVG файлы, кеÑімді $1 × $2 нүкте, файл мөлшері: $3)',
+'svg-long-desc' => 'SVG файлы, кеÑімді $1 × $2 нүкте, файл мөлшері: $3',
'show-big-image' => 'Жоғары ажыратылымды',
'show-big-image-thumb' => '<small>Қарап шығу мөлшері: $1 × $2 нүкте</small>',
diff --git a/languages/messages/MessagesKk_latn.php b/languages/messages/MessagesKk_latn.php
index 92d7ea00..e45b4473 100644
--- a/languages/messages/MessagesKk_latn.php
+++ b/languages/messages/MessagesKk_latn.php
@@ -88,7 +88,7 @@ $namespaceAliases = array(
'ارنايى' => NS_SPECIAL,
'تالقىلاۋ' => NS_TALK,
'قاتىسۋشى' => NS_USER,
- 'قاتىسۋشى_تالقىلاۋى'=> NS_USER_TALK,
+ 'قاتىسۋشى_تالقىلاۋى' => NS_USER_TALK,
'$1_تالقىلاۋى' => NS_PROJECT_TALK,
'سۋرەت' => NS_FILE,
'سۋرەت_تالقىلاۋى' => NS_FILE_TALK,
@@ -141,9 +141,9 @@ $dateFormats = array(
'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
'persian time' => 'H:i',
- 'persian date' => 'xij xiF xiY',
+ 'persian date' => 'xij xiF xiY',
'persian both' => 'xij xiF xiY, H:i',
-
+
'hebrew time' => 'H:i',
'hebrew date' => 'xjj xjF xjY',
'hebrew both' => 'H:i, xjj xjF xjY',
@@ -377,8 +377,7 @@ $messages = array(
'tog-editsection' => 'Bölimderdi [öñdew] siltemesimen öñdewin qos',
'tog-editsectiononrightclick' => 'Bölim taqırıbın oñ nuqwmen öñdewin qos (JavaScript)',
'tog-showtoc' => 'Mazmunın körset (3-ten arta bölimi barılarğa)',
-'tog-rememberpassword' => 'Kirgenimdi osı komp′ywterde umıtpa',
-'tog-editwidth' => 'Kiristirw ornı tolıq enimen',
+'tog-rememberpassword' => 'Kirgenimdi osı komp′ywterde umıtpa (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Men bastağan betterdi baqılaw tizimime üste',
'tog-watchdefault' => 'Men öñdegen betterdi baqılaw tizimime üste',
'tog-watchmoves' => 'Men jıljıtqan betterdi baqılaw tizimime üste',
@@ -718,7 +717,7 @@ Jaña tirkelgiñiz jasaldı.
'yourname' => 'Qatıswşı atıñız:',
'yourpassword' => 'Qupïya söziñiz:',
'yourpasswordagain' => 'Qupïya sözdi qaýtalañız:',
-'remembermypassword' => 'Meniñ kirgenimdi bul komp′ywterde umıtpa',
+'remembermypassword' => 'Meniñ kirgenimdi bul komp′ywterde umıtpa (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Jeli üýşigiñiz:',
'externaldberror' => 'Osı arada ne şettik rastaw derekqorında qate boldı, nemese şettik tirkelgiñizdi jañalaw ruqsatı joq.',
'login' => 'Kirw',
@@ -898,7 +897,7 @@ Eger siz tirkelgisiz qatıswşı bolsañız jäne sizge qatıssız mändemeler j
'usercsspreview' => "'''Mınaw CSS mätinin tek qarap şığw ekenin umıtpañız, ol äli saqtalğan joq!'''",
'userjspreview' => "'''Mınaw JavaScript qatıswşı bağdarlamasın tekserw/qarap şığw ekenin umıtpañız, ol äli saqtalğan joq!'''",
'userinvalidcssjstitle' => "'''Qulaqtandırw:''' Osı arada «$1» degen eş mäner joq.
-Qatıswşınıñ .css jäne .js faýl atawı kişi äripppen jazılw tïisti ekenin umıtpañız, mısalğa {{ns:user}}:Foo/monobook.css degendi {{ns:user}}:Foo/Monobook.css degenmen salıstırıp qarañız.",
+Qatıswşınıñ .css jäne .js faýl atawı kişi äripppen jazılw tïisti ekenin umıtpañız, mısalğa {{ns:user}}:Foo/vector.css degendi {{ns:user}}:Foo/Vector.css degenmen salıstırıp qarañız.",
'updated' => '(Jañartılğan)',
'note' => "'''Añğartpa:'''",
'previewnote' => "'''Mınaw tek qarap şığw ekenin umıtpañız;
@@ -938,9 +937,6 @@ Tağı da, bul mağlumat öziñiz jazğanıñızğa, ne qoğam qazınasınan nem
Eger jazwıñızdıñ erkin öñdelwin qalamasañız, mında jarïyalamawıñız jön.<br />
Tağı da, bul mağlumat öziñiz jazğanıñızğa, ne qoğam qazınasınan nemese sondaý aşıq qorlardan köşirilgenine bizge wäde beresiz (köbirek aqparat üşin $1 qwjatın qarañız).
'''AWTORLIQ QUQIQPEN QORÄžAWLI MAÄžLUMATTI RUQSATSIZ JARÃYALAMAÑIZ!'''",
-'longpagewarning' => "'''QULAQTANDIRW: Bul bettiñ mölşeri — $1 kB;
-keýbir şolğıştarda bet mölşeri 32 kB jetse ne onı assa öñdew kürdeli bolwı mümkin.
-Betti birneşe kişkin bölimderge bölip köriñiz.'''",
'longpageerror' => "'''QATELİK: Jöneltpek mätiniñizdin mölşeri — $1 KB, eñ köbi $2 KB ruqsat etilgen mölşerinen asqan.
Bul saqtaý alınbaýdı.'''",
'readonlywarning' => "'''QULAQTANDIRW: Derekqor baptaw üşin qulıptalğan, sondıqtan däl qazir öñdemeñizdi saqtaý almaýsız.
@@ -1426,7 +1422,6 @@ keri qaýtıñız da, osı faýldı jaña atımen qotarıp beriñiz. [[File:$1|t
'fileexists-shared-forbidden' => 'Osılaý atalğan faýl ortaq qoýmada aldaqaşan bar;
keri qaýtıñız da, osı faýldı jaña atımen qotarıp beriñiz. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Bul faýl kelesi {{PLURAL:$1|faýldıñ|faýldarınıñ}} telnusqası:',
-'successfulupload' => 'Sätti qotarıp berildi',
'uploadwarning' => 'Qotarıp berw jöninde qulaqtandırw',
'savefile' => 'Faýldı saqtaw',
'uploadedimage' => '«[[$1]]» faýlın qotarıp berdi',
@@ -1447,6 +1442,7 @@ Bul faýldı qotarıp berwin jalğastırw üşin bunıñ ıñğaýlığın tekse
Qolaýlı bolwı üşin bul faýldıñ joyw jwrnalı keltirilgen:",
'filename-bad-prefix' => "Qotarıp bermek faýlıñızdıñ atawı '''«$1» ''' dep bastaladı, mınadaý sïpattawsız atawdı ädette sandıq kameralar özdiktik beredi.
Faýlıñızğa sïpattılaw atawdı tañdañız.",
+'upload-success-subj' => 'Sätti qotarıp berildi',
'upload-proto-error' => 'Burıs xattama',
'upload-proto-error-text' => 'Şetten qotarıp berw üşin URL jaýları <code>http://</code> nemese <code>ftp://</code> degenderden bastalw jön.',
@@ -1742,7 +1738,6 @@ Qatıswşı baptawıñızda engizgen e-poşta mekenjaýıñız «Kimnen» degen
# Watchlist
'watchlist' => 'Baqılaw tizimi',
'mywatchlist' => 'Baqılawım',
-'watchlistfor' => "('''$1''' baqılawları)",
'nowatchlist' => 'Baqılaw tizimiñizde eş dana joq',
'watchlistanontext' => 'Baqılaw tizimiñizdegi danalardı qaraw, ne öñdew üşin $1 kerek.',
'watchnologin' => 'Kirmegensiz',
@@ -1858,7 +1853,9 @@ soñğı öñdemesin [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|talqılawı]])
'revertpage' => '[[{{#special:Contributions}}/$2|$2]] ([[{{ns:user_talk}}:$2|talqılawı]]) öñdemelerinen [[{{ns:user}}:$1|$1]] soñğı nusqasına qaýtardı',
'rollback-success' => '$1 öñdemelerinen qaýtarğan;
$2 soñğı nusqasına özgertti.',
-'sessionfailure' => 'Kirw sessïyasında şataq bolğan sïyaqtı;
+
+# Edit tokens
+'sessionfailure' => 'Kirw sessïyasında şataq bolğan sïyaqtı;
sessïyağa şabwıldawdardan qorğanw üşin, osı äreket toqtatıldı.
«Artqa» degendi basıñız, jäne betti qaýta jükteñiz de, qaýta baýqap köriñiz.',
@@ -2041,7 +2038,6 @@ Buğattardı şolıp şığw üşin [[{{#special:Ipblocklist}}|IP buğattaw tizi
'ipb-edit-dropdown' => 'Buğattaw sebepterin öñdew',
'ipb-unblock-addr' => '$1 degendi buÄŸattamaw',
'ipb-unblock' => 'Qatıswşı atın nemese IP mekenjaýın buğattamaw',
-'ipb-blocklist-addr' => '$1 üşin bar buğattawlardı qaraw',
'ipb-blocklist' => 'Bar buğattawlardı qaraw',
'unblockip' => 'Qatıswşını buğattamaw',
'unblockiptext' => 'Tömendegi pişindi aldındağı IP mekenjaýımen ne atımen buğattalğan qatıswşığa jazw qatınawın qalpına keltiriwi üşin qoldanıñız.',
@@ -2433,9 +2429,9 @@ $1',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3 bet',
'file-info' => 'Faýl mölşeri: $1, MIME türi: $2',
-'file-info-size' => '($1 × $2 nükte, faýl mölşeri: $3, MIME türi: $4)',
+'file-info-size' => '$1 × $2 nükte, faýl mölşeri: $3, MIME türi: $4',
'file-nohires' => '<small>Joğarı ajıratılımdığı jetimsiz.</small>',
-'svg-long-desc' => '(SVG faýlı, kesimdi $1 × $2 nükte, faýl mölşeri: $3)',
+'svg-long-desc' => 'SVG faýlı, kesimdi $1 × $2 nükte, faýl mölşeri: $3',
'show-big-image' => 'Joğarı ajıratılımdı',
'show-big-image-thumb' => '<small>Qarap şığw mölşeri: $1 × $2 nükte</small>',
diff --git a/languages/messages/MessagesKl.php b/languages/messages/MessagesKl.php
index 82b6e775..f8870723 100644
--- a/languages/messages/MessagesKl.php
+++ b/languages/messages/MessagesKl.php
@@ -19,18 +19,18 @@ $namespaceNames = array(
NS_SPECIAL => 'Immikkut',
NS_TALK => 'Oqallinneq',
NS_USER => 'Atuisoq',
- NS_USER_TALK => 'Atuisup oqalliffia',
- NS_PROJECT_TALK => '$1-p oqalliffia',
+ NS_USER_TALK => 'Atuisup_oqalliffia',
+ NS_PROJECT_TALK => '$1-p_oqalliffia',
NS_FILE => 'Fiileq',
- NS_FILE_TALK => 'Fiilip oqalliffia',
+ NS_FILE_TALK => 'Fiilip_oqalliffia',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'Mediawikip oqalliffia',
+ NS_MEDIAWIKI_TALK => 'Mediawikip_oqalliffia',
NS_TEMPLATE => 'Ilisserut',
- NS_TEMPLATE_TALK => 'Ilisserummi oqallinneq',
+ NS_TEMPLATE_TALK => 'Ilisserummi_oqallinneq',
NS_HELP => 'Ikiuutit',
- NS_HELP_TALK => 'Ikiuutini oqallinneq',
- NS_CATEGORY => 'Sumut atassuseq',
- NS_CATEGORY_TALK => 'Sumut atassusermi oqallinneq',
+ NS_HELP_TALK => 'Ikiuutini_oqallinneq',
+ NS_CATEGORY => 'Sumut_atassuseq',
+ NS_CATEGORY_TALK => 'Sumut_atassusermi_oqallinneq',
);
$namespaceAliases = array(
@@ -220,7 +220,7 @@ $messages = array(
'yourname' => 'Atuisutut atit',
'yourpassword' => 'Isissutissaq:',
'yourpasswordagain' => 'Isissutissaq allaqqiguk',
-'remembermypassword' => 'Iserfiga tullissaanut eqqaamalara',
+'remembermypassword' => 'Iserfiga tullissaanut eqqaamalara (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Iserit',
'nav-login-createaccount' => 'Konto-mik pilersitsigit imalt. iserit',
'loginprompt' => 'Pisariaqassaaq cookies-itit atussallugit {{SITENAME}} -mut isissaguit.',
@@ -338,31 +338,27 @@ Peersinermut nuutsinermullu nalunaarsuutit ataani takuneqarsinnaapput.',
'group-sysop' => 'Administratorit',
# Recent changes
-'recentchanges' => 'Allannguutit kingulliit',
-'recentchanges-legend' => 'Inissisimaffiit allannguutini kingullerni',
-'recentchangestext' => "Uani quppernermi '''{{SITENAME}}'''-mi allannguutit kingulliit malinnaavigisinnaavatit.",
-'recentchanges-label-legend' => 'Nassuiaatit: $1.',
-'recentchanges-legend-newpage' => '$1 - qupperneq nutaaq',
-'recentchanges-label-newpage' => 'Tassaavoq qupperneq nutaaq',
-'recentchanges-legend-minor' => '$1 - allannguut annikitsoq',
-'recentchanges-label-minor' => 'Tassaavoq allannguut annikitsoq',
-'recentchanges-legend-bot' => '$1 - bot-ip allannguutaa',
-'recentchanges-label-bot' => 'Bot-ip allannguutaa',
-'rclistfrom' => 'Allannguutit kingulliit takukkit $1 -nngaanniit',
-'rcshowhideminor' => '$1 allannguutit annikitsut',
-'rcshowhidebots' => '$1 robottit',
-'rcshowhideliu' => '$1 atuisut nalunaarsimasut',
-'rcshowhideanons' => '$1 atuisut anonymejusut',
-'rcshowhidepatr' => '$1 allannguutit misissorneqarsimasut',
-'rcshowhidemine' => '$1 nammineq tapit',
-'rclinks' => 'Takutikkit $1 -it allannguutit kingulliit ulluni kingullerni $2 -ni<br />$3',
-'diff' => 'assigiinng',
-'hist' => 'oqalutt',
-'hide' => 'Assequt',
-'show' => 'Saqqummiuk',
-'minoreditletter' => 'm',
-'newpageletter' => 'N',
-'boteditletter' => 'b',
+'recentchanges' => 'Allannguutit kingulliit',
+'recentchanges-legend' => 'Inissisimaffiit allannguutini kingullerni',
+'recentchangestext' => "Uani quppernermi '''{{SITENAME}}'''-mi allannguutit kingulliit malinnaavigisinnaavatit.",
+'recentchanges-label-newpage' => 'Tassaavoq qupperneq nutaaq',
+'recentchanges-label-minor' => 'Tassaavoq allannguut annikitsoq',
+'recentchanges-label-bot' => 'Bot-ip allannguutaa',
+'rclistfrom' => 'Allannguutit kingulliit takukkit $1 -nngaanniit',
+'rcshowhideminor' => '$1 allannguutit annikitsut',
+'rcshowhidebots' => '$1 robottit',
+'rcshowhideliu' => '$1 atuisut nalunaarsimasut',
+'rcshowhideanons' => '$1 atuisut anonymejusut',
+'rcshowhidepatr' => '$1 allannguutit misissorneqarsimasut',
+'rcshowhidemine' => '$1 nammineq tapit',
+'rclinks' => 'Takutikkit $1 -it allannguutit kingulliit ulluni kingullerni $2 -ni<br />$3',
+'diff' => 'assigiinng',
+'hist' => 'oqalutt',
+'hide' => 'Assequt',
+'show' => 'Saqqummiuk',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
# Recent changes linked
'recentchangeslinked' => 'Allannguutit naleqqiussat',
diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php
index 1b97c7c9..ef6f90a7 100644
--- a/languages/messages/MessagesKm.php
+++ b/languages/messages/MessagesKm.php
@@ -11,6 +11,7 @@
* @author Chhorran
* @author Kiensvay
* @author Lovekhmer
+ * @author Sovichet
* @author T-Rithy
* @author Thearith
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
@@ -34,8 +35,8 @@ $namespaceNames = array(
NS_TEMPLATE_TALK => 'ការពិភាក្សាអំពីទំពáŸážšáž‚ំរូ',
NS_HELP => 'ជំនួយ',
NS_HELP_TALK => 'ការពិភាក្សាអំពីជំនួយ',
- NS_CATEGORY => 'ចំនាážáŸ‹ážáŸ’នាក់ក្រុម',
- NS_CATEGORY_TALK => 'ការពិភាក្សាអំពីចំនាážáŸ‹ážáŸ’នាក់ក្រុម',
+ NS_CATEGORY => 'ចំណាážáŸ‹ážáŸ’នាក់ក្រុម',
+ NS_CATEGORY_TALK => 'ការពិភាក្សាអំពីចំណាážáŸ‹ážáŸ’នាក់ក្រុម',
);
$namespaceAliases = array(
@@ -54,6 +55,8 @@ $namespaceAliases = array(
'ចំណាážáŸ‹áž€áŸ’រុម' => NS_CATEGORY,
'ការពិភាក្សាអំពីចំណាážáŸ‹ážáŸ’នាក់ក្រុម' => NS_CATEGORY_TALK,
'ចំណាážáŸ‹áž€áŸ’រុម-ពិភាក្សា' => NS_CATEGORY_TALK,
+ 'ចំនាážáŸ‹ážáŸ’នាក់ក្រុម' => NS_CATEGORY,
+ 'ការពិភាក្សាអំពីចំនាážáŸ‹ážáŸ’នាក់ក្រុម' => NS_CATEGORY_TALK,
);
@@ -79,9 +82,9 @@ $datePreferences = array(
'km',
'ISO 8601',
);
-
+
$defaultDateFormat = 'km';
-
+
$dateFormats = array(
'km time' => 'ម៉ោងH:i',
'km date' => 'l ទីd F ឆ្នាំY',
@@ -180,7 +183,7 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#បញ្ជូនបន្áž', '#ប្ដូរទីážáž¶áŸ†áž„ទៅ #ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ', '#ប្ដូរទីážáž¶áŸ†áž„', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„', '#ប្ដូរចំណងជើង', '#REDIRECT' ),
+ 'redirect' => array( '0', '#បញ្ជូនបន្áž', '#ប្ដូរទីážáž¶áŸ†áž„ទៅ', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ', '#ប្ដូរទីážáž¶áŸ†áž„', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„', '#ប្ដូរចំណងជើង', '#REDIRECT' ),
'notoc' => array( '0', '__លាក់មាážáž·áž€áž¶__', '__លាក់បញ្ជីអážáŸ’ážáž”áž‘__', '__គ្មានមាážáž·áž€áž¶__', '__គ្មានបញ្ជីអážáŸ’ážáž”áž‘__', '__កុំបង្ហាញមាážáž·áž€áž¶__', '__NOTOC__' ),
'nogallery' => array( '0', '__លាក់វិចិážáŸ’រសាល__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__បង្ážáŸ†áž˜áž¶ážáž·áž€áž¶__', '__បង្ážáŸ†áž”ញ្ជីអážáŸ’ážáž”áž‘__', '__បង្ážáŸ†áž¢áŸ„យបង្ហាញមាážáž·áž€áž¶__', '__FORCETOC__' ),
@@ -268,8 +271,7 @@ $messages = array(
'tog-editsection' => 'អនុញ្ញាážáž€áŸ‚ប្រែ​ផ្នែកណាមួយ​ážáž¶áž˜â€‹ážáŸ†ážŽáž—្ជាប់[កែប្រែ]',
'tog-editsectiononrightclick' => 'អនុញ្ញាážâ€‹áž€áŸ‚ប្រែ​​ផ្នែកណាមួយ ដោយ​ចុចស្ážáž¶áŸ†áž€ážŽáŸ’ážáž»ážšâ€‹áž›áž¾â€‹áž…ំណងជើង​របស់វា (ážáž˜áŸ’រូវអោយមាន JavaScript)',
'tog-showtoc' => 'បង្ហាញ​ážáž¶ážšáž¶áž„មាážáž·áž€áž¶ (ចំពោះទំពáŸážšâ€‹ážŠáŸ‚លមាន​ចំណងជើងរង​លើសពី៣)',
-'tog-rememberpassword' => 'ចងចាំ​ការកážáŸ‹ážˆáŸ’មោះចូលរបស់ážáŸ’ញុំ​លើកុំព្យូទáŸážšáž“áŸáŸ‡',
-'tog-editwidth' => 'ពង្រីក​ប្រអប់​កែប្រែ​ឱ្យ​បង្ហាញ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់',
+'tog-rememberpassword' => 'ចងចាំ​ការកážáŸ‹ážˆáŸ’មោះចូលរបស់ážáŸ’ញុំ​លើកុំព្យូទáŸážšáž“áŸáŸ‡ (សំរាប់រយៈពáŸáž›áž™áŸ‰áž¶áž„យូរ$1 {{PLURAL:$1|ážáŸ’ងៃ|ážáŸ’ងៃ}})',
'tog-watchcreations' => 'បន្ážáŸ‚ម​ទំពáŸážšâ€‹ážŠáŸ‚áž›ážáŸ’ញុំបង្កើážâ€‹áž‘ៅ​បញ្ជីážáž¶áž˜ážŠáž¶áž“​របស់ážáŸ’ញុំ',
'tog-watchdefault' => 'បន្ážáŸ‚ម​ទំពáŸážšâ€‹ážŠáŸ‚áž›ážáŸ’ញុំកែប្រែ​ទៅ​បញ្ជីážáž¶áž˜ážŠáž¶áž“​របស់ážáŸ’ញុំ',
'tog-watchmoves' => 'បន្ážáŸ‚ម​ទំពáŸážšâ€‹ážŠáŸ‚áž›ážáŸ’ញុំប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„​ទៅ​បញ្ជីážáž¶áž˜ážŠáž¶áž“​របស់ážáŸ’ញុំ',
@@ -414,31 +416,21 @@ $messages = array(
'faqpage' => 'Project:សំណួរដែលសួរញឹកញាប់',
# Vector skin
-'vector-action-addsection' => 'បន្ážáŸ‚ម​ប្រធានបទ​',
-'vector-action-delete' => 'លុបចោល',
-'vector-action-move' => 'ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„',
-'vector-action-protect' => 'ការពារ',
-'vector-action-undelete' => 'ឈប់លុបចោល',
-'vector-action-unprotect' => 'ឈប់ការពារ',
-'vector-namespace-category' => 'ចំណាážáŸ‹ážáŸ’នាក់ក្រុម',
-'vector-namespace-help' => 'ទំពáŸážšáž‡áŸ†áž“ួយ',
-'vector-namespace-image' => 'ឯកសារ',
-'vector-namespace-main' => 'ទំពáŸážš',
-'vector-namespace-media' => 'ទំពáŸážšáž˜áŸážŒáž¶',
-'vector-namespace-mediawiki' => 'សារ',
-'vector-namespace-project' => 'ទំពáŸážšáž‚ម្រោង',
-'vector-namespace-special' => 'ទំពáŸážšáž–ិសáŸážŸ',
-'vector-namespace-talk' => 'ការពិភាក្សា',
-'vector-namespace-template' => 'គំរូ​',
-'vector-namespace-user' => 'ទំពáŸážšâ€‹áž¢áŸ’នកប្រើប្រាស់​',
-'vector-view-create' => 'បង្កើážâ€‹',
-'vector-view-edit' => 'កែប្រែ​',
-'vector-view-history' => 'មើល​ប្រវážáŸ’ážáž·â€‹',
-'vector-view-view' => 'អាន',
-'vector-view-viewsource' => 'មើល​កូដ',
-'actions' => 'សកម្មភាព​',
-'namespaces' => 'ប្រភáŸáž‘',
-'variants' => 'អážáŸážš',
+'vector-action-addsection' => 'បន្ážáŸ‚ម​ប្រធានបទ​',
+'vector-action-delete' => 'លុបចោល',
+'vector-action-move' => 'ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„',
+'vector-action-protect' => 'ការពារ',
+'vector-action-undelete' => 'ឈប់លុបចោល',
+'vector-action-unprotect' => 'ឈប់ការពារ',
+'vector-simplesearch-preference' => 'ប្រើអនុសាសនáŸáž–ាក្យចង់ស្វែងរក (សំរាប់ážáŸ‚សំបក វ៉ិចទáŸážšáž”៉ុណ្ណោះ)',
+'vector-view-create' => 'បង្កើážâ€‹',
+'vector-view-edit' => 'កែប្រែ​',
+'vector-view-history' => 'មើល​ប្រវážáŸ’ážáž·â€‹',
+'vector-view-view' => 'អាន',
+'vector-view-viewsource' => 'មើល​កូដ',
+'actions' => 'សកម្មភាព​',
+'namespaces' => 'ប្រភáŸáž‘',
+'variants' => 'អážáŸážš',
'errorpagetitle' => 'មានបញ្ហា',
'returnto' => 'ážáŸ’រឡប់ទៅ $1 វិញ ។',
@@ -501,6 +493,7 @@ $messages = array(
សូមរង់ចាំមួយភ្លែážážŸáž·áž“រួចសាកល្បងចូលមកកាន់ទំពáŸážšáž“áŸáŸ‡áž¡áž¾áž„វិញ។
$1',
+'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}}',
@@ -661,7 +654,8 @@ $2',
'yourname' => 'អážáŸ’ážáž“ាម៖',
'yourpassword' => 'ពាក្យសំងាážáŸ‹áŸ–',
'yourpasswordagain' => 'វាយពាក្យសំងាážáŸ‹áž˜áŸ’ážáž„ទៀážáŸ–',
-'remembermypassword' => 'ចងចាំកំណážáŸ‹ážˆáŸ’មោះចូលរបស់ážáŸ’ញុំក្នុងកុំព្យូទáŸážšáž“áŸáŸ‡',
+'remembermypassword' => 'ចងចាំកំណážáŸ‹ážˆáŸ’មោះចូលរបស់ážáŸ’ញុំក្នុងកុំព្យូទáŸážšáž“áŸáŸ‡ (សំរាប់រយៈពáŸáž›áž™áž¼ážšáž”ំផុហ$1 {{PLURAL:$1|ážáŸ’ងៃ|ážáŸ’ងៃ}})',
+'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយកáŸážŠáŸ„áž™',
'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
'externaldberror' => 'មាន​​បញ្ហាក្នុងការ​បញ្ជាក់​ផ្ទៀង​ផ្ទាážáŸ‹â€‹â€‹áž˜áž¼áž›ážŠáŸ’ឋាន​ទិន្ននáŸáž™â€‹ ឬ​អ្នក​មិន​ážáŸ’រូវ​បាន​អនុញ្ញាážâ€‹áž²áŸ’យ​បន្ទាន់​សមáŸáž™â€‹áž‚ណនី​ážáž¶áž„​ក្រៅ​របស់​អ្នក​។​
​',
@@ -679,6 +673,7 @@ $2',
'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ សូម'''$1'''។",
'gotaccountlink' => 'កážáŸ‹ážˆáŸ’មោះចូល',
'createaccountmail' => 'ážáž¶áž˜ážšáž™áŸˆáž¢áŸŠáž¸áž˜áŸ‚áž›',
+'createaccountreason' => 'មូលហáŸážáž»áŸ–',
'badretype' => 'ពាក្យសំងាážáŸ‹ážŠáŸ‚លអ្នកបានបញ្ចូលនោះ គឺមិនស៊ីគ្នាទáŸáŸ”',
'userexists' => 'អážáŸ’ážáž“ាមដែលអ្នកបានវាយបញ្ចូលមានគáŸáž”្រើហើយ។
សូមជ្រើសរើសអážáŸ’ážáž“ាមផ្សáŸáž„ពីនáŸáŸ‡áŸ”',
@@ -715,6 +710,7 @@ $2',
សូមព្យាយាម​ម្ážáž„ទៀážáŸ”',
'passwordtooshort' => 'ពាក្យសំងាážáŸ‹ážáŸ’រូវ​មាន​យ៉ាងážáž·áž…ណាស់​ {{PLURAL:$1|១ ážáž½áž¢áž€áŸ’សរ|$1ážáž½áž¢áž€áŸ’សរ}}។',
'password-name-match' => 'ពាក្យសំងាážáŸ‹ážáŸ’រូវážáŸ‚ážáž»ážŸáž‚្នាពីឈ្មោះរបស់អ្នក។',
+'password-login-forbidden' => 'ហាមប្រាមមិនអោយប្រើអážáŸ’ážáž“ាមនិងពាក្យសំងាážáŸ‹áž“áŸáŸ‡áŸ”',
'mailmypassword' => 'ផ្ញើអ៊ីមែលពាក្យសំងាážáŸ‹ážáŸ’មី',
'passwordremindertitle' => 'ពាក្យសំងាážáŸ‹áž”ណ្ážáŸ„ះអាសន្នážáŸ’មីសម្រាប់{{SITENAME}}',
'passwordremindertext' => 'មានអ្នកណាម្នាក់ (ប្រហែលជាអ្នក, ពីអាសយដ្ឋាន IP $1) បានស្នើសុំពាក្យសំងាážáŸ‹ážáŸ’មីមួយពី {{SITENAME}} ($4)។
@@ -761,6 +757,9 @@ $2',
សូមរងចាំមួយរយៈ មុនពáŸáž›ážŸáž¶áž€áž›áŸ’បងម្ដងទៀážáŸ”',
'loginlanguagelabel' => 'ភាសា៖ $1',
+# E-mail sending
+'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន០mail() របស់ PHP',
+
# Password reset dialog
'resetpass' => '​ប្ážáž¼ážšâ€‹áž–ាក្យសំងាážáŸ‹â€‹',
'resetpass_announce' => 'អ្នកបានកážáŸ‹ážˆáŸ’មោះចូលដោយ​អក្សរកូដអ៊ីមែល​បណ្ážáŸ„ះអាសន្ន​មួយ​។
@@ -815,12 +814,13 @@ $2',
'showlivepreview' => 'មើលជាមុនដោយផ្ទាល់',
'showdiff' => 'បង្ហាញ​បំលាស់ប្ដូរ',
'anoneditwarning' => "'''ប្រយáŸážáŸ’áž“ ៖''' អ្នកមិនបានកážáŸ‹ážˆáŸ’មោះចូល​ទáŸáŸ” អាសយដ្ឋានIPរបស់អ្នក​នឹងážáŸ’រូវបាន​កážáŸ‹ážáŸ’រាទុក​ក្នុងប្រវážáŸ’ážáž·áž€áŸ‚ប្រែ​នៃទំពáŸážšâ€‹áž“áŸáŸ‡áŸ”",
+'anonpreviewwarning' => "''អ្នកមិនបានកážáŸ‹ážˆáŸ’មោះចូល​ទáŸáŸ” ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងážáŸ’រូវបាន​កážáŸ‹ážáŸ’រាទុក​ក្នុងប្រវážáŸ’ážáž·áž€áŸ‚ប្រែ​នៃទំពáŸážšâ€‹áž“áŸáŸ‡áŸ”''",
'missingsummary' => "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនáŸáŸ‡áž‘áŸáŸ”
បើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀážáž“ោះកំណែប្រែរបស់អ្នកនឹងážáŸ’រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
'missingcommenttext' => 'សូមបញ្ចូលមួយវិចារនៅážáž¶áž„ក្រោម។',
'missingcommentheader' => "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ឱ្យនូវ ប្រធានបទ/ចំណងជើង របស់វិចារនáŸáŸ‡áž‘áŸáŸ”
-បើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀážáž“ោះកំណែប្រែរបស់អ្នកនឹងážáŸ’រូវរក្សាទុកដោយគ្មានវា។",
+បើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀážáž“ោះកំណែប្រែរបស់អ្នកនឹងážáŸ’រូវរក្សាទុកដោយគ្មានវា។",
'summary-preview' => 'ការមើលជាមុនរបស់ចំណារពន្យល់:',
'subject-preview' => 'ការមើលជាមុនរបស់ប្រធានបទ/ចំណងជើង:',
'blockedtitle' => 'អ្នកប្រើនáŸáŸ‡ážáŸ’រូវបានរាំងážáŸ’ទប់ហើយ',
@@ -907,7 +907,11 @@ $2',
'usercsspreview' => "'''កុំភ្លáŸáž…ážáž¶â€‹áž¢áŸ’នកគ្រាន់ážáŸ‚​កំពុងមើលជាមុនសន្លឹក CSS របស់អ្នក។
វាមិនទាន់​ážáŸ’រូវបានរក្សាទុកទáŸ!'''",
'userjspreview' => "'កុំភ្លáŸáž…ážáž¶áž¢áŸ’នកគ្រាន់ážáŸ‚កំពុង ធ្វើážáŸážŸáŸ’áž/មើលមុន ទំពáŸážšáž¢áŸ’នកប្រើប្រាស់ JavaScript របស់អ្នក។ វាមិនទាន់ážáŸ’រូវបានរក្សាទុកទáŸ!'''",
-'userinvalidcssjstitle' => "'''ប្រយáŸážáŸ’ន៖''' គ្មានសំបក \"\$1\"។ ចងចាំážáž¶ ទំពáŸážšáž•áŸ’ទាល់ážáŸ’លួន .css áž“áž·áž„ .js ប្រើប្រាស់ ចំណងជើង ជាអក្សរážáž¼áž…, ឧទាហរណ០{{ns:user}}:Foo/monobook.css ážáŸ’រឹមážáŸ’រូវ, រីឯ {{ns:user}}:Foo/Monobook.css មិនážáŸ’រឹមážáŸ’រូវ។",
+'sitecsspreview' => '"កុំភ្លáŸáž…ážáž¶áž¢áŸ’នកកំពុងážáŸ‚មើលមុន CSS áž“áŸáŸ‡áž”៉ុណ្ណោះ។"
+"វាមិនទាន់ážáŸ’រូវបានរក្សាទុកទáŸ!"',
+'sitejspreview' => '"កុំភ្លáŸáž…ážáž¶áž¢áŸ’នកកំពុងážáŸ‚មើលមុន កូដJavaScript áž“áŸáŸ‡áž”៉ុណ្ណោះ។"
+"វាមិនទាន់ážáŸ’រូវបានរក្សាទុកទáŸ!"',
+'userinvalidcssjstitle' => "'''ប្រយáŸážáŸ’ន៖''' គ្មានសំបក \"\$1\"។ ចងចាំážáž¶ ទំពáŸážšáž•áŸ’ទាល់ážáŸ’លួន .css áž“áž·áž„ .js ប្រើប្រាស់ ចំណងជើង ជាអក្សរážáž¼áž…, ឧទាហរណ០{{ns:user}}:Foo/vector.css ážáŸ’រឹមážáŸ’រូវ, រីឯ {{ns:user}}:Foo/Vector.css មិនážáŸ’រឹមážáŸ’រូវ។",
'updated' => '(បានបន្ទាន់សមáŸáž™)',
'note' => "'''ចំណាំ៖'''",
'previewnote' => "'''áž“áŸáŸ‡áž‚្រាន់ážáŸ‚ជា​ការបង្ហាញការមើលជាមុនប៉ុណ្ណោះ។ បំលាស់ប្ដូរ​មិនទាន់បាន​រក្សាទុកទáŸ!'''",
@@ -947,9 +951,6 @@ $2',
អ្នកážáŸ’រូវសន្យាážáž¶ ​អ្នកសរសáŸážšážœáž¶â€‹ážŠáŸ„áž™ážáŸ’លួនអ្នក ឬបានចម្លងវា​ពី​កម្មសិទ្ធិសាធារណៈឬពីប្រភពសáŸážšáž¸ (សូមមើល $1សំរាប់ពáŸážáŸŒáž˜áž¶áž“លំអិáž)។
'''មិនážáŸ’រូវ​ដាក់ស្នើ​ការងារមានជាប់កម្មសិទ្ឋិបញ្ញាដោយគ្មានការអនុញ្ញាážáž‘áŸ!'''",
-'longpagewarning' => "'''ប្រយáŸážáŸ’áž“ ៖ ទំពáŸážšáž“áŸáŸ‡áž˜áž¶áž“ទំហំ $1 គីឡូបៃ។ ឧបករណáŸážšáž¶ážœážšáž€(browser)ážáŸ’លះអាចមានបញ្ហាក្នុងការកែប្រែទំពáŸážšáž€áŸ’បែរឬធំជាង៣២គីឡូបៃ​។
-
-សូមពិចារណាអំពីលទ្ឋភាពបំបែកទំពáŸážšáž‡áž¶áž•áŸ’នែកážáž¼áž…ៗ ។ '''",
'longpageerror' => "'''បញ្ហា៖ អážáŸ’ážáž”ទ​ដែល​អ្នក​បានដាក់​ស្នើ​មានទំហំ $1 គីឡូបៃ ដែលធំជាង​ទំហំអážáž·áž”រមា $2 គីឡូបៃ។ អážáŸ’ážáž”áž‘áž“áŸáŸ‡â€‹áž˜áž·áž“អាច​រក្សាទុកបានទáŸáŸ”'''",
'readonlywarning' => "'''ប្រយáŸážáŸ’áž“:មូលដ្ឋានទិន្ននáŸáž™ážáŸ’រូវបានចាក់សោសម្រាប់ការរក្សាទុក ដូច្នáŸáŸ‡áž¢áŸ’នកនឹងមិនអាចរក្សាទុករាល់កំណែប្រែរបស់អ្នកបានទáŸáž¥áž¡áž¼ážœáž“áŸáŸ‡áŸ” សូមអ្នកចម្លងអážáŸ’ážáž”áž‘ រួចដាក់ទៅក្នុងឯកសារដែលជាអážáŸ’ážáž”áž‘ ហើយបន្ទាប់មករក្សាវាទុកនៅពáŸáž›áž€áŸ’រោយ។'''
@@ -1115,6 +1116,8 @@ $1",
'logdelete-failure' => "'''មិន​អាចកំណážáŸ‹áž‚ំហើញនៃ​កំណážáŸ‹â€‹áž áŸážáž»â€‹â€‹áž”ាន​៖'''
$1",
'revdel-restore' => 'ផ្លាស់ប្ដូរគំហើញ',
+'revdel-restore-deleted' => 'កំណែដែលážáŸ’រូវបានលុប',
+'revdel-restore-visible' => 'កំណែដែលអាលមើលឃើញ',
'pagehist' => 'ប្រវážáŸ’ážáž·áž‘ំពáŸážš',
'deletedhist' => 'ប្រវážáŸ’ážáž·ážŠáŸ‚áž›ážáŸ’រូវបានលុប',
'revdelete-content' => 'ážáŸ’លឹមសារ',
@@ -1181,11 +1184,12 @@ $1",
# Diffs
'history-title' => 'ប្រវážáŸ’ážáž·áž€áŸ†ážŽáŸ‚ប្រែនានានៃ "$1"',
'difference' => '(ប្រៀបធៀបកំណែនានា)',
+'difference-multipage' => '(ភាពážáž»ážŸáž‚្នារវាងទំពáŸážšáž“ានា)',
'lineno' => 'បន្ទាážáŸ‹áž‘ី$1៖',
'compareselectedversions' => 'ប្រៀបធៀប​កំណែដែលបាន​ជ្រើសយក',
'showhideselectedversions' => 'បង្ហាញ​/លាក់​កំណែប្រែ​ដែលបាន​ជ្រើសយក',
'editundo' => 'មិនធ្វើវិញ',
-'diff-multi' => '({{PLURAL:$1|កំណែប្រែកម្រិážáž”ង្គួរមួយ|កំណែប្រែកម្រិážáž”ង្គួរចំនួន$1}}មិនážáŸ’រូវបានបង្ហាញ)',
+'diff-multi' => '({{PLURAL:$1|កំណែប្រែកម្រិážáž”ង្គួរមួយ|កំណែប្រែកម្រិážáž”ង្គួរចំនួន $1}}មិនážáŸ’រូវបានបង្ហាញ)',
# Search results
'searchresults' => 'លទ្ធផលស្វែងរក',
@@ -1220,6 +1224,7 @@ $1",
'searchprofile-everything-tooltip' => 'ស្វែងរកក្នុងážáŸ’លឹមសារទាំងអស់(រួមបញ្ចូលទាំងទំពáŸážšáž–ិភាក្សា)',
'searchprofile-advanced-tooltip' => 'ស្វែងរកក្នុងប្រភáŸáž‘កំនážáŸ‹ážŠáŸ„យអ្នកប្រើប្រាស់',
'search-result-size' => '$1({{PLURAL:$2|១ពាក្យ|$2ពាក្យ}})',
+'search-result-category-size' => '{{PLURAL:$1|សមាជិកម្នាក់|សមាជិក$1នាក់}} ({{PLURAL:$2|ចំណាážáŸ‹ážáŸ’នាក់ក្រុមរង១|$2 ចំណាážáŸ‹ážáŸ’នាក់ក្រុមរង}}, {{PLURAL:$3|1 ឯកសារ|$3 ឯកសារ}})',
'search-result-score' => 'កម្រិážáž‘ាក់ទិន៖ $1%',
'search-redirect' => '(បញ្ជូនបន្ហ$1)',
'search-section' => '(ផ្នែក $1)',
@@ -1297,6 +1302,7 @@ $1",
'contextlines' => 'ចំនួនបន្ទាážáŸ‹áž€áŸ’នុងមួយលទ្ធផល៖',
'contextchars' => 'ចំនួនអក្សរក្នុងមួយជួរ៖',
'stub-threshold' => 'ទំហំអប្បបរមាសំរាប់ដាក់ជាទំរង់<a href="#" class="stub">ážáŸ†ážŽáž—្ជាប់ទៅទំពáŸážšáž€áŸ†áž”៉ិចកំប៉ុក</a> (áž‚áž·ážáž‡áž¶áž”ៃ)៖',
+'stub-threshold-disabled' => 'មិនប្រើ',
'recentchangesdays' => 'ចំនួនážáŸ’ងៃបង្ហាញក្នុងទំពáŸážšáž”ំលាស់ប្ážáž¼ážšážáŸ’មីៗ៖',
'recentchangesdays-max' => '(អážáž·áž”រមា $1 {{PLURAL:$1|ážáŸ’ងៃ|ážáŸ’ងៃ}})',
'recentchangescount' => 'ចំនួន​កំណែប្រែ​ដែល​ážáŸ’រូវ​បង្ហាញ​ážáž¶áž˜áž›áŸ†áž“ាំដើម:',
@@ -1327,6 +1333,7 @@ $1",
'prefs-files' => 'ឯកសារ',
'prefs-custom-css' => 'កែážáŸ†ážšáž¼ážœ CSS',
'prefs-custom-js' => 'កែážáŸ†ážšáž¼ážœ JS',
+'prefs-common-css-js' => 'CSS/JavaScriptរួមសំរាប់សំបកទាំងអស់',
'prefs-reset-intro' => 'អ្នក​អាច​ប្រើ​ទំពáŸážšâ€‹áž“áŸáŸ‡â€‹ážŠáž¾áž˜áŸ’បី​កំណážáŸ‹â€‹áž¡áž¾áž„​វិញ​នូវ​ចំណូល​ចិážáŸ’ážâ€‹ážšáž”ស់​អ្នក​ដូច​លំនាំ​ដើម​របស់​ážáŸ†áž”ន់​វិញ​។
សកម្មភាព​នáŸáŸ‡â€‹áž˜áž·áž“​អាច​ធ្វើ​ឡើង​វិញ​បាន​ទáŸâ€‹áŸ”',
'prefs-emailconfirm-label' => 'បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖',
@@ -1366,9 +1373,15 @@ $1",
'prefs-advancedrendering' => 'ជំរើសážáŸ’នាក់ážáŸ’ពស់',
'prefs-advancedsearchoptions' => 'ជំរើសážáŸ’នាក់ážáŸ’ពស់',
'prefs-advancedwatchlist' => 'ជំរើសážáŸ’នាក់ážáŸ’ពស់',
-'prefs-display' => 'ជំរើសការបង្ហាញ',
+'prefs-displayrc' => 'ជំរើសការបង្ហាញ',
+'prefs-displaysearchoptions' => 'ជំរើសការបង្ហាញ',
+'prefs-displaywatchlist' => 'ជំរើសការបង្ហាញ',
'prefs-diffs' => 'ភាពážáž»ážŸáž‚្នា',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'អាសយដ្ឋានអ៊ីមែលហាក់មានសុពលភាព',
+'email-address-validity-invalid' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាព',
+
# User rights
'userrights' => 'ការគ្រប់គ្រងសិទ្ធិអ្នកប្រើប្រាស់',
'userrights-lookup-user' => 'គ្រប់គ្រងក្រុមអ្នកប្រើប្រាស់',
@@ -1449,6 +1462,7 @@ $1",
'right-hideuser' => 'រាំងážáŸ’ទប់អ្នកប្រើប្រាស់ម្នាក់ រួចលាក់មិនបង្ហាញជាសាធារណៈ',
'right-ipblock-exempt' => 'ពង្វាងការរាំងážáŸ’ទប់IP ការរាំងážáŸ’ទប់ស្វáŸáž™áž”្រវážáŸ’ážáž·áž“ិងការរាំងážáŸ’ទប់កំរិážáž¢áž“ុញ្ញាáž',
'right-proxyunbannable' => 'ពង្វាងការរាំងážáŸ’ទប់ស្វáŸáž™áž”្រវážáŸ’ážáž·ážšáž”ស់ប្រុកស៊ី',
+'right-unblockself' => 'ឈប់រាំងážáŸ’ទប់ពួកគáŸ',
'right-protect' => 'ប្ដូរកម្រិážáž€áž¶ážšáž–ាររួចកែប្រែទំពáŸážšážŠáŸ‚លបានការពារ',
'right-editprotected' => 'កែប្រែទំពáŸážšážŠáŸ‚លបានការពារ (ដោយមិនរំលាយការការពារ)',
'right-editinterface' => 'កែប្រែអន្ážážšáž˜áž»ážáž¢áŸ’នកប្រើប្រាស់',
@@ -1520,14 +1534,9 @@ $1",
'recentchanges-legend' => 'ជម្រើសនានា​សម្រាប់ការបង្ហាញបំលាស់ប្ដូរážáŸ’មីៗ',
'recentchangestext' => 'ážáž¶áž˜ážŠáž¶áž“រាល់បំលាស់ប្ដូរážáŸ’មីៗបំផុážáž…ំពោះវិគីនៅលើទំពáŸážšáž“áŸáŸ‡áŸ”',
'recentchanges-feed-description' => 'ážáž¶áž˜ážŠáž¶áž“​បំលាស់ប្ដូរážáŸ’មីៗ​បំផុážâ€‹áž“ៃ​វិគី​នáŸáŸ‡áž€áŸ’នុង​មážáž·áž–áŸážáŸŒáž˜áž¶áž“​នáŸáŸ‡â€‹áŸ”',
-'recentchanges-label-legend' => 'កំនážáŸ‹ážŸáŸ†áž‚ាល់៖ $1 ។',
-'recentchanges-legend-newpage' => '$1 - ទំពáŸážšážáŸ’មី',
'recentchanges-label-newpage' => 'ការកែប្រែនáŸáŸ‡áž”ានបង្កើážáž‘ំពáŸážšážáŸ’មីមួយ',
-'recentchanges-legend-minor' => '$1 - ការកែប្រែážáž·áž…ážáž½áž…',
'recentchanges-label-minor' => 'áž“áŸáŸ‡áž‡áž¶áž€áž¶ážšáž€áŸ‚ប្រែážáž·áž…ážáž½áž…មួយប៉ុណ្ណោះ',
-'recentchanges-legend-bot' => '$1 - ការកែប្រែដោយរូបយន្áž',
'recentchanges-label-bot' => 'ការកែប្រែនáŸáŸ‡ážáŸ’រូវបានធ្វើឡើងដោយរូបយន្áž',
-'recentchanges-legend-unpatrolled' => '$1 - ការកែប្រែដែលបានល្បាáž',
'recentchanges-label-unpatrolled' => 'ការកែប្រែនáŸáŸ‡áž˜áž·áž“ទាន់ážáŸ’រូវបានល្បាážáž‘áŸ',
'rcnote' => "ážáž¶áž„ក្រោម​នáŸáŸ‡â€‹áž‡áž¶â€‹{{PLURAL:$1|១បំលាស់ប្ដូរ|'''$1'''បំលាស់ប្ដូរ}}​ចុងក្រោយក្នុងរយៈពáŸáž›â€‹{{PLURAL:$2|ážáŸ’ងៃ|'''$2'''ážáŸ’ងៃ}}​ចុងក្រោយគិážážáŸ’រឹម$5 $4 ។",
'rcnotefrom' => "ážáž¶áž„ក្រោមនáŸáŸ‡áž‡áž¶áž”ំលាស់ប្ដូរនានាគិážáž…ាប់ážáž¶áŸ†áž„ពី '''$2''' (បង្ហាញអážáž·áž”រមា '''$1''' បំលាស់ប្ដូរ)។",
@@ -1575,6 +1584,9 @@ $1",
'upload_directory_missing' => 'ážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារផ្ទុកឡើង ($1) បាážáŸ‹ ហើយប្រពáŸáž“្ធបំរើការមិនអាចបង្កើážážœáž¶áž”ានទáŸáŸ”',
'upload_directory_read_only' => 'ប្រពáŸáž“្ធបំរើការមិនអាចសរសáŸážšáž…ូលទៅក្នុងážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារផ្ទុកឡើង ($1) áž‘áŸáŸ”',
'uploaderror' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
+'upload-recreate-warning' => "''ប្រយáŸážáŸ’ន៖ ឯកសារដែលមានឈ្មោះដូចគ្នានáŸáŸ‡ážáŸ’រូវបានលុបចោលឬប្ដូរទីážáž¶áŸ†áž„។'''
+
+កំណážáŸ‹áž áŸážáž»ážŸáŸ’ដីពីការលុបចោលនិងការប្ដូរទីážáž¶áŸ†áž„របស់ទំពáŸážšáž“áŸáŸ‡áž˜áž¶áž“បង្ហាញនៅទីនáŸáŸ‡áŸ–",
'uploadtext' => "សូមប្រើប្រាស់សំនុំបែបបទážáž¶áž„ក្រោមដើម្បីផ្ទុកឯកសារ​ឡើង។
ដើម្បីមើល ឬស្វែងរកឯកសារដែលបានផ្ទុកឡើងពីពáŸáž›áž˜áž»áž“ សូមចូលទៅ[[Special:FileList|បញ្ជីឯកសារដែលបានផ្ទុកឡើង]]។ ការផ្ទុកឡើងវិញ​នូវឯកសារបង្ហាញនៅក្នុង[[Special:Log/upload|កំណážáŸ‹áž áŸážáž»áž“ៃការផ្ទុកឯកសារឡើង]] និងការលុបចោលឯកសារមានបង្ហាញនៅក្នុង[[Special:Log/delete|កំណážáŸ‹áž áŸážáž»áž“ៃការលុប]]។
@@ -1612,6 +1624,16 @@ $1",
{{PLURAL:$3|ប្រភáŸáž‘ឯកសារ|ប្រភáŸáž‘ឯកសារ}}ដែលគáŸáž…ង់បានគឺ $2។',
'filetype-banned-type' => "'''\".\$1\"''' គឺជា​ប្រភáŸáž‘​ឯកសារ​ដែល​មិន​ážáŸ’រូវ​បាន​គáŸâ€‹áž¢áž“ុញ្ញាážâ€‹áž‘áŸâ€‹áŸ” {{PLURAL:\$3|file type is|ប្រភáŸáž‘ឯកសារ}}​ដែល​ážáŸ’រូវ​បាន​គáŸâ€‹áž¢áž“ុញ្ញាážâ€‹áž‚ឺ \$2 ។",
'filetype-missing' => 'ឯកសារ មិនមានកន្ទុយ (ដូចជា ".jpg")។',
+'empty-file' => 'ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទáŸáŸ”',
+'file-too-large' => 'ឯកសារដែលអ្នកបានដាក់ស្នើធំពáŸáž€áž áž¾áž™áŸ”',
+'filename-tooshort' => 'ឈ្មោះឯកសារážáŸ’លីពáŸáž€áž áž¾áž™áŸ”',
+'filetype-banned' => 'ឯកសារប្រភáŸáž‘áž“áŸáŸ‡ážáŸ’រូវបានហាមប្រាម។',
+'verification-error' => 'ឯកសារឆ្លងមិនរួចពីការážáŸ’ážšáž½ážáž–áž·áž“áž·ážáŸ’យ។',
+'illegal-filename' => 'មិនអនុញ្ញាážáž¢áŸ„យប្រើឈ្មោះឯកសារនáŸáŸ‡áŸ”',
+'overwrite' => 'មិនអនុញ្ញាážáž¢áŸ„យសរសáŸážšáž‡áž¶áž“់ពីលើឯកសារដែលមានស្រាប់ហើយ។',
+'unknown-error' => 'មានបញ្ហាមិនស្គាល់មួយបានកើážáž¡áž¾áž„។',
+'tmp-create-error' => 'មិនអាចបង្កើážáž¯áž€ážŸáž¶ážšáž”ណ្ដោះអាសន្ន។',
+'tmp-write-error' => 'មានបញ្ហាក្នុងការសរសáŸážšáž¯áž€ážŸáž¶ážšáž”ណ្ដោះអាសន្ន។',
'large-file' => 'ឯកសារ​គួរážáŸ‚​មាន​​ទំហំ​មិនលើសពី $1។ ឯកសារ​នáŸáŸ‡áž˜áž¶áž“​ទំហំ $2។',
'largefileserver' => 'ឯកសារនáŸáŸ‡áž˜áž¶áž“ទំហំធំជាងទំហំដែលម៉ាស៊ីនបម្រើការអនុញ្ញាážáŸ”',
'emptyfile' => 'ឯកសារដែលអ្នកបានផ្ទុកឡើងទំនងជាឯកសារទទáŸáŸ”​
@@ -1647,13 +1669,14 @@ $1",
'file-deleted-duplicate' => 'ឯកសារមួយដែលដូចគ្នាបáŸáŸ‡áž”áž·ážáž‡áž¶áž˜áž½áž™áž¯áž€ážŸáž¶ážšáž“áŸáŸ‡ ([[:$1]]) ážáŸ’រូវបានលុបចោលម្ដងហើយ។
អ្នកគួរážáŸ‚ចូលទៅពិនិážáŸ’យមើលនៅក្នុងប្រវážáŸ’ážáž·áž“ៃការលុបចោលរបស់ឯកសារនáŸáŸ‡áž˜áž»áž“នឹងបន្ážáž•áŸ’ទុកវាឡើងវិញ។',
-'successfulupload' => 'ផ្ទុកឯកសារឡើងបានសំរáŸáž…',
'uploadwarning' => 'ប្រយáŸážáŸ’áž“',
'uploadwarning-text' => 'សូមកែការពិពណ៌នារបស់ឯកសារážáž¶áž„ក្រោម រួចសាកល្បងម្ដងទៀážáŸ”',
'savefile' => 'រក្សាឯកសារទុក',
'uploadedimage' => 'បានផ្ទុកឡើង "[[$1]]"',
'overwroteimage' => 'បានផ្ទុកឡើងកំណែážáŸ’មីរបស់"[[$1]]"',
'uploaddisabled' => 'មិនអនុញ្ញាážáž¢áŸ„យផ្ទុកឯកសារឡើង',
+'copyuploaddisabled' => 'មានអោយប្រើការផ្ទុកឡើងដោយ URL។',
+'uploadfromurl-queued' => 'ការផ្ទុកឡើងរបស់អ្នកបានដាក់ក្នុងជួរ។',
'uploaddisabledtext' => 'ការផ្ទុកឯកសារ​ឡើង​គឺ​មិន​ážáŸ’រូវបាន​អនុញ្ញាážâ€‹áž‘áŸâ€‹áŸ”',
'php-uploaddisabledtext' => 'មិនអនុញ្ញាážáž¢áŸ„យផ្ទុកឯកសារឡើងក្នុង PHP áž‘áŸáŸ”
@@ -1692,6 +1715,14 @@ JD # Jenoptik
MGP # ម៉ាក Pentax
PICT # ផ្សáŸáž„​ៗ​
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'ផ្ទុកឯកសារឡើងបានសំរáŸáž…',
+'upload-success-msg' => 'ការផ្ទុកឡើងរបស់អ្នកពី [$2] បានទទួលជោគជáŸáž™áŸ” អ្នកអាចរកវាបាននៅទៅនáŸáŸ‡áŸ– [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
+'upload-failure-msg' => 'មានបញ្ហាមួយជាមួយការផ្ទុកឡើងរបស់អ្នកពី [$2]៖
+
+$1',
+'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>។',
@@ -1748,6 +1779,7 @@ PICT # ផ្សáŸáž„​ៗ​
'listfiles_search_for' => 'ស្វែងរកឈ្មោះមáŸážŒáž¶áŸ–',
'imgfile' => 'ឯកសារ',
'listfiles' => 'បញ្ជីរូបភាព',
+'listfiles_thumb' => 'កូនរូបភាព',
'listfiles_date' => 'កាលបរិច្ឆáŸáž‘',
'listfiles_name' => 'ឈ្មោះ',
'listfiles_user' => 'អ្នកប្រើប្រាស់',
@@ -1862,8 +1894,8 @@ PICT # ផ្សáŸáž„​ៗ​
'statistics-edits' => 'ការកែប្រែទំពáŸážšáž…ាប់ážáž¶áŸ†áž„ពី{{SITENAME}}ážáŸ’រូវបានដំឡើង',
'statistics-edits-average' => 'កំណែប្រែជាមធ្យមក្នុងមួយទំពáŸážš',
'statistics-views-total' => 'ចំនួនការចូលមើលសរុប',
+'statistics-views-total-desc' => 'មិនរាប់បញ្ចូលការចូលមើលទំពáŸážšážŠáŸ‚លមិនមាននិងទំពáŸážšáž–ិសáŸážŸáŸ—áž‘áŸ',
'statistics-views-peredit' => 'ចំនួនការចូលមើលក្នុងមួយកំណែប្រែ',
-'statistics-jobqueue' => 'ប្រវែង[http://www.mediawiki.org/wiki/Manual:Job_queue ជួរការងារ]',
'statistics-users' => '[[Special:ListUsers|អ្នកប្រើប្រាស់]]ដែលបានចុះឈ្មោះ',
'statistics-users-active' => 'អ្នកប្រើប្រាស់សកម្ម',
'statistics-users-active-desc' => 'អ្នក​ប្រើប្រាស់​ដែល​បាន​អនុវážáŸ’ážâ€‹ážŸáž€áž˜áŸ’មភាព​ក្នុង​{{PLURAL:$1|ážáŸ’ងៃ​}}ចុង​ក្រោយ​',
@@ -1904,6 +1936,8 @@ PICT # ផ្សáŸáž„​ៗ​
'nmembers' => '$1{{PLURAL:$1|សមាជិក|សមាជិក}}',
'nrevisions' => '$1 {{PLURAL:$1|កំណែប្រែ}}',
'nviews' => '$1 {{PLURAL:$1|ការចូលមើល}}',
+'nimagelinks' => 'ážáŸ’រូវបានប្រើនៅលើទំពáŸážšáž…ំនួន $1។',
+'ntransclusions' => 'ážáŸ’រូវបានប្រើនៅលើទំពáŸážšáž…ំនួន $1',
'specialpage-empty' => 'គ្មានលទ្ធផលសម្រាប់របាយណáŸáž“áŸáŸ‡áž‘áŸáŸ”',
'lonelypages' => 'ទំពáŸážšáž€áŸ†áž–្រា',
'lonelypagestext' => 'ទំពáŸážšážŠáž¼áž…ážáž‘ៅនáŸáŸ‡áž˜áž·áž“ážáŸ’រូវបានភ្ជាប់ពីទំពáŸážšážŠáž‘ៃនៅក្នុង {{SITENAME}}áž‘áŸáŸ”',
@@ -2061,34 +2095,40 @@ PICT # ផ្សáŸáž„​ៗ​
'listgrouprights-removegroup-self-all' => 'យក​ចáŸáž‰â€‹â€‹áž€áŸ’រុម​ទាំងអស់​ពី​​គណនី​ផ្ទាល់ážáŸ’លួន​',
# E-mail user
-'mailnologin' => 'មិនមានអាសយដ្ឋានផ្ញើទáŸ',
-'mailnologintext' => 'អ្នកážáŸ’រូវážáŸ‚ [[Special:UserLogin|កážáŸ‹ážˆáŸ’មោះចូល]] áž“áž·áž„ មានអាសយដ្ឋានអ៊ីមែលមានសុពលភាពមួយ ក្នុង[[Special:Preferences|ចំណង់ចំណូលចិážáŸ’áž]]របស់អ្នក ដើម្បីមានសិទ្ធិផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់ដទៃទៀážáŸ”',
-'emailuser' => 'ផ្ញើអ៊ីមែល​ទៅកាន់​អ្នក​ប្រើប្រាស់នáŸáŸ‡',
-'emailpage' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់',
-'emailpagetext' => 'អ្នក​អាច​ប្រើសំនុំ​បែប​បទ​ážáž¶áž„​ក្រោម​ក្នុង​ការ​ផ្ញើ​សារ​ជា​អ៊ីមែល​ទៅ​កាន់​អ្នក​ប្រើប្រាស់​នáŸáŸ‡â€‹áŸ”
+'mailnologin' => 'មិនមានអាសយដ្ឋានផ្ញើទáŸ',
+'mailnologintext' => 'អ្នកážáŸ’រូវážáŸ‚ [[Special:UserLogin|កážáŸ‹ážˆáŸ’មោះចូល]] áž“áž·áž„ មានអាសយដ្ឋានអ៊ីមែលមានសុពលភាពមួយ ក្នុង[[Special:Preferences|ចំណង់ចំណូលចិážáŸ’áž]]របស់អ្នក ដើម្បីមានសិទ្ធិផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់ដទៃទៀážáŸ”',
+'emailuser' => 'ផ្ញើអ៊ីមែល​ទៅកាន់​អ្នក​ប្រើប្រាស់នáŸáŸ‡',
+'emailpage' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់',
+'emailpagetext' => 'អ្នក​អាច​ប្រើសំនុំ​បែប​បទ​ážáž¶áž„​ក្រោម​ក្នុង​ការ​ផ្ញើ​សារ​ជា​អ៊ីមែល​ទៅ​កាន់​អ្នក​ប្រើប្រាស់​នáŸáŸ‡â€‹áŸ”
អាសយដ្ឋាន​អ៊ីមែល​ដែល​អ្នក​បាន​វាយ​បញ្ចូល​ក្នុង​[[Special:Preferences|ចំណង់ចំណូល​ចិážáŸ’ážâ€‹]]​របស់​អ្នក នឹង​បង្ហាញ​ជា​អាសយដ្ឋាន​អ៊ីមែល "From" ដូច្នោះ​អ្នក​ទទួល​នឹង​អាច​ឆ្លើយ​ážáž”​ទៅ​អ្នក​វិញ​ដោយ​ផ្ទាល់​។',
-'usermailererror' => 'កំហុសឆ្គងក្នុងចំណងជើងអ៊ីមែល៖',
-'defemailsubject' => 'អ៊ីមែលពី{{SITENAME}}',
-'noemailtitle' => 'គ្មានអាសយដ្ឋានអ៊ីមែល',
-'noemailtext' => 'អ្នកប្រើប្រាស់នáŸáŸ‡áž˜áž·áž“បានផ្ដល់អាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាពទáŸáŸ”',
-'nowikiemailtitle' => 'មិនអនុញ្ញាážáž¢áŸ„យប្រើអ៊ីមែល',
-'nowikiemailtext' => 'អ្នក​ប្រើប្រាស់​នáŸáŸ‡â€‹áž”ាន​ជ្រើសរើស​មិន​ទទួល​អ៊ីមែល​ពីអ្នកប្រើប្រាស់​ដទៃ​ទៀážâ€‹áŸ”',
-'email-legend' => 'ផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់{{SITENAME}}ម្នាក់ទៀáž',
-'emailfrom' => 'ពី៖',
-'emailto' => 'ទៅកាន់៖',
-'emailsubject' => 'ប្រធានបទ៖',
-'emailmessage' => 'សារ៖',
-'emailsend' => 'ផ្ញើ',
-'emailccme' => 'ផ្ញើអ៊ីមែលមកážáŸ’ញុំនូវច្បាប់ចម្លងមួយនៃសាររបស់ážáŸ’ញុំ។',
-'emailccsubject' => 'ច្បាប់ចម្លងនៃសារដែលអ្នកផ្ញើទៅកាន់ $1 ៖ $2',
-'emailsent' => 'អ៊ីមែលážáŸ’រូវបានផ្ញើទៅហើយ',
-'emailsenttext' => 'សារអ៊ីមែលរបស់អ្នកážáŸ’រូវបានផ្ញើរួចហើយ។',
-'emailuserfooter' => 'អ៊ីមែលនáŸáŸ‡ážáŸ’រូវបានផ្ញើដោយ$1ទៅកាន់$2ដោយប្រើមុážáž„ារ"អ៊ីមែលអ្នកប្រើប្រាស់"របស់{{SITENAME}}។',
+'usermailererror' => 'កំហុសឆ្គងក្នុងចំណងជើងអ៊ីមែល៖',
+'defemailsubject' => 'អ៊ីមែលពី{{SITENAME}}',
+'usermaildisabled' => 'មិនប្រើអ៊ីមែល',
+'usermaildisabledtext' => 'អ្នកមិនអាចផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់ដទៃទៀážáž“ៅលើវិគីនáŸáŸ‡áž”ានទáŸ',
+'noemailtitle' => 'គ្មានអាសយដ្ឋានអ៊ីមែល',
+'noemailtext' => 'អ្នកប្រើប្រាស់នáŸáŸ‡áž˜áž·áž“បានផ្ដល់អាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាពទáŸáŸ”',
+'nowikiemailtitle' => 'មិនអនុញ្ញាážáž¢áŸ„យប្រើអ៊ីមែល',
+'nowikiemailtext' => 'អ្នក​ប្រើប្រាស់​នáŸáŸ‡â€‹áž”ាន​ជ្រើសរើស​មិន​ទទួល​អ៊ីមែល​ពីអ្នកប្រើប្រាស់​ដទៃ​ទៀážâ€‹áŸ”',
+'email-legend' => 'ផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់{{SITENAME}}ម្នាក់ទៀáž',
+'emailfrom' => 'ពី៖',
+'emailto' => 'ទៅកាន់៖',
+'emailsubject' => 'ប្រធានបទ៖',
+'emailmessage' => 'សារ៖',
+'emailsend' => 'ផ្ញើ',
+'emailccme' => 'ផ្ញើអ៊ីមែលមកážáŸ’ញុំនូវច្បាប់ចម្លងមួយនៃសាររបស់ážáŸ’ញុំ។',
+'emailccsubject' => 'ច្បាប់ចម្លងនៃសារដែលអ្នកផ្ញើទៅកាន់ $1 ៖ $2',
+'emailsent' => 'អ៊ីមែលážáŸ’រូវបានផ្ញើទៅហើយ',
+'emailsenttext' => 'សារអ៊ីមែលរបស់អ្នកážáŸ’រូវបានផ្ញើរួចហើយ។',
+'emailuserfooter' => 'អ៊ីមែលនáŸáŸ‡ážáŸ’រូវបានផ្ញើដោយ$1ទៅកាន់$2ដោយប្រើមុážáž„ារ"អ៊ីមែលអ្នកប្រើប្រាស់"របស់{{SITENAME}}។',
+
+# User Messenger
+'usermessage-summary' => 'ទុកសារ',
+'usermessage-editor' => 'ប្រពáŸáž“្ធផ្ញើសារ',
# Watchlist
'watchlist' => 'បញ្ជីážáž¶áž˜ážŠáž¶áž“របស់ážáŸ’ញុំ',
'mywatchlist' => 'បញ្ជីážáž¶áž˜ážŠáž¶áž“​',
-'watchlistfor' => "(សម្រាប់ '''$1''')",
+'watchlistfor2' => 'សំរាប់ $1 $2',
'nowatchlist' => 'គ្មានអ្វីនៅក្នុងបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នកទáŸáŸ”',
'watchlistanontext' => 'សូម $1 ដើម្បី​មើល​ឬ​កែប្រែ​របស់​ក្នុង​បញ្ជីážáž¶áž˜ážŠáž¶áž“​របស់អ្នក។',
'watchnologin' => 'មិនទាន់កážáŸ‹ážˆáŸ’មោះចូលទáŸ',
@@ -2352,19 +2392,23 @@ $1',
'month' => 'ážáŸ‚៖',
'year' => 'ឆ្នាំ៖',
-'sp-contributions-newbies' => 'បង្ហាញážáŸ‚ការរួមចំណែករបស់អ្នកប្រើប្រាស់ážáŸ’មីៗ',
-'sp-contributions-newbies-sub' => 'ចំពោះគណនីážáŸ’មីៗ',
-'sp-contributions-newbies-title' => 'ការរួមចំណែករបស់អ្នកប្រើប្រាស់ចំពោះគណនីážáŸ’មី',
-'sp-contributions-blocklog' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការហាមឃាážáŸ‹',
-'sp-contributions-deleted' => 'ការរួមចំណែកដែលážáŸ’រូវបានលុប',
-'sp-contributions-logs' => 'កំណážáŸ‹â€‹áž áŸážáž»â€‹',
-'sp-contributions-talk' => 'ការពិភាក្សា',
-'sp-contributions-userrights' => 'ការគ្រប់គ្រងសិទ្ធិអ្នកប្រើប្រាស់',
-'sp-contributions-blocked-notice' => 'អ្នកប្រើប្រាស់នáŸáŸ‡ážáŸ’រូវបានរាំងážáŸ’ទប់ហើយនាពáŸáž›áž“áŸáŸ‡áŸ”
+'sp-contributions-newbies' => 'បង្ហាញážáŸ‚ការរួមចំណែករបស់អ្នកប្រើប្រាស់ážáŸ’មីៗ',
+'sp-contributions-newbies-sub' => 'ចំពោះគណនីážáŸ’មីៗ',
+'sp-contributions-newbies-title' => 'ការរួមចំណែករបស់អ្នកប្រើប្រាស់ចំពោះគណនីážáŸ’មី',
+'sp-contributions-blocklog' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការហាមឃាážáŸ‹',
+'sp-contributions-deleted' => 'ការរួមចំណែកដែលážáŸ’រូវបានលុប',
+'sp-contributions-uploads' => 'ឯកសារផ្ទុកឡើង',
+'sp-contributions-logs' => 'កំណážáŸ‹â€‹áž áŸážáž»â€‹',
+'sp-contributions-talk' => 'ការពិភាក្សា',
+'sp-contributions-userrights' => 'ការគ្រប់គ្រងសិទ្ធិអ្នកប្រើប្រាស់',
+'sp-contributions-blocked-notice' => 'អ្នកប្រើប្រាស់នáŸáŸ‡ážáŸ’រូវបានរាំងážáŸ’ទប់ហើយនាពáŸáž›áž“áŸáŸ‡áŸ”
កំណážáŸ‹ážáŸ’រាស្ដីពីការរាំងážáŸ’ទប់ចុងក្រោយមានបង្ហាញដូចážáž¶áž„ក្រោមនáŸáŸ‡áŸ–',
-'sp-contributions-search' => 'ស្វែងរកការរួមចំណែក',
-'sp-contributions-username' => 'អាសយដ្ឋានIP ឬអážáŸ’ážáž“ាម៖',
-'sp-contributions-submit' => 'ស្វែងរក',
+'sp-contributions-blocked-notice-anon' => 'អាសយដ្ឋានIPáž“áŸáŸ‡ážáŸ’រូវបានរាំងážáŸ’ទប់ហើយនាពáŸáž›áž“áŸáŸ‡áŸ”
+កំណážáŸ‹ážáŸ’រាស្ដីពីការរាំងážáŸ’ទប់ចុងក្រោយមានបង្ហាញដូចážáž¶áž„ក្រោមនáŸáŸ‡áŸ–',
+'sp-contributions-search' => 'ស្វែងរកការរួមចំណែក',
+'sp-contributions-username' => 'អាសយដ្ឋានIP ឬអážáŸ’ážáž“ាម៖',
+'sp-contributions-toponly' => 'បង្ហាញážáŸ‚ការកែប្រែណាដែលជាកំណែážáŸ’មីៗជាងគáŸáž”៉ុណ្ណោះ',
+'sp-contributions-submit' => 'ស្វែងរក',
# What links here
'whatlinkshere' => 'អ្វី​ដែលភ្ជាប់មកទីនáŸáŸ‡',
@@ -2421,7 +2465,6 @@ $1',
'ipb-edit-dropdown' => 'កែប្រែ áž áŸážáž»áž•áž› រាំងážáŸ’ទប់',
'ipb-unblock-addr' => 'ឈប់ហាមឃាážáŸ‹$1',
'ipb-unblock' => 'លែងរាំងážáŸ’ទប់ អ្នកប្រើប្រាស់ ឬ អាសយដ្ឋាន IP',
-'ipb-blocklist-addr' => 'ការរាំងážáŸ’ទប់ដែលមានស្រáŸáž…សម្រាប់$1',
'ipb-blocklist' => 'មើលការហាមឃាážáŸ‹ážŠáŸ‚លមានស្រáŸáž…',
'ipb-blocklist-contribs' => 'ការរួមចំណែកសម្រាប់ $1',
'unblockip' => 'ឈប់ហាមឃាážáŸ‹áž¢áŸ’នកប្រើប្រាស់',
@@ -2730,6 +2773,8 @@ $1 ážáŸ’រូវ​បាន​ទប់ស្កាážáŸ‹â€‹áž áž¾áž™â€‹áŸ” á
'tooltip-rollback' => '"ážáŸ’រឡប់​"កំណែ​ប្រែ​ធ្វើឡើងដោយអ្នក​រួម​ចំណែក​ចុង​ក្រោយ​គ០ទៅកំណែប្រែមុននោះវិញ​ ដោយគ្រាន់​ážáŸ‚​ចុច​មួយ​ច្នុចប៉ុណ្ណោះ​',
'tooltip-undo' => '"មិន​ធ្វើ​វិញ"​ ážáŸ’រឡប់​កំណែ​នáŸáŸ‡áž¡áž¾áž„​វិញ​ និង​បើក​បែប​បទ​កែប្រែ​ក្នុង​ទម្រង់​មើល​ជាមុន​។
អ្នកអាចបន្ážáŸ‚ម​មូល​ហáŸážáž»â€‹áž“ៅ​ក្នុង​សáŸáž…ក្ដី​សង្ážáŸáž”​បាន។',
+'tooltip-preferences-save' => 'រក្សាទុកចំណង់ចំណូលចិážáŸ’áž',
+'tooltip-summary' => 'បញ្ចូលចំណារពន្យល់ážáŸ’មីមួយ',
# Stylesheets
'common.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */',
@@ -2835,14 +2880,17 @@ $1',
'imagemaxsize' => "កំណážáŸ‹áž‘ំហំរូបភាព៖<br />''(លើទំពáŸážšáž–ិពណ៌នារូបភាព)''",
'thumbsize' => 'ទំហំកូនរូបភាព៖',
'widthheightpage' => '$1×$2, $3{{PLURAL:$3|ទំពáŸážš|ទំពáŸážš}}',
-'file-info' => '(ទំហំឯកសារ៖ $1, ប្រភáŸáž‘ MIME ៖ $2)',
-'file-info-size' => '($1 × $2 ភីកសែល ទំហំឯកសារ៖ $3 ប្រភáŸáž‘ MIME៖ $4)',
+'file-info' => 'ទំហំឯកសារ៖ $1, ប្រភáŸáž‘ MIME ៖ $2',
+'file-info-size' => '$1 × $2 ភីកសែល ទំហំឯកសារ៖ $3 ប្រភáŸáž‘ MIME៖ $4',
'file-nohires' => '<small>គ្មានភាពម៉ážáŸ‹ ដែលážáŸ’ពស់ជាង។</small>',
-'svg-long-desc' => '(ឯកសារប្រភáŸáž‘SVG $1 × $2 ភីកសែល ទំហំឯកសារ៖ $3)',
+'svg-long-desc' => 'ឯកសារប្រភáŸáž‘SVG $1 × $2 ភីកសែល ទំហំឯកសារ៖ $3',
'show-big-image' => 'រូបភាពពáŸáž‰',
'show-big-image-thumb' => '<small>ទំហំ​នៃការមើលជាមុននáŸáŸ‡áŸ– $1 × $2 ភីកសែល</small>',
'file-info-gif-looped' => 'រង្វិល',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ផ្ទាំង|ផ្ទាំង}}',
+'file-info-png-looped' => 'រង្វិល',
+'file-info-png-repeat' => 'ចាក់ $1 ដង',
+'file-info-png-frames' => '$1 ផ្ទាំង',
# Special:NewFiles
'newimages' => 'វិចិážáŸ’រសាលរូបភាពážáŸ’មីៗ',
@@ -3127,6 +3175,7 @@ $1',
'table_pager_first' => 'ទំពáŸážšážŠáŸ†áž”ូង',
'table_pager_last' => 'ទំពáŸážšáž…ុងក្រោយ',
'table_pager_limit' => 'បង្ហាញវážáŸ’ážáž»áž…ំនួន $1 ក្នុងមួយទំពáŸážš',
+'table_pager_limit_label' => 'ចំនួនវážáŸ’ážáž»áž€áŸ’នុងមួយទំពáŸážšáŸ–',
'table_pager_limit_submit' => 'ទៅ',
'table_pager_empty' => 'មិនមានលទ្ធផលទáŸ',
@@ -3191,6 +3240,7 @@ $1',
'version-extensions' => 'ផ្នែកបន្ážáŸ‚មដែលបានដំឡើង',
'version-specialpages' => 'ទំពáŸážšáž–ិសáŸážŸáŸ—',
'version-variables' => 'អážáŸážš',
+'version-skins' => 'សំបក',
'version-other' => 'ផ្សáŸáž„',
'version-mediahandlers' => 'កម្មវិធី​បើក​មáŸážŒáž¶â€‹ (Media handlers)',
'version-extension-functions' => 'មុážáž„ារផ្នែកបន្ážáŸ‚ម',
@@ -3199,6 +3249,8 @@ $1',
'version-hook-subscribedby' => 'បានជាវ ជាប្រចាំ ដោយ',
'version-version' => '(កំណែ $1)',
'version-license' => 'អាជ្ញាបáŸážŽáŸ’ណ',
+'version-poweredby-credits' => "វិគីនáŸáŸ‡áž§áž”ážáŸ’ážáž˜áŸ’ភដោយ '''[http://www.mediawiki.org/ មáŸážŒáž¶ážœáž·áž‚ី]''', រក្សាសិទ្ធ © ២០០១-$1 $2។",
+'version-poweredby-others' => 'អ្នកដទៃទៀáž',
'version-software' => 'ផ្នែកទន់​ដែល​បានដំឡើង',
'version-software-product' => 'ផលិážáž•áž›',
'version-software-version' => 'កំណែ',
@@ -3256,6 +3308,15 @@ $1',
'tags-edit' => 'កែប្រែ',
'tags-hitcount' => '$1 {{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}',
+# Special:ComparePages
+'comparepages' => 'ប្រៀបធៀបទំពáŸážš',
+'compare-selector' => 'ប្រៀបធៀបកំណែទំពáŸážš',
+'compare-page1' => 'ទំពáŸážš ១',
+'compare-page2' => 'ទំពáŸážš ២',
+'compare-rev1' => 'កំណែ ១',
+'compare-rev2' => 'កំណែ ២',
+'compare-submit' => 'ប្រៀបធៀប',
+
# Database error messages
'dberr-header' => 'វិគីនáŸáŸ‡áž˜áž¶áž“បញ្ហា',
'dberr-problems' => 'សូមអភáŸáž™áž‘ោស! វិបសាយនáŸáŸ‡áž€áŸ†áž–ុងជួបបញ្ហាបច្ចáŸáž€áž‘áŸážŸáŸ”',
@@ -3272,6 +3333,7 @@ $1',
'htmlform-float-invalid' => 'ážáŸ†áž›áŸƒáž›áŸážážŠáŸ‚លអ្នកបានកំនážáŸ‹áž˜áž·áž“មែនជាចំនួនទáŸáŸ”',
'htmlform-int-toolow' => 'ážáŸ†áž›áŸƒáž›áŸážážŠáŸ‚លអ្នកបានកំនážáŸ‹ážáž¼áž…ជាងចំនួនអប្បបរមាដែលមានážáŸ†áž›áŸƒ$1',
'htmlform-int-toohigh' => 'ážáŸ†áž›áŸƒáž›áŸážážŠáŸ‚លអ្នកបានកំនážáŸ‹áž’ំជាងចំនួនអážáž·áž”រមាដែលមានážáŸ†áž›áŸƒ$1',
+'htmlform-required' => 'ចាំបាច់អោយដាក់ážáŸ†áž›áŸƒáž›áŸážáž“áŸáŸ‡',
'htmlform-submit' => 'ដាក់ស្នើ',
'htmlform-reset' => 'ធ្វើដូចដើមវិញ',
'htmlform-selectorother-other' => 'ផ្សáŸáž„ទៀáž',
diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php
index a602da08..565f6354 100644
--- a/languages/messages/MessagesKn.php
+++ b/languages/messages/MessagesKn.php
@@ -68,8 +68,7 @@ $messages = array(
'tog-editsection' => 'ಪà³à²Ÿà²¦ ವಿಭಾಗಗಳನà³à²¨à³ [ಬದಲಾಯಿಸà³] ಕೊಂಡಿಗಳನà³à²¨à³ ಒತà³à²¤à³à²µà³à²¦à²°à²¿à²‚ದ ಸಂಪಾದನೆ ಮಾಡà³à²µà²‚ತೆ ಇರಲಿ',
'tog-editsectiononrightclick' => 'ಪà³à²Ÿà²¦ ವಿಭಾಗಗಳನà³à²¨à³ ಅವà³à²—ಳ ಶೀರà³à²·à²¿à²•à³†à²¯à²¨à³à²¨à³ ಎರಡೠಬಾರಿ ಕà³à²²à²¿à²•à³ ಮಾಡಿ ಸಂಪಾದನೆ ಮಾಡà³à²µà²‚ತೆ ಇರಲಿ (JavaScript)',
'tog-showtoc' => 'ಪರಿವಿಡಿಯನà³à²¨à³ ತೋರಿಸೠ(ಮೂರಕà³à²•à²¿à²‚ತ ಹೆಚà³à²šà³ ತಲೆಬರಹಗಳನà³à²¨à³ ಹೊಂದಿರà³à²µ ಪà³à²Ÿà²—ಳಿಗೆ)',
-'tog-rememberpassword' => 'ಈ ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ನನà³à²¨ ಲಾಗಿನೠನೆನಪಿನಲà³à²²à²¿à²Ÿà³à²Ÿà³à²•à³Š',
-'tog-editwidth' => 'ಸಂಪಾದನೆ ಚೌಕವೠಪೂರà³à²£ ವಿಸà³à²¤à²¾à²°à²µà²¨à³à²¨à³ ಹೊಂದಿರಲಿ',
+'tog-rememberpassword' => 'ಈ ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ನನà³à²¨ ಲಾಗಿನೠನೆನಪಿನಲà³à²²à²¿à²Ÿà³à²Ÿà³à²•à³Š (ಗರಿಷà³à²  $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
'tog-watchcreations' => 'ನಾನೠಪà³à²°à²¾à²°à²‚ಭಿಸà³à²µ ಲೇಖನಗಳನà³à²¨à³ ನನà³à²¨ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೆ ಸೇರಿಸà³',
'tog-watchdefault' => 'ನಾನೠಸಂಪಾದಿಸà³à²µ ಪà³à²Ÿà²—ಳನà³à²¨à³ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೆ ಸೇರಿಸà³',
'tog-watchmoves' => 'ನಾನೠಸà³à²¥à²³à²¾à²‚ತರಿಸà³à²µ ಪà³à²Ÿà²—ಳನà³à²¨à³ ನನà³à²¨ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೆ ಸೇರಿಸà³',
@@ -206,28 +205,18 @@ $messages = array(
'faqpage' => 'Project:ಸಾಮಾನà³à²¯à²µà²¾à²—ಿ ಕೇಳಲಾಗà³à²µ ಪà³à²°à²¶à³à²¨à³†à²—ಳà³',
# Vector skin
-'vector-action-addsection' => 'ವಿಷಯ ಸೇರಿಸಿ',
-'vector-action-delete' => 'ಅಳಿಸà³',
-'vector-action-move' => 'ಸà³à²¥à²³à²¾à²‚ತರಿಸಿ',
-'vector-action-protect' => 'ಸಂರಕà³à²·à²¿à²¸à³',
-'vector-action-unprotect' => 'ಸಂರಕà³à²·à²£à³†à²¯à²¨à³à²¨à³ ತೆಗೆ',
-'vector-namespace-category' => 'ವರà³à²—',
-'vector-namespace-help' => 'ಸಹಾಯ ಪà³à²Ÿ',
-'vector-namespace-image' => 'ಫೈಲà³',
-'vector-namespace-main' => 'ಪà³à²Ÿ',
-'vector-namespace-mediawiki' => 'ಸಂದೇಶ',
-'vector-namespace-project' => 'ಯೋಜನೆ ಪà³à²Ÿ',
-'vector-namespace-special' => 'ವಿಶೇಷ ಪà³à²Ÿ',
-'vector-namespace-talk' => 'ಚರà³à²šà³†',
-'vector-namespace-template' => 'ಟೆಂಪà³à²²à³‡à²Ÿà³',
-'vector-namespace-user' => 'ಸದಸà³à²¯à²° ಪà³à²Ÿ',
-'vector-view-create' => 'ಸೃಷà³à²Ÿà²¿à²¸à³',
-'vector-view-edit' => 'ಸಂಪಾದಿಸಿ',
-'vector-view-history' => 'ಇತಿಹಾಸವನà³à²¨à³ ನೋಡಿ',
-'vector-view-view' => 'ಓದà³',
-'vector-view-viewsource' => 'ಆಕರ ವೀಕà³à²·à²¿à²¸à³',
-'actions' => 'ಕà³à²°à²¿à²¯à³†à²—ಳà³',
-'namespaces' => 'ನಾಮವರà³à²—ಗಳà³',
+'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' => 'ದೋಷ',
'returnto' => '$1 ಗೆ ಹಿಂತಿರà³à²—ಿ.',
@@ -283,6 +272,7 @@ $messages = array(
'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' => 'ಕನà³à²¨à²¡ {{SITENAME}} ಬಗà³à²—ೆ',
@@ -435,7 +425,7 @@ $2',
'yourname' => 'ನಿಮà³à²® ಬಳಕೆಯ ಹೆಸರà³',
'yourpassword' => 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦',
'yourpasswordagain' => 'ಪà³à²°à²µà³‡à²¶ ಪದ ಮತà³à²¤à³Šà²®à³à²®à³† ಟೈಪೠಮಾಡಿ',
-'remembermypassword' => 'ಈ ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ನನà³à²¨ ಪà³à²°à²µà³‡à²¶ ಪದವನà³à²¨à³ ನೆನಪಿನಲà³à²²à²¿à²Ÿà³à²Ÿà³à²•à³Š',
+'remembermypassword' => 'ಈ ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ನನà³à²¨ ಲಾಗಿನೠನೆನಪಿನಲà³à²²à²¿à²Ÿà³à²Ÿà³à²•à³Š (ಗರಿಷà³à²  $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
'login' => 'ಲಾಗೠಇನà³',
'nav-login-createaccount' => 'ಲಾಗೠಇನೠ- log in',
'loginprompt' => '{{SITENAME}} ತಾಣಕà³à²•à³† ಲಾಗೠಇನೠಆಗಲೠನಿಮà³à²® ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ಕà³à²•à³€ (cookie) ಸೌಲಭà³à²¯à²µà²¿à²°à²¬à³‡à²•à³.',
@@ -450,6 +440,7 @@ $2',
'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
'gotaccountlink' => 'ಲಾಗೠಇನà³',
'createaccountmail' => 'ಇ-ಅಂಚೆಯ ಮೂಲಕ',
+'createaccountreason' => 'ಕಾರಣ:',
'badretype' => 'ನೀವೠಕೊಟà³à²Ÿ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²—ಳೠಬೇರೆಬೇರೆಯಾಗಿವೆ.',
'userexists' => 'ನೀವೠನೀಡಿದ ಸದಸà³à²¯à²° ಹೆಸರೠಆಗಲೆ ಬಳಕೆಯಲà³à²²à²¿à²¦à³†. ದಯವಿಟà³à²Ÿà³ ಬೇರೊಂದೠಹೆಸರನà³à²¨à³ ಆಯà³à²•à³† ಮಾಡಿ.',
'loginerror' => 'ಲಾಗಿನೠದೋಷ',
@@ -639,7 +630,6 @@ $2',
ನಿಮà³à²® ಬರಹಗಳನà³à²¨à³ ಬೇರೆಯವರೠನಿರà³à²¦à²¾à²•à³à²·à²¿à²£à³à²¯à²µà²¾à²—ಿ ಸಂಪಾದನೆ ಮಾಡà³à²µà³à²¦à³ ನಿಮಗೆ ಇಷà³à²Ÿà²µà²¿à²²à³à²²à²¦à²¿à²¦à³à²¦à²°à³† ಇಲà³à²²à²¿ ಸಂಪಾದನೆ ಮಾಡಬೇಡಿ.<br />
ಅಲà³à²²à²¦à³† ನಿಮà³à²® ಸಂಪಾದನೆಗಳನà³à²¨à³ ನೀವೇ ಸà³à²µà²¤à²ƒ ರಚಿಸಿದà³à²¦à³, ಅಥವ ಕೃತಿಸà³à²µà²¾à²®à³à²¯à²¤à³†à²¯à²¿à²‚ದ ಮà³à²•à³à²¤à²µà²¾à²—ಿರà³à²µ ಕಡೆಯಿಂದ ಪಡೆದಿದà³à²¦à³ ಎಂದೠನೀವೠಪà³à²°à²®à²¾à²£à²¿à²¸à³à²¤à³à²¤à²¿à²°à³à²µà²¿à²°à²¿ (ಮಾಹಿತಿಗೆ $1 ನೋಡಿ).
'''ಕೃತಿಸà³à²µà²¾à²®à³à²¯à²¤à³†à²¯ ಅಡಿಯಲà³à²²à²¿à²°à³à²µ ರಚನೆಗಳನà³à²¨à³ ಅನà³à²®à²¤à²¿ ಇಲà³à²²à²¦à³† ಇಲà³à²²à²¿à²—ೆ ಹಾಕಬೇಡಿ!'''",
-'longpagewarning' => "'''ಎಚà³à²šà²°: ಈ ಪà³à²Ÿ $1 ಕಿಲೋಬೈಟà³â€à²—ಳಷà³à²Ÿà³ ಉದà³à²¦ ಇದೆ; ಕೆಲವೠಬà³à²°à³Œà²¸à²°à³â€à²—ಳಲà³à²²à²¿ ೩೨ ಕಿಲೋಬೈಟà³â€à²—ಳಿಗಿಂತ ಉದà³à²¦à²¦ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸಂಪಾದನೆ ಮಾಡà³à²µà³à²¦à³ ಕಷà³à²Ÿ. ಪà³à²Ÿà²µà²¨à³à²¨à³ ಆದಷà³à²Ÿà³ ವಿಭಾಗಗಳಾಗಿ ವಿಂಗಡಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿.'''",
'longpageerror' => "'''ದೋಷ: ನೀವೠಸಲà³à²²à²¿à²¸à²¿à²°à³à²µ ಪಠà³à²¯à²µà³ $1 ಕಿಲೊಬೈಟೠಉದà³à²¦à²¦à³à²¦à²¾à²—ಿದೆ. ಇದೠನಿಯಮಿತವಾಗಿರà³à²µ ಗರಿಷà³à² à²µà²¾à²¦ $2 ಕಿಲೊಬೈಟà³â€à²—ಳಿಗಿಂತ ಹೆಚà³à²šà²¾à²—ಿದೆ.
ಆದà³à²¦à²°à²¿à²‚ದ ಇದನà³à²¨à³ ಉಳಿಸಲೠಆಗà³à²µà³à²¦à²¿à²²à³à²².'''",
'readonlywarning' => "'''ಗಮನಿಸಿ: ಡೇಟಾಬೇಸೠಅನà³à²¨à³ ದà³à²°à²¸à³à²¤à²¿à²—ಾಗಿ ಮà³à²šà³à²šà²²à²¾à²—ಿದೆ. ಹಾಗಾಗಿ ನಿಮà³à²® ಸಂಪಾದನೆಗಳನà³à²¨à³ ಈಗ ಉಳಿಸಲೠಆಗà³à²µà³à²¦à²¿à²²à³à²².
@@ -740,6 +730,8 @@ $2',
'revdelete-submit' => 'ಆಯà³à²•à³† ಮಾಡಿದ ಬದಲಾವಣೆಗೆ ಅನà³à²µà²¯à²¿à²¸à³',
'revdelete-logentry' => '[[$1]] ರ ಸಂಪಾದನೆಯ ಕಾಣಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ಬದಲಾಯಿಸಲಾಯಿತà³',
'revdel-restore' => 'ಕಾಣಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ಬದಲಾಯಿಸà³',
+'revdel-restore-deleted' => 'ಅಳಿಸಿಹಾಕಲಾದ ಆವೃತà³à²¤à²¿à²—ಳà³',
+'revdel-restore-visible' => 'ಕಾಣà³à²µ ಆವೃತà³à²¤à²¿à²—ಳà³',
'pagehist' => 'ಪà³à²Ÿà²¦ ಇತಿಹಾಸ',
'deletedhist' => 'ಅಳಿಸಲà³à²ªà²Ÿà³à²Ÿ ಇತಿಹಾಸ',
'revdelete-content' => 'ಮಾಹಿತಿ',
@@ -921,6 +913,9 @@ $2',
'prefs-advancedrendering' => 'ಪರಿಣತ ಇಚà³à²›à³†à²—ಳà³',
'prefs-advancedsearchoptions' => 'ಪರಿಣತ ಇಚà³à²›à³†à²—ಳà³',
'prefs-advancedwatchlist' => 'ಪರಿಣತ ಇಚà³à²›à³†à²—ಳà³',
+'prefs-displayrc' => 'ಪà³à²°à²¦à²°à³à²¶à²¨ ಆಯà³à²•à³†à²—ಳà³',
+'prefs-displaysearchoptions' => 'ಪà³à²°à²¦à²°à³à²¶à²¨ ಆಯà³à²•à³†à²—ಳà³',
+'prefs-displaywatchlist' => 'ಪà³à²°à²¦à²°à³à²¶à²¨ ಆಯà³à²•à³†à²—ಳà³',
# User rights
'userrights' => 'ಬಳಕೆದಾರ ಹಕà³à²•à³à²—ಳ ನಿರà³à²µà²¹à²£à³†',
@@ -1067,6 +1062,7 @@ $2',
'filetype-unwanted-type' => "'''\".\$1\"''' ಒಂದೠಬೇಡವಾದ ಫೈಲಿನ ಮಾದರಿ. à²à²šà³à²›à²¿à²• ಫೈಲಿನ {{PLURAL:\$3|ಮಾದರಿಯà³|ಮಾದರಿಗಳà³}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' ಒಂದೠನಿರà³à²¬à²‚ಧಿತ ಫೈಲಿನ ಮಾದರಿ. ನಿರà³à²¬à²‚ಧನೆಯಿಲà³à²²à²¦ ಫೈಲಿನ {{PLURAL:\$3|ಮಾದರಿಯà³|ಮಾದರಿಗಳà³}} \$2.",
'filetype-missing' => 'ಈ ಫೈಲಿಗೆ ಉಪನಾಮ (extension ಉದಾ ".jpg") ಇಲà³à²².',
+'empty-file' => 'ನೀವೠಸಮರà³à²ªà²¿à²¸à²¿à²¦ ಕಡತವೠಖಾಲಿಯಾಗಿತà³à²¤à³.',
'large-file' => 'ಫೈಲà³à²—ಳೠ$1 ಗಿಂತ ದೊಡà³à²¡à²¦à²¾à²—ಿರಬಾರದೆಂದೠಶಿಫಾರಿತ;
ಈ ಫೈಲಿನ ಗಾತà³à²° $2.',
'largefileserver' => 'ಈ ಫೈಲೠಸರà³à²µà²°à³â€à²¨à²²à³à²²à²¿ ಸೇರà³à²ªà²¡à³† ಮಾಡಲೠಶಿಫಾರಿತ ಗಾತà³à²°à²•à³à²•à²¿à²‚ತ ದೊಡà³à²¡à²¦à²¾à²—ಿದೆ.',
@@ -1092,7 +1088,6 @@ $2',
ದಯವಿಟà³à²Ÿà³ ಹಿಂದಕà³à²•à³† ಹೋಗಿ ಈ ಫೈಲನà³à²¨à³ ಹೊಸ ಹೆಸರಿನಲà³à²²à²¿ ಅಪà³à²²à³‹à²¡à³ ಮಾಡಿ. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'ಆ ಹೆಸರಿನಲà³à²²à²¿ ಫೈಲೊಂದೠಸಾಮೂಹಿಕ ಫೈಲಿನ ಆಗರದಲà³à²²à²¿ ಆಗಲೆ ಇದೆ;
ದಯವಿಟà³à²Ÿà³ ಹಿಂದಕà³à²•à³† ಹೋಗಿ ಈ ಫೈಲನà³à²¨à³ ಹೊಸ ಹೆಸರಿನಲà³à²²à²¿ ಅಪà³à²²à³‹à²¡à³ ಮಾಡಿ. [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'ಯಶಸà³à²µà²¿ ಅಪà³à²²à³‹à²¡à³',
'uploadwarning' => 'ಅಪà³à²²à³‹à²¡à³ ಎಚà³à²šà²°à²¿à²•à³†',
'savefile' => 'ಕಡತವನà³à²¨à³ ಉಳಿಸಿ',
'uploadedimage' => '"[[$1]]" ಅಪà³à²²à³‹à²¡à³ ಆಯಿತà³',
@@ -1110,6 +1105,7 @@ $2',
ನೀವೠಈ ಫೈಲನà³à²¨à³ ಅಪà³à²²à³‹à²¡à³ ಮಾಡà³à²µà³à²¦à³ ಸರಿಯೇ ಎಂದೠಮತà³à²¤à³Šà²®à³à²®à³† ಪರೀಕà³à²·à²¿à²¸à²¿.
ತೀರà³à²®à²¾à²¨à²•à³à²•à³† ಪೂರಕವಾಗಲೠಈ ಫೈಲಿನ ಅಳಿಸà³à²µà²¿à²•à³† ದಾಖಲೆಯನà³à²¨à³ ನೀಡಲಾಗಿದೆ:",
+'upload-success-subj' => 'ಯಶಸà³à²µà²¿ ಅಪà³à²²à³‹à²¡à³',
'upload-file-error' => 'ಆಂತರಿಕ ದೋಷ',
'upload-file-error-text' => 'ಸರà³à²µà²°à³â€à²¨à²²à³à²²à²¿ ತಾತà³à²•à²¾à²²à²¿à²• ಫೈಲನà³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à³à²µà²²à³à²²à²¿ ಒಂದೠಆಂತರಿಕ ದೋಷವಾಯಿತà³.
@@ -1371,7 +1367,6 @@ $2',
# Watchlist
'watchlist' => 'ವೀಕà³à²·à²£à²¾ ಪಟà³à²Ÿà²¿',
'mywatchlist' => 'ನನà³à²¨ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿',
-'watchlistfor' => "('''$1''' ಅವರ)",
'nowatchlist' => 'ನಿಮà³à²® ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²²à³à²²à²¿ ಯಾವà³à²¦à³‡ ಪà³à²Ÿà²—ಳಿಲà³à²²',
'watchlistanontext' => 'ನಿಮà³à²® ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²¨à³à²¨à³ ನೋಡಲೠಅಥವ ಸಂಪಾದಿಸಲೠದಯವಿಟà³à²Ÿà³ $1 ಮಾಡಿ.',
'watchnologin' => 'ಲಾಗಿನೠಆಗಿಲà³à²²',
@@ -1573,7 +1568,6 @@ $2',
'ipb-edit-dropdown' => 'ತಡೆಹಿಡಿಯà³à²µà²¿à²•à³† ಕಾರಣಗಳನà³à²¨à³ ಸಂಪಾದಿಸà³',
'ipb-unblock-addr' => '$1 ಖಾತೆಯ ತಡೆಯನà³à²¨à³ ತೆಗೆ',
'ipb-unblock' => 'ಬಳಕೆದಾರರ ಅಥವ IP ವಿಳಾಸದ ತಡೆಯನà³à²¨à³ ತೆಗೆ',
-'ipb-blocklist-addr' => '$1 ಖಾತೆಯ ಪà³à²°à²¸à²•à³à²¤ ತಡೆಗಳನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à³',
'ipb-blocklist' => 'ಅಸà³à²¥à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²°à³à²µ ತಡೆಗಳನà³à²¨à³ ನೋಡà³',
'unblockip' => 'ಬಳಕೆದಾರನ ತಡೆಯನà³à²¨à³ ತೆಗೆ',
'ipusubmit' => 'ಈ ವಿಳಾಸದ ತಡೆಯನà³à²¨à³ ತೆಗೆ',
@@ -1816,10 +1810,10 @@ $1',
# Media information
'thumbsize' => 'ಕಿರà³à²¨à³‹à²Ÿà²¦ ಗಾತà³à²°:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|ಪà³à²Ÿ|ಪà³à²Ÿà²—ಳà³}}',
-'file-info' => '(ಫೈಲಿನ ಗಾತà³à²°: $1, MIME ಪà³à²°à²•à²¾à²°: $2)',
-'file-info-size' => '($1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³, ಫೈಲಿನ ಗಾತà³à²°: $3, MIME ಪà³à²°à²•à²¾à²°: $4)',
+'file-info' => 'ಫೈಲಿನ ಗಾತà³à²°: $1, MIME ಪà³à²°à²•à²¾à²°: $2',
+'file-info-size' => '$1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³, ಫೈಲಿನ ಗಾತà³à²°: $3, MIME ಪà³à²°à²•à²¾à²°: $4',
'file-nohires' => '<small>ಇದಕà³à²•à²¿à²‚ತ ಹೆಚà³à²šà²¿à²¨ ವಿವರವಾದ ನೋಟ ಇಲà³à²².</small>',
-'svg-long-desc' => '(SVG ಫೈಲà³, ಸà³à²®à²¾à²°à²¾à²—ಿ $1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³à²—ಳà³, ಫೈಲಿನ ಗಾತà³à²°: $3)',
+'svg-long-desc' => 'SVG ಫೈಲà³, ಸà³à²®à²¾à²°à²¾à²—ಿ $1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³à²—ಳà³, ಫೈಲಿನ ಗಾತà³à²°: $3',
'show-big-image' => 'ಅತಿ ಹೆಚà³à²šà³ ವಿವರವಾದ ನೋಟ',
'show-big-image-thumb' => '<small>ಈ ಮà³à²¨à³à²¨à³‹à²Ÿà²¦ ಅಳತೆ: $1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³à²—ಳà³</small>',
@@ -2095,6 +2089,14 @@ $5
# Special:Tags
'tags-edit' => 'ಸಂಪಾದಿಸಿ',
+# Special:ComparePages
+'comparepages' => 'ಪà³à²Ÿà²—ಳನà³à²¨à³ ಹೋಲಿಸà³',
+'compare-page1' => 'ಪà³à²Ÿ ೧',
+'compare-page2' => 'ಪà³à²Ÿ ೨',
+'compare-rev1' => 'ಆವೃತà³à²¤à²¿ ೧',
+'compare-rev2' => 'ಆವೃತà³à²¤à²¿ ೨',
+'compare-submit' => 'ಹೋಲಿಸà³',
+
# HTML forms
'htmlform-selectorother-other' => 'ಇತರ',
diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php
index ad1a24b6..0db8232d 100644
--- a/languages/messages/MessagesKo.php
+++ b/languages/messages/MessagesKo.php
@@ -8,8 +8,10 @@
* @file
*
* @author Albamhandae
+ * @author Devunt
* @author Ficell
* @author Gapo
+ * @author Gjue
* @author IRTC1015
* @author ITurtle
* @author Klutzy
@@ -54,9 +56,9 @@ $specialPageAliases = array(
'Disambiguations' => array( 'ë™ìŒì´ì˜', 'ë™ìŒì´ì˜ë¬¸ì„œ' ),
'Userlogin' => array( '로그ì¸' ),
'Userlogout' => array( '로그아웃' ),
- 'CreateAccount' => array( '계정만들기' ),
+ 'CreateAccount' => array( '계정만들기', '가입' ),
'Preferences' => array( '환경설정' ),
- 'Watchlist' => array( '주시문서목ë¡' ),
+ 'Watchlist' => array( '주시문서목ë¡', '주시목ë¡' ),
'Recentchanges' => array( '최근바뀜' ),
'Upload' => array( '파ì¼ì˜¬ë¦¬ê¸°', '그림올리기' ),
'Listfiles' => array( '파ì¼', '그림', '파ì¼ëª©ë¡', '그림목ë¡' ),
@@ -93,13 +95,15 @@ $specialPageAliases = array(
'Allpages' => array( '모든문서' ),
'Prefixindex' => array( 'ì ‘ë‘어찾기' ),
'Ipblocklist' => array( '차단ëœì‚¬ìš©ìž', '차단목ë¡' ),
- 'Specialpages' => array( '특수기능' ),
+ 'Unblock' => array( '차단해제' ),
+ 'Specialpages' => array( '특수문서', '특수기능' ),
'Contributions' => array( '기여', '기여목ë¡', '사용ìžê¸°ì—¬' ),
'Emailuser' => array( 'ì´ë©”ì¼ë³´ë‚´ê¸°' ),
'Confirmemail' => array( 'ì´ë©”ì¼ì¸ì¦' ),
'Whatlinkshere' => array( '가리키는문서', 'ë§í¬í•˜ëŠ”문서' ),
'Recentchangeslinked' => array( 'ë§í¬ìµœê·¼ë°”뀜' ),
'Movepage' => array( 'ì´ë™', '문서ì´ë™' ),
+ 'Blockme' => array( 'ìžê°€ì°¨ë‹¨' ),
'Booksources' => array( '책찾기' ),
'Categories' => array( '분류' ),
'Export' => array( '내보내기' ),
@@ -135,7 +139,7 @@ $specialPageAliases = array(
'LinkSearch' => array( '외부ë§í¬ì°¾ê¸°', '외부ë§í¬ê²€ìƒ‰' ),
'DeletedContributions' => array( 'ì‚­ì œëœê¸°ì—¬' ),
'Tags' => array( '태그' ),
- 'Activeusers' => array( '활ë™ì¤‘ì¸ì‚¬ìš©ìž' ),
+ 'Activeusers' => array( '활ë™ì ì¸ì‚¬ìš©ìž' ),
);
$magicWords = array(
@@ -145,7 +149,9 @@ $magicWords = array(
'forcetoc' => array( '0', '__목차보임__', '__FORCETOC__' ),
'toc' => array( '0', '__목차__', '__TOC__' ),
'noeditsection' => array( '0', '__단ë½íŽ¸ì§‘숨김__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__í—¤ë”숨김__', '__NOHEADER__' ),
'currentmonth' => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', '현재월1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', '현재월ì´ë¦„', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', '현재월ì´ë¦„소유격', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', '현재월ì´ë¦„약ìž', 'CURRENTMONTHABBREV' ),
@@ -156,6 +162,7 @@ $magicWords = array(
'currenttime' => array( '1', '현재시분', '현재시ê°', 'CURRENTTIME' ),
'currenthour' => array( '1', '현재시', 'CURRENTHOUR' ),
'localmonth' => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', '지역월1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', '지역월ì´ë¦„', 'LOCALMONTHNAME' ),
'localmonthnamegen' => array( '1', '지역월ì´ë¦„소유격', 'LOCALMONTHNAMEGEN' ),
'localmonthabbrev' => array( '1', '지역월ì´ë¦„약ìž', 'LOCALMONTHABBREV' ),
@@ -190,7 +197,9 @@ $magicWords = array(
'talkpagenamee' => array( '1', '토론문서ì´ë¦„E', 'TALKPAGENAMEE' ),
'subjectpagename' => array( '1', '본문서ì´ë¦„', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', '본문서ì´ë¦„E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', '메시지:', 'MSG:' ),
'subst' => array( '0', '풀기:', 'SUBST:' ),
+ 'safesubst' => array( '0', '안전풀기:', 'SAFESUBST:' ),
'img_thumbnail' => array( '1', '섬네ì¼', 'ì¸ë„¤ì¼', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', '섬네ì¼=$1', 'ì¸ë„¤ì¼=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', '오른쪽', 'right' ),
@@ -199,7 +208,15 @@ $magicWords = array(
'img_width' => array( '1', '$1픽셀', '$1px' ),
'img_center' => array( '1', '가운ë°', 'center', 'centre' ),
'img_framed' => array( '1', '프레임', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', '프레임없ìŒ', 'frameless' ),
+ 'img_page' => array( '1', '문서=$1', 'page=$1', 'page $1' ),
'img_border' => array( '1', 'í…Œë‘리', 'border' ),
+ 'img_baseline' => array( '1', '밑줄', 'baseline' ),
+ 'img_sub' => array( '1', '아래첨ìž', 'sub' ),
+ 'img_super' => array( '1', '위첨ìž', 'super', 'sup' ),
+ 'img_top' => array( '1', '위', 'top' ),
+ 'img_middle' => array( '1', '중간', 'middle' ),
+ 'img_bottom' => array( '1', '아래', 'bottom' ),
'img_link' => array( '1', 'ë§í¬=$1', 'link=$1' ),
'sitename' => array( '1', '사ì´íŠ¸ì´ë¦„', 'SITENAME' ),
'ns' => array( '0', 'ì´ë¦„:', 'ì´ë¦„공간:', 'NS:' ),
@@ -208,7 +225,10 @@ $magicWords = array(
'localurle' => array( '0', '지역주소E:', 'LOCALURLE:' ),
'server' => array( '0', '서버', 'SERVER' ),
'servername' => array( '0', '서버ì´ë¦„', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', '스í¬ë¦½íŠ¸ê²½ë¡œ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', '스타ì¼ê²½ë¡œ', 'STYLEPATH' ),
'grammar' => array( '0', '문법:', 'GRAMMAR:' ),
+ 'gender' => array( '0', '성별:', 'GENDER:' ),
'currentweek' => array( '1', '현재주', 'CURRENTWEEK' ),
'currentdow' => array( '1', '현재요ì¼ìˆ«ìž', 'CURRENTDOW' ),
'localweek' => array( '1', '지역주', 'LOCALWEEK' ),
@@ -217,8 +237,10 @@ $magicWords = array(
'revisionday' => array( '1', 'íŒì¼', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'íŒì¼2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'íŒì›”', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'íŒì›”1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'íŒë…„', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'íŒíƒ€ìž„스탬프', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'íŒì‚¬ìš©ìž', 'REVISIONUSER' ),
'plural' => array( '0', '복수:', '복수형:', 'PLURAL:' ),
'fullurl' => array( '0', '전체주소:', 'FULLURL:' ),
'fullurle' => array( '0', '전체주소E:', 'FULLURLE:' ),
@@ -245,6 +267,8 @@ $magicWords = array(
'hiddencat' => array( '1', '__숨ì€ë¶„류__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', '분류문서수', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', '문서í¬ê¸°', 'PAGESIZE' ),
+ 'index' => array( '1', '__색ì¸__', '__INDEX__' ),
+ 'noindex' => array( '1', '__색ì¸ê±°ë¶€__', '__NOINDEX__' ),
'numberingroup' => array( '1', '권한별사용ìžìˆ˜', '그룹별사용ìžìˆ˜', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
@@ -269,7 +293,7 @@ $dateFormats = array(
$messages = array(
# User preference toggles
-'tog-underline' => 'ë§í¬ì— 밑줄치기:',
+'tog-underline' => 'ë§í¬ 걸기:',
'tog-highlightbroken' => '없는 문서로 ì—°ê²°ëœ ë§í¬ë¥¼ <a href="" class="new">ì´ë ‡ê²Œ</a> ë³´ì´ê¸° (ì„ íƒí•˜ì§€ 않으면 ì´ë ‡ê²Œ<a href="" class="internal">?</a> ë³´ìž„)',
'tog-justify' => '문단 정렬하기',
'tog-hideminor' => '사소한 íŽ¸ì§‘ì„ ìµœê·¼ 바뀜ì—ì„œ 숨기기',
@@ -283,8 +307,7 @@ $messages = array(
'tog-editsection' => '[편집] ë§í¬ë¡œ 부분 편집하기',
'tog-editsectiononrightclick' => 'ì œëª©ì„ ì˜¤ë¥¸ìª½ í´ë¦­í•´ì„œ 부분 편집하기 (ìžë°”스í¬ë¦½íŠ¸)',
'tog-showtoc' => 'ë¬¸ì„œì˜ ì°¨ë¡€ 보여주기 (ë¨¸ë¦¿ê¸€ì´ 4ê°œ ì´ìƒì¸ 경우)',
-'tog-rememberpassword' => 'ì´ ì»´í“¨í„°ì—ì„œ ìžë™ìœ¼ë¡œ 로그ì¸',
-'tog-editwidth' => '편집창 너비를 화면 최대로 맞추기',
+'tog-rememberpassword' => 'ì´ ë¸Œë¼ìš°ì €ì—ì„œ ë¡œê·¸ì¸ ìƒíƒœë¥¼ 저장하기 (최대 $1ì¼)',
'tog-watchcreations' => 'ë‚´ê°€ ì²˜ìŒ ë§Œë“œëŠ” 문서를 주시문서 목ë¡ì— 추가',
'tog-watchdefault' => 'ë‚´ê°€ 편집하는 문서를 주시문서 목ë¡ì— 추가',
'tog-watchmoves' => 'ë‚´ê°€ ì´ë™í•˜ëŠ” 문서를 주시문서 목ë¡ì— 추가',
@@ -425,35 +448,25 @@ $messages = array(
'qbpageinfo' => '문서 정보',
'qbmyoptions' => '내 문서',
'qbspecialpages' => '특수 문서',
-'faq' => 'FAQ',
+'faq' => 'ìžì£¼ 묻는 질문',
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => '새 주제',
-'vector-action-delete' => '삭제',
-'vector-action-move' => 'ì´ë™',
-'vector-action-protect' => '보호',
-'vector-action-undelete' => 'ë˜ì‚´ë¦¬ê¸°',
-'vector-action-unprotect' => '보호 해제',
-'vector-namespace-category' => '분류',
-'vector-namespace-help' => 'ë„움ë§',
-'vector-namespace-image' => '파ì¼',
-'vector-namespace-main' => '문서',
-'vector-namespace-media' => '미디어 문서',
-'vector-namespace-mediawiki' => '메시지',
-'vector-namespace-project' => '프로ì íŠ¸ 문서',
-'vector-namespace-special' => '특수 문서',
-'vector-namespace-talk' => '토론',
-'vector-namespace-template' => 'í‹€',
-'vector-namespace-user' => 'ì‚¬ìš©ìž ë¬¸ì„œ',
-'vector-view-create' => 'ìƒì„±',
-'vector-view-edit' => '편집',
-'vector-view-history' => '역사',
-'vector-view-view' => 'ì½ê¸°',
-'vector-view-viewsource' => '내용 보기',
-'actions' => '행위',
-'namespaces' => 'ì´ë¦„공간',
-'variants' => '변수',
+'vector-action-addsection' => '새 주제',
+'vector-action-delete' => '삭제',
+'vector-action-move' => 'ì´ë™',
+'vector-action-protect' => '보호',
+'vector-action-undelete' => 'ë˜ì‚´ë¦¬ê¸°',
+'vector-action-unprotect' => '보호 해제',
+'vector-simplesearch-preference' => 'í–¥ìƒëœ 검색어 제안 사용하기 (벡터 스킨 ì „ìš©)',
+'vector-view-create' => 'ìƒì„±',
+'vector-view-edit' => '편집',
+'vector-view-history' => '역사',
+'vector-view-view' => 'ì½ê¸°',
+'vector-view-viewsource' => '내용 보기',
+'actions' => '행위',
+'namespaces' => 'ì´ë¦„공간',
+'variants' => '변수',
'errorpagetitle' => '오류',
'returnto' => '$1(으)ë¡œ ëŒì•„갑니다.',
@@ -514,6 +527,9 @@ $messages = array(
ì´ ë¬¸ì„œë¥¼ 다시 열기 ì „ì— ìž ì‹œë§Œ 기다려주세요.
$1',
+'pool-timeout' => '잠금 대기 중 타임아웃',
+'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}} 소개',
@@ -673,7 +689,8 @@ $2',
'yourname' => '계정 ì´ë¦„:',
'yourpassword' => '비밀번호:',
'yourpasswordagain' => '암호 재입력:',
-'remembermypassword' => 'ë¡œê·¸ì¸ ìƒíƒœë¥¼ 저장하기',
+'remembermypassword' => 'ì´ ì»´í“¨í„°ì—ì„œ ë¡œê·¸ì¸ ìƒíƒœë¥¼ 저장하기 (최대 $1ì¼)',
+'securelogin-stick-https' => 'ë¡œê·¸ì¸ í›„ì—ë„ HTTPS ì—°ê²° ìƒíƒœë¥¼ 유지합니다.',
'yourdomainname' => 'ë„ë©”ì¸ ì´ë¦„',
'externaldberror' => '외부 ì¸ì¦ ë°ì´í„°ë² ì´ìŠ¤ì— 오류가 있거나, 외부 ê³„ì •ì„ ê°±ì‹ í•  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
'login' => '로그ì¸',
@@ -690,6 +707,7 @@ $2',
'gotaccount' => "ê³„ì •ì´ ì´ë¯¸ 있다면, '''$1'''.",
'gotaccountlink' => '로그ì¸í•˜ì„¸ìš”',
'createaccountmail' => 'ì´ë©”ì¼ë¡œ 보내기',
+'createaccountreason' => 'ì´ìœ :',
'badretype' => '암호가 서로 다릅니다.',
'userexists' => '입력하신 ì‚¬ìš©ìž ì´ë¦„ì´ ì´ë¯¸ 등ë¡ë˜ì–´ 있습니다.
다른 ì´ë¦„으로 만들어주십시오.',
@@ -711,6 +729,7 @@ $2',
다시 ì‹œë„í•´ 주세요.',
'passwordtooshort' => '암호는 ì ì–´ë„ $1ìžë³´ë‹¤ 길어야 합니다.',
'password-name-match' => '암호는 반드시 ì‚¬ìš©ìž ì´ë¦„ê³¼ 달ë¼ì•¼ 합니다.',
+'password-login-forbidden' => 'ì´ ê³„ì •ëª…ê³¼ ë¹„ë°€ë²ˆí˜¸ì˜ ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì–´ 있습니다.',
'mailmypassword' => '새 암호를 ì´ë©”ì¼ë¡œ 보내기',
'passwordremindertitle' => '{{SITENAME}}ì—ì„œ 보내는 새 ìž„ì‹œ 암호',
'passwordremindertext' => 'IP 주소 $1ì—ì„œ 당신ì—게 {{SITENAME}} ($4)ì˜ ìƒˆ 암호를 보내달ë¼ê³  요청했습니다.
@@ -745,6 +764,9 @@ $2',
'loginlanguagelabel' => '언어: $1',
'suspicious-userlogout' => '브ë¼ìš°ì €ì˜ ì´ìƒì´ 있거나 ìºì‹± 프ë¡ì‹œì—ì„œ ë¡œê·¸ì•„ì›ƒì„ ìš”ì²­í–ˆê¸° ë•Œë¬¸ì— ë¡œê·¸ì•„ì›ƒì´ ê±°ë¶€ë˜ì—ˆìŠµë‹ˆë‹¤.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHPì˜ mail() 함수ì—ì„œ ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+
# Password reset dialog
'resetpass' => '비밀번호 바꾸기',
'resetpass_announce' => 'ì´ë©”ì¼ë¡œ ë°›ì€ ìž„ì‹œ 암호로 로그ì¸í–ˆìŠµë‹ˆë‹¤. 로그ì¸ì„ 마치려면 새 암호를 입력해 주세요:',
@@ -793,10 +815,11 @@ $2',
'showlivepreview' => '실시간 미리 보기',
'showdiff' => 'ì°¨ì´ ë³´ê¸°',
'anoneditwarning' => "'''주ì˜''': 로그ì¸í•˜ê³  있지 않습니다. ë‹¹ì‹ ì˜ IP 주소가 문서 ì—­ì‚¬ì— ë‚¨ê²Œ ë©ë‹ˆë‹¤.",
+'anonpreviewwarning' => "'''ë‹¹ì‹ ì€ ì§€ê¸ˆ 로그ì¸í•˜ê³  있지 않습니다. 문서를 저장하면 ë‹¹ì‹ ì˜ IP 주소가 문서 ì—­ì‚¬ì— ë‚¨ê²Œ ë©ë‹ˆë‹¤.'''",
'missingsummary' => "'''알림:''' 편집 ìš”ì•½ì„ ì ì§€ 않았습니다. 그대로 저장하면 편집 요약 ì—†ì´ ì €ìž¥ë©ë‹ˆë‹¤.",
'missingcommenttext' => 'ì•„ëž˜ì— ë‚´ìš©ì„ ì±„ì›Œ 넣어 주세요.',
'missingcommentheader' => "'''알림:''' ê¸€ì˜ ì œëª©ì„ ìž…ë ¥í•˜ì§€ 않았습니다.
-다시 저장 ë²„íŠ¼ì„ í´ë¦­í•˜ë©´, ê¸€ì´ ì œëª© ì—†ì´ ì €ìž¥ë  ê²ƒìž…ë‹ˆë‹¤.",
+다시 {{int:savearticle}} ë²„íŠ¼ì„ í´ë¦­í•˜ë©´ ê¸€ì´ ì œëª© ì—†ì´ ì €ìž¥ë©ë‹ˆë‹¤.",
'summary-preview' => '편집 요약 미리 보기:',
'subject-preview' => '주제/제목 미리 보기:',
'blockedtitle' => '차단ë¨',
@@ -861,8 +884,12 @@ $1, ë˜ëŠ” [[{{MediaWiki:Grouppage-sysop}}|다른 관리ìž]]ì—게 ì°¨ë‹¨ì— ëŒ
'userjsyoucanpreview' => "'''안내''': JS 문서를 저장하기 ì „ì— â€˜{{int:showpreview}}’ ê¸°ëŠ¥ì„ í†µí•´ ìž‘ë™ì„ 확ì¸í•´ì£¼ì„¸ìš”.",
'usercsspreview' => "'''ì´ê²ƒì€ ì‚¬ìš©ìž CSSì˜ ë¯¸ë¦¬ 보기ì´ë©°, ì•„ì§ ì €ìž¥í•˜ì§€ 않았다는 ê²ƒì„ ì£¼ì˜í•´ 주세요!'''",
'userjspreview' => "'''ì´ê²ƒì€ ìžë°”스í¬ë¦½íŠ¸ 미리 보기로, ì•„ì§ ì €ìž¥í•˜ì§€ 않았다는 ê²ƒì„ ì£¼ì˜í•´ 주세요!'''",
+'sitecsspreview' => "'''ì´ê²ƒì€ ì´ CSSì˜ ë¯¸ë¦¬ ë³´ê¸°ì¼ ë¿ìž…니다.'''
+'''ì•„ì§ ì €ìž¥í•˜ì§€ 않았다는 ê²ƒì„ ì£¼ì˜í•´ 주세요!'''",
+'sitejspreview' => "'''ì´ê²ƒì€ ì´ ìžë°”스í¬ë¦½íŠ¸ ì½”ë“œì˜ ë¯¸ë¦¬ ë³´ê¸°ì¼ ë¿ìž…니다.'''
+'''ì•„ì§ ì €ìž¥í•˜ì§€ 않았다는 ê²ƒì„ ì£¼ì˜í•´ 주세요!'''",
'userinvalidcssjstitle' => "'''경고''': ‘$1’ ìŠ¤í‚¨ì€ ì—†ìŠµë‹ˆë‹¤.
-.css와 .js ë¬¸ì„œì˜ ì œëª©ì€ {{ns:user}}:Foo/monobook.css 처럼 소문ìžë¡œ ì¨ì•¼ 합니다. {{ns:user}}:Foo/Monobook.css 와 ê°™ì´ ëŒ€ë¬¸ìžë¡œ 쓸 경우 ìž‘ë™í•˜ì§€ 않습니다.",
+.css와 .js ë¬¸ì„œì˜ ì œëª©ì€ {{ns:user}}:Foo/vector.css 처럼 소문ìžë¡œ ì¨ì•¼ 합니다. {{ns:user}}:Foo/Vector.css 와 ê°™ì´ ëŒ€ë¬¸ìžë¡œ 쓸 경우 ìž‘ë™í•˜ì§€ 않습니다.",
'updated' => '(바뀜)',
'note' => "'''주ì˜:'''",
'previewnote' => "'''지금 미리 보기로 ë³´ê³  있는 ë‚´ìš©ì€ ì•„ì§ ì €ìž¥ë˜ì§€ 않았습니다!'''",
@@ -896,7 +923,6 @@ $1, ë˜ëŠ” [[{{MediaWiki:Grouppage-sysop}}|다른 관리ìž]]ì—게 ì°¨ë‹¨ì— ëŒ
'copyrightwarning2' => "{{SITENAME}}ì—ì„œì˜ ëª¨ë“  기여는 다른 사용ìžê°€ 편집, 수정, 삭제할 수 있다는 ì ì„ 유ì˜í•´ 주세요. 만약 ì—¬ê¸°ì— ë™ì˜í•˜ì§€ 않는다면, 문서를 저장하지 ë§ì•„ 주세요.<br />
ë˜í•œ, ì§ì ‘ 작성했거나 í¼ë¸”릭 ë„ë©”ì¸ê³¼ ê°™ì€ ìžìœ  문서ì—ì„œ 가져왔다는 ê²ƒì„ ë³´ì¦í•´ì•¼ 합니다 (ìžì„¸í•œ ë‚´ìš©ì— ëŒ€í•´ì„œëŠ” $1 문서를 ì½ì–´ 주세요).
'''ì €ìž‘ê¶Œì´ ìžˆëŠ” ë‚´ìš©ì„ í—ˆê°€ ì—†ì´ ì €ìž¥í•˜ì§€ 마세요!'''",
-'longpagewarning' => "'''주ì˜: ì´ ë¬¸ì„œì˜ ìš©ëŸ‰ì´ $1킬로바ì´íŠ¸ìž…니다. 몇몇 웹 브ë¼ìš°ì €ì—서는 32킬로바ì´íŠ¸ ì´ìƒì˜ 문서를 편집할 ë•Œ 문제가 ë°œìƒí•  수 있습니다. ë§Œì•½ì˜ ê²½ìš°ë¥¼ 대비하여, 문서를 여러 문단으로 나누어서 편집할 수 있습니다.'''",
'longpageerror' => "'''오류: ë¬¸ì„œì˜ í¬ê¸°ê°€ $1킬로바ì´íŠ¸ë¡œì„œ 가능한 최대 í¬ê¸°ì¸ $2킬로바ì´íŠ¸ë³´ë‹¤ í½ë‹ˆë‹¤. 저장할 수 없습니다.'''",
'readonlywarning' => "'''주ì˜: ë°ì´í„°ë² ì´ìŠ¤ê°€ 관리를 위해 잠겨 있습니다. ë”°ë¼ì„œ 문서를 편집한 ë‚´ìš©ì„ ì§€ê¸ˆ 저장할 수 없습니다.
편집 ë‚´ìš©ì„ ë³µì‚¬ 붙여넣기 ë“±ì„ ì‚¬ìš©í•˜ì—¬ ì¼ë‹¨ 다른 ê³³ì— ì €ìž¥í•œ 후, ë‚˜ì¤‘ì— ë‹¤ì‹œ ì‹œë„í•´ 주세요.'''
@@ -1074,6 +1100,8 @@ $1",
'logdelete-failure' => "'''로그 ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì§€ 못했습니다:'''
$1",
'revdel-restore' => 'ë³´ì´ê¸° 설정 변경',
+'revdel-restore-deleted' => 'ì‚­ì œëœ íŒ',
+'revdel-restore-visible' => 'ê³µê°œëœ íŒ',
'pagehist' => '문서 역사',
'deletedhist' => 'ì‚­ì œëœ ì—­ì‚¬',
'revdelete-content' => 'ë‚´ìš©',
@@ -1143,11 +1171,13 @@ $1",
# Diffs
'history-title' => '‘$1’ ë¬¸ì„œì˜ ë³€ê²½ ë‚´ë ¥',
'difference' => '(버전 사ì´ì˜ ì°¨ì´)',
+'difference-multipage' => '(ë¬¸ì„œê°„ì˜ ì°¨ì´)',
'lineno' => '$1번째 줄:',
'compareselectedversions' => 'ì„ íƒëœ íŒë“¤ì„ 비êµí•˜ê¸°',
'showhideselectedversions' => 'ì„ íƒí•œ íŒì„ ë³´ì´ê¸°/숨기기',
'editundo' => '편집 취소',
-'diff-multi' => '(ì¤‘ê°„ì˜ íŽ¸ì§‘ $1 ê°œ 숨겨ì§)',
+'diff-multi' => '({{PLURAL:$2|í•œ 사용ìžì˜|ì‚¬ìš©ìž $2명ì˜}} ì¤‘ê°„ì˜ íŽ¸ì§‘ $1ê°œ 숨겨ì§)',
+'diff-multi-manyusers' => '({{PLURAL:$2|í•œ 사용ìžì˜|ì‚¬ìš©ìž $2명 ì´ìƒì˜}} ì¤‘ê°„ì˜ íŽ¸ì§‘ $1ê°œ 숨겨ì§)',
# Search results
'searchresults' => '검색 결과',
@@ -1182,6 +1212,7 @@ $1",
'searchprofile-everything-tooltip' => '토론 문서를 í¬í•¨í•œ 모든 문서 찾기',
'searchprofile-advanced-tooltip' => 'ë‹¤ìŒ ì„¤ì •ëœ ì´ë¦„공간ì—ì„œ 찾기',
'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ì—ì„œ 넘어옴)',
'search-section' => '($1 문단)',
@@ -1256,6 +1287,7 @@ $1",
'contextlines' => '결과마다 ë³´ì´ëŠ” 줄 수:',
'contextchars' => 'ê° ì¤„ì— ë³´ì´ëŠ” 글 수:',
'stub-threshold' => 'ë§í¬ë¥¼ <a href="#" class="stub">토막글</a> 형ì‹ìœ¼ë¡œ 표시할 문서 í¬ê¸° (ë°”ì´íŠ¸ 수):',
+'stub-threshold-disabled' => '비활성화ë¨',
'recentchangesdays' => '최근 ë°”ë€œì— í‘œì‹œí•  날짜 수:',
'recentchangesdays-max' => '(최대 $1ì¼)',
'recentchangescount' => '기본으로 표시할 편집 수:',
@@ -1289,6 +1321,7 @@ $1",
'prefs-files' => '파ì¼',
'prefs-custom-css' => 'ì‚¬ìš©ìž CSS',
'prefs-custom-js' => 'ì‚¬ìš©ìž ìžë°”스í¬ë¦½íŠ¸',
+'prefs-common-css-js' => '모든 ìŠ¤í‚¨ì— ì ìš©ë˜ëŠ” 공통 CSS/ìžë°”스í¬ë¦½íŠ¸:',
'prefs-reset-intro' => 'ì´ ì‚¬ì´íŠ¸ì˜ 기본 값으로 환경 ì„¤ì •ì„ ë˜ëŒë¦´ 수 있습니다.
복구할 수 없습니다.',
'prefs-emailconfirm-label' => 'ì´ë©”ì¼ ì¸ì¦:',
@@ -1324,9 +1357,15 @@ $1",
'prefs-advancedrendering' => '고급 설정',
'prefs-advancedsearchoptions' => '고급 설정',
'prefs-advancedwatchlist' => '고급 설정',
-'prefs-display' => 'ë³´ì´ê¸° 설정',
+'prefs-displayrc' => 'ë³´ì´ê¸° 설정',
+'prefs-displaysearchoptions' => '표시 설정',
+'prefs-displaywatchlist' => '표시 설정',
'prefs-diffs' => 'ì°¨ì´',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ 유효한 것으로 보입니다.',
+'email-address-validity-invalid' => '유효한 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력해주십시오.',
+
# User rights
'userrights' => 'ì‚¬ìš©ìž ê¶Œí•œ 관리',
'userrights-lookup-user' => 'ì‚¬ìš©ìž ê¶Œí•œ 관리',
@@ -1410,6 +1449,7 @@ $1",
'right-hideuser' => 'ì‚¬ìš©ìž ì´ë¦„ì„ ì°¨ë‹¨í•˜ê³  숨김',
'right-ipblock-exempt' => 'IP 차단, ìžë™ 차단, ê´‘ì—­ ì°¨ë‹¨ì„ ë¬´ì‹œ',
'right-proxyunbannable' => '프ë¡ì‹œ ìžë™ ì°¨ë‹¨ì„ ì ìš©í•˜ì§€ ì•ŠìŒ',
+'right-unblockself' => 'ìžê¸° ìžì‹ ì„ 차단 해제하기',
'right-protect' => '보호 수준 변경 ë° ë³´í˜¸ëœ ë¬¸ì„œ 편집',
'right-editprotected' => 'ë³´í˜¸ëœ ë¬¸ì„œ 편집 (ì—°ì‡„ì  ë³´í˜¸ 제외)',
'right-editinterface' => 'ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 편집',
@@ -1432,7 +1472,6 @@ $1",
'right-siteadmin' => 'ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 잠그거나 잠금 í•´ì œ',
'right-reset-passwords' => '다른 사용ìžì˜ 비밀번호를 변경',
'right-override-export-depth' => '5단계로 ë§í¬ëœ 문서를 í¬í•¨í•˜ì—¬ 문서를 내보내기',
-'right-versiondetail' => '소프트웨어 ë²„ì „ì— ëŒ€í•œ ìžì„¸í•œ 정보를 보기',
'right-sendemail' => '다른 사용ìžì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°',
# User rights log
@@ -1483,14 +1522,9 @@ $1",
'recentchanges-legend' => '최근 바뀜 설정',
'recentchangestext' => 'ìœ„í‚¤ì˜ ìµœê·¼ 바뀜 ë‚´ì—­ì´ ë‚˜ì™€ 있습니다.',
'recentchanges-feed-description' => 'ìœ„í‚¤ì˜ ìµœê·¼ 바뀜',
-'recentchanges-label-legend' => '범례: $1.',
-'recentchanges-legend-newpage' => '$1 - 새 문서',
'recentchanges-label-newpage' => '새로운 문서',
-'recentchanges-legend-minor' => '$1 - 사소한 편집',
'recentchanges-label-minor' => '사소한 편집',
-'recentchanges-legend-bot' => '$1 - 봇 편집',
'recentchanges-label-bot' => 'ë´‡ì˜ íŽ¸ì§‘',
-'recentchanges-legend-unpatrolled' => '$1 - 검토ë˜ì§€ ì•Šì€ íŽ¸ì§‘',
'recentchanges-label-unpatrolled' => 'ì•„ì§ ê²€í† ë˜ì§€ ì•Šì€ íŽ¸ì§‘',
'rcnote' => "다ìŒì€ $4 $5 ê¹Œì§€ì˜ '''$2'''ì¼ë™ì•ˆ ë°”ë€ '''$1'''ê°œì˜ ë¬¸ì„œìž…ë‹ˆë‹¤.",
'rcnotefrom' => "다ìŒì€ '''$2'''ì—서부터 ë°”ë€ '''$1'''ê°œì˜ ë¬¸ì„œìž…ë‹ˆë‹¤.",
@@ -1537,6 +1571,9 @@ $1",
'upload_directory_missing' => 'íŒŒì¼ ì˜¬ë¦¬ê¸°ìš© 디렉토리($1)ê°€ 없고 웹 서버가 ìƒì„±í•˜ì§€ 못했습니다.',
'upload_directory_read_only' => 'íŒŒì¼ ì €ìž¥ 디렉토리($1)ì— ì“°ê¸° ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
'uploaderror' => '올리기 오류',
+'upload-recreate-warning' => "'''경고: ì´ íŒŒì¼ë¡œ ëœ ì´ë¦„ì´ ì‚­ì œë˜ì—ˆê±°ë‚˜ 옮겨졌습니다.'''
+
+ì´ ë¬¸ì„œì˜ ìµœê·¼ ì‚­ì œ 기ë¡ê³¼ ì´ë™ 기ë¡ì„ 참고하십시오:",
'uploadtext' => "파ì¼ì„ 올리기 위해서는 ì•„ëž˜ì˜ ì–‘ì‹ì„ 채워주세요.
[[Special:FileList|íŒŒì¼ ëª©ë¡]]ì—ì„œ ì´ì „ì— ì˜¬ë¼ì˜¨ 파ì¼ì„ ì°¾ì„ ìˆ˜ 있습니다. [[Special:Log/upload|올리기 기ë¡]]ì—는 파ì¼ì´ 올ë¼ì˜¨ 기ë¡ì´ 남습니다. ì‚­ì œ 기ë¡ì€ [[Special:Log/delete|ì‚­ì œ 로그]]ì—ì„œ ë³¼ 수 있습니다.
@@ -1569,6 +1606,17 @@ $1",
'filetype-unwanted-type' => "'''\".\$1\"''' 확장ìžëŠ” 추천하지 않습니다. 추천하는 {{PLURAL:\$3|íŒŒì¼ í™•ìž¥ìž}}는 \$2입니다.",
'filetype-banned-type' => "{{plural:$3}}‘'''.$1'''’ 형ì‹ì˜ 파ì¼ì€ 올릴 수 없습니다. $2 형ì‹ë§Œ 사용할 수 있습니다.",
'filetype-missing' => '파ì¼ì— 확장ìž(‘.jpg’ 등)ê°€ 없습니다.',
+'empty-file' => 'ë‹¹ì‹ ì´ ì˜¬ë¦° 파ì¼ì´ 비어 있습니다.',
+'file-too-large' => '올리려는 파ì¼ì´ 너무 í½ë‹ˆë‹¤.',
+'filename-tooshort' => 'íŒŒì¼ ì´ë¦„ì´ ë„ˆë¬´ 짧습니다.',
+'filetype-banned' => 'ì´ëŸ¬í•œ ì¢…ë¥˜ì˜ íŒŒì¼ì€ 금지ë˜ì–´ 있습니다.',
+'verification-error' => 'ì´ íŒŒì¼ì€ íŒŒì¼ í™•ì¸ ì ˆì°¨ë¥¼ 통과하지 않았습니다.',
+'hookaborted' => 'ë‹¹ì‹ ì´ ìˆ˜ì •í•˜ë ¤ê³  í•œ ê²ƒì´ í™•ìž¥ 기능 í›…ì— ì˜í•´ 중지ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'illegal-filename' => 'ì´ íŒŒì¼ ì´ë¦„ì€ í—ˆìš©ë˜ì§€ 않습니다.',
+'overwrite' => '기존 파ì¼ì„ ë®ì–´ì“°ëŠ” ê²ƒì€ í—ˆìš©ë˜ì§€ 않습니다.',
+'unknown-error' => 'ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'tmp-create-error' => 'ìž„ì‹œ 파ì¼ì„ ìƒì„±í•  수 없습니다.',
+'tmp-write-error' => 'ìž„ì‹œ 파ì¼ì„ 작성하는 ë° ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
'large-file' => 'íŒŒì¼ í¬ê¸°ëŠ” $1ì„ ë„˜ì§€ 않는 ê²ƒì„ ì¶”ì²œí•©ë‹ˆë‹¤. ì´ íŒŒì¼ì˜ í¬ê¸°ëŠ” $2입니다.',
'largefileserver' => 'ì´ íŒŒì¼ì˜ í¬ê¸°ê°€ 서버ì—ì„œ í—ˆìš©ëœ ì„¤ì •ë³´ë‹¤ í½ë‹ˆë‹¤.',
'emptyfile' => '올리려는 파ì¼ì´ 빈 파ì¼ìž…니다.
@@ -1597,13 +1645,14 @@ $1",
파ì¼ì„ 업로드하길 ì›í•˜ì‹ ë‹¤ë©´ 뒤로 ëŒì•„가서 다른 ì´ë¦„으로 ì‹œë„í•´ 주시기 ë°”ëžë‹ˆë‹¤. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => '{{PLURAL:$1}}현재 올리고 있는 파ì¼ì´ 아래 파ì¼ê³¼ 중복ë©ë‹ˆë‹¤:',
'file-deleted-duplicate' => 'ì´ íŒŒì¼ê³¼ ê°™ì€ íŒŒì¼ ([[:$1]])ì´ ì´ì „ì— ì‚­ì œëœ ì ì´ 있습니다. 파ì¼ì„ 다시 올리기 ì „ì— ë¬¸ì„œì˜ ì‚­ì œ 기ë¡ì„ 확ì¸í•´ 주시기 ë°”ëžë‹ˆë‹¤.',
-'successfulupload' => '올리기 성공',
'uploadwarning' => '올리기 경고',
'uploadwarning-text' => 'ì•„ëž˜ì˜ íŒŒì¼ ì„¤ëª…ì„ ìˆ˜ì •í•˜ê³  다시 ì‹œë„í•´ 주세요.',
'savefile' => 'íŒŒì¼ ì €ìž¥',
'uploadedimage' => '‘[[$1]]’ 파ì¼ì„ 올렸습니다.',
'overwroteimage' => '‘[[$1]]’ 파ì¼ì˜ 새 ë²„ì „ì„ ì˜¬ë ¸ìŠµë‹ˆë‹¤.',
'uploaddisabled' => '올리기 비활성화ë¨',
+'copyuploaddisabled' => 'URLë¡œ íŒŒì¼ ì˜¬ë¦¬ê¸°ê°€ 비활성화ë˜ì–´ 있습니다.',
+'uploadfromurl-queued' => 'ë‹¹ì‹ ì˜ ì˜¬ë¦¬ê¸° ëª…ë ¹ì´ ê¸°ë¡ë˜ì—ˆìŠµë‹ˆë‹¤.',
'uploaddisabledtext' => 'íŒŒì¼ ì˜¬ë¦¬ê¸° ê¸°ëŠ¥ì´ ë¹„í™œì„±í™”ë˜ì–´ 있습니다.',
'php-uploaddisabledtext' => 'PHP íŒŒì¼ ì˜¬ë¦¬ê¸°ê°€ 비활성화ë˜ì—ˆìŠµë‹ˆë‹¤. íŒŒì¼ ì˜¬ë¦¬ê¸° ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤.',
'uploadscripted' => 'ì´ íŒŒì¼ì—는 HTMLì´ë‚˜ 다른 스í¬ë¦½íŠ¸ 코드가 í¬í•¨ë˜ì–´ 있어, 웹 브ë¼ìš°ì €ì—ì„œ 오류를 ì¼ìœ¼í‚¬ 수 있습니다.',
@@ -1638,6 +1687,14 @@ JD # 제놉틱
MGP # 펜íƒìŠ¤
PICT # 기타
#</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오. -->',
+'upload-success-subj' => '올리기 성공',
+'upload-success-msg' => '파ì¼ì„ [$2]ì—ì„œ 성공ì ìœ¼ë¡œ 올렸습니다. ë‹¹ì‹ ì´ ì˜¬ë¦° 파ì¼ì´ 여기 있습니다: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => '올리기 실패',
+'upload-failure-msg' => '[$2]ì—ì„œ 파ì¼ì„ 올리는 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤:
+
+$1',
+'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>ë¡œ 시작해야 합니다.',
@@ -1650,20 +1707,21 @@ PICT # 기타
'upload-http-error' => 'HTTP 오류 ë°œìƒ: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'ì ‘ê·¼ 거부ë¨',
-'img-auth-nopathinfo' => 'PATH_INFO 가 빠졌습니다.
+'img-auth-accessdenied' => 'ì ‘ê·¼ 거부ë¨',
+'img-auth-nopathinfo' => 'PATH_INFO 가 빠졌습니다.
ì„œë²„ì— ì´ ì •ë³´ê°€ 설정ë˜ì–´ 있지 않습니다.
CGI 기반ì´ê±°ë‚˜ img_auth 를 지ì›í•˜ì§€ ì•Šì„ ìˆ˜ 있습니다.
http://www.mediawiki.org/wiki/Manual:Image_Authorization 를 참고하세요.',
-'img-auth-notindir' => '요청한 경로가 설정한 업로드 ë””ë ‰í† ë¦¬ì— ì—†ìŠµë‹ˆë‹¤.',
-'img-auth-badtitle' => '"$1"ì—ì„œ 바른 ì œëª©ì„ ë§Œë“¤ 수 없습니다.',
-'img-auth-nologinnWL' => 'ë‹¹ì‹ ì€ ë¡œê·¸ì¸í•˜ì§€ 않았으며 "$1" 파ì¼ì€ í™”ì´íŠ¸ë¦¬ìŠ¤íŠ¸ì— 존재하지 않습니다.',
-'img-auth-nofile' => '"$1" 파ì¼ì´ 없습니다.',
-'img-auth-isdir' => '"$1" ë””ë ‰í† ë¦¬ì— ì ‘ê·¼ì„ ì‹œë„했습니다.
+'img-auth-notindir' => '요청한 경로가 설정한 업로드 ë””ë ‰í† ë¦¬ì— ì—†ìŠµë‹ˆë‹¤.',
+'img-auth-badtitle' => '"$1"ì—ì„œ 바른 ì œëª©ì„ ë§Œë“¤ 수 없습니다.',
+'img-auth-nologinnWL' => 'ë‹¹ì‹ ì€ ë¡œê·¸ì¸í•˜ì§€ 않았으며 "$1" 파ì¼ì€ í™”ì´íŠ¸ë¦¬ìŠ¤íŠ¸ì— 존재하지 않습니다.',
+'img-auth-nofile' => '"$1" 파ì¼ì´ 없습니다.',
+'img-auth-isdir' => '"$1" ë””ë ‰í† ë¦¬ì— ì ‘ê·¼ì„ ì‹œë„했습니다.
파ì¼ì—만 접근할 수 있습니다.',
-'img-auth-streaming' => '‘$1’ 파ì¼ì„ 전송하는 중입니다.',
-'img-auth-public' => 'img_auth.php는 ê°œì¸ ìœ„í‚¤ 파ì¼ì„ 외부 사ì´íŠ¸ë¡œ 전송하는 기능입니다. ì´ ê¸°ëŠ¥ì€ ê¸°ë³¸ì ìœ¼ë¡œ 공개ì ì¸ 위키ì—ì„œ 사용하ë„ë¡ ì„¤ê³„ë˜ì–´ 있으며, 보안ì ì¸ 문제로 기본ì ìœ¼ë¡œ img_auth.php ê¸°ëŠ¥ì€ ë¹„í™œì„±í™”ë˜ì–´ 있습니다.',
-'img-auth-noread' => '‘$1’ 파ì¼ì„ ë³¼ ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
+'img-auth-streaming' => '‘$1’ 파ì¼ì„ 전송하는 중입니다.',
+'img-auth-public' => 'img_auth.php는 ê°œì¸ ìœ„í‚¤ 파ì¼ì„ 외부 사ì´íŠ¸ë¡œ 전송하는 기능입니다. ì´ ê¸°ëŠ¥ì€ ê¸°ë³¸ì ìœ¼ë¡œ 공개ì ì¸ 위키ì—ì„œ 사용하ë„ë¡ ì„¤ê³„ë˜ì–´ 있으며, 보안ì ì¸ 문제로 기본ì ìœ¼ë¡œ img_auth.php ê¸°ëŠ¥ì€ ë¹„í™œì„±í™”ë˜ì–´ 있습니다.',
+'img-auth-noread' => '‘$1’ 파ì¼ì„ ë³¼ ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
+'img-auth-bad-query-string' => 'URLì— ìž˜ëª»ëœ ì¿¼ë¦¬ 문ìžì—´ì´ 있습니다.',
# HTTP errors
'http-invalid-url' => 'ìž˜ëª»ëœ URL: $1',
@@ -1696,6 +1754,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'listfiles_search_for' => 'ë‹¤ìŒ ì´ë¦„ì„ ê°€ì§„ 미디어 찾기:',
'imgfile' => '파ì¼',
'listfiles' => 'íŒŒì¼ ëª©ë¡',
+'listfiles_thumb' => '섬네ì¼',
'listfiles_date' => '날짜',
'listfiles_name' => 'ì´ë¦„',
'listfiles_user' => '사용ìž',
@@ -1811,8 +1870,8 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'statistics-edits' => '{{SITENAME}} 설치 후 ë¬¸ì„œì˜ ì „ì²´ 편집 횟수',
'statistics-edits-average' => '문서당 í‰ê·  편집 횟수',
'statistics-views-total' => 'ì´ ë°©ë¬¸ 수',
+'statistics-views-total-desc' => '존재하지 않는 문서나 특수 ë¬¸ì„œì— ëŒ€í•œ 방문수는 집계ë˜ì§€ 않았습니다.',
'statistics-views-peredit' => '편집당 방문 횟수',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job queue]ì˜ ê¸¸ì´',
'statistics-users' => '등ë¡ëœ [[Special:ListUsers|사용ìž]]',
'statistics-users-active' => '활ë™ì ì¸ 사용ìž',
'statistics-users-active-desc' => '최근 $1ì¼ ë™ì•ˆ 활ë™í•œ 사용ìž',
@@ -1827,7 +1886,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'doubleredirects' => 'ì´ì¤‘ 넘겨주기 목ë¡',
'doubleredirectstext' => 'ì´ ë¬¸ì„œëŠ” 다른 넘겨주기 문서로 넘겨주고 있는 ë¬¸ì„œì˜ ëª©ë¡ìž…니다.
매 줄ì—는 첫 번째 문서와 ë‘ ë²ˆì§¸ ë¬¸ì„œì˜ ë§í¬ê°€ 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 í•  "실제" ë¬¸ì„œì¸ ë‘ ë²ˆì§¸ ë„˜ê²¨ì£¼ê¸°ì˜ ëŒ€ìƒì´ 있습니다.
-<s>ì·¨ì†Œì„ ì´ ê·¸ì¸</s> ë¶€ë¶„ì€ ì´ë¯¸ í•´ê²°ë˜ì—ˆìŠµë‹ˆë‹¤.',
+<del>ì·¨ì†Œì„ ì´ ê·¸ì¸</del> ë¶€ë¶„ì€ ì´ë¯¸ í•´ê²°ë˜ì—ˆìŠµë‹ˆë‹¤.',
'double-redirect-fixed-move' => '[[$1]] 문서를 옮겼습니다. ì´ ë¬¸ì„œëŠ” ì´ì œ [[$2]] 문서로 넘겨ì¤ë‹ˆë‹¤.',
'double-redirect-fixer' => '넘겨주기 수리꾼',
@@ -1850,6 +1909,8 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'nmembers' => '문서 $1개',
'nrevisions' => '편집 $1개',
'nviews' => '$1 번 ì½ìŒ',
+'nimagelinks' => '{{PLURAL:$1}}ê°œ 문서ì—ì„œ 사용 중',
+'ntransclusions' => '{{PLURAL:$1}}ê°œ 문서ì—ì„œ 사용 중',
'specialpage-empty' => 'ëª…ë ¹ì— ëŒ€í•œ 결과가 없습니다.',
'lonelypages' => 'ì™¸í†¨ì´ ë¬¸ì„œ 목ë¡',
'lonelypagestext' => '{{SITENAME}}ì—ì„œ 다른 모든 문서ì—ì„œ ë§í¬ë˜ê±°ë‚˜ 틀로 í¬í•¨ë˜ì§€ ì•Šì€ ë¬¸ì„œì˜ ëª©ë¡ìž…니다.',
@@ -2006,34 +2067,40 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'listgrouprights-removegroup-self-all' => 'ìžì‹ ì˜ 계정ì—ì„œ 모든 ê¶Œí•œì„ í•´ì œ',
# E-mail user
-'mailnologin' => '보낼 ì´ë©”ì¼ ì£¼ì†Œê°€ ì—†ìŒ',
-'mailnologintext' => '다른 사용ìžì—게 ì´ë©”ì¼ì„ 보내려면, [[Special:UserLogin|로그ì¸]]í•œ ë‹¤ìŒ [[Special:Preferences|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì—ì„œ ìžì‹ ì˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 저장해야 합니다.',
-'emailuser' => 'ì´ë©”ì¼ ë³´ë‚´ê¸°',
-'emailpage' => '사용ìžì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°',
-'emailpagetext' => 'ì´ ì‚¬ìš©ìžê°€ 환경 ì„¤ì •ì— ì˜¬ë°”ë¥¸ ì´ë©”ì¼ ì£¼ì†Œë¥¼ ì ì—ˆë‹¤ë©´, 아래 ì–‘ì‹ì„ 통해 ì´ë©”ì¼ì„ 보낼 수 있습니다.
+'mailnologin' => '보낼 ì´ë©”ì¼ ì£¼ì†Œê°€ ì—†ìŒ',
+'mailnologintext' => '다른 사용ìžì—게 ì´ë©”ì¼ì„ 보내려면, [[Special:UserLogin|로그ì¸]]í•œ ë‹¤ìŒ [[Special:Preferences|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì—ì„œ ìžì‹ ì˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 저장해야 합니다.',
+'emailuser' => 'ì´ë©”ì¼ ë³´ë‚´ê¸°',
+'emailpage' => '사용ìžì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°',
+'emailpagetext' => 'ì´ ì‚¬ìš©ìžê°€ 환경 ì„¤ì •ì— ì˜¬ë°”ë¥¸ ì´ë©”ì¼ ì£¼ì†Œë¥¼ ì ì—ˆë‹¤ë©´, 아래 ì–‘ì‹ì„ 통해 ì´ë©”ì¼ì„ 보낼 수 있습니다.
ì´ë©”ì¼ì„ ë°›ì€ ì‚¬ìš©ìžê°€ 바로 답장할 수 있ë„ë¡ í•˜ê¸° 위해 ë‹¹ì‹ ì´ [[Special:Preferences|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì— ì ì€ ì´ë©”ì¼ ì£¼ì†Œê°€ "발신ìž" ì •ë³´ì— ë“¤ì–´ê°‘ë‹ˆë‹¤. ë”°ë¼ì„œ 수신ìžê°€ 당신ì—게 ì§ì ‘ ë‹µìž¥ì„ ë³´ë‚¼ 수 있습니다.',
-'usermailererror' => 'ë©”ì¼ ê°ì²´ì—ì„œ 오류 ë°œìƒ:',
-'defemailsubject' => '{{SITENAME}} ì´ë©”ì¼',
-'noemailtitle' => 'ì´ë©”ì¼ ì£¼ì†Œ ì—†ìŒ',
-'noemailtext' => 'ì´ ì‚¬ìš©ìžëŠ” 올바른 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하지 않았습니다.',
-'nowikiemailtitle' => 'ì´ë©”ì¼ì´ 허용ë˜ì§€ ì•ŠìŒ',
-'nowikiemailtext' => 'ì´ ì‚¬ìš©ìžëŠ” 다른 사용ìžë¡œë¶€í„°ì˜ ì´ë©”ì¼ì„ 받지 ì•Šë„ë¡ ì„¤ì •í•˜ì˜€ìŠµë‹ˆë‹¤.',
-'email-legend' => '{{SITENAME}}ì˜ ë‹¤ë¥¸ 사용ìžì—게 ì´ë©”ì¼ì„ 보내기',
-'emailfrom' => 'ì´ë©”ì¼ ë°œì‹ ìž:',
-'emailto' => '수신ìž:',
-'emailsubject' => '제목:',
-'emailmessage' => 'ë‚´ìš©:',
-'emailsend' => '보내기',
-'emailccme' => 'ì‚¬ë³¸ì„ ë‚´ ì´ë©”ì¼ë¡œë„ 보내기',
-'emailccsubject' => '$1ì—게 보낸 ë©”ì¼ ì‚¬ë³¸: $2',
-'emailsent' => 'ì´ë©”ì¼ ë³´ëƒ„',
-'emailsenttext' => 'ì´ë©”ì¼ì„ 보냈습니다.',
-'emailuserfooter' => 'ì´ ì´ë©”ì¼ì€ {{SITENAME}}ì˜ $1 사용ìžê°€ $2 사용ìžì—게 "ì´ë©”ì¼ ë³´ë‚´ê¸°" ê¸°ëŠ¥ì„ í†µí•´ 전송ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'usermailererror' => 'ë©”ì¼ ê°ì²´ì—ì„œ 오류 ë°œìƒ:',
+'defemailsubject' => '{{SITENAME}} ì´ë©”ì¼',
+'usermaildisabled' => 'ì‚¬ìš©ìž ì´ë©”ì¼ ë¹„í™œì„±í™”ë¨',
+'usermaildisabledtext' => 'ë‹¹ì‹ ì€ ì´ ìœ„í‚¤ì—ì„œ 다른 사용ìžì—게 ë©”ì¼ì„ 보낼 수 없습니다',
+'noemailtitle' => 'ì´ë©”ì¼ ì£¼ì†Œ ì—†ìŒ',
+'noemailtext' => 'ì´ ì‚¬ìš©ìžëŠ” 올바른 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하지 않았습니다.',
+'nowikiemailtitle' => 'ì´ë©”ì¼ì´ 허용ë˜ì§€ ì•ŠìŒ',
+'nowikiemailtext' => 'ì´ ì‚¬ìš©ìžëŠ” 다른 사용ìžë¡œë¶€í„°ì˜ ì´ë©”ì¼ì„ 받지 ì•Šë„ë¡ ì„¤ì •í•˜ì˜€ìŠµë‹ˆë‹¤.',
+'email-legend' => '{{SITENAME}}ì˜ ë‹¤ë¥¸ 사용ìžì—게 ì´ë©”ì¼ì„ 보내기',
+'emailfrom' => 'ì´ë©”ì¼ ë°œì‹ ìž:',
+'emailto' => '수신ìž:',
+'emailsubject' => '제목:',
+'emailmessage' => 'ë‚´ìš©:',
+'emailsend' => '보내기',
+'emailccme' => 'ì‚¬ë³¸ì„ ë‚´ ì´ë©”ì¼ë¡œë„ 보내기',
+'emailccsubject' => '$1ì—게 보낸 ë©”ì¼ ì‚¬ë³¸: $2',
+'emailsent' => 'ì´ë©”ì¼ ë³´ëƒ„',
+'emailsenttext' => 'ì´ë©”ì¼ì„ 보냈습니다.',
+'emailuserfooter' => 'ì´ ì´ë©”ì¼ì€ {{SITENAME}}ì˜ $1 사용ìžê°€ $2 사용ìžì—게 "ì´ë©”ì¼ ë³´ë‚´ê¸°" ê¸°ëŠ¥ì„ í†µí•´ 전송ë˜ì—ˆìŠµë‹ˆë‹¤.',
+
+# User Messenger
+'usermessage-summary' => '시스템 메시지 남기기',
+'usermessage-editor' => '시스템 메신저',
# Watchlist
'watchlist' => '주시문서 목ë¡',
'mywatchlist' => 'ë‚´ 주시문서 목ë¡',
-'watchlistfor' => "('''$1'''ì˜ ëª©ë¡)",
+'watchlistfor2' => '사용ìž:$1 $2',
'nowatchlist' => '주시하는 문서가 ì•„ì§ ì—†ìŠµë‹ˆë‹¤.',
'watchlistanontext' => '주시문서 목ë¡ì„ 보거나 고치려면 $1 하세요.',
'watchnologin' => '로그ì¸í•˜ì§€ ì•ŠìŒ',
@@ -2093,6 +2160,9 @@ $NEWPAGE
{{SITENAME}} 알림 시스템
--
+ì´ë©”ì¼ ì•Œë¦¼ ì„¤ì •ì„ ë°”ê¾¸ì‹œë ¤ë©´ ì´ê³³ì„ 방문해주세요:
+{{fullurl:{{#special:Preferences}}}}
+
주시문서 ì„¤ì •ì„ ë°”ê¾¸ë ¤ë©´ 다ìŒì„ 사용하세요:
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2148,7 +2218,10 @@ $UNWATCHURL
'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])ì˜ íŽ¸ì§‘ì„ [[User:$1|$1]]ì˜ ë§ˆì§€ë§‰ 버전으로 ë˜ëŒë¦¼',
'revertpage-nouser' => '(계정 ì´ë¦„ ì‚­ì œë¨)ì˜ íŽ¸ì§‘ì„ [[User:$1|$1]]ì˜ ë§ˆì§€ë§‰ 편집으로 ë˜ëŒë¦¼',
'rollback-success' => '$1ì˜ íŽ¸ì§‘ì„ $2ì˜ ë§ˆì§€ë§‰ 버전으로 ë˜ëŒë ¸ìŠµë‹ˆë‹¤.',
-'sessionfailure' => 'ë¡œê·¸ì¸ ì„¸ì…˜ì— ë¬¸ì œê°€ ë°œìƒí•œ 것 같습니다. 세션 하ì´ìž¬í‚¹ì„ 막기 위해 ë™ìž‘ì´ ì·¨ì†Œë˜ì—ˆìŠµë‹ˆë‹¤. 브ë¼ìš°ì €ì˜ "뒤로" ë²„íŠ¼ì„ ëˆ„ë¥´ê³  문서를 새로고침한 í›„ì— ë‹¤ì‹œ ì‹œë„í•´ 주세요.',
+
+# Edit tokens
+'sessionfailure-title' => '세션 ì†ì‹¤',
+'sessionfailure' => 'ë¡œê·¸ì¸ ì„¸ì…˜ì— ë¬¸ì œê°€ ë°œìƒí•œ 것 같습니다. 세션 하ì´ìž¬í‚¹ì„ 막기 위해 ë™ìž‘ì´ ì·¨ì†Œë˜ì—ˆìŠµë‹ˆë‹¤. 브ë¼ìš°ì €ì˜ "뒤로" ë²„íŠ¼ì„ ëˆ„ë¥´ê³  문서를 새로고침한 í›„ì— ë‹¤ì‹œ ì‹œë„í•´ 주세요.',
# Protect
'protectlogpage' => '문서 보호 기ë¡',
@@ -2279,18 +2352,22 @@ $1',
'month' => 'ì›”:',
'year' => 'ì—°ë„:',
-'sp-contributions-newbies' => '새 사용ìžì˜ 기여만 보기',
-'sp-contributions-newbies-sub' => '새 사용ìžë“¤ì˜ 기여',
-'sp-contributions-newbies-title' => '새 사용ìžì˜ 기여',
-'sp-contributions-blocklog' => '차단 기ë¡',
-'sp-contributions-deleted' => 'ì‚­ì œëœ ê¸°ì—¬ 목ë¡',
-'sp-contributions-logs' => '기ë¡',
-'sp-contributions-talk' => '토론',
-'sp-contributions-userrights' => 'ì‚¬ìš©ìž ê¶Œí•œ 관리',
-'sp-contributions-blocked-notice' => 'ì´ ì‚¬ìš©ìžëŠ” 현재 차단ë˜ì–´ 있습니다. 해당 사용ìžì˜ 차단 기ë¡ì€ 다ìŒê³¼ 같습니다.',
-'sp-contributions-search' => '기여 검색',
-'sp-contributions-username' => 'IP 주소 í˜¹ì€ ê³„ì • ì´ë¦„:',
-'sp-contributions-submit' => '찾기',
+'sp-contributions-newbies' => '새 사용ìžì˜ 기여만 보기',
+'sp-contributions-newbies-sub' => '새 사용ìžë“¤ì˜ 기여',
+'sp-contributions-newbies-title' => '새 사용ìžì˜ 기여',
+'sp-contributions-blocklog' => '차단 기ë¡',
+'sp-contributions-deleted' => 'ì‚­ì œëœ ê¸°ì—¬ 목ë¡',
+'sp-contributions-uploads' => 'íŒŒì¼ ì˜¬ë¦¬ê¸°',
+'sp-contributions-logs' => '기ë¡',
+'sp-contributions-talk' => '토론',
+'sp-contributions-userrights' => 'ì‚¬ìš©ìž ê¶Œí•œ 관리',
+'sp-contributions-blocked-notice' => 'ì´ ì‚¬ìš©ìžëŠ” 현재 차단ë˜ì–´ 있습니다. 해당 사용ìžì˜ 차단 기ë¡ì€ 다ìŒê³¼ 같습니다.',
+'sp-contributions-blocked-notice-anon' => 'ì´ IP 주소는 현재 차단ë˜ì–´ 있습니다.
+ì•„ëž˜ì˜ ìµœê·¼ 차단 기ë¡ì„ 참고하십시오.',
+'sp-contributions-search' => '기여 검색',
+'sp-contributions-username' => 'IP 주소 í˜¹ì€ ê³„ì • ì´ë¦„:',
+'sp-contributions-toponly' => '최신íŒë§Œ 보기',
+'sp-contributions-submit' => '찾기',
# What links here
'whatlinkshere' => '여기를 가리키는 문서',
@@ -2350,7 +2427,6 @@ $1',
'ipb-edit-dropdown' => '차단 ì´ìœ  ëª©ë¡ íŽ¸ì§‘í•˜ê¸°',
'ipb-unblock-addr' => '$1 차단 해제하기',
'ipb-unblock' => '사용ìž/IP 주소 차단 해제하기',
-'ipb-blocklist-addr' => '$1ì˜ í˜„ìž¬ 차단 ê¸°ë¡ ë³´ê¸°',
'ipb-blocklist' => '현재 차단 ê¸°ë¡ ë³´ê¸°',
'ipb-blocklist-contribs' => '$1ì˜ ê¸°ì—¬',
'unblockip' => 'ì‚¬ìš©ìž ì°¨ë‹¨ í•´ì œ',
@@ -2420,6 +2496,8 @@ $1 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆìŠµë‹ˆë‹¤. 차단 ì„¤ì •ì„ ë°”ê¾¸ì‹œê² ìŠµë‹
'sorbs_create_account_reason' => 'ë‹¹ì‹ ì˜ IP 주소는 {{SITENAME}}ì—ì„œ 사용하는 DNSBL 공개 프ë¡ì‹œ 목ë¡ì— 들어 있습니다. ê³„ì •ì„ ë§Œë“¤ 수 없습니다.',
'cant-block-while-blocked' => 'ë‹¹ì‹ ì´ ì°¨ë‹¨ë˜ì–´ 있는 ë™ì•ˆì—는 다른 사용ìžë¥¼ 차단할 수 없습니다.',
'cant-see-hidden-user' => 'ë‹¹ì‹ ì´ ì°¨ë‹¨í•˜ë ¤ 하는 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆê³  계정 숨김 처리ë˜ì—ˆìŠµë‹ˆë‹¤. ë‹¹ì‹ ì´ ê³„ì • 숨기기 ê¶Œí•œì„ ê°–ê³  있지 않기 때문ì—, ì´ ì‚¬ìš©ìžì˜ 차단 기ë¡ì„ 보거나 차단 ì„¤ì •ì„ ë³€ê²½í•  수 없습니다.',
+'ipbblocked' => 'ë‹¹ì‹ ì€ ì°¨ë‹¨ë˜ì–´ 있기 ë•Œë¬¸ì— ë‹¤ë¥¸ 사용ìžë¥¼ 차단하거나 ì°¨ë‹¨ì„ í•´ì œí•  수 없습니다.',
+'ipbnounblockself' => 'ë‹¹ì‹ ì€ ìžê¸° 스스로를 차단 해제할 수 없습니다.',
# Developer tools
'lockdb' => 'ë°ì´í„°ë² ì´ìŠ¤ 잠그기',
@@ -2456,6 +2534,20 @@ $1 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆìŠµë‹ˆë‹¤. 차단 ì„¤ì •ì„ ë°”ê¾¸ì‹œê² ìŠµë‹
'''주ì˜!'''
ìžì£¼ 사용하는 문서를 ì´ë™í•˜ë©´ 위험한 결과를 가져올 수 있습니다.
ì´ë™í•˜ê¸° ì „ì—, ì´ ë¬¸ì„œë¥¼ ì´ë™í•´ë„ 문제가 없다는 ê²ƒì„ í™•ì¸í•´ì£¼ì„¸ìš”.",
+'movepagetext-noredirectfixer' => "ì´ ì–‘ì‹ì„ ì´ìš©í•´ ë¬¸ì„œì˜ ì´ë¦„ì„ ë°”ê¾¸ê³  ë¬¸ì„œì˜ ëª¨ë“  역사를 옮길 것입니다.
+ì´ì „ì˜ ì œëª©ì€ ìƒˆ 제목으로 넘겨줄 것입니다.
+[[Special:DoubleRedirects|ì´ì¤‘ 넘겨주기]]나 [[Special:BrokenRedirects|ëŠê¸´ 넘겨주기]]ê°€ 있는지 확ì¸í•´ì£¼ì‹­ì‹œì˜¤.
+ë‹¹ì‹ ì€ ë„˜ê²¨ì£¼ê¸° ë§í¬ê°€ 제대로 향하고 있는지 확ì¸í•˜ì—¬ì•¼ 합니다.
+
+참고로 새 ì œëª©ì„ ê°€ì§„ 문서가 ì´ë¯¸ 있다면 ë‹¤ìŒ ê²½ìš°ì— í•´ë‹¹í•˜ì§€ 않으면 ì´ ë¬¸ì„œëŠ” 옮겨지지 '''ì•Šì„''' 것입니다.
+* 비어 있거나,
+* 넘겨주기 문서ì´ë©°,
+* ê³¼ê±°ì— íŽ¸ì§‘ ë‚´ë ¥ì´ ì—†ëŠ” 경우
+ì´ëŠ” ë‹¹ì‹ ì´ ì‹¤ìˆ˜ë¡œ 문서를 ì˜®ê²¼ì„ ë•Œ ë˜ëŒë¦´ 수 있으며 ì´ë¯¸ 있는 문서를 ë®ì–´ì“¸ 수 ì—†ìŒì„ ì˜ë¯¸í•©ë‹ˆë‹¤.
+
+'''경고!'''
+방문 수나 ì´ ë¬¸ì„œë¥¼ 향하는 ë§í¬ê°€ ë§Žì€ ë¬¸ì„œì¼ ê²½ìš° 심ê°í•œ 문제를 초래할 수 있습니다.
+문서를 ì´ë™í•˜ê¸° ì „ì— ì´ëŸ¬í•œ í–‰ë™ì´ 초래할 수 있는 ê²°ê³¼ì— ëŒ€í•´ 숙지하시기 ë°”ëžë‹ˆë‹¤.",
'movepagetalktext' => "딸린 토론 ë¬¸ì„œë„ ìžë™ìœ¼ë¡œ ì´ë™í•©ë‹ˆë‹¤. 하지만 다ìŒì˜ 경우는 '''ì´ë™í•˜ì§€ 않습니다''':
* ì´ë™í•  ì´ë¦„으로 ëœ ë¬¸ì„œê°€ ì´ë¯¸ 있는 경우
* ì•„ëž˜ì˜ ì„ íƒì„ 해제하는 경우
@@ -2512,6 +2604,7 @@ $1 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆìŠµë‹ˆë‹¤. 차단 ì„¤ì •ì„ ë°”ê¾¸ì‹œê² ìŠµë‹
'immobile-source-page' => 'ì´ ë¬¸ì„œëŠ” ì´ë™í•  수 없습니다.',
'immobile-target-page' => '새 ì´ë¦„으로 옮길 수 없습니다.',
'imagenocrossnamespace' => '파ì¼ì„ 파ì¼ì´ ì•„ë‹Œ ì´ë¦„공간으로 옮길 수 없습니다.',
+'nonfile-cannot-move-to-file' => '파ì¼ì´ ì•„ë‹Œ 문서를 íŒŒì¼ ì´ë¦„공간으로 옮길 수 없습니다.',
'imagetypemismatch' => '새 파ì¼ì˜ 확장ìžê°€ ì›ëž˜ì˜ 확장ìžì™€ ì¼ì¹˜í•˜ì§€ 않습니다.',
'imageinvalidfilename' => '새 íŒŒì¼ ì´ë¦„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
'fix-double-redirects' => '기존 ì´ë¦„ì„ ê°€ë¦¬í‚¤ëŠ” 넘겨주기를 갱신',
@@ -2585,10 +2678,12 @@ $1 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆìŠµë‹ˆë‹¤. 차단 ì„¤ì •ì„ ë°”ê¾¸ì‹œê² ìŠµë‹
'import-interwiki-namespace' => '새 ì´ë¦„공간:',
'import-upload-filename' => 'íŒŒì¼ ì´ë¦„:',
'import-comment' => 'ì´ìœ :',
-'importtext' => 'ì›ë³¸ 위키ì—ì„œ [[Special:Export|내보내기]] ê¸°ëŠ¥ì„ ì‚¬ìš©í•´ 파ì¼ì„ 내려받아서 ì—¬ê¸°ì— ì˜¬ë ¤ì£¼ì„¸ìš”.',
+'importtext' => 'ì›ë³¸ 위키ì—ì„œ [[Special:Export|내보내기]] ê¸°ëŠ¥ì„ ì‚¬ìš©í•´ 파ì¼ì„ 내려받으십시오.
+그리고 ë‹¹ì‹ ì˜ ì»´í“¨í„°ì— ì €ìž¥í•´ ë‘” 후 ì—¬ê¸°ì— ì˜¬ë ¤ì£¼ì„¸ìš”.',
'importstart' => '문서를 가져오는 중...',
'import-revision-count' => 'íŒ $1ê°œ',
'importnopages' => '가져올 문서가 없습니다.',
+'imported-log-entries' => '로그 항목 $1개를 가져왔습니다.',
'importfailed' => '가져오기 실패: <nowiki>$1</nowiki>',
'importunknownsource' => 'ì•Œ 수 없는 가져오기 ìžë£Œ 유형',
'importcantopen' => '파ì¼ì„ ì—´ 수 없습니다.',
@@ -2685,6 +2780,8 @@ $1 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆìŠµë‹ˆë‹¤. 차단 ì„¤ì •ì„ ë°”ê¾¸ì‹œê² ìŠµë‹
'tooltip-rollback' => '"ë˜ëŒë¦¬ê¸°" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ ë¬¸ì„œì— ëŒ€í•œ 마지막 기여ìžì˜ íŽ¸ì§‘ì„ ëª¨ë‘ ë˜ëŒë¦´ 수 있습니다.',
'tooltip-undo' => '"편집 취소" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ íŽ¸ì§‘ì´ ë˜ëŒë ¤ì§€ê³ , ì°¨ì´ë³´ê¸° ê¸°ëŠ¥ì´ ë¯¸ë¦¬ë³´ê¸° 형ì‹ìœ¼ë¡œ 나타납니다.
편집 ìš”ì•½ì— ì´ íŽ¸ì§‘ì„ ì™œ ë˜ëŒë¦¬ëŠ”ì§€ì— ëŒ€í•œ ì´ìœ ë¥¼ 쓸 수 있습니다.',
+'tooltip-preferences-save' => '환경 설정 저장하기',
+'tooltip-summary' => 'ì§§ì€ íŽ¸ì§‘ ìš”ì•½ì„ ì ì–´ì£¼ì„¸ìš”',
# Stylesheets
'common.css' => '/** ì´ CSS ì„¤ì •ì€ ëª¨ë“  ìŠ¤í‚¨ì— ì ìš©ë©ë‹ˆë‹¤ */',
@@ -2799,14 +2896,17 @@ $1',
'imagemaxsize' => "그림 최대 í¬ê¸°:<br />''(íŒŒì¼ ë¬¸ì„œì— ì ìš©ë˜ëŠ” 기능)''",
'thumbsize' => 'ì„¬ë„¤ì¼ í¬ê¸°:',
'widthheightpage' => '$1×$2, $3페ì´ì§€',
-'file-info' => '(íŒŒì¼ í¬ê¸°: $1, MIME 종류: $2)',
-'file-info-size' => '($1 × $2 픽셀, íŒŒì¼ í¬ê¸°: $3, MIME 종류: $4)',
+'file-info' => 'íŒŒì¼ í¬ê¸°: $1, MIME 종류: $2',
+'file-info-size' => '$1 × $2 픽셀, íŒŒì¼ í¬ê¸°: $3, MIME 종류: $4',
'file-nohires' => '<small>최대 í•´ìƒë„입니다.</small>',
-'svg-long-desc' => '(SVG 파ì¼, 실제 í¬ê¸° $1 × $2 픽셀, íŒŒì¼ í¬ê¸° $3)',
+'svg-long-desc' => 'SVG 파ì¼, 실제 í¬ê¸° $1 × $2 픽셀, íŒŒì¼ í¬ê¸° $3',
'show-big-image' => '최대 í•´ìƒë„',
'show-big-image-thumb' => '<small>미리보기 í¬ê¸°: $1 × $2 픽셀</small>',
'file-info-gif-looped' => '반복ë¨',
'file-info-gif-frames' => '$1 프레임',
+'file-info-png-looped' => '반복ë¨',
+'file-info-png-repeat' => '$1번 재ìƒë¨',
+'file-info-png-frames' => '$1 프레임',
# Special:NewFiles
'newimages' => '새 íŒŒì¼ ëª©ë¡',
@@ -2969,6 +3069,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'GPS 구역 ì´ë¦„',
'exif-gpsdatestamp' => 'GPS 날짜',
'exif-gpsdifferential' => 'GPS ì°¨ì´ ë³´ì •',
+'exif-objectname' => 'ì§§ì€ ì œëª©',
# EXIF attributes
'exif-compression-1' => '압축ë˜ì§€ ì•ŠìŒ',
@@ -3126,27 +3227,27 @@ Variants for Chinese language
'limitall' => '모ë‘',
# E-mail address confirmation
-'confirmemail' => 'ì´ë©”ì¼ ì£¼ì†Œ 확ì¸',
-'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]ì— ì´ë©”ì¼ì„ 설정하지 않았습니다.',
-'confirmemail_text' => '{{SITENAME}}ì—서는 ì´ë©”ì¼ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê¸° ì „ì— ì´ë©”ì¼ ì¸ì¦ì„ 받아야 합니다.
+'confirmemail' => 'ì´ë©”ì¼ ì£¼ì†Œ 확ì¸',
+'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]ì— ì´ë©”ì¼ì„ 설정하지 않았습니다.',
+'confirmemail_text' => '{{SITENAME}}ì—서는 ì´ë©”ì¼ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê¸° ì „ì— ì´ë©”ì¼ ì¸ì¦ì„ 받아야 합니다.
ì•„ëž˜ì˜ ë²„íŠ¼ì„ ëˆ„ë¥´ë©´ ì¸ì¦ ë©”ì¼ì„ 보냅니다.
ë©”ì¼ì—는 ì¸ì¦ 코드가 들어있는 ë§í¬ê°€ 있습니다.
ê·¸ ë§í¬ë¥¼ 웹 브ë¼ìš°ì €ë¡œ ì—´ë©´ ì¸ì¦ì´ 완료ë©ë‹ˆë‹¤.',
-'confirmemail_pending' => 'ì´ë¯¸ í™•ì¸ ì´ë©”ì¼ì„ 보냈습니다. ê³„ì •ì„ ìµœê·¼ì— ë§Œë“¤ì—ˆë‹¤ë©´ ì´ë©”ì¼ì„ 보내는 ë°ì— 몇 ë¶„ì´ ê±¸ë¦´ 수 있으므로 ìž ì‹œ í›„ì— ë‹¤ì‹œ 확ì¸í•´ 주세요.',
-'confirmemail_send' => 'ì¸ì¦ 코드를 ë©”ì¼ë¡œ 보내기',
-'confirmemail_sent' => 'ì¸ì¦ ì´ë©”ì¼ì„ 보냈습니다.',
-'confirmemail_oncreate' => 'í™•ì¸ ì´ë©”ì¼ì„ 보냈습니다. ì´ í™•ì¸ ê³¼ì •ì€ ë¡œê·¸ì¸í•˜ëŠ” ë°ì— 필요하지는 않지만, 위키 프로그램ì—ì„œ 제공하는 ì´ë©”ì¼ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê¸° 위해서 필요합니다.',
-'confirmemail_sendfailed' => '{{SITENAME}}ì—ì„œ ì¸ì¦ ì´ë©”ì¼ì„ 보낼 수 없습니다.
+'confirmemail_pending' => 'ì´ë¯¸ í™•ì¸ ì´ë©”ì¼ì„ 보냈습니다. ê³„ì •ì„ ìµœê·¼ì— ë§Œë“¤ì—ˆë‹¤ë©´ ì´ë©”ì¼ì„ 보내는 ë°ì— 몇 ë¶„ì´ ê±¸ë¦´ 수 있으므로 ìž ì‹œ í›„ì— ë‹¤ì‹œ 확ì¸í•´ 주세요.',
+'confirmemail_send' => 'ì¸ì¦ 코드를 ë©”ì¼ë¡œ 보내기',
+'confirmemail_sent' => 'ì¸ì¦ ì´ë©”ì¼ì„ 보냈습니다.',
+'confirmemail_oncreate' => 'í™•ì¸ ì´ë©”ì¼ì„ 보냈습니다. ì´ í™•ì¸ ê³¼ì •ì€ ë¡œê·¸ì¸í•˜ëŠ” ë°ì— 필요하지는 않지만, 위키 프로그램ì—ì„œ 제공하는 ì´ë©”ì¼ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê¸° 위해서 필요합니다.',
+'confirmemail_sendfailed' => '{{SITENAME}}ì—ì„œ ì¸ì¦ ì´ë©”ì¼ì„ 보낼 수 없습니다.
ì´ë©”ì¼ ì£¼ì†Œë¥¼ 잘못 입력했는지 확ì¸í•´ì£¼ì„¸ìš”.
ë©”ì¼ ì„œë²„ë¡œë¶€í„°ì˜ ì‘답: $1',
-'confirmemail_invalid' => 'ì¸ì¦ 코드가 올바르지 않습니다. ì¸ì¦ 코드가 만료ë˜ì—ˆì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
-'confirmemail_needlogin' => 'ì´ë©”ì¼ ì£¼ì†Œë¥¼ ì¸ì¦í•˜ë ¤ë©´ $1ì´ í•„ìš”í•©ë‹ˆë‹¤.',
-'confirmemail_success' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ ì¸ì¦ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ì œ 로그ì¸í•´ì„œ 위키를 사용하세요.',
-'confirmemail_loggedin' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ ì¸ì¦ë˜ì—ˆìŠµë‹ˆë‹¤.',
-'confirmemail_error' => 'ë‹¹ì‹ ì˜ ì¸ì¦ì„ 저장하는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
-'confirmemail_subject' => '{{SITENAME}} ì´ë©”ì¼ ì£¼ì†Œ ì¸ì¦',
-'confirmemail_body' => '$1 ì•„ì´í”¼ 주소를 사용하는 사용ìžê°€ {{SITENAME}}ì˜ â€˜$2’ ê³„ì •ì— ì´ë©”ì¼ ì¸ì¦ ì‹ ì²­ì„ í–ˆìŠµë‹ˆë‹¤.
+'confirmemail_invalid' => 'ì¸ì¦ 코드가 올바르지 않습니다. ì¸ì¦ 코드가 만료ë˜ì—ˆì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
+'confirmemail_needlogin' => 'ì´ë©”ì¼ ì£¼ì†Œë¥¼ ì¸ì¦í•˜ë ¤ë©´ $1ì´ í•„ìš”í•©ë‹ˆë‹¤.',
+'confirmemail_success' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ ì¸ì¦ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ì œ 로그ì¸í•´ì„œ 위키를 사용하세요.',
+'confirmemail_loggedin' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ ì¸ì¦ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'confirmemail_error' => 'ë‹¹ì‹ ì˜ ì¸ì¦ì„ 저장하는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'confirmemail_subject' => '{{SITENAME}} ì´ë©”ì¼ ì£¼ì†Œ ì¸ì¦',
+'confirmemail_body' => '$1 ì•„ì´í”¼ 주소를 사용하는 사용ìžê°€ {{SITENAME}}ì˜ â€˜$2’ ê³„ì •ì— ì´ë©”ì¼ ì¸ì¦ ì‹ ì²­ì„ í–ˆìŠµë‹ˆë‹¤.
ì´ ê³„ì •ì´ ë‹¹ì‹ ì˜ ê³„ì •ì´ë¼ë©´, 아래 주소를 ì—´ì–´ì„œ ì´ë©”ì¼ ì¸ì¦ì„ í•´ 주세요.
@@ -3157,8 +3258,30 @@ $3
$5
ì¸ì¦ 코드는 $4ì— ë§Œë£Œë©ë‹ˆë‹¤.',
-'confirmemail_invalidated' => 'ì´ë©”ì¼ í™•ì¸ì´ 취소ë¨',
-'invalidateemail' => 'ì´ë©”ì¼ í™•ì¸ ì·¨ì†Œ',
+'confirmemail_body_changed' => '$1 IP 주소를 사용하는 사용ìžê°€ {{SITENAME}}ì˜ "$2" ê³„ì •ì˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 바꾸었습니다.
+
+ì´ ê³„ì •ì´ ë‹¹ì‹ ì˜ ê³„ì •ì¸ì§€ 확ì¸í•˜ê³  {{SITENAME}}ì˜ ì´ë©”ì¼ ê¸°ëŠ¥ì„ í™œì„±í™”í•˜ë ¤ë©´ 아래 ë§í¬ë¥¼ í´ë¦­í•˜ì—¬ ì´ë©”ì¼ ì¸ì¦ì„ í•´ 주세요.
+
+$3
+
+ì´ ê³„ì •ì´ ë‹¹ì‹ ì˜ ê²ƒì´ ì•„ë‹ˆë¼ë©´ ë‹¤ìŒ ë§í¬ë¥¼ ì—´ì–´ ì´ë©”ì¼ ì£¼ì†Œ ë³€ê²½ì„ ì·¨ì†Œí•˜ì‹­ì‹œì˜¤.
+
+$5
+
+ì¸ì¦ 코드는 $4ì— ë§Œë£Œë©ë‹ˆë‹¤.',
+'confirmemail_body_set' => 'IP 주소 $1ì„ ì‚¬ìš©í•˜ëŠ” 누군가가 {{SITENAME}}ì˜ "$2" ê³„ì •ì˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 지정하였습니다.
+
+ì´ ê³„ì •ì´ ë‹¹ì‹ ì˜ ê²ƒì´ë©° {{SITENAME}}ì—ì„œ ì´ë©”ì¼ ê¸°ëŠ¥ì„ ë‹¤ì‹œ 활성화하려면 ì´ ë§í¬ë¥¼ ì—´ì–´ 주십시오:
+
+$3
+
+만약 ì´ ê³„ì •ì´ ë‹¹ì‹ ì˜ ê²ƒì´ ì•„ë‹ˆë¼ë©´ ë‹¤ìŒ ë§í¬ë¥¼ í´ë¦­í•´ ì´ë©”ì¼ ì£¼ì†Œ ì¸ì¦ì„ 취소하십시오:
+
+$5
+
+ì´ ì¸ì¦ 코드는 $4ì— ë§Œë£Œë©ë‹ˆë‹¤.',
+'confirmemail_invalidated' => 'ì´ë©”ì¼ í™•ì¸ì´ 취소ë¨',
+'invalidateemail' => 'ì´ë©”ì¼ í™•ì¸ ì·¨ì†Œ',
# Scary transclusion
'scarytranscludedisabled' => '[ì¸í„°ìœ„키가 비활성ë˜ì–´ 있습니다]',
@@ -3198,6 +3321,7 @@ $1',
'table_pager_first' => 'ì²˜ìŒ ë¬¸ì„œ',
'table_pager_last' => '마지막 문서',
'table_pager_limit' => '문서당 $1ê°œ 항목 ë³´ì´ê¸°',
+'table_pager_limit_label' => '페ì´ì§€ë‹¹ 항목 수:',
'table_pager_limit_submit' => '확ì¸',
'table_pager_empty' => 'ê²°ê³¼ ì—†ìŒ',
@@ -3254,6 +3378,7 @@ $1',
'version-specialpages' => '특수 문서',
'version-parserhooks' => '파서 훅',
'version-variables' => '변수',
+'version-skins' => '스킨',
'version-other' => '기타',
'version-mediahandlers' => '미디어 핸들러',
'version-hooks' => 'í›…',
@@ -3265,6 +3390,13 @@ $1',
'version-hook-subscribedby' => 'í›…ì´ ì‚¬ìš©ëœ ìœ„ì¹˜',
'version-version' => '(버전 $1)',
'version-license' => 'ë¼ì´ì„¼ìŠ¤',
+'version-poweredby-credits' => "ì´ ìœ„í‚¤ëŠ” '''[http://www.mediawiki.org/ MediaWiki]'''를 기반으로 ìž‘ë™í•©ë‹ˆë‹¤. Copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'ê·¸ 외 다른 개발ìž',
+'version-license-info' => '미디어위키는 ìžìœ  소프트웨어입니다. ë‹¹ì‹ ì€ ìžìœ  소프트웨어 ìž¬ë‹¨ì´ ë°œí‘œí•œ GNU ì¼ë°˜ 공중 사용 허가서 버전 2나 ê·¸ ì´í›„ ë²„ì „ì— ë”°ë¼ ì´ íŒŒì¼ì„ 재배í¬í•˜ê±°ë‚˜ 수정할 수 있습니다.
+
+미디어위키가 유용하게 ì‚¬ìš©ë  ìˆ˜ 있기를 ë°”ë¼ì§€ë§Œ ìƒìš©ìœ¼ë¡œ 사용ë˜ê±°ë‚˜ 특정 목ì ì— ë§žì„ ê²ƒì´ë¼ëŠ” ê²ƒì„ ë³´ì¦í•˜ì§€ 않습니다. ìžì„¸í•œ ë‚´ìš©ì€ GNU ì¼ë°˜ 공중 사용 허가서 ì „ë¬¸ì„ ì°¸ê³ í•˜ì‹­ì‹œì˜¤.
+
+ë‹¹ì‹ ì€ ì´ í”„ë¡œê·¸ëž¨ì„ í†µí•´ [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU ì¼ë°˜ 공중 사용 허가서 전문]ì„ ë°›ì•˜ìŠµë‹ˆë‹¤; 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USAë¡œ 편지를 보내주시거나 [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 온ë¼ì¸]으로 ì½ì–´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤.',
'version-software' => 'ì„¤ì¹˜ëœ í”„ë¡œê·¸ëž¨',
'version-software-product' => '제품',
'version-software-version' => '버전',
@@ -3335,6 +3467,15 @@ $1',
'tags-edit' => '편집',
'tags-hitcount' => '$1개 바뀜',
+# Special:ComparePages
+'comparepages' => '문서 비êµ',
+'compare-selector' => 'ë¬¸ì„œì˜ íŠ¹ì •íŒ ë¹„êµ',
+'compare-page1' => '첫 번째 문서',
+'compare-page2' => 'ë‘ ë²ˆì§¸ 문서',
+'compare-rev1' => '첫 번째 íŒ',
+'compare-rev2' => 'ë‘ ë²ˆì§¸ íŒ',
+'compare-submit' => '비êµí•˜ê¸°',
+
# Database error messages
'dberr-header' => 'ì´ ìœ„í‚¤ì— ë¬¸ì œê°€ 있습니다.',
'dberr-problems' => '죄송합니다. ì´ ì‚¬ì´íŠ¸ëŠ” 기술ì ì¸ 문제가 있습니다.',
@@ -3351,8 +3492,13 @@ $1',
'htmlform-float-invalid' => '입력한 ê°’ì´ ìˆ˜ê°€ 아닙니다.',
'htmlform-int-toolow' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ ê°’ì€ ìµœì†Œê°’ $1 미만입니다.',
'htmlform-int-toohigh' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ ê°’ì€ ìµœëŒ€ê°’ $1 ì´ìƒìž…니다.',
+'htmlform-required' => 'ì´ ê°’ì€ í•„ìˆ˜ 항목입니다',
'htmlform-submit' => '저장',
'htmlform-reset' => '변경한 ê²ƒì„ ë˜ëŒë¦¬ê¸°',
'htmlform-selectorother-other' => '기타',
+# SQLite database support
+'sqlite-has-fts' => '$1 (본문 전체 검색)',
+'sqlite-no-fts' => '$1 (ë³¸ë¬¸ì€ ê²€ìƒ‰ì—ì„œ 제외)',
+
);
diff --git a/languages/messages/MessagesKoi.php b/languages/messages/MessagesKoi.php
index d7868250..37590390 100644
--- a/languages/messages/MessagesKoi.php
+++ b/languages/messages/MessagesKoi.php
@@ -104,13 +104,9 @@ $messages = array(
'faqpage' => 'Project:отир ÑÑ‘ юаÑьö',
# Vector skin
-'vector-action-delete' => 'Чышкыны',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'ОтÑаÑÑн лиÑтбок',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'ЛиÑтбок',
-'vector-view-view' => 'Лыддьöтны',
-'variants' => 'ВарианттÑз',
+'vector-action-delete' => 'Чышкыны',
+'vector-view-view' => 'Лыддьöтны',
+'variants' => 'ВарианттÑз',
'errorpagetitle' => 'СораÑьöм',
'returnto' => 'Бертны $1-öдз.',
@@ -214,7 +210,7 @@ $messages = array(
'yourname' => 'УджкериÑьлöн пыран ним:',
'yourpassword' => 'Пароль:',
'yourpasswordagain' => 'МöдпöвÑьöтны пароль',
-'remembermypassword' => 'Видзны менчим пыран ним ÑÑ‚iÑ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ тöдвылын',
+'remembermypassword' => 'Видзны менчим пыран ним ÑÑ‚iÑ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ тöдвылын (не дыржык {{PLURAL:$1| лунÑÑ|лунÑÑ}})',
'login' => 'Пырны ним увтын',
'nav-login-createaccount' => 'Пыран / гижöтчан',
'userlogin' => 'ВиÑьтаÑьны нето гижöтчыны',
@@ -225,6 +221,7 @@ $messages = array(
'createaccount' => 'ЛöÑьöт аÑлыт уджкериÑьлiÑÑŒ ним',
'gotaccountlink' => 'Пырны ним увтын',
'createaccountmail' => 'Электрон поштаöн',
+'createaccountreason' => 'МылÑ:',
'loginerror' => 'Пырöмыт Ñз аркмы',
'loginsuccesstitle' => 'Пырöмыт аркмиÑ',
'mailmypassword' => 'ЫÑтыны виль пароль',
@@ -323,6 +320,7 @@ $messages = array(
# Diffs
'history-title' => '$1 вильмöтан иÑториÑ',
'difference' => '(ÐÐµÃ¶Ñ‚ÐºÐ¾Ð´ÑŒÑ‹Ñ Ð²ÐµÑ€ÑиÑÑз колаÑын)',
+'difference-multipage' => 'ÐÐµÃ¶Ñ‚ÐºÐ¾Ð´ÑŒÑ‹Ñ Ð»Ð¸Ñтбоккез колаÑын',
'lineno' => 'Визёк $1:',
'compareselectedversions' => 'Ордчаöтны бöрйöм верÑиÑÑз',
'editundo' => 'керны важмоз',
@@ -511,7 +509,6 @@ $messages = array(
# Watchlist
'watchlist' => 'СинмаланнÑз',
'mywatchlist' => 'СинмаланнÑзö',
-'watchlistfor' => "('''$1''' понда)",
'addedwatch' => 'Синмалан нимлёдзö Ñодтöм',
'addedwatchtext' => '«[[:$1]]» лиÑтбок вöлi Ñодтöм [[Special:Watchlist|Ñинмалан нимлёдзат]].
БыдöÑ, мый Ð¿Ð¾Ð½Ð´Ð°Ñ Ð²ÐµÐ¶Ñьыны лиÑтбок Ð²Ñ‹Ð»Ð°Ñ Ð´Ð° Ñыкöт йитчöм Ñёрнитанын, позÑÑ Ð°Ð´Ð·Ñ‹Ð½Ñ‹ ÑÑ‚iÑ Ð½Ð¸Ð¼Ð»Ñ‘Ð´Ð·Ð¸ÑÑŒ; ÑiÑ Ð»Ð¾Ð°Ñ Ñiдзжо кызжыка тöдчöтöм [[Special:RecentChanges|виль вежÑьöммез Ñьöртi нимлёдзын]], медбы Ð¿Ð¾Ð·Ð¸Ñ ÐºÐ¾ÐºÐ½Ð¸Ñ‚Ð¶Ñ‹ÐºÐ° казÑвны.',
@@ -724,9 +721,9 @@ $messages = array(
'nextdiff' => 'СыбöрÑÑ Ð²Ð¸Ð»ÑŒÐ¼Ã¶Ñ‚Ã¶Ñ‚Ã¶Ð¼ →',
# Media information
-'file-info-size' => '($1 × $2 пикÑел, файллöн ыжда: $3, MIME-тип: $4)',
+'file-info-size' => '$1 × $2 пикÑел, файллöн ыжда: $3, MIME-тип: $4',
'file-nohires' => '<small>Буржыка тыдалан верÑÐ¸Ñ Ð°Ð±Ñƒ.</small>',
-'svg-long-desc' => '(SVG-файл, гижöм Ñьöртi $1 × $2 пикÑел, файллöн ыжда: $3)',
+'svg-long-desc' => 'SVG-файл, гижöм Ñьöртi $1 × $2 пикÑел, файллöн ыжда: $3',
'show-big-image' => 'Буржыка тыдалан ÑерпаÑ',
'show-big-image-thumb' => '<small>Одзвыв нёджжалан ыжда: $1 × $2 пикÑел</small>',
diff --git a/languages/messages/MessagesKrc.php b/languages/messages/MessagesKrc.php
index a9cd9a72..51832dc0 100644
--- a/languages/messages/MessagesKrc.php
+++ b/languages/messages/MessagesKrc.php
@@ -10,6 +10,7 @@
* @author Don Alessandro
* @author GerardM
* @author Iltever
+ * @author Reedy
* @author Къарачайлы
*/
@@ -20,18 +21,18 @@ $namespaceNames = array(
NS_SPECIAL => 'Къуллукъ',
NS_TALK => 'Сюзюу',
NS_USER => 'Къошулуучу',
- NS_USER_TALK => 'Къошулуучуну Ñюзюу',
- NS_PROJECT_TALK => '$1 Ñюзюу',
+ NS_USER_TALK => 'Къошулуучуну_Ñюзюу',
+ NS_PROJECT_TALK => '$1_Ñюзюу',
NS_FILE => 'Файл',
- NS_FILE_TALK => 'Файлны Ñюзюу',
+ NS_FILE_TALK => 'Файлны_Ñюзюу',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki-ни Ñюзюу',
+ NS_MEDIAWIKI_TALK => 'MediaWiki-ни_Ñюзюу',
NS_TEMPLATE => 'Шаблон',
- NS_TEMPLATE_TALK => 'Шаблонну Ñюзюу',
+ NS_TEMPLATE_TALK => 'Шаблонну_Ñюзюу',
NS_HELP => 'Болушлукъ',
- NS_HELP_TALK => 'Болушлукъну Ñюзюу',
+ NS_HELP_TALK => 'Болушлукъну_Ñюзюу',
NS_CATEGORY => 'КатегориÑ',
- NS_CATEGORY_TALK => 'КатегориÑны Ñюзюу',
+ NS_CATEGORY_TALK => 'КатегориÑны_Ñюзюу',
);
$messages = array(
@@ -50,8 +51,7 @@ $messages = array(
'tog-editsection' => 'Хар бёлюмге «тюрлендир» джибериуню кёргюз',
'tog-editsectiononrightclick' => 'Бёлюмлени бёлюм башлыкъгъа баÑханлай тюрлендириу бетин ач',
'tog-showtoc' => 'Башларын кёргюз (3-ден кёб бёлюм башлыгъы болгъан бетлеге)',
-'tog-rememberpassword' => 'Паролюму унутма бу компьютерде',
-'tog-editwidth' => 'Тюрлендириу бетни Ñкранны Ñаулай кенглигине кёргюз',
+'tog-rememberpassword' => 'Бу компьютерде мени тергеў джазыўуму Ñакъла (Ñм кёб $1 {{PLURAL:$1|кюн|кюн}})',
'tog-watchcreations' => 'Мен къурагъан (башлагъан) бетлени кёзюмде тургъан тизмеме къош',
'tog-watchdefault' => 'Мен тюрлендирген бетлени кёзюмде тургъан тизмеме къош',
'tog-watchmoves' => 'Мен атларын ауушдургъан бетлени кёзюмде тургъан тизмеме къош',
@@ -195,31 +195,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Джангы тема къош',
-'vector-action-delete' => 'Кетер',
-'vector-action-move' => 'Ðтын ауушдур',
-'vector-action-protect' => 'Джакъла',
-'vector-action-undelete' => 'Къайтар',
-'vector-action-unprotect' => 'Джакълауну кетер',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Болушлукъ бет',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Бет',
-'vector-namespace-media' => 'Медиа-бет',
-'vector-namespace-mediawiki' => 'Билдириу',
-'vector-namespace-project' => 'Проект бет',
-'vector-namespace-special' => 'Къуллукъ бет',
-'vector-namespace-talk' => 'Сюзюу',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Къошулуучуну бети',
-'vector-view-create' => 'Къура',
-'vector-view-edit' => 'Тюрлендир',
-'vector-view-history' => 'Тарихин кёргюз',
-'vector-view-view' => 'Окъу',
-'vector-view-viewsource' => 'Кодха къара',
-'actions' => 'Этимле',
-'namespaces' => 'Ðтланы аламы',
-'variants' => 'Вариантла',
+'vector-action-addsection' => 'Джангы тема къош',
+'vector-action-delete' => 'Кетер',
+'vector-action-move' => 'Ðтын ауушдур',
+'vector-action-protect' => 'Джакъла',
+'vector-action-undelete' => 'Къайтар',
+'vector-action-unprotect' => 'Джакълауну кетер',
+'vector-simplesearch-preference' => 'Кенглешген излеуде болушлукъланы джандыр (къуру Вектор мотив ючюн)',
+'vector-view-create' => 'Къура',
+'vector-view-edit' => 'Тюрлендир',
+'vector-view-history' => 'Тарихин кёргюз',
+'vector-view-view' => 'Окъу',
+'vector-view-viewsource' => 'Кодха къара',
+'actions' => 'Этимле',
+'namespaces' => 'Ðтланы аламы',
+'variants' => 'Вариантла',
'errorpagetitle' => 'Халат',
'returnto' => '«$1» бетге къайт',
@@ -280,6 +270,9 @@ $messages = array(
Кечирек кириб кёрюгюз.
$1',
+'pool-timeout' => 'Блокланыуну Ñакълау заман ётдю',
+'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}} Ñайтны ÑŽÑюнден',
@@ -442,7 +435,8 @@ $2',
'yourname' => 'Къошулуучуну аты',
'yourpassword' => 'Паролюгъуз:',
'yourpasswordagain' => 'Паролну джангыдан джаз:',
-'remembermypassword' => 'Бу компьютерде къошулуучу атымы тут',
+'remembermypassword' => 'Бу компьютерде мени тергеў джазыўуму унутма (Ñм кёб $1 {{PLURAL:$1|кюн|кюн}})',
+'securelogin-stick-https' => 'Чыкъгъандан Ñора да HTTPS бла байламлы къой',
'yourdomainname' => 'Сизни доменигиз:',
'externaldberror' => 'Тыш Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð½Ñ‹ болушлугъу бла аутентификациÑ, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
'login' => 'Кир',
@@ -459,6 +453,7 @@ $2',
'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) Ñнди бармыды? $1.',
'gotaccountlink' => 'Кир',
'createaccountmail' => 'e-mail бла',
+'createaccountreason' => 'Чурум:',
'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
'userexists' => 'Джазгъан ат хайырландырылады.
Башха ат Ñайлагъыз.',
@@ -513,6 +508,9 @@ $2',
'loginlanguagelabel' => 'Тил: $1',
'suspicious-userlogout' => 'Ð¢ÐµÑ€Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€ неда кÑш Ñтиучу прокÑи берген Ñоруугъа ушагъаны ючюн, Сизни чыгъаргъа Ñорууугъуз алынмагъанды.',
+# E-mail sending
+'php-mail-error-unknown' => "PHP's mail() функциÑда белгили болмагъан халат",
+
# Password reset dialog
'resetpass' => 'Паролну тюрлендириу',
'resetpass_announce' => 'Сиз, Ñлектрон почта бла ийилген, болджаллы пароль бла киргенÑиз. СиÑтемагъа кириуню тамамларча, джангы пароль къурагъыз.',
@@ -561,11 +559,12 @@ $2',
'showlivepreview' => 'Терк ал къарау',
'showdiff' => 'Къошулгъан тюрлениуле',
'anoneditwarning' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·''': Сиз ÑиÑтемагъа кирмегенÑиз. Сизни IP-адреÑигиз бу бетни тюрлениу тарихине джазыллыкъды.",
+'anonpreviewwarning' => "''Сиз тергеу джазыуугъуз бла кирмегенÑиз. Бетде тюрлениулени ÑакълатÑагъыз, бетни тюрлениу тарихине IP-адреÑигиз джазыллыкъды.''",
'missingsummary' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·.''' Тюрлениулеге къыÑха ачыкълау джазмагъанÑыз.
Сиз «Бетни Ñакъла» дегеннге Ñнтда баÑÑагъыз, тюрлениуле комментарийлеÑиз Ñакъланныкъдыла.",
'missingcommenttext' => 'Тюбю бла ачыкълау джазыгъыз.',
-'missingcommentheader' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·:''' Сиз ачыкълаугъа башлыкъ джазмагъанÑыз.
-Сакълаугъа джангыдан баÑÑагъыз, тюрлендириулеригиз башлыкъÑыз Ñакъланныкъдыла.",
+'missingcommentheader' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·:''' Сиз ачыкълаугъа тема/башлыкъ джазмагъанÑыз.
+«{{int:savearticle}}» тиекден джангыдан баÑÑагъыз, тюрлендириулеригиз башлыкъÑыз Ñакъланныкъдыла.",
'summary-preview' => 'Суратлауу былай боллукъду:',
'subject-preview' => 'Башлыкъны ал къарау:',
'blockedtitle' => 'Къошулуучу блок Ñтилиниб турады',
@@ -638,7 +637,7 @@ $2',
'userjsyoucanpreview' => "'''Юретиу.''' «{{int:showpreview}}» тиекни баÑыгъыз, джангы JS-файлны Ñакълатырыгъызны аллы бла тинтиб кёрюрча.",
'usercsspreview' => "'''ЭÑде тутугъуз, бу къуру ал къарауду, CSS файлыгъыз алкъын Ñакъланмагъанды!'''",
'userjspreview' => "'''ЭÑде тутугъуз, бу къуру ал къарауду, javascript файлыгъыз алкъын Ñакъланмагъанды!'''",
-'userinvalidcssjstitle' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·:''' «$1» атлы тема джокъду. ЭÑде тутугъуз, .css Ñм .js бетле атлары ажымÑыз къуру гитче харифледен болургъа керекди, Ñёз ючюн: {{ns:user}}:Foo/monobook.css, былай {{ns:user}}:Foo/Monobook.css тюйюл!",
+'userinvalidcssjstitle' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·:''' «$1» атлы тема джокъду. ЭÑде тутугъуз, .css Ñм .js бетле атлары ажымÑыз къуру гитче харифледен болургъа керекди, Ñёз ючюн: {{ns:user}}:Foo/vector.css, былай {{ns:user}}:Foo/Vector.css тюйюл!",
'updated' => '(Джангыртылды)',
'note' => "'''Белги:'''",
'previewnote' => "'''Бу къуру ал къарауду, текÑÑ‚ алкъын Ñакъланмагъанды!'''",
@@ -677,9 +676,6 @@ $2',
Башхала Ñизни текÑтлеригизни тюрлендиргенлерин излемей ÑÑегиз, былайгъа Ñалмагъыз.<br />
Сиз дагъыда Ñтген къошакъларыгъызны автору болгъаныгъызны неда информациÑны чыкъгъан джери Ñркин джаÑргъа Ñм тюрлендирирге къойгъанын аны бегитеÑиз (къарагъыз: $1).
'''ЭРКИÐЛИКСИЗ ÐВТОР Ð¥ÐКЪ БЛРДЖÐКЪЛÐÐÐГÐÐ ÐœÐТЕРИÐЛЛРСÐЛМÐГЪЫЗ БЫЛÐЙГЪÐ!'''",
-'longpagewarning' => "'''ЭÑгертиу: Бу бетни узунлугъу $1 килобайтды.
-Ðлчемлери 32 КБ джууукълашхан неда андан кёб болгъан бетлени бир-бир браузерле Ñ‚ÐµÑ€Ñ ÐºÑ‘Ñ€Ð³ÑŽÐ·ÑŽÑ€Ð³Ðµ боллукъдула.
-ТекÑтни гитчерек кеÑеклеге юлешиб кёрюгюз.'''",
'longpageerror' => "'''Ð¥ÐТÐ: Ñиз Ñакълатхан текÑтни ёлчеми $1 килобайтды, ол $2 килобайт чекден кёбдю. Бет Ñакъланныкъ тюлдю.'''",
'readonlywarning' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·: Билгилени базаÑÑ‹ буÑагъатда киритленибди. Ол Ñебебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда Ñакълаб, кечирек къошаргъа боллукъÑуз'''
@@ -855,6 +851,8 @@ $1",
'logdelete-failure' => "'''Журналны кёрюнюую Ñалыналмады:'''
$1",
'revdel-restore' => 'кёрюнюуню тюрлендир',
+'revdel-restore-deleted' => 'кетерилген верÑиÑла',
+'revdel-restore-visible' => 'кёрюннген верÑиÑла',
'pagehist' => 'Бетни тарихи',
'deletedhist' => 'Кетериулени тарихи',
'revdelete-content' => 'контент',
@@ -924,11 +922,13 @@ $1",
# Diffs
'history-title' => '«$1» бетни тюрлениу тарихи',
'difference' => '(ВерÑиÑланы араларында башхалыкъ)',
+'difference-multipage' => '(Бетле араÑында башхалыкъ)',
'lineno' => 'Тизгин $1:',
'compareselectedversions' => 'Сайланнган верÑиÑланы тенглешдириу',
'showhideselectedversions' => 'Сайланнган верÑиÑланы кёргюз/джашыр',
'editundo' => 'ызына алыу',
-'diff-multi' => '(Кёргюзюлмеген {{PLURAL:$1|$1 аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди.)',
+'diff-multi' => '({{PLURAL:$2|Бир къошулуучу|$2 къошулуучу}} Ñтген {{PLURAL:$1|$1 аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
+'diff-multi-manyusers' => '($2 къошулуучудан кёб {{PLURAL:$2|Бир къошулуучу|къошулуучу}} Ñтген {{PLURAL:$1|бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
# Search results
'searchresults' => 'Излеуню ÑÑеби',
@@ -963,6 +963,7 @@ $1",
'searchprofile-everything-tooltip' => 'Бютеу бетледе изле (Ñюзюу бетледеда)',
'searchprofile-advanced-tooltip' => 'Энчи ат аланладада изле',
'search-result-size' => '$1 ({{PLURAL:$2|$2 Ñёз}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Ñлемент|$1 Ñлемент}} ({{PLURAL:$2|1 тюбкатегориÑ|$2 тюбкатегориÑ}}, {{PLURAL:$3|1 файл|$3 файл}})',
'search-result-score' => 'Келишиулюк: $1%',
'search-redirect' => '(Джиберилиниу $1)',
'search-section' => '($1 бёлюм)',
@@ -1037,6 +1038,7 @@ $1",
'contextlines' => 'Хар табылыннганнга кёргюзюлген тизгинлени Ñаны:',
'contextchars' => 'Тизгиннге контекÑтни Ñимволларыны Ñаны:',
'stub-threshold' => '<a href="#" class="stub">Стаблагъа джибериуню</a> формат Ñтер ючюн марда (байтлада):',
+'stub-threshold-disabled' => 'Джукъланыбды',
'recentchangesdays' => 'ÐÑ…Ñ‹Ñ€ тюрлениуледе кёргюзюллюк кюнле:',
'recentchangesdays-max' => '(макÑимум $1 {{PLURAL:$1|кюн|кюн}})',
'recentchangescount' => 'Тынгылау бла кёргюзюллюк тюрлениулени Ñаны:',
@@ -1070,6 +1072,7 @@ $1",
'prefs-files' => 'Файлла',
'prefs-custom-css' => 'Энчи CSS',
'prefs-custom-js' => 'Энчи JS',
+'prefs-common-css-js' => 'Бир CSS/JS-ле, халны бары темаларына да:',
'prefs-reset-intro' => 'Бу бетни джарашдырыуларыгъызны тынгылыау бла Ñалыннган джарашдырыулагъа кёчюрюрге хайырланаллыкъÑыз.
Бу ишлемни къабыл ÑÑ‚Ñегиз, ызына къайтараллыкъ тюлÑюз.',
'prefs-emailconfirm-label' => 'Электрон почтаны бегитиу:',
@@ -1111,7 +1114,9 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'prefs-advancedrendering' => 'Кенгленнген джарашдырыула',
'prefs-advancedsearchoptions' => 'Кенгленнген джарашдырыула',
'prefs-advancedwatchlist' => 'Кенгленнген джарашдырыула',
-'prefs-display' => 'Кёрюнюуню джарашдырыулары',
+'prefs-displayrc' => 'Кёрюнюуню джарашдырыулары',
+'prefs-displaysearchoptions' => 'Кёрюнюуню джарашдырыулары',
+'prefs-displaywatchlist' => 'Кёрюнюуню джарашдырыулары',
'prefs-diffs' => 'ВерÑиÑланы башхалыкълары',
# User rights
@@ -1198,6 +1203,7 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'right-hideuser' => 'Къошулуучуну атын тый Ñмда аны джашыр',
'right-ipblock-exempt' => 'IP тыйылуаны, автомат тыйыуланы Ñм диапозонланы тыйыуланы ётюдюр',
'right-proxyunbannable' => 'ПрокÑилени автомат тыйыуларыны ётдюр',
+'right-unblockself' => 'кеÑлерини блокларын алыу',
'right-protect' => 'Къорууну дараджаÑын тюрлендир Ñмда къорууланнган бетледе тюрлениуле ÑÑ‚',
'right-editprotected' => 'Къорууланнган бетледе тюрлениу ÑÑ‚ (ÑекиртмеÑиз джакъÑыз)',
'right-editinterface' => 'Къошулуучу интерфейÑни тюрлендир',
@@ -1220,7 +1226,6 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'right-siteadmin' => 'Билги базаны киритле Ñмда киритни ач',
'right-reset-passwords' => 'Башха къошулуучуланы паролларын кетер',
'right-override-export-depth' => 'Бетлени, теренлиги 5-ге дери байламлы бетле бла бирге ÑкÑпорт ÑÑ‚',
-'right-versiondetail' => 'Программа баджарыуну кенглетилген информациÑÑыны кёргюз',
'right-sendemail' => 'Башха къошулуучулагъа Ñлектрон почта джиберирге',
# User rights log
@@ -1271,14 +1276,9 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'recentchanges-legend' => 'ÐÑ…Ñ‹Ñ€ тюрлениулени джарашдырыулары',
'recentchangestext' => 'Тюбюнде, ВикипедиÑда Ñтилген ахыр тюрлениуле Ñ…Ñ€Ð¾Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð±Ð»Ð° тизилиб турадыла.',
'recentchanges-feed-description' => 'Викиде бу лентада тюрлениулени кёзде тут.',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 — джангы бет',
'recentchanges-label-newpage' => 'Бу тюрлендириу бла джангы бет къуралгъанды',
-'recentchanges-legend-minor' => '$1 — гитче тюрлендириу',
'recentchanges-label-minor' => 'Бу гитче тюрлениудю',
-'recentchanges-legend-bot' => '$1 — ботну тюрлендириую',
'recentchanges-label-bot' => 'Бу тюрлендириуню бот Ñтгенди',
-'recentchanges-legend-unpatrolled' => '$1 - патруль Ñтилинмеген тюрлендириуле',
'recentchanges-label-unpatrolled' => 'Бу тюрлендириу алкъын патруль Ñтилинмегенди',
'rcnote' => '$4 $5 заманнга, арт {{PLURAL:$1|1|$1}} тюрлениу {{PLURAL:$2|1|$2}} кюнню ичинде',
'rcnotefrom' => 'Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле',
@@ -1327,6 +1327,9 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'upload_directory_missing' => 'Джюклеу Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ($1) табылмайды Ñмда веб-Ñервер бла къуралалмайды.',
'upload_directory_read_only' => 'Веб-Ñервер файл джюкленнегн ($1) папкагъа джазыу Ñркинлиги джокъду.',
'uploaderror' => 'Джюклеуню хатаÑÑ‹',
+'upload-recreate-warning' => "'''Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·. Быллай аты бла файл кетерилген Ñтгенди неда аты тюрленилиннгенди.'''
+
+Бу бетге кетериуле бла ат тюрлендириулени журналы тюбюрекде бериледи:",
'uploadtext' => "Файл джюклер ючюн тюбюндеги форманы хайырлан.
Ðлландан джюкленнген файлланы кёрюр неда излер ючюн [[Special:FileList|джюкленнген файлланы ÑпиÑогуна]] къарагъыз, (джангыдан) джюкленнгенле [[Special:Log/upload|джюклеу журналында]], кетерилгенле [[Special:Log/delete|кетериу журналында]] тутуладыла.
@@ -1362,6 +1365,17 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'filetype-banned-type' => "'''\".\$1\"''' джаÑакъланнган файл типиди.
Эркинлик берилген {{PLURAL:\$3|файл тип|файл типле}} \$2.",
'filetype-missing' => 'Файлны кенглешиуу джокъду (Ñёз ючюн, «.jpg» кибик)',
+'empty-file' => 'Сиз ийген файл бошду.',
+'file-too-large' => 'Сиз ийген файл аÑыры уллуду.',
+'filename-tooshort' => 'Файлны аты аÑыры къыÑхады.',
+'filetype-banned' => 'Быллай типли файлла джаÑакъланыбдыла.',
+'verification-error' => 'Бу файл тинтилиу процедураны ётмегенди.',
+'hookaborted' => 'Сиз теджеген тюрлендириуню кенгертиуню Ñюзюучю джаÑакълагъанды.',
+'illegal-filename' => 'Джарамагъан файл ат.',
+'overwrite' => 'Болгъан файлны ауушдурургъа болмайды.',
+'unknown-error' => 'Белгили болмагъан халат.',
+'tmp-create-error' => 'Болджаллы файл къуралмайды.',
+'tmp-write-error' => 'Болджаллы файлгъ джазыуну халаты.',
'large-file' => 'Файлланы $1 байтдан уллу болмаÑÑ‹ изленеди (бу файлны ёлчеми $2)',
'largefileserver' => 'Бу файл Ñервер Ñркинлик бергенден уллуду.',
'emptyfile' => 'Джюклеген файлыгъыз бош кёрюнеди. Буну чуруму файлны атыны джазыуда халат болургъа болур. Файлны джюклерге излегенигизден ишекÑиз болугъуз.',
@@ -1388,13 +1402,14 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
Дагъыда файлыгъызны джюклерге излей ÑÑегиз, ызына къайтыб джангы ат хайырланыгыз. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Бу файл Ñндиги {{PLURAL:$1|файлны|файлланы}} дубликатыды:',
'file-deleted-duplicate' => 'Бу файлны ушашы болгъан башха файл ([[:$1]]) алгъаракъ кетерилгенди. Бу файлны джангыдан джюклерни аллы бла файлны кетериуюню тарихи бла танышыгъыз.',
-'successfulupload' => 'Джюклеу тыйыншлы ётдю',
'uploadwarning' => 'ЭÑгертиу',
'uploadwarning-text' => 'Файлны тюбюрекде келтирилген ачыкълауун тюрлендиригиз да джангыдан кёрюгюз.',
'savefile' => 'Файлны Ñакълат',
'uploadedimage' => '«[[$1]]» джюкленнгенди',
'overwroteimage' => '«[[$1]]» Ñуратны джангы верÑиÑÑÑ‹ джюкленнгенди',
'uploaddisabled' => 'Джюклеуге Ñркинлик джокъду',
+'copyuploaddisabled' => 'URL кёре джюклеу джукъланыбды.',
+'uploadfromurl-queued' => 'Сизни джюклеуюгюз кёзюуге Ñалыннганды.',
'uploaddisabledtext' => 'Файлланы джюклеу мадар джукъланыбды',
'php-uploaddisabledtext' => 'PHP-да файл джюклеу амал джукъланыбды.
file_uploads джарашдырыулагъа бир къарагъыз.',
@@ -1429,6 +1444,14 @@ JD # Jenoptik
MGP # Pentax
PICT # тюрлю-тюрлюле
#</pre> <!-- бу тизгинни тургъаныча къоюгъуз -->',
+'upload-success-subj' => 'Джюклеу тыйыншлы ётдю',
+'upload-success-msg' => '[$2] джюклемигиз тыйыншлы ётдю. Сиз джюклеген былайдады: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Джюклеу бла проблема',
+'upload-failure-msg' => '[$2] адреÑден джюклемигиз бла проблема болгъанды:
+
+$1',
+'upload-warning-subj' => 'Джюклеуде ÑÑгертиу',
+'upload-warning-msg' => '[$2] джюклеуюгюз бла халат болду. Халатны тюзетир ючюн [[Special:Upload/stash/$1|джюклеу формагъа]] къайтыгъыз.',
'upload-proto-error' => 'Халатлы протокол',
'upload-proto-error-text' => 'Узакъдан джюклеу,<code>http://</code> неда <code>ftp://</code> бла башланнган URL-ле керекдиле.',
@@ -1494,6 +1517,7 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'listfiles_search_for' => 'Медиа ат бла изле:',
'imgfile' => 'файл',
'listfiles' => 'Файлланы ÑпиÑогу',
+'listfiles_thumb' => 'Миниатюра',
'listfiles_date' => 'Заман',
'listfiles_name' => 'Файлны аты',
'listfiles_user' => 'Къошулуучу',
@@ -1608,8 +1632,8 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'statistics-edits' => '{{SITENAME}} къуралгъанындан бери Ñтилген тюрлендириуле.',
'statistics-edits-average' => 'Хар бетдеги тюрлендириулени орта Ñаны',
'statistics-views-total' => 'Къараула бютеулей',
+'statistics-views-total-desc' => 'Къуралмагъан бетле бла къуллукъ бетлеге къараула Ñаналмайдыла.',
'statistics-views-peredit' => 'Тюрлендириуге къарауну Ñаны',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Иш кёзюуню] узунлугъу',
'statistics-users' => 'РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтилген [[Special:ListUsers|къошулуучула]]',
'statistics-users-active' => 'Ðктив къошулуучула',
'statistics-users-active-desc' => 'ÐÑ…Ñ‹Ñ€ {{PLURAL:$1|1 кюнде|$1 кюнде}} ишлеме Ñтген къошулуучула',
@@ -1623,7 +1647,7 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'doubleredirects' => 'Джибериу болгъан джибериуле',
'doubleredirectstext' => 'Бу бетде башхы джибериулеге Ñтилген джибериулени ÑпиÑогу барды.
Хар тизгин биринчи неда Ñкинчи джибериуню Ñмда аÑламыÑында бетни аты джазылгъан, биринчи джибериу кёргюзген, Ñкинчи джибериуню нюзюр бети джазылады.
-<s>ЮÑÑŽ Ñызылгъан</s джазыула тюзетилген Ñтгендиле.',
+<del>ЮÑÑŽ Ñызылгъан</del> джазыула тюзетилген Ñтгендиле.',
'double-redirect-fixed-move' => '[[$1]] бет атын тюрлендиргенди, Ñнди ол [[$2]] бетге джибериу Ñтеди',
'double-redirect-fixer' => 'Джибериулени тюзетиучю',
@@ -1646,6 +1670,8 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'nmembers' => '$1 {{PLURAL:$1|объект}}',
'nrevisions' => '$1 {{PLURAL:$1|верÑиÑ|верÑиÑ}}',
'nviews' => '$1 {{PLURAL:$1|къарау|къарау}}',
+'nimagelinks' => '$1 {{PLURAL:$1|бетде|бетде}} хайырланады',
+'ntransclusions' => '$1 {{PLURAL:$1|бетде|бетде}} хайырланады',
'specialpage-empty' => 'Сорма ÑÑеб келтирмеди.',
'lonelypages' => 'ÐкÑюз бетле',
'lonelypagestext' => 'Тюбюндеги бетлеге {{SITENAME}} Ñайтдагъы башха бетледен джибериу берилмегенди неда ала башха бетлеге къошулмагъандыла.',
@@ -1806,34 +1832,40 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'listgrouprights-removegroup-self-all' => 'КеÑини тергеу джазыуундан бютеу къауумланы къораталлыкъды',
# E-mail user
-'mailnologin' => 'Джиберирге Ð°Ð´Ñ€ÐµÑ Ð´Ð¶Ð¾ÐºÑŠÐ´Ñƒ',
-'mailnologintext' => 'Башха къошулуучулагъа Ñл. почта джиберелир ючюн [[Special:UserLogin|ÑиÑтемагъа кирирге]] керекÑиз Ñм [[Special:Preferences|джарашдырыуланы]] бетинде джараулу Ñл. почта Ð°Ð´Ñ€ÐµÑ Ð±Ð¾Ð»ÑƒÑ€Ð³ÑŠÐ° керекди.',
-'emailuser' => 'Къошулуучугъа пиÑьмо',
-'emailpage' => 'Къошулуучугъа пиÑьмо джибер',
-'emailpagetext' => 'Бу къошулуучуну почтаÑына пиÑьмо джиберир ючюн бу форманы толтурургъа боллукъÑуз.
+'mailnologin' => 'Джиберирге Ð°Ð´Ñ€ÐµÑ Ð´Ð¶Ð¾ÐºÑŠÐ´Ñƒ',
+'mailnologintext' => 'Башха къошулуучулагъа Ñл. почта джиберелир ючюн [[Special:UserLogin|ÑиÑтемагъа кирирге]] керекÑиз Ñм [[Special:Preferences|джарашдырыуланы]] бетинде джараулу Ñл. почта Ð°Ð´Ñ€ÐµÑ Ð±Ð¾Ð»ÑƒÑ€Ð³ÑŠÐ° керекди.',
+'emailuser' => 'Къошулуучугъа пиÑьмо',
+'emailpage' => 'Къошулуучугъа пиÑьмо джибер',
+'emailpagetext' => 'Бу къошулуучуну почтаÑына пиÑьмо джиберир ючюн бу форманы толтурургъа боллукъÑуз.
Ызына Ð°Ð´Ñ€ÐµÑ Ð±Ð¾Ð»ÑƒÐ±, Ñиз [[Special:Preferences|джарашдырыуларыгъызда]] джазгъан Ð°Ð´Ñ€ÐµÑ Ð±ÐµÐ»Ð³Ð¸Ð»ÐµÐ½Ð½Ð¸ÐºÐ´Ð¸, ол Ñебебден Ñизни пиÑьмогъузну аллыкъ Ñизге тюз джууаб берирге мадарлы боллукъду.',
-'usermailererror' => 'Халат ючюн Ñлетктрон пиÑьмо ызына къайтды:',
-'defemailsubject' => '{{SITENAME}} пиÑьмо',
-'noemailtitle' => 'Электрон почтаны адреÑи джокъду',
-'noemailtext' => 'Бу къошулуучу керти Ñлектрон адреÑин бермегенди.',
-'nowikiemailtitle' => 'Электрон пиÑьмо джиберирге Ñркинлик джокъду',
-'nowikiemailtext' => 'Бу къошулуучу, башха къошулуучуладан Ñлектрон пиÑмо алыргъа излемегенин билдиргенди.',
-'email-legend' => 'Башха {{SITENAME}} къошулуучугъа Ñлектрон пиÑьмо джибер',
-'emailfrom' => 'Кимден:',
-'emailto' => 'Кимге:',
-'emailsubject' => 'Тема:',
-'emailmessage' => 'Билдириу:',
-'emailsend' => 'Джибер',
-'emailccme' => 'ПиÑьмону копиÑÑын меннге джибер',
-'emailccsubject' => '$1-ге джиберилген пиÑьмону копиÑÑÑ‹: $2',
-'emailsent' => 'ПиÑьмо джиберилди',
-'emailsenttext' => 'Сизни Ñлектрон билдириуюгюз джиберилгенди.',
-'emailuserfooter' => 'Бу пиÑьмо $1 джанындан $2 къошулуучугъа, {{SITENAME}} Ñайтдагъы "Къошулуучугъу пиÑьмо джибер" функциÑÑÑ‹ бла джиберилгенди.',
+'usermailererror' => 'Халат ючюн Ñлетктрон пиÑьмо ызына къайтды:',
+'defemailsubject' => '{{SITENAME}} пиÑьмо',
+'usermaildisabled' => 'Къошулуучуну Ñлектрон почтаÑÑ‹ джукъланыбды',
+'usermaildisabledtext' => 'Сиз бу викини башха къошулуучуларына Ñлектрон пиÑьмола джиберелмейÑиз',
+'noemailtitle' => 'Электрон почтаны адреÑи джокъду',
+'noemailtext' => 'Бу къошулуучу керти Ñлектрон адреÑин бермегенди.',
+'nowikiemailtitle' => 'Электрон пиÑьмо джиберирге Ñркинлик джокъду',
+'nowikiemailtext' => 'Бу къошулуучу, башха къошулуучуладан Ñлектрон пиÑмо алыргъа излемегенин билдиргенди.',
+'email-legend' => 'Башха {{SITENAME}} къошулуучугъа Ñлектрон пиÑьмо джибер',
+'emailfrom' => 'Кимден:',
+'emailto' => 'Кимге:',
+'emailsubject' => 'Тема:',
+'emailmessage' => 'Билдириу:',
+'emailsend' => 'Джибер',
+'emailccme' => 'ПиÑьмону копиÑÑын меннге джибер',
+'emailccsubject' => '$1-ге джиберилген пиÑьмону копиÑÑÑ‹: $2',
+'emailsent' => 'ПиÑьмо джиберилди',
+'emailsenttext' => 'Сизни Ñлектрон билдириуюгюз джиберилгенди.',
+'emailuserfooter' => 'Бу пиÑьмо $1 джанындан $2 къошулуучугъа, {{SITENAME}} Ñайтдагъы "Къошулуучугъу пиÑьмо джибер" функциÑÑÑ‹ бла джиберилгенди.',
+
+# User Messenger
+'usermessage-summary' => 'СиÑтема билдириу джазыгъыз',
+'usermessage-editor' => 'СиÑтема билдириучю',
# Watchlist
'watchlist' => 'Кёзюмде тургъан тизмем',
'mywatchlist' => 'Кёзюмде тургъан тизмем',
-'watchlistfor' => "('''$1''' ючюн)",
+'watchlistfor2' => '$1 ючюн $2',
'nowatchlist' => 'Кёзюгюзде тургъан тизмегиз бошду.',
'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни ÑтатьÑланы кёрюр неда тюрлендирир ючюн $1.',
'watchnologin' => 'СиÑтемагъа кирирге керекди.',
@@ -1954,7 +1986,10 @@ $UNWATCHURL
'revertpage-nouser' => 'Тюрлендириуле (къошулуучуну аты кетерилгенди) [[User:$1|$1]] къошулуучуну верÑиÑÑына къайтарылдыла',
'rollback-success' => '$1 Ñтген тюрлендириуле ызына алыныб;
$2 тюрлендирген алгъаракъ верÑиÑÑына къайтылды.',
-'sessionfailure' => 'Ишни бу ÑеанÑÑ‹ бла проблемала болгъаннга ушайды;
+
+# Edit tokens
+'sessionfailure-title' => 'СеанÑны халаты',
+'sessionfailure' => 'Ишни бу ÑеанÑÑ‹ бла проблемала болгъаннга ушайды;
бу Ñтим "ÑеанÑны гудулаууна" къаршчылыкъ Ñтилир ючюн тохтатылгъанды.
Тилейбиз, "Ызына" деген тиекни баÑыгъыз Ñмда Ñиз кирген бетни джангыдан джюклегиз.',
@@ -2084,18 +2119,21 @@ $1',
'month' => 'Ðйдан башлаб (Ñм алгъаракъ):',
'year' => 'Джылдан башлаб (Ñм алгъаракъ):',
-'sp-contributions-newbies' => 'Джангы тергеу джазыу (аккаунт) бла Ñтилге къошакъны кёргюз',
-'sp-contributions-newbies-sub' => 'Джангы тергеу джазыуладан (аккаунтладан)',
-'sp-contributions-newbies-title' => 'Джангы тергеу джазыуладан Ñтилген къошакъ',
-'sp-contributions-blocklog' => 'Блок Ñтиуню журналы',
-'sp-contributions-deleted' => 'къошулуучуну кетерилген тюрлендириулери',
-'sp-contributions-logs' => 'журналла',
-'sp-contributions-talk' => 'Ñюзюу',
-'sp-contributions-userrights' => 'къошулуучуну хакъларына оноу Ñтиу',
-'sp-contributions-blocked-notice' => 'Бу къошулуучу буÑагъатда блокланыб турады. Тюбюнде блокланыуланы журналындан ахыр джазыу бериледи:',
-'sp-contributions-search' => 'Къошакъны излеу',
-'sp-contributions-username' => 'Къошулуучуну IP-адреÑи неда аты:',
-'sp-contributions-submit' => 'Таб',
+'sp-contributions-newbies' => 'Джангы тергеу джазыу (аккаунт) бла Ñтилге къошакъны кёргюз',
+'sp-contributions-newbies-sub' => 'Джангы тергеу джазыуладан (аккаунтладан)',
+'sp-contributions-newbies-title' => 'Джангы тергеу джазыуладан Ñтилген къошакъ',
+'sp-contributions-blocklog' => 'Блок Ñтиуню журналы',
+'sp-contributions-deleted' => 'къошулуучуну кетерилген тюрлендириулери',
+'sp-contributions-logs' => 'журналла',
+'sp-contributions-talk' => 'Ñюзюу',
+'sp-contributions-userrights' => 'къошулуучуну хакъларына оноу Ñтиу',
+'sp-contributions-blocked-notice' => 'Бу къошулуучу буÑагъатда блокланыб турады. Тюбюнде блокланыуланы журналындан ахыр джазыу бериледи:',
+'sp-contributions-blocked-notice-anon' => 'Бу IP-Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÑагъатда блокга Ñалыныбды.
+Тюбюнде блокланыуланы журналындан ахыр джазыу бериледи:',
+'sp-contributions-search' => 'Къошакъны излеу',
+'sp-contributions-username' => 'Къошулуучуну IP-адреÑи неда аты:',
+'sp-contributions-toponly' => 'Къуру ахыр верÑиÑланы кёргюз',
+'sp-contributions-submit' => 'Таб',
# What links here
'whatlinkshere' => 'Былайгъа джибериуле',
@@ -2154,7 +2192,6 @@ $1',
'ipb-edit-dropdown' => 'Чурумланы ÑпиÑогун тюрлендир',
'ipb-unblock-addr' => '$1 блокдан ал',
'ipb-unblock' => 'Къошулуучуну неда IP-адреÑни тыйылыуун тохтат',
-'ipb-blocklist-addr' => '$1 ючюн буÑагъатдагъы тыйгъычла',
'ipb-blocklist' => 'БуÑагъатдагъы болгъан тыйгъычланы кёргюз',
'ipb-blocklist-contribs' => '$1 къошулуучуну къошханы',
'unblockip' => 'Къошулуучуну тыйгъыч Ñтиуню тохтат',
@@ -2228,6 +2265,8 @@ $1 алайÑызда тыйылыбды. Джарашдырыуланы Ñ‚ÑŽÑ€Ð
'sorbs_create_account_reason' => 'IP-адреÑигиз, translatewiki.net Ñайтда хайырланнган DNSBL-де ачыкъ прокÑи кибик Ñаналады. Тергеу джазыу къураÑллыкъ тюлÑюз.',
'cant-block-while-blocked' => 'Сиз кеÑигиз блокда заманда, башха къошулуучуланы блок Ñтеллик тюлÑюз.',
'cant-see-hidden-user' => 'ТыÑргъа излеген къошулуучу алайÑызда тыйылыбды Ñмда джашырылыбды. Къошулуучуну джашырыргъа Ñркинлигигиз болмагъаны Ñебебли, Ñиз бу блокну не къараÑллыкъ, неда тюрлендиреллик тюлÑюз.',
+'ipbblocked' => 'КеÑигиз блокда болгъаныгъыз Ñебебли, Ñиз башхаланы блокга Ñалыргъа неда блокларын алыргъа мадарыгъыз джокъду',
+'ipbnounblockself' => 'Сиз кеÑи кеÑигизни блокдан алыр мадарыгъыз джокъду',
# Developer tools
'lockdb' => 'Билги база киритлиди',
@@ -2262,6 +2301,17 @@ $1 алайÑызда тыйылыбды. Джарашдырыуланы Ñ‚ÑŽÑ€Ð
'''ЭСГЕРТИУ!'''
Ðтын тюрлендириу, \"айырма бетлени\" уллу ёлчемде , Ñмда Ñакъланмагъан тюрлениулеге келтирирге боллукъду.
Тилейбиз, мындан ары бардырлыгъыгъызны аллы бла, ахырында чыгъарыкъ ÑÑеблени ангылагъаныгъызгъа ишекÑиз болугъуз.",
+'movepagetext-noredirectfixer' => "Сиз, тюбюндеги форманы хайырландырыб, бетни атын тюрлендирликÑиз, аны бла бирге аны тюрлениулерини журналын джангы оруннга кёчюрлюкÑюз.
+ЭÑки аты джангы атына джибериу боллукъду.
+[[Special:DoubleRedirects|Экили]] Ñм [[Special:BrokenRedirects|юзюлген джибериуле]] бар ÑÑеле къарагъыз.
+Джибериулени мындан арыда керекли джерни кёргюзюулерине Ñиз джууаблыÑыз.
+
+Бет джангыдан джибериу болгъанны, неда тюрлендириулени тарихи болмай бош болгъанны тышында, джангы аты бла бет бар ÑÑе, бетни атын тюрлендиреллик '''тюлÑюз''' .
+Ðны магъанаÑÑ‹: Ñиз бетни атын, мындан алгъа болгъан атына къайтарыргъа боллукъÑуз, халат бла атын тюрлендирген ÑÑегиз, болгъан бет билмей кетерилиб къаллыкъ тюлдю.
+
+'''ЭСГЕРТИУ!'''
+Ðтын тюрлендириу, \"популÑÑ€ бетлени\" уллу ёлчемде Ñмда Ñакъланмагъан тюрлениулеге келтирирге боллукъду.
+Мындан ары бардырлыгъыгъызны аллы бла, ахырында чыгъарыкъ ÑÑеблени ангылагъаныгъызгъа ишекÑиз болугъуз.",
'movepagetalktext' => "Къошулгъан Ñюзюу бет да автомат халда кёчюрюлюннюкдю, '''быллай ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ð¸Ñ Ð±Ð¾Ð»Ð¼Ð°Ñа''':
*Бош болмагъан Ñюзюу бет бу аты бла барды;
@@ -2317,6 +2367,7 @@ $1 алайÑызда тыйылыбды. Джарашдырыуланы Ñ‚ÑŽÑ€Ð
'immobile-source-page' => 'Бу бетни атын тюрлендирирге боллукъ тюлдю',
'immobile-target-page' => 'Бетге бу атны берирге болмайды.',
'imagenocrossnamespace' => 'Файл, файлла ючюн болмагъан ат аламына кёчюерлмез.',
+'nonfile-cannot-move-to-file' => 'Файл болмагъанлагъа файл ат берирге болмайды',
'imagetypemismatch' => 'Джангы файл кенгериу типине келишмейди',
'imageinvalidfilename' => 'Файлны нюзюр аты джарауÑузду',
'fix-double-redirects' => 'Ðлгъыннгы атына джибериулени автомат халда тюзетигиз',
@@ -2396,6 +2447,7 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
'importstart' => 'Файлла импорт Ñтиле турадыла...',
'import-revision-count' => '$1 {{PLURAL:$1|верÑиÑ|верÑиÑ}}',
'importnopages' => 'Импорт Ñтиллик бет джокъду',
+'imported-log-entries' => 'Журналны {{PLURAL:$1|джазыуу|джазыуу}} импорт Ñтилинди.',
'importfailed' => '$1 импорту джетишимÑиз бошалды',
'importunknownsource' => 'Билинмеген импорт къайнакъ типи',
'importcantopen' => 'Импорт Ñтилген файл ачылалмады',
@@ -2491,6 +2543,8 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
'tooltip-upload' => 'Джюклеуню башла',
'tooltip-rollback' => 'Бир баÑхан бла ахыр къошулуучуну тюрлендиргенин кетер',
'tooltip-undo' => 'Этилиннген тюрлендириуню ызына ал Ñмда ал къарауну кёргюз, ызына нек алыннгын чертирча',
+'tooltip-preferences-save' => 'Джарашдырыуланы Ñакълат',
+'tooltip-summary' => 'КъыÑха ачыкълау джазыгъыз',
# Metadata
'nodublincore' => 'Dublin Core RDF метабилгиле бу Ñерверде джаÑакъдыла.',
@@ -2590,20 +2644,23 @@ $1',
'nextdiff' => 'Эндиги тюрлендириу →',
# Media information
-'mediawarning' => "'''ЭÑгертиу''': Бу файл типи аман иннетли кодла тутаргъа боллукъду.
+'mediawarning' => "'''ЭÑгертиу''': Бу файл типи аман иннетли кодла тутаргъа боллукъду.
Буну ишлетÑегиз ÑиÑтемагъызгъа заран келтирирге боллукъÑуз.",
'imagemaxsize' => "Суратны ёлчемини чеги:<br />''(файлны ангылытыу бетле ючюн)''",
'thumbsize' => 'Гитче ёлчем:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|бет|бет}}',
-'file-info' => '(файлны ёлчеми: $1, MIME типи: $2)',
-'file-info-size' => '($1 × $2 пикÑель, файлны ёлчеми: $3, MIME типи: $4)',
+'file-info' => 'файлны ёлчеми: $1, MIME типи: $2',
+'file-info-size' => '$1 × $2 пикÑель, файлны ёлчеми: $3, MIME типи: $4',
'file-nohires' => '<small>Мындан ары ачыкъланнган верÑиÑÑÑ‹ джокъду</small>',
-'svg-long-desc' => '(SVG файл, шартлы $1 × $2 пикÑель, файлны ёлчеми: $3)',
+'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пикÑель, файлны ёлчеми: $3',
'show-big-image' => 'Толу ачыкълау',
'show-big-image-thumb' => '<small>Ðл къарауда ёлчеми: $1 × $2 пикÑель</small>',
'file-info-gif-looped' => 'тогъайланнганды',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм|фрейм}}',
+'file-info-png-looped' => 'тогъайланнганды',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|кере|кере}} ойнатылды',
+'file-info-png-frames' => '$1 {{PLURAL:$1|фрейм|фрейм}}',
# Special:NewFiles
'newimages' => 'Джангы файлланы галереÑÑÑ‹',
@@ -2925,27 +2982,27 @@ $1',
'limitall' => 'бютеую',
# E-mail address confirmation
-'confirmemail' => 'Электорн адреÑни мюкюл ÑÑ‚',
-'confirmemail_noemail' => '[[Special:Preferences|джарашдырыулада]] тамамланнган, джараулу Ñлектрон адреÑигиз джокоъду.',
-'confirmemail_text' => 'Викини Ñлектрон почтаÑыны адреÑи бла хайырланыб башлауну аллы бла, аны мюкюл Ñтериге керекди.
+'confirmemail' => 'Электорн адреÑни мюкюл ÑÑ‚',
+'confirmemail_noemail' => '[[Special:Preferences|джарашдырыулада]] тамамланнган, джараулу Ñлектрон адреÑигиз джокоъду.',
+'confirmemail_text' => 'Викини Ñлектрон почтаÑыны адреÑи бла хайырланыб башлауну аллы бла, аны мюкюл Ñтериге керекди.
ÐдреÑигизге мюкюл Ñтиу пиÑьмо ийилир ючюн, тюбюндеги тиекден баÑыгъыз.
ПиÑьмода адреÑигизни мюкюл Ñтер ючюн джибериу боллукъду, аннга баÑÑагъыз Ñиз Ñнчи бир бетге чыгъарыкъÑыз, андан башлаб Ñизни адреÑигиз мюкюл болгъаннга Ñаналады.',
-'confirmemail_pending' => 'Мюкюл Ñтиуню коду бла пиÑьмо Ñизге алайÑызда джиберилгенди;
+'confirmemail_pending' => 'Мюкюл Ñтиуню коду бла пиÑьмо Ñизге алайÑызда джиберилгенди;
Тергеу джазыуугъуз джангы къурагъан ÑÑегиз, джангы бир код ишлеуню башланыууну аллы бла бир кеÑек Ñакъларыгъызны тилейбиз.',
-'confirmemail_send' => 'Мюкюл кодну джибер',
-'confirmemail_sent' => 'Мюкюл Ñтиу пиÑьмо джиберилди.',
-'confirmemail_oncreate' => 'Мюкюл Ñтиу код Ñлектрон адреÑигизге джиберилди.
+'confirmemail_send' => 'Мюкюл кодну джибер',
+'confirmemail_sent' => 'Мюкюл Ñтиу пиÑьмо джиберилди.',
+'confirmemail_oncreate' => 'Мюкюл Ñтиу код Ñлектрон адреÑигизге джиберилди.
Кирир ючюн бу код керек тюлдю, алай а бу викиде хайырландырыб башлар ючюн бу кодну белгилерге керекÑиз.',
-'confirmemail_sendfailed' => '{{SITENAME}} Мюкюл пиÑьмо джиберилелмеди. ДжарауÑуз харифле болургъа болур, адреÑни оÑмакълагъыз.
+'confirmemail_sendfailed' => '{{SITENAME}} Мюкюл пиÑьмо джиберилелмеди. ДжарауÑуз харифле болургъа болур, адреÑни оÑмакълагъыз.
Серверни джууабы: $1',
-'confirmemail_invalid' => 'ДжарауÑуз мюкюл код. Мюкюл кодну ахыр хайырланыу болджалы чыгъаргъа болур.',
-'confirmemail_needlogin' => 'Электорн адреÑигизни мюкюл Ñтер ючюн, алгъы бурун $1 Ñтерге керекÑиз.',
-'confirmemail_success' => 'Электрон почтагъызны адреÑи мюкюл Ñтилди. Олтуруу [[Special:UserLogin|ачыб]] Викини татыуун чыгъарыгъыз.',
-'confirmemail_loggedin' => 'Электорн почтагъызны адреÑи мюкюл Ñтилди.',
-'confirmemail_error' => 'Мюкюл Ñтилиуде билинмеген халат болду.',
-'confirmemail_subject' => '{{SITENAME}} Ñлектрон почта адреÑни мюкюл Ñтилиую',
-'confirmemail_body' => 'Ким ÑÑеда, биз Ñагъышдан, $1 IP адреÑден,
+'confirmemail_invalid' => 'ДжарауÑуз мюкюл код. Мюкюл кодну ахыр хайырланыу болджалы чыгъаргъа болур.',
+'confirmemail_needlogin' => 'Электорн адреÑигизни мюкюл Ñтер ючюн, алгъы бурун $1 Ñтерге керекÑиз.',
+'confirmemail_success' => 'Электрон почтагъызны адреÑи мюкюл Ñтилди. Олтуруу [[Special:UserLogin|ачыб]] Викини татыуун чыгъарыгъыз.',
+'confirmemail_loggedin' => 'Электорн почтагъызны адреÑи мюкюл Ñтилди.',
+'confirmemail_error' => 'Мюкюл Ñтилиуде билинмеген халат болду.',
+'confirmemail_subject' => '{{SITENAME}} Ñлектрон почта адреÑни мюкюл Ñтилиую',
+'confirmemail_body' => 'Ким ÑÑеда, биз Ñагъышдан, $1 IP адреÑден,
{{SITENAME}} Ñайтда бу Ñлектрон Ð°Ð´Ñ€ÐµÑ Ð±Ð»Ð° $2 тергеу джазыу къурады.
Бу тергеу джазыу кертида Ñизники болгъанын къабыл Ñмда {{SITENAME}} Ñайтдагъы
@@ -2959,8 +3016,20 @@ $3
$5
Бу мюкюл код $4 заманнга дери джарарыкъды.',
-'confirmemail_invalidated' => 'Электрон почтаны адреÑини мюкюл Ñтилиую тыйылды',
-'invalidateemail' => 'Электрон почтаны адреÑин мюкюл Ñтиуюн тый',
+'confirmemail_body_changed' => 'Ким ÑÑеда, биз Ñагъышдан, $1 IP адреÑден,
+{{SITENAME}} Ñайтда, $2 аккаунтны Ñлектрон адреÑин тюрлендиргенди.   
+
+Бу аккаунт кертида Ñизники болгъанын къабыл Ñмда {{SITENAME}} Ñайтдагъы Ñлектрон почта бла хайырланыуну актив халгъа келтирир ючюн, тюбюндеги джибериуню ачыгъыз.
+
+$3
+
+Ðккаунтны Ñиз *къурамагъан*  ÑÑегиз, Ñлекторн почта адреÑни мюкюл Ñтиуюню  тыÑÑ€ ючюн тюбюндеги джибериуню баÑыгъыз:
+
+$5
+
+Бу мюкюл код $4 заманнга дери джарарыкъды.',
+'confirmemail_invalidated' => 'Электрон почтаны адреÑини мюкюл Ñтилиую тыйылды',
+'invalidateemail' => 'Электрон почтаны адреÑин мюкюл Ñтиуюн тый',
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» джукъланыбды]',
@@ -3007,6 +3076,7 @@ $1',
'table_pager_first' => 'Биринчи бет',
'table_pager_last' => 'ÐÑ…Ñ‹Ñ€ бет',
'table_pager_limit' => 'Хар бетде $1 бет кёргюз',
+'table_pager_limit_label' => 'Бир бетде джазылыу:',
'table_pager_limit_submit' => 'Тындыр',
'table_pager_empty' => 'Табылмагъанды',
@@ -3119,6 +3189,7 @@ $1',
'version-specialpages' => 'Къуллукъчу бетле',
'version-parserhooks' => 'СинтакÑÐ¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð½Ñƒ тутуучула',
'version-variables' => 'Тюрленнгенле',
+'version-skins' => 'ДжаÑауну темалары',
'version-other' => 'Башха',
'version-mediahandlers' => 'МедиÑны джарашдырыучула',
'version-hooks' => 'Тутуучула',
@@ -3130,6 +3201,13 @@ $1',
'version-hook-subscribedby' => 'Ðбонент болгъан',
'version-version' => '(ВерÑÐ¸Ñ $1)',
'version-license' => 'ЛицензиÑ',
+'version-poweredby-credits' => "Бу вики '''[http://www.mediawiki.org/ MediaWiki]''' программа бла ишлейди, copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'башхала',
+'version-license-info' => 'MediaWiki Ñркин программа джазыуду, Ñиз аны GNU General Public License лицензиÑны (Ñркин программа джазыуланы фонду чыгъаргъан; Ñкинчи верÑиÑÑÑ‹ неда андан кеч къайÑÑ‹ÑÑ‹ да) шартларына кёре джаÑргъа Ñмда/неда тюрлендирирге боллукъÑуз.
+
+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) неда [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html лицензиÑны онлайн окъугъуз].',
'version-software' => 'Салыннган программа баджарыу',
'version-software-product' => 'Продукт',
'version-software-version' => 'ВерÑиÑ',
@@ -3200,6 +3278,15 @@ $1',
'tags-edit' => 'тюрлендир',
'tags-hitcount' => '$1 {{PLURAL:$1|тюрлениу|тюрлениу}}',
+# Special:ComparePages
+'comparepages' => 'Бетлени тенглешдир',
+'compare-selector' => 'Бет верÑиÑланы тенглешдир',
+'compare-page1' => 'Биринчи бет',
+'compare-page2' => 'Экинчи бет',
+'compare-rev1' => 'Биринчи верÑиÑ',
+'compare-rev2' => 'Экинчи верÑиÑ',
+'compare-submit' => 'Тенглешдир',
+
# Database error messages
'dberr-header' => 'Бу викини проблемаÑÑ‹ барды',
'dberr-problems' => 'КечерикÑиз! Бу Ñайтда техника джаны бла проблемала чыкъгъандыла.',
@@ -3216,8 +3303,13 @@ $1',
'htmlform-float-invalid' => 'Сиз белгилеген багъа Ñан тюлдю.',
'htmlform-int-toolow' => 'Сиз белгилеген багъа минимумну -$1 тюбюндеди',
'htmlform-int-toohigh' => 'Сиз белгилеген багъа макÑимумдан - $1 башындады',
+'htmlform-required' => 'Бу дараджа бек кереклиди',
'htmlform-submit' => 'Джибер',
'htmlform-reset' => 'Тюрлендириулени ызына Ñал',
'htmlform-selectorother-other' => 'Башха',
+# SQLite database support
+'sqlite-has-fts' => '$1 толу текÑÑ‚ излеуню хайырландыргъан',
+'sqlite-no-fts' => '$1 толу текÑÑ‚ излеуню хайырландыра билмеген',
+
);
diff --git a/languages/messages/MessagesKri.php b/languages/messages/MessagesKri.php
index ab6406b8..225bd111 100644
--- a/languages/messages/MessagesKri.php
+++ b/languages/messages/MessagesKri.php
@@ -288,7 +288,6 @@ Di [[Special:WhatLinksHere/$2|ful list]] de yah.',
# Watchlist
'watchlist' => 'Mi list foh wach',
'mywatchlist' => 'Mi list foh wach',
-'watchlistfor' => "(foh '''$1''')",
'nowatchlist' => 'Yu noh geht natin na yu list foh wach.',
'watchlistanontext' => '$1 Foh luk o chenj wetin de na yu list foh wach',
'watchnologin' => 'Yu noh kam insai di sait yet',
diff --git a/languages/messages/MessagesKrj.php b/languages/messages/MessagesKrj.php
index 06a8d4eb..499fc78f 100644
--- a/languages/messages/MessagesKrj.php
+++ b/languages/messages/MessagesKrj.php
@@ -23,7 +23,7 @@ $messages = array(
'tog-extendwatchlist' => "Palapadun ang ''watchlist'' agud nga mapakita ang tanan nga ginasogtan nga pag-ilis",
'tog-numberheadings' => "Automatiko nga togroan kang nomero ang manga ''heading''",
'tog-showtoolbar' => 'Ipakita ang pangbolig sa pag-ilis (JavaScript)',
-'tog-rememberpassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer''",
+'tog-rememberpassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer'' (for a maximum of $1 {{PLURAL:$1|day|days}})",
'tog-watchcreations' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpanghimo ko",
'tog-watchdefault' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpang-''edit'' ko",
'tog-watchmoves' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpanghalin ko",
@@ -214,7 +214,7 @@ Lantawa sa [[Special:Version|version kang page]].',
'viewsource' => 'Turukun ang ginhalinan',
# Login and logout pages
-'remembermypassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer''",
+'remembermypassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer'' (for a maximum of $1 {{PLURAL:$1|day|days}})",
'nologinlink' => "Himo ka sangka ''account''",
'createaccount' => "Himo ka ''account''",
diff --git a/languages/messages/MessagesKs.php b/languages/messages/MessagesKs.php
index 22a5d8e2..0de90873 100644
--- a/languages/messages/MessagesKs.php
+++ b/languages/messages/MessagesKs.php
@@ -9,7 +9,7 @@
*
*/
-#FIXME: inherit almost everything for now
+# FIXME: inherit almost everything for now
$rtl = true;
$digitTransformTable = array(
diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php
index 326ddf79..0047edda 100644
--- a/languages/messages/MessagesKsh.php
+++ b/languages/messages/MessagesKsh.php
@@ -14,29 +14,29 @@
/**
* Sources:
- * The following expressions are based on the Kölsch dictionaries:
- * Das Kölsche Wörterbuch, written by Christa Bhatt and Alice Herrwegen,
+ * The following expressions are based on the Kölsch dictionaries:
+ * Das Kölsche Wörterbuch, written by Christa Bhatt and Alice Herrwegen,
* published by: Akademie för uns kölsche Sproch, Cologne 2005,
* ISBN 3-7616-1942-1
* and
- * Neuer Kölnischer Sprachschatz in 3 Bänden, written by Adam Wrede, Cologne 1958,
+ * Neuer Kölnischer Sprachschatz in 3 Bänden, written by Adam Wrede, Cologne 1958,
* ISBN 3-7743-0155-7 ISBN 3-7743-0156-5 ISBN 3-7743-0157-3
*
- * The grammar (especially: conjugation) is taken from:
- * De kölsche Sproch - Kurzgrammatik Kölsch / Deutsch, written by Alice Tiling-Herrwegen,
+ * The grammar (especially: conjugation) is taken from:
+ * De kölsche Sproch - Kurzgrammatik Kölsch / Deutsch, written by Alice Tiling-Herrwegen,
* published by: Akademie för uns kölsche Sproch, Cologne 2002,
* ISBN 3-7616-1604-X
*
* Special feature: Because of utilization in modern ripuarian literature
- * (for example: Asterix op kölsch - Däm Asterix singe Jung, ISBN 3-7704-0468-8) the rules for the letters G and J
- * are taken from Adam Wrede (for example: Jedöns, jeeße, jejovve, adich, iggelich, nüdich )
+ * (for example: Asterix op kölsch - Däm Asterix singe Jung, ISBN 3-7704-0468-8) the rules for the letters G and J
+ * are taken from Adam Wrede (for example: Jedöns, jeeße, jejovve, adich, iggelich, nüdich )
* and not from the Akademie (for example: Gedöns, geeße, gegovve, aadig, iggelig, nüdig)
* Otherwise most part of the following expressions are taken from the Akademie.
*
*/
-/**
+/**
* Hints for editing
- * Avoid ä and other special codings because of legibility for those users,
+ * Avoid ä and other special codings because of legibility for those users,
* who will take this as a basis for further ripuarian message interfaces
* ä => ä, ö => ö, ü => ü, Ä => Ä, Ö => Ö, Ãœ => Ü, ß => ß
* „ => „, “ => “
@@ -91,59 +91,60 @@ $namespaceAliases = array(
'Katejorije_Klaaf' => NS_CATEGORY_TALK,
);
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$linkTrail = '/^([äöüėëijßəğåůæœça-z]+)(.*)$/sDu';
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Ömleitunge op Ömleitunge' ),
- 'BrokenRedirects' => array( 'Ömleitunge en et Leere' ),
- 'Disambiguations' => array( 'Wat-es-dat-Sigge', 'Watt ėßß datt?' ),
+ 'DoubleRedirects' => array( 'Ömleitunge_op_Ömleitunge' ),
+ 'BrokenRedirects' => array( 'Ömleitunge_en_et_Leere' ),
+ 'Disambiguations' => array( 'Wat-es-dat-Sigge', 'Watt_ėßß_datt?' ),
'Userlogin' => array( 'Enlogge' ),
'Userlogout' => array( 'Ußlogge' ),
- 'CreateAccount' => array( 'Aanmelde', 'Medmaacher wääde', 'Metmaacher wääde' ),
- 'Preferences' => array( 'Ming Enstellunge', 'Enstellunge' ),
- 'Watchlist' => array( 'Ming Oppassliss', 'Oppassliss' ),
- 'Recentchanges' => array( 'Neuste Änderunge', 'Änderunge' ),
- 'Upload' => array( 'Daate huhlade', 'Huhlade' ),
+ 'CreateAccount' => array( 'Aanmelde', 'Medmaacher_wääde', 'Metmaacher_wääde' ),
+ 'Preferences' => array( 'Ming_Enstellunge', 'Enstellunge' ),
+ 'Watchlist' => array( 'Ming_Oppassliss', 'Oppassliss' ),
+ 'Recentchanges' => array( 'Neuste_Änderunge', 'Änderunge' ),
+ 'Upload' => array( 'Daate_huhlade', 'Huhlade' ),
'Listfiles' => array( 'Datei', 'Dateie' ),
- 'Newimages' => array( 'Neu Dateie' ),
+ 'Newimages' => array( 'Neu_Dateie' ),
'Listusers' => array( 'Medmaacher', 'Metmaacher' ),
'Listgrouprights' => array( 'Jrupperääschte', 'Jropperrääschte' ),
'Statistics' => array( 'Statistik', 'Shtatißtike' ),
- 'Randompage' => array( 'Zofällije Sigg' ),
- 'Lonelypages' => array( 'Sigge ohne Links drop' ),
- 'Uncategorizedpages' => array( 'Sigge ohne Saachjruppe' ),
- 'Uncategorizedcategories' => array( 'Saachjruppe ohne Saachjruppe' ),
- 'Uncategorizedimages' => array( 'Dateie ohne Saachjruppe' ),
- 'Uncategorizedtemplates' => array( 'Schablone ohne Saachjruppe' ),
- 'Unusedcategories' => array( 'Schablone ohne Links drop' ),
- 'Unusedimages' => array( 'Dateie ohne Links drop' ),
- 'Wantedpages' => array( 'Sigge fähle' ),
- 'Wantedcategories' => array( 'Saachjruppe fähle', 'Saachjroppe fähle' ),
- 'Wantedfiles' => array( 'Dateie fähle' ),
- 'Wantedtemplates' => array( 'Schablone fähle' ),
- 'Mostlinked' => array( 'Sigge met de mieste Links drop' ),
- 'Mostlinkedcategories' => array( 'Et miehts jebruchte Saachjruppe', 'Et miehts jebruchte Saachjroppe' ),
- 'Mostlinkedtemplates' => array( 'Et miehts jebruchte Schablone' ),
- 'Mostimages' => array( 'Dateie met de mieste Links drop' ),
- 'Mostcategories' => array( 'Sigge met de mieste Saachjroppe', 'Sigge met de mieste Saachjruppe' ),
- 'Mostrevisions' => array( 'Öff beärbeit', 'Öff beärbeidt', 'Off bearbeit' ),
- 'Fewestrevisions' => array( 'Winnig beärbeit', 'Winnish beärbeidt', 'Winnich bearbeit' ),
- 'Shortpages' => array( 'Koote Atikelle' ),
- 'Longpages' => array( 'Lang Atikelle' ),
- 'Newpages' => array( 'Neu Atikelle' ),
- 'Ancientpages' => array( 'Ahl Atikelle' ),
- 'Deadendpages' => array( 'Sigge ohne Links dren' ),
+ 'Randompage' => array( 'Zofällije_Sigg' ),
+ 'Lonelypages' => array( 'Sigge_ohne_Links_drop' ),
+ 'Uncategorizedpages' => array( 'Sigge_ohne_Saachjruppe' ),
+ 'Uncategorizedcategories' => array( 'Saachjruppe_ohne_Saachjruppe' ),
+ 'Uncategorizedimages' => array( 'Dateie_ohne_Saachjruppe' ),
+ 'Uncategorizedtemplates' => array( 'Schablone_ohne_Saachjruppe' ),
+ 'Unusedcategories' => array( 'Schablone_ohne_Links_drop' ),
+ 'Unusedimages' => array( 'Dateie_ohne_Links_drop' ),
+ 'Wantedpages' => array( 'Sigge_fähle' ),
+ 'Wantedcategories' => array( 'Saachjruppe_fähle', 'Saachjroppe_fähle' ),
+ 'Wantedfiles' => array( 'Dateie_fähle' ),
+ 'Wantedtemplates' => array( 'Schablone_fähle' ),
+ 'Mostlinked' => array( 'Sigge_met_de_mieste_Links_drop' ),
+ 'Mostlinkedcategories' => array( 'Et_miehts_jebruchte_Saachjruppe', 'Et_miehts_jebruchte_Saachjroppe' ),
+ 'Mostlinkedtemplates' => array( 'Et_miehts_jebruchte_Schablone' ),
+ 'Mostimages' => array( 'Dateie_met_de_mieste_Links_drop' ),
+ 'Mostcategories' => array( 'Sigge_met_de_mieste_Saachjroppe', 'Sigge_met_de_mieste_Saachjruppe' ),
+ 'Mostrevisions' => array( 'Öff_beärbeit', 'Öff_beärbeidt', 'Off_bearbeit' ),
+ 'Fewestrevisions' => array( 'Winnig_beärbeit', 'Winnish_beärbeidt', 'Winnich_bearbeit' ),
+ 'Shortpages' => array( 'Koote_Atikelle' ),
+ 'Longpages' => array( 'Lang_Atikelle' ),
+ 'Newpages' => array( 'Neu_Atikelle' ),
+ 'Ancientpages' => array( 'Ahl_Atikelle' ),
+ 'Deadendpages' => array( 'Sigge_ohne_Links_dren' ),
'Protectedpages' => array( 'Siggeschotz' ),
'Protectedtitles' => array( 'Tittelschotz' ),
- 'Allpages' => array( 'All Sigge' ),
- 'Prefixindex' => array( 'Sigge met Aanfang' ),
+ 'Allpages' => array( 'All_Sigge' ),
+ 'Prefixindex' => array( 'Sigge_met_Aanfang' ),
'Ipblocklist' => array( 'Jesperrt', 'Jeshpächt' ),
+ 'Unblock' => array( 'Freijävve', 'Frei_jävve', 'Freijevve', 'Frei_jevve' ),
'Specialpages' => array( 'Sondersigge', 'Söndersigge' ),
'Contributions' => array( 'Beidräch', 'Beidrääsh' ),
'Emailuser' => array( 'Email', 'E-mail' ),
- 'Confirmemail' => array( 'Email Bestätije', 'E-mail Bestätije', 'EmailBestätije', 'E-mailBestätije' ),
- 'Whatlinkshere' => array( 'Wat noh hee link' ),
+ 'Confirmemail' => array( 'Email_Bestätije', 'E-mail_Bestätije', 'EmailBestätije', 'E-mailBestätije' ),
+ 'Whatlinkshere' => array( 'Wat_noh_hee_link' ),
'Recentchangeslinked' => array( 'Änderungen_an_verlinkte_Sigge' ),
'Movepage' => array( 'Ömnenne', 'Ömdäufe' ),
'Blockme' => array( 'Proxy-Sperre' ),
@@ -160,32 +161,35 @@ $specialPageAliases = array(
'Unlockdb' => array( 'Datebank-opmaache' ),
'Userrights' => array( 'Medmaacherrääschte', 'Metmaacherrääschte' ),
'MIMEsearch' => array( 'MIME-Typ', 'MIMEtüp' ),
- 'FileDuplicateSearch' => array( 'Dubbel Dateie' ),
- 'Unwatchedpages' => array( 'Sigge oohne Oppasser' ),
+ 'FileDuplicateSearch' => array( 'Dubbel_Dateie' ),
+ 'Unwatchedpages' => array( 'Sigge_oohne_Oppasser' ),
'Listredirects' => array( 'Ömleitunge' ),
- 'Revisiondelete' => array( 'Version fottschmieße' ),
- 'Unusedtemplates' => array( 'Nit jebruchte Schablone' ),
- 'Randomredirect' => array( 'Zofällije Ömleitung' ),
- 'Mypage' => array( 'Ming Medmaachersigg', 'Ming Metmaachersigg', 'Medmaachersigg', 'Metmaachersigg' ),
- 'Mytalk' => array( 'Ming Klaafsigg', 'Klaaf' ),
- 'Mycontributions' => array( 'Ming Beidräch', 'Ming Beidrääsh' ),
+ 'Revisiondelete' => array( 'Version_fottschmieße' ),
+ 'Unusedtemplates' => array( 'Nit_jebruchte_Schablone' ),
+ 'Randomredirect' => array( 'Zofällije_Ömleitung' ),
+ 'Mypage' => array( 'Ming_Medmaachersigg', 'Ming_Metmaachersigg', 'Medmaachersigg', 'Metmaachersigg' ),
+ 'Mytalk' => array( 'Ming_Klaafsigg', 'Klaaf' ),
+ 'Mycontributions' => array( 'Ming_Beidräch', 'Ming_Beidrääsh' ),
'Listadmins' => array( 'Köbese', 'Köbeße', 'Wiki-Köbesse' ),
'Listbots' => array( 'Bots' ),
- 'Popularpages' => array( 'Miehts affjeroofe Sigge' ),
+ 'Popularpages' => array( 'Miehts_affjeroofe_Sigge' ),
'Search' => array( 'Sök', 'Söök', 'Söke', 'Sööke' ),
- 'Resetpass' => array( 'Neu Passwood' ),
- 'Withoutinterwiki' => array( 'Ohne Shproche Lenks' ),
- 'MergeHistory' => array( 'Versione zosammeschmieße' ),
+ 'Resetpass' => array( 'Neu_Passwood' ),
+ 'Withoutinterwiki' => array( 'Ohne_Shproche_Lenks' ),
+ 'MergeHistory' => array( 'Versione_zosammeschmieße' ),
'Filepath' => array( 'Dateipaad' ),
- 'Invalidateemail' => array( 'Onjöltije e-mail Addräß', 'Onjöltije E-Mail Adress' ),
- 'Blankpage' => array( 'Leddijje Sigge' ),
- 'LinkSearch' => array( 'Websigge Söke' ),
+ 'Invalidateemail' => array( 'Onjöltije_e-mail_Addräß', 'Onjöltije_E-Mail_Adress' ),
+ 'Blankpage' => array( 'Leddijje_Sigge' ),
+ 'LinkSearch' => array( 'Websigge_Söke' ),
'DeletedContributions' => array( 'Fotjeschmeße' ),
'Tags' => array( 'Makeerunge' ),
+ 'Activeusers' => array( 'Aktive', 'AktiveMetmaacher', 'Aktive_Metmaacher', 'AktiveMedmaacher', 'Aktive_Medmaacher' ),
+ 'ComparePages' => array( 'SiggeVerjliesche', 'Sigge_verjliesche', 'SiggeVerjlieche', 'Sigge_verjieche' ),
+ 'Badtitle' => array( 'UnjewönschSiggetittelle', 'Unjewönsch_Siggetittelle' ),
);
$magicWords = array(
- 'redirect' => array( '0', '#ÖMLEIDE OP', '#ÖMLEIDE', '#LEIDT ÖM OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
+ 'redirect' => array( '0', '#ÖMLEIDE_OP', '#ÖMLEIDE', '#LEIDT_ÖM_OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
'nogallery' => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__NOGALLERY__' ),
'toc' => array( '0', '__ENHALLT__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
'img_right' => array( '1', 'rähß', 'räts', 'rechts', 'right' ),
@@ -214,8 +218,7 @@ $messages = array(
'tog-editsection' => 'Maach [{{int:Editsection}}]-Links aan de Avschnedde dran',
'tog-editsectiononrightclick' => 'Avschnedde met Räächs-Klicke op de Üvverschrefte ändere (bruch Java_Skripp)',
'tog-showtoc' => 'Zeich en Enhaldsüvversich bei Sigge met mieh wie drei Üvverschrefte dren',
-'tog-rememberpassword' => 'Op Duur aanmelde (op dämm Kompjuter un för dää Brauser)',
-'tog-editwidth' => 'Maach dat Feld zom Tex enjävve esu breid wi et jeiht',
+'tog-rememberpassword' => 'Op Duur enlogge op dämm Kompjuter un för dää Brauser (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
'tog-watchcreations' => 'Dun de Sigge, die ich neu aanläje, för ming Oppassliss vürschlage',
'tog-watchdefault' => 'Dun de Sigge för ming Oppassliss vürschlage, die ich aanpacken un änder',
'tog-watchmoves' => 'Dun ming selfs ömjenante Sigge automatisch för ming Oppassliss vürschlage',
@@ -362,31 +365,21 @@ Dat es och all op Änglesch:
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Ne neue Afschnet onge draan!',
-'vector-action-delete' => 'Fottschmiiße!',
-'vector-action-move' => 'Ömnänne!',
-'vector-action-protect' => 'Schöze!',
-'vector-action-undelete' => 'Zerökholle!',
-'vector-action-unprotect' => 'Schoz ophävve!',
-'vector-namespace-category' => 'Saachjroppesigg',
-'vector-namespace-help' => 'Hölpsigg',
-'vector-namespace-image' => 'Datei',
-'vector-namespace-main' => 'Wikisigg',
-'vector-namespace-media' => 'Medijesigg',
-'vector-namespace-mediawiki' => 'Täx/Nohreesch',
-'vector-namespace-project' => 'Projäksigg',
-'vector-namespace-special' => '{{int:nstab-special}}',
-'vector-namespace-talk' => 'Klaafsigg',
-'vector-namespace-template' => 'Schablohn',
-'vector-namespace-user' => 'Metmaachersigg',
-'vector-view-create' => 'Neu Schriive!',
-'vector-view-edit' => 'Ändere!',
-'vector-view-history' => 'Versione zeije!',
-'vector-view-view' => 'Lesse!',
-'vector-view-viewsource' => 'Wikitex aanlooere!',
-'actions' => 'Akßjuhne',
-'namespaces' => 'Appachtemangs',
-'variants' => 'Variante',
+'vector-action-addsection' => 'Ne neue Afschnet onge draan!',
+'vector-action-delete' => 'Fottschmiiße!',
+'vector-action-move' => 'Ömnänne!',
+'vector-action-protect' => 'Schöze!',
+'vector-action-undelete' => 'Zerökholle!',
+'vector-action-unprotect' => 'Schoz ophävve!',
+'vector-simplesearch-preference' => 'Donn de verbäßerte Vörschlääsch beim Söke aanschallde (bloß mem Ußsinn „Vektor“ zesamme ze hann)',
+'vector-view-create' => 'Neu Schriive!',
+'vector-view-edit' => 'Ändere!',
+'vector-view-history' => 'Versione zeije!',
+'vector-view-view' => 'Lesse!',
+'vector-view-viewsource' => 'Wikitex aanlooere!',
+'actions' => 'Akßjuhne',
+'namespaces' => 'Appachtemangs',
+'variants' => 'Variante',
'errorpagetitle' => 'Fähler',
'returnto' => 'Jangk widder noh: „$1“.',
@@ -447,6 +440,9 @@ Zoh vill Metmaacher versöhke di Sigg heh aanzelohre.
Bes esu joot un waat e Weilsche, ih dat de versöhks, di Sigg noch ens opzeroofe.
$1',
+'pool-timeout' => 'Zick zem Waade affjeloufe, diweil mer op en Sperr am Waade wohre',
+'pool-queuefull' => 'De Schlang zom Waade op ene freie Prozäß zom Beärbeide es vull',
+'pool-errorunknown' => 'Dä Fähler kenne mer nit',
# 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' => 'Ãœvver {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
@@ -627,7 +623,8 @@ Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAM
'yourname' => 'Metmaacher Name:',
'yourpassword' => 'Paßwoot:',
'yourpasswordagain' => 'Noch ens dat Passwood',
-'remembermypassword' => 'Op Duur Aanmelde',
+'remembermypassword' => 'Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
+'securelogin-stick-https' => 'Noh em Enlogge övver HTTPS verbonge blieve.',
'yourdomainname' => 'Ding Domain',
'externaldberror' => 'Do wor ene Fähler en de externe Daatebank, oder Do darfs Ding extern Daate nit ändere. Dat Aanmelde jingk jedenfalls donevve.',
'login' => 'Enlogge',
@@ -644,6 +641,7 @@ Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAM
'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
'gotaccountlink' => 'Enlogge',
'createaccountmail' => 'Scheck mer en E-Mail met Passwood',
+'createaccountreason' => 'Jrond:',
'badretype' => 'Ding zwëij ennjejovve Paßßwööter sinn nit ejaal. Do muss De Dich för ein entscheide.',
'userexists' => 'Ene Metmaacher met däm Name jitt et ald. Schad. Do muss De Der ene andere Name usdenke.',
'loginerror' => 'Fähler beim Enlogge',
@@ -669,6 +667,7 @@ Udder donn_[[Special:UserLogin/signup|ene neue Metmaacher aanmelde]].',
'wrongpasswordempty' => "Dat Passwood ka'mer nit fottlooße. Jetz muss De et noch ens versöke.",
'passwordtooshort' => 'En Paßwööter {{PLURAL:$1|moß|möße|moß}} winnichstens {{PLURAL:$1|ei|$1|kei}} Zeiche, {{PLURAL:$1|Zeffer|Zeffere|Zeffere}}, udder Bochstave dren sin.',
'password-name-match' => 'Ding Poßwoot moß anders wi Dinge Name als ene Metmaacher sin.',
+'password-login-forbidden' => 'Dä Zohjang met däm Metmaacher-Name un däm Paßwoot es verbodde.',
'mailmypassword' => 'Passwood verjesse?',
'passwordremindertitle' => 'Neu Paßwoot för {{GRAMMAR:Dat|{{SITENAME}}}}',
'passwordremindertext' => 'Jod müjjelich, Do wors et selver,
@@ -739,6 +738,9 @@ Waat e Wielsche, ih dat De et widder versöhks.',
'suspicious-userlogout' => "Do bes '''nit''' ußjelogg.
Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööver met Zwescheschpeischer noh däm Ußlogge jefrooch hät.",
+# E-mail sending
+'php-mail-error-unknown' => 'Nit bekannte Fähler met dä Funxjohn <code lang="en">mail()</code> vum PHP',
+
# Password reset dialog
'resetpass' => 'Passwood tuusche udder neu ußjävve',
'resetpass_announce' => 'De beß jez enjelogg med ennem Zweschepasswoot, wat De övver e-mail krääje häs. Dat kanns De nit einfar_esu behallde. Alsu donn jetz e neu Passwoot för op Duur aanjevve.',
@@ -791,9 +793,10 @@ Do häs Der enzwesche e neuZweschepasswood jehollt.',
'showlivepreview' => 'Lebendije Vör-Aansich zeije',
'showdiff' => 'De Ungerscheide zeije',
'anoneditwarning' => "'''Opjepaß:''' Weil De nit enjelogg bes, weed Ding <i lang=\"en\">IP</i>-Adräß en dä Sigg ier Leß met de Versione faßjehallde wääde.",
+'anonpreviewwarning' => "''Weil De nit enjlogg bes, weed Ding <code lang=\"en\">IP</code>-Addräß zoamme met dä neue Version faßjehallde, wann de heh di Sigg avspeichere deihß.''",
'missingsummary' => '<strong>Opjepass:</strong> Do häs nix bei „{{int:summary}}“ enjejovve. Dun noch ens op „{{int:savearticle}}“ klicke, öm Ding Änderunge ohne de Zosammefassung ze Speichere. Ävver besser jiss De do jetz tirek ens jet en!',
'missingcommenttext' => 'Jevv en „Koot Zosammejefass, Quell“ aan!',
-'missingcommentheader' => "'''Opjepass:''' Do häs kein Üvverschreff för Dinge Beidrach enjejovve. Wann De noch ens op „{{int:savearticle}}“ dröcks, weed dä Beidrach ohne Üvverschreff avjespeichert.",
+'missingcommentheader' => "'''Opjepass:''' Do häs kein Üvverschreff för Dinge Beidrach enjejovve. Wann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
'summary-preview' => 'Vör-Aansich vun „Koot Zosammejefass, Quell“:',
'subject-preview' => 'Vör-Aansich vun de Üvverschreff:',
'blockedtitle' => 'Dä Metmaacher es jesperrt',
@@ -910,9 +913,13 @@ för der '''Opera''': ''F5'' —
mem '''Safari''': ''Cmd-Shift-R'' —
un em '''Konqueror''': ''F5'' —
et ess en bunte Welt!",
-'userinvalidcssjstitle' => '<strong>Opjepass:</strong> Et jitt kein Ussinn met däm Name: „<strong>$1</strong>“ -
-denk dran, dat ene Metmaacher eije Dateie för et Ussinn han kann, un dat die met kleine Buchstave
-aanfange dun, alsu etwa: {{ns:user}}:Name/monobook.css, un {{ns:user}}:Name/monobook.js heiße.',
+'sitecsspreview' => "'''Opjepass:''' Do bes heh nor am Usprobeere, wat Ding CSS mäht,
+et es noch nit jesechert!",
+'sitejspreview' => '<strong>Opjepass:</strong> Do bes heh nor am Usprobeere, wat Ding
+Java_Skripp mäht, et es noch nit jesechert!',
+'userinvalidcssjstitle' => '<strong>Opjepass:</strong> Et jitt kein Ussinn met däm Name: „<strong>$1</strong>“ -
+denk dran, dat ene Metmaacher eije Dateie för et Ussinn han kann, un dat die met kleine Buchstave
+aanfange dun, alsu etwa: {{ns:user}}:Name/vector.css, un {{ns:user}}:Name/vector.js heiße.',
'updated' => '(Aanjepack)',
'note' => "'''Opjepass:'''",
'previewnote' => "'''Heh kütt nor de Vör-Aansich - Ding Änderunge sin noch nit jesechert!'''",
@@ -958,8 +965,6 @@ Bes De secher, watte mähs?
'copyrightwarning' => 'Ding Beidräch stonn unger de [[$2]], süch $1. Wann De nit han wells, dat Dinge Tex ömjemodelt weed, un söns wohin verdeilt, dun en hee nit speichere. Mem Avspeichere sähs De och zo, dat et vun Dir selvs es, un/oder Do dat Rääch häs, en hee zo verbreide. Wann et nit stemmp, oder Do kanns et nit nohwiese, kann Dich dat en dr Bau bränge!',
'copyrightwarning2' => 'De Beidräch {{GRAMMAR:en|{{SITENAME}}}} künne vun andere Metmaacher ömjemodelt
oder fottjeschmesse wääde. Wann Der dat nit rääch es, schriev nix. Et es och nüdich, dat et vun Dir selvs es, oder dat Do dat Rääch häs, et hee öffentlich wigger ze jevve. Süch $1. Wann et nit stemmp, oder Do kanns et nit nohwiese, künnt Dich dat en dr Bau bränge!',
-'longpagewarning' => "'''Oppjepass:''' Dä Tex, dä De heh jescheck häs, dä es '''$1'''
-Kilobyte jroß. Manch Brauser kütt nit domet klor, wann et mieh wie '''32''' Kilobyte sin. Do künnts De drüvver nohdenke, dat Dinge en kleiner Stöckche ze zerkloppe.",
'longpageerror' => "'''Janz schlemme Fähler:'''
Dä Tex, dä De heh jescheck häs, dä es '''$1''' Kilobyte jroß.
Dat sin mieh wie '''$2''' Kilobyte. Dat künne mer nit speichere!
@@ -1141,6 +1146,8 @@ $1",
'logdelete-success' => "'''Dä Enndraach em Logboch woot verstoche odder seeschba jemaat.'''",
'logdelete-failure' => "'''Däm Enndraach em Logboch sing Seeschbaakeit kunnte mer nit ändere:''' $1",
'revdel-restore' => 'Versteische udder Seeschba maache',
+'revdel-restore-deleted' => 'fottjeschmeße Versione',
+'revdel-restore-visible' => 'seeshtba Versione',
'pagehist' => 'Älldere Versione',
'deletedhist' => 'Fottjeschmesse Versione',
'revdelete-content' => 'dä Enhalt fun dä Sigg',
@@ -1205,11 +1212,13 @@ Donn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn
# Diffs
'history-title' => 'Liss met Versione vun „$1“',
'difference' => '(Ungerscheid zwesche de Versione)',
+'difference-multipage' => '(Ongerscheide zwesche Sigge)',
'lineno' => 'Reih $1:',
'compareselectedversions' => 'Dun de markeete Version verjliche',
'showhideselectedversions' => 'De ußjewählte Versione aanzeije udder vershteiche',
'editundo' => 'De letzte Änderung zeröck nämme',
-'diff-multi' => '(Mer don hee {{PLURAL:$1|eij Version|$1 Versione|keij Version}} dozwesche beim Verjliesche översprenge)',
+'diff-multi' => '(Mer don hee {{PLURAL:$1|eij Version|$1 Versione|keij Version}} dozwesche beim Verjliesche översprenge. Di sin vun jesamp {{PLURAL:$2|einem Metmaacher|$2 Metmaachere|keinem Metmaacher}} jemaat woode)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ein Version|$1 Versione|kei Version}} dozwesche vun mieh wi {{PLURAL:$2|einem Metmaacher|$2 Metmaachere|keinem Metmaacher}} wääde nit jezeish)',
# Search results
'searchresults' => 'Wat beim Söke eruskom',
@@ -1244,6 +1253,7 @@ Donn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn
'searchprofile-everything-tooltip' => 'Söök övverall dren, och op de Klaafsigge',
'searchprofile-advanced-tooltip' => 'Donn en ußjesohte Appachtemangs sööke',
'search-result-size' => '$1 ({{PLURAL:$2|Eij Woot|$2 Wööter|Keij Woot}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Saach|$1 Saache|0 Saache}} ({{PLURAL:$2|1 Ongerjropp|$2 Ongerjroppe|0 Ongerjroppe}}, {{PLURAL:$3|1 Datei|$3 Dateie|0 Dateie}})',
'search-result-score' => 'Jeweesch: $1%',
'search-redirect' => '(Ömleitung $1)',
'search-section' => '(Avschnett $1)',
@@ -1330,6 +1340,7 @@ dat dänne ihr Daate topaktuell sin,
'contextlines' => 'Reihe för jede Treffer:',
'contextchars' => 'Zëijshe uß de Ömjävung, pro Rëij:',
'stub-threshold' => 'Links passend för <a href="#" class="stub">klein Sigge</a> fomateere av esu vill Bytes:',
+'stub-threshold-disabled' => 'Ußjeschalldt',
'recentchangesdays' => 'Aanzahl Dage en de Liss met de „Neuste Änderunge“ — als Standad:',
'recentchangesdays-max' => '(Nit mieh wie {{PLURAL:$1|eine Daach|$1 Dääsh|keine Daach}})',
'recentchangescount' => 'Aanzahl Änderunge en de Leß, als Shtandad:',
@@ -1363,6 +1374,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'prefs-files' => 'Dateie',
'prefs-custom-css' => 'Selfsjemaat <i lang="en">Cascading Style Sheet</i>',
'prefs-custom-js' => 'Selfsjemaat JavaSkripp',
+'prefs-common-css-js' => 'Gemeinsam CSS un JavaSkrepp för all de Bovverfläshe:',
'prefs-reset-intro' => 'Op dä Sigg kanns De Ding Enstellunge op dämm Wiki singe Shandatt setze lohße. Ävver Opjepaß: Do jidd et keine „Retuur“-Knopp för!',
'prefs-emailconfirm-label' => 'Beshtätejung övver <i lang="en">e-mail</i>:',
'prefs-textboxsize' => 'Wi jruuß sull dat Feld för et Afschnedde un Sigge ändere sin',
@@ -1385,7 +1397,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'gender-female' => 'Möhn, Weech odder Mädche',
'prefs-help-gender' => '* Moß mer nit aanjevve, un wann et aanjejovve eß, dann kallt et Wiki övver Desch als „dä Pitter“ udder „dat Tiina“, sönß uns „Metmaacher Pütz“. Dat kritt de janne Welt ze sinn, nit nur Do allein.',
'email' => 'E-mail',
-'prefs-help-realname' => '* Dinge richtije Name - kanns De fott looße - wann De en ävver nenne wells, dann weed dä jebruch, öm Ding Beidräch domet ze schmöcke.',
+'prefs-help-realname' => '* Dinge richtije Name — kanns De fott looße — wann De en ävver nenne wells, dann weed dä jebruch, öm Ding Beidräch domet ze schmöcke.',
'prefs-help-email' => '* Ding <i lang="en">e-mail</i> Adress - kanns De fottlooße, un se es för Andre nit ze sinn - mäht et ävver müjjelich, Der e neu Passwoot ze schecke, wann De et ens verjäße häß. Do kannß och zohlohße, dat mer Der domet övver Ding Metmaacherklaafsigg en <i lang="en">e-mail</i> schecke kann. Esu künne ander Metmaacher met Der en Kontak kumme, ohne dat se Dinge Name oder Ding <i lang="en">e-Mail</i> Adress kenne mööte.',
'prefs-help-email-required' => 'Do moß en jöltije E-Mail-Adress aanjevve.',
'prefs-info' => 'Jrundlare',
@@ -1398,9 +1410,15 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'prefs-advancedrendering' => 'Extra Ußwahle',
'prefs-advancedsearchoptions' => 'Extra Ußwahle',
'prefs-advancedwatchlist' => 'Extra Ußwahle',
-'prefs-display' => 'Ußwahle för et Leßte Aanzeje',
+'prefs-displayrc' => 'Ußwahle för et Leßte Aanzeje',
+'prefs-displaysearchoptions' => 'Enstellunge för et Aanzeje',
+'prefs-displaywatchlist' => 'Enstellunge för et Aanzeje',
'prefs-diffs' => 'Ongerscheide un Verjliische',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'De Addräß fö de <i lang="en">e-mail</i> schingk en Odenung',
+'email-address-validity-invalid' => 'Jivv en jöltijje Addräß fö de <i lang="en">e-mail</i> en',
+
# User rights
'userrights' => 'Metmaacher ehr Räächde verwalde',
'userrights-lookup-user' => 'Metmaacherjruppe verwalde',
@@ -1485,6 +1503,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'right-hideuser' => 'Ene Metmaacher sperre un em singe Name versteiche',
'right-ipblock-exempt' => 'Es ußjenomme vun automatesche Sperre, vun Sperre fun IP-Adresse, un vun Sperre vun Bereiche vun IP-Adresse',
'right-proxyunbannable' => 'Es ußjenomme fun automatische Sperre fun Proxy-Servere',
+'right-unblockself' => 'Retuur nämme, wam_mer sellver jesperrt woode es',
'right-protect' => 'Sigge schöze, jeschözde Sigge änndere, un der iere Schoz widder ophevve',
'right-editprotected' => 'Jeschötzte Sigge ändere, ohne Kaskadeschoz',
'right-editinterface' => 'Sigge met de Texte ändere, die et Wiki kallt',
@@ -1507,7 +1526,6 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'right-siteadmin' => 'De Datebank deeschmaache un opmaache för Änderunge',
'right-reset-passwords' => 'Enem andere Metmaacher et Paßwoot zeröck setze',
'right-override-export-depth' => 'Beim Sigge Expoteere de Sigge metnämme, woh Lingks drop jon — beß fönef Schredde wigk',
-'right-versiondetail' => 'Ußföhrlesh Enfomazjuhne övver de Projramme vum Wiki aanloore',
'right-sendemail' => '<i lang="en">e-mail</i> aan ander Metmaacher schecke',
# User rights log
@@ -1558,14 +1576,9 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'recentchanges-legend' => 'Enstellunge',
'recentchangestext' => 'Op dä Sigg hee sin de neuste Änderunge am Wiki opjeliss.',
'recentchanges-feed-description' => 'Op dämm Abonnomang-Kannal (<i lang="en">Feed</i>) kannze de {{int:recentchanges}} aam Wiki en Laif un en Färve metloore.',
-'recentchanges-label-legend' => 'Lejänd: $1.',
-'recentchanges-legend-newpage' => '$1 - neu Sigg',
'recentchanges-label-newpage' => 'Heh di Sigg es neu dobei jekumme met dä Änderung',
-'recentchanges-legend-minor' => '$1 - klein mini-Änderung',
'recentchanges-label-minor' => 'Heh dat es en Mini-Änderung',
-'recentchanges-legend-bot' => '$1 - vun enem Bot jemaat',
'recentchanges-label-bot' => 'Di Änderung es fun enem Bot jemaat woode',
-'recentchanges-legend-unpatrolled' => '$1 - nit nohjeloort',
'recentchanges-label-unpatrolled' => 'Heh di Änderung es noch nit nohjeloort',
'rcnote' => '{{PLURAL:$1|Heh es de letzte Änderung us|Heh sin de letzte <strong>$1</strong> Änderunge us|Et jit <strong>kei</strong> Änderunge en}} {{PLURAL:$2|däm letzte Daach|de letzte <strong>$2</strong> Dääsch|dä Zick}} vum <strong>$4</strong> aff <strong>$5</strong> Uhr beß jetz.',
'rcnotefrom' => 'Hee sin bes <strong>$1</strong> fun de Änderunge zick däm <strong>$3</strong> öm <strong>$4</strong> Uhr opjeliss.',
@@ -1616,6 +1629,9 @@ Sigge uß Dinge [[Special:Watchlist|Opaßleß]] sin '''fett''' jeschrevve.",
Dat Fo'zeishnis <code>$1</code> för de huhjelaade Dateie es fott, un dat Websörver Projramm kunnd_et och nit aanlääje.",
'upload_directory_read_only' => '<b>Doof:</b> En dat Verzeichnis <code>$1</code> för Dateie dren huhzelade, do kann dat Websörver Projramm nix erenschrieve.',
'uploaderror' => 'Fähler beim Huhlade',
+'upload-recreate-warning' => "'''Opjepaß: En Dattei met dämm Name es ömjenannt udder fottjeschmeße woode.'''
+
+De Logböösher vum Datteie Ömnänne un Fottschmieße saare doh drövver:",
'uploadtext' => "Met däm Formular unge kanns de Belder oder ander Daate huhlade.
Jangk op de [[Special:FileList|Less met de huhjelaade Datteie]], öm esu en Datteie ze beloore udder noh inne ze söhke. De Logbööscher vum [[Special:Log/upload|Huhlaade]] un vum [[Special:Log/delete|Sigge fottschmiiße]] künnte Der och hellefe.
@@ -1657,6 +1673,17 @@ hallde deiht, wat nit erlaub, un müjjelelscherwies ene jefährlesche Dattei-Typ
'filetype-unwanted-type' => "Dat Dateifommaat '''„<code>.$1</code>“''' wulle mer nit esu jään huhjelaade krijje. Leever {{PLURAL:$3|ham_mer|ham_mer ein fun|ham_mer nix}}: $2.",
'filetype-banned-type' => "Dat Dateifommaat '''„<code>.$1</code>“''' wulle mer nit huhjelaade krijje. Älaup {{PLURAL:$3|es|sin_er}}: $2.",
'filetype-missing' => 'Di Datei, di De huhlaade wells, hät keij Fommaat em Name, wi zem Beijspöll „<code>.jpg</code>“, esu jet hätte mer ävver jähn.',
+'empty-file' => 'Ding huhjelaade Dattei wohr läddesch.',
+'file-too-large' => 'Ding huhjelaade Dattei wohr ze jruß.',
+'filename-tooshort' => 'Dä Name vun dä Dattei es ze koot.',
+'filetype-banned' => 'Di Zoot Dattei es nit zohjelohße.',
+'verification-error' => 'Heh di Dattei es dorsch de Pröövung jefalle.',
+'hookaborted' => 'Ding Änderung wood vun enem Zohsazprojramm nit zohjelohße.',
+'illegal-filename' => 'Esu ene Name för en Dattei es nit zohjelohße.',
+'overwrite' => 'Et es nit zohjelohße, Datteie ze övverschrieve, di ald doh sin.',
+'unknown-error' => 'Ene Fähler es opjetrodde, dä mer nit kenne.',
+'tmp-create-error' => 'Mer kunnte kein Zweschedattei aanlääje.',
+'tmp-write-error' => 'Ene Fähler es opjetrodde bem Schrieve en de Zweschedattei.',
'large-file' => 'Dateie sullte nit jröößer wääde, wi $1, ävver Ding Datei es $2 jroß.',
'largefileserver' => 'De Datei es ze jroß. Jrößer wie däm ẞööver sing Enstellung erlaub.',
'emptyfile' => 'Wat De hee jetz huhjelade häs, hät kein Daate dren jehatt. Künnt sin, dat De Dich verdon häs, un dä Name wo verkihrt jeschrevve. Luur ens ov De wirklich <strong>die</strong> Datei hee huhlade wells.',
@@ -1688,13 +1715,14 @@ Jangk zeröck un lad Ding Datei unger enem andere Name huh,
wann De se noch han wells.',
'file-exists-duplicate' => 'Di Dattei hät dersellve Enhallt wi hee di {{PLURAL:$1|Datei|Dateie|}}:',
'file-deleted-duplicate' => 'En Datei mem sellve Enhallt wi „[[:$1]]“ es ens fottjeschmeße woode. Donn dä Zosammehang em „{{int:dellogpage}}“ nokike, ih dat De se widder huhläds.',
-'successfulupload' => 'Et Huhlade hät jeflupp',
'uploadwarning' => 'Warnung beim Huhlade',
'uploadwarning-text' => 'Donn onge dä Täx övver di Dattei ändere, un versöhg_et norr_ens.',
'savefile' => 'Datei avspeichere',
'uploadedimage' => 'hät huhjelade: „[[$1]]“',
'overwroteimage' => 'hät en neue Version huhjelade vun: „[[$1]]“',
'uploaddisabled' => 'Huhlade jesperrt',
+'copyuploaddisabled' => 'Et Huhlaade us URLs es afjeschalldt',
+'uploadfromurl-queued' => 'Dat Huhlaade es jiz en de Waadeschlang.',
'uploaddisabledtext' => 'Et Huhlade es jesperrt.',
'php-uploaddisabledtext' => 'Et Dateie Huhlade es en PHP affjeschalldt.
Bes esu joot un donn noh de Enshtellung <i lang="en">file_uploads</i> loore.',
@@ -1734,6 +1762,14 @@ JD # Jenoptik
MGP # Pentax
PICT # - diverse -
#</pre> <!-- Lohß di Reih jenou esu wie se es! -->',
+'upload-success-subj' => 'Et Huhlade hät jeflupp',
+'upload-success-msg' => 'Ding vun [$2] huhjelaade Dattei es jäz och hee: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Probleem bem Huhlaade',
+'upload-failure-msg' => 'Mer hatte e Probleem met Dinge huhjelaade Dattei vun [$2]:
+
+$1',
+'upload-warning-subj' => 'Warnung beim Huhlade',
+'upload-warning-msg' => 'Met däm Huhlaade vun [$2] es jet donevve jejange, Do kanns retuur jon op et [[Special:Upload/stash/$1|Fommulaa zom Huhlaade]] öm dat ze repareere.',
'upload-proto-error' => 'Verkihrt Protokoll',
'upload-proto-error-text' => 'Ene URL för en Datei fun huhzelade moß met <code>http://</code> uder <code>ftp://</code> aafange.',
@@ -1797,6 +1833,7 @@ Velleich probees De et och zo en Zick, wo winnijer loss es.',
'listfiles_search_for' => 'Sök noh däm Name vun dä Datei:',
'imgfile' => 'Datei',
'listfiles' => 'Dateie opleste',
+'listfiles_thumb' => 'Minni-Belldsche',
'listfiles_date' => 'Dattum',
'listfiles_name' => 'Name',
'listfiles_user' => 'Metmaacher',
@@ -1841,6 +1878,7 @@ Dat sellve shteiht hee dronger.',
'uploadnewversion-linktext' => 'Dun en neu Version vun dä Datei huhlade',
'shared-repo-from' => 'uß $1',
'shared-repo' => 'ene jemeinsame Beshtand',
+'filepage.css' => '/* Das folgende CSS wird auf Dateibeschreibungsseiten, auch auf fremden Client-Wikis, geladen. */',
# File reversion
'filerevert' => '„$1“ zerök holle',
@@ -1919,8 +1957,8 @@ All de Sigge em Wiki, och Klaafsigge, Ömleitunge, un esu jet',
'statistics-edits' => 'Änderunge aan Sigge',
'statistics-edits-average' => 'Aanzahl Änderunge pro Sigg em Dorschschnett',
'statistics-views-total' => 'Sigge affjeroofe, ėnßjesamp',
+'statistics-views-total-desc' => 'Sigge, die et nit johv, un Extrasigge sin nit metjezallt',
'statistics-views-peredit' => 'Sigge affjeroofe, pro Änderung',
-'statistics-jobqueue' => 'Endrääch en de [http://www.mediawiki.org/wiki/Manual:Job_queue Leß met de Aufjabe]',
'statistics-users' => '[[Special:ListUsers|Metmaacher]] aajemelldt',
'statistics-users-active' => 'Aktive Metmaacher',
'statistics-users-active-desc' => 'Metmaacher, die {{PLURAL:$1|hück un jesterre|en de läzte $1 Dääsh|hück}} jät jemaat han.',
@@ -1934,9 +1972,9 @@ De Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
(En Atikel jellt als en „(Watt ėßß datt?)“-Sigg un weed hee jeliss, wann en dä Sigg [[MediaWiki:Disambiguationspage]] ene Link op en drop dren is. Alles wat keij Atikele sin, weed dobei jaa nit eez metjezallt)',
'doubleredirects' => 'Ömleitunge op Ömleitunge',
-'doubleredirectstext' => 'Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de
+'doubleredirectstext' => 'Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de
zweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.
-<s>Ußjeshtreshe</s> Reije sin ald äleedesh.
+<del>Ußjeshtreshe</del> Reije sin ald äleedesh.
Met däm „(Ändere)“-Link kanns De de eetste Sigg tirek aanpacke.
Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
'double-redirect-fixed-move' => 'dubbel Ömleidung nohm Ömnenne automattesch opjelös: [[$1]] → [[$2]]',
@@ -1961,6 +1999,8 @@ Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
'nmembers' => 'met {{PLURAL:$1|ein Sigg|$1 Sigge}} dren',
'nrevisions' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Keij Änderung}}',
'nviews' => '{{PLURAL:$1|Eine Avrof|$1 Avrofe|Keine Avrof}}',
+'nimagelinks' => 'Weed op {{PLURAL:$1|eine Sigg|$1 Sigge|keine Sigg}} jebruch',
+'ntransclusions' => 'weed op {{PLURAL:$1|eine Sigg|$1 Sigge|keine Sigg}} jebruch',
'specialpage-empty' => 'Hee en dä Liss es nix dren.',
'lonelypages' => 'Atikele, wo nix drop link',
'lonelypagestext' => 'De Sigge hee noh sin nörjenzwoh ennjebonge un et jonn och kein Linkß drop.',
@@ -2137,40 +2177,46 @@ Mieh övver de einzel Rääschte fenkt Er op de [[{{MediaWiki:Listgrouprights-he
'listgrouprights-removegroup-self-all' => 'Kann sesch sällver uß alle Metmaacherjroppe eruß nämme',
# E-mail user
-'mailnologin' => 'Keij E-Mail Adress',
-'mailnologintext' => 'Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, un en jode E-Mail
+'mailnologin' => 'Keij E-Mail Adress',
+'mailnologintext' => 'Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, un en jode E-Mail
Adress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze
schecke.',
-'emailuser' => 'E-mail aan dä Metmaacher',
-'emailpage' => 'E-mail aan ene Metmaacher',
-'emailpagetext' => 'Wann dä Metmaacher en E-mail Adress aanjejovve hätt en singe Enstellunge,
+'emailuser' => 'E-mail aan dä Metmaacher',
+'emailpage' => 'E-mail aan ene Metmaacher',
+'emailpagetext' => 'Wann dä Metmaacher en E-mail Adress aanjejovve hätt en singe Enstellunge,
un die deit et och, dann kanns De met däm Fomular hee unge en einzelne E-Mail aan dä Metmaacher schecke.
Ding E-mail Adress, die De en [[Special:Preferences|Ding eije Enstellunge]] aanjejovve häs,
die weed als em Avsender sing Adress en die E-Mail enjedrage.
Domet kann, wä die E-Mail kritt, drop antwoote, un die Antwood jeiht tirek aan Dech.
Alles klor?',
-'usermailererror' => 'Dat E-Mail-Objek jov ene Fähler us:',
-'defemailsubject' => 'e-mail {{GRAMMAR:fun|{{SITENAME}}}}.',
-'noemailtitle' => 'Kein E-Mail Adress',
-'noemailtext' => 'Dä Metmaacher hät kein jöltijje Adreß för sing <i lang="en">e-mail</i> enjedrage.<!-- oder hä well kein E-Mail krije. -->',
-'nowikiemailtitle' => 'Kein <i lang="en">e-mail</i> zojelohße',
-'nowikiemailtext' => 'Hee dä Metmaacher well kein <i lang="en">e-mail</i> vun ander Metmaachere jescheck krijje.',
-'email-legend' => 'Scheck en<i lang="en"> e-mail</i> aan ene andere Metmaacher fum Wiki',
-'emailfrom' => 'Vun:',
-'emailto' => 'Aan:',
-'emailsubject' => 'Ãœvverschreff:',
-'emailmessage' => 'Dä Tex fun Dinge Nohreesch:',
-'emailsend' => 'Avschecke',
-'emailccme' => 'Scheck mer en Kopie vun dä E-Mail.',
-'emailccsubject' => 'En Kopie vun Dinger E-Mail aan $1: $2',
-'emailsent' => 'E-Mail es ungerwähs',
-'emailsenttext' => 'Ding E-Mail es jetz lossjescheck woode.',
-'emailuserfooter' => 'Hee di e-mail hät {{GENDER:$1|dä|et|dä Metmaacher|di|dat}} „$1“ an {{GENDER:$2|dä|et|dä Metmaacher|di|dat}} „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.',
+'usermailererror' => 'Dat E-Mail-Objek jov ene Fähler us:',
+'defemailsubject' => 'e-mail {{GRAMMAR:fun|{{SITENAME}}}}.',
+'usermaildisabled' => 'De <i lang="en">e-mail</i> zwesche Metmaachere es ußjeschalt',
+'usermaildisabledtext' => 'Do kanns kein <i lang="en">e-mail</i> aan ander Metmaacher heh en dämm Wiki schecke',
+'noemailtitle' => 'Kein E-Mail Adress',
+'noemailtext' => 'Dä Metmaacher hät kein jöltijje Adreß för sing <i lang="en">e-mail</i> enjedrage.<!-- oder hä well kein E-Mail krije. -->',
+'nowikiemailtitle' => 'Kein <i lang="en">e-mail</i> zojelohße',
+'nowikiemailtext' => 'Hee dä Metmaacher well kein <i lang="en">e-mail</i> vun ander Metmaachere jescheck krijje.',
+'email-legend' => 'Scheck en<i lang="en"> e-mail</i> aan ene andere Metmaacher fum Wiki',
+'emailfrom' => 'Vun:',
+'emailto' => 'Aan:',
+'emailsubject' => 'Ãœvverschreff:',
+'emailmessage' => 'Dä Tex fun Dinge Nohreesch:',
+'emailsend' => 'Avschecke',
+'emailccme' => 'Scheck mer en Kopie vun dä E-Mail.',
+'emailccsubject' => 'En Kopie vun Dinger E-Mail aan $1: $2',
+'emailsent' => 'E-Mail es ungerwähs',
+'emailsenttext' => 'Ding E-Mail es jetz lossjescheck woode.',
+'emailuserfooter' => 'Hee di e-mail hät {{GENDER:$1|dä|et|dä Metmaacher|di|dat}} „$1“ an {{GENDER:$2|dä|et|dä Metmaacher|di|dat}} „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.',
+
+# User Messenger
+'usermessage-summary' => 'En Nohreesch vum Wiki afjelivvert.',
+'usermessage-editor' => 'Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide',
# Watchlist
'watchlist' => 'ming Oppassliss',
'mywatchlist' => 'ming Oppassliss',
-'watchlistfor' => '(för <strong>$1</strong>)',
+'watchlistfor2' => 'För {{GENDER:$1|dä|dat|dä Metmaacher|de|dat}} $1 $2',
'nowatchlist' => 'En Ding Oppassliss es nix dren.',
'watchlistanontext' => 'Do muss $1, domet de en Ding Oppassliss erenluure kanns, oder jet dran ändere.',
'watchnologin' => 'Nit enjelogg',
@@ -2290,7 +2336,10 @@ De Neuste Änderung aan dä Sigg es jetz vun däm Metmaacher „[[User:$3|$3]]â€
'revertpage' => 'Änderunge vun däm Metmaacher „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|däm sing Klaafsigg]]) fottjeschmesse, un doför de letzte Version vum „[[User:$1|$1]]“ widder zeröckjehollt',
'revertpage-nouser' => 'Änderunge vun enem Metmaacher, däm singe Name vershtoche es, retuur jemaat op de letzte Version {{GENDER:$1|vum|vum|vum Metmaacher|vun dä|vum}} [[User:$1|$1]]',
'rollback-success' => 'De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.',
-'sessionfailure' => "Et jov wall e technisch Problem met Dingem Login. Dröm ha'mer dat us Vörsich jetz nit jemaht, domet mer nit villeich Ding Änderung däm verkihrte Metmaacher ungerjubele. Jangk zeröck un versök et noch ens.",
+
+# Edit tokens
+'sessionfailure-title' => 'Fähler met dä Daate vum Enlogge',
+'sessionfailure' => "Et jov wall e technisch Problem met Dingem Login. Dröm ha'mer dat us Vörsich jetz nit jemaht, domet mer nit villeich Ding Änderung däm verkihrte Metmaacher ungerjubele. Jangk zeröck un versök et noch ens.",
# Protect
'protectlogpage' => 'Logboch vum Sigge Schötze',
@@ -2420,18 +2469,22 @@ $1',
'month' => 'un Moohnt:',
'year' => 'Beß Johr:',
-'sp-contributions-newbies' => 'Nor neu Metmaacher ier Beidräg zeije',
-'sp-contributions-newbies-sub' => 'För neu Metmaacher',
-'sp-contributions-newbies-title' => 'Neu Metmaacher ier Beidräsch',
-'sp-contributions-blocklog' => 'Logboch met Metmaacher-Sperre',
-'sp-contributions-deleted' => 'Fottjeschmesse Beidrääsch',
-'sp-contributions-logs' => 'Logböcher',
-'sp-contributions-talk' => 'Klaaf',
-'sp-contributions-userrights' => 'Räächde verwalde',
-'sp-contributions-blocked-notice' => 'Heh dä Metmaacher es em Momang jespert, Dä letzte Enndraach em Logbooch doh drövver kütt jez als ene Henwiiß:',
-'sp-contributions-search' => 'Söök noh Metmaacher ier Beidräg',
-'sp-contributions-username' => 'Metmaachername odder <i lang="en">IP</i>-Address:',
-'sp-contributions-submit' => 'Söhke',
+'sp-contributions-newbies' => 'Nor neu Metmaacher ier Beidräg zeije',
+'sp-contributions-newbies-sub' => 'För neu Metmaacher',
+'sp-contributions-newbies-title' => 'Neu Metmaacher ier Beidräsch',
+'sp-contributions-blocklog' => 'Logboch met Metmaacher-Sperre',
+'sp-contributions-deleted' => 'Fottjeschmesse Beidrääsch',
+'sp-contributions-uploads' => 'huhjelaade Dateie',
+'sp-contributions-logs' => 'Logböcher',
+'sp-contributions-talk' => 'Klaaf',
+'sp-contributions-userrights' => 'Räächde verwalde',
+'sp-contributions-blocked-notice' => 'Heh dä Metmaacher es em Momang jespert, Dä letzte Enndraach em Logbooch doh drövver kütt jez als ene Henwiiß:',
+'sp-contributions-blocked-notice-anon' => 'Heh di <i lang="en">IP</i>-Address es em Momang jesperrt.
+De neuste Sperr ier Enndraach em Logbooch es:',
+'sp-contributions-search' => 'Söök noh Metmaacher ier Beidräg',
+'sp-contributions-username' => 'Metmaachername odder <i lang="en">IP</i>-Address:',
+'sp-contributions-toponly' => 'Bloß neuste Versione zeije',
+'sp-contributions-submit' => 'Söhke',
# What links here
'whatlinkshere' => 'Wat noh heh link',
@@ -2460,7 +2513,7 @@ $1',
'blockiptext' => 'Hee kanns De bestemmte Metmaacher oder IP-Adresse sperre, su dat se hee em Wiki nit mieh schrieve und Sigge ändere künne.
Dat sollt nor jedon wääde om sujenannte Vandaale ze bremse. Un mer müsse uns dobei natörlich aan uns [[{{MediaWiki:Policy-url}}|Rejelle]] för esu en Fäll halde.
Drag bei „Aanlass“ ene möchlichs jenaue Jrund en, wöröm dat Sperre passeet. Nenn un Link op de Sigge wo Einer kapott jemaat hät, zem Beispill.',
-'ipaddress' => 'IP-Adress',
+'ipaddress' => 'IP-Adräß',
'ipadressorusername' => '<i lang="en">IP</i>-Adress oder Metmaacher Name:',
'ipbexpiry' => 'Duur, för wie lang',
'ipbreason' => 'Aanlass:',
@@ -2497,7 +2550,6 @@ un och wann De se ändere wells.',
'ipb-edit-dropdown' => 'De Jründ för et Sperre beärrbejde',
'ipb-unblock-addr' => '„$1“ widder zohlohße',
'ipb-unblock' => 'En IP-Addräß ov ene Metmaacher widder zohlohße',
-'ipb-blocklist-addr' => 'De Sperre för „$1“ aanzeije, die jrad bestonn',
'ipb-blocklist' => 'All de Sperre för Metmaacher un IP-Adresse aanzeije, die jrad bestonn',
'ipb-blocklist-contribs' => 'De Metmaacher ier Bäjdrähsch för „$1“',
'unblockip' => 'Dä Medmacher widder maache looße',
@@ -2569,6 +2621,8 @@ un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr RäÃ
'sorbs_create_account_reason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Dröm kanns De Dich heh em Wiki nit als ene neue Metmaacher aanmelde. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker oder (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
'cant-block-while-blocked' => 'Do kanns ander Metmaacher nit sperre, esu lang wi De sellver jesperrt bes.',
'cant-see-hidden-user' => 'Dä Metmaacher, dä De shperre wells, es al jeshperrt un verschtoche. Weil De nit dat Rääsch häs. Metmaacher ze vershteiche (<code>hideuser</code>), kanns De däm sing Sperr och nit ändere.',
+'ipbblocked' => 'Do kanns kein ander Metmaachere sperrre, weil De sellver jesperrt bes',
+'ipbnounblockself' => 'Do kanns nit sellver ophävve, dat De jesperrt bes',
# Developer tools
'lockdb' => 'Daatebank sperre',
@@ -2607,6 +2661,21 @@ Esu kam_mer en Sigg jlich widder zeröck ömnenne, wam_mer sich bem Ömnenne ver
'''Oppjepass!'''
Wat beim Ömnenne erus kütt, künnt en opfällije un villeich stürende Änderung aam Wiki sin, besönders bei öff jebruchte Sigge.
Alsu bes secher, dat De versteihs, wat De heh am maache bes, ih dat De et mähs!",
+'movepagetext-noredirectfixer' => "Heh kanns De en Sigg ömnenne.
+Domet kritt die Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
+Unger däm ahle Tittel weed automatisch en Ömleitung op dä neue Tittel enjedrage.
+
+Links op dä ahle Tittel blieve ävver, wie se wore.
+Dat heiß, Do muss selver nohluure, ov do jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidunge]] bei eruskumme.
+Wann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffe Links do henjonn, wo se hen jonn solle.
+Alsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se durch!
+
+De Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' do es nix drop, oder et es en Ömleitung un se es noch nie jeändert woode.
+Esu kam_mer en Sigg jlich widder retuur ömnenne, wam_mer sich mem Ömnenne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop steiht.
+
+'''Oppjepass!'''
+Wat beim Ömnenne erus kütt, künnt en opfällije un villeich stürende Änderung aam Wiki sin, besönders bei öff jebruchte Sigge.
+Alsu bes secher, dat De versteihs, wat De heh am maache bes, ih dat De et mähs!",
'movepagetalktext' => "Dä Sigg ehr Klaafsigg, wann se ein hät, weed automatisch met ömjenannt, '''usser''' wann:
* de Sigg en en ander Appachtemeng kütt,
* en Klaafsigg met däm neue Name ald do es, un et steiht och jet drop,
@@ -2662,6 +2731,7 @@ Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg Ã
'immobile-source-page' => 'Di Sigg kann nit ömjenannt wääde.',
'immobile-target-page' => 'Op dä Tittel kann kei Sigg ömjenannt wääde.',
'imagenocrossnamespace' => 'Dateije kam_mer nor in et Appachtemang „{{ns:file}}“ donn, noh woanders hen kam_mer se och nit ömnemme!',
+'nonfile-cannot-move-to-file' => 'Mer kann nix uußer Datteije esu ömnänne, dat et em Appachtemang „{{ns:file}}“ landt',
'imagetypemismatch' => 'De neu Datei-Endong moß met däm Datei-Tüp zesamme passe',
'imageinvalidfilename' => 'Dä Ziel-Name för de Datei es verkeht',
'fix-double-redirects' => 'Don noh em Ömnenne de Ömleidunge automattesch ändere, di noch op dä ahle Tittel zeije, also de neu entshtande dubbelte Ömleidunge oplöse.',
@@ -2744,6 +2814,7 @@ All de Trans Wiki Emporte wääde em [[Special:Log/import|Emport_Logboch]] fassj
'importstart' => 'Ben Sigge am emporteere …',
'import-revision-count' => '({{PLURAL:$1|ein Version|$1 Versione|kein Version}})',
'importnopages' => 'Kein Sigg för ze Emporteere jefunge.',
+'imported-log-entries' => '{{PLURAL:$1|Eine Enndraach woodt|$1 Enndrääsch woodte|Keine Enndraach wood}} en et Logbooch empotteert.',
'importfailed' => 'Dat Importeere es donevve jejange: $1',
'importunknownsource' => 'Die Zoot Quell för et Emporteere kenne mer nit',
'importcantopen' => 'Kunnt op de Datei för dä Emport nit zojriefe',
@@ -2840,6 +2911,8 @@ Bes esu joot, un versök et noch ens.',
'tooltip-undo' => '„{{UCfirst:{{int:editundo}}}}“ määt der förije Zostand
fun dä Sigg op, zom Beärbeide un widder Afspeichere.
Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
+'tooltip-preferences-save' => 'Enstellunge faßhallde',
+'tooltip-summary' => 'Jif en koote Zesammefassung en',
# Stylesheets
'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
@@ -2967,18 +3040,21 @@ $1',
'nextdiff' => 'De Änderung donoh zeije →',
# Media information
-'mediawarning' => '<strong>Opjepass</strong>: En dä Datei künnt en <b>jefährlich Projrammstöck</b> dren stecke. Wa\'mer et laufe looße dät, do künnt dä Sörver, udder Dinge Rääschner, met för de <i lang="en">Cracker</i> opjemaht wääde.',
+'mediawarning' => '<strong>Opjepass</strong>: En dä Datei künnt en <b>jefährlich Projrammstöck</b> dren stecke. Wa\'mer et laufe looße dät, do künnt dä ẞööver, udder Dinge Rääschner, met för de <i lang="en">Cracker</i> opjemaht wääde.',
'imagemaxsize' => "Belder nit jrößer maache wie:<br /> ''(op dä Sigge, wo se beschrevve wääde)''",
'thumbsize' => 'Esu breid solle de klein Beldche (Thumbnails/Breefmarke) sin:',
-'widthheightpage' => '$1×$2, {{PLURAL:$3|eij Sigg|$3 Sigge|keij Sigge}}',
-'file-info' => '(Dateiömfang: $1, MIME-Tüp: <code>$2</code>)',
-'file-info-size' => '({{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, de Datei hät $3, dä MIME-Typ es: <code>$4</code>)',
+'widthheightpage' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, {{PLURAL:$3|eij Sigg|$3 Sigge|keij Sigge}}',
+'file-info' => 'Dateiömfang: $1, MIME-Tüp: <code>$2</code>',
+'file-info-size' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, de Datei hät $3, dä MIME-Typ es: <code>$4</code>',
'file-nohires' => '<small>Mer han kein hüütere Oplösung vun däm Beld.</small>',
-'svg-long-desc' => '(SVG-Datei, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle}} huh, dä Dateiömfang es $3)',
+'svg-long-desc' => 'SVG-Datei, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle}} huh, dä Dateiömfang es $3',
'show-big-image' => 'Jröößer Oplöösung',
'show-big-image-thumb' => '<small>Di Vör-Aansich es $1 × $2 Pixelle jroß</small>',
'file-info-gif-looped' => 'läuf emmer widder vun vürre',
'file-info-gif-frames' => '{{PLURAL:$1|ei einzel Beld|$1 einzel Belder|kei einzel Beld}}',
+'file-info-png-looped' => 'läuf emmer widder vun vürre',
+'file-info-png-repeat' => 'weed {{PLURAL:$1|eijmohl|$1 Mohl|keimohl}} affjespellt',
+'file-info-png-frames' => '{{PLURAL:$1|ei einzel Beld|$1 einzel Belder|kei einzel Beld}}',
# Special:NewFiles
'newimages' => 'Neu Dateie als Jaleri',
@@ -3136,6 +3212,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
'exif-gpsareainformation' => 'Dä Name fum GPS-Jebeet',
'exif-gpsdatestamp' => 'GPS-Dattum',
'exif-gpsdifferential' => 'De Differenzjahl-Bereschtijong fum GPS',
+'exif-objectname' => 'Der Tittel en koot',
# EXIF attributes
'exif-compression-1' => 'Oohne Kompressjuhn',
@@ -3304,24 +3381,24 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
'limitall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'E-Mail Adress bestätije',
-'confirmemail_noemail' => 'En [[Special:Preferences|Ding Enstellunge]] es kein öntlich E-Mail Adress.',
-'confirmemail_text' => 'Ih datte en däm Wiki heh de E-Mail bruche kanns, muss De Ding E-Mail Adress bestätich han, dat se en Oodnung es un dat se och Ding eijene es. Klick op dä Knopp un Do kriss en E-Mail jescheck. Do steiht ene Link met enem Code dren. Wann De met Dingem Brauser op dä Link jeihs, dann deis De domet bestätije, dat et wirklich Ding E-Mail Adress es. Dat es nit allzo secher, alsu wör nix för Die Bankkonto oder bei de Sparkass, ävver et sorg doför, dat nit jede Peijaß met Dinger E-Mail oder Dingem Metmaachername eröm maache kann.',
-'confirmemail_pending' => 'Do häs ald ene Kood för de Bestätijung med ene E-Mail zojeschek bekumme. Wann De Ding Aanmeldung eez jraad jemaat häs, dann donn noch ene Moment waade, ih dat De Der ene neue Kood hölls.',
-'confirmemail_send' => 'Scheck en E-Mail zem Bestätije',
-'confirmemail_sent' => 'En E-Mail, för Ding E-Mail Adress ze bestätije, es ungerwähs.',
-'confirmemail_oncreate' => 'Do häs jetz ene Kood för de Bestätijung med ene E-Mail zojeschek bekumme. För em Wiki jet ze maache, un för et Enlogge, do bruchs De der Kode nit, ävver domet de e-Mail övver et Wiki schecke un krijje kanns, doför moß De en ejmool ens bestätijje, domet secher es, dat Ding E-Mail Adress och rechtich jetipp wohr.',
-'confirmemail_sendfailed' => "Beim E-Mail Adress Bestätije es jet donevve jejange, künnt sin, en Dinger E-Mail Adress es e Zeiche verkihrt, oder esu jet.
+'confirmemail' => 'E-Mail Adress bestätije',
+'confirmemail_noemail' => 'En [[Special:Preferences|Ding Enstellunge]] es kein öntlich E-Mail Adress.',
+'confirmemail_text' => 'Ih datte en däm Wiki heh de E-Mail bruche kanns, muss De Ding E-Mail Adress bestätich han, dat se en Oodnung es un dat se och Ding eijene es. Klick op dä Knopp un Do kriss en E-Mail jescheck. Do steiht ene Link met enem Code dren. Wann De met Dingem Brauser op dä Link jeihs, dann deis De domet bestätije, dat et wirklich Ding E-Mail Adress es. Dat es nit allzo secher, alsu wör nix för Die Bankkonto oder bei de Sparkass, ävver et sorg doför, dat nit jede Peijaß met Dinger E-Mail oder Dingem Metmaachername eröm maache kann.',
+'confirmemail_pending' => 'Do häs ald ene Kood för de Bestätijung med ene E-Mail zojeschek bekumme. Wann De Ding Aanmeldung eez jraad jemaat häs, dann donn noch ene Moment waade, ih dat De Der ene neue Kood hölls.',
+'confirmemail_send' => 'Scheck en E-Mail zem Bestätije',
+'confirmemail_sent' => 'En E-Mail, för Ding E-Mail Adress ze bestätije, es ungerwähs.',
+'confirmemail_oncreate' => 'Do häs jetz ene Kood för de Bestätijung med ene E-Mail zojeschek bekumme. För em Wiki jet ze maache, un för et Enlogge, do bruchs De der Kode nit, ävver domet de e-Mail övver et Wiki schecke un krijje kanns, doför moß De en ejmool ens bestätijje, domet secher es, dat Ding E-Mail Adress och rechtich jetipp wohr.',
+'confirmemail_sendfailed' => "Beim E-Mail Adress Bestätije es jet donevve jejange, künnt sin, en Dinger E-Mail Adress es e Zeiche verkihrt, oder esu jet.
Dä E-Mail-ẞööver hät jesaat: ''$1''",
-'confirmemail_invalid' => 'Et es jet donevve jejange, Ding E-Mail Adress es un bliev nit bestätich. Mööchlech, dä Code wohr verkihrt, hä künnt avjelaufe jewäse sin, oder esu jet. Versöök et noch ens.',
-'confirmemail_needlogin' => 'Do muss Dich $1, för de E-Mail Adress ze bestätije.',
-'confirmemail_success' => 'Ding E-Mail Adress es jetz bestätich.
+'confirmemail_invalid' => 'Et es jet donevve jejange, Ding E-Mail Adress es un bliev nit bestätich. Mööchlech, dä Code wohr verkihrt, hä künnt avjelaufe jewäse sin, oder esu jet. Versöök et noch ens.',
+'confirmemail_needlogin' => 'Do muss Dich $1, för de E-Mail Adress ze bestätije.',
+'confirmemail_success' => 'Ding E-Mail Adress es jetz bestätich.
Jetz künns De och noch enlogge. Vill Spass!',
-'confirmemail_loggedin' => 'Ding E-Mail Adress es jetz bestätich!',
-'confirmemail_error' => 'Beim E-Mail Adress Bestätije es jet donevve jejange, de Bestätijung kunnt nit avjespeichert wääde.',
-'confirmemail_subject' => 'Dun Ding <i lang="en">e-mail</i> Adress för {{GRAMMAR:Akkusativ|{{SITENAME}}}} bestäteje.',
-'confirmemail_body' => 'Künnt jod sin, Do wors et selver, vun de IP_Adress $1 hät sich
+'confirmemail_loggedin' => 'Ding E-Mail Adress es jetz bestätich!',
+'confirmemail_error' => 'Beim E-Mail Adress Bestätije es jet donevve jejange, de Bestätijung kunnt nit avjespeichert wääde.',
+'confirmemail_subject' => 'Dun Ding <i lang="en">e-mail</i> Adress för {{GRAMMAR:Akkusativ|{{SITENAME}}}} bestäteje.',
+'confirmemail_body' => 'Künnt jod sin, Do wors et selver, vun de IP_Adress $1 hät sich
jedenfalls einer jemeldt, un well dä Metmaacher "$2" {{GRAMMAR:vun|{{SITENAME}}}}
sin, un hät en E-Mail Adress aanjejovve.
@@ -3339,8 +3416,46 @@ bestätich es. Do kanns ävver och op he dä Link jon:
$5
Domet deiß De tirek sare, dat De di Adress nit bestätije wells.',
-'confirmemail_invalidated' => "Et Bestätijje för die E-Mail-Adress es afjebroche woode, un die Adress is '''nit''' bestätich.",
-'invalidateemail' => 'E-Mail-Adress nit bestätich',
+'confirmemail_body_changed' => 'Künnt jod sin, Do wors et selver. Vun de IP_Adress $1 hät sich
+jedenfalls einer jemeldt, un well dä Metmaacher "$2" op {{GRAMMAR:Akk bet|{{SITENAME}}}}
+sin, un hät en neu Adress för sing e-mail aanjejovve.
+
+Öm jetz klor ze krije, dat die neu Adress un dä Metmaacher och
+zosamme jehüre, un öm de e-mail op {{GRAMMAR:Akk bet|{{SITENAME}}}}
+widder aanzschallde, moss dä Metmaacher en singem Brauser dä Link:
+
+$3
+
+opmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann de et selver bes.
+
+Wann nit Do, sondern söns wä Ding E-Mail Adress aanjejovve hät, bruchs
+De jar nix ze don. Di Adress weed nit jebruch, wann se nit bestätich es.
+Do kanns ävver och op heh dä Link jon:
+
+$5
+
+Domet deiß De tirek sare, dat De di Adress nit bestätije wells.',
+'confirmemail_body_set' => 'Künnt jod sin, Do wors et selver. Vun de IP_Adress $1 hät op
+jede Fall einer för dä Metmaacher "$2" op {{GRAMMAR:Akk bet|{{SITENAME}}}}
+heh di Adress för däm sing e-mail aanjejovve.
+
+Öm jetz klor ze krije, dat die neu Adress un dä Metmaacher och
+zosamme jehüre, un öm de e-mail op {{GRAMMAR:Akk bet|{{SITENAME}}}}
+widder aanzschallde, moss dä Metmaacher en singem Brauser dä Link:
+
+$3
+
+opmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann de et selver bes.
+
+Wann nit Do, sondern söns wä Ding E-Mail Adress aanjejovve hät, bruchs
+De jar nix ze don. Di Adress weed nit jebruch, wann se nit bestätich es.
+Do kanns ävver och op heh dä Link jon:
+
+$5
+
+Domet deiß De tirek sare, dat De di Adress nit bestätije wells.',
+'confirmemail_invalidated' => "Et Bestätijje för die E-Mail-Adress es afjebroche woode, un die Adress is '''nit''' bestätich.",
+'invalidateemail' => 'E-Mail-Adress nit bestätich',
# Scary transclusion
'scarytranscludedisabled' => '[Et Enbinge per Interwiki es avjeschalt]',
@@ -3391,6 +3506,7 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
'table_pager_first' => 'De eetste Sigg',
'table_pager_last' => 'De letzte Sigg',
'table_pager_limit' => 'Zeich $1 pro Sigg',
+'table_pager_limit_label' => 'Stöcker pro Sigg:',
'table_pager_limit_submit' => 'Lohß Jonn!',
'table_pager_empty' => 'Nix erus jekumme',
@@ -3478,6 +3594,7 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
'version-specialpages' => '{{int:nstab-special}}e',
'version-parserhooks' => 'De Parser-Hooke',
'version-variables' => 'Variable',
+'version-skins' => 'Ovverflääsche',
'version-other' => 'Söns',
'version-mediahandlers' => 'Medije-Handler',
'version-hooks' => 'Schnettstelle oder Hooke',
@@ -3489,6 +3606,13 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
'version-hook-subscribedby' => 'Opjeroofe vun',
'version-version' => '(Version $1)',
'version-license' => 'Lizenz',
+'version-poweredby-credits' => "Dat Wiki heh löp met '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'sönß wää',
+'version-license-info' => 'MediaWiki es e frei Projramm. Mer kann et unmolesteet wigger verdeile, un mer kann et verändere, wi mer löstich es, wam_mer sesch dobei aan de <i lang="en">GNU General Public License</i> (jenerälle öffentlesche Lizänz noh GNU) hallde deiht, wi se vun der <i lang="en">Free Software Foundation</i> (Steftung för frei Soffwäer) veröffentlesch woode es. Dobei kam_mer sesch ußsöhke of mer sesch aan de Version 2 dovun hallde deiht, udder öhnz en späädere Fassung.
+
+MediaWiki weed verdeilt met dä Hoffnung, dat et för jet jood es, ävver <span style="text-transform:uppercase">der ohne jeede Jarantie</span>, un esujaa ohne ene unjesaate Jedangke, et künnt <span style="text-transform:uppercase">ze verkoufe</span> sin udder <span style="text-transform:uppercase;">för öhndsene bestemmpte Zweck ze jebruche</span>. Loor Der de jenannte Lizänz aan, wann De mieh Einzelheite weße wells.
+
+Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU General Public License</i>] zosamme met däm Projramm krääje han, un wann nit, schrief aan de: <i lang="en">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA </i> udder [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html liß se em Internet noh].',
'version-software' => 'Installeete Soffwäer',
'version-software-product' => 'Produk',
'version-software-version' => 'Version',
@@ -3559,6 +3683,15 @@ Der Name moß ohne der Försatz „{{ns:file}}:“ aanjejovve wääde.',
'tags-edit' => 'ändere',
'tags-hitcount' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|kein Änderunge}}',
+# Special:ComparePages
+'comparepages' => 'Sigge verjliesche',
+'compare-selector' => 'Versione vun Sigge verjlieshe',
+'compare-page1' => 'De ein Sigg',
+'compare-page2' => 'De ander Sigg',
+'compare-rev1' => 'de ein Version',
+'compare-rev2' => 'de ander Version',
+'compare-submit' => 'Verjlieshe!',
+
# Database error messages
'dberr-header' => 'Dat Wiki heh häd en Schwierischkeit',
'dberr-problems' => 'Deit uns leid, die Sigg heh häd för der Momang e teschnisch Problem.',
@@ -3576,8 +3709,13 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
'htmlform-float-invalid' => 'Wat De doh aanjejovve häs, dat es kein gewöhnlijje udder Komma-Zahl.',
'htmlform-int-toolow' => 'Dinge aanjejovve Wäät litt onger dämm winnischßde, wat müjjelesch es, un dat es $1.',
'htmlform-int-toohigh' => 'Dinge aanjejovve Wäät litt övver dämm hühßte, wat jeiht, un dat es $1.',
+'htmlform-required' => 'Heh dä Wäät es nüüdesch',
'htmlform-submit' => 'Lohß Jonn!',
'htmlform-reset' => 'Änderunge retuur nämme',
'htmlform-selectorother-other' => 'Annder',
+# SQLite database support
+'sqlite-has-fts' => 'Version $1 (un kann en janze Täxte söhke)',
+'sqlite-no-fts' => 'Version $1 (kann ävver nit en janze Täxte söhke)',
+
);
diff --git a/languages/messages/MessagesKu_arab.php b/languages/messages/MessagesKu_arab.php
index 6eeb31b1..78e9481d 100644
--- a/languages/messages/MessagesKu_arab.php
+++ b/languages/messages/MessagesKu_arab.php
@@ -13,7 +13,7 @@
* @author Marmzok
*/
-$fallback = 'ckb-arab';
+$fallback = 'ckb';
$digitTransformTable = array(
'0' => 'Ù ', # &#x0660;
diff --git a/languages/messages/MessagesKu_latn.php b/languages/messages/MessagesKu_latn.php
index 2938b766..ffe74173 100644
--- a/languages/messages/MessagesKu_latn.php
+++ b/languages/messages/MessagesKu_latn.php
@@ -51,8 +51,7 @@ $messages = array(
'tog-editsection' => 'Lînkan ji bo guherandinê beşan biwêşîne',
'tog-editsectiononrightclick' => 'Beşekê bi rast-klîkekê biguherîne (JavaScript gireke)',
'tog-showtoc' => 'Tabloya naverokê nîşanbide (ji rûpelan bi zêdetirî sê sernavan)',
-'tog-rememberpassword' => 'Qeydkirinê min di vê komputerê da wîne bîrê',
-'tog-editwidth' => 'Cihê guherandinê yê tewrî mezin',
+'tog-rememberpassword' => 'Qeyda min di vê kompûterê de biparêze (herî zÊde bo $1 {{PLURAL:$1|rojekê|rojan}})',
'tog-watchcreations' => 'Rûpelan, yê min çêkir, têke lîsteya min ya şopandinê',
'tog-watchdefault' => 'Rûpelan, yê min guhart, têke lîsteya min ya şopandinê',
'tog-watchmoves' => 'Rûpelan, yê min navî wan guhart, têke lîsteya min ya şopandinê',
@@ -191,31 +190,20 @@ $messages = array(
'faqpage' => 'Project:Pirs û Bersîv',
# Vector skin
-'vector-action-addsection' => 'Mijarekê lê zêde bike',
-'vector-action-delete' => 'Jê bibe',
-'vector-action-move' => 'Nav biguherîne',
-'vector-action-protect' => 'Biparêze',
-'vector-action-undelete' => 'Nejêbirî',
-'vector-action-unprotect' => 'Parastinê rake',
-'vector-namespace-category' => 'Kategorî',
-'vector-namespace-help' => 'Alîkarî',
-'vector-namespace-image' => 'Wêne',
-'vector-namespace-main' => 'Gotar',
-'vector-namespace-media' => 'Medya',
-'vector-namespace-mediawiki' => 'Peyam',
-'vector-namespace-project' => 'Rûpela projeyê',
-'vector-namespace-special' => 'Rûpela taybet',
-'vector-namespace-talk' => 'Guftûgo',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Bikarhêner',
-'vector-view-create' => 'Çêke',
-'vector-view-edit' => 'Biguherîne',
-'vector-view-history' => 'Dîrokê bibîne',
-'vector-view-view' => 'Bixwîne',
-'vector-view-viewsource' => 'Çavkaniyan bibîne',
-'actions' => 'Xebat',
-'namespaces' => 'Valageha navan',
-'variants' => 'Variyant',
+'vector-action-addsection' => 'Mijarekê lê zêde bike',
+'vector-action-delete' => 'Jê bibe',
+'vector-action-move' => 'Nav biguherîne',
+'vector-action-protect' => 'Biparêze',
+'vector-action-undelete' => 'Nejêbirî',
+'vector-action-unprotect' => 'Parastinê rake',
+'vector-view-create' => 'Çêke',
+'vector-view-edit' => 'Biguherîne',
+'vector-view-history' => 'Dîrokê bibîne',
+'vector-view-view' => 'Bixwîne',
+'vector-view-viewsource' => 'Çavkaniyan bibîne',
+'actions' => 'Xebat',
+'namespaces' => 'Valageha navan',
+'variants' => 'Variyant',
'errorpagetitle' => 'Çewtî (Error)',
'returnto' => 'Bizivire $1.',
@@ -272,6 +260,7 @@ $messages = array(
'jumptonavigation' => 'navîgasyon',
'jumptosearch' => 'lêbigere',
'view-pool-error' => 'Bibore, server niha zêde barkirî ne. Gelek bikarîner niha hewl didin ku vê rûpelê bibînin. Bêzehmet, kêlîkekê bisekine berî ku dîsa hewl bidî xwe bigihînî vê rûpelê.',
+'pool-errorunknown' => 'Xeletiyek nenas',
# 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' => 'Der barê {{SITENAME}}',
@@ -413,7 +402,7 @@ Hesaba te hat afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe di
'yourname' => 'Navê te wek bikarhêner (user name)',
'yourpassword' => 'Şîfreya te (password)',
'yourpasswordagain' => 'Şîfreya xwe careke din binîvîse',
-'remembermypassword' => 'Şifreya min di her rûniştdemê de bîne bîra xwe.',
+'remembermypassword' => 'Şifreya min di her rûniştdemê de bîne bîra xwe (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Domaînê te',
'externaldberror' => "Ya şaşbûnek di naskirinê derva heye, ya tu nikarî account'î xwe yê derva bikarwînê.",
'login' => 'Têkeve',
@@ -430,6 +419,7 @@ Hesaba te hat afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe di
'gotaccount' => "Hesabê te heye? '''$1'''.",
'gotaccountlink' => 'Têkeve',
'createaccountmail' => 'bi e-name',
+'createaccountreason' => 'Sedem',
'badretype' => 'Herdu şîfreyên ku te nivîsîn hevûdin nagirin.',
'userexists' => 'Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din bibe.',
'loginerror' => 'Çewtî (Login error)',
@@ -485,6 +475,7 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
'resetpass_forbidden' => 'Şîfre nikanin werin guhartin',
'resetpass-submit-loggedin' => 'Şîfre biguherîne',
'resetpass-submit-cancel' => 'Betal',
+'resetpass-temp-password' => 'Şîfreya niha:',
# Edit page toolbar
'bold_sample' => 'Nivîsa estûr',
@@ -603,8 +594,6 @@ Eger tu qeyd bikî, hemû guhertinên ji vê revîzyonê piştre winda dibin.
'copyrightwarning' => "Dîqat bike: Hemû tevkariyên {{SITENAME}} di bin $2 de tên belav kirin (ji bo hûragahiyan li $1 binêre). Eger tu nexwazî ku nivîsên te bê dilrehmî bên guherandin û li gora keyfa herkesî bên belavkirin, li vir neweşîne.<br />
Tu soz didî ku te ev bi xwe nivîsand an jî ji çavkaniyekê azad an geliyane ''(public domain)'' girt.
'''BERHEMÊN MAFÊN WAN PARASTÎ (©) BÊ DESTÛR NEWEŞÎNE!'''",
-'longpagewarning' => "HIŞYAR: Drêjahiya vê rûpelê $1 kB (kilobyte) e, ev pir e. Dibe ku çend ''browser''
-baş nikarin rûpelên ku ji 32 kB drêjtir in biguherînin. Eger tu vê rûpelê beş beş bikî gelo ne çêtir e?",
'protectedpagewarning' => "'''ŞIYARÎ: Ev rûpel tê parastin. Bi tenê bikarhênerên ku xwediyên mafên \"koordînator\" ne, dikarin vê rûpelê biguherînin.'''",
'templatesused' => 'Şablon di van rûpelan da tê bikaranîn',
'templatesusedpreview' => 'Şablon yê di vê pêşdîtinê da tên bikaranîn:',
@@ -682,6 +671,7 @@ Sedemê qedexekirinê ji $3 ev e: ''$2''",
'revdelete-suppress' => 'Sedemê jêbirinê ji koordînatoran ra jî veşêre',
'revdelete-log' => 'Sedem',
'revdel-restore' => 'xuyakirinê biguherîne',
+'revdel-restore-deleted' => 'revîzyonên hatine jêbirin',
'pagehist' => 'Dîroka rûpelê',
'revdelete-content' => 'naverrok',
'revdelete-summary' => 'kurteyê biguherîne',
@@ -727,6 +717,7 @@ Sedemê qedexekirinê ji $3 ev e: ''$2''",
'searchhelp-url' => 'Help:Alîkarî',
'searchprofile-articles' => 'Rûpelên naverokê',
'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
+'searchprofile-images' => 'Multimedia',
'searchprofile-everything' => 'Hemî',
'searchprofile-advanced' => 'Pêşketî',
'searchprofile-articles-tooltip' => 'Di $1 da lêbigere',
@@ -818,7 +809,7 @@ Sedemê qedexekirinê ji $3 ev e: ''$2''",
'prefs-help-realname' => 'Ne gereke. Tu dikarî navî xwe binivisînê, ew ê bi karkirên te were nivîsandin.',
'prefs-help-email' => 'Adrêsa te yê e-nameyan ne gereke were nivîsandin, lê ew qebûldike, ku bikarhênerên din vê naskirinê te kanibin e-nameyan ji te ra bişînin.',
'prefs-help-email-required' => 'Adrêsa e-nameyan gereke.',
-'prefs-signature' => 'ÃŽmza',
+'prefs-signature' => 'ÃŽmze',
# User rights
'userrights' => 'Îdarekirina mafên bikarhêneran',
@@ -867,6 +858,8 @@ Sedemê qedexekirinê ji $3 ev e: ''$2''",
'right-browsearchive' => 'Li rûpelên jêbirî bigerre',
'right-undelete' => 'Jêbirinê betal bike',
'right-import' => 'Rûpelan ji wikiyên din împort bike',
+'right-userrights' => 'Hemû mafên bikarhêner biguherîne',
+'right-sendemail' => 'Ji bikarhênerên di re e-name bişîne',
# User rights log
'rightslog' => 'Reşahîya mafên bikarhêneran',
@@ -894,11 +887,7 @@ Sedemê qedexekirinê ji $3 ev e: ''$2''",
'nchanges' => '$1 {{PLURAL:$1|guherandinek|guherandin}}',
'recentchanges' => 'Guherandinên dawî',
'recentchanges-legend' => 'Vebijarkên guherandinên dawî',
-'recentchanges-label-legend' => 'Ravek: $1.',
-'recentchanges-legend-newpage' => '$1 - rûpela nû',
-'recentchanges-legend-minor' => ' $1 guherandina biçûk',
'recentchanges-label-minor' => 'Ev guhertineka biçûk e',
-'recentchanges-legend-bot' => '$1 - guherrandina bot',
'rcnote' => "Jêr {{PLURAL:$1|guherandinek|'''$1''' guherandinên dawî}} di {{PLURAL:$2|rojê|'''$2''' rojên dawî}} de ji $3 şûnde tên nîşan dan.",
'rclistfrom' => 'an jî guherandinên ji $1 şûnda nîşan bide.',
'rcshowhideminor' => 'guherandinên biçûk $1',
@@ -928,73 +917,74 @@ Sedemê qedexekirinê ji $3 ev e: ''$2''",
'recentchangeslinked-page' => 'Navê rûpelê',
# Upload
-'upload' => 'Wêneyekî barbike',
-'uploadbtn' => 'Wêneyê (ya tiştekî din ya mêdya) barbike',
-'reuploaddesc' => 'Barkirinê biskîne û dîsa here rûpela barkirinê.',
-'uploadnologin' => 'Xwe qeyd nekir',
-'uploadnologintext' => 'Ji bo barkirina wêneyan divê ku tu [[Special:UserLogin|têkevî]].',
-'uploaderror' => 'Şaşbûn bo barkirinê',
-'uploadtext' => "Berê tu wêneyên nû bar bikî, ji bo dîtin an vedîtina wêneyên ku ji xwe hene binêre: [[Special:FileList|lîsteya wêneyên barkirî]]. Herwisa wêneyên ku hatine barkirin an jî jê birin li vir dikarî bibînî: [[Special:Log/upload|reşahîya barkirîyan]].
+'upload' => 'Wêneyekî barbike',
+'uploadbtn' => 'Wêneyê (ya tiştekî din ya mêdya) barbike',
+'reuploaddesc' => 'Barkirinê biskîne û dîsa here rûpela barkirinê.',
+'uploadnologin' => 'Xwe qeyd nekir',
+'uploadnologintext' => 'Ji bo barkirina wêneyan divê ku tu [[Special:UserLogin|têkevî]].',
+'uploaderror' => 'Şaşbûn bo barkirinê',
+'upload-recreate-warning' => 'Agadarî: dosyeyek bi vî navî hatiye jêbirin yan raguhastin.',
+'uploadtext' => "Berê tu wêneyên nû bar bikî, ji bo dîtin an vedîtina wêneyên ku ji xwe hene binêre: [[Special:FileList|lîsteya wêneyên barkirî]]. Herwisa wêneyên ku hatine barkirin an jî jê birin li vir dikarî bibînî: [[Special:Log/upload|reşahîya barkirîyan]].
Yek ji lînkên jêr ji bo bikarhînana wêne an file'ê di gotarê de bikar bihîne:
'''<nowiki>[[</nowiki>{{ns:file}}:File.jpg<nowiki>]]</nowiki>''',
'''<nowiki>[[</nowiki>{{ns:file}}:File.png|alt text<nowiki>]]</nowiki>''',
anjî ji bo file'ên dengî '''<nowiki>[[</nowiki>{{ns:media}}:File.ogg<nowiki>]]</nowiki>'''",
-'upload-permitted' => "Formatên data'yan, yên tên qebûlkirin: $1.",
-'upload-preferred' => "Formatên data'yan, yên tên xastin: $1.",
-'upload-prohibited' => "Formatên data'yan, yên ne tên qebûlkirin: $1.",
-'uploadlog' => 'Reşahîya barkirinê',
-'uploadlogpage' => 'Reşahîya barkirinê',
-'filename' => 'Navê dosyayê',
-'filedesc' => 'Kurte',
-'fileuploadsummary' => 'Kurte:',
-'filestatus' => 'Rewşa telîfê:',
-'filesource' => 'Çavkanî:',
-'uploadedfiles' => 'Dosyayên bar kirî',
-'ignorewarning' => 'Hişyarê qebûl neke û dosyayê qeyd bike.',
-'ignorewarnings' => 'Guh nede hîşyaran',
-'minlength1' => "Navên data'yan bi kêmani gireke tîpek be.",
-'illegalfilename' => 'Navî datayê "$1" ne tê qebûlkirin ji ber ku tişt tê da hatine nivîsandin yê qedexe ne. Xêra xwe navî datayê biguherîne û carekî din barbike.',
-'badfilename' => 'Navê vî wêneyî hat guherandin û bû "$1".',
-'filetype-badmime' => 'Data bi formata MIME yê "$1" nameşin werin barkirin.',
-'filetype-unwanted-type' => '\'\'\'".$1"\'\'\' formatekî nexastî ye.
+'upload-permitted' => "Formatên data'yan, yên tên qebûlkirin: $1.",
+'upload-preferred' => "Formatên data'yan, yên tên xastin: $1.",
+'upload-prohibited' => "Formatên data'yan, yên ne tên qebûlkirin: $1.",
+'uploadlog' => 'Reşahîya barkirinê',
+'uploadlogpage' => 'Reşahîya barkirinê',
+'filename' => 'Navê dosyayê',
+'filedesc' => 'Kurte',
+'fileuploadsummary' => 'Kurte:',
+'filestatus' => 'Rewşa telîfê:',
+'filesource' => 'Çavkanî:',
+'uploadedfiles' => 'Dosyayên bar kirî',
+'ignorewarning' => 'Hişyarê qebûl neke û dosyayê qeyd bike.',
+'ignorewarnings' => 'Guh nede hîşyaran',
+'minlength1' => "Navên data'yan bi kêmani gireke tîpek be.",
+'illegalfilename' => 'Navî datayê "$1" ne tê qebûlkirin ji ber ku tişt tê da hatine nivîsandin yê qedexe ne. Xêra xwe navî datayê biguherîne û carekî din barbike.',
+'badfilename' => 'Navê vî wêneyî hat guherandin û bû "$1".',
+'filetype-badmime' => 'Data bi formata MIME yê "$1" nameşin werin barkirin.',
+'filetype-unwanted-type' => '\'\'\'".$1"\'\'\' formatekî nexastî ye.
Format {{PLURAL:$3|yê tê|yên tên}} qebûlkirin {{PLURAL:$3|ev e|ev in}}: $2.',
-'filetype-banned-type' => '\'\'\'".$1"\'\'\' formatekî qedexe ye.
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' formatekî qedexe ye.
Format {{PLURAL:$3|yê tê|yên tên}} xastin {{PLURAL:$3|ev e|ev in}}: $2.',
-'filetype-missing' => 'Piştnavî datayê tune (wek ".jpg").',
-'large-file' => "Mezinbûna data'yan bila ne ji $1 mezintir bin; ev data'ya $2 mezin e.",
-'emptyfile' => "Data'ya barkirî vala ye. Sedemê valabûnê belkî şaşnivîsek di navê data'yê da ye. Xêra xwe seke, ku tu rast dixazê vê data'yê barbikê.",
-'fileexists' => "Datayek bi vê navê berê heye.
+'filetype-missing' => 'Piştnavî datayê tune (wek ".jpg").',
+'large-file' => "Mezinbûna data'yan bila ne ji $1 mezintir bin; ev data'ya $2 mezin e.",
+'emptyfile' => "Data'ya barkirî vala ye. Sedemê valabûnê belkî şaşnivîsek di navê data'yê da ye. Xêra xwe seke, ku tu rast dixazê vê data'yê barbikê.",
+'fileexists' => "Datayek bi vê navê berê heye.
Eger tu niha li „Tomarbike“ xê, ew wêneyê kevin ê here û wêneyê te ê were barkirin di bin wê navê.
Di bin '''<tt>[[:$1]]</tt>''' du dikarî sekê, ku di dixwazê wê wêneyê biguherînê.
Eger tu naxazê, xêra xwe li „Betal“ xe.
[[$1|thumb]]",
-'fileexists-extension' => "Datayek wek vê navê berê heye: [[$2|thumb]]
+'fileexists-extension' => "Datayek wek vê navê berê heye: [[$2|thumb]]
* Navî datayê yê tê barkirin: '''<tt>[[:$1]]</tt>'''
* Navî datayê yê berê heyê: '''<tt>[[:$2]]</tt>'''
Xêra xwe navekî din bibîne.",
-'file-thumbnail-no' => "Navî vê datayê bi '''<tt>$1</tt>''' destpêdike. Ev dibêje ku ev wêneyekî çûçik e ''(thumbnail)''. Xêra xwe seke, ku belkî versyonekî mezin yê vê wêneyê li cem te heye û wê wêneyê mezintir di bin navî orîjînal da barbike.",
-'fileexists-forbidden' => 'Medyayek bi vê navî heye; xêra xwe şonda here û vê medyayê bi navekî din barbike.
+'file-thumbnail-no' => "Navî vê datayê bi '''<tt>$1</tt>''' destpêdike. Ev dibêje ku ev wêneyekî çûçik e ''(thumbnail)''. Xêra xwe seke, ku belkî versyonekî mezin yê vê wêneyê li cem te heye û wê wêneyê mezintir di bin navî orîjînal da barbike.",
+'fileexists-forbidden' => 'Medyayek bi vê navî heye; xêra xwe şonda here û vê medyayê bi navekî din barbike.
[[File:$1|thumb|center|$1]]',
-'successfulupload' => 'Barkirin serkeftî',
-'uploadwarning' => 'Hişyara barkirinê',
-'savefile' => 'Dosyayê tomar bike',
-'uploadedimage' => '"$1" barkirî',
-'overwroteimage' => 'versyonekî nuh ji "[[$1]]" hate barkirin',
-'uploaddisabled' => 'Barkirin hatîye qedexekirin',
-'uploaddisabledtext' => "Barkirinê data'yan hatiye qedexekirin.",
-'uploadvirus' => "Di vê data'yê da vîrûsek heye! Înformasyon: $1",
-'sourcefilename' => 'Navî wêneyê (ya tiştekî din ya mêdya):',
-'destfilename' => 'Navî wêneyê (ya tiştekî din ya mêdya) yê xastî:',
-'upload-maxfilesize' => "Mezinbûna data'yê ya herî mezin: $1",
-'watchthisupload' => 'Vê rûpelê bişopîne',
-'filewasdeleted' => "Data'yek bi vê navê hatibû barkirin û jêbirin. Xêra xwe li $1 seke ku barkirina te hêja ye ya na.",
-'upload-wasdeleted' => "'''Hîşyar: Tu data'yekê bardikê yê berê hatibû jêbirin.'''
+'uploadwarning' => 'Hişyara barkirinê',
+'savefile' => 'Dosyayê tomar bike',
+'uploadedimage' => '"$1" barkirî',
+'overwroteimage' => 'versyonekî nuh ji "[[$1]]" hate barkirin',
+'uploaddisabled' => 'Barkirin hatîye qedexekirin',
+'uploaddisabledtext' => "Barkirinê data'yan hatiye qedexekirin.",
+'uploadvirus' => "Di vê data'yê da vîrûsek heye! Înformasyon: $1",
+'sourcefilename' => 'Navî wêneyê (ya tiştekî din ya mêdya):',
+'destfilename' => 'Navî wêneyê (ya tiştekî din ya mêdya) yê xastî:',
+'upload-maxfilesize' => "Mezinbûna data'yê ya herî mezin: $1",
+'watchthisupload' => 'Vê rûpelê bişopîne',
+'filewasdeleted' => "Data'yek bi vê navê hatibû barkirin û jêbirin. Xêra xwe li $1 seke ku barkirina te hêja ye ya na.",
+'upload-wasdeleted' => "'''Hîşyar: Tu data'yekê bardikê yê berê hatibû jêbirin.'''
Zanibe, ku ev barkirina kê were qebûlkirin ya na.
Înformasyonan li ser jêbirinê kevin ra:",
-'filename-bad-prefix' => "Nava wê data'yê, yê tu niha bardikê, bi '''\"\$1\"''' destpêdike. Kamêrayên dîjîtal wan navan didin wêneyên xwe. Ji kerema xwe navekî baştir binivisîne ji bo mirov zûtir zanibin ku şayeşê vê wêneyê çî ye.",
+'filename-bad-prefix' => "Nava wê data'yê, yê tu niha bardikê, bi '''\"\$1\"''' destpêdike. Kamêrayên dîjîtal wan navan didin wêneyên xwe. Ji kerema xwe navekî baştir binivisîne ji bo mirov zûtir zanibin ku şayeşê vê wêneyê çî ye.",
+'upload-success-subj' => 'Barkirin serkeftî',
'license' => 'Lîsens:',
'license-header' => 'Lîsens:',
@@ -1230,7 +1220,6 @@ Binêre [[Special:WantedCategories|kategorîyên xastî]].',
# Watchlist
'watchlist' => 'Lîsteya min ya şopandinê',
'mywatchlist' => 'Lîsteya min ya şopandinê',
-'watchlistfor' => "(ji bo '''$1''')",
'nowatchlist' => 'Tiştek di lîsteya te ya şopandinê da tune ye.',
'watchlistanontext' => 'Ji bo sekirinê ya xeyrandinê lîsteya te ya şopandinê tu gireke xwe $1.',
'watchnologin' => 'Te xwe qeyd nekirîye.',
@@ -1478,7 +1467,6 @@ Sedemekê binivîse!',
'ipb-edit-dropdown' => 'Sedemên astengkirinê',
'ipb-unblock-addr' => 'Astengkirinê $1 rake',
'ipb-unblock' => "Astengkirina bikarhênerekî ya adrêsa IP'yekê rake",
-'ipb-blocklist-addr' => 'Astengkirinên niha ji $1 ra bibîne',
'ipb-blocklist' => 'Astengkirinên niha bibîne',
'ipb-blocklist-contribs' => 'Tevkarîyên ji bo $1',
'unblockip' => "IP'yekê dîsa veke",
@@ -1770,10 +1758,10 @@ if (wgUserLanguage == "ku-arab")
'thumbsize' => "Mezinbûna thunbnail'ê:",
'widthheight' => '$1 x $2',
'widthheightpage' => '$1×$2, $3 rûpel',
-'file-info' => '(mezinbûnê data: $1, MIME-typ: $2)',
-'file-info-size' => '($1 × $2 pixel, mezinbûnê data: $3, MIME-typ: $4)',
+'file-info' => 'mezinbûnê data: $1, MIME-typ: $2',
+'file-info-size' => '$1 × $2 pixel, mezinbûnê data: $3, MIME-typ: $4',
'file-nohires' => '<small>Versyonekî jê mezintir tune.</small>',
-'svg-long-desc' => "(Data'ya SVG, mezinbûna rast: $1 × $2 pixel; mezinbûna data'yê: $3)",
+'svg-long-desc' => "Data'ya SVG, mezinbûna rast: $1 × $2 pixel; mezinbûna data'yê: $3",
'show-big-image' => 'Mezînbûn',
'show-big-image-thumb' => '<small>Mezinbûna vê pêşnîşandanê: $1 × $2 pixel</small>',
@@ -1945,6 +1933,13 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
'tag-filter-submit' => 'Fîltre',
'tags-edit' => 'biguherîne',
+# Special:ComparePages
+'compare-page1' => 'Rûpel 1',
+'compare-page2' => 'Rûpel 2',
+'compare-rev1' => 'Revîzyon 1',
+'compare-rev2' => 'Revîzyon 2',
+'compare-submit' => 'Bide berhev',
+
# Database error messages
'dberr-header' => "Problemeka vê wiki'yê heye.",
diff --git a/languages/messages/MessagesKw.php b/languages/messages/MessagesKw.php
index 8e1b58c6..82ee17f7 100644
--- a/languages/messages/MessagesKw.php
+++ b/languages/messages/MessagesKw.php
@@ -18,70 +18,77 @@
$namespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Arbennek',
- NS_TALK => 'Keskows',
+ NS_TALK => 'Kescows',
NS_USER => 'Devnydhyer',
- NS_USER_TALK => 'Keskows_Devnydhyer',
- NS_PROJECT_TALK => 'Keskows_$1',
+ NS_USER_TALK => 'Kescows_Devnydhyer',
+ NS_PROJECT_TALK => 'Kescows_$1',
NS_FILE => 'Restren',
- NS_FILE_TALK => 'Keskows_Restren',
+ NS_FILE_TALK => 'Kescows_Restren',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'Keskows_MediaWiki',
- NS_TEMPLATE => 'Skantlyn',
- NS_TEMPLATE_TALK => 'Keskows_Skantlyn',
+ NS_MEDIAWIKI_TALK => 'Kescows_MediaWiki',
+ NS_TEMPLATE => 'Scantlyn',
+ NS_TEMPLATE_TALK => 'Kescows_Scantlyn',
NS_HELP => 'Gweres',
- NS_HELP_TALK => 'Keskows_Gweres',
- NS_CATEGORY => 'Klass',
- NS_CATEGORY_TALK => 'Keskows_Klass',
+ NS_HELP_TALK => 'Kescows_Gweres',
+ NS_CATEGORY => 'Class',
+ NS_CATEGORY_TALK => 'Kescows_Class',
);
$namespaceAliases = array(
'Arbednek' => NS_SPECIAL,
'Cows' => NS_TALK,
- 'Kescows' => NS_TALK,
+ 'Keskows' => NS_TALK,
'Cows_Devnydhyer' => NS_USER_TALK,
- 'Kescows_Devnydhyer' => NS_USER_TALK,
+ 'Keskows_Devnydhyer' => NS_USER_TALK,
'Cows_$1' => NS_PROJECT_TALK,
- 'Kescows_$1' => NS_PROJECT_TALK,
+ 'Keskows_$1' => NS_PROJECT_TALK,
'Cows_Restren' => NS_FILE_TALK,
- 'Kescows_Restren' => NS_FILE_TALK,
+ 'Keskows_Restren' => NS_FILE_TALK,
'Cows_MediaWiki' => NS_MEDIAWIKI_TALK,
'Cows_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'Keskows_MediaWiki' => NS_MEDIAWIKI_TALK,
'Cows_Scantlyn' => NS_TEMPLATE_TALK,
- 'Scantlyn' => NS_TEMPLATE,
- 'Kescows_Scantlyn' => NS_TEMPLATE_TALK,
+ 'Skantlyn' => NS_TEMPLATE,
+ 'Keskows_Skantlyn' => NS_TEMPLATE_TALK,
'Cows_Gweres' => NS_HELP_TALK,
- 'Kescows_Gweres' => NS_HELP_TALK,
+ 'Keskows_Gweres' => NS_HELP_TALK,
'Cows_Class' => NS_CATEGORY_TALK,
- 'Class' => NS_CATEGORY,
- 'Kescows_Class' => NS_CATEGORY_TALK,
+ 'Klass' => NS_CATEGORY,
+ 'Keskows_Klass' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
- 'Watchlist' => array( 'Rol golyas' ),
- 'Recentchanges' => array( 'Chanjyow a-dhiwedhes' ),
- 'Upload' => array( 'Ughkarga' ),
+ 'Preferences' => array( 'Dewisyansow' ),
+ 'Watchlist' => array( 'Rol_golyas' ),
+ 'Recentchanges' => array( 'Chanjyow_a-dhiwedhes' ),
+ 'Upload' => array( 'Ughcarga' ),
'Randompage' => array( 'FolenDreJons' ),
+ 'Wantedpages' => array( 'FolennowWhansus' ),
+ 'Wantedcategories' => array( 'ClassysWhansus' ),
+ 'Wantedfiles' => array( 'RestrennowWhansus' ),
+ 'Wantedtemplates' => array( 'ScantlynsWhansus' ),
+ 'Newpages' => array( 'FolennowNowyth' ),
+ 'Ancientpages' => array( 'FolennowCoth' ),
'Allpages' => array( 'OllFolennow' ),
'Specialpages' => array( 'FolennowArbennek' ),
'Contributions' => array( 'Kevrohow' ),
'Emailuser' => array( 'EbostyaDevnydhyer' ),
- 'Movepage' => array( 'RemovyaFolen' ),
- 'Categories' => array( 'Klassys' ),
- 'Export' => array( 'Esperthi' ),
+ 'Movepage' => array( 'GwayaFolen' ),
+ 'Categories' => array( 'Classys' ),
+ 'Export' => array( 'Esperthy' ),
'Version' => array( 'Versyon' ),
'Allmessages' => array( 'OllMessajow' ),
- 'Blockip' => array( 'Let' ),
- 'Import' => array( 'Ymperthi' ),
+ 'Blockip' => array( 'Lettya' ),
+ 'Import' => array( 'Ymperthy' ),
'Mypage' => array( 'OwFolen' ),
'Mytalk' => array( 'OwHows' ),
'Mycontributions' => array( 'OwHevrohow' ),
- 'Search' => array( 'Hwilans' ),
+ 'Search' => array( 'Whilans' ),
);
$messages = array(
# User preference toggles
-'tog-hideminor' => 'Cudha chanjyow bian yn chanjyow a-dhiwedhes',
-'tog-rememberpassword' => "Gwra remembra ow omgelmy war'n amontyer-ma",
+'tog-hideminor' => 'Cudha chanjyow bian yn chanjyow a-dhiwedhes',
'underline-never' => 'Nevra',
@@ -167,28 +174,17 @@ $messages = array(
'qbspecialpages' => 'Folednow arbednek',
# Vector skin
-'vector-action-addsection' => 'Keworra mater',
-'vector-action-delete' => 'Dilea',
-'vector-action-move' => 'Gwaya',
-'vector-action-protect' => 'Difres',
-'vector-action-undelete' => 'Disdhilea',
-'vector-action-unprotect' => 'Disdhifres',
-'vector-namespace-category' => 'Class',
-'vector-namespace-help' => 'Gweres',
-'vector-namespace-image' => 'Restren',
-'vector-namespace-main' => 'Folen',
-'vector-namespace-media' => 'Folen media',
-'vector-namespace-mediawiki' => 'Messaj',
-'vector-namespace-project' => 'Folen an towl',
-'vector-namespace-special' => 'Folen arbednek',
-'vector-namespace-talk' => 'Kescows',
-'vector-namespace-template' => 'Scantlyn',
-'vector-namespace-user' => 'Folen devnydhyer',
-'vector-view-create' => 'Gwruthyl',
-'vector-view-edit' => 'Chanjya',
-'vector-view-history' => 'Gweles istory an folen',
-'vector-view-view' => 'Redya',
-'vector-view-viewsource' => 'Gweles pennfenten',
+'vector-action-addsection' => 'Keworra mater',
+'vector-action-delete' => 'Dilea',
+'vector-action-move' => 'Gwaya',
+'vector-action-protect' => 'Difres',
+'vector-action-undelete' => 'Disdhilea',
+'vector-action-unprotect' => 'Disdhifres',
+'vector-view-create' => 'Gwruthyl',
+'vector-view-edit' => 'Chanjya',
+'vector-view-history' => 'Gweles istory an folen',
+'vector-view-view' => 'Redya',
+'vector-view-viewsource' => 'Gweles pennfenten',
'errorpagetitle' => 'Gwall',
'returnto' => 'Dewheles dhe $1.',
@@ -316,7 +312,7 @@ $messages = array(
'yourname' => 'Hanow-usyer:',
'yourpassword' => 'Ger-tremena:',
'yourpasswordagain' => 'Jynnscrifewgh agas ger-tremena arta:',
-'remembermypassword' => "Gwra remembra ow omgelmy war'n amontyer-ma",
+'remembermypassword' => "Remembra ow ger-tremena war'n amontyer-ma (rag ughboynt a $1 {{PLURAL:$1|dedh|dedh}})",
'yourdomainname' => 'Agas diredh:',
'login' => 'Omgelmy',
'nav-login-createaccount' => 'Omgelmy / Formya acont nowyth',
@@ -567,11 +563,7 @@ Gwrewgh assaya dhe rag-gorra agas govyn gen ''all:'' rag whila yn pub le (a-bart
'recentchanges-legend' => 'Dewisyansow an chanjyow a-dhiwedhes',
'recentchangestext' => "Sewya an chanjyow diwettha eus dhe'n wiki war'n folen-ma.",
'recentchanges-feed-description' => "Sewya an chanjyow diwettha dhe'n wiki y'n feed-ma.",
-'recentchanges-label-legend' => 'Alwhedh: $1.',
-'recentchanges-legend-newpage' => '$1 - folen nowyth',
-'recentchanges-legend-minor' => '$1 - chanj bian',
'recentchanges-label-minor' => 'Hemm yw chanj bian',
-'recentchanges-legend-bot' => '$1 - chanj gans bot',
'rclistfrom' => 'Disqwedhes chanjyow nowyth ow talleth a-dhia $1.',
'rcshowhideminor' => '$1 chanjyow bian',
'rcshowhidebots' => '$1 botow',
@@ -717,7 +709,6 @@ Yth yw folednow eus war agas [[Special:Watchlist|rol golyas]] yn '''tew'''.",
# Watchlist
'watchlist' => 'Ow rol golyas',
'mywatchlist' => 'Ow rol golyas',
-'watchlistfor' => "(rag '''$1''')",
'addedwatch' => 'Keworrys dhe rol golyas',
'removedwatch' => 'Dileys dhort an rol golyas',
'watch' => 'Golya',
@@ -924,7 +915,9 @@ Why a ell gweles hy fennfenten.',
'nextdiff' => 'Chanj nowyttha →',
# Media information
+'file-info-size' => '$1 × $2 pixel, mens an restren: $3, sort MIME : $4',
'file-nohires' => '<small>Nyns eus clerder uhella cavadow.</small>',
+'svg-long-desc' => 'Restren SVG, $1 × $2 pixel yn hanow, mens an restren: $3',
'show-big-image' => 'Clerder leun',
'show-big-image-thumb' => '<small>Mens an ragwel-ma: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesKy.php b/languages/messages/MessagesKy.php
index a9697ffb..4e297093 100644
--- a/languages/messages/MessagesKy.php
+++ b/languages/messages/MessagesKy.php
@@ -306,7 +306,6 @@ $messages = array(
# Watchlist
'watchlist' => 'Байкоо тизмем',
-'watchlistfor' => "('''$1''' үчүн)",
'watchnologin' => 'Катталган жок',
'addedwatch' => 'Байкоо тизмеге кошумчаланды',
'watch' => 'Байкоо',
diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php
index 5f6362d9..26f7ce13 100644
--- a/languages/messages/MessagesLa.php
+++ b/languages/messages/MessagesLa.php
@@ -169,8 +169,7 @@ $messages = array(
'tog-editsection' => 'Paginarum segmenta [redigere] hortari',
'tog-editsectiononrightclick' => 'Paginarum segmenta dextero percussu in titulis redigenda (JavaScript poscitur)',
'tog-showtoc' => 'Indicem plurium quam III segmentorum paginis praebere',
-'tog-rememberpassword' => 'Memorare tesserae meae inter conventa (utere cookies)',
-'tog-editwidth' => 'Capsam recensionis amplificare ut totam latitudinem habet',
+'tog-rememberpassword' => 'Memorare tesserae meae hoc in navigatro inter conventa ({{PLURAL:$1|die|diebus}} $1 tenus)',
'tog-watchcreations' => 'Paginas quas creo in paginarum custoditarum indicem addere',
'tog-watchdefault' => 'Paginas quas recenseo in paginarum custoditarum indicem addere',
'tog-watchmoves' => 'Paginas quas moveo in paginarum custoditarum indicem addere',
@@ -296,31 +295,20 @@ $messages = array(
'faqpage' => 'Project:Quaestiones frequentes',
# Vector skin
-'vector-action-addsection' => 'Partem novam addere',
-'vector-action-delete' => 'Delere',
-'vector-action-move' => 'Movere',
-'vector-action-protect' => 'Protegere',
-'vector-action-undelete' => 'Restituere',
-'vector-action-unprotect' => 'Deprotegere',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Auxilium',
-'vector-namespace-image' => 'Fasciculus',
-'vector-namespace-main' => 'Res',
-'vector-namespace-media' => 'Media',
-'vector-namespace-mediawiki' => 'Nuntium',
-'vector-namespace-project' => 'Consilium',
-'vector-namespace-special' => 'Pagina specialis',
-'vector-namespace-talk' => 'Disputatio',
-'vector-namespace-template' => 'Formula',
-'vector-namespace-user' => 'Pagina usoris',
-'vector-view-create' => 'Creare',
-'vector-view-edit' => 'Recensere',
-'vector-view-history' => 'Historiam inspicere',
-'vector-view-view' => 'Legere',
-'vector-view-viewsource' => 'Fontem inspicere',
-'actions' => 'Actiones',
-'namespaces' => 'Spatia nominalia',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Partem novam addere',
+'vector-action-delete' => 'Delere',
+'vector-action-move' => 'Movere',
+'vector-action-protect' => 'Protegere',
+'vector-action-undelete' => 'Restituere',
+'vector-action-unprotect' => 'Deprotegere',
+'vector-view-create' => 'Creare',
+'vector-view-edit' => 'Recensere',
+'vector-view-history' => 'Historiam inspicere',
+'vector-view-view' => 'Legere',
+'vector-view-viewsource' => 'Fontem inspicere',
+'actions' => 'Actiones',
+'namespaces' => 'Spatia nominalia',
+'variants' => 'Variantes',
'errorpagetitle' => 'Erratum',
'returnto' => 'Redire ad $1.',
@@ -506,7 +494,7 @@ Noli oblivisci [[Special:Preferences|praeferentias tuas]] apud {{grammar:accusat
'yourname' => 'Nomen usoris:',
'yourpassword' => 'Tessera:',
'yourpasswordagain' => 'Tesseram adfirmare:',
-'remembermypassword' => 'Tesseram meam inter conventa memento',
+'remembermypassword' => 'Tesseram meam hoc in navigatro inter conventa memento ({{PLURAL:$1|die|diebus}} $1 tenus)',
'yourdomainname' => 'Regnum tuum:',
'login' => 'Conventum aperire',
'nav-login-createaccount' => 'Conventum aperire / conventum creare',
@@ -606,6 +594,7 @@ Hunc nuntium ignorare potes, si nolis hac ratione uti.',
'showlivepreview' => 'Monstrare praevisum viventem',
'showdiff' => 'Mutata ostendere',
'anoneditwarning' => "'''Monitio:''' Conventum tuum non apertum. Locus IP tuus in historia huius paginae notabitur.",
+'anonpreviewwarning' => "''Conventum tuum non apertum. Si servas, locus IP tuus in historia huius paginae notabitur.''",
'missingcommenttext' => 'Sententiam subter inscribe.',
'summary-preview' => 'Praevisum summarii:',
'subject-preview' => 'Praevisum rei/tituli:',
@@ -688,9 +677,6 @@ Nobis etiam spondes te esse ipsum horum verborum scriptorem primum, aut ex opere
Nisi vis verba tua crudelissime recenseri, noli ea submittere.<br />
Nobis etiam spondes te esse ipsum horum verborum scriptorem primum, aut ex opere in \"dominio publico\" vel ex libere fonte simili exscripsisse (vide singula apud \$1).
'''NOLI OPERIBUS SUB IURE DIVULGANDI UTI SINE POTESTATE!'''",
-'longpagewarning' => 'MONITIO: Haec pagina est $1 chilioctetis longa;
-aliquae navigatra paginas longiores quam 32 chiliocteti recensere non possunt.
-Considera paginam in partes minores frangere.',
'protectedpagewarning' => "'''CAVE: Haec pagina protecta est ut magistratus soli eam recenseant.'''",
'templatesused' => '{{PLURAL:$1|Formula hac in pagina adhibita:|Formulae hac in pagina adhibitae:}}',
'templatesusedpreview' => '{{PLURAL:$1|Formula hoc in praeviso adhibita:|Formulae hoc in praeviso adhibitae:}}',
@@ -1087,12 +1073,8 @@ Si vis, sinit etiam aliis tecum loqui per tuam paginam usoris vel disputationis,
'recentchanges-legend' => 'Indicis paginarum nuper mutatarum praeferentiae',
'recentchangestext' => 'Inspice mutationes recentes huic vici in hac pagina.',
'recentchanges-feed-description' => 'Nuper mutata Viciae hoc in fluxu observare.',
-'recentchanges-label-legend' => 'Sigla: $1.',
-'recentchanges-legend-newpage' => '$1 - pagina nova',
'recentchanges-label-newpage' => 'Haec recensio paginam novam creavit',
-'recentchanges-legend-minor' => '$1 - recensio minor',
'recentchanges-label-minor' => 'Haec est recensio minor',
-'recentchanges-legend-bot' => '$1 - recensio automati',
'recentchanges-label-bot' => 'Hanc emendationem automaton fecit',
'rcnote' => "Subter {{PLURAL:$1|est '''1''' nuper mutatum|sunt '''$1''' nuperrime mutata}} in {{PLURAL:$2|die proximo|'''$2''' diebus proximis}} ex $5, $4.",
'rcnotefrom' => "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
@@ -1160,7 +1142,6 @@ Vide etiam [[Special:NewFiles|pinacothecam fasciculorum recentissimorum imposito
'badfilename' => 'Nomen fasciculi ad "$1" mutatum est.',
'filetype-missing' => 'Fasciculus extensionem non habet (sicut e.&nbsp;g. ".jpg").',
'large-file' => 'Suasum est ut fasciculi $1 magnitudine non excedant; magnitudo huius fasciculi est $2.',
-'successfulupload' => 'Impositum est perfectum',
'uploadwarning' => 'Monitus imponendi',
'savefile' => 'Servare fasciculum',
'uploadedimage' => 'imposuit "[[$1]]"',
@@ -1175,6 +1156,7 @@ Vide etiam [[Special:NewFiles|pinacothecam fasciculorum recentissimorum imposito
Tibi oportet meditari utrum hunc fasciculum iterum imponere tamen convenit.
Commodule notatio fasciculorum deletorum hic datur:",
+'upload-success-subj' => 'Impositum est perfectum',
'upload-proto-error' => 'Protocollum incorrectum',
'upload-file-error' => 'Erratum internum',
@@ -1291,7 +1273,6 @@ Contenta [$2 paginae descriptionis fasciculi] subter monstrantur.',
'statistics-edits-average' => 'Recensiones per paginam',
'statistics-views-total' => 'Visus',
'statistics-views-peredit' => 'Visus per recensionem',
-'statistics-jobqueue' => 'Numerus [http://www.mediawiki.org/wiki/Manual:Job_queue operationum qui etiam exspectant perfacier]',
'statistics-users' => '[[Special:ListUsers|Usores]] relati',
'statistics-users-active' => 'Usores activi',
'statistics-users-active-desc' => 'Usores qui {{PLURAL:$1|proxima die|proximis $1 diebus}} actionem perfecerunt',
@@ -1476,10 +1457,12 @@ Inscriptio electronica quam in [[Special:Preferences|praeferentiis tuis]] dedis
'emailsenttext' => 'Nuntium tuum missum est.',
'emailuserfooter' => 'Has litteras electronicas $1 ad $2 misit per "Litteras electronicas usori mittere" in {{grammar:ablative|{{SITENAME}}}}.',
+# User Messenger
+'usermessage-editor' => 'Nuntius systematis',
+
# Watchlist
'watchlist' => 'Paginae custoditae',
'mywatchlist' => 'Paginae custoditae',
-'watchlistfor' => "(pro usore '''$1''')",
'nowatchlist' => 'Nullas paginas custodis.',
'watchlistanontext' => 'Necesse est $1 ad indicem paginarum custoditarum inspiciendum vel recensendum.',
'watchnologin' => 'Conventum non est apertum',
@@ -2049,10 +2032,10 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
''(in pagina descriptionis fasciculi)''",
'thumbsize' => 'Magnitudo pollicisunguis:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagina|paginae}}',
-'file-info' => '(magnitudo fasciculi: $1, typus MIME: $2)',
-'file-info-size' => '($1 × $2 elementa imaginalia, magnitudo fasciculi: $3, typus MIME: $4)',
+'file-info' => 'magnitudo fasciculi: $1, typus MIME: $2',
+'file-info-size' => '$1 × $2 elementa imaginalia, magnitudo fasciculi: $3, typus MIME: $4',
'file-nohires' => '<small>Nulla maior resolutio exstat.</small>',
-'svg-long-desc' => '(fasciculus SVG, nominale $1 × $2 elementa imaginalia, magnitudo fasciculi: $3)',
+'svg-long-desc' => 'fasciculus SVG, nominale $1 × $2 elementa imaginalia, magnitudo fasciculi: $3',
'show-big-image' => 'Resolutio completa',
'show-big-image-thumb' => '<small>Mensura huius praevisi: pixellae $1 × $2</small>',
'file-info-gif-frames' => '$1 {{PLURAL:$1|replum|repla}}',
@@ -2412,6 +2395,12 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
'tags-edit' => 'mutatum',
'tags-hitcount' => '$1 {{PLURAL:$1|mutatum|mutata}}',
+# Special:ComparePages
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Emendatio 1',
+'compare-rev2' => 'Emendatio 2',
+
# HTML forms
'htmlform-submit' => 'Submittere',
'htmlform-reset' => 'Mutationes abrogare',
diff --git a/languages/messages/MessagesLad.php b/languages/messages/MessagesLad.php
index 03634f20..38de12a6 100644
--- a/languages/messages/MessagesLad.php
+++ b/languages/messages/MessagesLad.php
@@ -17,56 +17,226 @@
$fallback = 'es';
+$namespaceNames = array(
+ NS_MEDIA => 'Medya',
+ NS_SPECIAL => 'Especial',
+ NS_TALK => 'Diskusyón',
+ NS_USER => 'Usador',
+ NS_USER_TALK => 'Messaje_de_Usador',
+ NS_PROJECT_TALK => 'Diskusyón_de_$1',
+ NS_FILE => 'Dosya',
+ NS_FILE_TALK => 'Diskusyón_de_Dosya',
+ NS_MEDIAWIKI => 'MedyaViki',
+ NS_MEDIAWIKI_TALK => 'Diskusyón_de_MedyaViki',
+ NS_TEMPLATE => 'Xabblón',
+ NS_TEMPLATE_TALK => 'Diskusyón_de_Xabblón',
+ NS_HELP => 'Ayudo',
+ NS_HELP_TALK => 'Diskusyón_de_Ayudo',
+ NS_CATEGORY => 'Katēggoría',
+ NS_CATEGORY_TALK => 'Diskusyón_de_Katēggoría',
+);
+
+$namespaceAliases = array(
+ // Backward compat. Fallbacks from 'es'.
+ 'Especial' => NS_SPECIAL,
+ 'Discusión' => NS_TALK,
+ 'Usuario' => NS_USER,
+ 'Usuario_Discusión' => NS_USER_TALK,
+ '$1_Discusión' => NS_PROJECT_TALK,
+ 'Archivo' => NS_FILE,
+ 'Archivo_Discusión' => NS_FILE_TALK,
+ 'MediaWiki_Discusión' => NS_MEDIAWIKI_TALK,
+ 'Plantilla' => NS_TEMPLATE,
+ 'Plantilla_Discusión' => NS_TEMPLATE_TALK,
+ 'Ayuda' => NS_HELP,
+ 'Ayuda_Discusión' => NS_HELP_TALK,
+ 'Categoría' => NS_CATEGORY,
+ 'Categoría_Discusión' => NS_CATEGORY_TALK,
+
+ 'Meddia' => NS_MEDIA,
+ 'Diskussión' => NS_TALK,
+ 'Empleador' => NS_USER,
+ 'Message_de_Empleador' => NS_USER_TALK,
+ 'Diskussión_de_$1' => NS_PROJECT_TALK,
+ 'Dossia' => NS_FILE,
+ 'Diskussión_de_Dossia' => NS_FILE_TALK,
+ 'Diskussión_de_Xabblón' => NS_MEDIAWIKI_TALK,
+ 'Plantilla_Discusión' => NS_TEMPLATE_TALK,
+ 'Diskussión_de_Ayudo' => NS_HELP_TALK,
+ 'Kateggoría' => NS_CATEGORY,
+ 'Diskussión_de_Kateggoría' => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'DireksyonesDobles' ),
+ 'BrokenRedirects' => array( 'DireksyonesBozeadas' ),
+ 'Disambiguations' => array( 'Apartamiento_de_senso' ),
+ 'Userlogin' => array( 'Entrada_del_usador' ),
+ 'Userlogout' => array( 'Salida_del_usador' ),
+ 'CreateAccount' => array( 'CriarCuento' ),
+ 'Preferences' => array( 'Preferencias' ),
+ 'Watchlist' => array( 'Lista_de_escogidos' ),
+ 'Recentchanges' => array( 'TrocamientosFreskos' ),
+ 'Upload' => array( 'CargarDosya' ),
+ 'Listfiles' => array( 'ListaDosyas' ),
+ 'Newimages' => array( 'NuevasDosyas' ),
+ 'Listusers' => array( 'ListaUsadores' ),
+ 'Listgrouprights' => array( 'DerechosGruposUsadores' ),
+ 'Statistics' => array( 'Estatistika' ),
+ 'Randompage' => array( 'KualunkeHoja' ),
+ 'Lonelypages' => array( 'HojasHuérfanas' ),
+ 'Uncategorizedpages' => array( 'HojasNoKateggorizadas' ),
+ 'Uncategorizedcategories' => array( 'KateggoríasNoKateggorizadas' ),
+ 'Uncategorizedimages' => array( 'DosyasNoKateggorizadas' ),
+ 'Uncategorizedtemplates' => array( 'XabblonesNoKateggorizados' ),
+ 'Unusedcategories' => array( 'KateggoríasSinUso' ),
+ 'Unusedimages' => array( 'DosyasSinUso' ),
+ 'Wantedpages' => array( 'HojasDemandadas' ),
+ 'Wantedcategories' => array( 'KateggoríasDemandadas' ),
+ 'Wantedfiles' => array( 'DosyasDemandadas' ),
+ 'Wantedtemplates' => array( 'XabblonesDemandados' ),
+ 'Mostlinked' => array( 'HojasLoMásMunchoLinkeadas' ),
+ 'Mostlinkedcategories' => array( 'KateggoríasMásUsadas' ),
+ 'Mostlinkedtemplates' => array( 'XabblonesMásUsados' ),
+ 'Mostimages' => array( 'DosyasLoMásMunchoLinkeadas' ),
+ 'Mostcategories' => array( 'MásKateggorizadas' ),
+ 'Mostrevisions' => array( 'MásEddisyones' ),
+ 'Fewestrevisions' => array( 'MancoEddisyones' ),
+ 'Shortpages' => array( 'HojasCurtas' ),
+ 'Longpages' => array( 'HojasLargas' ),
+ 'Newpages' => array( 'HojasNuevas' ),
+ 'Ancientpages' => array( 'HojasViejas' ),
+ 'Deadendpages' => array( 'HojasSinLinkes' ),
+ 'Protectedpages' => array( 'HojasGuardadas' ),
+ 'Protectedtitles' => array( 'TítůlosGuardados' ),
+ 'Allpages' => array( 'TodasLasHojas' ),
+ 'Prefixindex' => array( 'Fijhrist_de_prefiksos' ),
+ 'Ipblocklist' => array( 'UsadoresBloqueados' ),
+ 'Unblock' => array( 'Desbloquea' ),
+ 'Specialpages' => array( 'HojasEspeciales' ),
+ 'Contributions' => array( 'Ajustamientos' ),
+ 'Emailuser' => array( 'MandarEmailUsador' ),
+ 'Confirmemail' => array( 'AverdadearEmail' ),
+ 'Whatlinkshere' => array( 'LoQueLinkeaAquí' ),
+ 'Recentchangeslinked' => array( 'TrocamientosEnterassados' ),
+ 'Movepage' => array( 'TashirearHoja' ),
+ 'Blockme' => array( 'Bloquearme' ),
+ 'Booksources' => array( 'FuentesDeLibros' ),
+ 'Categories' => array( 'Kateggorías' ),
+ 'Export' => array( 'AktarearAfuera' ),
+ 'Version' => array( 'Versión' ),
+ 'Allmessages' => array( 'TodosLosMessajes' ),
+ 'Log' => array( 'RÄ“jistro' ),
+ 'Blockip' => array( 'Bloquear' ),
+ 'Undelete' => array( 'TraerAtrás' ),
+ 'Import' => array( 'AktarearAriento' ),
+ 'Lockdb' => array( 'BloquearBasa_de_dados' ),
+ 'Unlockdb' => array( 'DesbloquearBasa_de_dados' ),
+ 'Userrights' => array( 'DerechosUsadores' ),
+ 'MIMEsearch' => array( 'BuscarPorMIME' ),
+ 'FileDuplicateSearch' => array( 'BuscarDosyasDobles' ),
+ 'Unwatchedpages' => array( 'HojasSinCudiadas' ),
+ 'Listredirects' => array( 'TodasLasDireksyones' ),
+ 'Revisiondelete' => array( 'EfassarRēvizyón' ),
+ 'Unusedtemplates' => array( 'XabblonesSinUso' ),
+ 'Randomredirect' => array( 'KualunkeDireksyón' ),
+ 'Mypage' => array( 'MiHoja' ),
+ 'Mytalk' => array( 'MiDiskusyón' ),
+ 'Mycontributions' => array( 'MisAjustamientos' ),
+ 'Listadmins' => array( 'ListaDeAdministradores' ),
+ 'Listbots' => array( 'ListaDeBots' ),
+ 'Popularpages' => array( 'HojasMásVisitadas' ),
+ 'Search' => array( 'Buscar' ),
+ 'Resetpass' => array( 'TrocarKóddiche' ),
+ 'Withoutinterwiki' => array( 'SinIntervikis' ),
+ 'MergeHistory' => array( 'AjuntarIstoria' ),
+ 'Filepath' => array( 'Pozisyón_de_dosya' ),
+ 'Invalidateemail' => array( 'DesverdadearEmail' ),
+ 'Blankpage' => array( 'VaziarHoja' ),
+ 'LinkSearch' => array( 'Busqueda_de_linkes' ),
+ 'DeletedContributions' => array( 'AjustamientosEfassados' ),
+ 'Tags' => array( 'Etiquetas' ),
+ 'Activeusers' => array( 'UsadoresActivos' ),
+ 'ComparePages' => array( 'ApariguarHojas' ),
+ 'Badtitle' => array( 'TítůloNegro' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#DIRIJAR', '#DIRECCIÓN', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+ 'fullpagename' => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'NOMBREDEHOJICA', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
+ 'msg' => array( '0', 'MSJ:', 'MSG:' ),
+ 'img_left' => array( '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ),
+ 'img_none' => array( '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+);
+
$messages = array(
# User preference toggles
-'tog-underline' => 'Suliña los atamientos:',
-'tog-highlightbroken' => 'Àmostra los artíkůlos vazíos <a href="" class="new">en kolorado</a> , (si no: este modo<a href="" class="internal">?</a>).',
-'tog-justify' => 'Àrrima los paraggrafos de dos vandas',
-'tog-hideminor' => 'Eskonde los trokamientos chikitikos',
-'tog-hidepatrolled' => 'Eskonde los trokamientos surveyados',
-'tog-newpageshidepatrolled' => 'Eskonde las hojas surveyadas en la lista de las hojas muevas',
-'tog-extendwatchlist' => 'Anchea mi lista de eskojidas afín de àmostrar todos los trokamientos, no sólo los muevos',
-'tog-usenewrc' => 'Usa el modo adelantado (JavaScript es menester)',
-'tog-numberheadings' => 'Numerota los títůlos de una manera otomatika',
-'tog-showtoolbar' => 'Àmostra el chibuk de aparatos (JavaScript es menester)',
-'tog-editondblclick' => 'Troka los hojas en doble klik. (JavaScript es menester)',
-'tog-editsection' => 'Ofre la possibilidad de trokar los kapítůlos usando el atamiento [troka]',
-'tog-editsectiononrightclick' => 'Ofrir la possibbilidad de trocar los capítůlos; en pizando el botón derecho del ratón, cuando está encima de los títůlos de capítůlos (JavaScript es menesteroso)',
-'tog-showtoc' => 'Amostrar el tabblo de contenidos (por las hojas que tienen más de 3 títůlos)',
-'tog-rememberpassword' => 'Akodrár mis informasiones sobre ésta komputadóra',
-'tog-editwidth' => 'Alargar la caxa de trocamiento para inchir el ekran entero',
-'tog-watchcreations' => 'Ajustar las hojas que crií, a mi lista de escogidas',
-'tog-watchdefault' => 'Ajustar las hojas que troquí, a mi lista de escogidas',
-'tog-watchmoves' => 'Ajustar las hojas que taxireí, a mi lista de escogidas',
-'tog-watchdeletion' => 'Ajustar las hojas que efassí, a mi lista de escogidas',
-'tog-minordefault' => 'Va marcando todos los trocamientos como chiquiticos.',
-'tog-previewontop' => 'Amostrar la prēvizibbilizasyón enriba de la caxa de ēddisyón',
-'tog-previewonfirst' => 'Amostrar la prēvizibbilizasyón al primer trocamiento',
-'tog-nocache' => 'No permeter a la kaxé de las hojas',
-'tog-enotifwatchlistpages' => 'Embiarme un e-mail (una letra elektronika) cuando se troca una hoja que está en mi lista de escogidos',
-'tog-enotifusertalkpages' => 'Embiarme un e-mail (una letra elektronika) cuando se troca mi hoja de diskusyón',
-'tog-enotifminoredits' => 'También mandarme un e-mail (una letra elektronika) por los trocamientos chiquiticos de las hojas',
-'tog-enotifrevealaddr' => 'Amostrar mi addresso de e-mail (letra elektronika) en los e-mailes de aviso',
-'tog-shownumberswatching' => 'Amostrar el número de usadores que la cudian',
-'tog-oldsig' => 'Prēvizibbilizasyón de la firma que ya egziste:',
-'tog-fancysig' => 'Tratar la firma como si era vikiteksto (sin un link otomatik)',
-'tog-externaleditor' => 'Usar un ēdditor de afuera (sólo por los sabericios, tu bilgisayar/orddênador tiene menester de arreglamientos especiales por esto)',
-'tog-externaldiff' => "Usar un ''diff'' de afuera (sólo por los sabericios, tu bilgisayar/orddênador tiene menester de arreglamientos especiales por esto)",
-'tog-ccmeonemails' => 'Las copias de las letras electrónicas que mandí a otros usuarios, ¡Mándamelas!',
-'tog-diffonly' => 'No mostres el contenido de las hojas debaxo de las diferencias.',
-'tog-showhiddencats' => 'Amostrár kategorías eskondidas',
-
-'underline-always' => 'Siempre',
-'underline-never' => 'Nunka',
+'tog-underline' => 'Suliñar los atamientos:',
+'tog-highlightbroken' => 'Amostrar los artícůlos vazíos <a href="" class="new">en colorado</a> , (si no: este modo<a href="" class="internal">?</a>).',
+'tog-justify' => 'Arrimar los paraggrafos de dos vandas',
+'tog-hideminor' => 'Esconder los trocamientos chiquiticos entre los trocamientos freskos',
+'tog-hidepatrolled' => 'Esconder los trocamientos surveyados entre los trocamientos freskos',
+'tog-newpageshidepatrolled' => 'Esconder las hojas surveyadas entre la lista de las hojas muevas',
+'tog-extendwatchlist' => 'Anchar mi lista de akavidamiento afín de amostrar todos los trocamientos, no sólo los muevos',
+'tog-usenewrc' => 'Usar el modo adelantado (JavaScript es menester)',
+'tog-numberheadings' => 'Numerotar otomatika mente los títůlos de los capítůlos',
+'tog-showtoolbar' => 'Amostrar el chibuk de aparatos (JavaScript es menester)',
+'tog-editondblclick' => 'Trocar las hojas con doble klik (JavaScript es menester)',
+'tog-editsection' => 'Ofrir la possibilidad de trocar los capítůlos gracias al atamiento [trocar]',
+'tog-editsectiononrightclick' => 'Pueder trocar los capítůlos, en pizando el botón derecho del ratón encima del títůlo (JavaScript es menester)',
+'tog-showtoc' => 'Amostrar el cuadro de contenidos (para las hojas que tienen más de 3 títůlos de capítůlos)',
+'tog-rememberpassword' => 'Acordarse de mi nombre de usador y de mi kóddiche en este navigador (a lo más muńcho $1 {{PLURAL:$1|día|días}})',
+'tog-watchcreations' => 'Akavidar las hojas que crîo',
+'tog-watchdefault' => 'Akavidar las hojas que troco',
+'tog-watchmoves' => 'Akavidar las hojas que taxireo',
+'tog-watchdeletion' => 'Akavidar las hojas que efasso',
+'tog-minordefault' => 'Ir marcando todos los trocamientos como chiquiticos',
+'tog-previewontop' => 'Amostar el previsteo enriva el cuadro de trocamiento',
+'tog-previewonfirst' => 'Amostar el previsteo al primer trocamiento',
+'tog-nocache' => 'Desaktivar la kaxé de las hojas del navigador',
+'tog-enotifwatchlistpages' => 'Mandarme una letral (e-mail) cada vez que trocan la una hoja de mi lista de akavidamiento',
+'tog-enotifusertalkpages' => 'Mandarme una letral (e-mail) cuando mi hoja de diskusyón se troca',
+'tog-enotifminoredits' => 'También mandarme una letral (e-mail) cuando i trocamientos chiquiticos acontecen en las hojas',
+'tog-enotifrevealaddr' => 'Amostrar mi adresso de letral (e-mail) en las letrales de avizo',
+'tog-shownumberswatching' => 'Amostrar el karar de usadores que están akavidando cada hoja',
+'tog-oldsig' => 'Previsteo de la firma presente',
+'tog-fancysig' => 'Tratar la firma como un vikiteksto (sin un atamiento otomatiko)',
+'tog-externaleditor' => 'Ir usando un ēdditor esterno (sólo es para usadores adelantados; tiene menester de arreglamientos especiales en vuestro contador [http://www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
+'tog-externaldiff' => 'Ir usando un comparador (diff) esterno (sólo es para usadores adelantados; tiene menester de arreglamientos especiales en vuestro contador [http://www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
+'tog-showjumplinks' => 'Aktivar los atamientos de ayudo "Saltar a"',
+'tog-uselivepreview' => 'Usar el "previsteo bivo" (JavaScript es menester) (eksperimental)',
+'tog-forceeditsummary' => 'Avizarme cuando dexo el somaryo vazío',
+'tog-watchlisthideown' => 'Esconder mis trocamientos en mi lista de akavidamiento',
+'tog-watchlisthidebots' => 'Esconder trocamientos de bot en mi lista de akavidamiento',
+'tog-watchlisthideminor' => 'Esconder trocamientos chiquiticos en mi lista de akavidamiento',
+'tog-watchlisthideliu' => 'Esconder trocamientos de los usadores enrejistrados en mi lista de akavidamiento',
+'tog-watchlisthideanons' => 'Esconder trocamientos de los usadores anÅnimes en mi lista de akavidamiento',
+'tog-watchlisthidepatrolled' => 'Esconder trocamientos surveyados en mi lista de akavidamiento',
+'tog-ccmeonemails' => 'Mandarme copias de las letrales (e-mail) que mando a otros usadores',
+'tog-diffonly' => 'No amostrar el contenido de la hoja debaxo las diffes (diferencias entre los trocamientos)',
+'tog-showhiddencats' => 'Amostrar las katēggorías escondidas',
+'tog-norollbackdiff' => 'No amostrar la diff doeśpués de aboltar',
+
+'underline-always' => 'Siempre',
+'underline-never' => 'Nunca',
+'underline-default' => 'Que dessidde el navigador',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'Modo de tipografía de la rējión de trocamiento',
+'editfont-default' => 'Modo supozado del navigador',
+'editfont-monospace' => 'Tipografía que cuvre lugar fikso',
+'editfont-sansserif' => 'Tipografía sans-serif',
+'editfont-serif' => 'Tipografía serif',
# Dates
'sunday' => 'Aljhad',
'monday' => 'Lunes',
'tuesday' => 'Martes',
'wednesday' => 'Miércoles',
-'thursday' => 'Jugüeves',
+'thursday' => 'JuÄŸeves',
'friday' => 'Viernes',
-'saturday' => 'Xabbat',
+'saturday' => 'Xabat',
'sun' => 'Alj',
'mon' => 'Lun',
'tue' => 'Mar',
@@ -75,36 +245,36 @@ $messages = array(
'fri' => 'Vie',
'sat' => 'Xab',
'january' => 'Enero',
-'february' => 'Febrero',
+'february' => 'Fevrero',
'march' => 'Março',
'april' => 'Abril',
'may_long' => 'Mayo',
'june' => 'Junio',
-'july' => 'Julio',
+'july' => 'Jullo',
'august' => 'Agosto',
'september' => 'Setiembre',
-'october' => 'Octubre',
+'october' => 'Octuvre',
'november' => 'Noviembre',
'december' => 'Deziembre',
-'january-gen' => 'de Januario',
-'february-gen' => 'de Februario',
-'march-gen' => 'de Março',
-'april-gen' => 'de Avril',
-'may-gen' => 'de Mayo',
-'june-gen' => 'de Junio',
-'july-gen' => 'de Julyo',
-'august-gen' => 'de Agosto',
-'september-gen' => 'de Septiembre',
-'october-gen' => 'de Octubre',
-'november-gen' => 'de Noviembre',
-'december-gen' => 'de Diziembre',
-'jan' => 'Jan',
-'feb' => 'Feb',
+'january-gen' => 'Enero',
+'february-gen' => 'Fevrero',
+'march-gen' => 'Março',
+'april-gen' => 'Abril',
+'may-gen' => 'Mayo',
+'june-gen' => 'Junio',
+'july-gen' => 'Jullo',
+'august-gen' => 'Agosto',
+'september-gen' => 'Setiembre',
+'october-gen' => 'Octuvre',
+'november-gen' => 'Noviembre',
+'december-gen' => 'Deziembre',
+'jan' => 'Ene',
+'feb' => 'Fev',
'mar' => 'Mar',
'apr' => 'Abr',
'may' => 'May',
'jun' => 'Jun',
-'jul' => 'Jul',
+'jul' => 'Jull',
'aug' => 'Ago',
'sep' => 'Set',
'oct' => 'Oct',
@@ -112,107 +282,116 @@ $messages = array(
'dec' => 'Dez',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
-'category_header' => 'Artícůlos en la kateggoría "$1"',
-'subcategories' => 'Subcategorías',
-'category-media-header' => 'Archivos multimedia en la kategoría "$1"',
-'category-empty' => "''La kategoría no kontiene aktualmente ningún artikolo o archivo multimedia''",
-'hidden-categories' => '{{PLURAL:$1|Categoría escondida|Categorías escondidas}}',
-'hidden-category-category' => 'Categorías escondidas',
-'category-subcat-count' => '{{PLURAL:$2|Esta categoría contiene solamente la categoría venidera.|Esta categoría contiene {{PLURAL:$1|las categorías venideras|$1 subcategorías venideras}}, de un total de $2 subcategorías.}}',
-'category-article-count' => '{{PLURAL:$2|Esta categoría contiene solamente la hoja venidera.|{{PLURAL:$1|La hoja venidera apartiene|Las $1 hojas venideras apartienen}} a esta categoría, de un total de $2.}}',
-'listingcontinuesabbrev' => 'cont.',
+'pagecategories' => '{{PLURAL:$1|Katēggoría|Katēggorías}}',
+'category_header' => 'Artícůlos en la katēggoría "$1"',
+'subcategories' => 'Baxo-katēggorías',
+'category-media-header' => 'Arxivos de multimedya en la katēggoría "$1"',
+'category-empty' => "''Esta katēggoría oy día, no contiene ni artícůlos ni arxivos de multimedya''",
+'hidden-categories' => '{{PLURAL:$1|Katēggoría escondida|Katēggorías escondidas}}',
+'hidden-category-category' => 'Katēggorías escondidas',
+'category-subcat-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo una baxo-katēggoría:|Esta katēggoría contiene {{PLURAL:$1|esta baxo-katēggoría aquí abaxo|$1 baxo-katēggorías aquí abaxo}}, de un total de $2 baxo-katēggorías:}}',
+'category-subcat-count-limited' => 'Esta katēggoría contiene {{PLURAL:$1|la baxo-katēggoría venidera|$1 baxo-katēggorías venideras}}.',
+'category-article-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo la hoja venidera.|{{PLURAL:$1|La hoja venidera apartiene|Las $1 hojas venideras apartienen}} a esta katēggoría, de un total de $2.}}',
+'category-article-count-limited' => '{{PLURAL:$1|La hoja venidera apartiene|Las $1 hojas venideras apartienen}} a esta katēggoría.',
+'category-file-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo la dosya venidera.|{{PLURAL:$1|La dosya venidera apartiene|Las $1 dosyas venideras apartienen}} a esta katēggoría, de un total de $2.}}',
+'category-file-count-limited' => '{{PLURAL:$1|La dosya venidera apartiene|Las $1 dosyas venideras apartienen}} a esta katēggoría.',
+'listingcontinuesabbrev' => 'cont.',
+'index-category' => 'Hojas arregladas en lista',
+'noindex-category' => 'Hojas no arregladas en lista',
+
+'mainpagetext' => "'''MedyaViki ya se kureó con reuxitá.'''",
+'mainpagedocfooter' => 'Konsulta la [http://meta.wikimedia.org/wiki/Ayudo:Contenido Guía de usador] para tomar enformasyones encima de como usar el lojikal viki.
+
+== En Empeçando ==
+* [http://www.mediawiki.org/wiki/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]
+* [http://www.mediawiki.org/wiki/Manual:FAQ/lad DDS de MedyaViki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]',
'about' => 'Encima de',
-'article' => 'Artícůlo',
-'newwindow' => '(Se avre en una ventana nueva)',
-'cancel' => 'Suprimir',
-'moredotdotdot' => 'Mas...',
+'article' => 'Artícůlo de contenido',
+'newwindow' => '(Se avre en una mueva ventana)',
+'cancel' => 'Anular',
+'moredotdotdot' => 'Más...',
'mypage' => 'Mi hoja',
'mytalk' => 'Mi diskusyón',
-'anontalk' => 'Diskusion para esta IP',
-'navigation' => 'Passeo',
-'and' => '&#32;i',
+'anontalk' => 'Diskusyón para este adresso de IP',
+'navigation' => 'Navigación',
+'and' => '&#32;y',
# Cologne Blue skin
-'qbfind' => 'Topa',
-'qbbrowse' => 'Navêga',
-'qbedit' => 'Troca',
-'qbpageoptions' => 'Opciones de la hoja',
-'qbmyoptions' => 'Mis opsiones',
-'qbspecialpages' => 'Pajinas espesiales',
-'faq' => 'FAQ',
-'faqpage' => 'Project:FAQ',
+'qbfind' => 'Topar',
+'qbbrowse' => 'Navigar',
+'qbedit' => 'Trocar',
+'qbpageoptions' => 'Esta hoja',
+'qbpageinfo' => 'Enformasyón de hoja',
+'qbmyoptions' => 'Mis hojas',
+'qbspecialpages' => 'Hojas especiales',
+'faq' => 'DDS',
+'faqpage' => 'Project:DDS',
# Vector skin
-'vector-action-delete' => 'Efassa',
-'vector-action-move' => 'Taxirea',
-'vector-action-protect' => 'Guarda',
-'vector-namespace-category' => 'Kateggoría',
-'vector-namespace-help' => 'Hoja de ayudo',
-'vector-namespace-image' => 'Dosya',
-'vector-namespace-main' => 'Hoja',
-'vector-namespace-media' => 'Hoja de multimedya',
-'vector-namespace-mediawiki' => 'Noticia',
-'vector-namespace-project' => 'Hoja de proyecto',
-'vector-namespace-special' => 'Hoja especial',
-'vector-namespace-talk' => 'Diskussión',
-'vector-namespace-template' => 'Xabblón',
-'vector-namespace-user' => 'Hoja de empleador',
-'vector-view-create' => 'Cria',
-'vector-view-edit' => 'Troca',
-'vector-view-history' => 'Ve la istoria',
-'vector-view-view' => 'Melda',
-'vector-view-viewsource' => 'Ve su orijín',
-'actions' => 'Acciones',
-'namespaces' => 'Espacios de nombres',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Àjustar sujeto',
+'vector-action-delete' => 'Efassar',
+'vector-action-move' => 'Taxirear',
+'vector-action-protect' => 'Guardar',
+'vector-action-undelete' => 'Traër atrás',
+'vector-action-unprotect' => 'No guardar',
+'vector-simplesearch-preference' => 'Aktivar consejos de búsqueda adelantada (sólo pelejo Vector)',
+'vector-view-create' => 'Crîar',
+'vector-view-edit' => 'Trocar',
+'vector-view-history' => 'Ver la îstoria',
+'vector-view-view' => 'Meldar',
+'vector-view-viewsource' => 'Ver su manadero',
+'actions' => 'Acciones',
+'namespaces' => 'Espacios de nombres',
+'variants' => 'Variantes',
'errorpagetitle' => 'Yerro',
'returnto' => 'Tornar a $1.',
'tagline' => 'De {{SITENAME}}',
'help' => 'Ayudo',
-'search' => 'Busca',
+'search' => 'Búsqueda',
'searchbutton' => 'Busca',
'go' => 'Vate',
'searcharticle' => 'Vate',
-'history' => 'La istoria de la hoja',
-'history_short' => 'Istoria',
-'info_short' => 'Enformación',
-'printableversion' => 'Vista apropiada para imprimir',
-'permalink' => 'Link mantenido',
-'print' => 'Imprimír',
-'edit' => 'Troca',
-'create' => 'Cria',
-'editthispage' => 'Troca esta hoja',
-'create-this-page' => 'Cria esta hoja',
-'delete' => 'Efassa',
-'deletethispage' => 'Efassa esta hoja',
-'undelete_short' => 'Abolta $1 {{PLURAL:$1|trocamientos|trocamientos}}',
-'protect' => 'Abriga',
-'protect_change' => 'Troca el abrigamiento',
-'protectthispage' => 'Abriga esta hoja',
-'unprotect' => 'Desabriga',
-'unprotectthispage' => 'Desabriga esta hoja',
-'newpage' => 'Hoja nueva',
-'talkpage' => 'Diskute la hoja',
+'history' => 'La îstoria de la hoja',
+'history_short' => 'ÃŽstoria',
+'updatedmarker' => 'trocado desde mi visita de alcavo',
+'info_short' => 'Enformasyón',
+'printableversion' => 'Vista apropiada para emprimir',
+'permalink' => 'Atamiento mantenido',
+'print' => 'Emprimir',
+'edit' => 'Trocar',
+'create' => 'Crîar',
+'editthispage' => 'Trocar esta hoja',
+'create-this-page' => 'Crîar esta hoja',
+'delete' => 'Efassar',
+'deletethispage' => 'Efassar esta hoja',
+'undelete_short' => 'Traër atrás $1 {{PLURAL:$1|trocamientos|trocamientos}}',
+'protect' => 'Guardar',
+'protect_change' => 'Trocar el guardadijo',
+'protectthispage' => 'Guardar esta hoja',
+'unprotect' => 'No guardar',
+'unprotectthispage' => 'No guardar esta hoja',
+'newpage' => 'Hoja mueva',
+'talkpage' => 'Diskutir la hoja',
'talkpagelinktext' => 'Messaje',
'specialpage' => 'Hoja Especial',
'personaltools' => 'Aparatos personales',
-'postcomment' => 'Ajusta un comentario',
-'articlepage' => 'Ve el artícůlo',
+'postcomment' => 'Capítůlo muevo',
+'articlepage' => 'Ver el artícůlo de contenido',
'talk' => 'Diskusyón',
-'views' => 'Vista',
-'toolbox' => 'Caxa de Aparatos',
-'userpage' => 'Ve la hoja del empleador',
-'projectpage' => 'Mira la hoja del prodjekto',
-'imagepage' => 'Mira la hoja de la dosya',
-'mediawikipage' => 'Mostra la hoja de message',
-'templatepage' => 'Ver la hoja del xabblón',
+'views' => 'Vistas',
+'toolbox' => 'Cuadro de Aparatos',
+'userpage' => 'Ver la hoja del usador',
+'projectpage' => 'Ver la hoja del projeto',
+'imagepage' => 'Ver la hoja de la dosya',
+'mediawikipage' => 'Ver la hoja de messaje',
+'templatepage' => 'Ver la hoja del xablón',
'viewhelppage' => 'Ver la hoja de ayudo',
-'categorypage' => 'Mostra la hoja de kateggoría',
-'viewtalkpage' => 'Ver diskusion',
-'otherlanguages' => 'En otras linguas',
+'categorypage' => 'Ver la hoja de la katēggoría',
+'viewtalkpage' => 'Ver la diskusyón',
+'otherlanguages' => 'En otras lînguas',
'redirectedfrom' => '(Redirigido desde $1)',
'redirectpagesub' => 'Hoja redirigida',
'lastmodifiedat' => 'Esta hoja fue trocada por la última vez en $2, a las $1.',
@@ -226,15 +405,15 @@ $messages = array(
'aboutpage' => 'Project:Encima de',
'copyright' => 'El contenido se puede topar debaxo de la <i>$1</i>',
'copyrightpage' => '{{ns:project}}:Derechos de autor',
-'currentevents' => 'Aktualidad',
-'currentevents-url' => 'Project:Aktualidad',
-'disclaimers' => 'Rēfusamiento de responsabbilitá',
+'currentevents' => 'Novedades',
+'currentevents-url' => 'Project:Novedades',
+'disclaimers' => 'Refuso de responsabbilitá',
'disclaimerpage' => 'Project:Rēfusamiento de responsabbilitá general',
-'edithelp' => '¿Cómodo se la troca?',
+'edithelp' => '¿Cómo se la troca?',
'edithelppage' => 'Help:Una hoja, ¿cómodo se la troca?',
'helppage' => 'Help:Contenidos',
'mainpage' => 'La Primera Hoja',
-'mainpage-description' => 'La Hoja Primera',
+'mainpage-description' => 'La Primera Hoja',
'policy-url' => 'Project:Politikas',
'portal' => 'Portal de la comunidad',
'portal-url' => 'Project:Portal de la comunidad',
@@ -251,8 +430,9 @@ $messages = array(
'youhavenewmessagesmulti' => 'Tienes messajes nuevos en $1',
'editsection' => 'troca',
'editold' => 'trocar',
+'viewsourceold' => 'Ver su manadero',
'editlink' => 'trocar',
-'viewsourcelink' => 'Ve el origín',
+'viewsourcelink' => 'Ver su manadero',
'editsectionhint' => 'Troca la parte: $1',
'toc' => 'Contenidos',
'showtoc' => 'Amostrar',
@@ -300,7 +480,7 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
# Login and logout pages
'yourname' => 'Su nombre de usuario',
'yourpassword' => 'Parola',
-'remembermypassword' => 'Quero que se me acorden entre sessiones.',
+'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
'login' => 'Entrar',
'nav-login-createaccount' => 'Entrar / Enrejjistrar',
'userlogin' => 'Entrar / Registrarse',
@@ -310,6 +490,7 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
'nologinlink' => 'Crea un cuento',
'createaccount' => 'Crea un nuevo cuento',
'gotaccount' => "¿Ya tienes un cuento? '''$1'''.",
+'gotaccountlink' => 'Entrar',
'createaccountmail' => 'por una letra electrónica',
'userexists' => 'El nombre que entrates ya se usa.
Si puede ser, escoge un otro nombre.',
@@ -345,7 +526,7 @@ Si puede ser, escoge un otro nombre.',
'subject' => 'Tema/título:',
'minoredit' => 'Esta es una edición chiquitica',
'watchthis' => 'Cudia esta hoja',
-'savearticle' => 'Enrejjistra la hoja',
+'savearticle' => 'Enrejistra la hoja',
'preview' => 'Previsualizar',
'showpreview' => 'Mostrar la previsualización',
'showdiff' => 'Amostrar los trocamientos',
@@ -365,6 +546,9 @@ Si venites aquí por yerro, torna a la hoja de antes.',
Puedes [[Special:Search/{{PAGENAME}}|buscar el título de esta hoja]] en otras hojas,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros],
o [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
+'noarticletext-nopermission' => 'No ay teksto oy día en esta hoja.
+Puedes [[Special:Search/{{PAGENAME}}|buscar este títůlo de hoja]] en otras hojas,
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rejistros relasyonados]</span>.',
'note' => "'''Nota:'''",
'previewnote' => "'¡Acórdate que esto es sólo una previsualización y daínda no se registró!'''",
'editing' => 'Trocando $1',
@@ -380,6 +564,11 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
'nocreate-loggedin' => 'No tienes el permisso de creas hojas nuevas.',
'permissionserrorstext-withaction' => 'No tienes el permiso para $2, por las {{PLURAL:$1|razón|razones}} venideras:',
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Aviso: El boy de los xablones en la hoja es muy grande.
+Algunos xablones no serán incluidos.',
+'post-expand-template-inclusion-category' => 'Hojas con sovrecarga de xablones',
+
# History pages
'viewpagelogs' => 'Ver los registros de esta hoja',
'currentrev-asof' => 'Versión de alcabo de $1',
@@ -410,6 +599,8 @@ Leyenda: (act) = diferencias con la versión actual,
'revdelete-radio-unset' => 'No',
'revdelete-log' => 'Razón:',
'revdel-restore' => 'Troca la viźibbilidad',
+'revdel-restore-deleted' => 'revisiones efassadas',
+'revdel-restore-visible' => 'revisiones visibles',
'revdelete-content' => 'contenido',
'revdelete-reasonotherlist' => 'Otra razón',
@@ -427,43 +618,54 @@ Leyenda: (act) = diferencias con la versión actual,
'editundo' => 'deshazer',
# Search results
-'searchresults' => 'Resultados de la búsqueda',
-'searchresults-title' => 'Resultados de la búsqueda de «$1»',
-'searchresulttext' => 'Para saber más encima de buscar en {{SITENAME}}, mira la [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Buscates \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|todas las hojas que empeçan con "$1"]] {{int:pipe-separator}} [[Special:WhatLinksHere/$1|todas las hojas que dan link a «$1»]])',
-'searchsubtitleinvalid' => "Buscates '''$1'''",
-'notitlematches' => 'No se pudo topar en dingún título.',
-'notextmatches' => 'No se pudo topar en dinguna hoja.',
-'prevn' => '{{PLURAL:$1|$1}} de antes',
-'nextn' => '{{PLURAL:$1|$1}} venideras',
-'prevn-title' => '$1 {{PLURAL:$1|resultado|resultados}} de antes',
-'nextn-title' => 'Venideros $1 {{PLURAL:$1|resultado|resultados}}',
-'shown-title' => 'Mostra $1 {{PLURAL:$1|resultado|resultados}} por hoja',
-'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:Ayudo',
-'searchprofile-everything' => 'Todo',
-'searchprofile-advanced' => 'Adelantado',
-'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
-'search-redirect' => '(rēdirijjado desde $1)',
-'search-section' => '(seksyón $1)',
-'search-suggest' => 'Quisites dezir: $1',
-'search-interwiki-caption' => 'Proyectos hermanos',
-'search-interwiki-default' => 'Los resultados de $1:',
-'search-interwiki-more' => '(más)',
-'search-mwsuggest-enabled' => 'con consejos',
-'search-mwsuggest-disabled' => 'no ay consejos',
-'searchall' => 'todos',
-'nonefound' => "'''Nota''': Por defecto sólo se busca en algunos espacios de nombre.
+'searchresults' => 'Resultados de la búsqueda',
+'searchresults-title' => 'Resultados de la búsqueda de «$1»',
+'searchresulttext' => 'Para saber más encima de buscar en {{SITENAME}}, mira la [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Buscates \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|todas las hojas que empeçan con "$1"]] {{int:pipe-separator}} [[Special:WhatLinksHere/$1|todas las hojas que dan link a «$1»]])',
+'searchsubtitleinvalid' => "Buscates '''$1'''",
+'notitlematches' => 'No se pudo topar en dingún título.',
+'notextmatches' => 'No se pudo topar en dinguna hoja.',
+'prevn' => '{{PLURAL:$1|$1}} de antes',
+'nextn' => '{{PLURAL:$1|$1}} venideras',
+'prevn-title' => '$1 {{PLURAL:$1|resultado|resultados}} de antes',
+'nextn-title' => 'Venideros $1 {{PLURAL:$1|resultado|resultados}}',
+'shown-title' => 'Mostra $1 {{PLURAL:$1|resultado|resultados}} por hoja',
+'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-new' => "'''Crîar la hoja «[[:$1]]» en esta viki!'''",
+'searchhelp-url' => 'Help:Ayudo',
+'searchprofile-articles' => 'Hojas de contenido',
+'searchprofile-project' => 'Hojas de ayudo y de projeto',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Todo',
+'searchprofile-advanced' => 'Adelantado',
+'searchprofile-articles-tooltip' => 'Buscar en $1',
+'searchprofile-project-tooltip' => 'Buscar en $1',
+'searchprofile-images-tooltip' => 'Buscar arxivos',
+'searchprofile-everything-tooltip' => 'Buscar en todo el contenido (i hojas de diskusyón)',
+'searchprofile-advanced-tooltip' => 'Buscar en espacios de nombres personalizados',
+'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
+'search-redirect' => '(rēdirijjado desde $1)',
+'search-section' => '(seksyón $1)',
+'search-suggest' => 'Quisites dezir: $1',
+'search-interwiki-caption' => 'Proyectos hermanos',
+'search-interwiki-default' => 'Los resultados de $1:',
+'search-interwiki-more' => '(más)',
+'search-mwsuggest-enabled' => 'con consejos',
+'search-mwsuggest-disabled' => 'no ay consejos',
+'searchall' => 'todos',
+'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
+'nonefound' => "'''Nota''': Por defecto sólo se busca en algunos espacios de nombre.
Proba a usar el prefixo ''all:'' para buscar en todo el contenido (incluyendo las hojas de diskussión, xabblones, etc.) o usa el espacio de nombre que queres como prefixo. También puedes usar el formulario de búsqueda adelantada que aparece abaxo.
Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de», que no están en el índice, o por especificar más de una palabra a buscar (sólo las hojas que contienen todos los términos de búsqueda van aparecer en el resultado).",
-'powersearch' => 'Búsqueda adelantada',
-'powersearch-legend' => 'Búsqueda adelantada',
-'powersearch-ns' => 'Busca en los espacios de nombres:',
-'powersearch-redir' => 'Mostra las redirecciones',
-'powersearch-field' => 'Busca por',
-'powersearch-toggleall' => 'Todos',
-'search-external' => 'Búsqueda eksterna',
+'search-nonefound' => 'No ay resultados que acumplan los criterios de la búsqueda.',
+'powersearch' => 'Búsqueda adelantada',
+'powersearch-legend' => 'Búsqueda adelantada',
+'powersearch-ns' => 'Busca en los espacios de nombres:',
+'powersearch-redir' => 'Mostra las redirecciones',
+'powersearch-field' => 'Busca por',
+'powersearch-toggleall' => 'Todos',
+'search-external' => 'Búsqueda eksterna',
# Preferences page
'preferences' => 'Preferencias',
@@ -484,6 +686,7 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
'timezoneregion-europe' => 'Europa',
'youremail' => 'El adderesso de tu letra electrÏŒnica:',
'username' => 'Nombre de usuario:',
+'yourrealname' => 'Nombre verdadero:',
'yourlanguage' => 'Lingua:',
'email' => 'Letra electrónica',
@@ -506,10 +709,11 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|trocamiento|trocamientos}}',
-'recentchanges' => 'Trocamientos frescos',
+'recentchanges' => 'Trocamientos freskos',
'recentchanges-legend' => 'Opciones encima de los trocamientos frescos',
'recentchangestext' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
'recentchanges-feed-description' => 'Perseguir los trocamientos más nuevos en el viki en este feed.',
+'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
'rcnote' => "Debaxo {{PLURAL:$1|ay '''1''' trocamiento realizado|están los dal cabo '''$1''' trocamientos realizados}} en {{PLURAL:$2|el dal cabo día|los dal cabo '''$2''' días}}, hasta el $4, $5.",
'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
'rcshowhideminor' => '$1 trocamientos chiquiticos',
@@ -541,6 +745,7 @@ Las hojas en tu [[Special:Watchlist|lista de escogidas]] son escritas '''gordas'
# Upload
'upload' => 'Cargar una dosya',
'uploadlogpage' => 'Subidas de arxivos',
+'filedesc' => 'Somario',
'uploadedimage' => 'subió «[[$1]]»',
# Special:ListFiles
@@ -561,10 +766,12 @@ Las hojas en tu [[Special:Watchlist|lista de escogidas]] son escritas '''gordas'
'imagelinks' => 'Linkes al arxivo multimedia',
'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a este arxivo:',
'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
+'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
+La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
'uploadnewversion-linktext' => 'Subir una nueva versión de este arxivo',
# Random page
-'randompage' => 'Página por ventura',
+'randompage' => 'Kualunke hoja',
# Statistics
'statistics' => 'Estatísticas',
@@ -619,8 +826,7 @@ Las hojas en tu [[Special:Watchlist|lista de escogidas]] son escritas '''gordas'
# Watchlist
'watchlist' => 'Mi lista de escogidas',
-'mywatchlist' => 'Mi lista de escogidas',
-'watchlistfor' => "(para '''$1''')",
+'mywatchlist' => 'Mi lista de akavidamientos',
'addedwatch' => 'Ajustado a la lista de escogidas',
'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
@@ -686,6 +892,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
# Undelete
'undeletelink' => 've/restora',
+'undeleteviewlink' => 'Ver',
'undeletedarticle' => 'restoró «[[$1]]»',
# Namespace form on various pages
@@ -728,7 +935,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
# Block/unblock
'blockip' => 'Bloquear usuario',
'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite',
-'ipblocklist' => 'Lista de direcciones IP y nombres de usuario bloqueadas',
+'ipblocklist' => 'Usadores bloqueados',
'blocklink' => 'Bloquea',
'unblocklink' => 'quita el bloqueo',
'change-blocklink' => 'troca el bloqueo',
@@ -768,8 +975,8 @@ Si puede ser, escoge otro nombre.',
'talkexists' => 'La hoja fue renombrada con reuxito, ma la diskussión no se pudo renombrar porque ya egziste una en el título nuevo. Si puede ser, házelo manualmente.',
'movedto' => 'renombrado a',
'movetalk' => 'Renombrar la hoja de diskussión también, si es possible.',
-'1movedto2' => 'El nuevo nombre de la hoja [[$1]]; agora es [[$2]]',
-'1movedto2_redir' => 'El títůlo [[$1]] fue reddireksyonado a la hoja [[$2]]',
+'1movedto2' => 'El muevo nombre de la hoja [[$1]]; ya es [[$2]]',
+'1movedto2_redir' => '[[$1]] fue taxireado a [[$2]] sovre una direksión',
'movelogpage' => 'Registro de traslados',
'movereason' => 'Razón:',
'revertmove' => 'abolta',
@@ -808,6 +1015,7 @@ Si puede ser, usa el botón de prēviźualiźasyón antes de enrejjistrarla.',
'tooltip-search' => 'Busca en {{SITENAME}}',
'tooltip-search-go' => 'Si ay una hoja con este nombre egzakto, vate allá.',
'tooltip-search-fulltext' => 'Busca este teksto en las hojas',
+'tooltip-p-logo' => 'Visita la Primera Hoja',
'tooltip-n-mainpage' => 'Torna a la Hoja Primera',
'tooltip-n-mainpage-description' => 'Visita la Primera Hoja',
'tooltip-n-portal' => 'Encima del prodjekto, ¿qué se puede hazer i ánde topar todo?',
@@ -841,6 +1049,7 @@ Si puede ser, usa el botón de prēviźualiźasyón antes de enrejjistrarla.',
'tooltip-rollback' => '«Aboltar» abolta todas los trocamientos del empleador de alcabo solo klikando una vez.',
'tooltip-undo' => '«Deshazer» revierte la edición seleccionada y avre la hoja de edición en el modo de previsualización.
Permite ajustar una razón al resumen de edición.',
+'tooltip-summary' => 'Entrar un somaryo curto',
# Attribution
'anonymous' => '{{PLURAL:$1|Uzuario anonimo|Uzuarios anonimos}} de {{SITENAME}}',
@@ -850,9 +1059,9 @@ Permite ajustar una razón al resumen de edición.',
'nextdiff' => 'Edición más nueva →',
# Media information
-'file-info-size' => '($1 × $2 píkseles; boy del arxivo: $3; tipo MIME: $4)',
+'file-info-size' => '$1 × $2 píkseles; boy del arxivo: $3; tipo MIME: $4',
'file-nohires' => '<small>No disponible a mayor resolución.</small>',
-'svg-long-desc' => '(arxivo SVG, nominalmente $1 × $2 píkseles, boy del arxivo: $3)',
+'svg-long-desc' => 'arxivo SVG, nominalmente $1 × $2 píkseles, boy del arxivo: $3',
'show-big-image' => 'Resolución original',
'show-big-image-thumb' => '<small>Boy de esta vista previa: $1 × $2 píkseles</small>',
@@ -952,4 +1161,7 @@ Los otros campos se van a guardar por defecto.
# Special:SpecialPages
'specialpages' => 'Hojas especiales',
+# Special:Tags
+'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
+
);
diff --git a/languages/messages/MessagesLb.php b/languages/messages/MessagesLb.php
index 46a16481..329e8c96 100644
--- a/languages/messages/MessagesLb.php
+++ b/languages/messages/MessagesLb.php
@@ -9,6 +9,7 @@
*
* @author Kaffi
* @author Les Meloures
+ * @author Purodha
* @author Reedy
* @author Robby
* @author Urhixidur
@@ -42,101 +43,123 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Duebel Viruleedungen' ),
- 'BrokenRedirects' => array( 'Futtis Viruleedungen' ),
+ 'DoubleRedirects' => array( 'Duebel_Viruleedungen' ),
+ 'BrokenRedirects' => array( 'Futtis_Viruleedungen' ),
'Disambiguations' => array( 'Homonymie' ),
'Userlogin' => array( 'Umellen' ),
'Userlogout' => array( 'Ofmellen' ),
- 'CreateAccount' => array( 'Benotzerkont opmaachen' ),
+ 'CreateAccount' => array( 'Benotzerkont_opmaachen' ),
'Preferences' => array( 'Astellungen' ),
'Watchlist' => array( 'Iwwerwaachungslëscht' ),
- 'Recentchanges' => array( 'Rezent Ännerungen' ),
+ 'Recentchanges' => array( 'Rezent_Ännerungen' ),
'Upload' => array( 'Eroplueden' ),
'Listfiles' => array( 'Billerlëscht' ),
- 'Newimages' => array( 'Nei Biller' ),
- 'Listusers' => array( 'Lëscht vun de Benotzer' ),
- 'Listgrouprights' => array( 'Lëscht vun de Grupperechter' ),
+ 'Newimages' => array( 'Nei_Biller' ),
+ 'Listusers' => array( 'Lëscht_vun_de_Benotzer' ),
+ 'Listgrouprights' => array( 'Lëscht_vun_de_Grupperechter' ),
'Statistics' => array( 'Statistik' ),
- 'Randompage' => array( 'Zoufälleg Säit' ),
+ 'Randompage' => array( 'Zoufälleg_Säit' ),
'Lonelypages' => array( 'Weesesäiten' ),
- 'Uncategorizedpages' => array( 'Säiten ouni Kategorie' ),
- 'Uncategorizedcategories' => array( 'Kategorien ouni Kategorie' ),
- 'Uncategorizedimages' => array( 'Biller ouni Kategorie' ),
- 'Uncategorizedtemplates' => array( 'Schablounen ouni Kategorie' ),
- 'Unusedcategories' => array( 'Onbenotze Kategorien' ),
- 'Unusedimages' => array( 'Onbenotzte Biller' ),
- 'Wantedpages' => array( 'Gewënschte Säiten' ),
- 'Wantedcategories' => array( 'Gewënschte Kategorien' ),
- 'Wantedfiles' => array( 'Gewënschte Fichieren' ),
- 'Wantedtemplates' => array( 'Gewënschte Schablounen' ),
- 'Mostlinked' => array( 'Dacks verlinkte Säiten' ),
- 'Mostlinkedcategories' => array( 'Dacks benotzte Kategorien' ),
- 'Mostlinkedtemplates' => array( 'Dacks benotzte Schablounen' ),
- 'Mostimages' => array( 'Dacks benotzte Biller' ),
- 'Mostcategories' => array( 'Säite mat de meeschte Kategorien' ),
- 'Mostrevisions' => array( 'Säite mat de meeschten Ännerungen' ),
- 'Fewestrevisions' => array( 'Säite mat de mannsten Ännerungen' ),
- 'Shortpages' => array( 'Kuerz Säiten' ),
- 'Longpages' => array( 'Laang Säiten' ),
- 'Newpages' => array( 'Nei Säiten' ),
- 'Ancientpages' => array( 'Al Säiten' ),
+ 'Uncategorizedpages' => array( 'Säiten_ouni_Kategorie' ),
+ 'Uncategorizedcategories' => array( 'Kategorien_ouni_Kategorie' ),
+ 'Uncategorizedimages' => array( 'Biller_ouni_Kategorie' ),
+ 'Uncategorizedtemplates' => array( 'Schablounen_ouni_Kategorie' ),
+ 'Unusedcategories' => array( 'Onbenotze_Kategorien' ),
+ 'Unusedimages' => array( 'Onbenotzte_Biller' ),
+ 'Wantedpages' => array( 'Gewënschte_Säiten' ),
+ 'Wantedcategories' => array( 'Gewënschte_Kategorien' ),
+ 'Wantedfiles' => array( 'Gewënschte_Fichieren' ),
+ 'Wantedtemplates' => array( 'Gewënschte_Schablounen' ),
+ 'Mostlinked' => array( 'Dacks_verlinkte_Säiten' ),
+ 'Mostlinkedcategories' => array( 'Dacks_benotzte_Kategorien' ),
+ 'Mostlinkedtemplates' => array( 'Dacks_benotzte_Schablounen' ),
+ 'Mostimages' => array( 'Dacks_benotzte_Biller' ),
+ 'Mostcategories' => array( 'Säite_mat_de_meeschte_Kategorien' ),
+ 'Mostrevisions' => array( 'Säite_mat_de_meeschten_Ännerungen' ),
+ 'Fewestrevisions' => array( 'Säite_mat_de_mannsten_Ännerungen' ),
+ 'Shortpages' => array( 'Kuerz_Säiten' ),
+ 'Longpages' => array( 'Laang_Säiten' ),
+ 'Newpages' => array( 'Nei_Säiten' ),
+ 'Ancientpages' => array( 'Al_Säiten' ),
'Deadendpages' => array( 'Sakgaasse-Säiten' ),
- 'Protectedpages' => array( 'Protegéiert Säiten' ),
- 'Protectedtitles' => array( 'Gespaarte Säiten' ),
- 'Allpages' => array( 'All Säiten' ),
+ 'Protectedpages' => array( 'Protegéiert_Säiten' ),
+ 'Protectedtitles' => array( 'Gespaarte_Säiten' ),
+ 'Allpages' => array( 'All_Säiten' ),
'Prefixindex' => array( 'Indexsich' ),
- 'Ipblocklist' => array( 'Lëscht vu gespaarten IPen a Benotzer' ),
+ 'Ipblocklist' => array( 'Lëscht_vu_gespaarten_IPen_a_Benotzer' ),
+ 'Unblock' => array( 'Spär_ophiewen' ),
'Specialpages' => array( 'Spezialsäiten' ),
'Contributions' => array( 'Kontributiounen' ),
- 'Emailuser' => array( 'Dësem Benotzer eng E-Mail schécken' ),
- 'Confirmemail' => array( 'E-Mail confirméieren' ),
- 'Whatlinkshere' => array( 'Linken op dës Säit' ),
- 'Recentchangeslinked' => array( 'Ännerungen op verlinkte Säiten' ),
- 'Movepage' => array( 'Säit réckelen' ),
- 'Blockme' => array( 'Mech spären' ),
- 'Booksources' => array( 'Bicher mat hirer ISBN sichen' ),
+ 'Emailuser' => array( 'Dësem_Benotzer_eng_E-Mail_schécken' ),
+ 'Confirmemail' => array( 'E-Mail_confirméieren' ),
+ 'Whatlinkshere' => array( 'Linken_op_dës_Säit' ),
+ 'Recentchangeslinked' => array( 'Ännerungen_op_verlinkte_Säiten' ),
+ 'Movepage' => array( 'Säit_réckelen' ),
+ 'Blockme' => array( 'Mech_spären' ),
+ 'Booksources' => array( 'Bicher_mat_hirer_ISBN_sichen' ),
'Categories' => array( 'Kategorien' ),
'Export' => array( 'Exportéieren' ),
'Version' => array( 'Versioun' ),
- 'Allmessages' => array( 'All Systemmessagen' ),
+ 'Allmessages' => array( 'All_Systemmessagen' ),
'Log' => array( 'Logbicher' ),
'Blockip' => array( 'Spären' ),
'Undelete' => array( 'Restauréieren' ),
'Import' => array( 'Importéieren' ),
- 'Lockdb' => array( 'Datebank spären' ),
- 'Unlockdb' => array( 'Spär vun der Datebank ophiewen' ),
+ 'Lockdb' => array( 'Datebank_spären' ),
+ 'Unlockdb' => array( 'Spär_vun_der_Datebank_ophiewen' ),
'Userrights' => array( 'Benotzerrechter' ),
- 'MIMEsearch' => array( 'Sich no MIME-Zorten' ),
- 'FileDuplicateSearch' => array( 'Sich no duebele Fichieren' ),
- 'Unwatchedpages' => array( 'Säiten déi net iwwerwaacht ginn' ),
+ 'MIMEsearch' => array( 'Sich_no_MIME-Zorten' ),
+ 'FileDuplicateSearch' => array( 'Sich_no_duebele_Fichieren' ),
+ 'Unwatchedpages' => array( 'Säiten_déi_net_iwwerwaacht_ginn' ),
'Listredirects' => array( 'Viruleedungen' ),
- 'Revisiondelete' => array( 'Versioun läschen' ),
- 'Unusedtemplates' => array( 'Onbenotzte Schablounen' ),
- 'Randomredirect' => array( 'Zoufälleg Viruleedung' ),
- 'Mypage' => array( 'Meng Benotzersäit' ),
- 'Mytalk' => array( 'Meng Diskussiounssäit' ),
- 'Mycontributions' => array( 'Meng Kontributiounen' ),
- 'Listadmins' => array( 'Lëscht vun den Administrateuren' ),
+ 'Revisiondelete' => array( 'Versioun_läschen' ),
+ 'Unusedtemplates' => array( 'Onbenotzte_Schablounen' ),
+ 'Randomredirect' => array( 'Zoufälleg_Viruleedung' ),
+ 'Mypage' => array( 'Meng_Benotzersäit' ),
+ 'Mytalk' => array( 'Meng_Diskussiounssäit' ),
+ 'Mycontributions' => array( 'Meng_Kontributiounen' ),
+ 'Myuploads' => array( 'Meng_eropgeluede_Fichieren' ),
+ 'PermanentLink' => array( 'Permanente_Link' ),
+ 'Listadmins' => array( 'Lëscht_vun_den_Administrateuren' ),
'Listbots' => array( 'Botten' ),
- 'Popularpages' => array( 'Beléifste Säiten' ),
+ 'Popularpages' => array( 'Beléifste_Säiten' ),
'Search' => array( 'Sichen' ),
- 'Resetpass' => array( 'Passwuert zrécksetzen' ),
- 'Withoutinterwiki' => array( 'Säiten ouni Interwiki-Linken' ),
- 'MergeHistory' => array( 'Versiounen zesummeleeën' ),
- 'Filepath' => array( 'Pad bäi de Fichier' ),
- 'Invalidateemail' => array( 'E-Mailadress net confirméieren' ),
- 'Blankpage' => array( 'Eidel Säit' ),
+ 'Resetpass' => array( 'Passwuert_zrécksetzen' ),
+ 'Withoutinterwiki' => array( 'Säiten_ouni_Interwiki-Linken' ),
+ 'MergeHistory' => array( 'Versiounen_zesummeleeën' ),
+ 'Filepath' => array( 'Pad_bäi_de_Fichier' ),
+ 'Invalidateemail' => array( 'E-Mailadress_net_confirméieren' ),
+ 'Blankpage' => array( 'Eidel_Säit' ),
'LinkSearch' => array( 'Weblink-Sich' ),
- 'DeletedContributions' => array( 'Geläschte Kontributiounen' ),
+ 'DeletedContributions' => array( 'Geläschte_Kontributiounen' ),
'Tags' => array( 'Taggen' ),
- 'Activeusers' => array( 'Aktiv Benotzer' ),
+ 'Activeusers' => array( 'Aktiv_Benotzer' ),
+ 'ComparePages' => array( 'Säite_vergkäichen' ),
+ 'Badtitle' => array( 'Net_valabelen_Titel' ),
+ 'DisableAccount' => array( 'Benotzerkont_ausschalten' ),
);
$magicWords = array(
+ 'numberofarticles' => array( '1', 'Artikelen', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Fichieren', 'DATEIANZAHL', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'Benotzerzuel', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'Aktiv_Benotzer', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
+ 'pagename' => array( '1', 'Säitennumm', 'SEITENNAME', 'PAGENAME' ),
+ 'namespace' => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
+ 'subjectspace' => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectpagename' => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'img_right' => array( '1', 'riets', 'rechts', 'right' ),
'img_left' => array( '1', 'lénks', 'links', 'left' ),
+ 'img_none' => array( '1', 'ouni', 'ohne', 'none' ),
'img_center' => array( '1', 'zentréiert', 'zentriert', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'gerummt', 'gerahmt', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'net_gerummt', 'rahmenlos', 'frameless' ),
'img_border' => array( '1', 'bord', 'rand', 'border' ),
+ 'grammar' => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
+ 'plural' => array( '0', 'PLURAL', 'PLURAL:' ),
+ 'formatnum' => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
+ 'special' => array( '0', 'spezial', 'special' ),
+ 'hiddencat' => array( '1', '__VERSTOPPTE_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
);
$messages = array(
@@ -155,8 +178,7 @@ $messages = array(
'tog-editsection' => "Linke fir d'Ännere vun eenzelnen Abschnitter weisen",
'tog-editsectiononrightclick' => 'Eenzel Abschnitter mat Rietsklick änneren (JavaScript)',
'tog-showtoc' => 'Inhaltsverzeechnes weise bei Säite mat méi wéi dräi Iwwerschrëften',
-'tog-rememberpassword' => 'Mäi Passwuert op dësem Computer verhalen',
-'tog-editwidth' => 'Verännerungskëscht iwwer déi ganz Breet vum Ecran weisen',
+'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser(fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
'tog-watchcreations' => 'Säiten déi ech nei uleeën automatesch op meng Iwwerwaachungslëscht setzen',
'tog-watchdefault' => 'Säiten déi ech änneren op meng Iwwerwaachungslëscht setzen',
'tog-watchmoves' => 'Säiten déi ech réckelen automatesch op meng Iwwerwaachungslëscht setzen',
@@ -302,31 +324,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Sujet derbäisetzen',
-'vector-action-delete' => 'Läschen',
-'vector-action-move' => 'Réckelen',
-'vector-action-protect' => 'Spären',
-'vector-action-undelete' => 'Restauréieren',
-'vector-action-unprotect' => 'Spär ophiewen',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Hëllefssäit',
-'vector-namespace-image' => 'Fichier',
-'vector-namespace-main' => 'Säit',
-'vector-namespace-media' => 'Mediesäit',
-'vector-namespace-mediawiki' => 'Message',
-'vector-namespace-project' => 'Projetssäit',
-'vector-namespace-special' => 'Spezialsäit',
-'vector-namespace-talk' => 'Diskussioun',
-'vector-namespace-template' => 'Schabloun',
-'vector-namespace-user' => 'Benotzersäit',
-'vector-view-create' => 'Uleeën',
-'vector-view-edit' => 'Änneren',
-'vector-view-history' => 'Versioune weisen',
-'vector-view-view' => 'Liesen',
-'vector-view-viewsource' => 'Quellcode weisen',
-'actions' => 'Aktiounen',
-'namespaces' => 'Nummraim',
-'variants' => 'Varianten',
+'vector-action-addsection' => 'Sujet derbäisetzen',
+'vector-action-delete' => 'Läschen',
+'vector-action-move' => 'Réckelen',
+'vector-action-protect' => 'Spären',
+'vector-action-undelete' => 'Restauréieren',
+'vector-action-unprotect' => 'Spär ophiewen',
+'vector-simplesearch-preference' => 'Verbessert Sichvirschléi aktiviéieren (nëmme beim Ausgesinn Vector)',
+'vector-view-create' => 'Uleeën',
+'vector-view-edit' => 'Änneren',
+'vector-view-history' => 'Versioune weisen',
+'vector-view-view' => 'Liesen',
+'vector-view-viewsource' => 'Quellcode weisen',
+'actions' => 'Aktiounen',
+'namespaces' => 'Nummraim',
+'variants' => 'Varianten',
'errorpagetitle' => 'Feeler',
'returnto' => 'Zréck op $1.',
@@ -387,6 +399,9 @@ Zevill Benotzer versichen dës Säit ze gesinn.
Waart w.e.g. e bëssen ier Dir versicht dës Säit nach emol opzeruffen.
$1",
+'pool-timeout' => "Timeout bis d'Spär opgehuewen ass",
+'pool-queuefull' => 'Pool-Queue ass voll',
+'pool-errorunknown' => 'Onbekannte Feeler',
# 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}}',
@@ -549,7 +564,8 @@ Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
'yourname' => 'Benotzernumm:',
'yourpassword' => 'Passwuert:',
'yourpasswordagain' => 'Passwuert nach eemol antippen:',
-'remembermypassword' => 'Meng Umeldung op dësem Computer verhalen',
+'remembermypassword' => 'Meng Umeldung op dësem Computer (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
+'securelogin-stick-https' => 'Nom Umelle mat HTTPS verbonn bleiwen',
'yourdomainname' => 'Ären Domain',
'externaldberror' => 'Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.',
'login' => 'Umellen',
@@ -566,6 +582,7 @@ Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
'gotaccount' => "Dir hutt schonn e Benotzerkont? '''$1'''.",
'gotaccountlink' => 'Umellen',
'createaccountmail' => 'Via E-Mail',
+'createaccountreason' => 'Grond:',
'badretype' => 'Är Passwierder stëmmen net iwwerdeneen.',
'userexists' => 'Dëse Benotzernumm gëtt scho benotzt.
Sicht Iech een anere Benotzernumm.',
@@ -589,6 +606,7 @@ Kuckt w.e.g. op d\'Schreifweis richteg ass, oder [[Special:UserLogin/signup|maac
'wrongpasswordempty' => "D'Passwuert dat Dir aginn hutt war eidel. Probéiert w.e.g. nach eng Kéier.",
'passwordtooshort' => 'Passwierder musse mindestens {{PLURAL:$1|1 Zeeche|$1 Zeeche}} laang sinn.',
'password-name-match' => 'Äert Passwuert muss verschidde vun Ärem Benotzernumm sinn.',
+'password-login-forbidden' => "D'Benotze vun dësem Benotzernumm a Passwuert gouf verbueden.",
'mailmypassword' => 'Neit Passwuert per E-Mail kréien',
'passwordremindertitle' => 'Neit Passwuert fir ee {{SITENAME}}-Benotzerkont',
'passwordremindertext' => 'Iergendeen (waarscheinlech Dir, mat der IP-Adress $1) huet en neit Passwuert fir {{SITENAME}} ($4) gefrot. Een temporäert Passwuert fir de Benotzer $2 gouf ugeluecht an et ass: $3. Wann et dat ass, wat Dir wollt, da sollt Dir Iech elo aloggen an en neit Passwuert eraussichen. Äert temporäert Passwuert leeft a(n) {{PLURAL:$5|engem Dag| $5 Deeg}} of.
@@ -626,6 +644,9 @@ Waart w.e.g. ier Dir et nach eng Kéier versicht.",
'loginlanguagelabel' => 'Sprooch: $1',
'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et esou ausgesäit wéi wann se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
+# E-mail sending
+'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Fonctioun',
+
# Password reset dialog
'resetpass' => 'Passwuert änneren',
'resetpass_announce' => 'Dir sidd mat engem temporären , per E-Mail geschéckte Code ageloggt.
@@ -678,9 +699,11 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
'showlivepreview' => 'Live-Kucken ouni ofzespäicheren',
'showdiff' => 'Weis Ännerungen',
'anoneditwarning' => 'Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress am Historique vun dëser Säit gespäichert.',
+'anonpreviewwarning' => "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
'missingsummary' => "'''Erënnerung:''' Dir hutt kee Resumé aginn. Wann Dir nachemol op \"Säit ofspäicheren\" klickt, gëtt är Ännerung ouni Resumé ofgespäichert.",
'missingcommenttext' => 'Gitt w.e.g. eng Bemierkung an.',
-'missingcommentheader' => "'''OPGEPASST:''' Dir hutt keen Titel/Sujet fir dës Bemierkung aginn. Wann Dir nach en Kéier op \"Späicheren\" klickt da gëtt Är Ännerung ouni Titel ofgespäichert.",
+'missingcommentheader' => "'''Denkt drun:''' Dir hutt keen Titel/Sujet fir dës Bemierkung aginn.
+Wann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
'summary-preview' => 'Resumé kucken ouni ofzespäicheren:',
'subject-preview' => 'Sujet/Iwwerschrëft kucken:',
'blockedtitle' => 'Benotzer ass gespaart',
@@ -752,8 +775,12 @@ Déi lescht Entrée am Logbuch vun de Späre steet als Referenz hei drënner:',
'usercsspreview' => "'''Bedenkt: Dir kuckt just är Benotzer CSS.
Si gouf nach net gespäichert!'''",
'userjspreview' => "'''Denkt drun datt Dir äre Javascript nëmmen test, nach ass näischt gespäichert!'''",
+'sitecsspreview' => "'''Denkt drun datt Dir dësen CSS just kuckt.
+E gouf nach net gespäichert!'''",
+'sitejspreview' => "'''Denkt drun datt Dir dëse JavaScript-Code just kuckt.
+E gouf nach net gespäichert!'''",
'userinvalidcssjstitle' => "'''Opgepasst:''' Et gëtt keen Ausgesinn (skin) \"\$1\".
-Denkt drun datt eegen .css an .js Säiten e kleng geschriwwenen Titel benotzen, z. Bsp. {{ns:user}}:Foo/monobook.css am Géigesaz zu {{ns:user}}:Foo/Monobook.css.",
+Denkt drun datt eegen .css an .js Säiten e kleng geschriwwenen Titel benotzen, z. Bsp. {{ns:user}}:Foo/vector.css am Géigesaz zu {{ns:user}}:Foo/Vector.css.",
'updated' => '(Geännert)',
'note' => "'''Notiz:'''",
'previewnote' => "'''Dëst ass nëmmen eng net gespäichert Versioun; d'Ännerunge sinn nach net gespäichert!'''",
@@ -790,9 +817,6 @@ Dir verspriecht ausserdeem datt Dir dësen Text selwer verfaasst hutt, oder aus
'''DROT KEE COPYRECHTLECH GESCHÃœTZTE CONTENU OUNI ERLAABNES AN!'''",
'copyrightwarning2' => "W.e.g. notéiert datt all Kontributiounen op {{SITENAME}} vun anere Benotzer verännert oder geläscht kënne ginn. Wann dir dat net wëllt, da setzt näischt heihinner.<br />
Dir verspriecht ausserdeem datt dir dësen Text selwer verfaasst hutt, oder aus dem Domaine public oder anere fräie Quelle kopéiert hutt. (cf. $1 fir méi Detailler). '''DROT KEE COPYRECHTLECH GESCHÜTZTE CONTENU AN!'''",
-'longpagewarning' => "'''WARNUNG: Dës Säit ass $1 kB grouss; verschidde Browser kéinte Problemer hunn, Säiten ze verschaffen, déi méi grouss wéi 32 kB sinn.
-
-Iwwerleet w.e.g., ob eng Opdeelung vun der Säit a méi kleng Abschnitter méiglich ass.'''",
'longpageerror' => "'''FEELER: Den Text, den Dir Versicht ze späicheren, huet $1 KB. Dëst ass méi wéi den erlaabte Maximum vun $2 KB – dofir kann den Text net gespäichert ginn.'''",
'readonlywarning' => "'''OPGEPASST: D'Datebank gouf wéinst Maintenanceaarbechte fir Säitenännerunge gespaart, dofir kënnt Dir déi Säit den Ament net ofspäicheren. Versuergt den Text a versicht d'Ännerunge méi spéit nach emol ze maachen.'''
@@ -962,6 +986,8 @@ $1",
'logdelete-failure' => "'''D'Sichtbarkeet vum Logbuch konnt net agestllt ginn:'''
$1",
'revdel-restore' => 'Sichtbarkeet änneren',
+'revdel-restore-deleted' => 'geläschte Versiounen',
+'revdel-restore-visible' => 'sichtbar Versiounen',
'pagehist' => 'Versioune vun dëser Säit',
'deletedhist' => 'Geläschte Versiounen',
'revdelete-content' => 'Inhalt',
@@ -1033,11 +1059,13 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
# Diffs
'history-title' => 'Versiounshistorique vun „$1“',
'difference' => '(Ennerscheed tëscht Versiounen)',
+'difference-multipage' => '(Ënnerscheed tëschent Säiten)',
'lineno' => 'Linn $1:',
'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
'showhideselectedversions' => 'Erausgesichte Versioune weisen/verstoppen',
'editundo' => 'zréck',
-'diff-multi' => '({{PLURAL:$1|Eng Tëscheversioun gëtt net|$1 Tëscheversioune ginn net}} gewisen)',
+'diff-multi' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun {{PLURAL:$2|engem|$2}} Benotzer {{PLURAL:$1|gëtt|ginn}} net gewisen)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vu méi wéi $2 {{PLURAL:$2|Benotzer|Benotzer}} ginn net gewisen)',
# Search results
'searchresults' => 'Resultat vun der Sich',
@@ -1072,6 +1100,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
'searchprofile-everything-tooltip' => 'Op alle Säiten nom Inhalt sichen (inclusiv Diskussiounssäiten)',
'searchprofile-advanced-tooltip' => 'Sich an den Nummraim déi an de perséinlichen Astellungen festgeluecht sinn',
'search-result-size' => '$1 ({{PLURAL:$2|1 Wuert|$2 Wierder}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Säit|$1 Säiten}} ({{PLURAL:$2|1 Ënnerkategorie|$2 Ënnerkategorien}}, {{PLURAL:$3|1 Fichier|$3 Fichieren}})',
'search-result-score' => 'Relevanz: $1 %',
'search-redirect' => '(Viruleedung $1)',
'search-section' => '(Abschnitt $1)',
@@ -1146,6 +1175,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
'contextlines' => 'Zuel vun de Linnen:',
'contextchars' => 'Kontextcharactère pro Linn:',
'stub-threshold' => 'Maximum (a Byte) bei deem e Link nach ëmmer am <a href="#" class="stub">Skizze-Format</a> gewise gëtt:',
+'stub-threshold-disabled' => 'Desaktivéiert',
'recentchangesdays' => 'Deeg déi an de Rezenten Ännerungen ugewise ginn:',
'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Dag|Deeg}})',
'recentchangescount' => 'Zuel vun den Ännerungen déi als Standard gewise ginn:',
@@ -1179,6 +1209,7 @@ Hei ass een zoufälleg generéierte Wäert deen Dir benotze kënnt: $1',
'prefs-files' => 'Fichieren',
'prefs-custom-css' => 'Benotzerdefinéierten CSS',
'prefs-custom-js' => 'Benotzerdefinéierte JS',
+'prefs-common-css-js' => 'Gemeinsam CSS/JS fir all Ausgesinn (skins):',
'prefs-reset-intro' => "Dir kënnt dës Säit benotze fir Är Astellungen zréck op d'Standard-Astllungen ze setzen.
Dëst kann net réckgängeg gemaach ginn.",
'prefs-emailconfirm-label' => 'E-Mail Confirmatioun:',
@@ -1216,9 +1247,15 @@ Dir kënnt et och zouloossen datt aner Benotzer iech - iwwert e Link op Ärer Be
'prefs-advancedrendering' => 'Méi Optiounen',
'prefs-advancedsearchoptions' => 'Méi Optiounen',
'prefs-advancedwatchlist' => 'Méi Optiounen',
-'prefs-display' => 'Optioune vum Affichage',
+'prefs-displayrc' => 'Optioune vun deem wat gewise gëtt',
+'prefs-displaysearchoptions' => 'Optioune vum Affichage',
+'prefs-displaywatchlist' => 'Optioune vun deem wat gewise gëtt',
'prefs-diffs' => 'Ënnerscheeder',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "D'E-Mailadress schéngt valabel ze sinn",
+'email-address-validity-invalid' => 'Gitt eng valabel e-Mailadress an',
+
# User rights
'userrights' => 'Benotzerrechterverwaltung',
'userrights-lookup-user' => 'Benotzergrupp verwalten',
@@ -1302,6 +1339,7 @@ Dir kënnt et och zouloossen datt aner Benotzer iech - iwwert e Link op Ärer Be
'right-hideuser' => 'E Benotzernumm spären, an deem e virun der Ëffentlechkeet verstoppt gëtt',
'right-ipblock-exempt' => 'Ausname vun IP-Spären, automatesche Spären a vu Späre vu Plage vun IPen',
'right-proxyunbannable' => 'Automatesche Proxyspären ëmgoen',
+'right-unblockself' => 'Seng eege Spär ophiewen',
'right-protect' => 'Protectiounsniveauen änneren a gespaarte Säiten änneren',
'right-editprotected' => 'Protegéiert Säiten (ouni Kaskadeprotectioun) änneren',
'right-editinterface' => 'De Benotzerinterface änneren',
@@ -1313,9 +1351,9 @@ Dir kënnt et och zouloossen datt aner Benotzer iech - iwwert e Link op Ärer Be
'right-noratelimit' => 'Net limitéiert duerch Zäitlimitatiounen um Server',
'right-import' => 'Säite vun anere Wikien importéieren',
'right-importupload' => 'Säite vun engem eropgeluedene Fichier importéieren',
-'right-patrol' => 'Aneren hir Ännerungen als kontrolléiert markéieren',
-'right-autopatrol' => 'Déi eegen Ännerungen automatesch als iwwerkuckt markéieren',
-'right-patrolmarks' => 'Markéierung "iwwerkuckt" an de rezenten Ännerunge weisen',
+'right-patrol' => 'Aneren hir Ännerungen als nogekuckt markéieren',
+'right-autopatrol' => 'Déi eegen Ännerungen automatesch als nogekuckt markéieren',
+'right-patrolmarks' => 'Markéierung "nogekuckt" an de rezenten Ännerunge weisen',
'right-unwatchedpages' => 'Lëscht vun den net iwwerwaachte Säite weisen',
'right-trackback' => 'En Trackback matdeelen',
'right-mergehistory' => 'Zesummeféierung vum Historique vun de Versioune vu Säiten',
@@ -1324,7 +1362,6 @@ Dir kënnt et och zouloossen datt aner Benotzer iech - iwwert e Link op Ärer Be
'right-siteadmin' => "Datebank spären an d'Spär ophiewen",
'right-reset-passwords' => 'Anere Benotzer hir Passwierder zrécksetzen',
'right-override-export-depth' => 'Säiten exportéieren inklusiv de verlinkte Säite bis zu enger Déift vu 5',
-'right-versiondetail' => 'Informatiounen iwwert déi erweidert Software-Versioun weisen',
'right-sendemail' => 'Anere Benotzer E-Maile schécken',
# User rights log
@@ -1360,8 +1397,8 @@ Dir kënnt et och zouloossen datt aner Benotzer iech - iwwert e Link op Ärer Be
'action-protect' => 'de Protectiounsstatus vun dëser Säit änneren',
'action-import' => "dës Säit aus enger anerer Wiki z'importéieren",
'action-importupload' => "dës Säit duerch d'Eropluede vun engem Fichier importéieren",
-'action-patrol' => 'd?Ännerunge vun Aneren als iwwerkuckt markéieren',
-'action-autopatrol' => 'eegen Ännerungen als iwwerkuckt ze markéieren',
+'action-patrol' => "d'Ännerunge vun Aneren als nogekuckt markéieren",
+'action-autopatrol' => 'eegen Ännerungen als nogekuckt ze markéieren',
'action-unwatchedpages' => "d'Lëscht vun den net iwwerwaachte Säiten ze kucken",
'action-trackback' => "en ''Trackback'' matzedeelen",
'action-mergehistory' => "d'Versiounsgeschicht vun dëser Säit zesummenzeféieren",
@@ -1375,14 +1412,9 @@ Dir kënnt et och zouloossen datt aner Benotzer iech - iwwert e Link op Ärer Be
'recentchanges-legend' => 'Optioune vun de rezenten Ännerungen',
'recentchangestext' => "Op dëser Säit kënnt Dir déi rezent Ännerungen op '''{{SITENAME}}''' gesinn.",
'recentchanges-feed-description' => 'Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.',
-'recentchanges-label-legend' => 'Legend: $1.',
-'recentchanges-legend-newpage' => '$1 - nei Säit',
'recentchanges-label-newpage' => 'Dës Ännerung huet eng nei Säit ugeluecht',
-'recentchanges-legend-minor' => '$1 - kleng Ännerung',
'recentchanges-label-minor' => 'Dëst ass eng kleng Ännerung',
-'recentchanges-legend-bot' => '$1 - Ännerung duerch e Bot',
'recentchanges-label-bot' => 'Dës Ännerung gouf vun engem Bot gemaacht',
-'recentchanges-legend-unpatrolled' => '$1 - net-nogekuckten Ännerung',
'recentchanges-label-unpatrolled' => 'Dës Ännerung gouf nach net nogekuckt',
'rcnote' => "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht '''$1''' Ännerungen}} {{PLURAL:$2|vum leschten Dag|vun de leschten '''$2''' Deeg}}, Stand: $4 ëm $5 Auer.",
'rcnotefrom' => "Ugewise ginn d'Ännerunge vum '''$2''' un (maximal '''$1''' Ännerunge gi gewisen).",
@@ -1430,13 +1462,16 @@ Säite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' gesch
'upload_directory_missing' => 'De Repertoire an deen Dir eropluede wollt ($1) feelt a konnt net vum Webserver ugeluecht ginn.',
'upload_directory_read_only' => 'De Webserver kann net an den Upload-Repertoire ($1) schreiwen.',
'uploaderror' => 'Feeler bäim Eroplueden',
+'upload-recreate-warning' => "'''Opgepasst: E Fichier mat deem Numm gouf scho geläscht oder geréckelt.'''
+
+Hei fannt Dir en Extrait aus dem Läsch- a Réckel-Logbuch fir dëse Fichier.",
'uploadtext' => "Benotzt dëse Formulaire, fir nei Fichieren eropzelueden.
Gitt op d'[[Special:FileList|Lëscht vun den eropgeluedene Fichieren]], fir no Fichieren ze sichen déi virdrun eropgeluede goufen, Eropluedunge fannt dir an der [[Special:Log/upload|Lëscht vun den eropgeluedene Fichieren]], geläschte Fichieren am [[Special:Log/delete|Läschlog]].
Fir e '''Bild''' op enger Säit zu benotzen, schreift amplaz vum Bild eng vun dëse Formelen:
* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.jpg]]</nowiki></tt>''' fir déi ganz Versioun vum Fichier ze benotzen
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.png|200px|thumb|left|alt text]]</nowiki></tt>''' fir eng 200 Pixel breet Versioun an enger Këscht am lénkse Rand mat 'alt text' als Beschreiwung
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichier.ogg]]</nowiki></tt>''' fir e Fichier direk ze verlinken ouni de Fichier ze weisen",
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.png|200px|thumb|left|alt text]]</nowiki></tt>''' fir eng 200 Pixel breet Versioun an enger Këscht am lénke Rand mat 'alt text' als Beschreiwung
+* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichier.ogg]]</nowiki></tt>''' fir e Fichier direkt ze verlinken ouni de Fichier ze weisen",
'upload-permitted' => 'Erlaabte Formater vun de Fichieren: $1.',
'upload-preferred' => 'Fichierszorten déi am beschte funktionéieren: $1.',
'upload-prohibited' => 'Verbuede Fichiers Formater: $1.',
@@ -1464,6 +1499,17 @@ Erwënschte {{PLURAL:\$3|Format ass|Formater sinn}}: \$2.",
'filetype-banned-type' => "'''.$1''' ass ee Fichersformat deen net erlaabt ass.
Erlaabt {{PLURAL:$3|ass|sinn}}: $2.",
'filetype-missing' => 'De Fichier huet keng Erweiderung (wéi z. B. ".jpg").',
+'empty-file' => 'De Fichier deen Dir geschéckt hutt war eidel.',
+'file-too-large' => 'De Fichier deen Dir geschéckt hutt war ze grouss.',
+'filename-tooshort' => 'Den Numm vum Fichier ass ze kuerz.',
+'filetype-banned' => 'Dësen Typ vu Fichier kann net eropgeluede ginn.',
+'verification-error' => "Dëse Fichier huet d'Fichiers-Iwwerpréifung net passéiert.",
+'hookaborted' => "D'Ännerung déi Dir versicht hutt ze maachen ass duerch en 'extension-hook' ofgebrach ginn.",
+'illegal-filename' => 'Den Numm vum Fichier ass net erlaabt.',
+'overwrite' => "D'Iwwerschreiwe vun engem Fichier ass net erlaabt.",
+'unknown-error' => 'En onbekannte Feeler ass geschitt.',
+'tmp-create-error' => 'Den temporäre Fichier konnt net ugeluecht ginn.',
+'tmp-write-error' => 'Feeler beim Schreiwe vum temporäre Fichier.',
'large-file' => "D'Fichiere sollen no Méiglechkeet net méi grouss wéi $1 sinn. Dëse Fichier huet $2.",
'largefileserver' => 'Dëse Fichier ass méi grouss wéi déi um Server agestallte Maximalgréisst.',
'emptyfile' => 'De Fichier deen Dir eropgelueden hutt, schéngt eidel ze sinn. Dëst kann duerch en Tippfeeler am Numm vum Fichier kommen. Préift w.e.g. no, op Dir dëse Fichier wierklech eropluede wëllt.',
@@ -1491,13 +1537,14 @@ Wann Dir de Fichier nach ëmmer eropluede wëllt, da gitt w.e.g. zréck a benotz
Wann Dir dëse Fichier trotzdeem eropluede wëllt da gitt w.e.g. zréck a luet dëse Fichier ënner engem aneren Numm erop. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Dëse Fichier schéngt een Doublon vun {{PLURAL:$1|dësem Fichier|dëse Fichieren}} ze sinn:',
'file-deleted-duplicate' => 'En identesche Fichier ([[:$1]]) gouf virdru geläscht. Kuckt w.e.g. an der Lëscht vum Läschen no, Ier Dir en nach emol eropluet.',
-'successfulupload' => 'Eroplueden erfollegräich',
'uploadwarning' => 'Opgepasst',
'uploadwarning-text' => "Ännert d'Beschreiwung hei ënnedrënner w.e.g. a versicht et nach eng Kéier.",
'savefile' => 'Fichier späicheren',
'uploadedimage' => 'huet "[[$1]]" eropgelueden',
'overwroteimage' => 'huet eng nei Versioun vun "[[$1]]" eropgelueden',
'uploaddisabled' => "Pardon, d'Eropluede vu Fichieren ass ausgeschalt.",
+'copyuploaddisabled' => "D'Eroplueden iwwer URL ass desaktivéiert.",
+'uploadfromurl-queued' => "Dat wat Dir eropgelueden hutt gouf an d'Waardelëscht agedroen.",
'uploaddisabledtext' => "D'Eropluede vu Fichieren ass ausgeschalt.",
'php-uploaddisabledtext' => "D'Eropluede vu Fichieren ass am PHP desaktivéiert. Kuckt w.e.g. d'Astellung ''file_uploads'' no.",
'uploadscripted' => 'An dësem Fichier ass HTML- oder Scriptcode, dee vun engem Webbrowser falsch interpretéiert kéint ginn.',
@@ -1516,6 +1563,14 @@ Wann Dir dëse Fichier trotzdeem eropluede wëllt da gitt w.e.g. zréck a luet d
Kuckt w.e.g. genee no, ob dat neit Eroplueden de Richtlinnen entsprécht.
Zu Ärer Informatioun steet an der Läsch-Lëscht de Grond vum virege Läschen:",
'filename-bad-prefix' => "Den Numm vum Fichier fänkt mat '''„$1“''' un. Dësen Numm krut en automatesch vun der Kamera a seet näischt iwwer dat aus, wat drop ass. Gitt dem Fichier w.e.gl. en Numm, deen den Inhalt besser beschreift, an deen net verwiesselt ka ginn.",
+'upload-success-subj' => 'Eroplueden erfollegräich',
+'upload-success-msg' => 'Ärt Eropluede vun [$2] huet fonctionnéiert. De Fichier ass hei disponibel: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem beim Eroplueden',
+'upload-failure-msg' => 'Et gouf e Problem mam Fichier vu(n) [$2] deen Dir eropgelueden hutt:
+
+$1',
+'upload-warning-subj' => 'Warnung beim Eroplueden',
+'upload-warning-msg' => 'Et gouf e Problem beim Eropluede vun [$2]. Dir kënnt op de [[Special:Upload/stash/$1|Formulaire fir eropzelueden]] goe fir de Problem ze léisen.',
'upload-proto-error' => 'Falsche Protokoll',
'upload-proto-error-text' => "D'URL muss mat <code>http://</code> oder <code>ftp://</code> ufänken.",
@@ -1578,6 +1633,7 @@ Kuckt w.e.g. no op kee Feeler an der URL ass an op de Site och online ass.',
'listfiles_search_for' => 'Sicht nom Fichier:',
'imgfile' => 'Fichier',
'listfiles' => 'Lëscht vun de Fichieren',
+'listfiles_thumb' => 'Miniaturbild',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Numm',
'listfiles_user' => 'Benotzer',
@@ -1692,8 +1748,8 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <tt>image/jpeg</tt>.",
'statistics-edits' => 'Säitenännerungen zënter datt et {{SITENAME}} gëtt',
'statistics-edits-average' => 'Duerchschnëttlech Zuel vun Ännerunge pro Säit',
'statistics-views-total' => 'Total vun den Oprif',
+'statistics-views-total-desc' => 'Kucke vu Säiten déi et net gëtt a vu Spezialsäite sinn net mat dran',
'statistics-views-peredit' => 'Oprif pro Ännerung',
-'statistics-jobqueue' => 'Längt vun der [http://www.mediawiki.org/wiki/Manual:Job_queue Job queue]',
'statistics-users' => 'Registréiert [[Special:ListUsers|Benotzer]]',
'statistics-users-active' => 'Aktiv Benotzer',
'statistics-users-active-desc' => 'Benotzer déi während {{PLURAL:$1|dem leschten Dag|de leschten $1 Deeg}} eppes gemaach hunn',
@@ -1708,7 +1764,7 @@ Eng Säite gëtt als Homonymiesäit behandelt, wa si eng Schabloun benotzt déi
'doubleredirects' => 'Duebel Viruleedungen',
'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun der zweeter Viruleedung, déi normalerweis déi "richteg" Zilsäit ass, op déi déi éischt Viruleedung hilinke soll.
-<s>Duerchgestrachen</s> Linke goufe schonn esou verännert datt déi duebel Viruleedung opgeléist ass.',
+<del>Duerchgestrachen</del> Linke goufe schonn esou verännert datt déi duebel Viruleedung opgeléist ass.',
'double-redirect-fixed-move' => '[[$1]] gouf geréckelt, et ass elo eng Viruleedung op [[$2]]',
'double-redirect-fixer' => 'Verbesserung vu Viruleedungen',
@@ -1731,6 +1787,8 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
'nmembers' => '$1 {{PLURAL:$1|Member|Memberen}}',
'nrevisions' => '$1 {{PLURAL:$1|Versioun|Versiounen}}',
'nviews' => '$1 {{PLURAL:$1|Offro|Offroen}}',
+'nimagelinks' => 'Benotzt op {{PLURAL:$1|enger Säit|$1 Säiten}}',
+'ntransclusions' => 'benotzt op {{PLURAL:$1|enger Säit|$1 Säiten}}',
'specialpage-empty' => 'Dës Säit ass eidel.',
'lonelypages' => 'Weesesäiten',
'lonelypagestext' => 'Dës Säite sinn net vun anere Säite vu(n) {{SITENAME}} verlinkt respektiv a kenger Säit vu(n) {{SITENAME}} agebonn.',
@@ -1887,34 +1945,40 @@ Et ginn [[{{MediaWiki:Listgrouprights-helppage}}|zousätzlech Informatiounen]] i
'listgrouprights-removegroup-self-all' => 'Däerf all Gruppe vu sengem eegene Benotzerkont ewechhuelen',
# E-mail user
-'mailnologin' => 'Keng E-Mailadress',
-'mailnologintext' => 'Dir musst [[Special:UserLogin|ugemellt]] sinn an eng gëlteg E-Mail Adress an Äre [[Special:Preferences|Astellungen]] aginn hunn, fir engem anere Benotzer eng E-Mail ze schécken.',
-'emailuser' => 'Dësem Benotzer eng E-Mail schécken',
-'emailpage' => 'Dem Benotzer eng E-Mail schécken',
-'emailpagetext' => 'Dir kënnt mat dësem Formulaire dësem Benotzer en E-Mail-Message schécken.
+'mailnologin' => 'Keng E-Mailadress',
+'mailnologintext' => 'Dir musst [[Special:UserLogin|ugemellt]] sinn an eng gëlteg E-Mail Adress an Äre [[Special:Preferences|Astellungen]] aginn hunn, fir engem anere Benotzer eng E-Mail ze schécken.',
+'emailuser' => 'Dësem Benotzer eng E-Mail schécken',
+'emailpage' => 'Dem Benotzer eng E-Mail schécken',
+'emailpagetext' => 'Dir kënnt mat dësem Formulaire dësem Benotzer en E-Mail-Message schécken.
D\'E-Mailadress, déi Dir an [[Special:Preferences|Ären Astellungen]] aginn hutt, steet an der "From" Adress vun der Mail, sou datt den Destinataire Iech direkt äntwerte kann.',
-'usermailererror' => 'E-Mail-Objet mellt deen heite Feeler:',
-'defemailsubject' => 'E-Mail vu(n) {{SITENAME}}',
-'noemailtitle' => 'Keng E-Mailadress',
-'noemailtext' => 'Dëse Benotzer huet keng valabel E-Mailadress uginn.',
-'nowikiemailtitle' => 'Keng E-Mail erlaabt',
-'nowikiemailtext' => 'Dëse Benotzer wëllt keng E-Maile vun anere Benotzer kréien.',
-'email-legend' => 'Engem anere(n) {{SITENAME}}-Benotzer eng E-Mail schécken',
-'emailfrom' => 'Vum:',
-'emailto' => 'Fir:',
-'emailsubject' => 'Sujet:',
-'emailmessage' => 'Message:',
-'emailsend' => 'Schécken',
-'emailccme' => 'Eng E-Mailkopie vun der Noriicht fir mech',
-'emailccsubject' => 'Kopie vun denger Noriicht un $1: $2',
-'emailsent' => 'E-Mail geschéckt',
-'emailsenttext' => 'Är E-Mail gouf fortgeschéckt.',
-'emailuserfooter' => 'Dës E-Mail gouf vum $1 dem $2 geschéckt dobäi gouf d\'Funktioun "Benotzer E-Mail" op {{SITENAME}} benotzt.',
+'usermailererror' => 'E-Mail-Objet mellt deen heite Feeler:',
+'defemailsubject' => 'E-Mail vu(n) {{SITENAME}}',
+'usermaildisabled' => 'Benotzer E-Mail ausgeschalt',
+'usermaildisabledtext' => 'Dir kënnt op dëser Wiki anere Benotzer keng E-Mail schécken',
+'noemailtitle' => 'Keng E-Mailadress',
+'noemailtext' => 'Dëse Benotzer huet keng valabel E-Mailadress uginn.',
+'nowikiemailtitle' => 'Keng E-Mail erlaabt',
+'nowikiemailtext' => 'Dëse Benotzer wëllt keng E-Maile vun anere Benotzer kréien.',
+'email-legend' => 'Engem anere(n) {{SITENAME}}-Benotzer eng E-Mail schécken',
+'emailfrom' => 'Vum:',
+'emailto' => 'Fir:',
+'emailsubject' => 'Sujet:',
+'emailmessage' => 'Message:',
+'emailsend' => 'Schécken',
+'emailccme' => 'Eng E-Mailkopie vun der Noriicht fir mech',
+'emailccsubject' => 'Kopie vun denger Noriicht un $1: $2',
+'emailsent' => 'E-Mail geschéckt',
+'emailsenttext' => 'Är E-Mail gouf fortgeschéckt.',
+'emailuserfooter' => 'Dës E-Mail gouf vum $1 dem $2 geschéckt dobäi gouf d\'Funktioun "Benotzer E-Mail" op {{SITENAME}} benotzt.',
+
+# User Messenger
+'usermessage-summary' => 'Benoriichtegung hannerloossen.',
+'usermessage-editor' => 'Benoriichtegungs-System',
# Watchlist
'watchlist' => 'Meng Iwwerwaachungslëscht',
'mywatchlist' => 'Meng Iwwerwaachungslëscht',
-'watchlistfor' => "(fir '''$1''')",
+'watchlistfor2' => 'Vum $1 $2',
'nowatchlist' => 'Är Iwwerwaachungslëscht ass eidel.',
'watchlistanontext' => "Dir musst $1 fir Säiten op ärer Iwwerwaachungslëscht ze gesinn oder z'änneren.",
'watchnologin' => 'Net ageloggt',
@@ -1965,7 +2029,7 @@ $NEWPAGE
Resumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT
-Dëse Mataarbechter kontaktéieren:
+Den Editeur kontaktéieren:
E-Mail: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
@@ -1976,9 +2040,15 @@ Op Ärer Iwwerwaachungslëscht kënnt Dir all Benoorichtigungsmarkeren zesummen
Äre frëndleche {{SITENAME}} Benoriichtigungssystem
--
-Fir d\'Astellungen op ärer Iwwerwaachungslëscht z\'änneren, besicht w.e.g.
+
+Fir d\'Astellungen op ären E-Mailbenoriichtigungen z\'änneren, besicht w.e.g.
+{{fullurl:{{#special:Preferences}}}}
+
+
+Fir d\'Astellungen vun ärer Iwwerwaachungslëscht z\'änneren, besicht w.e.g.
{{fullurl:Special:Watchlist/edit}}
+
Fir d\'Säit vun Ärer Iwwerwaachungslëscht erofzehuelen, gitt w.e.g. op
$UNWATCHURL
@@ -2034,7 +2104,10 @@ Déi lescht Ännerung vun der Säit ass vum [[User:$3|$3]] ([[User talk:$3|Disku
'revertpage' => 'Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]',
'revertpage-nouser' => 'Zréckgesaten Ännerungen vum (Benotzernummewechgeholl) op déilescht Versioun vum [[User:$1|$1]]',
'rollback-success' => "D'Ännerunge vum $1 goufen zréckgesat op déi lescht Versioun vum $2.",
-'sessionfailure' => 'Et schéngt e Problem mat ärer Loginséance ze ginn;
+
+# Edit tokens
+'sessionfailure-title' => 'Setzungsfeeler',
+'sessionfailure' => 'Et schéngt e Problem mat ärer Loginséance ze ginn;
Dës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt är Séance piratéiert ka ginn.
Klickt w.e.g. op "Zréck" a lued déi Säit vun där Dir komm sidd nei, a versicht et dann nach eng Kéier.',
@@ -2164,18 +2237,22 @@ $1',
'month' => 'Vum Mount (a virdrun):',
'year' => 'Vum Joer (a virdrun):',
-'sp-contributions-newbies' => 'Nëmme Kontributioune vun neie Mataarbechter weisen',
-'sp-contributions-newbies-sub' => 'Fir déi Nei',
-'sp-contributions-newbies-title' => 'Kontributioune vun neie Benotzer',
-'sp-contributions-blocklog' => 'Spärlescht',
-'sp-contributions-deleted' => 'geläschte Benotzer-Kontributiounen',
-'sp-contributions-logs' => 'Logbicher',
-'sp-contributions-talk' => 'diskutéieren',
-'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-search' => 'No Kontributioune sichen',
-'sp-contributions-username' => 'IP-Adress oder Benotzernumm:',
-'sp-contributions-submit' => 'Sichen',
+'sp-contributions-newbies' => 'Nëmme Kontributioune vun neie Mataarbechter weisen',
+'sp-contributions-newbies-sub' => 'Fir déi Nei',
+'sp-contributions-newbies-title' => 'Kontributioune vun neie Benotzer',
+'sp-contributions-blocklog' => 'Spärlescht',
+'sp-contributions-deleted' => 'geläschte Benotzer-Kontributiounen',
+'sp-contributions-uploads' => 'Eropgeluede Fichieren',
+'sp-contributions-logs' => 'Logbicher',
+'sp-contributions-talk' => 'diskutéieren',
+'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:",
+'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',
+'sp-contributions-submit' => 'Sichen',
# What links here
'whatlinkshere' => 'Linken op dës Säit',
@@ -2235,7 +2312,6 @@ Kuckt d'[[Special:IPBlockList|IP Spär-Lëscht]] fir all Spären ze gesin.",
'ipb-edit-dropdown' => 'Spärgrënn änneren',
'ipb-unblock-addr' => 'Spär vum $1 ophiewen',
'ipb-unblock' => 'Spär vun enger IP-Adress oder engem Benotzer ophiewen',
-'ipb-blocklist-addr' => 'Aktuell Späre fir $1',
'ipb-blocklist' => 'Kuckt aktuell Spären',
'ipb-blocklist-contribs' => 'Kontributioune fir $1',
'unblockip' => 'Spär vum Benotzer ophiewen',
@@ -2306,6 +2382,8 @@ Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.
'sorbs_create_account_reason' => 'Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.',
'cant-block-while-blocked' => 'Dir däerft keng aner Benotzer spären, esou lang wéi dir selwer gespaart sidd.',
'cant-see-hidden-user' => "De Benotzer deen Dir versicht ze spären ass scho gespaart a verstoppt. Well Dir d'Recht ''Hideuser'' net hutt kënnt Dir dëse Benotzer net gesinn an dem Benotzer seng Spär net änneren.",
+'ipbblocked' => 'Dir kënnt keng aner Benotzer spären oder hir Spär ophiewen well Dir selwer gespaart sidd',
+'ipbnounblockself' => 'Dir kënnt Är Spär net selwer ophiewen',
# Developer tools
'lockdb' => 'Datebank spären',
@@ -2344,6 +2422,18 @@ Dëst bedeit datt dir eng Säit ëmbenenne kënnt an datt dir keng Säit iwwersc
'''OPGEPASST!'''
Dëst kann en drastesche Changement fir eng populär Säit bedeiten;
verstitt w.e.g. d'Konsequenze vun ärer Handlung éier Dir d'Säit réckelt.",
+'movepagetext-noredirectfixer' => "Wann Dir dëse Formulaire benotzt, réckelt dir eng komplett Säit mat hirem Historique op en neien Numm.
+Den alen Titel gëtt eng Viruleedung op den neien Titel.
+Dir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.
+Vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.
+Dir sidd responsabel datt d'Linke weider dohinner pointéieren, wou se hi sollen.
+
+Denkt w.e.g. drun datt d'Säit '''net''' geréckelt gëtt, wann et schonns eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.
+Dëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et schonns gëtt.
+
+'''OPGEPASST!'''
+Dëst kann en drastesche Changement fir eng populär Säit sinn;
+verstitt w.e.g. d'Konsequenze vun ärer Handlung éier Dir dëst maacht.",
'movepagetalktext' => "D'assoziéiert Diskussiounssäit, am Fall wou eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''
*D'Säit gëtt an een anere Nummraum geréckelt.
*Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder
@@ -2397,6 +2487,7 @@ An deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéiere
'immobile-source-page' => 'Dës Säit kann net geréckelt ginn.',
'immobile-target-page' => 'Kann net op de Bestëmmungs-titel geréckelt ginn.',
'imagenocrossnamespace' => 'Fichiere kënnen net an aner Nummraim geréckelt ginn',
+'nonfile-cannot-move-to-file' => '"Keng Fichiere" kënnen net an den {{ns:file}}-Nummraum geréckelt ginn',
'imagetypemismatch' => 'Déi nei Dateierweiderung ass net mat dem Fichier kompatibel',
'imageinvalidfilename' => 'Den Numm vum Zil-Fichier ass ongëlteg',
'fix-double-redirects' => 'All Viruleedungen déi op den Originaltitel weisen aktualiséieren',
@@ -2474,6 +2565,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
'importstart' => 'Importéier Säiten …',
'import-revision-count' => '$1 {{PLURAL:$1|Versioun|Versiounen}}',
'importnopages' => "Et gëtt keng Säiten fir z'importéieren.",
+'imported-log-entries' => "$1 {{PLURAL:$1|Entrée|Entréeën}} an d'Logbuch importéiert.",
'importfailed' => 'Importatioun huet net fonctionnéiert: $1',
'importunknownsource' => 'Onbekannt Importquell',
'importcantopen' => 'De Fichier dee sollt importéiert gi konnt net opgemaach ginn',
@@ -2567,6 +2659,8 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
'tooltip-rollback' => '"Zrécksetzen" mécht all Ännerunge vum leschten "Auteur" an engem Klick nees réckgängeg.',
'tooltip-undo' => '"Zréck" setzt dës Ännerung zréck a mécht den Ännerungsformulaire am Modus "kucken ouni ofzespäicheren" op.
Erlaabt et e Grond an de Resumé derbäizesetzen.',
+'tooltip-preferences-save' => 'Astellunge späicheren',
+'tooltip-summary' => 'Gitt e kuerze Resumé an',
# Stylesheets
'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick'' */",
@@ -2647,20 +2741,20 @@ iwwerpréift déi korrekt Installatioun vu LaTeX an dvipng (oder dvips + gs + co
'math_notexvc' => 'Den texvc Programm feelt: Liest w.e.g. math/README fir en anzestellen.',
# Patrolling
-'markaspatrolleddiff' => 'Als kontrolléiert markéieren',
-'markaspatrolledtext' => 'Dës Säit als kontrolléiert markéieren',
-'markedaspatrolled' => 'ass als kontrolléiert markéiert',
-'markedaspatrolledtext' => 'Déi gewielte Versioun vu(n) [[:$1]] gouf als kontrolléiert markéiert.',
+'markaspatrolleddiff' => 'Als nogekuckt markéieren',
+'markaspatrolledtext' => 'Dës Säit als nogekuckt markéieren',
+'markedaspatrolled' => 'ass als nogekuckt markéiert',
+'markedaspatrolledtext' => 'Déi gewielte Versioun vu(n) [[:$1]] gouf als nogekuckt markéiert.',
'rcpatroldisabled' => 'Rezent Ännerungskontroll ausgeschalt.',
'rcpatroldisabledtext' => "D'Kontroll vun de leschten Ännerungen ass elo ausgeschalt.",
-'markedaspatrollederror' => 'Kann net als "kontrolléiert" markéiert ginn.',
+'markedaspatrollederror' => 'Kann net als "nogekuckt" markéiert ginn.',
'markedaspatrollederrortext' => 'Dir musst eng Säitenännerung auswielen.',
-'markedaspatrollederror-noautopatrol' => 'Dir däerft Är eegen Ännerungen net als iwwerkuckt markéieren.',
+'markedaspatrollederror-noautopatrol' => 'Dir däerft Är eegen Ännerungen net als nogekuckt markéieren.',
# Patrol log
'patrol-log-page' => 'Logbuch vun den iwwerkuckte Versiounen',
'patrol-log-header' => "Dëst ass d'Logbuch vun den nogekuckte Versiounen.",
-'patrol-log-line' => 'huet d\'$1 vu(n) "$2" als iwwerkuckt markéiert $3',
+'patrol-log-line' => 'huet d\'$1 vu(n) "$2" als nogekuckt markéiert $3',
'patrol-log-auto' => '(automatesch)',
'patrol-log-diff' => 'Versioun $1',
'log-show-hide-patrol' => 'Kontroll-Logbuch $1',
@@ -2686,14 +2780,17 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
'imagemaxsize' => "Maximal Gréisst fir Biller:<br />''(fir Billerbeschreiwungssäiten)''",
'thumbsize' => 'Gréisst vun der Miniatur:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Säit|Säiten}}',
-'file-info' => '(Dateigréisst: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Dateigréisst: $3, MIME-Typ: $4)',
+'file-info' => 'Dateigréisst: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Dateigréisst: $3, MIME-Typ: $4',
'file-nohires' => '<small>Et gëtt keng méi héich Opléisung.</small>',
-'svg-long-desc' => '(SVG-Fichier, Basisgréisst: $1 × $2 Pixel, Gréisst vum Fichier: $3)',
+'svg-long-desc' => 'SVG-Fichier, Basisgréisst: $1 × $2 Pixel, Gréisst vum Fichier: $3',
'show-big-image' => 'Versioun an enger méi héijer Opléisung',
'show-big-image-thumb' => '<small>Gréisst vun der Miniatur: $1 × $2 Pixel</small>',
'file-info-gif-looped' => 'Endloosschleef',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Biller}}',
+'file-info-png-looped' => 'Endlossschleef',
+'file-info-png-repeat' => 'gouf $1 {{PLURAL:$1|mol|mol}} gespillt',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Frame|Framen}}',
# Special:NewFiles
'newimages' => 'Gallerie vun den neie Biller',
@@ -2846,6 +2943,7 @@ Duerno sti Linken déi Ausnamen definéieren, an deenen hirem Kontext dat Bild a
'exif-gpsareainformation' => 'Numm vun der GPS-Géigend',
'exif-gpsdatestamp' => 'GPS-Datum',
'exif-gpsdifferential' => 'GPS-Differentialverbesserung',
+'exif-objectname' => 'Kuerzen Titel',
# EXIF attributes
'exif-compression-1' => 'Onkompriméiert',
@@ -3005,25 +3103,25 @@ Duerno sti Linken déi Ausnamen definéieren, an deenen hirem Kontext dat Bild a
'limitall' => 'all',
# E-mail address confirmation
-'confirmemail' => 'E-Mailadress confirméieren',
-'confirmemail_noemail' => 'Dir hutt keng gëlteg E-Mail-Adress an Äre [[Special:Preferences|Benotzerastellungen]] agedro.',
-'confirmemail_text' => "Ier Dir d'E-Mailfunktioune vun {{SITENAME}} benotze kënnt musst dir als éischt Är E-Mailadress confirméieren. Dréckt w.e.g. de Knäppchen hei ënnendrënner fir eng Confirmatiouns-E-Mail op déi Adress ze schécken déi Dir uginn hutt. An där E-Mail steet e Link mat engem Code, deen dir dann an Ärem Browser opmaache musst fir esou ze bestätegen, datt Är Adress och wierklech existéiert a valabel ass.",
-'confirmemail_pending' => 'Dir krut schonn e Confirmatiouns-Code per E-Mail geschéckt. Wenn Dir Äre Benotzerkont eréischt elo kuerz opgemaach hutt, da gedëllegt Iech nach e puer Minutten bis Är E-Mail ukomm ass, ier Dir een neie Code ufrot.',
-'confirmemail_send' => 'Confirmatiouns-E-Mail schécken',
-'confirmemail_sent' => 'Confirmatiouns-E-Mail gouf geschéckt.',
-'confirmemail_oncreate' => "E Confirmatiouns-Code gouf op Är E-Mail-Adress geschéckt.
+'confirmemail' => 'E-Mailadress confirméieren',
+'confirmemail_noemail' => 'Dir hutt keng gëlteg E-Mail-Adress an Äre [[Special:Preferences|Benotzerastellungen]] agedro.',
+'confirmemail_text' => "Ier Dir d'E-Mailfunktioune vun {{SITENAME}} benotze kënnt musst dir als éischt Är E-Mailadress confirméieren. Dréckt w.e.g. de Knäppchen hei ënnendrënner fir eng Confirmatiouns-E-Mail op déi Adress ze schécken déi Dir uginn hutt. An där E-Mail steet e Link mat engem Code, deen dir dann an Ärem Browser opmaache musst fir esou ze bestätegen, datt Är Adress och wierklech existéiert a valabel ass.",
+'confirmemail_pending' => 'Dir krut schonn e Confirmatiouns-Code per E-Mail geschéckt. Wenn Dir Äre Benotzerkont eréischt elo kuerz opgemaach hutt, da gedëllegt Iech nach e puer Minutten bis Är E-Mail ukomm ass, ier Dir een neie Code ufrot.',
+'confirmemail_send' => 'Confirmatiouns-E-Mail schécken',
+'confirmemail_sent' => 'Confirmatiouns-E-Mail gouf geschéckt.',
+'confirmemail_oncreate' => "E Confirmatiouns-Code gouf op Är E-Mail-Adress geschéckt.
Dëse Code gëtt fir d'Umeldung net gebraucht. Dir braucht en awer bei der Aktivéierung vun den E-Mail-Funktiounen bannert der Wiki.",
-'confirmemail_sendfailed' => '{{SITENAME}} konnt är Confirmatiouns-E-Mail net schécken.
+'confirmemail_sendfailed' => '{{SITENAME}} konnt är Confirmatiouns-E-Mail net schécken.
Iwwerpréift w.e.g. är E-Mailadress op ongëlteg Zeechen.
Feelermeldung vum Mailserver: $1',
-'confirmemail_invalid' => "Ongëltege Confirmatiounscode. Eventuell ass d'Gëltegkeetsdauer vum Code ofgelaf.",
-'confirmemail_needlogin' => 'Dir musst iech $1, fir är E-Mailadress ze confirméieren.',
-'confirmemail_success' => 'Är E-Mailadress gouf confirméiert. Där kënnt iech elo aloggen an a vollem Ëmfang vun der Wiki profitéieren.',
-'confirmemail_loggedin' => 'Är E-Mailadress gouf elo confirméiert.',
-'confirmemail_error' => 'Et ass eppes falsch gelaf bäim Späichere vun ärer Confirmatioun.',
-'confirmemail_subject' => 'Confirmatioun vun der E-Mailadress fir {{SITENAME}}',
-'confirmemail_body' => 'E Benotzer, waarscheinlech dir selwer, hutt mat der IP Adress $1 de Benotzerkont "$2" um Site {{SITENAME}} opgemaach.
+'confirmemail_invalid' => "Ongëltege Confirmatiounscode. Eventuell ass d'Gëltegkeetsdauer vum Code ofgelaf.",
+'confirmemail_needlogin' => 'Dir musst iech $1, fir är E-Mailadress ze confirméieren.',
+'confirmemail_success' => 'Är E-Mailadress gouf confirméiert. Där kënnt iech elo aloggen an a vollem Ëmfang vun der Wiki profitéieren.',
+'confirmemail_loggedin' => 'Är E-Mailadress gouf elo confirméiert.',
+'confirmemail_error' => 'Et ass eppes falsch gelaf bäim Späichere vun ärer Confirmatioun.',
+'confirmemail_subject' => 'Confirmatioun vun der E-Mailadress fir {{SITENAME}}',
+'confirmemail_body' => 'E Benotzer, waarscheinlech dir selwer, hutt mat der IP Adress $1 de Benotzerkont "$2" um Site {{SITENAME}} opgemaach.
Fir ze bestätegen, datt dee Kont iech wierklech gehéiert a fir d\'E-Mail-Funktiounen um Site {{SITENAME}} z\'aktivéieren, maacht w.e.g. dëse Link an ärem Browser op:
$3
@@ -3033,8 +3131,32 @@ Wann dir dëse Benotzerkont *net* opgemaach hutt, maacht w.e.g. dëse Link an ä
$5
Sollt et sech net ëm äre Benotzerkont handelen, da maacht de Link *net* op. De Confirmatiounscode ass gëlteg bis de(n) $4.',
-'confirmemail_invalidated' => 'Confirmatioun vun der E-Mailadress annulléiert',
-'invalidateemail' => "Annulléier d'E-Mailconfirmation",
+'confirmemail_body_changed' => 'E Benotzer, wahrscheinlech Dir selwer, vun der IP-Adress $1,
+huet d\'E-Mailadress vum Benotzerkont "$2" op dës Adress op {{SITENAME}} geännert.
+
+Fir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d\'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dës Link an Ärem Browser op:
+
+$3
+
+Wann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d\'Confirmatioun vun der E-Mailadress auszeschalten:
+
+$5
+
+Dëse Confirmatiouns-Code leeft den $4 of.',
+'confirmemail_body_set' => 'Iergendeen, wahrscheinlech Dir selwer, vun der IP-Adress $1,
+huet d\'E-Mailadress vum Benotzerkont "$2" op dës Adress op {{SITENAME}} geännert.
+
+Fir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d\'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dës Link an Ärem Browser op:
+
+$3
+
+Wann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d\'Confirmatioun vun der E-Mailadress auszeschalten:
+
+$5
+
+Dëse Confirmatiouns-Code leeft den $4 of.',
+'confirmemail_invalidated' => 'Confirmatioun vun der E-Mailadress annulléiert',
+'invalidateemail' => "Annulléier d'E-Mailconfirmation",
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Abannung ass ausgeschalt]',
@@ -3072,6 +3194,7 @@ $1",
'table_pager_first' => 'Éischt Säit',
'table_pager_last' => 'Lescht Säit',
'table_pager_limit' => '$1 Objete pro Säit weisen',
+'table_pager_limit_label' => 'Objete pro Säit:',
'table_pager_limit_submit' => 'Lass',
'table_pager_empty' => 'Keng Resultater',
@@ -3128,6 +3251,7 @@ Dir kënnt och [[Special:Watchlist/edit|de Standard Editeur benotzen]].",
'version-specialpages' => 'Spezialsäiten',
'version-parserhooks' => 'Parser-Erweiderungen',
'version-variables' => 'Variabelen',
+'version-skins' => 'Skins/Layout',
'version-other' => 'Aner',
'version-mediahandlers' => 'Medien-Ënnerstëtzung',
'version-hooks' => 'Klameren',
@@ -3139,6 +3263,13 @@ Dir kënnt och [[Special:Watchlist/edit|de Standard Editeur benotzen]].",
'version-hook-subscribedby' => 'Opruff vum',
'version-version' => '(Versioun $1)',
'version-license' => 'Lizenz',
+'version-poweredby-credits' => "Dës Wiki fonctionnéiert mat '''[http://www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'anerer',
+'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënnert de Bedingungen vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
+
+MediaWiki gëtt verdeelt an der Hoffnung datt se nëtzlech ass, awer OUNI IERGENDENG GARANTIE; ouni eng implizit Garantie vu Commercialisatioun oder Eegnung fir e bestëmmte Gebrauch. Kuckt d'GPU Geral Public License fir méi Informatiounen.
+
+Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public License] mat dësem Programm kritt hunn; wann net da schreift der Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oder [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html liest se online].",
'version-software' => 'Installéiert Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Versioun',
@@ -3208,6 +3339,15 @@ Gitt den Numm vum Fichier ouni de Prefix \"{{ns:file}}:\" an.",
'tags-edit' => 'änneren',
'tags-hitcount' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
+# Special:ComparePages
+'comparepages' => 'Säite vergläichen',
+'compare-selector' => 'Versioune vu Säite vergläichen',
+'compare-page1' => 'Säit 1',
+'compare-page2' => 'Säit 2',
+'compare-rev1' => 'Versioun 1',
+'compare-rev2' => 'Versioun 2',
+'compare-submit' => 'Vergläichen',
+
# Database error messages
'dberr-header' => 'Dës Wiki huet e Problem',
'dberr-problems' => 'Pardon! Dëse Site huet technesch Schwieregkeeten.',
@@ -3224,8 +3364,13 @@ Gitt den Numm vum Fichier ouni de Prefix \"{{ns:file}}:\" an.",
'htmlform-float-invalid' => 'De Wäert deen Dir uginn hutt ass keng Zuel.',
'htmlform-int-toolow' => 'De Wäert deen Dir uginn hutt ass ënnert dem Minimum vu(n) $1',
'htmlform-int-toohigh' => 'De Wäert deen Dir uginn hutt ass iwwert dem Maximum vu(n) $1',
+'htmlform-required' => 'Dëse Wäert ass verlaangt',
'htmlform-submit' => 'Späicheren',
'htmlform-reset' => 'Ännerungen zrécksetzen',
'htmlform-selectorother-other' => 'Anerer',
+# SQLite database support
+'sqlite-has-fts' => "$1 ënnerstëtzt d'Volltextsich",
+'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
+
);
diff --git a/languages/messages/MessagesLbe.php b/languages/messages/MessagesLbe.php
index 6af09b23..c72fc1bb 100644
--- a/languages/messages/MessagesLbe.php
+++ b/languages/messages/MessagesLbe.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Amire80
*/
$fallback = 'ru';
@@ -42,12 +43,13 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрÑтуфхцчшщъыÑ
$messages = array(
'article' => 'Тарих',
+'mytalk' => 'Ðа цӀухху-буÑу байÑÑа интернетрал лажин',
# Cologne Blue skin
'qbedit' => 'Дакьин дуван',
-'history' => 'Макьала',
-'history_short' => 'Макьала',
+'history' => 'Тарих',
+'history_short' => 'Тарих',
'edit' => 'Дакьин дуван',
'talkpagelinktext' => 'Ихтилат',
'talk' => 'Ихтилат',
@@ -69,6 +71,18 @@ $messages = array(
'nstab-template' => 'Шаблон',
'nstab-category' => 'КатегориÑ',
+# Login and logout pages
+'userlogin' => 'СиÑтемалухь цу уÑÑарав буÑан',
+'logout' => 'Уккаву',
+'userlogout' => 'Уккаву',
+
+# Edit pages
+'minoredit' => 'МюрщÑÑа дахханашиву',
+'watchthis' => 'Ва лажин Ñбитаврил ÑиÑхӀравун ххи дан',
+'savearticle' => 'Лажин Ñдан',
+'preview' => 'ЦалÑÑа ххалбаву',
+'showpreview' => 'ЦалÑÑа ххалбаву',
+
# Recent changes
'recentchanges' => 'МахъÑÑа дахханашивурту',
@@ -77,11 +91,26 @@ $messages = array(
'filehist-user' => 'Гьурттучув',
# Miscellaneous special pages
-'move' => 'ЦIа даххана дан',
+'move' => 'ЦӀа даххана дан',
# Special:Log
'specialloguserlabel' => 'Гьурттучув:',
+# E-mail user
+'emailuser' => 'ГьурттучувначӀанÑÑа чагьар',
+
+# Watchlist
+'watchlist' => 'Ябитаврил ÑиÑÑ…Ó€',
+'watch' => 'Хъирив агьан',
+'unwatch' => 'Хъирив къаагьан',
+
+# Contributions
+'contributions' => 'Гьурттучунал бутӀа',
+'mycontris' => 'Ттул даву',
+
'sp-contributions-talk' => 'Ихтилат',
+# Move page
+'move-watch' => 'Ва лажин Ñбитаврил ÑиÑхӀравун ххи дан',
+
);
diff --git a/languages/messages/MessagesLez.php b/languages/messages/MessagesLez.php
index bcf9f9e8..6fc80fa0 100644
--- a/languages/messages/MessagesLez.php
+++ b/languages/messages/MessagesLez.php
@@ -10,11 +10,24 @@
* @author Amikeco
* @author Andrijko Z.
* @author Namik
+ * @author Reedy
*/
$messages = array(
+# User preference toggles
+'tog-enotifusertalkpages' => 'Э-пучта заз ракъурун, зи Ихтилатрин чар дегиш жедайла',
+
+'underline-always' => 'Гьамиша',
+'underline-never' => 'Садрани',
+
# Dates
+'sunday' => 'ГьÑд',
'monday' => 'ИÑлен',
+'tuesday' => 'СалаÑа',
+'wednesday' => 'Ðрбе',
+'thursday' => 'ХемиÑ',
+'friday' => 'ЖуьмÑ',
+'saturday' => 'Киш',
'sun' => 'ГьÑ',
'mon' => 'ИÑл',
'tue' => 'Сал',
@@ -60,10 +73,17 @@ $messages = array(
'dec' => 'Фaн',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Кlватlал|Кlватlалар}}',
-'category_header' => 'Чарар кlватlалда "$1"',
-'subcategories' => 'Кlватlалринпай',
-'hidden-categories' => '{{PLURAL:$1|Кlевнавай кlватlалрин кьадар|Кlевнавай кlватlалрин кьадар}}',
+'pagecategories' => '{{PLURAL:$1|Кlватlал|Кlватlалар}}',
+'category_header' => 'Чарар кlватlалда "$1"',
+'subcategories' => 'Кlватlалринпай',
+'category-media-header' => 'Шикил кlватlалда "$1"',
+'category-empty' => "''Кlватlалда алай вахтунда авач чарар, кхьинар ва шикилар.''",
+'hidden-categories' => '{{PLURAL:$1|Кlевнавай кlватlалрин кьадар|Кlевнавай кlватlалрин кьадар}}',
+'category-subcat-count' => '{{PLURAL:$2|Кlватlалда ава Ñа чар. |И кlватlалда ава {{PLURAL:$1|кlватlалдин кьатl|$1 кlватlалдин кьатlар}}, виридакай $2 .}}',
+'category-article-count' => '{{PLURAL:$2|Кlватlалда ава Ñа чар.|Къведай {{PLURAL:$1|чар|$1 чарчин}} кlватlалда $2 виридкай.}}',
+'category-file-count' => '{{PLURAL:$2|Кlватlалда ава Ñа чар.|Къведай {{PLURAL:$1|файл|$1 файлди}} кlватlалда $2 виридкай.}}',
+'listingcontinuesabbrev' => 'баш.хъувун',
+'noindex-category' => 'Noindexed чарар',
'about' => 'Хакъиндай',
'newwindow' => '(акъай жеда цlийи пенжерда)',
@@ -77,22 +97,22 @@ $messages = array(
'qbedit' => 'Дегишарун',
'qbmyoptions' => 'Зи чар',
'qbspecialpages' => 'Кьетlен хъувун',
+'faq' => 'Суалар ва жавабар',
# Vector skin
-'vector-action-delete' => 'Къакъудун',
-'vector-action-move' => 'Юзун',
-'vector-action-protect' => 'Хуьн',
-'vector-action-undelete' => 'Къакъудун',
-'vector-namespace-category' => 'Кlватlалар',
-'vector-namespace-image' => 'Шикил',
-'vector-namespace-main' => 'Хъувун',
-'vector-namespace-mediawiki' => 'Хъагъаз',
-'vector-namespace-talk' => 'Рахун',
-'vector-namespace-template' => 'Таблиц',
-'vector-view-create' => 'Туькlуьрун',
-'vector-view-edit' => 'Дегишарун',
-'vector-view-viewsource' => 'Къалурун булах',
-'namespaces' => 'Тlарарин гегьенш',
+'vector-action-addsection' => 'Тема ктун хъувун',
+'vector-action-delete' => 'Къакъудун',
+'vector-action-move' => 'Юзун',
+'vector-action-protect' => 'Хуьн',
+'vector-action-undelete' => 'Къакъудун',
+'vector-view-create' => 'Туькlуьрун',
+'vector-view-edit' => 'Дегишарун',
+'vector-view-history' => 'Тарихдиз тамашун',
+'vector-view-view' => 'Кlелун',
+'vector-view-viewsource' => 'Къалурун булах',
+'actions' => 'Юзун',
+'namespaces' => 'Тlарарин гегьенш',
+'variants' => 'ЖуьреÑÑ€',
'errorpagetitle' => 'ГъалатI',
'returnto' => 'Хкун $1.',
@@ -117,47 +137,59 @@ $messages = array(
'protectthispage' => 'Xуьн и хъувун',
'newpage' => 'ЦIийи хъувун',
'talkpage' => 'И чараркай Ñхтилат',
-'talkpagelinktext' => 'Рахун',
+'talkpagelinktext' => 'Ихтилат',
'personaltools' => 'ИнÑан aлатl',
'talk' => 'Рахун',
'views' => 'Рахунар',
'toolbox' => 'Aлаткъаб',
'otherlanguages' => 'МаÑÑа чIаларал',
'redirectedfrom' => '(Ракъур хъувуна $1)',
+'redirectpagesub' => 'Ракъур хъувунин чар',
'lastmodifiedat' => 'И чар Ñхиримжи Ñеферда дигишарна $1, ди $2',
'jumpto' => 'Къудгъунун:',
'jumptonavigation' => 'къекъуьн',
'jumptosearch' => 'ахтармишун',
# 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',
-'disclaimers' => 'Герек тахьай',
-'disclaimerpage' => 'Project:Виридан хабарар',
-'edithelp' => 'Дегишарун чара',
-'edithelppage' => 'Help:Дегишарун',
-'mainpage' => 'ÐÑул хъувун',
-'privacy' => 'Политика конфедециальноÑтин',
-'privacypage' => 'Project:Политика конфедициальноÑтин',
-
-'ok' => 'Э(кхьин)',
-'retrievedfrom' => 'Ðкъудун идай $1',
-'youhavenewmessages' => 'Вунз ава $1 ($2).',
-'newmessageslink' => 'цlийи хъагъаз',
-'editsection' => 'дегишарун',
-'editold' => 'дегишарун',
-'editlink' => 'Дигишарун',
-'viewsourcelink' => 'къалурун булах',
-'editsectionhint' => 'Дегишарун пай: $1',
-'toc' => 'Къейда',
-'showtoc' => 'къаларун',
-'hidetoc' => 'чуьнуьхун',
-'site-rss-feed' => '$1 РСС Xуьрек',
-'site-atom-feed' => '$1 Ðтом Xуьрек',
-'page-rss-feed' => '"$1" РСС Xуьрек',
-'page-atom-feed' => '"$1" Ðтом Xуьрек',
-'red-link-title' => '$1 (чар аватуш)',
+'aboutsite' => 'Хакъиндай {{SITENAME}}',
+'aboutpage' => 'Project:Хакъиндай',
+'copyright' => 'Шаирдин Контент ÑхтиÑÑ€ иниз $1',
+'copyrightpage' => '{{ns:project}}:Туькlуьрчидин ÑтиÑÑ€',
+'currentevents' => 'Физвай хабар',
+'currentevents-url' => 'Project:Физай хакъидай',
+'disclaimers' => 'Герек тахьай',
+'disclaimerpage' => 'Project:Виридан хабарар',
+'edithelp' => 'Дегишарун чара',
+'edithelppage' => 'Help:Дегишарун',
+'helppage' => 'Help:Къейда',
+'mainpage' => 'ÐÑул хъувун',
+'mainpage-description' => 'Чlехиди',
+'portal' => 'ДжуьмÑÑ‚',
+'portal-url' => 'Project:Портал джуьмÑтдин',
+'privacy' => 'Политика конфедециальноÑтин',
+'privacypage' => 'Project:Политика конфедициальноÑтин',
+
+'badaccess' => 'Гъалатlдин ÑхтиÑÑ€',
+
+'ok' => 'Э(кхьин)',
+'retrievedfrom' => 'Ðкъудун идай $1',
+'youhavenewmessages' => 'Вунз ава $1 ($2).',
+'newmessageslink' => 'цlийи хъагъаз',
+'newmessagesdifflink' => 'Эхиримжи дегишарунар',
+'editsection' => 'дегишарун',
+'editold' => 'дегишарун',
+'viewsourceold' => 'Тамашун',
+'editlink' => 'Дигишарун',
+'viewsourcelink' => 'къалурун булах',
+'editsectionhint' => 'Дегишарун пай: $1',
+'toc' => 'Къейда',
+'showtoc' => 'къаларун',
+'hidetoc' => 'чуьнуьхун',
+'site-rss-feed' => '$1 РСС Xуьрек',
+'site-atom-feed' => '$1 Ðтом Xуьрек',
+'page-rss-feed' => '"$1" РСС Xуьрек',
+'page-atom-feed' => '"$1" Ðтом Xуьрек',
+'red-link-title' => '$1 (чар аватуш)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Хъувун',
@@ -170,63 +202,146 @@ $messages = array(
'nstab-category' => 'КIваталар',
# General errors
-'viewsource' => 'Къаларун булах',
-'viewsourcefor' => 'идаз $1',
+'error' => 'Гъалатl',
+'missing-article' => 'Базадай жагъанач макъаладин кхьин, гьама жагъан кlанзайтир, "$1" $2.
+
+Гьама жагъанач вучиз лагьайтlа, ишлемишна иÑки дегишарунин дафтlар ва алукьун чlурнавай.
+
+Гьам гьакlа тушиз хьайитlа, квез жагъана гъалатl ишлемишзавай программада.
+Къавахадиз лагь [[Special:ListUsers/sysop|administrator]], вуч ийизва хабар URL.',
+'missingarticle-rev' => '(жуьре#: $1)',
+'badtitle' => 'Чарчин тlар',
+'badtitletext' => 'Жагъурзавай чар дуьз туш, ичlизва, чlурукl къалурна чlалан арада ва вики титул. Ðда жеда Ñад ва гзаф кхьнар, гьабур Ñ‚lарцlе ишлемиш жедач.',
+'viewsource' => 'Къаларун булах',
+'viewsourcefor' => 'идаз $1',
# Login and logout pages
-'yourname' => 'Ишлемишчидин тIар',
+'yourname' => 'Ишлемишчидин лакlаб',
'yourpassword' => 'Куьлег',
+'yourpasswordagain' => 'Икрар хъйа куьлег:',
+'remembermypassword' => 'Рекlел хуьн Гьахун и браузердиз(артух тушиз 1$ {{PLURAL:$1|югъ|йикъар}})',
'login' => 'Гьахьун',
'nav-login-createaccount' => 'Чарчел фин / цIийи чар туькIуьрун',
+'loginprompt' => 'Куьне куькlуьрна кlанзава куки гьахьна {{SITENAME}}.',
'userlogin' => 'Чарчел фин / цlийи чар туькlуьрун',
'userloginnocreate' => 'Гьахьун',
'logout' => 'ЭкъечIун',
'userlogout' => 'ЭкъечIун',
+'nologin' => 'Квез авач кхьинуни чар? $1.',
+'nologinlink' => 'Туькlуьрун кlелунин кхьин',
+'createaccount' => 'Туькlуьрун кlелунин кхьин',
+'gotaccount' => 'Квез авни акаунт:$1',
'gotaccountlink' => 'Гьахьун',
'createaccountmail' => 'Ðвай e-mail',
+'createaccountreason' => 'Кар',
'mailmypassword' => 'Э-пучтадин цIийи куьлег',
'loginlanguagelabel' => 'ЧIалар: $1',
# Password reset dialog
+'resetpass' => 'Куьлег дегишарун',
'oldpassword' => 'ИÑки куьлег:',
'newpassword' => 'ЦIийи куьлег:',
# Edit page toolbar
-'bold_sample' => 'СакlÑƒÑ Ñцlу кхьин',
-'bold_tip' => 'СакlÑƒÑ Ñцlу кхьин',
-'italic_sample' => 'Къвалахъ алхьанай кхьин',
-'italic_tip' => 'Къвалахъ алхьанай кхьин',
-'media_tip' => 'Файлдин цlар',
+'bold_sample' => 'СакlÑƒÑ Ñцlу кхьин',
+'bold_tip' => 'СакlÑƒÑ Ñцlу кхьин',
+'italic_sample' => 'Къвалахъ алхьанай кхьин',
+'italic_tip' => 'Къвалахъ алхьанай кхьин',
+'link_sample' => 'Ðлукьунин цlарцlин Ñ‚lар',
+'link_tip' => 'Кьенин алукьунар',
+'extlink_sample' => 'http://www.example.com алукьунин тlар',
+'extlink_tip' => 'Къецин алукьун (рекlел хуьн http:// префикÑ)',
+'headline_sample' => 'Кьлин кхьин',
+'headline_tip' => 'Кьадар 2 кьилин',
+'nowiki_sample' => 'Тун дегиш тавунай кхьин инна',
+'nowiki_tip' => 'СÑмиш тавун вики къайда хъувун',
+'image_tip' => 'Тунавай шкил',
+'media_tip' => 'Файлдин цlар',
+'sig_tip' => 'Куьн къул ва вахт',
+'hr_tip' => 'Ярх хьанавай цlар (гзаф ишлемишмир)',
# Edit pages
-'summary' => 'Къейда:',
-'minoredit' => 'И гъвечIи дегишарун',
-'watchthis' => 'Гелкъуьн и хъувун',
-'savearticle' => 'Хуьн хъувун',
-'showdiff' => 'Къаларун дегишарун',
-'loginreqlink' => 'гьахьун',
-'newarticle' => '(ЦIийи)',
-'editing' => 'Дегишарун $1',
-'editingsection' => 'Дегишарун $1 (пай)',
+'summary' => 'Къейда:',
+'subject' => 'Тема/кьилер',
+'minoredit' => 'И гъвечIи дегишарун',
+'watchthis' => 'Гелкъуьн и хъувун',
+'savearticle' => 'Хуьн хъувун',
+'preview' => 'Сифте',
+'showpreview' => 'Сефте килигун',
+'showdiff' => 'Къаларун дегишарун',
+'anoneditwarning' => "'''Дугъридан:''' Куьн хакъидайдиз гьахьнач Куьн IP-Ð°Ð´Ñ€ÐµÑ Ð´ÐµÐ³Ð¸ÑˆÑƒÐ½Ñ€Ð¸Ð½ кьиÑпеÑдиз кхьида и чарчин.",
+'summary-preview' => 'Сифте килигун паталди:',
+'loginreqlink' => 'гьахьун',
+'newarticle' => '(ЦIийи)',
+'newarticletext' => "Куь фена макъаладал, иÑÑтда авачир. Цlийи чар авун паталди,тажумара кхьинар пенжнрда, кlене авай (кл. [[{{MediaWiki:Helppage}}|куьмекунин чар]] гзаф хабар къачун паталди).Куьне инна гъалатlа, Ñцига кнопкадал 'кьулухъ''''' куьн браузерда.",
+'noarticletext' => 'ИÑÑта ава кхьинар гьа и чарчел.
+Квевай жезва [[Special:Search/{{PAGENAME}}|жагъуриз Ñ‚lар лугьузавай лакlаб]] маÑÑа макъалайра,
+<span class="plainlinks"> [{{fullurl: {{# къайдадин: Фин}} | чар = {{FULLPAGENAMEE}}}} жагъуриз кьетхвер кхьинар дафтlара],
+ва [{{fullurl: {{FULLPAGENAME}} | юзунар = Дегиш}} туькlуьрун чар] </span>.',
+'noarticletext-nopermission' => 'Ðва алай вахтунда кхьин чарчел.
+Квевай жезва [[Special:Search/{{PAGENAME}}| жагъуриз гьа Ñ‚lар]] маÑÑа макъалара,
+амма <span class="plainlinks">[{{fullurl:{{#Special:Рак}}|чарар={{FULLPAGENAMEE}}}} жагъуриз ухшар кхьинар дафтlара]</span>.',
+'previewnote' => "'''Рикlел хуьх, имма Ñифте килигун Ñ.''' Дегишунар гьеле хвенач!",
+'editing' => 'Дегишарун $1',
+'editingsection' => 'Дегишарун $1 (пай)',
+'copyrightwarning' => "Буюр, килиг дуьздиз, вири куьн {{SITENAME}} килигз ава акъуднавади $2(кл. $1 клиг хъувун). Квез кlанзаваштlа, куьн кхьинар азадиз чкlана ва дегишариз гьар кlанзайда, тамир абур инна.<br /> Куьнени шагьидзава, куьни Ñ Ð°Ð²Ñ‚Ð¾Ñ€ ктунай дегишунар, ва кхьин хъувунай жуьмÑтдин кхьинрай ва азад чкадай. '''Ðтордин ÑтиÑÑ€ авачиз'''",
+'templatesused' => '{{PLURAL:$1|Шаблон|Шаблонар}} ишлемишзавай гьа и чарчел:',
+'templatesusedpreview' => '{{PLURAL:$1|Шаблон|Шаблонар}},илемишзавай дуьз клигунра:',
+'template-protected' => '(хуьн)',
+'template-semiprotected' => '(Ñа кlÑƒÑ Ð¿Ð°Ð´ кьун)',
+'hiddencategories' => 'И чар квайди Ñ {{PLURAL: $1 | 1 кlевнавай кlватlал | $1 кlевнавабрин кlватlалар}}:',
+'permissionserrorstext-withaction' => 'Квез авач ахтиÑÑ€ $2, идаз {{PLURAL:$1|багьна|багьнаÑÑ€}}:',
+'recreate-moveddeleted-warn' => "'''Килиг: квез туькlуьриз кlанзава чар, чар Ñифте чlурнавай'''
+
+
+Куь клигна кlанзава геркзатlа дегишар хъувун гьа чар.
+Чlурунар ва юзунар чарчин дафтlарда гана квез куьмек Ñз.",
+'moveddeleted-notice' => 'Чар чlурнай. Чlурун ва юзурун дафтlарда чарчин къалурна кlеник.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Килиг''' Шаблондин кьадар Ñкезава.
+Са шаблонор кутадач.",
+'post-expand-template-inclusion-category' => 'Чарар, шаблодин кьадар Ñкезай',
+'post-expand-template-argument-warning' => "'''Килиг''' И чарче ава Ñа шаблон, гьадан кьадар Ñкеди Ñ.
+Гьа аргументар акъайна.",
+'post-expand-template-argument-category' => 'Чарче, къейда ава аргументрин шаблонра',
# History pages
+'viewpagelogs' => 'Къалурун ктаб и чарчиз',
+'currentrev-asof' => 'Эхиримжи клиг хъувун $1',
'revisionasof' => 'Килиг хъувун иниз $1',
+'revision-info' => 'Жуьре идалай $1, идалди $2',
'previousrevision' => 'â†Ð˜Ñки кьелун',
+'nextrevision' => 'Цlийи жуьреÑÑ€ →',
+'currentrevisionlink' => 'Эхиремжи килигун',
'cur' => 'ток',
'next' => 'къведайди',
'last' => 'Ñхиримжи',
'page_first' => 'Ñифте',
'page_last' => 'Ñхиримжи',
+'histlegend' => "Ðгъавурда тун: Марк радио къапунин гьиÑабун килигун паталди Ñцига Тур ва кнопка кlенин.<br /> Къалурун:'''({{int:cur}})'''= Ñхиремджидлай ревизидла,'''({{int:last}})'''=алатай жуьредлай,'''{{int:minoreditletter}}'''=ÑакlÑƒÑ Ð´ÐµÐ³Ð¸ÑˆÐ°Ñ€.",
'history-fieldset-title' => 'Чарчин тарих',
+'history-show-deleted' => 'Са чlурунар',
+'histfirst' => 'Садлагьай',
'histlast' => 'Гежа',
+# Revision feed
+'history-feed-item-nocomment' => '$1 идай $2',
+
# Revision deletion
'rev-delundel' => 'къалур/кIевун',
'revdelete-show-file-submit' => 'Э',
'revdelete-log' => 'Кар',
+'revdelete-logentry' => 'Дегишарна акунвал "[[$1]]"',
'revdel-restore' => 'къакъудун',
+'revdel-restore-deleted' => 'Чlурна дегишунар',
+'revdel-restore-visible' => 'Ðквазай дегишунар',
'pagehist' => 'Хъувун тарих',
+'revdelete-content' => 'Къйеда',
'revdelete-uname' => 'ишлемишчидин тIар',
+'revdelete-hid' => 'чуьнуьх авунай $1',
+'revdelete-log-message' => '$1 идай $2 {{PLURAL:$2|Жуьре|ЖуьреÑÑ€}}',
+'revdelete-offender' => 'Ðвтордин жуьре:',
# History merging
'mergehistory-reason' => 'Кар',
@@ -235,35 +350,61 @@ $messages = array(
'revertmerge' => 'Къакъудунар',
# Diffs
-'lineno' => 'ЦIар $1:',
-'editundo' => 'кукlварин',
+'history-title' => 'КьиÑÐ¿ÐµÑ $1',
+'difference' => '(Къакъатунар жуьрейрин арада)',
+'lineno' => 'ЦIар $1:',
+'compareselectedversions' => 'Гекъиг хъувун',
+'editundo' => 'кукlварин',
+'diff-multi' => '({{PLURAL:$1|Юкьван жуьреÑÑ€|$1 юкьван жуьрейри}} ава {{PLURAL:$2|Ñа ишлемишчи|$2 ишлемишчийри}} къалурнач)',
# Search results
-'searchresults' => 'Ðхтурмишун Ñхир',
-'searchresults-title' => 'Ðхтармишунин Ñхир идаз $1',
-'searchresulttext' => 'Ðтун патал артухан жагъуриникай хабарар {{SITENAME}}, килиг [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitleinvalid' => "Куьне жагъурзавай '''$1'''",
-'notitlematches' => 'Ðвач чарчин кьил матчар',
-'notextmatches' => 'Ðвач чарчин кьил матчар',
-'prevn' => 'алатайбур {{PLURAL:$1|$1}}',
-'nextn' => 'къведай {{PLURAL:$1|$1}}',
-'viewprevnext' => 'Къаларун ($1 {{int:pipe-separator}} $2) ($3)',
-'searchprofile-images' => 'Шикилдин мавзу',
-'search-result-size' => '$1 ({{PLURAL:$2|1 гаф|$2 гафар}})',
-'search-redirect' => '(кхьин хуьн) $1',
-'search-section' => '(пенджердин кьатl$1)',
-'search-suggest' => 'Куьне икl лугьузани: $1',
-'search-interwiki-caption' => 'Мукьва проект',
-'search-interwiki-more' => '(хелин)',
-'search-mwsuggest-enabled' => 'тапшуругъар аваз',
-'search-mwsuggest-disabled' => 'тапшуругъар авач',
-'searchall' => 'вири',
-'powersearch' => 'Ðхтармишун',
-'powersearch-legend' => 'Ðхтармишун',
-'powersearch-ns' => 'Жагъурун тlарарин арада:',
-'powersearch-redir' => 'Рахъурхъунар цlарцlел',
-'powersearch-field' => 'Идаз жагъурун',
-'powersearch-toggleall' => 'Вири',
+'searchresults' => 'Ðхтурмишун Ñхир',
+'searchresults-title' => 'Ðхтармишунин Ñхир идаз $1',
+'searchresulttext' => 'Ðтун патал артухан жагъуриникай хабарар {{SITENAME}}, килиг [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Куьне жагъурзай \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1| чарар, гатlузавай "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|вири чарар алукьзавай "$1"]])',
+'searchsubtitleinvalid' => "Куьне жагъурзавай '''$1'''",
+'notitlematches' => 'Ðвач чарчин кьил матчар',
+'notextmatches' => 'Ðвач чарчин кьил матчар',
+'prevn' => 'алатайбур {{PLURAL:$1|$1}}',
+'nextn' => 'къведай {{PLURAL:$1|$1}}',
+'prevn-title' => 'Ðлатай $1 {{PLURAL:$1|къайда|къайдаÑÑ€}}',
+'nextn-title' => 'Къведай $1 {{PLURAL:$1|къайда|къайдаÑÑ€}}',
+'shown-title' => 'Къалурун $1 {{PLURAL:$1|Дарамат|Дарамат}} чарчел',
+'viewprevnext' => 'Къаларун ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Ðва чар Ñ‚lар алай \"[[:\$1]]\" гьа и викида.'''",
+'searchmenu-new' => "'''Туькlуьрун чар \"[[:\$1]]\" и викида!'''",
+'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' => 'Жагъурун тlарарун арада',
+'search-result-size' => '$1 ({{PLURAL:$2|1 гаф|$2 гафар}})',
+'search-result-category-size' => '{{PLURAL:$1|1 ишлемишчи|$1 ишлемишчиди}} ({{PLURAL:$2|1 кlватlалдин пай|$2 кlватlалдин паÑÑ€}}, {{PLURAL:$3|1 файл|$3 файлар}})',
+'search-redirect' => '(кхьин хуьн) $1',
+'search-section' => '(пенджердин кьатl$1)',
+'search-suggest' => 'Куьне икl лугьузани: $1',
+'search-interwiki-caption' => 'Мукьва проект',
+'search-interwiki-default' => '$1(жавабар)',
+'search-interwiki-more' => '(хелин)',
+'search-mwsuggest-enabled' => 'тапшуругъар аваз',
+'search-mwsuggest-disabled' => 'тапшуругъар авач',
+'searchrelated' => 'Галкlанавай',
+'searchall' => 'вири',
+'showingresultsheader' => "{{PLURAL: \$5| кьадар'''\$1''' идай '\$3'''''| кадарай'''\$1 - \$2''' идаз'''\$3'''}} идаз''' \$4'' \"",
+'nonefound' => "'''ÐÑулзава''': Са шумуд Ñ‚lарар жагъурзава хвенайвал.
+Клига Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ \"вири\" жагъурун паталди кхьинар (ихтилат ва рахунин чарар, шаблонар ва маÑабу), ва ишлемишна кlанзавай Ñ‚lарар Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ð°Ñ‚Ð°Ð»Ð°.",
+'search-nonefound' => 'Ðвай жагъурунда ганача Ñа затlни.',
+'powersearch' => 'Ðхтармишун',
+'powersearch-legend' => 'Ðхтармишун',
+'powersearch-ns' => 'Жагъурун тlарарин арада:',
+'powersearch-redir' => 'Рахъурхъунар цlарцlел',
+'powersearch-field' => 'Идаз жагъурун',
+'powersearch-toggleall' => 'Вири',
# Preferences page
'preferences' => 'Туькlуьрун',
@@ -306,34 +447,61 @@ $messages = array(
# Rights
'right-edit' => 'Дегишар хъувун',
+# User rights log
+'rightslog' => 'ЭхтиÑÑ€ Ишлемишчидин дафтlар',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'дигишарун и чарар',
# Recent changes
-'rcnote' => "КIеник {{PLURAL:$1|is '''1''' change|Ñхиримжи '''$1''' дегишунар}} заманада {{PLURAL:$2|day|'''$2''' йикъар}}, икIа $5, $4",
-'rcshowhideminor' => '$1 бицlи дегишунар',
-'rcshowhidebots' => '$1 бот',
-'rcshowhideliu' => '$1 СиÑтемадиз гьахьнай ишлемишчиÑÑ€',
-'rcshowhideanons' => '
+'nchanges' => '$1 {{PLURAL:$1|дегиш|дегишунар}}',
+'recentchanges' => 'Эхиримжи дегишун',
+'recentchanges-legend' => 'Туькlуьрун гилан дегишар',
+'recentchangestext' => 'Сифте кьилелай гьиÑабнава Ñхиримжи дегишунар викида гьа макъалада',
+'recentchanges-feed-description' => 'Сифте кьилелай гьиÑабнава Ñхиримжи дегишунар викида и макъалада',
+'recentchanges-label-newpage' => 'И ишлемишчиди цlийи чар туькlуьрна',
+'recentchanges-label-minor' => 'И гъвечlи дегишарун',
+'recentchanges-label-bot' => 'Дегишунар авуна ботди',
+'recentchanges-label-unpatrolled' => 'И ишлемишчи ахтармишзач',
+'rcnote' => "КIеник {{PLURAL:$1|is '''1''' change|Ñхиримжи '''$1''' дегишунар}} заманада {{PLURAL:$2|day|'''$2''' йикъар}}, икIа $5, $4",
+'rcnotefrom' => "Кlеник къалурна дегишунар идлай '''$2''' (идалди '''$1''' къалурна).",
+'rclistfrom' => 'Къалурун дегишунар идай: $1',
+'rcshowhideminor' => '$1 бицlи дегишунар',
+'rcshowhidebots' => '$1 бот',
+'rcshowhideliu' => '$1 СиÑтемадиз гьахьнай ишлемишчиÑÑ€',
+'rcshowhideanons' => '
$1 Кlевхьанай ишлемишчи',
-'rcshowhidemine' => '$1 зин дигишунар',
-'rclinks' => 'Къалурун Ñхиримжи $1 Ñа ÑÑтинлай $2 йикъал $3',
-'diff' => 'тафават',
-'hist' => 'тарих',
-'hide' => 'Чуьнуьхун',
-'show' => 'Къаларун',
-'minoreditletter' => 'г',
-'newpageletter' => 'ЦI',
-'boteditletter' => 'б',
+'rcshowhidepatr' => '$1 шаидвал авунай дегишунар',
+'rcshowhidemine' => '$1 зин дигишунар',
+'rclinks' => 'Къалурун Ñхиримжи $1 Ñа ÑÑтинлай $2 йикъал $3',
+'diff' => 'тафават',
+'hist' => 'тарих',
+'hide' => 'Чуьнуьхун',
+'show' => 'Къаларун',
+'minoreditletter' => 'г',
+'newpageletter' => 'ЦI',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'Къалурун (герекзава JavaScript)',
+'rc-enhanced-hide' => 'Кlевун метлеб',
# Recent changes linked
-'recentchangeslinked' => 'Сахьтин дегишунар',
-'recentchangeslinked-page' => 'Чарчин тlар:',
+'recentchangeslinked' => 'Сахьтин дегишунар',
+'recentchangeslinked-toolbox' => 'Галкlанавай дегишунар',
+'recentchangeslinked-title' => 'Дегинарун, галкlанавай "$1"',
+'recentchangeslinked-noresult' => 'Са дегишунарни галкlанавай алукьунра кхьенай вахтунда.',
+'recentchangeslinked-summary' => "Цlарар кlватlал Ñхиримжи дегишунар чарарал, чар алукьзавай (ва Ñкъечlзавай къалурнавай кlватlалдай).Чарар идаз [[Special:Watchlist|your watchlist]] жезава '''викlегь'''.",
+'recentchangeslinked-page' => 'Чарчин тlар:',
+'recentchangeslinked-to' => 'Къалур дегишунар и чарарал, алукьзавай къалурнай чарчел',
# Upload
'upload' => 'Парвиниз шикил',
+'uploadlogpage' => 'Кхьин хъувун тlар',
+'filedesc' => 'Резуьме',
'uploadedimage' => 'Цун хъувун"[[$1]]"',
+'license' => 'Лицинзироватун:',
+'license-header' => 'Лицинзираватун',
+
# Special:ListFiles
'listfiles_date' => 'Ðумра',
'listfiles_name' => 'ТIар',
@@ -341,18 +509,27 @@ $1 Кlевхьанай ишлемишчи',
'listfiles_size' => 'Кьадар',
# File description page
-'file-anchor-link' => 'Шикил',
-'filehist' => 'Шикил тарих',
-'filehist-deleteall' => 'вири къакъудун',
-'filehist-deleteone' => 'къакъудун',
-'filehist-current' => 'ток',
-'filehist-datetime' => 'Югъ/Заман',
-'filehist-thumb' => 'Бицlи шикилдал',
-'filehist-thumbtext' => 'Бицlи шкилдал, верÑидиз $1',
-'filehist-user' => 'Ишлемишчи',
-'filehist-comment' => 'Рахунар',
-'imagelinks' => 'Файлдин цlар',
-'shared-repo-from' => 'идай $1',
+'file-anchor-link' => 'Шикил',
+'filehist' => 'Шикил тарих',
+'filehist-help' => 'Эциг заман/вахт, шикил килигун патал, гьа и вахтунда авай.',
+'filehist-deleteall' => 'вири къакъудун',
+'filehist-deleteone' => 'къакъудун',
+'filehist-revert' => 'Хтун хъувун',
+'filehist-current' => 'ток',
+'filehist-datetime' => 'Югъ/Заман',
+'filehist-thumb' => 'Бицlи шикилдал',
+'filehist-thumbtext' => 'Бицlи шкилдал, верÑидиз $1',
+'filehist-user' => 'Ишлемишчи',
+'filehist-dimensions' => 'Кьадарар',
+'filehist-comment' => 'Рахунар',
+'imagelinks' => 'Файлдин цlар',
+'linkstoimage' => 'Къведай {{PLURAL: $1 | чар алукьзавай | $1 чарар алукьзава}} гьа и файлдал',
+'nolinkstoimage' => 'Ðва чарар алукьзавай и шикилдал',
+'sharedupload' => 'И шикил $1 маÑÑа хакъидайра ишлемишатlа жезава.',
+'sharedupload-desc-here' => 'И шикил $1 ишлемишайтlа жеда маÑа хакъидайра.
+Кхьенар жувандал [$2 агъавурдин чар] къалурнава кlеник.',
+'uploadnewversion-linktext' => 'Хтун хъувун цlийи жюреÑÑ€ и шкилдин',
+'shared-repo-from' => 'идай $1',
# File reversion
'filerevert-comment' => 'Кар',
@@ -364,9 +541,14 @@ $1 Кlевхьанай ишлемишчи',
# MIME search
'mimesearch' => 'MIME ахтармишун',
+# Random page
+'randompage' => 'Гьакlан макъала',
+
# Statistics
'statistics' => 'СтатиÑтика',
+'disambiguationspage' => 'emplate:disambig',
+
'brokenredirects-edit' => 'дегишарун',
'brokenredirects-delete' => 'къакъудун',
@@ -374,8 +556,10 @@ $1 Кlевхьанай ишлемишчи',
'nbytes' => '$1 {{PLURAL:$1|байт|байтар}}',
'nmembers' => '$1 {{PLURAL:$1|юлдаш|юлдашар}}',
'lonelypages' => 'Eтим xъувун',
+'prefixindex' => 'Вири чарар Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð°Ð²Ð°Ð¹',
'shortpages' => 'Куьруь хъувун',
'longpages' => 'Яргъи хъувун',
+'usercreated' => 'Туькlуьрнава идай $1 идаз $2',
'newpages' => 'ЦIийи хъувун',
'move' => 'Юзун',
'movethispage' => 'Юзун и хъувун',
@@ -383,8 +567,9 @@ $1 Кlевхьанай ишлемишчи',
'pager-older-n' => '{{PLURAL:$1|иÑки 1|иÑки $1}}',
# Book sources
-'booksources' => 'Ктаб булах',
-'booksources-go' => 'Фин',
+'booksources' => 'Ктаб булах',
+'booksources-search-legend' => 'Жагъурун алукьзавай ктабар',
+'booksources-go' => 'Фин',
# Special:Log
'log' => 'Ктабар',
@@ -392,31 +577,47 @@ $1 Кlевхьанай ишлемишчи',
# Special:AllPages
'allpages' => 'Вири хъувун',
'alphaindexline' => '$1 -лай $2 -ди',
+'prevpage' => 'Ðлатай чар ($1)',
'allpagesfrom' => 'Къалур хъувун,идалай гатIунай:',
+'allpagesto' => 'Ðкъудан чарар, куьтÑгь жезвай:',
'allarticles' => 'Вири хъувун',
'allpagesnext' => 'Къведайди',
'allpagessubmit' => 'Фин',
+# Special:Categories
+'categories' => 'Кlватlалар',
+
# Special:LinkSearch
-'linksearch-ok' => 'Ðхтармишун',
+'linksearch' => 'Къецlин алукьунар',
+'linksearch-ok' => 'Ðхтармишун',
+'linksearch-line' => '$1 алукьун идал $2',
# Special:Log/newusers
'newuserlogpage' => 'Туькlуьрун ишлемишчидин ктаб',
'newuserlog-create-entry' => 'ЦIийи ишлемишчидин чин',
+# Special:ListGroupRights
+'listgrouprights-members' => '(цlацlидин кlватlалар)',
+
# E-mail user
'emailuser' => 'Къагъаз маÑÑа ишлемишчидиз',
'emailfrom' => 'Идай',
'emailmessage' => 'Хъагъаз',
# Watchlist
-'watchlist' => 'Ðхтармишунин чар',
-'mywatchlist' => 'Ðхтаришунин чар',
-'addedwatch' => 'Ктун хъувун ,ахтармишзай чарчхъ',
-'watch' => 'Гелкъуьн',
-'watchthispage' => 'Гелкъуьн и хъувун',
-'unwatch' => 'Ишлемиш тийизвай',
-'wlshowlast' => 'Къалур Ñхирижи $1 ÑÑтинлай $2 йикъалди $3',
+'watchlist' => 'Ðхтармишунин чар',
+'mywatchlist' => 'Ðхтаришунин чар',
+'watchlistfor2' => 'Ðдаз $1 $2',
+'addedwatch' => 'Ктун хъувун ,ахтармишзай чарчхъ',
+'addedwatchtext' => "Чар \"[[:\$1]]\" тун хъувунай куьн [[Special:Watchlist|watchlist]]. Къвезмай дегишунар и чарчел ва галкlанавай чарчихъ ихтилатар жеда инна, ахъатдава \"ÑакlÑƒÑ Ñцlу''''' инна [[Special:RecentChanges|list of recent changes]] гьам кьизил авун.",
+'removedwatch' => 'Чlурнава ахтармишзавай цlарцlÑй',
+'removedwatchtext' => 'Чар "[[:$1]]" Идай чlурнай [[Special:Watchlist|ахтармишунин цlарар]].',
+'watch' => 'Гелкъуьн',
+'watchthispage' => 'Гелкъуьн и хъувун',
+'unwatch' => 'Ишлемиш тийизвай',
+'watchlist-details' => '{{PLURAL:$1|$1 чар|$1 чарар}} куьн цlар, ихтилатрин чарар кlелтувурла.',
+'wlshowlast' => 'Къалур Ñхирижи $1 ÑÑтинлай $2 йикъалди $3',
+'watchlist-options' => 'Опцидин ахтармишунар',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Килигун...',
@@ -424,137 +625,219 @@ $1 Кlевхьанай ишлемишчи',
# Delete
'deletepage' => 'Къакъудун хъувун',
+'confirmdeletetext' => 'Квез чlуриз кlанзани чарар гьадан вири тарихар галаз. Буюр, Ñидикъара,куьне чlурзатlа, куьн агъавурда автlа вуч ийизатlа ва куьне ийизатlа жуьреда [[{{MediaWiki:Policy-url}}| политика]].',
+'actioncomplete' => 'Юзунар авуна',
+'actionfailed' => 'Юзунар ийиз хьанач',
+'deletedtext' => '"<nowiki>$1</nowiki>" чlурнайтир. Килиг $2 Ñхиримжи чlурунар ахтармишун.',
'deletedarticle' => 'къакъудун "[[$1]]"',
'dellogpage' => 'Чар къакъудун',
'deletecomment' => 'Кар',
+'deleteotherreason' => 'МаÑÑа/ ва мад кар',
'deletereasonotherlist' => 'МаÑа фагьум',
# Rollback
'rollbacklink' => 'авахьун далу',
# Protect
-'protectlogpage' => 'Куьмек гунин ктаб',
-'protectcomment' => 'Кар',
-'protectexpiry' => 'Ðлатна',
-'protect-default' => ' ЭхтиÑÑ€ гуз вири ишлемишчийриз',
-'protect-level-sysop' => 'Гилан къавха',
-'protect-summary-cascade' => 'къвалагай къвалагай',
-'protect-expiring' => 'алатиз $1 (UTC)',
-'restriction-type' => 'ИхтиÑÑ€:',
-'restriction-level' => 'Кьадардин кьадар',
+'protectlogpage' => 'Куьмек гунин ктаб',
+'protectedarticle' => 'къаравулазавайбри "[[$1]]"',
+'modifiedarticleprotection' => 'дегиш хьанахуьнун кьадар идаз "[[$1]]"',
+'protectcomment' => 'Кар',
+'protectexpiry' => 'Ðлатна',
+'protect_expiry_invalid' => 'Вахтун кьадар дуьзди туш.',
+'protect_expiry_old' => 'Вахтун кьадар алатай заманда.',
+'protect-text' => "Квевай клигайтlа ва дегишарайтlа жеза хуьнин къайда чарчин '''<nowiki>$1</nowiki>'''.",
+'protect-locked-access' => "Квез ахтиÑÑ€ авач дегишариз чарчин хуьн къайда. Ингье физвай туькlуьрунар чарчиз '''$1''':",
+'protect-cascadeon' => 'Хуьн авун чарар къараул ийизвай алай вахтунда, гьама ктуна{{PLURAL:$1|чар, гьама|чарар, гьабур}} галай галай хуьн куькlуьрна.Куьвай жеза дегишариз хуьнин кьадар чарчин, гьама кÑдач галай галай хуьнив.',
+'protect-default' => ' ЭхтиÑÑ€ гуз вири ишлемишчийриз',
+'protect-fallback' => 'Тlалабун "$1" ÑхтиÑÑ€',
+'protect-level-autoconfirmed' => 'Къаб цlийи ва кхьитунавай ишлемишчиÑÑ€',
+'protect-level-sysop' => 'Гилан къавха',
+'protect-summary-cascade' => 'къвалагай къвалагай',
+'protect-expiring' => 'алатиз $1 (UTC)',
+'protect-cascade' => 'Тажум чарчин куькlуьрнава и чарчел(пат пат тажум)',
+'protect-cantedit' => 'Кевай дегиш жедач и чар, вучиз лагьайтlа квез ахтиÑÑ€ авач амма дегишариз.',
+'restriction-type' => 'ИхтиÑÑ€:',
+'restriction-level' => 'Кьадардин кьадар',
# Restrictions (nouns)
'restriction-edit' => 'Дегишарун',
# Undelete
+'undeletelink' => 'ахъаюн/авайдаказ хъувун',
+'undeleteviewlink' => 'Ðчухун',
'undeletecomment' => 'Кар',
+'undeletedarticle' => 'Туькlуьр хъувуна "[[$1]]"',
'undelete-show-file-submit' => 'Э',
# Namespace form on various pages
'namespace' => 'Тlарарин гегьенш:',
+'invert' => 'Элкъуьруьн хкуднай',
'blanknamespace' => '(ÐÑул)',
# Contributions
-'contributions' => 'За авунай кIвалах',
-'mycontris' => 'За авунай кIвалах',
-'contribsub2' => 'Ðдаз ($1): ($2)',
-'uctop' => '(кIукI)',
-'year' => 'Са йиÑалай (ва дериндиз):',
-
+'contributions' => 'За авунай кIвалах',
+'contributions-title' => 'Ктунай пай икьван $1',
+'mycontris' => 'За авунай кIвалах',
+'contribsub2' => 'Ðдаз ($1): ($2)',
+'uctop' => '(кIукI)',
+'month' => ' Вацралай (ва фад)',
+'year' => 'Са йиÑалай (ва дериндиз):',
+
+'sp-contributions-newbies' => 'Къалурун ктунай пай, авунай цlийи ишлемишчийри',
'sp-contributions-blocklog' => 'чинрин хара',
+'sp-contributions-uploads' => 'жуьре',
+'sp-contributions-logs' => 'Дафтlар',
'sp-contributions-talk' => 'Рахун',
+'sp-contributions-search' => 'Жагъурун ктунай пай',
'sp-contributions-username' => 'IP адреÑÑ Ð¸ÑˆÐ»ÐµÐ¼Ð¸Ñ‡Ð¸Ð½ Ñ‚lарцlин',
+'sp-contributions-toponly' => 'Къалурун дегишунар, Ñхиримжи жуьреда авай',
'sp-contributions-submit' => 'Ðхтармишун',
# What links here
'whatlinkshere' => ' Гьихьтин чарар инна аватIа',
'whatlinkshere-title' => 'Чарар, алукьунин цlар идал "$1"',
'whatlinkshere-page' => 'Ишлемишчи',
+'linkshere' => "Къведай цlар алукьзава '''[[:$1]]''':",
+'nolinkshere' => "Къведай чарар алукьзава '''[[:$1]]'''.",
+'isredirect' => 'Ракъур хъувунин чар',
'istemplate' => 'ТранÑклипциÑ',
+'isimage' => 'алукьун и шкилдиз',
+'whatlinkshere-prev' => '{{PLURAL:$1|алатайди|алатайди $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|next|къведай $1}}',
+'whatlinkshere-links' => '↠цlарар',
'whatlinkshere-hideredirs' => '$1 маÑÑадал ракъурун',
-'whatlinkshere-hidetrans' => '',
+'whatlinkshere-hidetrans' => '$1 куькlуьрун',
'whatlinkshere-hidelinks' => '$1 алукьунин цlар',
+'whatlinkshere-hideimages' => '$1 Шикилдин алукьун',
'whatlinkshere-filters' => 'Филтер',
# Block/unblock
-'blockip' => 'Ишлемишзавайдан хара',
-'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',
-'blocklink' => 'тIаб',
-'unblocklink' => 'ахъа хъувун',
-'change-blocklink' => 'дегиш хьун блок',
-'contribslink' => 'ктунай пай',
-'blocklogpage' => 'Чинрин хара',
+'blockip' => 'Ишлемишзавайдан хара',
+'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' => 'Ишлемишчи акьвалун',
+'blocklink' => 'тIаб',
+'unblocklink' => 'ахъа хъувун',
+'change-blocklink' => 'дегиш хьун тlаб',
+'contribslink' => 'ктунай пай',
+'blocklogpage' => 'Чинрин хара',
+'blocklogentry' => 'акьвал хъувун[[$1]] вахтар алатайла $2 $3',
+'unblocklogentry' => 'Куьлегдай акъудун $1',
+'block-log-flags-nocreate' => 'ахтиÑÑ€ авач региÑтраци кьелунин кхьин',
# Move page
-'movearticle' => 'Юзун хъувун:',
-'newtitle' => 'Цlийи тlарцlихъ:',
-'move-watch' => 'Гелкъуьн и хъувун',
-'movepagebtn' => 'Юзун хъувун',
-'movetalk' => 'Югъун,галкlана рахун',
-'movereason' => 'Фагьум:',
-'revertmove' => 'хтун',
+'movepagetext' => "Ишлемишиз кlеневай къаб,чарчин Ñ‚lар дегишариp, кьиÑпеÑдин чка дегишарун, цlийи Ñ‚lар авун.
+ИÑки Ñ‚lарцlи ракъурда цlийи Ñ‚lарцlел.
+Квевай жеда цlийи хъийиз ракъурун, къалурзай дуьз тlарцlел вуч вичиз.
+Квез кlанзаштlа,рекlел алудмир ахтармишиз инна [[Special:DoubleRedirects|double]] ва [[Special:BrokenRedirects|broken redirects]].
+Куьне тухузва шаидвал,мадни гьабур гьамиша алукьдайвал, гьиниз гьабур фена кlанзатl.
+
+Ðхтармиша, чар ''ваъ''' ракъур хьун, гьахьтин Ñ‚lар алай чар ава, гьама ичlиди ÑÑ‚lа, ракъурнатlа ва дегишарунин кьиÑÐ¿ÐµÑ Ð°Ð²Ð°Ñ‡Ñ‚lа.
+Кевай жеда гьа чар Ñ‚lар дегишараз кьулукъ гьаниз Ñлкъуьриз, гьина гьадан Ñ‚lар дегиш авунатlа, куьне гъалатl авунатlа, куьне чин тийиз авай чарчик гъалатl тада.
+
+'''Килига!'''
+Ðмма бейхабар жеда гзаф герекзай чарариз;
+Буюр, килиг , куьне фикирзатlа вуч жезатlа, кхьин хъийидади.",
+'movepagetalktext' => "Ухшар авай чарар ихтилатдин, фида маÑÑа чкадал вуч вичиз ибур галаз''',амма:''' *Эчlи чар ихтилатдин ава цlийи Ñ‚lар алаз, ва *Куьне илÑйда пайдах кlеникай Гьа вахтунда, куьне чка дегишар авун или Ñанал авуна чар гъилелди, кlанда",
+'movearticle' => 'Юзун хъувун:',
+'newtitle' => 'Цlийи тlарцlихъ:',
+'move-watch' => 'Гелкъуьн и хъувун',
+'movepagebtn' => 'Юзун хъувун',
+'pagemovedsub' => 'Рахъурун хьана',
+'movepage-moved' => '\'\'"$1" рахъурнай "$2"\'\'\'',
+'articleexists' => 'Ðхьтин Ñ‚lар алай чар ава, амма Ñ‚lар, куьне хкÑнай дуьз туш.БашуьÑте, маÑÑа Ñ‚lар хкÑй.',
+'talkexists' => "'''Чарчин тlар дегишарна, чарчин ихтилатар дегишар жезатуш, вучиз лагьайтlа ихтилатар цlийи чарчел фена.Галкlура гълелди.'''",
+'movedto' => 'хтана иниз',
+'movetalk' => 'Югъун,галкlана рахун',
+'1movedto2' => 'хъфена [[$1]] идал [[$2]]',
+'1movedto2_redir' => 'къфена [[$1]] идаз [[$2]] ракъурунар',
+'movelogpage' => 'Дафтlардин чка дегишарун',
+'movereason' => 'Фагьум:',
+'revertmove' => 'хтун хъувун',
# Export
'export' => 'Чарар ракъурун',
# Namespace 8 related
+'allmessagesname' => 'Тlар',
+'allmessagesdefault' => 'Ðлавилел къагъаздин кхьин',
'allmessages-filter-all' => 'Вири',
# Thumbnails
-'thumbnail-more' => 'Эке хъувун',
+'thumbnail-more' => 'Эке хъувун',
+'thumbnail_error' => 'Миниатуьра туькlуьрдайла гъалатl:$1',
# Special:Import
'import-upload-filename' => 'Шикилдинтlар:',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Куьне ишлемишзавай чар',
-'tooltip-pt-mytalk' => 'Куьн рахазава чарчикай',
-'tooltip-pt-preferences' => 'Куьн хкÑгъунар',
-'tooltip-pt-watchlist' => 'Чарарин цlарар,куьне ахтармишзавай дегиш патал',
-'tooltip-pt-mycontris' => 'Куьне ктунай пулунин чар',
-'tooltip-pt-login' => 'Квез буюрзава гьахьиз ÑиÑтемадиз; тефейтlани жезва',
-'tooltip-pt-logout' => 'ЭкъечIун',
-'tooltip-ca-talk' => 'Эхтилат авун чарчикай',
-'tooltip-ca-edit' => 'Квевай дегишариз жезва и чар.Ва Ñифте клигна ахпа хвена кlанда.',
-'tooltip-ca-addsection' => 'Гатlунив цlийи кьил',
-'tooltip-ca-history' => 'Эхиремжи жуьреÑÑ€ и чарчин',
-'tooltip-ca-protect' => 'Xуьн и хъувун',
-'tooltip-ca-delete' => 'Къакъудун и хъувун',
-'tooltip-ca-move' => 'Юзун и хъувун',
-'tooltip-ca-watch' => 'Чар ктун хъувун куьне ахтармишзавай цlарцlик',
-'tooltip-search' => 'Ðхтармишун {{SITENAME}}',
-'tooltip-search-go' => 'Чарчел фин, дуьз тIар аваз хьайитIа',
-'tooltip-search-fulltext' => 'Чар жагъурун и кхьинриз',
-'tooltip-n-mainpage' => 'Мугьманвал чIехи чинал',
-'tooltip-n-mainpage-description' => 'Мугьманваал чIехи чарчел',
-'tooltip-n-portal' => 'Проекдикай, квегай вуч ийиз жедатl, шеÑÑ€ гинай жагъурда',
-'tooltip-n-recentchanges' => 'Эхиримжи дигишунрин чарчин цIарар wiki-да',
-'tooltip-n-randompage' => 'Галкlан чарчин',
-'tooltip-n-help' => 'Утlана жагъурунин чка',
-'tooltip-t-whatlinkshere' => 'Цlарар вики чарчин, алукьун инна',
-'tooltip-t-recentchangeslinked' => 'Эхиримжи чарарин дигишунар, чарчихъ галкlанавай',
-'tooltip-feed-rss' => 'RSS хуьрек и чарчиз',
-'tooltip-feed-atom' => 'Atom хуьрек и чарчиз',
-'tooltip-t-upload' => 'Парвиниз шикил',
-'tooltip-t-specialpages' => 'Цlар вири герек чарfh',
-'tooltip-t-print' => ' Ðкъудунин и чарчин жуьре',
-'tooltip-t-permalink' => 'Гьамишан алукьун гьа и килиг хъувуниз',
-'tooltip-ca-nstab-main' => 'Килигун чарче авай кхьинар',
-'tooltip-ca-nstab-user' => 'Ишлемишчидин чарчиз клигун',
-'tooltip-ca-nstab-special' => 'Имма далу чар,квевай чар дегиш жезатуш',
-'tooltip-ca-nstab-project' => 'Проектин чарчиз килигун',
-'tooltip-ca-nstab-image' => 'Шкилдиз килигу',
-'tooltip-minoredit' => 'Марк имма ÑакlуÑкьван дегишунар',
-'tooltip-save' => 'Куьн дегишунар хуьн',
-'tooltip-diff' => 'Къалурун,куьне вуч дегишенур авунутlа',
-'tooltip-watch' => 'Чар ктун хъувун куьне ахтармишзавай цlарцlик',
+'tooltip-pt-userpage' => 'Куьне ишлемишзавай чар',
+'tooltip-pt-mytalk' => 'Куьн рахазава чарчикай',
+'tooltip-pt-preferences' => 'Куьн хкÑгъунар',
+'tooltip-pt-watchlist' => 'Чарарин цlарар,куьне ахтармишзавай дегиш патал',
+'tooltip-pt-mycontris' => 'Куьне ктунай пулунин чар',
+'tooltip-pt-login' => 'Квез буюрзава гьахьиз ÑиÑтемадиз; тефейтlани жезва',
+'tooltip-pt-logout' => 'ЭкъечIун',
+'tooltip-ca-talk' => 'Эхтилат авун чарчикай',
+'tooltip-ca-edit' => 'Квевай дегишариз жезва и чар.Ва Ñифте клигна ахпа хвена кlанда.',
+'tooltip-ca-addsection' => 'Гатlунив цlийи кьил',
+'tooltip-ca-viewsource' => 'И чар хвенава. Квевай жеда килигиз адан дувул',
+'tooltip-ca-history' => 'Эхиремжи жуьреÑÑ€ и чарчин',
+'tooltip-ca-protect' => 'Xуьн и хъувун',
+'tooltip-ca-delete' => 'Къакъудун и хъувун',
+'tooltip-ca-move' => 'Юзун и хъувун',
+'tooltip-ca-watch' => 'Чар ктун хъувун куьне ахтармишзавай цlарцlик',
+'tooltip-ca-unwatch' => 'Чlурун и чар куьн ахтармишзавай цlaрцlÑй',
+'tooltip-search' => 'Ðхтармишун {{SITENAME}}',
+'tooltip-search-go' => 'Чарчел фин, дуьз тIар аваз хьайитIа',
+'tooltip-search-fulltext' => 'Чар жагъурун и кхьинриз',
+'tooltip-p-logo' => 'Муьманвал чlехи чарчел',
+'tooltip-n-mainpage' => 'Мугьманвал чIехи чинал',
+'tooltip-n-mainpage-description' => 'Мугьманваал чIехи чарчел',
+'tooltip-n-portal' => 'Проекдикай, квегай вуч ийиз жедатl, шеÑÑ€ гинай жагъурда',
+'tooltip-n-currentevents' => 'Жагъурун хакъидай хабар, физай Ñхтилатрин',
+'tooltip-n-recentchanges' => 'Эхиримжи дигишунрин чарчин цIарар wiki-да',
+'tooltip-n-randompage' => 'Галкlан чарчин',
+'tooltip-n-help' => 'Утlана жагъурунин чка',
+'tooltip-t-whatlinkshere' => 'Цlарар вики чарчин, алукьун инна',
+'tooltip-t-recentchangeslinked' => 'Эхиримжи чарарин дигишунар, чарчихъ галкlанавай',
+'tooltip-feed-rss' => 'RSS хуьрек и чарчиз',
+'tooltip-feed-atom' => 'Atom хуьрек и чарчиз',
+'tooltip-t-contributions' => 'Ðчух авун идан Ñадакьадин цlар',
+'tooltip-t-emailuser' => 'Электрон пучтадай и ишлемичидал ракъурун',
+'tooltip-t-upload' => 'Парвиниз шикил',
+'tooltip-t-specialpages' => 'Цlар вири герек чарfh',
+'tooltip-t-print' => ' Ðкъудунин и чарчин жуьре',
+'tooltip-t-permalink' => 'Гьамишан алукьун гьа и килиг хъувуниз',
+'tooltip-ca-nstab-main' => 'Килигун чарче авай кхьинар',
+'tooltip-ca-nstab-user' => 'Ишлемишчидин чарчиз клигун',
+'tooltip-ca-nstab-special' => 'Имма далу чар,квевай чар дегиш жезатуш',
+'tooltip-ca-nstab-project' => 'Проектин чарчиз килигун',
+'tooltip-ca-nstab-image' => 'Шкилдиз килигу',
+'tooltip-ca-nstab-template' => 'Ðхъаюн шаблон',
+'tooltip-ca-nstab-category' => 'Ðхъаюн кlватlалдин чар',
+'tooltip-minoredit' => 'Марк имма ÑакlуÑкьван дегишунар',
+'tooltip-save' => 'Куьн дегишунар хуьн',
+'tooltip-preview' => 'Сифте килиг авун ,башуьÑте, ишлемиша хуьн хъийидалди!',
+'tooltip-diff' => 'Къалурун,куьне вуч дегишенур авунутlа',
+'tooltip-compareselectedversions' => 'Ðкун алатунар хкÑгънай кьве ревизи и чарчин',
+'tooltip-watch' => 'Чар ктун хъувун куьне ахтармишзавай цlарцlик',
+'tooltip-rollback' => '"ГелÑш" хквен хъийиз дегишариз гьа и чар, Ñхиримжи ни ктунатlа Ñа тажум',
+'tooltip-undo' => '"Ðкъвазун" хквен хъийиз и дегишарун ав ахъаюн дегишунрин къаб Ñифте килигунин жуьреда.Ðда ахтиÑÑ€ гузва кутаз хъийиз рюзедиз.',
+'tooltip-summary' => 'Тура бицlи резуьме',
+
+# Patrol log
+'patrol-log-line' => 'кхьена $1 идай $2 ахтармишнава $3',
+'patrol-log-diff' => 'жуьре $1',
# Browsing diffs
'previousdiff' => 'ИÑки дегишунар',
'nextdiff' => 'ЦIийи дегишунар',
# Media information
+'file-info-size' => '$1 × $2 пикÑелар, шикилдин кьадар: $3, MIME жуьре: $4',
+'file-nohires' => '<small>Чlехи ахъаюн авай жуьре авач.</small>',
+'svg-long-desc' => 'SVG файл, Ñ‚lарцlиÑвез $1 $2 × пикÑелÑÑ€, файлдин Ñргъивал:файлдин Ñргъивал: $3',
'show-big-image' => 'Михьиз чlехи хьун',
# Bad image list
@@ -565,7 +848,10 @@ $1 Кlевхьанай ишлемишчи',
Ва аммай рахъурунар Ñа цlарцlел гьиÑабзава кьилди,ва чарар,гьина файл цlарцlел фин жеда.',
# Metadata
-'metadata' => 'Мета замана югъ',
+'metadata' => 'Мета замана югъ',
+'metadata-help' => 'Шикилда мадни кхьинар ава, ктун хъийизай гьарфарин камерайрал, Ñканерал Ð¸ÑˆÐ»ÐµÐ¼Ð¸ÑˆÐ·Ð°Ð¹Ð´Ñ Ð°Ð²ÑƒÐ½ паталди, ва гьарфаралди. Шикил туькlуьрадла кьулухъ дегишарнатlа, шикил къайдадай фин тахьун мумкин Ñ.',
+'metadata-expand' => 'Къалурун дериндиз',
+'metadata-collapse' => 'Кlевун дерин къалурунар',
# EXIF tags
'exif-contrast' => 'Рангар',
@@ -574,6 +860,10 @@ $1 Кlевхьанай ишлемишчи',
'exif-sharpness-1' => 'Жими',
+# External editor support
+'edit-externally' => 'Дегишарун и шкил, къецевай программа ишлемишна',
+'edit-externally-help' => '(Килиг [http://www.mediawiki.org/wiki/Manual:External_editors setup instructions] мадни чирунар килигун паталди)',
+
# 'all' in various places, this might be different for inflected languages
'recentchangesall' => 'вири',
'imagelistall' => 'вири',
@@ -602,12 +892,31 @@ $1 Кlевхьанай ишлемишчи',
'imgmultigo' => 'Ша!',
# Watchlist editing tools
-'watchlisttools-raw' => 'Клигзавай цlарцlин дегишунар',
+'watchlisttools-view' => 'Ðчух хъувун дегиширунар',
+'watchlisttools-edit' => 'Килигун ва дегишун ахтармизавай чарар кlватlал',
+'watchlisttools-raw' => 'Клигзавай цlарцlин дегишунар',
+
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Килиг:\'\'\' юзунин куьлег "$2" акьалзава Ñифте куьлег, ицигнавай "$1".',
# Special:SpecialPages
'specialpages' => 'Кьетlен хъувун',
+# External image whitelist
+'external_image_whitelist' => ' #Кхьихь и цlар икlа, гьа има чьих</pre>
+#Эцига гьамишан лугьунин кьатl (кьатl, физавай юкьвай //) кьеник
+#Гьабур Ñад жеда URL-Ð°Ð´Ñ€ÐµÑ ÐºÑŠÐµÑ†Ðµ патан (hotlinked) шикилдин
+#Жуьре акъатзавай шикил хьиз, акатlа къалурда алукьун шикилдал
+#Цlарар гатlузавай #, гьиÑабзава ихтилатрай
+#Гьама ригиÑÑ‚Ñ€ галачиз
+
+#Кхьихьа гьамишан лугьунар кьатlар цlарцlин винелай.Кхьихь гьа цlар икlа, има хьиз </ PRE>',
+
# Special:Tags
-'tags-edit' => 'дегишарун',
+'tag-filter' => '[[Special:Tags|Tag]] филтар:',
+'tags-edit' => 'дегишарун',
+
+# Special:ComparePages
+'compare-page1' => 'Чар 1',
);
diff --git a/languages/messages/MessagesLfn.php b/languages/messages/MessagesLfn.php
index 73238a0e..db5283b3 100644
--- a/languages/messages/MessagesLfn.php
+++ b/languages/messages/MessagesLfn.php
@@ -48,8 +48,7 @@ $messages = array(
'tog-editsection' => 'Engrana la edita de sesion via lias de {edita}.',
'tog-editsectiononrightclick' => 'Engrana la edita de sesion par clica a la destra a titulos de sesion (JavaScript)',
'tog-showtoc' => 'Mostra la table de contenis (per pajes con plu ce tre titulos)',
-'tog-rememberpassword' => 'Memora me sinia per entra a esta computador',
-'tog-editwidth' => 'La caxa de editas ave la longia masima',
+'tog-rememberpassword' => 'Memora me sinia per entra a esta computador (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Junta la pajes ce me ia creada a me lista de pajes oservada',
'tog-watchdefault' => 'Junta pajes ce me ia edita a me lista de pajes oservada',
'tog-watchmoves' => 'Junta pajes ce me ia moveda a me lista de pajes oservada',
@@ -289,7 +288,7 @@ $messages = array(
'yourname' => 'Nom de usor:',
'yourpassword' => 'Sinia de entra:',
'yourpasswordagain' => 'Retape la sinia:',
-'remembermypassword' => 'Memora me sinia de entra a esta computador',
+'remembermypassword' => 'Memora me sinia de entra a esta computador (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Tu domina:',
'login' => 'Identifia',
'nav-login-createaccount' => 'Sinia per entra',
@@ -400,8 +399,6 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita esta paje]</span>.',
'copyrightwarning' => "Per favore nota ce tota labora a {{SITENAME}} es judida ce el es relasada su la $2 (vide $1 per detalias). Si tu no desira ce tu scrives ta es editada sin compati e redistribui sin tu permite, no sumita el asi!<br />
Tu ance promete a nos ce tu ia scriveda esta par tu mesma, o copiada esta de un domina publica o otra orijin libre.
'''NO SUMITA LABORA SU DIRETOS DE AUTOR SIN PERMITE!!'''",
-'longpagewarning' => "'''AVISA: Esta paje usa $1 kilotetas; alga surfadores pote ave problemes con la edita de pajes plu grande ce 32 ko.
-Per favore, considera parti la paje en pesos plu poca.'''",
'templatesused' => '{{PLURAL:$1|Modele|Modeles}} usada en esta paje:',
'templatesusedpreview' => '{{PLURAL:$1|Modele|Modeles}} usada en esta previde:',
'template-protected' => '(protejeda)',
@@ -691,7 +688,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Pajes oservada',
'mywatchlist' => 'Me lista de pajes oservada',
-'watchlistfor' => "(per '''$1''')",
'nowatchlist' => 'Tu ave no cosas en tu lista oservada',
'addedwatch' => 'Juntada a la lista de pajes oservada',
'addedwatchtext' => "La paje \"[[:\$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]].
@@ -921,9 +917,9 @@ En esta casos, tu va nesesa move o fusa la paje per mano, si desirada.",
# Media information
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|paje|pajes}}',
-'file-info-size' => '($1 × $2 pixel, grandia de fix: $3, MIME tipo: $4)',
+'file-info-size' => '$1 × $2 pixel, grandia de fix: $3, MIME tipo: $4',
'file-nohires' => '<small>No plu densia posable.</small>',
-'svg-long-desc' => '(SVG fix, per nom $1 × $2 pixeles, grandia de fix: $3)',
+'svg-long-desc' => 'SVG fix, per nom $1 × $2 pixeles, grandia de fix: $3',
'show-big-image' => 'Densia masima',
'show-big-image-thumb' => '<small>Grandia de eesta previde: $1 × $2 pixeles</small>',
diff --git a/languages/messages/MessagesLg.php b/languages/messages/MessagesLg.php
index 6379a875..75024fcf 100644
--- a/languages/messages/MessagesLg.php
+++ b/languages/messages/MessagesLg.php
@@ -26,7 +26,7 @@ $messages = array(
'tog-editsection' => "Emiko ku mpapula gibengako enyunzi eza '[kyusa]' ezikuggusa w'osobolera okugikyusiza.",
'tog-editsectiononrightclick' => "Okunyiga ku omutwe gw'omuko ku lupapula n'eppeesa erya ddyo kubikkulenga w'ogukyusiza (kyetaagisa 'JavaScript')",
'tog-showtoc' => 'Teekawo endagiriro (singa ku lupapula kubaako emitwe gisukka mu esatu)',
-'tog-rememberpassword' => 'Ekigambo kyange ekikuumi kitereke ku kompyuta eno',
+'tog-rememberpassword' => 'Tereka ekigambo kyange ekikuumi ku kompyuta eno (okumala {{PLURAL:$1|olunaku|ennaku ezitasukka mu}} $1)',
'tog-watchcreations' => "Empapula zenkolawo ziteekebwenga ku lukalala lw'ezo zengoberera",
'tog-watchdefault' => "Empapula zenkyusamu ziteekebwenga ku lukalala lw'ezo zengoberera",
'tog-watchmoves' => "Empapula zenkyusa erinnya ziteekebwenga ku lukalala lw'ezo zengoberera",
@@ -168,20 +168,20 @@ $messages = array(
'faqpage' => 'Project:Ebitera okubuuzibwa ku',
# Vector skin
-'vector-action-addsection' => 'Tandikawo emboozi endala',
-'vector-action-delete' => 'Gyawo olupapula luno',
-'vector-action-move' => 'Simbuliza',
-'vector-action-protect' => 'Ssiba',
-'vector-action-undelete' => 'Zawo',
-'vector-action-unprotect' => 'Gyako ebikugizo',
-'vector-namespace-main' => 'Lupapula',
-'vector-view-create' => 'Lukolewo',
-'vector-view-edit' => 'Kyusa',
-'vector-view-history' => 'Ennanda ya fayiro eno',
-'vector-view-view' => 'Soma',
-'vector-view-viewsource' => "Kebera obulambike obw'ennono obw'olupapula luno",
-'actions' => "By'oyinza okukola",
-'namespaces' => 'Makuŋaanyizo',
+'vector-action-addsection' => 'Tandikawo emboozi endala',
+'vector-action-delete' => 'Gyawo olupapula luno',
+'vector-action-move' => 'Simbuliza',
+'vector-action-protect' => 'Ssiba',
+'vector-action-undelete' => 'Zawo',
+'vector-action-unprotect' => 'Gyako ebikugizo',
+'vector-simplesearch-preference' => "Wiki esobole okukuwa amagezi ku by'onoonya (kino kikolera mu ndabika ya Vector yokka)",
+'vector-view-create' => 'Lukolewo',
+'vector-view-edit' => 'Kyusa',
+'vector-view-history' => 'Ennanda ya fayiro eno',
+'vector-view-view' => 'Soma',
+'vector-view-viewsource' => "Kebera obulambike obw'ennono obw'olupapula luno",
+'actions' => "By'oyinza okukola",
+'namespaces' => 'Makuŋaanyizo',
'errorpagetitle' => 'Kiremya',
'returnto' => 'Dda ku $1.',
@@ -242,6 +242,9 @@ Olw'obungi bw'abakebera olupapula olwo, kompyuta zaffe tezisobola kwongerako mul
Lindako akaseera oddemu ogezeeko okulukebera.
$1",
+'pool-timeout' => "Obudde obugere obw'okulinda okufuna obuyinza obw'okulukozesa buweddeko",
+'pool-queuefull' => "Olukalala lw'emirimu egirinda okukolebwako lujjudde",
+'pool-errorunknown' => 'Ekireesewo kiremya tekitegeerese',
# 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' => 'Okutangaaza ku {{SITENAME}}',
@@ -412,7 +415,8 @@ Tewerabira kwetereereza [[Special:Preferences|enteekateeka yo ey'oku {{SITENAME}
'yourname' => "Ery'obwa memba",
'yourpassword' => 'Ekigambo ekikuumi',
'yourpasswordagain' => 'Ddamu ekigambo ekikuumi',
-'remembermypassword' => 'Tereka ekigambo kyange ekikuumi ku kompyuta eno',
+'remembermypassword' => 'Tereka ekigambo kyange ekikuumi ku kompyuta eno (okumala {{PLURAL:$1|olunaku|ennaku ezitasukka mu}} $1)',
+'securelogin-stick-https' => "Sigala ku mukutu gwa kika kya HTTPS ng'omaze okuyingira",
'yourdomainname' => 'Linnya lya twale lya kayungirizi lyo:',
'externaldberror' => "Waliwo kiremya mu ggwanika lya data ekozesebwa okukakasa bamemba oba tokkirizibwa okukyusa ku akawunti yo ey'awalala.",
'login' => 'Yingira',
@@ -429,6 +433,7 @@ Tewerabira kwetereereza [[Special:Preferences|enteekateeka yo ey'oku {{SITENAME}
'gotaccount' => "Akawunti wafuna? '''$1'''.",
'gotaccountlink' => 'Yingira',
'createaccountmail' => 'Akawunti gikole ne E-mail',
+'createaccountreason' => 'Ekikukozesezawo akawunti:',
'badretype' => "Ebigambo ebikuumi by'owandise tebifaanagana.",
'userexists' => "Ery'obwa memba ly'owandise wali omulala alirina.<br />
Londa eddala.",
@@ -457,6 +462,7 @@ Ddamu ogezeeko.",
Ddamu ogezeeko.',
'passwordtooshort' => 'Ekigambo ekikuumi kiteekwa okubaamu {{PLURAL:$1|akabonero wakiri kamu|obubonero obutakka wansi wa $1}}.',
'password-name-match' => "Tokkirizibwa kukozesa linnya lyo ery'obwa memba ng'ekigambo ekikuumi.",
+'password-login-forbidden' => "Ebigambo bino tebikkirizibwa kukozesebwa ng'amannya g'obwa memba oba bigambo bikuumi.",
'mailmypassword' => 'Nsindikira ekigambo ekikuumi ekipya',
'passwordremindertitle' => "Ekigambo ekikuumi eky'oku {{SITENAME}} ekipya. Kya kiseerabuseera.",
'passwordremindertext' => 'Waliwo eyayimidde ku ndagiriro eya IP $1 (tusuubiri nti ye ggwe) n\'asaba ekigambo ekikuumi eky\'oku {{SITENAME}} ($4) ekipya.<br />
@@ -499,6 +505,9 @@ Sooka olindeko akaseera okuddamu n'ate.",
'suspicious-userlogout' => "Sisitemu ezize ekiragiro kyo eky'okugivaamu kubanga kirabise nga ekivudde mu kalambulanetti enfu<br />
oba mu puloguramu etereka n'eddamu okuyisa ebiragiro ebivudde awalala.",
+# E-mail sending
+'php-mail-error-unknown' => "Wazzewo kiremya atategeerese mu mukolo mail() ogw'omu PHP",
+
# Password reset dialog
'resetpass' => 'Kyusa ekigambo ekikuumi',
'resetpass_announce' => "Weyambisa ekyama eky'ekiseerabuseera okuyingira.<br />
@@ -550,9 +559,12 @@ Oyinz'okuba nga wamaze okutegeka ekya ddala ekipya oba nga wakasabayo eky'ekisee
'showdiff' => 'Ndaga bwe bikyuse',
'anoneditwarning' => "'''Kulabula:''' Owandika toyingidde mu sisitemu. Tujjakuwandika endagiriro eya kompyuta kwosinzidde
mu lukalala lw'enkuykakyuka ez'omu lupapula luno.",
+'anonpreviewwarning' => "''Okola toyingidde sisitemu. Bw'on'okaza by'okola nga sisitemu ewandika n'endagiriro yo eya IP mu lukalala lw'enkyukakyuka lw'olupapula luno.''",
'missingsummary' => "'''Okujjukiza:''' Towandise ebinnyonyola enkyukakyuka z'okoze.<br />
Bw'oddamu okunyiga \"{{int:savearticle}}\", by'okoze tebijjakubaako okunnyonyola.",
'missingcommenttext' => 'Wandika ebigambo byo wano awaddako.',
+'missingcommentheader' => "'''Okujjukiza:''' Ebigambo byo tobiwadde omutwe.<br />
+Bw'oddamu okunyiga \"{{int:savearticle}}\", by'okoze tebijjakubaako omutwe ogubyanjula.",
'summary-preview' => 'Kuno kwe kunnyonyola kwo:',
'subject-preview' => 'Omutwe bwe gunaafaanana:',
'blockedtitle' => 'Ono agaanidwa',
@@ -637,6 +649,13 @@ aka ''Reload'', oba nyigira okumu amapeesa aga ''Ctrl'' ne ''F5'' oba aga ''Ctrl
'''Tannakazibwa.'''",
'userjspreview' => "'''Jukira nti JavaScript gw'otegese omugezesamubugezesa oba omulozakobulozi.'''<br />
'''Tannakazibwa.'''",
+'sitecsspreview' => "'''Jukira nti CSS ono omulozakobulozi.'''<br />
+'''Tannakazibwa.'''",
+'sitejspreview' => "'''Jukira nti JavaScript ono omulozakobulozi.'''<br />
+'''Tannakazibwa.'''",
+'userinvalidcssjstitle' => "'''Kulabula:''' Tewali endabika eyitibwa \"\$1\".<br />
+Empapula eza .css ne .js bamemba ze b'ekoledde, amannya ga zo ennukuta za mu<br />
+zonna ziteekwa okuba ntono, okugeza ''{{ns:user}}:Foo/vector.css'' so ssi ''{{ns:user}}:Foo/Vector.css''.",
'updated' => '(Ebituukanisidwa)',
'note' => "'''Okunnyonyola:'''",
'previewnote' => "'''Kuno kugezaamubugeza; by'okoze tebinnakazibwa!'''",
@@ -752,6 +771,8 @@ Agumenti ezo sistemu tezikozesezza.",
'currentrevisionlink' => 'Oluwandika oluliwo kakati',
'cur' => 'ebiriwo',
'last' => 'ebyasookawo bino',
+'page_first' => 'Olusooka',
+'page_last' => 'Olusembayo',
'histlegend' => "'''Ebyokugerageranizibwa:''' nyiga obutonnyeze ku likooda zoyagala okugerageranya olyoke onyige eppeesa erya 'Enter'<br />
oba ku gano agali ku lupapula luno.<br />
'''Ebigambo:''' (erw) = enjawulo ku ebiriwo, (eku) = enjawulo ku egikulembera, N = enkyukakyuka entono.",
@@ -1272,9 +1293,9 @@ Ob'oyagala okuyamba ku kuvvuunula eby'omu MediaWiki yonna, kebera ku [http://www
'nextdiff' => 'Enkyukakyuka ezaddako okukolebwa→',
# Media information
-'file-info-size' => '(pikseli $1 ku $2 , bunene bwa fayiro: $3, kika kya MIME: $4)',
+'file-info-size' => 'pikseli $1 ku $2 , bunene bwa fayiro: $3, kika kya MIME: $4',
'file-nohires' => '<small>Tewali kisingako wano.</small>',
-'svg-long-desc' => '(Fayiro ya kika kya SVG, ya pikselo $1 ku $2 awamu, ya obunene bwa: $3)',
+'svg-long-desc' => 'Fayiro ya kika kya SVG, ya pikselo $1 ku $2 awamu, ya obunene bwa: $3',
'show-big-image' => 'Laga ekifaananyi ekijjuvu',
'show-big-image-thumb' => '<small>Okulagako kuno kwa pikiseli: $1 ku $2</small>',
diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php
index 0b466e97..e443fcd3 100644
--- a/languages/messages/MessagesLi.php
+++ b/languages/messages/MessagesLi.php
@@ -50,94 +50,94 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dobbel doorverwiezinge' ),
- 'BrokenRedirects' => array( 'Gebraoke doorverwiezinge' ),
+ 'DoubleRedirects' => array( 'Dobbel_doorverwiezinge' ),
+ 'BrokenRedirects' => array( 'Gebraoke_doorverwiezinge' ),
'Disambiguations' => array( 'Verdudelikingspagina\'s' ),
'Userlogin' => array( 'Aanmelje' ),
'Userlogout' => array( 'Aafmelje' ),
- 'CreateAccount' => array( 'Gebroeker aonmake' ),
+ 'CreateAccount' => array( 'Gebroeker_aonmake' ),
'Preferences' => array( 'Veurkäöre' ),
'Watchlist' => array( 'Volglies' ),
- 'Recentchanges' => array( 'Lètste verangeringe' ),
+ 'Recentchanges' => array( 'Lètste_verangeringe' ),
'Upload' => array( 'Uploade' ),
'Listfiles' => array( 'Plaetjes' ),
- 'Newimages' => array( 'Nuuj plaetjes' ),
+ 'Newimages' => array( 'Nuuj_plaetjes' ),
'Listusers' => array( 'Gebroekers' ),
- 'Listgrouprights' => array( 'Groepsrechte weergaeve' ),
+ 'Listgrouprights' => array( 'Groepsrechte_weergaeve' ),
'Statistics' => array( 'Sjtattestieke' ),
- 'Randompage' => array( 'Willekäörig artikel' ),
+ 'Randompage' => array( 'Willekäörig_artikel' ),
'Lonelypages' => array( 'Weispagina\'s' ),
- 'Uncategorizedpages' => array( 'Óngecategoriseerde pagina\'s' ),
- 'Uncategorizedcategories' => array( 'Óngecategoriseerde categorieë' ),
- 'Uncategorizedimages' => array( 'Óngecategoriseerde plaetjes' ),
- 'Uncategorizedtemplates' => array( 'Óngecategorisserde sjablone' ),
- 'Unusedcategories' => array( 'Óngebroekde categorieë' ),
- 'Unusedimages' => array( 'Óngebroekde plaetjes' ),
- 'Wantedpages' => array( 'Gewunsjde pagina\'s' ),
- 'Wantedcategories' => array( 'Gewunsjde categorieë' ),
- 'Wantedfiles' => array( 'Gevraogde besjtande' ),
- 'Wantedtemplates' => array( 'Gevraogde sjablone' ),
- 'Mostlinked' => array( 'Meis gelinkde pazjena\'s' ),
- 'Mostlinkedcategories' => array( 'Meis gelinkde categorieë' ),
- 'Mostlinkedtemplates' => array( 'Meis gebroekde sjablone' ),
- 'Mostimages' => array( 'Meis gebroekde plaetjes' ),
- 'Mostcategories' => array( 'Meiste categorieë' ),
- 'Mostrevisions' => array( 'Meis bewirkde pagina\'s' ),
- 'Fewestrevisions' => array( 'Winnigs bewirkde pagina\'s' ),
- 'Shortpages' => array( 'Kórte pagina\'s' ),
- 'Longpages' => array( 'Lang pagina\'s' ),
- 'Newpages' => array( 'Nuuj pagina\'s' ),
- 'Ancientpages' => array( 'Audste pagina\'s' ),
- 'Deadendpages' => array( 'Doedloupende pagina\'s' ),
- 'Protectedpages' => array( 'Beveiligde pagina\'s' ),
- 'Protectedtitles' => array( 'Beveiligde titels' ),
- 'Allpages' => array( 'Alle pagina\'s' ),
- 'Prefixindex' => array( 'Alle artikele' ),
- 'Ipblocklist' => array( 'Geblokkeerde IP\'s' ),
- 'Specialpages' => array( 'Speciaal pagina\'s' ),
+ 'Uncategorizedpages' => array( 'Óngecategoriseerde_pagina\'s' ),
+ 'Uncategorizedcategories' => array( 'Óngecategoriseerde_categorieë' ),
+ 'Uncategorizedimages' => array( 'Óngecategoriseerde_plaetjes' ),
+ 'Uncategorizedtemplates' => array( 'Óngecategorisserde_sjablone' ),
+ 'Unusedcategories' => array( 'Óngebroekde_categorieë' ),
+ 'Unusedimages' => array( 'Óngebroekde_plaetjes' ),
+ 'Wantedpages' => array( 'Gewunsjde_pagina\'s' ),
+ 'Wantedcategories' => array( 'Gewunsjde_categorieë' ),
+ 'Wantedfiles' => array( 'Gevraogde_besjtande' ),
+ 'Wantedtemplates' => array( 'Gevraogde_sjablone' ),
+ 'Mostlinked' => array( 'Meis_gelinkde_pazjena\'s' ),
+ 'Mostlinkedcategories' => array( 'Meis_gelinkde_categorieë' ),
+ 'Mostlinkedtemplates' => array( 'Meis_gebroekde_sjablone' ),
+ 'Mostimages' => array( 'Meis_gebroekde_plaetjes' ),
+ 'Mostcategories' => array( 'Meiste_categorieë' ),
+ 'Mostrevisions' => array( 'Meis_bewirkde_pagina\'s' ),
+ 'Fewestrevisions' => array( 'Winnigs_bewirkde_pagina\'s' ),
+ 'Shortpages' => array( 'Kórte_pagina\'s' ),
+ 'Longpages' => array( 'Lang_pagina\'s' ),
+ 'Newpages' => array( 'Nuuj_pagina\'s' ),
+ 'Ancientpages' => array( 'Audste_pagina\'s' ),
+ 'Deadendpages' => array( 'Doedloupende_pagina\'s' ),
+ 'Protectedpages' => array( 'Beveiligde_pagina\'s' ),
+ 'Protectedtitles' => array( 'Beveiligde_titels' ),
+ 'Allpages' => array( 'Alle_pagina\'s' ),
+ 'Prefixindex' => array( 'Alle_artikele' ),
+ 'Ipblocklist' => array( 'Geblokkeerde_IP\'s' ),
+ 'Specialpages' => array( 'Speciaal_pagina\'s' ),
'Contributions' => array( 'Biedrage' ),
'Emailuser' => array( 'E-maile' ),
- 'Confirmemail' => array( 'E-mail bevestige' ),
- 'Whatlinkshere' => array( 'Verwiezinge nao hie' ),
- 'Recentchangeslinked' => array( 'Verwante verangeringe' ),
+ 'Confirmemail' => array( 'E-mail_bevestige' ),
+ 'Whatlinkshere' => array( 'Verwiezinge_nao_hie' ),
+ 'Recentchangeslinked' => array( 'Verwante_verangeringe' ),
'Movepage' => array( 'Verplaatse' ),
- 'Blockme' => array( 'Blokkeer mich' ),
+ 'Blockme' => array( 'Blokkeer_mich' ),
'Booksources' => array( 'Bookwinkele' ),
'Categories' => array( 'Categorieë' ),
'Export' => array( 'Exportere' ),
'Version' => array( 'Versie' ),
- 'Allmessages' => array( 'Alle berichte' ),
+ 'Allmessages' => array( 'Alle_berichte' ),
'Log' => array( 'Logbeuk', 'Logbook' ),
'Blockip' => array( 'Blokkere' ),
'Undelete' => array( 'Hersjtèlle' ),
'Import' => array( 'Importere' ),
- 'Lockdb' => array( 'DB blokkere' ),
- 'Unlockdb' => array( 'DB vriegaeve' ),
+ 'Lockdb' => array( 'DB_blokkere' ),
+ 'Unlockdb' => array( 'DB_vriegaeve' ),
'Userrights' => array( 'Gebroekersrechte' ),
- 'MIMEsearch' => array( 'MIME zeuke' ),
- 'FileDuplicateSearch' => array( 'Besjtandsduplicate zeuke' ),
- 'Unwatchedpages' => array( 'Neet-gevolgde pagina\'s' ),
+ 'MIMEsearch' => array( 'MIME_zeuke' ),
+ 'FileDuplicateSearch' => array( 'Besjtandsduplicate_zeuke' ),
+ 'Unwatchedpages' => array( 'Neet-gevolgde_pagina\'s' ),
'Listredirects' => array( 'Doorverwiezinge' ),
- 'Revisiondelete' => array( 'Versie ewegsjaffe' ),
- 'Unusedtemplates' => array( 'Óngebroekde sjablone' ),
- 'Randomredirect' => array( 'Willekäörige doorverwiezing' ),
- 'Mypage' => array( 'Mien pagina\'s' ),
- 'Mytalk' => array( 'Mien euverlèk' ),
- 'Mycontributions' => array( 'Mien biedrage' ),
+ 'Revisiondelete' => array( 'Versie_ewegsjaffe' ),
+ 'Unusedtemplates' => array( 'Óngebroekde_sjablone' ),
+ 'Randomredirect' => array( 'Willekäörige_doorverwiezing' ),
+ 'Mypage' => array( 'Mien_pagina\'s' ),
+ 'Mytalk' => array( 'Mien_euverlèk' ),
+ 'Mycontributions' => array( 'Mien_biedrage' ),
'Listadmins' => array( 'Systeemwèrkers' ),
'Listbots' => array( 'Botlies' ),
- 'Popularpages' => array( 'Populair pagina\'s' ),
+ 'Popularpages' => array( 'Populair_pagina\'s' ),
'Search' => array( 'Zeuke' ),
- 'Resetpass' => array( 'Wachwaord opnuuj insjtèlle' ),
- 'Withoutinterwiki' => array( 'Gein interwiki' ),
- 'MergeHistory' => array( 'Historie sameveuge' ),
+ 'Resetpass' => array( 'Wachwaord_opnuuj_insjtèlle' ),
+ 'Withoutinterwiki' => array( 'Gein_interwiki' ),
+ 'MergeHistory' => array( 'Historie_sameveuge' ),
'Filepath' => array( 'Besjtandspaad' ),
- 'Invalidateemail' => array( 'E-mail annulere' ),
- 'Blankpage' => array( 'Laege pagina\'s' ),
- 'LinkSearch' => array( 'Verwiezinge zeuke' ),
- 'DeletedContributions' => array( 'Eweggesjafde biedrage' ),
+ 'Invalidateemail' => array( 'E-mail_annulere' ),
+ 'Blankpage' => array( 'Laege_pagina\'s' ),
+ 'LinkSearch' => array( 'Verwiezinge_zeuke' ),
+ 'DeletedContributions' => array( 'Eweggesjafde_biedrage' ),
'Tags' => array( 'Labels' ),
- 'Activeusers' => array( 'Aktieve gebroekers' ),
+ 'Activeusers' => array( 'Aktieve_gebroekers' ),
);
$dateFormats = array(
@@ -170,8 +170,7 @@ $messages = array(
'tog-editsection' => 'Bewirke van secties via [bewirke] links',
'tog-editsectiononrightclick' => "Secties bewirke mit 'ne rechtermoesklik op sectietitels (JavaScript nudig)",
'tog-showtoc' => "Inhaudsopgaaf veur pagina's mit mie es 3 köpkes",
-'tog-rememberpassword' => "Wachwaord ónthauwe bie 't aafmèlde",
-'tog-editwidth' => "Editveldj euver de vol breide van 't sjirm weergaeve",
+'tog-rememberpassword' => 'Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})',
'tog-watchcreations' => "Pagina's die ich aanmaak automatisch volge",
'tog-watchdefault' => "Voog pagina's die se bewirks toe aan dien volglies",
'tog-watchmoves' => "Pagina's die ich verplaats automatisch volge",
@@ -317,31 +316,21 @@ $messages = array(
'faqpage' => 'Project:Väölgestjèlde vraoge',
# Vector skin
-'vector-action-addsection' => 'Voog köpke toe',
-'vector-action-delete' => 'Ewegsjaffe',
-'vector-action-move' => 'Verplaats',
-'vector-action-protect' => 'Besjirm',
-'vector-action-undelete' => 'Plaats trök',
-'vector-action-unprotect' => 'Gaef vrie',
-'vector-namespace-category' => 'Categorie',
-'vector-namespace-help' => 'Hölppaasj',
-'vector-namespace-image' => 'Bestandj',
-'vector-namespace-main' => 'Paasj',
-'vector-namespace-media' => 'Mediapaasj',
-'vector-namespace-mediawiki' => 'Berich',
-'vector-namespace-project' => 'Projekpaasj',
-'vector-namespace-special' => 'Speciaal paasj',
-'vector-namespace-talk' => 'Euverlègk',
-'vector-namespace-template' => 'Sjabloon',
-'vector-namespace-user' => 'Gebroeker',
-'vector-view-create' => 'Maak aan',
-'vector-view-edit' => 'Bewirk',
-'vector-view-history' => 'Bekiek de gesjiedenis',
-'vector-view-view' => 'Laes',
-'vector-view-viewsource' => 'Bekiek bróntèks',
-'actions' => 'Hanjeling',
-'namespaces' => 'Naamruumdes',
-'variants' => 'Anger vorme',
+'vector-action-addsection' => 'Voog köpke toe',
+'vector-action-delete' => 'Ewegsjaffe',
+'vector-action-move' => 'Verplaats',
+'vector-action-protect' => 'Besjirm',
+'vector-action-undelete' => 'Plaats trök',
+'vector-action-unprotect' => 'Gaef vrie',
+'vector-simplesearch-preference' => "Sjakel nuuj zeuksuggesties in (allein veur 't vectoroeterlik)",
+'vector-view-create' => 'Maak aan',
+'vector-view-edit' => 'Bewirk',
+'vector-view-history' => 'Bekiek de gesjiedenis',
+'vector-view-view' => 'Laes',
+'vector-view-viewsource' => 'Bekiek bróntèks',
+'actions' => 'Hanjeling',
+'namespaces' => 'Naamruumdes',
+'variants' => 'Anger vorme',
'errorpagetitle' => 'Fout',
'returnto' => 'Truuk nao $1.',
@@ -402,6 +391,9 @@ Te väöl gebroekers perberen óm dees pagina te bekieke.
Wach estebleef effe veurdets doe opnuuj toegank perbeers te kriege tót dees pagina.
$1',
+'pool-timeout' => "Timeout-wachte veur 't sloete",
+'pool-queuefull' => 'De wachrie van de pool is vól',
+'pool-errorunknown' => 'Ónbekènde fout',
# 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' => 'Euver {{SITENAME}}',
@@ -565,7 +557,8 @@ Vergaet neet dien [[Special:Preferences|veurkäöre veur {{SITENAME}}]] aan te p
'yourname' => 'Diene gebroekersnaam',
'yourpassword' => 'Die wachwaord',
'yourpasswordagain' => 'Wachwaord opnuuj intype',
-'remembermypassword' => 'Mien wachwaord onthouwe veur later sessies.',
+'remembermypassword' => 'Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})',
+'securelogin-stick-https' => 'Verbónje blieve via HTTPS nao aanmelle',
'yourdomainname' => 'Die domein',
'externaldberror' => "d'r Is 'n fout opgetraoje biej 't aanmelje biej de database of doe höbs gén toesjtömming diene externe gebroeker biej te wèrke.",
'login' => 'Aanmèlde',
@@ -582,6 +575,7 @@ Vergaet neet dien [[Special:Preferences|veurkäöre veur {{SITENAME}}]] aan te p
'gotaccount' => "Höbs te al 'ne gebroekersnaam? '''$1'''.",
'gotaccountlink' => 'Inlogge',
'createaccountmail' => 'via de e-mail',
+'createaccountreason' => 'Raeje:',
'badretype' => 'De ingeveurde wachwäörd versjille vanein.',
'userexists' => "De gebroekersnaam dae se höbs ingeveurd weurt al gebroek.<br />Kees estebleef 'ne angere naam.",
'loginerror' => 'Inlogfout',
@@ -601,6 +595,7 @@ Controleer dien spelling, of gebroek ongersjtaond formuleer om \'n [[Special:Use
'wrongpasswordempty' => "'t Ingegaeve wachwoord waor laeg. Perbeer 't obbenuujts.",
'passwordtooshort' => "Dien wachwaord is te kort. 't Mót minstes oet {{PLURAL:$1|1 teike|$1 teikes}} besjtaon.",
'password-name-match' => 'Die wachwaord mót anges zeen es diene gebroekersnaam.',
+'password-login-forbidden' => "'t Gebroek van deze gebroekersnaam mit dit wachwoord is neet toegesjtange.",
'mailmypassword' => "Sjik mich 'n nuuj wachwaord",
'passwordremindertitle' => 'Nuuj tiedelik wachwaord van {{SITENAME}}',
'passwordremindertext' => 'Emes (waorsjienlik dich zelf) haet vanaaf IP-adres $1 \'n nuuj wachwoord veur {{SITENAME}} ($4) verzoch. \'t Nuuj wachwoord veur gebroeker "$2" is "$3". Es dat dien bedoeling waor, mèl diech daan noe aan en kees \'n nuuj wachwoord. \'t Tiedelik wachwoord verluip euver {{PLURAL:$5|$5 daag|$5 daag}}.
@@ -637,6 +632,9 @@ Doe mós effe wachte ierdets te 't obbenuuts kens perbere.",
'loginlanguagelabel' => 'Taol: $1',
'suspicious-userlogout' => "Dien verzeuk óm aaf te melde is genegeerd, ómdet 't liek esof 't verzeuk is versjik door 'ne browser of cacheproxy dae kepot is.",
+# E-mail sending
+'php-mail-error-unknown' => "Dao haet ziech 'n ónbekénde fout veurgedaon in de mail()-functie van PHP",
+
# Password reset dialog
'resetpass' => 'Wachwaord obbenuuts insjtèlle',
'resetpass_announce' => "Doe bös aangemeld mèt 'ne tiejdelikke code dae per e-mail is toegezönje. Veur 'n nuuj wachwaord in om 't aanmelje te voltooie:",
@@ -685,9 +683,11 @@ Meugelik höbs doe dien wachwaord al gewiezig of 'n nuuj tiedelik wachwaord aang
'showlivepreview' => 'Bewèrking ter controle tuine',
'showdiff' => 'Toen verangeringe',
'anoneditwarning' => 'Doe bis neet aangemeld. Dien IP adres weurt opgesjlage in de historie van dees pagina.',
+'anonpreviewwarning' => "''Doe bös neet aangemeldj.''
+''Door dien bewèrking op te slaon wört dien IP-adres opgeslagen in de paginagesjiedenis.''",
'missingsummary' => "'''Herinnering:''' doe höbs gein samevatting opgegaeve veur dien bewirking. Es te weer op ''Pagina opslaon'' kliks weurt de bewirking zonger samevatting opgesjlage.",
'missingcommenttext' => 'Plaats dien opmèrking hiej onger, a.u.b.',
-'missingcommentheader' => "'''Let op:''' Doe höbs gén ongerwerp/kop veur deze opmèrking opgegaeve. Esse oppernuuj op \"opslaon\" kliks, wörd dien verangering zonger ongerwerp/kop opgeslage.",
+'missingcommentheader' => "'''Let op:''' Doe höbs gén ongerwerp/kop veur deze opmèrking opgegaeve. Esse oppernuuj op \"{{int:savearticle}}\" kliks, wörd dien verangering zonger ongerwerp/kop opgeslage.",
'summary-preview' => 'Naokieke samevatting:',
'subject-preview' => 'Naokieke ongerwerp/kop:',
'blockedtitle' => 'Gebroeker is geblokkeerd',
@@ -755,7 +755,12 @@ De leste bloklogregel wuuertj hiejónger t'r raodpleging gegaeve:",
'usercsspreview' => "'''Dit is allein 'n veurvertuun van dien perseunlike css, deze is neet opgeslage!'''",
'userjspreview' => "'''Lèt op: doe tes noe dien persuunlik JavaScript.'''
'''De pagina is neet opgesjlage!'''",
-'userinvalidcssjstitle' => "'''Waorsjuwing:''' d'r is geine skin \"\$1\". Let op: dien eige .css- en .js-pazjena's beginne mèt 'ne kleine letter, bijveurbeeld {{ns:user}}:Naam/monobook.css in plaats van {{ns:user}}:Naam/Monobook.css.",
+'sitecsspreview' => "'''Dit is allein 'n veurvertuin van de CSS.'''
+'''Deze is nog neet opgesjlage!'''",
+'sitejspreview' => "'''Dit is allein 'n veurvertuin van de JavaScriptcode.'''
+'''Deze is nog neet opgesjlage!'''",
+'userinvalidcssjstitle' => "'''Waarsjoewing:''' d'r is gein skin \"\$1\".
+Lèt op: dien eige .css- en .js-pagina's beginne mèt 'ne klein lètter, beveurbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
'updated' => '(Biegewèrk)',
'note' => "'''Opmirking:'''",
'previewnote' => "'''Lèt op: dit is 'n controlepagina; dien teks is nog neet opgesjlage!'''",
@@ -787,7 +792,6 @@ De mós dien eige verangeringe dao-in inpasse.
'copyrightwarning2' => "Mèrk op dat alle biedrages aan {{SITENAME}} kinne weure verangerd, aangepas of weggehaold door anger luuj. As te neet wils dat dienen tèks zoemer kint weure aangepas mós te 't hie neet plaatsje.<br />
De beluifs ós ouch dats te dezen tèks zelf höbs gesjreve, of gekopieerd van 'n brón in 't publiek domein of get vergliekbaars (zuug $1 veur details).
'''HIE GEIN AUTEURSRECHTELIK BESJIRMP WERK ZÓNGER TOESJTUMMING!'''",
-'longpagewarning' => "WAARSJOEWING: Dees pazjena is $1 kilobytes lank; 'n aantal browsers kint probleme höbbe mit 't verangere van pazjena's in de buurt van of groeter es 32 kB. Kiek ofs te sjtökker van de pazjena mesjiens kins verplaatse nao 'n nuuj pazjena.",
'longpageerror' => "'''ERROR: De teks diese höbs toegevoegd haet is $1 kilobyte
groot, wat groter is dan 't maximum van $2 kilobyte. Opslaon is neet meugelik.'''",
'readonlywarning' => "WAARSJUWING: De database is vasgezèt veur ongerhoud, dus op 't mement kins e dien verangeringe neet opsjlaon. De kins dien tèks 't biste opsjlaon in 'n tèksbesjtand om 't later hie nog es te prebere.
@@ -964,6 +968,8 @@ $1",
'logdelete-failure' => "'''De zichbaarheid van de logbookregel kos neet ingesteldj waere:'''
$1",
'revdel-restore' => 'Zichbaarheid verangere',
+'revdel-restore-deleted' => 'gwösj versies',
+'revdel-restore-visible' => 'zichber versies',
'pagehist' => 'Paginagesjiedenis',
'deletedhist' => 'Verwiederde gesjiedenis',
'revdelete-content' => 'inhoud',
@@ -1032,11 +1038,13 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
# Diffs
'history-title' => 'Gesjiedenis van "$1"',
'difference' => '(Versjil tösje bewirkinge)',
+'difference-multipage' => '(Versjil tösje paazjes)',
'lineno' => 'Tekslien $1:',
'compareselectedversions' => 'Vergeliek geselecteerde versies',
'showhideselectedversions' => 'Tuin/versjtaek geselecteerde versies',
'editundo' => 'maak óngedaon',
-'diff-multi' => '({{PLURAL:$1|éin tusseligkede versie wörd|$1 tusseligkede versies waere}} neet getuund)',
+'diff-multi' => '({{PLURAL:$1|Ein tusseligkende versie|$1 Tusseligkende versies}} dórch {{PLURAL:$2|eine gebroeker|$2 gebroekers}} {{PLURAL:$1|weurt|waere}} neet getuund)',
+'diff-multi-manyusers' => '($1 tösseligkende versies door mier es $2 gebroekers waere neet waergaeve)',
# Search results
'searchresults' => 'Zeukresultate',
@@ -1071,6 +1079,7 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
'searchprofile-everything-tooltip' => "Alle inhaud doorzeuke (inklusief euverlèkpagina's)",
'searchprofile-advanced-tooltip' => 'Zeuke in aongegeve naamruumdes',
'search-result-size' => '$1 ({{PLURAL:$2|1 waord|$2 wäörd}})',
+'search-result-category-size' => '{{PLURAL:$1|1 categorielid|$1 categorielede}} ({{PLURAL:$2|1 ongercategorie|$2 ongercategorieë}}, {{PLURAL:$3|1 bestandj|$3 bestenj}})',
'search-result-score' => 'Relevantie: $1%',
'search-redirect' => '(doorverwiezing $1)',
'search-section' => '(subkop $1)',
@@ -1149,6 +1158,7 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
'contextlines' => 'Aantal regels per gevónje pagina',
'contextchars' => 'Aantal teikes van de conteks per reigel',
'stub-threshold' => 'Drempel veur markering <a href="#" class="stub">begske</a>:',
+'stub-threshold-disabled' => 'Oetgezatj',
'recentchangesdays' => 'Aantal daag te tuine in de recènte verangeringe:',
'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|daag|daag}})',
'recentchangescount' => 'Standerd aantal waer te gaeve bewèrkinge:',
@@ -1182,6 +1192,7 @@ Hie volg n willekäörig gegenereerde waerde die se kins gebroeke: $1',
'prefs-files' => 'Bestenj',
'prefs-custom-css' => 'Persoonlijke CSS',
'prefs-custom-js' => 'Persoonlijke JS',
+'prefs-common-css-js' => 'Gedeilde CSS/JS veur eder vormgaeving:',
'prefs-reset-intro' => 'Gebroek dees functie om dien veurkäöre te herstelle nao de standaardinstellinge.
Dees hanjeling kin neet ongedaon gemaak waere.',
'prefs-emailconfirm-label' => 'E-mailbevestiging:',
@@ -1219,9 +1230,15 @@ Deze informatie is zichbaar veur angere gebroekers.',
'prefs-advancedrendering' => 'Wiejer instèllinger',
'prefs-advancedsearchoptions' => 'Wiejer instèllinger',
'prefs-advancedwatchlist' => 'Wiejer instèllinger',
-'prefs-display' => 'Toeaningsinstèllinger',
+'prefs-displayrc' => 'Toeaningsinstèllinger',
+'prefs-displaysearchoptions' => 'Toeaningsinstèllinger',
+'prefs-displaywatchlist' => 'Toeaningsinstèllinger',
'prefs-diffs' => 'Vers',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "'t E-mailadres liek geldig",
+'email-address-validity-invalid' => "Gif 'n geldig e-mailadres op",
+
# User rights
'userrights' => 'Gebroekersrechtebeheer',
'userrights-lookup-user' => 'Beheer gebroekersgróppe',
@@ -1305,6 +1322,7 @@ Deze informatie is zichbaar veur angere gebroekers.',
'right-hideuser' => "'ne gebroeker veur de euverige gebroekers verberge",
'right-ipblock-exempt' => 'IP-blokkades omzeile',
'right-proxyunbannable' => "Blokkades veur proxy's gelde neet",
+'right-unblockself' => 'Óntblok eige gebroeker',
'right-protect' => 'Beveiligingsniveaus wijzige',
'right-editprotected' => "Beveiligde pagina's bewerke",
'right-editinterface' => 'De gebroekersinterface bewerke',
@@ -1327,7 +1345,6 @@ Deze informatie is zichbaar veur angere gebroekers.',
'right-siteadmin' => 'De database blokkere en weer vriegaeve',
'right-reset-passwords' => 'Wachtwoorde van andere gebroekers opnieuw instelle',
'right-override-export-depth' => "Export paazjes midin geslinkdje paazjes mit 'n deepdje ven 5",
-'right-versiondetail' => 'Tuun oetgebreide versieinformatie van de software',
'right-sendemail' => 'Versjik e-mail aan anger gebroekers',
# User rights log
@@ -1378,14 +1395,9 @@ Deze informatie is zichbaar veur angere gebroekers.',
'recentchanges-legend' => 'Opties veur recènte verangeringe',
'recentchangestext' => 'op dees pagina kins doe de recènte verangeringe in deze wiki bekieke.',
'recentchanges-feed-description' => 'Volg de meis recente bewerkinge in deze wiki via deze feed.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - Nuuj pagina',
'recentchanges-label-newpage' => "Mit dees verangering is 'n nuuj pagina aangemaak",
-'recentchanges-legend-minor' => '$1 - klein verangering',
'recentchanges-label-minor' => "Dit is 'n klein bewirking",
-'recentchanges-legend-bot' => '$1 - botbewirking',
'recentchanges-label-bot' => "Dees bewirking is oetgeveurd door 'ne bot",
-'recentchanges-legend-unpatrolled' => '$1 - ongekónterleerde bewirking',
'recentchanges-label-unpatrolled' => 'Dees bewirking is nog neet gekónterleerd',
'rcnote' => "Hiejónger {{PLURAL:$1|steit de lètste bewirking|staon de lètste '''$1''' bewirkinge}} van de aafgeloupe {{PLURAL:$2|daag|'''$2''' daag}}, op $4, um $5.",
'rcnotefrom' => "Verangeringe sins <b>$2</b> (mit 'n maximum van <b>$1</b> verangeringe).",
@@ -1431,6 +1443,9 @@ Deze informatie is zichbaar veur angere gebroekers.',
'upload_directory_missing' => 'De uploadmap ($1) is neet aanwezig en kos neet aangemaak waere door de webserver.',
'upload_directory_read_only' => 'De webserver kin neet sjrieve in de uploadmap ($1).',
'uploaderror' => "fout in 't uploade",
+'upload-recreate-warning' => "'''Waorsjoewing: dr is e bestandj mit deze naam verwiederd of hernump.'''
+
+Hiejonger waere t verwiederlogbook en t hernummingslogbook veur dees pagina waergaeve:",
'uploadtext' => "Gebroek 't óngersjtaond formeleer óm besjtande te uploade.
Óm ierder biegedone besjtande te betrachte of te zeuke, gank nao de [[Special:FileList|lies van geüploade besjtande]].
Uploads waere ouch biegehauwte in 't [[Special:Log/upload|uploadlogbook]], ewegsjaffinge in 't [[Special:Log/delete|wislogbook]]
@@ -1467,6 +1482,17 @@ De lètste link is bedoeld veur mediabesjtande die gein plaetje zeen.",
Aangeweze {{PLURAL:\$3|bestandjstype|bestandjstypes}}zeen \$2.",
'filetype-banned-type' => "'''\".\$1\"''' is gein toegelaote bestandstype. Toegelaote {{PLURAL:\$3|bestandjtype|bestandjtypes}} zeen \$2.",
'filetype-missing' => 'Dit bestandj haet gein extensie (wie ".jpg").',
+'empty-file' => 't Bestandj det se perbeers te uploade had gein inhald.',
+'file-too-large' => 't Bestandj det se perbeers te uploade waas te groet.',
+'filename-tooshort' => "t Bestandj det se perbeers te uploade had 'ne te kórte bestandjsnaam.",
+'filetype-banned' => 't Bestandj det se perbeers te uploade waas van e neet-toegelaote bestandjstype.',
+'verification-error' => 'De verificatie van t bestandj det se probeers te uploade is misluk.',
+'hookaborted' => "De wieziging die se perbeers te make is aafgebraoke door 'nen oetbreidingshook.",
+'illegal-filename' => 'Deze bestandjsnaam is neet toegelaote.',
+'overwrite' => 'E bestandj euversjrieve geit neet.',
+'unknown-error' => "dr Is 'n ónbekènde fout opgetraoje.",
+'tmp-create-error' => 't Waas neet meugelik e tiedelik bestandj aan te make.',
+'tmp-write-error' => 'dr Is n fout opgetraoje bie t sjrieve van t tiedelik bestandj.',
'large-file' => 'Aanbeveling: maak bestenj neet groter dan $1, dit bestand is $2.',
'largefileserver' => "'t Bestandj is groter dan de instelling van de server toestuit.",
'emptyfile' => "'t Besjtand wats re höbs geupload is laeg. Dit kump waorsjienliek door 'n typfout in de besjtandsnaom. Kiek estebleef ofs te dit besjtand wirkelik wils uploade.",
@@ -1491,13 +1517,14 @@ Esse deze afbeelding in volledige resolutie höbs, upload dae afbeelding den. Wi
'file-exists-duplicate' => "Dit besjtandj is identiek aon {{PLURAL:$1|'t volgende besjtandj|de volgende besjtande}}:",
'file-deleted-duplicate' => 'n Bestandj det identiek is aan dit bestandj ([[:$1]]) is veurhaer verwiederd.
Raodpleeg t verwiederingslogbook veurdet se wiejer geis.',
-'successfulupload' => 'De upload is geluk',
'uploadwarning' => 'Upload waarsjuwing',
'uploadwarning-text' => 'Pas de ongerstaonde bestandjsbesjrieving aan en perbeer t daonao opnuuj.',
'savefile' => 'Bestand opsjlaon',
'uploadedimage' => 'haet ge-upload: [[$1]]',
'overwroteimage' => 'haet \'ne nuuje versie van "[[$1]]" toegevoeg',
'uploaddisabled' => 'Uploade is oetgesjakeld',
+'copyuploaddisabled' => 't Uploade van bestenj via nen URL is oetgezat.',
+'uploadfromurl-queued' => 'Dienen upload is in de wachrie geplaats.',
'uploaddisabledtext' => "'t uploade van bestenj is oetgesjakeld.",
'php-uploaddisabledtext' => 'PHP-bestanduploads zeen oetgesjakeld. Controleer a.u.b. de file_uploads-instelling.',
'uploadscripted' => 'Dit bestandj bevat HTML- of scriptcode die foutief door diene browser weergegaeve kinne waere.',
@@ -1516,6 +1543,15 @@ Raodpleeg t verwiederingslogbook veurdet se wiejer geis.',
Lèver zeker te zeen detse gesjik bös om door te gaon met 't uploade van dit bestand.
't verwiederingslogbook van dit bestand kinse hiej zeen:",
'filename-bad-prefix' => "De naam van 't bestand detse aan 't uploade bös begint met '''\"\$1\"''', wat 'ne neet-besjrievende naam is dae meestal automatisch door 'ne digitale camera wörd gegaeve. Kees estebleef 'ne dudelike naam veur dien bestand.",
+'upload-success-subj' => 'De upload is geluk',
+'upload-success-msg' => 'Dienen upload van [$2] is geslaag en is besjikbaar: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Uploadperbleem',
+'upload-failure-msg' => 'dr Waas e perbleem mit dienen upload veur [$2]:
+
+$1',
+'upload-warning-subj' => 'Uploadwaorsjoewing',
+'upload-warning-msg' => 'dr Waas e perbleem mit dienen upload van [$2].
+Gank trök nao t [[Special:Upload/stash/$1|uploadformuleer]] om dit perbleem te verhelpe.',
'upload-proto-error' => 'Verkeerd protocol',
'upload-proto-error-text' => "Uploads via deze methode vereise URL's die beginne met <code>http://</code> of <code>ftp://</code>.",
@@ -1575,6 +1611,7 @@ Klikke op 'ne kolomkop verangert de sortering.",
'listfiles_search_for' => 'Zeuk nao bestandj:',
'imgfile' => 'bestandj',
'listfiles' => 'Lies van aafbeildinge',
+'listfiles_thumb' => 'Miniatuurplaetje',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Naom',
'listfiles_user' => 'Gebroeker',
@@ -1687,8 +1724,8 @@ De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
'statistics-edits' => 'Paginabewerkinge sins t begin van {{SITENAME}}',
'statistics-edits-average' => 'Gemiddeld aantal bewerkinge per pagina',
'statistics-views-total' => "Totaal aantal weergegeve pagina's",
+'statistics-views-total-desc' => "'t Bekieke van neet-bestaonde pagina's en speciaal pagina's is neet inbegrepe",
'statistics-views-peredit' => "Weergegeve pagina's per bewerking",
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Jobqueuelengte]',
'statistics-users' => 'Geregistreerde [[Special:ListUsers|gebroekers]]',
'statistics-users-active' => 'Actieve gebroekers',
'statistics-users-active-desc' => "Gebroekers die in de aafgeloupe {{PLURAL:$1|daag|$1 daag}} 'ne hanjeling höbbe oetgevoerd",
@@ -1701,8 +1738,9 @@ Deze heure waarsjienlik direct nao 't zjuste ongerwerp te verwiezen.<br />
'ne pagina wörd gezeen es redirect wen d'r 'n sjabloon op stuit det gelink is vanaaf [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Dobbel redirects',
-'doubleredirectstext' => '<b>Kiek oet:</b> In dees lies kanne redirects sjtaon die neet dao-in toeshure. Dat kump meistal doordat nao de #REDIRECT nog anger links op de pazjena sjtaon.<br />
-Op eder raegel vings te de ierste redirectpazjena, de twiede redirectpazjena en de iesjte raegel van de twiede redirectpazjena. Normaal bevat dees litste de pazjena woe de iesjte redirect naotoe zouw mótte verwieze.',
+'doubleredirectstext' => "Dees lies haet paazjes mit redireks die nao anger redireks gaon.
+Op eder raegel vings te de ierste redirectpazjena, de twiede redirectpazjena en de iesjte raegel van de twiede redirectpazjena. Meistes bevat dees litste de pazjena woe de iesjte redirect naotoe zouw mótte verwieze.
+<del>Dórchstreipinge</del> zègke det 't al gedaon is.",
'double-redirect-fixed-move' => "[[$1]] is verplaats en is noe 'n doorverwiezing nao [[$2]]",
'double-redirect-fixer' => 'Doorverwiezinge opsjone',
@@ -1725,6 +1763,8 @@ Op eder raegel vings te de ierste redirectpazjena, de twiede redirectpazjena en
'nmembers' => '$1 {{PLURAL:$1|lid|lede}}',
'nrevisions' => '$1 {{PLURAL:$1|herzening|herzeninge}}',
'nviews' => '{{PLURAL:$1|eine kieër|$1 kieër}} bekeke',
+'nimagelinks' => "Gebroek op $1 {{PLURAL:$1|pagina|pagina's}}",
+'ntransclusions' => "Gebroek op $1 {{PLURAL:$1|pagina|pagina's}}",
'specialpage-empty' => 'Deze pagina is laeg.',
'lonelypages' => "Weispazjena's",
'lonelypagestext' => "Nao de ongerstäönde pagina's wörd vanoet {{SITENAME}} neet verweze.
@@ -1882,34 +1922,40 @@ Infermasie daoreuver èn de individueel rechter vinjs te [[{{MediaWiki:Listgroup
'listgrouprights-removegroup-self-all' => 'Wösj alle gruup van eige gebroeker',
# E-mail user
-'mailnologin' => 'Gein e-mailadres bekènd veur deze gebroeker',
-'mailnologintext' => "De mos zien [[Special:UserLogin|aangemèld]] en 'n gèldig e-mailadres in bie dien [[Special:Preferences|veurkäöre]] höbbe ingevuld om mail nao anger gebroekers te sjture.",
-'emailuser' => "Sjik deze gebroeker 'nen e-mail",
-'emailpage' => "Sjik gebroeker 'nen e-mail",
-'emailpagetext' => "Es deze gebroeker e geljig e-mailadres haet opgegaeve den kint g'r via dit formuleer e berich sjikke. 't E-mailadres wat geer heet opgegeve bie eur [[Special:Preferences|veurkäöre]] zal es versjikker aangegaeve waere.
+'mailnologin' => 'Gein e-mailadres bekènd veur deze gebroeker',
+'mailnologintext' => "De mos zien [[Special:UserLogin|aangemèld]] en 'n gèldig e-mailadres in bie dien [[Special:Preferences|veurkäöre]] höbbe ingevuld om mail nao anger gebroekers te sjture.",
+'emailuser' => "Sjik deze gebroeker 'nen e-mail",
+'emailpage' => "Sjik gebroeker 'nen e-mail",
+'emailpagetext' => "Es deze gebroeker e geljig e-mailadres haet opgegaeve den kint g'r via dit formuleer e berich sjikke. 't E-mailadres wat geer heet opgegeve bie eur [[Special:Preferences|veurkäöre]] zal es versjikker aangegaeve waere.
Dae kin dös drek reazjere.",
-'usermailererror' => "Foutmeljing biej 't zenje:",
-'defemailsubject' => 'E-mail van {{SITENAME}}',
-'noemailtitle' => 'Gein e-mailadres bekènd veur deze gebroeker',
-'noemailtext' => 'Deze gebroeker haet gein gèldig e-mailadres opgegaeve.',
-'nowikiemailtitle' => 'E-mail is neet toegestaon',
-'nowikiemailtext' => 'Deze gebroeker wil geine e-mail ontvange van anger gebroekers.',
-'email-legend' => 'ne E-mail versture nao ne angere gebroeker van {{SITENAME}}',
-'emailfrom' => 'Ven:',
-'emailto' => 'Aan:',
-'emailsubject' => 'Óngerwerp:',
-'emailmessage' => 'Berich:',
-'emailsend' => 'Sjik berich',
-'emailccme' => "Stuur 'n kopie van dit berich nao mien e-mailadres.",
-'emailccsubject' => 'Kopie van dien berich aan $1: $2',
-'emailsent' => 'E-mail sjikke',
-'emailsenttext' => 'Die berich is versjik.',
-'emailuserfooter' => 'Deze e-mail is verstuurd door $1 aan $2 door de functie "Deze gebroeker e-maile" van {{SITENAME}}.',
+'usermailererror' => "Foutmeljing biej 't zenje:",
+'defemailsubject' => 'E-mail van {{SITENAME}}',
+'usermaildisabled' => 'Gebroeker e-mail oetgezatj.',
+'usermaildisabledtext' => 'Doe kèns geinen e-mail sjikke nao anger gebroekers op deze wiki',
+'noemailtitle' => 'Gein e-mailadres bekènd veur deze gebroeker',
+'noemailtext' => 'Deze gebroeker haet gein gèldig e-mailadres opgegaeve.',
+'nowikiemailtitle' => 'E-mail is neet toegestaon',
+'nowikiemailtext' => 'Deze gebroeker wil geine e-mail ontvange van anger gebroekers.',
+'email-legend' => 'ne E-mail versture nao ne angere gebroeker van {{SITENAME}}',
+'emailfrom' => 'Ven:',
+'emailto' => 'Aan:',
+'emailsubject' => 'Óngerwerp:',
+'emailmessage' => 'Berich:',
+'emailsend' => 'Sjik berich',
+'emailccme' => "Stuur 'n kopie van dit berich nao mien e-mailadres.",
+'emailccsubject' => 'Kopie van dien berich aan $1: $2',
+'emailsent' => 'E-mail sjikke',
+'emailsenttext' => 'Die berich is versjik.',
+'emailuserfooter' => 'Deze e-mail is verstuurd door $1 aan $2 door de functie "Deze gebroeker e-maile" van {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Systeembrich naogelaote.',
+'usermessage-editor' => 'Sysyeembrich',
# Watchlist
'watchlist' => 'Volglies',
'mywatchlist' => 'Volglies',
-'watchlistfor' => "(veur '''$1''')",
+'watchlistfor2' => 'Veur $1 $2',
'nowatchlist' => "D'r sjtit niks op dien volglies.",
'watchlistanontext' => '$1 is verplich om dien volglies in te zeen of te wiezige.',
'watchnologin' => 'De bis neet aangemèld',
@@ -2024,7 +2070,10 @@ De lètste bewirking is gedaon door [[User:$3|$3]] ([[User talk:$3|euverlik]]{{i
'revertpage' => 'Wieziginge door [[Special:Contributions/$2|$2]] ([[User talk:$2|Euverlik]]) trukgedriejd tot de lètste versie door [[User:$1|$1]]',
'revertpage-nouser' => 'Wieziginge door (gwösdje gebroeker) trögkgezadj nao bie [[User:$1|$1]]',
'rollback-success' => 'Wieziginge door $1 trökgedrèjd; letste versie van $2 hersteld.',
-'sessionfailure' => "d'r Liek 'n probleem te zeen mit dien aanmelsessie. Diene hanjeling is gestop oet veurzorg taenge 'n beveiligingsrisico (det bestuit oet meugelik \"hijacking\"(euverkape) van deze sessie). Gao 'n pazjena trök, laaj die pazjena opnuuj en probeer 't nog ins.",
+
+# Edit tokens
+'sessionfailure-title' => 'Sessiefout',
+'sessionfailure' => "d'r Liek 'n probleem te zeen mit dien aanmelsessie. Diene hanjeling is gestop oet veurzorg taenge 'n beveiligingsrisico (det bestuit oet meugelik \"hijacking\"(euverkape) van deze sessie). Gao 'n pazjena trök, laaj die pazjena opnuuj en probeer 't nog ins.",
# Protect
'protectlogpage' => "Logbook besjermde pagina's",
@@ -2151,19 +2200,23 @@ $1",
'month' => 'Van maond (en ierder):',
'year' => 'Van jaor (en ierder):',
-'sp-contributions-newbies' => 'Tuin allein de biedrage van nuuj gebroekers',
-'sp-contributions-newbies-sub' => 'Veur nuujelinge',
-'sp-contributions-newbies-title' => 'Biedraag ven nuuj gebroekers',
-'sp-contributions-blocklog' => 'Blokkeerlogbook',
-'sp-contributions-deleted' => 'eweggesjafde gebroekersbiedrages',
-'sp-contributions-logs' => 'logbeuk',
-'sp-contributions-talk' => 'euverlèk',
-'sp-contributions-userrights' => 'gebroekersrechtebeheer',
-'sp-contributions-blocked-notice' => "Deze gebroeker is noe geblok.
+'sp-contributions-newbies' => 'Tuin allein de biedrage van nuuj gebroekers',
+'sp-contributions-newbies-sub' => 'Veur nuujelinge',
+'sp-contributions-newbies-title' => 'Biedraag ven nuuj gebroekers',
+'sp-contributions-blocklog' => 'Blokkeerlogbook',
+'sp-contributions-deleted' => 'eweggesjafde gebroekersbiedrages',
+'sp-contributions-uploads' => 'uploads',
+'sp-contributions-logs' => 'logbeuk',
+'sp-contributions-talk' => 'euverlèk',
+'sp-contributions-userrights' => 'gebroekersrechtebeheer',
+'sp-contributions-blocked-notice' => "Deze gebroeker is noe geblok.
De leste bloklogregel wuuertj hiejónger t'r raodpleging gegaeve:",
-'sp-contributions-search' => 'Zeuke nao biedrages',
-'sp-contributions-username' => 'IP-adres of gebroekersnaam:',
-'sp-contributions-submit' => 'Zeuk',
+'sp-contributions-blocked-notice-anon' => "Dit IP-adres is noe geblok.
+De leste bloklogregel wuuertj hiejónger t'r raodpleging gegaeve:",
+'sp-contributions-search' => 'Zeuke nao biedrages',
+'sp-contributions-username' => 'IP-adres of gebroekersnaam:',
+'sp-contributions-toponly' => 'Nör nuujste versies getuundj',
+'sp-contributions-submit' => 'Zeuk',
# What links here
'whatlinkshere' => 'Links nao dees pagina',
@@ -2222,7 +2275,6 @@ Zuug de [[Special:IPBlockList|lies van geblokkeerde IP-adresse]].',
'ipb-edit-dropdown' => 'Bewerk lies van rejer',
'ipb-unblock-addr' => 'Ónblokkeer $1',
'ipb-unblock' => "Ónblokkeer 'ne gebroeker of IP-adres",
-'ipb-blocklist-addr' => 'Bestaonde blokkades veur $1',
'ipb-blocklist' => 'Bekiek bestaonde blokkades',
'ipb-blocklist-contribs' => 'Biedraag ven $1',
'unblockip' => 'Deblokkeer IP adres',
@@ -2292,6 +2344,8 @@ Wils se de instellinge wiezige?',
'cant-block-while-blocked' => 'De kins anger gebroekers neet blokkere terwiel se zelf geblokkeerd bös.',
'cant-see-hidden-user' => 'De gebroeker dae se perbeers te blokke is al geblok en verbórge.
Ómdes se \'t rèch "hideuser" neet höbs, kèns se de blok neet bekieke of bewerke.',
+'ipbblocked' => 'Doe kèns gein anger gebroekers (ónt)blokke, ómdet se zèlf geblók bös.',
+'ipbnounblockself' => 'Doe moogs dichzèlf neet óntblokke.',
# Developer tools
'lockdb' => 'Database blokkere',
@@ -2380,6 +2434,7 @@ De doeltitel "[[:$1]]" besjteit al. Wils te dit artikel wisse óm ruumde te make
'immobile-source-page' => 'Deze pagina kin neet hernömp waere.',
'immobile-target-page' => "'t Is neet meugelik te hernömmen nao die paginanaam.",
'imagenocrossnamespace' => "'n Mediabestand kin neet nao 'n anger naamruumde verplaats waere",
+'nonfile-cannot-move-to-file' => 'Kèn gein neet-bestenj nao bestenj verplaatse.',
'imagetypemismatch' => "De nuje bestandjsextensie is neet gliek aan 't bestandjstype.",
'imageinvalidfilename' => 'De nuje bestandsnaam is ongeldig',
'fix-double-redirects' => 'Alle doorverwiezinge biewerke die verwieze nao de originele paginanaam',
@@ -2459,6 +2514,7 @@ Alle transwiki-importhanjelinge waere opgeslage in 't [[Special:Log/import|impor
'importstart' => "Pazjena's aan 't importere ...",
'import-revision-count' => '$1 {{PLURAL:$1|versie|versies}}',
'importnopages' => "Gein pazjena's te importere.",
+'imported-log-entries' => '$1 {{PLURAL:$1|logbookregel|logbookregele}} ingeveurdj.',
'importfailed' => 'Import is misluk: $1',
'importunknownsource' => 'Ónbekindj importbróntype',
'importcantopen' => "Kós 't importbestandj neet äöpene",
@@ -2552,6 +2608,8 @@ Alle transwiki-importhanjelinge waere opgeslage in 't [[Special:Log/import|impor
'tooltip-rollback' => 'Mit "trökdrieje" driejs doe mit eine klik de bewirking(e) trök van de lètste gebroeker dee dees pagina haet bewirk.',
'tooltip-undo' => 'Mit "óngedaon make" driejs te dees bewirking trök en koms te in \'t bewirkingsvinster.
Doe kans in de bewirkingssamevatting \'n reej opgaeve.',
+'tooltip-preferences-save' => 'Slaon veurkäöre óp',
+'tooltip-summary' => "Veur 'n kórte samevatting in",
# Metadata
'nodublincore' => 'Dublin Core RDF metadata is oetgesjakeld op deze server.',
@@ -2650,14 +2708,17 @@ $1",
'imagemaxsize' => "Meximale aafbeildjingsaafmaeting:<b r/>''(veur besjrievingspaasj)''",
'thumbsize' => 'Gruutde vanne thumbnail:',
'widthheightpage' => "$1×$2, $3 {{PLURAL:$3|pazjena|pazjena's}}",
-'file-info' => '(bestandsgruutde: $1, MIME-type: $2)',
-'file-info-size' => '($1 × $2 pixels, besjtandjgruutde: $3, MIME-type: $4)',
+'file-info' => 'bestandsgruutde: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 pixels, besjtandjgruutde: $3, MIME-type: $4',
'file-nohires' => '<small>Gein hogere resolutie besjikbaar.</small>',
-'svg-long-desc' => '(SVG-bestandj, nominaal $1 × $2 pixels, bestandsgruutde: $3)',
+'svg-long-desc' => 'SVG-bestandj, nominaal $1 × $2 pixels, bestandsgruutde: $3',
'show-big-image' => 'Vol resolutie',
'show-big-image-thumb' => '<small>Gruutde van deze afbeilding: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'herhaolendj',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kader|kadere}}',
+'file-info-png-looped' => 'herhaolendj',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|kieër|kieër}} aafgespeelj',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kader|kadere}}',
# Special:NewFiles
'newimages' => 'Nuuj plaetjes',
@@ -2967,27 +3028,27 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
'limitall' => 'al',
# E-mail address confirmation
-'confirmemail' => 'Bevèstig e-mailadres',
-'confirmemail_noemail' => 'Doe höbs gein geldig e-mailadres ingegaeve in dien [[Special:Preferences|veurkäöre]].',
-'confirmemail_text' => "Deze wiki vereis dats te dien e-mailadres instèls iedats te e-mailfuncties
+'confirmemail' => 'Bevèstig e-mailadres',
+'confirmemail_noemail' => 'Doe höbs gein geldig e-mailadres ingegaeve in dien [[Special:Preferences|veurkäöre]].',
+'confirmemail_text' => "Deze wiki vereis dats te dien e-mailadres instèls iedats te e-mailfuncties
gebroeks. Klik op de knop hieónger óm e bevèstegingsberich nao dien adres te
sjikke. D'n e-mail zal 'ne link mèt 'n code bevatte; eupen de link in diene
browser óm te bevestege dat dien e-mailadres werk.",
-'confirmemail_pending' => "Dao is al 'n bevestigingsberich aan dich versjik. Wens te zjus diene gebroeker aangemaak höbs, wach dan e paar minute pès 't aankump veurdets te opnuuj 'n e-mail leuts sjikke.",
-'confirmemail_send' => "Sjik 'n bevèstegingcode",
-'confirmemail_sent' => 'Bevèstegingsberich versjik.',
-'confirmemail_oncreate' => "D'r is 'n bevestigingscode nao dien e-mailadres versjik. Dees code is neet nudig óm aan te melje, meh doe mós dees waal bevestige veurdets te de e-mailmäögelikheite van deze wiki kèns nótse.",
-'confirmemail_sendfailed' => "{{SITENAME}} kós 't bevèstegingsberich neet versjikke.
+'confirmemail_pending' => "Dao is al 'n bevestigingsberich aan dich versjik. Wens te zjus diene gebroeker aangemaak höbs, wach dan e paar minute pès 't aankump veurdets te opnuuj 'n e-mail leuts sjikke.",
+'confirmemail_send' => "Sjik 'n bevèstegingcode",
+'confirmemail_sent' => 'Bevèstegingsberich versjik.',
+'confirmemail_oncreate' => "D'r is 'n bevestigingscode nao dien e-mailadres versjik. Dees code is neet nudig óm aan te melje, meh doe mós dees waal bevestige veurdets te de e-mailmäögelikheite van deze wiki kèns nótse.",
+'confirmemail_sendfailed' => "{{SITENAME}} kós 't bevèstegingsberich neet versjikke.
Zuug dien e-mailadres nao op óngeljige karakters.
't E-mailprogramma goof: $1",
-'confirmemail_invalid' => 'Óngeljige bevèstigingscode. De code is meugelik verloupe.',
-'confirmemail_needlogin' => 'Doe mós $1 óm dien e-mailadres te bevestige.',
-'confirmemail_success' => 'Dien e-mailadres is bevesteg. De kins noe inlogke en van de wiki genete.',
-'confirmemail_loggedin' => 'Dien e-mailadres is noe vasgelag.',
-'confirmemail_error' => "Bie 't opsjlaon van eur bevèstiging is get fout gegange.",
-'confirmemail_subject' => 'Bevèstiging e-mailadres veur {{SITENAME}}',
-'confirmemail_body' => "Emes, waorsjienlik doe vanaaf 't IP-adres $1, heet 'n account $2
+'confirmemail_invalid' => 'Óngeljige bevèstigingscode. De code is meugelik verloupe.',
+'confirmemail_needlogin' => 'Doe mós $1 óm dien e-mailadres te bevestige.',
+'confirmemail_success' => 'Dien e-mailadres is bevesteg. De kins noe inlogke en van de wiki genete.',
+'confirmemail_loggedin' => 'Dien e-mailadres is noe vasgelag.',
+'confirmemail_error' => "Bie 't opsjlaon van eur bevèstiging is get fout gegange.",
+'confirmemail_subject' => 'Bevèstiging e-mailadres veur {{SITENAME}}',
+'confirmemail_body' => "Emes, waorsjienlik doe vanaaf 't IP-adres $1, heet 'n account $2
aangemaak mit dit e-mailadres op {{SITENAME}}.
Eupen óm te bevèstige dat dit account wirkelik van dich is en de
@@ -3000,8 +3061,20 @@ Es geer dit *neet* zeet, vólg den deze link:
$5
Dees bevèstigingscode blief geljig tot $4",
-'confirmemail_invalidated' => 'De e-mailbevestiging is geannuleerdj',
-'invalidateemail' => 'E-mailbevestiging annulere',
+'confirmemail_body_changed' => "Emes, waersjienlik doe, met 't IP-adres \$1,
+haet 't e-mailadres geregistreerd veur gebroeker \"\$2\" op {{SITENAME}} gewiezig nao dit e-mailadres.
+
+Äöpen de volgende verwiezing in diene webbrowser om te bevestige des toe deze gebroeker bis en om de e-mailmeugelikhejen op {{SITENAME}} opnuuj te activere:
+
+\$3
+
+Es se dichzelf '''neet''' hees aangemeld, volg den de volgende verwiezing om de bevestiging van dien e-mailadres te annulere:
+
+\$5
+
+De bevestigingscode vervilt op \$4.",
+'confirmemail_invalidated' => 'De e-mailbevestiging is geannuleerdj',
+'invalidateemail' => 'E-mailbevestiging annulere',
# Scary transclusion
'scarytranscludedisabled' => '[Interwikitransclusie is oetgesjakeld]',
@@ -3041,6 +3114,7 @@ Bevesteg estebleef dats te dees pazjena ech obbenuujts wils aanmake.",
'table_pager_first' => 'Ierste pazjena',
'table_pager_last' => 'Lètste pazjena',
'table_pager_limit' => 'Tuin $1 resultate per pazjena',
+'table_pager_limit_label' => 'Deil per paasj:',
'table_pager_limit_submit' => 'Gank',
'table_pager_empty' => 'Gein resultate',
@@ -3098,6 +3172,7 @@ De kèns ouch [[Special:Watchlist/edit|'t sjtanderd bewirkingssjirm gebroeke]]."
'version-specialpages' => "Speciaal pazjena's",
'version-parserhooks' => 'Parserheuk',
'version-variables' => 'Variabele',
+'version-skins' => 'Vörmgevinge',
'version-other' => 'Euverige',
'version-mediahandlers' => 'Mediaverwerkers',
'version-hooks' => 'Heuk',
@@ -3109,6 +3184,13 @@ De kèns ouch [[Special:Watchlist/edit|'t sjtanderd bewirkingssjirm gebroeke]]."
'version-hook-subscribedby' => 'Geabonneerd door',
'version-version' => '(Versie $1)',
'version-license' => 'Licentie',
+'version-poweredby-credits' => "Deze wiki weurt aangedreve door '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'anger',
+'version-license-info' => "MediaWiki is vrieje sofware; de kins MediaWiki verspreien en/of aanpassen onger de veurwaerde van de GNU General Public License wie gepubliceerd door de Free Software Foundation; ofwaal versie 2 van de Licentie, of - nao diene wönsj - innig later versie.
+
+MediaWiki weurd verspreid in de haop det 't nuttig is, mer ZONGER INNIG GARANTIE; zonger zelfs de implicitiete garantie van VERKOUPBAARHEID of GESJIKHEID VEUR INNIG DOEL IN 'T BIEZÖNJER. Zuuch de GNU General Public License veur mier informatie.
+
+Same mit dit programma heurs se 'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de GNU General Public License] te höbben ontvange; zo neet, sjrief den nao de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA of [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html laes de licentie online].",
'version-software' => 'Geïnstallieërde sofwaer',
'version-software-product' => 'Perduk',
'version-software-version' => 'Versie',
@@ -3178,6 +3260,15 @@ Gaef de bestandjsnaam zónger \'t "{{ns:file}}:" veurvoogsel.',
'tags-edit' => 'bewerking',
'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wieziginge}}',
+# Special:ComparePages
+'comparepages' => "Vergeliek pazjena's",
+'compare-selector' => 'Vergeliek pazjenaversies',
+'compare-page1' => 'Paasj 1',
+'compare-page2' => 'Paasj 2',
+'compare-rev1' => 'Versie 1',
+'compare-rev2' => 'Versie 2',
+'compare-submit' => 'Vergeliek',
+
# Database error messages
'dberr-header' => "Deze wiki haet 'n probleem",
'dberr-problems' => 'Os excuses. Deze site ongervindj op t moment technische probleme.',
@@ -3194,8 +3285,13 @@ Gaef de bestandjsnaam zónger \'t "{{ns:file}}:" veurvoogsel.',
'htmlform-float-invalid' => 'De waerd dae se haes ingegaeve is gei getal.',
'htmlform-int-toolow' => 'De ingegaeve waerd lèk ónger de maximumwaerd van $1',
'htmlform-int-toohigh' => 'De ingegaeve waerd lèk baove de maximumwaerd van $1',
+'htmlform-required' => 'Dees waerd is verplich',
'htmlform-submit' => 'Slaon óp',
'htmlform-reset' => 'Maak verangeringe óngedaon',
'htmlform-selectorother-other' => 'Anges',
+# SQLite database support
+'sqlite-has-fts' => 'Zeuk versie $1 mit óngersteuning veur "full-text"',
+'sqlite-no-fts' => 'Zeuk versie $1 zónger óngersteuning veur "fulltext"',
+
);
diff --git a/languages/messages/MessagesLij.php b/languages/messages/MessagesLij.php
index 6236bfe2..12959f6f 100644
--- a/languages/messages/MessagesLij.php
+++ b/languages/messages/MessagesLij.php
@@ -138,8 +138,7 @@ $messages = array(
'tog-editondblclick' => 'Modifica e paggine co-o dópio clic (serve Javascrpt)',
'tog-editsection' => 'Modifica e seçión co-o colegamento [modifica]',
'tog-editsectiononrightclick' => 'Modifica e seçión co-o clic destro in sciô tìtolo (serve Javascipt)',
-'tog-rememberpassword' => "Arregorda a mæ paròlla d'ordine",
-'tog-editwidth' => 'Spaçio pe cangiâ a larghessa pinn-a',
+'tog-rememberpassword' => "Arregorda a mæ paròlla d'ordine (a-o màscimo pe $1 {{PLURAL:$1|day|days}})",
'tog-previewontop' => "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
'tog-previewonfirst' => "Veddi l'anteprimma a-o primmo cangiamento",
'tog-enotifwatchlistpages' => "Fammelo savéi via e-mail quande 'na paggina inta mæ lista in osservassion a va cangiaa.",
@@ -354,7 +353,7 @@ O to account o l'è stæto creoö. Non te ascordà de cangiâ e toe preferençe
'yourname' => 'Nomme',
'yourpassword' => 'Pòula segretta:',
'yourpasswordagain' => 'Ri-scriï a pòula segretta',
-'remembermypassword' => "Arregordâ a mæ paròlla d'ordine",
+'remembermypassword' => "Arregordâ a mæ paròlla d'ordine (for a maximum of $1 {{PLURAL:$1|day|days}})",
'yourdomainname' => 'Indirisso do scito:',
'login' => 'Intra',
'nav-login-createaccount' => 'Intra / Registrate',
@@ -490,8 +489,6 @@ Se o s'ha intròu inte 'sto collegamento pe sbàllio, o basta sciaccâ '''Inderr
Se no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />
Inviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />
'''NO INVIÂ MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
-'longpagewarning' => "'''ATTENSION: 'Sta paggina chì a g'ha $1 kilobyte; çerti browser porieivan avei di problemmi inta modiffica de-e paggine che s'avvixinn-an o che ecceddan i 32 kB.
-Pe piaxei conscidera l'opportûnitæ de soddividde a paggina in sessioîn ciû piccinn-e.'''",
'templatesused' => "Template dêuviæ inte 'sta paggina:",
'templatesusedpreview' => "Template dêuviæ inte 'st'anteprimma:",
'template-protected' => '(protezûo)',
@@ -784,7 +781,6 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
# Watchlist
'watchlist' => 'A mæ lista in osservassion',
'mywatchlist' => 'Lista in osservaçion',
-'watchlistfor' => "(pe '''$1''')",
'watchnologin' => "Non ti t'æ entroö",
'watchnologintext' => 'Devvi [[Special:UserLogin|entrâ]] pe cangiâ a toa lista in osservaçion.',
'addedwatch' => 'Azzonto a a lista in osservaçion',
@@ -1045,9 +1041,9 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
# Media information
'thumbsize' => 'Dimescion da a imàginetta:',
-'file-info-size' => '($1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4',
'file-nohires' => '<small>No ghe son verscioîn a resolûxon ciû ærta.</small>',
-'svg-long-desc' => "(archivvio in formato SVG, dimensioîn nominâli $1 × $2 pixel, dimension de l'archivvio: $3)",
+'svg-long-desc' => "archivvio in formato SVG, dimensioîn nominâli $1 × $2 pixel, dimension de l'archivvio: $3",
'show-big-image' => "Verscion d'ærta resolûxon",
'show-big-image-thumb' => "<small>Dimensioîn de 'st'anteprimma: $1 × $2 pixel</small>",
diff --git a/languages/messages/MessagesLmo.php b/languages/messages/MessagesLmo.php
index 0fccc91b..2f1a94f6 100644
--- a/languages/messages/MessagesLmo.php
+++ b/languages/messages/MessagesLmo.php
@@ -82,7 +82,7 @@ $specialPageAliases = array(
'Listfiles' => array( 'Imagin' ),
'Newimages' => array( 'ImaginNöv' ),
'Listusers' => array( 'Dupradur' ),
- 'Listgrouprights' => array( 'Lista di dirit di grüp' ),
+ 'Listgrouprights' => array( 'Lista_di_dirit_di_grüp' ),
'Statistics' => array( 'Statìstegh' ),
'Randompage' => array( 'PaginaAzardada' ),
'Lonelypages' => array( 'PaginnDaPerLur' ),
@@ -118,8 +118,7 @@ $messages = array(
'tog-editsectiononrightclick' => 'Abilitá redatazziún dai sezziún cun al clic<br />
süi titul dai sezziún (JavaScript)',
'tog-showtoc' => "Fà vidè l'indes per i paginn cun püssee de 3 sezión",
-'tog-rememberpassword' => "Regòrdass la mè paròla d'urdin",
-'tog-editwidth' => "Slarga la finèstra di mudifegh fin che la impiniss tüt 'l scherm",
+'tog-rememberpassword' => "Regòrdass la mè paròla d'urdin (for a maximum of $1 {{PLURAL:$1|day|days}})",
'tog-watchcreations' => "Giunta i paginn ch'hoo creaa mì a la lista di paginn che tegni sot ögg",
'tog-watchdefault' => "Gjüntá i pagin redataa in dala lista dii pagin tegnüü d'öcc",
'tog-watchmoves' => "Giunta i paginn ch'hoo muvüü a la lista di paginn che tegni sot ögg",
@@ -243,31 +242,20 @@ süi titul dai sezziún (JavaScript)',
'faqpage' => 'Project:Dumand frequent',
# Vector skin
-'vector-action-addsection' => 'Giunta argument',
-'vector-action-delete' => 'Scancela',
-'vector-action-move' => 'Sposta',
-'vector-action-protect' => 'Prutegg',
-'vector-action-undelete' => 'Recüpera',
-'vector-action-unprotect' => 'Desbloca',
-'vector-namespace-category' => 'Categuria',
-'vector-namespace-help' => 'Pagina de vüt',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'File mültimedial',
-'vector-namespace-mediawiki' => 'Messagg',
-'vector-namespace-project' => 'Pagina de servizi',
-'vector-namespace-special' => 'Pagina speciala',
-'vector-namespace-talk' => 'Discüssión',
-'vector-namespace-template' => 'Mudel',
-'vector-namespace-user' => 'Pagina da dovrée',
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Mudifega',
-'vector-view-history' => 'Varda la storia',
-'vector-view-view' => 'Legg',
-'vector-view-viewsource' => 'Varda el codes',
-'actions' => 'Azión',
-'namespaces' => 'Namespace',
-'variants' => 'Variant',
+'vector-action-addsection' => 'Giunta argument',
+'vector-action-delete' => 'Scancela',
+'vector-action-move' => 'Sposta',
+'vector-action-protect' => 'Prutegg',
+'vector-action-undelete' => 'Recüpera',
+'vector-action-unprotect' => 'Desbloca',
+'vector-view-create' => 'Crea',
+'vector-view-edit' => 'Mudifega',
+'vector-view-history' => 'Varda la storia',
+'vector-view-view' => 'Legg',
+'vector-view-viewsource' => 'Varda el codes',
+'actions' => 'Azión',
+'namespaces' => 'Namespace',
+'variants' => 'Variant',
'errorpagetitle' => 'Erur',
'returnto' => 'Turna indré a $1.',
@@ -441,7 +429,7 @@ Tegné cünt che certi paginn pödass che i seguiten a vedess tant 'me se a füd
'yourname' => 'El to suranóm:',
'yourpassword' => "Parola d'urdin",
'yourpasswordagain' => "Mett dent ammò la parola d'urdin",
-'remembermypassword' => "Regordass la mè parola d'urdin",
+'remembermypassword' => "Regordass la mè parola d'urdin (for a maximum of $1 {{PLURAL:$1|day|days}})",
'login' => 'Va dent',
'nav-login-createaccount' => 'Vena denter / Crea un cünt',
'loginprompt' => 'Par cunett a {{SITENAME}}, a duvii abilitá i galet.',
@@ -563,7 +551,6 @@ Per 'sta reson chí, el pò vess identificaa dumà cunt el sò indirizz nümereg
Se te vöret minga che i tò test i poden vess mudifegaa e redistribüii d'una persona qualsessia senza nissüna limitazión, mandei minga a {{SITENAME}}<br />
Cunt el test che te mandet tì te deciaret anca che, sota la tò respunsabilità, che el test te l'hee scrivüü depertì 'me uriginal, o pür che l'è una cobia d'una funt de dumini pübligh o un'altra funt libera in manera cumpagna.<br />
'''MANDA MINGA DEL MATERIAL CHE L'E' CUERT D'UN DIRIT D'AUTUR SENZA UTURIZAZIUN'''",
-'longpagewarning' => "'''Feegh da ment''': Quela pagina chì l'è longa $1 kilobyte; gh'è di browser ch'i pudarissen vegh di fastidi a mudifegà paginn ch'i riven arent o ch'i gh'hann püssee de 32kb. Per piasè vardee se l'è pussibil fà giò la pagina in tuchet püssee piscinin.",
'protectedpagewarning' => "'''Ocio: quela pagina chì l'è stada blucaa in manéra che dumá i dupradur cunt i privilegg de sysop i pören mudificàla.'''",
'semiprotectedpagewarning' => "'''Nota:''' Quela pagina chì l'è stada blucada in manera che dumà i druvadur registraa i pören mudifegàla.
L'ültima vus del register l'è mustrada chì de suta per riferiment:",
@@ -757,39 +744,34 @@ Pröa a giuntagh denanz a la tò ricerca ''all:'' per cercà in tücc i namespac
'action-edit' => 'mudifega quela pagina chì',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|mudifega|mudifegh}}',
-'recentchanges' => 'Cambiament recent',
-'recentchanges-legend' => 'Upzión ültem mudifegh',
-'recentchangestext' => "In quela pagina chì a gh'è i cambiament püssee recent al cuntegnüü del sit.",
-'recentchanges-feed-description' => "Quel feed chì 'l mustra i mudifegh püssee recent ai cuntegnüü de la wiki.",
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - pagina növa',
-'recentchanges-label-newpage' => "Quela mudifega chì l'ha creaa una pagina növa",
-'recentchanges-legend-minor' => '$1 - mudifega minur',
-'recentchanges-label-minor' => "Quela chì l'è una mudifega piscinina.",
-'recentchanges-legend-bot' => "$1 - mudifega d'un bot",
-'recentchanges-label-bot' => "Quela mudifega chì l'ha fada un bot",
-'recentchanges-legend-unpatrolled' => '$1 - mudifega mia verificada',
-'recentchanges-label-unpatrolled' => "Quela mudifega chì a l'è stada mimga anmò verificada.",
-'rcnote' => "Chì de sota {{PLURAL:$1|gh'è '''1''' mudifega|a hinn i ültim '''$1''' mudifegh}} in di ültim {{PLURAL:$2|dì|'''$2''' dì}}, a partì dai $5 del $4.",
-'rcnotefrom' => "Chì de sota gh'è la lista di mudifegh de <b>$2</b> (fina a <b>$1</b>).",
-'rclistfrom' => 'Fà vidè i cambiament növ a partì de $1',
-'rcshowhideminor' => '$1 i mudifegh piscinín',
-'rcshowhidebots' => '$1 i bot',
-'rcshowhideliu' => '$1 i dupradur cunetüü',
-'rcshowhideanons' => '$1 i dupradur anònim',
-'rcshowhidemine' => '$1 i mè mudifich',
-'rclinks' => 'Fà vedé i ültim $1 cambiament in di ültim $2 dì<br />$3',
-'diff' => 'dif',
-'hist' => 'stòria',
-'hide' => 'Scund',
-'show' => 'Famm vedè',
-'minoreditletter' => 'm',
-'newpageletter' => 'N',
-'boteditletter' => 'b',
-'newsectionsummary' => '/* $1 */ sezión növa',
-'rc-enhanced-expand' => 'Varda i detali (al vör el JavaScript)',
-'rc-enhanced-hide' => 'Scund i detali',
+'nchanges' => '$1 {{PLURAL:$1|mudifega|mudifegh}}',
+'recentchanges' => 'Cambiament recent',
+'recentchanges-legend' => 'Upzión ültem mudifegh',
+'recentchangestext' => "In quela pagina chì a gh'è i cambiament püssee recent al cuntegnüü del sit.",
+'recentchanges-feed-description' => "Quel feed chì 'l mustra i mudifegh püssee recent ai cuntegnüü de la wiki.",
+'recentchanges-label-newpage' => "Quela mudifega chì l'ha creaa una pagina növa",
+'recentchanges-label-minor' => "Quela chì l'è una mudifega piscinina.",
+'recentchanges-label-bot' => "Quela mudifega chì l'ha fada un bot",
+'recentchanges-label-unpatrolled' => "Quela mudifega chì a l'è stada mimga anmò verificada.",
+'rcnote' => "Chì de sota {{PLURAL:$1|gh'è '''1''' mudifega|a hinn i ültim '''$1''' mudifegh}} in di ültim {{PLURAL:$2|dì|'''$2''' dì}}, a partì dai $5 del $4.",
+'rcnotefrom' => "Chì de sota gh'è la lista di mudifegh de <b>$2</b> (fina a <b>$1</b>).",
+'rclistfrom' => 'Fà vidè i cambiament növ a partì de $1',
+'rcshowhideminor' => '$1 i mudifegh piscinín',
+'rcshowhidebots' => '$1 i bot',
+'rcshowhideliu' => '$1 i dupradur cunetüü',
+'rcshowhideanons' => '$1 i dupradur anònim',
+'rcshowhidemine' => '$1 i mè mudifich',
+'rclinks' => 'Fà vedé i ültim $1 cambiament in di ültim $2 dì<br />$3',
+'diff' => 'dif',
+'hist' => 'stòria',
+'hide' => 'Scund',
+'show' => 'Famm vedè',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'newsectionsummary' => '/* $1 */ sezión növa',
+'rc-enhanced-expand' => 'Varda i detali (al vör el JavaScript)',
+'rc-enhanced-hide' => 'Scund i detali',
# Recent changes linked
'recentchangeslinked' => 'Cambiament culegaa',
@@ -890,7 +872,6 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada chÃ
'statistics-files' => 'File caregaa sü',
'statistics-edits' => "Paginn mudifegaa dal dì che l'è nassüü 'l sit de {{SITENAME}}",
'statistics-edits-average' => 'Mudifegh in média per pagina',
-'statistics-jobqueue' => 'Lungheza de la [http://www.mediawiki.org/wiki/Manual:Job_queue Cua di prucediment]',
'statistics-users' => '[[Special:ListUsers|Druvadur]] registraa',
'statistics-users-active' => 'Druvadur ativ',
'statistics-users-active-desc' => "Druvadur che i hann faa un'azión int {{PLURAL:$1|l'ültem dì|i ültem $1 dì}}",
@@ -987,7 +968,6 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada chÃ
# Watchlist
'watchlist' => "Paginn ch'a tegni d'ögg",
'mywatchlist' => "Paginn che a tegni d'ögg",
-'watchlistfor' => "(per '''$1''')",
'addedwatch' => 'Pagina giuntada a la lista di paginn sot ögg',
'addedwatchtext' => "La pagina \"[[:\$1]]\" l'è stada giuntada a la lista di [[Special:Watchlist|paginn da tegn d'ögg]].
I cambiament che vegnarà fai a 'sta pagina chì e a la sóa pagina de discüssion
@@ -1195,7 +1175,6 @@ Varda [[Special:IPBlockList|lista di IP blucaa]] per vidè anmò i bloch.",
'ipb-edit-dropdown' => 'Resón del bloch',
'ipb-unblock-addr' => 'Desblòca $1',
'ipb-unblock' => 'Desbloca un duvrat o un adress IP',
-'ipb-blocklist-addr' => 'Bloch esistent per $1',
'ipb-blocklist' => 'Vardee i blòch ativ',
'ipb-blocklist-contribs' => 'Cuntribüzión de $1',
'unblockip' => 'Desblòca quel druvàt chì',
@@ -1349,9 +1328,9 @@ Che 'l scerna, per piasè, un nom diferent per quel articul chì.",
# Media information
'imagemaxsize' => 'Limitá i imagin süi pagin da descrizziún dii imagin a:',
'thumbsize' => 'Dimensiún diapusitiif:',
-'file-info-size' => '($1 × $2 pixel, dimensión : $3, sort MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, dimensión : $3, sort MIME: $4',
'file-nohires' => '<small>Nissüna resulüzión püssee granda dispunibila.</small>',
-'svg-long-desc' => "(archivi in furmaa SVG, dimensión nominaj $1 × $2 pixel, dimensión de l'archivi: $3)",
+'svg-long-desc' => "archivi in furmaa SVG, dimensión nominaj $1 × $2 pixel, dimensión de l'archivi: $3",
'show-big-image' => 'Versión a resolüzión volta',
'show-big-image-thumb' => '<small>Dimensión de quela anteprima chì: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesLn.php b/languages/messages/MessagesLn.php
index 0ce6e5f2..5b01a4ac 100644
--- a/languages/messages/MessagesLn.php
+++ b/languages/messages/MessagesLn.php
@@ -24,7 +24,8 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$messages = array(
# User preference toggles
-'tog-underline' => 'Kotíya sulimá na bikangisi :',
+'tog-underline' => 'Kotíya sulimá na bikangisi:',
+'tog-rememberpassword' => 'Komíkundola bokitoli na molúki (ekosúkisa na {{PLURAL:$1|mokɔlɔ|mikɔlɔ}} $1)',
# Dates
'monday' => 'mokɔlɔ ya libosó',
@@ -98,18 +99,19 @@ $messages = array(
'faq' => 'Mitúná Mizóngelaka (MM)',
# Vector skin
-'vector-action-addsection' => 'Kobakisa mpɔ̂',
-'vector-action-delete' => 'Kolímwisa',
-'vector-action-move' => 'Kobóngola nkómbó',
-'vector-action-protect' => 'Kobátela',
-'vector-action-undelete' => 'Kolímwisa tɛ̂',
-'vector-action-unprotect' => ' Kobátela tɛ̂',
-'vector-view-create' => 'Kokela',
-'vector-view-edit' => 'Kobɔngisa',
-'vector-view-history' => 'KomÉ”Ìnisa mokóló',
-'vector-view-view' => 'Kotánga',
-'vector-view-viewsource' => 'KomÉ”Ìnisa mosólo',
-'namespaces' => 'Ntáká ya nkómbó',
+'vector-action-addsection' => 'Kobakisa mpɔ̂',
+'vector-action-delete' => 'Kolímwisa',
+'vector-action-move' => 'Kobóngola nkómbó',
+'vector-action-protect' => 'Kobátela',
+'vector-action-undelete' => 'Kolímwisa tɛ̂',
+'vector-action-unprotect' => ' Kobátela tɛ̂',
+'vector-simplesearch-preference' => 'Kolamusa bokáni bwa boluki bobakísámí (káka na Vector)',
+'vector-view-create' => 'Kokela',
+'vector-view-edit' => 'Kobɔngisa',
+'vector-view-history' => 'KomÉ”Ìnisa mokóló',
+'vector-view-view' => 'Kotánga',
+'vector-view-viewsource' => 'KomÉ”Ìnisa mosólo',
+'namespaces' => 'Ntáká ya nkómbó',
'errorpagetitle' => 'Mbéba',
'returnto' => 'Kozóngisa na $1.',
@@ -121,6 +123,7 @@ $messages = array(
'searcharticle' => 'Kokɛndɛ',
'history' => 'Mokóló mwa lonkásá',
'history_short' => 'Mokóló',
+'info_short' => 'Liyébisi',
'printableversion' => 'Mpɔ̂ na kofínela',
'permalink' => 'Ekangeli ya ntángo yÉ”ÌnsÉ”',
'print' => 'kobimisa nkomá',
@@ -174,21 +177,22 @@ $messages = array(
'privacypage' => 'Project:Politíki ya viplívɛ',
'ok' => 'Nandimi',
-'retrievedfrom' => 'Ezwámí úta « $1 »',
+'retrievedfrom' => 'Ezwámí úta «$1»',
'youhavenewmessages' => 'Ozweí $1 ($2).',
'newmessageslink' => 'nsango ya sika',
'editsection' => 'kobɔngisa',
'editold' => 'kobɔngisa',
'editlink' => 'kobɔngisa',
'viewsourcelink' => 'komÉ”Ìnisa mosólo',
-'editsectionhint' => 'Kokoma sɛksíɔ : $1',
+'editsectionhint' => 'Kokoma sɛksíɔ: $1',
'toc' => 'Etápe',
'showtoc' => 'komÉ”Ìnisa',
'hidetoc' => 'kobomba',
+'feedlinks' => 'Ebale:',
'site-rss-feed' => 'Ebale RSS ya $1',
-'site-atom-feed' => 'Ebale Atom ya « $1 »',
-'page-rss-feed' => 'Ebale RSS ya « $1 »',
-'page-atom-feed' => 'Ebale Atom ya « $1 »',
+'site-atom-feed' => 'Ebale Atom ya «$1»',
+'page-rss-feed' => 'Ebale RSS ya «$1»',
+'page-atom-feed' => 'Ebale Atom ya «$1»',
'red-link-title' => '$1 (lonkásá ezalí tɛ̂)',
# Short words for each namespace, by default used in the namespace tab in monobook
@@ -213,30 +217,39 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
# General errors
'error' => 'Mbéba',
'databaseerror' => 'Zíko ya litákoli ya kabo',
-'laggedslavemode' => "'''Likébisi''' : lonkásá óyo ekokí kokwa mbóngwana ya nsúka nyÉ”ÌnsÉ” tɛ̂",
+'laggedslavemode' => "'''Likébisi''': lonkásá óyo ekokí kokwa mbóngwana ya nsúka nyÉ”ÌnsÉ” tɛ̂",
'readonly' => 'Litákoli ya kabo efúngámí',
'enterlockreason' => 'Ópésa ntína mpé ntángo ya kokanisa ya bofúngi ya litákoli ya kabo',
'internalerror' => 'Zíko ya káti',
-'internalerror_info' => 'Zíko ya káti : $1',
+'internalerror_info' => 'Zíko ya káti: $1',
'perfcached' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lÉ›lÉ”Ì tɛ̂.',
'perfcachedts' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lÉ›lÉ”Ì tɛ̂. Bizalí bya $1.',
'viewsource' => 'KomÉ”Ìnisa mosólo',
'viewsourcefor' => 'na $1',
# Login and logout pages
-'yourname' => 'Nkómbó ya mosáleli :',
+'yourname' => 'Nkómbó ya mosáleli:',
'yourpassword' => 'Banda nayó:',
-'yourpasswordagain' => 'Banda naíno :',
+'yourpasswordagain' => 'Banda naíno:',
+'remembermypassword' => 'MÉ›Ìi-komíkitola na molúki moye mbala ilandí (ekosúkisa na {{PLURAL:$1|mokÉ”lÉ”|mikÉ”lÉ”}} $1)',
'login' => 'komíkitola (log in)',
'nav-login-createaccount' => 'Komíkomisa tǒ kokɔtɔ',
'userlogin' => 'Komíkomisa tǒ komíkitola',
+'userloginnocreate' => 'komíkitola (log in)',
'logout' => 'kolongwa',
'userlogout' => 'Kolongwa',
'nologin' => "Omíkomísí naíno tɛ̂? '''$1'''.",
'nologinlink' => 'Míkomísá yɔ̌-mÉ›Ìi',
'gotaccount' => "Omíkomísí naíno ? '''$1'''.",
+'gotaccountlink' => 'komíkitola (log in)',
'createaccountmail' => 'na mokánda',
'mailmypassword' => 'Kotíndisa liloba-nzelá lya sika na mÉ›ÌlÉ›',
+'loginlanguagelabel' => 'Lokótá: $1',
+
+# Password reset dialog
+'oldpassword' => 'Banda kala',
+'newpassword' => 'Banda sika',
+'resetpass-submit-cancel' => 'Kozóngela',
# Edit page toolbar
'bold_sample' => 'Nkomá ya mbinga',
@@ -262,12 +275,12 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'showpreview' => 'Kotála yambo',
'showdiff' => 'KomÉ”Ìnisa mbóngwana',
'newarticle' => '(Sika)',
-'editing' => 'Kokoma « $1 »',
-'editingsection' => 'Bobɔngisi ya « $1 » (sɛksió)',
-'editingcomment' => 'Bobɔngisi ya « $1 » (sɛksió ya sika)',
+'editing' => 'Kokoma «$1»',
+'editingsection' => 'Bobɔngisi ya «$1» (sɛksió)',
+'editingcomment' => 'Bobɔngisi ya «$1» (sɛksió ya sika)',
'yourtext' => 'Nkomá na yɔ̌',
-'templatesused' => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o lonkásá óyo :',
-'templatesusedpreview' => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o botáli boye :',
+'templatesused' => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o lonkásá óyo:',
+'templatesusedpreview' => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o botáli boye:',
'template-protected' => '(na bobáteli)',
'template-semiprotected' => '(na bobáteli ya ndámbo)',
@@ -381,7 +394,7 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'uploadbtn' => 'Kotíya nkásá mɔ̌kÉ”Ì',
'uploadlogpage' => 'Zuluná ya botómbisi likoló',
'savefile' => 'kobómbisa kásá-kásá',
-'uploadedimage' => '« [[$1]] » etómbísámí likoló',
+'uploadedimage' => '«[[$1]]» etómbísámí likoló',
# Special:ListFiles
'listfiles_date' => 'Mokɔlɔ',
@@ -467,9 +480,8 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
# Watchlist
'watchlist' => 'Nkásá nalandí',
'mywatchlist' => 'Nkásá nalandí',
-'watchlistfor' => "(mpɔ̂ na moto '''$1''')",
'addedwatch' => 'Ebakísámí na nkásá olandí',
-'addedwatchtext' => "Lonkásá « [[:$1]] » lobakísámí na [[Special:Watchlist|nkásá olandí]]. Mbóngwana o lonkásá loye mpé o lonkásá la ntembe ikomÉ”Ìnisama áwa, ikokÉ”Ìmana '''mbinga''' o [[Special:RecentChanges|LístÉ› ya mbóngwana ya nsúka]] mpɔ̂ na mpási tɛ̂.",
+'addedwatchtext' => "Lonkásá «[[:$1]]» lobakísámí na [[Special:Watchlist|nkásá olandí]]. Mbóngwana o lonkásá loye mpé o lonkásá la ntembe ikomÉ”Ìnisama áwa, ikokÉ”Ìmana '''mbinga''' o [[Special:RecentChanges|LístÉ› ya mbóngwana ya nsúka]] mpɔ̂ na mpási tɛ̂.",
'removedwatch' => 'Elongólámí na nkásá olandí',
'watch' => 'Kolanda',
'watchthispage' => 'Kolanda lonkásá óyo',
diff --git a/languages/messages/MessagesLo.php b/languages/messages/MessagesLo.php
index a696f820..e1048a52 100644
--- a/languages/messages/MessagesLo.php
+++ b/languages/messages/MessagesLo.php
@@ -108,8 +108,7 @@ $messages = array(
'tog-editsection' => 'ໃຫ້ສາມາດ ດັດà»àºà»‰à»€àº›àº±àº™àºžàº²àº ໂດຠàºàº»àº”ລິ້ງຄ໌ [ດັດà»àºà»‰]',
'tog-editsectiononrightclick' => 'ໃຫ້ສາມາດ ດັດà»àºà»‰ ໂດàºàºàº»àº”ປຸ່ມຂວາ ຂອງເມົາສ໌ ຢູ່ <br /> ຫົວຂà»à»‰àº‚ອງພາຠ(JavaScript)',
'tog-showtoc' => 'ສະà»àº”ງເນື້ອໃນ (ຂອງ à»à»‰àº²àº—ີ່ມີຫຼາàºàºàº§à»ˆàº² 3 ໜາàºà»€àº¥àºàº«àº»àº§àº‚à»à»‰)',
-'tog-rememberpassword' => 'ຈົດຈà»àº²àºàº²àº™à»€àºŠàº±àº™à»€àº‚ົ້າຂອງຂ້ອຠຢູ່ ຄອມພິວເຕີໜ່ວàºàº™àºµà»‰',
-'tog-editwidth' => 'ໃຫ້ ຊ່ອງດັດà»àºà»‰ àºà»‰àº§àº²àº‡àº—ີ່ສຸດ',
+'tog-rememberpassword' => 'ຈົດຈà»àº²àºàº²àº™à»€àºŠàº±àº™à»€àº‚ົ້າຂອງຂ້ອຠຢູ່ ຄອມພິວເຕີໜ່ວàºàº™àºµà»‰ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'ເພີ່ມ ໜ້າທີ່ຂ້ອàºàºªà»‰àº²àº‡ ເຂົ້າໃນ ລາàºàºàº²àº™àº•àº´àº”ຕາມ ຂອງ ຂ້ອàº',
'tog-watchdefault' => 'ເພີ່ມໜ້າ ທີ່ ຂ້ອàºàº”ັດà»àºà»‰ ໃສ່ ລາàºàº•àº´àº”ຕາມ ຂອງ ຂ້ອàº',
'tog-watchmoves' => 'ເພີ່ມ ໜ້າທີ່ຂອ້àºàºà»‰àº²àº ໃສ່ ລາàºàºàº²àº™àº•àº´àº”ຕາມຂອງຂ້ອàº',
@@ -356,7 +355,7 @@ $messages = array(
'yourname' => 'ຊື່ຜູ້ໃຊ້',
'yourpassword' => 'ລະຫັດຜ່ານ',
'yourpasswordagain' => 'ພິມລະຫັດຜ່ານອີàº',
-'remembermypassword' => 'ຈົດຈà»àº²àºàº²àº™à»€àºŠàº±àº™à»€àº‚ົ້າຂອງຂ້ອຠຢູ່ ຄອມພິວເຕີໜ່ວàºàº™àºµà»‰',
+'remembermypassword' => 'ຈົດຈà»àº²àºàº²àº™à»€àºŠàº±àº™à»€àº‚ົ້າຂອງຂ້ອຠຢູ່ ຄອມພິວເຕີໜ່ວàºàº™àºµà»‰ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'ໂດເມນ ຂອງ ທ່ານ',
'login' => 'ເຊັນເຂົ້າ',
'nav-login-createaccount' => 'ເຊັນເຂົ້າ / ສ້າງບັນຊີ',
@@ -725,7 +724,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'ລາàºàºàº²àº™àº•àº´àº”ຕາມ',
'mywatchlist' => 'ລາàºàºàº²àº™àº•àº´àº”ຕາມ',
-'watchlistfor' => "(ສຳຫຼັບ '''$1''')",
'watchlistanontext' => 'àºàº°àº¥àº¸àº™àº² $1 ເພື່ອເບິ່ງ ຫຼື ດັດà»àºà»‰ ໜ້າຢູ່ໃນລາàºàºàº²àº™àº•àº´àº”ຕາມຂອງທ່ານ.',
'watchnologin' => 'ບà»à»ˆà»„ດ້ເຊັນເຂົ້າ',
'addedwatch' => 'ເພີ່ມໃສ່ລາàºàºàº²àº™àº•àº´àº”ຕາມà»àº¥à»‰àº§',
@@ -920,7 +918,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Media information
'imagemaxsize' => 'àºàº³àº™àº»àº”ຄວາມໃຫàºà»ˆàº‚ອງ ຮູບ ຫຼື ໜ້າອະທິບາàºàº®àº¹àºš ບà»à»ˆà»ƒàº«à»‰àºàº²àº:',
'thumbsize' => 'ຂະໜາດສະà»àº”ງ:',
-'file-info-size' => '($1 × $2 ປິàºà»€àºŠàº¥, ຂະໜາດໄຟລ໌: $3, MIME type: $4)',
+'file-info-size' => '$1 × $2 ປິàºà»€àºŠàº¥, ຂະໜາດໄຟລ໌: $3, MIME type: $4',
'file-nohires' => 'ບà»à»ˆàº¡àºµàº‚ະໜາດລະອຽດàºàº§à»ˆàº²',
'show-big-image' => 'ເຕັມຂະໜາດ',
'show-big-image-thumb' => '<small>ຂະໜາດລອງເບິ່ງ: $1 × $2 ປິàºà»€àºŠàº¥</small>',
diff --git a/languages/messages/MessagesLoz.php b/languages/messages/MessagesLoz.php
index fb5cc9ba..ab3d3df1 100644
--- a/languages/messages/MessagesLoz.php
+++ b/languages/messages/MessagesLoz.php
@@ -22,8 +22,7 @@ $messages = array(
'tog-showtoolbar' => "Kamukile hloli ye ng'i toolbar (bulukezi JavaScript)",
'tog-editondblclick' => "Hloli ye ng'i petulo di 'klik' dubo (JavaScript)",
'tog-editsection' => "Nyembulisize [hloli ye ng'i] di akes di lyangutukezi ling'ki",
-'tog-rememberpassword' => 'Askevusize zwa menuhile kwa bye kompyuta.',
-'tog-editwidth' => "Boksi di hloli ye ng'i sa omipeti",
+'tog-rememberpassword' => 'Askevusize zwa menuhile kwa bye kompyuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Pusize petulo a hloli di zwa mukoloko di kentezi',
'tog-watchdefault' => "Pusize petulo a hloli ye ng'i di zwa mukoloko di kentezi",
'tog-watchmoves' => 'Pusize petulo a nyanganyisoze di zwa mukoloko di kentezi',
@@ -278,7 +277,7 @@ Query: $2",
'yourname' => 'Sebelu:',
'yourpassword' => 'Sebu dafi:',
'yourpasswordagain' => 'Ritapi sebu dafi:',
-'remembermypassword' => 'Askevusize zwa menuhile kwa bye kompyuta.',
+'remembermypassword' => 'Askevusize zwa menuhile kwa bye kompyuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Zwa domeni:',
'login' => 'Menuhile',
'nav-login-createaccount' => 'Menuhile / ipupezi sebelu',
@@ -399,8 +398,6 @@ A sa nca di bufosi, tampi '''back'''.",
'copyrightwarning' => "Xete kenki di {{SITENAME}} sa rilisi kwa $2 (fatukile $1 di pagu). A ni tokwezi zwa selt sa kenki a ridistributi kwa tokwi, ni bulukezi.<br />
A sumekezi zwa selt sa dya, a kopisize di publiki domeni, a ike risorsi.
'''NI BULUKEZI SELT KOPINITUMELELO E NI TUMELELO!'''",
-'longpagewarning' => "'''AGTU: Bye petulo sa $1 kilobytes; browser sa di bufosikaku hloli ye ng'i petulo plusu di 32 kilobytes.
-Konsidisize takubikinalisize.'''",
'templatesused' => 'Yegani sebelize di bye petulo:',
'templatesusedpreview' => 'Yegani sebelize kwa bye PendiBe:',
'template-protected' => '(sa bukelezi)',
@@ -729,7 +726,6 @@ dicon sa sosize ni sa meli di kupo sebelu.',
# Watchlist
'watchlist' => 'Zwa mukoloko di kentezi',
'mywatchlist' => 'Zwa mukoloko di kentezi',
-'watchlistfor' => "(di '''$1''')",
'watchnologin' => 'A ni sa menuhile',
'watchnologintext' => "A sa [[Special:UserLogin|menuhile]] di hloli ye ng'i zwa mukoloko di kentezi.",
'addedwatch' => 'Tumbelize a mukoloko di kentezi',
@@ -1011,9 +1007,9 @@ $1',
# Media information
'widthheightpage' => '$1×$2, $3 petulo',
-'file-info-size' => '($1 × $2 pixel, imegi: $3, MIME type: $4)',
+'file-info-size' => '$1 × $2 pixel, imegi: $3, MIME type: $4',
'file-nohires' => '<small>A sa risolusi aku balise.</small>',
-'svg-long-desc' => '(SVG imegi, nominali $1 × $2 pixel, imega: $3)',
+'svg-long-desc' => 'SVG imegi, nominali $1 × $2 pixel, imega: $3',
'show-big-image' => 'Risolusi bakisize',
'show-big-image-thumb' => '<small>PendiBe: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
index 65cac8ff..68d0cdca 100644
--- a/languages/messages/MessagesLt.php
+++ b/languages/messages/MessagesLt.php
@@ -7,10 +7,13 @@
* @ingroup Language
* @file
*
+ * @author Auwris
+ * @author Break Through Pain
* @author Dark Eagle
* @author Garas
* @author Homo
* @author Hugo.arg
+ * @author Ignas693
* @author Matasg
* @author Meno25
* @author Pdxx
@@ -43,92 +46,92 @@ $namespaceNames = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dvigubi peradesavimai' ),
- 'BrokenRedirects' => array( 'Peradresavimai į niekur' ),
+ 'DoubleRedirects' => array( 'Dvigubi_peradesavimai' ),
+ 'BrokenRedirects' => array( 'Peradresavimai_į_niekur' ),
'Disambiguations' => array( 'Nukreipiamieji' ),
'Userlogin' => array( 'Prisijungimas' ),
'Userlogout' => array( 'Atsijungimas' ),
- 'CreateAccount' => array( 'Sukurti paskyrÄ…' ),
+ 'CreateAccount' => array( 'Sukurti_paskyrÄ…' ),
'Preferences' => array( 'Nustatymai' ),
'Watchlist' => array( 'Stebimieji' ),
- 'Recentchanges' => array( 'Naujausi keitimai' ),
+ 'Recentchanges' => array( 'Naujausi_keitimai' ),
'Upload' => array( 'Įkėlimas' ),
- 'Listfiles' => array( 'Paveikslėlių sąrašas' ),
- 'Newimages' => array( 'Nauji paveikslÄ—liai' ),
- 'Listusers' => array( 'Naudotojų sąrašas' ),
- 'Listgrouprights' => array( 'Grupių teisių sąrašas' ),
+ 'Listfiles' => array( 'Paveikslėlių_sąrašas' ),
+ 'Newimages' => array( 'Nauji_paveikslÄ—liai' ),
+ 'Listusers' => array( 'Naudotojų_sąrašas' ),
+ 'Listgrouprights' => array( 'Grupių_teisių_sąrašas' ),
'Statistics' => array( 'Statistika' ),
- 'Randompage' => array( 'Atsitiktinis puslapis' ),
- 'Lonelypages' => array( 'Vieniši puslapiai' ),
- 'Uncategorizedpages' => array( 'Puslapiai be kategorijų' ),
- 'Uncategorizedcategories' => array( 'Kategorijos be subkategorijų' ),
- 'Uncategorizedimages' => array( 'Paveikslėliai be kategorijų' ),
- 'Uncategorizedtemplates' => array( 'Šablonai be kategorijų' ),
- 'Unusedcategories' => array( 'Nenaudojamos kategorijos' ),
- 'Unusedimages' => array( 'Nenaudojami paveikslÄ—liai' ),
- 'Wantedpages' => array( 'Trokštamiausi puslapiai', 'Blogos nuorodos' ),
- 'Wantedcategories' => array( 'Trokštamiausios kategorijos' ),
- 'Wantedfiles' => array( 'Trokštami failai' ),
- 'Wantedtemplates' => array( 'Trokštami šablonai' ),
- 'Mostlinked' => array( 'Turintys daugiausiai nuorodų' ),
- 'Mostlinkedcategories' => array( 'Kategorijos turinÄios daugiausiai nuorodų' ),
+ 'Randompage' => array( 'Atsitiktinis_puslapis' ),
+ 'Lonelypages' => array( 'Vieniši_puslapiai' ),
+ 'Uncategorizedpages' => array( 'Puslapiai_be_kategorijų' ),
+ 'Uncategorizedcategories' => array( 'Kategorijos_be_subkategorijų' ),
+ 'Uncategorizedimages' => array( 'Paveikslėliai_be_kategorijų' ),
+ 'Uncategorizedtemplates' => array( 'Šablonai_be_kategorijų' ),
+ 'Unusedcategories' => array( 'Nenaudojamos_kategorijos' ),
+ 'Unusedimages' => array( 'Nenaudojami_paveikslÄ—liai' ),
+ 'Wantedpages' => array( 'Trokštamiausi_puslapiai', 'Blogos_nuorodos' ),
+ 'Wantedcategories' => array( 'Trokštamiausios_kategorijos' ),
+ 'Wantedfiles' => array( 'Trokštami_failai' ),
+ 'Wantedtemplates' => array( 'Trokštami_šablonai' ),
+ 'Mostlinked' => array( 'Turintys_daugiausiai_nuorodų' ),
+ 'Mostlinkedcategories' => array( 'Kategorijos_turinÄios_daugiausiai_nuorodų' ),
'Mostlinkedtemplates' => array( 'Å ablonai' ),
- 'Mostimages' => array( 'Daugiausiai naudojami paveikslÄ—liai' ),
- 'Mostcategories' => array( 'Daugiausiai naudojamos kategorijos' ),
- 'Mostrevisions' => array( 'Daugiausiai keiÄiami' ),
- 'Fewestrevisions' => array( 'Mažiausiai keiÄiami' ),
- 'Shortpages' => array( 'Trumpiausi puslapiai' ),
- 'Longpages' => array( 'Ilgiausi puslapiai' ),
- 'Newpages' => array( 'Naujausi puslapiai' ),
- 'Ancientpages' => array( 'Seniausi puslapiai' ),
+ 'Mostimages' => array( 'Daugiausiai_naudojami_paveikslÄ—liai' ),
+ 'Mostcategories' => array( 'Daugiausiai_naudojamos_kategorijos' ),
+ 'Mostrevisions' => array( 'Daugiausiai_keiÄiami' ),
+ 'Fewestrevisions' => array( 'Mažiausiai_keiÄiami' ),
+ 'Shortpages' => array( 'Trumpiausi_puslapiai' ),
+ 'Longpages' => array( 'Ilgiausi_puslapiai' ),
+ 'Newpages' => array( 'Naujausi_puslapiai' ),
+ 'Ancientpages' => array( 'Seniausi_puslapiai' ),
'Deadendpages' => array( 'Puslapiai-aklavietÄ—s' ),
- 'Protectedpages' => array( 'Užrakinti puslapiai' ),
- 'Protectedtitles' => array( 'Apsaugoti pavadinimai' ),
- 'Allpages' => array( 'Visi puslapiai' ),
+ 'Protectedpages' => array( 'Užrakinti_puslapiai' ),
+ 'Protectedtitles' => array( 'Apsaugoti_pavadinimai' ),
+ 'Allpages' => array( 'Visi_puslapiai' ),
'Prefixindex' => array( 'Prasidedantys' ),
- 'Ipblocklist' => array( 'IP blokavimų sąrašas' ),
- 'Specialpages' => array( 'Specialieji puslapiai' ),
+ 'Ipblocklist' => array( 'IP_blokavimų_sąrašas' ),
+ 'Specialpages' => array( 'Specialieji_puslapiai' ),
'Contributions' => array( 'IndÄ—lis' ),
- 'Emailuser' => array( 'Rašyti laišką' ),
- 'Confirmemail' => array( 'Elektroninio pašto patvirtinimas' ),
- 'Whatlinkshere' => array( 'Kas į Äia rodo' ),
- 'Recentchangeslinked' => array( 'Pakeitimai susijusiuose puslapiuose' ),
- 'Movepage' => array( 'Puslapio pervadinimas' ),
- 'Blockme' => array( 'Užblokuoti mane' ),
- 'Booksources' => array( 'Knygų šaltiniai' ),
+ 'Emailuser' => array( 'Rašyti_laišką' ),
+ 'Confirmemail' => array( 'Elektroninio_pašto_patvirtinimas' ),
+ 'Whatlinkshere' => array( 'Kas_į_Äia_rodo' ),
+ 'Recentchangeslinked' => array( 'Pakeitimai_susijusiuose_puslapiuose' ),
+ 'Movepage' => array( 'Puslapio_pervadinimas' ),
+ 'Blockme' => array( 'Užblokuoti_mane' ),
+ 'Booksources' => array( 'Knygų_šaltiniai' ),
'Categories' => array( 'Kategorijos' ),
'Export' => array( 'Eksportas' ),
'Version' => array( 'Versija' ),
- 'Allmessages' => array( 'Visi pranešimai' ),
+ 'Allmessages' => array( 'Visi_pranešimai' ),
'Log' => array( 'Sąrašas', 'Sąrašai' ),
- 'Blockip' => array( 'Blokuoti IP' ),
+ 'Blockip' => array( 'Blokuoti_IP' ),
'Undelete' => array( 'Netrinti' ),
'Import' => array( 'Importas' ),
- 'Lockdb' => array( 'Užrakinti duomenų bazę' ),
- 'Unlockdb' => array( 'Atrakinti duomenų bazę' ),
- 'Userrights' => array( 'Naudotojo teisÄ—s' ),
- 'MIMEsearch' => array( 'MIME paieška' ),
- 'FileDuplicateSearch' => array( 'Failo dublikatų paieška' ),
- 'Unwatchedpages' => array( 'Nestebimi puslapiai' ),
- 'Listredirects' => array( 'Peradresavimų sąrašas' ),
- 'Revisiondelete' => array( 'Redagavimo ištrynimas' ),
- 'Unusedtemplates' => array( 'Nenaudojami Å¡ablonai' ),
- 'Randomredirect' => array( 'Atsitiktinis peradresavimas' ),
- 'Mypage' => array( 'Mano puslapis' ),
- 'Mytalk' => array( 'Mano aptarimas' ),
- 'Mycontributions' => array( 'Mano indÄ—lis' ),
- 'Listadmins' => array( 'Administratorių sąrašas' ),
- 'Listbots' => array( 'Botų sąrašas' ),
- 'Popularpages' => array( 'Populiarūs puslapiai' ),
+ 'Lockdb' => array( 'Užrakinti_duomenų_bazę' ),
+ 'Unlockdb' => array( 'Atrakinti_duomenų_bazę' ),
+ 'Userrights' => array( 'Naudotojo_teisÄ—s' ),
+ 'MIMEsearch' => array( 'MIME_paieška' ),
+ 'FileDuplicateSearch' => array( 'Failo_dublikatų_paieška' ),
+ 'Unwatchedpages' => array( 'Nestebimi_puslapiai' ),
+ 'Listredirects' => array( 'Peradresavimų_sąrašas' ),
+ 'Revisiondelete' => array( 'Redagavimo_ištrynimas' ),
+ 'Unusedtemplates' => array( 'Nenaudojami_Å¡ablonai' ),
+ 'Randomredirect' => array( 'Atsitiktinis_peradresavimas' ),
+ 'Mypage' => array( 'Mano_puslapis' ),
+ 'Mytalk' => array( 'Mano_aptarimas' ),
+ 'Mycontributions' => array( 'Mano_indÄ—lis' ),
+ 'Listadmins' => array( 'Administratorių_sąrašas' ),
+ 'Listbots' => array( 'Botų_sąrašas' ),
+ 'Popularpages' => array( 'Populiarūs_puslapiai' ),
'Search' => array( 'Paieška' ),
- 'Resetpass' => array( 'Slaptažodžio atstatymas' ),
- 'Withoutinterwiki' => array( 'Be interwiki' ),
- 'MergeHistory' => array( 'Sujungti istorijÄ…' ),
- 'Filepath' => array( 'Kelias iki failo' ),
- 'Invalidateemail' => array( 'Nutraukti elektroninio pašto galiojimą' ),
- 'Blankpage' => array( 'TuÅ¡Äias puslapis' ),
- 'LinkSearch' => array( 'Nuorodų paieška' ),
- 'DeletedContributions' => array( 'IÅ¡trintas indÄ—lis' ),
+ 'Resetpass' => array( 'Slaptažodžio_atstatymas' ),
+ 'Withoutinterwiki' => array( 'Be_interwiki' ),
+ 'MergeHistory' => array( 'Sujungti_istorijÄ…' ),
+ 'Filepath' => array( 'Kelias_iki_failo' ),
+ 'Invalidateemail' => array( 'Nutraukti_elektroninio_pašto_galiojimą' ),
+ 'Blankpage' => array( 'TuÅ¡Äias_puslapis' ),
+ 'LinkSearch' => array( 'Nuorodų_paieška' ),
+ 'DeletedContributions' => array( 'IÅ¡trintas_indÄ—lis' ),
'Tags' => array( 'Žymos' ),
);
@@ -158,7 +161,7 @@ $magicWords = array(
);
$fallback8bitEncoding = 'windows-1257';
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$dateFormats = array(
'ymd time' => 'H:i',
@@ -186,8 +189,7 @@ $messages = array(
'tog-editsection' => 'Įjungti skyrelių redagavimą naudojant nuorodas [taisyti]',
'tog-editsectiononrightclick' => 'Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)',
'tog-showtoc' => 'Rodyti turinį, jei puslapyje daugiau nei 3 skyreliai',
-'tog-rememberpassword' => 'Prisiminti prisijungimo informacijÄ… Å¡iame kompiuteryje',
-'tog-editwidth' => 'Praplatinti redagavimo lauką, kad būtų užpildytas visas ekranas',
+'tog-rememberpassword' => 'Prisiminti prisijungimo informaciją šioje naršyklėje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
'tog-watchcreations' => 'Pridėti puslapius, kuriuos sukuriu, į stebimų sąrašą',
'tog-watchdefault' => 'Pridėti puslapius, kuriuos redaguoju, į stebimų sąrašą',
'tog-watchmoves' => 'Pridėti puslapius, kuriuos perkeliu, į stebimų sąrašą',
@@ -333,31 +335,21 @@ $messages = array(
'faqpage' => 'Project:DUK',
# Vector skin
-'vector-action-addsection' => 'PridÄ—ti temÄ…',
-'vector-action-delete' => 'IÅ¡trinti',
-'vector-action-move' => 'Perkelti',
-'vector-action-protect' => 'Užrakinti',
-'vector-action-undelete' => 'Atkurti',
-'vector-action-unprotect' => 'Atrakinti',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Pagalbos puslapis',
-'vector-namespace-image' => 'Failas',
-'vector-namespace-main' => 'Puslapis',
-'vector-namespace-media' => 'Media puslapis',
-'vector-namespace-mediawiki' => 'Pranešimas',
-'vector-namespace-project' => 'Projekto puslapis',
-'vector-namespace-special' => 'Specialusis puslapis',
-'vector-namespace-talk' => 'Diskusija',
-'vector-namespace-template' => 'Å ablonas',
-'vector-namespace-user' => 'Naudotojo puslapis',
-'vector-view-create' => 'Kurti',
-'vector-view-edit' => 'Redaguoti',
-'vector-view-history' => 'Istorija',
-'vector-view-view' => 'Skaityti',
-'vector-view-viewsource' => 'Žiūrėti kodą',
-'actions' => 'Veiksmai',
-'namespaces' => 'Vardų sritys',
-'variants' => 'Variantai',
+'vector-action-addsection' => 'PridÄ—ti temÄ…',
+'vector-action-delete' => 'IÅ¡trinti',
+'vector-action-move' => 'Perkelti',
+'vector-action-protect' => 'Užrakinti',
+'vector-action-undelete' => 'Atkurti',
+'vector-action-unprotect' => 'Atrakinti',
+'vector-simplesearch-preference' => 'Įjungti išplėstinius paieškos pasiūlymus (tik „Vector“ išvaizda)',
+'vector-view-create' => 'Kurti',
+'vector-view-edit' => 'Redaguoti',
+'vector-view-history' => 'Istorija',
+'vector-view-view' => 'Skaityti',
+'vector-view-viewsource' => 'Žiūrėti kodą',
+'actions' => 'Veiksmai',
+'namespaces' => 'Vardų sritys',
+'variants' => 'Variantai',
'errorpagetitle' => 'Klaida',
'returnto' => 'Grįžti į $1.',
@@ -418,6 +410,9 @@ Pernelyg daug naudotojų skaito šį puslapį.
Prašome palaukti ir bandyti į šį puslapį patekti dar kartą.
$1',
+'pool-timeout' => 'Baigėsi laikas laukiant užrakto',
+'pool-queuefull' => 'Telkinio eilÄ— pilna',
+'pool-errorunknown' => 'Nežinoma klaida',
# 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' => 'Apie {{SITENAME}}',
@@ -582,7 +577,8 @@ Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo [[Special:Preferences|{
'yourname' => 'Naudotojo vardas:',
'yourpassword' => 'Slaptažodis:',
'yourpasswordagain' => 'Pakartokite slaptažodį:',
-'remembermypassword' => 'Prisiminti Å¡iÄ… informacijÄ… Å¡iame kompiuteryje',
+'remembermypassword' => 'Prisiminti prisijungimo duomenis šiame kompiuteryje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
+'securelogin-stick-https' => 'Likite prisijungÄ™ prie HTTPS po prisijungimo',
'yourdomainname' => 'Jūsų domenas:',
'externaldberror' => 'Yra arba išorinė autorizacijos duomenų bazės klaida arba jums neleidžiama atnaujinti jūsų išorinės paskyros.',
'login' => 'Prisijungti',
@@ -599,6 +595,7 @@ Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo [[Special:Preferences|{
'gotaccount' => "Jau turite paskyrÄ…? '''$1'''.",
'gotaccountlink' => 'Prisijunkite',
'createaccountmail' => 'el. paštu',
+'createaccountreason' => 'Priežastis:',
'badretype' => 'Įvesti slaptažodžiai nesutampa.',
'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
Prašome pasirinkti kitą vardą.',
@@ -619,6 +616,7 @@ Patikrinkite rašybą, arba [[Special:UserLogin/signup|sukurkite naują paskyrą
'wrongpasswordempty' => 'Ä®vestas slaptažodis yra tuÅ¡Äias. PamÄ—ginkite vÄ—l.',
'passwordtooshort' => 'Slaptažodžiai turi būti bent $1 {{PLURAL:$1|simbolio|simbolių|simbolių}} ilgio.',
'password-name-match' => 'Jūsų slaptažodis turi skirtis nuo jūsų naudotojo vardo.',
+'password-login-forbidden' => 'Šito naudotojo vardo ir slaptažodžio naudojimas yra uždraustas.',
'mailmypassword' => 'Atsiųsti naują slaptažodį el. paštu',
'passwordremindertitle' => 'Laikinasis {{SITENAME}} slaptažodis',
'passwordremindertext' => 'Kažkas (tikriausiai jūs, IP adresu $1)
@@ -663,6 +661,9 @@ Palaukite prieš bandant vėl.',
'loginlanguagelabel' => 'Kalba: $1',
'suspicious-userlogout' => 'Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.',
+# E-mail sending
+'php-mail-error-unknown' => 'Nežinoma klaida PHP mail() funkcijoje',
+
# Password reset dialog
'resetpass' => 'Keisti slaptažodį',
'resetpass_announce' => 'JÅ«s prisijungÄ—te su atsiųstu laikinuoju kodu. NorÄ—dami užbaigti prisijungimÄ…, Äia jums reikia nustatyti naujÄ…jį slaptažodį:',
@@ -714,9 +715,11 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
'showlivepreview' => 'Tiesioginė peržiūra',
'showdiff' => 'Rodyti skirtumus',
'anoneditwarning' => "'''Dėmesio:''' Jūs nesate prisijungęs. Jūsų IP adresas bus įrašytas į šio puslapio istoriją.",
+'anonpreviewwarning' => "''Jūs nesate prisijungęs. Išsaugojant jūsų IP adresas bus rodomas šio puslapio redagavimo istorijoje.''",
'missingsummary' => "'''Priminimas:''' Jūs nenurodėte keitimo komentaro. Jei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus išsaugotas be jo.",
'missingcommenttext' => 'Prašome įvesti komentarą.',
-'missingcommentheader' => "'''Priminimas:''' Jūs nenurodėte skyrelio/antraštės šiam komentarui. Jei vėl paspausite Išsaugoti, jūsų keitimas bus įrašytas be jo.",
+'missingcommentheader' => "'''Priminimas:''' Jūs nenurodėte šio komentaro pavadinimo/antraštės.
+Jei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
'summary-preview' => 'Komentaro peržiūra:',
'subject-preview' => 'Skyrelio/antraštės peržiūra:',
'blockedtitle' => 'Naudotojas yra užblokuotas',
@@ -789,7 +792,9 @@ Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] ki
'userjsyoucanpreview' => "'''Patarimas:''' Naudokite „{{int:showpreview}}“ mygtuką, kad išmėgintumėte savo naująjį JS prieš išsaugant.",
'usercsspreview' => "'''Nepamirškite, kad jūs tik peržiūrit savo naudotojo CSS, jis dar nebuvo išsaugotas!'''",
'userjspreview' => "'''Nepamirškite, kad jūs tik testuojat/peržiūrit savo naudotojo JavaScript, jis dar nebuvo išsaugotas!'''",
-'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/monobook.css, o ne {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Nepamirškite, kad jūs tik peržiūrit šio CSS .'''! N!''' Tai dar nebuvo išsaugotas!'''",
+'sitejspreview' => "'''Nepamirškite, kad jūs tik peržiūrit šis JavaScript kodas .'''! N!''' Tai dar nebuvo išsaugotas!'''",
+'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!'''",
@@ -824,9 +829,6 @@ JÅ«s taip pat pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas turinys arba kopijuot
Taip pat jÅ«s pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas tekstas arba kopijuotas
iš viešų ar panašių nemokamų šaltinių (detaliau - $1).
'''NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!'''",
-'longpagewarning' => "'''DĖMESIO: Šis puslapis yra $1 kilobaitų ilgio; kai kurios
-naršyklės gali turėti problemų redaguojant puslapius beveik ar virš 32 kB.
-Prašome pamėginti puslapį padalinti į keletą smulkesnių dalių.'''",
'longpageerror' => "'''KLAIDA: Tekstas, kurį pateikėte, yra $1 kilobaitų ilgio,
kuris yra didesnis nei daugiausiai leistini $2 kilobaitai. Jis nebus išsaugotas.'''",
'readonlywarning' => "'''DÄ–MESIO: Duomenų bazÄ— buvo užrakinta techninei profilaktikai, todÄ—l Å¡iuo metu negalÄ—site iÅ¡saugoti savo pakeitimų. SiÅ«lome nusikopijuoti tekstÄ… į tekstinį failÄ… ir vÄ—liau jį Äia iÅ¡saugoti.'''
@@ -1005,6 +1007,8 @@ $1",
'logdelete-failure' => "'''Sąrašo rodomumas negali būti nustatytas:'''
$1",
'revdel-restore' => 'Keisti matomumÄ…',
+'revdel-restore-deleted' => 'IÅ¡trintos versijos',
+'revdel-restore-visible' => 'Matomos versijos',
'pagehist' => 'Puslapio istorija',
'deletedhist' => 'IÅ¡trinta istorija',
'revdelete-content' => 'turinys',
@@ -1074,11 +1078,13 @@ Prašome patikrinti sąrašus.',
# Diffs
'history-title' => '„$1“ versijų istorija',
'difference' => '(Skirtumai tarp versijų)',
+'difference-multipage' => '(Skirtumai tarp puslapių)',
'lineno' => 'EilutÄ— $1:',
'compareselectedversions' => 'Palyginti pasirinktas versijas',
'showhideselectedversions' => 'Rodyti/slÄ—pti pasirinktas versijas',
'editundo' => 'atšaukti',
-'diff-multi' => '($1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}}.)',
+'diff-multi' => '($2 {{PLURAL:$2|naudotojo|naudotojų|naudotojų}} $1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}})',
+'diff-multi-manyusers' => '(daugiau nei $2 {{PLURAL:$2|naudotojo|naudotojų|naudotojų}} $1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}})',
# Search results
'searchresults' => 'Paieškos rezultatai',
@@ -1113,6 +1119,7 @@ Prašome patikrinti sąrašus.',
'searchprofile-everything-tooltip' => 'Ieškoti viso turinio (tame tarpe aptarimų puslapių)',
'searchprofile-advanced-tooltip' => 'Ieškoti skirtingose vardų srityse',
'search-result-size' => '$1 ({{PLURAL:$2|1 žodis|$2 žodžiai|$2 žodžių}})',
+'search-result-category-size' => '{{PLURAL:$1|1 narys|$1 narių}} ({{PLURAL:$2|1 subkategorijoje|$2 subkategorijų}}, {{PLURAL:$3|1 failas|$3 failų}})',
'search-result-score' => 'Tinkamumas: $1%',
'search-redirect' => '(peradresavimas $1)',
'search-section' => '(skyrius $1)',
@@ -1187,6 +1194,7 @@ Prašome patikrinti sąrašus.',
'contextlines' => 'EiluÄių rezultate:',
'contextchars' => 'Konteksto simbolių eilutėje:',
'stub-threshold' => 'Puslapį žymėti <a href="#" class="stub">nebaigtu</a>, jei mažesnis nei:',
+'stub-threshold-disabled' => 'IÅ¡jungtas',
'recentchangesdays' => 'Rodomos dienos paskutinių keitimų sąraše:',
'recentchangesdays-max' => '(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})',
'recentchangescount' => 'Numatytasis rodomas keitimų skaiÄius:',
@@ -1220,6 +1228,7 @@ Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
'prefs-files' => 'Failai',
'prefs-custom-css' => 'Asmeninis CSS',
'prefs-custom-js' => 'Asmeninis JavaSript',
+'prefs-common-css-js' => 'Bendras CSS/JS visoms išvaizdoms:',
'prefs-reset-intro' => 'Jūs galite pasinaudoti šiuo puslapiu atstatyti jūsų nustatymus į svetainės numatytuosius.
Tai nebeatšaukiama.',
'prefs-emailconfirm-label' => 'El. pašto patvirtinimas:',
@@ -1258,9 +1267,15 @@ Jei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.',
'prefs-advancedrendering' => 'Papildomi nustatymai',
'prefs-advancedsearchoptions' => 'Papildomi nustatymai',
'prefs-advancedwatchlist' => 'Papildomi nustatymai',
-'prefs-display' => 'Rodymo nustatymai',
+'prefs-displayrc' => 'Rodymo nustatymai',
+'prefs-displaysearchoptions' => 'Rodymo nuostatos',
+'prefs-displaywatchlist' => 'Rodymo nuostatos',
'prefs-diffs' => 'Skirtumai',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Panašu, kad E-pašto adresas yra teisingas',
+'email-address-validity-invalid' => 'Įveskite korektišką e-pašto adresą',
+
# User rights
'userrights' => 'Naudotojų teisių valdymas',
'userrights-lookup-user' => 'Tvarkyti naudotojo grupes',
@@ -1345,6 +1360,7 @@ teisÄ—s",
'right-hideuser' => 'Blokuoti naudotojo vardą, paslepiant jį nuo viešinimo',
'right-ipblock-exempt' => 'Apeiti IP blokavimus, autoblokavimus ir pakopinius blokavimus',
'right-proxyunbannable' => 'Apeiti automatinius proxy serverių blokavimus',
+'right-unblockself' => 'Atblokuoti paÄius',
'right-protect' => 'Pakeisti apsaugos lygius ir redaguoti apsaugotus puslapius',
'right-editprotected' => 'Redaguoti apsaugotus puslapius (be pakopinÄ—s apsaugos)',
'right-editinterface' => 'Redaguoti naudotojo aplinkÄ…',
@@ -1367,7 +1383,6 @@ teisÄ—s",
'right-siteadmin' => 'Atrakinti ir užrakinti duomenų bazę',
'right-reset-passwords' => 'Atstatyti kitų naudotojų slaptažodžius',
'right-override-export-depth' => 'Eksportuoti puslapius įtraukiant susietus puslapius iki 5 lygio gylio',
-'right-versiondetail' => 'Rodyti išplėstinę programinės įrangos versijos informaciją',
'right-sendemail' => 'Siųsti el. laišką kitiems naudotojams',
# User rights log
@@ -1418,14 +1433,9 @@ teisÄ—s",
'recentchanges-legend' => 'Naujausių keitimų parinktys',
'recentchangestext' => 'Å iame puslapyje yra patys naujausi pakeitimai Å¡iame projekte.',
'recentchanges-feed-description' => 'Sekite paÄius naujausius projekto keitimus Å¡iame Å¡altinyje.',
-'recentchanges-label-legend' => 'Paaiškinimai: $1.',
-'recentchanges-legend-newpage' => '$1 - naujas puslapis',
'recentchanges-label-newpage' => 'Å iuo keitimu sukurtas naujas puslapis',
-'recentchanges-legend-minor' => '$1 - smulkus pakeitimas',
'recentchanges-label-minor' => 'Tai smulkus pakeitimas',
-'recentchanges-legend-bot' => '$1 - automatizuotas keitimas',
'recentchanges-label-bot' => 'Šį keitimą atliko automatinė programa',
-'recentchanges-legend-unpatrolled' => '$1 - nepatikrintas keitimas',
'recentchanges-label-unpatrolled' => 'Å is keitimas dar nebuvo patikrintas',
'rcnote' => "Žemiau yra {{PLURAL:$1|'''1''' pakeitimas|paskutiniai '''$1''' pakeitimai|paskutinių '''$1''' pakeitimų}} per {{PLURAL:$2|dienÄ…|paskutiniÄ…sias '''$2''' dienas|paskutiniųjų '''$2''' dienų}} skaiÄiuojant nuo $5, $4.",
'rcnotefrom' => "Žemiau yra pakeitimai pradedant '''$2''' (rodoma iki '''$1''' pakeitimų).",
@@ -1472,6 +1482,9 @@ Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškin
'upload_directory_missing' => 'Nėra įkėlimo aplanko ($1) ir negali būti sukurtas tinklo serverio.',
'upload_directory_read_only' => 'Tinklapio serveris negali rašyti į įkėlimo aplanką ($1).',
'uploaderror' => 'Įkėlimo klaida',
+'upload-recreate-warning' => "'''Dėmėsio: Failas šiuo pavadinimu buvo ištrintas arba pervadintas.'''
+
+Jūsų patogumui pateiktas įrašas apie šio puslapio trynimą ar pervadinimą:",
'uploadtext' => "Naudokitės žemiau pateikta forma failų įkėlimui.
NorÄ—dami peržiÅ«rÄ—ti ar ieÅ¡koti anksÄiau įkeltų paveikslÄ—lių, eikite į [[Special:FileList|įkeltų failų sÄ…raÅ¡Ä…]], įkÄ—limai yra registruojami [[Special:Log/upload|įkÄ—limų istorijoje]], trynimai — [[Special:Log/delete|trynimų istorijoje]].
@@ -1503,6 +1516,17 @@ Norėdami panaudoti įkeltą failą puslapyje, naudokite tokias nuorodas:
'filetype-unwanted-type' => "„.$1“''' yra nepageidautinas failo tipas. {{PLURAL:$3|Pageidautinas failų tipas|pageidautini failų tipai}} yra $2.",
'filetype-banned-type' => "„.$1“''' nėra leistinas failo tipas. {{PLURAL:$3|Leistinas failų tipas|Leistini failų tipai}} yra $2.",
'filetype-missing' => 'Failas neturi galūnės (pavyzdžiui „.jpg“).',
+'empty-file' => 'Failas, kurį patvirtinote, tuÅ¡Äias.',
+'file-too-large' => 'Failas, kurį patvirtinote, pernelyg didelis.',
+'filename-tooshort' => 'Failo pavadinimas per trumpas.',
+'filetype-banned' => 'Šis failo tipas yra uždraustas.',
+'verification-error' => 'Å is failas nepraÄ—jo patikrinimo.',
+'hookaborted' => 'Pakeitimą, kurį bandėte atlikti, nutraukė priedo gaudlys.',
+'illegal-filename' => 'Failo vardas neleidžiamas.',
+'overwrite' => 'Perrašyti esamą failą neleidžiama.',
+'unknown-error' => 'Įvyko nežinoma klaida.',
+'tmp-create-error' => 'Nepavyko sukurti laikino failo.',
+'tmp-write-error' => 'Klaida rašant laikinąjį failą.',
'large-file' => 'Rekomenduojama, kad failų dydis būtų nedidesnis nei $1; šio failo dydis yra $2.',
'largefileserver' => 'Šis failas yra didesnis nei serveris yra sukonfigūruotas leisti.',
'emptyfile' => 'PanaÅ¡u, kad failas, kurį įkÄ—lÄ—te yra tuÅ¡Äias. Tai gali bÅ«ti dÄ—l klaidos failo pavadinime. Pasitikrinkite ar tikrai norite įkelti Å¡itÄ… failÄ….',
@@ -1528,13 +1552,14 @@ prašome eiti atgal ir įkelti šį failą kitu vardu. [[File:$1|thumb|center|$1
Jei visvien norite įkelti savo failą, prašome eiti atgal ir įkelti šį failą kitu vardu. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Šis failas yra {{PLURAL:$1|šio failo|šių failų}} dublikatas:',
'file-deleted-duplicate' => 'Failas, identiškas šiam failui ([[:$1]]), seniau buvo ištrintas. Prieš įkeldami jį vėl patikrinkite šio failo ištrynimo istoriją.',
-'successfulupload' => 'Įkelta sėkmingai',
'uploadwarning' => 'DÄ—mesio',
'uploadwarning-text' => 'Prašome pakeisti failo aprašymą ir bandykite dar kartą.',
'savefile' => 'IÅ¡saugoti failÄ…',
'uploadedimage' => 'įkėlė „[[$1]]“',
'overwroteimage' => 'įkėlė naują „[[$1]]“ versiją',
'uploaddisabled' => 'Įkėlimai uždrausti',
+'copyuploaddisabled' => 'Įkėlimas pagal URL išjungtas.',
+'uploadfromurl-queued' => 'Jūsų įkėlimas įtrauktas į eilę.',
'uploaddisabledtext' => 'Failų įkėlimai yra uždrausti.',
'php-uploaddisabledtext' => "Failų įkėlimai uždrausti PHP nustatymuose.
Patikrinkite ''file_uploads'' nustatÄ….",
@@ -1554,6 +1579,14 @@ Patikrinkite ''file_uploads'' nustatÄ….",
Jūs turėtumėte nuspręsti, ar verta toliau įkeldinėti šį failą.
Šio failo šalinimų istorija yra pateikta dėl patogumo:",
'filename-bad-prefix' => "Jūsų įkeliamas failas prasideda su '''„$1“''', bet tai yra neapibūdinantis pavadinimas, dažniausiai priskirtas skaitmeninių kamerų. Prašome suteikti labiau apibūdinantį pavadinimą savo failui.",
+'upload-success-subj' => 'Įkelta sėkmingai',
+'upload-success-msg' => 'JÅ«sų įkÄ—limas iÅ¡ [$2] buvo sÄ—kmingas. Jį galima rasti Äia: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Įkėlimo problema',
+'upload-failure-msg' => 'Įvyko įkėlimo iš [$2] problema:
+
+$1',
+'upload-warning-subj' => 'Įkėlimo įspėjimas',
+'upload-warning-msg' => 'Įvyko įkėlimo iš [$2] problema. Jums reikėtų grįžti į [[Special:Upload/stash/$1|įkėlimo formą]], norint išspręsti šią problemą.',
'upload-proto-error' => 'Neteisingas protokolas',
'upload-proto-error-text' => 'Nuotoliniai įkėlimas reikalauja, kad URL prasidėtų <code>http://</code> arba <code>ftp://</code>.',
@@ -1567,22 +1600,23 @@ Prašome susisiekti su [[Special:ListUsers/sysop|sistemos administratoriumi]].',
'upload-http-error' => 'Įvyko HTTP klaida: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'Prieiga uždrausta',
-'img-auth-nopathinfo' => 'Trūksta PATH_INFO.
+'img-auth-accessdenied' => 'Prieiga uždrausta',
+'img-auth-nopathinfo' => 'Trūksta PATH_INFO.
Jūsų serveris nenustatytas perduoti šią informaciją.
Tai gali būti CGI paremta ir negali palaikyti img_auth.
Daugiau informacijos http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => 'Užklaustas kelias nėra sukonfigūruotame įkėlimo kataloge.',
-'img-auth-badtitle' => 'Nepavyksta padaryti leistino pavadinimo iš „$1“.',
-'img-auth-nologinnWL' => 'Jūs nesate prisijungęs ir „$1“ nėra baltajame sąraše.',
-'img-auth-nofile' => 'Failas „$1“ neegzistuoja.',
-'img-auth-isdir' => 'Jūs bandote pasiekti katalogą „$1“.
+'img-auth-notindir' => 'Užklaustas kelias nėra sukonfigūruotame įkėlimo kataloge.',
+'img-auth-badtitle' => 'Nepavyksta padaryti leistino pavadinimo iš „$1“.',
+'img-auth-nologinnWL' => 'Jūs nesate prisijungęs ir „$1“ nėra baltajame sąraše.',
+'img-auth-nofile' => 'Failas „$1“ neegzistuoja.',
+'img-auth-isdir' => 'Jūs bandote pasiekti katalogą „$1“.
Leidžiama prieiga tik prie failų.',
-'img-auth-streaming' => 'SiunÄiamas „$1“.',
-'img-auth-public' => 'img_auth.php paskirtis yra pateikti failus iÅ¡ privaÄių projektų.
+'img-auth-streaming' => 'SiunÄiamas „$1“.',
+'img-auth-public' => 'img_auth.php paskirtis yra pateikti failus iÅ¡ privaÄių projektų.
Šis projektas sukonfigūruotas kaip viešasis.
Dėl saugumo, img_auth.php yra išjungtas.',
-'img-auth-noread' => 'Naudotojas neturi teisės peržiūrėti „$1“.',
+'img-auth-noread' => 'Naudotojas neturi teisės peržiūrėti „$1“.',
+'img-auth-bad-query-string' => 'URL neteisingas užklausos eilutę.',
# HTTP errors
'http-invalid-url' => 'Neleistinas URL: $1',
@@ -1614,6 +1648,7 @@ Paspaudę ant stulpelio antraštės pakeiste išrikiavimą.',
'listfiles_search_for' => 'Ieškoti failo pavadinimo:',
'imgfile' => 'failas',
'listfiles' => 'Failų sąrašas',
+'listfiles_thumb' => 'Miniatiūra',
'listfiles_date' => 'Data',
'listfiles_name' => 'Pavadinimas',
'listfiles_user' => 'Naudotojas',
@@ -1727,8 +1762,8 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
'statistics-edits' => 'Puslapių redagavimų skaiÄius nuo {{SITENAME}} sukÅ«rimo',
'statistics-edits-average' => 'Vidutinis redakcijų kiekis puslapiui',
'statistics-views-total' => 'Iš viso peržiūrų',
+'statistics-views-total-desc' => 'NeegzistuojanÄių ir specialiųjų puslapių parodymai neįtraukti',
'statistics-views-peredit' => 'PeržiÅ«rų skaiÄius redakcijai',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue UžduoÄių eilÄ—s] ilgis',
'statistics-users' => 'Registruotų [[Special:ListUsers|naudotojų]]',
'statistics-users-active' => 'Aktyvių naudotojų',
'statistics-users-active-desc' => 'Naudotojai, kurie per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienų}} padarė keitimų',
@@ -1743,7 +1778,7 @@ Puslapis laikomas daugiaprasmiu puslapiu, jei jis naudoja Å¡ablonÄ…, kuris yra n
'doubleredirects' => 'Dvigubi peradresavimai',
'doubleredirectstext' => 'Šiame puslapyje yra puslapių, kurie nukreipia į kitus peradresavimo puslapius, sąrašas.
Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, taip pat antrojo peradresavimo paskirtis, kuris paprastai yra „tikrasis“ paskirties puslapis, į kurį pirmasis peradresavimas ir turėtų rodyti.
-<s>Išbraukti</s> įrašai yra išspręsti.',
+<del>Išbraukti</del> įrašai yra išspręsti.',
'double-redirect-fixed-move' => '[[$1]] buvo perkeltas, dabar tai peradresavimas į [[$2]]',
'double-redirect-fixer' => 'Peradresavimų tvarkyklė',
@@ -1766,6 +1801,8 @@ Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, tai
'nmembers' => '$1 {{PLURAL:$1|narys|nariai|narių}}',
'nrevisions' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}',
'nviews' => '$1 {{PLURAL:$1|parodymas|parodymai|parodymų}}',
+'nimagelinks' => 'Naudojama $1 {{PLURAL:$1|puslapyje|puslapiuose|puslapių}}',
+'ntransclusions' => 'naudojama $1 {{PLURAL:$1|puslapyje|puslapiuose|puslapių}}',
'specialpage-empty' => 'Šiai ataskaitai nėra rezultatų.',
'lonelypages' => 'Vieniši puslapiai',
'lonelypagestext' => 'Į šiuos puslapius nėra nuorodų ar įtraukimų iš kitų {{SITENAME}} puslapių.',
@@ -1922,34 +1959,40 @@ Palaikomi protokolai: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Pašalinti visas grupes iš savo paskyros',
# E-mail user
-'mailnologin' => 'NÄ—ra adreso',
-'mailnologintext' => 'Jums reikia būti [[Special:UserLogin|prisijungusiam]] ir turi būti įvestas teisingas el. pašto adresas jūsų [[Special:Preferences|nustatymuose]], kad siųstumėte el. laiškus kitiems nautotojams.',
-'emailuser' => 'Rašyti laišką šiam naudotojui',
-'emailpage' => 'Siųsti el. laišką naudotojui',
-'emailpagetext' => 'Jūs gali pasinaudoti šia forma norėdami nusiųsti el. laišką šiam naudotojui.
+'mailnologin' => 'NÄ—ra adreso',
+'mailnologintext' => 'Jums reikia būti [[Special:UserLogin|prisijungusiam]] ir turi būti įvestas teisingas el. pašto adresas jūsų [[Special:Preferences|nustatymuose]], kad siųstumėte el. laiškus kitiems nautotojams.',
+'emailuser' => 'Rašyti laišką šiam naudotojui',
+'emailpage' => 'Siųsti el. laišką naudotojui',
+'emailpagetext' => 'Jūs gali pasinaudoti šia forma norėdami nusiųsti el. laišką šiam naudotojui.
El. pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.',
-'usermailererror' => 'Pašto objektas grąžino klaidą:',
-'defemailsubject' => '{{SITENAME}} el. paštas',
-'noemailtitle' => 'Nėra el. pašto adreso',
-'noemailtext' => 'Šis naudotojas nėra nurodęs teisingo el. pašto adreso, arba yra pasirinkęs negauti el. pašto iš kitų naudotojų.',
-'nowikiemailtitle' => 'El. laiškai neleidžiami',
-'nowikiemailtext' => 'Šis naudotojas yra pasirinkęs negauti elektroninių laiškų iš kitų naudotojų.',
-'email-legend' => 'Siųsti elektroninį laišką kitam {{SITENAME}} naudotojui',
-'emailfrom' => 'Nuo:',
-'emailto' => 'Kam:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'Tekstas:',
-'emailsend' => 'Siųsti',
-'emailccme' => 'Siųsti man mano laiško kopiją.',
-'emailccsubject' => 'Laiško kopija naudotojui $1: $2',
-'emailsent' => 'El. laiškas išsiųstas',
-'emailsenttext' => 'Jūsų el. pašto žinutė išsiųsta.',
-'emailuserfooter' => 'Šis elektroninis laiškas buvo išsiųstas naudotojo $1 naudotojui $2 naudojant „Rašyti elektroninį laišką“ funkciją projekte {{SITENAME}}.',
+'usermailererror' => 'Pašto objektas grąžino klaidą:',
+'defemailsubject' => '{{SITENAME}} el. paštas',
+'usermaildisabled' => 'Naudotojo elektroninis paštas išjungtas',
+'usermaildisabledtext' => 'Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.',
+'noemailtitle' => 'Nėra el. pašto adreso',
+'noemailtext' => 'Šis naudotojas nėra nurodęs teisingo el. pašto adreso, arba yra pasirinkęs negauti el. pašto iš kitų naudotojų.',
+'nowikiemailtitle' => 'El. laiškai neleidžiami',
+'nowikiemailtext' => 'Šis naudotojas yra pasirinkęs negauti elektroninių laiškų iš kitų naudotojų.',
+'email-legend' => 'Siųsti elektroninį laišką kitam {{SITENAME}} naudotojui',
+'emailfrom' => 'Nuo:',
+'emailto' => 'Kam:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'Tekstas:',
+'emailsend' => 'Siųsti',
+'emailccme' => 'Siųsti man mano laiško kopiją.',
+'emailccsubject' => 'Laiško kopija naudotojui $1: $2',
+'emailsent' => 'El. laiškas išsiųstas',
+'emailsenttext' => 'Jūsų el. pašto žinutė išsiųsta.',
+'emailuserfooter' => 'Šis elektroninis laiškas buvo išsiųstas naudotojo $1 naudotojui $2 naudojant „Rašyti elektroninį laišką“ funkciją projekte {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Paliekamas sistemos pranešimas.',
+'usermessage-editor' => 'Sistemos pranešėjas',
# Watchlist
'watchlist' => 'Stebimi puslapiai',
'mywatchlist' => 'Stebimi puslapiai',
-'watchlistfor' => "(naudotojo '''$1''')",
+'watchlistfor2' => 'Naudotojo $1 $2',
'nowatchlist' => 'Neturite nei vieno stebimo puslapio.',
'watchlistanontext' => 'Prašome $1, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.',
'watchnologin' => 'Neprisijungęs',
@@ -2068,7 +2111,10 @@ Paskutimas keitimas darytas naudotojo [[User:$3|$3]] ([[User talk:$3|Aptarimas]]
'revertpage-nouser' => 'Atmesti (naudotojo vardas pašalintas) pakeitimai, grąžinta prieš tai buvusi [[User:$1|$1]] versija',
'rollback-success' => 'Atmesti $1 pakeitimai;
grąžinta prieš tai buvusi $2 versija.',
-'sessionfailure' => 'Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.
+
+# Edit tokens
+'sessionfailure-title' => 'Sesijos klaida',
+'sessionfailure' => 'Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.
Prašome paspausti „atgal“ ir perkraukite puslapį iš kurio atėjote, ir pamėginkite vėl.',
# Protect
@@ -2198,19 +2244,23 @@ $1',
'month' => 'Nuo mÄ—nesio (ir anksÄiau):',
'year' => 'Nuo metų (ir anksÄiau):',
-'sp-contributions-newbies' => 'Rodyti tik naujų paskyrų įnašus',
-'sp-contributions-newbies-sub' => 'Naujoms paskyroms',
-'sp-contributions-newbies-title' => 'Naudotojų keitimai naujoms paskyroms',
-'sp-contributions-blocklog' => 'Blokavimų istorija',
-'sp-contributions-deleted' => 'ištrintas naudotojo indėlis',
-'sp-contributions-logs' => 'Specialiųjų veiksmų istorija',
-'sp-contributions-talk' => 'Aptarimas',
-'sp-contributions-userrights' => 'naudotojų teisių valdymas',
-'sp-contributions-blocked-notice' => 'Šis naudotojas šiuo metu užblokuotas.
+'sp-contributions-newbies' => 'Rodyti tik naujų paskyrų įnašus',
+'sp-contributions-newbies-sub' => 'Naujoms paskyroms',
+'sp-contributions-newbies-title' => 'Naudotojų keitimai naujoms paskyroms',
+'sp-contributions-blocklog' => 'Blokavimų istorija',
+'sp-contributions-deleted' => 'ištrintas naudotojo indėlis',
+'sp-contributions-uploads' => 'nuotraukos',
+'sp-contributions-logs' => 'Specialiųjų veiksmų istorija',
+'sp-contributions-talk' => 'Aptarimas',
+'sp-contributions-userrights' => 'naudotojų teisių valdymas',
+'sp-contributions-blocked-notice' => 'Šis naudotojas šiuo metu užblokuotas.
Pateikiamas paskutinis blokavimo istorijos įrašas.',
-'sp-contributions-search' => 'Ieškoti įnašo',
-'sp-contributions-username' => 'IP adresas arba naudotojo vardas:',
-'sp-contributions-submit' => 'Ieškoti',
+'sp-contributions-blocked-notice-anon' => 'Šis IP adresas yra užblokuotas.
+Paskutinis blokavimo įrašas pateikiamas žemiau:',
+'sp-contributions-search' => 'Ieškoti įnašo',
+'sp-contributions-username' => 'IP adresas arba naudotojo vardas:',
+'sp-contributions-toponly' => 'Rodyti tik paskutinius keitimus',
+'sp-contributions-submit' => 'Ieškoti',
# What links here
'whatlinkshere' => 'SusijÄ™ puslapiai',
@@ -2270,7 +2320,6 @@ Aplankykite [[Special:IPBlockList|IP blokavimų istoriją]] norėdami jį perži
'ipb-edit-dropdown' => 'Redaguoti blokavimų priežastis',
'ipb-unblock-addr' => 'Atblokuoti $1',
'ipb-unblock' => 'Atblokuoti naudotojo vardÄ… arba IP adresÄ…',
-'ipb-blocklist-addr' => 'Egzistuojantys $1 blokavimai',
'ipb-blocklist' => 'Rodyti egzistuonÄius blokavimus',
'ipb-blocklist-contribs' => '$1 indÄ—lis',
'unblockip' => 'Atblokuoti naudotojÄ…',
@@ -2343,6 +2392,8 @@ $1 jau yra užblokuotas. Ar norite pakeisti nustatymus?',
'cant-block-while-blocked' => 'Jūs negalite blokuoti kitų naudotojų kuomet pats esate užblokuotas.',
'cant-see-hidden-user' => 'Naudotojas, kurį bandote užblokuoti, jau yra užblokuotas arba paslėptas.
Kadangi jūs neturi hideuser teisės, jūs negalite pamatyti arba pakeisti naudotojo blokavimo.',
+'ipbblocked' => 'Jūs negalite blokuoti ar atblokuoti kitų naudotojų, nes pats esate užblokuotas',
+'ipbnounblockself' => 'Jums nėra leidžiama savęs atblokuoti',
# Developer tools
'lockdb' => 'Užrakinti duomenų bazę',
@@ -2390,6 +2441,18 @@ o egzistuojanÄių puslapių sugadinti negalite.
Jei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų
šalutinių efektų, dėl to šį veiksmą vykdykite tik įsitikinę,
kad suprantate visas pasekmes.",
+'movepagetext-noredirectfixer' => "Naudodamiesi žemiau pateikta forma, pervadinsite puslapį perkeldami visą jo istoriją į naująjį pavadinimą.
+Senasis pavadinimas taps nukreipiamuoju puslapiu į naująjį.
+Nuorodos į senąjį puslapį nebus automatiškai pakeistos, todėl būtinai
+patikrinkite, ar nesukÅ«rÄ—te [[Special:DoubleRedirects|dvigubų]] ar [[Special:BrokenRedirects|neveikianÄių]] nukreipimų.
+Jūs esate atsakingas už tai, kad nuorodos rodytų į ten, kur ir norėta.
+
+Primename, kad puslapis '''nebus''' pervadintas, jei jau yra puslapis nauju pavadinimu, nebent tas puslapis yra tuÅ¡Äias arba nukreipiamasis ir neturi redagavimo istorijos.
+Taigi, jÅ«s galite pervadinti puslapį seniau naudotu vardu, jei prieÅ¡ tai jis buvo per klaidÄ… pervadintas, o egzistuojanÄių puslapių sugadinti negalite.
+
+'''DÄ—mesio!'''
+Jei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų šalutinių efektų,
+dėl to šį veiksmą vykdykite tik įsitikinę, kad suprantate visas pasekmes.",
'movepagetalktext' => "Susietas aptarimo puslapis bus automatiškai perkeltas kartu su juo, '''išskyrus:''':
*Puslapis nauju pavadinimu jau turi netuÅ¡ÄiÄ… aptarimo puslapį, arba
*Paliksite žemiau esanÄia varnelÄ™ nepažymÄ—tÄ….
@@ -2448,6 +2511,7 @@ Paskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtum
'immobile-source-page' => 'Å io puslapio perkelti negalima.',
'immobile-target-page' => 'Negalima perkelti į paskirtąją vietą.',
'imagenocrossnamespace' => 'Negalima pervadinti failo į ne failo vardų sritį',
+'nonfile-cannot-move-to-file' => 'Negalima perkelti ne failo į failų vardų sritį',
'imagetypemismatch' => 'Naujas failo plÄ—tinys neatitinka jo tipo',
'imageinvalidfilename' => 'Failo pavadinimas yra klaidingas',
'fix-double-redirects' => 'Atnaujinti peradresavimus, kad šie rodytų į originalų straipsnio pavadinimą',
@@ -2523,10 +2587,11 @@ Visi tarpprojektiniai importo veiksmai yra registruojami [[Special:Log/import|i
'import-interwiki-namespace' => 'Paskirties vardų sritis:',
'import-upload-filename' => 'Failo pavadinimas:',
'import-comment' => 'Komentaras:',
-'importtext' => 'PraÅ¡ome eksportuoti failÄ… iÅ¡ projekto-Å¡altinio naudojantis {{ns:special}}:Export priemone, iÅ¡saugokite jį savo diske ir įkelkite jį Äia.',
+'importtext' => 'PraÅ¡ome eksportuoti iÅ¡ projekto-Å¡altinio failo, naudojant [[Specialus: Export | Export.]]! N! IÅ¡saugokite jį savo kompiuteryje ir įkelkite jį Äia.',
'importstart' => 'Imporuojami puslapiai...',
'import-revision-count' => '$1 {{PLURAL:$1|versija|versijos|versijų}}',
'importnopages' => 'Nėra puslapių importavimui.',
+'imported-log-entries' => 'Importuota $1 {{PLURAL:$1|prisijungimo įrašas|prisijungimo įrašai}}.',
'importfailed' => 'Importavimas nepavyko: <nowiki>$1</nowiki>',
'importunknownsource' => 'Nežinomas importo šaltinio tipas',
'importcantopen' => 'Nepavyksta atverti importo failo',
@@ -2620,6 +2685,8 @@ Visi tarpprojektiniai importo veiksmai yra registruojami [[Special:Log/import|i
'tooltip-rollback' => 'Atšaukti atmestus šio puslapio pakeitimus į paskutinę versiją vienu spustelėjimu',
'tooltip-undo' => '„Anuliuoti“ atmeta šį keitimą ir atveria ankstesnės versijos redagavimo formą.
Leidžia pridėti atmetimo priežastį komentaruose',
+'tooltip-preferences-save' => 'IÅ¡saugoti nustatymus',
+'tooltip-summary' => 'Įvesti trumpą santrauką',
# Stylesheets
'common.css' => '/** Čia įdėtas CSS bus taikomas visoms išvaizdoms */',
@@ -2732,14 +2799,17 @@ Jį paleidus jūsų sistema gali būti pažeista.",
'imagemaxsize' => "Riboti paveikslėlių dydį:<br />''(failų aprašymo puslapiuose)''",
'thumbsize' => 'Sumažintų paveikslėlių dydis:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|puslapis|puslapiai|puslapių}}',
-'file-info' => '(failo dydis: $1, MIME tipas: $2)',
-'file-info-size' => '($1 × $2 taškų, failo dydis: $3, MIME tipas: $4)',
+'file-info' => 'failo dydis: $1, MIME tipas: $2',
+'file-info-size' => '$1 × $2 taškų, failo dydis: $3, MIME tipas: $4',
'file-nohires' => '<small>Geresnė raiška negalima.</small>',
-'svg-long-desc' => '(SVG failas, formaliai $1 × $2 taškų, failo dydis: $3)',
+'svg-long-desc' => 'SVG failas, formaliai $1 × $2 taškų, failo dydis: $3',
'show-big-image' => 'Pilna raiška',
'show-big-image-thumb' => '<small>Šios peržiūros dydis: $1 × $2 taškų</small>',
'file-info-gif-looped' => 'ciklinis',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kadras|kadrai|kadrų}}',
+'file-info-png-looped' => 'ciklinis',
+'file-info-png-repeat' => 'grota $1 {{PLURAL:$1|kartą|kartus|kartų}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kadras|kadrai|kadrų}}',
# Special:NewFiles
'newimages' => 'Naujausių failų galerija',
@@ -2810,8 +2880,8 @@ Visos kitos nuorodos toje paÄioje eilutÄ—je yra laikomos iÅ¡imtimis, t. y. pusl
'exif-colorspace' => 'Spalvų pristatymas',
'exif-componentsconfiguration' => 'kiekvieno komponento reikšmė',
'exif-compressedbitsperpixel' => 'Paveikslėlio suspaudimo režimas',
-'exif-pixelydimension' => 'Leistinas paveikslÄ—lio plotis',
-'exif-pixelxdimension' => 'Leistinas paveikslėlio aukštis',
+'exif-pixelydimension' => 'PaveikslÄ—lio plotis',
+'exif-pixelxdimension' => 'Vaizdo aukštis',
'exif-makernote' => 'Gamintojo pastabos',
'exif-usercomment' => 'Naudotojo komentarai',
'exif-relatedsoundfile' => 'Susijusi garso byla',
@@ -2827,9 +2897,9 @@ Visos kitos nuorodos toje paÄioje eilutÄ—je yra laikomos iÅ¡imtimis, t. y. pusl
'exif-spectralsensitivity' => 'Spektrinis jautrumas',
'exif-isospeedratings' => 'ISO greitis',
'exif-oecf' => 'Optoelektronikos konversijos daugiklis',
-'exif-shutterspeedvalue' => 'Užrakto greitis',
-'exif-aperturevalue' => 'Diafragma',
-'exif-brightnessvalue' => 'Å viesumas',
+'exif-shutterspeedvalue' => 'APEX užrakto greiÄio',
+'exif-aperturevalue' => 'APEX diafragma',
+'exif-brightnessvalue' => 'APEX ryškumas',
'exif-exposurebiasvalue' => 'IÅ¡laikymo paklaida',
'exif-maxaperturevalue' => 'Mažiausias lešio F numeris',
'exif-subjectdistance' => 'Objekto atstumas',
@@ -3053,26 +3123,26 @@ Visos kitos nuorodos toje paÄioje eilutÄ—je yra laikomos iÅ¡imtimis, t. y. pusl
'limitall' => 'visi',
# E-mail address confirmation
-'confirmemail' => 'Patvirtinkite el. pašto adresą',
-'confirmemail_noemail' => 'Jūs neturite nurodę teisingo el. pašto adreso [[Special:Preferences|savo nustatymuose]].',
-'confirmemail_text' => 'Šiame projekte būtina patvirtinti el. pašto adresą prieš naudojant el. pašto funkcijas. Spustelkite žemiau esantį mygtuką,
+'confirmemail' => 'Patvirtinkite el. pašto adresą',
+'confirmemail_noemail' => 'Jūs neturite nurodę teisingo el. pašto adreso [[Special:Preferences|savo nustatymuose]].',
+'confirmemail_text' => 'Šiame projekte būtina patvirtinti el. pašto adresą prieš naudojant el. pašto funkcijas. Spustelkite žemiau esantį mygtuką,
kad jūsų el. pašto adresu būtų išsiųstas patvirtinimo kodas.
Laiške bus atsiųsta nuoroda su kodu, kuria nuėjus, el. pašto adresas bus patvirtintas.',
-'confirmemail_pending' => 'Patvirtinimo kodas jums jau nusiųstas; jei neseniai sukūrėte savo paskyrą, jūs turėtumėte palaukti jo dar kelias minutes prieš prašydami naujo kodo.',
-'confirmemail_send' => 'Išsiųsti patvirtinimo kodą',
-'confirmemail_sent' => 'Patvirtinimo laiškas išsiųstas.',
-'confirmemail_oncreate' => 'Patvirtinimo kodas buvo išsiųstas jūsų el. pašto adresu.
+'confirmemail_pending' => 'Patvirtinimo kodas jums jau nusiųstas; jei neseniai sukūrėte savo paskyrą, jūs turėtumėte palaukti jo dar kelias minutes prieš prašydami naujo kodo.',
+'confirmemail_send' => 'Išsiųsti patvirtinimo kodą',
+'confirmemail_sent' => 'Patvirtinimo laiškas išsiųstas.',
+'confirmemail_oncreate' => 'Patvirtinimo kodas buvo išsiųstas jūsų el. pašto adresu.
Šis kodas nėra būtinas, kad prisijungtumėte, bet jums reikės jį duoti prieš įjungiant el. pašto paslaugas projekte.',
-'confirmemail_sendfailed' => '{{SITENAME}} neišsiuntė patvirtinamojo laiško. Patikrinkite, ar adrese nėra klaidingų simbolių.
+'confirmemail_sendfailed' => '{{SITENAME}} neišsiuntė patvirtinamojo laiško. Patikrinkite, ar adrese nėra klaidingų simbolių.
Pašto tarnyba atsakė: $1',
-'confirmemail_invalid' => 'Neteisingas patvirtinimo kodas. Kodo galiojimas gali būti jau pasibaigęs.',
-'confirmemail_needlogin' => 'Jums reikia $1, kad patvirtintumėte savo el. pašto adresą.',
-'confirmemail_success' => 'Jūsų el. pašto adresas patvirtintas. Dabar galite prisijungti ir mėgautis projektu.',
-'confirmemail_loggedin' => 'Jūsų el. pašto adresas patvirtintas.',
-'confirmemail_error' => 'Patvirtinimo metu įvyko neatpažinta klaida.',
-'confirmemail_subject' => '{{SITENAME}} el. pašto adreso patvirtinimas',
-'confirmemail_body' => 'Kažkas, tikriausiai jūs IP adresu $1, užregistravo
+'confirmemail_invalid' => 'Neteisingas patvirtinimo kodas. Kodo galiojimas gali būti jau pasibaigęs.',
+'confirmemail_needlogin' => 'Jums reikia $1, kad patvirtintumėte savo el. pašto adresą.',
+'confirmemail_success' => 'Jūsų el. pašto adresas patvirtintas. Dabar galite prisijungti ir mėgautis projektu.',
+'confirmemail_loggedin' => 'Jūsų el. pašto adresas patvirtintas.',
+'confirmemail_error' => 'Patvirtinimo metu įvyko neatpažinta klaida.',
+'confirmemail_subject' => '{{SITENAME}} el. pašto adreso patvirtinimas',
+'confirmemail_body' => 'Kažkas, tikriausiai jūs IP adresu $1, užregistravo
paskyrą „$2“ susietą su šiuo el. pašto adresu projekte {{SITENAME}}.
Kad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir aktyvuotumėte
@@ -3086,8 +3156,22 @@ kad atšauktumėte el. pašto adreso patvirtinimą:
$5
Patvirtinimo kodas baigs galioti $4.',
-'confirmemail_invalidated' => 'El. pašto adreso patvirtinimas atšauktas',
-'invalidateemail' => 'El. pašto patvirtinimo atšaukimas',
+'confirmemail_body_changed' => 'Kažkas, tikriausiai jūs IP adresu $1, projekte {{SITENAME}}
+pakeitė paskyros „$2“ el. pašto adresą.
+
+Kad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir vėl aktyvuotumėte
+el. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:
+
+$3
+
+Jei paskyra jums *nepriklauso*, eikite Å¡ia nuoroda,
+kad atšauktumėte el. pašto adreso patvirtinimą:
+
+$5
+
+Patvirtinimo kodas baigs galioti $4.',
+'confirmemail_invalidated' => 'El. pašto adreso patvirtinimas atšauktas',
+'invalidateemail' => 'El. pašto patvirtinimo atšaukimas',
# Scary transclusion
'scarytranscludedisabled' => '[Tarpprojektinis įterpimas yra išjungtas]',
@@ -3127,6 +3211,7 @@ Prašome patvirtinti, kad tikrai norite iš naujo sukurti puslapį.",
'table_pager_first' => 'Pirmas puslapis',
'table_pager_last' => 'Paskutinis puslapis',
'table_pager_limit' => 'Rodyti po $1 puslapyje',
+'table_pager_limit_label' => 'Elementai puslapyje:',
'table_pager_limit_submit' => 'Rodyti',
'table_pager_empty' => 'Jokių rezultatų',
@@ -3199,6 +3284,13 @@ Jūs taip pat galite [[Special:Watchlist/edit|naudoti standartinį redaktorių]]
'version-hook-subscribedby' => 'Užsakyta',
'version-version' => '(Versija $1)',
'version-license' => 'Licencija',
+'version-poweredby-credits' => "Šis projektas naudoja '''[http://www.mediawiki.org/ MediaWiki]''', autorystės teisės © 2001-$1 $2.",
+'version-poweredby-others' => 'kiti',
+'version-license-info' => 'MediaWiki yra nemokama programinė įranga; galite ją platinti ir/arba modifikuoti pagal GNU General Public License, kurią publikuoja Free Software Foundation; taikoma 2-oji licenzijos versija arba (Jūsų pasirinkimu) bet kuri vėlesnė versija.
+
+MediaWiki yra platinama su viltimi, kad ji bus naudinga, bet BE JOKIOS GARANTIJOS; be jokios numanomos PARDAVIMO arba TINKAMUMO TAM TIKRAM TIKSLUI garantijos. Daugiau informacijos galite sužinoti GNU General Public License.
+
+Jūs turėjote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License kopiją] kartu su šia programa, jei ne, rašykite Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, JAV arba [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html perskaitykite ją internete].',
'version-software' => 'Įdiegta programinė įranga',
'version-software-product' => 'Produktas',
'version-software-version' => 'Versija',
@@ -3268,6 +3360,15 @@ Jūs taip pat galite [[Special:Watchlist/edit|naudoti standartinį redaktorių]]
'tags-edit' => 'taisyti',
'tags-hitcount' => '$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}',
+# Special:ComparePages
+'comparepages' => 'Palyginti puslapius',
+'compare-selector' => 'Palyginti puslapio keitimus',
+'compare-page1' => 'Puslapis 1',
+'compare-page2' => 'Puslapis 2',
+'compare-rev1' => 'Pirma versija',
+'compare-rev2' => 'Antra versija',
+'compare-submit' => 'Palyginti',
+
# Database error messages
'dberr-header' => 'Ši svetainė turi problemų.',
'dberr-problems' => 'Atsiprašome! Svetainei iškilo techninių problemų.',
@@ -3284,8 +3385,13 @@ Jūs taip pat galite [[Special:Watchlist/edit|naudoti standartinį redaktorių]]
'htmlform-float-invalid' => 'Nurodyta reikÅ¡mÄ— nÄ—ra skaiÄius.',
'htmlform-int-toolow' => 'Reikšmė, kurią nurodėte, yra mažesnė nei mažiausia leistina $1',
'htmlform-int-toohigh' => 'Reikšmė, kurią nurodėte, yra didesnė nei didžiausia leistina $1',
+'htmlform-required' => 'Ši vertė būtina',
'htmlform-submit' => 'Siųsti',
'htmlform-reset' => 'Atšaukti pakeitimus',
'htmlform-selectorother-other' => 'Kita',
+# SQLite database support
+'sqlite-has-fts' => '$1 su visatekstės paieškos palaikymu',
+'sqlite-no-fts' => '$1 be visatekstės paieškos palaikymo',
+
);
diff --git a/languages/messages/MessagesLtg.php b/languages/messages/MessagesLtg.php
index 3cab403f..5c7583f4 100644
--- a/languages/messages/MessagesLtg.php
+++ b/languages/messages/MessagesLtg.php
@@ -12,6 +12,25 @@
* @author Jureits
*/
+$namespaceNames = array(
+ NS_MEDIA => 'Medeja',
+ NS_SPECIAL => 'Seviškuo',
+ NS_TALK => 'Sprīža',
+ NS_USER => 'LÄ«tuotuojs',
+ NS_USER_TALK => 'Sprīža_ap_lītuotuoju',
+ NS_PROJECT_TALK => 'Sprīža_ap_{{GRAMMAR:accusative|$1}}',
+ NS_FILE => 'Fails',
+ NS_FILE_TALK => 'Sprīža_ap_failu',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Sprīža_ap_MediaWiki',
+ NS_TEMPLATE => 'Taiss',
+ NS_TEMPLATE_TALK => 'Sprīža_ap_taisu',
+ NS_HELP => 'Paleigs',
+ NS_HELP_TALK => 'Sprīža_ap_paleigu',
+ NS_CATEGORY => 'Kategoreja',
+ NS_CATEGORY_TALK => 'Sprīža_ap_kategoreju',
+);
+
$fallback = 'lv';
$messages = array(
@@ -107,23 +126,16 @@ $messages = array(
'faqpage' => 'Project:BUV',
# Vector skin
-'vector-action-addsection' => 'Dalikt padaļu',
-'vector-action-delete' => 'Iztreit',
-'vector-action-move' => 'Puorceļt',
-'vector-action-protect' => 'Apsorguot',
-'vector-action-unprotect' => 'NÅ«jimt apsardzeibu',
-'vector-namespace-category' => 'Kategoreja',
-'vector-namespace-image' => 'Fails',
-'vector-namespace-mediawiki' => 'Viestejums',
-'vector-namespace-project' => 'Projekta puslopa',
-'vector-namespace-special' => 'Specialuo puslopa',
-'vector-namespace-talk' => 'Sprīža',
-'vector-namespace-template' => 'Taiss',
-'vector-view-edit' => 'Pataiseit',
-'vector-view-history' => 'Viesture',
-'vector-view-view' => 'Vērtīs',
-'namespaces' => 'Vuordu pluoti',
-'variants' => 'Varianti',
+'vector-action-addsection' => 'Dalikt padaļu',
+'vector-action-delete' => 'Iztreit',
+'vector-action-move' => 'Puorceļt',
+'vector-action-protect' => 'Apsorguot',
+'vector-action-unprotect' => 'NÅ«jimt apsardzeibu',
+'vector-view-edit' => 'Pataiseit',
+'vector-view-history' => 'Viesture',
+'vector-view-view' => 'Vērtīs',
+'namespaces' => 'Vuordu pluoti',
+'variants' => 'Varianti',
'errorpagetitle' => 'Klaida',
'returnto' => 'Grīztīs da puslopys $1.',
@@ -238,7 +250,7 @@ Par to var ziņuot [[Special:ListUsers/sysop|kaidam administratoram]], nūruodū
# Login and logout pages
'yourname' => 'SlÄgvuords:',
'yourpassword' => 'Paroļs:',
-'remembermypassword' => 'Atguoduot munu paroli iz ituo datora',
+'remembermypassword' => 'Atguoduot muni iz ituo datora (na vaira kai $1 {{PLURAL:$1|dīnu|dīnom|dīnom}})',
'login' => 'DasaslÄgt',
'nav-login-createaccount' => 'DasaslÄgt / sataiseit jaunu lÄ«tuotuoju',
'userlogin' => 'DasaslÄgt / sataiseit jaunu lÄ«tuotuoju',
@@ -248,6 +260,7 @@ Par to var ziņuot [[Special:ListUsers/sysop|kaidam administratoram]], nūruodū
'nologinlink' => 'Registrētīs',
'createaccount' => 'Sataiseit jaunu lītuotuoju',
'gotaccountlink' => 'DasaslÄgt',
+'createaccountreason' => 'Īmesle:',
'mailmypassword' => 'Atsyuteit maņ jaunu paroli',
'loginlanguagelabel' => 'Volūda: $1',
@@ -573,7 +586,6 @@ Lopys, kas ir tovÄ [[Special:Watchlist|puorraugamÅ«s rokstu sarokstÄ]] ir '''r
# Watchlist
'watchlist' => 'Muns davēris saroksts',
'mywatchlist' => 'Muns davēris saroksts',
-'watchlistfor' => "(deļ '''$1''')",
'addedwatch' => 'Davīnuots puorraugamū sarokstam.',
'addedwatchtext' => "Lopa \"[[:\$1]]\" ir davÄ«nuota [[Special:Watchlist|tevis puorraugamajom lopom]], kur tiks paruodeitys izmainis, kas izdareitys itymÄ lopÄ voi ituos lopys sarunu lopÄ, kai ari itei lopa tiks Ä«zeimÄta '''pusrasna''' [[Special:RecentChanges|pÄdejÅ«s izmaiņu lopÄ]], lai itÅ« byutu vÄ«gluok pamaneit.
@@ -813,9 +825,9 @@ Tys ļaun davÄ«nuot pamatuojumu kÅ«psavylkumÄ.',
'nextdiff' => 'Jaunuokuo verseja →',
# Media information
-'file-info-size' => '($1 × $2 pikseli, faila izmÄrs: $3, MIME tips: $4)',
+'file-info-size' => '$1 × $2 pikseli, faila izmÄrs: $3, MIME tips: $4',
'file-nohires' => '<small>Augstuoka izškirtspieja nav pīejama.</small>',
-'svg-long-desc' => '(SVG fails, definÄtais lelums $1 × $2 pikseli, faila lelums: $3)',
+'svg-long-desc' => 'SVG fails, definÄtais lelums $1 × $2 pikseli, faila lelums: $3',
'show-big-image' => 'PylnÄ lelumÄ',
'show-big-image-thumb' => '<small>Ituo pyrmsskota lelums: $1 × $2 pikseli</small>',
@@ -863,6 +875,7 @@ Puorejī lauki, piec nūklusiejuma, byus nūglobuoti.
'version-specialpages' => 'Specialuos puslopys',
'version-version' => '(Verseja $1)',
'version-license' => 'Liceņceja',
+'version-poweredby-others' => 'cyti',
'version-software-product' => 'Produkts',
'version-software-version' => 'Verseja',
diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php
index 9026f62a..43d870d7 100644
--- a/languages/messages/MessagesLv.php
+++ b/languages/messages/MessagesLv.php
@@ -43,7 +43,7 @@ $namespaceNames = array(
NS_CATEGORY => 'Kategorija',
NS_CATEGORY_TALK => 'Kategorijas_diskusija',
);
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$messages = array(
# User preference toggles
@@ -61,8 +61,7 @@ $messages = array(
'tog-editsection' => 'RÄdÄ«t sadaļÄm izmainÄ«Å¡anas saiti "[labot]"',
'tog-editsectiononrightclick' => "Atvērt sadaļas rediģēšanas lapu, uzklikšķinot ar labo peles pogu uz sadaļas virsraksta (izmanto ''JavaScript'')",
'tog-showtoc' => 'ParÄdÄ«t satura rÄdÄ«tÄju (lapÄm, kurÄs ir vairÄk par 3 virsrakstiem)',
-'tog-rememberpassword' => 'AtcerÄ“ties paroli pÄ“c pÄrlÅ«ka aizvÄ“rÅ¡anas',
-'tog-editwidth' => 'ParÄdÄ«t izmainÄ«Å¡anas logu visa ekrÄna platumÄ',
+'tog-rememberpassword' => 'AtcerÄ“ties manu lietotÄjvÄrdu pÄ“c pÄrlÅ«ka aizvÄ“rÅ¡anas (ne vairÄk kÄ $1 {{PLURAL:$1|diena|dienas}}).',
'tog-watchcreations' => 'Pievienot manis radÄ«tÄs lapas uzraugÄmo lapu sarakstam',
'tog-watchdefault' => 'Pievienot manis izmainÄ«tÄs lapas uzraugÄmo lapu sarakstam',
'tog-watchmoves' => 'Pievienot manis pÄrvietotÄs lapas uzraugÄmo lapu sarakstam',
@@ -206,31 +205,21 @@ $messages = array(
'faqpage' => 'Project:BUJ',
# Vector skin
-'vector-action-addsection' => 'Jauna sadaļa',
-'vector-action-delete' => 'Dzēst',
-'vector-action-move' => 'PÄrvietot',
-'vector-action-protect' => 'AizsargÄt',
-'vector-action-undelete' => 'Atjaunot',
-'vector-action-unprotect' => 'NeaizsargÄt',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Palīdzības lapa',
-'vector-namespace-image' => 'Attēls',
-'vector-namespace-main' => 'Raksts',
-'vector-namespace-media' => 'Multivides lapa',
-'vector-namespace-mediawiki' => 'Paziņojums',
-'vector-namespace-project' => 'Projekta lapa',
-'vector-namespace-special' => 'ĪpaÅ¡Ä lapa',
-'vector-namespace-talk' => 'Diskusija',
-'vector-namespace-template' => 'Veidne',
-'vector-namespace-user' => 'LietotÄja lapa',
-'vector-view-create' => 'Izveidot',
-'vector-view-edit' => 'Rediģēt',
-'vector-view-history' => 'Hronoloģija',
-'vector-view-view' => 'Skatīt',
-'vector-view-viewsource' => 'Aplūkot kodu',
-'actions' => 'Darbības',
-'namespaces' => 'VÄrdtelpas',
-'variants' => 'Varianti',
+'vector-action-addsection' => 'Jauna sadaļa',
+'vector-action-delete' => 'Dzēst',
+'vector-action-move' => 'PÄrvietot',
+'vector-action-protect' => 'AizsargÄt',
+'vector-action-undelete' => 'Atjaunot',
+'vector-action-unprotect' => 'NeaizsargÄt',
+'vector-simplesearch-preference' => 'IeslÄ“gt uzlabotÄs meklÄ“Å¡anas piedÄvÄjumus (tikai Vector apdarÄ“)',
+'vector-view-create' => 'Izveidot',
+'vector-view-edit' => 'Rediģēt',
+'vector-view-history' => 'Hronoloģija',
+'vector-view-view' => 'Skatīt',
+'vector-view-viewsource' => 'Aplūkot kodu',
+'actions' => 'Darbības',
+'namespaces' => 'VÄrdtelpas',
+'variants' => 'Varianti',
'errorpagetitle' => 'Kļūda',
'returnto' => 'Atgriezties: $1.',
@@ -291,6 +280,7 @@ PÄrÄk daudz lietotÄju mÄ“Ä£ina apskatÄ«t Å¡o lapu.
Lūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīties vēlreiz.
$1',
+'pool-errorunknown' => 'NezinÄma kļūda',
# 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' => 'Par {{grammar:akuzatīvs|{{SITENAME}}}}',
@@ -446,7 +436,7 @@ Tavs lietotÄja konts ir izveidots. Neaizmirsti, ka ir iespÄ“jams mainÄ«t [[Spec
'yourname' => 'Tavs lietotÄjvÄrds',
'yourpassword' => 'Tava parole:',
'yourpasswordagain' => 'AtkÄrto paroli',
-'remembermypassword' => 'AtcerÄ“ties manu paroli pÄ“c pÄrlÅ«ka aizvÄ“rÅ¡anas.',
+'remembermypassword' => 'AtcerÄ“ties pÄ“c pÄrlÅ«ka aizvÄ“rÅ¡anas (spÄ“kÄ ne vairÄk kÄ $1 {{PLURAL:$1|diena|dienas}}).',
'yourdomainname' => 'Tavs domēns',
'externaldberror' => 'Notikusi vai nu ÄrÄ“jÄs autentifikÄcijas datubÄzes kļūda, vai arÄ« tev nav atļauts izmainÄ«t savu ÄrÄ“jo kontu.',
'login' => 'Ieiet',
@@ -463,6 +453,7 @@ Tavs lietotÄja konts ir izveidots. Neaizmirsti, ka ir iespÄ“jams mainÄ«t [[Spec
'gotaccount' => "Tev jau ir lietotÄjvÄrds? '''$1'''!",
'gotaccountlink' => 'Dodies iekÅ¡Ä',
'createaccountmail' => 'pa e-pastu',
+'createaccountreason' => 'Iemesls:',
'badretype' => 'Tevis ievadÄ«tÄs paroles nesakrÄ«t.',
'userexists' => 'Å Äds lietotÄja vÄrds jau eksistÄ“. IzvÄ“lies citu vÄrdu.',
'loginerror' => 'Neveiksmīga ieiešana',
@@ -513,6 +504,9 @@ TÄdēļ Å¡obrÄ«d no Å¡Ä«s IP adreses vairs nevar izveidot jaunus kontus.',
Lūdzu uzgaidi pirms mēģini vēlreiz.',
'loginlanguagelabel' => 'Valoda: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'NezinÄma kļūda PHP mail() funkcijÄ',
+
# Password reset dialog
'resetpass' => 'Mainīt paroli',
'resetpass_header' => 'Mainīt konta paroli',
@@ -563,10 +557,11 @@ Tu jau esi veiksmīgi nomainījis savu galveno paroli, vai arī esi pieprasījis
'showlivepreview' => 'Tūlītējs pirmskats',
'showdiff' => 'RÄdÄ«t izmaiņas',
'anoneditwarning' => "'''UzmanÄ«bu:''' tu neesi iegÄjis. Lapas hronoloÄ£ijÄ tiks ierakstÄ«ta tava IP adrese.",
+'anonpreviewwarning' => "''Tu neesi ienÄcis. SaglabÄjot lapu, Tava IP adrese tiks ierakstÄ«ta Å¡Ä«s lapas hronoloÄ£ijÄ.''",
'missingsummary' => "'''AtgÄdinÄjums''': Tu neesi norÄdÄ«jis izmaiņu kopsavilkumu. VÄ“lreiz klikÅ¡Ä·inot uz \"SaglabÄt lapu\", Tavas izmaiņas tiks saglabÄtas bez kopsavilkuma.",
'missingcommenttext' => 'LÅ«dzu, ievadi tekstu zemÄk redzamajÄ logÄ!',
'missingcommentheader' => "'''AtgÄdinÄjums:''' Tu Å¡im komentÄram neesi norÄdÄ«jis virsrakstu/tematu.
-Ja tu vÄ“lreiz uzspiedÄ«si uz SaglabÄt, tavas izmaiņas tiks saglabÄtas bez tÄ virsraksta.",
+Ja tu vÄ“lreiz spiedÄ«si uz \"{{int:savearticle}}\", tavas izmaiņas tiks saglabÄtas bez virsraksta.",
'summary-preview' => 'Kopsavilkuma pirmskats:',
'subject-preview' => 'Kopsavilkuma/virsraksta pirmskats:',
'blockedtitle' => 'LietotÄjs ir bloÄ·Ä“ts.',
@@ -674,7 +669,6 @@ IzvÄ“loties \"SaglabÄt lapu\", Tu apliecini, ka Å¡o rakstu esi rakstÄ«jis vai p
Tu apliecini, ka Å¡o rakstu esi rakstÄ«jis vai papildinÄjis pats vai izmantojis informÄciju no darba, ko neaizsargÄ autortiesÄ«bas, vai tamlÄ«dzÄ«ga brÄ«vi pieejama resursa (sÄ«kÄk skatÄ«t $1).
'''BEZ ATĻAUJAS NEPIEVIENO DARBU, KO AIZSARGĀ AUTORTIESĪBAS!'''",
-'longpagewarning' => "'''Å Ä« lapa ir $1 kilobaitus liela. Tas var bÅ«t vairÄk par lapas optimÄlo izmÄ“ru. LÅ«dzu apsver iespÄ“ju saÅ¡Ä·elt to mazÄkÄs sekcijÄs.'''",
'longpageerror' => "'''Kļūda: Teksts, kuru tu mÄ“Ä£inÄji saglabÄt, ir $1 kilobaitus garÅ¡, kas ir vairÄk nekÄ pieļaujamie $2 kilobaiti.
Tas nevar tikt saglabÄts.'''",
'readonlywarning' => "'''BrÄ«dinÄjums: DatubÄze ir slÄ“gta apkopei, tÄpÄ“c tu tagad nevarÄ“si saglabÄt veiktÄs izmaiņas.
@@ -719,7 +713,9 @@ IzskatÄs, ka lapa ir dzÄ“sta.',
TÄ jau eksistÄ“.',
# Parser/template warnings
-'parser-template-loop-warning' => 'Veidne ir ievietota tÄdÄ paÅ¡Ä veidnÄ“: [[$1]]',
+'expensive-parserfunction-category' => 'Lapas ar pÄrÄk daudz laikietilpÄ«giem apstrÄdes funkciju izsaukumiem',
+'post-expand-template-inclusion-category' => 'Lapas, kurÄm pÄrsniegts iekļauto veidņu apjoms',
+'parser-template-loop-warning' => 'Veidne ir ievietota tÄdÄ paÅ¡Ä veidnÄ“: [[$1]]',
# "Undo" feature
'undo-success' => 'Šo izmaiņu ir iespējams atcelt.
@@ -812,6 +808,8 @@ $1",
'logdelete-failure' => "'''ReÄ£istra redzamÄ«bu nevar uzstÄdÄ«t:'''
$1",
'revdel-restore' => 'mainīt redzamību',
+'revdel-restore-deleted' => 'dzÄ“stÄs versijas',
+'revdel-restore-visible' => 'redzamÄs versijas',
'pagehist' => 'Lapas vēsture',
'deletedhist' => 'Vēsture dzēsta',
'revdelete-content' => 'saturs',
@@ -857,11 +855,12 @@ $1",
# Diffs
'history-title' => '"$1" versiju hronoloģija',
'difference' => '(AtÅ¡Ä·irÄ«bas starp versijÄm)',
+'difference-multipage' => '(AtÅ¡Ä·irÄ«bas starp lapÄm)',
'lineno' => '$1. rindiņa:',
'compareselectedversions' => 'SalÄ«dzinÄt izvÄ“lÄ“tÄs versijas',
'showhideselectedversions' => 'RÄdÄ«t/slÄ“pt izvÄ“lÄ“tÄs versijas',
'editundo' => 'atcelt',
-'diff-multi' => '({{PLURAL:$1|Viena starpversija nav parÄdÄ«ta|$1 starpversijas nav parÄdÄ«tas}}.)',
+'diff-multi' => '({{PLURAL:$1|Viena starpversija|$1 starpversijas}} no {{PLURAL:$2|viena lietotÄja|$2 lietotÄjiem}} nav parÄdÄ«ta)',
# Search results
'searchresults' => 'MeklÄ“Å¡anas rezultÄti',
@@ -968,6 +967,7 @@ PagaidÄm vari meklÄ“t, izmantojot Google vai Yahoo.
'resultsperpage' => 'LappusÄ“ parÄdÄmo rezultÄtu skaits',
'contextlines' => 'Cik rindiņas parÄdÄ«t katram atrastajam rezultÄtam',
'contextchars' => 'Konteksta simbolu skaits vienÄ rindiņÄ',
+'stub-threshold-disabled' => 'Atslēgts',
'recentchangesdays' => 'Dienu skaits, kuru rÄdÄ«t pÄ“dÄ“jajÄs izmaiņÄs:',
'recentchangesdays-max' => 'Ne vairÄk kÄ $1 {{PLURAL:$1|diena|dienas}}',
'recentchangescount' => 'Izmaiņu skaits, kuru rÄda pÄ“c noklusÄ“juma:',
@@ -1001,6 +1001,7 @@ Ja vēlies, tu vari izmantot šo nejauši uzģenerēto kodu: $1',
'prefs-files' => 'Attēli',
'prefs-custom-css' => 'Personīgais CSS',
'prefs-custom-js' => 'Personīgais JS',
+'prefs-common-css-js' => 'Koplietojams CSS/JavaScript visÄs apdarÄ“s:',
'prefs-emailconfirm-label' => 'E-pasta statuss:',
'prefs-textboxsize' => 'Rediģēšanas loga izmērs',
'youremail' => 'Tava e-pasta adrese:',
@@ -1036,9 +1037,15 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'prefs-advancedrendering' => 'Papildus uzstÄdÄ«jumi',
'prefs-advancedsearchoptions' => 'Papildus uzstÄdÄ«jumi',
'prefs-advancedwatchlist' => 'Papildus uzstÄdÄ«jumi',
-'prefs-display' => 'PamatuzstÄdÄ«jumi',
+'prefs-displayrc' => 'PamatuzstÄdÄ«jumi',
+'prefs-displaysearchoptions' => 'PamatuzstÄdÄ«jumi',
+'prefs-displaywatchlist' => 'PamatuzstÄdÄ«jumi',
'prefs-diffs' => 'Izmaiņas',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-pasta adrese šķiet derīga',
+'email-address-validity-invalid' => 'Ievadi derīgu e-pasta adresi',
+
# User rights
'userrights' => 'LietotÄju tiesÄ«bu pÄrvaldÄ«ba',
'userrights-lookup-user' => 'PÄrvaldÄ«t lietotÄja grupas',
@@ -1114,6 +1121,7 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'right-hideuser' => 'BloÄ·Ä“t lietotÄjvÄrdu, slÄ“pjot to no citiem lietotÄjiem',
'right-ipblock-exempt' => 'Apiet IP bloÄ·Ä“Å¡anu, automÄtisku bloÄ·Ä“Å¡anu un IP apgabalu bloÄ·Ä“Å¡anu',
'right-proxyunbannable' => "Apiet ''proxy'' automÄtiskos blokus",
+'right-unblockself' => 'AtbloÄ·Ä“t sevi',
'right-protect' => 'IzmainÄ«t aizsargÄtÄs lapas un to aizsardzÄ«bas lÄ«meni',
'right-editprotected' => 'Labot aizsargÄtÄs lapas (bez kaskÄdes aizsardzÄ«bas)',
'right-editinterface' => 'IzmainÄ«t lietotÄja interfeisu',
@@ -1183,14 +1191,9 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'recentchanges-legend' => 'Pēdējo izmaiņu iespējas',
'recentchangestext' => 'Å ajÄ lapÄ ir Å¡itajÄ viki izdarÄ«tÄs pÄ“dÄ“jÄs izmaiņas.',
'recentchanges-feed-description' => 'Sekojiet lÄ«dzi jaunÄkajÄm izmaiņÄm vikijÄ izmantojot Å¡o barotni.',
-'recentchanges-label-legend' => 'Apzīmējumu skaidrojums: $1.',
-'recentchanges-legend-newpage' => '$1 - jauna lapa',
'recentchanges-label-newpage' => 'Å Ä« ir jaunizveidota lapa',
-'recentchanges-legend-minor' => '$1 - maznozīmīga izmaiņa',
'recentchanges-label-minor' => 'Šī ir maznozīmīga izmaiņa',
-'recentchanges-legend-bot' => '$1 - bota veikta izmaiņa',
'recentchanges-label-bot' => 'Šī ir bota veikta izmaiņa',
-'recentchanges-legend-unpatrolled' => '$1 - nepatrulēts labojums',
'recentchanges-label-unpatrolled' => 'Å is labojums vÄ“l nav pÄrbaudÄ«ts',
'rcnote' => 'Å obrÄ«d ir {{PLURAL:$1|redzama pÄ“dÄ“jÄ <strong>$1</strong> izmaiņa, kas izdarÄ«ta|redzamas pÄ“dÄ“jÄs <strong>$1</strong> izmaiņas, kas izdarÄ«tas}} {{PLURAL:$2|pÄ“dÄ“jÄ|pÄ“dÄ“jÄs}} <strong>$2</strong> {{PLURAL:$2|dienÄ|dienÄs}} (lÄ«dz $4, $5).',
'rcnotefrom' => "Å obrÄ«d redzamas izmaiņas kopÅ¡ '''$2''' (parÄdÄ«tas ne vairÄk par '''$1''').",
@@ -1237,6 +1240,9 @@ Lapas, kas ir tavÄ [[Special:Watchlist|uzraugÄmo rakstu sarakstÄ]] ir '''trek
'upload_directory_missing' => 'AugÅ¡upielÄdes direktorijs ($1) ir pazudis, un to tÄ«mekļa serveris nevar izveidot.',
'upload_directory_read_only' => 'AugÅ¡upielÄdes direktoriju ($1) tÄ«mekļa serveris nevar labot.',
'uploaderror' => 'AugÅ¡upielÄdes kļūda',
+'upload-recreate-warning' => "'''BrÄ«dinÄjums: Fails ar Å¡Ädu nosaukumu ir dzÄ“sts vai pÄrvietots.'''
+
+ DzÄ“Å¡anas un pÄrvietoÅ¡anas reÄ£istri Å¡ai lapai ir uzskaitÄ«ti Å¡eit:",
'uploadtext' => "Pirms tu kaut ko augÅ¡upielÄdÄ“, noteikti izlasi un ievÄ“ro [[Project:AttÄ“lu izmantoÅ¡anas noteikumi|attÄ“lu izmantoÅ¡anas noteikumus]].
Lai aplÅ«kotu vai meklÄ“tu agrÄk augÅ¡uplÄdÄ“tus attÄ“lus,
@@ -1287,6 +1293,16 @@ PÄrskatÄmÄka versija ir pieejama [[Special:NewFiles|jauno attÄ“lu galerijÄ]]
'filetype-unwanted-type' => "'''\".\$1\"''' ir nevēlams failu tips. {{PLURAL:\$3|Ieteicamais faila tips|Ieteicamie failu tipi}} ir \$2.",
'filetype-banned-type' => "'''\".\$1\"''' nav atļautais failu tips. {{PLURAL:\$3|Atļautais faila tips|Atļautie failu tipi}} ir \$2.",
'filetype-missing' => 'Failam nav paplaÅ¡inÄjuma (piem. tÄda kÄ ".jpg").',
+'empty-file' => 'Fails, ko Tu iesniedzi, bija tukšs.',
+'file-too-large' => 'Fails, ko Tu iesniedzi, bija pÄrÄk liels.',
+'filename-tooshort' => 'Faila nosaukums ir pÄrÄk Ä«ss.',
+'filetype-banned' => 'Å is failu tips ir aizliegts.',
+'verification-error' => 'Å is fails neizturÄ“ja failu pÄrbaudi.',
+'illegal-filename' => 'Faila nosaukums nav atļauts.',
+'overwrite' => 'PÄrrakstÄ«t jau esoÅ¡u failu nav atļauts.',
+'unknown-error' => 'NezinÄma kļūda.',
+'tmp-create-error' => 'NeizdevÄs izveidot pagaidu failu.',
+'tmp-write-error' => 'Kļūda veidojot pagaidu failu.',
'large-file' => 'Ieteicams, lai faili nebÅ«tu lielÄki par $1;
šī faila izmērs ir $2.',
'largefileserver' => 'Å is fails ir lielÄks nekÄ serveris ņem pretÄ«.',
@@ -1299,13 +1315,14 @@ Ja tev ir Å¡is pats attÄ“ls pilnÄ izmÄ“rÄ, augÅ¡uplÄdÄ“ to, ja nav, tad nomai
'fileexists-forbidden' => 'Fails ar Å¡Ädu nosaukumu jau eksistÄ“ un to nevar aizvietot ar jaunu.
Ja tu joprojÄm gribi augÅ¡uplÄdÄ“t Å¡o failu, tad mÄ“Ä£ini vÄ“lreiz, ar citu faila vÄrdu. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Fails ir kopija {{PLURAL:$1|Å¡im failam|Å¡iem failiem}}:',
-'successfulupload' => 'AugÅ¡upielÄde veiksmÄ«ga',
'uploadwarning' => 'AugÅ¡upielÄdes brÄ«dinÄjums',
'uploadwarning-text' => 'LÅ«dzu, pÄrveido zemÄk esoÅ¡o faila aprakstu un mÄ“Ä£ini vÄ“lreiz.',
'savefile' => 'SaglabÄt failu',
'uploadedimage' => 'augÅ¡upielÄdÄ“ja "[[$1]]"',
'overwroteimage' => 'augÅ¡upielÄdÄ“ta jauna "[[$1]]" versija',
'uploaddisabled' => 'AugÅ¡upielÄde atslÄ“gta',
+'copyuploaddisabled' => 'URL augÅ¡upielÄdes nav atļautas.',
+'uploadfromurl-queued' => 'Tava augÅ¡upielÄde tika pievienota rindÄ.',
'uploaddisabledtext' => 'Failu augÅ¡upielÄde ir atslÄ“gta.',
'php-uploaddisabledtext' => 'Failu augÅ¡upielÄde ir atslÄ“gta PHP.
LÅ«dzu, pÄrbaudi file_uploads uzstÄdÄ«jumu.',
@@ -1327,6 +1344,10 @@ ApdomÄ labi, vai tieÅ¡Äm ir lietderÄ«gi turpinÄt Å¡Ä« faila augÅ¡uplÄdi.
Te var apskatÄ«ties dzÄ“Å¡anas reÄ£istru, lai noskaidrotu kÄpÄ“c Å¡o failu toreiz izdzÄ“sa:",
'filename-bad-prefix' => "Faila vÄrds failam, kuru tu mÄ“Ä£ini augÅ¡pulÄdÄ“t, sÄkas ar '''\"\$1\"''', kas ir neaprakstoÅ¡s vÄrds, kÄdu parasti uzÄ£enerÄ“ digitÄlais fotoaparÄts.
LÅ«dzu izvÄ“lies aprakstoÅ¡Äku vÄrdu Å¡im failam.",
+'upload-success-subj' => 'AugÅ¡upielÄde veiksmÄ«ga',
+'upload-success-msg' => 'JÅ«su augÅ¡upielÄdÄ“t no [$2] bija veiksmÄ«ga. TÄ ir pieejama Å¡eit: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'AugÅ¡upielÄdes problÄ“ma',
+'upload-warning-subj' => 'AugÅ¡upielÄdes brÄ«dinÄjums',
'upload-proto-error' => 'Nepareizs protokols',
'upload-file-error' => 'IekÅ¡Ä“jÄ kļūda',
@@ -1470,7 +1491,6 @@ Apraksts ir [$2 faila apraksta lapÄ], kas ir parÄdÄ«ta zemÄk.',
'statistics-edits-average' => 'Vidējais izmaiņu skaits uz lapu',
'statistics-views-total' => 'SkatÄ«jumi kopÄ',
'statistics-views-peredit' => 'Skatījumu skaits uz labojumu',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Darbu rindas] garums',
'statistics-users' => 'ReÄ£istrÄ“ti lietotÄji',
'statistics-users-active' => 'AktÄ«vi lietotÄji',
'statistics-users-active-desc' => 'LietotÄji, kas ir veikuÅ¡i jebkÄdu darbÄ«bu {{PLURAL:$1|iepriekÅ¡Ä“jÄ dienÄ|iepriekÅ¡Ä“jÄs $1 dienÄs}}',
@@ -1485,8 +1505,9 @@ Lapu uzskata par nozÄ«mju atdalÄ«Å¡anas lapu, ja tÄ satur veidni, uz kuru ir sa
'doubleredirects' => 'DivkÄrÅ¡as pÄradresÄcijas lapas',
'doubleredirectstext' => 'Å ajÄ lapÄ ir uzskaitÄ«tas pÄradresÄcijas lapas, kuras pÄradresÄ“ uz citÄm pÄradresÄcijas lapÄm.
KatrÄ rindiÅ†Ä ir saites uz pirmo un otro pÄradresÄcijas lapu, kÄ arÄ« pirmÄ rindiņa no otrÄs pÄradresÄcijas lapas teksta, kas parasti ir faktiskÄ "gala" lapa, uz kuru vajadzÄ“tu bÅ«t saitei pirmajÄ lapÄ.
-<s>Nosvītrotie</s> ieraksti jau ir tikuši salaboti.',
+<del>Nosvītrotie</del> ieraksti jau ir tikuši salaboti.',
'double-redirect-fixed-move' => '[[$1]] bija ticis pÄrvietots, tas tagad ir pÄradresÄcija uz [[$2]]',
+'double-redirect-fixer' => 'PÄradresÄciju labotÄjs',
'brokenredirects' => 'Kļūdainas pÄradresÄcijas',
'brokenredirectstext' => 'Å Ä«s ir pÄradresÄcijas lapas uz neesoÅ¡Äm lapÄm:',
@@ -1507,6 +1528,8 @@ KatrÄ rindiÅ†Ä ir saites uz pirmo un otro pÄradresÄcijas lapu, kÄ arÄ« pirm
'nmembers' => '$1 {{PLURAL:$1|lapa|lapas}}',
'nrevisions' => '$1 {{PLURAL:$1|versija|versijas}}',
'nviews' => 'skatīta $1 {{PLURAL:$1|reizi|reizes}}',
+'nimagelinks' => 'Izmantots $1 {{PLURAL:$1|lapÄ|lapÄs}}',
+'ntransclusions' => 'izmantots $1 {{PLURAL:$1|lapÄ|lapÄs}}',
'specialpage-empty' => 'Å im ziņojumam nav rezultÄtu.',
'lonelypages' => 'Lapas bez saitÄ“m uz tÄm',
'uncategorizedpages' => 'NekategorizÄ“tÄs lapas',
@@ -1578,9 +1601,10 @@ Tu vari saÅ¡aurinÄt aplÅ«kojamo reÄ£istru, izvÄ“loties reÄ£istra veidu, lietotÄ
'allinnamespace' => 'Visas lapas ($1 vÄrdtelpa)',
'allnotinnamespace' => 'Visas lapas (nav $1 vÄrdtelpa)',
'allpagesprev' => 'IepriekÅ¡Ä“jÄs',
-'allpagesnext' => 'NÄkoÅ¡Äs',
+'allpagesnext' => 'NÄkamÄs',
'allpagessubmit' => 'Aiziet!',
'allpagesprefix' => 'ParÄdÄ«t lapas ar Å¡Ädu virsraksta sÄkumu:',
+'allpages-bad-ns' => '{{SITENAME}} nav vÄrdkopas "$1".',
# Special:Categories
'categories' => 'Kategorijas',
@@ -1639,32 +1663,37 @@ Papildu informÄciju par katru individuÄlu piekļuves tiesÄ«bu veidu, iespÄ“jam
'listgrouprights-removegroup-all' => 'Noņemt visas grupas',
# E-mail user
-'mailnologin' => 'Nav adreses, uz kuru sūtīt',
-'mailnologintext' => 'Tev jÄbÅ«t [[Special:UserLogin|iegÄjuÅ¡am]], kÄ arÄ« tev jÄbÅ«t [[Special:Preferences|norÄdÄ«tai]] derÄ«gai e-pasta adresei, lai sÅ«tÄ«tu e-pastu citiem lietotÄjiem.',
-'emailuser' => 'SÅ«tÄ«t e-pastu Å¡im lietotÄjam',
-'emailpage' => 'SÅ«tÄ«t e-pastu lietotÄjam',
-'emailpagetext' => 'Ar Å¡o veidni ir iespÄ“jams nosÅ«tÄ«t e-pastu Å¡im lietotÄjam.
+'mailnologin' => 'Nav adreses, uz kuru sūtīt',
+'mailnologintext' => 'Tev jÄbÅ«t [[Special:UserLogin|iegÄjuÅ¡am]], kÄ arÄ« tev jÄbÅ«t [[Special:Preferences|norÄdÄ«tai]] derÄ«gai e-pasta adresei, lai sÅ«tÄ«tu e-pastu citiem lietotÄjiem.',
+'emailuser' => 'SÅ«tÄ«t e-pastu Å¡im lietotÄjam',
+'emailpage' => 'SÅ«tÄ«t e-pastu lietotÄjam',
+'emailpagetext' => 'Ar Å¡o veidni ir iespÄ“jams nosÅ«tÄ«t e-pastu Å¡im lietotÄjam.
TÄ e-pasta adrese, kuru tu esi norÄdÄ«jis [[Special:Preferences|savÄ izvēļu lapÄ]], parÄdÄ«sies e-pasta "From" lauciņÄ, tÄdejÄdi saņēmÄ“js varÄ“s tev atbildÄ“t.',
-'defemailsubject' => 'E-pasts par {{grammar:akuzatīvs|{{SITENAME}}}}',
-'noemailtitle' => 'Nav e-pasta adreses',
-'noemailtext' => 'Å is lietotÄjs nav norÄdÄ«jis derÄ«gu e-pasta adresi.',
-'nowikiemailtitle' => 'E-pasts nav atļauts',
-'nowikiemailtext' => 'Å is lietotÄjs ir vÄ“lÄ“jies nesaņemt e-pastu no citiem lietotÄjiem.',
-'email-legend' => 'SÅ«tÄ«t e-pastu citam {{SITENAME}} lietotÄjam',
-'emailfrom' => 'No:',
-'emailto' => 'Kam:',
-'emailsubject' => 'Temats:',
-'emailmessage' => 'Vēstījums:',
-'emailsend' => 'Nosūtīt',
-'emailccme' => 'Atsūtīt man uz e-pastu mana ziņojuma kopiju.',
-'emailsent' => 'E-pasts nosūtīts',
-'emailsenttext' => 'Tavs e-pasts ir nosūtīts.',
-'emailuserfooter' => 'Å is e-pasts ir lietotÄja $1 sÅ«tÄ«ts lietotÄjam $2, izmantojot "SÅ«tÄ«t e-pastu Å¡im lietotÄjam" funkciju {{SITENAME}}.',
+'usermailererror' => 'Pasta objekts atgrieza kļūdu:',
+'defemailsubject' => 'E-pasts par {{grammar:akuzatīvs|{{SITENAME}}}}',
+'usermaildisabled' => 'LietotÄja e-pasts atslÄ“gts',
+'usermaildisabledtext' => 'JÅ«s nevarat sÅ«tÄ«t e-pastu citiem lietotÄjiem Å¡ajÄ viki',
+'noemailtitle' => 'Nav e-pasta adreses',
+'noemailtext' => 'Å is lietotÄjs nav norÄdÄ«jis derÄ«gu e-pasta adresi.',
+'nowikiemailtitle' => 'E-pasts nav atļauts',
+'nowikiemailtext' => 'Å is lietotÄjs ir vÄ“lÄ“jies nesaņemt e-pastu no citiem lietotÄjiem.',
+'email-legend' => 'SÅ«tÄ«t e-pastu citam {{SITENAME}} lietotÄjam',
+'emailfrom' => 'No:',
+'emailto' => 'Kam:',
+'emailsubject' => 'Temats:',
+'emailmessage' => 'Vēstījums:',
+'emailsend' => 'Nosūtīt',
+'emailccme' => 'Atsūtīt man uz e-pastu mana ziņojuma kopiju.',
+'emailsent' => 'E-pasts nosūtīts',
+'emailsenttext' => 'Tavs e-pasts ir nosūtīts.',
+'emailuserfooter' => 'Å is e-pasts ir lietotÄja $1 sÅ«tÄ«ts lietotÄjam $2, izmantojot "SÅ«tÄ«t e-pastu Å¡im lietotÄjam" funkciju {{SITENAME}}.',
+
+# User Messenger
+'usermessage-editor' => 'SistÄ“mas ziņotÄjs',
# Watchlist
'watchlist' => 'Mani uzraugÄmie raksti',
'mywatchlist' => 'Mani uzraugÄmie raksti',
-'watchlistfor' => "(priekš '''$1''')",
'nowatchlist' => 'TavÄ uzraugÄmo rakstu sarakstÄ nav neviena raksta.',
'watchlistanontext' => 'LÅ«dzu $1, lai apskatÄ«tu vai labotu savu uzraugÄmo rakstu saraksta saturu.',
'watchnologin' => 'Neesi iegÄjis',
@@ -1774,7 +1803,10 @@ PÄ“dÄ“jÄs izmaiņas saglabÄja [[User:$3|$3]] ([[User talk:$3|diskusija]]{{int:
'revertpage-nouser' => 'NovÄ“rsu (lietotÄjvÄrds slÄ“pts) izmaiņas, atjaunoju [[User:$1|$1]] versiju.',
'rollback-success' => 'Tika novÄ“rstas $1 izdarÄ«tÄs izmaiņas;
un tika atjaunota iepriekÅ¡Ä“jÄ versija, kuru bija izveidojis $2.',
-'sessionfailure' => "Ir radusies problÄ“ma ar sesijas autentifikÄciju;
+
+# Edit tokens
+'sessionfailure-title' => 'sesijas kļūda',
+'sessionfailure' => "Ir radusies problÄ“ma ar sesijas autentifikÄciju;
Å¡Ä« darbÄ«ba ir atcelta, lai novÄ“rstu lietotÄjvÄrda iespÄ“jami ļaunprÄtÄ«gu izmantoÅ¡anu.
Lūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
@@ -1896,18 +1928,21 @@ $1',
'month' => 'No mÄ“neÅ¡a (un senÄki):',
'year' => 'No gada (un senÄki):',
-'sp-contributions-newbies' => 'RÄdÄ«t jauno lietotÄju devumu',
-'sp-contributions-newbies-sub' => 'Jaunie lietotÄji',
-'sp-contributions-blocklog' => 'Bloķēšanas reģistrs',
-'sp-contributions-deleted' => 'IzdzÄ“stais lietotÄju devums',
-'sp-contributions-logs' => 'reģistri',
-'sp-contributions-talk' => 'diskusija',
-'sp-contributions-userrights' => 'LietotÄju tiesÄ«bu pÄrvaldÄ«ba',
-'sp-contributions-blocked-notice' => 'Å is lietotÄjs paÅ¡laik ir nobloÄ·Ä“ts.
+'sp-contributions-newbies' => 'RÄdÄ«t jauno lietotÄju devumu',
+'sp-contributions-newbies-sub' => 'Jaunie lietotÄji',
+'sp-contributions-blocklog' => 'Bloķēšanas reģistrs',
+'sp-contributions-deleted' => 'IzdzÄ“stais lietotÄju devums',
+'sp-contributions-uploads' => 'augÅ¡upielÄdes',
+'sp-contributions-logs' => 'reģistri',
+'sp-contributions-talk' => 'diskusija',
+'sp-contributions-userrights' => 'LietotÄju tiesÄ«bu pÄrvaldÄ«ba',
+'sp-contributions-blocked-notice' => 'Å is lietotÄjs paÅ¡laik ir nobloÄ·Ä“ts.
PÄ“dÄ“jais bloÄ·Ä“Å¡anas reÄ£istra ieraksts ir apskatÄms zemÄk:',
-'sp-contributions-search' => 'MeklÄ“t lietotÄju veiktÄs izmaiņas',
-'sp-contributions-username' => 'IP adrese vai lietotÄja vÄrds:',
-'sp-contributions-submit' => 'Meklēt',
+'sp-contributions-blocked-notice-anon' => 'Šī IP adrese pašlaik ir nobloķēta.
+PÄ“dÄ“jais bloÄ·Ä“Å¡anas reÄ£istra ieraksts ir apskatÄms zemÄk:',
+'sp-contributions-search' => 'MeklÄ“t lietotÄju veiktÄs izmaiņas',
+'sp-contributions-username' => 'IP adrese vai lietotÄja vÄrds:',
+'sp-contributions-submit' => 'Meklēt',
# What links here
'whatlinkshere' => 'NorÄdes uz Å¡o rakstu',
@@ -1967,7 +2002,6 @@ Visus blokus var apskatÄ«ties [[Special:IPBlockList|IP bloku sarakstÄ]].',
'ipb-edit-dropdown' => 'Izmainīt bloķēšanas iemeslus',
'ipb-unblock-addr' => 'AtbloÄ·Ä“t $1',
'ipb-unblock' => 'AtbloÄ·Ä“t lietotÄju vai IP adresi',
-'ipb-blocklist-addr' => 'Skatīt $1 uzliktos, esošos blokus',
'ipb-blocklist' => 'Apskatīties esošos blokus',
'ipb-blocklist-contribs' => '$1 devums',
'unblockip' => 'AtbloÄ·Ä“t lietotÄju',
@@ -2028,6 +2062,8 @@ TÄ ir bloÄ·Ä“ta kÄ daļa no IP adreÅ¡u diapazona $2, kuru var atbloÄ·Ä“t.',
'proxyblocker-disabled' => 'Šī funkcija ir atspējota.',
'proxyblocksuccess' => 'Darīts.',
'cant-block-while-blocked' => 'Tu nevari bloÄ·Ä“t citus lietotÄjus, kamÄ“r pats esi bloÄ·Ä“ts.',
+'ipbblocked' => 'Tu nevar bloÄ·Ä“t vai atbloÄ·Ä“t lietotÄjus, jo Tu pats esi bloÄ·Ä“ts',
+'ipbnounblockself' => 'Tev nav atļauts sevi atbloķēt',
# Developer tools
'lockdb' => 'BloÄ·Ä“t datubÄzi',
@@ -2108,6 +2144,7 @@ nevar pÄrvietot lapu uz sevi.',
'immobile-source-page' => 'Å Ä« lapa nav pÄrvietojama.',
'immobile-target-page' => 'Nevar pÄrvietot uz mÄ“rÄ·a nosaukumu.',
'imagenocrossnamespace' => 'Nevar pÄrvietot failu uz vÄrtelpu, kas nav paredzÄ“ta failiem.',
+'nonfile-cannot-move-to-file' => 'Nevar pÄrvietot to, kas nav fails, uz failu vÄrdtelpu.',
'imagetypemismatch' => 'Jaunais faila paplaÅ¡inÄjums neatbilst tÄ tipam',
'imageinvalidfilename' => 'Mērķa faila nosaukums ir nederīgs',
'fix-double-redirects' => 'AutomÄtiski izmainÄ«t visas pÄradresÄcijas, kas ved uz sÄkotnÄ“jo nosaukumu',
@@ -2179,6 +2216,7 @@ PirmajÄ gadÄ«jumÄ var arÄ« lietot Å¡Ädu metodi, piem., [[{{#Special:Export}}/
'importstart' => 'Importē lapas...',
'import-revision-count' => '$1 {{PLURAL:$1|versija|versijas}}',
'importnopages' => 'Nav lapu, ko importēt.',
+'imported-log-entries' => '{{PLURAL:$1|Importētais|Importētie}} $1 {{PLURAL:$1|reģistra ieraksts|reģistra ieraksti}}.',
'importfailed' => 'ImportÄ“Å¡ana neizdevÄs: <nowiki>$1</nowiki>',
'importunknownsource' => 'NezinÄms importÄ“Å¡anas avota veids',
'importcantopen' => 'Nevarēja atvērt importējamo failu',
@@ -2273,6 +2311,8 @@ Lūdzu, mēģiniet vēlreiz.',
'tooltip-rollback' => '"NovÄ“rst" atceļ visas Å¡Ä« lietotÄja izmaiņas vienÄ piegÄjienÄ',
'tooltip-undo' => '"Atgriezt" atgriež Å¡Ä«s izmaiņas un atver laboÅ¡anas formu priekÅ¡skatÄ«juma veidÄ.
Tas atļauj pievienot iemeslu kopsavilkumÄ.',
+'tooltip-preferences-save' => 'SaglabÄt iestatÄ«jumus',
+'tooltip-summary' => 'Ievadiet Ä«su kopsavilkumu',
# Metadata
'nodublincore' => 'Dublin Core RDF metadati šim serverim atslēgti.',
@@ -2356,13 +2396,15 @@ $1',
'imagemaxsize' => 'AttÄ“lu apraksta lapÄs parÄdÄmo attÄ“lu maksimÄlais izmÄ“rs:',
'thumbsize' => 'Sīkbildes izmērs:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|lapa|lapas}}',
-'file-info' => '(faila izmērs: $1, MIME tips: $2)',
-'file-info-size' => '($1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4)',
+'file-info' => 'faila izmērs: $1, MIME tips: $2',
+'file-info-size' => '$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4',
'file-nohires' => '<small>AugstÄka izÅ¡Ä·irtspÄ“ja nav pieejama.</small>',
-'svg-long-desc' => '(SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3)',
+'svg-long-desc' => 'SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3',
'show-big-image' => 'PilnÄ izmÄ“rÄ',
'show-big-image-thumb' => '<small>Šī priekšskata izmērs: $1 × $2 pikseļi</small>',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kadrs|kadri}}',
+'file-info-png-repeat' => 'spēlēts $1 {{PLURAL:$1|reizi|reizes}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kadrs|kadri}}',
# Special:NewFiles
'newimages' => 'Jauno attēlu galerija',
@@ -2423,8 +2465,8 @@ PÄrÄ“jie lauki, pÄ“c noklusÄ“juma, bÅ«s paslÄ“pti.
'exif-colorspace' => 'KrÄsu telpa',
'exif-componentsconfiguration' => 'Katras sastÄvdaļas nozÄ«me',
'exif-compressedbitsperpixel' => 'AttÄ“la kompresijas pakÄpe',
-'exif-pixelydimension' => 'Derīgs attēla platums',
-'exif-pixelxdimension' => 'Valind image height',
+'exif-pixelydimension' => 'Attēla platums',
+'exif-pixelxdimension' => 'Attēla augstums',
'exif-makernote' => 'RažotÄja piezÄ«mes',
'exif-usercomment' => 'LietotÄja komentÄri',
'exif-relatedsoundfile' => 'Saistītais skaņas fails',
@@ -2437,7 +2479,7 @@ PÄrÄ“jie lauki, pÄ“c noklusÄ“juma, bÅ«s paslÄ“pti.
'exif-spectralsensitivity' => 'SpektrÄlÄ jutÄ«ba',
'exif-isospeedratings' => 'ISO jutība',
'exif-shutterspeedvalue' => 'SlÄ“dža Ätrums',
-'exif-aperturevalue' => 'Apertūra',
+'exif-aperturevalue' => 'APEX apertūra',
'exif-brightnessvalue' => 'Gaišums',
'exif-exposurebiasvalue' => 'Ekspozīcijas nobīde',
'exif-subjectdistance' => 'Objekta attÄlums',
@@ -2682,6 +2724,7 @@ LÅ«dzu apstiprini, ka tieÅ¡Äm gribi izveidot Å¡o lapu no jauna.",
'table_pager_first' => 'PirmÄ lapa',
'table_pager_last' => 'PÄ“dÄ“jÄ lapa',
'table_pager_limit' => 'RÄdÄ«t $1 ierakstus vienÄ lapÄ',
+'table_pager_limit_label' => 'Skaits vienÄ lapÄ:',
'table_pager_limit_submit' => 'ParÄdÄ«t',
'table_pager_empty' => 'Neko neatrada',
@@ -2738,6 +2781,8 @@ Var arī lietot [[Special:Watchlist/edit|standarta izmainīšanas lapu]].',
'version-hook-name' => 'AizÄ·eres nosaukums',
'version-version' => '(Versija $1)',
'version-license' => 'Licence',
+'version-poweredby-credits' => "Šis viki darbojas ar '''[http://www.mediawiki.org/ MediaWiki]''' programmatūru, autortiesības © 2001-$1 $2.",
+'version-poweredby-others' => 'citi',
'version-software' => 'InstalÄ“tÄ programmatÅ«ra',
'version-software-product' => 'Produkts',
'version-software-version' => 'Versija',
@@ -2793,6 +2838,15 @@ Ievadi faila nosaukumu bez "{{ns:file}}:" prefiksa.',
'tags-edit' => 'labot',
'tags-hitcount' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
+# Special:ComparePages
+'comparepages' => 'SalÄ«dzinÄt lapas',
+'compare-selector' => 'SalÄ«dzinÄt lapu versijas',
+'compare-page1' => '1. lapa',
+'compare-page2' => '2. lapa',
+'compare-rev1' => '1. versija',
+'compare-rev2' => '2. versija',
+'compare-submit' => 'SalÄ«dzinÄt',
+
# Database error messages
'dberr-header' => 'Šim viki ir problēma',
'dberr-problems' => 'Atvainojiet!
@@ -2810,8 +2864,13 @@ Ievadi faila nosaukumu bez "{{ns:file}}:" prefiksa.',
'htmlform-float-invalid' => 'VÄ“rtÄ«ba, ko JÅ«s norÄdÄ«jÄt, nav skaitlis.',
'htmlform-int-toolow' => 'VÄ“rtÄ«ba, ko JÅ«s norÄdÄ«jÄt, ir mazÄka par $1 minimumu',
'htmlform-int-toohigh' => 'VÄ“rtÄ«ba, ko JÅ«s norÄdÄ«jÄt, ir lielÄka par $1 maksimumu',
+'htmlform-required' => 'Å Ä« vÄ“rtÄ«ba ir obligÄta',
'htmlform-submit' => 'Iesniegt',
'htmlform-reset' => 'Atcelt izmaiņas',
'htmlform-selectorother-other' => 'Citi',
+# SQLite database support
+'sqlite-has-fts' => '$1 ar pilnteksta meklēšanas atbalstu',
+'sqlite-no-fts' => '$1 bez pilnteksta meklēšanas atbalsta',
+
);
diff --git a/languages/messages/MessagesLzh.php b/languages/messages/MessagesLzh.php
index 3637a249..8c0899a1 100644
--- a/languages/messages/MessagesLzh.php
+++ b/languages/messages/MessagesLzh.php
@@ -59,9 +59,9 @@ $digitTransformTable = array(
',' => '',
);
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Default messages
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Allowed characters in keys are: A-Z, a-z, 0-9, underscore (_) and
# hyphen (-). If you need more characters, you may be able to change
# the regex in MagicWord::initRegex
@@ -82,8 +82,7 @@ $messages = array(
'tog-editsection' => '纂段擊éˆ',
'tog-editsectiononrightclick' => '纂段å³æ“Šæ¨™ï¼ˆJavaScript)',
'tog-showtoc' => '四章見目',
-'tog-rememberpassword' => '符節通越',
-'tog-editwidth' => '纂幅全',
+'tog-rememberpassword' => '符節通越(é”至$1日)',
'tog-watchcreations' => '哨己撰',
'tog-watchdefault' => '哨己纂',
'tog-minordefault' => '慣為校',
@@ -228,31 +227,21 @@ $messages = array(
'faqpage' => 'Project:頻答å•',
# Vector skin
-'vector-action-addsection' => '入題',
-'vector-action-delete' => '刪',
-'vector-action-move' => 'é·',
-'vector-action-protect' => 'ç·˜',
-'vector-action-undelete' => '覽刪',
-'vector-action-unprotect' => 'å•Ÿ',
-'vector-namespace-category' => 'é¡ž',
-'vector-namespace-help' => '助',
-'vector-namespace-image' => '檔',
-'vector-namespace-main' => 'æ–‡',
-'vector-namespace-media' => 'é›…',
-'vector-namespace-mediawiki' => '訊',
-'vector-namespace-project' => 'ç­–',
-'vector-namespace-special' => '奇',
-'vector-namespace-talk' => 'è­°',
-'vector-namespace-template' => '模',
-'vector-namespace-user' => '齋',
-'vector-view-create' => 'ç«‹',
-'vector-view-edit' => '纂',
-'vector-view-history' => '覽å²',
-'vector-view-view' => 'é–±',
-'vector-view-viewsource' => '覽æº',
-'actions' => 'å‹•',
-'namespaces' => 'å集',
-'variants' => '變字',
+'vector-action-addsection' => '入題',
+'vector-action-delete' => '刪',
+'vector-action-move' => 'é·',
+'vector-action-protect' => 'ç·˜',
+'vector-action-undelete' => '覽刪',
+'vector-action-unprotect' => 'å•Ÿ',
+'vector-simplesearch-preference' => '增尋之案(é™Vector皮)',
+'vector-view-create' => 'ç«‹',
+'vector-view-edit' => '纂',
+'vector-view-history' => '覽å²',
+'vector-view-view' => 'é–±',
+'vector-view-viewsource' => '覽æº',
+'actions' => 'å‹•',
+'namespaces' => 'å集',
+'variants' => '變字',
'errorpagetitle' => '誤',
'returnto' => '返$1。',
@@ -313,6 +302,9 @@ $messages = array(
欲試候之。
$1',
+'pool-timeout' => '待鎖超時',
+'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}}',
@@ -460,7 +452,8 @@ $2',
'yourname' => 'å',
'yourpassword' => '符節',
'yourpasswordagain' => '復核節',
-'remembermypassword' => '記之',
+'remembermypassword' => 'å¾ä¹‹ç°¿é€šè¶Šï¼ˆé”至$1日)',
+'securelogin-stick-https' => '登後ä»ä»¥HTTPS通接',
'externaldberror' => 'èªåº«ä¹‹éŒ¯æˆ–ç¦æ›´çˆ¾ä¹‹å¤–簿。',
'login' => '登簿',
'nav-login-createaccount' => '登簿ã€å¢žç°¿',
@@ -476,6 +469,7 @@ $2',
'gotaccount' => '有簿矣哉?往$1。',
'gotaccountlink' => '登簿',
'createaccountmail' => 'åŒéƒµ',
+'createaccountreason' => '因:',
'badretype' => '符節ä¸åˆä¹Ÿã€‚',
'userexists' => 'ç°¿å存矣,惠更之',
'loginerror' => '登簿誤然',
@@ -493,6 +487,7 @@ $2',
'wrongpasswordempty' => '缺符節,惠補之。',
'passwordtooshort' => '符節莫逾$1字。',
'password-name-match' => '符節與簿å異也。',
+'password-login-forbidden' => '此簿與符節之用乃ç¦ä¹‹ã€‚',
'mailmypassword' => 'é£å¾ç¬¦ç¯€',
'passwordremindertitle' => '新臨符節自{{SITENAME}}',
'passwordremindertext' => '$1求é£{{SITENAME}}($4):"$2"之臨符節為"$3"。日到有$5。
@@ -524,6 +519,9 @@ $2',
'loginlanguagelabel' => '語:$1',
'suspicious-userlogout' => '爾欲無離也,å¯ç”±å£žç€è¦½å™¨æˆ–å¿«æžä»£ç†å‘ˆé€ä¹‹ã€‚',
+# E-mail sending
+'php-mail-error-unknown' => 'æ–¼ PHP mail() åƒæ•¸ç¾éŒ¯',
+
# Password reset dialog
'resetpass' => '變符',
'resetpass_announce' => '爾乃éŽéƒµä¹‹è‡¨ç¬¦ç™»ä¹‹ã€‚è¦å®Œç™»ï¼Œæ±ä¹ƒéœ€è¨­æ–°ç¬¦ç¯€ï¼š',
@@ -574,8 +572,10 @@ $2',
'showlivepreview' => 'å³è¦½',
'showdiff' => '示異',
'anoneditwarning' => "'''警示:'''å­æœªç™»ç°¿ï¼ŒIP將誌。",
+'anonpreviewwarning' => "''å­æœªç™»ç°¿ï¼ŒIP將誌。''",
'missingsummary' => "'''醒示:'''å­æœªæ¦‚之,復「{{int:savearticle}}ã€å‰‡æ–‡å€ç„‰ã€‚",
'missingcommenttext' => '請贊之',
+'missingcommentheader' => "'''醒示:'''å­æœªæ¦‚標之,復「{{int:savearticle}}ã€å‰‡æ–‡å€ç„‰ã€‚",
'summary-preview' => '覽概:',
'subject-preview' => '覽題:',
'blockedtitle' => 'å­è¦‹ç¦',
@@ -629,7 +629,11 @@ $2',
'''尚未儲焉ï¼'''",
'userjspreview' => "'''é è¦½ç°¿JavaScript。'''
'''尚未儲焉ï¼'''",
-'userinvalidcssjstitle' => "'''警:'''\"\$1\"ç„¡æ­¤é¢ç‰ˆã€‚自製者,全åå‹™å°å¯«ï¼Œå¦‚{{ns:user}}:Foo/monobook.css 而éž{{ns:user}}:Foo/Monobook.css",
+'sitecsspreview' => "'''é è¦½æ­¤CSS。'''
+'''尚未儲焉ï¼'''",
+'sitejspreview' => "'''é è¦½æ­¤JavaScript。'''
+'''尚未儲焉ï¼'''",
+'userinvalidcssjstitle' => "'''警:'''\"\$1\"ç„¡æ­¤é¢ç‰ˆã€‚自製者,全åå‹™å°å¯«ï¼Œå¦‚{{ns:user}}:Foo/vector.css 而éž{{ns:user}}:Foo/Vector.css",
'updated' => '(新)',
'note' => "'''註'''",
'previewnote' => "'''此乃é è¦½ï¼Œå°šæœªå„²ç„‰ã€‚'''",
@@ -654,7 +658,6 @@ $2',
'''è¬å‹¿ç›œç‰ˆï¼'''",
'copyrightwarning2' => "{{SITENAME}}全文,å…眾人撰ã€çº‚ã€åˆªã€æ ¡ã€‚ä¸å–œä»–纂,但去å¯çŸ£ã€‚<br />
文務親撰,或謄公本,如$1。'''è¬å‹¿ç›œç‰ˆï¼'''",
-'longpagewarning' => "'''警示:此é é•·$1仟ä½å…ƒçµ„,逾å…二,覽器æä¸ç›¡å ªï¼Œæœ›ç¸®æ–·ä¹‹ã€‚'''",
'longpageerror' => "'''警示:文長$1仟ä½å…ƒçµ„,越幅$2,未能儲焉。'''",
'readonlywarning' => "'''警示:修庫è—,存儲è¬ç„‰ã€‚惠謄文備用之。'''
@@ -811,6 +814,8 @@ $1",
'logdelete-failure' => "'''見事無設也:'''
$1",
'revdel-restore' => '動見之',
+'revdel-restore-deleted' => '已刪之審',
+'revdel-restore-visible' => 'å¯è¦‹ä¹‹å¯©',
'pagehist' => 'é å²',
'deletedhist' => '刪å²',
'revdelete-content' => 'å­—',
@@ -876,11 +881,13 @@ $1",
# Diffs
'history-title' => '$1之誌',
'difference' => '(辨異)',
+'difference-multipage' => '(辨é ï¼‰',
'lineno' => '列$1:',
'compareselectedversions' => '辨二擇',
'showhideselectedversions' => '示ï¼è—之擇',
'editundo' => 'æ‚”',
-'diff-multi' => '(未示之審有$1)',
+'diff-multi' => '($2作未示之審有$1)',
+'diff-multi-manyusers' => '($2多作未示之審有$1)',
# Search results
'searchresults' => 'å¾—å°‹',
@@ -912,6 +919,7 @@ $1",
'searchprofile-everything-tooltip' => '尋全(å«è­°ï¼‰',
'searchprofile-advanced-tooltip' => '自定å集中尋',
'search-result-size' => '$1 ($2字)',
+'search-result-category-size' => '{{PLURAL:$1|一員|員有$1}}({{PLURAL:$2|一å­é¡žæœ‰|å­é¡žæœ‰$2}},{{PLURAL:$3|檔有一|檔有$3}})',
'search-result-score' => '關:$1%',
'search-redirect' => '(轉 $1)',
'search-section' => '(節 $1)',
@@ -981,6 +989,7 @@ $1",
'contextlines' => '尋分列',
'contextchars' => '列有字',
'stub-threshold' => '<a href="#" class="stub">短é é€£</a>æ ¼å¼é–€æª»ï¼ˆä½å…ƒçµ„):',
+'stub-threshold-disabled' => 'ç¦',
'recentchangesdays' => '近易示日:',
'recentchangesdays-max' => '最大有$1',
'recentchangescount' => '修著凡幾︰',
@@ -1014,6 +1023,7 @@ $1",
'prefs-files' => '檔',
'prefs-custom-css' => '定之CSS',
'prefs-custom-js' => '定之JavaScript',
+'prefs-common-css-js' => 'å…±CSS/JavaScriptæ–¼é¢ç‰ˆï¼š',
'prefs-reset-intro' => '爾用é é‡è¨­è‡³é ä¹‹è¨­ã€‚無修之也。',
'prefs-emailconfirm-label' => '確郵:',
'prefs-textboxsize' => '纂框é‡',
@@ -1048,9 +1058,15 @@ $1",
'prefs-advancedrendering' => '進',
'prefs-advancedsearchoptions' => '進',
'prefs-advancedwatchlist' => '進',
-'prefs-display' => '示項',
+'prefs-displayrc' => '示項',
+'prefs-displaysearchoptions' => '示項',
+'prefs-displaywatchlist' => '示項',
'prefs-diffs' => 'ç•°',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => '電郵有效之',
+'email-address-validity-invalid' => '貢一效之電郵',
+
# User rights
'userrights' => '秉治權任',
'userrights-lookup-user' => 'å¸ç¤¾',
@@ -1137,6 +1153,7 @@ $1",
'right-hideuser' => '鎖簿å,予è—眾',
'right-ipblock-exempt' => '繞IP鎖ã€è‡ªéŽ–與åœéŽ–',
'right-proxyunbannable' => '繞Proxy之自鎖',
+'right-unblockself' => '自解鎖',
'right-protect' => '改錮級與纂錮é ',
'right-editprotected' => '纂錮é ï¼ˆç„¡é€£éŒ®ï¼‰',
'right-editinterface' => '纂è¦',
@@ -1159,7 +1176,6 @@ $1",
'right-siteadmin' => '鎖與解鎖資料庫',
'right-reset-passwords' => '設他簿之符節',
'right-override-export-depth' => '出有五層深之é ',
-'right-versiondetail' => '示延用之版',
'right-sendemail' => '擬書傳予他簿',
# User rights log
@@ -1208,14 +1224,9 @@ $1",
'recentchanges-legend' => '近易項',
'recentchangestext' => '共筆æ®æ–°ï¼Œæ‚‰åˆ—於此。',
'recentchanges-feed-description' => 'è·Ÿwikiæºä¹‹è¿‘易。',
-'recentchanges-label-legend' => '例: $1',
-'recentchanges-legend-newpage' => '$1 - æ–°é ',
'recentchanges-label-newpage' => '此纂開新é ',
-'recentchanges-legend-minor' => '$1 - 細纂',
'recentchanges-label-minor' => '此乃細纂',
-'recentchanges-legend-bot' => '$1 - 機纂',
'recentchanges-label-bot' => '此乃機纂',
-'recentchanges-legend-unpatrolled' => '$1 - 未巡之纂',
'recentchanges-label-unpatrolled' => '此乃未巡之纂',
'rcnote' => "下為自$4$5起,'''$2'''日內'''$1'''近易也。",
'rcnotefrom' => "下為自'''$2'''至'''$1'''之易也。",
@@ -1261,6 +1272,9 @@ $1",
'upload_directory_missing' => '目錄$1已失,無建之。',
'upload_directory_read_only' => '目錄$1ç¦å…¥ï¼Œç„¡å¯ç»ã€‚',
'uploaderror' => '進ç»æœ‰è®Š',
+'upload-recreate-warning' => "'''警:åŒå之檔曾刪或é·ä¹‹ã€‚'''
+
+æ­¤é ä¹‹èªŒåˆªèˆ‡ç§»æ–¼æ­¤ç¤ºä¹‹ä»¥åƒè©³ä¹Ÿï¼š",
'uploadtext' => "下表以ç»ï¼Œ[[Special:FileList|載ç»]]覽之。或見[[Special:Log/upload|誌ç»]]與[[Special:Log/delete|誌刪]]。
欲嵌é ä¸­ï¼Œæ˜¯æ ¼éˆä¹‹å…¶ä¸€ï¼š
* '''<tt><nowiki>[[</nowiki>{{ns:file}}:File.jpg]]</tt>'''用此整ç»
@@ -1293,18 +1307,30 @@ $1",
'filetype-banned-type' => "'''「.$1ã€'''乃無å…之物類也。
å…之物類有{{PLURAL:$3|一|多}}$2也。",
'filetype-missing' => '檔å無後綴也(如「.jpgã€ï¼‰ã€‚',
+'empty-file' => '爾貢之檔乃是空也。',
+'file-too-large' => '爾貢之檔éŽå¤§ä¹Ÿã€‚',
+'filename-tooshort' => '檔åéŽçŸ­ä¹Ÿã€‚',
+'filetype-banned' => '此類檔已被ç¦ä¹Ÿã€‚',
+'verification-error' => '檔未証也。',
+'hookaborted' => '爾嘗之改被擴展鈎棄也。',
+'illegal-filename' => '檔å乃為éžæ³•ä¹Ÿã€‚',
+'overwrite' => 'ç„¡è“‹ç¾æœ‰ä¹‹æª”也。',
+'unknown-error' => '未知錯誤已發也。',
+'tmp-create-error' => '無建臨檔也。',
+'tmp-write-error' => '臨檔案寫錯也。',
'large-file' => '檔長$2仟ä½å…ƒçµ„,ä¸é€¾$1為佳。',
'emptyfile' => '無以ç»ï¼Œç–‘謬å也,惠核之。',
'fileexists' => "'''<tt>[[:$1]]</tt>'''存矣,欲蓋之則å†ä¹Ÿã€‚ [[$1|thumb]]",
'filepageexists' => "此檔之述於'''<tt>[[:$1]]</tt>'''存矣,檔未存也。爾入述無存也。è¦ç¾ä¹‹ï¼Œçˆ¾éœ€çº‚之。",
'file-exists-duplicate' => '此檔乃é‡æª”{{PLURAL:$1|一|數}}:',
'file-deleted-duplicate' => '此檔([[:$1]])å‰åˆªã€‚爾需查刪錄å†è²¢ä¹‹ã€‚',
-'successfulupload' => '檔案安矣',
'uploadwarning' => '慎焉ï¼',
'uploadwarning-text' => '改下檔述å†è©¦ä¹‹ã€‚',
'savefile' => '存之',
'uploadedimage' => '進ç»"[[$1]]"',
'overwroteimage' => '新置「[[$1]]ã€çŸ£',
+'copyuploaddisabled' => 'ç”±URL之貢被ç¦ä¹Ÿã€‚',
+'uploadfromurl-queued' => '爾之貢已排之。',
'uploaddisabledtext' => '檔之貢被ç¦ä¹Ÿã€‚',
'php-uploaddisabledtext' => 'PHP之貢被ç¦ä¹Ÿã€‚查 file_uploads 之。',
'uploadvirus' => '此檔å«æ¯’也ï¼
@@ -1320,6 +1346,14 @@ $1",
'upload-wasdeleted' => "'''警示:復ç»æ£„檔,慎續之。'''
誌刪如下:",
'filename-bad-prefix' => "ç»æª”以'''「$1ã€'''首,常由相機瞎造,惠更述之。",
+'upload-success-subj' => '檔案安矣',
+'upload-success-msg' => '爾自[$2]之貢安矣,見於此:[[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'è²¢å•',
+'upload-failure-msg' => '爾自[$2]之貢ç¾å•ä¹Ÿï¼š
+
+$1',
+'upload-warning-subj' => '貢警',
+'upload-warning-msg' => '爾自[$2]之貢出å•ã€‚爾å¯å›ž[[Special:Upload/stash/$1|貢表]]修此å•ã€‚',
'upload-too-many-redirects' => '網å€å«å¤šè½‰',
'upload-unknown-size' => '未知之ç©',
@@ -1373,6 +1407,7 @@ $1",
'listfiles_search_for' => '以媒å尋:',
'imgfile' => '檔',
'listfiles' => '見檔',
+'listfiles_thumb' => '縮',
'listfiles_date' => '時',
'listfiles_name' => 'å',
'listfiles_user' => 'ç°¿',
@@ -1485,8 +1520,8 @@ $1",
'statistics-edits' => '自{{SITENAME}}設之é çº‚數',
'statistics-edits-average' => 'æ¯é å‡çº‚數',
'statistics-views-total' => '閱總',
+'statistics-views-total-desc' => 'ä¸åŒ…無存之é èˆ‡å¥‡é ä¹‹é–±æ•¸',
'statistics-views-peredit' => 'æ¯çº‚閱數',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue 隊]長',
'statistics-users' => '註[[Special:ListUsers|簿]]',
'statistics-users-active' => '活簿',
'statistics-users-active-desc' => 'æ—©$1æ—¥å‰æ›´å‹•ä¹‹ç°¿',
@@ -1497,7 +1532,7 @@ $1",
'doubleredirects' => '窮渡',
'doubleredirectstext' => 'é ä¸‹çª®æ¸¡ï¼Œè¿­åˆ—以示。首尾宿åˆï¼Œå®œæ­£æ¸¡ä¹‹ã€‚
-<s>劃</s>已解之。',
+<del>劃</del>已解之。',
'double-redirect-fixed-move' => '[[$1]]é·ç•¢ï¼Œç¾æ¸¡è‡³[[$2]]',
'double-redirect-fixer' => '修渡',
@@ -1520,6 +1555,8 @@ $1",
'nmembers' => '$1戶',
'nrevisions' => '$1審',
'nviews' => '$1é–±',
+'nimagelinks' => '用以é æœ‰$1',
+'ntransclusions' => '用以é æœ‰$1',
'lonelypages' => '孤寡',
'lonelypagestext' => 'é ä¸‹ç„¡éˆæˆ–å«',
'uncategorizedpages' => '欲訂',
@@ -1667,34 +1704,40 @@ $1",
'listgrouprights-removegroup-self-all' => '除自之全組',
# E-mail user
-'mailnologin' => 'ç„¡é©›',
-'mailnologintext' => '[[Special:UserLogin|登簿]]置郵,方å¯æŽæ›¸ã€‚',
-'emailuser' => 'æŽå›',
-'emailpage' => 'æŽæ›¸',
-'emailpagetext' => '表下æŽç„‰ï¼Œä»¥éƒµåˆ¶å›ã€‚
+'mailnologin' => 'ç„¡é©›',
+'mailnologintext' => '[[Special:UserLogin|登簿]]置郵,方å¯æŽæ›¸ã€‚',
+'emailuser' => 'æŽå›',
+'emailpage' => 'æŽæ›¸',
+'emailpagetext' => '表下æŽç„‰ï¼Œä»¥éƒµåˆ¶å›ã€‚
ç½²[[Special:Preferences|å­ç°¿éƒµ]]以候往返。',
-'usermailererror' => '驛報有誤:',
-'defemailsubject' => '{{SITENAME}}來書',
-'noemailtitle' => '無郵',
-'noemailtext' => 'æ­¤å›ç„¡éƒµã€‚',
-'nowikiemailtitle' => '無許之郵',
-'nowikiemailtext' => 'æ­¤å›è¬æ”¶éƒµä¹‹ã€‚',
-'email-legend' => '發郵至{{SITENAME}}之å¦ä¸€ç°¿',
-'emailfrom' => '自:',
-'emailto' => '致:',
-'emailsubject' => '題:',
-'emailmessage' => '訊:',
-'emailsend' => 'é£',
-'emailccme' => '謄複本。',
-'emailccsubject' => '致$1複本:$2',
-'emailsent' => '書é£çŸ£',
-'emailsenttext' => '書é£çŸ£',
-'emailuserfooter' => 'æ­¤æŽç”±$1給$2經{{SITENAME}}之「æŽå›ã€ç™¼çŸ£ã€‚',
+'usermailererror' => '驛報有誤:',
+'defemailsubject' => '{{SITENAME}}來書',
+'usermaildisabled' => '無他人之郵',
+'usermaildisabledtext' => '無發電郵於wiki上之他戶也',
+'noemailtitle' => '無郵',
+'noemailtext' => 'æ­¤å›ç„¡éƒµã€‚',
+'nowikiemailtitle' => '無許之郵',
+'nowikiemailtext' => 'æ­¤å›è¬æ”¶éƒµä¹‹ã€‚',
+'email-legend' => '發郵至{{SITENAME}}之å¦ä¸€ç°¿',
+'emailfrom' => '自:',
+'emailto' => '致:',
+'emailsubject' => '題:',
+'emailmessage' => '訊:',
+'emailsend' => 'é£',
+'emailccme' => '謄複本。',
+'emailccsubject' => '致$1複本:$2',
+'emailsent' => '書é£çŸ£',
+'emailsenttext' => '書é£çŸ£',
+'emailuserfooter' => 'æ­¤æŽç”±$1給$2經{{SITENAME}}之「æŽå›ã€ç™¼çŸ£ã€‚',
+
+# User Messenger
+'usermessage-summary' => '留系信。',
+'usermessage-editor' => '系信',
# Watchlist
'watchlist' => '哨站',
'mywatchlist' => '哨站',
-'watchlistfor' => "('''$1'''之哨)",
+'watchlistfor2' => '$1之哨 $2',
'nowatchlist' => '無哨',
'watchlistanontext' => '$1以治哨',
'watchnologin' => '未登簿',
@@ -1797,7 +1840,10 @@ $NEWPAGE
'revertpage' => '去[[Special:Contributions/$2|$2]]之作(欲言之,å¯è‡³[[User talk:$2|æ­¤]])為[[User:$1|$1]]之本耳',
'revertpage-nouser' => '去(刪簿)之作為[[User:$1|$1]]之本耳',
'rollback-success' => '去$1之作,復為$2之本耳。',
-'sessionfailure' => '登簿有變。為防盜簿,返å‰é‡å–å†ç‚ºä¹‹ã€‚',
+
+# Edit tokens
+'sessionfailure-title' => '登段敗也',
+'sessionfailure' => '登簿有變。為防盜簿,返å‰é‡å–å†ç‚ºä¹‹ã€‚',
# Protect
'protectlogpage' => '誌緘',
@@ -1917,19 +1963,23 @@ $1',
'month' => '且ä¸è¶Š',
'year' => 'å¹´ä¸è¶Š',
-'sp-contributions-newbies' => '惟列新進',
-'sp-contributions-newbies-sub' => '予新進',
-'sp-contributions-newbies-title' => '新進之功績',
-'sp-contributions-blocklog' => '誌ç¦',
-'sp-contributions-deleted' => '已刪之ç©',
-'sp-contributions-logs' => '誌',
-'sp-contributions-talk' => 'è­°',
-'sp-contributions-userrights' => '秉治權任',
-'sp-contributions-blocked-notice' => '此簿ç¾ç¦ã€‚
+'sp-contributions-newbies' => '惟列新進',
+'sp-contributions-newbies-sub' => '予新進',
+'sp-contributions-newbies-title' => '新進之功績',
+'sp-contributions-blocklog' => '誌ç¦',
+'sp-contributions-deleted' => '已刪之ç©',
+'sp-contributions-uploads' => 'è²¢',
+'sp-contributions-logs' => '誌',
+'sp-contributions-talk' => 'è­°',
+'sp-contributions-userrights' => '秉治權任',
+'sp-contributions-blocked-notice' => '此簿ç¾ç¦ã€‚
近誌ç¦ä¹‹é …如下示之:',
-'sp-contributions-search' => 'å•å‹›',
-'sp-contributions-username' => 'ç°¿å或IPå€',
-'sp-contributions-submit' => 'å•',
+'sp-contributions-blocked-notice-anon' => 'æ­¤IPå€ç¾ç¦ã€‚
+近誌ç¦ä¹‹é …如下示之:',
+'sp-contributions-search' => 'å•å‹›',
+'sp-contributions-username' => 'ç°¿å或IPå€',
+'sp-contributions-toponly' => '僅示至新審之纂',
+'sp-contributions-submit' => 'å•',
# What links here
'whatlinkshere' => 'å–ä½',
@@ -1987,7 +2037,6 @@ $1',
'ipb-edit-dropdown' => '改證',
'ipb-unblock-addr' => '赦$1',
'ipb-unblock' => '赦簿ã€å€',
-'ipb-blocklist-addr' => '$1之ç¦',
'ipb-blocklist' => '列ç¦',
'ipb-blocklist-contribs' => '$1勛績',
'unblockip' => '赦簿',
@@ -2051,6 +2100,8 @@ $1已被ç¦çŸ£ã€‚爾是å¦æ”¹æ­¤ç½®ï¼Ÿ',
'cant-block-while-blocked' => '爾然被ç¦ï¼Œå‹¿æ–½æ–¼äººã€‚',
'cant-see-hidden-user' => 'ç°¿ç¦æˆ–è—矣。
爾無è—之權,無視纂ç¦ä¹Ÿã€‚',
+'ipbblocked' => '爾無鎖或鎖他簿,因你自å°ä¹Ÿ',
+'ipbnounblockself' => '你無解å°è‡ªèº«ä¹Ÿ',
# Developer tools
'lockdb' => '閉庫',
@@ -2078,6 +2129,12 @@ $1已被ç¦çŸ£ã€‚爾是å¦æ”¹æ­¤ç½®ï¼Ÿ',
'''警示ï¼'''
膾炙é·ç„‰ï¼Œç¦ç”Ÿä¸æ¸¬ï¼›æˆ’慎行之。",
+'movepagetext-noredirectfixer' => "函下é·é ï¼ŒèªŒéš¨æ–°å¾€ã€èˆŠé¡Œä½œæ¸¡ã€å–ä½æ¬²ç§»ã€‚欲查[[Special:DoubleRedirects|防窮]]ã€[[Special:BrokenRedirects|斷渡]]之。
+
+囑之者,新題若éžç©ºã€æ¸¡ã€ç¼ºèªŒï¼Œå‰‡èˆŠ'''ä¸é·'''焉。存é å‹¿è¦†ï¼Œè€Œèª¤é·å¯æ‚”也。
+
+'''警示ï¼'''
+膾炙é·ç„‰ï¼Œç¦ç”Ÿä¸æ¸¬ï¼›æˆ’慎行之。",
'movearticle' => 'é·æ–‡ï¼š',
'moveuserpage-warning' => "'''警:'''爾將é·é é½‹ã€‚注之é·é½‹å¾Œä¹‹ç°¿å乃為''ç„¡''變也。",
'movenologin' => '未登簿',
@@ -2123,6 +2180,7 @@ $1已被ç¦çŸ£ã€‚爾是å¦æ”¹æ­¤ç½®ï¼Ÿ',
'immobile-source-page' => 'æ­¤é ç„¡å‹•ä¹Ÿã€‚',
'immobile-target-page' => '無動至標之標題。',
'imagenocrossnamespace' => 'éžå‹•æª”至éžæª”åé–“',
+'nonfile-cannot-move-to-file' => 'éžå‹•éžæª”至檔åé–“',
'imagetypemismatch' => '其新副檔åéžé…其類也',
'imageinvalidfilename' => '標之檔å乃無效也',
'fix-double-redirects' => '更指原題之任渡',
@@ -2192,6 +2250,7 @@ $1已被ç¦çŸ£ã€‚爾是å¦æ”¹æ­¤ç½®ï¼Ÿ',
'importstart' => '入匯…',
'import-revision-count' => '有審$1',
'importnopages' => 'ç„¡å¯åŒ¯ã€‚',
+'imported-log-entries' => '已匯誌項有$1。',
'importfailed' => '入匯有變:<nowiki>$1</nowiki>',
'importunknownsource' => '入類ä¸æ˜Ž',
'importcantopen' => '入未å¯å•Ÿ',
@@ -2284,6 +2343,8 @@ $1已被ç¦çŸ£ã€‚爾是å¦æ”¹æ­¤ç½®ï¼Ÿ',
'tooltip-upload' => 'ç»å“備,ä¼æ­¥è·‘',
'tooltip-rollback' => '『返ã€ä¹ƒå之上貢也。',
'tooltip-undo' => '『復ã€ä¹ƒé–‹è¡¨åŠ å› ä¹Ÿã€‚',
+'tooltip-preferences-save' => '存註',
+'tooltip-summary' => '輸一短摘',
# Stylesheets
'common.css' => '/* 此之 CSS 用於全é¢ä¹Ÿ */',
@@ -2409,14 +2470,17 @@ $1',
'thumbsize' => '縮圖幅',
'widthheight' => '$1矩$2',
'widthheightpage' => '$1矩$2,共$3é ',
-'file-info' => '(大å°ï¼š$1,MIME類型:$2)',
-'file-info-size' => '(åƒç´ $1矩$2,大å°ï¼š$3,MIME類型:$4)',
+'file-info' => '大å°ï¼š$1,MIME類型:$2',
+'file-info-size' => 'åƒç´ $1矩$2,大å°ï¼š$3,MIME類型:$4',
'file-nohires' => '<small>無以更晰。</small>',
-'svg-long-desc' => '(SVG檔,貌有åƒç´ $1矩$2,幅$3)',
+'svg-long-desc' => 'SVG檔,貌有åƒç´ $1矩$2,幅$3',
'show-big-image' => '全幅',
'show-big-image-thumb' => '<small>縮圖幅有åƒç´ $1矩$2</small>',
'file-info-gif-looped' => '循',
'file-info-gif-frames' => '$1å¹€',
+'file-info-png-looped' => '循',
+'file-info-png-repeat' => '放有$1矣',
+'file-info-png-frames' => '$1å¹€',
# Special:NewFiles
'newimages' => '新圖之廊',
@@ -2506,14 +2570,14 @@ $1',
'limitall' => 'å…¨',
# E-mail address confirmation
-'confirmemail' => '核郵驛',
-'confirmemail_noemail' => '[[Special:Preferences|簿註]]有驛。',
-'confirmemail_send' => 'é£æ ¸ç¬¦',
-'confirmemail_sent' => '核符é£çŸ£',
-'confirmemail_sendfailed' => '{{SITENAME}}信未é£ç„‰ï¼Œè«‹æ ¸éƒµé©›ã€‚
+'confirmemail' => '核郵驛',
+'confirmemail_noemail' => '[[Special:Preferences|簿註]]有驛。',
+'confirmemail_send' => 'é£æ ¸ç¬¦',
+'confirmemail_sent' => '核符é£çŸ£',
+'confirmemail_sendfailed' => '{{SITENAME}}信未é£ç„‰ï¼Œè«‹æ ¸éƒµé©›ã€‚
郵者覆之:$1',
-'confirmemail_body' => 'æŒIP $1之人(亦為æ±ï¼‰æ–¼{{SITENAME}}建簿"$2",並呈電郵ä½å€ã€‚
+'confirmemail_body' => 'æŒIP $1之人(亦為æ±ï¼‰æ–¼{{SITENAME}}建簿"$2",並呈電郵ä½å€ã€‚
確此簿屬爾,並用{{SITENAME}}之電郵。
æ–¼ç€è¦½å™¨ä¸Šé–‹æ­¤é€£ï¼š
@@ -2526,8 +2590,21 @@ $3
$5
確碼於$4éŽä¹‹ã€‚',
-'confirmemail_invalidated' => '核郵驛消也',
-'invalidateemail' => '消核郵驛',
+'confirmemail_body_changed' => 'æŒIP $1之人(亦為æ±ï¼‰æ–¼{{SITENAME}}改簿"$2"之電郵。
+
+確此簿屬爾,並用{{SITENAME}}之電郵。
+æ–¼ç€è¦½å™¨ä¸Šé–‹æ­¤é€£ï¼š
+
+$3
+
+如此簿*éž*爾之,
+æ–¼ç€è¦½å™¨ä¸Šé–‹æ­¤é€£æ¶ˆç¢ºï¼š
+
+$5
+
+確碼於$4éŽä¹‹ã€‚',
+'confirmemail_invalidated' => '核郵驛消也',
+'invalidateemail' => '消核郵驛',
# Scary transclusion
'scarytranscludedisabled' => '[蓋跨共筆之轉碼者,莫之能用也]',
@@ -2575,6 +2652,7 @@ $1',
'table_pager_first' => '首é ',
'table_pager_last' => '末é ',
'table_pager_limit' => 'é æœ‰ç‰©$1',
+'table_pager_limit_label' => 'é ä¹‹ç‰©ï¸°',
'table_pager_limit_submit' => 'å¾€',
'table_pager_empty' => '空',
@@ -2631,6 +2709,7 @@ $1',
'version-specialpages' => '奇é ',
'version-parserhooks' => '語鈎',
'version-variables' => '變數',
+'version-skins' => 'çš®',
'version-other' => 'ä»–',
'version-mediahandlers' => '媒處',
'version-hooks' => '鈎',
@@ -2642,6 +2721,13 @@ $1',
'version-hook-subscribedby' => '用於',
'version-version' => '(版 $1)',
'version-license' => '牌',
+'version-poweredby-credits' => "此 Wiki 以 '''[http://www.mediawiki.org/ MediaWiki]''' 之驅,權 © 2001-$1 $2。",
+'version-poweredby-others' => '其他',
+'version-license-info' => 'MediaWiki乃自由軟件;爾ä¾è‡ªç”±è»Ÿä»¶åŸºé‡‘會之GNU通用公共授權之款,就此本程åºå†ç™¼ä½ˆåŠï¼æˆ–修;ä¾ä¹‹äºŒç‰ˆï¼ˆè‡ªé¸ä¹‹ï¼‰æˆ–後之。
+
+MediaWiki乃為用之發,無擔之責也;亦無售目之默擔也。åƒGNU通用公共授權之詳。
+
+爾乃收附本程åºä¹‹[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授權副本];如無者,致函至自由軟件基金會:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 閱之]。',
'version-software' => 'è£ä»¶',
'version-software-product' => 'å“',
'version-software-version' => '版',
@@ -2702,6 +2788,15 @@ $1',
'tags-tag' => '標å',
'tags-edit' => '纂',
+# Special:ComparePages
+'comparepages' => '較é ',
+'compare-selector' => '較é ä¹‹å¯©',
+'compare-page1' => 'é ä¸€',
+'compare-page2' => 'é äºŒ',
+'compare-rev1' => '審一',
+'compare-rev2' => '審二',
+'compare-submit' => '較',
+
# HTML forms
'htmlform-invalid-input' => '爾之輸å•ä¹Ÿ',
'htmlform-select-badoption' => '爾之值為éžæ•ˆä¹‹ã€‚',
@@ -2709,8 +2804,13 @@ $1',
'htmlform-float-invalid' => '爾之值為éžæ•¸å­—也。',
'htmlform-int-toolow' => '爾之值比$1以低',
'htmlform-int-toohigh' => '爾之值比$1以高',
+'htmlform-required' => '此值必填之',
'htmlform-submit' => '呈',
'htmlform-reset' => '復',
'htmlform-selectorother-other' => 'ä»–',
+# SQLite database support
+'sqlite-has-fts' => '$1 å«å…¨æ–‡ä¹‹å°‹',
+'sqlite-no-fts' => '$1 ä¸å«å…¨æ–‡ä¹‹å°‹',
+
);
diff --git a/languages/messages/MessagesLzz.php b/languages/messages/MessagesLzz.php
index 1767f415..3258a8b6 100644
--- a/languages/messages/MessagesLzz.php
+++ b/languages/messages/MessagesLzz.php
@@ -20,7 +20,7 @@ $messages = array(
# User preference toggles
'tog-underline' => "Link'iş tude kogu3’uxaçki:",
'tog-highlightbroken' => 'UpÅŸu linkepe <a href="" class="new">am ÅŸekilite</a> (alternatifi: am ÅŸekilite<a href="" class="internal">?</a>) ko3\'iri.',
-'tog-rememberpassword' => 'Parola-skani goiÅŸini',
+'tog-rememberpassword' => 'Parola-skani goiÅŸini (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-showhiddencats' => "Åžinaxeri k'at'egorepe ko3'iri",
'underline-always' => "P'anda",
@@ -119,14 +119,8 @@ $messages = array(
'qbspecialpages' => 'Doxmeli sayfape',
# Vector skin
-'vector-action-delete' => 'Jili',
-'vector-namespace-category' => "K'at'egori",
-'vector-namespace-help' => "MeÅŸvelaÅŸ t'aba",
-'vector-namespace-image' => 'Dosya',
-'vector-namespace-mediawiki' => 'Mesaji',
-'vector-namespace-project' => "P'rojeÅŸi t'aba",
-'vector-namespace-special' => 'Doxmeli sayfa',
-'vector-view-edit' => 'Doktiri',
+'vector-action-delete' => 'Jili',
+'vector-view-edit' => 'Doktiri',
'errorpagetitle' => 'Çilata',
'returnto' => '$1 butʼkʼaşa goikti.',
@@ -226,7 +220,7 @@ Dudicoxopes oxmaruşi yasaği na ren ar, varna daha dido kʼarakʼtʼeri uğun.'
# Login and logout pages
'yourname' => 'Skani maxmare-coxo:',
'yourpassword' => 'Pʼarola-skani:',
-'remembermypassword' => 'Parola-skani goiÅŸini',
+'remembermypassword' => 'Parola-skani goiÅŸini (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Sitʼeşa amaxti',
'nav-login-createaccount' => 'Sitʼeşa amaxti / hesabi dokʼidi',
'userlogin' => 'Sitʼeşa amaxti / hesabi dokʼidi',
@@ -489,7 +483,6 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
# Watchlist
'watchlist' => 'çkimi gotxozu listʼe',
'mywatchlist' => 'Çkimi gotxozu listʼe',
-'watchlistfor' => "('''$1''' ÅŸeni)",
'addedwatch' => 'Skani gotxozu listʼeşa ikʼayitʼinu.',
'addedwatchtext' => '"<nowiki>[[:$1]]</nowiki>" coxoni butʼkʼa [[Special:Watchlist|gotxozu listʼes]] ikʼayitʼinu.
@@ -705,9 +698,9 @@ Mu iqʼven başka coxo doçʼari.',
'nextdiff' => 'Ukʼaçxineri versiyoni kʼala na ren farkʼi →',
# Media information
-'file-info-size' => '($1 × $2 pikseli, dosyaşi didinoba: $3, MIME type: $4)',
+'file-info-size' => '$1 × $2 pikseli, dosyaşi didinoba: $3, MIME type: $4',
'file-nohires' => '<small>Çkva kʼai ozʼiramuşis na uğun versiyoni va ren.</small>',
-'svg-long-desc' => '(SVG dosya, coxoten $1 × $2 pʼikʼseli, dosyaşi didinoba: $3)',
+'svg-long-desc' => 'SVG dosya, coxoten $1 × $2 pʼikʼseli, dosyaşi didinoba: $3',
'show-big-image' => 'Tam ozʼiramuşi',
'show-big-image-thumb' => '<small>"Evvelişen i3ʼkʼedi" fonkʼsionişi didinoba: $1 × $2 pikseli</small>',
diff --git a/languages/messages/MessagesMai.php b/languages/messages/MessagesMai.php
index ac0a0b11..40cd2ed5 100644
--- a/languages/messages/MessagesMai.php
+++ b/languages/messages/MessagesMai.php
@@ -7,37 +7,86 @@
* @ingroup Language
* @file
*
+ * @author Ashishanchinhar
* @author Ggajendra
+ * @author Kumariprity
+ * @author Manojberma77
* @author Meno25
+ * @author Priyanka.rachna.jha
+ * @author Rajesh
+ * @author Umeshberma
+ * @author Vinitutpal
*/
$fallback = 'hi';
$messages = array(
# User preference toggles
-'tog-underline' => 'लिंककेठरेखांकित करू:',
-'tog-highlightbroken' => 'टूटल शà¥à¤°à¥ƒà¤‚खला <a href="" class="new">à¤à¤¨à¤¾ देखाऊ</a> (आकि फेर: à¤à¤¨à¤¾ देखाऊ<a href="" class="internal">?</a>).',
-'tog-justify' => 'सà¥à¤—ढ़ बनाऊ',
-'tog-hideminor' => 'सनà¥à¤¨à¤¿à¤•à¤Ÿ परिवरà¥à¤¤à¥à¤¤à¤¨à¤®à¥‡ छोट परिवरà¥à¤¤à¥à¤¤à¤¨ नà¥à¤•à¤¾à¤Š',
-'tog-newpageshidepatrolled' => 'नियंतà¥à¤°à¤¿à¤¤ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ नव पनà¥à¤¨à¤¾ सूचीसठनà¥à¤•à¤¾à¤Š',
-'tog-extendwatchlist' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमे सभ परिवरà¥à¤¤à¤¨ देखाऊ,खाली हालक परिवरà¥à¤¤à¤¨ नै',
-'tog-usenewrc' => 'नीक सनà¥à¤¨à¤¿à¤•à¤Ÿ परिवरà¥à¤¤à¥à¤¤à¤¨ पà¥à¤°à¤¯à¥‹à¤— करू (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाही)',
-'tog-numberheadings' => 'शीरà¥à¤·à¤• सà¥à¤µà¤¯à¤‚-कà¥à¤°à¤®à¤¾à¤‚कित करू',
-'tog-showtoolbar' => 'संपादन ओजारपेटी देखाऊ (जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿ)',
-'tog-editondblclick' => 'दू बेर कà¥à¤²à¥€à¤• कठपनà¥à¤¨à¤¾ संपादित करू (जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿ)',
-'tog-editsection' => '[संपादित करू] शà¥à¤°à¥ƒà¤‚खला दà¥à¤µà¤¾à¤°à¤¾ विभाग संपादनक आजà¥à¤žà¤¾ दिअ',
-'tog-showtoc' => 'अनà¥à¤•à¥à¤°à¤® देखाऊ (जाहि पृषà¥à¤  पर तीनसठबेशी विभाग होà¤)',
-'tog-editwidth' => 'सà¤à¤ªà¤¾à¤¦à¤¨ पेटी पूरà¥à¤£ चौरस देखाऊ',
-'tog-watchdefault' => 'हमर संपादित पृषà¥à¤  हमर साकांकà¥à¤· सूचीमे देखाऊ',
-'tog-watchdeletion' => 'हमरा दà¥à¤µà¤¾à¤°à¤¾ हटाओल पृषà¥à¤  हमर साकांकà¥à¤· सूचीमे राखू',
-'tog-previewontop' => 'संपादन पेटीक ऊपर दृशà¥à¤¯ देखाऊ',
-'tog-nocache' => 'पनà¥à¤¨à¤¾ पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ गहà¥à¤µà¤°à¤®à¥‡ नहि राखू',
-'tog-enotifusertalkpages' => 'हमर सदसà¥à¤¯ वारà¥à¤¤à¤¾ पृषà¥à¤  पर भेल परिवरà¥à¤¤à¥à¤¤à¤¨à¤• हेतॠहमरा ई-मेल करथि',
-'tog-enotifminoredits' => 'छोट परिवरà¥à¤¤à¥à¤¤à¤¨à¤• हेतॠसेहो हमरा ई-मेल पठाऊ',
-'tog-fancysig' => 'अपरिपकà¥à¤µ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° (सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ शà¥à¤°à¥ƒà¤‚खलाक बिना)',
-'tog-externaldiff' => 'पà¥à¤°à¤¾à¤¨ संसà¥à¤•à¤°à¤£à¤®à¥‡ अंतर देखेबाक हेतॠबाहरक पà¥à¤°à¤£à¤¾à¤²à¥€à¤• पà¥à¤°à¤¯à¥‹à¤— करू',
+'tog-underline' => 'लिंककेठरेखांकित करू:',
+'tog-highlightbroken' => 'टूटल शà¥à¤°à¥ƒà¤‚खला <a href="" class="new">à¤à¤¨à¤¾ देखाऊ</a> (आकि फेर: à¤à¤¨à¤¾ देखाऊ<a href="" class="internal">?</a>).',
+'tog-justify' => 'सà¥à¤—ढ़ बनाऊ',
+'tog-hideminor' => 'सनà¥à¤¨à¤¿à¤•à¤Ÿ परिवरà¥à¤¤à¥à¤¤à¤¨à¤®à¥‡ छोट परिवरà¥à¤¤à¥à¤¤à¤¨ नà¥à¤•à¤¾à¤Š',
+'tog-hidepatrolled' => 'सनà¥à¤¨à¤¿à¤•à¤Ÿ परिवरà¥à¤¤à¥à¤¤à¤¨à¤®à¥‡ छोट परिवरà¥à¤¤à¥à¤¤à¤¨ नà¥à¤•à¤¾à¤Š',
+'tog-newpageshidepatrolled' => 'नियंतà¥à¤°à¤¿à¤¤ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ नव पनà¥à¤¨à¤¾ सूचीसठनà¥à¤•à¤¾à¤Š',
+'tog-extendwatchlist' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमे सभ परिवरà¥à¤¤à¤¨ देखाऊ,खाली हालक परिवरà¥à¤¤à¤¨ नै',
+'tog-usenewrc' => 'नीक सनà¥à¤¨à¤¿à¤•à¤Ÿ परिवरà¥à¤¤à¥à¤¤à¤¨ पà¥à¤°à¤¯à¥‹à¤— करू (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाही)',
+'tog-numberheadings' => 'शीरà¥à¤·à¤• सà¥à¤µà¤¯à¤‚-कà¥à¤°à¤®à¤¾à¤‚कित करू',
+'tog-showtoolbar' => 'संपादन ओजारपेटी देखाऊ (जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿ)',
+'tog-editondblclick' => 'दू बेर कà¥à¤²à¥€à¤• कठपनà¥à¤¨à¤¾ संपादित करू (जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿ)',
+'tog-editsection' => '[संपादित करू] शà¥à¤°à¥ƒà¤‚खला दà¥à¤µà¤¾à¤°à¤¾ विभाग संपादनक आजà¥à¤žà¤¾ दिअ',
+'tog-editsectiononrightclick' => 'ठखणà¥à¤¡à¤• समà¥à¤ªà¤¾à¤¦à¤¨ खणà¥à¤¡à¤• शीरà¥à¤·à¤•à¥‡à¤ दहिन कà¥à¤²à¤¿à¤• कऽ समà¥à¤­à¤µ (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाही)',
+'tog-showtoc' => 'अनà¥à¤•à¥à¤°à¤® देखाऊ (जाहि पृषà¥à¤  पर तीनसठबेशी विभाग होà¤)',
+'tog-rememberpassword' => 'ठगवेषकपर हमर कूटशबà¥à¤¦ (बेशीसं बेशी $1 {{PLURAL:$1|दिन धरि| कà¤à¤• दिन धरि}}) मोन राखू',
+'tog-watchcreations' => 'हमर बनाओल पृषà¥à¤  हमर साकांकà¥à¤· सूचीमे राखू',
+'tog-watchdefault' => 'हमर संपादित पृषà¥à¤  हमर साकांकà¥à¤· सूचीमे देखाऊ',
+'tog-watchmoves' => 'हमरा दà¥à¤µà¤¾à¤°à¤¾ हटाओल पृषà¥à¤  हमर साकांकà¥à¤· सूचीमे राखू',
+'tog-watchdeletion' => 'हमरा दà¥à¤µà¤¾à¤°à¤¾ हटाओल पृषà¥à¤  हमर साकांकà¥à¤· सूचीमे राखू',
+'tog-minordefault' => 'हमर सभ समà¥à¤ªà¤¾à¤¦à¤¨ पूरà¥à¤µà¤¨à¥à¤¯à¤¸à¥à¤¤ रूपेठमामूली कहू',
+'tog-previewontop' => 'संपादन पेटीक ऊपर दृशà¥à¤¯ देखाऊ',
+'tog-previewonfirst' => 'पहिल समà¥à¤ªà¤¾à¤¦à¤¨à¤• बाद पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ देखाउ',
+'tog-nocache' => 'गवेषक पृषà¥à¤  उपसà¥à¤®à¥ƒà¤¤à¤¿ अशकà¥à¤¤ करू',
+'tog-enotifwatchlistpages' => 'जौं हमर धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीक कोनो पनà¥à¤¨à¤¾à¤®à¥‡ परिवरà¥à¤¤à¤¨ हà¥à¤…ठतठहमरा ई-पतà¥à¤° पठाउ',
+'tog-enotifusertalkpages' => 'हमर सदसà¥à¤¯ वारà¥à¤¤à¤¾ पृषà¥à¤  पर भेल परिवरà¥à¤¤à¥à¤¤à¤¨à¤• हेतॠहमरा ई-मेल करथि',
+'tog-enotifminoredits' => 'छोट परिवरà¥à¤¤à¥à¤¤à¤¨à¤• हेतॠसेहो हमरा ई-मेल पठाऊ',
+'tog-enotifrevealaddr' => 'हमर ई-पतà¥à¤° संकेत सूचना ई-पतà¥à¤°à¤®à¥‡ देखाउ',
+'tog-shownumberswatching' => 'धà¥à¤¯à¤¾à¤¨ राखैबला पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• संखà¥à¤¯à¤¾',
+'tog-oldsig' => 'अखà¥à¤¨à¤•à¤¾ दसà¥à¤–तक पà¥à¤°à¤¾à¤°à¥‚प',
+'tog-fancysig' => 'हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤•à¥‡à¤‚ विकिटेकà¥à¤¸à¤Ÿà¤• रूपमे देखू (सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ शà¥à¤°à¥ƒà¤‚खला हीन)',
+'tog-externaleditor' => "↓पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रूपेठबाहà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤• क' उपयोग करू (केवल विशेषजà¥à¤žà¤¸à¤­à¤• लेल, à¤à¤•à¤°à¤¾ लेल संगणक पर विशेष सेटिंग चाही। [http://www.mediawiki.org/wiki/Manual:External_editors आओर जानकारी।])",
+'tog-externaldiff' => 'पà¥à¤°à¤¾à¤¨ संसà¥à¤•à¤°à¤£à¤®à¥‡ अंतर देखेबाक हेतॠपूरà¥à¤µà¤¨à¤¿à¤µà¤¿à¤·à¥à¤Ÿ रूपमे बाहरक परिवरà¥à¤¤à¤¨à¤• पà¥à¤°à¤¯à¥‹à¤— करू',
+'tog-showjumplinks' => 'करू "तड़पान" भेटैबला लिंक सभ',
+'tog-uselivepreview' => 'करू चल पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाही) (पà¥à¤°à¤¾à¤¯à¥‹à¤—िक)',
+'tog-forceeditsummary' => 'हमरा सचेत करू जखन हम खाली समà¥à¤ªà¤¾à¤¦à¤® सारांशमे जाइ',
+'tog-watchlisthideown' => 'हमर साकांकà¥à¤· सूचीसठहमर समà¥à¤ªà¤¾à¤¦à¤¨ नà¥à¤•à¤¾à¤‰',
+'tog-watchlisthidebots' => 'हमर साकांकà¥à¤· सूचीसठसà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ समà¥à¤ªà¤¾à¤¦à¤¨ हटाउ',
+'tog-watchlisthideminor' => 'हमर साकांकà¥à¤· सूचीसठमामूली समà¥à¤ªà¤¾à¤¦à¤¨ नà¥à¤•à¤¾à¤‰',
+'tog-watchlisthideliu' => 'साकांकà¥à¤·à¤¸à¥‚चीसठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ हटाउ',
+'tog-watchlisthideanons' => 'साकांकà¥à¤·à¤¸à¥‚चीसठअनाम पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ हटाउ',
+'tog-watchlisthidepatrolled' => 'साकांकà¥à¤· सूचीसठसंचालित समà¥à¤ªà¤¾à¤¦à¤¨ नà¥à¤•à¤¾à¤‰',
+'tog-ccmeonemails' => 'हमरा दà¥à¤µà¤¾à¤°à¤¾ दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पठाओल ई-पतà¥à¤°à¤• कॉपी पठाउ',
+'tog-diffonly' => 'फाइल-अनà¥à¤¤à¤° पà¥à¤°à¤£à¤¾à¤²à¥€à¤• नीचाठपनà¥à¤¨à¤¾à¤• सामिगà¥à¤°à¥€ नै देखाउ',
+'tog-showhiddencats' => 'नà¥à¤•à¤¾à¤à¤² संवरà¥à¤— देखाउ',
+'tog-norollbackdiff' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¨à¤• बाद फाइल-अनà¥à¤¤à¤° पà¥à¤°à¤£à¤¾à¤²à¥€à¤•à¥‡à¤ बिसरू',
+
+'underline-always' => 'सदिखन',
+'underline-never' => 'कखनो नै',
+'underline-default' => 'पूरà¥à¤µà¤¨à¥à¤¯à¤¸à¥à¤¤ गवेषक',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'समà¥à¤ªà¤¾à¤¦à¤¨ कà¥à¤·à¥‡à¤¤à¥à¤° वरà¥à¤£à¤®à¥à¤– पà¥à¤°à¤•à¤¾à¤°',
+'editfont-default' => 'पूरà¥à¤µà¤¨à¥à¤¯à¤¸à¥à¤¤ गवेषक',
+'editfont-monospace' => 'समेटल वरà¥à¤£à¤®à¥à¤–',
+'editfont-sansserif' => 'शीरà¥à¤·à¤• वरà¥à¤£à¤®à¥à¤–',
+'editfont-serif' => 'पाठà¥à¤¯ वरà¥à¤£à¤®à¥à¤–',
# Dates
+'sunday' => 'रवि',
+'monday' => 'सोम',
+'tuesday' => 'मंगल',
+'wednesday' => 'बà¥à¤§',
+'thursday' => 'बृहसà¥à¤ªà¤¤à¤¿',
+'friday' => 'शà¥à¤•à¥à¤°',
+'saturday' => 'शनि',
'sun' => 'रवि',
'mon' => 'सोम',
'tue' => 'मंगल',
@@ -82,68 +131,398 @@ $messages = array(
'nov' => 'नव.',
'dec' => 'दिस.',
-'newwindow' => '(नव खिड़कीसठखà¥à¤œà¥ˆà¤›)',
-'cancel' => 'समापà¥à¤¤',
-'mytalk' => 'हमर वारà¥à¤¤à¥à¤¤à¤¾',
-
-'errorpagetitle' => 'गलती',
-'tagline' => 'कतयसठ{{SITENAME}}',
-'help' => 'मदति',
-'search' => 'ताकू',
-'searchbutton' => 'ताकू',
-'searcharticle' => 'जाऊ',
-'history' => 'पनà¥à¤¨à¤¾à¤• इतिहास',
-'printableversion' => 'पà¥à¤°à¤¿à¤‚ट करबा योगà¥à¤¯',
-'permalink' => 'सà¥à¤¥à¤¾à¤¯à¥€ लिंक',
-'edit' => 'संपादन',
-'editthispage' => 'à¤à¤¹à¤¿ पृषà¥à¤ à¤• संपादन',
-'talkpage' => 'à¤à¤¹à¤¿ पृषà¥à¤  पर वारà¥à¤¤à¥à¤¤à¤¾à¤²à¤¾à¤ª',
-'talkpagelinktext' => 'कहू',
-'personaltools' => 'वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त उपकरण',
-'talk' => 'वरà¥à¤¤à¥à¤¤à¤¾à¤²à¤¾à¤ª',
-'views' => 'दृषà¥à¤Ÿà¤¿',
-'toolbox' => 'उपकरण-बकà¥à¤¸à¤¾',
-'redirectedfrom' => '(à¤à¤¤à¤¯à¤¸à¤ बहटारल $1)',
-'jumpto' => 'जाऊ:',
-'jumptonavigation' => 'हेलू',
-'jumptosearch' => 'ताकू',
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|खाढी|कà¤à¤Ÿà¤¾ खाढी}}',
+'category_header' => 'संवरà¥à¤— "$1" मे पनà¥à¤¨à¤¾ सभ',
+'subcategories' => 'उपसंवरà¥à¤—',
+'category-media-header' => 'संवरà¥à¤— "$1" मे मीडिया',
+'category-empty' => "''ठसंवरà¥à¤—मे अखन कोनो पनà¥à¤¨à¤¾ वा मीडिया नै अछि।''",
+'hidden-categories' => '{{PLURAL:$1|नà¥à¤•à¤¾à¤à¤² वरà¥à¤—|नà¥à¤•à¤¾à¤à¤² वरà¥à¤— }}',
+'hidden-category-category' => 'नà¥à¤•à¤¾à¤à¤² संवरà¥à¤— सभ',
+'category-subcat-count' => '{{PLURAL:$2| ठसंवरà¥à¤—क खाली ई सभ उप संवरà¥à¤— अछिइ।.|ठसंवरà¥à¤—मे ई सभ {{PLURAL:$1| उपसंवरà¥à¤—|$1 उपसंवरà¥à¤— सभ}}, à¤à¤®à¥‡ सठ$2 सभटा।}}',
+'category-subcat-count-limited' => 'ठसंवरà¥à¤—मे अछि {{PLURAL:$1|उपसंवरà¥à¤—|$1उपसंवरà¥à¤— सभ}}',
+'category-article-count' => '{{PLURAL:$2|ठसंवरà¥à¤—मे खाली ई पनà¥à¤¨à¤¾ अछि।| ई {{PLURAL:$1|पनà¥à¤¨à¤¾ अछि|$1 पनà¥à¤¨à¤¾ सभ अछि}} ठसंवरà¥à¤—मे, जाइमे सठ$2 सभ।}}',
+'category-article-count-limited' => 'ई {{PLURAL:$1|पनà¥à¤¨à¤¾ अछि|$1 पनà¥à¤¨à¤¾ सभ अछि}}',
+'category-file-count' => '{{PLURAL:$2| ठसंवरà¥à¤—मे मातर ई फाइल अछि।| ई {{PLURAL:$1|फाइल अछि|$1 फाइल सभ अछि}} ठसंवरà¥à¤—मे, कà¥à¤² $2 सà¤à¥¤}}',
+'category-file-count-limited' => 'ई {{PLURAL:$1|पनà¥à¤¨à¤¾ अछि|$1 पनà¥à¤¨à¤¾ सभ अछि}} ठसंवरà¥à¤—मे।',
+'listingcontinuesabbrev' => 'शेष आगाà¤à¥¤',
+'index-category' => 'कà¥à¤°à¤® कà¤à¤² पनà¥à¤¨à¤¾ सभ',
+'noindex-category' => 'कà¥à¤°à¤® नै कà¤à¤² पनà¥à¤¨à¤¾ सभ',
+
+'mainpagetext' => "'''मीडियाविकी नीक जकाठपà¥à¤°à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ भेल।'''",
+'mainpagedocfooter' => "समà¥à¤ªà¤°à¥à¤• करू [http://meta.wikimedia.org/wiki/Help:Contents User's Guide] विकी तंतà¥à¤°à¤¾à¤‚शक पà¥à¤°à¤¯à¥‹à¤—क जानकारी लेल।
+
+==पà¥à¤°à¤¾à¤°à¤®à¥à¤­ कोना करी==
+* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
+* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+
+'about' => 'विषयमे',
+'article' => 'विषय सूची पनà¥à¤¨à¤¾',
+'newwindow' => '(नव खिड़कीसठखà¥à¤œà¥ˆà¤›)',
+'cancel' => 'समापà¥à¤¤',
+'moredotdotdot' => 'आर...',
+'mypage' => 'हमर पनà¥à¤¨à¤¾',
+'mytalk' => 'हमर वारà¥à¤¤à¥à¤¤à¤¾',
+'anontalk' => 'ठअनिकेत पता लेल विमरà¥à¤¶',
+'navigation' => 'संचार',
+'and' => '&#32;आर',
+
+# Cologne Blue skin
+'qbfind' => 'ताकू',
+'qbbrowse' => 'गवेषण करू',
+'qbedit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'qbpageoptions' => 'ई पनà¥à¤¨à¤¾',
+'qbpageinfo' => 'विषय',
+'qbmyoptions' => 'हमर पनà¥à¤¨à¤¾ सभ',
+'qbspecialpages' => 'विशेष पनà¥à¤¨à¤¾ सभ',
+'faq' => 'तà¥à¤µà¤°à¤¿à¤¤ पà¥à¤°à¤¶à¥à¤¨à¥‹à¤¤à¥à¤¤à¤°à¥€',
+'faqpage' => 'Project: तà¥à¤µà¤°à¤¿à¤¤ पà¥à¤°à¤¶à¥à¤¨à¥‹à¤¤à¥à¤¤à¤°à¥€',
+
+# Vector skin
+'vector-action-addsection' => 'विचार-बिनà¥à¤¦à¥ जोड़ू',
+'vector-action-delete' => 'मेटाउ',
+'vector-action-move' => 'घसकाउ',
+'vector-action-protect' => 'रकà¥à¤·à¤£ करू',
+'vector-action-undelete' => 'आपस लाउ',
+'vector-action-unprotect' => 'अरकà¥à¤·à¤¿à¤¤',
+'vector-simplesearch-preference' => 'परिषà¥à¤•à¥ƒà¤¤ खोज सà¥à¤à¤¾à¤µ समरà¥à¤¥ करू (सदिश सà¥à¤µà¤°à¥‚प मातà¥à¤°)',
+'vector-view-create' => 'बनाउ',
+'vector-view-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'vector-view-history' => 'इतिहास देखू',
+'vector-view-view' => 'पढ़ू',
+'vector-view-viewsource' => 'जड़ि देखू',
+'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾ सभ',
+'namespaces' => 'चेनà¥à¤¹à¤¾à¤¸à¥€ समूह सभ',
+'variants' => 'पà¥à¤°à¤•à¤¾à¤° सभ',
+
+'errorpagetitle' => 'गलती',
+'returnto' => '$1 पर घà¥à¤°à¥à¥¤',
+'tagline' => 'कतयसठ{{SITENAME}}',
+'help' => 'मदति',
+'search' => 'ताकू',
+'searchbutton' => 'ताकू',
+'go' => 'जाउ',
+'searcharticle' => 'जाऊ',
+'history' => 'पनà¥à¤¨à¤¾à¤• इतिहास',
+'history_short' => 'इतिहास',
+'updatedmarker' => 'हमर अनà¥à¤¤à¤¿à¤® आगमनसठपहिने अदà¥à¤¯à¤¤à¤¨ कà¤à¤²',
+'info_short' => 'सूचना',
+'printableversion' => 'पà¥à¤°à¤¿à¤‚ट करबा योगà¥à¤¯',
+'permalink' => 'सà¥à¤¥à¤¾à¤¯à¥€ लिंक',
+'print' => 'छापू',
+'edit' => 'संपादन',
+'create' => 'बनाउ',
+'editthispage' => 'à¤à¤¹à¤¿ पृषà¥à¤ à¤• संपादन',
+'create-this-page' => 'ई पनà¥à¤¨à¤¾ बनाउ',
+'delete' => 'मेटाउ',
+'deletethispage' => 'ई पनà¥à¤¨à¤¾ मेटाउ',
+'undelete_short' => 'आपस आनू {{PLURAL:$1|à¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨t|$1 समà¥à¤ªà¤¾à¤¦à¤¨ सभ}}',
+'protect' => 'बचाउ',
+'protect_change' => 'बदलू',
+'protectthispage' => 'ठपनà¥à¤¨à¤¾à¤• रकà¥à¤·à¤¾ करू',
+'unprotect' => 'रकà¥à¤·à¤¾ कवच हटाउ',
+'unprotectthispage' => 'ठपनà¥à¤¨à¤¾à¤¸à¤ रकà¥à¤·à¤¾ कवच हटाउ',
+'newpage' => 'नवका पनà¥à¤¨à¤¾',
+'talkpage' => 'à¤à¤¹à¤¿ पृषà¥à¤  पर वारà¥à¤¤à¥à¤¤à¤¾à¤²à¤¾à¤ª',
+'talkpagelinktext' => 'कहू',
+'specialpage' => 'विशेष पनà¥à¤¨à¤¾',
+'personaltools' => 'वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त उपकरण',
+'postcomment' => 'नव खणà¥à¤¡',
+'articlepage' => 'विषय-सूची पनà¥à¤¨à¤¾ देखू',
+'talk' => 'वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
+'views' => 'दृषà¥à¤Ÿà¤¿',
+'toolbox' => 'उपकरण-बकà¥à¤¸à¤¾',
+'userpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾ देखू',
+'projectpage' => 'परियोजना पनà¥à¤¨à¤¾ देखू',
+'imagepage' => 'पनà¥à¤¨à¤¾à¤• पृषà¥à¤  देखू',
+'mediawikipage' => 'सनà¥à¤¦à¥‡à¤¶ पनà¥à¤¨à¤¾ देखू',
+'templatepage' => 'नमूना पृषà¥à¤  देखू',
+'viewhelppage' => 'सहायता पनà¥à¤¨à¤¾ देखू',
+'categorypage' => 'संवरà¥à¤— पनà¥à¤¨à¤¾ देखू',
+'viewtalkpage' => 'गपशप देखू',
+'otherlanguages' => 'दोसर भाषामे',
+'redirectedfrom' => '(à¤à¤¤à¤¯à¤¸à¤ बहटारल $1)',
+'redirectpagesub' => 'पनà¥à¤¨à¤¾à¤•à¥‡à¤ पठाउ',
+'lastmodifiedat' => 'ई पनà¥à¤¨à¤¾ अंतिम बेर संवरà¥à¤§à¤¿à¤¤ भेल $1, केठ$2 बजे।',
+'viewcount' => 'ई पनà¥à¤¨à¤¾ देखल गेल {{PLURAL:$1|à¤à¤• बेर|$1 à¤à¤¤à¥‡à¤• बेर}}',
+'protectedpage' => 'संरकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾',
+'jumpto' => 'जाऊ:',
+'jumptonavigation' => 'हेलू',
+'jumptosearch' => 'ताकू',
+'view-pool-error' => 'दà¥à¤–ी छी, वितरक सभ à¤à¤–न वà¥à¤¯à¤¸à¥à¤¤ अछि।
+बडà¥à¤¡ बेशी लोक ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ देखबामे लागल छथि।
+ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ फेरसठदेखबा लेल कनी बिलमू।
+$1',
+'pool-timeout' => 'पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ निगृहीत कालावसान',
+'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}}:सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤°',
+'currentevents' => 'आइ-कालà¥à¤¹à¤¿à¤• घटना सभ',
+'currentevents-url' => 'Project: आइ-कालà¥à¤¹à¤¿à¤• घटना सभ',
'disclaimers' => 'अनाधिकार घोषणा',
'disclaimerpage' => 'Project:अनाधिकार घोषणा',
'edithelp' => 'संपादन सहयोग',
'edithelppage' => 'Help:संपादन',
+'helppage' => 'Help: विषय सूची',
'mainpage' => 'समà¥à¤®à¥à¤– पनà¥à¤¨à¤¾',
'mainpage-description' => 'समà¥à¤®à¥à¤– पृषà¥à¤ ',
-'policy-url' => 'कारà¥à¤¯-भार :निअम',
+'policy-url' => 'Project:नीति',
'portal' => 'सामाजिक कोण',
-'portal-url' => 'कारà¥à¤¯-भार : समूह कोण',
+'portal-url' => 'Project:समूह कोण',
'privacy' => 'गोपनीयताक नियम',
'privacypage' => 'Project:गोपनीयता नियम',
-'badaccess' => 'आजà¥à¤žà¤¾ गलà¥à¤¤à¥€',
+'badaccess' => 'आजà¥à¤žà¤¾ गलà¥à¤¤à¥€',
+'badaccess-group0' => 'अहाà¤à¤•à¥‡à¤ आगà¥à¤°à¤¹ कà¤à¤² कà¥à¤°à¤¿à¤¯à¤¾à¤•à¥‡à¤ करबाक अनà¥à¤®à¤¤à¤¿ नै अछि।',
+'badaccess-groups' => 'जइ कà¥à¤°à¤¿à¤¯à¤¾à¤• अहाठआगà¥à¤°à¤¹ केने छी से मातà¥à¤° किछॠपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लेल सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ अछि {{PLURAL:$2|संवरà¥à¤—|संवरà¥à¤— सभमे à¤à¤•à¤Ÿà¤¾}}: $1',
+
+'versionrequired' => 'मीडियाविकीक संसà¥à¤•à¤°à¤£ $1 चाही',
+'versionrequiredtext' => 'ठपनà¥à¤¨à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤— लेल मीडियाविकीक संसà¥à¤•à¤°à¤£ $1 चाही।
+देखू ee [[Special:Version|version page]]',
-'retrievedfrom' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ सà¥à¤¥à¤² "$1"',
-'editsection' => 'संपादन करू',
-'editsectionhint' => 'संपादन शाखा: $1',
-'toc' => 'विषय-सूची',
-'showtoc' => 'देखाऊ',
-'hidetoc' => 'नà¥à¤•à¤¾à¤Š',
-'site-rss-feed' => '$1 आरà¤à¤¸à¤à¤¸ फीड',
-'site-atom-feed' => '$1 अणॠफीड',
-'red-link-title' => 'पृषà¥à¤  उपलबà¥à¤§ नहि अछि',
+'ok' => 'ठीक अछि',
+'retrievedfrom' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ सà¥à¤¥à¤² "$1"',
+'youhavenewmessages' => 'अहाठलग अछि $1 ($2).',
+'newmessageslink' => 'नव संदेश सभ',
+'newmessagesdifflink' => 'अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨',
+'youhavenewmessagesmulti' => '$1 पर अहाठलेल नव सनà¥à¤¦à¥‡à¤¶ अछि',
+'editsection' => 'संपादन करू',
+'editold' => 'समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
+'viewsourceold' => 'जड़ि देखू',
+'editlink' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'viewsourcelink' => 'जड़ि देखू',
+'editsectionhint' => 'संपादन शाखा: $1',
+'toc' => 'विषय-सूची',
+'showtoc' => 'देखाऊ',
+'hidetoc' => 'नà¥à¤•à¤¾à¤Š',
+'thisisdeleted' => 'देखू वा जाउ $1?',
+'viewdeleted' => 'देखू $1?',
+'restorelink' => '{{PLURAL:$1|à¤à¤•à¤Ÿà¤¾ मेटाà¤à¤² समà¥à¤ªà¤¾à¤¦à¤¨|$1 मेटाà¤à¤² समà¥à¤ªà¤¾à¤¦à¤¨ सभ}}',
+'feedlinks' => 'सूचक:',
+'feed-invalid' => 'अमानà¥à¤¯ सूचक पà¥à¤°à¤•à¤¾à¤° मासà¥à¤²',
+'feed-unavailable' => 'ाधिकृत सूचक उपलबà¥à¤§ नै अछि',
+'site-rss-feed' => '$1 आरà¤à¤¸à¤à¤¸ फीड',
+'site-atom-feed' => '$1 अणॠफीड',
+'page-rss-feed' => '"$1" आर.à¤à¤¸.à¤à¤¸. सूचना',
+'page-atom-feed' => '"$1" अणॠसू़चना',
+'red-link-title' => '$1 (पृषà¥à¤  उपलबà¥à¤§ नै अछि)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'पृषà¥à¤ ',
-'nstab-user' => 'उपयोगकरà¥à¤¤à¤¾à¤• पृषà¥à¤ ',
+'nstab-main' => 'पृषà¥à¤ ',
+'nstab-user' => 'उपयोगकरà¥à¤¤à¤¾à¤• पृषà¥à¤ ',
+'nstab-media' => 'मीडिया पनà¥à¤¨à¤¾',
+'nstab-special' => 'विशिषà¥à¤Ÿ पनà¥à¤¨à¤¾',
+'nstab-project' => 'परियोजना पनà¥à¤¨à¤¾',
+'nstab-image' => 'फाइल',
+'nstab-mediawiki' => 'संदेश',
+'nstab-template' => 'नमूना',
+'nstab-help' => 'सहायता पनà¥à¤¨à¤¾',
+'nstab-category' => 'संवरà¥à¤—',
+
+# Main script and global functions
+'nosuchaction' => 'à¤à¤¹à¥‡à¤¨ कोनो कà¥à¤°à¤¿à¤¯à¤¾ नै',
+'nosuchactiontext' => 'ठसारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ कà¥à¤°à¤¿à¤¯à¤¾ अमानà¥à¤¯ अछि।
+अहाठसारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेतक गलत टंकण केने हà¤à¤¬, वा कोनो गलत लिंकक पाछाठगेल हà¤à¤¬à¥¤
+ई {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ तंतà¥à¤°à¤¾à¤‚शमे सà¥à¤¥à¤¿à¤¤ कोनो दोषक संकेत सेहो कऽ सकैà¤à¥¤',
+'nosuchspecialpage' => 'à¤à¤¹à¥‡à¤¨ कोनो विशेष पनà¥à¤¨à¤¾ नै',
+'nospecialpagetext' => '<गाढ़> अहाठà¤à¤•à¤Ÿà¤¾ अमानà¥à¤¯ पनà¥à¤¨à¤¾à¤• आगà¥à¤°à¤¹ केने छी। </गाढ़>
+मानà¥à¤¯ विशेष पनà¥à¤¨à¤¾à¤• सूची à¤à¤¤à¤ अछि [[Special:SpecialPages|{{int:specialpages}}]]।',
+
+# General errors
+'error' => 'भà¥à¤°à¤®',
+'databaseerror' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ भà¥à¤°à¤®',
+'dberrortext' => 'à¤à¤•à¤Ÿà¤¾ दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾ कà¥à¤°à¤® भंग भेल अछि।
+ई तंतà¥à¤°à¤¾à¤‚शमे à¤à¤•à¤Ÿà¤¾ दोषक संकेत अछि।
+अनà¥à¤¤à¤¿à¤® बेर पà¥à¤°à¤¯à¤¾à¤¸ कà¤à¤² दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾ रहà¤:
+<blockquote><tt>$1</tt></blockquote>
+पà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤• अनà¥à¤¤à¤°à¥à¤—त "<tt>$2</tt>". ।
+दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ ई दोष देखेलक "<tt>$3: $4</tt>" ।',
+'dberrortextcl' => 'à¤à¤•à¤Ÿà¤¾ दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾ कà¥à¤°à¤® भंग भेल अछि।
+अनà¥à¤¤à¤¿à¤® बेर पà¥à¤°à¤¯à¤¾à¤¸ कà¤à¤² दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾ अछि:
+"$1"
+"$2" पà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤• अनà¥à¤¤à¤°à¥à¤—त।
+दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ दोष देखेलक "$3: $4"',
+'laggedslavemode' => "'''चेतौनी:''' पनà¥à¤¨à¤¾à¤ªà¤° समà¥à¤­à¤µ जे अदà¥à¤¯à¤¤à¤¨ परिवरà¥à¤¤à¤¨ नै हà¥à¤…à¤à¥¤",
+'readonly' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤',
+'enterlockreason' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लेल कारण बताउ, संगमे à¤à¤•à¤Ÿà¤¾ अंदाज सेहो बताउ जे कखन ई पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाà¤à¤² जाà¤à¤¤à¥¤',
+'readonlytext' => 'अखन दतà¥à¤¤à¤¾à¤‚शनिधि नव पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ आ आन संशोधन लेल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि, समà¥à¤­à¤µà¤¤à¤ƒ सामानà¥à¤¤ दतà¥à¤¤à¤¾à¤‚शनिधि देखभाल लेल, तकर बाद ई सामानà¥à¤¯ भऽ जाà¤à¤¤à¥¤
+
+संचालक जे à¤à¤•à¤°à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤¨à¥‡ छथि ई कारण दै छथि:$1',
+'missing-article' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पृषà¥à¤ à¤• वांछित पाठà¥à¤¯ नै ताकि सकल, माने "$1" $2
+à¤à¤•à¤° कारण कोनो पà¥à¤°à¤¾à¤¨ फाइल चेनà¥à¤¹à¤¾à¤¸à¥€ वा à¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• लिंकक पाछाठजाà¤à¤¬ अछि, जे मेटा देल गेल छै।
+जौं ई तकर कारण नै अछि, तखन अहाà¤à¤•à¥‡à¤ तंतà¥à¤°à¤¾à¤‚शमे कोनो दोष भेटल अछि।
+à¤à¤•à¤° खबरि पहà¥à¤à¤šà¤¾à¤‰ [[Special:ListUsers/sysop|administrator]], केà¤, अपन सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत सूचित करैत।',
+'missingarticle-rev' => '(संशोधन#: $1)',
+'missingarticle-diff' => '(फाइल-अनà¥à¤¤à¤° पà¥à¤°à¤£à¤¾à¤²à¥€: $1, $2)',
+'readonly_lag' => 'दतà¥à¤¤à¤¾à¤‚शनिधि सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² गेल अछि जा परजीवी दतांशनिधि वितरक मूलक समकà¥à¤· नै आबि जाà¤à¥¤',
+'internalerror' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®',
+'internalerror_info' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®: $1',
+'fileappenderrorread' => '"$1" केठजोड़ै कालमे नै पढ़ि सकल',
+'fileappenderror' => '"$1" सठ"$2" केठनै जोड़ि सकल।',
+'filecopyerror' => '"$1" सठ"$2" केठनै अनà¥à¤•à¥ƒà¤¤à¤¿ कऽ सकल।',
+'filerenameerror' => '"$1" सठ"$2" केठनै नाम बदलि सकल।',
+'filedeleteerror' => '"$1" केठनै मेटा सकल।',
+'directorycreateerror' => 'विभाग "$1" नै बना सकल।',
+'filenotfound' => 'फाइल "$1" नै ताकि सकल।',
+'fileexistserror' => 'फाइल "$1" पर लिखबामे अकà¥à¤·à¤®: फाइल अछि',
+'unexpected' => 'आसक विपरीत परिणाम: "$1"="$2"',
+'formerror' => 'फॉरà¥à¤® नै पठा सकल',
+'badarticleerror' => 'ई कà¥à¤°à¤¿à¤¯à¤¾ ठपनà¥à¤¨à¤¾à¤ªà¤° नै कà¤à¤² जा सकैà¤à¥¤',
+'cannotdelete' => 'पनà¥à¤¨à¤¾ व संचिका "$1" मेटाà¤à¤² नै जा सकल।',
+'badtitle' => 'खराप शीरà¥à¤·à¤•',
+'badtitletext' => 'आगà¥à¤°à¤¹ कà¤à¤² पनà¥à¤¨à¤¾à¤• शीरà¥à¤·à¤• गलत, खाली, वा गलत समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ अनà¥à¤¤à¤°-नà¥à¤¹à¤¾à¤·à¤¾ अनà¥à¤¤à¤° विकी शीरà¥à¤·à¤• छी। ई à¤à¤• वा बेशी कलाकार यà¥à¤•à¥à¤¤ भऽ सकैठजे शीरà¥à¤·à¤•à¤®à¥‡ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ नै कà¤à¤² जा सकैà¤à¥¤',
+'perfcached' => 'ई दतà¥à¤¤à¤¾à¤‚श उपसà¥à¤®à¥ƒà¤¤à¤¿à¤• आधारपर अछि आ भऽ सकैठजे अदà¥à¤¯à¤¤à¤¨ नै हà¥à¤…à¤à¥¤',
+'perfcachedts' => 'ई दतà¥à¤¤à¤¾à¤‚श उपसà¥à¤®à¥ƒà¤¤à¤¿à¤®à¥‡ अछि, आ à¤à¤•à¤° अनà¥à¤¤à¤¿à¤® परिवरà¥à¤§à¤¨ भेल अछि $1 केà¤à¥¤',
+'querypage-no-updates' => 'ठपनà¥à¤¨à¤¾à¤• नवीनीकरण अखन बनà¥à¤¨ अछि।
+à¤à¤¤à¥à¤•à¥à¤•à¤¾ दतà¥à¤¤à¤¾à¤‚श अखन नवीकरण नै कà¤à¤² जाà¤à¤¤à¥¤',
+'wrong_wfQuery_params' => 'अमानà¥à¤¯ परिमिति ठलेल wfQuery()<br />
+कà¥à¤°à¤¿à¤¯à¤¾ : $1<br />
+अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾: $2',
+'viewsource' => 'जड़ि देखू',
+'viewsourcefor' => '$1 लेल।',
+'actionthrottled' => 'कà¥à¤°à¤¿à¤¯à¤¾à¤•à¥‡à¤ मोकल गेल',
+'actionthrottledtext' => 'अनपेकà¥à¤·à¤¿à¤¤ संदेश रोका लेल, अहाà¤à¤•à¥‡à¤ ठकà¥à¤°à¤¿à¤¯à¤¾à¤•à¥‡à¤ कमà¥à¤®à¥‡ कालमे सीमासठबेशी बेर करबासठरोकल गेल अछि, अहाठओइ सीमाकेठपार कऽ गेल छी।
+कृपया किछॠकाल बाद फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'protectedpagetext' => 'ई पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ रोकबा लेल संरकà¥à¤·à¤¿à¤¤ अछि।',
+'viewsourcetext' => 'अहाठठपनà¥à¤¨à¤¾à¤• जड़िकेठदेख आ अनà¥à¤•à¥ƒà¤¤ कऽ सकै छी:',
+'protectedinterface' => 'ई पनà¥à¤¨à¤¾ तंतà¥à¤°à¤¾à¤‚श लेल मधà¥à¤¯à¤¸à¥à¤¥ पाठक वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ करैत अछि, आ अपशबà¥à¤¦ रोकबाक बà¥à¤¯à¥‹à¤‚त करैत अछि।',
+'editinginterface' => "'''चेतौनी''' अहाठà¤à¤•à¤Ÿà¤¾ à¤à¤¹à¥‡à¤¨ पनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी जे तंतà¥à¤°à¤¾à¤‚शक मधà¥à¤¯à¤¸à¥à¤¥ पनà¥à¤¨à¤¾à¤•à¥‡à¤ पाठ देबा लेल पà¥à¤°à¤¯à¥‹à¤— भऽ रहल अछि।
+ठपनà¥à¤¨à¤¾à¤®à¥‡ परिवरà¥à¤¤à¤¨ दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लेल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ मधà¥à¤¯à¤¸à¥à¤¥à¤• रूपमे परिवरà¥à¤¤à¤¨ करत।
+अनà¥à¤µà¤¾à¤¦ लेल [http://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी सà¥à¤¥à¤¾à¤¨à¥€à¤¯à¤•à¤°à¤£ परियोजनापर।",
+'sqlhidden' => '(नà¥à¤•à¤¾à¤à¤² à¤à¤¸.कà¥à¤¯à¥‚.à¤à¤². अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾)',
+'cascadeprotected' => 'ठपनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ समà¥à¤­à¤µ नै अछि, कारण ई ठमे समà¥à¤®à¤¿à¤²à¤¿à¤¤ अछि, {{PLURAL:$1|पनà¥à¤¨à¤¾, जे अछि|पनà¥à¤¨à¤¾, से सभ अछि}} सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ अछि "तराउपड़ी" विकलà¥à¤ª खोललाक बाद:
+$2',
+'namespaceprotected' => "अहाà¤à¤•à¥‡à¤ '''$1''' नाम-पेटारमे समà¥à¤ªà¤¾à¤¦à¤¨à¤• अनà¥à¤®à¤¤à¤¿ नै अछि।",
+'customcssjsprotected' => 'अहाà¤à¤•à¥‡à¤ ठपनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨à¤• अधिकार नै अछि, कारण ई दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¤¤à¥€à¤• छी।',
+'ns-specialprotected' => 'विशेष पनà¥à¤¨à¤¾ सभकेठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ नै कà¤à¤² जा सकैà¤à¥¤',
+'titleprotected' => 'ठशीरà¥à¤·à¤•à¤• निरà¥à¤®à¤¾à¤£ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि [[User:$1|$1]] दà¥à¤µà¤¾à¤°à¤¾à¥¤
+कारण à¤à¤¤à¤½ देल अछि "\'\'$2\'\'"।',
+
+# Virus scanner
+'virus-badscanner' => "खराप विनà¥à¤¯à¤¾à¤¸: अजà¥à¤žà¤¾à¤¤ विषविधि बिमà¥à¤¬à¤•: ''$1''",
+'virus-scanfailed' => 'बिमà¥à¤¬ विफल (विधà¥à¤¯à¤¾à¤¦à¥‡à¤¶ $1)',
+'virus-unknownscanner' => 'अजà¥à¤žà¤¾à¤¤ विषविधि निरोधक',
# Login and logout pages
-'nav-login-createaccount' => 'सदसà¥à¤¯ लॉग इन',
-'userlogin' => 'लॉग इन / खेसरा बनाऊ',
-'userlogout' => 'फेर आयब',
+'logouttext' => "'''अहाठनिषà¥à¤•à¥à¤°à¤®à¤£ कऽ गेल छी।'''
+
+अहाठ{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤— अनाम भऽ कऽ सकै छी, वा अहाठ[[Special:UserLogin|log in again]] वà¤à¤¹ आकि कोनो आन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• रूपमे सेहू पà¥à¤°à¤¯à¥‹à¤• कऽ सकै छी।
+ई मोन राखू जे किछॠपनà¥à¤¨à¤¾ à¤à¤¨à¤¾ देखा पड़ि सकैठजेना अहाठअखनो समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ होइ, जावत अहाठअपन गवेषकक उपसà¥à¤®à¥ƒà¤¤à¤¿ मेटा नै दै छी।",
+'welcomecreation' => '== सà¥à¤µà¤¾à¤—त अछि, $1! ==
+अहाà¤à¤• खाता खà¥à¤œà¤¿ गेल अछि।
+अपन [[Special:Preferences|{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} preferences]] बदलब नै बिसरू।',
+'yourname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾:',
+'yourpassword' => 'कूटशबà¥à¤¦:',
+'yourpasswordagain' => 'कूटशबà¥à¤¦ फेरसठटाइप करू:',
+'remembermypassword' => 'हमर समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ ठगवेषकपर मोन राखू (बेशीसठबेशी $1 {{PLURAL:$1|दिन|दिन}})',
+'securelogin-stick-https' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤• बाद à¤à¤š.टी.टी.पी.à¤à¤¸.क लागिमे रहू',
+'yourdomainname' => 'अहाà¤à¤• पà¥à¤°à¤­à¤¾à¤µà¤•à¥à¤·à¥‡à¤¤à¥à¤°:',
+'externaldberror' => 'खाहे सतà¥à¤¯à¤¾à¤ªà¤¨ दतांश भà¥à¤°à¤® छल वा अहाठअपन बाहà¥à¤¯ खाताकेठअदà¥à¤¯à¤¤à¤¨ करबामे असमरà¥à¤¥ छी।',
+'login' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶',
+'nav-login-createaccount' => 'सदसà¥à¤¯ लॉग इन',
+'loginprompt' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ लेल अहाà¤à¤•à¥‡à¤ आवशà¥à¤¯à¤• रूपेठजà¥à¤žà¤¾à¤ªà¤• सकà¥à¤°à¤¿à¤¯ करबाक चाही।',
+'userlogin' => 'लॉग इन / खेसरा बनाऊ',
+'userloginnocreate' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶',
+'logout' => 'निषà¥à¤•à¥à¤°à¤®à¤£',
+'userlogout' => 'फेर आयब',
+'notloggedin' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै छी',
+'nologin' => 'खाता नै अछि? $1।',
+'nologinlink' => 'नव खाता खोलू',
+'createaccount' => 'खाता खोली',
+'gotaccount' => 'पहिनहियेसठखाता अछि? $1',
+'gotaccountlink' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶',
+'createaccountmail' => 'ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾',
+'createaccountreason' => 'कारण:',
+'badretype' => 'कूटशबà¥à¤¦ जे अहाठभरलहà¥à¤ से मेल नै खाइà¤à¥¤',
+'userexists' => 'जे पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® अहाठभरलहà¥à¤ से पहिनहियेसठपà¥à¤°à¤¯à¥‹à¤—मे अछि।
+कृपा कऽ दोसर नामक चयन करू।',
+'loginerror' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ भà¥à¤°à¤®',
+'createaccounterror' => 'खाता नै बना सकल: $1',
+'nocookiesnew' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता खà¥à¤œà¤¿ गेल, मà¥à¤¦à¤¾ अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै छी।
+{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• लेल जà¥à¤žà¤¾à¤ªà¤•à¤• पà¥à¤°à¤¯à¥‹à¤— करैत अछि।
+अहाठजà¥à¤žà¤¾à¤ªà¤•à¤•à¥‡à¤ अशकà¥à¤¤ केने छी।
+कृपा कऽ ओकरा सकà¥à¤°à¤¿à¤ª करू, तखन अपन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® आ कूटशबà¥à¤¦à¤• संग समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू।',
+'nocookieslogin' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ करबा लेल जà¥à¤žà¤¾à¤ªà¤•à¤• पà¥à¤°à¤¯à¥‹à¤— करैत अछि।
+अहाठजà¥à¤žà¤¾à¤ªà¤•à¤•à¥‡à¤ अशकà¥à¤¤ केने छी।
+कृपा कऽ ओकरा सकà¥à¤°à¤¿à¤¯ करू आ फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'noname' => 'अहाठवैध पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® नै देने छी।',
+'loginsuccesstitle' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ सफल',
+'loginsuccess' => "'''अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ केलहà¥à¤ {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²-पता}} \"\$1\".'''क रूपमे।",
+'nosuchuser' => '"$1" नामसठकोनो पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै अछि।
+पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® बà¥à¤°à¤¹à¥à¤®à¤•à¥à¤·à¤°-लघà¥à¤µà¤•à¥à¤·à¤° भेद यà¥à¤•à¥à¤¤ अछि।
+अपन हà¥à¤°à¤¿à¤œà¥ˆ जाà¤à¤šà¥‚, वा [[Special:UserLogin/signup|नव खाता बनाउ]] ।',
+'nosuchusershort' => '"<nowiki>$1</nowiki>" नामà¥à¤¨à¤¾ कोनो पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै अछि।
+अपन हà¥à¤°à¤¿à¤œà¤ सà¥à¤§à¤¾à¤°à¥‚।',
+'nouserspecified' => 'अहाà¤à¤•à¥‡à¤ à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® देबऽ पड़त।',
+'login-userblocked' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि। समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤• अधिकार नै अछि।',
+'wrongpassword' => 'गलत कूटशबà¥à¤¦ देल गेल।
+फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'wrongpasswordempty' => 'रिकà¥à¤¤ कूटशबà¥à¤¦ देल गेल।
+फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'passwordtooshort' => 'कूटशबà¥à¤¦ कमसठकम {{PLURAL:$1|1 वरà¥à¤£|$1 वरà¥à¤£à¤•}} हà¥à¤…à¤à¥¤',
+'password-name-match' => 'अहाà¤à¤• कूटशबà¥à¤¦ अहाà¤à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®à¤¸à¤ भिनà¥à¤¨ हेबाक चाही।',
+'password-login-forbidden' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® आ कूटशबà¥à¤¦à¤• पà¥à¤°à¤¯à¥‹à¤— पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।',
+'mailmypassword' => 'नूतन कूटशबà¥à¤¦ ई-पतà¥à¤°à¤¸à¤ पठाउ',
+'passwordremindertitle' => 'नव असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦ {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²-पता}} लेल।',
+'passwordremindertext' => 'कियो (समà¥à¤­à¤µà¤¤à¤ƒ अहाà¤, अनिकेत $1 सà¤) à¤à¤•à¤Ÿà¤¾ नव कूटशबà¥à¤¦à¤• आगà¥à¤°à¤¹ {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} ($4) लेल केलौं। à¤à¤•à¤Ÿà¤¾ असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ "$2" लेल बनाओल गेल अछि आ "$3" रूपमे सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ कà¤à¤² गेल अछि। जठई अहाà¤à¤• इचà¥à¤›à¤¾ अछि तठअहाà¤à¤•à¥‡à¤ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करठपड़त आ à¤à¤•à¤Ÿà¤¾ नव कूटशबà¥à¤¦à¤• चà¥à¤¨à¤¾à¤µ करठपड़त।
+अहाà¤à¤• असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦ खतम भऽ जाà¤à¤¤ {{PLURAL:$5|à¤à¤• दिन|$ ५ दिन}} मे।',
+'noemail' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ "$1" लेल कोनो ई-पतà¥à¤° संकेत दरà¥à¤œ नै अछि।',
+'noemailcreate' => 'अहाà¤à¤•à¥‡à¤ à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेत देबऽ पड़त।',
+'passwordsent' => 'à¤à¤•à¤Ÿà¤¾ नव कूटशबà¥à¤¦ "$1" लेल पंजीकृत ई-पतà¥à¤° संकेतपर पठाà¤à¤² गेल अछि।
+जखन अहाà¤à¤•à¥‡à¤ ई भेटैठतठफेरसठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू।',
+'blocked-mailpassword' => 'अहाà¤à¤• अनिकेत समà¥à¤ªà¤¾à¤¦à¤¨ लेल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि, आ दà¥à¤°à¥à¤ªà¤¯à¥‹à¤— रोकबा लेल कूटशबà¥à¤¦ पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¹à¤°à¤£ सेवा ठलेल उपलबà¥à¤§ नै अछि।',
+'eauthentsent' => 'à¤à¤•à¤Ÿà¤¾ पावती ई-पतà¥à¤° निरà¥à¤§à¤¾à¤°à¤¿à¤¤ ई-पतà¥à¤° संकेतपर पठा देल गेल अछि।
+ठखातापर कोनो दोसर ई-पतà¥à¤° पठाà¤à¤² जà¤à¤¬à¤¾à¤¸à¤ पहिने, अहाà¤à¤•à¥‡à¤ ठई-पतà¥à¤°à¤• निरà¥à¤¦à¥‡à¤¶à¤• पालन करठपड़त, जइसठई पà¥à¤·à¥à¤Ÿ भऽ सकठजे ई खाता वासà¥à¤¤à¤µà¤®à¥‡ अहींक अछि।',
+'throttled-mailpassword' => 'à¤à¤•à¤Ÿà¤¾ कूटशबà¥à¤¦ सà¥à¤®à¤¾à¤°à¤• पहिनहिये पठाà¤à¤² गेल अछि, {{PLURAL:$1|घणà¥à¤Ÿà¤¾|$1 घणà¥à¤Ÿà¤¾}}क भीतर।
+दà¥à¤°à¥à¤ªà¤¯à¥‹à¤— रोकबा लेल, मातà¥à¤° à¤à¤•à¤Ÿà¤¾ कूटशबà¥à¤¦ {{PLURAL:$1|घणà¥à¤Ÿà¤¾|$1 घणà¥à¤Ÿà¤¾}}मे पठाà¤à¤² जाà¤à¤¤à¥¤',
+'mailerror' => 'ई-पतà¥à¤° पठेबामे दिकà¥à¤•à¤¤: $1',
+'acct_creation_throttle_hit' => 'ठविकीक आगनà¥à¤¤à¥à¤• अहाà¤à¤• अनिकेतक पà¥à¤°à¤¯à¥‹à¤—सठकालà¥à¤¹à¤¿ बनेलनà¥à¤¹à¤¿ अछि {{PLURAL:$1|1 खाता|$1 खाता}}',
+'emailauthenticated' => 'अहाà¤à¤• ई-पतà¥à¤° संकेत $2 केठ$3 पर सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ भेल।',
+'emailnotauthenticated' => 'अहाà¤à¤• ई-पतà¥à¤° संकेत अखन धरि सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ नै भेल अछि।',
+'noemailprefs' => 'ई सभ उतà¥à¤ªà¤¾à¤¦ काज कऽ सकठतै लेल à¤à¤•à¤Ÿà¤¾ ई-पतà¥à¤° संकेतक निरà¥à¤¦à¥‡à¤¶ अपन विकलà¥à¤ªà¤®à¥‡ करू।',
+'emailconfirmlink' => 'अपन ई-पतà¥à¤° संकेत सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करू',
+'invalidemailaddress' => 'अमानà¥à¤¯ पà¥à¤°à¤¾à¤°à¥‚पक कारण ठई-पतà¥à¤° संकेतकेठसà¥à¤µà¥€à¤•à¤¾à¤° नै कà¤à¤² जा सकैà¤à¥¤
+à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेत लिखू वा ओइ सà¥à¤¥à¤¾à¤¨à¤•à¥‡à¤ खाली करू।',
+'accountcreated' => 'खाता खà¥à¤œà¤¿ गेल',
+'accountcreatedtext' => '$1 लेल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता खà¥à¤œà¤¿ गेल।',
+'createaccount-title' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} लेल खाता निरà¥à¤®à¤¾à¤£',
+'createaccount-text' => 'कियो अहाà¤à¤• ई-पतà¥à¤° संकेत लेल à¤à¤•à¤Ÿà¤¾ खाता {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पर खोललनà¥à¤¹à¤¿ ($4) नाम भेल "$2", कूटशबà¥à¤¦ भेल "$3"।
+अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू आ अपन कूटशबà¥à¤¦ बदलू।
+
+अहाठठसंदेशकेठबिसरि सकै छी, जठई खाता भà¥à¤°à¤®à¤µà¤¶ बनल हà¥à¤…à¤à¥¤',
+'usernamehasherror' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®à¤®à¥‡ चरिखाना चेनà¥à¤¹ नै रहि सकैà¤',
+'login-throttled' => 'अहाठढ़ेर रास समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ पà¥à¤°à¤¯à¤¾à¤¸ केलहà¥à¤à¥¤
+फेर पà¥à¤°à¤¯à¤¾à¤¸ करबासठपहिने कने काल थमà¥à¤¹à¥‚।',
+'loginlanguagelabel' => 'भाषा : $1',
+'suspicious-userlogout' => 'अहाà¤à¤• निषà¥à¤•à¥à¤°à¤®à¤£à¤• अनà¥à¤°à¥‹à¤§ नै मानल गेल कारण ई लागल जे ई पà¥à¤°à¤¾à¤¨ गवेषकक लागि वा दोसराइत उपसà¥à¤®à¥ƒà¤¤à¤¿ दà¥à¤µà¤¾à¤°à¤¾ पठाओल गेल छल।',
+
+# E-mail sending
+'php-mail-error-unknown' => 'पी.à¤à¤š.पी.क संदेश कारà¥à¤¯() मे अजà¥à¤žà¤¾à¤¤ दोष',
+
+# Password reset dialog
+'resetpass' => 'कूटशबà¥à¤¦ बदलू',
+'resetpass_announce' => 'अहाठअसà¥à¤¥à¤¾à¤¯à¥€ ई-पतà¥à¤° विधà¥à¤¯à¤¾à¤¦à¥‡à¤¶à¤¸à¤ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ केने छी।
+समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ समà¥à¤ªà¥‚रà¥à¤£ करबा लेल, अहाठà¤à¤•à¤Ÿà¤¾ नव कूटशबà¥à¤¦ à¤à¤¤à¤ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करू:',
+'resetpass_header' => 'खाता कूटशबà¥à¤¦ बदलू',
+'oldpassword' => 'पà¥à¤°à¤¾à¤¨ कूटशबà¥à¤¦',
+'newpassword' => 'नव कूटशबà¥à¤¦',
+'retypenew' => 'नव कूटशबà¥à¤¦ फेरसठटंकित करू',
+'resetpass_submit' => 'कूटशबà¥à¤¦ बनाउ आ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू',
+'resetpass_success' => 'अहाà¤à¤• कूटशबà¥à¤¦ सफलतासठबदलि देल गेल!
+आब अहाà¤à¤•à¥‡à¤ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ कऽ रहल छी...',
+'resetpass_forbidden' => 'कूटशबà¥à¤¦ सभ नै बदलल जा सकैà¤à¥¤',
+'resetpass-no-info' => 'अहाà¤à¤•à¥‡à¤ ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ पढ़बाले समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ हà¥à¤…ठपड़त।',
+'resetpass-submit-loggedin' => 'कूटशबà¥à¤¦ बदलू',
+'resetpass-submit-cancel' => 'खतम करू',
+'resetpass-wrong-oldpass' => 'अमानà¥à¤¯ असà¥à¤¥à¤¾à¤¯à¥€ वा अखà¥à¤¨à¤•à¤¾ कूटशबà¥à¤¦à¥¤
+अहाठपहिनहिये सफलतासठकूटशबà¥à¤¦ बदलि लेने छी वा à¤à¤•à¤Ÿà¤¾ नव असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦ लेल आगà¥à¤°à¤¹ केने छी।',
+'resetpass-temp-password' => 'तातà¥à¤•à¤¾à¤²à¤¿à¤• कूटशबà¥à¤¦',
# Edit page toolbar
'bold_sample' => 'गà¤à¤¹à¥€à¤° लेखन',
@@ -166,136 +545,1949 @@ $messages = array(
'hr_tip' => 'अकà¥à¤·à¤¾à¤‚शीय पंकà¥à¤¤à¤¿ (अलà¥à¤ª उपयोग)',
# Edit pages
-'summary' => 'सारांश:',
-'subject' => 'विषय/मà¥à¤–à¥à¤¯à¤ªà¤‚कà¥à¤¤à¤¿:',
-'minoredit' => 'अलà¥à¤ª संपादन',
-'watchthis' => 'à¤à¤¹à¤¿ पृषà¥à¤ à¤•à¥‡à¤ देखू',
-'showpreview' => 'पूरà¥à¤µà¤ªà¥à¤°à¤¦à¤°à¥à¤¶à¤¨',
-'showdiff' => 'परिवरà¥à¤¤à¥à¤¤à¤¨ देखाऊ',
-'copyrightwarning' => 'कृपा कय बà¥à¤à¥‚ जे सभटा योगदान {{SITENAME}} ई बà¥à¤à¤¿ कय देल जा रहल अछि जे ई निमà¥à¤¨à¤¾à¤‚कितक अंतरà¥à¤—त अछि $2 (देखू $1 जनकारीक हेतà¥). जौठअहाठचाहैत छी जी अहाà¤à¤• रचना बिना रोकटोकक संपादित नहि हो किंवा बाà¤à¤Ÿà¤² नहि जाय, तठà¤à¤•à¤° योगदान à¤à¤¤à¤¯ नहि करू। <br />
+'summary' => 'सारांश:',
+'subject' => 'विषय/मà¥à¤–à¥à¤¯à¤ªà¤‚कà¥à¤¤à¤¿:',
+'minoredit' => 'अलà¥à¤ª संपादन',
+'watchthis' => 'à¤à¤¹à¤¿ पृषà¥à¤ à¤•à¥‡à¤ देखू',
+'savearticle' => 'पनà¥à¤¨à¤¾à¤• रकà¥à¤·à¤£ करू',
+'preview' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
+'showpreview' => 'पूरà¥à¤µà¤ªà¥à¤°à¤¦à¤°à¥à¤¶à¤¨',
+'showlivepreview' => 'चलित पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
+'showdiff' => 'परिवरà¥à¤¤à¥à¤¤à¤¨ देखाऊ',
+'anoneditwarning' => "'''चेतौनी:''' अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै छी।
+अहाà¤à¤• अनिकेत ठपनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ इतिहासमे दरà¥à¤œ कà¤à¤² जाà¤à¤¤à¥¤",
+'anonpreviewwarning' => "'' अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै छी। अखन रकà¥à¤·à¤£ केलासठअहाà¤à¤• अनिकेत पता ठपनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ इतिहासमे दरà¥à¤œ भऽ जाà¤à¤¤à¥¤''",
+'missingsummary' => "'''सà¥à¤®à¤¾à¤°à¤•:''' अहाठसमà¥à¤ªà¤¾à¤¦à¤¨ सार नै देने छी।
+जठअहाठफेरसठकà¥à¤²à¤¿à¤• करब \"{{int:savearticle}}\", अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨ बिना à¤à¤•à¤° संरकà¥à¤·à¤¿à¤¤ भऽ जाà¤à¤¤à¥¤",
+'missingcommenttext' => 'कृपा कऽ अपन विचार नीचाठपà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ करू।',
+'missingcommentheader' => "'''सà¥à¤®à¤°à¤£:''' अहाठकोनो विषय/ शीरà¥à¤·à¤• ठटिपà¥à¤ªà¤£à¥€à¤• लेल नै देने छी।
+जठअहाठफेरसठकà¥à¤²à¤¿à¤• करब \"{{int:savearticle}}\" , अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨ बिना à¤à¤•à¤° संरकà¥à¤·à¤¿à¤¤ भऽ जाà¤à¤¤à¥¤",
+'summary-preview' => 'सारांश पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
+'subject-preview' => 'विषय/ शीरà¥à¤·à¤• पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
+'blockedtitle' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।',
+'blockedtext' => "''' अहाà¤à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® वा अनिकेत पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कऽ देल गेल अछि।'''
+
+ई पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ $1 दà¥à¤µà¤¾à¤°à¤¾ कà¤à¤² गेल।
+à¤à¤•à¤° कारण अछि ''$2'' ।
+
+* पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• पà¥à¤°à¤¾à¤°à¤®à¥à¤­: $8
+* पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• समापà¥à¤¤à¤¿: $6
+* आसनà¥à¤¨ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¤ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤: $7
+
+अहाठ$1 सठसमà¥à¤ªà¤°à¥à¤• कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• विषयमे समà¥à¤ªà¤°à¥à¤• कऽ सकै छी।
+अहाठ’ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° दिअ’ सà¥à¤µà¤¿à¤§à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤— नै कऽ सकै छी यावत à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेतक विवरण अहाà¤à¤• [[Special:Preferences|खाता विकलà¥à¤ª]] मे नै देल अछि आ अहाà¤à¤•à¥‡à¤ à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— करबासठरोकि नै देल गेल हो।
+अहाà¤à¤• वरà¥à¤¤à¤®à¤¾à¤¨ अनिकेत अछि $3, आ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ संखà¥à¤¯à¤¾ अछि # $5 ।
+ठसभ विवरणक उलà¥à¤²à¥‡à¤– अहाठअपन कोनो कà¤à¤² जाइबला पà¥à¤°à¤¶à¥à¤¨à¤®à¥‡ करू।",
+'autoblockedtext' => 'अहाà¤à¤• अनिकेत सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कऽ देल गेल अछि कारण à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— कोनो दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ भऽ रहल छल, जे $1 दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¤à¤¿à¤¤ कà¤à¤² गेल।
+à¤à¤•à¤° कारण अछि:
+: \'\'$2\'\' ।
+
+* पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• पà¥à¤°à¤¾à¤°à¤®à¥à¤­: $8
+* पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• समापà¥à¤¤à¤¿: $6
+* आसनà¥à¤¨ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¤ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤: $७
+
+अहाठ$1 सठसमà¥à¤ªà¤°à¥à¤• कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• विषयमे समà¥à¤ªà¤°à¥à¤• कऽ सकै छी।
+अहाठमोन राखू जे अहाठ’ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° दिअ’ सà¥à¤µà¤¿à¤§à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤— नै कऽ सकै छी यावत à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेतक पंजीकरण अहाà¤à¤• [[Special:Preferences|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ विकलà¥à¤ª]] मे नै देल अछि आ अहाà¤à¤•à¥‡à¤ à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— करबासठरोकि नै देल गेल हो।
+अहाà¤à¤• वरà¥à¤¤à¤®à¤¾à¤¨ अनिकेत अछि $3, आ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ संखà¥à¤¯à¤¾ अछि # $5 ।
+ठसभ विवरणक उलà¥à¤²à¥‡à¤– अहाठअपन कोनो कà¤à¤² जाइबला पà¥à¤°à¤¶à¥à¤¨à¤®à¥‡ करू।',
+'blockednoreason' => 'कोनो कारण देल नै अछि।',
+'blockedoriginalsource' => "'''$1''' क कारण नीचाठदेल अछि।",
+'blockededitsource' => "'''अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨ सभ''' क पाठ '''$1''' क सनà¥à¤¦à¤°à¥à¤­à¤®à¥‡ नीचाठदेल अछि:",
+'whitelistedittitle' => 'समà¥à¤ªà¤¾à¤¦à¤¨ लेल समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ आवशà¥à¤¯à¤• अछि',
+'whitelistedittext' => 'अहाà¤à¤•à¥‡à¤ $1पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ करबा लेल',
+'confirmedittext' => 'पनà¥à¤¨à¤¾ सभक समà¥à¤ªà¤¾à¤¦à¤¨ केलासठपूरà¥à¤µ अहाठअपन ई-पतà¥à¤° संकेतकेठसतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करू।
+कृपा कऽ अपन ई-पतà¥à¤° पता दरà¥à¤œ करू आ सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करू ठसठ[[Special:Preferences|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पसिनà¥à¤¨ सभ]]',
+'nosuchsectiontitle' => 'संवरà¥à¤— नै ताकि सकल',
+'nosuchsectiontext' => 'अहाठà¤à¤¹à¤¨ संवरà¥à¤—केठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करबाक पà¥à¤°à¤¯à¤¾à¤¸ केलहà¥à¤ जे अछि नै।
+अहाठजखन ई पना देख रहल छलहà¥à¤ तखन ई मेटा देल गेल हà¤à¤¤ वा दोसर ठाम हटा देल गेल हà¤à¤¤à¥¤',
+'loginreqtitle' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ आवशà¥à¤¯à¤•',
+'loginreqlink' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶',
+'loginreqpagetext' => 'अहाठनिशà¥à¤šà¤¯à¤°à¥‚पेठ$1 दोसर पनà¥à¤¨à¤¾ देखबाक लेल।',
+'accmailtitle' => 'कोटशबà¥à¤¦ पठा देल गेल।',
+'accmailtext' => "à¤à¤•à¤Ÿà¤¾ बिना कà¥à¤°à¤®à¤¬à¤²à¤¾ निरà¥à¤®à¤¾à¤£ पदà¥à¤§à¤¤à¤¿à¤¸à¤ कूटशबà¥à¤¦à¤• निरà¥à¤®à¤¾à¤£ [[User talk:$1|$1]] लेल $2 केठपठाà¤à¤² गेल अछि।
+
+ठखाताक कूटशबà¥à¤¦ बदलल जा सकैठ''[[Special:ChangePassword|कूटशबà¥à¤¦ बदलू]]'' पनà¥à¤¨à¤¾à¤ªà¤° समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ केलाक बाद।",
+'newarticle' => '(नव)',
+'newarticletext' => 'अहाठà¤à¤¹à¥‡à¤¨ पनà¥à¤¨à¤¾à¤• लिंकक अनà¥à¤¸à¤°à¤£ कऽ आà¤à¤² छी जे पनà¥à¤¨à¤¾ अखन बनले नै अछि।
+पनà¥à¤¨à¤¾ बनेबाक लेल नीचाà¤à¤• बकà¥à¤¶à¤¾à¤®à¥‡ टाइप केनाइ शà¥à¤°à¥‚ करू (देखू [[{{MediaWiki:Helppage}}| सहायता पनà¥à¤¨à¤¾]] विषेष जानकारी लेल)।',
+'anontalkpagetext' => "----'' ई à¤à¤•à¤Ÿà¤¾ अनाम पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• लेल वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ छी जे अखन धरि अपन खाता नै खोलने छथि, वा जे à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— नै करै छथि।
+हमरा सभकेठतइ लेल अंकीय अनिकेतक पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¤•à¤¾ देखार करबा लेल करऽ पड़ि रहल अछि।
+ठतरहक अनिकेत अनेक पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ साà¤à¥€ कà¤à¤² जा सकैत अछि।
+जठअहाठअनाम पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ छी आ बà¥à¤à¥ˆ छी जे बिना मतलबक टिपà¥à¤ªà¤£à¥€ अहाठदिस देल जा रहल अछि, तठकृपा कऽ [[Special:UserLogin/signup|à¤à¤•à¤Ÿà¤¾ खाता खोलू]] वा [[Special:UserLogin|समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶]] जइसठभविषà¥à¤¯à¤®à¥‡ आन अनाम पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¸à¤ अहाà¤à¤•à¥‡à¤ दिकà¥à¤•à¤¤ नै हो।''",
+'noarticletext' => 'अखन ठपनà¥à¤¨à¤¾à¤ªà¤° कोनो पाठ नै अछि।
+अहाठ[[Special:Search/{{PAGENAME}}|ठपनà¥à¤¨à¤¾à¤• शीरà¥à¤·à¤•à¥‡à¤ ताकू]] आन पनà¥à¤¨à¤¾à¤ªà¤°,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} समà¥à¤¬à¤¨à¥à¤§à¥€ वृतà¥à¤¤à¤²à¥‡à¤– ताकू],
+आकि [{{fullurl:{{FULLPAGENAME}}|action=edit}} ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू]</span>.',
+'noarticletext-nopermission' => 'अखन ठपनà¥à¤¨à¤¾à¤ªà¤° कोनो पाठ नै अछि।
+अहाठ[[Special:Search/{{PAGENAME}}|ठपनà¥à¤¨à¤¾ शीरà¥à¤·à¤• लेल ताकू]]',
+'userpage-userdoesnotexist' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता "$1" पंजीकृत नै अछि।
+निशà¥à¤šà¤¯ करू जे की अहाठई पनà¥à¤¨à¤¾ बनेबाक/ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करबाक इचà¥à¤›à¥à¤• छी।',
+'userpage-userdoesnotexist-view' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता "$1" पंजीकृत नै अछि।',
+'blocked-notice-logextract' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अखन पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।
+अदà¥à¤¯à¤¤à¤¨ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ वृतà¥à¤¤à¤²à¥‡à¤– लेखा सनà¥à¤¦à¤°à¥à¤­ लेल नीचाठदेल अछि:',
+'clearyourcache' => "'''टिपà¥à¤ªà¤£à¥€: संरकà¥à¤·à¤£à¤• बाद, अहाà¤à¤•à¥‡à¤ परिवरà¥à¤¤à¤¨ देखबा लेल अपन गवेषकक उपसà¥à¤®à¥ƒà¤¤à¤¿à¤•à¥‡à¤ हटबठपड़त।'''
+''' मोजिलà¥à¤²à¤¾/ फायरफॉकà¥à¤¸/ सफारी:''' दाबि कऽ राखू ''शिफà¥à¤Ÿ'' केठ''पà¥à¤¨à¤°à¥à¤­à¤¾à¤°à¤¿à¤¤'' कà¥à¤²à¤¿à¤• करबाक समà¤, वा दाबू चाहे ''Ctrl-F5'' वा ''Ctrl-R'' (''Command-R'' मैकिनटोशपर);
+'''कनà¥à¤•à¤°à¤°: ''' कà¥à¤²à¤¿à¤• करू ''पà¥à¤¨à¤°à¥à¤­à¤¾à¤°à¤¿à¤¤ करू'' वा दाबू''F5'';
+'''ओपेरा:''' उपसà¥à¤®à¥ƒà¤¤à¤¿ खतम करू ''Tools → Preferences'';
+'''इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ à¤à¤•à¥à¤¸à¤ªà¥à¤²à¥‹à¤°à¤°:''' दाबि कऽ राखू ''Ctrl'' कà¥à¤²à¤¿à¤• करबा काल ''नवीकरण,'' वा दाबू ''Ctrl-F5'' ।",
+'usercssyoucanpreview' => "''' संकेत:''' पà¥à¤°à¤¯à¥‹à¤— करू \"{{int:पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देखाउ}}\" बटन अपन नव सी.à¤à¤¸.à¤à¤¸. संरकà¥à¤·à¤£ जà¤à¤šà¤¬à¤¾à¤• लेल।",
+'userjsyoucanpreview' => "''' संकेत:''' पà¥à¤°à¤¯à¥‹à¤— करू \"{{int:पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देखाउ}}\" बटन अपन नव जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ संरकà¥à¤·à¤£ जà¤à¤šà¤¬à¤¾à¤• लेल।",
+'usercsspreview' => "''' मोन राखू जे अहाठमातà¥à¤° अपन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सी.à¤à¤¸.à¤à¤¸. क पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देख रहल छी।'''
+''' ई अखन धरि संरकà¥à¤·à¤¿à¤¤ नै भऽ सकल!'''",
+'userjspreview' => "''' मोन राखू जे अहाठमातà¥à¤° अपन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤• पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देख रहल छी।'''
+''' ई अखन धरि संरकà¥à¤·à¤¿à¤¤ नै भऽ सकल!'''",
+'sitecsspreview' => "''' मोन राखू जे अहाठमातà¥à¤° ठसी.à¤à¤¸.à¤à¤¸. क पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देख रहल छी।'''
+''' ई अखन धरि संरकà¥à¤·à¤¿à¤¤ नै भऽ सकल!'''",
+'sitejspreview' => "''' मोन राखू जे अहाठमातà¥à¤° ठजावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤• पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देख रहल छी।'''
+''' ई अखन धरि संरकà¥à¤·à¤¿à¤¤ नै भऽ सकल!'''",
+'userinvalidcssjstitle' => "'''चेतौनी:''' ठमे कोनो आवरण \"\$1\" नै अछि।
+बनाà¤à¤² .css आ .js पनà¥à¤¨à¤¾ लघà¥à¤µà¤•à¥à¤·à¤°à¤• शीरà¥à¤·à¤•à¤• पà¥à¤°à¤¯à¥‹à¤— करैत अछि, जेना {{ns:user}}:Foo/vector.css à¤à¤•à¤° विरà¥à¤¦à¥à¤§ {{ns:user}}:Foo/Vector.css ।",
+'updated' => '(अदà¥à¤¯à¤¤à¤¨ कà¤à¤²)',
+'note' => "'''टिपà¥à¤ªà¤£à¥€:'''",
+'previewnote' => "'''मोन राखू ई मातर पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ छी।'''
+अहाà¤à¤• परिवरà¥à¤¤à¤¨ अखन धरि सà¤à¤šà¤¿à¤†à¤à¤² नै गेल अछि!",
+'previewconflict' => 'ई पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ देखबैठउपरका समà¥à¤ªà¤¾à¤¦à¤¨ कà¥à¤·à¥‡à¤¤à¥à¤°à¤• पाठ , ई आà¤à¤¤ जखन अहाठसंरकà¥à¤·à¤¿à¤¤ करब।',
+'session_fail_preview' => "''' दà¥à¤–ी छी! अहाà¤à¤• सतà¥à¤°à¤• दतà¥à¤¤à¤¾à¤‚श खतम भऽ गेल तै कारणसठअहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨à¤• निपटारा नै भऽ सकल।'''
+फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।
+जठई फेरसठकाज नै करैà¤, पà¥à¤°à¤¯à¥‹à¤— करू [[Special:UserLogout|निषà¥à¤•à¥à¤°à¤®à¤£]] आ फेर समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू।",
+'session_fail_preview_html' => "''' दà¥à¤–ी छी! हम अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨à¤• निषà¥à¤ªà¤¾à¤¦à¤¨ नै कऽ सकलहà¥à¤ कारण सतà¥à¤°à¤• दतà¥à¤¤à¤¾à¤‚श खतम भऽ गेल।'''
+''कारण {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} लग काà¤à¤š à¤à¤š.टी.à¤à¤®.à¤à¤². दतà¥à¤¤à¤¾à¤‚श सकà¥à¤°à¤¿à¤¯ छै, पूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ आकà¥à¤°à¤®à¤£à¤• डरसठनà¥à¤•à¤¾à¤à¤² राखल गेल अछि।''
+'''जठई वैध समà¥à¤ªà¤¾à¤¦à¤¨ पà¥à¤°à¤¯à¤¾à¤¸ अछि, कृपा कऽ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करू।'''
+जठई अखनो काज नै कऽ रहल अछि, पà¥à¤°à¤¯à¤¾à¤¸ करू [[Special:UserLogout|निषà¥à¤•à¥à¤°à¤®à¤£ कऽ रहल छी]] आ फेरसठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¥¤",
+'token_suffix_mismatch' => "'''अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨ असà¥à¤µà¥€à¤•à¤¾à¤° कऽ देल गेल अछि कारण अहाà¤à¤• गà¥à¤°à¤¾à¤¹à¤• पà¥à¤°à¥‡à¤·à¥à¤¯à¤®à¤¾à¤¨ अंक विधानक विराम चेनà¥à¤¹ सभकेठनषà¥à¤Ÿ कऽ देलनà¥à¤¹à¤¿à¥¤'''
+ई समà¥à¤ªà¤¾à¤¦à¤¨ पनà¥à¤¨à¤¾à¤• पाठकेठदूषित होà¤à¤¬à¤¾à¤¸à¤ बचेबा लेल अमानà¥à¤¯ कऽ देल गेल।
+ई कखनो काल होइठजखन अहाठजाल आधारित अनाम दोसरा लेल चल सेवा पà¥à¤°à¤¯à¥à¤•à¥à¤¤ करै छी।",
+'editing' => 'समà¥à¤ªà¤¾à¤¦à¤¨ होइठ$1',
+'editingsection' => 'समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी $1 (खणà¥à¤¡)',
+'editingcomment' => 'समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी $1 (नव खणà¥à¤¡)',
+'editconflict' => 'समà¥à¤ªà¤¾à¤¦à¤¨ अनà¥à¤¤à¤°: $1',
+'explainconflict' => "जखन अहाठà¤à¤•à¤° समà¥à¤ªà¤¾à¤¦à¤¨ आरमà¥à¤­ केने रही तखनसठकियो आन ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ बदलि देलक।
+उपरका पाठ कà¥à¤·à¥‡à¤¤à¥à¤° अखन उपसà¥à¤¥à¤¿à¤¤ पनà¥à¤¨à¤¾à¤• पाठ देखबैत अछि।
+अहाà¤à¤• परिवरà¥à¤¤à¤¨ निचà¥à¤²à¤•à¤¾ पाठ कà¥à¤·à¥‡à¤¤à¥à¤°à¤®à¥‡ देखाà¤à¤² अछि।
+अहाà¤à¤•à¥‡à¤ अपन परिवरà¥à¤¤à¤¨ वरà¥à¤¤à¤®à¤¾à¤¨ पाठमे मिलाबऽ पड़त।
+'''मातà¥à¤°''' \"{{int:savearticle}}\" दबलापर उपरका पाठ कà¥à¤·à¥‡à¤¤à¥à¤°à¤• पाठ संरकà¥à¤·à¤¿à¤¤ हà¤à¤¤à¥¤",
+'yourtext' => 'अहाà¤à¤• पाठ',
+'storedversion' => 'पेटारमे राखल संशोधन',
+'nonunicodebrowser' => "'''चेतौनी: अहाà¤à¤• गवेषक सारà¥à¤µà¤¤à¥à¤°à¤¿à¤•à¤¾à¤•à¥à¤·à¤°à¤•à¥‚ट सहयोगी नै अछि।'''
+à¤à¤•à¤Ÿà¤¾ असà¥à¤¥à¤¾à¤¯à¥€-परोकà¥à¤· तंतà¥à¤°à¤¾à¤‚श अहाà¤à¤•à¥‡à¤ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूपेठपनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¥‡ मदति करत: गà¤à¤°-असà¥à¤•à¥€ अकà¥à¤·à¤° सभ षोडशमान पदà¥à¤§à¤¤à¤¿à¤®à¥‡ समà¥à¤ªà¤¾à¤¦à¤¨ बकà¥à¤¸à¤¾à¤®à¥‡ आà¤à¤¤à¥¤",
+'editingold' => "'''चेतौनी: अहाठठपनà¥à¤¨à¤¾à¤• à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¾à¤¨ संशोधनक समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी।'''
+जठअहाठà¤à¤•à¤°à¤¾ संरकà¥à¤·à¤¿à¤¤ करै छी, कोनो संशोधन जे ठसंशोधनक बाद भेल छै से खतम भऽ जाà¤à¤¤à¥¤",
+'yourdiff' => 'फराक',
+'copyrightwarning' => 'कृपा कय बà¥à¤à¥‚ जे सभटा योगदान {{SITENAME}} ई बà¥à¤à¤¿ कय देल जा रहल अछि जे ई निमà¥à¤¨à¤¾à¤‚कितक अंतरà¥à¤—त अछि $2 (देखू $1 जनकारीक हेतà¥). जौठअहाठचाहैत छी जी अहाà¤à¤• रचना बिना रोकटोकक संपादित नहि हो किंवा बाà¤à¤Ÿà¤² नहि जाय, तठà¤à¤•à¤° योगदान à¤à¤¤à¤¯ नहि करू। <br />
à¤à¤¤à¤¯ अहाठईहो सपà¥à¤ªà¤¤ खाइत छी जी ई अहाà¤à¤• अपन रचना छी आकि अहाठà¤à¤•à¤°à¤¾ कोनो सारà¥à¤µà¤œà¤¨à¤¿à¤• डोमेन किंवा ओहà¥à¤¨à¥‡ कोनो मà¤à¤—नीक संदरà¥à¤­-सà¥à¤¥à¤²à¤¸à¤ कॉपी कà¤à¤¨à¥‡ छी।
< दृढ़> सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤° सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कारà¥à¤¯ à¤à¤¤à¤¯ नहि दी।!</दृढ़>',
-'templatesusedpreview' => 'à¤à¤¹à¤¿ पूरà¥à¤µà¤ªà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤®à¥‡ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ मासà¥à¤Ÿà¤°à¤«à¤¾à¤‡à¤²:',
-'template-protected' => '(सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
+'copyrightwarning2' => "कृपा कऽ बà¥à¤à¥‚ जे सभटा योगदान {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} योगदानकरà¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤, बदलल वा हटाà¤à¤² जा सकैत अछि।. जौठअहाठचाहैत छी जी अहाà¤à¤• रचना बिना रोकटोकक संपादित नहि हो किंवा बाà¤à¤Ÿà¤² नहि जाय, तठà¤à¤•à¤° योगदान à¤à¤¤à¤¯ नहि करू। <br />
+à¤à¤¤à¤¯ अहाठईहो सपà¥à¤ªà¤¤ खाइत छी जी ई अहाà¤à¤• अपन रचना छी आकि अहाठà¤à¤•à¤°à¤¾ कोनो सारà¥à¤µà¤œà¤¨à¤¿à¤• डोमेन किंवा ओहने कोनो मà¤à¤—नीक संदरà¥à¤­-सà¥à¤¥à¤²à¤¸à¤ कॉपी कà¤à¤¨à¥‡ छी(देखू $1 वरà¥à¤£à¤¨ लेल)।
+''' सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤° सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कारà¥à¤¯ à¤à¤¤à¤¯ नहि दी।!'''",
+'longpageerror' => "'''भà¥à¤°à¤®: पाठ जे अहाठदेने छी से $1 किलोबाइट नमगर अछि, जे अधिकतम आकार $2 किलोबाइट सठबेशी नमगर अछि।'''
+ई संरकà¥à¤·à¤¿à¤¤ नै कà¤à¤² जा सकत।",
+'readonlywarning' => "''' चेतौनी: ई दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ सà¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ लेल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² गेल अछि, से अहाठअपन समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ अखन संरकà¥à¤·à¤¿à¤¤ नै कऽ सकब।'''
+अहाठपाठकेठकरà¥à¤¤à¤¨à¤²à¥‡à¤ªà¤¨ दà¥à¤µà¤¾à¤°à¤¾ à¤à¤•à¤Ÿà¤¾ टेकà¥à¤¸à¥à¤Ÿ संचिकामे धऽ सकै छी आ भविषà¥à¤¯ लेल सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ राखि सकै छी।
+
+संचालक जे à¤à¤•à¤°à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ केलनà¥à¤¹à¤¿ से ई कारण देलनà¥à¤¹à¤¿: $1",
+'protectedpagewarning' => "''' चेतौनी: ई पनà¥à¤¨à¤¾ संरकà¥à¤·à¤¿à¤¤ अछि से खाली संचालन अधिकारयà¥à¤•à¥à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ à¤à¤•à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ कऽ सकै छथि।'''
+अदà¥à¤¯à¤¤à¤¨ वृतलेख उलà¥à¤²à¥‡à¤– नीचाठसनà¥à¤¦à¤°à¥à¤­ लेल देल जा रहल अछि:",
+'semiprotectedpagewarning' => "'''चेतौनी:''' ई पनà¥à¤¨à¤¾ संरकà¥à¤·à¤¿à¤¤ अछि से खाली पंजीकृत पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ à¤à¤•à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ कऽ सकै छथि।
+अदà¥à¤¯à¤¤à¤¨ वृतलेख उलà¥à¤²à¥‡à¤– नीचाठसनà¥à¤¦à¤°à¥à¤­ लेल देल जा रहल अछि:",
+'cascadeprotectedwarning' => "'''चेतौनी:''' ई पनà¥à¤¨à¤¾ संरकà¥à¤·à¤¿à¤¤ अछि से खाली संचालन अधिकारयà¥à¤•à¥à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ à¤à¤•à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ कऽ सकै छथि, कारण ई तराउपड़ी संरकà¥à¤·à¤¿à¤¤ {{PLURAL:$1|पनà¥à¤¨à¤¾|पनà¥à¤¨à¤¾}} मे शामिल अछि।",
+'titleprotectedwarning' => "'''चेतौनी: ई पनà¥à¤¨à¤¾ संरकà¥à¤·à¤¿à¤¤ अछि से à¤à¤•à¤°à¤¾ बनेबा लेल [[Special:ListGroupRights|specific rights]] आवशà¥à¤¯à¤• अछि।'''
+नीचाठठलेल अदà¥à¤¯à¤¤à¤¨ वृतà¥à¤¤à¤²à¥‡à¤– उलà¥à¤²à¥‡à¤– देल जा रहल अछि:",
+'templatesused' => '{{PLURAL:$1|नमूना|नमूना सभ}} ठपनà¥à¤¨à¤¾à¤ªà¤° पà¥à¤°à¤¯à¥à¤•à¥à¤¤:',
+'templatesusedpreview' => '{{PLURAL:$1|मासà¥à¤Ÿà¤°à¤«à¤¾à¤‡à¤²|सभटा मासà¥à¤Ÿà¤°à¤«à¤¾à¤‡à¤²}} used in this preview:ठपूरà¥à¤µà¤ªà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤®à¥‡ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ :',
+'templatesusedsection' => '{{PLURAL:$1|नमूना|नमूना सभ}} ठसंवरà¥à¤—मे पà¥à¤°à¤¯à¥à¤•à¥à¤¤:',
+'template-protected' => '(सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
+'template-semiprotected' => '(अरà¥à¤§-रकà¥à¤·à¤¿à¤¤)',
+'hiddencategories' => 'ई पनà¥à¤¨à¤¾ सदसà¥à¤¯ अछि {{PLURAL:$1|1 नà¥à¤•à¤¾à¤à¤² संवरà¥à¤—|$1 नà¥à¤•à¤¾à¤à¤² संवरà¥à¤— सभ}}:',
+'nocreatetitle' => 'पनà¥à¤¨à¤¾ निरà¥à¤®à¤¾à¤£ सीमित',
+'nocreatetext' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} नव पनà¥à¤¨à¤¾ निरà¥à¤®à¤¾à¤£à¤• कà¥à¤·à¤®à¤¤à¤¾à¤•à¥‡à¤ सीमित कऽ देने अछि।
+अहाठआपस जा सकै छी आ कोनो पनà¥à¤¨à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ कऽ सकै छी, वा [[Special:UserLogin|log in or create an account]]',
+'nocreate-loggedin' => 'अहाà¤à¤•à¥‡à¤ नव पनà¥à¤¨à¤¾ बनेबाक अधिकार नै अछि।',
+'sectioneditnotsupported-title' => 'खंड समà¥à¤ªà¤¾à¤¦à¤¨ समरà¥à¤¥à¤¨ नै',
+'sectioneditnotsupported-text' => 'खंड समà¥à¤ªà¤¾à¤¦à¤¨à¤• ठपनà¥à¤¨à¤¾à¤ªà¤° समरà¥à¤¥à¤¨ नै',
+'permissionserrors' => 'आजà¥à¤žà¤¾ गलà¥à¤¤à¥€',
+'permissionserrorstext' => 'अहाà¤à¤•à¥‡ ठलेल अनà¥à¤®à¤¤à¤¿ नै अछि, ठले {{PLURAL:$1|कारण|कारण सभ}}:',
+'permissionserrorstext-withaction' => 'अहाà¤à¤•à¥‡ अनà¥à¤®à¤¤à¤¿ नै अछि $2 लेल, ठलेल {{PLURAL:$1|कारण|कारण सभ}}:',
+'recreate-moveddeleted-warn' => "'''चेतौनी''': अहाठफेरसठओ पनà¥à¤¨à¤¾ बना रहल छी जे पहिने मेटा देल गेल छै।'''
+
+अहाठविचारू जे की ई समà¥à¤ªà¤¾à¤¦à¤¨ केनाइ उचित अछि।
+ठपनà¥à¤¨à¤¾à¤• मेटाà¤à¤² बला आ हटाà¤à¤² वृतà¥à¤¤à¤²à¥‡à¤– à¤à¤¤à¤ सà¥à¤µà¤¿à¤§à¤¾ लेल देल जा रहल अछि:",
+'moveddeleted-notice' => 'ई पनà¥à¤¨à¤¾ मेटा देल गेल अछि।
+ठपनà¥à¤¨à¤¾ लेल मेटाà¤à¤² आ हटाà¤à¤² बला वृतà¥à¤¤à¤²à¥‡à¤– सनà¥à¤¦à¤°à¥à¤­ लेल नीचाठदेल गेल अछि।',
+'log-fulllog' => 'सभटा वृतà¥à¤¤à¤²à¥‡à¤– देखू',
+'edit-hook-aborted' => 'समà¥à¤ªà¤¾à¤¦à¤¨ नोकसीसठखतम भेल।
+ई कोनो कारण नै देलक।',
+'edit-gone-missing' => 'पनà¥à¤¨à¤¾ अदà¥à¤¯à¤¤à¤¨ नै भऽ सकल।
+लगैठजे ई मेटा देल गेल अछि।',
+'edit-conflict' => 'समà¥à¤ªà¤¾à¤¦à¤¨ अनà¥à¤¤à¤°',
+'edit-no-change' => 'अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨à¤ªà¤° धà¥à¤¯à¤¾à¤¨ नै देल गेल, कारण ठसठपाठमे कोनो परिवरà¥à¤¤à¤¨ नै आà¤à¤²à¥¤',
+'edit-already-exists' => 'नव पनà¥à¤¨à¤¾à¤• निरà¥à¤®à¤¾à¤£ नै भऽ सकल।
+ई पहिनहियेसठवरà¥à¤¤à¤®à¤¾à¤¨ अछि।',
+
+# Parser/template warnings
+'expensive-parserfunction-warning' => "'''चेतौनी:''' ई पनà¥à¤¨à¤¾ बडà¥à¤¡ बेसी महग विभाजक पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ आहà¥à¤µà¤¾à¤¨ करैत अछि।
+ à¤à¤•à¤°à¤¾ $2 सठकम {{PLURAL:$2|call|calls}}, ओतऽ {{PLURAL:$1|ई अछि $1 call|ई सभ अछि $1 calls}}",
+'expensive-parserfunction-category' => 'बड बेसी महग विभाजक आहà¥à¤µà¤¾à¤¨à¤¬à¤²à¤¾ पनà¥à¤¨à¤¾ सभ',
+'post-expand-template-inclusion-warning' => "'''चेतौनी:''' नमूना लेबाक आकार बडà¥à¤¡ पैघ अछि।
+किछॠनमूना नै लेल जा सकत।",
+'post-expand-template-inclusion-category' => 'पनà¥à¤¨à¤¾ सभ जतठनमूना लेबाक आकार बढ़ि गेल',
+'post-expand-template-argument-warning' => "'''चेतौनी''' ठपनà¥à¤¨à¤¾à¤®à¥‡ नै बेशी तठà¤à¤•à¤Ÿà¤¾ à¤à¤¹à¥‡à¤¨ नमूना निरà¥à¤ªà¤• अछि जकर बडà¥à¤¡ पैघ विसà¥à¤¤à¤¾à¤° आकार छै।
+ई निरूपक सभ हटा देल गेल अछि।",
+'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' => "ई समà¥à¤ªà¤¾à¤¦à¤¨ पूरà¥à¤µà¤µà¤¤ बदलल जा सकैà¤à¥¤
+कृपा क' नीचाà¤à¤• तà¥à¤²à¤¨à¤¾à¤• जाà¤à¤š करू ई देखैले जे ई वà¤à¤¹ भेल अछि जे अहाठचाहै छलहà¥à¤, आ तखन समà¥à¤ªà¤¾à¤¦à¤¨ ख़तम करबा लेल नीचाà¤à¤• परिवरà¥à¤¤à¤¨ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू ।",
+'undo-failure' => 'मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€ विरोधी समà¥à¤ªà¤¾à¤¦à¤¨à¤• कारण ठसमà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ खतम नै कà¤à¤² जा सकैà¤à¥¤',
+'undo-norev' => 'ई समà¥à¤ªà¤¾à¤¦à¤¨ खतम नै कà¤à¤²à¤¾ जा सकैठकारण ई अछि नै वा मेटा देल गेल अछि।',
+'undo-summary' => '$1 संशोधन खतम करू [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'खाता नै बना सकल',
+'cantcreateaccount-text' => "('''$1''') अनिकेत पतासठखाता निरà¥à¤®à¤¾à¤£ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² गेल [[User:$3|$3]]।
+$3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
# History pages
-'revisionasof' => 'अंतिम परिवरà¥à¤¤à¥à¤¤à¤¨ $1',
-'previousrevision' => 'â†à¤ªà¥à¤°à¤¾à¤¨ परिवरà¥à¤¤à¥à¤¤à¤¨',
-'cur' => 'हीन',
-'last' => 'अंतिम',
+'viewpagelogs' => 'ठपनà¥à¤¨à¤¾à¤• वृतà¥à¤¤à¤²à¥‡à¤– सभ देखू',
+'nohistory' => 'ठपनà¥à¤¨à¤¾ लेल कोनो समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास नै अछि।',
+'currentrev' => 'नूतन संशोधन',
+'currentrev-asof' => '$1 क समकालिक तखà¥à¤¨à¤•à¤¾ संशोधन',
+'revisionasof' => 'अंतिम परिवरà¥à¤¤à¥à¤¤à¤¨ $1',
+'revision-info' => '$2 दà¥à¤µà¤¾à¤°à¤¾ कà¤à¤² संशोधन अछि $1',
+'previousrevision' => 'â†à¤ªà¥à¤°à¤¾à¤¨ परिवरà¥à¤¤à¥à¤¤à¤¨',
+'nextrevision' => 'नूतन संशोधन →',
+'currentrevisionlink' => 'नूतन संशोधन',
+'cur' => 'हीन',
+'next' => 'आगाà¤',
+'last' => 'अंतिम',
+'page_first' => 'पहिल',
+'page_last' => 'अनà¥à¤¤à¤¿à¤®',
+'histlegend' => "फाइल तà¥à¤²à¤¨à¤¾ तंतà¥à¤°à¤¾à¤‚शक चयन: संशोधन तà¥à¤²à¤¨à¤¾à¤• रेडियो बकà¥à¤¶à¤¾à¤•à¥‡à¤ चिनà¥à¤¹à¤¿à¤¤ करू आ à¤à¤¨à¥à¤Ÿà¤° बटन कà¥à¤²à¤¿à¤• करू वा सभसठनीचाà¤à¤• बटन कà¥à¤²à¤¿à¤• करू। <br />
+कहबी: '''({{int:cur}})''' = अदà¥à¤¯à¤¤à¤¨ संशोधनसठअनà¥à¤¤à¤°, '''({{int:last}})''' = अदà¥à¤¯à¤¤à¤¨à¤¸à¤ पहिलà¥à¤•à¤¾ संशोधनसठअनà¥à¤¤à¤°, '''{{int:minoreditletter}}''' = मामूली समà¥à¤ªà¤¾à¤¦à¤¨à¥¤",
+'history-fieldset-title' => 'इतिहास खंघारू',
+'history-show-deleted' => 'खाली मेटाà¤à¤²',
+'histfirst' => 'सभसठपà¥à¤°à¤¾à¤¨',
+'histlast' => 'आइ-कालà¥à¤¹à¤¿à¤•',
+'historysize' => '({{PLURAL:$1|1 अषà¥à¤Ÿà¤•|$1 अषà¥à¤Ÿà¤•}})',
+'historyempty' => '(रिकà¥à¤¤)',
+
+# Revision feed
+'history-feed-title' => 'संशोधन इतिहास',
+'history-feed-description' => 'ठपनà¥à¤¨à¤¾à¤• विकीपर समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास',
+'history-feed-item-nocomment' => '$2 पर $1',
+'history-feed-empty' => 'आगà¥à¤°à¤¹ कà¤à¤² पनà¥à¤¨à¤¾ नै अछि।
+ई विकीसठचाहे मेटा देल गेल अछि, वा à¤à¤•à¤° नाम बदलि देल गेल अछि।
+पà¥à¤°à¤¯à¤¾à¤¸ करू [[Special:Search|searching on the wiki]] समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ नव पनà¥à¤¨à¤¾ सभ लेल।',
+
+# Revision deletion
+'rev-deleted-comment' => '(समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास हटाà¤à¤² गेल)',
+'rev-deleted-user' => '(पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® हटाà¤à¤² गेल)',
+'rev-deleted-event' => '(वृतलेख कारà¥à¤¯ हटाà¤à¤² गेल)',
+'rev-deleted-user-contribs' => '[पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® वा अनिकेत हटाà¤à¤² गेल- योगदानमे नà¥à¤•à¤¾à¤à¤² समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू]',
+'rev-deleted-text-permission' => "ठपनà¥à¤¨à¤¾à¤• संशोधन '''मेटा देल गेल'''।
+वरà¥à¤£à¤¨ देखि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
+'rev-deleted-text-unhide' => "ई पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ '''मेटाà¤à¤²''' गेल।
+वरà¥à¤£à¤¨ ताकि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।
+संचालकक रूपमे अहाठअखनो [$1 ई संशोधन देखू] जठअहाठआगाठबढ़ऽ चाहै छी।",
+'rev-suppressed-text-unhide' => "'''ई पनà¥à¤¨à¤¾ संशोधन '''दबाà¤à¤²''' गेल।
+वरà¥à¤£à¤¨ ताकि सकै छी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] मे।
+संचालकक रूपमे अहाठअखनो [$1 ई संशोधन देखू] जठअहाठआगाठबढ़ऽ चाहै छी।",
+'rev-deleted-text-view' => "ई पनà¥à¤¨à¤¾ संशोधन '''मेटाà¤à¤²''' गेल।
+संचालकक रूपमे अहाठà¤à¤•à¤°à¤¾ देख सकै छी; वरà¥à¤£ भेट सकैठ[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
+'rev-suppressed-text-view' => "ई पनà¥à¤¨à¤¾ संशोधन '''दबाà¤à¤²''' गेल।
+संचालकक रूपमे अहाठà¤à¤•à¤°à¤¾ देख सकै छी; वरà¥à¤£ भेट सकैठ[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log]मे।",
+'rev-deleted-no-diff' => "ठपनà¥à¤¨à¤¾à¤• तà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤• अहाठनै देख सकै छी कारण कोनो à¤à¤•à¤Ÿà¤¾ संशोधन '''मेटा देल गेल''' अछि।
+वरà¥à¤£à¤¨ देखि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
+'rev-suppressed-no-diff' => "अहाठतà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤• नै देख सकै छी कारण कोनो à¤à¤•à¤Ÿà¤¾ संशोधन '''मेटाà¤à¤²''' गेल अछि।",
+'rev-deleted-unhide-diff' => "ठतà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤•à¤• कोनो à¤à¤•à¤Ÿà¤¾ संशोधन '''मेटाà¤à¤²''' गेल अछि।
+वरà¥à¤£à¤¨ ताकि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।
+संचालकक रूपमे अहाठअखनो [$1 ई तà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤• देखू] जठअहाठआगाठबढ़ऽ चाहै छी।",
+'rev-suppressed-unhide-diff' => "ठतà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤•à¤• कोनो à¤à¤•à¤Ÿà¤¾ संशोधन '''दबाà¤à¤²''' गेल अछि।
+वरà¥à¤£à¤¨ ताकि सकै छी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] मे।
+संचालकक रूपमे अहाठअखनो [$1 ई तà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤• देखू] जठअहाठआगाठबढ़ऽ चाहै छी।",
+'rev-deleted-diff-view' => "ई पनà¥à¤¨à¤¾ संशोधनठतà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤•à¤• कोनो à¤à¤•à¤Ÿà¤¾ संशोधन '''मेटाà¤à¤²''' गेल अछि।
+संचालकक रूपमे अहाठà¤à¤•à¤°à¤¾ देख सकै छी; वरà¥à¤£ भेट सकैठ[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
+'rev-suppressed-diff-view' => "ठतà¥à¤²à¤¨à¤¾ निरà¥à¤§à¤¾à¤°à¤•à¤• कोनो à¤à¤•à¤Ÿà¤¾ संशोधन '''दबाà¤à¤²''' गेल अछि।
+संचालकक रूपमे अहाठà¤à¤•à¤°à¤¾ देख सकै छी; वरà¥à¤£à¤¨ भेट सकैठ[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log]मे।",
+'rev-delundel' => 'देखाउ/ नà¥à¤•à¤¾à¤‰',
+'rev-showdeleted' => 'देखाउ',
+'revisiondelete' => 'मेटाउ / संशोधन फेरसठआनू',
+'revdelete-nooldid-title' => 'अमानà¥à¤¯ लकà¥à¤·à¥à¤¯ संशोधन',
+'revdelete-nooldid-text' => 'अहाठचाहे तठठपà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤• निषà¥à¤ªà¤¾à¤¦à¤¨ लेल कोनो विशेष लकà¥à¤·à¥à¤¯ संशोधन (संशोधन सभ) नै तà¤à¤-तफसिला केने छी, विशेष संशोधन नै उपसà¥à¤¥à¤¿à¤¤ अछि, वा अहाठवरà¥à¤¤à¤®à¤¾à¤¨ संशोधनकेठनà¥à¤•à¥‡à¤¬à¤¾à¤• पà¥à¤°à¤¯à¤¾à¤¸ कऽ रहल छी।',
+'revdelete-nologtype-title' => 'कोनो वृतà¥à¤¤à¤²à¥‡à¤– पà¥à¤°à¤•à¤¾à¤° नै देल गेल',
+'revdelete-nologtype-text' => 'ठपà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤•à¥‡à¤ समà¥à¤ªà¤¨à¥à¤¨ करबा लेल अहाठकोनो विशिषà¥à¤Ÿ वृतà¥à¤¤à¤²à¥‡à¤– पà¥à¤°à¤•à¤¾à¤° नै देने छी।',
+'revdelete-nologid-title' => 'अमानà¥à¤¯ वृतà¥à¤¤à¤²à¥‡à¤– पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿',
+'revdelete-nologid-text' => 'अहाठठपà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤•à¥‡à¤ करबा लेल चाहे तठकोनो लकà¥à¤·à¥à¤¯ वृतà¥à¤¤à¤²à¥‡à¤– घटनाक उलà¥à¤²à¥‡à¤– नै केने छी वा ओ विशिषà¥à¤Ÿ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ अछिये नै।',
+'revdelete-no-file' => 'विषिषà¥à¤Ÿ संचिका अछिये नै।',
+'revdelete-show-file-confirm' => 'की अहाठआशà¥à¤µà¤¸à¥à¤¤ छी जे अहाठसंचिकाक मेटाà¤à¤² संशोधन देखऽ चाहै छी "<nowiki>$1</nowiki>" ठसठ$2 à¤à¤¤à¤½ $3?',
+'revdelete-show-file-submit' => 'हà¤',
+'revdelete-selected' => "'''{{PLURAL:$2|चà¥à¤¨à¤² संशोधन|चà¥à¤¨à¤² संशोधन सभ}} à¤à¤•à¤° [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|चà¥à¤¨à¤² वृतà¥à¤¤à¤²à¥‡à¤– घटना|चà¥à¤¨à¤² वृतà¥à¤¤à¤²à¥‡à¤– घटना सभ}}:'''",
+'revdelete-text' => "'''मेटाà¤à¤² संशोधन सभ आ घटना सभ पनà¥à¤¨à¤¾à¤• इतिहास आ वृतà¥à¤¤à¤²à¥‡à¤–मे आà¤à¤¤, मà¥à¤¦à¤¾ ओकर सूचीक किछॠभाग सामानà¥à¤¯ लोक लेल उपलबà¥à¤§ नै रहत।'''
+{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पर दोसर संचालक लग अखनो नà¥à¤•à¤¾à¤à¤² सूची उपलबà¥à¤§ छनà¥à¤¹à¤¿ आ ओ ओकरा फेरसठआनि सकै छथि अही मधà¥à¤¯à¤¸à¥à¤¥à¤• दà¥à¤µà¤¾à¤°à¤¾, आ से हà¤à¤¤ जठअतिरिकà¥à¤¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लागू रहत।",
+'revdelete-confirm' => 'कृपा कऽ आशà¥à¤µà¤¸à¥à¤¤ भऽ जाउ जे अहाठई करऽ चाहै छी, अहाà¤à¤•à¥‡à¤ à¤à¤•à¤° परिणामक जनतब अछि, आ अहाठà¤à¤•à¤°à¤¾ [[{{MediaWiki:Policy-url}}|निअम]] क अनà¥à¤¸à¤¾à¤° कऽ रहल छी।',
+'revdelete-suppress-text' => "दबाबैबला काज '''मातà¥à¤°''' ठसभ सà¥à¤¥à¤¿à¤¤à¤¿à¤®à¥‡ पà¥à¤°à¤¯à¥‹à¤— करू:
+* मानहानिक समà¥à¤­à¤¾à¤µà¤¨à¤¾à¤¬à¤²à¤¾ सूचना
+* भà¥à¤°à¤®à¤¯à¥à¤•à¥à¤¤ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त सूचना
+*: ''घरक पता आ टेलीफोन नमà¥à¤¬à¤°, सामाजिक सà¥à¤°à¤•à¥à¤·à¤¾ संखà¥à¤¯à¤¾, आदि।''",
+'revdelete-legend' => 'दृशà¥à¤¯à¤¤à¤¾à¤ªà¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• सीमा लगाउ',
+'revdelete-hide-text' => 'संशोधन पाठ नà¥à¤•à¤¾à¤‰',
+'revdelete-hide-image' => 'संचिकाक पाठ नà¥à¤•à¤¾à¤‰',
+'revdelete-hide-name' => 'कà¥à¤°à¤¿à¤¯à¤¾ आ लकà¥à¤·à¥à¤¯ नà¥à¤•à¤¾à¤‰',
+'revdelete-hide-comment' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सार नà¥à¤•à¤¾à¤‰',
+'revdelete-hide-user' => 'समà¥à¤ªà¤¾à¤¦à¤•à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®/ अनिकेत नà¥à¤•à¤¾à¤‰',
+'revdelete-hide-restricted' => 'संचालक आ दोसरासठदतà¥à¤¤à¤¾à¤‚श दबाउ',
+'revdelete-radio-same' => '(नै बदलू)',
+'revdelete-radio-set' => 'हà¤',
+'revdelete-radio-unset' => 'नै',
+'revdelete-suppress' => 'संचालक आ दोसरा लेल दतà¥à¤¤à¤¾à¤‚श दबाउ',
+'revdelete-unsuppress' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ संशोधल लेल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
+'revdelete-log' => 'कारण:',
+'revdelete-submit' => 'किछॠचà¥à¤¨à¤²à¤ªà¤° लागू करू{{PLURAL:$1|संशोधन|संशोधन सभ}}',
+'revdelete-logentry' => '"[[$1]]"क बदलल संशोधन दृशà¥à¤¯à¤¤à¤¾',
+'logdelete-logentry' => '"[[$1]]"क बदलल घटना दृशà¥à¤¯à¤¤à¤¾',
+'revdelete-success' => "'''संशोधन दृशà¥à¤¯à¤¤à¤¾ सफलतापूरà¥à¤µà¤• अदà¥à¤¯à¤¤à¤¨ कà¤à¤² गेल।'''",
+'revdelete-failure' => "$1'''संशोधन दृशà¥à¤¯à¤¤à¤¾ अदà¥à¤¯à¤¤à¤¨ नै कà¤à¤² जा सकल:'''",
+'logdelete-success' => "'''वृतà¥à¤¤à¤²à¥‡à¤– दृशà¥à¤¯à¤¤à¤¾ सफलतासठनिरà¥à¤§à¤¾à¤°à¤¿à¤¤ भेल।'''",
+'logdelete-failure' => "'''वृतà¥à¤¤à¤²à¥‡à¤– दृशà¥à¤¯à¤¤à¤¾ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ नै भऽ सकल।'''$1",
+'revdel-restore' => 'दृषà¥à¤Ÿà¤¿à¤•à¥à¤¶à¤²à¤¤à¤¾ बदलू',
+'revdel-restore-deleted' => 'मेटाà¤à¤² संशोधन सभ',
+'revdel-restore-visible' => 'देखाइ दैत संशोधन सभ',
+'pagehist' => 'पनà¥à¤¨à¤¾à¤• इतिहास',
+'deletedhist' => 'मेटाà¤à¤² इतिहास',
+'revdelete-content' => 'विषय सूची',
+'revdelete-summary' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सारांश',
+'revdelete-uname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®',
+'revdelete-restricted' => 'संचालक लेल पà¥à¤°à¤¾à¤¯à¥‹à¤—िक पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
+'revdelete-unrestricted' => 'संचालक लेल हटाओल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
+'revdelete-hid' => 'नà¥à¤•à¤¾à¤‰ $1',
+'revdelete-unhid' => 'आनू $1',
+'revdelete-log-message' => '$2 लेल $1{{PLURAL:$2|संशोधन|संशोधन सभ}}',
+'logdelete-log-message' => '$2 लेल $1 {{PLURAL:$2|घटना|घटना सभ}}',
+'revdelete-hide-current' => 'तिथि $2, $1 क अनà¥à¤•à¥à¤°à¤®à¤•à¥‡à¤ नà¥à¤•à¥‡à¤¬à¤¾ काल भà¥à¤°à¤®: ई वरà¥à¤¤à¤®à¤¾à¤¨ संशोधन छी।
+ई नà¥à¤•à¤¾à¤à¤² नै जा सकैà¤à¥¤',
+'revdelete-show-no-access' => 'तिथि $2, $1क बौसà¥à¤¤à¥à¤• देखेबामे भà¥à¤°à¤®: ई बौसà¥à¤¤à¥ "पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤" चिनà¥à¤¹à¤¿à¤¤ कà¤à¤² गेल अछि।',
+'revdelete-modify-no-access' => 'तिथि $2, $1क बौसà¥à¤¤à¥à¤• संशोधनमे भà¥à¤°à¤®: ई बौसà¥à¤¤à¥ "पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤" चिनà¥à¤¹à¤¿à¤¤ कà¤à¤² गेल अछि।
+अहाà¤à¤•à¥‡à¤ à¤à¤•à¤°à¤¾ लग लागि नै अछि।',
+'revdelete-modify-missing' => 'बौसà¥à¤¤à¥à¤• चेनà¥à¤¹-संकेत $1 मे संशोधन भà¥à¤°à¤®: ई दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤®à¥‡ नै अछि।',
+'revdelete-no-change' => "''' चेतौनी ''' बौसà¥à¤¤à¥ तिथि $2, $1 पहिनहियेसठआगà¥à¤°à¤¹ कà¤à¤² दृशà¥à¤¯ विकलà¥à¤ªà¤¯à¥à¤•à¥à¤¤ अछि।",
+'revdelete-concurrent-change' => 'बौसà¥à¤¤à¤¿ तिथि $2, $1 क संशोधनमे भà¥à¤°à¤®: à¤à¤•à¤° सà¥à¤¥à¤¿à¤¤à¤¿à¤®à¥‡ ककरो दोसर दà¥à¤µà¤¾à¤°à¤¾ कà¤à¤² परिवरà¥à¤¤à¤¨ देखल गेल जखन अहाठà¤à¤•à¤°à¤¾ संशोधित कऽ रहल छलहà¥à¤à¥¤
+कृपा कऽ वृतà¥à¤¤à¤²à¥‡à¤– सभक जाà¤à¤š करू।',
+'revdelete-only-restricted' => 'ई संदेश संशोधन-मेटाà¤à¤¬ विशिषà¥à¤Ÿà¤¤à¤¾à¤• भाग अछि। परिमिति:
+ $1 - दिनांक
+ $2 - तिथि',
+'revdelete-reason-dropdown' => '*सामानà¥à¤¯ मेटेबाक कारण सभ
+** सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤°à¤• उलà¥à¤²à¤‚घन
+** अनà¥à¤šà¤¿à¤¤ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त सूचना
+** समà¥à¤­à¤¾à¤µà¤¿à¤¤ मानहानिक सूचना',
+'revdelete-otherreason' => 'दोसर/ अतिरिकà¥à¤¤ कारण:',
+'revdelete-reasonotherlist' => 'दोसर कारण',
+'revdelete-edit-reasonlist' => 'मेटेबाक कारणक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'revdelete-offender' => 'संशोधन केनिहार:',
+
+# Suppression log
+'suppressionlog' => 'दबाà¤à¤²à¤¬à¤²à¤¾ वृतà¥à¤¤à¤²à¥‡à¤–',
+
+# History merging
+'mergehistory' => 'मिजà¥à¤à¤° भेल पनà¥à¤¨à¤¾ सभक इतिहास',
+'mergehistory-header' => 'ई पनà¥à¤¨à¤¾ अहाà¤à¤•à¥‡à¤ à¤à¤•à¤Ÿà¤¾ सà¥à¤°à¥‹à¤¤ पनà¥à¤¨à¤¾à¤• à¤à¤•à¤Ÿà¤¾ नव पनà¥à¤¨à¤¾à¤®à¥‡ संशोधन इतिहासकेठमिजà¥à¤à¤° करबाक अनà¥à¤®à¤¤à¤¿ दैत अछि।
+सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ होउ जे ई परिवरà¥à¤¤à¤¨ à¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• पनà¥à¤¨à¤¾ सांततà¥à¤¯ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करत।',
+'mergehistory-box' => 'दू पनà¥à¤¨à¤¾à¤• संशोधनकेठमिजà¥à¤à¤° करू।',
+'mergehistory-from' => 'मूल पनà¥à¤¨à¤¾:',
+'mergehistory-into' => 'लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾:',
+'mergehistory-list' => 'मिजà¥à¤à¤° योगà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास',
+'mergehistory-merge' => '[[:$1]] à¤à¤•à¤° संशोधन सभकेठ[[:$2]] मे मिलाà¤à¤² जा सकैà¤à¥¤
+रेडियो बटन सà¥à¤¤à¤®à¥à¤­à¤• पà¥à¤°à¤¯à¥‹à¤— मातà¥à¤° संशोधनकेठनिरà¥à¤§à¤¾à¤°à¤¿à¤¤ समठवा ओइसठपहिने मिजà¥à¤à¤° करबामे पà¥à¤°à¤¯à¥‹à¤— करू।
+मोन राखू जे उपर नीचाà¤à¤• लागिक पà¥à¤°à¤¯à¥‹à¤— ठसà¥à¤¤à¤®à¥à¤­à¤•à¥‡à¤ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ कऽ देत।',
+'mergehistory-go' => 'मिजà¥à¤à¤° होइ योगà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤¨ सभकेठदेखाउ',
+'mergehistory-submit' => 'संशोधन सभकेठमिजà¥à¤à¤° करू',
+'mergehistory-empty' => 'कोनो संशोधन मिजà¥à¤à¤° नै कà¤à¤² जा सकैà¤à¥¤',
+'mergehistory-success' => '$3 {{PLURAL:$3|संशोधन|संशोधन सभ}} à¤à¤•à¤° [[:$1]] सफलता पूरà¥à¤µà¤• मिजà¥à¤à¤° कà¤à¤² गेल [[:$2]] मे।',
+'mergehistory-fail' => 'इतिहासक मिशà¥à¤°à¤£à¤•à¥‡à¤ नै कऽ सकल, कृपा कऽ पनà¥à¤¨à¤¾ आ समठपरिमितिकेठफेरसठजाà¤à¤šà¥‚।',
+'mergehistory-no-source' => 'सà¥à¤°à¥‹à¤¤ पनà¥à¤¨à¤¾ $1 नै अछि।',
+'mergehistory-no-destination' => 'लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ $1 नै अछि।',
+'mergehistory-invalid-source' => 'सà¥à¤°à¥‹à¤¤ पनà¥à¤¨à¤¾ à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ शीरà¥à¤·à¤• हेबाक चाही।',
+'mergehistory-invalid-destination' => 'लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ शीरà¥à¤·à¤• हेबाक चाही।',
+'mergehistory-autocomment' => '[[:$1]] केठ[[:$2]] मे मिलाà¤à¤² गेल।',
+'mergehistory-comment' => '[[:$1]] केठ[[:$2]] मे मिलाà¤à¤² गेल: $3',
+'mergehistory-same-destination' => 'सà¥à¤°à¥‹à¤¤ आ लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ सभ à¤à¤•à¥à¤•à¥‡ नै भऽ सकैà¤',
+'mergehistory-reason' => 'कारण:',
+
+# Merge log
+'mergelog' => 'मिजà¥à¤à¤°à¤¬à¤²à¤¾ वृतà¥à¤¤à¤²à¥‡à¤–',
+'pagemerge-logentry' => 'मिजà¥à¤à¤° केलौं [[$1]]केठ[[$2]] मे (संशोधन $3 धरि)',
+'revertmerge' => 'नै मिजà¥à¤à¤°',
+'mergelogpagetext' => 'नीचाठà¤à¤• पनà¥à¤¨à¤¾ इतिहासक दोसरमे अदà¥à¤¯à¤¤à¤¨ मिशà¥à¤°à¤£à¤• सूची अछि।',
# Diffs
-'lineno' => 'पंकà¥à¤¤à¥à¤¤à¤¿ $1:',
-'editundo' => 'असंपादन',
+'history-title' => '"$1" क संशोधन इतिहास',
+'difference' => '(नव संशोधन सभक बीच अनà¥à¤¤à¤°)',
+'difference-multipage' => '(पनà¥à¤¨à¤¾ सभक बीचमे अनà¥à¤¤à¤°)',
+'lineno' => 'पंकà¥à¤¤à¥à¤¤à¤¿ $1:',
+'compareselectedversions' => 'चयन कà¤à¤² संशोधन सभक तà¥à¤²à¤¨à¤¾ करू',
+'showhideselectedversions' => 'देखाउ/ नà¥à¤•à¤¾à¤‰ चयनित संशोधन सभ',
+'editundo' => 'असंपादन',
+'diff-multi' => '({{PLURAL:$1|मधà¥à¤¯à¤¬à¤²à¤¾ संशोधन|$1 मधà¥à¤¯à¤¬à¤²à¤¾ संशोधन सभ}} दà¥à¤µà¤¾à¤°à¤¾ {{PLURAL:$2|à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾|$2 पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ}} नै देखाà¤à¤²)',
+'diff-multi-manyusers' => '({{PLURAL:$1|à¤à¤•à¤Ÿà¤¾ मधà¥à¤¯à¤¸à¥à¤¥ संशोधन|$1 मधà¥à¤¯à¤¸à¥à¤¥ संशोधन सभ}} $2 सठबेसी {{PLURAL:$2|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ}} नै देखाà¤à¤²)',
# Search results
-'powersearch' => 'तà¥à¤µà¤°à¤¿à¤¤ खोज',
+'searchresults' => 'तकबाक फलाफल',
+'searchresults-title' => 'तकबाक फलाफल "$1" लेल',
+'searchresulttext' => 'तकबा लेल विशेष सूचना {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²à¤• नाम}}, देखू [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'अहाठतकलौं ठलेल \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|"$1" सठशà¥à¤°à¥‚ होइबला सभा पृषà¥à¤ ]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|सभ लिंक जकर लागि अछि "$1" सठ]])',
+'searchsubtitleinvalid' => "अहाठतकलहà¥à¤ '''$1''' लेल",
+'toomanymatches' => 'कतेको पà¥à¤°à¤¯à¤¾à¤¸ आपस भेल, कृपा कऽ दोसर अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾à¤¸à¤ पà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'titlematches' => 'पनà¥à¤¨à¤¾ शीरà¥à¤· मेल',
+'notitlematches' => 'कोनो पनà¥à¤¨à¤¾à¤• शीरà¥à¤· मेल नै खाइà¤',
+'textmatches' => 'पनà¥à¤¨à¤¾ पाठ मेल',
+'notextmatches' => 'पनà¥à¤¨à¤¾à¤• पाठक किछॠमेल नै खाइà¤',
+'prevn' => 'पछिला {{PLURAL:$1|$1}}',
+'nextn' => 'आगाठ{{PLURAL:$1|$1}}',
+'prevn-title' => 'पहिलà¥à¤•à¤¾ $1 {{PLURAL:$1|परिणाम|परिणाम सभ}}',
+'nextn-title' => 'आगाठ$1 {{PLURAL:$1|परिणाम|परिणाम सभ}}',
+'shown-title' => 'पà¥à¤°à¤¤à¤¿ पनà¥à¤¨à¤¾ $1 {{PLURAL:$1|परिणाम|परिणाम सभ}} देखाउ',
+'viewprevnext' => 'देखू ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'खोज विकलà¥à¤ª',
+'searchmenu-exists' => "'''ठविकीपर à¤à¤•à¤Ÿà¤¾ पनà¥à¤¨à¤¾ अछि \"[[:\$1]]\" नामसà¤à¥¤'''",
+'searchmenu-new' => "''' पनà¥à¤¨à¤¾ निरà¥à¤®à¤¾à¤£ \"[[:\$1]]\" ठविकीपर !'''",
+'searchhelp-url' => 'Help: विषय सूची',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ठउपसरà¥à¤—क पनà¥à¤¨à¤¾ सभकेठदेखू]]',
+'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 ({{PLURAL:$2|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)',
+'search-section' => '(शाखा $1)',
+'search-suggest' => 'अहाठमोने अछि जे:$1',
+'search-interwiki-caption' => 'समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ परियोजना सभ',
+'search-interwiki-default' => '$1 सभटा परिणाम:',
+'search-interwiki-more' => '(आर)',
+'search-mwsuggest-enabled' => 'सलाहक संग',
+'search-mwsuggest-disabled' => 'कोनो सलाह नै',
+'search-relatedarticle' => 'समà¥à¤¬à¤¨à¥à¤§à¥€',
+'mwsuggest-disable' => 'AJAX सलाह अमानà¥à¤¯ करू',
+'searcheverything-enable' => 'सभ नामसà¥à¤¥à¤¾à¤¨ सभमे ताकू',
+'searchrelated' => 'समà¥à¤¬à¤¨à¥à¤§à¥€',
+'searchall' => 'सभटा',
+'showingresults' => "नीचाठà¤à¤¤à¤½ धरि {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम सभ}} #'''$2''' सठपà¥à¤°à¤¾à¤°à¤®à¥à¤­ भऽ कऽ।",
+'showingresultsnum' => "नीचाठदेखबै छी {{PLURAL:$3|'''1''' परिणाम|'''$3''' परिणाम सभ}} #'''$2'''सठपà¥à¤°à¤¾à¤°à¤®à¥à¤­ भऽ कऽ।",
+'showingresultsheader' => "{{PLURAL:$5|परिणाम '''$1''' à¤à¤•à¤° '''$3'''|परिणाम सभ '''$1 - $2''' à¤à¤•à¤° '''$3'''}} ठलेल '''$4'''",
+'nonefound' => "'''टिपà¥à¤ªà¤£à¥€''': मातर किछà¥à¤ निरà¥à¤§à¤¾à¤°à¤• मूलभूत रूपेठताकल जाइà¤à¥¤
+सभ सामिगà¥à¤°à¥€à¤®à¥‡ (माने मंतवà¥à¤¯ पनà¥à¤¨à¤¾, नमूना, इतà¥à¤¯à¤¾à¤¦à¤¿) तकबाले अपन उतà¥à¤•à¤‚ठामे उपसरà¥à¤— ''all:'' लगाउ , नै तठइचà¥à¤›à¤¿à¤¤ निरà¥à¤§à¤¾à¤°à¤•à¤•à¥‡à¤ उपसरà¥à¤— सन पà¥à¤°à¤¯à¥à¤•à¥à¤¤ करू।",
+'search-nonefound' => 'अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾à¤¸à¤ मेल खाइत कोनो परिणाम नै भेटल।',
+'powersearch' => 'तà¥à¤µà¤°à¤¿à¤¤ खोज',
+'powersearch-legend' => 'विशेष खोज',
+'powersearch-ns' => 'निरà¥à¤§à¤¾à¤°à¤•à¤®à¥‡ खोज',
+'powersearch-redir' => 'रसà¥à¤¤à¤¾ बदलेनक सूची',
+'powersearch-field' => 'ठलेल ताकू',
+'powersearch-togglelabel' => 'जाà¤à¤šà¥‚:',
+'powersearch-toggleall' => 'सभटा',
+'powersearch-togglenone' => 'कोनो नै',
+'search-external' => 'बाहà¥à¤¯ खोज',
+'searchdisabled' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} खोज बनà¥à¤¨ अछि।
+अहाà¤à¤• गूगलक माधà¥à¤¯à¤®à¤¸à¤ ठबीच ताकि सकै छी।
+मोन राखू जे तकर विवरणी {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} सामिगà¥à¤°à¥€ समयातीत भऽ सकैà¤à¥¤',
+
+# Quickbar
+'qbsettings' => 'तà¥à¤µà¤°à¤¿à¤¤ दृशà¥à¤¯',
+'qbsettings-none' => 'कोनो नै',
+'qbsettings-fixedleft' => 'वाम कात सटल',
+'qbsettings-fixedright' => 'दहिन दिस सटल',
+'qbsettings-floatingleft' => 'वाम कात घà¥à¤®à¥ˆà¤¤',
+'qbsettings-floatingright' => 'दहिन कात घà¥à¤®à¥ˆà¤¤',
# Preferences page
-'preferences' => 'विकलà¥à¤ª',
-'mypreferences' => 'हमर नीकगर',
+'preferences' => 'विकलà¥à¤ª',
+'mypreferences' => 'हमर खासमखास',
+'prefs-edits' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤• संखà¥à¤¯à¤¾',
+'prefsnologin' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै',
+'prefsnologintext' => 'अहाठ<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} logged in]</span> पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ विकलà¥à¤ª निरà¥à¤§à¤¾à¤°à¤£ लेल पà¥à¤°à¤¯à¥‹à¤— करू।',
+'changepassword' => 'कूटशबà¥à¤¦ बदलू',
+'prefs-skin' => 'रूप',
+'skin-preview' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
+'datedefault' => 'कोनो मोनपसंद नै',
+'prefs-datetime' => 'दिन आ तिथि',
+'prefs-personal' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ परिचय',
+'prefs-rc' => 'हालक परिवरà¥à¤¤à¤¨',
+'prefs-watchlist' => 'साकांकà¥à¤·-सूची',
+'prefs-watchlist-days' => 'साकांकà¥à¤·-सूचीमे à¤à¤¤à¥‡à¤• दिन देखाà¤à¤²:',
+'prefs-watchlist-days-max' => 'बेसीसठबेसी ७ दिन',
+'prefs-watchlist-edits' => 'बढ़ाà¤à¤² साकांकà¥à¤· सूचीमे अधिकतम परिवरà¥à¤¤à¤¨ देखाà¤à¤¬:',
+'prefs-watchlist-edits-max' => 'बेसीसठबेसी:१०००',
+'prefs-watchlist-token' => 'साकांकà¥à¤·-सूची खेप:',
+'prefs-misc' => 'आर',
+'prefs-resetpass' => 'कूटशबà¥à¤¦ बदलू',
+'prefs-email' => 'ई-पतà¥à¤° चà¥à¤¨à¤¾à¤µ',
+'prefs-rendering' => 'मà¥à¤à¤¹à¤•à¤¾à¤¨',
+'saveprefs' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू',
+'resetprefs' => 'बिन सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤•à¥‡à¤ हटाउ',
+'restoreprefs' => 'सभटा पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ चयनकेठफेरसठआनू',
+'prefs-editing' => 'समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी',
+'prefs-edit-boxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨ खिड़कीक आकार',
+'rows' => 'पाà¤à¤¤à¥€ सभ',
+'columns' => 'सà¥à¤¤à¤®à¥à¤­ सभ',
+'searchresultshead' => 'ताकू',
+'resultsperpage' => 'à¤à¤• पनà¥à¤¨à¤¾ à¤à¤¤à¥‡à¤• बेर देखल गेल:',
+'stub-threshold' => 'सीमा <a href="#" class="stub">काटल लागि</a> सà¤à¤šà¤¿à¤¯à¤¾à¤à¤² (अषà¥à¤Ÿà¤•):',
+'stub-threshold-disabled' => 'अशकà¥à¤¤ कà¤à¤²',
+'recentchangesdays' => 'आइ-कालà¥à¤¹à¤¿à¤• परिवरà¥à¤¤à¤¨à¤®à¥‡ कतेक दिन देखाà¤à¤² गेल:',
+'recentchangesdays-max' => 'बेसीसठबेसी $1 {{PLURAL:$1|दिन|दिन}}',
+'recentchangescount' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रूपेठà¤à¤¤à¥‡à¤• समà¥à¤ªà¤¾à¤¦à¤¨ देखाà¤à¤² गेल:',
+'prefs-help-recentchangescount' => 'ठमे समà¥à¤®à¤¿à¤²à¤¿à¤¤ अछि आइ-कालà¥à¤¹à¤¿à¤• परिवरà¥à¤¤à¤¨, पनà¥à¤¨à¤¾à¤• इतिहास आ वृतà¥à¤¤à¤²à¥‡à¤–',
+'prefs-help-watchlist-token' => 'ठकà¥à¤·à¥‡à¤¤à¥à¤°à¤®à¥‡ à¤à¤•à¤Ÿà¤¾ गà¥à¤ªà¥à¤¤ चाभीसठभरलापर अहाà¤à¤• साकांकà¥à¤· सूची लेल à¤à¤•à¤Ÿà¤¾ आर.à¤à¤¸.à¤à¤¸.फीडक निरà¥à¤®à¤¾à¤£ हà¤à¤¤à¥¤
+जकरा लग ठकà¥à¤·à¥‡à¤¤à¥à¤°à¤• ई चाभी छै ओ अहाà¤à¤• साकांकà¥à¤· सूचीकेठपढ़ि सकता, से à¤à¤•à¤Ÿà¤¾ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मान चà¥à¤¨à¥‚।
+à¤à¤¤à¤ à¤à¤•à¤Ÿà¤¾ अनियत रूपेठउतà¥à¤ªà¤¾à¤¦à¤¿à¤¤ मान अछि जकर अहाठपà¥à¤°à¤¯à¥‹à¤— कऽ सकै छी: $1',
+'savedprefs' => 'अहाà¤à¤• पसिनà¥à¤¨ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कà¤à¤² गेल',
+'timezonelegend' => 'समय कà¥à¤·à¥‡à¤¤à¥à¤°',
+'localtime' => 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ समà¤:',
+'timezoneuseoffset' => 'आन (संतà¥à¤²à¤¨ केनिहारक निरà¥à¤¦à¥‡à¤¶ करू)',
+'timezoneoffset' => 'संतà¥à¤²à¤¨ घटक¹:',
+'servertime' => 'वितरक समà¤:',
+'guesstimezone' => 'गवेषकक पà¥à¤°à¤¯à¥‹à¤— कऽ भरू',
+'timezoneregion-africa' => 'अफà¥à¤°à¥€à¤•à¤¾',
+'timezoneregion-america' => 'अमेरिका',
+'timezoneregion-antarctica' => 'अंटारà¥à¤•à¤Ÿà¤¿à¤•à¤¾',
+'timezoneregion-arctic' => 'आरà¥à¤•à¤Ÿà¤¿à¤•',
+'timezoneregion-asia' => 'à¤à¤¶à¤¿à¤¯à¤¾',
+'timezoneregion-atlantic' => 'अटलांटिक महासागर',
+'timezoneregion-australia' => 'ऑसà¥à¤Ÿà¥à¤°à¥‡à¤²à¤¿à¤¯à¤¾',
+'timezoneregion-europe' => 'यूरोप',
+'timezoneregion-indian' => 'हिंद महासागर',
+'timezoneregion-pacific' => 'पà¥à¤°à¤¶à¤¾à¤‚त महासागर',
+'allowemail' => 'आन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• ई-पतà¥à¤° समरà¥à¤¥ करू',
+'prefs-searchoptions' => 'खोज विकलà¥à¤ª',
+'prefs-namespaces' => 'नामसà¥à¤¥à¤¾à¤¨ सभ',
+'defaultns' => 'नै तठठनामसà¥à¤¥à¤¾à¤¨ सभमे ताकू:',
+'default' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤',
+'prefs-files' => 'संचिका सभ',
+'prefs-custom-css' => 'खास सी.à¤à¤¸.à¤à¤¸.',
+'prefs-custom-js' => 'खास जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ',
+'prefs-common-css-js' => 'सभ रूप लेल साà¤à¥€ सी.à¤à¤¸.à¤à¤¸./ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ:',
+'prefs-reset-intro' => 'अहाठठपनà¥à¤¨à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤— अपन विकलà¥à¤ªà¤•à¥‡à¤ पूरà¥à¤µà¤¨à¤¿à¤µà¤¿à¤·à¥à¤Ÿ रूपेठजाल पà¥à¤¨à¤°à¥à¤¨à¤¿à¤§à¤¾à¤°à¤¿à¤¤ करबा लेल कऽ सकै छी।
+ई बदलल नै जा सकैà¤à¥¤',
+'prefs-emailconfirm-label' => 'ई-पतà¥à¤° पà¥à¤·à¥à¤Ÿà¤¿:',
+'prefs-textboxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨ खिड़कीक आकार',
+'youremail' => 'ई-पतà¥à¤°:',
+'username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®:',
+'uid' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पहिचान:',
+'prefs-memberingroups' => '{{PLURAL:$1|संवरà¥à¤—|संवरà¥à¤— सभ}}:à¤à¤•à¤° सदसà¥à¤¯',
+'prefs-registration' => 'पंजीकरणक समà¤:',
+'yourrealname' => 'असली नाम:',
+'yourlanguage' => 'भाषा:',
+'yournick' => 'नव पहिचान:',
+'prefs-help-signature' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ सभपर टिपà¥à¤ªà¤£à¥€ "<nowiki>~~~~</nowiki>" दà¥à¤µà¤¾à¤°à¤¾ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤¿à¤¤ हà¥à¤…ठजे अहाà¤à¤• हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° आ समय-संकेतसठमेल खाà¤à¥¤',
+'badsig' => 'अमानà¥à¤¯ पà¥à¤°à¤¾à¤°à¤®à¥à¤­à¤¿à¤• पहिचान।
+à¤à¤š.टी.à¤à¤®.à¤à¤².चेनà¥à¤¹ जाà¤à¤šà¥‚।',
+'badsiglength' => 'अहाà¤à¤• हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° बडà¥à¤¡ पैघ अछि।
+ई $1 सठबेसी नै हेबाक चाही {{PLURAL:$1|वरà¥à¤£|वरà¥à¤£}} पैघ।',
+'yourgender' => 'पà¥à¤°à¥à¤– आकि सà¥à¤¤à¥à¤°à¥€',
+'gender-unknown' => 'अजà¥à¤žà¤¾à¤¤',
+'gender-male' => 'पà¥à¤°à¥à¤–',
+'gender-female' => 'महिला',
+'prefs-help-gender' => 'वैकलà¥à¤ªà¤¿à¤•: तंतà¥à¤°à¤¾à¤‚श दà¥à¤µà¤¾à¤°à¤¾ लिंग निरपेकà¥à¤· समà¥à¤¬à¥‹à¤§à¤¨ लेल पà¥à¤°à¤¯à¥à¤•à¥à¤¤à¥¤
+ई सूचना सारà¥à¤µà¤œà¤¨à¤¿à¤• हà¤à¤¤à¥¤',
+'email' => 'ई-पतà¥à¤°',
+'prefs-help-realname' => 'मूल नाम वैकलà¥à¤ªà¤¿à¤• अछि।
+जठअहाठà¤à¤•à¤°à¤¾ देबा लेल पà¥à¤°à¤¯à¥‹à¤— करै छी, ई अहाà¤à¤•à¥‡à¤ काजक शà¥à¤°à¥‡à¤¯ देबा लेल à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² जाà¤à¤¤à¥¤',
+'prefs-help-email-required' => 'ई-पतà¥à¤° संकेत जरूरी अछि।',
+'prefs-info' => 'नà¥à¤¯à¥‚नतम जानकारी',
+'prefs-i18n' => 'अंतरà¥à¤°à¤¾à¤·à¥à¤Ÿà¥à¤°à¤¿à¤¯à¤•à¤°à¤£',
+'prefs-signature' => 'चेनà¥à¤¹à¤¾à¤¸à¥€',
+'prefs-dateformat' => 'तिथिक बगेबानी',
+'prefs-timeoffset' => 'समठसंशोधक',
+'prefs-advancedediting' => 'विशिषà¥à¤Ÿ विकलà¥à¤ª सभ',
+'prefs-advancedrc' => 'विशिषà¥à¤Ÿ विकलà¥à¤ª सभ',
+'prefs-advancedrendering' => 'विशिषà¥à¤Ÿ विकलà¥à¤ª सभ',
+'prefs-advancedsearchoptions' => 'विशिषà¥à¤Ÿ विकलà¥à¤ª सभ',
+'prefs-advancedwatchlist' => 'विशिषà¥à¤Ÿ विकलà¥à¤ª सभ',
+'prefs-displayrc' => 'दृशà¥à¤¯ विकलà¥à¤ª सभ',
+'prefs-displaysearchoptions' => 'दृशà¥à¤¯ विकलà¥à¤ª सभ',
+'prefs-displaywatchlist' => 'दृशà¥à¤¯ विकलà¥à¤ª सभ',
+'prefs-diffs' => 'अनà¥à¤¤à¤° निरà¥à¤§à¤¾à¤°à¤• सभ',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ई-पतà¥à¤° संकेत मानà¥à¤¯ बà¥à¤à¤¾à¤‡à¤¤ अछि',
+'email-address-validity-invalid' => 'à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेत लिखू',
+
+# User rights
+'userrights' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारक पà¥à¤°à¤¬à¤¨à¥à¤§à¤¨',
+'userrights-lookup-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभक पà¥à¤°à¤¬à¤¨à¥à¤§ करू',
+'userrights-user-editname' => 'à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® लिखू:',
+'editusergroup' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'editinguser' => "'''[[User:$1|$1]]''' क पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार बदलल जा रहल अछि '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'userrights-editusergroup' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'saveusergroups' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभकेठसà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू',
+'userrights-groupsmember' => 'क सदसà¥à¤¯:',
+'userrights-groupsmember-auto' => 'क जानल सदसà¥à¤¯:',
+'userrights-groups-help' => 'अहाठठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• वरà¥à¤—केठबदलि सकै छी:
+* à¤à¤•à¤Ÿà¤¾ निशान लगाà¤à¤² बकà¥à¤¸à¤¾ माने पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ ओइ वरà¥à¤—मे अछि।
+* à¤à¤•à¤Ÿà¤¾ बिन निशान लगाà¤à¤² माने पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ ओइ वरà¥à¤—मे नै अछि।
+* ई * देखबैठजे अहाठवरà¥à¤—केठà¤à¤• बेर देलाक बाद हटा नै सकै छी, आ à¤à¤•à¤° उलट सेहो ठीक अछि।',
+'userrights-reason' => 'कारण:',
+'userrights-no-interwiki' => 'अहाà¤à¤•à¥‡à¤ दोसर विकीपर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारकेठबदलबाक अधिकार नै अछि।',
+'userrights-nodatabase' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ $1 नै अछि वा सà¥à¤¥à¤¾à¤¨à¥€à¤¯ नै अछि।',
+'userrights-nologin' => 'अहाठ[[Special:UserLogin|समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶]] पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार देबा लेल संचालक खातासठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू।',
+'userrights-notallowed' => 'अहाà¤à¤• खाता दोसराकेठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार नै दै छै।',
+'userrights-changeable-col' => 'वरà¥à¤— जे अहाठबदलि सकै छी',
+'userrights-unchangeable-col' => 'वरà¥à¤— जे अहाठनै बदलि सकै छी',
+
+# Groups
+'group' => 'वरà¥à¤—:',
+'group-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'group-autoconfirmed' => 'सà¥à¤µà¤¤à¤ƒà¤…नà¥à¤®à¥‹à¤¦à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'group-bot' => 'सà¥à¤µà¤šà¤¾à¤²à¤•',
+'group-sysop' => 'माइनजन',
+'group-bureaucrat' => 'अधिकारी',
+'group-suppress' => 'नजरिपर नै आà¤à¤²',
+'group-all' => '(सभ)',
+
+'group-user-member' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'group-autoconfirmed-member' => 'सà¥à¤µà¤¤à¤ƒà¤…नà¥à¤®à¥‹à¤¦à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'group-bot-member' => 'सà¥à¤µà¤šà¤¾à¤²à¤•',
+'group-sysop-member' => 'माइनजन',
+'group-bureaucrat-member' => 'अधिकारी',
+'group-suppress-member' => 'नजरिपर नै आà¤à¤²',
+
+'grouppage-user' => '{{ns:project}}:पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'grouppage-autoconfirmed' => '{{ns:project}}:सà¥à¤µà¤¤à¤ƒà¤…नà¥à¤®à¥‹à¤¦à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'grouppage-bot' => '{{ns:project}}:सà¥à¤µà¤šà¤¾à¤²à¤• सभ',
+'grouppage-sysop' => '{{ns:project}}:माइनजन सभ',
+'grouppage-bureaucrat' => '{{ns:project}}:अधिकारी सभ',
+'grouppage-suppress' => '{{ns:project}}:नजरिपर नै आà¤à¤²',
+
+# Rights
+'right-read' => 'पनà¥à¤¨à¤¾ सभ पढ़ू',
+'right-edit' => 'पनà¥à¤¨à¤¾ सभ समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'right-createpage' => 'पनà¥à¤¨à¤¾ सभ बनाउ (जे वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ नै हà¥à¤…à¤)',
+'right-createtalk' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ सभ बनाउ',
+'right-createaccount' => 'नव पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता सभ बनाउ',
+'right-minoredit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सभकेठमामूली चिनà¥à¤¹à¤¿à¤¤ करू',
+'right-move' => 'पनà¥à¤¨à¤¾ सभ घसकाउ',
+'right-move-subpages' => 'पनà¥à¤¨à¤¾ सभकेठउपपनà¥à¤¨à¤¾ सभक संग घसकाउ',
+'right-move-rootuserpages' => 'मूल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾ सभ घसकाउ',
+'right-movefile' => 'संचिका सभकेठघसकाउ',
+'right-suppressredirect' => 'पनà¥à¤¨à¤¾ घसकेबा काल मूल पनà¥à¤¨à¤¾ सभसठलागि सभ नै बनाउ',
+'right-upload' => 'संचिका सभ उपारोपित करू',
+'right-reupload' => 'वरà¥à¤¤à¤®à¤¾à¤¨ संचिका सभक पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करू',
+'right-reupload-own' => 'अपन उपारोपित पनà¥à¤¨à¤¾ सभक पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करू',
+'right-reupload-shared' => 'शà¥à¤°à¤µà¥à¤¯-दृशà¥à¤¯ साà¤à¥€ बखारीक फाइलक पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न सà¥à¤¥à¤¾à¤¨à¥€à¤¯ रूपेठकरू।',
+'right-upload_by_url' => 'सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेतसठसंचिका उपारोपित करू',
+'right-purge' => 'जालक उपसà¥à¤®à¥ƒà¤¤à¤¿à¤•à¥‡à¤ बिना सà¥à¤µà¥€à¤•à¥ƒà¤¤à¤¿à¤• पनà¥à¤¨à¤¾à¤• लेल खतम करू।',
+'right-autoconfirmed' => 'अरà¥à¤¦à¥à¤§-संरकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾ सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू।',
+'right-bot' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤• रूपमे देखल जाà¤',
+'right-nominornewtalk' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾à¤ªà¤° मामूली समà¥à¤ªà¤¾à¤¦à¤¨ नव संदेश संसूचक नै आनैà¤',
+'right-apihighlimits' => 'à¤.पी.आइ. अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾à¤®à¥‡ पैघ सीमाक पà¥à¤°à¤¯à¥‹à¤— करू',
+'right-writeapi' => 'लेखà¥à¤¯ à¤.पी.आइ.क पà¥à¤°à¤¯à¥‹à¤—',
+'right-delete' => 'पनà¥à¤¨à¤¾ सभकेठमेटाउ',
+'right-bigdelete' => 'बेशी इतिहास बला पनà¥à¤¨à¤¾ सभकेठमेटाउ',
+'right-deleterevision' => 'निरà¥à¤§à¤¾à¤°à¤¿à¤¤ संशोधित पनà¥à¤¨à¤¾ मेटाउ आ फेरसठआनू',
+'right-deletedhistory' => 'मेटाà¤à¤² इतिहास पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ देखू, बिना लागिक पाठक',
+'right-deletedtext' => 'मेटाà¤à¤² पाठ आ दूटा मेटाà¤à¤² संशोधनक बीचक परिवरà¥à¤¤à¤¨ देखू',
+'right-browsearchive' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾ सभकेठताकू',
+'right-undelete' => 'पनà¥à¤¨à¤¾ फेरसठआनू',
+'right-suppressrevision' => 'संचालकसठनà¥à¤•à¤¾à¤à¤² संशोधनकेठपà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤¿à¤¤ करू आ फेरसठआनू',
+'right-suppressionlog' => 'वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त वृतà¥à¤¤à¤²à¥‡à¤– देखू',
+'right-block' => 'दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤ रोकू',
+'right-blockemail' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° पठेबासठरोकू',
+'right-hideuser' => 'à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू, लोकसठà¤à¤•à¤°à¤¾ नà¥à¤•à¤¾ कऽ',
+'right-ipblock-exempt' => 'अनिकेत पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§, सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ आ परिकà¥à¤·à¥‡à¤¤à¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤•à¥‡à¤ नै मानू',
+'right-proxyunbannable' => 'दोसराइतक सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤•à¥‡à¤ नै मानू',
+'right-unblockself' => 'सà¥à¤µà¤¯à¤‚केठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¤ हटाउ',
+'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° बदलू आ संरकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
+'right-editprotected' => 'संरकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू (बिना तराउपड़ी सà¥à¤°à¤•à¥à¤·à¤¾à¤•)',
+'right-editinterface' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ मधà¥à¤¯à¤¸à¥à¤¥à¤• समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'right-editusercssjs' => 'दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• सी.à¤à¤¸.à¤à¤¸. आ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ संचिका सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'right-editusercss' => 'दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभक सी.à¤à¤¸.à¤à¤¸. संचिका सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'right-edituserjs' => 'दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ संचिका सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'right-rollback' => 'कृपा कऽ अनà¥à¤¤à¤¿à¤® पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ सभकेठपà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¿à¤¤ करू जे à¤à¤• खास पनà¥à¤¨à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ केलनà¥à¤¹à¤¿',
+'right-markbotedits' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¿à¤¤ समà¥à¤ªà¤¾à¤¦à¤¨ सभकेठसà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ समà¥à¤ªà¤¾à¤¦à¤¨ देखाउ',
+'right-noratelimit' => 'दरक सीमासठपà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ नै',
+'right-import' => 'दोसर विकीसठपनà¥à¤¨à¤¾ लिअ',
+'right-importupload' => 'पनà¥à¤¨à¤¾à¤¸à¤­à¤•à¥‡à¤ संचिका उपारोपणसठआनू',
+'right-patrol' => 'दोसराक समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ संचालित देखाउ',
+'right-autopatrol' => 'अपन समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठसंचालित देखाउ',
+'right-patrolmarks' => 'हालक परिवरà¥à¤¤à¤¨à¤®à¥‡ संचालन चेनà¥à¤¹ देखू',
+'right-unwatchedpages' => 'बिना संचालित पनà¥à¤¨à¤¾ सभक सूचीकेठदेखू',
+'right-trackback' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ दिअ',
+'right-mergehistory' => 'पनà¥à¤¨à¤¾à¤• इतिहास सभकेठमिजà¥à¤à¤° करू',
+'right-userrights' => 'सभटा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारकेठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
+'right-userrights-interwiki' => 'दोसर विकीपर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'right-siteadmin' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू आ फेर पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
+'right-reset-passwords' => 'दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• कूटशबà¥à¤¦ फेरसठबनाउ',
+'right-override-export-depth' => '५ परत धरि जा पनà¥à¤¨à¤¾ सभ निरà¥à¤¯à¤¾à¤¤, जइमे लागिबला पनà¥à¤¨à¤¾ सभ शामिल अछि, करू।',
+'right-sendemail' => 'ई-पतà¥à¤° दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लोकनिकेठपठाउ',
+
+# User rights log
+'rightslog' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार वृतà¥à¤¤à¤²à¥‡à¤–',
+'rightslogtext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार परिवरà¥à¤¤à¤¨ सभक वृतलेख छी।',
+'rightslogentry' => 'वरà¥à¤—क सदसà¥à¤¯à¤¤à¤¾ बदलल गेल $1 लेल $2 सठ$3',
+'rightsnone' => '(कोनो नै)',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'ई पनà¥à¤¨à¤¾ पढ़ू',
+'action-edit' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
+'action-createpage' => 'पनà¥à¤¨à¤¾ सभ बनाउ',
+'action-createtalk' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ सभ बनाउ',
+'action-createaccount' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता बनाउ',
+'action-minoredit' => 'ठसमà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ मामूली कहू',
+'action-move' => 'ठपृषà¥à¤ à¤•à¥‡à¤ घसकाउ',
+'action-move-subpages' => 'ठपनà¥à¤¨à¤¾ आ à¤à¤•à¤° उपपनà¥à¤¨à¤¾à¤•à¥‡à¤ घसकाउ',
+'action-move-rootuserpages' => 'मूल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾ सभ घसकाउ',
+'action-movefile' => 'ठसंचिकाकेठघसकाउ',
+'action-upload' => 'ठसंचिकाकेठउपारोपित करू',
+'action-reupload' => 'ठसंचिकाक पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करू',
+'action-reupload-shared' => 'ठसंचिकाकेठसाà¤à¥€ बखारीमे नजरि नै दिअ',
+'action-upload_by_url' => 'आइ संचिकाकेठसारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेतसठउपारोपित करू',
+'action-writeapi' => 'लेखà¥à¤¯ à¤.पी.आइ.क पà¥à¤°à¤¯à¥‹à¤— करू',
+'action-delete' => 'ई पनà¥à¤¨à¤¾ मेटाउ',
+'action-deleterevision' => 'ई संशोधन मेटाउ',
+'action-deletedhistory' => 'ठपनà¥à¤¨à¤¾à¤• मेटाà¤à¤²à¤¬à¤²à¤¾ इतिहास देखू',
+'action-browsearchive' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾ सभकेठताकू',
+'action-undelete' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ फेरसठआनू',
+'action-suppressrevision' => 'ठनà¥à¤•à¤¾à¤à¤² संशोधनकेठपà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤¿à¤¤ आ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करू',
+'action-suppressionlog' => 'ठवà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त वृतà¥à¤¤à¤²à¥‡à¤–केठदेखू',
+'action-block' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤ रोकू',
+'action-protect' => 'ठपनà¥à¤¨à¤¾à¤• सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° बदलू',
+'action-import' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ दोसर विकीसठआनू',
+'action-importupload' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ संचिका उपारोपणसठआनू',
+'action-patrol' => 'दोसराक समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ संचालित देखाउ',
+'action-autopatrol' => 'अपन समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ संचालित देखाउ',
+'action-unwatchedpages' => 'बिना संचालित पनà¥à¤¨à¤¾ सभक सूचीकेठदेखू',
+'action-trackback' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ दिअ',
+'action-mergehistory' => 'पनà¥à¤¨à¤¾à¤• इतिहासकेठमिजà¥à¤à¤° करू',
+'action-userrights' => 'सभटा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारकेठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
+'action-userrights-interwiki' => 'दोसर विकीपर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'action-siteadmin' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू आ फेर पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¥à¤¤à¤¨|परिवरà¥à¤¤à¥à¤¤à¤¨}}',
-'rcnote' => "नीचाठ$3 तक पहिलà¥à¤•à¤¾ {{PLURAL:$2|'''१''' दिनमे भेल|'''$2''' दिनमे भेल}} अंतिम $1 बदलाव {{PLURAL:$1|देल अछि|देल अछि}}।",
-'rcshowhideminor' => '$1 अलà¥à¤ª संपादन',
-'rclinks' => 'देखाऊ अंतिम $1 परिवरà¥à¤¤à¥à¤¤à¤¨ अंतिम $2 दिनमे<br />$3',
-'diff' => 'अंतर',
-'hist' => 'इति.',
-'hide' => 'नà¥à¤•à¤¾à¤Š',
-'minoreditletter' => 'अ',
-'newpageletter' => 'न',
-'boteditletter' => 'ब',
+'nchanges' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¥à¤¤à¤¨|परिवरà¥à¤¤à¥à¤¤à¤¨}}',
+'recentchanges' => 'लगक परिवरà¥à¤¤à¤¨ सभ',
+'recentchanges-legend' => 'नव परिवरà¥à¤¤à¤¨ सभक विकलà¥à¤ª सभ',
+'recentchangestext' => 'ठपनà¥à¤¨à¤¾à¤ªà¤° विकीमे भेल सभसठअदà¥à¤¯à¤¤à¤¨ परिवरà¥à¤¤à¤¨à¤ªà¤° नजरि राखू।',
+'recentchanges-feed-description' => 'ठसूचना-तंतà¥à¤°à¤¾à¤‚शमे विकीमे भेल सभसठलगक परिवरà¥à¤¤à¤¨ ताकू',
+'recentchanges-label-newpage' => 'ई समà¥à¤ªà¤¾à¤¦à¤¨ à¤à¤•à¤Ÿà¤¾ नव पनà¥à¤¨à¤¾à¤• निरà¥à¤®à¤¾à¤£ केलक।',
+'recentchanges-label-minor' => 'ई à¤à¤•à¤Ÿà¤¾ लघॠसमà¥à¤ªà¤¾à¤¦à¤¨ छी',
+'recentchanges-label-bot' => 'ई समà¥à¤ªà¤¾à¤¦à¤¨ यांतà¥à¤°à¤¿à¤• छल।',
+'recentchanges-label-unpatrolled' => 'ठसमà¥à¤ªà¤¾à¤¦à¤¨à¤• पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ अखन धरि नै कà¤à¤² गेल अछि।',
+'rcnote' => "$5, $4 तक पहिलà¥à¤•à¤¾ {{PLURAL:$2|'''१''' दिन|'''$2''' दिन}}मे {{PLURAL:$1|भेल '''१''' अंतिम परिवरà¥à¤¤à¤¨ à¤à¤¨à¤¾ अछि| भेल '''$1''' परिवरà¥à¤¤à¤¨ à¤à¤¨à¤¾ अछि}}।",
+'rcnotefrom' => "नीचाà¤à¤®à¥‡ '''$2''' सठभेल परिवरà¥à¤¤à¤¨ अछि ('''$1''' धरि देखाà¤à¤²)।",
+'rclistfrom' => '$1 सठशà¥à¤°à¥‚ भेल नव परिवरà¥à¤¤à¤¨ देखू',
+'rcshowhideminor' => '$1 अलà¥à¤ª संपादन',
+'rcshowhidebots' => '$1 सà¥à¤µà¤šà¤¾à¤²à¤• सभ',
+'rcshowhideliu' => '$1 समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'rcshowhideanons' => '$1 अजà¥à¤žà¤¾à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'rcshowhidepatr' => '$1 संचालित समà¥à¤ªà¤¾à¤¦à¤¨',
+'rcshowhidemine' => '$1 हमर समà¥à¤ªà¤¾à¤¦à¤¨ सभ',
+'rclinks' => 'देखाऊ अंतिम $1 परिवरà¥à¤¤à¥à¤¤à¤¨ अंतिम $2 दिनमे<br />$3',
+'diff' => 'अंतर',
+'hist' => 'इति.',
+'hide' => 'नà¥à¤•à¤¾à¤Š',
+'show' => 'देखाउ',
+'minoreditletter' => 'अ',
+'newpageletter' => 'न',
+'boteditletter' => 'ब',
+'number_of_watching_users_pageview' => '[$1 देखै अछि {{PLURAL:$1|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ}}]',
+'rc_categories' => 'संवरà¥à¤— सीमित ("|" सठहटाउ)',
+'rc_categories_any' => 'कोनो',
+'newsectionsummary' => '/* $1 */ नव संवरà¥à¤—',
+'rc-enhanced-expand' => 'वरà¥à¤£à¤¨ देखाउ (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाही)',
+'rc-enhanced-hide' => 'वरà¥à¤£à¤¨ नà¥à¤•à¤¾à¤‰',
# Recent changes linked
-'recentchangeslinked' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
-'recentchangeslinked-feed' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
-'recentchangeslinked-toolbox' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
-'recentchangeslinked-title' => '"$1" मे भेल परिवरà¥à¤¤à¤¨',
+'recentchangeslinked' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
+'recentchangeslinked-feed' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
+'recentchangeslinked-toolbox' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
+'recentchangeslinked-title' => '"$1" मे भेल परिवरà¥à¤¤à¤¨',
+'recentchangeslinked-noresult' => 'ठकालमे लागिबला पनà¥à¤¨à¤¾ सभमे कोनो परिवरà¥à¤¤à¤¨ नै भेल।',
+'recentchangeslinked-summary' => "ई विशेष पनà¥à¤¨à¤¾à¤¸à¤ समà¥à¤¬à¤¦à¥à¤§ पनà¥à¤¨à¤¾ सभमे (आकि कोनो विशेष वरà¥à¤—क समूहमे) भेल परिवरà¥à¤¤à¤¨à¤• सूची छी ।
+[[Special:Watchlist|your watchlist]] पर पनà¥à¤¨à¤¾à¤¸à¤­ '''गाढ़''' अछि।",
+'recentchangeslinked-page' => 'पनà¥à¤¨à¤¾à¤• नाम',
+'recentchangeslinked-to' => 'देल पनà¥à¤¨à¤¾à¤• समà¥à¤¬à¤¨à¥à¤§à¥€ पनà¥à¤¨à¤¾à¤®à¥‡ परिवरà¥à¤¤à¤¨ देखाउ',
# Upload
-'upload' => 'फाइल अपलोड करू',
-'uploadbtn' => 'फाइल अपलोड',
-'uploadedimage' => 'अपलोड भेल "[[$1]]"',
+'upload' => 'फाइल अपलोड करू',
+'uploadbtn' => 'फाइल अपलोड',
+'reuploaddesc' => 'उपारोपण रदà¥à¤¦ करू आ उपारोपण आवेदन-पतà¥à¤°à¤ªà¤° घà¥à¤°à¥‚।',
+'upload-tryagain' => 'संशोधित संचिका वरà¥à¤£à¤¨ दिअ',
+'uploadnologin' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै',
+'uploadnologintext' => 'अहाठ[[Special:UserLogin|समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤]] संचिका उपारोपित करबा लेल।',
+'upload_directory_missing' => 'उपारोपà¥à¤¯ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ ($1) हेराà¤à¤² अछि आ जालवितरक दà¥à¤µà¤¾à¤°à¤¾ नै बनाà¤à¤² जा सकैà¤à¥¤',
+'upload_directory_read_only' => 'उपारोपà¥à¤¯ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ ($1) जालवितरक दà¥à¤µà¤¾à¤°à¤¾ लिखबा योगà¥à¤¯ नै अछि।',
+'uploaderror' => 'उपारोपण भà¥à¤°à¤®',
+'upload-recreate-warning' => "'''चेतौनी: ठनामक संचिका मेटा वा हटा देल गेल अछि।'''",
+'uploadtext' => "निचà¥à¤•à¥à¤•à¤¾ पतà¥à¤° संचिका उपारोपित करबा लेल पà¥à¤°à¤¯à¥‹à¤— करू।
+पहिलà¥à¤•à¤¾ उपारोपित संचिका देखबा वा तकबा लेल जाउ [[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|alt text]]</nowiki></tt>''' २०० चितà¥à¤°à¤¾à¤£à¥ चाकर पà¥à¤°à¤•à¤Ÿà¤¨ à¤à¤•à¤Ÿà¤¾ बकà¥à¤¶à¤¾à¤®à¥‡ \"वैकलà¥à¤ªà¤¿à¤• पाठ\" वामा कात वरà¥à¤£à¤¨à¤• रूपमे लिखल पà¥à¤°à¤¯à¥‹à¤— करू
+* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' बिना संचिका देखेने सोà¤à¥‡ संचिकाक लागि देब",
+'upload-permitted' => 'मानà¥à¤¯ संचिका पà¥à¤°à¤•à¤¾à¤°:$1 ।',
+'upload-preferred' => 'मोनपसिनà¥à¤¨ संचिका पà¥à¤°à¤•à¤¾à¤°:$1 ।',
+'upload-prohibited' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ संचिका पà¥à¤°à¤•à¤¾à¤°:$1 ।',
+'uploadlog' => 'उपारोपण वृतà¥à¤¤à¤²à¥‡à¤–',
+'uploadlogpage' => 'उपारोपण वृतà¥à¤¤à¤²à¥‡à¤–',
+'uploadlogpagetext' => 'नीचाठअदà¥à¤¯à¤¤à¤¨ संचिका उपारोपणक वरà¥à¤£à¤¨ अछि।
+देखू [[Special:NewFiles|नव संचिकाक बखारी]] बेसी सà¥à¤ªà¤·à¥à¤Ÿ समà¥à¤šà¥à¤šà¤¾ दृशà¥à¤¯ लेल।',
+'filename' => 'संचिकानाम',
+'filedesc' => 'संकà¥à¤·à¥‡à¤ª',
+'fileuploadsummary' => 'संकà¥à¤·à¥‡à¤ª:',
+'filereuploadsummary' => 'संचिका परिवरà¥à¤¤à¤¨:',
+'filestatus' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤°à¤• सà¥à¤¥à¤¿à¤¤à¤¿:',
+'filesource' => 'मूल:',
+'uploadedfiles' => 'उपारोपित संचिका सभ',
+'ignorewarning' => 'चेतौनीपर धà¥à¤¯à¤¾à¤¨ नै दिअ आ संचिका कोनो रूपेठसंरकà¥à¤·à¤¿à¤¤ करू',
+'ignorewarnings' => 'कोनो चेतौनीपर धà¥à¤¯à¤¾à¤¨ नै दिअ',
+'minlength1' => 'संचिका नाम सभ à¤à¤• वरà¥à¤£à¤¸à¤ कम नै हà¥à¤…à¤',
+'illegalfilename' => '"$1" संचिकानाममे वरà¥à¤£ अछि जे पनà¥à¤¨à¤¾ शीरà¥à¤·à¤• लेल मानà¥à¤¯ नै अछि।
+कृपा कऽ संचिकाक नाम बदलू आ फेरसठउपारोपित करू।',
+'badfilename' => 'संचिकानाम बदलि कऽ "$1" कà¤à¤² गेल।',
+'filetype-badmime' => 'माइम पà¥à¤°à¤•à¤¾à¤° "$1" सन संचिका उपारोपण लेल मानà¥à¤¯ नै अछि।',
+'filetype-bad-ie-mime' => 'à¤à¤•à¤°à¤¾ उपारोपित नै कऽ सकै छी कारण इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ à¤à¤•à¥à¤¸à¤ªà¥à¤²à¥‹à¤°à¤° à¤à¤•à¤°à¤¾ "$1" बà¥à¤à¤¤, जे अमानà¥à¤¯ आ खतरासठसमà¥à¤­à¤¾à¤µà¤¿à¤¤ संचिका पà¥à¤°à¤•à¤¾à¤° अछि।',
+'filetype-unwanted-type' => "'''\".\$1\"''' à¤à¤• पà¥à¤°à¤•à¤¾à¤°à¤• बिना मतलबक संचिका पà¥à¤°à¤•à¤¾à¤° अछि।
+à¤à¤•à¤° बदला {{PLURAL:\$3|संचिका पà¥à¤°à¤•à¤¾à¤° अछि|संचिका पà¥à¤°à¤•à¤¾à¤° सभ अछि}} \$2 ।",
+'filetype-missing' => 'ठफाइलमे कोनो विसà¥à¤¤à¤¾à¤° नै अछि (जेना ".jpg")।',
+'empty-file' => 'अहाà¤à¤• दà¥à¤µà¤¾à¤°à¤¾ देल संचिका रिकà¥à¤¤ अछि।',
+'file-too-large' => 'अहाà¤à¤• दà¥à¤µà¤¾à¤°à¤¾ देल संचिका बडà¥à¤¡ पैघ अछि।',
+'filename-tooshort' => 'ई संचिका नाम बड पैघ अछि |',
+'filetype-banned' => 'ठतरहक संचिका पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित अछि।',
+'verification-error' => 'ई संचिका संचिका-सतà¥à¤¯à¤¾à¤ªà¤¨ नै दऽ सकल।',
+'hookaborted' => 'संशोधन जे अहाठकरऽ चाहलौं से विसà¥à¤¤à¤¾à¤° नोकसी दà¥à¤µà¤¾à¤°à¤¾ खतम कऽ देल गेल।',
+'illegal-filename' => 'ठतरहक संचिका नाम अमानà¥à¤¯ अछि।',
+'overwrite' => 'वरà¥à¤¤à¤®à¤¾à¤¨ संचिकाकेठअधिलेखित केनाइ मानà¥à¤¯ नै अछि।',
+'unknown-error' => 'à¤à¤•à¤Ÿà¤¾ अबूठभà¥à¤°à¤® आà¤à¥¤',
+'tmp-create-error' => 'असà¥à¤¥à¤¾à¤¯à¥€ संचिका नै बना सकल।',
+'tmp-write-error' => 'असà¥à¤¥à¤¾à¤¯à¥€ संचिका लिखबा काल भà¥à¤°à¤®à¥¤',
+'large-file' => 'ई सà¥à¤à¤¾à¤µ अछि जे संचिका $1 सठपैघ नै हà¥à¤…à¤;
+ई संचिका अछि $2 ।',
+'largefileserver' => 'वितरक दà¥à¤µà¤¾à¤°à¤¾ धारण करैबला कà¥à¤·à¤®à¤¤à¤¾à¤¸à¤ पैघ ई संचिका अछि।',
+'emptyfile' => 'जे संचिका अहाठउपारोपित केलौं से लगै छल जे रिकà¥à¤¤ रहà¤à¥¤
+ई संचिकानाममे गलत तंकणक कारण समà¥à¤­à¤µà¤¤à¤ƒ भेल हà¤à¤¤à¥¤
+कृपा कऽ जाà¤à¤šà¥‚ जे की अहाठठसंचिकाकेठठीके उपारोपित करठचाहै छी।',
+'fileexists' => "ठनामà¥à¤¨à¤¾ à¤à¤•à¤Ÿà¤¾ संचिका पहिनहियेसठअछि, कृपा कऽ जाà¤à¤šà¥‚ '''<tt>[[:$1]]</tt>''' जठअहाठदà¥à¤µà¤¿à¤§à¤¾à¤®à¥‡ छी जे अहाठà¤à¤•à¤°à¤¾ बदलऽ चाहै छी वा नै।
+[[$1|thumb]]",
+'filepageexists' => "ठसंचिकाक वरà¥à¤£à¤¨ पनà¥à¤¨à¤¾ पहिनहिये '''<tt>[[:$1]]</tt>''' पर बना देल गेल, मà¥à¤¦à¤¾ ठनामसठकोनो संचिका अखन नै अछि।
+जे संकà¥à¤·à¥‡à¤ª अहाठदऽ रहल छी से वरà¥à¤£à¤¨ पनà¥à¤¨à¤¾à¤ªà¤° नै आà¤à¤¤à¥¤
+अहाà¤à¤• संकà¥à¤·à¥‡à¤ª ओतठआबठतै लेल अहाà¤à¤•à¥‡à¤ ओकरा अपनेसठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करठपड़त।
+[[$1|thumb]]",
+'fileexists-extension' => "ठनामसठà¤à¤•à¤Ÿà¤¾ संचिका पहिनहियेसठअछि:[[$2|thumb]]
+* उपारोपित संचिकाक नाम: '''<tt>[[:$1]]</tt>'''
+* अखन सà¥à¤¥à¤¿à¤¤ फाइलक नाम: '''<tt>[[:$2]]</tt>'''
+कृपा कऽ दोसर नाम चà¥à¤¨à¥‚।",
+'fileexists-thumbnail-yes' => "ई संचिका लगैठजे ''(लघà¥à¤šà¤¿à¤¤à¥à¤°)'' क छोट आकारक चितà¥à¤° अछि।
+[[$1|thumb]]
+कृपा कऽ ठसंचिकाकेठजाà¤à¤šà¥‚ '''<tt>[[:$1]]</tt>''' ।
+जठजाà¤à¤šà¤² संचिका मूल संचिकाक वà¤à¤¹ चितà¥à¤° छी तठà¤à¤•à¤Ÿà¤¾ दोसर लघà¥à¤šà¤¿à¤¤à¥à¤° उपारोपित करबाक आवशà¥à¤¯à¤•à¤¤à¤¾ नै अछि।",
+'file-thumbnail-no' => "संचिकानाम शà¥à¤°à¥‚ होइठ'''<tt>$1</tt>''' सà¤à¥¤
+लगैठजे ई छोट आकारक ''(लघà¥à¤šà¤¿à¤¤à¥à¤°)'' क चितà¥à¤° अछि।
+जठअहाठलग पूरà¥à¤£ आननà¥à¤¤à¤°à¥à¤¯à¤• चितà¥à¤° अछि तठसे उपारोपित करू, नै तठसंचिकानाम बदलू।",
+'fileexists-forbidden' => 'ठनामक à¤à¤•à¤Ÿà¤¾ संचिका पहिनहियेसठअछि, आ फेरसठओ पà¥à¤¨à¤°à¥à¤²à¥‡à¤–ित नै कà¤à¤² जा सकैà¤à¥¤
+जठअहाठतैयो अपन संचिका उपारोपित करठचाहै छी तठकृपा कऽ पाछाठजाउ आ à¤à¤•à¤Ÿà¤¾ नव नाम चà¥à¤¨à¥‚।
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'ठनामसठà¤à¤•à¤Ÿà¤¾ संचिका साà¤à¥€ संचिका बखारीमे पहिनहियेसठअछि।
+जठअहाठअखनो अपन संचिका उपारोपित करठचाहै छी, कृपा कऽ पाछाठजाउ आ à¤à¤•à¤Ÿà¤¾ नव नाम चà¥à¤¨à¥‚।
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'ई फाइल à¤à¤•à¤° {{PLURAL:$1|file|files}} दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• अछि:',
+'file-deleted-duplicate' => 'ठसंचिका ([[:$1]]) सठमेल खाइत संचिका पहिनहिये मेटा देल गेल अछि।
+अहाठओइ संचिकाक मेटाà¤à¤² जà¤à¤¬à¤¾à¤• इतिहास फेरसठउपारोपित करबासठपहिने देखू।',
+'uploadwarning' => 'उपारोपण चेतौनी',
+'uploadwarning-text' => 'कृपा कऽ नीचाठदेल संचिका वरà¥à¤£à¤¨à¤•à¥‡à¤ संशोधित करू आ फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'savefile' => 'संचिका संरकà¥à¤·à¤£ करू',
+'uploadedimage' => 'अपलोड भेल "[[$1]]"',
+'overwroteimage' => 'à¤à¤•à¤° "[[$1]]" नव संसà¥à¤•à¤°à¤£ उपारोपित भेल।',
+'uploaddisabled' => 'उपारोपण सभ अशकà¥à¤¤ कà¤à¤² गेल।',
+'copyuploaddisabled' => 'सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत उपारोपण अशकà¥à¤¤ कà¤à¤² गेल।',
+'uploadfromurl-queued' => 'अहाà¤à¤• उपारोपण इनà¥à¤¤à¤œà¤¾à¤°à¥€à¤®à¥‡ अछि।',
+'uploaddisabledtext' => 'संचिका उपारोपण सभ अशकà¥à¤¤ अछि।',
+'php-uploaddisabledtext' => 'पी.à¤à¤š.पी.मे संचिका उपारोपण अशकà¥à¤¤ अछि।
+कृपा कऽ संचिका उपारोपण विकलà¥à¤ª जाà¤à¤šà¥‚।',
+'uploadscripted' => 'ई संचिका परà¥à¤¯à¤‚कभाषा वा कूटलिपि यà¥à¤•à¥à¤¤ अछि जे गवेषक दà¥à¤µà¤¾à¤°à¤¾ गलत रूपमे वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾à¤¯à¤¿à¤¤ कà¤à¤² जा सकैà¤à¥¤',
+'uploadvirus' => 'ई संचिका विषविधियà¥à¤•à¥à¤¤ अछि।
+वरà¥à¤£à¤¨:$1',
+'upload-source' => 'मूल संचिका',
+'sourcefilename' => 'मूल संचिकानाम:',
+'sourceurl' => 'मूल सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत',
+'destfilename' => 'लकà¥à¤·à¥à¤¯ संचिकानाम:',
+'upload-maxfilesize' => 'अधिकतम संचिका आकार:$1',
+'upload-description' => 'संचिका वरà¥à¤£à¤¨',
+'upload-options' => 'उपारोपण विकलà¥à¤ª सभ',
+'watchthisupload' => 'ठपृषà¥à¤ à¤ªà¤° नजरि राखू',
+'filewasdeleted' => 'ठनामक à¤à¤•à¤Ÿà¤¾ संचिका पहिने उपारोपित कà¤à¤² गेल आ फेर मेटा देल गेल।
+अहाठफेरसठà¤à¤•à¤°à¤¾ उपारोपित करबासठपहिने ई $1 जाà¤à¤šà¥‚।',
+'upload-wasdeleted' => "'''चेतौनी''': अहाठफेरसठओ पनà¥à¤¨à¤¾ उपारोपित कऽ रहल छी जे पहिने मेटा देल गेल छै।'''
+
+अहाठविचारू जे की ई उपारोपित केनाइ उचित अछि।
+ठपनà¥à¤¨à¤¾à¤• मेटाà¤à¤² बला वृतà¥à¤¤à¤²à¥‡à¤– à¤à¤¤à¤ सà¥à¤µà¤¿à¤§à¤¾ लेल देल जा रहल अछि:",
+'filename-bad-prefix' => "जे संचिका अहाठउपारोपित कऽ रहल छी से '''\"\$1\"''' सठशà¥à¤°à¥‚ होइà¤, ई बिन विवरणक नाम अछि जे मूल रूपेठअंकीय कैमरा दà¥à¤µà¤¾à¤°à¤¾ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठदेल जाइत अछि।
+कृपा कऽ ठसंचिका लेल à¤à¤•à¤Ÿà¤¾ बेसी वरà¥à¤£à¤¨à¤¾à¤¤à¥à¤®à¤• नाम चà¥à¤¨à¥‚।",
+'upload-success-subj' => 'सफलतापूरà¥à¤µà¤• उपारोपित',
+'upload-success-msg' => '[$2] सठउपारोपन सफल भेल। ई à¤à¤¤à¤ अछि: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'उपारोपण समसà¥à¤¯à¤¾',
+'upload-failure-msg' => '[$2] सठउपारोपणमे समसà¥à¤¯à¤¾ अछि:
+$1',
+'upload-warning-subj' => 'उपारोपण चेतौनी',
+'upload-warning-msg' => '[$2] सठउपारोपणमे समसà¥à¤¯à¤¾ छल। अहाठघà¥à¤°à¤¿ सकै छी [[Special:Upload/stash/$1|उपारोपण आवेदन]] ठसमसà¥à¤¯à¤¾à¤•à¥‡à¤ ठीक करबा लेल।',
+
+'upload-proto-error' => 'गलत संविद',
+'upload-proto-error-text' => 'दूरसठउपारोपण लेल <code>http://</code> or <code>ftp://</code> सठपà¥à¤°à¤¾à¤°à¤®à¥à¤­ होà¤à¤¬à¤²à¤¾ सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत चाही।',
+'upload-file-error' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®',
+'upload-file-error-text' => 'वितरकपर à¤à¤•à¤Ÿà¤¾ असà¥à¤¥à¤¾à¤¯à¥€ संचिका बनेबाक पà¥à¤°à¤¯à¤¾à¤¸à¤®à¥‡ à¤à¤•à¤Ÿà¤¾ आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤® आà¤à¤²à¥¤
+समà¥à¤ªà¤°à¥à¤• करू [[Special:ListUsers/sysop|संचालक]] सà¤à¥¤',
+'upload-misc-error' => 'विचितà¥à¤° उपारोपण भà¥à¤°à¤®',
+'upload-misc-error-text' => 'उपारोपण काल à¤à¤•à¤Ÿà¤¾ विचितà¥à¤° भà¥à¤°à¤® आà¤à¤²à¥¤
+कृपा कऽ जाà¤à¤šà¥‚ कि सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत मानà¥à¤¯ आ पà¥à¤°à¤µà¥‡à¤¶-उपयà¥à¤•à¥à¤¤ अछि आ फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।
+जठसमसà¥à¤¯à¤¾ रहिते अछि तठ[[Special:ListUsers/sysop|संचालक]] सठसमà¥à¤ªà¤°à¥à¤• करू।',
+'upload-too-many-redirects' => 'ई सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत बडà¥à¤¡ बेसी घà¥à¤®à¥Œà¤† लागिक संग अछि।',
+'upload-unknown-size' => 'अजà¥à¤žà¤¾à¤¤ आकार',
+'upload-http-error' => 'परिसंविद भà¥à¤°à¤® आà¤à¤²:$1',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'पà¥à¤°à¤µà¥‡à¤¶ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤',
+'img-auth-nopathinfo' => 'बाटक जानकारी नै अछि।
+अहाà¤à¤• वितरक ठसूचनाकेठपà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ नै कऽ सकत।
+ई सी.जी.आइ.आधारित अछि आ चितà¥à¤°-समरà¥à¤¥à¤¨ केठसमरà¥à¤¥à¤¨ नै दऽ सकत।
+देखू http://www.mediawiki.org/wiki/Manual:Image_Authorization ।',
+'img-auth-notindir' => 'आगà¥à¤°à¤¹ कà¤à¤² रसà¥à¤¤à¤¾ विनà¥à¤¯à¤¾à¤¸à¤¿à¤¤ उपारोपित निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾à¤®à¥‡ नै अछि।',
+'img-auth-badtitle' => '"$1" लेल कोनो मानà¥à¤¯ शीरà¥à¤·à¤• नै बना सकल।',
+'img-auth-nologinnWL' => 'अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै छी आ "$1" सà¥à¤µà¥€à¤•à¥ƒà¤¤ सूचीमे नै अछि।',
+'img-auth-nofile' => 'संचिका "$1" नै अछि।',
+'img-auth-isdir' => 'अहाठà¤à¤•à¤Ÿà¤¾ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ "$1" मे पà¥à¤°à¤µà¥‡à¤¶à¤• पà¥à¤°à¤¯à¤¾à¤¸ कऽ रहल छी।
+मातà¥à¤° संचिका पà¥à¤°à¤µà¥‡à¤¶ मानà¥à¤¯ छै।',
+'img-auth-streaming' => '"$1" दृशà¥à¤¯à¤¸à¥à¤¯à¤¨à¥à¤¦à¤¨ भऽ रहल अछि।',
+'img-auth-public' => 'img_auth.php à¤à¤•à¤° पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ अछि वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त विकीसठसंचिका सभ फलित करब।
+ई विकी नà¥à¤¯à¤¾à¤¸à¤¿à¤¤ अछि सारà¥à¤µà¤œà¤¨à¤¿à¤• विकी बनेबाक।
+नीक सà¥à¤°à¤•à¥à¤·à¤¾ लेल, img_auth.php अमानà¥à¤¯ अछि।',
+'img-auth-noread' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ "$1" लेल पà¥à¤°à¤µà¥‡à¤¶ नै अछि।',
+'img-auth-bad-query-string' => 'सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत मे à¤à¤•à¤Ÿà¤¾ अमानà¥à¤¯ अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾ डरीड़ अछि।',
+
+# HTTP errors
+'http-invalid-url' => 'अमानà¥à¤¯ सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत:$1',
+'http-invalid-scheme' => 'सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत योजना तहत "$1" नै समरà¥à¤¥à¤¿à¤¤ अछि।',
+'http-request-error' => 'अजà¥à¤žà¤¾à¤¤ भà¥à¤°à¤®à¤• कारण परिसंविद आगà¥à¤°à¤¹ असफल रहल।',
+'http-read-error' => 'परिसंविद पठन भà¥à¤°à¤®',
+'http-timed-out' => 'परिसंविद आगà¥à¤°à¤¹ कालातीत',
+'http-curl-error' => 'भà¥à¤°à¤® निकालैबला सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत:$1',
+'http-host-unreachable' => 'सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत नै पाबि सकल',
+'http-bad-status' => 'परिसंविद आगà¥à¤°à¤¹ काल à¤à¤•à¤Ÿà¤¾ समसà¥à¤¯à¤¾ छल: $1 $2',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत नै पाबि सकल',
+'upload-curl-error6-text' => 'देल सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत जाà¤à¤šà¤² नै जा सकल।
+कृपा कऽ फेरसठजाà¤à¤šà¥‚ जे सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत सही अछि आ जालसà¥à¤¥à¤² ठीक अछि।',
+'upload-curl-error28' => 'उपारोपण कालातीत',
+'upload-curl-error28-text' => 'ई जालसà¥à¤¥à¤² पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ लेल बडà¥à¤¡ समठलऽ रहल अछि।
+कृपा कऽ जाà¤à¤šà¥‚ जे जालसà¥à¤¥à¤² ठीक अछि, कने काल बिलमू आ फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।
+अहाठकम भीड़भारबला समैमे पà¥à¤°à¤¯à¤¾à¤¸ करू।',
+
+'license' => 'अधिकृत करब:',
+'license-header' => 'अधिकृत करब',
+'nolicense' => 'कियो नै चà¥à¤¨à¤¾à¤à¤²',
+'license-nopreview' => '(पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ उपलबà¥à¤§ नै अछि)',
+'upload_source_url' => '(à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯, सारà¥à¤µà¤œà¤¨à¤¿à¤• पà¥à¤°à¤µà¥‡à¤¶à¤¬à¤²à¤¾ सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेत)',
+'upload_source_file' => '(अहाà¤à¤• संगणकपर à¤à¤•à¤Ÿà¤¾ संचिका)',
+
+# Special:ListFiles
+'listfiles-summary' => 'ई विशिषà¥à¤Ÿ पनà¥à¤¨à¤¾ सभटा उपारोपित संचिका देखबैà¤à¥¤
+पूरà¥à¤µà¤¨à¥à¤¯à¤¸à¥à¤¤ रूपेठअनà¥à¤¤à¤¿à¤® उपारोपित संचिका सूचीक शीरà¥à¤·à¤ªà¤° अछि।
+सà¥à¤¤à¤®à¥à¤­ शीरà¥à¤·à¤ªà¤° à¤à¤•à¤Ÿà¤¾ कà¥à¤²à¤¿à¤• छटनीमे परिवरà¥à¤¤à¤¨ करैà¤à¥¤',
+'listfiles_search_for' => 'ठदृशà¥à¤¯-शà¥à¤°à¤µà¥à¤¯ नामले ताकू:',
+'imgfile' => 'संचिका',
+'listfiles' => 'संचिका सूची',
+'listfiles_thumb' => 'लघà¥à¤šà¤¿à¤¤à¥à¤°',
+'listfiles_date' => 'तिथि',
+'listfiles_name' => 'नाम',
+'listfiles_user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'listfiles_size' => 'आकार',
+'listfiles_description' => 'वरà¥à¤£à¤¨',
+'listfiles_count' => 'संसà¥à¤•à¤°à¤£ सभ',
# File description page
-'filehist' => 'फाइल इतिहास',
-'imagelinks' => 'लिंकà¥à¤¸',
+'file-anchor-link' => 'संचिका',
+'filehist' => 'फाइल इतिहास',
+'filehist-help' => 'तखà¥à¤¨à¤•à¤¾ तिथि/ समठपर कà¥à¤²à¤¿à¤• करू जखà¥à¤¨à¤•à¤¾ फाइल देखबाक अछि',
+'filehist-deleteall' => 'सभटाकेठमेटाउ',
+'filehist-deleteone' => 'मेटाउ',
+'filehist-revert' => 'फेरसठवà¤à¤¹',
+'filehist-current' => 'अखà¥à¤¨à¤•à¤¾',
+'filehist-datetime' => 'तिथि/ समà¤',
+'filehist-thumb' => 'लघà¥à¤šà¤¿à¤¤à¥à¤°',
+'filehist-thumbtext' => 'तखà¥à¤¨à¤•à¤¾ लघà¥à¤šà¤¿à¤¤à¥à¤° $1',
+'filehist-nothumb' => 'कोनो लघà¥à¤šà¤¿à¤¤à¥à¤° नै',
+'filehist-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'filehist-dimensions' => 'बीम',
+'filehist-filesize' => 'संचिका आकार',
+'filehist-comment' => 'समीकà¥à¤·à¤¾',
+'filehist-missing' => 'संचिका हेराà¤à¤²',
+'imagelinks' => 'फाइलक लिंक',
+'linkstoimage' => 'ठ{{PLURAL:$1|पनà¥à¤¨à¤¾à¤• लागि |$1 पनà¥à¤¨à¤¾à¤• लागि}} ठफाइलसà¤:',
+'linkstoimage-more' => '$1 सठबेसी {{PLURAL:$1|page links|पनà¥à¤¨à¤¾ सभक लागि}} ठसंचिकाक।
+ई सूची देखबैठ{{PLURAL:$1|first page link|first $1 page links}} मातà¥à¤° ठसंचिकाक।
+à¤à¤•à¤Ÿà¤¾ [[Special:WhatLinksHere/$2|पूरà¥à¤£ सूची]] उपलबà¥à¤§ अछि।',
+'nolinkstoimage' => 'à¤à¤•à¥‹à¤Ÿà¤¾ पनà¥à¤¨à¤¾ नै अछि जकर लागि ठसंचिकासठहà¥à¤…à¤à¥¤',
+'morelinkstoimage' => 'देखू [[Special:WhatLinksHere/$1|आर लागि]] ठसंचिकाक।',
+'duplicatesoffile' => 'ठसंचिकाक {{PLURAL:$1|file is a duplicate|$1 संचिका सभ दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• अछि}} अछि ([[Special:FileDuplicateSearch/$2|आर वरà¥à¤£à¤¨]]):',
+'sharedupload' => 'ई फाइल $1 सठअछि आ दोसर पà¥à¤°à¤•à¤²à¥à¤ª लेल पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² जा सकैà¤à¥¤',
+'sharedupload-desc-there' => 'ई संचिका $1 सठअछि आ दोसर परियोजना लेल पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² जा सकैà¤à¥¤
+कृपा कऽ देखू [$2 संचिका वरà¥à¤£à¤¨ पनà¥à¤¨à¤¾] विशेष सूचना लेल।',
+'sharedupload-desc-here' => 'ई संचिका $1 सठअछि आ ई दोसर परियोजना दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² जा सकैà¤à¥¤
+ठपर विवरण [$2 संचिका विवरण पनà¥à¤¨à¤¾] ओइपर नीचाठदेखाà¤à¤² अछि।',
+'filepage-nofile' => 'ठनामक कोनो संचिका उपलबà¥à¤§ नै अछि।',
+'filepage-nofile-link' => 'ठनामक कोनो संचिका उपलबà¥à¤§ नै अछि मà¥à¤¦à¤¾ अहाठ[$1 à¤à¤•à¤°à¤¾ उपारोपित करू]।',
+'uploadnewversion-linktext' => 'ठफाइलक नव संसà¥à¤•à¤°à¤£à¤• उपारोपण',
+'shared-repo-from' => '$1 सà¤',
+'shared-repo' => 'à¤à¤•à¤Ÿà¤¾ साà¤à¥€ बखारी',
+
+# File reversion
+'filerevert' => '$1 लग घà¥à¤°à¥',
+'filerevert-legend' => 'घà¥à¤°à¤¾à¤à¤² संचिका',
+'filerevert-intro' => "अहाठसंचिका घà¥à¤°à¤¾à¤¬à¥ˆà¤²à¥‡ छी '''[[Media:$1|$1]]''' केठ[$4 संसà¥à¤•à¤°à¤£ $3, $2 केà¤] लग।",
+'filerevert-comment' => 'कारण:',
+'filerevert-defaultcomment' => '$2, $1 क संसà¥à¤•à¤°à¤£ लग घà¥à¤°à¤²',
+'filerevert-submit' => 'फेरसठवà¤à¤¹',
+'filerevert-success' => "'''[[Media:$1|$1]]''' घà¥à¤°à¤¾à¤à¤² गेल [$4 version as of $3, $2] लग।",
+'filerevert-badversion' => 'ओइ कालक कोनो पà¥à¤°à¤¾à¤¨ सà¥à¤¥à¤¾à¤¨à¥€à¤¯ संसà¥à¤•à¤°à¤£ ठसंचिकाक नै अछि।',
+
+# File deletion
+'filedelete' => '$1 केठमेटाउ',
+'filedelete-legend' => 'संचिका मेटाउ',
+'filedelete-intro' => "अहाठसंचिका '''[[Media:$1|$1]]''' केठà¤à¤•à¤° सभटा इतिहासक संग मेटाबैबला छी।",
+'filedelete-intro-old' => "अहाठ'''[[Media:$1|$1]]''' à¤à¤•à¤° संसà¥à¤•à¤°à¤£ [$4 $3, $2] केठमेटाबैबला छी।",
+'filedelete-comment' => 'कारण:',
+'filedelete-submit' => 'मेटाउ',
+'filedelete-success' => "'''$1''' मेटाà¤à¤² गेल।",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' à¤à¤•à¤° संसà¥à¤•à¤°à¤£ $3, $2 केठमेटा देल गेल।",
+'filedelete-nofile' => "'''$1''' नै अछि।",
+'filedelete-nofile-old' => "'''$1''' à¤à¤•à¤° कोनो संचित संसà¥à¤•à¤°à¤£ खास गà¥à¤£à¤• संग नै अछि।",
+'filedelete-otherreason' => 'दोसर/ अतिरिकà¥à¤¤ कारण:',
+'filedelete-reason-otherlist' => 'दोसर कारण',
+'filedelete-reason-dropdown' => '* सामानà¥à¤¯ हटेबाक कारण
+** सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
+** दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• संचिका',
+'filedelete-edit-reasonlist' => 'मेटेबाक कारणक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'filedelete-maintenance' => 'सà¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ कालमे संचिकाकेठमेटà¤à¤¬à¤¾à¤• आ फेरसठअनबाक कà¥à¤°à¤¿à¤¯à¤¾ कनी काल लेल अशकà¥à¤¤ कà¤à¤² गेल अछि।',
+
+# MIME search
+'mimesearch' => 'माइम खोज',
+'mimesearch-summary' => 'ई पनà¥à¤¨à¤¾ माइम पà¥à¤°à¤•à¤¾à¤°à¤• संचिकाकेठअलग करब समà¥à¤­à¤µ बनबैत अछि।
+निवेशन: पाठ पà¥à¤°à¤•à¤¾à¤°/ उपपà¥à¤°à¤•à¤¾à¤°, जेना <tt>image/jpeg</tt> ।',
+'mimetype' => 'माइम पà¥à¤°à¤•à¤¾à¤°:',
+'download' => 'अवारोपन',
+
+# Unwatched pages
+'unwatchedpages' => 'बिन धà¥à¤¯à¤¾à¤¨ देल पनà¥à¤¨à¤¾',
+
+# List redirects
+'listredirects' => 'रसà¥à¤¤à¤¾ बदलेनक सूची',
+
+# Unused templates
+'unusedtemplates' => 'बिना पà¥à¤°à¤¯à¥‹à¤—क नमूना सभ',
+'unusedtemplatestext' => 'ई पनà¥à¤¨à¤¾ {{ns:template}} नामसà¥à¤¥à¤¾à¤¨à¤®à¥‡ सभ पनà¥à¤¨à¤¾à¤•à¥‡à¤ सूची बनबैà¤, जे दोसर पनà¥à¤¨à¤¾à¤ªà¤° शामिल नै अछि।
+मेटेबासठपहिने दोसर नमूनाक लागिकेठजाà¤à¤šà¤¬ मोन राखू।',
+'unusedtemplateswlh' => 'दोसर लागि सभ',
# Random page
-'randompage' => 'अवà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ पृषà¥à¤ ',
+'randompage' => 'अवà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ पृषà¥à¤ ',
+'randompage-nopages' => 'à¤à¤®à¥‡ दोसर पनà¥à¤¨à¤¾ नै अछि {{PLURAL:$2|namespace|namespaces}}: $1 ।',
+
+# Random redirect
+'randomredirect' => 'मिजà¥à¤à¤° बदलेनबला लागि',
+'randomredirect-nopages' => 'नामसà¥à¤¥à¤¾à¤¨ "$1" मे कोनो बदलेनबला लागि नै अछि।',
+
+# Statistics
+'statistics' => 'सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-pages' => 'पनà¥à¤¨à¤¾à¤• सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-edits' => 'सांखà¥à¤¯à¤¿à¤•à¥€à¤• समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'statistics-header-views' => 'सांखà¥à¤¯à¤¿à¤•à¥€ देखू',
+'statistics-header-users' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-hooks' => 'दोसर सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-articles' => 'अनà¥à¤•à¥à¤°à¤® पनà¥à¤¨à¤¾ सभ',
+'statistics-pages' => 'पनà¥à¤¨à¤¾ सभ',
+'statistics-pages-desc' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾, बदलेनबला लागि सभ इतà¥à¤¯à¤¾à¤¦à¤¿ सहित सभटा पनà¥à¤¨à¤¾ सभ।',
+'statistics-files' => 'उपारोपित संचिका सभ',
+'statistics-edits' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} अà¤à¤¬à¤¾à¤¸à¤ लऽ कऽ भेल पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ सभ।',
+'statistics-edits-average' => 'पà¥à¤°à¤¤à¤¿ पनà¥à¤¨à¤¾ औसत समà¥à¤ªà¤¾à¤¦à¤¨',
+'statistics-views-total' => 'दृशà¥à¤¯ आइ धरि',
+'statistics-views-total-desc' => 'असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¹à¥€à¤¨ पनà¥à¤¨à¤¾ आ विशेष पनà¥à¤¨à¤¾à¤• दृशà¥à¤¯ समà¥à¤®à¤¿à¤²à¤¿à¤¤ नै अछि',
+'statistics-views-peredit' => 'पà¥à¤°à¤¤à¤¿ समà¥à¤ªà¤¾à¤¦à¤¨ देखल गेल',
+'statistics-users' => '[[Special:ListUsers|users]] छथि',
+'statistics-users-active' => 'सकà¥à¤°à¤¿à¤¯ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'statistics-users-active-desc' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ जे अनà¥à¤¤à¤¿à¤® {{PLURAL:$1|दिन|$1 दिन}} मे कोनो काज केने छथि',
+'statistics-mostpopular' => 'सभसठबेसी देखल गेल पनà¥à¤¨à¤¾',
+
+'disambiguations' => 'सà¥à¤ªà¤·à¥à¤Ÿ पनà¥à¤¨à¤¾',
+'disambiguationspage' => 'नमूना: निवारण',
+'disambiguations-text' => "ई सभ पनà¥à¤¨à¤¾ '''सà¥à¤ªà¤·à¥à¤Ÿ कà¤à¤²''' सठलागिमे अछि।
+ओ सभ à¤à¤•à¤° बदला उचित वारà¥à¤¤à¤¾à¤ªà¤° लागि करथि।<br />
+[[MediaWiki:Disambiguationspage]] सठलागिमे जठनमूनाक पà¥à¤°à¤¯à¥‹à¤— करैत अछि तखने ओ '''सà¥à¤ªà¤·à¥à¤Ÿ कà¤à¤²''' पनà¥à¤¨à¤¾ कहाà¤à¤¤à¥¤",
+
+'doubleredirects' => 'दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• लागिबला बदलेन',
+'doubleredirectstext' => 'ई पनà¥à¤¨à¤¾ ओइ पनà¥à¤¨à¤¾ सभक संकलन छी जे बदलेन करैठदोसर बदलेनबला पनà¥à¤¨à¤¾à¤¸à¤à¥¤
+पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• पाà¤à¤¤à¥€ पहिल आ दोसर बदलेनक लागि रखने अछि आ संगे दोसर बदलेनक लकà¥à¤·à¥à¤¯ सेहो, जे वासà¥à¤¤à¤µà¤®à¥‡ "वासà¥à¤¤à¤µ" लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ अछि, जकरापर पहिल बदलेनकेठजेबाक चाही।
+ <del>Crossed out</del> पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤• हल भेटल अछि।',
+'double-redirect-fixed-move' => '[[$1]] घसकाà¤à¤² गेल।
+ई आब [[$2]] दिस जा रहल अछि।',
+'double-redirect-fixer' => 'बदलेन सà¥à¤¥à¤¾à¤¯à¤¿à¤¤à¥à¤µ',
+
+'brokenredirects' => 'टूटल बदलेन सभ',
+'brokenredirectstext' => 'ई बदलेन सभ नै अवसà¥à¤¥à¤¿à¤¤ पनà¥à¤¨à¤¾ सभक दिस जाइत अछि।',
+'brokenredirects-edit' => 'संपादन करू',
+'brokenredirects-delete' => 'मेटाउ',
+
+'withoutinterwiki' => 'बिना भाषा लागिक पनà¥à¤¨à¤¾ सभ',
+'withoutinterwiki-summary' => 'ई पनà¥à¤¨à¤¾ सभ दोसर भाषाक संसà¥à¤•à¤°à¤£ सभ दिस संकेत नै करैà¤à¥¤',
+'withoutinterwiki-legend' => 'उपसरà¥à¤—',
+'withoutinterwiki-submit' => 'देखाउ',
+
+'fewestrevisions' => 'à¤à¤•à¤¾à¤§ संशोधनबला पनà¥à¤¨à¤¾ सभ',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइटà¥à¤¸}}',
-'prefixindex' => 'लगाऊ सूची',
+'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइटà¥à¤¸}}',
+'ncategories' => '{{PLURAL:$1|संवरà¥à¤—|कà¤à¤Ÿà¤¾ संवरà¥à¤—}}',
+'nlinks' => '$1 {{PLURAL:$1|लागि|लागि सभ}}',
+'nmembers' => '$1 {{PLURAL:$1|सदसà¥à¤¯|सदसà¥à¤¯ सभ}}',
+'nrevisions' => '$1{{PLURAL:$1|संशोधन|संशोधन सभ}}',
+'nviews' => '$1 {{PLURAL:$1|दृशà¥à¤¯|दृशà¥à¤¯ सभ}}',
+'nimagelinks' => '$1पर पà¥à¤°à¤¯à¥à¤•à¥à¤¤ {{PLURAL:$1|पनà¥à¤¨à¤¾|पनà¥à¤¨à¤¾ सभ}}',
+'ntransclusions' => '$1पर पà¥à¤°à¤¯à¥à¤•à¥à¤¤ {{PLURAL:$1|पनà¥à¤¨à¤¾|पनà¥à¤¨à¤¾ सभ}}',
+'specialpage-empty' => 'ठपनà¥à¤¨à¤¾ लेल कोनो परिणाम नै अछि।',
+'lonelypages' => 'अनाथ पनà¥à¤¨à¤¾ सभ',
+'lonelypagestext' => 'ई पनà¥à¤¨à¤¾ सभ ने कोनो {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} सठजà¥à¤¡à¤¼à¤² अछि आ नहिये अनà¥à¤¤à¤°à¥à¤¬à¤¾à¤¹à¥à¤¯ रूपसठदोसर पनà¥à¤¨à¤®à¥‡ अछि।',
+'uncategorizedpages' => 'अवरà¥à¤—ीकृत पनà¥à¤¨à¤¾ सभ',
+'uncategorizedcategories' => 'अवरà¥à¤—ीकृत संवरà¥à¤— सभ',
+'uncategorizedimages' => 'अवरà¥à¤—ीकृत संचिका सभ',
+'uncategorizedtemplates' => 'अवरà¥à¤—ीकृत नमूना सभ',
+'unusedcategories' => 'नै पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² संवरà¥à¤— सभ',
+'unusedimages' => 'बिना पà¥à¤°à¤¯à¥‹à¤—क संचिका सभ',
+'popularpages' => 'लोकपà¥à¤°à¤¿à¤¯ पनà¥à¤¨à¤¾ सभ',
+'wantedcategories' => 'आवशà¥à¤¯à¤• संवरà¥à¤— सभ',
+'wantedpages' => 'आवशà¥à¤¯à¤• पनà¥à¤¨à¤¾ सभ',
+'wantedpages-badtitle' => 'परिणाम सूचीमे अमानà¥à¤¯ शीरà¥à¤·à¤•:$1',
+'wantedfiles' => 'आवशà¥à¤¯à¤• संचिका सभ',
+'wantedtemplates' => 'आवशà¥à¤¯à¤• नमूना सभ',
+'mostlinked' => 'सभसठबेसी लागिबला पनà¥à¤¨à¤¾ सभ',
+'mostlinkedcategories' => 'सभसठबेसी लागिबला संवरà¥à¤— सभ',
+'mostlinkedtemplates' => 'सभसठबेसी लागिबला नमूना सभ',
+'mostcategories' => 'सभसठबेसी संवरà¥à¤—बला पनà¥à¤¨à¤¾ सभ',
+'mostimages' => 'सभसठबेसी लागिबला संचिका सभ',
+'mostrevisions' => 'सभसठबेसी संशोधनबला पनà¥à¤¨à¤¾ सभ',
+'prefixindex' => 'उपसरà¥à¤—क संग सभटा पृषà¥à¤ ',
+'shortpages' => 'पनà¥à¤¨à¤¾ सभ छाà¤à¤Ÿà¥‚',
+'longpages' => 'नमगर पनà¥à¤¨à¤¾ सभ',
+'deadendpages' => 'à¤à¤•à¤¦à¤®à¤¸à¤ अनà¥à¤¤ भऽ जाà¤à¤¬à¤²à¤¾ पनà¥à¤¨à¤¾ सभ',
+'deadendpagestext' => 'ई पनà¥à¤¨à¤¾ सभ {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} क दोसर पनà¥à¤¨à¤¾à¤¸à¤ लागिमे नै रहत।',
+'protectedpages' => 'संरकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾ सभ',
+'protectedpages-indef' => 'अननà¥à¤¤à¤•à¤¾à¤²à¤¿à¤• सà¥à¤°à¤•à¥à¤·à¤¾ मातà¥à¤°',
+'protectedpages-cascade' => 'तराउपड़ी सà¥à¤°à¤•à¥à¤·à¤¾ मातà¥à¤°',
+'protectedpagestext' => 'ई पनà¥à¤¨à¤¾ सभ घसकà¤à¤¬à¤¾ वा समà¥à¤ªà¤¾à¤¦à¤¨ लेल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।',
+'protectedpagesempty' => 'कोनो पनà¥à¤¨à¤¾ ठसभ परिमिति लेल सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नै राखल गेल अछि।',
+'protectedtitles' => 'संरकà¥à¤·à¤¿à¤¤ शीरà¥à¤·à¤• सभ',
+'protectedtitlestext' => 'ई शीरà¥à¤·à¤• सभ बनबासठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि',
+'protectedtitlesempty' => 'कोनो पनà¥à¤¨à¤¾ ठसभ परिमिति लेल सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नै राखल गेल अछि।',
+'listusers' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सूची',
+'listusers-editsonly' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करैबला पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ मातà¥à¤° देखाउ',
+'listusers-creationsort' => 'निरà¥à¤®à¤¾à¤£ तिथिक हिसाबसठछाà¤à¤Ÿà¥‚',
+'usereditcount' => '$1 {{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨|समà¥à¤ªà¤¾à¤¦à¤¨ सभ}}',
+'usercreated' => '$1 केठबनाà¤à¤² गेल $2 बजे',
+'newpages' => 'नव पनà¥à¤¨à¤¾ सभ',
+'newpages-username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®:',
+'ancientpages' => 'सभसठपà¥à¤°à¤¾à¤¨ पनà¥à¤¨à¤¾ सभ',
+'move' => 'हटाउ',
+'movethispage' => 'ठपृषà¥à¤ à¤•à¥‡à¤ घसकाउ',
+'unusedimagestext' => 'ई सभ संचिका अछि मà¥à¤¦à¤¾ कोनो पनà¥à¤¨à¤¾à¤®à¥‡ निवशित नै अछि।
+कृपा कऽ ई बà¥à¤à¥‚ जे दोसर जालसà¥à¤¥à¤² सभ सोठसारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेतबला कोनो संचिकासठलागि बना सकैà¤, आ तà¤à¤ सरिय पà¥à¤°à¤¯à¥‹à¤—क बादो अखनो à¤à¤¤à¤ सूचित कà¤à¤² जा सकैà¤à¥¤',
+'unusedcategoriestext' => 'ई संवरà¥à¤— पनà¥à¤¨à¤¾ सभ अछि, ओना कोनो दोसर पनà¥à¤¨à¤¾ वा संवरà¥à¤— ओकर पà¥à¤°à¤¯à¥‹à¤— करैत अछि।',
+'notargettitle' => 'बिन लकà¥à¤·à¥à¤¯à¤•',
+'notargettext' => 'ठपà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤•à¥‡à¤ समà¥à¤ªà¤¨à¥à¤¨ करबा लेल अहाठकोनो लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ वा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै देने छी।',
+'nopagetitle' => 'à¤à¤¹à¥‡à¤¨ कोनो लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ नै',
+'nopagetext' => 'लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ जे अहाठनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿ केने छी से नै अछि।',
+'pager-newer-n' => '{{PLURAL:$1|नव 1|नव $1}}',
+'pager-older-n' => '{{PLURAL:$1|साबिक 1|साबिक $1}}',
+'suppress' => 'नजरिपर नै आà¤à¤²',
+
+# Book sources
+'booksources' => 'किताबक सनà¥à¤¦à¤°à¥à¤­ सभ',
+'booksources-search-legend' => 'किताबक सनà¥à¤¦à¤°à¥à¤­à¤• लेल ताकू',
+'booksources-go' => 'चलू',
+'booksources-text' => 'नीचाठदोसर जालसà¥à¤¥à¤²à¤¸à¤ लागि सभक सूची अछि जे नव आ पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² किताब बेचैà¤, आ ई पोथी सभक विषयमे ओहो सूचना दऽ सकैठजे अहाठताकि रहल छी:',
+'booksources-invalid-isbn' => 'देल आइ.à¤à¤¸.बी.à¤à¤¨. संखà¥à¤¯à¤¾ मानà¥à¤¯ नै बà¥à¤à¤¾à¤‡à¤¤ अछि; कृपा कऽ मूल सà¥à¤°à¥‹à¤¤à¤¸à¤ दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• बनेबा काल भेल भà¥à¤°à¤®à¤•à¥‡à¤ जाà¤à¤šà¥‚।',
# Special:Log
-'all-logs-page' => 'सभटा लॉग',
+'specialloguserlabel' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾:',
+'speciallogtitlelabel' => 'शीरà¥à¤·à¤•:',
+'log' => 'वृतà¥à¤¤à¤²à¥‡à¤– सभ',
+'all-logs-page' => 'सभटा सारà¥à¤µà¤œà¤¨à¤¿à¤• वृतà¥à¤¤à¤²à¥‡à¤–',
+'alllogstext' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} क सभटा उपलबà¥à¤§ वृतà¥à¤¤à¤²à¥‡à¤–क संयà¥à¤•à¥à¤¤ दृशà¥à¤¯à¥¤
+अहाठदृशà¥à¤¯à¤•à¥‡à¤ संकीरà¥à¤£ करबा लेल वृतà¥à¤¤à¤²à¥‡à¤–क à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤•à¤¾à¤° चà¥à¤¨à¤¿ सकै छी, पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® (बà¥à¤°à¤¹à¥à¤®à¤•à¥à¤·à¤°-लघà¥à¤µà¤•à¥à¤·à¤° विचारणीय), वा पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ पनà¥à¤¨à¤¾ (à¤à¤¤à¥Œ बà¥à¤°à¤¹à¥à¤®à¤•à¥à¤·à¤°-लघà¥à¤µà¤•à¥à¤·à¤° विचारणीय)।',
+'logempty' => 'वृतà¥à¤¤à¤²à¥‡à¤–मे कोनो मेल खाइबला बौसà¥à¤¤à¥ नै।',
+'log-title-wildcard' => 'खोज शीरà¥à¤·à¤• सभ ठपाठसठपà¥à¤°à¤¾à¤°à¤®à¥à¤­',
# Special:AllPages
-'alphaindexline' => '$1 to $2',
+'allpages' => 'सभ पनà¥à¤¨à¤¾',
+'alphaindexline' => '$1 to $2',
+'nextpage' => 'अगिला पनà¥à¤¨à¤¾ ($1)',
+'prevpage' => 'पहिलà¥à¤•à¤¾ पनà¥à¤¨à¤¾ ($1)',
+'allpagesfrom' => 'पनà¥à¤¨à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ पà¥à¤°à¤¾à¤°à¤®à¥à¤­ भेल:',
+'allpagesto' => 'à¤à¤¤à¤½ खतम होमà¤à¤¬à¤²à¤¾ पनà¥à¤¨à¤¾à¤• पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ करू:',
+'allarticles' => 'सभटा पनà¥à¤¨à¤¾',
+'allinnamespace' => 'सभटा पनà¥à¤¨à¤¾ ($1 नामगाम)',
+'allnotinnamespace' => 'सभटा पनà¥à¤¨à¤¾ ($1 नामगाममे नै)',
+'allpagesprev' => 'पहिलà¥à¤•à¤¾',
+'allpagesnext' => 'आगाà¤',
+'allpagessubmit' => 'जाउ',
+'allpagesprefix' => 'उपसरà¥à¤—क संग दृशà¥à¤¯ पनà¥à¤¨à¤¾ सभ:',
+'allpagesbadtitle' => 'देल पनà¥à¤¨à¤¾à¤• शीरà¥à¤·à¤• गलत, गलत समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ अनà¥à¤¤à¤°-भाषा अनà¥à¤¤à¤° विकी शीरà¥à¤·à¤• छी। ई à¤à¤• वा बेशी कलाकार यà¥à¤•à¥à¤¤ भऽ सकैठजे शीरà¥à¤·à¤•à¤®à¥‡ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ नै कà¤à¤² जा सकैà¤à¥¤',
+'allpages-bad-ns' => '{{जालसà¥à¤¥à¤²}} मे "$1" नामगाम नै अछि।',
+
+# Special:Categories
+'categories' => 'संवरà¥à¤— सभ',
+'categoriespagetext' => 'ई {{PLURAL:$1|संवरà¥à¤—मे अछि|संवरà¥à¤— सभमे अछि}} पनà¥à¤¨à¤¾ वा मीडिया।
+[[Special:UnusedCategories|Unused categories]] à¤à¤¤à¤ देखाà¤à¤² नै अछि।
+ईहो देखू [[Special:WantedCategories|wanted categories]]।',
+'categoriesfrom' => 'पनà¥à¤¨à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ पà¥à¤°à¤¾à¤°à¤®à¥à¤­ भेल:',
+'special-categories-sort-count' => 'गानि कऽ छाà¤à¤Ÿà¥‚',
+'special-categories-sort-abc' => 'वरà¥à¤£à¤¾à¤•à¥à¤·à¤°à¤¾à¤¨à¥à¤¸à¤¾à¤° छाà¤à¤Ÿà¥‚',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'मेटाà¤à¤² पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ योगदान सभ',
+'deletedcontributions-title' => 'मेटाà¤à¤² पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ योगदान सभ',
+'sp-deletedcontributions-contribs' => 'योगदान सभ',
+
+# Special:LinkSearch
+'linksearch' => 'बाहरक समà¥à¤¬à¤¨à¥à¤§',
+'linksearch-pat' => 'खोज तरीका:',
+'linksearch-ns' => 'नामसà¥à¤¥à¤¾à¤¨ :',
+'linksearch-ok' => 'ताकू',
+'linksearch-text' => 'बà¥à¤°à¤¹à¥à¤®à¤¾à¤¸à¥à¤¤à¥à¤° जेना "*.wikipedia.org" पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² जा सकैà¤à¥¤<br />
+सहायक संविद:<tt>$1</tt>',
+'linksearch-line' => '$2 सठ$1 क लागि अछि।',
+'linksearch-error' => 'निमंतà¥à¤°à¤•à¤¨à¤¾à¤®à¤• पà¥à¤°à¤¾à¤°à¤®à¥à¤­à¤®à¥‡ बà¥à¤°à¤¹à¥à¤®à¤¾à¤¸à¥à¤¤à¥à¤° आबि सकैà¤à¥¤',
+
+# Special:ListUsers
+'listusersfrom' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ पà¥à¤°à¤¾à¤°à¤®à¥à¤­ भेल:',
+'listusers-submit' => 'देखाउ',
+'listusers-noresult' => 'कोनो पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै',
+'listusers-blocked' => '(पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤)',
+
+# Special:ActiveUsers
+'activeusers' => 'सकà¥à¤°à¤¿à¤¯ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभक सूची',
+'activeusers-intro' => 'ई ओहेन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभक सूची अछि जे पछिला $1 {{PLURAL:$1|दिन|दिन}} मे किछॠसकà¥à¤°à¤¿à¤¯à¤¤à¤¾ देखेने छथि।',
+'activeusers-count' => '$1 {{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨|समà¥à¤ªà¤¾à¤¦à¤¨ सभ}} paChilaa {{PLURAL:$3|दिन|$3 दिन}}',
+'activeusers-from' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ पà¥à¤°à¤¾à¤°à¤®à¥à¤­ भेल:',
+'activeusers-hidebots' => 'सà¥à¤µà¤šà¤¾à¤²à¤¨ नà¥à¤•à¤¾à¤‰',
+'activeusers-hidesysops' => 'संचालक नà¥à¤•à¤¾à¤‰',
+'activeusers-noresult' => 'कोनो पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै भेटल',
+
+# Special:Log/newusers
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ रचना वृतà¥à¤¤à¤²à¥‡à¤–',
+'newuserlogpagetext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ निरà¥à¤®à¤¾à¤£à¤• वृतà¥à¤¤à¤²à¥‡à¤– अछि।',
+'newuserlog-byemail' => 'कूटशबà¥à¤¦ ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ पठाà¤à¤² गेल',
+'newuserlog-create-entry' => 'नव पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता',
+'newuserlog-create2-entry' => 'नव खाता $1 बनेलौं',
+'newuserlog-autocreate-entry' => 'खाता सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठबनल',
+
+# Special:ListGroupRights
+'listgrouprights' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— अधिकार',
+'listgrouprights-summary' => 'ई सभ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤—क à¤à¤•à¤Ÿà¤¾ सूची अछि जे ठविकीपरपरिभाषित अछि ओकर संसरà¥à¤—ित पà¥à¤°à¤µà¥‡à¤¶ अधिकारक संग।
+à¤à¤¤à¤ [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त अधिकार लेल भऽ सकैà¤à¥¤',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">देल अधिकार</span>
+* <span class="listgrouprights-revoked">निकालल अधिकार</span>',
+'listgrouprights-group' => 'वरà¥à¤—',
+'listgrouprights-rights' => 'अधिकार',
+'listgrouprights-helppage' => 'Help: वरà¥à¤— अधिकार',
+'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' => 'सभटा वरà¥à¤—केठअपन खातासठनिकालू',
+
+# E-mail user
+'mailnologin' => 'कोनो पठेबाक पता नै',
+'mailnologintext' => 'अहाठ[[Special:UserLogin|समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤]] हेबाक चाही आ अहाà¤à¤• विकलà¥à¤ª [[Special:Preferences|preferences]] मे à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेत दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पठेबा लेल हेबाक चाही।',
+'emailuser' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° पठाउ',
+'emailpage' => 'ई-पतà¥à¤° पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'emailpagetext' => 'अहाà¤à¤• नीचाà¤à¤• आवेदन-पतà¥à¤° ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° संदेश पठेबा लेल पà¥à¤°à¤¯à¥‹à¤— कऽ सकै छी।
+ई-पतà¥à¤° जे अहाठ[[Special:Preferences|your user preferences]] मे देलहà¥à¤ से ई-पतà¥à¤°"à¤à¤¤à¤à¤¸à¤" पतासठदेखाà¤à¤¤, से पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾ सोà¤à¥‡ अहाà¤à¤•à¥‡à¤ उतà¥à¤¤à¤° देबामे समरà¥à¤¥ हेताह।',
+'usermailererror' => 'ई-पतà¥à¤° बौसà¥à¤¤à¥ घà¥à¤°à¤² भà¥à¤°à¤®:',
+'defemailsubject' => '{{जालसà¥à¤¥à¤²}} ई-पतà¥à¤°',
+'usermaildisabled' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ ई-पतà¥à¤° अशकà¥à¤¤',
+'usermaildisabledtext' => 'अहाठदोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ठविकीपर ई-पतà¥à¤° नै पठा सकै छिà¤à¥¤',
+'noemailtitle' => 'कोनो ई-पतà¥à¤° पता नै',
+'noemailtext' => 'ई परà¥à¤¯à¥‹à¤•à¥à¤¤à¤¾ अपन कोनो मानà¥à¤¯ ई-पतà¥à¤° संकेत नै देने अछि।',
+'nowikiemailtitle' => 'कोनो ई-पतà¥à¤°à¤• अनà¥à¤®à¤¤à¤¿ नै अछि',
+'nowikiemailtext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¸à¤ ई-पतà¥à¤° पà¥à¤°à¤¾à¤ªà¥à¤¤ नै करबाक विकलà¥à¤ª चà¥à¤¨à¤¨à¥‡ अछि।',
+'email-legend' => 'ई-पतà¥à¤° दोसर {{जालसà¥à¤¥à¤²}} पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पठाउ',
+'emailfrom' => 'à¤à¤¤à¤½à¤¸à¤:',
+'emailto' => 'à¤à¤²à¥‡à¤²:',
+'emailsubject' => 'विषय:',
+'emailmessage' => 'संदेश:',
+'emailsend' => 'पठाउ',
+'emailccme' => 'हमर संदेशक दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• हमर ई-पतà¥à¤°à¤ªà¤° पठाउ',
+'emailccsubject' => 'अहाà¤à¤• संदेशक दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• $1: $2',
+'emailsent' => 'ई-पतà¥à¤° पठेलौं',
+'emailsenttext' => 'अहाà¤à¤• ई-पतà¥à¤° संदेश पठाà¤à¤² गेल।',
+'emailuserfooter' => 'ई ई-पतà¥à¤° $1 सठ$2 केठ"ई-पतà¥à¤° पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾" केठपठाओल गेल {{जालसथल}} पर।',
+
+# User Messenger
+'usermessage-summary' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ संदेश देल।',
+'usermessage-editor' => 'पà¥à¤°à¤£à¤¾à¤²à¥€à¤• दूत',
# Watchlist
-'mywatchlist' => 'हमर साकांकà¥à¤·-सूची',
-'watch' => 'ताकिमे',
-'unwatch' => 'छोड़ू',
+'watchlist' => 'हमर साकांकà¥à¤·à¤¸à¥‚ची',
+'mywatchlist' => 'हमर साकांकà¥à¤·-सूची',
+'watchlistfor2' => '$1 $2 लेल',
+'nowatchlist' => 'अहाà¤à¤• साकांकà¥à¤·-सूचीमे कोनो बौसà¥à¤¤à¥ नै अछि।',
+'watchlistanontext' => 'कृपा कऽ $1 अहाà¤à¤• साकांकà¥à¤·-सूचीकेठदेखबा वा समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करबा लेल।',
+'watchnologin' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै',
+'watchnologintext' => 'अहाठ[[Special:UserLogin|समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤]] साकांकà¥à¤·-सूची संशोधित करबा लेल।',
+'addedwatch' => 'साकांकà¥à¤· सूचीमे जोड़ू',
+'addedwatchtext' => "पनà¥à¤¨à¤¾ \"[[:\$1]]\" अहाà¤à¤• [[Special:Watchlist|साकांकà¥à¤· सूची]] मे जोड़ल गेल।
+ठपनà¥à¤¨à¤¾à¤®à¥‡ भविषà¥à¤¯à¤• परिवरà¥à¤¤à¤¨ आ à¤à¤•à¤° समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ चौबटिया पनà¥à¤¨à¤¾ à¤à¤¤à¤ सूचीबदà¥à¤§ रहत, आ पनà¥à¤¨à¤¾ [[Special:RecentChanges|हालक परिवरà¥à¤¤à¤¨]]मे '''गाढ़''' देखाà¤à¤¤ , जइसठआसानीसठà¤à¤•à¤°à¤¾ चिनà¥à¤¹à¤² जा सकत।",
+'removedwatch' => 'साकांकà¥à¤· सूचीसठहटाà¤à¤² गेल',
+'removedwatchtext' => 'पनà¥à¤¨à¤¾ "[[:$1]]" हटाà¤à¤² गेल [[Special:Watchlist|अहाà¤à¤• साकांकà¥à¤·à¤¸à¥‚ची]] सà¤à¥¤',
+'watch' => 'ताकिमे',
+'watchthispage' => 'ठपृषà¥à¤ à¤ªà¤° नजरि राखू',
+'unwatch' => 'छोड़ू',
+'unwatchthispage' => 'देखनाइ छोड़ू',
+'notanarticle' => 'कोनो विषय सूची नै',
+'notvisiblerev' => 'कोनो दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ कà¤à¤² अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨ मेटा देल गेल',
+'watchnochange' => 'अहाà¤à¤• साकांकà¥à¤· सूचीमे सठकोनोमे ठअवधिमे समà¥à¤ªà¤¾à¤¦à¤¨ नै कà¤à¤² गेल।',
+'watchlist-details' => '{{PLURAL:$1|$1 पनà¥à¤¨à¤¾|$1 पनà¥à¤¨à¤¾ सभ}} अहाà¤à¤• साकांकà¥à¤·à¤¸à¥‚चीमे, चौबटिया पनà¥à¤¨à¤¾ नै गानल गेल।',
+'wlheader-enotif' => '* ई-पतà¥à¤° सूचना लागू अछि।',
+'wlheader-showupdated' => "* पनà¥à¤¨à¤¾ सभ जे अहाà¤à¤• à¤à¤¤à¤ अनà¥à¤¤à¤¿à¤® बेर अà¤à¤²à¤¾à¤• बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
+'watchmethod-recent' => 'साकांकà¥à¤· सूचीक हालक समà¥à¤ªà¤¾à¤¦à¤¨ जाà¤à¤šà¤¿ रहल छी',
+'watchmethod-list' => 'साकांकà¥à¤·-सूचीक हालक समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ देखि रहल छी',
+'watchlistcontains' => 'अहाà¤à¤• साकांकà¥à¤·-सूचीमे अछि $1 {{PLURAL:$1|पनà¥à¤¨à¤¾|पनà¥à¤¨à¤¾}}।',
+'iteminvalidname' => "'$1' क संग समसà¥à¤¯à¤¾, अमानà¥à¤¯ नाम ...",
+'wlnote' => "नीचाठ{{PLURAL:$1|is the last change|are the last '''$1''' changes}} अनà¥à¤¤à¤¿à¤® {{PLURAL:$2|hour|'''$2''' hours}}।",
+'wlshowlast' => 'देखाउ अनà¥à¤¤à¤¿à¤® $1 घणà¥à¤Ÿà¤¾ $2 दिन $3',
+'watchlist-options' => 'साकांकà¥à¤·à¤¸à¥‚चीक विकलà¥à¤ª सभ',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'ताकिमे...',
'unwatching' => 'छोड़ल ...',
+'enotif_mailer' => '{{जालसà¥à¤¥à¤²}} सूचना पतà¥à¤°à¤•',
+'enotif_reset' => 'सभ पनà¥à¤¨à¤¾à¤•à¥‡à¤ देखल चिनà¥à¤¹à¤¿à¤¤ करू',
+'enotif_newpagetext' => 'ई à¤à¤•à¤Ÿà¤¾ नव पनà¥à¤¨à¤¾ छी।',
+'enotif_impersonal_salutation' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
+'changed' => 'बदलल गेल',
+'created' => 'बनाà¤à¤² गेल',
+'enotif_subject' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पनà¥à¤¨à¤¾ $PAGETITLE भेल $CHANGEDORCREATED दà¥à¤µà¤¾à¤°à¤¾ $PAGEEDITOR',
+'enotif_lastvisited' => 'देखू $1 अपन अनà¥à¤¤à¤¿à¤® बेर अà¤à¤²à¤¾à¤• बादक परिवरà¥à¤¤à¤¨ लेल।',
+'enotif_lastdiff' => 'ठपरिवरà¥à¤¤à¤¨à¤•à¥‡à¤ देखबा लेल $1 देखू।',
+'enotif_anon_editor' => 'गà¥à¤ªà¥à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ $1',
+'enotif_body' => 'पà¥à¤°à¤¿à¤¯ $WATCHINGUSERNAME,
+
+
+ई {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पनà¥à¤¨à¤¾ $पनà¥à¤¨à¤¾à¤¶à¥€à¤°à¥à¤·à¤• $CHANGEDORCREATED कà¤à¤² गेल $PAGEEDITDATE तिथिकेठ$PAGEEDITOR दà¥à¤µà¤¾à¤°à¤¾, देखू $PAGETITLE_URL वरà¥à¤¤à¤®à¤¾à¤¨ संसà¥à¤•à¤°à¤£ लेल।
+
+$NEWPAGE
+
+समà¥à¤ªà¤¾à¤¦à¤•à¥€à¤¯: $PAGESUMMARY $PAGEMINOREDIT
+
+समà¥à¤ªà¤¾à¤¦à¤•à¤¸à¤ समà¥à¤ªà¤°à¥à¤• करू:
+ई-पतà¥à¤°: $PAGEEDITOR_EMAIL
+विकी: $PAGEEDITOR_WIKI
+
+आन परिवरà¥à¤¤à¤¨ भेलापर कोनो सूचना नै देल जाà¤à¤¤ जठअहाठई पनà¥à¤¨à¤¾ नै देखब।
+अपन साकांकà¥à¤· सूचीक सूचना पेबाक पà¥à¤°à¤•à¤¾à¤° अहाठबदलि सकै छी।
+
+ अहाà¤à¤• पà¥à¤°à¤¿à¤¯ {{ानà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} सूचना पà¥à¤°à¤£à¤¾à¤²à¥€
+
+--
+अपन ई-पतà¥à¤° सूचना पà¥à¤°à¤•à¤¾à¤° बदलबाक लेल देखू
+{{fullurl:{{#special:Preferences}}}}
+अपन साकांकà¥à¤·-सूची सूचना पà¥à¤°à¤•à¤¾à¤° बदलबाक लेल देखू
+{{fullurl:{{#special:Watchlist}}/edit}}
+
+अपन साकांकà¥à¤·-सूचीसठकोनो पनà¥à¤¨à¤¾ मेटेबाक लेल देखू
+$UNWATCHURL
+
+अपन अनà¥à¤­à¤µ बतेबा वा कोनो सहायता लेल:
+{{fullurl:{{MediaWiki:Helppage}}}}',
+
+# Delete
+'deletepage' => 'पनà¥à¤¨à¤¾ मेटाउ',
+'confirm' => 'पकà¥à¤•à¤¾ छी',
+'excontent' => 'विषय छल:"$1"',
+'excontentauthor' => 'पाठ छल:"$1" (आ à¤à¤•à¤®à¤¾à¤¤à¥à¤° योगदान दैबला छल "[[Special:Contributions/$2|$2]]")',
+'exbeforeblank' => 'खतम होà¤à¤¬à¤¾à¤• पहिने पाठ छल:"$1"',
+'exblank' => 'पनà¥à¤¨à¤¾ खाली छल',
+'delete-confirm' => '$1 केठमेटाउ',
+'delete-legend' => 'मेटाउ',
+'historywarning' => "'''चेतौनी:''' जे पनà¥à¤¨à¤¾ अहाठमेटबैबला छी तकर इतिहास अछि लगभग $1 {{PLURAL:$1|revision|revisions}}:",
+'confirmdeletetext' => 'अहाठसभटा इतिहासक संग ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ हटाबऽ जा रहल छी।
+अहाठई सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करू जे अहाठई करऽ चाहै छी, अहाà¤à¤•à¥‡à¤ à¤à¤•à¤° परिणामक अवगति अछि आ अहाठई ठ[[{{MediaWiki:Policy-url}}|नीति]] क अनà¥à¤¸à¤¾à¤° कऽ रहल छी।',
+'actioncomplete' => 'कà¥à¤°à¤¿à¤¯à¤¾ पूरà¥à¤£',
+'actionfailed' => 'कारà¥à¤¯ नै भेल',
+'deletedtext' => '"<nowiki>$1</nowiki>" केठमेटा देल गेल अछि।
+देखू $2 हालक मेटाà¤à¤² सामिगà¥à¤°à¥€à¤• अभिलेख लेल।',
+'deletedarticle' => 'मेटाà¤à¤² "[[$1]]"',
+'suppressedarticle' => 'दबाà¤à¤² "[[$1]]"',
+'dellogpage' => 'मेटाà¤à¤² सामिगà¥à¤°à¥€à¤• वृतà¥à¤¤à¤²à¥‡à¤–',
+'dellogpagetext' => 'नीचाठà¤à¤•à¤¦à¤® हालक मेटाà¤à¤²à¤¬à¤²à¤¾ सूची अछि।',
+'deletionlog' => 'मेटाà¤à¤² सामिगà¥à¤°à¥€à¤• वृतà¥à¤¤à¤²à¥‡à¤–',
+'reverted' => 'पà¥à¤°à¤¾à¤¨ कोनो संशोधन धरि घà¥à¤°à¤¾à¤‰',
+'deletecomment' => 'कारण:',
+'deleteotherreason' => 'दोसर/ अतिरिकà¥à¤¤ कारण:',
+'deletereasonotherlist' => 'दोसर कारण',
+'deletereason-dropdown' => '* सामानà¥à¤¯ हटेबाक कारण
+** लेखक आगà¥à¤°à¤¹
+** सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
+** बिना मतलबक काà¤à¤Ÿ-छाà¤à¤Ÿ',
+'delete-edit-reasonlist' => 'मेटेबाक कारणक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'delete-toobig' => 'ठपनà¥à¤¨à¤¾à¤®à¥‡ बडà¥à¤¡ बेसी समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास अछि, $1 सठबेसी {{PLURAL:$1|revision|revisions}}।
+ओइ सभ पनà¥à¤¨à¤¾à¤• मेटाà¤à¤¬ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² गेल अछि जइसठआकसà¥à¤®à¤¿à¤• कà¥à¤·à¤¤à¤¿ नै हà¥à¤…ठ{{जालसà¥à¤¥à¤²à¤•}}।',
+'delete-warning-toobig' => 'ठपनà¥à¤¨à¤¾à¤®à¥‡ बडà¥à¤¡ समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास अछि, $1 सठबेसी {{PLURAL:$1|revision|revisions}}।
+à¤à¤•à¤°à¤¾ मेटेलापर दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ कà¥à¤°à¤¿à¤¯à¤¾ {{जालसà¥à¤¥à¤²}} खतरामे पड़त;
+सतरà¥à¤•à¥€à¤¸à¤ आगाठबढ़ू।',
+
+# Rollback
+'rollback' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¿à¤¤ समà¥à¤ªà¤¾à¤¦à¤¨',
+'rollback_short' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¨',
+'rollbacklink' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¨',
+'rollbackfailed' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¨ असफल',
+'cantrollback' => 'समà¥à¤ªà¤¾à¤¦à¤¨ आपस नै भऽ सकै अछि;
+अनà¥à¤¤à¤¿à¤® योगदान दैबला ठपनà¥à¤¨à¤¾à¤• à¤à¤•à¤®à¤¾à¤¤à¥à¤° लेखक छी।',
+'alreadyrolled' => 'अनà¥à¤¤à¤¿à¤® समà¥à¤ªà¤¾à¤¦à¤¨à¤• पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¨ नै भऽ सकैठ[[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+कियो आन ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ पहिनहिये समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ वा पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¿à¤¤ कऽ देने अछि।
+ठपनà¥à¤¨à¤¾à¤• अनà¥à¤¤à¤¿à¤® समà¥à¤ªà¤¾à¤¦à¤¨ भेल अछि à¤à¤•à¤°à¤¾ दà¥à¤µà¤¾à¤°à¤¾ [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])।',
+'editcomment' => "समà¥à¤ªà¤¾à¤¦à¤¨ सार छल : \"''\$1''\"।",
+'revertpage' => 'समà¥à¤ªà¤¾à¤¦à¤¨ आपस कà¤à¤² गेल [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) सठअनà¥à¤¤à¤¿à¤® संशोधन धरि à¤à¤•à¤°à¤¾ दà¥à¤µà¤¾à¤°à¤¾ [[User:$1|$1]]।',
+'revertpage-nouser' => '(पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• नाम हटा देल गेल अछि) दà¥à¤µà¤¾à¤°à¤¾ केल गेल संपादनकेठफेरसठपà¥à¤°à¤¾à¤¨ सà¥à¤¥à¤¿à¤¤à¤¿à¤®à¥‡ आनि कऽ à¤à¤•à¤° पहिलà¥à¤• [[User:$1|$1]] सठबनल संसà¥à¤•à¤°à¤£à¤•à¥‡à¤ फेरसठताजा संसà¥à¤•à¤°à¤£ बनाऊ।',
+'rollback-success' => '$1 केर संपादन हटाऊ.
+$2 केर संपादित आखिरी अवतरण क पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करल गेल.',
+
+# Edit tokens
+'sessionfailure-title' => 'सतà¥à¤° विफल भ गेल',
+'sessionfailure' => 'à¤à¤¹à¤¨ लागैत अछि जे अहां के लागिन सतà¥à¤° में कोनो तà¥à¤°à¥à¤Ÿà¤¿ अछि. सतà¥à¤° अपहरण से बचाबय सं सावधानीक लेल अहां के अहि कà¥à¤°à¤¿à¤¯à¤¾à¤•à¤²à¤¾à¤ª क रदà¥à¤¦ क देल गेल. अहां पाछां के पृषà¥à¤  पर जौउ आ पृषà¥à¤  के फेर सं लोड क दोबारा कोशिश करू.',
+
# Protect
-'protectlogpage' => 'सà¥à¤°à¤•à¥à¤·à¤¾ लॉग',
-'prot_1movedto2' => '[[$1]] गेल à¤à¤¤à¤¯ [[$2]]',
+'protectlogpage' => 'सà¥à¤°à¤•à¥à¤·à¤¾ लॉग',
+'protectlogtext' => 'नीचाठकिछॠपनà¥à¤¨à¤¾ सà¥à¤°à¤•à¥à¤·à¤¾ आ पनà¥à¤¨à¤¾ असà¥à¤°à¤•à¥à¤·à¤¾à¤• सूची अछि।
+देखू [[Special:ProtectedPages|protected pages list]] हालक कारà¥à¤¯à¤°à¤¤ पनà¥à¤¨à¤¾ सà¥à¤°à¤•à¥à¤·à¤¾à¤• सूची लेल।',
+'protectedarticle' => 'रकà¥à¤·à¤¿à¤¤ "[[$1]]"',
+'modifiedarticleprotection' => '"[[$1]]" लेल बदलैत रकà¥à¤·à¤¾ सà¥à¤¤à¤°',
+'unprotectedarticle' => 'अरकà¥à¤·à¤¿à¤¤ "[[$1]]"',
+'movedarticleprotection' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° "[[$2]]" से बदल क "[[$1]]" क देल गेल.',
+'protect-title' => '"$1" लेल रकà¥à¤·à¤¾ सà¥à¤¤à¤° बदलू',
+'prot_1movedto2' => '[[$1]] गेल à¤à¤¤à¤¯ [[$2]]',
+'protect-legend' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤¤à¤¾ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करू.',
+'protectcomment' => 'कारण:',
+'protectexpiry' => 'खतम हà¤à¤¤:',
+'protect_expiry_invalid' => 'खतम हेबाक समठसही नै अछि।',
+'protect_expiry_old' => 'खतम हेबाक समठभूतमे अछि।',
+'protect-unchain-permissions' => 'आर सà¥à¤°à¤•à¥à¤·à¤¾ विकलà¥à¤ªà¤•à¥‡à¤ अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
+'protect-text' => "अहाठपनà¥à¤¨à¤¾à¤• रकà¥à¤·à¤¾ सà¥à¤¤à¤°à¤•à¥‡à¤ à¤à¤¤à¤ देखि आ परिवरà¥à¤¤à¤¿à¤¤ कऽ सकै छी '''<nowiki>$1</nowiki>'''.",
+'protect-locked-blocked' => "अहाठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤®à¥‡ रहि कऽ सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° नै बदलि सकै छी।
+à¤à¤¤à¤ पनà¥à¤¨à¤¾ '''$1''' लेल वरà¥à¤¤à¤®à¤¾à¤¨ नियत कà¤à¤² विकलà¥à¤ª अछि:",
+'protect-locked-dblock' => "सकà¥à¤°à¤¿à¤¯ दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° नै बदलल जा सकैà¤à¥¤
+à¤à¤¤à¤ '''$1''' लेल वरà¥à¤¤à¤®à¤¾à¤¨ नियत विकलà¥à¤ª देल अछि:",
+'protect-locked-access' => "अहाà¤à¤• खाता अहाà¤à¤•à¥‡à¤ रकà¥à¤·à¤¾ सà¥à¤¤à¤°à¤®à¥‡ परिवरà¥à¤¤à¤¨à¤• अधिकार नै दैत अछि।
+à¤à¤¤à¤ '''$1'''पनà¥à¤¨à¤¾à¤• वरà¥à¤¤à¤®à¤¾à¤¨ परिसà¥à¤¥à¤¿à¤¤à¤¿ देल गेल अछि:",
+'protect-cascadeon' => 'ई पनà¥à¤¨à¤¾ अखन रकà¥à¤·à¤¿à¤¤ अछि कारण ई ठमे समà¥à¤®à¤¿à¤²à¤¿à¤¤ अछि {{PLURAL:$1|पनà¥à¤¨à¤¾, जे अछि|पनà¥à¤¨à¤¾ सभ, जे सभ अछि}} तराउपड़ी रकà¥à¤·à¤£ लागू।
+अहाठठपनà¥à¤¨à¤¾à¤• रकà¥à¤·à¤¾ सà¥à¤¤à¤°à¤•à¥‡à¤ बदलि सकै छी, मà¥à¤¦à¤¾ ताइ सठतराउपड़ी रकà¥à¤·à¤¾à¤ªà¤° असर नै पड़त।',
+'protect-default' => 'सभ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ अधिकार दिअ',
+'protect-fallback' => '"$1" अनà¥à¤®à¤¤à¤¿ चाही',
+'protect-level-autoconfirmed' => 'नव आ अपंजीकृत पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
+'protect-level-sysop' => 'माइनजन मातà¥à¤°',
+'protect-summary-cascade' => 'तराउपड़ी',
+'protect-expiring' => 'खतम हà¤à¤¤ $1 (UTC)',
+'protect-expiry-indefinite' => 'अनिशà¥à¤šà¤¿à¤¤',
+'protect-cascade' => 'रकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾ ठपनà¥à¤¨à¤¾à¤ªà¤° संकलित अछि (तराउपड़ी रकà¥à¤·à¤¾)',
+'protect-cantedit' => 'अहाठठपनà¥à¤¨à¤¾à¤• रकà¥à¤·à¤¾ सà¥à¤¤à¤°à¤®à¥‡ परिवरà¥à¤¤à¤¨ नै कऽ सकै छी, कारण अहाà¤à¤•à¥‡à¤ à¤à¤•à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करबाक अनà¥à¤®à¤¤à¤¿ नै अछि।',
+'protect-othertime' => 'दोसर समà¤:',
+'protect-othertime-op' => 'दोसर समà¤',
+'protect-existing-expiry' => 'अखà¥à¤¨à¤•à¤¾ खतम हेबाक समठ: $3, $2',
+'protect-otherreason' => 'दोसर/ अतिरिकà¥à¤¤ कारण:',
+'protect-otherreason-op' => 'दोसर कारण',
+'protect-dropdown' => '*सामानà¥à¤¯ सà¥à¤°à¤•à¥à¤·à¤¾ कारण
+** अतà¥à¤¯à¤§à¤¿à¤• दकचब
+** अतà¥à¤¯à¤§à¤¿à¤• अनपेकà¥à¤·à¤¿à¤¤ संदेश
+** नोकसानबला समà¥à¤ªà¤¾à¤¦à¤¨ चेतौनी
+** बेसी पाठकबला पनà¥à¤¨à¤¾',
+'protect-edit-reasonlist' => 'मेटेबाक कारणक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'protect-expiry-options' => '१ घणà¥à¤Ÿà¤¾:1 hour,१ दिन:1 day,१ सपà¥à¤¤à¤¾à¤¹:1 week,२ सपà¥à¤¤à¤¾à¤¹:2 weeks,१ मास:1 month,३ मास:3 months,६ मास:6 months,१ साल:1 year,अनिशà¥à¤šà¤¿à¤¤:infinite',
+'restriction-type' => 'अनà¥à¤®à¤¤à¤¿:',
+'restriction-level' => 'अवरोध सà¥à¤¤à¤°:',
+'minimum-size' => 'नà¥à¤¯à¥‚न आकार',
+'maximum-size' => 'अधिक आकार:',
+'pagesize' => '(अषà¥à¤Ÿà¤•)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'संपादन',
+'restriction-move' => 'घसकाउ',
+'restriction-create' => 'बनाउ',
+'restriction-upload' => 'उपारोपण',
+
+# Restriction levels
+'restriction-level-sysop' => 'पूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤',
+'restriction-level-autoconfirmed' => 'अरà¥à¤§-रकà¥à¤·à¤¿à¤¤',
+'restriction-level-all' => 'कोनो सà¥à¤¤à¤°',
+
+# Undelete
+'undelete' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾ देखू',
+'undeletepage' => 'देखू आ फेरसठमेटाà¤à¤² पनà¥à¤¨à¤¾ आनू',
+'undeletepagetitle' => "''' ई मेटाà¤à¤² संशोधन लेने अछि [[:$1|$1]]à¤à¤•à¤°''' ।",
+'viewdeletedpage' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾ देखू',
+'undeletepagetext' => 'ई {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} अखनो जोगाà¤à¤² पेटारमे अछि आ फेरसठआनल नै जा सकैà¤à¥¤
+ई जोगाà¤à¤² पेटार बीच-बीचमे साफ करबाक चाही।',
+'undelete-fieldset-title' => 'संशोधन सभकेठघà¥à¤°à¤¾à¤‰',
+'undeleterevisions' => '$1{{PLURAL:$1|संशोधन|संशोधन सभ}} पेटारमे जोगाà¤à¤²',
+'undeletehistory' => 'जठअहाठपनà¥à¤¨à¤¾à¤•à¥‡à¤ फेरसठअनै छी, सभटा संशोधन पà¥à¤°à¤¾à¤¨ सà¥à¤¤à¤°à¤ªà¤° संशोधित भऽ जाà¤à¤¤à¥¤
+मेटेलाक बाद जठà¤à¤•à¤Ÿà¤¾ नव पनà¥à¤¨à¤¾ ओही नामसठबनाà¤à¤² गेल, आनल संशोधन सभ पà¥à¤°à¤¾à¤¨ इतिहासमे आà¤à¤¤à¥¤',
+'undeleterevdel' => 'पà¥à¤¨à¤ƒ अननाइ सफल नै हà¤à¤¤ जठई पनà¥à¤¨à¤¾à¤• शीरà¥à¤· वा संचिका संशोधनकेठआंशिक रूपेठमेटबैà¤à¥¤
+ओहेन सà¥à¤¥à¤¿à¤¤à¤¿à¤®à¥‡, अहाठसभसठनव मेटाà¤à¤² संशोधनक आगà¥à¤°à¤¹ खतम कऽ सकै छी वा सोà¤à¤¾à¤ आनि सकै छी।',
+'undeletehistorynoadmin' => 'ई पनà¥à¤¨à¤¾ मेटा देल गेल अछि।
+मेटेबाक कारण नीचाà¤à¤• सारांशमे देल गेल अछि, पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ विवरणक संग जे ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ मेटेबासठपूरà¥à¤µ संशोधित केने छथि।
+ठमेटाà¤à¤² संशोधन सभक पाठ मातà¥à¤° संचालक सभ लग उपलबà¥à¤§ अछि।',
+'undelete-revision' => 'मेटाà¤à¤² संशोधन à¤à¤•à¤° सभक $1 (अखन $4, केठ$5) दà¥à¤µà¤¾à¤°à¤¾ $3:',
+'undeleterevision-missing' => 'अमानà¥à¤¯ आ अनà¥à¤ªà¤²à¤¬à¥à¤§ संशोधन।
+अहाठलग à¤à¤•à¤Ÿà¤¾ खराप लागि हà¤à¤¤ वा पेटारसठसंशोधन आनि लेल गेल हà¤à¤¤ वा हटा देल गेल हà¤à¤¤à¥¤',
+'undelete-nodiff' => 'कोनो पà¥à¤°à¤¾à¤¨ संशोधन नै भेटल।',
+'undeletebtn' => 'घà¥à¤°à¤¾à¤‰',
+'undeletelink' => 'देखू/ पहिने जकाà¤',
+'undeleteviewlink' => 'देखू',
+'undeletereset' => 'फेरसठशà¥à¤°à¥‚ करू',
+'undeleteinvert' => 'उनटा चयन',
+'undeletecomment' => 'कारण:',
+'undeletedarticle' => 'फेरसठओहिना "[[$1]]"',
+'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisions}} घà¥à¤°à¤¾à¤à¤²',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 संशोधन|$1 संशोधन}} and {{PLURAL:$2|1 संचिका|$2 संचिका}} आनल',
+'undeletedfiles' => '{{PLURAL:$1|1 संचिका|$1 संचिका सभ}} आनल',
+'cannotundelete' => 'फेरसठनै आबि सकल;
+समà¥à¤­à¤µ जे कियो आन पहिनहिये à¤à¤•à¤°à¤¾ आनि लेने छथि।',
+'undeletedpage' => "'''$1 आनि लेल गेल'''$1
+पूछू [[Special:Log/delete|deletion log]] वरà¥à¤¤à¤®à¤¾à¤¨ मेटाà¤à¤² आ आनल सूची लेल।",
+'undelete-header' => 'देखू [[Special:Log/delete|the deletion log]] हालक मेटाà¤à¤² पनà¥à¤¨à¤¾ लेल।',
+'undelete-search-box' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾ सभकेठताकू',
+'undelete-search-prefix' => 'से शà¥à¤°à¥ भेल पनà¥à¤¨à¤¾ देखाबू.',
+'undelete-search-submit' => 'ताकू',
+'undelete-no-results' => 'à¤à¤¹à¥‡à¤¨ पनà¥à¤¨à¤¾ मेटाà¤à¤² पेटारमे नै भेटल।',
+'undelete-filename-mismatch' => 'समयानà¥à¤¸à¤¾à¤° $1: संचिकानाम नै मेल खेलक संचिका संशोधन नै आनल जा सकल',
+'undelete-bad-store-key' => '$1: संचिका मेटेबासठपहिने नै भेटल संचिका संशोधन आपस नै आबि सकल।',
+'undelete-cleanup-error' => 'बिना पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² संचिका "$1" केठमेटेबामे भà¥à¤°à¤® संकेत।',
+'undelete-missing-filearchive' => 'संचिका पेटार चेनà¥à¤¹ $1 केठनै आनि सकल कारण ई दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤®à¥‡ नै अछि।
+ई पहिनहिये आनि लेल गेल हà¤à¤¤à¥¤',
+'undelete-error-short' => 'संचिका अनबामे भà¥à¤°à¤® : $1',
+'undelete-error-long' => 'संचिका अनबामे भà¥à¤°à¤® संकेत भेटल:
+$1',
+'undelete-show-file-confirm' => 'की अहाठआशà¥à¤µà¤¸à¥à¤¤ छी जे अहाठसंचिकाक मेटाà¤à¤² संशोधन देखऽ चाहै छी "<nowiki>$1</nowiki>" सठ$2 पर $3?',
+'undelete-show-file-submit' => 'हà¤',
# Namespace form on various pages
+'namespace' => 'चेनà¥à¤¹à¤¾à¤¸à¥€ समूह',
+'invert' => 'उनटा चयन',
'blanknamespace' => '(मà¥à¤–à¥à¤¯)',
# Contributions
-'mycontris' => 'हमर योगदान',
+'contributions' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• योगदान सभ',
+'contributions-title' => '$1 लेल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• अवदान',
+'mycontris' => 'हमर योगदान',
+'contribsub2' => '$1 ($2) लेल',
+'nocontribs' => 'कोनो परिवरà¥à¤¤à¤¨ ठसठमेल नै खाइà¤à¥¤',
+'uctop' => '(शिखर)',
+'month' => 'माससठ(आ पहिने)',
+'year' => 'ठसाल (आ पहिने)',
-'sp-contributions-talk' => 'कहू',
+'sp-contributions-newbies' => 'नव खाताक अवदानकेठदेखाउ',
+'sp-contributions-newbies-sub' => 'नब सदसà¥à¤¯à¤• लेल.',
+'sp-contributions-newbies-title' => 'नब सदसà¥à¤¯à¤• योगदान',
+'sp-contributions-blocklog' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¬à¤²à¤¾ वृतà¥à¤¤à¤²à¥‡à¤–',
+'sp-contributions-deleted' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• मेटाà¤à¤² योगदान सभ',
+'sp-contributions-uploads' => 'उपारोपण',
+'sp-contributions-logs' => 'वृतà¥à¤¤à¤²à¥‡à¤– सभ',
+'sp-contributions-talk' => 'वारà¥à¤¤à¥à¤¤à¤¾',
+'sp-contributions-userrights' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारक पà¥à¤°à¤¬à¤¨à¥à¤§à¤¨',
+'sp-contributions-blocked-notice' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अखन पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।
+अदà¥à¤¯à¤¤à¤¨ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ वृतà¥à¤¤à¤²à¥‡à¤– लेखा सनà¥à¤¦à¤°à¥à¤­ नीचाठदेल अछि:',
+'sp-contributions-blocked-notice-anon' => 'ई अनिकेत अखन पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।
+अदà¥à¤¯à¤¤à¤¨ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ वृतà¥à¤¤à¤²à¥‡à¤– लेखा सनà¥à¤¦à¤°à¥à¤­ नीचाठदेल अछि:',
+'sp-contributions-search' => 'अवदानक लेल ताकू',
+'sp-contributions-username' => 'अनिकेत संकेत वा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®:',
+'sp-contributions-toponly' => 'मातà¥à¤° ओइ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ देखाउ जे अदà¥à¤¯à¤¤à¤¨ संशोधन छी।',
+'sp-contributions-submit' => 'ताकू',
# What links here
-'whatlinkshere' => 'à¤à¤¤à¤¯ कोन लिंक अछि',
-'whatlinkshere-links' => '↠लिंक',
+'whatlinkshere' => 'à¤à¤¤à¤¯ कोन लिंक अछि',
+'whatlinkshere-title' => '"$1" सठसमà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ पनà¥à¤¨à¤¾ सभ',
+'whatlinkshere-page' => 'पनà¥à¤¨à¤¾:',
+'linkshere' => "ई सभ पनà¥à¤¨à¤¾ समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि '''[[:$1]]''':",
+'nolinkshere' => "'''[[:$1]]''' पर कोनो पनà¥à¤¨à¤¾à¤• लागि नै अछि।",
+'nolinkshere-ns' => "कोनो पनà¥à¤¨à¤¾à¤• लागि '''[[:$1]]''' चà¥à¤¨à¤² नामगाममे नै अछि।",
+'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' => 'चलनी सभ',
# Block/unblock
-'blocklink' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित',
-'contribslink' => 'योगदान',
+'blockip' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
+'blockip-title' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
+'blockip-legend' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
+'blockiptext' => 'नीचाà¤à¤• आवेदनक पà¥à¤°à¤¯à¥‹à¤— कोनो खास अनिकेत वा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®à¤• लिखैक पà¥à¤°à¤µà¥‡à¤¶à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करबा लेल करू।
+ई अततà¥à¤¤à¤ƒ करैबलाक विरà¥à¤¦à¥à¤§ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ हà¥à¤…à¤, आ à¤à¤•à¤° अनà¥à¤¸à¤¾à¤° [[{{MediaWiki:Policy-url}}|policy]]।
+नीचाठसà¥à¤ªà¤·à¥à¤Ÿ कारण लिखू (जेना, खास पनà¥à¤¨à¤¾à¤•à¥‡à¤ देखबैत जतठअततà¥à¤¤à¤ƒ कà¤à¤² गेल अछि)।',
+'ipadressorusername' => 'अनिकेत संकेत वा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®:',
+'ipbexpiry' => 'खतम हà¤à¤¤:',
+'ipbreason' => 'कारण:',
+'ipbreasonotherlist' => 'दोसर कारण',
+'ipbreason-dropdown' => '*सामानà¥à¤¯ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ कारण
+** गलत सूचना घà¥à¤¸à¥‡à¤¨à¤¾à¤‡
+** पनà¥à¤¨à¤¾ सभसठपाठ हटेनाइ
+** बाहरी जालसà¥à¤¥à¤²à¤• अवांछित लागि
+** फालतू/ अवांछित सामिगà¥à¤°à¤¿à¤• पानà¥à¤¨à¤¾à¤®à¥‡ घà¥à¤¸à¤¾à¤à¤¬
+** धमकीबला वà¥à¤¯à¤µà¤¹à¤¾à¤°/ तंग करब
+** कà¤à¤• खाताकेठगरिआà¤à¤¬
+** अवांछित पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®',
+'ipbcreateaccount' => 'खाता निरà¥à¤®à¤¾à¤£ रोकू',
+'ipbemailban' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° पठेबासठरोकू',
+'ipbenableautoblock' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• ठअनिकेतक पà¥à¤°à¤¯à¥‹à¤—केठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू, आ कोनो दोसर अनिकेत पताकेठसेहो जतà¤à¤¸à¤ ओ समà¥à¤ªà¤¾à¤¦à¤¨à¤• पà¥à¤°à¤¯à¤¾à¤¸ करथि',
+'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' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• अपन आ वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾à¤ªà¤° नजरि राखू',
+'ipb-change-block' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤‚ पà¥à¤¨à¤ƒ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू ई विकलà¥à¤ªà¤• संग',
+'badipaddress' => 'अमानà¥à¤¯ आईपी पता',
+'blockipsuccesssub' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ सफल भेल',
+'ipb-edit-dropdown' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ कारण संपादित करू',
+'ipb-unblock-addr' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाà¤à¤² $1',
+'ipb-unblock' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ वा अनिकेतकें अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू',
+'ipb-blocklist' => 'अखà¥à¤¨à¤•à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित देखू',
+'ipb-blocklist-contribs' => '$1 लेल अवदान',
+'unblockip' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¤ हटाउ',
+'ipusubmit' => 'ई पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
+'unblocked' => '[[User:$1|$1]] अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² गेल',
+'unblocked-id' => '$1 अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² गेल',
+'ipblocklist' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ',
+'ipblocklist-legend' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ताकू',
+'ipblocklist-submit' => 'ताकू',
+'ipblocklist-localblock' => 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
+'ipblocklist-otherblocks' => 'दोसर {{PLURAL:$1|block|blocks}}',
+'infiniteblock' => 'अनिशà¥à¤šà¤¿à¤¤',
+'expiringblock' => 'खतम हà¤à¤¤ $1 क $2 केà¤',
+'anononlyblock' => 'अनाम मातà¥à¤°',
+'noautoblockblock' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ अशकà¥à¤¤',
+'createaccountblock' => 'लेखा निरà¥à¤®à¤¾à¤£ अशकà¥à¤¤ कà¤à¤²',
+'emailblock' => 'ई-पतà¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤',
+'blocklist-nousertalk' => 'अपन वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ नै कऽ सकब',
+'ipblocklist-empty' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¥‚ची खाली अछि।',
+'ipblocklist-no-results' => 'आगà¥à¤°à¤¹ कà¤à¤² अनिकेत वा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ नै कà¤à¤² गेल।',
+'blocklink' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित',
+'unblocklink' => 'नै बारल',
+'change-blocklink' => 'खणà¥à¤¡ बदलू',
+'contribslink' => 'योगदान',
+'blocklogpage' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ वृतà¥à¤¤à¤²à¥‡à¤–',
+'blocklogentry' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ [[$1]] à¤à¤•à¤° अनà¥à¤¤à¤¿à¤® तिथि अछि $2 $3',
+'unblocklogentry' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाà¤à¤² $1',
+'block-log-flags-anononly' => 'गà¥à¤ªà¥à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ मातà¥à¤°',
+'block-log-flags-nocreate' => 'लेखा निरà¥à¤®à¤¾à¤£ अशकà¥à¤¤ कà¤à¤²',
+'block-log-flags-noautoblock' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ अशकà¥à¤¤',
+'block-log-flags-noemail' => 'ई-मेल अवरà¥à¤¦à¥à¤§',
+'block-log-flags-nousertalk' => 'अपन वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ नै कऽ सकब',
+'block-log-flags-angry-autoblock' => 'नीक सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ देल गेल',
+'block-log-flags-hiddenname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® नà¥à¤•à¤¾à¤à¤²',
+'range_block_disabled' => 'समूह खणà¥à¤¡ बनेबाक संचालकक कà¥à¤·à¤®à¤¤à¤¾ अशकà¥à¤¤ कà¤à¤² गेल।',
+'ipb_expiry_invalid' => 'खतम हेबाक समठसही नै अछि।',
+'ipb_expiry_temp' => 'नà¥à¤•à¤¾à¤à¤² पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® खणà¥à¤¡ सà¥à¤¥à¤¾à¤¯à¥€ हेबाक चाही।',
+'ipb_hide_invalid' => 'ठखाताकेठदà¥à¤¬à¤¾ नै सकलौं; ठमे बडà¥à¤¡ बेसी समà¥à¤ªà¤¾à¤¦à¤¨ हà¤à¤¤à¥¤',
+'ipb_already_blocked' => '"$1" पहिनहियेसठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि',
+'ipb-otherblocks-header' => 'दोसर {{PLURAL:$1|block|blocks}}',
+'ipb_cant_unblock' => 'भà¥à¤°à¤®: खणà¥à¤¡ पहिचान $1 नै भेटल। ई पहिनहिये पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¤ मà¥à¤•à¥à¤¤ भऽ गेल हà¤à¤¤à¥¤',
+'ipb_blocked_as_range' => 'भà¥à¤°à¤®: अनिकेत $1 सोà¤à¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ नै अछि आ अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ नै कà¤à¤² जा सकैà¤à¥¤
+ई, मà¥à¤¦à¤¾, कà¥à¤·à¥‡à¤¤à¥à¤° $2 क अनà¥à¤¦à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि, जे अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² जा सकैà¤à¥¤',
+'ip_range_invalid' => 'अमानà¥à¤¯ अनिकेत कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤',
+'ip_range_toolarge' => 'समूह खणà¥à¤¡ पैघ अछि /$1 सभकेठअनà¥à¤®à¤¤à¤¿ नै छै।',
+'blockme' => 'हमरा पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
+'proxyblocker' => 'दोसराइत पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤•',
+'proxyblocker-disabled' => 'ई पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।',
+'proxyblockreason' => 'अहाà¤à¤• अनिकेत पता पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ भेल अछि कारण ई सोà¤à¥‡-सोठदोसराइत अछि।
+अहाठअपन अनà¥à¤¤à¤°à¥à¤œà¤¾à¤² सेवा दाता वा तकनीकी सहायकसठसमà¥à¤ªà¤°à¥à¤• करू आ ठगमà¥à¤­à¥€à¤° सà¥à¤°à¤•à¥à¤·à¤¾ समसà¥à¤¯à¤¾à¤• सूचना दिअ।',
+'proxyblocksuccess' => 'भेल।',
+'sorbsreason' => 'अहाà¤à¤• अनिकेत सूचित अछि सोà¤à¥‡-सोठदोसराइतक रूपमे {{जालसà¥à¤¥à¤²}} क डी.à¤à¤¨.à¤à¤¸.बी.à¤à¤².मे।',
+
+# Developer tools
+'lockdb' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू',
+'unlockdb' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू',
+'lockconfirm' => 'हà¤, हम सतà¥à¤¤à¥‡ दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करठचाहै छी।',
+'unlockconfirm' => 'हà¤, हम सतà¥à¤¤à¥‡ दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤•à¥‡à¤ अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करठचाहै छी।',
+'lockbtn' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू',
+'unlockbtn' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू',
+'locknoconfirm' => 'अहाठसà¥à¤µà¥€à¤•à¥ƒà¤¤à¤¿ बकà¥à¤¸à¤¾à¤•à¥‡à¤‚ टिक नै केने छी ।',
+'lockdbsuccesssub' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ सफल',
+'unlockdbsuccesssub' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटेलौं',
+'lockdbsuccesstext' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤à¤² गेल| <br />
+मोन राखू [[Special:UnlockDB|remove the lock]]अहांक रखरखाव ख़तम भेलाक बाद ।',
+'unlockdbsuccesstext' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित ।',
# Move page
-'1movedto2' => '[[$1]] गेल à¤à¤¤à¤¯ [[$2]]',
+'move-page' => '$1हटाउ',
+'move-page-legend' => 'पनà¥à¤¨à¤¾ घसकाउ',
+'movepagetext' => "नीचाà¤à¤• फॉरà¥à¤®à¤• पà¥à¤°à¤¯à¥‹à¤— पनà¥à¤¨à¤¾à¤• नाम बदलि देत, à¤à¤•à¤° सभटा इतिहासकेठनव नामक अनà¥à¤¤à¤°à¥à¤—त राखि देत।
+पà¥à¤°à¤¾à¤¨ शीरà¥à¤·à¤• नव पनà¥à¤¨à¤¾ लेल à¤à¤•à¤Ÿà¤¾ घà¥à¤°à¤¬à¥ˆà¤¬à¤²à¤¾ पनà¥à¤¨à¤¾ बनि जाà¤à¤¤à¥¤
+अहाठघà¥à¤°à¤¬à¥ˆà¤¬à¤²à¤¾ पनà¥à¤¨à¤¾à¤•à¥‡à¤ अदà¥à¤¯à¤¤à¤¨ कऽ सकै छी जे मूल शीरà¥à¤·à¤•à¤ªà¤° सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठजाइत अछि।
+जौं अहाठई नै करबाक निरà¥à¤£à¤¯ करै छी, निशà¥à¤šà¤¯ करू तकबा लेल [[Special:DoubleRedirects|double]] वा
+[[Special:BrokenRedirects|broken redirects]]
+अहाठठलेल जिमà¥à¤®à¥€à¤¦à¤¾à¤° छी जे समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ लिंक ओतै जाठजतठओकरा जेबाक चाही।
+
+मोन राखू कि पनà¥à¤¨à¤¾ '''नै''' घसकाउ जौं नव शीरà¥à¤·à¤•à¤ªà¤° पहिनहियेसठपनà¥à¤¨à¤¾ अछि, आ तखने ई करू जखन ओ खाली हà¥à¤…ठवा ओ à¤à¤•à¤Ÿà¤¾ घà¥à¤®à¤¬à¥ˆà¤¬à¤²à¤¾ पनà¥à¤¨à¤¾ हà¥à¤…ठवा ओइ पनà¥à¤¨à¤¾à¤• कोनो भूतकालक समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास नै हà¥à¤…à¤à¥¤
+à¤à¤•à¤° माने भेल जे अहाठकोनो पनà¥à¤¨à¤¾à¤• नाम परिवरà¥à¤¤à¤¨ कऽ पाछाठलऽ जा सकै छी जतठà¤à¤•à¤° नाममे परिवरà¥à¤¤à¤¨ कà¤à¤² गेल रहठजौं अहाà¤à¤¸à¤ गलती भेल अछि, आ अहाठओइ पनà¥à¤¨à¤¾à¤•à¥‡à¤ फेरसठदोबारा नै लिख सकै छी।
+
+
+'''चेतौनी!'''
+ई à¤à¤•à¤Ÿà¤¾ लोकपà¥à¤°à¤¿à¤¯ पनà¥à¤¨à¤¾à¤• लेल à¤à¤•à¤Ÿà¤¾ भयंकर आ बिना आशाक कà¤à¤² परिवरà¥à¤¤à¤¨ भऽ सकैà¤à¥¤
+आगाठबढ़ैसठपहिने अहाठई सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करू जे अहाठà¤à¤•à¤° परिणाम बà¥à¤à¥ˆ छी।",
+'movepagetext-noredirectfixer' => "नीचाà¤à¤• फॉरà¥à¤®à¤• पà¥à¤°à¤¯à¥‹à¤— पनà¥à¤¨à¤¾à¤• नाम बदलि देत, à¤à¤•à¤° सभटा इतिहासकेठनव नामक अनà¥à¤¤à¤°à¥à¤—त राखि देत।
+पà¥à¤°à¤¾à¤¨ शीरà¥à¤·à¤• नव पनà¥à¤¨à¤¾ लेल à¤à¤•à¤Ÿà¤¾ घà¥à¤°à¤¬à¥ˆà¤¬à¤²à¤¾ पनà¥à¤¨à¤¾ बनि जाà¤à¤¤à¥¤
+निशà¥à¤šà¤¯ करू तकबा लेल [[Special:DoubleRedirects|double]] वा[[Special:BrokenRedirects|broken redirects]]।
+अहाठठलेल जिमà¥à¤®à¥€à¤¦à¤¾à¤° छी जे समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ लिंक ओतै जाठजतठओकरा जेबाक चाही।
+
+मोन राखू कि पनà¥à¤¨à¤¾ '''नै''' घसकत जौं नव शीरà¥à¤·à¤•à¤ªà¤° पहिनहियेसठपनà¥à¤¨à¤¾ अछि, आ तखने ई करू जखन ओ खाली हà¥à¤…ठवा ओ à¤à¤•à¤Ÿà¤¾ घà¥à¤®à¤¬à¥ˆà¤¬à¤²à¤¾ पनà¥à¤¨à¤¾ हà¥à¤…ठवा ओइ पनà¥à¤¨à¤¾à¤• कोनो भूतकालक समà¥à¤ªà¤¾à¤¦à¤¨ इतिहास नै हà¥à¤…à¤à¥¤
+à¤à¤•à¤° माने भेल जे अहाठकोनो पनà¥à¤¨à¤¾à¤• नाम परिवरà¥à¤¤à¤¨ कऽ पाछाठलऽ जा सकै छी जतठà¤à¤•à¤° नाममे परिवरà¥à¤¤à¤¨ कà¤à¤² गेल रहठजौं अहाà¤à¤¸à¤ गलती भेल अछि, आ अहाठओइ पनà¥à¤¨à¤¾à¤•à¥‡à¤ फेरसठदोबारा नै लिख सकै छी।
+
+
+'''चेतौनी!'''
+ई à¤à¤•à¤Ÿà¤¾ लोकपà¥à¤°à¤¿à¤¯ पनà¥à¤¨à¤¾à¤• लेल à¤à¤•à¤Ÿà¤¾ भयंकर आ बिना आशाक कà¤à¤² परिवरà¥à¤¤à¤¨ भऽ सकैà¤à¥¤
+आगाठबढ़ैसठपहिने अहाठई सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करू जे अहाठà¤à¤•à¤° परिणाम बà¥à¤à¥ˆ छी।",
+'movepagetalktext' => "समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ चौबटिया पनà¥à¤¨à¤¾ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठघसकत à¤à¤•à¤° संग '''जौं:'''
+*à¤à¤•à¤Ÿà¤¾ खाली-नै चौबटिया पनà¥à¤¨à¤¾ पहिनहियेसठनव नामक संग अछि, वा
+*अहाठनीचाà¤à¤• बॉकà¥à¤¸ टिक हटा दी।
+
+ताइ परिसà¥à¤¥à¤¿à¤¤à¤¿à¤®à¥‡, अहाà¤à¤•à¥‡à¤ अपनेसठपनà¥à¤¨à¤¾à¤•à¥‡à¤, आवशà¥à¤¯à¤•à¤¤à¤¾à¤¨à¥à¤¸à¤¾à¤°, घसकाबऽ वा मिजà¥à¤à¤° करऽ पड़त।",
+'movearticle' => 'पनà¥à¤¨à¤¾ घसकाउ:',
+'moveuserpage-warning' => "'''चेतौनी!'''अहाठà¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾ घसका रहल छी | मोन राखू कि खाली पनà¥à¤¨à¤¾ घसकत आ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• नाम ''नै'' बदलत ।",
+'movenologin' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नै छी',
+'newtitle' => 'नव शीरà¥à¤·à¤•à¤ªà¤°:',
+'move-watch' => 'जड़ि पनà¥à¤¨à¤¾ आ छीप पनà¥à¤¨à¤¾ देखू',
+'movepagebtn' => 'पनà¥à¤¨à¤¾ घसकाउ',
+'pagemovedsub' => 'घसकल',
+'movepage-moved' => '\'\'\'"$1" घसकाà¤à¤² गेल "$2"\'\'\' पर',
+'movepage-moved-redirect' => 'à¤à¤•à¤Ÿà¤¾ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ बनाओल गेल छै.',
+'movepage-moved-noredirect' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ नहि बनाओल गेल छै.',
+'articleexists' => 'ओइ नामक à¤à¤•à¤Ÿà¤¾ पनà¥à¤¨à¤¾ पहिनहियेसठअछि, वा जे नाम अहाठचयन केने छी से वांछित नै अछि।
+कृपा कऽ दोसर नामक चयन करू।',
+'cantmove-titleprotected' => 'नब शीरà¥à¤·à¤• बनाबै सें रोकहि के कारण, अहां अहि ठाम पर कोनो आन पृषà¥à¤ à¤• ठाम बदलि नहि सकब.',
+'talkexists' => "'''ई पनà¥à¤¨à¤¾ सà¥à¤µà¤¯à¤‚ घसकाà¤à¤² गेल, मà¥à¤¦à¤¾ चौबटिया पनà¥à¤¨à¤¾ नै घसकाओल जा सकल कारण नव शीरà¥à¤·à¤•à¤ªà¤° à¤à¤•à¤Ÿà¤¾ à¤à¤¹à¤¨à¥‡ पहिनहियेसठअछि।
+कृपा कऽ à¤à¤•à¤°à¤¾ सभकेठअपनेसठमिजà¥à¤à¤° करू।'''",
+'movedto' => 'घसकाà¤à¤² गेल',
+'movetalk' => 'समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ चौबटिया पनà¥à¤¨à¤¾à¤•à¥‡à¤ घसकाउ',
+'move-subpages' => 'उपपृषà¥à¤  सेहो लेल जाऊ ($1 धरि)',
+'move-talk-subpages' => 'वारà¥à¤¤à¤¾ पृषà¥à¤ à¤• उपपृषà¥à¤  लेने जाऊ ($1 धरि)',
+'1movedto2' => '[[$1]] गेल à¤à¤¤à¤¯ [[$2]]',
+'1movedto2_redir' => 'घसकाà¤à¤² [[$1]] सठ[[$2]] घà¥à¤°à¥ˆà¤¸à¤ फराक',
+'movelogpage' => 'वृतà¥à¤¤à¤²à¥‡à¤– हटाउ',
+'movereason' => 'कारण:',
+'revertmove' => 'फेरसठवà¤à¤¹',
+'delete_and_move' => 'मेटाउ आ हटू',
+'delete_and_move_confirm' => 'हà¤, पनà¥à¤¨à¤¾ मेटाउ',
+'delete_and_move_reason' => 'घसकेबा लेल जगह बनेबा लेल मेटाà¤à¤² गेल',
+'immobile-source-page' => 'अहि पृषà¥à¤  के अहां कतौ नहि ल जा सकब',
+
+# Export
+'export' => 'पनà¥à¤¨à¤¾ सभकेठपठाउ',
+'export-submit' => 'निरà¥à¤¯à¤¾à¤¤',
+'export-addcattext' => 'अहि शà¥à¤°à¥‡à¤£à¥€ केर पनà¥à¤¨à¤¾ जोडू',
+'export-addcat' => 'जोडू',
+'export-addnstext' => 'अहि नामसà¥à¤¥à¤¾à¤¨ सें पनà¥à¤¨à¤¾ जोडू',
+'export-addns' => 'जोडू',
+'export-download' => 'संचिका रूपमे संरकà¥à¤·à¤£ करू',
+'export-templates' => 'सभटा नमूना शामिल करू',
+
+# Namespace 8 related
+'allmessages' => 'पà¥à¤°à¤£à¤¾à¤²à¥€à¤• सनà¥à¤¦à¥‡à¤¶',
+'allmessagesname' => 'नाम',
+'allmessagesdefault' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ संदेश पाठ',
+'allmessagesnotsupportedDB' => "ई पनà¥à¤¨à¤¾ पà¥à¤°à¤¯à¥‹à¤—मे नै आनल जा सकैठकारण '''\$wgUseDatabaseMessages''' अशकà¥à¤¤ कà¤à¤² अछि।",
+'allmessages-filter-legend' => 'चलनी',
+'allmessages-filter' => 'अपन हिसाबे अनà¥à¤•à¥‚लित कऽ छाà¤à¤Ÿà¥‚:',
+'allmessages-filter-unmodified' => 'अपरिवरà¥à¤¤à¤¿à¤¤',
+'allmessages-filter-all' => 'सभटा',
+'allmessages-filter-modified' => 'संशोधित',
+'allmessages-prefix' => 'उपसरà¥à¤—क आधारपर छाà¤à¤Ÿà¥‚:',
+'allmessages-language' => 'भाषा:',
+'allmessages-filter-submit' => 'चलू',
# Thumbnails
-'thumbnail-more' => 'पैघ',
+'thumbnail-more' => 'पैघ',
+'filemissing' => 'संचिका हेराà¤à¤²',
+'thumbnail_error' => 'लघà¥à¤šà¤¿à¤¤à¥à¤° निरà¥à¤®à¤¾à¤£ कालमे भà¥à¤°à¤®:$1',
+'djvu_page_error' => 'डेजावू पनà¥à¤¨à¤¾ सकक बाहर अछि',
+'djvu_no_xml' => 'डेजावू संचिकाक à¤à¤•à¥à¤¸.à¤à¤®.à¤à¤². नै आनि सकलौं',
+'thumbnail_invalid_params' => 'अमानà¥à¤¯ लघà¥à¤šà¤¿à¤¤à¥à¤° परिमिति',
+'thumbnail_dest_directory' => 'लकà¥à¤·à¥à¤¯ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ नै बना सकल',
+'thumbnail_image-type' => 'चितà¥à¤° पà¥à¤°à¤•à¤¾à¤° समरà¥à¤¥à¤¿à¤¤ नै अछि',
+'thumbnail_gd-library' => 'अपूरà¥à¤£ जी.डी.पà¥à¤¸à¥à¤¤à¤•à¤¾à¤²à¤¯ विनà¥à¤¯à¤¾à¤¸: पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ $1 अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤',
+'thumbnail_image-missing' => 'संचिका लगैठअनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤ अछि: $1',
+
+# Special:Import
+'import' => 'पनà¥à¤¨à¤¾ सभकेठआनू',
+'importinterwiki' => 'टà¥à¤°à¤¾à¤¨à¥à¤¸à¤µà¤¿à¤•à¥€ आनू',
+'import-interwiki-text' => 'à¤à¤•à¤Ÿà¤¾ विकी आ पनà¥à¤¨à¤¾ शीरà¥à¤·à¤• अनबाले चà¥à¤¨à¥‚।
+संशोधन तिथि आ समà¥à¤ªà¤¾à¤¦à¤•à¤• नाम सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रहत।
+सभटा टà¥à¤°à¤¾à¤¨à¥à¤¸à¤µà¤¿à¤•à¥€ आयात कà¥à¤°à¤¿à¤¯à¤¾ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ अछि [[Special:Log/import|import log]] पर।',
+'import-interwiki-source' => 'मूल विकी/ पनà¥à¤¨à¤¾:',
+'import-interwiki-history' => 'अठपनà¥à¤¨à¤¾à¤• सभटा इतिहास संशोधनक दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• बनाउ',
+'import-interwiki-templates' => 'सभटा नमूना शामिल करू',
+'import-interwiki-submit' => 'आनू',
+'import-interwiki-namespace' => 'लकà¥à¤·à¥à¤¯ नामगाम:',
+'import-upload-filename' => 'संचिकानाम:',
+'import-comment' => 'समीकà¥à¤·à¤¾:',
+'importtext' => 'मूल विकी [[Special:Export|export utility]] क पà¥à¤°à¤¯à¥‹à¤— कऽ संचिका पठाउ।
+अपन संगणकमे à¤à¤•à¤°à¤¾ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू आ à¤à¤¤à¤ उपारोपित करू।',
+'importstart' => 'पनà¥à¤¨à¤¾ सभकेठआनि रहल छी...',
+'import-revision-count' => '$1 {{PLURAL:$1|संशोधन|संशोधन सभ}}',
+'importnopages' => 'कोनो पनà¥à¤¨à¤¾ अनबा लेल नै बचल।',
+'imported-log-entries' => 'अनलौं $1 {{PLURAL:$1|log entry|log entries}}।',
+'importfailed' => 'आयात विफल: <nowiki>$1</nowiki>',
+'importunknownsource' => 'अजà¥à¤žà¤¾à¤¤ आयात सà¥à¤°à¥‹à¤¤ पà¥à¤°à¤•à¤¾à¤°',
+'importcantopen' => 'आयात संचिकाकेठनै खोलि सकलौं',
+'importbadinterwiki' => 'खराप अनà¥à¤¤à¤°à¤µà¤¿à¤•à¥€ लागि',
+'importnotext' => 'खाली वा बिना पाठक',
+'importsuccess' => 'आयात सफल!',
+'importhistoryconflict' => 'विरोधी इतिहास संशोधन अछि (ई पनà¥à¤¨à¤¾ भऽ सकैठपहिने आनल गेल हà¥à¤…à¤)',
+'importnosources' => 'कोनो टà¥à¤°à¤¾à¤¨à¥à¤¸à¤µà¤¿à¤•à¥€ आयात सà¥à¤°à¥‹à¤¤ परिभाषित नै अछि आ सोठइतिहास उपारोपण अशकà¥à¤¤ कà¤à¤² अछि।',
+'importnofile' => 'कोनो आयातित संचिका उपारोपित नै भेल।',
+'importuploaderrorsize' => 'संचिका उपारोपण विफल भेल।
+ई संचिका अनà¥à¤®à¤¤à¤¿ देल संचिका आकारसठपैघ अछि।',
+'importuploaderrorpartial' => 'आयातित संचिकाक उपारोपण विफल भेल।
+ई संचिका आंशिक रूपेठउपारोपित भेल।',
+'importuploaderrortemp' => 'आयात संचिकाक उपारोपण विफल भेल।
+à¤à¤•à¤Ÿà¤¾ असà¥à¤¥à¤¾à¤¯à¥€ संचयिका नै अछि।',
+'import-parse-failure' => 'à¤à¤•à¥à¤¸.à¤à¤®.à¤à¤². आयात विभाजन असफल भेल',
+'import-noarticle' => 'कोनो पनà¥à¤¨à¤¾ अनबा लेल नै बचल!',
+'import-nonewrevisions' => 'सभटा संशोधन पहिनहियेसठआयातित अछि।',
+'xml-error-string' => '$1 पाà¤à¤¤à¥€à¤ªà¤° $2, col $3 (byte $4): $5',
+'import-upload' => 'à¤à¤•à¥à¤¸.à¤à¤®.à¤à¤². दतà¥à¤¤à¤¾à¤‚श उपारोपित करू',
+'import-token-mismatch' => 'à¤à¤• उखराहाक दतà¥à¤¤à¤¾à¤‚श खतम भऽ गेल।
+फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
+'import-invalid-interwiki' => 'विशिषà¥à¤Ÿ विकीसठआयात नै कऽ सकै छी।',
# Import log
'importlogpage' => 'लॉगक आयात',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'हमर खेसरा पनà¥à¤¨à¤¾',
-'tooltip-pt-mytalk' => 'हमर वारà¥à¤¤à¥à¤¤à¤¾ पृषà¥à¤ ',
-'tooltip-pt-preferences' => 'हमर मोनपसंद',
-'tooltip-pt-watchlist' => 'पनà¥à¤¨à¤¾ सभ जकर परिवरà¥à¤¤à¥à¤¤à¤¨ पर अहाà¤à¤• नजरि अछि',
-'tooltip-pt-mycontris' => 'हमर योगदानक सूची',
-'tooltip-pt-login' => 'लॉग इन करब नीक, परञà¥à¤š आवशà¥à¤¯à¤• नहि.',
-'tooltip-pt-logout' => 'फेर आयब',
-'tooltip-ca-talk' => 'विषयसूचीक पनà¥à¤¨à¤¾à¤• संबंधमे वरà¥à¤¤à¥à¤¤à¤¾à¤²à¤¾à¤ª',
-'tooltip-ca-edit' => 'अहाठà¤à¤¹à¤¿ पनà¥à¤¨à¤¾à¤•à¥‡à¤ संपादित कठसकैत छी। कृपया सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करबासठपहिने पूरà¥à¤µà¤ªà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ बटम उपयोग करू।',
-'tooltip-search' => 'ताकू {{SITENAME}}',
-'tooltip-n-mainpage' => 'मà¥à¤–à¥à¤¯-पृषà¥à¤  केठदेखू',
-'tooltip-n-portal' => 'पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿà¤• विषयमे,अहाठकी कठसकैत छी,वसà¥à¤¤à¥ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ सà¥à¤¥à¤²',
-'tooltip-n-currentevents' => 'लगक घटनाक विषयमे आधार सूचना पà¥à¤°à¤¾à¤ªà¥à¤¤ करू।',
-'tooltip-n-recentchanges' => 'विकीमे लगक परिवरà¥à¤¤à¥à¤¤à¤¨à¤• सूची.',
-'tooltip-n-randompage' => 'कोनो अनिरà¥à¤§à¤¾à¤°à¤¿à¤¤ पनà¥à¤¨à¤¾ लोड करू',
-'tooltip-n-help' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤ करबाक सà¥à¤¥à¤¾à¤¨.',
-'tooltip-t-whatlinkshere' => 'सभटा विकी-पनà¥à¤¨à¤¾à¤• सूची जकर à¤à¤¤à¤¯ लिंक अछि',
-'tooltip-t-upload' => 'चितà¥à¤° आकि मीडिया फाइलकेठअपलोड करू',
-'tooltip-t-specialpages' => 'सभटा विशेष पनà¥à¤¨à¤¾à¤• सूची',
-'tooltip-save' => 'अपन परिवरà¥à¤¤à¥à¤¤à¤¨à¤•à¥‡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू',
-'tooltip-preview' => 'परिवरà¥à¤¤à¥à¤¤à¤¨à¤• पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨, संजोगबाक पहिने à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— करू!',
-'tooltip-diff' => 'देखाऊ जे परिवरà¥à¤¤à¥à¤¤à¤¨ अहाठà¤à¤¹à¤¿ लेखमे कà¤à¤²à¤¹à¥à¤à¥¤',
+'tooltip-pt-userpage' => 'अहाà¤à¤• खेसरा पनà¥à¤¨à¤¾',
+'tooltip-pt-mytalk' => 'अहाà¤à¤• वारà¥à¤¤à¥à¤¤à¤¾ पृषà¥à¤ ',
+'tooltip-pt-preferences' => 'हमर मोनपसंद',
+'tooltip-pt-watchlist' => 'पनà¥à¤¨à¤¾ सभ जकर परिवरà¥à¤¤à¥à¤¤à¤¨ पर अहाà¤à¤• नजरि अछि',
+'tooltip-pt-mycontris' => 'अहाà¤à¤• योगदानक सूची',
+'tooltip-pt-login' => 'लॉग इन करब नीक, परञà¥à¤š आवशà¥à¤¯à¤• नहि.',
+'tooltip-pt-logout' => 'फेर आयब',
+'tooltip-ca-talk' => 'विषयसूचीक पनà¥à¤¨à¤¾à¤• संबंधमे वरà¥à¤¤à¥à¤¤à¤¾à¤²à¤¾à¤ª',
+'tooltip-ca-edit' => 'अहाठà¤à¤¹à¤¿ पनà¥à¤¨à¤¾à¤•à¥‡à¤ संपादित कठसकैत छी। कृपया सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करबासठपहिने पूरà¥à¤µà¤ªà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ बटम उपयोग करू।',
+'tooltip-ca-addsection' => 'नव खणà¥à¤¡ शà¥à¤°à¥‚ करू',
+'tooltip-ca-viewsource' => 'ठपनà¥à¤¨à¤¾à¤ªà¤° वरदहसà¥à¤¤ छै।
+अहाठà¤à¤•à¤° जड़ि देख सकै छी।',
+'tooltip-ca-history' => 'ठपृषà¥à¤ à¤• पहिलà¥à¤•à¤¾ परिवरà¥à¤¤à¤¨ सभ',
+'tooltip-ca-protect' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ बचाउ',
+'tooltip-ca-delete' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ मेटाउ',
+'tooltip-ca-move' => 'ठपृषà¥à¤ à¤•à¥‡à¤ हटाउ',
+'tooltip-ca-watch' => 'आइ पनà¥à¤¨à¤¾à¤•à¥‡à¤ अपन साकांकà¥à¤·à¤¸à¥‚चीमे राखू',
+'tooltip-ca-unwatch' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ हमर साकांकà¥à¤· सूचीसठहटाउ',
+'tooltip-search' => 'ताकू {{SITENAME}}',
+'tooltip-search-go' => 'पृषà¥à¤ à¤ªà¤° जाऊ जौं à¤à¤¨à¤®à¥‡à¤¨ पृषà¥à¤  रहà¤',
+'tooltip-search-fulltext' => 'ठजानकारीले ताकू पृषà¥à¤  सभमे ताकू',
+'tooltip-p-logo' => 'समà¥à¤®à¥à¤– पनà¥à¤¨à¤¾ देखू',
+'tooltip-n-mainpage' => 'मà¥à¤–à¥à¤¯-पृषà¥à¤  केठदेखू',
+'tooltip-n-mainpage-description' => 'मà¥à¤–à¥à¤¯à¤¾ पनà¥à¤¨à¤¾à¤ªà¤° जाउ',
+'tooltip-n-portal' => 'पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿà¤• विषयमे,अहाठकी कठसकैत छी,वसà¥à¤¤à¥ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ सà¥à¤¥à¤²',
+'tooltip-n-currentevents' => 'लगक घटनाक विषयमे आधार सूचना पà¥à¤°à¤¾à¤ªà¥à¤¤ करू।',
+'tooltip-n-recentchanges' => 'विकीमे लगक परिवरà¥à¤¤à¥à¤¤à¤¨à¤• सूची.',
+'tooltip-n-randompage' => 'कोनो अनिरà¥à¤§à¤¾à¤°à¤¿à¤¤ पनà¥à¤¨à¤¾ लोड करू',
+'tooltip-n-help' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤ करबाक सà¥à¤¥à¤¾à¤¨.',
+'tooltip-t-whatlinkshere' => 'सभटा विकी-पनà¥à¤¨à¤¾à¤• सूची जकर à¤à¤¤à¤¯ लिंक अछि',
+'tooltip-t-recentchangeslinked' => 'ठपृषà¥à¤ à¤• लागिक पनà¥à¤¨à¤¾à¤®à¥‡ भेल नव परिवरà¥à¤¤à¤¨',
+'tooltip-feed-rss' => 'ठपनà¥à¤¨à¤¾ लेल आर.à¤à¤¸.à¤à¤¸. सूचना',
+'tooltip-feed-atom' => 'ठपनà¥à¤¨à¤¾ लेल अणॠसमदिया',
+'tooltip-t-contributions' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• योगदानक सूची देखू',
+'tooltip-t-emailuser' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° पठाउ',
+'tooltip-t-upload' => 'चितà¥à¤° आकि मीडिया फाइलकेठअपलोड करू',
+'tooltip-t-specialpages' => 'सभटा विशेष पनà¥à¤¨à¤¾à¤• सूची',
+'tooltip-t-print' => 'ठपृषà¥à¤ à¤• छपैबला रूप',
+'tooltip-t-permalink' => 'पनà¥à¤¨à¤¾à¤• ठसंवरà¥à¤§à¤¨à¤• सà¥à¤¥à¤¾à¤¯à¥€ लिंक',
+'tooltip-ca-nstab-main' => 'विषय सूचीबला पनà¥à¤¨à¤¾ देखू',
+'tooltip-ca-nstab-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾à¤•à¥‡à¤ देखू',
+'tooltip-ca-nstab-media' => 'मीडिया पृषà¥à¤  देखू',
+'tooltip-ca-nstab-special' => 'ई à¤à¤•à¤Ÿà¤¾ विशिषà¥à¤Ÿ पनà¥à¤¨à¤¾ छी, अहाठअही पनà¥à¤¨à¤¾à¤•à¥‡à¤ संपादित नै कऽ सकै छी',
+'tooltip-ca-nstab-project' => 'परियोजना पनà¥à¤¨à¤¾ देखू',
+'tooltip-ca-nstab-image' => 'पनà¥à¤¨à¤¾à¤• पृषà¥à¤  देखू',
+'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' => '"फेरसठवà¤à¤¹" समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ पूरà¥à¤µà¤¸à¥à¤¥à¤¿à¤¤à¤¿à¤®à¥‡ लऽ जाइठआ पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ अवसà¥à¤¥à¤¾à¤®à¥‡ समà¥à¤ªà¤¾à¤¦à¤¨ फॉरà¥à¤® खोलैà¤à¥¤ ई सारांशमे कारण जोड़बाक विकलà¥à¤ª दैत अछि।',
+'tooltip-preferences-save' => 'मोनपसंद के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू',
+'tooltip-summary' => 'छोट संकà¥à¤·à¥‡à¤ª दिअ',
+
+# Attribution
+'anonuser' => '{{SITENAME}} नà¥à¤•à¤¾à¤¯à¤² पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ $1',
+'othercontribs' => '$1 के काजà¥à¤• तरहे',
+'others' => 'दोसर, आन',
+'nocredits' => 'अहि पनà¥à¤¨à¤¾à¤• लेल कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ ज़ानकारी नहि अछि',
+
+# Info page
+'infosubtitle' => 'पृषà¥à¤ à¤• लेल नब गप',
+'numedits' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤• संखà¥à¤¯à¤¾ (पृषà¥à¤ ) : $1',
+'numauthors' => 'अलग लेखकक संखà¥à¤¯à¤¾ (पृषà¥à¤ ): $1',
+
+# Patrol log
+'patrol-log-line' => 'चेनà¥à¤¹à¤¾à¤¸à¥€ देल $2 क $1 संचालित $3',
+'patrol-log-diff' => 'संशोधन $1',
+
+# Browsing diffs
+'previousdiff' => 'पà¥à¤°à¤¾à¤¨ समà¥à¤ªà¤¾à¤¦à¤¨',
+'nextdiff' => 'नव समà¥à¤ªà¤¾à¤¦à¤¨',
+
+# Media information
+'file-info-size' => '$1 × $2 चितà¥à¤°à¤¾à¤£à¥, फाइल आकार: $3, माइम पà¥à¤°à¤•à¤¾à¤°: $4',
+'file-nohires' => '<छोट>à¤à¤¸à¤ बेशी आननà¥à¤¤à¤°à¥à¤¯ उपलबà¥à¤§ नै अछि।</छोट>',
+'svg-long-desc' => 'à¤à¤¸.वी.जी. फाइल, मामूली रूपमे $1 × $2 चितà¥à¤°à¤•à¤£, फाइलक आकार: $3',
+'show-big-image' => 'पूरà¥à¤£ आननà¥à¤¤à¤°à¥à¤¯',
+'file-info-gif-looped' => 'घà¥à¤°à¤¿à¤¯à¤¾à¤à¤²',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|खाका |खाका सभ }}',
+'file-info-png-looped' => 'घà¥à¤°à¤¿à¤¯à¤¾à¤à¤²',
+'file-info-png-repeat' => 'छà¥à¤…ल $1 {{PLURAL:$1|बेर|बेर}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|खाका |खाका सभ }}',
+
+# Special:NewFiles
+'newimages' => 'नव संचिका सबहक पेटार',
+'newimages-legend' => 'चलनी',
+'newimages-label' => 'संचिका नाम (वा ओकर अंश):',
+'showhidebots' => '($1 सà¥à¤µà¤šà¤¾à¤²à¤• सभ)',
+'noimages' => 'किछॠदेखबा योगà¥à¤¯ नै |',
+'ilsubmit' => 'ताकू',
+'bydate' => 'तारीख सं',
+'sp-newimages-showfrom' => '$2, $१ सं शà¥à¤°à¥‚ होइबला नव संचिका देखाउ',
# Bad image list
'bad_image_list' => 'फॉरà¥à¤®à¥‡à¤Ÿ निमà¥à¤¨ पà¥à¤°à¤•à¤¾à¤°à¥‡à¤ अछि:
@@ -304,7 +2496,194 @@ $messages = array(
ओही पंकà¥à¤¤à¥à¤¤à¤¿à¤• कोनो आर लिंक अपवाद सà¥à¤µà¤°à¥‚प अछि, उदाहरणसà¥à¤µà¤°à¥‚प पनà¥à¤¨à¤¾ जतय चितà¥à¤° पंकà¥à¤¤à¥à¤¤à¤¿à¤…हि पर होय।',
+# Metadata
+'metadata' => 'पà¥à¤°à¤¦à¤¤à¥à¤¤à¤¾à¤‚श',
+'metadata-help' => 'ई फाइल अतिरिकà¥à¤¤ सूचना दैत अछि, समà¥à¤­à¤µà¤¤à¤ƒ ई अंकीय कैमरा वा सà¥à¤•à¥ˆà¤¨à¤° दà¥à¤µà¤¾à¤°à¤¾ बनाà¤à¤² वा अंकण कठजोड़ल गेल अछि।
+जौं फाइलकेठमूल रूपसठपरिवरà¥à¤§à¤¿à¤¤ कà¤à¤² गेल हà¤à¤¤ तठकिछॠविवरण पूरà¥à¤£ रूपसठपरिवरà¥à¤§à¤¿à¤¤ फाइलमे नै देखाà¤à¤² गेल हà¤à¤¤à¥¤',
+'metadata-expand' => 'बढ़ाओल विवरण देखाउ।',
+'metadata-collapse' => 'विसà¥à¤¤à¥ƒà¤¤ विवरण नà¥à¤•à¤¾à¤‰',
+
+# EXIF tags
+'exif-imagewidth' => 'चौड़ाई',
+'exif-imagelength' => 'ऊà¤à¤š',
+'exif-bitspersample' => 'पà¥à¤°à¤¤à¤¿ भाग अषà¥à¤Ÿà¤•',
+'exif-compression' => 'घोकचेनाइक पदà¥à¤§à¤¤à¤¿',
+'exif-photometricinterpretation' => 'वरà¥à¤£ बिंदॠपà¥à¤°à¤•à¤¾à¤°',
+'exif-orientation' => 'अभिविनà¥à¤¯à¤¾à¤¸',
+'exif-samplesperpixel' => 'खंडक पà¥à¤°à¤•à¤¾à¤°',
+'exif-planarconfiguration' => 'दतांश सचियाà¤à¤¬',
+'exif-ycbcrpositioning' => 'Y आ Cक सà¥à¤¥à¤¾à¤¨',
+'exif-imagedescription' => 'चितà¥à¤° शीरà¥à¤·à¤•',
+
+'exif-meteringmode-0' => 'अजà¥à¤žà¤¾à¤¤',
+'exif-meteringmode-1' => 'औसत',
+'exif-meteringmode-3' => 'ठाम',
+'exif-meteringmode-4' => 'ठामे -ठाम',
+'exif-meteringmode-5' => 'पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨',
+'exif-meteringmode-6' => 'आंशिक',
+'exif-meteringmode-255' => 'आन',
+
+'exif-scenecapturetype-0' => 'मानक',
+'exif-scenecapturetype-1' => 'परिदृशà¥à¤¯',
+'exif-scenecapturetype-2' => 'चितà¥à¤°',
+'exif-scenecapturetype-3' => 'रातà¥à¤°à¤¿à¤• दृशà¥à¤¯',
+
+'exif-gaincontrol-0' => 'कोनो नै',
+
+'exif-contrast-0' => 'सामानà¥à¤¯',
+'exif-contrast-1' => 'नरम',
+'exif-contrast-2' => 'पखठायल',
+
+'exif-saturation-0' => 'सामानà¥à¤¯',
+
+'exif-sharpness-0' => 'सामानà¥à¤¯',
+'exif-sharpness-1' => 'नरम',
+'exif-sharpness-2' => 'पखठायल',
+
+'exif-subjectdistancerange-0' => 'अजà¥à¤žà¤¾à¤¤',
+'exif-subjectdistancerange-2' => 'लग सें देखू',
+'exif-subjectdistancerange-3' => 'दूर सें देखू',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'उतà¥à¤¤à¤°à¤¬à¤°à¤¿à¤¯à¤¾ अकà¥à¤·à¤¾à¤‚श',
+'exif-gpslatitude-s' => 'दखिनबरिया अकà¥à¤·à¤¾à¤‚श',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'पà¥à¤¬à¤°à¤¿à¤¯à¤¾ रेखांश',
+'exif-gpslongitude-w' => 'पछबरिया रेखांश',
+
+'exif-gpsstatus-a' => 'नापी चलि रहल छै',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'कि.मी. पà¥à¤°à¤¤à¤¿ घंटा',
+'exif-gpsspeed-m' => 'माईल पà¥à¤°à¤¤à¤¿ घंटा',
+'exif-gpsspeed-n' => 'गिरह',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'असल दिश',
+
+# External editor support
+'edit-externally' => 'ठफाइलकेठबाहरी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—सठहटाउ',
+'edit-externally-help' => '(देखू [http://www.mediawiki.org/wiki/Manual:External_editors setup instructions] विषेष जानकारी लेल)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'सभ',
+'namespacesall' => 'सभटा',
+'monthsall' => 'सभ',
+
+# action=purge
+'confirm_purge_button' => 'ठीक अछि',
+
+# Multipage image navigation
+'imgmultipageprev' => 'पहिलà¥à¤•à¤¾ पृषà¥à¤ ',
+'imgmultipagenext' => 'अगà¥à¤²à¤•à¤¾ पृषà¥à¤ ',
+'imgmultigo' => 'जाऊ',
+'imgmultigoto' => '$1 पृषà¥à¤  पर जाऊ',
+
+# Table pager
+'table_pager_limit_submit' => 'जाऊ',
+
+# Watchlist editor
+'watchlistedit-raw-titles' => 'शीरà¥à¤·à¤•',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨ सभकेठदेखू',
+'watchlisttools-edit' => 'साकांकà¥à¤·à¤¸à¥‚चीकेठदेखू आ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
+'watchlisttools-raw' => 'काà¤à¤š साकांकà¥à¤·à¤¸à¥‚ची संपादित करू',
+
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'चेतौनी:\'\'\' पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ विनà¥à¤¯à¤¾à¤¸ चाभी "$2" पहिलà¥à¤•à¤¾ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ विनà¥à¤¯à¤¾à¤¸ चाभी "$1" केठखतम करैà¤à¥¤',
+
+# Special:Version
+'version' => 'संसà¥à¤•à¤°à¤£',
+'version-extensions' => 'संसà¥à¤•à¤°à¤£à¤• आगाà¤',
+'version-specialpages' => 'खास पनà¥à¤¨à¤¾',
+'version-other' => 'आन',
+'version-software-product' => 'उतà¥à¤ªà¤¾à¤¦',
+'version-software-version' => 'संसà¥à¤•à¤°à¤£',
+
+# Special:FilePath
+'filepath-page' => 'संचिका',
+'filepath-submit' => 'जाऊ',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-submit' => 'ताकू',
+
# Special:SpecialPages
-'specialpages' => 'विशेष पनà¥à¤¨à¤¾',
+'specialpages' => 'विशेष पनà¥à¤¨à¤¾',
+'specialpages-group-maintenance' => 'सà¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨',
+'specialpages-group-other' => 'दोसर विशेष पनà¥à¤¨à¤¾',
+'specialpages-group-login' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶/ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ आवेदन',
+'specialpages-group-changes' => 'हालक परिवरà¥à¤¤à¤¨ आ वृतà¥à¤¤à¤²à¥‡à¤–',
+'specialpages-group-media' => 'मीडिया पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨ आ उपारोपण',
+'specialpages-group-users' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ आ अधिकार',
+'specialpages-group-highuse' => 'बेसी पà¥à¤°à¤¯à¥‹à¤—बला पनà¥à¤¨à¤¾ सभ',
+'specialpages-group-pages' => 'पनà¥à¤¨à¤¾ सभक सूची',
+'specialpages-group-pagetools' => 'पनà¥à¤¨à¤¾à¤• औजार सभ',
+'specialpages-group-wiki' => 'विकी दतà¥à¤¤à¤¾à¤‚श आ औजार सभ',
+'specialpages-group-redirects' => 'घà¥à¤°à¤¬à¥ˆà¤¬à¤²à¤¾ विशेष पनà¥à¤¨à¤¾ सभ',
+'specialpages-group-spam' => 'अनपेकà¥à¤·à¤¿à¤¤ संदेश औजार',
+
+# Special:BlankPage
+'blankpage' => 'खाली पनà¥à¤¨à¤¾',
+'intentionallyblankpage' => 'ई पनà¥à¤¨à¤¾ पलानि कऽ खाली छोड़ल गेल।',
+
+# External image whitelist
+'external_image_whitelist' => '# ठपाà¤à¤¤à¥€à¤•à¥‡à¤ à¤à¤•à¤¦à¤® ओहिना छोड़ि दियौ जेना ई अछि<pre>
+# सामानà¥à¤¯ वैचारिक खणà¥à¤¡ नीचाठराखू (// क बीचक खणà¥à¤¡ मातà¥à¤°)।
+# ई सभ बाहरी (ताजाताजी लागि) चितà¥à¤°à¤• सारà¥à¤µà¤¤à¥à¤°à¤¿à¤• विभव संकेतसठमेल खà¥à¤†à¤à¤² जाà¤à¤¤
+# ओ सभ जे मेल खाà¤à¤¤ से चितà¥à¤°à¤• रूपमे पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ हà¤à¤¤, नै तठखाली à¤à¤•à¤Ÿà¤¾ चितà¥à¤°à¤• लागि देखाà¤à¤² जाà¤à¤¤
+# # सठशà¥à¤°à¥‚ भेल पाà¤à¤¤à¥€ टिपà¥à¤ªà¤£à¥€à¤• रूपमे देखल जाà¤à¤¤à¥¤
+# ई बà¥à¤°à¤¹à¥à¤®à¤•à¥à¤·à¤°-लघà¥à¤µà¤•à¥à¤·à¤°à¤• फेरासठसà¥à¤µà¤¤à¤‚तà¥à¤° अछि।
+
+# सभटा सामानà¥à¤¯ कथन ठपाà¤à¤¤à¥€à¤¸à¤ ऊपर राखू। ठपाà¤à¤¤à¥€à¤•à¥‡à¤ à¤à¤•à¤¦à¤® ओहिना छोड़ू जेना ई अछि </pre>',
+
+# Special:Tags
+'tags' => 'मानà¥à¤¯ परिवरà¥à¤¤à¤¨ चेनà¥à¤¹ सभ',
+'tag-filter' => '[[Special:Tags|Tag]] छनà¥à¤¨à¤¾:',
+'tag-filter-submit' => 'चलनी',
+'tags-title' => 'चेनà¥à¤¹ सभ',
+'tags-intro' => 'ई पनà¥à¤¨à¤¾ चेनà¥à¤¹ सभकेठसूचित करैठजे तंतà¥à¤°à¤¾à¤‚श समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤ चिनà¥à¤¹à¤¿à¤¤ करà¤, आ ओकर अरà¥à¤¥ सेहो।',
+'tags-tag' => 'चेनà¥à¤¹à¤• नाम',
+'tags-display-header' => 'परिवरà¥à¤¤à¤¨ सूची सभक रूपरंग',
+'tags-description-header' => 'अरà¥à¤¥à¤• पूरà¥à¤£ विवरण',
+'tags-hitcount-header' => 'चेनà¥à¤¹à¤¯à¥à¤•à¥à¤¤ परिवरà¥à¤¤à¤¨ सभ',
+'tags-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'tags-hitcount' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¤¨|परिवरà¥à¤¤à¤¨ सभ}}',
+
+# Special:ComparePages
+'comparepages' => 'पनà¥à¤¨à¤¾ सभक तà¥à¤²à¤¨à¤¾ करू',
+'compare-selector' => 'पनà¥à¤¨à¤¾ सभक संशोधनक तà¥à¤²à¤¨à¤¾ करू',
+'compare-page1' => 'पनà¥à¤¨à¤¾ १',
+'compare-page2' => 'पनà¥à¤¨à¤¾ २',
+'compare-rev1' => 'संशोधन १',
+'compare-rev2' => 'संशोधन २',
+'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करू',
+
+# Database error messages
+'dberr-header' => 'ठविकीमे à¤à¤•à¤Ÿà¤¾ समसà¥à¤¯à¤¾ अछि',
+'dberr-problems' => 'दà¥à¤–ी छी!
+ई जालसà¥à¤¥à¤² तकनीकी समसà¥à¤¯à¤¾ अनà¥à¤­à¤µ कऽ अछि।',
+'dberr-again' => 'किछॠकाल बाट ताकू आ फेरसठभारित करू।',
+'dberr-info' => '(दतà¥à¤¤à¤¨à¤¿à¤§à¤¿ वितरककेठसमà¥à¤ªà¤°à¥à¤• नै कऽ सकल: $1)',
+'dberr-usegoogle' => 'ठबीचमे अहाठगूगलसठखोज कऽ सकै छी।',
+'dberr-outofdate' => 'मोन राखू जे हमर सामिगà¥à¤°à¥€à¤• ओकर सूची पà¥à¤°à¤¾à¤¨ भऽ सकैà¤à¥¤',
+'dberr-cachederror' => 'ई आगà¥à¤°à¤¹ कà¤à¤² पनà¥à¤¨à¤¾à¤• उपसà¥à¤®à¥ƒà¤¤à¤¿ संरकà¥à¤·à¤¿à¤¤ दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• अछि, आ भऽ सकैठजे अदà¥à¤¯à¤¤à¤¨ नै हà¥à¤…à¤à¥¤',
+
+# HTML forms
+'htmlform-invalid-input' => 'अहाà¤à¤• किछॠनिवेशनमे किछॠसमसà¥à¤¯à¤¾ भऽ सकैà¤à¥¤',
+'htmlform-select-badoption' => 'जे मान अहाठदेलौं से मानà¥à¤¯ विकलà¥à¤ª नै अछि।',
+'htmlform-int-invalid' => 'जे मान अहाठदेलौं से पूरà¥à¤£à¤¾à¤‚क नै छी।',
+'htmlform-float-invalid' => 'जे मान अहाठदेलौं से संखà¥à¤¯à¤¾ नै छी।',
+'htmlform-int-toolow' => 'जे मान अहाठदेलौं से नà¥à¤¯à¥‚नतम $1 सठनीचाठअछि।',
+'htmlform-int-toohigh' => 'जे मान अहाठदेलौं से अधिकतम $1 सठऊपर अछि।',
+'htmlform-required' => 'ई मान चाही',
+'htmlform-submit' => 'दिअ',
+'htmlform-reset' => 'परिवरà¥à¤¤à¤¨ खतम करू',
+'htmlform-selectorother-other' => 'आन',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 पूरà¥à¤£-पाठ खोज सहायता यà¥à¤•à¥à¤¤',
+'sqlite-no-fts' => '$1 बिन पूरà¥à¤£-पाठ खोज सहायताक',
);
diff --git a/languages/messages/MessagesMdf.php b/languages/messages/MessagesMdf.php
index 6d0157ad..3016cf6c 100644
--- a/languages/messages/MessagesMdf.php
+++ b/languages/messages/MessagesMdf.php
@@ -155,8 +155,7 @@ $messages = array(
'tog-editsection' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ ÑюлмафкÑÑ‚ÑŒ [петемÑ] Ñрь пÑлькÑонди',
'tog-editsectiononrightclick' => 'ÐŸÐµÑ‚Ð½ÐµÐ¼Ñ Ð¿ÑлькÑтне: Ð»ÑŽÐ¿ÑˆÑ‚Ð°Ð¼Ñ ÑёрмадомбÑлькÑÑ‚ÑŒ лемонц Ð»Ð°Ð½Ð³Ñ Ð²Ð¸Ð´ÐµÑˆÐ¸Ñ€Ðµ пунÑÑа (JavaScript)',
'tog-showtoc' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ñёрматфть Ð¿Ð¾Ñ‚Ð¼Ð°ÐºÑ (лопатнень, конатнень ÑÑа 3 Ñёрмадома конÑкÑта лама)',
-'tog-rememberpassword' => 'Ð’Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ Ñувама лемозе Ñ‚Ñ Ñодама машинаÑа',
-'tog-editwidth' => 'Келептть петнема пакÑÑÑ‚ÑŒ Ñембе вальмать келеÑ',
+'tog-rememberpassword' => 'Ð’Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ Ñувама лемозе Ñ‚Ñ Ñодама машинаÑа (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Ð¡ÑƒÐ²Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ тефть лопатне монь мельгеваномазон',
'tog-watchdefault' => 'Ð¡ÑƒÐ²Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ петнема лопане монь мельгеваномазон',
'tog-watchmoves' => 'Лопатнень шашфтомÑта ÑÑƒÐ²Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ñинь монь мельгеваномазон',
@@ -290,30 +289,19 @@ $messages = array(
'faqpage' => 'Project:СидеÑта Кеподеви КизефкÑне',
# Vector skin
-'vector-action-delete' => 'ÐардамÑ',
-'vector-action-move' => 'ШашфтомÑ',
-'vector-action-protect' => 'ÐраламÑ',
-'vector-action-undelete' => 'МърдафтомÑ',
-'vector-action-unprotect' => 'Ðралама лоткамÑ',
-'vector-namespace-category' => 'Категорие',
-'vector-namespace-help' => 'Ð›ÐµÐ·ÐºÑ Ð»Ð¾Ð¿Ð°',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Лопа',
-'vector-namespace-media' => 'Медиа лопа',
-'vector-namespace-mediawiki' => 'Пачфтема',
-'vector-namespace-project' => 'Проектонь лопа',
-'vector-namespace-special' => 'Башка тевонь лопа',
-'vector-namespace-talk' => 'Корхнема',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Тиинь лопа',
-'vector-view-create' => 'ТиемÑ',
-'vector-view-edit' => 'ПетнемÑ',
-'vector-view-history' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½ÑфтемÑ',
-'vector-view-view' => 'МорафтомÑ',
-'vector-view-viewsource' => 'ЛиÑьма нÑфтемÑ',
-'actions' => 'Тефне',
-'namespaces' => 'Лемботмот',
-'variants' => 'Вариатт',
+'vector-action-delete' => 'ÐардамÑ',
+'vector-action-move' => 'ШашфтомÑ',
+'vector-action-protect' => 'ÐраламÑ',
+'vector-action-undelete' => 'МърдафтомÑ',
+'vector-action-unprotect' => 'Ðралама лоткамÑ',
+'vector-view-create' => 'ТиемÑ',
+'vector-view-edit' => 'ПетнемÑ',
+'vector-view-history' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½ÑфтемÑ',
+'vector-view-view' => 'МорафтомÑ',
+'vector-view-viewsource' => 'ЛиÑьма нÑфтемÑ',
+'actions' => 'Тефне',
+'namespaces' => 'Лемботмот',
+'variants' => 'Вариатт',
'errorpagetitle' => 'ЭльбÑтькÑ',
'returnto' => 'ÐœÑŠÑ€Ð´Ð°Ð¼Ñ $1-Ñ.',
@@ -529,7 +517,7 @@ $2',
'yourname' => 'Тиить лемоц:',
'yourpassword' => 'Сувама валце:',
'yourpasswordagain' => 'Сёрматк Ñувама валце омбоцекÑ:',
-'remembermypassword' => 'Ð’Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ Ñувама лемозе Ñ‚Ñ Ñодама машинаÑа',
+'remembermypassword' => 'Ð’Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ Ñувама лемозе Ñ‚Ñ Ñодам машинаÑа (макÑимум $1 {{PLURAL:$1|шиÑ|шиÑ}})',
'yourdomainname' => 'Тонь доменце:',
'externaldberror' => 'ЛиÑÑÑŒ ÑльбÑÑ‚ÑŒÐºÑ ÑƒÑˆÐµÑˆÐ¸Ñ€ÐµÐ½ÑŒ датабазонь вельде кемокÑтакшнембачк Ñли тондейть аф мÑрьгови Ð¿Ð¾Ð»Ð°Ñ„Ð½ÐµÐ¼Ñ Ñ‚Ð¾Ð½ÑŒ ушеширень Ñёрматфтомацень.',
'login' => 'Сувама',
@@ -746,8 +734,6 @@ $2',
УлефтÑÑ€Ñй мÑльце тонь Ñёрмадоматнень петнелезь, Ñ‚Ñза Ñинь Ñ‚ÑÑ‚ путне.<br />
Тон Ñтане ина макÑат вал ÑÑнь колга Ð¼ÐµÑ Ñембе тонь Ñёрмадоматне тиить тонць Ñли Ñинь ÑÑвить марÑтонь Ñли Ð¸Ð»Ñ Ð¿Ð°Ð½Ð¶Ð°Ð´Ð° лиÑьмаÑта. (ванк $1).<br />
'''ТЯТ СУВÐФÐЕ КОПИЯМРВИДЕКССРÐРÐЛÐФ ÐœÐТЕРИÐЛХТ МЯРЬГОМÐФТОМÐ!'''",
-'longpagewarning' => "'''ИÐГОЛЕ КÐРДÐÐœÐ: Ð¢Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ кувалмоц $1 килобайтт; кодамога интернет полаткÑонь вальмава ÑтакаÑта Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ð»Ð¾Ð¿Ð°Ñ‚ 32 килобайтти мала Ñли ÑÑда кувака.
-ЭнÑльттÑма, арьÑек улендÑÑ€Ñй кода лопать ÑÐ²Ñ„Ñ‚Ð¾Ð¼Ñ ÑÑда ёмла пÑлькÑова.'''",
'longpageerror' => "'''ЭЛЬБЯТЬКС: Тонь текÑтцень кувалмоц $1 килобайтт, Ñ‚Ñ Ð¼Ð°ÐºÑимупть $2 килобайтта лама. Сонь аш кода ванфтомÑ.'''",
'readonlywarning' => "'''ИÐГОЛЕ КÐРДÐÐœÐ: ДатабазаÑÑŒ пÑкÑтаф петема покаматнень Ñюнеда, Ñ‚Ñ Ð¿Ð¸Ð½Ð³Ñта тондейть аш кода Ð²Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ñ‚Ð¾Ð½ÑŒ петнематнень. ШÑтьта тондейть пароль Ñинь Ð²Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ñ‚ÐµÐºÑÑ‚ Ñ„Ð°Ð¹Ð»Ñ Ð´Ð¸ Ð¿ÑƒÑ‚Ð¾Ð¼Ñ Ñ‚Ñза меле.'''
@@ -931,6 +917,7 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
# Diffs
'history-title' => '"$1"-нь верзиетнень иÑториÑÑна',
'difference' => '(ЯвомаÑÑŒ верзиетнень ёткова)',
+'difference-multipage' => 'ЯвомаÑÑŒ лопаланготнень ёткова',
'lineno' => 'КикÑÑÑŒ $1:',
'compareselectedversions' => 'ÐŸÑƒÑ‚Ð¾Ð¼Ñ ÐºÐ¾Ñ‡ÐºÐ°Ñ„ верзиетнень вакÑÑ',
'editundo' => 'валхтомÑ',
@@ -1326,7 +1313,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'fileexists-shared-forbidden' => 'ФайлÑÑŒ Ñ‚Ñ Ð»ÐµÐ¼Ñ‚ÑŒ мархта ульÑÑŒ ни марÑтонь файл пърдафкÑÑа. Сембе ÑÑка улендÑÑ€ÑÑ‚ÑŒ мÑльце Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ñ‚ÑŒ тонгомÑ, мърдак меки ди тонк Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ñ‚ÑŒ Ð¸Ð»Ñ Ð»ÐµÐ¼ мархта. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ð¢Ñ Ñ„Ð°Ð¹Ð»ÑÑŒ кафонзафоль {{PLURAL:$1|файл|файлхт}}:',
'file-deleted-duplicate' => 'ФайлÑÑŒ ÑÑка кода файл ([[:$1]]) нардафоль. Ванк файлонь нардама иÑториÑнц Ñонь Ð¾Ð´ÑƒÐºÑ Ñ‚Ð¾Ð½Ð³Ð¾Ð¼Ð°Ð½Ð·Ð° инголе.',
-'successfulupload' => 'ТонгодемаÑÑŒ ётаÑÑŒ лац',
'uploadwarning' => 'Тонгодемань инголе кардама',
'savefile' => 'Ð’Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ñ„Ð°Ð¹Ð»',
'uploadedimage' => 'тонгозь "[[$1]]"',
@@ -1344,6 +1330,7 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
ЛацкаÑта арьÑек Ð°Ñ„ÐºÑƒÐºÑ Ñ‚Ð¾Ð½ÑŒ ули мÑльце Ñонь тонгомонза Ñли аф. Ðардама лувома информациеÑÑŒ Ñ‚ÑÑа:",
'filename-bad-prefix' => "Тон тонгодьÑак файл конань лемоц ушеды '''\"\$1\"'''-Ñа. Стапт лепне лувовихть мезеньге аф колга Ð°Ð·Ð¾Ð½Ð´Ð¾Ð²Ð¸ÐºÑ ÑÑÑ Ð¼ÐµÑ Ñинь ÑÑÑŒ макÑÑевихть Ñ‚ÑшкÑкамераÑа тиф фотоархтофкÑненди (цифра камераÑа). ÐрьÑек Ð¸Ð»Ñ Ð»ÐµÐ¼, конаÑа ащель информациеда лама.",
+'upload-success-subj' => 'ТонгодемаÑÑŒ ётаÑÑŒ лац',
'upload-proto-error' => 'ÐÑ„ кондÑÑти протокол',
'upload-proto-error-text' => 'Ичкоздень тонгодеманди ÑÑ€Ñви URL-Ñ‚ ушедыхть <code>http://</code>-Ñа Ñли <code>ftp://</code>-Ñа.',
@@ -1474,7 +1461,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'statistics-edits-average' => 'Петнемат Ñ„ÐºÑ Ð»Ð¾Ð¿Ð°Ñ Ñ‘Ñ‚ÐºÑталувкÑÑта',
'statistics-views-total' => 'Ванондомада Ñембоц',
'statistics-views-peredit' => 'Ð¤ÐºÑ Ð¿ÐµÑ‚Ð½ÐµÐ¼Ð°Ñ Ð²Ð°Ð½Ð¾Ð½Ð´Ð¾Ð¼Ð°Ð´Ð°',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Покаматнень пулонь] кувалмоц',
'statistics-users' => 'Сёрматфтф [[Special:ListUsers|тиихне]]',
'statistics-users-active' => 'Покай тиихне',
'statistics-users-active-desc' => 'Тиихне конатне тиÑÑ‚ÑŒ мезеге ётай {{PLURAL:$1|шинÑ|$1 шиÑта}}',
@@ -1485,8 +1471,8 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'disambiguations-text' => "ÐÑ Ð»Ð¾Ð¿Ð°Ñ‚Ð½Ðµ Ñюлмафт '''лама Ñмузень лопа''' мархта. СиньдееÑÑ‚ ÑÑ€Ñвихть ÑÑŽÐ»Ð¼Ð°Ð¼Ñ Ð¸Ð»Ñ Ð±Ð°ÑˆÐºÐ° ÑёрмафкÑнень мархта.<br />ЛопаÑÑŒ лувови лама ÑÐ¼ÑƒÐ·ÐµÐ½Ð½ÐµÐºÑ Ð¼ÑŠÐ·Ñрда Ñон Ñюлмаф [[MediaWiki:Disambiguationspage]] ÐºÐµÐ¿Ð¾Ñ‚ÑŒÐºÑ Ð¼Ð°Ñ€Ñ…Ñ‚Ð°.",
'doubleredirects' => 'Кафонзаф умборондафтфкÑне',
-'doubleredirectstext' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ð½ÑŒ лувомаÑа нÑфтевихть умборондафтфкÑне Ñюлмафт Ð¸Ð»Ñ ÑƒÐ¼Ð±Ð¾Ñ€Ð¾Ð½Ð´Ð°Ñ„Ñ‚Ñ„ÐºÑнень мархта. Эрь луфкÑÑа (ÑтрокаÑа) улихть ваÑенце ди омбоце умборондафтфкÑнень ÑюлмафкÑÑна, Ñ‚ÑÑа тага ули омбоце умборондафтфкÑонь ваÑенце кикÑонцты ÑюлмафкÑÑÑŒ, тоÑа ули нÑфтемаÑÑŒ лопань лемонц Ð»Ð°Ð½Ð³Ñ ÐºÐ¾Ð½Ð°Ð½ÑŒ мархта ÑÑ€Ñволь ваÑенце умборондафтфкÑÑ‚ÑŒ ÑюлмафтомÑ.
-<s>Ð¢ÑƒÑ€ÐºÑ ÐºÐ¸ÐºÑ Ð¼Ð°Ñ€Ñ…Ñ‚Ð°</s> Ñ‚ÑшкÑне латцефольхть.',
+'doubleredirectstext' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ð½ÑŒ лувомаÑа нÑфтевихть умборондафтфкÑне Ñюлмафт Ð¸Ð»Ñ ÑƒÐ¼Ð±Ð¾Ñ€Ð¾Ð½Ð´Ð°Ñ„Ñ‚Ñ„ÐºÑнень мархта. Эрь луфкÑÑа (ÑтрокаÑа) улихть ваÑенце ди омбоце умборондафтфкÑнень ÑюлмафкÑÑна, Ñ‚ÑÑа тага ули омбоце умборондафтфкÑонь ваÑенце кикÑонцты ÑюлмафкÑÑÑŒ, тоÑа ули нÑфтемаÑÑŒ лопань лемонц Ð»Ð°Ð½Ð³Ñ ÐºÐ¾Ð½Ð°Ð½ÑŒ мархта ÑÑ€Ñволь ваÑенце умборондафтфкÑÑ‚ÑŒ ÑюлмафтомÑ.
+<del>Ð¢ÑƒÑ€ÐºÑ ÐºÐ¸ÐºÑ Ð¼Ð°Ñ€Ñ…Ñ‚Ð°</del> Ñ‚ÑшкÑне латцефольхть.',
'double-redirect-fixed-move' => '[[$1]] шашфтфоль, Ñон Ñ‚Ñни [[$2]]нь умборондафтфкÑоц',
'double-redirect-fixer' => 'УмборондафтфкÑонь латцема',
@@ -1674,7 +1660,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
# Watchlist
'watchlist' => 'Монь мельгеваномазе',
'mywatchlist' => 'Монь мельгеваномазе',
-'watchlistfor' => "('''$1'''-нди)",
'nowatchlist' => 'Мезеге аш тонь мельгеваномаÑот.',
'watchlistanontext' => '$1 тонь ванома мельгеваномаÑта лопат ваноманкÑа Ñли петнеманкÑа.',
'watchnologin' => 'Ðпак Ñувак',
@@ -1789,7 +1774,9 @@ $UNWATCHURL
'editcomment' => "Петнема лихтема ульÑÑŒ: \"''\$1''\".",
'revertpage' => 'Петнематнень мърдафтозь [[Special:Contributions/$2|$2]] ([[User talk:$2|Корхнема]]) ÑÑдынгольдень Ð²ÐµÑ€Ð·Ð¸ÐµÑ Ð¼ÑŠÑ€Ð´Ð°Ñ„Ñ‚Ð¾Ð·Ðµ [[User:$1|$1]]',
'rollback-success' => 'Петнематнень мърдафтозе $1; ÑÑдынгольдень Ð²ÐµÑ€Ð·Ð¸ÐµÑ Ð¼ÑŠÑ€Ð´Ð°Ñ„Ñ‚Ð¾Ð·Ðµ $2.',
-'sessionfailure' => 'Улема, лиÑÑÑŒ прÑбала тонь Ñувама пингÑта; програмонь ÑкамаÑÑŒ лотказевÑÑŒ Ñувамать върьгÑтемада аралама туфталонкÑа. ЭнÑльттÑма, люпштак "меки" ди одонзафтт лопать, конаÑта тон Ñать, меле тик Ñембе одукÑ.',
+
+# Edit tokens
+'sessionfailure' => 'Улема, лиÑÑÑŒ прÑбала тонь Ñувама пингÑта; програмонь ÑкамаÑÑŒ лотказевÑÑŒ Ñувамать върьгÑтемада аралама туфталонкÑа. ЭнÑльттÑма, люпштак "меки" ди одонзафтт лопать, конаÑта тон Ñать, меле тик Ñембе одукÑ.',
# Protect
'protectlogpage' => 'Ðралама лувома',
@@ -1981,7 +1968,6 @@ $1',
'ipb-edit-dropdown' => 'ÐŸÐ¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ñёлгома туфталхт',
'ipb-unblock-addr' => 'Ð’Ð°Ð»Ñ…Ñ‚Ð¾Ð¼Ñ $1-нь Ñёлгома',
'ipb-unblock' => 'Тиинь Ñли IP адреÑонь Ñёлгома валхтомÑ',
-'ipb-blocklist-addr' => '$1нь Ñ‚Ñниень Ñёлгоманза',
'ipb-blocklist' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ Ñ‚Ñниень Ñёлгомат',
'ipb-blocklist-contribs' => 'ПуткÑне $1 лопанди',
'unblockip' => 'Ð’Ð°Ð»Ñ…Ñ‚Ð¾Ð¼Ñ Ñёлгома тииÑта',
@@ -2370,10 +2356,10 @@ $1',
'imagemaxsize' => "ÐрхтофкÑнень келеÑнон оторÑна:<br />''(файлонь шарьхкотьфтема лопатненди)''",
'thumbsize' => 'Миниатюронь кувалмоц:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|лопа|лопат}}',
-'file-info' => '(файлонь кувалмоц: $1, MIME Ñортоц: $2)',
-'file-info-size' => '($1 × $2 пикÑелхть, файлть кувалмоц: $3, MIME Ñорт: $4)',
+'file-info' => 'файлонь кувалмоц: $1, MIME Ñортоц: $2',
+'file-info-size' => '$1 × $2 пикÑелхть, файлть кувалмоц: $3, MIME Ñорт: $4',
'file-nohires' => '<small>СÑда лама анцÑйнÑтнень мархта Ð°Ñ€Ñ…Ñ‚Ð¾Ñ„ÐºÑ Ð°Ñˆ.</small>',
-'svg-long-desc' => '(SVG файл, $1 × $2 пикÑельхть, file файлть кувалмоц: $3)',
+'svg-long-desc' => 'SVG файл, $1 × $2 пикÑельхть, file файлть кувалмоц: $3',
'show-big-image' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ð¿ÑшкÑе кувалмонц',
'show-big-image-thumb' => '<small>СÑдынголе ваномать кувалмоц: $1 × $2 пикÑелхть</small>',
diff --git a/languages/messages/MessagesMg.php b/languages/messages/MessagesMg.php
index 8df213d2..14476533 100644
--- a/languages/messages/MessagesMg.php
+++ b/languages/messages/MessagesMg.php
@@ -9,6 +9,7 @@
*
* @author Alno
* @author Jagwar
+ * @author The Evil IP address
* @author Urhixidur
* @author לערי ריינה×רט
*/
@@ -122,20 +123,94 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Recentchanges' => array( 'Fanovàna farany' ),
+ 'DoubleRedirects' => array( 'Fihodinana_miroa' ),
+ 'BrokenRedirects' => array( 'Fihodinana_tapaka' ),
+ 'Disambiguations' => array( 'Pejy_mitovy_anarana' ),
+ 'Userlogin' => array( 'Fidirana' ),
+ 'Userlogout' => array( 'Fialàna' ),
+ 'CreateAccount' => array( 'Hamorona_kaonty' ),
+ 'Preferences' => array( 'Safidy' ),
+ 'Watchlist' => array( 'Lisitry_ny_pejy_arahana' ),
+ 'Recentchanges' => array( 'Fanovàna_farany' ),
+ 'Upload' => array( 'Hanafatra' ),
+ 'Listfiles' => array( 'Lisitran\'ny_rakitra' ),
+ 'Newimages' => array( 'Sary_vaovao' ),
+ 'Listusers' => array( 'Lisitran\'ny_mpikambana' ),
+ 'Listgrouprights' => array( 'Lisitry_ny_satam-pikambana' ),
+ 'Statistics' => array( 'Statistika' ),
'Randompage' => array( 'Kisendra' ),
- 'Uncategorizedpages' => array( 'Pejy tsy misy sokajy' ),
- 'Uncategorizedcategories' => array( 'Sokajy tsy misy sokajy' ),
- 'Uncategorizedimages' => array( 'Sary tsy misy sokajy', 'Rakitra tsy misy sokajy' ),
- 'Uncategorizedtemplates' => array( 'Endrika tsy misy sokajy' ),
- 'Unusedcategories' => array( 'Sokajy tsy miasa' ),
- 'Unusedimages' => array( 'Rakitra tsy miasa' ),
- 'Wantedpages' => array( 'Pejy tadiavina' ),
- 'Wantedcategories' => array( 'Sokajy tadiavina' ),
- 'Wantedfiles' => array( 'Rakitra tadiavina' ),
- 'Wantedtemplates' => array( 'Endrika tadiavina' ),
- 'Mostcategories' => array( 'Pejy be sokajy indrindra' ),
- 'Mostrevisions' => array( 'Pejy be mpanova indrindra' ),
+ 'Lonelypages' => array( 'Pejy_manirery' ),
+ 'Uncategorizedpages' => array( 'Pejy_tsy_misy_sokajy' ),
+ 'Uncategorizedcategories' => array( 'Sokajy_tsy_misy_sokajy' ),
+ 'Uncategorizedimages' => array( 'Sary_tsy_misy_sokajy', 'Rakitra_tsy_misy_sokajy' ),
+ 'Uncategorizedtemplates' => array( 'Endrika_tsy_misy_sokajy' ),
+ 'Unusedcategories' => array( 'Sokajy_tsy_miasa' ),
+ 'Unusedimages' => array( 'Rakitra_tsy_miasa', 'Sary_tsy_miasa' ),
+ 'Wantedpages' => array( 'Pejy_tadiavina' ),
+ 'Wantedcategories' => array( 'Sokajy_tadiavina' ),
+ 'Wantedfiles' => array( 'Rakitra_tadiavina' ),
+ 'Wantedtemplates' => array( 'Endrika_tadiavina' ),
+ 'Mostlinked' => array( 'Pejy_voarohy_indrindra' ),
+ 'Mostlinkedcategories' => array( 'Sokajy_voarohy_indrindra' ),
+ 'Mostlinkedtemplates' => array( 'Endrika_voarohy_indrindra' ),
+ 'Mostimages' => array( 'Rakitra_voarohy_indrindra' ),
+ 'Mostcategories' => array( 'Pejy_be_sokajy_indrindra' ),
+ 'Mostrevisions' => array( 'Pejy_be_mpanova_indrindra' ),
+ 'Fewestrevisions' => array( 'Pejy_vitsy_mpanova_indrindra' ),
+ 'Shortpages' => array( 'Pejy_fohy' ),
+ 'Longpages' => array( 'Pejy_lavabe' ),
+ 'Newpages' => array( 'Pejy_vaovao' ),
+ 'Ancientpages' => array( 'Pejy_antitra' ),
+ 'Deadendpages' => array( 'Pejy_tsy_misy_rohy' ),
+ 'Protectedpages' => array( 'Pejy_voaaro' ),
+ 'Protectedtitles' => array( 'Lohateny_voaaro' ),
+ 'Allpages' => array( 'Pejy_rehetra' ),
+ 'Prefixindex' => array( 'Index' ),
+ 'Ipblocklist' => array( 'Lisitry_ny_fanakanana' ),
+ 'Unblock' => array( 'Hanala_ny_fanakanana' ),
+ 'Specialpages' => array( 'Pejy_manokana' ),
+ 'Contributions' => array( 'Fandraisan\'anjara' ),
+ 'Emailuser' => array( 'Handefa_imailaka' ),
+ 'Confirmemail' => array( 'Hankatò_ny_adiresy_imailaka' ),
+ 'Whatlinkshere' => array( 'Pejy_mirohy' ),
+ 'Recentchangeslinked' => array( 'Fanarahana_ny_rohy' ),
+ 'Movepage' => array( 'Hanova_anaram-pejy' ),
+ 'Blockme' => array( 'Sakano_ahy' ),
+ 'Booksources' => array( 'Boky_loharano' ),
+ 'Categories' => array( 'Sokajy' ),
+ 'Export' => array( 'Hamoa-pejy' ),
+ 'Version' => array( 'Santiôna' ),
+ 'Allmessages' => array( 'Hafatra_rehetra' ),
+ 'Log' => array( 'Tatitr\'asa' ),
+ 'Blockip' => array( 'Hanakana' ),
+ 'Undelete' => array( 'Hamerina' ),
+ 'Import' => array( 'Hampidi-pejy' ),
+ 'Lockdb' => array( 'Hanidy_ny_database' ),
+ 'Unlockdb' => array( 'Hanala_ny_hidin\'ny_database' ),
+ 'Userrights' => array( 'Fahefana' ),
+ 'MIMEsearch' => array( 'Fikarohana_MIME' ),
+ 'FileDuplicateSearch' => array( 'Fikarohan-drakitra_miroa' ),
+ 'Unwatchedpages' => array( 'Pejy_tsy_misy_mpanaraka' ),
+ 'Listredirects' => array( 'Lisitry_ny_fihodinana' ),
+ 'Revisiondelete' => array( 'Santiôna_voafafa' ),
+ 'Unusedtemplates' => array( 'Endrika_tsy_misy_mpampiasa' ),
+ 'Randomredirect' => array( 'Fihodinana_kisendta' ),
+ 'Mypage' => array( 'Pejiko' ),
+ 'Mytalk' => array( 'Pejin-dresako' ),
+ 'Mycontributions' => array( 'Fandraisan\'anjarako' ),
+ 'Listadmins' => array( 'Lisitry_ny_mpandrindra' ),
+ 'Listbots' => array( 'Lisitry_ny_rôbô' ),
+ 'Popularpages' => array( 'Pejy_be_mpitsidika_indrindra' ),
+ 'Search' => array( 'Fikarohana' ),
+ 'Resetpass' => array( 'Hiova_tenimiafina' ),
+ 'Withoutinterwiki' => array( 'Tsy_misy_interwiki' ),
+ 'MergeHistory' => array( 'Hampiaraka_ny_tantaram-pejy' ),
+ 'Filepath' => array( 'Lalan-drakitra' ),
+ 'Blankpage' => array( 'Pejy_fotsy' ),
+ 'LinkSearch' => array( 'Fikarohan-drohy' ),
+ 'DeletedContributions' => array( 'Fandraisan\'anjara_voafafa' ),
+ 'Tags' => array( 'Balizy' ),
+ 'Activeusers' => array( 'Mpikambana_manova_matetika' ),
);
$messages = array(
@@ -154,8 +229,7 @@ $messages = array(
'tog-editsection' => "Ataovy mety ny fanovana fizaràna amin'ny alalan'ny rohy [hanova]",
'tog-editsectiononrightclick' => "Ovay ny fizaràna rehefa manindry ny bokotra havanana amin'ny totozy eo amin'ny lohateny hoe fizaràna (mila JavaScript)",
'tog-showtoc' => "Asehoy ny fanoroan-takila (ho an'ny pejy misy lohateny mihoatra ny 3)",
-'tog-rememberpassword' => 'Tadidio ny tenimiafiko',
-'tog-editwidth' => "Farany lehibe ny velaran'ny boaty fanovana",
+'tog-rememberpassword' => "Tadidio ny tenimiafiko eto amin'ity solosaina ity (mandritry ny andro $1 fara-fahabetsany){{PLURAL:}}",
'tog-watchcreations' => "Ampina ao anarin'ny pejy fanaraha-maso ny pejy amboariko",
'tog-watchdefault' => "Atsofohy ao amin'ny lisitry ny pejy arahinao maso ny pejy izay ovainao na foroninao",
'tog-watchmoves' => "Ampina ao anatin'ny pejiko fanaraha-maso ny pejy soloiko anarana",
@@ -300,31 +374,21 @@ $messages = array(
'faqpage' => 'Project:FMM',
# Vector skin
-'vector-action-addsection' => 'Hanampy lohahevitra',
-'vector-action-delete' => 'Fafana',
-'vector-action-move' => 'Hanolo anarana',
-'vector-action-protect' => 'Arovy',
-'vector-action-undelete' => 'Avereno',
-'vector-action-unprotect' => 'esory ny fiarovana',
-'vector-namespace-category' => 'sokajy',
-'vector-namespace-help' => 'fanoroana',
-'vector-namespace-image' => 'rakitra',
-'vector-namespace-main' => 'pejy',
-'vector-namespace-media' => 'Pejy Media',
-'vector-namespace-mediawiki' => 'hafatra',
-'vector-namespace-project' => 'tetikasa',
-'vector-namespace-special' => 'pejy manokana',
-'vector-namespace-talk' => 'resaka',
-'vector-namespace-template' => 'endrika',
-'vector-namespace-user' => 'pejy ny mpikambana',
-'vector-view-create' => 'Foronona',
-'vector-view-edit' => 'Hanova',
-'vector-view-history' => 'Hijery ny tantara',
-'vector-view-view' => 'Hamaky',
-'vector-view-viewsource' => 'Hijery fango',
-'actions' => 'Tao',
-'namespaces' => 'Valam-pejy',
-'variants' => "Ny ''skin'' Voasintona",
+'vector-action-addsection' => 'Hanampy lohahevitra',
+'vector-action-delete' => 'Fafana',
+'vector-action-move' => 'Hanolo anarana',
+'vector-action-protect' => 'Arovy',
+'vector-action-undelete' => 'Avereno',
+'vector-action-unprotect' => 'esory ny fiarovana',
+'vector-simplesearch-preference' => "Alefa ny soso-kevitra mikasika ny fikarohana (ho an'ny Vector ihany)",
+'vector-view-create' => 'Foronona',
+'vector-view-edit' => 'Hanova',
+'vector-view-history' => 'Hijery ny tantara',
+'vector-view-view' => 'Hamaky',
+'vector-view-viewsource' => 'Hijery fango',
+'actions' => 'Tao',
+'namespaces' => 'Valam-pejy',
+'variants' => "Ny ''skin'' Voasintona",
'errorpagetitle' => 'Tsy fetezana',
'returnto' => "Hiverina any amin'ny $1.",
@@ -385,6 +449,9 @@ Betsaka loatra ny mpikambana mitady hijery ity pejy ity.
Miandrasa kely, dia avereno.
$1',
+'pool-timeout' => "Fe-potoana voahoatra ho an'ny hidy.",
+'pool-queuefull' => 'Feno ny lisitry ny asa hatao',
+'pool-errorunknown' => 'Tsi-fetezana tsy fantatra',
# 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' => 'Mombamomba ny {{SITENAME}}',
@@ -551,7 +618,8 @@ Aza hadino ny manova ny [[Special:Preferences|safidinao]]',
'yourname' => 'Solonanarana',
'yourpassword' => 'Tenimiafina',
'yourpasswordagain' => 'Avereno ampidirina eto ny tenimiafina',
-'remembermypassword' => 'Tadidio ny tenimiafiko',
+'remembermypassword' => '{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)',
+'securelogin-stick-https' => "Mijanona tafiditra amin'i HTTPS rehefa tafiditra",
'yourdomainname' => 'faritra (domaine) misy anao',
'externaldberror' => "Nisy tsy fetezana angamba teo amin'ny fanamarinana anao tamin'ny sehatra ivelan'ity wiki ity, na tsy manana alalana hanova ny kaontinao ivelany ianao.",
'login' => 'Midira',
@@ -569,6 +637,7 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
'gotaccount' => "Efa manana kaonty? '''$1'''.",
'gotaccountlink' => 'Midira',
'createaccountmail' => "amin'ny imailaka",
+'createaccountreason' => 'Antony :',
'badretype' => 'Tsy mitovy ny tenimiafina nampidirinao.',
'userexists' => 'Efa misy mampiasa io solonanarana io. Mifidiana solonanarana hafa azafady.',
'loginerror' => "Tsy fetezana teo amin'ny fidirana",
@@ -590,6 +659,7 @@ Avelao mandeha ny fampidirana cookies, ary midira amin'ny kaontinao.",
'passwordtooshort' => '{{PLURAL:}}Fohy loatra io tenimiafina io.
Farafahakeliny tokony hisy litera $1 ny tenimiafina.',
'password-name-match' => 'Tsy maintsy samihafa ny solonanaranao sy ny tenimiafinao tompoko.',
+'password-login-forbidden' => 'Norarana ny fampiasana io anaram-pikambana ary io tenimiafina io.',
'mailmypassword' => 'Alefaso imailaka ny tenimiafiko',
'passwordremindertitle' => "Fampatsiahivana tenimiafina avy amin'i {{SITENAME}}",
'passwordremindertext' => 'Nisy olona, izay ianao ihany angamba, avy tamin\'ny adiresy IP $1, nangataka
@@ -633,6 +703,9 @@ Andraso kely ary andramo indray.",
'loginlanguagelabel' => 'fiteny : $1',
'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
+# E-mail sending
+'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
+
# Password reset dialog
'resetpass' => 'Hanova ny tenimiafina',
'resetpass_announce' => "Nihiditra tenimiafina mailaka nalefanay tamin'ny imailaka ianao. Ampidiro ity tenimiafina ity mba hanapitra ny fampidirana.",
@@ -683,6 +756,7 @@ Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
'showlivepreview' => 'Topi-maso maikamaika',
'showdiff' => 'Asehoy ny fiovana',
'anoneditwarning' => "'''Tandremo :''' tsy niditra/nanokatra kaonty tato ianao. Ho voasoratra ao amin'ny tatitr'asan'ity pejy ity ny adiresy IP-nao.",
+'anonpreviewwarning' => "''Tsy niditra ianao. Ho voatahiry ao amin'ny tantaran'ity pejy ity ny adiresy IP-nao.''",
'missingsummary' => "'''Fampandrenesana''' : Tsy nameno ny ambangovangony ianao.
ra tonga dia tsindrinao ilay bokotra « tehirizo », alefa avy hatrany ny fanovànao",
'missingcommenttext' => 'Ampidiro ny ambangovangony azafady.',
@@ -757,7 +831,7 @@ Ny fampidirana faran'ny laogin'ny fanakanam-pikambana dia naseho teo ambany ho a
'userjspreview' => "
'''Tadidio fa manandrana/mijery tsipalotra ny fivoakan'ny JavaScript-nao fotsiny ihany ianao fa tsy mbola voatahiry akory izy io!'''",
'userinvalidcssjstitle' => "'''Fampitandremana''' : Tsy misy skin « $1 ».
-Tadidio fa mampiasa soramadinika ny lohatenin'ny pejinao manan-tovana *.css sy *.js, ohatra {{ns:user}}:Foo/monobook.css fa tsy {{ns:user}}:Foo/Monobook.css.",
+Tadidio fa mampiasa soramadinika ny lohatenin'ny pejinao manan-tovana *.css sy *.js, ohatra {{ns:user}}:Foo/vector.css fa tsy {{ns:user}}:Foo/Vector.css.",
'updated' => '(Voaova)',
'note' => "'''Fanamarihana:'''",
'previewnote' => "'''Topi-maso ihany ity hitanao ity, tsy mbola voatahiry ny fanovana nataonao!'''",
@@ -797,10 +871,6 @@ Raha io no tahirizinao, dia ho very ny fanovana ity pejy ity rehetra taorian'io
Ny zava-tsoratanao eto dia vokatr'asa naverinao soratana na nodikainao tany amina loharano ao amin'ny vala sarababem-bahoaka na loharano malalaka hafa (Jereo $1 ho an'ny antsipirihany).
'''Aza mampiasa tahirin-kevitra tsy nahazoan-dalana!'''",
-'longpagewarning' => "'''FAMPITANDREMANA: Mahatratra $1 kilooktety ny hangezan'ity pejy ity;
-Ny navigateur sasantsasany dia mety hanana olana
-amin'ny fanovana ny pejy manakaiky na mihoatra ny 32 ko.
-Tsara raha saratsarahinao ho fizarana maromaro ity pejy ity.'''",
'longpageerror' => "'''Tsi-fetezana : Ny lanjan’ny lahatsoratrao dia $1 Ko, mihoatra ny $2 Ko, ilay fetra napetraka. Tsy afaka tahirizina ilay lahatsoratra.'''",
'readonlywarning' => "'''FAMPITANDREMANA: Nohidiana noho ny antony fikolokoloana aloha ny banky angona,
koa tsy afaka mitahiry ny fanovana nataonao aloha ianao izao. Angamba tokony hanao Couper coller aloha
@@ -971,6 +1041,8 @@ $1",
'logdelete-failure' => "'''Tsy afaka novaina ny fisehon'ny tatitr’asa'''
$1",
'revdel-restore' => 'Ovay ny fahitàna',
+'revdel-restore-deleted' => 'santiôna voafafa',
+'revdel-restore-visible' => 'santiôna hita',
'pagehist' => "Tantaran'ilay pejy",
'deletedhist' => 'Tantara voafafa',
'revdelete-content' => 'votoatiny',
@@ -1043,7 +1115,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
'compareselectedversions' => 'Ampitahao ireo version voafidy',
'showhideselectedversions' => 'Asehoy/asitriho ny santiôna nofidiana',
'editundo' => 'esory',
-'diff-multi' => '{{PLURAL:}}(Reviziôna anelanelany nasitrika $1)',
+'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
# Search results
'searchresults' => 'Valim-pikarohana',
@@ -1153,6 +1225,7 @@ ihany no miseho amin'ny vokatry ny karoka).",
'resultsperpage' => "Isa ny valiny isakin'ny pejy :",
'contextlines' => "Isa ny andalana isakin'ny valiny :",
'contextchars' => 'Isa ny litera isaky ny andalana',
+'stub-threshold-disabled' => 'Tsy alefa',
'recentchangesdays' => "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
'recentchangesdays-max' => '($1 andro{{PLURAL:$1||}} fara-faha betsany)',
'recentchangescount' => "Isan'ny fanovana haseho (tsipalotra) :",
@@ -1220,7 +1293,9 @@ Tokony mba manana lohavy ambanimbany kokoa non'ny $1",
'prefs-advancedrendering' => 'Antsipirihan-tsafidy',
'prefs-advancedsearchoptions' => 'Antsipirihan-tsafidy',
'prefs-advancedwatchlist' => 'Antsipirihan-tsafidy',
-'prefs-display' => 'safidim-tseho',
+'prefs-displayrc' => 'safidim-tseho',
+'prefs-displaysearchoptions' => 'Safidin-tseho',
+'prefs-displaywatchlist' => 'Safidin-tseho',
'prefs-diffs' => 'Diff',
# User rights
@@ -1300,6 +1375,7 @@ Tokony mba manana lohavy ambanimbany kokoa non'ny $1",
'right-hideuser' => "Manakana mpikambana iray amin'ny fanitrihana ny anarany amin'ny vahoaka",
'right-ipblock-exempt' => 'Tsy voakasiky ny fanakanana IP, ny fanakanana mandeha ho azy (aotômatika) ary ny fanakanana sampana IP',
'right-proxyunbannable' => "Tsy voakasiky ny fanakana mande hoazy avy amin'ny proxy",
+'right-unblockself' => 'Miala hidy ho azy',
'right-protect' => "Manova ny fiarovan'ny pejy sy manova ny pejy voaaro",
'right-editprotected' => 'Manova ny pejy voaaro (tsy misy fiarovana en cascade)',
'right-editinterface' => 'Manova ny interface ny mpikambana',
@@ -1322,7 +1398,6 @@ Tokony mba manana lohavy ambanimbany kokoa non'ny $1",
'right-siteadmin' => 'Manidy sy manokatra ny banky angona',
'right-reset-passwords' => "Manova ny tenimiafin'ny mpikambana hafa",
'right-override-export-depth' => "Mamoaka ny pejy miaraka amin'ny zana-pejy hatramin'ny ambaratonga fahadimy",
-'right-versiondetail' => "Mijery ny fampahalalàna momba ny version'ny rindrankajy",
'right-sendemail' => "Mandefa imailaka any amin'ny mpikambana hafa",
# User rights log
@@ -1373,14 +1448,9 @@ Tokony mba manana lohavy ambanimbany kokoa non'ny $1",
'recentchanges-legend' => 'Safidy ny fanovàna farany',
'recentchangestext' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
'recentchanges-feed-description' => "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
-'recentchanges-label-legend' => 'Maribolana : $1.',
-'recentchanges-legend-newpage' => '$1 - pejy vaovao',
'recentchanges-label-newpage' => 'Namorona pejy vaovao io fanovana io',
-'recentchanges-legend-minor' => '$1 - fanovana kely',
'recentchanges-label-minor' => 'Kely fotsiny ity fanovana ity',
-'recentchanges-legend-bot' => "$1 - fanovana nataon'ny rôbô",
'recentchanges-label-bot' => "Nataon'ny rôbô ity fanovana ity.",
-'recentchanges-legend-unpatrolled' => '$1 - fanovana mbola tsy nojerena',
'recentchanges-label-unpatrolled' => 'Ity fanovana ity dia mbola tsy voamarina',
'rcnote' => "!Ity ny {{PLURAL:$1|fanovàna farany|fanovàna farany}} $1 natao nandritra ny <b>$2</b> andro, hatramin'ny $4 tamin'ny ora faha $5.",
'rcnotefrom' => "Ity eto ambany ity ny lisitry ny vao niova manomboka ny <b>$2</b> (hatramin'ny <b>$1</b> no miseho).",
@@ -1458,6 +1528,17 @@ Raha hanisy sary ao anaty pejy, dia mampiasà rohy toy ny iray amin'ireto
'filetype-banned-type' => "Rarana ato ny karazan-drakitra '''« .$1 »'''
{{PLURAL:$3||}}Ny karazan-drakitra ekena dia $2.",
'filetype-missing' => 'Tsy manan-karazan-drakitra ilay rakitra (hoatry ny « .jpg » ohatra).',
+'empty-file' => 'Tsy manam-botoatiny ny rakitra nalefanao.',
+'file-too-large' => 'Ngeza loatra ny rakitra nalefanao.',
+'filename-tooshort' => 'Fohy loatra ny anaran-drakitra.',
+'filetype-banned' => 'Voarara ato io karazan-drakitra io.',
+'verification-error' => "Tsy afaka amin'ny fanamarinana rakitra ity rakitra ity.",
+'hookaborted' => "Najanon'ny faraingon'itatra ny fanovana nandramanao natao.",
+'illegal-filename' => "Tsy nahazoan-dàlana ny anaran'io rakitra io.",
+'overwrite' => 'Tsy azo itsahina ny rakitra efa misy.',
+'unknown-error' => 'Nisy tsi-fetezana nitranga.',
+'tmp-create-error' => 'Tsy afaka mamorona rakitra miserana.',
+'tmp-write-error' => "Tsi-fetezana teo am-panoratana an'ilay rakitra miserana",
'large-file' => "Ny haben'ny rakitra hampidirina dia tsy mahazo mihoatra ny $1 ; $2 ny lanjan'ilay rakitra tianao ho ampidirina.",
'largefileserver' => "
Ngeza noho izay zakan'ny serveur io rakitra io.",
@@ -1488,13 +1569,14 @@ Raha mbola te-hampiditra io rakitra io foana ianao, miverena any aoriana ary mam
. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => "Ity rakitra ity dia mitovy amin'ny rakitra {{PLURAL:$1|||}} :",
'file-deleted-duplicate' => "Efa voafafa ny rakitra mitovy amin'ity rakitra ity ([[:$1]]). Tokony jerena any amin'ny tantaran'asan'ny famafana io pejy io alohan'ny mampiditra azy indray.",
-'successfulupload' => 'Voaray soa aman-tsara ny rakitra',
'uploadwarning' => 'Fampitandremana',
'uploadwarning-text' => "Ovay ny fanoritan' ilay rakitra ary andrao fanindroany.",
'savefile' => 'Tehirizo ny rakitra',
'uploadedimage' => 'tonga ny rakitra"[[$1]]"',
'overwroteimage' => "nampiditra santiôna vaovao an'ny « [[$1]] »",
'uploaddisabled' => 'Miala tsiny! Tsy azo atao ny mandefa rakitra.',
+'copyuploaddisabled' => "Tsy alefa ny fandefasan-drakitra amin'ny alalan'ny URL.",
+'uploadfromurl-queued' => 'Ao am-piandrasana ny fandefasan-drakitrao.',
'uploaddisabledtext' => "Tsy afaka andefasana rakitra aloha eto amin'ity wiki ity.",
'php-uploaddisabledtext' => "Ny fampidiran-drakitra dia tsy ampiasaina amin'ny PHP.
Marino ny option configuration file_uploads.",
@@ -1516,6 +1598,13 @@ Tokony marina ny $1 aloha ny manao fampidirana vaovao.',
Marino raha tsara tohizana ny fanovana eto amin'ity pejy ity. Ny tantaran'asan'ny famafana pejy sy ny fanovan-toerana dia eo ambany :",
'filename-bad-prefix' => "Ny anaran-drakitra ho ampidirinareo dia manomboka amin'ny '''« $1 »''', anarana omena an'ny fakan-tsary elektirônika.
Misafidia anaran-drakitra mambangovango.",
+'upload-success-subj' => 'Voaray soa aman-tsara ny rakitra',
+'upload-success-msg' => 'Eto ny rakitra nalefanao : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Olana nitranga teo am-pandefasana',
+'upload-failure-msg' => "Nisy olana tamin'ny fampidiranao [$2] :
+
+$1",
+'upload-warning-subj' => 'Fampitandremana rehefa mampiditra',
'upload-proto-error' => 'Protokolina diso',
'upload-proto-error-text' => "Mila URL manomboka amin'ny <code>http://</code> na <code>ftp://</code> ny fampidiran-drakitra.",
@@ -1684,7 +1773,6 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
'statistics-edits-average' => "Isan'ny fanovana isaky ny pejy",
'statistics-views-total' => 'Tsidika',
'statistics-views-peredit' => 'Tsidika isaky ny fanovana',
-'statistics-jobqueue' => 'halava ny [http://www.mediawiki.org/wiki/Manual:Job_queue Job queue]',
'statistics-users' => '[[Special:ListUsers|Mpikambana]] nisoratra anarana',
'statistics-users-active' => 'Mpikambana manova matetika',
'statistics-users-active-desc' => "Mpikambana nanao zavatra teto tanatin'ny $1 andro{{PLURAL:}}.",
@@ -1867,37 +1955,43 @@ Prôtôkôly zaka : <tt>$1</tt>.',
'listgrouprights-removegroup-self-all' => "Manala ny vondrom-pikambana rehetra amin'ny kaontiny",
# E-mail user
-'mailnologin' => 'Tsy misy adiresy handefasana ny tenimiafina',
-'mailnologintext' => "Mila [[Special:UserLogin|miditra]] ianao sady manana imailaka mandeha sy voamarina ao amin'ny [[Special:Preferences|mombamomba anao]] vao afaka mandefa imailaka amin'ny mpikambana hafa.",
-'emailuser' => 'Andefaso imailaka io mpikambana io',
-'emailpage' => 'Andefaso imailaka io mpikambana io',
-'emailpagetext' => "Raha nametraka adiresy tena miasa tao amin'ny [[Special:Preferences|mombamomba azy io mpikambana io]],
+'mailnologin' => 'Tsy misy adiresy handefasana ny tenimiafina',
+'mailnologintext' => "Mila [[Special:UserLogin|miditra]] ianao sady manana imailaka mandeha sy voamarina ao amin'ny [[Special:Preferences|mombamomba anao]] vao afaka mandefa imailaka amin'ny mpikambana hafa.",
+'emailuser' => 'Andefaso imailaka io mpikambana io',
+'emailpage' => 'Andefaso imailaka io mpikambana io',
+'emailpagetext' => "Raha nametraka adiresy tena miasa tao amin'ny [[Special:Preferences|mombamomba azy io mpikambana io]],
dia ahafahana mandefa hafatra tokana ho any aminy ity fisy eto ambany ity.
Ny adiresy imailakao napetrakao tao amin'ny mombamomba anao no hiseho hoe
adiresin'ny mpandefa izany imailaka izany, koa afaka hovaliany izay hafatra alefanao.",
-'usermailererror' => "Misy tsy mety amin'ny lohatenin'ny imailaka:",
-'defemailsubject' => "imailaka avy amin'ny sehatra {{SITENAME}}",
-'noemailtitle' => 'Tsy misy adiresy imailaka',
-'noemailtext' => "Na tsy nanome adiresy imailaka voamarina io mpikambana io,
+'usermailererror' => "Misy tsy mety amin'ny lohatenin'ny imailaka:",
+'defemailsubject' => "imailaka avy amin'ny sehatra {{SITENAME}}",
+'usermaildisabled' => 'Tsy azo mifandefa imailaka ny mpikambana',
+'usermaildisabledtext' => "Tsy mahazo mandefa imailaka any amin'ny mpikamban'ity wiki ity ianao",
+'noemailtitle' => 'Tsy misy adiresy imailaka',
+'noemailtext' => "Na tsy nanome adiresy imailaka voamarina io mpikambana io,
na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
-'nowikiemailtitle' => 'Tsy manaiky imailaka alefa ho azy',
-'nowikiemailtext' => "Ity mpikambana ity dia te-hahazo imailaka avy amin'ny mpikambana hafa.",
-'email-legend' => "Handefa imailaka any amin'ny mpikambana hafa an'i {{SITENAME}}",
-'emailfrom' => "Avy tamin'i",
-'emailto' => "Ho an'i",
-'emailsubject' => 'Lohateny :',
-'emailmessage' => 'Hafatra',
-'emailsend' => 'Alefaso',
-'emailccme' => "Andefaso tahak' ity hafatra ity ahy.",
-'emailccsubject' => "Tahaka ny hafatrao nalefa tany amin'i $1 : $2",
-'emailsent' => 'Lasa',
-'emailsenttext' => 'Lasa soa aman-tsara ny imailaka nalefanao.',
-'emailuserfooter' => "Ity imailaka ity dia nalefan'i « $1 » tany amin'i « $2 » tamin'ny alalan'ny « Handefa Imailaka » an'i {{SITENAME}}.",
+'nowikiemailtitle' => 'Tsy manaiky imailaka alefa ho azy',
+'nowikiemailtext' => "Ity mpikambana ity dia te-hahazo imailaka avy amin'ny mpikambana hafa.",
+'email-legend' => "Handefa imailaka any amin'ny mpikambana hafa an'i {{SITENAME}}",
+'emailfrom' => "Avy tamin'i",
+'emailto' => "Ho an'i",
+'emailsubject' => 'Lohateny :',
+'emailmessage' => 'Hafatra',
+'emailsend' => 'Alefaso',
+'emailccme' => "Andefaso tahak' ity hafatra ity ahy.",
+'emailccsubject' => "Tahaka ny hafatrao nalefa tany amin'i $1 : $2",
+'emailsent' => 'Lasa',
+'emailsenttext' => 'Lasa soa aman-tsara ny imailaka nalefanao.',
+'emailuserfooter' => "Ity imailaka ity dia nalefan'i « $1 » tany amin'i « $2 » tamin'ny alalan'ny « Handefa Imailaka » an'i {{SITENAME}}.",
+
+# User Messenger
+'usermessage-summary' => 'Namela hafatra rindrankajy',
+'usermessage-editor' => 'Mpampita hafatry ny rindrankajy',
# Watchlist
'watchlist' => 'Narahiko maso',
'mywatchlist' => 'Pejy arahako-maso',
-'watchlistfor' => "(ho an'ny/i '''$1''')",
+'watchlistfor2' => "Ho an'i $1 $2",
'nowatchlist' => "Tsy misy n'inon'inona ao amin'ny lisitry ny pejy arahinao maso.",
'watchlistanontext' => "Andana $1 ianao mba hahita na hanova zavatra ao amin'ny pejy arahanao.",
'watchnologin' => 'Tsy tafiditra',
@@ -2018,6 +2112,9 @@ Efa nataon'i [[User:$3|$3]] ([[User talk:$3|dinika]]{{int:pipe-separator}}[[Spec
'rollback-success' => "Fanalàna ny fanovana nataon'i $1 ;
miverina any amin'ny santiôna farany nataon'i $2.",
+# Edit tokens
+'sessionfailure-title' => 'Tsi-fetezaka mikasika ny kaonty idirana',
+
# Protect
'protectlogpage' => 'Tatitr’asa momban’ny fiarovana',
'protectlogtext' => 'Eto ambany ny lisitry ny fiarovana/fanalana hidy ny pejy. Fanazavana fanampiny: jereo [[Special:ProtectedPages]].',
@@ -2140,19 +2237,21 @@ $1',
'month' => "Tamin'ny volana (sy teo aloha) :",
'year' => "Tamin'ny taona (sy teo aloha) :",
-'sp-contributions-newbies' => "Ny fandraisan'anjara ny mpikambana vaovao ihany no ampiseho eto",
-'sp-contributions-newbies-sub' => "Ao amin'ny kaonty vaovao",
-'sp-contributions-newbies-title' => "Fandraisan'anjara ao amin'ny kaonty vaovao",
-'sp-contributions-blocklog' => 'Tatitr’asa momban’ny fanakanana',
-'sp-contributions-deleted' => "fandraisan'anjara voafafa",
-'sp-contributions-logs' => 'tatitr’asa',
-'sp-contributions-talk' => 'Dinika',
-'sp-contributions-userrights' => 'fitantanana ny satam-pikambana',
-'sp-contributions-blocked-notice' => 'Ankehitriny ity mpikambana ity dia voasakana.
+'sp-contributions-newbies' => "Ny fandraisan'anjara ny mpikambana vaovao ihany no ampiseho eto",
+'sp-contributions-newbies-sub' => "Ao amin'ny kaonty vaovao",
+'sp-contributions-newbies-title' => "Fandraisan'anjara ao amin'ny kaonty vaovao",
+'sp-contributions-blocklog' => 'Tatitr’asa momban’ny fanakanana',
+'sp-contributions-deleted' => "fandraisan'anjara voafafa",
+'sp-contributions-logs' => 'tatitr’asa',
+'sp-contributions-talk' => 'Dinika',
+'sp-contributions-userrights' => 'fitantanana ny satam-pikambana',
+'sp-contributions-blocked-notice' => 'Ankehitriny ity mpikambana ity dia voasakana.
Miseho eo ambany eo ny laogim-panakanam-pikambana mba hampahalala :',
-'sp-contributions-search' => "Hikaroka fandraisan'anjara",
-'sp-contributions-username' => 'Adiresy IP na anaram-pikambana :',
-'sp-contributions-submit' => 'Hikaroka',
+'sp-contributions-blocked-notice-anon' => "Voasakana ity adiresy IP ity ankehitriny.
+Ny iditra farany tao amin'ny laogim-panakanam-pikambana dia naseho teo ambany mba hampahalala :",
+'sp-contributions-search' => "Hikaroka fandraisan'anjara",
+'sp-contributions-username' => 'Adiresy IP na anaram-pikambana :',
+'sp-contributions-submit' => 'Hikaroka',
# What links here
'whatlinkshere' => 'Iza avy no mirohy eto',
@@ -2207,7 +2306,6 @@ Fenoy etsy ambany ny antony manokana (ohatra, mitanisà pejy nosomparana).",
'ipb-edit-dropdown' => 'Hanova ny antony fanakanana tsipalotra',
'ipb-unblock-addr' => "Hanala ny sakan' i $1",
'ipb-unblock' => "Hanala ny sakan'ny mpikambana na adiresy IP",
-'ipb-blocklist-addr' => "Sakana efa misy ho an'i $1",
'ipb-blocklist' => 'Hijery ny sakana efa misy',
'ipb-blocklist-contribs' => "Fandraisan'anjaran'i $1",
'unblockip' => "Esory ny sakana amin'io mpikambana io",
@@ -2281,6 +2379,8 @@ Mety efa natao angamba ny fanalana sakana.',
'cant-block-while-blocked' => 'Tsy azo sakananao ny mpikambana hafa raha mbola voasakana ianao.',
'cant-see-hidden-user' => "Ny mpikambana andramanao sakanana dia efa nosakanana ary nasitrika.
Noho ianao tsy manana ny zon'ny mpanitrika mpikambana (''hideuser''), tsy azonao jerena na ovaina ny sakan'ity mpikambana ity.",
+'ipbblocked' => "Tsy afaka manala ny sakan'ny mpikambana hafa ianao, satria voasakana koa ianao",
+'ipbnounblockself' => 'Tsy afaka manala ny sakanao ianao',
# Developer tools
'lockdb' => 'Fanidiana ny banky angona',
@@ -2551,6 +2651,8 @@ Ampesao ny topi-maso aloha no mihatiry.",
'tooltip-rollback' => "Manala ny fanovan'ny mpikambana farany nanova azy ilay asa « foano » (Rollback) .",
'tooltip-undo' => "Manala n'io fanovàna io ilay rohy « esory ».
Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny ambangovangony.",
+'tooltip-preferences-save' => 'Tehirizina ny safidy',
+'tooltip-summary' => 'Atsofohy eo ambangovangony fohifohy',
# Stylesheets
'monobook.css' => "/* Ovay ity rakitra ity raha hampiasa takilan'angaly (stylesheet) anao manokana amin'ny wiki iray manontolo */",
@@ -2642,13 +2744,15 @@ $1',
'nextdiff' => 'fampitahana manaraka →',
# Media information
-'mediawarning' => "'''Fampitandremana''': Tsy azo antoka ho tsy misy viriosy ity rakitra ity, ahiana hanimba ny solosainao ny fandefasana azy.",
+'mediawarning' => "'''Fampitandremana''': Mety misy renifango manao ratsy io karazan-drakitra io.
+Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
'imagemaxsize' => "Ferana ny haben'ny sary ao amin'ny pejy famaritana ho:",
'thumbsize' => "Haben'ny thumbnail",
'widthheightpage' => '$1 × $2, pejy $3{{PLURAL:}}',
-'file-info-size' => "($1 × $2 piksely, hangeza n'ilay rakitra : $3, endrika MIME : $4)",
+'file-info' => 'Haben-drakitra : $1, karazana MIME : $2',
+'file-info-size' => "$1 × $2 teboka, haben'ilay rakitra : $3, endrika MIME : $4",
'file-nohires' => "<small>Tsy misy sary ngeza non'io</small>",
-'svg-long-desc' => '(rakitra SVG, hangeza $1 × $2 piksely, hangeza : $3)',
+'svg-long-desc' => 'rakitra SVG, habe $1 × $2 teboka, habe : $3',
'show-big-image' => "Hijery ny tena haben'ny sary",
'show-big-image-thumb' => "<small>Hangezan'ity topi-maso ity : $1 × $2 piksely</small>",
'file-info-gif-looped' => 'miverimberina',
@@ -2695,6 +2799,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
'exif-samplesperpixel' => 'Mpandahatra isaky ny piksely',
'exif-planarconfiguration' => 'Fandaminana ny data',
'exif-ycbcrpositioning' => 'Fipetraky ny Y sy C',
+'exif-yresolution' => 'Isan-teboka mijidina',
'exif-stripoffsets' => "Toerana isian'ny datan'ny sary",
'exif-rowsperstrip' => "Isan'ny andininy isaky ny bandy",
'exif-stripbytecounts' => "Haben'ny bandy amin'ny oktety",
@@ -2715,10 +2820,15 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
'exif-makernote' => 'Diniky ny mpanamboatra',
'exif-usercomment' => 'Diniky ny mpikambana',
'exif-relatedsoundfile' => 'Rakitra audio miaraka',
+'exif-datetimeoriginal' => 'Daty fangalana niaviana',
+'exif-datetimedigitized' => 'Daty nanaovana numerisation',
+'exif-subsectime' => 'Daty nanovana',
'exif-exposuretime-format' => '$1 s ($2 s)',
'exif-fnumber' => 'Isa F',
'exif-isospeedratings' => 'ISO',
'exif-aperturevalue' => 'Sanasana',
+'exif-lightsource' => 'Loharanon-kazavana',
+'exif-flashenergy' => "Angôvon'akonkazavana",
'exif-filesource' => 'Fangon-drakitra',
'exif-imageuniqueid' => "ID an'io sary io manokana",
'exif-gpslatituderef' => 'Laharam-pehintany avaratra na atsimo',
@@ -2727,7 +2837,11 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
'exif-gpslongitude' => 'Laharan-jarahasina',
'exif-gpsaltituderef' => 'Haambo tsiahy',
'exif-gpsaltitude' => 'Haambo',
+'exif-gpstimestamp' => 'Ora GPS (famantaranandro atômika)',
+'exif-gpsmeasuremode' => 'Fomba fandrefesana',
+'exif-gpsdop' => 'Hatsiko ny fandrefesana',
'exif-gpsspeedref' => 'Mari-drefi-kafainganana',
+'exif-gpsspeed' => 'Hafaingam-pandray GPS',
'exif-gpsimgdirection' => "Fitodihan'ny sary",
'exif-gpsdestlatitude' => 'Laharam-pehintany tanjona',
'exif-gpsareainformation' => 'Anaram-paritra GPS',
@@ -2962,6 +3076,15 @@ Ampidiro ny anaran-drakitra tsy misy ny tovona « {{ns:file}}: »",
'tags-edit' => 'hanova',
'tags-hitcount' => '{{PLURAL:$1|fanovana|fanovana}} $1',
+# Special:ComparePages
+'comparepages' => 'Hampitaha pejy',
+'compare-selector' => 'Hampitaha ny santiôm-pejy',
+'compare-page1' => 'Pejy 1',
+'compare-page2' => 'Pejy 2',
+'compare-rev1' => 'Santiôna 1',
+'compare-rev2' => 'Santiôna 2',
+'compare-submit' => 'Ampitahao',
+
# Database error messages
'dberr-header' => 'Misy olana io wiki io',
'dberr-problems' => 'Azafady Tompoko ! Manana olana ara-teknika ny sehatra.',
diff --git a/languages/messages/MessagesMhr.php b/languages/messages/MessagesMhr.php
index 658bc149..f745c4b3 100644
--- a/languages/messages/MessagesMhr.php
+++ b/languages/messages/MessagesMhr.php
@@ -16,19 +16,19 @@
$fallback = 'ru';
$namespaceNames = array(
- NS_SPECIAL => 'Лӱмын ыштыме',
+ NS_SPECIAL => 'Лӱмын_ыштыме',
NS_TALK => 'Каҥашымаш',
NS_USER => 'Пайдаланыше',
NS_USER_TALK => 'Пайдаланышын_каҥашымаш',
NS_PROJECT_TALK => '$1ын_каҥашымаш',
NS_FILE => 'Файл',
- NS_FILE_TALK => 'Файлын_каҥашымаш',
+ NS_FILE_TALK => 'Файл_шотышто_каҥашымаш',
NS_TEMPLATE => 'Ямдылык',
- NS_TEMPLATE_TALK => 'Ямдылыкын_каҥашымаш',
+ NS_TEMPLATE_TALK => 'Ямдылык_шотышто_каҥашымаш',
NS_HELP => 'Полшык',
- NS_HELP_TALK => 'Полшыкын_каҥашымаш',
+ NS_HELP_TALK => 'Полшык_шотышто_каҥашымаш',
NS_CATEGORY => 'Категорий',
- NS_CATEGORY_TALK => 'Категорийын_каҥашымаш',
+ NS_CATEGORY_TALK => 'Категорий_шотышто_каҥашымаш',
);
$namespaceAliases = array(
@@ -48,6 +48,31 @@ $namespaceAliases = array(
'ОбÑуждение_Ñправки' => NS_HELP_TALK,
'КатегориÑ' => NS_CATEGORY,
'ОбÑуждение_категории' => NS_CATEGORY_TALK,
+
+ // Namspace changes
+ 'Файлын_каҥашымаш' => NS_FILE_TALK,
+ 'Ямдылыкын_каҥашымаш' => NS_TEMPLATE_TALK,
+ 'Полшыкын_каҥашымаш' => NS_HELP_TALK,
+ 'Категорийын_каҥашымаш' => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+ 'Preferences' => array( 'Келыштарымаш' ),
+ 'Watchlist' => array( 'ЭÑкерымаш_лӱмер' ),
+ 'Recentchanges' => array( 'Пытартыш_тӧрлатымаш-влак' ),
+ 'Statistics' => array( 'Иктешлымаш' ),
+ 'Search' => array( 'Кычалмаш' ),
+);
+
+$magicWords = array(
+ 'img_right' => array( '1', 'пурла', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'шола', 'Ñлева', 'left' ),
+ 'img_border' => array( '1', 'чек', 'граница', 'border' ),
+ 'img_sub' => array( '1', 'йымалне', 'под', 'sub' ),
+ 'img_super' => array( '1', 'ӱмбалне', 'над', 'super', 'sup' ),
+ 'img_top' => array( '1', 'кӱшычын', 'Ñверху', 'top' ),
+ 'img_middle' => array( '1', 'покшелне', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'ӱлычын', 'Ñнизу', 'bottom' ),
);
$messages = array(
@@ -63,7 +88,7 @@ $messages = array(
'tog-numberheadings' => 'Вуймутым автоматик йӧн дене радамлаш',
'tog-showtoolbar' => 'Тӧрлатымаш ӱзгараҥам ончыкташ (JavaScript кӱлеш)',
'tog-showtoc' => 'Вуймут радамым ончыкташ (3 деч шуко вуймутан лаштык-влаклан)',
-'tog-rememberpassword' => 'Тиде компучырышто мыйын шолыпмутым шарнаш',
+'tog-rememberpassword' => 'Тиде компучырышто мыйын шолыпмутым шарнаш (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Мыйын ыштыме лаштык-влакым ÑÑкерыме лӱмерыш ешараш',
'tog-watchdefault' => 'Мыйын тӧрлатыме лаштык-влакым ÑÑкерыме лӱмерыш ешараш',
'tog-watchmoves' => 'Мыйын лӱмым вашталтыме лаштык-влакым ÑÑкерыме лӱмерыш ешараш',
@@ -169,30 +194,19 @@ $messages = array(
'qbspecialpages' => 'Лӱмын ыштыме лаштык-влак',
# Vector skin
-'vector-action-addsection' => 'У ӱжашым тӱҥалаш',
-'vector-action-delete' => 'Шӧраш',
-'vector-action-move' => 'КуÑараш',
-'vector-action-protect' => 'Тӧрлатымаш деч аралаш',
-'vector-action-undelete' => 'Шӧрымым пӧртылаш',
-'vector-action-unprotect' => 'Ðралаш огыл',
-'vector-namespace-category' => 'Категорий',
-'vector-namespace-help' => 'Полшык',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Лаштык',
-'vector-namespace-media' => 'Медиа-лаштык',
-'vector-namespace-mediawiki' => 'Увертарымаш',
-'vector-namespace-project' => 'Проект нерген',
-'vector-namespace-special' => 'Лӱмын ыштыме лаштык',
-'vector-namespace-talk' => 'Каҥашымаш',
-'vector-namespace-template' => 'Ямдылык',
-'vector-namespace-user' => 'Пайдаланышын лаштыкше',
-'vector-view-create' => 'Ышташ',
-'vector-view-edit' => 'Тӧрлаташ',
-'vector-view-history' => 'Эртымгорным ончалаш',
-'vector-view-view' => 'Лудаш',
-'vector-view-viewsource' => 'Тӱҥалтыш текÑтым ончалаш',
-'actions' => 'Сомылка-влак',
-'namespaces' => 'Лӱм-влакын кумдык-влак',
+'vector-action-addsection' => 'У ӱжашым тӱҥалаш',
+'vector-action-delete' => 'Шӧраш',
+'vector-action-move' => 'КуÑараш',
+'vector-action-protect' => 'Тӧрлатымаш деч аралаш',
+'vector-action-undelete' => 'Шӧрымым пӧртылаш',
+'vector-action-unprotect' => 'Ðралаш огыл',
+'vector-view-create' => 'Ышташ',
+'vector-view-edit' => 'Тӧрлаташ',
+'vector-view-history' => 'Эртымгорным ончалаш',
+'vector-view-view' => 'Лудаш',
+'vector-view-viewsource' => 'Тӱҥалтыш текÑтым ончалаш',
+'actions' => 'Сомылка-влак',
+'namespaces' => 'Лӱм-влакын кумдык-влак',
'errorpagetitle' => 'Йоҥылыш',
'returnto' => '$1 деке пӧртылаш.',
@@ -323,7 +337,7 @@ $messages = array(
'yourname' => 'Пайдаланышын лӱмжӧ:',
'yourpassword' => 'Шолыпмут:',
'yourpasswordagain' => 'Шолыпмутым угыч пуртымаш:',
-'remembermypassword' => 'Тиде компучырышто мыйын шолыпмутым шарнаш',
+'remembermypassword' => 'Тиде компучырышто мыйын шолыпмутым шарнаш (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Тендан домен:',
'login' => 'Шке денет палымым ыште',
'nav-login-createaccount' => 'Пураш/РегиÑтрацийым Ñрте',
@@ -583,37 +597,32 @@ $messages = array(
'action-edit' => 'тиде лаштыкым тӧрлаташ',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|тӧрлатымаш|тӧрлатымаш-влак}}',
-'recentchanges' => 'Пытартыш тӧрлатымаш-влак',
-'recentchanges-legend' => 'Пытартыш тӧрлатымаш-влакын келыштарымашышт',
-'recentchangestext' => 'Тиде лаштыкыште пытартыш тӧрлатымашым шекланаш.',
-'recentchanges-feed-description' => 'Тиде кылыште пытартыш тӧрлатымашым шекланаш.',
-'recentchanges-label-legend' => 'Умылтарымаш: $1.',
-'recentchanges-legend-newpage' => '$1 - у лаштык',
-'recentchanges-label-newpage' => 'Тиде тӧрлатымаш дене у лаштыкым ыштеныт',
-'recentchanges-legend-minor' => '$1 - изирак тӧрлатымаш',
-'recentchanges-label-minor' => 'Тиде изирак тӧрлатымаш',
-'recentchanges-legend-bot' => '$1 - бот тӧрлатымаш',
-'recentchanges-label-bot' => 'Тиде тӧрлатымашым бот ыштен',
-'recentchanges-legend-unpatrolled' => '$1 - тергымашдыме тӧрлатымаш',
-'recentchanges-label-unpatrolled' => 'Тиде тӧрлатымаш Ñше терген налын огыл',
-'rcnote' => "Ӱлнӧ {{PLURAL:$1|'''1'''|'''$1'''}} вашталтыш пытартыш {{PLURAL:$2||'''$2'''}} кечылан, $5-лан, $4-лан.",
-'rclistfrom' => '$1 гыч тӱҥалын у вашталтымашым ончыкташ',
-'rcshowhideminor' => 'Изирак тӧрлымым $1',
-'rcshowhidebots' => 'Бот-влакым $1',
-'rcshowhideliu' => 'Шолып пайдаланыше-влакым $1',
-'rcshowhideanons' => 'Ончыкталтше пайдаланыше-влакым $1',
-'rcshowhidemine' => 'Мыйын тӧрлымым $1',
-'rclinks' => 'Пытартыш $2 кечылан $1 вашталтымашым ончыкташ<br />$3',
-'diff' => 'ойырт.',
-'hist' => 'Ñрт.',
-'hide' => 'шылташ',
-'show' => 'ончыкташ',
-'minoreditletter' => 'и',
-'newpageletter' => 'У',
-'boteditletter' => 'б',
-'rc-enhanced-expand' => 'Тӱткынракым ончыкташ (JavaScript кӱлеш)',
-'rc-enhanced-hide' => 'Рашлык-влакым шылташ',
+'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-лан.",
+'rclistfrom' => '$1 гыч тӱҥалын у вашталтымашым ончыкташ',
+'rcshowhideminor' => 'Изирак тӧрлымым $1',
+'rcshowhidebots' => 'Бот-влакым $1',
+'rcshowhideliu' => 'Шолып пайдаланыше-влакым $1',
+'rcshowhideanons' => 'Ончыкталтше пайдаланыше-влакым $1',
+'rcshowhidemine' => 'Мыйын тӧрлымым $1',
+'rclinks' => 'Пытартыш $2 кечылан $1 вашталтымашым ончыкташ<br />$3',
+'diff' => 'ойырт.',
+'hist' => 'Ñрт.',
+'hide' => 'шылташ',
+'show' => 'ончыкташ',
+'minoreditletter' => 'и',
+'newpageletter' => 'У',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'Тӱткынракым ончыкташ (JavaScript кӱлеш)',
+'rc-enhanced-hide' => 'Рашлык-влакым шылташ',
# Recent changes linked
'recentchangeslinked' => 'Ваш кылдалтше тӧрлатымаш-влак',
@@ -685,7 +694,6 @@ $messages = array(
'statistics-edits-average' => 'Ик лаштыкым покшел тӧрлымӧ чот',
'statistics-views-total' => 'Чылажге ончымо',
'statistics-views-peredit' => 'Ик тӧрлатымашлан ончымо',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Паша черетын] кужытшо',
'statistics-users' => 'РегиÑтрацийым Ñртыше [[Special:ListUsers|пайдаланыше-влак]]',
'statistics-users-active' => 'Чӱчкыдын пайдаланыше-влак',
'statistics-users-active-desc' => 'Пытартыш {{PLURAL:$1|кечыште|$1 кечыште}} иктаж-мом ыштыше пайаланыше-влак',
@@ -766,7 +774,6 @@ $messages = array(
# Watchlist
'watchlist' => 'Мыйын ÑÑкерымаш лӱмер',
'mywatchlist' => 'Мыйын ÑÑкерымаш лӱмер',
-'watchlistfor' => "('''$1''' лан)",
'addedwatch' => 'ЭÑкерымаш лӱмерыш ешарыме',
'addedwatchtext' => "\"[[:\$1]]\" лаштыкым тыйын [[Special:Watchlist|ÑÑкерымаш лӱмерыш]] ешарыме.
Тиде лаштыкын да тудын каҥашымаш лаштыкым умбакыÑе тӧрлатымашым тиде ÑпиÑкыште ончыктымо лиеш да, Ñайрак ужаш манын, [[Special:RecentChanges|пытартыш тӧрлатымаш лӱмерыште]] '''кӱжгӧ шрифт''' дене ойырымо.",
@@ -1011,9 +1018,9 @@ $messages = array(
# Media information
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|лаштык|лаштык}}',
-'file-info-size' => '($1 × $2 пикÑел, файлын кугытшо: $3, MIME-тип: $4)',
+'file-info-size' => '$1 × $2 пикÑел, файлын кугытшо: $3, MIME-тип: $4',
'file-nohires' => '<small>Кугурак чаплык уке.</small>',
-'svg-long-desc' => '(SVG файл, шкенжын кугытшо: $1 × $2 пикÑел, файлын кугытшо: $3)',
+'svg-long-desc' => 'SVG файл, шкенжын кугытшо: $1 × $2 пикÑел, файлын кугытшо: $3',
'show-big-image' => 'Шкенжын чаплыкше',
'show-big-image-thumb' => '<small>Ончылгоч ончымашын кугытшо $1 × $2 пикÑель</small>',
diff --git a/languages/messages/MessagesMin.php b/languages/messages/MessagesMin.php
new file mode 100644
index 00000000..183aecf8
--- /dev/null
+++ b/languages/messages/MessagesMin.php
@@ -0,0 +1,700 @@
+<?php
+/** Minangkabau (Baso Minangkabau)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Naval Scene
+ * @author VoteITP
+ */
+
+$fallback = 'id';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Garih bawahi link:',
+'tog-highlightbroken' => 'Format link putuih <a href="" class="new">macam iko</a> (pilihan: macam iko<a href="" class="internal">?</a>).',
+'tog-justify' => 'Ratokan paragraf',
+'tog-hideminor' => 'Suruakkan suntingan ketek di parubahan tabaru',
+'tog-hidepatrolled' => 'Suruakkan suntingan nan lah dijago di parubahan tabaru',
+'tog-newpageshidepatrolled' => 'Suruakkan halaman nan lah dijago dari senarai halaman baru',
+'tog-extendwatchlist' => 'Kambangkan senarai pantauan untuak malihek sado parubahan, indak nan baru se',
+'tog-usenewrc' => 'Gunoan parubahan terkini tingkek lanjut (perlu JavaScript)',
+'tog-numberheadings' => 'Agiah nomor judua sacaro otomatis',
+'tog-editsection' => 'Fungsikan penyuntingan subbagian malalui [sunting] pranala',
+'tog-rememberpassword' => 'Kana log masuak denai di komputer ko (salamo of $1 {{PLURAL:$1|hari|hari}})',
+'tog-watchcreations' => 'Tambahkan halaman nan denai buek ka senarai pantauan',
+'tog-watchdefault' => 'Tambahkan halaman yang denai sunting ka senarai pantauan',
+'tog-watchmoves' => 'Tambahkan halaman yang denai pindahkan ka senarai pantauan',
+'tog-watchdeletion' => 'Tambahkan halaman yang denai hapuih ka senarai pantauan',
+'tog-previewontop' => 'Tampilkan pratonton sabalun kotak suntiang',
+
+# Dates
+'sunday' => 'Akaik',
+'monday' => 'Sinayan',
+'tuesday' => 'Salaso',
+'wednesday' => "Raba'a",
+'thursday' => 'Kamih',
+'friday' => 'Jumek',
+'saturday' => 'Sabtu',
+'sun' => 'Aha',
+'mon' => 'Sin',
+'tue' => 'Sal',
+'wed' => 'Rab',
+'thu' => 'Kam',
+'fri' => 'Jum',
+'sat' => 'Sab',
+'january' => 'Januari',
+'february' => 'Februari',
+'march' => 'Maret',
+'april' => 'April',
+'may_long' => 'Mei',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => 'Agustus',
+'september' => 'September',
+'october' => 'Oktober',
+'november' => 'November',
+'december' => 'Desember',
+'january-gen' => 'Januari',
+'february-gen' => 'Februari',
+'march-gen' => 'Maret',
+'april-gen' => 'April',
+'may-gen' => 'Mei',
+'june-gen' => 'Juni',
+'july-gen' => 'Juli',
+'august-gen' => 'Agustus',
+'september-gen' => 'September',
+'october-gen' => 'Oktober',
+'november-gen' => 'November',
+'december-gen' => 'Desember',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mar',
+'apr' => 'Apr',
+'may' => 'Mei',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Agu',
+'sep' => 'Sep',
+'oct' => 'Okt',
+'nov' => 'Nov',
+'dec' => 'Des',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
+'category_header' => 'Laman dalam kategori "$1"',
+'subcategories' => 'Subkategori',
+'hidden-categories' => '{{PLURAL:$1|Kategori tapandam|Kategori tapandam}}',
+'category-subcat-count' => '{{PLURAL:$2|Kategori ko hanyo punyo subkategori berikut.|Kategori ko punyo {{PLURAL:$1|subkategori|$1 subkategori}}, dari total $2.}}',
+'category-article-count' => '{{PLURAL:$2|Kategori ko hanyo punyo laman berikut.|Kategori ko punyo {{PLURAL:$1|laman|$1 laman}} dari total $2.}}',
+'listingcontinuesabbrev' => 'cont.',
+
+'about' => 'Tentang',
+'article' => 'Artikel',
+'newwindow' => '(buka di jendela baru)',
+'cancel' => 'Batalkan',
+'mytalk' => 'Ota denai',
+'navigation' => 'Navigasi',
+
+# Cologne Blue skin
+'qbfind' => 'Pencarian',
+'qbbrowse' => 'Browse',
+'qbedit' => 'Suntiang',
+'qbpageoptions' => 'Laman ko',
+'qbpageinfo' => 'Konteks',
+'qbmyoptions' => 'Laman denai',
+'qbspecialpages' => 'Halaman istimewa',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Bagian baru',
+'vector-action-delete' => 'Hapuih',
+
+'errorpagetitle' => 'Kesalahan',
+'returnto' => 'Baliak ka $1',
+'tagline' => 'Dari {{SITENAME}}',
+'help' => 'Bantuan',
+'search' => 'Cari',
+'searchbutton' => 'Cari',
+'searcharticle' => 'Tuju',
+'history' => 'Riwayat halaman',
+'history_short' => 'Riwayat',
+'printableversion' => 'Versi cetak',
+'permalink' => 'Pranala permanen',
+'edit' => 'Suntiang',
+'create' => 'Buek',
+'editthispage' => 'Suntiang laman ko',
+'delete' => 'Hapuih',
+'protect' => 'Lindungi',
+'protect_change' => 'ubah',
+'newpage' => 'Laman baru',
+'talkpage' => 'Musyawarahkan laman ko',
+'talkpagelinktext' => 'Kecek',
+'personaltools' => 'Peralatan pribadi',
+'talk' => 'Pembicaraan',
+'views' => 'Tampilan',
+'toolbox' => 'Kotak pakakeh',
+'otherlanguages' => 'Dalam baso lain',
+'redirectedfrom' => '(Dialiahkan dari $1)',
+'redirectpagesub' => 'Laman pengalihan',
+'lastmodifiedat' => 'Laman ko tarakhir diubah pado $1, maso $2.',
+'jumpto' => 'Lompek ka:',
+'jumptonavigation' => 'navigasi',
+'jumptosearch' => 'cari',
+
+# 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' => 'Tentang {{SITENAME}}',
+'aboutpage' => 'Project:Perihal',
+'copyright' => 'Kandungan tasadio dalam $1',
+'copyrightpage' => '{{ns:project}}:Hak cipta',
+'disclaimers' => 'Penyangkalan',
+'disclaimerpage' => 'Project:Penyangkalan umum',
+'edithelp' => 'Bantuan suntingan',
+'edithelppage' => 'Help:Suntingan',
+'helppage' => 'Help:Kandungan',
+'mainpage' => 'Halaman Utamo',
+'privacy' => 'Kebijakan privasi',
+'privacypage' => 'Project:Kebijakan privasi',
+
+'badaccess' => 'Kesalahan hak akses',
+
+'retrievedfrom' => 'Diperoleh dari "$1"',
+'youhavenewmessages' => 'Awak punyo $1 ($2).',
+'newmessageslink' => 'pasan baru',
+'newmessagesdifflink' => 'parubahan terakhir',
+'editsection' => 'suntiang',
+'editold' => 'suntiang',
+'editlink' => 'suntiang',
+'viewsourcelink' => 'Lihek sumber',
+'editsectionhint' => 'Suntiang bagian: $1',
+'toc' => 'Kandungan',
+'showtoc' => 'tampilkan',
+'hidetoc' => 'suruakkan',
+'site-rss-feed' => '$1 RSS Umpan',
+'site-atom-feed' => '$1 umpan Atom',
+'page-rss-feed' => 'Umpan RSS "$1"',
+'page-atom-feed' => '"$1" umpan Atom',
+'red-link-title' => '$1 (laman alun tasadio)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Laman',
+'nstab-user' => 'Laman pangguno',
+'nstab-special' => 'Laman istimewa',
+'nstab-project' => 'Laman proyek',
+'nstab-image' => 'Berkas',
+'nstab-template' => 'Templat',
+'nstab-category' => 'Kategori',
+
+# General errors
+'missing-article' => 'Basis data indak dapek manamukan teks dari laman yang seharusnyo ado, namo "$1" $2.
+
+Hal ko biasonyo disebabkan dek pranala usang ka riwayat terdahulu dari laman yang lah dihapuih.
+
+Jiko bukan iko penyebabnyo, awak mungkin lah manamukan sabuah bug dalam perangkat lunak ko.
+Sila laporkan ka [[Special:ListUsers/sysop|Pengurus]], dengan manandokan alamat URL nan dituju.',
+'missingarticle-rev' => '(revisi#: $1)',
+'badtitletext' => 'Permintaan judul laman indak sah, kosong, atau antarbaso atau antarwiki yang salah sambuang. Mungkin juo ado kandungan karakter yang indak buliah digunoan untuak judul.',
+'viewsource' => 'Lihek sumber',
+
+# Login and logout pages
+'yourname' => 'Namo pangguno:',
+'yourpassword' => 'Kato sandi:',
+'remembermypassword' => 'Kana log masuak denai di komputer ko (salamo $1 {{PLURAL:$1|hari|hari}})',
+'login' => 'Masuak log',
+'nav-login-createaccount' => 'Masuak log / buek akun',
+'userlogin' => 'Masuak log / buek akun',
+'logout' => 'Kalua log',
+'userlogout' => 'Kalua log',
+'nologinlink' => 'Cipta akun baru',
+'mailmypassword' => 'Kirim kato sandi baru',
+
+# Edit page toolbar
+'bold_sample' => 'Teks dicetak taba',
+'bold_tip' => 'Teks dicetak taba',
+'italic_sample' => 'Teks dicetak miriang',
+'italic_tip' => 'Teks dicetak miriang',
+'link_sample' => 'Judul pranala',
+'link_tip' => 'Pranala dalam',
+'extlink_sample' => 'http://www.example.com judul pranala',
+'extlink_tip' => 'Pranala lua (ingek awalannyo http://)',
+'headline_sample' => 'Teks tajuk',
+'headline_tip' => 'Tingkek 2 tajuk',
+'math_sample' => 'Masuakkan rumus di siko',
+'math_tip' => 'Rumus matematika (LaTeX)',
+'nowiki_sample' => 'Masuakkan disiko teks yang indak diformat',
+'nowiki_tip' => 'Abaikan pemformatan wiki',
+'image_tip' => 'Cantumkan berkas',
+'media_tip' => 'Pranala berkas',
+'sig_tip' => 'Tandotangan awak jo tando waktu',
+'hr_tip' => 'Garih horizontal',
+
+# Edit pages
+'summary' => 'Ringkasan:',
+'subject' => 'Subjek/tajuk:',
+'minoredit' => 'Iko di suntiang saketek',
+'watchthis' => 'Pantau laman ko',
+'savearticle' => 'Simpan halaman',
+'preview' => 'Pratonton',
+'showpreview' => 'Lihek pratonton',
+'showdiff' => 'Lihek parubahan',
+'anoneditwarning' => "'''Peringatan:''' Awak alun masuak log.
+Alamat IP awak akan tacatat pado riwayat suntingan laman ko.",
+'summary-preview' => 'Pratonton ringkasan:',
+'newarticle' => '(Baru)',
+'newarticletext' => "Laman nan awak cari alun ado.
+Untuak mambuek laman tu, mulailah dengan menulis dalam kotak dibawah (lihek [[{{MediaWiki:Helppage}}|laman bantuan]] untuak maklumat lanjut).
+Jiko awak indak sangajo sampai ka laman ko, klik tombol '''back''' pado penjelajah web awak.",
+'noarticletext' => 'Kini ko indak ado teks dalam laman ko.
+Awak dapek [[Special:Search/{{PAGENAME}}|mancari judul laman ko]] pado laman lain,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log nan bakaik],
+atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} suntiang laman ko]</span>.',
+'previewnote' => "'''Iko hanyo tampilan pratonton.'''
+Parubahan yang awak lakukan alun disimpan!",
+'editing' => 'Manyuntiang $1',
+'editingsection' => 'Suntiang $1 (bagian)',
+'copyrightwarning' => "Untuak diingek bahwa apo nan disumbang kapado {{SITENAME}} dianggap lah dilapeh dibawah $2 (lihek $1 untuak lengkapnyo).
+Jiko awak indak ingin apo nan ditulis tu disuntiang dan disebarkan, jan dikirim tulisan tu ka siko.<br />
+Awak juo mesti bajanji bahwa itu adolah hasil karya awak surang, atau disalin dari sumber milik basamo atau sumber bebas lainnyo.
+'''Jan dikirim karya punyo hak cipta tanpa izin!'''",
+'templatesused' => '{{PLURAL:$1|Templat|Templat}} yang digunoan di laman iko:',
+'templatesusedpreview' => '{{PLURAL:$1|Templat|Templat}} yang digunoan dalam pratonton ko:',
+'template-protected' => '(dilinduangi)',
+'template-semiprotected' => '(semi-perlindungan)',
+'hiddencategories' => 'Laman ko marupokan kalompok dari {{PLURAL:$1|1 kategori tapandam|$1 kategori tapandam}}:',
+'permissionserrorstext-withaction' => 'Awak indak punyo hak akses untuak $2, karano {{PLURAL:$1|alasan|alasan}} berikut:',
+
+# History pages
+'viewpagelogs' => 'Lihek log untuak laman ko',
+'currentrev-asof' => 'Revisi terkini pado $1',
+'revisionasof' => 'Revisi per $1',
+'previousrevision' => '↠Revisi sabalunnyo',
+'nextrevision' => 'Revisi selanjutnyo →',
+'currentrevisionlink' => 'Revisi terkini',
+'cur' => 'kini',
+'last' => 'sabalun',
+'histlegend' => "Membandingkan pilihan: Tandoi dari revisi yang ingin dibandingkan dengan memilih kotak radionyo dan tekan tombol ''Bandingkan revisi pilihan''.<br />
+Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''' = perbedaan jo revisi sabalunnyo, '''{{int:k}}''' = suntingan ketek, '''{{int:b}}''' = suntingan bot.",
+'history-fieldset-title' => 'Telusuri riwayat',
+'histfirst' => 'Nan lamo',
+'histlast' => 'Nan baru',
+
+# Revision deletion
+'rev-delundel' => 'tampilkan/suruakkan',
+'revdel-restore' => 'Ganti tampilan',
+
+# Merge log
+'revertmerge' => 'Batal bergabung',
+
+# Diffs
+'history-title' => 'Riwayat revisi dari "$1"',
+'difference' => '(Parbedaan antaro revisi)',
+'lineno' => 'Barih $1:',
+'compareselectedversions' => 'Bandingkan revisi pilihan',
+'editundo' => 'batalkan',
+
+# Search results
+'searchresults' => 'Hasil pencarian',
+'searchresults-title' => 'Hasil pencarian untuak "$1"',
+'searchresulttext' => 'Untuak informasi lanjut tentang pencarian {{SITENAME}}, lihek [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Awak mancari \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|sado laman yang dimulai jo "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sado laman nan tapauik ka "$1"]])',
+'searchsubtitleinvalid' => "Awak mancari '''$1'''",
+'notitlematches' => 'Indak ado judul nan pas',
+'notextmatches' => 'Indak ado judul nan pas',
+'prevn' => 'sabalunnyo {{PLURAL:$1|$1}}',
+'nextn' => 'salanjuiknyo {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Tampilkan ($1 {{int:pipe-separator}} $2) ($3)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 kato|$2 kato}})',
+'search-redirect' => '(pengalihan $1)',
+'search-section' => '(bagian $1)',
+'search-suggest' => 'Mungkin maksud awak: $1',
+'search-interwiki-caption' => 'Proyek badunsanak',
+'search-interwiki-default' => 'Hasil $1:',
+'search-interwiki-more' => '(selanjutnyo)',
+'search-mwsuggest-enabled' => 'dengan saran',
+'search-mwsuggest-disabled' => 'indak ado saran',
+'nonefound' => "'''Catatan''': hanyo babarapo ruangnamo yang dicari sacaro default.
+Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasuak laman ota, templat, dll), atau gunoan ruangnamo yang diinginkan sabagai awalan.",
+'powersearch' => 'Pencarian lanjut',
+'powersearch-legend' => 'Pencarian lanjut',
+'powersearch-ns' => 'Mancari di ruangnamo:',
+'powersearch-redir' => 'Senarai pengalihan',
+'powersearch-field' => 'Mancari',
+
+# Preferences page
+'preferences' => 'Preferensi',
+'mypreferences' => 'Preferensi denai',
+
+# Groups
+'group-sysop' => 'Pengurus',
+
+'grouppage-sysop' => '{{ns:project}}:Pengurus',
+
+# User rights log
+'rightslog' => 'Log parubahan hak akses',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'suntiang laman ko',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
+'recentchanges' => 'Parubahan baru',
+'recentchanges-legend' => 'Pilihan parubahan baru',
+'recentchanges-feed-description' => 'Temukan parubahan baru dalam umpan wiki ko',
+'rcnote' => "Berikut ko {{PLURAL:$1|'''1'''|'''$1'''}} parubahan dalam {{PLURAL:$2|hari|'''$2''' hari}} terakhir, sampai $5, pukul $4.",
+'rclistfrom' => 'Tampilkan parubahan baru sejak $1',
+'rcshowhideminor' => '$1 suntingan ketek',
+'rcshowhidebots' => '$1 bot',
+'rcshowhideliu' => '$1 pangguno masuak log',
+'rcshowhideanons' => '$1 pangguno anon',
+'rcshowhidemine' => '$1 suntingan denai',
+'rclinks' => 'Tampilkan $1 parubahan baru dalam $2 hari terakhir<br />$3',
+'diff' => 'beda',
+'hist' => 'versi',
+'hide' => 'Suruakkan',
+'show' => 'Tampilkan',
+'minoreditletter' => 'k',
+'newpageletter' => 'B',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Tampilkan rincian (perlu JavaScript)',
+'rc-enhanced-hide' => 'Suruakkan rincian',
+
+# Recent changes linked
+'recentchangeslinked' => 'Parubahan takaik',
+'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
+'recentchangeslinked-summary' => "Iko adolah senarai parubahan terakhir pado laman yang takaik jo laman tartantu (atau pado kalompok kategori tartantu).
+Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
+'recentchangeslinked-page' => 'Namo laman:',
+'recentchangeslinked-to' => 'Tampilkan parubahan dari laman yang takaik jo laman yang disajikan',
+
+# Upload
+'upload' => 'Unggah berkas',
+'uploadlogpage' => 'Log unggah',
+'uploadedimage' => 'unggah "[[$1]]"',
+
+# File description page
+'filehist' => 'Riwayat berkas',
+'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
+'filehist-current' => 'kini ko',
+'filehist-datetime' => 'Tanggal/Waktu',
+'filehist-thumb' => 'Miniatur',
+'filehist-thumbtext' => 'Miniatur untuak versi per $1',
+'filehist-user' => 'Pangguno',
+'filehist-dimensions' => 'Dimensi',
+'filehist-comment' => 'Ulasan',
+'imagelinks' => 'Pranala berkas',
+'linkstoimage' => 'Berikut ko ado {{PLURAL:$1|laman nan takaik|$1 laman nan takaik}} jo berkas ko:',
+'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
+'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
+
+# Statistics
+'statistics' => 'Statistik',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|bait|bait}}',
+'nmembers' => '$1 {{PLURAL:$1|anggota|anggota}}',
+'prefixindex' => 'Semua laman jo awalan',
+'newpages' => 'Laman baru',
+'move' => 'Pindahkan',
+'movethispage' => 'Pindahkan laman ko',
+'pager-newer-n' => '{{PLURAL:$1|labiah baru 1|labiah baru $1}}',
+'pager-older-n' => '{{PLURAL:$1|labiah lamo 1|labiah lamo $1}}',
+
+# Book sources
+'booksources' => 'Sumber buku',
+'booksources-search-legend' => 'Cari di sumber buku',
+'booksources-go' => 'Tuju',
+
+# Special:Log
+'log' => 'Log',
+
+# Special:AllPages
+'allpages' => 'Semua laman',
+'alphaindexline' => '$1 hinggo $2',
+'prevpage' => 'Laman sabalunnyo ($1)',
+'allpagesfrom' => 'Tampilkan laman mulai dari:',
+'allpagesto' => 'Tampilkan laman hinggo:',
+'allarticles' => 'Semua laman',
+'allpagessubmit' => 'Tuju',
+
+# Special:LinkSearch
+'linksearch' => 'Pranala lua',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Log pangguno baru',
+'newuserlog-create-entry' => 'Mendaftar sabagai pangguno',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(senarai anggota)',
+
+# E-mail user
+'emailuser' => 'E-mail pangguno',
+
+# Watchlist
+'watchlist' => 'Senarai pantauan denai',
+'mywatchlist' => 'Senarai pantauan den',
+'addedwatch' => 'Lah ditambahkan ka senarai pantauan',
+'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
+Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
+'removedwatch' => 'Lah dihapuih dari senarai pantauan',
+'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|senarai pantauan awak]].',
+'watch' => 'Pantau',
+'watchthispage' => 'Pantau laman ko',
+'unwatch' => 'Batal pantau',
+'watchlist-details' => '{{PLURAL:$1|$1 laman|$1 laman}} dalam senarai pantauan awak, indak tamasuak laman ota.',
+'wlshowlast' => 'Tampilkan $1 jam $2 hari terakhir $3',
+'watchlist-options' => 'Pilihan senarai pantauan',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Mamantau...',
+'unwatching' => 'indak dipantau le...',
+
+# Delete
+'deletepage' => 'Hapuih laman',
+'confirmdeletetext' => 'Awak akan mahapuih laman atau berkas basamo riwayatnyo.
+Pastikan awak mainginkannyo, dan awak lah tahu sagalo akibatnyo dan sasuai jo [[{{MediaWiki:Policy-url}}|kebijakan]] yang balaku.',
+'actioncomplete' => 'Proses selesai',
+'deletedtext' => '"<nowiki>$1</nowiki>" lah dihapuih.
+Lihek $2 untuak rekam jejak laman yang lah dihapuih.',
+'deletedarticle' => 'dihapuih "[[$1]]"',
+'dellogpage' => 'Log penghapusan',
+'deletecomment' => 'Alasan:',
+'deleteotherreason' => 'Alasan lain/tambahan:',
+'deletereasonotherlist' => 'Alasan lain',
+
+# Rollback
+'rollbacklink' => 'baliakkan',
+
+# Protect
+'protectlogpage' => 'Log perlindungan',
+'protectedarticle' => 'melindungi "[[$1]]"',
+'modifiedarticleprotection' => 'maubah tingkek perlindungan "[[$1]]"',
+'protectcomment' => 'Alasan:',
+'protectexpiry' => 'Kadaluwarsa:',
+'protect_expiry_invalid' => 'Maso kadaluwarsa indak balaku',
+'protect_expiry_old' => 'Maso kadaluwarsa adolah pado maso lampau',
+'protect-text' => "Awak buliah malihek jo mangganti tingkek perlindungan di siko untuak laman '''<nowiki>$1</nowiki>'''.",
+'protect-locked-access' => "Akun awak indak berhak untuak maubah tingkek perlindungan laman ko.
+Berikut ko pengaturan yang balaku untuak laman '''$1''':",
+'protect-cascadeon' => 'Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman|laman}} aktif perlindungan batingkek.
+Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlindungan batingkeknyo.',
+'protect-default' => 'Semua pangguno diizinkan',
+'protect-fallback' => 'Memerlukan hak akses "$1"',
+'protect-level-autoconfirmed' => 'Blokir pangguno baru dan indak terdaftar',
+'protect-level-sysop' => 'Hanya pengurus',
+'protect-summary-cascade' => 'batingkek',
+'protect-expiring' => 'kadaluwarsa $1 (UTC)',
+'protect-cascade' => 'Lindungi semua laman yang bakaik jo laman ko (perlindungan batingkek)',
+'protect-cantedit' => 'Awak indak dapek maubah tingkek perlindungan laman ko, karano awak indak berhak.',
+'restriction-type' => 'Perlindungan:',
+'restriction-level' => 'Tingkek larangan:',
+
+# Undelete
+'undeletelink' => 'tampilkan/pulihkan',
+'undeletedarticle' => 'dipulihkan "[[$1]]"',
+
+# Namespace form on various pages
+'namespace' => 'Ruangnamo:',
+'invert' => 'Baliakkan pilihan',
+'blanknamespace' => '(Utamo)',
+
+# Contributions
+'contributions' => 'Jariah pangguno',
+'contributions-title' => 'Jariah pangguno untuak $1',
+'mycontris' => 'Jariah denai',
+'contribsub2' => 'Untuak $1 ($2)',
+'uctop' => '(atas)',
+'month' => 'Sejak bulan (dan sabalunnyo):',
+'year' => 'Sejak tahun (dan sabalunnyo):',
+
+'sp-contributions-newbies' => 'Tampilkan jariah pangguno baru',
+'sp-contributions-blocklog' => 'log pemblokiran',
+'sp-contributions-search' => 'Cari jariah',
+'sp-contributions-username' => 'Alamat IP atau namo pangguno:',
+'sp-contributions-submit' => 'Cari',
+
+# What links here
+'whatlinkshere' => 'Pranala baliak',
+'whatlinkshere-title' => 'Laman yang bakaik ka "$1"',
+'whatlinkshere-page' => 'Laman:',
+'linkshere' => "Laman-laman ko bakaik ka '''[[:$1]]''':",
+'isredirect' => 'laman pengalihan',
+'istemplate' => 'transklusi',
+'isimage' => 'pranala berkas',
+'whatlinkshere-prev' => '{{PLURAL:$1|sabalunnyo|sabalunnyo $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|salanjuiknyo|salanjuiknyo $1}}',
+'whatlinkshere-links' => '↠pranala',
+'whatlinkshere-hideredirs' => '$1 pengalihan',
+'whatlinkshere-hidetrans' => '$1 transklusi',
+'whatlinkshere-hidelinks' => '$1 pranala',
+'whatlinkshere-filters' => 'Penapis',
+
+# Block/unblock
+'blockip' => 'Blokir pangguno',
+'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salamonyo:infinite',
+'ipblocklist' => 'Senarai pemblokiran alamat IP dan namo pangguno',
+'blocklink' => 'blokir',
+'unblocklink' => 'hilangkan blokir',
+'change-blocklink' => 'ubah blokir',
+'contribslink' => 'kontrib',
+'blocklogpage' => 'Log pemblokiran',
+'blocklogentry' => 'memblokir [[$1]] dalam maso berlaku $2 $3',
+'unblocklogentry' => 'mahilangkan blokir $1',
+'block-log-flags-nocreate' => 'cipta akun dimatikan',
+
+# Move page
+'movepagetext' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahkan semua data riwayat ka namo baru. Judul lamo tu akan manjadi laman peralihan manuju judul yang baru. Pranala ka judul lamo indak akan baubah. Pastikan diperiksa laman yang [[Special:DoubleRedirects|peralihan ganda]] atau [[Special:BrokenRedirects|peralihan rusak]]. Awak bertanggungjawab untuak memastikan bahwa pranala tu terus manyambuang ka laman yang seharusnyo.
+
+Perhatikan bahwa laman '''indak''' akan dipindah apobilo lah ado laman yang manggunokan judul yang baru, kecuali bilo laman tu kosong atau marupokan laman peralihan dan indak punyo riwayat suntingan. Maksudnyo awak dapek maubah namo laman seperti samulo apobilo ado kesalahan, dan awak indak dapek manimpo laman yang lah ado.
+
+'''Peringatan:''' Iko dapek maakibatkan parubahan yang tak diduga pado laman yang populer. Jadi pastikan awak paham akibat tindakan ko sabalun melanjutkannyo.",
+'movepagetalktext' => "Laman ota yang bakaitan akan dipindahkan sacaro otomatis '''kecuali apobilo:'''
+
+*Sebuah laman ota yang indak kosong lah ado pado judul baru, atau
+*Awak indak memberi tando pado kotak di bawahnyo
+
+Dalam kasus tu, apobilo diinginkan, awak dapek mamindahkan atau manggabuangkan laman sacaro manual.",
+'movearticle' => 'Pindahkan laman',
+'newtitle' => 'Ka judul baru:',
+'move-watch' => 'Pantau laman ko',
+'movepagebtn' => 'Pindahkan laman',
+'pagemovedsub' => 'Pamindahan berhasil',
+'movepage-moved' => '\'\'\'"$1" lah dipindahkan ka "$2"\'\'\'',
+'articleexists' => 'Laman dengan namo tu lah ado, atau namo yang awak pilih indak tapek. Silakan pilih namo lain',
+'talkexists' => "'''Laman tersebut berhasil dipindahkan, tapi laman otanyo indak dapek dipindahkan karano lah ado laman ota pado judul yang baru. Silakan digabuang laman ota tu sacaro manual.'''",
+'movedto' => 'dipindahkan ka',
+'movetalk' => 'Pindahkan laman ota yang takaik',
+'1movedto2' => 'mamindahkan [[$1]] ka [[$2]]',
+'1movedto2_redir' => 'mamindahkan [[$1]] ka [[$2]] malalui peralihan',
+'movelogpage' => 'Log pemindahan',
+'movereason' => 'Alasan:',
+'revertmove' => 'kembalikan',
+
+# Export
+'export' => 'Ekspor laman',
+
+# Thumbnails
+'thumbnail-more' => 'Pagadang',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Halaman pangguno awak',
+'tooltip-pt-mytalk' => 'Halaman ota awak',
+'tooltip-pt-preferences' => 'Preferensi denai',
+'tooltip-pt-watchlist' => 'Senarai laman nan denai pantau',
+'tooltip-pt-mycontris' => 'Senarai jariah denai',
+'tooltip-pt-login' => 'Awak disarankan untuak masuak log; meskipun, hal tu indak diwajibkan',
+'tooltip-pt-logout' => 'Kalua log',
+'tooltip-ca-talk' => 'Pembicaraan tentang isi halaman',
+'tooltip-ca-edit' => 'Awak buliah suntiang laman ko. Gunokan tombol pratonton sabalun manyimpan',
+'tooltip-ca-addsection' => 'Mulai bagian baru',
+'tooltip-ca-viewsource' => 'Laman ko dilinduangi.
+Awak hanyo buliah lihek sumber se',
+'tooltip-ca-history' => 'Revisi sabalunnyo laman ko',
+'tooltip-ca-protect' => 'Lindungi laman ko',
+'tooltip-ca-delete' => 'Hapuih laman ko',
+'tooltip-ca-move' => 'Pindahkan laman ko',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
+'tooltip-ca-unwatch' => 'Kaluaan laman ko dari senarai pantauan awak',
+'tooltip-search' => 'Cari {{SITENAME}}',
+'tooltip-search-go' => 'Cari suatu laman dengan namo yang samo jiko tasadio',
+'tooltip-search-fulltext' => 'Cari laman yang ado teks ko',
+'tooltip-n-mainpage' => 'Kunjungi Halaman Utamo',
+'tooltip-n-mainpage-description' => 'Kunjungi halaman utamo',
+'tooltip-n-portal' => 'Tentang proyek, apo yang dapek awak lakukan, di mano mancari sasuatu',
+'tooltip-n-currentevents' => 'Temukan informasi latar dari peristiwa kini ko',
+'tooltip-n-recentchanges' => 'Senarai parubahan baru dalam wiki',
+'tooltip-n-randompage' => 'Tampilkan sembarang halaman',
+'tooltip-n-help' => 'Tampek mancari bantuan',
+'tooltip-t-whatlinkshere' => 'Senarai sado halaman wiki yang punyo pranala ka halaman ko',
+'tooltip-t-recentchangeslinked' => 'Parubahan baru halaman nan bakaik jo laman ko',
+'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
+'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
+'tooltip-t-contributions' => 'Lihek senarai jariah pangguno ko',
+'tooltip-t-emailuser' => 'Kirimkan e-mail ka pangguno ko',
+'tooltip-t-upload' => 'Unggah berkas',
+'tooltip-t-specialpages' => 'Senarai semua halaman istimewa',
+'tooltip-t-print' => 'Versi cetak halaman ko',
+'tooltip-t-permalink' => 'Pranala permanen untuak revisi laman ko',
+'tooltip-ca-nstab-main' => 'Lihek isi laman',
+'tooltip-ca-nstab-user' => 'Lihek laman pangguno',
+'tooltip-ca-nstab-special' => 'Iko adolah laman istimewa, awak indak buliah manyuntiangnyo',
+'tooltip-ca-nstab-project' => 'Lihek laman proyek',
+'tooltip-ca-nstab-image' => 'Lihek laman berkas',
+'tooltip-ca-nstab-template' => 'Lihek templat',
+'tooltip-ca-nstab-help' => 'Lihek laman bantuan',
+'tooltip-ca-nstab-category' => 'Lihek laman kategori',
+'tooltip-minoredit' => 'Tandoi iko sabagai suntingan ketek',
+'tooltip-save' => 'Simpan yang awak ubah ko',
+'tooltip-preview' => 'Pratonton parubahan, harap gunokan iko sabalun disimpan',
+'tooltip-diff' => 'Lihek parubahan yang sudah awak buek tu',
+'tooltip-compareselectedversions' => 'Lihek parbedaan antaro duo revisi pilihan laman ko',
+'tooltip-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
+'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
+'tooltip-upload' => 'Mulai mamuek',
+'tooltip-rollback' => '"Baliakkan" baraliah suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
+'tooltip-undo' => '"Indak jadi" suntiangan ko dibaliakkan dan mambuka kotak suntiang dalam mode pratonton. Alasan dapek ditambah pado kotak ringkasan.',
+'tooltip-preferences-save' => 'Simpan preferensi',
+'tooltip-summary' => 'Masuakan sabuah ringkasan pendek',
+
+# Metadata
+'nodublincore' => 'Dublin Core RDF metadata dimatian untuak layanan ko',
+'nocreativecommons' => 'Creative Commons RDF metadata dimatian untuak layanan ko',
+'notacceptable' => 'Layanan wiki indak manyadioan data dalam format yang dapek dibaco dek pelanggan awak.',
+
+# Browsing diffs
+'previousdiff' => '↠Revisi sabalunnyo',
+'nextdiff' => 'Revisi salanjuiknyo →',
+
+# Media information
+'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
+'file-nohires' => '<small>Indak tasadio resolusi yang labiah tinggi.</small>',
+'svg-long-desc' => 'SVG berkas, nominal $1 × $2 piksel, ukuran berkas: $3',
+'show-big-image' => 'Resolusi penuh',
+'show-big-image-thumb' => '<small>Ukuran pratonton ini: $1 × $2 piksel</small>',
+
+# Bad image list
+'bad_image_list' => 'Formatnyo sabagai berikut:
+
+Hanyo butir senarai (barih diawali jo tando *) yang dihituang.
+Pranala partamo pado barih tu mesti bakaik ka berkas nan buruak.
+Pranala-pranala salanjuiknyo pado barih nan samo dianggap sabagai pengecualian, yaitu laman nan dapek manampilkan berkas tu.',
+
+# Metadata
+'metadata' => 'Metadata',
+'metadata-help' => 'Berkas ko mengandung informasi tambahan yang mungkin ditambahkan dek kamera digital atau pemindai yang digunokan untuak mambuek atau mendigitalisasi berkas. Jiko berkas ko lah mangalami modifikasi, rincian yang ado mungkin indak sacaro penuh merefleksikan modifikasi berkas tu.',
+'metadata-expand' => 'Tampilkan rincian tambahan',
+'metadata-collapse' => 'Suruakkan rincian tambahan',
+'metadata-fields' => 'Pesan EXIF metadata ko akan ditampilkan pado laman informasi gambar jiko tabel metadata disuruakkan.
+Nan lainnyo akan tasuruak sacaro default.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength',
+
+# External editor support
+'edit-externally' => 'Suntiang berkas ko dengan aplikasi lua',
+'edit-externally-help' => '(Lihek [http://www.mediawiki.org/wiki/Manual:External_editors instruksi pengaturan] untuak maklumat lanjutnyo)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'semua',
+'namespacesall' => 'semua',
+'monthsall' => 'semua',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Tampilkan parubahan takaik',
+'watchlisttools-edit' => 'Tampilkan dan suntiang senarai pantauan',
+'watchlisttools-raw' => 'Suntiang senarai pantauan mentah',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-result-n' => 'Berkas "$1" punyo {{PLURAL:$2|1 duplikat identik|$2 duplikat identik}}.',
+
+# Special:SpecialPages
+'specialpages' => 'Laman istimewa',
+
+);
diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php
index 43340efa..2aacfac1 100644
--- a/languages/messages/MessagesMk.php
+++ b/languages/messages/MessagesMk.php
@@ -22,7 +22,7 @@
$namespaceNames = array(
NS_MEDIA => 'Медија',
- NS_SPECIAL => 'Специјални',
+ NS_SPECIAL => 'Специјална',
NS_TALK => 'Разговор',
NS_USER => 'КориÑник',
NS_USER_TALK => 'Разговор_Ñо_кориÑник',
@@ -40,6 +40,7 @@ $namespaceNames = array(
);
$namespaceAliases = array(
+ 'Специјални' => NS_SPECIAL,
'Слика' => NS_FILE,
'Разговор_за_Ñлика' => NS_FILE_TALK,
);
@@ -94,15 +95,16 @@ $specialPageAliases = array(
'Disambiguations' => array( 'ПојаÑнувања' ),
'Userlogin' => array( 'Ðајавување' ),
'Userlogout' => array( 'Одјавување' ),
- 'CreateAccount' => array( 'СоздајКириÑничкаСметка' ),
+ 'CreateAccount' => array( 'СоздајКориÑничкаСметка' ),
'Preferences' => array( 'Ðагодувања' ),
- 'Watchlist' => array( 'ЛиÑтаÐаÐабљудувања' ),
+ 'Watchlist' => array( 'СпиÑокÐаÐабљудувања' ),
'Recentchanges' => array( 'СкорешниПромени' ),
- 'Upload' => array( 'Подигнување', 'Подигнувања' ),
- 'Listfiles' => array( 'ЛиÑтаÐаСлики', 'ЛиÑтаÐаПодатотеки' ),
+ 'Upload' => array( 'Подигање', 'Подигања' ),
+ 'UploadStash' => array( 'СкриениПодигања' ),
+ 'Listfiles' => array( 'СпиÑокÐаПодатотеки', 'СпиÑокÐаСлики' ),
'Newimages' => array( 'ÐовиСлики', 'ÐовиПодатотеки' ),
- 'Listusers' => array( 'ЛиÑтаÐаКориÑници', 'ЛиÑтаКориÑници' ),
- 'Listgrouprights' => array( 'ЛиÑтаÐаГрупниПрава' ),
+ 'Listusers' => array( 'СпиÑокÐаКориÑници', 'СпиÑокКориÑници' ),
+ 'Listgrouprights' => array( 'СпиÑокÐаГрупниПрава' ),
'Statistics' => array( 'СтатиÑтики' ),
'Randompage' => array( 'Случајна', 'СлучајнаСтраница' ),
'Lonelypages' => array( 'ОÑамениСтраници', 'СтранциСирачиња' ),
@@ -113,9 +115,9 @@ $specialPageAliases = array(
'Unusedcategories' => array( 'ÐеиÑкориÑтениКатегории' ),
'Unusedimages' => array( 'ÐеиÑкориÑтениСлики', 'ÐеиÑкориÑтениПодатотеки' ),
'Wantedpages' => array( 'ПрекинатиВрÑки' ),
- 'Wantedcategories' => array( 'БараниКатегории' ),
- 'Wantedfiles' => array( 'БараниПодатотеки' ),
- 'Wantedtemplates' => array( 'БараниШаблони' ),
+ 'Wantedcategories' => array( 'ПотребниКатегории' ),
+ 'Wantedfiles' => array( 'ПотребниПодатотеки' ),
+ 'Wantedtemplates' => array( 'ПотребниШаблони' ),
'Mostlinked' => array( 'СоÐајмногуВрÑки', 'СтранициСоÐајмногуВрÑки' ),
'Mostlinkedcategories' => array( 'ÐајупотребуваниКатегории' ),
'Mostlinkedtemplates' => array( 'ÐајупотребуваниШаблони' ),
@@ -132,11 +134,12 @@ $specialPageAliases = array(
'Protectedtitles' => array( 'ЗаштитениÐаÑлови' ),
'Allpages' => array( 'СитеСтраници' ),
'Prefixindex' => array( 'ИндекÑÐаПрефикÑи' ),
- 'Ipblocklist' => array( 'ЛиÑтаÐаБлокираниIP' ),
+ 'Ipblocklist' => array( 'СпиÑокÐаБлокираниIP' ),
+ 'Unblock' => array( 'Одблокирај' ),
'Specialpages' => array( 'СпецијалниСтраници' ),
'Contributions' => array( 'ПридонеÑи' ),
- 'Emailuser' => array( 'Пиши е-пошта на кориÑникот' ),
- 'Confirmemail' => array( 'Потврди е-пошта' ),
+ 'Emailuser' => array( 'Пиши_е-пошта_на_кориÑникот' ),
+ 'Confirmemail' => array( 'Потврди_е-пошта' ),
'Whatlinkshere' => array( 'ШтоВодиОвде' ),
'Recentchangeslinked' => array( 'ПоврзаниПромени' ),
'Movepage' => array( 'ПремеÑтиСтраница' ),
@@ -156,18 +159,20 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'MIMEПребарување' ),
'FileDuplicateSearch' => array( 'ПребарувањеДупликатПодатотека' ),
'Unwatchedpages' => array( 'ÐенабљудуваниСтраници' ),
- 'Listredirects' => array( 'ЛиÑтаÐаПренаÑочувања' ),
+ 'Listredirects' => array( 'СпиÑокÐаПренаÑочувања' ),
'Revisiondelete' => array( 'БришењеРевизија' ),
'Unusedtemplates' => array( 'ÐеиÑкориÑтениШаблони' ),
'Randomredirect' => array( 'СлучајноПренаÑочување' ),
'Mypage' => array( 'МојаСтраница' ),
'Mytalk' => array( 'МојРазговор', 'МоиРазговори' ),
'Mycontributions' => array( 'МоиПридонеÑи' ),
- 'Listadmins' => array( 'ЛиÑтаÐаÐдминиÑтратори' ),
- 'Listbots' => array( 'ЛиÑтаÐаБотови' ),
+ 'Myuploads' => array( 'МоиПодигања' ),
+ 'PermanentLink' => array( 'ПоÑтојанаВрÑка' ),
+ 'Listadmins' => array( 'СпиÑокÐаÐдминиÑтратори' ),
+ 'Listbots' => array( 'СпиÑокÐаБотови' ),
'Popularpages' => array( 'ПопуларниСтраници' ),
'Search' => array( 'Барај' ),
- 'Resetpass' => array( 'РеÑетирајЛозинка' ),
+ 'Resetpass' => array( 'СмениЛозинка' ),
'Withoutinterwiki' => array( 'БезИнтервики' ),
'MergeHistory' => array( 'СпојувањеИÑторија' ),
'Filepath' => array( 'ПатДоПодатотека' ),
@@ -177,6 +182,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'ИзбришаниПридонеÑи' ),
'Tags' => array( 'Oзнаки', 'Приврзоци' ),
'Activeusers' => array( 'ÐктивниКориÑници' ),
+ 'ComparePages' => array( 'СпоредиСтраници' ),
+ 'Badtitle' => array( 'ЛошÐаÑлов' ),
+ 'DisableAccount' => array( 'ОневозможиСметка' ),
);
$magicWords = array(
@@ -187,17 +195,19 @@ $magicWords = array(
'toc' => array( '0', '__СОДРЖИÐÐ__', '__TOC__' ),
'noeditsection' => array( '0', '__БЕЗ_УРЕДУВÐЊЕ_ÐÐ_СЕКЦИИ__', '__NOEDITSECTION__' ),
'noheader' => array( '0', '__БЕЗÐÐСЛОВ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'СЕГÐШЕÐМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'СЕГÐШЕÐМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'СЕГÐШЕÐМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'СЕГÐШЕÐМЕСЕЦСКР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'СЕГÐШЕÐДЕÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'СЕГÐШЕÐДЕÐ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'СЕГÐШЕÐДЕÐИМЕ', 'CURRENTDAYNAME' ),
+ 'currentmonth' => array( '1', 'ТЕКОВЕÐМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ТЕКОВЕÐМЕСЕЦ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ТЕКОВЕÐМЕСЕЦСКР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ТЕКОВЕÐДЕÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ТЕКОВЕÐДЕÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ТЕКОВЕÐДЕÐИМЕ', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'СЕГÐШÐÐГОДИÐÐ', 'CURRENTYEAR' ),
'currenttime' => array( '1', 'СЕГÐШÐОВРЕМЕ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'СЕГÐШЕÐЧÐС', 'CURRENTHOUR' ),
+ 'currenthour' => array( '1', 'ТЕКОВЕÐЧÐС', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'МЕСЕЦ_ЛОКÐЛÐО', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'МЕСЕЦ_ЛОКÐЛÐО1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'МЕСЕЦИМЕ_ЛОКÐЛÐО', 'LOCALMONTHNAME' ),
'localday' => array( '1', 'ДЕÐ_ЛОКÐЛÐО', 'LOCALDAY' ),
'localday2' => array( '1', 'ДЕÐ2_ЛОКÐЛÐО', 'LOCALDAY2' ),
@@ -209,6 +219,7 @@ $magicWords = array(
'numberofarticles' => array( '1', 'БРОЈСТÐТИИ', 'БРОЈÐÐСТÐТИИ', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'БРОЈÐÐПОДÐТОТЕКИ', 'NUMBEROFFILES' ),
'numberofusers' => array( '1', 'БРОЈÐÐКОРИСÐИЦИ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'БРОЈÐÐÐКТИВÐИКОРИСÐИЦИ', 'NUMBEROFACTIVEUSERS' ),
'numberofedits' => array( '1', 'БРОЈÐÐУРЕДУВÐЊÐ', 'NUMBEROFEDITS' ),
'numberofviews' => array( '1', 'БРОЈÐÐПРЕГЛЕДУВÐЊÐ', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
@@ -216,10 +227,11 @@ $magicWords = array(
'namespace' => array( '1', 'ИМЕПРОСТОР', 'ИМЕÐСКИПРОСТОР', 'NAMESPACE' ),
'talkspace' => array( '1', 'РÐЗГОВОРПРОСТОР', 'TALKSPACE' ),
'fullpagename' => array( '1', 'ЦЕЛОСÐОИМЕÐÐСТРÐÐИЦÐ', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'ИМЕÐÐПОДСТРÐÐИЦÐ', 'SUBPAGENAME' ),
+ 'subpagename' => array( '1', 'ИМЕÐÐПОТСТРÐÐИЦÐ', 'SUBPAGENAME' ),
'basepagename' => array( '1', 'ИМЕÐÐОСÐОВÐÐСТРÐÐИЦÐ', 'BASEPAGENAME' ),
'talkpagename' => array( '1', 'СТРÐÐИЦÐЗÐРÐЗГОВОР', 'TALKPAGENAME' ),
- 'subst' => array( '0', 'ЗÐМЕСТ:', 'SUBST:' ),
+ 'subst' => array( '0', 'ЗÐМЕÐИ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'БЕЗБЗÐМЕÐИ', 'SAFESUBST:' ),
'msgnw' => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'мини', 'мини-Ñлика', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'мини-Ñлика=$1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -231,36 +243,70 @@ $magicWords = array(
'img_framed' => array( '1', 'рамка', 'ворамка', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'безрамка', 'frameless' ),
'img_page' => array( '1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
- 'img_top' => array( '1', 'врв', 'top' ),
+ 'img_upright' => array( '1', 'иÑправено', 'иÑправено=$1', 'иÑправено $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'граничник', 'граница', 'border' ),
+ 'img_baseline' => array( '1', 'оÑновналинија', 'baseline' ),
+ 'img_sub' => array( '1', 'долениндекÑ', 'дол', 'sub' ),
+ 'img_super' => array( '1', 'горениндекÑ', 'гор', 'super', 'sup' ),
+ 'img_top' => array( '1', 'врв', 'најгоре', 'top' ),
+ 'img_text_top' => array( '1', 'текÑÑ‚-врв', 'текÑÑ‚-најгоре', 'text-top' ),
'img_middle' => array( '1', 'Ñредина', 'middle' ),
- 'img_bottom' => array( '1', 'дно', 'bottom' ),
+ 'img_bottom' => array( '1', 'дно', 'најдолу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'текÑÑ‚-дно', 'текÑÑ‚-најдолу', 'text-bottom' ),
'img_link' => array( '1', 'врÑка=$1', 'link=$1' ),
- 'sitename' => array( '1', 'ИМЕÐÐСÐЈТ', 'SITENAME' ),
+ 'img_alt' => array( '1', 'алт=$1', 'alt=$1' ),
+ 'sitename' => array( '1', 'ИМЕÐÐМРЕЖÐОМЕСТО', 'ИМЕÐÐСÐЈТ', 'SITENAME' ),
'localurl' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐ:', 'LOCALURL:' ),
'localurle' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐИ:', 'LOCALURLE:' ),
- 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'ИМЕÐÐСЕРВЕР', 'SERVERNAME' ),
+ 'server' => array( '0', 'ОПСЛУЖУВÐЧ', 'SERVER' ),
+ 'servername' => array( '0', 'ИМЕÐÐОПСЛУЖУВÐЧ', 'SERVERNAME' ),
'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
'currentweek' => array( '1', 'СЕГÐШÐÐСЕДМИЦÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ТЕКОВЕÐДЕÐВОСЕДМИЦÐТÐ', 'CURRENTDOW' ),
'localweek' => array( '1', 'СЕДМИЦÐ_ЛОКÐЛÐО', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ЛОКÐЛЕÐДЕÐВОСЕДМИЦÐТÐ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ÐÐЗÐÐКÐÐÐРЕВИЗИЈÐ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕÐÐÐРЕВИЗИЈÐ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕÐÐÐРЕВИЗИЈÐ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЕЦÐÐРЕВИЗИЈÐ', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'МЕСЕЦÐÐРЕВИЗИЈÐ1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'ГОДИÐÐÐÐРЕВИЗИЈÐ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ВРЕМЕÐÐРЕВИЗИЈÐ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'КОРИСÐИКÐÐÐÐРЕВИЗИЈÐ', 'REVISIONUSER' ),
'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'PLURAL:' ),
- 'raw' => array( '0', 'РЕД:', 'RAW:' ),
+ 'fullurl' => array( '0', 'ПОЛÐÐURL:', 'FULLURL:' ),
+ 'raw' => array( '0', 'СИРОВО:', 'РЕД:', 'RAW:' ),
'displaytitle' => array( '1', 'ПРИКÐЖИÐÐСЛОВ', 'DISPLAYTITLE' ),
'currentversion' => array( '1', 'ТЕКОВÐÐВЕРЗИЈÐ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ШИФРИРÐЈURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ШИФРИРÐЈКОТВÐ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ОЗÐÐЧЕÐОТЕКОВÐОВРЕМЕ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ОЗÐÐЧЕÐОЛОКÐЛÐОВРЕМЕ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ОЗÐÐКÐЗÐÐÐСОКÐ', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#ЈÐЗИК:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ЈÐЗИКÐÐСОДРЖИÐÐТÐ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'СТРÐÐИЦИВОИМЕÐСКИПРОСТОР', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
'numberofadmins' => array( '1', 'БРОЈÐÐÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ФОРМÐТБРОЈ', 'FORMATNUM' ),
+ 'special' => array( '0', 'Ñпецијална', 'Ñпецијални', 'special' ),
'defaultsort' => array( '1', 'ОСÐОВÐОПОДРЕДУВÐЊЕ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'tag' => array( '0', 'приврзок', 'tag' ),
+ 'tag' => array( '0', 'ознака', 'tag' ),
'hiddencat' => array( '1', '__СКРИЕÐÐ_КÐТЕГОРИЈÐ__', '__СКРИЕÐÐКÐТЕГОРИЈÐ__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'СТРÐÐИЦИВОКÐТЕГОРИЈÐ', 'СТРÐÐИЦИВОКÐТ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'ГОЛЕМИÐÐ_ÐÐ_СТРÐÐИЦÐ', 'PAGESIZE' ),
'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
'noindex' => array( '1', '__БЕЗИÐДЕКС__', '__NOINDEX__' ),
'staticredirect' => array( '1', '__СТÐТИЧÐОПРЕÐÐСОЧУВÐЊЕ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ÐИВОÐÐЗÐШТИТÐ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'форматнадатум', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ПÐТЕКÐ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
+ 'url_query' => array( '0', 'БÐРÐЊЕ', 'QUERY' ),
);
$linkTrail = '/^([a-zабвгдѓежзѕијклљмнњопрÑтќуфхцчџш]+)(.*)$/sDu';
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -275,16 +321,15 @@ $messages = array(
'tog-numberheadings' => 'Ðвтоматонумерирање на заглавијата',
'tog-showtoolbar' => 'Прикажи алатник за уредување (JavaScript)',
'tog-editondblclick' => 'Уредување на Ñтраници при двојно кликнување (JavaScript)',
-'tog-editsection' => 'Овозможи уредување на заглавија преку [уреди] врÑки',
+'tog-editsection' => 'Овозможи уредување на заглавија преку врÑките [уреди]',
'tog-editsectiononrightclick' => 'Овозможи уредување на заглавија Ñо деÑен клик на нивниот наÑлов (JavaScript)',
'tog-showtoc' => 'Покажи Ñодржина (за Ñтраници Ñо повеќе од 3 заглавија)',
-'tog-rememberpassword' => 'Зачувај ги моите податоци за најавување на овој компјутер',
-'tog-editwidth' => 'МакÑимална ширина на кутијата за уредување',
+'tog-rememberpassword' => 'Запомни ме на овој прелиÑтувач (највеќе до $1 {{PLURAL:$1|ден|дена}})',
'tog-watchcreations' => 'Додавај ги Ñтраниците што ги Ñоздавам во ÑпиÑокот на набљудувања',
'tog-watchdefault' => 'Додавај ги Ñтраниците што ги уредувам во ÑпиÑокот на набљудувања',
'tog-watchmoves' => 'Додавај ги Ñтраниците што ги премеÑтувам во ÑпиÑокот на набљудувања',
'tog-watchdeletion' => 'Додавај ги Ñтраниците што ги бришам во ÑпиÑокот на набљудувања',
-'tog-minordefault' => 'Обележи ги Ñите уредувања како Ñитни по оÑновно',
+'tog-minordefault' => 'Обележувај ги Ñите уредувања како Ñитни по оÑновно',
'tog-previewontop' => 'Прикажи го прегледот пред кутијата за уредување',
'tog-previewonfirst' => 'Прикажи преглед на првото уредување',
'tog-nocache' => 'Оневозможи кеширање на Ñтраниците во прелиÑтувачот',
@@ -426,31 +471,21 @@ $messages = array(
'faqpage' => 'Project:ЧПП',
# Vector skin
-'vector-action-addsection' => 'Додај тема',
-'vector-action-delete' => 'Избриши',
-'vector-action-move' => 'ПремеÑти',
-'vector-action-protect' => 'Заштити',
-'vector-action-undelete' => 'Врати',
-'vector-action-unprotect' => 'ОтÑтрани заштита',
-'vector-namespace-category' => 'Категорија',
-'vector-namespace-help' => 'Страница за помош',
-'vector-namespace-image' => 'Податотека',
-'vector-namespace-main' => 'Страница',
-'vector-namespace-media' => 'Мултимедијална Ñтраница',
-'vector-namespace-mediawiki' => 'Порака',
-'vector-namespace-project' => 'Проектна Ñтраница',
-'vector-namespace-special' => 'Специјална Ñтраница',
-'vector-namespace-talk' => 'Разговор',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'КориÑничка Ñтраница',
-'vector-view-create' => 'Создај',
-'vector-view-edit' => 'Уреди',
-'vector-view-history' => 'Види иÑторија',
-'vector-view-view' => 'Читај',
-'vector-view-viewsource' => 'Извор',
-'actions' => 'ДејÑтва',
-'namespaces' => 'ИменÑки проÑтори',
-'variants' => 'Варијанти',
+'vector-action-addsection' => 'Додај тема',
+'vector-action-delete' => 'Избриши',
+'vector-action-move' => 'ПремеÑти',
+'vector-action-protect' => 'Заштити',
+'vector-action-undelete' => 'Врати',
+'vector-action-unprotect' => 'ОтÑтрани заштита',
+'vector-simplesearch-preference' => 'Овозможи збогатени предлози при пребарување (Ñамо за рувото „ВекторÑко“)',
+'vector-view-create' => 'Создај',
+'vector-view-edit' => 'Уреди',
+'vector-view-history' => 'Види иÑторија',
+'vector-view-view' => 'Читај',
+'vector-view-viewsource' => 'Извор',
+'actions' => 'ДејÑтва',
+'namespaces' => 'ИменÑки проÑтори',
+'variants' => 'Варијанти',
'errorpagetitle' => 'Грешка',
'returnto' => 'Ðазад на $1.',
@@ -511,6 +546,9 @@ $messages = array(
Ве молиме почекајте некое време пред повторно да Ñе обидете да приÑтапите до оваа Ñтраница.
$1',
+'pool-timeout' => 'ИÑтече времето за чекање на заклучувањето',
+'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}}',
@@ -681,7 +719,8 @@ $2',
'yourname' => 'КориÑничко име:',
'yourpassword' => 'Лозинка:',
'yourpasswordagain' => 'Повторете ја лозинката:',
-'remembermypassword' => 'Запомни го моето најавување на овој компјутер',
+'remembermypassword' => 'Запомни ме на овој Ñметач (највеќе $1 {{PLURAL:$1|ден|дена}})',
+'securelogin-stick-https' => 'ОÑтанете поврзани Ñо HTTPS по одјавата',
'yourdomainname' => 'Вашиот домен:',
'externaldberror' => 'ÐаÑтана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна Ñметка.',
'login' => 'Ðајава',
@@ -698,6 +737,7 @@ $2',
'gotaccount' => "Веќе имате кориÑничка Ñметка? '''$1'''.",
'gotaccountlink' => 'Ðајавете Ñе',
'createaccountmail' => 'по е-пошта',
+'createaccountreason' => 'Причина:',
'badretype' => 'ВнеÑените лозинки не Ñе иÑти.',
'userexists' => 'КориÑничкото име што го внеÑовте веќе Ñе кориÑти.
Ве молиме изберете друго име.',
@@ -718,12 +758,13 @@ $2',
Проверете да не Ñте направиле грешка во пишувањето, или [[Special:UserLogin/signup|Ñоздајте нова кориÑничка Ñметка]].',
'nosuchusershort' => 'Ðема кориÑник Ñо името „<nowiki>$1</nowiki>“.
Проверете дали правилно Ñте напишале.',
-'nouserspecified' => 'Мора да назначите кориÑничко име.',
+'nouserspecified' => 'Мора да наведете кориÑничко име.',
'login-userblocked' => 'Овој кориÑник е блокиран. Ðајавувањето не е дозволено.',
'wrongpassword' => 'ВнеÑовте погрешна лозинка. Обидете Ñе повторно.',
'wrongpasswordempty' => 'ВнеÑената лозинка е празна. Обидете Ñе повторно.',
'passwordtooshort' => 'Лозинката мора да има најмалку {{PLURAL:$1|1 знак|$1 знаци}}.',
'password-name-match' => 'Лозинката мора да Ñе разликува од кориÑничкото име.',
+'password-login-forbidden' => 'Употребата на ова кориÑничко име и лозинка е забранета.',
'mailmypassword' => 'ИÑпрати нова лозинка по е-пошта',
'passwordremindertitle' => 'Ðова привремена лозинка за {{SITENAME}}',
'passwordremindertext' => 'Ðекој (најверојатно вие, од IP-адреÑа $1) побара нова лозинка за {{SITENAME}} ($4).
@@ -764,6 +805,9 @@ $2',
'loginlanguagelabel' => 'Јазик: $1',
'suspicious-userlogout' => 'Вашето барање за одјава е одбиено бидејќи Ñе чини дека е иÑпратено од раÑипан прелиÑтувач или кеширачки заÑтапник (proxy).',
+# E-mail sending
+'php-mail-error-unknown' => 'Ðепозната грешка во функцијата mail() на PHP',
+
# Password reset dialog
'resetpass' => 'Промена на лозинка',
'resetpass_announce' => 'Ðајавени Ñте Ñо привремена лозинка пратена по е-пошта.
@@ -817,9 +861,11 @@ $2',
'showdiff' => 'Прикажи промени',
'anoneditwarning' => "'''Предупредување:''' Ðе Ñте најавени.
Вашата IP-адреÑа ќе биде заведена во иÑторијата на уредување на Ñтраницата.",
+'anonpreviewwarning' => "''Ðе Ñте најавени. Ðко ја зачувате, Вашата IP-адреÑа ќе биде заведена во иÑторијата на уредување на Ñтраницата.''",
'missingsummary' => "'''ПотÑетник:''' Ðе внеÑовте Ð¾Ð¿Ð¸Ñ Ð½Ð° измените. Ðко притиÑнете Зачувај повторно, вашите измени ќе Ñе зачуваат без опиÑ.",
'missingcommenttext' => 'Ве молиме внеÑете коментар подолу.',
-'missingcommentheader' => "'''ПотÑетување:''' Ðе внеÑовте наÑлов за овој коментар. Ðко повторно кликнете на Зачувај, вашето уредување ќе биде запамтено без наÑлов.",
+'missingcommentheader' => "'''ПотÑетување:''' Ðе внеÑовте наÑлов за овој коментар.
+Ðко повторно кликнете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наÑлов.",
'summary-preview' => 'Изглед на опиÑот:',
'subject-preview' => 'Преглед на предметот/наÑловот:',
'blockedtitle' => 'КориÑникот е блокиран',
@@ -896,8 +942,12 @@ $2',
'userjsyoucanpreview' => "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја иÑпробате вашата нова JavaScript пред да зачувате.",
'usercsspreview' => "'''Запомнете дека ова е Ñамо преглед на вашиот кориÑнички CSS код, Ñтраницата Ñè уште не е зачувана!'''",
'userjspreview' => "'''Запомнете дека ова е Ñамо преглед на вашиот JavaScript код, Ñтраницата Ñè уште не е зачувана!'''",
-'userinvalidcssjstitle' => "'''Предупредување:''' Ðема руво „$1“.
-Запомнете дека ÑопÑтвените .css и .js Ñтраници имаат имиња Ñо мали букви, пр. {{ns:user}}:Ðекој/monobook.css намеÑто {{ns:user}}:Ðекој/Monobook.css.",
+'sitecsspreview' => "'''Запомнете дека ова е Ñамо преглед на овој CSS-код.'''
+'''Сè уште не е зачуван!'''",
+'sitejspreview' => "'''Запомнете дека ова е Ñамо преглед на овој JavaScript-код.'''
+'''Сè уште не е зачуван!'''",
+'userinvalidcssjstitle' => "'''Предупредување:''' Ðема руво „$1“.
+Запомнете дека ÑопÑтвените .css и .js Ñтраници имаат имиња Ñо мали букви, пр. {{ns:user}}:Ðекој/vector.css намеÑто {{ns:user}}:Ðекој/Vector.css.",
'updated' => '(Подновено)',
'note' => "'''Ðапомена:'''",
'previewnote' => "'''Имајте предвид дека ова е Ñамо преглед.'''
@@ -938,9 +988,6 @@ $2',
'copyrightwarning2' => "Ве молиме, имајте предвид дека Ñите придонеÑи кон {{SITENAME}} можат да бидат уредувани, менувани или отÑтранети од други кориÑници. Ðко не Ñакате вашиот текÑÑ‚ да биде менуван и редиÑтрибуиран Ñлободно, не го иÑпраќајте овде.<br />
ИÑто така потврдувате дека текÑтот Ñте го напишале Ñами, или Ñте го копирале од јавен домен или Ñличен Ñлободен извор (видетe $1 за детали).<br />
'''ÐЕ ПРÐÐŒÐЈТЕ ТЕКСТОВИ ЗÐШТИТЕÐИ СО ÐВТОРСКИ ПРÐВРБЕЗ ДОЗВОЛÐ!'''",
-'longpagewarning' => "'''ПРЕДУПРЕДУВÐЊЕ: Оваа Ñтраница има $1 килобајти;
-некои прелиÑтувачи може да имаат проблеми Ñо уредување на Ñтраниците поголеми од 32 кБ.
-РазмиÑлете за разделување на Ñтраницата на помали делови.'''",
'longpageerror' => "'''ГРЕШКÐ: ТекÑтот што го внеÑовте е голем $1 килобајти, што е повеќе од макÑималните $2 килобајти. Ðе може да Ñе зачува.'''",
'readonlywarning' => "'''ПРЕДУПРЕДУВÐЊЕ: Базата на податоци е заклучена заради одржување, па нема да можете да ги зачувате вашите промени Ñега.
Пробајте да го зачувате текÑтот локално (cut & paste) во некоја податотека и да го пратите подоцна.'''
@@ -1079,7 +1126,7 @@ $2',
'rev-showdeleted' => 'прикажи',
'revisiondelete' => 'Избриши/врати ревизии',
'revdelete-nooldid-title' => 'Бараната измена не поÑтои',
-'revdelete-nooldid-text' => 'Ðе Ñте поÑочиле измена (измени) за да Ñе изврши оваа функција или поÑочената измена не поÑтои или Ñе обидувате да ја Ñокриете моменталната измена.',
+'revdelete-nooldid-text' => 'Ðе Ñте поÑочиле измена (измени) за да Ñе изврши оваа функција или поÑочената измена не поÑтои или Ñе обидувате да ја Ñкриете моменталната измена.',
'revdelete-nologtype-title' => 'Ðе е наведен тип на дневник',
'revdelete-nologtype-text' => 'Ðемате наведено тип на дневник за кој треба да Ñе изврши ова дејÑтво.',
'revdelete-nologid-title' => 'Погрешно внеÑен Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¾ дневник.',
@@ -1118,6 +1165,8 @@ $1",
'logdelete-failure' => "'''Дневникот на видливоÑÑ‚ не може да биде нагоден:'''
$1",
'revdel-restore' => 'Промена на видливоÑÑ‚',
+'revdel-restore-deleted' => 'избришани ревизии',
+'revdel-restore-visible' => 'видливи ревизии',
'pagehist' => 'ИÑторија на Ñтраницата',
'deletedhist' => 'ИÑторија на бришења',
'revdelete-content' => 'Ñодржина',
@@ -1183,15 +1232,17 @@ $1",
# Diffs
'history-title' => 'ИÑторија на ревизии за „$1“',
'difference' => '(Разлика меѓу ревизија)',
+'difference-multipage' => '(Разлики помеѓу Ñтраници)',
'lineno' => 'Ред $1:',
'compareselectedversions' => 'Спореди избрани ревизии',
'showhideselectedversions' => 'Прикажи/Ñкриј избрани ревизии',
'editundo' => 'откажи',
-'diff-multi' => '({{PLURAL:$1|Ðе е прикажана една меѓуревзија|Ðе Ñе прикажани $1 меѓуревизии}})',
+'diff-multi' => '({{PLURAL:$1|Ðе е прикажана една меѓувремена ревизија|Ðе Ñе прикажани $1 меѓувремени ревизии}} од {{PLURAL:$2|еден кориÑник|$2 кориÑници}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ðе е прикажана една меѓувремена ревизија направена|Ðе Ñе прикажани $1 меѓувремени ревизии направени}} од повеќе од $2 {{PLURAL:$2|кориÑник|кориÑници}})',
# Search results
'searchresults' => 'Резултати од пребарувањето',
-'searchresults-title' => 'Резултати од пребарувањето за „$1“',
+'searchresults-title' => 'Резултати од пребарувањето на „$1“',
'searchresulttext' => 'За повеќе информации во врÑка Ñо пребарување на {{SITENAME}}, погледнете [[{{MediaWiki:Helppage}}|{{int:help}}]].',
'searchsubtitle' => "Пребарувате '''[[:$1]]''' на ([[Special:Prefixindex/$1|Ñите Ñтраници кои започнуваат Ñо „$1“]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|Ñите Ñтраници кои водат до „$1“]])",
'searchsubtitleinvalid' => "Пребарувавте '''$1'''",
@@ -1222,6 +1273,7 @@ $1",
'searchprofile-everything-tooltip' => 'Пребарување по Ñета Ñодржина (вклучувајќи Ñтраници за разговор)',
'searchprofile-advanced-tooltip' => 'Пребарување во именÑки проÑтори по избор',
'search-result-size' => '$1 ({{PLURAL:$2|1 збор|$2 збора}})',
+'search-result-category-size' => '{{PLURAL:$1|1 член|$1 члена}} ({{PLURAL:$2|1 поткатегорија|$2 поткатегории}}, {{PLURAL:$3|1 податотека|$3 податотеки}})',
'search-result-score' => 'РелевантноÑÑ‚: $1%',
'search-redirect' => '(пренаÑочување $1)',
'search-section' => '(паÑÑƒÑ $1)',
@@ -1271,7 +1323,7 @@ $1",
'prefsnologintext' => 'Мора да бидете <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} најавени]</span> за промена на вашите кориÑнички нагодувања.',
'changepassword' => 'Смени лозинка',
'prefs-skin' => 'Руво',
-'skin-preview' => 'Прегледај',
+'skin-preview' => 'Преглед',
'prefs-math' => 'Матем. формули',
'datedefault' => 'Ðебитно',
'prefs-datetime' => 'Датум и време',
@@ -1299,6 +1351,7 @@ $1",
'contextlines' => 'Редови по резултат:',
'contextchars' => 'КонтекÑÑ‚ по ред:',
'stub-threshold' => 'Праг за <a href="#" class="stub">никулци</a> (бајти):',
+'stub-threshold-disabled' => 'Оневозможено',
'recentchangesdays' => 'Денови за приказ во Ñкорешните промени:',
'recentchangesdays-max' => '(највеќе $1 {{PLURAL:$1|ден|дена}})',
'recentchangescount' => 'Број на уредувања кои ќе Ñе прикажат по оÑновно:',
@@ -1332,6 +1385,7 @@ $1",
'prefs-files' => 'Податотеки',
'prefs-custom-css' => 'ПоÑебно CSS',
'prefs-custom-js' => 'ПоÑебно JS',
+'prefs-common-css-js' => 'Заеднички CSS/JS за Ñите изгледи:',
'prefs-reset-intro' => 'Може да ја кориÑтите оваа Ñтраница за враќање на вашите нагодувања на оÑновно-зададените нагодувања на викито. Оваа не може да Ñе врати.',
'prefs-emailconfirm-label' => 'Потврда на е-пошта:',
'prefs-textboxsize' => 'Големина на прозорец за уредување',
@@ -1371,9 +1425,15 @@ $1",
'prefs-advancedrendering' => 'Ðапредни нагодувања',
'prefs-advancedsearchoptions' => 'Ðапредни нагодувања',
'prefs-advancedwatchlist' => 'Ðапредни нагодувања',
-'prefs-display' => 'Ðагодувања за приказ',
+'prefs-displayrc' => 'Ðагодувања за приказ',
+'prefs-displaysearchoptions' => 'Ðагодувања за приказ',
+'prefs-displaywatchlist' => 'Ðагодувања за приказ',
'prefs-diffs' => 'Разлики',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Се чини иÑправно',
+'email-address-validity-invalid' => 'Се бара иÑправна адреÑа!',
+
# User rights
'userrights' => 'Раководење Ñо кориÑнички права',
'userrights-lookup-user' => 'Раководење Ñо кориÑнички групи',
@@ -1458,6 +1518,7 @@ $1",
'right-hideuser' => 'Блокирање кориÑници, Ñокривање од јавноÑта',
'right-ipblock-exempt' => 'Заобиколување на IP блокирања, авто-блокирања и блокирања на IP рангови',
'right-proxyunbannable' => 'Заобиколување на автоматÑки блокирања на заÑтапници',
+'right-unblockself' => 'СопÑтвено одблокирање',
'right-protect' => 'Менување на Ñтепени на заштита и уредување на заштитени Ñтраници',
'right-editprotected' => 'Уредување на заштитени Ñтраници (без каÑкадна заштита)',
'right-editinterface' => 'Уредување на кориÑнички поÑредник',
@@ -1480,7 +1541,6 @@ $1",
'right-siteadmin' => 'Заклучување и отклучување на базата на податоци',
'right-reset-passwords' => 'Менување на лозинки на други кориÑници',
'right-override-export-depth' => 'Извезување на Ñтраници вклучувајќи поврзани Ñтраници Ñо длабочина до 5',
-'right-versiondetail' => 'Приказ на проширени информации за верзијата на програмÑката опрема',
'right-sendemail' => 'ИÑпраќање на е-пошта до други кориÑници',
# User rights log
@@ -1531,14 +1591,9 @@ $1",
'recentchanges-legend' => 'Ðагодувања за Ñкорешни промени',
'recentchangestext' => 'Ðа оваа Ñтраница ги Ñледите Ñкорешните промени на викито.',
'recentchanges-feed-description' => 'Следење на најÑкорешните промени на викито во овие емитувања.',
-'recentchanges-label-legend' => 'Легенда: $1',
-'recentchanges-legend-newpage' => '$1 - нова Ñтраница',
'recentchanges-label-newpage' => 'Ова уредување Ñоздаде нова Ñтраница',
-'recentchanges-legend-minor' => '$1 - Ñитно уредување',
'recentchanges-label-minor' => 'Ова е Ñитно уредување',
-'recentchanges-legend-bot' => '$1 - ботовÑко уредување',
'recentchanges-label-bot' => 'Ова уредување е направено од бот',
-'recentchanges-legend-unpatrolled' => '$1 - непатролирано уредување',
'recentchanges-label-unpatrolled' => 'Ова уредување Ñè уште не било патролирано',
'rcnote' => "Долу {{PLURAL:$1|е прикажана '''1''' промена|Ñе прикажани Ñкорешните '''$1''' промени}} {{PLURAL:$2|денеÑ|во поÑледниве '''$2''' дена}}, почнувајќи од $5, $4.",
'rcnotefrom' => 'Подолу Ñе промените од <b>$2</b> (Ñе прикажуваат до <b>$1</b>).',
@@ -1587,6 +1642,9 @@ $1",
'upload_directory_missing' => 'Папката за подигање на Ñлики ($1) не поÑтои и не може да биде Ñоздадена од опÑлужувачот.',
'upload_directory_read_only' => 'ОпÑлужувачот не може да запишува во именикот за подигање ($1).',
'uploaderror' => 'Грешка во подигањето',
+'upload-recreate-warning' => "'''Предупредување: Податотеката Ñо тоа име е избришана или премеÑтена.'''
+
+Подолу е наведена дневничката евиденција на бришење и премеÑтување за оваа Ñтраница:",
'uploadtext' => "КориÑтете го долниот образец за подигање на податотеки.
За преглед или пребарување на претходно подигнати податотеки, погледнете ја [[Special:FileList|ÑпиÑокот на подигнати податотеки]]; повторните подигања Ñе заведени во [[Special:Log/upload|дневникот на подигања]], а бришењата Ñе заведуваат во [[Special:Log/delete|дневникот на бришења]].
@@ -1622,6 +1680,17 @@ $1",
'filetype-banned-type' => "'''„.$1“''' не е допуштен тип на податотека.
{{PLURAL:$3|Допуштен тип на податотека е|Допуштени типови на податотеки Ñе}} $2.",
'filetype-missing' => 'Податотеката нема наÑтавка (на пр. „.jpg“).',
+'empty-file' => 'ПоднеÑената податотека е празна.',
+'file-too-large' => 'ПоднеÑената податотека е преголема.',
+'filename-tooshort' => 'Името на податотеката е прекратко.',
+'filetype-banned' => 'Овој тип на податотека е забранет.',
+'verification-error' => 'Оваа податотека не ја помина потврдата уÑпешно.',
+'hookaborted' => 'Измените што Ñакате да ги направите Ñе откажани од кука на додатокот.',
+'illegal-filename' => 'Такво име за податотеката на е дозволено.',
+'overwrite' => 'Ðе е дозволено запишување врз поÑтоечка податотека.',
+'unknown-error' => 'Се појави непозната грешка.',
+'tmp-create-error' => 'Ðе можев да Ñоздадам привремена податотека.',
+'tmp-write-error' => 'Грешка при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° привремената податотека.',
'large-file' => 'Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.',
'largefileserver' => 'Големината на податотеката е поголема од макÑимално дозволената големина.',
'emptyfile' => 'Податотеката што ја подигнавте изгледа дека е празна.
@@ -1649,13 +1718,14 @@ $1",
Ðко и понатаму Ñакате да ја подигнете податотеката, ве молиме вратете Ñе и повторно подигнете ја податотеката Ñо ново име. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Оваа податотека е дупликат Ñо {{PLURAL:$1|Ñледнава податотека|Ñледниве податотеки}}:',
'file-deleted-duplicate' => 'Податотека индентична Ñо податотеката ([[:$1]]) претходно била избришана. Треба да проверите во дневникот на бришења за оваа податотека пред повторно да ја подигнете.',
-'successfulupload' => 'Подигањето е уÑпешно',
'uploadwarning' => 'Предупредување при подигање',
'uploadwarning-text' => 'Изменете го опиÑот на податотеката подолу и обидете Ñе повторно.',
'savefile' => 'Зачувај податотека',
'uploadedimage' => 'подигнато „[[$1]]“',
'overwroteimage' => 'подигнато нова верзија на „[[$1]]“',
'uploaddisabled' => 'Забрана за подигања',
+'copyuploaddisabled' => 'Подигањето од URL е оневозможено.',
+'uploadfromurl-queued' => 'Вашето подигање е Ñтавено во редица.',
'uploaddisabledtext' => 'Подигањето на податотеки е оневозможено.',
'php-uploaddisabledtext' => 'Подигањето на податотеки е оневозможено во PHP.
Проверете го нагодувањето file_uploads.',
@@ -1691,6 +1761,14 @@ JD # Jenoptik
MGP # Pentax
PICT # разни
#</pre> <!-- Ðе менувајте ја Ñодржината на овој ред - оÑтавете ја како што е -->',
+'upload-success-subj' => 'Подигањето е уÑпешно',
+'upload-success-msg' => 'Подигањето од [$2] заврши уÑпешно. Подигнатото можете да го видите тука: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Проблем при подигањето',
+'upload-failure-msg' => 'Се појави проблем Ñо вашето подигање од [$2]:
+
+$1',
+'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>.',
@@ -1757,6 +1835,7 @@ PICT # разни
'listfiles_search_for' => 'Побарај име на податотека:',
'imgfile' => 'податотека',
'listfiles' => 'СпиÑок на податотеки',
+'listfiles_thumb' => 'Минијатура',
'listfiles_date' => 'Датум',
'listfiles_name' => 'Име',
'listfiles_user' => 'КориÑник',
@@ -1786,7 +1865,7 @@ PICT # разни
'linkstoimage-more' => 'Повеќе од {{PLURAL:$1|една Ñтраница е поврзана|$1 Ñтраници Ñе поврзани}} Ñо оваа податотека.
Следниов ÑпиÑок {{PLURAL:$1|ја прикажува Ñамо првата поврзана Ñтраница|ги прикажува Ñамо првите $1 поврзани Ñтраници}} до оваа податотека.
ЦелоÑен ÑпиÑок може да добиете [[Special:WhatLinksHere/$2|тука]].',
-'nolinkstoimage' => 'Ðема Ñтраници кои ја кориÑтат оваа податотека.',
+'nolinkstoimage' => 'Ðема Ñтраници што ја кориÑтат оваа податотека.',
'morelinkstoimage' => 'Погледајте ги [[Special:WhatLinksHere/$1|оÑтанатите врÑки]] кон оваа податотека.',
'redirectstofile' => '{{PLURAL:$1|Следната податотека пренаÑочува|$1 Следните податотеки пренаÑочуваат}} кон оваа податотека:',
'duplicatesoffile' => '{{PLURAL:$1|Следната податотека е дупликат|$1 Следните податотеки Ñе дупликати}} на оваа податотека ([[Special:FileDuplicateSearch/$2|повеќе информации]]):',
@@ -1797,10 +1876,11 @@ PICT # разни
ОпиÑот од нејзината [$2 Ñтраница за опиÑ] е прикажан подолу.',
'filepage-nofile' => 'Ðе поÑтои податотека Ñо ова име.',
'filepage-nofile-link' => 'Ðема податотека Ñо ова име, може да ја [$1 подигнете].',
-'uploadnewversion-linktext' => 'Подигни нова верзија на оваа податотека',
+'uploadnewversion-linktext' => 'Подигни нова верзија на податотекава',
'shared-repo-from' => 'од $1',
'shared-repo' => 'заедничко Ñкладиште',
'shared-repo-name-wikimediacommons' => 'Заедничката Ризница',
+'filepage.css' => '/* Тука поÑтавените каÑкадни ÑтилÑки Ñтраници (CSS) Ñе вклучени во Ñтраницата за Ð¾Ð¿Ð¸Ñ Ð½Ð° податотеката, како и на клиентÑките викија */',
# File reversion
'filerevert' => 'Врати $1',
@@ -1874,8 +1954,8 @@ PICT # разни
'statistics-edits' => 'Број на уредувања од започнувањето на {{SITENAME}}',
'statistics-edits-average' => 'ПроÑечен број на уредувања по Ñтраница',
'statistics-views-total' => 'Вкупно поÑети',
+'statistics-views-total-desc' => 'Ðе Ñе вклучени прегледувања на непоÑтоечки и Ñпецијални Ñтраници',
'statistics-views-peredit' => 'ПоÑети по уредување',
-'statistics-jobqueue' => 'Должина на [http://www.mediawiki.org/wiki/Manual:Job_queue редица на чекање]',
'statistics-users' => 'РегиÑтрирани [[Special:ListUsers|кориÑници]]',
'statistics-users-active' => 'Ðктивни кориÑници',
'statistics-users-active-desc' => 'КориÑници кои имаат извршено некое дејÑтво {{PLURAL:$1|претходниот ден|во претходните $1 дена}}',
@@ -1890,7 +1970,7 @@ PICT # разни
'doubleredirects' => 'Двојни пренаÑочувања',
'doubleredirectstext' => 'Оваа Ñтраница ги прикажува пренаÑочувачките Ñтраници до други пренаÑочувачки Ñтраници.
Секој ред Ñодржи врÑки кон првото и второто пренаÑочување, како и целта на второто пренаÑочување, кое обично ја поÑочува <i>виÑтинÑката</i> целна Ñтраница кон која првото пренаÑочување би требало да наÑочува.
-<s>Пречкртаните</s> Ñтавки треба да Ñе разрешат.',
+<del>Пречкртаните</del> Ñтавки треба да Ñе разрешат.',
'double-redirect-fixed-move' => 'Страницата [[$1]] е премеÑтена.
Сега пренаÑочува кон [[$2]]',
'double-redirect-fixer' => 'ИÑправувач на пренаÑочувања',
@@ -1914,6 +1994,8 @@ PICT # разни
'nmembers' => '$1 {{PLURAL:$1|член|члена}}',
'nrevisions' => '$1 {{PLURAL:$1|измена|измени}}',
'nviews' => '$1 {{PLURAL:$1|преглед|прегледи}}',
+'nimagelinks' => 'Се кориÑти на $1 {{PLURAL:$1|Ñтраница|Ñтраници}}',
+'ntransclusions' => 'Ñе кориÑти на $1 {{PLURAL:$1|Ñтраница|Ñтраници}}',
'specialpage-empty' => 'Ðема резултати од пребарувањето за овој извештај.',
'lonelypages' => 'ОÑамени Ñтраници',
'lonelypagestext' => 'Следните Ñтраници не Ñе поврзани од или транÑклудирани во други Ñтраници на {{SITENAME}}.',
@@ -2072,34 +2154,40 @@ PICT # разни
'listgrouprights-removegroup-self-all' => 'Може да ги избрише Ñите групи од ÑопÑтвената кориÑничка Ñметка',
# E-mail user
-'mailnologin' => 'Ðема адреÑа за праќање',
-'mailnologintext' => 'Мора да бидете [[Special:UserLogin|најавени]] и да имате важечка е-поштенÑка адреÑа во вашите [[Special:Preferences|нагодувања]] за да може да праќате е-пошта до други кориÑници.',
-'emailuser' => 'ИÑпрати е-пошта до овој кориÑник',
-'emailpage' => 'Е-пошта',
-'emailpagetext' => 'Можете да го кориÑтите Ñледниов образец за праќање на е-поштенÑка порака до овој кориÑник.
+'mailnologin' => 'Ðема адреÑа за праќање',
+'mailnologintext' => 'Мора да бидете [[Special:UserLogin|најавени]] и да имате важечка е-поштенÑка адреÑа во вашите [[Special:Preferences|нагодувања]] за да може да праќате е-пошта до други кориÑници.',
+'emailuser' => 'ИÑпрати е-пошта до овој кориÑник',
+'emailpage' => 'Е-пошта',
+'emailpagetext' => 'Можете да го кориÑтите Ñледниов образец за праќање на е-поштенÑка порака до овој кориÑник.
Е-поштенÑката адреÑа која ја имате наведено во [[Special:Preferences|вашите нагодувања]] ќе Ñе прикаже во „Од“ полето на е-пораката, Ñо што примачот ќе може да ви одговори директно вам.',
-'usermailererror' => 'ÐаÑтана Ñледната грешка при праќање е-пошта:',
-'defemailsubject' => '{{SITENAME}} е-пошта',
-'noemailtitle' => 'Ðема е-поштенÑка адреÑа',
-'noemailtext' => 'Овој кориÑник нема наведено важечка е-поштенÑка адреÑа.',
-'nowikiemailtitle' => 'Ðе е допуштено кориÑтење на е-пошта',
-'nowikiemailtext' => 'Овој кориÑник избрал да не прима е-пошта од други кориÑници.',
-'email-legend' => 'Праќање на е-пошта до друг {{SITENAME}} кориÑник',
-'emailfrom' => 'Од:',
-'emailto' => 'До:',
-'emailsubject' => 'ÐаÑлов:',
-'emailmessage' => 'Порака:',
-'emailsend' => 'Прати',
-'emailccme' => 'ИÑпрати ми копија на пораката по е-пошта.',
-'emailccsubject' => 'Копија од вашата порака до $1: $2',
-'emailsent' => 'Е-поштата е пратена',
-'emailsenttext' => 'Вашата е-пошта е пратена.',
-'emailuserfooter' => 'Оваа е-порака беше пратена од $1 до $2 Ñо помош на функцијата Е-пошта на {{SITENAME}}.',
+'usermailererror' => 'ÐаÑтана Ñледната грешка при праќање е-пошта:',
+'defemailsubject' => '{{SITENAME}} е-пошта',
+'usermaildisabled' => 'КориÑничката е-пошта е оневозможена',
+'usermaildisabledtext' => 'Ðе можете да иÑпратите е-порака до дрги кориÑници на ова вики',
+'noemailtitle' => 'Ðема е-поштенÑка адреÑа',
+'noemailtext' => 'Овој кориÑник нема наведено важечка е-поштенÑка адреÑа.',
+'nowikiemailtitle' => 'Ðе е допуштено кориÑтење на е-пошта',
+'nowikiemailtext' => 'Овој кориÑник избрал да не прима е-пошта од други кориÑници.',
+'email-legend' => 'Праќање на е-пошта до друг {{SITENAME}} кориÑник',
+'emailfrom' => 'Од:',
+'emailto' => 'До:',
+'emailsubject' => 'ÐаÑлов:',
+'emailmessage' => 'Порака:',
+'emailsend' => 'Прати',
+'emailccme' => 'ИÑпрати ми копија на пораката по е-пошта.',
+'emailccsubject' => 'Копија од вашата порака до $1: $2',
+'emailsent' => 'Е-поштата е пратена',
+'emailsenttext' => 'Вашата е-пошта е пратена.',
+'emailuserfooter' => 'Оваа е-порака беше пратена од $1 до $2 Ñо помош на функцијата Е-пошта на {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'ОÑтавете ÑиÑтемÑка порака.',
+'usermessage-editor' => 'СиÑтемÑки глаÑник',
# Watchlist
'watchlist' => 'мои набљудувања',
'mywatchlist' => 'мои набљудувања',
-'watchlistfor' => "(за '''$1''')",
+'watchlistfor2' => 'За $1 $2',
'nowatchlist' => 'Ðемате ништо во ÑпиÑокот на набљудувања.',
'watchlistanontext' => 'Се бара $1 за да можете да го прегледувате и уредувате ÑпиÑокот на набљудувања.',
'watchnologin' => 'Ðе Ñте најавени',
@@ -2148,7 +2236,7 @@ PICT # разни
$NEWPAGE
-ÐžÐ¿Ð¸Ñ Ð½Ð° уредувачот: $PAGESUMMARY $PAGEMINOREDIT
+ÐžÐ¿Ð¸Ñ Ð¾Ð´ уредувачот: $PAGESUMMARY $PAGEMINOREDIT
Конакт на уредувачот:
е-пошта: $PAGEEDITOR_EMAIL
@@ -2160,7 +2248,10 @@ $NEWPAGE
СиÑтемот за извеÑтување на {{SITENAME}}
--
-За да ги промените нагодувањата на ÑпиÑокот на набљудувања, поÑетете ја Ñтраницата
+Ðко Ñакате да ги измените нагодувањата за извеÑтување по е-пошта, поÑетете ја Ñтраницата
+{{fullurl:{{#special:Preferences}}}}
+
+Доколку Ñакате да ги измените нагодувањата на ÑпиÑокот на набљудувања, поÑетете ја Ñтраницата
{{fullurl:{{#special:Watchlist}}/edit}}
За да ја избришете Ñтраницата од ÑпиÑокот на набљудувања, поÑетете ја Ñтраницата
@@ -2220,7 +2311,10 @@ $UNWATCHURL
'revertpage' => 'ОтÑтрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на поÑледната верзија на [[User:$1|$1]]',
'revertpage-nouser' => 'Вратени уредувања на (избришано кориÑничко име) на поÑледната ревизија од [[User:$1|$1]]',
'rollback-success' => 'Откажани уредувањата на $1; вратено на поÑледната верзија на $2.',
-'sessionfailure' => 'Има проблем Ñо вашата ÑеÑија;
+
+# Edit tokens
+'sessionfailure-title' => 'СеÑијата не уÑпеа',
+'sessionfailure' => 'Има проблем Ñо вашата ÑеÑија;
оваа дејÑтво е откажано како превентива против преземање ÑеÑии.
ПритиÑнете го копчето „назад“ и повторно вчитајте ја Ñтраницата од која дојдовте и обидете Ñе повторно.',
@@ -2358,18 +2452,22 @@ $1',
'month' => 'Од меÑец (и порано):',
'year' => 'Од година (и порано):',
-'sp-contributions-newbies' => 'Прикажи придонеÑи Ñамо на нови кориÑници',
-'sp-contributions-newbies-sub' => 'За нови кориÑнички Ñметки',
-'sp-contributions-newbies-title' => 'ПридонеÑи на нови кориÑници',
-'sp-contributions-blocklog' => 'Дневник на блокирања',
-'sp-contributions-deleted' => 'избришани кориÑнички придонеÑи',
-'sp-contributions-logs' => 'дневници',
-'sp-contributions-talk' => 'разговор',
-'sp-contributions-userrights' => 'раководење Ñо кориÑнички права',
-'sp-contributions-blocked-notice' => 'Овој кориÑник е блокиран. ПоÑледните Ñтавки во дневникот на блокирања, за ваша информација Ñе дадени подолу:',
-'sp-contributions-search' => 'Пребарување на придонеÑи',
-'sp-contributions-username' => 'IP-адреÑа или кориÑничко име:',
-'sp-contributions-submit' => 'Пребарај',
+'sp-contributions-newbies' => 'Прикажи придонеÑи Ñамо на нови кориÑници',
+'sp-contributions-newbies-sub' => 'За нови кориÑнички Ñметки',
+'sp-contributions-newbies-title' => 'ПридонеÑи на нови кориÑници',
+'sp-contributions-blocklog' => 'Дневник на блокирања',
+'sp-contributions-deleted' => 'избришани кориÑнички придонеÑи',
+'sp-contributions-uploads' => 'подигања',
+'sp-contributions-logs' => 'дневници',
+'sp-contributions-talk' => 'разговор',
+'sp-contributions-userrights' => 'раководење Ñо кориÑнички права',
+'sp-contributions-blocked-notice' => 'Овој кориÑник е блокиран. ПоÑледните Ñтавки во дневникот на блокирања, за ваша информација Ñе дадени подолу:',
+'sp-contributions-blocked-notice-anon' => 'Оваа IP-адреÑа е моментално блокирана.
+Подолу е наведен најновиот дневнички Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° блокирање:',
+'sp-contributions-search' => 'Пребарување на придонеÑи',
+'sp-contributions-username' => 'IP-адреÑа или кориÑничко име:',
+'sp-contributions-toponly' => 'Прикажувај Ñамо поÑледни ревизии',
+'sp-contributions-submit' => 'Пребарај',
# What links here
'whatlinkshere' => 'Што води овде',
@@ -2431,7 +2529,6 @@ $1',
'ipb-edit-dropdown' => 'Ðаведи причина за блокирање',
'ipb-unblock-addr' => 'Одблокирај го $1',
'ipb-unblock' => 'Одблокирај кориÑник или IP-адреÑа',
-'ipb-blocklist-addr' => 'Ðктивни блокирања за $1',
'ipb-blocklist' => 'Преглед на активни блокирања',
'ipb-blocklist-contribs' => 'ПридонеÑи на $1',
'unblockip' => 'Деблокирај кориÑник',
@@ -2469,8 +2566,8 @@ $1',
Дневникот на блокирања, за ваша информација е прикажан подолу:',
'blocklog-showsuppresslog' => 'Овој кориÑник бил претходно блокиран и Ñокриен.
Дневникот на ограничувања, за ваша информација е прикажан подолу:',
-'blocklogentry' => 'блокирано [[$1]] Ñо рок на иÑтекување до $2, $3',
-'reblock-logentry' => 'променети нагодувања за блокирање на [[$1]] Ñо рок на иÑтекување од $2 $3',
+'blocklogentry' => 'го блокираше [[$1]] Ñо рок на иÑтекување до $2, $3',
+'reblock-logentry' => 'ги промени нагодувањата за блокирање на [[$1]] Ñо рок на иÑтекување од $2 $3',
'blocklogtext' => 'Ова е дневник на блокирање и одблокирање на кориÑнци.
ÐвтоматÑки блокираните IP-адреÑи не Ñе наведени.
Видете го [[Special:IPBlockList|ÑпиÑокот на блокирани IP-адреÑи]].',
@@ -2508,6 +2605,8 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
Ðе можете да Ñоздадете кориÑничка Ñметка.',
'cant-block-while-blocked' => 'Ðе можете да блокирате други кориÑници додека и вие Ñамите Ñте блокирани.',
'cant-see-hidden-user' => 'КориÑникот кој Ñе обидувате да го блокирате е веќе блокиран и Ñокриен. Бидејќи вие немате права за Ñокривање на кориÑник, не можете да ги видите или уредувате кориÑничките блокирања.',
+'ipbblocked' => 'Ðе можете да блокирате или одблокирате други кориÑници бидејќи и Ñамите Ñте блокирани',
+'ipbnounblockself' => 'Ðе е дозволено да Ñе одблокирате Ñамите ÑебеÑи',
# Developer tools
'lockdb' => 'Заклучи база на податоци',
@@ -2545,6 +2644,17 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
'''ПРЕДУПРЕДУВÐЊЕ!'''
Ова може да биде драÑтична и неочекувана промена за популарна Ñтраница;
оÑигурајте Ñе дека Ñте ги разбрале поÑледиците од ова пред да продолжите.",
+'movepagetext-noredirectfixer' => "Со кориÑтењето на овој образец можете да преименувате Ñтраница, премеÑтувајќи ја целата нејзина иÑторија под ново име.
+Стариот наÑлов ќе Ñтане Ñтраница за пренаÑочување кон новиот наÑлов.
+ÐвтоматÑки можете да ги подновите пренаÑочувањата кои покажуваат кон првобитниот наÑлов.
+Ðе заборавајте да проверите [[Special:DoubleRedirects|двојни]] и [[Special:BrokenRedirects|прекинати пренаÑочувања]].
+Ðа Ð²Ð°Ñ Ðµ одговорноÑта да Ñе оÑигурате дека врÑките ќе продолжат да наÑочуваат таму за каде Ñе предвидени.
+
+Имајте предвид дека Ñтраницата '''ÐЕМÐ''' да биде премеÑтена ако веќе поÑтои Ñтраница Ñо новиот наÑлов, оÑвен ако е празна или ако е пренаÑочување и нема иÑторија на минати уредувања. Тоа значи дека можете да ја преименувате Ñтраницата како што била претходно доколку Ñте направиле грешка без да ја прекриете поÑтоечката Ñтраница.
+
+'''ПРЕДУПРЕДУВÐЊЕ!'''
+Ова може да биде драÑтична и неочекувана промена за популарна Ñтраница;
+оÑигурајте Ñе дека Ñте ги разбрале поÑледиците од ова пред да продолжите.",
'movepagetalktext' => 'Соодветната Ñтраница за разговор, доколку поÑтои, ќе биде автоматÑки премеÑтена заедно Ñо неа, оÑвен ако:
*Веќе поÑтои Ñтраница за разговор за новиот наÑлов, или
*Долното поле е неозначено.
@@ -2602,6 +2712,7 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
'immobile-source-page' => 'Оваа Ñтраница не може да Ñе премеÑтува.',
'immobile-target-page' => 'Ðе може да Ñе премеÑти под бараниот наÑлов.',
'imagenocrossnamespace' => 'Ðе може да Ñе премеÑти податотека во неподатотечен именÑки проÑтор',
+'nonfile-cannot-move-to-file' => 'Ðе можам да премеÑтам неподатотека во податотечен именÑки проÑтор',
'imagetypemismatch' => 'Ðовата наÑтавка на податотеката не ÑоодветÑтвува на нејзиниот тип',
'imageinvalidfilename' => 'Целниот наÑлов на податотеката е невалиден',
'fix-double-redirects' => 'Подновете ги Ñите пренаÑочувања што водат кон првобитниот наÑлов',
@@ -2669,7 +2780,7 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
'importinterwiki' => 'Меѓувики увоз',
'import-interwiki-text' => 'Избери вики и наÑлов на Ñтраница за увоз.
Датумите и имињата на уредниците ќе бидат зачувани.
-Сите поÑтапки при меѓувики увозот Ñе заведуваат во [[Special:Log/import|дневникот на увезувања]].',
+Сите поÑтапки при увозот од другото вики Ñе заведуваат во [[Special:Log/import|дневникот на увезувања]].',
'import-interwiki-source' => 'Извор вики/Ñтраница:',
'import-interwiki-history' => 'Копирај ги Ñите поÑтари верзии за оваа Ñтраница',
'import-interwiki-templates' => 'Вклучи ги Ñите шаблони',
@@ -2682,6 +2793,7 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
'importstart' => 'Увоз на Ñтраници...',
'import-revision-count' => '$1 {{PLURAL:$1|ревизија|ревизии}}',
'importnopages' => 'Ðема Ñтраници за увоз.',
+'imported-log-entries' => '{{PLURAL:$1|Увезен е $1 дневнички запиÑ|Увезени Ñе $1 дневнички запиÑи}}.',
'importfailed' => 'ÐеуÑпешно внеÑување: $1',
'importunknownsource' => 'Ðепознат тип за внеÑување',
'importcantopen' => 'Ðе може да Ñе отвори увезената податотека',
@@ -2703,7 +2815,7 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
'xml-error-string' => '$1 во ред $2, колона $3 (бајт $4): $5',
'import-upload' => 'Подигни XML податоци',
'import-token-mismatch' => 'Губење на ÑеÑиÑките податоци. Обидете Ñе повторно.',
-'import-invalid-interwiki' => 'Ðе може да Ñе увезува од Ñпецифицираното вики.',
+'import-invalid-interwiki' => 'Ðе можам да увезам од наведеното вики.',
# Import log
'importlogpage' => 'Дневник на увезувања',
@@ -2778,6 +2890,8 @@ $1 е веќе блокиран. Дали Ñакате да направите Ð
'tooltip-rollback' => '„Врати“ ги поништува поÑледните уредувања на оваа Ñтраница Ñо еден клик до уредувањата на претпоÑледниот придонеÑувач',
'tooltip-undo' => '„Откажи“ го поништува ова уредување и отвора прозорец за уредување.
Дозволува додавање на причина во опиÑот',
+'tooltip-preferences-save' => 'Зачувај',
+'tooltip-summary' => 'ВнеÑете кратко резиме',
# Stylesheets
'common.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз Ñите рува */',
@@ -2911,14 +3025,17 @@ $1',
'thumbsize' => 'Големина на минијатурата:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñтраница|Ñтраници}}',
-'file-info' => '(големина: $1, MIME-тип: $2)',
-'file-info-size' => '($1 × $2 пикÑели, големина: $3, MIME-тип: $4)',
+'file-info' => 'големина: $1, MIME-тип: $2',
+'file-info-size' => '$1 × $2 пикÑели, големина: $3, MIME-тип: $4',
'file-nohires' => '<small>Ðе е доÑтапна поголема резолуција.</small>',
-'svg-long-desc' => '(SVG податотека, номинално $1 × $2 пикÑели, големина: $3)',
+'svg-long-desc' => 'SVG податотека, номинално $1 × $2 пикÑели, големина: $3',
'show-big-image' => 'ВиÑтинÑка големина',
'show-big-image-thumb' => '<small>Големина на овој приказ: $1 × $2 пикÑели</small>',
'file-info-gif-looped' => 'кружно',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадри}}',
+'file-info-png-looped' => 'кружно',
+'file-info-png-repeat' => 'пуштено {{PLURAL:$1|еднаш|$1 пати}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадар|кадри}}',
# Special:NewFiles
'newimages' => 'Галерија на нови податотеки',
@@ -3044,7 +3161,7 @@ Variants for Chinese language
'exif-pixelydimension' => 'Ширина на Ñликата',
'exif-pixelxdimension' => 'ВиÑина на Ñликата',
'exif-makernote' => 'Забелешки на произведувачот',
-'exif-usercomment' => 'Коментар на кориÑникот',
+'exif-usercomment' => 'КориÑнички коментари',
'exif-relatedsoundfile' => 'Поврзана аудиоÑнимка',
'exif-datetimeoriginal' => 'Датум и време на Ñликање',
'exif-datetimedigitized' => 'Датум и време на дигитализација',
@@ -3052,7 +3169,7 @@ Variants for Chinese language
'exif-subsectimeoriginal' => 'Дел од Ñекундата во кој е фотографирано',
'exif-subsectimedigitized' => 'Дел од Ñекундата во кој е дигитализирано',
'exif-exposuretime' => 'ЕкÑпозиција',
-'exif-exposuretime-format' => '$1 Ñек. ($2)',
+'exif-exposuretime-format' => '$1 Ñек ($2)',
'exif-fnumber' => 'F-бр.',
'exif-fnumber-format' => 'f/$1',
'exif-exposureprogram' => 'Режим на екÑпозиција',
@@ -3126,6 +3243,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'Ðазив на GPS-подрачје',
'exif-gpsdatestamp' => 'GPS-датум',
'exif-gpsdifferential' => 'Диференцијална иÑправка на GPS',
+'exif-objectname' => 'Краток наÑлов',
# EXIF attributes
'exif-compression-1' => 'Ðенабиена',
@@ -3301,30 +3419,30 @@ Variants for Chinese language
'limitall' => 'Ñите',
# E-mail address confirmation
-'confirmemail' => 'Потврда на е-поштенÑка адреÑа',
-'confirmemail_noemail' => 'Ðемате наведено важечка е-поштенÑка адреÑа во вашите [[Special:Preferences|нагодувања]].',
-'confirmemail_text' => '{{SITENAME}} бара да ја потврдите вашата е-поштенÑка адреÑа пред да ги кориÑтите можноÑтите за е-пошта.
+'confirmemail' => 'Потврда на е-поштенÑка адреÑа',
+'confirmemail_noemail' => 'Ðемате наведено важечка е-поштенÑка адреÑа во вашите [[Special:Preferences|нагодувања]].',
+'confirmemail_text' => '{{SITENAME}} бара да ја потврдите вашата е-поштенÑка адреÑа пред да ги кориÑтите можноÑтите за е-пошта.
ПритиÑнете на копчето подолу за да пратите потврдувачка е-порака на вашата адреÑа.
Е-пораката ќе вклучи врÑка којашто Ñодржи код;
отворете ја врÑката во вашиот прелиÑтувач за да потврдите дека вашата е-поштенÑка адреÑа е важечка.',
-'confirmemail_pending' => 'ПиÑмото Ñо потврден код е веќе иÑпратено. Ðко Ñметката ја Ñоздадовте Ñега, тогаш веројатно ќе треба да почекате некоја минута за да приÑтигне, пред да побарате нов код.',
-'confirmemail_send' => 'ИÑпрати потврден код',
-'confirmemail_sent' => 'Потврдната порака е иÑпратена.',
-'confirmemail_oncreate' => 'ИÑпратен е потврден код на вашата е-поштенÑка адреÑа.
+'confirmemail_pending' => 'ПиÑмото Ñо потврден код е веќе иÑпратено. Ðко Ñметката ја Ñоздадовте Ñега, тогаш веројатно ќе треба да почекате некоја минута за да приÑтигне, пред да побарате нов код.',
+'confirmemail_send' => 'ИÑпрати потврден код',
+'confirmemail_sent' => 'Потврдната порака е иÑпратена.',
+'confirmemail_oncreate' => 'ИÑпратен е потврден код на вашата е-поштенÑка адреÑа.
Овој код не е потребен за најавување, но ќе треба да го внеÑете пред да ги вклучите е-поштенÑките можноÑти во викито.',
-'confirmemail_sendfailed' => '{{SITENAME}} не може да ви прати потврдна е-порака.
+'confirmemail_sendfailed' => '{{SITENAME}} не може да ви прати потврдна е-порака.
Проверете дали е-поштенÑката адреÑа е правилно запишана.
Вратена е Ñледнава грешка: $1',
-'confirmemail_invalid' => 'Ðеточен потврден код.
+'confirmemail_invalid' => 'Ðеточен потврден код.
Кодот можеби е иÑтечен.',
-'confirmemail_needlogin' => 'Морате да $1 за да ја потврдите вашата е-поштенÑка адреÑа.',
-'confirmemail_success' => 'Вашата е-поштенÑка адреÑа е потврдена.
+'confirmemail_needlogin' => 'Морате да $1 за да ја потврдите вашата е-поштенÑка адреÑа.',
+'confirmemail_success' => 'Вашата е-поштенÑка адреÑа е потврдена.
Сега можете да Ñе [[Special:UserLogin|најавите]]. Ви поÑакуваме пријатни мигови на викито!',
-'confirmemail_loggedin' => 'Вашата е-поштенÑка адреÑа Ñега е потврдена.',
-'confirmemail_error' => 'Ðешто тргна наопаку при Ñнимањето на вашата потврда.',
-'confirmemail_subject' => '{{SITENAME}} — Потврда на е-поштенÑка адреÑа',
-'confirmemail_body' => 'Ðекој, веројатно Вие, од IP-адреÑата $1,
+'confirmemail_loggedin' => 'Вашата е-поштенÑка адреÑа Ñега е потврдена.',
+'confirmemail_error' => 'Ðешто тргна наопаку при Ñнимањето на вашата потврда.',
+'confirmemail_subject' => '{{SITENAME}} — Потврда на е-поштенÑка адреÑа',
+'confirmemail_body' => 'Ðекој, веројатно Вие, од IP-адреÑата $1,
на {{SITENAME}} ја региÑтрирал Ñметката „$2“ Ñо оваа е-поштенÑка адреÑа .
За да потврдите дека оваа Ñметка навиÑтина Ви припаѓа Вам и да ја активирате
@@ -3338,12 +3456,40 @@ $3
$5
Овој потврден код ќе иÑтече на $4.',
-'confirmemail_invalidated' => 'Потврдата на е-поштенÑката адреÑа е откажана',
-'invalidateemail' => 'Откажување на потврда на е-пошта',
+'confirmemail_body_changed' => 'Ðекој, веројатно Вие, од IP-адреÑа $1,
+на {{SITENAME}} ја има променето е-поштенÑката адреÑа на Ñметката „$2“, наведувајќи ја оваа адреÑа како нова.
+
+За да потврдите дека оваа Ñметка навиÑтина Ви припаѓа Вам и повторно да ги вклучите
+е-поштенÑките функции на {{SITENAME}}, отворете ја Ñледнава врÑка во Вашиот прелиÑтувач:
+
+$3
+
+Ðко оваа Ñметка *не* Ви припаѓа Вам, проÑледете ја оваа врÑка
+за да ја откажете потврдата на адреÑата:
+
+$5
+
+Овој потврден код иÑтекува на $4.',
+'confirmemail_body_set' => 'Ðекој, веројатно Вие, од IP-адреÑата $1,
+на {{SITENAME}} ја внел оваа е-поштенÑка адреÑа на Ñметката „$2“.
+
+За да потврдите дека оваа адреÑа навиÑтина Ви припаѓа Вам и за да ги вклучите
+можноÑтите за е-пошта на {{SITENAME}}, отворете ја Ñледнава врÑка во прелиÑтувачот:
+
+$3
+
+Ðко Ñметката *не* е Ваша, проÑледете ја Ñледнава врÑка
+за да ја откажете потврдата:
+
+$5
+
+Овој потврден код иÑтекува во $4.',
+'confirmemail_invalidated' => 'Потврдата на е-поштенÑката адреÑа е откажана',
+'invalidateemail' => 'Откажување на потврда на е-пошта',
# Scary transclusion
-'scarytranscludedisabled' => '[Интервики транÑклудирање е оневозможено]',
-'scarytranscludefailed' => '[ÐеуÑпешно превземање на шаблонот за $1]',
+'scarytranscludedisabled' => '[Превметнувањето помеѓу викијата е оневозможено]',
+'scarytranscludefailed' => '[Преземањето на шаблонот за $1 не уÑпеа]',
'scarytranscludetoolong' => '[Премногу долго URL]',
# Trackbacks
@@ -3384,6 +3530,7 @@ $1',
'table_pager_first' => 'Прва Ñтраница',
'table_pager_last' => 'ПоÑледна Ñтраница',
'table_pager_limit' => 'Прикажи $1 запиÑи по Ñтраница',
+'table_pager_limit_label' => 'Ставки по Ñтраница:',
'table_pager_limit_submit' => 'Оди',
'table_pager_empty' => 'Ðема резултати',
@@ -3400,7 +3547,7 @@ $1',
'size-gigabytes' => '$1 ГБ',
# Live preview
-'livepreview-loading' => 'Се вчитува…',
+'livepreview-loading' => 'Вчитувам...',
'livepreview-ready' => 'Се вчитува… готово!',
'livepreview-failed' => 'ÐеуÑпешно прегледување!
Пробајте Ñо нормален преглед.',
@@ -3505,6 +3652,7 @@ $1',
'version-specialpages' => 'Специјални Ñтраници',
'version-parserhooks' => 'ПарÑерÑки куки',
'version-variables' => 'Променливи',
+'version-skins' => 'Рува',
'version-other' => 'Друго',
'version-mediahandlers' => 'Ракувачи Ñо мултимедијални Ñодржини',
'version-hooks' => 'Куки',
@@ -3517,6 +3665,13 @@ $1',
'version-version' => '(Верзија $1)',
'version-svn-revision' => '(рев. $2)',
'version-license' => 'Лиценца',
+'version-poweredby-credits' => "Ова вики работи на '''[http://www.mediawiki.org/ МедијаВики]''', авторÑки права © 2001-$1 $2.",
+'version-poweredby-others' => 'други',
+'version-license-info' => 'МедијаВики е Ñлободна програмÑка опрема; можете да ја редиÑтрибуирате и/или менувате под уÑловите на ГÐУ-овата општа јавна лиценца на Фондацијата за Ñлободна програмÑка опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).
+
+МедијаВики Ñе нуди Ñо надеж дека ќе биде од кориÑÑ‚, но БЕЗ БИЛО КÐКВРГÐРÐÐЦИЈÐ; дури и без подразбраната гаранција за ПРОДÐЖÐРВРЕДÐОСТ или ПОГОДÐОСТ ЗРДÐДЕÐРЦЕЛ. За повеќе информации, погледајте ја ГÐУ-овата општа јавна лиценца.
+
+Заедно Ñо програмов треба да имате добиено [{{SERVER}}{{SCRIPTPATH}}/COPYING примерок од ГÐУ-овата општа јавна лиценца]; ако немате добиено примерок, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте ја тука].',
'version-software' => 'ИнÑталирана програмÑка опрема',
'version-software-product' => 'Производ',
'version-software-version' => 'Верзија',
@@ -3547,7 +3702,7 @@ $1',
'specialpages-note' => '----
* Ðормални Ñпецијални Ñтраници.
* <strong class="mw-specialpagerestricted">Специјални Ñтраници Ñо ограничен приÑтап.</strong>',
-'specialpages-group-maintenance' => 'Извештаи за одржување на википедија',
+'specialpages-group-maintenance' => 'Извештаи за одржување',
'specialpages-group-other' => 'Други Ñпецијални Ñтраници',
'specialpages-group-login' => 'Ðајава / региÑтрација',
'specialpages-group-changes' => 'Скорешни промени и дневници',
@@ -3586,6 +3741,15 @@ $1',
'tags-edit' => 'уреди',
'tags-hitcount' => '$1 {{PLURAL:$1|промена|промени}}',
+# Special:ComparePages
+'comparepages' => 'Спореди Ñтраници',
+'compare-selector' => 'Споредба на ревизии на Ñтраници',
+'compare-page1' => 'Страница 1',
+'compare-page2' => 'Страница 2',
+'compare-rev1' => 'Ревизија 1',
+'compare-rev2' => 'Ревизија 2',
+'compare-submit' => 'Спореди',
+
# Database error messages
'dberr-header' => 'Ова вики не функционира како што треба',
'dberr-problems' => 'Жалиме! Ова мрежно меÑто Ñе Ñоочува Ñо технички потешкотии.',
@@ -3602,8 +3766,13 @@ $1',
'htmlform-float-invalid' => 'ВредноÑта која ја наведовте не е број.',
'htmlform-int-toolow' => 'ВредноÑта која ја наведовте е под минимумот од $1',
'htmlform-int-toohigh' => 'ВредноÑта која ја наведовте е над макÑимумот од $1',
+'htmlform-required' => 'Се бара оваа вредноÑÑ‚',
'htmlform-submit' => 'Зачувај',
'htmlform-reset' => 'Откажи промени',
'htmlform-selectorother-other' => 'Друго',
+# SQLite database support
+'sqlite-has-fts' => '$1 Ñо поддршка за пребарување по цели текÑтови',
+'sqlite-no-fts' => '$1 без поддршка за пребарување по цели текÑтови',
+
);
diff --git a/languages/messages/MessagesMl.php b/languages/messages/MessagesMl.php
index 6b03b6ba..35da8ff8 100644
--- a/languages/messages/MessagesMl.php
+++ b/languages/messages/MessagesMl.php
@@ -44,11 +44,12 @@ $namespaceNames = array(
NS_TEMPLATE_TALK => 'ഫലകതàµà´¤à´¿à´¨àµà´±àµ†_സംവാദം',
NS_HELP => 'സഹായം',
NS_HELP_TALK => 'സഹായതàµà´¤à´¿à´¨àµà´±àµ†_സംവാദം',
- NS_CATEGORY => 'വർഗàµà´—à´‚',
- NS_CATEGORY_TALK => 'വർഗàµà´—à´¤àµà´¤à´¿à´¨àµà´±àµ†_സംവാദം',
+ NS_CATEGORY => 'വരàµâ€à´—àµà´—à´‚',
+ NS_CATEGORY_TALK => 'വരàµâ€à´—àµà´—à´¤àµà´¤à´¿à´¨àµà´±àµ†_സംവാദം',
);
$namespaceAliases = array(
+ 'സം' => NS_TALK,
'à´…à´‚à´—à´‚' => NS_USER,
'à´‰' => NS_USER,
'à´…à´‚à´—à´™àµà´™à´³àµà´Ÿàµ† സംവാദം' => NS_USER_TALK,
@@ -57,10 +58,17 @@ $namespaceAliases = array(
'ചിസം' => NS_FILE_TALK,
'à´šà´¿à´¤àµà´°à´‚' => NS_FILE,
'à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ†_സംവാദം' => NS_FILE_TALK,
+ 'à´ªàµà´°' => NS_FILE,
+ 'à´ªàµà´°à´¸à´‚' => NS_FILE_TALK,
'à´«' => NS_TEMPLATE,
'ഫസം' => NS_TEMPLATE_TALK,
'വി' => NS_CATEGORY,
+ 'à´µ' => NS_CATEGORY,
'വിസം' => NS_CATEGORY_TALK,
+ 'വസം' => NS_CATEGORY_TALK,
+ 'മീ' => NS_MEDIAWIKI,
+ 'മീസം' => NS_MEDIAWIKI_TALK,
+ 'à´ªàµà´°à´¤àµà´¯àµ‡' => NS_SPECIAL,
'വിഭാഗം' => NS_CATEGORY,
'വിഭാഗതàµà´¤à´¿à´¨àµà´±àµ†_സംവാദം' => NS_CATEGORY_TALK,
'വർഗàµà´—à´‚' => NS_CATEGORY,
@@ -72,7 +80,7 @@ $namespaceAliases = array(
$specialPageAliases = array(
'DoubleRedirects' => array( 'ഇരടàµà´Ÿà´¤àµà´¤à´¿à´°à´¿à´šàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾' ),
'BrokenRedirects' => array( 'പൊടàµà´Ÿà´¿à´¯à´¤à´¿à´°à´¿à´šàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾' ),
- 'Disambiguations' => array( 'നാനാർതàµà´¥à´™àµà´™àµ¾' ),
+ 'Disambiguations' => array( 'വിവകàµà´·à´¿à´¤à´™àµà´™àµ¾' ),
'Userlogin' => array( 'à´ªàµà´°à´µàµ‡à´¶à´¨à´‚' ),
'Userlogout' => array( 'à´ªàµà´±à´¤àµà´¤àµà´•à´Ÿà´•àµà´•àµ½' ),
'CreateAccount' => array( 'à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•àµ½' ),
@@ -80,47 +88,49 @@ $specialPageAliases = array(
'Watchlist' => array( 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µ' ),
'Recentchanges' => array( 'സമീപകാലമാറàµà´±à´™àµà´™àµ¾' ),
'Upload' => array( 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ' ),
- 'Listfiles' => array( 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•', 'à´šà´¿à´¤àµà´°à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•' ),
- 'Newimages' => array( 'à´ªàµà´¤à´¿à´¯ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'à´ªàµà´¤à´¿à´¯ à´šà´¿à´¤àµà´°à´™àµà´™àµ¾' ),
- 'Listusers' => array( 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•' ),
- 'Listgrouprights' => array( 'സമൂഹതàµà´¤à´¿à´¨àµà´±àµ† അവകാശങàµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•' ),
+ 'UploadStash' => array( 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ_മറയàµà´•àµà´•àµ½' ),
+ 'Listfiles' => array( 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ†_പടàµà´Ÿà´¿à´•', 'à´šà´¿à´¤àµà´°à´™àµà´™à´³àµà´Ÿàµ†_പടàµà´Ÿà´¿à´•' ),
+ 'Newimages' => array( 'à´ªàµà´¤à´¿à´¯_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'à´ªàµà´¤à´¿à´¯_à´šà´¿à´¤àµà´°à´™àµà´™àµ¾' ),
+ 'Listusers' => array( 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†_പടàµà´Ÿà´¿à´•' ),
+ 'Listgrouprights' => array( 'സമൂഹതàµà´¤à´¿à´¨àµà´±àµ†_അവകാശങàµà´™à´³àµà´Ÿàµ†_പടàµà´Ÿà´¿à´•' ),
'Statistics' => array( 'à´¸àµà´¥à´¿à´¤à´¿à´µà´¿à´µà´°à´‚' ),
- 'Randompage' => array( 'à´•àµà´°à´®à´°à´¹à´¿à´¤à´®à´¾à´¯à´¿', 'താളàµà´•àµ¾ à´•àµà´°à´®à´°à´¹à´¿à´¤à´®à´¾à´¯à´¿' ),
- 'Lonelypages' => array( 'അനാഥ താളàµà´•àµ¾' ),
- 'Uncategorizedpages' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤ താളàµà´•àµ¾' ),
- 'Uncategorizedcategories' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤ വർഗàµà´—à´™àµà´™àµ¾' ),
- 'Uncategorizedimages' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾' ),
- 'Uncategorizedtemplates' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤ ഫലകങàµà´™àµ¾' ),
- 'Unusedcategories' => array( 'ഉപയോഗികàµà´•à´¾à´¤àµà´¤ വർഗàµà´—à´™àµà´™àµ¾' ),
- 'Unusedimages' => array( 'ഉപയോഗികàµà´•à´¾à´¤àµà´¤ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾' ),
- 'Wantedpages' => array( 'ആവശàµà´¯à´®àµà´³àµà´³ താളàµà´•àµ¾', 'പൊടàµà´Ÿà´¿à´¯ à´•à´£àµà´£à´¿à´•àµ¾' ),
- 'Wantedcategories' => array( 'ആവശàµà´¯à´®àµà´³àµà´³ വർഗàµà´—à´™àµà´™àµ¾' ),
- 'Wantedfiles' => array( 'ആവശàµà´¯à´®àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾' ),
- 'Wantedtemplates' => array( 'ആവശàµà´¯à´®àµà´³àµà´³ ഫലകങàµà´™àµ¾' ),
- 'Mostlinked' => array( 'കൂടàµà´¤àµ½ à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³ താളàµà´•àµ¾', 'കൂടàµà´¤àµ½ à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³à´µ' ),
- 'Mostlinkedcategories' => array( 'കൂടàµà´¤àµ½ à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³ വർഗàµà´—à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½ ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ വർഗàµà´—à´™àµà´™àµ¾' ),
- 'Mostlinkedtemplates' => array( 'കൂടàµà´¤àµ½ à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³ ഫലകങàµà´™àµ¾', 'കൂടàµà´¤àµ½ ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഫലകങàµà´™àµ¾' ),
- 'Mostimages' => array( 'കൂടàµà´¤àµ½ à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½ à´šà´¿à´¤àµà´°à´™àµà´™àµ¾' ),
- 'Mostcategories' => array( 'കൂടàµà´¤àµ½ വർഗàµà´—à´™àµà´™àµ¾' ),
- 'Mostrevisions' => array( 'കൂടàµà´¤àµ½ à´ªàµà´¨à´°à´µà´²àµ‹à´•à´¨à´™àµà´™àµ¾' ),
- 'Fewestrevisions' => array( 'à´•àµà´±à´žàµà´ž à´ªàµà´¨à´°à´µà´²àµ‹à´•à´¨à´™àµà´™àµ¾' ),
- 'Shortpages' => array( 'ചെറിയ താളàµà´•àµ¾' ),
- 'Longpages' => array( 'വലിയ താളàµà´•àµ¾' ),
- 'Newpages' => array( 'à´ªàµà´¤à´¿à´¯ താളàµà´•àµ¾' ),
- 'Ancientpages' => array( 'à´ªàµà´°à´¾à´¤à´¨ താളàµà´•àµ¾' ),
- 'Deadendpages' => array( 'à´…à´¨àµà´¤àµà´¯à´¸àµà´¥à´¾à´¨à´¤àµà´¤àµà´³àµà´³ താളàµà´•àµ¾' ),
- 'Protectedpages' => array( 'സംരകàµà´·à´¿à´¤ താളàµà´•àµ¾' ),
- 'Protectedtitles' => array( 'സംരകàµà´·à´¿à´¤ ശീർഷകങàµà´™àµ¾' ),
+ 'Randompage' => array( 'à´•àµà´°à´®à´°à´¹à´¿à´¤à´‚', 'à´•àµà´°à´®à´°à´¹à´¿à´¤à´¤à´¾àµ¾' ),
+ 'Lonelypages' => array( 'അനാഥ_താളàµà´•àµ¾' ),
+ 'Uncategorizedpages' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤_താളàµà´•àµ¾' ),
+ 'Uncategorizedcategories' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤_വർഗàµà´—à´™àµà´™àµ¾' ),
+ 'Uncategorizedimages' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾' ),
+ 'Uncategorizedtemplates' => array( 'വർഗàµà´—ീകരികàµà´•à´¾à´¤àµà´¤_ഫലകങàµà´™àµ¾' ),
+ 'Unusedcategories' => array( 'ഉപയോഗികàµà´•à´¾à´¤àµà´¤_വർഗàµà´—à´™àµà´™àµ¾' ),
+ 'Unusedimages' => array( 'ഉപയോഗികàµà´•à´¾à´¤àµà´¤_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾' ),
+ 'Wantedpages' => array( 'ആവശàµà´¯à´®àµà´³àµà´³_താളàµà´•àµ¾', 'പൊടàµà´Ÿà´¿à´¯_à´•à´£àµà´£à´¿à´•àµ¾' ),
+ 'Wantedcategories' => array( 'ആവശàµà´¯à´®àµà´³àµà´³_വർഗàµà´—à´™àµà´™àµ¾' ),
+ 'Wantedfiles' => array( 'ആവശàµà´¯à´®àµà´³àµà´³_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾' ),
+ 'Wantedtemplates' => array( 'ആവശàµà´¯à´®àµà´³àµà´³_ഫലകങàµà´™àµ¾' ),
+ 'Mostlinked' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_താളàµà´•àµ¾', 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³à´µ' ),
+ 'Mostlinkedcategories' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_വർഗàµà´—à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½_ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³_വർഗàµà´—à´™àµà´™àµ¾' ),
+ 'Mostlinkedtemplates' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_ഫലകങàµà´™àµ¾', 'കൂടàµà´¤àµ½_ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³_ഫലകങàµà´™àµ¾' ),
+ 'Mostimages' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½_à´šà´¿à´¤àµà´°à´™àµà´™àµ¾' ),
+ 'Mostcategories' => array( 'കൂടàµà´¤àµ½_വർഗàµà´—à´™àµà´™àµ¾' ),
+ 'Mostrevisions' => array( 'കൂടàµà´¤àµ½_à´ªàµà´¨à´°à´µà´²àµ‹à´•à´¨à´™àµà´™àµ¾' ),
+ 'Fewestrevisions' => array( 'à´•àµà´±à´žàµà´ž_à´ªàµà´¨à´°à´µà´²àµ‹à´•à´¨à´™àµà´™àµ¾' ),
+ 'Shortpages' => array( 'ചെറിയ_താളàµà´•àµ¾' ),
+ 'Longpages' => array( 'വലിയ_താളàµà´•àµ¾' ),
+ 'Newpages' => array( 'à´ªàµà´¤à´¿à´¯_താളàµà´•àµ¾' ),
+ 'Ancientpages' => array( 'à´ªàµà´°à´¾à´¤à´¨_താളàµà´•àµ¾' ),
+ 'Deadendpages' => array( 'à´…à´¨àµà´¤àµà´¯à´¸àµà´¥à´¾à´¨à´¤àµà´¤àµà´³àµà´³_താളàµà´•àµ¾' ),
+ 'Protectedpages' => array( 'സംരകàµà´·à´¿à´¤_താളàµà´•àµ¾' ),
+ 'Protectedtitles' => array( 'സംരകàµà´·à´¿à´¤_ശീർഷകങàµà´™àµ¾' ),
'Allpages' => array( 'à´Žà´²àµà´²à´¾à´¤à´¾à´³àµà´•à´³àµà´‚' ),
'Prefixindex' => array( 'പൂർവàµà´µà´ªà´¦à´¸àµ‚à´šà´¿à´•' ),
- 'Ipblocklist' => array( 'തടയൽ‌പടàµà´Ÿà´¿à´•', 'à´à´ªà´¿à´•à´³àµà´Ÿàµ† തടയൽ‌പടàµà´Ÿà´¿à´•' ),
+ 'Ipblocklist' => array( 'തടയൽ‌പടàµà´Ÿà´¿à´•', 'à´à´ªà´¿à´•à´³àµà´Ÿàµ†_തടയൽ‌പടàµà´Ÿà´¿à´•' ),
+ 'Unblock' => array( 'തടയൽനീകàµà´•àµà´•' ),
'Specialpages' => array( 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¤à´¾à´³àµà´•àµ¾' ),
'Contributions' => array( 'സംഭാവനകൾ' ),
'Emailuser' => array( 'ഉപയോകàµà´¤àµƒà´‡à´®àµ†à´¯à´¿àµ½' ),
- 'Confirmemail' => array( 'ഇമെയിൽ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•' ),
+ 'Confirmemail' => array( 'ഇമെയിൽ_à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•' ),
'Whatlinkshere' => array( 'à´•à´£àµà´£à´¿à´•à´³àµ†à´¨àµà´¤àµ†à´²àµà´²à´¾à´‚' ),
- 'Recentchangeslinked' => array( 'ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ മാറàµà´±à´™àµà´™àµ¾' ),
- 'Movepage' => array( 'താൾ മാറàµà´±àµà´•' ),
+ 'Recentchangeslinked' => array( 'ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ_മാറàµà´±à´™àµà´™àµ¾' ),
+ 'Movepage' => array( 'താൾ_മാറàµà´±àµà´•' ),
'Blockme' => array( 'à´Žà´¨àµà´¨àµ†à´¤à´Ÿà´¯àµà´•' ),
'Booksources' => array( 'à´ªàµà´¸àµà´¤à´•à´¸àµà´°àµ‹à´¤à´¸àµà´¸àµà´•àµ¾' ),
'Categories' => array( 'വർഗàµà´—à´™àµà´™àµ¾' ),
@@ -128,36 +138,41 @@ $specialPageAliases = array(
'Version' => array( 'പതിപàµà´ªàµ' ),
'Allmessages' => array( 'സർവàµà´µà´¸à´¨àµà´¦àµ‡à´¶à´™àµà´™àµ¾' ),
'Log' => array( 'രേഖ', 'രേഖകൾ' ),
- 'Blockip' => array( 'തടയàµà´•', 'à´à´ªà´¿à´¯àµ† തടയàµà´•', 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† തടയàµà´•' ),
- 'Undelete' => array( 'മായàµà´šàµà´šà´µ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¨à´‚' ),
+ 'Blockip' => array( 'തടയàµà´•', 'à´à´ªà´¿à´¯àµ†_തടയàµà´•', 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ†_തടയàµà´•' ),
+ 'Undelete' => array( 'മായàµà´šàµà´šà´µ_à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¨à´‚' ),
'Import' => array( 'ഇറകàµà´•àµà´®à´¤à´¿' ),
'Lockdb' => array( 'à´¡à´¿.ബി.ബനàµà´§à´¿à´•àµà´•àµà´•' ),
'Unlockdb' => array( 'à´¡à´¿.ബി.ബനàµà´§à´¨à´‚നീകàµà´•àµà´•' ),
'Userrights' => array( 'ഉപയോകàµà´¤àµƒà´…വകാശങàµà´™àµ¾', 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¸àµƒà´·àµà´Ÿà´¿', 'യനàµà´¤àµà´°à´¸àµƒà´·àµà´Ÿà´¿' ),
'MIMEsearch' => array( 'മൈംതിരയൽ' ),
- 'FileDuplicateSearch' => array( 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† അപരനàµà´³àµà´³ തിരചàµà´šà´¿àµ½' ),
+ 'FileDuplicateSearch' => array( 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ†_അപരനàµà´³àµà´³_തിരചàµà´šà´¿àµ½' ),
'Unwatchedpages' => array( 'ആരàµà´‚à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•à´¾à´¤àµà´¤à´¤à´¾à´³àµà´•àµ¾' ),
'Listredirects' => array( 'തിരിചàµà´šàµà´µà´¿à´Ÿàµ½â€Œà´ªà´Ÿàµà´Ÿà´¿à´•' ),
- 'Revisiondelete' => array( 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ മായàµà´•àµà´•àµ½' ),
+ 'Revisiondelete' => array( 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ_മായàµà´•àµà´•àµ½' ),
'Unusedtemplates' => array( 'ഉപയോഗികàµà´•à´¾à´¤àµà´¤à´«à´²à´•à´™àµà´™àµ¾' ),
'Randomredirect' => array( 'à´•àµà´°à´®à´°à´¹à´¿à´¤à´¤à´¿à´°à´¿à´šàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾' ),
- 'Mypage' => array( 'à´Žà´¨àµà´±àµ† താൾ' ),
- 'Mytalk' => array( 'à´Žà´¨àµà´±àµ† സംവാദം' ),
- 'Mycontributions' => array( 'à´Žà´¨àµà´±àµ† സംഭാവനകൾ' ),
+ 'Mypage' => array( 'à´Žà´¨àµà´±àµ†à´¤à´¾àµ¾' ),
+ 'Mytalk' => array( 'à´Žà´¨àµà´±àµ†à´¸à´‚വാദം' ),
+ 'Mycontributions' => array( 'à´Žà´¨àµà´±àµ†à´¸à´‚ഭാവനകൾ' ),
+ 'Myuploads' => array( 'ഞാൻഅപàµâ€Œà´²àµ‹à´¡àµâ€Œà´šàµ†à´¯àµà´¤à´µ' ),
+ 'PermanentLink' => array( 'à´¸àµà´¥à´¿à´°à´‚à´•à´£àµà´£à´¿' ),
'Listadmins' => array( 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´ªà´Ÿàµà´Ÿà´¿à´•' ),
- 'Listbots' => array( 'യനàµà´¤àµà´°à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•' ),
- 'Popularpages' => array( 'ജനകീയതാളàµà´•àµ¾' ),
+ 'Listbots' => array( 'യനàµà´¤àµà´°à´™àµà´™à´³àµà´Ÿàµ†_പടàµà´Ÿà´¿à´•' ),
+ 'Popularpages' => array( 'ജനപàµà´°à´¿à´¯à´¤à´¾à´³àµà´•àµ¾' ),
'Search' => array( 'à´…à´¨àµà´µàµ‡à´·à´£à´‚' ),
- 'Resetpass' => array( 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´•' ),
+ 'Resetpass' => array( 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ_മാറàµà´±àµà´•' ),
'Withoutinterwiki' => array( 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿à´¯à´¿à´²àµà´²à´¾à´¤àµà´¤à´µ' ),
'MergeHistory' => array( 'നാൾവഴിലയിപàµà´ªà´¿à´•àµà´•àµà´•' ),
'Filepath' => array( 'à´ªàµà´°à´®à´¾à´£à´µà´¿à´²à´¾à´¸à´‚' ),
- 'Invalidateemail' => array( 'സാധàµà´µà´²àµà´²à´¾à´¤àµà´¤ ഇമെയിൽ' ),
+ 'Invalidateemail' => array( 'ഇമെയിൽഅസാധàµà´µà´¾à´•àµà´•àµà´•' ),
'Blankpage' => array( 'ശൂനàµà´¯à´¤à´¾àµ¾' ),
- 'LinkSearch' => array( 'à´•à´£àµà´£à´¿à´•àµ¾ തിരയàµà´•' ),
- 'DeletedContributions' => array( 'മായàµà´šàµà´š സേവനങàµà´™àµ¾' ),
+ 'LinkSearch' => array( 'à´•à´£àµà´£à´¿à´•àµ¾_തിരയàµà´•' ),
+ 'DeletedContributions' => array( 'മായàµà´šàµà´š_സേവനങàµà´™àµ¾' ),
'Tags' => array( 'à´±àµà´±à´¾à´—àµà´•àµ¾' ),
- 'Activeusers' => array( 'സജീവ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾' ),
+ 'Activeusers' => array( 'സജീവ_ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾' ),
+ 'ComparePages' => array( 'താളàµà´•à´³àµà´Ÿàµ†à´¤à´¾à´°à´¤à´®àµà´¯à´‚' ),
+ 'Badtitle' => array( 'മോശംതലകàµà´•àµ†à´Ÿàµà´Ÿàµ' ),
+ 'DisableAccount' => array( 'à´…à´‚à´—à´¤àµà´µà´‚നിർജàµà´œàµ€à´µà´®à´¾à´•àµà´•àµà´•' ),
);
$magicWords = array(
@@ -191,9 +206,9 @@ $magicWords = array(
'localtime' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¸à´®à´¯à´‚', 'LOCALTIME' ),
'localhour' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´£à´¿à´•àµà´•àµ‚ർ', 'LOCALHOUR' ),
'numberofpages' => array( '1', 'താളàµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ലേഖങàµà´™à´¨à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFARTICLES' ),
+ 'numberofarticles' => array( '1', 'ലേഖനങàµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'à´…à´‚à´—à´™àµà´™à´³àµà´¯àµ†à´£àµà´£à´‚', 'NUMBEROFUSERS' ),
+ 'numberofusers' => array( '1', 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'à´…à´‚à´—à´™àµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFUSERS' ),
'numberofactiveusers' => array( '1', 'സജീവോപയാകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFACTIVEUSERS' ),
'numberofedits' => array( '1', 'തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ†à´£àµà´£à´‚', 'NUMBEROFEDITS' ),
'numberofviews' => array( '1', 'à´Žà´Ÿàµà´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´²àµà´•à´³àµà´Ÿàµ†à´£àµà´£à´‚', 'NUMBEROFVIEWS' ),
@@ -216,7 +231,8 @@ $magicWords = array(
'subjectpagename' => array( '1', 'ലേഖനതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'ലേഖനതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'സനàµà´¦àµ‡à´¶à´‚:', 'MSG:' ),
- 'subst' => array( '0', 'ബദൽ:', 'ബദൽ:', 'SUBST:' ),
+ 'subst' => array( '0', 'ബദൽ:', 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'സംരകàµà´·à´¿à´¤à´¬à´¦àµ½:', 'സംരകàµà´·à´¿à´¤à´¯àµàµ¾à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'മൂലരൂപം:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'ലഘàµà´šà´¿à´¤àµà´°à´‚', 'ലഘàµ', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'ലഘàµà´šà´¿à´¤àµà´°à´‚=$1', 'ലഘàµ=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -226,8 +242,13 @@ $magicWords = array(
'img_width' => array( '1', '$1ബിനàµà´¦àµ', '$1px' ),
'img_center' => array( '1', 'നടàµà´µà´¿àµ½', 'നടàµà´•àµà´•àµâ€Œ', 'center', 'centre' ),
'img_framed' => array( '1', 'à´šà´Ÿàµà´Ÿà´‚', 'à´šà´Ÿàµà´Ÿà´¤àµà´¤à´¿àµ½', 'framed', 'enframed', 'frame' ),
- 'img_page' => array( '1', 'താൾ=$1', 'താൾ $1', 'page=$1', 'page $1' ),
+ 'img_frameless' => array( '1', 'à´šà´Ÿàµà´Ÿà´°à´¹à´¿à´¤à´‚', 'frameless' ),
+ 'img_page' => array( '1', 'താൾ=$1', 'താൾ_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'നേരേകàµà´¤àµà´¤à´¨àµ†', 'നേരേകàµà´¤àµà´¤à´¨àµ†=$1', 'നേരേകàµà´¤àµà´¤à´¨àµ†_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'അതിർവര', 'border' ),
+ 'img_baseline' => array( '1', 'താഴെയàµà´³àµà´³à´µà´°', 'baseline' ),
+ 'img_sub' => array( '1', 'കീഴെയെഴàµà´¤àµà´¤àµ', 'sub' ),
+ 'img_super' => array( '1', 'മേലേയെഴàµà´¤àµà´¤àµ', 'super', 'sup' ),
'img_top' => array( '1', 'മേലെ', 'top' ),
'img_text_top' => array( '1', 'à´Žà´´àµà´¤àµà´¤àµ-മേലെ', 'text-top' ),
'img_middle' => array( '1', 'മദàµà´§àµà´¯à´‚', 'middle' ),
@@ -239,6 +260,7 @@ $magicWords = array(
'ns' => array( '0', 'നാമേ:', 'NS:' ),
'localurl' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½:', 'LOCALURL:' ),
'localurle' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½à´‡:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ലേഖനപഥം', 'ARTICLEPATH' ),
'server' => array( '0', 'സെർവർ', 'SERVER' ),
'servername' => array( '0', 'സെർവറിനàµà´±àµ†à´ªàµ‡à´°àµ', 'SERVERNAME' ),
'scriptpath' => array( '0', 'à´¸àµà´•àµà´°à´¿à´ªàµà´±àµà´±àµà´ªà´¾à´¤àµà´¤àµ', 'SCRIPTPATH' ),
@@ -252,8 +274,10 @@ $magicWords = array(
'revisionday' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´µà´¸à´‚', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´¨à´‚', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´µà´¸à´‚2', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´¨à´‚2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´®à´¾à´¸à´‚', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´®à´¾à´¸à´‚1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´µàµ¼à´·à´‚', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¸à´®à´¯à´®àµà´¦àµà´°', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'അവസാനംതിരàµà´¤àµà´¤à´¿à´¯à´¯à´¾àµ¾', 'REVISIONUSER' ),
'plural' => array( '0', 'ബഹàµà´µà´šà´¨à´‚:', 'PLURAL:' ),
'fullurl' => array( '0', 'പൂർണàµà´£à´µà´¿à´²à´¾à´¸à´‚:', 'FULLURL:' ),
'raw' => array( '0', 'അസംസàµà´•àµƒà´¤à´‚:', 'RAW:' ),
@@ -273,14 +297,20 @@ $magicWords = array(
'padleft' => array( '0', 'ഇടതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADLEFT' ),
'padright' => array( '0', 'വലതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADRIGHT' ),
'special' => array( '0', 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´‚', 'special' ),
+ 'defaultsort' => array( '1', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½à´šà´¾à´µà´¿:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´µàµ¼à´—àµà´—à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'à´ªàµà´°à´®à´¾à´£à´ªà´¥à´‚:', 'FILEPATH:' ),
'tag' => array( '0', 'à´±àµà´±à´¾à´—àµ', 'tag' ),
'hiddencat' => array( '1', '‌‌__മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´‚വർഗàµà´—à´‚__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'വർഗàµà´—à´¤àµà´¤à´¿à´²àµà´³àµà´³à´¤à´¾à´³àµà´•àµ¾', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'താൾവലിപàµà´ªà´‚', 'PAGESIZE' ),
'index' => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
'noindex' => array( '1', '__സൂചികവേണàµà´Ÿ__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '_à´¸àµà´¥à´¿à´°à´¸àµà´¥à´¿à´¤à´¤à´¿à´°à´¿à´šàµà´šàµà´µà´¿à´Ÿàµ½_', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'സംരകàµà´·à´£à´¤à´²à´‚', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'പഥം', 'PATH' ),
+ 'url_wiki' => array( '0', 'വികàµà´•à´¿', 'WIKI' ),
+ 'url_query' => array( '0', 'à´•àµà´µà´±à´¿', 'QUERY' ),
);
$messages = array(
@@ -299,8 +329,7 @@ $messages = array(
'tog-editsection' => 'ഉപവിഭാഗങàµà´™à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤àµ½ [തിരàµà´¤àµà´¤àµà´•] à´Žà´¨àµà´¨ à´•à´£àµà´£à´¿à´¯àµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ ചെയàµà´¯àµà´µà´¾àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•',
'tog-editsectiononrightclick' => 'ഉപവിഭാഗങàµà´™à´³àµà´Ÿàµ† തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ റൈറàµà´±àµ à´•àµà´²à´¿à´•àµà´•àµ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ വഴി തിരàµà´¤àµà´¤à´¾à´¨à´¨àµà´µà´¦à´¿à´•àµà´•àµà´• (ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ)',
'tog-showtoc' => 'ഉളàµà´³à´Ÿà´•àµà´•à´ªàµà´ªà´Ÿàµà´Ÿà´¿à´• à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´• (മൂനàµà´¨à´¿àµ½ കൂടàµà´¤àµ½ ഉപശീർഷകങàµà´™à´³àµà´³àµà´³ താളàµà´•àµ¾à´•àµà´•àµ മാതàµà´°à´‚)',
-'tog-rememberpassword' => 'à´Žà´¨àµà´±àµ† à´ªàµà´°à´µàµ‡à´¶à´‚ à´ˆ à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ ഓർതàµà´¤àµà´µàµ†à´•àµà´•àµà´•',
-'tog-editwidth' => 'à´¸àµà´•àµà´°àµ€àµ» à´®àµà´´àµà´µàµ» നിറയàµà´¨àµà´¨ വിധതàµà´¤à´¿àµ½ തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ പെടàµà´Ÿà´¿ വിസàµà´¤à´¾à´°à´®àµà´³àµà´³à´¤à´¾à´•àµà´•àµà´•',
+'tog-rememberpassword' => 'à´Žà´¨àµà´±àµ† à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµ½ à´ˆ à´¬àµà´°àµ—സറിൽ ({{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസം}}) ഓർതàµà´¤àµà´µàµ†à´•àµà´•àµà´•',
'tog-watchcreations' => 'ഞാൻ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ ചേർകàµà´•àµà´•',
'tog-watchdefault' => 'ഞാൻ തിരàµà´¤àµà´¤àµà´¨àµà´¨ താളàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ ചേർകàµà´•àµà´•',
'tog-watchmoves' => 'ഞാൻ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±àµà´¨àµà´¨ താളàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ ചേർകàµà´•àµà´•',
@@ -315,7 +344,7 @@ $messages = array(
'tog-enotifrevealaddr' => 'വിജàµà´žà´¾à´ªà´¨ മെയിലàµà´•à´³à´¿àµ½ à´Žà´¨àµà´±àµ† ഇമെയിൽ വിലാസം വെളിവാകàµà´•à´¾àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•',
'tog-shownumberswatching' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚ കാണികàµà´•àµà´•',
'tog-oldsig' => 'നിലവിലàµà´³àµà´³ à´’à´ªàµà´ªà´¿à´¨àµà´±àµ† രൂപം:',
-'tog-fancysig' => 'à´’à´ªàµà´ªàµ ഒരൠവികàµà´•à´¿à´Ÿàµ†à´•àµà´¸àµà´±àµà´±à´¾à´¯à´¿ പരിഗണികàµà´•àµà´• (à´•à´£àµà´£à´¿ à´¸àµà´µà´¯à´‚ ചേർകàµà´•àµ‡à´£àµà´Ÿà´¤à´¿à´²àµà´²)',
+'tog-fancysig' => 'à´’à´ªàµà´ªàµ ഒരൠവികàµà´•à´¿ à´Žà´´àµà´¤àµà´¤à´¾à´¯à´¿ പരിഗണികàµà´•àµà´• (à´•à´£àµà´£à´¿ à´¸àµà´µà´¯à´‚ ചേർകàµà´•àµ‡à´£àµà´Ÿà´¤à´¿à´²àµà´²)',
'tog-externaleditor' => 'à´¸àµà´µà´¤àµ‡ ബാഹàµà´¯ à´Žà´¡à´¿à´±àµà´±àµ¼ ഉപയോഗികàµà´•àµà´• (വിദഗàµà´¦àµà´§ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ മാതàµà´°à´‚, താങàµà´•à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ à´ªàµà´°à´¤àµà´¯àµ‡à´• സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾ ആവശàµà´¯à´®à´¾à´£àµ. [http://www.mediawiki.org/wiki/Manual:External_editors കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾.])',
'tog-externaldiff' => 'à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ അറിയാൻ à´¸àµà´µà´¤àµ‡ ബാഹàµà´¯ ഉപകരണങàµà´™àµ¾ ഉപയോഗികàµà´•àµà´• (വിദഗàµà´¦àµà´§ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ മാതàµà´°à´‚, താങàµà´•à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ à´ªàµà´°à´¤àµà´¯àµ‡à´• സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾ ആവശàµà´¯à´®à´¾à´£àµ. [http://www.mediawiki.org/wiki/Manual:External_editors കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾.])',
'tog-showjumplinks' => '"പോവàµà´•" à´—à´®àµà´¯à´¤ à´•à´£àµà´£à´¿à´•àµ¾ à´ªàµà´°à´¾à´ªàµà´¤à´®à´¾à´•àµà´•àµà´•',
@@ -434,7 +463,7 @@ $messages = array(
# Cologne Blue skin
'qbfind' => 'à´•à´£àµà´Ÿàµ†à´¤àµà´¤àµà´•',
-'qbbrowse' => 'പരതàµà´•',
+'qbbrowse' => 'à´¬àµà´°àµ—à´¸àµ',
'qbedit' => 'തിരàµà´¤àµà´¤àµà´•',
'qbpageoptions' => 'ഈ താൾ',
'qbpageinfo' => 'സനàµà´¦àµ¼à´­à´‚',
@@ -444,31 +473,21 @@ $messages = array(
'faqpage' => 'Project:പതിവàµà´šàµ‹à´¦àµà´¯à´™àµà´™àµ¾',
# Vector skin
-'vector-action-addsection' => 'വിഷയം ചേർകàµà´•àµà´•',
-'vector-action-delete' => 'മായàµà´•àµà´•àµà´•',
-'vector-action-move' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±àµà´•',
-'vector-action-protect' => 'സം‌രകàµà´·à´¿à´•àµà´•àµà´•',
-'vector-action-undelete' => 'മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤àµ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•',
-'vector-action-unprotect' => 'സം‌രകàµà´·à´£à´‚ നീകàµà´•àµà´•',
-'vector-namespace-category' => 'വർഗàµà´—à´‚',
-'vector-namespace-help' => 'സഹായം താൾ',
-'vector-namespace-image' => 'à´ªàµà´°à´®à´¾à´£à´‚',
-'vector-namespace-main' => 'ലേഖനം',
-'vector-namespace-media' => 'മീഡിയ താൾ',
-'vector-namespace-mediawiki' => 'സനàµà´¦àµ‡à´¶à´‚',
-'vector-namespace-project' => 'പദàµà´§à´¤à´¿ താൾ',
-'vector-namespace-special' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´• താൾ',
-'vector-namespace-talk' => 'സം‌വാദം',
-'vector-namespace-template' => 'ഫലകം',
-'vector-namespace-user' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† താൾ',
-'vector-view-create' => 'സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•',
-'vector-view-edit' => 'തിരàµà´¤àµà´¤àµà´•',
-'vector-view-history' => 'നാൾവഴി കാണàµà´•',
-'vector-view-view' => 'വായികàµà´•àµà´•',
-'vector-view-viewsource' => 'മൂലരൂപം കാണàµà´•',
-'actions' => 'നടപടികൾ',
-'namespaces' => 'നാമമേഖല',
-'variants' => 'à´šà´°à´™àµà´™àµ¾',
+'vector-action-addsection' => 'വിഷയം ചേർകàµà´•àµà´•',
+'vector-action-delete' => 'മായàµà´•àµà´•àµà´•',
+'vector-action-move' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±àµà´•',
+'vector-action-protect' => 'സം‌രകàµà´·à´¿à´•àµà´•àµà´•',
+'vector-action-undelete' => 'മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤àµ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•',
+'vector-action-unprotect' => 'സം‌രകàµà´·à´£à´‚ നീകàµà´•àµà´•',
+'vector-simplesearch-preference' => 'മെചàµà´šà´ªàµà´ªàµ†à´Ÿàµà´Ÿ തിരചàµà´šà´¿àµ½ നിർദàµà´¦àµ‡à´¶à´™àµà´™àµ¾ തരിക (വെകàµà´±àµà´±àµ¼ ദൃശàµà´¯à´°àµ‚പതàµà´¤à´¿àµ½ മാതàµà´°à´‚)',
+'vector-view-create' => 'സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•',
+'vector-view-edit' => 'തിരàµà´¤àµà´¤àµà´•',
+'vector-view-history' => 'നാൾവഴി കാണàµà´•',
+'vector-view-view' => 'വായികàµà´•àµà´•',
+'vector-view-viewsource' => 'മൂലരൂപം കാണàµà´•',
+'actions' => 'നടപടികൾ',
+'namespaces' => 'നാമമേഖല',
+'variants' => 'à´šà´°à´™àµà´™àµ¾',
'errorpagetitle' => 'പിഴവàµ',
'returnto' => '$1 à´Žà´¨àµà´¨ താളിലേകàµà´•àµ തിരിചàµà´šàµà´ªàµ‹à´µàµà´•.',
@@ -515,7 +534,7 @@ $messages = array(
'viewhelppage' => 'സഹായം താൾ കാണàµà´•',
'categorypage' => 'വർഗàµà´—à´‚ താൾ കാണàµà´•',
'viewtalkpage' => 'സം‌വാദം കാണàµà´•',
-'otherlanguages' => 'ഇതര ഭാഷകളിൽ',
+'otherlanguages' => 'ഇതരഭാഷകളിൽ',
'redirectedfrom' => '($1 à´Žà´¨àµà´¨ താളിൽ നിനàµà´¨àµà´‚ തിരിചàµà´šàµà´µà´¿à´Ÿàµà´Ÿà´¤àµ à´ªàµà´°à´•à´¾à´°à´‚)',
'redirectpagesub' => 'തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താൾ',
'lastmodifiedat' => 'à´ˆ താൾ അവസാനം തിരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤àµ: $2, $1.',
@@ -529,6 +548,9 @@ $messages = array(
ഇനിയàµà´‚ താൾ ലഭàµà´¯à´®à´¾à´•àµà´•àµà´µà´¾àµ» താങàµà´•àµ¾ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ ദയവായി à´…à´²àµà´ªà´¸à´®à´¯à´‚ കാതàµà´¤à´¿à´°à´¿à´•àµà´•àµà´•.
$1',
+'pool-timeout' => 'പൂടàµà´Ÿàµ മാറാനàµà´³àµà´³ കാതàµà´¤à´¿à´°à´¿à´ªàµà´ªàµ സമയം',
+'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}} സം‌രംഭതàµà´¤àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµ',
@@ -636,7 +658,7 @@ $1',
'missingarticle-rev' => '(മാറàµà´±à´‚#: $1)',
'missingarticle-diff' => '(à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚: $1, $2)',
'readonly_lag' => 'വിവരശേഖരം à´¸àµà´µà´¯à´‚ ബനàµà´§à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ അതേസമയം കീഴàµ-വിവരശേഖര സെർവറàµà´•àµ¾ മാസàµà´±àµà´±àµ¼ വരെ പിടിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'internalerror' => 'ആനàµà´¤à´°à´¿à´•à´®à´¾à´¯ à´ªàµà´°à´¶àµà´¨à´‚',
+'internalerror' => 'ആനàµà´¤à´°à´¿à´•à´ªàµà´°à´¶àµà´¨à´‚',
'internalerror_info' => 'ആനàµà´¤à´°à´¿à´•à´ªàµà´°à´¶àµà´¨à´‚: $1',
'fileappenderrorread' => 'കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´¨àµà´¨ സമയം "$1" വായിചàµà´šàµ†à´Ÿàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
'fileappenderror' => '"$1" à´Žà´¨àµà´¨à´¤àµ "$2"-ലേകàµà´•àµ കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´µà´¾àµ» സാധിചàµà´šà´¿à´²àµà´².',
@@ -693,7 +715,8 @@ $2',
'yourname' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
'yourpassword' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
'yourpasswordagain' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´’à´°à´¿à´•àµà´•àµ½à´•àµà´•àµ‚à´Ÿà´¿:',
-'remembermypassword' => 'à´Žà´¨àµà´±àµ† à´ªàµà´°à´µàµ‡à´¶à´¨à´‚ à´ˆ à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ ഓർതàµà´¤àµà´µàµ†à´•àµà´•àµà´•.',
+'remembermypassword' => 'à´Žà´¨àµà´±àµ† à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµ½ à´ˆ à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ ({{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസം}}) ഓർതàµà´¤àµà´µàµ†à´•àµà´•àµà´•',
+'securelogin-stick-https' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šà´¤à´¿à´¨àµ à´Žà´šàµà´šàµ.à´±àµà´±à´¿.à´±àµà´±à´¿.പി.à´Žà´¸àµ. ഉപയോഗികàµà´•àµà´•',
'yourdomainname' => 'താങàµà´•à´³àµà´Ÿàµ† ഡൊമെയിൻ:',
'externaldberror' => 'à´’à´¨àµà´¨àµà´•à´¿àµ½ ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സാധൂകരണതàµà´¤à´¿àµ½ à´ªàµà´°à´¶àµà´¨à´‚ ഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨àµ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ നവീകരികàµà´•àµà´µà´¾àµ» താങàµà´•à´³àµà´Ÿàµ† ബാഹàµà´¯ à´…à´‚à´—à´¤àµà´µà´‚ താങàµà´•à´³àµ† à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
'login' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµà´•',
@@ -710,7 +733,8 @@ $2',
'gotaccount' => "താങàµà´•àµ¾à´•àµà´•àµ à´…à´‚à´—à´¤àµà´µà´®àµà´£àµà´Ÿàµ‹? '''$1'''.",
'gotaccountlink' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµà´•',
'createaccountmail' => 'ഇമെയിൽ വഴി',
-'badretype' => 'താങàµà´•àµ¾ ടൈപàµà´ªàµ ചെയàµà´¤ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ തമàµà´®à´¿àµ½ യോജികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
+'createaccountreason' => 'കാരണം:',
+'badretype' => 'താങàµà´•àµ¾ ടൈപàµà´ªàµ ചെയàµà´¤ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ തമàµà´®à´¿àµ½ യോജികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
'userexists' => 'à´ˆ പേരിൽ മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നിലവിലàµà´£àµà´Ÿàµ. ദയവായി മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•.',
'loginerror' => 'à´ªàµà´°à´µàµ‡à´¶à´¨à´‚ സാധിചàµà´šà´¿à´²àµà´²',
'createaccounterror' => 'à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²:$1',
@@ -729,6 +753,7 @@ $2',
'wrongpasswordempty' => 'താങàµà´•àµ¾ രഹസàµà´¯à´µà´¾à´•àµà´•àµ നൽകിയിരàµà´¨àµà´¨à´¿à´²àµà´². വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
'passwordtooshort' => 'രഹസàµà´¯à´µà´¾à´•àµà´•à´¿àµ½ à´•àµà´±à´žàµà´žà´¤àµ {{PLURAL:$1|ഒരൠഅകàµà´·à´°à´‚|$1 à´…à´•àµà´·à´°à´™àµà´™àµ¾}} ഉണàµà´Ÿà´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚.',
'password-name-match' => 'താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´¤àµà´¤à´¿àµ½ നിനàµà´¨àµà´‚ à´µàµà´¯à´¤àµà´¯à´¸àµà´¤à´®à´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+'password-login-forbidden' => 'à´ˆ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´¤àµà´¤à´¿à´¨àµà´±àµ†à´¯àµà´‚ രഹസàµà´¯à´µà´¾à´•àµà´•à´¿à´¨àµà´±àµ†à´¯àµà´‚ ഉപയോഗം നിരോധിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'mailmypassword' => 'à´ªàµà´¤à´¿à´¯ രഹസàµà´¯à´µà´¾à´•àµà´•àµ ഇമെയിൽ ചെയàµà´¯àµà´•',
'passwordremindertitle' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ ഉപയോഗികàµà´•à´¾à´¨àµà´³àµà´³ താതàµà´•àµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµ',
'passwordremindertext' => 'ആരോ ഒരാൾ (ഒരൠപകàµà´·àµ‡ താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚, $1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½à´¨à´¿à´¨àµà´¨àµ) {{SITENAME}} ($4) സംരംഭതàµà´¤à´¿à´²àµ‡à´•àµà´•àµ à´ªàµà´¤à´¿à´¯ രഹസàµà´¯à´µà´¾à´•àµà´•àµ ആവശàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. "$2" à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ആവശàµà´¯à´®à´¾à´¯ ഒരൠതാൽകാലിക രഹസàµà´¯à´µà´¾à´•àµà´•à´¾à´¯à´¿ "$3" à´Žà´¨àµà´¨àµ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠതാങàµà´•à´³àµà´Ÿàµ† ആവശàµà´¯à´®à´¾à´£àµ†à´™àµà´•à´¿àµ½, താങàµà´•àµ¾ à´ªàµà´°à´µàµ‡à´¶à´‚ ചെയàµà´¤àµ à´ªàµà´¤à´¿à´¯ രഹസàµà´¯à´µà´¾à´•àµà´•àµ സജàµà´œàµ€à´•à´°à´¿à´•àµà´•àµ‡à´£àµà´Ÿà´¤à´¾à´£àµ. താങàµà´•à´³àµà´Ÿàµ† താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•à´¿à´¨àµà´±àµ† കാലാവധി {{PLURAL:$5|ഒരൠദിവസമാകàµà´¨àµà´¨àµ|$5 ദിവങàµà´™à´³à´¾à´•àµà´¨àµà´¨àµ}}.
@@ -761,6 +786,9 @@ $2',
'loginlanguagelabel' => 'ഭാഷ: $1',
'suspicious-userlogout' => 'ലോഗൗടàµà´Ÿàµ ചെയàµà´¯à´¾à´¨àµà´³àµà´³ താങàµà´•à´³àµà´Ÿàµ† à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨ നിരസിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, കാരണം അതൠതകർനàµà´¨ à´¬àµà´°àµ—സറിൽ നിനàµà´¨àµ‹ കാഷിങൠപàµà´°àµ‹à´•àµà´¸à´¿à´¯à´¿àµ½ നിനàµà´¨àµ‹ ഉണàµà´Ÿà´¾à´¯à´¤àµà´ªàµ‹à´²àµ† à´…à´¨àµà´­à´µà´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.',
+# E-mail sending
+'php-mail-error-unknown' => 'പി.à´Žà´šàµà´šàµ.പി.à´¯àµà´Ÿàµ† main() à´«à´™àµà´·à´¨à´¿àµ½ അപരിചിതമായ പിഴവàµ',
+
# Password reset dialog
'resetpass' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´•',
'resetpass_announce' => 'താങàµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ ആയി à´•à´¿à´Ÿàµà´Ÿà´¿à´¯ താൽകàµà´•à´¾à´²à´¿à´• കോഡൠഉപയോഗിചàµà´šà´¾à´£àµâ€Œ ഇപàµà´ªàµ‹àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµàµâ€Œ. ലോഗിൻ à´ªàµà´°à´•àµà´°à´¿à´¯ പൂർതàµà´¤à´¿à´¯à´¾à´•àµà´µà´¾àµ» à´ªàµà´¤à´¿à´¯àµŠà´°àµ രഹസàµà´¯à´µà´¾à´•àµà´•àµ ഇവിടെ കൊടàµà´•àµà´•àµà´•:',
@@ -801,17 +829,18 @@ $2',
# Edit pages
'summary' => 'à´šàµà´°àµà´•àµà´•à´‚:',
'subject' => 'വിഷയം/തലകàµà´•àµ†à´Ÿàµà´Ÿàµ:',
-'minoredit' => 'ഇതൊരൠചെറിയ തിരàµà´¤àµà´¤à´²à´¾à´£àµ',
+'minoredit' => 'ഇതൊരൠചെറിയ തിരàµà´¤àµà´¤à´¾à´£àµ',
'watchthis' => 'à´ˆ താളിലെ മാറàµà´±à´™àµà´™àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•',
-'savearticle' => 'സേവൠചെയàµà´¯àµà´•',
+'savearticle' => 'താൾ സേവൠചെയàµà´¯àµà´•',
'preview' => 'à´Žà´™àµà´™à´¨àµ†à´¯àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ കാണàµà´•',
'showpreview' => 'à´Žà´™àµà´™à´¨àµ†à´¯àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ കാണàµà´•',
'showlivepreview' => 'തതàµà´¸à´®à´¯ à´ªàµà´°à´¿à´µàµà´¯àµ‚',
'showdiff' => 'മാറàµà´±à´™àµà´™àµ¾ കാണികàµà´•àµà´•',
'anoneditwarning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:''' താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´². താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം താളിനàµà´±àµ† തിരàµà´¤àµà´¤àµ½ à´šà´°à´¿à´¤àµà´°à´¤àµà´¤à´¿àµ½ ചേർകàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.",
+'anonpreviewwarning' => "''താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´². സേവൠചെയàµà´¯àµà´®àµà´ªàµ‹àµ¾ താളിനàµà´±àµ† തിരàµà´¤àµà´¤àµ½ à´šà´°à´¿à´¤àµà´°à´¤àµà´¤à´¿àµ½ താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം ചേർതàµà´¤àµ സൂകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.''",
'missingsummary' => "'''ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ:''' താങàµà´•àµ¾ തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† à´šàµà´°àµà´•àµà´•à´°àµ‚പം നൽകിയിടàµà´Ÿà´¿à´²àµà´². ''സേവൠചെയàµà´¯àµà´•'' ബടàµà´Ÿàµº à´’à´°àµà´µà´Ÿàµà´Ÿà´‚ കൂടി അമർതàµà´¤à´¿à´¯à´¾àµ½ താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´‚ കാതàµà´¤àµà´¸àµ‚à´•àµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.",
'missingcommenttext' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´­à´¿à´ªàµà´°à´¾à´¯à´‚ ദയവായി താഴെ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•.',
-'missingcommentheader' => "'''ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ:''' à´ˆ à´•àµà´±à´¿à´ªàµà´ªà´¿à´¨àµ താങàµà´•àµ¾ വിഷയം/തലകàµà´•àµ†à´Ÿàµà´Ÿàµ നൽകിയിടàµà´Ÿà´¿à´²àµà´². ''സേവൠചെയàµà´¯àµà´•'' à´Žà´¨àµà´¨ ബടàµà´Ÿàµº à´’à´°àµà´µà´Ÿàµà´Ÿà´‚ കൂടി അമർതàµà´¤à´¿à´¯à´¾àµ½ വിഷയം/തലകàµà´•àµ†à´Ÿàµà´Ÿàµ ഇലàµà´²à´¾à´¤àµ† തനàµà´¨àµ† കാതàµà´¤àµà´¸àµ‚à´•àµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´µàµà´‚.",
+'missingcommentheader' => "'''ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ:''' à´ˆ à´•àµà´±à´¿à´ªàµà´ªà´¿à´¨àµ താങàµà´•àµ¾ വിഷയം/തലകàµà´•àµ†à´Ÿàµà´Ÿàµ നൽകിയിടàµà´Ÿà´¿à´²àµà´². ''{{int:savearticle}}'' à´Žà´¨àµà´¨ ബടàµà´Ÿàµº à´’à´°àµà´µà´Ÿàµà´Ÿà´‚ കൂടി അമർതàµà´¤à´¿à´¯à´¾àµ½ വിഷയം/തലകàµà´•àµ†à´Ÿàµà´Ÿàµ ഇലàµà´²à´¾à´¤àµ† തനàµà´¨àµ† കാതàµà´¤àµà´¸àµ‚à´•àµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´µàµà´‚.",
'summary-preview' => 'à´šàµà´°àµà´•àµà´•à´°àµ‚പം à´Žà´™àµà´™à´¨àµ†à´¯àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ കാണàµà´•:',
'subject-preview' => 'വിഷയം/തലകàµà´•àµ†à´Ÿàµà´Ÿàµ à´Žà´™àµà´™à´¨àµ†à´¯àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ കാണàµà´•:',
'blockedtitle' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† തടഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
@@ -823,7 +852,7 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
* തടയലിനàµà´±àµ† കാലാവധി: $6
* തടയപàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോകàµà´¤à´¾à´µàµ: $7
-à´ˆ തടയലിനെ പറàµà´±à´¿ ചർചàµà´š ചെയàµà´¯à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ $1 നേയോ മറàµà´±àµ [[{{MediaWiki:Grouppage-sysop}}|കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´°àµ†à´¯àµ‹]] സമീപികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ. [[Special:Preferences|താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] താങàµà´•àµ¾ സാധàµà´µà´¾à´¯ ഇമെയിൽ വിലാസം കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½, അതൠഅയകàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ താങàµà´•àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½, 'ഇദàµà´¦àµ‡à´¹à´¤àµà´¤à´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµ‚' à´Žà´¨àµà´¨ സം‌വിധാനം ഉപയോഗിചàµà´šàµ താങàµà´•àµ¾à´•àµà´•àµ മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•à´³àµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´¾à´‚. താങàµà´•à´³àµà´Ÿàµ† നിലവിലàµà´³àµà´³ à´.പി. വിലാസം $3 ഉം, താങàµà´•à´³àµà´Ÿàµ† തടയൽ à´.à´¡à´¿. #$5 ഉം ആണàµ. ഇവ à´°à´£àµà´Ÿàµà´‚ താങàµà´•àµ¾ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¨àµ† ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´®àµà´ªàµ‹àµ¾ ചേർകàµà´•àµà´•.",
+à´ˆ തടയലിനെ പറàµà´±à´¿ ചർചàµà´š ചെയàµà´¯à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ $1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ‡à´¯àµ‹ മറàµà´±àµ [[{{MediaWiki:Grouppage-sysop}}|കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´°àµ†à´¯àµ‹]] സമീപികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ. [[Special:Preferences|താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] താങàµà´•àµ¾ സാധàµà´µà´¾à´¯ ഇമെയിൽ വിലാസം കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½, അതൠഅയകàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ താങàµà´•àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½, 'ഇദàµà´¦àµ‡à´¹à´¤àµà´¤à´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµ‚' à´Žà´¨àµà´¨ സം‌വിധാനം ഉപയോഗിചàµà´šàµ താങàµà´•àµ¾à´•àµà´•àµ മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•à´³àµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´¾à´‚. താങàµà´•à´³àµà´Ÿàµ† നിലവിലàµà´³àµà´³ à´.പി. വിലാസം $3 ഉം, താങàµà´•à´³àµà´Ÿàµ† തടയൽ à´.à´¡à´¿. #$5 ഉം ആണàµ. ഇവ à´°à´£àµà´Ÿàµà´‚ താങàµà´•àµ¾ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¨àµ† ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´®àµà´ªàµ‹àµ¾ ചേർകàµà´•àµà´•.",
'autoblockedtext' => 'താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം à´¸àµà´µà´¯à´‚ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µàµ ഉപയോഗിചàµà´š കാരണതàµà´¤à´¾àµ½ $1 à´Žà´¨àµà´¨ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¨à´¾à´£àµ തടഞàµà´žàµà´µàµ†à´šàµà´šà´¤àµ.
ഇതിനൠകാരണമായി നൽകിയിടàµà´Ÿàµà´³àµà´³à´¤àµ:
@@ -886,7 +915,11 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
'usercsspreview' => "'''താങàµà´•àµ¾ താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´¨àµà´¤à´‚ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´ªàµà´°à´¿à´µàµà´¯àµ‚ ചെയàµà´¯àµà´• മാതàµà´°à´®àµ‡ ചെയàµà´¯àµà´¨àµà´¨àµà´³àµà´³àµ‚ à´Žà´¨àµà´¨ കാരàµà´¯à´‚ ഓർമàµà´®à´¿à´•àµà´•àµà´•.'''
'''ഇതൠസേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²!'''",
'userjspreview' => "'''താങàµà´•àµ¾ താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´¨àµà´¤à´‚ ജാവസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ à´ªàµà´°à´¿à´µàµà´¯àµ‚ ചെയàµà´¯àµà´• മാതàµà´°à´®àµ‡ ചെയàµà´¯àµà´¨àµà´¨àµà´³àµà´³àµ‚ à´Žà´¨àµà´¨ കാരàµà´¯à´‚ ഓർമàµà´®à´¿à´•àµà´•àµà´•. ഇതൠസേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²!'''",
-'userinvalidcssjstitle' => "'''à´®àµà´¨àµà´¨à´±à´¿à´ªàµà´ªàµ:''' \"\$1\" à´Žà´¨àµà´¨ പേരിൽ ഒരൠസàµà´•à´¿àµ» ഇലàµà´². '''.css''' ഉം '''.js''' ഉം താളàµà´•àµ¾ ഇംഗàµà´²àµ€à´·àµ ചെറിയകàµà´·à´° തലകàµà´•àµ†à´Ÿàµà´Ÿàµ ആണàµâ€Œ ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤àµ†à´¨àµà´¨àµ ദയവായി ഓർകàµà´•àµà´•. ഉദാ: {{ns:user}}:Foo/Monobook.css à´Žà´¨àµà´¨à´¤à´¿à´¨àµ പകരം {{ns:user}}:Foo/monobook.css à´Žà´¨àµà´¨à´¾à´£àµ ഉപയോഗികàµà´•àµ‡à´£àµà´Ÿà´¤àµ.",
+'sitecsspreview' => "'''താങàµà´•àµ¾ à´ˆ സി.à´Žà´¸àµ.à´Žà´¸àµ.à´¨àµà´±àµ† à´ªàµà´°à´¿à´µàµà´¯àµ‚ കാണàµà´• മാതàµà´°à´®àµ‡ ചെയàµà´¯àµà´¨àµà´¨àµà´³àµà´³àµ‚ à´Žà´¨àµà´¨ കാരàµà´¯à´‚ ഓർമàµà´®à´¿à´•àµà´•àµà´•.'''
+'''ഇതൠസേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²!'''",
+'sitejspreview' => "'''താങàµà´•àµ¾ à´ˆ ജാവസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ കോഡിനàµà´±àµ† à´ªàµà´°à´¿à´µàµà´¯àµ‚ കാണàµà´• മാതàµà´°à´®àµ‡ ചെയàµà´¯àµà´¨àµà´¨àµà´³àµà´³àµ‚ à´Žà´¨àµà´¨ കാരàµà´¯à´‚ ഓർമàµà´®à´¿à´•àµà´•àµà´•.'''
+'''ഇതൠസേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²!'''",
+'userinvalidcssjstitle' => "'''à´®àµà´¨àµà´¨à´±à´¿à´ªàµà´ªàµ:''' \"\$1\" à´Žà´¨àµà´¨ പേരിൽ ഒരൠദൃശàµà´¯à´°àµ‚പം ഇലàµà´². '''.css''' ഉം '''.js''' ഉം താളàµà´•àµ¾ ഇംഗàµà´²àµ€à´·àµ ചെറിയകàµà´·à´° തലകàµà´•àµ†à´Ÿàµà´Ÿàµ ആണàµâ€Œ ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤àµ†à´¨àµà´¨àµ ദയവായി ഓർകàµà´•àµà´•. ഉദാ: {{ns:user}}:Foo/Vector.css à´Žà´¨àµà´¨à´¤à´¿à´¨àµ പകരം {{ns:user}}:Foo/vector.css à´Žà´¨àµà´¨à´¾à´£àµ ഉപയോഗികàµà´•àµ‡à´£àµà´Ÿà´¤àµ.",
'updated' => '(à´ªàµà´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ)',
'note' => "'''à´ªàµà´°à´¤àµà´¯àµ‡à´• à´¶àµà´°à´¦àµà´§à´¯àµà´•àµà´•àµ:'''",
'previewnote' => "'''ഇതൊരൠപàµà´°à´¿à´µàµà´¯àµ‚ മാതàµà´°à´®à´¾à´£àµ, താങàµà´•àµ¾ നടതàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ സേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²!'''",
@@ -912,7 +945,7 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
താങàµà´•à´³àµà´Ÿàµ† മാറàµà´±à´™àµà´™àµ¾ à´®àµà´•à´³à´¿à´²àµ† ടെകàµà´¸àµà´±àµà´±àµ à´à´°à´¿à´¯à´¯à´¿à´²àµ‡à´•àµà´•àµ സം‌യോജിപàµà´ªà´¿à´•àµà´•àµà´•.
താങàµà´•àµ¾ '''സേവൠചെയàµà´¯àµà´•''' à´Žà´¨àµà´¨ ബടàµà´Ÿàµº അമർതàµà´¤àµà´®àµà´ªàµ‹àµ¾ '''à´®àµà´•à´³à´¿à´²àµ† ടെകàµà´¸àµà´±àµà´±àµ à´à´°à´¿à´¯à´¯à´¿à´²àµà´³àµà´³ à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ മാതàµà´°à´®àµ‡''' സേവൠആവàµà´•à´¯àµà´³àµà´³àµ‚.",
'yourtext' => 'താങàµà´•àµ¾ à´Žà´´àµà´¤à´¿ ചേർതàµà´¤à´¤àµ',
-'storedversion' => 'സംഭരികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ പതിപàµà´ªàµ',
+'storedversion' => 'à´®àµà´®àµà´ªàµ‡à´¯àµà´³àµà´³ നാൾപതിപàµà´ªàµ',
'nonunicodebrowser' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: താങàµà´•à´³àµà´Ÿàµ† à´¬àµà´°àµ—സർ യൂണീകോഡിനൠസജàµà´œà´®à´²àµà´². താളàµà´•àµ¾ à´¸àµà´°à´•àµà´·à´¿à´¤à´®à´¾à´¯à´¿ തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ സൗകരàµà´¯à´‚ à´’à´°àµà´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ: ASCII à´…à´²àµà´²à´¾à´¤àµà´¤ à´…à´•àµà´·à´°à´™àµà´™àµ¾ ഹെകàµà´¸à´¾à´¡àµ†à´¸à´¿à´®àµ½ കോഡായി തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ പെടàµà´Ÿà´¿à´¯à´¿àµ½ à´ªàµà´°à´¤àµà´¯à´•àµà´·à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¤à´¾à´£àµ.'''",
'editingold' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: താങàµà´•àµ¾ à´ˆ താളിനàµà´±àµ† ഒരൠപഴയ പതിപàµà´ªà´¾à´£àµâ€Œ തിരàµà´¤àµà´¤àµà´¨àµà´¨à´¤àµ. ഇപàµà´ªàµ‹àµ¾ താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ സേവൠചെയàµà´¤à´¾àµ½ à´ˆ പതിപàµà´ªà´¿à´¨àµ ശേഷം വനàµà´¨ മാറàµà´±à´™àµà´™à´³àµ†à´²àµà´²à´¾à´‚ നഷàµà´Ÿà´®à´¾à´•àµà´‚.'''",
'yourdiff' => 'à´µàµà´¯à´¤àµà´¯à´¾à´¸à´™àµà´™àµ¾',
@@ -924,9 +957,6 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
'copyrightwarning2' => "{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ താങàµà´•àµ¾ à´Žà´´àµà´¤à´¿ ചേർകàµà´•àµà´¨àµà´¨à´¤àµ†à´²àµà´²à´¾à´‚ മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•à´¯àµ‹, മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•à´¯àµ‹, ഒഴിവാകàµà´•àµà´•à´¯àµ‹ ചെയàµà´¤àµ‡à´•àµà´•à´¾à´‚. താങàµà´•àµ¾ à´Žà´´àµà´¤à´¿ ചേർകàµà´•àµà´¨àµà´¨à´¤àµ മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ തിരàµà´¤àµà´¤àµà´¨àµà´¨à´¤à´¿à´²àµ‹ ഒഴിവാകàµà´•àµà´¨àµà´¨à´¤à´¿à´²àµ‹ താങàµà´•àµ¾à´•àµà´•àµ എതിർപàµà´ªàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ ദയവായി ലേഖനമെഴàµà´¤à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•.
ഇതൠതാങàµà´•àµ¾à´¤àµà´¤à´¨àµà´¨àµ† à´Žà´´àµà´¤à´¿à´¯à´¤à´¾à´£àµ†à´¨àµà´¨àµà´‚, അതലàµà´²àµ†à´™àµà´•à´¿àµ½ പകർപàµà´ªà´µà´•à´¾à´¶ നിയമങàµà´™à´³àµà´Ÿàµ† പരിധിയിലിലàµà´²à´¾à´¤àµà´¤ ഉറവിടങàµà´™à´³à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´‚ പകർതàµà´¤à´¿à´¯à´¤à´¾à´£àµ†à´¨àµà´¨àµà´‚ ഉറപàµà´ªà´¾à´•àµà´•àµà´• (à´•àµà´Ÿàµà´¤àµ½ വിവരതàµà´¤à´¿à´¨àµ $1 കാണàµà´•).
'''പകർപàµà´ªà´µà´•à´¾à´¶ സംരകàµà´·à´£à´®àµà´³àµà´³ സൃഷàµà´Ÿà´¿à´•àµ¾ ഒരൠകാരണവശാലàµà´‚ ഇവിടെ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´•àµà´•à´°àµà´¤àµ!'''",
-'longpagewarning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:''' à´ˆ താളിനൠ$1 കിലോബൈറàµà´±àµà´¸àµ നീളമàµà´£àµà´Ÿàµ;
-à´šà´¿à´² à´¬àµà´°àµ—സറàµà´•à´³à´¿àµ½ 32 കിലോബൈറàµà´±àµà´¸à´¿àµ½ കൂടിയ വലിയ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´®àµà´ªàµ‹àµ¾ à´ªàµà´°à´¶àµà´¨à´®àµà´£àµà´Ÿà´¾à´•à´¾à´±àµà´£àµà´Ÿàµ.
-താളàµà´•à´³àµà´Ÿàµ† ഉപവിഭാഗങàµà´™àµ¾ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤àµ തിരàµà´¤àµà´¤àµà´¨àµà´¨à´¤àµ പരിഗണികàµà´•àµà´•.",
'longpageerror' => "'''പിഴവàµ: താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´Žà´´àµà´¤àµà´¤àµà´•àµ¾à´•àµà´•àµ $1 കിലോബൈറàµà´±àµà´¸àµ വലിപàµà´ªà´®àµà´£àµà´Ÿàµ. പരമാവധി à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´¾à´¯ വലിപàµà´ªà´‚ $2 കിലോബൈറàµà´±àµà´¸àµ ആണàµâ€Œ. അതിനാലിതൠസേവൠചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².'''",
'readonlywarning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ പരിപാലനതàµà´¤à´¿à´¨àµ വേണàµà´Ÿà´¿ ബനàµà´§à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ താങàµà´•à´³à´¿à´ªàµà´ªàµ‹àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ സേവൠചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².''' താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ ഒരൠടെകàµà´¸àµà´±àµà´±àµ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´²àµ‡à´•àµà´•àµ പകർതàµà´¤à´¿ (à´•à´Ÿàµà´Ÿàµ & പേസàµà´±àµà´±àµ) പിനàµà´¨àµ€à´Ÿàµà´³àµà´³ ഉപയോഗതàµà´¤à´¿à´¨à´¾à´¯à´¿ സേവൠചെയàµà´¯àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ. ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ ബനàµà´§à´¿à´šàµà´š à´…à´¡àµà´®à´¿à´¨à´¿à´¸àµà´Ÿàµà´°àµ‡à´±àµà´±àµ¼ നൽകിയ വിശദീകരണം: $1",
'protectedpagewarning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: à´ˆ താൾ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• പദവിയàµà´³àµà´³à´µàµ¼à´•àµà´•àµ മാതàµà´°à´‚ തിരàµà´¤àµà´¤à´¾àµ» സാധികàµà´•à´¾à´µàµà´¨àµà´¨ തരതàµà´¤à´¿àµ½ സം‌രകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.''' അവലംബമായി രേഖകളിൽ ലഭàµà´¯à´®à´¾à´¯ à´à´±àµà´±à´µàµà´‚ à´ªàµà´¤à´¿à´¯ വിവരം താഴെ നൽകിയിരികàµà´•àµà´¨àµà´¨àµ:",
@@ -981,7 +1011,7 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
# "Undo" feature
'undo-success' => 'à´ˆ തിരàµà´¤àµà´¤àµ½ താങàµà´•àµ¾à´•àµà´•àµ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ. താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ താരതമàµà´¯à´‚ à´’à´¨àµà´¨àµà´•àµ‚à´Ÿà´¿ പരിശോധിചàµà´šàµ à´ˆ à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ ചെയàµà´¯à´£àµ‹ à´Žà´¨àµà´¨àµ à´’à´¨àµà´¨àµà´•àµ‚à´Ÿà´¿ ഉറപàµà´ªà´¾à´•àµà´•àµà´•. ഉറപàµà´ªà´¾à´£àµ†à´™àµà´•à´¿àµ½ തിരàµà´¤àµà´¤àµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´µà´¾àµ» താൾ സേവൠചെയàµà´¯àµà´•.',
-'undo-failure' => 'ഇടയàµà´•àµà´•àµà´³àµà´³ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ കോൺഫàµà´²à´¿à´±àµà´±àµ കാരണം à´ˆ തിരàµà´¤àµà´¤àµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´µà´¾àµ» പറàµà´±à´¿à´²àµà´².',
+'undo-failure' => 'ഇടയàµà´•àµà´•àµà´³àµà´³ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ തമàµà´®à´¿àµ½ സമരസപàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤à´¤àµ കാരണം à´ˆ തിരàµà´¤àµà´¤àµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´µà´¾à´¨à´¾à´µà´¿à´²àµà´².',
'undo-norev' => 'à´ˆ തിരàµà´¤àµà´¤àµ½ നിലവിലിലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾à´²àµ‹ മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¿à´¨à´¾à´²àµ‹ പൂർവസàµà´¥à´¿à´¤à´¿à´¯à´¿à´²à´¾à´•àµà´•àµà´µà´¾àµ» സാധികàµà´•àµà´•à´¯à´¿à´²àµà´².',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ചെയàµà´¤ $1 à´Žà´¨àµà´¨ തിരàµà´¤àµà´¤àµ½ നീകàµà´•à´‚ ചെയàµà´¯àµà´¨àµà´¨àµ',
@@ -1100,6 +1130,8 @@ $1",
'logdelete-failure' => "'''രേഖയàµà´Ÿàµ† ദൃശàµà´¯à´¤ നിശàµà´šà´¿à´¤à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²:'''
$1",
'revdel-restore' => 'കാണàµà´¨àµà´¨ രൂപതàµà´¤à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•',
+'revdel-restore-deleted' => 'മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾',
+'revdel-restore-visible' => 'ദൃശàµà´¯à´®à´¾à´¯ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾',
'pagehist' => 'താളിനàµà´±àµ† നാൾവഴി',
'deletedhist' => 'ഒഴിവാകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ നാൾവഴി',
'revdelete-content' => 'ഉളàµà´³à´Ÿà´•àµà´•à´‚',
@@ -1107,7 +1139,7 @@ $1",
'revdelete-uname' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚',
'revdelete-restricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'revdelete-unrestricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ നീകàµà´•à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'revdelete-hid' => '$1 à´…à´ªàµà´°à´¤àµà´¯à´•àµà´·à´®à´¾à´•àµà´•à´¿',
+'revdelete-hid' => '$1 മറചàµà´šàµ',
'revdelete-unhid' => '$1 à´ªàµà´°à´¤àµà´¯à´•àµà´·à´®à´¾à´•àµà´•à´¿',
'revdelete-log-message' => '{{PLURAL:$2|ഒരൠനാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$2 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} $1',
'logdelete-log-message' => '{{PLURAL:$2|സാഹചരàµà´¯à´™àµà´™à´³à´¿àµ½|$2 സാഹചരàµà´¯à´™àµà´™à´³à´¿àµ½}} $1',
@@ -1168,11 +1200,13 @@ $1",
# Diffs
'history-title' => '"$1" à´Žà´¨àµà´¨ താളിനàµà´±àµ† നാൾവഴി',
'difference' => '(തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚)',
+'difference-multipage' => '(താളàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚)',
'lineno' => 'വരി $1:',
'compareselectedversions' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ കാണàµà´•',
'showhideselectedversions' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ മാറàµà´±à´™àµà´™àµ¾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•/മറയàµà´•àµà´•àµà´•',
'editundo' => 'മാറàµà´±à´‚ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´•',
-'diff-multi' => '(ഇടകàµà´•àµà´³àµà´³ {{PLURAL:$1|ഒരൠപതിപàµà´ªà´¿à´²àµ† മാറàµà´±à´‚|$1 പതിപàµà´ªàµà´•à´³à´¿à´²àµ† മാറàµà´±à´™àµà´™àµ¾}} ഇവിടെ കാണികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².)',
+'diff-multi' => '(ഇടയàµà´•àµà´•àµ {{PLURAL:$2|ഒരൠഉപയോകàµà´¤à´¾à´µàµ|$2 ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾}} ചെയàµà´¤ {{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}} à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².)',
+'diff-multi-manyusers' => '(ഇടയàµà´•àµà´•àµ {{PLURAL:$2|à´’à´¨àµà´¨à´¿à´²à´§à´¿à´•à´‚|$2 à´Žà´£àµà´£à´¤àµà´¤à´¿à´²à´§à´¿à´•à´‚}} ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ {{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}} à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².)',
# Search results
'searchresults' => 'തിരചàµà´šà´¿à´²à´¿à´¨àµà´±àµ† ഫലം',
@@ -1207,6 +1241,7 @@ $1",
'searchprofile-everything-tooltip' => 'à´Žà´²àµà´²à´¾ ഉളàµà´³à´Ÿà´•àµà´•à´µàµà´‚ തിരയàµà´• (സംവാദതàµà´¤à´¾à´³àµà´•àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµ†)',
'searchprofile-advanced-tooltip' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ നാമമേഖലകളിൽ തിരചàµà´šà´¿àµ½ നടതàµà´¤àµà´µà´¾àµ»',
'search-result-size' => '$1 ({{PLURAL:$2|ഒരൠവാകàµà´•àµ|$2 വാകàµà´•àµà´•àµ¾}})',
+'search-result-category-size' => '{{PLURAL:$1|ഒരൠഅംഗം|$1 à´…à´‚à´—à´™àµà´™àµ¾}} ({{PLURAL:$2|ഒരൠഉപവർഗàµà´—à´‚|$2 ഉപവർഗàµà´—à´™àµà´™àµ¾}}, {{PLURAL:$3|ഒരൠപàµà´°à´®à´¾à´£à´‚|$3 à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾}})',
'search-result-score' => 'സാംഗതàµà´¯à´‚: $1%',
'search-redirect' => '(തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താൾ $1)',
'search-section' => '(വിഭാഗം $1)',
@@ -1227,7 +1262,7 @@ $1",
'nonefound' => "'''à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•''': à´šà´¿à´² നാമമേഖലകൾ മാതàµà´°à´®àµ‡ à´¸àµà´µà´¤àµ‡ തിരയാറàµà´³àµà´³àµ‚. à´Žà´²àµà´²à´¾ വിവരങàµà´™à´³à´¿à´²àµà´‚ തിരയാൻ '''തിരയേണàµà´Ÿ നാമമേഖലകൾ''' ''à´Žà´²àµà´²à´¾à´‚'' à´Žà´¨àµà´¨à´¤àµ‹ ആവശàµà´¯à´®à´¾à´¯ നാമമേഖലമാതàµà´°à´‚ തിരയàµà´µà´¾àµ» (സംവാദം, ഫലകം, à´¤àµà´Ÿà´™àµà´™à´¿à´¯à´µ) അതൠമാതàµà´°à´®à´¾à´¯àµ‹ à´Ÿà´¿à´•àµà´•àµ ചെയàµà´¯àµ‡à´£àµà´Ÿà´¤à´¾à´£àµ.",
'search-nonefound' => 'താങàµà´•àµ¾ തിരഞàµà´ž പദതàµà´¤à´¿à´¨àµ യോജിചàµà´š ഫലങàµà´™à´³àµŠà´¨àµà´¨àµà´‚ ലഭിചàµà´šà´¿à´²àµà´².',
'powersearch' => 'തിരയൂ',
-'powersearch-legend' => 'വികസിതമായ തിരചàµà´šà´¿àµ½',
+'powersearch-legend' => 'വിപàµà´²àµ€à´•àµƒà´¤ തിരചàµà´šà´¿àµ½',
'powersearch-ns' => 'തിരയേണàµà´Ÿ നാമമേഖലകൾ',
'powersearch-redir' => 'തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾ കാണികàµà´•àµà´•',
'powersearch-field' => 'ഇതിനൠവേണàµà´Ÿà´¿ തിരയàµà´•',
@@ -1258,7 +1293,7 @@ $1",
'datedefault' => 'à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ വേണàµà´Ÿ',
'prefs-datetime' => 'ദിവസവàµà´‚ സമയവàµà´‚',
'prefs-personal' => 'അഹം',
-'prefs-rc' => 'à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾',
+'prefs-rc' => 'സമീപകാല മാറàµà´±à´™àµà´™àµ¾',
'prefs-watchlist' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µ',
'prefs-watchlist-days' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµ‡à´£àµà´Ÿ പരമാവധി ദിവസങàµà´™àµ¾:',
'prefs-watchlist-days-max' => 'പരമാവധി 7 ദിവസം',
@@ -1281,6 +1316,7 @@ $1",
'contextlines' => 'ഓരോ സനàµà´¦àµ¼à´¶à´¨à´¤àµà´¤à´¿à´²àµà´‚ ചേർകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ വരികൾ:',
'contextchars' => 'ഓരോ വരിയàµà´Ÿàµ‡à´¯àµà´‚ à´ªàµà´°à´¸à´•àµà´¤à´¿:',
'stub-threshold' => '<a href="#" class="stub">അപൂർണàµà´£à´®à´¾à´¯ à´•à´£àµà´£à´¿à´¯àµ†à´¨àµà´¨àµ</a> à´¸àµà´¥à´¾à´ªà´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ à´¤àµà´µà´°à´•à´‚ (ബൈറàµà´±àµà´•àµ¾):',
+'stub-threshold-disabled' => 'നിർജàµà´œàµ€à´µà´®à´¾à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'recentchangesdays' => 'à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™à´³à´¿àµ½ കാണികàµà´•àµ‡à´£àµà´Ÿ ദിവസങàµà´™à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚:',
'recentchangesdays-max' => 'പരമാവധി {{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസങàµà´™àµ¾}}',
'recentchangescount' => 'à´¸àµà´µà´¤àµ‡ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµ‡à´£àµà´Ÿ തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚:',
@@ -1314,6 +1350,7 @@ $1",
'prefs-files' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾',
'prefs-custom-css' => 'à´¸àµà´µà´¨àµà´¤à´‚ സി.à´Žà´¸àµ.à´Žà´¸àµ.',
'prefs-custom-js' => 'à´¸àµà´µà´¨àµà´¤à´‚ ജെ.à´Žà´¸àµ.',
+'prefs-common-css-js' => 'à´Žà´²àµà´²à´¾ ദൃശàµà´¯à´°àµ‚പങàµà´™àµ¾à´•àµà´•àµà´®à´¾à´¯à´¿ പങàµà´•àµ വെയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ സി.à´Žà´¸àµ.à´Žà´¸àµ./ജെ.à´Žà´¸àµ.:',
'prefs-reset-intro' => 'സൈറàµà´±à´¿àµ½ à´¸àµà´µà´¤àµ‡à´¯àµà´£àµà´Ÿà´¾à´µàµ‡à´£àµà´Ÿ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താൾ ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.
ഇതൠതിരിചàµà´šàµ ചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².',
'prefs-emailconfirm-label' => 'ഇമെയിൽ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚:',
@@ -1352,9 +1389,15 @@ $1",
'prefs-advancedrendering' => 'വിപàµà´²à´®à´¾à´¯ ഉപാധികൾ',
'prefs-advancedsearchoptions' => 'വിപàµà´²à´®à´¾à´¯ ഉപാധികൾ',
'prefs-advancedwatchlist' => 'വിപàµà´²à´®à´¾à´¯ ഉപാധികൾ',
-'prefs-display' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
+'prefs-displayrc' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
+'prefs-displaysearchoptions' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
+'prefs-displaywatchlist' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
'prefs-diffs' => 'à´µàµà´¯à´¤àµà´¯à´¾à´¸à´™àµà´™àµ¾',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'സാധàµà´¤à´¯àµà´³àµà´³à´¤àµ†à´¨àµà´¨àµ തോനàµà´¨àµà´¨àµà´¨àµ',
+'email-address-validity-invalid' => 'സാധàµà´¤à´¯àµà´³àµà´³ വിലാസം ആവശàµà´¯à´®à´¾à´£àµ!',
+
# User rights
'userrights' => 'ഉപയോകàµà´¤àµƒ അവകാശ പരിപാലനം',
'userrights-lookup-user' => 'ഉപയോകàµà´¤àµƒà´¸à´‚ഘങàµà´™à´³àµ† പരിപാലികàµà´•àµà´•',
@@ -1368,7 +1411,7 @@ $1",
'userrights-groups-help' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿàµà´³àµà´³ സംഘങàµà´™àµ¾ താങàµà´•àµ¾à´•àµà´•àµ മാറàµà´±à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ:
*ഉപയോകàµà´¤à´¾à´µàµ à´† സംഘതàµà´¤à´¿à´²àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ ശരിയിടàµà´Ÿ à´šà´¤àµà´°à´‚ അർതàµà´¥à´®à´¾à´•àµà´•àµà´¨àµà´¨àµ.
*ഉപയോകàµà´¤à´¾à´µàµ à´† സംഘതàµà´¤à´¿à´²à´¿à´²àµà´²àµ†à´¨àµà´¨àµ ശരിയിടാതàµà´¤ à´šà´¤àµà´°à´‚ അർതàµà´¥à´®à´¾à´•àµà´•àµà´¨àµà´¨àµ.
-*ഒരൠ* à´’à´°à´¿à´•àµà´•àµ½ സംഘം കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´¤àµà´¤à´¾àµ» പിനàµà´¨àµ€à´Ÿàµ അതൠനീകàµà´•à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´²à´¨àµà´¨àµ‹, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ തിരിചàµà´šàµ‹ അർതàµà´¥à´®à´¾à´•àµà´•àµà´¨àµà´¨àµ.',
+*സംഘങàµà´™à´³àµ‹à´ŸàµŠà´ªàµà´ªà´®àµà´³àµà´³ *, à´’à´°à´¿à´•àµà´•àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¿à´¯à´¾àµ½ പിനàµà´¨àµ€à´Ÿàµ അതിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´²àµ†à´¨àµà´¨àµ അർതàµà´¥à´®à´¾à´•àµà´•àµà´¨àµà´¨àµ.',
'userrights-reason' => 'കാരണം:',
'userrights-no-interwiki' => 'മറàµà´±àµ വികàµà´•à´¿à´•à´³à´¿à´²àµ† ഉപയോകàµà´¤àµƒ അവകാശങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ à´…à´¨àµà´®à´¤à´¿à´¯à´¿à´²àµà´².',
'userrights-nodatabase' => '$1 à´Žà´¨àµà´¨ ഡാറàµà´±à´¾à´¬àµ‡à´¸àµ നിലവിലിലàµà´² à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´²àµà´².',
@@ -1382,7 +1425,7 @@ $1",
'group-user' => 'ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾',
'group-autoconfirmed' => 'യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾',
'group-bot' => 'യനàµà´¤àµà´°à´™àµà´™àµ¾',
-'group-sysop' => 'സിസോപàµà´ªàµà´•àµ¾',
+'group-sysop' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼',
'group-bureaucrat' => 'à´¬àµà´¯àµ‚റോകàµà´°à´¾à´±àµà´±àµà´•àµ¾',
'group-suppress' => 'മേൽനോടàµà´Ÿà´™àµà´™àµ¾',
'group-all' => '(à´Žà´²àµà´²à´¾à´‚)',
@@ -1417,7 +1460,7 @@ $1",
'right-upload' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•',
'right-reupload' => 'നിലവിലàµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† à´®àµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•',
'right-reupload-own' => 'à´¸àµà´µà´¯à´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾à´•àµà´•àµ à´®àµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•',
-'right-reupload-shared' => 'പങàµà´•àµ വെയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ മീഡിയ ശേഖരിണിയെ à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¯à´¿ അതിലംഘികàµà´•àµà´•',
+'right-reupload-shared' => 'പങàµà´•àµ വെയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ മീഡിയ സംഭരണിയെ à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¯à´¿ അതിലംഘികàµà´•àµà´•',
'right-upload_by_url' => 'à´¯àµ.ആർ.à´Žà´²àµà´²à´¿àµ½ നിനàµà´¨àµà´‚ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•',
'right-purge' => 'à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ à´’à´¨àµà´¨àµà´‚ ഇലàµà´²à´¾à´¤àµ† സൈറàµà´±à´¿à´¨àµà´±àµ† കാഷെ ഒരൠതാളിനായി പർജൠചെയàµà´¯àµà´•',
'right-autoconfirmed' => 'അർദàµà´§à´¸à´‚à´°à´•àµà´·à´¿à´¤ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•',
@@ -1439,6 +1482,7 @@ $1",
'right-hideuser' => 'ഒരൠഉപയോകàµà´¤àµƒà´¨à´¾à´®à´¤àµà´¤àµ† തടയàµà´•, പരസàµà´¯à´®à´¾à´¯à´¿ കാണപàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ മറയàµà´•àµà´•àµà´¨àµà´¨àµ',
'right-ipblock-exempt' => 'à´.പി. തടയലàµà´•àµ¾, à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ തടയലàµà´•àµ¾, റേഞàµà´šàµ തടയലàµà´•àµ¾ à´’à´•àµà´•àµ† ബാധകമലàµà´²à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•',
'right-proxyunbannable' => 'à´ªàµà´°àµ‹à´•àµà´¸à´¿à´•à´³àµ† à´¸àµà´µà´¤àµ‡ തടയàµà´¨àµà´¨à´¤àµ ബാധകമലàµà´²à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•',
+'right-unblockself' => 'തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´µàµ¼ à´¸àµà´µà´¯à´‚ തടയൽ നീകàµà´•àµà´•',
'right-protect' => 'സംരകàµà´·à´£ മാനതàµà´¤à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•, സംരകàµà´·à´¿à´¤ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•',
'right-editprotected' => 'സംരകàµà´·à´¿à´¤ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´• (നിർà´à´°à´¿à´¤ സംരകàµà´·à´£à´‚ à´…à´²àµà´²à´¾à´¤àµà´¤à´¤àµ)',
'right-editinterface' => 'ഉപയോകàµà´¤àµƒ സമàµà´ªàµ¼à´•àµà´•à´®àµà´–à´¤àµà´¤à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•',
@@ -1461,7 +1505,6 @@ $1",
'right-siteadmin' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´¤àµà´±à´•àµà´•àµà´•, പൂടàµà´Ÿàµà´•',
'right-reset-passwords' => 'മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ റീസെറàµà´±àµ ചെയàµà´¯àµà´•',
'right-override-export-depth' => 'à´•à´£àµà´£à´¿à´µà´¤àµà´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•à´³àµà´Ÿàµ† ആഴം 5 വരെയàµà´³àµà´³ താളàµà´•àµ¾ കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•',
-'right-versiondetail' => 'സോഫàµà´±àµà´±àµâ€Œâ€Œà´µàµ†à´¯àµ¼ പതിപàµà´ªàµ വിവരങàµà´™àµ¾ വിശദമായി കാടàµà´Ÿàµà´•',
'right-sendemail' => 'മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ അയയàµà´•àµà´•àµà´•',
# User rights log
@@ -1512,14 +1555,9 @@ $1",
'recentchanges-legend' => 'സമീപകാല മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´‚',
'recentchangestext' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† à´à´±àµà´±à´µàµà´‚ à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ ഇവിടെ കാണാം.',
'recentchanges-feed-description' => 'à´ˆ ഫീഡൠഉപയോഗിചàµà´šàµ വികàµà´•à´¿à´¯à´¿à´²àµ† à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ നിരീകàµà´·à´¿à´•àµà´•àµà´•.',
-'recentchanges-label-legend' => 'സൂചന: $1.',
-'recentchanges-legend-newpage' => '$1 - à´ªàµà´¤à´¿à´¯ താൾ',
'recentchanges-label-newpage' => 'ഒരൠപàµà´¤à´¿à´¯ താൾ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'recentchanges-legend-minor' => '$1 - ചെറിയ തിരàµà´¤àµà´¤àµ',
-'recentchanges-label-minor' => 'ഇതൊരൠചെറിയ തിരàµà´¤àµà´¤à´²à´¾à´£àµ',
-'recentchanges-legend-bot' => '$1 - യനàµà´¤àµà´°à´‚ ഉപയോഗിചàµà´šàµà´³àµà´³ തിരàµà´¤àµà´¤àµ',
-'recentchanges-label-bot' => 'ഒരൠയനàµà´¤àµà´°à´‚ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´¾à´£à´¿à´¤àµ',
-'recentchanges-legend-unpatrolled' => '$1 - റോനàµà´¤àµà´šàµà´±àµà´±à´ªàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤ തിരàµà´¤àµà´¤àµ',
+'recentchanges-label-minor' => 'ഇതൊരൠചെറിയ തിരàµà´¤àµà´¤à´¾à´£àµ',
+'recentchanges-label-bot' => 'ഇതൊരൠയനàµà´¤àµà´°à´‚ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´¾à´£àµ',
'recentchanges-label-unpatrolled' => 'ഇതàµà´µà´°àµ† റോനàµà´¤àµ à´šàµà´±àµà´±à´ªàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤ ഒരൠതിരàµà´¤àµà´¤à´¾à´£à´¿à´¤àµ',
'rcnote' => "à´•à´´à´¿à´žàµà´ž {{PLURAL:$2|ദിവസം|'''$2''' ദിവസങàµà´™àµ¾à´•àµà´•àµà´³àµà´³à´¿àµ½}} സംഭവിചàµà´š, {{PLURAL:$1|'''1''' തിരàµà´¤àµà´¤àµ½|'''$1''' തിരàµà´¤àµà´¤à´²àµà´•àµ¾}} താഴെകàµà´•à´¾à´£à´¾à´‚. ശേഖരിചàµà´š സമയം: $4, $5.",
'rcnotefrom' => '<b>$2</b> à´®àµà´¤à´²àµà´³àµà´³ മാറàµà´±à´™àµà´™àµ¾ (<b>$1</b> à´Žà´£àµà´£à´‚ വരെ കാണാം).',
@@ -1565,6 +1603,9 @@ $1",
'upload_directory_missing' => 'à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ ഡയറകàµà´Ÿà´±à´¿ ($1) ലഭàµà´¯à´®à´²àµà´², അതൠസൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» വെബàµâ€Œâ€Œà´¸àµ†àµ¼à´µà´±à´¿à´¨àµ സാധികàµà´•à´¿à´²àµà´².',
'upload_directory_read_only' => 'വെബൠസെർവറിനൠഅപàµâ€Œà´²àµ‹à´¡àµ ഡയറകàµà´Ÿà´±à´¿à´¯à´¿à´²àµ‡à´•àµà´•àµ ($1) à´Žà´´àµà´¤à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
'uploaderror' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ പിഴവàµ',
+'upload-recreate-warning' => "'''à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•: ഇതേ പേരിലàµà´³àµà´³ ഒരൠപàµà´°à´®à´¾à´£à´‚ മായàµà´•àµà´•àµà´•à´¯àµ‹ മാറàµà´±àµà´•à´¯àµ‹ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.'''
+
+à´ˆ താളിനàµà´±àµ† മായàµà´•àµà´•àµ½ രേഖയàµà´‚ മാറàµà´±àµ½ രേഖയàµà´‚ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨à´¾à´¯à´¿ നൽകിയിരികàµà´•àµà´¨àµà´¨àµ:",
'uploadtext' => "താഴെ കാണàµà´¨àµà´¨ ഫോം à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´µà´¾àµ» വേണàµà´Ÿà´¿ ഉപയോഗികàµà´•àµà´•.
നിലവിൽ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ കാണàµà´µà´¾àµ» [[Special:FileList|à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤ à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•]] സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•. (à´ªàµà´¤àµà´•àµà´•à´¿à´¯) à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµà´•àµ¾ [[Special:Log/upload|à´…à´ªàµâ€Œà´²àµ‹à´¡àµ രേഖ]], മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´µ [[Special:Log/delete|മായàµà´•àµà´•àµ½ രേഖയിലàµà´‚]] കാണാവàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.
@@ -1598,6 +1639,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´²à´¾à´¤àµà´¤ ഒരൠപàµà´°à´®à´¾à´£ തരം ആണàµâ€Œ.
{{PLURAL:\$3|à´ªàµà´°à´®à´¾à´£ തരം|à´ªàµà´°à´®à´¾à´£ തരങàµà´™àµ¾}} \$2 ആണൠഅഭിലഷണീയം.",
'filetype-missing' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ à´Žà´•àµà´¸àµà´±àµà´±àµ»à´·àµ» (ഉദാ: ".jpg") ഇലàµà´².',
+'empty-file' => 'താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´ªàµà´°à´®à´¾à´£à´‚ ശൂനàµà´¯à´®à´¾à´£àµ.',
+'file-too-large' => 'താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´ªàµà´°à´®à´¾à´£à´‚ വളരെ വലàµà´¤à´¾à´£àµ.',
+'filename-tooshort' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠവളരെ ചെറàµà´¤à´¾à´£àµ.',
+'filetype-banned' => 'à´ˆ തരതàµà´¤à´¿à´²àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ നിരോധികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'verification-error' => 'à´ˆ à´ªàµà´°à´®à´¾à´£à´‚ à´ªàµà´°à´®à´¾à´£ പരിശോധന വിജയിചàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'hookaborted' => 'താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´š മാറàµà´±à´‚ ഒരൠഅനàµà´¬à´¨àµà´§à´¤àµà´¤à´¿à´¨àµà´±àµ† കൊളàµà´¤àµà´¤à´¿à´¨à´¾àµ½ റദàµà´¦à´¾à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
+'illegal-filename' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠഅനàµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´².',
+'overwrite' => 'നിലവിലàµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´®àµà´•à´³à´¿àµ½ à´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµ½ à´…à´¨àµà´µà´¦à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'unknown-error' => 'അപരിചിതമായ പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'tmp-create-error' => 'താതàµà´•à´¾à´²à´¿à´• à´ªàµà´°à´®à´¾à´£à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» കഴിയിലàµà´².',
+'tmp-write-error' => 'താതàµà´•à´¾à´²à´¿à´• à´ªàµà´°à´®à´¾à´£à´‚ à´¸àµà´¥à´¾à´ªà´¿à´•àµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿.',
'large-file' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† വലിപàµà´ªà´‚ $1-ൽ കൂടരàµà´¤àµ†à´¨àµà´¨à´¾à´£àµâ€Œ നിഷàµà´•àµà´•àµ¼à´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ. à´ˆ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚ $2 ആണàµâ€Œ.',
'largefileserver' => 'സെർവറിൽ à´šà´¿à´Ÿàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¤àµà´ªàµà´°à´•à´¾à´°à´‚ à´ˆ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´¾à´¯à´¤à´¿à´²àµà´‚ കൂടàµà´¤à´²à´¾à´£àµâ€Œ.',
'emptyfile' => 'താങàµà´•àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤ à´ªàµà´°à´®à´¾à´£à´‚ ശൂനàµà´¯à´®à´¾à´£àµ†à´¨àµà´¨àµ കാണàµà´¨àµà´¨àµ.
@@ -1627,13 +1679,14 @@ $1",
'file-exists-duplicate' => 'à´ˆ à´ªàµà´°à´®à´¾à´£à´‚ ഇനി പറയàµà´¨àµà´¨ {{PLURAL:$1|à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ†|à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ†}} അപരനാണàµâ€Œ:',
'file-deleted-duplicate' => 'à´ˆ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ സദൃശമായ à´ªàµà´°à´®à´¾à´£à´‚ ([[:$1]]) à´®àµà´®àµà´ªàµ മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.
à´† à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† മായàµà´•àµà´•àµ½ à´šà´°à´¿à´¤àµà´°à´‚ à´Žà´Ÿàµà´¤àµà´¤àµ പരിശോധിചàµà´š ശേഷം മാതàµà´°à´‚ വീണàµà´Ÿàµà´‚ à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•.',
-'successfulupload' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ വിജയിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'uploadwarning' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ',
'uploadwarning-text' => 'ദയവായി താഴെയàµà´³àµà´³ à´ªàµà´°à´®à´¾à´£ വിവരണങàµà´™àµ¾ à´ªàµà´¤àµà´•àµà´•à´¿ വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
'savefile' => 'à´ªàµà´°à´®à´¾à´£à´‚ കാതàµà´¤àµ സൂകàµà´·à´¿à´•àµà´•àµà´•',
'uploadedimage' => '"[[$1]]" à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤àµ.',
'overwroteimage' => '"[[$1]]" à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´ªàµà´¤à´¿à´¯ പതിപàµà´ªàµ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'uploaddisabled' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµà´•àµ¾ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'copyuploaddisabled' => 'യൂ.ആർ.എൽ. വഴിയàµà´³àµà´³ à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ നിർജàµà´œàµ€à´µà´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'uploadfromurl-queued' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ നിർവഹികàµà´•à´¾àµ» ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'uploaddisabledtext' => 'à´ªàµà´°à´®à´¾à´£à´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ സാദàµà´§àµà´¯à´®à´²àµà´²à´¾à´¤à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'php-uploaddisabledtext' => 'പി.à´Žà´šàµà´šàµ.പി.യിൽ à´ªàµà´°à´®à´¾à´£ à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµà´•àµ¾ സാദàµà´§àµà´¯à´®à´²àµà´²à´¾à´¤à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
ദയവായി file_uploads à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ പരിശോധികàµà´•àµà´•.',
@@ -1653,6 +1706,14 @@ $1",
à´ˆ à´ªàµà´°à´®à´¾à´£à´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ à´¤àµà´Ÿà´°à´£à´®àµ‹ à´Žà´¨àµà´¨à´¤àµ പരിശോധികàµà´•àµà´¨àµà´¨à´¤àµ നനàµà´¨à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚.
താങàµà´•à´³àµà´Ÿàµ† പരിശോധനയàµà´•àµà´•à´¾à´¯à´¿ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† മായàµà´•àµà´•àµ½ രേഖ ഇവിടെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:",
'filename-bad-prefix' => "താങàµà´•àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´µà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരàµâ€Œ '''\"\$1\"''' à´Žà´¨àµà´¨à´¾à´£àµâ€Œ à´¤àµà´Ÿà´™àµà´™àµà´¨àµà´¨à´¤àµ. ഇതൠഡിജിറàµà´±àµ½ à´•àµà´¯à´¾à´®à´±à´¯à´¿àµ½ പടങàµà´™àµ¾à´•àµà´•àµ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ ചേർകàµà´•àµà´¨àµà´¨ പേരാണàµâ€Œ. ദയവൠചെയàµà´¤àµ താങàµà´•àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤àµ† വിശദീകരികàµà´•àµà´¨àµà´¨ à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®à´¾à´¯ ഒരൠപേരൠതിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•.",
+'upload-success-subj' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ വിജയിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'upload-success-msg' => 'താങàµà´•à´³àµà´Ÿàµ† [$2]-ൽ നിനàµà´¨àµà´‚ വിജയകരമായി à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. [[:{{ns:file}}:$1]] കാണàµà´•',
+'upload-failure-subj' => 'à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡à´¿àµ½ പിഴവàµà´£àµà´Ÿàµ',
+'upload-failure-msg' => '[$2] à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ താങàµà´•àµ¾ നടതàµà´¤à´¿à´¯ à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡à´¿àµ½ ഒരൠപàµà´°à´¶àµà´¨à´®àµà´£àµà´Ÿàµ:
+
+$1',
+'upload-warning-subj' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ',
+'upload-warning-msg' => 'താങàµà´•àµ¾ [$2]-ൽ നിനàµà´¨àµà´‚ ചെയàµà´¤ à´…à´ªàµâ€Œà´²àµ‹à´¡à´¿àµ½ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. [[Special:Upload/stash/$1|à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ഫോമിലേകàµà´•àµ]] തിരിചàµà´šàµà´ªàµ‹à´¯à´¿ താങàµà´•àµ¾à´•àµà´•àµ à´ˆ à´ªàµà´°à´¶àµà´¨à´‚ പരിഹരികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
'upload-proto-error' => 'തെറàµà´±à´¾à´¯ à´ªàµà´°àµ‹à´Ÿàµà´Ÿàµ‹à´•àµà´•àµ‹àµ¾',
'upload-proto-error-text' => 'റിമോടàµà´Ÿàµ à´…à´ªàµâ€Œà´²àµ‹à´¡à´¿à´¨àµ <code>http://</code> അഥവാ <code>ftp://</code> à´Žà´¨àµà´¨àµ à´¤àµà´Ÿà´™àµà´™àµà´¨àµà´¨ URL വേണം.',
@@ -1715,6 +1776,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'listfiles_search_for' => 'മീഡിയ à´ªàµà´°à´®à´¾à´£à´‚ തിരയàµà´•:',
'imgfile' => 'à´ªàµà´°à´®à´¾à´£à´‚',
'listfiles' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
+'listfiles_thumb' => 'ലഘàµà´šà´¿à´¤àµà´°à´‚',
'listfiles_date' => 'തീയതി',
'listfiles_name' => 'പേരàµ',
'listfiles_user' => 'ഉപയോകàµà´¤à´¾à´µàµ',
@@ -1732,7 +1794,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'filehist-current' => 'നിലവിലàµà´³àµà´³à´¤àµ',
'filehist-datetime' => 'തീയതി/സമയം',
'filehist-thumb' => 'ലഘàµà´šà´¿à´¤àµà´°à´‚',
-'filehist-thumbtext' => 'മാറàµà´±à´‚ $1-à´¨àµà´±àµ† ലഘàµà´šà´¿à´¤àµà´°à´‚',
+'filehist-thumbtext' => '$1-ലെ പതിപàµà´ªà´¿à´¨àµà´±àµ† ലഘàµà´šà´¿à´¤àµà´°à´‚',
'filehist-nothumb' => 'ലഘàµà´šà´¿à´¤àµà´°à´®à´¿à´²àµà´²',
'filehist-user' => 'ഉപയോകàµà´¤à´¾à´µàµ',
'filehist-dimensions' => 'അളവàµà´•àµ¾',
@@ -1829,9 +1891,9 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'statistics-edits' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿à´¨àµà´±àµ† à´¤àµà´Ÿà´•àµà´•à´‚ à´®àµà´¤à´²àµà´³àµà´³ തിരàµà´¤àµà´¤à´²àµà´•àµ¾',
'statistics-edits-average' => 'ഒരൠതാളിൽ ശരാശരി തിരàµà´¤àµà´¤à´²àµà´•àµ¾',
'statistics-views-total' => 'ആകെ സനàµà´¦àµ¼à´¶à´¨à´™àµà´™àµ¾',
+'statistics-views-total-desc' => 'നിലവിലàµà´²à´¾à´¤àµà´¤ താളàµà´•à´³à´¿à´²àµà´‚ à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•à´³à´¿à´²àµà´‚ ഉളàµà´³ à´Žà´Ÿàµà´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´²àµà´•àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
'statistics-views-peredit' => 'ഓരോ തിരàµà´¤àµà´¤à´²à´¿à´²àµà´‚ ഉളàµà´³ à´Žà´Ÿàµà´¤àµà´¤àµà´¨àµ‹à´Ÿàµà´Ÿà´™àµà´™àµ¾',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue ജോബൠകàµà´¯àµ‚] നീളം',
-'statistics-users' => 'രജിസàµà´±àµà´±àµ¼ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ [[Special:ListUsers|ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾]]',
+'statistics-users' => 'à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ [[Special:ListUsers|ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾]]',
'statistics-users-active' => 'സജീവ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾',
'statistics-users-active-desc' => 'à´•à´´à´¿à´žàµà´ž {{PLURAL:$1|ദിവസം|$1 ദിവസങàµà´™àµ¾à´•àµà´•àµà´³àµà´³à´¿àµ½}} à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾',
'statistics-mostpopular' => 'à´à´±àµà´±à´µàµà´®à´§à´¿à´•à´‚ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•àµ¾',
@@ -1842,7 +1904,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'doubleredirects' => 'ഇരടàµà´Ÿ തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾',
'doubleredirectstext' => 'à´ˆ താളിൽ ഒരൠതിരിചàµà´šàµà´µà´¿à´Ÿà´²à´¿àµ½ നിനàµà´¨àµà´‚ മറàµà´±àµ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളàµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ പോകàµà´¨àµà´¨ താളàµà´•àµ¾ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഓരോ വരിയിലàµà´‚ à´’à´¨àµà´¨à´¾à´®à´¤àµà´¤àµ‡à´¯àµà´‚ à´°à´£àµà´Ÿà´¾à´®à´¤àµà´¤àµ‡à´¯àµà´‚ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളിലേകàµà´•àµà´³àµà´³ à´•à´£àµà´£à´¿à´•à´³àµà´‚, à´°à´£àµà´Ÿà´¾à´®à´¤àµà´¤àµ† തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളിൽ നിനàµà´¨àµ ശരിയായ ലകàµà´·àµà´¯à´¤à´¾à´³à´¿à´²àµ‡à´•àµà´•àµà´³àµà´³ à´•à´£àµà´£à´¿à´•à´³àµà´‚ ഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨àµ.
-<s>വെടàµà´Ÿà´¿à´•àµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´µ</s> ശരിയാകàµà´•àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ.',
+<del>വെടàµà´Ÿà´¿à´•àµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´µ</del> ശരിയാകàµà´•àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ.',
'double-redirect-fixed-move' => '[[$1]] മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
ഇതൠഇപàµà´ªàµ‹àµ¾ [[$2]] à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ തിരിചàµà´šàµà´µà´¿à´Ÿà´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'double-redirect-fixer' => 'തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ ശരിയാകàµà´•à´¿à´¯à´¤àµ',
@@ -1866,6 +1928,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'nmembers' => '{{PLURAL:$1|ഒരൠഅംഗം|$1 à´…à´‚à´—à´™àµà´™àµ¾}}',
'nrevisions' => '{{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}}',
'nviews' => '{{PLURAL:$1|ഒരൠസനàµà´¦àµ¼à´¶à´¨à´‚|$1 സനàµà´¦àµ¼à´¶à´¨à´™àµà´™àµ¾}}',
+'nimagelinks' => '{{PLURAL:$1|ഒരൠതാളിൽ|$1 താളàµà´•à´³à´¿àµ½}} ഉപയോഗിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'ntransclusions' => '{{PLURAL:$1|ഒരൠതാളിൽ|$1 താളàµà´•à´³à´¿àµ½}} ഉപയോഗിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'specialpage-empty' => 'à´ˆ താൾ ശൂനàµà´¯à´®à´¾à´£àµ.',
'lonelypages' => 'അനാഥ താളàµà´•àµ¾',
'lonelypagestext' => 'താഴെകàµà´•à´¾à´£àµà´¨àµà´¨ താളàµà´•à´³à´¿à´²àµ‡à´•àµà´•àµ {{SITENAME}} സം‌രംഭതàµà´¤à´¿à´²àµ† മറàµà´±àµ താളàµà´•à´³à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´‚ à´•à´£àµà´£à´¿à´•à´³àµ‹ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµ‹ നിലവിലിലàµà´².',
@@ -1901,7 +1965,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'protectedtitlestext' => 'താഴെകàµà´•à´¾à´£àµà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´•àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ നിരോധിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'protectedtitlesempty' => 'à´ˆ à´šà´°à´™àµà´™àµ¾ ഉപയോഗിചàµà´šàµ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´•àµ¾ à´’à´¨àµà´¨àµà´‚ തനàµà´¨àµ† സം‌രകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'listusers' => 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
-'listusers-editsonly' => 'തിരàµà´¤àµà´¤à´²àµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµ†à´®à´¾à´¤àµà´°à´‚ കാണികàµà´•àµà´•',
+'listusers-editsonly' => 'തിരàµà´¤àµà´¤à´²àµà´•àµ¾ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµ† മാതàµà´°à´‚ കാണികàµà´•àµà´•',
'listusers-creationsort' => 'സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ തീയതി à´…à´¨àµà´¸à´°à´¿à´šàµà´šàµ à´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'usereditcount' => '{{PLURAL:$1|ഒരൠതിരàµà´¤àµà´¤àµ½|$1 തിരàµà´¤àµà´¤à´²àµà´•àµ¾}}',
'usercreated' => '$1 $2-നൠസൃഷàµà´Ÿà´¿à´šàµà´šà´¤àµ',
@@ -1934,7 +1998,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'speciallogtitlelabel' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµ:',
'log' => 'à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ രേഖകൾ',
'all-logs-page' => 'à´Žà´²àµà´²à´¾ പൊതàµà´°àµ‡à´–à´•à´³àµà´‚',
-'alllogstext' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ ലഭàµà´¯à´®à´¾à´¯ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ രേഖകൾ സംയàµà´•àµà´¤à´®à´¾à´¯à´¿ à´ˆ താളിൽ കാണാം. താങàµà´•àµ¾à´•àµà´•àµ രേഖകളàµà´Ÿàµ† à´¸àµà´µà´­à´¾à´µà´‚, ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚(കേസൠസെൻസിറàµà´±àµ€à´µàµ), ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താൾ (കേസൠസെൻസിറàµà´±àµ€à´µàµ) à´®àµà´¤à´²à´¾à´¯à´µ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤àµ à´…à´¨àµà´µàµ‡à´·à´£à´‚ കൂടàµà´¤àµ½ à´•àµà´Œà´ªàµà´¤à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'alllogstext' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ ലഭàµà´¯à´®à´¾à´¯ വിവിധ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ രേഖകൾ à´ˆ താളിൽ à´’à´°àµà´®à´¿à´šàµà´šàµ കാണാം. താങàµà´•àµ¾à´•àµà´•àµ രേഖകളàµà´Ÿàµ† à´¸àµà´µà´­à´¾à´µà´‚, ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ (കേസൠസെൻസിറàµà´±àµ€à´µàµ), ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താൾ (കേസൠസെൻസിറàµà´±àµ€à´µàµ) à´®àµà´¤à´²à´¾à´¯à´µ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤àµ à´…à´¨àµà´µàµ‡à´·à´£à´‚ കൂടàµà´¤àµ½ à´•àµà´Œà´ªàµà´¤à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
'logempty' => 'à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–യിൽ ബനàµà´§à´®àµà´³àµà´³à´µ ഇലàµà´².',
'log-title-wildcard' => 'à´ˆ വാകàµà´•à´¿àµ½ à´¤àµà´Ÿà´™àµà´™àµà´¨àµà´¨ തിരചàµà´šà´¿àµ½ ഫലങàµà´™àµ¾',
@@ -2023,34 +2087,40 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'listgrouprights-removegroup-self-all' => 'à´¸àµà´µà´¨àµà´¤à´‚ à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿àµ½ നിനàµà´¨àµ à´Žà´²àµà´²à´¾ സംഘങàµà´™à´³àµ‡à´¯àµà´‚ നീകàµà´•à´‚ചെയàµà´¯àµà´•',
# E-mail user
-'mailnologin' => 'അയയàµà´•àµà´•à´¾à´¨àµà´³àµà´³ വിലാസം ലഭàµà´¯à´®à´²àµà´²',
-'mailnologintext' => 'മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിലയകàµà´•àµà´µà´¾àµ» താങàµà´•àµ¾ [[Special:UserLogin|ലോഗിൻ]] ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´•à´¯àµà´‚, സാധàµà´µà´¾à´¯ ഒരൠഇമെയിൽ വിലാസം താങàµà´•à´³àµà´Ÿàµ† [[Special:Preferences|à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾]] താളിൽ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´•à´¯àµà´‚ വേണം.',
-'emailuser' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµà´•',
-'emailpage' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµà´•',
-'emailpagetext' => 'താഴെ കാണàµà´¨àµà´¨ ഫോം മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµâ€Œ ഇമെയിൽ അയകàµà´•à´¾àµ» ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.
+'mailnologin' => 'അയയàµà´•àµà´•à´¾à´¨àµà´³àµà´³ വിലാസം ലഭàµà´¯à´®à´²àµà´²',
+'mailnologintext' => 'മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിലയകàµà´•àµà´µà´¾àµ» താങàµà´•àµ¾ [[Special:UserLogin|ലോഗിൻ]] ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´•à´¯àµà´‚, സാധàµà´µà´¾à´¯ ഒരൠഇമെയിൽ വിലാസം താങàµà´•à´³àµà´Ÿàµ† [[Special:Preferences|à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾]] താളിൽ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´•à´¯àµà´‚ വേണം.',
+'emailuser' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµà´•',
+'emailpage' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµà´•',
+'emailpagetext' => 'താഴെ കാണàµà´¨àµà´¨ ഫോം മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµâ€Œ ഇമെയിൽ അയകàµà´•à´¾àµ» ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.
[[Special:Preferences|ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഇമെയിൽ വിലാസം "ദാതാവàµ" ആയി വരàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ à´¸àµà´µàµ€à´•àµ¼à´¤àµà´¤à´¾à´µà´¿à´¨àµâ€Œ താങàµà´•àµ¾à´•àµà´•àµ നേരിടàµà´Ÿàµ മറàµà´ªà´Ÿà´¿ അയകàµà´•à´¾àµ» à´•à´´à´¿à´¯àµà´‚.',
-'usermailererror' => 'മെയിലàµà´£àµà´Ÿà´¾à´¯ പിഴവൠതിരിചàµà´šà´¯à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:',
-'defemailsubject' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ നിനàµà´¨àµà´³àµà´³ ഇമെയിൽ',
-'noemailtitle' => 'ഇമെയിൽ വിലാസം ഇലàµà´²',
-'noemailtext' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ സാധàµà´µà´¾à´¯ ഇമെയിൽ വിലാസം നൽകിയിടàµà´Ÿà´¿à´²àµà´².',
-'nowikiemailtitle' => 'ഇമെയിൽ à´…à´¨àµà´µà´¦à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
-'nowikiemailtext' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ മറàµà´±àµà´³àµà´³à´µà´°à´¿àµ½ നിനàµà´¨àµà´‚ ഇമെയിൽ à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ ഒഴിവാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
-'email-legend' => 'മറàµà´±àµŠà´°àµ {{SITENAME}} ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയയàµà´•àµà´•àµà´•',
-'emailfrom' => 'ദാതാവàµ:',
-'emailto' => 'à´¸àµà´µàµ€à´•àµ¼à´¤àµà´¤à´¾à´µàµ:',
-'emailsubject' => 'വിഷയം:',
-'emailmessage' => 'സനàµà´¦àµ‡à´¶à´‚:',
-'emailsend' => 'അയകàµà´•àµ‚',
-'emailccme' => 'ഇമെയിലിനàµà´±àµ† പകർപàµà´ªàµ എനികàµà´•àµà´‚ അയകàµà´•àµà´•.',
-'emailccsubject' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨à´¯à´šàµà´š സനàµà´¦àµ‡à´¶à´¤àµà´¤à´¿à´¨àµà´±àµ† പകർപàµà´ªàµ: $2',
-'emailsent' => 'ഇമെയിൽ അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'emailsenttext' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ അയചàµà´šàµ à´•à´´à´¿à´žàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
-'emailuserfooter' => 'à´ˆ ഇമെയിൽ {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† "ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµâ€Œ ഇമെയിൽ അയയàµà´•àµà´•àµà´•" à´Žà´¨àµà´¨ സൌകരàµà´¯à´‚ ഉപയോഗിചàµà´šàµ $1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $2 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ അയചàµà´šà´¤à´¾à´£àµ.',
+'usermailererror' => 'മെയിലàµà´£àµà´Ÿà´¾à´¯ പിഴവൠതിരിചàµà´šà´¯à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:',
+'defemailsubject' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ നിനàµà´¨àµà´³àµà´³ ഇമെയിൽ',
+'usermaildisabled' => 'ഉപയോകàµà´¤àµƒ ഇമെയിൽ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'usermaildisabledtext' => 'à´ˆ വികàµà´•à´¿à´¯à´¿à´²àµ† മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ അയയàµà´•àµà´•à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´²',
+'noemailtitle' => 'ഇമെയിൽ വിലാസം ഇലàµà´²',
+'noemailtext' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ സാധàµà´µà´¾à´¯ ഇമെയിൽ വിലാസം നൽകിയിടàµà´Ÿà´¿à´²àµà´².',
+'nowikiemailtitle' => 'ഇമെയിൽ à´…à´¨àµà´µà´¦à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
+'nowikiemailtext' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ മറàµà´±àµà´³àµà´³à´µà´°à´¿àµ½ നിനàµà´¨àµà´‚ ഇമെയിൽ à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ ഒഴിവാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'email-legend' => 'മറàµà´±àµŠà´°àµ {{SITENAME}} ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയയàµà´•àµà´•àµà´•',
+'emailfrom' => 'ദാതാവàµ:',
+'emailto' => 'à´¸àµà´µàµ€à´•àµ¼à´¤àµà´¤à´¾à´µàµ:',
+'emailsubject' => 'വിഷയം:',
+'emailmessage' => 'സനàµà´¦àµ‡à´¶à´‚:',
+'emailsend' => 'അയകàµà´•àµ‚',
+'emailccme' => 'ഇമെയിലിനàµà´±àµ† പകർപàµà´ªàµ എനികàµà´•àµà´‚ അയകàµà´•àµà´•.',
+'emailccsubject' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨à´¯à´šàµà´š സനàµà´¦àµ‡à´¶à´¤àµà´¤à´¿à´¨àµà´±àµ† പകർപàµà´ªàµ: $2',
+'emailsent' => 'ഇമെയിൽ അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'emailsenttext' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ അയചàµà´šàµ à´•à´´à´¿à´žàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'emailuserfooter' => 'à´ˆ ഇമെയിൽ {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† "ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµâ€Œ ഇമെയിൽ അയയàµà´•àµà´•àµà´•" à´Žà´¨àµà´¨ സൌകരàµà´¯à´‚ ഉപയോഗിചàµà´šàµ $1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $2 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ അയചàµà´šà´¤à´¾à´£àµ.',
+
+# User Messenger
+'usermessage-summary' => 'à´µàµà´¯à´µà´¸àµà´¥à´¾à´¸à´¨àµà´¦àµ‡à´¶à´‚ ഉപേകàµà´·à´¿à´•àµà´•àµà´•.',
+'usermessage-editor' => 'à´µàµà´¯à´µà´¸àµà´¥à´¾à´¸à´¨àµà´¦àµ‡à´¶à´•àµ»',
# Watchlist
'watchlist' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
'mywatchlist' => 'ഞാൻ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µ',
-'watchlistfor' => "(ഉപയോകàµà´¤à´¾à´µàµ '''$1''')",
+'watchlistfor2' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $2.',
'nowatchlist' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ ഇനങàµà´™à´³àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´².',
'watchlistanontext' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാണàµà´µà´¾à´¨àµ‹ തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµ‹ $1 ചെയàµà´¯àµà´•.',
'watchnologin' => 'ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
@@ -2094,7 +2164,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'enotif_body' => 'à´ªàµà´°à´¿à´¯ $WATCHINGUSERNAME,
-{{SITENAME}} സം‌രംഭതàµà´¤à´¿à´²àµ† $PAGETITLE താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $CHANGEDORCREATED, ഇപàµà´ªàµ‹à´´àµà´³àµà´³ പതിപàµà´ªà´¿à´¨à´¾à´¯à´¿ $PAGETITLE_URL കാണàµà´•.
+{{SITENAME}} സം‌രംഭതàµà´¤à´¿à´²àµ† $PAGETITLE à´Žà´¨àµà´¨ താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $CHANGEDORCREATED, ഇപàµà´ªàµ‹à´´àµà´³àµà´³ പതിപàµà´ªà´¿à´¨à´¾à´¯à´¿ $PAGETITLE_URL കാണàµà´•.
$NEWPAGE
@@ -2109,6 +2179,9 @@ $NEWPAGE
താങàµà´•à´³àµà´Ÿàµ† {{SITENAME}} à´¸àµà´¹àµƒà´¦àµ അറിയിപàµà´ªàµ സജàµà´œàµ€à´•à´°à´£à´‚
--
+ഇമെയിൽ അറിയിപàµà´ªàµ സജàµà´œàµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤à´¾àµ», സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•
+{{fullurl:{{#special:Preferences}}}}
+
à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ», സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2162,7 +2235,10 @@ $UNWATCHURL
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ നീകàµà´•à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ; നിലവിലàµà´³àµà´³ പതിപàµà´ªàµ [[User:$1|$1]] സൃഷàµà´Ÿà´¿à´šàµà´šà´¤à´¾à´£àµ',
'revertpage-nouser' => '(ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നീകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ) നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ [[User:$1|$1]] സൃഷàµà´Ÿà´¿à´šàµà´š അവസാന പതിപàµà´ªà´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´®àµàµ»à´ªàµà´°à´¾à´ªà´¨à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'rollback-success' => '$1 ചെയàµà´¤ തിരàµà´¤àµà´¤àµ½ തിരസàµà´•àµà´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ; $2 ചെയàµà´¤ തൊടàµà´Ÿàµ à´®àµàµ»à´ªà´¤àµà´¤àµ† പതിപàµà´ªà´¿à´²àµ‡à´•àµà´•àµ സേവൠചെയàµà´¯àµà´¨àµà´¨àµ.',
-'sessionfailure' => 'താങàµà´•à´³àµà´Ÿàµ† ലോഗിൻ സെഷനിൽ à´ªàµà´°à´¶àµà´¨à´™àµà´™à´³àµà´³àµà´³à´¤à´¾à´¯à´¿ കാണàµà´¨àµà´¨àµ;
+
+# Edit tokens
+'sessionfailure-title' => 'സെഷൻ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'sessionfailure' => 'താങàµà´•à´³àµà´Ÿàµ† ലോഗിൻ സെഷനിൽ à´ªàµà´°à´¶àµà´¨à´™àµà´™à´³àµà´³àµà´³à´¤à´¾à´¯à´¿ കാണàµà´¨àµà´¨àµ;
സെഷൻ തടàµà´Ÿà´¿à´¯àµ†à´Ÿàµà´•àµà´•àµ½ ഒഴിവാകàµà´•à´¾à´¨àµà´³àµà´³ à´®àµàµ»à´•à´°àµà´¤à´²à´¾à´¯à´¿ à´ˆ à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ റദàµà´¦à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
ദയവായി പിനàµà´¨àµ‹à´Ÿàµà´Ÿàµ പോയി താങàµà´•àµ¾ വനàµà´¨ താളിൽ ചെനàµà´¨àµ, വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
@@ -2293,18 +2369,22 @@ $1',
'month' => 'മാസം:',
'year' => 'വർഷം:',
-'sp-contributions-newbies' => 'à´ªàµà´¤à´¿à´¯ à´…à´‚à´—à´™àµà´™àµ¾ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ മാതàµà´°à´‚',
-'sp-contributions-newbies-sub' => 'à´ªàµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ ചെയàµà´¤à´µ',
-'sp-contributions-newbies-title' => 'à´ªàµà´¤à´¿à´¯ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† സേവനങàµà´™àµ¾',
-'sp-contributions-blocklog' => 'തടയൽ രേഖ',
-'sp-contributions-deleted' => 'മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോകàµà´¤àµƒà´¸à´‚ഭാവനകൾ',
-'sp-contributions-logs' => 'à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–കൾ',
-'sp-contributions-talk' => 'സംവാദം',
-'sp-contributions-userrights' => 'ഉപയോകàµà´¤àµƒ അവകാശങàµà´™à´³àµà´Ÿàµ† പരിപാലനം',
-'sp-contributions-blocked-notice' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ ഇപàµà´ªàµ‹àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ. അവലംബമായി തടയൽ രേഖയàµà´Ÿàµ† à´ªàµà´¤à´¿à´¯ ഭാഗം താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:',
-'sp-contributions-search' => 'ചെയàµà´¤ സേവനങàµà´™àµ¾',
-'sp-contributions-username' => 'à´.പി. വിലാസം അഥവാ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
-'sp-contributions-submit' => 'തിരയൂ',
+'sp-contributions-newbies' => 'à´ªàµà´¤à´¿à´¯ à´…à´‚à´—à´™àµà´™àµ¾ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ മാതàµà´°à´‚',
+'sp-contributions-newbies-sub' => 'à´ªàµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ ചെയàµà´¤à´µ',
+'sp-contributions-newbies-title' => 'à´ªàµà´¤à´¿à´¯ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† സേവനങàµà´™àµ¾',
+'sp-contributions-blocklog' => 'തടയൽ രേഖ',
+'sp-contributions-deleted' => 'മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോകàµà´¤àµƒà´¸à´‚ഭാവനകൾ',
+'sp-contributions-uploads' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµà´•àµ¾',
+'sp-contributions-logs' => 'à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–കൾ',
+'sp-contributions-talk' => 'സംവാദം',
+'sp-contributions-userrights' => 'ഉപയോകàµà´¤àµƒ അവകാശങàµà´™à´³àµà´Ÿàµ† പരിപാലനം',
+'sp-contributions-blocked-notice' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ ഇപàµà´ªàµ‹àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ. അവലംബമായി തടയൽ രേഖയàµà´Ÿàµ† à´ªàµà´¤à´¿à´¯ ഭാഗം താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:',
+'sp-contributions-blocked-notice-anon' => 'à´ˆ à´.പി. വിലാസം ഇപàµà´ªàµ‹àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ.
+അവലംബമായി തടയൽ രേഖയàµà´Ÿàµ† à´ªàµà´¤à´¿à´¯à´­à´¾à´—à´‚ താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:',
+'sp-contributions-search' => 'ചെയàµà´¤ സേവനങàµà´™àµ¾',
+'sp-contributions-username' => 'à´.പി. വിലാസം അഥവാ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
+'sp-contributions-toponly' => 'à´’à´Ÿàµà´µà´¿à´²à´¤àµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾ മാതàµà´°à´‚ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+'sp-contributions-submit' => 'തിരയൂ',
# What links here
'whatlinkshere' => 'à´…à´¨àµà´¬à´¨àµà´§à´•à´£àµà´£à´¿à´•àµ¾',
@@ -2365,7 +2445,6 @@ $1',
'ipb-edit-dropdown' => 'തടഞàµà´žà´¤à´¿à´¨àµà´±àµ† കാരണം തിരàµà´¤àµà´¤àµà´•',
'ipb-unblock-addr' => '$1 à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´³àµà´³ തടയൽ നീകàµà´•àµà´•',
'ipb-unblock' => 'ഒരൠà´.പി. വിലാസതàµà´¤à´¿à´¨àµ‹ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ‹ ഉളàµà´³ തടയൽ നീകàµà´•à´‚ചെയàµà´¯àµà´•',
-'ipb-blocklist-addr' => '$1 à´…à´¨àµà´­à´µà´¿à´•àµà´•àµà´¨àµà´¨ വിലകàµà´•àµà´•àµ¾',
'ipb-blocklist' => 'നിലവിലàµà´³àµà´³ തടയലàµà´•àµ¾',
'ipb-blocklist-contribs' => '$1 നൽകിയ സംഭാവനകൾ',
'unblockip' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´³àµà´³ തടയൽ നീകàµà´•àµà´•',
@@ -2376,8 +2455,8 @@ $1',
'ipblocklist' => 'തടയപàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾',
'ipblocklist-legend' => 'തടഞàµà´ž ഒരൠഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† തിരയàµà´•',
'ipblocklist-username' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ à´.പി. വിലാസം:',
-'ipblocklist-sh-userblocks' => '$1 à´…à´‚à´—à´¤àµà´µ തടയലàµà´•àµ¾',
-'ipblocklist-sh-tempblocks' => '$1 താൽകàµà´•à´¾à´²à´¿à´• തടയലàµà´•àµ¾',
+'ipblocklist-sh-userblocks' => 'à´…à´‚à´—à´¤àµà´µ തടയലàµà´•àµ¾ $1',
+'ipblocklist-sh-tempblocks' => 'താൽകàµà´•à´¾à´²à´¿à´• തടയലàµà´•àµ¾ $1',
'ipblocklist-sh-addressblocks' => 'à´’à´±àµà´±à´¯àµŠà´±àµà´± à´.പി. തടയലàµà´•àµ¾ $1',
'ipblocklist-submit' => 'തിരയൂ',
'ipblocklist-localblock' => 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´• തടയൽ',
@@ -2435,6 +2514,8 @@ $1 നിലവിൽ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.<br />
'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗികàµà´•àµà´¨àµà´¨ DNSBL ൽ താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം ഒരൠഓപàµà´ªàµº à´ªàµà´°àµ‹à´•àµà´¸à´¿à´¯à´¾à´¯à´¾à´£àµ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤àµ. താങàµà´•àµ¾à´•àµà´•àµ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².',
'cant-block-while-blocked' => 'താങàµà´•àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•à´³àµ† തടയാൻ താങàµà´•àµ¾à´•àµà´•àµ സാധികàµà´•à´¿à´²àµà´².',
'cant-see-hidden-user' => 'താങàµà´•àµ¾ തടയാൻ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ à´®àµà´®àµà´ªàµ‡ തടയപàµà´ªàµ†à´Ÿàµà´•à´¯àµà´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´•à´¯àµà´‚ ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ. താങàµà´•àµ¾à´•àµà´•àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† മറയàµà´•àµà´•à´¾à´¨àµà´³àµà´³ അവകാശം ഇലàµà´²àµ†à´™àµà´•à´¿àµ½, ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ†à´¤à´¿à´°àµ† ഉളàµà´³ തടയൽ കാണാനോ തിരàµà´¤àµà´¤à´¾à´¨àµ‹ à´•à´´à´¿à´¯àµà´¨àµà´¨à´¤à´²àµà´².',
+'ipbblocked' => 'മറàµà´±àµà´³àµà´³à´µà´°àµ† തടയാനോ അവരàµà´Ÿàµ† തടയൽ നീകàµà´•à´¾à´¨àµ‹ താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´². കാരണം താങàµà´•àµ¾ തനàµà´¨àµ† തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ',
+'ipbnounblockself' => 'താങàµà´•àµ¾à´•àµà´•àµ à´¸àµà´µà´¨àµà´¤à´‚ തടയൽ നീകàµà´•à´¾àµ» à´…à´¨àµà´®à´¤à´¿à´¯à´¿à´²àµà´²',
# Developer tools
'lockdb' => 'ഡാറàµà´±à´¾à´¬àµ‡à´¸àµ ബനàµà´§à´¿à´•àµà´•àµà´•',
@@ -2475,6 +2556,21 @@ $1 നിലവിൽ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.<br />
'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ!:'''
à´ˆ à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ ഒരൠനലàµà´²à´¤à´¾à´³à´¿àµ½ à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤à´µàµà´‚, ഉഗàµà´°à´µàµà´®à´¾à´¯ ഫലങàµà´™àµ¾ ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯àµ‡à´•àµà´•à´¾à´‚.
à´®àµà´¨àµà´¨àµ‹à´Ÿàµà´Ÿàµ പോകàµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ താങàµà´•àµ¾ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ†à´¨àµà´¤à´¾à´£àµ†à´¨àµà´¨àµ à´µàµà´¯à´•àµà´¤à´®à´¾à´¯à´¿ മനസàµà´¸à´¿à´²à´¾à´•àµà´•àµà´•.",
+'movepagetext-noredirectfixer' => "താഴെയàµà´³àµà´³ ഫോം ഒരൠതാളിനെ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¯à´¾à´¨àµà´³àµà´³à´¤à´¾à´£àµ.
+താളിനàµà´±àµ† പഴയരൂപങàµà´™à´³àµà´‚ à´ˆ മാറàµà´±à´¤àµà´¤à´¿à´¨àµ വിധേയമാകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.
+പഴയ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ, à´ªàµà´¤à´¿à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´³àµà´³ താളിലേകàµà´•àµà´³àµà´³ ഒരൠതിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളായി മാറàµà´‚.
+പഴയതാളിലേകàµà´•àµà´³àµà´³ ലിങàµà´•àµà´•àµ¾ à´ˆ മാറàµà´±à´¤àµà´¤à´¿àµ½ മാറàµà´•à´¯à´¿à´²àµà´².
+[[Special:DoubleRedirects|ഇരടàµà´Ÿ തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•à´³àµ‹]], [[Special:BrokenRedirects|ഫലപàµà´°à´¦à´®à´²àµà´²à´¾à´¤àµà´¤ തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•à´³àµ‹]] ഉണàµà´Ÿà´¾à´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ‹à´¯àµ†à´¨àµà´¨àµ ദയവായി പരിശോധികàµà´•àµà´•.
+ലിങàµà´•àµà´•àµ¾ ശരിയായി à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ‹ à´Žà´¨àµà´¨àµ പരിശോധിചàµà´šàµ ഉറപàµà´ªàµ വരàµà´¤àµà´¤àµ‡à´£àµà´Ÿà´¤àµ താങàµà´•à´³àµà´Ÿàµ† à´šàµà´®à´¤à´²à´¯à´¾à´£àµ.
+
+താങàµà´•àµ¾ à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ ഉദàµà´¦àµ‡à´¶à´¿à´•àµà´•àµà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ ഒരൠതാൾ നേരതàµà´¤àµ‡ നിലവിലàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ '''à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ സാധികàµà´•à´¿à´²àµà´²'''.
+à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ അതൊരൠതിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളോ, ശൂനàµà´¯à´®à´¾à´¯ താളോ അതിനൠമറàµà´±àµ പഴയരൂപങàµà´™àµ¾ ഇലàµà´²à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•à´¯àµ‹ ചെയàµà´¯à´£à´‚.
+അതായതൠതാങàµà´•àµ¾ ഒരൠതാൾ തെറàµà´±à´¾à´¯à´¿ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´¾àµ½ മാതàµà´°à´®àµ‡ അതിനേ തിരിചàµà´šà´¾à´•àµà´•à´¾àµ» സാധികàµà´•àµà´•à´¯àµà´³àµà´³àµ.
+നിലവിലàµà´³àµà´³ ഒരൠതാളിനàµà´±àµ† à´®àµà´•à´³à´¿àµ½ അതേ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ മറàµà´±àµŠà´°àµ താളàµà´£àµà´Ÿà´¾à´•àµà´•à´¾àµ» സാധികàµà´•à´¿à´²àµà´².
+
+'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ!:'''
+à´ˆ à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ ഒരൠനലàµà´²à´¤à´¾à´³à´¿àµ½ à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤à´µàµà´‚, ഉഗàµà´°à´µàµà´®à´¾à´¯ ഫലങàµà´™àµ¾ സൃഷàµà´Ÿà´¿à´šàµà´šàµ‡à´•àµà´•à´¾à´‚.
+à´®àµà´¨àµà´¨àµ‹à´Ÿàµà´Ÿàµ പോകàµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ താങàµà´•àµ¾ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ†à´¨àµà´¤à´¾à´£àµ†à´¨àµà´¨àµ à´µàµà´¯à´•àµà´¤à´®à´¾à´¯à´¿ മനസàµà´¸à´¿à´²à´¾à´•àµà´•àµà´•.",
'movepagetalktext' => "'''ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ സം‌വാദം താളàµà´‚ à´¸àµà´µà´¯à´‚ മാറàµà´±à´ªàµà´ªàµ†à´Ÿà´¾à´¤à´¿à´°à´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ കാരണങàµà´™àµ¾'''
*അതേ പേരിൽ തനàµà´¨àµ† ശൂനàµà´¯à´®à´²àµà´²à´¾à´¤àµà´¤ ഒരൠസം‌വാദം താൾ നിലവിലàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½
*താങàµà´•àµ¾ താഴെയàµà´³àµà´³ ചെകàµâ€à´¬àµ‹à´•àµà´¸àµ ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²à´™àµà´•à´¿àµ½
@@ -2529,6 +2625,7 @@ $1 നിലവിൽ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.<br />
'immobile-source-page' => 'à´ˆ താൾ മാറàµà´±à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´²',
'immobile-target-page' => 'ലകàµà´·àµà´¯à´®à´¾à´•àµà´•à´¿à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±à´¾àµ» സാധികàµà´•à´¿à´²àµà´².',
'imagenocrossnamespace' => 'à´ªàµà´°à´®à´¾à´£à´‚ അതിനായി à´…à´²àµà´²à´¾à´¤àµà´¤ നാമമേഖലയിലേയàµà´•àµà´•àµ മാറàµà´±à´¾àµ» കഴിയിലàµà´²',
+'nonfile-cannot-move-to-file' => 'à´ªàµà´°à´®à´¾à´£à´®à´²àµà´²à´¾à´¤àµà´¤à´µ à´ªàµà´°à´®à´¾à´£à´‚ നാമമേഖലയിലേയàµà´•àµà´•àµ മാറàµà´±à´¾àµ» കഴിയിലàµà´².',
'imagetypemismatch' => 'à´ªàµà´¤à´¿à´¯ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´Žà´•àµà´¸àµà´±àµà´±àµ†àµ»à´·àµ» അതിനàµà´±àµ† തരവàµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨à´¿à´²àµà´².',
'imageinvalidfilename' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ ലകàµà´·àµà´¯à´®à´¿à´Ÿàµà´Ÿ പേരൠഅസാധàµà´µà´¾à´£àµ',
'fix-double-redirects' => 'പഴയ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´•àµà´•àµà´³àµà´³ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളàµà´•à´³àµà´‚ ഇതോടൊപàµà´ªà´‚ à´ªàµà´¤àµà´•àµà´•àµà´•',
@@ -2607,6 +2704,7 @@ $1 നിലവിൽ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.<br />
'importstart' => 'താളàµà´•àµ¾ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´¨àµà´¨àµ...',
'import-revision-count' => '{{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}}',
'importnopages' => 'ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯à´¾àµ» പറàµà´±à´¿à´¯ താളàµà´•àµ¾ ഇലàµà´².',
+'imported-log-entries' => '{{PLURAL:$1|രേഖയിലെ à´’à´°àµàµ¾à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½|രേഖയിലെ $1 ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾}} ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¤àµ.',
'importfailed' => 'ഇറകàµà´•àµà´®à´¤à´¿ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ: <nowiki>$1</nowiki>',
'importunknownsource' => 'അപരിചിതമായ ഇറകàµà´•àµà´®à´¤à´¿ à´¸àµà´°àµ‹à´¤à´¸àµà´¸àµ തരം',
'importcantopen' => 'ഇറകàµà´•àµà´®à´¤à´¿ à´ªàµà´°à´®à´¾à´£à´‚ à´¤àµà´±à´•àµà´•à´¾àµ» പറàµà´±à´¿à´¯à´¿à´²àµà´²',
@@ -2702,6 +2800,8 @@ $1 നിലവിൽ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.<br />
'tooltip-upload' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ à´¤àµà´Ÿà´™àµà´™àµà´•',
'tooltip-rollback' => 'അവസാനതàµà´¤àµ† ആൾ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•à´³àµ† ഒരൊറàµà´± à´•àµà´²à´¿à´•àµà´•àµ കൊണàµà´Ÿàµ à´®àµàµ» അവസàµà´¥à´¯à´¿à´²àµ‡à´•àµà´•àµ തിരിചàµà´šàµà´µàµ†à´¯àµà´•àµà´•à´¾àµ» "റോൾബാകàµà´•àµ" സഹായികàµà´•àµà´¨àµà´¨àµ.',
'tooltip-undo' => 'മാറàµà´±à´‚ തിരസàµà´•à´°à´¿à´•àµà´•àµà´• à´Žà´¨àµà´¨à´¤àµ à´ˆ മാറàµà´±à´‚ à´®àµàµ» അവസàµà´¥à´¯à´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±àµà´•à´¯àµà´‚ അതൠഎഡിറàµà´±àµ ഫോമിൽ à´ªàµà´°à´¿à´µàµà´¯àµ‚ ആയി കാടàµà´Ÿàµà´•à´¯àµà´‚ ചെയàµà´¯àµà´‚. à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† കാരണം à´šàµà´°àµà´•àµà´•à´®à´¾à´¯à´¿ നൽകാൻ സാധികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'tooltip-preferences-save' => 'à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ ഓർതàµà´¤àµà´µàµ†à´¯àµà´•àµà´•àµà´•',
+'tooltip-summary' => 'ചെറിയൊരൠചàµà´°àµà´•àµà´•à´‚ ചേർകàµà´•àµà´•',
# Stylesheets
'common.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´Žà´²àµà´²à´¾ ദൃശàµà´¯à´°àµ‚പങàµà´™àµ¾à´•àµà´•àµà´‚ ബാധകമായിരികàµà´•àµà´‚ */',
@@ -2792,7 +2892,7 @@ latex, dvips,à´Žà´¨àµà´¨à´¿à´µ ശരിയായാണോ ഇൻസàµà´±àµà´
'patrol-log-page' => 'റോനàµà´¤àµà´šàµà´±àµà´±àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–',
'patrol-log-header' => 'റോനàµà´¤àµà´šàµà´±àµà´±à´ªàµà´ªàµ†à´Ÿàµà´Ÿ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† രേഖയാണിതàµ',
'patrol-log-line' => '$2 താളിലെ $1 റോനàµà´¤àµà´šàµà´±àµà´±à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ $3',
-'patrol-log-auto' => '(യാനàµà´¤àµà´°à´¿à´•à´‚)',
+'patrol-log-auto' => '(à´¸àµà´µà´¯à´‚)',
'patrol-log-diff' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ $1',
'log-show-hide-patrol' => 'റോനàµà´¤àµà´šàµà´±àµà´±àµ½ രേഖ $1',
@@ -2815,14 +2915,17 @@ $1',
'imagemaxsize' => "à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚:<br />''(à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വിവരണ താളàµà´•à´³à´¿àµ½)''",
'thumbsize' => 'ലഘàµà´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|താൾ|താളàµà´•àµ¾}}',
-'file-info' => '(à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $1, MIME തരം: $2)',
-'file-info-size' => '($1 × $2 പികàµà´¸àµ½, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3, MIME തരം: $4)',
+'file-info' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $1, മൈം തരം: $2',
+'file-info-size' => '$1 × $2 പികàµà´¸àµ½, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3, മൈം തരം: $4',
'file-nohires' => '<small>കൂടàµà´¤àµ½ à´µàµà´¯à´•àµà´¤à´¤à´¯àµà´³àµà´³ à´šà´¿à´¤àµà´°à´‚ ലഭàµà´¯à´®à´²àµà´².</small>',
-'svg-long-desc' => '(SVG à´ªàµà´°à´®à´¾à´£à´‚, നാമമാതàµà´°à´®à´¾à´¯ $1 × $2 പികàµà´¸à´²àµà´•àµ¾, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3)',
+'svg-long-desc' => 'SVG à´ªàµà´°à´®à´¾à´£à´‚, നാമമാതàµà´°à´®à´¾à´¯ $1 × $2 പികàµà´¸à´²àµà´•àµ¾, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3',
'show-big-image' => 'പൂർണàµà´£ റെസലൂഷൻ',
'show-big-image-thumb' => '<small>à´ˆ à´ªàµà´°à´¿à´µàµà´¯àµ‚വിനàµà´±àµ† വലിപàµà´ªà´‚: $1 × $2 പികàµà´¸à´²àµà´•àµ¾</small>',
'file-info-gif-looped' => 'à´ªàµà´¨à´°à´¾à´µàµ¼à´¤àµà´¤à´¿à´¤à´‚',
'file-info-gif-frames' => '{{PLURAL:$1|ഒരൠചടàµà´Ÿà´‚|$1 à´šà´Ÿàµà´Ÿà´™àµà´™àµ¾}}',
+'file-info-png-looped' => 'à´ªàµà´¨à´°à´¾à´µàµ¼à´¤àµà´¤à´¿à´¤à´‚',
+'file-info-png-repeat' => '{{PLURAL:$1|ഒരൠതവണ|$1 തവണ}} à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´ªàµà´ªà´¿à´šàµà´šàµ',
+'file-info-png-frames' => '{{PLURAL:$1|ഒരൠഫàµà´°àµ†à´¯à´¿à´‚|$1 à´«àµà´°àµ†à´¯à´¿à´‚}}',
# Special:NewFiles
'newimages' => 'à´ªàµà´¤à´¿à´¯ à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† ഗാലറി',
@@ -2970,6 +3073,7 @@ $1',
'exif-gpsareainformation' => 'GPS à´ªàµà´°à´¦àµ‡à´¶à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരàµâ€Œ',
'exif-gpsdatestamp' => 'GPS തീയതി',
'exif-gpsdifferential' => 'ജി.പി.à´Žà´¸àµ. à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ ശരിയാകàµà´•àµ½',
+'exif-objectname' => 'ചെറിയ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ',
# EXIF attributes
'exif-compression-1' => 'à´šàµà´°àµà´•àµà´•à´¾à´¤àµà´¤à´¤àµ',
@@ -3129,24 +3233,24 @@ $1',
'limitall' => 'à´Žà´²àµà´²à´¾à´‚',
# E-mail address confirmation
-'confirmemail' => 'ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµ½',
-'confirmemail_noemail' => '[[Special:Preferences|താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³àµà´Ÿàµ† കൂടെ]] സാധàµà´µà´¾à´¯àµŠà´°àµ ഇമെയിൽ വിലാസം സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
-'confirmemail_text' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ ഇമെയിൽ സൗകരàµà´¯à´‚ ഉപയോഗികàµà´•à´£à´®àµ†à´™àµà´•à´¿àµ½ താങàµà´•àµ¾ താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿à´¨àµà´±àµ† സാധàµà´¤ തെളിയിചàµà´šà´¿à´°à´¿à´•àµà´•à´£à´‚. താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ‡à´•àµà´•àµ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ മെയിൽ അയകàµà´•àµà´µà´¾àµ» താഴെയàµà´³àµà´³ ബടàµà´Ÿàµº അമർതàµà´¤àµà´•. താങàµà´•àµ¾à´•àµà´•àµ അയകàµà´•àµà´¨àµà´¨ ഇമെയിലിൽ ഒരൠസàµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠഉണàµà´Ÿàµ. à´† കോഡിൽ അമർതàµà´¤à´¿à´¯à´¾àµ½ താങàµà´•à´³àµà´Ÿàµ† വിലാസതàµà´¤à´¿à´¨àµà´±àµ† സാധàµà´¤ തെളിയികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.',
-'confirmemail_pending' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ à´ˆ à´…à´Ÿàµà´¤àµà´¤àµ ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯à´¤à´¾à´£àµ†à´™àµà´•à´¿àµ½, ഒരൠസàµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠതാങàµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ. à´ªàµà´¤à´¿à´¯ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠആവശàµà´¯à´ªàµà´ªàµ†à´Ÿà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ ആദàµà´¯à´¤àµà´¤àµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡിനായി à´•àµà´±à´šàµà´šàµ സമയം കാതàµà´¤à´¿à´°à´¿à´•àµà´•àµ‚.',
-'confirmemail_send' => 'à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠ(confirmation code) മെയിൽ ചെയàµà´¯àµà´•',
-'confirmemail_sent' => 'à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ ഇമെയിൽ അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
-'confirmemail_oncreate' => 'ഒരൠസàµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠതാങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ‡à´•àµà´•àµ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.
+'confirmemail' => 'ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµ½',
+'confirmemail_noemail' => '[[Special:Preferences|താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³àµà´Ÿàµ† കൂടെ]] സാധàµà´µà´¾à´¯àµŠà´°àµ ഇമെയിൽ വിലാസം സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'confirmemail_text' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ ഇമെയിൽ സൗകരàµà´¯à´‚ ഉപയോഗികàµà´•à´£à´®àµ†à´™àµà´•à´¿àµ½ താങàµà´•àµ¾ താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿à´¨àµà´±àµ† സാധàµà´¤ തെളിയിചàµà´šà´¿à´°à´¿à´•àµà´•à´£à´‚. താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ‡à´•àµà´•àµ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ മെയിൽ അയകàµà´•àµà´µà´¾àµ» താഴെയàµà´³àµà´³ ബടàµà´Ÿàµº അമർതàµà´¤àµà´•. താങàµà´•àµ¾à´•àµà´•àµ അയകàµà´•àµà´¨àµà´¨ ഇമെയിലിൽ ഒരൠസàµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠഉണàµà´Ÿàµ. à´† കോഡിൽ അമർതàµà´¤à´¿à´¯à´¾àµ½ താങàµà´•à´³àµà´Ÿàµ† വിലാസതàµà´¤à´¿à´¨àµà´±àµ† സാധàµà´¤ തെളിയികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.',
+'confirmemail_pending' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ à´ˆ à´…à´Ÿàµà´¤àµà´¤àµ ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯à´¤à´¾à´£àµ†à´™àµà´•à´¿àµ½, ഒരൠസàµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠതാങàµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ. à´ªàµà´¤à´¿à´¯ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠആവശàµà´¯à´ªàµà´ªàµ†à´Ÿà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ ആദàµà´¯à´¤àµà´¤àµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡിനായി à´•àµà´±à´šàµà´šàµ സമയം കാതàµà´¤à´¿à´°à´¿à´•àµà´•àµ‚.',
+'confirmemail_send' => 'à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠ(confirmation code) മെയിൽ ചെയàµà´¯àµà´•',
+'confirmemail_sent' => 'à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ ഇമെയിൽ അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'confirmemail_oncreate' => 'ഒരൠസàµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠതാങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ‡à´•àµà´•àµ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.
ലോഗിൻ ചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´ˆ കോഡൠആവശàµà´¯à´®à´¿à´²àµà´². പകàµà´·àµ† വികàµà´•à´¿à´¯à´¿àµ½ ഇമെയിലàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ സേവനങàµà´™àµ¾ ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ à´ªàµà´°à´¸àµà´¤àµà´¤ കോഡൠഉപയോഗിചàµà´šàµ ഇമെയിൽ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•à´£à´‚.',
-'confirmemail_sendfailed' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿à´¨àµâ€Œ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ ഇമെയിൽ അയകàµà´•àµà´µà´¾àµ» സാധിചàµà´šà´¿à´²àµà´². വിലാസതàµà´¤à´¿àµ½ സാധàµà´µà´²àµà´²à´¾à´¤àµà´¤ à´…à´•àµà´·à´°à´™àµà´™àµ¾ ഉണàµà´Ÿàµ‹ à´Žà´¨àµà´¨àµ ദയവായി പരിശോധികàµà´•àµà´•.
+'confirmemail_sendfailed' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿à´¨àµâ€Œ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ ഇമെയിൽ അയകàµà´•àµà´µà´¾àµ» സാധിചàµà´šà´¿à´²àµà´². വിലാസതàµà´¤à´¿àµ½ സാധàµà´µà´²àµà´²à´¾à´¤àµà´¤ à´…à´•àµà´·à´°à´™àµà´™àµ¾ ഉണàµà´Ÿàµ‹ à´Žà´¨àµà´¨àµ ദയവായി പരിശോധികàµà´•àµà´•.
ഇമെയിൽ അയകàµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´šà´ªàµà´ªàµ‹àµ¾ ലഭിചàµà´š മറàµà´ªà´Ÿà´¿: $1',
-'confirmemail_invalid' => 'അസാധàµà´µà´¾à´¯ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡàµ. കോഡിനàµà´±àµ† കാലാവധി തീർനàµà´¨à´¿à´°à´¿à´•àµà´•à´£à´‚.',
-'confirmemail_needlogin' => 'ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´¾àµ» താങàµà´•àµ¾ $1 ചെയàµà´¤à´¿à´°à´¿à´•àµà´•à´£à´‚.',
-'confirmemail_success' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. താങàµà´•àµ¾à´•àµà´•àµ ഇനി [[Special:UserLogin|ലോഗിൻ ചെയàµà´¤àµ]] വികàµà´•à´¿ ആസàµà´µà´¦à´¿à´•àµà´•à´¾à´‚.',
-'confirmemail_loggedin' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
-'confirmemail_error' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ സൂകàµà´·à´¿à´šàµà´šàµà´µà´¯àµà´•àµà´•à´¾à´¨àµà´³àµà´³ à´¶àµà´°à´®à´¤àµà´¤à´¿à´¨à´¿à´Ÿà´¯àµà´•àµà´•àµ à´Žà´¨àµà´¤àµ‹ പിഴവൠസംഭവിചàµà´šàµ.',
-'confirmemail_subject' => '{{SITENAME}} ഇമെയിൽ വിലാസ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚',
-'confirmemail_body' => '$1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½ നിനàµà´¨àµ (ഒരൠപകàµà´·àµ† താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚), "$2" à´Žà´¨àµà´¨ പേരോടൠകൂടിയàµà´‚ à´ˆ ഇമെയിൽ വിലാസതàµà´¤àµ‹à´Ÿàµ കൂടിയàµà´‚ {{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ ഒരൠഅംഗതàµà´µà´‚ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+'confirmemail_invalid' => 'അസാധàµà´µà´¾à´¯ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡàµ. കോഡിനàµà´±àµ† കാലാവധി തീർനàµà´¨à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+'confirmemail_needlogin' => 'ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´¾àµ» താങàµà´•àµ¾ $1 ചെയàµà´¤à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+'confirmemail_success' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. താങàµà´•àµ¾à´•àµà´•àµ ഇനി [[Special:UserLogin|ലോഗിൻ ചെയàµà´¤àµ]] വികàµà´•à´¿ ആസàµà´µà´¦à´¿à´•àµà´•à´¾à´‚.',
+'confirmemail_loggedin' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'confirmemail_error' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ സൂകàµà´·à´¿à´šàµà´šàµà´µà´¯àµà´•àµà´•à´¾à´¨àµà´³àµà´³ à´¶àµà´°à´®à´¤àµà´¤à´¿à´¨à´¿à´Ÿà´¯àµà´•àµà´•àµ à´Žà´¨àµà´¤àµ‹ പിഴവൠസംഭവിചàµà´šàµ.',
+'confirmemail_subject' => '{{SITENAME}} ഇമെയിൽ വിലാസ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚',
+'confirmemail_body' => '$1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½ നിനàµà´¨àµ (ഒരൠപകàµà´·àµ† താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚), "$2" à´Žà´¨àµà´¨ പേരോടൠകൂടിയàµà´‚ à´ˆ ഇമെയിൽ വിലാസതàµà´¤àµ‹à´Ÿàµ കൂടിയàµà´‚ {{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ ഒരൠഅംഗതàµà´µà´‚ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
à´ˆ à´…à´‚à´—à´¤àµà´µà´‚ താങàµà´•à´³àµà´Ÿàµ‡à´¤à´¾à´£àµâ€Œ à´Žà´¨àµà´¨àµ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´µà´¾à´¨àµà´‚ {{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ ഇമെയിലàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ സേവനങàµà´™àµ¾ ഉപയോഗികàµà´•àµà´µà´¾à´¨àµà´‚ താഴെ കാണàµà´¨àµà´¨ à´•à´£àµà´£à´¿ à´¬àµà´°àµ—സറിൽ à´¤àµà´±à´•àµà´•àµà´•.
@@ -3158,8 +3262,33 @@ $5
à´ˆ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡിനàµà´±àµ† കാലാവധി $4 നൠതീരàµà´‚.',
-'confirmemail_invalidated' => 'ഇമെയിൽ വിലാസതàµà´¤à´¿à´¨àµà´±àµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ റദàµà´¦à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'invalidateemail' => 'ഇമെയിൽ വിലാസ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ റദàµà´¦à´¾à´•àµà´•àµà´•',
+'confirmemail_body_changed' => '$1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½ നിനàµà´¨àµà´‚ ആരോ ഒരാൾ, മികàµà´•à´µà´¾à´±àµà´‚ താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚, {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† "$2" à´Žà´¨àµà´¨ à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´±àµ† ഇമെയിൽ വിലാസം, à´ˆ വിലാസമായി മാറàµà´±à´¿ നൽകിയിരികàµà´•àµà´¨àµà´¨àµ.
+
+à´ˆ à´…à´‚à´—à´¤àµà´µà´‚ ശരികàµà´•àµà´‚ താങàµà´•à´³àµà´Ÿàµ‡à´¤à´¾à´£àµ†à´¨àµà´¨àµ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´¾à´¨àµà´‚, {{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ ഇമെയിൽ സൗകരàµà´¯à´™àµà´™àµ¾ à´ªàµà´¨àµ¼à´¸à´œàµà´œà´®à´¾à´•àµà´•à´¾à´¨àµà´‚, താങàµà´•à´³àµà´Ÿàµ† à´¬àµà´°àµ—സറിൽ ഇനി നൽകàµà´¨àµà´¨ à´•à´£àµà´£à´¿ à´¤àµà´±à´•àµà´•àµà´•:
+
+$3
+
+അംഗതം താങàµà´•à´³àµà´Ÿàµ†à´¤àµ *à´…à´²àµà´²* à´Žà´¨àµà´¨àµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ ഇമെയിൽ വിലാസതàµà´¤à´¿à´¨àµà´±àµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ റദàµà´¦à´¾à´•àµà´•àµà´µà´¾àµ» താഴെ നൽകിയിരികàµà´•àµà´¨àµà´¨ à´•à´£àµà´£à´¿ പരിശോധികàµà´•àµà´•:
+
+$5
+
+à´ˆ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ സൗകരàµà´¯à´‚ $4-നൠഅവസാനികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'confirmemail_body_set' => '$1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½ നിനàµà´¨àµà´‚ ആരോ ഒരാൾ, മികàµà´•à´µà´¾à´±àµà´‚ താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚,
+{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† "$2" à´Žà´¨àµà´¨ à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´±àµ† ഇമെയിൽ വിലാസമായി à´ˆ വിലാസം നൽകിയിരികàµà´•àµà´¨àµà´¨àµ.
+
+{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† à´ˆ à´…à´‚à´—à´¤àµà´µà´‚ താങàµà´•à´³àµà´Ÿàµ† തനàµà´¨àµ†à´¯à´¾à´£àµ†à´¨àµà´¨àµ ഉറപàµà´ªà´¾à´•àµà´•à´¾à´¨àµà´‚,
+ഇമെയിൽ സൗകരàµà´¯à´™àµà´™àµ¾ വീണàµà´Ÿàµà´‚ സജàµà´œà´®à´¾à´•àµà´•à´¾à´¨àµà´‚ à´ˆ à´•à´£àµà´£à´¿ à´¬àµà´°àµ—സറിൽ à´¤àµà´±à´•àµà´•àµà´•:
+
+$3
+
+à´ˆ à´…à´‚à´—à´¤àµà´µà´‚ താങàµà´•à´³àµà´Ÿàµ‡à´¤àµ *à´…à´²àµà´²* à´Žà´™àµà´•à´¿àµ½
+ഇമെയിൽ വിലാസ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ റദàµà´¦à´¾à´•àµà´•à´¾àµ» താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´•à´£àµà´£à´¿ ഉപയോഗികàµà´•àµà´•:
+
+$5
+
+à´ˆ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£ കോഡൠ$4-നൠകാലഹരണപàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'confirmemail_invalidated' => 'ഇമെയിൽ വിലാസതàµà´¤à´¿à´¨àµà´±àµ† à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ റദàµà´¦à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'invalidateemail' => 'ഇമെയിൽ വിലാസ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚ റദàµà´¦à´¾à´•àµà´•àµà´•',
# Scary transclusion
'scarytranscludedisabled' => '[à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ സജàµà´œà´®à´²àµà´²]',
@@ -3199,6 +3328,7 @@ $1',
'table_pager_first' => 'ആദàµà´¯à´¤à´¾àµ¾',
'table_pager_last' => 'അവസാന താൾ',
'table_pager_limit' => 'ഓരോ താളിലàµà´‚ $1 ഇനങàµà´™àµ¾ വീതം à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+'table_pager_limit_label' => 'ഓരോ താളിലàµà´®àµà´³àµà´³ ഇനങàµà´™àµ¾:',
'table_pager_limit_submit' => 'പോകൂ',
'table_pager_empty' => 'ഫലങàµà´™àµ¾ à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²',
@@ -3253,6 +3383,7 @@ $1',
'version-specialpages' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾',
'version-parserhooks' => 'പാഴàµâ€Œà´¸àµ¼ കൊളàµà´¤àµà´¤àµà´•àµ¾',
'version-variables' => 'à´šà´°à´™àµà´™àµ¾',
+'version-skins' => 'ദൃശàµà´¯à´°àµ‚പങàµà´™àµ¾',
'version-other' => 'മറàµà´±àµà´³àµà´³à´µ',
'version-mediahandlers' => 'മീഡിയ കൈകാരàµà´¯àµ‹à´ªà´•à´°à´£à´™àµà´™àµ¾',
'version-hooks' => 'കൊളàµà´¤àµà´¤àµà´•àµ¾',
@@ -3264,6 +3395,13 @@ $1',
'version-hook-subscribedby' => 'വരികàµà´•à´¾à´°à´¨à´¾à´¯à´¤àµ',
'version-version' => '(പതിപàµà´ªàµ $1)',
'version-license' => 'à´…à´¨àµà´®à´¤à´¿',
+'version-poweredby-credits' => "à´ˆ വികàµà´•à´¿ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•à´¾àµ» '''[http://www.mediawiki.org/ മീഡിയവികàµà´•à´¿]''' ഉപയോഗികàµà´•àµà´¨àµà´¨àµ. പകർപàµà´ªà´µà´•à´¾à´¶à´‚ © 2001-$1 $2.",
+'version-poweredby-others' => 'മറàµà´±àµà´³àµà´³à´µàµ¼',
+'version-license-info' => 'മീഡിയവികàµà´•à´¿ ഒരൠസàµà´µà´¤à´¨àµà´¤àµà´° സോഫàµà´±àµà´±àµâ€Œà´µàµ‡à´±à´¾à´£àµ; à´¸àµà´µà´¤à´¨àµà´¤àµà´° സോഫàµà´±àµà´±àµâ€Œà´µàµ‡àµ¼ ഫൗണàµà´Ÿàµ‡à´·àµ» à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ à´—àµà´¨àµ സാർവàµà´µà´œà´¨à´¿à´• à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† പതിപàµà´ªàµ 2 à´ªàµà´°à´•à´¾à´°à´®àµ‹, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ (താങàµà´•à´³àµà´Ÿàµ† ഇചàµà´›à´¾à´¨àµà´¸à´°à´£à´‚) പിനàµà´¨àµ€à´Ÿàµ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´š à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ പതിപàµà´ªàµ à´ªàµà´°à´•à´¾à´°à´®àµ‹ താങàµà´•àµ¾à´•àµà´•à´¿à´¤àµ à´ªàµà´¨àµ¼à´µà´¿à´¤à´°à´£à´‚ ചെയàµà´¯à´¾à´¨àµà´‚ à´’à´ªàµà´ªà´‚/à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ മാറàµà´±à´™àµà´™àµ¾ വരàµà´¤àµà´¤à´¾à´¨àµà´‚ സാധികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.
+
+മീഡിയവികàµà´•à´¿ താങàµà´•àµ¾à´•àµà´•àµà´ªà´•à´°à´¿à´•àµà´•àµà´®àµ†à´¨àµà´¨ à´ªàµà´°à´¤àµ€à´•àµà´·à´¯àµ‹à´Ÿàµ†à´¯à´¾à´£àµ വിതരണം ചെയàµà´¯àµà´¨àµà´¨à´¤àµ, പകàµà´·àµ‡ യാതൊരൠഗàµà´£à´®àµ‡à´¨àµà´®àµ‹à´¤àµà´¤à´°à´µà´¾à´¦à´¿à´¤àµà´¤à´µàµà´‚ വഹികàµà´•àµà´¨àµà´¨à´¿à´²àµà´²; à´µàµà´¯à´¾à´ªà´¾à´°à´¯àµ‹à´—àµà´¯à´®àµ†à´¨àµà´¨àµ‹ à´ªàµà´°à´¤àµà´¯àµ‡à´• ഉപയോഗതàµà´¤à´¿à´¨àµ à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®àµ†à´¨àµà´¨àµ‹ ഉളàµà´³ യാതൊരൠഗàµà´£à´®àµ‡à´¨àµà´®àµ‹à´¤àµà´¤à´°à´µà´¾à´¦à´¿à´¤àµà´¤à´µàµà´‚ ഇതൠഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨à´¿à´²àµà´². കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾à´•àµà´•àµ à´—àµà´¨àµ സാർവàµà´µ ജനിക à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´‚ കാണàµà´•.
+
+à´ˆ à´ªàµà´°àµ‹à´—àµà´°à´¾à´®à´¿à´¨àµŠà´ªàµà´ªà´‚ [{{SERVER}}{{SCRIPTPATH}}/COPYING à´—àµà´¨àµ സാർവàµà´µà´œà´¨à´¿à´• à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† ഒരൠപകർപàµà´ªàµ] താങàµà´•àµ¾à´•àµà´•àµ ലഭിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´‚; ഇലàµà´²àµ†à´™àµà´•à´¿àµ½ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à´Žà´¨àµà´¨ വിലാസതàµà´¤à´¿à´²àµ†à´´àµà´¤àµà´• à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´‚ ഓൺലൈൻ ആയി വായികàµà´•àµà´•].',
'version-software' => 'ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¤ സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯àµ¼',
'version-software-product' => 'സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯àµ¼ ഉലàµà´ªàµà´ªà´¨àµà´¨à´‚',
'version-software-version' => 'വിവരണം',
@@ -3292,7 +3430,7 @@ $1',
# Special:SpecialPages
'specialpages' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾',
'specialpages-note' => '----
-* സർവോപയോഗ à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾.
+* സർവàµà´µàµ‹à´ªà´¯àµ‹à´— à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾.
* <strong class="mw-specialpagerestricted">ഉപയോഗം പരിമിതപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾.</strong>',
'specialpages-group-maintenance' => 'പരിചരണം ആവശàµà´¯à´®à´¾à´¯à´µ',
'specialpages-group-other' => 'മറàµà´±àµ à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾',
@@ -3334,6 +3472,15 @@ $1',
'tags-edit' => 'തിരàµà´¤àµà´¤àµà´•',
'tags-hitcount' => '{{PLURAL:$1|ഒരൠമാറàµà´±à´‚|$1 മാറàµà´±à´™àµà´™àµ¾}}',
+# Special:ComparePages
+'comparepages' => 'താളàµà´•àµ¾ താരതമàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
+'compare-selector' => 'താളിനàµà´±àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾ താരതമàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
+'compare-page1' => 'താൾ 1',
+'compare-page2' => 'താൾ 2',
+'compare-rev1' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ 1',
+'compare-rev2' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ 2',
+'compare-submit' => 'താരതമàµà´¯à´‚ ചെയàµà´¯àµà´•',
+
# Database error messages
'dberr-header' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ à´ªàµà´°à´¶àµà´¨à´®àµà´£àµà´Ÿàµ',
'dberr-problems' => 'à´•àµà´·à´®à´¿à´•àµà´•à´£à´‚! à´ˆ സൈറàµà´±à´¿àµ½ സങàµà´•àµ‡à´¤à´¿à´• തകരാറàµà´•àµ¾ à´…à´¨àµà´­à´µà´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµà´£àµà´Ÿàµ.',
@@ -3350,8 +3497,13 @@ $1',
'htmlform-float-invalid' => 'താങàµà´•àµ¾ നൽകിയ വില ഒരൠഅകàµà´•à´®à´²àµà´².',
'htmlform-int-toolow' => 'താങàµà´•àµ¾ നൽകിയതൠà´à´±àµà´±à´µàµà´‚ à´•àµà´±à´žàµà´ž വിലയായ $1-നൠതാഴെയാണàµ',
'htmlform-int-toohigh' => 'താങàµà´•àµ¾ നൽകിയതൠà´à´±àµà´±à´µàµà´‚ കൂടിയ വിലയായ $1-നൠമàµà´•à´³à´¿à´²à´¾à´£àµ',
+'htmlform-required' => 'à´ˆ മൂലàµà´¯à´‚ ആവശàµà´¯à´®à´¾à´£àµ',
'htmlform-submit' => 'സമർപàµà´ªà´¿à´•àµà´•àµà´•',
'htmlform-reset' => 'മാറàµà´±à´™àµà´™àµ¾ വേണàµà´Ÿ',
'htmlform-selectorother-other' => 'മറàµà´±àµà´³àµà´³à´µ',
+# SQLite database support
+'sqlite-has-fts' => 'പൂർണàµà´£-à´Žà´´àµà´¤àµà´¤àµ തിരചàµà´šà´¿àµ½ പിനàµà´¤àµà´£à´¯àµà´³àµà´³ $1',
+'sqlite-no-fts' => 'പൂർണàµà´£-à´Žà´´àµà´¤àµà´¤àµ തിരചàµà´šà´¿àµ½ പിനàµà´¤àµà´£à´¯à´¿à´²àµà´²à´¾à´¤àµà´¤ $1',
+
);
diff --git a/languages/messages/MessagesMn.php b/languages/messages/MessagesMn.php
index 528e7714..f82ee3a0 100644
--- a/languages/messages/MessagesMn.php
+++ b/languages/messages/MessagesMn.php
@@ -20,8 +20,8 @@ $namespaceNames = array(
NS_USER => 'Ð¥ÑÑ€ÑглÑгч',
NS_USER_TALK => 'Ð¥ÑÑ€ÑглÑгчийн_Ñриа',
NS_PROJECT_TALK => '$1-н_Ñ…ÑлÑлцүүлÑг',
- NS_FILE => 'Зураг',
- NS_FILE_TALK => 'Зургийн_Ñ…ÑлÑлцүүлÑг',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файлын_Ñ…ÑлÑлцүүлÑг',
NS_MEDIAWIKI => 'МедиаВики',
NS_MEDIAWIKI_TALK => 'МедиаВикигийн_Ñ…ÑлÑлцүүлÑг',
NS_TEMPLATE => 'Загвар',
@@ -32,6 +32,11 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Ðнгиллын_Ñ…ÑлÑлцүүлÑг',
);
+$namespaceAliases = array(
+ 'Зураг' => NS_FILE,
+ 'Зургийн_Ñ…ÑлÑлцүүлÑг' => NS_FILE_TALK,
+);
+
$linkTrail = '/^([a-zабвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ“»]+)(.*)$/sDu';
$messages = array(
@@ -50,8 +55,7 @@ $messages = array(
'tog-editsection' => '[ЗаÑварлах] линкÑÑÑ€ Ñ…ÑÑгийг заÑварладаг болгох',
'tog-editsectiononrightclick' => 'Ð¥ÑÑгийн гарчиг дÑÑÑ€ баруун товчлуураар дарж заÑварладаг болгох (ЖаваСкрипт)',
'tog-showtoc' => 'Ðгуулгын Ñ…Ò¯ÑнÑгтийг үзүүлÑÑ… (3-Ñ Ð¸Ð»Ò¯Ò¯ Ñ…ÑÑÑгтÑй хуудÑуудад)',
-'tog-rememberpassword' => 'Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ дахь нÑвтрÑлийг Ñанах',
-'tog-editwidth' => 'ДÑлгÑцийг дүүргÑÑ…ÑÑÑ€ заÑварлах талбарыг өргөтгөх',
+'tog-rememberpassword' => 'ЭнÑÑ…Ò¯Ò¯ хөтөч дÑÑрх нÑвтрÑлтийг Ñанах (хамгийн ихдÑÑ $1 {{PLURAL:$1|өдрийн|өдрийн}} турш)',
'tog-watchcreations' => 'Миний Ò¯Ò¯ÑгÑÑÑн хуудÑуудыг Ñ…Ñнах жагÑаалтанд оруулах',
'tog-watchdefault' => 'Миний заÑварлаÑан хуудÑуудыг Ñ…Ñнах жагÑаалтанд оруулах',
'tog-watchmoves' => 'Миний зөөÑөн хуудÑуудыг Ñ…Ñнах жагÑаалтанд оруулах',
@@ -195,31 +199,21 @@ $messages = array(
'faqpage' => 'Project:Тогтмол тавигддаг аÑуултууд',
# Vector skin
-'vector-action-addsection' => 'СÑдÑв нÑмÑÑ…',
-'vector-action-delete' => 'УÑтгах',
-'vector-action-move' => 'Зөөх',
-'vector-action-protect' => 'Хамгаалах',
-'vector-action-undelete' => 'Үл уÑтгах',
-'vector-action-unprotect' => 'Үл хамгаалах',
-'vector-namespace-category' => 'Ðнгилал',
-'vector-namespace-help' => 'ТуÑламжийн хуудаÑ',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'ХуудаÑ',
-'vector-namespace-media' => 'Медиа хуудаÑ',
-'vector-namespace-mediawiki' => 'МеÑÑеж',
-'vector-namespace-project' => 'ТөÑлийн хуудаÑ',
-'vector-namespace-special' => 'ТуÑгай хуудаÑ',
-'vector-namespace-talk' => 'Ð¥ÑлÑлцүүлÑг',
-'vector-namespace-template' => 'Загвар',
-'vector-namespace-user' => 'Ð¥ÑÑ€ÑглÑгчийн хуудаÑ',
-'vector-view-create' => 'Ò®Ò¯ÑгÑÑ…',
-'vector-view-edit' => 'ЗаÑварлах',
-'vector-view-history' => 'Түүхийг үзÑÑ…',
-'vector-view-view' => 'Унших',
-'vector-view-viewsource' => 'Кодыг харах',
-'actions' => 'Үйлдлүүд',
-'namespaces' => 'ÐÑрний зайнууд',
-'variants' => 'Хувилбарууд',
+'vector-action-addsection' => 'СÑдÑв нÑмÑÑ…',
+'vector-action-delete' => 'УÑтгах',
+'vector-action-move' => 'Зөөх',
+'vector-action-protect' => 'Хамгаалах',
+'vector-action-undelete' => 'Үл уÑтгах',
+'vector-action-unprotect' => 'Үл хамгаалах',
+'vector-simplesearch-preference' => 'Хайлтын ÑайжруулÑан Ñаналыг идÑвхижүүлÑÑ… (зөвхөн Вектор Ñкин)',
+'vector-view-create' => 'Ò®Ò¯ÑгÑÑ…',
+'vector-view-edit' => 'ЗаÑварлах',
+'vector-view-history' => 'Түүхийг үзÑÑ…',
+'vector-view-view' => 'Унших',
+'vector-view-viewsource' => 'Кодыг харах',
+'actions' => 'Үйлдлүүд',
+'namespaces' => 'ÐÑрний зайнууд',
+'variants' => 'Хувилбарууд',
'errorpagetitle' => 'Aлдаа',
'returnto' => '$1 руу буцах.',
@@ -280,6 +274,9 @@ $messages = array(
Дахин ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÑ‚ хандахынхаа өмнө түр хугацаагаар хүлÑÑÐ½Ñ Ò¯Ò¯.
$1',
+'pool-timeout' => 'ТүгжÑÑг хүлÑÑÑ… Ñвцад хугацаа дууÑав',
+'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}}-н тухай',
@@ -444,7 +441,7 @@ $2',
'yourname' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
'yourpassword' => 'Ðууц үг:',
'yourpasswordagain' => 'Ðууц үгÑÑ Ð´Ð°Ñ…Ð¸Ð½ оруулах:',
-'remembermypassword' => 'Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ дÑÑрх миний нÑвтрÑлийг Ñана',
+'remembermypassword' => 'Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ дÑÑрх миний нÑвтрÑлтийг Ñана (хамгийн дÑÑд талдаа $1 {{PLURAL:$1|өдрийн|өдрийн}} туршид)',
'yourdomainname' => 'Таны домÑйн:',
'externaldberror' => 'ÐÑг бол гадны баталгаажуулах мÑдÑÑллийн Ñангийн алдаа гарÑан, ÑÑвÑл та өөрийн гадны бүртгÑлÑÑ ÑˆÐ¸Ð½ÑчлÑÑ… Ñрхгүй байна.',
'login' => 'ÐÑвтрÑÑ…',
@@ -461,6 +458,7 @@ $2',
'gotaccount' => "Та бүртгÑлтÑй юу? '''$1'''",
'gotaccountlink' => 'ÐÑвтрÑÑ…',
'createaccountmail' => 'ÐœÑйлÑÑÑ€ илгÑÑÑ…',
+'createaccountreason' => 'Шалтгаан:',
'badretype' => 'Таны оруулÑан хоёр нууц үг таарахгүй байна.',
'userexists' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ашиглагдаж байна.
Ó¨Ó©Ñ€ нÑÑ€ Ñонгоно уу.',
@@ -578,11 +576,12 @@ $2',
'showdiff' => 'Өөрчлөлтүүдийг харуул',
'anoneditwarning' => "'''Ðнхаар:''' Та нÑвтрÑÑгүй байна.
Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны заÑварын түүхÑнд таны IP хаÑг хадгалагдана.",
+'anonpreviewwarning' => "''Та нÑвтрÑÑгүй байна. Хадгалвал ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны түүхÑнд таны IP хаÑг бичигдлÑÑ… болно.''",
'missingsummary' => "'''Сануулга:''' Та заÑварынхаа товч агуулгын тухай оруулаагүй байна.
Ð¥ÑÑ€Ñв та Хадгалах товчийг дахин дарвал таны заÑвар товч агуулгагүйгÑÑÑ€ хадгалагдана.",
'missingcommenttext' => 'Доор Ñанал бодлоо оруулна уу.',
-'missingcommentheader' => "'''Сануулга:''' Та ÑÐ½Ñ Ñанал бодлынхоо гарчигийг бичÑÑгүй байна.
-Ð¥ÑÑ€Ñв та Хадгалах товчийг дахин дарвал таны заÑвар гарчиггүй хадгалагдах болно.",
+'missingcommentheader' => "'''Сануулга:''' Та ÑнÑÑ…Ò¯Ò¯ Ñанал бодолдоо гарчиг бичÑÑгүй байна.
+Ð¥ÑÑ€Ñв та {{int:savearticle}} дÑÑÑ€ дахин дарвал таны заÑвар гарчиггүй хадгалагдах болно.",
'summary-preview' => 'Товч агуулгын урьдчилж харÑан байдал:',
'subject-preview' => 'СÑдÑв/гарчигийн урьдчилж харÑан байдал:',
'blockedtitle' => 'Ð¥ÑÑ€ÑглÑгч түгжигдлÑÑ.',
@@ -657,7 +656,7 @@ $2',
'''Хараахан хадгалагдаагүй байгаа гÑдгийг анхаарна уу!'''",
'userjspreview' => "'''Та өөрийн Ñ…ÑÑ€ÑглÑгчийн ЖаваСкриптийг зөвхөн урьдчилан харж байгаа бөгөөд ÑÐ½Ñ Ð½ÑŒ хараахан хадгалагдаагүй байгаа гÑдгийг анхаарна уу!'''",
'userinvalidcssjstitle' => "'''Ðнхаар:''' \"\$1\" гÑÑÑн Ð°Ñ€ÑŒÑ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹ байна.
-Ó¨Ó©Ñ€Ñдийн .css болон .js хуудÑуудыг нÑрлÑÑ…Ñд жижиг Ò¯ÑÑг Ñ…ÑÑ€ÑглÑдÑг болохыг Ñануулж байна. ЖишÑÑ Ð½ÑŒ: {{ns:user}}:Foo/monobook.css гÑж л Ñ…ÑÑ€ÑглÑÑ… бөгөөд {{ns:user}}:Foo/Monobook.css гÑхгүй.",
+Ó¨Ó©Ñ€Ñдийн .css болон .js хуудÑуудыг нÑрлÑÑ…Ñд жижиг Ò¯ÑÑг Ñ…ÑÑ€ÑглÑдÑг болохыг Ñануулж байна. ЖишÑÑ Ð½ÑŒ: {{ns:user}}:Foo/vector.css гÑж л Ñ…ÑÑ€ÑглÑÑ… бөгөөд {{ns:user}}:Foo/Vector.css гÑхгүй.",
'updated' => '(ШинÑчлÑгдÑÑн)',
'note' => "'''Ðнхааруулга:'''",
'previewnote' => "'''Ð­Ð½Ñ Ð±Ð¾Ð» зөвхөн урьдчилж харÑан байдал; заÑварууд одоохондоо хадгалагдаагүй байна!'''",
@@ -694,8 +693,6 @@ $2',
Ð¥ÑÑ€Ñв та өөрийн хувь нÑмрÑÑ Ð±ÑƒÑдад заÑварлуулах, тараагдуулахыг Ñ…Ò¯ÑÑхгүй байгаа бол Ñнд битгий оруулаарай.<br />
Та мөн үүнийг Ó©Ó©Ñ€Ó©Ó© бичÑÑн, ÑÑвÑл нийтийн өмчид тавигдÑан буюу үүнтÑй адилтгаж болох ÑÐ°Ð½Ð³Ð°Ð°Ñ Ñ…ÑƒÑƒÐ»Ð¶ тавьÑан бүтÑÑл гÑдгÑÑ Ð°Ð¼Ð»Ð°Ñан байгааг анхаараарай (дÑлгÑÑ€Ñнгүй мÑдÑÑллийг $1-Ñ Ð°Ð²Ð½Ð° уу).
'''ЗОХИОГЧИЙРЭРХ БҮХИЙ БҮТЭЭЛИЙГ ЗӨВШӨӨРӨЛГҮЙГЭЭР ТÐВИХИЙГ ХОРИГЛОÐО!'''",
-'longpagewarning' => "'''ÐÐÐ¥ÐÐР: Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ $1 килобайт урттай байна; зарим броузеруудад 32 килобайт орчим буюу түүнÑÑÑ ÑƒÑ€Ñ‚ хуудÑыг заÑварлахад хүндрÑлтÑй байж магадгүй.
-ХуудÑыг жижиг Ñ…ÑÑгүүдÑд хувааж заÑварлахыг Ñанал болгоё.'''",
'longpageerror' => "'''ÐЛДÐÐ: Таны оруулÑан текÑÑ‚ нь $1 килобайт урттай байгаа бөгөөд ÑÐ½Ñ Ð½ÑŒ дÑÑд Ñ…ÑмжÑÑ Ð±Ð¾Ð»Ð¾Ñ… $2 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ‚Ð°Ð°Ñ Ð¸Ð»Ò¯Ò¯ урт байна.
Хадгалах боломгүй байна.'''",
'readonlywarning' => "'''ÐÐÐ¥ÐÐР: ÐœÑдÑÑллийн Ñан нь техникийн үзлÑг хийхÑÑÑ€ түр зуур түгжигдÑÑн байгаа тул та одоохондоо заÑваруудаа хадгалах боломжгүй байна.
@@ -876,6 +873,8 @@ $1",
'logdelete-failure' => "'''Логийн үзÑгдÑÑ… байдлыг тохируулж чадÑангүй:'''
$1",
'revdel-restore' => 'Харагдах байдлыг өөрчлөх',
+'revdel-restore-deleted' => 'уÑтгагдÑан заÑварууд',
+'revdel-restore-visible' => 'үзÑгдÑÑ… заÑварууд',
'pagehist' => 'ХуудаÑны түүх',
'deletedhist' => 'УÑтгагдÑан түүх',
'revdelete-content' => 'агуулга',
@@ -946,11 +945,13 @@ $1",
# Diffs
'history-title' => '"$1"-н заÑварын түүх',
'difference' => '(ЗаÑварууд хоорондын Ñлгаа)',
+'difference-multipage' => '(ХуудÑууд хоорондын Ñлгаа)',
'lineno' => '$1-р мөр:',
'compareselectedversions' => 'СонгоÑон хувилбаруудыг харьцуулах',
'showhideselectedversions' => 'СонгоÑон хувилбаруудыг үзүүлÑÑ…/нуух',
'editundo' => 'цуцлах',
-'diff-multi' => 'ЗавÑрын $1 заÑварыг үзүүлÑÑгүй байна.',
+'diff-multi' => '({{PLURAL:$2|ÐÑг Ñ…ÑÑ€ÑглÑгчийн|$2 Ñ…ÑÑ€ÑглÑгчийн}} завÑрын {{PLURAL:$1|нÑг заÑварыг|$1 заÑварыг}} үзүүлÑÑгүй)',
+'diff-multi-manyusers' => '($2 гаруй {{PLURAL:$2|Ñ…ÑÑ€ÑглÑгчийн}} {{PLURAL:$1|дундын нÑг заÑварыг|дундын $1 заÑварыг}} үзүүлÑÑнгүй)',
# Search results
'searchresults' => 'Хайлтын үр дүн',
@@ -985,6 +986,7 @@ $1",
'searchprofile-everything-tooltip' => 'Бүх Ð°Ð³ÑƒÑƒÐ»Ð³Ð°Ð°Ñ Ñ…Ð°Ð¹Ñ… (үүнд Ñрианы хуудÑуудыг оролцуулах)',
'searchprofile-advanced-tooltip' => 'СонгоÑон нÑрний Ð·Ð°Ð¹Ð½ÑƒÑƒÐ´Ð°Ð°Ñ Ñ…Ð°Ð¹Ñ…',
'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)',
'search-section' => '(Ð¥ÑÑÑг $1)',
@@ -1062,6 +1064,7 @@ $1",
'contextlines' => 'ИлÑрц Ñ‚ÑƒÑ Ð±Ò¯Ñ€ дÑÑ… мөрийн тоо:',
'contextchars' => 'ÐÑг мөр Ñ‚ÑƒÑ Ð±Ò¯Ñ€ дÑÑ… үгийн тоо:',
'stub-threshold' => '<a href="#" class="stub">Түүхий холбооÑийг</a> форматлах боÑго (байт):',
+'stub-threshold-disabled' => 'ИдÑвхигүйжүүлÑÑн',
'recentchangesdays' => 'Сүүлийн өөрчлөлтүүдÑд үзүүлÑÑ… өдрийн тоо:',
'recentchangesdays-max' => 'Хамгийн ихдÑÑ $1 өдөр',
'recentchangescount' => 'ҮзүүлÑÑ… заÑварын тоо (анхны байдалд):',
@@ -1095,6 +1098,7 @@ $1",
'prefs-files' => 'Файлууд',
'prefs-custom-css' => 'Өөрийн ÑонгоÑон CSS',
'prefs-custom-js' => 'Өөрийн ÑонгоÑон JS',
+'prefs-common-css-js' => 'Бүх Ñкинд ашиглагдах CSS/ЖаваСкрипт:',
'prefs-reset-intro' => 'Та ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг ашиглан өөрийн тохиргоог Ñайтын анхны тохиргооо руу шилжүүлÑÑ… боломжтой.
Ð­Ð½Ñ Ò¯Ð¹Ð»Ð´Ð»Ð¸Ð¹Ð³ буцаах боломжгүй.',
'prefs-emailconfirm-label' => 'ÐœÑйлийн баталгаажуулалт:',
@@ -1132,7 +1136,9 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'prefs-advancedrendering' => 'Ðхимаг Ñ…ÑмжÑÑний Ñонголтууд',
'prefs-advancedsearchoptions' => 'Ðхимаг Ñ…ÑмжÑÑний Ñонголтууд',
'prefs-advancedwatchlist' => 'Ðхимаг Ñ…ÑмжÑÑний Ñонголтууд',
-'prefs-display' => 'Харагдах байдлын Ñонголтууд',
+'prefs-displayrc' => 'Харагдах байдлын Ñонголтууд',
+'prefs-displaysearchoptions' => 'Харагдацийн тохиргоо',
+'prefs-displaywatchlist' => 'Харагдацийн тохиргоо',
'prefs-diffs' => 'Ялгаанууд',
# User rights
@@ -1217,6 +1223,7 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'right-hideuser' => 'Ð¥ÑÑ€ÑглÑгчийн нÑрийг түгжиж нийтÑÑÑ Ð½ÑƒÑƒÑ…',
'right-ipblock-exempt' => 'IP-н түгжÑÑ, автомат түгжÑÑ, бүÑийн түгжÑÑг тойрч гарах',
'right-proxyunbannable' => 'ПрокÑинуудын автомат түгжÑÑг тойрч гарах',
+'right-unblockself' => 'Ó¨Ó©Ñ€Ñдийнхөө түгжÑÑг тайлах',
'right-protect' => 'Хамгаалалтын түвшингүүдийг өөрчилж хамгаалагдÑан хуудÑуудыг заÑварлах',
'right-editprotected' => 'ХамгаалагдÑан хуудÑуудыг заÑварлах (давхар хамгаалалтгүй)',
'right-editinterface' => 'Ð¥ÑÑ€ÑглÑгчийн интерфÑйÑийг заÑварлах',
@@ -1239,7 +1246,6 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'right-siteadmin' => 'ÐœÑдÑÑллийн баазыг түгжих буюу нÑÑÑ…',
'right-reset-passwords' => 'БуÑад Ñ…ÑÑ€ÑглÑгчдийн нууц үгÑийг дахин тогтоох',
'right-override-export-depth' => '5 хүртÑлх гүний хуудÑуудыг холбогдÑон хуудÑуудтай хамт гаргах',
-'right-versiondetail' => 'Программ хангамжийн дÑлгÑÑ€Ñнгүй мÑдÑÑллийг үзүүлÑÑ…',
'right-sendemail' => 'БуÑад Ñ…ÑÑ€ÑглÑгчид руу и-мÑйл Ñвуулах',
# User rights log
@@ -1290,14 +1296,9 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'recentchanges-legend' => 'Сүүлийн өөрчлөлтүүдийн Ñонголтууд',
'recentchangestext' => 'ЭнÑÑ…Ò¯Ò¯ хуудÑанд викид хийÑÑн хамгийн Ñүүлийн өөрчлөлтүүдийг үзүүлж байна.',
'recentchanges-feed-description' => 'Вики дахь хамгийн Ñүүлийн өөрчлөлтүүдийг Ñ…Ñнах.',
-'recentchanges-label-legend' => 'Тайлбар: $1.',
-'recentchanges-legend-newpage' => '$1 - ÑˆÐ¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ',
'recentchanges-label-newpage' => 'Ð­Ð½Ñ Ð·Ð°Ñвар ÑˆÐ¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг Ò¯Ò¯ÑгÑÑÑн байна',
-'recentchanges-legend-minor' => '$1 - бага зÑргийн заÑвар',
'recentchanges-label-minor' => 'Ð­Ð½Ñ Ð½ÑŒ бага зÑргийн заÑвар байна',
-'recentchanges-legend-bot' => '$1 - ботын заÑвар',
'recentchanges-label-bot' => 'Ð­Ð½Ñ Ð·Ð°Ñварыг бот гүйцÑтгÑÑÑн байна',
-'recentchanges-legend-unpatrolled' => '$1 - манагдаагүй заÑвар',
'recentchanges-label-unpatrolled' => 'Ð­Ð½Ñ Ð·Ð°Ñварыг одоогийн байдлаар манаагүй байна',
'rcnote' => "Доорх нь $5, $4-ий байдлаарх Ñүүлийн '''$2''' өдрийн турших '''$1''' заÑвар юм.",
'rcnotefrom' => "Доорх нь '''$2'''-Ñ Ñ…Ð¾Ð¹ÑˆÐ¸Ñ… өөрчлөлтүүд ('''$1''' хүртÑл харуулагдÑан) юм.",
@@ -1344,6 +1345,9 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'upload_directory_missing' => 'Оруулалтын лавлах ($1) олдохгүй байгаа бөгөөд вÑбÑервÑÑ€ Ò¯Ò¯ÑгÑÑгүй байж магадгүй байна.',
'upload_directory_read_only' => 'Файл оруулах каталог ($1) нь вÑбÑерверт бичигдÑÑ… боломгүй байна.',
'uploaderror' => 'Файл оруулахад алдаа гарлаа',
+'upload-recreate-warning' => "'''Ðнхаар: ТÑрхүү нÑртÑй файл нь уÑтгагдÑан ÑÑвÑл зөөгдÑөн байна..'''
+
+Ð¥Ñлбараар харах үүднÑÑÑ ÑнÑÑ…Ò¯Ò¯ хуудаÑны уÑтгал ба зөөлтийг лог доор бичигдÑÑн байгаа:",
'uploadtext' => "Доорх маÑгтыг Ñ…ÑÑ€ÑглÑж файлыг оруулна уу.
Өмнө нь оруулÑан файлуудыг [[Special:FileList|оруулÑан файлуудын жагÑаалтааÑ]] харна уу. ОруулÑан ба уÑтгаÑан файлуудын жагÑаалт нь мөн [[Special:Log/upload|файл оруулалтын логт]] бий.
@@ -1378,6 +1382,17 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'filetype-banned-type' => "'''\".\$1\"''' нь зөвшөөрөгдөхгүй файлын төрөл байна.
Зөвшөөрөгдөх {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
'filetype-missing' => 'Ð­Ð½Ñ Ñ„Ð°Ð¹Ð»Ð´ өргөтгөл байхгүй байна (".jpg" гÑÑ… мÑт).',
+'empty-file' => 'Таны ÑвуулÑан файл хооÑон байв.',
+'file-too-large' => 'Таны ÑвуулÑан файл Ñ…ÑÑ‚Ñрхий том байв.',
+'filename-tooshort' => 'Файлын нÑÑ€ Ñ…ÑÑ‚Ñрхий богино байна.',
+'filetype-banned' => 'Ийм файлын төрлийг оруулах боломжгүй.',
+'verification-error' => 'ЭнÑÑ…Ò¯Ò¯ файл нь файлын баталгаажуулалтад Ñ‚ÑнцÑÑнгүй.',
+'hookaborted' => 'Таны хийх гÑж оролдÑон өөрчлөлтийг нÑмÑлт хүүк хориглов.',
+'illegal-filename' => 'Ийм файлын нÑртÑй байж болохгүй.',
+'overwrite' => 'ÐнхнааÑаа оршиж буй файлын дÑÑгүүр бичиж болохгүй.',
+'unknown-error' => 'Үл мÑдÑгдÑÑ… алдаа гарав.',
+'tmp-create-error' => 'Түр зуурын файлыг Ò¯Ò¯ÑгÑж чадÑангүй.',
+'tmp-write-error' => 'Түр зуурын файлыг бичихÑд алдаа гарав.',
'large-file' => 'Файлуудын Ñ…ÑмжÑÑ $1-Ñ Ð¸Ñ…Ð³Ò¯Ð¹ байхыг зөвлөж байна;
ÑÐ½Ñ Ñ„Ð°Ð¹Ð» $2 байна.',
'largefileserver' => 'Ð­Ð½Ñ Ñ„Ð°Ð¹Ð» Ñерверийн зөвшөөрÑөн Ñ…ÑмжÑÑнÑÑÑ Ñ‚Ð¾Ð¼ байна.',
@@ -1408,13 +1423,14 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'file-exists-duplicate' => 'Ð­Ð½Ñ Ñ„Ð°Ð¹Ð» нь дараах {{PLURAL:$1|файлтай|файлуудтай}} ижил байна:',
'file-deleted-duplicate' => 'Ð­Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ‚Ð°Ð¹ ([[:$1]]) Ñг ижилхÑн файл урьд өмнө уÑтгагдÑан байна.
Дахин оруулахынхаа өмнө Ñ‚Ñрхүү файлын уÑтгалын түүхийг харна уу.',
-'successfulupload' => 'Файлыг амжилттай орууллаа',
'uploadwarning' => 'Хуулах үеийн анхааруулга',
'uploadwarning-text' => 'Доорх файлын тодорхойлолтыг өөрчлөөд дахин оролдоно уу.',
'savefile' => 'Файлыг хадгалах',
'uploadedimage' => '"[[$1]]"-г орууллаа',
'overwroteimage' => '"[[$1]]"-н ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€Ñ‹Ð³ орууллаа',
'uploaddisabled' => 'Файл оруулах боломжгүй байна.',
+'copyuploaddisabled' => 'URL-Ð°Ð°Ñ Ð¾Ñ€ÑƒÑƒÐ»Ð¶ болохгүй.',
+'uploadfromurl-queued' => 'Таны оруулалÑан файлыг оруулах дараалалд нÑмÑв.',
'uploaddisabledtext' => 'Файл оруулалтуудыг идÑвхижүүлÑÑгүй байна.',
'php-uploaddisabledtext' => 'PHP-д файл оруулахыг хориглоно.
file_uploads тохиргоогоо шалгана уу.',
@@ -1436,6 +1452,14 @@ file_uploads тохиргоогоо шалгана уу.',
Файлын уÑтгалын лог Ñнд байна:",
'filename-bad-prefix' => "Таны оруулж байгаа файлын нÑÑ€ '''\"\$1\"'''-Ñ€ ÑÑ…Ñлж байна. Ð­Ð½Ñ Ð½ÑŒ файлыг тодорхойлойлоогүй, голдуу дижитал аппаратын автоматаар гаргадаг нÑÑ€ болно.
Файланд түүнийг илүү Ñайн тодорхойлÑон нÑÑ€ өгнө Ò¯Ò¯.",
+'upload-success-subj' => 'Файлыг амжилттай орууллаа',
+'upload-success-msg' => '[$2]-Ñ Ð°Ð¼Ð¶Ð¸Ð»Ñ‚Ñ‚Ð°Ð¹ оруулав. Энд байна: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Оруулах үеийн аÑуудал',
+'upload-failure-msg' => '[$2]-Ñ Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ…Ð°Ð´ аÑуудал Ò¯Ò¯ÑчÑÑ:
+
+$1',
+'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>-Ñ€ ÑхлÑÑÑн байх шаардлагатай.',
@@ -1615,7 +1639,6 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'statistics-edits-average' => 'Ð¥ÑƒÑƒÐ´Ð°Ñ Ñ‚ÑƒÑ‚Ð¼Ñ‹Ð½ дундаж заÑварын тоо',
'statistics-views-total' => 'Ðийт үзÑÑн тоо',
'statistics-views-peredit' => 'ЗаÑвар тутмыг үзÑÑн тоо',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Ðжлын цувааны] урт',
'statistics-users' => 'БүртгÑгдÑÑн [[Special:ListUsers|Ñ…ÑÑ€ÑглÑгч]]',
'statistics-users-active' => 'Байнгын оролцоотой Ñ…ÑÑ€ÑглÑгч',
'statistics-users-active-desc' => 'Сүүлийн {{PLURAL:$1|өдөрт|$1 өдөрт}} үйлдÑл хийÑÑн Ñ…ÑÑ€ÑглÑгчид',
@@ -1808,34 +1831,40 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'listgrouprights-removegroup-self-all' => 'Өөрийн бүртгÑлÑÑÑ Ð±Ò¯Ñ… бүлгийг хаÑах',
# E-mail user
-'mailnologin' => 'илгÑÑÑ… хаÑг байхгүй',
-'mailnologintext' => 'Та буÑад Ñ…ÑÑ€ÑглÑгчдÑд мÑйл Ñвуулахын тулд өөрийн [[Special:Preferences|хувийн тохируулгадаа]] мÑйлÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ñан, мөн [[Special:UserLogin|нÑвтÑÑ€ÑÑн]] байх шаардлагатай.',
-'emailuser' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…',
-'emailpage' => 'Ð¥ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…',
-'emailpagetext' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгч Ñ€Ò¯Ò¯ мÑйл илгÑÑÑ…Ñд доорхийг бөглөнө.
+'mailnologin' => 'илгÑÑÑ… хаÑг байхгүй',
+'mailnologintext' => 'Та буÑад Ñ…ÑÑ€ÑглÑгчдÑд мÑйл Ñвуулахын тулд өөрийн [[Special:Preferences|хувийн тохируулгадаа]] мÑйлÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ñан, мөн [[Special:UserLogin|нÑвтÑÑ€ÑÑн]] байх шаардлагатай.',
+'emailuser' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…',
+'emailpage' => 'Ð¥ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…',
+'emailpagetext' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгч Ñ€Ò¯Ò¯ мÑйл илгÑÑÑ…Ñд доорхийг бөглөнө.
Таны өөрийн [[Special:Preferences|Ñ…ÑÑ€ÑглÑгчийн тохиргоонд]] оруулÑан мÑйл хаÑг нь "Ð¥ÑнÑÑÑ" гÑÑÑн Ñ…ÑÑÑгт гарах тул хүлÑÑн авагч хариугаа тань руу шууд илгÑÑÑ… боломжтой.',
-'usermailererror' => 'ÐœÑйл нь буцаж ирÑÑн шалтгаан:',
-'defemailsubject' => '{{SITENAME}} и-мÑйл',
-'noemailtitle' => 'ÐœÑйл хаÑггүй байна',
-'noemailtext' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгч хүчинтÑй и-мÑйл хаÑг тохируулаагүй байна.',
-'nowikiemailtitle' => 'ÐœÑйл зөвшөөрөгдөхгүй',
-'nowikiemailtext' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгч буÑад Ñ…ÑÑ€ÑглÑгчдÑÑÑ Ð¼Ñйл хүлÑÑж авахгүй гÑÑÑн байна.',
-'email-legend' => '{{SITENAME}}-н Ó©Ó©Ñ€ Ñ…ÑÑ€ÑглÑгч руу мÑйл Ñвуулах',
-'emailfrom' => 'Ð¥ÑнÑÑÑ:',
-'emailto' => 'Ð¥Ñнд:',
-'emailsubject' => 'СÑдÑв:',
-'emailmessage' => 'МеÑÑÑж:',
-'emailsend' => 'ИлгÑÑÑ…',
-'emailccme' => 'Миний меÑÑÑжний хуулбарыг надад мÑйлÑÑÑ€ Ñвуулна уу.',
-'emailccsubject' => '$1: $2 руух таны хуулÑан мÑйл',
-'emailsent' => 'И-мÑйл илгÑÑгдлÑÑ',
-'emailsenttext' => 'Таны мÑйл илгÑÑгдлÑÑ.',
-'emailuserfooter' => 'Ð­Ð½Ñ Ð¼Ñйл нь {{SITENAME}} дахь "Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…" функцийг ашиглан $1-Ñ $2-д илгÑÑгдÑÑн байна.',
+'usermailererror' => 'ÐœÑйл нь буцаж ирÑÑн шалтгаан:',
+'defemailsubject' => '{{SITENAME}} и-мÑйл',
+'usermaildisabled' => 'Ð¥ÑÑ€ÑглÑгчийн и-мÑйлийг идÑвхигүйжүүлÑв',
+'usermaildisabledtext' => 'Та ÑÐ½Ñ Ð²Ð¸ÐºÐ¸Ð³Ð¸Ð¹Ð½ буÑад Ñ…ÑÑ€ÑглÑгч руу и-мÑйл Ñвуулах боломжгүй',
+'noemailtitle' => 'ÐœÑйл хаÑггүй байна',
+'noemailtext' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгч хүчинтÑй и-мÑйл хаÑг тохируулаагүй байна.',
+'nowikiemailtitle' => 'ÐœÑйл зөвшөөрөгдөхгүй',
+'nowikiemailtext' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгч буÑад Ñ…ÑÑ€ÑглÑгчдÑÑÑ Ð¼Ñйл хүлÑÑж авахгүй гÑÑÑн байна.',
+'email-legend' => '{{SITENAME}}-н Ó©Ó©Ñ€ Ñ…ÑÑ€ÑглÑгч руу мÑйл Ñвуулах',
+'emailfrom' => 'Ð¥ÑнÑÑÑ:',
+'emailto' => 'Ð¥Ñнд:',
+'emailsubject' => 'СÑдÑв:',
+'emailmessage' => 'МеÑÑÑж:',
+'emailsend' => 'ИлгÑÑÑ…',
+'emailccme' => 'Миний меÑÑÑжний хуулбарыг надад мÑйлÑÑÑ€ Ñвуулна уу.',
+'emailccsubject' => '$1: $2 руух таны хуулÑан мÑйл',
+'emailsent' => 'И-мÑйл илгÑÑгдлÑÑ',
+'emailsenttext' => 'Таны мÑйл илгÑÑгдлÑÑ.',
+'emailuserfooter' => 'Ð­Ð½Ñ Ð¼Ñйл нь {{SITENAME}} дахь "Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…" функцийг ашиглан $1-Ñ $2-д илгÑÑгдÑÑн байна.',
+
+# User Messenger
+'usermessage-summary' => 'СиÑтемийн меÑÑеж үлдÑÑв.',
+'usermessage-editor' => 'СиÑтемийн меÑÑежийг заÑварлагч',
# Watchlist
'watchlist' => 'Миний Ñ…Ñнаж буй хуудÑууд',
'mywatchlist' => 'Миний Ñ…Ñнаж буй хуудÑуудын жагÑаалт',
-'watchlistfor' => "'''$1'''",
+'watchlistfor2' => 'Ð¥ÑÑ€ÑглÑгч: $1 $2',
'nowatchlist' => 'Танд Ñ…Ñнаж буй зүйл байхгүй.',
'watchlistanontext' => 'Та өөрийн Ñ…Ñнах лиÑтийг өөрчлөх буюу үзÑхийг Ñ…Ò¯ÑвÑл $1 Ñ…ÑÑ€ÑгтÑй.',
'watchnologin' => 'ÐÑвтрÑÑгүй байна.',
@@ -1951,7 +1980,10 @@ $NEWPAGE
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Ñриа]])-н хийÑÑн заÑваруудыг [[User:$1|$1]]-ий хийÑÑн Ñүүлийн заÑварт буцаан шилжүүллÑÑ.',
'revertpage-nouser' => '(Ð¥ÑÑ€ÑглÑгийн нÑрийг уÑтгаÑан)-н хийÑÑн заÑварыг [[User:$1|$1]]-н Ñүүлийн заÑвар руу буцаав',
'rollback-success' => '$1-н өөрчлөлтүүдийг $2-н үйлдÑÑн Ñүүлийн хувилбар руу буцаалаа.',
-'sessionfailure' => 'Таны нÑвтрÑлд алдаа гарÑан бололтой;
+
+# Edit tokens
+'sessionfailure-title' => 'Session-д алдаа гарав',
+'sessionfailure' => 'Таны нÑвтрÑлд алдаа гарÑан бололтой;
компьютерийн ÑиÑтем дÑÑ… мÑдÑÑллийг хууль буÑаар авах ÑÐ²Ð´Ð»Ð°Ð°Ñ Ñ…Ð°Ð¼Ð³Ð°Ð°Ð»Ð°Ñ… гÑж үйлдÑл цуцлагдÑан байна
"Back" товч дÑÑÑ€ дарж өмнөх Ñ…ÑƒÑƒÐ´Ð°Ñ Ñ€ÑƒÑƒÐ³Ð°Ð° буцаж, дараа нь дахин оролдоно уу.',
@@ -2080,19 +2112,22 @@ $1',
'month' => 'Дараах ÑÐ°Ñ€Ð°Ð°Ñ ï¼ˆÓ©Ð¼Ð½Ó©Ñ… заÑварууд нь ч орно):',
'year' => 'Дараах жилÑÑÑ ï¼ˆÓ©Ð¼Ð½Ó©Ñ… заÑварууд нь ч орно):',
-'sp-contributions-newbies' => 'Зөвхөн ÑˆÐ¸Ð½Ñ Ð±Ò¯Ñ€Ñ‚Ð³Ñлүүдийн хувь нÑмрийг харуулах',
-'sp-contributions-newbies-sub' => 'ШинÑÑÑ€ бүртгүүлÑÑн Ñ…ÑÑ€ÑглÑгчид',
-'sp-contributions-newbies-title' => 'Ð¨Ð¸Ð½Ñ Ð±Ò¯Ñ€Ñ‚Ð³Ñлүүдийн хувь нÑмÑÑ€',
-'sp-contributions-blocklog' => 'ТүгжÑÑний лог',
-'sp-contributions-deleted' => 'уÑтгагдÑан Ñ…ÑÑ€ÑглÑгчийн хувь нÑмÑÑ€',
-'sp-contributions-logs' => 'логууд',
-'sp-contributions-talk' => 'Ñриа',
-'sp-contributions-userrights' => 'Ñ…ÑÑ€ÑглÑгчдийн Ñрхийн удирдлага',
-'sp-contributions-blocked-notice' => 'ЭнÑÑ…Ò¯Ò¯ Ñ…ÑÑ€ÑглÑгч одоогоор түгжигдÑÑн байна.
+'sp-contributions-newbies' => 'Зөвхөн ÑˆÐ¸Ð½Ñ Ð±Ò¯Ñ€Ñ‚Ð³Ñлүүдийн хувь нÑмрийг харуулах',
+'sp-contributions-newbies-sub' => 'ШинÑÑÑ€ бүртгүүлÑÑн Ñ…ÑÑ€ÑглÑгчид',
+'sp-contributions-newbies-title' => 'Ð¨Ð¸Ð½Ñ Ð±Ò¯Ñ€Ñ‚Ð³Ñлүүдийн хувь нÑмÑÑ€',
+'sp-contributions-blocklog' => 'ТүгжÑÑний лог',
+'sp-contributions-deleted' => 'уÑтгагдÑан Ñ…ÑÑ€ÑглÑгчийн хувь нÑмÑÑ€',
+'sp-contributions-logs' => 'логууд',
+'sp-contributions-talk' => 'Ñриа',
+'sp-contributions-userrights' => 'Ñ…ÑÑ€ÑглÑгчдийн Ñрхийн удирдлага',
+'sp-contributions-blocked-notice' => 'ЭнÑÑ…Ò¯Ò¯ Ñ…ÑÑ€ÑглÑгч одоогоор түгжигдÑÑн байна.
+Лавлагааны зориулалтаар түгжÑÑний лог дÑÑрх хамгийн Ñүүлийн нÑмÑлтийг доор оруулав:',
+'sp-contributions-blocked-notice-anon' => 'ЭнÑÑ…Ò¯Ò¯ IP хаÑгыг одоогоор түгжигдÑÑн байна.
Лавлагааны зориулалтаар түгжÑÑний лог дÑÑрх хамгийн Ñүүлийн нÑмÑлтийг доор оруулав:',
-'sp-contributions-search' => 'Хувь нÑмрийг хайх',
-'sp-contributions-username' => 'IP хаÑг ÑÑвÑл Ñ…ÑÑ€ÑглÑгчийн нÑÑ€:',
-'sp-contributions-submit' => 'Хайх',
+'sp-contributions-search' => 'Хувь нÑмрийг хайх',
+'sp-contributions-username' => 'IP хаÑг ÑÑвÑл Ñ…ÑÑ€ÑглÑгчийн нÑÑ€:',
+'sp-contributions-toponly' => 'Хамгийн Ñүүлийн заÑваруудыг л үзүүлÑÑ…',
+'sp-contributions-submit' => 'Хайх',
# What links here
'whatlinkshere' => 'Энд холбогдÑон хуудÑууд',
@@ -2153,7 +2188,6 @@ $1',
'ipb-edit-dropdown' => 'Түгжих шалтгаануудыг заÑварлах',
'ipb-unblock-addr' => '$1-н түгжÑÑг тайлах',
'ipb-unblock' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл IP хаÑгийн түгжÑÑг тайлах',
-'ipb-blocklist-addr' => '$1-д байгаа түгжÑÑнүүдийг харах',
'ipb-blocklist' => 'Байгаа түгжÑÑнүүдийг харах',
'ipb-blocklist-contribs' => '$1-н хувь нÑмÑÑ€',
'unblockip' => 'Ð¥ÑÑ€ÑглÑгчийг идÑвхижүүлÑÑ…',
@@ -2229,6 +2263,8 @@ $1 нь аль Ñ…ÑдийнÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн байна.
'cant-block-while-blocked' => 'Ó¨Ó©Ñ€Ó©Ó© түгжигдÑÑн үед буÑад Ñ…ÑÑ€ÑглÑгчдийг түгжих боломжгүй.',
'cant-see-hidden-user' => 'Таны түгжих гÑж оролдож буй Ñ…ÑÑ€ÑглÑгчийг аль Ñ…ÑдийнÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð¶, нууÑан байна.
Таньд Ñ…ÑÑ€ÑглÑгчийг нуух Ñрх байхгүй тул та Ñ…ÑÑ€ÑглÑгчийн түгжÑÑг харах буюу заÑварлах боломжгүй.',
+'ipbblocked' => 'Та Ó©Ó©Ñ€Ó©Ó© түгжигдÑÑн тул буÑад Ñ…ÑÑ€ÑглÑгчдийг түгжих буюу Ñ‚Ñдний түгжÑÑг тайлах Ñрхгүй',
+'ipbnounblockself' => 'Та өөрийнхөө түгжÑÑг тайлах Ñрхгүй',
# Developer tools
'lockdb' => 'ÐœÑдÑÑллийн баазыг түгжих',
@@ -2317,6 +2353,7 @@ $1 нь аль Ñ…ÑдийнÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн байна.
'immobile-source-page' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг зөөх боломжгүй.',
'immobile-target-page' => 'Ð­Ð½Ñ Ð·Ð¾Ñ€ÑŒÑон гарчиг руу зөөх боломжгүй.',
'imagenocrossnamespace' => 'Файлыг Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ Ó©Ó©Ñ€ нÑрний зай руу зөөх боломжгүй',
+'nonfile-cannot-move-to-file' => 'Файлын нÑрний зай руу файл биш зүйлийг зөөх боломжгүй.',
'imagetypemismatch' => 'Ð¨Ð¸Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ өргөтгөл төрөлтÑй нь таарахгүй байна',
'imageinvalidfilename' => 'ЗорьÑон файлын нÑÑ€ хүчингүй',
'fix-double-redirects' => 'Ðнхны гарчиг руу чиглÑÑ… чиглүүлÑгчдийг шинÑчлÑÑ…',
@@ -2396,6 +2433,7 @@ $1 нь аль Ñ…ÑдийнÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн байна.
'importstart' => 'ХуудÑыг импортлож байна...',
'import-revision-count' => '$1 заÑвар',
'importnopages' => 'Импортлох Ñ…ÑƒÑƒÐ´Ð°Ñ Ð°Ð»Ð³Ð° байна.',
+'imported-log-entries' => '$1 {{PLURAL:$1|лог руух нÑмÑлтийг}} оруулж ирÑв.',
'importfailed' => 'Импорт бүтÑлгүйтлÑÑ: $1',
'importunknownsource' => 'ÐœÑдÑгдÑÑгүй төрлийн импортлох ÑÑ… Ò¯Ò¯ÑвÑÑ€',
'importcantopen' => 'ИмпортлоÑон файлыг нÑÑж чадÑангүй',
@@ -2490,6 +2528,8 @@ $1 нь аль Ñ…ÑдийнÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн байна.
'tooltip-rollback' => '"Буцаах" функцÑÑÑ€ ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÑ‚ хийÑÑн заÑвар(ууд)ыг хамгийн Ñүүлийн заÑвар хийÑÑн хүний хувилбар руу ганц товшилтоор шилжүүлнÑ',
'tooltip-undo' => '"Цуцлах" дÑÑÑ€ дарÑнаар ÑÐ½Ñ Ð·Ð°Ñварыг хуучны төлөвт шилжүүлÑн урьдчилж харах байдлаар заÑварлах талбарыг гаргана.
Товч агуулгын Ñ…ÑÑÑгт шалтгаан нÑмÑÑ… боломжтой болгоно.',
+'tooltip-preferences-save' => 'Тохиргоог хадгалах',
+'tooltip-summary' => 'Товч тайлбар оруулах',
# Stylesheets
'common.css' => '/* Энд тавигдÑан CSS-үүд бүх арьÑанд нÑмÑгдÑÑ… болно */',
@@ -2591,14 +2631,17 @@ $1',
'imagemaxsize' => 'Доорх шаардлагын дагуу зургын хуудÑанд Ñ…Ñзгаарлалт хийлÑÑ:',
'thumbsize' => 'Жижиг зургийн Ñ…ÑмжÑÑ:',
'widthheightpage' => '$1×$2, $3 хуудаÑ',
-'file-info' => '(файлын Ñ…ÑмжÑÑ: $1, MIME төрөл: $2)',
-'file-info-size' => '($1 × $2 пикÑел, файлын Ñ…ÑмжÑÑ: $3, MIME төрөл: $4)',
+'file-info' => 'файлын Ñ…ÑмжÑÑ: $1, MIME төрөл: $2',
+'file-info-size' => '$1 × $2 пикÑел, файлын Ñ…ÑмжÑÑ: $3, MIME төрөл: $4',
'file-nohires' => '<small>Илүү чанартай хувилбар байхгүй байна.</small>',
-'svg-long-desc' => '(SVG файл, $1 × $2 пикÑÑл, файлын Ñ…ÑмжÑÑ: $3)',
+'svg-long-desc' => 'SVG файл, $1 × $2 пикÑÑл, файлын Ñ…ÑмжÑÑ: $3',
'show-big-image' => 'Хамгийн Ñайн чанартай хувилбар',
'show-big-image-thumb' => '<small>Файлын одоогоор харагдаж буй Ñ…ÑмжÑÑ: $1 × $2 пикÑел</small>',
'file-info-gif-looped' => 'ÑргÑлдÑÑн',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Ñ„Ñ€Ñйм}}',
+'file-info-png-looped' => 'ÑргÑлдÑÑн',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|удаа}} тоглуулÑан',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Ñ„Ñ€Ñйм}}',
# Special:NewFiles
'newimages' => 'Ð¨Ð¸Ð½Ñ Ñ„Ð°Ð¹Ð»ÑƒÑƒÐ´Ñ‹Ð½ галерÑй',
@@ -2883,29 +2926,29 @@ $1',
'limitall' => 'бүгдийг',
# E-mail address confirmation
-'confirmemail' => 'ÐœÑйл хаÑгийг баталгаажуулах',
-'confirmemail_noemail' => 'Та өөрийн [[Special:Preferences|Ñ…ÑÑ€ÑглÑгчийн тохиргоондоо]] хүчинтÑй мÑйл хаÑг оруулаагүй байна.',
-'confirmemail_text' => '{{SITENAME}} нь мÑйлийн функцуудыг ашиглахын тулд мÑйл хаÑгаа баталгаажуулахыг Ñ…ÑÑ€ÑглÑгчдÑÑÑ ÑˆÐ°Ð°Ñ€Ð´Ð´Ð°Ð³ болно.
+'confirmemail' => 'ÐœÑйл хаÑгийг баталгаажуулах',
+'confirmemail_noemail' => 'Та өөрийн [[Special:Preferences|Ñ…ÑÑ€ÑглÑгчийн тохиргоондоо]] хүчинтÑй мÑйл хаÑг оруулаагүй байна.',
+'confirmemail_text' => '{{SITENAME}} нь мÑйлийн функцуудыг ашиглахын тулд мÑйл хаÑгаа баталгаажуулахыг Ñ…ÑÑ€ÑглÑгчдÑÑÑ ÑˆÐ°Ð°Ñ€Ð´Ð´Ð°Ð³ болно.
Доорх товчлуурыг идÑвхижүүлж өөрийн хаÑг руу баталгаажуулах мÑйл Ñвуулна уу.
Уг мÑйл нь код бүхий Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð°Ð³ÑƒÑƒÐ»Ð°Ñ… бөгөөд та уг холбооÑыг ачаалÑнаар таны мÑйл хаÑг баталгаажих болно.',
-'confirmemail_pending' => 'Баталгаажуулах кодыг тань руу аль Ñ…ÑдийнÑÑ Ð¼ÑйлÑÑÑ€ ÑвуулÑан;
+'confirmemail_pending' => 'Баталгаажуулах кодыг тань руу аль Ñ…ÑдийнÑÑ Ð¼ÑйлÑÑÑ€ ÑвуулÑан;
та ÑаÑхан бүртгүүлÑÑн бол Ñ…ÑдÑн минут хүлÑÑÑний дараа ÑˆÐ¸Ð½Ñ ÐºÐ¾Ð´ нÑÑ…ÑÑ… нь тохиромжтой.',
-'confirmemail_send' => 'Баталгаажуулах кодыг мÑйлÑÑÑ€ илгÑÑÑ….',
-'confirmemail_sent' => 'Баталгаажуулах мÑйл илгÑÑгдлÑÑ.',
-'confirmemail_oncreate' => 'Таны мÑйл хаÑг руу баталгаажуулалтын кодыг Ñвууллаа.
+'confirmemail_send' => 'Баталгаажуулах кодыг мÑйлÑÑÑ€ илгÑÑÑ….',
+'confirmemail_sent' => 'Баталгаажуулах мÑйл илгÑÑгдлÑÑ.',
+'confirmemail_oncreate' => 'Таны мÑйл хаÑг руу баталгаажуулалтын кодыг Ñвууллаа.
ÐÑвтрÑхийн тулд ÑÐ½Ñ ÐºÐ¾Ð´ Ñ…ÑÑ€Ñггүй ч гÑÑÑн вики дахь мÑйлтÑй холбогдÑон функцуудыг ашиглахын тулд Ñ…ÑÑ€Ñг болно.',
-'confirmemail_sendfailed' => '{{SITENAME}} нь таны баталгаажуулах мÑйлийг Ñвуулж чадÑангүй.
+'confirmemail_sendfailed' => '{{SITENAME}} нь таны баталгаажуулах мÑйлийг Ñвуулж чадÑангүй.
Таны мÑйл хаÑгт хүчингүй Ñ‚ÑмдÑгт байгаа ÑÑÑхийг шалгаарай.
ÐœÑйл илгÑÑгч дараахийг буцаав: $1',
-'confirmemail_invalid' => 'Баталгаажуулах код хүчингүй байна. Кодны хугацаа Ñ…ÑÑ‚ÑÑ€ÑÑн байж болзошгүй.',
-'confirmemail_needlogin' => '$1-г хийхийн тулд та мÑйл хаÑгаа баталгаажуулах шаардлагатай.',
-'confirmemail_success' => 'Таны мÑйл хаÑг баталгаажлаа.
+'confirmemail_invalid' => 'Баталгаажуулах код хүчингүй байна. Кодны хугацаа Ñ…ÑÑ‚ÑÑ€ÑÑн байж болзошгүй.',
+'confirmemail_needlogin' => '$1-г хийхийн тулд та мÑйл хаÑгаа баталгаажуулах шаардлагатай.',
+'confirmemail_success' => 'Таны мÑйл хаÑг баталгаажлаа.
Та одоо викид [[Special:UserLogin|нÑвтÑрч]] үйлдÑл хийх боломжтой',
-'confirmemail_loggedin' => 'Таны мÑйл хаÑг баталгаажлаа.',
-'confirmemail_error' => 'Таны баталгаажуулалтыг хадгалах үед Ñмар нÑг алдаа гарлаа.',
-'confirmemail_subject' => '{{SITENAME}}-н мÑйл хаÑгийн баталгаажуулалт',
-'confirmemail_body' => 'Ð¥Ñн нÑгÑн, магадгүй та $1 IP хаÑÐ³Ð½Ð°Ð°Ñ $2 гÑÑÑн нÑÑ€ÑÑÑ€ ÑÐ½Ñ Ð¼Ñйл хаÑгтайгаар {{SITENAME}} хуудÑанд Ð´Ð°Ð½Ñ Ð½ÑÑÑÑн байна.
+'confirmemail_loggedin' => 'Таны мÑйл хаÑг баталгаажлаа.',
+'confirmemail_error' => 'Таны баталгаажуулалтыг хадгалах үед Ñмар нÑг алдаа гарлаа.',
+'confirmemail_subject' => '{{SITENAME}}-н мÑйл хаÑгийн баталгаажуулалт',
+'confirmemail_body' => 'Ð¥Ñн нÑгÑн, магадгүй та $1 IP хаÑÐ³Ð½Ð°Ð°Ñ $2 гÑÑÑн нÑÑ€ÑÑÑ€ ÑÐ½Ñ Ð¼Ñйл хаÑгтайгаар {{SITENAME}} хуудÑанд Ð´Ð°Ð½Ñ Ð½ÑÑÑÑн байна.
Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчийн бүртгÑл нь үнÑÑ…ÑÑÑ€ таных мөн бол {{SITENAME}} Ñ…ÑƒÑƒÐ´Ð°Ñ Ð´ÑÑрх Ñ-мÑйл хаÑгаар хийж болох үйлдлүүдийг идвÑхжүүлÑхийн тулд дараах холбооÑыг нÑÑÐ½Ñ Ò¯Ò¯.
@@ -2916,8 +2959,19 @@ $3
$5
Баталгаажуулах кодны хугацаа $4-нд дууÑах болно.',
-'confirmemail_invalidated' => 'ÐœÑйл хаÑгыг баталгаажуулах үйлдлийг цуцаллаа',
-'invalidateemail' => 'ÐœÑйл хаÑгыг баталгаажуулах Ñвдлыг цуцлах',
+'confirmemail_body_changed' => 'Ð¥Ñн нÑгÑн, магадгүй та $1 IP хаÑÐ³Ð½Ð°Ð°Ñ {{SITENAME}} дÑÑрх "$2" бүртгÑлийн и-мÑйл хаÑгийг ÑольÑон байна.
+
+Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчийн бүртгÑл нь үнÑÑ…ÑÑÑ€ таных мөн бол {{SITENAME}} Ñ…ÑƒÑƒÐ´Ð°Ñ Ð´ÑÑрх и-мÑйл функцуудыг дахин идÑвхжүүлÑхийн тулд дараах холбооÑыг хөтөчөөрөө нÑÑÐ½Ñ Ò¯Ò¯:
+
+$3
+
+Ð¥ÑÑ€Ñв бүртгÑл таных *биш* бол и-мÑйл баталгаажуулалтыг цуцлах дараах холбооÑыг нÑÑÐ½Ñ Ò¯Ò¯:
+
+$5
+
+Баталгаажуулах кодны хугацаа $4-нд дууÑах болно.',
+'confirmemail_invalidated' => 'ÐœÑйл хаÑгыг баталгаажуулах үйлдлийг цуцаллаа',
+'invalidateemail' => 'ÐœÑйл хаÑгыг баталгаажуулах Ñвдлыг цуцлах',
# Scary transclusion
'scarytranscludedisabled' => '[Интервики оруулалтыг идÑвхижүүлÑÑгүй]',
@@ -2957,6 +3011,7 @@ $1',
'table_pager_first' => 'Эхний хуудаÑ',
'table_pager_last' => 'Сүүлийн хуудаÑ',
'table_pager_limit' => 'Ð¥ÑƒÑƒÐ´Ð°Ñ Ð±Ò¯Ñ€Ñ‚ $1 зүйл үзүүлÑÑ…',
+'table_pager_limit_label' => 'Ð¥ÑƒÑƒÐ´Ð°Ñ Ð±Ò¯Ñ€ дахь зүйлийн тоо:',
'table_pager_limit_submit' => 'Явах',
'table_pager_empty' => 'Үр дүн байхгүй байна',
@@ -3024,6 +3079,8 @@ $1',
'version-hook-subscribedby' => 'ЗахиалÑан:',
'version-version' => '(Хувилбар $1)',
'version-license' => 'Лиценз',
+'version-poweredby-credits' => "ЭнÑÑ…Ò¯Ò¯ викиг '''[http://www.mediawiki.org/ MediaWiki]''' програмаар ажиллуулдаг, зохиогчийн Ñрх © 2001-$1 $2.",
+'version-poweredby-others' => 'буÑад',
'version-software' => 'СуулгаÑан программ',
'version-software-product' => 'БүтÑÑгдÑхүүн',
'version-software-version' => 'Хувилбар',
@@ -3084,6 +3141,15 @@ $1',
'tags-edit' => 'заÑварлах',
'tags-hitcount' => '$1 {{PLURAL:$1|өөрчлөлт}}',
+# Special:ComparePages
+'comparepages' => 'ХуудÑуудыг харьцуулах',
+'compare-selector' => 'ХуудаÑны заÑваруудыг харьцуулах',
+'compare-page1' => 'ÐÑгдүгÑÑÑ€ хуудаÑ',
+'compare-page2' => 'Хоёрдугаар хуудаÑ',
+'compare-rev1' => 'ÐÑгдүгÑÑÑ€ заÑвар',
+'compare-rev2' => 'Хоёрдугаар заÑвар',
+'compare-submit' => 'Харьцуулах',
+
# Database error messages
'dberr-header' => 'ЭнÑÑ…Ò¯Ò¯ викид аÑуудал Ò¯Ò¯ÑÑв',
'dberr-problems' => 'Уучлаарай!
@@ -3101,8 +3167,13 @@ $1',
'htmlform-float-invalid' => 'Таны өгÑөн утга тоо биш байна.',
'htmlform-int-toolow' => 'Таны өгÑөн утга $1 гÑÑÑн хамгийн доод ÑƒÑ‚Ð³Ð°Ð°Ñ Ð±Ð°Ð³Ð° байна',
'htmlform-int-toohigh' => 'Таны өгÑөн утга $1 гÑÑÑн хамгийн дÑÑд ÑƒÑ‚Ð³Ð°Ð°Ñ Ð¸Ñ… байна',
+'htmlform-required' => 'Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° зайлшгүй шаардлагатай',
'htmlform-submit' => 'Явуулах',
'htmlform-reset' => 'Өөрчлөлтүүдийг цуцлах',
'htmlform-selectorother-other' => 'БуÑад',
+# SQLite database support
+'sqlite-has-fts' => '$1 (бүх текÑÑ‚ÑÑрх хайлтыг дÑмждÑг)',
+'sqlite-no-fts' => '$1 (бүх текÑÑ‚ÑÑрх хайлтыг дÑмждÑггүй)',
+
);
diff --git a/languages/messages/MessagesMo.php b/languages/messages/MessagesMo.php
index 533a710e..ab7ba56f 100644
--- a/languages/messages/MessagesMo.php
+++ b/languages/messages/MessagesMo.php
@@ -548,7 +548,9 @@ $messages = array(
'tooltip-rollback' => "«Ревино» анулÑÐ·Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ€Ñ/модификÑриле де пе ачаÑÑ‚Ñ Ð¿Ð°Ó‚Ð¸Ð½Ñ Ð° ултимулуй контрибуитор принтр'о ÑÐ¸Ð½Ð³ÑƒÑ€Ñ Ð°Ð¿ÑÑаре",
# Media information
+'file-info-size' => '$1 × $2 пикÑель, мÑриме фишиер: $3, тип MIME: $4',
'file-nohires' => '<small>Резолуций май марь ну Ñынт диÑпонибиле.</small>',
+'svg-long-desc' => 'фишиер SVG, ку дименÑÐ¸ÑƒÐ½Ñ Ð½Ð¾Ð¼Ð¸Ð½Ð°Ð»Ñ Ð´Ðµ $1 × $2 пикÑель, мÑриме фишиер: $3',
'show-big-image' => 'ÐœÑреште Ñ€ÐµÐ·Ð¾Ð»ÑƒÑ†Ð¸Ñ Ð¸Ð¼Ð°Ó‚Ð¸Ð½Ð¸Ð¹',
'show-big-image-thumb' => '<small>ÐœÑÑ€Ð¸Ð¼Ñ Ð°Ñ‡ÐµÑтей превизуализÑрь: $1 × $2 пикÑель</small>',
diff --git a/languages/messages/MessagesMr.php b/languages/messages/MessagesMr.php
index a7c236bb..0c442c01 100644
--- a/languages/messages/MessagesMr.php
+++ b/languages/messages/MessagesMr.php
@@ -48,72 +48,72 @@ $namespaceAliases = array(
'साहायà¥à¤¯_चरà¥à¤šà¤¾' => NS_HELP_TALK,
);
-#!!# sqlविचारा is not in normalised form, which is Sqlविचारा or Sqlविचारा
+# !!# sqlविचारा is not in normalised form, which is Sqlविचारा or Sqlविचारा
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'दà¥à¤¹à¥‡à¤°à¥€ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡' ),
- 'BrokenRedirects' => array( 'चà¥à¤•à¥€à¤šà¥€ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡' ),
+ 'DoubleRedirects' => array( 'दà¥à¤¹à¥‡à¤°à¥€_पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡' ),
+ 'BrokenRedirects' => array( 'चà¥à¤•à¥€à¤šà¥€_पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡' ),
'Disambiguations' => array( 'नि:संदिगà¥à¤§à¥€à¤•à¤°à¤£' ),
'Userlogin' => array( 'सदसà¥à¤¯à¤ªà¥à¤°à¤µà¥‡à¤¶' ),
'Userlogout' => array( 'सदसà¥à¤¯à¤¬à¤¹à¤¿à¤°à¥à¤—मन' ),
'CreateAccount' => array( 'सदसà¥à¤¯à¤¨à¥‹à¤‚द' ),
'Preferences' => array( 'पसंती' ),
- 'Watchlist' => array( 'पहारà¥â€à¤¯à¤¾à¤šà¥€ सूची' ),
- 'Recentchanges' => array( 'अलीकडील बदल' ),
+ 'Watchlist' => array( 'पहारà¥â€à¤¯à¤¾à¤šà¥€_सूची' ),
+ 'Recentchanges' => array( 'अलीकडील_बदल' ),
'Upload' => array( 'चढवा' ),
'Listfiles' => array( 'चितà¥à¤°à¤¯à¤¾à¤¦à¥€' ),
- 'Newimages' => array( 'नवीन चितà¥à¤°à¥‡' ),
- 'Listusers' => array( 'सदसà¥à¤¯à¤¾à¤‚ची यादी' ),
- 'Listgrouprights' => array( 'गट अधिकार यादी' ),
+ 'Newimages' => array( 'नवीन_चितà¥à¤°à¥‡' ),
+ 'Listusers' => array( 'सदसà¥à¤¯à¤¾à¤‚ची_यादी' ),
+ 'Listgrouprights' => array( 'गट_अधिकार_यादी' ),
'Statistics' => array( 'सांखà¥à¤¯à¤¿à¤•à¥€' ),
- 'Randompage' => array( 'अविशिषà¥à¤Ÿ', 'अविशिषà¥à¤Ÿ पृषà¥à¤ ' ),
+ 'Randompage' => array( 'अविशिषà¥à¤Ÿ', 'अविशिषà¥à¤Ÿ_पृषà¥à¤ ' ),
'Lonelypages' => array( 'à¤à¤•à¤²à¤ªà¤¾à¤¨à¥‡' ),
- 'Uncategorizedpages' => array( 'अवरà¥à¤—ीकृत पाने' ),
- 'Uncategorizedcategories' => array( 'अवरà¥à¤—ीकृत वरà¥à¤—' ),
- 'Uncategorizedimages' => array( 'अवरà¥à¤—ीकृत चितà¥à¤°à¥‡' ),
- 'Uncategorizedtemplates' => array( 'अवरà¥à¤—ीकृत साचे' ),
- 'Unusedcategories' => array( 'न वापरलेले वरà¥à¤—' ),
- 'Unusedimages' => array( 'न वापरलेली चितà¥à¤°à¥‡' ),
- 'Wantedpages' => array( 'हवे असलेले लेख' ),
- 'Wantedcategories' => array( 'हवे असलेले वरà¥à¤—' ),
+ 'Uncategorizedpages' => array( 'अवरà¥à¤—ीकृत_पाने' ),
+ 'Uncategorizedcategories' => array( 'अवरà¥à¤—ीकृत_वरà¥à¤—' ),
+ 'Uncategorizedimages' => array( 'अवरà¥à¤—ीकृत_चितà¥à¤°à¥‡' ),
+ 'Uncategorizedtemplates' => array( 'अवरà¥à¤—ीकृत_साचे' ),
+ 'Unusedcategories' => array( 'न_वापरलेले_वरà¥à¤—' ),
+ 'Unusedimages' => array( 'न_वापरलेली_चितà¥à¤°à¥‡' ),
+ 'Wantedpages' => array( 'हवे_असलेले_लेख' ),
+ 'Wantedcategories' => array( 'हवे_असलेले_वरà¥à¤—' ),
'Wantedfiles' => array( 'संचिकाहवी' ),
'Wantedtemplates' => array( 'साचाहवा' ),
- 'Mostlinked' => array( 'सरà¥à¤µà¤¾à¤¤ जासà¥à¤¤ जोडलेली' ),
- 'Mostlinkedcategories' => array( 'सरà¥à¤µà¤¾à¤¤ जासà¥à¤¤ जोडलेले वरà¥à¤—', 'सरà¥à¤µà¤¾à¤¤ जासà¥à¤¤ वापरलेले वरà¥à¤—' ),
- 'Mostlinkedtemplates' => array( 'सरà¥à¤µà¤¾à¤¤ जासà¥à¤¤ जोडलेले साचे', 'सरà¥à¤µà¤¾à¤¤ जासà¥à¤¤ वापरलेले साचे' ),
+ 'Mostlinked' => array( 'सरà¥à¤µà¤¾à¤¤_जासà¥à¤¤_जोडलेली' ),
+ 'Mostlinkedcategories' => array( 'सरà¥à¤µà¤¾à¤¤_जासà¥à¤¤_जोडलेले_वरà¥à¤—', 'सरà¥à¤µà¤¾à¤¤_जासà¥à¤¤_वापरलेले_वरà¥à¤—' ),
+ 'Mostlinkedtemplates' => array( 'सरà¥à¤µà¤¾à¤¤_जासà¥à¤¤_जोडलेले_साचे', 'सरà¥à¤µà¤¾à¤¤_जासà¥à¤¤_वापरलेले_साचे' ),
'Mostimages' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¸à¤¾à¤‚धलेलीसंचिका' ),
- 'Mostcategories' => array( 'सरà¥à¤µà¤¾à¤¤ जासà¥à¤¤ वरà¥à¤—' ),
+ 'Mostcategories' => array( 'सरà¥à¤µà¤¾à¤¤_जासà¥à¤¤_वरà¥à¤—' ),
'Mostrevisions' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤†à¤µà¤°à¥à¤¤à¤¨à¥‡' ),
'Fewestrevisions' => array( 'कमीतकमीआवरà¥à¤¤à¤¨à¥‡' ),
- 'Shortpages' => array( 'छोटी पाने' ),
- 'Longpages' => array( 'मोठी पाने' ),
- 'Newpages' => array( 'नवीन पाने' ),
- 'Ancientpages' => array( 'जà¥à¤¨à¥€ पाने' ),
- 'Deadendpages' => array( 'टोकाची पाने' ),
- 'Protectedpages' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पाने' ),
- 'Protectedtitles' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ शीरà¥à¤·à¤•à¥‡' ),
- 'Allpages' => array( 'सरà¥à¤µ पाने' ),
+ 'Shortpages' => array( 'छोटी_पाने' ),
+ 'Longpages' => array( 'मोठी_पाने' ),
+ 'Newpages' => array( 'नवीन_पाने' ),
+ 'Ancientpages' => array( 'जà¥à¤¨à¥€_पाने' ),
+ 'Deadendpages' => array( 'टोकाची_पाने' ),
+ 'Protectedpages' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤_पाने' ),
+ 'Protectedtitles' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤_शीरà¥à¤·à¤•à¥‡' ),
+ 'Allpages' => array( 'सरà¥à¤µ_पाने' ),
'Prefixindex' => array( 'उपसरà¥à¤—सà¥à¤šà¥€' ),
'Ipblocklist' => array( 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धनसà¥à¤šà¥€' ),
- 'Specialpages' => array( 'विशेष पाने' ),
+ 'Specialpages' => array( 'विशेष_पाने' ),
'Contributions' => array( 'योगदान' ),
'Emailuser' => array( 'विपतà¥à¤°à¤µà¤¾à¤ªà¤°à¤•à¤°à¥à¤¤à¤¾' ),
'Confirmemail' => array( 'विपतà¥à¤°à¤¨à¤•à¥à¤•à¥€à¤•à¤°à¤¾' ),
- 'Whatlinkshere' => array( 'येथे काय जोडले आहे' ),
+ 'Whatlinkshere' => array( 'येथे_काय_जोडले_आहे' ),
'Recentchangeslinked' => array( 'सांधलेलेअलिकडीलबदल' ),
- 'Movepage' => array( 'पान हलवा' ),
+ 'Movepage' => array( 'पान_हलवा' ),
'Blockme' => array( 'मलापà¥à¤°à¤¤à¤¿à¤¬à¤‚धकरा' ),
'Booksources' => array( 'पà¥à¤¸à¥à¤¤à¤•à¤¸à¥à¤°à¥‹à¤¤' ),
'Categories' => array( 'वरà¥à¤—' ),
'Export' => array( 'निरà¥à¤¯à¤¾à¤¤' ),
'Version' => array( 'आवृतà¥à¤¤à¥€' ),
- 'Allmessages' => array( 'सरà¥à¤µ निरोप' ),
+ 'Allmessages' => array( 'सरà¥à¤µ_निरोप' ),
'Log' => array( 'नोंद', 'नोंदी' ),
'Blockip' => array( 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध', 'अंकपतà¥à¤¤à¤¾à¤ªà¥à¤°à¤¤à¤¿à¤¬à¤‚ध', 'सदसà¥à¤¯à¤ªà¥à¤°à¤¤à¤¿à¤¬à¤‚ध' ),
- 'Undelete' => array( 'काढणे रदà¥à¤¦ करा' ),
+ 'Undelete' => array( 'काढणे_रदà¥à¤¦_करा' ),
'Import' => array( 'आयात' ),
- 'Lockdb' => array( 'कà¥à¤²à¥à¤ªà¤¬à¤‚द करा (डेटाबेस)' ),
+ 'Lockdb' => array( 'कà¥à¤²à¥à¤ªà¤¬à¤‚द_करा_(डेटाबेस)' ),
'Unlockdb' => array( 'विदागारताळेउघडा' ),
- 'Userrights' => array( 'खातेदाराचे अधिकार' ),
+ 'Userrights' => array( 'खातेदाराचे_अधिकार' ),
'MIMEsearch' => array( 'माईमशोध' ),
'FileDuplicateSearch' => array( 'दà¥à¤¹à¥‡à¤°à¥€à¤¸à¤‚चिकाशोध' ),
'Unwatchedpages' => array( 'अपà¥à¤°à¥‡à¤•à¥à¤·à¥€à¤¤à¤ªà¤¾à¤¨à¥‡' ),
@@ -121,17 +121,17 @@ $specialPageAliases = array(
'Revisiondelete' => array( 'आवरà¥à¤¤à¤¨à¤µà¤—ळा' ),
'Unusedtemplates' => array( 'नउपयोगातआणलेलासाचा' ),
'Randomredirect' => array( 'अविशिषà¥à¤Ÿà¥à¤ªà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨' ),
- 'Mypage' => array( 'माà¤à¥‡ पान' ),
- 'Mytalk' => array( 'माà¤à¥à¤¯à¤¾ चरà¥à¤šà¤¾' ),
- 'Mycontributions' => array( 'माà¤à¥‡ योगदान' ),
- 'Listadmins' => array( 'पà¥à¤°à¤¬à¤‚धकांची यादी' ),
- 'Listbots' => array( 'सांगकामà¥à¤¯à¤¾à¤‚ची यादी' ),
- 'Popularpages' => array( 'पà¥à¤°à¤¸à¤¿à¤¦à¥à¤§ पाने' ),
+ 'Mypage' => array( 'माà¤à¥‡_पान' ),
+ 'Mytalk' => array( 'माà¤à¥à¤¯à¤¾_चरà¥à¤šà¤¾' ),
+ 'Mycontributions' => array( 'माà¤à¥‡_योगदान' ),
+ 'Listadmins' => array( 'पà¥à¤°à¤¬à¤‚धकांची_यादी' ),
+ 'Listbots' => array( 'सांगकामà¥à¤¯à¤¾à¤‚ची_यादी' ),
+ 'Popularpages' => array( 'पà¥à¤°à¤¸à¤¿à¤¦à¥à¤§_पाने' ),
'Search' => array( 'शोधा' ),
'Resetpass' => array( 'परवलीचाशबà¥à¤¦à¤¬à¤¦à¤²à¤¾' ),
'Withoutinterwiki' => array( 'विनाआंतरविकि' ),
- 'MergeHistory' => array( 'इतिहास à¤à¤•à¤¤à¥à¤° करा' ),
- 'Filepath' => array( 'संचिकेचा पतà¥à¤¤à¤¾ (पाथ)' ),
+ 'MergeHistory' => array( 'इतिहास_à¤à¤•à¤¤à¥à¤°_करा' ),
+ 'Filepath' => array( 'संचिकेचा_पतà¥à¤¤à¤¾_(पाथ)' ),
'Invalidateemail' => array( 'चूकदिनांकविपतà¥à¤°' ),
'Blankpage' => array( 'कोरेपान' ),
'LinkSearch' => array( 'दà¥à¤µà¤¾à¤¶à¥‹à¤§' ),
@@ -246,14 +246,14 @@ $magicWords = array(
'revisionuser' => array( '1', 'आवृतà¥à¤¤à¥€à¤¸à¤¦à¤¸à¥à¤¯', 'REVISIONUSER' ),
'plural' => array( '0', 'बहà¥à¤µà¤šà¤¨:', 'PLURAL:' ),
'fullurl' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³', 'FULLURL:' ),
- 'fullurle' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤²à¥€ :', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³à¥€ :', 'FULLURLE:' ),
+ 'fullurle' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤²à¥€:', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³à¥€:', 'FULLURLE:' ),
'raw' => array( '0', 'कचà¥à¤šà¥‡:', 'RAW:' ),
'displaytitle' => array( '1', 'शीरà¥à¤·à¤•à¤¦à¤¾à¤–वा', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'ॠ', 'R' ),
'newsectionlink' => array( '1', '__नवविभागदà¥à¤µà¤¾__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__विनानवविभागदà¥à¤µà¤¾__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'सदà¥à¤¯à¤†à¤µà¥ƒà¤¤à¥à¤¤à¥€', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'संकेतसà¥à¤¥à¤²à¥€à¤†à¤‚गà¥à¤²à¥à¤¸à¤‚केत :', 'URLENCODE:' ),
+ 'urlencode' => array( '0', 'संकेतसà¥à¤¥à¤²à¥€à¤†à¤‚गà¥à¤²à¥à¤¸à¤‚केत:', 'URLENCODE:' ),
'anchorencode' => array( '0', 'नांगरआंगà¥à¤²à¤¸à¤‚केत', 'ANCHORENCODE' ),
'currenttimestamp' => array( '1', 'सदà¥à¤¯à¤•à¤¾à¤²à¤®à¥à¤¦à¥à¤°à¤¾', 'CURRENTTIMESTAMP' ),
'localtimestamp' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤•à¤¾à¤²à¤®à¥à¤¦à¥à¤°à¤¾', 'LOCALTIMESTAMP' ),
@@ -266,7 +266,7 @@ $magicWords = array(
'padleft' => array( '0', 'डावाभरीव', 'भरीवडावा', 'PADLEFT' ),
'padright' => array( '0', 'उजवाभरीव', 'भरीवउजवा', 'PADRIGHT' ),
'special' => array( '0', 'विशेष', 'special' ),
- 'defaultsort' => array( '1', 'अविचलवरà¥à¤— :', 'अविचलवरà¥à¤—कळ :', 'अविचलवरà¥à¤—वरà¥à¤—ीकरण:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'defaultsort' => array( '1', 'अविचलवरà¥à¤—:', 'अविचलवरà¥à¤—कळ:', 'अविचलवरà¥à¤—वरà¥à¤—ीकरण:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'संचिकामारà¥à¤—:', 'FILEPATH:' ),
'tag' => array( '0', 'खूण', 'खूणगाठ', 'tag' ),
'hiddencat' => array( '1', '__वरà¥à¤—लपवा__', '__HIDDENCAT__' ),
@@ -311,8 +311,7 @@ $messages = array(
'tog-editsection' => '[संपादन] दà¥à¤µà¥à¤¯à¤¾à¤¨à¥‡ संपादन करणे शकà¥à¤¯ करा',
'tog-editsectiononrightclick' => 'विभाग शीरà¥à¤·à¤•à¤¾à¤µà¤° उजवà¥à¤¯à¤¾ कà¥à¤²à¥€à¤•à¤¨à¥‡ संपादन करा(जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿ)',
'tog-showtoc' => '३ पेकà¥à¤·à¤¾ जासà¥à¤¤ शीरà¥à¤·à¤•à¥‡ असताना अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾ दाखवा',
-'tog-rememberpassword' => 'माà¤à¤¾ पà¥à¤°à¤µà¥‡à¤¶ या संगणकावर लकà¥à¤·à¤¾à¤¤ ठेवा',
-'tog-editwidth' => 'संपादन खिडकी पूरà¥à¤£ रà¥à¤‚दीची दाखवा.',
+'tog-rememberpassword' => 'माà¤à¤¾ पà¥à¤°à¤µà¥‡à¤¶ या संगणकावर लकà¥à¤·à¤¾à¤¤ ठेवा (जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ $1 {{PLURAL:$1|दिवसांकरिता}})',
'tog-watchcreations' => 'मी तयार केलेली पाने माà¤à¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत टाका',
'tog-watchdefault' => 'मी संपादित केलेली पाने माà¤à¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत टाका',
'tog-watchmoves' => 'मी सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केलेली पाने माà¤à¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत टाका',
@@ -349,6 +348,7 @@ $messages = array(
'underline-default' => 'नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤• अविचल (browser default)',
# Font style option in Special:Preferences
+'editfont-style' => 'विभागाची टंकशैली संपादा:',
'editfont-default' => 'नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤• अविचल',
'editfont-monospace' => 'à¤à¤•à¤²à¤…ंतर असलेला टंक',
'editfont-sansserif' => 'सॅनà¥à¤¸-सेरिफ टंक',
@@ -446,7 +446,7 @@ $messages = array(
# Cologne Blue skin
'qbfind' => 'शोध',
-'qbbrowse' => 'विचरण',
+'qbbrowse' => 'नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤¾',
'qbedit' => 'संपादन',
'qbpageoptions' => 'हे पान',
'qbpageinfo' => 'सामगà¥à¤°à¥€',
@@ -456,31 +456,21 @@ $messages = array(
'faqpage' => 'Project:पà¥à¤°à¤¶à¥à¤¨à¤¾à¤µà¤²à¥€',
# Vector skin
-'vector-action-addsection' => 'विषय जोडा',
-'vector-action-delete' => 'वगळा',
-'vector-action-move' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण',
-'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
-'vector-action-undelete' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
-'vector-action-unprotect' => 'असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
-'vector-namespace-category' => 'वरà¥à¤—',
-'vector-namespace-help' => 'साहायà¥à¤¯ पान',
-'vector-namespace-image' => 'संचिका',
-'vector-namespace-main' => 'लेख',
-'vector-namespace-media' => 'माधà¥à¤¯à¤® पान',
-'vector-namespace-mediawiki' => 'संदेश',
-'vector-namespace-project' => 'पà¥à¤°à¤•à¤²à¥à¤ª पान',
-'vector-namespace-special' => 'विशेष पृषà¥à¤ ',
-'vector-namespace-talk' => 'चरà¥à¤šà¤¾',
-'vector-namespace-template' => 'साचा',
-'vector-namespace-user' => 'सदसà¥à¤¯ पान',
-'vector-view-create' => 'तयार करा',
-'vector-view-edit' => 'संपादन',
-'vector-view-history' => 'इतिहास पहा',
-'vector-view-view' => 'वाचा',
-'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤ पहा',
-'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾',
-'namespaces' => 'नामविशà¥à¤µà¥‡',
-'variants' => 'असà¥à¤¥à¤¿à¤°',
+'vector-action-addsection' => 'विषय जोडा',
+'vector-action-delete' => 'वगळा',
+'vector-action-move' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण',
+'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
+'vector-action-undelete' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+'vector-action-unprotect' => 'असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
+'vector-simplesearch-preference' => 'पà¥à¤°à¤—त शोधविकलà¥à¤ª सकà¥à¤°à¤¿à¤¯ करा (फकà¥à¤¤ वà¥à¤¹à¥‡à¤•à¥à¤Ÿà¤° तà¥à¤µà¤šà¥‡à¤¸à¤¾à¤ à¥€)',
+'vector-view-create' => 'तयार करा',
+'vector-view-edit' => 'संपादन',
+'vector-view-history' => 'इतिहास पहा',
+'vector-view-view' => 'वाचा',
+'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤ पहा',
+'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾',
+'namespaces' => 'नामविशà¥à¤µà¥‡',
+'variants' => 'असà¥à¤¥à¤¿à¤°',
'errorpagetitle' => 'चूक',
'returnto' => '$1 कडे परत चला.',
@@ -535,9 +525,12 @@ $messages = array(
'protectedpage' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पृषà¥à¤ ',
'jumpto' => 'येथे जा:',
'jumptonavigation' => 'सà¥à¤šà¤¾à¤²à¤¨',
-'jumptosearch' => 'शोधयंतà¥à¤°',
-'view-pool-error' => 'माफ करा. यावेळेस सरà¥à¤µà¥à¤¹à¤°à¤µà¤° ताण आहे.अनेक सदसà¥à¤¯ हे पान बघणà¥à¤¯à¤¾à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करीत आहेत.पà¥à¤¨à¥à¤¹à¤¾ या पानावर पोचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ थोडा वेळ थांबà¥à¤¨ परत पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.
+'jumptosearch' => 'शोध',
+'view-pool-error' => 'माफ करा. यावेळेस सरà¥à¤µà¥à¤¹à¤°à¤µà¤° ताण आहे. अनेक सदसà¥à¤¯ हे पान बघणà¥à¤¯à¤¾à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करीत आहेत. पà¥à¤¨à¥à¤¹à¤¾ या पानावर पोचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ थोडा वेळ थांबून परत पà¥à¤°à¤¯à¤¤à¥â€à¤¨ करा.
$1',
+'pool-timeout' => 'ताळà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ वाट पाहताना वेळ संपली',
+'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}} बदà¥à¤¦à¤²',
@@ -624,7 +617,7 @@ $1',
ही बाब संचेतनात (सॉफà¥à¤Ÿà¤µà¥‡à¤…रमधà¥à¤¯à¥‡) कà¥à¤·à¤¿à¤¤à¤¿à¤œà¤¨à¥à¤¤à¥ असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ निरà¥à¤¦à¥‡à¤¶à¥€à¤¤ करते.
"<tt>$2</tt>" या कारà¥à¤¯à¤¾à¤¤à¥‚न निघालेली शेवटची विदापृचà¥à¤›à¤¾ पà¥à¤¢à¥€à¤² पà¥à¤°à¤®à¤¾à¤£à¥‡ होती:
<blockquote><tt>$1</tt></blockquote>
-MySQL ने "<tt>$3: $4</tt>" ही तà¥à¤°à¥‚टी दिलेली आहे.',
+मायà¤à¤¸à¤•à¥à¤¯à¥à¤à¤²à¤¨à¥‡ "<tt>$3: $4</tt>" ही तà¥à¤°à¥‚टी दिलेली आहे.',
'dberrortextcl' => 'चà¥à¤•à¥€à¤šà¥à¤¯à¤¾ पà¥à¤°à¤¶à¥à¤¨à¤²à¥‡à¤–नामà¥à¤³à¥‡ माहितीसंगà¥à¤°à¤¹ तà¥à¤°à¥à¤Ÿà¥€.
शेवटची माहितीसंगà¥à¤°à¤¹à¤¾à¤²à¤¾ पाठविलेला पà¥à¤°à¤¶à¥à¤¨ होता:
"$1"
@@ -647,6 +640,8 @@ MySQL returned error "$3: $4".',
'readonly_lag' => 'मà¥à¤–à¥à¤¯ विदागार दातà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ (master database server) बरोबरीने पोहचणà¥à¤¯à¤¾à¤¸ पराधीन-विदागारदातà¥à¤¯à¤¾à¤¸ (slave server) वेळ लागलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡, विदागार आपोआप बंद à¤à¤¾à¤²à¤¾ आहे.',
'internalerror' => 'अंतरà¥à¤—त तà¥à¤°à¥‚टी',
'internalerror_info' => 'अंतरà¥à¤—त तà¥à¤°à¥‚टी: $1',
+'fileappenderrorread' => 'जोडणीचà¥à¤¯à¤¾ दरमà¥à¤¯à¤¾à¤¨ "$1" वाचता आले नाही.',
+'fileappenderror' => '"$1" ते "$2" जोडता आले नाही.',
'filecopyerror' => '"$1" संचिकेची "$2" ही पà¥à¤°à¤¤ करता आली नाही.',
'filerenameerror' => '"$1" संचिकेचे "$2" असे नामांतर करता आले नाही.',
'filedeleteerror' => '"$1" संचिका वगळता आली नाही.',
@@ -699,7 +694,8 @@ $2',
'yourname' => 'तà¥à¤®à¤šà¥‡ नाव',
'yourpassword' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦',
'yourpasswordagain' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ पà¥à¤¨à¥à¤¹à¤¾ लिहा',
-'remembermypassword' => 'माà¤à¤¾ परवलीचा शबà¥à¤¦ पà¥à¤¢à¥€à¤² खेपेसाठी लकà¥à¤·à¤¾à¤¤ ठेवा.',
+'remembermypassword' => 'माà¤à¤¾ परवलीचा शबà¥à¤¦ पà¥à¤¢à¥€à¤² खेपेसाठी लकà¥à¤·à¤¾à¤¤ ठेवा (जासà¥à¤¤à¥€à¤¤à¤œà¤¾à¤¸à¥à¤¤ $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
+'securelogin-stick-https' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¨à¤‚तर à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€à¤à¤¸à¤šà¥à¤¯à¤¾ संपरà¥à¤•à¤¾à¤¤ रहा',
'yourdomainname' => 'तà¥à¤®à¤šà¥‡ कà¥à¤·à¥‡à¤¤à¥à¤° (डॉमेन) :',
'externaldberror' => 'विदागार ’खातरजमा’ (पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤à¥€à¤•à¤°à¤£) तà¥à¤°à¥‚टी होती अथवा तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¥‡ बाहà¥à¤¯ खाते अदà¥à¤¯à¤¾à¤µà¤¤ करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
'login' => 'पà¥à¤°à¤µà¥‡à¤¶ करा',
@@ -716,6 +712,7 @@ $2',
'gotaccount' => "जà¥à¤¨à¥‡ खाते आहे? '''$1'''.",
'gotaccountlink' => 'पà¥à¤°à¤µà¥‡à¤¶ करा',
'createaccountmail' => 'इमेल दà¥à¤µà¤¾à¤°à¥‡',
+'createaccountreason' => 'कारण:',
'badretype' => 'आपला परवलीचा शबà¥à¤¦ चà¥à¤•à¥€à¤šà¤¾ आहे.',
'userexists' => 'या नावाने सदसà¥à¤¯à¤¾à¤šà¥€ नोंदणी à¤à¤¾à¤²à¥‡à¤²à¥€ आहे.
कृपया दà¥à¤¸à¤°à¥‡ सदसà¥à¤¯ नाव निवडा.',
@@ -726,21 +723,22 @@ $2',
'noname' => 'आपण नोंदणीसाठी सदसà¥à¤¯à¤¾à¤šà¥‡ योगà¥à¤¯ नाव लिहिले नाही.',
'loginsuccesstitle' => 'आपलà¥à¤¯à¤¾ पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤šà¥€ नोंदणी यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ पूरà¥à¤£ à¤à¤¾à¤²à¥€',
'loginsuccess' => "'''तà¥à¤®à¥à¤¹à¥€ {{SITENAME}} वर \"\$1\" नावाने पà¥à¤°à¤µà¥‡à¤¶ केला आहे.'''",
-'nosuchuser' => '"$1" या नावाचा कोणताही सदसà¥à¤¯ नाही.तà¥à¤®à¤šà¥‡ शà¥à¤¦à¥à¤§à¤²à¥‡à¤–न तपासा, किंवा नवीन खाते तयार करा.',
+'nosuchuser' => '"$1" या नावाचा कोणताही सदसà¥à¤¯ नाही.तà¥à¤®à¤šà¥‡ शà¥à¤¦à¥à¤§à¤²à¥‡à¤–न तपासा, किंवा [[Special:UserLogin/signup|नवीन खाते]] तयार करा.',
'nosuchusershort' => '"<nowiki>$1</nowiki>" या नावाचा सदसà¥à¤¯ नाही. लिहीताना आपली चूक तर नाही ना à¤à¤¾à¤²à¥€?',
'nouserspecified' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ सदसà¥à¤¯à¤¨à¤¾à¤µ नमà¥à¤¦ करावे लागेल.',
'login-userblocked' => 'या सदसà¥à¤¯à¤¾à¤šà¥‡ खाते ’पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित’ आहे. तà¥à¤¯à¤¾à¤¸ पà¥à¤°à¤µà¥‡à¤¶ करॠदेणे शकà¥à¤¯ नाही.',
'wrongpassword' => 'आपला परवलीचा शबà¥à¤¦ चà¥à¤•à¥€à¤šà¤¾ आहे, पà¥à¤¨à¥à¤¹à¤¾ à¤à¤•à¤¦à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
'wrongpasswordempty' => 'परवलीचा शबà¥à¤¦ रिकामा आहे; परत पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
-'passwordtooshort' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ जरूरीपेकà¥à¤·à¤¾ लहान आहे. यात कमीत कमी $1 अकà¥à¤·à¤°à¥‡ पाहिजेत.',
+'passwordtooshort' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ जरूरीपेकà¥à¤·à¤¾ लहान आहे. यात कमीत कमी {{PLURAL:$1|१ अकà¥à¤·à¤° |$1 अकà¥à¤·à¤°à¥‡}} पाहिजेत.',
'password-name-match' => 'आपला परवलीचा शबà¥à¤¦ हा आपलà¥à¤¯à¤¾ सदसà¥à¤¯à¤¨à¤¾à¤µà¤¾à¤ªà¥‡à¤•à¥à¤·à¤¾ वेगळा हवा.',
+'password-login-forbidden' => 'या सदसà¥à¤¯à¤¨à¤¾à¤®à¤¾à¤šà¤¾ व परवलीचà¥à¤¯à¤¾ शबà¥à¤¦à¤¾à¤šà¤¾ वापर निषिदà¥à¤§ आहे.',
'mailmypassword' => 'परवलीचा नवीन शबà¥à¤¦ इमेल पतà¥à¤¤à¥à¤¯à¤¾à¤µà¤° पाठवा',
'passwordremindertitle' => '{{SITENAME}}करिता नवा तातà¥à¤ªà¥à¤°à¤¤à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क.',
'passwordremindertext' => 'कà¥à¤£à¥€à¤¤à¤°à¥€ (कदाचित तà¥à¤®à¥à¤¹à¥€, अंकपतà¥à¤¤à¤¾ $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शबà¥à¤¦à¤¾à¤‚क पाठवावा’ अशी विनंती केली आहे ($4).
"$2" सदसà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क "$3" à¤à¤¾à¤²à¤¾ आहे.
-तà¥à¤®à¥à¤¹à¥€ आता पà¥à¤°à¤µà¥‡à¤¶ करा व तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क बदला.
+तà¥à¤®à¥à¤¹à¥€ आता पà¥à¤°à¤µà¥‡à¤¶ करा व तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क बदला. तà¥à¤®à¤šà¤¾ असà¥à¤¥à¤¾à¤¯à¥€ शबà¥à¤¦à¤¾à¤‚क {{PLURAL:$5|à¤à¤•à¤¾ दिवसात|$5 दिवसांत}} संपेल.
-जर ही विनंती इतर कà¥à¤£à¥€ केली असेल किंवा तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क आठवला असेल आणि तà¥à¤®à¥à¤¹à¥€ तो आता बदलू इचà¥à¤›à¤¿à¤¤ नसाल तर, तà¥à¤®à¥à¤¹à¥€ हा संदेश दूरà¥à¤²à¤•à¥à¤·à¤¿à¤¤ करून जूना परवलीचा शबà¥à¤¦à¤¾à¤‚क वापरत राहू शकता.',
+जर ही विनंती इतर कà¥à¤£à¥€ केली असेल किंवा तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क आठवला असेल आणि तà¥à¤®à¥à¤¹à¥€ तो आता बदलू इचà¥à¤›à¤¿à¤¤ नसाल तर, तà¥à¤®à¥à¤¹à¥€ हा संदेश दà¥à¤°à¥à¤²à¤•à¥à¤·à¤¿à¤¤ करून जà¥à¤¨à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क वापरत राहू शकता.',
'noemail' => '"$1" सदसà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ कोणताही इमेल पतà¥à¤¤à¤¾ दिलेला नाही.',
'noemailcreate' => 'आपण वैध विरोप-पतà¥à¤¤à¤¾ (ई-मेल à¤à¤¡à¥à¤°à¥‡à¤¸) देणे आवशà¥à¤¯à¤• आहे.',
'passwordsent' => '"$1" सदसà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ इमेल पतà¥à¤¤à¥à¤¯à¤¾à¤µà¤° परवलीचा नवीन शबà¥à¤¦ पाठविणà¥à¤¯à¤¾à¤¤ आलेला आहे.
@@ -750,8 +748,8 @@ $2',
खातà¥à¤¯à¤¾à¤µà¤° कोणताही इतर ई-मेल पाठविणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ - तो ई-मेल पतà¥à¤¤à¤¾ तà¥à¤®à¤šà¤¾à¤š आहे, हे सूनिशà¥à¤šà¤¿à¤¤ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ - तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤¯à¤¾ ई-मेल मधील सूचनांचे पालन करावे लागेल.',
'throttled-mailpassword' => 'मागील {{PLURAL:$1|à¤à¤•à¤¾ तासामधà¥à¤¯à¥‡|$1 तासांमधà¥à¤¯à¥‡}} परवलीचा शबà¥à¤¦ बदलणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€à¤šà¥€ सूचना पाठविलेली आहे. दà¥à¤°à¥à¤ªà¤¯à¥‹à¤— टाळणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ {{PLURAL:$1|à¤à¤•à¤¾ तासामधà¥à¤¯à¥‡|$1 तासांमधà¥à¤¯à¥‡}} फकà¥à¤¤ à¤à¤•à¤¦à¤¾à¤š सूचना दिली जाईल.',
'mailerror' => 'विपतà¥à¤° पाठवणà¥à¤¯à¤¾à¤¤ तà¥à¤°à¥‚टी: $1',
-'acct_creation_throttle_hit' => 'माफ करा, तà¥à¤®à¥à¤¹à¥€ आतà¥à¤¤à¤¾à¤ªà¤°à¥à¤¯à¤‚त $1 खाती उघडली आहेत. तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ आणखी खाती उघडता येणार नाहीत.',
-'emailauthenticated' => 'तà¥à¤®à¤šà¤¾ इ-मेल $1 ला तपासलेला आहे.',
+'acct_creation_throttle_hit' => 'माफ करा, तà¥à¤®à¥à¤¹à¥€ आतà¥à¤¤à¤¾à¤ªà¤°à¥à¤¯à¤‚त {{PLURAL:$1|१ खाते उघडले आहे|$1 खाती उघडली आहेत}}. तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ आणखी खाती उघडता येणार नाहीत.',
+'emailauthenticated' => 'तà¥à¤®à¤šà¤¾ विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ $3 येथे $2 यावेळी तपासणà¥à¤¯à¤¾à¤¤ आला आहे.',
'emailnotauthenticated' => 'तà¥à¤®à¤šà¤¾ इमेल पतà¥à¤¤à¤¾ तपासलेला नाही. खालील कारà¥à¤¯à¤¾à¤‚करिता इमेल पाठविला जाणार नाही.',
'noemailprefs' => 'खालील सà¥à¤µà¤¿à¤§à¤¾ कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¿à¤¤ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ इ-मेल पतà¥à¤¤à¤¾ पà¥à¤°à¤µà¤¾.',
'emailconfirmlink' => 'आपला इमेल पतà¥à¤¤à¤¾ तपासून पहा.',
@@ -763,21 +761,30 @@ $2',
जर ही नोंदणी चà¥à¤•à¥€à¤¨à¥‡ à¤à¤¾à¤²à¥€ असेल तर तà¥à¤®à¥à¤¹à¥€ या संदेशाकडे दà¥à¤°à¥à¤²à¤•à¥à¤· करू शकता.',
'usernamehasherror' => 'सदसà¥à¤¯à¤¨à¤¾à¤®à¤¾à¤¤ "हॅश" वरà¥à¤£ असू शकत नाहीत.',
+'login-throttled' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤µà¥‡à¤¶ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ खूप पà¥à¤°à¤¯à¤¤à¥â€à¤¨ केले आहेत.
+कृपया पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥â€à¤¨ करणà¥à¤¯à¤¾à¤†à¤§à¥€ थांबा',
'loginlanguagelabel' => 'भाषा: $1',
+'suspicious-userlogout' => 'तà¥à¤®à¤šà¥‡ अदाखल होणे पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित à¤à¤¾à¤²à¥‡ कारण असे दिसते की ते तà¥à¤Ÿà¤²à¥‡à¤²à¥à¤¯à¤¾ नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤•à¤¾à¤¦à¥à¤µà¤¾à¤°à¥‡ पाठवले गेले.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'पीà¤à¤šà¤ªà¥€à¤šà¥à¤¯à¤¾ विपतà¥à¤°() परà¥à¤¯à¤¾à¤¯à¤¾à¤¤ अजà¥à¤žà¤¾à¤¤ चूक',
# Password reset dialog
'resetpass' => 'परवलीचा शबà¥à¤¦ बदला',
'resetpass_announce' => 'तà¥à¤®à¥à¤¹à¥€ इमेलमधून दिलेलà¥à¤¯à¤¾ तातà¥à¤ªà¥à¤°à¤¤à¥à¤¯à¤¾ शबà¥à¤¦à¤¾à¤‚काने पà¥à¤°à¤µà¥‡à¤¶ केलेला आहे. आपली सदसà¥à¤¯ नोंदणी पूरà¥à¤£ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ कृपया इथे नवीन परवलीचा शबà¥à¤¦ दà¥à¤¯à¤¾:',
'resetpass_text' => '<!-- मजकूर इथे लिहा -->',
-'resetpass_header' => 'परवलीचे पà¥à¤°à¥à¤¨à¤¯à¥‹à¤œà¤¨ करा',
+'resetpass_header' => 'खातà¥à¤¯à¤¾à¤šà¤¾ परवलीचा शबà¥à¤¦ बदला',
'oldpassword' => 'जà¥à¤¨à¤¾ परवलीचा शबà¥à¤¦à¤ƒ',
'newpassword' => 'नवीन परवलीचा शबà¥à¤¦:',
'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' => 'तातà¥à¤ªà¥à¤°à¤¤à¤¾ परवलीचा शबà¥à¤¦',
# Edit page toolbar
@@ -811,9 +818,10 @@ $2',
'showlivepreview' => 'थेट à¤à¤²à¤•',
'showdiff' => 'बदल दाखवा',
'anoneditwarning' => "'''सावधानः''' तà¥à¤®à¥à¤¹à¥€ विकिपीडियाचे सदसà¥à¤¯ मà¥à¤¹à¤£à¥‚न पà¥à¤°à¤µà¥‡à¤¶ (लॉग-इन) केलेला नाही. या पानाचà¥à¤¯à¤¾ संपादन इतिहासात तà¥à¤®à¤šà¤¾ आय.पी. à¤à¤¡à¥à¤°à¥‡à¤¸ नोंदला जाईल.",
+'anonpreviewwarning' => "\"'''सावधान:''' तà¥à¤®à¥à¤¹à¥€ विकिपीडियाचे सदसà¥à¤¯ मà¥à¤¹à¤£à¥‚न पà¥à¤°à¤µà¥‡à¤¶ (लॉग-इन) केलेला नाही. या पानाचà¥à¤¯à¤¾ संपादन इतिहासात तà¥à¤®à¤šà¤¾ आय.पी. अंकपतà¥à¤¤à¤¾ (अâ€à¥…डà¥à¤°à¥‡à¤¸) नोंदला जाईल.\"",
'missingsummary' => "'''आठवण:''' तूमà¥à¤¹à¥€ संपादन सारांश पà¥à¤°à¤µà¤²à¥‡à¤²à¤¾ नाही.आपण जतन करा वर पà¥à¤¨à¥à¤¹à¤¾ टीचकी मारली तर तेतà¥à¤¯à¤¾ शिवाय जतन होईल.",
'missingcommenttext' => 'कृपया खाली पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾ भरा.',
-'missingcommentheader' => "'''आठवण:'''आपण या लेखनाकरिता विषय किंवा अधोरेषा दिलेली नाही .आपण पà¥à¤¨à¥à¤¹ जतन करा अशी सà¥à¤šà¤¨à¤¾ केली तर, तà¥à¤®à¤šà¥‡ संपादन तà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯à¤š जतन होईल.",
+'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा अधोरेषा दिलेली नाही. आपण पà¥à¤¨à¥à¤¹à¤¾ जतन करा अशी सूचना केली तर, तà¥à¤®à¤šà¥‡ संपादन तà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯à¤š जतन होईल.",
'summary-preview' => 'आढावà¥à¤¯à¤¾à¤šà¥€ à¤à¤²à¤•:',
'subject-preview' => 'विषय/मथळा à¤à¤²à¤•:',
'blockedtitle' => 'या सदसà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ पà¥à¤°à¤µà¥‡à¤¶ नाकारणà¥à¤¯à¤¾à¤¤ आलेला आहे.',
@@ -830,7 +838,7 @@ $2',
तà¥à¤®à¥à¤¹à¥€ जोवर वैध इमेल पतà¥à¤¤à¤¾ आपलà¥à¤¯à¤¾ [[Special:Preferences|माà¤à¥à¤¯à¤¾ पसंती]] पानावर देत नाही तोवर तà¥à¤®à¥à¤¹à¥€ ’सदसà¥à¤¯à¤¾à¤²à¤¾ इमेल पाठवा’ हा दà¥à¤µà¤¾ वापरू शकत नाही. तसेच असे करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न आपलà¥à¤¯à¤¾à¤²à¤¾ बà¥à¤²à¥‰à¤• केलेले नाही.
तà¥à¤®à¤šà¤¾ सधà¥à¤¯à¤¾à¤šà¤¾ IP पतà¥à¤¤à¤¾ $3 हा आहे, व तà¥à¤®à¤šà¤¾ बà¥à¤²à¥‰à¤• कà¥à¤°à¤®à¤¾à¤‚क #$5 हा आहे.
कृपया या संदरà¥à¤­à¤¾à¤¤à¥€à¤² चरà¥à¤šà¥‡à¤®à¤§à¥à¤¯à¥‡ यापैकी काहीही उदà¥à¤˜à¥ƒà¤¤ करा.",
-'autoblockedtext' => 'तà¥à¤®à¤šà¤¾ आंतरजालीय अंकपतà¥à¤¤à¤¾ आपोआप सà¥à¤¥à¤—ीत केला आहे कारण तो इतर अशा सदसà¥à¤¯à¤¾à¤¨à¥‡ वापरलाकी, जà¥à¤¯à¤¾à¤²à¤¾ $1ने पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केले.
+'autoblockedtext' => 'तà¥à¤®à¤šà¤¾ आंतरजालीय अंकपतà¥à¤¤à¤¾ आपोआप सà¥à¤¥à¤—ित केला आहे कारण तो इतर अशा सदसà¥à¤¯à¤¾à¤¨à¥‡ वापरलाकी, जà¥à¤¯à¤¾à¤²à¤¾ $1ने पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केले.
आणि दिलेले कारण खालील पà¥à¤°à¤®à¤¾à¤£à¥‡ आहे
:\'\'$2\'\'
@@ -854,25 +862,34 @@ $2',
'loginreqlink' => 'पà¥à¤°à¤µà¥‡à¤¶ करा',
'loginreqpagetext' => 'तà¥à¤®à¥à¤¹à¥€ इतर पाने पहाणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ $1 केलेच पाहिजे.',
'accmailtitle' => 'परवलीचा शबà¥à¤¦ पाठविणà¥à¤¯à¤¾à¤¤ आलेला आहे.',
-'accmailtext' => "'$1' चा परवलीचा शबà¥à¤¦ $2 पाठविणà¥à¤¯à¤¾à¤¤ आलेला आहे.",
+'accmailtext' => '[[User talk:$1|$1]] यांसाठी अविशिषà¥à¤Ÿà¤ªà¤¨à¥† निरà¥à¤®à¤¿à¤¤ केलेला परवलीचा शबà¥à¤¦ $2 यांना पाठवणà¥à¤¯à¤¾à¤¤ आला आहे.
+
+या नवीन खातà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€à¤šà¤¾ परवलीचा शबà¥à¤¦ पà¥à¤°à¤µà¥‡à¤¶ घेतलà¥à¤¯à¤¾à¤µà¤° [[Special:ChangePassword|येथे]] बदलता येईल.',
'newarticle' => '(नवीन लेख)',
'newarticletext' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ अपेकà¥à¤·à¤¿à¤¤ असलेला लेख अजून लिहिला गेलेला नाही. हा लेख लिहिणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ खालील पेटीत मजकूर लिहा. मदतीसाठी [[{{MediaWiki:Helppage}}|येथे]] टिचकी दà¥à¤¯à¤¾.
जर येथे चà¥à¤•à¥‚न आला असाल तर बà¥à¤°à¤¾à¤‰à¤à¤°à¤šà¥à¤¯à¤¾ बॅक (back) कळीवर टिचकी दà¥à¤¯à¤¾.',
-'anontalkpagetext' => "---- ''हे बोलपान अशा अजà¥à¤žà¤¾à¤¤ सदसà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आहे जà¥à¤¯à¤¾à¤‚नी खाते तयार केलेले नाही किंवा तà¥à¤¯à¤¾à¤šà¤¾ वापर करत नाहीत. तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ ओळखीसाठी आमà¥à¤¹à¥€ आंतरजाल अंकपतà¥à¤¤à¤¾ वापरतो आहोत. असा अंकपतà¥à¤¤à¤¾ बरà¥â€à¤¯à¤¾à¤š लोकांचा à¤à¤•à¤š असू शकतो जर आपण अजà¥à¤žà¤¾à¤¤ सदसà¥à¤¯ असाल आणि आपलà¥à¤¯à¤¾à¤²à¤¾ काही अपà¥à¤°à¤¾à¤¸à¤‚गिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा किंवा पà¥à¤°à¤µà¥‡à¤¶ करा]] जà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ पà¥à¤¢à¥‡ असे गैरसमज होणार नाहीत.''",
+'anontalkpagetext' => "---- ''हे बोलपान अशा अजà¥à¤žà¤¾à¤¤ सदसà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आहे जà¥à¤¯à¤¾à¤‚नी खाते तयार केलेले नाही किंवा तà¥à¤¯à¤¾à¤šà¤¾ वापर करत नाहीत. तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ ओळखीसाठी आमà¥à¤¹à¥€ आंतरजाल अंकपतà¥à¤¤à¤¾ वापरतो आहोत. असा अंकपतà¥à¤¤à¤¾ बरà¥â€à¤¯à¤¾à¤š लोकांचा à¤à¤•à¤š असू शकतो जर आपण अजà¥à¤žà¤¾à¤¤ सदसà¥à¤¯ असाल आणि आपलà¥à¤¯à¤¾à¤²à¤¾ काही अपà¥à¤°à¤¾à¤¸à¤‚गिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:UserLogin/signup|पà¥à¤°à¤µà¥‡à¤¶ करा]] जà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ पà¥à¤¢à¥‡ असे गैरसमज होणार नाहीत.''",
'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}}}} इतर यादà¥à¤¯à¤¾ शोधा],
+किंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.',
'userpage-userdoesnotexist' => '"$1" सदसà¥à¤¯ खाते नोंदीकॄत नाही.कृपया हे पान तà¥à¤®à¥à¤¹à¥€ संपादीत किंवा नवà¥à¤¯à¤¾à¤¨à¥‡ तयार करू इचà¥à¤›à¤¿à¤¤à¤¾ का या बदà¥à¤¦à¤² विचार करा.',
'userpage-userdoesnotexist-view' => 'सदसà¥à¤¯à¤–ाते "$1" हे नोंदलेले नाही.',
+'blocked-notice-logextract' => 'हा सदसà¥à¤¯ सधà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.
+सरà¥à¤µà¤¾à¤‚त नवीन पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन यादी खाली संदरà¥à¤­à¤¾à¤¸à¤¾à¤ à¥€ दिली आहे:',
'clearyourcache' => "'''सूचना:''' जतन केलà¥à¤¯à¤¾à¤¨à¤‚तर, बदल पहाणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¥à¤¯à¤¾ विचरकाची सय टाळायला लागू शकते. '''मोà¤à¥€à¤²à¥à¤²à¤¾/फायरफॉकà¥à¤¸ /सफारी:''' ''Reload''करताना ''Shift''दाबून ठेवा किंवा ''Ctrl-Shift-R'' दाबा
(à¤à¤ªà¤² मॅक वर ''Cmd-shift-R'');'''IE:''' ''Refresh'' टिचकताना ''Ctrl'' दाबा,किंवा ''Ctrl-F5'' दाबा ; '''Konqueror:''': केवळ '''Reload''' टिचकवा,किवा ''F5'' दाबा; '''Opera'''उपयोगकरà¥à¤¤à¥à¤¯à¤¾à¤‚ना ''Tools→Preferences'' मधील सय पूरà¥à¤£ रिकामी करायला लागेल.",
-'usercssyoucanpreview' => "'''टीप:'''तà¥à¤®à¤šà¥‡ नवे CSS जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ 'à¤à¤²à¤• पहा' कळ वापरा.",
-'userjsyoucanpreview' => "'''टीप:'''तà¥à¤®à¤šà¥‡ नवे JS जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ 'à¤à¤²à¤• पहा' कळ वापरा.",
+'usercssyoucanpreview' => "'''टीप:'''तà¥à¤®à¤šà¥‡ नवे सीà¤à¤¸à¤à¤¸ जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ 'à¤à¤²à¤• पहा' कळ वापरा.",
+'userjsyoucanpreview' => "'''टीप:''' तà¥à¤®à¤šà¤¾ नवा जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ 'à¤à¤²à¤• पहा' कळ वापरा.",
'usercsspreview' => "'''तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ सी.à¤à¤¸.à¤à¤¸.ची केवळ à¤à¤²à¤• पहात आहात, ती अजून जतन केलेली नाही हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾.'''",
'userjspreview' => "'''तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥€ सदसà¥à¤¯ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ तपासत आहात किंवा à¤à¤²à¤• पहात आहात ,ती अजून जतन केलेली नाही हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾!'''",
-'userinvalidcssjstitle' => "'''सावधान:''' \"\$1\" अशी तà¥à¤µà¤šà¤¾ नाही.custom .css आणि .js पाने lowercase title वापरतात हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾, उदा. {{ns:user}}:Foo/monobook.css या विरूदà¥à¤§ {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ सी.à¤à¤¸.à¤à¤¸.ची केवळ à¤à¤²à¤• पहात आहात, ती अजून जतन केलेली नाही हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾.'''",
+'sitejspreview' => "'''तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤šà¥€ केवळ à¤à¤²à¤• पहात आहात, ती अजून जतन केलेली नाही हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾.'''",
+'userinvalidcssjstitle' => "'''सावधान:''' \"\$1\" अशी तà¥à¤µà¤šà¤¾ नाही.custom .css आणि .js पाने lowercase title वापरतात हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾, उदा. {{ns:user}}:Foo/vector.css या विरूदà¥à¤§ {{ns:user}}:Foo/Vector.css.",
'updated' => '(बदल à¤à¤¾à¤²à¤¾ आहे.)',
'note' => "'''सूचना:'''",
'previewnote' => "'''लकà¥à¤·à¤¾à¤¤ ठेवा की ही फकà¥à¤¤ à¤à¤²à¤• आहे, बदल अजून सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केलेले नाहीत.'''",
@@ -888,7 +905,7 @@ $2',
असे कदाचित तà¥à¤®à¥à¤¹à¥€ अनामिक proxy वापरत असलà¥à¤¯à¤¾à¤¨à¥‡ होऊ शकते.'''",
'editing' => '$1 चे संपादन होत आहे.',
'editingsection' => '$1 (विभाग) संपादन',
-'editingcomment' => '$1 संपादन (पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾)',
+'editingcomment' => '$1 चे संपादन (पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾)',
'editconflict' => 'वादगà¥à¤°à¤¸à¥à¤¤ संपादन: $1',
'explainconflict' => "तà¥à¤®à¥à¤¹à¥€ संपादनाला सà¥à¤°à¥‚वात केलà¥à¤¯à¤¾à¤¨à¤‚तर इतर कोणीतरी बदल केला आहे.
वरील पाठà¥à¤¯à¤­à¤¾à¤—ामधà¥à¤¯à¥‡ सधà¥à¤¯à¤¾ असà¥à¤¤à¤¿à¤µà¤¾à¤¤ असलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤¾à¤¤à¥€à¤² पाठà¥à¤¯ आहे, तर तà¥à¤®à¤šà¥‡ बदल खालील पाठà¥à¤¯à¤­à¤¾à¤—ात दरà¥à¤¶à¤µà¤¿à¤²à¥‡à¤²à¥‡ आहेत.
@@ -904,18 +921,16 @@ $2',
तà¥à¤®à¥à¤¹à¥€ येथे लेखन करताना हे सà¥à¤¦à¥à¤§à¤¾ गृहित धरलेले असते की येथे केलेले लेखन तà¥à¤®à¤šà¥‡ सà¥à¤µà¤¤à¤ƒà¤šà¥‡ आणि केवळ सà¥à¤µà¤¤à¤ƒà¤šà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° (कॉपीराईट) मालकीचे आहे किंवा पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¾à¤¨à¥‡ गठीत न होणारà¥â€à¤¯à¤¾ सारà¥à¤µà¤œà¤¨à¤¿à¤• जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤°à¤¾à¤¤à¥‚न घेतले आहे किंवा ततà¥à¤¸à¤® मà¥à¤•à¥à¤¤ सà¥à¤°à¥‹à¤¤à¤¾à¤¤à¥‚न घेतले आहे. तà¥à¤®à¥à¤¹à¥€ संपादन करताना तसे वचन देत आहात. '''पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¯à¥à¤•à¥à¤¤ लेखन सà¥à¤¯à¥‹à¤—à¥à¤¯ परवानगीशिवाय मà¥à¤³à¥€à¤š चढवू/भरू नये!'''",
'copyrightwarning2' => "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपलà¥à¤¯à¤¾ लेखनाचे मà¥à¤•à¥à¤¤ संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />
तà¥à¤®à¥à¤¹à¥€ येथे लेखन करताना हे सà¥à¤¦à¥à¤§à¤¾ गृहित धरलेले असते की येथे केलेले लेखन तà¥à¤®à¤šà¥‡ सà¥à¤µà¤¤à¤ƒà¤šà¥‡ आणि केवळ सà¥à¤µà¤¤à¤ƒà¤šà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° (कॉपीराईट) मालकीचे आहे किंवा पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¾à¤¨à¥‡ गठीत न होणारà¥â€à¤¯à¤¾ सारà¥à¤µà¤œà¤¨à¤¿à¤• जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤°à¤¾à¤¤à¥‚न घेतले आहे किंवा ततà¥à¤¸à¤® मà¥à¤•à¥à¤¤ सà¥à¤°à¥‹à¤¤à¤¾à¤¤à¥‚न घेतले आहे. तà¥à¤®à¥à¤¹à¥€ संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¯à¥à¤•à¥à¤¤ लेखन सà¥à¤¯à¥‹à¤—à¥à¤¯ परवानगीशिवाय मà¥à¤³à¥€à¤š चढवू/भरू नये!'''",
-'longpagewarning' => "'''इशारा: हे पृषà¥à¤  $1 kilobytes लांबीचे आहे; काही विचरकांना सà¥à¤®à¤¾à¤°à¥‡ ३२ किलोबाईटà¥à¤¸à¥ आणि तà¥à¤¯à¤¾à¤ªà¥‡à¤•à¥à¤·à¤¾ जासà¥à¤¤ लांबीचà¥à¤¯à¤¾ पृषà¥à¤ à¤¾à¤‚ना संपादित करणà¥à¤¯à¤¾à¤¸ अडचण येऊ शकते.
-कृपया या पृषà¥à¤ à¤¾à¤šà¥‡ तà¥à¤¯à¤¾à¤¹à¥‚न छोटà¥à¤¯à¤¾ भागात रà¥à¤ªà¤¾à¤‚तर करावे.'''",
'longpageerror' => "'''तà¥à¤°à¥‚टी:आपण दिलेला मजकà¥à¤° जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ शकà¥à¤¯ $2 किलोबाईट पेकà¥à¤·à¤¾ अधिक लांबीचा $1 किलोबाईट आहे.तो जतन केला जाऊ शकत नाही.'''",
'readonlywarning' => "सावधान:विदागारास भरण-पोषणाकरिता ताळे ठोकले आहे,तà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ सधà¥à¤¯à¤¾ तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥‡ संपादन जतन करू शकत नाही.जर तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हवे असेल तर नंतर उपयोग करणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ दृषà¥à¤Ÿà¥€à¤¨à¥‡, तà¥à¤®à¥à¤¹à¥€ मजकà¥à¤° ’मजकà¥à¤° संचिकेत’(टेकà¥à¤¸à¥à¤Ÿ फाईल मधà¥à¤¯à¥‡) कापून-चिटकवू शकता.'''
विदागारास ताळे ठोकलेलà¥à¤¯à¤¾ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚नी $1 असे सà¥à¤ªà¤·à¥à¤Ÿà¥€à¤•à¤°à¤£à¥‡ दीले आहे",
-'protectedpagewarning' => "'''सूचना: हे सà¥à¤°à¤•à¥à¤·à¥€à¤¤ पान आहे. फकà¥à¤¤ पà¥à¤°à¤šà¤¾à¤²à¤• याचà¥à¤¯à¤¾à¤¤ बदल करॠशकतात.'''",
-'semiprotectedpagewarning' => "'''सूचना:''' हे पान सà¥à¤°à¤•à¥à¤·à¥€à¤¤ आहे. फकà¥à¤¤ सदसà¥à¤¯ याचà¥à¤¯à¤¾à¤¤ बदल करू शकतात.",
+'protectedpagewarning' => "'''सूचना: हे सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पान आहे. फकà¥à¤¤ पà¥à¤°à¤šà¤¾à¤²à¤• याचà¥à¤¯à¤¾à¤¤ बदल करॠशकतात.'''",
+'semiprotectedpagewarning' => "'''सूचना:''' हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ आहे. फकà¥à¤¤ नोंदणीकृत सदसà¥à¤¯ याचà¥à¤¯à¤¾à¤¤ बदल करू शकतात.",
'cascadeprotectedwarning' => "'''सावधान:''' हे पान निमà¥à¤¨-लिखीत शिडी-पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत {{PLURAL:$1|पानात|पानात}} आंतरभूत असलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡,केवळ पà¥à¤°à¤šà¤¾à¤²à¤• सà¥à¤µà¤¿à¤§à¤¾à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ सदसà¥à¤¯à¤¾à¤‚नाच संपादन करता यावे असे ताळे तà¥à¤¯à¤¾à¤¸ ठोकलेले आहे :",
-'titleprotectedwarning' => "सावधान:फकà¥à¤¤ काही सदसà¥à¤¯à¤¾à¤¨à¤¾à¤‚च [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे मà¥à¤¹à¤£à¥‚न हà¥à¤¯à¤¾ पानास ताळे आहे.'''",
-'templatesused' => 'या पानावर खालील साचे वापरणà¥à¤¯à¤¾à¤¤ आलेले आहेत:',
-'templatesusedpreview' => 'या à¤à¤²à¤•à¥‡à¤®à¤§à¥à¤¯à¥‡ वापरलेले साचे:',
-'templatesusedsection' => 'या विभागात वापरलेले साचे:',
+'titleprotectedwarning' => "â€â€™à¤¸à¤¾à¤µà¤§à¤¾à¤¨: फकà¥à¤¤ काही सदसà¥à¤¯à¤¾à¤¨à¤¾à¤‚च [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे मà¥à¤¹à¤£à¥‚न हà¥à¤¯à¤¾ पानास ताळे आहे.'''",
+'templatesused' => 'या à¤à¤²à¤•à¥‡à¤®à¤§à¥à¤¯à¥‡ {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:',
+'templatesusedpreview' => 'या à¤à¤²à¤•à¥‡à¤®à¤§à¥à¤¯à¥‡ {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:',
+'templatesusedsection' => 'या विभागामधà¥à¤¯à¥‡ {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:',
'template-protected' => '(सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
'template-semiprotected' => '(अरà¥à¤§-सà¥à¤°à¤•à¥à¤·à¥€à¤¤)',
'hiddencategories' => 'हे पान खालील {{PLURAL:$1|à¤à¤•à¤¾ लपविलेलà¥à¤¯à¤¾ वरà¥à¤—ामधà¥à¤¯à¥‡|$1 लपविलेलà¥à¤¯à¤¾ वरà¥à¤—ांमधà¥à¤¯à¥‡}} आहे:',
@@ -934,15 +949,18 @@ $2',
'moveddeleted-notice' => 'हे पान वगळणà¥à¤¯à¤¾à¤¤ आलेले आहे.
खाली संदरà¥à¤­à¤¾à¤¸à¤¾à¤ à¥€ वगळणà¥à¤¯à¤¾à¤šà¥€ सूची दिलेली आहे.',
'log-fulllog' => 'पूरà¥à¤£ यादी पहा.',
+'edit-hook-aborted' => 'हूकदà¥à¤µà¤¾à¤°à¥‡ संपादन रदà¥à¤¦.
+कारण नाही.',
'edit-gone-missing' => 'नविन पृषà¥à¤  तयार करता आले नाही. पूरà¥à¤µà¥€à¤ªà¤¾à¤¸à¥‚न असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे.',
'edit-conflict' => 'वादगà¥à¤°à¤¸à¥à¤¤ संपादन',
+'edit-no-change' => 'तà¥à¤®à¤šà¥‡ संपादन दà¥à¤°à¥à¤²à¤•à¥à¤·à¤¿à¤¤ करणà¥à¤¯à¤¾à¤¤ आले आहे, कारण माहितीमधà¥à¤¯à¥‡ काहीही बदल à¤à¤¾à¤²à¥‡à¤²à¤¾ नाही.',
'edit-already-exists' => 'नवीन पान तयार करता येऊ शकले नाही.
या नावाचे पान आधीच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे.',
# Parser/template warnings
-'expensive-parserfunction-warning' => 'इशारा: या पानावर खूप सारे खरà¥à¤šà¤¿à¤• पृथकà¥à¤•à¤°à¤£ कà¥à¤°à¤¿à¤¯à¤¾ कॉलà¥à¤¸ आहेत.
+'expensive-parserfunction-warning' => 'â€â€™à¤‡à¤¶à¤¾à¤°à¤¾:â€â€™ या पानावर खूप सारे खरà¥à¤šà¤¿à¤• पृथकà¥à¤•à¤°à¤£ कà¥à¤°à¤¿à¤¯à¤¾ कॉलà¥à¤¸ आहेत.
-ते $2{{PLURAL:$2|कॉल|कॉलà¥à¤¸}} पेकà¥à¤·à¤¾ कमी असायला हवेत, सधà¥à¤¯à¤¾ $1{{PLURAL:$1| $1 कॉल| $1 कॉलà¥à¤¸}} à¤à¤µà¤¢à¥‡ आहेत.',
+ते $2{{PLURAL:$2|कॉल|कॉलà¥à¤¸}} पेकà¥à¤·à¤¾ कमी असायला हवेत, सधà¥à¤¯à¤¾ $1{{PLURAL:$1| $1 कॉल| $1 कॉलà¥à¤¸}} à¤à¤µà¤¢à¥‡ आहेत.',
'expensive-parserfunction-category' => 'खूप सारे खरà¥à¤šà¤¿à¤• पारà¥à¤¸à¤° कà¥à¤°à¤¿à¤¯à¤¾ कॉलà¥à¤¸ असणारी पाने',
'post-expand-template-inclusion-warning' => 'सूचना: साचे वाढविणà¥à¤¯à¤¾à¤šà¥€ मरà¥à¤¯à¤¾à¤¦à¤¾ संपलेली आहे.
काही साचे वगळले जातील.',
@@ -950,12 +968,15 @@ $2',
'post-expand-template-argument-warning' => 'सूचना: या पानावर असा à¤à¤•à¤¤à¤°à¥€ साचा आहे जो वाढविलà¥à¤¯à¤¾à¤¸ खूप मोठा होईल.
असे साचे वगळणà¥à¤¯à¤¾à¤¤ आलेले आहेत.',
'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' => 'संपादन परतवले जाऊ शकते.कृपया, आपण नेमके हेच करू इचà¥à¤›à¥€à¤¤à¤¾ हे खाली दिलेली तà¥à¤²à¤¨à¤¾ पाहू निशà¥à¤šà¥€à¤¤ करा,आणि नंतर संपादन परतवणà¥à¤¯à¤¾à¤šà¥‡ काम पूरà¥à¤£ करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ इचà¥à¤›à¥€à¤¤ बदà¥à¤² जतन करा.',
'undo-failure' => 'दरमà¥à¤¯à¤¾à¤¨ परसà¥à¤ªà¤° विरोधी संपादने à¤à¤¾à¤²à¥à¤¯à¤¾à¤®à¥à¤³à¥‡ आपण हे संपादन परतवू शकत नाही.',
'undo-norev' => 'हे संपादन परतविता आलेले नाही कारण ते अगोदरच उलटविलेले किंवा वगळलेले आहे.',
-'undo-summary' => '[[विशेष:योगदान/$2|$2]] ([[सदसà¥à¤¯ चरà¥à¤šà¤¾:$2|चरà¥à¤šà¤¾]])यांची आवृतà¥à¤¤à¥€ $1 परतवली.',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चरà¥à¤šà¤¾]])यांची आवृतà¥à¤¤à¥€ $1 परतवली.',
# Account creation failure
'cantcreateaccounttitle' => 'खाते उघडू शकत नाही',
@@ -999,44 +1020,80 @@ $3ने ''$2'' कारण दिले आहे.",
संबधीत नवà¥à¤¯à¤¾ पानांकरिता [[Special:Search|विकिवर शोध घेणà¥à¤¯à¤¾à¤šà¤¾ ]] पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
# Revision deletion
-'rev-deleted-comment' => '(पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾ वगळली)',
+'rev-deleted-comment' => '(पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ वगळली)',
'rev-deleted-user' => '(सदसà¥à¤¯ नाव वगळले)',
'rev-deleted-event' => '(कारà¥à¤¯ नोंद वगळली)',
+'rev-deleted-user-contribs' => '[सदसà¥à¤¯à¤¨à¤¾à¤µ / अंकपतà¥à¤¤à¤¾ वगळला]',
'rev-deleted-text-permission' => "या पानाची आवृतà¥à¤¤à¥€ सारà¥à¤µà¤œà¤¨à¤¿à¤• विदागारातून '''वगळणà¥à¤¯à¤¾à¤¤ आली आहे'''.
[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ नोंदीत]निरà¥à¤¦à¥‡à¤¶ असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे",
-'rev-deleted-text-view' => "!!पानाचे हे आवरà¥à¤¤à¤¨ सारà¥à¤µà¤œà¤¨à¤¿à¤• विदागारातून '''वगळणà¥à¤¯à¤¾à¤¤ आले आहे'''.
+'rev-deleted-text-unhide' => "पानाचे हे आवरà¥à¤¤à¤¨ सारà¥à¤µà¤œà¤¨à¤¿à¤• विदागारातून '''वगळले गेले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते [$1पाहू शकता]; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-suppressed-text-unhide' => "पानाचे हे आवरà¥à¤¤à¤¨ सारà¥à¤µà¤œà¤¨à¤¿à¤• विदागारातून '''लपवले गेले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते [$1पाहू शकता]; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-deleted-text-view' => "पानाचे हे आवरà¥à¤¤à¤¨ सारà¥à¤µà¤œà¤¨à¤¿à¤• विदागारातून '''वगळणà¥à¤¯à¤¾à¤¤ आले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते पाहू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-suppressed-text-view' => "पानाचे हे आवरà¥à¤¤à¤¨ सारà¥à¤µà¤œà¤¨à¤¿à¤• विदागारातून '''लपवणà¥à¤¯à¤¾à¤¤ आले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते पाहू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-deleted-no-diff' => "या पानाची आवृतà¥à¤¤à¥€ '''वगळणà¥à¤¯à¤¾à¤¤ आली आहे'''.
+
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ नोंदीत]निरà¥à¤¦à¥‡à¤¶ असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे",
+'rev-suppressed-no-diff' => 'तà¥à¤®à¥à¤¹à¥€ हा फरक पाहू शकत नाही कारण या आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील à¤à¤• आवृती â€â€™à¤µà¤—ळणà¥à¤¯à¤¾à¤¤ आली आहे.â€â€™',
+'rev-deleted-unhide-diff' => "पानाचे हे आवरà¥à¤¤à¤¨ '''वगळले गेले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते [$1पाहू शकता]; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-suppressed-unhide-diff' => "पानाचे हे आवरà¥à¤¤à¤¨ '''लपवले गेले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते [$1पाहू शकता]; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-deleted-diff-view' => "पानाचे हे आवरà¥à¤¤à¤¨'''वगळणà¥à¤¯à¤¾à¤¤ आले आहे'''.
+{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते पाहू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
+'rev-suppressed-diff-view' => "या फरकातील à¤à¤• आवरà¥à¤¤à¤¨ '''लपवणà¥à¤¯à¤¾à¤¤ आले आहे'''.
{{SITENAME}}चà¥à¤¯à¤¾ पà¥à¤°à¤¬à¤‚धक या नातà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¥à¤¹à¥€ ते पाहू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदीत] माहिती असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे .",
'rev-delundel' => 'दाखवा/लपवा',
'rev-showdeleted' => 'दाखवा',
'revisiondelete' => 'आवरà¥à¤¤à¤¨à¥‡ वगळा/पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'revdelete-nooldid-title' => 'अपेकà¥à¤·à¥€à¤¤ आवृतà¥à¤¤à¥€ दिलेली नाही',
'revdelete-nooldid-text' => '!!आपण ही कृती करावयाची आवरà¥à¤¤à¤¨à¥‡ सूचीत केलेली नाहीत, दिलेले आवरà¥à¤¤à¤¨ असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही, किंवा तà¥à¤®à¥à¤¹à¥€ सधà¥à¤¯à¤¾à¤šà¥‡ आवरà¥à¤¤à¤¨ लपविणà¥à¤¯à¤¾à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करीत आहात.',
+'revdelete-nologtype-title' => 'कोणताही यादीपà¥à¤°à¤•à¤¾à¤° दिलेला नाही',
+'revdelete-nologtype-text' => 'ही कà¥à¤°à¤¿à¤¯à¤¾ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¥€ यादीपà¥à¤°à¤•à¤¾à¤° निवडला नाही.',
+'revdelete-nologid-title' => 'अवैध यादी पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¥€',
+'revdelete-nologid-text' => 'तà¥à¤®à¥à¤¹à¥€ हे कारà¥à¤¯ होणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ निशà¥à¤šà¤¿à¤¤ यादी पà¥à¤°à¤¸à¤‚ग निवडला नाही किंवा दिलेली पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¥€ असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
'revdelete-no-file' => 'दरà¥à¤¶à¤¿à¤µà¤²à¥‡à¤²à¥€ संचिका असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
+'revdelete-show-file-confirm' => 'तà¥à¤®à¥à¤¹à¥€ "<nowiki>$1</nowiki>" या संचिकेचे $2 येथून $3 वेळी असलेले आवरà¥à¤¤à¤¨ नकà¥à¤•à¥€ पहाणार आहात?',
'revdelete-show-file-submit' => 'होय',
'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|चे निवडलेले आवरà¥à¤¤à¤¨|ची निवडलेली आवरà¥à¤¤à¤¨à¥‡}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|निवडलेली नोंदीकृत घटना|निवडलेलà¥à¤¯à¤¾ नोंदीकृत घटना}}:'''",
'revdelete-text' => "'''वगळलेलà¥à¤¯à¤¾ नोंदी आणि घटना अजूनही पानाचà¥à¤¯à¤¾ इतिहासात आणि नोंदीत आढळेल,परंतॠमजकà¥à¤°à¤¾à¤šà¤¾ भाग सारà¥à¤µà¤œà¤¨à¤¿à¤• सà¥à¤µà¤°à¥‚पात उपलबà¥à¤§ राहणार नाही.'''
अजून इतर पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध घातलà¥à¤¯à¤¾ शिवाय {{SITENAME}}चे इतर पà¥à¤°à¤¬à¤‚धक à¤à¤¾à¤•à¤²à¥‡à¤²à¤¾ मजकà¥à¤° याच दà¥à¤µà¥à¤¯à¤¾à¤¨à¥‡ परतवू शकतील.",
+'revdelete-confirm' => 'कृपया याची खातà¥à¤°à¥€ करा की तà¥à¤®à¥à¤¹à¥€ हे करत आहात, तà¥à¤¯à¤¾à¤šà¥‡ परिणाम जाणत आहात, आणि ते [[{{MediaWiki:Policy-url}}|मीडियाविकीचà¥à¤¯à¤¾ नीती]]नà¥à¤¸à¤¾à¤° आहे का?',
+'revdelete-suppress-text' => "लपवणà¥à¤¯à¤¾à¤šà¤¾ वापर '''फकà¥à¤¤''' पà¥à¤¢à¥€à¤² गोषà¥à¤Ÿà¥€ असलà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ होतो:
+* अनà¥à¤ªà¤¯à¥‹à¤—ी माहिती
+* अयोगà¥à¤¯ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त माहिती
+*: ''गृहपतà¥à¤¤à¥‡, दूरधà¥à¤µà¤¨à¥€ कà¥à¤°à¤®à¤¾à¤‚क व सामाजिक सà¥à¤°à¤•à¥à¤·à¤¾ कà¥à¤°à¤®à¤¾à¤‚क''",
'revdelete-legend' => 'दृशà¥à¤¯ बंधने निशà¥à¤šà¤¿à¤¤ करा',
'revdelete-hide-text' => 'आवरà¥à¤¤à¥€à¤¤ मजकà¥à¤° लपवा',
'revdelete-hide-image' => 'संचिका मजकà¥à¤° लपवा',
'revdelete-hide-name' => 'कृती आणि धà¥à¤¯à¥‡à¤¯ लपवा',
'revdelete-hide-comment' => 'संपादन पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾ लपवा',
'revdelete-hide-user' => 'संपादकाचे सदसà¥à¤¯à¤¨à¤¾à¤µ/आंतरजाल अंकपतà¥à¤¤à¤¾ लपवा',
-'revdelete-hide-restricted' => 'ही बंधने पà¥à¤°à¤¬à¤‚धक तसेच इतरांनाही लागू करा तसेच इंटरफेस ला ताळा ठोका',
+'revdelete-hide-restricted' => 'ही बंधने पà¥à¤°à¤¬à¤‚धक तसेच इतरांनाही लागू करा तसेच वà¥à¤¯à¤•à¥à¤¤à¤¿à¤°à¥‡à¤–ेला ताळा ठोका.',
+'revdelete-radio-same' => '(कृपया बदलू नये)',
'revdelete-radio-set' => 'होय',
'revdelete-radio-unset' => 'नाही',
'revdelete-suppress' => 'पà¥à¤°à¤¬à¤‚धक तसेच इतरांपासून विदा लपवा',
'revdelete-unsuppress' => 'पà¥à¤°à¥à¤¨à¤¸à¥à¤¥à¤¾à¤ªà¥€à¤¤ आवृतà¥à¤¤à¥€à¤µà¤°à¥€à¤² बंधने ऊठवा',
'revdelete-log' => 'कारण:',
-'revdelete-submit' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚ना लागू करा',
+'revdelete-submit' => 'निवडलेलà¥à¤¯à¤¾ {{PLURAL:$1|आवृतà¥à¤¤à¥€à¤²à¤¾|आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚ना}} लागू करा',
'revdelete-logentry' => '[[$1]]ची आवरà¥à¤¤à¤¨ सदृशà¥à¤¯à¤¤à¤¾ बदलली.',
'logdelete-logentry' => '[[$1]]ची घटना सदृशà¥à¤¯à¤¤à¤¾ बदलली.',
'revdelete-success' => "'''आवरà¥à¤¤à¤¨à¤¾à¤‚ची दृशà¥à¤¯à¤¤à¤¾ यशसà¥à¤µà¥€ पणे लाविली.'''",
+'revdelete-failure' => "'''आवरà¥à¤¤à¤¨ दृशà¥à¤¯à¤¤à¤¾ अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ करता येत नाही:'''
+$1",
'logdelete-success' => "'''घटनांची दृशà¥à¤¯à¤¤à¤¾ यशसà¥à¤µà¥€ पणे लाविली.'''",
+'logdelete-failure' => "'''यादी दृशà¥à¤¯à¤¤à¤¾ ठरवता आली नाही:'''
+$1",
'revdel-restore' => 'दृशà¥à¤¯à¤¤à¤¾ बदला',
+'revdel-restore-deleted' => 'वगळलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾',
+'revdel-restore-visible' => 'दृषà¥à¤¯ आवरà¥à¤¤à¤¨à¥‡',
'pagehist' => 'पानाचा इतिहास',
'deletedhist' => 'वगळलेला इतिहास',
'revdelete-content' => 'कंटेंट',
@@ -1048,8 +1105,25 @@ $3ने ''$2'' कारण दिले आहे.",
'revdelete-unhid' => 'अनहिड $1',
'revdelete-log-message' => '$2 {{PLURAL:$2|आवॄतà¥à¤¤à¥€|आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚}}साठी $1',
'logdelete-log-message' => '$2 {{PLURAL:$2|घटने|घटनां}}साठी $1',
+'revdelete-hide-current' => '$1 मधील $2 या वेळचे आवरà¥à¤¤à¤¨ लपवता येत नाही, : ते सदà¥à¤¯ पà¥à¤¨à¤°à¤¾à¤µà¤°à¥à¤¤à¤¨ आहे.
+ते लपवता येत नाही.',
+'revdelete-show-no-access' => '$2, $1 ची वसà¥à¤¤à¥‚ दाखवताना अडचण: ती "पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित" खूण असलेली आहे.
+तà¥à¤®à¥à¤¹à¥€ तिचà¥à¤¯à¤¾à¤ªà¤°à¥à¤¯à¤‚त पोचू शकत नाही.',
+'revdelete-modify-no-access' => '$2, $1 ची वसà¥à¤¤à¥‚ संपादताना अडचण: ती "पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित" खूण असलेली आहे.
+तà¥à¤®à¥à¤¹à¥€ तिचà¥à¤¯à¤¾à¤ªà¤°à¥à¤¯à¤‚त पोचू शकत नाही.',
+'revdelete-modify-missing' => 'वसà¥à¤¤à¥‚ कà¥à¤°. $1 ला संपादताना तà¥à¤°à¥à¤Ÿà¥€: ती माहितीकोषात नाही!',
+'revdelete-no-change' => "'''सूचना:''' $2, $1 चà¥à¤¯à¤¾ वसà¥à¤¤à¥‚ने अगोदरच दृशà¥à¤¯à¤¤à¤¾ रà¥à¤ªà¤°à¥‡à¤·à¤¾ मागितलà¥à¤¯à¤¾ आहेत.",
+'revdelete-concurrent-change' => '$2, $1 ची वसà¥à¤¤à¥‚ संपादताना चूक: तà¥à¤®à¥à¤¹à¥€ तिला संपादताना दà¥à¤¸à¤°à¥â€à¤¯à¤¾ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¨à¥‡ वसà¥à¤¤à¥‚स संपादले असावे.
+कृपया यादà¥à¤¯à¤¾ तपासा.',
+'revdelete-only-restricted' => '$2, $1 ची वसà¥à¤¤à¥‚ लपवताना चूक: तà¥à¤®à¥à¤¹à¥€ इतर दृशà¥à¤¯à¤¤à¤¾ परà¥à¤¯à¤¾à¤¯à¤¾à¤‚ना निवडलà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚पासून वसà¥à¤¤à¥‚ लपवू शकत नाही.',
+'revdelete-reason-dropdown' => '*सामानà¥à¤¯ वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे
+** पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
+** अयोगà¥à¤¯ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त माहिती
+** अनà¥à¤ªà¤¯à¥‹à¤—ी माहिती',
+'revdelete-otherreason' => 'इतर / आणखी कारण:',
'revdelete-reasonotherlist' => 'इतर कारणे',
'revdelete-edit-reasonlist' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे संपादीत करा',
+'revdelete-offender' => 'आवरà¥à¤¤à¤¨ निरà¥à¤®à¤¾à¤¤à¤¾:',
# Suppression log
'suppressionlog' => 'सपà¥à¤°à¥‡à¤¶à¤¨ नोंद',
@@ -1075,6 +1149,7 @@ $3ने ''$2'' कारण दिले आहे.",
'mergehistory-invalid-destination' => 'लकà¥à¤·à¥à¤¯ पानाचे शीरà¥à¤·à¤• योगà¥à¤¯ असणे आवशà¥à¤¯à¤• आहे.',
'mergehistory-autocomment' => '[[:$2]] मधà¥à¤¯à¥‡ [[:$1]] à¤à¤•à¤¤à¥à¤°à¤¿à¤¤ केले',
'mergehistory-comment' => '[[:$2]] मधà¥à¤¯à¥‡ [[:$1]] à¤à¤•à¤¤à¥à¤°à¤¿à¤¤ केले: $3',
+'mergehistory-same-destination' => 'सà¥à¤°à¥‹à¤¤ व लकà¥à¤·à¥à¤¯à¤ªà¤¾à¤¨à¥‡ सारखीच असू शकत नाहीत',
'mergehistory-reason' => 'कारण:',
# Merge log
@@ -1084,55 +1159,79 @@ $3ने ''$2'' कारण दिले आहे.",
'mergelogpagetext' => 'à¤à¤•à¤¾à¤ªà¤¾à¤¨à¤¾à¤šà¤¾ इतिहास इतर पानात टाकून अगदी अलिकडे à¤à¤•à¤¤à¥à¤°à¤¿à¤¤ केलेली à¤à¤•à¤¤à¥à¤°à¤¿à¤•à¤°à¤£à¥‡ निमà¥à¤¨à¥à¤¦à¤°à¥à¤¶à¥€à¤¤ सूचीत आहेत.',
# Diffs
-'history-title' => '"$1" चा संपादन इतिहास',
-'difference' => '(आवरà¥à¤¤à¤¨à¤¾à¤‚मधील फरक)',
-'lineno' => 'ओळ $1:',
-'compareselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील बदल पहा',
-'editundo' => 'उलटवा',
-'diff-multi' => '({{PLURAL:$1|मधील à¤à¤• आवृतà¥à¤¤à¥€|मधलà¥à¤¯à¤¾ $1 आवृतà¥à¤¤à¥à¤¯à¤¾}} दाखवलेलà¥à¤¯à¤¾ नाहीत.)',
+'history-title' => '"$1" चा संपादन इतिहास',
+'difference' => '(आवरà¥à¤¤à¤¨à¤¾à¤‚मधील फरक)',
+'difference-multipage' => '(पानांमधील फरक)',
+'lineno' => 'ओळ $1:',
+'compareselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील बदल पहा',
+'showhideselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾ दाखवा / लपवा',
+'editundo' => 'उलटवा',
+'diff-multi' => '{{PLURAL:$2|सदसà¥à¤¯à¤¾à¤šà¥€|$2 सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾}} ({{PLURAL:$1|आवृतà¥à¤¤à¥€|$1 आवृतà¥à¤¤à¥à¤¯à¤¾}} दाखवलà¥à¤¯à¤¾ नाहीत)',
+'diff-multi-manyusers' => '{{PLURAL:$2|सदसà¥à¤¯à¤¾à¤šà¥€|$2 सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾}} ({{PLURAL:$1|आवृतà¥à¤¤à¥€|$1 आवृतà¥à¤¤à¥à¤¯à¤¾}} दाखवलà¥à¤¯à¤¾ नाहीत)',
# Search results
-'searchresults' => 'शोध निकाल',
-'searchresults-title' => '"$1" साठीचे निकाल शोधा',
-'searchresulttext' => '{{SITENAME}} वरील माहिती कशी शोधावी, याचà¥à¤¯à¤¾ माहिती करता पहा - [[{{MediaWiki:Helppage}}|{{SITENAME}} वर शोध कसा घà¥à¤¯à¤¾à¤µà¤¾]].',
-'searchsubtitle' => 'तà¥à¤®à¥à¤¹à¥€ \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|"$1" ने सà¥à¤°à¥‚ होणारी सरà¥à¤µ पाने]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" ला जोडणारी सरà¥à¤µ पाने]]) याचा शोध घेत आहात.',
-'searchsubtitleinvalid' => "तà¥à¤®à¥à¤¹à¥€ '''$1''' या शबà¥à¤¦à¤¾à¤šà¤¾ शोध घेत आहात.",
-'toomanymatches' => 'खूप à¤à¤•à¤¸à¤¾à¤°à¤–ी उतà¥à¤¤à¤°à¥‡ मिळाली, कृपया पृचà¥à¤›à¤¾ वेगळà¥à¤¯à¤¾ तरà¥â€à¤¹à¥‡à¤¨à¥‡ करून पहा',
-'titlematches' => 'पानाचे शीरà¥à¤·à¤• जà¥à¤³à¤¤à¥‡',
-'notitlematches' => 'कोणतà¥à¤¯à¤¾à¤¹à¥€ पानाचे शीरà¥à¤·à¤• जà¥à¤³à¤¤ नाही',
-'textmatches' => 'पानातील मजकà¥à¤° जà¥à¤³à¤¤à¥‹',
-'notextmatches' => 'पानातील मजकà¥à¤°à¤¾à¤¶à¥€ जà¥à¤³à¤¤ नाही',
-'prevn' => 'मागील {{PLURAL:$1|$1}}',
-'nextn' => 'पà¥à¤¢à¥€à¤² {{PLURAL:$1|$1}}',
-'viewprevnext' => 'पहा ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:साहायà¥à¤¯ पृषà¥à¤ ',
-'searchprofile-everything' => 'सगळे',
-'searchprofile-advanced' => 'पà¥à¤°à¤—त',
-'searchprofile-articles-tooltip' => '$1मधà¥à¤¯à¥‡ शोधा',
-'search-result-size' => '$1 ({{PLURAL:$2|१ शबà¥à¤¦|$2 शबà¥à¤¦}})',
-'search-result-score' => 'जà¥à¤³à¤£à¥€: $1%',
-'search-redirect' => '(पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ $1)',
-'search-section' => '(विभाग $1)',
-'search-suggest' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हेच मà¥à¤¹à¤£à¤¾à¤¯à¤šà¥‡ का: $1',
-'search-interwiki-caption' => 'इतर पà¥à¤°à¤•à¤²à¥à¤ª',
-'search-interwiki-default' => '$1चे निकाल:',
-'search-interwiki-more' => '(आणखी)',
-'search-mwsuggest-enabled' => 'सजेशनà¥à¤¸ सहित',
-'search-mwsuggest-disabled' => 'सजेशनà¥à¤¸ नाहीत',
-'search-relatedarticle' => 'जवळील',
-'mwsuggest-disable' => 'AJAX सजेशनà¥à¤¸ रदà¥à¤¦ करा',
-'searchrelated' => 'जवळील',
-'searchall' => 'सरà¥à¤µ',
-'showingresults' => "#'''$2'''पासून {{PLURAL:$1|'''1'''परà¥à¤¯à¤‚तचा निकाल|'''$1'''परà¥à¤¯à¤‚तचे निकाल}} खाली दाखवले आहे.",
-'showingresultsnum' => "खाली दिलेले #'''$2'''पासून सà¥à¤°à¥‚ होणारे {{PLURAL:$3|'''1''' निकाल|'''$3''' निकाल}}.",
-'nonefound' => "'''सूचना''':काही नामविशà¥à¤µà¥‡à¤š नेहमी शोधली जातात. सरà¥à¤µ नामविशà¥à¤µà¥‡ शोधणà¥à¤¯à¤¾à¤•à¤°à¥€à¤¤à¤¾ (चरà¥à¤šà¤¾ पाने, साचे, इ. सकट) कॄपया शोधशबà¥à¤¦à¤¾à¤‚चà¥à¤¯à¤¾ आधी ''all:'' लावून पहा किंवा पाहिजे असलेले नामविशà¥à¤µ लिहा.",
-'powersearch' => 'वाढीव शोध',
-'powersearch-legend' => 'वाढीव शोध',
-'powersearch-ns' => 'नामविशà¥à¤µà¤¾à¤‚मधà¥à¤¯à¥‡ शोधा:',
-'powersearch-redir' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ दाखवा',
-'powersearch-field' => 'साठी शोधा',
-'search-external' => 'बाहà¥à¤¯ शोध',
-'searchdisabled' => '{{SITENAME}} शोध अनà¥à¤ªà¤²à¤¬à¥à¤§ केला आहे.तो परà¥à¤¯à¤‚त गूगलवरून शोध घà¥à¤¯à¤¾.{{SITENAME}}चà¥à¤¯à¤¾ मजकà¥à¤°à¤¾à¤šà¥€ तà¥à¤¯à¤¾à¤‚ची सूचिबदà¥à¤§à¤¤à¤¾ शिळी असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ असॠशकते हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾.',
+'searchresults' => 'शोध निकाल',
+'searchresults-title' => '"$1" साठीचे निकाल शोधा',
+'searchresulttext' => '{{SITENAME}} वरील माहिती कशी शोधावी, याचà¥à¤¯à¤¾ माहिती करता पहा - [[{{MediaWiki:Helppage}}|{{SITENAME}} वर शोध कसा घà¥à¤¯à¤¾à¤µà¤¾]].',
+'searchsubtitle' => 'तà¥à¤®à¥à¤¹à¥€ \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|"$1" ने सà¥à¤°à¥‚ होणारी सरà¥à¤µ पाने]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" ला जोडणारी सरà¥à¤µ पाने]]) याचा शोध घेत आहात.',
+'searchsubtitleinvalid' => "तà¥à¤®à¥à¤¹à¥€ '''$1''' या शबà¥à¤¦à¤¾à¤šà¤¾ शोध घेत आहात.",
+'toomanymatches' => 'खूप à¤à¤•à¤¸à¤¾à¤°à¤–ी उतà¥à¤¤à¤°à¥‡ मिळाली, कृपया पृचà¥à¤›à¤¾ वेगळà¥à¤¯à¤¾ तरà¥â€à¤¹à¥‡à¤¨à¥‡ करून पहा',
+'titlematches' => 'पानाचे शीरà¥à¤·à¤• जà¥à¤³à¤¤à¥‡',
+'notitlematches' => 'कोणतà¥à¤¯à¤¾à¤¹à¥€ पानाचे शीरà¥à¤·à¤• जà¥à¤³à¤¤ नाही',
+'textmatches' => 'पानातील मजकà¥à¤° जà¥à¤³à¤¤à¥‹',
+'notextmatches' => 'पानातील मजकà¥à¤°à¤¾à¤¶à¥€ जà¥à¤³à¤¤ नाही',
+'prevn' => 'मागील {{PLURAL:$1|$1}}',
+'nextn' => 'पà¥à¤¢à¥€à¤² {{PLURAL:$1|$1}}',
+'prevn-title' => 'मागील $1 {{PLURAL:$1|निकाल|निकाल}}',
+'nextn-title' => 'पà¥à¤¢à¥€à¤² $1 {{PLURAL:$1|निकाल|निकाल}}',
+'shown-title' => '$1 {{PLURAL:$1|निकाल|निकाल}} निकाल पà¥à¤°à¤¤à¤¿à¤ªà¤¾à¤¨ पहा',
+'viewprevnext' => 'पहा ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'विकलà¥à¤ª शोधा',
+'searchmenu-exists' => "'''या विकीवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
+'searchmenu-new' => "'''या विकीवर \"[[:\$1]]\" हे पान तयार करा!'''",
+'searchhelp-url' => 'Help:साहायà¥à¤¯ पृषà¥à¤ ',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|या उपसरà¥à¤—ानिशी असलेली पाने नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤¾]]',
+'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 ({{PLURAL:$2|१ शबà¥à¤¦|$2 शबà¥à¤¦}})',
+'search-result-category-size' => '{{PLURAL:$1|१ सदसà¥à¤¯|$1 सदसà¥à¤¯}} ({{PLURAL:$2|१ उपवरà¥à¤—|$2 उपउपवरà¥à¤—}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})',
+'search-result-score' => 'जà¥à¤³à¤£à¥€: $1%',
+'search-redirect' => '(पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ $1)',
+'search-section' => '(विभाग $1)',
+'search-suggest' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हेच मà¥à¤¹à¤£à¤¾à¤¯à¤šà¥‡ का: $1',
+'search-interwiki-caption' => 'इतर पà¥à¤°à¤•à¤²à¥à¤ª',
+'search-interwiki-default' => '$1चे निकाल:',
+'search-interwiki-more' => '(आणखी)',
+'search-mwsuggest-enabled' => 'सजेशनà¥à¤¸ सहित',
+'search-mwsuggest-disabled' => 'सजेशनà¥à¤¸ नाहीत',
+'search-relatedarticle' => 'जवळील',
+'mwsuggest-disable' => 'AJAX सजेशनà¥à¤¸ रदà¥à¤¦ करा',
+'searcheverything-enable' => 'सरà¥à¤µà¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥à¤µà¤¾à¤‚मधà¥à¤¯à¥‡ शोधा:',
+'searchrelated' => 'जवळील',
+'searchall' => 'सरà¥à¤µ',
+'showingresults' => "#'''$2'''पासून {{PLURAL:$1|'''1'''परà¥à¤¯à¤‚तचा निकाल|'''$1'''परà¥à¤¯à¤‚तचे निकाल}} खाली दाखवले आहे.",
+'showingresultsnum' => "खाली दिलेले #'''$2'''पासून सà¥à¤°à¥‚ होणारे {{PLURAL:$3|'''1''' निकाल|'''$3''' निकाल}}.",
+'showingresultsheader' => "'''$4''' साठी {{PLURAL:$5|'''$3'''पैकी '''$1''' निकाल|'''$3''' पैकी '''$1 - $2''' निकाल}}",
+'nonefound' => "'''सूचना''':काही नामविशà¥à¤µà¥‡à¤š नेहमी शोधली जातात. सरà¥à¤µ नामविशà¥à¤µà¥‡ शोधणà¥à¤¯à¤¾à¤•à¤°à¥€à¤¤à¤¾ (चरà¥à¤šà¤¾ पाने, साचे, इ. सकट) कॄपया शोधशबà¥à¤¦à¤¾à¤‚चà¥à¤¯à¤¾ आधी ''all:'' लावून पहा किंवा पाहिजे असलेले नामविशà¥à¤µ लिहा.",
+'search-nonefound' => 'दिलेलà¥à¤¯à¤¾ वरà¥à¤£à¤¨à¤¾à¤¶à¥€ जà¥à¤³à¤£à¤¾à¤°à¥‡ निकाल नाहीत.',
+'powersearch' => 'वाढीव शोध',
+'powersearch-legend' => 'वाढीव शोध',
+'powersearch-ns' => 'नामविशà¥à¤µà¤¾à¤‚मधà¥à¤¯à¥‡ शोधा:',
+'powersearch-redir' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ दाखवा',
+'powersearch-field' => 'साठी शोधा',
+'powersearch-togglelabel' => 'तपासा:',
+'powersearch-toggleall' => 'सरà¥à¤µ',
+'powersearch-togglenone' => 'काहीही नाही',
+'search-external' => 'बाहà¥à¤¯ शोध',
+'searchdisabled' => '{{SITENAME}} शोध अनà¥à¤ªà¤²à¤¬à¥à¤§ केला आहे.तो परà¥à¤¯à¤‚त गूगलवरून शोध घà¥à¤¯à¤¾.{{SITENAME}}चà¥à¤¯à¤¾ मजकà¥à¤°à¤¾à¤šà¥€ तà¥à¤¯à¤¾à¤‚ची सूचिबदà¥à¤§à¤¤à¤¾ शिळी असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ असॠशकते हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾.',
# Quickbar
'qbsettings' => 'शीघà¥à¤°à¤ªà¤Ÿ',
@@ -1143,108 +1242,133 @@ $3ने ''$2'' कारण दिले आहे.",
'qbsettings-floatingright' => 'तरंगते ऊजवे',
# Preferences page
-'preferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
-'mypreferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
-'prefs-edits' => 'संपादनांची संखà¥à¤¯à¤¾:',
-'prefsnologin' => 'पà¥à¤°à¤µà¥‡à¤¶ केलेला नाही',
-'prefsnologintext' => 'सदसà¥à¤¯ पसंती बदलणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶]] करावा लागेल.',
-'changepassword' => 'परवलीचा शबà¥à¤¦ बदला',
-'prefs-skin' => 'तà¥à¤µà¤šà¤¾',
-'skin-preview' => 'à¤à¤²à¤•',
-'prefs-math' => 'गणित',
-'datedefault' => 'पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾ नाही',
-'prefs-datetime' => 'दिनांक आणि वेळ',
-'prefs-personal' => 'सदसà¥à¤¯ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤°à¥‡à¤–ा',
-'prefs-rc' => 'अलीकडील बदल',
-'prefs-watchlist' => 'पहारà¥â€à¤¯à¤¾à¤šà¥€ सूची',
-'prefs-watchlist-days' => 'पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत दिसणारà¥â€à¤¯à¤¾ दिवसांची संखà¥à¤¯à¤¾:',
-'prefs-watchlist-days-max' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ ७ दिवस.',
-'prefs-watchlist-edits' => 'वाढीव पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत दिसणारà¥â€à¤¯à¤¾ संपादनांची संखà¥à¤¯à¤¾:',
-'prefs-watchlist-edits-max' => 'अधिकतम अंक: १०००.',
-'prefs-misc' => 'इतर',
-'prefs-resetpass' => 'परवलीचा शबà¥à¤¦ बदला.',
-'saveprefs' => 'जतन करा',
-'resetprefs' => 'न जतन केलेले बदल रदà¥à¤¦ करा',
-'restoreprefs' => 'सरà¥à¤µ डिफॉलà¥à¤Ÿ मांडणी पूरà¥à¤µà¤µà¤¤ करा.',
-'prefs-editing' => 'संपादन',
-'rows' => 'ओळी:',
-'columns' => 'सà¥à¤¤à¤‚भ:',
-'searchresultshead' => 'शोध',
-'resultsperpage' => 'पà¥à¤°à¤¤à¤¿ पान धडका:',
-'contextlines' => 'पà¥à¤°à¤¤à¤¿ धडक ओळी:',
-'contextchars' => 'पà¥à¤°à¤¤à¤¿à¤“ळ संदरà¥à¤­:',
-'stub-threshold' => '<a href="#" class="stub">अंकà¥à¤°à¥€à¤¤ दà¥à¤µà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾</a> रचनेची नांदी (बाईटà¥à¤¸):',
-'recentchangesdays' => 'अलिकडील बदल मधील दाखवावयाचे दिवस:',
-'recentchangescount' => 'अलिकडील बदल, इतिहास व नोंद पानांमधà¥à¤¯à¥‡ दाखवायाचà¥à¤¯à¤¾ संपादनांची संखà¥à¤¯à¤¾:',
-'savedprefs' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ पसंती जतन केलà¥à¤¯à¤¾ आहेत.',
-'timezonelegend' => 'वेळकà¥à¤·à¥‡à¤¤à¥à¤°',
-'localtime' => 'सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ',
-'timezoneoffset' => 'समासफरक¹',
-'servertime' => 'विदागारदातà¥à¤¯à¤¾à¤šà¥€ वेळ',
-'guesstimezone' => 'विचरकातून भरा',
-'timezoneregion-africa' => 'आफà¥à¤°à¤¿à¤•à¤¾',
-'timezoneregion-america' => 'अमेरिका',
-'timezoneregion-antarctica' => 'अà¤à¤Ÿà¤¾à¤°à¥à¤•à¥à¤Ÿà¤¿à¤•à¤¾',
-'timezoneregion-arctic' => 'आरà¥à¤•à¥à¤Ÿà¤¿à¤•',
-'timezoneregion-asia' => 'आशिया',
-'timezoneregion-atlantic' => 'अटलांटिक महासागर',
-'timezoneregion-australia' => 'ऑसà¥à¤Ÿà¥à¤°à¥‡à¤²à¤¿à¤¯à¤¾',
-'timezoneregion-europe' => 'यà¥à¤°à¥‹à¤ª',
-'timezoneregion-indian' => 'हिंदी महासागर',
-'timezoneregion-pacific' => 'पà¥à¤°à¤¶à¤¾à¤‚त महासागर',
-'allowemail' => 'इतर सदसà¥à¤¯à¤¾à¤‚कडून इ-मेल येणà¥à¤¯à¤¾à¤¸ मà¥à¤­à¤¾ दà¥à¤¯à¤¾',
-'prefs-searchoptions' => 'शोध विकलà¥à¤ª',
-'prefs-namespaces' => 'नामविशà¥à¤µà¥‡',
-'defaultns' => 'या नामविशà¥à¤µà¤¾à¤¤à¥€à¤² अविचल शोध :',
-'default' => 'अविचल',
-'prefs-files' => 'संचिका',
-'youremail' => 'आपला इमेल:',
-'username' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
-'uid' => 'सदसà¥à¤¯ खाते:',
-'prefs-memberingroups' => 'खालील {{PLURAL:$1|गटाचा|गटांचा}} सदसà¥à¤¯:',
-'yourrealname' => 'तà¥à¤®à¤šà¥‡ खरे नाव:',
-'yourlanguage' => 'भाषा:',
-'yournick' => 'आपले उपनाव (सहीसाठी)',
-'badsig' => 'अयोगà¥à¤¯ कचà¥à¤šà¥€ सही;HTML खूणा तपासा.',
-'badsiglength' => 'तà¥à¤®à¤šà¥€ सà¥à¤µà¤¾à¤•à¥à¤·à¤°à¥€ खूप लांब आहे.
+'preferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
+'mypreferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
+'prefs-edits' => 'संपादनांची संखà¥à¤¯à¤¾:',
+'prefsnologin' => 'पà¥à¤°à¤µà¥‡à¤¶ केलेला नाही',
+'prefsnologintext' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ सदसà¥à¤¯ पसंती बदलणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} पà¥à¤°à¤µà¥‡à¤¶]</span> करावा लागेल.',
+'changepassword' => 'परवलीचा शबà¥à¤¦ बदला',
+'prefs-skin' => 'तà¥à¤µà¤šà¤¾',
+'skin-preview' => 'à¤à¤²à¤•',
+'prefs-math' => 'गणित',
+'datedefault' => 'पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾ नाही',
+'prefs-datetime' => 'दिनांक आणि वेळ',
+'prefs-personal' => 'सदसà¥à¤¯ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤°à¥‡à¤–ा',
+'prefs-rc' => 'अलीकडील बदल',
+'prefs-watchlist' => 'पहारà¥â€à¤¯à¤¾à¤šà¥€ सूची',
+'prefs-watchlist-days' => 'पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत दिसणारà¥â€à¤¯à¤¾ दिवसांची संखà¥à¤¯à¤¾:',
+'prefs-watchlist-days-max' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ ७ दिवस.',
+'prefs-watchlist-edits' => 'वाढीव पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत दिसणारà¥â€à¤¯à¤¾ संपादनांची संखà¥à¤¯à¤¾:',
+'prefs-watchlist-edits-max' => 'अधिकतम अंक: १०००.',
+'prefs-watchlist-token' => 'पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीचा बिलà¥à¤²à¤¾:',
+'prefs-misc' => 'इतर',
+'prefs-resetpass' => 'परवलीचा शबà¥à¤¦ बदला.',
+'prefs-email' => 'विपतà¥à¤° परà¥à¤¯à¤¾à¤¯',
+'prefs-rendering' => 'देखावा',
+'saveprefs' => 'जतन करा',
+'resetprefs' => 'न जतन केलेले बदल रदà¥à¤¦ करा',
+'restoreprefs' => 'सरà¥à¤µ डिफॉलà¥à¤Ÿ मांडणी पूरà¥à¤µà¤µà¤¤ करा.',
+'prefs-editing' => 'संपादन',
+'prefs-edit-boxsize' => 'संपादन खिडकीचा आकार',
+'rows' => 'ओळी:',
+'columns' => 'सà¥à¤¤à¤‚भ:',
+'searchresultshead' => 'शोध',
+'resultsperpage' => 'पà¥à¤°à¤¤à¤¿ पान धडका:',
+'contextlines' => 'पà¥à¤°à¤¤à¤¿ धडक ओळी:',
+'contextchars' => 'पà¥à¤°à¤¤à¤¿à¤“ळ संदरà¥à¤­:',
+'stub-threshold' => '<a href="#" class="stub">अंकà¥à¤°à¥€à¤¤ दà¥à¤µà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾</a> रचनेची नांदी (बाईटà¥à¤¸):',
+'stub-threshold-disabled' => 'अकà¥à¤·à¤® केले',
+'recentchangesdays' => 'अलिकडील बदल मधील दाखवावयाचे दिवस:',
+'recentchangesdays-max' => 'जासà¥à¤¤à¥€à¤¤à¤œà¤¾à¤¸à¥à¤¤ $1 {{PLURAL:$1|दिवस|दिवस}}',
+'recentchangescount' => 'अलिकडील बदल, इतिहास व नोंद पानांमधà¥à¤¯à¥‡ दाखवायाचà¥à¤¯à¤¾ संपादनांची संखà¥à¤¯à¤¾:',
+'prefs-help-recentchangescount' => 'यात नà¥à¤•à¤¤à¥‡à¤š à¤à¤¾à¤²à¥‡à¤²à¥‡ बदल, पानांचे इतिहास व यादà¥à¤¯à¤¾ या गोषà¥à¤Ÿà¥€ असतात.',
+'savedprefs' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ पसंती जतन केलà¥à¤¯à¤¾ आहेत.',
+'timezonelegend' => 'वेळकà¥à¤·à¥‡à¤¤à¥à¤°',
+'localtime' => 'सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ:',
+'timezoneuseoffset' => 'इतर (वेळेतील अंतर लिहा)',
+'timezoneoffset' => 'समासफरक¹:',
+'servertime' => 'विदागारदातà¥à¤¯à¤¾à¤šà¥€ वेळ',
+'guesstimezone' => 'विचरकातून भरा',
+'timezoneregion-africa' => 'आफà¥à¤°à¤¿à¤•à¤¾',
+'timezoneregion-america' => 'अमेरिका',
+'timezoneregion-antarctica' => 'अà¤à¤Ÿà¤¾à¤°à¥à¤•à¥à¤Ÿà¤¿à¤•à¤¾',
+'timezoneregion-arctic' => 'आरà¥à¤•à¥à¤Ÿà¤¿à¤•',
+'timezoneregion-asia' => 'आशिया',
+'timezoneregion-atlantic' => 'अटलांटिक महासागर',
+'timezoneregion-australia' => 'ऑसà¥à¤Ÿà¥à¤°à¥‡à¤²à¤¿à¤¯à¤¾',
+'timezoneregion-europe' => 'यà¥à¤°à¥‹à¤ª',
+'timezoneregion-indian' => 'हिंदी महासागर',
+'timezoneregion-pacific' => 'पà¥à¤°à¤¶à¤¾à¤‚त महासागर',
+'allowemail' => 'इतर सदसà¥à¤¯à¤¾à¤‚कडून इ-मेल येणà¥à¤¯à¤¾à¤¸ मà¥à¤­à¤¾ दà¥à¤¯à¤¾',
+'prefs-searchoptions' => 'शोध विकलà¥à¤ª',
+'prefs-namespaces' => 'नामविशà¥à¤µà¥‡',
+'defaultns' => 'या नामविशà¥à¤µà¤¾à¤¤à¥€à¤² अविचल शोध :',
+'default' => 'अविचल',
+'prefs-files' => 'संचिका',
+'prefs-custom-css' => 'सीà¤à¤¸à¤à¤¸ पदà¥à¤§à¤¤ बदला',
+'prefs-custom-js' => 'जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पदà¥à¤§à¤¤ बदला',
+'prefs-common-css-js' => 'मिळून वापरलेले सरà¥à¤µ तà¥à¤µà¤šà¤¾à¤‚साठींचे सीà¤à¤¸à¤à¤¸ / जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ:',
+'prefs-emailconfirm-label' => 'विपतà¥à¤° निशà¥à¤šà¤¿à¤¤à¥€à¤•à¤°à¤£:',
+'prefs-textboxsize' => 'संपादन खिडकीचा आकार',
+'youremail' => 'विपतà¥à¤°:',
+'username' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'uid' => 'सदसà¥à¤¯ खाते:',
+'prefs-memberingroups' => 'खालील {{PLURAL:$1|गटाचा|गटांचा}} सदसà¥à¤¯:',
+'prefs-registration' => 'नोंदणीची वेळ:',
+'yourrealname' => 'तà¥à¤®à¤šà¥‡ खरे नाव:',
+'yourlanguage' => 'भाषा:',
+'yournick' => 'आपले उपनाव (सहीसाठी)',
+'badsig' => 'अयोगà¥à¤¯ कचà¥à¤šà¥€ सही;HTML खूणा तपासा.',
+'badsiglength' => 'तà¥à¤®à¤šà¥€ सà¥à¤µà¤¾à¤•à¥à¤·à¤°à¥€ खूप लांब आहे.
टोपणनाव $1 {{PLURAL:$1|अकà¥à¤·à¤°à¤¾à¤ªà¥‡à¤•à¥à¤·à¤¾|अकà¥à¤·à¤°à¤¾à¤‚पेकà¥à¤·à¤¾}} कमी लांबीचे हवे.',
-'yourgender' => 'लिंग',
-'gender-unknown' => 'अजà¥à¤žà¤¾à¤¤',
-'gender-male' => 'पà¥à¤°à¥à¤·',
-'gender-female' => 'सà¥à¤¤à¥à¤°à¥€',
-'email' => 'विपतà¥à¤°(ई-मेल)',
-'prefs-help-realname' => 'तà¥à¤®à¤šà¥‡ खरे नाव (वैकलà¥à¤ªà¤¿à¤•): हे नाव दिलà¥à¤¯à¤¾à¤¸ आपले योगदान या नावाखाली नोंदले व दाखवले जाईल.',
-'prefs-help-email' => 'विरोप(ईमेल)(वैकलà¥à¤ªà¤¿à¤•):इतरांना सदसà¥à¤¯ किंवा सदसà¥à¤¯_चरà¥à¤šà¤¾ पानातून, तà¥à¤®à¤šà¥€ ओळख देणà¥à¤¯à¤¾à¤šà¥€ आवशà¥à¤¯à¤•à¤¤à¤¾ न ठेवता , तà¥à¤®à¤šà¥à¤¯à¤¾à¤¶à¥€ संपरà¥à¤• सà¥à¤µà¤¿à¤§à¤¾ पà¥à¤°à¤µà¤¤à¥‡.',
-'prefs-help-email-required' => 'विपतà¥à¤°(ईमेल)पतà¥à¤¤à¤¾ लागेल.',
-'prefs-signature' => 'सà¥à¤µà¤¾à¤•à¥à¤·à¤°à¥€',
-'prefs-dateformat' => 'तारीख रचना',
-'prefs-advancedediting' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
-'prefs-advancedrc' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
-'prefs-advancedrendering' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
-'prefs-advancedsearchoptions' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
-'prefs-advancedwatchlist' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
-'prefs-diffs' => 'फरक',
+'yourgender' => 'लिंग',
+'gender-unknown' => 'अजà¥à¤žà¤¾à¤¤',
+'gender-male' => 'पà¥à¤°à¥à¤·',
+'gender-female' => 'सà¥à¤¤à¥à¤°à¥€',
+'email' => 'विपतà¥à¤°',
+'prefs-help-realname' => 'तà¥à¤®à¤šà¥‡ खरे नाव (वैकलà¥à¤ªà¤¿à¤•): हे नाव दिलà¥à¤¯à¤¾à¤¸ आपले योगदान या नावाखाली नोंदले व दाखवले जाईल.',
+'prefs-help-email' => 'विरोप(ईमेल)(वैकलà¥à¤ªà¤¿à¤•):इतरांना सदसà¥à¤¯ किंवा सदसà¥à¤¯_चरà¥à¤šà¤¾ पानातून, तà¥à¤®à¤šà¥€ ओळख देणà¥à¤¯à¤¾à¤šà¥€ आवशà¥à¤¯à¤•à¤¤à¤¾ न ठेवता , तà¥à¤®à¤šà¥à¤¯à¤¾à¤¶à¥€ संपरà¥à¤• सà¥à¤µà¤¿à¤§à¤¾ पà¥à¤°à¤µà¤¤à¥‡.',
+'prefs-help-email-required' => 'विपतà¥à¤°(ईमेल)पतà¥à¤¤à¤¾ लागेल.',
+'prefs-info' => 'मूलभूत माहिती',
+'prefs-i18n' => 'आंतरराषà¥à¤Ÿà¥à¤°à¥€à¤¯à¥€à¤•à¤°à¤£',
+'prefs-signature' => 'सà¥à¤µà¤¾à¤•à¥à¤·à¤°à¥€',
+'prefs-dateformat' => 'तारीख रचना',
+'prefs-timeoffset' => 'वेळ बरोबरी',
+'prefs-advancedediting' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
+'prefs-advancedrc' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
+'prefs-advancedrendering' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
+'prefs-advancedsearchoptions' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
+'prefs-advancedwatchlist' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
+'prefs-displayrc' => 'दरà¥à¤¶à¤¨ परà¥à¤¯à¤¾à¤¯',
+'prefs-displaysearchoptions' => 'दरà¥à¤¶à¤¨ परà¥à¤¯à¤¾à¤¯',
+'prefs-displaywatchlist' => 'दरà¥à¤¶à¤¨ परà¥à¤¯à¤¾à¤¯',
+'prefs-diffs' => 'फरक',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ वैध आहे',
+'email-address-validity-invalid' => 'वैध विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ लिहा',
# User rights
-'userrights' => 'सदसà¥à¤¯ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
-'userrights-lookup-user' => 'सदसà¥à¤¯ गटांचे(गà¥à¤°à¥‚पà¥à¤¸) वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ करा.',
-'userrights-user-editname' => 'सदसà¥à¤¯ नाव टाका:',
-'editusergroup' => 'सदसà¥à¤¯ गट (गà¥à¤°à¥‚पà¥à¤¸) संपादीत करा',
-'editinguser' => "सदसà¥à¤¯ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])चे सदसà¥à¤¯ अधिकारात बदल केला जात आहे.",
-'userrights-editusergroup' => 'सदसà¥à¤¯ मंडळे संपादीत करा',
-'saveusergroups' => 'सदसà¥à¤¯ गट जतन करा',
-'userrights-groupsmember' => '(चा) सभासद:',
-'userrights-groups-help' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤–ादà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤šà¥‡ गट सदसà¥à¤¯à¤¤à¥à¤µ बदलू शकता:
+'userrights' => 'सदसà¥à¤¯ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
+'userrights-lookup-user' => 'सदसà¥à¤¯ गटांचे(गà¥à¤°à¥‚पà¥à¤¸) वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ करा.',
+'userrights-user-editname' => 'सदसà¥à¤¯ नाव टाका:',
+'editusergroup' => 'सदसà¥à¤¯ गट (गà¥à¤°à¥‚पà¥à¤¸) संपादीत करा',
+'editinguser' => "सदसà¥à¤¯ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])चे सदसà¥à¤¯ अधिकारात बदल केला जात आहे.",
+'userrights-editusergroup' => 'सदसà¥à¤¯ मंडळे संपादीत करा',
+'saveusergroups' => 'सदसà¥à¤¯ गट जतन करा',
+'userrights-groupsmember' => '(चा) सभासद:',
+'userrights-groupsmember-auto' => 'चा निरà¥à¤µà¤¿à¤µà¤¾à¤¦ सदसà¥à¤¯:',
+'userrights-groups-help' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤–ादà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤šà¥‡ गट सदसà¥à¤¯à¤¤à¥à¤µ बदलू शकता:
* निवडलेला चौकोन मà¥à¤¹à¤£à¤œà¥‡ सदसà¥à¤¯ तà¥à¤¯à¤¾ गटात आहे.
* न निवडलेला चौकोन मà¥à¤¹à¤£à¤œà¥‡ सदसà¥à¤¯ तà¥à¤¯à¤¾ गटात नाही.
* à¤à¤• * चा अरà¥à¤¥ तà¥à¤®à¥à¤¹à¥€ à¤à¤•à¤¦à¤¾ समावेश केलà¥à¤¯à¤¾à¤¨à¤‚तर तो गट बदलू शकत नाही, किंवा काढलà¥à¤¯à¤¾à¤¨à¤‚तर समावेश करू शकत नाही.',
-'userrights-reason' => 'कारण:',
-'userrights-no-interwiki' => 'इतर विकींवरचे सदसà¥à¤¯ अधिकार बदलणà¥à¤¯à¤¾à¤šà¥€ परवानगी तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ नाही.',
-'userrights-nodatabase' => 'विदा $1 असà¥à¤¤à¥€à¤¤à¥à¤µà¤¾à¤¤ नाही अथवा सà¥à¤¥à¤¾à¤¨à¤¿à¤• नाही.',
-'userrights-nologin' => 'सदसà¥à¤¯ अधिकार देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¬à¤‚धक मà¥à¤¹à¤£à¥‚न [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶ केलेला]] असणे आवशà¥à¤¯à¤• आहे.',
-'userrights-notallowed' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤¸ सदसà¥à¤¯ अधिकारांची निशà¥à¤šà¤¿à¤¤à¥€ करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
-'userrights-changeable-col' => 'गट जे तà¥à¤®à¥à¤¹à¥€ बदलू शकता',
-'userrights-unchangeable-col' => 'गट जे तà¥à¤®à¥à¤¹à¥€ बदलू शकत नाही',
+'userrights-reason' => 'कारण:',
+'userrights-no-interwiki' => 'इतर विकींवरचे सदसà¥à¤¯ अधिकार बदलणà¥à¤¯à¤¾à¤šà¥€ परवानगी तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ नाही.',
+'userrights-nodatabase' => 'विदा $1 असà¥à¤¤à¥€à¤¤à¥à¤µà¤¾à¤¤ नाही अथवा सà¥à¤¥à¤¾à¤¨à¤¿à¤• नाही.',
+'userrights-nologin' => 'सदसà¥à¤¯ अधिकार देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¬à¤‚धक मà¥à¤¹à¤£à¥‚न [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶ केलेला]] असणे आवशà¥à¤¯à¤• आहे.',
+'userrights-notallowed' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤¸ सदसà¥à¤¯ अधिकारांची निशà¥à¤šà¤¿à¤¤à¥€ करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
+'userrights-changeable-col' => 'गट जे तà¥à¤®à¥à¤¹à¥€ बदलू शकता',
+'userrights-unchangeable-col' => 'गट जे तà¥à¤®à¥à¤¹à¥€ बदलू शकत नाही',
# Groups
'group' => 'गट:',
@@ -1279,6 +1403,7 @@ $3ने ''$2'' कारण दिले आहे.",
'right-minoredit' => 'बदल छोटे मà¥à¤¹à¤£à¥‚न जतन करा',
'right-move' => 'पानांचे सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करा',
'right-move-subpages' => 'पाने उपपानांसकट हलवा',
+'right-move-rootuserpages' => 'मूळ सदसà¥à¤¯à¤ªà¤¾à¤¨à¥‡ हलवा',
'right-movefile' => 'संचिका हलवा',
'right-suppressredirect' => 'à¤à¤–ादà¥à¤¯à¤¾ पानाचे नवीन नावावर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करत असताना पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ वगळा',
'right-upload' => 'संचिका चढवा',
@@ -1291,20 +1416,22 @@ $3ने ''$2'' कारण दिले आहे.",
'right-bot' => 'सà¥à¤µà¤¯à¤‚चलित कारà¥à¤¯à¤¾à¤ªà¥à¤°à¤®à¤¾à¤£à¥‡ वागणूक मिळवा',
'right-nominornewtalk' => 'चरà¥à¤šà¤¾ पृषà¥à¤ à¤¾à¤µà¤° छोटी संपादने जी नवीन चरà¥à¤šà¤¾ दरà¥à¤¶à¤µà¤¿à¤¤à¤¾à¤¤ ती नकोत',
'right-apihighlimits' => 'API पृचà¥à¤›à¤¾à¤‚मधà¥à¤¯à¥‡ वरची मरà¥à¤¯à¤¾à¤¦à¤¾ वापरा',
-'right-writeapi' => 'लिखित API चा उपयोग',
+'right-writeapi' => 'लेखन à¤à¤ªà¥€à¤†à¤¯ चा उपयोग',
'right-delete' => 'पृषà¥à¤ à¥‡ वगळा',
'right-bigdelete' => 'जासà¥à¤¤ इतिहास असणारी पाने वगळा',
'right-deleterevision' => 'à¤à¤–ादà¥à¤¯à¤¾ पानाचà¥à¤¯à¤¾ विशिषà¥à¤Ÿ आवृतà¥à¤¤à¥à¤¯à¤¾ लपवा',
'right-deletedhistory' => 'वगळलेलà¥à¤¯à¤¾ इतिहास नोंदी, तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ संलगà¥à¤¨ मजकूराशिवाय पहा',
+'right-deletedtext' => 'वगळलेला मजकूर व वगळलेलà¥à¤¯à¤¾ आवरà¥à¤¤à¤¨à¤¾à¤‚मधील बदल पहा',
'right-browsearchive' => 'वगळलेली पाने पहा',
'right-undelete' => 'à¤à¤–ादे पान पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'right-suppressrevision' => 'लपविलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾ पहा व पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'right-suppressionlog' => 'खासगी नोंदी पहा',
-'right-block' => 'इतर सदसà¥à¤¯à¤¾à¤‚ना संपादन करणà¥à¤¯à¤¾à¤¸ बंदी करा',
+'right-block' => 'इतर सदसà¥à¤¯à¤¾à¤‚ना संपादन करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
'right-blockemail' => 'à¤à¤–ादà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤²à¤¾ इ-मेल पाठविणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न थांबवा',
'right-hideuser' => 'à¤à¤–ादे सदसà¥à¤¯ नाव इतरांपासून लपवा',
'right-ipblock-exempt' => 'आइपी बà¥à¤²à¥‰à¤•à¥à¤¸ कडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा',
'right-proxyunbannable' => 'पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ असताना बà¥à¤²à¥‰à¤•à¥à¤¸ कडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा',
+'right-unblockself' => 'अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤¤à¤¾ पातळी बदला',
'right-editprotected' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पाने संपादा',
'right-editinterface' => 'सदसà¥à¤¯ पसंती बदला',
@@ -1316,15 +1443,17 @@ $3ने ''$2'' कारण दिले आहे.",
'right-noratelimit' => 'रेट लिमिटà¥à¤¸ चा परिणाम होत नाही.',
'right-import' => 'इतर विकिंमधून पाने आयात करा',
'right-importupload' => 'चढविलेलà¥à¤¯à¤¾ संचिकेतून पाने आयात करा',
-'right-patrol' => 'संपादने तपासलेली (patrolled) मà¥à¤¹à¤£à¥‚न जतन करा',
+'right-patrol' => 'इतरांची संपादने तपासलेली मà¥à¤¹à¤£à¥‚न जतन करा',
'right-autopatrol' => 'संपादने आपोआप तपासलेली (patrolled) मà¥à¤¹à¤£à¥‚न जतन करा',
'right-patrolmarks' => 'अलीकडील बदलांमधील तपासलà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ खूणा पहा',
'right-unwatchedpages' => 'न पाहिलेलà¥à¤¯à¤¾ पानांची यादी पहा',
-'right-trackback' => 'à¤à¤• टà¥à¤°à¥…कबॅक पाठवा',
+'right-trackback' => 'à¤à¤• विपरित पथ पाठवा',
'right-mergehistory' => 'पानांचा इतिहास à¤à¤•à¤¤à¥à¤°à¤¿à¤¤ करा',
'right-userrights' => 'सरà¥à¤µ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादा',
'right-userrights-interwiki' => 'इतर विकिंवर सदसà¥à¤¯ अधिकार बदला',
-'right-siteadmin' => 'डाटाबेस ला कà¥à¤²à¥à¤ª लावा अथवा काढा',
+'right-siteadmin' => 'माहितीसाठà¥à¤¯à¤¾à¤²à¤¾ कà¥à¤²à¥à¤ª लावा अथवा काढा',
+'right-reset-passwords' => 'इतर सदसà¥à¤¯à¤¾à¤‚चा परवलीचा शबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+'right-sendemail' => 'इतर सदसà¥à¤¯à¤¾à¤‚ना विपतà¥à¤°à¥‡ पाठवा',
# User rights log
'rightslog' => 'सदसà¥à¤¯ आधिकार नोंद',
@@ -1333,7 +1462,38 @@ $3ने ''$2'' कारण दिले आहे.",
'rightsnone' => '(काहीही नाही)',
# Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'हे पान संपादा',
+'action-read' => 'हे पान वाचा',
+'action-edit' => 'हे पान संपादा',
+'action-createpage' => 'लेख बनवा',
+'action-createtalk' => 'चरà¥à¤šà¤¾ पृषà¥à¤ à¥‡ तयार करा',
+'action-createaccount' => 'हे सदसà¥à¤¯à¤–ाते तयार करा',
+'action-minoredit' => 'हे संपादन छोटे ठरवा',
+'action-move' => 'हे पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करा',
+'action-move-subpages' => 'हे पान व तà¥à¤¯à¤¾à¤šà¥€ उपपाने हलवा',
+'action-move-rootuserpages' => 'मूळ सदसà¥à¤¯à¤ªà¤¾à¤¨à¥‡ हलवा',
+'action-movefile' => 'ही संचिका हलवा',
+'action-upload' => 'ही संचिका चढवा',
+'action-reupload' => 'असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलेलà¥à¤¯à¤¾ संचिकेवर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करा',
+'action-upload_by_url' => 'आंतरजालपतà¥à¤¤à¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न संचिका चढवा',
+'action-writeapi' => 'लेखन à¤à¤ªà¥€à¤†à¤¯ वापरा',
+'action-delete' => 'हे पान वगळा',
+'action-deleterevision' => 'हे आवरà¥à¤¤à¤¨ वगळा',
+'action-deletedhistory' => 'या पानाचा वगळलेला इतिहास पहा',
+'action-browsearchive' => 'वगळलेली पाने शोधा',
+'action-undelete' => 'वगळà¥à¤²à¥‡à¤²à¥‡ पृषà¥à¤  पà¥à¤¨à¥à¤¹à¤¾ आणा',
+'action-suppressrevision' => 'लपलेले पà¥à¤¨à¤°à¤¾à¤µà¤°à¥à¤¤à¤¨ पहा व सदà¥à¤¯à¤¸à¥à¤¥à¤¿à¤¤à¥€à¤¤ आणा',
+'action-suppressionlog' => 'ही खासगी यादी पहा',
+'action-block' => 'या सदसà¥à¤¯à¤¾à¤¸ संपादन करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
+'action-protect' => 'या पानाशाठी सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ बदला',
+'action-import' => 'दà¥à¤¸à¤°à¥â€à¤¯à¤¾ विकीवरà¥à¤¨ हे पान आयात करा',
+'action-importupload' => 'चढविलेलà¥à¤¯à¤¾ संचिकेतून पान आयात करा',
+'action-patrol' => 'इतरांची संपादने तपासलेली मà¥à¤¹à¤£à¥‚न जतन करा',
+'action-unwatchedpages' => 'न पाहिलेलà¥à¤¯à¤¾ पानांची यादी पहा',
+'action-trackback' => 'à¤à¤• विपरित पथ पाठवा',
+'action-mergehistory' => 'पानाचा इतिहास विलीन करा',
+'action-userrights' => 'सरà¥à¤µ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादा',
+'action-userrights-interwiki' => 'इतर विकिंवरचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादा',
+'action-siteadmin' => 'माहितीसाठà¥à¤¯à¤¾à¤²à¤¾ कà¥à¤²à¥à¤ª लावा अथवा काढा',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|बदल|बदल}}',
@@ -1341,6 +1501,10 @@ $3ने ''$2'' कारण दिले आहे.",
'recentchanges-legend' => 'अलीकडील बदल परà¥à¤¯à¤¾à¤¯',
'recentchangestext' => 'विकितील अलीकडील बदल या पानावर दिसतात.',
'recentchanges-feed-description' => 'या रसदीमधील विकीवर à¤à¤¾à¤²à¥‡à¤²à¥‡ सरà¥à¤µà¤¾à¤¤ अलीकडील बदल पहा.',
+'recentchanges-label-newpage' => 'या संपादनाने नवीन पान तयार à¤à¤¾à¤²à¥‡',
+'recentchanges-label-minor' => 'हा à¤à¤• छोटा बदल आहे',
+'recentchanges-label-bot' => 'हे संपादन à¤à¤•à¤¾ सांगकामà¥à¤¯à¤¾à¤•à¤¡à¥‚न केले गेले आहे',
+'recentchanges-label-unpatrolled' => 'हे संपादन अजून तपासले गेले नाही',
'rcnote' => "खाली $4, $5 परà¥à¤¯à¤‚तचे गेलà¥à¤¯à¤¾ {{PLURAL:$2|'''१''' दिवसातील|'''$2''' दिवसांतील}} {{PLURAL:$1|शेवटचा '''1''' बदल|शेवटचे '''$1''' बदल}} दिलेले आहेत.",
'rcnotefrom' => 'खाली <b>$2</b> पासूनचे (<b>$1</b> किंवा कमी) बदल दाखवले आहेत.',
'rclistfrom' => '$1 नंतर केले गेलेले बदल दाखवा.',
@@ -1380,6 +1544,7 @@ $3ने ''$2'' कारण दिले आहे.",
'upload' => 'संचिका चढवा',
'uploadbtn' => 'संचिका चढवा',
'reuploaddesc' => 'चढवायचà¥à¤¯à¤¾ पानाकडे परता',
+'upload-tryagain' => 'बदललेले संचिका वरà¥à¤£à¤¨ पाठवा',
'uploadnologin' => 'पà¥à¤°à¤µà¥‡à¤¶ केलेला नाही',
'uploadnologintext' => 'संचिका चढविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶]] करावा लागेल.',
'upload_directory_missing' => 'अपलोड डिरेकà¥à¤Ÿà¤°à¥€ ($1) सापडली नाही तसेच वेबसरà¥à¤µà¥à¤¹à¤° ती तयार करू शकलेला नाही.',
@@ -1401,6 +1566,7 @@ $3ने ''$2'' कारण दिले आहे.",
'filename' => 'संचिकेचे नाव',
'filedesc' => 'वरà¥à¤£à¤¨',
'fileuploadsummary' => 'आढावा:',
+'filereuploadsummary' => 'संचिका बदल:',
'filestatus' => 'पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° सà¥à¤¥à¤¿à¤¤à¥€:',
'filesource' => 'सà¥à¤°à¥‹à¤¤:',
'uploadedfiles' => 'चढवलेलà¥à¤¯à¤¾ संचिका',
@@ -1409,16 +1575,29 @@ $3ने ''$2'' कारण दिले आहे.",
'minlength1' => 'संचिकानाम किमान à¤à¤• अकà¥à¤·à¤°à¤¾à¤šà¥‡ हवे.',
'illegalfilename' => '"$1" या संचिकानामात शीरà¥à¤·à¤•à¤¾à¤¤ चालू न शकणारी अकà¥à¤·à¤°à¥‡ आहेत. कृपया संचिकानाम बदलून पà¥à¤¨à¥à¤¹à¤¾ चढवणà¥à¤¯à¤¾à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
'badfilename' => 'संचिकेचे नाव बदलून "$1" असे केले आहे.',
+'filetype-mime-mismatch' => 'संचिका विसà¥à¤¤à¤¾à¤°à¤• à¤à¤®à¤†à¤¯à¤à¤®à¤ˆ पà¥à¤°à¤•à¤¾à¤°à¤¾à¤¶à¥€ जà¥à¤³à¤¤ नाही.',
'filetype-badmime' => 'विविधामाप(माईम) "$1" पà¥à¤°à¤•à¤¾à¤°à¤šà¥à¤¯à¤¾ संचिका चढवणà¥à¤¯à¤¾à¤¸ परवानगी नाही.',
+'filetype-bad-ie-mime' => 'ही संचिका चढवता येत नाही कारण इंटरनेट à¤à¤•à¥à¤¸à¥à¤ªà¥à¤²à¥‹à¤°à¤° तिला "$1" मà¥à¤¹à¤£à¥‚न ओळखेल. हा संचिकापà¥à¤°à¤•à¤¾à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित व संभावà¥à¤¯ धोकादायक संचिकापà¥à¤°à¤•à¤¾à¤° आहे.',
'filetype-unwanted-type' => "'''\".\$1\"''' ही नको असलेलà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ संचिका आहे. \$2 {{PLURAL:\$3|ही हवà¥à¤¯à¤¾ असलेलà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ संचिका आहे|हà¥à¤¯à¤¾ हवà¥à¤¯à¤¾ असलेलà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥à¤¯à¤¾ संचिका आहेत}}.",
'filetype-banned-type' => "'''\".\$1\"''' ही परवानगी नसलेलà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ संचिका आहे. \$2 हà¥à¤¯à¤¾ परवानगी असलेलà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥à¤¯à¤¾ संचिका आहेत.",
'filetype-missing' => 'या संचिकेला à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन दिलेले नाही (उदा. ".jpg").',
+'empty-file' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ केलेली संचिका रिकामी होती.',
+'file-too-large' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ केलेली संचिका आकाराने खूप जासà¥à¤¤ होती.',
+'filename-tooshort' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ केलेली संचिका आकाराने खूप कमी होती.',
+'filetype-banned' => 'यापà¥à¤°à¤•à¤¾à¤°à¤šà¥€ संचिका पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'verification-error' => 'संचिका पडताळणीत ही संचिका अनà¥à¤¤à¥à¤¤à¥€à¤°à¥à¤£ à¤à¤¾à¤²à¥€.',
+'illegal-filename' => 'हे संचिकानाम पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'overwrite' => 'असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलेलà¥à¤¯à¤¾ संचिकेवर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'unknown-error' => 'à¤à¤• अजà¥à¤žà¤¾à¤¤ चूक उदà¥à¤­à¤µà¤²à¥€.',
+'tmp-create-error' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ संचिका करता आली नाही.',
+'tmp-write-error' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ संचिका लिहताना अडचण',
'large-file' => 'संचिका $1 पेकà¥à¤·à¤¾ कमी आकाराची असणà¥à¤¯à¤¾à¤šà¥€ अपेकà¥à¤·à¤¾ आहे, ही संचिका $2 à¤à¤µà¤¢à¥€ आहे.',
'largefileserver' => 'सेवा संगणकावर (सरà¥à¤µà¤°) निरà¥à¤§à¤¾à¤°à¤¿à¤¤ केलेलà¥à¤¯à¤¾ आकारापेकà¥à¤·à¤¾ या संचिकेचा आकार मोठा आहे.',
'emptyfile' => 'चढवलेली संचिका रिकामी आहे. हे संचिकानाम चà¥à¤•à¥€à¤šà¥‡ लिहिलà¥à¤¯à¤¾à¤¨à¥‡ असू शकते. कृपया तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हीच संचिका चढवायची आहे का ते तपासा.',
'fileexists' => "या नावाची संचिका आधीच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे, कृपया ही संचिका बदलणà¥à¤¯à¤¾à¤¬à¤¦à¥à¤¦à¤² तà¥à¤®à¥à¤¹à¥€ साशंक असाल तर '''<tt>[[:$1]]</tt>''' तपासा.
[[$1|thumb]]",
-'filepageexists' => "या नावाचे à¤à¤• माहितीपृषà¥à¤  (संचिका नवà¥à¤¹à¥‡) अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤¤à¥à¤µà¤¾à¤¤ आहे. कृपया जर आपणांस तà¥à¤¯à¤¾à¤¤ बदल करायचा नसेल तर '''<tt>[[:$1]]</tt>''' तपासा.",
+'filepageexists' => "या नावाचे à¤à¤• माहितीपृषà¥à¤  (संचिका नवà¥à¤¹à¥‡) अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤¤à¥à¤µà¤¾à¤¤ आहे. कृपया जर आपणांस तà¥à¤¯à¤¾à¤¤ बदल करायचा नसेल तर '''<tt>[[:$1]]</tt>''' तपासा.
+[[$1|thumb]]",
'fileexists-extension' => "या नावाची संचिका असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे: [[$2|thumb]]
* चढवित असलेलà¥à¤¯à¤¾ संचिकेचे नाव: '''<tt>[[:$1]]</tt>'''
* असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलेलà¥à¤¯à¤¾ संचिकेचे नाव: '''<tt>[[:$2]]</tt>'''
@@ -1426,18 +1605,20 @@ $3ने ''$2'' कारण दिले आहे.",
'fileexists-thumbnail-yes' => "आपण चढवित असलेली संचिका ही मोठà¥à¤¯à¤¾ चितà¥à¤°à¤¾à¤šà¥€ इवलीशी पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¥€ ''(thumbnail)'' असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे. [[$1|इवलेसे]]
कृपया '''<tt>[[:$1]]</tt>''' ही संचिका तपासा.
जर तपासलेली संचिका ही याच आकाराची असेल तर नवीन पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¥€ चढविणà¥à¤¯à¤¾à¤šà¥€ गरज नाही.",
-'file-thumbnail-no' => "या संचिकेचे नाव '''<tt>$1</tt>''' पासून सà¥à¤°à¥‚ होत आहे. ही कदाचित à¤à¤²à¤• ''(thumbnail)'' असू शकते.
+'file-thumbnail-no' => "या संचिकेचे नाव '''<tt>$1</tt>''' पासून सà¥à¤°à¥‚ होत आहे. ही कदाचित à¤à¤²à¤• असू शकते.
जर तà¥à¤®à¤šà¥à¤¯à¤¾ कडे पूरà¥à¤£ रिà¤à¥‹à¤²à¥à¤¯à¥‚शनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.",
'fileexists-forbidden' => 'या नावाची संचिका अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤¤à¥à¤µà¤¾à¤¤ आहे; कृपया पà¥à¤¨à¥à¤¹à¤¾ मागे जाऊन ही संचिका नवीन नावाने चढवा.
[[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'हे नाव असलेली à¤à¤• संचिका शेअरà¥à¤¡ संचिका कोशात आधी पासून आहे; कृपया परत फिरा आणि नविन(वेगळà¥à¤¯à¤¾) नावाने ही संचिका पà¥à¤¨à¥à¤¹à¤¾ चढवा.[[File:$1|इवले|मधà¥à¤¯|$1]]',
+'fileexists-shared-forbidden' => 'हे नाव असलेली à¤à¤• संचिका शेअरà¥à¤¡ संचिका कोशात आधी पासून आहे; कृपया परत फिरा आणि नविन(वेगळà¥à¤¯à¤¾) नावाने ही संचिका पà¥à¤¨à¥à¤¹à¤¾ चढवा.[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'ही संचिका खालील {{PLURAL:$1|संचिकेची|संचिकांची}} पà¥à¤°à¤¤ आहे:',
-'successfulupload' => 'यशसà¥à¤µà¥€à¤°à¥€à¤¤à¥à¤¯à¤¾ चढवले',
'uploadwarning' => 'चढवताना सूचना',
+'uploadwarning-text' => 'कृपया खालील संचिका वरà¥à¤£à¤¨ संपादून पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
'savefile' => 'संचिका जतन करा',
'uploadedimage' => '"[[$1]]" ही संचिका चढवली',
'overwroteimage' => '"[[$1]]" या संचिकेची नवीन आवृतà¥à¤¤à¥€ चढविली.',
'uploaddisabled' => 'संचिका चढविणà¥à¤¯à¤¾à¤¸ बंदी घालणà¥à¤¯à¤¾à¤¤ आलेली आहे.',
+'copyuploaddisabled' => 'आंतरजालपतà¥à¤¤à¥à¤¯à¤¾à¤¦à¥à¤µà¤¾à¤°à¥‡ चढवणे पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'uploadfromurl-queued' => 'तà¥à¤®à¤šà¥‡ चढवणे नोंदवणà¥à¤¯à¤¾à¤¤ आले आहे',
'uploaddisabledtext' => '{{SITENAME}} वर संचिका चढविणà¥à¤¯à¤¾à¤¸ बंदी घालणà¥à¤¯à¤¾à¤¤ आलेली आहे.',
'uploadscripted' => 'या संचिकेत HTML किंवा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ कोडचा आंतरà¥à¤­à¤¾à¤µ आहे, तà¥à¤¯à¤¾à¤šà¤¾ à¤à¤–ादà¥à¤¯à¤¾ विचरकाकडून विचीतà¥à¤° अरà¥à¤¥ लावला जाऊ शकतो.',
'uploadvirus' => 'हà¥à¤¯à¤¾ संचिकेत वà¥à¤¹à¤¾à¤¯à¤°à¤¸ आहे. अधिक माहिती: $1',
@@ -1447,6 +1628,7 @@ $3ने ''$2'' कारण दिले आहे.",
'destfilename' => 'नवे संचिकानाम:',
'upload-maxfilesize' => 'जासà¥à¤¤à¥€à¤¤à¤œà¤¾à¤¸à¥à¤¤ संचिका आकार: $1',
'upload-description' => 'संचिका वरà¥à¤£à¤¨',
+'upload-options' => 'चढवणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ परà¥à¤¯à¤¾à¤¯',
'watchthisupload' => 'या पानावर बदलांसाठी लकà¥à¤· ठेवा.',
'filewasdeleted' => 'या नावाची संचिका या पूरà¥à¤µà¥€ à¤à¤•à¤¦à¤¾ चढवून नंतर वगळली होती.तà¥à¤®à¥à¤¹à¥€ ती पà¥à¤¨à¥à¤¹à¤¾ चढवणà¥à¤¯à¤¾ अगोदर $1 तपासा.',
'upload-wasdeleted' => "'''सूचना: पूरà¥à¤µà¥€ वगळणà¥à¤¯à¤¾à¤¤ आलेली संचिका तà¥à¤®à¥à¤¹à¥€ पà¥à¤¨à¥à¤¹à¤¾ चढवित आहात.'''
@@ -1454,19 +1636,47 @@ $3ने ''$2'' कारण दिले आहे.",
कृपया तà¥à¤®à¥à¤¹à¥€ करत असलेली कृती योगà¥à¤¯ असलà¥à¤¯à¤¾à¤šà¥€ खातà¥à¤°à¥€ करून घà¥à¤¯à¤¾.
तà¥à¤®à¤šà¥à¤¯à¤¾ सोयीसाठी वगळलà¥à¤¯à¤¾à¤šà¥€ नोंद पà¥à¤¢à¥€à¤²à¤ªà¥à¤°à¤®à¤¾à¤£à¥‡:",
'filename-bad-prefix' => "तà¥à¤®à¥à¤¹à¥€ चढवत असलेलà¥à¤¯à¤¾ संचिकेचे नाव '''\"\$1\"''' पासून सà¥à¤°à¥‚ होते, जे की अंकीय छाउ (कॅमेरा) ने दिलेले अवरà¥à¤£à¤¨à¤¾à¤¤à¥à¤®à¤• नाव आहे.कृपया तà¥à¤®à¤šà¥à¤¯à¤¾ संचिकेकरिता अधिक वरà¥à¤£à¤¨à¤¾à¤¤à¥à¤®à¤• नाव निवडा.",
+'upload-success-subj' => 'यशसà¥à¤µà¥€à¤°à¥€à¤¤à¥à¤¯à¤¾ चढवले',
+'upload-success-msg' => 'तà¥à¤®à¤šà¥‡ [$2] येथूनà¥à¤¬ चढवणे यशसà¥à¤µà¥€ ठरले. ते येथे उपलबà¥à¤§ आहे: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'चढवणà¥à¤¯à¤¾à¤¤à¥€à¤² तà¥à¤°à¥‚टि:',
+'upload-failure-msg' => '[$2] येथून तà¥à¤®à¤šà¥à¤¯à¤¾ चढवणà¥à¤¯à¤¾à¤¤ चूक à¤à¤¾à¤²à¥€:
-'upload-proto-error' => 'चूकीचा संकेत',
-'upload-proto-error-text' => 'दूरसà¥à¤¥ चढवणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ कà¥à¤°à¤¿à¤¯à¥‡à¤¤ <code>http://</code>पासून किंवा <code>ftp://</code>पासून सूरू होणारी URL लागतात.',
-'upload-file-error' => 'अंतरà¥à¤—त तà¥à¤°à¥‚टी',
-'upload-file-error-text' => 'विदादातà¥à¤¯à¤¾à¤µà¤° तातà¥à¤ªà¥à¤°à¤¤à¥€ संचिका तयार करणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करत असताना अंतरà¥à¤—त तांतà¥à¤°à¤¿à¤• अडचण आली.कृपया पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚शी संपरà¥à¤• करा.',
-'upload-misc-error' => 'संचिका चढविताना माहित नसलेली तà¥à¤°à¥‚टी आलेली आहे.',
-'upload-misc-error-text' => 'चढवताना अजà¥à¤žà¤¾à¤¤ तांतà¥à¤°à¤¿à¤• आदचण आली.कृपया URL सà¥à¤¯à¥‹à¤—à¥à¤¯ आणि उपलबà¥à¤§ आहे का ते तपासा आणि पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.जर अडचणे भेडसावणे चालूच राहीले तर पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚सी संपरà¥à¤• करा.',
+$1',
+'upload-warning-subj' => 'चढवताना सूचना',
+'upload-warning-msg' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ चढवणà¥à¤¯à¤¾à¤¤ [$2] येथून चूक à¤à¤¾à¤²à¥€. तà¥à¤®à¥à¤¹à¥€ [[Special:Upload/stash/$1|चढवणà¥à¤¯à¤¾à¤šà¤¾ अरà¥à¤œ]] पà¥à¤¨à¥à¤¹à¤¾ भरà¥à¤¨ ही चूक दूर करू शकता.',
+
+'upload-proto-error' => 'चूकीचा संकेत',
+'upload-proto-error-text' => 'दूरसà¥à¤¥ चढवणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ कà¥à¤°à¤¿à¤¯à¥‡à¤¤ <code>http://</code>पासून किंवा <code>ftp://</code>पासून सूरू होणारी URL लागतात.',
+'upload-file-error' => 'अंतरà¥à¤—त तà¥à¤°à¥‚टी',
+'upload-file-error-text' => 'विदादातà¥à¤¯à¤¾à¤µà¤° तातà¥à¤ªà¥à¤°à¤¤à¥€ संचिका तयार करणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करत असताना अंतरà¥à¤—त तांतà¥à¤°à¤¿à¤• अडचण आली.कृपया [[Special:ListUsers/sysop|पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚शी]] संपरà¥à¤• करा.',
+'upload-misc-error' => 'संचिका चढविताना माहित नसलेली तà¥à¤°à¥‚टी आलेली आहे.',
+'upload-misc-error-text' => 'चढवताना अजà¥à¤žà¤¾à¤¤ तांतà¥à¤°à¤¿à¤• अडचण आली.कृपया आंतरजालपतà¥à¤¤à¤¾ सà¥à¤¯à¥‹à¤—à¥à¤¯ आणि उपलबà¥à¤§ आहे का ते तपासा आणि पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा. अधिक अडचणी आलà¥à¤¯à¤¾à¤¸ तर [[Special:ListUsers/sysop|पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚शी]] संपरà¥à¤• करा.',
+'upload-too-many-redirects' => 'या आंतरजालपतà¥à¤¤à¥à¤¯à¤¾à¤¤ खूप पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ आहेत',
+'upload-unknown-size' => 'अजà¥à¤žà¤¾à¤¤ आकारमान',
+'upload-http-error' => 'à¤à¤• à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€ चूक उदà¥à¤­à¤µà¤²à¥€: $1',
# img_auth script messages
-'img-auth-noread' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ "$1" वाचणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही',
+'img-auth-accessdenied' => 'परवानगी नाही',
+'img-auth-nopathinfo' => 'PATH_INFO आढळले नाही.
+आपला सरà¥à¤µà¥à¤¹à¤° ही माहिती पोचवू शकत नाही.
+तो सीजीआय-आधारित व img_auth ला समरà¥à¤¥à¤¨ न देऊ शकणारा असू शकतो.
+http://www.mediawiki.org/wiki/Manual:Image_Authorization पहा.',
+'img-auth-badtitle' => '"$1" पासून वैध शीरà¥à¤·à¤• बनवणà¥à¤¯à¤¾à¤¤ अयशसà¥à¤µà¥€.',
+'img-auth-nologinnWL' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤µà¥‡à¤¶ घेतलेला नाही व "$1" शà¥à¤µà¥‡à¤¤à¤¯à¤¾à¤¦à¥€à¤¤ नाही.',
+'img-auth-nofile' => '"$1" ही संचिका असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
+'img-auth-streaming' => 'सà¥à¤Ÿà¥à¤°à¥€à¤®à¤¿à¤‚ग "$1".',
+'img-auth-noread' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ "$1" वाचणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही',
+
+# HTTP errors
+'http-invalid-url' => 'अवैध आंतरजालपतà¥à¤¤à¤¾: $1',
+'http-request-error' => 'à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€ मागणी अजà¥à¤žà¤¾à¤¤ कारणामà¥à¤³à¥‡ अयशसà¥à¤µà¥€.',
+'http-read-error' => 'à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€ वाचन तà¥à¤°à¥à¤Ÿà¥€.',
+'http-curl-error' => 'आंतरजालपतà¥à¤¤à¤¾ पकडताना चूक: $1',
+'http-host-unreachable' => 'आंतरजाल पतà¥à¤¤à¥à¤¯à¤¾à¤ªà¤¾à¤¶à¥€ पोहोचले नाही',
+'http-bad-status' => 'à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€ मागणीदरमà¥à¤¯à¤¾à¤¨ à¤à¤• चूक उदà¥à¤­à¤µà¤²à¥€: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'URLपाशी पोहोचले नाही',
+'upload-curl-error6' => 'आंतरजाल पतà¥à¤¤à¥à¤¯à¤¾à¤ªà¤¾à¤¶à¥€ पोहोचले नाही',
'upload-curl-error6-text' => 'दिलेलà¥à¤¯à¤¾ URL ला पोहचू शकलो नाही.कृपया URL बरोबर असून संकेतसà¥à¤¥à¤³ चालू असलà¥à¤¯à¤¾à¤šà¥€ पà¥à¤¨à¤¶à¥à¤š खातà¥à¤°à¥€ करा.',
'upload-curl-error28' => 'चढवणà¥à¤¯à¤¾à¤¤ वेळगेली',
'upload-curl-error28-text' => 'संकेतसà¥à¤¥à¤³à¤¾à¤¨à¥‡ साद देणà¥à¤¯à¤¾à¤¤ खूप जासà¥à¤¤ वेळ घेतला आहे,कृपया थोडा वेळ थांबा आणि पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.कदाचित तà¥à¤®à¥à¤¹à¥€ कमी गरà¥à¤¦à¥€à¤šà¥à¤¯à¤¾ वेळात पà¥à¤°à¤¯à¤¤à¥à¤¨ करू इचà¥à¤›à¥€à¤¤à¤¾à¤².',
@@ -1485,11 +1695,13 @@ $3ने ''$2'' कारण दिले आहे.",
'listfiles_search_for' => 'चितà¥à¤° नावाने शोध:',
'imgfile' => 'संचिका',
'listfiles' => 'चितà¥à¤° यादी',
+'listfiles_thumb' => 'पà¥à¤°à¤¾à¤°à¥à¤ª',
'listfiles_date' => 'दिनांक',
'listfiles_name' => 'नाव',
'listfiles_user' => 'सदसà¥à¤¯',
'listfiles_size' => 'आकार (बाईटà¥à¤¸)',
'listfiles_description' => 'वरà¥à¤£à¤¨',
+'listfiles_count' => 'आवृतà¥à¤¤à¥à¤¯à¤¾',
# File description page
'file-anchor-link' => 'संचिका',
@@ -1502,24 +1714,32 @@ $3ने ''$2'' कारण दिले आहे.",
'filehist-datetime' => 'दिनांक/वेळ',
'filehist-thumb' => 'पà¥à¤°à¤¾à¤°à¥à¤ª',
'filehist-thumbtext' => '$1 चà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤šà¥‡ छोटे पà¥à¤°à¤¾à¤°à¥à¤ª',
+'filehist-nothumb' => 'पà¥à¤°à¤¾à¤°à¥à¤ª नाही',
'filehist-user' => 'सदसà¥à¤¯',
'filehist-dimensions' => 'आकार',
'filehist-filesize' => 'संचिकेचा आकार (बाईटà¥à¤¸)',
'filehist-comment' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾',
+'filehist-missing' => 'संचिका सापडत नाही',
'imagelinks' => 'संचिका दà¥à¤µà¥‡',
-'linkstoimage' => 'खालील पाने या चितà¥à¤°à¤¾à¤¶à¥€ जोडली आहेत:',
+'linkstoimage' => 'खालील {{PLURAL:$1|पान चितà¥à¤°à¤¾à¤¶à¥€ जोडले आहे|$1 पाने चितà¥à¤°à¤¾à¤¶à¥€ जोडली आहेत}}:',
'nolinkstoimage' => 'या चितà¥à¤°à¤¾à¤¶à¥€ जोडलेली पृषà¥à¤ à¥‡ नाही आहेत.',
'morelinkstoimage' => 'या संचिकेचे [[Special:WhatLinksHere/$1|अधिक दà¥à¤µà¥‡]] पहा.',
-'redirectstofile' => 'खालील संचिका या संचिकेकडे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ करतात:',
-'duplicatesoffile' => 'खालील संचिका या दिलेलà¥à¤¯à¤¾ संचिकेचà¥à¤¯à¤¾ पà¥à¤°à¤¤à¥€ आहेत:',
+'redirectstofile' => 'खालील संचिका या {{PLURAL:$1|संचिकेकडे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ करते|$1 संचिकांकडे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ करतात}}:',
+'duplicatesoffile' => 'खालील संचिका या दिलेलà¥à¤¯à¤¾ {{PLURAL:$1|संचिकेची पà¥à¤°à¤¤ आहे|$1 संचिकांचà¥à¤¯à¤¾ पà¥à¤°à¤¤à¥€ आहेत}}. [[Special:FileDuplicateSearch/$2|अधिक माहिती]]',
'sharedupload' => 'ही संचिका $1 मधील आहे व ती इतर पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤‚मधà¥à¤¯à¥‡ वापरली गेलà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
+'sharedupload-desc-here' => 'ही संचिका $1 येथील असून ती इतर पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤¤ वापरलेली असू शकते.
+तिचे तेथील [$2 संचिका वरà¥à¤£à¤¨ पान] खाली दाखवले आहे.',
+'filepage-nofile' => 'या नावाची संचिका असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
+'filepage-nofile-link' => 'या नावाची संचिका असà¥à¤¤à¤¿à¤¤à¥à¤¯à¥à¤µà¤¾à¤¤ नाही, पण तà¥à¤®à¥à¤¹à¥€ ती [$1 चढवू शकता].',
'uploadnewversion-linktext' => 'या संचिकेची नवीन आवृतà¥à¤¤à¥€ चढवा',
+'shared-repo-from' => '$1 पासून',
+'shared-repo' => 'à¤à¤• मà¥à¤•à¥à¤¤ कोश',
# File reversion
'filerevert' => '$1 पूरà¥à¤µà¤ªà¤¦',
'filerevert-legend' => 'संचिका पूरà¥à¤µà¤ªà¤¦à¤¾à¤¸',
'filerevert-intro' => 'तà¥à¤®à¥à¤¹à¥€ [$3, $2 पà¥à¤°à¤®à¤¾à¤£à¥‡ आवरà¥à¤¤à¤¨$4 कडे] [[Media:$1|$1]] उलटवत आहात.',
-'filerevert-comment' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾:',
+'filerevert-comment' => 'कारण:',
'filerevert-defaultcomment' => '$2, $1 चà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤¤ पूरà¥à¤µà¤ªà¤¦à¤¾à¤¸',
'filerevert-submit' => 'पूरà¥à¤µà¤ªà¤¦',
'filerevert-success' => "[$3, $2 पà¥à¤°à¤®à¤¾à¤£à¥‡ आवरà¥à¤¤à¤¨ $4]कडे '''[[Media:$1|$1]]''' उलटवणà¥à¤¯à¤¾à¤¤ आली.",
@@ -1534,7 +1754,7 @@ $3ने ''$2'' कारण दिले आहे.",
'filedelete-submit' => 'वगळा',
'filedelete-success' => "'''$1'''वगळणà¥à¤¯à¤¾à¤¤ आले.",
'filedelete-success-old' => '<span class="plainlinks">$3, $2 वेळी \'\'\'[[Media:$1|$1]]\'\'\' चे आवरà¥à¤¤à¤¨ वगळणà¥à¤¯à¤¾à¤¤ आले आहे .</span>',
-'filedelete-nofile' => "'''$1''' {{SITENAME}}वर असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.",
+'filedelete-nofile' => "'''$1''' असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.",
'filedelete-nofile-old' => "सांगितलेलà¥à¤¯à¤¾ गà¥à¤£à¤§à¤°à¥à¤®à¤¾à¤¨à¥à¤¸à¤¾à¤° '''$1'''चे कोणतेही विदा आवरà¥à¤¤à¤¨ संचित नाही.",
'filedelete-otherreason' => 'इतर/शिवाय अधिक कारण:',
'filedelete-reason-otherlist' => 'इतर कारण',
@@ -1558,28 +1778,46 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
# Unused templates
'unusedtemplates' => 'न वापरलेले साचे',
-'unusedtemplatestext' => 'या पानावर साचा नामविशà¥à¤µà¤¾à¤¤à¥€à¤² अशी सरà¥à¤µ पाने आहेत जी कà¥à¤ à¤²à¥à¤¯à¤¾à¤¹à¥€ पानात वापरलेली नाहीत. वगळणà¥à¤¯à¤¾à¤ªà¥à¤°à¥à¤µà¥€ साचà¥à¤¯à¤¾à¤‚ना जोडणारे इतर दà¥à¤µà¥‡ पाहणà¥à¤¯à¤¾à¤¸ विसरू नका.',
+'unusedtemplatestext' => 'या पानावर साचा नामविशà¥à¤µà¤¾à¤¤à¥€à¤² अशी सरà¥à¤µ पाने आहेत जी कà¥à¤ à¤²à¥à¤¯à¤¾à¤¹à¥€ पानात वापरलेली नाहीत. वगळणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ साचà¥à¤¯à¤¾à¤‚ना जोडणारे इतर दà¥à¤µà¥‡ पाहणà¥à¤¯à¤¾à¤¸ विसरू नका.',
'unusedtemplateswlh' => 'इतर दà¥à¤µà¥‡',
# Random page
'randompage' => 'अविशिषà¥à¤Ÿ लेख',
-'randompage-nopages' => 'या नामविशà¥à¤µà¤¾à¤¤ कोणतीही पाने नाहीत.',
+'randompage-nopages' => 'पà¥à¤¢à¥€à¤² {{PLURAL:$2|नामविशà¥à¤µà¤¾à¤¤|नामविशà¥à¤µà¤¾à¤‚त}} कोणतीही पाने नाहीत: $1.',
# Random redirect
'randomredirect' => 'अविशिषà¥à¤Ÿ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨',
-'randomredirect-nopages' => 'या नामविशà¥à¤µà¤¾à¤¤ कोणतीही पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ नाहीत.',
+'randomredirect-nopages' => '$1 या नामविशà¥à¤µà¤¾à¤¤ कोणतीही पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ नाहीत.',
# Statistics
-'statistics' => 'सांखà¥à¤¯à¤¿à¤•à¥€',
-'statistics-header-users' => 'सदसà¥à¤¯ सांखà¥à¤¯à¤¿à¤•à¥€',
-'statistics-mostpopular' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• बघितली जाणारी पाने',
+'statistics' => 'सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-pages' => 'पृषà¥à¤  सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-edits' => 'संपादन सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-views' => 'सांखà¥à¤¯à¤¿à¤•à¥€ पहा',
+'statistics-header-users' => 'सदसà¥à¤¯ सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-header-hooks' => 'इतर सांखà¥à¤¯à¤¿à¤•à¥€',
+'statistics-articles' => 'संबंधित पाने',
+'statistics-pages' => 'पाने',
+'statistics-pages-desc' => 'विकीमधील सरà¥à¤µ पाने, पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡, चरà¥à¤šà¤¾à¤ªà¤¾à¤¨à¤¾à¤‚सहित.',
+'statistics-files' => 'चढवलेलà¥à¤¯à¤¾ संचिका',
+'statistics-edits' => '{{SITENAME}} चà¥à¤¯à¤¾ सà¥à¤°à¥à¤µà¤¾à¤¤à¥€à¤ªà¤¾à¤¸à¥‚नची पानांची संपादने',
+'statistics-edits-average' => 'पà¥à¤°à¤¤à¤¿à¤ªà¤¾à¤¨ सरासरी संपादने',
+'statistics-views-total' => 'सरà¥à¤µ दाखवते',
+'statistics-views-peredit' => 'पà¥à¤°à¤¤à¤¿ संपादनामागे पाहणे',
+'statistics-users' => 'नोंदणीकृत [[Special:ListUsers|सदसà¥à¤¯]]',
+'statistics-users-active' => 'कारà¥à¤¯à¤°à¤¤ सदसà¥à¤¯',
+'statistics-users-active-desc' => '{{PLURAL:$1|शेवटचà¥à¤¯à¤¾ दिवसात|शेवटचà¥à¤¯à¤¾ $1 दिवसांत}} à¤à¤•à¤¤à¤°à¥€ संपादन केलेले सदसà¥à¤¯',
+'statistics-mostpopular' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• बघितली जाणारी पाने',
'disambiguations' => 'नि:संदिगà¥à¤§à¤•à¤°à¤£ पृषà¥à¤ à¥‡',
'disambiguationspage' => 'Template:नि:संदिगà¥à¤§à¥€à¤•à¤°à¤£',
'disambiguations-text' => "निमà¥à¤¨à¤²à¤¿à¤–ीत पाने à¤à¤•à¤¾ '''नि:संदिगà¥à¤§à¤•à¤°à¤£ पृषà¥à¤ à¤¾à¤¸'''जोडली जातात. तà¥à¤¯à¤¾à¤à¤µà¤œà¥€ ती सà¥à¤¯à¥‹à¤—à¥à¤¯ विषयाशी जोडली जावयास हवीत.<br /> जर जर à¤à¤–ादे पान [[MediaWiki:Disambiguationspage]]पासून जोडलेला साचा वापरत असेल तर ते पान '''नि:संदिगà¥à¤§à¤•à¤°à¤£ पृषà¥à¤ ''' गृहीत धरले जाते",
-'doubleredirects' => 'दà¥à¤¹à¥‡à¤°à¥€-पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡',
-'doubleredirectstext' => 'हे पान अशा पानांची सूची पà¥à¤°à¤µà¤¤à¥‡ की जी पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ पाने दà¥à¤¸à¤°à¥â€à¤¯à¤¾ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ पानाकडे निरà¥à¤¦à¥‡à¤¶à¥€à¤¤ à¤à¤¾à¤²à¥€ आहेत.पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• ओळीत पहिलà¥à¤¯à¤¾ आणि दà¥à¤¸à¤°à¥â€à¤¯à¤¾ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¤¾à¤¸ दà¥à¤µà¤¾ दीला आहे सोबतच दà¥à¤¸à¤°à¥‡ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ जà¥à¤¯à¤¾ पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे ,ते वसà¥à¤¤à¥à¤¤: पहिलà¥à¤¯à¤¾ पानापासूनचेही पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ असावयास हवे.',
+'doubleredirects' => 'दà¥à¤¹à¥‡à¤°à¥€-पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡',
+'doubleredirectstext' => 'हे पान अशा पानांची सूची पà¥à¤°à¤µà¤¤à¥‡ की जी पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ पाने दà¥à¤¸à¤°à¥â€à¤¯à¤¾ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ पानाकडे निरà¥à¤¦à¥‡à¤¶à¥€à¤¤ à¤à¤¾à¤²à¥€ आहेत.पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• ओळीत पहिलà¥à¤¯à¤¾ आणि दà¥à¤¸à¤°à¥â€à¤¯à¤¾ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¤¾à¤¸ दà¥à¤µà¤¾ दीला आहे सोबतच दà¥à¤¸à¤°à¥‡ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ जà¥à¤¯à¤¾ पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे ,ते वसà¥à¤¤à¥à¤¤: पहिलà¥à¤¯à¤¾ पानापासूनचेही पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ असावयास हवे.',
+'double-redirect-fixed-move' => '[[$1]] हलवले गेले आहे.
+ते [[$2]] येथे निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ होते.',
+'double-redirect-fixer' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ नीट करणारा',
'brokenredirects' => 'मोडके पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨',
'brokenredirectstext' => 'खालील पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नसलेली पाने जोडतात:',
@@ -1600,6 +1838,8 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'nmembers' => '$1 {{PLURAL:$1|सदसà¥à¤¯|सदसà¥à¤¯}}',
'nrevisions' => '$1 {{PLURAL:$1|आवरà¥à¤¤à¤¨|आवरà¥à¤¤à¤¨à¥‡}}',
'nviews' => '$1 {{PLURAL:$1|दृषीपथ|दृषीपथ}}',
+'nimagelinks' => '$1{{PLURAL:$1|पानावर|पानांवर}}',
+'ntransclusions' => '$1{{PLURAL:$1|पानावर|पानांवर}} वापर',
'specialpage-empty' => 'या अहवालाकरिता(रिपोरà¥à¤Ÿ)कोणताही निकाल नाही.',
'lonelypages' => 'पोरकी पाने',
'lonelypagestext' => 'खालील पानांना {{SITENAME}}चà¥à¤¯à¤¾ इतर पानांकडून दूवा जोड à¤à¤¾à¤²à¥‡à¤²à¥€ नाही.',
@@ -1612,6 +1852,8 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'popularpages' => 'पà¥à¤°à¤¸à¤¿à¤¦à¥à¤§ पाने',
'wantedcategories' => 'पाहिजे असलेले वरà¥à¤—',
'wantedpages' => 'पाहिजे असलेले लेख',
+'wantedfiles' => 'पाहिजे असलेलà¥à¤¯à¤¾ संचिका',
+'wantedtemplates' => 'पाहिजे असलेले साचे',
'mostlinked' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• जोडलेली पाने',
'mostlinkedcategories' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• जोडलेले वरà¥à¤—',
'mostlinkedtemplates' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• जोडलेले साचे',
@@ -1631,6 +1873,10 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'protectedtitlestext' => 'पà¥à¤¢à¥€à¤² शिरà¥à¤·à¤•à¥‡ बदल घडवणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न सà¥à¤°à¤•à¥à¤·à¥€à¤¤ आहेत.',
'protectedtitlesempty' => 'या नियमावलीने सधà¥à¤¯à¤¾ कोणतीही शीरà¥à¤·à¤•à¥‡ सà¥à¤°à¤•à¥à¤·à¥€à¤¤ केलेली नाहीत.',
'listusers' => 'सदसà¥à¤¯à¤¾à¤‚ची यादी',
+'listusers-editsonly' => 'फकà¥à¤¤ संपादनांसहित सदसà¥à¤¯ दाखवा',
+'listusers-creationsort' => 'निरà¥à¤®à¤¿à¤¤à¥€à¤šà¥à¤¯à¤¾ तारखेपà¥à¤°à¤®à¤¾à¤£à¥‡ लावा',
+'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}',
+'usercreated' => '$2 दिवशी $1 वेळी तयार à¤à¤¾à¤²à¥‡',
'newpages' => 'नवीन पाने',
'newpages-username' => 'सदसà¥à¤¯ नाव:',
'ancientpages' => 'जà¥à¤¨à¥€ पाने',
@@ -1651,6 +1897,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'booksources-search-legend' => 'पà¥à¤¸à¥à¤¤à¤• सà¥à¤°à¥‹à¤¤ शोधा',
'booksources-go' => 'चला',
'booksources-text' => 'खालील यादीत नवी आणिजà¥à¤¨à¥€ पà¥à¤¸à¥à¤¤à¤•à¥‡ विकणारà¥â€à¤¯à¤¾ संकेतसà¥à¤¥à¤³à¤¾à¤šà¥‡ दà¥à¤µà¥‡ आहेत,आणि तà¥à¤¯à¤¾à¤¤ कदाचित आपण शोधू पहात असलेलà¥à¤¯à¤¾ पà¥à¤¸à¥à¤¤à¤•à¤¾à¤šà¥€ अधिक माहिती असेल:',
+'booksources-invalid-isbn' => 'दिलेला आयà¤à¤¸à¤¬à¥€à¤à¤¨ वैध नाही; मूळ सà¥à¤°à¥‹à¤¤à¤¾à¤¤à¥‚न उतरवताना à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ चà¥à¤•à¤¾à¤‚चे निरसन करा.',
# Special:Log
'specialloguserlabel' => 'सदसà¥à¤¯:',
@@ -1680,16 +1927,17 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
# Special:Categories
'categories' => 'वरà¥à¤—',
-'categoriespagetext' => 'विकिवर खालील वरà¥à¤— आहेत.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => 'विकिवर खालील वरà¥à¤— {{PLURAL:$1|आहे|आहेत}}.
+[[Special:UnusedCategories|न वापरलेले वरà¥à¤—]] येथे दाखवलेले नाहीत.
+हेही पहा: [[Special:WantedCategories|पाहिजे असलेले वरà¥à¤—]].',
'categoriesfrom' => 'या शबà¥à¤¦à¤¾à¤ªà¤¾à¤¸à¥‚न सà¥à¤°à¥‚ होणारे वरà¥à¤— दाखवा:',
'special-categories-sort-count' => 'कà¥à¤°à¤®à¤¾à¤¨à¥à¤¸à¤¾à¤° लावा',
'special-categories-sort-abc' => 'अकà¥à¤·à¤°à¤¾à¤‚पà¥à¤°à¤®à¤¾à¤£à¥‡ लावा',
# Special:DeletedContributions
-'deletedcontributions' => 'वगळलेली सदसà¥à¤¯ संपादने',
-'deletedcontributions-title' => 'वगळलेली सदसà¥à¤¯ संपादने',
+'deletedcontributions' => 'वगळलेली सदसà¥à¤¯ संपादने',
+'deletedcontributions-title' => 'वगळलेली सदसà¥à¤¯ संपादने',
+'sp-deletedcontributions-contribs' => 'संपादने',
# Special:LinkSearch
'linksearch' => 'बाहà¥à¤¯ दà¥à¤µà¥‡',
@@ -1704,6 +1952,15 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusersfrom' => 'पà¥à¤¢à¥€à¤² शबà¥à¤¦à¤¾à¤ªà¤¾à¤¸à¥à¤¨ सà¥à¤°à¥‚ होणारे सदसà¥à¤¯ दाखवा:',
'listusers-submit' => 'दाखवा',
'listusers-noresult' => 'à¤à¤•à¤¹à¥€ सदसà¥à¤¯ सापडला नाही.',
+'listusers-blocked' => '(खंडित)',
+
+# Special:ActiveUsers
+'activeusers' => 'कारà¥à¤¯à¤°à¤¤ सदसà¥à¤¯à¤¾à¤‚ची यादी',
+'activeusers-count' => 'शेवटचà¥à¤¯à¤¾ {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|संपादन|संपादने}}',
+'activeusers-from' => 'पà¥à¤¢à¥€à¤² शबà¥à¤¦à¤¾à¤ªà¤¾à¤¸à¥à¤¨ सà¥à¤°à¥‚ होणारे सदसà¥à¤¯ दाखवा:',
+'activeusers-hidebots' => 'सांगकामे लपवा',
+'activeusers-hidesysops' => 'पà¥à¤°à¤šà¤¾à¤²à¤• लपवा',
+'activeusers-noresult' => 'à¤à¤•à¤¹à¥€ सदसà¥à¤¯ सापडला नाही.',
# Special:Log/newusers
'newuserlogpage' => 'नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद',
@@ -1716,41 +1973,54 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:ListGroupRights
'listgrouprights' => 'सदसà¥à¤¯ गट अधिकार',
'listgrouprights-summary' => 'खाली या विकिवर दिलेली सदसà¥à¤¯ गटांची यादी तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ अधिकारांसकट दरà¥à¤¶à¤µà¤¿à¤²à¥‡à¤²à¥€ आहे. पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•à¤¾à¤šà¥à¤¯à¤¾ अधिकारांची अधिक माहिती [[{{MediaWiki:Listgrouprights-helppage}}|इथे]] दिलेली आहे.',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">दिलेले अधिकार</span>
+* <span class="listgrouprights-revoked">रदà¥à¤¦ अधिकार</span>',
'listgrouprights-group' => 'गट',
'listgrouprights-rights' => 'अधिकार',
'listgrouprights-helppage' => 'Help:गट अधिकार',
'listgrouprights-members' => '(सदसà¥à¤¯à¤¾à¤‚ची यादी)',
+'listgrouprights-addgroup' => '{{PLURAL:$2|गट|गट}} वाढवा: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|गट|गट}} वगळा: $1',
+'listgrouprights-addgroup-all' => 'सरà¥à¤µ गट वाढवा',
'listgrouprights-removegroup-all' => 'सरà¥à¤µ समूह काढून टाका',
-'listgrouprights-addgroup-self' => 'सà¥à¤µà¤¤à¤ƒà¤šà¥à¤¯à¤¾ खातà¥à¤¯à¤¾à¤¤ मिळवा',
-'listgrouprights-removegroup-self' => 'सà¥à¤µà¤¤à¤ƒà¤šà¥à¤¯à¤¾ खातà¥à¤¯à¤¾à¤¤à¥‚न काढून टाका',
+'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' => 'जर या सदसà¥à¤¯à¤¾à¤¨à¥‡ शाबीत विपतà¥à¤° (ईमेल)पतà¥à¤¤à¤¾ तीचà¥à¤¯à¤¾ अथवा तà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ पसंतीत नमà¥à¤¦ केला असेल,तर खालील सारणी तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ à¤à¤•(च) संदेश पाठवेल.तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ पसंतीत नमà¥à¤¦ केलेला विपतà¥à¤° पतà¥à¤¤à¤¾ "कडून" पतà¥à¤¤à¥à¤¯à¤¾à¤¤ येईल मà¥à¤¹à¤£à¤œà¥‡ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¤¤à¤¾ आपलà¥à¤¯à¤¾à¤²à¤¾ उतà¥à¤¤à¤° देऊ शकेल.',
-'usermailererror' => 'पतà¥à¤° बाब तà¥à¤°à¥‚टी वापस पाठवली:',
-'defemailsubject' => '{{SITENAME}} विपतà¥à¤°',
-'noemailtitle' => 'विपतà¥à¤° पतà¥à¤¤à¤¾ नाही',
-'noemailtext' => 'या सदसà¥à¤¯à¤¾à¤¨à¥‡ शाबीत विपतà¥à¤° पतà¥à¤¤à¤¾ नमà¥à¤¦ केलेला नाही, किंवा ’इतर सदà¥à¤¸à¥à¤¯à¤¾à¤‚कडून विपतà¥à¤° येऊ नये’ सोय निवडली आहे.',
-'email-legend' => 'ईमेल अनà¥à¤¯ सदसà¥à¤¯à¤¾à¤²à¤¾ पाठवा',
-'emailfrom' => 'पà¥à¤°à¥‡à¤·à¤•',
-'emailto' => 'पà¥à¤°à¤¤à¤¿',
-'emailsubject' => 'विषय',
-'emailmessage' => 'संदेश:',
-'emailsend' => 'पाठवा',
-'emailccme' => 'माà¤à¥à¤¯à¤¾ संदेशाची मला विपतà¥à¤° पà¥à¤°à¤¤ पाठवा.',
-'emailccsubject' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ विपतà¥à¤°à¤¾à¤šà¥€ पà¥à¤°à¤¤ कडे $1: $2',
-'emailsent' => 'विपतà¥à¤° पाठवले',
-'emailsenttext' => 'तà¥à¤®à¤šà¤¾ विपतà¥à¤° संदेश पाठवणà¥à¤¯à¤¾à¤¤ आला आहे.',
+'mailnologin' => 'पाठविणà¥à¤¯à¤¾à¤šà¤¾ पतà¥à¤¤à¤¾ नाही',
+'mailnologintext' => 'इतर सदसà¥à¤¯à¤¾à¤‚ना विपतà¥à¤°(ईमेल) पाठवणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ तà¥à¤®à¥à¤¹à¥€ [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶ केलेला]] असणे आणि शाबीत विपतà¥à¤° पतà¥à¤¤à¤¾ तà¥à¤®à¤šà¥à¤¯à¤¾ [[Special:Preferences|पसंतीत]] नमà¥à¤¦ असणे आवशà¥à¤¯à¤• आहे.',
+'emailuser' => 'या सदसà¥à¤¯à¤¾à¤²à¤¾ इमेल पाठवा',
+'emailpage' => 'विपतà¥à¤° (ईमेल) उपयोगकरà¥à¤¤à¤¾',
+'emailpagetext' => 'जर या सदसà¥à¤¯à¤¾à¤¨à¥‡ शाबीत विपतà¥à¤° (ईमेल)पतà¥à¤¤à¤¾ तीचà¥à¤¯à¤¾ अथवा तà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ पसंतीत नमà¥à¤¦ केला असेल,तर खालील सारणी तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ à¤à¤•(च) संदेश पाठवेल.तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ [[Special:Preferences|सदसà¥à¤¯ पसंतीत]] नमà¥à¤¦ केलेला विपतà¥à¤° पतà¥à¤¤à¤¾ "कडून" पतà¥à¤¤à¥à¤¯à¤¾à¤¤ येईल मà¥à¤¹à¤£à¤œà¥‡ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¤¤à¤¾ आपलà¥à¤¯à¤¾à¤²à¤¾ उतà¥à¤¤à¤° देऊ शकेल.',
+'usermailererror' => 'पतà¥à¤° बाब तà¥à¤°à¥‚टी वापस पाठवली:',
+'defemailsubject' => '{{SITENAME}} विपतà¥à¤°',
+'usermaildisabled' => 'सदसà¥à¤¯ विपतà¥à¤° निषà¥à¤•à¥à¤°à¥€à¤¯ आहे',
+'usermaildisabledtext' => 'या विकीवर तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ इतर सदसà¥à¤¯à¤¾à¤‚ना विपतà¥à¤°à¥‡ पाठवता येत नाहीत',
+'noemailtitle' => 'विपतà¥à¤° पतà¥à¤¤à¤¾ नाही',
+'noemailtext' => 'या सदसà¥à¤¯à¤¾à¤¨à¥‡ वैध विपतà¥à¤° पतà¥à¤¤à¤¾ नमूद केलेला नाही.',
+'nowikiemailtitle' => 'विपतà¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित',
+'email-legend' => 'ईमेल अनà¥à¤¯ सदसà¥à¤¯à¤¾à¤²à¤¾ पाठवा',
+'emailfrom' => 'पà¥à¤°à¥‡à¤·à¤•',
+'emailto' => 'पà¥à¤°à¤¤à¤¿:',
+'emailsubject' => 'विषय:',
+'emailmessage' => 'संदेश:',
+'emailsend' => 'पाठवा',
+'emailccme' => 'माà¤à¥à¤¯à¤¾ संदेशाची मला विपतà¥à¤° पà¥à¤°à¤¤ पाठवा.',
+'emailccsubject' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ विपतà¥à¤°à¤¾à¤šà¥€ पà¥à¤°à¤¤ कडे $1: $2',
+'emailsent' => 'विपतà¥à¤° पाठवले',
+'emailsenttext' => 'तà¥à¤®à¤šà¤¾ विपतà¥à¤° संदेश पाठवणà¥à¤¯à¤¾à¤¤ आला आहे.',
+'emailuserfooter' => 'हे विपतà¥à¤° $1 ने $2 ला {{SITENAME}} वरील "सदसà¥à¤¯à¤¾à¤¸ विपतà¥à¤° पाठवा" वापरà¥à¤¨ पाठवले आहे.',
+
+# User Messenger
+'usermessage-summary' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ संदेश देत आहे.',
+'usermessage-editor' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ संदेशवाहक',
# Watchlist
'watchlist' => 'माà¤à¥€ पहारà¥â€à¤¯à¤¾à¤šà¥€ सूची',
'mywatchlist' => 'माà¤à¥€ पहारà¥â€à¤¯à¤¾à¤šà¥€ सूची',
-'watchlistfor' => "('''$1'''करिता)",
+'watchlistfor2' => '$1 $2 साठी',
'nowatchlist' => 'तà¥à¤®à¤šà¥€ पहारà¥â€à¤¯à¤¾à¤šà¥€ सूची रिकामी आहे.',
'watchlistanontext' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीतील बाबी पाहणà¥à¤¯à¤¾à¤•à¤°à¤¤à¤¾ किंवा संपादित करणà¥à¤¯à¤¾à¤•à¤°à¤¤à¤¾, कृपया $1.',
'watchnologin' => 'पà¥à¤°à¤µà¥‡à¤¶ केलेला नाही',
@@ -1826,7 +2096,7 @@ $NEWPAGE
'exblank' => 'पान रिकामे होते',
'delete-confirm' => '"$1" वगळा',
'delete-legend' => 'वगळा',
-'historywarning' => 'सà¥à¤šà¤¨à¤¾: तà¥à¤®à¥à¤¹à¥€ वगळत असलेलà¥à¤¯à¤¾ पानाला इतिहास आहे:',
+'historywarning' => 'सूचना: तà¥à¤®à¥à¤¹à¥€ वगळत असलेलà¥à¤¯à¤¾ पानाला $1 {{PLURAL:$1|आवरà¥à¤¤à¤¨à¤¾à¤šà¤¾|आवरà¥à¤¤à¤¨à¤¾à¤‚चा}} इतिहास आहे:',
'confirmdeletetext' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤• लेख तà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सरà¥à¤µ इतिहासासोबत वगळणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ तयारीत आहात.
कृपया तà¥à¤®à¥à¤¹à¥€ करत असलेली कृती ही मीडियाविकीचà¥à¤¯à¤¾ [[{{MediaWiki:Policy-url}}|नीतीनà¥à¤¸à¤¾à¤°]] आहे हà¥à¤¯à¤¾à¤šà¥€ खातà¥à¤°à¥€ करा. तसेच तà¥à¤®à¥à¤¹à¥€ करीत असलेलà¥à¤¯à¤¾ कृतीचे परीणाम कृती करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ जाणून घà¥à¤¯à¤¾.',
'actioncomplete' => 'काम पूरà¥à¤£',
@@ -1845,9 +2115,9 @@ $NEWPAGE
** लेखकाची(लेखिकेची) विनंती
** पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
** उतà¥à¤ªà¤¾à¤¤',
-'delete-edit-reasonlist' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे संपादीत करा',
-'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 पेकà¥à¤·à¤¾ जासà¥à¤¤ वेळा बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये मà¥à¤¹à¤£à¥‚न शकà¥à¤¯ केलेले नाही.',
-'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 पेकà¥à¤·à¤¾ जासà¥à¤¤ वेळा बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे.
+'delete-edit-reasonlist' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे संपादित करा',
+'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेकà¥à¤·à¤¾|पेकà¥à¤·à¤¾}}पेकà¥à¤·à¤¾ जासà¥à¤¤ वेळा बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये मà¥à¤¹à¤£à¥‚न शकà¥à¤¯ केलेले नाही.',
+'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेकà¥à¤·à¤¾|पेकà¥à¤·à¤¾}} पेकà¥à¤·à¤¾ जासà¥à¤¤ वेळा बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे.
अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू शकते;
कृपया काळजीपूरà¥à¤µà¤• हे पान वगळा.',
@@ -1857,13 +2127,16 @@ $NEWPAGE
'rollbacklink' => 'दà¥à¤°à¥‚तमाघार',
'rollbackfailed' => 'दà¥à¤°à¥‚तमाघार फसली',
'cantrollback' => 'जà¥à¤¨à¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤•à¤¡à¥‡ परतवता येत नाही; शेवटचा संपादक या पानाचा à¤à¤•à¤®à¤¾à¤¤à¥à¤° लेखक आहे.',
-'alreadyrolled' => 'Cannot rollback last edit of by [[User:$2|$2]] ([[User talk:$2|Talk]])चे शेवटाचे [[:$1]]वे संपादन माघारी परतवता येतनाही; पान आधीच कà¥à¤£à¥€ माघारी परतवले आहे किंवा संपादीत केले आहे.
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])चे शेवटाचे [[:$1]]वे संपादन माघारी परतवता येत नाही; पान आधीच कà¥à¤£à¥€ माघारी परतवले आहे किंवा संपादीत केले आहे.
-शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]])-चे होते.',
-'editcomment' => 'टिपà¥à¤ªà¤£à¥€ बदला',
+शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
+'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चरà¥à¤šà¤¾]]) यांनी केलेले बदल [[User:$1|$1]] यांचà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤•à¤¡à¥‡ पूरà¥à¤µà¤ªà¤¦à¤¾à¤¸ नेले.',
'rollback-success' => '$1 ने उलटवलेली संपादने;$2 चà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤¸ परत नेली.',
-'sessionfailure' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ दाखल सतà¥à¤°à¤¾à¤¤ काही समसà¥à¤¯à¤¾ दिसते;सतà¥à¤° अपहारणा पासून काळजी घेणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ दृषà¥à¤Ÿà¥€à¤¨à¥‡ ही कृती रदà¥à¤¦ केली गेली आहे.कपया आपलà¥à¤¯à¤¾ विचरकाचà¥à¤¯à¤¾ "back" कळीवर टिचकी मारा आणि तà¥à¤®à¥à¤¹à¥€ जà¥à¤¯à¤¾ पानावरून आला ते पà¥à¤¨à¥à¤¹à¤¾ चढवा,आणि पà¥à¤°à¤¤ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
+
+# Edit tokens
+'sessionfailure-title' => 'सतà¥à¤° तà¥à¤°à¥à¤Ÿà¥€',
+'sessionfailure' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ दाखल सतà¥à¤°à¤¾à¤¤ काही समसà¥à¤¯à¤¾ दिसते;सतà¥à¤° अपहारणा पासून काळजी घेणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ दृषà¥à¤Ÿà¥€à¤¨à¥‡ ही कृती रदà¥à¤¦ केली गेली आहे.कपया आपलà¥à¤¯à¤¾ विचरकाचà¥à¤¯à¤¾ "back" कळीवर टिचकी मारा आणि तà¥à¤®à¥à¤¹à¥€ जà¥à¤¯à¤¾ पानावरून आला ते पà¥à¤¨à¥à¤¹à¤¾ चढवा,आणि पà¥à¤°à¤¤ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
# Protect
'protectlogpage' => 'सà¥à¤°à¤•à¥à¤·à¤¾ नोंदी',
@@ -1871,6 +2144,7 @@ $NEWPAGE
'protectedarticle' => '"[[$1]]" सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केला',
'modifiedarticleprotection' => '"[[$1]]"करिता सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ बदलली',
'unprotectedarticle' => '"[[$1]]" असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केला.',
+'movedarticleprotection' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ "[[$2]]" येथून "[[$1]]" येथे हलवली.',
'protect-title' => '"$1" सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करत आहे',
'prot_1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले.',
'protect-legend' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€à¤¤à¥€à¤² बदल निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करा',
@@ -1893,8 +2167,13 @@ $NEWPAGE
'protect-expiry-indefinite' => 'अनंत',
'protect-cascade' => 'या पानात असलेली पाने सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा (सà¥à¤°à¤•à¥à¤·à¤¾ शिडी)',
'protect-cantedit' => 'तà¥à¤®à¥à¤¹à¥€ या पानाची सà¥à¤°à¤•à¥à¤·à¤¾ पातळी बदलू शकत नाही कारण तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तसे करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
+'protect-othertime' => 'इतर वेळ:',
+'protect-othertime-op' => 'इतर वेळ',
+'protect-existing-expiry' => 'शेवट दिनांक: $3, $2',
+'protect-otherreason' => 'इतर / अतिरिकà¥à¤¤ कारण:',
'protect-otherreason-op' => 'दà¥à¤¸à¤°à¥‡ कारण',
-'protect-expiry-options' => '२ तास:2 hours,१ दिवस:1 day,३ दिवस:3 days,१ आठवडा:1 week,२ आठवडे:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ वरà¥à¤·:1 year,अनंत:infinite',
+'protect-edit-reasonlist' => 'सà¥à¤°à¤•à¥à¤·à¥‡à¤šà¥€ कारणे संपादित करा',
+'protect-expiry-options' => '१ तास:1 hour,१ दिवस:1 day,१ आठवडा:1 week,२ आठवडे:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ वरà¥à¤·:1 year,अनंत:infinite',
'restriction-type' => 'परवानगी:',
'restriction-level' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€:',
'minimum-size' => 'किमान आकार',
@@ -1917,7 +2196,8 @@ $NEWPAGE
'undeletepage' => 'वगळलेली पाने पहा आणि पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'undeletepagetitle' => "'''खाली [[:$1]] चà¥à¤¯à¤¾ वगळलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾ समाविषà¥à¤Ÿ केलेलà¥à¤¯à¤¾ आहेत'''.",
'viewdeletedpage' => 'काढून टाकलेले लेख पहा',
-'undeletepagetext' => 'खालील पाने वगळली आहेत तरी सà¥à¤¦à¥à¤§à¤¾ विदागारात जतन आहेत आणि पà¥à¤°à¥à¤¨à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणे शकà¥à¤¯ आहे. विदागारातील साठवण ठरावीक कालावधीने सà¥à¤µà¤šà¥à¤› करता येते.',
+'undeletepagetext' => 'खालील {{PLURAL:$1|पान वगळले आहे तरीसà¥à¤¦à¥à¤§à¤¾ विदागारात जतन आहे आणि पà¥à¤°à¥à¤¨à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणे शकà¥à¤¯ आहे|$1 पाने वगळली आहेत तरी सà¥à¤¦à¥à¤§à¤¾ विदागारात जतन आहेत आणि पà¥à¤°à¥à¤¨à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणे शकà¥à¤¯ आहेत}}. विदागारातील साठवण ठराविक कालावधीने सà¥à¤µà¤šà¥à¤› करता येते.',
+'undelete-fieldset-title' => 'आवरà¥à¤¤à¤¨à¥‡ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'undeleteextrahelp' => "संपूरà¥à¤£ पान पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾,सारे रकाने रिकामे ठेवा आणि '''''पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨'''''वर टिचकी मारा. निवडक पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾, जà¥à¤¯à¤¾ आवरà¥à¤¤à¤¨à¤¾à¤‚चे पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ करावयाचे तà¥à¤¯à¤¾à¤‚चे रकाने निवडा , आणि '''''पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨'''''वर टिचकी मारा. '''''पà¥à¤¨à¤°à¥à¤¯à¥‹à¤œà¤¨ ''''' वर टिचकी मारलà¥à¤¯à¤¾à¤¸ सारे रकाने आणि पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾ खिडकी रिकामी होईल.",
'undeleterevisions' => '$1 {{PLURAL:$1|आवरà¥à¤¤à¤¨|आवरà¥à¤¤à¤¨à¥‡}}विदागारात संचीत',
'undeletehistory' => 'जर तà¥à¤®à¥à¤¹à¥€ पान पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ केले तर ,सारी आवरà¥à¤¤à¤¨à¥‡ इतिहासात पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ होतील.
@@ -1925,14 +2205,15 @@ $NEWPAGE
'undeleterevdel' => 'पृषà¥à¤  पानाचे आवरà¥à¤¤à¤¨ अरà¥à¤§à¤µà¤Ÿ वगळले जाणार असेल तर पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾à¤šà¥€ कृती केली जाणार नाही.
अशा पà¥à¤°à¤¸à¤‚गी, तà¥à¤®à¥à¤¹à¥€ अगदी अलिकडील वगळलेली आवरà¥à¤¤à¤¨à¥‡ अनचेक किंवा अनहाईड केलीच पाहिजे.',
'undeletehistorynoadmin' => 'हे पान वगळले गेले आहे.वगळणà¥à¤¯à¤¾à¤šà¥‡ कारण खालील आढावà¥à¤¯à¤¾à¤¤,वगळणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ संपादीत करणारà¥â€à¤¯à¤¾ संपादकांचà¥à¤¯à¤¾ माहिती सोबत,दाखवले आहे. वगळलेलà¥à¤¯à¤¾ आवरà¥à¤¤à¥à¤¨à¤¾à¤‚चा नेमका मजकà¥à¤° केवळ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚ना उपलबà¥à¤§ असेल.',
-'undelete-revision' => '$1चे($2चे)आवरà¥à¤¤à¤¨ $3 ने वगळले:',
+'undelete-revision' => '$1चे($4चे, $5 येथील) आवरà¥à¤¤à¤¨ $3 ने वगळले:',
'undeleterevision-missing' => 'अयोगà¥à¤¯ अथवा नसापडणारे आवरà¥à¤¤à¤¨. तà¥à¤®à¤šà¤¾ दà¥à¤µà¤¾ कदाचित चूकीचा असेल, किंवा आवरà¥à¤¤à¤¨ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ केले गेले असेल किंवा विदागारातून वगळले असेल.',
'undelete-nodiff' => 'पूरà¥à¤µà¥€à¤šà¥‡ कोणतेही आवरà¥à¤¤à¤¨ आढळले नाही.',
'undeletebtn' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कà¥à¤°à¤¿à¤¯à¤¾ रदà¥à¤¦ करा',
'undeletelink' => 'पहा/पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+'undeleteviewlink' => 'पहा',
'undeletereset' => 'पूरà¥à¤µà¤µà¤¤',
'undeleteinvert' => 'निवड उलट करा',
-'undeletecomment' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾:',
+'undeletecomment' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾:',
'undeletedarticle' => '"[[$1]]" पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
'undeletedrevisions' => '{{PLURAL:$1|1 आवरà¥à¤¤à¤¨|$1 आवरà¥à¤¤à¤¨à¥‡}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
'undeletedrevisions-files' => '{{PLURAL:$1|1 आवरà¥à¤¤à¤¨|$1 आवरà¥à¤¤à¤¨à¥‡}}आणि {{PLURAL:$2|1 संचिका|$2 संचिका}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
@@ -1954,6 +2235,7 @@ $NEWPAGE
'undelete-error-long' => 'संचिकेचे वगळणे उलटवताना तà¥à¤°à¥‚टींचा अडथळा आला:
$1',
+'undelete-show-file-submit' => 'होय',
# Namespace form on various pages
'namespace' => 'नामविशà¥à¤µ:',
@@ -1970,15 +2252,23 @@ $1',
'month' => 'या महिनà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न (आणि पूरà¥à¤µà¥€à¤šà¥‡):',
'year' => 'या वरà¥à¤·à¤¾à¤ªà¤¾à¤¸à¥‚न (आणि पूरà¥à¤µà¥€à¤šà¥‡):',
-'sp-contributions-newbies' => 'केवळ नवीन सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤‚चे योगदान दाखवा',
-'sp-contributions-newbies-sub' => 'नवशिकà¥à¤¯à¤¾à¤‚साठी',
-'sp-contributions-blocklog' => 'बà¥à¤²à¥‰à¤• यादी',
-'sp-contributions-deleted' => 'वगळलेली सदसà¥à¤¯ संपादने',
-'sp-contributions-talk' => 'चरà¥à¤šà¤¾',
-'sp-contributions-userrights' => 'सदसà¥à¤¯ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
-'sp-contributions-search' => 'योगदान शोधयंतà¥à¤°',
-'sp-contributions-username' => 'आंतरजाल अंकपतà¥à¤¤à¤¾ किंवा सदसà¥à¤¯à¤¨à¤¾à¤®:',
-'sp-contributions-submit' => 'शोध',
+'sp-contributions-newbies' => 'केवळ नवीन सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤‚चे योगदान दाखवा',
+'sp-contributions-newbies-sub' => 'नवशिकà¥à¤¯à¤¾à¤‚साठी',
+'sp-contributions-newbies-title' => 'नवीन खातà¥à¤¯à¤¾à¤‚साठी सदसà¥à¤¯ योगदान',
+'sp-contributions-blocklog' => 'बà¥à¤²à¥‰à¤• यादी',
+'sp-contributions-deleted' => 'वगळलेली सदसà¥à¤¯ संपादने',
+'sp-contributions-uploads' => 'चढवलेलà¥à¤¯à¤¾ संचिका',
+'sp-contributions-logs' => 'नोंदी',
+'sp-contributions-talk' => 'चरà¥à¤šà¤¾',
+'sp-contributions-userrights' => 'सदसà¥à¤¯ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
+'sp-contributions-blocked-notice' => 'हा सदसà¥à¤¯ सधà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.
+सरà¥à¤µà¤¾à¤‚त नवीन पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन यादी खाली संदरà¥à¤­à¤¾à¤¸à¤¾à¤ à¥€ दिली आहे:',
+'sp-contributions-blocked-notice-anon' => 'हा अंकपतà¥à¤¤à¤¾ सधà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.
+सरà¥à¤µà¤¾à¤‚त नवीन पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन यादी खाली संदरà¥à¤­à¤¾à¤¸à¤¾à¤ à¥€ दिली आहे:',
+'sp-contributions-search' => 'योगदान शोधयंतà¥à¤°',
+'sp-contributions-username' => 'आंतरजाल अंकपतà¥à¤¤à¤¾ किंवा सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'sp-contributions-toponly' => 'नवीन आवरà¥à¤¤à¤¨à¥‡ असलेली संपादने दाखवा',
+'sp-contributions-submit' => 'शोध',
# What links here
'whatlinkshere' => 'येथे काय जोडले आहे',
@@ -2001,6 +2291,7 @@ $1',
# Block/unblock
'blockip' => 'हा अंकपतà¥à¤¤à¤¾ अडवा',
+'blockip-title' => 'सदसà¥à¤¯à¤¾à¤¸ पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध करा',
'blockip-legend' => 'सदसà¥à¤¯à¤¾à¤¸ पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध करा',
'blockiptext' => 'à¤à¤–ादà¥à¤¯à¤¾ विशिषà¥à¤Ÿ अंकपतà¥à¤¤à¥à¤¯à¤¾à¤šà¥€ किंवा सदसà¥à¤¯à¤¾à¤šà¥€ लिहिणà¥à¤¯à¤¾à¤šà¥€ कà¥à¤·à¤®à¤¤à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ खालील सारणी वापरा.
हे केवळ उचà¥à¤›à¥‡à¤¦ टाळणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾à¤š दृषà¥à¤Ÿà¥€à¤¨à¥‡ आणि [[{{MediaWiki:Policy-url}}|निती]]स अनà¥à¤¸à¤°à¥‚न केले पाहिजे.
@@ -2036,8 +2327,8 @@ $1',
'ipb-edit-dropdown' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धाची कारणे संपादा',
'ipb-unblock-addr' => '$1चा पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध उठवा',
'ipb-unblock' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ आणि अंकपतà¥à¤¤à¥à¤¯à¤¾à¤µà¤°à¤šà¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन उठवा',
-'ipb-blocklist-addr' => '$1करिता सधà¥à¤¯à¤¾à¤šà¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध पहा',
'ipb-blocklist' => 'सधà¥à¤¯à¤¾à¤šà¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध पहा',
+'ipb-blocklist-contribs' => '$1 साठी सदसà¥à¤¯à¤¾à¤šà¥‡ योगदान',
'unblockip' => 'अंकपतà¥à¤¤à¤¾ सोडवा',
'unblockiptext' => 'खाली दिलेला फॉरà¥à¤® वापरून पूरà¥à¤µà¥€ अडवलेलà¥à¤¯à¤¾ अंकपतà¥à¤¤à¥à¤¯à¤¾à¤²à¤¾ लेखनासाठी आधिकार दà¥à¤¯à¤¾.',
'ipusubmit' => 'हा पतà¥à¤¤à¤¾ सोडवा',
@@ -2046,7 +2337,11 @@ $1',
'ipblocklist' => 'अडविलेले अंकपतà¥à¤¤à¥‡ व सदसà¥à¤¯ नावे',
'ipblocklist-legend' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत सदसà¥à¤¯ शोधा',
'ipblocklist-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ किंवा आंतरजाल अंकपतà¥à¤¤à¤¾:',
+'ipblocklist-sh-userblocks' => '$1खाते पà¥à¤°à¤¤à¤¿à¤¬à¤‚धने',
+'ipblocklist-sh-tempblocks' => '$1 तातà¥à¤ªà¥à¤°à¤¤à¥€ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धने',
'ipblocklist-submit' => 'शोध',
+'ipblocklist-localblock' => 'सà¥à¤¥à¤¾à¤¨à¤¿à¤• पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|दà¥à¤¸à¤°à¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन|इतर पà¥à¤°à¤¤à¤¿à¤¬à¤‚धने}}',
'blocklistline' => '$3 ($4)ला $1, $2 ने पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत केले',
'infiniteblock' => 'अनंत',
'expiringblock' => 'समापà¥à¤¤à¤¿ $1 $2',
@@ -2054,6 +2349,7 @@ $1',
'noautoblockblock' => 'सà¥à¤µà¥à¤¯à¤‚चलितपà¥à¤°à¤¤à¤¿à¤¬à¤‚धन सà¥à¤¥à¤—ित केले',
'createaccountblock' => 'खातà¥à¤¯à¤¾à¤šà¥€ निरà¥à¤®à¤¿à¤¤à¥€ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत केली',
'emailblock' => 'विपतà¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत',
+'blocklist-nousertalk' => 'ला सà¥à¤µà¤¤à¤ƒà¤šà¥‡ चरà¥à¤šà¤¾à¤ªà¤¾à¤¨ संपादता येत नाही',
'ipblocklist-empty' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन यादी रिकामी आहे.',
'ipblocklist-no-results' => 'विनंती केलेला अंकपतà¥à¤¤à¤¾ अथवा सदसà¥à¤¯à¤¨à¤¾à¤µ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत केलेले नाही.',
'blocklink' => 'अडवा',
@@ -2071,10 +2367,16 @@ $1',
'block-log-flags-nocreate' => 'खाते तयारकरणे अवरूदà¥à¤§ केले',
'block-log-flags-noautoblock' => 'सà¥à¤µà¤¯à¤‚चलित पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन अवरूदà¥à¤§ केले',
'block-log-flags-noemail' => 'विपतà¥à¤° अवरूदà¥à¤§ केले',
+'block-log-flags-nousertalk' => 'ला सà¥à¤µà¤¤à¤ƒà¤šà¥‡ चरà¥à¤šà¤¾à¤ªà¤¾à¤¨ संपादता येत नाही',
+'block-log-flags-hiddenname' => 'सदसà¥à¤¯à¤¨à¤¾à¤® लपवलेले आहे',
'range_block_disabled' => 'पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚ची पलà¥à¤²à¤¾ बंधने घालणà¥à¤¯à¤¾à¤šà¥€ कà¥à¤·à¤®à¤¤à¤¾ अनà¥à¤ªà¤²à¤¬à¥à¤§ केली आहे.',
'ipb_expiry_invalid' => 'अयोगà¥à¤¯ समापà¥à¤¤à¥€ काळ.',
'ipb_expiry_temp' => 'लपविलेले सदसà¥à¤¯à¤¨à¤¾à¤® पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन कायमसà¥à¤µà¤°à¥à¤ªà¥€ असले पाहिजे.',
'ipb_already_blocked' => '"$1" आधीच अवरूदà¥à¤§ केलेले आहे.',
+'ipb-needreblock' => '== अगोदरच पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित ==
+$1 हा अगोदरच पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.
+तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ रà¥à¤ªà¤°à¥‡à¤·à¤¾ बदलायची आहे का?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|दà¥à¤¸à¤°à¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन|इतर पà¥à¤°à¤¤à¤¿à¤¬à¤‚धने}}',
'ipb_cant_unblock' => 'तà¥à¤°à¥‚टी: पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन कà¥à¤°.$1 मिळाला नाही. तà¥à¤¯à¤¾à¤µà¤°à¥€à¤² पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन कदाचित आधीच उठवले असेल.',
'ipb_blocked_as_range' => 'तà¥à¤°à¥‚टी:अंकपतà¥à¤¤à¤¾ IP $1 हा पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤·à¤ªà¤£à¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत केलेला नाही आणि अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत करता येत नाही.तो,अरà¥à¤¥à¤¾à¤¤,$2पलà¥à¤²à¥à¤¯à¤¾à¤šà¤¾ भाग मà¥à¤¹à¤¾à¤£à¥‚न तो पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत केलेला आहे,जो की अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत करता येत नाही.',
'ip_range_invalid' => 'अंकपतà¥à¤¤à¤¾ अयोगà¥à¤¯ टपà¥à¤ªà¥à¤¯à¤¾à¤¤.',
@@ -2085,6 +2387,8 @@ $1',
'proxyblocksuccess' => 'à¤à¤¾à¤²à¥‡.',
'sorbsreason' => '{{SITENAME}}ने वापरलेलà¥à¤¯à¤¾ DNSBL मधà¥à¤¯à¥‡ तà¥à¤®à¤šà¥à¤¯à¤¾ अंकपतà¥à¤¤à¥à¤¯à¤¾à¤šà¥€ नोंद उघड-उघड पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¥€ मà¥à¤¹à¤£à¥‚न सूचित केली आहे.',
'sorbs_create_account_reason' => '{{SITENAME}}चà¥à¤¯à¤¾ DNSBLने तà¥à¤®à¤šà¤¾ अंकपतà¥à¤¤à¤¾ उघड-उघड पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¥€ मà¥à¤¹à¤£à¥‚न सूचित केला आहे.तà¥à¤®à¥à¤¹à¥€ खाते उघडू शकत नाही',
+'cant-block-while-blocked' => 'तà¥à¤®à¥à¤¹à¥€ सà¥à¤µà¤¤à¤ƒ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित असताना इतरांना पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू शकत नाही.',
+'ipbnounblockself' => 'तà¥à¤®à¥à¤¹à¥€ सà¥à¤µà¤¤à¤ƒ अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू शकत नाही',
# Developer tools
'lockdb' => 'विदागारास ताळे ठोका',
@@ -2107,9 +2411,9 @@ $1',
'databasenotlocked' => 'विदागारास ताळे नही',
# Move page
-'move-page' => '$1 हलवा',
-'move-page-legend' => 'पृषà¥à¤  सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण',
-'movepagetext' => "खालील अरà¥à¤œ हा à¤à¤–ादà¥à¤¯à¤¾ लेखाचे शीरà¥à¤·à¤• बदलणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ वापरता येईल. खालील अरà¥à¤œ भरलà¥à¤¯à¤¾à¤¨à¤‚तर लेखाचे शीरà¥à¤·à¤• बदलले जाईल तसेच तà¥à¤¯à¤¾ लेखाचा सरà¥à¤µ इतिहास हा नवीन लेखामधà¥à¤¯à¥‡ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केला जाईल.
+'move-page' => '$1 हलवा',
+'move-page-legend' => 'पृषà¥à¤  सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण',
+'movepagetext' => "खालील अरà¥à¤œ हा à¤à¤–ादà¥à¤¯à¤¾ लेखाचे शीरà¥à¤·à¤• बदलणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ वापरता येईल. खालील अरà¥à¤œ भरलà¥à¤¯à¤¾à¤¨à¤‚तर लेखाचे शीरà¥à¤·à¤• बदलले जाईल तसेच तà¥à¤¯à¤¾ लेखाचा सरà¥à¤µ इतिहास हा नवीन लेखामधà¥à¤¯à¥‡ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केला जाईल.
जà¥à¤¨à¥‡ शीरà¥à¤·à¤• नवीन शीरà¥à¤·à¤•à¤¾à¤²à¤¾ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ करेल.
जà¥à¤¨à¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤²à¤¾ असलेले दà¥à¤µà¥‡ बदलले जाणार नाहीत, तरी तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ विनंती आहे की सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण केलà¥à¤¯à¤¾à¤¨à¤‚तर
[[Special:DoubleRedirects|दà¥à¤¹à¥‡à¤°à¥€]] अथवा [[Special:BrokenRedirects|मोडकी]] पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ तपासावीत.
@@ -2121,53 +2425,65 @@ $1',
'''सूचना!'''
सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण केलà¥à¤¯à¤¾à¤¨à¥‡ à¤à¤–ादà¥à¤¯à¤¾ महतà¥à¤µà¤¾à¤šà¥à¤¯à¤¾ लेखामधà¥à¤¯à¥‡ अनपेकà¥à¤·à¤¿à¤¤ बदल होऊ शकतात. तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ विनंती आहे की तà¥à¤®à¥à¤¹à¥€ पूरà¥à¤£ काळजी घà¥à¤¯à¤¾ व होणारे परिणाम समजावून घà¥à¤¯à¤¾.
जर तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ शंका असेल तर पà¥à¤°à¤¬à¤‚धकांशी संपरà¥à¤• करा.",
-'movepagetalktext' => "संबंधित चरà¥à¤šà¤¾ पृषà¥à¤  याबरोबर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होणार नाही '''जर:'''
+'movepagetalktext' => "संबंधित चरà¥à¤šà¤¾ पृषà¥à¤  याबरोबर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होणार नाही '''जर:'''
* तà¥à¤®à¥à¤¹à¥€ पृषà¥à¤  दà¥à¤¸à¤°à¥â€à¤¯à¤¾ नामविशà¥à¤µà¤¾à¤¤ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करत असाल
* या नावाचे चरà¥à¤šà¤¾ पान अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असेल तर, किंवा
* खालील चेकबॉकà¥à¤¸ तà¥à¤®à¥à¤¹à¥€ काढून टाकला तर.
या बाबतीत तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ सà¥à¤µà¤¤à¤ƒà¤²à¤¾ ही पाने à¤à¤•à¤¤à¥à¤° करावी लागतील.",
-'movearticle' => 'पृषà¥à¤ à¤¾à¤šà¥‡ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण',
-'movenologin' => 'पà¥à¤°à¤µà¥‡à¤¶ केलेला नाही',
-'movenologintext' => 'पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶]] करावा लागेल.',
-'movenotallowed' => '{{SITENAME}}वरील पाने सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤šà¥€ आपलà¥à¤¯à¤¾à¤ªà¤¾à¤¶à¥€ परवानगी नाही.',
-'movenotallowedfile' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ दसà¥à¤¤à¤¾à¤µà¥ˆà¤œ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
-'cant-move-user-page' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ सदसà¥à¤¯à¤¾à¤šà¥‡ दसà¥à¤¤à¤¾à¤µà¥ˆà¤œ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
-'newtitle' => 'नवीन शीरà¥à¤·à¤•à¤¾à¤•à¤¡à¥‡:',
-'move-watch' => 'या पानावर लकà¥à¤· ठेवा',
-'movepagebtn' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करा',
-'pagemovedsub' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण यशसà¥à¤µà¥€',
-'movepage-moved' => '\'\'\'"$1" ला "$2" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले\'\'\'',
-'articleexists' => 'तà¥à¤¯à¤¾ नावाचे पृषà¥à¤  अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे, किंवा तà¥à¤®à¥à¤¹à¥€ निवडलेले
+'movearticle' => 'पृषà¥à¤ à¤¾à¤šà¥‡ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण',
+'movenologin' => 'पà¥à¤°à¤µà¥‡à¤¶ केलेला नाही',
+'movenologintext' => 'पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶]] करावा लागेल.',
+'movenotallowed' => '{{SITENAME}}वरील पाने सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤šà¥€ आपलà¥à¤¯à¤¾à¤ªà¤¾à¤¶à¥€ परवानगी नाही.',
+'movenotallowedfile' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ दसà¥à¤¤à¤¾à¤µà¥ˆà¤œ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
+'cant-move-user-page' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ सदसà¥à¤¯à¤¾à¤šà¥‡ दसà¥à¤¤à¤¾à¤µà¥ˆà¤œ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
+'newtitle' => 'नवीन शीरà¥à¤·à¤•à¤¾à¤•à¤¡à¥‡:',
+'move-watch' => 'या पानावर लकà¥à¤· ठेवा',
+'movepagebtn' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करा',
+'pagemovedsub' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण यशसà¥à¤µà¥€',
+'movepage-moved' => '\'\'\'"$1" ला "$2" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले\'\'\'',
+'movepage-moved-redirect' => 'à¤à¤• पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ तयार केले आहे.',
+'articleexists' => 'तà¥à¤¯à¤¾ नावाचे पृषà¥à¤  अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे, किंवा तà¥à¤®à¥à¤¹à¥€ निवडलेले
नाव योगà¥à¤¯ नाही आहे.
कृपया दà¥à¤¸à¤°à¥‡ नाव शोधा.',
-'cantmove-titleprotected' => 'नवे शीरà¥à¤·à¤• निरà¥à¤®à¥€à¤¤ करणà¥à¤¯à¤¾ पासून सà¥à¤°à¤•à¥à¤·à¥€à¤¤ केलेले असलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡,तà¥à¤®à¥à¤¹à¥€ या जागी à¤à¤–ादे पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करू शकत नाही.',
-'talkexists' => 'पृषà¥à¤  यशसà¥à¤µà¥€à¤°à¥€à¤¤à¥à¤¯à¤¾ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत à¤à¤¾à¤²à¥‡ पण चरà¥à¤šà¤¾ पृषà¥à¤  सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होवू
+'cantmove-titleprotected' => 'नवे शीरà¥à¤·à¤• निरà¥à¤®à¥€à¤¤ करणà¥à¤¯à¤¾ पासून सà¥à¤°à¤•à¥à¤·à¥€à¤¤ केलेले असलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡,तà¥à¤®à¥à¤¹à¥€ या जागी à¤à¤–ादे पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करू शकत नाही.',
+'talkexists' => 'पृषà¥à¤  यशसà¥à¤µà¥€à¤°à¥€à¤¤à¥à¤¯à¤¾ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत à¤à¤¾à¤²à¥‡ पण चरà¥à¤šà¤¾ पृषà¥à¤  सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होवू
शकले नाही कारण तà¥à¤¯à¤¾ नावाचे पृषà¥à¤  आधीच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ होते. कृपया तà¥à¤®à¥à¤¹à¥€ सà¥à¤µà¤¤à¤ƒ ती पृषà¥à¤ à¥‡ à¤à¤•à¤¤à¥à¤° करा.',
-'movedto' => 'कडे सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण केले',
-'movetalk' => 'शकà¥à¤¯ असलà¥à¤¯à¤¾à¤¸ "चरà¥à¤šà¤¾ पृषà¥à¤ " सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करा',
-'move-subpages' => 'जर लागू असेल तर, सरà¥à¤µ उपपाने सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करा',
-'move-talk-subpages' => 'जर लागू असेल तर चरà¥à¤šà¤¾ पानाची सरà¥à¤µ उपपाने सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करा',
-'movepage-page-exists' => '$1 पान अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤¤à¥à¤µà¤¾à¤¤ आहे व तà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾à¤µà¤° आपोआप पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करता येणार नाही.',
-'movepage-page-moved' => '$1 हे पान $2 या मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले.',
-'movepage-page-unmoved' => '$1 हे पान $2 या मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करता आलेले नाही.',
-'movepage-max-pages' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ $1 {{PLURAL:$1|पान|पाने}} सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤¤ {{PLURAL:$1|आलेले आहे|आलेली आहेत}} व आता आणखी पाने आपोआप सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होणार नाहीत.',
-'1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले.',
-'1movedto2_redir' => '[[$1]] हे पान [[$2]] मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले (पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨).',
-'movelogpage' => 'सà¥à¤¥à¤¾à¤‚नांतराची नोंद',
-'movelogpagetext' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केलेलà¥à¤¯à¤¾ पानांची यादी.',
-'movereason' => 'कारण:',
-'revertmove' => 'पूरà¥à¤µà¤ªà¤¦à¤¾à¤¸ नà¥à¤¯à¤¾',
-'delete_and_move' => 'वगळा आणि सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करा',
-'delete_and_move_text' => '==वगळणà¥à¤¯à¤¾à¤šà¥€ आवशकता==
+'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' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ $1 {{PLURAL:$1|पान|पाने}} सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤¤ {{PLURAL:$1|आलेले आहे|आलेली आहेत}} व आता आणखी पाने आपोआप सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होणार नाहीत.',
+'1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले.',
+'1movedto2_redir' => '[[$1]] हे पान [[$2]] मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले (पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨).',
+'move-redirect-suppressed' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ लपवले',
+'movelogpage' => 'सà¥à¤¥à¤¾à¤‚नांतराची नोंद',
+'movelogpagetext' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केलेलà¥à¤¯à¤¾ पानांची यादी.',
+'movesubpage' => '{{PLURAL:$1|उपपान|उपपाने}}',
+'movesubpagetext' => 'या पानास $1 {{PLURAL:$1|उपपान|उपपाने}} असून ती पà¥à¤¢à¥‡ दरà¥à¤¶à¤µà¤²à¥€ आहेत:',
+'movenosubpage' => 'या पानात उपपाने नाहीत.',
+'movereason' => 'कारण:',
+'revertmove' => 'पूरà¥à¤µà¤ªà¤¦à¤¾à¤¸ नà¥à¤¯à¤¾',
+'delete_and_move' => 'वगळा आणि सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करा',
+'delete_and_move_text' => '==वगळणà¥à¤¯à¤¾à¤šà¥€ आवशकता==
लकà¥à¤·à¥à¤¯à¤ªà¤¾à¤¨ "[[:$1]]" आधीच असà¥à¤¤à¥€à¤¤à¥à¤µà¤¾à¤¤ आहे.सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तराचा मारà¥à¤— मोकळाकरणà¥à¤¯à¤¾ करिता तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ ते वगळावयाचे आहे काय?',
-'delete_and_move_confirm' => 'होय, पान वगळा',
-'delete_and_move_reason' => 'आधीचे पान वगळून सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तर केले',
-'selfmove' => 'सà¥à¤°à¥‹à¤¤ आणि लकà¥à¤·à¥à¤¯ पाने समान आहेत; à¤à¤–ादे पान सà¥à¤µà¤¤:चà¥à¤¯à¤¾à¤š जागी सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करता येत नाही.',
-'immobile-source-page' => 'हे पान हलवता येत नाही',
-'imagenocrossnamespace' => 'जà¥à¤¯à¤¾ नामविशà¥à¤µà¤¾à¤¤ संचिका साठविता येत नाहीत, तà¥à¤¯à¤¾ नामविशà¥à¤µà¤¾à¤¤ संचिकांचे सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करता येत नाही',
-'imagetypemismatch' => 'दिलेले संचिकेचे à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन तà¥à¤¯à¤¾ संचिकेचà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤¾à¤¶à¥€ जà¥à¤³à¤¤ नाही',
+'delete_and_move_confirm' => 'होय, पान वगळा',
+'delete_and_move_reason' => 'आधीचे पान वगळून सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तर केले',
+'selfmove' => 'सà¥à¤°à¥‹à¤¤ आणि लकà¥à¤·à¥à¤¯ पाने समान आहेत; à¤à¤–ादे पान सà¥à¤µà¤¤:चà¥à¤¯à¤¾à¤š जागी सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करता येत नाही.',
+'immobile-source-namespace' => 'नामविशà¥à¤µ "$1" मधील पाने हलवता आली नाहीत.',
+'immobile-target-namespace' => 'नामविशà¥à¤µ "$1" मधà¥à¤¯à¥‡ पाने हलवता आली नाहीत.',
+'immobile-source-page' => 'हे पान हलवता येत नाही',
+'immobile-target-page' => 'लकà¥à¤·à¥à¤¯ मथळा हलवता येत नाही.',
+'imagenocrossnamespace' => 'जà¥à¤¯à¤¾ नामविशà¥à¤µà¤¾à¤¤ संचिका साठविता येत नाहीत, तà¥à¤¯à¤¾ नामविशà¥à¤µà¤¾à¤¤ संचिकांचे सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करता येत नाही',
+'imagetypemismatch' => 'दिलेले संचिकेचे à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन तà¥à¤¯à¤¾ संचिकेचà¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤¾à¤¶à¥€ जà¥à¤³à¤¤ नाही',
+'imageinvalidfilename' => 'लकà¥à¤·à¥à¤¯à¤¸à¤‚चिका अवैध आहे',
+'move-leave-redirect' => 'मागे à¤à¤• पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ ठेवा',
+'semiprotectedpagemovewarning' => "'''सूचना:''' हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ आहे. फकà¥à¤¤ नोंदणीकृत सदसà¥à¤¯ याचà¥à¤¯à¤¾à¤¤ बदल करू शकतात.
+सरà¥à¤µà¤¾à¤‚त ताजी यादी खाली संदरà¥à¤­à¤¾à¤¸à¤¾à¤ à¥€ दिली आहे:",
# Export
'export' => 'पाने निरà¥à¤¯à¤¾à¤¤ करा',
@@ -2182,16 +2498,25 @@ $1',
'export-submit' => 'निरà¥à¤¯à¤¾à¤¤ करा',
'export-addcattext' => 'वरà¥à¤—ीकरणातून पाने भरा:',
'export-addcat' => 'भर',
+'export-addnstext' => 'नामविशà¥à¤µà¤¾à¤¤à¥‚न पाने वाढवा:',
+'export-addns' => 'वाढवा',
'export-download' => 'संचिका मà¥à¤¹à¤£à¥‚न जतन करा',
'export-templates' => 'साचे आंतरभूत करा',
# Namespace 8 related
-'allmessages' => 'सरà¥à¤µ पà¥à¤°à¤£à¤¾à¤²à¥€-संदेश',
-'allmessagesname' => 'नाव',
-'allmessagesdefault' => 'सà¥à¤°à¥à¤µà¤¾à¤¤à¥€à¤šà¤¾ मजकूर',
-'allmessagescurrent' => 'सधà¥à¤¯à¤¾à¤šà¤¾ मजकूर',
-'allmessagestext' => 'MediaWiki नामविशà¥à¤µà¤¾à¤¤à¥€à¤² सरà¥à¤µ पà¥à¤°à¤£à¤¾à¤²à¥€ संदेशांची यादी',
-'allmessagesnotsupportedDB' => "हे पान संपादित करता येत नाही कारण'''\$wgUseDatabaseMessages''' मालवला आहे.",
+'allmessages' => 'सरà¥à¤µ पà¥à¤°à¤£à¤¾à¤²à¥€-संदेश',
+'allmessagesname' => 'नाव',
+'allmessagesdefault' => 'सà¥à¤°à¥à¤µà¤¾à¤¤à¥€à¤šà¤¾ मजकूर',
+'allmessagescurrent' => 'सधà¥à¤¯à¤¾à¤šà¤¾ मजकूर',
+'allmessagestext' => 'मीडियाविकी नामविशà¥à¤µà¤¾à¤¤à¥€à¤² सरà¥à¤µ पà¥à¤°à¤£à¤¾à¤²à¥€ संदेशांची यादी',
+'allmessagesnotsupportedDB' => "हे पान संपादित करता येत नाही कारण'''\$wgUseDatabaseMessages''' मालवला आहे.",
+'allmessages-filter-legend' => 'गाळक',
+'allmessages-filter-unmodified' => 'असंपादित',
+'allmessages-filter-all' => 'सरà¥à¤µ',
+'allmessages-filter-modified' => 'संपादित',
+'allmessages-prefix' => 'उपसरà¥à¤—ाने गाळा:',
+'allmessages-language' => 'भाषा:',
+'allmessages-filter-submit' => 'चला',
# Thumbnails
'thumbnail-more' => 'मोठे करा',
@@ -2201,6 +2526,8 @@ $1',
'djvu_no_xml' => 'DjVu संचिकेकरिता XML ओढणà¥à¤¯à¤¾à¤¤ असमरà¥à¤¥',
'thumbnail_invalid_params' => 'इवलà¥à¤¯à¤¾à¤¶à¤¾à¤šà¤¿à¤¤à¥à¤°à¤¾à¤šà¤¾ अयोगà¥à¤¯ परिचय',
'thumbnail_dest_directory' => 'लकà¥à¤·à¥à¤¯ धारिकेचà¥à¤¯à¤¾ निरà¥à¤®à¤¿à¤¤à¥€à¤¸ असमरà¥à¤¥',
+'thumbnail_image-type' => 'चितà¥à¤°à¤ªà¥à¤°à¤•à¤¾à¤° समरà¥à¤¥à¤¿à¤¤ नाही',
+'thumbnail_image-missing' => 'संचिका सापडत नाही: $1',
# Special:Import
'import' => 'पाने आयात करा',
@@ -2208,14 +2535,18 @@ $1',
'import-interwiki-text' => 'आयात करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ à¤à¤• विकि आणि पानाचा मथळा निवडा.
आवरà¥à¤¤à¤¨à¤¾à¤‚चà¥à¤¯à¤¾ तारखा आणि संपादकांची नावे जतन केली जातील.
सरà¥à¤µ आंतरविकि आयात कà¥à¤°à¤¿à¤¯à¤¾ [[Special:Log/import|आयात नोंदीत]] दाखल केलà¥à¤¯à¤¾ आहेत.',
+'import-interwiki-source' => 'सà¥à¤°à¥‹à¤¤ विकी / पान:',
'import-interwiki-history' => 'या पानाकरिताची सारà¥â€à¤¯à¤¾ इतिहास आवरà¥à¤¤à¤¨à¤¾à¤‚ची नकà¥à¤•à¤² करा',
+'import-interwiki-templates' => 'साचे आंतरभूत करा',
'import-interwiki-submit' => 'आयात',
'import-interwiki-namespace' => 'पाने नामविशà¥à¤µà¤¾à¤¤ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करा:',
+'import-upload-filename' => 'संचिकानाव:',
'import-comment' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¥€à¤¯à¤¾:',
-'importtext' => 'कृपया Special:Export सà¥à¤µà¤¿à¤§à¤¾ वापरून सà¥à¤°à¥‹à¤¤ विकिकडून संचिका निरà¥à¤¯à¤¾à¤¤ करा,ती तà¥à¤®à¤šà¥à¤¯à¤¾ तबकडीवर जतन करा आणि येथे चढवा.',
+'importtext' => 'कृपया [[Special:Export|निरà¥à¤¯à¤¾à¤¤ सà¥à¤µà¤¿à¤§à¤¾]] वापरून सà¥à¤°à¥‹à¤¤ विकिकडून संचिका निरà¥à¤¯à¤¾à¤¤ करा,ती तà¥à¤®à¤šà¥à¤¯à¤¾ तबकडीवर जतन करा आणि येथे चढवा.',
'importstart' => 'पाने आयात करत आहे...',
'import-revision-count' => '$1 {{PLURAL:$1|आवरà¥à¤¤à¤¨|आवरà¥à¤¤à¤¨à¥‡}}',
'importnopages' => 'आयातीकरिता पाने नाहीत.',
+'imported-log-entries' => '{{PLURAL:$1|आयात केलेली|आयात केलेलà¥à¤¯à¤¾}} $1 {{PLURAL:$1|यादी पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¥€|यादी पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¥à¤¯à¤¾}}.',
'importfailed' => 'अयशसà¥à¤µà¥€ आयात: $1',
'importunknownsource' => 'आयात सà¥à¤°à¥‹à¤¤ पà¥à¤°à¤•à¤¾à¤° अजà¥à¤žà¤¾à¤¤',
'importcantopen' => 'आयातीत संचिका उघडणे जमले नाही',
@@ -2233,6 +2564,8 @@ $1',
'import-nonewrevisions' => 'सारी आवरà¥à¤¤à¤¨à¥‡ पूरà¥à¤µà¥€ आयात केली होती.',
'xml-error-string' => '$1 ओळ $2मधà¥à¤¯à¥‡ , सà¥à¤¤à¤‚भ $3 (बाईट $4): $5',
'import-upload' => 'XML डाटा चढवा',
+'import-token-mismatch' => 'अधिवेशन माहितीची हानी.
+कृपया पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
# Import log
'importlogpage' => 'ईमà¥à¤ªà¥‹à¤°à¥à¤Ÿ सूची',
@@ -2259,6 +2592,7 @@ $1',
'tooltip-ca-viewsource' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ आहे. तà¥à¤®à¥à¤¹à¥€ याचा सà¥à¤°à¥‹à¤¤ पाहू शकता.',
'tooltip-ca-history' => 'या पानाचà¥à¤¯à¤¾ जà¥à¤¨à¥à¤¯à¤¾ आवृतà¥à¤¯à¤¾.',
'tooltip-ca-protect' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
+'tooltip-ca-unprotect' => 'पृषà¥à¤  असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
'tooltip-ca-delete' => 'हे पान वगळा',
'tooltip-ca-undelete' => 'या पानाची वगळणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ केलेली संपादने पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'tooltip-ca-move' => 'हे पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करा.',
@@ -2306,6 +2640,8 @@ $1',
'tooltip-rollback' => '"दà¥à¤°à¥‚तमाघार" शेवटचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤¨à¥‡ या पानात केलेली संपादने à¤à¤•à¤¾ à¤à¤Ÿà¤•à¥à¤¯à¤¾à¤¤ उलटविते.',
'tooltip-undo' => '"रदà¥à¤¦ करा" हे संपादन उलटविते व संपादन खिडकी उघडते.
तà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ तà¥à¤®à¥à¤¹à¥€ बदलांचा आढावा देऊ शकता.',
+'tooltip-preferences-save' => 'माà¤à¥à¤¯à¤¾ पसंती जतन करा',
+'tooltip-summary' => 'लहान सारांश लिहा',
# Metadata
'nodublincore' => 'या विदादातà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ Dublin Core RDF metadata अनà¥à¤ªà¤²à¤¬à¥à¤§ केला आहे.',
@@ -2313,12 +2649,14 @@ $1',
'notacceptable' => 'विकि विदादाता तà¥à¤®à¤šà¤¾ घेता वाचू शकेल अशा सà¥à¤µà¤°à¥‚पात(संरचनेत) विदा पà¥à¤°à¤µà¥‚ शकत नाही.',
# Attribution
-'anonymous' => '{{SITENAME}} वरील अनामिक सदसà¥à¤¯',
+'anonymous' => '{{SITENAME}} वरील अनामिक {{PLURAL:$1|सदसà¥à¤¯|सदसà¥à¤¯}}',
'siteuser' => '<!--{{SITENAME}}-->मराठी विकिपीडियाचा सदसà¥à¤¯ $1',
+'anonuser' => '{{SITENAME}} वरील अनामी सदसà¥à¤¯ $1',
'lastmodifiedatby' => 'या पानातील शेवटचा बदल $3ने $2, $1 यावेळी केला.',
'othercontribs' => '$1 ने केलेलà¥à¤¯à¤¾ कामानà¥à¤¸à¤¾à¤°.',
'others' => 'इतर',
-'siteusers' => '{{SITENAME}} सदसà¥à¤¯ $1',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|सदसà¥à¤¯|सदसà¥à¤¯}} $1',
+'anonusers' => '{{SITENAME}} वरील अनामी {{PLURAL:$2|सदसà¥à¤¯|सदसà¥à¤¯}} $1',
'creditspage' => 'पान शà¥à¤°à¥‡à¤¯ नामावली',
'nocredits' => 'या पानाकरिता शà¥à¤°à¥‡à¤¯ नामावलीची माहिती नाही.',
@@ -2364,7 +2702,7 @@ $1',
'math_unknown_function' => 'अजà¥à¤žà¤¾à¤¤ कारà¥à¤¯',
'math_lexing_error' => 'लेकà¥à¤à¥€à¤‚ग(कोशीय?)तà¥à¤°à¥‚टी',
'math_syntax_error' => 'आजà¥à¤žà¤¾à¤µà¤²à¥€-विनà¥à¤¯à¤¾à¤¸ तà¥à¤°à¥‚टी',
-'math_image_error' => 'PNG पालट अयशसà¥à¤µà¥€; latex, dvips, gs ची सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ योगà¥à¤¯ à¤à¤¾à¤²à¥€ आहे काय ते तपासा आणि बदल करा',
+'math_image_error' => 'पीà¤à¤¨à¤œà¥€ रà¥à¤ªà¤¾à¤‚तर अयशसà¥à¤µà¥€; लॅटेकà¥à¤¸, डीवà¥à¤¹à¥€à¤ªà¥à¤¸, जीà¤à¤¸à¤šà¥€ सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ योगà¥à¤¯ à¤à¤¾à¤²à¥€ आहे काय ते तपासा आणि बदल करा',
'math_bad_tmpdir' => '"गणितीय तूरà¥à¤¤ धारिके"(math temp directory)ची निरà¥à¤®à¥€à¤¤à¥€ करू शकत नाही अथवा "मॅथ तूरà¥à¤¤ धारिकेत" लिहू शकत नाही .',
'math_bad_output' => 'गणितीय पà¥à¤°à¤¾à¤ªà¥à¤¤ धारिकेची( math output directory) निरà¥à¤®à¥€à¤¤à¥€ अथवा तà¥à¤¯à¤¾à¤¤ लेखन करू शकत नाही.',
'math_notexvc' => 'texvcकरणी(texvc à¤à¤•à¥à¤à¤¿à¤•à¥à¤¯à¥‚टेबल)चूकमà¥à¤•à¤²à¥€ आहे;कृपया,सजà¥à¤œà¥€à¤¤ करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ math/README पहा.',
@@ -2373,7 +2711,7 @@ $1',
'markaspatrolleddiff' => 'टेहळणी केलà¥à¤¯à¤¾à¤šà¥€ खूण करा',
'markaspatrolledtext' => 'या पानावर गसà¥à¤¤ à¤à¤¾à¤²à¥à¤¯à¤¾à¤šà¥€ खूण करा',
'markedaspatrolled' => 'गसà¥à¤¤ केलà¥à¤¯à¤¾à¤šà¥€ खूण केली',
-'markedaspatrolledtext' => 'निवडलेले आवरà¥à¤¤à¤¨à¤¾à¤¸ गसà¥à¤¤ घातलà¥à¤¯à¤¾à¤šà¥€ खूण केली.',
+'markedaspatrolledtext' => 'निवडलेलà¥à¤¯à¤¾ [[:$1]]चà¥à¤¯à¤¾ आवरà¥à¤¤à¤¨à¤¾à¤¸ गसà¥à¤¤ घातलà¥à¤¯à¤¾à¤šà¥€ खूण केली.',
'rcpatroldisabled' => 'अलिकडील बदलची गसà¥à¤¤à¥€ अनà¥à¤ªà¤²à¤¬à¥à¤§',
'rcpatroldisabledtext' => 'सधà¥à¤¯à¤¾ ’अलिकडील बदल’ ची गसà¥à¤¤ सà¥à¤µà¤¿à¤§à¤¾ अनà¥à¤ªà¤²à¤¬à¥à¤§ केली आहे.',
'markedaspatrollederror' => 'गसà¥à¤¤à¥€à¤šà¥€ खूण करता येत नाही',
@@ -2384,6 +2722,7 @@ $1',
'patrol-log-page' => 'टेहळणीतील नोंदी',
'patrol-log-line' => '$2चे $1 $3 गसà¥à¤¤ घातलà¥à¤¯à¤¾à¤šà¥€ खूण केली',
'patrol-log-auto' => '(सà¥à¤µà¤¯à¤‚चलीत)',
+'patrol-log-diff' => 'आवरà¥à¤¤à¤¨ $1',
# Image deletion
'deletedrevision' => 'जà¥à¤¨à¥€ आवृतà¥à¤¤à¥€ ($1) वगळली.',
@@ -2401,21 +2740,26 @@ $1',
'nextdiff' => 'पà¥à¤¢à¥€à¤² संपादन →',
# Media information
-'mediawarning' => "'''सावधान''': या संचिकेत डंखी संकेत असू शकतो,जो वापरलà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¤šà¥à¤¯à¤¾ संगणक पà¥à¤°à¤£à¤¾à¤²à¥€à¤¸ नाजूक परिसà¥à¤¥à¤¿à¤¤à¥€à¤¸ सामोरे जावे लागू शकते.",
+'mediawarning' => "'''सावधान''': या संचिकेत डंखी संकेत असू शकतो, जो वापरलà¥à¤¯à¤¾à¤¨à¥‡ तà¥à¤®à¤šà¥à¤¯à¤¾ संचालन पà¥à¤°à¤£à¤¾à¤²à¥€à¤¸ नाजूक परिसà¥à¤¥à¤¿à¤¤à¥€à¤¸ सामोरे जावे लागू शकते.",
'imagemaxsize' => 'संचिका वरà¥à¤£à¤¨ पानांवरील चितà¥à¤°à¤¾à¤‚ना मरà¥à¤¯à¤¾à¤¦à¤¾ घाला:',
'thumbsize' => 'इवलासा आकार:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|पान|पाने}}',
-'file-info' => '(संचिकेचा आकार:$1,विविधामाप(माईम)पà¥à¤°à¤•à¤¾à¤°: $2)',
-'file-info-size' => '($1 × $2 pixel, संचिकेचा आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4)',
+'file-info' => 'संचिकेचा आकार:$1,विविधामापमाईमपà¥à¤°à¤•à¤¾à¤°: $2',
+'file-info-size' => '$1 × $2 pixel, संचिकेचा आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4',
'file-nohires' => '<small>यापेकà¥à¤·à¤¾ जासà¥à¤¤ मोठे चितà¥à¤° उपलबà¥à¤§ नाही.</small>',
-'svg-long-desc' => '(SVG संचिका, साधारणपणे $1 × $2 pixels, संचिकेचा आकार: $3)',
+'svg-long-desc' => 'SVG संचिका, साधारणपणे $1 × $2 pixels, संचिकेचा आकार: $3',
'show-big-image' => 'संपूरà¥à¤£ रिजोलà¥à¤¯à¥‚शन',
-'show-big-image-thumb' => '<small>या à¤à¤²à¤•à¥‡à¤šà¤¾ आकार: $1 × $2 pixels</small>',
+'show-big-image-thumb' => '<small>या à¤à¤²à¤•à¥‡à¤šà¤¾ आकार: $1 × $2 पिकà¥à¤¸à¥‡à¤²</small>',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|चौकट|चौकटी}}',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|वेळा दाखवले|वेळा दाखवले}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|चौकट|चौकटी}}',
# Special:NewFiles
'newimages' => 'नवीन संचिकांची यादी',
'imagelisttext' => "खाली '''$1''' संचिका {{PLURAL:$1|दिली आहे.|$2 कà¥à¤°à¤®à¤¾à¤¨à¥‡ दिलà¥à¤¯à¤¾ आहेत.}}",
-'newimages-summary' => 'हे विशेष पान शेवटी चढविलेलà¥à¤¯à¤¾ संचिका दरà¥à¤¶à¤µà¤¿à¤¤à¥‡',
+'newimages-summary' => 'हे विशेष पान शेवटी चढविलेलà¥à¤¯à¤¾ संचिका दरà¥à¤¶à¤µà¤¿à¤¤à¥‡.',
+'newimages-legend' => 'गाळक',
+'newimages-label' => 'संचिकानाम (किंवा तà¥à¤¯à¤¾à¤šà¤¾ भाग):',
'showhidebots' => '(सांगकामे $1)',
'noimages' => 'बघणà¥à¤¯à¤¾à¤¸à¤¾à¤°à¤–े येथे काही नाही.',
'ilsubmit' => 'शोधा',
@@ -2496,8 +2840,8 @@ $1',
'exif-isospeedratings' => 'आंतरराषà¥à¤Ÿà¥à¤°à¥€à¤¯ मानक संसà¥à¤¥à¥‡à¤šà¥‡ वेग मà¥à¤²à¥à¤¯à¤®à¤¾à¤ªà¤¨',
'exif-oecf' => 'दृकà¥à¤µà¥ˆà¤¦à¥à¤¯à¥‚तसंचरण परिवरà¥à¤¤à¤¨ कारक (ऑपà¥à¤Ÿà¥‹à¤ˆà¤²à¥‡à¤•à¥à¤Ÿà¥à¤°à¥‰à¤¨à¤¿à¤• कनà¥à¤µà¥à¤¹à¤°à¥à¤¶à¤¨ फॅकà¥à¤Ÿà¤°)',
'exif-shutterspeedvalue' => 'शटर वेग',
-'exif-aperturevalue' => 'रनà¥à¤§à¥à¤° (à¤à¤ªà¤°à¥à¤šà¤°)',
-'exif-brightnessvalue' => 'à¤à¤³à¤¾à¤³à¥€ (बà¥à¤°à¤¾à¤ˆà¤Ÿà¤ªà¤£à¤¾)',
+'exif-aperturevalue' => 'रनà¥à¤§à¥à¤°',
+'exif-brightnessvalue' => 'à¤à¤³à¤¾à¤³à¥€',
'exif-exposurebiasvalue' => 'पà¥à¤°à¤­à¤¾à¤µà¤¨ अभिनत (à¤à¤•à¥à¤¸à¤ªà¥‹à¤œà¤° बायस)',
'exif-maxaperturevalue' => 'महतà¥à¤¤à¤® जमिनी रनà¥à¤§à¥à¤°(लॅंड à¤à¤ªà¤°à¥à¤šà¤°)',
'exif-subjectdistance' => 'गोषà¥à¤Ÿà¥€à¤ªà¤¾à¤¸à¥‚नचे अंतर',
@@ -2561,6 +2905,7 @@ $1',
'exif-gpsareainformation' => 'GPS विभागाचे नाव',
'exif-gpsdatestamp' => 'GPSतारीख',
'exif-gpsdifferential' => 'GPS डिफरेंशीअल सà¥à¤§à¤¾à¤°à¤£à¤¾',
+'exif-objectname' => 'लघà¥à¤¶à¥€à¤°à¥à¤·à¤•',
# EXIF attributes
'exif-compression-1' => 'अनाकà¥à¤‚चीत',
@@ -2620,6 +2965,9 @@ $1',
'exif-lightsource-24' => 'ISO सà¥à¤Ÿà¥‚डीयो टंगसà¥à¤Ÿà¤¨',
'exif-lightsource-255' => 'इतर पà¥à¤°à¤•à¤¾à¤¶ सà¥à¤°à¥‹à¤¤',
+# Flash modes
+'exif-flash-mode-3' => 'सà¥à¤µà¤¯à¤‚चलित सà¥à¤¥à¤¿à¤¤à¥€',
+
'exif-focalplaneresolutionunit-2' => 'इंच',
'exif-sensingmethod-1' => 'अवà¥à¤¯à¤•à¥à¤¤',
@@ -2703,6 +3051,7 @@ $1',
'watchlistall2' => 'सरà¥à¤µ',
'namespacesall' => 'सरà¥à¤µ',
'monthsall' => 'सरà¥à¤µ',
+'limitall' => 'सरà¥à¤µ',
# E-mail address confirmation
'confirmemail' => 'इमेल पतà¥à¤¤à¤¾ पडताळून पहा',
@@ -2713,9 +3062,9 @@ $1',
'confirmemail_sent' => 'शाबितीकरण विपतà¥à¤° पाठवले.',
'confirmemail_oncreate' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ विपतà¥à¤° पतà¥à¤¤à¥à¤¯à¤¾à¤µà¤° निशà¥à¤šà¤¿à¤¤à¥€à¤•à¤°à¤£ कà¥à¤Ÿà¤¸à¤‚केत पाठवला होता .
हा कà¥à¤Ÿà¤¸à¤‚केत तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ खातà¥à¤¯à¤¾à¤¤ दाखल होणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ लागणार नाही,पण तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तो कोणतीही विपतà¥à¤°à¤¾à¤µà¤° अवलंबून कोणतीही सà¥à¤µà¤¿à¤§à¤¾ उपलबà¥à¤§ करून घेणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ दà¥à¤¯à¤¾à¤µà¤¾ लागेल.',
-'confirmemail_sendfailed' => 'पोच-विपतà¥à¤° पाठवू शकलो नाही.अयोगà¥à¤¯ चिनà¥à¤¹à¤¾à¤‚करिता पतà¥à¤¤à¤¾ तपासा.
+'confirmemail_sendfailed' => 'पोच-विपतà¥à¤° पाठवू शकलो नाही. अयोगà¥à¤¯ चिनà¥à¤¹à¤¾à¤‚करिता पतà¥à¤¤à¤¾ तपासा.
-मेलर वापसी: $1',
+मेलर परत आले: $1',
'confirmemail_invalid' => 'अयोगà¥à¤¯ निशà¥à¤šà¤¿à¤¤à¥€à¤•à¤°à¤£ नियमावली.नियमावली काल समापà¥à¤¤ à¤à¤¾à¤²à¤¾ असॠशकेल.',
'confirmemail_needlogin' => 'तà¥à¤®à¤šà¤¾ विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ शाबीत करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¥€ $1 करावयास हवे.',
'confirmemail_success' => 'तà¥à¤®à¤šà¤¾ विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ शाबीत à¤à¤¾à¤²à¤¾ आहे.तà¥à¤®à¥à¤¹à¥€ आता दाखल होऊ शकता आणि विकिचा आनंद घेऊ शकता.',
@@ -2739,7 +3088,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[आंतरविकि आंतरनà¥à¤¯à¤¾à¤¸ अनà¥à¤ªà¤²à¤¬à¥à¤§ केले आहे]',
'scarytranscludefailed' => '[कà¥à¤·à¤®à¤¸à¥à¤µ;$1करिताची साचा ओढी फसली]',
-'scarytranscludetoolong' => '[URL खूप लांब आहे; कà¥à¤·à¤®à¤¸à¥à¤µ]',
+'scarytranscludetoolong' => '[आंतरजालपतà¥à¤¤à¤¾ खूप लांब आहे]',
# Trackbacks
'trackbackbox' => 'या पानाकरिता मागेवळून पहा:<br />
@@ -2749,7 +3098,7 @@ $1',
'trackbackdeleteok' => 'पाठलाग यशसà¥à¤µà¥€à¤ªà¤£à¥‡ वगळला.',
# Delete conflict
-'deletedwhileediting' => 'सूचना: तà¥à¤®à¥à¤¹à¥€ संपादन सà¥à¤°à¥‚ केलà¥à¤¯à¤¾à¤¨à¤‚तर हे पान वगळले गेले आहे.',
+'deletedwhileediting' => 'â€â€™à¤¸à¥‚चना:â€â€™ तà¥à¤®à¥à¤¹à¥€ संपादन सà¥à¤°à¥‚ केलà¥à¤¯à¤¾à¤¨à¤‚तर हे पान वगळले गेले आहे.',
'confirmrecreate' => "तà¥à¤®à¥à¤¹à¥€ संपादन सà¥à¤°à¥‚ केलà¥à¤¯à¤¾à¤¨à¤‚तर सदसà¥à¤¯ [[User:$1|$1]] ([[User talk:$1|चरà¥à¤šà¤¾]])ने हे पान पà¥à¤¢à¥€à¤² कारणाने वगळले:
: ''$2''
कृपया हे पान खरेच पà¥à¤¨à¥à¤¹à¤¾ निरà¥à¤®à¥€à¤¤ करून हवे आहे का हे निशà¥à¤šà¤¿à¤¤ करा.",
@@ -2773,6 +3122,7 @@ $1',
'table_pager_first' => 'पहिले पान',
'table_pager_last' => 'शेवटचे पान',
'table_pager_limit' => 'à¤à¤•à¤¾ पानावर $1 नग दाखवा',
+'table_pager_limit_label' => 'निकाल पà¥à¤°à¤¤à¤¿à¤ªà¤¾à¤¨:',
'table_pager_limit_submit' => 'चला',
'table_pager_empty' => 'निकाल नाहीत',
@@ -2789,8 +3139,8 @@ $1',
'livepreview-error' => 'संपरà¥à¤•à¤¾à¤¤ अयशसà¥à¤µà¥€: $1 "$2".नेहमीची à¤à¤²à¤• पहा.',
# Friendlier slave lag warnings
-'lag-warn-normal' => '$1 सेकंदाचà¥à¤¯à¤¾ आतले बदल या यादी नसणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
-'lag-warn-high' => 'विदा विदादातà¥à¤¯à¤¾à¤¸ लागणारà¥â€à¤¯à¤¾ अतà¥à¤¯à¥‚चà¥à¤š कालावधी मूळे, $1 सेकंदापेकà¥à¤·à¤¾ नवे बदल या सूचीत न दाखवले जाणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
+'lag-warn-normal' => '$1 {{PLURAL:$1|सेकंदाचà¥à¤¯à¤¾|सेकंदांचà¥à¤¯à¤¾}} आतले बदल या यादी नसणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
+'lag-warn-high' => 'विदा विदादातà¥à¤¯à¤¾à¤¸ लागणारà¥â€à¤¯à¤¾ अतà¥à¤¯à¥à¤šà¥à¤š कालावधी मà¥à¤³à¥‡, $1 {{PLURAL:$1|सेकंदापेकà¥à¤·à¤¾|सेकंदांपेकà¥à¤·à¤¾}} नवे बदल या सूचीत न दाखवले जाणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
# Watchlist editor
'watchlistedit-numitems' => 'चरà¥à¤šà¤¾ पाने सोडून, {{PLURAL:$1|1 शीरà¥à¤·à¤• पान|$1 शीरà¥à¤·à¤• पाने}} तà¥à¤®à¤šà¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत आहेत.',
@@ -2825,6 +3175,7 @@ $1',
'version-specialpages' => 'विशेष पाने',
'version-parserhooks' => 'पृथकक अंकà¥à¤¶',
'version-variables' => 'चल',
+'version-skins' => 'तà¥à¤µà¤šà¤¾',
'version-other' => 'इतर',
'version-mediahandlers' => 'मिडिया हॅंडलर',
'version-hooks' => 'अंकà¥à¤¶',
@@ -2836,14 +3187,16 @@ $1',
'version-hook-subscribedby' => 'वरà¥à¤—णीदार',
'version-version' => '(आवृतà¥à¤¤à¥€ $1)',
'version-license' => 'परवाना',
+'version-poweredby-credits' => "हा विकी '''[http://www.mediawiki.org/ मीडियाविकी]'''दà¥à¤µà¤¾à¤°à¥‡ संचालित आहे, पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¿à¤¤ © २००१-$1 $2.",
+'version-poweredby-others' => 'इतर',
'version-software' => 'सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ संगणक पà¥à¤°à¤£à¤¾à¤²à¥€ (Installed software)',
'version-software-product' => 'उतà¥à¤ªà¤¾à¤¦à¤¨',
-'version-software-version' => 'आवृतà¥à¤¤à¥€(Version)',
+'version-software-version' => 'आवृतà¥à¤¤à¥€',
# Special:FilePath
'filepath' => 'संचिका मारà¥à¤—',
'filepath-page' => 'संचिका:',
-'filepath-submit' => 'मारà¥à¤—',
+'filepath-submit' => 'चला',
'filepath-summary' => 'हे विशेष पान संचिकेचा संपूरà¥à¤£ मारà¥à¤— कळवते.
चितà¥à¤°à¥‡ संपूरà¥à¤£ रिà¤à¥‹à¤²à¥à¤¯à¥‚शन मधà¥à¤¯à¥‡ दाखवली आहेत,इतर संचिका पà¥à¤°à¤•à¤¾à¤° तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ संबधीत पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤®à¤¨à¥‡ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· सà¥à¤°à¥‚ होतात.
@@ -2879,12 +3232,48 @@ $1',
'specialpages-group-redirects' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ करणारी विशेष पृषà¥à¤ à¥‡',
'specialpages-group-spam' => 'उतà¥à¤ªà¤¾à¤¤ साधने',
+# Special:BlankPage
+'blankpage' => 'रिकामे पान',
+'intentionallyblankpage' => 'हे पान मà¥à¤¦à¥à¤¦à¤¾à¤® कोरे सोडणà¥à¤¯à¤¾à¤¤ आले आहे.',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|खूण]] गाळक:',
+'tag-filter-submit' => 'गाळक',
+'tags-title' => 'खà¥à¤£à¤¾',
+'tags-tag' => 'खूण नाव',
+'tags-description-header' => 'अरà¥à¤¥à¤¾à¤šà¥€ पूरà¥à¤£ माहिती',
+'tags-hitcount-header' => 'खà¥à¤£à¤¾ केलेले बदल',
+'tags-edit' => 'संपादन करा',
+'tags-hitcount' => '$1 {{PLURAL:$1|बदल|बदल}}',
+
+# Special:ComparePages
+'comparepages' => 'पानांची तà¥à¤²à¤¨à¤¾ करा',
+'compare-selector' => 'पानांचà¥à¤¯à¤¾ आवरà¥à¤¤à¤¨à¤¾à¤‚ची तà¥à¤²à¤¨à¤¾ करा',
+'compare-page1' => 'पान १',
+'compare-page2' => 'पान २',
+'compare-rev1' => 'आवरà¥à¤¤à¤¨ १',
+'compare-rev2' => 'आवरà¥à¤¤à¤¨ २',
+'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करा',
+
# Database error messages
-'dberr-usegoogle' => 'तोपरà¥à¤¯à¤‚त गूगलवर शोधून पहा',
+'dberr-header' => 'या विकीत à¤à¤• चूक आहे',
+'dberr-problems' => 'माफ करा, हे संकेतसà¥à¤¥à¤³ सधà¥à¤¯à¤¾ तांतà¥à¤°à¤¿à¤• अडचणींना सामोरे जात आहे.',
+'dberr-again' => 'थोडा वेळ थांबून पà¥à¤¨à¥à¤¹à¤¾ पहा.',
+'dberr-usegoogle' => 'तोपरà¥à¤¯à¤‚त गूगलवर शोधून पहा',
+'dberr-cachederror' => 'ही मागवलेलà¥à¤¯à¤¾ पानाची सयीतील पà¥à¤°à¤¤ आहे, ती अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ नसणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
# HTML forms
-'htmlform-invalid-input' => 'तà¥à¤®à¥à¤¹à¥€ दिलेलà¥à¤¯à¤¾ माहितीत काहीतरी गडबड आहे',
-'htmlform-int-toolow' => '$1 किंवा मोठा आकडा दà¥à¤¯à¤¾.',
-'htmlform-int-toohigh' => '$1 किंवा तà¥à¤¯à¤¾à¤¹à¥‚न छोटा आकडा दà¥à¤¯à¤¾.',
+'htmlform-invalid-input' => 'तà¥à¤®à¥à¤¹à¥€ दिलेलà¥à¤¯à¤¾ माहितीत काहीतरी गडबड आहे',
+'htmlform-float-invalid' => 'तà¥à¤®à¥à¤¹à¥€ दिलेली किंमत आकडा नाही.',
+'htmlform-int-toolow' => '$1 किंवा मोठा आकडा दà¥à¤¯à¤¾.',
+'htmlform-int-toohigh' => '$1 किंवा तà¥à¤¯à¤¾à¤¹à¥‚न छोटा आकडा दà¥à¤¯à¤¾.',
+'htmlform-required' => 'ही किंमत आवशà¥à¤¯à¤• आहे',
+'htmlform-submit' => 'पाठवा',
+'htmlform-reset' => 'बदल उलटवा',
+'htmlform-selectorother-other' => 'इतर',
+
+# SQLite database support
+'sqlite-has-fts' => 'पूरà¥à¤£-मजकूर शोध समरà¥à¤¥à¤¨à¤¾à¤¸à¤¹à¤¿à¤¤ $1',
+'sqlite-no-fts' => 'पूरà¥à¤£-मजकूर शोध समरà¥à¤¥à¤¨à¤¾à¤µà¤¿à¤°à¤¹à¤¿à¤¤ $1',
);
diff --git a/languages/messages/MessagesMrj.php b/languages/messages/MessagesMrj.php
index 9ba6f954..980199a3 100644
--- a/languages/messages/MessagesMrj.php
+++ b/languages/messages/MessagesMrj.php
@@ -8,6 +8,7 @@
* @file
*
* @author Amdf
+ * @author Andrijko Z.
*/
$fallback = 'ru';
@@ -17,18 +18,27 @@ $namespaceNames = array(
NS_SPECIAL => 'Спецӹлӹштӓш',
NS_TALK => 'Кӓнгӓшӹмӓш',
NS_USER => 'Сирӹшӹ',
- NS_USER_TALK => 'Сирӹшӹн кӓнгӓшӹмӓшӹжӹ',
- NS_PROJECT_TALK => '$1 кӓнгӓшӹмӓш',
+ NS_USER_TALK => 'Сирӹшӹм_кӓнгӓшӹмӓш',
+ NS_PROJECT_TALK => '$1_кӓнгӓшӹмӓш',
NS_FILE => 'Файл',
- NS_FILE_TALK => 'Файл кӓнгӓшӹмӓш',
+ NS_FILE_TALK => 'Файлым_кӓнгӓшӹмӓш',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki кӓнгӓшӹмӓш',
+ NS_MEDIAWIKI_TALK => 'MediaWiki-м_кӓнгӓшӹмӓш',
NS_TEMPLATE => 'Шаблон',
- NS_TEMPLATE_TALK => 'Шаблон кӓнгӓшӹмӓш',
+ NS_TEMPLATE_TALK => 'Шаблоным_кӓнгӓшӹмӓш',
NS_HELP => 'Палшык',
- NS_HELP_TALK => 'Палшыкын кӓнгӓшӹмӓш',
+ NS_HELP_TALK => 'Палшыкым_кӓнгӓшӹмӓш',
NS_CATEGORY => 'Категори',
- NS_CATEGORY_TALK => 'Категори кӓнгӓшӹмӓш',
+ NS_CATEGORY_TALK => 'Категорим_кӓнгӓшӹмӓш',
+);
+
+$namespaceAliases = array(
+ 'Сирӹшӹн_кӓнгӓшӹмӓшӹжӹ' => NS_USER_TALK,
+ 'Файл_кӓнгӓшӹмӓш' => NS_FILE_TALK,
+ 'MediaWiki_кӓнгӓшӹмӓш' => NS_MEDIAWIKI_TALK,
+ 'Шаблон_кӓнгӓшӹмӓш' => NS_TEMPLATE_TALK,
+ 'Палшыкын_кӓнгӓшӹмӓш' => NS_HELP_TALK,
+ 'Категори_кӓнгӓшӹмӓш' => NS_CATEGORY_TALK,
);
$messages = array(
@@ -47,8 +57,7 @@ $messages = array(
'tog-editsection' => '«Тӧрлӓш» ажедмӓшӹм м цилӓ Ñекцилӓнок анжыкташ',
'tog-editsectiononrightclick' => 'Секцим тӧрлӹмӹ годым артикль лӹмӹм ÐºÐ°Ð»Ñ Ð´Ð¾Ð½Ð¾ вургымлашты темдӓлӓш (JavaScript)',
'tog-showtoc' => 'Кӧргӹштӹш лӹмвлӓм анжыкташ (3 гӹц шукырак артикль лӹмӓн ӹлӹштӓшвлӓштӹ)',
-'tog-rememberpassword' => 'Мӹньӹн шотыш нäлмӹ Ñирмäшем ти компьютерӹштӹ äштäш',
-'tog-editwidth' => 'Тöрлӹмӹ паштек цилä Ñкран кымдык',
+'tog-rememberpassword' => 'Мӹньӹн шотыш нӓлмӹ Ñирмӓшем ти компьютерӹштӹ ӓштӓш (макÑимум $1 {{PLURAL:$1|кечы|кечы}})',
'tog-watchcreations' => 'Мӹньӹн ӹштӹмӹ ӹлӹштӓшвлӓÑм вӓнгӹмӹ ÑпиÑокыш пырташ',
'tog-watchdefault' => 'Мӹньӹн вашталтымы ӹлӹштӓшвлӓÑм вӓнгӹмӹ ÑпиÑокыш пырташ',
'tog-watchmoves' => 'Мӹньӹн лӹмӹм вашталтымы ӹлӹштӓшвлӓÑм вӓнгӹмӹ ÑпиÑокыш пырташ',
@@ -259,7 +268,7 @@ $messages = array(
# Login and logout pages
'yourname' => 'Сирӹшӹн лӹмжӹ:',
'yourpassword' => 'Пароль:',
-'remembermypassword' => 'Ти компьютерӹштӹ мӹньӹн учетный Ñирмӓшем ӓштӓш',
+'remembermypassword' => 'Ти компьютерӹштӹ мӹньӹн учетный Ñирмӓшем ӓштӓш (макÑимум $1 {{PLURAL:$1|кечы|кечы}})',
'login' => 'СиÑтемыш Ñирӓлтдӓ',
'nav-login-createaccount' => 'Коргӹшкӹ Ñирӓлтдӓ/региÑтрируÑлтда',
'userlogin' => 'Кӧргӹшкӹ Ñирӓлтдӓ ӓль региÑтрируÑлтда',
@@ -487,7 +496,6 @@ $messages = array(
# Watchlist
'watchlist' => 'Вӓнгӹмӹ ÑпиÑок',
'mywatchlist' => 'Вӓнгӹмӹ Ñирмӓш, ÑпиÑок',
-'watchlistfor' => "(Ñирӹшӹн '''$1''')",
'addedwatch' => 'Вӓнгӹмӓш ÑпиÑокыш пыртымы',
'addedwatchtext' => 'Ӹлӹштӓшӹм«[[:$1]]» тӓмдӓн вӓнгӹмӹ [[Special:Watchlist|ӹлӹштӓшӹшкӹдӓ пыртымы]]. Тидӹ паштек ӹштӹмӹ ӹлӹштӓшӹн вашталтымашвлӓ ти ÑпиÑокышты анжыктымы дӓ тенгеок кӹжгӹ буквавлӓ доно у вашталтымашвлӓн ÑпиÑокышты пӓлдӹртӹмӹ лиÑш[[Special:RecentChanges| пӓлдӹртӹмӹ лит]] нӹнӹм айыраш куштылгырак лижӹ манын.',
'removedwatch' => 'Вӓнгӹмӹ ÑпиÑок гӹц карангдымы',
@@ -684,9 +692,9 @@ $messages = array(
'nextdiff' => 'Ð’ÐµÑ Ñ‚Ó§Ñ€Ð»Ó¹Ð¼Ó“Ñˆ →',
# Media information
-'file-info-size' => '($1 × $2 пикÑел, файлын размержӹ: $3, MIME-тип: $4)',
+'file-info-size' => '$1 × $2 пикÑел, файлын размержӹ: $3, MIME-тип: $4',
'file-nohires' => '<small>Кого разрешени доно верÑи уке.</small>',
-'svg-long-desc' => '(SVG-файл, номинально $1 × $2 пикÑель, файлын размержӹ: $3)',
+'svg-long-desc' => 'SVG-файл, номинально $1 × $2 пикÑель, файлын размержӹ: $3',
'show-big-image' => 'Кӱкшӹрӓк разрешениӓн изображени',
'show-big-image-thumb' => '<small>Размер анзыц анжымы годым: $1 × $2 пикÑель</small>',
diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php
index 3bda87fa..6f741d54 100644
--- a/languages/messages/MessagesMs.php
+++ b/languages/messages/MessagesMs.php
@@ -12,6 +12,7 @@
* @author Aviator
* @author CoolCityCat
* @author Diagramma Della Verita
+ * @author Hydra
* @author Izzudin
* @author Kurniasan
* @author Meno25
@@ -67,90 +68,92 @@ $namespaceAliases = array(
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Lencongan berganda', 'Pelencongan berganda' ),
- 'BrokenRedirects' => array( 'Lencongan rosak', 'Pelencongan rosak' ),
+ 'DoubleRedirects' => array( 'Lencongan_berganda', 'Pelencongan_berganda' ),
+ 'BrokenRedirects' => array( 'Lencongan_rosak', 'Pelencongan_rosak' ),
'Disambiguations' => array( 'Penyahtaksaan' ),
- 'Userlogin' => array( 'Log masuk' ),
- 'Userlogout' => array( 'Log keluar' ),
- 'CreateAccount' => array( 'Buka akaun' ),
+ 'Userlogin' => array( 'Log_masuk' ),
+ 'Userlogout' => array( 'Log_keluar' ),
+ 'CreateAccount' => array( 'Buka_akaun' ),
'Preferences' => array( 'Keutamaan' ),
- 'Watchlist' => array( 'Senarai pantau' ),
- 'Recentchanges' => array( 'Perubahan terkini' ),
- 'Upload' => array( 'Muat naik' ),
- 'Listfiles' => array( 'Senarai imej' ),
- 'Newimages' => array( 'Imej baru' ),
- 'Listusers' => array( 'Senarai pengguna' ),
- 'Listgrouprights' => array( 'Senarai hak kumpulan' ),
+ 'Watchlist' => array( 'Senarai_pantau' ),
+ 'Recentchanges' => array( 'Perubahan_terkini' ),
+ 'Upload' => array( 'Muat_naik' ),
+ 'Listfiles' => array( 'Senarai_imej' ),
+ 'Newimages' => array( 'Imej_baru' ),
+ 'Listusers' => array( 'Senarai_pengguna' ),
+ 'Listgrouprights' => array( 'Senarai_hak_kumpulan' ),
'Statistics' => array( 'Statistik' ),
- 'Randompage' => array( 'Laman rawak' ),
- 'Lonelypages' => array( 'Laman yatim' ),
- 'Uncategorizedpages' => array( 'Laman tanpa kategori' ),
- 'Uncategorizedcategories' => array( 'Kategori tanpa kategori' ),
- 'Uncategorizedimages' => array( 'Imej tanpa kategori' ),
- 'Uncategorizedtemplates' => array( 'Templat tanpa kategori' ),
- 'Unusedcategories' => array( 'Kategori tak digunakan' ),
- 'Unusedimages' => array( 'Imej tak digunakan' ),
- 'Wantedpages' => array( 'Laman dikehendaki' ),
- 'Wantedcategories' => array( 'Kategori dikehendaki' ),
- 'Wantedfiles' => array( 'Fail dikehendaki' ),
- 'Wantedtemplates' => array( 'Templat dikehendaki' ),
- 'Mostlinked' => array( 'Laman dipaut terbanyak' ),
- 'Mostlinkedcategories' => array( 'Kategori dipaut terbanyak' ),
- 'Mostlinkedtemplates' => array( 'Templat dipaut terbanyak' ),
- 'Mostimages' => array( 'Imej terbanyak' ),
- 'Mostcategories' => array( 'Kategori terbanyak' ),
- 'Mostrevisions' => array( 'Semakan terbanyak' ),
- 'Fewestrevisions' => array( 'Semakan tersikit' ),
- 'Shortpages' => array( 'Laman pendek' ),
- 'Longpages' => array( 'Laman panjang' ),
- 'Newpages' => array( 'Laman baru' ),
- 'Ancientpages' => array( 'Laman lapuk' ),
- 'Deadendpages' => array( 'Laman buntu' ),
- 'Protectedpages' => array( 'Laman dilindungi' ),
- 'Protectedtitles' => array( 'Tajuk dilindungi' ),
- 'Allpages' => array( 'Semua laman' ),
- 'Prefixindex' => array( 'Indeks awalan' ),
- 'Ipblocklist' => array( 'Sekatan IP' ),
- 'Specialpages' => array( 'Laman khas' ),
+ 'Randompage' => array( 'Laman_rawak' ),
+ 'Lonelypages' => array( 'Laman_yatim' ),
+ 'Uncategorizedpages' => array( 'Laman_tanpa_kategori' ),
+ 'Uncategorizedcategories' => array( 'Kategori_tanpa_kategori' ),
+ 'Uncategorizedimages' => array( 'Imej_tanpa_kategori' ),
+ 'Uncategorizedtemplates' => array( 'Templat_tanpa_kategori' ),
+ 'Unusedcategories' => array( 'Kategori_tak_digunakan' ),
+ 'Unusedimages' => array( 'Imej_tak_digunakan' ),
+ 'Wantedpages' => array( 'Laman_dikehendaki' ),
+ 'Wantedcategories' => array( 'Kategori_dikehendaki' ),
+ 'Wantedfiles' => array( 'Fail_dikehendaki' ),
+ 'Wantedtemplates' => array( 'Templat_dikehendaki' ),
+ 'Mostlinked' => array( 'Laman_dipaut_terbanyak' ),
+ 'Mostlinkedcategories' => array( 'Kategori_dipaut_terbanyak' ),
+ 'Mostlinkedtemplates' => array( 'Templat_dipaut_terbanyak' ),
+ 'Mostimages' => array( 'Imej_terbanyak' ),
+ 'Mostcategories' => array( 'Kategori_terbanyak' ),
+ 'Mostrevisions' => array( 'Semakan_terbanyak' ),
+ 'Fewestrevisions' => array( 'Semakan_tersikit' ),
+ 'Shortpages' => array( 'Laman_pendek' ),
+ 'Longpages' => array( 'Laman_panjang' ),
+ 'Newpages' => array( 'Laman_baru' ),
+ 'Ancientpages' => array( 'Laman_lapuk' ),
+ 'Deadendpages' => array( 'Laman_buntu' ),
+ 'Protectedpages' => array( 'Laman_dilindungi' ),
+ 'Protectedtitles' => array( 'Tajuk_dilindungi' ),
+ 'Allpages' => array( 'Semua_laman' ),
+ 'Prefixindex' => array( 'Indeks_awalan' ),
+ 'Ipblocklist' => array( 'Sekatan_IP' ),
+ 'Specialpages' => array( 'Laman_khas' ),
'Contributions' => array( 'Sumbangan' ),
- 'Emailuser' => array( 'E-mel pengguna' ),
- 'Confirmemail' => array( 'Sahkan e-mel' ),
- 'Whatlinkshere' => array( 'Pautan ke' ),
- 'Recentchangeslinked' => array( 'Perubahan berkaitan' ),
- 'Movepage' => array( 'Pindah laman' ),
- 'Blockme' => array( 'Sekat saya' ),
- 'Booksources' => array( 'Sumber buku' ),
+ 'Emailuser' => array( 'E-mel_pengguna' ),
+ 'Confirmemail' => array( 'Sahkan_e-mel' ),
+ 'Whatlinkshere' => array( 'Pautan_ke' ),
+ 'Recentchangeslinked' => array( 'Perubahan_berkaitan' ),
+ 'Movepage' => array( 'Pindah_laman' ),
+ 'Blockme' => array( 'Sekat_saya' ),
+ 'Booksources' => array( 'Sumber_buku' ),
'Categories' => array( 'Kategori' ),
'Export' => array( 'Eksport' ),
'Version' => array( 'Versi' ),
- 'Allmessages' => array( 'Semua pesanan', 'Semua mesej' ),
- 'Blockip' => array( 'Sekat IP' ),
+ 'Allmessages' => array( 'Semua_pesanan', 'Semua_mesej' ),
+ 'Blockip' => array( 'Sekat_IP' ),
'Undelete' => array( 'Nyahhapus' ),
- 'Lockdb' => array( 'Kunci pangkalan data' ),
- 'Unlockdb' => array( 'Buka kunci pangkalan data' ),
- 'Userrights' => array( 'Hak pengguna' ),
- 'MIMEsearch' => array( 'Gelintar MIME' ),
- 'FileDuplicateSearch' => array( 'Cari fail berganda' ),
- 'Unwatchedpages' => array( 'Laman tak dipantau' ),
- 'Listredirects' => array( 'Senarai lencongan', 'Senarai pelencongan' ),
- 'Revisiondelete' => array( 'Hapus semakan' ),
- 'Unusedtemplates' => array( 'Templat tak digunakan' ),
- 'Randomredirect' => array( 'Lencongan rawak', 'Pelencongan rawak' ),
- 'Mypage' => array( 'Laman saya' ),
- 'Mytalk' => array( 'Perbincangan saya' ),
- 'Mycontributions' => array( 'Sumbangan saya' ),
- 'Listadmins' => array( 'Senarai pentadbir' ),
- 'Listbots' => array( 'Senarai bot' ),
- 'Popularpages' => array( 'Laman popular' ),
+ 'Lockdb' => array( 'Kunci_pangkalan_data' ),
+ 'Unlockdb' => array( 'Buka_kunci_pangkalan_data' ),
+ 'Userrights' => array( 'Hak_pengguna' ),
+ 'MIMEsearch' => array( 'Gelintar_MIME' ),
+ 'FileDuplicateSearch' => array( 'Cari_fail_berganda' ),
+ 'Unwatchedpages' => array( 'Laman_tak_dipantau' ),
+ 'Listredirects' => array( 'Senarai_lencongan', 'Senarai_pelencongan' ),
+ 'Revisiondelete' => array( 'Hapus_semakan' ),
+ 'Unusedtemplates' => array( 'Templat_tak_digunakan' ),
+ 'Randomredirect' => array( 'Lencongan_rawak', 'Pelencongan_rawak' ),
+ 'Mypage' => array( 'Laman_saya' ),
+ 'Mytalk' => array( 'Perbincangan_saya' ),
+ 'Mycontributions' => array( 'Sumbangan_saya' ),
+ 'Listadmins' => array( 'Senarai_pentadbir' ),
+ 'Listbots' => array( 'Senarai_bot' ),
+ 'Popularpages' => array( 'Laman_popular' ),
'Search' => array( 'Gelintar' ),
- 'Resetpass' => array( 'Lupa kata laluan' ),
- 'Withoutinterwiki' => array( 'Laman tanpa pautan bahasa' ),
- 'MergeHistory' => array( 'Gabung sejarah' ),
- 'Filepath' => array( 'Laluan fail' ),
- 'Invalidateemail' => array( 'Batalkan pengesahan e-mel' ),
- 'Blankpage' => array( 'Laman kosong' ),
- 'LinkSearch' => array( 'Cari pautan' ),
- 'DeletedContributions' => array( 'Sumbangan dihapuskan' ),
+ 'Resetpass' => array( 'Lupa_kata_laluan' ),
+ 'Withoutinterwiki' => array( 'Laman_tanpa_pautan_bahasa' ),
+ 'MergeHistory' => array( 'Gabung_sejarah' ),
+ 'Filepath' => array( 'Laluan_fail' ),
+ 'Invalidateemail' => array( 'Batalkan_pengesahan_e-mel' ),
+ 'Blankpage' => array( 'Laman_kosong' ),
+ 'LinkSearch' => array( 'Cari_pautan' ),
+ 'DeletedContributions' => array( 'Sumbangan_dihapuskan' ),
+ 'Tags' => array( 'Label' ),
+ 'Activeusers' => array( 'Pengguna_aktif' ),
);
$messages = array(
@@ -169,8 +172,7 @@ $messages = array(
'tog-editsection' => 'Bolehkan penyuntingan bahagian melalui pautan [sunting]',
'tog-editsectiononrightclick' => 'Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian (JavaScript)',
'tog-showtoc' => 'Tunjukkan isi kandungan (bagi rencana yang melebihi 3 tajuk)',
-'tog-rememberpassword' => 'Ingat status log masuk saya pada komputer ini',
-'tog-editwidth' => 'Besarkan kotak sunting ke seluruh skrin',
+'tog-rememberpassword' => 'Ingat log masuk saya di pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
'tog-watchcreations' => 'Tambahkan laman yang saya cipta ke dalam senarai pantau',
'tog-watchdefault' => 'Tambahkan laman yang saya sunting ke dalam senarai pantau',
'tog-watchmoves' => 'Tambahkan laman yang saya pindahkan ke dalam senarai pantau',
@@ -317,31 +319,21 @@ $messages = array(
'faqpage' => 'Project:Soalan Lazim',
# Vector skin
-'vector-action-addsection' => 'Buka topik',
-'vector-action-delete' => 'Hapuskan',
-'vector-action-move' => 'Pindahkan',
-'vector-action-protect' => 'Lindungi',
-'vector-action-undelete' => 'Batal hapus',
-'vector-action-unprotect' => 'Nyahlindung',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Laman bantuan',
-'vector-namespace-image' => 'Fail',
-'vector-namespace-main' => 'Laman',
-'vector-namespace-media' => 'Laman media',
-'vector-namespace-mediawiki' => 'Pesanan',
-'vector-namespace-project' => 'Laman projek',
-'vector-namespace-special' => 'Laman khas',
-'vector-namespace-talk' => 'Bincang',
-'vector-namespace-template' => 'Templat',
-'vector-namespace-user' => 'Laman pengguna',
-'vector-view-create' => 'Cipta',
-'vector-view-edit' => 'Sunting',
-'vector-view-history' => 'Lihat sejarah',
-'vector-view-view' => 'Baca',
-'vector-view-viewsource' => 'Lihat sumber',
-'actions' => 'Tindakan',
-'namespaces' => 'Ruang nama',
-'variants' => 'Kelainan',
+'vector-action-addsection' => 'Buka topik',
+'vector-action-delete' => 'Hapuskan',
+'vector-action-move' => 'Pindahkan',
+'vector-action-protect' => 'Lindungi',
+'vector-action-undelete' => 'Batal hapus',
+'vector-action-unprotect' => 'Nyahlindung',
+'vector-simplesearch-preference' => 'Bolehkan cadangan carian lanjutan (kulit Vector sahaja)',
+'vector-view-create' => 'Cipta',
+'vector-view-edit' => 'Sunting',
+'vector-view-history' => 'Lihat sejarah',
+'vector-view-view' => 'Baca',
+'vector-view-viewsource' => 'Lihat sumber',
+'actions' => 'Tindakan',
+'namespaces' => 'Ruang nama',
+'variants' => 'Kelainan',
'errorpagetitle' => 'Ralat',
'returnto' => 'Kembali ke $1.',
@@ -402,6 +394,9 @@ Terlalu ramai pengguna cuba melihat laman ini.
Sila tunggu sebentar sebelum cuba mencapai laman ini lagi.
$1',
+'pool-timeout' => 'Menunggu sebentar untuk dikunci',
+'pool-queuefull' => 'Giliran kolam telah penuh',
+'pool-errorunknown' => 'Ralat tak diketahui',
# 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' => 'Perihal {{SITENAME}}',
@@ -561,7 +556,8 @@ Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutam
'yourname' => 'Nama pengguna:',
'yourpassword' => 'Kata laluan:',
'yourpasswordagain' => 'Ulangi kata laluan:',
-'remembermypassword' => 'Ingat log masuk saya di komputer ini',
+'remembermypassword' => 'Ingat log masuk saya pada pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
+'securelogin-stick-https' => 'Kekal disambungkan ke HTTPS selepas log masuk',
'yourdomainname' => 'Domain anda:',
'externaldberror' => 'Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.',
'login' => 'Log masuk',
@@ -578,6 +574,7 @@ Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutam
'gotaccount' => "Sudah mempunyai akaun? '''$1'''.",
'gotaccountlink' => 'Log masuk',
'createaccountmail' => 'melalui e-mel',
+'createaccountreason' => 'Sebab:',
'badretype' => 'Sila ulangi kata laluan dengan betul.',
'userexists' => 'Nama pengguna yang anda masukkan telah pun digunakan. Sila pilih nama yang lain.',
'loginerror' => 'Ralat log masuk',
@@ -595,6 +592,7 @@ Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutam
'wrongpasswordempty' => 'Kata laluan yang dimasukkan adalah kosong. Sila cuba lagi.',
'passwordtooshort' => 'Kata laluan mestilah sekurang-kurangnya {{PLURAL:$1|1 aksara|$1 aksara}}.',
'password-name-match' => 'Kata laluan anda mesti berbeza daripada nama pengguna anda.',
+'password-login-forbidden' => 'Penggunaan nama pengguna dan kata laluan ini adalah dilarang.',
'mailmypassword' => 'E-melkan kata laluan baru',
'passwordremindertitle' => 'Pengingat kata laluan daripada {{SITENAME}}',
'passwordremindertext' => 'Seseorang (mungkin anda, dari alamat IP $1) telah meminta kata laluan baru untuk {{SITENAME}} ($4). Kata laluan sementara baru untuk pengguna "$2" ialah "$3". Untuk menamatkan prosedur ini, anda perlu log masuk dan tetapkan kata laluan yang baru dengan segera. Kata laluan sementara anda akan luput dalam $5 hari.
@@ -636,6 +634,9 @@ Sila tunggu sebentar dan cuba lagi.',
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
+
# Password reset dialog
'resetpass' => 'Tukar kata laluan',
'resetpass_announce' => 'Anda sedang log masuk dengan kata laluan sementara. Untuk log masuk dengan sempurna, sila tetapkan kata laluan baru di sini:',
@@ -687,9 +688,10 @@ Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan
'showlivepreview' => 'Pratonton langsung',
'showdiff' => 'Lihat perubahan',
'anoneditwarning' => "'''Amaran:''' Anda tidak log masuk. Alamat IP anda akan direkodkan dalam sejarah suntingan laman ini.",
+'anonpreviewwarning' => "''Anda belum log masuk. Jika anda menyimpan laman ini, alamat IP anda akan direkodkan dalam sejarah penyuntingan laman ini.''",
'missingsummary' => "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
'missingcommenttext' => 'Sila masukkan komen dalam ruangan di bawah.',
-'missingcommentheader' => "'''Peringatan:''' Anda tidak menyatakan tajuk bagi komen ini. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa tajuk.",
+'missingcommentheader' => "'''Peringatan:''' Anda tidak menyatakan tajuk bagi komen ini. Klik '''{{int:savearticle}}''' sekali lagi untuk menyimpan suntingan ini tanpa tajuk.",
'summary-preview' => 'Pratonton ringkasan:',
'subject-preview' => 'Pratonton tajuk:',
'blockedtitle' => 'Pengguna disekat',
@@ -762,7 +764,11 @@ Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
'userjsyoucanpreview' => "'''Petua:''' Gunakan butang \"{{int:showpreview}}\" untuk menguji JavaScript baru anda sebelum menyimpan.",
'usercsspreview' => "'''Ingat bahawa anda hanya sedang melihat pratonton CSS peribadi anda. Laman ini belum lagi disimpan!'''",
'userjspreview' => "'''Ingat bahawa anda hanya menguji/melihat pratonton JavaScript anda, ia belum lagi disimpan!'''",
-'userinvalidcssjstitle' => "'''Amaran:''' Rupa \"\$1\" tidak wujud. Ingat bahawa laman tempahan .css dan .js menggunakan tajuk berhuruf kecil, contohnya {{ns:user}}:Anu/monobook.css tidak sama dengan {{ns:user}}:Anu/Monobook.css.",
+'sitecsspreview' => "'''Ingat bahawa anda cuma melihat pratonton CSS ini.'''
+'''Ia belum lagi disimpan!'''",
+'sitejspreview' => "'''Ingat bahawa anda cuma melihat pratonton kod JavaScript ini.'''
+'''Ia belum lagi disimpan!'''",
+'userinvalidcssjstitle' => "'''Amaran:''' Rupa \"\$1\" tidak wujud. Ingat bahawa laman tempahan .css dan .js menggunakan tajuk berhuruf kecil, contohnya {{ns:user}}:Anu/vector.css tidak sama dengan {{ns:user}}:Anu/Vector.css.",
'updated' => '(Dikemaskinikan)',
'note' => "'''Catatan:'''",
'previewnote' => "'''Ini hanyalah pratonton. Perubahan masih belum disimpan!'''",
@@ -799,9 +805,6 @@ Anda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau disal
Anda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau
disalin daripada domain awam atau mana-mana sumber bebas lain (lihat $1 untuk butiran lanjut).
'''JANGAN KIRIM KARYA HAK CIPTA ORANG LAIN TANPA KEBENARAN!'''",
-'longpagewarning' => "'''AMARAN: Panjang laman ini ialah $1 kilobait.
-Terdapat beberapa pelayar web yang mempunyai masalah jika digunakan untuk menyunting laman yang menghampiri ataupun melebihi 32 kB.
-Sila bahagikan rencana ini, jika boleh.'''",
'longpageerror' => "'''RALAT: Panjang teks yang dikirim ialah $1 kilobait,
melebihi had maksimum $2 kilobait. Ia tidak boleh disimpan.'''",
'readonlywarning' => "'''AMARAN: Pangkalan data telah dikunci untuk penyenggaraan. Justeru, anda tidak boleh menyimpan suntingan anda pada masa sekarang.
@@ -975,6 +978,8 @@ $1",
'logdelete-failure' => "'''Log nampak tidak dapat diset:'''
$1",
'revdel-restore' => 'Tukar kebolehnampakan',
+'revdel-restore-deleted' => 'semakan dihapuskan',
+'revdel-restore-visible' => 'semakan nampak',
'pagehist' => 'Sejarah laman',
'deletedhist' => 'Sejarah yang dihapuskan',
'revdelete-content' => 'kandungan',
@@ -1045,11 +1050,13 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
# Diffs
'history-title' => 'Sejarah semakan bagi "$1"',
'difference' => '(Perbezaan antara semakan)',
+'difference-multipage' => '(Perbezaan antara laman)',
'lineno' => 'Baris $1:',
'compareselectedversions' => 'Bandingkan versi-versi yang dipilih',
'showhideselectedversions' => 'Tunjukkan/sorokkan versi yang dipilih',
'editundo' => 'batal',
-'diff-multi' => '({{PLURAL:$1|Satu|$1}} semakan pertengahan tidak ditunjukkan.)',
+'diff-multi' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
+'diff-multi-manyusers' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh lebih daripada $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
# Search results
'searchresults' => 'Hasil carian',
@@ -1084,6 +1091,7 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
'searchprofile-everything-tooltip' => 'Cari semua kandungan (termasuk laman perbincangan)',
'searchprofile-advanced-tooltip' => 'Cari dalam ruang nama yang tersuai',
'search-result-size' => '$1 ({{PLURAL:$2|$2 patah perkataan}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|ahli|ahli}} ($2 {{PLURAL:$2|subkategori|subkategori}}, $3 {{PLURAL:$3|fail|fail}})',
'search-result-score' => 'Kaitan: $1%',
'search-redirect' => '(pelencongan $1)',
'search-section' => '(bahagian $1)',
@@ -1159,6 +1167,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
'contextlines' => 'Bilangan baris untuk dipaparkan bagi setiap capaian:',
'contextchars' => 'Bilangan askara konteks bagi setiap baris:',
'stub-threshold' => 'Ambang bagi pemformatan <a href="#" class="stub">pautan ke rencana ringkas</a> (bait):',
+'stub-threshold-disabled' => 'Dimatikan',
'recentchangesdays' => 'Bilangan hari dalam perubahan terkini:',
'recentchangesdays-max' => '(had $1 hari)',
'recentchangescount' => 'Bilangan suntingan yang dipaparkan mengikut tetapan tersedia:',
@@ -1192,6 +1201,7 @@ Di sini ada nilai yang dihasilkan secara rawak yang boleh anda guna: $1',
'prefs-files' => 'Fail',
'prefs-custom-css' => 'CSS tempahan',
'prefs-custom-js' => 'JS tempahan',
+'prefs-common-css-js' => 'CSS/JavaScript kongsi untuk semua rupa:',
'prefs-reset-intro' => 'Anda boleh menggunakan laman ini untuk menetapkan semula keutamaan anda kepada tetapan sediakala (sewaktu anda mulai menjadi ahli) tapak ini.
Tindakan ini tidak boleh dibatalkan.',
'prefs-emailconfirm-label' => 'Pengesahan e-mail:',
@@ -1227,9 +1237,15 @@ Tindakan ini tidak boleh dibatalkan.',
'prefs-advancedrendering' => 'Pilihan maju',
'prefs-advancedsearchoptions' => 'Pilihan maju',
'prefs-advancedwatchlist' => 'Pilihan maju',
-'prefs-display' => 'Papar pilihan',
+'prefs-displayrc' => 'Papar pilihan',
+'prefs-displaysearchoptions' => 'Papar pilihan',
+'prefs-displaywatchlist' => 'Papar pilihan',
'prefs-diffs' => 'Beza',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Alamat e-mel adalah sah',
+'email-address-validity-invalid' => 'Sila masukkan alamat e-mel yang sah',
+
# User rights
'userrights' => 'Pengurusan hak pengguna',
'userrights-lookup-user' => 'Urus kumpulan pengguna',
@@ -1313,6 +1329,7 @@ Tindakan ini tidak boleh dibatalkan.',
'right-hideuser' => 'Menyekat sesebuah nama pengguna, menyembunyikannya daripada orang ramai',
'right-ipblock-exempt' => 'Melangkau sekatan IP, sekatan automatik dan sekatan julat',
'right-proxyunbannable' => 'Melangkau sekatan proksi automatik',
+'right-unblockself' => 'Menyahsekat diri sendiri',
'right-protect' => 'Menukar peringkat perlindungan dan menyunting laman yang dilindungi',
'right-editprotected' => 'Menyunting laman yang dilindungi (tanpa perlindungan melata)',
'right-editinterface' => 'Menyunting antara muka pengguna',
@@ -1335,7 +1352,6 @@ Tindakan ini tidak boleh dibatalkan.',
'right-siteadmin' => 'Mengunci dan membuka kunci pangkalan data',
'right-reset-passwords' => 'Mengeset semula kata laluan pengguna lain',
'right-override-export-depth' => 'Eksport laman termasuk laman dipaut sehingga kedalaman 5',
-'right-versiondetail' => 'Papar sambungan maklumat versi perisian',
'right-sendemail' => 'Kirim e-mel kepada pengguna-pengguna lain',
# User rights log
@@ -1386,14 +1402,9 @@ Tindakan ini tidak boleh dibatalkan.',
'recentchanges-legend' => 'Pilihan perubahan terkini',
'recentchangestext' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada laman ini.',
'recentchanges-feed-description' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada suapan ini.',
-'recentchanges-label-legend' => 'Petunjuk: $1.',
-'recentchanges-legend-newpage' => '$1 - laman baru',
'recentchanges-label-newpage' => 'Suntingan ini mencipta laman baru',
-'recentchanges-legend-minor' => '$1 - suntingan kecil',
'recentchanges-label-minor' => 'Ini ialah suntingan kecil',
-'recentchanges-legend-bot' => '$1 - suntingan bot',
'recentchanges-label-bot' => 'Suntingan ini dilakukan oleh bot',
-'recentchanges-legend-unpatrolled' => '$1 - suntingan belum dirondai',
'recentchanges-label-unpatrolled' => 'Suntingan ini belum dirondai',
'rcnote' => "Yang berikut ialah '''$1''' perubahan terakhir sejak '''$2''' hari yang lalu sehingga $5, $4.",
'rcnotefrom' => 'Yang berikut ialah semua perubahan sejak <b>$2</b> (sehingga <b>$1</b>).',
@@ -1440,6 +1451,9 @@ terlebih dahulu untuk memuat naik fail.',
'upload_directory_missing' => 'Direktori muat naik ($1) hilang dan tidak dapat dicipta oleh pelayan web.',
'upload_directory_read_only' => 'Direktori muat naik ($1) tidak boleh ditulis oleh pelayan web.',
'uploaderror' => 'Ralat muat naik',
+'upload-recreate-warning' => "'''Amaran: Sebuah fail dengan nama tersebut telah pun dihapuskan atau dipindahkan.'''
+
+Log penghapusan dan pemindahan untuk laman ini disediakan di bawah ini untuk kemudahan:",
'uploadtext' => "Gunakan borang di bawah untuk memuat naik fail.
Untuk melihat atau mencari imej yang sudah dimuat naik, sila ke [[Special:FileList|senarai fail yang dimuat naik]]. Tindakan muat naik akan direkodkan dalam [[Special:Log/upload|log muat naik]], manakala penghapusan dalam [[Special:Log/delete|log penghapusan]].
@@ -1471,6 +1485,17 @@ Untuk menyertakan sebarang fail ke dalam sesebuah laman, gunakan pautan dengan s
'filetype-unwanted-type' => "'''\".\$1\"''' adalah jenis fail yang tidak dikehendaki. {{PLURAL:\$3|Jenis|Jenis-jenis}} fail yang diutamakan ialah \$2.",
'filetype-banned-type' => "'''\".\$1\"''' adalah jenis fail yang dilarang. {{PLURAL:\$3|Jenis|Jenis-jenis}} fail yang dibenarkan ialah \$2.",
'filetype-missing' => 'Fail ini tidak mempunyai sambungan (contohnya ".jpg").',
+'empty-file' => 'Fail yang anda serahkan adalah kosong.',
+'file-too-large' => 'Fail yang anda serahkan adalah terlalu besar.',
+'filename-tooshort' => 'Nama fail ini terlalu pendek.',
+'filetype-banned' => 'Fail jenis ini adalah dilarang.',
+'verification-error' => 'Fail ini tidak lulus pengesahan fail.',
+'hookaborted' => 'Pengubahsuaian yang anda buat telah disekat oleh sebuah cangkuk sambungan.',
+'illegal-filename' => 'Nama fail tidak dibenarkan.',
+'overwrite' => 'Menulis ganti fail yang telah wujud adalah tidak dibenarkan.',
+'unknown-error' => 'Berlaku ralat yang tidak diketahui.',
+'tmp-create-error' => 'Fail sementara tidak dapat dicipta.',
+'tmp-write-error' => 'Fail sementara tidak dapat ditulis.',
'large-file' => 'Saiz fail ini ialah $2. Anda dinasihati supaya memuat naik fail yang tidak melebihi $1.',
'largefileserver' => 'Fail ini telah melebihi had muat naik pelayan web.',
'emptyfile' => 'Fail yang dimuat naik adalah kosong. Ini mungkin disebabkan oleh kesilapan menaip nama fail. Sila pastikan bahawa anda betul-betul mahu memuat naik fail ini.',
@@ -1493,13 +1518,14 @@ Jika anda memiliki imej ini dalam leraian penuh, sila muat naik fail tersebut. S
'fileexists-shared-forbidden' => 'Sebuah fail dengan nama ini telah pun wujud dalam gedung fail kongsi. Jika anda masih mahu memuat naik fail ini, sila kembali ke borang muat naik dan gunakan nama lain. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Fail ini adalah salinan bagi {{PLURAL:$1|fail|fail-fail}} berikut:',
'file-deleted-duplicate' => 'Sebuah fail yang serupa dengan fail ini ([[:$1]]) telah pun dihapuskan sebelum ini. Anda seharusnya memeriksa sejarah penghapusan fail itu terlebih dahulu sebelum memuat naiknya sekali lagi.',
-'successfulupload' => 'Muat naik berjaya',
'uploadwarning' => 'Amaran muat naik',
'uploadwarning-text' => 'Sila ubah keterangan fail di bawah dan cuba lagi.',
'savefile' => 'Simpan fail',
'uploadedimage' => 'memuat naik "[[$1]]"',
'overwroteimage' => 'memuat naik versi baru bagi "[[$1]]"',
'uploaddisabled' => 'Ciri muat naik dimatikan',
+'copyuploaddisabled' => 'Ciri muat naik melalui URL telah dilumpuhkan.',
+'uploadfromurl-queued' => 'Muat naik anda telah digilirkan.',
'uploaddisabledtext' => 'Ciri muat naik fail dimatikan.',
'php-uploaddisabledtext' => 'Pemuatnaikan fail PHP dilumpuhkan. Sila semak tetapan file_uploads.',
'uploadscripted' => 'Fail ini mengandungi kod HTML atau skrip yang boleh disalahtafsirkan oleh pelayar web.',
@@ -1518,6 +1544,14 @@ Jika anda memiliki imej ini dalam leraian penuh, sila muat naik fail tersebut. S
Anda harus mempertimbangkan perlunya memuat naik fail ini.
Untuk rujukan, yang berikut ialah log penghapusan bagi fail ini:",
'filename-bad-prefix' => "Nama bagi fail yang dimuat naik bermula dengan '''\"\$1\"''', yang mana merupakan nama yang tidak deskriptif yang biasanya ditetapkan oleh kamera digital secara automatik. Sila berikan nama yang lebih deskriptif bagi fail tersebut.",
+'upload-success-subj' => 'Muat naik berjaya',
+'upload-success-msg' => 'Muat naik anda dari [$2] berjaya. Ia ada di sini: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Masalah muat naik',
+'upload-failure-msg' => 'Terdapat masalah dengan muat naik anda daripada [$2]:
+
+$1',
+'upload-warning-subj' => 'Amaran muat naik',
+'upload-warning-msg' => 'Terdapat masalah dengan muat naik anda daripada [$2]. Anda boleh kembali ke [[Special:Upload/stash/$1|borang muat naik]] untuk mengatasi masalah ini.',
'upload-proto-error' => 'Protokol salah',
'upload-proto-error-text' => 'Muat naik jauh memerlukan URL yang dimulakan dengan <code>http://</code> atau <code>ftp://</code>.',
@@ -1578,6 +1612,7 @@ Klik di atas mana-mana lajur yang berkenaan untuk menukar tertib susunan.',
'listfiles_search_for' => 'Cari nama imej:',
'imgfile' => 'fail',
'listfiles' => 'Senarai fail',
+'listfiles_thumb' => 'Thumbnail',
'listfiles_date' => 'Tarikh',
'listfiles_name' => 'Nama',
'listfiles_user' => 'Pengguna',
@@ -1691,8 +1726,8 @@ Penerangan pada [$2 laman penerangan failnya] di sana ditunjukkan di bawah.',
'statistics-edits' => 'Suntingan laman sejak {{SITENAME}} dibuka',
'statistics-edits-average' => 'Purata suntingan bagi setiap laman',
'statistics-views-total' => 'Jumlah pandangan',
+'statistics-views-total-desc' => 'Paparan ke laman-laman yang tidak wujud dan laman-laman khas tidak disertakan',
'statistics-views-peredit' => 'Pandangan setiap suntingan',
-'statistics-jobqueue' => 'Jumlah [http://www.mediawiki.org/wiki/Manual:Job_queue tugas yang tertunggak]',
'statistics-users' => '[[Special:ListUsers|Pengguna]] berdaftar',
'statistics-users-active' => 'Pengguna aktif',
'statistics-users-active-desc' => 'Pengguna yang aktif sejak {{PLURAL:$1|semalam|$1 hari lalu}}',
@@ -1704,14 +1739,14 @@ Penerangan pada [$2 laman penerangan failnya] di sana ditunjukkan di bawah.',
'doubleredirects' => 'Lencongan berganda',
'doubleredirectstext' => 'Yang berikut ialah senarai laman yang melencong ke laman lencongan lain. Setiap baris mengandungi pautan ke laman lencongan pertama dan kedua, serta baris pertama bagi teks lencongan kedua, lazimnya merupakan laman sasaran "sebenar", yang sepatutnya ditujui oleh lencongan pertama.
-Masukan yang <s>dipotong</s> telah diselesaikan.',
+Masukan yang <del>dipotong</del> telah diselesaikan.',
'double-redirect-fixed-move' => '[[$1]] dilencongkan ke [[$2]]',
'double-redirect-fixer' => 'Pembaiki lencongan',
'brokenredirects' => 'Lencongan rosak',
'brokenredirectstext' => 'Lencongan-lencongan berikut menuju ke laman yang tidak wujud:',
'brokenredirects-edit' => 'sunting',
-'brokenredirects-delete' => 'hapus',
+'brokenredirects-delete' => 'hapuskan',
'withoutinterwiki' => 'Laman tanpa pautan bahasa',
'withoutinterwiki-summary' => 'Laman-laman berikut tidak mempunyai pautan ke versi bahasa lain:',
@@ -1727,6 +1762,8 @@ Masukan yang <s>dipotong</s> telah diselesaikan.',
'nmembers' => '$1 ahli',
'nrevisions' => '$1 semakan',
'nviews' => 'Dilihat $1 kali',
+'nimagelinks' => 'Digunakan pada {{PLURAL:$1|sebuah|$1 buah}} laman',
+'ntransclusions' => 'digunakan pada {{PLURAL:$1|sebuah|$1 buah}} laman',
'specialpage-empty' => 'Tiada keputusan bagi laporan ini.',
'lonelypages' => 'Laman yatim',
'lonelypagestext' => 'Laman-laman berikut tidak dipaut atau disertakan dari laman lain dalam {{SITENAME}}.',
@@ -1883,37 +1920,43 @@ Anda boleh mengetahui [[{{MediaWiki:Listgrouprights-helppage}}|maklumat tambahan
'listgrouprights-removegroup-self-all' => 'Keluar daripada semua kumpulan',
# E-mail user
-'mailnologin' => 'Tiada alamat e-mel',
-'mailnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
+'mailnologin' => 'Tiada alamat e-mel',
+'mailnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
terlebih dahulu dan mempunyai alamat e-mel yang sah dalam
[[Special:Preferences|laman keutamaan]] untuk mengirim e-mel kepada pengguna lain.',
-'emailuser' => 'Kirim e-mel kepada pengguna ini',
-'emailpage' => 'E-mel pengguna',
-'emailpagetext' => 'Gunakan borang berikut untuk mengirim pesanan e-mel kepada pengguna ini.
+'emailuser' => 'Kirim e-mel kepada pengguna ini',
+'emailpage' => 'E-mel pengguna',
+'emailpagetext' => 'Gunakan borang berikut untuk mengirim pesanan e-mel kepada pengguna ini.
Alamat e-mel yang ditetapkan dalam [[Special:Preferences|keutamaan anda]] akan digunakan sebagai alamat "Daripada" dalam e-mel tersebut supaya si penerima boleh membalasnya.',
-'usermailererror' => 'Objek Mail memulangkan ralat:',
-'defemailsubject' => 'E-mel {{SITENAME}}',
-'noemailtitle' => 'Tiada alamat e-mel',
-'noemailtext' => 'Pengguna ini tidak menetapkan alamat e-mel yang sah.',
-'nowikiemailtitle' => 'E-mel tidak dibenarkan',
-'nowikiemailtext' => 'Pengguna ini tidak mahu menerima e-mel daripada pengguna lain.',
-'email-legend' => 'Kirim e-mel kepada pengguna {{SITENAME}} lain',
-'emailfrom' => 'Daripada:',
-'emailto' => 'Kepada:',
-'emailsubject' => 'Perkara:',
-'emailmessage' => 'Pesanan:',
-'emailsend' => 'Kirim',
-'emailccme' => 'Kirim salinan mesej ini kepada saya.',
-'emailccsubject' => 'Salinan bagi mesej anda kepada $1: $2',
-'emailsent' => 'E-mel dikirim',
-'emailsenttext' => 'E-mel anda telah dikirim.',
-'emailuserfooter' => 'E-mel ini telah dikirim oleh $1 kepada $2 menggunakan alat "E-mel pengguna" di {{SITENAME}}.',
+'usermailererror' => 'Objek Mail memulangkan ralat:',
+'defemailsubject' => 'E-mel {{SITENAME}}',
+'usermaildisabled' => 'E-mel pengguna telah dilumpuhkan',
+'usermaildisabledtext' => 'Anda tidak boleh mengirim e-mel kepada pengguna lain di wiki ini',
+'noemailtitle' => 'Tiada alamat e-mel',
+'noemailtext' => 'Pengguna ini tidak menetapkan alamat e-mel yang sah.',
+'nowikiemailtitle' => 'E-mel tidak dibenarkan',
+'nowikiemailtext' => 'Pengguna ini tidak mahu menerima e-mel daripada pengguna lain.',
+'email-legend' => 'Kirim e-mel kepada pengguna {{SITENAME}} lain',
+'emailfrom' => 'Daripada:',
+'emailto' => 'Kepada:',
+'emailsubject' => 'Perkara:',
+'emailmessage' => 'Pesanan:',
+'emailsend' => 'Kirim',
+'emailccme' => 'Kirim salinan mesej ini kepada saya.',
+'emailccsubject' => 'Salinan bagi mesej anda kepada $1: $2',
+'emailsent' => 'E-mel dikirim',
+'emailsenttext' => 'E-mel anda telah dikirim.',
+'emailuserfooter' => 'E-mel ini telah dikirim oleh $1 kepada $2 menggunakan alat "E-mel pengguna" di {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Meninggalkan pesanan sistem.',
+'usermessage-editor' => 'Utusan sistem',
# Watchlist
'watchlist' => 'Senarai pantau',
'mywatchlist' => 'Senarai pantau saya',
-'watchlistfor' => "(bagi '''$1''')",
+'watchlistfor2' => 'Bagi $1 $2',
'nowatchlist' => 'Tiada item dalam senarai pantau anda.',
'watchlistanontext' => 'Sila $1 terlebih dahulu untuk melihat atau menyunting senarai pantau anda.',
'watchnologin' => 'Belum log masuk',
@@ -1959,14 +2002,14 @@ Jika anda mahu membuang laman tersebut daripada senarai pantau, klik \"Nyahpanta
'enotif_lastvisited' => 'Lihat $1 untuk semua perubahan sejak kunjungan terakhir anda.',
'enotif_lastdiff' => 'Rujuk $1 untuk melihat perubahan ini.',
'enotif_anon_editor' => 'pengguna tanpa nama $1',
-'enotif_body' => 'Saudara/saudari $WATCHINGUSERNAME,
+'enotif_body' => '$WATCHINGUSERNAME,
-Laman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED pada $PAGEEDITDATE oleh $PAGEEDITOR, sila lihat $PAGETITLE_URL untuk versi semasa.
+Laman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED pada $PAGEEDITDATE oleh $PAGEEDITOR; sila lihat $PAGETITLE_URL untuk semakan terkini.
$NEWPAGE
-Ringkasan: $PAGESUMMARY $PAGEMINOREDIT
+Ringkasan penyunting: $PAGESUMMARY $PAGEMINOREDIT
Hubungi penyunting tersebut:
mel: $PAGEEDITOR_EMAIL
@@ -1975,13 +2018,16 @@ wiki: $PAGEEDITOR_WIKI
Tiada pemberitahuan lain akan dikirim berkaitan perubahan selanjutnya melainkan anda mengunjungi laman tersebut.
Anda juga boleh menetapkan semula penanda pemberitahuan bagi semua laman dalam senarai pantau anda.
- Sistem pemberitahuan {{SITENAME}} anda yang ramah
+ Sistem pemberitahuan {{SITENAME}} anda yang ramah mesra
--
+Untuk mengubah tetapan pemberitahuan e-mel anda, lawati
+{{fullurl:{{#special:Preferences}}}}
+
Untuk mengubah tetapan senarai pantau anda, lawati
{{fullurl:{{#special:Watchlist}}/edit}}
-Untuk memadam laman ini dari senarai pantau anda, lawati
+Untuk menghapuskan laman ini dari senarai pantau anda, lawati
$UNWATCHURL
Maklum balas dan bantuan:
@@ -2034,7 +2080,10 @@ Suntingan terakhir telah dibuat oleh [[User:$3|$3]] ([[User talk:$3|Perbualan]]{
'revertpage' => 'Membalikkan suntingan oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|Perbincangan]]) kepada versi terakhir oleh [[User:$1|$1]]',
'revertpage-nouser' => 'Membalikkan suntingan oleh (nama pengguna dibuang) kepada semakan terakhir oleh [[User:$1|$1]]',
'rollback-success' => 'Membalikkan suntingan oleh $1 kepada versi terakhir oleh $2.',
-'sessionfailure' => 'Terdapat sedikit masalah pada sesi log masuk anda.
+
+# Edit tokens
+'sessionfailure-title' => 'Kegagalan sesi',
+'sessionfailure' => 'Terdapat sedikit masalah pada sesi log masuk anda.
Tindakan ini telah dibatalkan untuk mencegah perampasan sesi.
Sila tekan butang "back" dan muatkan semula laman yang telah anda kunjungi sebelum ini, kemudian cuba lagi.',
@@ -2164,18 +2213,21 @@ $1',
'month' => 'Sebelum bulan:',
'year' => 'Sebelum tahun:',
-'sp-contributions-newbies' => 'Tunjukkan sumbangan daripada akaun baru sahaja',
-'sp-contributions-newbies-sub' => 'Bagi akaun-akaun baru',
-'sp-contributions-newbies-title' => 'Sumbangan oleh pengguna baru',
-'sp-contributions-blocklog' => 'Log sekatan',
-'sp-contributions-deleted' => 'sumbangan dihapuskan',
-'sp-contributions-logs' => 'log',
-'sp-contributions-talk' => 'perbincangan',
-'sp-contributions-userrights' => 'pengurusan hak pengguna',
-'sp-contributions-blocked-notice' => 'Pengguna ini sedang disekat. Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
-'sp-contributions-search' => 'Cari sumbangan',
-'sp-contributions-username' => 'Alamat IP atau nama pengguna:',
-'sp-contributions-submit' => 'Cari',
+'sp-contributions-newbies' => 'Tunjukkan sumbangan daripada akaun baru sahaja',
+'sp-contributions-newbies-sub' => 'Bagi akaun-akaun baru',
+'sp-contributions-newbies-title' => 'Sumbangan oleh pengguna baru',
+'sp-contributions-blocklog' => 'Log sekatan',
+'sp-contributions-deleted' => 'sumbangan dihapuskan',
+'sp-contributions-uploads' => 'muat naik',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'perbincangan',
+'sp-contributions-userrights' => 'pengurusan hak pengguna',
+'sp-contributions-blocked-notice' => 'Pengguna ini sedang disekat. Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
+'sp-contributions-blocked-notice-anon' => 'Alamat IP ini sedang disekat. Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
+'sp-contributions-search' => 'Cari sumbangan',
+'sp-contributions-username' => 'Alamat IP atau nama pengguna:',
+'sp-contributions-toponly' => 'Hanya paparkan suntingan yang merupakan semakan terkini',
+'sp-contributions-submit' => 'Cari',
# What links here
'whatlinkshere' => 'Pautan ke laman ini',
@@ -2239,7 +2291,6 @@ dirosakkan).',
'ipb-edit-dropdown' => 'Sunting sebab sekatan',
'ipb-unblock-addr' => 'Nyahsekat $1',
'ipb-unblock' => 'Nyahsekat nama pengguna atau alamat IP',
-'ipb-blocklist-addr' => 'Sekatan sedia ada bagi $1',
'ipb-blocklist' => 'Lihat sekatan sedia ada',
'ipb-blocklist-contribs' => 'Sumbangan oleh $1',
'unblockip' => 'Nyahsekat pengguna',
@@ -2310,6 +2361,8 @@ $1 telah pun disekat Adakah anda mahu menukar tetapan sekatan pengguna ini?',
'cant-block-while-blocked' => 'Anda tidak boleh menyekat orang lain sedangkan anda disekat.',
'cant-see-hidden-user' => 'Pengguna yang anda cuba sekat telahpun disekat dan tersorok.
Memandangkan anda tidak mempunyai hak untuk menyorokkan pengguna, anda tidak boleh melihat atau menyunting sekatan pengguna tersebut.',
+'ipbblocked' => 'Anda tidak boleh menyekat atau menyahsekat pengguna lain kerana anda sendiri telah disekat',
+'ipbnounblockself' => 'Anda tidak dibenarkan menyahsekat diri sendiri',
# Developer tools
'lockdb' => 'Kunci pangkalan data',
@@ -2346,6 +2399,17 @@ laman tersebut kosong atau merupakan laman lencongan dan tidak mempunyai sejarah
laman kepada nama yang asal jika anda telah melakukan kesilapan, dan anda tidak boleh menulis ganti laman yang telah wujud.
'''AMARAN!''' Tindakan ini boleh menjadi perubahan yang tidak dijangka dan drastik bagi laman popular. Oleh itu, sila pastikan anda faham akibat yang mungkin timbul sebelum meneruskannya.",
+'movepagetext-noredirectfixer' => "Borang di bawah akan menamakan semula sesebuah laman, memindahkan kesemua sejarahnya ke nama baru.
+Nama lamanya akan menjadi sebuah laman lencongan ke laman baru tadi.
+Pastikan [[Special:DoubleRedirects|lencongan berganda]] atau [[Special:BrokenRedirects|rosak]] sudah diperiksa.
+Anda bertanggungjawab memastikan pautan-pautan sampai ke tujuan yang sepatutnya.
+
+Sila maklum bahawa laman tadi '''tidak''' akan dipindahkan sekiranya laman dengan tajuk yang baru tadi telah wujud, melainkan ia kosong atau sebuah pelencongan dan tiada sejarah suntingan lampau.
+Ini bermakna anda boleh menamakan semula sesebuah laman balik kepada nama asalnya jika anda melakukan kesilapan, dan anda tidak boleh menulis ganti sebuah laman yang sudah wujud.
+
+'''AMARAN!'''
+Tindakan ini boleh menjadi perubahan yang tidak dijangka dan drastik bagi laman popular;
+sila pastikan anda faham akibat yang mungkin timbul sebelum meneruskannya.",
'movepagetalktext' => "Laman perbincangan yang berkaitan, jika ada, akan dipindahkan bersama-sama laman ini secara automatik '''kecuali''':
* Sebuah laman perbincangan dengan nama baru telah pun wujud, atau
* Anda membuang tanda kotak di bawah.
@@ -2402,6 +2466,7 @@ Laman destinasi "[[:$1]]" telah pun wujud. Adakah anda mahu menghapuskannya supa
'immobile-source-page' => 'Anda tidak boleh memindahkan laman ini.',
'immobile-target-page' => 'Anda tidak boleh memindahkan laman ke tajuk itu.',
'imagenocrossnamespace' => 'Tidak boleh memindah fail ke ruang nama lain',
+'nonfile-cannot-move-to-file' => 'Laman bukan fail tidak boleh dipindahkan ke ruang nama fail',
'imagetypemismatch' => 'Sambungan baru fail tersebut tidak sepadan dengan jenisnya',
'imageinvalidfilename' => 'Nama fail imej sasaran tidak sah',
'fix-double-redirects' => 'Kemas kinikan semua lencongan yang menuju ke tajuk asal',
@@ -2481,6 +2546,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'importstart' => 'Mengimport laman...',
'import-revision-count' => '$1 semakan',
'importnopages' => 'Tiada laman untuk diimport.',
+'imported-log-entries' => '$1 {{PLURAL:$1|entri log|entri log}} telah diimport.',
'importfailed' => 'Import gagal: $1',
'importunknownsource' => 'Jenis sumber import tidak dikenali',
'importcantopen' => 'Fail import tidak dapat dibuka',
@@ -2573,6 +2639,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'tooltip-upload' => 'Muat naik',
'tooltip-rollback' => 'Balikkan semua suntingan oleh penyumbang terakhir pada laman ini dengan satu klik.',
'tooltip-undo' => 'Balikkan suntingan ini dan buka borang sunting dalam mod pratonton. Sebab boleh dinyatakan dalam ruangan ringkasan.',
+'tooltip-preferences-save' => 'Simpan keutamaan',
+'tooltip-summary' => 'Masukkan ringkasan pendek',
# Metadata
'nodublincore' => 'Metadata RDF Dublin Core dipadamkan bagi pelayan ini.',
@@ -2671,14 +2739,17 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
'imagemaxsize' => "Had saiz imej:<br />''(untuk laman keterangan fail)''",
'thumbsize' => 'Saiz imej ringkas:',
'widthheightpage' => '$1×$2, $3 halaman',
-'file-info' => '(saiz file: $1, jenis MIME: $2)',
-'file-info-size' => '($1 × $2 piksel, saiz fail: $3, jenis MIME: $4)',
+'file-info' => 'saiz file: $1, jenis MIME: $2',
+'file-info-size' => '$1 × $2 piksel, saiz fail: $3, jenis MIME: $4',
'file-nohires' => '<small>Tiada leraian lebih besar.</small>',
-'svg-long-desc' => '(Fail SVG, ukuran dasar $1 × $2 piksel, saiz fail: $3)',
+'svg-long-desc' => 'Fail SVG, ukuran dasar $1 × $2 piksel, saiz fail: $3',
'show-big-image' => 'Leraian penuh',
'show-big-image-thumb' => '<small>Saiz pratonton ini: $1 × $2 piksel</small>',
'file-info-gif-looped' => 'berulang',
'file-info-gif-frames' => '$1 bingkai',
+'file-info-png-looped' => 'berulang',
+'file-info-png-repeat' => 'dimainkan {{PLURAL:$1|sekali|sebanyak $1 kali}}',
+'file-info-png-frames' => '$1 bingkai',
# Special:NewFiles
'newimages' => 'Galeri fail baru',
@@ -2835,6 +2906,7 @@ Ruangan lain akan disembunyikan pada sediakala.
'exif-gpsareainformation' => 'Nama kawasan GPS',
'exif-gpsdatestamp' => 'Tarikh GPS',
'exif-gpsdifferential' => 'Pembetulan pembezaan GPS',
+'exif-objectname' => 'Tajuk ringkas',
# EXIF attributes
'exif-compression-1' => 'Tidak dimampat',
@@ -2994,30 +3066,30 @@ Ruangan lain akan disembunyikan pada sediakala.
'limitall' => 'semua',
# E-mail address confirmation
-'confirmemail' => 'Sahkan alamat e-mel',
-'confirmemail_noemail' => 'Anda belum menetapkan alamat e-mel yang sah dalam [[Special:Preferences|laman keutamaan]] anda.',
-'confirmemail_text' => '{{SITENAME}} menghendaki supaya anda mengesahkan alamat e-mel anda sebelum menggunakan ciri-ciri e-mel.
+'confirmemail' => 'Sahkan alamat e-mel',
+'confirmemail_noemail' => 'Anda belum menetapkan alamat e-mel yang sah dalam [[Special:Preferences|laman keutamaan]] anda.',
+'confirmemail_text' => '{{SITENAME}} menghendaki supaya anda mengesahkan alamat e-mel anda sebelum menggunakan ciri-ciri e-mel.
Aktifkan butang di bawah untuk mengirim e-mel pengesahan kepada alamat e-mel
anda. E-mel tersebut akan mengandungi sebuah pautan yang mengandungi sebuah
kod; buka pautan tersebut di pelayar anda untuk mengesahkan bahawa alamat e-mel anda.',
-'confirmemail_pending' => 'Sebuah kod pengesahan telah pun di-e-melkan kepada anda. Jika anda baru sahaja
+'confirmemail_pending' => 'Sebuah kod pengesahan telah pun di-e-melkan kepada anda. Jika anda baru sahaja
membuka akaun, sila tunggu kehadiran e-mel tersebut selama beberapa minit
sebelum meminta kod baru.',
-'confirmemail_send' => 'E-melkan kod pengesahan',
-'confirmemail_sent' => 'E-mel pengesahan dikirim.',
-'confirmemail_oncreate' => 'Sebuah kod pengesahan telah dikirim kepada alamat e-mel anda.
+'confirmemail_send' => 'E-melkan kod pengesahan',
+'confirmemail_sent' => 'E-mel pengesahan dikirim.',
+'confirmemail_oncreate' => 'Sebuah kod pengesahan telah dikirim kepada alamat e-mel anda.
Kod ini tidak diperlukan untuk log masuk, akan tetapi anda perlu menyediakannya untuk
mengaktifkan ciri-ciri e-mel yang terdapat dalam wiki ini.',
-'confirmemail_sendfailed' => '{{SITENAME}} tidak dapat menghantar e-mel pengesahan anda. Sila semak alamat e-mel tersebut.
+'confirmemail_sendfailed' => '{{SITENAME}} tidak dapat menghantar e-mel pengesahan anda. Sila semak alamat e-mel tersebut.
Pelayan mel memulangkan: $1',
-'confirmemail_invalid' => 'Kod pengesahan tidak sah. Kod tersebut mungkin sudah luput.',
-'confirmemail_needlogin' => 'Anda perlu $1 terlebih dahulu untuk mengesahkan alamat e-mel anda.',
-'confirmemail_success' => 'Alamat e-mel anda telah disahkan. Sekarang anda boleh melog masuk dan berseronok di wiki ini.',
-'confirmemail_loggedin' => 'Alamat e-mel anda telah disahkan.',
-'confirmemail_error' => 'Sesuatau yang tidak kena berlaku ketika kami menyimpan pengesahan anda.',
-'confirmemail_subject' => 'Pengesahan alamat e-mel di {{SITENAME}}',
-'confirmemail_body' => 'Seseorang, barangkali anda, dari alamat IP $1, telah mendaftarkan akaun "$2" dengan alamat e-mel ini di {{SITENAME}}.
+'confirmemail_invalid' => 'Kod pengesahan tidak sah. Kod tersebut mungkin sudah luput.',
+'confirmemail_needlogin' => 'Anda perlu $1 terlebih dahulu untuk mengesahkan alamat e-mel anda.',
+'confirmemail_success' => 'Alamat e-mel anda telah disahkan. Sekarang anda boleh melog masuk dan berseronok di wiki ini.',
+'confirmemail_loggedin' => 'Alamat e-mel anda telah disahkan.',
+'confirmemail_error' => 'Sesuatau yang tidak kena berlaku ketika kami menyimpan pengesahan anda.',
+'confirmemail_subject' => 'Pengesahan alamat e-mel di {{SITENAME}}',
+'confirmemail_body' => 'Seseorang, barangkali anda, dari alamat IP $1, telah mendaftarkan akaun "$2" dengan alamat e-mel ini di {{SITENAME}}.
Untuk mengesahkan bahawa akaun ini milik anda dan untuk mengaktifkan kemudahan e-mel di {{SITENAME}}, sila buka pautan ini dalam pelayar web anda:
@@ -3028,8 +3100,30 @@ Jika anda tidak mendaftar di {{SITENAME}} (atau anda telah mendaftar menggunakan
$5
Kod pengesahan ini akan luput pada $4.',
-'confirmemail_invalidated' => 'Pengesahan alamat e-mel telah dibatalkan',
-'invalidateemail' => 'Batalkan pengesahan e-mel',
+'confirmemail_body_changed' => 'Seseorang, barangkali anda, dari alamat IP $1, telah menukarkan alamat e-mel bagi akaun "$2" menjadi alamat e-mel ini di {{SITENAME}}.
+
+Untuk mengesahkan bahawa akaun ini milik anda dan untuk mengaktifkan semula kemudahan e-mel di {{SITENAME}}, sila buka pautan ini dalam pelayar web anda:
+
+$3
+
+Jika akaun ini *bukan* milik anda, ikuti pautan ini untuk membatalkan pengesahan alamat e-mel:
+
+$5
+
+Kod pengesahan ini akan luput pada $4.',
+'confirmemail_body_set' => 'Seseorang, barangkali anda, dari alamat IP $1, telah set semula akaun "$2" kepada alamat ini di {{SITENAME}}.
+
+Untuk mengesahkan bahawa akaun ini milik anda dan untuk mengaktifkan kemudahan e-mel di {{SITENAME}}, sila buka pautan ini dalam pelayar web anda:
+
+$3
+
+Jika akaun tersebut *bukan* kepunyaan anda, ikuti pautan ini untuk membatalkan pengesahan alamat e-mel:
+
+$5
+
+Kod pengesahan ini akan luput pada $4.',
+'confirmemail_invalidated' => 'Pengesahan alamat e-mel telah dibatalkan',
+'invalidateemail' => 'Batalkan pengesahan e-mel',
# Scary transclusion
'scarytranscludedisabled' => '[Penyertaan pautan interwiki dilumpuhkan]',
@@ -3069,6 +3163,7 @@ Sila sahkan bahawa anda mahu mencipta semula laman ini.",
'table_pager_first' => 'Muka pertama',
'table_pager_last' => 'Muka terakhir',
'table_pager_limit' => 'Papar $1 item setiap muka',
+'table_pager_limit_label' => 'Bilangan item setiap laman:',
'table_pager_limit_submit' => 'Pergi',
'table_pager_empty' => 'Tiada hasil',
@@ -3079,7 +3174,7 @@ Sila sahkan bahawa anda mahu mencipta semula laman ini.",
'autosumm-new' => "Mencipta laman baru dengan kandungan '$1'",
# Live preview
-'livepreview-loading' => 'Memuat …',
+'livepreview-loading' => 'Memuatkan...',
'livepreview-ready' => 'Memuat … Sedia!',
'livepreview-failed' => 'Pratonton langsung gagal! Sila gunakan pratonton biasa.',
'livepreview-error' => 'Gagal membuat sambungan: $1 "$2". Sila gunakan pratonton biasa.',
@@ -3138,6 +3233,7 @@ Anda juga boleh [[Special:Watchlist/edit|menggunakan penyunting piawai]].',
'version-specialpages' => 'Laman khas',
'version-parserhooks' => 'Penyangkuk penghurai',
'version-variables' => 'Pemboleh ubah',
+'version-skins' => 'Rupa',
'version-other' => 'Lain-lain',
'version-mediahandlers' => 'Pengelola media',
'version-hooks' => 'Penyangkuk',
@@ -3149,6 +3245,13 @@ Anda juga boleh [[Special:Watchlist/edit|menggunakan penyunting piawai]].',
'version-hook-subscribedby' => 'Dilanggan oleh',
'version-version' => '(Versi $1)',
'version-license' => 'Lesen',
+'version-poweredby-credits' => "Wiki ini dikuasakan oleh '''[http://www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
+'version-poweredby-others' => 'penyumbang-penyumbang lain',
+'version-license-info' => 'MediaWiki adalah perisian bebas; anda boleh mengedarkannya semula dan/atau mengubah suainya di bawah terma-terma Lesen Awam GNU sebagai mana yang telah diterbitkan oleh Yayasan Perisian Bebas, sama ada versi 2 bagi Lesen tersebut, atau (berdasarkan pilihan anda) mana-mana versi selepasnya.
+
+MediaWiki diedarkan dengan harapan bahawa ia berguna, tetapi TANPA SEBARANG WARANTI; hatta waranti yang tersirat bagi KEBOLEHDAGANGAN mahupun KESESUAIAN UNTUK TUJUAN TERTENTU. Sila lihat Lesen Awam GNU untuk butiran lanjut.
+
+Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi Lesen Awam GNU] bersama-sama dengan atur cara ini; jika tidak, tulis ke Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atau [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html baca dalam talian].',
'version-software' => 'Perisian yang dipasang',
'version-software-product' => 'Produk',
'version-software-version' => 'Versi',
@@ -3219,6 +3322,15 @@ Sila masukkan nama fail tanpa awalan "{{ns:file}}:".',
'tags-edit' => 'sunting',
'tags-hitcount' => '$1 perubahan',
+# Special:ComparePages
+'comparepages' => 'Perbandingan laman',
+'compare-selector' => 'Bandingkan semakan laman',
+'compare-page1' => 'Laman 1',
+'compare-page2' => 'Laman 2',
+'compare-rev1' => 'Semakan 1',
+'compare-rev2' => 'Semakan 2',
+'compare-submit' => 'Bandingkan',
+
# Database error messages
'dberr-header' => 'Wiki ini dilanda masalah',
'dberr-problems' => 'Harap maaf. Tapak web ini dilanda masalah teknikal.',
@@ -3235,8 +3347,13 @@ Sila masukkan nama fail tanpa awalan "{{ns:file}}:".',
'htmlform-float-invalid' => 'Nilai yang anda nyatakan bukan nombor.',
'htmlform-int-toolow' => 'Nilai yang anda nyatakan berada di bawah minimum bagi $1',
'htmlform-int-toohigh' => 'Nilai yang anda nyatakan berada di atas maksimum bagi $1',
+'htmlform-required' => 'Nilai ini adalah wajib',
'htmlform-submit' => 'Hantar',
'htmlform-reset' => 'Undur perubahan',
'htmlform-selectorother-other' => 'Lain-lain',
+# SQLite database support
+'sqlite-has-fts' => '$1 dengan sokongan carian teks penuh',
+'sqlite-no-fts' => '$1 tanpa sokongan carian teks penuh',
+
);
diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php
index fb17b2d4..061fdae9 100644
--- a/languages/messages/MessagesMt.php
+++ b/languages/messages/MessagesMt.php
@@ -48,8 +48,8 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'RiindirizziDoppji' ),
- 'BrokenRedirects' => array( 'RiindirizziMiksura' ),
+ 'DoubleRedirects' => array( 'RindirizziDoppji', 'RiindirizziDoppji' ),
+ 'BrokenRedirects' => array( 'RindirizziMiksura', 'RiindirizziMiksura' ),
'Disambiguations' => array( 'Diżambigwazzjoni' ),
'Userlogin' => array( 'UtentDħul' ),
'Userlogout' => array( 'UtentĦruġ' ),
@@ -58,9 +58,9 @@ $specialPageAliases = array(
'Watchlist' => array( 'ListaOsservazzjoni' ),
'Recentchanges' => array( 'TibdilRiċenti' ),
'Upload' => array( 'Tella\'' ),
- 'Listfiles' => array( 'ListaStampi' ),
- 'Newimages' => array( 'StampiÄ odda' ),
- 'Listusers' => array( 'Utenti' ),
+ 'Listfiles' => array( 'ListaStampi', 'ListaFajls' ),
+ 'Newimages' => array( 'StampiÄ odda', 'FajlsÄ odda' ),
+ 'Listusers' => array( 'Utenti', 'ListaUtenti' ),
'Listgrouprights' => array( 'ListaDrittijietGruppi' ),
'Statistics' => array( 'Statistika' ),
'Randompage' => array( 'PaġnaKwalunkwe' ),
@@ -70,7 +70,7 @@ $specialPageAliases = array(
'Uncategorizedimages' => array( 'StampiMhuxKategorizzati' ),
'Uncategorizedtemplates' => array( 'MudelliMhuxKategorizzati' ),
'Unusedcategories' => array( 'KategorijiMhuxUżati' ),
- 'Unusedimages' => array( 'StampiMhuxUżati' ),
+ 'Unusedimages' => array( 'StampiMhuxUżati', 'FajlsMhuxUżati' ),
'Wantedpages' => array( 'PaġniRikjesti', 'ĦoloqMiksura' ),
'Wantedcategories' => array( 'KategorijiRikjesti' ),
'Wantedfiles' => array( 'FajlsRikjesti' ),
@@ -85,20 +85,21 @@ $specialPageAliases = array(
'Shortpages' => array( 'PaġniQosra' ),
'Longpages' => array( 'PaġniTwal' ),
'Newpages' => array( 'PaġniĠodda' ),
- 'Ancientpages' => array( 'PaġniAntiki' ),
+ 'Ancientpages' => array( 'PaġniQodma', 'PaġniAntiki' ),
'Deadendpages' => array( 'PaġniWieqfa' ),
'Protectedpages' => array( 'PaġniProtetti' ),
'Protectedtitles' => array( 'TitliProtetti' ),
'Allpages' => array( 'PaġniKollha' ),
'Prefixindex' => array( 'IndiċiPrefiss' ),
'Ipblocklist' => array( 'ListaIPImblukkati' ),
+ 'Unblock' => array( 'Żblokka' ),
'Specialpages' => array( 'PaġniSpeċjali' ),
'Contributions' => array( 'Kontribuzzjonijiet' ),
'Emailuser' => array( 'IbgħatUtent' ),
'Confirmemail' => array( 'KonfermaPostaElettronika' ),
'Whatlinkshere' => array( 'XiJwassalHawn' ),
'Recentchangeslinked' => array( 'TibdilRelatat' ),
- 'Movepage' => array( 'MexxiPaġna' ),
+ 'Movepage' => array( 'Mexxi', 'MexxiPaġna' ),
'Blockme' => array( 'Imblukkani' ),
'Booksources' => array( 'SorsiKotba' ),
'Categories' => array( 'Kategoriji' ),
@@ -115,7 +116,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'FittexMIME' ),
'FileDuplicateSearch' => array( 'FittexFajlDuplikat' ),
'Unwatchedpages' => array( 'PaġniMhuxOsservati' ),
- 'Listredirects' => array( 'ListaRiindirizzi' ),
+ 'Listredirects' => array( 'ListaRindirizzi', 'ListaRiindirizzi' ),
'Revisiondelete' => array( 'ĦassarReviżjoni' ),
'Unusedtemplates' => array( 'MudelliMhuxUżati' ),
'Randomredirect' => array( 'RiindirizzKwalunkwe' ),
@@ -127,13 +128,14 @@ $specialPageAliases = array(
'Popularpages' => array( 'PaġniPopolari' ),
'Search' => array( 'Fittex' ),
'Resetpass' => array( 'BiddelPassword' ),
- 'Withoutinterwiki' => array( 'BlaInterwiki' ),
+ 'Withoutinterwiki' => array( 'PaġniMingħajrInterwiki', 'BlaInterwiki' ),
'MergeHistory' => array( 'WaħħadKronoloġija' ),
'Filepath' => array( 'PostFajl' ),
'Invalidateemail' => array( 'PostaElettronikaInvalida' ),
'Blankpage' => array( 'PaġnaVojta' ),
'LinkSearch' => array( 'FittexĦolqa' ),
'DeletedContributions' => array( 'KontribuzzjonijietImħassra' ),
+ 'Activeusers' => array( 'UtentiAttivi' ),
);
$magicWords = array(
@@ -198,11 +200,11 @@ $magicWords = array(
'img_none' => array( '1', 'xejn', 'none' ),
'img_center' => array( '1', 'nofs', 'Ä‹entrali', 'Ä‹entru', 'center', 'centre' ),
'img_framed' => array( '1', 'tilat', 'b\'tilar', 'tilar', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bla tilar', 'frameless' ),
+ 'img_frameless' => array( '1', 'bla_tilar', 'frameless' ),
'img_page' => array( '1', 'paġna=$1', 'paġna $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'wieqaf', 'wieqaf=$1', 'wieqaf $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'bordura', 'burdura', 'border' ),
- 'img_baseline' => array( '1', 'bażi tal-linja', 'baseline' ),
+ 'img_baseline' => array( '1', 'bażi_tal-linja', 'baseline' ),
'img_sub' => array( '1', 'bid', 'sub' ),
'img_super' => array( '1', 'tajjeb', 'super', 'sup' ),
'img_top' => array( '1', 'fuq', 'top' ),
@@ -282,8 +284,7 @@ $messages = array(
'tog-editsection' => 'L-immodifikar tas-sezzjonijiet permezz tal-ħolqa [editja]',
'tog-editsectiononrightclick' => "L-immodifikar ta' sezzjonijiet bi klikk lemini fuq it-titli tas-sezzjonijiet (bżonn tal-JavaScript)",
'tog-showtoc' => "Uri l-werrej (għal paġni b'iktar minn 3 sezzjonijiet)",
-'tog-rememberpassword' => 'Ftakar il-password fuq dan il-kompjuter',
-'tog-editwidth' => 'Kabbar il-kaxxa tal-immodifikar għad-daqs massimu',
+'tog-rememberpassword' => "Ftakar il-login tiegħi fuq dan il-browżer (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
'tog-watchcreations' => "Żid il-paġni li noħloq fil-lista ta' osservazzjoni tiegħi",
'tog-watchdefault' => "Żid il-paġni li nimmodifika fil-lista ta' osservazzjoni personali",
'tog-watchmoves' => "Żid il-paġni li mmexxi fil-lista ta' osservazzjoni tiegħi",
@@ -425,31 +426,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Żid diskussjoni',
-'vector-action-delete' => 'Ħassar',
-'vector-action-move' => 'Mexxi',
-'vector-action-protect' => 'Ipproteġi',
-'vector-action-undelete' => 'Irkupra',
-'vector-action-unprotect' => 'Żblokka',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Għajnuna',
-'vector-namespace-image' => 'Fajl',
-'vector-namespace-main' => 'Paġna',
-'vector-namespace-media' => 'Fajl multimedjali',
-'vector-namespace-mediawiki' => 'Messaġġ',
-'vector-namespace-project' => "Paġna ta' proġett",
-'vector-namespace-special' => 'Paġna speċjali',
-'vector-namespace-talk' => 'Diskussjoni',
-'vector-namespace-template' => 'Mudell',
-'vector-namespace-user' => 'Utent',
-'vector-view-create' => 'Oħloq',
-'vector-view-edit' => 'Editja',
-'vector-view-history' => 'Ara l-kronoloġija',
-'vector-view-view' => 'Aqra',
-'vector-view-viewsource' => 'Ara s-sors',
-'actions' => 'Azzjonijiet',
-'namespaces' => 'Spazji tal-isem',
-'variants' => 'Varjanti',
+'vector-action-addsection' => 'Żid diskussjoni',
+'vector-action-delete' => 'Ħassar',
+'vector-action-move' => 'Mexxi',
+'vector-action-protect' => 'Ipproteġi',
+'vector-action-undelete' => 'Irkupra',
+'vector-action-unprotect' => 'Żblokka',
+'vector-simplesearch-preference' => 'Ippermetti suġġerimenti għat-tfittxija avvanzata (disponibbli biss għall-aspett grafiku Vector)',
+'vector-view-create' => 'Oħloq',
+'vector-view-edit' => 'Editja',
+'vector-view-history' => 'Ara l-kronoloġija',
+'vector-view-view' => 'Aqra',
+'vector-view-viewsource' => 'Ara s-sors',
+'actions' => 'Azzjonijiet',
+'namespaces' => 'Spazji tal-isem',
+'variants' => 'Varjanti',
'errorpagetitle' => 'Problema',
'returnto' => "Erġa' lura lejn $1.",
@@ -670,7 +661,7 @@ Tinsiex tippersonalizza l-[[Special:Preferences|preferenzi]] ta' {{SITENAME}}.",
'yourname' => 'Isem tal-utent:',
'yourpassword' => 'Password:',
'yourpasswordagain' => "Erġa' ikteb il-password:",
-'remembermypassword' => 'Ftakar il-login tiegħi fuq dan il-kompjuter',
+'remembermypassword' => "Ftakar il-login tiegħi fuq dan il-kompjuter (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
'yourdomainname' => 'Id-dominju tiegħek:',
'externaldberror' => "Kien hemm problema esterna ta' awtentiċitá jew m'għandhekx permess neċċessarju sabiex tagħmel aġġornamenti fuq l-aċċess estern.",
'login' => 'Idħol',
@@ -687,6 +678,7 @@ Tinsiex tippersonalizza l-[[Special:Preferences|preferenzi]] ta' {{SITENAME}}.",
'gotaccount' => "Diġa għandhek kont? '''$1'''.",
'gotaccountlink' => 'Idħol',
'createaccountmail' => 'bil-posta elettronika',
+'createaccountreason' => 'Raġuni:',
'badretype' => 'Il-passwords li daħħalt ma jaqblux.',
'userexists' => 'L-isem tal-utent li daħħalt huwa diġà meħud. Jekk jogħġbok, agħżel isem differenti.',
'loginerror' => 'Problemi fil-login',
@@ -709,6 +701,7 @@ Jekk jogħġbok, erġa' pprova.",
Jekk jogħġbok, erġa' pprova.",
'passwordtooshort' => 'Il-password trid tkun mill-inqas {{PLURAL:$1|karattru|$1 karattri}} twila u differenti mill-isem tal-utent.',
'password-name-match' => 'Il-password trid tkun differenti mill-isem tal-utent tiegħek.',
+'password-login-forbidden' => "L-użu ta' dan l-isem tal-utent u l-password huwa projbit.",
'mailmypassword' => 'Ibgħatli password ġdida',
'passwordremindertitle' => 'Password temporanju ġdid għal {{SITENAME}}',
'passwordremindertext' => 'Xi ħadd (probabbilment int, mill-indirizz IP $1) għamel rikjesta għal password ġdida għal {{SITENAME}} ($4). Password temporanja għall-utent "$2" ġiet maħluqa u din hi "$3".
@@ -799,11 +792,12 @@ Jista' jkun li int diġà biddilt il-password, jew għamilt rikjesta għal passw
'showdiff' => 'Uri t-tibdiliet',
'anoneditwarning' => "'''Twissija:''' Ma rnexxilekx tidħol.
L-indirizz tal-IP tiegħek se jiġi reġistrat fil-kronoloġija tal-modifikar ta' din il-paġna.",
+'anonpreviewwarning' => "''Bħalissa mintix fil-kont tiegħek. Jekk issalva xi modifiki tiegħek, fil-kronoloġija tal-paġna se jiġi reġistrat l-indirizz IP tiegħek.''",
'missingsummary' => "'''Twissija:''' Ma pprovdejt l-ebda taqsira dwar il-modifika.
Jekk terġa' tagħfas Modifika, l-modifika se tiġi salvata mingħajr waħda.",
'missingcommenttext' => 'Jekk jogħġbok ħalli kumment hawn taħt.',
-'missingcommentheader' => "'''Twissija:''' Ma pprovdejtx suġġett/titlu għal dan il-kumment.
-Jekk terġa' tagħfas Modifika, l-modifika tiegħek se tiġi salvata mingħajr waħda.",
+'missingcommentheader' => "'''Twissija:''' Ma ġie speċifikat l-ebda suġġett/titlu għal dan il-kumment.
+Jekk terġa' tagħfas \"{{int:savearticle}}\", il-modifika tiegħek se tiġi salvata mingħajr wieħed.",
'summary-preview' => 'Dehra proviżorja tat-taqsira:',
'subject-preview' => 'Dehra proviżorja tat-taqsira/suġġett:',
'blockedtitle' => 'L-utent Ä¡ie bblokkjat',
@@ -873,8 +867,10 @@ L-aħħar daħla fir-reġistru tal-imblokki hi mogħtiha hawn taħt għal refere
'userjsyoucanpreview' => "'''Suġġeriment:''' Uża l-buttuna \"{{int:showpreview}}\" sabiex tipprova l-JavaScript il-ġdid tiegħek qabel ma ssalvah.",
'usercsspreview' => "'''Ftakar li inti qed turi dehra proviżorja tas-CSS personali. Il-modifiki li għamilt għadhom ma ġewx salvati!'''",
'userjspreview' => "'''Ftakar li inti qiegħed biss tipprova/tara dehra proviżorja tal-JavaScript personali; il-modifiki li għamilt għad iridu jiġu salvati!'''",
+'sitecsspreview' => "'''Ftakar li din hija biss dehra proviżorja tas-CSS. Il-modifiki għadhom ma ġewx salvati!'''",
+'sitejspreview' => "'''Ftakar li din hija biss dehra proviżorja tal-JavaScript. Il-modifiki għadhom ma ġewx salvati!'''",
'userinvalidcssjstitle' => "'''Twissija:''' M'hemm l-ebda skin bl-isem \"\$1\".
-Ftakar li l-paġni .css u .js personalizzati għandhom l-ewwel ittra tat-titlu żgħira, eż. {{ns:user}}:Foo/monobook.css u mhux {{ns:user}}:Foo/Monobook.css.",
+Ftakar li l-paġni .css u .js personalizzati għandhom l-ewwel ittra tat-titlu żgħira, eż. {{ns:user}}:Foo/vector.css u mhux {{ns:user}}:Foo/Vector.css.",
'updated' => '(AÄ¡Ä¡ornata)',
'note' => "'''Nota:'''",
'previewnote' => "'''Ftakar li din hija biss dehra proviżorja, u li għadha ma ġietx salvata!'''",
@@ -892,11 +888,11 @@ Din il-modifika ma ġietx aċċettata sabiex ma jkunx hemm żballji fit-test tal
'editingsection' => "Modifika ta' $1 (sezzjoni)",
'editingcomment' => 'Qed jiġi editjat $1 (sezzjoni ġdida)',
'editconflict' => "Kunflitt t'editjar: $1",
-'explainconflict' => "Xi ħadd modifika din il-paġna sakemm int kont qiegħed tagħmel il-modifiki.
-Fiż-Żona tal-modifika superjuri jinsab il-kliem tal-paġna kif teżisti bħalissa, kif ġiet modifikata mill-utent l-ieħor.
-Il-Verżjoni bil-modifiki tiegħek jinsab fiż-żona ta' modifika inferjuri.
-Jekk trid il-modifiki tiegħek jiġu salvati, inti trid tgħaqqad il-modifiki tiegħek mat-test kif jeżisti bħalissa fiż-żona superjuri.
-Meta tagħfas ''Modifika'', se jiġi salvat '''biss''' it-test li jinsab fiż-żona superjuri.",
+'explainconflict' => "Utent ieħor biddel il-paġna meta inti kont qiegħed tagħmel il-modifiki tiegħek.
+Il-kaxxa tal-modifika ta' fuq turi t-test tal-paġna kif inhu bħalissa.
+Il-bidliet li għamilt huma fin-naħa t'isfel.
+Jekk trid il-modifiki tiegħek jiġu salvati, hemm bżonn li tgħaqqad il-modifiki personali ma' dawk eżistenti (fil-kaxxa ta' fuq)
+Meta tagħfas il-buttuna \"{{int:savearticle}}\", se jiġi salvat '''biss''' it-test li jinsab fil-kaxxa tal-modifika ta' fuq.",
'yourtext' => 'It-test tiegħek',
'storedversion' => 'Il-verżjoni maħżuna',
'nonunicodebrowser' => "'''TWISSIJA: Il-Browser tiegħek m'għandux sapport għal unicode.
@@ -914,9 +910,6 @@ Jekk inti tixtieq li l-kitba tiegħek ma tiġiex modifikata jew mqassma, jekk jo
Inti qiegħed ukoll qiegħed twiegħed li ktibt dan ix-xogħol int, jew ġibtu minn dominazzjoni pubblika jew resorsi b'xejn simili. (ara $1 għal aktar informazzjoni) <br />
<br />
'''TAGĦMILX MODIFIKI LI JINKLUDU XOGĦOL TA' ĦADDIEĦOR BLA PERMESS!'''",
-'longpagewarning' => "'''TWISSIJA: Din il-paġna hija $1 kb twila;
-ċerta browsers jista' jkollhom problemi biex jagħmlu modifiki lil paġni li qegħdin lejn jew aktar minn 32 kb.
-Jekk jogħġbok konsidra taqsam din il-paġna f'sezzjonijiet iż-żgħar.'''",
'longpageerror' => "'''PROBLEMA: Il-Modifika li għamilt hija twila $1 ''kilobyte'', li hija aktar mill-massimu ta' $2 ''kilobyte''. Il-Modifiki ma jistgħux jiġu salvati.'''",
'readonlywarning' => "'''TWISSIJA: Id-databażi ġiet imblukkata għall-manutenzjoni, u għaldaqstant m'huwiex possibbli li ssalva l-modifiki tiegħek dal-ħin. Biex ma titlifhomx, għalissa salva xogħlok ġo fajl u ġaladarba terġa' tinfetaħ id-databażi, ikkopja kollox. Grazzi.'''
@@ -1015,7 +1008,7 @@ Jista' jkun li ġiet imħassra mill-wiki, jew imsemmija mill-ġdid.
Prova [[Special:Search|fittex fuq il-wiki]] għal paġni relevanti ġodda.",
# Revision deletion
-'rev-deleted-comment' => '(tneħħa l-kumment)',
+'rev-deleted-comment' => '(tneħħija tat-taqsira)',
'rev-deleted-user' => '(l-isem tal-utent tneħħa)',
'rev-deleted-event' => '(azzjoni tal-log tneħħa)',
'rev-deleted-user-contribs' => '[isem tal-utent jew indirizz IP imneħħi - il-modifika ġie moħbiha mill-kronoloġija]',
@@ -1030,6 +1023,8 @@ Dettalji jistgħu jinstabu fuq ir-[{{fullurl:{{#Special:Log}}/suppress|page={{FU
Bħala amministratur inti tista' taraha; jista' jkun li hemm dettalji fir-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} reġistru tat-tħassir].",
'rev-suppressed-text-view' => "Ir-reviżjoni ta' din il-paġna ġiet '''imħassra'''.
Bħala amministratur inti xorta waħda tista' taraha; dettalji jistgħu jinstabu fuq ir-[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} reġistru tat-tħassir].",
+'rev-deleted-no-diff' => "Mhuwiex possibbli illi tara dan il-konfront bejn verżjonijiet differenti minħabba li waħda mir-reviżjonijiet ġiet '''imħassra'''.
+Ikkonsulta r-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} reġistru tat-tħassir] għal aktar dettalji.",
'rev-delundel' => 'uri/aħbi',
'rev-showdeleted' => 'uri',
'revisiondelete' => 'Ħassar/irkupra reviżjonijiet',
@@ -1263,6 +1258,7 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
'prefs-files' => 'Fajls',
'prefs-custom-css' => 'CSS personalizzat',
'prefs-custom-js' => 'JS personalizzat',
+'prefs-common-css-js' => 'CSS/JS maqsum għal kull aspett grafiku:',
'prefs-emailconfirm-label' => 'Konferma tal-ittra-e:',
'prefs-textboxsize' => 'Daqs tat-tieqa tal-modifika',
'youremail' => 'E-mail:',
@@ -1297,7 +1293,7 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
'prefs-advancedrendering' => 'Opzjonijiet avvanzati',
'prefs-advancedsearchoptions' => 'Opzjonijiet avvanzati',
'prefs-advancedwatchlist' => 'Opzjonijiet avvanzati',
-'prefs-display' => "Opzjonijiet ta' viżwalizazzjoni",
+'prefs-displayrc' => "Opzjonijiet ta' viżwalizazzjoni",
# User rights
'userrights' => 'Ä estjoni tad-drittijiet tal-utent',
@@ -1436,14 +1432,9 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
'recentchanges-legend' => 'Opzjonijiet tat-tibdil riċenti',
'recentchangestext' => 'Din il-paġna turi l-modifiki l-aktar riċenti għal kontenut tas-sit.',
'recentchanges-feed-description' => "Dan il-feed jirraporta l-modifiki l-aktar riċenti fil-kontenut ta' dan is-sit.",
-'recentchanges-label-legend' => 'Leġġenda: $1.',
-'recentchanges-legend-newpage' => '$1 - paġna ġdida',
'recentchanges-label-newpage' => 'Din il-modifika ħolqot paġna ġdida',
-'recentchanges-legend-minor' => '$1 - modifika minuri',
'recentchanges-label-minor' => 'Din hi modifika minuri',
-'recentchanges-legend-bot' => "$1 - modifika ta' bot",
'recentchanges-label-bot' => 'Din il-modifika Ä¡iet effettwata minn bot',
-'recentchanges-legend-unpatrolled' => '$1 - modifika mhux verifikata',
'recentchanges-label-unpatrolled' => 'Din il-modifika għadha ma ġietx verifikata',
'rcnote' => "Hawn taħt {{PLURAL:$1|tinsab l-aktar modifika riċenti|jinsabu l-'''$1''' modifiki riċenti}} għas-sit fl-aħħar {{PLURAL:$2|24 siegħa|'''$2''' ġranet}}, id-dati ġew aġġornati fil-$5 ta' $4.",
'rcnotefrom' => "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
@@ -1544,7 +1535,6 @@ Jekk jogħġbok mur lura u tella' dan il-fajl b'isem ġdid. [[File:$1|thumb|cent
'fileexists-shared-forbidden' => "Fajl b'dan l-isem diġà jeżisti fl-arkivju tar-riżorsi multimedjali maqsuma. Jekk tixtieq xorta waħda li ttella' l-fajl, mur lura u tella' fajl b'isem ġdid. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => "Dan il-fajl huwa duplikat ta' {{PLURAL:$1|dan il-fajl|dawn il-fajls}} segwenti:",
'file-deleted-duplicate' => "Fajl identiku għal dan ([[:$1]]) ġie mħassar fil-passat. Iċċekja qabel xejn il-kronoloġija tat-tħassir qabel ma tkompli ttella' l-fajl.",
-'successfulupload' => "Mtella' b'suċċess",
'uploadwarning' => 'Twissija dwar it-tlugħ tal-fajls',
'savefile' => 'Salva l-fajl',
'uploadedimage' => 'tella\' "[[$1]]"',
@@ -1582,6 +1572,9 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- ħalli din il-linja eżattament kif inhi -->',
+'upload-success-subj' => "Mtella' b'suċċess",
+'upload-success-msg' => 'It-tlugħ tal-fajl minn [$2] irnexxa. Il-fajl tiegħek huwa disponibbli hawnhekk: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem fit-tlugħ tal-fajl',
'upload-proto-error' => 'Protocol ħażin',
'upload-proto-error-text' => "Għal upload remote huwa neċessarju tispeċifika l-URL li jibda' b'<code>http://</code> jew <code>ftp://</code>.",
@@ -1720,7 +1713,6 @@ Daħħal: tip/sottotip, eż. <tt>image/jpeg</tt>.",
'statistics-edits-average' => "Medja ta' modifiki għal kull paġna",
'statistics-views-total' => "Total ta' viżti",
'statistics-views-peredit' => 'Viżti għal kull modifika',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Kju tax-xogħlijiet] li jridu jiġu esegwiti fl-isfond',
'statistics-users' => '[[Special:ListUsers|Utenti]] reġistrati',
'statistics-users-active' => 'Utenti attivi',
'statistics-mostpopular' => 'Il-paġni l-aktar miżjura',
@@ -1863,6 +1855,7 @@ Ara wkoll il-[[Special:WantedCategories|kategoriji rikjesti]].',
'listusersfrom' => 'Uri utenti li jibdew minn:',
'listusers-submit' => 'Uri',
'listusers-noresult' => 'l-Ebda utent insab għal din il-kriterja.',
+'listusers-blocked' => '(imblukkat)',
# Special:ActiveUsers
'activeusers' => 'Lista tal-utenti attivi',
@@ -1915,7 +1908,6 @@ Jista' jkun hemm [[{{MediaWiki:Listgrouprights-helppage}}|aktar informazzjoni]]
# Watchlist
'watchlist' => "Lista ta' osservazzjoni tiegħi",
'mywatchlist' => 'li qed insegwi',
-'watchlistfor' => "(għal '''$1''')",
'nowatchlist' => "Il-lista ta' osservazzjoni tiegħek hija vojta.",
'watchlistanontext' => "Sabiex tara u timmodifika l-lista ta' osservazzjoni tiegħek, hemm bżonn li $1.",
'watchnologin' => 'Għadek ma dħaltx ġewwa',
@@ -2031,7 +2023,9 @@ L-iktar modifika riċenti fuq dil-paġna saret minn [[User:$3|$3]] ([[User talk:
'revertpage' => "Modifiki mneħħa minn [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) għall-aħħar verżjoni ta' [[User:$1|$1]]",
'rollback-success' => "Modifiki mneħħa ta' $1;
Modifikata lura għall-aħħar verżjoni ta' $2.",
-'sessionfailure' => "Ġie verifikat problema fis-sessjoni tal-aċċess; din l-azzjoni ġiet imħassra bħalha prekawzjoni. Mur lura fil-paġna preċedenti bl-użu tal-buttuna 'Lura' tal-browser, niżżel il-paġna mill-ġdid u erġa' prova.",
+
+# Edit tokens
+'sessionfailure' => "Ġie verifikat problema fis-sessjoni tal-aċċess; din l-azzjoni ġiet imħassra bħalha prekawzjoni. Mur lura fil-paġna preċedenti bl-użu tal-buttuna 'Lura' tal-browser, niżżel il-paġna mill-ġdid u erġa' prova.",
# Protect
'protectlogpage' => 'Protezzjoni',
@@ -2107,6 +2101,7 @@ Int jista' jkollhok link ħażin, jew jista' jkun li ir-reviżjoni ġie rkuprat
'undelete-nodiff' => 'L-ebda reviżjoni preċedenti ma ġiet misjuba.',
'undeletebtn' => 'Irkupra',
'undeletelink' => 'uri/irkupra',
+'undeleteviewlink' => 'uri',
'undeletereset' => 'Irrisettja',
'undeleteinvert' => 'Inverti s-selezzjoni',
'undeletecomment' => 'Raġuni:',
@@ -2219,7 +2214,6 @@ Ara l-[[Special:IPBlockList|lista tal-IP imblukkati]] biex tara l-blokki attivi.
'ipb-edit-dropdown' => 'Immodifika r-raġunijiet tal-imblukkar',
'ipb-unblock-addr' => 'Żblokkja $1',
'ipb-unblock' => 'Żblokka isem tal-utent jew indirizz IP',
-'ipb-blocklist-addr' => 'Uri l-blokki attivi għal $1',
'ipb-blocklist' => 'Uri l-blokki eżistenti',
'ipb-blocklist-contribs' => "Kontribuzzjonijiet ta' $1",
'unblockip' => 'Żblokkja l-utent',
@@ -2257,35 +2251,38 @@ Ara l-[[Special:IPBlockList|lista tal-IP imblukkati]] biex tara l-blokki attivi.
'block-log-flags-nocreate' => 'ħolqien tal-kont imblukkat',
'block-log-flags-noautoblock' => 'blokkar awtomatiku disattivat',
'block-log-flags-noemail' => 'posta elettronika imblukkata',
+'block-log-flags-nousertalk' => "ma jistax jimmodifika l-paġna ta' diskussjoni personali",
'block-log-flags-angry-autoblock' => 'blokkar awtomatiku avvanzat attivat',
'block-log-flags-hiddenname' => 'l-isem tal-utent huwa moħbi',
-'range_block_disabled' => "Il-Possibilitá li timblokka intervali ta' indirizzi tal-IP mhux attiva bħalissa.",
+'range_block_disabled' => "Il-possibilità li timblokka firxa ta' indirizzi IP mhux attiva bħalissa.",
'ipb_expiry_invalid' => "Il-ħin ta' skadenza huwa invalidu.",
-'ipb_expiry_temp' => "Blokkijiet ta' ismijiet ta' l-utent moħbija rridu jkunu permanenti.",
-'ipb_already_blocked' => 'L-utent "$1" diġà bblokkjat',
+'ipb_expiry_temp' => "Blokkijiet ta' ismijiet ta' l-utent moħbija jridu jkunu permanenti.",
+'ipb_hide_invalid' => "Ma jistax jitneħħa l-kont; jista' jkun li għandu ħafna modifiki.",
+'ipb_already_blocked' => 'L-utent "$1" diġà imblukkat',
'ipb-needreblock' => '== Diġà imblukkat ==
L-utent $1 hu diġà imblukkat. Trid tbiddel l-impostazzjonijet?',
'ipb-otherblocks-header' => '{{PLURAL:$1|Blokk ieħor|Blokki oħra}}',
'ipb_cant_unblock' => 'Problema: Impossibli ssib il-blokk bl-ID $1. L-Imblokk setgħa jkun ġa sblokkat.',
'ipb_blocked_as_range' => "Problema: L-Indirizz tal-IP $1 ma jistax jiġi blokkat waħdu u ma jistax jiġi sblokkat. L-Imblokk huwa attiv però f'livell ta' interval $2, li jista' jkun sblokkat.",
'ip_range_invalid' => "Interval ta' indirizzi ta' IP mhux validi.",
+'ip_range_toolarge' => "Mhumiex permessi firxa ta' blokki ikbar minn /$1.",
'blockme' => 'Imblukkani',
'proxyblocker' => "Blokki ta' proxy miftuħa",
'proxyblocker-disabled' => 'Din il-funzjoni mhijiex attivata.',
-'proxyblockreason' => "L-Indirizz tal-IP tiegħek ġie bblokkjat peress li huwa proxy miftuħ.
-Jekk jogħġbok, ikkuntattja lill-provdituri tas-servizz tal-internet jew lis-support tekniku tiegħek u informahom b'din il-problema serja ta' sigurtà.",
-'proxyblocksuccess' => 'Blokkjat.',
-'sorbsreason' => "L-Indirizz tal-IP tiegħek huwa mniżżel bħala proxy miftuħ fil-DNSBL ta' {{SITENAME}}.",
-'sorbs_create_account_reason' => 'Mhux possibli toħloq aċċessi ġodda minn dan l-indirizz tal-IP minħabba li huwa mniżżel bħala proxy miftuħ fil-DNSBL użat minn {{SITENAME}}.',
+'proxyblockreason' => "L-indirizz IP tiegħek ġie imblukkat peress li huwa proxy miftuħ. Jekk jogħġbok, ikkuntattja lill-provdituri tas-servizz tal-internet (ISP) jew lis-''support'' tekniku tiegħek u infurmahom b'din il-problema serja ta' sigurtà.",
+'proxyblocksuccess' => 'Blokk esegwit.',
+'sorbsreason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}.',
+'sorbs_create_account_reason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}. Ma tistax toħloq kont.',
'cant-block-while-blocked' => 'Ma tistax timblokka lil utenti oħra waqt li inti mblukkat.',
-'cant-see-hidden-user' => 'L-utent li qiegħed tipprova timblokk diġà ġie imblukkat u moħbi.
+'cant-see-hidden-user' => 'L-utent li qiegħed tipprova timblokka diġà ġie imblukkat u moħbi.
Minħabba li inti m\'għandikx id-dritt li "taħbi \'l-utent", ma tistax tara jew timmodifika l-blokk tal-utent.',
+'ipbblocked' => 'Ma tistax timblokka jew tiżblokka utenti oħra, minħabba li inti stess tinsab imblukkat',
+'ipbnounblockself' => "M'għandekx il-permess li tiżblokka lilek innifsek",
# Developer tools
-'lockdb' => 'Agħlaq id-database',
-'unlockdb' => 'Iftaħ id-database',
-'lockdbtext' => "Tagħlaq id-database se jisuspendi l-abbilitá ta' kull utent li jagħmlu modifiki fil-paġni, modifika l-preferenzi tagħhom, modifika l-osservazzjonijiet speċjali tagħhom, u affarijiet oħra li għadnhom bżonn modifika fid-database.
-Jekk jogħġbok konferma li dan huwa li tixtieq li tagħmel, u li se tiftaħ id-database wara li l-manteniment ikun lest.",
+'lockdb' => 'Agħlaq id-databażi',
+'unlockdb' => 'Iftaħ id-databażi',
+'lockdbtext' => "L-imblukkar tad-databażi iwassal għall-interuzzjoni, għall-utenti kollha, tal-possibilità li jimmodifikaw il-paġni jew li joħolqu oħrajn ġodda, li jbiddlu l-preferenzi tagħhom u jimmodifikaw l-elenki tal-paġni taħt osservazzjoni, u ġeneralment kull operazzjoni li għandha bżonn ta' modifiki fid-databażi. Jekk jogħġbok, ikkonferma li dan jikkorispondi effettivament għall-azzjoni li ġie rikjesta għalik u li fi tmiem il-manuntenzjoni terġa' tiżblokka d-databażi.",
'unlockdbtext' => "Tiftaħ id-database se jirkupra l-abbilità ta' kull utent li jagħmlu modifiki mill-ġdid, jagħmlu modifiki fil-preferenzi, modifiki fl-osservazzjonijiet speċjali, u affarijiet oħra li għandhom bżonn modifika fid-database.
Jekk jogħġbok konferma mill-ġdid li dan huwa li tixtieq li tagħmel.",
'lockconfirm' => 'Iva, ċert li rrid nagħlaq id-database.',
@@ -2344,7 +2341,7 @@ Jekk jogħġbok, waħħad iż-żewġ paġni manwalment.'''",
'1movedto2' => '[[$1]] tmexxa lejn [[$2]]',
'1movedto2_redir' => "[[$1]] tmexxa lejn [[$2]] permezz ta' riindirizzament",
'move-redirect-suppressed' => 'rindirizz mrażżan',
-'movelogpage' => 'ÄŠaqlieq',
+'movelogpage' => "Reġistru tat-tmexxija ta' paġni",
'movelogpagetext' => "Hawn taħt jinsab lista ta' paġni mċaqilqa.",
'movesubpage' => '{{PLURAL:$1|Sottopaġna|Sottopaġna}}',
'movenosubpage' => "Din il-paġna m'għandha l-ebda sottopaġna.",
@@ -2643,10 +2640,10 @@ $1',
'imagemaxsize' => "Daqs massimu tal-istampa:<br />''(għall-paġni ta' deskrizzjoni tal-fajl)''",
'thumbsize' => 'Daqs tal-minjatura:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|paġna|paġni}}',
-'file-info' => "(Dimensjoni: $1, tip ta' MIME: $2)",
-'file-info-size' => "($1 × $2 pixel, dimensjoni: $3, tip ta' MIME: $4)",
+'file-info' => "Dimensjoni: $1, tip ta' MIME: $2",
+'file-info-size' => "$1 × $2 pixel, dimensjoni: $3, tip ta' MIME: $4",
'file-nohires' => "<small>Mhux disponibli verżjonijiet b'risoluzzjoni akbar.</small>",
-'svg-long-desc' => '(Fajl fil-format SVG, dimensjoni nominali $1 × $2 pixel, dimensjoni tal-fajl: $3)',
+'svg-long-desc' => 'Fajl fil-format SVG, dimensjoni nominali $1 × $2 pixel, dimensjoni tal-fajl: $3',
'show-big-image' => "Verżjoni b'risoluzzjoni sħiħa",
'show-big-image-thumb' => '<small>Dimensjoni tal-previżjoni: $1 × $2 pixel</small>',
@@ -3169,10 +3166,20 @@ Daħħal l-isem tal-fajl mingħajr il-prefiss \"{{ns:file}}:\".",
'tag-filter-submit' => 'Filtru',
'tags-edit' => 'editja',
+# Special:ComparePages
+'comparepages' => 'Qabbel il-paġni',
+'compare-selector' => "Ikkumpara reviżjonijiet ta' paġna",
+'compare-page1' => 'Paġna 1',
+'compare-page2' => 'Paġna 2',
+'compare-rev1' => 'Reviżjoni 1',
+'compare-rev2' => 'Reviżjoni 2',
+'compare-submit' => 'Qabbel',
+
# Database error messages
'dberr-header' => 'Din il-wiki għandha problema',
'dberr-problems' => 'Jiddispjaċina! Dan is-sit għandu diffikultajiet tekniċi.',
'dberr-again' => "Prova stenna ftit minuti u erġa' tella' l-paġna.",
+'dberr-info' => '(Impossibbli li jsir kuntratt mas-server tad-databażi: $1)',
# HTML forms
'htmlform-invalid-input' => "Hemm xi problemi f'dak li daħħalt",
diff --git a/languages/messages/MessagesMwl.php b/languages/messages/MessagesMwl.php
index f01d6770..0eac51ba 100644
--- a/languages/messages/MessagesMwl.php
+++ b/languages/messages/MessagesMwl.php
@@ -93,8 +93,7 @@ $messages = array(
'tog-editsection' => "Possiblitar l'eidiçon de cachos cun lhigaçones [eiditar]",
'tog-editsectiononrightclick' => "Posseblitar l'eidiçon de cachos por clique cul boton dreito ne l títalo de la seçon (JavaScrit)",
'tog-showtoc' => 'Amostrar índice (para páiginas cun mais de trés cachos)',
-'tog-rememberpassword' => 'Recordar la mie palabra-chabe antre sessones',
-'tog-editwidth' => "Oumentar l'anchura de la caixa d'eidiçon para prencher toda la pantalha",
+'tog-rememberpassword' => 'Recordar la mie palabra-chabe antre sessones (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Ajuntar las páiginas que you criar a las minhas páiginas begiadas',
'tog-watchdefault' => 'Ajuntar las páiginas que you eiditar a las minhas páiginas begiadas',
'tog-watchmoves' => ' Ajuntar las páiginas que you mober a las minhas páiginas begiadas',
@@ -374,7 +373,7 @@ Puode tener un ó mais carateres que nun puoden ser outelizados an títalos.',
'yourname' => 'Nome de Outelizador',
'yourpassword' => 'Palabra chabe',
'yourpasswordagain' => 'Repite la tue palabra-chabe',
-'remembermypassword' => 'Lhembrar-se de mi neste cumputador',
+'remembermypassword' => 'Lhembrar-se de mi neste cumputador (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'L tou domínio',
'login' => 'Antrar',
'nav-login-createaccount' => 'Antrar / criar cuonta',
@@ -494,9 +493,6 @@ Tu puodes [[Special:Search/{{PAGENAME}}|percurar pul títalo desta páigina]] no
'copyrightwarning' => "Por fabor, bei que todas las tues cuntribuiçones an {{SITENAME}} son cunsideradas cumo feitas ne ls termos de la lhicença $2 (bei $1 pa detailhes). Se nun quieres que l tou testo seia eiditado sin piedade i reçtribuído cunsante la gana, nun l ambies.<br />
Tu stás, al mesmo tiempo, a garantir-mos qu'esto ye algo screbido por ti, ó algo copiado d'ua fuonte de testos an domínio público ó parecido de teor lhibre.
'''NUN AMBIES TRABALHO PORTEGIDO POR DREITOS D'OUTOR SIEN L DEBIDO PERMISSO!'''",
-'longpagewarning' => "'''Abiso: Esta páigina ten$1 kilobytes; alguns
-nabegadores de la anternete ténen porblemas al eiditar páiginas cun mais de 32 kb.
-Por fabor, pensa an scachar la páigina an cachos mais pequeinhos.'''",
'templatesused' => '{{PLURAL:$1|Modelo ousado|Modelos ousados}} nesta páigina:',
'templatesusedpreview' => '{{PLURAL:$1|Modelo outelizado|Modelos outelizados}} neste amostra:',
'template-protected' => '(portegida)',
@@ -671,8 +667,6 @@ Causo l çponiblizes, este será outelizado pa te dar crédito pul tou trabalho.
'recentchanges' => 'Redadeiras altaraçones',
'recentchanges-legend' => 'Oupçones de las redadeiras altaraçones',
'recentchanges-feed-description' => 'Acumpanha las redadeiras altaraçones de l biqui por esta semiente.',
-'recentchanges-legend-newpage' => '$1 - nuoba páigina',
-'recentchanges-legend-minor' => '$1 - eidiçon pequerrixa',
'rcnote' => "A seguir {{PLURAL:$1|stá listada '''ua''' altaraçon feita|stan '''$1''' altaraçones feitas}} {{PLURAL:$2|ne l redadeiro die|ne ls redadeiros '''$2''' dies}}, a partir de las $5 de $4.",
'rcnotefrom' => 'Alteraçones feitas zde <b>$2</b> (amostradas até <b>$1</b>).',
'rclistfrom' => 'Amostrar las noubas altaraçones a partir de $1',
@@ -879,7 +873,6 @@ Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an
# Watchlist
'watchlist' => 'Ls mius begiados',
'mywatchlist' => 'Las mies páiginas begiadas',
-'watchlistfor' => "(para '''$1''')",
'addedwatch' => 'Ajuntada a las páiginas begiadas',
'addedwatchtext' => "La páigina \"[[:\$1]]\" fui ajuntada a la tue [[Special:Watchlist|lista de páiginas begiadas]].
Altaraçones feturas na tal páigina i páiginas de çcusson a eilha associadas seran listadas alhá, cun la páigina aparecendo a '''negrito''' na [[Special:RecentChanges|lista de redadeiras altaraçones]], para que se pouda ancuntrar cun maior facelidade.",
@@ -1127,9 +1120,9 @@ Premite ajuntar la rezon de la eidiçon ne l sumário.',
'nextdiff' => 'Redadeira eidiçon →',
# Media information
-'file-info-size' => '($1 × $2 pixel, tamanho: $3, tipo MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, tamanho: $3, tipo MIME: $4',
'file-nohires' => '<small>Sin resoluçon maior çponible.</small>',
-'svg-long-desc' => '(fexeiro SVG, de $1 × $2 pixeles, tamanho: $3)',
+'svg-long-desc' => 'fexeiro SVG, de $1 × $2 pixeles, tamanho: $3',
'show-big-image' => 'Resoluçon cumpleta',
'show-big-image-thumb' => '<small>Tamanho desta prebison: $1 × $2 pixeles</small>',
diff --git a/languages/messages/MessagesMy.php b/languages/messages/MessagesMy.php
index c3083e50..d17fafb9 100644
--- a/languages/messages/MessagesMy.php
+++ b/languages/messages/MessagesMy.php
@@ -20,6 +20,7 @@
* @author Purodha
* @author Thanlwin
* @author Thitaung
+ * @author Umherirrender
* @author Zawthet
* @author ကိုရာá€á€®
*/
@@ -43,14 +44,14 @@ $datePreferences = array(
'my long',
'ISO 8601',
);
-
+
$defaultDateFormat = 'my normal';
-
+
$dateFormats = array(
'my normal time' => 'H:i',
'my normal date' => 'j F Y',
'my normal both' => ' H:i"áŠ" j F Y',
-
+
'my long time' => 'H:i',
'my long date' => 'Y "ဇန်နá€á€«á€›á€®" F"လ" j "ရက်"',
'my long both' => 'H:i"áŠ" Y "ဇန်နá€á€«á€›á€®" F"လ" j "ရက်"',
@@ -68,7 +69,7 @@ $messages = array(
'tog-numberheadings' => 'á€á€±á€«á€„်းစဉ်များ အား စေ့ဆော်á€á€»á€€á€ºá€¡á€á€­á€¯á€„်း လုပ်ဆောင်ရန်',
'tog-showtoolbar' => 'ပြုပြင်ရန် ကိရိယာများ (JavaScript လိုအပ်သည်)',
'tog-editondblclick' => 'ကလစ်နှစ်á€á€«á€”ှိပ်လျှင် စာမျက်နှာအားပြုပြင်ပါ (JavaScript လိုအပ်သည်)',
-'tog-rememberpassword' => 'ဤ​ကွန်​ပျူ​á€á€¬â€‹á€á€½á€„်​ကျွန်​á€á€±á€¬á€·â€‹á€€á€­á€¯â€‹á€™á€¾á€á€ºâ€‹á€‘ား​ပါ​',
+'tog-rememberpassword' => 'ဤကွန်ပျူá€á€¬á€á€½á€„် ကျွန်ုပ်ကိုမှá€á€ºá€‘ားရန် (အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}ကြာ)',
'tog-watchcreations' => 'ကျွန်ုပ်စá€á€„်ရေးသားá€á€²á€·á€žá€Šá€·á€ºá€…ာမျက်နှာများကို စောင့်​ကြည့်​စာ​ရင်း​ထဲ ပေါင်းထည့်ပါ',
'tog-watchdefault' => 'ကျွန်ုပ် á€á€Šá€ºá€¸á€–ြá€á€ºá€á€²á€·á€žá€Šá€·á€º စာမျက်နှာများကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ပါá‹',
'tog-watchmoves' => 'ကျွန်ုပ်ရွှေ့လိုက်သော စာမျက်နှာများကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်',
@@ -83,6 +84,7 @@ $messages = array(
'tog-enotifrevealaddr' => ' အသိပေးá€á€»á€€á€ºá€¡á€®á€¸á€™á€±á€¸á€™á€»á€¬á€¸á€á€½á€„် ကျွန်ုပ်á အီးမေးလိပ်စာကို ဖော်ပြရန်',
'tog-shownumberswatching' => 'စောင့်ကြည့်နေသော အသုံးပြုသူအရေအá€á€½á€€á€ºá€€á€­á€¯ ပြရန်',
'tog-oldsig' => 'ရှိနှင့်ပြီးသား လက်မှá€á€ºá နမူနာ -',
+'tog-forceeditsummary' => 'á€á€Šá€ºá€¸á€–ြá€á€ºá€¡á€á€­á€¯á€á€»á€¯á€•á€º ဗလာဖြစ်နေလျှင် သá€á€­á€•á€±á€¸á€›á€”်',
'tog-watchlisthideown' => 'ကျွန်ုပ်á á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€¯á€™á€»á€¬á€¸á€€á€­á€¯ စောင့်ကြည့်စာရင်းမှ á€á€¾á€€á€ºá€‘ားရန်',
'tog-watchlisthidebots' => 'ဘော့á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€¯á€™á€»á€¬á€¸á€€á€­á€¯ စောင့်ကြည့်စာရင်းမှ á€á€¾á€€á€ºá€‘ားရန်',
'tog-watchlisthideminor' => 'အရေးမကြီးသော á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€¯á€™á€»á€¬á€¸á€€á€­á€¯ စောင့်ကြည့်စာရင်းမှ á€á€¾á€€á€ºá€‘ားရန်',
@@ -195,29 +197,20 @@ $messages = array(
'faqpage' => 'Project:မေးလေ့ရှိကြသည်များ',
# Vector skin
-'vector-action-addsection' => 'အကြောင်းအရာအသစ် ထပ်ထည့်ရန်',
-'vector-action-delete' => 'ဖျက်​ပါ​',
-'vector-action-move' => 'ရွှေ့ပါ',
-'vector-action-protect' => 'ထိမ်း​သိမ်း​ပါ​',
-'vector-action-undelete' => 'မဖျက်á€á€±á€¬á€·á€›á€”်',
-'vector-action-unprotect' => 'မကာကွယ်á€á€±á€¬á€·á€›á€”်',
-'vector-namespace-image' => 'ဖိုင်',
-'vector-namespace-main' => 'စာမျက်နှာ',
-'vector-namespace-media' => 'မီဒီယာ စာမျက်နှာ',
-'vector-namespace-mediawiki' => 'စာသား',
-'vector-namespace-project' => 'ပရောဂျက်စာမျက်နှာ',
-'vector-namespace-special' => 'အထူးစာမျက်နှာ',
-'vector-namespace-talk' => 'ဆွေးနွေးá€á€»á€€á€ºá€™á€»á€¬á€¸',
-'vector-namespace-template' => 'á€á€™á€ºá€¸á€•á€œá€­á€á€º',
-'vector-namespace-user' => 'အ​သုံး​ပြု​သူ​á ​စာ​မျက်​နှာ​',
-'vector-view-create' => 'စá€á€„်ရေးသားရန်',
-'vector-view-edit' => 'ပြင်ရန်',
-'vector-view-history' => 'ရာဇá€á€„်ကြည့်ရန်',
-'vector-view-view' => 'ဖá€á€ºá€›á€”်',
-'vector-view-viewsource' => 'ရင်းမြစ်ကို ကြည့်ရန်',
-'actions' => 'ဆောင်ရွက်á€á€»á€€á€ºá€™á€»á€¬á€¸',
-'namespaces' => 'အမည်ညွှန်းများ',
-'variants' => 'အမျိုးမျိုးအပြားပြား',
+'vector-action-addsection' => 'အကြောင်းအရာအသစ် ထပ်ထည့်ရန်',
+'vector-action-delete' => 'ဖျက်​ပါ​',
+'vector-action-move' => 'ရွှေ့ပါ',
+'vector-action-protect' => 'ထိမ်း​သိမ်း​ပါ​',
+'vector-action-undelete' => 'မဖျက်á€á€±á€¬á€·á€›á€”်',
+'vector-action-unprotect' => 'မကာကွယ်á€á€±á€¬á€·á€›á€”်',
+'vector-view-create' => 'စá€á€„်ရေးသားရန်',
+'vector-view-edit' => 'ပြင်ရန်',
+'vector-view-history' => 'ရာဇá€á€„်ကြည့်ရန်',
+'vector-view-view' => 'ဖá€á€ºá€›á€”်',
+'vector-view-viewsource' => 'ရင်းမြစ်ကို ကြည့်ရန်',
+'actions' => 'ဆောင်ရွက်á€á€»á€€á€ºá€™á€»á€¬á€¸',
+'namespaces' => 'အမည်ညွှန်းများ',
+'variants' => 'အမျိုးမျိုးအပြားပြား',
'errorpagetitle' => 'အမှား',
'returnto' => '$1 သို့ ပြန်သွားရန်á‹',
@@ -273,6 +266,7 @@ $messages = array(
'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' => '{{SITENAME}} အကြောင်း',
@@ -296,6 +290,10 @@ $messages = array(
'badaccess' => 'á€á€½á€„့်ပြုá€á€»á€€á€ºá€™á€¾ အမှား',
+'versionrequired' => 'မီဒီယာá€á€®á€€á€®á€—ာရှင်း $1 လိုအပ်သည်',
+'versionrequiredtext' => 'ဤစာမျက်နှာကို ကြည့်ရန် မီဒီယာá€á€®á€€á€®á€—ာရှင်း $1 လိုအပ်သည်á‹
+[[Special:Version|ဗားရှင်းစာမျက်နှာ]]ကို ကြည့်ပါá‹',
+
'ok' => 'အိုကေ',
'retrievedfrom' => '"$1" မှ ရယူရန်',
'youhavenewmessages' => 'သင့်á€á€½á€„် $1 ($2) ရှိသည်á‹',
@@ -367,59 +365,61 @@ $messages = array(
'virus-unknownscanner' => 'အမည်မသိအန်á€á€®á€—ိုင်းရပ်စ် -',
# Login and logout pages
-'welcomecreation' => '== မင်္ဂလာပါ $1! ==
+'welcomecreation' => '== မင်္ဂလာပါ $1! ==
သင့်အကောင့်ကို ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€•á€«á€•á€¼á€®á‹
[[Special:Preferences|{{SITENAME}} စိá€á€ºâ€‹á€€á€¼á€­á€¯á€€á€ºâ€‹á€›á€½á€±á€¸á€á€»á€šá€ºá€…ရာá€á€­á€¯á€·]]ကို ပြောင်းရန် မမေ့ပါနှင့်á‹',
-'yourname' => 'အသုံးပြုသူအမည် -',
-'yourpassword' => 'စကားá€á€¾á€€á€º -',
-'yourpasswordagain' => 'စကားá€á€¾á€€á€º ပြန်​ရိုက်​ပါ -',
-'remembermypassword' => 'ဤ​ကွန်​ပျူ​á€á€¬â€‹á€á€½á€„်​ကျွန်​á€á€±á€¬á€·â€‹á€€á€­á€¯â€‹á€™á€¾á€á€ºâ€‹á€‘ား​ပါ​',
-'yourdomainname' => 'သင့်ဒိုမိန်း -',
-'login' => 'Log in á€á€„်ရန်',
-'nav-login-createaccount' => 'Log in á€á€„်ရန်/ အကောင့် လုပ်ရန်',
-'userlogin' => 'Log in á€á€„်ရန်/ အကောင့် လုပ်ရန်',
-'userloginnocreate' => 'Log in á€á€„်ရန်',
-'logout' => 'Log out ထွက်ရန်',
-'userlogout' => 'Log out ထွက်ရန်',
-'notloggedin' => 'logged in á€á€„်မထားပါ',
-'nologin' => 'အကောင့်မရှိဘဲ ဖြစ်နေပါသလားዠ$1á‹',
-'nologinlink' => 'အကောင့်လုပ်ရန်',
-'createaccount' => 'အကောင့်လုပ်ရန်',
-'gotaccount' => 'အကောင့်ရှိပြီးသားလားዠ$1á‹',
-'gotaccountlink' => 'Log in á€á€„်ရန်',
-'createaccountmail' => 'အီးမေးဖြင့်',
-'badretype' => 'သင်ထည့်သွင်းလိုက်သော စကားá€á€¾á€€á€ºá€™á€»á€¬á€¸ ကိုက်ညီမှု မရှိပါá‹',
-'userexists' => 'သင်ရွေးသော အသုံးပြုသူအမည်မှာ ရှိပြီးဖြစ်သည်á‹
+'yourname' => 'အသုံးပြုသူအမည် -',
+'yourpassword' => 'စကားá€á€¾á€€á€º -',
+'yourpasswordagain' => 'စကားá€á€¾á€€á€º ပြန်​ရိုက်​ပါ -',
+'remembermypassword' => 'ဤ​ကွန်​ပျူ​á€á€¬â€‹á€á€½á€„်​ ကျွနု်ပ်ကို​မှá€á€ºâ€‹á€‘ား​ရန် (အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}ကြာ)',
+'yourdomainname' => 'သင့်ဒိုမိန်း -',
+'login' => 'Log in á€á€„်ရန်',
+'nav-login-createaccount' => 'Log in á€á€„်ရန်/ အကောင့် လုပ်ရန်',
+'userlogin' => 'Log in á€á€„်ရန်/ အကောင့် လုပ်ရန်',
+'userloginnocreate' => 'Log in á€á€„်ရန်',
+'logout' => 'Log out ထွက်ရန်',
+'userlogout' => 'Log out ထွက်ရန်',
+'notloggedin' => 'logged in á€á€„်မထားပါ',
+'nologin' => 'အကောင့်မရှိဘဲ ဖြစ်နေပါသလားዠ$1á‹',
+'nologinlink' => 'အကောင့်လုပ်ရန်',
+'createaccount' => 'အကောင့်လုပ်ရန်',
+'gotaccount' => 'အကောင့်ရှိပြီးသားလားዠ$1á‹',
+'gotaccountlink' => 'Log in á€á€„်ရန်',
+'createaccountmail' => 'အီးမေးဖြင့်',
+'createaccountreason' => 'အ​ကြောင်း​ပြ​á€á€»á€€á€º -',
+'badretype' => 'သင်ထည့်သွင်းလိုက်သော စကားá€á€¾á€€á€ºá€™á€»á€¬á€¸ ကိုက်ညီမှု မရှိပါá‹',
+'userexists' => 'သင်ရွေးသော အသုံးပြုသူအမည်မှာ ရှိပြီးဖြစ်သည်á‹
အá€á€¼á€¬á€¸ အမည် ရွေးပါá‹',
-'loginerror' => 'Login á€á€„်á€á€¼á€„်း အမှား',
-'createaccounterror' => 'ဤအကောင့်ကို မဖန်á€á€®á€¸á€”ိုင်ပါ - $1',
-'noname' => 'á€á€›á€¬á€¸á€á€„် အသုံးပြုသူအမည်ကို မသá€á€ºá€™á€¾á€á€ºá€›á€žá€±á€¸á€•á€«á‹',
-'loginsuccesstitle' => 'Login á€á€„်​á€á€¼á€„်း အောင်မြင်သည်á‹',
-'loginsuccess' => "'''သင်သည် {{SITENAME}} သို့ \"\$1\" အဖြစ် Login á€á€„်ပြီးဖြစ်သည်á‹'''",
-'nosuchusershort' => '"<nowiki>$1</nowiki>" အမည်ဖြင့် အသုံးပြုသူမရှိပါá‹
+'loginerror' => 'Login á€á€„်á€á€¼á€„်း အမှား',
+'createaccounterror' => 'ဤအကောင့်ကို မဖန်á€á€®á€¸á€”ိုင်ပါ - $1',
+'noname' => 'á€á€›á€¬á€¸á€á€„် အသုံးပြုသူအမည်ကို မသá€á€ºá€™á€¾á€á€ºá€›á€žá€±á€¸á€•á€«á‹',
+'loginsuccesstitle' => 'Login á€á€„်​á€á€¼á€„်း အောင်မြင်သည်á‹',
+'loginsuccess' => "'''သင်သည် {{SITENAME}} သို့ \"\$1\" အဖြစ် Login á€á€„်ပြီးဖြစ်သည်á‹'''",
+'nosuchusershort' => '"<nowiki>$1</nowiki>" အမည်ဖြင့် အသုံးပြုသူမရှိပါá‹
စာလုံးပေါင်း ပြန်စစ်ပေးပါရန်á‹',
-'nouserspecified' => 'အသုံးပြုသူအမည်ကို ဖော်ပြရမည်ဖြစ်သည်á‹',
-'login-userblocked' => 'ဤအသုံးပြုသူကို ပိá€á€ºá€•á€„်ထားသည်ዠLogin á€á€„်á€á€¼á€„်း á€á€½á€„့်မပြုပါá‹',
-'wrongpassword' => 'စကားá€á€¾á€€á€ºá€¡á€™á€¾á€¬á€¸á€‘ည့်ထားသည်á‹
+'nouserspecified' => 'အသုံးပြုသူအမည်ကို ဖော်ပြရမည်ဖြစ်သည်á‹',
+'login-userblocked' => 'ဤအသုံးပြုသူကို ပိá€á€ºá€•á€„်ထားသည်ዠLogin á€á€„်á€á€¼á€„်း á€á€½á€„့်မပြုပါá‹',
+'wrongpassword' => 'စကားá€á€¾á€€á€ºá€¡á€™á€¾á€¬á€¸á€‘ည့်ထားသည်á‹
ကျေးဇူးပြုá ပြန်ကြိုးစားကြည့်ပါá‹',
-'wrongpasswordempty' => 'စကားá€á€¾á€€á€ºá€‘ည့်ရမည်နေရာ ဗလာဖြစ်နေသည်á‹
+'wrongpasswordempty' => 'စကားá€á€¾á€€á€ºá€‘ည့်ရမည်နေရာ ဗလာဖြစ်နေသည်á‹
ကျေးဇူးပြုá ပြန်ကြိုးစားကြည့်ပါá‹',
-'passwordtooshort' => 'စကားá€á€¾á€€á€ºá€á€½á€„် စကားလုံး အနည်းဆုံး {{PLURAL:$1|á€á€…်လုံး|$1 လုံး}} ရှိရမည်á‹',
-'password-name-match' => 'သင့်စကားá€á€¾á€€á€ºá€žá€Šá€º အသုံးပြုသူအမည်နှင့် အá€á€°á€á€°á€™á€–ြစ်စေရဘဲ ကွဲပြားရမည်á‹',
-'mailmypassword' => 'စကားá€á€¾á€€á€ºá€¡á€žá€…်ကို အီးမေး ပို့ရန်',
-'passwordremindertitle' => '{{SITENAME}} အá€á€½á€€á€º ယာယီစကားá€á€¾á€€á€ºá€¡á€žá€…်',
-'noemail' => 'အသုံးပြုသူ "$1" အá€á€½á€€á€º မည်သည့်အီးမေးလိပ်စာမှ မှá€á€ºá€žá€¬á€¸á€‘ားá€á€¼á€„်း မရှိပါá‹',
-'noemailcreate' => 'á€á€›á€¬á€á€„်အီးမေးလိပ်စာ ပေးရန် လိုအပ်သည်',
-'mailerror' => 'မေးပို့á€á€¼á€„်း အမှား - $1',
-'emailauthenticated' => 'သင့်အီးမေးလိပ်စာá€á€Šá€ºá€›á€¾á€­á€€á€¼á€±á€¬á€„်း $2 နေ့ $3 အá€á€»á€­á€”်က အá€á€Šá€ºá€•á€¼á€¯á€œá€­á€¯á€€á€ºá€žá€Šá€ºá‹',
-'emailconfirmlink' => 'အီးမေးကိုအá€á€Šá€ºá€•á€¼á€¯á€•á€«',
-'accountcreated' => 'အကောင့်ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€•á€«á€•á€¼á€®',
-'accountcreatedtext' => '$1 အá€á€½á€€á€º အသုံးပြုသူအကောင့်á€á€…်á€á€¯ ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€–ြစ်သည်á‹',
-'createaccount-title' => '{{SITENAME}} အá€á€½á€€á€º အကောင့်ပြုလုပ်á€á€¼á€„်း',
-'usernamehasherror' => 'အသုံးပြုသူအမည်á€á€½á€„် hash စာလုံး (#) မပါရပါ',
-'login-throttled' => 'သင်သည် login á€á€„်ရန် အကြိမ်မြောက်မြားစွာ အားထုá€á€ºá€á€²á€·á€•á€¼á€®á€¸á€–ြစ်သည်á‹
+'passwordtooshort' => 'စကားá€á€¾á€€á€ºá€á€½á€„် စကားလုံး အနည်းဆုံး {{PLURAL:$1|á€á€…်လုံး|$1 လုံး}} ရှိရမည်á‹',
+'password-name-match' => 'သင့်စကားá€á€¾á€€á€ºá€žá€Šá€º အသုံးပြုသူအမည်နှင့် အá€á€°á€á€°á€™á€–ြစ်စေရဘဲ ကွဲပြားရမည်á‹',
+'password-login-forbidden' => 'ဤအသုံးပြုသူအမည်နှင့် စကားá€á€¾á€€á€ºá€¡á€¬á€¸ အသုံးပြုá€á€¼á€„်းကို á€á€¬á€¸á€™á€¼á€…်ထားသည်á‹',
+'mailmypassword' => 'စကားá€á€¾á€€á€ºá€¡á€žá€…်ကို အီးမေး ပို့ရန်',
+'passwordremindertitle' => '{{SITENAME}} အá€á€½á€€á€º ယာယီစကားá€á€¾á€€á€ºá€¡á€žá€…်',
+'noemail' => 'အသုံးပြုသူ "$1" အá€á€½á€€á€º မည်သည့်အီးမေးလိပ်စာမှ မှá€á€ºá€žá€¬á€¸á€‘ားá€á€¼á€„်း မရှိပါá‹',
+'noemailcreate' => 'á€á€›á€¬á€á€„်အီးမေးလိပ်စာ ပေးရန် လိုအပ်သည်',
+'mailerror' => 'မေးပို့á€á€¼á€„်း အမှား - $1',
+'emailauthenticated' => 'သင့်အီးမေးလိပ်စာá€á€Šá€ºá€›á€¾á€­á€€á€¼á€±á€¬á€„်း $2 နေ့ $3 အá€á€»á€­á€”်က အá€á€Šá€ºá€•á€¼á€¯á€œá€­á€¯á€€á€ºá€žá€Šá€ºá‹',
+'emailconfirmlink' => 'အီးမေးကိုအá€á€Šá€ºá€•á€¼á€¯á€•á€«',
+'accountcreated' => 'အကောင့်ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€•á€«á€•á€¼á€®',
+'accountcreatedtext' => '$1 အá€á€½á€€á€º အသုံးပြုသူအကောင့်á€á€…်á€á€¯ ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€–ြစ်သည်á‹',
+'createaccount-title' => '{{SITENAME}} အá€á€½á€€á€º အကောင့်ပြုလုပ်á€á€¼á€„်း',
+'usernamehasherror' => 'အသုံးပြုသူအမည်á€á€½á€„် hash စာလုံး (#) မပါရပါ',
+'login-throttled' => 'သင်သည် login á€á€„်ရန် အကြိမ်မြောက်မြားစွာ အားထုá€á€ºá€á€²á€·á€•á€¼á€®á€¸á€–ြစ်သည်á‹
ကျေးဇူးပြုá ထပ်မá€á€„်á€á€„် စောင့်ပေးပါá‹',
-'loginlanguagelabel' => 'ဘာသာ: $1',
+'loginlanguagelabel' => 'ဘာသာ: $1',
# Password reset dialog
'resetpass' => 'စကားá€á€¾á€€á€ºá€•á€¼á€±á€¬á€„်းရန်',
@@ -469,6 +469,7 @@ $messages = array(
'showdiff' => 'ပြင်​ဆင်​ထား​သည်​များ​ကို​ ပြရန်',
'anoneditwarning' => "'''သá€á€­á€•á€±á€¸á€á€»á€€á€º - ''' သင်သည် logged in á€á€„်မထားပါá‹
ဤစာမျက်နှာá á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€á€ºá€á€™á€ºá€¸á€á€½á€„် သင့် IP address ကို မှá€á€ºá€žá€¬á€¸á€‘ားမည် ဖြစ်သည်á‹",
+'anonpreviewwarning' => 'သင်သည် logged in á€á€„်မထားပါዠသိမ်းဆည်းမည် ဆိုပါက သင်áIP အား ဤစာမျက်နှာ မှá€á€ºá€á€™á€ºá€¸á€á€½á€„် မှá€á€ºá€žá€¬á€¸á€‘ားမည်ဖြစ်ပါသည်á‹',
'missingcommenttext' => 'ကျေးဇူးပြုá အောက်á€á€½á€„် မှá€á€ºá€á€»á€€á€ºá€á€…်á€á€¯á€›á€±á€¸á€•á€«á‹',
'summary-preview' => 'အ​ကျဉ်း​á€á€»á€¯á€•á€ºâ€‹á€”​မူ​နာ:',
'subject-preview' => 'အကြောင်းအရာ/á€á€±á€«á€„်းကြီးပိုင်း နမူနာ -',
@@ -516,6 +517,12 @@ $messages = array(
'permissionserrors' => 'á€á€½á€„့်ပြုá€á€»á€€á€ºá€¡á€™á€¾á€¬á€¸á€™á€»á€¬á€¸',
'permissionserrorstext' => 'အောက်ပါ {{PLURAL:$1|အကြောင်းပြá€á€»á€€á€º|အကြောင်းပြá€á€»á€€á€ºá€™á€»á€¬á€¸}}ကြောင့် ထိုအရာအá€á€½á€€á€º á€á€½á€„့်ပြုá€á€»á€€á€ºá€™á€›á€¾á€­á€•á€« -',
'permissionserrorstext-withaction' => 'အောက်ပါ အကြောင်းပြá€á€»á€€á€º {{PLURAL:$1|á€á€¯|á€á€¯}} ကြောင့် $2 အá€á€½á€€á€º á€á€½á€„့်ပြုá€á€»á€€á€ºá€™á€›á€¾á€­á€•á€« -',
+'recreate-moveddeleted-warn' => "'''သá€á€­á€•á€±á€¸á€á€»á€€á€ºá‹ သင်သည် ယá€á€„်က ဖျက်ထားသော စာမျက်နှာá€á€…်á€á€¯á€€á€­á€¯ ပြန်လည်ဖန်á€á€®á€¸á€”ေသည်á‹'''
+
+သင့်အနေနှင့် ဤစာမျက်နှာကို ဆက်လက်á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”် သင့်á€á€±á€¬á€ºá€™á€Šá€º မသင့်á€á€±á€¬á€ºá€™á€Šá€ºá€€á€­á€¯ စဉ်းစားသင့်သည်á‹
+ဖျက်ထားá€á€¼á€„်း နှင့် ရွှေ့ထားá€á€¼á€„်းá€á€­á€¯á€·á မှá€á€ºá€á€™á€ºá€¸á€€á€­á€¯ သင့်အá€á€½á€€á€º အလွယ်á€á€€á€° ကိုးကားနိုင်ရန် ဖော်ပြထားသည်á‹",
+'moveddeleted-notice' => 'ဤစာမျက်နှာကို ဖျက်ထားသည်á‹
+ဖျက်ထားá€á€¼á€„်း ရွှေ့ဆိုင်းထားá€á€¼á€„်းá€á€­á€¯á€·á€”ှင့် ပá€á€ºá€žá€€á€ºá€žá€±á€¬ မှá€á€ºá€á€™á€ºá€¸á€€á€­á€¯ ကိုးကားနိုင်ရန် အောက်á€á€½á€„် ဖော်ပြထားသည်á‹',
'log-fulllog' => 'မှá€á€ºá€á€™á€ºá€¸á€¡á€•á€¼á€Šá€·á€ºá€¡á€…ုံကြည့်ရန်',
'edit-gone-missing' => 'စာမျက်နှာကို အပ်ဒိá€á€ºá€™á€œá€¯á€•á€ºá€”ိုင်ပါá‹
အဖျက်á€á€¶á€œá€­á€¯á€€á€ºá€›á€•á€¯á€¶á€•á€±á€«á€ºá€žá€Šá€ºá‹',
@@ -530,6 +537,7 @@ $messages = array(
'currentrev' => 'နောက်ဆုံးမူ',
'currentrev-asof' => '$1 က နောက်ဆုံး á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€°',
'revisionasof' => '$1 ရက်နေ့က မူ',
+'revision-info' => '$1 နေ့က $2 á€á€Šá€ºá€¸á€–ြá€á€ºá€žá€Šá€·á€ºá€™á€°',
'previousrevision' => 'မူဟောင်း',
'nextrevision' => 'ပိုသစ်သော á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€° →',
'currentrevisionlink' => 'နောက်ဆုံး မူ',
@@ -576,6 +584,8 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် á
'logdelete-logentry' => '"[[$1]]" á အဖြစ်အပျက် မြင်နိုင်စွမ်းကို ပြောင်းလဲရန်',
'revdelete-success' => "'''မူမြင်နိုင်စွမ်းရှိမှုကို အောင်မြင်စွာ update လုပ်ပြီးပါပြီá‹'''",
'revdel-restore' => 'မည်မျှ ရှုမြင်နိုင်သည်ကို ပြောင်းရန်',
+'revdel-restore-deleted' => 'ဖျက်ပစ်လိုက်သောမူများ',
+'revdel-restore-visible' => 'မြင်နိုင်သော မူများ',
'pagehist' => 'စာမျက်နှာ မှá€á€ºá€á€™á€ºá€¸',
'deletedhist' => 'ဖျက်ပစ်လိုက်သော မှá€á€ºá€á€™á€ºá€¸',
'revdelete-content' => 'မာá€á€­á€€á€¬',
@@ -616,6 +626,7 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် á
# Diffs
'history-title' => '"$1" á á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€° ရာဇá€á€„်များ',
'difference' => 'á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€°á€™á€»á€¬á€¸ အကြား ကွဲပြားမှုများ',
+'difference-multipage' => '(စာမျက်နှာများကြားမှ ကွဲပြားá€á€»á€€á€ºá€™á€»á€¬á€¸)',
'lineno' => 'စာကြောင်း $1 -',
'compareselectedversions' => 'ရွေးá€á€»á€šá€ºá€‘ားသော မူများကို နှိုင်းယှဉ်ရန်',
'showhideselectedversions' => 'ရွေးá€á€»á€šá€ºá€‘ားသော မူများကို ပြရန်/á€á€¾á€€á€ºá€›á€”်',
@@ -724,6 +735,7 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
'searchresultshead' => 'ရှာ​ဖွေ​ရန်​',
'resultsperpage' => 'စာá€á€…်မျက်နှာလျှင် á€á€„်ကြည့်နှုန်း -',
'contextlines' => 'စာá€á€…်ကြောင်းလျှင် á€á€„်ကြည့်နှုန်း -',
+'stub-threshold-disabled' => 'ပိá€á€ºá€‘ားသည်',
'recentchangesdays' => 'လá€á€ºá€á€œá€±á€¬á€¡á€•á€¼á€±á€¬á€„်းအလဲများကို ပြရန်နေ့များ -',
'recentchangesdays-max' => 'အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}',
'recentchangescount' => 'ပုံသေအားဖြင့် ပြရန် á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€¯á€¡á€›á€±á€¡á€á€½á€€á€º -',
@@ -783,8 +795,15 @@ HTML tags ကို စစ်ဆေးပါá‹',
'prefs-advancedrendering' => 'အဆင့်မြင့် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
'prefs-advancedsearchoptions' => 'အဆင့်မြင့် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
'prefs-advancedwatchlist' => 'အဆင့်မြင့် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
+'prefs-displayrc' => 'ပြသရန် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
+'prefs-displaysearchoptions' => 'ပြသရန် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
+'prefs-displaywatchlist' => 'ပြသရန် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
'prefs-diffs' => 'ကွဲပြားá€á€»á€€á€º',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'အီးမေးလိပ်စာ á€á€›á€¬á€¸á€á€„်ပုံပေါ်သည်',
+'email-address-validity-invalid' => 'á€á€›á€¬á€¸á€á€„်အီးမေးလိပ်စာá€á€…်á€á€¯ ထည့်ပါ',
+
# User rights
'userrights' => 'အသုံးပြုသူá အá€á€½á€„့်အရေးများကို စီမံá€á€”့်á€á€½á€²á€á€¼á€„်း',
'userrights-lookup-user' => 'အသုံးပြုသူအုပ်စုကို စီမံရန်',
@@ -844,6 +863,7 @@ HTML tags ကို စစ်ဆေးပါá‹',
'right-block' => 'အá€á€¼á€¬á€¸á€¡á€žá€¯á€¶á€¸á€•á€¼á€¯á€žá€°á€™á€»á€¬á€¸ á€á€Šá€ºá€¸á€–ြá€á€ºá€á€¼á€„်းမှ ပိá€á€ºá€•á€„်ရန်',
'right-blockemail' => 'အီးမေးပို့á€á€¼á€„်းမှ အသုံးပြုသူကို á€á€¬á€¸á€†á€®á€¸á€›á€”်',
'right-hideuser' => 'အသုံးပြုသူအမည်ကို ပိá€á€ºá€•á€„်ရန်နှင့် ယင်းအမည်ကို အများမမြင်နိုင်အောင် á€á€¾á€€á€ºá€‘ားရန်',
+'right-unblockself' => 'ပိá€á€ºá€•á€„်ထားသည်ကို သူá€á€­á€¯á€·á€˜á€¬á€žá€¬ ပြန်ဖွင့်ရန်',
'right-protect' => 'ကာကွယ်မှုအဆင့် လျှော့á€á€»á€›á€”်နှင့် ကာကွယ်ထားသည့်စာမျက်နှာများကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်',
'right-editusercss' => 'အá€á€¼á€¬á€¸á€¡á€žá€¯á€¶á€¸á€•á€¼á€¯á€žá€°á€™á€»á€¬á€¸á CSS ဖိုင်ကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်',
'right-edituserjs' => 'အá€á€¼á€¬á€¸á€¡á€žá€¯á€¶á€¸á€•á€¼á€¯á€žá€°á€™á€»á€¬á€¸á JavaScript ဖိုင်ကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်',
@@ -935,48 +955,63 @@ HTML tags ကို စစ်ဆေးပါá‹',
'recentchangeslinked-to' => 'ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများá အပြောင်းအလဲများကို ပြရန်',
# Upload
-'upload' => 'ဖိုင်​á€á€„်​ရန်​',
-'uploadbtn' => 'ဖိုင်​á€á€„်​ရန်​',
-'reuploaddesc' => 'Upload á€á€„်နေá€á€¼á€„်းကို ဖျက်သိမ်းပြီး upload á€á€„်သည့် ပုံစံသို့ ပြန်သွားရန်',
-'upload-tryagain' => 'ပြုပြင်ထားသောဖိုင်á ဖော်ပြá€á€»á€€á€ºá€€á€­á€¯ ထည့်သွင်းရန်',
-'uploadnologin' => 'logged in á€á€„်မထားပါ',
-'uploadnologintext' => 'ဖိုင်များကို Upload á€á€„်ရန် [[Special:UserLogin|logged in á€á€„်ပြီး]] ဖြစ်ရမည်á‹',
-'uploaderror' => 'အပ်လုပ်á€á€„်á€á€¼á€„်း အမှား',
-'upload-permitted' => 'á€á€½á€„့်ပြုထားသော ဖိုင်အမျိုးအစား - $1á‹',
-'upload-preferred' => 'အလေးပေးသော ဖိုင်အမျိုးအစား - $1á‹',
-'upload-prohibited' => 'á€á€¬á€¸á€™á€¼á€…်ထားသော ဖိုင်အမျိုးအစား - $1á‹',
-'uploadlog' => 'Upload á€á€„်သည့် မှá€á€ºá€á€™á€ºá€¸',
-'uploadlogpage' => 'Upload á€á€„်သည့် မှá€á€ºá€á€™á€ºá€¸',
-'filename' => 'ဖိုင်အမည်',
-'filedesc' => 'အ​ကျဉ်း​á€á€»á€¯á€•á€ºâ€‹',
-'fileuploadsummary' => 'အ​ကျဉ်း​á€á€»á€¯á€•á€ºâ€‹ -',
-'filereuploadsummary' => 'ဖိုင်အပြောင်းအလဲများ -',
-'filestatus' => 'မူပိုင်á€á€½á€„့် အá€á€¼á€±á€¡á€”ေ -',
-'filesource' => 'ရင်းမြစ် -',
-'uploadedfiles' => 'á€á€„်ထားသောဖိုင်များ',
-'ignorewarning' => 'သá€á€­á€•á€±á€¸á€á€»á€€á€ºá€€á€­á€¯ လျစ်လျူရှုá ဖိုင်ကို သိမ်းသာသိမ်းပါ',
-'ignorewarnings' => 'မည်သည့်သá€á€­á€•á€±á€¸á€á€»á€€á€ºá€€á€­á€¯á€™á€†á€­á€¯ လျစ်လျူရှုရန်',
-'minlength1' => 'ဖိုင်အမည်သည် အနည်းဆုံး အက္á€á€›á€¬á€á€…်လုံး ရှိရမည်á‹',
-'badfilename' => 'ဖိုင်အမည်ကို "$1" ဟု ပြောင်းလဲပြီးဖြစ်သည်á‹',
-'filetype-badmime' => 'MIME အမျိုးအစား "$1" ဖိုင်များကို á€á€„်ရန် á€á€½á€„့်မပြုပါá‹',
-'filetype-missing' => 'ဖိုင်á€á€½á€„် အိá€á€ºá€…á€á€”်းရှင်း မရှိပါ (".jpg" စသည်)á‹',
-'largefileserver' => 'ဤဖိုင်သည် ဆာဗာá€á€½á€„် á€á€½á€„့်ပြုရန်သá€á€ºá€™á€¾á€á€ºá€‘ားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်á‹',
-'uploadwarning' => 'Upload á€á€„်ရာá€á€½á€„် သá€á€ºá€•á€±á€¸á€á€»á€€á€º',
-'savefile' => 'ဖိုင်သိမ်းရန်',
-'uploadedimage' => '"[[$1]]" ပုံကို á€á€„်ပြီးပြီဖြစ်သည်',
-'overwroteimage' => '"[[$1]]" á မူသစ်ကို upload á€á€„်လိုက်ပြီ',
-'uploaddisabled' => 'Upload á€á€„်á€á€¼á€„်း ပိá€á€ºá€‘ားသည်á‹',
-'uploaddisabledtext' => 'ဖိုင်á€á€„်á€á€¼á€„်းများကို ပိá€á€ºá€‘ားသည်á‹',
-'uploadvirus' => 'ဖိုင်á€á€½á€„် ဗိုင်းရပ်စ် ပါနေပါသည်á‹
+'upload' => 'ဖိုင်​á€á€„်​ရန်​',
+'uploadbtn' => 'ဖိုင်​á€á€„်​ရန်​',
+'reuploaddesc' => 'Upload á€á€„်နေá€á€¼á€„်းကို ဖျက်သိမ်းပြီး upload á€á€„်သည့် ပုံစံသို့ ပြန်သွားရန်',
+'upload-tryagain' => 'ပြုပြင်ထားသောဖိုင်á ဖော်ပြá€á€»á€€á€ºá€€á€­á€¯ ထည့်သွင်းရန်',
+'uploadnologin' => 'logged in á€á€„်မထားပါ',
+'uploadnologintext' => 'ဖိုင်များကို Upload á€á€„်ရန် [[Special:UserLogin|logged in á€á€„်ပြီး]] ဖြစ်ရမည်á‹',
+'uploaderror' => 'အပ်လုပ်á€á€„်á€á€¼á€„်း အမှား',
+'upload-permitted' => 'á€á€½á€„့်ပြုထားသော ဖိုင်အမျိုးအစား - $1á‹',
+'upload-preferred' => 'အလေးပေးသော ဖိုင်အမျိုးအစား - $1á‹',
+'upload-prohibited' => 'á€á€¬á€¸á€™á€¼á€…်ထားသော ဖိုင်အမျိုးအစား - $1á‹',
+'uploadlog' => 'Upload á€á€„်သည့် မှá€á€ºá€á€™á€ºá€¸',
+'uploadlogpage' => 'Upload á€á€„်သည့် မှá€á€ºá€á€™á€ºá€¸',
+'filename' => 'ဖိုင်အမည်',
+'filedesc' => 'အ​ကျဉ်း​á€á€»á€¯á€•á€ºâ€‹',
+'fileuploadsummary' => 'အ​ကျဉ်း​á€á€»á€¯á€•á€ºâ€‹ -',
+'filereuploadsummary' => 'ဖိုင်အပြောင်းအလဲများ -',
+'filestatus' => 'မူပိုင်á€á€½á€„့် အá€á€¼á€±á€¡á€”ေ -',
+'filesource' => 'ရင်းမြစ် -',
+'uploadedfiles' => 'á€á€„်ထားသောဖိုင်များ',
+'ignorewarning' => 'သá€á€­á€•á€±á€¸á€á€»á€€á€ºá€€á€­á€¯ လျစ်လျူရှုá ဖိုင်ကို သိမ်းသာသိမ်းပါ',
+'ignorewarnings' => 'မည်သည့်သá€á€­á€•á€±á€¸á€á€»á€€á€ºá€€á€­á€¯á€™á€†á€­á€¯ လျစ်လျူရှုရန်',
+'minlength1' => 'ဖိုင်အမည်သည် အနည်းဆုံး အက္á€á€›á€¬á€á€…်လုံး ရှိရမည်á‹',
+'badfilename' => 'ဖိုင်အမည်ကို "$1" ဟု ပြောင်းလဲပြီးဖြစ်သည်á‹',
+'filetype-badmime' => 'MIME အမျိုးအစား "$1" ဖိုင်များကို á€á€„်ရန် á€á€½á€„့်မပြုပါá‹',
+'filetype-missing' => 'ဖိုင်á€á€½á€„် အိá€á€ºá€…á€á€”်းရှင်း မရှိပါ (".jpg" စသည်)á‹',
+'empty-file' => 'သင်á€á€„်သွင်းလိုက်သောဖိုင်သည် ဗလာဖြစ်နေသည်á‹',
+'file-too-large' => 'သင်á€á€„်သွင်းလိုက်သောဖိုင်သည် ကြီးလွန်းနေသည်á‹',
+'filename-tooshort' => 'ဖိုင်အမည်သည် á€á€­á€¯á€œá€½á€”်းသည်á‹',
+'filetype-banned' => 'ဤဖိုင်အမျိုးအစားကို á€á€¬á€¸á€™á€¼á€…်ထားသည်á‹',
+'verification-error' => 'ဤဖိုင်သည် ဖိုင်အá€á€Šá€ºá€•á€¼á€¯á€›á€”်စစ်ဆေးá€á€»á€€á€º မအောင်မြင်ပါá‹',
+'illegal-filename' => 'ဖိုင်အမည်ကို á€á€½á€„့်မပြုပါá‹',
+'overwrite' => 'ရှိပြီးသားဖိုင်အား ထပ်ရေးá€á€¼á€„်းကို á€á€½á€„့်မပြုပါá‹',
+'unknown-error' => 'အကြောင်းရင်းမသိရှိရသော အမှားá€á€…်á€á€¯ ဖြစ်ပေါ်နေသည်á‹',
+'tmp-create-error' => 'ယာယီဖိုင် မဖန်á€á€®á€¸á€”ိုင်ပါá‹',
+'tmp-write-error' => 'ယာယီဖိုင်ရေးသားရာá€á€½á€„် အမှားဖြစ်ပေါ်နေသည်á‹',
+'largefileserver' => 'ဤဖိုင်သည် ဆာဗာá€á€½á€„် á€á€½á€„့်ပြုရန်သá€á€ºá€™á€¾á€á€ºá€‘ားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်á‹',
+'uploadwarning' => 'Upload á€á€„်ရာá€á€½á€„် သá€á€ºá€•á€±á€¸á€á€»á€€á€º',
+'savefile' => 'ဖိုင်သိမ်းရန်',
+'uploadedimage' => '"[[$1]]" ပုံကို á€á€„်ပြီးပြီဖြစ်သည်',
+'overwroteimage' => '"[[$1]]" á မူသစ်ကို upload á€á€„်လိုက်ပြီ',
+'uploaddisabled' => 'Upload á€á€„်á€á€¼á€„်း ပိá€á€ºá€‘ားသည်á‹',
+'copyuploaddisabled' => 'URL လင့်မှ Upload á€á€„်á€á€¼á€„်း ပိá€á€ºá€‘ားသည်á‹',
+'uploadfromurl-queued' => 'သင့် upload á€á€„်ရန်ကို စီထားပြီးဖြစ်သည်á‹',
+'uploaddisabledtext' => 'ဖိုင်á€á€„်á€á€¼á€„်းများကို ပိá€á€ºá€‘ားသည်á‹',
+'uploadvirus' => 'ဖိုင်á€á€½á€„် ဗိုင်းရပ်စ် ပါနေပါသည်á‹
အသေးစိá€á€º - $1',
-'upload-source' => 'ရင်းမြစ်ဖိုင်',
-'sourcefilename' => 'ရင်းမြစ်ဖိုင်အမည် -',
-'sourceurl' => 'ရင်းမြစ် URL လင့် -',
-'destfilename' => 'အလိုရှိရာဖိုင်အမည် -',
-'upload-maxfilesize' => 'အကြီးဆုံးဖိုင်အရွယ်အစား - $1',
-'upload-description' => 'ဖိုင်ဖော်ပြá€á€»á€€á€º',
-'upload-options' => 'Upload á€á€„်သည့် ရွေးá€á€»á€šá€ºá€™á€¾á€¯á€™á€»á€¬á€¸',
-'watchthisupload' => 'ဤဖိုင်အား စောင့်ကြည့်ရန်',
+'upload-source' => 'ရင်းမြစ်ဖိုင်',
+'sourcefilename' => 'ရင်းမြစ်ဖိုင်အမည် -',
+'sourceurl' => 'ရင်းမြစ် URL လင့် -',
+'destfilename' => 'အလိုရှိရာဖိုင်အမည် -',
+'upload-maxfilesize' => 'အကြီးဆုံးဖိုင်အရွယ်အစား - $1',
+'upload-description' => 'ဖိုင်ဖော်ပြá€á€»á€€á€º',
+'upload-options' => 'Upload á€á€„်သည့် ရွေးá€á€»á€šá€ºá€™á€¾á€¯á€™á€»á€¬á€¸',
+'watchthisupload' => 'ဤဖိုင်အား စောင့်ကြည့်ရန်',
+'upload-success-subj' => 'အောင်မြင်စွာ ့စူသေိ á€á€„်လိုက်သည်',
+'upload-failure-subj' => 'Upload á€á€„်ရာá€á€½á€„် á€á€½á€±á€·á€žá€Šá€·á€º ပြဿနာ',
+'upload-warning-subj' => 'Upload á€á€„်ရာá€á€½á€„် သá€á€ºá€•á€±á€¸á€á€»á€€á€º',
'upload-misc-error' => 'upload á€á€„်ရာá€á€½á€„် အမည်မသိ အမှား',
'upload-unknown-size' => 'မသိရှိရသော အရွယ်အစား',
@@ -1004,6 +1039,7 @@ HTML tags ကို စစ်ဆေးပါá‹',
'listfiles_search_for' => 'မီဒီယာအမည်ကို ရှာရန် -',
'imgfile' => 'ဖိုင်',
'listfiles' => 'ဖိုင်စာရင်း',
+'listfiles_thumb' => 'နမူနာပုံငယ်',
'listfiles_date' => 'နေ့စွဲ',
'listfiles_name' => 'အမည်',
'listfiles_user' => 'အသုံးပြုသူ',
@@ -1226,6 +1262,7 @@ HTML tags ကို စစ်ဆေးပါá‹',
'emailuser' => 'ဤ​အ​သုံး​ပြု​သူ​အား​အီး​မေး​ပို့​ပါ​',
'emailpage' => 'အီးမေးအသုံးပြုသူ',
'defemailsubject' => '{{SITENAME}} အီးမေး',
+'usermaildisabled' => 'အသုံးပြုသူအီးမေးကို ပိá€á€ºá€‘ားသည်',
'noemailtitle' => 'အီးမေးလိပ်စာ မရှိပါ',
'noemailtext' => 'ဤအသုံးပြုသူသည် á€á€›á€¬á€¸á€á€„်သော အီးမေးလိပ်စာကို ဖောိပြထားá€á€¼á€„်း မရှိပါá‹',
'nowikiemailtitle' => 'မည်သည့်အီးမေးမှ á€á€½á€„့်မပြုပါ',
@@ -1243,7 +1280,7 @@ HTML tags ကို စစ်ဆေးပါá‹',
# Watchlist
'watchlist' => 'စောင့်ကြည့်စာရင်း',
'mywatchlist' => 'စောင့်ကြည့်စာရင်း',
-'watchlistfor' => "('''$1'''အá€á€½á€€á€º)",
+'watchlistfor2' => '$1 အá€á€½á€€á€º $2',
'nowatchlist' => 'သင့်စောင့်ကြည့်စာရင်းမှာ ဘာမှ မရှိပါá‹',
'watchnologin' => 'logged in á€á€„်မထားပါ',
'addedwatch' => 'စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ပြီး',
@@ -1370,15 +1407,17 @@ HTML tags ကို စစ်ဆေးပါá‹',
'sp-contributions-newbies' => 'အကောင့်အသစ်များá ပံ့ပိုးမှုများကိုသာ ပြရန်',
'sp-contributions-newbies-sub' => 'အကောင့်အသစ်များအá€á€½á€€á€º',
'sp-contributions-blocklog' => 'ပိá€á€ºá€•á€„်á€á€¬á€¸á€†á€®á€¸á€™á€¾á€¯ မှá€á€ºá€á€™á€ºá€¸',
+'sp-contributions-uploads' => 'အပ်လုပ်á€á€„်ထားသည်များ',
'sp-contributions-logs' => 'မှá€á€ºâ€‹á€á€™á€ºá€¸â€‹á€™á€»á€¬á€¸â€‹',
'sp-contributions-talk' => 'ဆွေးနွေးá€á€»á€€á€º',
'sp-contributions-userrights' => 'အသုံးပြုသူá အá€á€½á€„့်အရေးများကို စီမံá€á€”့်á€á€½á€²á€á€¼á€„်း',
'sp-contributions-search' => 'ပံ့ပိုးမှုများကို ရှာရန်',
'sp-contributions-username' => 'အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် :',
+'sp-contributions-toponly' => 'နောက်ဆုံးá€á€Šá€ºá€¸á€–ြá€á€ºá€™á€°á€™á€»á€¬á€¸á€žá€¬á€•á€¼á€›á€”်',
'sp-contributions-submit' => 'ရှာ​ဖွေ​ရန်​',
# What links here
-'whatlinkshere' => '',
+'whatlinkshere' => 'ဘယ်ကလင့်á€á€ºá€‘ားလဲ',
'whatlinkshere-title' => '"$1" ကို လင့်ထားသော စာမျက်နှာများ',
'whatlinkshere-page' => 'စာမျက်နှာ -',
'linkshere' => "အောက်ပါစာမျက်နှာများသည် '''[[:$1]]''' သို့ လင့်ထားသည် -",
@@ -1419,7 +1458,6 @@ HTML tags ကို စစ်ဆေးပါá‹',
'ipb-edit-dropdown' => 'ပိá€á€ºá€•á€„်ရသောအကြောင်းရင်းများ',
'ipb-unblock-addr' => '$1 ကို ပိá€á€ºá€‘ားရာမှ ပြန်ဖွင့်ရန်',
'ipb-unblock' => 'အသုံးပြုသူအမည် သို့ IP address ကို ပိá€á€ºá€‘ားရာမှ ပြန်ဖွင့်ပေးရန်',
-'ipb-blocklist-addr' => '$1 အá€á€½á€€á€º ရှိနှင့်ပြီးသား ပိá€á€ºá€•á€„်မှုများ',
'ipb-blocklist' => 'ရှိနှင့်ပြီးသား ပိá€á€ºá€•á€„်မှုများကို ကြည့်ရန်',
'ipb-blocklist-contribs' => '$1 အá€á€½á€€á€º ပံ့ပိုးမှုများ',
'unblockip' => 'အသုံးပြုသူကို ပိá€á€ºá€•á€„်ထားရာမှ ပြန်ဖွင်ြ့ပေးရန်',
@@ -1607,6 +1645,8 @@ HTML tags ကို စစ်ဆေးပါá‹',
'tooltip-upload' => 'Upload á€á€„်á€á€¼á€„်း စá€á€„်ရန်',
'tooltip-rollback' => '"နောက်ပြန် ပြန်သွားá€á€¼á€„်း" သည် ဤစာမျက်နှာá နောက်ဆုံး á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€°á€žá€­á€¯á€· ကလစ် á€á€…်á€á€»á€€á€ºá€–ြင့် ပြန်ပြောင်းပေးသည်á‹',
'tooltip-undo' => '"နောက်ပြန် ပြန်သွားá€á€¼á€„်း" သည် ဤ á€á€Šá€ºá€¸á€–ြá€á€ºá€á€¼á€„်းကို နောက်ပြန်ပြန်ဆုá€á€ºá€•á€¼á€®á€¸ နမူနာပုံနှင့်á€á€€á€½ á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”် ပြန်ဖွင့်မည် ဖြစ်သည်ዠအဘယ်ကြောင့် နောက်ပြန်သွားသည်ကို အကျဉ်းá€á€»á€¯á€•á€º အကြောင်းပြá€á€»á€€á€º ရေးနိုင်သည်á‹',
+'tooltip-preferences-save' => 'ရေးá€á€»á€šá€ºá€…ရာများကို သိမ်းရန်',
+'tooltip-summary' => 'အá€á€­á€¯á€á€»á€¯á€•á€ºá€‘ည့်ရန်',
# Attribution
'others' => 'အá€á€¼á€¬á€¸',
@@ -1640,7 +1680,9 @@ HTML tags ကို စစ်ဆေးပါá‹',
'nextdiff' => 'ပိုသစ်သော á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€¯',
# Media information
+'file-info-size' => '$1 × $2 pixels, ဖိုင်အရွယ်အစား - $3, MIME အမျိုးအစား $4',
'file-nohires' => '<small>သည်ထက်ကြီးသော resolution မရှိပါ.</small>',
+'svg-long-desc' => 'SVG ဖိုင်, $1 × $2 pixels ကို အကြံပြုသည်, ဖိုင်အရွယ်အစား - $3',
'show-big-image' => 'resolution အပြည့်',
'show-big-image-thumb' => '<small>နမူနာကြည့်ရန် အရွယ်အစား - $1 × $2 pixels</small>',
@@ -1843,12 +1885,22 @@ HTML tags ကို စစ်ဆေးပါá‹',
'tags-tag' => 'အမည်á€á€½á€² အမည်',
'tags-edit' => 'ပြင်​ဆင်​ရန်',
+# Special:ComparePages
+'comparepages' => 'စာမျက်နှာများကို နှုိင်းယှဉ်ရန်',
+'compare-selector' => 'စာမျက်နှာမူများကို နှုိင်းယှဉ်ရန်',
+'compare-page1' => 'စာမျက်နှာá€á€…်',
+'compare-page2' => 'စာမျက်နှာနှစ်',
+'compare-rev1' => 'မူ á€á€…်',
+'compare-rev2' => 'မူ နှစ်',
+'compare-submit' => 'နှိုင်းယှဉ်ရန်',
+
# Database error messages
'dberr-header' => 'ဤá€á€®á€€á€®á€á€½á€„် ပြဿနာá€á€…်á€á€¯ ရှိနေသည်',
'dberr-problems' => 'á€á€™á€ºá€¸á€”ည်းပါသည်á‹
ဤဆိုက်သည် နည်းပညာပိုင်းဆိုင်ရာ အá€á€€á€ºá€¡á€á€²á€™á€»á€¬á€¸ ကြုံá€á€½á€±á€·á€”ေရပါသည်á‹',
# HTML forms
+'htmlform-required' => 'ဤá€á€”်ဖိုး လိုအပ်သည်',
'htmlform-submit' => 'ထည့်သွင်းရန်',
'htmlform-reset' => 'ပြောင်းလဲထားသည်များ မလုပ်á€á€±á€¬á€·á€›á€”်',
'htmlform-selectorother-other' => 'အá€á€¼á€¬á€¸',
diff --git a/languages/messages/MessagesMyv.php b/languages/messages/MessagesMyv.php
index a32a3fdb..760fbf12 100644
--- a/languages/messages/MessagesMyv.php
+++ b/languages/messages/MessagesMyv.php
@@ -58,8 +58,10 @@ $specialPageAliases = array(
'Uncategorizedtemplates' => array( 'КатегориÑвтомоЛопаПарцунт' ),
'Unusedcategories' => array( 'ТевÑÐÐолдавицÑКатегориÑÑ‚' ),
'Unusedimages' => array( 'ТевÑÐÐолдавицÑÐртовкÑÑ‚' ),
- 'Wantedpages' => array( 'ВешемаЛопат' ),
- 'Wantedcategories' => array( 'ВешемаКатегориÑÑ‚' ),
+ 'Wantedpages' => array( 'ВешезьЛопат' ),
+ 'Wantedcategories' => array( 'ВешезьКатегориÑÑ‚' ),
+ 'Wantedfiles' => array( 'ВешезьФайлат' ),
+ 'Wantedtemplates' => array( 'ВешезьЛопапарцунт' ),
'Mostlinked' => array( 'СехтеЛамоСюлмавомаПеМартот' ),
'Mostlinkedcategories' => array( 'СехтеЛамоСюлмавомаПеМартоКатегориÑÑ‚' ),
'Mostlinkedtemplates' => array( 'СехтеЛамоСюлмавомаПеМартоЛопаПарцунт' ),
@@ -137,18 +139,24 @@ $magicWords = array(
'talkspace' => array( '1', 'КОРТÐМОПОТМО', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
'fullpagename' => array( '1', 'ЛОПÐЛЕМКУВÐКÐСТО', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
'talkpagename' => array( '1', 'КОРТÐМОЛОПÐЛЕМ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
- 'img_right' => array( '1', 'вить кедь', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'керш кедь', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'вейкеÑк араÑÑŒ', 'без', 'none' ),
+ 'msg' => array( '0', 'ПÐЧТЯМÐЭ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'img_thumbnail' => array( '1', 'кенжешка', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'вить_кедь', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'керш_кедь', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'вейкеÑк_араÑÑŒ', 'без', 'none' ),
'img_center' => array( '1', 'куншкаÑо', 'центр', 'center', 'centre' ),
'img_framed' => array( '1', 'кундÑо', 'обрамить', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'кундовтомо', 'безрамки', 'frameless' ),
- 'img_page' => array( '1', 'лопа=$1', 'лопа $1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_page' => array( '1', 'лопа=$1', 'лопа $1', 'Ñтраница=$1', 'Ñтраница $1', 'Ñтраница $1', 'page=$1', 'page $1' ),
'img_top' => array( '1', 'верькÑ', 'Ñверху', 'top' ),
'img_text_top' => array( '1', 'текÑÑ‚-верькÑ', 'текÑÑ‚-Ñверху', 'text-top' ),
'img_middle' => array( '1', 'куншка', 'поÑередине', 'middle' ),
'img_bottom' => array( '1', 'алкÑ', 'Ñнизу', 'bottom' ),
'img_text_bottom' => array( '1', 'текÑÑ‚-алкÑ', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
+ 'sitename' => array( '1', 'СÐЙТЛЕМ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'gender' => array( '0', 'СЫМЕ:', 'ПОЛ:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'МОЛИЦЯ_ТÐРГО', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'МОЛИЦЯ_ЧИ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
'localweek' => array( '1', 'ТЕСКЭÐЬТÐРГО', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
'revisionid' => array( '1', 'ЛИЯКСТОМТОМÐID', 'ИД_ВЕРСИИ', 'REVISIONID' ),
'revisionday' => array( '1', 'ЛИЯКСТОМТОМÐЧЫ', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
@@ -156,13 +164,20 @@ $magicWords = array(
'revisionmonth' => array( '1', 'ЛИЯКСТОМТОМÐКОВ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
'revisionyear' => array( '1', 'ЛИЯКСТОМТОМÐИЕ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
'plural' => array( '0', 'ЛÐМОÐЬЧИСЛÐ', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
+ 'lcfirst' => array( '0', 'Ð’ÐСЕÐЦЕ_ТЕШТЬКЕСЬ_ВИШКИÐЕ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'Ð’ÐСЕÐЦЕ_ТЕШТЬКЕСЬ_ПОКШ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ВИШКÐ_ТЕШТЬКЕСЭ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
+ 'uc' => array( '0', 'ПОШК_ТЕШТЬКЕСЭ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
'raw' => array( '0', 'ВЕРЕКСТЭ', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ÐЕВТЕМС_КОÐЯКС', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
'currentversion' => array( '1', 'ТЕВÐТЕВЕРСИЯ', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
- 'language' => array( '0', '#КЕЛЬ', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'language' => array( '0', '#КЕЛЕСЬ:', '#ЯЗЫК:', '#LANGUAGE:' ),
'numberofadmins' => array( '1', 'ЗЯРОÐДМИÐТÐЭДЕ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'башка тевень', 'ÑлужебнаÑ', 'special' ),
+ 'special' => array( '0', 'башка_тевень', 'ÑлужебнаÑ', 'special' ),
'filepath' => array( '0', 'ФÐЙЛÐÐЬКИ', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
'pagesize' => array( '1', 'ЛОПÐКУВÐЛМО', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'ЯÐ', 'ПУТЬ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
);
$messages = array(
@@ -181,8 +196,7 @@ $messages = array(
'tog-editsection' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ñюлмавома пенть «витемÑ» Ñрьва ÑекциÑнтень-пелькÑÑнтень',
'tog-editsectiononrightclick' => 'Ð’Ð¸Ñ‚Ð½ÐµÐ¼Ñ ÑекциÑтнень-пелькÑтнÑнь, лепштÑÐ¼Ñ ÑёрмадовкÑонть Ð»ÐµÐ¼ÐµÐ½Ð·Ñ Ð»Ð°Ð½Ð³Ñ Ñ‡Ñерень витьёнÑе повнÑÑÑ (JavaScript)',
'tog-showtoc' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ ÑÑ‘Ñ€Ð¼Ð°Ð´Ð¾Ð²ÐºÑ Ð¿Ð¾Ñ‚Ð¼Ð¾ÐºÑ (лопатненень, конатнеÑÑ 3-до ламо ÑёрмадовкÑÑ‚)',
-'tog-rememberpassword' => 'ВанÑÑ‚Ð¾Ð¼Ñ Ñовамо валом те арÑиймашинаÑонть',
-'tog-editwidth' => 'ÐšÐµÐ»ÐµÐ¹Ð³Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°-петнема пакÑÑÑÑŒ веÑе браузер вальманть келеÑ',
+'tog-rememberpassword' => 'ЛедÑÑ‚ÐµÐ¼Ñ Ñовамо валом те бравзерÑÑнть (Ñех кувать $1 {{PLURAL:$1|чи|чить}})',
'tog-watchcreations' => 'Ð¡Ð¾Ð²Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ теевть лопатнень ванома лем риÑьмезÑнь',
'tog-watchdefault' => 'Ð¡Ð¾Ð²Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ витевть лопатнень ванома лем риÑьмезÑнь',
'tog-watchmoves' => 'Лопанть лиÑкÑтомтÑа, Ñовавтык ванома лем риÑьмезÑнь',
@@ -319,31 +333,20 @@ $messages = array(
'faqpage' => 'Project:СеедьÑÑ‚Ñ ÐºÐµÐ¿ÐµÐ´ÐµÐ½ÑŒ кевкÑтемат',
# Vector skin
-'vector-action-addsection' => 'ÐŸÐ¾Ð»Ð°Ð´Ð¾Ð¼Ñ Ð¼ÐµÐ·Ð´Ðµ кортамÑ',
-'vector-action-delete' => 'ÐардамÑ',
-'vector-action-move' => 'ПечтевтемÑ',
-'vector-action-protect' => 'ÐÑ€Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð²Ð°Ð½ÑтомаÑ',
-'vector-action-undelete' => 'Ð’ÐµÐ»ÑŒÐ¼ÐµÐ²Ñ‚ÐµÐ¼Ñ Ð½Ð°Ñ€Ð´Ð°Ð·ÐµÐ½Ñ‚ÑŒ',
-'vector-action-unprotect' => 'ВанÑтомаÑто ÑаемÑ',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Ð›ÐµÐ·ÐºÑ Ð»Ð¾Ð¿Ð°',
-'vector-namespace-image' => 'Файла',
-'vector-namespace-main' => 'Лопа',
-'vector-namespace-media' => 'Медиа лопа',
-'vector-namespace-mediawiki' => 'ПачтÑмнÑ',
-'vector-namespace-project' => 'ÐŸÑ€Ð¾ÐµÐºÑ‚Ñ‚Ñ Ð»Ð¾Ð¿Ð°',
-'vector-namespace-special' => 'Башка тевень лопа',
-'vector-namespace-talk' => 'Кортнема',
-'vector-namespace-template' => 'Лопа парцун',
-'vector-namespace-user' => 'ТеицÑнь лопа',
-'vector-view-create' => 'ТеемÑ-ШкамÑ',
-'vector-view-edit' => 'ВитнемÑ-петнемÑ',
-'vector-view-history' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ ÑŽÑ€Ð¾Ð½Ð·Ð¾-путовкÑонзо',
-'vector-view-view' => 'ЛовномÑ',
-'vector-view-viewsource' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ ÐºÐ¾Ñто Ñаезь',
-'actions' => 'Тев теемат',
-'namespaces' => 'Лемпотмот',
-'variants' => 'Вариантт',
+'vector-action-addsection' => 'ÐŸÐ¾Ð»Ð°Ð´Ð¾Ð¼Ñ Ð¼ÐµÐ·Ð´Ðµ кортамÑ',
+'vector-action-delete' => 'ÐардамÑ',
+'vector-action-move' => 'ПечтевтемÑ',
+'vector-action-protect' => 'ÐÑ€Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð²Ð°Ð½ÑтомаÑ',
+'vector-action-undelete' => 'Ð’ÐµÐ»ÑŒÐ¼ÐµÐ²Ñ‚ÐµÐ¼Ñ Ð½Ð°Ñ€Ð´Ð°Ð·ÐµÐ½Ñ‚ÑŒ',
+'vector-action-unprotect' => 'ВанÑтомаÑто ÑаемÑ',
+'vector-view-create' => 'ТеемÑ-ШкамÑ',
+'vector-view-edit' => 'ВитнемÑ-петнемÑ',
+'vector-view-history' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ ÑŽÑ€Ð¾Ð½Ð·Ð¾-путовкÑонзо',
+'vector-view-view' => 'ЛовномÑ',
+'vector-view-viewsource' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ ÐºÐ¾Ñто Ñаезь',
+'actions' => 'Тев теемат',
+'namespaces' => 'Лемпотмот',
+'variants' => 'Вариантт',
'errorpagetitle' => 'ИльведькÑ',
'returnto' => 'ВелÑÐ²Ñ‚Ð¾Ð¼Ñ $1 лопантень.',
@@ -399,6 +402,7 @@ $messages = array(
'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' => '{{SITENAME}} ланга',
@@ -519,7 +523,7 @@ $messages = array(
'yourname' => 'ТеицÑнь лем:',
'yourpassword' => 'Салава валот:',
'yourpasswordagain' => 'Омбоцеде Ñёрмадык кирдицÑнь леметь:',
-'remembermypassword' => 'ЛедÑÑ‚ÐµÐ¼Ñ Ð¼Ð¾Ð½ÑŒ Ñовамо валонть те арÑемашинаÑонть',
+'remembermypassword' => 'ЛедÑÑ‚ÐµÐ¼Ñ Ñовамом те бравзерÑÑнть (Ñех кувать $1 {{PLURAL:$1|чи|чить}})',
'yourdomainname' => 'ЭÑеть доменÑÑ‚ÑŒ:',
'login' => 'Совамо',
'nav-login-createaccount' => 'Совамо / тейть Ñовамотарка',
@@ -535,6 +539,7 @@ $messages = array(
'gotaccount' => "Совамотаркат ули? '''$1'''.",
'gotaccountlink' => 'СовамÑ',
'createaccountmail' => 'е-ÑёрмаÑо',
+'createaccountreason' => 'ТувталоÑÑŒ:',
'badretype' => 'Сёрмадыть Ñалава валот кавкÑÑ‚ÑŒ: Ñынь аволь вейкеть.',
'userexists' => 'Те лемеÑÑŒ уш Ñаезь. ÐÑ€Ñека ÑÑеть лиÑ, инеÑькеть.',
'loginerror' => 'СовамÑто ильведькÑ',
@@ -673,8 +678,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'copyrightwarning' => "ИнеÑкеть кирдть мельÑÑ {{SITENAME}}-ÑÑ Ð²ÐµÑе путовкÑтнÑнь, лововить Ð½Ð¾Ð»Ð´Ð°Ð·ÐµÐºÑ Ð°Ð»Ð¾ $2 конёвонть корÑÑ (вант $1 педе пеÑ). ÐраÑÑŒ мелеть витневтемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ²Ñ‚ÐµÐ¼Ñ ÑёрмадовкÑот педе пеÑ, илÑк ÑеÑÑ‚Ñ Ð¿ÑƒÑ‚Ð¾ ÑÐ¾Ð½Ð·Ñ Ñ‚ÐµÐ·Ñнь.<br />
ИÑÑ‚Ñжо тезÑнь материалонь макÑомÑот, кемекÑтат тон тонÑÑŒ Ñёрмадык ÑонзÑ, али Ñаик ÑÐ¾Ð½Ð·Ñ Ð²ÐµÐ¹ÑÑнь ёнкÑто али олÑчинь порталÑто.
'''ИЛЯ ÐœÐКСО Ð’ÐÐСТОÐЬ ВИДЕЧИСЭ ЛОМÐÐЕÐЬ Ð’ÐЖОДЕМÐÐТЬ ÐПÐК КЕВКСТÐЕ!'''",
-'longpagewarning' => "'''Ð’ÐÐОК: Те лопанть Ñталмозо $1 килобайтт; конат-конат интерчаматнеÑÑ-браузертнÑÑÑ ÑтакаÑто витнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ ÑÑ‘Ñ€Ð¼Ð°Ð´Ð¾Ð²ÐºÑ 32-во kб ÑталмоÑо али Ñеде Ñтака.
-ИнеÑькеть, паро улевель лопанть ÑÐ²Ð¾Ð¼Ñ Ð²Ð¸ÑˆÐºÐ° пелькÑекÑ.'''",
'titleprotectedwarning' => "'''Ð’ÐÐОК: Те лопаÑÑŒ Ñёлгозь, ÑÐ¾Ð½Ð·Ñ ÑˆÐºÐ°Ð¼Ð³Ð°-теемга [[Special:ListGroupRights|башка видечыть]] ÑÑ€Ñвить.'''
Журналонь меельÑе ÑёрмадовкÑоÑÑŒ макÑозь ало, ÑÑ€ÑвиндерÑй ÑÐ¾Ð½Ð·Ñ Ð²Ð°Ð½Ð¾Ð¼Ñ.",
'templatesused' => 'Те лопаÑонть Ñ‚ÐµÐ²Ñ Ð½Ð¾Ð»Ð´Ð°Ð·ÑŒ {{PLURAL:$1|лопа парцун|лопа парцунт}}:',
@@ -754,6 +757,8 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'revdelete-submit' => 'ÐÑ€Ð°Ð²Ñ‚Ð¾Ð¼Ñ ÐºÐ¾Ñ‡ÐºÐ°Ð·ÑŒ {{PLURAL:$1|лиÑкÑтомтомантень|лиÑкÑтомтоматненень}}',
'revdelete-logentry' => '[[$1]]-нть лиÑкÑтомтоманть неÑвомазо полавтовÑÑŒ',
'revdel-restore' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð½ÐµÑвомачынзÑ',
+'revdel-restore-deleted' => 'нардазь верзиÑтне',
+'revdel-restore-visible' => 'неÑÐ²Ð¸Ñ†Ñ Ð²ÐµÑ€Ð·Ð¸ÑÑ‚',
'pagehist' => 'Лопанть Ð¸ÐºÐµÐ»ÑŒÐºÑ ÑƒÐ¼Ð°Ð·Ð¾',
'deletedhist' => 'Ðардань Ð¸ÐºÐµÐ»ÑŒÐºÑ ÑƒÐ¼Ð°Ð·Ð¾',
'revdelete-content' => 'потмозо',
@@ -792,7 +797,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'lineno' => 'КикÑÑÑÑŒ $1:',
'compareselectedversions' => 'Кочказь верÑиÑтнень Ð°Ñ€Ð°Ð²Ñ‚Ð¾Ð¼Ñ ÐºÐ°Ñ€Ð°Ð´Ð¾-каршо',
'editundo' => 'ВелÑÐ²Ñ‚Ð¾Ð¼Ñ Ð¼ÐµÐºÐµÐ² мезе витнинь-петнинь',
-'diff-multi' => '({{PLURAL:$1|$1 юткине верÑиÑÑÑŒ апак невте|$1 юткине верÑиÑтне апак невте|$1 юткине верÑиÑтнеде апак невте.}})',
+'diff-multi' => '↓({{PLURAL:$2|Вейке ÑовицÑÑÑŒ тейÑÑŒ {{PLURAL:$1|юткине верÑиÑ, конаÑÑŒ|$1 юткине верÑиÑÑ‚, конатне}}|$2 ÑовицÑÑ‚ тейÑÑ‚ÑŒ {{PLURAL:$1| юткине верÑиÑ, конаÑÑŒ|$1 юткине верÑиÑÑ‚, конатне}}}} апак невте.)',
# Search results
'searchresults' => 'Мезе муевÑÑŒ',
@@ -999,38 +1004,34 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'action-mergehistory' => 'вейтьÑÑндÑÐ¼Ñ Ñ‚Ðµ лопанть юронзо-путовкÑонзо',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|полавтнема|полавтнемат}}',
-'recentchanges' => 'ЧыÑконь полавтнемат-лиÑкÑтомтомат',
-'recentchanges-legend' => 'Улконь полавтнематнень аравтнемаÑÑ‚',
-'recentchanges-feed-description' => 'Мельга ваннынк кода ульнеÑÑ‚ÑŒ витьнемат-петнемат wiki-ÑÑ Ñ‚Ðµ макÑовкÑонть.',
-'recentchanges-legend-newpage' => '$1, те - од лопа',
-'recentchanges-label-newpage' => 'Те витнемаÑÑŒ-петнемаÑÑŒ од лопа тейÑÑŒ',
-'recentchanges-legend-minor' => '$1, те - а Ð¿Ð¾ÐºÑˆÐºÑ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°-петнема',
-'recentchanges-label-minor' => 'Те а Ð¿Ð¾ÐºÑˆÐºÑ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°ÑÑŒ-петнемаÑÑŒ',
-'recentchanges-legend-bot' => '$1, те - ботонь витнемазо-петнемазо',
-'recentchanges-label-bot' => 'Те витнеманть-петнеманть теизе кона-кона бот',
-'recentchanges-legend-unpatrolled' => '$1, те витнеманть-петнеманть мельга а ванÑтнить',
-'rcnote' => "$5, $4 шканть корÑÑ Ð¼ÑƒÑÑ‚ алдо {{PLURAL:$1|МеельÑе '''1''' лиÑкÑтомтоманть|МеельÑе '''$1''' лиÑкÑтомтоматнень}} меельÑе {{PLURAL:$2|чинть|'''$2''' читнень}} шкаÑто.",
-'rcnotefrom' => "Ðло невтезь '''$2''' лиÑкÑтомтомаÑто Ñаезь ('''$1''' видÑ).",
-'rclistfrom' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ð¾Ð´ витьнематнень $1-нть ÑйÑÑ‚Ñ Ñаезь.',
-'rcshowhideminor' => '$1 Ð°Ð¿Ð¾ÐºÑˆÐºÑ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°Ñ‚-петнемат',
-'rcshowhidebots' => '$1 ботт',
-'rcshowhideliu' => '$1 Ñовазь уÑькекирдийтне',
-'rcshowhideanons' => '$1 лемтеме теицÑÑ‚',
-'rcshowhidepatr' => '$1 кона патрульÑÑ Ð²Ð¸Ñ‚ÑŒÐ½Ð¸-петни',
-'rcshowhidemine' => '$1 мезе мон витнинь-петнинь',
-'rclinks' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ð¼ÐµÐµÐ»ÑŒÑе $1 полавтнемат меельÑе $2 чинь перть<br />$3',
-'diff' => 'кадовикÑ',
-'hist' => 'иÑÑ‚',
-'hide' => 'КекшемÑ',
-'show' => 'ÐевтемÑ',
-'minoreditletter' => 'а',
-'newpageletter' => 'О',
-'boteditletter' => 'б',
-'rc_categories_any' => 'Кодамо илÑзо уле',
-'newsectionsummary' => '/* $1 */ од пелькÑ',
-'rc-enhanced-expand' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ñеде ламо тень ланга (JavaScript ÑÑ€Ñви)',
-'rc-enhanced-hide' => 'ÐšÐµÐºÑˆÐµÐ¼Ñ ÐºÐµÐ»ÐµÐ¹ÑÑ‚Ñ Ñ‘Ð²Ñ‚Ð°Ð·ÐµÐ½Ñ‚ÑŒ',
+'nchanges' => '$1 {{PLURAL:$1|полавтнема|полавтнемат}}',
+'recentchanges' => 'ЧыÑконь полавтнемат-лиÑкÑтомтомат',
+'recentchanges-legend' => 'Улконь полавтнематнень аравтнемаÑÑ‚',
+'recentchanges-feed-description' => 'Мельга ваннынк кода ульнеÑÑ‚ÑŒ витьнемат-петнемат wiki-ÑÑ Ñ‚Ðµ макÑовкÑонть.',
+'recentchanges-label-newpage' => 'Те витнемаÑÑŒ-петнемаÑÑŒ од лопа тейÑÑŒ',
+'recentchanges-label-minor' => 'Те а Ð¿Ð¾ÐºÑˆÐºÑ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°ÑÑŒ-петнемаÑÑŒ',
+'recentchanges-label-bot' => 'Те витнеманть-петнеманть теизе кона-кона бот',
+'rcnote' => "$5, $4 шканть корÑÑ Ð¼ÑƒÑÑ‚ алдо {{PLURAL:$1|МеельÑе '''1''' лиÑкÑтомтоманть|МеельÑе '''$1''' лиÑкÑтомтоматнень}} меельÑе {{PLURAL:$2|чинть|'''$2''' читнень}} шкаÑто.",
+'rcnotefrom' => "Ðло невтезь '''$2''' лиÑкÑтомтомаÑто Ñаезь ('''$1''' видÑ).",
+'rclistfrom' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ð¾Ð´ витьнематнень $1-нть ÑйÑÑ‚Ñ Ñаезь.',
+'rcshowhideminor' => '$1 Ð°Ð¿Ð¾ÐºÑˆÐºÑ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°Ñ‚-петнемат',
+'rcshowhidebots' => '$1 ботт',
+'rcshowhideliu' => '$1 Ñовазь уÑькекирдийтне',
+'rcshowhideanons' => '$1 лемтеме теицÑÑ‚',
+'rcshowhidepatr' => '$1 кона патрульÑÑ Ð²Ð¸Ñ‚ÑŒÐ½Ð¸-петни',
+'rcshowhidemine' => '$1 мезе мон витнинь-петнинь',
+'rclinks' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ð¼ÐµÐµÐ»ÑŒÑе $1 полавтнемат меельÑе $2 чинь перть<br />$3',
+'diff' => 'кадовикÑ',
+'hist' => 'иÑÑ‚',
+'hide' => 'КекшемÑ',
+'show' => 'ÐевтемÑ',
+'minoreditletter' => 'а',
+'newpageletter' => 'О',
+'boteditletter' => 'б',
+'rc_categories_any' => 'Кодамо илÑзо уле',
+'newsectionsummary' => '/* $1 */ од пелькÑ',
+'rc-enhanced-expand' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ñеде ламо тень ланга (JavaScript ÑÑ€Ñви)',
+'rc-enhanced-hide' => 'ÐšÐµÐºÑˆÐµÐ¼Ñ ÐºÐµÐ»ÐµÐ¹ÑÑ‚Ñ Ñ‘Ð²Ñ‚Ð°Ð·ÐµÐ½Ñ‚ÑŒ',
# Recent changes linked
'recentchangeslinked' => 'Сюлмавозь лиÑкÑтоматне',
@@ -1059,16 +1060,19 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'minlength1' => 'ФайлалемеÑÑŒ Ð°ÑˆÑ‚ÐµÐ·Ñ Ð²ÐµÐ¹ÐºÐµ Ñли Ñеде ламо тешкÑттнÑÑÑ‚Ñ.',
'badfilename' => 'Файланть лемеÑÑŒ полавтозь "$1"-кÑ.',
'filetype-missing' => 'Файланть араÑÑŒ Ð¿Ð¾Ð»Ð°Ð´ÐºÑ Ð¿ÐµÐ·Ñ (Ñаемга «.jpg»).',
+'empty-file' => 'Тонь макÑовт файлаÑÑŒ чаво.',
+'filename-tooshort' => 'Файлань лементь а Ñаты кувалмозо.',
+'unknown-error' => 'Ð ÑÐ¾Ð´Ð°Ð²Ð¸ÐºÑ Ð¼Ð°Ð½ÑÐ²ÐºÑ Ð»Ð¸ÑÑÑŒ.',
'file-thumbnail-no' => "Файланть Ð»ÐµÐ¼ÐµÐ·Ñ ÑƒÑˆÐ¾Ð´Ð¾Ð²Ð¸ '''<tt>$1</tt>'''.
СонÑÑŒ марÑви вишкалгавтозь фотокуво, покшолмазо ''(кенжешка)''.
УлиндерÑй файланть покш верзиÑзо, йовкÑтыка ÑÐ¾Ð½Ð·Ñ - араÑÑŒ, полавтыка тетень лемензÑ.",
'file-exists-duplicate' => 'Те ÐºÐ°Ð²Ð¾Ð½Ð·Ð°Ð²ÐºÑ Ñ„Ð°Ð¹Ð»Ð° вана {{PLURAL:$1|те файланть|неть файлатнень}} ÑйÑÑ‚Ñ:',
-'successfulupload' => 'СовавтовÑÑŒ кода ÑÑ€Ñви',
'uploadwarning' => 'Совавтомадо кардамонь пачтÑмо',
'savefile' => 'ВанÑÑ‚Ð¾Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°Ð½Ñ‚ÑŒ',
'uploadedimage' => 'йовкÑтазь "[[$1]]"',
'overwroteimage' => 'ÐвкÑÑ‚Ð°Ð¼Ñ "[[$1]]" файлань од верÑиÑ',
'uploaddisabled' => 'СовавтомаÑÑŒ лоткавтозь',
+'uploadfromurl-queued' => 'ÐвкÑтамо файлат ÑйÑÑ ÑƒÑ‡Ð¾Ð²Ñ‚Ñ‹Ñ‚ÑŒ пулоÑо',
'uploadvirus' => 'Те файлаÑонть Ð²Ð¸Ñ€ÑƒÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼! ИнформациÑ: $1',
'upload-source' => 'ЛиÑьмапрÑÐºÑ Ñ„Ð°Ð¹Ð»Ð°',
'sourcefilename' => 'ЛиÑÑŒÐ¼Ð°Ð¿Ñ€Ñ Ñ„Ð°Ð¹Ð»Ð°Ð½Ñ‚ÑŒ лемезÑ',
@@ -1078,6 +1082,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'upload-description' => 'Файланть йовтамозо',
'upload-options' => 'ЙовкÑтамонь параметрат',
'watchthisupload' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ Ñ‚Ðµ лопанть мельга',
+'upload-success-subj' => 'СовавтовÑÑŒ кода ÑÑ€Ñви',
'upload-proto-error' => 'Ðволь иÑÑ‚Ñмо протокол',
'upload-file-error' => 'Потмонь ильведькÑ',
@@ -1103,6 +1108,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'listfiles_search_for' => 'Ð’ÐµÑˆÐ½ÐµÐ¼Ñ Ð¼ÐµÐ´Ð¸Ð° лементь:',
'imgfile' => 'файл',
'listfiles' => 'Файлат-мезть',
+'listfiles_thumb' => 'Кенжешка',
'listfiles_date' => 'Чи',
'listfiles_name' => 'ЛемезÑ',
'listfiles_user' => 'ТеицÑ',
@@ -1347,7 +1353,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
# Watchlist
'watchlist' => 'Мезе мельга мон ванÑтнÑн',
'mywatchlist' => 'Мезе мельга мон ванÑтнÑн',
-'watchlistfor' => "('''$1'''-те)",
'watchnologin' => 'Ðпак Ñова',
'addedwatch' => 'Топавтозь ванома потмокÑоньте',
'addedwatchtext' => 'ЛопаÑÑŒ «[[:$1]]» Ñовавтозь [[Special:Watchlist|ванома потмозот]].
@@ -1530,7 +1535,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'blockipsuccesssub' => 'Ð¡Ð°Ð¹Ð¼ÐµÑ Ð¾Ð·Ð°Ð²Ñ‚Ð¾Ð²ÑÑŒ',
'ipb-edit-dropdown' => 'ВитнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ ÑÐ°Ð¹Ð¼ÐµÑ Ð¾Ð·Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ð½ÑŒ тувталтнÑнь',
'ipb-unblock-addr' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ $1-нть ÑаймеÑÑ‚Ñ',
-'ipb-blocklist-addr' => 'ТеицÑнть $1 ÑÐ°Ð¹Ð¼ÐµÑ Ð¾Ð·Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ð½Ð·Ð¾',
'ipb-blocklist' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ ÑÐ°Ð¹Ð¼ÐµÑ Ð¾Ð·Ð°Ð²Ñ‚Ð¾Ð·ÐµÑ‚Ð½ÐµÐ½ÑŒ',
'ipb-blocklist-contribs' => '$1 Ð»Ð¾Ð¿Ð°Ñ Ð¿ÑƒÑ‚Ð¾Ð²ÐºÑÑ‚',
'unblockip' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ¸Ñ†Ñнть ÑаймеÑÑ‚Ñ',
@@ -1787,13 +1791,14 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
# Media information
'thumbsize' => 'Кенжешканть покшолмазо:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|лопа|$3 лопат}}',
-'file-info' => '(файлонть-путовкÑонть Ñталмозо: $1, MIME типезе: $2)',
-'file-info-size' => '($1 × $2 пикÑельть, файлонть-путовкÑонть Ñталмозо: $3, MIME типезе: $4)',
+'file-info' => 'файлонть-путовкÑонть Ñталмозо: $1, MIME типезе: $2',
+'file-info-size' => '$1 × $2 пикÑельть, файлонть-путовкÑонть Ñталмозо: $3, MIME типезе: $4',
'file-nohires' => '<small>ÐраÑÑŒ верÑÐ¸Ñ Ð¿Ð¾ÐºÑˆ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€Ñ‚Ð¾.</small>',
-'svg-long-desc' => '(SVG файла, $1 × $2 пикÑельть, файланть покшолмазо: $3)',
+'svg-long-desc' => 'SVG файла, $1 × $2 пикÑельть, файланть покшолмазо: $3',
'show-big-image' => 'ПешкÑе теевкÑеÑÑŒ',
'show-big-image-thumb' => '<small>ВаÑнÑнь невтевкÑÑнть покшолмазо: $1 × $2 пикÑÑлт</small>',
'file-info-gif-looped' => 'кирькÑÑÑ Ð°Ñ€Ð°Ð²Ñ‚Ð¾Ð·ÑŒ',
+'file-info-png-looped' => 'кирькÑÑÑ Ð°Ñ€Ð°Ð²Ñ‚Ð¾Ð·ÑŒ',
# Special:NewFiles
'newimages' => 'Од файлатьнень галлереÑÑÑŒ',
@@ -1867,6 +1872,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'exif-gpsdestlatitude' => 'Ðоровамо тарканть келелмазо',
'exif-gpsdestlongitude' => 'Ðоровамо тарканть кувалмозо',
'exif-gpsdatestamp' => 'GPS чи',
+'exif-objectname' => 'ÐурькинеÑÑ‚Ñ Ð»ÐµÐ¼ÐµÐ·Ñ',
# EXIF attributes
'exif-compression-1' => 'Ðпак Ñювордо',
@@ -2084,6 +2090,11 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'tag-filter-submit' => 'Сувтемень пачк нолдамÑ',
'tags-edit' => 'витнемÑ-петнемÑ',
+# Special:ComparePages
+'compare-page1' => 'Лопа 1',
+'compare-page2' => 'Лопа 2',
+'compare-submit' => 'ÐÑ€Ð°Ð²Ñ‚Ð¾Ð¼Ñ ÐºÐ°Ñ€Ð°Ð´Ð¾ каршо',
+
# Database error messages
'dberr-header' => 'Те викиÑÑнть проблема',
diff --git a/languages/messages/MessagesMzn.php b/languages/messages/MessagesMzn.php
index 4fa3f9bf..c8eedc9e 100644
--- a/languages/messages/MessagesMzn.php
+++ b/languages/messages/MessagesMzn.php
@@ -31,18 +31,18 @@ $namespaceNames = array(
NS_SPECIAL => 'شا',
NS_TALK => 'Ú¯Ù¾',
NS_USER => 'کارور',
- NS_USER_TALK => 'کارور گپ',
- NS_PROJECT_TALK => '$1 Ú¯Ù¾',
+ NS_USER_TALK => 'کارور_گپ',
+ NS_PROJECT_TALK => '$1_Ú¯Ù¾',
NS_FILE => 'پرونده',
- NS_FILE_TALK => 'پرونده گپ',
+ NS_FILE_TALK => 'پرونده_گپ',
NS_MEDIAWIKI => 'مه‌دیاویکی',
- NS_MEDIAWIKI_TALK => 'مه‌دیاویکی گپ',
+ NS_MEDIAWIKI_TALK => 'مه‌دیاویکی_گپ',
NS_TEMPLATE => 'شابلون',
- NS_TEMPLATE_TALK => 'شابلون گپ',
+ NS_TEMPLATE_TALK => 'شابلون_گپ',
NS_HELP => 'رانه‌ما',
- NS_HELP_TALK => 'رانه‌مائه گپ',
+ NS_HELP_TALK => 'رانه‌مائه_گپ',
NS_CATEGORY => 'رج',
- NS_CATEGORY_TALK => 'رج گپ',
+ NS_CATEGORY_TALK => 'رج_گپ',
);
$namespaceAliases = array(
@@ -71,7 +71,7 @@ $namespaceAliases = array(
$magicWords = array(
'redirect' => array( '0', '#بور', '#تغییرمسیر', '#REDIRECT' ),
- 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'تعداد_صÙحه‌ها', 'ولگ‌ئون نمره', 'وألگ‌ئون نومره', 'NUMBEROFPAGES' ),
+ 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'تعداد_صÙحه‌ها', 'ولگ‌ئون_نمره', 'وألگ‌ئون_نومره', 'NUMBEROFPAGES' ),
);
$messages = array(
@@ -90,6 +90,7 @@ $messages = array(
'tog-editsection' => 'به کار دمبدائن تیکه‌ئون دچی‌ین از طریق پیوندون [دچی‌ین]',
'tog-editsectiononrightclick' => 'به کار دمبدائن دچی‌ین قسمت‌ئون با راست کیلیک<br />عناوین قسمت‌ئون Ùرو (جاوااسکریپت)',
'tog-showtoc' => 'نیمایش محتوا<br />(برای مقاله‌ئون با بیشته از Û³ سرÙصل)',
+'tog-rememberpassword' => 'مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این کامپیتر دله ته ره یاد دواشه',
'tog-watchcreations' => 'ایضاÙÙ‡ بین صÙحه‌ئونی Ú©Ù‡ من دÙرÙس هاکردمه به پیگیری‌ئون Ùرج.',
'tog-watchdefault' => 'اضاÙÙ‡ هاکردن صÙحه‌هایی Ú©Ù‡ چیمبه به منه پیگری Ùرج',
'tog-watchmoves' => 'صÙحه‌ئونی Ú©Ù‡ کشمبه ره منه Ù¾Ùگیری Ùرج دله بنویس',
@@ -220,24 +221,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'ایضاÙÙ‡ هکردن عونوان',
-'vector-action-delete' => 'پاک هاکردن',
-'vector-action-move' => 'دکش هاکردن',
-'vector-action-protect' => 'موحاÙظت',
-'vector-action-undelete' => 'دباره بنویشته بیّن',
-'vector-action-unprotect' => 'موحاÙظت نکاردن',
-'vector-namespace-category' => 'رج',
-'vector-namespace-help' => 'راهنما ÙصÙحه',
-'vector-namespace-image' => 'پرونده',
-'vector-namespace-main' => 'صحÙÙ‡',
-'vector-view-create' => 'بساتن',
-'vector-view-edit' => 'دچی‌ین',
-'vector-view-history' => 'تاریخچه ره بَدی‌ین',
-'vector-view-view' => 'بأخـونـه‌سـه‌ن',
-'vector-view-viewsource' => 'چـه‌شــمـه ئـه‌شـه‌نـه‌ن',
-'actions' => 'عملکاردون',
-'namespaces' => 'ایسم Ùضائون',
-'variants' => 'گویش‌ئون',
+'vector-action-addsection' => 'ایضاÙÙ‡ هکردن عونوان',
+'vector-action-delete' => 'پاک هاکردن',
+'vector-action-move' => 'دکش هاکردن',
+'vector-action-protect' => 'موحاÙظت',
+'vector-action-undelete' => 'دباره بنویشته بیّن',
+'vector-action-unprotect' => 'موحاÙظت نکاردن',
+'vector-simplesearch-preference' => 'Ùعال هاکردن پیشنهادون بگردستن پیشرÙته (Ùقط پوسته برداری دله)',
+'vector-view-create' => 'بساتن',
+'vector-view-edit' => 'دچی‌ین',
+'vector-view-history' => 'تاریخچه ره بَدی‌ین',
+'vector-view-view' => 'بأخـونـه‌سـه‌ن',
+'vector-view-viewsource' => 'چـه‌شــمـه ئـه‌شـه‌نـه‌ن',
+'actions' => 'عملکاردون',
+'namespaces' => 'ایسم Ùضائون',
+'variants' => 'گویش‌ئون',
'errorpagetitle' => 'خطا!',
'returnto' => 'بردگستن تا $1',
@@ -294,6 +292,7 @@ $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' => '{{SITENAME}} درباره',
@@ -384,7 +383,7 @@ $2، $1',
'yourname' => 'شمه کاروری‌نوم:',
'yourpassword' => 'شمه پسورد',
'yourpasswordagain' => 'پسورد ره دÙباره بنویس',
-'remembermypassword' => 'مـه کاروری نوم ئو پـأس‌واجه ره، ای کـامـپـیـوتـه‌ر ده‌لـه وه‌سـه، شـه یـاد بیـه‌ل',
+'remembermypassword' => 'مـه کاروری نوم ئو پـأس‌واجه ره، ای کـامـپـیـوتـه‌ر ده‌لـه وه‌سـه، شـه یـاد بیـه‌ل (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'شمه کاروری نوم',
'login' => 'دله بوردن',
'nav-login-createaccount' => 'دله بوردن / عضو بیّن',
@@ -400,6 +399,7 @@ $2، $1',
'gotaccount' => 'عضو هسنی؟ $1.',
'gotaccountlink' => 'بورین دله',
'createaccountmail' => 'ایمیل Ùهمراه',
+'createaccountreason' => 'دلیل:',
'badretype' => 'دÙتا پسوردی Ú©Ù‡ بنویشتی اتجور نینه',
'userexists' => 'این کاروری نوم وجود داشته.
لطÙØ£ ات نوم دیگه انتخاب هاکنین.',
@@ -823,8 +823,9 @@ $2، $1',
'nextdiff' => 'ته‌رنه دأچیه‌ن â†',
# Media information
-'thumbsize' => 'أنـگـوسـی گأتی:',
-'file-info-size' => '($1 × $2 پـیـکـسه‌ل, Ùـایـل گـأتـی: $3, MIME مـونـد: $4)',
+'thumbsize' => 'أنـگـوسـی گأتی:',
+'file-info-size' => '$1 × $2 پـیـکـسه‌ل, Ùـایـل گـأتـی: $3, MIME مـونـد: $4',
+'file-info-png-frames' => '$1 {{PLURAL:$1|قاب|قاب}}',
# Special:NewFiles
'newimages' => 'گالری نو عکس‌ئون',
@@ -862,6 +863,19 @@ $2، $1',
'namespacesall' => 'هأمه',
'monthsall' => 'هـأمـه',
+# E-mail address confirmation
+'confirmemail_body_changed' => 'ات Ù†Ùر، احتمالأ خاد شمÙا، از نشونی آی‌پی $1 نشونی پوست ایلکتورونیک حیساب «$2» {{SITENAME}} ره تغییر هدائه.
+
+برای تایید این Ú©Ù‡ این حیساب واقعاً شمه شه Ùˆ Ùعال هکردن دبارهٔ ویژگی پوست ایلکتورونیک {{SITENAME}}ØŒ پیوند زیر دله ره شه مرورگر دله وا هکنین:
+
+$3
+
+اگه این حساب شه مه نی‌یه، پیوند زیر ره دنبال هکنین تا تغییر پوست ایلیکتورونیک ره لغو هکنین:
+
+$5
+
+این تایید یه در $4 منقضی وانه.',
+
# Multipage image navigation
'imgmultigo' => 'بور!',
diff --git a/languages/messages/MessagesNah.php b/languages/messages/MessagesNah.php
index e836d06a..dd70ecf1 100644
--- a/languages/messages/MessagesNah.php
+++ b/languages/messages/MessagesNah.php
@@ -82,7 +82,7 @@ $messages = array(
'tog-showtoolbar' => 'TiquittÄz in tlein motequitiltia tlapatlaliztechcopa (JavaScript)',
'tog-editondblclick' => 'TiquimpatlÄz zÄzaniltin Åme clicca (JavaScript)',
'tog-showtoc' => 'TiquittÄz in tlein cah zÄzotlahcuilÅlco',
-'tog-rememberpassword' => 'TicpiyÄz motlacalaquiliz inÄ«n chÄ«uhpÅhualhuazco',
+'tog-rememberpassword' => 'TicpiyÄz moMotlatequitiltilÄ«ltÅca Ä«huÄn motlahtÅlichtacÄyo inÄ«n chÄ«uhpÅhualhuazco (Ä«xquich {{PLURAL:$1|tÅnalli|tÅnalli}})',
'tog-watchcreations' => 'TiquintlachiyÄz zÄzaniltin tiquinchÄ«hua',
'tog-watchdefault' => 'TiquintlachiyÄz zÄzaniltin tiquimpatla',
'tog-watchmoves' => 'TiquintlachiyÄz zÄzaniltin tiquinzaca',
@@ -207,21 +207,15 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-delete' => 'TicpolÅz',
-'vector-action-move' => 'TiczacÄz',
-'vector-action-protect' => 'Ticquīxtīz',
-'vector-namespace-category' => 'NeneuhcÄyÅtl',
-'vector-namespace-mediawiki' => 'TÄ«tlaniztli',
-'vector-namespace-special' => 'NÅncuahquÄ«zqui Ämatl',
-'vector-namespace-talk' => 'TÄ“ixnÄmiquiliztli',
-'vector-namespace-template' => 'NemachiyÅtÄ«lli',
-'vector-namespace-user' => 'Tlatequitiltilīlli',
-'vector-view-create' => 'TicchÄ«huÄz',
-'vector-view-edit' => 'TicpatlÄz',
-'vector-view-history' => 'TlahcuilÅlli tlahcuilÅlloh',
-'vector-view-view' => 'TÄmapÅhuaz',
-'vector-view-viewsource' => 'TiquittÄz in mÄ“yalli',
-'namespaces' => 'Tòkâyeyàntìn',
+'vector-action-delete' => 'TicpolÅz',
+'vector-action-move' => 'TiczacÄz',
+'vector-action-protect' => 'Ticquīxtīz',
+'vector-view-create' => 'TicchÄ«huÄz',
+'vector-view-edit' => 'TicpatlÄz',
+'vector-view-history' => 'TlahcuilÅlli tlahcuilÅlloh',
+'vector-view-view' => 'TÄmapÅhuaz',
+'vector-view-viewsource' => 'TiquittÄz in mÄ“yalli',
+'namespaces' => 'Tòkâyeyàntìn',
'errorpagetitle' => 'AhcuallÅtl',
'returnto' => 'TimocuepÄz Ä«huÄ«c $1.',
@@ -385,7 +379,7 @@ Ye tihuelīti titēchihtoa [[Special:Preferences|motlaēlēhuiliz]].',
'yourname' => 'MotlatequitiltilÄ«ltÅca:',
'yourpassword' => 'MotlahtÅlichtacÄyo',
'yourpasswordagain' => 'MotlahtÅlichtacÄyo occeppa',
-'remembermypassword' => 'TicpiyÄz motlacalaquiliz inÄ«n chÄ«uhpÅhualhuazco',
+'remembermypassword' => 'TicpiyÄz motlacalaquiliz inÄ«n chÄ«uhpÅhualhuazco (Ä«xquich {{PLURAL:$1|tÅnalli|tÅnalli}})',
'yourdomainname' => 'MoÄxcÄyÅ',
'login' => 'XimomachiyÅmaca/Ximocalaqui',
'nav-login-createaccount' => 'Ximocalaqui / ximomachiyÅmaca',
@@ -401,6 +395,7 @@ Ye tihuelīti titēchihtoa [[Special:Preferences|motlaēlēhuiliz]].',
'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
'gotaccountlink' => 'Ximocalaqui',
'createaccountmail' => 'e-mailcopa',
+'createaccountreason' => 'Tlèka:',
'badretype' => 'Ahneneuhqui motlahtÅlichtacÄyo.',
'userexists' => 'Ye ia in tÅcÄitl Åquihcuilo.
TimitztlÄtlauhtiah xitlahcuiloa occÄ“.',
@@ -597,7 +592,7 @@ Hueliz Åmopolo huiqui nozo Åmozacac.
'difference' => '(Ahneneuhquiliztli tlapatlaliznepantlah)',
'lineno' => 'PÄntli $1:',
'editundo' => 'TichuelÅz',
-'diff-multi' => '({{PLURAL:$1|CÄ“ tlapatlaliztli nepantlah ahmo motta|$1 tlapatlaliztli nepantlah ahmo mottah}}.)',
+'diff-multi' => '({{PLURAL:$1|CÄ“ tlapatlaliztli nepantlah ahmo motta in ÅquichÄ«uh|$1 Tlapatlaliztli nepantlah ahmo mottah in ÅquinchÄ«uh}} {{PLURAL:$2|cÄ“ tlatequitiltilÄ«lli|$2 tlatequitiltilÄ«ltin}})',
# Search results
'searchresults' => 'Tlatēmoliztli',
@@ -822,7 +817,6 @@ TlahcuilÅlli iuhcÄyÅtl {{PLURAL:\$3|moÄ“lÄ“huia cah|moÄ“lÄ“huiah cateh}} \$2.
* TlahcuilÅlli moquetzacah: '''<tt>[[:$1]]</tt>'''
* TlahcuilÅlli tlein ia Ä«tÅca: '''<tt>[[:$2]]</tt>'''
TimitztlÄtlauhtiah, xitlahcuiloa occÄ“ tÅcÄitl.",
-'successfulupload' => 'Cualli quetzaliztli',
'savefile' => 'QuipiyÄz tlahcuilÅlli',
'uploadedimage' => 'Åmoquetz "[[$1]]"',
'overwroteimage' => 'Åmoquetz yancuÄ«c "[[$1]]" iuhcÄyÅtl',
@@ -831,6 +825,7 @@ TimitztlÄtlauhtiah, xitlahcuiloa occÄ“ tÅcÄitl.",
'sourcefilename' => 'TÅcÄhuÄ«cpa:',
'destfilename' => 'TÅcÄhuÄ«c:',
'watchthisupload' => 'TictlachiyÄz inÄ«n zÄzanilli',
+'upload-success-subj' => 'Cualli quetzaliztli',
'upload_source_file' => ' (cÄ“ tlahcuilÅlli mochÄ«uhpÅhualhuazco)',
@@ -931,6 +926,8 @@ TimitztlÄtlauhtiah, xitlahcuiloa occÄ“ tÅcÄitl.",
'nlinks' => '$1 {{PLURAL:$1|tzòwilistli|tzòwilistìn}}',
'nmembers' => '$1 {{PLURAL:$1|tlâkuilòpilli|tlâkuilòpiltìn}}',
'nrevisions' => '$1 {{PLURAL:$1|tlapiyaliztli|tlapiyaliztli}}',
+'nimagelinks' => 'Motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}',
+'ntransclusions' => 'motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}',
'uncategorizedpages' => 'ZÄzaniltin ahmoneneuhcÄyÅtiah',
'uncategorizedcategories' => 'Tlaìxmatkàtlàlilòmë âmò tlatlaìxmatkàtlàlìltìn',
'uncategorizedimages' => 'Ìxiptìn âmò tlatlaìxmatkàtlàlìltìn',
@@ -1023,7 +1020,6 @@ NÅ xiquitta [[Special:WantedCategories|neneuhcÄyÅtl monequi]].',
# Watchlist
'watchlist' => 'Notlachiyaliz',
'mywatchlist' => 'Notlachiyaliz',
-'watchlistfor' => "('''$1''' Ä«techcopa)",
'watchnologin' => 'Ahmo Åtimocalac',
'addedwatch' => 'Ōmocētili tlachiyalizpan',
'removedwatch' => 'ÅŒmopolo Ä«pan motlachiyaliz',
@@ -1348,6 +1344,7 @@ Hueliz cah inÄ«n huÄ“yi tlapatlaliztli. TimitztlÄtlauhtia ticmatÄ«z cuallÅtl a
# Media information
'widthheightpage' => '$1×$2, $3 {{PLURAL:|zÄzanilli|zÄzanilli}}',
+'file-info-size' => '$1 × $2 pixel; zÄzanilli octacayÅtl: $3; machiyÅtl MIME: $4',
'file-nohires' => '<small>Ahmo ia achi cualli ahmo occē īxiptli.</small>',
'show-big-image' => 'Mochi cuallÅtl',
diff --git a/languages/messages/MessagesNan.php b/languages/messages/MessagesNan.php
index 2496682b..420ed076 100644
--- a/languages/messages/MessagesNan.php
+++ b/languages/messages/MessagesNan.php
@@ -33,8 +33,7 @@ $messages = array(
'tog-editsection' => 'JiÌh [siu-kái] chit-ê liân-kiat toÌh Ä“-tàng pian-chiÌp toÄâ¿-loÌh',
'tog-editsectiononrightclick' => 'Chiàâ¿-jiÌh (right click) toÄâ¿-loÌh (section) phiau-tê toÌh Ä“-tàng pian-chiÌp toÄâ¿-loÌh (su-iàu JavaScript)',
'tog-showtoc' => 'Hián-sÄ« boÌk-chhù (3-ê phiau-tê í-siÅng ê iaÌh)',
-'tog-rememberpassword' => 'Kì tiâu biÌt-bé, Äu-chÅa iÅng',
-'tog-editwidth' => 'Pian-chiÌp keh-á thián kàu siÅng khoah',
+'tog-rememberpassword' => 'Kì tiâu biÌt-bé, Äu-chÅa iÅng (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'KÄ goá khui ê iaÌh ka-jiÌp kàm-sÄ«-toaâ¿ lÄi-té',
'tog-watchdefault' => 'KÄ goá pian-chiÌp kòe ê iaÌh ka-jiÌp kàm-sÄ«-toaâ¿ lÄi-té',
'tog-watchmoves' => 'KÄ goá soá ê iaÌh ka-jiÌp kàm-sÄ«-toaâ¿',
@@ -132,22 +131,12 @@ $messages = array(
'qbspecialpages' => 'TeÌk-sû-iaÌh',
# Vector skin
-'vector-action-delete' => 'Thâi',
-'vector-action-move' => 'Sóa khì',
-'vector-action-protect' => 'Pó-hÅ·',
-'vector-action-unprotect' => 'Chhú-siau pó-hÅ·',
-'vector-namespace-category' => 'LÅ«i-piaÌt',
-'vector-namespace-image' => 'Tóng-àn',
-'vector-namespace-main' => 'Bûn-chiuâ¿',
-'vector-namespace-media' => 'Mûi-thé',
-'vector-namespace-mediawiki' => 'Sìn-sit',
-'vector-namespace-project' => 'SÅ«-kang iaÌh',
-'vector-namespace-special' => 'TeÌk-sû-iaÌh',
-'vector-namespace-talk' => 'thó-lūn',
-'vector-namespace-template' => 'Pang-bô·',
-'vector-namespace-user' => 'IÅng-chiá ê iaÌh',
-'vector-view-edit' => 'Siu-kái',
-'vector-view-viewsource' => 'Khoà⿠goân-sú lÅe-iông',
+'vector-action-delete' => 'Thâi',
+'vector-action-move' => 'Sóa khì',
+'vector-action-protect' => 'Pó-hÅ·',
+'vector-action-unprotect' => 'Chhú-siau pó-hÅ·',
+'vector-view-edit' => 'Siu-kái',
+'vector-view-viewsource' => 'Khoà⿠goân-sú lÅe-iông',
'errorpagetitle' => 'Chhò-gÅ·',
'returnto' => 'Tò-tńg khì $1.',
@@ -260,7 +249,7 @@ Chhiaâ¿ chù-ì: Å«-kóa iaÌh Å« khó-lêng khoàâ¿-tioÌh bÄ“-su lí iû-goÃ
'yourname' => 'Lí ê iÅng-chiá miâ-chheng:',
'yourpassword' => 'Lí ê biÌt-bé:',
'yourpasswordagain' => 'Têng phah biÌt-bé:',
-'remembermypassword' => 'Kì tiâu góa ê biÌt-bé (Äu-chhiú teng-jiÌp iÅng).',
+'remembermypassword' => 'Kì tiâu góa ê biÌt-bé (Äu-chhiú teng-jiÌp iÅng) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Teng-jiÌp',
'nav-login-createaccount' => 'Teng-jiÌp / khui sin kháu-chÅ',
'loginprompt' => 'Thiâ¿ Ä“-kha ê chu-liÄu thang khui sin hÅ·-thâu aÌh-sÄ« teng-jiÌp {{SITENAME}}.',
@@ -353,7 +342,6 @@ Lí ê kái-piàn tÄ« Ä“-kha ê bûn-jÄ«-keh. Lí su-iàu chiÅng lí chò ê kÃ
'storedversion' => 'Chu-liÄu-khò· ê pán-pún',
'editingold' => "'''KÉNG-KÃ’: Lí tng teh siu-kái chit iaÌh ê 1 ê kÅ« siu-tÄ“ng-pún. Lí nÄ kÄ pó-chûn khí lâi, chit ê siu-tÄ“ng-pún sòa-Äu ê jÄ«m-hô kái-piàn Ä“ bô khì.'''",
'yourdiff' => 'Chha-piaÌt',
-'longpagewarning' => "'''SÈ-JĪ: Pún iaÌh $1 kilobyte tnÌ‚g; Å«-ê liû-lám-khì bô-hoat-tÅ· pian-chiÌp 32 kb chó-iÅ« iaÌh-sÄ« koh khah tnÌ‚g ê iaÌh. Chhiá⿠khó-lÅ« kÄ chit iaÌh thiah chò khah sè ê toÄâ¿-loÌh.'''",
'readonlywarning' => "'''CHÙ-ÃŒ: Chu-liÄu-khò· taâ¿ só tiâu leh thang pÄn î-siu khang-khòe, só·-í lí hiÄn-chú-sî bô thang pó-chûn jÄ«n-hô phian-chiÌp hÄng-boÌk. Lí Ä“-sái kÄ siong-koan pÅ·-hÅ«n tah--jiÌp-khì 1-ê bûn-jÄ« tóng-àn pó-chûn, Äu-chhiú chiah koh kè-sioÌk.'''",
'protectedpagewarning' => "'''KÉNG-KÃ’: Pún iaÌh só tiâu leh. Kan-taâ¿ Å« hêng-chèng teÌk-koân ê iÅng-chiá (sysop) Ä“-sái siu-kái.'''",
'templatesused' => 'Chit iaÌh iÅng chia ê pang-bô·:',
@@ -478,28 +466,28 @@ Lí ê kái-piàn tÄ« Ä“-kha ê bûn-jÄ«-keh. Lí su-iàu chiÅng lí chò ê kÃ
'recentchangeslinked-noresult' => 'Lí chí-tÄ“ng ê tiâu-kiaâ¿ lÄi-té chhÅe bô jÄ«n-hô kái-piàn.',
# Upload
-'upload' => 'KÄ tóng-àn chiÅ«â¿-bÄng',
-'uploadbtn' => 'KÄ tóng-àn chiÅ«â¿-bÄng',
-'reuploaddesc' => 'Tò khì sàng-chiÅ«â¿-bÄng ê pió.',
-'uploadnologin' => 'Bô teng-jiÌp',
-'uploadnologintext' => 'Bô [[Special:UserLogin|teng-jiÌp]] bÄ“-sái-tit kÄ tóng-àn sàng-chiÅ«â¿-bÄng.',
-'uploaderror' => 'Upload chhò-gÅ·',
-'uploadlogpagetext' => 'Ã-hÄ sÄ« chòe-kÄ«n sàng-chiÅ«â¿-bÄng ê tóng-àn ê liaÌt-toaâ¿.',
-'filename' => 'Tóng-àn',
-'filedesc' => 'Khài-iàu',
-'fileuploadsummary' => 'Khài-iàu:',
-'uploadedfiles' => 'Tóng-àn í-keng sàng chiÅ«â¿-bÄng',
-'ignorewarning' => 'Mài chhap kéng-kò, kÄ tóng-àn pó-chûn khí lâi.',
-'ignorewarnings' => 'Mài chhap kéng-kò',
-'badfilename' => 'Iáâ¿-siÅng ê miâ í-keng kái chò "$1".',
-'successfulupload' => 'Sàng-chiÅ«â¿-bÄng sêng-kong',
-'uploadwarning' => 'Upload kéng-kò',
-'savefile' => 'Pó-chûn tóng-àn',
-'uploadedimage' => 'thoân "[[$1]]" chiÅ«â¿-bÄng',
-'uploaddisabled' => 'Pháiâ¿-sè, sàng chiÅ«â¿-bÄng ê kong-lêng bô khui.',
-'sourcefilename' => 'Tóng-àn goân miâ:',
-'destfilename' => 'Tóng-àn sin miâ:',
-'watchthisupload' => 'Kàm-sÄ« chit iaÌh',
+'upload' => 'KÄ tóng-àn chiÅ«â¿-bÄng',
+'uploadbtn' => 'KÄ tóng-àn chiÅ«â¿-bÄng',
+'reuploaddesc' => 'Tò khì sàng-chiÅ«â¿-bÄng ê pió.',
+'uploadnologin' => 'Bô teng-jiÌp',
+'uploadnologintext' => 'Bô [[Special:UserLogin|teng-jiÌp]] bÄ“-sái-tit kÄ tóng-àn sàng-chiÅ«â¿-bÄng.',
+'uploaderror' => 'Upload chhò-gÅ·',
+'uploadlogpagetext' => 'Ã-hÄ sÄ« chòe-kÄ«n sàng-chiÅ«â¿-bÄng ê tóng-àn ê liaÌt-toaâ¿.',
+'filename' => 'Tóng-àn',
+'filedesc' => 'Khài-iàu',
+'fileuploadsummary' => 'Khài-iàu:',
+'uploadedfiles' => 'Tóng-àn í-keng sàng chiÅ«â¿-bÄng',
+'ignorewarning' => 'Mài chhap kéng-kò, kÄ tóng-àn pó-chûn khí lâi.',
+'ignorewarnings' => 'Mài chhap kéng-kò',
+'badfilename' => 'Iáâ¿-siÅng ê miâ í-keng kái chò "$1".',
+'uploadwarning' => 'Upload kéng-kò',
+'savefile' => 'Pó-chûn tóng-àn',
+'uploadedimage' => 'thoân "[[$1]]" chiÅ«â¿-bÄng',
+'uploaddisabled' => 'Pháiâ¿-sè, sàng chiÅ«â¿-bÄng ê kong-lêng bô khui.',
+'sourcefilename' => 'Tóng-àn goân miâ:',
+'destfilename' => 'Tóng-àn sin miâ:',
+'watchthisupload' => 'Kàm-sÄ« chit iaÌh',
+'upload-success-subj' => 'Sàng-chiÅ«â¿-bÄng sêng-kong',
# Special:ListFiles
'listfiles' => 'Iáâ¿-siÅng liaÌt-toaâ¿',
@@ -641,7 +629,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Kàm-sÄ«-toaâ¿',
'mywatchlist' => 'Góa ê kàm-sÄ«-toaâ¿',
-'watchlistfor' => "('''$1''' ê)",
'nowatchlist' => 'Lí ê kàm-sÄ«-toaâ¿ bô pòaâ¿ hÄng.',
'watchnologin' => 'Bô teng-jiÌp',
'watchnologintext' => 'Lí it-tÄ“ng ài [[Special:UserLogin|teng-jiÌp]] chiah Ä“-tàng siu-kái lí ê kàm-sÄ«-toaâ¿.',
diff --git a/languages/messages/MessagesNap.php b/languages/messages/MessagesNap.php
index 9c7d1ce3..b4c142f1 100644
--- a/languages/messages/MessagesNap.php
+++ b/languages/messages/MessagesNap.php
@@ -66,8 +66,7 @@ $messages = array(
'tog-editsection' => "Permette 'e cagnà 'e sezzione cu a jonta [cagna]",
'tog-editsectiononrightclick' => "Permette 'e cangne 'e sezzione cliccanno p''o tasto destro ncopp 'e titule 'e sezzione (JavaScript)",
'tog-showtoc' => "Mosta ll'innece pe 'e paggene cu cchiù 'e 3 sezzione",
-'tog-rememberpassword' => "Ricurda 'a registrazzione pe' cchiu sessione",
-'tog-editwidth' => "Larghezza massima d''a casella pe scrivere",
+'tog-rememberpassword' => "Ricurda 'a registrazzione pe' cchiu sessione (for a maximum of $1 {{PLURAL:$1|day|days}})",
'underline-always' => 'Sèmpe',
'underline-never' => 'Màje',
@@ -223,7 +222,7 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
'welcomecreation' => "== Bemmenuto, $1! ==
'O cunto è stato criato currettamente. Nun scurdà 'e perzonalizzà 'e ppreferenze 'e {{SITENAME}}.",
-'remembermypassword' => 'Allicuordate d"a password',
+'remembermypassword' => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => "Spiecà 'o dumminio",
'login' => 'Tràse',
'userlogin' => "Tràse o cria n'acciesso nuovo",
diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php
index 3bb683bf..9148ff34 100644
--- a/languages/messages/MessagesNds.php
+++ b/languages/messages/MessagesNds.php
@@ -42,6 +42,7 @@ $namespaceAliases = array(
'$1_Diskussion' => NS_PROJECT_TALK,
'Bild' => NS_FILE,
'Bild_Diskussion' => NS_FILE_TALK,
+ 'Bild_Diskuschoon' => NS_FILE_TALK,
'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
'Vorlage' => NS_TEMPLATE,
'Vorlage_Diskussion' => NS_TEMPLATE_TALK,
@@ -111,7 +112,7 @@ $namespaceNames = array(
);
$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$dateFormats = array(
'mdy time' => 'H:i',
@@ -226,8 +227,7 @@ $messages = array(
'tog-editsection' => 'Links för dat Ännern vun en Afsatz wiesen',
'tog-editsectiononrightclick' => 'En Afsatz mit en Rechtsklick ännern (Javascript)',
'tog-showtoc' => "Wiesen vun'n Inholtsverteken bi Sieten mit mehr as dree Överschriften",
-'tog-rememberpassword' => 'Duersam Inloggen',
-'tog-editwidth' => 'Text-Ingaavfeld mit vulle Breed',
+'tog-rememberpassword' => 'Duersam inloggen (för maximaal $1 {{PLURAL:$1|Dag|Daag}})',
'tog-watchcreations' => 'Nee schrevene Sieden op miene Oppasslist setten',
'tog-watchdefault' => 'Op ne’e un ännerte Sieden oppassen',
'tog-watchmoves' => 'Sieden, de ik schuuv, to de Oppasslist todoon',
@@ -368,31 +368,21 @@ un dat [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook]
'faqpage' => 'Project:Faken stellte Fragen',
# Vector skin
-'vector-action-addsection' => 'Thema tofögen',
-'vector-action-delete' => 'Wegdoon',
-'vector-action-move' => 'Schuven',
-'vector-action-protect' => 'Schulen',
-'vector-action-undelete' => 'Wedderhalen',
-'vector-action-unprotect' => 'Freegeven',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Hülpsied',
-'vector-namespace-image' => 'Datei',
-'vector-namespace-main' => 'Sied',
-'vector-namespace-media' => 'Mediensied',
-'vector-namespace-mediawiki' => 'Naricht',
-'vector-namespace-project' => 'Projektsied',
-'vector-namespace-special' => 'Spezialsied',
-'vector-namespace-talk' => 'Diskuschoon',
-'vector-namespace-template' => 'Vörlaag',
-'vector-namespace-user' => 'Brukersied',
-'vector-view-create' => 'Opstellen',
-'vector-view-edit' => 'Ännern',
-'vector-view-history' => 'Historie bekieken',
-'vector-view-view' => 'Lesen',
-'vector-view-viewsource' => 'Borntext bekieken',
-'actions' => 'Akschonen',
-'namespaces' => 'Naamrüüm',
-'variants' => 'Varianten',
+'vector-action-addsection' => 'Thema tofögen',
+'vector-action-delete' => 'Wegdoon',
+'vector-action-move' => 'Schuven',
+'vector-action-protect' => 'Schulen',
+'vector-action-undelete' => 'Wedderhalen',
+'vector-action-unprotect' => 'Freegeven',
+'vector-simplesearch-preference' => 'Verbeterte Söökvörslääg anstellen (blot mit’n Skin Vector)',
+'vector-view-create' => 'Opstellen',
+'vector-view-edit' => 'Ännern',
+'vector-view-history' => 'Historie bekieken',
+'vector-view-view' => 'Lesen',
+'vector-view-viewsource' => 'Borntext bekieken',
+'actions' => 'Akschonen',
+'namespaces' => 'Naamrüüm',
+'variants' => 'Varianten',
'errorpagetitle' => 'Fehler',
'returnto' => 'Trüch to $1.',
@@ -607,7 +597,7 @@ Vergeet nich, de Sied för di persönlich [[Special:Preferences|intostellen]].',
'yourname' => 'Dien Brukernaam',
'yourpassword' => 'Dien Passwoort',
'yourpasswordagain' => 'Passwoort nochmal ingeven',
-'remembermypassword' => 'Duersam inloggen',
+'remembermypassword' => 'Duersam inloggen (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Diene Domään:',
'externaldberror' => 'Dat geev en Fehler bi de externe Authentifizerungsdatenbank oder du dröffst dien extern Brukerkonto nich ännern.',
'login' => 'Anmellen',
@@ -624,6 +614,7 @@ Vergeet nich, de Sied för di persönlich [[Special:Preferences|intostellen]].',
'gotaccount' => "Hest Du al en Brukerkonto? '''$1'''.",
'gotaccountlink' => 'Anmellen',
'createaccountmail' => 'över E-Mail',
+'createaccountreason' => 'Grund:',
'badretype' => 'De beiden Passwöör stimmt nich övereen.',
'userexists' => 'Disse Brukernaam is al weg. Bitte söök di en annern ut.',
'loginerror' => 'Fehler bi dat Anmellen',
@@ -643,6 +634,7 @@ Kiek de Schrievwies na oder [[Special:UserLogin/signup|mell di as ne’en Bruker
'wrongpasswordempty' => 'Dat Passwoort, wat du ingeven hest, is leddig, versöök dat noch wedder.',
'passwordtooshort' => 'Passwöör mööt opminnst {{PLURAL:$1|een Teken|$1 Teken}} lang oder länger wesen.',
'password-name-match' => 'Du dröffst nich dien Brukernaam as Passwoord nehmen.',
+'password-login-forbidden' => 'Dat Bruken von dissen Brukernaam un dit Passwoord is nich verlöövt.',
'mailmypassword' => 'En nee Passwoord tostüren',
'passwordremindertitle' => 'Nee Passwoort för {{SITENAME}}',
'passwordremindertext' => 'Een (IP-Adress $1) hett för en nee Passwoord to’n Anmellen bi {{SITENAME}} beden ($4).
@@ -675,6 +667,9 @@ Wenn du dat Brukerkonto gor nich hebben wullst, denn is disse Naricht egaal för
Tööv en Stoot, ehrdat du dat noch wedder versöchst.',
'loginlanguagelabel' => 'Spraak: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'Unbekennten Fehler in PHP sien mail()-Funkschoon',
+
# Password reset dialog
'resetpass' => 'Passwoord ännern',
'resetpass_announce' => 'Du hest di mit en Kood anmellt, de di över E-Mail toschickt worrn is. Dat anmellen aftosluten, söök di nu en neet Passwoord ut:',
@@ -725,9 +720,11 @@ Villicht hest du dien Passwoord al ännert oder noch wedder en nee temporär Pas
'showlivepreview' => 'Live-Vörschau',
'showdiff' => 'Ãœnnerscheed wiesen',
'anoneditwarning' => "'''Wohrschau:''' Du büst nich anmellt. Diene IP-Adress warrt in de Versionshistorie vun de Siet fasthollen.",
+'anonpreviewwarning' => "''Du büst nich anmellt. Wenn du nu afspiekerst, dükert dien IP-Adress in de Versionsgeschicht op.''",
'missingsummary' => "'''Wohrschau:''' Du hest keen Tosamenfaten angeven, wat du ännert hest. Wenn du nu Spiekern klickst, warrt de Siet ahn Tosamenfaten spiekert.",
'missingcommenttext' => 'Geev ünnen en Tosamenfaten in.',
-'missingcommentheader' => "'''WOHRSCHAU:''' Du hest keen Överschrift in dat Feld „{{MediaWiki:Subject/nds}}“ ingeven. Wenn du noch wedder op „{{MediaWiki:Savearticle/nds}}“ klickst, denn warrt dien Ännern ahn Överschrift spiekert.",
+'missingcommentheader' => "'''Wohrschau:''' Du hest keen Överschrift in dat Feld „{{int:Subject}}“ ingeven.
+Wenn du noch wedder op „{{int:Savearticle}}“ klickst, denn warrt dien Ännern ahn Överschrift spiekert.",
'summary-preview' => 'Vörschau vun’t Tosamenfaten:',
'subject-preview' => "Vörschau vun de Reeg ''Tosamenfaten'':",
'blockedtitle' => 'Bruker is blockt',
@@ -796,7 +793,7 @@ De jüngste Indrag in dat Sperr-Logbook wart ünnen wiest:',
'userjsyoucanpreview' => "'''Tipp:''' Bruuk den Vörschau-Knoop, üm dien nieg JS vör dat Spiekern to testen.",
'usercsspreview' => "'''Denk doran, dat du blots en Vörschau vun dien CSS ankickst, dat is noch nich spiekert!'''",
'userjspreview' => "'''Denk doran, dat du blots en Vörschau vun dien JS ankiekst, dat is noch nich spiekert!'''",
-'userinvalidcssjstitle' => "'''Wohrschau:''' Dat gifft keen Skin „$1“. Denk dor an, dat .css- un .js-Sieden för Brukers mit en lütten Bookstaven anfangen mööt, to’n Bispeel ''{{ns:user}}:Brukernaam/monobook.css'' un nich ''{{ns:user}}:Brukernaam/Monobook.css''.",
+'userinvalidcssjstitle' => "'''Wohrschau:''' Dat gifft keen Skin „$1“. Denk dor an, dat .css- un .js-Sieden för Brukers mit en lütten Bookstaven anfangen mööt, to’n Bispeel ''{{ns:user}}:Brukernaam/vector.css'' un nich ''{{ns:user}}:Brukernaam/Vector.css''.",
'updated' => '(Ännert)',
'note' => "'''Wohrschau:'''",
'previewnote' => "'''Dit is blots en Vörschau, de Siet is noch nich spiekert!'''",
@@ -833,8 +830,6 @@ Wenn du dat nich wullst, dröffst du dien Text hier nich apentlich maken.<br />
Du bestätigst ok, dat du den Text sülvst schreven hest oder ut en „Public Domain“-Born oder en annere fre'e Born kopeert hest (Kiek ok $1 för Details).
'''Kopeer kene Warken, de enen Oorheverrecht ünnerliggt, ahn Verlööv vun de Copyright-Inhebbers!'''",
-'longpagewarning' => "'''Wohrschau: Disse Sied is $1 kB groot; en poor Browsers köönt Problemen hebben, Sieden to ännern, de grötter as 32 kB sünd.
-Överlegg, wat disse Sied nich villicht in lüttere Afsneed opdeelt warrn kann.'''",
'longpageerror' => "'''Fehler: Dien Text is $1 Kilobytes lang. Dat is länger as dat Maximum vun $2 Kilobytes. Kann den Text nich spiekern.'''",
'readonlywarning' => "'''Wohrscho: De Datenbank is för Pleegarbeiden sparrt worrn, so dat du de Sied en Stoot nich
spiekern kannst. Seker di den Text un versöök dat later noch wedder.'''
@@ -1043,7 +1038,8 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
'compareselectedversions' => 'Ünnerscheed twischen den utwählten Versionen wiesen',
'showhideselectedversions' => 'Utwählt Versionen wiesen/versteken',
'editundo' => 'rutnehmen',
-'diff-multi' => '(Twischen de beiden Versionen {{PLURAL:$1|liggt noch ene Twischenversion|doot noch $1 Twischenversionen liggen}}.)',
+'diff-multi' => '({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von {{PLURAL:$2|een Bruker|$2 Brukers}} warrt nich wiest.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von mehr as $2 {{PLURAL:$2|Bruker|Brukers}} warrt nich wiest)',
# Search results
'searchresults' => 'Söökresultaten',
@@ -1078,6 +1074,7 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
'searchprofile-everything-tooltip' => 'Allen Inholt dörsöken (inklusiv Diskuschoonssieden)',
'searchprofile-advanced-tooltip' => 'Söök in angevene Naamrüüm',
'search-result-size' => '$1 ({{PLURAL:$2|een Woort|$2 Wöör}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Sied|$1 Sieden}} ({{PLURAL:$2|1 Ãœnnerkategorie|$2 Ãœnnerkategorien}}, {{PLURAL:$3|1 Datei|$3 Datein}})',
'search-result-score' => 'Relevanz: $1 %',
'search-redirect' => '(Redirect $1)',
'search-section' => '(Afsnitt $1)',
@@ -1154,6 +1151,7 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
'contextlines' => 'Lienen pro Treffer',
'contextchars' => 'Teken je Reeg',
'stub-threshold' => 'Grött ünner de Lenken op <a href="#" class="stub">Stubbens un lütte Sieden</a> farvlich kenntekent warrn schöölt (in Bytes):',
+'stub-threshold-disabled' => 'Utstellt',
'recentchangesdays' => 'Daag, de de List vun de „Ne’esten Ännern“ wiesen schall:',
'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Dag|Daag}})',
'recentchangescount' => 'Antall Ännern, de wiest warrt:',
@@ -1187,6 +1185,7 @@ Hier is en Tofalls-Slötel, den du bruken kannst: $1',
'prefs-files' => 'Datein',
'prefs-custom-css' => 'Anpasst CSS',
'prefs-custom-js' => 'Anpasst JS',
+'prefs-common-css-js' => 'Deelt CSS/JavaScript för all Skins:',
'prefs-reset-intro' => 'Du kannst disse Sied bruken, dien Instellungen al op de Standardinstellung trüchtosetten.
Dat kann nich wedder ungeschehn maakt warrn.',
'prefs-emailconfirm-label' => 'E-Mail-Bestätigung:',
@@ -1222,8 +1221,14 @@ Dat kann nich wedder ungeschehn maakt warrn.',
'prefs-advancedrendering' => 'Anner Instellungen',
'prefs-advancedsearchoptions' => 'Anner Instellungen',
'prefs-advancedwatchlist' => 'Anner Instellungen',
+'prefs-displayrc' => 'Weddergaav-Instellungen',
+'prefs-displaysearchoptions' => 'Weddergaav-Instellungen',
+'prefs-displaywatchlist' => 'Weddergaav-Instellungen',
'prefs-diffs' => 'Ãœnnerscheed',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-Mail-Adress lett good',
+
# User rights
'userrights' => 'Brukerrechten inrichten',
'userrights-lookup-user' => 'Brukergruppen verwalten',
@@ -1469,7 +1474,6 @@ Wenn du ehr liekers hoochladen wullt, gah trüch un laad de Datei ünner en anne
'fileexists-shared-forbidden' => 'Dat gifft al en Datei mit dissen Naam. Gah trüch un laad de Datei ünner en annern Naam hooch. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'De Datei is desülve as disse {{PLURAL:$1|Datei|$1 Datein}}:',
'file-deleted-duplicate' => 'Jüst disse Datei ([[:$1]]) is al mal löscht worrn. Kiek man eerst, wat in dat Löschlogbook steiht, ehrdat du ehr noch wedder hoochlaadst.',
-'successfulupload' => 'Datei hoochladen hett Spood',
'uploadwarning' => 'Wohrschau',
'savefile' => 'Datei spiekern',
'uploadedimage' => '„$1“ hoochladen',
@@ -1491,6 +1495,7 @@ Wenn du ehr liekers hoochladen wullt, gah trüch un laad de Datei ünner en anne
Bedenk di eerst, wat dat ok passt, dat du de Datei noch wedder hoochladen deist.
Hier dat Logbook, wo insteiht, worüm de Sied wegsmeten worrn is:",
'filename-bad-prefix' => "De Naam vun de Datei fangt mit '''„$1“''' an. Dat is normalerwies en Naam, den de Datei automaatsch vun de Digitalkamera kriggt. De Naam beschrievt de Datei nich un seggt dor ok nix över ut. Söök di doch en Naam för de Datei ut, de ok wat över den Inholt seggt.",
+'upload-success-subj' => 'Datei hoochladen hett Spood',
'upload-proto-error' => 'Verkehrt Protokoll',
'upload-proto-error-text' => 'De URL mutt mit <code>http://</code> oder <code>ftp://</code> anfangen.',
@@ -1631,7 +1636,6 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
'statistics-edits-average' => 'Dörsnittlich Ännern je Sied',
'statistics-views-total' => 'Weddergeven Sieden alltohoop',
'statistics-views-peredit' => 'Weddergeven Sieden je Ännern',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job-Queue-Längd]',
'statistics-users' => 'Anmellt [[Special:ListUsers|Brukers]]',
'statistics-users-active' => 'Aktive Brukers',
'statistics-users-active-desc' => 'Brukers, de {{PLURAL:$1|in de vergahn 24 Stünnen|in de vergahn $1 Daag}} wat daan hebbt',
@@ -1823,33 +1827,38 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
'listgrouprights-removegroup-self-all' => 'Kann all Gruppen vun’t egen Brukerkonto wegdoon',
# E-mail user
-'mailnologin' => 'Du büst nich anmellt.',
-'mailnologintext' => 'Du musst [[Special:UserLogin|anmellt wesen]] un in diene [[Special:Preferences|Instellungen]] en güllige E-Mail-Adress hebben, dat du annere Brukers E-Mails tostüren kannst.',
-'emailuser' => 'E-Mail an dissen Bruker',
-'emailpage' => 'E-Mail an Bruker',
-'emailpagetext' => 'Du kannst dissen Bruker mit dit Formular en E-Mail tostüren. As Afsenner warrt de E-Mail-Adress ut dien [[Special:Preferences|Instellen]] indragen, dat de Bruker di antern kann.',
-'usermailererror' => 'Dat Mail-Objekt hett en Fehler trüchgeven:',
-'defemailsubject' => '{{SITENAME}} E-Mail',
-'noemailtitle' => 'Kene E-Mail-Adress',
-'noemailtext' => 'Disse Bruker hett kene güllige E-Mail-Adress angeven.',
-'nowikiemailtitle' => 'E-Mails sünd nich verlöövt',
-'nowikiemailtext' => 'Disse Bruker will vun annere Brukers keen E-Mails tostüürt kriegen.',
-'email-legend' => 'en annern Bruker op {{SITENAME}} en E-Mail tostüren',
-'emailfrom' => 'Vun:',
-'emailto' => 'An:',
-'emailsubject' => 'Bedrap:',
-'emailmessage' => 'Naricht:',
-'emailsend' => 'Sennen',
-'emailccme' => 'Ik will en Kopie vun mien Naricht an mien egen E-Mail-Adress hebben.',
-'emailccsubject' => 'Kopie vun diene Naricht an $1: $2',
-'emailsent' => 'E-Mail afsennt',
-'emailsenttext' => 'Dien E-Mail is afsennt worrn.',
-'emailuserfooter' => 'Disse E-Mail hett $1 över de Funkschoon „{{int:emailuser}}“ vun {{SITENAME}} $2 tostüürt.',
+'mailnologin' => 'Du büst nich anmellt.',
+'mailnologintext' => 'Du musst [[Special:UserLogin|anmellt wesen]] un in diene [[Special:Preferences|Instellungen]] en güllige E-Mail-Adress hebben, dat du annere Brukers E-Mails tostüren kannst.',
+'emailuser' => 'E-Mail an dissen Bruker',
+'emailpage' => 'E-Mail an Bruker',
+'emailpagetext' => 'Du kannst dissen Bruker mit dit Formular en E-Mail tostüren. As Afsenner warrt de E-Mail-Adress ut dien [[Special:Preferences|Instellen]] indragen, dat de Bruker di antern kann.',
+'usermailererror' => 'Dat Mail-Objekt hett en Fehler trüchgeven:',
+'defemailsubject' => '{{SITENAME}} E-Mail',
+'usermaildisabled' => 'E-Mails an Brukers utstellt',
+'usermaildisabledtext' => 'Du kannst op dit Wiki keen E-Mails na annere Brukers stüren',
+'noemailtitle' => 'Kene E-Mail-Adress',
+'noemailtext' => 'Disse Bruker hett kene güllige E-Mail-Adress angeven.',
+'nowikiemailtitle' => 'E-Mails sünd nich verlöövt',
+'nowikiemailtext' => 'Disse Bruker will vun annere Brukers keen E-Mails tostüürt kriegen.',
+'email-legend' => 'en annern Bruker op {{SITENAME}} en E-Mail tostüren',
+'emailfrom' => 'Vun:',
+'emailto' => 'An:',
+'emailsubject' => 'Bedrap:',
+'emailmessage' => 'Naricht:',
+'emailsend' => 'Sennen',
+'emailccme' => 'Ik will en Kopie vun mien Naricht an mien egen E-Mail-Adress hebben.',
+'emailccsubject' => 'Kopie vun diene Naricht an $1: $2',
+'emailsent' => 'E-Mail afsennt',
+'emailsenttext' => 'Dien E-Mail is afsennt worrn.',
+'emailuserfooter' => 'Disse E-Mail hett $1 över de Funkschoon „{{int:emailuser}}“ vun {{SITENAME}} $2 tostüürt.',
+
+# User Messenger
+'usermessage-summary' => 'Systemnaricht trügglaten',
# Watchlist
'watchlist' => 'Mien Oppasslist',
'mywatchlist' => 'Mien Oppasslist',
-'watchlistfor' => "(för '''$1''')",
+'watchlistfor2' => 'För $1 $2',
'nowatchlist' => 'Du hest kene Indreeg op dien Oppasslist.',
'watchlistanontext' => '$1, dat du dien Oppasslist ankieken oder ännern kannst.',
'watchnologin' => 'Du büst nich anmellt',
@@ -1956,7 +1965,9 @@ De letzte Ännern is vun [[User:$3|$3]] ([[User talk:$3|Diskuschoon]]{{int:pipe-
'editcomment' => "De Ännerkommentar weer: „''$1''“.",
'revertpage' => 'Ännern vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschoon]]) rut un de Version vun [[User:$1]] wedderhaalt',
'rollback-success' => 'Ännern vun $1 trüchsett op letzte Version vun $2.',
-'sessionfailure' => 'Dor weer en Problem mit diene Brukersitzung.
+
+# Edit tokens
+'sessionfailure' => 'Dor weer en Problem mit diene Brukersitzung.
Disse Akschoon is nu ut Sekerheitsgrünn afbraken, dat de Ännern nich verkehrt en annern Bruker toornt warrt.
Gah een Sied trüch un versöök dat noch wedder.',
@@ -2090,6 +2101,7 @@ $1',
'sp-contributions-newbies-title' => 'Brukerbidrääg vun ne’e Brukers',
'sp-contributions-blocklog' => 'Sparr-Logbook',
'sp-contributions-deleted' => 'Wegsmetene Bidrääg vun’n Bruker',
+'sp-contributions-uploads' => 'hooglaadt Datein',
'sp-contributions-logs' => 'Logböker',
'sp-contributions-talk' => 'Diskuschoon',
'sp-contributions-userrights' => 'Brukerrechten inrichten',
@@ -2156,7 +2168,6 @@ Op de [[Special:IPBlockList|IP-Blocklist]] is en List vun alle Blocks to finnen.
'ipb-edit-dropdown' => 'Blockgrünn ännern',
'ipb-unblock-addr' => '„$1“ freegeven',
'ipb-unblock' => 'IP-Adress/Bruker freegeven',
-'ipb-blocklist-addr' => 'Aktuelle Sperren för „$1“',
'ipb-blocklist' => 'Aktuelle Sperren wiesen',
'ipb-blocklist-contribs' => 'Brukerbidrääg för „$1“',
'unblockip' => 'IP-Adress freegeven',
@@ -2374,6 +2385,7 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
'importstart' => 'Sieden warrt rinhaalt...',
'import-revision-count' => '$1 {{PLURAL:$1|Version|Versionen}}',
'importnopages' => 'Gifft kene Sieden to’n Rinhalen.',
+'imported-log-entries' => '$1 {{PLURAL:$1|Logbookindrag|Logbookindrääg}} rinhaalt.',
'importfailed' => 'Import hett kenen Spood: $1',
'importunknownsource' => 'Unbekannten Typ för den Importborn',
'importcantopen' => 'Kunn de Import-Datei nich apen maken',
@@ -2466,6 +2478,7 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
'tooltip-upload' => 'Hoochladen',
'tooltip-rollback' => 'Rullt all Ännern vun’n letzten Bruker an disse Sied mit een Klick trüch.',
'tooltip-undo' => 'Rullt dit een Ännern trüch un wiest den Text in de Vörschau, dat en Grund för’t Ännern angeven warrn kann.',
+'tooltip-preferences-save' => 'Instellungen spiekern',
# Stylesheets
'common.css' => '/** CSS-Kood hier binnen warrt för all Stilvörlagen (Skins) inbunnen */',
@@ -2566,14 +2579,17 @@ $1',
'imagemaxsize' => 'Biller op de Bildsied begrenzen op:',
'thumbsize' => 'Grött vun dat Duumnagel-Bild:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|Ene Siet|$3 Sieden}}',
-'file-info' => '(Grött: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Grött: $3, MIME-Typ: $4)',
+'file-info' => 'Grött: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Grött: $3, MIME-Typ: $4',
'file-nohires' => '<small>Gifft dat Bild nich grötter.</small>',
-'svg-long-desc' => '(SVG-Datei, Utgangsgrött: $1 × $2 Pixel, Dateigrött: $3)',
+'svg-long-desc' => 'SVG-Datei, Utgangsgrött: $1 × $2 Pixel, Dateigrött: $3',
'show-big-image' => 'Dat Bild wat grötter',
'show-big-image-thumb' => '<small>Grött vun disse Vörschau: $1 × $2 Pixels</small>',
'file-info-gif-looped' => 'löppt as Slööp',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Biller}}',
+'file-info-png-looped' => 'löppt as Slööp',
+'file-info-png-repeat' => 'played $1 {{PLURAL:$1|maal|maal}} afspeelt',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Bild|Biller}}',
# Special:NewFiles
'newimages' => 'Ne’e Biller',
@@ -2951,6 +2967,7 @@ Wist du de Siet würklich nee anleggen?",
'table_pager_first' => 'Eerste Siet',
'table_pager_last' => 'Letzte Siet',
'table_pager_limit' => 'Wies $1 Indrääg je Siet',
+'table_pager_limit_label' => 'Saken per Sied:',
'table_pager_limit_submit' => 'Los',
'table_pager_empty' => 'nix funnen',
@@ -3017,6 +3034,8 @@ Du kannst ok de [[Special:Watchlist/edit|normale Sied to’n Ännern]] bruken.',
'version-hook-subscribedby' => 'Opropen vun',
'version-version' => '(Version $1)',
'version-license' => 'Lizenz',
+'version-poweredby-credits' => "Dit Wiki bruukt '''[http://www.mediawiki.org/ MediaWiki]''', Copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'annere',
'version-software' => 'Installeerte Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
@@ -3087,6 +3106,15 @@ Geev den Dateinaam ahn dat Präfix „{{ns:file}}:“ in.',
'tags-edit' => 'ännern',
'tags-hitcount' => '$1 {{PLURAL:$1|Ännern|Ännern}}',
+# Special:ComparePages
+'comparepages' => 'Sieden verglieken',
+'compare-selector' => 'Siedenversionen verglieken',
+'compare-page1' => 'Sied 1',
+'compare-page2' => 'Sied 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Verglieken',
+
# Database error messages
'dberr-header' => 'Dit Wiki hett en Problem',
'dberr-problems' => 'Deit uns leed. Disse Websteed hett opstunns en beten technische Problemen.',
@@ -3103,8 +3131,13 @@ Geev den Dateinaam ahn dat Präfix „{{ns:file}}:“ in.',
'htmlform-float-invalid' => 'De angeven Weert is keen Tall.',
'htmlform-int-toolow' => 'De angeven Weert liggt ünner dat Minimum vun $1',
'htmlform-int-toohigh' => 'De angeven Weert liggt över dat Maximum vun $1',
+'htmlform-required' => 'Disse Weert is Plicht',
'htmlform-submit' => 'Afspiekern',
'htmlform-reset' => 'Ännern trüchsetten',
'htmlform-selectorother-other' => 'Annere',
+# SQLite database support
+'sqlite-has-fts' => '$1 mit Stöhn för Vulltext-Söök',
+'sqlite-no-fts' => '$1 ahn Stöhn för Vulltext-Söök',
+
);
diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php
index ac0c342e..d8b58e55 100644
--- a/languages/messages/MessagesNds_nl.php
+++ b/languages/messages/MessagesNds_nl.php
@@ -166,13 +166,13 @@ $magicWords = array(
'fullurl' => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'FULLURL:' ),
'fullurle' => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'FULLURLE:' ),
'lcfirst' => array( '0', 'HLEERSTE:', 'KLEERSTE:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'GLEERSTE:', 'UCFIRST:' ),
+ 'ucfirst' => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
'lc' => array( '0', 'KL:', 'LC:' ),
'uc' => array( '0', 'HL:', 'UC:' ),
'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
'displaytitle' => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'CODEERURL', 'URLCODEREN', 'URLENCODE:' ),
'anchorencode' => array( '0', 'CODEERANKER', 'ANKERCODEREN', 'ANCHORENCODE' ),
@@ -214,7 +214,7 @@ $specialPageAliases = array(
'Listfiles' => array( 'Ofbeeldingenlieste' ),
'Newimages' => array( 'Nieje_ofbeeldingen' ),
'Listusers' => array( 'Gebrukerslieste' ),
- 'Listgrouprights' => array( 'Groepsrechen bekieken' ),
+ 'Listgrouprights' => array( 'Groepsrechen_bekieken' ),
'Statistics' => array( 'Staotestieken' ),
'Randompage' => array( 'Willekeurig_artikel' ),
'Lonelypages' => array( 'Weespagina\'s' ),
@@ -308,8 +308,7 @@ $messages = array(
'tog-editsection' => 'Mit bewarkgedeeltes',
'tog-editsectiononrightclick' => 'Bewarkgedeelte mit rechtermuusknoppe bewarken (JavaScript)',
'tog-showtoc' => 'Samenvatting van de onderwarpen laoten zien (mit meer as dree onderwarpen)',
-'tog-rememberpassword' => 'Vanzelf anmelden',
-'tog-editwidth' => 'Bewarkingsveld over volle breedte',
+'tog-rememberpassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
'tog-watchcreations' => "Pagina's dee-k anmaak op de volglieste zetten",
'tog-watchdefault' => "Pagina's dee-k wiezig op de volglieste zetten",
'tog-watchmoves' => "Pagina's dee-k herneume op de volglieste zetten",
@@ -455,31 +454,21 @@ $messages = array(
'faqpage' => 'Project:Vragen dee vake esteld wönnen',
# Vector skin
-'vector-action-addsection' => 'Niej onderwarp',
-'vector-action-delete' => 'Vortdoon',
-'vector-action-move' => 'Herneumen',
-'vector-action-protect' => 'Beveiligen',
-'vector-action-undelete' => 'Weerummeplaosen',
-'vector-action-unprotect' => 'Vriegeven',
-'vector-namespace-category' => 'Kattegerie',
-'vector-namespace-help' => 'Hulppagina',
-'vector-namespace-image' => 'Bestaand',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'Mediapagina',
-'vector-namespace-mediawiki' => 'Tiejige',
-'vector-namespace-project' => 'Prejekpagina',
-'vector-namespace-special' => 'Speciale pagina',
-'vector-namespace-talk' => 'Overleg',
-'vector-namespace-template' => 'Mal',
-'vector-namespace-user' => 'Gebrukerspagina',
-'vector-view-create' => 'Anmaken',
-'vector-view-edit' => 'Bewarken',
-'vector-view-history' => 'Geschiedenisse bekieken',
-'vector-view-view' => 'Lezen',
-'vector-view-viewsource' => 'Brontekse bekieken',
-'actions' => 'Haandeling',
-'namespaces' => 'Naamruumtes',
-'variants' => 'Variaanten',
+'vector-action-addsection' => 'Niej onderwarp',
+'vector-action-delete' => 'Vortdoon',
+'vector-action-move' => 'Herneumen',
+'vector-action-protect' => 'Beveiligen',
+'vector-action-undelete' => 'Weerummeplaosen',
+'vector-action-unprotect' => 'Vriegeven',
+'vector-simplesearch-preference' => 'Verbeterde zeuksuggesties anzetten (allinnig mit Vector-vormgeving)',
+'vector-view-create' => 'Anmaken',
+'vector-view-edit' => 'Bewarken',
+'vector-view-history' => 'Geschiedenisse bekieken',
+'vector-view-view' => 'Lezen',
+'vector-view-viewsource' => 'Brontekse bekieken',
+'actions' => 'Haandeling',
+'namespaces' => 'Naamruumtes',
+'variants' => 'Variaanten',
'errorpagetitle' => 'Foutmelding',
'returnto' => 'Weerumme naor $1.',
@@ -540,6 +529,9 @@ Te veule meensen preberen disse pagina te bekieken.
Wach even veurda-j opniej toegang preberen te kriegen tot disse pagina.
$1',
+'pool-timeout' => "Wachtied tiejens 't wachen op vergrendeling",
+'pool-queuefull' => 'De wachrie van de poel is vol',
+'pool-errorunknown' => 'Onbekende fout',
# 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' => 'Over {{SITENAME}}',
@@ -702,7 +694,8 @@ Vergeet neet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te ste
'yourname' => 'Gebrukersnaam',
'yourpassword' => 'Wachwoord',
'yourpasswordagain' => 'Opniej invoeren',
-'remembermypassword' => 'vanzelf anmelden',
+'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
+'securelogin-stick-https' => 'Verbunnen blieven via HTTPS naoda-j an-emeld bin',
'yourdomainname' => 'Joew domein',
'externaldberror' => 'Der gung iets fout bie de externe authenticering, of je maggen je gebrukersprefiel neet bewarken.',
'login' => 'Anmelden',
@@ -719,6 +712,7 @@ Vergeet neet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te ste
'gotaccount' => "Stao-j al in-eschreven? '''$1'''.",
'gotaccountlink' => 'Anmelden',
'createaccountmail' => 'per netpos',
+'createaccountreason' => 'Reden:',
'badretype' => 'De wachwoorden dee-j in-etik hemmen bin neet liekeleens.',
'userexists' => 'Disse gebrukersnaam is al gebruuk.
Kies een aandere naam.',
@@ -743,6 +737,7 @@ Je kunnen neet anmelden.',
'wrongpasswordempty' => "Gien wachwoord in-evoerd. Prebeer 't opniej.",
'passwordtooshort' => 'Wachwoorden mutten uut teminsen {{PLURAL:$1|$1 teken|$1 tekens}} bestaon.',
'password-name-match' => 'Joew wachwoord en gebrukersnaam maggen neet liekeleens ween.',
+'password-login-forbidden' => "'t Gebruuk van disse gebrukersnaam mit dit wachwoord is neet toe-estaon.",
'mailmypassword' => 'Niej wachwoord opsturen',
'passwordremindertitle' => 'Niej tiedelijk wachwoord veur {{SITENAME}}',
'passwordremindertext' => 'Der hef der ene evreugen, vanof \'t IP-adres $1 (werschienlijk jie zelf),
@@ -782,6 +777,9 @@ Je mutten effen wachen veurda-j 't opniej preberen kunnen.",
'loginlanguagelabel' => 'Taal: $1',
'suspicious-userlogout' => "Joew verzeuk um of te melden is of-ewezen umdat 't dernaor uutziet dat 't verstuurd is deur een kepotte webkieker of tussenopslagbuffer",
+# E-mail sending
+'php-mail-error-unknown' => 'Der was een onbekende fout mit de mail()-functie van PHP',
+
# Password reset dialog
'resetpass' => 'Wachwoord wiezigen',
'resetpass_announce' => "Je bin an-emeld mit een veurlopige code dee mit de netpos toe-estuurd wonnen. Um 't anmelden te voltooien, mu-j een niej wachwoord invoeren:",
@@ -834,9 +832,11 @@ Meschien he-j 't wachwoord al ewiezig of een niej veurlopig wachwoord an-evreuge
'showdiff' => 'Verschil bekieken',
'anoneditwarning' => "'''Waorschuwing:''' Je bin neet an-emeld.
As annenieme gebruker zal joew IP-adres bie elke bewarking veur iederene zichbaor ween.",
+'anonpreviewwarning' => "''Je bin neet an-emeld.''
+''Deur de bewarking op te slaon wönnen joew IP-adres op-esleugen in de paginageschiedenisse.''",
'missingsummary' => "'''Herinnering:''' je hemmen gien samenvatting op-egeven veur de bewarking. A-j noen weer op ''Opslaon'' klikken wonnen de bewarking zonder samenvatting op-esleugen.",
'missingcommenttext' => 'Plaos joew opmarking hieronder.',
-'missingcommentheader' => "'''Let wel:''' je hemmen gien onderwarptitel toe-evoeg. A-j opniej op \"Pagina opslaon\" klikken wönnen de bewarking op-esleugen zonder onderwarptitel.",
+'missingcommentheader' => "'''Waorschuwing:''' je hemmen der gien onderwarptitel bie ezet. A-j noen weer op \"{{int:savearticle}}\" klikken, dan wönnen de bewarking op-esleugen zonder onderwarptitel.",
'summary-preview' => 'Samenvatting naokieken:',
'subject-preview' => 'Onderwarp/kop naokieken:',
'blockedtitle' => 'Gebruker is eblokkeerd',
@@ -907,7 +907,11 @@ De leste regel uut 't blokkeerlogboek steet hieronder as rifferentie:",
'usercsspreview' => "'''Dit is allinnig een controle van joew persoonlijke CSS.'''
''''t Is nog neet op-esleugen!'''",
'userjspreview' => "'''Denk deran da-j joew persoonlijke JavaScript allinnig nog mar an 't bekieken bin, 't is nog neet op-esleugen!'''",
-'userinvalidcssjstitle' => "'''Waorschuwing:''' der is gien uutvoering mit de naam \"\$1\". Vergeet neet dat joew eigen .css- en .js-pagina's beginnen mit een kleine letter, bv. \"{{ns:user}}:Naam/'''m'''onobook.css\" in plaose van \"{{ns:user}}:Naam/'''M'''onobook.css\".",
+'sitecsspreview' => "'''Je bin allinnig mer de CSS an 't naokieken.'''
+''''t Is nog neet op-esleugen!'''",
+'sitejspreview' => "'''Je bin allinnig mer de JavaScript-code an 't naokieken.'''
+''''t Is nog neet op-esleugen!'''",
+'userinvalidcssjstitle' => "'''Waorschuwing:''' der is gien uutvoering mit de naam \"\$1\". Vergeet neet dat joew eigen .css- en .js-pagina's beginnen mit een kleine letter, bv. \"{{ns:user}}:Naam/'''v'''ector\" in plaose van \"{{ns:user}}:Naam/'''V'''ector.css\".",
'updated' => '(Bewark)',
'note' => "'''Opmarking:'''",
'previewnote' => "'''NB: je bin de pagina allinnig nog mar an 't naokieken; de tekse is nog neet op-esleugen!'''",
@@ -944,7 +948,6 @@ Deur op \"Pagina opslaon\" te klikken beleuf je ons da-j disse tekse zelf eschre
'copyrightwarning2' => "Waort je dat alle biedragen an {{SITENAME}} deur aander volk bewark of vort-edaon kan wönnen. A-j neet willen dat joew tekse deur aander volk bewark wönnen, slao de tekse dan neet op.<br />
Deur op \"Pagina opslaon\" te klikken beleuf je ons da-j disse tekse zelf eschreven hemmen, of over-eneumen hemmen uut een vrieje, openbaore bron (zie \$1 veur meer infermasie).
'''Gebruuk gien spul mit auteursrechen, a-j daor gien toestemming veur hemmen!'''",
-'longpagewarning' => "Disse pagina is $1 kB groot. 't Bewarken van grote pagina's kan veur preblemen zörgen bie ouwere webkiekers.",
'longpageerror' => "'''Foutmelding: de tekse dee-j opslaon willen is $1 kilobytes. Dit is groter as 't toe-estaone maximum van $2 kilobytes. Joew tekse kan neet op-esleugen wönnen.'''",
'readonlywarning' => "'''Waorschuwing: De databanke is op dit mement in onderhoud; 't is daorumme neet meugelijk um pagina's te wiezigen.
Je kunnen de tekse 't beste op de computer opslaon en laoter opniej preberen de pagina te bewarken.'''
@@ -1116,6 +1119,8 @@ $1",
'logdelete-failure' => "'''De zichbaorheid van de logboekregel kon neet in-esteld wonnen:'''
$1",
'revdel-restore' => 'Zichbaorheid wiezigen',
+'revdel-restore-deleted' => 'vort-edaone versies',
+'revdel-restore-visible' => 'zichbaore versies',
'pagehist' => 'Paginageschiedenisse',
'deletedhist' => 'Geschiedenisse dee vort-ehaold is',
'revdelete-content' => 'inhoud',
@@ -1182,11 +1187,13 @@ Kiek de logboeken nao.",
# Diffs
'history-title' => 'Geschiedenisse van "$1"',
'difference' => '(Verschil tussen bewarkingen)',
+'difference-multipage' => "(Verschil tussen pagina's)",
'lineno' => 'Regel $1:',
'compareselectedversions' => 'Vergeliek de ekeuzen versies',
'showhideselectedversions' => 'Ekeuzen versies weergeven/verbargen',
'editundo' => 'weerummedreien',
-'diff-multi' => '(Hier {{PLURAL:$1|zit nog 1 versie|zitten nog $1 versies tussen}}.)',
+'diff-multi' => '(Hier {{PLURAL:$1|zit nog 1 versie|zitten nog $1 versies}} van {{PLURAL:$2|1 gebruker|$2 gebrukers}} tussen dee der neet bie staon.)',
+'diff-multi-manyusers' => '($1 tussenliggende versies deur meer as $2 gebrukers staon der neet bie)',
# Search results
'searchresults' => 'Zeukrisseltaoten',
@@ -1221,6 +1228,7 @@ Kiek de logboeken nao.",
'searchprofile-everything-tooltip' => "Alle inhoud deurzeuken (oek overlegpagina's)",
'searchprofile-advanced-tooltip' => 'Zeuken in de an-egeven naamruumtes',
'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woorden}})',
+'search-result-category-size' => '{{PLURAL:$1|1 kattegerielid|$1 kattegerielejen}} ({{PLURAL:$2|1 onderkattegerie|$2 onderkattegerieën}}, {{PLURAL:$3|1 bestaand|$3 bestanen}})',
'search-result-score' => 'Rillevantie: $1%',
'search-redirect' => '(deurverwiezing $1)',
'search-section' => '(onderwarp $1)',
@@ -1295,6 +1303,7 @@ Kiek de logboeken nao.",
'contextlines' => 'Antal regels per evunnen pagina',
'contextchars' => 'Antal tekens per pagina',
'stub-threshold' => 'Verwiezingsformettering van <a href="#" class="stub">beginnetjes</a>:',
+'stub-threshold-disabled' => 'Uut-eschakeld',
'recentchangesdays' => 'Antal dagen dee de lieste "leste wiezigingen" laot zien:',
'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|dag|dagen}})',
'recentchangescount' => 'Standard antal bewarkingen um te laoten zien:',
@@ -1328,6 +1337,7 @@ Je kunnen oek disse egenereren standardcode gebruken: $1",
'prefs-files' => 'Bestanen',
'prefs-custom-css' => 'Persoonlijke CSS',
'prefs-custom-js' => 'Persoonlijke JS',
+'prefs-common-css-js' => 'Edelen CSS/JS veur elke vormgeving:',
'prefs-reset-intro' => 'Je kunnen disse pagina gebruken um joew veurkeuren naor de standardinstellingen weerumme te zetten.
Disse haandeling kan neet ongedaon-emaak wonnen.',
'prefs-emailconfirm-label' => 'Netposbevestiging:',
@@ -1366,9 +1376,15 @@ Je kunnen oek aandere luui in staot stellen um per netpos kontak mit joe op te n
'prefs-advancedrendering' => 'Aandere instellingen',
'prefs-advancedsearchoptions' => 'Aandere instellingen',
'prefs-advancedwatchlist' => 'Aandere instellingen',
-'prefs-display' => 'Weergave-instellingen',
+'prefs-displayrc' => 'Weergave-instellingen',
+'prefs-displaysearchoptions' => 'Weergave-instellingen',
+'prefs-displaywatchlist' => 'Weergave-instellingen',
'prefs-diffs' => 'Verschillen',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Geldig netposadres',
+'email-address-validity-invalid' => 'Geef een geldig netposadres op',
+
# User rights
'userrights' => 'Gebrukersrechenbeheer',
'userrights-lookup-user' => 'Beheer gebrukersgroepen',
@@ -1452,6 +1468,7 @@ Je kunnen oek aandere luui in staot stellen um per netpos kontak mit joe op te n
'right-hideuser' => 'Een gebruker veur de overige gebrukers verbargen',
'right-ipblock-exempt' => 'IP-blokkeringen ummezeilen',
'right-proxyunbannable' => "Blokkeringen veur proxy's gellen neet",
+'right-unblockself' => 'Eigen gebruker deblokkeren',
'right-protect' => "Beveiligingsnivo's wiezigen",
'right-editprotected' => "Beveiligen pagina's bewarken",
'right-editinterface' => "'t {{SITENAME}}-uterlijk bewarken",
@@ -1474,7 +1491,6 @@ Je kunnen oek aandere luui in staot stellen um per netpos kontak mit joe op te n
'right-siteadmin' => 'De databanke blokkeren en weer vriegeven',
'right-reset-passwords' => 'Wachwoorden van aandere gebrukers opniej instellen',
'right-override-export-depth' => "Pagina's uutvoeren, oek de pagina's waor naor verwezen wonnen, tot een diepte van 5",
-'right-versiondetail' => 'Uut-ebreide versieinfermasie van de pregrammetuur laoten zien',
'right-sendemail' => 'Berich versturen naor aandere gebrukers',
# User rights log
@@ -1525,14 +1541,9 @@ Je kunnen oek aandere luui in staot stellen um per netpos kontak mit joe op te n
'recentchanges-legend' => 'Opties veur leste wiezigingen',
'recentchangestext' => 'Op disse pagina ku-j de leste wiezigingen van disse wiki bekieken.',
'recentchanges-feed-description' => 'Zeuk naor de alderleste wiezingen op disse wiki in disse feed.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nieje pagina',
'recentchanges-label-newpage' => 'Mit disse bewarking is een nieje pagina an-emaak',
-'recentchanges-legend-minor' => '$1 - kleine wieziging',
'recentchanges-label-minor' => 'Dit is een kleine wieziging',
-'recentchanges-legend-bot' => '$1 - botbewarking',
'recentchanges-label-bot' => 'Disse bewarking is uut-evoerd deur een bot',
-'recentchanges-legend-unpatrolled' => '$1 - bewarking is neet nao-ekeken',
'recentchanges-label-unpatrolled' => 'Disse bewarking is nog neet nao-ekeken',
'rcnote' => "Hieronder {{PLURAL:$1|steet de leste bewarking|staon de leste '''$1''' bewarkingen}} van de of-eleupen {{PLURAL:$2|dag|'''$2''' dagen}} (stand: $5, $4).",
'rcnotefrom' => 'Dit bin de wiezigingen sins <b>$2</b> (maximum van <b>$1</b> wiezigingen).',
@@ -1579,6 +1590,9 @@ Je kunnen oek aandere luui in staot stellen um per netpos kontak mit joe op te n
'upload_directory_missing' => 'De bestaanstoevoegingsmap ($1) is vort en kon neet an-emaak wönnen deur de webserver.',
'upload_directory_read_only' => "Op 't mement ku-j gien bestanen toevoegen vanwegen technische preblemen ($1).",
'uploaderror' => "Fout bie 't toevoegen van 't bestaand",
+'upload-recreate-warning' => "'''Waorschuwing: der is een bestaand mit disse naam vort-edaon of herneumd.'''
+
+Hieronder steet 't vortdologboek en 't herneumlogboek veur disse pagina:",
'uploadtext' => "Gebruuk 't formelier hieronder um bestanen derbie te zetten.
Um bestanen te bekieken of te zeuken dee-j der eerder al bie ezet hemmen, ku-j naor de [[Special:FileList|bestaanslieste]] gaon.
Bestanen en media dee nao 't vortdoon opniej derbie zet wönnen ku-j in de smiezen houwen in 't [[Special:Log/upload|logboek mit nieje bestanen]] en 't [[Special:Log/delete|vortdologboek]].
@@ -1613,6 +1627,17 @@ Zie de [[Special:NewFiles|uutstalling mit media]] veur een overzichte.',
'filetype-banned-type' => "'''\".\$1\"''' is gien toe-estaone bestaanstype.
Toe-estaone {{PLURAL:\$3|bestaanstype is|bestaanstypes bin}} \$2.",
'filetype-missing' => 'Dit bestaand hef gien extensie (bv. ".jpg").',
+'empty-file' => "'t Bestaand da-j op-egeven hemmen was leeg.",
+'file-too-large' => "'t Bestaand da-j op-egeven hemmen was te groot.",
+'filename-tooshort' => "'t Bestaand da-j op-egeven hemmen was te klein.",
+'filetype-banned' => 'Dit bestaanstype is neet toe-estaon.',
+'verification-error' => "Dit bestaand is 't bestaansonderzeuk neet deur-ekeumen.",
+'hookaborted' => 'De wieziging dee-j preberen deur te voeren bin of-ebreuken deur een extra uutbreiding.',
+'illegal-filename' => 'Disse bestaansnaam is neet toe-estaon.',
+'overwrite' => "'t Overschrieven van een bestaand is neet toe-estaon.",
+'unknown-error' => 'Der is een onbekende fout op-etrejen.',
+'tmp-create-error' => 'Kon gien tiejelijk bestaand anmaken.',
+'tmp-write-error' => "Der is een fout op-etrejen bie 't anmaken van een tiejelijk bestaand.",
'large-file' => 'Bestanen mutten neet groter ween as $1, dit bestaand is $2.',
'largefileserver' => "'t Bestaand is groter as dat de server toesteet.",
'emptyfile' => "'t Bestaand da-j toe-evoeg hemmen is leeg. Dit kan koemen deur een tikfout in de bestaansnaam. Kiek effen nao o-j dit bestaand wè bedoelen.",
@@ -1641,13 +1666,14 @@ A-j 't bestaand asnog toevoegen willen, gao dan weerumme en kies een aandere naa
'file-exists-duplicate' => "Dit bestaand is liekeleens as {{PLURAL:$1|'t volgende bestaand|de volgende bestanen}}:",
'file-deleted-duplicate' => "Een bestaand dat liekeleens is an dit bestaand ([[:$1]]) is eerder al vort-edaon.
Bekiek 't vortdologboek veurda-j veurdan gaon.",
-'successfulupload' => 'Bestaanstoevoeging was succesvol',
'uploadwarning' => 'Waorschuwing',
'uploadwarning-text' => "Pas de bestaansbeschrieving hieronder an en prebeer 't opniej",
'savefile' => 'Bestaand opslaon',
'uploadedimage' => 'Toe-evoeg: [[$1]]',
'overwroteimage' => 'Nieje versie van "[[$1]]" toe-evoeg',
'uploaddisabled' => 'Bestanen toevoegen is neet meugelijk.',
+'copyuploaddisabled' => 'Bestanen toevoegen via een webadres is uut-eschakeld.',
+'uploadfromurl-queued' => 'Joew bestaanstoevoeging is in de wachrie ezet.',
'uploaddisabledtext' => 'Bestaanstoevoegingen bin uut-eschakeld.',
'php-uploaddisabledtext' => "'t Toevoegen van PHP-bestanen is uut-eschakeld. Kiek de instellingen veur 't toevoegen van bestanen effen nao.",
'uploadscripted' => 'Dit bestaand bevat HTML- of scriptcode dee verkeerd elezen kan wönnen deur de webkieker.',
@@ -1666,6 +1692,15 @@ Bekiek 't vortdologboek veurda-j veurdan gaon.",
Bedenk eers of 't inderdaod de bedoeling is dat dit bestaand toe-evoeg wönnen.
't Logboek mit alle vort-edaone infermasie ku-j hier vienen:",
'filename-bad-prefix' => "De naam van 't bestaand da-j toevoegen, begint mit '''\"\$1\"''', dit is een neet-beschrievende naam dee meestentieds autematisch deur een digitale camera egeven wonnen. Kies een dudelijke naam veur 't bestaand.",
+'upload-success-subj' => 'Bestaanstoevoeging was succesvol',
+'upload-success-msg' => "'t Bestaand [$2] steet derop. Je kunnen 't hier vienen: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => "Prebleem bie 't toevoegen van 't bestaand",
+'upload-failure-msg' => "Der was een prebleem bie 't toevoegen van [$2]:
+
+$1",
+'upload-warning-subj' => "Waorschuwing veur 't toevoegen van bestanen",
+'upload-warning-msg' => "Der was een prebleem mit toevoegen van 't bestaand [$2].
+Gao weerumme naor 't [[Special:Upload/stash/$1|bestaanstoevoegingsformelier]] um dit prebleem te verhelpen.",
'upload-proto-error' => 'Verkeerd protecol',
'upload-proto-error-text' => 'Um op disse meniere bestanen toe te voegen mutten webadressen beginnen mit <code>http://</code> of <code>ftp://</code>.',
@@ -1725,6 +1760,7 @@ Klikken op een kelomkop veraandert de sortering.',
'listfiles_search_for' => 'Zeuk op ofbeeldingnaam:',
'imgfile' => 'bestaand',
'listfiles' => 'Ofbeeldingenlieste',
+'listfiles_thumb' => 'Ofbeeldingsoverzichte',
'listfiles_date' => 'Daotum',
'listfiles_name' => 'Naam',
'listfiles_user' => 'Gebruker',
@@ -1837,7 +1873,6 @@ Vergeet neet de verwiezingen nao te kieken veurda-j de mal vortdoon.',
'statistics-edits-average' => 'Gemiddeld antal bewarkingen per pagina',
'statistics-views-total' => "Totaal antal weer-egeven pagina's",
'statistics-views-peredit' => "Weer-egeven pagina's per bewarking",
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Jobqueuelengte]',
'statistics-users' => 'In-eschreven [[Special:ListUsers|gebrukers]]',
'statistics-users-active' => 'Actieve gebrukers',
'statistics-users-active-desc' => 'Gebrukers dee de veurbieje {{PLURAL:$1|dag|$1 dagen}} een haandeling uut-evoerd hemmen',
@@ -1851,7 +1886,7 @@ Pagina's wönnen ezien as een deurverwiespagina, as de mal gebruuk wönnen dee v
'doubleredirects' => 'Dubbele deurverwiezingen',
'doubleredirectstext' => "Op disse lieste staon alle pagina's dee deurverwiezen naor aandere deurverwiezingen.
-Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelpagina van de tweede deurverwiezing.
+Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelpagina van de tweede deurverwiezing.
Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina heer zol mutten liejen.",
'double-redirect-fixed-move' => '[[$1]] is herneumd en is noen een deurverwiezing naor [[$2]]',
'double-redirect-fixer' => 'Deurverwiezingsverbeteraar',
@@ -1875,6 +1910,8 @@ Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina h
'nmembers' => '$1 {{PLURAL:$1|onderwarp|onderwarpen}}',
'nrevisions' => '$1 {{PLURAL:$1|versie|versies}}',
'nviews' => '{{PLURAL:$1|1 keer|$1 keer}} bekeken',
+'nimagelinks' => "Wönnen op {{PLURAL:$1|één pagina|$1 pagina's}} gebruuk",
+'ntransclusions' => "wönnen op {{PLURAL:$1|één pagina|$1 pagina's}} gebruuk",
'specialpage-empty' => 'Disse pagina is leeg.',
'lonelypages' => "Weespagina's",
'lonelypagestext' => "Naor disse pagina's wönnen neet verwezen vanuut {{SITENAME}} en ze bin oek nargens in-evoeg.",
@@ -2034,35 +2071,41 @@ Meer infermasie over de rechen ku-j [[{{MediaWiki:Listgrouprights-helppage}}|hie
'listgrouprights-removegroup-self-all' => 'Kan alle groepen vortdoon van eigen gebruker',
# E-mail user
-'mailnologin' => 'Neet an-emeld.',
-'mailnologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween en een geldig e-mailadres in "[[Special:Preferences|mien veurkeuren]]" invoeren um disse functie te kunnen gebruken.',
-'emailuser' => 'Een berich sturen',
-'emailpage' => 'Gebruker een berich sturen',
-'emailpagetext' => "Deur middel van dit formelier ku-j een berich sturen naor disse gebruker.
+'mailnologin' => 'Neet an-emeld.',
+'mailnologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween en een geldig e-mailadres in "[[Special:Preferences|mien veurkeuren]]" invoeren um disse functie te kunnen gebruken.',
+'emailuser' => 'Een berich sturen',
+'emailpage' => 'Gebruker een berich sturen',
+'emailpagetext' => "Deur middel van dit formelier ku-j een berich sturen naor disse gebruker.
't Adres da-j op-egeven hemmen bie [[Special:Preferences|joew veurkeuren]] zal as ofzender gebruuk wonnen.
De ontvanger kan dus drek beantwoorden.",
-'usermailererror' => "Foutmelding bie 't versturen:",
-'defemailsubject' => 'Berich van {{SITENAME}}',
-'noemailtitle' => 'Gebruker hef gien netposadres op-egeven',
-'noemailtext' => 'Disse gebruker hef gien geldig e-mailadres in-evoerd.',
-'nowikiemailtitle' => 'Netpos is neet toe-estaon',
-'nowikiemailtext' => 'Disse gebruker wil gien netpos toe-estuurd kriegen van aandere gebrukers.',
-'email-legend' => 'Een berich sturen naor een aandere gebruker van {{SITENAME}}',
-'emailfrom' => 'Van:',
-'emailto' => 'An:',
-'emailsubject' => 'Onderwarp:',
-'emailmessage' => 'Berich:',
-'emailsend' => 'Versturen',
-'emailccme' => 'Stuur mien een kopie van dit berich.',
-'emailccsubject' => 'Kopie van joew berich an $1: $2',
-'emailsent' => 'Berich verstuurd',
-'emailsenttext' => 'Berich is verzunnen.',
-'emailuserfooter' => 'Dit berich is verstuurd deur $1 an $2 deur de functie "Een berich sturen" van {{SITENAME}} te gebruken.',
+'usermailererror' => "Foutmelding bie 't versturen:",
+'defemailsubject' => 'Berich van {{SITENAME}}',
+'usermaildisabled' => 'Een persoonlijk berichjen sturen geet neet.',
+'usermaildisabledtext' => 'Je kunnen gien berichjes sturen naor aandere gebrukers van disse wiki',
+'noemailtitle' => 'Gebruker hef gien netposadres op-egeven',
+'noemailtext' => 'Disse gebruker hef gien geldig e-mailadres in-evoerd.',
+'nowikiemailtitle' => 'Netpos is neet toe-estaon',
+'nowikiemailtext' => 'Disse gebruker wil gien netpos toe-estuurd kriegen van aandere gebrukers.',
+'email-legend' => 'Een berich sturen naor een aandere gebruker van {{SITENAME}}',
+'emailfrom' => 'Van:',
+'emailto' => 'An:',
+'emailsubject' => 'Onderwarp:',
+'emailmessage' => 'Berich:',
+'emailsend' => 'Versturen',
+'emailccme' => 'Stuur mien een kopie van dit berich.',
+'emailccsubject' => 'Kopie van joew berich an $1: $2',
+'emailsent' => 'Berich verstuurd',
+'emailsenttext' => 'Berich is verzunnen.',
+'emailuserfooter' => 'Dit berich is verstuurd deur $1 an $2 deur de functie "Een berich sturen" van {{SITENAME}} te gebruken.',
+
+# User Messenger
+'usermessage-summary' => 'Systeemteksen achter-eleuten',
+'usermessage-editor' => 'Systeemtekse',
# Watchlist
'watchlist' => 'Volglieste',
'mywatchlist' => 'Mien volglieste',
-'watchlistfor' => "(veur '''$1''')",
+'watchlistfor2' => 'Veur $1 ($2)',
'nowatchlist' => 'Gien artikels in volglieste.',
'watchlistanontext' => '$1 is verplich um joew volglieste te bekieken of te wiezigen.',
'watchnologin' => 'Neet an-emeld',
@@ -2180,7 +2223,10 @@ De leste bewarking op disse pagina is edaon deur [[User:$3|$3]] ([[User talk:$3|
'revertpage' => 'Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur $1',
'revertpage-nouser' => 'Wiezigingen deur (gebrukersnaam vort-edaon) weerummedreid naor de leste versie deur [[User:$1|$1]]',
'rollback-success' => 'Wiezigingen van $1; weerummedreid naor de leste versie van $2.',
-'sessionfailure' => 'Der is een prebleem mit joew anmeldsessie. De actie is stop-ezet uut veurzörg tegen een beveiligingsrisico (dat besteet uut \'t meugelijke "kraken" van disse sessie). Gao weerumme naor de veurige pagina, laoj disse pagina opniej en prebeer \'t nog es.',
+
+# Edit tokens
+'sessionfailure-title' => 'Sessiefout',
+'sessionfailure' => 'Der is een prebleem mit joew anmeldsessie. De actie is stop-ezet uut veurzörg tegen een beveiligingsrisico (dat besteet uut \'t meugelijke "kraken" van disse sessie). Gao weerumme naor de veurige pagina, laoj disse pagina opniej en prebeer \'t nog es.',
# Protect
'protectlogpage' => 'Beveiligingslogboek',
@@ -2308,19 +2354,23 @@ $1",
'month' => 'Maond:',
'year' => 'Jaor:',
-'sp-contributions-newbies' => 'Allinnig biedragen van anwas bekieken',
-'sp-contributions-newbies-sub' => 'Veur anwas',
-'sp-contributions-newbies-title' => 'Biedragen van anwas',
-'sp-contributions-blocklog' => 'blokkeerlogboek',
-'sp-contributions-deleted' => 'vort-edaone gebrukersbiedragen',
-'sp-contributions-logs' => 'logboeken',
-'sp-contributions-talk' => 'overleg',
-'sp-contributions-userrights' => 'gebrukersrechenbeheer',
-'sp-contributions-blocked-notice' => "Disse gebruker is op 't mement eblokkeerd.
+'sp-contributions-newbies' => 'Allinnig biedragen van anwas bekieken',
+'sp-contributions-newbies-sub' => 'Veur anwas',
+'sp-contributions-newbies-title' => 'Biedragen van anwas',
+'sp-contributions-blocklog' => 'blokkeerlogboek',
+'sp-contributions-deleted' => 'vort-edaone gebrukersbiedragen',
+'sp-contributions-uploads' => 'nieje bestanen',
+'sp-contributions-logs' => 'logboeken',
+'sp-contributions-talk' => 'overleg',
+'sp-contributions-userrights' => 'gebrukersrechenbeheer',
+'sp-contributions-blocked-notice' => "Disse gebruker is op 't mement eblokkeerd.
De leste regel uut 't blokkeerlogboek steet hieronder as rifferentie:",
-'sp-contributions-search' => 'Zeuken naor biedragen',
-'sp-contributions-username' => 'IP-adres of gebrukersnaam:',
-'sp-contributions-submit' => 'Zeuk',
+'sp-contributions-blocked-notice-anon' => "Dit IP-adres is eblokkeerd.
+De leste regel uut 't blokkeerlogboek steet as rifferentie",
+'sp-contributions-search' => 'Zeuken naor biedragen',
+'sp-contributions-username' => 'IP-adres of gebrukersnaam:',
+'sp-contributions-toponly' => 'Allinnig de niejste versie laoten zien',
+'sp-contributions-submit' => 'Zeuk',
# What links here
'whatlinkshere' => 'Verwiezingen naor disse pagina',
@@ -2379,7 +2429,6 @@ Op de [[Special:IPBlockList|IP-blokkeerlieste]] steet een lieste mit alle blokke
'ipb-edit-dropdown' => 'Blokkeerredens bewarken',
'ipb-unblock-addr' => 'Deblokkeer $1',
'ipb-unblock' => 'Deblokkeer een gebruker of IP-adres',
-'ipb-blocklist-addr' => 'Bestaonde blokkeringen veur $1',
'ipb-blocklist' => 'Bekiek bestaonde blokkeringen',
'ipb-blocklist-contribs' => 'Biedragen van $1',
'unblockip' => 'Deblokkeer gebruker',
@@ -2387,7 +2436,7 @@ Op de [[Special:IPBlockList|IP-blokkeerlieste]] steet een lieste mit alle blokke
'ipusubmit' => 'Blokkering derof haolen',
'unblocked' => '[[User:$1|$1]] is edeblokeerd',
'unblocked-id' => 'Blokkering $1 is op-eheven',
-'ipblocklist' => 'Lieste van IP-adressen en gebrukers dee eblokkeerd bin',
+'ipblocklist' => 'Gebrukers dee eblokkeerd bin',
'ipblocklist-legend' => 'Een eblokkeren gebruker zeuken',
'ipblocklist-username' => 'Gebrukersnaam of IP-adres:',
'ipblocklist-sh-userblocks' => 'gebrukersblokkeringen $1',
@@ -2452,6 +2501,8 @@ Je kunnen gien gebrukerspagina anmaken.',
'cant-block-while-blocked' => 'Je kunnen aandere gebrukers neet blokkeren a-j zelf oek eblokkeerd bin.',
'cant-see-hidden-user' => 'De gebruker dee-j preberen te blokkeren is al eblokkeerd en verbörgen.
Umda-j gien rech hemmen um gebrukers te verbargen, ku-j de blokkering van de gebruker neet bekieken of bewarken.',
+'ipbblocked' => 'Je kunnen gien aandere gebrukers (de)blokkeren, umda-j zelf eblokkeerd bin',
+'ipbnounblockself' => 'Je maggen je eigen neet deblokkeren',
# Developer tools
'lockdb' => 'Databanke blokkeren',
@@ -2487,6 +2538,17 @@ Dit betekent da-j een pagina weer naor de ouwe naam kunnen herneumen, a-j bieveu
'''WAORSCHUWING!'''
Veur populaire pagina's kan 't herneumen drastische en onveurziene gevolgen hemmen.
Zörg derveur da-j de gevolgen overzien veurda-j veerder gaon.",
+'movepagetext-noredirectfixer' => "Mit dit formelier ku-j de pagina een nieje naam geven, de geschiedenisse geet dan vanzelf mee.
+De ouwe naam zal autematisch een deurverwiezing wönnen naor de nieje pagina.
+Kiek oek effen nao of der gien [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.
+'t Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.
+
+Een pagina kan '''allinnig''' herneumd wönnen as de nieje naam neet besteet of 't een deurverwiezing is zonder veerdere geschiedenisse.
+Dit betekent da-j een pagina weer naor de ouwe naam kunnen herneumen, a-j bieveurbeeld een fout emaak hemmen, zonder da-j de bestaonde pagina overschrieven.
+
+'''WAORSCHUWING!'''
+Veur popelaire pagina's kan 't herneumen drastische en onveurziene gevolgen hemmen.
+Zörg derveur da-j de gevolgen overzien veurda-j veerder gaon.",
'movepagetalktext' => "De overlegpagina dee derbie heurt krig oek een nieje titel, mar '''neet''' in de volgende gevallen:
* As de pagina in een aandere naamruumte eplaos wönnen
* As der al een neet-lege overlegpagina besteet onder de aandere naam
@@ -2540,6 +2602,7 @@ De overige pagina's wonnen neet autematisch herneumd.",
'immobile-source-page' => 'Disse pagina kan neet herneumd wonnen.',
'immobile-target-page' => 'Kan neet herneumd wonnen naor disse paginanaam.',
'imagenocrossnamespace' => 'Een mediabestaand kan neet naor een aandere naamruumte verplaos wonnen',
+'nonfile-cannot-move-to-file' => 'Je kunnen neet herneumen van en naor de bestaansnaamruumte',
'imagetypemismatch' => "De nieje bestaansextensie is neet gelieke an 't bestaanstype",
'imageinvalidfilename' => 'De nieje bestaansnaam is ongeldig',
'fix-double-redirects' => 'Alle deurverwiezingen dee naor de ouwe titel verwiezen, herneumen naor de nieje titel',
@@ -2613,10 +2676,12 @@ Alle transwiki-invoerhaandelingen wönnen op-esleugen in 't [[Special:Log/import
'import-interwiki-namespace' => 'Doelnaamruumte:',
'import-upload-filename' => 'Bestaansnaam:',
'import-comment' => 'Opmarkingen:',
-'importtext' => "Gebruuk de Special:Export-optie in de wiki waor de infermasie vandaonkump, slao 't op joew eigen systeem op, en stuur 't daornao hier op.",
+'importtext' => "Gebruuk de [[Special:Export|uutvoerfunctie]] in de wiki waor de infermasie vandaon kump.
+Slao 't op joew eigen systeem op, en stuur 't daornao hier op.",
'importstart' => "Pagina's an 't invoeren...",
'import-revision-count' => '$1 {{PLURAL:$1|versie|versies}}',
'importnopages' => "Der bin gien pagina's um in te voeren.",
+'imported-log-entries' => '$1 {{PLURAL:$1|logboekregel|logboekregels}} in-evoerd.',
'importfailed' => 'Invoeren is mislok: $1',
'importunknownsource' => 'Onbekend invoerbrontype',
'importcantopen' => "Kon 't invoerbestaand neet los doon",
@@ -2713,6 +2778,8 @@ De tiedelijke map is neet anwezig.",
'tooltip-rollback' => 'Mit "weerummedreien" ku-j mit één klik de bewarking(en) van de leste gebruker dee disse pagina bewark hef weerummezetten.',
'tooltip-undo' => 'A-j op "weerummedreien" klikken geet \'t bewarkingsvienster los en ku-j de veurige versie weerummezetten.
Je kunnen in de bewarkingssamenvatting een reden opgeven.',
+'tooltip-preferences-save' => 'Veurkeuren opslaon',
+'tooltip-summary' => 'Voer een korte samenvatting in',
# Metadata
'nodublincore' => 'Dublin Core RDF-metadata is uut-eschakeld op disse server.',
@@ -2817,13 +2884,16 @@ $1",
'thumbsize' => "Grootte van 't ofbeeldingsoverzichte (thumbnail):",
'widthheightpage' => "$1×$2, $3 {{PLURAL:$3|pagina|pagina's}}",
'file-info' => 'Bestaansgrootte: $1, MIME-type: $2',
-'file-info-size' => '($1 × $2 beeldpunten, bestaansgrootte: $3, MIME-type: $4)',
+'file-info-size' => '$1 × $2 beeldpunten, bestaansgrootte: $3, MIME-type: $4',
'file-nohires' => '<small>Gien hogere resolusie beschikbaor.</small>',
-'svg-long-desc' => '(SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaansgrootte: $3)',
+'svg-long-desc' => 'SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaansgrootte: $3',
'show-big-image' => 'Ofbeelding wat groter',
'show-big-image-thumb' => '<small>Grootte van disse weergave: $1 × $2 beeldpunten</small>',
'file-info-gif-looped' => 'herhaolend',
'file-info-gif-frames' => '$1 {{PLURAL:$1|beeld|beelden}}',
+'file-info-png-looped' => 'herhaolend',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|keer|keer}} of-espeuld',
+'file-info-png-frames' => '$1 {{PLURAL:$1|beeld|beelden}}',
# Special:NewFiles
'newimages' => 'Nieje ofbeeldingen',
@@ -2894,8 +2964,8 @@ Alle volgende verwiezingen dee op dezelfde regel staon, wonnen behaandeld as uut
'exif-colorspace' => 'Kleurruumte',
'exif-componentsconfiguration' => 'Betekenisse van elk compenent',
'exif-compressedbitsperpixel' => 'Beeldcompressiemethode',
-'exif-pixelydimension' => 'Bruukbaore ofbeeldingsbreedte',
-'exif-pixelxdimension' => 'Bruukbaore ofbeeldingsheugte',
+'exif-pixelydimension' => 'Ofbeeldingsbreedte',
+'exif-pixelxdimension' => 'Ofbeeldingsheugte',
'exif-makernote' => 'Opmarkingen van de fabrikaant',
'exif-usercomment' => 'Opmarkingen',
'exif-relatedsoundfile' => 'Biebeheurend geluudsbestaand',
@@ -2911,9 +2981,9 @@ Alle volgende verwiezingen dee op dezelfde regel staon, wonnen behaandeld as uut
'exif-spectralsensitivity' => 'Spectrale geveuligheid',
'exif-isospeedratings' => 'ISO-weerde.',
'exif-oecf' => 'Opto-elektronische conversiefactor',
-'exif-shutterspeedvalue' => 'Slutersnelheid',
-'exif-aperturevalue' => 'Diafragma',
-'exif-brightnessvalue' => 'Helderheid',
+'exif-shutterspeedvalue' => 'Slutersnelheid in APEX',
+'exif-aperturevalue' => 'Diafragma in APEX',
+'exif-brightnessvalue' => 'Helderheid in APEX',
'exif-exposurebiasvalue' => 'Belochtingscompensasie',
'exif-maxaperturevalue' => 'Maximale diafragmaweerde van de lenze',
'exif-subjectdistance' => 'Ofstaand tot onderwarp',
@@ -2977,6 +3047,7 @@ Alle volgende verwiezingen dee op dezelfde regel staon, wonnen behaandeld as uut
'exif-gpsareainformation' => "Naam van 't GPS-gebied",
'exif-gpsdatestamp' => 'GPS-daotum',
'exif-gpsdifferential' => 'Differentiële GPS-correctie',
+'exif-objectname' => 'Korte naam',
# EXIF attributes
'exif-compression-1' => 'Neet ecomprimeerd',
@@ -3058,6 +3129,8 @@ Alle volgende verwiezingen dee op dezelfde regel staon, wonnen behaandeld as uut
'exif-sensingmethod-7' => 'Dreeliendige sensor',
'exif-sensingmethod-8' => 'Kleurvolgende liendesensor',
+'exif-filesource-3' => 'Digitale fotocamera',
+
'exif-scenetype-1' => 'Een drek efotograferen ofbeelding',
'exif-customrendered-0' => 'Normaal',
@@ -3134,24 +3207,24 @@ Alle volgende verwiezingen dee op dezelfde regel staon, wonnen behaandeld as uut
'limitall' => 'alles',
# E-mail address confirmation
-'confirmemail' => 'Bevestig netposadres',
-'confirmemail_noemail' => 'Je hemmen gien geldig netposadres in-evoerd in joew [[Special:Preferences|veurkeuren]].',
-'confirmemail_text' => 'Bie disse wiki mu-j je netposadres bevestigen veurda-j de berichopties gebruken kunnen. Klik op de onderstaonde knoppe um een bevestigingsberich te ontvangen. Dit berich bevat een code mit een verwiezing; um je netposadres te bevestigen mu-j disse verwiezing los doon.',
-'confirmemail_pending' => 'Der is al een bevestigingscode op-estuurd; a-j net een gebrukersnaam an-emaak hemmen, wach dan eers een paor menuten tot da-j dit berich ontvungen hemmen veurda-j een nieje code anvragen.',
-'confirmemail_send' => 'Stuur een bevestigingscode',
-'confirmemail_sent' => 'Bevestigingsberich verstuurd.',
-'confirmemail_oncreate' => "Een bevestigingscode is naor joew netposadres verstuurd. Disse code is neet neudig um an te melden, mar je mutten 't wel bevestigen veurda-j de netposmeugelijkheen van disse wiki gebruken kunnen.",
-'confirmemail_sendfailed' => "{{SITENAME}} kon joe gien bevestigingscode toesturen.
+'confirmemail' => 'Bevestig netposadres',
+'confirmemail_noemail' => 'Je hemmen gien geldig netposadres in-evoerd in joew [[Special:Preferences|veurkeuren]].',
+'confirmemail_text' => 'Bie disse wiki mu-j je netposadres bevestigen veurda-j de berichopties gebruken kunnen. Klik op de onderstaonde knoppe um een bevestigingsberich te ontvangen. Dit berich bevat een code mit een verwiezing; um je netposadres te bevestigen mu-j disse verwiezing los doon.',
+'confirmemail_pending' => 'Der is al een bevestigingscode op-estuurd; a-j net een gebrukersnaam an-emaak hemmen, wach dan eers een paor menuten tot da-j dit berich ontvungen hemmen veurda-j een nieje code anvragen.',
+'confirmemail_send' => 'Stuur een bevestigingscode',
+'confirmemail_sent' => 'Bevestigingsberich verstuurd.',
+'confirmemail_oncreate' => "Een bevestigingscode is naor joew netposadres verstuurd. Disse code is neet neudig um an te melden, mar je mutten 't wel bevestigen veurda-j de netposmeugelijkheen van disse wiki gebruken kunnen.",
+'confirmemail_sendfailed' => "{{SITENAME}} kon joe gien bevestigingscode toesturen.
Contreleer joew netposadres op ongeldige tekens.
Fout bie 't versturen: $1",
-'confirmemail_invalid' => 'Ongeldige bevestigingscode. De code kan verlopen ween.',
-'confirmemail_needlogin' => 'Je mutten $1 um joew netposadres te bevestigen.',
-'confirmemail_success' => 'Joew netposadres is bevestig. Je kunnen noen anmelden en {{SITENAME}} gebruken.',
-'confirmemail_loggedin' => 'Joew netposadres is noen bevestig.',
-'confirmemail_error' => "Der is iets fout egaon bie 't opslaon van joew bevestiging.",
-'confirmemail_subject' => 'Bevestiging netposadres veur {{SITENAME}}',
-'confirmemail_body' => 'Ene mit IP-adres $1, werschienlijk jie zelf, hef zien eigen mit dit netposadres eregistreerd as de gebruker "$2" op {{SITENAME}}.
+'confirmemail_invalid' => 'Ongeldige bevestigingscode. De code kan verlopen ween.',
+'confirmemail_needlogin' => 'Je mutten $1 um joew netposadres te bevestigen.',
+'confirmemail_success' => 'Joew netposadres is bevestig. Je kunnen noen anmelden en {{SITENAME}} gebruken.',
+'confirmemail_loggedin' => 'Joew netposadres is noen bevestig.',
+'confirmemail_error' => "Der is iets fout egaon bie 't opslaon van joew bevestiging.",
+'confirmemail_subject' => 'Bevestiging netposadres veur {{SITENAME}}',
+'confirmemail_body' => 'Ene mit IP-adres $1, werschienlijk jie zelf, hef zien eigen mit dit netposadres eregistreerd as de gebruker "$2" op {{SITENAME}}.
Klik op de volgende verwiezing um te bevestigen da-jie disse gebruker bin en um de netposmeugelijkheen op {{SITENAME}} te activeren:
@@ -3162,8 +3235,21 @@ A-j joe eigen *neet* an-emeld hemmen, klik dan neet op disse verwiezing um de be
$5
De bevestigingscode zal verlopen op $4.',
-'confirmemail_invalidated' => 'De netposbevestiging is of-ebreuken',
-'invalidateemail' => 'Netposbevestiging ofbreken',
+'confirmemail_body_changed' => 'Ene mit IP-adres $1, werschienlijk jie zelf,
+hef zien eigen mit dit netposadres eregistreerd as de gebruker "$2" op {{SITENAME}}.
+
+Klik op de volgende verwiezing um te bevestigen da-jie disse gebruker bin en um de netposmeugelijkheen op {{SITENAME}} te activeren:
+
+$3
+
+A-j joe eigen *neet* an-emeld hemmen, klik dan neet op disse verwiezing
+um de bevestiging van joew netposadres of te breken:
+
+$5
+
+De bevestigingscode zal verlopen op $4.',
+'confirmemail_invalidated' => 'De netposbevestiging is of-ebreuken',
+'invalidateemail' => 'Netposbevestiging ofbreken',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-intergrasie is uut-eschakeld]',
@@ -3201,6 +3287,7 @@ $1',
'table_pager_first' => 'Eerste pagina',
'table_pager_last' => 'Leste pagina',
'table_pager_limit' => 'Laot $1 onderwarpen per pagina zien',
+'table_pager_limit_label' => 'Onderwarpen per pagina:',
'table_pager_limit_submit' => 'Zeuk',
'table_pager_empty' => 'Gien risseltaoten',
@@ -3259,6 +3346,7 @@ Je kunnen oek [[Special:Watchlist/edit|'t standardbewarkingsscharm gebruken]].",
'version-specialpages' => "Speciale pagina's",
'version-parserhooks' => 'Parserhooks',
'version-variables' => 'Variabelen',
+'version-skins' => 'Vormgevingen',
'version-other' => 'Overige',
'version-mediahandlers' => 'Mediaverwarkers',
'version-hooks' => 'Hooks',
@@ -3270,6 +3358,8 @@ Je kunnen oek [[Special:Watchlist/edit|'t standardbewarkingsscharm gebruken]].",
'version-hook-subscribedby' => 'In-eschreven deur',
'version-version' => '(Versie $1)',
'version-license' => 'Licentie',
+'version-poweredby-credits' => "Disse wiki wönnen an-estuurd deur '''[http://www.mediawiki.org/ MediaWiki]''', kopierech © 2001-$1 $2.",
+'version-poweredby-others' => 'aanderen',
'version-software' => 'Pregrammetuur dee eïnstalleerd is',
'version-software-product' => 'Preduk',
'version-software-version' => 'Versie',
@@ -3339,6 +3429,15 @@ Voer de bestaansnaam in zonder \'t veurvoegsel "{{ns:file}}:".',
'tags-edit' => 'bewarking',
'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
+# Special:ComparePages
+'comparepages' => "Pagina's vergelieken",
+'compare-selector' => 'Paginaversies vergelieken',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versie 1',
+'compare-rev2' => 'Versie 2',
+'compare-submit' => 'Vergelieken',
+
# Database error messages
'dberr-header' => 'Disse wiki hef een prebleem',
'dberr-problems' => "'t Spiet ons, mar disse webstee hef op 't mement wat technische preblemen.",
@@ -3355,8 +3454,13 @@ Voer de bestaansnaam in zonder \'t veurvoegsel "{{ns:file}}:".',
'htmlform-float-invalid' => 'De weerde dee-j op-egeven hemmen is gien getal.',
'htmlform-int-toolow' => 'De in-egeven weerde lig onder de minimumweerde van $1',
'htmlform-int-toohigh' => 'De in-egeven weerde lig boven de maximumweerde van $1',
+'htmlform-required' => 'Disse weerde is verplich',
'htmlform-submit' => 'Opslaon',
'htmlform-reset' => 'Wiezigingen ongedaonmaken',
'htmlform-selectorother-other' => 'Aanders',
+# SQLite database support
+'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
+'sqlite-no-fts' => 'Versie $1 zonder ondersteuning veur "full-text" zeuken',
+
);
diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php
index a5f5d3c3..38a94dd4 100644
--- a/languages/messages/MessagesNe.php
+++ b/languages/messages/MessagesNe.php
@@ -7,7 +7,9 @@
* @ingroup Language
* @file
*
+ * @author Bhawani Gautam
* @author Bhawani Gautam Rhk
+ * @author Ganesh
* @author Indiver
* @author Lkhatiwada
* @author RajeshPandey
@@ -16,6 +18,25 @@
* @author सरोज कà¥à¤®à¤¾à¤° ढकाल
*/
+$namespaceNames = array(
+ NS_MEDIA => 'मीडिया',
+ NS_SPECIAL => 'विशेष',
+ NS_TALK => 'वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
+ NS_USER => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
+ NS_USER_TALK => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾_वारà¥à¤¤à¤¾',
+ NS_PROJECT_TALK => '$1_वारà¥à¤¤à¤¾',
+ NS_FILE => 'चितà¥à¤°',
+ NS_FILE_TALK => 'चितà¥à¤°_वारà¥à¤¤à¤¾',
+ NS_MEDIAWIKI => 'मीडियाविकि',
+ NS_MEDIAWIKI_TALK => 'मीडियाविकि_वारà¥à¤¤à¤¾',
+ NS_TEMPLATE => 'ढाà¤à¤šà¤¾',
+ NS_TEMPLATE_TALK => 'ढाà¤à¤šà¤¾_वारà¥à¤¤à¤¾',
+ NS_HELP => 'मदà¥à¤¦à¤¤',
+ NS_HELP_TALK => 'मदà¥à¤¦à¤¤_वारà¥à¤¤à¤¾',
+ NS_CATEGORY => 'शà¥à¤°à¥‡à¤£à¥€',
+ NS_CATEGORY_TALK => 'शà¥à¤°à¥‡à¤£à¥€_वारà¥à¤¤à¤¾',
+);
+
$digitTransformTable = array(
'0' => '०', # &#x0966;
'1' => '१', # &#x0967;
@@ -45,8 +66,7 @@ $messages = array(
'tog-editsection' => '[समà¥à¤ªà¤¾à¤¦à¤¨] समà¥à¤¬à¤¨à¥à¤§ मारà¥à¤«à¤¤ हà¥à¤¨à¥‡ खणà¥à¤¡ समà¥à¤ªà¤¾à¤¦à¤¨à¤²à¤¾à¤ˆ सकà¥à¤·à¤® पारà¥à¤¨à¥‡',
'tog-editsectiononrightclick' => 'शीरà¥à¤·à¤•à¤®à¤¾ दाहिने कà¥à¤²à¤¿à¤•à¤¦à¥à¤µà¤¾à¤°à¤¾ खणà¥à¤¡ समà¥à¤ªà¤¾à¤¦à¤¨ सकà¥à¤·à¤® पारà¥à¤¨à¥‡ ( जाभा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाहिने )',
'tog-showtoc' => 'सामगà¥à¤°à¥€ तालिका हेरà¥à¤¨à¥‡ (तीन भनà¥à¤¦à¤¾ बढी शीरà¥à¤·à¤• भà¤à¤®à¤¾)',
-'tog-rememberpassword' => 'मेरो यस कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤° पà¥à¤°à¤µà¥‡à¤¶à¤²à¤¾à¤ˆ समà¥à¤à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tog-editwidth' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सनà¥à¤¦à¥à¤•à¤²à¤¾à¤ˆ पूरै परà¥à¤¦à¤¾ ढाकà¥à¤¨à¥‡à¤—री बढाउने',
+'tog-rememberpassword' => 'यस बà¥à¤°à¤¾à¤‰à¤œà¤°à¤®à¤¾ मेरो पà¥à¤°à¤µà¥‡à¤¶à¤²à¤¾à¤ˆ समà¥à¤à¤¨à¥à¤¹à¥‹à¤¸à¥ (अधिकतम $1 {{PLURAL:$1|दिन|दिनहरà¥}} समà¥à¤®)',
'tog-watchcreations' => 'मेरो निगरानी सूचीमा मैले सृजना गरेको पृषà¥à¤  थपà¥à¤¨à¥‡',
'tog-watchdefault' => 'मैले समà¥à¤ªà¤¾à¤¦à¤¨ गरेको पृषà¥à¤  निगरानी सूचीमा थपà¥à¤¨à¥‡',
'tog-watchmoves' => 'मैले सारेको पृषà¥à¤ à¤¹à¤°à¥à¤²à¤¾à¤ˆ निगरानी सूचीमा थपà¥à¤¨à¥‡',
@@ -192,31 +212,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'विषय थपà¥à¤¨à¥à¤¹à¥‹à¤¸',
-'vector-action-delete' => 'हटाउने',
-'vector-action-move' => 'सारà¥à¤¨à¥‡',
-'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥‡',
-'vector-action-undelete' => 'हटाà¤à¤•à¥‹ रदà¥à¤¦ गरà¥à¤¨à¥‡',
-'vector-action-unprotect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ रदà¥à¤¦ गरà¥à¤¨à¥‡',
-'vector-namespace-category' => 'पà¥à¤°à¤•à¤¾à¤°',
-'vector-namespace-help' => 'सहायता पृषà¥à¤ ',
-'vector-namespace-image' => 'फाइल',
-'vector-namespace-main' => 'पृषà¥à¤ ',
-'vector-namespace-media' => 'मिडिया पृषà¥à¤ ',
-'vector-namespace-mediawiki' => 'सनà¥à¤¦à¥‡à¤¶',
-'vector-namespace-project' => 'पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ पृषà¥à¤ ',
-'vector-namespace-special' => 'विशेष पृषà¥à¤ ',
-'vector-namespace-talk' => 'छलफल',
-'vector-namespace-template' => 'टेमà¥à¤ªà¤²à¥‡à¤Ÿ',
-'vector-namespace-user' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤ ',
-'vector-view-create' => 'सृजना गरà¥à¤¨à¥‡',
-'vector-view-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
-'vector-view-history' => 'इतिहास हेरà¥à¤¨à¥‡',
-'vector-view-view' => 'पढà¥à¤¨à¥‡',
-'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨à¥‡',
-'actions' => 'कारà¥à¤¯à¤¹à¤°à¥',
-'namespaces' => 'नेमसà¥à¤ªà¥‡à¤¸',
-'variants' => 'बहà¥à¤°à¥à¤ªà¤¹à¤°à¥',
+'vector-action-addsection' => 'विषय थपà¥à¤¨à¥à¤¹à¥‹à¤¸',
+'vector-action-delete' => 'हटाउने',
+'vector-action-move' => 'सारà¥à¤¨à¥‡',
+'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥‡',
+'vector-action-undelete' => 'हटाà¤à¤•à¥‹ रदà¥à¤¦ गरà¥à¤¨à¥‡',
+'vector-action-unprotect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ रदà¥à¤¦ गरà¥à¤¨à¥‡',
+'vector-simplesearch-preference' => 'विशिषà¥à¤  खोज सà¥à¤à¤¾à¤µà¤¹à¤°à¥ सकà¥à¤°à¤¿à¤¯ पारà¥à¤¨à¥‡ (भेकà¥à¤Ÿà¤° तà¥à¤µà¤šà¤¾à¤•à¥‹ लागि मातà¥à¤°)',
+'vector-view-create' => 'सृजना गरà¥à¤¨à¥‡',
+'vector-view-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
+'vector-view-history' => 'इतिहास हेरà¥à¤¨à¥‡',
+'vector-view-view' => 'पढà¥à¤¨à¥‡',
+'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨à¥‡',
+'actions' => 'कारà¥à¤¯à¤¹à¤°à¥',
+'namespaces' => 'नेमसà¥à¤ªà¥‡à¤¸',
+'variants' => 'बहà¥à¤°à¥à¤ªà¤¹à¤°à¥',
'errorpagetitle' => 'तà¥à¤°à¥à¤Ÿà¤¿',
'returnto' => '$1 मा फरà¥à¤•à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
@@ -277,6 +287,9 @@ $messages = array(
कृपया यो पृषà¥à¤  पà¥à¤¨: हेरà¥à¤¨à¥ अगाडि केही समय परà¥à¤–िदिनà¥à¤¹à¥‹à¤¸à¥ ।
$1',
+'pool-timeout' => 'समय सकियो बनà¥à¤¦ गरà¥à¤¨à¥‡ पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾à¤®à¤¾',
+'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}}को बारेमा',
@@ -444,7 +457,8 @@ $2',
'yourname' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾-नाम',
'yourpassword' => 'पासवरà¥à¤¡',
'yourpasswordagain' => 'पासवरà¥à¤¡ फेरि टाईप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'remembermypassword' => 'यो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ मेरो पà¥à¤°à¤µà¥‡à¤¶ याद गरà¥à¤¨à¥‡ ।',
+'remembermypassword' => 'यो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ मेरो पà¥à¤°à¤µà¥‡à¤¶ याद गर । (धेरैमा $1 {{PLURAL:$1|दिन|दिनहरà¥}})',
+'securelogin-stick-https' => 'पà¥à¤°à¤µà¥‡à¤¶ गरेपछि HTTPS सित जोड़िà¤à¤° बसà¥à¤¨à¥‡',
'yourdomainname' => 'तपाईंको जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤°(डोमेन)',
'externaldberror' => 'यहाठपà¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤°à¤£ डेटाबेस तà¥à¤°à¥à¤Ÿà¤¿ भयो या त तपाईंलाई आफà¥à¤¨à¥‹ बाहिरी खाता अदà¥à¤¯à¤¤à¤¨ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ छैन।',
'login' => 'पà¥à¤°à¤µà¥‡à¤¶',
@@ -461,6 +475,7 @@ $2',
'gotaccount' => "के तपाईà¤à¤¸à¤à¤— पहिले देखि नै खाता छ ? '''$1''' ।",
'gotaccountlink' => 'लग इन',
'createaccountmail' => 'इ-मेलबाट',
+'createaccountreason' => 'कारण :',
'badretype' => 'तपाईंले दिनà¥à¤­à¤à¤•à¥‹ पासवरà¥à¤¡ मिलà¥à¤¦à¥ˆà¤¨à¥¤',
'userexists' => 'तपाईले पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥à¤­à¤à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ नाम पहिले देखिनै पà¥à¤°à¤¯à¥‹à¤—मा छ ।
कृपया फरक नाम छानà¥à¤¨à¥à¤¹à¥‹à¤²à¤¾ ।',
@@ -485,6 +500,7 @@ $2',
'wrongpasswordempty' => 'हालिà¤à¤•à¥‹ पासवरà¥à¤¡ खालि थियो । कृपया फेरी पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤²à¤¾ ।',
'passwordtooshort' => 'पासवरà¥à¤¡ कमà¥à¤¤à¤¿à¤®à¤¾ {{PLURAL:$1|१ अकà¥à¤·à¤° |$1 अकà¥à¤·à¤°à¤¹à¤°à¥}}को हà¥à¤¨à¥à¤ªà¤°à¥à¤› ।',
'password-name-match' => 'तपाईà¤à¤•à¥‹ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम भनà¥à¤¦à¤¾ फरक हà¥à¤¨à¥à¤ªà¤°à¥à¤› ।',
+'password-login-forbidden' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम र पà¥à¤°à¤µà¥‡à¤¶ शवà¥à¤¦ वरà¥à¤œà¤¿à¤¤ गरिà¤à¤•à¥‹à¤› ।',
'mailmypassword' => 'नयाठपà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ इमेल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'passwordremindertitle' => '{{SITENAME}}को लागि नयाठअसà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡',
'passwordremindertext' => 'कसैले (सायद तपाईà¤, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नयाठपà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ अनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¥à¤­à¤à¤•à¥‹ छ । पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ "$2" को लागि नयाठअसà¥à¤¥à¤¾à¤¯à¥€ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ "$3"तयार पारिà¤à¤•à¥‹ छ। यदि यो तपाईको इचà¥à¤›à¤¾à¤®à¤¾ भà¤à¤•à¥‹ भठअहिले तपाईà¤à¤²à¥‡ पà¥à¤°à¤µà¥‡à¤¶à¤—री नयाठपà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ छानà¥à¤¨à¥ परà¥à¤¨à¥‡ हà¥à¤¨à¥à¤›à¥¤
@@ -520,6 +536,9 @@ $2',
'loginlanguagelabel' => 'भाषा: $1',
'suspicious-userlogout' => 'तपाईंको निरà¥à¤—मन अनà¥à¤°à¥‹à¤§ असà¥à¤µà¤¿à¤•à¤¾à¤° गरिनà¥à¤› किन कि यो खराब बà¥à¤°à¤¾à¤‰à¤œà¤° वा कà¥à¤¯à¤¾à¤¸à¤¿à¤™ पà¥à¤°à¥‹à¤•à¥à¤¸à¤¿à¤²à¥‡ पठाà¤à¤•à¥‹ जसà¥à¤¤à¥‹ देखिनà¥à¤›à¥¤',
+# E-mail sending
+'php-mail-error-unknown' => 'PHP मेल() कà¥à¤°à¤¿à¤¯à¤¾à¤®à¤¾ अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿',
+
# Password reset dialog
'resetpass' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'resetpass_announce' => 'तपाईंले असà¥à¤¥à¤¾à¤¯à¥€ ई-मेल कोडको आधारमा पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥ भà¤à¤•à¥‹à¤›à¥¤
@@ -573,11 +592,12 @@ $2',
'showdiff' => 'परिवरà¥à¤¤à¤¨ देखाउनà¥à¤¹à¥‹à¤¸à¥',
'anoneditwarning' => "'''चेतावनी:''' तपाईà¤à¤²à¥‡ पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥ भà¤à¤•à¥‹ छैन।
तपाईà¤à¤•à¥‹ IP ठेगाना पृषà¥à¤ à¤¸à¤®à¥à¤ªà¤¾à¤¦à¤¨ इतिहासमा दरà¥à¤¤à¤¾à¤—रिने छ ।",
+'anonpreviewwarning' => "''तपाईंले पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥ भà¤à¤•à¥‹ छैन। संगà¥à¤°à¤¹ (Save) गरेको खणà¥à¤¡à¤®à¤¾ पृषà¥à¤ à¤•à¥‹ इतिहासमा तपाईंको IP ठेगाना अंकित गरिनेछ।''",
'missingsummary' => "'''यादगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ :''' तपाईले समà¥à¤ªà¤¾à¤¦à¤¨ सारांश दिनà¥à¤­à¤à¤•à¥‹ छैन ।
यदि तपाईले संगà¥à¤°à¤¹à¤—रà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ थिचà¥à¤¨à¥à¤­à¤¯à¥‹ भने , सारांश बिना नै संगà¥à¤°à¤¹à¤¿à¤¤ गरिने छ ।",
'missingcommenttext' => 'कृपया टिपà¥à¤ªà¤£à¥€ पà¥à¤°à¤µà¤¿à¤·à¥à¤  गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
-'missingcommentheader' => "'''याद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ :''' तपाईà¤à¤²à¥‡ टिपà¥à¤ªà¤£à¥€à¤®à¤¾ विषय /शिरà¥à¤· पंकà¥à¤¤à¤¿ दिनà¥à¤­à¤à¤•à¥‹ छैन ।
-तपाईà¤à¤²à¥‡ फेरि संगà¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ थिचà¥à¤¨à¥ भà¤à¤®à¤¾ , तपाईको समà¥à¤ªà¤¾à¤¦à¤¨ यसै रà¥à¤ªà¤®à¤¾ संगà¥à¤°à¤¹à¤¿à¤¤ हà¥à¤¨à¥‡à¤› ।",
+'missingcommentheader' => "'''याद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ :''' तपाईà¤à¤²à¥‡ टिपà¥à¤ªà¤£à¥€à¤®à¤¾ विषय /शीरà¥à¤· पंकà¥à¤¤à¤¿ दिनà¥à¤­à¤à¤•à¥‹ छैन ।
+तपाईà¤à¤²à¥‡ फेरि \"{{int:savearticle}}\" थिचà¥à¤¨à¥ भà¤à¤®à¤¾ , तपाईको समà¥à¤ªà¤¾à¤¦à¤¨ यसै रà¥à¤ªà¤®à¤¾ संगà¥à¤°à¤¹à¤¿à¤¤ हà¥à¤¨à¥‡à¤› ।",
'summary-preview' => 'सारांश पूरà¥à¤µà¤¾à¤²à¥‹à¤•à¤¨:',
'subject-preview' => 'विषय/शीरà¥à¤·à¤ªà¤‚कà¥à¤¤à¤¿ पूरà¥à¤µà¤°à¥à¤ª:',
'blockedtitle' => 'पà¥à¤°à¤¯à¥‹à¤•à¤•à¤°à¥à¤¤à¤¾à¤²à¤¾à¤ˆ रोक लगाइà¤à¤•à¥‹ छ',
@@ -656,6 +676,12 @@ $2',
'''यसलाइ अहिले समà¥à¤® संगà¥à¤°à¤¹ गरिà¤à¤•à¥‹ छैन!'''",
'userjspreview' => "'''याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸ तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ JavaScript को पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ मातà¥à¤° हेरिरहनॠभà¤à¤•à¥‹ छ। '''
'''यसलाइ अहिले समà¥à¤® संगà¥à¤°à¤¹ गरिà¤à¤•à¥‹ छैन!'''",
+'sitecsspreview' => "'''याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸ तपाईà¤à¤²à¥‡ केवल वैशà¥à¤µà¤¿à¤• CSS. को पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ मातà¥à¤° अवलोकन गरà¥à¤¨à¥ भà¤à¤•à¥‹ छ। '''
+'''यसलाइ अहिले समà¥à¤® संगà¥à¤°à¤¹ गरिà¤à¤•à¥‹ छैन!'''",
+'sitejspreview' => "याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸ तपाईà¤à¤²à¥‡ केवल JavaScript code को पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ मातà¥à¤° हेरिरहनॠभà¤à¤•à¥‹ छ। '''
+'''यसलाइ अहिले समà¥à¤® संगà¥à¤°à¤¹ गरिà¤à¤•à¥‹ छैन!'''",
+'userinvalidcssjstitle' => "'''चेतावनी:''' यहाठकà¥à¤¨à¥ˆà¤ªà¤¨à¤¿ \"\$1\" नामको सà¥à¤•à¥€à¤¨ छैन ।
+पà¥à¤°à¤šà¤²à¤¿à¤¤ .css तथा .js पृषà¥à¤ à¤¹à¤°à¥à¤²à¥‡ lowercase शीरà¥à¤·à¤• पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤›à¤¨à¥, जसà¥à¤¤à¥ˆ {{ns:user}}:Foo/Vector.css को सटà¥à¤Ÿà¤¾à¤®à¤¾ {{ns:user}}:Foo/vector.css",
'updated' => 'नवीन',
'note' => "'''सूचना:'''",
'previewnote' => "'''यो केवल पूरà¥à¤µà¤¾à¤²à¥‹à¤•à¤¨ मातà¥à¤° हो; तपाईंका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚ संगà¥à¤°à¤¹ भà¤à¤•à¤¾ छैननà¥!'''",
@@ -855,6 +881,8 @@ $1",
'logdelete-failure' => "'''लग दृषà¥à¤Ÿà¤¿ मिलाउन सकिà¤à¤¨ :'''
$1",
'revdel-restore' => 'दृषà¥à¤Ÿà¤¿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡',
+'revdel-restore-deleted' => 'मेटिà¤à¤•à¥‹ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨',
+'revdel-restore-visible' => 'पà¥à¤°à¤•à¤Ÿ संशोधन',
'pagehist' => 'पृषà¥à¤ à¤•à¥‹ इतिहास',
'deletedhist' => 'मेटाà¤à¤•à¤¾ इतिहास',
'revdelete-content' => 'सामगà¥à¤°à¥€',
@@ -907,11 +935,13 @@ $1",
# Diffs
'history-title' => '"$1" को पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ इतिहास',
'difference' => '(पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥à¤•à¥‹ बीचमा भिनà¥à¤¨à¤¤à¤¾)',
+'difference-multipage' => '(पृषà¥à¤ à¤¹à¤°à¥à¤®à¤¾ भिनà¥à¤¨à¤¤à¤¾)',
'lineno' => 'पंकà¥à¤¤à¤¿ $1:',
'compareselectedversions' => 'छानिà¤à¤•à¤¾ संसà¥à¤•à¤°à¤£à¤¹à¤°à¥‚ दाà¤à¤œà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'showhideselectedversions' => 'छानिà¤à¤•à¤¾ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥ देखाउने/लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'editundo' => 'रदà¥à¤¦ गरà¥à¤¨à¥‡',
-'diff-multi' => '({{PLURAL:$1|à¤à¤• मधà¥à¤¯ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨|$1 मधà¥à¤¯ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥‚}} नदेखाइà¤à¤•à¥‹)',
+'diff-multi' => '({{PLURAL:$2|à¤à¤• पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾|$2 पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥}}दà¥à¤µà¤¾à¤°à¤¾ {{PLURAL:$1|à¤à¤‰à¤Ÿà¤¾ मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€ संशोधन|$1 मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€ संशोधनहरू}} नदेखाइà¤à¤•à¥‹)',
+'diff-multi-manyusers' => '($2 {{PLURAL:$2|भनà¥à¤¦à¤¾ अधिक पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾|भनà¥à¤¦à¤¾ अधिक पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥}}दà¥à¤µà¤¾à¤°à¤¾ {{PLURAL:$1|à¤à¤‰à¤Ÿà¤¾ मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€ संशोधन|$1 मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€ संशोधनहरà¥}} नदेखाइà¤à¤•à¥‹)',
# Search results
'searchresults' => 'खोज नतिजाहरू',
@@ -946,6 +976,7 @@ $1",
'searchprofile-everything-tooltip' => 'सबै सामगà¥à¤°à¥€ खोजà¥à¤¨à¥‡(वारà¥à¤¤à¤¾à¤²à¤¾à¤ª समेत )',
'searchprofile-advanced-tooltip' => 'अनà¥à¤•à¥à¤² नेमसà¥à¤ªà¥‡à¤¸à¤®à¤¾ खोजà¥à¤¨à¥‡',
'search-result-size' => '$1 ({{PLURAL:$2|1 शवà¥à¤¦|$2 शवà¥à¤¦à¤¹à¤°à¥}})',
+'search-result-category-size' => '{{PLURAL:$1|à¤à¤• सदसà¥à¤¯|$1 सदसà¥à¤¯à¤¹à¤°à¥}} ({{PLURAL:$2|1 उपशà¥à¤°à¥‡à¤£à¥€|$2 उपशà¥à¤°à¥‡à¤£à¥€à¤¹à¤°à¥}}, {{PLURAL:$3|à¤à¤‰à¤Ÿà¤¾ फाइल|$3 फाइलहरà¥}})',
'search-result-score' => 'मिलà¥à¤¨à¥‡ :$1%',
'search-redirect' => '(जाने $1)',
'search-section' => '(खणà¥à¤¡ $1)',
@@ -1023,6 +1054,7 @@ $1",
'contextlines' => 'पà¥à¤°à¤¤à¤¿ पंकà¥à¤¤à¤¿ मेल :',
'contextchars' => 'पà¥à¤°à¤¤à¤¿ पंकà¥à¤¤à¤¿ सनà¥à¤¦à¤°à¥à¤­ :',
'stub-threshold' => ' <a href="#" class="stub">stub link</a> सà¥à¤µà¤°à¥‚पण (बाइट)को निमà¥à¤¤à¤¿ दà¥à¤µà¤¾à¤°:',
+'stub-threshold-disabled' => 'निषà¥à¤•à¥à¤°à¤¿à¤¯',
'recentchangesdays' => 'हालको परिवरà¥à¤¤à¤¨à¤®à¤¾ देखाउने दिनहरà¥:',
'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिन|दिन}}',
'recentchangescount' => 'पूरà¥à¤µ निरà¥à¤§à¤¾à¤°à¤¿à¤¤à¤°à¥à¤ªà¤®à¤¾ देखाउनà¥à¤ªà¤°à¥à¤¨à¥‡ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚ :',
@@ -1056,6 +1088,7 @@ $1",
'prefs-files' => 'फाइलहरà¥',
'prefs-custom-css' => 'अनà¥à¤•à¥à¤²à¤¿à¤¤ CSS',
'prefs-custom-js' => 'अनà¥à¤•à¥à¤²à¤¿à¤¤ JS',
+'prefs-common-css-js' => 'साà¤à¤¾ CSS/जाभा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ सबै तà¥à¤µà¤šà¤¾(सà¥à¤•à¤¿à¤¨)को लागि:',
'prefs-reset-intro' => 'तपाईले यो पृषà¥à¤  आफà¥à¤¨à¥‹ अभिरà¥à¤šà¥€à¤¹à¤°à¥‚ साइट पूरà¥à¤µà¤¾à¤µà¤¸à¥à¤¥à¤¾à¤®à¤¾ फरà¥à¤•à¤¾à¤‰à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।
यो रदà¥à¤¦ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।',
'prefs-emailconfirm-label' => 'इ-मेल à¤à¤•à¤¿à¤¨ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ :',
@@ -1098,9 +1131,15 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'prefs-advancedrendering' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ªà¤¹à¤°à¥',
'prefs-advancedsearchoptions' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ªà¤¹à¤°à¥‚',
'prefs-advancedwatchlist' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ªà¤¹à¤°à¥‚',
-'prefs-display' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ªà¤¹à¤°à¥‚',
+'prefs-displayrc' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ªà¤¹à¤°à¥‚',
+'prefs-displaysearchoptions' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ªà¤¹à¤°à¥‚',
+'prefs-displaywatchlist' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ªà¤¹à¤°à¥‚',
'prefs-diffs' => 'diffs(भिनà¥à¤¨à¤¤à¤¾)',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ई मेल ठेगाना मानà¥à¤¯ भà¤à¤•à¥‹ पà¥à¤°à¤¤à¥€à¤¤ हà¥à¤¨à¥à¤›',
+'email-address-validity-invalid' => 'मानà¥à¤¯ ईमेल ठेगाना दिनà¥à¤¹à¥‹à¤¸à¥',
+
# User rights
'userrights' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
'userrights-lookup-user' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ समूह वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
@@ -1129,22 +1168,22 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'group-autoconfirmed' => 'सà¥à¤µà¤¤ निशà¥à¤šà¤¿à¤¤ गरिà¤à¤•à¤¾ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥',
'group-bot' => 'बोटहरà¥',
'group-sysop' => 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¤¹à¤°à¥‚',
-'group-bureaucrat' => 'कà¥à¤Ÿà¤¨à¥€à¤¤à¤¿à¤œà¥à¤žà¤¹à¤°à¥',
+'group-bureaucrat' => 'पà¥à¤°à¤¶à¤¾à¤¸à¤•à¤¹à¤°à¥',
'group-suppress' => 'अतिदृषà¥à¤Ÿà¤¿à¤¹à¤°à¥',
'group-all' => '(सबै)',
'group-user-member' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
-'group-autoconfirmed-member' => 'सà¥à¤µà¤¤: निरà¥à¤§à¤¾à¤°à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
+'group-autoconfirmed-member' => 'सà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
'group-bot-member' => 'बोट',
'group-sysop-member' => 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•',
-'group-bureaucrat-member' => 'कà¥à¤Ÿà¤¨à¥€à¤¤à¤¿à¤œà¥à¤ž',
+'group-bureaucrat-member' => 'पà¥à¤°à¤¶à¤¾à¤¸à¤•',
'group-suppress-member' => 'अतिदृषà¥à¤Ÿà¤¿',
'grouppage-user' => '{{ns:project}}:पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥',
'grouppage-autoconfirmed' => '{{ns:project}}:सà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥',
'grouppage-bot' => '{{ns:project}}:बोटहरà¥',
'grouppage-sysop' => '{{ns:project}}: पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¤¹à¤°à¥',
-'grouppage-bureaucrat' => '{{ns:project}}:कà¥à¤Ÿà¤¨à¥€à¤¤à¤¿à¤œà¥à¤žà¤¹à¤°à¥',
+'grouppage-bureaucrat' => '{{ns:project}}:पà¥à¤°à¤¶à¤¾à¤¸à¤•à¤¹à¤°à¥',
'grouppage-suppress' => '{{ns:project}}:अतिदृषà¥à¤Ÿà¤¿',
# Rights
@@ -1183,6 +1222,7 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'right-hideuser' => 'à¤à¤• पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम रोकà¥à¤¨à¥‡, सारà¥à¤µà¤œà¤¨à¤¿à¤•à¤¹à¥à¤¨à¤¬à¤¾à¤Ÿ लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'right-ipblock-exempt' => 'IP रोक,सà¥à¤µà¤¤: रोक तथा सà¥à¤¤à¤° रोक कटेर जाने',
'right-proxyunbannable' => 'पà¥à¤°à¥‹à¤•à¥à¤¸à¤¿à¤•à¥‹ सà¥à¤µà¤¤: रोक कटेर जाने',
+'right-unblockself' => 'तिनीहरॠआफैंलाई खà¥à¤²à¥à¤²à¤¾ गरà¥à¤›à¤¨à¥',
'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡ र जोगाइà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-editprotected' => 'जोगाइà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡(कà¥à¤¯à¤¾à¤¸à¤•à¥‡à¤¡à¤¿à¤™à¥à¤— सà¥à¤°à¤•à¥à¤·à¤¾ नभà¤à¤•à¤¾)',
'right-editinterface' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¤¡à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
@@ -1205,7 +1245,6 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'right-siteadmin' => 'डेटाबेसको तालà¥à¤šà¤¾à¤®à¤¾à¤°à¥à¤¨à¥‡ र तालà¥à¤šà¤¾à¤–ोलà¥à¤¨à¥‡',
'right-reset-passwords' => 'अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤µà¤¿à¤·à¥à¤ à¥€à¤—रà¥à¤¨à¥‡',
'right-override-export-depth' => 'गहिराइ ५ समà¥à¤®à¤•à¥‹ लिंकगरिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ सहित निरà¥à¤¯à¤¾à¤¤ गरà¥à¤¨à¥‡',
-'right-versiondetail' => 'विसà¥à¤¤à¤¾à¤°à¤¿à¤¤ सफà¥à¤Ÿà¤µà¥‡à¤¯à¤° संसà¥à¤•à¤°à¤£ जानकारी देखाउने',
'right-sendemail' => 'अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ इमेल गरà¥à¤¨à¥‡',
# User rights log
@@ -1253,16 +1292,12 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¤¨|परिवरà¥à¤¤à¤¨à¤¹à¤°à¥}}',
'recentchanges' => 'नयाठपरिवरà¥à¤¤à¤¨à¤¹à¤°à¥',
-'recentchanges-legend' => 'हालैको परिवरà¥à¤°à¤¨ विकलà¥à¤ªà¤¹à¤°à¥',
+'recentchanges-legend' => 'हालैको परिवरà¥à¤¤à¤¨ विकलà¥à¤ªà¤¹à¤°à¥',
'recentchangestext' => 'विकिका भरà¥à¤–रका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥à¤²à¤¾à¤ˆ यस पृषà¥à¤ à¤®à¤¾ पहिलà¥à¤¯à¤¾à¤‰à¤¨à¥‡',
'recentchanges-feed-description' => 'यो फिडमा रहेको विकीको सवैभनà¥à¤¦à¤¾ अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨à¤¹à¤°à¥à¤•à¥‹ जानकारी राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'recentchanges-legend-newpage' => '$1 - नयाठपृषà¥à¤ ',
'recentchanges-label-newpage' => 'यो समà¥à¤ªà¤¾à¤¦à¤¨à¤²à¥‡ नयाठपृषà¥à¤  निरà¥à¤®à¤¾à¤£ गरेको छ',
-'recentchanges-legend-minor' => 'साधारण समà¥à¤ªà¤¾à¤¦à¤¨ -$1',
'recentchanges-label-minor' => 'यो साधारण समà¥à¤ªà¤¾à¤¦à¤¨ हो',
-'recentchanges-legend-bot' => 'बोट समà¥à¤ªà¤¾à¤¦à¤¨ -$1',
'recentchanges-label-bot' => 'यो समà¥à¤ªà¤¾à¤¦à¤¨ बोट दà¥à¤µà¤¾à¤°à¤¾ गरिà¤à¤•à¥‹ थियो',
-'recentchanges-legend-unpatrolled' => 'पटà¥à¤°à¥‹à¤² नरिà¤à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ -$1',
'recentchanges-label-unpatrolled' => 'यो समà¥à¤ªà¤¾à¤¦à¤¨ अहिले समà¥à¤® पटà¥à¤°à¥‹à¤² गरिà¤à¤•à¥‹ छैन',
'rcnote' => "तल पछिलà¥à¤²à¤¾ {{PLURAL:$2|day|'''$2''' दिनहरà¥}} मा $5, $4 समà¥à¤® भà¤à¤•à¤¾ {{PLURAL:$1|is '''1''' change|पछिलà¥à¤²à¤¾ '''$1''' परिवरà¥à¤¤à¤¨à¤¹à¤°à¥}} देखाइà¤à¤•à¥‹ छ ।",
'rcnotefrom' => "'''$2''' देखिका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥ तल ('''$1''' समà¥à¤®à¤•à¤¾ देखाइनà¥à¤›)।",
@@ -1342,13 +1377,23 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'filetype-unwanted-type' => "'''\".\$1\"''' फाइल नचाहिने पà¥à¤°à¤•à¤¾à¤°à¤•à¥‹ फाइल हो।
मà¥à¤–à¥à¤¯à¤¤à¤¯à¤¾ {{PLURAL:\$3|फाइलको पà¥à¤°à¤•à¤¾à¤° हो|फाइलका पà¥à¤°à¤•à¤¾à¤° हà¥à¤¨à¥}} \$2.",
'filetype-missing' => 'फाइलको à¤à¤•à¥à¤¸à¥à¤Ÿà¥‡à¤¨à¥à¤¶à¤¨ छैन (उदा- ".jpg")।',
+'empty-file' => 'तपाईंले बà¥à¤à¤¾à¤à¤•à¥‹ फाइल खालि छ।',
+'file-too-large' => 'तपाईंले बà¥à¤à¤¾à¤à¤•à¥‹ फाइल अति ठूलो छ।',
+'filename-tooshort' => 'फाइलको नाम अति छोटो भयो।',
+'filetype-banned' => 'यस पà¥à¤°à¤•à¤¾à¤°à¤•à¥‹ फाइलमाथि पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ छ।',
+'verification-error' => 'यो फाइलले पà¥à¤°à¤¾à¤®à¤¾à¤£à¤¿à¤•à¤¤à¤¾ पार गरेन।',
+'hookaborted' => 'à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤¨à¥à¤¶à¤¨ हà¥à¤•à¤²à¥‡ गरà¥à¤¦à¤¾ यस फाइललाई नयाठरà¥à¤ª दिने कà¥à¤°à¤¿à¤¯à¤¾ रदà¥à¤¦ भयो।',
+'illegal-filename' => 'यसà¥à¤¤à¥‹ फाइल नामको अनà¥à¤®à¤¤à¤¿ छैन।',
+'overwrite' => 'भइरहेको फाइलमाथि अधिलेखन(Overwriting)को अनà¥à¤®à¤¤à¤¿ छैन।',
+'unknown-error' => 'à¤à¤‰à¤Ÿà¤¾ अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ भयो।',
+'tmp-create-error' => 'असà¥à¤¥à¤¾à¤¯à¥€ फाइल सृजना गरà¥à¤¨ सकिà¤à¤¨à¥¤',
+'tmp-write-error' => 'असà¥à¤¥à¤¾à¤¯à¥€ फाइल लेखà¥à¤¦à¥ˆ गरà¥à¤¦à¤¾ तà¥à¤°à¥à¤Ÿà¤¿à¥¤',
'large-file' => 'यो सिफारिस गरिनà¥à¤› कि फाइलहरॠ$1 भनà¥à¤¦à¤¾ ठूला हà¥à¤¨à¥ हà¥à¤à¤¦à¥ˆà¤¨;
यो फाइल $2 छ।',
'fileexists-extension' => "यहि नामको à¤à¤‰à¤Ÿà¤¾ फाइल पहिलेदेखि नैं छ: [[$2|thumb]]
* उरà¥à¤§à¥à¤µà¤­à¤°à¤£ हà¥à¤à¤¦à¥ˆ गरेको पाइलको नाम: '''<tt>[[:$1]]</tt>'''
* पहिलेदेखि नैं भà¤à¤•à¥‹ पाइअलको नाम: '''<tt>[[:$2]]</tt>'''
कृपया अरà¥à¤•à¥ˆ नाम रोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤",
-'successfulupload' => 'सफलतापूरà¥à¤µà¤•... पूरा भयो',
'uploadwarning' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ चेतावनी',
'savefile' => 'फाइल बचत गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'uploadedimage' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£(upload) गरियो "[[$1]]"',
@@ -1370,6 +1415,13 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
तपाईंको विचारमा के यो उचित छ कि यसको उरà¥à¤§à¥à¤µà¤­à¤°à¤£ जारी राखियोसà¥,
यस फाइलको मेटिà¤à¤•à¥‹ लग सà¥à¤µà¤¿à¤§à¤¾à¤•à¥‹ निमà¥à¤¤à¤¿ यहाठदिइà¤à¤•à¥‹à¤› :",
+'upload-success-subj' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ सफल',
+'upload-success-msg' => '[$2]बाट तà¥à¤ªà¤¾à¤ˆà¤‚को उरà¥à¤§à¥à¤µà¤­à¤°à¤£ सफल भयो। तà¥à¤¯à¥‹ यहाठपाउन सकिनेछ: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ समसà¥à¤¯à¤¾',
+'upload-failure-msg' => 'तपाईंको उरà¥à¤§à¥à¤µà¤­à¤°à¤£ [$2]बाट समसà¥à¤¯à¤¾ आà¤à¤•à¥‹à¤›:
+
+$1',
+'upload-warning-subj' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ चेतावनी',
'upload-proto-error' => 'दूषित पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¤²',
'upload-file-error' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿',
@@ -1480,7 +1532,8 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'unusedtemplateswlh' => 'अनà¥à¤¯ कड़ीहरà¥',
# Random page
-'randompage' => 'कà¥à¤¨à¥ˆ à¤à¤• लेख',
+'randompage' => 'कà¥à¤¨à¥ˆ à¤à¤• लेख',
+'randompage-nopages' => '{{PLURAL:$2| $1 नाम भà¤à¤•à¥‹ कà¥à¤¨à¥ˆ पृषà¥à¤Ÿ छैन|$1 नाम भà¤à¤•à¤¾ कà¥à¤¨à¥ˆ पृषà¥à¤Ÿà¤¹à¤°à¥ छैननà¥}}',
# Random redirect
'randomredirect' => 'कà¥à¤¨à¥ˆ à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¤®à¤¾ जाने',
@@ -1501,7 +1554,6 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'statistics-edits-average' => 'पà¥à¤°à¤¤à¤¿à¤ªà¥ƒà¤·à¥à¤  औसत समà¥à¤ªà¤¾à¤¦à¤¨',
'statistics-views-total' => 'जमà¥à¤®à¤¾ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'statistics-views-peredit' => 'पà¥à¤°à¤¤à¤¿ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job queue] लमà¥à¤¬à¤¾à¤‡',
'statistics-users' => 'दरà¥à¤¤à¤¾à¤—रिà¤à¤•à¥‹ [[Special:ListUsers|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥]]',
'statistics-users-active' => 'सकृय पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥',
'statistics-users-active-desc' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥ जो{{PLURAL:$1|बितेको à¤à¤• दिन|बितेका $1 दिनहरà¥}}देखि जो सकà¥à¤°à¤¿à¤¯ छनà¥',
@@ -1534,6 +1586,8 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'nmembers' => '$1 {{PLURAL:$1|सदसà¥à¤¯|सदसà¥à¤¯à¤¹à¤°à¥‚}}',
'nrevisions' => '$1 {{PLURAL:$1|पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨|पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥}}',
'nviews' => '$1 {{PLURAL:$1|अवलोकन|अवलोकनहरà¥}}',
+'nimagelinks' => '$1 {{PLURAL:$1|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}माथि पà¥à¤°à¤¯à¥‹à¤— गरिà¤à¤•à¥‹',
+'ntransclusions' => '$1 {{PLURAL:$1पृषà¥à¤ à¤®à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरिà¤à¤•à¥‹|पृषà¥à¤ à¤¹à¤°à¥à¤®à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरिà¤à¤•à¤¾}}',
'specialpage-empty' => 'यो पृषà¥à¤  खाली छ।',
'lonelypages' => 'अनाथ पृषà¥à¤ à¤¹à¤°à¥',
'uncategorizedpages' => 'शà¥à¤°à¥‡à¤£à¥€à¤•à¤°à¤£ नभà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥',
@@ -1566,7 +1620,7 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'protectedpagesempty' => 'दिइà¤à¤•à¥‹ पà¥à¤¯à¤¾à¤°à¤¾à¤®à¤¿à¤Ÿà¤° पà¥à¤°à¤¯à¥‹à¤— गरि सà¥à¤°à¤•à¥à¤·à¤¾ गरिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ छैननॠ।',
'protectedtitles' => 'सà¥à¤°à¤•à¥à¤·à¤¾ गरिà¤à¤•à¤¾ शिरà¥à¤·à¤•à¤¹à¤°à¥',
'protectedtitlestext' => 'निमà¥à¤¨ शिरà¥à¤·à¤•à¤¹à¤°à¥ शृजनाहà¥à¤¨à¤¬à¤¾à¤Ÿ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•à¥‹ छ',
-'protectedtitlesempty' => 'दिइà¤à¤•à¥‹ पà¥à¤¯à¤¾à¤°à¤¾à¤®à¤¿à¤Ÿà¤° पà¥à¤°à¤¯à¥‹à¤— गरि सà¥à¤°à¤•à¥à¤·à¤¾ गरिà¤à¤•à¤¾ शिरà¥à¤·à¤•à¤¹à¤°à¥ छैननॠ।',
+'protectedtitlesempty' => 'दिइà¤à¤•à¥‹ पà¥à¤¯à¤¾à¤°à¤¾à¤®à¤¿à¤Ÿà¤° पà¥à¤°à¤¯à¥‹à¤— गरि सà¥à¤°à¤•à¥à¤·à¤¾ गरिà¤à¤•à¤¾ शीरà¥à¤·à¤•à¤¹à¤°à¥ छैननॠ।',
'listusers' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ सूची',
'listusers-editsonly' => 'समà¥à¤ªà¤¾à¤¦à¤¨ गरेका पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤®à¤¾à¤¤à¥à¤° देखाउने',
'listusers-creationsort' => 'सृजना मिति अनà¥à¤¸à¤¾à¤° कà¥à¤°à¤®à¤µà¤¦à¥à¤§ गरà¥à¤¨à¥‡',
@@ -1606,11 +1660,13 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'allpagesto' => 'निमà¥à¤¨à¤®à¤¾ अनà¥à¤¤à¤¹à¥à¤¨à¥‡ पृषà¥à¤ à¤¹à¤°à¥ देखाउने:',
'allarticles' => 'सबै लेखहरà¥',
'allinnamespace' => 'सबै पृषà¥à¤ à¤¹à¤°à¥ ($1 नेमसà¥à¤ªà¥‡à¤¸)',
-'allnotinnamespace' => 'सबै पृषà¥à¤ à¤¹à¤°à¥ ($1 नेमसà¥à¤ªà¥‡à¤¸à¤®à¤¾ छिननॠ)',
+'allnotinnamespace' => 'सबै पृषà¥à¤ à¤¹à¤°à¥ ($1 नेमसà¥à¤ªà¥‡à¤¸à¤®à¤¾ छैननॠ)',
'allpagesprev' => 'अघिलà¥à¤²à¥‹',
'allpagesnext' => 'अरà¥à¤•à¥‹',
-'allpagessubmit' => 'जानà¥à¤¹à¥‹à¤¸à¥',
+'allpagessubmit' => 'जाने',
'allpagesprefix' => 'यी सà¥à¤°à¥à¤•à¤¾ अकà¥à¤·à¤°à¤¸à¤¹à¤¿à¤¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ हेरà¥à¤¨à¥‡:',
+'allpagesbadtitle' => 'दिà¤à¤•à¥‹ पृषà¥à¤  शीरà¥à¤·à¤• अमानà¥à¤¯, खाली वा गलत रà¥à¤ªà¤®à¤¾ अनà¥à¤¤à¤° भाषा वा अनà¥à¤¤à¤° विकी समà¥à¤¬à¤¨à¥à¤§ गरिà¤à¤•à¥‹ थियो।
+यसमा शीरà¥à¤·à¤•à¤®à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ नमिलà¥à¤¨à¥‡ à¤à¤• वा बढी अकà¥à¤·à¤°à¤¹à¤°à¥‚ रहेका हà¥à¤¨à¤¸à¤•à¥à¤›à¤¨à¥ ।',
'allpages-bad-ns' => '{{SITENAME}} को नामसà¥à¤¥à¤¾à¤¨ छैन "$1" ।',
# Special:Categories
@@ -1675,32 +1731,37 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'listgrouprights-addgroup-self-all' => 'सबै समूहहरॠनिजी खातामा थपà¥à¤¨à¥‡',
# E-mail user
-'mailnologin' => 'ईमेल पठाउने ठेगाना नै भà¤à¤¨ ।',
-'mailnologintext' => 'तपाईले अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ ईमेल पठाउनको लागि आफॠपहिले [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶(लगइन)गरेको]] हà¥à¤¨à¥à¤ªà¤°à¥à¤› र [[Special:Preferences|आफà¥à¤¨à¥‹ रोजाइहरà¥à¤®à¤¾]] à¤à¤‰à¤Ÿà¤¾ वैध ईमेल ठेगाना भà¤à¤•à¥‹ हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
-'emailuser' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउनà¥à¤¹à¥‹à¤¸à¥',
-'emailpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ इमेल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'usermailererror' => 'मेल अबà¥à¤œà¥‡à¤•à¥à¤Ÿà¤²à¥‡ देखाà¤à¤•à¥‹ तà¥à¤°à¥à¤Ÿà¤¿:',
-'defemailsubject' => '{{SITENAME}} ई-मेल',
-'noemailtitle' => 'ईमेल ठेगाना नभà¤à¤•à¥‹',
-'noemailtext' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¥‡ सही ई-मेल ठेगाना दरà¥à¤¶à¤¾à¤à¤•à¥‹ छैन।',
-'nowikiemailtitle' => 'ई-मेलको अनà¥à¤®à¤¤à¤¿ छैन',
-'nowikiemailtext' => 'यी पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¥‡ अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤¬à¤¾à¤Ÿ ई-मेल सà¥à¤µà¥€à¤•à¤¾à¤° नगरà¥à¤¨à¥‡ छनोट गरेकाछनà¥à¥¤',
-'email-legend' => '{{SITENAME}}का अरà¥à¤•à¤¾ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउने',
-'emailfrom' => 'बाट:',
-'emailto' => 'लाई:',
-'emailsubject' => 'विषय:',
-'emailmessage' => 'सनà¥à¤¦à¥‡à¤¶:',
-'emailsend' => 'पठाउनà¥à¤¹à¥‹à¤¸à¥',
-'emailccme' => 'मेरो सनà¥à¤¦à¥‡à¤¶à¤•à¥‹ à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¤à¤¿ मलाई ई-मेल गरिदिनà¥à¤¹à¥‹à¤¸à¥à¥¤',
-'emailccsubject' => 'तपाईà¤à¤•à¥‹ सनà¥à¤¦à¥‡à¤¶à¤•à¥‹ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ $1: $2लाई',
-'emailsent' => 'इमेल पठाईयो',
-'emailsenttext' => 'तपाईंको ई-मेल सनà¥à¤¦à¥‡à¤¶ पठाइयो।',
-'emailuserfooter' => 'यो ई-मेल $1 ले $2 लाई "ई-मेल पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾" कारà¥à¤¯à¤¾à¤¨à¥à¤°à¥à¤ª {{SITENAME}}मा पठाà¤à¤•à¥‹ थियो।',
+'mailnologin' => 'ईमेल पठाउने ठेगाना नै भà¤à¤¨ ।',
+'mailnologintext' => 'तपाईले अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ ईमेल पठाउनको लागि आफॠपहिले [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶(लगइन)गरेको]] हà¥à¤¨à¥à¤ªà¤°à¥à¤› र [[Special:Preferences|आफà¥à¤¨à¥‹ रोजाइहरà¥à¤®à¤¾]] à¤à¤‰à¤Ÿà¤¾ वैध ईमेल ठेगाना भà¤à¤•à¥‹ हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
+'emailuser' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउनà¥à¤¹à¥‹à¤¸à¥',
+'emailpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ इमेल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'usermailererror' => 'मेल अबà¥à¤œà¥‡à¤•à¥à¤Ÿà¤²à¥‡ देखाà¤à¤•à¥‹ तà¥à¤°à¥à¤Ÿà¤¿:',
+'defemailsubject' => '{{SITENAME}} ई-मेल',
+'usermaildisabled' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ ई-मेल निरसà¥à¤¤ गरिà¤à¤•à¥‹',
+'usermaildisabledtext' => 'यस विकिमा तपाईं अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउन सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨',
+'noemailtitle' => 'ईमेल ठेगाना नभà¤à¤•à¥‹',
+'noemailtext' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¥‡ सही ई-मेल ठेगाना दरà¥à¤¶à¤¾à¤à¤•à¥‹ छैन।',
+'nowikiemailtitle' => 'ई-मेलको अनà¥à¤®à¤¤à¤¿ छैन',
+'nowikiemailtext' => 'यी पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¥‡ अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤¬à¤¾à¤Ÿ ई-मेल सà¥à¤µà¥€à¤•à¤¾à¤° नगरà¥à¤¨à¥‡ छनोट गरेकाछनà¥à¥¤',
+'email-legend' => '{{SITENAME}}का अरà¥à¤•à¤¾ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउने',
+'emailfrom' => 'बाट:',
+'emailto' => 'लाई:',
+'emailsubject' => 'विषय:',
+'emailmessage' => 'सनà¥à¤¦à¥‡à¤¶:',
+'emailsend' => 'पठाउनà¥à¤¹à¥‹à¤¸à¥',
+'emailccme' => 'मेरो सनà¥à¤¦à¥‡à¤¶à¤•à¥‹ à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¤à¤¿ मलाई ई-मेल गरिदिनà¥à¤¹à¥‹à¤¸à¥à¥¤',
+'emailccsubject' => 'तपाईà¤à¤•à¥‹ सनà¥à¤¦à¥‡à¤¶à¤•à¥‹ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ $1: $2लाई',
+'emailsent' => 'इमेल पठाईयो',
+'emailsenttext' => 'तपाईंको ई-मेल सनà¥à¤¦à¥‡à¤¶ पठाइयो।',
+'emailuserfooter' => 'यो ई-मेल $1 ले $2 लाई "ई-मेल पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾" कारà¥à¤¯à¤¾à¤¨à¥à¤°à¥à¤ª {{SITENAME}}मा पठाà¤à¤•à¥‹ थियो।',
+
+# User Messenger
+'usermessage-summary' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ सनà¥à¤¦à¥‡à¤¶ छोड़दै ।',
# Watchlist
'watchlist' => 'मेरो अवलोकन',
'mywatchlist' => 'मेरो अवलोकनसूची',
-'watchlistfor' => "('''$1''' को लागि)",
+'watchlistfor2' => '$1को $2',
'nowatchlist' => 'तपाईको अवलोकन सूचीमा कà¥à¤¨à¥ˆ पनि सामागà¥à¤°à¥€ छैन।',
'watchnologin' => 'पà¥à¤°à¤µà¥‡à¤¶ (लग ईन) नगरिà¤à¤•à¥‹',
'watchnologintext' => 'आफà¥à¤¨à¥‹ अवलोकनलाइ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•à¥‹ लागि त तपाइ यसमा [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶(लगइन)]] गरà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
@@ -1739,7 +1800,8 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'enotif_body' => 'पà¥à¤°à¤¿à¤¯ $WATCHINGUSERNAME,
-$PAGEEDITDATE को दिन {{SITENAME}}को पृषà¥à¤  $PAGETITLE $PAGEEDITORदà¥à¤µà¤¾à¤°à¤¾ $CHANGEDORCREATED, हालको संशोधनको निमà¥à¤¤à¤¿ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ $PAGETITLE_URL ।
+{{SITENAME}}को पृषà¥à¤  $PAGETITLE $PAGEEDITDATE को दिन $PAGEEDITORदà¥à¤µà¤¾à¤°à¤¾ $CHANGEDORCREATED,
+हालको संशोधनको निमà¥à¤¤à¤¿ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ $PAGETITLE_URL ।
$NEWPAGE
@@ -1749,16 +1811,18 @@ $NEWPAGE
मेल: $PAGEEDITOR_EMAIL
विकि: $PAGEEDITOR_WIKI
-तपाईं यस पृषà¥à¤ à¤®à¤¾ नगà¤à¤¸à¤®à¥à¤® कà¥à¤¨à¥ˆ परिवरà¥à¤¤à¤¨ भà¤à¤•à¤¾ खणà¥à¤¡à¤®à¤¾ अगाड़ि कà¥à¤¨à¥ˆ सूचना दिनेछैन।
-तपाईंका समà¥à¤ªà¥‚रà¥à¤£ निगरानी पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹à¤²à¤¾à¤—ि तपाईंले सूचना पताकालाई निगरानी सूचीमा पà¥à¤¨à¤°à¥à¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤
+तपाईं यस पृषà¥à¤ à¤®à¤¾ नगà¤à¤¸à¤®à¥à¤® अब उसो कà¥à¤¨à¥ˆ परिवरà¥à¤¤à¤¨ भà¤à¤•à¤¾ खणà¥à¤¡à¤®à¤¾ कà¥à¤¨à¥ˆ सूचना दिनेछैन।
+तपाईंका समà¥à¤ªà¥‚रà¥à¤£ निगरानी पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ लागि तपाईंले सूचना पताकालाई निगरानी सूचीमा पà¥à¤¨à¤°à¥à¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤
तपाईंको मितà¥à¤° {{SITENAME}} सूचना पà¥à¤°à¤£à¤¾à¤²à¥€
-
--
+इमेल सूचना वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨, जानà¥à¤¹à¥‹à¤¸à¥
+{{fullurl:{{#special:Preferences}}}}
+
निगरानी सूची वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ गरà¥à¤¨, जानà¥à¤¹à¥‹à¤¸à¥
{{fullurl:{{#special:Watchlist}}/edit}}
-निगरानी सूची मेटà¥à¤¨ गरà¥à¤¨, जानà¥à¤¹à¥‹à¤¸à¥
+निगरानी सूची मेटà¥à¤¨, जानà¥à¤¹à¥‹à¤¸à¥
$UNWATCHURL
पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ र अनà¥à¤¯ सहयोगको निमà¥à¤¤à¤¿:
@@ -1912,19 +1976,23 @@ $3दà¥à¤µà¤¾à¤°à¤¾ $1को ($4को समय $5 मा) मेटाइà¤
'month' => 'महिना देखि (र पहिले):',
'year' => 'वरà¥à¤· देखि( र पहिले):',
-'sp-contributions-newbies' => 'नयाठखाताको लागि मातà¥à¤° योगदानहरॠदेखाउने',
-'sp-contributions-newbies-sub' => 'नयाठखाताहरà¥à¤•à¥‹ लागि',
-'sp-contributions-newbies-title' => 'नयाठखाताहरà¥à¤•à¥‹ लागि पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ योगदानहरà¥',
-'sp-contributions-blocklog' => 'रोकावट लग',
-'sp-contributions-deleted' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ योगदानहरॠमेटाइयो',
-'sp-contributions-logs' => 'लगहरà¥',
-'sp-contributions-talk' => 'वारà¥à¤¤à¤¾',
-'sp-contributions-userrights' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
-'sp-contributions-blocked-notice' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ अहिले रोक लगाइà¤à¤•à¥‹ छ।
+'sp-contributions-newbies' => 'नयाठखाताको लागि मातà¥à¤° योगदानहरॠदेखाउने',
+'sp-contributions-newbies-sub' => 'नयाठखाताहरà¥à¤•à¥‹ लागि',
+'sp-contributions-newbies-title' => 'नयाठखाताहरà¥à¤•à¥‹ लागि पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ योगदानहरà¥',
+'sp-contributions-blocklog' => 'रोकावट लग',
+'sp-contributions-deleted' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ योगदानहरॠमेटाइयो',
+'sp-contributions-uploads' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£à¤¹à¤°à¥',
+'sp-contributions-logs' => 'लगहरà¥',
+'sp-contributions-talk' => 'वारà¥à¤¤à¤¾',
+'sp-contributions-userrights' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकार वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨',
+'sp-contributions-blocked-notice' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ अहिले रोक लगाइà¤à¤•à¥‹ छ।
+नवीनतम रोकाइ गरेको लग पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ सनà¥à¤¦à¤°à¥à¤­à¤•à¥‹ निमà¥à¤¤à¤¿ तल दिà¤à¤•à¥‹à¤›:',
+'sp-contributions-blocked-notice-anon' => 'यो IP ठेगानालाई अहिले रोक लगाइà¤à¤•à¥‹ छ।
नवीनतम रोकाइ गरेको लग पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ सनà¥à¤¦à¤°à¥à¤­à¤•à¥‹ निमà¥à¤¤à¤¿ तल दिà¤à¤•à¥‹à¤›:',
-'sp-contributions-search' => 'योगदानहरॠखोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'sp-contributions-username' => 'IP ठेगाना वा पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम :',
-'sp-contributions-submit' => 'खोज',
+'sp-contributions-search' => 'योगदानहरॠखोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'sp-contributions-username' => 'IP ठेगाना वा पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम :',
+'sp-contributions-toponly' => 'नवीनतम संशोधनका समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥ देखाउनà¥à¤¹à¥‹à¤¸à¥',
+'sp-contributions-submit' => 'खोज',
# What links here
'whatlinkshere' => 'यहाठके जोडिनà¥à¤›',
@@ -1985,7 +2053,6 @@ $3दà¥à¤µà¤¾à¤°à¤¾ $1को ($4को समय $5 मा) मेटाइà¤
'ipb-edit-dropdown' => 'निषेध कारण समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'ipb-unblock-addr' => '$1 निषेध खारेज गरà¥à¤¨à¥‡',
'ipb-unblock' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ वा IP माथिको निषेध खारेज गरà¥à¤¨à¥‡',
-'ipb-blocklist-addr' => '$1माथि रहेका निषेधहरà¥',
'ipb-blocklist' => 'हाल रहेका निषेधहरॠहेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'ipb-blocklist-contribs' => '$1 को लागि योगदान',
'unblockip' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ निषेध खारेज गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -2049,6 +2116,7 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'proxyblocker' => 'पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ निषेध गरà¥à¤¨à¥‡',
'proxyblocker-disabled' => 'यो कारà¥à¤¯ निषà¥à¤•à¥ƒà¤¯ पारिà¤à¤•à¥‹ छ।',
'proxyblocksuccess' => 'सकियो.',
+'ipbblocked' => 'तपाईंले अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ गरà¥à¤¨ वा उनीहरà¥à¤•à¥‹ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ खोलà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨ किनभनें तपाईं आफैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ हà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤',
# Developer tools
'lockdb' => 'डेटाबेस तालà¥à¤šà¤¾à¤®à¤¾à¤°à¥à¤¨à¥‡',
@@ -2266,6 +2334,8 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'tooltip-rollback' => '"पूरà¥à¤µà¤°à¥à¤ª" ले यो पृषà¥à¤ à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨(हरà¥) खारेज गरी पृषà¥à¤ à¤²à¤¾à¤ˆ पछिलà¥à¤²à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¤¾ à¤à¤• कà¥à¤²à¤¿à¤•à¤®à¤¾ पà¥à¤°à¥â€à¤¯à¤¾à¤‡ दिनà¥à¤›',
'tooltip-undo' => '"रदà¥à¤¦"ले पछिलà¥à¤²à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ खारेज गरी पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨à¤®à¤¾ देखाउà¤à¤› ।
यसले सारांशमा कारण राखà¥à¤¨ दिनेछ।',
+'tooltip-preferences-save' => 'अभिरà¥à¤šà¤¿à¤¹à¤°à¥ संगà¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-summary' => 'छोटो सारांश हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
# Attribution
'siteuser' => '{{SITENAME}} पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ $1',
@@ -2329,13 +2399,16 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
# Media information
'thumbsize' => 'थमà¥à¤¬à¤¨à¥‡à¤² आकार:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}',
-'file-info' => 'पूरा गरà¥à¤¨à¤•à¤¾ लागि फाइल सञà¥à¤šà¤¾à¤²à¤¨ पà¥à¤°à¤•à¤¾à¤°',
-'file-info-size' => '($1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4)',
+'file-info' => 'फाइल आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2',
+'file-info-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4',
'file-nohires' => '<small>उचà¥à¤š रिजोलà¥à¤¯à¥à¤¶à¤¨ अनà¥à¤ªà¤²à¤¬à¥à¤§</small>',
-'svg-long-desc' => '(SVG फाइल,साधारण $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3)',
+'svg-long-desc' => 'SVG फाइल,साधारण $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3',
'show-big-image' => 'पूरा रिजोलà¥à¤¯à¥à¤¶à¤¨',
'show-big-image-thumb' => '<small>यस पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨à¤•à¥‹ आकार : $1 × $2 पिकà¥à¤¸à¤²</small>',
'file-info-gif-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®|फà¥à¤°à¥‡à¤®à¤¹à¤°à¥}}',
+'file-info-png-looped' => 'ग़ाà¤à¤ à¥‹ परेको',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|पलà¥à¤Ÿ|पलà¥à¤Ÿ}} खेलियो',
+'file-info-png-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®|फà¥à¤°à¥‡à¤®à¤¹à¤°à¥}}',
# Special:NewFiles
'newimages' => 'नयाठफाइलहरà¥à¤•à¥‹ गà¥à¤¯à¤¾à¤²à¤°à¥€',
@@ -2395,8 +2468,8 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'exif-colorspace' => 'वरà¥à¤£ सà¥à¤¥à¤¾à¤¨',
'exif-componentsconfiguration' => 'पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• घटकको अरà¥à¤¥',
'exif-compressedbitsperpixel' => 'चितà¥à¤° समà¥à¤ªà¥€à¤¡à¤¨ मोड',
-'exif-pixelydimension' => 'चितà¥à¤°à¤•à¥‹ मानà¥à¤¯ चौड़ाई',
-'exif-pixelxdimension' => 'चितà¥à¤°à¤•à¥‹ मानà¥à¤¯ उचाई',
+'exif-pixelydimension' => 'चितà¥à¤°à¤•à¥‹ चौड़ाई',
+'exif-pixelxdimension' => 'चितà¥à¤°à¤•à¥‹ उचाई',
'exif-usercomment' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ टिपà¥à¤ªà¤£à¤–रà¥:',
'exif-relatedsoundfile' => 'समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ अडियो फाइल',
'exif-datetimeoriginal' => 'डेटा सञà¥à¤šà¤¾à¤²à¤¨à¤•à¥‹ मिति र समय',
@@ -2408,15 +2481,18 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'exif-spectralsensitivity' => 'वरà¥à¤£à¤•à¥à¤°à¤®à¥€à¤¯ संवेदनशीलता',
'exif-isospeedratings' => 'आईà¤à¤¸à¤“ गति रेटिंग',
'exif-oecf' => 'Optoelectronic रूपांतरण कारक',
-'exif-shutterspeedvalue' => 'शटरको गति',
-'exif-aperturevalue' => 'छिंड़',
-'exif-brightnessvalue' => 'चमक',
+'exif-shutterspeedvalue' => 'APEX शटरको गति',
+'exif-aperturevalue' => 'APEX छिंड़',
+'exif-brightnessvalue' => 'APEX चमक',
'exif-exposurebiasvalue' => 'à¤à¤•à¥à¤¸à¤ªà¥‹à¤œà¤° पूरà¥à¤µà¤¾à¤—à¥à¤°à¤¹',
'exif-maxaperturevalue' => 'अधिकतम à¤à¤ªà¤°à¥à¤šà¤° भूमि',
+'exif-subjectdistance' => 'विषय दूरी',
'exif-meteringmode' => 'Metering मोड',
'exif-lightsource' => 'पà¥à¤°à¤•à¤¾à¤¶ सà¥à¤°à¥‹à¤¤',
+'exif-flash' => 'à¤à¤¿à¤²à¥à¤•à¥‹(फà¥à¤²à¤¾à¤¸)',
'exif-focallength' => 'लेंस फोकल लमà¥à¤¬à¤¾à¤ˆ',
'exif-subjectarea' => 'विषय कà¥à¤·à¥‡à¤¤à¥à¤°',
+'exif-flashenergy' => 'फà¥à¤²à¥à¤¯à¤¾à¤¸ ऊरà¥à¤œà¤¾',
'exif-spatialfrequencyresponse' => 'सà¥à¤¥à¤¾à¤¨à¤¿à¤• आवृतà¥à¤¤à¤¿ पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾',
'exif-focalplanexresolution' => 'फोकल विमान à¤à¤•à¥à¤¸ संकलà¥à¤ª',
'exif-focalplaneyresolution' => 'फोकल पà¥à¤²à¥‡à¤¨ वाई रिजोलà¥à¤¸à¤¨',
@@ -2444,6 +2520,7 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'exif-gpslongitude' => 'देशानà¥à¤¤à¤°',
'exif-gpsaltituderef' => 'ऊंचाई संदरà¥à¤­',
'exif-gpsaltitude' => 'उà¤à¤šà¤¾à¤ˆ',
+'exif-gpstimestamp' => 'GPS समय (सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ घड़ी)',
'exif-gpssatellites' => 'नापà¥à¤¨à¤•à¥‹à¤²à¤¾à¤—ि पà¥à¤°à¤¯à¥‹à¤— गरिà¤à¤•à¤¾ उपगà¥à¤°à¤¹à¤¹à¤°à¥',
'exif-gpsstatus' => 'रिसिभर अवसà¥à¤¥à¤¾',
'exif-gpsmeasuremode' => 'माप मोड',
@@ -2459,6 +2536,7 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'exif-gpsareainformation' => 'जीपीà¤à¤¸ कà¥à¤·à¥‡à¤¤à¥à¤°à¤•à¥‹ नाम',
'exif-gpsdatestamp' => 'जी पी à¤à¤¸ मिति',
'exif-gpsdifferential' => 'जीपीà¤à¤¸ अंतर सà¥à¤§à¤¾à¤°',
+'exif-objectname' => 'छोटो शीरà¥à¤·à¤•',
'exif-unknowndate' => 'अजà¥à¤žà¤¾à¤¤ मिति',
@@ -2592,12 +2670,12 @@ $1लाई अघिबाट नैं पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लगाà¤
'limitall' => 'सबै',
# E-mail address confirmation
-'confirmemail' => 'इमेल ठेगाना पकà¥à¤•à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'confirmemail_send' => 'यकिन कोड मेल गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
-'confirmemail_sent' => 'यकिन इमेल पठाइयो ।',
-'confirmemail_error' => 'तपाईंको निशà¥à¤šà¤¯à¤²à¤¾à¤ˆ संगà¥à¤°à¤¹ गरà¥à¤¦à¤¾ केहि तà¥à¤°à¥à¤Ÿà¤¿ भà¤à¤•à¥‹à¤›à¥¤',
-'confirmemail_subject' => '{{SITENAME}} ई मेलl ठेगानाको पà¥à¤·à¥à¤Ÿà¤¿',
-'confirmemail_body' => 'कसैले, सायद तपाईंले, आई पी ठेगाना $1बाट,
+'confirmemail' => 'इमेल ठेगाना पकà¥à¤•à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'confirmemail_send' => 'यकिन कोड मेल गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
+'confirmemail_sent' => 'यकिन इमेल पठाइयो ।',
+'confirmemail_error' => 'तपाईंको निशà¥à¤šà¤¯à¤²à¤¾à¤ˆ संगà¥à¤°à¤¹ गरà¥à¤¦à¤¾ केहि तà¥à¤°à¥à¤Ÿà¤¿ भà¤à¤•à¥‹à¤›à¥¤',
+'confirmemail_subject' => '{{SITENAME}} ई मेलl ठेगानाको पà¥à¤·à¥à¤Ÿà¤¿',
+'confirmemail_body' => 'कसैले, सायद तपाईंले, आई पी ठेगाना $1बाट,
{{SITENAME}}मा à¤à¤‰à¤Ÿà¤¾ खाता "$2"को नाममा यस ई मेल ठेगानामा पञà¥à¤œà¥€à¤•à¤°à¤£ गरेकोछ।
यो खाता साà¤à¤šà¥à¤šà¥€ नैं तपाईंको हो भनेर पà¥à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨ र {{SITENAME}}मा यो ई मेलका सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥ सकà¥à¤°à¤¿à¤¯ गरà¥à¤¨ तपाईंको बà¥à¤°à¤¾à¤‰à¤œà¤°à¤®à¤¾ यो लिंक खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:
@@ -2609,8 +2687,32 @@ $3
$5
यो पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£à¤•à¥‹ समय $4 मा सकिनेछ।',
-'confirmemail_invalidated' => 'ई मेल ठेगाना रदà¥à¤¦ भà¤à¤•à¥‹ पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£',
-'invalidateemail' => 'इमेल यकिन कारà¥à¤¯ रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'confirmemail_body_changed' => 'कसैले, सायद तपाईंले, आई पी ठेगाना $1बाट,
+{{SITENAME}}मा "$2" नामको खाताको ई मेल ठेगाना यस ठेगानामा परिवरà¥à¤¤à¤¨ गरेकोछ।
+
+यो खाता साà¤à¤šà¥à¤šà¥€ नैं तपाईंको हो भनेर पà¥à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨ र {{SITENAME}}मा यो ई मेलका सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥ पà¥à¤¨à¤ƒ सकà¥à¤°à¤¿à¤¯ गरà¥à¤¨ तपाईंको बà¥à¤°à¤¾à¤‰à¤œà¤°à¤®à¤¾ यो लिंक खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:
+
+$3
+
+यदि तà¥à¤¯à¥‹ खाता तपाईंको *होइन* भनें, ई मेल ठेगानाको पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£ रदà¥à¤¦ गरà¥à¤¨ यो लिंक पहिलà¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥:
+
+$5
+
+यो पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£à¤•à¥‹ समय $4 मा सकिनेछ।',
+'confirmemail_body_set' => 'कसैले, सायद तपाईंले, आई पी ठेगाना $1बाट,
+{{SITENAME}}मा "$2" नामको खाताको ई मेल ठेगाना यस ठेगानासित जोड़ेकोछ।
+
+यो खाता साà¤à¤šà¥à¤šà¥€ नैं तपाईंको हो भनेर पà¥à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨ र {{SITENAME}}मा यो ई मेलका सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥ पà¥à¤¨à¤ƒ सकà¥à¤°à¤¿à¤¯ गरà¥à¤¨ तपाईंको बà¥à¤°à¤¾à¤‰à¤œà¤°à¤®à¤¾ यो लिंक खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:
+
+$3
+
+यदि तà¥à¤¯à¥‹ खाता तपाईंको *होइन* भनें, ई मेल ठेगानाको पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£ रदà¥à¤¦ गरà¥à¤¨ यो लिंक पहिलà¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥:
+
+$5
+
+यो पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£à¤•à¥‹ समय $4 मा सकिनेछ।',
+'confirmemail_invalidated' => 'ई मेल ठेगाना रदà¥à¤¦ भà¤à¤•à¥‹ पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£',
+'invalidateemail' => 'इमेल यकिन कारà¥à¤¯ रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
# Scary transclusion
'scarytranscludedisabled' => '[अनà¥à¤¤à¤°à¤µà¤¿à¤•à¤¿ दसà¥à¤¤à¤¾à¤µà¥‡à¤œ अनà¥à¤¤à¤°à¤•à¤°à¤£ निसà¥à¤•à¥à¤°à¤¿à¤¯]',
@@ -2646,6 +2748,7 @@ $1',
'table_pager_first' => 'पà¥à¤°à¤¥à¤® पृषà¥à¤ ',
'table_pager_last' => 'अनà¥à¤¤à¤¿à¤® पृषà¥à¤ ',
'table_pager_limit' => 'पà¥à¤°à¤¤à¤¿à¤ªà¥ƒà¤·à¥à¤  $1 वसà¥à¤¤à¥à¤¹à¤°à¥ देखाउने',
+'table_pager_limit_label' => 'पà¥à¤°à¤¤à¤¿ पृषà¥à¤  सामगà¥à¤°à¥€:',
'table_pager_limit_submit' => 'जाउ',
'table_pager_empty' => 'नतिजाहरॠछैन ।',
@@ -2743,6 +2846,13 @@ $1',
'tags-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'tags-hitcount' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¤¨|परिवरà¥à¤¤à¤¨à¤¹à¤°à¥}}',
+# Special:ComparePages
+'compare-page1' => 'पृषà¥à¤  1',
+'compare-page2' => 'पृषà¥à¤  2',
+'compare-rev1' => 'संशोधन 1',
+'compare-rev2' => 'संशोधन 2',
+'compare-submit' => 'दà¤à¤œà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥',
+
# Database error messages
'dberr-header' => 'यो विकिमा समसà¥à¤¯à¤¾ छ',
'dberr-problems' => 'कà¥à¤·à¤®à¤¾ पाउà¤!
@@ -2750,6 +2860,7 @@ $1',
'dberr-info' => '(डेटाबेस सरà¥à¤µà¤° $1सित समà¥à¤ªà¤°à¥à¤• साधà¥à¤¨ सकिंदैन)',
# HTML forms
+'htmlform-required' => 'यसको मूलà¥à¤¯(value) चाहिनà¥à¤›',
'htmlform-submit' => 'बà¥à¤à¤¾à¤‰à¤¨à¥‡',
'htmlform-reset' => 'परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚ परितà¥à¤¯à¤¾à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'htmlform-selectorother-other' => 'अनà¥à¤¯',
diff --git a/languages/messages/MessagesNew.php b/languages/messages/MessagesNew.php
index c7150ae5..4130872f 100644
--- a/languages/messages/MessagesNew.php
+++ b/languages/messages/MessagesNew.php
@@ -55,8 +55,7 @@ $messages = array(
'tog-editsection' => '[समà¥à¤ªà¤¾à¤¦à¤¨] लिङà¥à¤•à¤‚ सेकà¥à¤¸à¤¨ समà¥à¤ªà¤¾à¤¦à¤¨ यायेजà¥à¤¯à¥à¤—ॠयानादिसà¤',
'tog-editsectiononrightclick' => 'सेकà¥à¤¸à¤¨à¤¯à¤¾ छà¥à¤¯à¤à¤†à¤–ले राइट कà¥à¤²à¤¿à¤• याना सेकà¥à¤¸à¤¨ समà¥à¤ªà¤¾à¤¦à¤¨ यायेजà¥à¤¯à¥à¤—ॠयानादिसठ(जाभासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ)',
'tog-showtoc' => 'कनà¥à¤Ÿà¥‡à¤£à¥à¤Ÿà¤¯à¤¾ धलः कà¥à¤¯à¤¨à¤¾à¤¦à¤¿à¤¸à¤ (३गॠसà¥à¤µà¤¯à¤¾ अपà¥à¤µ शिरà¥à¤·à¤• दà¥à¤—ॠपौया निंति)',
-'tog-rememberpassword' => 'जिगॠलग इन थà¥à¤µ कमà¥à¤ªà¥à¤¯à¥à¤¤à¤°à¤¯à¥ लà¥à¤®à¤‚कादिसà¤',
-'tog-editwidth' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सनà¥à¤¦à¥à¤•à¤¯à¤¾ बà¥à¤¯à¤¾à¤ƒ जायेधà¥à¤‚कल',
+'tog-rememberpassword' => 'जिगॠलग इन थà¥à¤µ कमà¥à¤ªà¥à¤¯à¥à¤¤à¤°à¤¯à¥ लà¥à¤®à¤‚कादिसठ(for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'जिं देकागॠ/ नà¥à¤¹à¥à¤¯à¤¥à¤¨à¤¾à¤—ॠपौयात जिगॠदृषà¥à¤Ÿà¤¿à¤§à¤²à¤ƒ(watchlist)यॠतयादिसà¤',
'tog-watchdefault' => 'जिं समà¥à¤ªà¤¾à¤¦à¤¨ यानागॠपौयात जिगॠवाचलिसà¥à¤Ÿà¤¯à¥ तयादिसà¤',
'tog-watchmoves' => 'जिं संकागॠ(move) पौयात जिगॠवाचलिसà¥à¤Ÿà¤¯à¥ तयादिसà¤',
diff --git a/languages/messages/MessagesNiu.php b/languages/messages/MessagesNiu.php
index 607d2e00..ee194ecc 100644
--- a/languages/messages/MessagesNiu.php
+++ b/languages/messages/MessagesNiu.php
@@ -101,7 +101,7 @@ Ua nimo ke hiki e haau tau manako {{SITENAME}}.',
'yourname' => 'Matahigoa he tagata:',
'yourpassword' => 'Kupu fufu:',
'yourpasswordagain' => 'Liu lolomi e kupu fufu:',
-'remembermypassword' => 'Manatu e haaku loko ini',
+'remembermypassword' => 'Manatu e haaku loko ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Hu ki loto',
'nav-login-createaccount' => 'Hu ki loto / talaga e poko',
'userlogin' => 'Hu ki loto / talaga e poko',
diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php
index f80b9eb8..a3bb15a8 100644
--- a/languages/messages/MessagesNl.php
+++ b/languages/messages/MessagesNl.php
@@ -8,6 +8,7 @@
* @file
*
* @author Annabel
+ * @author DasRakel
* @author Effeietsanders
* @author Erwin
* @author Erwin85
@@ -18,6 +19,7 @@
* @author Hamaryns
* @author Jens Liebenau
* @author Krinkle
+ * @author MarkvA
* @author McDutchie
* @author Multichill
* @author Mwpnl
@@ -34,7 +36,7 @@
* @author לערי ריינה×רט
*/
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$namespaceNames = array(
NS_MEDIA => 'Media',
@@ -136,6 +138,7 @@ $magicWords = array(
'subjectpagenamee' => array( '1', 'ONDERWERPPAGINANAAME', 'ARTIKELPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'BERICHT:', 'MSG:' ),
'subst' => array( '0', 'VERV:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'VEILIGVERV:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'BERICHTNW', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'miniatuur', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'miniatuur=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -159,6 +162,7 @@ $magicWords = array(
'ns' => array( '0', 'NR:', 'NS:' ),
'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
'localurle' => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ARTIKELPAD', 'ARTICLEPATH' ),
'servername' => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
'scriptpath' => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
'stylepath' => array( '0', 'STIJLPAD', 'STYLEPATH' ),
@@ -174,6 +178,7 @@ $magicWords = array(
'revisionday' => array( '1', 'VERSIEDAG', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'VERSIEDAG2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'VERSIEMAAND', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'VERSIEMAAND1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'VERSIEJAAR', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
@@ -181,14 +186,14 @@ $magicWords = array(
'fullurl' => array( '0', 'VOLLEDIGEURL', 'FULLURL:' ),
'fullurle' => array( '0', 'VOLLEDIGEURLE', 'FULLURLE:' ),
'lcfirst' => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'GLEERSTE:', 'UCFIRST:' ),
+ 'ucfirst' => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
'lc' => array( '0', 'KL:', 'LC:' ),
'uc' => array( '0', 'HL:', 'UC:' ),
'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
'displaytitle' => array( '1', 'TOONTITEL', 'TITELTONEN', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'V', 'R' ),
'newsectionlink' => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
'anchorencode' => array( '0', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
@@ -214,6 +219,8 @@ $magicWords = array(
'staticredirect' => array( '1', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'datumopmaak', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'PAD', 'PATH' ),
+ 'url_query' => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
);
$specialPageAliases = array(
@@ -227,6 +234,7 @@ $specialPageAliases = array(
'Watchlist' => array( 'Volglijst' ),
'Recentchanges' => array( 'RecenteWijzigingen' ),
'Upload' => array( 'Uploaden' ),
+ 'UploadStash' => array( 'TijdelijkeUpload' ),
'Listfiles' => array( 'Bestandenlijst', 'Afbeeldingenlijst' ),
'Newimages' => array( 'NieuweBestanden', 'NieuweAfbeeldingen' ),
'Listusers' => array( 'Gebruikerslijst', 'Gebruikerlijst' ),
@@ -259,8 +267,9 @@ $specialPageAliases = array(
'Protectedpages' => array( 'BeveiligdePaginas', 'BeveiligdePagina\'s', 'BeschermdePaginas', 'BeschermdePagina’s', 'BeschermdePagina\'s' ),
'Protectedtitles' => array( 'BeveiligdeTitels', 'BeschermdeTitels' ),
'Allpages' => array( 'AllePaginas', 'AllePagina’s', 'AllePagina\'s' ),
- 'Prefixindex' => array( 'Voorvoegselindex', 'Prefixindex' ),
+ 'Prefixindex' => array( 'Voorvoegselindex' ),
'Ipblocklist' => array( 'Blokkeerlijst', 'IP-blokkeerlijst', 'IPblokkeerlijst', 'IpBlokkeerlijst' ),
+ 'Unblock' => array( 'Deblokkeren' ),
'Specialpages' => array( 'SpecialePaginas', 'SpecialePagina’s', 'SpecialePagina\'s' ),
'Contributions' => array( 'Bijdragen' ),
'Emailuser' => array( 'GebruikerE-mailen', 'E-mailGebruiker' ),
@@ -291,6 +300,8 @@ $specialPageAliases = array(
'Mypage' => array( 'MijnPagina' ),
'Mytalk' => array( 'MijnOverleg' ),
'Mycontributions' => array( 'MijnBijdragen' ),
+ 'Myuploads' => array( 'MijnUploads' ),
+ 'PermanentLink' => array( 'PermanenteVerwijzing' ),
'Listadmins' => array( 'Beheerderlijst', 'Administratorlijst', 'Adminlijst', 'Beheerderslijst' ),
'Listbots' => array( 'Botlijst', 'Lijstbots' ),
'Popularpages' => array( 'PopulairePaginas', 'PopulairePagina’s', 'PopulairePagina\'s' ),
@@ -305,6 +316,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'VerwijderdeBijdragen' ),
'Tags' => array( 'Labels' ),
'Activeusers' => array( 'ActieveGebruikers' ),
+ 'ComparePages' => array( 'PaginasVergelijken', 'Pagina\'sVergelijken' ),
+ 'Badtitle' => array( 'OnjuisteNaam' ),
+ 'DisableAccount' => array( 'GebruikerUitschakelen' ),
);
$linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
@@ -325,8 +339,7 @@ $messages = array(
'tog-editsection' => 'Bewerken van deelpagina’s mogelijk maken via [bewerken]-koppelingen',
'tog-editsectiononrightclick' => 'Bewerken van deelpagina’s mogelijk maken met een rechtermuisklik op een tussenkop (vereist JavaScript)',
'tog-showtoc' => 'Inhoudsopgave weergeven (voor pagina’s met minstens 3 tussenkoppen)',
-'tog-rememberpassword' => 'Aanmeldgegevens onthouden',
-'tog-editwidth' => 'Bewerkingsveld over volle breedte van het scherm weergeven',
+'tog-rememberpassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
'tog-watchcreations' => 'Pagina’s die ik aanmaak automatisch volgen',
'tog-watchdefault' => 'Pagina’s die ik bewerk automatisch volgen',
'tog-watchmoves' => 'Pagina’s die ik hernoem automatisch volgen',
@@ -473,31 +486,21 @@ $messages = array(
'faqpage' => 'Project:Veelgestelde vragen',
# Vector skin
-'vector-action-addsection' => 'Kopje toevoegen',
-'vector-action-delete' => 'Verwijderen',
-'vector-action-move' => 'Hernoemen',
-'vector-action-protect' => 'Beveiligen',
-'vector-action-undelete' => 'Terugplaatsen',
-'vector-action-unprotect' => 'Beveiliging opheffen',
-'vector-namespace-category' => 'Categorie',
-'vector-namespace-help' => 'Hulppagina',
-'vector-namespace-image' => 'Bestand',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'Mediapagina',
-'vector-namespace-mediawiki' => 'Bericht',
-'vector-namespace-project' => 'Projectpagina',
-'vector-namespace-special' => 'Speciale pagina',
-'vector-namespace-talk' => 'Overleg',
-'vector-namespace-template' => 'Sjabloon',
-'vector-namespace-user' => 'Gebruikerspagina',
-'vector-view-create' => 'Aanmaken',
-'vector-view-edit' => 'Bewerken',
-'vector-view-history' => 'Geschiedenis bekijken',
-'vector-view-view' => 'Lezen',
-'vector-view-viewsource' => 'Brontekst bekijken',
-'actions' => 'Handelingen',
-'namespaces' => 'Naamruimten',
-'variants' => 'Varianten',
+'vector-action-addsection' => 'Kopje toevoegen',
+'vector-action-delete' => 'Verwijderen',
+'vector-action-move' => 'Hernoemen',
+'vector-action-protect' => 'Beveiligen',
+'vector-action-undelete' => 'Terugplaatsen',
+'vector-action-unprotect' => 'Beveiliging opheffen',
+'vector-simplesearch-preference' => 'Verbeterde zoeksuggesties inschakelen (alleen voor het uiterlijk Vector)',
+'vector-view-create' => 'Aanmaken',
+'vector-view-edit' => 'Bewerken',
+'vector-view-history' => 'Geschiedenis bekijken',
+'vector-view-view' => 'Lezen',
+'vector-view-viewsource' => 'Brontekst bekijken',
+'actions' => 'Handelingen',
+'namespaces' => 'Naamruimten',
+'variants' => 'Varianten',
'errorpagetitle' => 'Fout',
'returnto' => 'Ga naar $1.',
@@ -558,6 +561,9 @@ Te veel gebruikers proberen deze pagina te bekijken.
Wacht alstublieft even voordat u opnieuw toegang probeert te krijgen tot deze pagina.
$1',
+'pool-timeout' => 'De maximaal te wachten tijd voor het wachten op een lock is verstreken',
+'pool-queuefull' => 'De wachtrij van de poel is vol',
+'pool-errorunknown' => 'Er is een onbekende fout opgetreden',
# 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' => 'Over {{SITENAME}}',
@@ -729,7 +735,8 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
'yourname' => 'Gebruikersnaam:',
'yourpassword' => 'Wachtwoord:',
'yourpasswordagain' => 'Geef uw wachtwoord opnieuw in:',
-'remembermypassword' => 'Aanmeldgegevens onthouden',
+'remembermypassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
+'securelogin-stick-https' => 'Verbonden blijven via HTTPS na aanmelden',
'yourdomainname' => 'Uw domein:',
'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.',
'login' => 'Aanmelden',
@@ -746,6 +753,7 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
'gotaccount' => "Hebt u al een gebruikersnaam? '''$1'''.",
'gotaccountlink' => 'Aanmelden',
'createaccountmail' => 'Per e-mail',
+'createaccountreason' => 'Reden:',
'badretype' => 'De ingevoerde wachtwoorden verschillen van elkaar.',
'userexists' => 'De gekozen gebruikersnaam is al in gebruik.
Kies een andere naam.',
@@ -774,6 +782,7 @@ Probeer het opnieuw.',
Probeer het opnieuw.',
'passwordtooshort' => 'Wachtwoorden moeten uit minstens {{PLURAL:$1|$1 teken|$1 tekens}} bestaan.',
'password-name-match' => 'Uw wachtwoord en uw gebruikersnaam mogen niet overeenkomen.',
+'password-login-forbidden' => 'Het gebruik van deze gebruikersnaam met dit wachtwoord is niet toegestaan.',
'mailmypassword' => 'Nieuw wachtwoord e-mailen',
'passwordremindertitle' => 'Nieuw tijdelijk wachtwoord voor {{SITENAME}}',
'passwordremindertext' => 'Iemand, waarschijnlijk u, heeft vanaf IP-adres $1 een verzoek
@@ -821,6 +830,9 @@ Wacht even voordat u het opnieuw probeert.',
'loginlanguagelabel' => 'Taal: $1',
'suspicious-userlogout' => 'Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
+# E-mail sending
+'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
+
# Password reset dialog
'resetpass' => 'Wachtwoord wijzigen',
'resetpass_announce' => 'U bent aangemeld met een tijdelijke code die u per e-mail is toegezonden.
@@ -875,11 +887,13 @@ Mogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aan
'showdiff' => 'Wijzigingen bekijken',
'anoneditwarning' => "'''Waarschuwing:''' u bent niet aangemeld.
Uw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt.",
+'anonpreviewwarning' => "''U bent niet aangemeld.''
+''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
'missingsummary' => "'''Herinnering:''' u hebt geen samenvatting opgegeven voor uw bewerking.
Als u nogmaals op ''Pagina opslaan'' klikt wordt de bewerking zonder samenvatting opgeslagen.",
'missingcommenttext' => 'Plaats uw opmerking hieronder.',
'missingcommentheader' => "'''Let op:''' U hebt geen onderwerp/kop voor deze opmerking opgegeven.
-Als u opnieuw op \"opslaan\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
+Als u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
'summary-preview' => 'Samenvatting nakijken:',
'subject-preview' => 'Nakijken onderwerp/kop:',
'blockedtitle' => 'Gebruiker is geblokkeerd',
@@ -956,8 +970,12 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
'''Deze is nog niet opgeslagen!'''",
'userjspreview' => "'''Let op: u test nu uw persoonlijke JavaScript.'''
'''De pagina is niet opgeslagen!'''",
+'sitecsspreview' => "'''Dit is alleen een voorvertoning van de CSS.'''
+'''Deze is nog niet opgeslagen!'''",
+'sitejspreview' => "'''Dit is alleen een voorvertoning van de JavaScriptcode.'''
+'''Deze is nog niet opgeslagen!'''",
'userinvalidcssjstitle' => "'''Waarschuwing:''' er is geen skin \"\$1\".
-Let op: uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/monobook.css in plaats van {{ns:user}}:Naam/Monobook.css.",
+Let op: uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
'updated' => '(Bijgewerkt)',
'note' => "'''Opmerking:'''",
'previewnote' => "'''Let op: dit is een controlepagina; uw tekst is niet opgeslagen!'''",
@@ -999,8 +1017,6 @@ Hierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven of overgenome
Als u niet wilt dat uw teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />
U belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).
'''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ U DAARVOOR TOESTEMMING HEBT!'''",
-'longpagewarning' => "'''WAARSCHUWING: Deze pagina is $1 kilobyte groot; sommige browsers hebben problemen met het bewerken van pagina's die groter zijn dan 32 kilobyte.
-Wellicht kan deze pagina gesplitst worden in kleinere delen.'''",
'longpageerror' => "'''FOUT: de tekst die u hebt toegevoegd is $1 kilobyte groot, wat groter is dan het maximum van $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.
@@ -1173,7 +1189,7 @@ Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud benaderen en de ve
'revdelete-unsuppress' => 'Beperkingen op teruggezette wijzigingen verwijderen',
'revdelete-log' => 'Reden:',
'revdelete-submit' => 'Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}',
-'revdelete-logentry' => 'zichtbaarheid van bewerkingen is gewijzigd voor [[$1]]',
+'revdelete-logentry' => 'heeft zichtbaarheid van bewerkingen voor [[$1]] gewijzigd',
'logdelete-logentry' => 'wijzigde zichtbaarheid van gebeurtenis [[$1]]',
'revdelete-success' => "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
'revdelete-failure' => "'''De zichtbaarheid van de wijziging kon niet bijgewerkt worden:'''
@@ -1182,6 +1198,8 @@ $1",
'logdelete-failure' => "'''De zichtbaarheid van de logboekregel kon niet ingesteld worden:'''
$1",
'revdel-restore' => 'Zichtbaarheid wijzigen',
+'revdel-restore-deleted' => 'verwijderde versies',
+'revdel-restore-visible' => 'zichtbare versies',
'pagehist' => 'paginageschiedenis',
'deletedhist' => 'verwijderde geschiedenis',
'revdelete-content' => 'inhoud',
@@ -1252,11 +1270,13 @@ Let op dat het gebruiken van de navigatieverwijzingen deze kolom opnieuw instelt
# Diffs
'history-title' => 'Geschiedenis van "$1"',
'difference' => '(Verschil tussen bewerkingen)',
+'difference-multipage' => "(Verschil tussen pagina's)",
'lineno' => 'Regel $1:',
'compareselectedversions' => 'Aangevinkte versies vergelijken',
'showhideselectedversions' => 'Geselecteerde versies weergeven/verbergen',
'editundo' => 'ongedaan maken',
-'diff-multi' => '({{PLURAL:$1|Eén tussenliggende versie wordt|$1 tussenliggende versies worden}} niet weergegeven)',
+'diff-multi' => '({{PLURAL:$1|Eén tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|één gebruiker|$2 gebruikers}} {{PLURAL:$1|wordt|worden}} niet weergegeven)',
+'diff-multi-manyusers' => '($1 tussenliggende versies door meer dan $2 gebruikers worden niet weergegeven)',
# Search results
'searchresults' => 'Zoekresultaten',
@@ -1292,6 +1312,7 @@ Probeer een andere zoekopdracht.',
'searchprofile-everything-tooltip' => "Alle inhoud doorzoeken (inclusief overlegpagina's)",
'searchprofile-advanced-tooltip' => 'Zoeken in aangegeven naamruimten',
'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woorden}})',
+'search-result-category-size' => '{{PLURAL:$1|1 categorielid|$1 categorieleden}} ({{PLURAL:$2|1 ondercategorie|$2 ondercategorieën}}, {{PLURAL:$3|1 bestand|$3 bestanden}})',
'search-result-score' => 'Relevantie: $1%',
'search-redirect' => '(doorverwijzing $1)',
'search-section' => '(subkop $1)',
@@ -1370,6 +1391,7 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
'contextlines' => 'Regels per resultaat:',
'contextchars' => 'Context per regel:',
'stub-threshold' => 'Drempel voor markering als <a href="#" class="stub">beginnetje</a>:',
+'stub-threshold-disabled' => 'Uitgeschakeld',
'recentchangesdays' => 'Aantal dagen weer te geven in de recente wijzigingen:',
'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|dag|dagen}})',
'recentchangescount' => 'Standaard aantal weer te geven bewerkingen:',
@@ -1403,6 +1425,7 @@ Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
'prefs-files' => 'Bestanden',
'prefs-custom-css' => 'persoonlijke CSS',
'prefs-custom-js' => 'persoonlijke JS',
+'prefs-common-css-js' => 'Gedeelde CSS/JS voor elke vormgeving:',
'prefs-reset-intro' => 'Gebruik deze functie om uw voorkeuren te herstellen naar de standaardinstellingen.
Deze handeling kan niet ongedaan gemaakt worden.',
'prefs-emailconfirm-label' => 'E-mailbevestiging:',
@@ -1442,9 +1465,15 @@ U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een
'prefs-advancedrendering' => 'Gevorderde instellingen',
'prefs-advancedsearchoptions' => 'Gevorderde instellingen',
'prefs-advancedwatchlist' => 'Gevorderde instellingen',
-'prefs-display' => 'Weergaveinstellingen',
+'prefs-displayrc' => 'Weergaveinstellingen',
+'prefs-displaysearchoptions' => 'Weergaveopties',
+'prefs-displaywatchlist' => 'Weergaveopties',
'prefs-diffs' => 'Verschillen',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Het e-mailadres lijkt geldig',
+'email-address-validity-invalid' => 'Geef een geldig e-mailadres op',
+
# User rights
'userrights' => 'Gebruikersrechtenbeheer',
'userrights-lookup-user' => 'Gebruikersgroepen beheren',
@@ -1528,6 +1557,7 @@ U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een
'right-hideuser' => 'Een gebruiker voor de overige gebruikers verbergen',
'right-ipblock-exempt' => 'IP-blokkades omzeilen',
'right-proxyunbannable' => "Blokkades voor proxy's gelden niet",
+'right-unblockself' => 'Eigen gebruiker deblokkeren',
'right-protect' => 'Beveiligingsniveaus wijzigen',
'right-editprotected' => "Beveiligde pagina's bewerken",
'right-editinterface' => 'De gebruikersinterface bewerken',
@@ -1550,7 +1580,6 @@ U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een
'right-siteadmin' => 'De database blokkeren en weer vrijgeven',
'right-reset-passwords' => 'Wachtwoorden van andere gebruikers opnieuw instellen',
'right-override-export-depth' => "Pagina's exporteren inclusief pagina's waarnaar verwezen wordt tot een diepte van vijf",
-'right-versiondetail' => 'Uitgebreide versieinformatie van de software weergeven',
'right-sendemail' => 'E-mail versturen aan andere gebruikers',
# User rights log
@@ -1601,14 +1630,9 @@ U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een
'recentchanges-legend' => 'Opties voor recente wijzigingen',
'recentchangestext' => 'Op deze pagina kunt u de recentste wijzigingen in deze wiki bekijken.',
'recentchanges-feed-description' => 'Met deze feed kunt u de recentste wijzigingen in deze wiki bekijken.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nieuwe pagina',
'recentchanges-label-newpage' => 'Met deze bewerking is een nieuwe pagina aangemaakt',
-'recentchanges-legend-minor' => '$1 - kleine wijziging',
'recentchanges-label-minor' => 'Dit is een kleine bewerking',
-'recentchanges-legend-bot' => '$1 - botbewerking',
'recentchanges-label-bot' => 'Deze bewerking is uitgevoerd door een bot',
-'recentchanges-legend-unpatrolled' => '$1 - ongecontroleerde bewerking',
'recentchanges-label-unpatrolled' => 'Deze bewerking is nog niet gecontroleerd',
'rcnote' => "Hieronder {{PLURAL:$1|staat de laatste bewerking|staan de laatste '''$1''' bewerkingen}} in de laatste {{PLURAL:$2|dag|'''$2''' dagen}}, op $4 om $5.",
'rcnotefrom' => "Wijzigingen sinds '''$2''' (met een maximum van '''$1''' wijzigingen).",
@@ -1656,6 +1680,9 @@ om bestanden te uploaden.',
'upload_directory_missing' => 'De uploadmap ($1) is niet aanwezig en kon niet aangemaakt worden door de webserver.',
'upload_directory_read_only' => 'De webserver kan niet schrijven in de uploadmap ($1).',
'uploaderror' => 'Uploadfout',
+'upload-recreate-warning' => "'''Waarschuwing: er is een bestand met deze naam verwijderd of hernoemd.'''
+
+Hieronder worden het verwijderlogboek en het hernoemingslogboek voor deze pagina weergegeven:",
'uploadtext' => "Gebruik het onderstaande formulier om bestanden te uploaden.
Om eerder toegevoegde bestanden te bekijken of te zoeken kunt u naar de [[Special:FileList|bestandslijst]] gaan.
Uploads en bestanden die na verwijdering opnieuw worden toegevoegd zijn na te zien in het [[Special:Log/upload|uploadlogboek]].
@@ -1695,6 +1722,17 @@ Aangewezen {{PLURAL:\$3|bestandstype is|bestandstypes zijn}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' is geen toegelaten bestandstype.
Toegelaten {{PLURAL:\$3|bestandstype is|bestandstypes zijn}} \$2.",
'filetype-missing' => 'Dit bestand heeft geen extensie (zoals ".jpg").',
+'empty-file' => 'Het bestand dat u probeerde te uploaden had geen inhoud.',
+'file-too-large' => 'Het bestand dat u probeerde te uploaden was te groot.',
+'filename-tooshort' => 'Het bestand dat u probeerde te uploaden had een te korte bestandsnaam.',
+'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.',
+'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.',
+'tmp-write-error' => 'Er is een fout opgetreden bij het schrijven van het tijdelijke bestand.',
'large-file' => 'Aanbeveling: maak bestanden niet groter dan $1, dit bestand is $2.',
'largefileserver' => 'Het bestand is groter dan de instelling van de server toestaat.',
'emptyfile' => 'Het bestand dat u hebt geüpload lijkt leeg te zijn.
@@ -1726,13 +1764,14 @@ Als u het bestand alsnog wilt uploaden, ga dan terug en kies een andere naam.
'file-exists-duplicate' => 'Dit bestand is indentiek aan {{PLURAL:$1|het volgende bestand|de volgende bestanden}}:',
'file-deleted-duplicate' => 'Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.
Raadpleeg het verwijderingslogboek voordat u verder gaat.',
-'successfulupload' => 'Het bestand is toegevoegd',
'uploadwarning' => 'Uploadwaarschuwing',
'uploadwarning-text' => 'Pas de onderstaande bestandsbeschrijving aan en probeer het daarna opnieuw.',
'savefile' => 'Bestand opslaan',
'uploadedimage' => 'heeft "[[$1]]" geüpload',
'overwroteimage' => 'heeft een nieuwe versie van "[[$1]]" toegevoegd',
'uploaddisabled' => 'Uploaden is uitgeschakeld',
+'copyuploaddisabled' => 'Het uploaden van bestanden via een URL is uitgeschakeld.',
+'uploadfromurl-queued' => 'Uw upload is in de wachtrij geplaatst.',
'uploaddisabledtext' => 'Het uploaden van bestanden is uitgeschakeld.',
'php-uploaddisabledtext' => 'PHP-bestanduploads zijn uitgeschakeld. Controleer a.u.b. de file_uploads-instelling.',
'uploadscripted' => 'Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.',
@@ -1767,6 +1806,15 @@ JD # Jenoptik
MGP # Pentax
PICT # overig
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'Het bestand is toegevoegd',
+'upload-success-msg' => 'Uw upload van [$2] is geslaagd en is beschikbaar: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Uploadprobleem',
+'upload-failure-msg' => 'Er was een probleem met uw upload van [$2]:
+
+$1',
+'upload-warning-subj' => 'Uploadwaarschuwing',
+'upload-warning-msg' => 'Er was een probleem met uw upload van [$2].
+Ga terug naar het [[Special:Upload/stash/$1|uploadformulier]] om dit probleem te verhelpen.',
'upload-proto-error' => 'Verkeerd protocol',
'upload-proto-error-text' => "Uploads via deze methode vereisen URL's die beginnen met <code>http://</code> of <code>ftp://</code>.",
@@ -1833,6 +1881,7 @@ Klikken op een kolomkop verandert de sortering.',
'listfiles_search_for' => 'Zoeken naar bestand:',
'imgfile' => 'bestand',
'listfiles' => 'Bestandslijst',
+'listfiles_thumb' => 'Miniatuur',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Naam',
'listfiles_user' => 'Gebruiker',
@@ -1877,6 +1926,7 @@ De [$2 pagina met de bestandsbeschrijving] wordt hieronder weergegeven.',
'shared-repo-from' => 'van $1',
'shared-repo' => 'een gedeelde mediadatabank',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
+'filepage.css' => "/ * De CSS die hier geplaatst wordt, wordt opgenomen in de bestandsbeschrijvingspagina en wordt ook opgenomen op externe wiki's (via externe repositories) * /",
# File reversion
'filerevert' => '$1 terugdraaien',
@@ -1948,8 +1998,8 @@ Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens dit sjab
'statistics-edits' => 'Paginabewerkingen sinds het begin van {{SITENAME}}',
'statistics-edits-average' => 'Gemiddeld aantal bewerkingen per pagina',
'statistics-views-total' => "Totaal aantal weergegeven pagina's",
+'statistics-views-total-desc' => "Het bekijken van niet-bestaande pagina's en speciale pagina's is niet inbegrepen",
'statistics-views-peredit' => "Weergegeven pagina's per bewerking",
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Jobqueuelengte]',
'statistics-users' => 'Geregistreerde [[Special:ListUsers|gebruikers]]',
'statistics-users-active' => 'Actieve gebruikers',
'statistics-users-active-desc' => 'Gebruikers die in de afgelopen {{PLURAL:$1|dag|$1 dagen}} een handeling hebben uitgevoerd',
@@ -1965,7 +2015,7 @@ Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.
'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
Elke rij bevat verwijzingen naar de eerste en de tweede doorverwijspagina en een verwijzing naar de doelpagina van de tweede doorverwijspagina.
Meestal is de laatste pagina het eigenlijke doel, waar de eerste pagina naar zou moeten doorverwijzen.
-<s>Doorgehaalde regels</s> geven aan dat het probleem al is opgelost.",
+<del>Doorgehaalde regels</del> geven aan dat het probleem al is opgelost.",
'double-redirect-fixed-move' => '[[$1]] is verplaatst en is nu een doorverwijzing naar [[$2]]',
'double-redirect-fixer' => 'Doorverwijzingen opschonen',
@@ -1988,6 +2038,8 @@ Meestal is de laatste pagina het eigenlijke doel, waar de eerste pagina naar zou
'nmembers' => '$1 {{PLURAL:$1|item|items}}',
'nrevisions' => '$1 {{PLURAL:$1|versie|versies}}',
'nviews' => '{{PLURAL:$1|1 keer|$1 keer}} bekeken',
+'nimagelinks' => "Gebruikt op {{PLURAL:$1|één pagina|$1 pagina's}}",
+'ntransclusions' => "gebruikt op {{PLURAL:$1|één pagina|$1 pagina's}}",
'specialpage-empty' => 'Deze pagina is leeg.',
'lonelypages' => "Weespagina's",
'lonelypagestext' => "Naar de onderstaande pagina's wordt vanuit {{SITENAME}} niet verwezen.
@@ -2148,35 +2200,41 @@ Er kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individu
'listgrouprights-removegroup-self-all' => 'Alle groepen verwijderen van eigen gebruiker',
# E-mail user
-'mailnologin' => 'Geen verzendadres beschikbaar',
-'mailnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in uw [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
-'emailuser' => 'Deze gebruiker e-mailen',
-'emailpage' => 'Gebruiker e-mailen',
-'emailpagetext' => 'Via dit formulier kunt u een e-mail aan deze gebruiker verzenden.
+'mailnologin' => 'Geen verzendadres beschikbaar',
+'mailnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in uw [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
+'emailuser' => 'Deze gebruiker e-mailen',
+'emailpage' => 'Gebruiker e-mailen',
+'emailpagetext' => 'Via dit formulier kunt u een e-mail aan deze gebruiker verzenden.
Het e-mailadres dat u hebt opgegeven bij [[Special:Preferences|uw voorkeuren]] wordt als afzender gebruikt.
De ontvanger kan dus direct naar u reageren.',
-'usermailererror' => 'Foutmelding bij het verzenden:',
-'defemailsubject' => 'E-mail van {{SITENAME}}',
-'noemailtitle' => 'Van deze gebruiker is geen e-mailadres bekend',
-'noemailtext' => 'Deze gebruiker heeft geen geldig e-mailadres opgegeven.',
-'nowikiemailtitle' => 'E-mail is niet toegestaan',
-'nowikiemailtext' => 'Deze gebruiker wil geen e-mail ontvangen van andere gebruikers.',
-'email-legend' => 'Een e-mail versturen 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.',
-'emailccsubject' => 'Kopie van uw bericht aan $1: $2',
-'emailsent' => 'E-mail verzonden',
-'emailsenttext' => 'Uw e-mail is verzonden.',
-'emailuserfooter' => 'Deze e-mail is verstuurd door $1 aan $2 door de functie "Deze gebruiker e-mailen" van {{SITENAME}}.',
+'usermailererror' => 'Foutmelding bij het verzenden:',
+'defemailsubject' => 'E-mail van {{SITENAME}}',
+'usermaildisabled' => 'Gebruikerse-mail uitgeschakeld',
+'usermaildisabledtext' => 'U kunt geen e-mail verzenden naar andere gebruikers op deze wiki',
+'noemailtitle' => 'Van deze gebruiker is geen e-mailadres bekend',
+'noemailtext' => 'Deze gebruiker heeft geen geldig e-mailadres opgegeven.',
+'nowikiemailtitle' => 'E-mail is niet toegestaan',
+'nowikiemailtext' => 'Deze gebruiker wil geen e-mail ontvangen van andere gebruikers.',
+'email-legend' => 'Een e-mail versturen 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.',
+'emailccsubject' => 'Kopie van uw bericht aan $1: $2',
+'emailsent' => 'E-mail verzonden',
+'emailsenttext' => 'Uw e-mail is verzonden.',
+'emailuserfooter' => 'Deze e-mail is verstuurd door $1 aan $2 door de functie "Deze gebruiker e-mailen" van {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Systeembericht achtergelaten',
+'usermessage-editor' => 'Systeembericht',
# Watchlist
'watchlist' => 'Volglijst',
'mywatchlist' => 'Mijn volglijst',
-'watchlistfor' => "(voor '''$1''')",
+'watchlistfor2' => 'Voor $1 $2',
'nowatchlist' => 'Uw volglijst is leeg.',
'watchlistanontext' => '$1 is noodzakelijk om uw volglijst in te zien of te wijzigen.',
'watchnologin' => 'U bent niet aangemeld',
@@ -2235,6 +2293,9 @@ Tenzij u deze pagina bezoekt, komen er geen verdere berichten. Op uw volglijst k
Groet van uw {{SITENAME}} waarschuwingssysteem.
--
+U kunt uw e-mailinstellingen wijzigen op:
+{{fullurl:{{#special:Preferences}}}}
+
U kunt uw volglijstinstellingen wijzigen op:
{{fullurl:Special:Watchlist/edit}}
@@ -2295,7 +2356,10 @@ De meest recente bewerking is gemaakt door [[User:$3|$3]] ([[User talk:$3|overle
'revertpage-nouser' => 'Wijzigingen door (gebruikersnaam verwijderd) teruggedraaid naar de laatste versie door [[User:$1|$1]]',
'rollback-success' => 'De wijzigingen door $1 zijn teruggedraaid.
De laatste versie van $2 is hersteld.',
-'sessionfailure' => 'Er lijkt een probleem te zijn met uw aanmeldsessie.
+
+# Edit tokens
+'sessionfailure-title' => 'Sessiefout',
+'sessionfailure' => 'Er lijkt een probleem te zijn met uw aanmeldsessie.
Uw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke "hijacking" van deze sessie).
Ga een pagina terug, laad die pagina opnieuw en probeer het nog eens.',
@@ -2431,19 +2495,23 @@ $1',
'month' => 'Van maand (en eerder):',
'year' => 'Van jaar (en eerder):',
-'sp-contributions-newbies' => 'Alleen de bijdragen van nieuwe gebruikers bekijken',
-'sp-contributions-newbies-sub' => 'Voor nieuwelingen',
-'sp-contributions-newbies-title' => 'Bijdragen van nieuwe gebruikers',
-'sp-contributions-blocklog' => 'blokkeerlogboek',
-'sp-contributions-deleted' => 'verwijderde bijdragen',
-'sp-contributions-logs' => 'logboeken',
-'sp-contributions-talk' => 'overleg',
-'sp-contributions-userrights' => 'gebruikersrechtenbeheer',
-'sp-contributions-blocked-notice' => 'Deze gebruiker is op het moment geblokkeerd.
+'sp-contributions-newbies' => 'Alleen de bijdragen van nieuwe gebruikers bekijken',
+'sp-contributions-newbies-sub' => 'Voor nieuwelingen',
+'sp-contributions-newbies-title' => 'Bijdragen van nieuwe gebruikers',
+'sp-contributions-blocklog' => 'blokkeerlogboek',
+'sp-contributions-deleted' => 'verwijderde bijdragen',
+'sp-contributions-uploads' => 'uploads',
+'sp-contributions-logs' => 'logboeken',
+'sp-contributions-talk' => 'overleg',
+'sp-contributions-userrights' => 'gebruikersrechtenbeheer',
+'sp-contributions-blocked-notice' => 'Deze gebruiker is op het moment geblokkeerd.
De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
-'sp-contributions-search' => 'Zoeken naar bijdragen',
-'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
-'sp-contributions-submit' => 'Bekijken',
+'sp-contributions-blocked-notice-anon' => 'Dit IP-adres is geblokkeerd.
+De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
+'sp-contributions-search' => 'Zoeken naar bijdragen',
+'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
+'sp-contributions-toponly' => 'Alleen nieuwste versies weergeven',
+'sp-contributions-submit' => 'Bekijken',
# What links here
'whatlinkshere' => 'Verwijzingen naar deze pagina',
@@ -2504,7 +2572,6 @@ Zie de [[Special:IPBlockList|Lijst van geblokkeerde IP-adressen]] voor recente b
'ipb-edit-dropdown' => 'Lijst van redenen bewerken',
'ipb-unblock-addr' => '$1 deblokkeren',
'ipb-unblock' => 'Een gebruiker of IP-adres deblokkeren',
-'ipb-blocklist-addr' => 'Bestaande blokkades voor $1',
'ipb-blocklist' => 'Bestaande blokkades bekijken',
'ipb-blocklist-contribs' => 'Bijdragen van $1',
'unblockip' => 'Gebruiker deblokkeren',
@@ -2581,6 +2648,8 @@ U kunt geen gebruiker registreren.',
'cant-block-while-blocked' => 'U kunt andere gebruikers niet blokkeren terwijl u zelf geblokkeerd bent.',
'cant-see-hidden-user' => "De gebruiker die u probeert te blokken is al geblokkeerd en verborgen.
Omdat u het recht 'hideuser' niet hebt, kunt u de blokkade van de gebruiker niet bekijken of bewerken.",
+'ipbblocked' => 'U kunt geen andere gebruikers (de)blokkeren, omdat u zelf geblokkeerd bent',
+'ipbnounblockself' => 'U mag uzelf niet deblokkeren',
# Developer tools
'lockdb' => 'Database blokkeren',
@@ -2620,6 +2689,16 @@ Een pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaa
'''WAARSCHUWING!'''
Voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.
Zorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
+'movepagetext-noredirectfixer' => "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.
+De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.
+Controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.
+
+Een pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.
+U kunt dus een pagina die abusievelijk is hernoemd terug hernoemen en u kunt een bestaande pagina niet overschrijven.
+
+'''Waarschuwing!'''
+Voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.
+Zorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
'movepagetalktext' => "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':
* De overlegpagina onder de nieuwe naam al bestaat;
* U het onderstaande vinkje deselecteert.",
@@ -2676,6 +2755,7 @@ Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
'immobile-source-page' => 'Deze pagina kan niet hernoemd worden.',
'immobile-target-page' => 'Het is niet mogelijk te hernoemen naar die paginanaam.',
'imagenocrossnamespace' => 'Een mediabestand kan niet naar een andere naamruimte verplaatst worden',
+'nonfile-cannot-move-to-file' => 'Het is niet mogelijk te hernoemen van en naar de bestandsnaamruimte',
'imagetypemismatch' => 'De nieuwe bestandsextensie is niet gelijk aan het bestandstype',
'imageinvalidfilename' => 'De nieuwe bestandsnaam is ongeldig',
'fix-double-redirects' => 'Alle doorverwijzingen bijwerken die verwijzen naar de originele paginanaam',
@@ -2757,6 +2837,7 @@ Sla de uitvoer op uw eigen computer op, en voeg die daarna hier toe.',
'importstart' => "Pagina's aan het importeren…",
'import-revision-count' => '$1 {{PLURAL:$1|versie|versies}}',
'importnopages' => "Geen pagina's te importeren.",
+'imported-log-entries' => '$1 {{PLURAL:$1|logboekregel|logboekregels}} geïmporteerd.',
'importfailed' => 'Import is mislukt: $1',
'importunknownsource' => 'Onbekend importbrontype',
'importcantopen' => 'Kon het importbestand niet openen',
@@ -2852,6 +2933,8 @@ De tijdelijke map is niet aanwezig.',
'tooltip-upload' => 'Uploaden',
'tooltip-rollback' => 'Met "terugdraaien" draait u met één klik de bewerking(en) terug van de laatste gebruiker die deze pagina heeft bewerkt.',
'tooltip-undo' => 'Met "ongedaan maken" draait u deze bewerking terug en komt in het bewerkingsvenster. U kunt in de bewerkingssamenvatting een reden opgeven.',
+'tooltip-preferences-save' => 'Voorkeuren opslaan',
+'tooltip-summary' => 'Voer een korte samenvatting in',
# Stylesheets
'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
@@ -2984,14 +3067,17 @@ $1',
'thumbsize' => 'Grootte miniatuurafbeelding:',
'widthheight' => '$1x$2',
'widthheightpage' => "$1×$2, $3 {{PLURAL:$3|pagina|pagina's}}",
-'file-info' => '(bestandsgrootte: $1, MIME-type: $2)',
-'file-info-size' => '($1 × $2 pixels, bestandsgrootte: $3, MIME-type: $4)',
+'file-info' => 'bestandsgrootte: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 pixels, bestandsgrootte: $3, MIME-type: $4',
'file-nohires' => '<small>Geen hogere resolutie beschikbaar.</small>',
-'svg-long-desc' => '(SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3)',
+'svg-long-desc' => 'SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3',
'show-big-image' => 'Volledige resolutie',
'show-big-image-thumb' => '<small>Afmetingen van deze weergave: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'herhalend',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'file-info-png-looped' => 'herhalend',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|keer|keer}} afgespeeld',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
# Special:NewFiles
'newimages' => 'Nieuwe bestanden',
@@ -3150,6 +3236,7 @@ Andere velden worden verborgen.
'exif-gpsareainformation' => 'Naam GPS-gebied',
'exif-gpsdatestamp' => 'GPS-datum',
'exif-gpsdifferential' => 'Differentiele GPS-correctie',
+'exif-objectname' => 'Korte naam',
# EXIF attributes
'exif-compression-1' => 'Ongecomprimeerd',
@@ -3311,31 +3398,31 @@ Andere velden worden verborgen.
'limitall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'E-mailadres bevestigen',
-'confirmemail_noemail' => 'U hebt geen geldig e-mailadres ingegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
-'confirmemail_text' => '{{SITENAME}} eist bevestiging van uw e-mailadres voordat u de e-mailmogelijkheden kunt gebruiken.
+'confirmemail' => 'E-mailadres bevestigen',
+'confirmemail_noemail' => 'U hebt geen geldig e-mailadres ingegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
+'confirmemail_text' => '{{SITENAME}} eist bevestiging van uw e-mailadres voordat u de e-mailmogelijkheden kunt gebruiken.
Klik op de onderstaande knop om een bevestigingsbericht te ontvangen.
Dit bericht bevat een verwijzing met een code.
Open die verwijzing om uw e-mailadres te bevestigen.',
-'confirmemail_pending' => 'Er is al een bevestigingsbericht aan u verzonden.
+'confirmemail_pending' => 'Er is al een bevestigingsbericht aan u verzonden.
Als u recentelijk uw gebruiker hebt aangemaakt, wacht dan een paar minuten totdat die aankomt voordat u opnieuw een e-mail laat sturen.',
-'confirmemail_send' => 'Een bevestigingscode verzenden',
-'confirmemail_sent' => 'Bevestigingscode verzonden.',
-'confirmemail_oncreate' => 'Er is een bevestigingscode naar uw e-mailadres verzonden.
+'confirmemail_send' => 'Een bevestigingscode verzenden',
+'confirmemail_sent' => 'Bevestigingscode verzonden.',
+'confirmemail_oncreate' => 'Er is een bevestigingscode naar uw e-mailadres verzonden.
Deze code is niet nodig om u aan te melden, maar u dient deze wel te bevestigen voordat u de e-mailmogelijkheden van deze wiki kunt gebruiken.',
-'confirmemail_sendfailed' => '{{SITENAME}} kon uw bevestigingscode niet verzenden.
+'confirmemail_sendfailed' => '{{SITENAME}} kon uw bevestigingscode niet verzenden.
Controleer uw e-mailadres op ongeldige tekens.
Het e-mailprogramma meldde: $1',
-'confirmemail_invalid' => 'Ongeldige bevestigingscode.
+'confirmemail_invalid' => 'Ongeldige bevestigingscode.
Mogelijk is de code verlopen.',
-'confirmemail_needlogin' => 'U moet $1 om uw e-mailadres te bevestigen.',
-'confirmemail_success' => 'Uw e-mailadres is bevestigd.
+'confirmemail_needlogin' => 'U moet $1 om uw e-mailadres te bevestigen.',
+'confirmemail_success' => 'Uw e-mailadres is bevestigd.
U kunt zich nu [[Special:UserLogin|aanmelden]] en {{SITENAME}} gebruiken.',
-'confirmemail_loggedin' => 'Uw e-mailadres is nu bevestigd.',
-'confirmemail_error' => 'Er is iets verkeerd gegaan tijdens het opslaan van uw bevestiging.',
-'confirmemail_subject' => 'Bevestiging e-mailadres voor {{SITENAME}}',
-'confirmemail_body' => 'Iemand, waarschijnlijk u, met het IP-adres $1,
+'confirmemail_loggedin' => 'Uw e-mailadres is nu bevestigd.',
+'confirmemail_error' => 'Er is iets verkeerd gegaan tijdens het opslaan van uw bevestiging.',
+'confirmemail_subject' => 'Bevestiging e-mailadres voor {{SITENAME}}',
+'confirmemail_body' => 'Iemand, waarschijnlijk u, met het IP-adres $1,
heeft zich met dit e-mailadres geregistreerd als gebruiker "$2" op {{SITENAME}}.
Open de volgende verwijzing in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:
@@ -3347,8 +3434,32 @@ Als u uzelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevesti
$5
De bevestigingscode vervalt op $4.',
-'confirmemail_invalidated' => 'De e-mailbevestiging is geannuleerd',
-'invalidateemail' => 'E-mailbevestiging annuleren',
+'confirmemail_body_changed' => 'Iemand, waarschijnlijk u, met het IP-adres $1,
+heeft het het e-mailadres geregistreerd voor gebruiker "$2" op {{SITENAME}} gewijzigd naar dit e-mailadres.
+
+Open de volgende verwijzing in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
+
+$3
+
+Als u uzelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van uw e-mailadres te annuleren:
+
+$5
+
+De bevestigingscode vervalt op $4.',
+'confirmemail_body_set' => 'Iemand, waarschijnlijk u, met het IP-adres $1,
+heeft het het e-mailadres voor gebruiker "$2" op {{SITENAME}} ingesteld op dit e-mailadres.
+
+Open de volgende verwijzing in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
+
+$3
+
+Als u zelf deze wijziging *niet* hebt gemaakt, volg dan de volgende verwijzing om de bevestiging van uw e-mailadres te annuleren:
+
+$5
+
+De bevestigingscode vervalt op $4.',
+'confirmemail_invalidated' => 'De e-mailbevestiging is geannuleerd',
+'invalidateemail' => 'E-mailbevestiging annuleren',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-invoeging van sjablonen is uitgeschakeld]',
@@ -3388,6 +3499,7 @@ Bevestig dat u de pagina opnieuw wilt aanmaken.",
'table_pager_first' => 'Eerste pagina',
'table_pager_last' => 'Laatste pagina',
'table_pager_limit' => '$1 resultaten per pagina bekijken',
+'table_pager_limit_label' => 'Items per pagina:',
'table_pager_limit_submit' => 'OK',
'table_pager_empty' => 'Geen resultaten',
@@ -3464,6 +3576,7 @@ U kunt ook [[Special:Watchlist/edit|het standaard bewerkingsscherm gebruiken]].'
'version-specialpages' => "Speciale pagina's",
'version-parserhooks' => 'Parserhooks',
'version-variables' => 'Variabelen',
+'version-skins' => 'Vormgevingen',
'version-other' => 'Overige',
'version-mediahandlers' => 'Mediaverwerkers',
'version-hooks' => 'Hooks',
@@ -3475,6 +3588,13 @@ U kunt ook [[Special:Watchlist/edit|het standaard bewerkingsscherm gebruiken]].'
'version-hook-subscribedby' => 'Geabonneerd door',
'version-version' => '(Versie $1)',
'version-license' => 'Licentie',
+'version-poweredby-credits' => "Deze wiki wordt aangedreven door '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'anderen',
+'version-license-info' => 'MediaWiki is vrije software; u kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - naar uw wens - enige latere versie.
+
+MediaWiki wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van VERKOOPBAARHEID of GESCHIKTHEID VOOR ENIG DOEL IN HET BIJZONDER. Zie de GNU General Public License voor meer informatie.
+
+Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de GNU General Public License] te hebben ontvangen; zo niet, schrijf dan naar de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA of [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lees de licentie online].',
'version-software' => 'Geïnstalleerde software',
'version-software-product' => 'Product',
'version-software-version' => 'Versie',
@@ -3546,6 +3666,15 @@ Voer de bestandsnaam in zonder het voorvoegsel "{{ns:file}}:".',
'tags-edit' => 'bewerken',
'tags-hitcount' => '$1 {{PLURAL:$1|wijziging|wijzigingen}}',
+# Special:ComparePages
+'comparepages' => "Pagina's vergelijken",
+'compare-selector' => 'Paginaversies vergelijken',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versie 1',
+'compare-rev2' => 'Versie 2',
+'compare-submit' => 'Vergelijken',
+
# Database error messages
'dberr-header' => 'Deze wiki heeft een probleem',
'dberr-problems' => 'Onze excuses. Deze site ondervindt op het moment technische problemen.',
@@ -3562,8 +3691,13 @@ Voer de bestandsnaam in zonder het voorvoegsel "{{ns:file}}:".',
'htmlform-float-invalid' => 'De waarde die u hebt opgegeven is geen getal.',
'htmlform-int-toolow' => 'De ingegeven waarde ligt onder de minimumwaarde van $1',
'htmlform-int-toohigh' => 'De ingegeven waarde ligt boven de maximumwaarde van $1',
+'htmlform-required' => 'Deze waarde is verplicht',
'htmlform-submit' => 'Opslaan',
'htmlform-reset' => 'Wijzigingen ongedaan maken',
'htmlform-selectorother-other' => 'Anders',
+# SQLite database support
+'sqlite-has-fts' => 'Versie $1 met ondersteuning voor "full-text" zoeken',
+'sqlite-no-fts' => 'Versie $1 zonder ondersteuning voor "full-text" zoeken',
+
);
diff --git a/languages/messages/MessagesNl_informal.php b/languages/messages/MessagesNl_informal.php
new file mode 100644
index 00000000..e947c247
--- /dev/null
+++ b/languages/messages/MessagesNl_informal.php
@@ -0,0 +1,658 @@
+<?php
+/** ‪Nederlands (informeel)‬ (‪Nederlands (informeel)‬)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author MarkvA
+ * @author Siebrand
+ * @author Tedjuh10
+ */
+
+$fallback = 'nl';
+
+$messages = array(
+'view-pool-error' => 'Sorry, de servers zijn op het moment overbelast.
+Te veel gebruikers proberen deze pagina te bekijken.
+Wacht alstublieft even voordat je opnieuw toegang probeert te krijgen tot deze pagina.
+
+$1',
+
+'badaccess-group0' => 'Je hebt geen rechten om de gevraagde handeling uit te voeren.',
+
+'youhavenewmessages' => 'Je hebt $1 ($2).',
+'youhavenewmessagesmulti' => 'Je hebt nieuwe berichten op $1',
+
+# Main script and global functions
+'nosuchactiontext' => 'De opdracht in de URL is ongeldig.
+Mogelijk heb je een typefout gemaakt in de URL of een onjuiste verwijzing gevolgd.
+Het kan ook wijzen op een fout in de software van {{SITENAME}}.',
+'nospecialpagetext' => '<strong>Je hebt een onbestaande speciale pagina opgevraagd.</strong>
+
+Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|speciale pagina’s]].',
+
+# General errors
+'missing-article' => 'In de database is geen inhoud aangetroffen voor de pagina "$1" die er wel zou moeten zijn ($2).
+
+Dit kan voorkomen als je een verouderde verwijzing naar het verschil tussen twee versies van een pagina volgt of een versie opvraagt die is verwijderd.
+
+Als dit niet het geval is, heb je wellicht een fout in de software gevonden.
+Maak hiervan melding bij een [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENAME}} en vermeld daarbij de URL van deze pagina.',
+'actionthrottledtext' => 'Als maatregel tegen spam is het aantal keren per tijdseenheid dat je deze handeling kunt verrichten beperkt.
+De limiet is overschreden.
+Probeer het over een aantal minuten opnieuw.',
+'viewsourcetext' => 'Je kunt de brontekst van deze pagina bekijken en kopiëren:',
+'editinginterface' => "'''Waarschuwing:''' Je bewerkt een pagina die gebruikt wordt door de software.
+Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen.
+Overweeg voor vertalingen om [http://translatewiki.net/wiki/Main_Page?setlang=nl translatewiki.net] te gebruiken, het vertalingsproject voor MediaWiki.",
+'namespaceprotected' => "Je hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
+'customcssjsprotected' => 'Je kunt deze pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
+
+# Login and logout pages
+'logouttext' => "'''Je bent nu afgemeld.'''
+
+Je kunt {{SITENAME}} nu anoniem gebruiken of weer [[Special:UserLogin|aanmelden]] als dezelfde of een andere gebruiker.
+Mogelijk worden nog een aantal pagina's weergegeven alsof je aangemeld bent totdat je de cache van uw browser leegt.",
+'welcomecreation' => '== Welkom, $1! ==
+Je gebruiker is geregistreerd.
+Vergeet niet je [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
+'yourpasswordagain' => 'Geef je wachtwoord opnieuw in:',
+'yourdomainname' => 'Je domein:',
+'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming uw externe gebruiker bij te werken.',
+'loginprompt' => 'Je moet cookies ingeschakeld hebben om je te kunnen aanmelden bij {{SITENAME}}.',
+'gotaccount' => "Heb je al een gebruikersnaam? '''$1'''.",
+'nocookiesnew' => 'De gebruiker is geregistreerd, maar niet aangemeld.
+{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
+Schakel die in en meld daarna aan met je nieuwe gebruikersnaam en wachtwoord.',
+'nocookieslogin' => '{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
+Cookies zijn uitgeschakeld in je browser.
+Schakel deze optie aan en probeer het opnieuw.',
+'noname' => 'Je hebt geen geldige gebruikersnaam opgegeven.',
+'loginsuccess' => "'''Je bent nu aangemeld bij {{SITENAME}} als \"\$1\".'''",
+'nouserspecified' => 'Je dient een gebruikersnaam op te geven.',
+'password-name-match' => 'Je wachtwoord en uw gebruikersnaam mogen niet overeenkomen.',
+'passwordremindertext' => 'Iemand, waarschijnlijk jijzelf, heeft vanaf IP-adres $1 een verzoek
+gedaan tot het toezenden van een nieuw wachtwoord voor {{SITENAME}}
+($4). Er is een tijdelijk wachtwoord aangemaakt voor gebruiker "$2":
+"$3". Als dat je bedoeling was, meld je dan nu aan en kies een nieuw
+wachtwoord.
+Je tijdelijke wachtwoord vervalt over {{PLURAL:$5|$5 dag|$5 dagen}}.
+
+Als iemand anders dan jij dit verzoek heeft gedaan of als je zich inmiddels het
+wachtwoord herinnert en het niet langer wilt wijzigen, negeer dit bericht
+dan en blijf je bestaande wachtwoord gebruiken.',
+'noemailcreate' => 'Je moet een geldig e-mailadres opgeven',
+'passwordsent' => 'Het wachtwoord is verzonden naar het e-mailadres voor "$1".
+Meld je aan nadat je het hebt ontvangen.',
+'blocked-mailpassword' => 'Je IP-adres is geblokkeerd voor het maken van wijzigingen.
+Om misbruik te voorkomen is het niet mogelijk om een nieuw wachtwoord aan te vragen.',
+'eauthentsent' => 'Er is een bevestigingse-mail naar het opgegeven e-mailadres gezonden.
+Volg de aanwijzingen in de e-mail om aan te geven dat het jouw e-mailadres is.
+Tot die tijd kunnen er geen e-mails naar het e-mailadres gezonden worden.',
+'acct_creation_throttle_hit' => 'Bezoekers van deze wiki met hetzelfde IP-adres als jij hebben de afgelopen dag {{PLURAL:$1|al 1 gebruiker|al $1 gebruikers}} geregistreerd, wat het maximale aantal in deze periode is.
+Daarom kun je als vanaf jouw IP-adres op dit moment geen nieuwe gebruiker registreren.',
+'emailauthenticated' => 'Je e-mailadres is bevestigd op $2 om $3.',
+'emailnotauthenticated' => 'Je e-mailadres is <strong>niet bevestigd</strong>.
+Je ontvangt geen e-mail voor de onderstaande functies.',
+'noemailprefs' => 'Geef een e-mailadres op in je voorkeuren om deze functies te gebruiken.',
+'emailconfirmlink' => 'Bevestig je e-mailadres',
+'createaccount-text' => 'Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam "$2" en jouw e-mailadres.
+Het wachtwoord voor "$2" is "$3".
+Meld je aan en wijzig je wachtwoord.
+
+Negeer dit bericht als deze gebruiker zonder jouw medeweten is aangemaakt.',
+'login-throttled' => 'Je hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
+Wacht even voordat je het opnieuw probeert.',
+'suspicious-userlogout' => 'Je verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
+
+# Password reset dialog
+'resetpass_announce' => 'Je bent aangemeld met een tijdelijke code die je per e-mail is toegezonden.
+Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
+'resetpass_success' => 'Je wachtwoord is gewijzigd.
+Bezig met aanmelden…',
+'resetpass-no-info' => 'Je dient aangemeld zijn voordat je deze pagina kunt gebruiken.',
+'resetpass-wrong-oldpass' => 'Het huidige of tijdelijke wachtwoord is ongeldig.
+Mogelijk heb je je wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aangevraagd.',
+
+# Edit page toolbar
+'sig_tip' => 'Je handtekening met datum en tijd',
+
+# Edit pages
+'anoneditwarning' => "'''Waarschuwing:''' je bent niet aangemeld.
+Je IP-adres wordt opgeslagen als je wijzigingen op deze pagina maakt.",
+'anonpreviewwarning' => "''Je bent niet aangemeld.''
+''Door je bewerking op te slaan wordt je IP-adres opgeslagen in de paginageschiedenis.''",
+'missingsummary' => "'''Herinnering:''' je hebt geen samenvatting opgegeven voor je bewerking.
+Als je nogmaals op ''Pagina opslaan'' klikt wordt de bewerking zonder samenvatting opgeslagen.",
+'missingcommenttext' => 'Plaats je opmerking hieronder.',
+'missingcommentheader' => "'''Let op:''' Je hebt geen onderwerp/kop voor deze opmerking opgegeven.
+Als je opnieuw op \"{{int:savearticle}}\" klikt, wordt je wijziging zonder een onderwerp/kop opgeslagen.",
+'blockedtext' => '\'\'\'Je gebruiker of IP-adres is geblokkeerd.\'\'\'
+
+De blokkade is uitgevoerd door $1.
+De opgegeven reden is \'\'$2\'\'.
+
+* Aanvang blokkade: $8
+* Einde blokkade: $6
+* Bedoeld te blokkeren: $7
+
+Je kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.
+Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.
+Je huidige IP-adres is $3 en het blokkadenummer is #$5.
+Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
+'autoblockedtext' => 'Je IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.
+De opgegeven reden is:
+
+:\'\'$2\'\'
+
+* Aanvang blokkade: $8
+* Einde blokkade: $6
+* Bedoeld te blokkeren: $7
+
+Je kunt deze blokkade bespreken met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]].
+
+Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je een geldig e-mailadres hebt opgegeven in je [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet is geblokkeerd.
+
+Je huidige IP-adres is $3 en het blokkadenummer is #$5.
+Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
+'blockededitsource' => "Hieronder staat de tekst van '''je bewerkingen''' aan '''$1''':",
+'whitelistedittext' => "Je moet $1 om pagina's te bewerken.",
+'confirmedittext' => 'Je moet je e-mailadres bevestigen voor je kunt bewerken.
+Voer je e-mailadres in en bevestig het via [[Special:Preferences|je voorkeuren]].',
+'nosuchsectiontext' => 'Je probeerde een subkopje te bewerken dat niet bestaat.
+Wellicht is het verplaatst of verwijderd terwijl je de pagina aan het bekijken was.',
+'loginreqpagetext' => "Je moet je $1 om andere pagina's te kunnen bekijken.",
+'newarticletext' => "Deze pagina bestaat niet.
+Typ in het onderstaande veld om de pagina aan te maken (meer informatie staat op de [[{{MediaWiki:Helppage}}|hulppagina]]).
+Gebruik de knop '''vorige''' in je browser als je hier per ongeluk terecht bent gekomen.",
+'anontalkpagetext' => "----''Deze overlegpagina hoort bij een anonieme gebruiker die hetzij geen gebruikersnaam heeft, hetzij deze niet gebruikt.
+Daarom wordt het IP-adres ter identificatie gebruikt.
+Het is mogelijk dat meerdere personen hetzelfde IP-adres gebruiken.
+Mogelijk ontvang je hier berichten die niet voor je bedoeld zijn.
+Als je dat wilt voorkomen, [[Special:UserLogin/signup|registreer je]] of [[Special:UserLogin|meld je aan]] om verwarring met andere anonieme gebruikers te voorkomen.''",
+'noarticletext' => 'Deze pagina bevat geen tekst.
+Je kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken] of [{{fullurl:{{FULLPAGENAME}}|action=edit}} deze pagina bewerken]</span>.',
+'noarticletext-nopermission' => 'Deze pagina bevat geen tekst.
+Je kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s of
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken]</span>.',
+'userpage-userdoesnotexist' => 'Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "$1").
+Controleer of je deze pagina wel wilt aanmaken/bewerken.',
+'clearyourcache' => "'''Let op! Nadat je de wijzigingen hebt opgeslagen is het wellicht nodig je browsercache te legen.'''
+
+'''Mozilla / Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl je op ''Huidige pagina vernieuwen'' klikt of typ ''Ctrl-F5'' of ''Ctrl-R'' (''Command-R'' op eenMacintosh);
+'''Konqueror: '''klik ''Reload'' of typ ''F5;''
+'''Opera:''' leeg je cache in ''Extra → Voorkeuren;''
+'''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl je op ''Vernieuwen'' klikt of type ''Ctrl-F5.''",
+'usercssyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe CSS te testen alvorens op te slaan.",
+'userjsyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe JavaScript te testen alvorens op te slaan.",
+'usercsspreview' => "'''Dit is alleen een voorvertoning van je persoonlijke CSS.
+Deze is nog niet opgeslagen!'''",
+'userjspreview' => "'''Let op: je test nu je persoonlijke JavaScript.'''
+'''De pagina is niet opgeslagen!'''",
+'userinvalidcssjstitle' => "'''Waarschuwing:''' er is geen skin \"\$1\".
+Let op: je eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
+'previewnote' => "'''Let op: dit is een controlepagina; je tekst is niet opgeslagen!'''",
+'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als je deze opslaat.',
+'session_fail_preview' => "'''Je bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
+Probeer het opnieuw.
+Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan.'''",
+'session_fail_preview_html' => "'''Je bewerking is niet verwerkt, omdat sessiegegevens verloren zijn gegaan.'''
+
+''Omdat in {{SITENAME}} ruwe HTML is ingeschakeld, is een voorvertoning niet mogelijk als bescherming tegen aanvallen met JavaScript.''
+
+'''Als dit een legitieme bewerking is, probeer het dan opnieuw.
+Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan.'''",
+'token_suffix_mismatch' => "'''Je bewerking is geweigerd, omdat je browser de leestekens in het bewerkingstoken onjuist heeft behandeld.
+De bewerking is geweigerd om verminking van de paginatekst te voorkomen.
+Dit gebeurt soms als er een webgebaseerde proxydienst wordt gebruikt die fouten bevat.'''",
+'explainconflict' => "Een andere gebruiker heeft deze pagina bewerkt sinds je met je bewerking bent begonnen.
+In het bovenste deel van het venster staat de tekst van de huidige pagina.
+Je bewerking staat in het onderste gedeelte.
+Je dient je bewerkingen in te voegen in de bestaande tekst.
+'''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als je op \"{{int:savearticle}}\" klikt.",
+'yourtext' => 'Je tekst',
+'nonunicodebrowser' => "'''WAARSCHUWING: Je browser kan niet goed overweg met unicode.
+Hiermee wordt door de MediaWiki-software rekening gehouden zodat je toch zonder problemen pagina's kunt bewerken: niet-ASCII karakters worden in het bewerkingsveld weergegeven als hexadecimale codes.'''",
+'editingold' => "'''WAARSCHUWING!
+Je bewerkt een oude versie van deze pagina.
+Als je je bewerking opslaat, gaan alle wijzigingen die na deze versie gemaakt zijn verloren.'''",
+'copyrightwarning' => "Opgelet: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).
+Als je niet wilt dat je tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor ‘Pagina opslaan’.<br />
+Hierbij beloof je ons tevens dat je deze tekst zelf hebt geschreven of overgenomen uit een vrije, openbare bron.<br />
+'''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAAR TOESTEMMING VOOR HEBT!'''",
+'copyrightwarning2' => "Al je bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.
+Als je niet wilt dat je teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />
+Je belooft ook dat je de oorspronkelijke auteur bent van dit materiaal of dat je het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).
+'''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARVOOR TOESTEMMING HEBT!'''",
+'longpageerror' => "'''FOUT: de tekst die je hebt toegevoegd is $1 kilobyte groot, wat groter is dan het maximum van $2 kilobyte.
+Opslaan is niet mogelijk.'''",
+'readonlywarning' => "'''WAARSCHUWING: De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus je kunt deze nu niet opslaan.
+Het is misschien verstandig om je 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",
+'nocreatetext' => "{{SITENAME}} heeft de mogelijkheid om nieuwe pagina's te maken beperkt.
+Je kunt reeds bestaande pagina's wijzigen of je kunt [[Special:UserLogin|jezelf aanmelden of registreren]].",
+'nocreate-loggedin' => "Je hebt geen rechten om nieuwe pagina's te maken.",
+'permissionserrorstext' => 'Je hebt geen rechten om dit te doen om de volgende {{PLURAL:$1|reden|redenen}}:',
+'permissionserrorstext-withaction' => 'Je hebt geen rechten om $2 om de volgende {{PLURAL:$1|reden|redenen}}:',
+'recreate-moveddeleted-warn' => "'''Waarschuwing: je bent bezig met het aanmaken van een pagina die in het verleden verwijderd is.'''
+
+Overweeg of het terecht is dat je verder werkt aan deze pagina.
+Voor je gemak staan hieronder het verwijderingslogboek en het hernoemingslogboek voor deze pagina:",
+'edit-no-change' => 'Je bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
+
+# Revision deletion
+'rev-deleted-text-unhide' => "Deze versie van de pagina is '''verwijderd'''.
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
+Als beheerder kun je [$1 deze versie bekijken] als je wil.",
+'rev-suppressed-text-unhide' => "Deze paginaversie is '''onderdrukt'''.
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].
+Als beheerder kun je [$1 de verschillen bekijken] als je wil.",
+'rev-deleted-text-view' => "Deze bewerking is '''verwijderd'''.
+Als beheerder kun je deze zien;
+er kunnen details aanwezig zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+'rev-suppressed-text-view' => "Deze paginaversie is '''onderdrukt'''.
+Als beheerder kun je deze bekijken;
+achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].",
+'rev-deleted-no-diff' => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+'rev-suppressed-no-diff' => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.",
+'rev-deleted-unhide-diff' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd is '''verwijderd'''.
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
+Als beheerder kun je [$1 de verschillen bekijken] als je wil.",
+'rev-suppressed-unhide-diff' => "Een van de versies in deze verschillen is '''onderdrukt'''.
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].
+Als beheerder kunt je [$1 deze versie bekijken] als je wil.",
+'rev-deleted-diff-view' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd, is '''verwijderd'''.
+Als beheerder kunt je deze verschillen bekijken. Mogelijk zijn details zichtbaar in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderlogboek].",
+'rev-suppressed-diff-view' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd, is '''onderdrukt'''.
+Als beheerder kun je deze verschillen bekijken. Mogelijk zijn details zichtbaar in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].",
+'revdelete-nooldid-text' => 'Je hebt geen doelversie(s) voor deze handeling opgegeven, de aangegeven versie bestaat niet of je probeert de laatste versie te verbergen.',
+'revdelete-nologtype-text' => 'Je hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
+'revdelete-nologid-text' => 'Je hebt ofwel geen doellogboekregel opgegeven of de aangegeven logboekregel bestaat niet.',
+'revdelete-show-file-confirm' => 'Weet je zeker dat u de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
+'revdelete-confirm' => 'Bevestig dat je dit wilde doen, dat je de consequenties begrijpt en dat je dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].',
+'revdelete-show-no-access' => 'Er is een fout opgetreden bij het weergeven van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
+Je hebt geen toegang tot dit object.',
+'revdelete-modify-no-access' => 'Er is een fout opgetreden bij het wijzigen van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
+Je hebt geen toegang tot dit object.',
+'revdelete-only-restricted' => 'Er is een fout opgetreden bij het verbergen van het item van $1, $2: je kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
+
+# History merging
+'mergehistory-header' => 'Via deze pagina kun je versies van de geschiedenis van een bronpagina naar een nieuwere pagina samenvoegen.
+Zorg dat deze wijziging de geschiedenisdoorlopendheid van de pagina behoudt.',
+
+# Search results
+'searchsubtitle' => 'Je zocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
+'searchsubtitleinvalid' => "Je hebt gezocht naar '''$1'''",
+'search-suggest' => 'Bedoelde je: $1',
+'nonefound' => "'''Opmerking''': standaard worden niet alle naamruimten doorzocht.
+Als je in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
+Je kunt ook een naamruimte als voorvoegsel gebruiken.",
+'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
+Je kunt gebruik maken van Google.
+De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
+
+# Preferences page
+'prefsnologintext' => 'Je moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aangemeld]</span> zijn om je voorkeuren te kunnen instellen.',
+'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor je volglijst aangemaakt.
+Iedereen die deze sleutel kent kan je volglijst lezen, dus kies een veilige sleutel.
+Hier volgt een willekeurig gegenereerde waarde die je kunt gebruiken: $1',
+'savedprefs' => 'Je voorkeuren zijn opgeslagen.',
+'prefs-reset-intro' => 'Gebruik deze functie om je voorkeuren te herstellen naar de standaardinstellingen.
+Deze handeling kan niet ongedaan gemaakt worden.',
+'youremail' => 'Je e-mailadres:',
+'prefs-help-signature' => 'Reacties op de overlegpagina\'s worden meestal ondertekend met "<nowiki>~~~~</nowiki>".
+De tildes worden omgezet in je ondertekening en een datum en tijd van de bewerking.',
+'badsiglength' => 'Uw ondertekening is te lang.
+Deze moet minder dan $1 {{PLURAL:$1|karakters|karakters}} bevatten.',
+'prefs-help-realname' => 'Echte naam is optioneel, als je deze opgeeft kan deze naam gebruikt worden om je erkenning te geven voor uw werk.',
+'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om je jouw wachtwoord te e-mailen als je het bent vergeten.
+Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een verwijzing op je gebruikers- en overlegpagina zonder dat u uw identiteit prijsgeeft.',
+
+# User rights
+'userrights-groups-help' => 'Je kunt de groepen wijzigen waar deze gebruiker lid van is.
+* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.
+* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.
+* Een "*" betekent dat je een gebruiker niet uit een groep kunt verwijderen nadat je die hebt toegevoegd of vice versa.',
+'userrights-no-interwiki' => "Je hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
+'userrights-nologin' => 'Je moet jezelf [[Special:UserLogin|aanmelden]] met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
+'userrights-notallowed' => 'Je hebt geen rechten om gebruikersrechten toe te wijzen.',
+'userrights-changeable-col' => 'Groepen die je kunt beheren',
+'userrights-unchangeable-col' => 'Groepen die je niet kunt beheren',
+
+# Recent changes linked
+'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.
+Pagina's die op [[Special:Watchlist|je volglijst]] staan worden '''vet''' weergegeven.",
+
+# Upload
+'uploadnologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn om bestanden te uploaden.',
+'empty-file' => 'Het bestand dat je probeerde te uploaden had geen inhoud.',
+'file-too-large' => 'Het bestand dat je probeerde te uploaden was te groot.',
+'hookaborted' => 'De wijziging die je probeerde te maken is afgebroken door een uitbreidingshook.',
+'emptyfile' => 'Het bestand dat je hebt geüpload lijkt leeg te zijn.
+Dit zou kunnen komen door een typefout in de bestandsnaam.
+Ga na of je dit bestand werkelijk bedoelde te uploaden.',
+'fileexists' => "Er bestaat al een bestand met deze naam.
+Controleer '''<tt>[[:$1]]</tt>''' als je niet zeker weet of je het huidige bestand wilt overschrijven.
+[[$1|thumb]]",
+'filepageexists' => "De beschrijvingspagina voor dit bestand bestaat al op '''<tt>[[:$1]]</tt>''', maar er bestaat geen bestand met deze naam.
+De samenvatting die je hebt opgegeven zal niet op de beschrijvingspagina verschijnen.
+Bewerk de pagina handmatig om je beschrijving daar weer te geven. [[$1|miniatuur]]",
+'file-thumbnail-no' => "De bestandsnaam begint met '''<tt>$1</tt>'''.
+Het lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.
+Als je deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.
+Wijzig anders de bestandsnaam.",
+'fileexists-forbidden' => 'Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.
+Upload je bestand onder een andere naam.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Er bestaat al een bestand met deze naam bij de gedeelte bestanden.
+Als je het bestand alsnog wilt uploaden, ga dan terug en kies een andere naam.
+[[File:$1|thumb|center|$1]]',
+'file-deleted-duplicate' => 'Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.
+Raadpleeg het verwijderingslogboek voordat je verder gaat.',
+'uploadfromurl-queued' => 'Je upload is in de wachtrij geplaatst.',
+'filewasdeleted' => 'Er is eerder een bestand met deze naam verwijderd.
+Raadpleeg het $1 voordat je het opnieuw toevoegt.',
+'upload-wasdeleted' => "'''Waarschuwing: je bent een bestand dat eerder verwijderd was aan het uploaden.'''
+
+Controleer of het inderdaad je bedoeling is dit bestand te uploaden.
+Het verwijderingslogboek van dit bestand kunt je hier zien:",
+'filename-bad-prefix' => "De naam van het bestand dat je aan het uploaden bent begint met '''\"\$1\"''', wat een niet-beschrijvende naam is die meestal automatisch door een digitale camera wordt gegeven.
+Kies een duidelijke naam voor je bestand.",
+'upload-success-msg' => 'Je upload van [$2] is geslaagd en is beschikbaar: [[:{{ns:file}}:$1]]',
+'upload-failure-msg' => 'Er was een probleem met je upload van [$2]:
+
+$1',
+'upload-warning-msg' => 'Er was een probleem met je upload van [$2].
+Ga terug naar het [[Special:Upload/stash/$1|uploadformulier]] om dit probleem te verhelpen.',
+
+# img_auth script messages
+'img-auth-nopathinfo' => 'PATH_INFO mist.
+Je server is niet ingesteld om deze informatie door te geven.
+Misschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.
+Zie http://www.mediawiki.org/wiki/Manual:Image_Authorization voor meer informatie.',
+'img-auth-nologinnWL' => 'Je bent niet aangemeld en "$1" staat niet op de witte lijst.',
+'img-auth-isdir' => 'Je probeert de map "$1" te benaderen.
+Alleen toegang tot bestanden is toegestaan.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error28-text' => 'Het duurde te lang voordat de website antwoordde.
+Controleer of de website beschikbaar is, wacht even en probeer het dan opnieuw.
+Je kunt het misschien proberen als het minder druk is.',
+
+'upload_source_file' => '(een bestand op je computer)',
+
+# File description page
+'filepage-nofile-link' => 'Er bestaat geen bestand met deze naam, maar je kunt het [$1 uploaden].',
+
+# File reversion
+'filerevert-intro' => "Je bent '''[[Media:$1|$1]]''' aan het terugdraaien tot de [$4 versie op $2, $3].",
+
+# File deletion
+'filedelete-intro' => "Je staat op het punt om het bestand '''[[Media:$1|$1]]''' te verwijderen, inclusief alle eerdere versies.",
+'filedelete-intro-old' => "Je bent de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan het verwijderen.",
+
+# Miscellaneous special pages
+'notargettext' => 'Je hebt niet opgegeven voor welke pagina of gebruiker u deze handeling wilt uitvoeren.',
+'nopagetext' => 'De pagina die je wilt hernoemen bestaat niet.',
+
+# Book sources
+'booksources-text' => 'Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat je zoekt hebben:',
+
+# Special:Log
+'alllogstext' => 'Dit is het gecombineerde logboek van {{SITENAME}}.
+Je kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).',
+
+# E-mail user
+'mailnologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in je [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
+'emailpagetext' => 'Via dit formulier kun je een e-mail aan deze gebruiker verzenden.
+Het e-mailadres dat je hebt opgegeven bij [[Special:Preferences|je voorkeuren]] wordt als afzender gebruikt.
+De ontvanger kan dus direct naar je reageren.',
+'usermaildisabledtext' => 'Je kunt geen e-mail verzenden naar andere gebruikers op deze wiki',
+'emailccsubject' => 'Kopie van je bericht aan $1: $2',
+'emailsenttext' => 'Je e-mail is verzonden.',
+
+# Watchlist
+'nowatchlist' => 'Je volglijst is leeg.',
+'watchlistanontext' => '$1 is noodzakelijk om je volglijst in te zien of te wijzigen.',
+'watchnologintext' => 'Je dient [[Special:UserLogin|aangemeld]] te zijn om je volglijst te bewerken.',
+'addedwatchtext' => "De pagina \"[[:\$1]]\" is toegevoegd aan je [[Special:Watchlist|volglijst]].
+Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden op [[Special:Watchlist|je volglijst]] vermeld en worden '''vet''' weergegeven in de [[Special:RecentChanges|lijst van recente wijzigingen]].",
+'removedwatchtext' => 'De pagina "[[:$1]]" is van [[Special:Watchlist|je volglijst]] verwijderd.',
+'watchnochange' => "Geen van de pagina's op je volglijst is in deze periode bewerkt.",
+'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op je volglijst, exclusief overlegpagina's.",
+'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds je laatste bezoek worden '''vet''' weergegeven",
+'watchlistcontains' => "Er {{PLURAL:$1|staat 1 pagina|staan $1 pagina's}} op je volglijst.",
+
+'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds je laatste bezoek.',
+'enotif_body' => 'Beste $WATCHINGUSERNAME,
+
+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
+Wiki: $PAGEEDITOR_WIKI
+
+Tenzij je deze pagina bezoekt, komen er geen verdere berichten. Op je volglijst kun je voor alle gevolgde pagina\'s de waarschuwingsinstellingen opschonen.
+
+ Groet van je {{SITENAME}} waarschuwingssysteem.
+
+--
+Je kunt je volglijstinstellingen wijzigen op:
+{{fullurl:Special:Watchlist/edit}}
+
+Je kunt de pagina van uw volglijst verwijderen via de volgende verwijzing:
+$UNWATCHURL
+
+Feedback en andere assistentie:
+{{fullurl:{{MediaWiki:Helppage}}}}',
+
+# Delete
+'historywarning' => "'''Waarschuwing:''' de pagina die je wilt verwijderen heeft ongeveer $1 {{PLURAL:$1|versie|versies}}:",
+'confirmdeletetext' => 'Je staat op het punt een pagina te verwijderen, inclusief de geschiedenis.
+Bevestig hieronder dat dit inderdaad je bedoeling is, dat je de gevolgen begrijpt en dat de verwijdering overeenstemt met het [[{{MediaWiki:Policy-url}}|beleid]].',
+
+# Edit tokens
+'sessionfailure' => 'Er lijkt een probleem te zijn met je aanmeldsessie.
+Je handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke "hijacking" van deze sessie).
+Ga een pagina terug, laad die pagina opnieuw en probeer het nog eens.',
+
+# Protect
+'protect-text' => "Hier kun je het beveiligingsniveau voor de pagina '''<nowiki>$1</nowiki>''' bekijken en wijzigen.",
+'protect-locked-blocked' => "Je kunt het beveiligingsniveau niet wijzigen terwijl je geblokkeerd bent.
+Hier zijn de huidige instellingen voor de pagina '''$1''':",
+'protect-locked-access' => "Je hebt geen rechten om het beveiligingsniveau te wijzigen.
+Dit zijn de huidige instellingen voor de pagina '''$1''':",
+'protect-cantedit' => 'Je kunt het beveiligingsniveau van deze pagina niet wijzigen, omdat je geen rechten hebt om het te bewerken.',
+
+# Undelete
+'undeletehistory' => 'Als je een pagina terugplaatst, worden alle versies hersteld.
+Als er al een nieuwe pagina met dezelfde naam is aangemaakt sinds de pagina is verwijderd, worden de eerder verwijderde versies teruggeplaatst en blijft de huidige versie intact.',
+'undeleterevision-missing' => 'Ongeldige of missende versie.
+Mogelijk heb je een verkeerde verwijzing of is de versie hersteld of verwijderd uit het archief.',
+'undelete-show-file-confirm' => 'Weet je zeker dat je een verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wil bekijken?',
+
+# Block/unblock
+'ipb-needreblock' => '== Deze gebruiker is al geblokkeerd ==
+$1 is al geblokkeerd.
+Wil je de instellingen wijzigen?',
+'proxyblockreason' => 'Dit is een automatische preventieve blokkade, omdat je gebruik maakt van een open proxyserver.
+Neem contact op met je Internet-provider of je helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
+'sorbsreason' => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
+'sorbs_create_account_reason' => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
+Je kunt geen gebruiker registreren.',
+'cant-block-while-blocked' => 'Je kunt andere gebruikers niet blokkeren terwijl je zelf geblokkeerd bent.',
+'cant-see-hidden-user' => "De gebruiker die je probeert te blokken is al geblokkeerd en verborgen.
+Omdat je het recht 'hideuser' niet hebt, kun je de blokkade van de gebruiker niet bekijken of bewerken.",
+'ipbblocked' => 'Je kunt geen andere gebruikers (de)blokkeren, omdat je zelf geblokkeerd bent',
+'ipbnounblockself' => 'Je mag jezelf niet deblokkeren',
+
+# Developer tools
+'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.
+
+Bevestig dat je deze handeling wilt uitvoeren en dat je 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.
+
+Bevestig dat je deze handeling wil uitvoeren.",
+'locknoconfirm' => 'Je hebt je keuze niet bevestigd via het vinkvakje.',
+'lockdbsuccesstext' => 'De database is afgesloten.<br />
+Vergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra je klaar bent met je onderhoud.',
+
+# Move page
+'movepagetext' => "Door middel van het onderstaande formulier kun je een pagina hernoemen.
+De geschiedenis gaat mee naar de nieuwe pagina.
+* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.
+* Verwijzingen naar de oude pagina worden niet aangepast.
+* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.
+Als je dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.
+
+Een pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.
+
+'''WAARSCHUWING!'''
+Voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.
+Zorg ervoor dat je die gevolgen overziet voordat je deze handeling uitvoert.",
+'movepagetalktext' => "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':
+* De overlegpagina onder de nieuwe naam al bestaat;
+* Je het onderstaande vinkje deselecteert.",
+'moveuserpage-warning' => "'''Waarschuwing:''' Je gaat een gebruikerspagina hernoemen.
+Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
+'movenologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.',
+'movenotallowed' => "Je hebt geen rechten om pagina's te hernoemen.",
+'movenotallowedfile' => 'Je hebt geen rechten om bestanden te hernoemen.',
+'cant-move-user-page' => "Je hebt geen rechten om gebruikerspagina's te hernoemen (met uitzondering van subpagina's).",
+'cant-move-to-user-page' => 'Je hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.',
+'cantmove-titleprotected' => 'Je kunt geen pagina naar deze paginaam hernoemen, omdat deze paginanaam beveiligd is tegen het aanmaken ervan.',
+'delete_and_move_text' => '==Verwijdering nodig==
+Onder de naam "[[:$1]]" bestaat al een pagina.
+Wil je deze verwijderen om plaats te maken voor de te hernoemen pagina?',
+
+# Export
+'exporttext' => 'Je kunt de tekst en geschiedenis van een pagina of pagina\'s exporteren naar XML.
+Dit exportbestand is daarna te importeren in een andere MediaWiki via de [[Special:Import|importpagina]].
+
+Geef in het onderstaande veld de namen van de te exporteren pagina\'s op, één pagina per regel, en geef aan of je alle versies met de bewerkingssamenvatting of alleen de huidige versies met de bewerkingssamenvatting wilt exporteren.
+
+In het laatste geval kun je ook een verwijzing gebruiken, bijvoorbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] voor de pagina "[[{{MediaWiki:Mainpage}}]]".',
+
+# Namespace 8 related
+'allmessagestext' => 'Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.
+Ga naar [http://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [http://translatewiki.net translatewiki.net] als je wilt bijdragen aan de algemene vertaling voor MediaWiki.',
+
+# Special:Import
+'importtext' => 'Gebruik de [[Special:Export|exportfunctie]] in de wiki waar de informatie vandaan komt, sla de uitvoer op je eigen systeem op, en voeg die daarna hier toe.',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Jouw gebruikerspagina',
+'tooltip-pt-anonuserpage' => 'Gebruikerspagina voor je IP-adres',
+'tooltip-pt-mytalk' => 'Jouw overlegpagina',
+'tooltip-pt-watchlist' => "Overzicht van pagina's die je volgt",
+'tooltip-pt-mycontris' => 'Overzicht van je bijdragen',
+'tooltip-pt-login' => 'Je wordt van harte uitgenodigd om je aan te melden als gebruiker, maar dit is niet verplicht',
+'tooltip-pt-anonlogin' => 'Je wordt van harte uitgenodigd om je aan te melden als gebruiker, maar dit is niet verplicht',
+'tooltip-ca-edit' => 'Je kunt deze pagina bewerken.
+Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
+'tooltip-ca-viewsource' => 'Deze pagina is beveiligd.
+Je kunt wel de broncode bekijken.',
+'tooltip-ca-nstab-special' => 'Dit is een speciale pagina, je kunt de pagina zelf niet bewerken',
+'tooltip-save' => 'Je wijzigingen opslaan',
+'tooltip-watch' => 'Deze pagina aan je volglijst toevoegen',
+
+# Metadata
+'notacceptable' => 'De wikiserver kan de gegevens niet leveren in een vorm die je browser kan lezen.',
+
+# Spam protection
+'spamprotectiontext' => 'De pagina die je wilde opslaan is geblokkeerd door het spamfilter.
+Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
+
+# Patrolling
+'markedaspatrollederror-noautopatrol' => 'Je kunt je eigen wijzigingen niet als gecontroleerd markeren.',
+
+# Media information
+'mediawarning' => "'''Waarschuwing''': dit bestandstype bevat mogelijk programmacode die je systeem schade kan berokkenen.",
+
+# E-mail address confirmation
+'confirmemail_noemail' => 'Je hebt geen geldig e-mailadres ingegeven in je [[Special:Preferences|gebruikersvoorkeuren]].',
+'confirmemail_text' => '{{SITENAME}} eist bevestiging van je e-mailadres voordat je de e-mailmogelijkheden kunt gebruiken.
+Klik op de onderstaande knop om een bevestigingsbericht te ontvangen.
+Dit bericht bevat een verwijzing met een code.
+Open die verwijzing om je e-mailadres te bevestigen.',
+'confirmemail_pending' => 'Er is al een bevestigingsbericht aan je verzonden.
+Als je recentelijk je gebruiker hebt aangemaakt, wacht dan een paar minuten totdat die aankomt voordat je opnieuw een e-mail laat sturen.',
+'confirmemail_oncreate' => 'Er is een bevestigingscode naar je e-mailadres verzonden.
+Deze code is niet nodig om je aan te melden, maar je dient deze wel te bevestigen voordat je de e-mailmogelijkheden van deze wiki kunt gebruiken.',
+'confirmemail_sendfailed' => '{{SITENAME}} kon je bevestigingscode niet verzenden.
+Controleer je e-mailadres op ongeldige tekens.
+
+Het e-mailprogramma meldde: $1',
+'confirmemail_needlogin' => 'Je moet $1 om je e-mailadres te bevestigen.',
+'confirmemail_success' => 'Je e-mailadres is bevestigd.
+Je kunt jezelf nu [[Special:UserLogin|aanmelden]] en {{SITENAME}} gebruiken.',
+'confirmemail_loggedin' => 'Je e-mailadres is nu bevestigd.',
+'confirmemail_error' => 'Er is iets verkeerd gegaan tijdens het opslaan van je bevestiging.',
+'confirmemail_body' => 'Iemand, waarschijnlijk jijzelf, met het IP-adres $1,
+heeft zich met dit e-mailadres geregistreerd als gebruiker "$2" op {{SITENAME}}.
+
+Open de volgende verwijzing in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:
+
+$3
+
+Als je jezelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van je e-mailadres te annuleren:
+
+$5
+
+De bevestigingscode vervalt op $4.',
+'confirmemail_body_changed' => 'Iemand, waarschijnlijk jijzelf, met het IP-adres $1,
+heeft het het e-mailadres geregistreerd voor gebruiker "$2" op {{SITENAME}} gewijzigd naar dit e-mailadres.
+
+Open de volgende verwijzing in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
+
+$3
+
+Als je jezelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van je e-mailadres te annuleren:
+
+$5
+
+De bevestigingscode vervalt op $4.',
+
+# Delete conflict
+'deletedwhileediting' => "'''Let op''': deze pagina is verwijderd terwijl je bezig was met je bewerking!",
+'confirmrecreate' => "Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:
+: ''$2''
+Bevestig dat je de pagina opnieuw wilt aanmaken.",
+
+# Watchlist editor
+'watchlistedit-numitems' => 'Je volglijst bevat {{PLURAL:$1|1 pagina|$1 pagina’s}}, zonder overlegpagina’s.',
+'watchlistedit-noitems' => 'Je volglijst bevat geen pagina’s.',
+'watchlistedit-normal-explain' => 'Hieronder worden de pagina’s op je volglijst weergegeven.
+Klik op het vierkantje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
+Je kunt ook de [[Special:Watchlist/raw|ruwe lijst bewerken]].',
+'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd van je volglijst:',
+'watchlistedit-raw-explain' => 'Hieronder staan pagina’s op je volglijst.
+Je kunt de lijst bewerken door pagina’s te verwijderen en toe te voegen.
+Eén pagina per regel.
+Als je klaar bent, klik dan op "{{int:Watchlistedit-raw-submit}}".
+Je kunt ook [[Special:Watchlist/edit|het standaard bewerkingsscherm gebruiken]].',
+'watchlistedit-raw-done' => 'Jr volglijst is bijgewerkt.',
+
+# Special:Version
+'version-license-info' => 'MediaWiki is vrije software; je kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - zo je wilt - enige latere versie.
+
+MediaWiki wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANTIE; zonder zelfs de implicitiete garantie van VERKOOPBAARHEID of GESCHIKHEID VOOR ENIG DOEL IN HET BIJZONDER. Zie de GNU General Public License voor meer informatie.
+
+Samen met dit programma hoor je een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de GNU General Public License] te hebben ontvangen; zo niet, schrijf dan naar de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA of [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lees de licentie online].',
+
+# Database error messages
+'dberr-usegoogle' => 'Wellicht kun je in de tussentijd zoeken via Google.',
+
+# HTML forms
+'htmlform-float-invalid' => 'De waarde die je hebt opgegeven is geen getal.',
+
+);
diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php
index 02251fbf..2a2581e9 100644
--- a/languages/messages/MessagesNn.php
+++ b/languages/messages/MessagesNn.php
@@ -96,6 +96,7 @@ $bookstoreList = array(
$magicWords = array(
'redirect' => array( '0', '#omdiriger', '#REDIRECT' ),
'notoc' => array( '0', '__INGAINNHALDSLISTE__', '__INGENINNHOLDSLISTE__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__INKJEGALLERI__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__ALLTIDINNHALDSLISTE__', '__ALLTIDINNHOLDSLISTE__', '__FORCETOC__' ),
'toc' => array( '0', '__INNHALDSLISTE__', '__INNHOLDSLISTE__', '__TOC__' ),
'noeditsection' => array( '0', '__INGABOLKENDRING__', '__INGABOLKREDIGERING__', '__INGENDELENDRING__', '__NOEDITSECTION__' ),
@@ -118,6 +119,9 @@ $magicWords = array(
'pagenamee' => array( '1', 'SIDENAMNE', 'SIDENAVNE', 'PAGENAMEE' ),
'namespace' => array( '1', 'NAMNEROM', 'NAVNEROM', 'NAMESPACE' ),
'fullpagename' => array( '1', 'FULLTSIDENAMN', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'UNDERSIDENAMN', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'HOVUDSIDENAMN', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'DISKUSJONSSIDENAMN', 'TALKPAGENAME' ),
'subst' => array( '0', 'LIMINN:', 'SUBST:' ),
'msgnw' => array( '0', 'IKWIKMELD:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'mini', 'miniatyr', 'thumbnail', 'thumb' ),
@@ -128,6 +132,7 @@ $magicWords = array(
'img_width' => array( '1', '$1pk', '$1px' ),
'img_center' => array( '1', 'sentrum', 'center', 'centre' ),
'img_framed' => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
+ 'img_link' => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
'sitename' => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
'localurl' => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
@@ -140,8 +145,16 @@ $magicWords = array(
'currentweek' => array( '1', 'VEKENRNO', 'UKENRNÃ…', 'CURRENTWEEK' ),
'currentdow' => array( '1', 'VEKEDAGNRNO', 'UKEDAGNRNÃ…', 'CURRENTDOW' ),
'revisionid' => array( '1', 'VERSJONSID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'VERSJONSDAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'VERSJONSDAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'VERSJONSMÃ…NAD', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'VERSJONSMÃ…NAD1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'VERSJONSÃ…R', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VERSJONSTIDSTEMPEL', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'VERSJONSBRUKAR', 'REVISIONUSER' ),
'plural' => array( '0', 'FLEIRTAL:', 'PLURAL:' ),
'currentversion' => array( '1', 'VERSJONNO', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#SPRÃ…K:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'INNHALDSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
'pagesinnamespace' => array( '1', 'SIDERINAMNEROM', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
'numberofadmins' => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
@@ -171,92 +184,92 @@ $namespaceNames = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Doble omdirigeringar' ),
+ 'DoubleRedirects' => array( 'Doble_omdirigeringar' ),
'BrokenRedirects' => array( 'Blindvegsomdirigeringar' ),
'Disambiguations' => array( 'Fleirtydingssider' ),
- 'Userlogin' => array( 'Logg inn' ),
- 'Userlogout' => array( 'Logg ut' ),
- 'CreateAccount' => array( 'Opprett konto' ),
+ 'Userlogin' => array( 'Logg_inn' ),
+ 'Userlogout' => array( 'Logg_ut' ),
+ 'CreateAccount' => array( 'Opprett_konto' ),
'Preferences' => array( 'Innstillingar' ),
'Watchlist' => array( 'Overvakingsliste' ),
- 'Recentchanges' => array( 'Siste endringar' ),
- 'Upload' => array( 'Last opp' ),
+ 'Recentchanges' => array( 'Siste_endringar' ),
+ 'Upload' => array( 'Last_opp' ),
'Listfiles' => array( 'Filliste' ),
- 'Newimages' => array( 'Nye filer' ),
+ 'Newimages' => array( 'Nye_filer' ),
'Listusers' => array( 'Brukarliste' ),
'Listgrouprights' => array( 'Grupperettar' ),
'Statistics' => array( 'Statistikk' ),
- 'Randompage' => array( 'Tilfeldig side' ),
- 'Lonelypages' => array( 'Foreldrelause sider' ),
- 'Uncategorizedpages' => array( 'Ukategoriserte sider' ),
- 'Uncategorizedcategories' => array( 'Ukategoriserte kategoriar' ),
- 'Uncategorizedimages' => array( 'Ukategoriserte filer' ),
- 'Uncategorizedtemplates' => array( 'Ukategoriserte malar' ),
- 'Unusedcategories' => array( 'Ubrukte kategoriar' ),
- 'Unusedimages' => array( 'Ubrukte filer' ),
- 'Wantedpages' => array( 'Etterspurde sider' ),
- 'Wantedcategories' => array( 'Etterspurde kategoriar' ),
- 'Wantedfiles' => array( 'Etterspurde filer' ),
- 'Wantedtemplates' => array( 'Etterspurde malar' ),
- 'Mostlinked' => array( 'Mest lenka sider' ),
- 'Mostlinkedcategories' => array( 'Mest brukte kategoriar' ),
- 'Mostlinkedtemplates' => array( 'Mest brukte malar' ),
- 'Mostimages' => array( 'Mest brukte filer' ),
- 'Mostcategories' => array( 'Flest kategoriar' ),
- 'Mostrevisions' => array( 'Flest endringar' ),
- 'Fewestrevisions' => array( 'Færrast endringar' ),
- 'Shortpages' => array( 'Korte sider' ),
- 'Longpages' => array( 'Lange sider' ),
- 'Newpages' => array( 'Nye sider' ),
- 'Ancientpages' => array( 'Gamle sider' ),
+ 'Randompage' => array( 'Tilfeldig_side' ),
+ 'Lonelypages' => array( 'Foreldrelause_sider' ),
+ 'Uncategorizedpages' => array( 'Ukategoriserte_sider' ),
+ 'Uncategorizedcategories' => array( 'Ukategoriserte_kategoriar' ),
+ 'Uncategorizedimages' => array( 'Ukategoriserte_filer' ),
+ 'Uncategorizedtemplates' => array( 'Ukategoriserte_malar' ),
+ 'Unusedcategories' => array( 'Ubrukte_kategoriar' ),
+ 'Unusedimages' => array( 'Ubrukte_filer' ),
+ 'Wantedpages' => array( 'Etterspurde_sider' ),
+ 'Wantedcategories' => array( 'Etterspurde_kategoriar' ),
+ 'Wantedfiles' => array( 'Etterspurde_filer' ),
+ 'Wantedtemplates' => array( 'Etterspurde_malar' ),
+ 'Mostlinked' => array( 'Mest_lenka_sider' ),
+ 'Mostlinkedcategories' => array( 'Mest_brukte_kategoriar' ),
+ 'Mostlinkedtemplates' => array( 'Mest_brukte_malar' ),
+ 'Mostimages' => array( 'Mest_brukte_filer' ),
+ 'Mostcategories' => array( 'Flest_kategoriar' ),
+ 'Mostrevisions' => array( 'Flest_endringar' ),
+ 'Fewestrevisions' => array( 'Færrast_endringar' ),
+ 'Shortpages' => array( 'Korte_sider' ),
+ 'Longpages' => array( 'Lange_sider' ),
+ 'Newpages' => array( 'Nye_sider' ),
+ 'Ancientpages' => array( 'Gamle_sider' ),
'Deadendpages' => array( 'Blindvegsider' ),
- 'Protectedpages' => array( 'Verna sider' ),
- 'Protectedtitles' => array( 'Verna sidenamn' ),
- 'Allpages' => array( 'Alle sider' ),
+ 'Protectedpages' => array( 'Verna_sider' ),
+ 'Protectedtitles' => array( 'Verna_sidenamn' ),
+ 'Allpages' => array( 'Alle_sider' ),
'Prefixindex' => array( 'Prefiksindeks' ),
'Ipblocklist' => array( 'Blokkeringsliste' ),
'Specialpages' => array( 'Spesialsider' ),
'Contributions' => array( 'Bidrag' ),
'Emailuser' => array( 'E-post' ),
- 'Confirmemail' => array( 'Stadfest e-postadresse' ),
- 'Whatlinkshere' => array( 'Lenkjer hit' ),
- 'Recentchangeslinked' => array( 'Relaterte endringar' ),
- 'Movepage' => array( 'Flytt side' ),
- 'Blockme' => array( 'Blokker meg' ),
+ 'Confirmemail' => array( 'Stadfest_e-postadresse' ),
+ 'Whatlinkshere' => array( 'Lenkjer_hit' ),
+ 'Recentchangeslinked' => array( 'Relaterte_endringar' ),
+ 'Movepage' => array( 'Flytt_side' ),
+ 'Blockme' => array( 'Blokker_meg' ),
'Booksources' => array( 'Bokkjelder' ),
'Categories' => array( 'Kategoriar' ),
'Export' => array( 'Eksport' ),
'Version' => array( 'Versjon' ),
- 'Allmessages' => array( 'Alle systemmeldingar' ),
+ 'Allmessages' => array( 'Alle_systemmeldingar' ),
'Log' => array( 'Logg', 'Loggar' ),
'Blockip' => array( 'Blokker' ),
'Undelete' => array( 'Attopprett' ),
'Import' => array( 'Importer' ),
- 'Lockdb' => array( 'LÃ¥s database' ),
- 'Unlockdb' => array( 'Opne database' ),
+ 'Lockdb' => array( 'LÃ¥s_database' ),
+ 'Unlockdb' => array( 'Opne_database' ),
'Userrights' => array( 'Brukarrettar' ),
'MIMEsearch' => array( 'MIME-søk' ),
'FileDuplicateSearch' => array( 'Filduplikatsøk' ),
- 'Unwatchedpages' => array( 'Uovervaka sider' ),
+ 'Unwatchedpages' => array( 'Uovervaka_sider' ),
'Listredirects' => array( 'Omdirigeringsliste' ),
'Revisiondelete' => array( 'Versjonssletting' ),
- 'Unusedtemplates' => array( 'Ubrukte malar' ),
- 'Randomredirect' => array( 'Tilfeldig omdirigering' ),
- 'Mypage' => array( 'Sida mi' ),
- 'Mytalk' => array( 'Diskusjonssida mi' ),
- 'Mycontributions' => array( 'Bidraga mine' ),
+ 'Unusedtemplates' => array( 'Ubrukte_malar' ),
+ 'Randomredirect' => array( 'Tilfeldig_omdirigering' ),
+ 'Mypage' => array( 'Sida_mi' ),
+ 'Mytalk' => array( 'Diskusjonssida_mi' ),
+ 'Mycontributions' => array( 'Bidraga_mine' ),
'Listadmins' => array( 'Administratorliste', 'Administratorar' ),
'Listbots' => array( 'Bottliste', 'Bottar' ),
- 'Popularpages' => array( 'Populære sider' ),
+ 'Popularpages' => array( 'Populære_sider' ),
'Search' => array( 'Søk' ),
- 'Resetpass' => array( 'Nullstill passord' ),
- 'Withoutinterwiki' => array( 'Utan interwiki' ),
+ 'Resetpass' => array( 'Nullstill_passord' ),
+ 'Withoutinterwiki' => array( 'Utan_interwiki' ),
'MergeHistory' => array( 'Flettehistorie' ),
'Filepath' => array( 'Filsti' ),
- 'Invalidateemail' => array( 'Gjer e-post ugyldig' ),
- 'Blankpage' => array( 'Tom side' ),
+ 'Invalidateemail' => array( 'Gjer_e-post_ugyldig' ),
+ 'Blankpage' => array( 'Tom_side' ),
'LinkSearch' => array( 'Lenkjesøk' ),
- 'DeletedContributions' => array( 'Sletta brukarbidrag' ),
+ 'DeletedContributions' => array( 'Sletta_brukarbidrag' ),
'Tags' => array( 'Merke' ),
);
@@ -282,8 +295,7 @@ $messages = array(
'tog-editsection' => 'Endre avsnitt ved hjelp av [endre]-lenkje',
'tog-editsectiononrightclick' => 'Endre avsnitt ved å høgreklikke på avsnittsoverskrift (JavaScript)',
'tog-showtoc' => 'Vis innhaldsliste (for sider med meir enn tre bolkar)',
-'tog-rememberpassword' => 'Hugs passordet til neste gong',
-'tog-editwidth' => 'Utvid endringsboksen til full skjermbreidd',
+'tog-rememberpassword' => 'Hugs innlogginga mi med denne nettlesaren (for høgst {{PLURAL:$1|éin dag|$1 dagar}})',
'tog-watchcreations' => 'Legg til sidene eg opprettar på overvakingslista mi',
'tog-watchdefault' => 'Legg til sidene eg endrar på overvakingslista mi',
'tog-watchmoves' => 'Legg til sidene eg flyttar på overvakingslista mi',
@@ -385,7 +397,7 @@ $messages = array(
'category_header' => 'Artiklar i kategorien «$1»',
'subcategories' => 'Underkategoriar',
'category-media-header' => 'Media i kategorien «$1»',
-'category-empty' => "''Denne kategorien inneheld for tida ingen sider eller mediefiler.''",
+'category-empty' => "''Kategorien inneheld for tida ingen sider eller mediefiler.''",
'hidden-categories' => '{{PLURAL:$1|Gøymd kategori|Gøymde kategoriar}}',
'hidden-category-category' => 'Gøymde kategoriar',
'category-subcat-count' => 'Kategorien har {{PLURAL:$2|berre den følgjande underkategorien|{{PLURAL:$1|den følgjande underkategorien|dei følgjande $1 underkategoriane}}, av totalt $2}}.',
@@ -430,31 +442,21 @@ $messages = array(
'faqpage' => 'Project:OSS',
# Vector skin
-'vector-action-addsection' => 'Nytt emne',
-'vector-action-delete' => 'Slett',
-'vector-action-move' => 'Flytt',
-'vector-action-protect' => 'Vern',
-'vector-action-undelete' => 'Gjenopprett',
-'vector-action-unprotect' => 'Opphev vern',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Hjelpeside',
-'vector-namespace-image' => 'Fil',
-'vector-namespace-main' => 'Side',
-'vector-namespace-media' => 'Mediaside',
-'vector-namespace-mediawiki' => 'Melding',
-'vector-namespace-project' => 'Prosjektside',
-'vector-namespace-special' => 'Spesialside',
-'vector-namespace-talk' => 'Diskusjon',
-'vector-namespace-template' => 'Mal',
-'vector-namespace-user' => 'Brukarside',
-'vector-view-create' => 'Opprett',
-'vector-view-edit' => 'Endre',
-'vector-view-history' => 'Sjå historikken',
-'vector-view-view' => 'Les',
-'vector-view-viewsource' => 'Sjå kjelda',
-'actions' => 'Handlingar',
-'namespaces' => 'Namnerom',
-'variants' => 'Variantar',
+'vector-action-addsection' => 'Nytt emne',
+'vector-action-delete' => 'Slett',
+'vector-action-move' => 'Flytt',
+'vector-action-protect' => 'Vern',
+'vector-action-undelete' => 'Gjenopprett',
+'vector-action-unprotect' => 'Opphev vern',
+'vector-simplesearch-preference' => 'Slå på betra søkjeframlegg (einast i Vector-drakta)',
+'vector-view-create' => 'Opprett',
+'vector-view-edit' => 'Endre',
+'vector-view-history' => 'Sjå historikken',
+'vector-view-view' => 'Les',
+'vector-view-viewsource' => 'Sjå kjelda',
+'actions' => 'Handlingar',
+'namespaces' => 'Namnerom',
+'variants' => 'Variantar',
'errorpagetitle' => 'Feil',
'returnto' => 'Attende til $1.',
@@ -515,6 +517,9 @@ For mange brukarar prøver å sjå denne sida.
Vent ei lita stund, før du prøver å sjå på sida.
$1',
+'pool-timeout' => 'Tidsavbrot under venting på låsing.',
+'pool-queuefull' => 'Køen er full.',
+'pool-errorunknown' => 'Ukjend feil',
# 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' => 'Om {{SITENAME}}',
@@ -666,7 +671,8 @@ Hugs at du kan endre på [[Special:Preferences|innstillingane]] dine.',
'yourname' => 'Brukarnamn:',
'yourpassword' => 'Passord:',
'yourpasswordagain' => 'Skriv opp att passordet',
-'remembermypassword' => 'Hugs passordet.',
+'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (i høgst {{PLURAL:$1|éin dag|$1 dagar}})',
+'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
'yourdomainname' => 'Domenet ditt',
'externaldberror' => 'Det var anten ein ekstern databasefeil i tilgjengekontrollen, eller du har ikkje løyve til å oppdatere den eksterne kontoen din.',
'login' => 'Logg inn',
@@ -683,6 +689,7 @@ Hugs at du kan endre på [[Special:Preferences|innstillingane]] dine.',
'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
'gotaccountlink' => 'Logg inn',
'createaccountmail' => 'over e-post',
+'createaccountreason' => 'Ã…rsak:',
'badretype' => 'Passorda du skreiv inn er ikkje like.',
'userexists' => 'Brukarnamnet er alt i bruk. Vel eit anna.',
'loginerror' => 'Innloggingsfeil',
@@ -703,6 +710,7 @@ Brukarnamn skil mellom stor og liten bokstav. Sjekk at du har skrive brukarnamet
'wrongpasswordempty' => 'Du oppgav ikkje noko passord. Ver venleg og prøv igjen.',
'passwordtooshort' => 'Passord må innehalda minst {{PLURAL:$1|eitt teikn|$1 teikn}}.',
'password-name-match' => 'Passordet ditt lyt vera noko anna enn brukarnamnet ditt.',
+'password-login-forbidden' => 'Bruk av dette brukarnamnet og passordet er vorte forbode.',
'mailmypassword' => 'Send nytt passord',
'passwordremindertitle' => 'Nytt passord til {{SITENAME}}',
'passwordremindertext' => 'Nokon (truleg du, frå IP-adressa $1) bad oss sende deg eit nytt passord til {{SITENAME}} ($4). Eit mellombels passord for «$2» er oppretta, og er sett til «$3». Om det var det du ville, må du logge inn
@@ -735,6 +743,9 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
'loginlanguagelabel' => 'Språk: $1',
'suspicious-userlogout' => 'Førespurnaden din om å logge ut vart nekta fordi han såg ut til å vere sendt av ein øydelagt nettlesar eller mellomtenar.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ukjend feil i PHPs mail()-funksjon',
+
# Password reset dialog
'resetpass' => 'Endra passord',
'resetpass_announce' => 'Du logga inn med eit mellombels passord du fekk på e-post. For å fullføre innlogginga må du lage eit nytt passord her:',
@@ -786,9 +797,11 @@ Du kan allereie ha byta passordet, eller ha bede om å få eit nytt mellombels p
'showlivepreview' => 'Levande førehandsvising',
'showdiff' => 'Vis skilnad',
'anoneditwarning' => "'''Ã…tvaring:''' Du er ikkje innlogga. IP-adressa di vert lagra i historikken for denne sida.",
+'anonpreviewwarning' => "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta førd opp i endringshistorikken til denne sida.''",
'missingsummary' => "'''Påminning:''' Du har ikkje skrive noko endringssamandrag. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
'missingcommenttext' => 'Ver venleg og skriv ein kommentar nedanfor.',
-'missingcommentheader' => "'''Påminning:''' Du har ikkje oppgjeve noko emne/overskrift for denne kommentaren. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
+'missingcommentheader' => "'''PÃ¥minning:''' Du har ikkje oppgjeve noko emne/overskrift for denne kommentaren.
+Dersom du trykkjer «{{int:savearticle}}» ein gong til, vert endringa di lagra utan.",
'summary-preview' => 'Førehandsvising av endringssamandraget:',
'subject-preview' => 'Førehandsvising av emne/overskrift:',
'blockedtitle' => 'Brukaren er blokkert',
@@ -854,7 +867,11 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
'userjsyoucanpreview' => "''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste den nye CSS- eller JavaScript-koden din før du lagrar.",
'usercsspreview' => "'''Hugs at dette berre er ei førehandsvising av din eigen CSS og at han ikkje er lagra enno!'''",
'userjspreview' => "'''Hugs at du berre testar ditt eige JavaScript, det har ikkje vorte lagra enno!!'''",
-'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/monobook.css, og ikkje {{ns:user}}:Døme/Monobook.css.",
+'sitecsspreview' => "'''Hugs at du berre førehandsviser dette stilarket. '''
+'''Det er ikkje lagra enno!'''",
+'sitejspreview' => "'''Hugs at du berre førehandsviser denne JavaScript-koden.'''
+'''Han er ikkje lagra enno!'''",
+'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!'''",
@@ -890,7 +907,6 @@ Teksten må du ha skrive sjølv, eller kopiert frå ein ressurs som er kompatibe
Teksten må du ha skrive sjølv eller ha kopiert frå ein ressurs som er kompatibel med vilkåra eller ikkje verna av opphavsrett (sjå $1 for detaljar).
'''LEGG ALDRI INN MATERIALE SOM ANDRE HAR OPPHAVSRETT TIL UTAN LØYVE FRÅ DEI!'''",
-'longpagewarning' => "'''ÅTVARING: Denne sida er $1 kB lang; nokre nettlesarar kan ha problem med å handsama endringar av sider som nærmar seg eller er lengre enn 32 kB. Du bør vurdere å dele opp sida i mindre bolkar.'''<br />",
'longpageerror' => "'''Feil: Teksten du har prøvd å lagre er $1 kilobyte
lang, altså lenger enn $2 kilobyte som er maksimum. Han kan difor ikkje lagrast.'''",
'readonlywarning' => "'''ÅTVARING: Databasen er skriveverna på grunn av vedlikehald, så du kan ikkje lagre endringane dine akkurat no. Det kan vera lurt å kopiere teksten din til ei tekstfil, så du kan lagre han her seinare.'''
@@ -989,7 +1005,7 @@ Grunnen som vart gjeven av $3 er ''$2''",
'history-feed-empty' => 'Den etterspurde sida finst ikkje. Ho kan vere sletta frå wikien, eller vere flytta. Prøv å [[Special:Search|søke på wikien]] for relevante nye sider.',
# Revision deletion
-'rev-deleted-comment' => '(samandraget er fjerna)',
+'rev-deleted-comment' => '(endringssamandrag fjerna)',
'rev-deleted-user' => '(brukarnamnet er fjerna)',
'rev-deleted-event' => '(fjerna loggoppføring)',
'rev-deleted-user-contribs' => 'brukarnamn eller IP-adresse er fjerna - endringa er skjult i bidraga',
@@ -1061,6 +1077,8 @@ $1",
'logdelete-failure' => "'''Korleis loggen skal vera synleg kunne ikkje verta stilt inn:'''
$1",
'revdel-restore' => 'endra synlegheita',
+'revdel-restore-deleted' => 'sletta versjonar',
+'revdel-restore-visible' => 'synlege versjonar',
'pagehist' => 'Sidehistorikk',
'deletedhist' => 'Sletta historikk',
'revdelete-content' => 'innhald',
@@ -1129,11 +1147,13 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
# Diffs
'history-title' => 'Historikken til «$1»',
'difference' => '(Skilnad mellom versjonar)',
+'difference-multipage' => '(Skilnad mellom sider)',
'lineno' => 'Line $1:',
'compareselectedversions' => 'Samanlikn valde versjonar',
'showhideselectedversions' => 'Syn/skjul valde versjonar',
'editundo' => 'angre',
-'diff-multi' => '({{PLURAL:$1|Éin versjon mellom desse er ikkje vist|$1 versjonar mellom desse er ikkje viste}}.)',
+'diff-multi' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} frå {{PLURAL:$2|éin brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
# Search results
'searchresults' => 'Søkjeresultat',
@@ -1168,6 +1188,7 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
'searchprofile-everything-tooltip' => 'Søk i alt innhald (inkludert diskusjonssider)',
'searchprofile-advanced-tooltip' => 'Søk i visse namnerom',
'search-result-size' => '$1 ({{PLURAL:$2|eitt|$2}} ord)',
+'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategoriar}}, {{PLURAL:$3|1 fil|$3 filer}})',
'search-result-score' => 'Relevans: $1&nbsp;%',
'search-redirect' => '(omdirigering $1)',
'search-section' => '(bolken $1)',
@@ -1245,6 +1266,7 @@ Ver merksam på at registra deira kan vera utdaterte.',
'contextlines' => 'Liner per resultat',
'contextchars' => 'Teikn per line i resultatet',
'stub-threshold' => 'Grense (i byte) for at frø/spirer skal formaterast <a href="#" class="stub">slik</a>:',
+'stub-threshold-disabled' => 'Deaktivert',
'recentchangesdays' => 'Tal på dagar som viser på siste endringar:',
'recentchangesdays-max' => '(høgst $1 {{PLURAL:$1|dag|dagar}})',
'recentchangescount' => 'Tal på endringar som viser som standard:',
@@ -1278,6 +1300,7 @@ Her er det framlegg til eit tal som kan nyttast, tilfelleleg henta fram: $1',
'prefs-files' => 'Filer',
'prefs-custom-css' => 'Eigendefinert CSS',
'prefs-custom-js' => 'Eigendefinert JavaScript',
+'prefs-common-css-js' => 'Delt CSS/JavaScript for alle draktene:',
'prefs-reset-intro' => 'Du kan nytta denne sida til å tilbakestilla innstillingane dine til standardinnstillingane.
Dette kan ikke tilbakestillast.',
'prefs-emailconfirm-label' => 'Stadfesting av e-post:',
@@ -1314,9 +1337,15 @@ Du kan òg velje å la andre brukarar kontakte deg på e-post via brukarsida di
'prefs-advancedrendering' => 'Avanserte val',
'prefs-advancedsearchoptions' => 'Avanserte val',
'prefs-advancedwatchlist' => 'Avanserte val',
-'prefs-display' => 'Val for vising',
+'prefs-displayrc' => 'Val for vising',
+'prefs-displaysearchoptions' => 'Val for vising',
+'prefs-displaywatchlist' => 'Val for vising',
'prefs-diffs' => 'Skilnader',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-postadressa ser ut til å vera gyldig',
+'email-address-validity-invalid' => 'Skriv inn ei gyldig e-postaddresse.',
+
# User rights
'userrights' => 'Administrering av brukartilgang',
'userrights-lookup-user' => 'Administrer brukargrupper',
@@ -1400,6 +1429,7 @@ Du kan òg velje å la andre brukarar kontakte deg på e-post via brukarsida di
'right-hideuser' => 'Blokkere eit brukarnamn og skjule det frå ålmenta.',
'right-ipblock-exempt' => 'Kan gjere endringar frå blokkerte IP-adresser',
'right-proxyunbannable' => 'Kan gjere endringar frå blokkerte proxyar',
+'right-unblockself' => 'Avblokkera seg sjølve',
'right-protect' => 'Endre vernenivå',
'right-editprotected' => 'Endre verna sider',
'right-editinterface' => 'Redigere brukargrensesnittet',
@@ -1422,7 +1452,6 @@ Du kan òg velje å la andre brukarar kontakte deg på e-post via brukarsida di
'right-siteadmin' => 'Låse og låse opp databasen',
'right-reset-passwords' => 'Nullstilla passorda til andre brukarar',
'right-override-export-depth' => 'Eksporter sider inkludert lenkte sider til ei djupn på 5',
-'right-versiondetail' => 'Syn utvida informasjon om versjonen av programvara',
'right-sendemail' => 'Senda e-post til andre brukarar',
# User rights log
@@ -1473,14 +1502,9 @@ Du kan òg velje å la andre brukarar kontakte deg på e-post via brukarsida di
'recentchanges-legend' => 'Alternativ for siste endringar',
'recentchangestext' => 'PÃ¥ denne sida ser du dei sist endra sidene i {{SITENAME}}.',
'recentchanges-feed-description' => 'Fylg med på dei siste endringane på denne wikien med dette abonnementet.',
-'recentchanges-label-legend' => 'Forklaring: $1.',
-'recentchanges-legend-newpage' => '$1 – ny side',
'recentchanges-label-newpage' => 'Denne redigeringa oppretta ei ny side',
-'recentchanges-legend-minor' => '$1 – mindre endring',
'recentchanges-label-minor' => 'Dette er ei mindre endring',
-'recentchanges-legend-bot' => '$1 – botendring',
'recentchanges-label-bot' => 'Denne endringa vart gjort av ein bot',
-'recentchanges-legend-unpatrolled' => '$1 – upatruljert endring',
'recentchanges-label-unpatrolled' => 'Denne endringa er ikkje patruljert enno',
'rcnote' => "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} gjort {{PLURAL:$2|den siste dagen|dei siste '''$2''' dagane}}, sidan $4, kl. $5.",
'rcnotefrom' => "Nedanfor vert opp til '''$1''' endringar sidan ''' $2''' viste.",
@@ -1527,6 +1551,9 @@ Du kan òg velje å la andre brukarar kontakte deg på e-post via brukarsida di
'upload_directory_missing' => 'Opplastingsmappa ($1) manglar og kunne ikkje opprettast av tenaren.',
'upload_directory_read_only' => 'Opplastingsmappa ($1) er skriveverna.',
'uploaderror' => 'Feil under opplasting av fil',
+'upload-recreate-warning' => "'''Ã…tvaring: Ei fil med dette namnet er vorten sletta eller flytta.'''
+
+Slette- og flytteloggen til sida er gjeven opp her:",
'uploadtext' => "Bruk skjemaet under for å laste opp filer.
For å sjå eller søkje i eksisterande filer, gå til [[Special:FileList|fillista]]. Opplastingar vert òg lagra i [[Special:Log/upload|opplastingsloggen]], og slettingar i [[Special:Log/delete|sletteloggen]].
@@ -1560,6 +1587,17 @@ For å bruke ei fil på ei side, bruk ei lenkje på eit liknande format:
'filetype-banned-type' => "«'''.$1'''» er ikkje ein tillaten filtype.
{{PLURAL:$3|Tillaten filtype er|Tillatne filtypar er}} $2.",
'filetype-missing' => 'Fila har inga ending (som t.d. «.jpg»).',
+'empty-file' => 'Fila du leverte var tom.',
+'file-too-large' => 'Fila du leverte var for stor.',
+'filename-tooshort' => 'Filnamnet er for kort.',
+'filetype-banned' => 'Denne filtypen er ikkje tillaten.',
+'verification-error' => 'Denne fila klarde ikkje verifiseringsprossesen.',
+'hookaborted' => "Endringane du prøvde gjere blei avbrotne av ei ''extension hook''.",
+'illegal-filename' => 'Filnamnet er ikkje tillate.',
+'overwrite' => 'Det er ikkje tillate å skriva over ei eksisterande fil.',
+'unknown-error' => 'Det oppstod ein ukjend feil.',
+'tmp-create-error' => 'Kunne ikkje opprette midlertidig fil.',
+'tmp-write-error' => 'Feil ved skriving av midlertidig fil.',
'large-file' => 'Det er tilrådd at filene ikkje er større enn $1, denne fila er $2.',
'largefileserver' => 'Denne fila er større enn det tenaren tillèt.',
'emptyfile' => 'Det ser ut til at fila du lasta opp er tom. Dette kan komma av ein skrivefeil i filnamnet. Sjekk og tenk etter om du verkeleg vil laste opp fila.',
@@ -1583,13 +1621,13 @@ Om du framleis ynskjer å laste opp fila, lyt du gå attende og nytte eit anna n
Om du framleis ønskjer å laste opp fila, gå tilbake og last ho opp med eit anna namn. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Denne fila er ein duplikat av følgjande {{PLURAL:$1|fil|filer}}:',
'file-deleted-duplicate' => 'Ei identisk fil ([[:$1]]) er tidlegare sletta. Du bør sjekka slettehistorikken hennar før du held fram med å lasta henne opp på nytt.',
-'successfulupload' => 'Opplastinga er ferdig',
'uploadwarning' => 'Opplastingsåtvaring',
'uploadwarning-text' => 'Ver venleg og endra filskildringa nedanfor og prøv på nytt',
'savefile' => 'Lagre fil',
'uploadedimage' => 'Lasta opp «[[$1]]»',
'overwroteimage' => 'lasta opp ein ny versjon av «[[$1]]»',
'uploaddisabled' => 'Beklagar, funksjonen for opplasting er deaktivert på denne nettenaren.',
+'copyuploaddisabled' => 'Opplasting gjennom URL er slege av.',
'uploaddisabledtext' => 'Filopplasting er slått av.',
'php-uploaddisabledtext' => 'PHP-filopplasting er deaktivert. Sjå innstillinga for file_uploads.',
'uploadscripted' => 'Fila inneheld HTML- eller skriptkode som feilaktig kan bli tolka og køyrd av nettlesarar.',
@@ -1622,6 +1660,14 @@ JD # Jenoptik
MGP # Pentax
PICT # div.
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'Opplastinga er ferdig',
+'upload-success-msg' => 'Opplastinga di frå [$2] var vellukka. Han er tilgjengeleg her: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Opplastingsproblem',
+'upload-failure-msg' => 'Det oppstod eit problem med opplastinga di frå [$2]:
+
+$1',
+'upload-warning-subj' => 'Opplastingsåtvaring',
+'upload-warning-msg' => 'Det oppstod eit problem med opplastinga di frå [$2]. Du kan gå attende til [[Special:Upload/stash/$1|opplastingsskjemaet]] for å løysa dette problemet.',
'upload-proto-error' => 'Feil protokoll',
'upload-proto-error-text' => 'Fjernopplasting krev nettadresser som byrjar med <code>http://</code> eller <code>ftp://</code>.',
@@ -1679,6 +1725,7 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
'listfiles_search_for' => 'Søk etter filnamn:',
'imgfile' => 'fil',
'listfiles' => 'Filliste',
+'listfiles_thumb' => 'Miniatyrbilete',
'listfiles_date' => 'Dato',
'listfiles_name' => 'Namn',
'listfiles_user' => 'Brukar',
@@ -1792,7 +1839,6 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
'statistics-edits-average' => 'Gjennomsnittleg tal på endringar per side',
'statistics-views-total' => 'Totalt visningstal',
'statistics-views-peredit' => 'Visingar per endring',
-'statistics-jobqueue' => 'Lengda på [http://www.mediawiki.org/wiki/Manual:Job_queue jobbkøen]',
'statistics-users' => 'Registrerte [[Special:ListUsers|brukarar]]',
'statistics-users-active' => 'Aktive brukarar',
'statistics-users-active-desc' => 'Brukarar som har utført handlingar {{PLURAL:$1|i dag|dei siste $1 dagane}}',
@@ -1803,7 +1849,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
'disambiguations-text' => "Sidene nedanfor har lenkje til ei '''fleirtydingsside'''. Dei bør ha lenkje til det rette oppslagsordet i staden for.<br />Sider vert handsama som fleirtydingssider dersom dei inneheld ein mal som har lenkje på [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'Doble omdirigeringar',
-'doubleredirectstext' => 'Kvar line inneheld lenkjer til den første og den andre omdirigeringa, og den første lina frå den andre omdirigeringsteksten. Det gjev som regel den «rette» målartikkelen, som den første omdirigeringa skulle ha peikt på. <s>Overstrykne</s> liner har vorte retta på.',
+'doubleredirectstext' => 'Kvar line inneheld lenkjer til den første og den andre omdirigeringa, og den første lina frå den andre omdirigeringsteksten. Det gjev som regel den «rette» målartikkelen, som den første omdirigeringa skulle ha peikt på. <del>Overstrykne</del> liner har vorte retta på.',
'double-redirect-fixed-move' => '[[$1]] har blitt flytta, og er no ei omdirigering til [[$2]]',
'double-redirect-fixer' => 'Omdirigeringsfiksar',
@@ -1826,6 +1872,8 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmer}}',
'nrevisions' => '{{PLURAL:$1|Éin versjon|$1 versjonar}}',
'nviews' => '{{PLURAL:$1|Éi vising|$1 visingar}}',
+'nimagelinks' => 'Brukt på $1 {{PLURAL:$1|side|sider}}',
+'ntransclusions' => 'brukt på $1 {{PLURAL:$1|side|sider}}',
'specialpage-empty' => 'Denne sida er tom.',
'lonelypages' => 'Foreldrelause sider',
'lonelypagestext' => 'Følgjande sider er ikkje lenkja til på andre sider på {{SITENAME}}.',
@@ -1979,34 +2027,36 @@ Sjå òg [[Special:WantedCategories|ønska kategoriar]].',
'listgrouprights-removegroup-self-all' => 'Kan ta vekk alle gruppene frå sin eigen konto',
# E-mail user
-'mailnologin' => 'Inga avsendaradresse',
-'mailnologintext' => 'Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for å sende e-post åt andre brukarar.',
-'emailuser' => 'Send e-post åt denne brukaren',
-'emailpage' => 'Send e-post åt brukar',
-'emailpagetext' => 'Du kan nytte skjemaet nedanfor til å sende ein e-post til denne brukaren.
+'mailnologin' => 'Inga avsendaradresse',
+'mailnologintext' => 'Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for å sende e-post åt andre brukarar.',
+'emailuser' => 'Send e-post åt denne brukaren',
+'emailpage' => 'Send e-post åt brukar',
+'emailpagetext' => 'Du kan nytte skjemaet nedanfor til å sende ein e-post til denne brukaren.
E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukke opp i «frå»-feltet på denne e-posten, så mottakaren er i stand til å svare.',
-'usermailererror' => 'E-post systemet gav feilmelding:',
-'defemailsubject' => '{{SITENAME}} e-post',
-'noemailtitle' => 'Inga e-postadresse',
-'noemailtext' => 'Denne brukaren har ikkje oppgjeve ei gyldig e-postadresse.',
-'nowikiemailtitle' => 'Ingen e-post tillaten',
-'nowikiemailtext' => 'Denne brukaren har vald å ikkje motta e-postar frå andre brukarar.',
-'email-legend' => 'Send ein e-post til ein annan {{SITENAME}}-brukar',
-'emailfrom' => 'Frå:',
-'emailto' => 'Ã…t:',
-'emailsubject' => 'Emne:',
-'emailmessage' => 'Melding:',
-'emailsend' => 'Send',
-'emailccme' => 'Send meg ein kopi av meldinga mi.',
-'emailccsubject' => 'Kopi av meldinga di til $1: $2',
-'emailsent' => 'E-posten er sendt',
-'emailsenttext' => 'E-posten er sendt.',
-'emailuserfooter' => 'E-posten vart sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.',
+'usermailererror' => 'E-post systemet gav feilmelding:',
+'defemailsubject' => '{{SITENAME}} e-post',
+'usermaildisabled' => 'Brukare-post slegen av',
+'usermaildisabledtext' => 'Du kan ikkje senda e-postar til andre brukarar på wikien',
+'noemailtitle' => 'Inga e-postadresse',
+'noemailtext' => 'Denne brukaren har ikkje oppgjeve ei gyldig e-postadresse.',
+'nowikiemailtitle' => 'Ingen e-post tillaten',
+'nowikiemailtext' => 'Denne brukaren har vald å ikkje motta e-postar frå andre brukarar.',
+'email-legend' => 'Send ein e-post til ein annan {{SITENAME}}-brukar',
+'emailfrom' => 'Frå:',
+'emailto' => 'Ã…t:',
+'emailsubject' => 'Emne:',
+'emailmessage' => 'Melding:',
+'emailsend' => 'Send',
+'emailccme' => 'Send meg ein kopi av meldinga mi.',
+'emailccsubject' => 'Kopi av meldinga di til $1: $2',
+'emailsent' => 'E-posten er sendt',
+'emailsenttext' => 'E-posten er sendt.',
+'emailuserfooter' => 'E-posten vart sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.',
# Watchlist
'watchlist' => 'Overvakingsliste',
'mywatchlist' => 'Overvakingslista mi',
-'watchlistfor' => "(for '''$1''')",
+'watchlistfor2' => 'For $1 $2',
'nowatchlist' => 'Du har ikkje noko i overvakingslista di.',
'watchlistanontext' => 'Du lyt $1 for å vise eller endre sider på overvakingslista di.',
'watchnologin' => 'Ikkje innlogga',
@@ -2121,7 +2171,10 @@ Den siste endringa vart gjort av [[User:$3|$3]] ([[User talk:$3|brukardiskusjon]
'revertpage' => 'Attenderulla endring gjort av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til tidlegare versjon endra av [[User:$1|$1]]',
'revertpage-nouser' => 'Tilbakestilte endringar av (brukarnamn fjerna) til den siste versjonen av [[User:$1|$1]]',
'rollback-success' => 'Rulla attende endringane av $1, tilbake til siste versjon av $2.',
-'sessionfailure' => 'Det ser ut til å vera eit problem med innloggingsøkta di. Handlinga er vorten avbroten for å vera føre var mot kidnapping av økta. Bruk attendeknappen i nettlesaren din og prøv om att.',
+
+# Edit tokens
+'sessionfailure-title' => 'Feil med omgangen.',
+'sessionfailure' => 'Det ser ut til å vera eit problem med innloggingsøkta di. Handlinga er vorten avbroten for å vera føre var mot kidnapping av økta. Bruk attendeknappen i nettlesaren din og prøv om att.',
# Protect
'protectlogpage' => 'Vernelogg',
@@ -2246,18 +2299,21 @@ $1',
'month' => 'MÃ¥nad:',
'year' => 'Ã…r:',
-'sp-contributions-newbies' => 'Vis berre bidrag frå nye brukarar',
-'sp-contributions-newbies-sub' => 'Frå nye brukarkontoar',
-'sp-contributions-newbies-title' => 'Brukarbidrag av nye brukarar',
-'sp-contributions-blocklog' => 'blokkeringslogg',
-'sp-contributions-deleted' => 'sletta brukarbidrag',
-'sp-contributions-logs' => 'loggar',
-'sp-contributions-talk' => 'diskusjon',
-'sp-contributions-userrights' => 'administrering av brukartilgang',
-'sp-contributions-blocked-notice' => 'Denne brukaren er for tida blokkert. Den siste oppføringa i blokkeringsloggen er synt nedanfor:',
-'sp-contributions-search' => 'Søk etter bidrag',
-'sp-contributions-username' => 'IP-adresse eller brukarnamn:',
-'sp-contributions-submit' => 'Søk',
+'sp-contributions-newbies' => 'Vis berre bidrag frå nye brukarar',
+'sp-contributions-newbies-sub' => 'Frå nye brukarkontoar',
+'sp-contributions-newbies-title' => 'Brukarbidrag av nye brukarar',
+'sp-contributions-blocklog' => 'blokkeringslogg',
+'sp-contributions-deleted' => 'sletta brukarbidrag',
+'sp-contributions-uploads' => '↓opplastingar',
+'sp-contributions-logs' => 'loggar',
+'sp-contributions-talk' => 'diskusjon',
+'sp-contributions-userrights' => 'administrering av brukartilgang',
+'sp-contributions-blocked-notice' => 'Denne brukaren er for tida blokkert. Den siste oppføringa i blokkeringsloggen er synt nedanfor:',
+'sp-contributions-blocked-notice-anon' => 'Denne IP-adressa er for tida blokkert. Den siste oppføringa i blokkeringsloggen er synt nedanfor:',
+'sp-contributions-search' => 'Søk etter bidrag',
+'sp-contributions-username' => 'IP-adresse eller brukarnamn:',
+'sp-contributions-toponly' => 'Einast vis endringar som er dei siste på sida.',
+'sp-contributions-submit' => 'Søk',
# What links here
'whatlinkshere' => 'Lenkjer hit',
@@ -2315,7 +2371,6 @@ Sjå [[Special:IPBlockList|blokkeringslista]] for alle blokkeringane.',
'ipb-edit-dropdown' => 'Endre grunnane for blokkering',
'ipb-unblock-addr' => 'Opphev blokkeringa av $1',
'ipb-unblock' => 'Opphev blokkeringa av eit brukarnamn eller ei IP-adresse',
-'ipb-blocklist-addr' => 'Gjeldande blokkeringar av $1',
'ipb-blocklist' => 'Vis gjeldande blokkeringar',
'ipb-blocklist-contribs' => 'Bidrag frå $1',
'unblockip' => 'Opphev blokkering',
@@ -2385,6 +2440,8 @@ $1 er alt blokkert. Vil du endre innstillingane?',
'sorbs_create_account_reason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL, og difor får du ikkje registrert deg.',
'cant-block-while-blocked' => 'Du kan ikkje blokkere andre medan du sjølv er blokkert.',
'cant-see-hidden-user' => 'Brukaren du prøver å blokkera har allereie vorte blokkert og skjult. Sidan du ikkje har rett til å skjula brukarar, kan du ikkje sjå eller endra blokkeringa til brukaren.',
+'ipbblocked' => 'Du kan ikkje blokkera eller avblokkera andre brukarar sidan du sjølv er blokkert',
+'ipbnounblockself' => 'Du kan ikkje avblokkera deg sjølv',
# Developer tools
'lockdb' => 'Skrivevern (lock) database',
@@ -2411,6 +2468,16 @@ $1 er alt blokkert. Vil du endre innstillingane?',
Merk at sida '''ikkje''' kan flyttast dersom det allereie finst ei side med den nye tittelen. Du kan likevel flytte ei side attende dit ho vart flytt frå dersom du gjer ein feil, så lenge den sida du flytter attende til ikkje er vorten endra sidan flyttinga.
<b>ÅTVARING!</b> Dette kan vera ei drastisk og uventa endring for ei populær side; ver sikker på at du skjønner konsekvensane av dette før du fortset.",
+'movepagetext-noredirectfixer' => "Ved å bruke skjemaet under kan du få omdøypt ei side og flytt heile historikken til det nye namnet.
+Den gamle tittelen vil omdirigere til den nye tittelen.
+Pass på å sjekke for doble eller dårlege omdirigeringar.
+Du er ansvarleg for at alle lenkjene stadig peiker dit det er meininga at dei skal peike.
+
+Merk at sida '''ikkje''' kan flyttast dersom det allereie finst ei side med den nye tittelen, om ho då ikkje er ei omdirigeringsside utan endringshistorikk. Dette vil seie at du kan flytte ei side attende dit ho vart flytt frå dersom du gjer ein feil, og at du ikkje kan skriva over ei side som finst.
+
+<b>Ã…TVARING!</b>
+Dette kan vera ei drastisk og uventa endring for ei populær side;
+ver sikker på at du skjøner konsekvensane av dette før du fortset.",
'movepagetalktext' => "Den tilhøyrande diskusjonssida, om ho finst, vil automatisk bli flytt med sida '''med mindre:'''
*Du flytter sida til eit anna namnerom, eller
*Du fjernar merkinga i boksen nedanfor.
@@ -2465,6 +2532,7 @@ Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flyttin
'immobile-source-page' => 'Denne sida kan ikkje flyttast.',
'immobile-target-page' => 'Kan ikkje flytte til det målnamnet.',
'imagenocrossnamespace' => 'Kan ikkje flytte bilete til andre namnerom enn biletnamnerommet',
+'nonfile-cannot-move-to-file' => 'Kan ikkje flytta ikkje-filer til filnamnerommet.',
'imagetypemismatch' => 'Den nye filendinga høver ikkje til filtypen',
'imageinvalidfilename' => 'MÃ¥lnamnet er ugyldig',
'fix-double-redirects' => 'Oppdater omdirigeringar som viser til den gamle tittelen',
@@ -2538,10 +2606,11 @@ Vitja [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [ht
'import-interwiki-namespace' => 'MÃ¥lnamnerom:',
'import-upload-filename' => 'Filnamn:',
'import-comment' => 'Kommentar:',
-'importtext' => 'Eksporter fila frå kjeldewikien med [[Special:Export|eksporteringsverktøyet]], lagre ho på di eiga datamaskin, og last henne opp her.',
+'importtext' => 'Lagre fila frå kjeldewikien med [[Special:Export|eksporteringsverktøyet]] på din eigen datamaskin, og last henne så opp her.',
'importstart' => 'Importerer sidene…',
'import-revision-count' => '$1 {{PLURAL:$1|versjon|versjonar}}',
'importnopages' => 'Ingen sider å importere.',
+'imported-log-entries' => 'Importerte {{PLURAL:$1|eitt loggelement|$1 loggelement}}.',
'importfailed' => 'Importeringa var mislukka: $1',
'importunknownsource' => 'Ukjend importkjeldetype',
'importcantopen' => 'Kunne ikkje opne importfil',
@@ -2634,6 +2703,8 @@ Vitja [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [ht
'tooltip-upload' => 'Start opplastinga',
'tooltip-rollback' => '«Attenderull»-knappen attenderullar endringar på denne sida med eitt klikk til den førre utgåva av ein annan brukar',
'tooltip-undo' => '«Gjer om» attenderullar endringar og opnar endringsvindauga med førehandsvising. Gjer at ein kan leggje til ei årsak samandragsboksen.',
+'tooltip-preferences-save' => 'Lagra innstillingar',
+'tooltip-summary' => 'Skriv inn eit kort samandrag',
# Stylesheets
'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utsjånader. */',
@@ -2760,14 +2831,16 @@ $1',
'imagemaxsize' => "Avgrens storleiken for bilete:<br />''(for sider som skildrar filer)''",
'thumbsize' => 'Miniatyrstørrelse:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|éi side|$3 sider}}',
-'file-info' => '(filstorleik: $1, MIME-type: $2)',
-'file-info-size' => '($1 × $2 pikslar, filstorleik: $3, MIME-type: $4)',
+'file-info' => 'filstorleik: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 pikslar, filstorleik: $3, MIME-type: $4',
'file-nohires' => '<small>Høgare oppløysing er ikkje tilgjengeleg.</small>',
-'svg-long-desc' => '(SVG-fil, standardoppløysing: $1 × $2 pikslar, filstorleik: $3)',
+'svg-long-desc' => 'SVG-fil, standardoppløysing: $1 × $2 pikslar, filstorleik: $3',
'show-big-image' => 'Full oppløysing',
'show-big-image-thumb' => '<small>Storleiken på denne førehandsvisinga: $1 × $2 pikslar</small>',
'file-info-gif-looped' => 'gjentatt',
'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}}',
# Special:NewFiles
'newimages' => 'Filgalleri',
@@ -2923,6 +2996,7 @@ Dei andre felta er gøymde som standard.
'exif-gpsareainformation' => 'Namn på GPS-område',
'exif-gpsdatestamp' => 'GPS-dato',
'exif-gpsdifferential' => 'Differensiell GPS-retting',
+'exif-objectname' => 'Kort tittel',
# EXIF attributes
'exif-compression-1' => 'Ukomprimert',
@@ -3155,6 +3229,7 @@ Du må stadfeste at du verkeleg vil nyopprette denne sida.",
'table_pager_first' => 'Fyrste side',
'table_pager_last' => 'Siste side',
'table_pager_limit' => 'Vis $1 element per side',
+'table_pager_limit_label' => 'Element per side:',
'table_pager_limit_submit' => 'GÃ¥',
'table_pager_empty' => 'Ingen resultat',
@@ -3222,6 +3297,8 @@ Du kan òg [[Special:Watchlist/edit|nytte standardverktøyet]].',
'version-hook-subscribedby' => 'Brukt av',
'version-version' => '(versjon $1)',
'version-license' => 'Lisens',
+'version-poweredby-credits' => "Denne wikien er dreven av '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'andre',
'version-software' => 'Installert programvare',
'version-software-product' => 'Produkt',
'version-software-version' => 'Versjon',
@@ -3291,6 +3368,15 @@ Skriv inn filnamn utan «{{ns:file}}:»-prefikset.',
'tags-edit' => 'endra',
'tags-hitcount' => '{{PLURAL:$1|éi endring|$1 endringar}}',
+# Special:ComparePages
+'comparepages' => 'Samanlikna sider',
+'compare-selector' => 'Samanlikn sideversjonar',
+'compare-page1' => 'Side 1',
+'compare-page2' => 'Side 2',
+'compare-rev1' => 'Versjon 1',
+'compare-rev2' => 'Versjon 2',
+'compare-submit' => 'Samanlikna',
+
# Database error messages
'dberr-header' => 'Denne wikien har eit problem',
'dberr-problems' => 'Nettstaden har tekniske problem.',
@@ -3307,8 +3393,13 @@ Skriv inn filnamn utan «{{ns:file}}:»-prefikset.',
'htmlform-float-invalid' => 'Verdien du valde er ikkje eit tal.',
'htmlform-int-toolow' => 'Verdien du valde er under minstetalet på $1',
'htmlform-int-toohigh' => 'Verdien du valde er over høgste moglege tal $1',
+'htmlform-required' => 'Denne verdien er påkravd',
'htmlform-submit' => 'Lagre',
'htmlform-reset' => 'Gjer om endringar',
'htmlform-selectorother-other' => 'Andre',
+# SQLite database support
+'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
+'sqlite-no-fts' => '$1 utan støtte for fulltekstsøk',
+
);
diff --git a/languages/messages/MessagesNo.php b/languages/messages/MessagesNo.php
index 85c022fd..b849ba94 100644
--- a/languages/messages/MessagesNo.php
+++ b/languages/messages/MessagesNo.php
@@ -66,7 +66,7 @@ $namespaceAliases = array(
'Bildediskusjon' => NS_FILE_TALK,
);
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
$dateFormats = array(
@@ -84,94 +84,97 @@ $dateFormats = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Doble omdirigeringer' ),
- 'BrokenRedirects' => array( 'Ødelagte omdirigeringer' ),
+ 'DoubleRedirects' => array( 'Doble_omdirigeringer' ),
+ 'BrokenRedirects' => array( 'Ødelagte_omdirigeringer' ),
'Disambiguations' => array( 'Pekere' ),
- 'Userlogin' => array( 'Logg inn' ),
- 'Userlogout' => array( 'Logg ut' ),
- 'CreateAccount' => array( 'Opprett konto' ),
+ 'Userlogin' => array( 'Logg_inn' ),
+ 'Userlogout' => array( 'Logg_ut' ),
+ 'CreateAccount' => array( 'Opprett_konto' ),
'Preferences' => array( 'Innstillinger' ),
'Watchlist' => array( 'Overvåkningsliste', 'Overvåkingsliste' ),
- 'Recentchanges' => array( 'Siste endringer' ),
- 'Upload' => array( 'Last opp' ),
+ 'Recentchanges' => array( 'Siste_endringer' ),
+ 'Upload' => array( 'Last_opp' ),
'Listfiles' => array( 'Filliste', 'Bildeliste', 'Billedliste' ),
- 'Newimages' => array( 'Nye bilder' ),
+ 'Newimages' => array( 'Nye_filer', 'Nye_bilder' ),
'Listusers' => array( 'Brukerliste' ),
'Listgrouprights' => array( 'Grupperettigheter' ),
'Statistics' => array( 'Statistikk' ),
- 'Randompage' => array( 'Tilfeldig side', 'Tilfeldig' ),
- 'Lonelypages' => array( 'Foreldreløse sider' ),
- 'Uncategorizedpages' => array( 'Ukategoriserte sider' ),
- 'Uncategorizedcategories' => array( 'Ukategoriserte kategorier' ),
- 'Uncategorizedimages' => array( 'Ukategoriserte filer', 'Ukategoriserte bilder' ),
- 'Uncategorizedtemplates' => array( 'Ukategoriserte maler' ),
- 'Unusedcategories' => array( 'Ubrukte kategorier' ),
- 'Unusedimages' => array( 'Ubrukte filer', 'Ubrukte bilder' ),
- 'Wantedpages' => array( 'Ønskede sider' ),
- 'Wantedcategories' => array( 'Ønskede kategorier' ),
- 'Wantedfiles' => array( 'Ønskede filer' ),
- 'Wantedtemplates' => array( 'Ønskede maler' ),
- 'Mostlinked' => array( 'Mest lenkede sider', 'Mest lenka sider' ),
- 'Mostlinkedcategories' => array( 'Største kategorier' ),
- 'Mostlinkedtemplates' => array( 'Mest brukte maler' ),
- 'Mostimages' => array( 'Mest brukte bilder', 'Mest brukte filer' ),
- 'Mostcategories' => array( 'Flest kategorier' ),
- 'Mostrevisions' => array( 'Flest revisjoner' ),
- 'Fewestrevisions' => array( 'Færrest revisjoner' ),
- 'Shortpages' => array( 'Korte sider' ),
- 'Longpages' => array( 'Lange sider' ),
- 'Newpages' => array( 'Nye sider' ),
- 'Ancientpages' => array( 'Gamle sider' ),
+ 'Randompage' => array( 'Tilfeldig', 'Tilfeldig_side' ),
+ 'Lonelypages' => array( 'Foreldreløse_sider' ),
+ 'Uncategorizedpages' => array( 'Ukategoriserte_sider' ),
+ 'Uncategorizedcategories' => array( 'Ukategoriserte_kategorier' ),
+ 'Uncategorizedimages' => array( 'Ukategoriserte_filer', 'Ukategoriserte_bilder' ),
+ 'Uncategorizedtemplates' => array( 'Ukategoriserte_maler' ),
+ 'Unusedcategories' => array( 'Ubrukte_kategorier' ),
+ 'Unusedimages' => array( 'Ubrukte_filer', 'Ubrukte_bilder' ),
+ 'Wantedpages' => array( 'Ønskede_sider', 'Ødelagte_lenker' ),
+ 'Wantedcategories' => array( 'Ønskede_kategorier' ),
+ 'Wantedfiles' => array( 'Ønskede_filer' ),
+ 'Wantedtemplates' => array( 'Ønskede_maler' ),
+ 'Mostlinked' => array( 'Mest_lenkede_sider', 'Mest_lenket' ),
+ 'Mostlinkedcategories' => array( 'Mest_lenkede_kategorier', 'Mest_brukte_kategorier' ),
+ 'Mostlinkedtemplates' => array( 'Mest_lenkede_maler', 'Mest_brukte_maler' ),
+ 'Mostimages' => array( 'Mest_lenkede_filer', 'Flest_filer', 'Flest_bilder' ),
+ 'Mostcategories' => array( 'Flest_kategorier' ),
+ 'Mostrevisions' => array( 'Flest_revisjoner' ),
+ 'Fewestrevisions' => array( 'Færrest_revisjoner' ),
+ 'Shortpages' => array( 'Korte_sider' ),
+ 'Longpages' => array( 'Lange_sider' ),
+ 'Newpages' => array( 'Nye_sider' ),
+ 'Ancientpages' => array( 'Gamle_sider' ),
'Deadendpages' => array( 'Blindveisider' ),
- 'Protectedpages' => array( 'Beskyttede sider' ),
- 'Protectedtitles' => array( 'Beskyttede titler' ),
- 'Allpages' => array( 'Alle sider' ),
+ 'Protectedpages' => array( 'Beskyttede_sider' ),
+ 'Protectedtitles' => array( 'Beskyttede_titler' ),
+ 'Allpages' => array( 'Alle_sider' ),
'Prefixindex' => array( 'Prefiksindeks' ),
- 'Ipblocklist' => array( 'Blokkeringsliste' ),
+ 'Ipblocklist' => array( 'Blokkeringsliste', 'IP-blokkeringsliste' ),
+ 'Unblock' => array( 'Avblokker' ),
'Specialpages' => array( 'Spesialsider' ),
'Contributions' => array( 'Bidrag' ),
'Emailuser' => array( 'E-post' ),
- 'Confirmemail' => array( 'Bekreft e-postadresse' ),
- 'Whatlinkshere' => array( 'Lenker hit' ),
- 'Recentchangeslinked' => array( 'Relaterte endringer' ),
- 'Movepage' => array( 'Flytt side' ),
- 'Blockme' => array( 'Blokker meg' ),
+ 'Confirmemail' => array( 'Bekreft_e-postadresse' ),
+ 'Whatlinkshere' => array( 'Lenker_hit' ),
+ 'Recentchangeslinked' => array( 'Relaterte_endringer' ),
+ 'Movepage' => array( 'Flytt_side' ),
+ 'Blockme' => array( 'Blokker_meg' ),
'Booksources' => array( 'Bokkilder' ),
'Categories' => array( 'Kategorier' ),
'Export' => array( 'Eksporter' ),
'Version' => array( 'Versjon' ),
- 'Allmessages' => array( 'Alle systembeskjeder' ),
+ 'Allmessages' => array( 'Alle_systembeskjeder' ),
'Log' => array( 'Logg', 'Logger' ),
- 'Blockip' => array( 'Blokker' ),
+ 'Blockip' => array( 'Blokker', 'Blokker_IP', 'Blokker_bruker' ),
'Undelete' => array( 'Gjenopprett' ),
'Import' => array( 'Importer' ),
- 'Lockdb' => array( 'LÃ¥s database' ),
- 'Unlockdb' => array( 'Ã…pne database' ),
+ 'Lockdb' => array( 'LÃ¥s_database' ),
+ 'Unlockdb' => array( 'Ã…pne_database' ),
'Userrights' => array( 'Brukerrettigheter' ),
'MIMEsearch' => array( 'MIME-søk' ),
'FileDuplicateSearch' => array( 'Filduplikatsøk' ),
- 'Unwatchedpages' => array( 'Uovervåkede sider' ),
+ 'Unwatchedpages' => array( 'Uovervåkede_sider' ),
'Listredirects' => array( 'Omdirigeringsliste' ),
'Revisiondelete' => array( 'Revisjonssletting' ),
- 'Unusedtemplates' => array( 'Ubrukte maler' ),
- 'Randomredirect' => array( 'Tilfeldig omdirigering' ),
- 'Mypage' => array( 'Min side' ),
- 'Mytalk' => array( 'Min diskusjon' ),
- 'Mycontributions' => array( 'Mine bidrag' ),
+ 'Unusedtemplates' => array( 'Ubrukte_maler' ),
+ 'Randomredirect' => array( 'Tilfeldig_omdirigering' ),
+ 'Mypage' => array( 'Min_side' ),
+ 'Mytalk' => array( 'Min_diskusjon' ),
+ 'Mycontributions' => array( 'Mine_bidrag' ),
'Listadmins' => array( 'Administratorliste', 'Administratorer' ),
- 'Listbots' => array( 'Robotliste', 'Liste over roboter' ),
- 'Popularpages' => array( 'Populære sider' ),
+ 'Listbots' => array( 'Robotliste', 'Liste_over_roboter' ),
+ 'Popularpages' => array( 'Populære_sider' ),
'Search' => array( 'Søk' ),
- 'Resetpass' => array( 'Resett passord' ),
- 'Withoutinterwiki' => array( 'Uten interwiki' ),
- 'MergeHistory' => array( 'Flett historikk' ),
+ 'Resetpass' => array( 'Endre_passord', 'TIlbakestill_passord' ),
+ 'Withoutinterwiki' => array( 'Uten_interwiki' ),
+ 'MergeHistory' => array( 'Flett_historikk' ),
'Filepath' => array( 'Filsti' ),
- 'Invalidateemail' => array( 'Ugyldiggjøre e-post' ),
- 'Blankpage' => array( 'Blank side' ),
+ 'Invalidateemail' => array( 'Ugyldiggjøre_e-post' ),
+ 'Blankpage' => array( 'Blank_side' ),
'LinkSearch' => array( 'Lenkesøk' ),
- 'DeletedContributions' => array( 'Slettede bidrag' ),
+ 'DeletedContributions' => array( 'Slettede_bidrag' ),
'Tags' => array( 'Tagger' ),
- 'Activeusers' => array( 'Aktive brukere' ),
+ 'Activeusers' => array( 'Aktive_brukere' ),
+ 'ComparePages' => array( 'Sammenlign_sider' ),
+ 'Badtitle' => array( 'Ugyldig_tittel' ),
);
$magicWords = array(
@@ -242,8 +245,7 @@ $messages = array(
'tog-editsection' => 'Rediger avsnitt ved hjelp av [rediger]-lenke',
'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift (JavaScript)',
'tog-showtoc' => 'Vis innholdsfortegnelse (for sider med mer enn tre seksjoner)',
-'tog-rememberpassword' => 'Husk passordet',
-'tog-editwidth' => 'Utvid redigeringsboksen til å bruke hele skjermen',
+'tog-rememberpassword' => 'Husk meg i denne nettleseren (i høyst $1 {{PLURAL:$1|dag|dager}})',
'tog-watchcreations' => 'Overvåk sider jeg oppretter',
'tog-watchdefault' => 'Overvåk alle sider jeg redigerer',
'tog-watchmoves' => 'Overvåk sider jeg flytter',
@@ -388,31 +390,21 @@ $messages = array(
'faqpage' => 'Project:Ofte stilte spørsmål',
# Vector skin
-'vector-action-addsection' => 'Nytt emne',
-'vector-action-delete' => 'Slett',
-'vector-action-move' => 'Flytt',
-'vector-action-protect' => 'Beskytt',
-'vector-action-undelete' => 'Gjenopprett',
-'vector-action-unprotect' => 'Opphev beskyttelse',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Hjelpeside',
-'vector-namespace-image' => 'Fil',
-'vector-namespace-main' => 'Side',
-'vector-namespace-media' => 'Mediaside',
-'vector-namespace-mediawiki' => 'Melding',
-'vector-namespace-project' => 'Prosjektside',
-'vector-namespace-special' => 'Spesialside',
-'vector-namespace-talk' => 'Diskusjon',
-'vector-namespace-template' => 'Mal',
-'vector-namespace-user' => 'Brukerside',
-'vector-view-create' => 'Opprett',
-'vector-view-edit' => 'Rediger',
-'vector-view-history' => 'Vis historikk',
-'vector-view-view' => 'Les',
-'vector-view-viewsource' => 'Vis kilden',
-'actions' => 'Handlinger',
-'namespaces' => 'Navnerom',
-'variants' => 'Varianter',
+'vector-action-addsection' => 'Nytt emne',
+'vector-action-delete' => 'Slett',
+'vector-action-move' => 'Flytt',
+'vector-action-protect' => 'Beskytt',
+'vector-action-undelete' => 'Gjenopprett',
+'vector-action-unprotect' => 'Opphev beskyttelse',
+'vector-simplesearch-preference' => 'Aktiver forbedrede søkeforslag (kun for drakten Vector)',
+'vector-view-create' => 'Opprett',
+'vector-view-edit' => 'Rediger',
+'vector-view-history' => 'Vis historikk',
+'vector-view-view' => 'Les',
+'vector-view-viewsource' => 'Vis kilden',
+'actions' => 'Handlinger',
+'namespaces' => 'Navnerom',
+'variants' => 'Varianter',
'errorpagetitle' => 'Feil',
'returnto' => 'Tilbake til $1.',
@@ -473,6 +465,9 @@ For mange brukere forsøker å se denne siden.
Vennligst vent en stund før du prøver å besøke denne siden på nytt.
$1',
+'pool-timeout' => 'Tidsavbudd mens man ventet på låsing',
+'pool-queuefull' => 'Køen er full',
+'pool-errorunknown' => 'Ukjent feil',
# 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' => 'Om {{SITENAME}}',
@@ -633,7 +628,8 @@ Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
'yourname' => 'Brukernavn:',
'yourpassword' => 'Passord:',
'yourpasswordagain' => 'Gjenta passord',
-'remembermypassword' => 'Husk meg på denne datamaskinen',
+'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
+'securelogin-stick-https' => 'Vær fortsatt tilkoblet til HTTPS etter innlogging',
'yourdomainname' => 'Ditt domene',
'externaldberror' => 'Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.',
'login' => 'Logg inn',
@@ -650,6 +646,7 @@ Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
'gotaccount' => "Har du allerede et brukernavn? '''$1'''.",
'gotaccountlink' => 'Logg inn',
'createaccountmail' => 'per e-post',
+'createaccountreason' => 'Ã…rsak:',
'badretype' => 'Passordene samsvarte ikke.',
'userexists' => 'Brukernavnet er allerede i bruk. Velg et nytt.',
'loginerror' => 'Innloggingsfeil',
@@ -669,6 +666,7 @@ Sjekk stavemåten eller [[Special:UserLogin/signup|opprett en ny konto]].',
'wrongpasswordempty' => 'Du oppga ikke noe passord. Prøv igjen.',
'passwordtooshort' => 'Passord må ha minst {{PLURAL:$1|ett tegn|$1 tegn}}.',
'password-name-match' => 'Passordet ditt må være anderledes enn brukernavnet.',
+'password-login-forbidden' => 'Bruken av disse brukernavn og passord har blitt forbudt.',
'mailmypassword' => 'Send nytt passord',
'passwordremindertitle' => 'Nytt midlertidig passord fra {{SITENAME}}',
'passwordremindertext' => 'Noen (antagelig deg, fra IP-adressen $1) ba oss sende deg et nytt
@@ -706,6 +704,9 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
'loginlanguagelabel' => 'Språk: $1',
'suspicious-userlogout' => 'Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
+
# Password reset dialog
'resetpass' => 'Endre passord',
'resetpass_announce' => 'Du logget inn med en midlertidig e-postkode. For å fullføre innloggingen må du oppgi et nytt passord her:',
@@ -758,10 +759,12 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
'showdiff' => 'Vis endringer',
'anoneditwarning' => "'''Advarsel:''' Du er ikke logget inn.
IP-adressen din blir bevart i sidens redigeringshistorikk.",
+'anonpreviewwarning' => "''Du er ikke logget inn. Lagring vil registrere din IP-adresse i sidens redigeringshistorikk.''",
'missingsummary' => "'''PÃ¥minnelse:''' Du har ikke lagt inn en redigeringsforklaring.
Velger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
'missingcommenttext' => 'Vennligst legg inn en kommentar under.',
-'missingcommentheader' => "'''Merk:''' Du har ikke angitt et emne/overskrift for denne kommentaren. Om du trykker Lagre igjen, vil redigeringen din bli lagret uten en.",
+'missingcommentheader' => "'''PÃ¥minnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.
+Om du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
'summary-preview' => 'Forhåndsvisning av redigeringsforklaring:',
'subject-preview' => 'Forhåndsvisning av emne/overskrift:',
'blockedtitle' => 'Brukeren er blokkert',
@@ -832,7 +835,11 @@ Siste blokkeringsloggelement kan sees nedenfor.',
'userjsyoucanpreview' => "'''Tips:''' Bruk '{{int:showpreview}}'-knappen for å teste ditt nye JS før du lagrer.",
'usercsspreview' => "'''Husk at dette bare er en forhåndsvisning av din bruker-CSS og at den ikke er lagret!'''",
'userjspreview' => "'''Husk at dette bare er en test eller forhåndsvisning av ditt bruker-JavaScript, og det ikke er lagret!'''",
-'userinvalidcssjstitle' => "'''Advarsel:''' Det finnes ikke noe utseende ved navn «$1». Husk at .css- og .js-sider bruker titler i små bokstaver, for eksempel {{ns:user}}:Eksempel/monobook.css, ikke {{ns:user}}:Eksempel/Monobook.css",
+'sitecsspreview' => "'''Husk at du bare forhåndsviser denne CSS.'''
+'''Den har ikke blitt lagret ennå!'''",
+'sitejspreview' => "'''Husk at du bare forhåndsviser denne JavaScript-koden.'''
+'''Den har ikke blitt lagret ennå!'''",
+'userinvalidcssjstitle' => "'''Advarsel:''' Det finnes ikke noe utseende ved navn «$1». Husk at .css- og .js-sider bruker titler i små bokstaver, for eksempel {{ns:user}}:Eksempel/vector.css, ikke {{ns:user}}:Eksempel/Vector.css",
'updated' => '(Oppdatert)',
'note' => "'''Merk:'''",
'previewnote' => "'''Husk at dette bare er en forhåndsvisning.'''
@@ -867,7 +874,6 @@ Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs so
'''Ikke legg til opphavsbeskyttet materiale uten tillatelse!'''",
'copyrightwarning2' => "Vennligst merk at alle bidrag til {{SITENAME}} kan bli redigert, endret eller fjernet av andre bidragsytere. Om du ikke vil at dine bidrag skal kunne redigeres fritt, ikke legg det til her.<br />
Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som er i public domain eller lignende (se $1 for detaljer). '''IKKE LEGG TIL OPPHAVSBESKYTTET MATERIALE UTEN TILLATELSE!'''",
-'longpagewarning' => "'''ADVARSEL: Denne siden er $1&nbsp;kB lang; noen eldre nettlesere kan ha problemer med å redigere sider som nærmer seg eller er lengre enn 32&nbsp;kB. Overvei om ikke siden kan deles opp i mindre deler.'''",
'longpageerror' => "'''FEIL: Teksten du prøvde å lagre er $1&nbsp;kB lang, dvs. lenger enn det maksimale $2&nbsp;kB. Den kan ikke lagres.'''",
'readonlywarning' => "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,
så du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å
@@ -1039,6 +1045,8 @@ $1",
'logdelete-failure' => "'''Loggens synlighet kunne ikke bli stilt inn:'''
$1",
'revdel-restore' => 'endre synlighet',
+'revdel-restore-deleted' => 'slettede revisjoner',
+'revdel-restore-visible' => 'synlige revisjoner',
'pagehist' => 'Sidehistorikk',
'deletedhist' => 'Slettet historikk',
'revdelete-content' => 'innhold',
@@ -1107,11 +1115,13 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
# Diffs
'history-title' => 'Revisjonshistorikk for «$1»',
'difference' => '(Forskjell mellom revisjoner)',
+'difference-multipage' => '(Forskjell mellom sider)',
'lineno' => 'Linje $1:',
'compareselectedversions' => 'Sammenlign valgte revisjoner',
'showhideselectedversions' => 'Vis/skjul valgte versjoner',
'editundo' => 'angre',
-'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} ikke vist.)',
+'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
# Search results
'searchresults' => 'Søkeresultat',
@@ -1146,6 +1156,7 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
'searchprofile-everything-tooltip' => 'Søk i alt innhold (inkldert diskusjonssider)',
'searchprofile-advanced-tooltip' => 'Søk i visse navnerom',
'search-result-size' => '$1 ({{PLURAL:$2|ett|$2}} ord)',
+'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})',
'search-result-score' => 'Relevans: $1&nbsp;%',
'search-redirect' => '(omdirigering $1)',
'search-section' => '(avsnitt $1)',
@@ -1221,6 +1232,7 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
'contextlines' => 'Linjer per resultat',
'contextchars' => 'Tegn per linje i resultatet',
'stub-threshold' => 'Grense for <span class="mw-stub-example">stubblenkeformatering</span>:',
+'stub-threshold-disabled' => 'Deaktivert',
'recentchangesdays' => 'Antall dager som skal vises i siste endringer:',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dag|dager}})',
'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
@@ -1254,6 +1266,7 @@ Her er et tilfeldig tall du kan bruke: $1',
'prefs-files' => 'Filer',
'prefs-custom-css' => 'Personlig CSS',
'prefs-custom-js' => 'Personlig Javascript',
+'prefs-common-css-js' => 'Delt CSS/JS for alle drakter:',
'prefs-reset-intro' => 'Du kan bruke denne siden til å tilbakestille innstillingene dine til standardinnstillingene.
Dette kan ikke tilbakestilles.',
'prefs-emailconfirm-label' => 'E-postbekreftelse:',
@@ -1290,9 +1303,15 @@ Du kan også la velge å la andre brukere kontakte deg via brukersiden din uten
'prefs-advancedrendering' => 'Avanserte alternativ',
'prefs-advancedsearchoptions' => 'Avanserte alternativ',
'prefs-advancedwatchlist' => 'Avanserte alternativ',
-'prefs-display' => 'Visningsalternativ',
+'prefs-displayrc' => 'Visningsalternativ',
+'prefs-displaysearchoptions' => 'Visningsalternativer',
+'prefs-displaywatchlist' => 'Visningsalternativer',
'prefs-diffs' => 'Forskjeller',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-postadressen ser gyldig ut',
+'email-address-validity-invalid' => 'Skriv inn en gyldig e-postadresse',
+
# User rights
'userrights' => 'Brukerrettighetskontroll',
'userrights-lookup-user' => 'Ordne brukergrupper',
@@ -1377,6 +1396,7 @@ Du kan også la velge å la andre brukere kontakte deg via brukersiden din uten
'right-hideuser' => 'Blokkere et brukernavn og skjule det fra det offentlige',
'right-ipblock-exempt' => 'Kan redigere fra blokkerte IP-adresser',
'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
+'right-unblockself' => 'Fjern blokkering av seg selv',
'right-protect' => 'Endre beskyttelsesnivåer',
'right-editprotected' => 'Redigere beskyttede sider',
'right-editinterface' => 'Redigere brukergrensesnittet',
@@ -1399,7 +1419,6 @@ Du kan også la velge å la andre brukere kontakte deg via brukersiden din uten
'right-siteadmin' => 'Låse og låse opp databasen',
'right-reset-passwords' => 'Nullstille andre brukeres passord',
'right-override-export-depth' => 'Eksporter sider inkludert lenkede sider til en dypde på 5',
-'right-versiondetail' => 'Vis utvidet informasjon om programvareversjon',
'right-sendemail' => 'Send e-post til andre brukere',
# User rights log
@@ -1450,14 +1469,9 @@ Du kan også la velge å la andre brukere kontakte deg via brukersiden din uten
'recentchanges-legend' => 'Alternativ for siste endringer',
'recentchangestext' => 'Vis de siste endringene til denne siden',
'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
-'recentchanges-label-legend' => 'Forklaring: $1.',
-'recentchanges-legend-newpage' => '$1 – ny side',
'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
-'recentchanges-legend-minor' => '$1 – mindre endring',
'recentchanges-label-minor' => 'Dette er en mindre endring',
-'recentchanges-legend-bot' => '$1 – botendring',
'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
-'recentchanges-legend-unpatrolled' => '$1 – upatruljert endring',
'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
'rcnote' => "Nedenfor vises {{PLURAL:$1|'''1''' endring|de siste '''$1''' endringene}} fra {{PLURAL:$2|det siste døgnet|de siste '''$2''' døgnene}}, per $5 $4.",
'rcnotefrom' => "Nedenfor er endringene fra '''$2''' (opp til '''$1''' vises).",
@@ -1504,6 +1518,9 @@ Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
'upload_directory_missing' => 'Oppplastingsmappen ($1) mangler og kunne ikke opprettes av tjeneren.',
'upload_directory_read_only' => 'Opplastingsmappa ($1) er ikke skrivbar for tjeneren.',
'uploaderror' => 'Feil under opplasting av fil',
+'upload-recreate-warning' => "'''Advarsel: En fil med det navnet har blitt slettet eller flyttet.'''
+
+Slette- og flytteloggen for denne siden gjengis her:",
'uploadtext' => "Bruk skjemaet nedenfor for å laste opp filer.
For å se eller søke i eksisterende filer, gå til [[Special:FileList|listen over filer]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]].
@@ -1538,6 +1555,17 @@ Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
'filetype-banned-type' => "'''«$1»''' er ikke en tillatt filtype.
{{PLURAL:$3|Tillatt filtype|Tillatte filtyper}} er $2.",
'filetype-missing' => 'Filen har ingen endelse (som «.jpg»).',
+'empty-file' => 'Filen du sendte inn var tom.',
+'file-too-large' => 'Filen du sendte inn var for stor.',
+'filename-tooshort' => 'Filnavnet er for kort.',
+'filetype-banned' => 'Denne filtypen er forbudt.',
+'verification-error' => 'Denne filen bestod ikke filbekreftelsen.',
+'hookaborted' => 'Endringene du prøvde å gjøre ble avbrutt av en utvidelseskrok.',
+'illegal-filename' => 'Filnavnet er ikke tillatt.',
+'overwrite' => 'Overskriving av eksisterende filer er ikke tillatt.',
+'unknown-error' => 'En ukjent feil oppsto.',
+'tmp-create-error' => 'Kunne ikke opprette midlertidig fil.',
+'tmp-write-error' => 'Feil ved skriving av midlertidig fil.',
'large-file' => 'Det er anbefalt at filen ikke er større enn $1; denne filen er $2.',
'largefileserver' => 'Denne fila er større enn det tjeneren er satt opp til å tillate.',
'emptyfile' => 'Fila du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne fila.',
@@ -1562,13 +1590,14 @@ Om du fortsatt ønsker å laste opp fila, gå tilbake og last den opp under et n
Om du fortsatt ønsker å laste opp fila, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Denne filen er en dublett av følgende {{PLURAL:$1|fil|filer}}:',
'file-deleted-duplicate' => 'En fil identisk med denne filen ([[:$1]]) har tidligere blitt slettet. Du bør sjekke denne filens slettehistorikk før du prøver å laste den opp på nytt.',
-'successfulupload' => 'Opplastingen er gjennomført',
'uploadwarning' => 'Opplastingsadvarsel',
'uploadwarning-text' => 'Vennligst endre filbeskrivelsen nedenfor og prøv igjen.',
'savefile' => 'Lagre fil',
'uploadedimage' => 'lastet opp «[[$1]]»',
'overwroteimage' => 'last opp en ny versjon av «[[$1]]»',
'uploaddisabled' => 'Opplastingsfunksjonen er slått av',
+'copyuploaddisabled' => 'Opplasting via nettadresse deaktivert.',
+'uploadfromurl-queued' => 'Opplastingen din har blitt satt i kø.',
'uploaddisabledtext' => 'Opplasting er slått av.',
'php-uploaddisabledtext' => 'PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.',
'uploadscripted' => 'Denne fila inneholder HTML eller skripting som kan feiltolkes av en nettleser.',
@@ -1600,6 +1629,14 @@ JD # Jenoptik
MGP # Pentax
PICT # div.
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'Opplastingen er gjennomført',
+'upload-success-msg' => 'Din opplasting fra [$2] var vellykket. Den er tilgjengelig her: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Opplastingsproblem',
+'upload-failure-msg' => 'Det oppsto et problem med opplastingen din fra [$2]:
+
+$1',
+'upload-warning-subj' => 'Opplastingsadvarsel',
+'upload-warning-msg' => 'Det oppsto et problem med opplastingen din fra [$2]. Du kan gå tilbake til [[Special:Upload/stash/$1|opplastingsskjemaet]] for å løse dette problemet.',
'upload-proto-error' => 'Gal protokoll',
'upload-proto-error-text' => 'Fjernopplasting behøver adresser som begynner med <code>http://</code> eller <code>ftp://</code>.',
@@ -1660,6 +1697,7 @@ For best mulig sikkerhet er img_auth.php slått av.',
'listfiles_search_for' => 'Søk etter filnavn:',
'imgfile' => 'fil',
'listfiles' => 'Filliste',
+'listfiles_thumb' => 'Miniatyrbilde',
'listfiles_date' => 'Dato',
'listfiles_name' => 'Navn',
'listfiles_user' => 'Bruker',
@@ -1772,8 +1810,8 @@ Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
'statistics-edits' => 'Redigeringer siden {{SITENAME}} ble opprettet',
'statistics-edits-average' => 'Gjennomsnittlig antall redigeringer per side',
'statistics-views-total' => 'Totalt antall visninger',
+'statistics-views-total-desc' => 'Visninger av ikke-eksisterende sider og spesielsider inkluderes ikke',
'statistics-views-peredit' => 'Visninger per redigering',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Jobbkøens] lengde',
'statistics-users' => 'Registrerte [[Special:ListUsers|brukere]]',
'statistics-users-active' => 'Aktive brukere',
'statistics-users-active-desc' => 'Brukere som har utført handlinger {{PLURAL:$1|det siste døgnet|de siste $1 dagene}}',
@@ -1788,7 +1826,7 @@ En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[
'doubleredirects' => 'Doble omdirigeringer',
'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
Hver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.
-<s>Gjennomstrøkne</s> sider har blitt fikset.',
+<del>Gjennomstrøkne</del> sider har blitt fikset.',
'double-redirect-fixed-move' => '[[$1]] har blitt flyttet, og er nå en omdirigering til [[$2]]',
'double-redirect-fixer' => 'Omdirigeringsfikser',
@@ -1811,6 +1849,8 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmer}}',
'nrevisions' => '$1 {{PLURAL:$1|revisjon|revisjoner}}',
'nviews' => '$1 {{PLURAL:$1|visning|visninger}}',
+'nimagelinks' => 'Brukt på $1 {{PLURAL:$1|side|sider}}',
+'ntransclusions' => 'brukt på $1 {{PLURAL:$1|side|sider}}',
'specialpage-empty' => 'Denne siden er tom.',
'lonelypages' => 'Foreldreløse sider',
'lonelypagestext' => 'Følgende sider blir ikke lenket til eller brukt på andre sider på {{SITENAME}}.',
@@ -1966,34 +2006,40 @@ Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrou
'listgrouprights-removegroup-self-all' => 'Kan ta bort alle grupper fra egen konto',
# E-mail user
-'mailnologin' => 'Ingen avsenderadresse',
-'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
-'emailuser' => 'E-post til denne brukeren',
-'emailpage' => 'E-post til bruker',
-'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
+'mailnologin' => 'Ingen avsenderadresse',
+'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
+'emailuser' => 'E-post til denne brukeren',
+'emailpage' => 'E-post til bruker',
+'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
Den e-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil dukke opp i «fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
-'usermailererror' => 'E-postobjekt returnerte feilen:',
-'defemailsubject' => 'E-post fra {{SITENAME}}',
-'noemailtitle' => 'Ingen e-postadresse',
-'noemailtext' => 'Dene brukeren har ikke oppgitt en gyldig e-postadresse.',
-'nowikiemailtitle' => 'Ingen e-post tillatt',
-'nowikiemailtext' => 'Denne brukeren har valgt å ikke motta e-post fra andre brukere.',
-'email-legend' => 'Send en e-post til en annen {{SITENAME}}-bruker',
-'emailfrom' => 'Fra:',
-'emailto' => 'Til:',
-'emailsubject' => 'Emne:',
-'emailmessage' => 'Beskjed:',
-'emailsend' => 'Send',
-'emailccme' => 'Send meg en kopi av beskjeden min.',
-'emailccsubject' => 'Kopi av din beskjed til $1: $2',
-'emailsent' => 'E-post sendt',
-'emailsenttext' => 'E-postbeskjeden er sendt',
-'emailuserfooter' => 'E-posten ble sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.',
+'usermailererror' => 'E-postobjekt returnerte feilen:',
+'defemailsubject' => 'E-post fra {{SITENAME}}',
+'usermaildisabled' => 'Brukerepost deaktivert',
+'usermaildisabledtext' => 'Du kan ikke sende epost til andre brukere på denne wikien',
+'noemailtitle' => 'Ingen e-postadresse',
+'noemailtext' => 'Dene brukeren har ikke oppgitt en gyldig e-postadresse.',
+'nowikiemailtitle' => 'Ingen e-post tillatt',
+'nowikiemailtext' => 'Denne brukeren har valgt å ikke motta e-post fra andre brukere.',
+'email-legend' => 'Send en e-post til en annen {{SITENAME}}-bruker',
+'emailfrom' => 'Fra:',
+'emailto' => 'Til:',
+'emailsubject' => 'Emne:',
+'emailmessage' => 'Beskjed:',
+'emailsend' => 'Send',
+'emailccme' => 'Send meg en kopi av beskjeden min.',
+'emailccsubject' => 'Kopi av din beskjed til $1: $2',
+'emailsent' => 'E-post sendt',
+'emailsenttext' => 'E-postbeskjeden er sendt',
+'emailuserfooter' => 'E-posten ble sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Etterlater en systembeskjed.',
+'usermessage-editor' => 'Systembudbringer',
# Watchlist
'watchlist' => 'Overvåkningsliste',
'mywatchlist' => 'Overvåkningsliste',
-'watchlistfor' => "(for '''$1''')",
+'watchlistfor2' => 'For $1 $2',
'nowatchlist' => 'Du har ingenting i overvåkningslisten.',
'watchlistanontext' => 'Vennligst $1 for å vise eller redigere sider på overvåkningslisten din.',
'watchnologin' => 'Ikke logget inn',
@@ -2037,6 +2083,7 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
'enotif_anon_editor' => 'anonym bruker $1',
'enotif_body' => 'Kjære $WATCHINGUSERNAME,
+
{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED den $PAGEEDITDATE av $PAGEEDITOR, se $PAGETITLE_URL for den nåværende revisjonen.
$NEWPAGE
@@ -2047,20 +2094,22 @@ Kontakt brukeren:
e-post: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Det vil ikke komme flere påminnelser om endringer på denne siden med mindre du besøker den.
-Du kan også fjerne påminnelsesflagg for alle sider i overvåkningslisten din.
+Det vil ikke komme flere varsler om endringer på denne siden med mindre du besøker den.
+Du kan også fjerne varslingsflagg for alle overvåkede sider i overvåkningslisten din.
-Med vennlig hilsen,
-{{SITENAME}}s påminnelsessystem
+ Ditt vennlige varslingssystem for {{SITENAME}}
--
-For å endre innstillingene i overvåkningslisten din, besøk
+For å endre innstillingene for e-postvarsler, se
+{{fullurl:{{#special:Preferences}}}}
+
+For å endre innstillingene for overvåkningslisten, se
{{fullurl:{{#special:Watchlist}}/edit}}
-For å slette siden fra overvåkningslisten din, besøk
+For å slette en side fra overvåkningssiden, se
$UNWATCHURL
-Tilbakemeldinger og videre assistanse:
+Tilbakemelding og videre assistanse:
{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
@@ -2109,7 +2158,10 @@ Den siste redigeringen ble foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]
'revertpage' => 'Tilbakestilte endring av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til siste versjon av [[User:$1|$1]]',
'revertpage-nouser' => 'Tilbakestilte endringer av (fjernet brukernavn) til siste versjon av [[User:$1|$1]]',
'rollback-success' => 'Tilbakestilte endringer av $1; endret til siste versjon av $2.',
-'sessionfailure' => "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
+
+# Edit tokens
+'sessionfailure-title' => 'Sesjonsfeil',
+'sessionfailure' => "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
# Protect
'protectlogpage' => 'Beskyttelseslogg',
@@ -2234,19 +2286,23 @@ $1',
'month' => 'Fra måned (og tidligere):',
'year' => 'Fra år (og tidligere):',
-'sp-contributions-newbies' => 'Vis kun bidrag fra nye kontoer',
-'sp-contributions-newbies-sub' => 'For nybegynnere',
-'sp-contributions-newbies-title' => 'Bidrag av nye kontoer',
-'sp-contributions-blocklog' => 'blokkeringslogg',
-'sp-contributions-deleted' => 'slettede brukerbidrag',
-'sp-contributions-logs' => 'logger',
-'sp-contributions-talk' => 'diskusjon',
-'sp-contributions-userrights' => 'brukerrettighetskontroll',
-'sp-contributions-blocked-notice' => 'Denne brukeren er for tiden blokkert.
+'sp-contributions-newbies' => 'Vis kun bidrag fra nye kontoer',
+'sp-contributions-newbies-sub' => 'For nybegynnere',
+'sp-contributions-newbies-title' => 'Bidrag av nye kontoer',
+'sp-contributions-blocklog' => 'blokkeringslogg',
+'sp-contributions-deleted' => 'slettede brukerbidrag',
+'sp-contributions-uploads' => 'opplastinger',
+'sp-contributions-logs' => 'logger',
+'sp-contributions-talk' => 'diskusjon',
+'sp-contributions-userrights' => 'brukerrettighetskontroll',
+'sp-contributions-blocked-notice' => 'Denne brukeren er for tiden blokkert.
Siste blokkeringsloggelement kan sees nedenfor.',
-'sp-contributions-search' => 'Søk etter bidrag',
-'sp-contributions-username' => 'IP-adresse eller brukernavn:',
-'sp-contributions-submit' => 'Søk',
+'sp-contributions-blocked-notice-anon' => 'Denne IP-adressen er for tiden blokkert.
+Den siste oppføringen i blokkeringsloggen er vist nedenfor som referanse:',
+'sp-contributions-search' => 'Søk etter bidrag',
+'sp-contributions-username' => 'IP-adresse eller brukernavn:',
+'sp-contributions-toponly' => 'Vis kun endringer som er gjeldende revisjoner',
+'sp-contributions-submit' => 'Søk',
# What links here
'whatlinkshere' => 'Lenker hit',
@@ -2305,7 +2361,6 @@ Se [[Special:IPBlockList|blokkeringslisten]] for alle blokkeringer.',
'ipb-edit-dropdown' => 'Rediger blokkeringsgrunner',
'ipb-unblock-addr' => 'Avblokker $1',
'ipb-unblock' => 'Avblokker et brukernavn eller en IP-adresse',
-'ipb-blocklist-addr' => 'Gjeldende blokkeringer av $1',
'ipb-blocklist' => 'Vis gjeldende blokkeringer',
'ipb-blocklist-contribs' => 'Bidrag fra $1',
'unblockip' => 'Opphev blokkering',
@@ -2374,6 +2429,8 @@ $1 er blokkert fra før. Vil du endre innstillingene?',
'sorbs_create_account_reason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto',
'cant-block-while-blocked' => 'Du kan ikke blokkere andre mens du selv er blokkert.',
'cant-see-hidden-user' => 'Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.',
+'ipbblocked' => 'Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert',
+'ipbnounblockself' => 'Du har ikke tillatelse til å avblokkere deg selv',
# Developer tools
'lockdb' => 'LÃ¥s database',
@@ -2414,6 +2471,17 @@ Det betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil
'''Advarsel!'''
Dette kan være en drastisk og uventet endring for en populær side;
vær sikker på at du forstår konsekvensene av dette før du fortsetter.",
+'movepagetext-noredirectfixer' => "Skjemaet nedenfor vil gi en side ny tittel og flytte historikken dens til det nye navnet.
+Den gamle tittelen vil bli en omdirigering til den nye.
+Sjekk om det blir [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
+Du er ansvarlig for å sjekke at lenker fortsetter å gå dit de skal.
+
+Merk at sider '''ikke''' blir flyttet om det allerede finnes en side med den tittelen, med mindre siden er tom eller en omdirigering og ikke har noen redigeringshistorikk.
+Dette betyr at du kan endre tittelen til en tittel siden hadde tidligere, og at du ikke kan skrive over en eksisterende side.
+
+'''Advarsel!'''
+Dette kan være en drastisk og uventen endring for en populær side;
+vær sikker på at du forstår konsekvensene av dette før du fortsetter.",
'movepagetalktext' => "Den tilhørende diskusjonssiden vil automatisk bli flyttet sammen med siden '''med mindre:'''
*Det allerede finnes en diskusjonsside som ikke er tom under det nye navnet, eller
*Du fjerner markeringen i boksen nedenfor.
@@ -2469,6 +2537,7 @@ Målsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan fly
'immobile-source-page' => 'Denne siden kan ikke flyttes.',
'immobile-target-page' => 'Kan ikke flytte til det navnet.',
'imagenocrossnamespace' => 'Kan ikke flytte filer til andre navnerom enn filnavnerommet',
+'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til filnavnerom',
'imagetypemismatch' => 'Den nye filendelsen tilsvarer ikke filtypen',
'imageinvalidfilename' => 'MÃ¥lnavnet er ugyldig',
'fix-double-redirects' => 'Oppdater omdirigeringer som fører til den gamle tittelen',
@@ -2547,6 +2616,7 @@ Lagre den på din egen datamaskin og last den opp her.',
'importstart' => 'Importerer sider&nbsp;…',
'import-revision-count' => '({{PLURAL:$1|Én revisjon|$1 revisjoner}})',
'importnopages' => 'Ingen sider å importere.',
+'imported-log-entries' => 'Importerte $1 {{PLURAL:$1|loggoppføring|loggoppføringer}}.',
'importfailed' => 'Importering mislyktes: $1',
'importunknownsource' => 'Ukjent importkildetype',
'importcantopen' => 'Kunne ikke åpne importfil',
@@ -2640,6 +2710,8 @@ Du kan se på kildeteksten',
'tooltip-upload' => 'Start opplasting',
'tooltip-rollback' => '«Tilbakestill»-knappen tilbakestiller den siste bidragsyterens endring(er) på denne siden med ett klikk',
'tooltip-undo' => '«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.',
+'tooltip-preferences-save' => 'Lagre innstillinger',
+'tooltip-summary' => 'Skriv et kort sammendrag',
# Stylesheets
'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
@@ -2766,14 +2838,17 @@ Ved å åpne den kan systemet ditt kompromitteres.",
'imagemaxsize' => "Bildestørrelsesgrense:<br />''(for filbeskrivelsessider)''",
'thumbsize' => 'Miniatyrbildestørrelse:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|én side|$3 sider}}',
-'file-info' => '(filstørrelse: $1, MIME-type: $2)',
-'file-info-size' => '($1 × $2 piksler, filstørrelse: $3, MIME-type: $4)',
+'file-info' => 'filstørrelse: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4',
'file-nohires' => '<small>Ingen høyere oppløsning tilgjengelig.</small>',
-'svg-long-desc' => '(SVG-fil, standardoppløsning $1 × $2 piksler, filstørrelse: $3)',
+'svg-long-desc' => 'SVG-fil, standardoppløsning $1 × $2 piksler, filstørrelse: $3',
'show-big-image' => 'Full oppløsning',
'show-big-image-thumb' => '<small>Størrelse på denne forhåndsvisningen: $1 × $2 piksler</small>',
'file-info-gif-looped' => 'gjentas',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ramme|rammer}}',
+'file-info-png-looped' => 'loopet',
+'file-info-png-repeat' => 'avspilt $1 {{PLURAL:$1|gang|ganger}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|bilde|bilder}}',
# Special:NewFiles
'newimages' => 'Galleri over nye filer',
@@ -2932,6 +3007,7 @@ Andre vil skjules som standard.
'exif-gpsareainformation' => 'Navn på GPS-område',
'exif-gpsdatestamp' => 'GPS-dato',
'exif-gpsdifferential' => 'Differentiell GPS-korreksjon',
+'exif-objectname' => 'Kort tittel',
# EXIF attributes
'exif-compression-1' => 'Ukomprimert',
@@ -3093,24 +3169,24 @@ Rotert 90° mot klokka og vridd vertikalt',
'limitall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'Bekreft e-postadresse',
-'confirmemail_noemail' => 'Du har ikke oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].',
-'confirmemail_text' => 'Du må bekrefte e-postadressen din før du kan benytte deg av e-posttjenester på {{SITENAME}}. Trykk på knappen under for å sende en bekreftelsesmelding til e-postadressen din. Meldingen vil inneholde en lenke med en kode; følg lenken for å bekrefte at e-postadressen er gyldig.',
-'confirmemail_pending' => 'En bekreftelseskode har allerede blitt sendt til deg på e-post; om du nylig opprettet kontoen din, kan du ønske å vente noen minutter før du spør om ny kode.',
-'confirmemail_send' => 'Send en bekreftelseskode.',
-'confirmemail_sent' => 'Bekreftelsesmelding sendt.',
-'confirmemail_oncreate' => 'En bekreftelseskode ble sendt til din e-postadresse. Denne koden er ikke nødvendig for å logge inn, men er nødvendig for å slå på e-postbaserte tjenester i denne wikien.',
-'confirmemail_sendfailed' => '{{SITENAME}} klarte ikke å sende bekreftelseskode.
+'confirmemail' => 'Bekreft e-postadresse',
+'confirmemail_noemail' => 'Du har ikke oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].',
+'confirmemail_text' => 'Du må bekrefte e-postadressen din før du kan benytte deg av e-posttjenester på {{SITENAME}}. Trykk på knappen under for å sende en bekreftelsesmelding til e-postadressen din. Meldingen vil inneholde en lenke med en kode; følg lenken for å bekrefte at e-postadressen er gyldig.',
+'confirmemail_pending' => 'En bekreftelseskode har allerede blitt sendt til deg på e-post; om du nylig opprettet kontoen din, kan du ønske å vente noen minutter før du spør om ny kode.',
+'confirmemail_send' => 'Send en bekreftelseskode.',
+'confirmemail_sent' => 'Bekreftelsesmelding sendt.',
+'confirmemail_oncreate' => 'En bekreftelseskode ble sendt til din e-postadresse. Denne koden er ikke nødvendig for å logge inn, men er nødvendig for å slå på e-postbaserte tjenester i denne wikien.',
+'confirmemail_sendfailed' => '{{SITENAME}} klarte ikke å sende bekreftelseskode.
Sjekk e-postadressen for ugyldige tegn.
E-postsenderen ga følgende melding: $1',
-'confirmemail_invalid' => 'Ugyldig bekreftelseskode. Koden kan ha utløpt.',
-'confirmemail_needlogin' => 'Du må $1 for å bekrefte e-postadressen din.',
-'confirmemail_success' => 'Din e-postadresse er nå bekreftet. Du kan nå logge inn og nyte wikien.',
-'confirmemail_loggedin' => 'E-postadressen din er bekreftet.',
-'confirmemail_error' => 'Noe gikk galt under lagringen av din bekreftelse.',
-'confirmemail_subject' => 'Bekreftelsesmelding fra {{SITENAME}}',
-'confirmemail_body' => 'Noen, antageligvis deg, har registrert kontoen «$2» på {{SITENAME}}, fra IP-adressen $1.
+'confirmemail_invalid' => 'Ugyldig bekreftelseskode. Koden kan ha utløpt.',
+'confirmemail_needlogin' => 'Du må $1 for å bekrefte e-postadressen din.',
+'confirmemail_success' => 'Din e-postadresse er nå bekreftet. Du kan nå logge inn og nyte wikien.',
+'confirmemail_loggedin' => 'E-postadressen din er bekreftet.',
+'confirmemail_error' => 'Noe gikk galt under lagringen av din bekreftelse.',
+'confirmemail_subject' => 'Bekreftelsesmelding fra {{SITENAME}}',
+'confirmemail_body' => 'Noen, antageligvis deg, har registrert kontoen «$2» på {{SITENAME}}, fra IP-adressen $1.
For å bekrefte at denne kontoen tilhører deg og for å aktivere e-posttjenester på {{SITENAME}}, åpne følgende lenke i nettleseren din:
@@ -3121,8 +3197,32 @@ Om du *ikke* registrerte kontoen, følg denne lenken for å avbryte bekreftelse
$5
Denne bekreftelseskoden utgår $4.',
-'confirmemail_invalidated' => 'Bekreftelse av e-postadresse avbrutt',
-'invalidateemail' => 'Avbryt bekreftelse av e-postadresse',
+'confirmemail_body_changed' => 'Noen, antageligvis deg, fra IP-adresse $1,
+har endret e-postadressen til kontoen «$2» til denne adressen på {{SITENAME}}.
+
+For å bekrefte at denne kontoen virkelig er din og for å reaktivere e-postegenskaper på {{SITENAME}}, åpne denne lenken i nettleseren din:
+
+$3
+
+Dersom denne kontoen *ikke* tilhører deg, følg denne lenken
+for å avbryte e-postbekreftelsen:
+
+$5
+
+Denne bekreftelseskoden vil løpe ut $4.',
+'confirmemail_body_set' => 'Noen, trolig deg, har satt e-postadressen for kontoen «$2» til denne adressen på {{SITENAME}}, fra IP-adressen $1.
+
+For å bekrefte at denne kontoen tilhører deg og for å slå på e-posttjenestene på {{SITENAME}}, åpne denne lenka i nettleseren din:
+
+$3
+
+Om kontoen *ikke* tilhører deg, følg denne lenka for å avbryte bekreftelsen:
+
+$5
+
+Denne bekreftelseskoden går ut på dato $4.',
+'confirmemail_invalidated' => 'Bekreftelse av e-postadresse avbrutt',
+'invalidateemail' => 'Avbryt bekreftelse av e-postadresse',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-transkludering er slått av]',
@@ -3160,6 +3260,7 @@ $1',
'table_pager_first' => 'Første side',
'table_pager_last' => 'Siste side',
'table_pager_limit' => 'Vis $1 elementer per side',
+'table_pager_limit_label' => 'Element per side:',
'table_pager_limit_submit' => 'GÃ¥',
'table_pager_empty' => 'Ingen resultater',
@@ -3170,7 +3271,7 @@ $1',
'autosumm-new' => 'Ny side: $1',
# Live preview
-'livepreview-loading' => 'Laster&nbsp;…',
+'livepreview-loading' => 'Laster…',
'livepreview-ready' => 'Laster&nbsp;… Klar!',
'livepreview-failed' => 'Levende forhåndsvisning mislyktes. Prøv vanlig forhåndsvisning.',
'livepreview-error' => 'Tilkobling mislyktes: $1 «$2»
@@ -3247,6 +3348,7 @@ Du kan også [[Special:Watchlist/edit|bruke standardverktøyet]].',
'version-specialpages' => 'Spesialsider',
'version-parserhooks' => 'Parsertillegg',
'version-variables' => 'Variabler',
+'version-skins' => 'Drakter',
'version-other' => 'Annet',
'version-mediahandlers' => 'Mediahåndterere',
'version-hooks' => 'Haker',
@@ -3258,6 +3360,13 @@ Du kan også [[Special:Watchlist/edit|bruke standardverktøyet]].',
'version-hook-subscribedby' => 'Brukes av',
'version-version' => '(versjon $1)',
'version-license' => 'Lisens',
+'version-poweredby-credits' => "Denne wikien er drevet av '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'andre',
+'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
+
+MediaWiki er distribuert i håp om at det vil være nyttig, men UTEN NOEN GARANTI; ikke engang implisitt garanti av SALGBARHET eller EGNETHET FOR ET BESTEMT FORMÅL. Se GNU General Public License for flere detaljer.
+
+Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Public License] sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html les det på nettet].',
'version-software' => 'Installert programvare',
'version-software-product' => 'Produkt',
'version-software-version' => 'Versjon',
@@ -3326,6 +3435,15 @@ Skriv inn filnavn uten «{{ns:file}}:»-prefikset.',
'tags-edit' => 'rediger',
'tags-hitcount' => '{{PLURAL:$1|én endring|$1 endringer}}',
+# Special:ComparePages
+'comparepages' => 'Sammenlign sider',
+'compare-selector' => 'Sammenlign siderevisjoner',
+'compare-page1' => 'Side 1',
+'compare-page2' => 'Side 2',
+'compare-rev1' => 'Revisjon 1',
+'compare-rev2' => 'Revisjon 2',
+'compare-submit' => 'Sammenlign',
+
# Database error messages
'dberr-header' => 'Wikien har et problem',
'dberr-problems' => 'Siden har tekniske problemer.',
@@ -3342,8 +3460,13 @@ Skriv inn filnavn uten «{{ns:file}}:»-prefikset.',
'htmlform-float-invalid' => 'Verdien du valgte er ikke et tall.',
'htmlform-int-toolow' => 'Verdien du valgte er mindre enn minimum på $1',
'htmlform-int-toohigh' => 'Verdien du valgte er over det mulige $1',
+'htmlform-required' => 'Denne verdien er påkrevd',
'htmlform-submit' => 'Lagre',
'htmlform-reset' => 'Omgjør endringer',
'htmlform-selectorother-other' => 'Andre',
+# SQLite database support
+'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
+'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
+
);
diff --git a/languages/messages/MessagesNov.php b/languages/messages/MessagesNov.php
index 5c8cd408..79f06b8e 100644
--- a/languages/messages/MessagesNov.php
+++ b/languages/messages/MessagesNov.php
@@ -170,7 +170,7 @@ $messages = array(
Vu pove kontinua usa {{SITENAME}} anonimim, o vu pove riensignata kom li sami o altri usere.",
'yourname' => 'Usere-nome:',
'yourpassword' => 'Pasa-vorde:',
-'remembermypassword' => 'Memora men pasa-vorde (kun kuke)',
+'remembermypassword' => 'Memora men pasa-vorde (kun kuke) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Ensignata',
'loginprompt' => 'Vu mus lasa cookies de ensignata en {{SITENAME}}.',
'userlogin' => 'Ensignata / krea usere-registre',
diff --git a/languages/messages/MessagesNso.php b/languages/messages/MessagesNso.php
index 993b79a1..b733dac4 100644
--- a/languages/messages/MessagesNso.php
+++ b/languages/messages/MessagesNso.php
@@ -51,8 +51,7 @@ $messages = array(
'tog-editsection' => 'Dumella go fetola sekgao ka [fetola] hlomaganyo',
'tog-editsectiononrightclick' => 'Dumella go fetola sekgao ka thathapa ka lagoja thaetlele ya sekgao (JavaScript)',
'tog-showtoc' => 'Bontšha Tatelano ya dikagare (go matlakala a goba le dihlogo tša go feta 3)',
-'tog-rememberpassword' => 'Gopola sedi ya go tsena yaka go khomphutha ye',
-'tog-editwidth' => 'Lepokisi la diphetogo lebe le bophara ba go tlala',
+'tog-rememberpassword' => 'Gopola sedi yaka ya go tsena khomphutha ye (bogolo bja $1 bja {{PLURAL:$1| ya letšatši le|ya matšatši}})',
'tog-watchcreations' => 'Tsenya matlaka a mafsa ao ke a ngwalago go lenano laka la ditlhapetšo',
'tog-watchdefault' => 'Tsenya matlaka ao ke a fetolago go lenano laka la ditlhapetšo',
'tog-watchmoves' => 'Tsenya matlaka ao ke a hudušago go lenano laka la ditlhapetšo',
@@ -157,9 +156,6 @@ $messages = array(
'qbmyoptions' => 'Matlakala a ka',
'qbspecialpages' => 'Matlakala a itšego',
-# Vector skin
-'vector-namespace-main' => 'Letlakala',
-
'errorpagetitle' => 'Phošo',
'returnto' => 'Boela go $1.',
'tagline' => 'Gotšwa go {{SITENAME}}',
@@ -311,7 +307,7 @@ TÅ¡hupaleloko (''account'') ya gago e tlhodilwe. O seke wa lebala go fetola [[Sp
'yourname' => 'Leina la mošomiši:',
'yourpassword' => 'Ditlhaka-tša-siphiri:',
'yourpasswordagain' => 'Tlanya ditlhaka-tša-siphiri gape:',
-'remembermypassword' => 'Gopola sedi yaka ya go tsena khômphutha ye',
+'remembermypassword' => 'Gopola sedi yaka ya go tsena khomphutha ye (bogolo bja $1 ya {{PLURAL:$1| letšatši le|matšatši a}})',
'login' => 'Tsena',
'nav-login-createaccount' => "Tsena / Tlhola tšhupaleloko (''account'')",
'loginprompt' => "O swanela ke go dumella ''cookies'' go ''browser'' go tsena go {{SITENAME}}.",
@@ -325,6 +321,7 @@ TÅ¡hupaleloko (''account'') ya gago e tlhodilwe. O seke wa lebala go fetola [[Sp
'gotaccount' => "O šetše o nale tšhupaleloko? '''$1'''.",
'gotaccountlink' => 'Tsena',
'createaccountmail' => 'ka e-mail',
+'createaccountreason' => 'Lebaka:',
'badretype' => 'Ditlhaka-tša-siphiri tše o di šomišitšego ga di swane.',
'noname' => 'Gawa fana ka leina la mošomiši la go loka.',
'loginsuccesstitle' => 'O tsene ka katlego',
@@ -454,10 +451,6 @@ oka [[Special:Search/{{PAGENAME}}|fetleka liena la letlakala]] matlakaleng a man
'copyrightwarning' => "Diabe kamoka go {{SITENAME}} di akanywa go ngwadiwa tlase ga $2 (lebelela $1 go hwetša taba ka bophara). Ge o sa nyake gore mengwalo ya gago e fetolwe ntle le kgaugelo goba e phatlalatšwe ntle le tumello ya gago, o seke wa fana ka mengwalo mo.<br />
Gape o re holofetša gore mengwalo ye e ngwadile ke wena, goba o e kopiša mothapong wa pepeneneng goba ke mahala.
'''O SE TSENYE MEÅ OMO YA BATHO BA BANGWE NTLE LE TUMELLO YA BONA!'''",
-'longpagewarning' => "'''TEMOÅ O: Letlakala le le $1 kilobytes ka botelele;
-di-''browser'' tše dingwe dika ba le bothata go fetola matlakala a golena goba gofeta 32 kb.
-
-Ka kgopela akanya ka go roba letlakala le goba le dikgaoe tše nnyenyane.'''",
'templatesused' => '"{{PLURAL:$1|Template yeo e|Di-Template tšeo di}}\'\' šomišitšwego letlakaleng le:',
'templatesusedpreview' => '{{PLURAL:$1|"Template" yeo e|"DiTemplate" tšeo di}} šomišitšwego go taetšo ya sebopego sa letlakala:',
'template-protected' => '(e lotilwe)',
@@ -833,7 +826,6 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
# Watchlist
'watchlist' => 'Lenano la ditlhapetšo tša ka',
'mywatchlist' => 'Lenano la ditlhapetšo tša ka',
-'watchlistfor' => "(ya '''$1''')",
'addedwatch' => 'Loketšwe go lenano la ditlhapetšo',
'addedwatchtext' => "Letlakala \"[[:\$1]]\" le tsene go [[Special:Watchlist|watchlist]] ya gago.
Go tloga bjale, diphetogo letlakaleng le, le letlakaleng la dipoledišano la gona, di tla bontšhwa ka mongalo wa '''bold''' gare ga [[Special:RecentChanges|list of recent changes]] gore go be bonolo gore oa bone.
@@ -1128,9 +1120,9 @@ $1',
# Media information
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|letlakala|matlakala}}',
-'file-info-size' => '($1 × $2 pixel, bogolo ba faele: $3, Mohuta wa MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, bogolo ba faele: $3, Mohuta wa MIME: $4',
'file-nohires' => "<small>Gago ''resolution'' ya go feta mo.</small>",
-'svg-long-desc' => '(SVG faele, nominally $1 × $2 pixels, bogolo ba faele: $3)',
+'svg-long-desc' => 'SVG faele, nominally $1 × $2 pixels, bogolo ba faele: $3',
'show-big-image' => "''resolution'' ya gofella",
'show-big-image-thumb' => '<small>Bogolo ba pono: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesNv.php b/languages/messages/MessagesNv.php
index 1d290cf4..a1326e09 100644
--- a/languages/messages/MessagesNv.php
+++ b/languages/messages/MessagesNv.php
@@ -164,7 +164,7 @@ $messages = array(
# Login and logout pages
'yourname' => 'Choyoołʼįįhí bizhiʼ:',
'yourpassword' => 'Passwordígíí:',
-'remembermypassword' => 'shipassword béédíínih',
+'remembermypassword' => 'shipassword béédíínih (for a maximum of $1 {{PLURAL:$1|day|days}})',
'nav-login-createaccount' => 'Log in / accountígíí ádíílííł',
'nologinlink' => 'Accountígíí ádíílííł',
'mailmypassword' => 'passwordígíí ániidí shichʼįʼ ádíílííł (e-mail)',
@@ -288,7 +288,6 @@ $3',
# Watchlist
'watchlist' => 'bikʼi déshʼįÌįÌʼígíí',
'mywatchlist' => 'bikʼi déshʼįÌįÌʼígíí',
-'watchlistfor' => "('''$1''')",
'addedwatchtext' => "[[Special:Watchlist|Naaltsoos bikʼi díníʼįÌįÌʼígíí]] bíhiniidééh. \"[[:\$1]]\" kʼad bikʼi díníʼįÌįÌʼ.<br />Nááná [[Special:RecentChanges|\"áníídí Å‚ahgo ályaaígíí\"]] bikáaʼgi díí naaltsoos kʼad kodóó '''ditÄ…ÌÄ…''' dooleeÅ‚.",
'removedwatchtext' => '"[[:$1]]" kʼad doo [[Special:Watchlist|bikʼi díníʼįÌį]] da.',
'watch' => 'bikʼi déshʼįÌįÌʼ nisin',
diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php
index 8458ee0a..db079055 100644
--- a/languages/messages/MessagesOc.php
+++ b/languages/messages/MessagesOc.php
@@ -55,91 +55,91 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redireccions doblas', 'RedireccionsDoblas' ),
- 'BrokenRedirects' => array( 'Redireccions copadas', 'RedireccionsCopadas' ),
- 'Disambiguations' => array( 'Omonimia', 'Omonimias', 'Paginas d\'omonimia' ),
- 'Userlogin' => array( 'Nom d\'utilizaire' ),
+ 'DoubleRedirects' => array( 'Redireccions_doblas', 'RedireccionsDoblas' ),
+ 'BrokenRedirects' => array( 'Redireccions_copadas', 'RedireccionsCopadas' ),
+ 'Disambiguations' => array( 'Omonimia', 'Omonimias', 'Paginas_d\'omonimia' ),
+ 'Userlogin' => array( 'Nom_d\'utilizaire' ),
'Userlogout' => array( 'Desconnexion' ),
- 'CreateAccount' => array( 'Crear un compte', 'CrearUnCompte', 'CrearCompte' ),
+ 'CreateAccount' => array( 'Crear_un_compte', 'CrearUnCompte', 'CrearCompte' ),
'Preferences' => array( 'Preferéncias' ),
- 'Watchlist' => array( 'Lista de seguit', 'ListraDeSeguit', 'Seguit', 'Lista de seguiment', 'ListraDeSeguiment', 'Seguiment' ),
- 'Recentchanges' => array( 'Darrièrs cambiaments', 'DarrièrsCambiaments', 'Darrièras Modificacions' ),
+ 'Watchlist' => array( 'Lista_de_seguit', 'ListraDeSeguit', 'Seguit', 'Lista_de_seguiment', 'ListraDeSeguiment', 'Seguiment' ),
+ 'Recentchanges' => array( 'Darrièrs_cambiaments', 'DarrièrsCambiaments', 'Darrièras_Modificacions' ),
'Upload' => array( 'Telecargament', 'Telecargaments' ),
- 'Listfiles' => array( 'Lista dels imatges', 'ListaDelsImatges' ),
- 'Newimages' => array( 'Imatges novèls', 'ImatgesNovèls' ),
- 'Listusers' => array( 'Lista dels utilizaires', 'ListaDelsUtilizaires' ),
- 'Listgrouprights' => array( 'Lista dels gropes utilizaire', 'ListadelsGropesUtilizaire', 'ListaGropesUtilizaire', 'Tièra dels gropes utilizaire', 'TièradelsGropesUtilizaire', 'TièraGropesUtilizaire' ),
+ 'Listfiles' => array( 'Lista_dels_imatges', 'ListaDelsImatges' ),
+ 'Newimages' => array( 'Imatges_novèls', 'ImatgesNovèls' ),
+ 'Listusers' => array( 'Lista_dels_utilizaires', 'ListaDelsUtilizaires' ),
+ 'Listgrouprights' => array( 'Lista_dels_gropes_utilizaire', 'ListadelsGropesUtilizaire', 'ListaGropesUtilizaire', 'Tièra_dels_gropes_utilizaire', 'TièradelsGropesUtilizaire', 'TièraGropesUtilizaire' ),
'Statistics' => array( 'Estatisticas', 'Stats' ),
- 'Randompage' => array( 'Pagina a l\'azard' ),
- 'Lonelypages' => array( 'Paginas orfanèlas' ),
- 'Uncategorizedpages' => array( 'Paginas sens categoria' ),
- 'Uncategorizedcategories' => array( 'Categorias sens categoria' ),
- 'Uncategorizedimages' => array( 'Imatges sens categoria' ),
- 'Uncategorizedtemplates' => array( 'Modèls sens categoria' ),
- 'Unusedcategories' => array( 'Categorias inutilizadas' ),
- 'Unusedimages' => array( 'Imatges inutilizats' ),
- 'Wantedpages' => array( 'Paginas demandadas' ),
- 'Wantedcategories' => array( 'Categorias demandadas' ),
- 'Wantedfiles' => array( 'Fichièrs demandats', 'FichièrsDemandats' ),
- 'Wantedtemplates' => array( 'Modèls demandats', 'ModèlsDemandats' ),
- 'Mostlinked' => array( 'Imatges mai utilizats' ),
- 'Mostlinkedcategories' => array( 'Categorias mai utilizadas', 'CategoriasMaiUtilizadas' ),
- 'Mostlinkedtemplates' => array( 'Modèls mai utilizats', 'ModèlsMaiUtilizats' ),
- 'Mostimages' => array( 'Mai d\'imatges' ),
- 'Mostcategories' => array( 'Mai de categorias' ),
- 'Mostrevisions' => array( 'Mai de revisions' ),
- 'Fewestrevisions' => array( 'Mens de revisions' ),
- 'Shortpages' => array( 'Articles brèus' ),
- 'Longpages' => array( 'Articles longs' ),
- 'Newpages' => array( 'Paginas novèlas' ),
- 'Ancientpages' => array( 'Paginas ancianas' ),
- 'Deadendpages' => array( 'Paginas sul camin d\'enlòc' ),
- 'Protectedpages' => array( 'Paginas protegidas' ),
- 'Protectedtitles' => array( 'Títols protegits', 'TítolsProtegits' ),
- 'Allpages' => array( 'Totas las paginas' ),
+ 'Randompage' => array( 'Pagina_a_l\'azard' ),
+ 'Lonelypages' => array( 'Paginas_orfanèlas' ),
+ 'Uncategorizedpages' => array( 'Paginas_sens_categoria' ),
+ 'Uncategorizedcategories' => array( 'Categorias_sens_categoria' ),
+ 'Uncategorizedimages' => array( 'Imatges_sens_categoria' ),
+ 'Uncategorizedtemplates' => array( 'Modèls_sens_categoria' ),
+ 'Unusedcategories' => array( 'Categorias_inutilizadas' ),
+ 'Unusedimages' => array( 'Imatges_inutilizats' ),
+ 'Wantedpages' => array( 'Paginas_demandadas' ),
+ 'Wantedcategories' => array( 'Categorias_demandadas' ),
+ 'Wantedfiles' => array( 'Fichièrs_demandats', 'FichièrsDemandats' ),
+ 'Wantedtemplates' => array( 'Modèls_demandats', 'ModèlsDemandats' ),
+ 'Mostlinked' => array( 'Imatges_mai_utilizats' ),
+ 'Mostlinkedcategories' => array( 'Categorias_mai_utilizadas', 'CategoriasMaiUtilizadas' ),
+ 'Mostlinkedtemplates' => array( 'Modèls_mai_utilizats', 'ModèlsMaiUtilizats' ),
+ 'Mostimages' => array( 'Mai_d\'imatges' ),
+ 'Mostcategories' => array( 'Mai_de_categorias' ),
+ 'Mostrevisions' => array( 'Mai_de_revisions' ),
+ 'Fewestrevisions' => array( 'Mens_de_revisions' ),
+ 'Shortpages' => array( 'Articles_brèus' ),
+ 'Longpages' => array( 'Articles_longs' ),
+ 'Newpages' => array( 'Paginas_novèlas' ),
+ 'Ancientpages' => array( 'Paginas_ancianas' ),
+ 'Deadendpages' => array( 'Paginas_sul_camin_d\'enlòc' ),
+ 'Protectedpages' => array( 'Paginas_protegidas' ),
+ 'Protectedtitles' => array( 'Títols_protegits', 'TítolsProtegits' ),
+ 'Allpages' => array( 'Totas_las_paginas' ),
'Prefixindex' => array( 'Indèx' ),
- 'Ipblocklist' => array( 'Utilizaires blocats' ),
- 'Specialpages' => array( 'Paginas especialas' ),
+ 'Ipblocklist' => array( 'Utilizaires_blocats' ),
+ 'Specialpages' => array( 'Paginas_especialas' ),
'Contributions' => array( 'Contribucions' ),
- 'Emailuser' => array( 'Corrièr electronic', 'Email', 'Emèl', 'Emèil' ),
- 'Confirmemail' => array( 'Confirmar lo corrièr electronic', 'Confirmarlocorrièrelectronic', 'ConfirmarCorrièrElectronic' ),
- 'Whatlinkshere' => array( 'Paginas ligadas' ),
- 'Recentchangeslinked' => array( 'Seguit dels ligams' ),
- 'Movepage' => array( 'Tornar nomenar', 'Cambiament de nom' ),
- 'Blockme' => array( 'Blocatz me', 'Blocatz-me' ),
- 'Booksources' => array( 'Obratge de referéncia', 'Obratges de referéncia' ),
+ 'Emailuser' => array( 'Corrièr_electronic', 'Email', 'Emèl', 'Emèil' ),
+ 'Confirmemail' => array( 'Confirmar_lo_corrièr_electronic', 'Confirmarlocorrièrelectronic', 'ConfirmarCorrièrElectronic' ),
+ 'Whatlinkshere' => array( 'Paginas_ligadas' ),
+ 'Recentchangeslinked' => array( 'Seguit_dels_ligams' ),
+ 'Movepage' => array( 'Tornar_nomenar', 'Cambiament_de_nom' ),
+ 'Blockme' => array( 'Blocatz_me', 'Blocatz-me' ),
+ 'Booksources' => array( 'Obratge_de_referéncia', 'Obratges_de_referéncia' ),
'Categories' => array( 'Categorias' ),
'Export' => array( 'Exportar', 'Exportacion' ),
- 'Allmessages' => array( 'Messatge sistèma', 'Messatge del sistèma' ),
+ 'Allmessages' => array( 'Messatge_sistèma', 'Messatge_del_sistèma' ),
'Log' => array( 'Jornal', 'Jornals' ),
'Blockip' => array( 'Blocar', 'Blocatge' ),
'Undelete' => array( 'Restablir', 'Restabliment' ),
'Import' => array( 'Impòrt', 'Importacion' ),
- 'Lockdb' => array( 'Varrolhar la banca' ),
- 'Unlockdb' => array( 'Desvarrolhar la banca' ),
+ 'Lockdb' => array( 'Varrolhar_la_banca' ),
+ 'Unlockdb' => array( 'Desvarrolhar_la_banca' ),
'Userrights' => array( 'Dreches', 'Permission' ),
- 'MIMEsearch' => array( 'Recèrca MIME' ),
- 'FileDuplicateSearch' => array( 'Recèrca fichièr en doble', 'RecèrcaFichièrEnDoble' ),
- 'Unwatchedpages' => array( 'Paginas pas seguidas' ),
- 'Listredirects' => array( 'Lista de las redireccions', 'Listadelasredireccions', 'Lista dels redirects', 'Listadelsredirects', 'Lista redireccions', 'Listaredireccions', 'Lista redirects', 'Listaredirects' ),
- 'Revisiondelete' => array( 'Versions suprimidas' ),
- 'Unusedtemplates' => array( 'Modèls inutilizats', 'Modèlsinutilizats', 'Models inutilizats', 'Modelsinutilizats', 'Modèls pas utilizats', 'Modèlspasutilizats', 'Models pas utilizats', 'Modelspasutilizats' ),
- 'Randomredirect' => array( 'Redireccion a l\'azard', 'Redirect a l\'azard' ),
- 'Mypage' => array( 'Ma pagina', 'Mapagina' ),
- 'Mytalk' => array( 'Mas discussions', 'Masdiscussions' ),
- 'Mycontributions' => array( 'Mas contribucions', 'Mascontribucions' ),
- 'Listadmins' => array( 'Lista dels administrators', 'Listadelsadministrators', 'Lista dels admins', 'Listadelsadmins', 'Lista admins', 'Listaadmins' ),
- 'Listbots' => array( 'Lista dels Bòts', 'ListadelsBòts', 'Lista dels Bots', 'ListadelsBots' ),
- 'Popularpages' => array( 'Paginas mai visitadas', 'Paginas las mai visitadas', 'Paginasmaivisitadas' ),
+ 'MIMEsearch' => array( 'Recèrca_MIME' ),
+ 'FileDuplicateSearch' => array( 'Recèrca_fichièr_en_doble', 'RecèrcaFichièrEnDoble' ),
+ 'Unwatchedpages' => array( 'Paginas_pas_seguidas' ),
+ 'Listredirects' => array( 'Lista_de_las_redireccions', 'Listadelasredireccions', 'Lista_dels_redirects', 'Listadelsredirects', 'Lista_redireccions', 'Listaredireccions', 'Lista_redirects', 'Listaredirects' ),
+ 'Revisiondelete' => array( 'Versions_suprimidas' ),
+ 'Unusedtemplates' => array( 'Modèls_inutilizats', 'Modèlsinutilizats', 'Models_inutilizats', 'Modelsinutilizats', 'Modèls_pas_utilizats', 'Modèlspasutilizats', 'Models_pas_utilizats', 'Modelspasutilizats' ),
+ 'Randomredirect' => array( 'Redireccion_a_l\'azard', 'Redirect_a_l\'azard' ),
+ 'Mypage' => array( 'Ma_pagina', 'Mapagina' ),
+ 'Mytalk' => array( 'Mas_discussions', 'Masdiscussions' ),
+ 'Mycontributions' => array( 'Mas_contribucions', 'Mascontribucions' ),
+ 'Listadmins' => array( 'Lista_dels_administrators', 'Listadelsadministrators', 'Lista_dels_admins', 'Listadelsadmins', 'Lista_admins', 'Listaadmins' ),
+ 'Listbots' => array( 'Lista_dels_Bòts', 'ListadelsBòts', 'Lista_dels_Bots', 'ListadelsBots' ),
+ 'Popularpages' => array( 'Paginas_mai_visitadas', 'Paginas_las_mai_visitadas', 'Paginasmaivisitadas' ),
'Search' => array( 'Recèrca', 'Recercar', 'Cercar' ),
- 'Resetpass' => array( 'Reïnicializacion del senhal', 'Reinicializaciondelsenhal' ),
- 'Withoutinterwiki' => array( 'Sens interwiki', 'Sensinterwiki', 'Sens interwikis', 'Sensinterwikis' ),
- 'MergeHistory' => array( 'Fusionar l\'istoric', 'Fusionarlistoric' ),
- 'Filepath' => array( 'Camin del Fichièr', 'CamindelFichièr', 'CaminFichièr' ),
- 'Invalidateemail' => array( 'Invalidar Corrièr electronic', 'InvalidarCorrièrElectronic' ),
- 'Blankpage' => array( 'Pagina blanca', 'PaginaBlanca' ),
- 'LinkSearch' => array( 'Recèrca de ligams', 'RecèrcaDeLigams' ),
- 'DeletedContributions' => array( 'Contribucions escafadas', 'ContribucionsEscafadas' ),
+ 'Resetpass' => array( 'Reïnicializacion_del_senhal', 'Reinicializaciondelsenhal' ),
+ 'Withoutinterwiki' => array( 'Sens_interwiki', 'Sensinterwiki', 'Sens_interwikis', 'Sensinterwikis' ),
+ 'MergeHistory' => array( 'Fusionar_l\'istoric', 'Fusionarlistoric' ),
+ 'Filepath' => array( 'Camin_del_Fichièr', 'CamindelFichièr', 'CaminFichièr' ),
+ 'Invalidateemail' => array( 'Invalidar_Corrièr_electronic', 'InvalidarCorrièrElectronic' ),
+ 'Blankpage' => array( 'Pagina_blanca', 'PaginaBlanca' ),
+ 'LinkSearch' => array( 'Recèrca_de_ligams', 'RecèrcaDeLigams' ),
+ 'DeletedContributions' => array( 'Contribucions_escafadas', 'ContribucionsEscafadas' ),
'Tags' => array( 'Balisas' ),
);
@@ -203,10 +203,10 @@ $magicWords = array(
'img_none' => array( '1', 'neant', 'nonrés', 'none' ),
'img_center' => array( '1', 'centrat', 'center', 'centre' ),
'img_framed' => array( '1', 'quadre', 'enquagrat', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sens_quadre', 'sens quadre', 'frameless' ),
+ 'img_frameless' => array( '1', 'sens_quadre', 'frameless' ),
'img_upright' => array( '1', 'redreça', 'redreça$1', 'redreça $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'bordadura', 'border' ),
- 'img_baseline' => array( '1', 'linha de basa', 'baseline' ),
+ 'img_baseline' => array( '1', 'linha_de_basa', 'baseline' ),
'img_sub' => array( '1', 'indici', 'ind', 'sub' ),
'img_super' => array( '1', 'exp', 'super', 'sup' ),
'img_top' => array( '1', 'naut', 'top' ),
@@ -215,7 +215,7 @@ $magicWords = array(
'img_bottom' => array( '1', 'bas', 'bottom' ),
'img_text_bottom' => array( '1', 'bas-tèxte', 'bas-txt', 'text-bottom' ),
'img_link' => array( '1', 'ligam=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NOMSIT', 'NOMSITE NOMSITI', 'SITENAME' ),
+ 'sitename' => array( '1', 'NOMSIT', 'NOMSITE_NOMSITI', 'SITENAME' ),
'ns' => array( '0', 'ESPACEN:', 'NS:' ),
'localurl' => array( '0', 'URLLOCALA:', 'LOCALURL:' ),
'localurle' => array( '0', 'URLLOCALAX:', 'LOCALURLE:' ),
@@ -304,8 +304,7 @@ $messages = array(
'tog-editsection' => 'Modificar una seccion via los ligams [modificar]',
'tog-editsectiononrightclick' => 'Modificar una seccion en fasent un clic drech sus son títol (JavaScript)',
'tog-showtoc' => "Afichar l'ensenhador (per las paginas de mai de 3 seccions)",
-'tog-rememberpassword' => 'Se remembrar de mon senhal sus aqueste ordenador (cookie)',
-'tog-editwidth' => 'Afichar la fenèstra de modificacion en largor plena',
+'tog-rememberpassword' => 'Se remembrar de mon senhal sus aqueste ordenador (al maximum $1 {{PLURAL:$1|jorn|jorns}})',
'tog-watchcreations' => 'Apondre las paginas que creï a ma lista de seguiment',
'tog-watchdefault' => 'Apondre las paginas que modifiqui a ma lista de seguiment',
'tog-watchmoves' => 'Apondre las paginas que tòrni nomenar a ma lista de seguiment',
@@ -452,31 +451,20 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Apondre un subjècte',
-'vector-action-delete' => 'Suprimir',
-'vector-action-move' => 'Tornar nomenar',
-'vector-action-protect' => 'Protegir',
-'vector-action-undelete' => 'Restablir',
-'vector-action-unprotect' => 'Desprotegir',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => "Pagina d'ajuda",
-'vector-namespace-image' => 'Fichièr',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'Pagina de Mèdia',
-'vector-namespace-mediawiki' => 'Messatge',
-'vector-namespace-project' => 'Pagina de projècte',
-'vector-namespace-special' => 'Pagina especiala',
-'vector-namespace-talk' => 'Discussion',
-'vector-namespace-template' => 'Modèl',
-'vector-namespace-user' => "Pagina d'utilizaire",
-'vector-view-create' => 'Crear',
-'vector-view-edit' => 'Modificar',
-'vector-view-history' => "Veire l'istoric",
-'vector-view-view' => 'Legir',
-'vector-view-viewsource' => 'Veire la font',
-'actions' => 'Accions',
-'namespaces' => 'Espacis de noms',
-'variants' => 'Variantas',
+'vector-action-addsection' => 'Apondre un subjècte',
+'vector-action-delete' => 'Suprimir',
+'vector-action-move' => 'Tornar nomenar',
+'vector-action-protect' => 'Protegir',
+'vector-action-undelete' => 'Restablir',
+'vector-action-unprotect' => 'Desprotegir',
+'vector-view-create' => 'Crear',
+'vector-view-edit' => 'Modificar',
+'vector-view-history' => "Veire l'istoric",
+'vector-view-view' => 'Legir',
+'vector-view-viewsource' => 'Veire la font',
+'actions' => 'Accions',
+'namespaces' => 'Espacis de noms',
+'variants' => 'Variantas',
'errorpagetitle' => 'Error de títol',
'returnto' => 'Tornar a la pagina $1.',
@@ -699,7 +687,7 @@ Doblidetz pas de personalizar vòstras [[Special:Preferences|{{SITENAME}} prefer
'yourname' => "Vòstre nom d'utilizaire :",
'yourpassword' => 'Vòstre senhal :',
'yourpasswordagain' => 'Picatz vòstre senhal tornarmai :',
-'remembermypassword' => 'Se remembrar de mon senhal (cookie)',
+'remembermypassword' => 'Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})',
'yourdomainname' => 'Vòstre domeni',
'externaldberror' => 'Siá una error s’es producha amb la banca de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.',
'login' => 'Identificacion',
@@ -716,6 +704,7 @@ Doblidetz pas de personalizar vòstras [[Special:Preferences|{{SITENAME}} prefer
'gotaccount' => "Ja avètz un compte ? '''$1'''.",
'gotaccountlink' => 'Identificatz-vos',
'createaccountmail' => 'per corrièr electronic',
+'createaccountreason' => 'Motiu :',
'badretype' => "Los senhals qu'avètz picats son pas identics.",
'userexists' => "Lo nom d'utilizaire qu'avètz picat ja es utilizat.
Causissètz-ne un autre.",
@@ -828,9 +817,10 @@ Benlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl
'showdiff' => 'Cambiaments en cors',
'anoneditwarning' => "'''Atencion :''' sètz pas identificat(ada).
Vòstra adreça IP serà enregistrada dins l’istoric d'aquesta pagina.",
+'anonpreviewwarning' => "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
'missingsummary' => "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fach sens avertiment mai.",
'missingcommenttext' => 'Mercé de metre un comentari çaijós.',
-'missingcommentheader' => "'''Rampèl :''' Avètz pas provesit de subjècte/títol per aqueste comentari. Se clicatz tornamai sus ''Salvar'', vòstra edicion serà enregistrada sens aquò.",
+'missingcommentheader' => "'''*Rampèl:''' Avètz pas escrich de títol per aqueste comentari. Se tornatz clicar sus \"{{*int:*savearticle}}\" serà enregistrat sens títol.",
'summary-preview' => 'Previsualizacion del resumit :',
'subject-preview' => 'Previsualizacion del subjècte/títol :',
'blockedtitle' => "L'utilizaire es blocat",
@@ -900,7 +890,10 @@ La darrièra entrada del jornal dels blocatges es indicada çaijós a títol dâ€
'usercsspreview' => "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''
'''Es pas estada encara enregistrada !'''",
'userjspreview' => "'''Remembratz-vos que sètz a visualizar o testar vòstre còde JavaScript e qu’es pas encara estat enregistrat !'''",
-'userinvalidcssjstitle' => "'''Atencion :''' existís pas d'estil « $1 ». Remembratz-vos que las paginas personalas amb extensions .css e .js utilizan de títols en minusculas, per exemple, {{ns:user}}:Foo/monobook.css e non pas {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''
+'''Es pas estada encara enregistrada !'''",
+'sitejspreview' => "'''Remembratz-vos que sètz a visualizar o testar vòstre còde JavaScript e qu’es pas encara estat enregistrat !'''",
+'userinvalidcssjstitle' => "'''Atencion :''' existís pas d'estil « $1 ». Remembratz-vos que las paginas personalas amb extensions .css e .js utilizan de títols en minusculas, per exemple, {{ns:user}}:Foo/vector.css e non pas {{ns:user}}:Foo/Vector.css.",
'updated' => '(Mes a jorn)',
'note' => "'''Nòta :'''",
'previewnote' => "'''Atencion, aqueste tèxte es sonque una previsualizacion e es pas encara estat salvat !'''",
@@ -931,8 +924,6 @@ Vos va caler aportar vòstras modificacions al tèxte existent.
'yourdiff' => 'Diferéncias',
'copyrightwarning' => "Totas las contribucions a {{SITENAME}} son consideradas coma publicadas jols tèrmes de la $2 (vejatz $1 per mai de detalhs). Se desiratz pas que vòstres escriches sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Nos prometètz tanben qu'avètz escrich aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura.'''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
'copyrightwarning2' => "Totas las contribucions a {{SITENAME}} pòdon èsser modificadas o suprimidas per d’autres utilizaires. Se desiratz pas que vòstres escriches sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Tanben nos prometètz qu'avètz escrich aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura. (vejatz $1 per mai de detalhs). '''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
-'longpagewarning' => "'''AVERTIMENT : aquesta pagina a una longor de $1 ko.
-De delà de 32 ko, es preferible per d'unes navigadors de devesir aquesta pagina en seccions mai pichonas. Benlèu deuriatz devesir la pagina en seccions mai pichonas.'''",
'longpageerror' => "'''ERROR : Lo tèxte qu'avètz mandat es de $1 Ko, e depassa doncas lo limit autorizat dels $2 Ko. Lo tèxte pòt pas èsser salvat.'''",
'readonlywarning' => "'''AVERTIMENT : La banca de donadas es estada varrolhada per mantenença, doncas poiretz pas salvar vòstras modificacions ara.
Podètz copiar lo tèxte dins un fichièr de tèxte e lo salvar per mai tard.'''
@@ -1106,6 +1097,8 @@ $1",
'logdelete-failure' => "'''La visibilitat del jornal a pas pogut èsser definida :'''
$1",
'revdel-restore' => 'Modificar la visibilitat',
+'revdel-restore-deleted' => 'revisions suprimidas',
+'revdel-restore-visible' => 'revisions visiblas',
'pagehist' => 'Istoric de la pagina',
'deletedhist' => 'Istoric de las supressions',
'revdelete-content' => 'contengut',
@@ -1176,7 +1169,7 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
'compareselectedversions' => 'Comparar las versions seleccionadas',
'showhideselectedversions' => 'Afichar/amagar las versions seleccionadas',
'editundo' => 'desfar',
-'diff-multi' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}})',
+'diff-multi' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})',
# Search results
'searchresults' => 'Resultats de la recèrca',
@@ -1211,6 +1204,7 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
'searchprofile-everything-tooltip' => 'Recercar dins tot lo contengut (tot incluissent las paginas de discussion)',
'searchprofile-advanced-tooltip' => "Recercar dins d'espacis de noms personalizats",
'search-result-size' => '$1 ({{PLURAL:$2|1 mot|$2 mots}})',
+'search-result-category-size' => '$1 membre{{PLURAL:$1||s}} ($2 soscategoria{{PLURAL:$2||s}}, $3 fichièr{{PLURAL:$3||s}})',
'search-result-score' => 'Pertinéncia : $1%',
'search-redirect' => '(redireccion cap a $1)',
'search-section' => '(seccion $1)',
@@ -1288,6 +1282,7 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
'contextlines' => 'Nombre de linhas per responsa :',
'contextchars' => 'Nombre de caractèrs de contèxte per linha :',
'stub-threshold' => 'Limit superior pels <a href="#" class="stub">ligams cap als esbòsses</a> (octets) :',
+'stub-threshold-disabled' => 'Desactivat',
'recentchangesdays' => "Nombre de jorns d'afichar dins los darrièrs cambiaments :",
'recentchangesdays-max' => '(maximum $1 {{PLURAL:$1|jorn|jorns}})',
'recentchangescount' => "Nombre de modificacions d'afichar per defaut :",
@@ -1321,6 +1316,7 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
'prefs-files' => 'Fichièrs',
'prefs-custom-css' => 'CSS personalizat',
'prefs-custom-js' => 'JS personalizat',
+'prefs-common-css-js' => 'JavaScript e CSS partejat per totes los abilhatges :',
'prefs-reset-intro' => 'Podètz utilizar aquesta pagina per restablir vòstras preferéncias a las valors per defaut del site. Aquò pòt pas èsser desfach.',
'prefs-emailconfirm-label' => 'Confirmacion del corrièr electronic :',
'prefs-textboxsize' => 'Talha de la fenèstra de modificacion',
@@ -1357,7 +1353,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar amb l'ajuda de v
'prefs-advancedrendering' => 'Opcions avançadas',
'prefs-advancedsearchoptions' => 'Opcions avançadas',
'prefs-advancedwatchlist' => 'Opcions avançadas',
-'prefs-display' => "Opcions d'afichatge",
+'prefs-displayrc' => "Opcions d'afichatge",
'prefs-diffs' => 'Diferéncias',
# User rights
@@ -1443,6 +1439,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar amb l'ajuda de v
'right-hideuser' => 'Blocar un utilizaire en amagant son nom al public',
'right-ipblock-exempt' => "Èsser pas afectat per las IP blocadas, los blocatges automatics e los blocatges de plajas d'IP",
'right-proxyunbannable' => 'Èsser pas afectat pels blocatges automatics de servidors mandataris',
+'right-unblockself' => 'Se desblocar eles meteisses',
'right-protect' => 'Modificar lo nivèl de proteccion de las paginas e modificar las paginas protegidas',
'right-editprotected' => 'Modificar las paginas protegidas (sens proteccion en cascada)',
'right-editinterface' => "Modificar l'interfàcia d'utilizaire",
@@ -1465,7 +1462,6 @@ Tanben podètz causir de permetre a d’autres de vos contactar amb l'ajuda de v
'right-siteadmin' => 'Varrolhar e desvarrolhar la banca de donadas',
'right-reset-passwords' => "Cambiar lo senhal d'autres utilizaires",
'right-override-export-depth' => 'Exportar las paginas en incluent las paginas ligadas fins a una prigondor de 5 nivèls',
-'right-versiondetail' => 'Vejatz las entresenhas espandidas sus las versions dels logicials',
'right-sendemail' => 'Mandar un corrièl als autres utilizaires',
# User rights log
@@ -1516,14 +1512,9 @@ Tanben podètz causir de permetre a d’autres de vos contactar amb l'ajuda de v
'recentchanges-legend' => 'Opcions dels darrièrs cambiaments',
'recentchangestext' => 'Vaquí sus aquesta pagina, los darrièrs cambiaments de {{SITENAME}}.',
'recentchanges-feed-description' => "Seguissètz los darrièrs cambiaments d'aqueste wiki dins un flux.",
-'recentchanges-label-legend' => 'Legenda : $1.',
-'recentchanges-legend-newpage' => '$1 - pagina novèla',
'recentchanges-label-newpage' => 'Aquesta modificacion a creat una pagina novèla',
-'recentchanges-legend-minor' => '$1 - cambiament menor',
'recentchanges-label-minor' => 'Aqueste cambiament es menor',
-'recentchanges-legend-bot' => '$1 - cambiament fach per un robòt',
'recentchanges-label-bot' => 'Aqueste cambiament es estat efectuat per un bòt.',
-'recentchanges-legend-unpatrolled' => '$1 - modificacion pas patrolhada',
'recentchanges-label-unpatrolled' => 'Aqueste cambiament es pas estat verificat encara.',
'rcnote' => 'Vaquí {{PLURAL:$1|lo darrièr cambiament|los $1 darrièrs cambiaments}} dempuèi {{PLURAL:$2|lo darrièr jorn|los <b>$2</b> darrièrs jorns}}, determinat{{PLURAL:$1||s}} lo $4, a $5.',
'rcnotefrom' => "Vaquí los cambiaments efectuats dempuèi lo '''$2''' ('''$1''' al maximum).",
@@ -1570,6 +1561,9 @@ per copiar de fichièrs sul servidor.',
'upload_directory_missing' => 'Lo repertòri d’impòrt ($1) es mancant e a pas pogut èsser creat pel servidor web.',
'upload_directory_read_only' => 'Lo servidor Web pòt escriure dins lo dorsièr cibla ($1).',
'uploaderror' => 'Error',
+'upload-recreate-warning' => "'''Atencion : Un fichièr amb aqueste nom es estat suprimit o desplaçat.'''
+
+Lo jornal de las supressions e lo dels desplaçaments d'aquesta pagina son afichats aicí per informacion :",
'uploadtext' => "Utilizatz lo formulari çaijós per importar de fichièrs sul servidor.
Per veire o recercar d'imatges mandats precedentament, consultatz [[Special:FileList|la tièra dels imatges]]. Las còpias e las supressions tanben son enregistradas dins l'[[Special:Log/upload|istoric dels impòrts]], las supressions dins l’[[Special:Log/delete|istoric de las supressions]].
@@ -1604,6 +1598,17 @@ Vejatz la [[Special:NewFiles|galariá dels imatges novèls]] per una presentacio
'filetype-banned-type' => "'''\".\$1\"''' es dins un format pas admes.
{{PLURAL:\$3|Lo qu'es acceptat es|Los que son acceptats son}} \$2.",
'filetype-missing' => "Lo fichièr a pas cap d'extension (coma « .jpg » per exemple).",
+'empty-file' => "Lo fichièr qu'avètz somés èra void.",
+'file-too-large' => "Lo fichièr qu'avètz somés èra tròp grand.",
+'filename-tooshort' => 'Lo nom de fichièr es tròp cort.',
+'filetype-banned' => 'Aqueste tipe de fichièr es interdich',
+'verification-error' => 'Aqueste fichièr passa pas la verificacion dels fichièrs.',
+'hookaborted' => "La modificacion qu'avètz ensajat de realizar es estada anullada per un croquet d'extension.",
+'illegal-filename' => 'Lo nom del fichièr es pas autorizat.',
+'overwrite' => 'Espotir un fichièr existent es pas autorizat.',
+'unknown-error' => "Una error desconeguda s'es producha.",
+'tmp-create-error' => 'Impossible de crear lo fichièr temporari.',
+'tmp-write-error' => "Error d'escritura del fichièr temporari.",
'large-file' => 'Los fichièrs importats deurián pas èsser mai gros que $1 ; aqueste fichièr fa $2.',
'largefileserver' => "La talha d'aqueste fichièr es superiora al maximum autorizat.",
'emptyfile' => 'Lo fichièr que volètz importar sembla void. Aquò pòt èsser degut a una error dins lo nom del fichièr. Verificatz que desiratz vertadièrament copiar aqueste fichièr.',
@@ -1629,13 +1634,14 @@ Se volètz totjorn importar aquel fichièr, mercé de tornar en arrièr e d'util
S'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Aqueste fichièr es un doble {{PLURAL:$1|del fichièr seguent|dels fichièrs seguents}} :',
'file-deleted-duplicate' => "Un fichièr identic a aqueste ([[:$1]]) ja es estat suprimit. Vos caldriá verificar lo jornal de las supressions d'aqueste fichièr abans de la tornar telecargar.",
-'successfulupload' => 'Importacion capitada',
'uploadwarning' => 'Atencion !',
'uploadwarning-text' => 'Modificatz la descripcion del fichièr e ensajatz tornarmai.',
'savefile' => 'Salvar lo fichièr',
'uploadedimage' => '«[[$1]]» copiat sul servidor',
'overwroteimage' => 'a importat una version novèla de « [[$1]] »',
'uploaddisabled' => 'O planhèm, lo mandadís de fichièr es desactivat.',
+'copyuploaddisabled' => 'Mandadís de fichièr per URL desactivat.',
+'uploadfromurl-queued' => "Vòstre mandadís es estat mes dins la fila d'espèra.",
'uploaddisabledtext' => "L'impòrt de fichièrs cap al servidor es desactivat.",
'php-uploaddisabledtext' => "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
'uploadscripted' => "Aqueste fichièr conten de còde HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
@@ -1667,6 +1673,10 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- daissatz aquesta linha coma es -->',
+'upload-success-subj' => 'Importacion capitada',
+'upload-success-msg' => 'Çò mandat es disponible aicí : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problèma de mandadís',
+'upload-failure-msg' => 'I a agut un problèma amb vòstre mandadís :$1',
'upload-proto-error' => 'Protocòl incorrècte',
'upload-proto-error-text' => "L’impòrt requerís d'URLs començant per <code>http://</code> o <code>ftp://</code>.",
@@ -1840,7 +1850,6 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
'statistics-edits-average' => 'Modificacions mejanas per pagina',
'statistics-views-total' => 'Visitas totalas',
'statistics-views-peredit' => 'Visitas per modificacions',
-'statistics-jobqueue' => 'Longor de la [http://www.mediawiki.org/wiki/Manual:Job_queue lista d’espèra de tractament]',
'statistics-users' => '[[Special:ListUsers|Utilizaires]] enregistrats',
'statistics-users-active' => 'Utilizaires actius',
'statistics-users-active-desc' => "Utilizaires qu'an fach al mens una accion durant {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
@@ -1855,7 +1864,7 @@ Una pagina es tractada coma una pagina d’omonimia s'utiliza un modèl qu'es li
'doubleredirects' => 'Redireccions doblas',
'doubleredirectstext' => 'Vaquí una lista de las paginas que redirigisson cap a de paginas que son elas-meteissas de paginas de redireccion.
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 <s>barradas</s> son estadas resolgudas.',
+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-fixer' => 'Corrector de redireccion',
@@ -2034,36 +2043,41 @@ I pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàr
'listgrouprights-removegroup-self-all' => 'Se pòt levar totes los gropes de son compte pròpri',
# E-mail user
-'mailnologin' => "Pas d'adreça",
-'mailnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
+'mailnologin' => "Pas d'adreça",
+'mailnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
e aver indicat una adreça electronica valida dins vòstras [[Special:Preferences|preferéncias]]
per poder mandar un messatge a un autre utilizaire.',
-'emailuser' => 'Mandar un messatge a aqueste utilizaire',
-'emailpage' => 'Mandar un corrièr electronic a l’utilizaire',
-'emailpagetext' => "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a aqueste utilizaire.
+'emailuser' => 'Mandar un messatge a aqueste utilizaire',
+'emailpage' => 'Mandar un corrièr electronic a l’utilizaire',
+'emailpagetext' => "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a aqueste utilizaire.
L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras preferéncias]] apareisserà dins lo camp « Expeditor » de vòstre messatge. E mai, lo destinatari vos poirà respondre dirèctament.",
-'usermailererror' => 'Error dins lo subjècte del corrièr electronic :',
-'defemailsubject' => 'Corrièr electronic mandat dempuèi {{SITENAME}}',
-'noemailtitle' => "Pas d'adreça electronica",
-'noemailtext' => "Aqueste utilizaire a pas especificat d'adreça electronica valida.",
-'nowikiemailtitle' => 'Pas de corrièr electronic autorizat',
-'nowikiemailtext' => "Aqueste utilizaire a causit de recebre pas de corrièr electronic de la part d'autres utilizaires.",
-'email-legend' => 'Mandar un corrièr electronic a un autre utilizaire de {{SITENAME}}',
-'emailfrom' => 'Expeditor :',
-'emailto' => 'Destinatari :',
-'emailsubject' => 'Subjècte :',
-'emailmessage' => 'Messatge :',
-'emailsend' => 'Mandar',
-'emailccme' => 'Me mandar per corrièr electronic una còpia de mon messatge.',
-'emailccsubject' => 'Còpia de vòstre messatge a $1 : $2',
-'emailsent' => 'Messatge mandat',
-'emailsenttext' => 'Vòstre messatge es estat mandat.',
-'emailuserfooter' => 'Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « Mandar un corrièr electronic a l’utilizaire » sus {{SITENAME}}.',
+'usermailererror' => 'Error dins lo subjècte del corrièr electronic :',
+'defemailsubject' => 'Corrièr electronic mandat dempuèi {{SITENAME}}',
+'usermaildisabled' => 'Lo mandadís de corrièrs electronics entre utilizairers es desactivat',
+'usermaildisabledtext' => "Podètz pas mandar de corrièrs electronics a d'autres utilizaires sur aquel wiki",
+'noemailtitle' => "Pas d'adreça electronica",
+'noemailtext' => "Aqueste utilizaire a pas especificat d'adreça electronica valida.",
+'nowikiemailtitle' => 'Pas de corrièr electronic autorizat',
+'nowikiemailtext' => "Aqueste utilizaire a causit de recebre pas de corrièr electronic de la part d'autres utilizaires.",
+'email-legend' => 'Mandar un corrièr electronic a un autre utilizaire de {{SITENAME}}',
+'emailfrom' => 'Expeditor :',
+'emailto' => 'Destinatari :',
+'emailsubject' => 'Subjècte :',
+'emailmessage' => 'Messatge :',
+'emailsend' => 'Mandar',
+'emailccme' => 'Me mandar per corrièr electronic una còpia de mon messatge.',
+'emailccsubject' => 'Còpia de vòstre messatge a $1 : $2',
+'emailsent' => 'Messatge mandat',
+'emailsenttext' => 'Vòstre messatge es estat mandat.',
+'emailuserfooter' => 'Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « Mandar un corrièr electronic a l’utilizaire » sus {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'A daissat un messatge de sistèma.',
+'usermessage-editor' => 'Messatgièr del sistèma',
# Watchlist
'watchlist' => 'Ma lista de seguiment',
'mywatchlist' => 'Lista de seguiment',
-'watchlistfor' => "(per l’utilizaire '''$1''')",
'nowatchlist' => "Vòstra lista de seguiment conten pas cap d'article.",
'watchlistanontext' => 'Per poder afichar o editar los elements de vòstra lista de seguiment, vos cal vos $1.',
'watchnologin' => 'Vos sètz pas identificat(ada)',
@@ -2183,7 +2197,9 @@ La darrièra modificacion es estada efectuada per [[User:$3|$3]] ([[User talk:$3
'revertpage' => 'Anullacion de las modificacions de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) cap a la darrièra version de [[User:$1|$1]]',
'revertpage-nouser' => 'Revocacion de las modificacions per (nom d’utilizaire suprimit) a la darrièra version per [[User:$1|$1]]',
'rollback-success' => 'Anullacion de las modificacions de $1 ; retorn a la version de $2.',
-'sessionfailure' => 'Vòstra sesilha de connexion sembla aver de problèmas ;
+
+# Edit tokens
+'sessionfailure' => 'Vòstra sesilha de connexion sembla aver de problèmas ;
aquesta accion es estada anullada en prevencion d’un piratatge de sesilha.
Clicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi ensajatz tornarmai.',
@@ -2310,18 +2326,20 @@ $1",
'month' => 'A partir del mes (e precedents) :',
'year' => 'A partir de l’annada (e precedentas) :',
-'sp-contributions-newbies' => 'Far veire sonque las contribucions dels utilizaires novèls',
-'sp-contributions-newbies-sub' => 'Lista de las contribucions dels utilizaires novèls. Las paginas que son estadas suprimidas son pas afichadas.',
-'sp-contributions-newbies-title' => 'Las contribucions de l’utilizaire pels comptes novèls',
-'sp-contributions-blocklog' => 'Istoric dels blocatges',
-'sp-contributions-deleted' => 'contribucions suprimidas',
-'sp-contributions-logs' => 'jornals',
-'sp-contributions-talk' => 'Discutir',
-'sp-contributions-userrights' => 'gerir los dreches',
-'sp-contributions-blocked-notice' => 'Aqueste utilizaire es actualament blocat. La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :',
-'sp-contributions-search' => 'Cercar las contribucions',
-'sp-contributions-username' => 'Adreça IP o nom d’utilizaire :',
-'sp-contributions-submit' => 'Cercar',
+'sp-contributions-newbies' => 'Far veire sonque las contribucions dels utilizaires novèls',
+'sp-contributions-newbies-sub' => 'Lista de las contribucions dels utilizaires novèls. Las paginas que son estadas suprimidas son pas afichadas.',
+'sp-contributions-newbies-title' => 'Las contribucions de l’utilizaire pels comptes novèls',
+'sp-contributions-blocklog' => 'Istoric dels blocatges',
+'sp-contributions-deleted' => 'contribucions suprimidas',
+'sp-contributions-logs' => 'jornals',
+'sp-contributions-talk' => 'Discutir',
+'sp-contributions-userrights' => 'gerir los dreches',
+'sp-contributions-blocked-notice' => 'Aqueste utilizaire es actualament blocat. La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :',
+'sp-contributions-blocked-notice-anon' => 'Aquesta adreça IP es actualament blocada.
+La darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :',
+'sp-contributions-search' => 'Cercar las contribucions',
+'sp-contributions-username' => 'Adreça IP o nom d’utilizaire :',
+'sp-contributions-submit' => 'Cercar',
# What links here
'whatlinkshere' => 'Paginas ligadas a aquesta',
@@ -2383,7 +2401,6 @@ Podètz consultar la [[Special:IPBlockList|lista dels comptes e de las adreças
'ipb-edit-dropdown' => 'Modificar los motius de blocatge per defaut',
'ipb-unblock-addr' => 'Desblocar $1',
'ipb-unblock' => "Desblocar un compte d'utilizaire o una adreça IP",
-'ipb-blocklist-addr' => 'Blocatges existents per $1',
'ipb-blocklist' => 'Vejatz los blocatges existents',
'ipb-blocklist-contribs' => 'Contribucions per $1',
'unblockip' => 'Desblocar un utilizaire o una adreça IP',
@@ -2453,6 +2470,8 @@ $1 ja es blocat. Volètz modificar los paramètres ?',
Podètz pas crear un compte',
'cant-block-while-blocked' => "Podètz pas blocar d'autres utilizaires pendent que sètz blocat(ada).",
'cant-see-hidden-user' => "L'utilizaire qu'ensajatz de blocar es ja estat blocat e amagat. Sens lo drech hideuser, podètz pas veire o modificar lo blocatge de l'utilizaire.",
+'ipbblocked' => "Podètz pas blocar o desblocar d'autres utilizaire, perque vos {{GENDER:|meteis|meteissa|meteis}} sètz {{GENDER:|blocat|blocada|blocat}}.",
+'ipbnounblockself' => 'Sètz pas autorizat a vos desblocar vos meteis',
# Developer tools
'lockdb' => 'Varrolhar la banca',
@@ -2618,6 +2637,7 @@ Totas las accions d’importacion interwiki son conservadas dins lo [[Special:Lo
'importstart' => 'Impòrt de las paginas...',
'import-revision-count' => '$1 {{PLURAL:$1|version|versions}}',
'importnopages' => "Cap de pagina d'importar.",
+'imported-log-entries' => '$1 {{PLURAL:$1|entrada|entradas}} del jornal {{PLURAL:$1|importada|importadas}}.',
'importfailed' => 'Fracàs de l’impòrt : $1',
'importunknownsource' => 'Tipe de la font d’impòrt desconegut',
'importcantopen' => "Impossible de dobrir lo fichièr d'importar",
@@ -2710,6 +2730,8 @@ Totas las accions d’importacion interwiki son conservadas dins lo [[Special:Lo
'tooltip-upload' => 'Amodar lo mandadís',
'tooltip-rollback' => '"Revocar" anulla en un clic la o las edicion(s) sus aquesta pagina del darrièr contributor.',
'tooltip-undo' => '"Desfar" revòca aquesta edicion e dobrís la fenèstra d’edicion en mòde previsualizacion. Permet d’apondre una rason dins la bóstia de resumit.',
+'tooltip-preferences-save' => 'Salvar las preferéncias',
+'tooltip-summary' => 'Apondètz un brèu resumit',
# Stylesheets
'common.css' => '/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */',
@@ -2841,9 +2863,9 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
'thumbsize' => 'Talha de la miniatura :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagina|paginas}}',
'file-info' => 'Talha del fichièr: $1, tipe MIME: $2',
-'file-info-size' => '($1 × $2 pixèl, talha del fichièr: $3, tipe MIME: $4)',
+'file-info-size' => '$1 × $2 pixèl, talha del fichièr: $3, tipe MIME: $4',
'file-nohires' => '<small>Pas de resolucion mai nauta disponibla.</small>',
-'svg-long-desc' => '(Fichièr SVG, resolucion de $1 × $2 pixèls, talha : $3)',
+'svg-long-desc' => 'Fichièr SVG, resolucion de $1 × $2 pixèls, talha : $3',
'show-big-image' => 'Imatge en resolucion mai nauta',
'show-big-image-thumb' => "<small>Talha d'aqueste apercebut : $1 × $2 pixèls</small>",
'file-info-gif-looped' => 'en bocla',
@@ -3168,25 +3190,25 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
'limitall' => 'totes',
# E-mail address confirmation
-'confirmemail' => "Confirmar l'adreça de corrièr electronic",
-'confirmemail_noemail' => 'L’adreça de corrièr electronic configurada dins vòstras [[Special:Preferences|preferéncias]] es pas valida.',
-'confirmemail_text' => '{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còde, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.',
-'confirmemail_pending' => 'Un còde de confirmacion ja vos es estat mandat per corrièr electronic ; se venètz de crear vòstre compte, esperatz qualques minutas que l’e-mail arribe abans de demandar un còde novèl.',
-'confirmemail_send' => 'Mandar un còde de confirmacion',
-'confirmemail_sent' => 'Corrièr electronic de confirmacion mandat.',
-'confirmemail_oncreate' => "Un còde de confirmacion es estat mandat a vòstra adreça de corrièr electronic.
+'confirmemail' => "Confirmar l'adreça de corrièr electronic",
+'confirmemail_noemail' => 'L’adreça de corrièr electronic configurada dins vòstras [[Special:Preferences|preferéncias]] es pas valida.',
+'confirmemail_text' => '{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còde, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.',
+'confirmemail_pending' => 'Un còde de confirmacion ja vos es estat mandat per corrièr electronic ; se venètz de crear vòstre compte, esperatz qualques minutas que l’e-mail arribe abans de demandar un còde novèl.',
+'confirmemail_send' => 'Mandar un còde de confirmacion',
+'confirmemail_sent' => 'Corrièr electronic de confirmacion mandat.',
+'confirmemail_oncreate' => "Un còde de confirmacion es estat mandat a vòstra adreça de corrièr electronic.
Aqueste còde es pas requerit per se connectar, mas n'aurètz besonh per activar las foncionalitats ligadas als corrièrs electronics sus aqueste wiki.",
-'confirmemail_sendfailed' => '{{SITENAME}} pòt pas mandar lo corrièr de confirmacion.
+'confirmemail_sendfailed' => '{{SITENAME}} pòt pas mandar lo corrièr de confirmacion.
Verificatz se vòstra adreça conten pas de caractèrs interdiches.
Retorn del programa de corrièr : $1',
-'confirmemail_invalid' => 'Còde de confirmacion incorrècte. Benlèu lo còde a expirat.',
-'confirmemail_needlogin' => 'Vos cal vos $1 per confirmar vòstra adreça de corrièr electronic.',
-'confirmemail_success' => 'Vòstra adreça de corrièr electronic es confirmada. Ara, vos podètz connectar e aprofechar del wiki.',
-'confirmemail_loggedin' => 'Ara, vòstra adreça es confirmada',
-'confirmemail_error' => "Un problèma s'es produch en volent enregistrar vòstra confirmacion.",
-'confirmemail_subject' => 'Confirmacion d’adreça de corrièr electronic per {{SITENAME}}',
-'confirmemail_body' => "Qualqu’un, probablament vos,e amb l’adreça IP $1, a enregistrat un compte « $2 » amb aquesta adreça de corrièr electronic sul site {{SITENAME}}.
+'confirmemail_invalid' => 'Còde de confirmacion incorrècte. Benlèu lo còde a expirat.',
+'confirmemail_needlogin' => 'Vos cal vos $1 per confirmar vòstra adreça de corrièr electronic.',
+'confirmemail_success' => 'Vòstra adreça de corrièr electronic es confirmada. Ara, vos podètz connectar e aprofechar del wiki.',
+'confirmemail_loggedin' => 'Ara, vòstra adreça es confirmada',
+'confirmemail_error' => "Un problèma s'es produch en volent enregistrar vòstra confirmacion.",
+'confirmemail_subject' => 'Confirmacion d’adreça de corrièr electronic per {{SITENAME}}',
+'confirmemail_body' => "Qualqu’un, probablament vos,e amb l’adreça IP $1, a enregistrat un compte « $2 » amb aquesta adreça de corrièr electronic sul site {{SITENAME}}.
Per confirmar qu'aqueste compte vos aparten vertadièrament e activar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :
@@ -3198,8 +3220,25 @@ Aqueste còde de confirmacion expirarà lo $4, seguissètz l’autre ligam çaij
$5
Aqueste còde de confirmacion expirarà lo $4.",
-'confirmemail_invalidated' => 'Confirmacion de l’adreça de corrièr electronic anullada',
-'invalidateemail' => 'Anullar la confirmacion del corrièr electronic',
+'confirmemail_body_changed' => "Qualqu’un, probablament vos, a partir de l’adreça IP $1,
+a modificat l’adreça de corrièr associada al compte « $2 » de {{SITENAME}}
+en aquesta adreça.
+
+Per confirmar qu'aqueste compte vos aparten vertadièrament e per tal
+de reactivar las foncions de messatjariá sus {{SITENAME}},
+seguissètz aqueste ligam dins vòstre navigador :
+
+$3
+
+S'aqueste compte vos aparten *pas*, dobriscatz pas aqueste ligam ;
+podètz seguir l’autre ligam çaijós per anullar la
+confirmacion de vòstra adreça de corrièl :
+
+$5
+
+Aqueste còde de confirmacion expirarà lo $4.",
+'confirmemail_invalidated' => 'Confirmacion de l’adreça de corrièr electronic anullada',
+'invalidateemail' => 'Anullar la confirmacion del corrièr electronic',
# Scary transclusion
'scarytranscludedisabled' => '[La transclusion interwiki es desactivada]',
@@ -3398,6 +3437,7 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: ».',
'htmlform-float-invalid' => "La valor qu'avètz especificada es pas un nombre.",
'htmlform-int-toolow' => "La valor qu'avètz especificada es en dejós del minimum de $1",
'htmlform-int-toohigh' => "La valor qu'avètz especificada es en dessús del minimum de $1",
+'htmlform-required' => 'Aquesta valor es obligatòria',
'htmlform-submit' => 'Sometre',
'htmlform-reset' => 'Desfar las modificacions',
'htmlform-selectorother-other' => 'Autre',
diff --git a/languages/messages/MessagesOr.php b/languages/messages/MessagesOr.php
index 248af8bd..03c5691c 100644
--- a/languages/messages/MessagesOr.php
+++ b/languages/messages/MessagesOr.php
@@ -29,6 +29,9 @@ $digitTransformTable = array(
);
$messages = array(
+# User preference toggles
+'tog-rememberpassword' => 'à¬à¬¹à¬¿ ବà­à¬°à¬¾à¬‰à¬œà¬°à¬°à­‡ (ସବà­à¬ à­ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଠମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
+
'underline-always' => 'ସବà­à¬¬à­‡à¬³à­‡',
'underline-never' => 'କେବେନà­à¬¹à­‡à¬',
@@ -89,22 +92,23 @@ $messages = array(
'dec' => 'ଡିସେà¬à¬¬à¬°',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Category|ବିଭାଗ}}',
+'pagecategories' => '{{PLURAL:$1|Category|ଶà­à¬°à­‡à¬£à­€à¬¸à¬¬à­}}',
'category_header' => '"$1" ବିଭାଗରେ ଥିବା ଫରଦଗà­à¬¡à¬¼à¬¿à¬•',
'subcategories' => 'ସାନ ଶà­à¬°à­‡à¬£à­€à¬¸à¬¬à­',
'category-media-header' => '"$1" ବିଭାଗରେ ଥିବା ଫରଦଗà­à¬¡à¬¼à¬¿à¬•',
-'category-empty' => "''à¬à¬¹à¬¿ ଶà­à¬°à­‡à¬£à­€ ଭିତରେ କିଛି ଫରଦ ବା ମାଧà­à­Ÿà¬® ନାହିଠ।''",
-'hidden-categories' => '{{PLURAL:$1|Hidden category|ଲà­à¬šà¬¿à¬¥à¬¿à¬¬à¬¾ ବିଭାଗ}}',
+'category-empty' => "''à¬à¬¹à¬¿ ଶà­à¬°à­‡à¬£à­€ ଭିତରେ କିଛି ପୃଷà­à¬ à¬¾ ବା ମାଧà­à­Ÿà¬® ନାହିଠ।''",
+'hidden-categories' => '{{PLURAL:$1|Hidden category|ଲà­à¬šà¬¿à¬¥à¬¿à¬¬à¬¾ ଶà­à¬°à­‡à¬£à­€}}',
'hidden-category-category' => 'ଲà­à¬šà¬¿à¬°à¬¹à¬¿à¬¥à¬¿à¬¬à¬¾ ଶà­à¬°à­‡à¬£à­€',
'category-subcat-count' => '{{PLURAL:$2|à¬à¬¹à¬¿ ଶà­à¬°à­‡à¬£à­€à¬Ÿà¬¿à¬°à­‡ କେବଳ ତଳେଥିବା ସାନ ଶà­à¬°à­‡à¬£à­€à¬—à­à¬¡à¬¿à¬• ଅଛନà­à¬¤à¬¿ । |à¬à¬¹à¬¿ ଶà­à¬°à­‡à¬£à­€à¬Ÿà¬¿à¬°à­‡ ସରà­à¬¬à¬®à­‹à¬Ÿ $2 ରୠତଳେଥିବା à¬à¬¹à¬¿ {{PLURAL:$1|subcategory|$1 ଶà­à¬°à­‡à¬£à­€à¬—à­à¬¡à¬¿à¬•}} ଅଛନà­à¬¤à¬¿ । }}',
+'category-article-count' => '{{PLURAL:$2|à¬à¬¹à¬¿ ଶà­à¬°à­‡à¬£à­€à¬°à­‡ ତଳେଥିବ ପୃଷà­à¬ à¬¾à¬¸à¬¬à­ ଅଛି ।|ସରà­à¬¬à¬®à­‹à¬Ÿ $2 ରୠà¬à¬¹à¬¿ ଶà­à¬°à­‡à¬£à­€ ଭିତରେ {{PLURAL:$1|ଟି ପୃଷà­à¬ à¬¾|$1ଟି ପୃଷà­à¬ à¬¾}} ଅଛି ।}}',
'listingcontinuesabbrev' => 'ଆହà­à¬°à¬¿ ଅଛି..',
'about' => 'ବାବଦରେ',
-'article' => 'ସୂଚୀ ଫରଦ',
-'newwindow' => 'ନୂଆ ଉଇà¬à¬¡à­‹à¬°à­‡ ଖୋଲିବ',
-'cancel' => 'ନାକଚ କରିଦିଅ',
+'article' => 'ସୂଚୀପତà­à¬°',
+'newwindow' => '(à¬à¬¹à¬¾ ନୂଆ ଉଇଣà­à¬¡à­‹à¬°à­‡ ଖୋଲିବ)',
+'cancel' => 'ନାକଚ କରିଦିଅନà­à¬¤à­',
'moredotdotdot' => 'ଅଧିକ...',
-'mypage' => 'ମୋ ଫରଦ',
+'mypage' => 'ମୋ ପୃଷà­à¬ à¬¾',
'mytalk' => 'ମୋ ଆଲୋଚନା',
'anontalk' => 'à¬à¬¹à¬¿ ଆଇ.ପି. ଠିକଣା ଉପରେ ଆଲୋଚନା',
'navigation' => 'ଦିଗବାରେଣି',
@@ -117,60 +121,61 @@ $messages = array(
'qbpageoptions' => 'à¬à¬‡à¬Ÿà¬¾ ଫରà­à¬¦',
'qbpageinfo' => 'ଭିତର ଚିଜ',
'qbmyoptions' => 'ମୋର ଫରà­à¬¦',
-'qbspecialpages' => 'ବିଶେଷ ଫରଦ',
+'qbspecialpages' => 'ନିଆରା ପୃଷà­à¬ à¬¾',
# Vector skin
-'vector-action-addsection' => 'ଲେଖା ମିଶାଇବା',
-'vector-action-delete' => 'ଲିଭେଇବେ',
-'vector-action-move' => 'ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
-'vector-action-protect' => 'କିଳିବେ',
-'vector-action-undelete' => 'ଲିଭାଇବେ ନାହିà¬',
-'vector-action-unprotect' => 'କିଳିବେ ନାହିà¬',
-'vector-namespace-category' => 'ବିଭାଗ',
-'vector-namespace-image' => 'ଫାଇଲ',
-'vector-namespace-main' => 'ଫରଦ',
-'vector-namespace-media' => 'ମେଡିଆ ପରଦ',
-'vector-view-create' => 'ତିଆରି',
-'vector-view-edit' => 'ବଦଳାଇବେ',
-'vector-view-history' => 'ଇତିହାସ ଦେଖ',
-'vector-view-view' => 'ପଢ଼ିବେ',
-'vector-view-viewsource' => 'ଉତà­à¬¸ ଦେଖ',
-'namespaces' => 'ନେମସà­à¬ªà­‡à¬¸',
-
-'errorpagetitle' => 'ଭà­à¬²',
-'tagline' => '{{SITENAME}} ରà­',
-'help' => 'ସାହାଯà­à­Ÿ',
-'search' => 'ଖୋଜିବେ',
-'searchbutton' => 'ଖୋଜିବେ',
-'go' => 'ଯିବା',
-'searcharticle' => 'ଯିବା',
-'history' => 'ଫାଇଲ ଇତିହାସ',
-'history_short' => 'ଇତିହାସ',
-'info_short' => 'ଖବର',
-'printableversion' => 'ଛପାହୋଇପାରିବା ପୃଷà­à¬ à¬¾',
-'permalink' => 'ସବà­à¬¦à¬¿à¬¨à¬¿à¬† ଲିଙà­à¬•',
-'print' => 'ପà­à¬°à¬¿à¬£à­à¬Ÿ କରିବା',
-'edit' => 'ବଦଳାଇବେ',
-'create' => 'ତିଆରି କରିବେ',
-'editthispage' => 'à¬à¬¹à¬¿ ଫରଦଟିକୠବଦଳାଇବା',
-'create-this-page' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ତିଆରିବେ',
-'delete' => 'ଲିଭେଇବେ',
-'deletethispage' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇବେ',
-'protect' => 'କିଳିବେ',
-'protect_change' => 'ବଦଳାଇବା',
-'newpage' => 'ନୂଆ ଫରଦ',
-'talkpagelinktext' => 'କଥାଭାଷା',
-'specialpage' => 'ବିଶେଷ ଫରଦ',
-'personaltools' => 'ନିଜର ଟà­à¬²',
-'talk' => 'ଆଲୋଚନା',
-'views' => 'ଦେଖା',
-'toolbox' => 'ଜନà­à¬¤à­à¬° ପେଡ଼ି',
-'otherlanguages' => 'ଅଲଗା ଭାଷା',
-'redirectedfrom' => '($1 ରୠଲେଉଟି ଆସିଛି)',
-'lastmodifiedat' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $1 ତାରିଖ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।',
-'jumpto' => 'ଡେଇà¬à¬¯à¬¿à¬¬à­‡',
-'jumptonavigation' => 'ଦିଗବାରେଣିକà­',
-'jumptosearch' => 'ଖୋଜିବେ',
+'vector-action-addsection' => 'ଲେଖା ମିଶାଇବା',
+'vector-action-delete' => 'ଲିଭେଇବେ',
+'vector-action-move' => 'ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
+'vector-action-protect' => 'କିଳିବେ',
+'vector-action-undelete' => 'ଲିଭାଇବେ ନାହିà¬',
+'vector-action-unprotect' => 'କିଳିବେ ନାହିà¬',
+'vector-simplesearch-preference' => 'ଆହà­à¬°à¬¿ ଅଧିକ ଖୋଜା ମତାମତ ଗà­à¬¡à¬¼à¬¿à¬• ସଚଳ କରିବେ (କେବଳ ଭେକà­à¬Ÿà¬° ସà­à¬•à¬¿à¬¨)',
+'vector-view-create' => 'ତିଆରି',
+'vector-view-edit' => 'ବଦଳାଇବେ',
+'vector-view-history' => 'ଇତିହାସ ଦେଖିବେ',
+'vector-view-view' => 'ପଢ଼ିବେ',
+'vector-view-viewsource' => 'ଉତà­à¬¸ ଦେଖିବେ',
+'actions' => 'କାମ',
+'namespaces' => 'ନେମସà­à¬ªà­‡à¬¸',
+'variants' => 'ନିଆରା',
+
+'errorpagetitle' => 'ଭà­à¬²',
+'returnto' => '$1କୠଫେରିଯାନà­à¬¤à­ ।',
+'tagline' => '{{SITENAME}} ରà­',
+'help' => 'ସାହାଯà­à­Ÿ',
+'search' => 'ଖୋଜିବେ',
+'searchbutton' => 'ଖୋଜିବେ',
+'go' => 'ଯିବା',
+'searcharticle' => 'ଯିବା',
+'history' => 'ଫାଇଲ ଇତିହାସ',
+'history_short' => 'ଇତିହାସ',
+'info_short' => 'ଖବର',
+'printableversion' => 'ଛପାହୋଇପାରିବା ପୃଷà­à¬ à¬¾',
+'permalink' => 'ସବà­à¬¦à¬¿à¬¨à¬¿à¬† ଲିଙà­à¬•',
+'print' => 'ପà­à¬°à¬¿à¬£à­à¬Ÿ କରିବା',
+'edit' => 'ବଦଳାଇବେ',
+'create' => 'ତିଆରି କରିବେ',
+'editthispage' => 'à¬à¬¹à¬¿ ଫରଦଟିକୠବଦଳାଇବା',
+'create-this-page' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ତିଆରିବେ',
+'delete' => 'ଲିଭେଇବେ',
+'deletethispage' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇବେ',
+'protect' => 'କିଳିବେ',
+'protect_change' => 'ବଦଳାଇବା',
+'newpage' => 'ନୂଆ ପୃଷà­à¬ à¬¾',
+'talkpagelinktext' => 'କଥାଭାଷା',
+'specialpage' => 'ନିଆରା ପୃଷà­à¬ à¬¾',
+'personaltools' => 'ନିଜର ଟà­à¬²',
+'talk' => 'ଆଲୋଚନା',
+'views' => 'ଦେଖା',
+'toolbox' => 'ଜନà­à¬¤à­à¬° ପେଡ଼ି',
+'otherlanguages' => 'ଅଲଗା ଭାଷା',
+'redirectedfrom' => '($1 ରୠଲେଉଟି ଆସିଛି)',
+'lastmodifiedat' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $1 ତାରିଖ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।',
+'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' => '{{SITENAME}} ବାବଦରେ',
@@ -181,14 +186,14 @@ $messages = array(
'currentevents-url' => 'Project:à¬à¬¬à­‡à¬•à¬¾à¬° ଘଟଣା',
'disclaimers' => 'ଆମେ ଦାୟୀ ନୋହà­à¬',
'disclaimerpage' => 'Project:ଆମେ ଦାୟୀ ନୋହà­à¬',
-'edithelp' => 'ଲେଖା ସାହାଜà­à­Ÿ',
+'edithelp' => 'ଲେଖା ସାହାଯà­à­Ÿ',
'edithelppage' => 'Help:ବଦଳାଇବା',
'helppage' => 'Help:ଭିତର ଚିଜ',
'mainpage' => 'ପà­à¬°à¬§à¬¾à¬¨ ପୃଷà­à¬ à¬¾',
-'mainpage-description' => 'ମୂଳ ଫରଦ',
+'mainpage-description' => 'ପà­à¬°à¬§à¬¾à¬¨ ପୃଷà­à¬ à¬¾',
'policy-url' => 'Project:ନୀତି',
-'portal' => 'କମà­à¬¨à¬¿à¬Ÿà¬¿ ପୋଟାଲ',
-'portal-url' => 'Project:ଗୋଷà­à¬ à­€ ଆଲୋଚନା ସଭା',
+'portal' => 'ସଙà­à¬˜ ଆଲୋଚନା ସଭା',
+'portal-url' => 'Project:ସଙà­à¬˜ ଆଲୋଚନା ସଭା',
'privacy' => 'ଗà­à¬®à¬° ନୀତି',
'privacypage' => 'Project:ଗà­à¬®à¬° ନୀତି',
@@ -204,11 +209,11 @@ $messages = array(
'editold' => 'ବଦଳାଇବା',
'viewsourceold' => 'ଉତà­à¬¸ ଦେଖିବେ',
'editlink' => 'ବଦଳାଇବେ',
-'viewsourcelink' => 'ଉତà­à¬¸ ଦେଖ',
+'viewsourcelink' => 'ଉତà­à¬¸ ଦେଖିବେ',
'editsectionhint' => '$1 ଭାଗଟିକୠବଦଳାଇବେ',
'toc' => 'ଭିତର ଚିଜ',
-'showtoc' => 'ଦେଖାଅ',
-'hidetoc' => 'ଲà­à¬šà¬¾à¬…',
+'showtoc' => 'ଦେଖାଇବେ',
+'hidetoc' => 'ଲà­à¬šà¬¾à¬‡à¬¬à­‡',
'site-rss-feed' => '$1 ଆରେସେସ ଫିଡ଼',
'site-atom-feed' => '$1 ଆଟମ ଫିଡ଼',
'page-rss-feed' => '$1 ଟି ଆରେସେସ ଫିଡ଼',
@@ -217,14 +222,14 @@ $messages = array(
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'ପୃଷà­à¬ à¬¾',
-'nstab-user' => ' ଇଉଜର ଫରଦ',
+'nstab-user' => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•à¬° ପୃଷà­à¬ à¬¾',
'nstab-media' => 'ମେଡିଆ ପରଦ',
-'nstab-special' => 'ବିଶେଷ ଫରଦ',
-'nstab-project' => 'ପà­à¬°à¬•à¬³à­à¬ª ଫରଦ',
+'nstab-special' => 'ନିଆରା ପୃଷà­à¬ à¬¾',
+'nstab-project' => 'ପà­à¬°à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾',
'nstab-image' => 'ଫାଇଲ',
'nstab-mediawiki' => 'ଖବର',
-'nstab-template' => 'ଟେà¬à¬ªà¬²à­‡à¬Ÿ',
-'nstab-category' => 'ବିଭାଗ',
+'nstab-template' => 'ଟେମà­à¬ªà¬²à­‡à¬Ÿ',
+'nstab-category' => 'ଶà­à¬°à­‡à¬£à­€:',
# General errors
'error' => 'ଭà­à¬²',
@@ -234,11 +239,22 @@ $messages = array(
ଯଦି ସେମିତି ହୋଇନଥାଠତେବେ ଆପଣ à¬à¬¹à¬¿ ସଫଟବେରରେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ଖୋଜି ପାଇଛନà­à¬¤à¬¿ ।
କେହି ଜଣେ ଟିକେ [[Special:ListUsers/sysop|ପରିଛା]] ଙà­à¬•à­ à¬à¬¹à¬¿ ଇଉଆରେଲ (url) ସହ ଚିଠିଟିଠପଠାଇ ଦିଅନà­à¬¤à­ ।',
+'badtitle' => 'ଖରାପ ନାଆà¬',
+'badtitletext' => 'ଆପଣ ଅନà­à¬°à­‹à¬§ କରିଥିବା ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଭà­à¬², ଖାଲି ଅଛି ବା ବାକି ଭାଷା ସାଙà­à¬—ରେ ଭà­à¬²à¬°à­‡ ଯୋଡା ଯାଇଛି ବା ଭà­à¬² ଇଣà­à¬Ÿà¬° ଉଇକି ନାଆଠଦିଅଯାଇଛି ।
+à¬à¬¥à¬¿à¬°à­‡ ଥିବା ଗୋଟିଠବା ଦà­à¬‡à¬Ÿà¬¿ ଅକà­à¬·à¬° ନାଆଠଭାବରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇ ପାରିବ ନାହିଠ।',
'viewsource' => 'ଉତà­à¬¸ ଦେଖିବେ',
# Login and logout pages
-'yourname' => 'ଇଉଜର ନାଆà¬',
-'yourpassword' => 'ପାସଉଆଡ଼',
+'logouttext' => "'''ଆପଣ ଲଗାଆଉଟ କରିଦେଲେ'''
+
+ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୠଯାଇପାରିବେ, କିମà­à¬¬à¬¾ [[Special:UserLogin|ଆଉଥରେ]] ଆଗର ଇଉଜର ନାଆà¬à¬°à­‡/ଅଲଗା ନାଆà¬à¬°à­‡ ଲଗଇନ କରିପାରିବେ ।
+ଜାଣିରଖନà­à¬¤à­, କିଛି ପୃଷà­à¬ à¬¾ ଲଗାଆଉଟ କଲାପରେ ବି ଆଗପରି ଦେଖାଯାଇପାରେ, ଆପଣ ବà­à¬°à¬¾à¬‰à¬œà¬° କାସକୠହଟାଇଲା ଯାà¬à¬ à¬à¬¹à¬¾ à¬à¬®à¬¿à¬¤à¬¿ ରହିବ ।",
+'welcomecreation' => '== $1!, ଆପଣଙà­à¬• ଖାତାଟି ତିଆରି ହୋଇଗଲା==
+ତେବେ, ନିଜର [[Special:Preferences|{{SITENAME}} ପସନà­à¬¦à¬¸à¬¬à­à¬•à­]] ବଦଳାଇବାକୠଭà­à¬²à¬¿à¬¬à­‡ ନାହିଠ।',
+'yourname' => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•à¬° ନାଆà¬:',
+'yourpassword' => 'ପାସବାରà­à¬¡à¬¼',
+'yourpasswordagain' => 'ପାସବାରà­à¬¡à¬¼ ଆଉଥରେ:',
+'remembermypassword' => 'à¬à¬¹à¬¿ ବà­à¬°à¬¾à¬‰à¬œà¬°à¬°à­‡ (ସବà­à¬ à­ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଠମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
'login' => 'ଲଗଇନ',
'nav-login-createaccount' => 'ଲଗିନ / ଖାତା ଖୋଲିବା',
'loginprompt' => "{{SITENAME}}ରେ ଲଗ ଇନ କରିବାପାଇଠଆପଣଙà­à¬•à­ '''କà­à¬•à¬¿''' ସଚଳ କରିବାକୠପଡ଼ିବ ।",
@@ -250,11 +266,22 @@ $messages = array(
'nologinlink' => 'ନà­à¬† ଖାତାଟିଠଖୋଲିବା',
'createaccount' => 'ନà­à¬† ଖାତା ଖୋଲିବା',
'gotaccountlink' => 'ଲଗଇନ',
+'createaccountreason' => 'କାରଣ:',
+'loginerror' => 'ଲଗ‌‌ଇନ ଭà­à¬²',
+'loginsuccesstitle' => 'ଠିକଭାବେ ଲଗଇନ ହେଲା',
+'loginsuccess' => "'''ଆପଣ {{SITENAME}}ରେ \"\$1\" ଭାବରେ ଲଗଇନ କରିଛନà­à¬¤à¬¿ ।'''",
+'wrongpasswordempty' => 'ଦିଆଯାଇଥିବା ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿ ଖାଲି ଛଡ଼ାଯାଇଛି ।</br>
+ଦୟାକରି ଆଉଥରେ ଚେଷà­à¬Ÿà¬¾ କରନà­à¬¤à­ ।',
+'mailmypassword' => 'ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿à¬•à­ ଇମେଲ କରି ପଠାଇବେ',
+'emailconfirmlink' => 'ଆପଣଙà­à¬• ଇମେଲ ଆଇ.ଡି.ଟି ଠିକ ବୋଲି ଥୟ କରନà­à¬¤à­',
+'accountcreated' => 'ଖାତାଟି ଖୋଲାହୋଇଗଲା',
+'accountcreatedtext' => '$1 ପାଇଠନୂଆ ଖାତାଟିଠତିଆରି ହୋଇଗଲା ।',
'loginlanguagelabel' => 'ଭାଷା: $1',
# Password reset dialog
-'oldpassword' => 'ପୂରà­à¬¬ ପାସଉଆଡ଼:',
-'newpassword' => 'ନà­à¬† ପାସଉଆଡ଼:',
+'oldpassword' => 'ପà­à¬°à­à¬£à¬¾ ପାସଉଆଡ଼:',
+'newpassword' => 'ନୂଆ ପାସବାରà­à¬¡à¬¼:',
+'retypenew' => 'ପାସବାରà­à¬¡à¬¼ ଆଉଥରେ ଦିଅନà­à¬¤à­:',
# Edit page toolbar
'bold_sample' => 'ବୋଲà­à¬¡ ଲେଖା',
@@ -281,38 +308,61 @@ $messages = array(
'subject' => 'ବିଷୟ/ମୂଳ ଲେଖା',
'minoredit' => 'à¬à¬¹à¬¾ ଖà­à¬¬ ଛୋଟ ବଦଳଟିà¬',
'watchthis' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଦେଖିବେ',
-'savearticle' => 'ସାଇତି ରଖ',
+'savearticle' => 'ସାଇତିବେ',
'preview' => 'ସାଇତିବା ଆଗରୠଦେଖଣା',
'showpreview' => 'ଦେଖଣା',
-'showdiff' => 'ବଦଳଗà­à¬¡à¬¿à¬•à­ ଦେଖାଅ',
-'anoneditwarning' => "'''ଜାଣିରଖà¬à¬¤à­:''' ଆପଣ ଲଗଇନ କରିନାହାà¬à¬¤à¬¿ ।
-à¬à¬¹à¬¿ ଫରଦର '''ଇତିହାସ''' ଫରଦରେ ଆପଣà¬à¬• ଆଇପି ଠିକଣାତି ସାଇତା ହୋଇଯିବ ।",
+'showdiff' => 'ବଦଳଗà­à¬¡à¬¼à¬¿à¬• ଦେଖାଇବେ',
+'anoneditwarning' => "'''ଜାଣିରଖନà­à¬¤à­:''' ଆପଣ ଲଗଇନ କରିନାହାନà­à¬¤à¬¿ ।
+à¬à¬¹à¬¿ ଫରଦର '''ଇତିହାସ''' ପୃଷà­à¬ à¬¾à¬°à­‡ ଆପଣଙà­à¬• ଆଇପି ଠିକଣାଟି ସାଇତା ହୋଇଯିବ ।",
+'summary-preview' => 'ସାରକଥା ଦେଖଣା:',
'loginreqlink' => 'ଲଗଇନ',
'newarticle' => '(ନà­à¬†)',
-'noarticletext' => 'à¬à¬¹à¬¿ ଫରଦଟିରେ କିଛି ବି ଲେଖା ନାହିଠ।
-ଆପଣ [[Special:Search/{{PAGENAME}}|à¬à¬¹à¬¿ ଲେଖାଟିର ନାଆà¬]] ବାକି ଫରଦମାନଙà­à¬•à¬°à­‡ ଖୋଜି ପାରନà­à¬¤à¬¿,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|ଫରଦ={{FULLPAGENAMEE}}}} ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ଫରଦସବà­à¬•à­ ଖୋଜି ପାରନà­à¬¤à¬¿],
-କିମà­à¬¬à¬¾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} à¬à¬¹à¬¿ ଫରଦଟିକୠବଦଳାଇ ପାରନà­à¬¤à¬¿]</span> ।',
+'newarticletext' => "ଆପଣ ଖୋଲିଥିବା ଲିଙà­à¬•à¬Ÿà¬¿à¬°à­‡ à¬à¬¯à¬¾à¬à¬ କିଛିବି ପୃଷà­à¬ à¬¾ ନାହିଠ।
+à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ତିଆରି କରିବା ପାଇଠତଳ ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ (ଅଧିକ ଜାଣିବା ପାଇଠ[[{{MediaWiki:Helppage}}|ସାହାଯà­à­Ÿ ପୃଷà­à¬ à¬¾]] ଦେଖନà­à¬¤à­) ।
+ଯଦି ଆପଣ à¬à¬ à¬¾à¬•à­ ଭà­à¬²à¬°à­‡ ଆସିଯାଇଥାନà­à¬¤à¬¿ ତେବେ ଆପଣଙà­à¬• ବà­à¬°à¬¾à¬‰à¬œà¬°à¬° '''Back''' ପତିଟି ଦବାନà­à¬¤à­ ।",
+'noarticletext' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬°à­‡ କିଛି ବି ଲେଖା ନାହିଠ।
+ଆପଣ [[Special:Search/{{PAGENAME}}|à¬à¬¹à¬¿ ଲେଖାଟିର ନାଆà¬]] ବାକି ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à¬°à­‡ ଖୋଜି ପାରନà­à¬¤à¬¿,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬•à­ ଖୋଜି ପାରନà­à¬¤à¬¿],
+କିମà­à¬¬à¬¾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ବଦଳାଇ ପାରନà­à¬¤à¬¿]</span> ।',
+'previewnote' => "'''ଜାଣିରଖନà­à¬¤à­ ଯେ, à¬à¬¹à¬¾ କେବଳ à¬à¬• ଦେଖଣା ।'''
+ଆପଣ କରିଥିବା ବଦଳସବୠà¬à¬¯à¬¾à¬à¬ ସାଇତା ଯାଇନାହିà¬!",
'editing' => '$1 କୠବଦଳାଉଛି',
'editingsection' => '$1 (ଭାଗ)କୠବଦଳାଇବେ',
+'editconflict' => 'ବଦଳାଇବା ଦà­à¬µà¬¨à­à¬¦: $1',
+'explainconflict' => "ଆପଣ ବଦଳାଇବା ଆରମà­à¬­ କରିବା ଭିତରେ କେହିଜଣେ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬•à­ ବଦଳାଇଛନà­à¬¤à¬¿ ।</br>
+ଉପର ଲେଖା ଜାଗାଟି à¬à¬¹à¬¾ ଯେମିତି ଅଛି ସେମିତି ଥିବା ଲେଖାଟି ଦେଖାଉଛି ।</br>
+ତଳ ଜାଗାଟିରେ ଆପଣ କରିଥିବା ବଦଳ ଦେଖାଉଛି ।</br>
+à¬à¬¬à­‡ ଥିବା ଲେଖାରେ ଆପଣଙà­à¬•à­ ନିଜ ବଦଳକୠମିଶାଇବାକୠହେବ ।</br>
+ଯଦି ଆପଣ \"{{int:savearticle}}\" ଦବାନà­à¬¤à¬¿ ତେବେ '''କେବଳ''' ଉପର ଲେଖାଟି ସାଇତା ହୋଇଯିବ ।",
+'titleprotectedwarning' => "'''ଚେତାବନୀ: à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ କିଳାଯାଇଅଛି ଯାହାକୠତିଆରିବା ପାଇଠ[[Special:ListGroupRights|ବିଶେଷ କà­à¬·à¬®à¬¤à¬¾]] ଥିବା ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ଲୋଡ଼ା ।'''
+ଆପଣଙà­à¬• ସà­à¬¬à¬¿à¬§à¬¾ ପାଇଠତଳେ ନଗଦ ଲଗ ପà­à¬°à¬¬à­‡à¬¶ ଦିଆଗଲା:",
'templatesused' => 'à¬à¬¹à¬¿ ଫରଦରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇଥିବା {{PLURAL:$1|ଟେମà­à¬ªà¬²à­‡à¬Ÿ|ଟେମà­à¬ªà¬²à­‡à¬Ÿà¬¸à¬¬à­}}:',
+'templatesusedpreview' => 'à¬à¬¹à¬¿ ଫରଦରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇଥିବା {{PLURAL:$1|ଟେମà­à¬ªà¬²à­‡à¬Ÿ|ଟେମà­à¬ªà¬²à­‡à¬Ÿà¬¸à¬¬à­}}:',
'template-protected' => '(କିଳାଯାଇଥିବା)',
'template-semiprotected' => '(ଅଧା କିଳାଯାଇଥିବା)',
+'edit-conflict' => 'ବଦଳାଇବା ଦà­à¬µà¬¨à­à¬¦.',
# History pages
-'viewpagelogs' => 'à¬à¬¹à¬¿ ଫରଦ ପାଇଠଲଗଗà­à¬¡à¬¼à¬¿à¬•à­ ଦେଖନà­à¬¤à­ ।',
+'viewpagelogs' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾ ପାଇଠଲଗଗà­à¬¡à¬¼à¬¿à¬•à­ ଦେଖନà­à¬¤à­ ।',
'currentrev-asof' => '$1 ହୋଇଥିବା ରିଭିଜନ',
'revisionasof' => '$1 ଅନà­à¬¸à¬¾à¬°à­‡ କରାଯାଇଥିବା ବଦଳ',
'previousrevision' => 'ପà­à¬°à­à¬£à¬¾ ସଙà­à¬•à¬³à¬¨',
+'nextrevision' => 'ନୂଆ ସଙà­à¬•à¬³à¬¨',
+'currentrevisionlink' => 'ନଗଦ ସଙà­à¬•à¬³à¬¨',
'cur' => 'ଦାନକର',
'next' => 'ପରେ',
'last' => 'ଆଗ',
'page_first' => 'ପà­à¬°à¬¥à¬®',
+'histlegend' => "ଅଲଗା ବଛା:ସଙà­à¬•à¬³à¬¨ ସବà­à¬° ରେଡ଼ିଓ ବାକà­à¬¸à¬•à­ ବାଛି ତà­à¬³à¬¨à¬¾ କରନà­à¬¤à­ ଓ à¬à¬£à­à¬Ÿà¬° ଦବାନà­à¬¤à­ ବା ତଳେ ଥିବା ବଟନ ଦବାନà­à¬¤à­ ।<br />
+ସାରକଥା: '''({{int:cur}})''' = ନଗଦ ସଙà­à¬•à¬³à¬¨à¬°à­‡ ଥିବା ତଫାତ, '''({{int:last}})''' = ଆଗ ସଙà­à¬•à¬³à¬¨ ଭିତରେ ତଫାତ, '''{{int:minoreditletter}}''' = ଟିକେ ବଦଳ ।",
'history-fieldset-title' => 'ଇତିହାସ ଖୋଜିବା',
'histfirst' => 'ସବà­à¬ à­ ପà­à¬°à­à¬£à¬¾',
'histlast' => 'ନଗଦ',
'historyempty' => '(ଖାଲି)',
+# Revision feed
+'history-feed-description' => 'ଉଇକିରେ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ªà¬¾à¬‡à¬ ସଙà­à¬•à¬³à¬¨ ଇତିହାସ',
+
# Revision deletion
'rev-delundel' => 'ଦେଖାଇବା/ଲà­à¬šà¬¾à¬‡à¬¬à¬¾',
'revdelete-log' => 'କାରଣ:',
@@ -325,46 +375,65 @@ $messages = array(
'revertmerge' => 'ମିଶାଇବା ନାହିà¬',
# Diffs
-'history-title' => '"$1" ପାଇଠସà¬à¬•à¬³à¬¨ ଇତିହାସ',
+'history-title' => '"$1" ପାଇଠସଙà­à¬•à¬³à¬¨ ଇତିହାସ',
'difference' => '(ରିଭିଜନ ଭିତରେ ଥିବା ତଫାତ)',
'lineno' => '$1 କ ଧାଡ଼ି:',
-'compareselectedversions' => 'ବଛାହୋଇଥିବା ସà¬à¬•à¬³à¬¨ ଗà­à¬¡à¬¼à¬¿à¬•à­ ତଉଲ',
+'compareselectedversions' => 'ବଛାହୋଇଥିବା ସଙà­à¬•à¬³à¬¨ ଗà­à¬¡à¬¼à¬¿à¬•à­ ତଉଲ',
'editundo' => 'ପଛକୠଫେରିବା',
# Search results
-'searchresults' => 'ଖୋଜିବାରୠମିଳିଲା',
-'searchresults-title' => '"$1" ପାଇଠଖୋଜିବାରୠମିଳିଲା',
-'searchresulttext' => '{{SITENAME}} ରେ ଖୋଜିବା ବାବଦରେ ଅଧିକ ଜାଣିବା ପାଇà¬, [[{{MediaWiki:Helppage}}|{{int:help}}]] ଦେଖନà­à¬¤à­',
-'searchsubtitle' => 'ଆପଣ \'\'\'[[:$1]]\'\'\' ପାଇଠ([[Special:Prefixindex/$1|"$1" ନାଆà¬à¬°à­‡ ଆରମà­à¬­ ହୋଇଥିବା ସବୠପୃଷà­à¬ à¬¾]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" କୠଯୋଡ଼ାଥିବା ସବà­à¬¤à¬• ପୃଷà­à¬ à¬¾]])',
-'notitlematches' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬° ନାଆଠମିଶà­à¬¨à¬¾à¬¹à¬¿à¬',
-'notextmatches' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬° ନାଆଠମିଶà­à¬¨à¬¾à¬¹à¬¿à¬',
-'prevn' => '{{PLURAL:$1|$1}}ର ଆଗରà­',
-'nextn' => '{{PLURAL:$1|$1}} ପର',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ଟି ଦେଖିବେ',
-'search-result-size' => '$1 ({{PLURAL:$2|1 ଶବà­à¬¦|$2 ଶବà­à¬¦}})',
-'search-redirect' => '($1 କୠଆଗକୠବଢେଇନିଅ )',
-'search-section' => '(ଭାଗ $1)',
-'search-suggest' => 'ଆପଣ $1 ଭାବି ଖୋଜିଥିଲେ କି',
-'search-interwiki-caption' => 'ସାଙà­à¬—ରେ ଚାଲିଥିବା ବାକି ପà­à¬°à¬•à¬³à­à¬ªà¬¸à¬¬à­',
-'search-interwiki-default' => '$1 ଫଳାଫଳ:',
-'search-interwiki-more' => '(ଅଧିକ)',
-'search-mwsuggest-enabled' => 'ମତାମତ ସହ',
-'search-mwsuggest-disabled' => 'ମତାମତ ନାହିà¬',
-'searchall' => 'ସବà­',
-'nonefound' => "'''ଦେଖà¬à¬¤à­''': ଆପଣ ଖାଲି କିଛି ନେମସà­à¬ªà­‡à¬¸à¬•à­ ଆପେ ଆପେ ଖୋଜିପାରିବେ ।
-ସବୠପà­à¬°à¬•à¬¾à¬°à¬° ଲେଖା (ଆଲୋଚନା ଫରଦ, ଟେà¬à¬ªà¬²à­‡à¬Ÿ ହେରିକା) ଖୋଜିବା ପାଇଠନିଜ ପà­à¬°à¬¶à­à¬¨ ଆଗରେ ''all:'' ଯୋଡ଼ି ଖୋଜନà­à¬¤à­, ନହେଲେ ଦରକାରି ନେମସà­à¬ªà­‡à¬¸à¬•à­ ପà­à¬°à¬¿à¬«à¬¿à¬•à­à¬¸ କରି ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ ।",
-'powersearch' => 'ଗହିର ଖୋଜା',
-'powersearch-legend' => 'ଗହିର ଖୋଜା',
-'powersearch-ns' => 'ନେମସà­à¬ªà­‡à¬¸à¬°à­‡ ଖୋଜ',
-'powersearch-redir' => 'ପଛକୠଲେଉଟାଯାଇଥିବା ଲେଖାଗà­à¬¡à¬¼à¬¿à¬•à¬° ତାଲିକା',
-'powersearch-field' => 'ଖୋଜ',
-'powersearch-toggleall' => 'ସବà­',
-'powersearch-togglenone' => 'କିଛି ନାହିà¬',
+'searchresults' => 'ଖୋଜିବାରୠମିଳିଲା',
+'searchresults-title' => '"$1" ପାଇଠଖୋଜିବାରୠମିଳିଲା',
+'searchresulttext' => '{{SITENAME}} ରେ ଖୋଜିବା ବାବଦରେ ଅଧିକ ଜାଣିବା ପାଇà¬, [[{{MediaWiki:Helppage}}|{{int:help}}]] ଦେଖନà­à¬¤à­',
+'searchsubtitle' => 'ଆପଣ \'\'\'[[:$1]]\'\'\' ପାଇଠ([[Special:Prefixindex/$1|"$1" ନାଆà¬à¬°à­‡ ଆରମà­à¬­ ହୋଇଥିବା ସବୠପୃଷà­à¬ à¬¾]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" କୠଯୋଡ଼ାଥିବା ସବà­à¬¤à¬• ପୃଷà­à¬ à¬¾]])',
+'searchsubtitleinvalid' => "ଆପଣ '''$1''' ଖୋଜିଥିଲେ",
+'notitlematches' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬° ନାଆଠମିଶà­à¬¨à¬¾à¬¹à¬¿à¬',
+'notextmatches' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬° ନାଆଠମିଶà­à¬¨à¬¾à¬¹à¬¿à¬',
+'prevn' => '{{PLURAL:$1|$1}}ର ଆଗରà­',
+'nextn' => '{{PLURAL:$1|$1}} ପର',
+'prevn-title' => 'ଆଗରୠମିଳିଥିବା $1ଟି {{PLURAL:$1|result|ଫଳ}}',
+'nextn-title' => 'ଆଗର $1ଟି {{PLURAL:$1|result|ଫଳସବà­}}',
+'shown-title' => '$1 ପà­à¬°à¬¤à¬¿ ପୃଷà­à¬ à¬¾à¬° {{PLURAL:$1|ଫଳାଫଳ|ଫଳାଫଳ}} ଦେଖାଇବେ ।',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ଟି ଦେଖିବେ',
+'searchmenu-new' => "'''\"[[:\$1]]\"ଟି à¬à¬¹à¬¿ ଉଇକିରେ ତିଆରି କରିବେ!'''",
+'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 ({{PLURAL:$2|1 ଶବà­à¬¦|$2 ଶବà­à¬¦}})',
+'search-redirect' => '($1 କୠଆଗକୠବଢେଇନିଅ )',
+'search-section' => '(ଭାଗ $1)',
+'search-suggest' => 'ଆପଣ $1 ଭାବି ଖୋଜିଥିଲେ କି?',
+'search-interwiki-caption' => 'ସାଙà­à¬—ରେ ଚାଲିଥିବା ବାକି ପà­à¬°à¬•à¬³à­à¬ªà¬¸à¬¬à­',
+'search-interwiki-default' => '$1 ଫଳାଫଳ:',
+'search-interwiki-more' => '(ଅଧିକ)',
+'search-mwsuggest-enabled' => 'ମତାମତ ସହ',
+'search-mwsuggest-disabled' => 'ମତାମତ ନାହିà¬',
+'searchall' => 'ସବà­',
+'showingresults' => "ତଳେ {{PLURAL:$1|'''à­§''' ଟି ଫଳ ଦେଖାଉଛà­|'''$1'''ଟି ଫଳ}} ଯାହା #'''$2'''ରେ ଆରମà­à¬­ ହୋଇଅଛି ।",
+'showingresultsheader' => "'''$4''' ପାଇଠ{{PLURAL:$5|'''$3'''ର '''$1''' ଫଳ |'''$3'''ର '''$1 - $2''' ଫଳ }}",
+'nonefound' => "'''ଜାଣି ରଖନà­à¬¤à­''': ଆପଣ ଖାଲି କିଛି ନେମସà­à¬ªà­‡à¬¸à¬•à­ ଆପେ ଆପେ ଖୋଜିପାରିବେ ।
+ସବୠପà­à¬°à¬•à¬¾à¬°à¬° ଲେଖା (ଆଲୋଚନା ପୃଷà­à¬ à¬¾, ଟେମà­à¬ªà¬²à­‡à¬Ÿ ଆଦି) ଖୋଜିବା ପାଇଠନିଜ ପà­à¬°à¬¶à­à¬¨ ଆଗରେ ''all:'' ଯୋଡ଼ି ଖୋଜନà­à¬¤à­, ନହେଲେ ଦରକାରି ନେମସà­à¬ªà­‡à¬¸à¬•à­ ଲେଖାର ନାଆଠଆଗରେ ଯୋଡ଼ି ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ ।",
+'search-nonefound' => 'ଆପଣ ଖୋଜିଥିବା ପà­à¬°à¬¶à­à¬¨ ପାଇଠକିଛି ଫଳ ମିଳିଲା ନାହିଠ।',
+'powersearch' => 'ଗହିର ଖୋଜା',
+'powersearch-legend' => 'ଗହିର ଖୋଜା',
+'powersearch-ns' => 'ନେମସà­à¬ªà­‡à¬¸à¬°à­‡ ଖୋଜ',
+'powersearch-redir' => 'ପଛକୠଲେଉଟାଯାଇଥିବା ଲେଖାଗà­à¬¡à¬¼à¬¿à¬•à¬° ତାଲିକା',
+'powersearch-field' => 'ଖୋଜ',
+'powersearch-toggleall' => 'ସବà­',
+'powersearch-togglenone' => 'କିଛି ନାହିà¬',
# Quickbar
'qbsettings-none' => 'କିଛି ନାହିà¬',
# Preferences page
+'preferences' => 'ପସନà­à¬¦',
'mypreferences' => 'ମୋ ପସନà­à¬¦',
'skin-preview' => 'ଦେଖଣା',
'searchresultshead' => 'ଖୋଜିବା',
@@ -385,6 +454,12 @@ $messages = array(
'grouppage-sysop' => '{{ns:project}}:ପରିଛା (ଆଡମିନ)',
+# User rights log
+'rightslog' => 'ସଭà­à­Ÿà¬™à­à¬• ଅଧିକାରର ଲଗ',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-move-subpages' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ତାହାର ଉପପୃଷà­à¬ à¬¾ ସହିତ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡ ।',
+
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବà­}}',
'recentchanges' => 'ନଗଦ ବଦଳ',
@@ -394,21 +469,21 @@ $messages = array(
'recentchanges-label-minor' => 'à¬à¬¹à¬¾ ଗୋଟିଠଛୋଟ ବଦଳ',
'recentchanges-label-bot' => "à¬à¬¹à¬¿ ବଦଳଟି ଜଣେ '''ବଟ'''ଙà­à¬• ଦେଇ କରାଯାଇଥିଲା",
'recentchanges-label-unpatrolled' => 'à¬à¬¹à¬¿ ବଦଳଟିକୠଠଯାà¬à¬ ପରଖା ଯାଇନାହିà¬',
-'rclistfrom' => '$1ରୠଆରମà­à¬­ କରି ନୂଆ ବଦଳଗà­à¬¡à¬¼à¬¿à¬• ଦେଖାଅ',
+'rclistfrom' => '$1ରୠଆରମà­à¬­ କରି ନୂଆ ବଦଳଗà­à¬¡à¬¼à¬¿à¬• ଦେଖାଇବେ',
'rcshowhideminor' => '$1 ଟି ଛୋଟମୋଟ ବଦଳ',
'rcshowhidebots' => '$1 ଜଣ ବଟ',
'rcshowhideliu' => '$1 ଜଣ ନାଆଠଲେଖାଇଥିବା ଇଉଜର',
'rcshowhideanons' => '$1 ଜଣ ଅଜଣା ଇଉଜର',
'rcshowhidemine' => '$1 ମà­à¬ କରିଥିବା ବଦଳ',
-'rclinks' => 'ଗଲା $2 ଦିନର $1 ବଦଳଗà­à¬¡à¬¼à¬¿à¬•à­ ଦେଖାଅ<br />$3',
+'rclinks' => 'ଗଲା $2 ଦିନର $1 ବଦଳଗà­à¬¡à¬¼à¬¿à¬•à­ ଦେଖାଇବେ<br />$3',
'diff' => 'ଅଦଳ ବଦଳ',
'hist' => 'ଇତିହାସ',
-'hide' => 'ଲà­à¬šà¬¾à¬…',
-'show' => 'ଦେଖାଅ',
+'hide' => 'ଲà­à¬šà¬¾à¬‡à¬¬à­‡',
+'show' => 'ଦେଖାଇବେ',
'minoreditletter' => 'ଟିକେ',
'newpageletter' => 'ନୂଆ',
'boteditletter' => 'ବଟ',
-'rc-enhanced-expand' => 'ପà­à¬°à¬¾ ଦେଖାଅ (ଜାଭାସà­à¬•à­à¬°à¬¿à¬ªà¬Ÿ ଦରକାର)',
+'rc-enhanced-expand' => 'ପà­à¬°à¬¾ ଦେଖାଇବେ (ଜାଭାସà­à¬•à­à¬°à¬¿à¬ªà¬Ÿ ଦରକାର)',
'rc-enhanced-hide' => 'ବେଶି କଥାସବୠଲà­à¬šà¬¾à¬‡à¬¦à¬¿à¬…',
# Recent changes linked
@@ -416,34 +491,37 @@ $messages = array(
'recentchangeslinked-feed' => 'ଯୋଡ଼ାଥିବା ବଦଳ',
'recentchangeslinked-toolbox' => 'ଯୋଡ଼ାଥିବା ବଦଳ',
'recentchangeslinked-title' => '"$1" ସାà¬à¬—ରେ ଜୋଡ଼ାଥିବା ବଦଳ',
-'recentchangeslinked-noresult' => 'ଯୋଡ଼ାଯାଇଥିବା ଫରଦ ସବà­à¬°à­‡ à¬à¬‡ ସମୟ ଭିତରେ କିଛି ବଦଳାଯାଇନାହିଠ।',
+'recentchangeslinked-noresult' => 'ଯୋଡ଼ାଯାଇଥିବା ପୃଷà­à¬ à¬¾ ସବà­à¬°à­‡ à¬à¬‡ ସମୟସୀମା ଭିତରେ କିଛି ବଦଳାଯାଇନାହିଠ।',
'recentchangeslinked-summary' => "à¬à¬‡à¬Ÿà¬¿ କିଛିସମୟ ଆଗରୠନିରà­à¬¦à­à¬¦à¬¿à¬·à­à¬Ÿ ପୃଷà­à¬ à¬¾à¬°à­ ଲିଙà­à¬• ହୋଇଥିବା ଆଉ ବଦଳାଯାଇଥିବା (ଅବା ଗୋଟିଠନିରà­à¬¦à­à¬¦à¬¿à¬·à­à¬Ÿ ଶà­à¬°à­‡à¬£à­€à¬°) ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬° ତାଲିକା । [[Special:Watchlist|ମୋର ଦେଖାତାଲିକା]]ର ପୃଷà­à¬ à¬¾ ସବୠ'''ବୋଲଡ଼'''।",
'recentchangeslinked-page' => 'ଫରଦର ନାଆà¬',
'recentchangeslinked-to' => 'ଦିଆଯାଇଥିବା ଫରଦରେ ଯୋଡ଼ା ବାକି ଫରଦମାନଙà­à¬•à¬° ବଦଳ ସବୠଦେଖାନà­à¬¤à­ ।',
# Upload
'upload' => 'ଫାଇଲ ଅପଲୋଡ଼ କରିବେ',
+'uploadlogpage' => 'ଲଗ ଅପଲୋଡ କରିବେ',
'filedesc' => 'ସାରକଥା',
'fileuploadsummary' => 'ସାରକଥା:',
+'uploadedimage' => '"[[$1]]" ଅପଲୋଡ କରାଗଲା',
# Special:ListFiles
'imgfile' => 'ଫାଇଲ',
'listfiles_name' => 'ନାମ',
# File description page
-'file-anchor-link' => 'ଫାଇଲ',
-'filehist' => 'ଫାଇଲ ଇତିହାସ',
-'filehist-help' => 'à¬à¬¹à¬¾ ଫାଇଲଟି ସେତେବେଳେ ଯେମିତି ଦିଶà­à¬¥à¬¿à¬²à¬¾ ତାହା ଦେଖିବା ପାଇଠତାରିଖ/ବେଳା ଉପରେ କà­à¬²à¬¿à¬• କରନà­à¬¤à­',
-'filehist-current' => 'à¬à¬¬à­‡à¬•à¬¾à¬°',
-'filehist-datetime' => 'ତାରିଖ/ବେଳ',
-'filehist-thumb' => 'ନଖ ଦେଖଣା',
-'filehist-thumbtext' => '$1 ପରିକା ସଙà­à¬•à¬³à¬¨à¬° ନଖଦେଖଣା',
-'filehist-user' => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€',
-'filehist-dimensions' => 'ଆକାର',
-'filehist-comment' => 'ମତାମତ',
-'imagelinks' => 'ଫାଇଲର ଲିà¬à¬•à¬¸à¬¬à­',
-'linkstoimage' => 'à¬à¬¹à¬¿ ସବà­{{PLURAL:$1|ପୃଷà­à¬ à¬¾|$1 ପୃଷà­à¬ à¬¾à¬¸à¬¬à­}} à¬à¬¹à¬¿ ଫାଇଲଟିକୠଯୋଡ଼ିଥାନà­à¬¤à¬¿:',
-'sharedupload' => 'à¬à¬¹à¬¿ ଫାଇଲଟି $1 ରୠଆଉ ବାକି ପà­à¬°à¬•à¬³à­à¬ªà¬°à­‡ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇପାରିବ .',
+'file-anchor-link' => 'ଫାଇଲ',
+'filehist' => 'ଫାଇଲ ଇତିହାସ',
+'filehist-help' => 'à¬à¬¹à¬¾ ଫାଇଲଟି ସେତେବେଳେ ଯେମିତି ଦିଶà­à¬¥à¬¿à¬²à¬¾ ତାହା ଦେଖିବା ପାଇଠତାରିଖ/ବେଳା ଉପରେ କà­à¬²à¬¿à¬• କରନà­à¬¤à­',
+'filehist-current' => 'à¬à¬¬à­‡à¬•à¬¾à¬°',
+'filehist-datetime' => 'ତାରିଖ/ବେଳ',
+'filehist-thumb' => 'ନଖ ଦେଖଣା',
+'filehist-thumbtext' => '$1 ପରିକା ସଙà­à¬•à¬³à¬¨à¬° ନଖଦେଖଣା',
+'filehist-user' => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€',
+'filehist-dimensions' => 'ଆକାର',
+'filehist-comment' => 'ମତାମତ',
+'imagelinks' => 'ଫାଇଲର ଲିà¬à¬•à¬¸à¬¬à­',
+'linkstoimage' => 'à¬à¬¹à¬¿ ସବà­{{PLURAL:$1|ପୃଷà­à¬ à¬¾|$1 ପୃଷà­à¬ à¬¾à¬¸à¬¬à­}} à¬à¬¹à¬¿ ଫାଇଲଟିକୠଯୋଡ଼ିଥାନà­à¬¤à¬¿:',
+'sharedupload' => 'à¬à¬¹à¬¿ ଫାଇଲଟି $1 ରୠଆଉ ବାକି ପà­à¬°à¬•à¬³à­à¬ªà¬°à­‡ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇପାରିବ .',
+'uploadnewversion-linktext' => 'à¬à¬¹à¬¿ ଫାଇଲର ନୂଆ ସଙà­à¬•à¬³à¬¨à¬Ÿà¬¿à¬ ଅପଲୋଡ଼ କରିବେ',
# File reversion
'filerevert-comment' => 'କାରଣ:',
@@ -452,28 +530,31 @@ $messages = array(
'filedelete-comment' => 'କାରଣ:',
# Random page
-'randompage' => 'ଯାହିତାହି ଫରଦଟିà¬',
+'randompage' => 'ଯାହିତାହି ପୃଷà­à¬ à¬¾',
# Statistics
-'statistics-pages' => 'ଫରଦ',
+'statistics' => 'ହିସାବ',
+'statistics-pages' => 'ପୃଷà­à¬ à¬¾',
'brokenredirects-edit' => 'ବଦଳାଇବେ',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|byte|ବାଇଟ}}',
'nmembers' => '$1 {{PLURAL:$1|member|ସଭà­à­Ÿ}}',
-'wantedcategories' => 'ଦରକାରି ବିଭାଗ',
-'wantedpages' => 'ଦରକାରି ଫରଦ',
+'wantedcategories' => 'ଦରକାରୀ ଶà­à¬°à­‡à¬£à­€',
+'wantedpages' => 'ଦରକାରି ପୃଷà­à¬ à¬¾',
'wantedpages-badtitle' => '$1 ଉତà­à¬¤à¬°à¬¸à¬¬à­à¬°à­‡ ଥିବା ଭà­à¬² ଟାଇଟଲ',
'wantedfiles' => 'ଦରକାରି ଫାଇଲ',
-'wantedtemplates' => 'ଦରକାରି ଟେà¬à¬ªà¬²à­‡à¬Ÿ',
-'mostlinked' => 'ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଫରଦ',
-'mostlinkedcategories' => 'ବେଶି ଯୋଡ଼ାଯାଇଥିବା ବିଭାଗ',
-'mostlinkedtemplates' => 'ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଟେà¬à¬ªà¬²à­‡à¬Ÿ',
-'mostcategories' => 'ବେଶିବିଭାଗ ଥିବା ଫରଦ',
+'wantedtemplates' => 'ଦରକାରୀ ଟେମà­à¬ªà¬²à­‡à¬Ÿ',
+'mostlinked' => 'ଅଧିକ ଯୋଡ଼ାଯାଇଥିବା ପୃଷà­à¬ à¬¾',
+'mostlinkedcategories' => 'ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଶà­à¬°à­‡à¬£à­€',
+'mostlinkedtemplates' => 'ବେଶୀ ଯୋଡ଼ାଯାଇଥିବା ଟେମà­à¬ªà¬²à­‡à¬Ÿ',
+'mostcategories' => 'ଅଧିକ ଶà­à¬°à­‡à¬£à­€ ଥିବା ପୃଷà­à¬ à¬¾',
'mostimages' => 'ଫାଇଲରେ ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଥିବା',
'prefixindex' => 'ଆଗରୠକିଛି ଯୋଡ଼ା ସହ ଥିବା ସବୠଫରଦସବà­',
+'newpages' => 'ନୂଆ ପୃଷà­à¬ à¬¾',
'move' => 'ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
+'movethispage' => 'à¬à¬‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
'pager-newer-n' => '{{PLURAL:$1|ନୂଆ 1|ନୂଆ $1}}',
'pager-older-n' => '{{PLURAL:$1|ପà­à¬°à­à¬£à¬¾ 1|ପà­à¬°à­à¬£à¬¾ $1}}',
@@ -483,15 +564,23 @@ $messages = array(
'booksources-go' => 'ଯିବା',
# Special:Log
-'log' => 'ଲଗ',
+'log' => 'ଲଗ',
+'logempty' => 'ଲଗରେ ଥିବା ଲେଖା ସହ ମେଳଖାଉ ନାହିଠ।',
# Special:AllPages
-'allpages' => 'ସବୠଫରଦ',
+'allpages' => 'ସବୠପୃଷà­à¬ à¬¾',
'alphaindexline' => '$1 ରୠ$2',
+'prevpage' => 'ଆଗ ପୃଷà­à¬ à¬¾ ($1)',
'allpagesfrom' => 'à¬à¬¹à¬¿ ନାଆà¬à¬°à­‡ ଆରମà­à¬­ ହେଉଥିବା ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦେଖାଇବେ:',
+'allpagesto' => 'à¬à¬¹à¬¿ ନାଆà¬à¬°à­‡ ଶେଷ ହେଉଥିବା ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à­ ଦେଖାଇବେ:',
+'allarticles' => 'ସବୠପୃଷà­à¬ à¬¾',
'allpagessubmit' => 'ଯିବେ',
+# Special:DeletedContributions
+'deletedcontributions' => 'ଲିଭାଇ ଦିଆଯାଇଥିବା ସଭà­à­Ÿà¬™à­à¬• ଅବଦାନ',
+
# Special:LinkSearch
+'linksearch' => 'ବାହାର ଲିଙà­à¬•',
'linksearch-ok' => 'ଖୋଜିବା',
# Special:Log/newusers
@@ -503,32 +592,42 @@ $messages = array(
'emailmessage' => 'ଖବର:',
# Watchlist
-'watchlist' => 'ଦେଖାତାଲିକା',
-'mywatchlist' => 'ମୋର ଦେଖାତାଲିକା',
-'watch' => 'ଦେଖ',
-'watchthispage' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଦେଖିବେ',
-'unwatch' => 'ଦେଖନାହିà¬',
+'watchlist' => 'ଦେଖାତାଲିକା',
+'mywatchlist' => 'ମୋର ଦେଖାତାଲିକା',
+'watch' => 'ଦେଖିବେ',
+'watchthispage' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଦେଖିବେ',
+'unwatch' => 'ଦେଖନାହିà¬',
+'watchlist-details' => 'ଆପଣଙà­à¬• ଦେଖଣା ତାଲିକାରେ ଆଲୋଚନା ପୃଷà­à¬ à¬¾à¬•à­ ଛାଡ଼ି {{PLURAL:$1|$1 ଟି ପୃଷà­à¬ à¬¾|$1 ଟି ପୃଷà­à¬ à¬¾}} ଅଛି ।',
+'watchlist-options' => 'ଦେଖଣା ବିକଳà­à¬ªà¬¸à¬¬à­',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'ଦେଖà­à¬›à¬¿...',
'unwatching' => 'ଦେଖà­à¬¨à¬¾à¬¹à¬¿à¬...',
# Delete
-'actioncomplete' => 'କାମଟି ପà­à¬°à¬¾ ହେଲା',
-'deletedarticle' => '"[[$1]]" ଟି ଉଡ଼ିଗଲା',
-'dellogpage' => 'ଲିଭାଇବା ଲଗ',
-'deletecomment' => 'କାରଣ:',
+'deletepage' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇଦେବେ',
+'confirmdeletetext' => 'ଆପଣ ଗୋଟିଠପୃଷà­à¬ à¬¾à¬° ଇତିହାସ ସହ ତାହାକୠଲିଭାଇବାକୠଯାଉଛନà­à¬¤à¬¿ ।
+à¬à¬¹à¬¾ ଥୟ କରନà­à¬¤à­ ଯେ ଆପଣ à¬à¬¹à¬¾à¬° ପରିଣତି ଜାଣିଛନà­à¬¤à¬¿ ଓ à¬à¬¹à¬¾ [[{{MediaWiki:Policy-url}}|ମିଡ଼ିଆଉଇକିର ନିୟମ]] ଅନà­à¬¸à¬¾à¬°à­‡ କରà­à¬›à¬¨à­à¬¤à¬¿ ।',
+'actioncomplete' => 'କାମଟି ପà­à¬°à¬¾ ହେଲା',
+'deletedtext' => '"<nowiki>$1</nowiki>"କୠଲିଭାଇ ଦିଆଗଲା ।
+ନଗଦ ଲିଭାଯାଇଥିବା ଫାଇଲର ଇତିହାସ $2ରେ ଦେଖନà­à¬¤à­ ।',
+'deletedarticle' => '"[[$1]]" ଟି ଉଡ଼ିଗଲା',
+'dellogpage' => 'ଲିଭାଇବା ଲଗ',
+'deletecomment' => 'କାରଣ:',
+'deleteotherreason' => 'ବାକିି କାରଣ:',
+'deletereasonotherlist' => 'ବାକିି କାରଣ',
# Rollback
-'rollbacklink' => 'ପଛକୠଫେର',
+'rollbacklink' => 'ପà­à¬°à¬¾à¬ªà­à¬°à¬¿ ପଛକୠଫେରିଯିବେ',
# Protect
'protectlogpage' => 'କିଳିବା ଲଗ',
+'protectedarticle' => '"[[$1]]"ଟି କିଳାଗଲା',
'protectcomment' => 'କାରଣ:',
'protectexpiry' => 'ଅଚଳ ହେବ:',
'protect_expiry_invalid' => 'ଅଚଳ ହେବାର ବେଳଟି ଭà­à¬².',
'protect_expiry_old' => 'ଅଚଳ ହେବାର ବେଳ ଅତୀତରେ ଥିଲା.',
-'protect-default' => 'ସବୠଇଉଜରà¬à¬•à­ ଅନà­à¬®à¬¤à¬¿ ଦିଅ',
+'protect-default' => 'ସବୠଇଉଜରଙà­à¬•à­ ଅନà­à¬®à¬¤à¬¿ ଦିଅନà­à¬¤à­',
'protect-fallback' => '"$1" ବାଲା ଅନà­à¬®à¬¤à¬¿ ଦରକାର',
'protect-level-autoconfirmed' => 'ନà­à¬† ଓ ନାଆଠଲେଖାଇ ନ ଥିବା ଇଉଜରମାନକୠଅଟକାà¬à¬¤à­',
'protect-level-sysop' => 'କେବଳ ପରିଛାମାନà¬à¬• ପାଇà¬',
@@ -541,6 +640,7 @@ $messages = array(
# Restrictions (nouns)
'restriction-edit' => 'ବଦଳାଇବେ',
+'restriction-move' => 'ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
'restriction-create' => 'ତିଆରି',
# Undelete
@@ -555,22 +655,27 @@ $messages = array(
'blanknamespace' => '(ମୂଳ)',
# Contributions
-'contributions' => 'ଇଉଜରଙà­à¬• ଦାନ',
+'contributions' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à¬¿à¬™à­à¬• ଦାନ',
'contributions-title' => '$1 ପାଇଠବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ଦାନ',
'mycontris' => 'ମୋ ଅବଦାନ',
'contribsub2' => '$1 ($2) ପାଇà¬',
'month' => 'ମାସରୠ(ଓ ତା ଆଗରà­)',
-'year' => 'ବରସରୠ(ଓ ତା ଆଗରà­)',
+'year' => 'ବରà­à¬·à¬°à­ (ଆଉ ତା ଆଗରà­)',
-'sp-contributions-talk' => 'କଥାଭାଷା',
-'sp-contributions-submit' => 'ଖୋଜିବା',
+'sp-contributions-newbies' => 'କେବଳ ନୂଆ ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬•à¬° ଅବଦାନ ଦେଖାଇବେ',
+'sp-contributions-talk' => 'କଥାଭାଷା',
+'sp-contributions-search' => 'ଅବଦାନ ପାଇଠଖୋଜନà­à¬¤à­',
+'sp-contributions-username' => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•à¬° ଆଇ.ପି. ଠିକଣା',
+'sp-contributions-toponly' => 'ନଗଦ ବଦଳଗà­à¬¡à¬¼à¬¿à¬• ଦେଖାଇବେ',
+'sp-contributions-submit' => 'ଖୋଜିବା',
# What links here
'whatlinkshere' => 'à¬à¬ à¬¿ କଣ କଣ ଲିଙà­à¬• ଅଛି',
-'whatlinkshere-title' => '"$1" କୠଫରଦ ଲିà¬à¬•',
-'whatlinkshere-page' => 'ଫରଦ',
-'linkshere' => "à¬à¬¹à¬¿ ଫରଦ ସବୠ'''[[:$1]]''' ସହ ଯୋଡା ଯାଇଅଛି:",
-'isredirect' => 'ଅଲଗା ଫରଦକୠଯୋଡା ଫରଦ',
+'whatlinkshere-title' => '"$1" କୠପୃଷà­à¬ à¬¾ ଲିଙà­à¬•',
+'whatlinkshere-page' => 'ପୃଷà­à¬ à¬¾:',
+'linkshere' => "à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾ ସବୠ'''[[:$1]]''' ସହ ଯୋଡା ଯାଇଅଛି:",
+'isredirect' => 'ଆଉ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬à¬•à­ ଯୋଡ଼ିବା ପୃଷà­à¬ à¬¾',
+'istemplate' => 'ବାହାର',
'isimage' => 'ଚିତà­à¬° ଲିà¬à¬•',
'whatlinkshere-prev' => '{{PLURAL:$1|ଆଗ|ଆଗ $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|ପର|ପର $1}}',
@@ -581,18 +686,49 @@ $messages = array(
'whatlinkshere-filters' => 'ଫିଲଟରସବà­',
# Block/unblock
-'ipbreason' => 'କାରଣ:',
-'ipblocklist-submit' => 'ଖୋଜିବା',
-'blocklink' => 'ଅଟକେଇ ଦେବେ',
-'unblocklink' => 'ଛାଡ଼ିବା',
-'change-blocklink' => 'ଓଗଳାକୠବଦଳାଇବା',
-'contribslink' => 'ଅବଦାନ',
-'blocklogpage' => 'ଲଗଟିକୠଅଟକାଇଦିଅ',
+'blockip' => 'ସଭà­à­Ÿà¬™à­à¬•à­ ଅଟକାଇବେ',
+'ipbreason' => 'କାରଣ:',
+'ipboptions' => 'à­¨ ଘଣà­à¬Ÿà¬¾:2 hours,à­§ ଦିନ:1 day,à­© ଦିନ:3 days,à­§ ସପà­à¬¤à¬¾à¬¹:1 week,à­¨ ସପà­à¬¤à¬¾à¬¹:2 weeks,à­§ ମାସ:1 month,à­© ମାସ:3 months,à­¬ ମାସ:6 months,à­§ ବରà­à¬·:1 year,ଅସରନà­à¬¤à¬¿:infinite',
+'ipblocklist-submit' => 'ଖୋଜିବା',
+'blocklink' => 'ଅଟକେଇ ଦେବେ',
+'unblocklink' => 'ଛାଡ଼ିବା',
+'change-blocklink' => 'ଓଗଳାକୠବଦଳାଇବେ',
+'contribslink' => 'ଅବଦାନ',
+'blocklogpage' => 'ଲଗଟିକୠଅଟକାଇଦିଅ',
+'unblocklogentry' => 'କିଳାଯାଇନଥିବା $1',
+'block-log-flags-nocreate' => 'ନୂଆ ଖାତା ଖୋଲିବାକୠଅଚଳ କରାଯାଇଅଛି',
# Move page
-'movelogpage' => 'ଲଗଟିକୠଘà­à¬žà­à¬šà¬¾à¬…',
-'movereason' => 'କାରଣ:',
-'revertmove' => 'ପଛକୠଫେରାଇନେବେ',
+'move-page' => '$1କୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
+'movepagetext' => "à¬à¬¹à¬¿ ଫରà­à¬®à¬Ÿà¬¿ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ଆପଣ ତଳ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ବଦଳାଇ ପାରିବେ, à¬à¬¹à¬¾à¬° ସବୠଇତିହାସ à¬à¬• ନୂଆ ନାଆà¬à¬•à­ ବଦଳିଯିବ ।
+ପà­à¬°à­à¬£à¬¾ ନାଆà¬à¬Ÿà¬¿ à¬à¬• ପà­à¬°à­à¬£à¬¾ ନାଆଠଭାବରେ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾ ଭାବରେ ବାଟ କଢ଼ାଇବ ।
+ଆପଣ ମୂଳ ଲେଖାକୠସେହି ପà­à¬°à­à¬£à¬¾ ନାଆଠଦେଇ ଆପେଆପେ ପଢ଼ିପାରିବେ ।
+ଯଦି ଆପଣ à¬à¬¹à¬¾ ଚାହାନà­à¬¤à¬¿ ନାହିଠତେବେ [[Special:DoubleRedirects|ଦà­à¬‡à¬¥à¬° ଥିବା ପୃଷà­à¬ à¬¾]] ବା [[Special:BrokenRedirects|ଭଙà­à¬—ା ଆଗ ପୃଷà­à¬ à¬¾]] ଦେଖି ପାରିବେ ।
+
+ଲିଙà­à¬•à¬¸à¬¬à­ କେଉà¬à¬ à¬¿à¬•à­ ଯାଉଛି ତାହା ପାଇଠଆପଣ ଦାୟୀ ନà­à¬¹à¬¨à­à¬¤à¬¿ ।
+
+ମନେ ରଖନà­à¬¤à­, ଆଗରୠà¬à¬¹à¬¿ à¬à¬•à¬¾ ନାଆà¬à¬°à­‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ଥିଲେ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ '''ଘà­à¬žà­à¬šà¬¿à¬¬ ନାହିà¬''' ଯେତେ ଯାà¬à¬ ତାହା ଖାଲି ନାହିଠବା ଆଗ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬° କୌଣସି ବଦଳ ଇତିହାସ ନାହିଠସେତେ ବେଳ ଯାà¬à¬ à¬à¬¹à¬¾ à¬à¬®à¬¿à¬¤à¬¿ ରହିବ । à¬à¬¹à¬¾à¬° ମାନେ ହେଉଛି, ଆପଣ ଗୋଟିଠପୃଷà­à¬ à¬¾à¬° ନାଆà¬à¬•à­ ତାର ପà­à¬°à­à¬£à¬¾ ନାଆଠଦେଇପାରିବେ, କିନà­à¬¤à­ ଆଗରୠଥିବା ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଉପରେ ନୂଆ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ଚାପି ଦେଇପାରିବେ ନାହିଠ।
+
+'''ଜାଣି ରଖନà­à¬¤à­!'''
+à¬à¬¹à¬¾ à¬à¬• ଜଣାଶà­à¬£à¬¾ ପୃଷà­à¬ à¬¾à¬°à­‡ ଆମୂଳଚୂଳ ଓ ଅଜଣା ବଦଳ କରିପାରେ;
+ନିଶà­à¬šà¬¿à¬¤ କରନà­à¬¤à­ ଆପଣ ଆଗକୠବଢ଼ିବା ଆଗରୠà¬à¬¹à¬¾à¬° ଫଳ ବାବଦରେ ଜାଣିଛନà­à¬¤à¬¿ ।",
+'movepagetalktext' => 'ଯଦି:
+*ଗୋଟିଠଖାଲି ଆଲୋଚନା ପୃଷà­à¬ à¬¾ ସେହି ନାଆà¬à¬°à­‡ ଥାà¬
+*ଆପଣ ତଳ ବାକà­à¬¸à¬•à­ ନ ବାଛନà­à¬¤à¬¿
+ତେବେ à¬à¬¹à¬¿ ପà­à¬°à­à¬·à­à¬ à¬¾ ସହ ଯୋଡାଯାଇଥିବା ଆଲୋଚନା ପà­à¬°à­à¬·à­à¬ à¬¾à¬•à­ ଆପେ ଆପେ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¦à¬¿à¬†à¬¯à¬¿à¬¬ ।
+ସେହି ଯାଗାରେ, ଆପଣଙà­à¬•à­ ପà­à¬°à­à¬·à­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾à¬•à­/ମିଶାଇବାକୠପଡ଼ିବ ।',
+'cant-move-user-page' => 'ଆପଣଙà­à¬•à­ à¬à¬¹à¬¿ ସଭà­à­Ÿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ଲାଗି ଅନà­à¬®à¬¤à¬¿ ମିଳିନାହିà¬, କିନà­à¬¤à­ ନିଜର ଉପପୃଷà­à¬ à¬¾ ସବୠଘà­à¬žà­à¬šà¬¾à¬‡ ପାରିବେ ।',
+'newtitle' => 'ନୂଆ ନାଆà¬à¬•à­:',
+'pagemovedsub' => 'ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ସଫଳ ହେଲା',
+'movepage-moved' => '\'\'\'"$1"ରୠ"$2"\'\'\'କୠଘà­à¬žà­à¬šà¬¾à¬‡ ଦିଆଗଲା ।',
+'movepage-moved-redirect' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬° ନାଆà¬à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¦à¬¿à¬†à¬—ଲା ।',
+'move-subpages' => 'ଉପପୃଷà­à¬ à¬¾ ଗà­à¬¡à¬¼à¬¿à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡ ($1 ଯାà¬à¬)',
+'1movedto2' => '[[$1]]ରୠ[[$2]]କୠଘà­à¬žà­à¬šà¬¾à¬—ଲା',
+'1movedto2_redir' => '[[$1]]ରୠ[[$2]]କୠଲେଉଟାଇଦିଆଗଲା',
+'movelogpage' => 'ଲଗଟିକୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
+'movenosubpage' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬° ଉପପୃଷà­à¬ à¬¾ ନାହିଠ।',
+'movereason' => 'କାରଣ:',
+'revertmove' => 'ପଛକୠଫେରାଇନେବେ',
# Export
'export' => 'ଫରଦସବୠରପà­à¬¤à¬¾à¬¨à¬¿ କର',
@@ -601,22 +737,22 @@ $messages = array(
'thumbnail-more' => 'ବଡ଼କର',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'ଆପଣଙà­à¬• ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ଫରଦ',
-'tooltip-pt-mytalk' => 'ଆପଣଙà­à¬• ଆଲୋଚନା ଫରଦ',
+'tooltip-pt-userpage' => 'ଆପଣଙà­à¬• ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ପୃଷà­à¬ à¬¾',
+'tooltip-pt-mytalk' => 'ଆପଣଙà­à¬• ଆଲୋଚନା ପୃଷà­à¬ à¬¾',
'tooltip-pt-preferences' => 'ମୋ ପସନà­à¬¦',
'tooltip-pt-watchlist' => 'ବଦଳ ପାଇଠଆପଣ ଦେଖାଶà­à¬£à¬¾ କରà­à¬¥à¬¿à¬¬à¬¾ ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬•à¬° ତାଲିକା',
'tooltip-pt-mycontris' => 'ଆପଣଙà­à¬• ଅବଦାନ',
'tooltip-pt-login' => 'ଆପଣଙà­à¬•à­ ଲଗିନ କରିବାକୠକà­à¬¹à¬¾à¬¯à¬¾à¬‰à¬…ଛି ସିନା, ବାଧà­à­Ÿ କରାଯାଉନାହିà¬',
'tooltip-pt-logout' => 'ଲଗଆଉଟ',
'tooltip-ca-talk' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଉପରେ ଆଲୋଚନା',
-'tooltip-ca-edit' => 'ଆପଣ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬°à­‡ ଅଦଳ ବଦଳ କରିପାରିବେ, ତେବେ ସାଇତିବା ଆଗରୠଦେଖଣା ଦେଖà¬à¬¤à­ ।',
-'tooltip-ca-addsection' => 'ନୂଆ ନିରà­à¬˜à¬à¬Ÿà¬Ÿà¬¿à¬ ଆà¬à¬°à¬­ କରିବା',
+'tooltip-ca-edit' => 'ଆପଣ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬°à­‡ ଅଦଳ ବଦଳ କରିପାରିବେ, ତେବେ ସାଇତିବା ଆଗରୠଦେଖଣା ଦେଖନà­à¬¤à­ ।',
+'tooltip-ca-addsection' => 'ନୂଆ ବିଭାଗଟିଠଆରମà­à¬­ କରିବେ',
'tooltip-ca-viewsource' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ କିଳାଯାଇଛି ।
ଆପଣ à¬à¬¹à¬¾à¬° ମୂଳ ଦେଖିପାରିବେ',
'tooltip-ca-history' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬° ପà­à¬°à­à¬£à¬¾ ସଂସà­à¬•à¬°à¬£',
'tooltip-ca-protect' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ କିଳିବେ',
'tooltip-ca-delete' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇବେ',
-'tooltip-ca-move' => 'à¬à¬‡ ଫରଦଟି ଘà­à¬à¬šà¬¾à¬…',
+'tooltip-ca-move' => 'à¬à¬‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
'tooltip-ca-watch' => 'ଆପଣଙà­à¬• ଦେଖାତାଲିକାରେ à¬à¬‡ ଫରଦଟି ମିଶାନà­à¬¤à­',
'tooltip-ca-unwatch' => 'ନିଜ ଦେଖଣାତାଲିକାରୠà¬à¬¹à¬¿ ଫରଦଟି ବାହାର କରିଦିଅà¬à¬¤à­',
'tooltip-search' => '{{SITENAME}} ରେ ଖୋଜିବା',
@@ -641,10 +777,11 @@ $messages = array(
'tooltip-t-permalink' => 'ବଦଳାଯାଇଥିବା à¬à¬¹à¬¿ ଫରଦଟିର ସà­à¬¥à¬¾à­Ÿà­€ ଲିଙà­à¬•',
'tooltip-ca-nstab-main' => 'ସୂଚୀ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଦେଖିବା',
'tooltip-ca-nstab-user' => 'ଫାଇଲ ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬• ଦେଖନà­à¬¤à­',
-'tooltip-ca-nstab-special' => 'à¬à¬‡à¬Ÿà¬¿ ଗୋଟିଠବିଶେଷ ଫରଦ, ଆପଣ à¬à¬¹à¬¾à¬•à­ ବଦଳାଇପାରିବେ ନାହିà¬',
+'tooltip-ca-nstab-special' => 'à¬à¬‡à¬Ÿà¬¿ ଗୋଟିଠନିଆରା ପୃଷà­à¬ à¬¾, ଆପଣ à¬à¬¹à¬¾à¬•à­ ବଦଳାଇପାରିବେ ନାହିà¬',
'tooltip-ca-nstab-project' => 'ପà­à¬°à¬•à¬³à­à¬ª ଫରଦଟି ଦେଖିବା',
'tooltip-ca-nstab-image' => 'ଫାଇଲ ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬• ଦେଖନà­à¬¤à­',
-'tooltip-ca-nstab-category' => 'ବିଭାଗ ଫରଦଟିକୠଖୋଲ',
+'tooltip-ca-nstab-template' => 'ଟେମà­à¬ªà¬²à­‡à¬Ÿà¬Ÿà¬¿ ଦେଖିବା',
+'tooltip-ca-nstab-category' => 'ଶà­à¬°à­‡à¬£à­€ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଦେଖାଇବେ',
'tooltip-minoredit' => 'à¬à¬¹à¬¾à¬•à­ ଛୋଟ ବଦଳ ଭାବେ ଗଣ',
'tooltip-save' => 'ବଦଳଗà­à¬¡à¬¼à¬¿à¬• ସାଇତିବେ',
'tooltip-preview' => 'ଆପଣନà­à¬• ବଦଳ ଦେଖିନିଅନà­à¬¤à­, ସାଇତିବା ଆଗରୠà¬à¬¹à¬¾ ବà­à­Ÿà­à¬…ବହାର କରନà­à¬¤à­!',
@@ -659,6 +796,7 @@ $messages = array(
'nextdiff' => 'ନୂଆ ବଦଳ →',
# Media information
+'file-info-size' => '$1 × $2 ପିକସେଲ, ଫାଇଲ ଆକାର: $3, à¬à¬®.ଆଇ.à¬à¬®.ଇର ପà­à¬°à¬•à¬¾à¬°: $4',
'file-nohires' => '<small>ବଡ଼ ରେଜୋଲà­à¬¸à¬¨ ନାହିଠ।</small>',
'show-big-image' => 'ପà­à¬°à¬¾ ବଡ଼ ଆକାରରେ',
'show-big-image-thumb' => '<small>ଦେଖଣା ଚିତà­à¬°à¬° ଆକାର: $1 × $2 ପିକସେଲ</small>',
@@ -691,11 +829,45 @@ $messages = array(
'monthsall' => 'ସବà­',
'limitall' => 'ସବà­',
+# E-mail address confirmation
+'confirmemail_needlogin' => 'ଆପଣଙà­à¬•à­ ନିଜ ଇମେଲଟିକୠଥୟ କରିବା ପାଇଠ$1 କରିବାକୠପଡ଼ିବ ।',
+'confirmemail_body' => 'କେହିଜଣେ, ବୋଧହà­à¬ ଆପଣ ହିଠ$1 ଆଇ.ପି. ଠିକଣାରà­,
+à¬à¬¹à¬¿ ଇ-ମେଲ ଆଇ.ଡି.ରେ "$2" ନାଆà¬à¬°à­‡ {{SITENAME}} ଠାରେ ଖାତାଟିଠଖୋଲିଛନà­à¬¤à¬¿ ।
+
+à¬à¬¹à¬¿ ଖାତାଟି ସତରେ ଆପଣଙà­à¬•à¬° ବୋଲି ଥୟ କରିବା ପାଇଠଓ {{SITENAME}}ରେ ଇ-ମେଲ ସà­à¬¬à¬¿à¬§à¬¾à¬¸à¬¬à­ ସଚଳ କରିବାପାଇà¬, à¬à¬¹à¬¿ ଲିଙà­à¬•à­à¬Ÿà¬¿à¬•à­ ଆପଣଙà­à¬• ବà­à¬°à¬¾à¬‰à¬œà¬°à¬°à­‡ ଖୋଲନà­à¬¤à­:
+
+$3
+
+ଯଦି ଆପଣ ଖାତାଟିଠଆଗରୠଖୋଲି *ନାହାନà­à¬¤à¬¿* ତେବେ à¬à¬¹à¬¿ ଲିଙà­à¬•à¬•à­ ଯାଇ ଇ-ମେଲ ଆ.ଡି. ଥୟ କରିବାକୠନାକଚ କରିଦିଅନà­à¬¤à­:
+
+$5
+
+à¬à¬¹à¬¿ କନଫରà­à¬®à­‡à¬¸à¬¨ କୋଡ଼ $4 ବେଳେ ଅଚଳ ହୋଇଯିବ ।',
+
+# action=purge
+'confirm_purge_button' => 'ଠିକ ଅଛି',
+
+# Multipage image navigation
+'imgmultigo' => 'ଯିବା!',
+
+# Table pager
+'table_pager_next' => 'ନୂଆ ପୃଷà­à¬ à¬¾',
+'table_pager_limit_submit' => 'ଯିବା',
+
+# Auto-summaries
+'autosumm-new' => '"$1" ନାଆà¬à¬°à­‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ତିଆରିକଲେ',
+
+# Watchlist editor
+'watchlistedit-raw-titles' => 'ନାଆà¬:',
+
# Watchlist editing tools
+'watchlisttools-view' => 'ଦରକାରୀ ବଦଳଗà­à¬¡à¬¼à¬¿à¬• ଦେଖାଇବେ',
'watchlisttools-edit' => 'ଦେଖିବା ତାଲିକାଟିକୠଦେଖିବେ ଓ ବଦଳାଇବେ',
+'watchlisttools-raw' => 'ଫାଙà­à¬•à¬¾ ଦେଖା ତାଲିକାଟିକୠଦେଖିବେ ଓ ବଦଳାଇବେ',
# Special:FilePath
-'filepath-page' => 'ଫାଇଲ:',
+'filepath-page' => 'ଫାଇଲ:',
+'filepath-submit' => 'ଯିବା',
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'ଖୋଜିବା',
diff --git a/languages/messages/MessagesOs.php b/languages/messages/MessagesOs.php
index d9b78fe3..0480f38f 100644
--- a/languages/messages/MessagesOs.php
+++ b/languages/messages/MessagesOs.php
@@ -55,7 +55,7 @@ $messages = array(
'tog-editsection' => 'Ð Ð°Ð²Ð´Ð¸Ñ Â«Ð±Ð°Ð¸Ð² æй» æрвитæн текÑÑ‚Ñ‹ алы хайы дæр',
'tog-editsectiononrightclick' => 'Сæргондыл рахиз æркъæппæй фарÑÑ‹ хæйттæ ив (JavaScript)',
'tog-showtoc' => 'Сæргæндты номхыгъд Ã¦Ð²Ð´Ð¸Ñ (æртæ Ñæргондæй фылдæр цы фарÑÑ‹ иÑ, уым)',
-'tog-rememberpassword' => 'СиÑтемæ бахъуыды кæнæд мæ пароль ацы компьютерыл.',
+'tog-rememberpassword' => 'СиÑтемæ бахъуыды кæнæд мæ пароль ацы компьютерыл ($1 бонæй къаддæр æмгъуыдмæ)',
'tog-watchcreations' => 'Æз цы фæрÑтæ райдайын, уыдонмæ мæ цæÑÑ‚ дарын мæ фæнды',
'tog-watchdefault' => 'Æз цы фæрÑтæ ивын, уыдонмæ мæ цæÑÑ‚ дарын мæ фæнды',
'tog-watchmoves' => 'Æз цы фæрÑÑ‚Ñ‹ нæмттæ ивын, уыдонмæ мæ цæÑÑ‚ дарын мæ фæнды',
@@ -89,21 +89,21 @@ $messages = array(
'thursday' => 'Цыппæрæм',
'friday' => 'майрæмбон',
'saturday' => 'Сабат',
-'sun' => 'Хц',
-'mon' => 'Къ',
-'tue' => 'Дц',
-'wed' => 'Æр',
-'thu' => 'Цп',
-'fri' => 'Мрм',
+'sun' => 'Хцб',
+'mon' => 'КрÑ',
+'tue' => 'Дцг',
+'wed' => 'Æрт',
+'thu' => 'Цпр',
+'fri' => 'Мрб',
'sat' => 'Сбт',
'january' => 'Ñнварь',
'february' => 'февраль',
'march' => 'мартъи',
-'april' => 'апрелы',
+'april' => 'апрель',
'may_long' => 'май',
'june' => 'июнь',
'july' => 'июль',
-'august' => 'авгуÑÑ‚Ñ‹',
+'august' => 'авгуÑÑ‚',
'september' => 'ÑентÑбрь',
'october' => 'октÑбрь',
'november' => 'ноÑбрь',
@@ -157,55 +157,55 @@ $messages = array(
'cancel' => 'ФæÑтæмæ',
'moredotdotdot' => 'Фылдæр…',
'mypage' => 'Дæхи фарÑ',
-'mytalk' => 'Дæумæ цы дзурынц',
+'mytalk' => 'Мæ диÑкуÑÑи',
'anontalk' => 'Ðцы IP-адриÑÑ‹ диÑкуÑÑи',
-'navigation' => 'хъæугæ æрвитæнтæ',
+'navigation' => 'Ðавигаци',
'and' => '&#32;æмæ',
# Cologne Blue skin
'qbfind' => 'Ðгур',
'qbbrowse' => 'Фен',
-'qbedit' => 'Баив æй',
+'qbedit' => 'Ивын',
'qbpageoptions' => 'Ðцы фарÑ',
'qbpageinfo' => 'ФарÑÑ‹ контекÑÑ‚',
'qbmyoptions' => 'Мæ фæрÑтæ',
'qbspecialpages' => 'Сæрмагонд фæрÑтæ',
+'faq' => 'FAQ',
# Vector skin
-'vector-action-delete' => 'Ðппар',
-'vector-action-protect' => 'Сæхгæн',
-'vector-namespace-category' => 'Категори',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'ФарÑ',
-'vector-namespace-project' => 'Проекты фарÑ',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Ðрхайæджы фарÑ',
-'vector-view-create' => 'Скæн æй',
-'vector-view-edit' => 'Баив æй',
-'vector-view-history' => 'ИÑтори',
-'vector-view-view' => 'КæÑ',
-'vector-view-viewsource' => 'Йæ код фен',
+'vector-action-addsection' => 'Ðæуæг Ð½Ñ‹Ñ…Ð°Ñ Ð±Ð°ÐºÃ¦Ð½',
+'vector-action-delete' => 'Ðппар',
+'vector-action-move' => 'Ðом ивын',
+'vector-action-protect' => 'Сæхгæн',
+'vector-view-create' => 'Скæн æй',
+'vector-view-edit' => 'Ивын',
+'vector-view-history' => 'ИÑтори',
+'vector-view-view' => 'ФæрÑын',
+'vector-view-viewsource' => 'Йæ код фен',
+'actions' => 'Ðрхайдтæ',
+'namespaces' => 'Ðæмтты тыгъдæдттæ',
+'variants' => 'Варианттæ',
'errorpagetitle' => 'Рæдыд',
-'returnto' => '$1 фарÑмæ раздæх.',
+'returnto' => '$1 фарÑмæ раздæхын.',
'tagline' => 'Сæрибар Ñнциклопеди Википедийы æрмæг.',
'help' => 'ÆххуыÑ',
-'search' => 'агур',
-'searchbutton' => 'агур',
+'search' => 'Ðгуырд',
+'searchbutton' => 'Ðгур',
'go' => 'СтатьÑмæ',
-'searcharticle' => 'СтатьÑмæ',
+'searcharticle' => 'Ðгур',
'history' => 'ФарÑÑ‹ иÑтори',
'history_short' => 'ИÑтори',
'info_short' => 'Информаци',
'printableversion' => 'Мыхурмæ верÑи',
'permalink' => 'Ðцы верÑимæ æрвитæн',
'print' => 'Мыхуыр',
-'edit' => 'Баив æй',
+'edit' => 'Ивын',
'create' => 'Скæн æй',
-'editthispage' => 'Ðцы Ñ„Ð°Ñ€Ñ Ð±Ð°Ð¸Ð²',
-'create-this-page' => 'Ðцы Ñ„Ð°Ñ€Ñ Ñкæн',
+'editthispage' => 'Ивын ацы фарÑ',
+'create-this-page' => 'Ðцы Ñ„Ð°Ñ€Ñ Ñкæнын',
'delete' => 'Ðппар',
-'deletethispage' => 'Ðппар æй',
+'deletethispage' => 'Ðппарын ацы фарÑ',
'protect' => 'Сæхгæн',
'protect_change' => 'баив',
'protectthispage' => 'Сæхгæн ацы фарÑ',
@@ -220,7 +220,7 @@ $messages = array(
'articlepage' => 'Фен ÑтатьÑ',
'talk' => 'ДиÑкуÑÑи',
'views' => 'ÆркæÑтытæ',
-'toolbox' => 'мигæнæнтæ',
+'toolbox' => 'Фæрæзтæ',
'userpage' => 'Ðцы архайæджы Ñ„Ð°Ñ€Ñ Ñ„ÐµÐ½',
'projectpage' => 'Проекты Ñ„Ð°Ñ€Ñ Ñ„ÐµÐ½',
'imagepage' => 'Файлы Ñ„Ð°Ñ€Ñ Ñ„ÐµÐ½',
@@ -246,10 +246,14 @@ $messages = array(
'currentevents' => 'Ðог хабæрттæ',
'currentevents-url' => 'Project:Xabar',
'disclaimers' => 'Бæрн нæ иÑыны тыххæй',
-'disclaimerpage' => 'Project:Бæрн нæ иÑыны тыххæй',
+'disclaimerpage' => 'Project:Ðæ бæрн иÑыны тыххæй',
+'edithelp' => 'Ивын æххуыÑ',
+'edithelppage' => 'Help:Ивд',
+'helppage' => 'Help:Сæргæндтæ',
'mainpage' => 'Сæйраг фарÑ',
'mainpage-description' => 'Сæйраг фарÑ',
'portal' => 'Ðрхайджыты æхÑæнад',
+'portal-url' => 'Project:Ðрхайджыты æхÑæнад',
'privacy' => 'Хибардзинады политикæ',
'privacypage' => 'Project:Хибардзинады политикæ',
@@ -262,22 +266,22 @@ $messages = array(
'retrievedfrom' => 'Ратæдзæн: «$1»',
'youhavenewmessages' => 'РайÑтай $1 ($2).',
'newmessageslink' => 'ног Ñ„Ñ‹Ñтæгтæ',
-'newmessagesdifflink' => 'фæÑтаг ивддзинад',
-'editsection' => 'баив æй',
-'editold' => 'баив æй',
+'newmessagesdifflink' => 'фæÑтаг ивд',
+'editsection' => 'ивын',
+'editold' => 'ивын',
'viewsourceold' => 'йæ код фен',
-'editlink' => 'баив æй',
+'editlink' => 'ивын',
'viewsourcelink' => 'йæ код фен',
-'editsectionhint' => 'Баив æй: $1',
+'editsectionhint' => 'Ив хай: $1',
'toc' => 'Сæргæндтæ',
'showtoc' => 'равдиÑ',
-'hidetoc' => 'бамбæхÑ',
+'hidetoc' => 'бамбæхÑын',
'viewdeleted' => '$1 фенын дæ фæнды?',
'site-rss-feed' => '$1 — RSS-уадздзаг',
'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' => 'СтатьÑ',
@@ -301,7 +305,7 @@ $messages = array(
'error' => 'Рæдыд',
'databaseerror' => 'Бæрæггæнæнты базæйы рæдыд',
'readonly' => 'Бæрæггæнæнты базæ Ñ„Ñ‹ÑÑынæн æхгæд у',
-'missingarticle-rev' => '(верÑи â„– $1)',
+'missingarticle-rev' => '(фæлтæр № $1)',
'missingarticle-diff' => '(хъауджы: $1, $2)',
'internalerror' => 'Мидæг рæдыд',
'internalerror_info' => 'Мидæг рæдыд: $1',
@@ -314,7 +318,7 @@ $messages = array(
'cannotdelete' => 'Ðæй аппарæн файл кæнæ Ñ„Ð°Ñ€Ñ "$1".
Æндæр иÑчи йæ аппæрÑта мыййаг.',
'badtitle' => 'Æнæмбæлон Ñæргонд',
-'viewsource' => 'Йæ код фен',
+'viewsource' => 'Код кæÑын',
'viewsourcefor' => 'Ð¤Ð°Ñ€Ñ Â«$1»',
'protectedpagetext' => 'Ðцы Ñ„Ð°Ñ€Ñ Ñƒ ивынæй æхгæд.',
'viewsourcetext' => 'Ðцы фарÑÑ‹ код фенæн æмæ халдих кæнæн иÑ:',
@@ -328,16 +332,19 @@ $messages = array(
'yourname' => 'Ðрхайæджы ном:',
'yourpassword' => 'Пароль:',
'yourpasswordagain' => 'Дæ пароль иу хатт ма:',
-'remembermypassword' => 'СиÑтемæ бахъуыды кæнæд мæ пароль ацы компьютерыл',
+'remembermypassword' => 'СиÑтемæ бахъуыды кæнæд мæ пароль ацы браузеры ($1 бонæй къаддæр æмгъуыдмæ)',
'yourdomainname' => 'Дæ домен:',
-'login' => 'Дæхи Ð±Ð°Ð²Ð´Ð¸Ñ ÑиÑтемæйæн',
+'login' => 'Бахизын',
'nav-login-createaccount' => 'СиÑтемæйæн дæхи бавдиÑ',
-'userlogin' => 'СиÑтемæйæн дæхи бавдиÑ',
+'userlogin' => 'Бахизын / региÑтраци кæнын',
'logout' => 'ÐомÑуÑæг Ñуын',
-'userlogout' => 'ÐомÑуÑæг Ñу',
+'userlogout' => 'Рахизын',
'notloggedin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
'nologin' => "РегиÑтрацигонд нæма дæ? '''$1'''.",
'nologinlink' => 'РегиÑтраци',
+'createaccount' => 'РегиÑтраци кæнын',
+'gotaccount' => 'РегиÑтрацигонд дæ? $1.',
+'gotaccountlink' => 'Бахизын',
'createaccountmail' => 'адриÑмæ гæÑгæ',
'badretype' => 'Дыууæ хатты иу пароль хъуамæ ныффыÑтаиÑ',
'loginsuccess' => 'ÐÑ‹Ñ€ та Википедийы Ð°Ñ€Ñ…Ð°Ð¹Ñ‹Ñ $1, зæгъгæ, ахæм номæй.',
@@ -368,60 +375,70 @@ $messages = array(
'link_tip' => 'Мидæг æрвитæн (æндæр ÑтатьÑмæ)',
'extlink_sample' => 'http://www.example.com æрвитæны текÑÑ‚',
'extlink_tip' => 'Æддаг æрвитæн (Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ http:// ма рох кæн)',
-'headline_sample' => 'Ðм Ñæргонды текÑÑ‚ уæд',
+'headline_sample' => 'Ðм Ñæргонд текÑÑ‚ уæд',
'math_sample' => 'ÐÑ‹Ñ„Ñ„Ñ‹ÑÑ Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ã¦',
'math_tip' => 'Математикон формулæ (формат LaTeX)',
+'nowiki_sample' => 'БатыÑÑ Ð½Ã¦Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð³Ð¾Ð½Ð´ текÑÑ‚ ардæм',
+'image_tip' => 'Æфтыд файл',
'media_tip' => 'Файлмæ æрвитæн',
+'sig_tip' => 'Дæ ырфыÑÑ‚ рæÑтæгимæ',
# Edit pages
-'summary' => 'Ивддзинæдты мидиÑ:',
-'subject' => 'Темæ/Ñæргонд:',
-'minoredit' => 'Ðй чыÑыл ивддзинад у.',
-'watchthis' => 'Ðцы фарÑмæ дæ цæÑÑ‚ æрдар',
-'savearticle' => 'Ðфтæ уæд!',
-'preview' => 'РазæркаÑÑ‚',
-'showpreview' => 'Фен уал æй',
-'showlivepreview' => 'Тагъд разæркаÑÑ‚',
-'showdiff' => 'Цы баивтай ацы текÑÑ‚Ñ‹, уый фен',
-'summary-preview' => 'Ивддзинады афыÑÑ‚ уыдзæн:',
-'blockedtitle' => 'Ðрхайæг хъодыгонд æрцыд',
-'blockednoreason' => 'Ð°Ñ…Ñ…Ð¾Ñ Ð°Ð¼Ñ‹Ð½Ð´ не ’рцыд',
-'whitelistedittitle' => 'Ðцы текÑÑ‚ ивынмæ хъуамæ дæхи бацамонай ÑиÑтемæйæн',
-'loginreqtitle' => 'Хъуамæ дæхи бацамонай',
-'accmailtitle' => 'Пароль рарвыÑÑ‚ у.',
-'newarticle' => '(Ðог)',
-'note' => "'''Бафиппай:'''",
-'editing' => 'ИвыÑ: $1',
-'editingsection' => 'Ð˜Ð²Ñ‹Ñ $1 (фарÑÑ‹ хай)',
-'editconflict' => 'Ивыны конфликт: $1',
-'yourtext' => 'Дæхи текÑÑ‚',
-'yourdiff' => 'Хицæндзинæдтæ',
-'longpagewarning' => "'''РÐГФÆДЗÐХСТ: Ðцы фарÑÑ‹ бæрцуат у $1 килобайты.
-Сæ бæрцуат 32 килобайтæй фылдæр кæмæн у, ахæм фæрÑтæ иуæй-иу браузерты раÑÑ‚ нæ зынынц.
-Кæд ахæм вариант и, уæд ацы фарÑæй цалдæр фарÑÑ‹ Ñкæн.'''",
-'templatesused' => 'Ðцы фарÑÑ‹ Ð¸Ñ {{PLURAL:$1|шаблон|шаблоны}}:',
-'template-protected' => '(æхгæд)',
-'template-semiprotected' => '(æрдæг-æхгæд)',
-'edit-conflict' => 'Иввдзинæдты конфликт.',
-'edit-already-exists' => 'Ðог Ñ„Ð°Ñ€Ñ Ñкæнæн нæй. Ðхæм Ñ„Ð°Ñ€Ñ Ð¸Ñ.',
+'summary' => 'Ивдтыты мидиÑ:',
+'subject' => 'Темæ/Ñæргонд:',
+'minoredit' => 'Ðй чыÑыл ивд у.',
+'watchthis' => 'ЦæÑÑ‚ дарын ацы фарÑмæ',
+'savearticle' => 'Фæивын',
+'preview' => 'РазæркаÑÑ‚',
+'showpreview' => 'РазбакаÑÑ‚ равдиÑын',
+'showlivepreview' => 'Тагъд разæркаÑÑ‚',
+'showdiff' => 'Ивд æвдиÑын',
+'summary-preview' => 'Ивд афыÑÑ‚ уыдзæн:',
+'blockedtitle' => 'Ðрхайæг хъодыгонд æрцыд',
+'blockednoreason' => 'Ð°Ñ…Ñ…Ð¾Ñ Ð°Ð¼Ñ‹Ð½Ð´ не ’рцыд',
+'whitelistedittitle' => 'Ðцы текÑÑ‚ ивынмæ хъуамæ дæхи бацамонай ÑиÑтемæйæн',
+'loginreqtitle' => 'Хъуамæ дæхи бацамонай',
+'accmailtitle' => 'Пароль рарвыÑÑ‚ у.',
+'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>.',
+'note' => "'''Бафиппай:'''",
+'editing' => 'ИвыÑ: $1',
+'editingsection' => 'Ð˜Ð²Ñ‹Ñ $1 (фарÑÑ‹ хай)',
+'editconflict' => 'Ивыны конфликт: $1',
+'yourtext' => 'Дæхи текÑÑ‚',
+'yourdiff' => 'Хицæндзинæдтæ',
+'templatesused' => 'Ðцы фарÑÑ‹ Ð¸Ñ {{PLURAL:$1|шаблон|шаблоны}}:',
+'template-protected' => '(æхгæд)',
+'template-semiprotected' => '(æрдæг-æхгæд)',
+'permissionserrorstext-withaction' => 'Ðæй дын бар $2 {{PLURAL:$1|ай|адон}} тыххæй:',
+'edit-conflict' => 'Иввдзинæдты конфликт.',
+'edit-already-exists' => 'Ðог Ñ„Ð°Ñ€Ñ Ñкæнæн нæй. Ðхæм Ñ„Ð°Ñ€Ñ Ð¸Ñ.',
# History pages
'viewpagelogs' => 'Ðцы фарÑæн йæ логтæ равдиÑ',
'nohistory' => 'Ðцы фарÑæн иввдзинæдты иÑтори нæй.',
-'currentrev' => 'Ðырыккон верÑи',
-'currentrev-asof' => 'Ðырыккон верÑи $1',
-'revisionasof' => 'ВерÑи $1',
-'revision-info' => 'ВерÑи $1; $2',
+'currentrev' => 'Ðырыккон фæлтæр',
+'currentrev-asof' => 'Ðырыккон фæлтæр $1',
+'revisionasof' => 'Фæлтæр $1',
+'revision-info' => 'Фæлтæр $1; $2',
'previousrevision' => '↠Раздæры',
-'nextrevision' => 'Ðогдæр верÑи →',
-'currentrevisionlink' => 'Ðырыккон верÑи',
+'nextrevision' => 'Ðогдæр фæлтæр →',
+'currentrevisionlink' => 'Ðырыккон фæлтæр',
'cur' => 'ныр.',
'next' => 'фæдылдзог',
'last' => 'раздæры',
'page_first' => 'фыццаг',
'page_last' => 'фæÑтаг',
-'histlegend' => 'Куыд æй æмбарын: (нырыккон) = нырыккон верÑийæ хъауджыдæрдзинад, (раздæры) = раздæры верÑийæ хъауджыдæрдзинад, Ч = чыÑыл ивддзинад.',
+'histlegend' => "Æвзарынæн: баныÑан кæн фæлтæрты радиобокÑтæ цæмæй цæ иртæÑай æмæ Ñтæй ныххæц enter кæнæ бынæй цы ныххæцæн иÑ, ууыл.<br />
+Легендæ: '''({{int:cur}})''' = иртæÑæн фæÑтаг фæлтæримæ, '''({{int:last}})''' = иртæÑæн разфæлтæримæ, '''{{int:minoreditletter}}''' = чыÑыл ивд.",
'history-fieldset-title' => 'ИÑтори фен',
+'history-show-deleted' => 'ÆрмæÑтдæр хафтытæ',
'histfirst' => 'раздæр',
'histlast' => 'фæÑтæдæр',
'historysize' => '({{PLURAL:$1|1 байт|$1 байты}})',
@@ -432,45 +449,68 @@ $messages = array(
'history-feed-item-nocomment' => '$1 $2',
# Revision deletion
-'rev-deleted-comment' => '(комментарий аппæрÑÑ‚ у)',
-'rev-deleted-user' => '(архайæджы ном аппæрÑÑ‚ у)',
-'rev-deleted-event' => '(Ñ„Ñ‹ÑÑ‚ аппæрÑÑ‚ у)',
-'rev-delundel' => 'равдиÑ/бамбæхÑ',
-'revisiondelete' => 'Ðппар / рацараз фарÑÑ‹ верÑитæ',
-'pagehist' => 'ФарÑÑ‹ иÑтори',
-'revdelete-summary' => 'ивддзинады мидиÑ',
-'revdelete-uname' => 'архайæджы ном',
+'rev-deleted-comment' => '(комментарий аппæрÑÑ‚ у)',
+'rev-deleted-user' => '(архайæджы ном аппæрÑÑ‚ у)',
+'rev-deleted-event' => '(Ñ„Ñ‹ÑÑ‚ аппæрÑÑ‚ у)',
+'rev-delundel' => 'равдиÑ/бамбæхÑ',
+'revisiondelete' => 'Ðппар / рацараз фарÑÑ‹ фæлтæртæ',
+'revdel-restore-deleted' => 'хафт ивдтытæ',
+'revdel-restore-visible' => 'зынгæ ивдтытæ',
+'pagehist' => 'ФарÑÑ‹ иÑтори',
+'revdelete-summary' => 'ивддзинады мидиÑ',
+'revdelete-uname' => 'архайæджы ном',
# History merging
'mergehistory-reason' => 'ÐххоÑ:',
+# Merge log
+'revertmerge' => 'Ðхицæн кæнын',
+
# Diffs
-'difference' => '(Дыууæ верÑиты ’хÑæн хъауджы)',
-'lineno' => 'Рæнхъ $1:',
-'editundo' => 'нæ хъæуы',
+'difference' => '(Дыууæ фæлтæры ’хÑæн хъауджы)',
+'lineno' => 'Рæнхъ $1:',
+'compareselectedversions' => 'ÆвзæрÑÑ‚ фæлтæртæ абар',
+'editundo' => 'раивын',
# Search results
-'searchresults' => 'Цы ÑÑардæуы',
-'searchresults-title' => 'Ðгуырды фæÑтиуæг: «$1»',
-'titlematches' => 'СтатьÑÑ‚Ñ‹ Ñæргæндты æмцаутæ',
-'notitlematches' => 'ФæрÑÑ‚Ñ‹ Ñæргæндты нæй',
-'textmatches' => 'СтатьÑÑ‚Ñ‹ æмцаутæ',
-'prevn' => '{{PLURAL:$1|$1}} фæÑтæмæ',
-'nextn' => '{{PLURAL:$1|$1}} размæ',
-'viewprevnext' => 'Фен ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size' => '$1 ({{PLURAL:$2|$2 дзырд|$2 дзырды}})',
-'search-redirect' => '(рарвыÑÑ‚ ардыгæй: $1)',
-'search-section' => '(хай $1)',
-'search-suggest' => 'Кæд мыййаг агурыÑ: $1',
-'search-interwiki-caption' => 'ÆфÑымæрон проекттæ',
-'search-interwiki-more' => '(фылдæр)',
-'search-mwsuggest-enabled' => 'æмбарынгæнæнтимæ',
-'search-mwsuggest-disabled' => 'æнæ æмбарынгæнæнтæ',
-'searchall' => 'æппæт',
-'powersearch' => 'Сæрмагонд агуырд',
-'powersearch-legend' => 'Сæрмагонд агуырд',
-'powersearch-redir' => 'РарвыÑтытæ дæр æвдиÑ',
-'powersearch-field' => 'Ðгуырд',
+'searchresults' => 'Цы ÑÑардæуы',
+'searchresults-title' => 'Ðгуырды фæÑтиуæг: «$1»',
+'titlematches' => 'СтатьÑÑ‚Ñ‹ Ñæргæндты æмцаутæ',
+'notitlematches' => 'ФæрÑÑ‚Ñ‹ Ñæргæндты нæй',
+'textmatches' => 'СтатьÑÑ‚Ñ‹ æмцаутæ',
+'prevn' => 'рæздæры {{PLURAL:$1|$1}}',
+'nextn' => 'иннæ {{PLURAL:$1|$1}}',
+'prevn-title' => 'Раздæр $1 {{PLURAL:$1|фæÑтиуæг|фæÑтиуæджы}}',
+'nextn-title' => 'Дарддæр $1 {{PLURAL:$1|фæÑтиуæг|фæÑтиуæджы}}',
+'shown-title' => 'ÆвдиÑын $1 {{PLURAL:$1|фæÑтиуæг|фæÑтиуæджы}} иу фарÑыл',
+'viewprevnext' => 'Фен ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Ðцы викийы Ð¸Ñ Ñ„Ð°Ñ€Ñ \"[[:\$1]]\" номимæ.'''",
+'searchmenu-new' => "'''Ивын Ñ„Ð°Ñ€Ñ \"[[:\$1]]\" ацы викийы!'''",
+'searchprofile-articles' => 'Сæргæндты фæрÑтæ',
+'searchprofile-project' => 'Ã†Ñ…Ñ…ÑƒÑ‹Ñ Ã¦Ð¼Ã¦ Проекты фæрÑтæ',
+'searchprofile-images' => 'Мультимеди',
+'searchprofile-everything' => 'Ðлцыдæр',
+'searchprofile-advanced' => 'БæÑтондæр',
+'searchprofile-articles-tooltip' => 'Ðгурын ам: $1',
+'searchprofile-project-tooltip' => 'Ðгурын ам: $1',
+'searchprofile-images-tooltip' => 'Ðгурын файлтæ',
+'searchprofile-everything-tooltip' => 'Ðгурын алыран дæр (диÑкуÑÑийы фæрÑÑ‚Ñ‹ дæр)',
+'search-result-size' => '$1 ({{PLURAL:$2|$2 дзырд|$2 дзырды}})',
+'search-result-category-size' => '{{PLURAL:$1|1 уæнг|$1 уæнгы}} ({{PLURAL:$2|1 дæлкатегори|$2 дæлкатегорийы}}, {{PLURAL:$3|1 файл|$3 файлы}})',
+'search-redirect' => '(рарвыÑÑ‚ ардыгæй: $1)',
+'search-section' => '(хай $1)',
+'search-suggest' => 'Кæд мыййаг агурыÑ: $1',
+'search-interwiki-caption' => 'ÆфÑымæрон проекттæ',
+'search-interwiki-more' => '(нодзы)',
+'search-mwsuggest-enabled' => 'æмбарынгæнæнтимæ',
+'search-mwsuggest-disabled' => 'æнæ æмбарынгæнæнтæ',
+'searchrelated' => 'хæÑтæг',
+'searchall' => 'æппæт',
+'showingresultsheader' => "{{PLURAL:$5|ФæÑтиуæг '''$1''' '''$3'''-йæ|ФæÑтиуæджы '''$1 - $2''' '''$3'''-йæ}} '''$4'''-æн",
+'powersearch' => 'Сæрмагонд агуырд',
+'powersearch-legend' => 'Сæрмагонд агуырд',
+'powersearch-redir' => 'РарвыÑтытæ дæр æвдиÑ',
+'powersearch-field' => 'Ðгуырд',
# Quickbar
'qbsettings' => 'Ðавигацион таг',
@@ -480,7 +520,7 @@ $messages = array(
'qbsettings-floatingleft' => 'Рахизырдыгæй ленккæнгæ',
# Preferences page
-'mypreferences' => 'Æрмадз',
+'mypreferences' => 'Мæ фадæттæ',
'prefsnologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
'changepassword' => 'Пароль баив',
'skin-preview' => 'РазæркаÑÑ‚',
@@ -558,52 +598,68 @@ $messages = array(
'action-delete' => 'ацы Ñ„Ð°Ñ€Ñ Ð°Ð¿Ð¿Ð°Ñ€Ñ‹Ð½',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|ивдзинад|ивддзинады}}',
-'recentchanges' => 'ФæÑтаг ивддзинæдтæ',
-'recentchangestext' => 'Ðцы фарÑыл ирон Википедийы фæÑтаг ивддзинæдтæ фенæн иÑ.',
-'rcnote' => 'Дæлдæр нымад ÑÑ‚Ñ‹ афæÑтаг <strong>$2</strong> боны дæргъы конд <strong>{{PLURAL:$1|иу ивддзинад|$1 ивддзинады}}</strong>, $5, $4 уавæрмæ гæÑгæ.',
-'rcshowhideminor' => '$1 чыÑыл ивддзинæдтæ',
-'rcshowhidebots' => '$1 роботты куыÑÑ‚',
-'rcshowhidemine' => '$1, дæхæдæг цы ивддзинæдтæ Ñкодтай, уыдон',
-'rclinks' => 'ФæÑтаг $1 ивддзинæдтæ (афæÑтаг $2 боны дæргъы чи ’рцыдыÑÑ‚Ñ‹) равдиÑ;
+'nchanges' => '$1 {{PLURAL:$1|ивд|ивды}}',
+'recentchanges' => 'ФæÑтаг ивдтытæ',
+'recentchanges-legend' => 'ФæÑтаг ивдтыты фадæттæ',
+'recentchangestext' => 'Ðцы фарÑыл ирон Википедийы фæÑтаг ивддзинæдтæ фенæн иÑ.',
+'recentchanges-label-newpage' => 'Ðцы ивд нæуæг Ñ„Ð°Ñ€Ñ Ð±Ð°ÐºÐ¾Ð´Ñ‚Ð°',
+'recentchanges-label-minor' => 'Ðй у чыÑыл ивд',
+'recentchanges-label-bot' => 'Ðцы ивд бот Ñарызта',
+'recentchanges-label-unpatrolled' => 'Ðцы ивд нырмæ нæу фидар гонд',
+'rcnote' => 'Дæлдæр нымад ÑÑ‚Ñ‹ афæÑтаг <strong>$2</strong> боны дæргъы конд <strong>{{PLURAL:$1|иу ивд|$1 ивды}}</strong>, $5, $4 уавæрмæ гæÑгæ.',
+'rcnotefrom' => "Бындæр ÑÑ‚Ñ‹ ивдтытæ '''$2'''-æй ('''$1'''-Ñ‹ йонг æвдыÑÑ‚)",
+'rclistfrom' => 'РавдиÑын ивдтытæ амæй фæÑтæ: $1',
+'rcshowhideminor' => '$1 чыÑыл ивдтытæ',
+'rcshowhidebots' => '$1 роботты куыÑÑ‚',
+'rcshowhideliu' => '$1 ырбахизгæ архайæджы',
+'rcshowhideanons' => '$1 ÑуÑæг архайæджы',
+'rcshowhidemine' => '$1 мæ ивдтытæ',
+'rclinks' => 'ФæÑтаг $1 ивдтытæ (афæÑтаг $2 боны дæргъы чи ’рцыдыÑÑ‚Ñ‹) равдиÑ;
$3',
-'diff' => 'хицæн.',
-'hist' => 'лог',
-'hide' => 'бамбæхÑ',
-'show' => 'РавдиÑ',
-'minoreditletter' => 'ч',
-'newpageletter' => 'Ð',
-'boteditletter' => 'б',
-'rc-enhanced-expand' => 'ЛыÑтæгдзинæдтæ Ñ€Ð°Ð²Ð´Ð¸Ñ (JavaScript хъæуы)',
-'rc-enhanced-hide' => 'ЛыÑтæгдзинæдтæ бамбæхÑ',
+'diff' => 'хицæн.',
+'hist' => 'лог',
+'hide' => 'БамбæхÑын',
+'show' => 'РавдиÑын',
+'minoreditletter' => 'ч',
+'newpageletter' => 'Ð',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'ЛыÑтæгдзинæдтæ Ñ€Ð°Ð²Ð´Ð¸Ñ (JavaScript хъæуы)',
+'rc-enhanced-hide' => 'ЛыÑтæгдзинæдтæ бамбæхÑ',
# Recent changes linked
-'recentchangeslinked' => 'БаÑÑ‚ ивддзинæдтæ',
+'recentchangeslinked' => 'БаÑÑ‚ ивдтытæ',
'recentchangeslinked-feed' => 'БаÑÑ‚ ивддзинæдтæ',
'recentchangeslinked-toolbox' => 'БаÑÑ‚ ивддзинæдтæ',
+'recentchangeslinked-title' => '"$1"-имæ баÑÑ‚ ивдтытæ',
'recentchangeslinked-page' => 'ФарÑÑ‹ ном:',
# Upload
-'upload' => 'Ðог файл Ñæвæр',
-'uploadbtn' => 'Ðог файл Ñæвæр',
-'uploadnologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
-'uploaderror' => 'Файл Ñæвæрыны рæдыд',
-'filename' => 'Файлы ном',
-'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
-'badfilename' => 'Ðывы ном ивд æрцыдиÑ. ÐÑ‹Ñ€ хуины «$1».',
-'successfulupload' => 'Файлы Ñæвæрд фæрæÑтмæ',
-'savefile' => 'Бавæр æй',
-'uploadvirus' => 'Файлы разынд вируÑ! ÐšÃ¦Ñ $1',
-'watchthisupload' => 'Ðцы файлмæ дæ цæÑÑ‚ æрдар',
+'upload' => 'Ðог файл Ñæвæр',
+'uploadbtn' => 'Ðог файл Ñæвæр',
+'uploadnologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
+'uploaderror' => 'Файл Ñæвæрыны рæдыд',
+'uploadlogpage' => 'Æвгæндты лог',
+'filename' => 'Файлы ном',
+'filedesc' => 'Ивдтыты Ñ„Ñон:',
+'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
+'badfilename' => 'Ðывы ном ивд æрцыдиÑ. ÐÑ‹Ñ€ хуины «$1».',
+'savefile' => 'Бавæр æй',
+'uploadedimage' => 'Ð±Ð°Ð²Ð³Ã¦Ð½Ð´Ð¸Ñ "[[$1]]"',
+'uploadvirus' => 'Файлы разынд вируÑ! ÐšÃ¦Ñ $1',
+'watchthisupload' => 'ЦæÑÑ‚ дарын ацы файлмæ',
+'upload-success-subj' => 'Файлы Ñæвæрд фæрæÑтмæ',
'upload-file-error' => 'Мидæг рæдыд',
+'license' => 'Лицензи:',
+
# Special:ListFiles
'listfiles' => 'Ðывты номхыгъд',
# File description page
'file-anchor-link' => 'Ðыв',
'filehist' => 'Файлы иÑтори',
+'filehist-revert' => 'раивын',
'filehist-current' => 'нырыккон',
'filehist-datetime' => 'Датæ/рæÑтæг',
'filehist-user' => 'Ðрхайæг',
@@ -611,6 +667,7 @@ $3',
'filehist-comment' => 'Фиппаинаг',
'imagelinks' => 'Æрвитæнтæ файлмæ',
'linkstoimage' => 'Ðцы нывæй пайда {{PLURAL:$1|кæны иу фарÑ|кæнынц ахæм фæрÑтæ}}:',
+'nolinkstoimage' => 'Ðæй ахæм фæрÑтæ, кæдон æрвитынц ацы файлмæ.',
# File deletion
'filedelete-submit' => 'Ðппар',
@@ -630,7 +687,7 @@ $3',
'statistics' => 'СтатиÑтикæ',
'statistics-header-users' => 'Ðрхайджыты ÑтатиÑтикæ',
-'brokenredirects-edit' => 'баив æй',
+'brokenredirects-edit' => 'ивын',
'brokenredirects-delete' => 'аппар',
'withoutinterwiki-submit' => 'РавдиÑ',
@@ -640,6 +697,7 @@ $3',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|байт|байты}}',
'nlinks' => '$1 {{PLURAL:$1|æрвитæн|æрвитæны}}',
+'nmembers' => '$1 {{PLURAL:$1|уæнг|уæнгы}}',
'nviews' => '$1 {{PLURAL:$1|æркаÑÑ‚|æркаÑÑ‚Ñ‹}}',
'lonelypages' => 'Сидзæр фæрÑтæ',
'uncategorizedpages' => 'Æнæкатегори фæрÑтæ',
@@ -655,10 +713,11 @@ $3',
'longpages' => 'Даргъ фæрÑтæ',
'protectedpages' => 'Æхгæд фæрÑтæ',
'listusers' => 'Ðрхайджыты номхыгъд',
+'usercreated' => 'Ð¤Ã¦Ð·Ñ‹Ð½Ð´Ð¸Ñ $1, $2-ыл',
'newpages' => 'Ðог фæрÑтæ',
'newpages-username' => 'Ðрхайæг:',
'ancientpages' => 'Зæронддæр фæрÑтæ',
-'move' => 'Ðом баив',
+'move' => 'Сæргонд баив',
'pager-newer-n' => '{{PLURAL:$1|фæÑтæдæр иу|фæÑтæдæр $1}}',
'pager-older-n' => '{{PLURAL:$1|раздæр иу|раздæр $1}}',
@@ -690,8 +749,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'special-categories-sort-abc' => 'алфавитмæ гæÑгæ равæр',
# Special:LinkSearch
-'linksearch' => 'Æддаг æрвитæнтæ',
-'linksearch-ok' => 'Ðгур',
+'linksearch' => 'Æддаг æрвитæнтæ',
+'linksearch-ok' => 'Ðгур',
+'linksearch-line' => '$2 æрвиты $1-мæ',
# Special:ListUsers
'listusers-submit' => 'РавдиÑ',
@@ -710,41 +770,50 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'ЦæÑтдарды номхыгъд',
-'mywatchlist' => 'Дæ цæÑÑ‚ кæмæ дарыÑ, уыцы фæрÑтæ',
+'mywatchlist' => 'Мæ цæÑтдард фæрÑтæ',
+'watchlistfor2' => 'Ðрхайæг: $1 $2',
'nowatchlist' => 'Иу ÑтатьÑмæ дæр дæ цæÑÑ‚ нæ дарыÑ.',
'watchnologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
'watchnologintext' => 'Ðцы номхыгъд ивынмæ [[Special:UserLogin|хъуамæ дæхи бацамонай ÑиÑтемæйæн]].',
'addedwatch' => 'Дæ цæÑÑ‚ кæмæ дарыÑ, уыцы ÑтатьÑтæм бафтыд.',
'removedwatch' => 'Ðал Ð´Ð°Ñ€Ñ‹Ñ Ð´Ã¦ цæÑÑ‚',
'removedwatchtext' => 'ФарÑмæ «[[:$1]]» нал [[Special:Watchlist|Ð´Ð°Ñ€Ñ‹Ñ Ð´Ã¦ цæÑÑ‚]].',
-'watch' => 'Дæ цæÑÑ‚ æрдар',
-'watchthispage' => 'Ðцы фарÑмæ дæ цæÑÑ‚ æрдар',
-'unwatch' => 'Мауал дæ цæÑÑ‚ дар',
+'watch' => 'ЦæÑÑ‚ æрдар',
+'watchthispage' => 'ЦæÑÑ‚ дарын ацы фарÑмæ',
+'unwatch' => 'Мауал дар цæÑÑ‚',
'watchnochange' => 'Дæ цæÑÑ‚ кæмæ дарыÑ, уыцы ÑтатьÑтæй иу дæр ивд не ’рцыди.',
-'watchlist-details' => '$1 фарÑмæ дæ цæÑÑ‚ дарыÑ, диÑкуÑÑиты фæÑтæмæ.',
+'watchlist-details' => '{{PLURAL:$1|$1 фарÑмæ|$1 фарÑмæ}} дæ цæÑÑ‚ дарыÑ, диÑкуÑÑиты нæ нымайгæйæ.',
'watchlistcontains' => 'Дæ цæÑÑ‚ $1 фарÑмæ дарыÑ.',
'wlnote' => "Дæлæ афæÑтаг '''$2 Ñахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
'wlshowlast' => 'ФæÑтæг $1 Ñахаты, $2 боны дæргъы; $3.',
+'watchlist-options' => 'ЦæÑтдард рæгъы фадæттæ',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'ЦæÑтдард фæрÑÑ‚Ñ‹ номхыгъдмæ афтауын...',
'unwatching' => 'ЦæÑтдард фæрÑÑ‚Ñ‹ номхыгъдæй Ð°Ð¸ÑƒÐ²Ð°Ñ€Ñ ÐºÃ¦Ð½Ñ‹Ð½...',
-'changed' => 'ивд æрцыд',
+'enotif_newpagetext' => 'Ðй у нæуæг фарÑ.',
+'changed' => 'ивд æрцыд',
+'enotif_anon_editor' => 'ÑуÑæг архайæг $1',
# Delete
-'deletepage' => 'Ð¤Ð°Ñ€Ñ Ð°Ð¿Ð¿Ð°Ñ€',
+'deletepage' => 'Схаф фарÑ',
'exblank' => 'Ñ„Ð°Ñ€Ñ Ð°Ñ„Ñ‚Ð¸Ð´ уыдиÑ',
+'delete-confirm' => 'Схаф "$1"',
+'deletedarticle' => 'Ñхафта "[[$1]]"',
'dellogpage' => 'Ðппарыны лог',
'deletionlog' => 'аппарыны лог',
'deletecomment' => 'ÐххоÑ:',
'deleteotherreason' => 'Æндæр кæнæ уæлæмхаÑæн аххоÑ:',
'deletereasonotherlist' => 'Æндæр аххоÑ',
+# Rollback
+'rollbacklink' => 'æздæхын',
+
# Protect
'protectedarticle' => '«[[$1]]» — Ñ„Ð°Ñ€Ñ Ã¦Ñ…Ð³Ã¦Ð´ æрцыд',
'prot_1movedto2' => '[[$1]] хаÑÑ‚ æрцыд [[$2]], зæгъгæ, ахæм фарÑмæ',
-'protectcomment' => 'ÐххоÑ:',
+'protectcomment' => 'ФÑон:',
'protectexpiry' => 'Кæдмæ æхгæд у:',
'protect-level-sysop' => 'ÆрмæÑÑ‚ админтæ',
'protect-othertime' => 'Æндæр рæÑтæг:',
@@ -757,31 +826,47 @@ Also see [[Special:WantedCategories|wanted categories]].',
'restriction-edit' => 'Ивын',
# Undelete
-'undeletelink' => 'фен/рацараз',
+'undeletelink' => 'кæÑын/рацаразын',
+'undeleteviewlink' => 'кæÑын',
# Namespace form on various pages
'namespace' => 'Ðæмтты тыгъдад:',
'blanknamespace' => '(Сæйраг)',
# Contributions
-'contributions' => 'Йæ бавæрд',
+'contributions' => 'Ðрхайæджы бавæрд',
'contributions-title' => 'Ðрхайæджы бавæрд: $1',
-'mycontris' => 'Дæ бавæрд',
-'uctop' => '(уæле баззад)',
+'mycontris' => 'Мæ бавæрд',
+'contribsub2' => 'Ðрхайæг: $1 ($2)',
+'uctop' => '(фæÑтаг)',
+'month' => 'Ðцы мæй (æмæ раздæр):',
+'year' => 'Ðцы аз (æмæ раздæр):',
+'sp-contributions-newbies' => 'ÆвдиÑын æрмæÑÑ‚ нæуæг архайджыты бавæрд',
'sp-contributions-blocklog' => 'Хъодыты лог',
+'sp-contributions-uploads' => 'бавгæндтытæ',
+'sp-contributions-logs' => 'логтæ',
'sp-contributions-talk' => 'ДиÑкуÑÑи',
+'sp-contributions-search' => 'Ивдтытæ агурын',
+'sp-contributions-username' => 'IP Ð°Ð´Ñ€Ð¸Ñ ÐºÃ¦Ð½Ã¦ архайæджы ном:',
+'sp-contributions-submit' => 'Ðгурын',
# What links here
'whatlinkshere' => 'Цавæр æрвитæнтæ цæуынц ардæм',
'whatlinkshere-title' => '«$1»: цавæр фæрÑтæ æрвитынц ардæм',
'whatlinkshere-page' => 'ФарÑ:',
+'linkshere' => "Ðцы фæрÑтæ æрвитынц '''[[:$1]]-мæ''':",
+'nolinkshere' => "Ðикæцы Ñ„Ð°Ñ€Ñ Ã¦Ñ€Ð²Ð¸Ñ‚Ñ‹ ардæм: '''[[:$1]]'''.",
'isredirect' => 'рарвыÑÑ‚Ñ‹ фарÑ',
+'istemplate' => 'æфтыдæй',
'isimage' => 'фарÑÑ‹ мидæг ныв',
-'whatlinkshere-next' => '{{PLURAL:$1|фæдылдзог|фæдылдзог $1}}',
+'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' => 'Фильтртæ',
# Block/unblock
@@ -789,6 +874,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'blockip-legend' => 'Бахъоды æй кæн',
'ipbreason' => 'ÐххоÑ:',
'ipbreasonotherlist' => 'Æндæр аххоÑ',
+'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',
'ipbotherreason' => 'Æндæр кæнæ уæлæмхаÑæн аххоÑ:',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] хъодыгонд æрцыд.<br />
ÐšÃ¦Ñ [[Special:Ipblocklist|хъодыгонд IP-адриÑÑ‚Ñ‹ номхыгъд]].',
@@ -815,16 +901,20 @@ Also see [[Special:WantedCategories|wanted categories]].',
'movenologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
'newtitle' => 'Ðог ном',
'move-watch' => 'Ðцы фарÑмæ дæ цæÑÑ‚ æрдар',
-'movepagebtn' => 'ФарÑÑ‹ ном баив',
+'movepagebtn' => 'ФарÑÑ‹ ном ивын',
'move-redirect-suppressed' => 'рарвыÑÑ‚Ñ‹ Ñ„Ð°Ñ€Ñ Ð½Ã¦ бахъуыд',
-'movereason' => 'ÐххоÑ:',
+'movereason' => 'ФÑон:',
+'revertmove' => 'раивын',
+
+# Export
+'export' => 'ФæрÑÑ‚Ñ‹ ÑкÑпорт',
# Namespace 8 related
'allmessages' => 'Æппæт техникон Ñ„Ñ‹Ñтытæ',
'allmessagesname' => 'Ðом',
# Thumbnails
-'thumbnail-more' => 'ФеÑтырдæр кæн',
+'thumbnail-more' => 'ФеÑтырдæр кæнын',
# Special:Import
'importnotext' => 'Ðфтид у кæнæ текÑÑ‚ дзы нæй',
@@ -832,47 +922,55 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Мæхи Ñ„Ð°Ñ€Ñ (дæу тыххæй ам ныффыÑÑ)',
-'tooltip-pt-mytalk' => 'Æндæр ахрхайджытæ мын цы дзурынц',
-'tooltip-pt-preferences' => 'Википеди куыд куÑÑ‹, уый Ñрæвдз кæн дæ хъæуындзинæдтæм гæÑгæ',
-'tooltip-pt-watchlist' => 'Дæ цæÑÑ‚ кæмæ дарыÑ, уыцы фæрÑÑ‚Ñ‹ номхыгъд',
-'tooltip-pt-mycontris' => 'Цы у мæ бавæрд',
+'tooltip-pt-mytalk' => 'Дæ диÑкуÑÑи',
+'tooltip-pt-preferences' => 'Дæ фадæттæ',
+'tooltip-pt-watchlist' => 'ФæрÑтæ кæй ивдтытæм ды Ð´Ð°Ñ€Ñ‹Ñ Ð´Ã¦ цæÑÑ‚',
+'tooltip-pt-mycontris' => 'Дæ бавæрд',
'tooltip-pt-login' => 'СиÑтемæмæ дæхи бацамонай, кæд æцæг дæ Ñ…Ã¦Ñ Ð½Ã¦Ñƒ, уæддæр',
-'tooltip-pt-logout' => 'РегиÑтрацигонд ÑеанÑæй рацу',
-'tooltip-ca-talk' => 'ФарÑыл цы Ñ„Ñ‹ÑÑ‚ у, уый тыххæй диÑкуÑÑи',
+'tooltip-pt-logout' => 'Рахизын',
+'tooltip-ca-talk' => 'ФарÑÑ‹ тыххæй диÑкуÑÑи',
'tooltip-ca-edit' => 'Ðцы Ñ„Ð°Ñ€Ñ Ð´Ã¦ бон у ивын. Дæ хорзæхæй, «Фен уал æй» джыбыйæ пайда кæн',
+'tooltip-ca-addsection' => 'Ðæуæг хай Ñараз',
'tooltip-ca-viewsource' => 'Ðцы Ñ„Ð°Ñ€Ñ Ð¸Ð²Ñ‹Ð½Ã¦Ð¹ æхгæд у, фæлæ йæ код фенæн и',
-'tooltip-ca-history' => 'Ðцы фарÑæн йæ раздæры верÑитæ (ивыны лог)',
+'tooltip-ca-history' => 'Ðцы фарÑæн йæ раздæры фæлтæртæ (ивыны лог)',
'tooltip-ca-protect' => 'Ðцы Ñ„Ð°Ñ€Ñ Ð¸Ð²Ð´Ð´Ð·Ð¸Ð½Ã¦Ð´Ñ‚Ã¦Ð¹ Ñæхгæн',
-'tooltip-ca-delete' => 'Ðппар ацы фарÑ',
-'tooltip-ca-move' => 'Ðцы ÑтатьÑйы ном баив',
+'tooltip-ca-delete' => 'Ðппарын ацы фарÑ',
+'tooltip-ca-move' => 'СтатьÑйы ном ивын',
'tooltip-ca-watch' => 'Дæ цæÑÑ‚ кæмæ дарыÑ, уыцы фæрÑÑ‚Ñ‹ номхыгъдмæ бафтау',
-'tooltip-search' => 'Ðцы дзырд агур',
+'tooltip-ca-unwatch' => 'ÐÐ¹Ñ Ð°Ñ†Ñ‹ Ñ„Ð°Ñ€Ñ Ð´Ã¦ цæÑтдард рæгъæй',
+'tooltip-search' => '{{SITENAME}} агурын',
'tooltip-search-go' => 'Кæд ахæм ном иÑÑ‚Ñ‹ ÑтатьÑмæ и, уыцы ÑÑ‚Ð°Ñ‚ÑŒÑ Ñ€Ð°Ð²Ð´Ð¸Ñ',
-'tooltip-search-fulltext' => 'Ðцы текÑÑ‚ цы фæрÑÑ‚Ñ‹ и, уыдон бацагур',
-'tooltip-n-mainpage' => 'Сæйраг фарÑмæ рацу',
-'tooltip-n-mainpage-description' => 'Сæйраг фарÑмæ',
-'tooltip-n-portal' => 'Проекты тыххæй æмæ, дæу цы бон у, уый тыххæй дæр',
+'tooltip-search-fulltext' => 'Ðцы текÑÑ‚ цы фæрÑÑ‚Ñ‹ иÑ, уыдон агурын',
+'tooltip-p-logo' => 'Сæйраг фарÑмæ бацæуын',
+'tooltip-n-mainpage' => 'Сæйраг фарÑмæ ацæуын',
+'tooltip-n-mainpage-description' => 'Сæйраг фарÑмæ ацæуын',
+'tooltip-n-portal' => 'Проект, дæ бон цы у æмæ кæм цы хъæуы агурыны тыххæй',
'tooltip-n-currentevents' => 'Ðыры цаутæ',
-'tooltip-n-recentchanges' => 'Чи æмæ цавæр ÑтатьÑÑ‚Ñ‹ баивта',
+'tooltip-n-recentchanges' => 'ФæÑтаг ивдтыты рæгъ',
'tooltip-n-randompage' => 'Æнæбары æвзæрÑÑ‚ Ñ„Ð°Ñ€Ñ Ñ„ÐµÐ½',
-'tooltip-n-help' => 'Кæд цыдæртæ нæ бамбæрÑтай',
+'tooltip-n-help' => 'Базонынæн бынат',
'tooltip-t-whatlinkshere' => 'Ðцы фарÑмæ чи ’рвитынц, ахæм фæрÑÑ‚Ñ‹ номхыгъд',
-'tooltip-t-recentchangeslinked' => 'Ðцы Ñ„Ð°Ñ€Ñ ÐºÃ¦Ð¼Ã¦ æрвиты, уыцы фæрÑÑ‚Ñ‹ фæÑтаг ивддзинæдтæ',
+'tooltip-t-recentchangeslinked' => 'Ðцы Ñ„Ð°Ñ€Ñ ÐºÃ¦Ð¼Ã¦ æрвиты, уыцы фæрÑÑ‚Ñ‹ фæÑтаг ивдтытæ',
+'tooltip-feed-atom' => 'Atom feed ацы фарÑæн',
'tooltip-t-contributions' => 'Ðцы архайæг цы фæрÑтæ ивта, уый номхыгъд фен',
+'tooltip-t-emailuser' => 'Ðрвитын Ñ„Ñ‹Ñтæг ацы архайæгмæ',
'tooltip-t-upload' => 'Ðывтæ кæнæ мультимедиа-файлтæ бавæр',
'tooltip-t-specialpages' => 'Сæрмагонд фæрÑÑ‚Ñ‹ номхыгъд',
'tooltip-t-print' => 'Ðцы Ñ„Ð°Ñ€Ñ Ð¼Ñ‹Ñ…ÑƒÑ‹Ñ€Ð¼Ã¦ цæттæ форматы',
-'tooltip-t-permalink' => 'ФарÑÑ‹ ацы верÑимæ æрвитæн (фæрÑтæ ивынц, ацы верÑи — никуы)',
+'tooltip-t-permalink' => 'ФарÑÑ‹ ацы фæлтæрмæ æрвитæн (фæрÑтæ ивынц, ацы фæлтæр — нæ)',
'tooltip-ca-nstab-main' => 'Фен ÑтатьÑ',
'tooltip-ca-nstab-user' => 'Ðрхайæджы Ñ„Ð°Ñ€Ñ Ñ„ÐµÐ½',
-'tooltip-ca-nstab-special' => 'Ðй Ñæрмагонд Ñ„Ð°Ñ€Ñ Ñƒ, дæ бон нæу уымæ ивддзинæдтæ хæÑÑын',
+'tooltip-ca-nstab-special' => 'Ðй Ñæрмагонд Ñ„Ð°Ñ€Ñ Ñƒ, дæ бон æй нæу ивын',
'tooltip-ca-nstab-project' => 'Проекты фарÑ',
'tooltip-ca-nstab-image' => 'Ðывы фарÑ',
'tooltip-ca-nstab-category' => 'Категорийы фарÑ',
-'tooltip-minoredit' => 'ЧыÑыл ивддзинад у',
-'tooltip-save' => 'Цы ивддзинæдтæ бахаÑтай, уыдон бавæр',
-'tooltip-diff' => 'Раздæры верÑимæ абаргæйæ цы ивддзинæдтæ хæÑÑÑ‹Ñ Ñ‚ÐµÐºÑтмæ, уый фен',
+'tooltip-minoredit' => 'ЧыÑыл ивдæй йæ баныÑан кæн',
+'tooltip-save' => 'Бавæр дæ ивдтытæ',
+'tooltip-preview' => 'Ð‘Ð°ÐºÃ¦Ñ ÑƒÐ°Ð» дæ ивдмæ. Дæ хорзæхæй ай уал Ñараз бавæрыны размæ!',
+'tooltip-diff' => 'ÆвдиÑÑ‹ цы ивд бахаÑтай текÑтмæ',
'tooltip-watch' => 'Ðцы фарÑ, дæ цæÑÑ‚ кæмæ дарыÑ, уыцы фæрÑÑ‚Ñ‹ номхыгъдмæ бафтау',
+'tooltip-rollback' => '"Æздæхын" æздæхы ацы фарÑÑ‹ фæÑтаг архайæджы ивд(тытæ) иу хæÑтмæ',
+'tooltip-undo' => '"Раивын" æздæхы ацы ивд æмæ æвдиÑÑ‹ ивæн Ñ„Ð°Ñ€Ñ Ñ€Ð°Ð·Ð±Ð°ÐºÐ°ÑÑ‚ уавæры. Уый дын дæ бавæрдæн Ñ„Ñон Ñкæныны фадат дæтты.',
# Attribution
'others' => 'æндæртæ',
@@ -892,12 +990,18 @@ Also see [[Special:WantedCategories|wanted categories]].',
'math_unknown_function' => 'нæзонгæ функци',
'math_syntax_error' => 'ÑинтакÑиÑÑ‹ рæдыд',
+# Patrol log
+'patrol-log-auto' => '(автоматон)',
+'patrol-log-diff' => 'ивд $1',
+
# Browsing diffs
-'previousdiff' => '↠Раздæры ивддзинад',
-'nextdiff' => 'ФæÑтæдæр ивддзинад →',
+'previousdiff' => '↠Раздæры ивд',
+'nextdiff' => 'ФæÑтæдæр ивд →',
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|фарÑ|фарÑÑ‹}}',
+'file-info-size' => '$1 × $2 пикÑелы, файлы уæз: $3, MIME тип: $4',
+'show-big-image' => 'Æнæхъæнæй',
# Special:NewFiles
'newimages' => 'Ðог нывты галерей',
@@ -905,6 +1009,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
'ilsubmit' => 'Ðгур',
'bydate' => 'рæÑтæгмæ гæÑгæ',
+# Bad image list
+'bad_image_list' => 'Формат у ахæм:
+
+ÆрмæÑтдæр рæгъон рæнхъытæ (рæнхъытæ, кæдон байдауынц * Ñимволæй) нымады кæнынц.
+Фыццаг æрвитæн рæнхъы хъуамæ æрвита æвзæр файлмæ.
+Иннæ æрвитæнтæ уыцы рæнхъы нымады кæнынц куыд уæлвæткытæ, кæдон ÑÑ‚Ñ‹ фæрÑтæ кæдæм Ð¸Ñ Ð±Ð°Ñ€ бавæрын файл.',
+
# Metadata
'metadata' => 'Метабæрæггæнæнтæ',
'metadata-expand' => 'Фылдæр детальтæ равдиÑ',
@@ -957,12 +1068,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
'watchlistedit-raw-submit' => 'Ðомхыгъд бафÑнай',
# Watchlist editing tools
-'watchlisttools-view' => 'БаÑÑ‚ ивддзинæдтæ фен',
-'watchlisttools-edit' => 'Ðомхыгъд фен/баив',
+'watchlisttools-view' => 'БаÑÑ‚ ивдтытæ фен',
+'watchlisttools-edit' => 'БакæÑын æмæ ивын цæÑтдард рæгъ',
+'watchlisttools-raw' => 'Ивын цæÑтдард рæгъы бындуртекÑÑ‚',
# Special:Version
'version' => 'MediaWiki-йы верÑи',
-'version-version' => '(ВерÑи $1)',
+'version-version' => '(Фæлтæр $1)',
'version-software-version' => 'ВерÑи',
# Special:SpecialPages
diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php
index bf8afdd2..9e58c2fc 100644
--- a/languages/messages/MessagesPa.php
+++ b/languages/messages/MessagesPa.php
@@ -54,8 +54,7 @@ $messages = array(
'tog-numberheadings' => 'ਆਟੋ-ਨੰਬਰ ਹੈਡਿੰਗ',
'tog-showtoolbar' => 'à¨à¨¡à¨¿à¨Ÿ ਟੂਲਬਾਰ ਵੇਖੋ (JavaScript)',
'tog-showtoc' => 'ਟੇਬਲ ਆਫ਼ ਕੰਨਟੈੱਟ ਵੇਖਾਓ (for pages with more than 3 headings)',
-'tog-rememberpassword' => 'ਇਹ ਕੰਪਿਊਟਰ ਲਈ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ',
-'tog-editwidth' => 'à¨à¨¡à¨¿à¨Ÿ ਬਾਕਸ ਨਾਲ ਪੂਰੇ ਸਕਰੀਨ ਨੂੰ ਭਰਨ ਲਈ ਇਸ ਦੀ ਚੌੜਾਈ ਵਧਾਓ',
+'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਠਗਠਨਵੇਂ ਸਫ਼ੇ ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
'tog-watchdefault' => 'ਜੋ ਸਫ਼ੇ ਮੈਂ ਸੋਧਦਾ ਹਾਂ, ਓਹ ਪੇਜ ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
'tog-watchmoves' => 'ਮੇਰੇ ਵਲੋਂ ਭੇਜੇ ਕਿਤੇ ਸਫ਼ੇ ਨੂੰ ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
@@ -156,29 +155,18 @@ $messages = array(
'faqpage' => 'Project:ਸਵਾਲ-ਜਵਾਬ',
# Vector skin
-'vector-action-delete' => 'ਹਟਾਓ',
-'vector-action-move' => 'ਭੇਜੋ',
-'vector-action-protect' => 'ਸà©à¨°à©±à¨–ਿਅਤ',
-'vector-action-undelete' => 'ਹਟਾਉਣਾ ਵਾਪਸ',
-'vector-action-unprotect' => 'ਅਣ-ਸà©à¨°à©±à¨–ਿਅਤ',
-'vector-namespace-category' => 'ਕੈਟਾਗਰੀ',
-'vector-namespace-help' => 'ਮੱਦਦ ਸਫ਼ਾ',
-'vector-namespace-image' => 'ਫਾਇਲ',
-'vector-namespace-main' => 'ਸਫ਼ਾ',
-'vector-namespace-media' => 'ਮੀਡਿਆ ਸਫ਼ਾ',
-'vector-namespace-mediawiki' => 'ਸà©à¨¨à©‡à¨¹à¨¾',
-'vector-namespace-project' => 'ਸà©à¨°à©±à¨–ਿਅਤ ਸਫ਼ਾ',
-'vector-namespace-special' => 'ਖਾਸ ਸਫ਼ਾ',
-'vector-namespace-talk' => 'ਚਰਚਾ',
-'vector-namespace-template' => 'ਟੈਪਲੇਟ',
-'vector-namespace-user' => 'ਯੂਜ਼ਰ ਸਫ਼ਾ',
-'vector-view-create' => 'ਬਣਾਓ',
-'vector-view-edit' => 'ਸੋਧ',
-'vector-view-history' => 'ਅਤੀਤ ਵੇਖੋ',
-'vector-view-view' => 'ਪੜà©à¨¹à©‹',
-'vector-view-viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
-'actions' => 'ਕਾਰਵਾਈ',
-'namespaces' => 'ਨਾਂ-ਥਾਂ:',
+'vector-action-delete' => 'ਹਟਾਓ',
+'vector-action-move' => 'ਭੇਜੋ',
+'vector-action-protect' => 'ਸà©à¨°à©±à¨–ਿਅਤ',
+'vector-action-undelete' => 'ਹਟਾਉਣਾ ਵਾਪਸ',
+'vector-action-unprotect' => 'ਅਣ-ਸà©à¨°à©±à¨–ਿਅਤ',
+'vector-view-create' => 'ਬਣਾਓ',
+'vector-view-edit' => 'ਸੋਧ',
+'vector-view-history' => 'ਅਤੀਤ ਵੇਖੋ',
+'vector-view-view' => 'ਪੜà©à¨¹à©‹',
+'vector-view-viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
+'actions' => 'ਕਾਰਵਾਈ',
+'namespaces' => 'ਨਾਂ-ਥਾਂ:',
'errorpagetitle' => 'ਗਲਤੀ',
'returnto' => '$1 ਤੇ ਵਾਪਸ ਜਾਓ',
@@ -320,7 +308,7 @@ Note that some pages may continue to be displayed as if you were still logged in
'yourname' => 'ਯੂਜ਼ਰ ਨਾਂ:',
'yourpassword' => 'ਪਾਸਵਰਡ:',
'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮà©à©œ-ਲਿਖੋ:',
-'remembermypassword' => 'ਇਹ ਕੰਪਿਊਟਰ ਲਈ ਆਪਣਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ',
+'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
'yourdomainname' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਡੋਮੇਨ:',
'login' => 'ਲਾਗ ਇਨ',
'nav-login-createaccount' => 'ਲਾਗ ਇਨ / ਅਕਾਊਂਟ ਬਣਾਓ',
@@ -336,6 +324,7 @@ Note that some pages may continue to be displayed as if you were still logged in
'gotaccount' => "ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਅਕਾਊਂਟ ਹੈ? '''$1'''.",
'gotaccountlink' => 'ਲਾਗਇਨ',
'createaccountmail' => 'ਈਮੇਲ ਨਾਲ',
+'createaccountreason' => 'ਕਾਰਨ:',
'badretype' => 'ਤà©à¨¹à¨¾à¨¡à©‡ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
'userexists' => 'ਯੂਜ਼ਰ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ਅਧੀਨ ਹੈ।
ਵੱਖਰਾ ਯੂਜ਼ਰ ਨਾਂ ਵਰਤੋਂ ਜੀ।',
@@ -614,23 +603,22 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨà©à¨•à¨¸à¨¾à¨¨ ਤੋਂ ਬਚਣ ਲਈ, $
'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
# Recent changes
-'recentchanges' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
-'recentchanges-legend-newpage' => '$1 - ਨਵਾਂ ਸਫ਼ਾ',
-'rcshowhideminor' => '$1 ਛੋਟੀਆਂ ਸੋਧਾਂ',
-'rcshowhidebots' => '$1 ਬੋਟ',
-'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਠਯੂਜ਼ਰ',
-'rcshowhideanons' => '$1 ਅਗਿਆਤ ਯੂਜ਼ਰ',
-'rcshowhidemine' => '$1 ਮੇਰਾ à¨à¨¡à¨¿à¨Ÿ',
-'diff' => 'ਅੰਤਰ',
-'hist' => 'ਅਤੀਤ',
-'hide' => 'ਓਹਲੇ',
-'show' => 'ਵੇਖੋ',
-'minoreditletter' => 'ਛ',
-'newpageletter' => 'ਨ',
-'boteditletter' => 'ਬ',
-'rc_categories_any' => 'ਕੋਈ ਵੀ',
-'rc-enhanced-expand' => 'ਵੇਰਵਾ ਵੇਖੋ (ਜਾਵਾਸਕà©à¨°à¨¿à¨ªà¨Ÿ ਲੋੜੀਦੀ ਹੈ)',
-'rc-enhanced-hide' => 'ਵੇਰਵਾ ਓਹਲੇ',
+'recentchanges' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
+'rcshowhideminor' => '$1 ਛੋਟੀਆਂ ਸੋਧਾਂ',
+'rcshowhidebots' => '$1 ਬੋਟ',
+'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਠਯੂਜ਼ਰ',
+'rcshowhideanons' => '$1 ਅਗਿਆਤ ਯੂਜ਼ਰ',
+'rcshowhidemine' => '$1 ਮੇਰਾ à¨à¨¡à¨¿à¨Ÿ',
+'diff' => 'ਅੰਤਰ',
+'hist' => 'ਅਤੀਤ',
+'hide' => 'ਓਹਲੇ',
+'show' => 'ਵੇਖੋ',
+'minoreditletter' => 'ਛ',
+'newpageletter' => 'ਨ',
+'boteditletter' => 'ਬ',
+'rc_categories_any' => 'ਕੋਈ ਵੀ',
+'rc-enhanced-expand' => 'ਵੇਰਵਾ ਵੇਖੋ (ਜਾਵਾਸਕà©à¨°à¨¿à¨ªà¨Ÿ ਲੋੜੀਦੀ ਹੈ)',
+'rc-enhanced-hide' => 'ਵੇਰਵਾ ਓਹਲੇ',
# Recent changes linked
'recentchangeslinked' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
@@ -663,7 +651,6 @@ to upload files.',
* ਅੱਪਲੋਡ ਕੀਤੀ ਫਾਇਲ ਦਾ ਨਾਂ: '''<tt>[[:$1]]</tt>'''
* ਮੌਜੂਦ ਫਾਇਲ ਦਾ ਨਾਂ: '''<tt>[[:$2]]</tt>'''
ਇੱਕ ਵੱਖਰਾ ਨਾਂ ਚà©à¨£à©‹ ਜੀ",
-'successfulupload' => 'ਠੀਕ ਤਰà©à¨¹à¨¾à¨‚ ਅੱਪਲੋਡ',
'uploadwarning' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
'savefile' => 'ਫਾਇਲ ਸੰਭਾਲੋ',
'uploadedimage' => '"[[$1]]" ਅੱਪਲੋਡ',
@@ -671,6 +658,8 @@ to upload files.',
'uploadvirus' => 'ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1',
'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
'watchthisupload' => 'ਇਸ ਫਾਇਲ ਨੂੰ ਵਾਚ ਕਰੋ',
+'upload-success-subj' => 'ਠੀਕ ਤਰà©à¨¹à¨¾à¨‚ ਅੱਪਲੋਡ',
+'upload-warning-subj' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
'upload-file-error' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
'upload-misc-error' => 'ਅਣਜਾਣ ਅੱਪਲੋਡ ਗਲਤੀ',
@@ -811,7 +800,6 @@ to upload files.',
# Watchlist
'watchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
-'watchlistfor' => "('''$1''' ਲਈ)",
'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
'addedwatch' => 'ਵਾਚ-ਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ',
'watch' => 'ਵਾਚ',
@@ -1067,9 +1055,9 @@ to upload files.',
# Media information
'thumbsize' => 'ਥੰਮਨੇਲ ਆਕਾਰ:',
'widthheightpage' => '$1×$2, $3 ਪੇਜ਼',
-'file-info' => '(ਫਾਇਲ ਆਕਾਰ: $1, MIME ਕਿਸਮ: $2)',
-'file-info-size' => '($1 × $2 ਪਿਕਸਲ, ਫਾਇਲ ਆਕਾਰ: $3, MIME ਕਿਸਮ: $4)',
-'svg-long-desc' => '(SVG ਫਾਇਲ, nominally $1 × $2 pixels, file size: $3)',
+'file-info' => 'ਫਾਇਲ ਆਕਾਰ: $1, MIME ਕਿਸਮ: $2',
+'file-info-size' => '$1 × $2 ਪਿਕਸਲ, ਫਾਇਲ ਆਕਾਰ: $3, MIME ਕਿਸਮ: $4',
+'svg-long-desc' => 'SVG ਫਾਇਲ, nominally $1 × $2 pixels, file size: $3',
'show-big-image' => 'ਪੂਰਾ ਰੈਜ਼ੋਲੇਸ਼ਨ',
'show-big-image-thumb' => '<small>ਇਹ à¨à¨²à¨• ਦਾ ਆਕਾਰ: $1 × $2 ਪਿਕਸਲ</small>',
@@ -1160,6 +1148,7 @@ to upload files.',
'table_pager_first' => 'ਪਹਿਲਾ ਪੇਜ',
'table_pager_last' => 'ਆਖਰੀ ਪੇਜ',
'table_pager_limit' => 'ਹਰੇਕ ਪੇਜ ਲਈ $1 ਆਈਟਮਾਂ',
+'table_pager_limit_label' => 'ਪà©à¨°à¨¤à©€ ਸਫ਼ਾ ਆਈਟਮਾਂ:',
'table_pager_limit_submit' => 'ਜਾਓ',
'table_pager_empty' => 'ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ',
diff --git a/languages/messages/MessagesPam.php b/languages/messages/MessagesPam.php
index cd23c62a..b08d1057 100644
--- a/languages/messages/MessagesPam.php
+++ b/languages/messages/MessagesPam.php
@@ -29,8 +29,7 @@ $messages = array(
Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
'tog-editsectiononrightclick' => "Paganan ya ing pamag-edit seksiyon (section editing) kapamilata'ning pamag right click kareng pamagat da reng seksiyon (JavaScript)",
'tog-showtoc' => 'Pakit ya ing kalamnan [table of contents] (kareng bulung a maki 3 o mas dakal a pamagat)',
-'tog-rememberpassword' => 'Tandanan ya ing kanakung login keng computer a ini',
-'tog-editwidth' => 'Palaparan ya ing edit box ba neng sapakan ing mabilug a screen',
+'tog-rememberpassword' => 'Tandanan ya ing kanakung login keng computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Idagdag la deng bulung a lelengan ku kareng babanten',
'tog-watchdefault' => 'Idagdag la reng bulung a inalilan ku kareng babanten',
'tog-watchmoves' => 'Idagdag la reng bulung a inalis ku kareng babanten',
@@ -163,16 +162,10 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
'faqpage' => 'Project:MAK',
# Vector skin
-'vector-action-move' => 'Iyalis',
-'vector-action-protect' => 'Protectan/kambilan',
-'vector-action-undelete' => 'Isubli/iurung ya pangabura',
-'vector-action-unprotect' => 'Idayu ya panga-protecta',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Bulung ning saup',
-'vector-namespace-image' => "Simpan (''file'')",
-'vector-namespace-main' => 'Bulung',
-'vector-namespace-media' => 'Bulung media',
-'vector-namespace-project' => 'Bulung a pang-proyectu',
+'vector-action-move' => 'Iyalis',
+'vector-action-protect' => 'Protectan/kambilan',
+'vector-action-undelete' => 'Isubli/iurung ya pangabura',
+'vector-action-unprotect' => 'Idayu ya panga-protecta',
'errorpagetitle' => 'Mali',
'returnto' => 'Magbalik king $1.',
@@ -383,7 +376,7 @@ Melalang ne ing kekang account. E mo kakalingwan alilan deng kekang piniling {{S
'yourname' => 'Lagyung talagamit (Username):',
'yourpassword' => 'Kekang password:',
'yourpasswordagain' => 'Pakisulat meng pasibayu ing password:',
-'remembermypassword' => 'Tandanan me ing login ku king computer a ini',
+'remembermypassword' => 'Tandanan me ing login ku king computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Ing kekang karinan (domain):',
'externaldberror' => 'Mapalyaring mika pamagkamali king external authentication (pamagpatutung panlual) ning database, o ala kang paintulut a i-update ya ing kekang account a panlual (external account).',
'login' => 'Mag log in',
@@ -562,7 +555,7 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} i-edit ing bulung a ini]</span>.',
'usercsspreview' => "'''Tandanan mung pi-preview me mu ing kekang user CSS, e ya pa me-save!'''",
'userjspreview' => "'''Tandanan mung susubukan/pi-preview me pamu ing kekang user JavaScript, e ya pa me-save iti!'''",
'userinvalidcssjstitle' => "'''Kapiadian:''' Alang pabalat (skin) a \"\$1\".
-Tandanan mung deng pasadiang bulung (custom pages) a .css ampong .js, gagamit lang bansag a mababang letra (lowercase), alm. (alimbawa), {{ns:user}}:Foo/monobook.css, at e {{ns:user}}:Foo/Monobook.css.",
+Tandanan mung deng pasadiang bulung (custom pages) a .css ampong .js, gagamit lang bansag a mababang letra (lowercase), alm. (alimbawa), {{ns:user}}:Foo/vector.css, at e {{ns:user}}:Foo/Vector.css.",
'updated' => '(Mibayu)',
'note' => "'''Kapabaluan:'''",
'previewnote' => "'''Preview ya mu ini;
@@ -604,9 +597,6 @@ Mangaku ka mu naman a ika mismu ing sinulat kaniti, o acopia me ketang metung a
Nung e mu buri ing alilan deng alang patugut at alang lunus ing kekang sinulat, e me duduang keni.<br />
Mangaku ka mu naman a ika mismu ing sinulat kaniti, o akopia me ketang metung a pikuanan a mipaintulutan king malda o aliwa pang libring pikukuanan (lon me ing $1 para kareng detalle).
'''E KA MANAMBAG OBRANG MAKI COPYRIGHT NUNG ALANG PAINTULUT!",
-'longpagewarning' => "'''KAPIADIAN: Maki kaba yang $1 kilobyte ining bulung;
-mágkasákit lang mag-edit bulung a maigit 32 kb deng aliwang browser.
-Nung maliari, pakipitnan me kareng adua o maigit pang dake.'''",
'longpageerror' => "'''MALI: Miras yang $1 kilobyte ing kekang sinulat; sobra ya ketang $2 a pekamakabang maliaring iyambag. E ya ma-save iti.'''",
'readonlywarning' => "'''BABALA: Makasara ya ing database uling sasamasan de iti, ania e mo a-save ngeni detang kekang in-edit.
Maliari meng i-\"cut-n-paste\" ing sinulat mu king metung a text file, at i-save mu ne mu para king tutuki.'''",
@@ -1081,7 +1071,6 @@ Nung atyu keka ining larawan king bersion a pekamalino (full resolution), ilulan
mibalik ka at ilulan (upload) me king lalam ning bayung lagyu. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Atin nang simpan (file) a maki lagyung anti kaniti king abe-abeng simpanan (shared file repository);
mibalik ka at ilulan (upload) me king lalam ning bayung lagyu. [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'Melaus ing pamaglulan',
'uploadwarning' => 'Babala king pamaglulan',
'savefile' => 'I-save ya ing simpan (file)',
'uploadedimage' => 'milulan ya ing "[[$1]]"',
@@ -1102,6 +1091,7 @@ Pakaisipan mu sa nung ustu ing isundu mu ing pamaglulan kaniti.
Makabili ya keni ing tala da reng mengabura ba meng asuri:",
'filename-bad-prefix' => "Magumpisa ya king '''\"\$1\"''' ing lagyu ning simpan (file) a kekang lululan. Iti metung yang lagyung tambing dang bibie deng digital camera, at ala yang kaugnayan ketang letratu.
Mamili ka sanang lagyung mas maglarawan keng kekang simpan.",
+'upload-success-subj' => 'Melaus ing pamaglulan',
'upload-proto-error' => 'E ustung protocol',
'upload-proto-error-text' => 'Mangailangan yang URL a magumpisa king <code>http://</code> o <code>ftp://</code> ing pang-malaut a pamaglulan (remote upload).',
@@ -1381,7 +1371,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Deng kanakung babanten',
'mywatchlist' => 'Deng kakung babanten',
-'watchlistfor' => "(para '''$1''')",
'nowatchlist' => 'Ala yang laman ing kekang tala ring babanten (watchlist).',
'watchlistanontext' => 'Paki $1 ba mong akit o a-edit deng laman ning kekang tala ring babanten (watchlist).',
'watchnologin' => 'E maka-login',
@@ -1501,7 +1490,9 @@ I [[User:$3|$3]] ([[User talk:$3|Talk]]) ing tawling menalili.',
binalik neng [[User:$1|$1]] king tauling bersion',
'rollback-success' => 'Deng edit nang $1 a miurung;
binalik nong $2 king sadiang bersion.',
-'sessionfailure' => 'Balamu ating prublema king kekang login session;
+
+# Edit tokens
+'sessionfailure' => 'Balamu ating prublema king kekang login session;
mituknang ya ing kimut (action) a ini bang milisia king session hijacking (pamaniamsam session).
Pakitimid me ing "mibalik" ("back") at luban meng pasibayu ing bulung a penibatan mu, potang kai subukan mung pasibayu.',
@@ -1681,7 +1672,6 @@ mu nung sanu retang bulung a sinira da).',
'ipb-edit-dropdown' => 'Sangkan ning pamaniabat king pamag-edit',
'ipb-unblock-addr' => 'Ilako ya pangasabat ing $1',
'ipb-unblock' => 'Ilako ya pangasabat ing lagyungtalagamit (username) o IP address',
-'ipb-blocklist-addr' => 'Lon la reng kasalungsungang makasabat para $1',
'ipb-blocklist' => 'Lon la reng kasalungsungang makasabat',
'unblockip' => 'Ilako ya pangasabat ing talagamit',
'unblockiptext' => 'Gamitan me ing form king lalam ba mung ibalik ing paintulut a sumulat (write access) king IP address o lagyungtalagamit a sadiang makasabat.',
@@ -2039,10 +2029,10 @@ $1',
'imagemaxsize' => 'E la dapat migit king bilang a iti deng larawan kareng bulung pamilarawan simpan (file description pages):',
'thumbsize' => 'Kasindagul kuku (thumbnail size):',
'widthheightpage' => '$1×$2, $3 bulung',
-'file-info' => '(dagul ning simpan [file]: $1, MIME type: $2)',
-'file-info-size' => '($1 × $2 pixel, sukad ning simpan: $3, MIME type: $4)',
+'file-info' => 'dagul ning simpan [file]: $1, MIME type: $2',
+'file-info-size' => '$1 × $2 pixel, sukad ning simpan: $3, MIME type: $4',
'file-nohires' => '<small>Ala nang mas malino pa.</small>',
-'svg-long-desc' => '(SVG file, masasabing $1 × $2 pixels, dagul ning simpan: $3)',
+'svg-long-desc' => 'SVG file, masasabing $1 × $2 pixels, dagul ning simpan: $3',
'show-big-image' => 'Pekamalino',
'show-big-image-thumb' => '<small>Dagul na niting preview: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesPap.php b/languages/messages/MessagesPap.php
index ca3e544c..c23ff5bb 100644
--- a/languages/messages/MessagesPap.php
+++ b/languages/messages/MessagesPap.php
@@ -171,7 +171,7 @@ No lubidá di kambia bo [[Special:Preferences|{{SITENAME}} preferensianan]].',
'yourname' => 'Nòmber di uzadó',
'yourpassword' => 'Kontraseña',
'yourpasswordagain' => 'Hinka kontraseña atrobe',
-'remembermypassword' => 'Kordá mi',
+'remembermypassword' => 'Kordá mi (for a maximum of $1 {{PLURAL:$1|day|days}})',
'userlogin' => 'Traha un kuenta nobo òf outentiká',
'userlogout' => 'Terminá sesion',
'badretype' => 'E kontraseñanan hinká no ta kuadra.',
diff --git a/languages/messages/MessagesPcd.php b/languages/messages/MessagesPcd.php
index 3c347d50..ca12ccc9 100644
--- a/languages/messages/MessagesPcd.php
+++ b/languages/messages/MessagesPcd.php
@@ -27,8 +27,7 @@ $messages = array(
'tog-editsection' => "Pérmet l'édichion del sekchion via [edit] loïens",
'tog-editsectiononrightclick' => "Pérmet l'édichion del sekchion par un droé buke su ch'tite del sekchion (i feut JavaScript)",
'tog-showtoc' => "Aficher l'tabe ed ches étnus (pou ches paches aveuc plu ed 3 intétes)",
-'tog-rememberpassword' => "Warder min lodjine su chl'ordinateu-lo.",
-'tog-editwidth' => "Alatcher l'boéte d'édichon pou rimplir tout ch'cassi",
+'tog-rememberpassword' => "Warder min lodjine su chl'ordinateu-lo (for a maximum of $1 {{PLURAL:$1|day|days}})",
'tog-watchcreations' => "Ajouter ches paches qu'éj crée su em lisse",
'tog-watchdefault' => "Ajouter ches paches qu'éj édite su em lisse.",
'tog-watchmoves' => "Ajouter ches paches qu'éj déplache su m'lisse.",
@@ -141,28 +140,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Rajouter un sujeut',
-'vector-action-delete' => 'Défacer',
-'vector-action-move' => "Canger ch'nom",
-'vector-action-protect' => 'Garantir',
-'vector-action-undelete' => "N'poin défacher",
-'vector-action-unprotect' => "N'poin garantir",
-'vector-namespace-help' => "Pache d'aïude",
-'vector-namespace-image' => 'Fichié',
-'vector-namespace-main' => 'Pache',
-'vector-namespace-mediawiki' => 'Message',
-'vector-namespace-special' => 'Pache éspéchiale',
-'vector-namespace-talk' => 'Pérlache',
-'vector-namespace-template' => 'Modéle',
-'vector-namespace-user' => 'Pache dechl uzeu',
-'vector-view-create' => 'Créer',
-'vector-view-edit' => 'Éditer',
-'vector-view-history' => "Vir l'histoère",
-'vector-view-view' => 'Lire',
-'vector-view-viewsource' => "Vir l'source",
-'actions' => 'Acchons',
-'namespaces' => "Éspaces d'chés noms",
-'variants' => 'Ércanjantes',
+'vector-action-addsection' => 'Rajouter un sujeut',
+'vector-action-delete' => 'Défacer',
+'vector-action-move' => "Canger ch'nom",
+'vector-action-protect' => 'Garantir',
+'vector-action-undelete' => "N'poin défacher",
+'vector-action-unprotect' => "N'poin garantir",
+'vector-simplesearch-preference' => "Déhousser chés avanches d'ércherche améliorées (seulemint pour Vector)",
+'vector-view-create' => 'Créer',
+'vector-view-edit' => 'Éditer',
+'vector-view-history' => "Vir l'histoère",
+'vector-view-view' => 'Lire',
+'vector-view-viewsource' => "Vir l'source",
+'actions' => 'Acchons',
+'namespaces' => "Éspaces d'chés noms",
+'variants' => 'Ércanjantes',
'errorpagetitle' => 'Bérlure',
'returnto' => 'Értrouve $1.',
@@ -316,7 +308,7 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
'yourname' => "nom d'uzeu:",
'yourpassword' => "Mot d'passe:",
'yourpasswordagain' => "Intrer à nouvieu ch'mot d'passe:",
-'remembermypassword' => "Inrégistrer m'loguine su echl ordinateu-lo",
+'remembermypassword' => "Intrer oùtonmatiquemint l'prochaine fouos (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
'yourdomainname' => 'Vote donmène:',
'login' => 'Intrer',
'nav-login-createaccount' => 'Intrer / créer vote conpte',
@@ -612,7 +604,6 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
# Watchlist
'watchlist' => 'Em lisse à suire',
'mywatchlist' => "M'lisse à suire",
-'watchlistfor' => "(pou '''$1''')",
'addedwatch' => "Rajouté su l'lisse à suire",
'addedwatchtext' => "L' pache « [[:$1]] » o té rajoutée à vote [[Special:Watchlist|lisse à suire]].<br /> Chés canjemints à vnir del pache-lo pi del page éd pérlache sront mis din l'lisse. L'pache sro '''in cros''' din el [[Special:RecentChanges|lisse d'chés darins canjemints]] pou les értreuver fachilmint. Pou értirer chol pache del ''lisse à suire'', bukez su « {{MediaWiki:Unwatch}} ».",
'removedwatch' => 'Értiré del lisse à suire',
@@ -695,6 +686,7 @@ Vlo chés réglages del pache '''$1''' à ch'momint-chi:",
'sp-contributions-blocklog' => 'jornal éd chés blotcåjhes',
'sp-contributions-search' => 'Tracher pou chés contérbuchons',
'sp-contributions-username' => "Adérche IP ou nom d'uzeu",
+'sp-contributions-toponly' => "n'montrer qu'chés darins canjemints",
'sp-contributions-submit' => 'Tracher',
# What links here
@@ -826,6 +818,7 @@ Os pouvez vir l'source",
'tooltip-watch' => 'Ajouter chol pache-lo à vo lisse à suire',
'tooltip-rollback' => '« Racacher » cancéle aveuc un clic el (ou chés) modificachon(s) del pache-lo pèr sin darin contérbucheu.',
'tooltip-undo' => "« Undo » ( ''démangler'' ) értire ch'canjemint-lo pi ouvre l' fénéte d'édichon din ch'mode ''prévir''. <br /> In put mette un motif din ch'résumé.",
+'tooltip-preferences-save' => 'Warder chés préférinches.',
# Info page
'numedits' => 'Nombe ed canjemints (pache) : $1',
@@ -835,9 +828,9 @@ Os pouvez vir l'source",
'nextdiff' => 'Nouvèle édichon →',
# Media information
-'file-info-size' => '($1 × $2 picséls, diminchon dech fichié: $3, MIME tipe: $4)',
+'file-info-size' => '$1 × $2 picséls, diminchon dech fichié: $3, MIME tipe: $4',
'file-nohires' => '<small>Poin éd pu grande résoluchon possibe.</small>',
-'svg-long-desc' => '(Fichié SVG, résoluchon éd $1 × $2 picsels, diminchon: $3)',
+'svg-long-desc' => 'Fichié SVG, résoluchon éd $1 × $2 picsels, diminchon: $3',
'show-big-image' => 'Plinne résoluchon',
'show-big-image-thumb' => '<small>Diminchon del intérvue-lo : $1 × $2 picséls</small>',
@@ -897,6 +890,13 @@ Chés eutes cans is s'ront muchés pèr défeut.
# Special:BlankPage
'blankpage' => 'Blanke pache',
+# Special:ComparePages
+'compare-page1' => 'Pache 1',
+'compare-page2' => 'Pache 2',
+'compare-rev1' => 'Canjemint 1',
+'compare-rev2' => 'Canjemint 2',
+'compare-submit' => 'Aconparer',
+
# Database error messages
'dberr-header' => 'Ech wiki-lo il o dés problémes',
diff --git a/languages/messages/MessagesPdc.php b/languages/messages/MessagesPdc.php
index dbb1d753..9a6a1f55 100644
--- a/languages/messages/MessagesPdc.php
+++ b/languages/messages/MessagesPdc.php
@@ -117,23 +117,14 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-delete' => 'Lösche',
-'vector-action-move' => 'Ziehe',
-'vector-action-protect' => 'Schitze',
-'vector-namespace-category' => 'Abdeeling',
-'vector-namespace-help' => 'Hilfblatt',
-'vector-namespace-image' => 'Feil',
-'vector-namespace-main' => 'Blatt',
-'vector-namespace-project' => 'Project-Blatt',
-'vector-namespace-special' => 'Besunneres Blatt',
-'vector-namespace-talk' => 'Dischbedutt',
-'vector-namespace-template' => 'Moddel',
-'vector-namespace-user' => 'Yuuser-Blatt',
-'vector-view-create' => 'Schtaerte',
-'vector-view-edit' => 'Ennere',
-'vector-view-history' => 'Gschicht zeige',
-'vector-view-view' => 'Lese',
-'namespaces' => 'Blatznaame',
+'vector-action-delete' => 'Lösche',
+'vector-action-move' => 'Ziehe',
+'vector-action-protect' => 'Schitze',
+'vector-view-create' => 'Schtaerte',
+'vector-view-edit' => 'Ennere',
+'vector-view-history' => 'Gschicht zeige',
+'vector-view-view' => 'Lese',
+'namespaces' => 'Blatznaame',
'errorpagetitle' => 'Mischteek',
'returnto' => 'Zerick zum Blatt $1.',
@@ -263,6 +254,7 @@ Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld
'userlogout' => 'Geh naus',
'gotaccountlink' => 'Kumm nei',
'createaccountmail' => 'iwwer E-Mail',
+'createaccountreason' => 'Grund:',
'mailmypassword' => 'Neies Paesswadd eposchde',
'noemail' => 'Yuuser „$1“ hot ken E-Mail aagewwe.',
'loginlanguagelabel' => 'Schprooch: $1',
@@ -455,27 +447,24 @@ Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld
'action-delete' => 'des Blatt zu lösche',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
-'recentchanges' => 'Was mer letscht geduh henn',
-'recentchanges-legend-newpage' => '$1 - neies Blatt',
-'recentchanges-legend-minor' => '$1 - gleene Ennering',
-'recentchanges-label-minor' => 'Gleene Ennering',
-'recentchanges-legend-bot' => '$1 - Ennering vun em Waddefresser',
-'recentchanges-label-bot' => 'Ennering vun em Waddefresser',
-'rcshowhideminor' => 'Gleene Enneringe $1',
-'rcshowhidebots' => 'Bots $1',
-'rcshowhideanons' => 'IP-Yuuser $1',
-'rcshowhidemine' => 'Mei Ardickele $1',
-'rclinks' => 'Zeig die letscht $1 Enneringe vun de letscht $2 Daag.<br />$3',
-'diff' => 'Unnerschidd',
-'hist' => 'Gschicht',
-'hide' => 'verschwinne losse',
-'show' => 'zeige',
-'minoreditletter' => 'g',
-'newpageletter' => 'N',
-'boteditletter' => 'W',
-'rc_categories_any' => 'All',
-'newsectionsummary' => 'Neier Abschnitt /* $1 */',
+'nchanges' => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
+'recentchanges' => 'Was mer letscht geduh henn',
+'recentchanges-label-minor' => 'Gleene Ennering',
+'recentchanges-label-bot' => 'Ennering vun em Waddefresser',
+'rcshowhideminor' => 'Gleene Enneringe $1',
+'rcshowhidebots' => 'Bots $1',
+'rcshowhideanons' => 'IP-Yuuser $1',
+'rcshowhidemine' => 'Mei Ardickele $1',
+'rclinks' => 'Zeig die letscht $1 Enneringe vun de letscht $2 Daag.<br />$3',
+'diff' => 'Unnerschidd',
+'hist' => 'Gschicht',
+'hide' => 'verschwinne losse',
+'show' => 'zeige',
+'minoreditletter' => 'g',
+'newpageletter' => 'N',
+'boteditletter' => 'W',
+'rc_categories_any' => 'All',
+'newsectionsummary' => 'Neier Abschnitt /* $1 */',
# Recent changes linked
'recentchangeslinked' => 'Was on verlinkde Bledder geduh warre iss',
@@ -641,7 +630,6 @@ Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld
# Watchlist
'watchlist' => 'Mei Watsch-Lischt',
'mywatchlist' => 'Mei Watsch-Lischt',
-'watchlistfor' => "(fer '''$1''')",
'addedwatch' => 'Zu de Watsch-Lischt dezu geduh',
'watch' => 'watsche',
'watchthispage' => 'watsch des Blatt',
@@ -830,7 +818,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
# Media information
'widthheightpage' => '$1×$2, {{PLURAL:$3|1 Blatt|$3 Bledder}}',
-'file-info-size' => '($1 × $2 Pixel, Daadegrees: $3, MIME-Typ: $4)',
+'file-info-size' => '$1 × $2 Pixel, Daadegrees: $3, MIME-Typ: $4',
# Special:NewFiles
'showhidebots' => '(Bots $1)',
@@ -904,6 +892,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'version-other' => 'Anneres',
'version-mediahandlers' => 'Media-Haendlers',
'version-version' => '(Version $1)',
+'version-poweredby-others' => 'annere',
'version-software-version' => 'Version',
# Special:FilePath
@@ -931,6 +920,10 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'tags-edit' => 'ennere',
'tags-hitcount' => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
+# Special:ComparePages
+'compare-page1' => 'Blatt 1',
+'compare-page2' => 'Blatt 2',
+
# HTML forms
'htmlform-reset' => 'Enneringe zerick nemme',
'htmlform-selectorother-other' => 'Annere',
diff --git a/languages/messages/MessagesPdt.php b/languages/messages/MessagesPdt.php
index da50f0fc..d1cbb764 100644
--- a/languages/messages/MessagesPdt.php
+++ b/languages/messages/MessagesPdt.php
@@ -419,7 +419,6 @@ Bitte nemm eenen aundren.',
# Watchlist
'mywatchlist' => 'Miene Oppaussied',
-'watchlistfor' => "(fer '''$1''')",
'addedwatch' => "No Oppausssied bieje'done",
'watch' => 'Oppausse',
'watchthispage' => 'Op dise Sied oppausse',
diff --git a/languages/messages/MessagesPfl.php b/languages/messages/MessagesPfl.php
index 7c35bd86..a0b896ce 100644
--- a/languages/messages/MessagesPfl.php
+++ b/languages/messages/MessagesPfl.php
@@ -82,9 +82,8 @@ $messages = array(
'qbmyoptions' => 'Mai Saide',
# Vector skin
-'vector-action-move' => 'Verschiewe',
-'vector-namespace-user' => 'Benutzersaid',
-'vector-view-edit' => 'Bearwaide',
+'vector-action-move' => 'Verschiewe',
+'vector-view-edit' => 'Bearwaide',
'errorpagetitle' => 'Fehler',
'returnto' => 'Zrick zu $1.',
@@ -187,7 +186,7 @@ S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid
# Login and logout pages
'yourname' => 'Benutzername:',
'yourpassword' => 'Passwort:',
-'remembermypassword' => 'Mai Passwort uff dem Computer merke',
+'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',
@@ -455,7 +454,6 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
# Watchlist
'watchlist' => 'Beowachdungslischd',
'mywatchlist' => 'Mai Beowachdungslischd',
-'watchlistfor' => "(fer '''$1''')",
'addedwatch' => 'Zu de Beowachdungslischt zufieche',
'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.",
@@ -695,9 +693,9 @@ Du kannscht e Grund in dr Zammfassung aagewwe',
'nextdiff' => 'Naiere Bearwaidung →',
# Media information
-'file-info-size' => '($1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4)',
+'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
'file-nohires' => '<small>Ke hechere Ufflesung verfiechbar.</small>',
-'svg-long-desc' => '(SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3)',
+'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
'show-big-image' => 'Gsamte Ergebnis',
'show-big-image-thumb' => '<small>Greß vun derre Vorschau: $1 × $2 Pixels</small>',
diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php
index 6cbad15e..98bfb67c 100644
--- a/languages/messages/MessagesPl.php
+++ b/languages/messages/MessagesPl.php
@@ -10,6 +10,7 @@
* @author Beau
* @author Derbeth
* @author Equadus
+ * @author Fizykaa
* @author Herr Kriss
* @author Holek
* @author Jwitos
@@ -59,6 +60,10 @@ $namespaceAliases = array(
'Dyskusja_grafiki' => NS_FILE_TALK,
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'Użytkownik', 'female' => 'Użytkowniczka' ),
+ NS_USER_TALK => array( 'male' => 'Dyskusja_użytkownika', 'female' => 'Dyskusja_użytkowniczki' ),
+);
$dateFormats = array(
'mdy time' => 'H:i',
@@ -83,93 +88,95 @@ $separatorTransformTable = array(
$linkTrail = '/^([a-zęóąśłżźćńĘÓĄŚÅŻŹĆŃ]+)(.*)$/sDu';
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Podwójne przekierowania' ),
- 'BrokenRedirects' => array( 'Zerwane przekierowania' ),
+ 'DoubleRedirects' => array( 'Podwójne_przekierowania' ),
+ 'BrokenRedirects' => array( 'Zerwane_przekierowania' ),
'Disambiguations' => array( 'Ujednoznacznienia' ),
'Userlogin' => array( 'Zaloguj' ),
'Userlogout' => array( 'Wyloguj' ),
- 'CreateAccount' => array( 'Stwórz konto' ),
+ 'CreateAccount' => array( 'Stwórz_konto' ),
'Preferences' => array( 'Preferencje' ),
'Watchlist' => array( 'Obserwowane' ),
- 'Recentchanges' => array( 'Ostatnie zmiany', 'OZ' ),
+ 'Recentchanges' => array( 'Ostatnie_zmiany', 'OZ' ),
'Upload' => array( 'Prześlij' ),
'Listfiles' => array( 'Pliki' ),
- 'Newimages' => array( 'Nowe pliki' ),
+ 'Newimages' => array( 'Nowe_pliki' ),
'Listusers' => array( 'Użytkownicy' ),
- 'Listgrouprights' => array( 'Uprawnienia grup użytkowników', 'Uprawnienia' ),
+ 'Listgrouprights' => array( 'Grupy_użytkowników', 'Uprawnienia_grup_użytkowników' ),
'Statistics' => array( 'Statystyka', 'Statystyki' ),
- 'Randompage' => array( 'Losowa strona', 'Losowa' ),
- 'Lonelypages' => array( 'Porzucone strony' ),
- 'Uncategorizedpages' => array( 'Nieskategoryzowane strony' ),
- 'Uncategorizedcategories' => array( 'Nieskategoryzowane kategorie' ),
- 'Uncategorizedimages' => array( 'Nieskategoryzowane pliki' ),
- 'Uncategorizedtemplates' => array( 'Nieskategoryzowane szablony' ),
- 'Unusedcategories' => array( 'Nieużywane kategorie' ),
- 'Unusedimages' => array( 'Nieużywane pliki' ),
- 'Wantedpages' => array( 'Potrzebne strony' ),
- 'Wantedcategories' => array( 'Potrzebne kategorie' ),
- 'Wantedfiles' => array( 'Potrzebne pliki' ),
- 'Wantedtemplates' => array( 'Potrzebne szablony' ),
- 'Mostlinked' => array( 'Najczęściej linkowane' ),
- 'Mostlinkedcategories' => array( 'Najczęściej linkowane kategorie' ),
- 'Mostlinkedtemplates' => array( 'Najczęściej linkowane szablony' ),
- 'Mostimages' => array( 'Najczęściej linkowane pliki' ),
- 'Mostcategories' => array( 'Najwięcej kategorii' ),
- 'Mostrevisions' => array( 'Najwięcej edycji', 'Najczęściej edytowane' ),
- 'Fewestrevisions' => array( 'Najmniej edycji' ),
- 'Shortpages' => array( 'Najkrótsze strony' ),
- 'Longpages' => array( 'Najdłuższe strony' ),
- 'Newpages' => array( 'Nowe strony' ),
- 'Ancientpages' => array( 'Stare strony' ),
- 'Deadendpages' => array( 'Bez linków' ),
- 'Protectedpages' => array( 'Zabezpieczone strony' ),
- 'Protectedtitles' => array( 'Zabezpieczone nazwy stron' ),
- 'Allpages' => array( 'Wszystkie strony' ),
- 'Prefixindex' => array( 'Strony według prefiksu' ),
+ 'Randompage' => array( 'Losowa_strona', 'Losowa' ),
+ 'Lonelypages' => array( 'Porzucone_strony' ),
+ 'Uncategorizedpages' => array( 'Nieskategoryzowane_strony' ),
+ 'Uncategorizedcategories' => array( 'Nieskategoryzowane_kategorie' ),
+ 'Uncategorizedimages' => array( 'Nieskategoryzowane_pliki' ),
+ 'Uncategorizedtemplates' => array( 'Nieskategoryzowane_szablony' ),
+ 'Unusedcategories' => array( 'Nieużywane_kategorie' ),
+ 'Unusedimages' => array( 'Nieużywane_pliki' ),
+ 'Wantedpages' => array( 'Potrzebne_strony' ),
+ 'Wantedcategories' => array( 'Potrzebne_kategorie' ),
+ 'Wantedfiles' => array( 'Potrzebne_pliki' ),
+ 'Wantedtemplates' => array( 'Potrzebne_szablony' ),
+ 'Mostlinked' => array( 'Najczęściej_linkowane' ),
+ 'Mostlinkedcategories' => array( 'Najczęściej_linkowane_kategorie' ),
+ 'Mostlinkedtemplates' => array( 'Najczęściej_linkowane_szablony' ),
+ 'Mostimages' => array( 'Najczęściej_linkowane_pliki' ),
+ 'Mostcategories' => array( 'Najwięcej_kategorii' ),
+ 'Mostrevisions' => array( 'Najwięcej_edycji', 'Najczęściej_edytowane' ),
+ 'Fewestrevisions' => array( 'Najmniej_edycji' ),
+ 'Shortpages' => array( 'Najkrótsze_strony' ),
+ 'Longpages' => array( 'Najdłuższe_strony' ),
+ 'Newpages' => array( 'Nowe_strony' ),
+ 'Ancientpages' => array( 'Stare_strony' ),
+ 'Deadendpages' => array( 'Bez_linków' ),
+ 'Protectedpages' => array( 'Zabezpieczone_strony' ),
+ 'Protectedtitles' => array( 'Zabezpieczone_nazwy_stron' ),
+ 'Allpages' => array( 'Wszystkie_strony' ),
+ 'Prefixindex' => array( 'Strony_według_prefiksu' ),
'Ipblocklist' => array( 'Zablokowani' ),
- 'Specialpages' => array( 'Strony specjalne' ),
+ 'Unblock' => array( 'Odblokuj' ),
+ 'Specialpages' => array( 'Strony_specjalne' ),
'Contributions' => array( 'Wkład' ),
'Emailuser' => array( 'E-mail' ),
- 'Confirmemail' => array( 'Potwierdź e-mail' ),
+ 'Confirmemail' => array( 'Potwierdź_e-mail' ),
'Whatlinkshere' => array( 'LinkujÄ…ce' ),
- 'Recentchangeslinked' => array( 'Zmiany w linkujÄ…cych' ),
+ 'Recentchangeslinked' => array( 'Zmiany_w_linkujÄ…cych' ),
'Movepage' => array( 'PrzenieÅ›' ),
- 'Blockme' => array( 'Zablokuj mnie' ),
+ 'Blockme' => array( 'Zablokuj_mnie' ),
'Booksources' => array( 'Książki' ),
'Categories' => array( 'Kategorie' ),
'Export' => array( 'Eksport' ),
'Version' => array( 'Wersja' ),
- 'Allmessages' => array( 'Wszystkie komunikaty' ),
+ 'Allmessages' => array( 'Wszystkie_komunikaty' ),
'Log' => array( 'Rejestr', 'Logi' ),
'Blockip' => array( 'Blokuj' ),
'Undelete' => array( 'Odtwórz' ),
- 'Lockdb' => array( 'Zablokuj bazÄ™' ),
- 'Unlockdb' => array( 'Odblokuj bazÄ™' ),
- 'Userrights' => array( 'Uprawnienia użytkowników', 'Prawa użytkowników' ),
- 'MIMEsearch' => array( 'Wyszukiwanie MIME' ),
- 'FileDuplicateSearch' => array( 'Szukaj duplikatu pliku' ),
- 'Unwatchedpages' => array( 'Nieobserwowane strony' ),
+ 'Lockdb' => array( 'Zablokuj_bazÄ™' ),
+ 'Unlockdb' => array( 'Odblokuj_bazÄ™' ),
+ 'Userrights' => array( 'Uprawnienia', 'Uprawnienia_użytkowników', 'Prawa_użytkowników' ),
+ 'MIMEsearch' => array( 'Wyszukiwanie_MIME' ),
+ 'FileDuplicateSearch' => array( 'Szukaj_duplikatu_pliku' ),
+ 'Unwatchedpages' => array( 'Nieobserwowane_strony' ),
'Listredirects' => array( 'Przekierowania' ),
- 'Revisiondelete' => array( 'Usuń wersję' ),
- 'Unusedtemplates' => array( 'Nieużywane szablony' ),
- 'Randomredirect' => array( 'Losowe przekierowanie' ),
- 'Mypage' => array( 'Moja strona' ),
- 'Mytalk' => array( 'Moja dyskusja' ),
- 'Mycontributions' => array( 'Mój wkład' ),
+ 'Revisiondelete' => array( 'Usuń_wersję' ),
+ 'Unusedtemplates' => array( 'Nieużywane_szablony' ),
+ 'Randomredirect' => array( 'Losowe_przekierowanie' ),
+ 'Mypage' => array( 'Moja_strona' ),
+ 'Mytalk' => array( 'Moja_dyskusja' ),
+ 'Mycontributions' => array( 'Mój_wkład' ),
'Listadmins' => array( 'Administratorzy' ),
'Listbots' => array( 'Boty' ),
- 'Popularpages' => array( 'Popularne strony' ),
+ 'Popularpages' => array( 'Popularne_strony' ),
'Search' => array( 'Szukaj' ),
- 'Resetpass' => array( 'Zmień hasło', 'Resetuj hasło' ),
- 'Withoutinterwiki' => array( 'Strony bez interwiki' ),
- 'MergeHistory' => array( 'Połącz historię' ),
- 'Filepath' => array( 'Ścieżka do pliku' ),
- 'Invalidateemail' => array( 'Anuluj e-mail' ),
- 'Blankpage' => array( 'Pusta strona' ),
- 'LinkSearch' => array( 'Wyszukiwarka linków' ),
- 'DeletedContributions' => array( 'Usunięty wkład' ),
+ 'Resetpass' => array( 'Zmień_hasło', 'Resetuj_hasło' ),
+ 'Withoutinterwiki' => array( 'Strony_bez_interwiki' ),
+ 'MergeHistory' => array( 'Połącz_historię' ),
+ 'Filepath' => array( 'Ścieżka_do_pliku' ),
+ 'Invalidateemail' => array( 'Anuluj_e-mail' ),
+ 'Blankpage' => array( 'Pusta_strona' ),
+ 'LinkSearch' => array( 'Wyszukiwarka_linków' ),
+ 'DeletedContributions' => array( 'Usunięty_wkład' ),
'Tags' => array( 'Znaczniki' ),
- 'Activeusers' => array( 'Aktywni użytkownicy' ),
+ 'Activeusers' => array( 'Aktywni_użytkownicy' ),
+ 'ComparePages' => array( 'Porównywanie_stron' ),
);
$magicWords = array(
@@ -179,6 +186,7 @@ $magicWords = array(
'forcetoc' => array( '0', '__ZESPISEM__', '__FORCETOC__' ),
'toc' => array( '0', '__SPIS__', '__TOC__' ),
'noeditsection' => array( '0', '__BEZEDYCJISEKCJI__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BEZNAGÅÓWKA__', '__NOHEADER__' ),
'localmonth' => array( '1', 'MIESIÄ„C', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonthname' => array( '1', 'MIESIÄ„CNAZWA', 'LOCALMONTHNAME' ),
'localmonthnamegen' => array( '1', 'MIESIÄ„CNAZWAD', 'LOCALMONTHNAMEGEN' ),
@@ -198,6 +206,7 @@ $magicWords = array(
'namespace' => array( '1', 'NAZWAPRZESTRZENI', 'NAMESPACE' ),
'talkspace' => array( '1', 'DYSKUSJA', 'TALKSPACE' ),
'fullpagename' => array( '1', 'PELNANAZWASTRONY', 'FULLPAGENAME' ),
+ 'subst' => array( '0', 'podst:', 'SUBST:' ),
'img_thumbnail' => array( '1', 'mały', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'mały=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'prawo', 'right' ),
@@ -205,7 +214,8 @@ $magicWords = array(
'img_none' => array( '1', 'brak', 'none' ),
'img_center' => array( '1', 'centruj', 'center', 'centre' ),
'img_framed' => array( '1', 'ramka', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bezramki', 'bez ramki', 'frameless' ),
+ 'img_frameless' => array( '1', 'bezramki', 'bez_ramki', 'frameless' ),
+ 'img_page' => array( '1', 'strona=$1', 'page=$1', 'page $1' ),
'img_border' => array( '1', 'tło', 'border' ),
'img_top' => array( '1', 'góra', 'top' ),
'img_middle' => array( '1', 'środek', 'middle' ),
@@ -220,10 +230,13 @@ $magicWords = array(
'ucfirst' => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'UCFIRST:' ),
'lc' => array( '0', 'MAÅE:', 'LC:' ),
'uc' => array( '0', 'WIELKIE:', 'DUŻE:', 'UC:' ),
+ 'newsectionlink' => array( '1', '__LINKNOWEJSEKCJI__', '__NEWSECTIONLINK__' ),
'language' => array( '0', '#JĘZYK:', '#LANGUAGE:' ),
'numberofadmins' => array( '1', 'ADMINISTRATORÓW', 'NUMBEROFADMINS' ),
'padleft' => array( '0', 'DOLEWEJ', 'PADLEFT' ),
'padright' => array( '0', 'DOPRAWEJ', 'PADRIGHT' ),
+ 'defaultsort' => array( '1', 'DOMYÅšLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'hiddencat' => array( '1', '__KATEGORIAUKRYTA__', '__HIDDENCAT__' ),
);
$messages = array(
@@ -242,8 +255,7 @@ $messages = array(
'tog-editsection' => 'Możliwość edycji poszczególnych sekcji strony (link [edytuj])',
'tog-editsectiononrightclick' => 'Kliknięcie prawym klawiszem myszy na tytule sekcji rozpoczyna jej edycję (JavaScript)',
'tog-showtoc' => 'Pokazuj spis treści (na stronach z więcej niż 3 nagłówkami)',
-'tog-rememberpassword' => 'Zapamiętaj hasło na tym komputerze',
-'tog-editwidth' => 'Rozszerz obszar edycji do pełnej szerokości ekranu',
+'tog-rememberpassword' => 'Zapamiętaj moje hasło w przeglądarce (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
'tog-watchcreations' => 'Dodaj do obserwowanych strony tworzone przeze mnie',
'tog-watchdefault' => 'Dodaj do obserwowanych strony, które edytuję',
'tog-watchmoves' => 'Dodaj do obserwowanych strony, które przenoszę',
@@ -389,31 +401,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Dodaj temat',
-'vector-action-delete' => 'Usuń',
-'vector-action-move' => 'PrzenieÅ›',
-'vector-action-protect' => 'Zabezpiecz',
-'vector-action-undelete' => 'Odtwórz',
-'vector-action-unprotect' => 'Odbezpiecz',
-'vector-namespace-category' => 'Kategoria',
-'vector-namespace-help' => 'Strona pomocy',
-'vector-namespace-image' => 'Plik',
-'vector-namespace-main' => 'Strona',
-'vector-namespace-media' => 'Strona pliku',
-'vector-namespace-mediawiki' => 'Komunikat',
-'vector-namespace-project' => 'Strona projektu',
-'vector-namespace-special' => 'Strona specjalna',
-'vector-namespace-talk' => 'Dyskusja',
-'vector-namespace-template' => 'Szablon',
-'vector-namespace-user' => 'Strona użytkownika',
-'vector-view-create' => 'Utwórz',
-'vector-view-edit' => 'Edytuj',
-'vector-view-history' => 'Wyświetl historię',
-'vector-view-view' => 'Czytaj',
-'vector-view-viewsource' => 'Tekst źródłowy',
-'actions' => 'Działania',
-'namespaces' => 'Przestrzenie nazw',
-'variants' => 'Warianty',
+'vector-action-addsection' => 'Dodaj temat',
+'vector-action-delete' => 'Usuń',
+'vector-action-move' => 'PrzenieÅ›',
+'vector-action-protect' => 'Zabezpiecz',
+'vector-action-undelete' => 'Odtwórz',
+'vector-action-unprotect' => 'Odbezpiecz',
+'vector-simplesearch-preference' => 'Włącz zaawansowane podpowiedzi wyszukiwania (tylko dla skórki Wektor)',
+'vector-view-create' => 'Utwórz',
+'vector-view-edit' => 'Edytuj',
+'vector-view-history' => 'Wyświetl historię',
+'vector-view-view' => 'Czytaj',
+'vector-view-viewsource' => 'Tekst źródłowy',
+'actions' => 'Działania',
+'namespaces' => 'Przestrzenie nazw',
+'variants' => 'Warianty',
'errorpagetitle' => 'BÅ‚Ä…d',
'returnto' => 'Wróć do strony $1.',
@@ -474,6 +476,9 @@ Zbyt wielu użytkowników próbuje wyświetlić tę stronę.
Poczekaj chwilę przed ponowną próbą dostępu do tej strony.
$1',
+'pool-timeout' => 'Zbyt długi czas oczekiwania na blokadę',
+'pool-queuefull' => 'Kolejka zadań jest pełna',
+'pool-errorunknown' => 'BÅ‚Ä…d nieznany',
# 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' => 'O {{GRAMMAR:MS.lp|{{SITENAME}}}}',
@@ -638,7 +643,8 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji dla {{GRAMMAR:D.lp|{{
'yourname' => 'Nazwa {{GENDER:|użytkownika|użytkowniczki}}',
'yourpassword' => 'Hasło',
'yourpasswordagain' => 'Powtórz hasło',
-'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze',
+'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
+'securelogin-stick-https' => 'Po zalogowaniu utrzymuj połączenie poprzez HTTPS',
'yourdomainname' => 'Twoja domena',
'externaldberror' => 'Wystąpił błąd zewnętrznej bazy autentyfikacyjnej lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.',
'login' => 'Zaloguj siÄ™',
@@ -655,6 +661,7 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji dla {{GRAMMAR:D.lp|{{
'gotaccount' => "Masz już konto? '''$1'''.",
'gotaccountlink' => 'Zaloguj siÄ™',
'createaccountmail' => 'poprzez eâ€mail',
+'createaccountreason' => 'Powód',
'badretype' => 'Wprowadzone hasła różnią się między sobą.',
'userexists' => 'Wybrana przez Ciebie nazwa użytkownika jest już zajęta.
Wybierz inną nazwę użytkownika.',
@@ -681,6 +688,7 @@ Sprawdź poprawność pisowni.',
'wrongpasswordempty' => 'Wprowadzone hasło jest puste. Spróbuj ponownie.',
'passwordtooshort' => 'Hasło musi mieć co najmniej $1 {{PLURAL:$1|znak|znaki|znaków}}.',
'password-name-match' => 'Hasło musi być inne niż nazwa użytkownika.',
+'password-login-forbidden' => 'Wykorzystanie tej nazwy użytkownika lub hasła zostało zabronione.',
'mailmypassword' => 'WyÅ›lij mi nowe hasÅ‚o poprzez eâ€mail',
'passwordremindertitle' => 'Nowe tymczasowe hasło do {{GRAMMAR:D.lp|{{SITENAME}}}}',
'passwordremindertext' => 'KtoÅ› (prawdopodobnie Ty, spod adresu IP $1)
@@ -722,6 +730,9 @@ Odczekaj chwilę zanim ponowisz próbę.',
'loginlanguagelabel' => 'Język: $1',
'suspicious-userlogout' => 'Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.',
+# E-mail sending
+'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
+
# Password reset dialog
'resetpass' => 'Zmień hasło',
'resetpass_announce' => '{{GENDER:|ZalogowaÅ‚eÅ›|ZalogowaÅ‚aÅ›}} siÄ™, wykorzystujÄ…c tymczasowe hasÅ‚o otrzymane poprzez eâ€mail.
@@ -775,11 +786,12 @@ Być może wÅ‚aÅ›nie zmieniÅ‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} swoje hasÅ‚o lub po
'showdiff' => 'PodglÄ…d zmian',
'anoneditwarning' => "'''Uwaga:''' Nie jesteÅ› {{GENDER:|zalogowany|zalogowana}}.
Twój adres IP zostanie zapisany w historii edycji strony.",
+'anonpreviewwarning' => "''Nie jesteś zalogowany. Jeśli zapiszesz zmiany w historii edycji strony zostanie umieszczony Twój adres IP.''",
'missingsummary' => "'''Uwaga:''' Nie wprowadz{{GENDER:|iłeś|iłaś|ono}} opisu zmian.
Jeżeli nie chcesz go wprowadzać, naciśnij przycisk „Zapisz†jeszcze raz.",
'missingcommenttext' => 'Wprowadź komentarz poniżej.',
-'missingcommentheader' => "'''Uwaga:''' Treść nagłówka jest pusta – uzupełnij go!
-Jeśli tego nie zrobisz, Twój komentarz zostanie zapisany bez nagłówka.",
+'missingcommentheader' => "'''Uwaga''' – treść tytułu lub nagłówka komentarza jest pusta.
+Jeśli ponownie klikniesz „{{int:savearticle}}“, zmiany zostaną zapisane bez niego.",
'summary-preview' => 'PodglÄ…d opisu:',
'subject-preview' => 'Podgląd nagłówka:',
'blockedtitle' => 'Użytkownik jest zablokowany',
@@ -856,8 +868,12 @@ Ostatni wpis rejestru blokad jest pokazany poniżej.',
'userjsyoucanpreview' => "'''Podpowiedź:''' Użyj przycisku „PodglÄ…dâ€, aby przetestować nowy kod JavaScript przed jego zapisaniem.",
'usercsspreview' => "'''Pamiętaj, że to tylko podgląd arkusza stylów CSS – nic jeszcze nie zostało zapisane!'''",
'userjspreview' => "'''Pamiętaj, że to tylko podgląd Twojego kodu JavaScript – nic jeszcze nie zostało zapisane!'''",
+'sitecsspreview' => "'''Pamiętaj, że to tylko podgląd arkusza stylów CSS.'''
+'''Zmiany nie zostały jeszcze zapisane!'''",
+'sitejspreview' => "'''Pamiętaj, że to tylko podgląd kodu JavaScript.'''
+'''Zmiany nie zostały jeszcze zapisane!'''",
'userinvalidcssjstitle' => "'''Uwaga:''' Brak skórki o nazwie „$1â€.
-Strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. {{ns:user}}:Foo/monobook.css, w przeciwieństwie do nieprawidłowego {{ns:user}}:Foo/Monobook.css.",
+Strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. {{ns:user}}:Foo/vector.css, w przeciwieństwie do nieprawidłowego {{ns:user}}:Foo/Vector.css.",
'updated' => '(Zmodyfikowano)',
'note' => "'''Uwaga:'''",
'previewnote' => "'''To jest tylko podgląd – zmiany nie zostały jeszcze zapisane!'''",
@@ -897,7 +913,6 @@ Zapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub p
Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />
Zapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych (zobacz także $1).
'''PROSZĘ NIE WPROWADZAĆ MATERIAÅÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WÅAÅšCICIELA!'''",
-'longpagewarning' => "'''Ta strona ma {{PLURAL:$1|1 kilobajt|$1 kilobajty|$1 kilobajtów}}. Jeśli to możliwe, spróbuj podzielić tekst na mniejsze części.'''",
'longpageerror' => "'''Błąd! Wprowadzony przez Ciebie tekst ma {{PLURAL:$1|1 kilobajt|$1 kilobajty|$1 kilobajtów}}. Długość tekstu nie może przekraczać {{PLURAL:$2|1 kilobajt|$2 kilobajty|$2 kilobajtów}}. Tekst nie może być zapisany.'''",
'readonlywarning' => "'''Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Zapisz jej treść do pliku, używając wytnij i wklej, aby zachować na później.'''
@@ -1075,6 +1090,8 @@ $1",
'logdelete-failure' => "'''Widoczność rejestru nie może zostać ustawiona – '''
$1",
'revdel-restore' => 'zmień widoczność',
+'revdel-restore-deleted' => 'usunięte wersje',
+'revdel-restore-visible' => 'widoczne wersje',
'pagehist' => 'Historia edycji strony',
'deletedhist' => 'Usunięta historia edycji',
'revdelete-content' => 'zawartość',
@@ -1141,11 +1158,13 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
# Diffs
'history-title' => 'Historia edycji „$1â€',
'difference' => '(Różnice między wersjami)',
+'difference-multipage' => '(Różnica między stronami)',
'lineno' => 'Linia $1:',
'compareselectedversions' => 'porównaj wybrane wersje',
'showhideselectedversions' => 'Pokaż lub ukryj zaznaczone wersje',
'editundo' => 'anuluj edycjÄ™',
-'diff-multi' => '(Nie pokazano $1 {{PLURAL:$1|wersji|wersji}} pomiędzy niniejszymi.)',
+'diff-multi' => '(Nie pokazano $1 wersji {{PLURAL:$1|utworzonej|utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
+'diff-multi-manyusers' => '(Nie pokazano $1 {{PLURAL:$1|pośredniej wersji utworzonej|pośrednich wersji utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
# Search results
'searchresults' => 'Wyniki wyszukiwania',
@@ -1180,6 +1199,7 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
'searchprofile-everything-tooltip' => 'Szukanie w całej zawartości (także strony dyskusji)',
'searchprofile-advanced-tooltip' => 'Szukanie w wybranych przestrzeniach nazw',
'search-result-size' => '$1 ({{PLURAL:$2|1 słowo|$2 słowa|$2 słów}})',
+'search-result-category-size' => '{{PLURAL:$1|1 element|$1 elementy|$1 elementów}} ({{PLURAL:$2|1 kategoria|$2 kategorie|$2 kategorii}}, {{PLURAL:$3|1 plik|$3 pliki|$3 plików}})',
'search-result-score' => 'Trafność: $1%',
'search-redirect' => '(przekierowanie $1)',
'search-section' => '(sekcja $1)',
@@ -1256,6 +1276,7 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
'contextlines' => 'Pierwsze wiersze stron',
'contextchars' => 'Litery kontekstu w linijce',
'stub-threshold' => 'Maksymalny (w bajtach) rozmiar strony oznaczanej jako <a href="#" class="stub">zalążek (stub)</a>',
+'stub-threshold-disabled' => 'Wyłączone',
'recentchangesdays' => 'Liczba dni prezentowanych w ostatnich zmianach',
'recentchangesdays-max' => '(maksymalnie $1 {{PLURAL:$1|dzień|dni}})',
'recentchangescount' => 'Domyślna liczba wyświetlanych edycji',
@@ -1289,6 +1310,7 @@ Wygenerowany losowo klucz, którego możesz użyć to $1',
'prefs-files' => 'Pliki',
'prefs-custom-css' => 'własny CSS',
'prefs-custom-js' => 'własny JavaScript',
+'prefs-common-css-js' => 'Wspólny CSS/JS dla wszystkich skórek',
'prefs-reset-intro' => 'Na tej stronie można przywrócić domyślne ustawienia preferencji dla tej witryny.
Tej operacji nie można później cofnąć.',
'prefs-emailconfirm-label' => 'Potwierdzenie adresu eâ€mail –',
@@ -1327,9 +1349,15 @@ Umożliwi również innym użytkownikom skontaktowanie się z Tobą poprzez odpo
'prefs-advancedrendering' => 'Zaawansowane',
'prefs-advancedsearchoptions' => 'Zaawansowane',
'prefs-advancedwatchlist' => 'Zaawansowane',
-'prefs-display' => 'Opcje wyświetlania',
+'prefs-displayrc' => 'Opcje wyświetlania',
+'prefs-displaysearchoptions' => 'Opcje wyświetlania',
+'prefs-displaywatchlist' => 'Opcje wyświetlania',
'prefs-diffs' => 'Zmiany',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Wygląda na prawidłowy',
+'email-address-validity-invalid' => 'Wymagany jest prawidłowy adres!',
+
# User rights
'userrights' => 'Zarządzaj uprawnieniami użytkowników',
'userrights-lookup-user' => 'Zarządzaj grupami użytkownika',
@@ -1413,6 +1441,7 @@ Umożliwi również innym użytkownikom skontaktowanie się z Tobą poprzez odpo
'right-hideuser' => 'Blokowanie użytkownika, niewidoczne publicznie',
'right-ipblock-exempt' => 'Obejście blokad, automatycznych blokad i blokad zakresów, adresów IP',
'right-proxyunbannable' => 'Obejście automatycznych blokad proxy',
+'right-unblockself' => 'Odblokowanie samego siebie',
'right-protect' => 'Zmiana poziomu zabezpieczenia i dostęp do edycji zabezpieczonych stron',
'right-editprotected' => 'Dostęp do edycji zabezpieczonych stron (bez zabezpieczenia dziedziczonego)',
'right-editinterface' => 'Edycja interfejsu użytkownika',
@@ -1435,7 +1464,6 @@ Umożliwi również innym użytkownikom skontaktowanie się z Tobą poprzez odpo
'right-siteadmin' => 'Blokowanie i odblokowywanie bazy danych',
'right-reset-passwords' => 'Zerowanie haseł innych użytkowników',
'right-override-export-depth' => 'Eksport stron wraz z linkowanymi do głębokości 5 linków',
-'right-versiondetail' => 'Podgląd szczegółowych informacji o wersji oprogramowania',
'right-sendemail' => 'WysyÅ‚anie eâ€maili do innych użytkowników',
# User rights log
@@ -1486,14 +1514,9 @@ Umożliwi również innym użytkownikom skontaktowanie się z Tobą poprzez odpo
'recentchanges-legend' => 'Opcje ostatnich zmian',
'recentchangestext' => 'Ta strona przedstawia historiÄ™ ostatnich zmian w tej wiki.',
'recentchanges-feed-description' => 'Obserwuj najświeższe zmiany w tej wiki.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 – nowa strona',
'recentchanges-label-newpage' => 'W tej edycji utworzono nowÄ… stronÄ™',
-'recentchanges-legend-minor' => '$1 – drobna zmiana',
'recentchanges-label-minor' => 'To jest drobna zmiana',
-'recentchanges-legend-bot' => '$1 – edycja bota',
'recentchanges-label-bot' => 'Ta edycja została wykonana przez bota',
-'recentchanges-legend-unpatrolled' => '$1 – niesprawdzona edycja',
'recentchanges-label-unpatrolled' => 'Ta edycja nie została jeszcze sprawdzona',
'rcnote' => "Poniżej {{PLURAL:$1|znajduje się '''1''' ostatnia zmiana wykonana|znajdują się ostatnie '''$1''' zmiany wykonane|znajduje się ostatnich '''$1''' zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniego dnia|ostatnich '''$2''' dni}}, licząc od $5 dnia $4.",
'rcnotefrom' => "Poniżej pokazano zmiany wykonane po '''$2''' (nie więcej niż '''$1''' pozycji).",
@@ -1540,6 +1563,9 @@ Strony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
'upload_directory_missing' => 'Katalog dla przesyłanych plików ($1) nie istnieje i nie może zostać utworzony przez serwer WWW.',
'upload_directory_read_only' => 'Serwer nie może zapisywać do katalogu ($1) przeznaczonego na przesyłane pliki.',
'uploaderror' => 'Błąd wysyłania',
+'upload-recreate-warning' => "'''Uwaga – plik o tej nazwie został wcześniej usunięty lub przrniesiony.'''
+
+Poniżej znajduje się rejestr usunięć i zmian nazwy tej strony:",
'uploadtext' => "Użyj poniższego formularza do przesłania plików.
Jeśli chcesz przejrzeć lub przeszukać dotychczas przesłane pliki, przejdź do [[Special:FileList|listy plików]]. Każde przesłanie zostaje odnotowane w [[Special:Log/upload|rejestrze przesyłanych plików]], a usunięcie w [[Special:Log/delete|rejestrze usuniętych]].
@@ -1573,6 +1599,17 @@ Zmień nazwę pliku i prześlij go ponownie.',
'filetype-unwanted-type' => "'''„.$1â€''' nie jest zalecanym typem pliku. Pożądane sÄ… pliki w {{PLURAL:$3|formacie|formatach}} $2.",
'filetype-banned-type' => "'''„.$1â€''' jest niedozwolonym typem pliku. Dopuszczalne sÄ… pliki w {{PLURAL:$3|formacie|formatach}} $2.",
'filetype-missing' => 'Plik nie ma rozszerzenia (np. „.jpgâ€).',
+'empty-file' => 'Przesłany przez Ciebie plik jest pusty.',
+'file-too-large' => 'Przesłany przez Ciebie plik jest zbyt duży.',
+'filename-tooshort' => 'Nazwa pliku jest zbyt krótka.',
+'filetype-banned' => 'Zabroniony format pliku.',
+'verification-error' => 'Plik nie przeszedł pozytywnie weryfikacji.',
+'hookaborted' => 'Zmiana, którą próbowałeś wykonać została przerwana przez hak rozszerzenia.',
+'illegal-filename' => 'Niedopuszczalna nazwa pliku.',
+'overwrite' => 'Nadpisanie istniejÄ…cego pliku nie jest dopuszczalne.',
+'unknown-error' => 'Wystąpił nieznany błąd.',
+'tmp-create-error' => 'BÅ‚Ä…d utworzenia pliku tymczasowego.',
+'tmp-write-error' => 'BÅ‚Ä…d zapisu pliku tymczasowego.',
'large-file' => 'Zalecane jest aby rozmiar pliku nie był większy niż {{PLURAL:$1|1 bajt|$1 bajty|$1 bajtów}}.
Plik ma rozmiar {{PLURAL:$2|1 bajt|$2 bajty|$2 bajtów}}.',
'largefileserver' => 'Plik jest większy niż maksymalny dozwolony rozmiar.',
@@ -1602,13 +1639,14 @@ Cofnij się i załaduj plik pod inną nazwą. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ten plik jest kopią {{PLURAL:$1|pliku|następujących plików:}}',
'file-deleted-duplicate' => 'Identyczny do tego plik ([[:$1]]) został wcześniej usunięty.
Sprawdź historię usunięć tamtego pliku zanim prześlesz go ponownie.',
-'successfulupload' => 'Przesłanie pliku powiodło się',
'uploadwarning' => 'Ostrzeżenie o przesyłaniu',
'uploadwarning-text' => 'Zmień poniższy opis pliku i spróbuj ponownie.',
'savefile' => 'Zapisz plik',
'uploadedimage' => 'przesłał [[$1]]',
'overwroteimage' => 'przesłano nową wersję pliku „[[$1]]“',
'uploaddisabled' => 'Przesyłanie plików wyłączone',
+'copyuploaddisabled' => 'Przesyłanie poprzez podanie adres URL jest wyłączone.',
+'uploadfromurl-queued' => 'Żądanie przesłania pliku zostało dołączone do kolejki.',
'uploaddisabledtext' => 'Możliwość przesyłania plików została wyłączona.',
'php-uploaddisabledtext' => 'PrzesyÅ‚anie plików PHP zostaÅ‚o zablokowane. Sprawdź ustawienie „file_uploadsâ€.',
'uploadscripted' => 'Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.',
@@ -1643,6 +1681,14 @@ JD # Jenoptik
MGP # Pentax
PICT # wiele różnych
#</pre> <!-- nie modyfikuj tej linii -->',
+'upload-success-subj' => 'Przesłanie pliku powiodło się',
+'upload-success-msg' => 'Przesłano plik z [$2]. Jest dostępny tutaj – [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem z przesłaniem pliku',
+'upload-failure-msg' => 'Wystąpił problem przy przesyłaniu pliku z [$2]:
+
+$1',
+'upload-warning-subj' => 'Ostrzeżenie dotyczące przesyłania',
+'upload-warning-msg' => 'Wystąpił problem z przesyłaniem z [$2]. Możesz wrócić do [[Special:Upload/stash/$1|formularza przesłania]] w celu rozwiązania tego problemu.',
'upload-proto-error' => 'Nieprawidłowy protokół',
'upload-proto-error-text' => 'Zdalne przesyłanie plików wymaga podania adresu URL zaczynającego się od <code>http://</code> lub <code>ftp://</code>.',
@@ -1707,6 +1753,7 @@ Kliknięcie w nagłówek kolumny zmienia sposób sortowania.',
'listfiles_search_for' => 'Szukaj pliku o nazwie',
'imgfile' => 'plik',
'listfiles' => 'Lista plików',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nazwa',
'listfiles_user' => 'Użytkownik',
@@ -1821,8 +1868,8 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
'statistics-edits' => 'Edycje wykonane od powstania {{GRAMMAR:D.lp|{{SITENAME}}}}',
'statistics-edits-average' => 'Åšrednia liczba edycji na stronÄ™',
'statistics-views-total' => 'Całkowita liczba odwiedzin',
+'statistics-views-total-desc' => 'Odsłony stron nieistniejących oraz specjalnych nie zostały uwzględnione.',
'statistics-views-peredit' => 'Liczba odwiedzin na edycjÄ™',
-'statistics-jobqueue' => 'Rozmiar [http://www.mediawiki.org/wiki/Manual:Job_queue kolejki zadań]',
'statistics-users' => 'Zarejestrowanych [[Special:ListUsers|użytkowników]]',
'statistics-users-active' => 'Aktywnych użytkowników',
'statistics-users-active-desc' => 'Użytkownicy, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}',
@@ -1837,7 +1884,7 @@ Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany p
'doubleredirects' => 'Podwójne przekierowania',
'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.
-<s>Skreślenie</s> oznacza naprawienie przekierowania.',
+<del>Skreślenie</del> oznacza naprawienie przekierowania.',
'double-redirect-fixed-move' => 'Naprawa podwójnego przekierowania [[$1]] → [[$2]]',
'double-redirect-fixer' => 'Naprawiacz przekierowań',
@@ -1860,6 +1907,8 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
'nmembers' => '$1 {{PLURAL:$1|element|elementy|elementów}}',
'nrevisions' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
'nviews' => 'odwiedzono $1 {{PLURAL:$1|raz|razy}}',
+'nimagelinks' => 'Używane na $1 {{PLURAL:$1|stronie|stronach}}',
+'ntransclusions' => 'używany na $1 {{PLURAL:$1|stronie|stronach}}',
'specialpage-empty' => 'Ta strona raportu jest pusta.',
'lonelypages' => 'Porzucone strony',
'lonelypagestext' => 'Do poniższych stron nie linkuje żadna inna strona lub nie są one dołączone do innych stron w {{GRAMMAR:MS.lp|{{SITENAME}}}}.',
@@ -2016,34 +2065,40 @@ Sprawdź stronę z [[{{MediaWiki:Listgrouprights-helppage}}|dodatkowymi informac
'listgrouprights-removegroup-self-all' => 'Może usunąć własne konto ze wszystkich grup',
# E-mail user
-'mailnologin' => 'Brak adresu',
-'mailnologintext' => 'Musisz siÄ™ [[Special:UserLogin|zalogować]] i mieć wpisany aktualny adres eâ€mailowy w swoich [[Special:Preferences|preferencjach]], aby móc wysÅ‚ać eâ€mail do innego użytkownika.',
-'emailuser' => 'WyÅ›lij eâ€mail do tego użytkownika',
-'emailpage' => 'WyÅ›lij eâ€mail do użytkownika',
-'emailpagetext' => 'Możesz użyć poniższego formularza, aby wysÅ‚ać wiadomość eâ€mail do tego użytkownika.
+'mailnologin' => 'Brak adresu',
+'mailnologintext' => 'Musisz siÄ™ [[Special:UserLogin|zalogować]] i mieć wpisany aktualny adres eâ€mailowy w swoich [[Special:Preferences|preferencjach]], aby móc wysÅ‚ać eâ€mail do innego użytkownika.',
+'emailuser' => 'WyÅ›lij eâ€mail do tego użytkownika',
+'emailpage' => 'WyÅ›lij eâ€mail do użytkownika',
+'emailpagetext' => 'Możesz użyć poniższego formularza, aby wysÅ‚ać wiadomość eâ€mail do tego użytkownika.
Adres eâ€mailowy, który zostaÅ‚ przez Ciebie wprowadzony w [[Special:Preferences|Twoich preferencjach]], zostanie umieszczony w polu „Odâ€, dziÄ™ki czemu odbiorca bÄ™dzie mógÅ‚ Ci odpowiedzieć.',
-'usermailererror' => 'Moduł obsługi poczty zwrócił błąd:',
-'defemailsubject' => 'Wiadomość z {{GRAMMAR:D.lp|{{SITENAME}}}}',
-'noemailtitle' => 'Brak adresu eâ€mail',
-'noemailtext' => 'Ten użytkownik nie podaÅ‚ poprawnego adresu eâ€mail.',
-'nowikiemailtitle' => 'Brak zezwolenia na otrzymywanie eâ€maili',
-'nowikiemailtext' => 'Ten użytkownik nie chce otrzymywać wiadomoÅ›ci eâ€mail od innych użytkowników.',
-'email-legend' => 'WyÅ›lij eâ€mail do innego użytkownika {{GRAMMAR:D.lp|{{SITENAME}}}}',
-'emailfrom' => 'Od',
-'emailto' => 'Do',
-'emailsubject' => 'Temat',
-'emailmessage' => 'Wiadomość',
-'emailsend' => 'Wyślij',
-'emailccme' => 'Wyślij mi kopię mojej wiadomości.',
-'emailccsubject' => 'Kopia Twojej wiadomości do $1: $2',
-'emailsent' => 'Wiadomość została wysłana',
-'emailsenttext' => 'Twoja wiadomość została wysłana.',
-'emailuserfooter' => 'Wiadomość eâ€mail zostaÅ‚a wysÅ‚ana z {{GRAMMAR:D.lp|{{SITENAME}}}} do $2 przez $1 z użyciem „WyÅ›lij eâ€mail do tego użytkownikaâ€.',
+'usermailererror' => 'Moduł obsługi poczty zwrócił błąd:',
+'defemailsubject' => 'Wiadomość z {{GRAMMAR:D.lp|{{SITENAME}}}}',
+'usermaildisabled' => 'Eâ€mail użytkownika jest wyÅ‚Ä…czony',
+'usermaildisabledtext' => 'Nie możesz wysyÅ‚ać eâ€maili do innych użytkowników tej wiki',
+'noemailtitle' => 'Brak adresu eâ€mail',
+'noemailtext' => 'Ten użytkownik nie podaÅ‚ poprawnego adresu eâ€mail.',
+'nowikiemailtitle' => 'Brak zezwolenia na otrzymywanie eâ€maili',
+'nowikiemailtext' => 'Ten użytkownik nie chce otrzymywać wiadomoÅ›ci eâ€mail od innych użytkowników.',
+'email-legend' => 'WyÅ›lij eâ€mail do innego użytkownika {{GRAMMAR:D.lp|{{SITENAME}}}}',
+'emailfrom' => 'Od',
+'emailto' => 'Do',
+'emailsubject' => 'Temat',
+'emailmessage' => 'Wiadomość',
+'emailsend' => 'Wyślij',
+'emailccme' => 'Wyślij mi kopię mojej wiadomości.',
+'emailccsubject' => 'Kopia Twojej wiadomości do $1: $2',
+'emailsent' => 'Wiadomość została wysłana',
+'emailsenttext' => 'Twoja wiadomość została wysłana.',
+'emailuserfooter' => 'Wiadomość eâ€mail zostaÅ‚a wysÅ‚ana z {{GRAMMAR:D.lp|{{SITENAME}}}} do $2 przez $1 z użyciem „WyÅ›lij eâ€mail do tego użytkownikaâ€.',
+
+# User Messenger
+'usermessage-summary' => 'Pozostawianie komunikatu systemowego.',
+'usermessage-editor' => 'Nadawca komunikatów systemowych',
# Watchlist
'watchlist' => 'Obserwowane',
'mywatchlist' => 'Obserwowane',
-'watchlistfor' => "(raport dla użytkownika '''$1''')",
+'watchlistfor2' => 'Dla $1 $2',
'nowatchlist' => 'Lista obserwowanych przez Ciebie stron jest pusta.',
'watchlistanontext' => '$1, aby obejrzeć lub edytować elementy listy obserwowanych.',
'watchnologin' => 'Nie jesteÅ› zalogowany',
@@ -2100,8 +2155,6 @@ wiki – $PAGEEDITOR_WIKI
W przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony.
Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.
-$NEWPAGE
-
Wiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}
--
@@ -2164,7 +2217,10 @@ Autorem ostatniej zmiany jest teraz [[User:$3|$3]] ([[User talk:$3|dyskusja]]{{i
'revertpage-nouser' => 'Wycofano edycje (nazwa użytkownika usunięta). Autor przywróconej wersji to [[User:$1|$1]].',
'rollback-success' => 'Wycofano edycje użytkownika $1.
Przywrócono ostatnią wersję autorstwa $2.',
-'sessionfailure' => 'Wystąpił problem z weryfikacją zalogowania.
+
+# Edit tokens
+'sessionfailure-title' => 'BÅ‚Ä…d sesji',
+'sessionfailure' => 'Wystąpił problem z weryfikacją zalogowania.
Polecenie zostało anulowane, aby uniknąć przechwycenia sesji.
Naciśnij „wstecz†w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.',
@@ -2298,18 +2354,22 @@ $1',
'month' => 'Do miesiąca (włącznie)',
'year' => 'Do roku (włącznie)',
-'sp-contributions-newbies' => 'Pokaż wyłącznie wkład nowych użytkowników',
-'sp-contributions-newbies-sub' => 'Dla nowych użytkowników',
-'sp-contributions-newbies-title' => 'Wkład nowych użytkowników',
-'sp-contributions-blocklog' => 'blokady',
-'sp-contributions-deleted' => 'usunięty wkład użytkownika',
-'sp-contributions-logs' => 'rejestry',
-'sp-contributions-talk' => 'dyskusja',
-'sp-contributions-userrights' => 'zarządzanie uprawnieniami użytkownika',
-'sp-contributions-blocked-notice' => 'To konto użytkownika jest obecnie zablokowane. Ostatni wpis rejestru blokad jest pokazany poniżej.',
-'sp-contributions-search' => 'Szukaj wkładu',
-'sp-contributions-username' => 'Adres IP lub nazwa użytkownika',
-'sp-contributions-submit' => 'Szukaj',
+'sp-contributions-newbies' => 'Pokaż wyłącznie wkład nowych użytkowników',
+'sp-contributions-newbies-sub' => 'Dla nowych użytkowników',
+'sp-contributions-newbies-title' => 'Wkład nowych użytkowników',
+'sp-contributions-blocklog' => 'blokady',
+'sp-contributions-deleted' => 'usunięty wkład użytkownika',
+'sp-contributions-uploads' => 'przesłane pliki',
+'sp-contributions-logs' => 'rejestry',
+'sp-contributions-talk' => 'dyskusja',
+'sp-contributions-userrights' => 'zarządzanie uprawnieniami użytkownika',
+'sp-contributions-blocked-notice' => 'To konto użytkownika jest obecnie zablokowane. Ostatni wpis rejestru blokad jest pokazany poniżej.',
+'sp-contributions-blocked-notice-anon' => 'Ten adres IP jest obecnie zablokowany.
+Poniżej znajduje się ostatni wpis w rejestrze blokowania.',
+'sp-contributions-search' => 'Szukaj wkładu',
+'sp-contributions-username' => 'Adres IP lub nazwa użytkownika',
+'sp-contributions-toponly' => 'Pokaż wyłącznie ostatnie wersje',
+'sp-contributions-submit' => 'Szukaj',
# What links here
'whatlinkshere' => 'LinkujÄ…ce',
@@ -2372,7 +2432,6 @@ Przejdź do [[Special:IPBlockList|listy zablokowanych adresów IP]], by przejrze
'ipb-edit-dropdown' => 'Edytuj listÄ™ przyczyn blokady',
'ipb-unblock-addr' => 'Odblokuj $1',
'ipb-unblock' => 'Odblokuj użytkownika lub adres IP',
-'ipb-blocklist-addr' => 'IstniejÄ…ce blokady dla $1',
'ipb-blocklist' => 'Zobacz istniejÄ…ce blokady',
'ipb-blocklist-contribs' => 'Wkład $1',
'unblockip' => 'Odblokuj użytkownika',
@@ -2445,6 +2504,8 @@ O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dost
Nie możesz utworzyć konta',
'cant-block-while-blocked' => 'Nie możesz zablokować innych użytkowników, kiedy sam jesteś zablokowany.',
'cant-see-hidden-user' => 'Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.',
+'ipbblocked' => 'Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany',
+'ipbnounblockself' => 'Nie możesz odblokować samego siebie',
# Developer tools
'lockdb' => 'Zablokuj bazÄ™ danych',
@@ -2481,6 +2542,17 @@ To oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić,
'''UWAGA!'''
Może to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.
Upewnij siÄ™ co do konsekwencji tej operacji, zanim siÄ™ na niÄ… zdecydujesz.",
+'movepagetext-noredirectfixer' => "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.
+Pod starym tytułem zostanie umieszczona strona przekierowująca.
+Upewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].
+Jesteś odpowiedzialny za to, by linki w dalszym ciągu pokazywały tam, gdzie powinny.
+
+Strona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.
+To oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.
+
+'''UWAGA!'''
+Może to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.
+Upewnij siÄ™ co do konsekwencji tej operacji, zanim siÄ™ na niÄ… zdecydujesz.",
'movepagetalktext' => 'Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:
*niepusta strona dyskusji już jest pod nową nazwą
*usuniesz zaznaczenie z poniższego pola wyboru
@@ -2537,6 +2609,7 @@ Strony nie można przenieść na nią samą.',
'immobile-source-page' => 'Tej strony nie można przenieść.',
'immobile-target-page' => 'Nie można przenieść pod wskazany tytuł.',
'imagenocrossnamespace' => 'Nie można przenieść grafiki do przestrzeni nazw nie przeznaczonej dla grafik',
+'nonfile-cannot-move-to-file' => 'Nie można przenieść obiektu nie będącego plikiem do przestrzeni nazw „{{ns:file}}“',
'imagetypemismatch' => 'Nowe rozszerzenie nazwy pliku jest innego typu niż zawartość',
'imageinvalidfilename' => 'Nazwa pliku docelowego jest nieprawidłowa',
'fix-double-redirects' => 'Zaktualizuj wszystkie przekierowania wskazujące na stary tytuł',
@@ -2617,6 +2690,7 @@ Zapisz go na swoim dysku, a następnie prześlij go tutaj.',
'importstart' => 'Trwa importowanie stron...',
'import-revision-count' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
'importnopages' => 'Brak stron do importu.',
+'imported-log-entries' => 'Zaimportowano $1 {{PLURAL:$1|wpis|wpisy|wpisów}} rejestru.',
'importfailed' => 'Import nie powiódł się: $1',
'importunknownsource' => 'Nieznany format importowanych danych',
'importcantopen' => 'Nie można otworzyć importowanego pliku',
@@ -2711,6 +2785,8 @@ Brak katalogu dla plików tymczasowych.',
'tooltip-rollback' => '„cofnij†jednym kliknięciem wycofuje wszystkie zmiany tej strony wykonane przez ostatniego edytującego.',
'tooltip-undo' => '„anuluj edycję†wycofuje tę edycję i otwiera okno edycji w trybie podglądu.
Pozwala na wpisanie powodu w opisie zmian.',
+'tooltip-preferences-save' => 'Zapisz preferencje',
+'tooltip-summary' => 'Wpisz krótki opis',
# Stylesheets
'common.css' => '/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */',
@@ -2843,14 +2919,17 @@ Jeśli go otworzysz, możesz zarazić swój system.",
'imagemaxsize' => "Ograniczenie wielkości obrazków<br />''(na stronach opisu plików)''",
'thumbsize' => 'Rozmiar miniaturki',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|strona|strony|stron}}',
-'file-info' => '(rozmiar pliku: $1, typ MIME: $2)',
-'file-info-size' => '($1 × $2 pikseli, rozmiar pliku: $3, typ MIME: $4)',
+'file-info' => 'rozmiar pliku: $1, typ MIME: $2',
+'file-info-size' => '$1 × $2 pikseli, rozmiar pliku: $3, typ MIME: $4',
'file-nohires' => '<small>Grafika w wyższej rozdzielczości jest niedostępna.</small>',
-'svg-long-desc' => '(Plik SVG, nominalnie $1 × $2 pikseli, rozmiar pliku: $3)',
+'svg-long-desc' => 'Plik SVG, nominalnie $1 × $2 pikseli, rozmiar pliku: $3',
'show-big-image' => 'Pełna rozdzielczość',
'show-big-image-thumb' => '<small>Rozmiar podglądu: $1 × $2 pikseli</small>',
'file-info-gif-looped' => 'zapętlony',
'file-info-gif-frames' => '$1 {{PLURAL:$1|klatka|klatki|klatek}}',
+'file-info-png-looped' => 'zapętlony',
+'file-info-png-repeat' => 'powtarzany $1 {{PLURAL:$1|raz|razy}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|klatka|klatki|klatek}}',
# Special:NewFiles
'newimages' => 'Najnowsze pliki',
@@ -3013,6 +3092,7 @@ Pozostałe pola zostaną domyślnie ukryte.
'exif-gpsareainformation' => 'Nazwa przestrzeni GPS',
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Korekcja różnicy GPS',
+'exif-objectname' => 'Krótki tytuł',
# EXIF attributes
'exif-compression-1' => 'nieskompresowany',
@@ -3175,30 +3255,30 @@ Pozostałe pola zostaną domyślnie ukryte.
'limitall' => 'wszystkie',
# E-mail address confirmation
-'confirmemail' => 'Potwierdzanie adresu eâ€mail',
-'confirmemail_noemail' => 'Nie {{GENDER:|podaÅ‚eÅ›|podaÅ‚aÅ›}} prawidÅ‚owego adresu eâ€mail w [[Special:Preferences|preferencjach]].',
-'confirmemail_text' => 'Projekt {{SITENAME}} wymaga weryfikacji adresu eâ€mail przed użyciem funkcji korzystajÄ…cych z poczty.
+'confirmemail' => 'Potwierdzanie adresu eâ€mail',
+'confirmemail_noemail' => 'Nie {{GENDER:|podaÅ‚eÅ›|podaÅ‚aÅ›}} prawidÅ‚owego adresu eâ€mail w [[Special:Preferences|preferencjach]].',
+'confirmemail_text' => 'Projekt {{SITENAME}} wymaga weryfikacji adresu eâ€mail przed użyciem funkcji korzystajÄ…cych z poczty.
Wciśnij przycisk poniżej aby wysłać na swój adres list z linkiem do strony WWW.
List będzie zawierał link do strony, w którym zakodowany będzie identyfikator.
Otwórz ten link w przeglÄ…darce, czym potwierdzisz, że jesteÅ› użytkownikiem tego adresu eâ€mail.',
-'confirmemail_pending' => 'Kod potwierdzenia zostaÅ‚ wÅ‚aÅ›nie do Ciebie wysÅ‚any. JeÅ›li zarejestrowaÅ‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} siÄ™ niedawno, poczekaj kilka minut na dostarczenie wiadomoÅ›ci przed kolejnÄ… proÅ›bÄ… o wysÅ‚anie kodu.',
-'confirmemail_send' => 'Wyślij kod potwierdzenia',
-'confirmemail_sent' => 'Wiadomość eâ€mail z kodem uwierzytelniajÄ…cym zostaÅ‚a wysÅ‚ana.',
-'confirmemail_oncreate' => 'Link z kodem potwierdzenia zostaÅ‚ wysÅ‚any na Twój adres eâ€mail.
+'confirmemail_pending' => 'Kod potwierdzenia zostaÅ‚ wÅ‚aÅ›nie do Ciebie wysÅ‚any. JeÅ›li zarejestrowaÅ‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} siÄ™ niedawno, poczekaj kilka minut na dostarczenie wiadomoÅ›ci przed kolejnÄ… proÅ›bÄ… o wysÅ‚anie kodu.',
+'confirmemail_send' => 'Wyślij kod potwierdzenia',
+'confirmemail_sent' => 'Wiadomość eâ€mail z kodem uwierzytelniajÄ…cym zostaÅ‚a wysÅ‚ana.',
+'confirmemail_oncreate' => 'Link z kodem potwierdzenia zostaÅ‚ wysÅ‚any na Twój adres eâ€mail.
Kod ten nie jest wymagany do zalogowania siÄ™, jednak bÄ™dziesz musiaÅ‚ go aktywować otwierajÄ…c, otrzymany link, w przeglÄ…darce przed wÅ‚Ä…czeniem niektórych opcji eâ€mail na wiki.',
-'confirmemail_sendfailed' => 'Nie udaÅ‚o siÄ™ wysÅ‚ać potwierdzajÄ…cej wiadomoÅ›ci eâ€mail.
+'confirmemail_sendfailed' => 'Nie udaÅ‚o siÄ™ wysÅ‚ać potwierdzajÄ…cej wiadomoÅ›ci eâ€mail.
Sprawdź poprawność adresu pod kątem literówki.
System pocztowy zwrócił komunikat: $1',
-'confirmemail_invalid' => 'Błędny kod potwierdzenia.
+'confirmemail_invalid' => 'Błędny kod potwierdzenia.
Kod może być przedawniony.',
-'confirmemail_needlogin' => 'Musisz $1 aby potwierdzić adres email.',
-'confirmemail_success' => 'Adres eâ€mail zostaÅ‚ potwierdzony.
+'confirmemail_needlogin' => 'Musisz $1 aby potwierdzić adres email.',
+'confirmemail_success' => 'Adres eâ€mail zostaÅ‚ potwierdzony.
Możesz [[Special:UserLogin|zalogować się]] i korzystać z szerszego wachlarza funkcji wiki.',
-'confirmemail_loggedin' => 'Twój adres email został zweryfikowany.',
-'confirmemail_error' => 'Pojawiły się błędy przy zapisywaniu potwierdzenia.',
-'confirmemail_subject' => '{{SITENAME}} – weryfikacja adresu eâ€mail',
-'confirmemail_body' => 'KtoÅ› Å‚Ä…czÄ…c siÄ™ z komputera o adresie IP $1
+'confirmemail_loggedin' => 'Twój adres email został zweryfikowany.',
+'confirmemail_error' => 'Pojawiły się błędy przy zapisywaniu potwierdzenia.',
+'confirmemail_subject' => '{{SITENAME}} – weryfikacja adresu eâ€mail',
+'confirmemail_body' => 'KtoÅ› Å‚Ä…czÄ…c siÄ™ z komputera o adresie IP $1
zarejestrowaÅ‚ w {{GRAMMAR:MS.lp|{{SITENAME}}}} konto „$2†podajÄ…c niniejszy adres eâ€mail.
Aby potwierdzić, że to Ty {{GENDER:|zarejestrowałeś|zarejestrowałaś}} to konto oraz, aby włączyć
@@ -3213,8 +3293,36 @@ poniższy link, aby anulować potwierdzenie adresu eâ€mail:
$5
Kod zawarty w linku straci ważność $4.',
-'confirmemail_invalidated' => 'Potwierdzenie adresu eâ€mail zostaÅ‚o anulowane',
-'invalidateemail' => 'Anulowanie potwierdzenia adresu eâ€mail',
+'confirmemail_body_changed' => 'KtoÅ› Å‚Ä…czÄ…c siÄ™ z komputera o adresie IP $1
+zmieniÅ‚ w {{GRAMMAR:MS.lp|{{SITENAME}}}} ustawiony dla konta „$2†adres eâ€mail na ten wÅ‚aÅ›nie.
+
+Aby potwierdzić, że to Ty {{GENDER:|zmieniłeś|zmieniłaś}} adres otwórz w swojej
+przeglÄ…darce ten link:
+
+$3
+
+Jeśli *nie* jest to Twoje konto, otwórz w swojej przeglądarce
+poniższy link, aby anulować potwierdzenie adresu eâ€mail:
+
+$5
+
+Kod zawarty w linku straci ważność $4.',
+'confirmemail_body_set' => 'KtoÅ› Å‚Ä…czÄ…c siÄ™ z komputera o adresie IP $1
+ustawiÅ‚ w {{GRAMMAR:MS.lp|{{SITENAME}}}} dla konta „$2†adres eâ€mail na ten wÅ‚aÅ›nie.
+
+Aby potwierdzić, że to Ty {{GENDER:|ustawiłeś|ustawiłaś}} adres otwórz w swojej
+przeglÄ…darce ten link:
+
+$3
+
+Jeśli *nie* jest to Twoje konto, otwórz w swojej przeglądarce
+poniższy link, aby anulować potwierdzenie adresu eâ€mail:
+
+$5
+
+Kod zawarty w linku straci ważność $4.',
+'confirmemail_invalidated' => 'Potwierdzenie adresu eâ€mail zostaÅ‚o anulowane',
+'invalidateemail' => 'Anulowanie potwierdzenia adresu eâ€mail',
# Scary transclusion
'scarytranscludedisabled' => '[Transkluzja przez interwiki jest wyłączona]',
@@ -3258,6 +3366,7 @@ Czy na pewno chcesz ją ponownie utworzyć?",
'table_pager_first' => 'Pierwsza strona',
'table_pager_last' => 'Ostatnia strona',
'table_pager_limit' => 'Pokaż $1 pozycji na stronie',
+'table_pager_limit_label' => 'Pozycji na stronie',
'table_pager_limit_submit' => 'Pokaż',
'table_pager_empty' => 'Brak wyników',
@@ -3358,6 +3467,7 @@ Możesz także użyć [[Special:Watchlist/edit|standardowego edytora obserwowany
'version-specialpages' => 'Strony specjalne',
'version-parserhooks' => 'Haki analizatora składni (ang. parser hooks)',
'version-variables' => 'Zmienne',
+'version-skins' => 'Skórki',
'version-other' => 'Pozostałe',
'version-mediahandlers' => 'Wtyczki obsługi mediów',
'version-hooks' => 'Haki (ang. hooks)',
@@ -3369,6 +3479,13 @@ Możesz także użyć [[Special:Watchlist/edit|standardowego edytora obserwowany
'version-hook-subscribedby' => 'Zapotrzebowany przez',
'version-version' => '(Wersja $1)',
'version-license' => 'Licencja',
+'version-poweredby-credits' => "To wiki korzysta z oprogramowania '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001â€$1 $2.",
+'version-poweredby-others' => 'inni',
+'version-license-info' => 'MediaWiki jest wolnym oprogramowaniem – możesz je dystrybuować i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (jeśli wolisz) dowolnej późniejszej.
+
+MediaWiki jest dystrybuowane w nadziei, że okaże się użyteczne ale BEZ JAKIEJKOLWIEK GWARANCJI – nawet bez domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ lub PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. Więcej szczegółów znajdziesz w treści licencji GNU General Public License.
+
+Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU General Public License] wraz z niniejszym oprogramowaniem. Jeśli tak się nie stało, napisz do Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor , Boston, MA 02110-1301, USA lub [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html przeczytaj licencję w Internecie].',
'version-software' => 'Zainstalowane oprogramowanie',
'version-software-product' => 'Nazwa',
'version-software-version' => 'Wersja',
@@ -3439,6 +3556,15 @@ Wpisz nazwÄ™ pliku z pominiÄ™ciem prefiksu „{{ns:file}}:â€.',
'tags-edit' => 'edytuj',
'tags-hitcount' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
+# Special:ComparePages
+'comparepages' => 'Porównanie stron',
+'compare-selector' => 'Porównanie wersji stron',
+'compare-page1' => 'Strona 1',
+'compare-page2' => 'Strona 2',
+'compare-rev1' => 'Wersja 1',
+'compare-rev2' => 'Wersja 2',
+'compare-submit' => 'Porównaj',
+
# Database error messages
'dberr-header' => 'Ta wiki nie działa poprawnie',
'dberr-problems' => 'Przepraszamy! Witryna ma problemy techniczne.',
@@ -3455,8 +3581,13 @@ Wpisz nazwÄ™ pliku z pominiÄ™ciem prefiksu „{{ns:file}}:â€.',
'htmlform-float-invalid' => 'Podana wartość nie jest liczbą.',
'htmlform-int-toolow' => 'Podana wartość jest poniżej dopuszczalnego minimum $1',
'htmlform-int-toohigh' => 'Podana wartość jest powyżej dopuszczalnego maximum $1',
+'htmlform-required' => 'Podanie tej wartości jest wymagane',
'htmlform-submit' => 'Zapisz',
'htmlform-reset' => 'Cofnij zmiany',
'htmlform-selectorother-other' => 'Inne',
+# SQLite database support
+'sqlite-has-fts' => '$1 ze wsparciem pełnotekstowego wyszukiwania',
+'sqlite-no-fts' => '$1 bez wsparcia pełnotekstowego wyszukiwania',
+
);
diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php
index ff1e3fbb..56d1d273 100644
--- a/languages/messages/MessagesPms.php
+++ b/languages/messages/MessagesPms.php
@@ -12,6 +12,7 @@
* @author Dragonòt
* @author SabineCretella
* @author Teak
+ * @author The Evil IP address
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>, Jens Frank
* @author לערי ריינה×רט
*/
@@ -54,8 +55,7 @@ dj'artìcoj ancó pa scrit",
'tog-editsection' => "Abìlita la modìfica dle session con j'anliure [modìfica]",
'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima<br /> al tìtol col tast drit dël rat (a-i va Javascript)',
'tog-showtoc' => "Buta le tàole dij contnù<br />(për j'artìcoj che l'han pì che 3 session)",
-'tog-rememberpassword' => "Vis-te la ciav<br />(nen mach për na session<br />- a l'ha da manca dij cookies)",
-'tog-editwidth' => 'Slarga al màssim ël quàder ëd modìfica',
+'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di|di}})",
'tog-watchcreations' => 'Gionta le pàgine che i creo mi a la lista ëd lòn che im ten-o sot euj',
'tog-watchdefault' => "Gionta le pàgine che i modìfico mi a la lista dle ròbe ch'i ten-o sot-euj",
'tog-watchmoves' => 'Gionta le pàgine che i tramudo a lòn che im ten-o sot euj',
@@ -201,31 +201,21 @@ dj'artìcoj ancó pa scrit",
'faqpage' => 'Project:Soèns An Ciamo',
# Vector skin
-'vector-action-addsection' => 'Gionta argoment',
-'vector-action-delete' => 'Scancela',
-'vector-action-move' => 'Tramuda',
-'vector-action-protect' => 'Protegg',
-'vector-action-undelete' => 'Arcùpera',
-'vector-action-unprotect' => 'Sprotegg',
-'vector-namespace-category' => 'Categorìa',
-'vector-namespace-help' => "Pàgina d'agiut",
-'vector-namespace-image' => 'Archivi',
-'vector-namespace-main' => 'Pàgina',
-'vector-namespace-media' => 'Pàgina con mojen',
-'vector-namespace-mediawiki' => 'Mëssagi',
-'vector-namespace-project' => 'Pàgina ëd proget',
-'vector-namespace-special' => 'Pàgina special',
-'vector-namespace-talk' => 'Discussion',
-'vector-namespace-template' => 'Stamp',
-'vector-namespace-user' => 'Pàgina utent',
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Modìfica',
-'vector-view-history' => 'Varda stòria',
-'vector-view-view' => 'Les',
-'vector-view-viewsource' => 'Varda sorgiss',
-'actions' => 'Assion',
-'namespaces' => 'Spassi nominaj',
-'variants' => 'Variant',
+'vector-action-addsection' => 'Gionta argoment',
+'vector-action-delete' => 'Scancela',
+'vector-action-move' => 'Tramuda',
+'vector-action-protect' => 'Protegg',
+'vector-action-undelete' => 'Arcùpera',
+'vector-action-unprotect' => 'Sprotegg',
+'vector-simplesearch-preference' => "Abilité ij sugeriment d'arserca ameliorà (mach për la pel Vector)",
+'vector-view-create' => 'Crea',
+'vector-view-edit' => 'Modìfica',
+'vector-view-history' => 'Varda stòria',
+'vector-view-view' => 'Les',
+'vector-view-viewsource' => 'Varda sorgiss',
+'actions' => 'Assion',
+'namespaces' => 'Spassi nominaj',
+'variants' => 'Variant',
'errorpagetitle' => 'Eror',
'returnto' => 'Torna andré a $1.',
@@ -286,6 +276,9 @@ Tròpi utent a son an camin ch'a preuvo a lese sta pàgina-sì.
Për piasì, speta un pòch prima ëd prové torna a vardé sta pàgina-sì.
$1",
+'pool-timeout' => "Ël temp a l'é finì antramentre ch'a së spetava la saradura",
+'pool-queuefull' => "La coa ëd travaj a l'é pien-a",
+'pool-errorunknown' => 'Eror pa conossù',
# 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' => 'A propòsit ëd {{SITENAME}}',
@@ -447,7 +440,8 @@ Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENA
'yourname' => 'Sò stranòm',
'yourpassword' => 'Soa ciav',
'yourpasswordagain' => 'Che a bata torna soa ciav',
-'remembermypassword' => "Vis-te mia ciav për vàire session (për podèj felo a fa da manca che un a l'abia ij ''cookies'' abilità).",
+'remembermypassword' => "Vis-te mia ciav ansima a st'ordinator-sì (për al pi $1 {{PLURAL:$1|di|di}})",
+'securelogin-stick-https' => "Resté colegà an HTTPS apress d'esse intrà ant ël sistema",
'yourdomainname' => 'Sò domini',
'externaldberror' => "Ò che a l'é rivaje n'eror d'autenticassion esterna, ò pura a l'é chiel (chila) che a l'é nen autorisà a agiornesse sò cont estern.",
'login' => 'Rintré ant ël sistema',
@@ -464,6 +458,7 @@ Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENA
'gotaccount' => "Ha-lo già un sò cont? '''$1'''.",
'gotaccountlink' => 'Rintré ant ël sistema',
'createaccountmail' => 'për pòsta eletrònica',
+'createaccountreason' => 'Rason:',
'badretype' => "Le doe ciav che a l'ha scrivù a resto diferente antra lor, e a venta che a sio mideme.",
'userexists' => "Lë stranòm anserì a l'é già dovrà.
Për piasì, sern në stranòm diferent.",
@@ -486,6 +481,7 @@ Controla ël nòm che it l\'has batù, o [[Special:UserLogin/signup|fà un neuv
'wrongpasswordempty' => "A l'ha butà na ciav veujda. Për piasì, che a preuva torna.",
'passwordtooshort' => 'Le ciav a devo avèj almanch {{PLURAL:$1|1 caràter|$1 caràter}}.',
'password-name-match' => 'Toa ciav a deuv esse diferenta da tò stranòm.',
+'password-login-forbidden' => "L'usagi dë sto nòm utent e ciav a son ëstàit vietà.",
'mailmypassword' => 'Mandme na neuva ciav për pòsta eletrònica',
'passwordremindertitle' => 'Servissi për visé la paròla ciav ëd {{SITENAME}}',
'passwordremindertext' => "Cheidun (a l'é belfé che a sia stàit pròpe chiel, da 'nt l'adrëssa IP \$1) a l'ha ciamà che i-j mandèisso
@@ -526,6 +522,9 @@ Për piasì speta prima ëd prové torna.",
'loginlanguagelabel' => 'Lenga: $1',
'suspicious-userlogout' => "Soa arcesta ëd seurte dal sistema a l'é stàita arfudà përchè a smija com s'a fussa stàita mandà da 'n navigador scolegà o da l'archiviassion an local d'un proxy.",
+# E-mail sending
+'php-mail-error-unknown' => 'Eror pa conossù ant la funsion PHP mail()',
+
# Password reset dialog
'resetpass' => 'Cambia la ciav',
'resetpass_announce' => "A l'é rintrà ant ël sistema con na ciav provisòria mandà via për pòsta eletrònica. Për podèj finì la procedura a l'ha da butesse na ciav neuva ambelessì:",
@@ -577,9 +576,11 @@ Miraco it l'has già cambià la ciav o it l'has ciamà na neuva ciav a temp.",
'showlivepreview' => "Funsion ''Preuva dal viv''",
'showdiff' => 'Smon-me le modìfiche',
'anoneditwarning' => "A l'é ancó nen rintrà ant ël sistema. Soa adrëssa IP a sarà registrà ant la stòria dle modìfiche dë sta pàgina-sì.",
+'anonpreviewwarning' => "''It ses pa intrà. An salvand a sarà memorisà toa adrëssa IP ant la stòria dle modìfiche dë sta pàgina-sì.''",
'missingsummary' => "'''Nòta:''' a l'ha pa butà gnun somari dla modìfica. Se a sgnaca Salva n'àutra vira, soa modìfica a resterà salvà sensa pa ëd somari.",
'missingcommenttext' => 'Për piasì che a buta un coment ambelessì sota.',
-'missingcommentheader' => "'''A l'euj!:''' ës coment-sì a l'é sensa intestassion. Se a sgnaca torna \"Salva sta pàgina\" soa modìfica a sarà salvà sensa gnun-a intestassion.",
+'missingcommentheader' => "'''Ch'a arcòrda:''' A l'ha pa dàit soget o intestassion për sto coment-sì.
+Se a sgnaca torna \"{{int:savearticle}}\", soa modìfica a sarà salvà sensa gnun-a intestassion.",
'summary-preview' => "Preuva dl'oget:",
'subject-preview' => "Preuva d'oget/intestassion:",
'blockedtitle' => "Belavans cost ëstranòm-sì a resta col ëd n'utent che a l'é stàit disabilità a fé 'd modìfiche a j'artìcoj.",
@@ -652,7 +653,11 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
'usercsspreview' => "'''Che a varda che lòn che a s-ciàira a l'é nomach na preuva ëd sò CSS.'''
'''A l'é ancó nen stàit salvà!'''",
'userjspreview' => "'''Che as visa che a l'é mach antramentr che as fa na preuva ëd sò Javascript, che a l'é ancó pa stàit salvà!'''",
-'userinvalidcssjstitle' => "'''Avis:''' A-i é pa gnun-a pel \"\$1\". Che as visa che le pàgine .css e .js che un as fa daspërchiel a deuvro tute minùscole për tìtol, pr'esempi {{ns:user}}:Scaramacaj/monobook.css nopà che {{ns:user}}:Scaramacaj/Monobook.css.",
+'sitecsspreview' => "'''Che a varda che a l'é mach an mente ch'a preuva sto CSS.'''
+'''A l'é ancó pa stàit salvà!'''",
+'sitejspreview' => "'''Che a varda che a l'é mach an mente ch'a preuva sto còdes JavaScript.'''
+'''A l'é ancó pa stàit salvà!'''",
+'userinvalidcssjstitle' => "'''Avis:''' A-i é pa gnun-a pel \"\$1\". Che as visa che le pàgine .css e .js che un as fa daspërchiel a deuvro tute minùscole për tìtol, pr'esempi {{ns:user}}:Scaramacaj/vector.css nopà che {{ns:user}}:Scaramacaj/Vector.css.",
'updated' => '(Agiornà)',
'note' => "'''NÃ’TA:'''",
'previewnote' => "'''Che a ten-a mach present che costa-sì a l'é nomach na PREUVA, e che soa version a l'é ancó pa stàita salvà!'''",
@@ -688,10 +693,6 @@ Se a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa p
'copyrightwarning2' => "Për piasì, che a ten-a present che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da dj'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.<br />
Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel (ò daspërchila), ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion).
'''CHE A MANDA PA DËL MATERIAL COATÀ DA DRIT D'AUTOR SENSA AVÈJ AVÙ ËL PËRMESS SCRIT DË FELO!'''",
-'longpagewarning' => "'''CHE A TEN-A PRESENT!: Sta pàgina-sì a l'é longa $1 kb; chèich
-programa ëd navigassion a podrìa avèj dle gran-e a modifiché dle pàgine che a-j rivo a brus
-ò pura a passo ij 32 kb.
-Për piasì che a varda se a-i fussa mai la possibilità dë divide sto paginon an vàire tòch pì cit.'''",
'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh $1 kb, che a resta pì che ël
lìmit màssim ëd $2 kb. Parèj as peul nen salvesse. A venta che a në fasa vàire
pàgine diferente për rintré ant ij lìmit técnich.'''",
@@ -870,6 +871,8 @@ $1",
'logdelete-failure' => "'''La visibilità dël registr a peul pa esse ampostà:'''
$1",
'revdel-restore' => 'cambia visibilità',
+'revdel-restore-deleted' => 'revision ëscancelà',
+'revdel-restore-visible' => 'revision visìbij',
'pagehist' => 'Stòria dla pàgina',
'deletedhist' => 'Stòria scancelà',
'revdelete-content' => 'contnù',
@@ -936,11 +939,13 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
# Diffs
'history-title' => 'Cronologìa dle modìfiche ëd "$1"',
'difference' => '(Diferense antra revision)',
+'difference-multipage' => '(Diferense tra pàgine)',
'lineno' => 'Riga $1:',
'compareselectedversions' => 'Paragon-a le version selessionà',
'showhideselectedversions' => 'Smon-e/stërmé le version selessionà',
'editundo' => "buta 'me ch'a l'era",
-'diff-multi' => '({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} pa mostrà.)',
+'diff-multi' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} ëd {{PLURAL:$2|n'utent|$2 utent}} pa mostrà)",
+'diff-multi-manyusers' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} da pi che $2 {{PLURAL:$2|n'utent|utent}} pa mostrà)",
# Search results
'searchresults' => "Arzultà dl'arserca",
@@ -975,6 +980,7 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
'searchprofile-everything-tooltip' => 'Sërché daspërtut (ëdcò ant le pàgine ëd discussion)',
'searchprofile-advanced-tooltip' => 'Sërché ant jë spassi nominaj përsonalisà',
'search-result-size' => '$1 ({{PLURAL:$2|un|$2}} mòt)',
+'search-result-category-size' => '{{PLURAL:$1|1 mèmber|$1 mèmber}} ({{PLURAL:$2|1 sot-categorìa|$2 sot-categorìe}}, {{PLURAL:$3|1 archivi|$3 archivi}})',
'search-result-score' => 'Arlevansa: $1%',
'search-redirect' => '(ridiression $1)',
'search-section' => '(session $1)',
@@ -1050,6 +1056,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
'contextlines' => 'Righe ëd test për minca arzultà:',
'contextchars' => 'Caràter për riga:',
'stub-threshold' => 'Valor mìnim për j\'<a href="#" class="stub">anliure a jë sbòss</a>:',
+'stub-threshold-disabled' => 'Disabilità',
'recentchangesdays' => "Vàire dì smon-e ant j'ùltime modìfiche:",
'recentchangesdays-max' => '(al pì $1 {{PLURAL:$1|di|di}})',
'recentchangescount' => 'Nùmer ëd modìfiche da smon-e për stàndard:',
@@ -1083,6 +1090,7 @@ Ambelessì a-i é un valor generà a asar che a peul dovré: $1",
'prefs-files' => 'Archivi',
'prefs-custom-css' => 'CSS përsonaj',
'prefs-custom-js' => 'JS përsonaj',
+'prefs-common-css-js' => 'CSS e JS condividù për tute le pej:',
'prefs-reset-intro' => 'A peul dovré costa pàgina për amposté torna ij sò gust a coj dë stàndard.
Sòn a peul pa esse anulà.',
'prefs-emailconfirm-label' => "Conferma dl'adrëssa ëd pòsta eletrònica:",
@@ -1123,9 +1131,15 @@ A peul ëdcò serne ëd lassé che j'àutri a lo contato an soa pàgina d'utent
'prefs-advancedrendering' => 'Opsion avansà',
'prefs-advancedsearchoptions' => 'Opsion avansà',
'prefs-advancedwatchlist' => 'Opsion avansà',
-'prefs-display' => 'Opsion ëd visualisassion',
+'prefs-displayrc' => 'Opsion ëd visualisassion',
+'prefs-displaysearchoptions' => 'Opsion ëd visualisassion',
+'prefs-displaywatchlist' => 'Opsion ëd visualisassion',
'prefs-diffs' => 'Diferense',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'A smija bon',
+'email-address-validity-invalid' => "A-i é da manca ëd n'adrëssa bon-a!",
+
# User rights
'userrights' => "Gestion dij drit dj'utent",
'userrights-lookup-user' => "Gestion dle partìe d'utent",
@@ -1210,6 +1224,7 @@ A peul ëdcò serne ëd lassé che j'àutri a lo contato an soa pàgina d'utent
'right-hideuser' => 'Bloché un nòm utent, stërmandlo al pùblich',
'right-ipblock-exempt' => "Dëscavalché ij blocagi ëd j'IP, ij blocagi automàtich e ij blocagi ëd partìe d'IP",
'right-proxyunbannable' => "Dëscavalché ij blòch automatich dij servent d'anonimà",
+'right-unblockself' => 'Dësblochesse da soj',
'right-protect' => 'Cambié ij livej ëd protession e modifiché le pàgine protegiùe',
'right-editprotected' => 'Modifiché le pàgine protegiùe (sensa protession a cascada)',
'right-editinterface' => "Modifiché l'antërfacia utent",
@@ -1232,7 +1247,6 @@ A peul ëdcò serne ëd lassé che j'àutri a lo contato an soa pàgina d'utent
'right-siteadmin' => 'Bloché e dësbloché la base ëd dàit',
'right-reset-passwords' => "Modifiché le ciav d'àutri utent",
'right-override-export-depth' => 'Esporté le pàgine ancludend le pàgine colegà fin-a a na profondeur ëd 5',
-'right-versiondetail' => "Mosta j'anformassion estèise dla vërsion dël software",
'right-sendemail' => "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
# User rights log
@@ -1283,14 +1297,9 @@ A peul ëdcò serne ëd lassé che j'àutri a lo contato an soa pàgina d'utent
'recentchanges-legend' => "Opsion dj'ùltime modìfiche",
'recentchangestext' => 'An costa pàgina as ten cont dle modìfiche pì recente a la wiki.',
'recentchanges-feed-description' => 'Trassé le modìfiche dla wiki pì davzin-e ant ël temp an cost fluss.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - pàgina neuva',
'recentchanges-label-newpage' => "Sta modìfica-sì a l'ha creà na neuva pàgina",
-'recentchanges-legend-minor' => '$1 - modìfica cita',
'recentchanges-label-minor' => "Costa a l'é na modìfica cita",
-'recentchanges-legend-bot' => '$1 - modìfica ëd trigomiro',
'recentchanges-label-bot' => "Sa modìfica a l'é stàita fàita da un trigomiro",
-'recentchanges-legend-unpatrolled' => '$1 - modìfica nen verificà',
'recentchanges-label-unpatrolled' => "Sta modìfica-sì a l'é pa ancó stàita verificà",
'rcnote' => "Ambelessì sota a-i {{PLURAL:$1|é '''1''' modìfica|son j'ùltime '''$1''' modìfiche}} ant j'ùltim {{PLURAL:$2|di|'''$2''' di}}, a parte da $5 dël $4.",
'rcnotefrom' => ' Ambelessì sota a-i é la lista dle modìfiche da <b>$2</b> (fin-a a <b>$1</b>).',
@@ -1337,6 +1346,9 @@ Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a r
'upload_directory_missing' => 'Ël repertòri ëd caria ($1) a-i é nen e a peul pa esse creà dal servent.',
'upload_directory_read_only' => "Ël servent ëd l'aragnà a-i la fa nen a scrive ansima a la diretris ëd càrich ($1).",
'uploaderror' => 'Eror dëmentré che as cariava',
+'upload-recreate-warning' => "'''Atension: n'archivi con col nòm a l'é già stàit ëscancelà o tramudà.'''
+
+Ël registr dle scancelassion e dij tramud për sta pàgina a l'é butà ambelessì për comodità:",
'uploadtext' => "Dovra ël formolari sì-sota për carié dj'archivi.
Për vardé ò sërché dle figure già carià, ch'a vada an sla [[Special:FileList|lista dle figure]], ij (ri)càrich a son ëdcò registrà ant ël [[Special:Log/upload|registr dij càrich]], jë scancelament ant ël [[Special:Log/delete|registr djë scancelament]].
@@ -1371,6 +1383,17 @@ Beiché la [[Special:NewFiles|galarìa dj'archivi neuv]] për na presentassion p
'filetype-banned-type' => "'''\".\$1\"''' a l'é na sòrt d'archivi proibìa.
{{PLURAL:\$3|Cola consentìa a l'é|Cole consentìe a son}} \$2.",
'filetype-missing' => "A l'archivi a-j manca l'estension (pr'esempi \".jpg\").",
+'empty-file' => "L'archivi ch'a l'ha mandà a l'era veuid.",
+'file-too-large' => "L'archivi ch'a l'ha mandà a l'era tròp gròss.",
+'filename-tooshort' => "Ël nòm ëd l'archivi a l'é tròp curt.",
+'filetype-banned' => "Costa sòrt d'archivi a l'é proibìa.",
+'verification-error' => "Cost archivi a l'ha pa passà la verìfica dj'archivi.",
+'hookaborted' => "La modìfica ch'a l'ha provà a fé a l'é stàita blocà dal gancio ëd n'estension.",
+'illegal-filename' => "Ël nòm dl'archivi a l'é nen consentì.",
+'overwrite' => "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
+'unknown-error' => "A l'é capitaje n'eror nen conossù.",
+'tmp-create-error' => "A l'é nen podusse creé l'archivi temporani.",
+'tmp-write-error' => "Eror dë scritura dl'archivi temporani.",
'large-file' => "La racomandassion a l'é che j'archivi a sio nen pì gròss che $1; st'archivi-sì a l'amzura $2.",
'largefileserver' => "St'archivi-sì a resta pì gròss che lòn che la màchina sentral a përmet.",
'emptyfile' => "L'archivi che a l'ha pen-a carià a smija veujd.
@@ -1399,13 +1422,14 @@ Se a veul ancó carié sò archivi, për piasì ch'a torna andré e ch'a deuvra
'file-exists-duplicate' => "S'archivi a l'é un duplicà ëd {{PLURAL:$1|cost-sì|costi-sì}}:",
'file-deleted-duplicate' => "N'archivi idéntich a cost-sì ([[:$1]]) a l'é scàit ëscancelà an passà.
A dovrìa controlé la stòria djë scancelament ëd l'archivi prima ëd carielo torna.",
-'successfulupload' => 'Carià complet',
'uploadwarning' => 'Avis che i soma dapress a carié',
'uploadwarning-text' => "Për piasì, ch'a modìfica la descrission ëd l'archivi sì-sota e ch'a preuva torna.",
'savefile' => "Salvé l'archivi",
'uploadedimage' => 'a l\'ha carià "[[$1]]"',
'overwroteimage' => 'a l\'ha carìa na version neuva ëd "[[$1]]"',
'uploaddisabled' => 'Càrich blocà.',
+'copyuploaddisabled' => "Ël càrich për mojen ëd n'adrëssa dl'aragnà a l'é disabilità.",
+'uploadfromurl-queued' => "Sò càrich a l'é stàit butà an coa.",
'uploaddisabledtext' => "La possibilità ëd carié dj'archivi a l'é staita disabilità.",
'php-uploaddisabledtext' => "Ij cariament d'archivi a son disabilità an PHP.
Për piasì, ch'a controla l'ampostassion file_uploads.",
@@ -1439,6 +1463,14 @@ JD # Jenoptik
MGP # Pentax
PICT # vàire marche diferente
#</pre> <!-- ch'a lassa sta riga-sì tanme ch'a l'é -->",
+'upload-success-subj' => 'Carià con sucess',
+'upload-success-msg' => "A l'ha carià da [$2] për da bin. Lòn ch'a l'ha carià a l'é disponìbil ambelessì: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => 'Problema a carié',
+'upload-failure-msg' => "A-i é staje un problema con lòn ch'a l'ha carià da [$2]:
+
+$1",
+'upload-warning-subj' => "Avis antramentre ch'as caria",
+'upload-warning-msg' => "A-i era un problema con lòn ch'a l'ha carià da [$2]. A peul artorné al [[Special:Upload/stash/$1|formolari për carié]] për corege ël problema.",
'upload-proto-error' => 'Protocòl cioch',
'upload-proto-error-text' => "Për carié da dij servent lontan a venta buté dj'anliure ch'as anandio për <code>http://</code> ò pura <code>ftp://</code>.",
@@ -1502,6 +1534,7 @@ Ch'a-i bata 'n colp col rat ansima a j'antestassion dle colòne për cangé l'ó
'listfiles_search_for' => "Arserché un nòm d'archivi multimojen:",
'imgfile' => 'archivi',
'listfiles' => "Lista d'archivi",
+'listfiles_thumb' => 'Miniadura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nòm',
'listfiles_user' => 'Utent',
@@ -1616,8 +1649,8 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
'statistics-edits' => "Pàgine modificà da quand ël {{SITENAME}} a l'é stàit tirà su",
'statistics-edits-average' => 'Media dle modìfiche për pàgina',
'statistics-views-total' => 'Total dle visualisassion',
+'statistics-views-total-desc' => 'Le visualisassion ëd le pàgine pa esistente e ëd le pàgine speciaj a son nen comprèise',
'statistics-views-peredit' => 'Visualisassion për modìfica',
-'statistics-jobqueue' => 'Lunghëssa dla [http://www.mediawiki.org/wiki/Manual:Job_queue Coa dij process]',
'statistics-users' => '[[Special:ListUsers|Utent]] argistrà',
'statistics-users-active' => 'Utent ativ',
'statistics-users-active-desc' => "Utent che a l'han fàit n'assion ant {{PLURAL:$1|l'ùltim di|j'ùltim $1 di}}",
@@ -1629,9 +1662,9 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
Na pàgina as trata coma \"pàgina ëd gestion dj'omònim\" se a deuvra në stamp dont l'anliura as treuva ant ël [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Ridiression dobie',
-'doubleredirectstext' => "Sta pàgina-sì a a lista pàgine con rediression a àutre pàgine ëd rediression.
-Vira riga a l'ha andrinta j'anliure a la prima e a la sconda rediression, ant sël pat ëd la prima riga ëd test dla seconda rediression, che për sòlit a l'ha andrinta l'artìcol ëd destinassion vèir, col andoa che a dovrìa ëmné ëdcò la prima reiression.
-Le rediression <s>scanselà</> a son stàite arzolvùe.",
+'doubleredirectstext' => "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.
+Vira riga a l'ha andrinta j'anliure a la prima e a la sconda ridiression, ant sël pat ëd la prima riga ëd test dla seconda ridiression, che për sòlit a l'ha andrinta l'artìcol ëd destinassion vèir, col andoa che a dovrìa ëmné ëdcò la prima ridiression.
+Le ridiression <del>sganfà</del> a son stàite arzolvùe.",
'double-redirect-fixed-move' => "[[$1]] a l'é stàit spostà.
Adess a l'é na ridiression a [[$2]].",
'double-redirect-fixer' => 'Coretor ëd ridiression',
@@ -1655,6 +1688,8 @@ Adess a l'é na ridiression a [[$2]].",
'nmembers' => '$1 {{PLURAL:$1|element|element}}',
'nrevisions' => '{{PLURAL:$1|na revision|$1 revision}}',
'nviews' => '{{PLURAL:$1|na consultassion|$1 consultassion}}',
+'nimagelinks' => 'Dovrà dzora a $1 {{PLURAL:$1|pàgina|pàgine}}',
+'ntransclusions' => 'dovrà dzora a $1 {{PLURAL:$1|pàgina|pàgine}}',
'specialpage-empty' => 'Pàgina veujda.',
'lonelypages' => 'Pàgine daspërlor',
'lonelypagestext' => "Le pàgine ambelessì-sota a l'han gnun-e anliure che a-j men-o ansima nì a son anserìe an d'àotre pàgine ëd {{SITENAME}}.",
@@ -1765,19 +1800,19 @@ Ch'a bèica ëdcò [[Special:WantedCategories|le categorìe domandà]].",
'linksearch-ok' => 'Sërché',
'linksearch-text' => 'As peulo dovresse dij ciapatut coma "*.wikipedia.org".<br />Protocòj ch\'as peulo dovresse: <tt>$1</tt>',
'linksearch-line' => "$1 a l'ha n'anliura ch'a-j riva dzora da $2",
-'linksearch-error' => 'Ij ciapatut as peulo butesse mach an prinsipi dël nòm dël servent.',
+'linksearch-error' => 'Ij ciapatut as peulo butesse mach an prinsipi dël nòm dël sërvent.',
# Special:ListUsers
'listusersfrom' => "Smon-me j'utent a parte da:",
-'listusers-submit' => 'Smon',
-'listusers-noresult' => 'Pa gnun utent parej.',
+'listusers-submit' => 'Smon-e',
+'listusers-noresult' => 'Gnun utent përparèj.',
'listusers-blocked' => '(blocà)',
# Special:ActiveUsers
'activeusers' => "Lista dj'utent ativ",
'activeusers-intro' => "Costa a l'é na lista d'utent ch'a l'han avù n'atività qualsëssìa ant j'ùltim $1 {{PLURAL:$1|di|di}}.",
'activeusers-count' => "$1 {{PLURAL:$1|modìfica neuva|modìfiche neuve}} ant {{PLURAL:$3|l'ùltim di|j'ùltim $3 di}}",
-'activeusers-from' => "Mosta j'utent a parte da:",
+'activeusers-from' => "Smon-me j'utent a parte da:",
'activeusers-hidebots' => 'Stërma trigomiro',
'activeusers-hidesysops' => "Stërma j'aministrator",
'activeusers-noresult' => 'Pa gnun utent trovà.',
@@ -1810,35 +1845,41 @@ A peulo ess-ie [[{{MediaWiki:Listgrouprights-helppage}}|anformassion adissionaj]
'listgrouprights-removegroup-self-all' => 'Gava tute le partìe da tò cont',
# E-mail user
-'mailnologin' => 'A-i é pa gnun-a adrëssa për mandé ël messagi',
-'mailnologintext' => "A dev [[Special:UserLogin|rintré ant ël sistema]]
+'mailnologin' => 'A-i é pa gnun-a adrëssa për mandé ël messagi',
+'mailnologintext' => "A dev [[Special:UserLogin|rintré ant ël sistema]]
e avej registrà n'adrëssa ëd pòsta eletrònica vàlida ant ij [[Special:Preferences|sò gust]] për podej mandé dij messagi ëd pòsta eletrònica a j'àutri Utent.",
-'emailuser' => "Mand-je un messagi eletrònich a st'Utent-sì",
-'emailpage' => "Mand-je un messagi ëd pòsta eletrònica a st'utent-sì",
-'emailpagetext' => "It peule dovré la forma ambelessì për mandé un messagi e-mail a st'utent-sì.
+'emailuser' => "Mand-je un messagi eletrònich a st'Utent-sì",
+'emailpage' => "Mand-je un messagi ëd pòsta eletrònica a st'utent-sì",
+'emailpagetext' => "It peule dovré la forma ambelessì për mandé un messagi e-mail a st'utent-sì.
L'adrëssa e-mail ch'it l'has butà an [[Special:Preferences|Ij sò gust]] a sarà butò ant l'adrëssa \"From\" ëd toa e-mail, parèj ël ricevent a podrà arsponde diretament a ti.",
-'usermailererror' => "L'oget che a goèrna la pòsta eletrònica a l'ha dait eror:",
-'defemailsubject' => 'Messagi da {{SITENAME}}',
-'noemailtitle' => 'Pa gnun-a adrëssa ëd pòsta eletrònica',
-'noemailtext' => "Cost Utent-sì a l'ha pa spessificà n'adrëssa e-mail vàlida.",
-'nowikiemailtitle' => 'Gnun-e e-mail',
-'nowikiemailtext' => "Stutent-sì a l'ha sërnù ëd pa arseive e-mail da dj'àutri utent.",
-'email-legend' => "Manda n'e-mail a n'àutr utent ëd {{SITENAME}}",
-'emailfrom' => 'Da:',
-'emailto' => 'A:',
-'emailsubject' => 'Oget:',
-'emailmessage' => 'Messagi:',
-'emailsend' => 'Manda',
-'emailccme' => 'Mand-ne na còpia ëdcò a mia adrëssa.',
-'emailccsubject' => 'Còpia dël messagi mandà a $1: $2',
-'emailsent' => 'Messagi eletrònich mandà',
-'emailsenttext' => "Sò messagi eletrònich a l'é stait mandà",
-'emailuserfooter' => 'St\'e-mail-sì a l\'é stàita mandà da $1 a $2 con la fonsion "E-mail utent" a {{SITENAME}}.',
+'usermailererror' => "L'oget che a goèrna la pòsta eletrònica a l'ha dait eror:",
+'defemailsubject' => 'Messagi da {{SITENAME}}',
+'usermaildisabled' => "Pòsta eletrònica dl'utent disabilità",
+'usermaildisabledtext' => "A peul pa mandé ëd mësagi ëd pòsta eletrònica a d'àutri utent dzora a sta wiki-sì",
+'noemailtitle' => 'Pa gnun-a adrëssa ëd pòsta eletrònica',
+'noemailtext' => "Cost Utent-sì a l'ha pa spessificà n'adrëssa e-mail vàlida.",
+'nowikiemailtitle' => 'Gnun-e e-mail',
+'nowikiemailtext' => "Stutent-sì a l'ha sërnù ëd pa arseive e-mail da dj'àutri utent.",
+'email-legend' => "Manda n'e-mail a n'àutr utent ëd {{SITENAME}}",
+'emailfrom' => 'Da:',
+'emailto' => 'A:',
+'emailsubject' => 'Oget:',
+'emailmessage' => 'Messagi:',
+'emailsend' => 'Manda',
+'emailccme' => 'Mand-ne na còpia ëdcò a mia adrëssa.',
+'emailccsubject' => 'Còpia dël messagi mandà a $1: $2',
+'emailsent' => 'Messagi eletrònich mandà',
+'emailsenttext' => "Sò messagi eletrònich a l'é stait mandà",
+'emailuserfooter' => 'St\'e-mail-sì a l\'é stàita mandà da $1 a $2 con la fonsion "E-mail utent" a {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => "A l'ha lassà un mëssagi ëd sistema.",
+'usermessage-editor' => 'Mëssagerìa ëd sistema',
# Watchlist
'watchlist' => 'Ròba che im ten-o sot euj',
'mywatchlist' => 'Ròba che im ten-o sot euj',
-'watchlistfor' => "(për '''$1''')",
+'watchlistfor2' => 'Për $1 $2',
'nowatchlist' => 'A l\'ha ancó pa marcà dj\'artìcoj coma "ròba da tnì sot euj".',
'watchlistanontext' => "Për piasì, $1 për ës-ciairé ò pura modifiché j'element ëd soa lista dla ròba che as ten sot euj.",
'watchnologin' => "A l'é ancó nen rintrà ant ël sistema",
@@ -1959,7 +2000,10 @@ L'ùltima modìfica a la pàgina a l'é staita faita da [[User:$3|$3]] ([[User t
'revertpage' => "Gavà via le modìfiche ëd [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]); ël contnù a l'é stait tirà andarè a l'ùltima version dl'utent [[User:$1|$1]]",
'revertpage-nouser' => "Scanselà le modìfiche dë (stranòm gavà) a l'ùltima vërsion ëd [[User:$1|$1]]",
'rollback-success' => "Modìfiche anulà da $1; tirà andré a l'ùltima version da $2.",
-'sessionfailure' => "A-i son ëstaje dle gran-e con la session che a identìfica sò acess; ël sistema a l'ha nen eseguì l'ordin che a l'ha daje për precaussion. Che a torna andaré a la pàgina prima con ël boton \"andaré\" ëd sò programa ëd navigassion (browser), peuj che as carìa n'àutra vira costa pàgina-sì e che a preuva torna a fé lòn che vorìa fé.",
+
+# Edit tokens
+'sessionfailure-title' => 'Eror ëd session',
+'sessionfailure' => "A-i son ëstaje dle gran-e con la session che a identìfica sò acess; ël sistema a l'ha nen eseguì l'ordin che a l'ha daje për precaussion. Che a torna andaré a la pàgina prima con ël boton \"andaré\" ëd sò programa ëd navigassion (browser), peuj che as carìa n'àutra vira costa pàgina-sì e che a preuva torna a fé lòn che vorìa fé.",
# Protect
'protectlogpage' => 'Registr dle protession',
@@ -2089,18 +2133,22 @@ $1",
'month' => 'Mèis:',
'year' => 'Ann:',
-'sp-contributions-newbies' => 'Smon mach ël travaj dij cont neuv',
-'sp-contributions-newbies-sub' => "Për j'utent neuv",
-'sp-contributions-newbies-title' => "Contribussion ëd j'utent për ij neuv cont",
-'sp-contributions-blocklog' => "Fërma l'agiornament dij registr",
-'sp-contributions-deleted' => "Modìfiche d'utent scancelà",
-'sp-contributions-logs' => 'registr',
-'sp-contributions-talk' => 'discussion',
-'sp-contributions-userrights' => 'gestion dij drit utent',
-'sp-contributions-blocked-notice' => "St'utent-sì a l'é blocà al moment. L'ùltima intrada dël registr dij blòch a l'é butà sì sota për arferiment:",
-'sp-contributions-search' => 'Arsërca contribussion',
-'sp-contributions-username' => 'Adrëssa IP ò nòm utent:',
-'sp-contributions-submit' => 'Arsërca',
+'sp-contributions-newbies' => 'Smon mach ël travaj dij cont neuv',
+'sp-contributions-newbies-sub' => "Për j'utent neuv",
+'sp-contributions-newbies-title' => "Contribussion ëd j'utent për ij neuv cont",
+'sp-contributions-blocklog' => "Fërma l'agiornament dij registr",
+'sp-contributions-deleted' => "Modìfiche d'utent scancelà",
+'sp-contributions-uploads' => 'cariagi',
+'sp-contributions-logs' => 'registr',
+'sp-contributions-talk' => 'discussion',
+'sp-contributions-userrights' => 'gestion dij drit utent',
+'sp-contributions-blocked-notice' => "St'utent-sì a l'é blocà al moment. L'ùltima intrada dël registr dij blòch a l'é butà sì sota për arferiment:",
+'sp-contributions-blocked-notice-anon' => "St'adrëssa IP a l'é blocà al moment.
+L'ùltima intrada dël registr dij blocagi a l'é butà sì-sota për arferiment:",
+'sp-contributions-search' => 'Arsërca contribussion',
+'sp-contributions-username' => 'Adrëssa IP ò nòm utent:',
+'sp-contributions-toponly' => "Mostré mach le modìfiche ch'a son j'ùltime revision",
+'sp-contributions-submit' => 'Arsërca',
# What links here
'whatlinkshere' => "Pàgine con dj'anliure che a men-o a costa-sì",
@@ -2163,7 +2211,6 @@ Varda [[Special:IPBlockList|lista dj'IP blocà]] Për rivëdde ij blòch.",
'ipb-edit-dropdown' => 'Motiv dël blòch',
'ipb-unblock-addr' => 'Dësbloché $1',
'ipb-unblock' => "Dësbloché n'utent ò n'adrëssa IP",
-'ipb-blocklist-addr' => 'Blòch esistent për $1',
'ipb-blocklist' => 'Vardé ij blòch ativ',
'ipb-blocklist-contribs' => 'Contribussion për $1',
'unblockip' => "Dësblòca st'adrëssa IP-sì",
@@ -2234,6 +2281,8 @@ It veule cambié le ampostassion?",
'sorbs_create_account_reason' => "Soa adrëssa IP a l'é listà coma arpetitor doèrt (open proxy) ansima al DNSBL dovrà da {{SITENAME}}. A peul nen creésse un cont.",
'cant-block-while-blocked' => 'It peule pa bloché àutri utent an mente it ses blocà.',
'cant-see-hidden-user' => "L'utent che të stas provand a bloché a l'é già stàit blocà e stërmà. Da già ch'it l'has pa ël drit hideuser, it peule pa vëdde o modifiché ël blòch ëd l'utent.",
+'ipbblocked' => "A peul pa bloché o dësbloché d'àutri utent, përchè a l'é blocà chiel-midem",
+'ipbnounblockself' => 'It peule pa dësbloché ti midem',
# Developer tools
'lockdb' => 'Blòca la base dat',
@@ -2270,6 +2319,17 @@ Sòn a veul dì che, se a l'avèissa mai da fé n'operassion nen giusta, a podrÃ
'''ATENSION!'''
Un cambiament dràstich parej a podrìa dé dle gran-e an dzora a na pàgina motobin visità.
Che a varda mach dë esse pì che sigur d'avej presente le conseguense, prima che fé che fé.",
+'movepagetext-noredirectfixer' => "Dovré ël formolari sì-sota a arnominërà na pàgina, tramudand tuta soa stòria al nòm neuv.
+Ël tìtol vèj a vnirà na pàgina ëd ridiression al tìtol neuv.
+Ch'as sigura ëd controlé le ridiression [[Special:DoubleRedirects|dobie]] o cole [[Special:BrokenRedirects|ch'a marcio nen]].
+A l'é responsàbil ëd fé an manera che j'anliure a continuo a ponté andova as pensa ch'a vado.
+
+Ch'a armarca che la pàgina a sarà '''pa''' tramudà s'a-i é già na pàgina con ël tìtol neuv, gavà ch'a sia veuida o na ridiression e ch'a l'abia pa na stòria ëd modìfiche passà.
+Son a veul dì ch'a peul torna arnominé na pàgina andré da andova a l'avìa arnominala s'a fa n'eror, e ch'a peul pa coaté na pàgina esistenta.
+
+'''Avis!'''
+Sossì a peul esse un cambi dràstich e pa spetà për na pàgina popolar;
+për piasì ch'as renda bin cont ëd le conseguense ëd sòn prima d'andé anans.",
'movepagetalktext' => "La pàgina ëd discussion tacà a costa pàgina d'articol, se a-i é, a sarà tramudà n'automatich ansema a l'artìcol, '''gavà costi cas-sì''':
*quand as tramuda la pàgina tra diferent spassi nominal,
*quand na pàgina ëd discussion nen veujda a-i é già për ël nòm neuv, ò pura
@@ -2326,6 +2386,7 @@ L\'artìcol ëd destinassion "[[:$1]]" a-i é già. Veul-lo scancelelo për avej
'immobile-source-page' => 'Sta pàgina-sì as peul pa tramudesse.',
'immobile-target-page' => 'As peul pa tramudess al tìtol dë sta destinassion-sì.',
'imagenocrossnamespace' => 'As peul pa tramudé un file fòra dal sò namespace',
+'nonfile-cannot-move-to-file' => "As peul nen tramudesse lòn ch'a l'é pa n'archivi a lë spassi nominal dj'archivi",
'imagetypemismatch' => 'La neuva estension dël file a corispond pa a sò tipo',
'imageinvalidfilename' => "Ël nòm dël file pontà a l'é pa vàlid",
'fix-double-redirects' => 'Modìfica minca rediression che a ponta al tìtol original',
@@ -2405,10 +2466,11 @@ Tute le amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/i
'import-upload-filename' => 'Nòm dël file:',
'import-comment' => 'Oget:',
'importtext' => "Për piasì, che as espòrta l'archivi da 'nt la sorgiss wiki ën dovrand l'[[Special:Export|utiss d'esportassion]].
-Che as lo salva ansima a sò calcolador e peui che a lo caria ambelessì.",
+Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
'importstart' => 'I soma antramentr che amportoma le pàgine...',
'import-revision-count' => '{{PLURAL:$1|Na|$1}} revision',
'importnopages' => 'Pa gnun-a pàgina da amporté',
+'imported-log-entries' => 'Amportà $1 {{PLURAL:$1|vos ëd registr|vos ëd registr}}.',
'importfailed' => 'Amportassion falìa: $1',
'importunknownsource' => "Sorgiss d'amportassion ëd na sòrt nen conossùa",
'importcantopen' => "L'archivi da amporté a l'é pa podusse deurbe",
@@ -2503,6 +2565,8 @@ Për piasì preuva torna.',
'tooltip-rollback' => '"Rollback" a scansela con un clich le modìfiche fàite a costa pagina da l\'ùltim contribudor',
'tooltip-undo' => '"Undo" a scansela costa modìfica e a deurb la fnestra ëd modìfica an manera ëd vardé prima.
At lassa gionté na spiegassion ëd la modìfica.',
+'tooltip-preferences-save' => 'Salvé ij sò gust',
+'tooltip-summary' => 'Anserì un curt resumé',
# Stylesheets
'common.css' => '/** Ël còdes CSS che as buta ambelessì a resta dovrà ant tute le "facie" */',
@@ -2605,14 +2669,17 @@ An fasend-lo travajé ansima a sò ordinator chiel a podrìa porteje ëd dann a
'imagemaxsize' => "Lìmit ëd la dimension ëd la figura:<br /> ''(për pàgine ëd descrission dij file)''",
'thumbsize' => 'Amzura dle figurin-e:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pàgina|pàgine}}',
-'file-info' => "(amzura dl'archivi: $1, sòrt MIME: $2)",
-'file-info-size' => '($1 × $2 pixel, amzure: $3, sòrt MIME: $4)',
+'file-info' => "amzura dl'archivi: $1, sòrt MIME: $2",
+'file-info-size' => '$1 × $2 pixel, amzure: $3, sòrt MIME: $4',
'file-nohires' => '<small>Gnun-a risolussion pì bela disponibila.</small>',
-'svg-long-desc' => "(archivi an forma SVG, amzure nominaj $1 × $2 pixel, amzura dl'archivi: $3)",
+'svg-long-desc' => "archivi an forma SVG, amzure nominaj $1 × $2 pixel, amzura dl'archivi: $3",
'show-big-image' => 'Version a amzura pijn-a',
'show-big-image-thumb' => '<small>Amzure dë sta figurin-a: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'ciclà',
'file-info-gif-frames' => '$1 {{PLURAL:$1|fnesta|fneste}}',
+'file-info-png-looped' => 'an sìrcol',
+'file-info-png-repeat' => 'sonà $1 {{PLURAL:$1|vira|vire}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|quàder|quàder}}',
# Special:NewFiles
'newimages' => 'Galerìa ëd figure e son neuv',
@@ -2765,6 +2832,7 @@ J'anliure ch'a-i ven-o dapress, ant sla midema riga, as conto për ecession (vis
'exif-gpsareainformation' => 'Nòm dlë spassi GPS',
'exif-gpsdatestamp' => 'Data dël GPS',
'exif-gpsdifferential' => 'Coression diferensial dël GPS',
+'exif-objectname' => 'Tìtol curt',
# EXIF attributes
'exif-compression-1' => 'Pa compress',
@@ -2933,31 +3001,31 @@ J'anliure ch'a-i ven-o dapress, ant sla midema riga, as conto për ecession (vis
'limitall' => 'tùit',
# E-mail address confirmation
-'confirmemail' => "Confermé l'adrëssa postal",
-'confirmemail_noemail' => "A l'ha pa butà gnun-a adrëssa vàlida ëd pòsta eletrònica ant ij [[Special:Preferences|sò gust]].",
-'confirmemail_text' => "Costa wiki a ciama che chiel a convalida n'adrëssa postal anans che
+'confirmemail' => "Confermé l'adrëssa postal",
+'confirmemail_noemail' => "A l'ha pa butà gnun-a adrëssa vàlida ëd pòsta eletrònica ant ij [[Special:Preferences|sò gust]].",
+'confirmemail_text' => "Costa wiki a ciama che chiel a convalida n'adrëssa postal anans che
dovré lòn che toca la pòsta. Che a sgnaca ël boton ambelessì sota
për fesse mandé un messa ëd conferma a soa adrëssa eletrònica.
Andrinta al messagi a-i sara n'anliura (URL) con andrinta un còdes.
Che a deurba st'anliura andrinta a sò programa ëd navigassion (browser)
për confermé che soa adrëssa a l'é pròpe cola.",
-'confirmemail_pending' => "I l'oma già mandaje sò còdes ëd conferma;
+'confirmemail_pending' => "I l'oma già mandaje sò còdes ëd conferma;
se a l'ha pen-a creasse sò cont, miraco a venta che a speta dontre minute che a-j riva ant la pòsta, nopà che ciamene un neuv.",
-'confirmemail_send' => 'Manda un còdes ëd conferma për pòsta eletrònica',
-'confirmemail_sent' => "Ël messagi ëd conferma a l'é stait mandà.",
-'confirmemail_oncreate' => "Un còdes ëd conferma a l'é stait mandà a soa adrëssa ëd pòsta eletrònica.
+'confirmemail_send' => 'Manda un còdes ëd conferma për pòsta eletrònica',
+'confirmemail_sent' => "Ël messagi ëd conferma a l'é stait mandà.",
+'confirmemail_oncreate' => "Un còdes ëd conferma a l'é stait mandà a soa adrëssa ëd pòsta eletrònica.
D'ës còdes a fa pa dë manca për rintré ant ël sistema, ma a ventrà che a lo mostra al sistema për podej abilité cole funsion dla wiki che a son basà ant sla pòsta eletrònica.",
-'confirmemail_sendfailed' => "{{SITENAME}} a l'ha pa podù mandete l'e-mail ëd conferma.
+'confirmemail_sendfailed' => "{{SITENAME}} a l'ha pa podù mandete l'e-mail ëd conferma.
Che a controla l'adrëssa che a l'ha dane, mai che a-i fusso dij caràter nen vàlid.
Ël programa ëd pòsta a l'ha arspondù: $1",
-'confirmemail_invalid' => 'Còdes ëd conferma nen vàlid. A podrìa ëdcò mach esse scadù.',
-'confirmemail_needlogin' => 'A venta che a fasa $1 për confermé soa addrëssa postal eletrònica.',
-'confirmemail_success' => "Soa adrëssa postal a l'é staita confermà, adess a peul rintré ant ël sistema e i-j auguroma da fessla bin ant la wiki!",
-'confirmemail_loggedin' => "Motobin mersì. Soa adrëssa ëd pòsta eletrònica adess a l'é confermà.",
-'confirmemail_error' => "Cheich-còs a l'é andà mal ën salvand soa conferma.",
-'confirmemail_subject' => "Conferma dl'adrëssa postal da 'nt la {{SITENAME}}",
-'confirmemail_body' => "Cheidun, a l'é belfé che a sia stait pròpe chiel (ò chila), da 'nt l'adrëssa IP \$1,
+'confirmemail_invalid' => 'Còdes ëd conferma nen vàlid. A podrìa ëdcò mach esse scadù.',
+'confirmemail_needlogin' => 'A venta che a fasa $1 për confermé soa addrëssa postal eletrònica.',
+'confirmemail_success' => "Soa adrëssa postal a l'é staita confermà, adess a peul rintré ant ël sistema e i-j auguroma da fessla bin ant la wiki!",
+'confirmemail_loggedin' => "Motobin mersì. Soa adrëssa ëd pòsta eletrònica adess a l'é confermà.",
+'confirmemail_error' => "Cheich-còs a l'é andà mal ën salvand soa conferma.",
+'confirmemail_subject' => "Conferma dl'adrëssa postal da 'nt la {{SITENAME}}",
+'confirmemail_body' => "Cheidun, a l'é belfé che a sia stait pròpe chiel (ò chila), da 'nt l'adrëssa IP \$1,
a l'ha doertà un cont utent \"\$2\" ansima a {{SITENAME}}, lassand-ne st'adrëssa ëd pòsta eletrònica-sì.
Për confermé che ës cont a l'é da bon sò e për ativé
@@ -2971,8 +3039,36 @@ për scanselé la conferma ëd l'adrëssa e-mail:
\$5
Cost còdes ëd conferma a l'é bon fin-a al \$4.",
-'confirmemail_invalidated' => "Conferma ëd l'adrëssa e-mail scanselà",
-'invalidateemail' => "Scansela l'e-mail ëd conferma",
+'confirmemail_body_changed' => "Cheidun, a l'é belfé ch'a sia chiel, da l'adrëssa IP \$1,
+a l'ha cangià l'adrëssa ëd pòsta eletrònica dël cont \"\$2\" con st'adrëssa-sì dzora a {{SITENAME}}.
+
+Për confirmé che sto cont-sì a l'é pròpi sò e për riativé
+le possibilità ëd pòsta eletrònica dzora a {{SITENAME}}, ch'a deurba sto colegament-sì an sò navigador:
+
+\$3
+
+Se ël cont a l'é *nen* sò, ch'a vada andré a sto colegament-sì
+për scancelé la conferma dl'adrëssa ëd pòsta eletrònica:
+
+\$5
+
+Ës còdes ëd conferma a scadrà a \$4.",
+'confirmemail_body_set' => "Quaidun, miraco chiel, da l'adrëssa IP \$1,
+a l'ha ampostà l'adrëssa ëd pòsta eletrònica dël cont \"\$2\" con costa adrëssa su {{SITENAME}}.
+
+Për confirmé che sto cont a l'é pròpi sò e ativé torna
+le funsion ëd pòsta eletrònica su {{SITENAME}}, ch'a duverta cost'anliura an sò navigador:
+
+\$3
+
+Se ël cont a l'é *pa* sò, ch'a-j vada dapress a st'anliura
+për scancelé la conferma ëd l'adrëssa ëd pòsta eletrònica:
+
+\$5
+
+Cost còdes ëd conferma a scad ai \$4.",
+'confirmemail_invalidated' => "Conferma ëd l'adrëssa e-mail scanselà",
+'invalidateemail' => "Scansela l'e-mail ëd conferma",
# Scary transclusion
'scarytranscludedisabled' => "[L'inclusion ëd pàgine antra wiki diferente a l'é nen abilità]",
@@ -3012,6 +3108,7 @@ Për piasì, che an conferma che da bon a veul torna creélo.",
'table_pager_first' => 'Prima pàgina',
'table_pager_last' => 'Ùltima pàgina',
'table_pager_limit' => 'Smon-me $1 archivi për pàgina',
+'table_pager_limit_label' => 'Oget për pàgina:',
'table_pager_limit_submit' => 'Va',
'table_pager_empty' => 'Pa gnun arsultà',
@@ -3088,6 +3185,7 @@ As peul ëdcò [[Special:Watchlist/edit|dovré l'editor sòlit]].",
'version-specialpages' => 'Pàgine speciaj',
'version-parserhooks' => 'Gancio dlë scompositor',
'version-variables' => 'Variàbij',
+'version-skins' => 'Pej',
'version-other' => 'Àutr',
'version-mediahandlers' => 'Gestor multimojen',
'version-hooks' => 'Gancio',
@@ -3099,6 +3197,13 @@ As peul ëdcò [[Special:Watchlist/edit|dovré l'editor sòlit]].",
'version-hook-subscribedby' => 'A son scrivusse',
'version-version' => '(Version $1)',
'version-license' => 'Licensa',
+'version-poweredby-credits' => "Sta wiki-sì a l'é basà su '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'àutri',
+'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir e/o modifichelo sota le condission dla Licensa Pùblica General GNU coma publicà da la Free Software Foundation; o la version 2 dla licensa o (a soa decision) qualsëssìa version apress.
+
+MediaWiki a l'é distribuì ant la speransa che a sia ùtil, ma SENSA GNUN-A GARANSÌA; sensa gnanca la garansìa implìcita ëd COMERSIABILITA' o d'ADATAMENT A UN BUT PARTICOLAR. Ch'a lesa la Licensa General Pùblica GNU per pi 'd detaj.
+
+A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa Pùblica General GNU] ansema a sto programa-sì; dësnò, ch'a scriva a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html ch'a la lesa an linia].",
'version-software' => 'Programa anstalà',
'version-software-product' => 'Prodot',
'version-software-version' => 'Version',
@@ -3169,6 +3274,15 @@ Ch'a bata 'l nòm dl'archivi sensa pa bute-ie 'l prefiss \"{{ns:file}}:\".",
'tags-edit' => 'modìfica',
'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiament}}',
+# Special:ComparePages
+'comparepages' => 'Confronté dle pàgine',
+'compare-selector' => 'Confronté le revision dle pàgine',
+'compare-page1' => 'Pàgina 1',
+'compare-page2' => 'Pàgina 2',
+'compare-rev1' => 'Revision 1',
+'compare-rev2' => 'Revision 2',
+'compare-submit' => 'Confronta',
+
# Database error messages
'dberr-header' => "Sta wiki-sì a l'ha un problema",
'dberr-problems' => "Spiasent! Sto sit-sì a l'ha dle dificoltà técniche.",
@@ -3185,8 +3299,13 @@ Ch'a bata 'l nòm dl'archivi sensa pa bute-ie 'l prefiss \"{{ns:file}}:\".",
'htmlform-float-invalid' => "Ël valor ch'it l'has spessificà a l'é pa un nùmer.",
'htmlform-int-toolow' => "Ël valor ch'it l'has spessificà a l'é sota al mìnim ëd $1.",
'htmlform-int-toohigh' => "Ël valor ch'it l'has spessificà a l'é dzora dël màssim ëd $1.",
+'htmlform-required' => 'A-i é dabzògn ëd cost valor',
'htmlform-submit' => 'Spediss',
'htmlform-reset' => 'Scansela ij cambiament',
'htmlform-selectorother-other' => 'Àutr',
+# SQLite database support
+'sqlite-has-fts' => '$1 con arserca an test pien mantnùa',
+'sqlite-no-fts' => '$1 sensa arserca an test pien mantnùa',
+
);
diff --git a/languages/messages/MessagesPnb.php b/languages/messages/MessagesPnb.php
index 825698ad..6e91cf7e 100644
--- a/languages/messages/MessagesPnb.php
+++ b/languages/messages/MessagesPnb.php
@@ -133,24 +133,13 @@ $messages = array(
'qbspecialpages' => 'خاص صÙØ­Û’',
# Vector skin
-'vector-action-delete' => 'مکاؤ',
-'vector-action-move' => 'ٹرو',
-'vector-action-protect' => 'بچاؤ',
-'vector-action-unprotect' => 'نا بچاؤ',
-'vector-namespace-category' => 'ونڈ',
-'vector-namespace-help' => 'مدد آلا ورقا',
-'vector-namespace-image' => 'Ùائل',
-'vector-namespace-main' => 'ورقÛ',
-'vector-namespace-media' => ' میڈیا آلا ورقÛ',
-'vector-namespace-mediawiki' => 'سنیعا',
-'vector-namespace-project' => 'بجایا ورقÛ',
-'vector-namespace-special' => 'خاص صÙØ­Û',
-'vector-namespace-talk' => 'گل بات',
-'vector-namespace-template' => 'سانچÛ',
-'vector-namespace-user' => 'ورتن والے دا صÙØ­Û',
-'vector-view-create' => 'بناؤ',
-'vector-view-edit' => 'Ù„Ú©Ú¾Ùˆ',
-'vector-view-viewsource' => 'ویکھو',
+'vector-action-delete' => 'مکاؤ',
+'vector-action-move' => 'ٹرو',
+'vector-action-protect' => 'بچاؤ',
+'vector-action-unprotect' => 'نا بچاؤ',
+'vector-view-create' => 'بناؤ',
+'vector-view-edit' => 'Ù„Ú©Ú¾Ùˆ',
+'vector-view-viewsource' => 'ویکھو',
'errorpagetitle' => 'مسئلÛ',
'returnto' => 'واپس $1 چلو',
@@ -288,7 +277,7 @@ $messages = array(
'yourname' => 'ورتن والÛ:',
'yourpassword' => 'کنجی:',
'yourpasswordagain' => 'کنجی Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾Ùˆ:',
-'remembermypassword' => 'اس کمپیوٹر تے میرا لاگن یاد رکھو',
+'remembermypassword' => 'اس کمپیوٹر تے میرا لاگن یاد رکھو (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'تواڈا علاقÛ:',
'login' => 'اندر آؤ جی',
'nav-login-createaccount' => 'اندر آؤ / Ú©Ú¾Ø§ØªÛ Ú©Ú¾ÙˆÙ„Ùˆ',
@@ -409,8 +398,6 @@ $messages = array(
اگر تسی نئیں چاندے کے تواڑی لکھائی نوں بے رحمی نال ٹھیک کیتا جاۓ تے نالے اپنی مرضی نال اونھوں چھاپیا جاۓ تے ایتدے مت لکھو۔<br />
تسی اے ÙˆÛŒ ساڈے نال ÙˆØ¹Ø¯Û Ú©Ø± رÛÛ’ او Ú©Û Ø§ÛŒÙ†ÙˆÚº تسی آپ لکھیا اے یا Ùیر کسی پبلک ڈومین توں یا ایÛÙˆ جۓ کسے آزاد ذریعے توں نقل کیتا اے۔<br />
'''ایتھے او کم بغیر اجازت توں نا لکھو جیدے حق راکھویں نے '''",
-'longpagewarning' => "'''Ûوشیار: اے صÙØ­Û $1 کلوبائیٹ لمبا اے؛ Ú©Ú†Ú¾ کھوجیاں نو 32 کلوبائیٹ توں لمبے صÙØ­Û’ لکھنا یا Ù¾Ûنچنا Ù…Ø³Ø¦Ù„Û Ûوندا اے۔ <br />
-اس صÙØ­Û Ù†ÙˆÚº چھوٹے ٹوٹیاں Ú† تقسیم کرن دے بارے Ú† سوچ لو۔'''",
'templatesused' => 'اس صÙØ­Û’ تے ورتے Ú¯Û“ {{PLURAL:$1|سانچے|سانچÛ}}:',
'templatesusedpreview' => 'اس Ú©Ú†Û’ Ú©Ù… تے ورتے گئے {{PLURAL:$1|سانچے|سانچÛ}} :',
'templatesusedsection' => 'اس ٹوٹے چ استعمال کیتے گۓ سچے:',
@@ -650,28 +637,28 @@ $messages = array(
'recentchangeslinked-to' => 'Ú©Ú¾Ù„Û’ ÛÙˆÛ“ صÙØ­Û’ دی بجاۓ ایدے نال جڑے صÙØ­Û’ دیاں نویاں تبدیلیاں وکھاؤ',
# Upload
-'upload' => 'Ùائل چڑھاؤ',
-'uploadbtn' => 'Ùائل چڑھاؤ',
-'reuploaddesc' => 'Ùائل چڑانا Ú†Ú¾Ú‘Ùˆ تے Ùائل چڑانے آلے Ùارم تے واپس ٹرو',
-'uploadnologin' => 'لاگ ان نئیں ÛÙˆÛ“',
-'uploaderror' => 'Ùائل چڑاندیاں مسئلا Ûویا اے',
-'uploadlogpage' => 'اپلوڈ لاگ',
-'filename' => 'Ùائل دا ناں',
-'filedesc' => 'خلاصÛ',
-'fileuploadsummary' => 'خلاصÛ:',
-'filesource' => 'ذریعÛ:',
-'uploadedfiles' => 'اتے چڑھائیاں گئیاں Ùائلاں',
-'successfulupload' => 'Ùائل Ú†Ú‘Ú¾ گئی اے',
-'uploadwarning' => 'Ùائل چڑانے توں خبردار',
-'savefile' => 'Ùائل بچاؤ',
-'uploadedimage' => 'چڑھائی گئی"[[$1]]"',
-'uploaddisabled' => 'Ùائل چڑانا بند اے',
-'uploaddisabledtext' => 'Ùائل چڑانے Ú† رکاوٹ اے۔',
-'uploadvirus' => 'اس Ùائل Ú† وائرس اے! تÙصیل: $1',
-'sourcefilename' => 'Ùائل دے ذریعے دا ناں:',
-'destfilename' => 'ÙˆÚ©ÛŒ دے اتے Ùائل دا ناں:',
-'upload-maxfilesize' => 'Ùائل دا Ø²ÙŠØ§Ø¯Û ØªÙˆÚº Ø²ÙŠØ§Ø¯Û Ù†Ø§Ù¾: $1',
-'watchthisupload' => 'اس صÙØ­Û’ تے نظر رکھو',
+'upload' => 'Ùائل چڑھاؤ',
+'uploadbtn' => 'Ùائل چڑھاؤ',
+'reuploaddesc' => 'Ùائل چڑانا Ú†Ú¾Ú‘Ùˆ تے Ùائل چڑانے آلے Ùارم تے واپس ٹرو',
+'uploadnologin' => 'لاگ ان نئیں ÛÙˆÛ“',
+'uploaderror' => 'Ùائل چڑاندیاں مسئلا Ûویا اے',
+'uploadlogpage' => 'اپلوڈ لاگ',
+'filename' => 'Ùائل دا ناں',
+'filedesc' => 'خلاصÛ',
+'fileuploadsummary' => 'خلاصÛ:',
+'filesource' => 'ذریعÛ:',
+'uploadedfiles' => 'اتے چڑھائیاں گئیاں Ùائلاں',
+'uploadwarning' => 'Ùائل چڑانے توں خبردار',
+'savefile' => 'Ùائل بچاؤ',
+'uploadedimage' => 'چڑھائی گئی"[[$1]]"',
+'uploaddisabled' => 'Ùائل چڑانا بند اے',
+'uploaddisabledtext' => 'Ùائل چڑانے Ú† رکاوٹ اے۔',
+'uploadvirus' => 'اس Ùائل Ú† وائرس اے! تÙصیل: $1',
+'sourcefilename' => 'Ùائل دے ذریعے دا ناں:',
+'destfilename' => 'ÙˆÚ©ÛŒ دے اتے Ùائل دا ناں:',
+'upload-maxfilesize' => 'Ùائل دا Ø²ÙŠØ§Ø¯Û ØªÙˆÚº Ø²ÙŠØ§Ø¯Û Ù†Ø§Ù¾: $1',
+'watchthisupload' => 'اس صÙØ­Û’ تے نظر رکھو',
+'upload-success-subj' => 'Ùائل Ú†Ú‘Ú¾ گئی اے',
'upload-proto-error' => 'غلط پروٹوکول',
'upload-file-error' => 'اندر دا مسئلا',
@@ -858,7 +845,6 @@ $messages = array(
# Watchlist
'watchlist' => 'میریاں اکھاں تھلے وچ',
'mywatchlist' => 'میری نظر وچ',
-'watchlistfor' => "('''$1''' لئی)",
'addedwatch' => 'اکھ تھلے آگیا',
'addedwatchtext' => 'اے صÙØ­Û "[[:$1]] تواڈیاں اکھاں تھلے آگیا اے۔<br />
مستقبل ÙˆÚ† اس صÙØ­Û ØªÛ’ ایدے بارے Ú† Ú¯Ù„ بات نویاں تبدیلیاں ÙˆÚ† موٹے نظر آن Ú¯Û’ تا Ú©Û Ø¢Ø³Ø§Ù†ÛŒ نال کھوجیا جا سکے۔',
@@ -1200,9 +1186,9 @@ $messages = array(
'nextdiff' => 'نویں لکھائی →',
# Media information
-'file-info-size' => '(پکسل:$1 × $2, Ùائل سائز: $3, مائم ٹائپ: $4)',
+'file-info-size' => 'پکسل:$1 × $2, Ùائل سائز: $3, مائم ٹائپ: $4',
'file-nohires' => '<small>اس توں ÙˆÚˆÛŒ Ùوٹو موجود Ù†Ûیں۔</small>',
-'svg-long-desc' => '(ایس ÙˆÛŒ جی Ùائل، پکسل:$1 × $2ØŒ Ùائل سائز: $3)',
+'svg-long-desc' => 'ایس ÙˆÛŒ جی Ùائل، پکسل:$1 × $2ØŒ Ùائل سائز: $3',
'show-big-image' => 'وڈی مورت',
'show-big-image-thumb' => '<small>کچے کم دے پکسل:$1 × $2</small>',
diff --git a/languages/messages/MessagesPnt.php b/languages/messages/MessagesPnt.php
index 4b38efa7..c0dd0449 100644
--- a/languages/messages/MessagesPnt.php
+++ b/languages/messages/MessagesPnt.php
@@ -168,30 +168,19 @@ $messages = array(
'faqpage' => 'Project:Πολλά εÏωτήσεις (FAQ)',
# Vector skin
-'vector-action-delete' => 'Σβήσον',
-'vector-action-move' => 'ΕτεÏοχλάεμαν',
-'vector-action-protect' => 'Ασπάλιγμαν',
-'vector-action-undelete' => 'Κλώσιμον',
-'vector-action-unprotect' => 'Άνοιγμαν',
-'vector-namespace-category' => 'ΚατηγοÏίαν',
-'vector-namespace-help' => 'Σελίδα βοήθειας',
-'vector-namespace-image' => 'ΑÏχείον',
-'vector-namespace-main' => 'Σελίδαν',
-'vector-namespace-media' => 'Σελίδα μεσίων',
-'vector-namespace-mediawiki' => 'Μένεμαν',
-'vector-namespace-project' => 'Σχετικά με',
-'vector-namespace-special' => 'Ειδικόν σελίδαν',
-'vector-namespace-talk' => 'Καλάτσεμαν',
-'vector-namespace-template' => 'ΠÏότυπον',
-'vector-namespace-user' => 'Σελίδαν χÏήστε',
-'vector-view-create' => 'Ποίσον',
-'vector-view-edit' => 'Άλλαξον',
-'vector-view-history' => 'ΤεÏέστεν ιστοÏίαν',
-'vector-view-view' => 'Δεάβασον',
-'vector-view-viewsource' => 'ΤεÏέστεν κωδικόν',
-'actions' => 'ΕνέÏγειας',
-'namespaces' => 'ΠεÏιοχάς',
-'variants' => 'ΠαÏαλλαγάς',
+'vector-action-delete' => 'Σβήσον',
+'vector-action-move' => 'ΕτεÏοχλάεμαν',
+'vector-action-protect' => 'Ασπάλιγμαν',
+'vector-action-undelete' => 'Κλώσιμον',
+'vector-action-unprotect' => 'Άνοιγμαν',
+'vector-view-create' => 'Ποίσον',
+'vector-view-edit' => 'Άλλαξον',
+'vector-view-history' => 'ΤεÏέστεν ιστοÏίαν',
+'vector-view-view' => 'Δεάβασον',
+'vector-view-viewsource' => 'ΤεÏέστεν κωδικόν',
+'actions' => 'ΕνέÏγειας',
+'namespaces' => 'ΠεÏιοχάς',
+'variants' => 'ΠαÏαλλαγάς',
'errorpagetitle' => 'Λάθος',
'returnto' => 'ΕπιστÏοφήν σο $1.',
@@ -359,7 +348,7 @@ $messages = array(
'yourname' => 'Όνεμαν χÏήστε:',
'yourpassword' => 'Σημάδι:',
'yourpasswordagain' => "Ξαν' γÏάψτεν το σημάδι:",
-'remembermypassword' => "Αποθήκεμαν τη σημαδίμ σ' αβοÏτον τον υπολογιστήν",
+'remembermypassword' => "Αποθήκεμαν τη σημαδίμ σ' αβοÏτον τον υπολογιστήν (για μέγιστον $1 {{PLURAL:$1|ημέÏαν|ημέÏας}})",
'yourdomainname' => 'Το domain εσοÏν:',
'login' => 'Εμπάτε',
'nav-login-createaccount' => 'Εμπάτεν / ποισέστεν λογαÏίαν',
@@ -375,6 +364,7 @@ $messages = array(
'gotaccount' => "ΛογαÏίαν έχετε; '''$1'''.",
'gotaccountlink' => 'Εμπάτε',
'createaccountmail' => 'με ελεκτÏονικόν μένεμαν',
+'createaccountreason' => 'Λόγον:',
'badretype' => "Τα σημάδε ντ' εγÏάψετεν 'κ ταιÏιάζνε.",
'userexists' => "Τ' όνεμαν έχ' ατό άλλος χÏήστες.
Βαλέστε άλλον όνεμαν.",
@@ -535,7 +525,6 @@ $messages = array(
Εάν 'κ θέλετε ατό να ίνεται, να μην εφτάτε το αποθήκεμαν.<br />
Καμίαν κι ανασπάλλετε: Αδακά 'κ εν ο τόπον για να θέκουμε γÏάψιμον ντ' έγÏαψαν αλλ. Βαλέστε άÏθÏα όνταν κατέχετε τα δικαιώματα πνευματί μαναχόν.
'''ΚΑΜΙΑΠ'Κ ΘΕΚΕΤΕ ΓΡΑΨΙΜΟΠΑΔΑΚΑ ΟÎΤΕΣ 'Κ ΕΧΕΤΕ ΤΑ ΔΙΚΑΙΩΜΑΤΑ ΠÎΕΥΜΑΤΙ!'''",
-'longpagewarning' => "'''ΩΡΙΑ: ΑβοÏτεν η σελίδαν έχ' μέγεθος $1 kb. ΜεÏικά browser 'κ εποÏοÏν ν' επεξεÏγάσκουνταν σελίδας ντ' έχνε 32 kb κιαν. ΕποÏείτε να λÏετε το Ï€Ïόβλημαν αν εφτάτεν ατέναν μικÏά κομμάται.'''",
'templatesused' => "{{PLURAL:$1|ΠÏότυπον|ΠÏότυπα}} το μεταχειÏίσκουνταν σ' αβοÏτεν την σελίδαν:",
'templatesusedpreview' => "{{PLURAL:$1|ΠÏότυπον|ΠÏότυπα}} σ' αβοÏτον το Ï€Ïώτον τέÏεμαν:",
'template-protected' => '(ασπαλιγμένον)',
@@ -992,7 +981,6 @@ $messages = array(
# Watchlist
'watchlist' => "Σελίδας ντ' ωÏιάζω",
'mywatchlist' => "Σελίδας ντ' ωÏιάζω",
-'watchlistfor' => "(για '''$1''')",
'watchnologin' => "'Κ είστουν συνδεμένος",
'addedwatch' => 'Εθέκεν σην λίσταν ωÏιαγματί',
'addedwatchtext' => "Η σελίδαν \"[[:\$1]]\" επήγεν σον [[Special:Watchlist|κατάλογον οÏιαγματί]] εσοÏν.
@@ -1314,9 +1302,9 @@ $messages = array(
# Media information
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|σελίδα|σελίδας}}',
-'file-info-size' => '($1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3, MIME Ï„Ïπον: $4)',
+'file-info-size' => '$1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3, MIME Ï„Ïπον: $4',
'file-nohires' => "<small>'Κ εχ κι άλλο ψηλόν ανάλυσην.</small>",
-'svg-long-desc' => "(ΑÏχείον SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχεί: $3)",
+'svg-long-desc' => "ΑÏχείον SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχεί: $3",
'show-big-image' => 'Τζιπ Ï„Ïανόν ανάλυση',
'show-big-image-thumb' => "<small>Μέγεθος τη Ï€ÏÏŽÏ„' τεÏεματί: $1 × $2 εικονοστοιχεία</small>",
diff --git a/languages/messages/MessagesPrg.php b/languages/messages/MessagesPrg.php
index 0b223997..6b5fe579 100644
--- a/languages/messages/MessagesPrg.php
+++ b/languages/messages/MessagesPrg.php
@@ -27,8 +27,7 @@ $messages = array(
'tog-editsection' => 'ErmazÄ«nginais redigÄ«snan stÄ“isan pÄusas sekciÅnin pra "[redigÄ«s]" autengÄ«nsenin',
'tog-editsectiononrightclick' => 'ErmazÄ«nginais redigÄ«snan stÄ“isan pÄusas sekciÅnin pra tikrÅman pellis knuppas gnesnan na tenesses tÄ«telin',
'tog-showtoc' => 'Waidinnais Ä“nturas listin (en pÄusamans sen tÅ«ls nikÄi 3 sirzdatÄ«telins)',
-'tog-rememberpassword' => 'Paminnais enÄ“isenes infÅrmaciÅnins en Å¡ismu kÅmputerin',
-'tog-editwidth' => 'Paplattinais redigÄ«snas laÅ«kan en pastippan ekrÄnas plattu',
+'tog-rememberpassword' => 'Paminnais enÄ“isenes infÅrmaciÅnins en Å¡ismu kÅmputerin (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'PreidÄis pÄusans kawÄ«dans as teÄ«ke prei majjan listin stÄ“isan nadirÄ«tan',
'tog-watchdefault' => 'PreidÄis pÄusans kawÄ«dans as redigijja prei majjan listin stÄ“isan nadirÄ«tan',
'tog-watchmoves' => 'PreidÄis pÄusans, kawÄ«dans as praskajjina prei majjan listin stÄ“isan nadirÄ«tan',
@@ -168,29 +167,18 @@ PÄusai en kategÅrijai "$1"',
'faqpage' => 'Project:Ukadeznai prasīsenei',
# Vector skin
-'vector-action-delete' => 'Ä€upausinais',
-'vector-action-move' => 'Prapīdais',
-'vector-action-protect' => 'KÅ«nsteis',
-'vector-action-unprotect' => 'Etkūnteis',
-'vector-namespace-category' => 'KategÅrija',
-'vector-namespace-help' => 'Pagalbas pÄusan',
-'vector-namespace-image' => 'ZÅ«rbrukis',
-'vector-namespace-main' => 'PÄusan',
-'vector-namespace-media' => 'Median pÄusan',
-'vector-namespace-mediawiki' => 'Waīstis',
-'vector-namespace-project' => 'PrÅjaktas pÄusan',
-'vector-namespace-special' => 'SpeciÄlin pÄusan',
-'vector-namespace-talk' => 'DiskusiÅni',
-'vector-namespace-template' => 'Å ablÅni',
-'vector-namespace-user' => 'TÄ“rpautajas pÄusan',
-'vector-view-create' => 'Teīkeis',
-'vector-view-edit' => 'Redigīs',
-'vector-view-history' => 'Enwaidinnais istÅrijan',
-'vector-view-view' => 'SkaitÄis',
-'vector-view-viewsource' => 'Enwaidinnais appun',
-'actions' => 'DÄ«lasenei',
-'namespaces' => 'TÄ«telin plattibis',
-'variants' => 'WarjÄntai',
+'vector-action-delete' => 'Ä€upausinais',
+'vector-action-move' => 'Prapīdais',
+'vector-action-protect' => 'KÅ«nsteis',
+'vector-action-unprotect' => 'Etkūnteis',
+'vector-view-create' => 'Teīkeis',
+'vector-view-edit' => 'Redigīs',
+'vector-view-history' => 'Enwaidinnais istÅrijan',
+'vector-view-view' => 'SkaitÄis',
+'vector-view-viewsource' => 'Enwaidinnais appun',
+'actions' => 'DÄ«lasenei',
+'namespaces' => 'TÄ«telin plattibis',
+'variants' => 'WarjÄntai',
'errorpagetitle' => 'BlÄnda',
'returnto' => 'Etwartinnais si en pÄusan $1.',
@@ -407,7 +395,7 @@ Ni izmīrstais kitawīdintun Twajjans [[Special:Preferences|pirminiskwans per {{
'yourname' => 'TwajÄ tÄ“rpautajas pabilisnÄ:',
'yourpassword' => 'TwÄjs kliptaswÄ«rds:',
'yourpasswordagain' => 'Āntrinais kliptaswīrdan',
-'remembermypassword' => 'Paminnais majjans enÄ“isnas infÅrmaciÅnins en Å¡ismu kÅmputerin',
+'remembermypassword' => 'Paminnais majjans enÄ“isnas infÅrmaciÅnins en Å¡ismu kÅmputerin (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'TwajÄ dÅmeni:',
'externaldberror' => 'Tikka izwinandas autentikÄntin dÄtanbazin blÄnda, anga ni assei enwarÄ«ntan kÄi etnÄuninlai twajjan izwinandan rekkenan.',
'login' => 'Enjaīs',
@@ -605,7 +593,7 @@ IzbÄndais, anga tÅ« perarwi kwaitÄ«wuns teÄ«ktun/redigÄ«tun Å¡in pÄusan.',
'usercsspreview' => "'''Paminnais, kÄi sta ast tÄ“r twÄise CSS pirmÄdira - nika dabber ni pastÄi enpeisÄtan!'''",
'userjspreview' => "'''Paminnais, kÄi sta ast tÄ“r twÄise JS kÅdas pirmÄdira - nika dabber ni pastÄi enpeisÄtan!'''",
'userinvalidcssjstitle' => "'''Ēmpirssergīsenis:''' Ni ast prusna \"\$1\".
-Paminnais kÄi tÄ“rpautajas .css be .js pÄusai turri pagaÅ«tun si sen lÄ«kutan litteran, p. e.g. {{ns:user}}:Foo/monobook.css, ni {{ns:user}}:Foo/Monobook.css.",
+Paminnais kÄi tÄ“rpautajas .css be .js pÄusai turri pagaÅ«tun si sen lÄ«kutan litteran, p. e.g. {{ns:user}}:Foo/vector.css, ni {{ns:user}}:Foo/Vector.css.",
'updated' => '(Ernaunīntan)',
'note' => "'''Endirīsenis:'''",
'previewnote' => "'''Sta ast tÄ“r pirmÄdira.'''
@@ -644,9 +632,6 @@ TÅ« dÄ«gi pataÅ«kina, kÄi tÅ« peisÄi din subs, anga kÅpi iz \"public domain\"
Ik tÅ« ni kwaitÄ“i, kÄi twÄjs teksts bÅ«lai ebwÄ«rpai kitawÄ«dintan, be paplattintan pra eraÄ«nan, ni endÄ«s din stwi.
TÅ« dÄ«gi pataÅ«kina, kÄi tÅ« peisÄi din subs, anga kÅpi iz \"public domain\" anga kittan pawÄ«rpan appun (wÄ«dais dÄ«gi \$1).
'''Ni endÄ«s materiÄlin kÅ«nstan sen autÅras tikrÅmin Å¡lÄit waldÄ«tajas preiwÄ“rpsenin!'''",
-'longpagewarning' => "'''EmpirssergÄ«senis:''' Å in pÄusan ast $1 kilÅbaitan ilgan;
-ainuntas lasÄtlas mazzi turÄ«tun prÅblamans redigÄ«ntei pÄusans tÄuwu, anga ilgaisins nikÄi 32kb.
-Ik sta bÅ«lai mazÄ«ngi, spÄ“llais pÄusan en mazzaisins delÄ«kans.",
'longpageerror' => "'''BlÄnda!''' Teksts enwests prÅ tin turri {{PLURAL:$1|1 kilÅbaitan|$1 kilÅbaitans}}, ka ast ilgaisin nikÄi preiwÄ“rptai {{PLURAL:$2|1 kilÅbaits|$2 kilÅbaitai}}.
Teksts ni mazzi bÅ«twei enpeisÄtan.",
'protectedpagewarning' => "'''Ä’mpirssergÄ«senis: Å in pÄusan pastÄi pakÅ«nstan. TÄ“r tÄ“rpautajai sen perwaldÄ«tajas enwarÄ«nsenin mazzi din redigÄ«tun.'''",
@@ -994,7 +979,7 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
'prefs-advancedrendering' => 'Ä’mpirsin treppuÅ¡as opciÅnis',
'prefs-advancedsearchoptions' => 'Ä’mpirsin treppuÅ¡as opciÅnis',
'prefs-advancedwatchlist' => 'Ä’mpirsin treppuÅ¡as opciÅnis',
-'prefs-display' => 'WaidÄ«nsnas opciÅnis',
+'prefs-displayrc' => 'WaidÄ«nsnas opciÅnis',
# User rights
'userrights' => 'PerwÄldais enwarÄ«nsenins stÄ“isan tÄ“rpautajan',
@@ -1143,13 +1128,9 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
'recentchanges-legend' => 'Panzdauman kitawīdinsnan mazīngiskwas',
'recentchangestext' => 'Å in pÄusan waidinna listin stÄ“isan panzdauman kitawÄ«dinsnan en Å¡issei wiki.',
'recentchanges-feed-description' => 'NadirÄ“is ukanÄunaisins kitawÄ«disnans en Å¡issei wiki.',
-'recentchanges-legend-newpage' => '$1 - nÄunan pÄusan',
'recentchanges-label-newpage' => 'Å is redigÄ«senis ast teÄ«kuns nÄunan pÄusan',
-'recentchanges-legend-minor' => '$1 - malks redigīsenis',
'recentchanges-label-minor' => 'Sta ast malks redigīsenis',
-'recentchanges-legend-bot' => '$1 - bÅtas redigÄ«senis',
'recentchanges-label-bot' => 'Sta ast redigÄ«senis segÄ«tan pra bÅtan',
-'recentchanges-legend-unpatrolled' => '$1 - niizbandÄts redigÄ«senis',
'recentchanges-label-unpatrolled' => 'Å is redigÄ«senis ni ast dabber izbandÄtan',
'rcnote' => "Zemmais ast {{PLURAL:$1|'''1''' kitawīdinsna segīta|panzdaumas '''$1''' kitawīdinsnas segītas}} en panzdaumamans {{PLURAL:$2|dēinan|'''$2''' dēinans}}, gīrbawintei ezze $5, $4.",
'rcnotefrom' => "Zemmais ast kitawīdisnas ezze '''$2''' (ērgi '''$1''' waidīntan).",
@@ -1253,7 +1234,6 @@ Ik tÅ« ainatÄ«ngi kwaitÄ“i enkraÅ«tun Å¡in zÅ«rbrukin, ettreppais be tÄ“rpaus nÄ
'file-exists-duplicate' => 'Å is zÅ«rbrukis ast kÅpija {{PLURAL:$1|Å¡isse zÅ«rbrukin|Å¡Ä“isan zÅ«rbrukin}}:',
'file-deleted-duplicate' => 'ZÅ«rbrukis idÄ“ntiskas sen Å¡in zÅ«rbrukin ([[:$1]]) pastÄi ankstÄis Äupausintan.
Pirzdau tÄlis Ä“isnan, tebbei prawerru izbandÄtun Å¡isse zÅ«rbrukes Äupausinsenin istÅrijan.',
-'successfulupload' => 'Zūrbrukes enkraūsenis izpalla',
'uploadwarning' => 'Ēmpirssergīsenis ezze enkraūsnan',
'uploadwarning-text' => 'Madli kitawÄ«dinais zÅ«rbukes ebpeisÄsenis be bandais etkÅ«mps',
'savefile' => 'EnpeisÄis zÅ«rbrukin',
@@ -1281,6 +1261,7 @@ Tebbei prawerru prestun, anga ast tikrÅmiskan Ä“mpirsin sadÄ«ntun enkraÅ«tun Å¡
Å isse zÅ«rbrukes Äupausisnas registerin ast waidÄ«ntan zemmais.",
'filename-bad-prefix' => "EnkraÅ«tas zÅ«rbrukes pabilisnÄ pagaÅ«ne si sen '''\"\$1\"'''. Sta ast nidekskriptÄ«wa pabilisnÄ kawÄ«da ast preipeisÄtan autÅmatiskai pra digitÄlins kÄmerans.
Madli etrÄ«nkais swajasmu zÅ«rbrukin spÄrtais deskriptÄ«wan pabilÄ«snan.",
+'upload-success-subj' => 'Zūrbrukes enkraūsenis izpalla',
'upload-proto-error' => 'NitikrÅmiskan prÅtokulin',
'upload-proto-error-text' => 'IztÄliska enkraÅ«sna izkinina, kÄi URL adressi pagaÅ«lai si sen <code>http://</code> anga <code>ftp://</code>.',
@@ -1429,7 +1410,6 @@ TÄ“rpausna: Ä“nturas_tÄ«ps/pÅtips, perw. <tt>image/jpeg</tt>.',
'statistics-edits-average' => 'Sirzds gÄ«rbis stÄ“isan redigÄ«senin per pÄusan',
'statistics-views-total' => 'GÄ«rbis wisÄ“isan kÄimalukisenei:',
'statistics-views-peredit' => 'GÄ«rbis stÄ“isan kÄimalukisenin per redigÄ«senin',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue endÄsnan rÄ«kas] ilgan',
'statistics-users' => 'Registrītai [[Special:ListUsers|tērpautajai]]',
'statistics-users-active' => 'Aktīwai tērpautajai',
'statistics-users-active-desc' => 'Tērpautajai sēntei aktīwai en {{PLURAL:$1|panzdauman dēinan|panzdaumans dēinans}}',
@@ -1444,7 +1424,7 @@ PÄusan ast laikÄtan per ainapreslinsnan pÄusan ik tennan tÄ“rpaui Å¡ablÅnin
'doubleredirects' => 'Dwiggubai prawessenei',
'doubleredirectstext' => 'Zemmais ast listi wisÄ“isan pÄusan sen prawessenins en pÄusans, kawÄ«dai prawedda en kittan pÄusan.
ErainÄ rindÄ turri Ä“n sen autengÄ«nsenins en pirman be Äntran prawessenin, tÄ«t dÄ«gi autengÄ«nsenin kwÄ“i wedda Äntars prawessenis. JÄuku panzdaums autengÄ«nsenin wedda en pÄusan, en kawÄ«dan prawerru prawestun pirmasmu pÄusan.
-<s>PraglaubÄtai</s> prawessenei ast reparÄ«tan.',
+<del>PraglaubÄtai</del> prawessenei ast reparÄ«tan.',
'double-redirect-fixed-move' => 'pÄusan [[$1]] pastÄi praskajjintan.
Teinū tennan prawedda prei [[$2]].',
'double-redirect-fixer' => 'Prawessenin tikrintajs',
@@ -1644,7 +1624,6 @@ E-mail adressi kawÄ«dan tÅ« enpeisÄi en [[Special:Preferences|twajjans pirminis
# Watchlist
'watchlist' => 'Listi stēisan nadirītan',
'mywatchlist' => 'Listi stēisan nadirītan',
-'watchlistfor' => "(per '''$1''')",
'nowatchlist' => 'TwajÄ listi stÄ“isan nadirÄ«tan pÄusan ast pÄustan.',
'watchlistanontext' => 'Madli $1, kÄi widÄlai elÄmentans stesse listin stÄ“isan nadirÄ«tan.',
'watchnologin' => 'Ni assei engūbun',
@@ -1921,7 +1900,6 @@ JaÄ«s en [[Special:IPBlockList|listin stÄ“isan IP adressin]] kai widÄlai blÅki
'ipb-edit-dropdown' => 'RedigÄ«s blÅkisenes brewÄ«nslins',
'ipb-unblock-addr' => 'EtblÅkis $1',
'ipb-unblock' => 'EtblÅkis tÄ“rpautajas pabilÄ«snan anga IP adressin',
-'ipb-blocklist-addr' => 'EkzistÄ«ntei $1 blÅkisenei',
'ipb-blocklist' => 'WÄ«dais ekzistÄ«ntins blÅkisenins',
'ipb-blocklist-contribs' => '$1 endīja',
'unblockip' => 'EtblÅkis tÄ“rpautajan',
@@ -2333,10 +2311,10 @@ Enskattintei din, tÅ« mazzi Ärditun twajjan sistÄ“man.",
'imagemaxsize' => "ArÄikinais bildin debban:<br />''(per zÅ«rbrukes ebpeisÄsenes pÄusans)''",
'thumbsize' => 'Miniatūris debban:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pÄusan|pÄusai}}',
-'file-info' => '(zūrbrukes debban: $1, MIME tīps: $2)',
-'file-info-size' => '($1 × $2 pikselai, zūrbrukes debban: $3, MIME tīps: $4)',
+'file-info' => 'zūrbrukes debban: $1, MIME tīps: $2',
+'file-info-size' => '$1 × $2 pikselai, zūrbrukes debban: $3, MIME tīps: $4',
'file-nohires' => '<small>MÅ«isesa rezÅluciÅni ni ast preiÄ“iminan.</small>',
-'svg-long-desc' => '(SVG zÅ«rbrukis, nÅminalai $1 × $2 pikselai, debban: $3)',
+'svg-long-desc' => 'SVG zÅ«rbrukis, nÅminalai $1 × $2 pikselai, debban: $3',
'show-big-image' => 'PilnÄ rezÅluciÅni',
'show-big-image-thumb' => '<small>PirmÄdiras debban: $1 × $2 pikselai</small>',
'file-info-gif-looped' => 'kalpenintan',
diff --git a/languages/messages/MessagesPs.php b/languages/messages/MessagesPs.php
index 20cd7711..46fa7cf0 100644
--- a/languages/messages/MessagesPs.php
+++ b/languages/messages/MessagesPs.php
@@ -39,52 +39,58 @@ $namespaceAliases = array(
$specialPageAliases = array(
'Userlogin' => array( 'ننوتل' ),
'Userlogout' => array( 'وتل' ),
- 'CreateAccount' => array( 'کارن-حساب جوړول' ),
- 'Preferences' => array( 'غوره توبونه' ),
- 'Watchlist' => array( 'کتنلړليک' ),
- 'Recentchanges' => array( 'اوسني بدلونونه' ),
- 'Upload' => array( 'پورته کول' ),
- 'Listfiles' => array( 'د انÚورونو لړليک' ),
- 'Newimages' => array( 'نوي انÚورونه' ),
- 'Listusers' => array( 'د کارونکو لړليک' ),
- 'Randompage' => array( 'ناټاکلی، ناټاکلی مخ' ),
- 'Lonelypages' => array( 'يتيم مخونه' ),
- 'Uncategorizedpages' => array( 'ناوÛشلي مخونه' ),
- 'Uncategorizedcategories' => array( 'ناوÛØ´Ù„Û ÙˆÛشنيزÛ' ),
- 'Uncategorizedimages' => array( 'ناوÛشلي انÚورونه، ناوÛØ´Ù„Û Ø¯ÙˆØªÙ†Û' ),
- 'Uncategorizedtemplates' => array( 'ناوÛØ´Ù„Û Ú©ÙŠÙ†Ú‰Û' ),
- 'Unusedcategories' => array( 'ناکارÛدلي ÙˆÛشنيزÛ' ),
- 'Unusedimages' => array( 'ناکارÛØ¯Ù„Û Ø¯ÙˆØªÙ†Û' ),
- 'Wantedcategories' => array( 'ØºÙˆÚšØªÙ„Û ÙˆÛشنيزÛ' ),
- 'Wantedfiles' => array( 'ØºÙˆÚšØªÙ„Û Ø¯ÙˆØªÙ†Û' ),
- 'Wantedtemplates' => array( 'ØºÙˆÚšØªÙ„Û Ú©ÙŠÙ†Ú‰Û' ),
- 'Shortpages' => array( 'لنډ مخونه' ),
- 'Longpages' => array( 'اوږده مخونه' ),
- 'Newpages' => array( 'نوي مخونه' ),
- 'Ancientpages' => array( 'لرغوني مخونه' ),
- 'Protectedpages' => array( 'ژغورلي مخونه' ),
- 'Protectedtitles' => array( 'ژغورلي سرليکونه' ),
- 'Allpages' => array( 'ټول مخونه' ),
- 'Specialpages' => array( 'Úانګړي مخونه' ),
+ 'CreateAccount' => array( 'کارن-حساب_جوړول' ),
+ 'Preferences' => array( 'غوره_توبونه' ),
+ 'Watchlist' => array( 'کتنلړ' ),
+ 'Recentchanges' => array( 'اوسني_بدلونونه' ),
+ 'Upload' => array( 'پورته_کول' ),
+ 'Listfiles' => array( 'د_انÚورونو_لړليک' ),
+ 'Newimages' => array( 'نوي_انÚورونه' ),
+ 'Listusers' => array( 'د_کارنانو_لړليک' ),
+ 'Statistics' => array( 'شمار' ),
+ 'Randompage' => array( 'ناټاکلی،_ناټاکلی_مخ' ),
+ 'Lonelypages' => array( 'يتيم_مخونه' ),
+ 'Uncategorizedpages' => array( 'ناوÛشلي_مخونه' ),
+ 'Uncategorizedcategories' => array( 'ناوÛشلÛ_ÙˆÛشنيزÛ' ),
+ 'Uncategorizedimages' => array( 'ناوÛشلي_انÚورونه،_ناوÛشلÛ_دوتنÛ' ),
+ 'Uncategorizedtemplates' => array( 'ناوÛشلÛ_کينډÛ' ),
+ 'Unusedcategories' => array( 'ناکارÛدلي_ÙˆÛشنيزÛ' ),
+ 'Unusedimages' => array( 'ناکارÛدلÛ_دوتنÛ' ),
+ 'Wantedcategories' => array( 'غوښتلÛ_ÙˆÛشنيزÛ' ),
+ 'Wantedfiles' => array( 'غوښتلÛ_دوتنÛ' ),
+ 'Wantedtemplates' => array( 'غوښتلÛ_کينډÛ' ),
+ 'Shortpages' => array( 'لنډ_مخونه' ),
+ 'Longpages' => array( 'اوږده_مخونه' ),
+ 'Newpages' => array( 'نوي_مخونه' ),
+ 'Ancientpages' => array( 'لرغوني_مخونه' ),
+ 'Protectedpages' => array( 'ژغورلي_مخونه' ),
+ 'Protectedtitles' => array( 'ژغورلي_سرليکونه' ),
+ 'Allpages' => array( 'ټول_مخونه' ),
+ 'Prefixindex' => array( 'د_مختاړيو_ليکلړ' ),
+ 'Ipblocklist' => array( 'د_بنديزلړليک' ),
+ 'Unblock' => array( 'بنديز_لرÛ_کول' ),
+ 'Specialpages' => array( 'Úانګړي_مخونه' ),
'Contributions' => array( 'ونډÛ' ),
- 'Booksources' => array( 'د کتاب سرچينÛ' ),
+ 'Booksources' => array( 'د_کتاب_سرچينÛ' ),
'Categories' => array( 'ÙˆÛشنيزÛ' ),
'Export' => array( 'صادرول' ),
'Version' => array( 'بڼه' ),
'Allmessages' => array( 'ټول-پيغامونه' ),
- 'Log' => array( 'يادښتونه، يادښت' ),
+ 'Log' => array( 'يادښتونه،_يادښت' ),
+ 'Blockip' => array( 'بنديز،_د_Ø¢ÛŒ_پي_بنديز،_بنديز_Ù„Ú«Ûدلی_کارن_Block' ),
'Undelete' => array( 'ناړنګول' ),
- 'Unwatchedpages' => array( 'ناکتلي مخونه' ),
- 'Unusedtemplates' => array( 'ناکارÛØ¯Ù„Û Ú©ÙŠÙ†Ú‰Û' ),
- 'Mypage' => array( 'زما پاڼه' ),
- 'Mytalk' => array( 'زما Ø®Ø¨Ø±Û Ø§ØªØ±Û' ),
+ 'Unwatchedpages' => array( 'ناکتلي_مخونه' ),
+ 'Unusedtemplates' => array( 'ناکارÛدلÛ_کينډÛ' ),
+ 'Mypage' => array( 'زما_پاڼه' ),
+ 'Mytalk' => array( 'زما_خبرÛ_اترÛ' ),
'Mycontributions' => array( 'زماونډÛ' ),
'Popularpages' => array( 'نامتومخونه' ),
'Search' => array( 'پلټنه' ),
- 'Resetpass' => array( 'پټنوم بدلول، پټنوم بيا پر Úای کول، د بيا پر Úای کولو پاسپورټ' ),
- 'Blankpage' => array( 'تش مخ' ),
- 'LinkSearch' => array( 'د ØªÚ“Ù†Û Ù¾Ù„Ù¼Ù†Ù‡' ),
- 'DeletedContributions' => array( 'Ú“Ù†Ú«Û Ø´ÙˆÙŠ ونډÛ' ),
+ 'Resetpass' => array( 'پټنوم_بدلول،_پټنوم_بيا_پر_Úای_کول،_د_بيا_پر_Úای_کولو_پاسپورټ' ),
+ 'Blankpage' => array( 'تش_مخ' ),
+ 'LinkSearch' => array( 'د_تړنÛ_پلټنه' ),
+ 'DeletedContributions' => array( 'Ú“Ù†Ú«Û_شوي_ونډÛ' ),
+ 'Badtitle' => array( 'ناسم_سرليک،_Badtitle' ),
);
$magicWords = array(
@@ -130,7 +136,7 @@ $magicWords = array(
'img_right' => array( '1', 'ÚšÙŠ', 'right' ),
'img_left' => array( '1', 'Ú©ÙŠÚ¼', 'left' ),
'img_none' => array( '1', 'Ù‡ÛÚ…', 'none' ),
- 'img_center' => array( '1', 'Ù…ÛÙ†ÚØŒ center', 'center', 'centre' ),
+ 'img_center' => array( '1', 'Ù…ÛÙ†ÚØŒ_center', 'center', 'centre' ),
'sitename' => array( '1', 'دوÛبÚÙŠ_نوم', 'SITENAME' ),
'server' => array( '0', 'پالنګر', 'SERVER' ),
'servername' => array( '0', 'دپالنګر_نوم', 'SERVERNAME' ),
@@ -144,7 +150,7 @@ $magicWords = array(
'hiddencat' => array( '1', '__پټه_ÙˆÛشنيزه__', '__HIDDENCAT__' ),
'pagesize' => array( '1', 'مخکچه', 'PAGESIZE' ),
'index' => array( '1', '__ليکلړ__', '__INDEX__' ),
- 'noindex' => array( '1', '__Ø¨Û Ù„ÙŠÚ©Ù„Ú“__', '__NOINDEX__' ),
+ 'noindex' => array( '1', '__بÛ_ليکلړ__', '__NOINDEX__' ),
'protectionlevel' => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
);
@@ -159,6 +165,7 @@ $defaultUserOptionOverrides = array(
$messages = array(
# User preference toggles
'tog-underline' => 'Ú©Ø±ÚšÙ†Û ØªÚ“Ù†Û:',
+'tog-highlightbroken' => 'د Ø¨Ú¼Û Ù…Ø§ØªÛ ØªÚ“Ù†Û <a href="" class="new">Ù„Ú©Ù‡ همدا</a> (بله چاره: Ù„Ú©Ù‡ همدا<a href="" class="internal">?</a>)',
'tog-justify' => 'پاراګراÙونه همجوليزول',
'tog-hideminor' => 'په وروستيو بدلونو Ú©Û ÙˆØ§Ú“Ù‡ سمونونه پټول',
'tog-hidepatrolled' => 'په وروستيو بدلونونو Ú©Û Ú…Ø§Ø±Ù„ Ø´ÙˆÛ Ø³Ù…ÙˆÙ†ÙˆÙ†Ù‡ پټول',
@@ -171,7 +178,7 @@ $messages = array(
'tog-editsection' => 'د [سمول] ØªÚ“Ù†Û Ù„Ù‡ لوري د ÙŠÙˆÛ Ù„ÙŠÚ©Ù†Û ÙŠÙˆÙ‡ برخه د سمون ÙˆÚ“ ګرÚول',
'tog-editsectiononrightclick' => 'د ÚšÙŠ Ú©Ù„ÛÚ© سره د سرليکونو د Ø¨Ø±Ø®Û Ø³Ù…ÙˆÙ† چارنول (جاواسکرÛپټ ته اړتيا)',
'tog-showtoc' => 'نيوليک ښکاره کول (د هغو مخونو لپاره Ú†Û Ù„Ù‡ Û³ نه Ú‰Ûر سرليکونه لري)',
-'tog-rememberpassword' => 'زما پټنوم Ù¾Ø¯Û Ú©Ù…Ù¾ÙŠÙˆÙ¼Ø± په ياد ولره!',
+'tog-rememberpassword' => 'زما کارن-نوم په Ø¯Û Ú©ØªÙ†Ù…Ù„ (تر $1 {{PLURAL:$1|ورÚÛ|ورÚÙˆ}}) په ياد وساته!',
'tog-watchcreations' => 'هغه مخونه Ú†Û Ø²Ù‡ ÙŠÛ Ø¬ÙˆÚ“ÙˆÙ…ØŒ زما کتنلړ Ú©Û ÙˆØ±Ú«Ú‰ Ú©Ú“Ù‡',
'tog-watchdefault' => 'هغه مخونه Ú†Û Ø²Ù‡ ÙŠÛ Ø³Ù…ÙˆÙ…ØŒ زما کتنلړ Ú©Û ÙˆØ±Ú«Ú‰ Ú©Ú“Ù‡',
'tog-watchmoves' => 'هغه مخونه Ú†Û Ø²Ù‡ ÙŠÛ Ù„Ûږدوم، زما کتنلړ Ú©Û ÙˆØ±Ú«Ú‰ Ú©Ú“Ù‡',
@@ -187,6 +194,7 @@ $messages = array(
'tog-shownumberswatching' => 'د کتونکو کارنانو شمÛر ښکاره کول',
'tog-oldsig' => 'د شته لاسليک مخليدنه:',
'tog-fancysig' => 'لاسليک د ويکي متن په توګه په پام Ú©Û Ù†ÙŠÙˆÙ„ (د خپلکاره تړن د تړلو پرته)',
+'tog-showjumplinks' => 'د "ورټوپ Ú©Ú“Ù‡" د آسانتياوو ØªÚ“Ù†Û Ú†Ø§Ø±Ù†ÙˆÙ„',
'tog-uselivepreview' => 'Ú˜ÙˆÙ†Ø¯Û Ù…Ø®Ù„ÙŠØ¯Ù†Ù‡ کارول (جاوا سکرÛپټ ته اړتيا) (آزمÛښتي)',
'tog-forceeditsummary' => 'د يوه تش سمون لنډيز په ورکولو سره Ø¯Û Ø®Ø¨Ø± راکړل شي',
'tog-watchlisthideown' => 'په کتنلړ Ú©Û Ø²Ù…Ø§ Ø³Ù…ÙˆÙ†Û Ù¾Ù¼ÙˆÙ„',
@@ -311,30 +319,19 @@ $messages = array(
'faqpage' => 'Project:Ú‰-Ú-Ù¾',
# Vector skin
-'vector-action-addsection' => 'سرليکونه ورګډول',
-'vector-action-delete' => 'ړنګول',
-'vector-action-move' => 'Ù„Ûږدول',
-'vector-action-protect' => 'پروژه',
-'vector-action-undelete' => 'ناړنګول',
-'vector-action-unprotect' => 'ناژغورل',
-'vector-namespace-category' => 'ÙˆÛشنيزه',
-'vector-namespace-help' => 'لارښود مخ',
-'vector-namespace-image' => 'دوتنه',
-'vector-namespace-main' => 'مخ',
-'vector-namespace-media' => 'د Ø±Ø³Ù†Û Ù…Ø®',
-'vector-namespace-mediawiki' => 'پيغام',
-'vector-namespace-project' => 'د Ù¾Ø±ÙˆÚ˜Û Ù…Ø®',
-'vector-namespace-special' => 'Úانګړی مخ',
-'vector-namespace-talk' => 'Ø®Ø¨Ø±Û Ø§ØªØ±Û',
-'vector-namespace-template' => 'کينډÛ',
-'vector-namespace-user' => 'کارن مخ',
-'vector-view-create' => 'جوړول',
-'vector-view-edit' => 'سمول',
-'vector-view-history' => 'Ù¾Ûښليک کتل',
-'vector-view-view' => 'لوستل',
-'vector-view-viewsource' => 'سرچينه کتل',
-'actions' => 'Ú©Ú“Ù†Û',
-'namespaces' => 'نوم-تشيالونه',
+'vector-action-addsection' => 'سرليکونه ورګډول',
+'vector-action-delete' => 'ړنګول',
+'vector-action-move' => 'Ù„Ûږدول',
+'vector-action-protect' => 'پروژه',
+'vector-action-undelete' => 'ناړنګول',
+'vector-action-unprotect' => 'ناژغورل',
+'vector-view-create' => 'جوړول',
+'vector-view-edit' => 'سمول',
+'vector-view-history' => 'Ù¾Ûښليک کتل',
+'vector-view-view' => 'لوستل',
+'vector-view-viewsource' => 'سرچينه کتل',
+'actions' => 'Ú©Ú“Ù†Û',
+'namespaces' => 'نوم-تشيالونه',
'errorpagetitle' => 'تÛروتنه',
'returnto' => 'بÛرته $1 ته وګرÚÙ‡.',
@@ -395,6 +392,7 @@ $messages = array(
لطÙاً د Ø¯Û Ù…Ø® د کتلو د بيا Ù‡Ú…Û Ù†Ù‡ دمخه يو Ú…Ùˆ Ø´ÛØ¨Û ØµØ¨Ø± ÙˆÚ©Ú“Û.
$1',
+'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}} په اړه',
@@ -413,7 +411,7 @@ $1',
'policy-url' => 'Project:تګلاره',
'portal' => 'د Ù¼ÙˆÙ„Ù†Û ØªØ§Ù†Ø¨Ù‡',
'portal-url' => 'Project:د Ù¼ÙˆÙ„Ù†Û ØªØ§Ù†Ø¨Ù‡',
-'privacy' => 'د محرميت تګلاره',
+'privacy' => 'د پټنتيا تګلاره',
'privacypage' => 'Project:د محرميت_تګلاره',
'badaccess' => 'د Ù„Ø§Ø³Ø±Ø³Û ØªÛروتنه',
@@ -535,7 +533,8 @@ $1',
'yourname' => 'کارن-نوم:',
'yourpassword' => 'پټنوم:',
'yourpasswordagain' => 'پټنوم بيا وليکه',
-'remembermypassword' => 'زما پټنوم Ù¾Ø¯Û Ú©Ù…Ù¾ÙŠÙˆÙ¼Ø± په ياد ولره!',
+'remembermypassword' => 'زما پټنوم په Ø¯Û Ú©Ù…Ù¾ÙŠÙˆÙ¼Ø± (تر $1 {{PLURAL:$1|ورÚÛ|ورÚÙˆ}}) په ياد وساته!',
+'securelogin-stick-https' => 'وروسته د ننوتلو HTTPS سره تړلی Ù¾Ø§ØªÛ Ú©Ûدل',
'yourdomainname' => 'Ø³ØªØ§Ø³Û Ø´Ù¾ÙˆÙ„:',
'login' => 'ننوتل',
'nav-login-createaccount' => 'ننوتل / ګڼون جوړول',
@@ -551,6 +550,7 @@ $1',
'gotaccount' => 'آيا وار Ø¯Ù…Ø®Û ÙŠÙˆ ګڼون لری؟ $1.',
'gotaccountlink' => 'ننوتل',
'createaccountmail' => 'د برÛښليک له مخÛ',
+'createaccountreason' => 'سبب:',
'badretype' => 'دا پټنوم Ú†Û ØªØ§Ø³Û Ù„ÙŠÚ©Ù„ÛŒ د مخکني پټنوم سره ورته نه دی.',
'userexists' => 'کوم کارن نوم Ú†Û ØªØ§Ø³Û ÙˆØ±Ú©Ú“ هغه بل چا کارولی.
لطÙاً يو بل نوم وټاکÛ.',
@@ -576,6 +576,7 @@ $1',
'wrongpasswordempty' => 'ØªØ§Ø³Û Ù¾Ù¼Ù†ÙˆÙ… نه دی ليکلی. لطÙاً سر له نوي ÙŠÛ ÙˆÙ„ÙŠÚ©Û.',
'passwordtooshort' => 'بايد Ú†Û Ù¾Ù¼Ù†ÙˆÙ… مو Ù„Ú– تر Ù„Ú–Ù‡ {{PLURAL:$1|1 توری|$1 توري}} وي.',
'password-name-match' => 'Ø³ØªØ§Ø³Û Ù¾Ù¼Ù†ÙˆÙ… بايد Ø³ØªØ§Ø³Û Ø¯ کارن-نوم سره توپير ولري.',
+'password-login-forbidden' => 'د Ø¯Û Ú©Ø§Ø±Ù†-نوم او پټنوم په کارÛØ¯Ù†Û Ø¨Ù†Ø¯ÙŠØ² دی.',
'mailmypassword' => 'نوی پټنوم برÛښليک کول',
'passwordremindertitle' => 'د {{SITENAME}} لپاره نوی لنډمهاله پټنوم',
'passwordremindertext' => 'يو چا (Ú©Ûدای شي Ú†Û ØªØ§Ø³Û Ù¾Ø®Ù¾Ù„Ù‡ØŒ د $1 IP Ù¾ØªÛ Ù†Ù‡)
@@ -599,6 +600,8 @@ $1',
'emailnotauthenticated' => 'ستاسو د برÛښليک پته لا تر اوسه Ù¾ÙˆØ±Û Ø¯ منلو ÙˆÚ“ نه ده ګرÚÛدلÛ. د اړوندو بÛلوونکو Ù†ÚšÙˆ په هکله تاسو ته Ù‡ÛÚ… کوم برÛښليک نه Ù„ÛÚ–Ù„ Ú©ÛÚ–ÙŠ.',
'noemailprefs' => 'Ø¯Ø¯Û Ù„Ù¾Ø§Ø±Ù‡ Ú†Û Ø¯Ø§ Ú©Ú“Ù†Û Ú©Ø§Ø± ÙˆÚ©Ú“ÙŠ نو تاسو يو برÛښليک وټاکÛ.',
'emailconfirmlink' => 'د خپل د برÛښليک Ù¾ØªÛ Ù¾Ø®Ù„ÛŒ ÙˆÚ©Ú“ÛŒ',
+'invalidemailaddress' => 'دا برÛښليک پته نه منل Ú©ÛÚ–ÙŠØŒ دا ÚÚ©Ù‡ Ú†Û Ø¯Ø§ پته يوه ناکره بڼه لري.
+لطÙاً د ÙŠÙˆÛ Ú©Ø±Ù‡ Ø¨Ú¼Û Ù¾ØªÙ‡ ÙˆÙ„ÙŠÚ©Û Ø§Ùˆ يا هم دا Úای تش پرÛږدÛ.',
'accountcreated' => 'ګڼون مو جوړ شو.',
'accountcreatedtext' => 'د $1 لپاره يو ګڼون جوړ شو.',
'createaccount-title' => 'د {{SITENAME}} د ګڼون جوړÛدنه',
@@ -655,6 +658,7 @@ $1',
'showlivepreview' => 'Ú˜ÙˆÙ†Ø¯Û Ù…Ø®Ú©ØªÙ†Ù‡',
'showdiff' => 'بدلونونه ښکاره کول',
'anoneditwarning' => "'''يادونه:''' ØªØ§Ø³Û ØºÙˆÙ†Ú‰Ø§Ù„ ته نه ياست ننوتي. Ø³ØªØ§Ø³Û IP پته به د Ø¯Û Ù…Ø® د سمونونو په Ù¾Ûښليک Ú©Û Ø«Ø¨Øª شي.",
+'anonpreviewwarning' => "''ØªØ§Ø³Û ØºÙˆÙ†Ú‰Ø§Ù„ ته نه ياست ننوتي. خوندي کولو سره به Ø³ØªØ§Ø³Û IP پته به د Ø¯Û Ù…Ø® د سمونونو په Ù¾Ûښليک Ú©Û Ø«Ø¨Øª شي.''",
'missingcommenttext' => 'لطÙاً تبصره Ù„Ø§Ù†Ø¯Û ÙˆÙ„ÙŠÚ©Û.',
'summary-preview' => 'د لنډيز مخليدنه:',
'subject-preview' => 'موضوع/سرليک مخکتنه:',
@@ -727,8 +731,6 @@ $1',
'yourdiff' => 'توپيرونه',
'copyrightwarning' => "لطÙاً په پام Ú©Û ÙˆØ³Ø§ØªÛ Ú†Û Ù¼ÙˆÙ„Û Ù‡ØºÙ‡ ÙˆÙ†Ú‰Û Ú†Û ØªØ§Ø³Û ÙŠÛ {{SITENAME}} Ú©Û ØªØ±Ø³Ø±Ù‡ Ú©ÙˆÛŒ هغه د $2 له Ù…Ø®Û Ø¯ خپرولو لپاره Ú«Ú¼Ù„ Ú©ÛÚ–ÙŠ (د لانورو تÙصيلاتو لپاره $1 وګورÛ). Ú©Ù‡ ØªØ§Ø³Û Ù†Ù‡ ØºÙˆØ§Ú“Û Ú†Û Ù¾Ù‡ ليکنو Ú©Û Ù…Ùˆ په Ø¨Û Ø±Ø­Ù…Û Ø³Ø±Ù‡ Ù„Ø§Ø³ÙˆÙ‡Ù†Û (سمونÛ) وشي او د نورو په غوښتنه Ù¾Ø³Û Ù„Ø§Ù†ÙˆØ±Û Ù‡Ù… Ø®Ù¾Ø±Û Ø´ÙŠØŒ نو دلته ÙŠÛ Ù…Ù‡ Úای پر Úای Ú©ÙˆÛŒ..<br />
ØªØ§Ø³Û Ø²Ù…ÙˆÙ†Ú– سره دا ژمنه هم Ú©ÙˆÛŒ Ú†Û ØªØ§Ø³Û Ù¾Ø®Ù¾Ù„Ù‡ دا ليکنه Ú©ÚšÙ„ÛØŒ او يا مو د ټولګړو پاڼو او يا ورته وړيا سرچينو نه کاپي Ú©Ú“Û Ø¯Ù‡ '''لطÙاً د ليکوال د Ø§Ø¬Ø§Ø²Û Ù†Ù‡ پرته د خوندي رښتو Ù„ÙŠÚ©Ù†Û Ù…Ù‡ خپروی!'''",
-'longpagewarning' => "'''پاملرنه: همدا مخ $1 کيلوبايټه اوږد دی؛ Ú©Ûدای شي Ú†Û ÚÙŠÙ†Û Ú©ØªÙ†Ù…Ù„ÙˆÙ†Ù‡ د Û³Û² کيلوبايټ نه د اوږدو مخونو په سمونه Ú©Û Ø³ØªÙˆÙ†Ø²Ù‡ رامÛÙ†Ú ØªÙ‡ Ú©Ú“ÙŠ.
-لطÙاً د مخ په لنډولو او په ÙˆÚ“Ùˆ برخو ÙˆÛشلو Ø¨Ø§Ù†Ø¯Û ØºÙˆØ± ÙˆÚ©Ú“ÛŒ.'''",
'longpageerror' => "'''ستونزه: کوم متن Ú†Û Ø¯Ù„ØªÙ‡ تاسو ليکلی، $1 کيلوبايټه اوږد دی او دا د Ù‡Ù…Ø¯Û Ù…Ø® د لوړترين ټاکلي بريده، $2 کيلوبايټه، څخه اوږد دی.
ستاسو متن نه شي خوندي Ú©Ûدلای.'''",
'protectedpagewarning' => "'''ګواښنه: همدا مخ تړل شوی او ÙŠÙˆØ§Ø²Û Ù‡ØºÙ‡ کارنان په Ø¯Û Ù…Ø® Ú©Û Ø¨Ø¯Ù„ÙˆÙ†ÙˆÙ†Ù‡ راوستلای شي Ú†Û Ø¯ Ù¾Ø§Ø²ÙˆØ§Ù„Û Ø¯ آسانتياوو نه برخمن دي.'''
@@ -767,6 +769,10 @@ $1',
'edit-already-exists' => 'په Ø¯Û Ù†ÙˆÙ… يو نوی مخ جوړ نه شو.
Ù¾Ø¯Û Ù†ÙˆÙ… د پخوا نه يو مخ شته.',
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''ګواښنه:''' دا Ú©ÙŠÙ†Ú‰Û Ø¯ خپل ټاکلي بريد نه Ú‰Ûره لويه ده.
+ÚÙŠÙ†Û Ú©ÙŠÙ†Ú‰Û Ø¨Ù‡ په Ú©Û Ú«Ú‰Û Ù†Ù‡ شي.",
+
# "Undo" feature
'undo-norev' => 'دا سمون ناکړ Ú©Ûدلای نه شي دا ÚÚ©Ù‡ Ú†Û Ø¯Ø§ سمون نشته او يا هم Ú“Ù†Ú« شوی.',
@@ -825,6 +831,8 @@ $1',
'revdelete-radio-unset' => 'نه',
'revdelete-log' => 'سبب:',
'revdel-restore' => 'ښکارÛدنه بدلول',
+'revdel-restore-deleted' => 'Ú“Ù†Ú«Û Ø´ÙˆÛ Ø¨Ú¼Û',
+'revdel-restore-visible' => 'ښکاره بڼÛ',
'pagehist' => 'د مخ Ù¾Ûښليک',
'deletedhist' => 'د ړنګولو Ù¾Ûښليک',
'revdelete-content' => 'Ù…ÛÙ†Úپانګه',
@@ -858,11 +866,12 @@ $1',
# Diffs
'history-title' => 'د "$1" د Ù¾Ûښليک بڼه',
'difference' => '(د بڼو تر Ù…ÛÙ†Ú ØªÙˆÙ¾ÙŠØ±)',
+'difference-multipage' => '(د مخونو تر Ù…ÛÙ†Ú ØªÙˆÙ¾ÙŠØ±)',
'lineno' => '$1 کرښه:',
'compareselectedversions' => 'Ù¼Ø§Ú©Ù„Û Ø¨Ú¼Û Ø³Ø±Ù‡ پرتلل',
'showhideselectedversions' => 'Ù¼Ø§Ú©Ù„Û Ø¨Ú¼Û ÚšÚ©Ø§Ø±Ù‡ کول/پټول',
'editundo' => 'ناکړ',
-'diff-multi' => '({{PLURAL:$1|يوه منÚÚ«Ú“Û Ù…Ø®Ù„ÙŠØ¯Ù†Ù‡ نه ده ښکاره شوÛ|$1 منÚÚ«Ú“Û Ù…Ø®Ù„ÙŠØ¯Ù†Û Ù†Ù‡ دي ښکاره شوي}}.)',
+'diff-multi' => ' د ({{PLURAL:$2| يو کارن|$2 کارنانو}} لخوا {{PLURAL:$1|يوه منÚÚ«Ú“Û Ø¨Ú¼Ù‡|$1 منÚÚ«Ú“Û Ø¨Ú¼Û}}د نه ده ښکاره شوÛ)',
# Search results
'searchresults' => 'د Ù¾Ù„Ù¼Ù†Û Ù¾Ø§ÙŠÙ„Û',
@@ -893,7 +902,9 @@ $1',
'searchprofile-project-tooltip' => 'په $1 Ú©Û Ù¾Ù„Ù¼Ù„',
'searchprofile-images-tooltip' => 'د دوتنو پلټنه',
'searchprofile-everything-tooltip' => 'د Ù¼ÙˆÙ„Û Ù…ÛÙ†ÚÙ¾Ø§Ù†Ú«Û Ù¾Ù„Ù¼Ù†Ù‡ (د خبرو اترو مخونو سره)',
+'searchprofile-advanced-tooltip' => 'د خپل Ø®ÙˆÚšÛ Ù¾Ù‡ نوم-تشيالونو Ú©Û Ù¾Ù„Ù¼Ù„',
'search-result-size' => '$1 ({{PLURAL:$2|1 ويی|$2 وييونه}})',
+'search-result-category-size' => '{{PLURAL:$1|1 غړی|$1 غړي}} ({{PLURAL:$2|1 Ú…Ûرمه ÙˆÛشنيزه|$2 Ú…Ûرمه ÙˆÛشنيزÛ}}ØŒ {{PLURAL:$3|1 دوتنه|$3 دوتنÛ}})',
'search-result-score' => 'اړوندتوب: $1%',
'search-redirect' => '(د $1 مخ ګرÚونه)',
'search-section' => '(برخه $1)',
@@ -959,6 +970,7 @@ $1',
'columns' => 'ستنÛ:',
'searchresultshead' => 'پلټل',
'resultsperpage' => 'په هر مخ Ú©Û Ø¯ پايلو شمÛر:',
+'stub-threshold-disabled' => 'ناچارند شوی',
'recentchangesdays' => 'د هغو ورÚÙˆ شمÛر وټاکی Ú†Û Ù¾Ù‡ وروستي بدلونو Ú©Û ÙŠÛ Ù„ÙŠØ¯Ù„ غواړی:',
'recentchangescount' => 'د هغو سمونو شمÛر Ú†Û Ù¾Ù‡ تلواليزه بڼه ښکاره بايد شي:',
'prefs-help-recentchangescount' => 'Ù¾Ø¯Û Ú©Û Ø¯ وروستني بدلونونو، د مخونو د Ù¾Ûښليکونو او يادښتونه شامل دي.',
@@ -988,6 +1000,7 @@ $1',
'prefs-files' => 'دوتنÛ',
'prefs-custom-css' => 'Úاني CSS',
'prefs-custom-js' => 'Úاني جاواسکرÛپټ',
+'prefs-common-css-js' => 'د ټولو پوښونو لپاره د CSS/جاواسکرÛپټ دوتنه:',
'prefs-emailconfirm-label' => 'د برÛښليک باورتيا:',
'prefs-textboxsize' => 'د سمون Ú©Ú“Ú©Û Ú©Ú†Ù‡',
'youremail' => 'برÛښليک *',
@@ -1019,7 +1032,9 @@ $1',
'prefs-advancedrendering' => 'Ù¾Ø±Ù…Ø®ØªÙ„Ù„Û Ø®ÙˆÚšÙ†Û',
'prefs-advancedsearchoptions' => 'Ù¾Ø±Ù…Ø®ØªÙ„Ù„Û Ø®ÙˆÚšÙ†Û',
'prefs-advancedwatchlist' => 'Ù¾Ø±Ù…Ø®ØªÙ„Ù„Û Ø®ÙˆÚšÙ†Û',
-'prefs-display' => 'د ښکارÛØ¯Ù†Û Ø®ÙˆÚšÙ†Û',
+'prefs-displayrc' => 'د ښکارÛØ¯Ù†Û Ø®ÙˆÚšÙ†Û',
+'prefs-displaysearchoptions' => 'د ښکارÛØ¯Ù†Û Ø®ÙˆÚšÙ†Û',
+'prefs-displaywatchlist' => 'د ښکارÛØ¯Ù†Û Ø®ÙˆÚšÙ†Û',
'prefs-diffs' => 'توپيرونه',
# User rights
@@ -1116,12 +1131,8 @@ $1',
'recentchanges-legend' => 'د ورستي بدلونو خوښنÛ',
'recentchangestext' => 'په Ù‡Ù…Ø¯Û Ù…Ø® Ø¨Ø§Ù†Ø¯Û Ø¯ ويکي ترټولو تازه وروستي بدلونونه وڅارÛ.',
'recentchanges-feed-description' => 'همدلته د ويکي ترټولو تازه وروستي بدلونونه ÙˆÚ…Ø§Ø±Û Ø§Ùˆ ÙˆÚ«ÙˆØ±Û Ú†Û Ú…Ù‡ Ù¾ÛÚš شوي.',
-'recentchanges-label-legend' => 'څرګندونÛ: $1.',
-'recentchanges-legend-newpage' => '$1 - نوی مخ',
'recentchanges-label-newpage' => 'دغه سمون يو نوی مخ جوړ کړی',
-'recentchanges-legend-minor' => '$1 - وړوکی سمون',
'recentchanges-label-minor' => 'دا يوه وړه سمونه ده',
-'recentchanges-legend-bot' => '$1 - د روباټ سمون',
'recentchanges-label-bot' => 'دغه سمون د يو روباټ لخوا ترسره شوی',
'recentchanges-label-unpatrolled' => 'دغه سمون تر اوسه Ù¾ÙˆØ±Û Ù†Ù‡ دی څارل شوی',
'rcnote' => "دلته Ù„Ø§Ù†Ø¯Û {{PLURAL:$1|وروستی '''1''' بدلون دی|وروستي '''$1''' بدلونونه دي}} Ú†Û Ù¾Ù‡ {{PLURAL:$2| ÙŠÙˆÛ ÙˆØ±Ú|'''$2''' ورÚÙˆ}} Ú©Û ØªØ± $4 Ù†ÛÙ¼Û Ø§Ùˆ $5 بجو Ù¾ÛÚš شوي.",
@@ -1184,6 +1195,11 @@ $1',
'minlength1' => 'پکار ده Ú†Û Ø¯ دوتنو نومونه Ù„Ú– تر Ù„Ú–Ù‡ يو حر٠ولري.',
'badfilename' => 'Ø¯Ø¯ØºÛ Ø¯ÙˆØªÙ†Û Ù†ÙˆÙ… "$1" ته واوړÛده.',
'filetype-badmime' => 'د MIME Ø¨Ú¼Û "$1" د دوتنو د پورته کولو اجازه نشته.',
+'empty-file' => 'کومه دوتنه Ú†Û ØªØ§Ø³Û Ø¯Ù„ØªÙ‡ Ø³Ù¾Ø§Ø±Ù„Û Ù‡ØºÙ‡ تشه ده.',
+'file-too-large' => 'کومه دوتنه Ú†Û ØªØ§Ø³Û Ø¯Ù„ØªÙ‡ Ø³Ù¾Ø§Ø±Ù„Û Ú‰Ûره لويه ده.',
+'filename-tooshort' => 'د Ø¯ÙˆØªÙ†Û Ù†ÙˆÙ… Ú‰Ûر لنډ دی',
+'filetype-banned' => 'د Ø¯Û Ø¨Ú¼Û Ù¾Ù‡ Ø¯ÙˆØªÙ†Û Ø¨Ù†Ø¯ÙŠØ² دی',
+'tmp-create-error' => 'لنډمهاله دوتنه جوړÛدای نه شي',
'fileexists' => "د پخوا نه Ù¾Ø¯Û Ù†ÙˆÙ… يوه دوتنه شته، Ú©Ù‡ تاسو ډاډه نه ياست او يا هم Ú©Ù‡ تاسو ØºÙˆØ§Ú“Û Ú†Û Ø¨Ø¯Ù„ÙˆÙ† Ù¾Ú©Û Ø±Ø§ÙˆÙ„ÛØŒ لطÙاً '''<tt>[[:$1]]</tt>''' وګورÛ.
[[$1|thumb]]",
'fileexists-extension' => "په Ù‡Ù…Ø¯Û Ù†ÙˆÙ… يوه بله دوتنه د پخوا نه شته: [[$2|thumb]]
@@ -1194,7 +1210,6 @@ $1',
Ú©Ù‡ ØªØ§Ø³Û Ø¨ÙŠØ§ هم د Ø®Ù¾Ù„Û Ø¯ÙˆØªÙ†Û Ù¾ÙˆØ±ØªÙ‡ کول غواړÛØŒ نو لطÙاً بÛرته وګرÚÛ Ø§Ùˆ همدغه دوتنه بيا په يوه نوي نوم پورته Ú©Ú“ÛŒ.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'همدا دوتنه د {{PLURAL:$1|Ù„Ø§Ù†Ø¯ÙŠÙ†Û Ø¯ÙˆØªÙ†Û|لاندينيو دوتنو}} غبرګه لمÛسه ده:',
-'successfulupload' => 'دوتنه پورته Ú©Ûدل په برياليتوب سره ترسره شو',
'savefile' => 'دوتنه خوندي کړه',
'uploadedimage' => '"[[$1]]" پورته شوه',
'uploaddisabled' => 'پورته کول ناچارن شوي',
@@ -1207,6 +1222,8 @@ $1',
'upload-description' => 'د Ø¯ÙˆØªÙ†Û Ú…Ø±Ú«Ù†Ø¯ÙˆÙ†Û',
'upload-options' => 'د پورته کولو خوښنÛ',
'watchthisupload' => 'همدا دوتنه کتل',
+'upload-success-subj' => 'دوتنه پورته Ú©Ûدل په برياليتوب سره ترسره شو',
+'upload-failure-subj' => 'د پورته Ú©Ûدو ستونزه',
'upload-file-error' => 'Ú©ÙˆØ±Ù†Û Ø³ØªÙˆÙ†Ø²Ù‡',
'upload-unknown-size' => 'ناڅرګنده کچه',
@@ -1233,6 +1250,7 @@ $1',
'listfiles_search_for' => 'د انÚور د نوم لټون:',
'imgfile' => 'دوتنه',
'listfiles' => 'د دوتنو لړليک',
+'listfiles_thumb' => 'بټنوک',
'listfiles_date' => 'Ù†Ûټه',
'listfiles_name' => 'نوم',
'listfiles_user' => 'کارن',
@@ -1323,7 +1341,8 @@ $1',
'statistics-users-active' => 'Ùعاله کارنان',
'statistics-mostpopular' => 'تر ټولو Ú‰Ûر کتل شوي مخونه',
-'disambiguations' => 'د Ú…Ø±Ú«Ù†Ø¯ÙˆÙ†Û Ù…Ø®ÙˆÙ†Ù‡',
+'disambiguations' => 'د Ú…Ø±Ú«Ù†Ø¯ÙˆÙ†Û Ù…Ø®ÙˆÙ†Ù‡',
+'disambiguationspage' => 'Template:ناجوت',
'doubleredirects' => 'دوه Úلي ورګرÚÛدنÛ',
@@ -1344,6 +1363,7 @@ $1',
'nmembers' => '$1 {{PLURAL:$1|غړی|غړي}}',
'nrevisions' => '$1 {{PLURAL:$1|بڼه|بڼÛ}}',
'nviews' => '$1 {{PLURAL:$1|کتنه|کتنÛ}}',
+'nimagelinks' => 'په $1 {{PLURAL:$1|کارÛدلی مخ|کارÛدلي مخونه}}',
'specialpage-empty' => 'د Ø¯Û Ø±Ø§Ù¾ÙˆØ± لپاره Ú©ÙˆÙ…Û Ù¾Ø§ÙŠÙ„Û Ù†Ø´ØªÙ‡.',
'lonelypages' => 'يتيم مخونه',
'uncategorizedpages' => 'په ÙˆÛشنيزو ناوÛشلي مخونه',
@@ -1475,29 +1495,35 @@ $1',
'listgrouprights-removegroup-self-all' => 'خپل ګڼون نه Ù¼ÙˆÙ„Û Ú‰Ù„Û Ù„ÙŠØ±ÙŠ کول',
# E-mail user
-'mailnologin' => 'Ù‡ÛÚ… کومه Ù„ÛÚ–Ù„ Ø´ÙˆÛ Ù¾ØªÙ‡ نشته',
-'emailuser' => 'کارن ته برÛښليک Ù„ÛÚ–Ù„',
-'emailpage' => 'کارن ته برÛښليک Ù„ÛÚ–Ù„',
-'defemailsubject' => 'د {{SITENAME}} برÛښليک',
-'noemailtitle' => 'Ù‡ÛÚ… کومه برÛښليک پته نشته.',
-'nowikiemailtitle' => 'د برÛښليک Ù„Ûږلو اجازه نشته',
-'nowikiemailtext' => 'Ø¯Û Ú©Ø§Ø±Ù† د نورو کارنانو لخوا د برÛښليک د نه ترلاسه کولو چاره خوښه Ú©Ú“Û.',
-'email-legend' => 'د {{SITENAME}} يو بل کارن ته يو برÛښليک ورلÛÚ–Ù„',
-'emailfrom' => 'Ù„Ûږونکی',
-'emailto' => 'اخيستونکی',
-'emailsubject' => 'سکالو:',
-'emailmessage' => 'پيغام:',
-'emailsend' => 'Ù„ÛÚ–Ù„',
-'emailccme' => 'زما د پيغام يوه بÛÙ„Ú«Ù‡ Ø¯Û Ù…Ø§ØªÙ‡ هم برÛښليک شي.',
-'emailccsubject' => '$1 ته ستاسو د پيغام لمÛسه: $2',
-'emailsent' => 'برÛښليک مو ولÛÚ–Ù„ شو',
-'emailsenttext' => 'ستاسو برÛښليکي پيغام ولÛÚ–Ù„ شو.',
-'emailuserfooter' => 'همدا برÛښليک د $1 لخوا $2 ته د {{SITENAME}} په ÙˆÛبÚÙŠ Ú©Û Ø¯ "Ù‡Ù…Ø¯Û Ú©Ø§Ø±ÙˆÙ†Ú©ÙŠ ته برÛښليک Ù„ÛÚ–Ù„" د Ú©Ú“Ù†Û Ù¾Ù‡ مرسته Ù„ÛÚ–Ù„ شوی دی.',
+'mailnologin' => 'Ù‡ÛÚ… کومه Ù„ÛÚ–Ù„ Ø´ÙˆÛ Ù¾ØªÙ‡ نشته',
+'emailuser' => 'کارن ته برÛښليک Ù„ÛÚ–Ù„',
+'emailpage' => 'کارن ته برÛښليک Ù„ÛÚ–Ù„',
+'defemailsubject' => 'د {{SITENAME}} برÛښليک',
+'usermaildisabled' => 'د کارن برÛښليک ناچارند دی',
+'usermaildisabledtext' => 'په Ø¯Û ÙˆÙŠÚ©ÙŠ ØªØ§Ø³Û Ù†ÙˆØ±Ùˆ کارنانو ته برÛښليک نه Ø´ÛŒ ورلÛÚ–Ù„ÛŒ',
+'noemailtitle' => 'Ù‡ÛÚ… کومه برÛښليک پته نشته.',
+'nowikiemailtitle' => 'د برÛښليک Ù„Ûږلو اجازه نشته',
+'nowikiemailtext' => 'Ø¯Û Ú©Ø§Ø±Ù† د نورو کارنانو لخوا د برÛښليک د نه ترلاسه کولو چاره خوښه Ú©Ú“Û.',
+'email-legend' => 'د {{SITENAME}} يو بل کارن ته يو برÛښليک ورلÛÚ–Ù„',
+'emailfrom' => 'Ù„Ûږونکی',
+'emailto' => 'اخيستونکی',
+'emailsubject' => 'سکالو:',
+'emailmessage' => 'پيغام:',
+'emailsend' => 'Ù„ÛÚ–Ù„',
+'emailccme' => 'زما د پيغام يوه بÛÙ„Ú«Ù‡ Ø¯Û Ù…Ø§ØªÙ‡ هم برÛښليک شي.',
+'emailccsubject' => '$1 ته ستاسو د پيغام لمÛسه: $2',
+'emailsent' => 'برÛښليک مو ولÛÚ–Ù„ شو',
+'emailsenttext' => 'ستاسو برÛښليکي پيغام ولÛÚ–Ù„ شو.',
+'emailuserfooter' => 'همدا برÛښليک د $1 لخوا $2 ته د {{SITENAME}} په ÙˆÛبÚÙŠ Ú©Û Ø¯ "Ù‡Ù…Ø¯Û Ú©Ø§Ø±ÙˆÙ†Ú©ÙŠ ته برÛښليک Ù„ÛÚ–Ù„" د Ú©Ú“Ù†Û Ù¾Ù‡ مرسته Ù„ÛÚ–Ù„ شوی دی.',
+
+# User Messenger
+'usermessage-summary' => 'د غونډال پيغام پرÛښودل.',
+'usermessage-editor' => 'د غونډال پيغام رسونکی',
# Watchlist
'watchlist' => 'زما کتنلړ',
'mywatchlist' => 'زما کتنلړ',
-'watchlistfor' => "(د '''$1''')",
+'watchlistfor2' => 'د $1 لپاره $2',
'nowatchlist' => 'ستاسو په کتلي لړليک Ú©Û Ù‡ÛÚ… نه شته.',
'watchlistanontext' => 'د خپل کتنلړ د توکو د سمولو او کتلو لپاره $1 ترسره Ú©Ú“Û.',
'watchnologin' => 'غونډال Ú©Û Ù†Ù‡ ياست ننوتي.',
@@ -1681,10 +1707,12 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'sp-contributions-newbies-sub' => 'د نوو ګڼونونو لپاره',
'sp-contributions-blocklog' => 'د بنديز يادښت',
'sp-contributions-deleted' => 'د کارن ÙˆÙ†Ú‰Û Ú“Ù†Ú«Û Ø´ÙˆÛ',
+'sp-contributions-uploads' => 'پورته Ú©ÛدنÛ',
'sp-contributions-logs' => 'يادښتونه',
'sp-contributions-talk' => 'Ø®Ø¨Ø±Û Ø§ØªØ±Û',
'sp-contributions-search' => 'د ونډو لټون',
'sp-contributions-username' => 'IP پته يا کارن-نوم:',
+'sp-contributions-toponly' => 'ÙŠÙˆØ§Ø²Û Ù‡ØºÙ‡ سمونونه Ú†Û ØªØ± ټولو تازه Ø¨Ú¼Û Ù„Ø±ÙŠ ښکاره کول',
'sp-contributions-submit' => 'پلټل',
# What links here
@@ -1722,7 +1750,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
** په مخونو Ú©Û Ù†Ø§Ù†Ø¯Ø±Û Ø±Ø§Ù¾Ø§Ø±ÛدنÛ/د تاوتريخوالي خپرÛدو ته هڅول
** د Ú«Ú¼ شمÛر ګڼونونو نه ناوړه ګټه اخيستل
** نه مننونکی کارن-نوم کارول',
-'ipbcreateaccount' => 'د ګڼون جوړولو مخنيوی',
+'ipbcreateaccount' => 'د ګڼون جوړولو مخنيول',
'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',
@@ -1936,6 +1964,8 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'tooltip-rollback' => 'په Ù‡Ù…Ø¯Û Ù…Ø® Ú©Û "په شابÛول" د وروستني ونډوال سمون (سمونونه) په يوه Ú©Ù„ÛÚ© په Ú…Ù¼ ورګرÚوي.',
'tooltip-undo' => '"ناکړ" همدا سمون پر شا ګرÚوي او د سمون Ú©Ú“Ú©Û Ø¯ Ù…Ø®Ú©ØªÙ†Û Ù¾Ù‡ بڼه پرانيزي.
دا کړنه د لنډيز په برخه Ú©Û Ø¯ سمونونو د سببونو د ورګډولو آسانتيا برابروي.',
+'tooltip-preferences-save' => 'غوره توبونه خوندي کول',
+'tooltip-summary' => 'يو لنډ لنډيز کښل',
# Attribution
'anonymous' => 'د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}',
@@ -1983,14 +2013,14 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
# Media information
'thumbsize' => 'د بټنوک کچه:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|مخ|مخونه}}',
-'file-info-size' => '($1 × $2 Ù¾Ûکسل, د Ø¯ÙˆØªÙ†Û Ú©Ú†Ù‡: $3, MIME بڼه: $4)',
+'file-info-size' => '$1 × $2 Ù¾Ûکسل, د Ø¯ÙˆØªÙ†Û Ú©Ú†Ù‡: $3, MIME بڼه: $4',
'file-nohires' => '<small>تر Ø¯Û Ú©Ú†Û Ù„ÙˆÚ“Û Ø¨Ûلن Ù†ÚšÛ Ù†Ø´ØªÙ‡.</small>',
-'svg-long-desc' => '(SVG دوتنه، نومÛنلي $1 × $2 Ù¾Ûکسل، د Ø¯ÙˆØªÙ†Û Ú©Ú†Ù‡: $3)',
+'svg-long-desc' => 'SVG دوتنه، نومÛنلي $1 × $2 Ù¾Ûکسل، د Ø¯ÙˆØªÙ†Û Ú©Ú†Ù‡: $3',
'show-big-image' => 'بشپړ بÛلن Ù†ÚšÛ',
'show-big-image-thumb' => '<small>د Ø¯Û Ù…Ø®Ù„ÙŠØ¯Ù†Û Ú©Ú†Ù‡: $1 × $2 pixels</small>',
# Special:NewFiles
-'newimages' => 'د نوو دوتنو نندارتون',
+'newimages' => 'د نوو دوتنو انÚورتون',
'imagelisttext' => "دلته Ù„Ø§Ù†Ø¯Û Ø¯ '''$1''' {{PLURAL:$1|دوتنه|دوتنÛ}} يو لړليک دی Ú†Û Ø§ÙˆÚ‰Ù„ شوي $2.",
'newimages-summary' => 'همدا Úانګړی مخ، ÙˆØ±ÙˆØ³ØªÙ†Û Ù¾ÙˆØ±ØªÙ‡ Ø´ÙˆÛ Ø¯ÙˆØªÙ†Û ÚšÚ©Ø§Ø±Ù‡ کوي.',
'newimages-legend' => 'چاڼګر',
@@ -2046,6 +2076,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'exif-gpsimgdirection' => 'د انÚور لوری',
'exif-gpsareainformation' => 'د جي پي اس د Ø³ÙŠÙ…Û Ù†ÙˆÙ…',
'exif-gpsdatestamp' => 'د جي پي اس Ù†Ûټه',
+'exif-objectname' => 'لنډ سرليک',
'exif-unknowndate' => 'نامالومه Ù†Ûټه',
@@ -2167,6 +2198,7 @@ $5
'table_pager_first' => 'لومړی مخ',
'table_pager_last' => 'وروستی مخ',
'table_pager_limit' => 'په يوه مخ $1 توکي ښکاره کړی',
+'table_pager_limit_label' => 'په هر مخ د توکو شمÛر:',
'table_pager_limit_submit' => 'ورÚÙ‡',
'table_pager_empty' => 'Ø¨Û Ù¾Ø§ÙŠÙ„Ùˆ',
@@ -2214,15 +2246,23 @@ $5
'iranian-calendar-m12' => 'کب',
# Special:Version
-'version' => 'بڼه',
-'version-extensions' => 'Ù„Ú«Ûدلي شاتاړي',
-'version-specialpages' => 'Úانګړي مخونه',
-'version-other' => 'بل',
-'version-version' => '(بڼه $1)',
-'version-license' => 'منښتليک',
-'version-software' => 'نصب شوی ساوتری',
-'version-software-product' => 'اÛبره',
-'version-software-version' => 'بڼه',
+'version' => 'بڼه',
+'version-extensions' => 'Ù„Ú«Ûدلي شاتاړي',
+'version-specialpages' => 'Úانګړي مخونه',
+'version-skins' => 'پوښÛ',
+'version-other' => 'بل',
+'version-version' => '(بڼه $1)',
+'version-license' => 'منښتليک',
+'version-poweredby-credits' => "دا ويکي د '''[http://www.mediawiki.org/ Ù…Ûډياويکي]''' په سÛÚ© Ú†Ù„ÛÚ–ÙŠØŒ Ù¼ÙˆÙ„Û Ø±ÚšØªÛ Ø®ÙˆÙ†Ø¯ÙŠ دي © 2001-$1 $2.",
+'version-poweredby-others' => 'نور',
+'version-license-info' => 'Ù…Ûډياويکي يو وړيا ساوتری دی؛ ØªØ§Ø³Û ÙŠÛ Ù¾Ù‡ ډاډه زړه د GNU د ټولګړو کارÛدنو د منښتليک Ú†Û Ø¯ وړيا ساوتريو د بنسټ له Ù…Ø®Û Ø®Ù¾ÙˆØ± شوی، خپرولی او/يا بدلولی شی؛ د منښتليک Û² بڼه او يا (Ø³ØªØ§Ø³Û Ø¯ خوښÛ) هر يوه ÙˆØ±ÙˆØ³ØªÛ Ø¨Ú¼Ù‡.
+
+Ù…Ûډياويکي د ÚšÙ‡ کارÛØ¯Ù†Û Ù¾Ù‡ نيت خپور شوی، خو د ضمني سوداګريز او يا د کوم Úانګړي کار د ضمانت نه پرته. د نورو مالوماتو لپاره د GNU د ټولګړو کارÛدنو منښتليک وګورÛ.
+
+ØªØ§Ø³Û Ø¨Ø§ÙŠØ¯ د Ø¯Û Ù¾Ø±ÙˆÚ«Ø±Ø§Ù… سره يو [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] ترلاسه Ú©Ú“ÛŒ وي؛ Ú©Ù‡ Ø¯Ø§Ø³Û Ù†Ù‡ وي، نو د وړيا ساوتريو بنسټ، Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ته يو ليک وليکÛØŒ او يا ÙŠÛ [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html پرليکه ولولÛ].',
+'version-software' => 'نصب شوی ساوتری',
+'version-software-product' => 'اÛبره',
+'version-software-version' => 'بڼه',
# Special:FilePath
'filepath-page' => 'دوتنه:',
@@ -2260,6 +2300,15 @@ $5
'tags-edit' => 'سمول',
'tags-hitcount' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
+# Special:ComparePages
+'comparepages' => 'مخونه پرتلل',
+'compare-selector' => 'د مخ Ø¨Ú¼Û Ø³Ø±Ù‡ پرتلل',
+'compare-page1' => '۱ مخ',
+'compare-page2' => '۲ مخ',
+'compare-rev1' => '۱ بڼه',
+'compare-rev2' => '۲ بڼه',
+'compare-submit' => 'پرتلل',
+
# Database error messages
'dberr-header' => 'دا ويکي يوه ستونزه لري',
'dberr-problems' => 'اوبخښÛ!
@@ -2273,6 +2322,7 @@ $5
'htmlform-float-invalid' => 'کوم Ú…Ù‡ Ú†Û ØªØ§Ø³Ùˆ Úانګړي Ú©Ú“ÙŠ هغه يوه شمÛره نه ده.',
'htmlform-int-toolow' => 'کوم ارزښت Ú†Û ØªØ§Ø³Û Úانګړی Ú©Ú“ÛŒ هغه تر $1 Ù„Ú– دی',
'htmlform-int-toohigh' => 'کوم ارزښت Ú†Û ØªØ§Ø³Û Úانګړی Ú©Ú“ÛŒ هغه تر $1 Ú‰Ûر دی',
+'htmlform-required' => 'Ø¯Û Ø§Ø±Ø²ÚšØª ته اړتيا ده',
'htmlform-submit' => 'سپارل',
'htmlform-reset' => 'بدلونونه ناکړل',
'htmlform-selectorother-other' => 'بل',
diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php
index 7c1ac6ea..526c4061 100644
--- a/languages/messages/MessagesPt.php
+++ b/languages/messages/MessagesPt.php
@@ -24,6 +24,7 @@
* @author MF-Warburg
* @author Malafaya
* @author Manuel Menezes de Sequeira
+ * @author Masked Rogue
* @author McDutchie
* @author Minh Nguyen
* @author Nuno Tavares
@@ -79,97 +80,99 @@ $dateFormats = array(
'dmy both' => 'H\hi\m\i\n \d\e j \d\e F \d\e Y',
);
-$separatorTransformTable = array(',' => ' ', '.' => ',' );
-$linkTrail = '/^([áâãàéêçíóôõúüa-z]+)(.*)$/sDu'; # Bug 21168
+$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redireccionamentos duplos' ),
- 'BrokenRedirects' => array( 'Redireccionamentos quebrados' ),
- 'Disambiguations' => array( 'Desambiguações' ),
+ 'DoubleRedirects' => array( 'Redireccionamentos_duplos', 'Redirecionamentos_duplos' ),
+ 'BrokenRedirects' => array( 'Redireccionamentos_quebrados', 'Redirecionamentos_quebrados' ),
+ 'Disambiguations' => array( 'Desambiguações', 'Páginas_de_desambiguação', 'Desambiguar' ),
'Userlogin' => array( 'Entrar', 'Login' ),
'Userlogout' => array( 'Sair', 'Logout' ),
- 'CreateAccount' => array( 'Criar conta' ),
+ 'CreateAccount' => array( 'Criar_conta' ),
'Preferences' => array( 'Preferências' ),
- 'Watchlist' => array( 'Páginas vigiadas' ),
- 'Recentchanges' => array( 'Mudanças recentes' ),
- 'Upload' => array( 'Carregar ficheiro' ),
- 'Listfiles' => array( 'Lista de ficheiros' ),
- 'Newimages' => array( 'Ficheiros novos', 'Imagens novas' ),
- 'Listusers' => array( 'Lista de utilizadores' ),
- 'Listgrouprights' => array( 'Listar privilégios de grupos' ),
+ 'Watchlist' => array( 'Páginas_vigiadas', 'Artigos_vigiados', 'Vigiados' ),
+ 'Recentchanges' => array( 'Mudanças_recentes' ),
+ 'Upload' => array( 'Carregar_imagem', 'Carregar_ficheiro', 'Carregar_arquivo', 'Enviar' ),
+ 'Listfiles' => array( 'Lista_de_ficheiros', 'Lista_de_imagens', 'Lista_de_arquivos' ),
+ 'Newimages' => array( 'Ficheiros_novos', 'Imagens_novas', 'Arquivos_novos' ),
+ 'Listusers' => array( 'Lista_de_utilizadores', 'Lista_de_usuários' ),
+ 'Listgrouprights' => array( 'Lista_de_privilégios_de_grupos', 'Listar_privilégios_de_grupos' ),
'Statistics' => array( 'Estatísticas' ),
- 'Randompage' => array( 'Página aleatória' ),
- 'Lonelypages' => array( 'Páginas órfãs', 'Páginas sem afluentes' ),
- 'Uncategorizedpages' => array( 'Páginas sem categorias' ),
- 'Uncategorizedcategories' => array( 'Categorias sem categorias' ),
- 'Uncategorizedimages' => array( 'Ficheiros sem categorias', 'Imagens sem categorias' ),
- 'Uncategorizedtemplates' => array( 'Predefinições não categorizadas' ),
- 'Unusedcategories' => array( 'Categorias não utilizadas' ),
- 'Unusedimages' => array( 'Ficheiros não utilizados' ),
- 'Wantedpages' => array( 'Páginas desejadas' ),
- 'Wantedcategories' => array( 'Categorias desejadas' ),
- 'Wantedfiles' => array( 'Ficheiros desejados' ),
- 'Wantedtemplates' => array( 'Predefinições desejadas' ),
- 'Mostlinked' => array( 'Páginas com mais afluentes' ),
- 'Mostlinkedcategories' => array( 'Categorias com mais afluentes' ),
- 'Mostlinkedtemplates' => array( 'Predefinições com mais afluentes' ),
- 'Mostimages' => array( 'Ficheiros com mais afluentes', 'Imagens com mais afluentes' ),
- 'Mostcategories' => array( 'Páginas com mais categorias' ),
- 'Mostrevisions' => array( 'Páginas com mais revisões' ),
- 'Fewestrevisions' => array( 'Páginas com menos revisões' ),
- 'Shortpages' => array( 'Páginas curtas' ),
- 'Longpages' => array( 'Páginas longas' ),
- 'Newpages' => array( 'Páginas novas' ),
- 'Ancientpages' => array( 'Página mais antigas' ),
- 'Deadendpages' => array( 'Páginas sem saída' ),
- 'Protectedpages' => array( 'Páginas protegidas' ),
- 'Protectedtitles' => array( 'Títulos protegidos' ),
- 'Allpages' => array( 'Todas as páginas' ),
- 'Prefixindex' => array( 'Ãndice de prefixo' ),
- 'Ipblocklist' => array( 'Registo de bloqueios' ),
- 'Specialpages' => array( 'Páginas especiais' ),
+ 'Randompage' => array( 'Aleatória', 'Aleatório', 'Página_aleatória', 'Artigo_aleatório' ),
+ 'Lonelypages' => array( 'Páginas_órfãs', 'Páginas_sem_afluentes', 'Artigos_órfãos', 'Artigos_sem_afluentes' ),
+ 'Uncategorizedpages' => array( 'Páginas_não_categorizadas', 'Páginas_sem_categorias', 'Artigos_sem_categorias' ),
+ 'Uncategorizedcategories' => array( 'Categorias_não_categorizadas', 'Categorias_sem_categorias' ),
+ 'Uncategorizedimages' => array( 'Ficheiros_não_categorizados', 'Imagens_não_categorizadas', 'Imagens_sem_categorias', 'Ficheiros_sem_categorias', 'Arquivos_sem_categorias' ),
+ 'Uncategorizedtemplates' => array( 'Predefinições_não_categorizadas', 'Predefinições_sem_categorias' ),
+ 'Unusedcategories' => array( 'Categorias_não_utilizadas', 'Categorias_sem_uso' ),
+ 'Unusedimages' => array( 'Ficheiros_não_utilizados', 'Imagens_não_utilizadas' ),
+ 'Wantedpages' => array( 'Páginas_pedidas', 'Páginas_em_falta', 'Artigos_em_falta', 'Artigos_pedidos' ),
+ 'Wantedcategories' => array( 'Categorias_pedidas', 'Categorias_em_falta', 'Categorias_inexistentes' ),
+ 'Wantedfiles' => array( 'Ficheiros_pedidos', 'Imagens_pedidas', 'Ficheiros_em_falta', 'Arquivos_em_falta', 'Imagens_em_falta' ),
+ 'Wantedtemplates' => array( 'Predefinições_pedidas', 'Predefinições_em_falta' ),
+ 'Mostlinked' => array( 'Páginas_com_mais_afluentes', 'Artigos_com_mais_afluentes' ),
+ 'Mostlinkedcategories' => array( 'Categorias_com_mais_afluentes', 'Categorias_mais_usadas' ),
+ 'Mostlinkedtemplates' => array( 'Predefinições_com_mais_afluentes', 'Predefinições_mais_usadas' ),
+ 'Mostimages' => array( 'Ficheiros_com_mais_afluentes', 'Imagens_com_mais_afluentes', 'Arquivos_com_mais_afluentes' ),
+ 'Mostcategories' => array( 'Páginas_com_mais_categorias', 'Artigos_com_mais_categorias' ),
+ 'Mostrevisions' => array( 'Páginas_com_mais_edições', 'Artigos_com_mais_edições' ),
+ 'Fewestrevisions' => array( 'Páginas_com_menos_edições', 'Artigos_com_menos_edições', 'Artigos_menos_editados' ),
+ 'Shortpages' => array( 'Páginas_curtas', 'Artigos_curtos' ),
+ 'Longpages' => array( 'Páginas_longas', 'Artigos_extensos' ),
+ 'Newpages' => array( 'Páginas_novas', 'Artigos_novos' ),
+ 'Ancientpages' => array( 'Páginas_inactivas', 'Páginas_inativas', 'Artigos_inativos' ),
+ 'Deadendpages' => array( 'Páginas_sem_saída', 'Artigos_sem_saída' ),
+ 'Protectedpages' => array( 'Páginas_protegidas', 'Artigos_protegidos' ),
+ 'Protectedtitles' => array( 'Títulos_protegidos' ),
+ 'Allpages' => array( 'Todas_as_páginas', 'Todos_os_artigos', 'Todas_páginas', 'Todos_artigos' ),
+ 'Prefixindex' => array( 'Ãndice_por_prefixo', 'Ãndice_de_prefixo' ),
+ 'Ipblocklist' => array( 'Registo_de_bloqueios', 'IPs_bloqueados', 'Utilizadores_bloqueados', 'Registro_de_bloqueios', 'Usuários_bloqueados' ),
+ 'Unblock' => array( 'Desbloquear' ),
+ 'Specialpages' => array( 'Páginas_especiais' ),
'Contributions' => array( 'Contribuições' ),
- 'Emailuser' => array( 'Contactar utilizador' ),
- 'Confirmemail' => array( 'Confirmar correio electrónico' ),
- 'Whatlinkshere' => array( 'Páginas afluentes' ),
- 'Recentchangeslinked' => array( 'Alterações relacionadas' ),
- 'Movepage' => array( 'Mover página' ),
- 'Blockme' => array( 'Auto-bloqueio' ),
- 'Booksources' => array( 'Fontes de livros' ),
+ 'Emailuser' => array( 'Contactar_utilizador', 'Contactar_usuário', 'Contatar_usuário' ),
+ 'Confirmemail' => array( 'Confirmar_correio_electrónico', 'Confirmar_e-mail', 'Confirmar_email' ),
+ 'Whatlinkshere' => array( 'Páginas_afluentes', 'Artigos_afluentes' ),
+ 'Recentchangeslinked' => array( 'Alterações_relacionadas', 'Novidades_relacionadas', 'Mudanças_relacionadas' ),
+ 'Movepage' => array( 'Mover_página', 'Mover', 'Mover_artigo' ),
+ 'Blockme' => array( 'Bloquear-me', 'Auto-bloqueio' ),
+ 'Booksources' => array( 'Fontes_de_livros' ),
'Categories' => array( 'Categorias' ),
- 'Export' => array( 'Exportação de páginas' ),
- 'Version' => array( 'Versão' ),
- 'Allmessages' => array( 'Todas as mensagens' ),
- 'Log' => array( 'Registos' ),
- 'Blockip' => array( 'Bloquear utilizador' ),
- 'Undelete' => array( 'Restaurar páginas eliminadas' ),
+ 'Export' => array( 'Exportar' ),
+ 'Version' => array( 'Versão', 'Sobre' ),
+ 'Allmessages' => array( 'Todas_as_mensagens', 'Todas_mensagens' ),
+ 'Log' => array( 'Registo', 'Registos', 'Registro', 'Registros' ),
+ 'Blockip' => array( 'Bloquear', 'Bloquear_IP', 'Bloquear_utilizador', 'Bloquear_usuário' ),
+ 'Undelete' => array( 'Restaurar', 'Restaurar_páginas_eliminadas', 'Restaurar_artigos_eliminados' ),
'Import' => array( 'Importar' ),
- 'Lockdb' => array( 'Bloquear base de dados' ),
- 'Unlockdb' => array( 'Desbloquear base de dados' ),
- 'Userrights' => array( 'Privilégios' ),
- 'MIMEsearch' => array( 'Busca MIME' ),
- 'FileDuplicateSearch' => array( 'Ficheiros duplicados' ),
- 'Unwatchedpages' => array( 'Páginas não vigiadas' ),
- 'Listredirects' => array( 'Redireccionamentos' ),
- 'Revisiondelete' => array( 'Eliminar revisão' ),
- 'Unusedtemplates' => array( 'Predefinições não utilizadas' ),
- 'Randomredirect' => array( 'Redireccionamento aleatório' ),
- 'Mypage' => array( 'Minha página' ),
- 'Mytalk' => array( 'Minha discussão' ),
- 'Mycontributions' => array( 'Minhas contribuições' ),
- 'Listadmins' => array( 'Administradores' ),
- 'Listbots' => array( 'Robôs' ),
- 'Popularpages' => array( 'Páginas populares' ),
- 'Search' => array( 'Pesquisa' ),
- 'Resetpass' => array( 'Alterar palavra-chave' ),
- 'Withoutinterwiki' => array( 'Páginas sem interwikis' ),
- 'MergeHistory' => array( 'Fundir históricos' ),
- 'Filepath' => array( 'Endereço de ficheiro' ),
- 'Invalidateemail' => array( 'Invalidar correio electrónico' ),
- 'Blankpage' => array( 'Página em branco' ),
- 'LinkSearch' => array( 'Pesquisar ligações' ),
- 'DeletedContributions' => array( 'Contribuições eliminadas' ),
- 'Activeusers' => array( 'Utilizadores activos' ),
+ 'Lockdb' => array( 'Bloquear_base_de_dados', 'Bloquear_a_base_de_dados', 'Bloquear_banco_de_dados' ),
+ 'Unlockdb' => array( 'Desbloquear_base_de_dados', 'Desbloquear_a_base_de_dados', 'Desbloquear_banco_de_dados' ),
+ 'Userrights' => array( 'Privilégios', 'Direitos', 'Estatutos' ),
+ 'MIMEsearch' => array( 'Busca_MIME' ),
+ 'FileDuplicateSearch' => array( 'Busca_de_ficheiros_duplicados', 'Busca_de_arquivos_duplicados' ),
+ 'Unwatchedpages' => array( 'Páginas_não_vigiadas', 'Páginas_não-vigiadas', 'Artigos_não-vigiados', 'Artigos_não_vigiados' ),
+ 'Listredirects' => array( 'Redireccionamentos', 'Redirecionamentos', 'Lista_de_redireccionamentos', 'Lista_de_redirecionamentos' ),
+ 'Revisiondelete' => array( 'Eliminar_edição', 'Eliminar_revisão', 'Apagar_edição', 'Apagar_revisão' ),
+ 'Unusedtemplates' => array( 'Predefinições_não_utilizadas', 'Predefinições_sem_uso' ),
+ 'Randomredirect' => array( 'Redireccionamento_aleatório', 'Redirecionamento_aleatório' ),
+ 'Mypage' => array( 'Minha_página' ),
+ 'Mytalk' => array( 'Minha_discussão' ),
+ 'Mycontributions' => array( 'Minhas_contribuições', 'Minhas_edições', 'Minhas_constribuições' ),
+ 'Listadmins' => array( 'Administradores', 'Admins', 'Lista_de_administradores', 'Lista_de_admins' ),
+ 'Listbots' => array( 'Robôs', 'Lista_de_robôs', 'Bots', 'Lista_de_bots' ),
+ 'Popularpages' => array( 'Páginas_populares', 'Artigos_populares' ),
+ 'Search' => array( 'Pesquisar', 'Busca', 'Buscar', 'Procurar', 'Pesquisa' ),
+ 'Resetpass' => array( 'Reiniciar_palavra-chave', 'Repor_senha', 'Zerar_senha' ),
+ 'Withoutinterwiki' => array( 'Páginas_sem_interwikis', 'Artigos_sem_interwikis' ),
+ 'MergeHistory' => array( 'Fundir_históricos', 'Fundir_edições' ),
+ 'Filepath' => array( 'Directório_de_ficheiro', 'Diretório_de_ficheiro', 'Diretório_de_arquivo' ),
+ 'Invalidateemail' => array( 'Invalidar_correio_electrónico', 'Invalidar_e-mail' ),
+ 'Blankpage' => array( 'Página_em_branco' ),
+ 'LinkSearch' => array( 'Pesquisar_links' ),
+ 'DeletedContributions' => array( 'Contribuições_eliminadas', 'Edições_eliminadas' ),
+ 'Tags' => array( 'Etiquetas' ),
+ 'Activeusers' => array( 'Utilizadores_activos' ),
);
$magicWords = array(
@@ -225,15 +228,18 @@ $magicWords = array(
'talkpagenamee' => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÃGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
'subjectpagename' => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÃGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÃGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'direita', 'right' ),
'img_left' => array( '1', 'esquerda', 'left' ),
'img_none' => array( '1', 'nenhum', 'none' ),
'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_framed' => array( '1', 'comborda', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'semborda', 'frameless' ),
+ 'img_framed' => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'semmoldura', 'semborda', 'frameless' ),
'img_page' => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'borda', 'border' ),
+ 'img_baseline' => array( '1', 'linhadebase', 'baseline' ),
'img_top' => array( '1', 'acima', 'top' ),
'img_middle' => array( '1', 'meio', 'middle' ),
'img_bottom' => array( '1', 'abaixo', 'bottom' ),
@@ -299,8 +305,7 @@ $messages = array(
'tog-editsection' => 'Possibilitar a edição de secções com links [editar]',
'tog-editsectiononrightclick' => 'Possibilitar a edição de secções por clique com o botão direito no título da secção (JavaScript)',
'tog-showtoc' => 'Mostrar índice (para páginas com mais de três secções)',
-'tog-rememberpassword' => 'Recordar a minha palavra-chave entre sessões',
-'tog-editwidth' => 'Aumentar a largura da caixa de edição para preencher o espaço disponível',
+'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
'tog-watchcreations' => 'Adicionar as páginas que eu criar às minhas páginas vigiadas',
'tog-watchdefault' => 'Adicionar as páginas que eu editar às minhas páginas vigiadas',
'tog-watchmoves' => 'Adicionar as páginas que eu mover às minhas páginas vigiadas',
@@ -320,7 +325,7 @@ $messages = array(
'tog-externaldiff' => 'Por omissão, utilizar diferenças externas (só para utilizadores avançados, exige configurações adicionais no seu computador. [http://www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
'tog-showjumplinks' => 'Possibilitar links de acessibilidade "{{int:jumpto}}"',
'tog-uselivepreview' => 'Usar a antevisão ao vivo (requer JavaScript; é experimental)',
-'tog-forceeditsummary' => 'Avisar-me ao introduzir um resumo vazio',
+'tog-forceeditsummary' => 'Avisar-me se deixar o resumo da edição vazio',
'tog-watchlisthideown' => 'Esconder as minhas edições ao listar mudanças às páginas vigiadas',
'tog-watchlisthidebots' => 'Esconder edições de robôs ao listar mudanças às páginas vigiadas',
'tog-watchlisthideminor' => 'Esconder edições menores ao listar mudanças às páginas vigiadas',
@@ -328,7 +333,7 @@ $messages = array(
'tog-watchlisthideanons' => 'Esconder edições de utilizadores anónimos ao listar mudanças às páginas vigiadas',
'tog-watchlisthidepatrolled' => 'Esconder edições patrulhadas ao listar mudanças às páginas vigiadas',
'tog-nolangconversion' => 'Impossibilitar a conversão de variantes da língua',
-'tog-ccmeonemails' => 'Enviar-me cópias dos correios electrónicos que eu enviar a outros utilizadores',
+'tog-ccmeonemails' => 'Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores',
'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
'tog-showhiddencats' => 'Mostrar categorias ocultas',
'tog-noconvertlink' => 'Impossibilitar a conversão dos títulos de links',
@@ -447,31 +452,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Adicionar&nbsp;tópico',
-'vector-action-delete' => 'Eliminar',
-'vector-action-move' => 'Mover',
-'vector-action-protect' => 'Proteger',
-'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Desproteger',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Página de ajuda',
-'vector-namespace-image' => 'Ficheiro',
-'vector-namespace-main' => 'Página',
-'vector-namespace-media' => 'Página de multimédia',
-'vector-namespace-mediawiki' => 'Mensagem',
-'vector-namespace-project' => 'Página de projecto',
-'vector-namespace-special' => 'Página especial',
-'vector-namespace-talk' => 'Discussão',
-'vector-namespace-template' => 'Predefinição',
-'vector-namespace-user' => 'Página de utilizador',
-'vector-view-create' => 'Criar',
-'vector-view-edit' => 'Editar',
-'vector-view-history' => 'Ver histórico',
-'vector-view-view' => 'Ler',
-'vector-view-viewsource' => 'Ver fonte',
-'actions' => 'Acções',
-'namespaces' => 'Espaços nominais',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Adicionar&nbsp;tópico',
+'vector-action-delete' => 'Eliminar',
+'vector-action-move' => 'Mover',
+'vector-action-protect' => 'Proteger',
+'vector-action-undelete' => 'Restaurar',
+'vector-action-unprotect' => 'Desproteger',
+'vector-simplesearch-preference' => 'Activar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-view-create' => 'Criar',
+'vector-view-edit' => 'Editar',
+'vector-view-history' => 'Ver histórico',
+'vector-view-view' => 'Ler',
+'vector-view-viewsource' => 'Ver fonte',
+'actions' => 'Acções',
+'namespaces' => 'Espaços nominais',
+'variants' => 'Variantes',
'errorpagetitle' => 'Erro',
'returnto' => 'Voltar para $1.',
@@ -532,6 +527,9 @@ Há demasiados utilizadores a tentar visionar esta página.
Espere um pouco antes de tentar aceder à página novamente, por favor.
$1',
+'pool-timeout' => 'Tempo limite de espera para o bloqueio excedido',
+'pool-queuefull' => 'A fila de processos está cheia',
+'pool-errorunknown' => 'Erro desconhecido',
# 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' => 'Sobre a {{SITENAME}}',
@@ -676,7 +674,7 @@ Consulta: $2',
'cascadeprotected' => 'Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de protecção "em cascata" activada):
$2',
'namespaceprotected' => "Não possui permissão para editar páginas no espaço nominal '''$1'''.",
-'customcssjsprotected' => 'Não possui permissão para editar esta página, porque ela contém as configurações pessoais de outro utilizador.',
+'customcssjsprotected' => 'Não tem permissão de editar esta página, porque ela contém as configurações pessoais de outro utilizador.',
'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\'\'".',
@@ -697,7 +695,8 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências na
'yourname' => 'Nome de utilizador:',
'yourpassword' => 'Palavra-chave:',
'yourpasswordagain' => 'Repita a palavra-chave:',
-'remembermypassword' => 'Recordar a minha palavra-chave entre sessões',
+'remembermypassword' => 'Recordar os meus dados neste computador (no máximo, por $1 {{PLURAL:$1|dia|dias}})',
+'securelogin-stick-https' => 'Manter a ligação HTTPS após a autenticação',
'yourdomainname' => 'O seu domínio:',
'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido actualizar a sua conta externa.',
'login' => 'Autenticação',
@@ -714,6 +713,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências na
'gotaccount' => "Já possui uma conta? '''$1'''.",
'gotaccountlink' => 'Autentique-se',
'createaccountmail' => 'por correio electrónico',
+'createaccountreason' => 'Motivo:',
'badretype' => 'As palavras-chave que introduziu não são iguais.',
'userexists' => 'O nome de utilizador que introduziu já existe.
Escolha um nome diferente.',
@@ -739,6 +739,7 @@ Verifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].',
'wrongpasswordempty' => 'A palavra-chave não foi introduzida. Introduza-a, por favor.',
'passwordtooshort' => 'A palavra-chave deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.',
'password-name-match' => 'A sua palavra-chave tem de ser diferente do seu nome de utilizador.',
+'password-login-forbidden' => 'Foi proibido o uso deste nome de utilizador e palavra-chave.',
'mailmypassword' => 'Enviar uma palavra-chave nova por correio electrónico',
'passwordremindertitle' => 'Nova palavra-chave temporária na {{SITENAME}}',
'passwordremindertext' => 'Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-chave nova para a sua conta na {{SITENAME}} ($4).
@@ -779,6 +780,9 @@ Aguarde antes de tentar novamente, por favor.',
'loginlanguagelabel' => 'Língua: $1',
'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
+# E-mail sending
+'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
+
# Password reset dialog
'resetpass' => 'Alterar palavra-chave',
'resetpass_announce' => 'Autenticou-se usando uma palavra-chave temporária enviada por correio electrónico.
@@ -832,10 +836,12 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
'showdiff' => 'Mostrar alterações',
'anoneditwarning' => "'''Aviso''': Não se encontra autenticado.
O seu endereço IP será registado no histórico de edições desta página.",
+'anonpreviewwarning' => "''Não está autenticado. Gravar registará o seu endereço IP no histórico de edições da página.''",
'missingsummary' => "'''Atenção:''' Não introduziu um resumo da edição.
Se clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
'missingcommenttext' => 'Introduza um comentário abaixo, por favor.',
-'missingcommentheader' => "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário. Se clicar novamente \"Gravar página\" a sua edição será gravada sem assunto ou cabeçalho.",
+'missingcommentheader' => "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário.
+Se clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto ou cabeçalho.",
'summary-preview' => 'Antevisão do resumo:',
'subject-preview' => 'Antevisão do assunto/cabeçalho:',
'blockedtitle' => 'O utilizador está bloqueado',
@@ -916,7 +922,11 @@ Para referência, o último registo de bloqueio é apresentado abaixo:',
Este ainda não foi gravado!'''",
'userjspreview' => "'''Lembre-se que está apenas a testar ou antever o seu JavaScript particular.'''
Este ainda não foi gravado!",
-'userinvalidcssjstitle' => "'''Aviso:''' Não existe um tema \"\$1\". Lembre-se que as páginas .css e .js utilizam um título em minúsculas, exemplo: {{ns:user}}:Alguém/monobook.css aposto a {{ns:user}}:Alguém/Monobook.css.",
+'sitecsspreview' => "'''Lembre-se de que está apenas a antever este CSS.'''
+'''Ele ainda não foi gravado!'''",
+'sitejspreview' => "'''Lembre-se de que está apenas a antever este código JavaScript.'''
+'''Ele ainda não foi gravado!'''",
+'userinvalidcssjstitle' => "'''Aviso:''' Não existe um tema \"\$1\". Lembre-se que as páginas .css e .js têm um título em minúsculas, exemplo: {{ns:user}}:Alguém/vector.css em vez de {{ns:user}}:Alguém/Vector.css.",
'updated' => '(Actualizado)',
'note' => "'''Nota:'''",
'previewnote' => "'''Lembre-se que esta é apenas uma antevisão do resultado.'''
@@ -956,9 +966,6 @@ Garante-nos também que isto é algo escrito por si, ou copiado do domínio púb
'copyrightwarning2' => "Por favor, note que todas as suas contribuições na {{SITENAME}} podem ser editadas, alteradas ou removidas por outros utilizadores. Se não deseja que o seu texto seja inexoravelmente editado, não o envie.
Garante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre (veja $1 para detalhes).<br />
'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS DE AUTOR SEM A DEVIDA PERMISSÃO!'''",
-'longpagewarning' => "'''AVISO:''' Esta página possui $1 kilobytes; alguns
-browsers têm problemas em editar páginas maiores do que 32 kb.
-Tente dividir a página em secções de menor dimensão, por favor.",
'longpageerror' => "'''Erro: O texto que submeteu ocupa $1 KB, um espaço superior ao máximo de $2 KB.
A página não pode ser gravada.'''",
'readonlywarning' => "'''Aviso: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar a sua edição neste momento.'''
@@ -1015,7 +1022,7 @@ Devia ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento tem $1 {{PLU
Estes argumentos foram omitidos.',
'post-expand-template-argument-category' => 'Páginas com omissão de argumentos para predefinições',
'parser-template-loop-warning' => 'Ciclo de predefinições detectado: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Atingido o limite de profundidade de recursividade de predefinição ($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)',
# "Undo" feature
@@ -1141,6 +1148,8 @@ $1",
'logdelete-failure' => "'''Não foi possível definir a visibilidade do registo:'''
$1",
'revdel-restore' => 'Alterar visibilidade',
+'revdel-restore-deleted' => 'revisões eliminadas',
+'revdel-restore-visible' => 'revisões visíveis',
'pagehist' => 'Histórico da página',
'deletedhist' => 'Histórico de eliminações',
'revdelete-content' => 'conteúdo',
@@ -1211,11 +1220,13 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
# Diffs
'history-title' => 'Histórico de edições de "$1"',
'difference' => '(Diferença entre edições)',
+'difference-multipage' => '(Diferenças entre páginas)',
'lineno' => 'Linha $1:',
'compareselectedversions' => 'Comparar as versões seleccionadas',
'showhideselectedversions' => 'Mostrar/ocultar versões selecionadas',
'editundo' => 'desfazer',
-'diff-multi' => '({{PLURAL:$1|uma edição intermédia não apresentada|$1 edições intermédias não apresentadas}})',
+'diff-multi' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de {{PLURAL:$2|um utilizador|$2 utilizadores}} {{PLURAL:$1|não apresentada|não apresentadas}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})',
# Search results
'searchresults' => 'Resultados da pesquisa',
@@ -1250,6 +1261,7 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
'searchprofile-everything-tooltip' => 'Pesquisar em todo o conteúdo (incluindo páginas de discussão)',
'searchprofile-advanced-tooltip' => 'Personalizar os espaços nominais onde pesquisar',
'search-result-size' => '$1 ({{PLURAL:$2|1 palavra|$2 palavras}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 ficheiro|$3 ficheiros}})',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(redireccionamento de $1)',
'search-section' => '(secção $1)',
@@ -1327,6 +1339,7 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
'contextlines' => 'Linhas por resultado:',
'contextchars' => 'Contexto por linha:',
'stub-threshold' => 'Links para páginas curtas terão <a href="#" class="stub">este formato</a> se elas ocuparem menos de (bytes):',
+'stub-threshold-disabled' => 'Desactivado',
'recentchangesdays' => 'Dias a apresentar nas mudanças recentes:',
'recentchangesdays-max' => '(máximo: $1 {{PLURAL:$1|dia|dias}})',
'recentchangescount' => 'Número de edições a apresentar por omissão:',
@@ -1360,6 +1373,7 @@ Eis um valor gerado aleatoriamente, que pode usar: $1",
'prefs-files' => 'Ficheiros',
'prefs-custom-css' => 'CSS personalizada',
'prefs-custom-js' => 'JS personalizado',
+'prefs-common-css-js' => 'CSS/JS partilhado por todos os temas:',
'prefs-reset-intro' => 'Pode usar esta página para repor as configurações padrão das preferências.
As suas preferências serão modificadas para os valores predefinidos do site.
Esta operação não pode ser desfeita.',
@@ -1399,9 +1413,15 @@ Também permite que outros entrem em contacto consigo através da sua página de
'prefs-advancedrendering' => 'Opções avançadas',
'prefs-advancedsearchoptions' => 'Opções avançadas',
'prefs-advancedwatchlist' => 'Opções avançadas',
-'prefs-display' => 'Opções de visionamento',
+'prefs-displayrc' => 'Opções de visionamento',
+'prefs-displaysearchoptions' => 'Opções de apresentação',
+'prefs-displaywatchlist' => 'Opções de apresentação',
'prefs-diffs' => 'Diferenças',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Parece válido',
+'email-address-validity-invalid' => 'Endereço válido necessário!',
+
# User rights
'userrights' => 'Privilégios dos utilizadores',
'userrights-lookup-user' => 'Gerir grupos do utilizador',
@@ -1485,6 +1505,7 @@ Também permite que outros entrem em contacto consigo através da sua página de
'right-hideuser' => 'Bloquear um nome de utilizador, escondendo-o do público',
'right-ipblock-exempt' => 'Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IPs',
'right-proxyunbannable' => 'Contornar bloqueios automáticos de proxies',
+'right-unblockself' => 'Desbloquearem-se a si próprios',
'right-protect' => 'Mudar níveis de protecção e editar páginas protegidas',
'right-editprotected' => 'Editar páginas protegidas (sem protecção em cascata)',
'right-editinterface' => 'Editar a interface de utilizador',
@@ -1507,7 +1528,6 @@ Também permite que outros entrem em contacto consigo através da sua página de
'right-siteadmin' => 'Bloquear e desbloquear a base de dados',
'right-reset-passwords' => 'Repor a palavra-chave de outros utilizadores',
'right-override-export-depth' => 'Exportar páginas incluindo páginas ligadas até uma profundidade de 5',
-'right-versiondetail' => 'Mostrar informações completas da versão de software',
'right-sendemail' => 'Enviar correio electrónico a outros utilizadores',
# User rights log
@@ -1558,14 +1578,9 @@ Também permite que outros entrem em contacto consigo através da sua página de
'recentchanges-legend' => 'Opções das mudanças recentes',
'recentchangestext' => 'Acompanhe nesta página as mudanças mais recentes da wiki.',
'recentchanges-feed-description' => "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - página nova',
'recentchanges-label-newpage' => 'Esta edição criou uma página nova',
-'recentchanges-legend-minor' => '$1 - edição menor',
'recentchanges-label-minor' => 'Esta é uma edição menor',
-'recentchanges-legend-bot' => '$1 - edição de robô',
'recentchanges-label-bot' => 'Esta edição foi feita por um robô',
-'recentchanges-legend-unpatrolled' => '$1 - edição não patrulhada',
'recentchanges-label-unpatrolled' => 'Esta edição ainda não foi patrulhada',
'rcnote' => "A seguir {{PLURAL:$1|está listada '''uma''' alteração ocorrida|estão listadas '''$1''' alterações ocorridas}} {{PLURAL:$2|no último dia|nos últimos '''$2''' dias}}, a partir das $5 de $4.",
'rcnotefrom' => 'Abaixo estão as mudanças desde <b>$2</b> (mostradas até <b>$1</b>).',
@@ -1612,6 +1627,9 @@ As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
'upload_directory_missing' => 'O directório de carregamento de ficheiros ($1) não existe e o servidor de internet não conseguiu criá-lo.',
'upload_directory_read_only' => 'O servidor de internet não possui permissão de escrita no directório de carregamento de ficheiros ($1).',
'uploaderror' => 'Erro ao carregar',
+'upload-recreate-warning' => "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''
+
+Para sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
'uploadtext' => "Utilize o formulário abaixo para fazer upload de ficheiros novos.
Para ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].
Os reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de uploads]] e as eliminações no [[Special:Log/delete|registo de eliminações]].
@@ -1648,6 +1666,17 @@ Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
'filetype-banned-type' => "'''\".\$1\"''' não é um tipo de ficheiro permitido.
{{PLURAL:\$3|O tipo permitido é|Os tipos permitidos são}} \$2.",
'filetype-missing' => 'O ficheiro não possui uma extensão (como, por exemplo, ".jpg").',
+'empty-file' => 'O ficheiro que enviou estava vazio.',
+'file-too-large' => 'O ficheiro que enviou era demasiado grande.',
+'filename-tooshort' => 'O nome do ficheiro é demasiado curto.',
+'filetype-banned' => 'Este tipo de ficheiro é proibido.',
+'verification-error' => 'O ficheiro não passou a verificação de ficheiros.',
+'hookaborted' => 'A modificação que pretendia foi abortada pelo hook de uma extensão.',
+'illegal-filename' => 'O nome do ficheiro não é permitido.',
+'overwrite' => 'Não é permitido gravar por cima de um ficheiro existente.',
+'unknown-error' => 'Ocorreu um erro desconhecido.',
+'tmp-create-error' => 'Não foi possível criar o ficheiro temporário.',
+'tmp-write-error' => 'Erro na escrita do ficheiro temporário.',
'large-file' => 'É recomendável que os ficheiros não sejam maiores que $1;
este tem $2.',
'largefileserver' => 'O tamanho deste ficheiro é superior ao permitido pela configuração do servidor.',
@@ -1678,13 +1707,14 @@ Caso deseje, mesmo assim, carregar o seu ficheiro, volte atrás e envie-o com um
'file-exists-duplicate' => 'Este ficheiro é um duplicado {{PLURAL:$1|do seguinte|dos seguintes}}:',
'file-deleted-duplicate' => 'Um ficheiro idêntico a este ([[:$1]]) foi eliminado anteriormente.
Verifique o motivo da eliminação do ficheiro antes de prosseguir com o re-envio.',
-'successfulupload' => 'Envio efectuado com sucesso',
'uploadwarning' => 'Aviso de envio',
'uploadwarning-text' => 'Modifique a descrição do ficheiro abaixo e tente novamente, por favor.',
'savefile' => 'Gravar ficheiro',
'uploadedimage' => 'carregou "[[$1]]"',
'overwroteimage' => 'foi enviada uma nova versão de "[[$1]]"',
'uploaddisabled' => 'Carregamentos impossibilitados',
+'copyuploaddisabled' => 'Upload por URL impossibilitado.',
+'uploadfromurl-queued' => 'O seu upload foi adicionado à fila.',
'uploaddisabledtext' => 'O carregamento de ficheiros está impossibilitado.',
'php-uploaddisabledtext' => 'O carregamento de ficheiros está impossibilitado no PHP.
Verifique a configuração file_uploads, por favor.',
@@ -1719,6 +1749,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- deixe esta linha exactamente como está -->',
+'upload-success-subj' => 'Envio efectuado com sucesso',
+'upload-success-msg' => 'O seu upload de [$2] foi bem sucedido. Está disponível aqui: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema no upload',
+'upload-failure-msg' => 'Ocorreu um problema com o seu upload de [$2]:
+
+$1',
+'upload-warning-subj' => 'Aviso de upload',
+'upload-warning-msg' => 'Ocorreu um problema no seu upload de [$2]. Pode voltar ao [[Special:Upload/stash/$1|formulário de upload]] para resolver o problema.',
'upload-proto-error' => 'Protocolo incorrecto',
'upload-proto-error-text' => 'O carregamento remoto de ficheiros requer endereços URL começados por <code>http://</code> ou <code>ftp://</code>.',
@@ -1783,6 +1821,7 @@ Clique um cabeçalho de coluna para alterar a ordenação.',
'listfiles_search_for' => 'Pesquisar por nome de imagem:',
'imgfile' => 'ficheiro',
'listfiles' => 'Ficheiros',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Utilizador',
@@ -1895,8 +1934,8 @@ A descrição na [$2 página de descrição] é mostrada abaixo.',
'statistics-edits' => 'Edições de páginas desde que a {{SITENAME}} foi instalada',
'statistics-edits-average' => 'Média de edições por página',
'statistics-views-total' => 'Total de visionamentos',
+'statistics-views-total-desc' => 'Não estão incluídos os visionamentos de páginas inexistentes e páginas especiais',
'statistics-views-peredit' => 'Visionamentos por edição',
-'statistics-jobqueue' => 'Tamanho da [http://www.mediawiki.org/wiki/Manual:Job_queue fila de tarefas]',
'statistics-users' => '[[Special:ListUsers|Utilizadores]] registados',
'statistics-users-active' => 'Utilizadores activos',
'statistics-users-active-desc' => 'Utilizadores que efectuaram uma operação {{PLURAL:$1|no último dia|nos últimos $1 dias}}',
@@ -1911,7 +1950,7 @@ Considera-se que uma página é de desambiguação se nela for utilizada uma pre
'doubleredirects' => 'Redireccionamentos duplos',
'doubleredirectstext' => 'Esta página lista todas as páginas que redireccionam para outras páginas de redireccionamento.
Cada linha contém links para o primeiro e segundo redireccionamentos, bem como o destino do segundo redireccionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redireccionamento.
-<s>Entradas cortadas</s> já foram solucionadas.',
+<del>Entradas cortadas</del> já foram solucionadas.',
'double-redirect-fixed-move' => '[[$1]] foi movido.
Agora redirecciona para [[$2]].',
'double-redirect-fixer' => 'Corrector de redireccionamentos',
@@ -1935,6 +1974,8 @@ Agora redirecciona para [[$2]].',
'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
'nrevisions' => '$1 {{PLURAL:$1|edição|edições}}',
'nviews' => '$1 {{PLURAL:$1|visita|visitas}}',
+'nimagelinks' => 'Usada {{PLURAL:$1|numa página|em $1 páginas}}',
+'ntransclusions' => 'usada {{PLURAL:$1|numa página|em $1 páginas}}',
'specialpage-empty' => 'Não existem dados para apresentar.',
'lonelypages' => 'Páginas órfãs',
'lonelypagestext' => 'As seguintes páginas não são destino de links nem são transcluídas a partir de outras páginas na {{SITENAME}}.',
@@ -2052,7 +2093,7 @@ Veja também as [[Special:WantedCategories|categorias desejadas]].',
'listusersfrom' => 'Mostrar utilizadores começando por:',
'listusers-submit' => 'Mostrar',
'listusers-noresult' => 'Não foram encontrados utilizadores.',
-'listusers-blocked' => '({{GENDER:$1|bloqueado|bloqueada}})',
+'listusers-blocked' => '(bloqueado)',
# Special:ActiveUsers
'activeusers' => 'Utilizadores activos',
@@ -2091,34 +2132,40 @@ Encontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações
'listgrouprights-removegroup-self-all' => 'Remover a própria conta de todos os grupos',
# E-mail user
-'mailnologin' => 'Nenhum endereço de envio',
-'mailnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] e possuir um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio electrónico a outros utilizadores.',
-'emailuser' => 'Contactar este utilizador',
-'emailpage' => 'Contactar utilizador',
-'emailpagetext' => 'Pode usar o formulário abaixo para enviar uma mensagem por correio electrónico para este utilizador.
+'mailnologin' => 'Nenhum endereço de envio',
+'mailnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] e possuir um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio electrónico a outros utilizadores.',
+'emailuser' => 'Contactar este utilizador',
+'emailpage' => 'Contactar utilizador',
+'emailpagetext' => 'Pode usar o formulário abaixo para enviar uma mensagem por correio electrónico para este utilizador.
O endereço de correio que introduziu nas suas [[Special:Preferences|preferências]] irá aparecer no campo do remetente da mensagem "De:", para que o destinatário lhe possa responder directamente.',
-'usermailererror' => 'O sistema de correio devolveu o erro:',
-'defemailsubject' => 'Correio da {{SITENAME}}',
-'noemailtitle' => 'Sem endereço de correio electrónico',
-'noemailtext' => 'Este utilizador não especificou um endereço de correio electrónico válido.',
-'nowikiemailtitle' => 'Correio electrónico não é permitido',
-'nowikiemailtext' => 'Este utilizador optou por não receber correio electrónico de outros utilizadores.',
-'email-legend' => 'Enviar correio electrónico para outro utilizador da {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'Para:',
-'emailsubject' => 'Assunto:',
-'emailmessage' => 'Mensagem:',
-'emailsend' => 'Enviar',
-'emailccme' => 'Enviar uma cópia desta mensagem para o meu correio electrónico.',
-'emailccsubject' => 'Cópia da sua mensagem para $1: $2',
-'emailsent' => 'Mensagem enviada',
-'emailsenttext' => 'A sua mensagem foi enviada.',
-'emailuserfooter' => 'Esta mensagem foi enviada por $1 para $2 usando a opção "Contactar este utilizador" da {{SITENAME}}.',
+'usermailererror' => 'O sistema de correio devolveu o erro:',
+'defemailsubject' => 'Correio da {{SITENAME}}',
+'usermaildisabled' => 'Correio electrónico do utilizador foi desactivado',
+'usermaildisabledtext' => 'Não pode enviar correio electrónico aos outros utilizadores desta wiki',
+'noemailtitle' => 'Sem endereço de correio electrónico',
+'noemailtext' => 'Este utilizador não especificou um endereço de correio electrónico válido.',
+'nowikiemailtitle' => 'Correio electrónico não é permitido',
+'nowikiemailtext' => 'Este utilizador optou por não receber correio electrónico de outros utilizadores.',
+'email-legend' => 'Enviar correio electrónico para outro utilizador da {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'Para:',
+'emailsubject' => 'Assunto:',
+'emailmessage' => 'Mensagem:',
+'emailsend' => 'Enviar',
+'emailccme' => 'Enviar uma cópia desta mensagem para o meu correio electrónico.',
+'emailccsubject' => 'Cópia da sua mensagem para $1: $2',
+'emailsent' => 'Mensagem enviada',
+'emailsenttext' => 'A sua mensagem foi enviada.',
+'emailuserfooter' => 'Esta mensagem foi enviada por $1 para $2 usando a opção "Contactar este utilizador" da {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Deixar mensagem de sistema.',
+'usermessage-editor' => 'Editor de mensagens de sistema',
# Watchlist
'watchlist' => 'Páginas vigiadas',
'mywatchlist' => 'Páginas vigiadas',
-'watchlistfor' => "(para '''$1''')",
+'watchlistfor2' => 'Para $1 $2',
'nowatchlist' => 'A sua lista de páginas vigiadas está vazia.',
'watchlistanontext' => '$1 para ver ou editar a sua lista de páginas vigiadas, por favor.',
'watchnologin' => 'Não está autenticado',
@@ -2126,7 +2173,7 @@ O endereço de correio que introduziu nas suas [[Special:Preferences|preferênci
'addedwatch' => 'Adicionado à lista',
'addedwatchtext' => "A página \"[[:\$1]]\" foi adicionada à sua lista de [[Special:Watchlist|páginas vigiadas]], onde serão indicadas quaisquer
modificações futuras desta página e da respectiva página de discussão.
-O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:RecentChanges|mudanças recentes]] para que a encontre facilmente.",
+O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:RecentChanges|mudanças recentes]], para que a encontre facilmente.",
'removedwatch' => 'Removida da lista de páginas vigiadas',
'removedwatchtext' => 'A página "[[:$1]]" foi removida da sua lista de [[Special:Watchlist|páginas vigiadas]].',
'watch' => 'Vigiar',
@@ -2164,7 +2211,7 @@ O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:R
'enotif_body' => 'Caro(a) $WATCHINGUSERNAME,
-A página $PAGETITLE na {{SITENAME}} foi $CHANGEDORCREATED a $PAGEEDITDATE por $PAGEEDITOR; consulte $PAGETITLE_URL para a versão actual.
+A página $PAGETITLE da {{SITENAME}} foi $CHANGEDORCREATED a $PAGEEDITDATE por $PAGEEDITOR; consulte $PAGETITLE_URL para ver a versão actual.
$NEWPAGE
@@ -2174,19 +2221,22 @@ Contacte o editor:
correio electrónico: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Até que visite esta página, não haverá lugar a mais notificações no caso de alterações futuras.
-Pode também reactivar as notificações para todas as suas páginas vigiadas na sua lista de páginas vigiadas.
+Até que visite esta página, não receberá mais notificações das alterações futuras.
+Pode também reactivar as notificações para todas páginas na sua lista de páginas vigiadas.
O seu sistema de notificação amigável da {{SITENAME}}
--
-Para alterar as suas preferências da lista de páginas vigiadas, visite
+Para alterar as suas preferências das notificações por correio electrónico, visite
+{{fullurl:{{#special:Preferences}}}}
+
+Para alterar as suas preferências das páginas vigiadas, visite
{{fullurl:{{#special:Watchlist}}/edit}}
-Para retirar a página da sua lista de páginas vigiadas, visite
+Para retirar a página da lista de páginas vigiadas, visite
$UNWATCHURL
-Contacto e assistência:
+Para comentários e pedidos de ajuda:
{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
@@ -2219,9 +2269,9 @@ Consulte $2 para um registo de eliminações recentes.',
** Violação de direitos de autor
** Vandalismo',
'delete-edit-reasonlist' => 'Editar motivos de eliminação',
-'delete-toobig' => 'Esta página possui um longo histórico, com mais de $1 {{PLURAL:$1|edição|edições}}.
-A eliminação de tais páginas foi restringida na {{SITENAME}}, para evitar problemas acidentais.',
-'delete-warning-toobig' => 'Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.
+'delete-toobig' => 'Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
+A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.',
+'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
prossiga com precaução.',
@@ -2239,7 +2289,10 @@ A última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-
'revertpage' => 'Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]',
'revertpage-nouser' => 'Revertidas as edições de (nome de utilizador removido) para a última revisão por [[User:$1|$1]]',
'rollback-success' => 'Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.',
-'sessionfailure' => 'Foram detectados problemas com a sua sessão;
+
+# Edit tokens
+'sessionfailure-title' => 'Erro de sessão',
+'sessionfailure' => 'Foram detectados problemas com a sua sessão;
esta operação foi cancelada como medida de protecção contra a intercepção de sessões.
Clique o botão "Voltar" e recarregue a página de onde veio, depois tente novamente.',
@@ -2264,7 +2317,7 @@ Consulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as p
Esta é a configuração presente para a página '''$1''':",
'protect-locked-dblock' => "Não é possível alterar os níveis de protecção, porque a base de dados está bloqueada.
Esta é a configuração actual para a página '''$1''':",
-'protect-locked-access' => "A sua conta não possui permissões para alterar os níveis de protecção de uma página.
+'protect-locked-access' => "A sua conta não tem permissão de alterar os níveis de protecção de uma página.
Esta é a configuração actual da página '''$1''':",
'protect-cascadeon' => 'Esta página está protegida porque se encontra incluída {{PLURAL:$1|na página listada a seguir, protegida|nas páginas listadas a seguir, protegidas}} com protecção em cascata.
Pode alterar o nível de protecção desta página, mas isso não afectará a protecção em cascata.',
@@ -2371,19 +2424,23 @@ $1',
'month' => 'Até o mês:',
'year' => 'Até o ano:',
-'sp-contributions-newbies' => 'Mostrar só as contribuições das contas recentes',
-'sp-contributions-newbies-sub' => 'Para contas novas',
-'sp-contributions-newbies-title' => 'Contribuições de contas novas',
-'sp-contributions-blocklog' => 'registo de bloqueios',
-'sp-contributions-deleted' => 'contribuições eliminadas',
-'sp-contributions-logs' => 'registos',
-'sp-contributions-talk' => 'discussão',
-'sp-contributions-userrights' => 'gestão de privilégios de utilizador',
-'sp-contributions-blocked-notice' => 'Este utilizador encontra-se actualmente bloqueado.
+'sp-contributions-newbies' => 'Mostrar só as contribuições das contas recentes',
+'sp-contributions-newbies-sub' => 'Para contas novas',
+'sp-contributions-newbies-title' => 'Contribuições de contas novas',
+'sp-contributions-blocklog' => 'registo de bloqueios',
+'sp-contributions-deleted' => 'contribuições eliminadas',
+'sp-contributions-uploads' => 'uploads',
+'sp-contributions-logs' => 'registos',
+'sp-contributions-talk' => 'discussão',
+'sp-contributions-userrights' => 'gestão de privilégios de utilizador',
+'sp-contributions-blocked-notice' => 'Este utilizador encontra-se actualmente bloqueado.
Para referência, o último registo de bloqueio é apresentado abaixo:',
-'sp-contributions-search' => 'Pesquisar contribuições',
-'sp-contributions-username' => 'Endereço IP ou utilizador:',
-'sp-contributions-submit' => 'Pesquisar',
+'sp-contributions-blocked-notice-anon' => 'Este endereço IP está bloqueado neste momento.
+Para sua referência, encontra abaixo a entrada mais recente no registo de bloqueios:',
+'sp-contributions-search' => 'Pesquisar contribuições',
+'sp-contributions-username' => 'Endereço IP ou utilizador:',
+'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
+'sp-contributions-submit' => 'Pesquisar',
# What links here
'whatlinkshere' => 'Páginas afluentes',
@@ -2443,7 +2500,6 @@ Consulte a [[Special:IPBlockList|lista de IPs bloqueados]] para rever os bloquei
'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
'ipb-unblock-addr' => 'Desbloquear $1',
'ipb-unblock' => 'Desbloquear um utilizador ou endereço IP',
-'ipb-blocklist-addr' => 'Bloqueios em vigência para $1',
'ipb-blocklist' => 'Ver bloqueios em vigência',
'ipb-blocklist-contribs' => 'Contribuições de $1',
'unblockip' => 'Desbloquear utilizador',
@@ -2515,6 +2571,8 @@ Contacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-
'sorbs_create_account_reason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta",
'cant-block-while-blocked' => 'Não pode bloquear outros utilizadores enquanto estiver bloqueado.',
'cant-see-hidden-user' => "O utilizador que está tentando bloquear já está bloqueado e oculto. Como não possui privilégio de bloquear utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
+'ipbblocked' => 'Não pode bloquear ou desbloquear outros, porque está bloqueado',
+'ipbnounblockself' => 'Não lhe é permitido desbloquear-se a si mesmo',
# Developer tools
'lockdb' => 'Bloquear a base de dados',
@@ -2551,6 +2609,17 @@ Isto significa que pode mover uma página de volta para o seu nome original se a
'''CUIDADO!'''
Numa página popular esta operação pode representar uma mudança drástica e inesperada;
certifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
+'movepagetext-noredirectfixer' => "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.
+A página antiga é transformada numa página de redireccionamento para a nova.
+Verifique a existência de [[Special:DoubleRedirects|redireccionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].
+É da sua responsabilidade certificar-se de que os links continuam a apontar para onde é suposto.
+
+Note que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redireccionamento e não tenha um histórico de edições.
+Isto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.
+
+'''Aviso!'''
+Para páginas populares, esta operação pode representar uma mudança drástica e inesperada;
+certifique-se de que compreende as consequências da operação antes de continuar.",
'movepagetalktext' => "Se existir uma página de discussão associada, ela será automaticamente movida, '''a não ser que:'''
*já exista uma página de discussão com o novo título que não esteja vazia, ou
*desmarque a correspondente caixa de selecção abaixo.
@@ -2607,6 +2676,7 @@ não é possível mover uma página para ela mesma.',
'immobile-source-page' => 'Esta página não pode ser movida.',
'immobile-target-page' => 'Não é possível mover para esse título de destino.',
'imagenocrossnamespace' => 'Não é possível mover imagem para espaço nominal que não de imagens',
+'nonfile-cannot-move-to-file' => 'Não é possível mover algo que não é um ficheiro para o espaço nominal de ficheiros',
'imagetypemismatch' => 'A extensão do novo ficheiro não corresponde ao seu tipo',
'imageinvalidfilename' => 'O nome do ficheiro alvo é inválido',
'fix-double-redirects' => 'Actualizar todos os redireccionamentos que apontem para o título original',
@@ -2686,6 +2756,7 @@ Grave o ficheiro no seu computador e importe-o aqui.',
'importstart' => 'Importando páginas...',
'import-revision-count' => '{{PLURAL:$1|uma edição|$1 edições}}',
'importnopages' => 'Não existem páginas a importar.',
+'imported-log-entries' => '{{PLURAL:$1|Foi importada $1 entrada|Foram importadas $1 entradas}} de registo.',
'importfailed' => 'A importação falhou: $1',
'importunknownsource' => 'Tipo da fonte de importação desconhecido',
'importcantopen' => 'Não foi possível abrir o ficheiro a importar',
@@ -2783,6 +2854,8 @@ Utilize o botão "Antever resultado" antes de gravar, por favor.',
'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
'tooltip-undo' => '"desfazer" reverte esta edição e apresenta a página de edição no modo de antevisão.
Permite colocar uma justificação no resumo da edição.',
+'tooltip-preferences-save' => 'Gravar preferências',
+'tooltip-summary' => 'Introduza um resumo breve',
# Stylesheets
'common.css' => '/* Código CSS colocado aqui será aplicado a todos os temas */',
@@ -2811,13 +2884,13 @@ Permite colocar uma justificação no resumo da edição.',
'vector.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */',
# Metadata
-'nodublincore' => 'Os metadados RDF para Dublin Core foram impossibilitados neste servidor.',
-'nocreativecommons' => 'Os metadados RDF para Creative Commons foram impossibilitados neste servidor.',
+'nodublincore' => 'O uso de metadados RDF para Dublin Core foi impossibilitado neste servidor.',
+'nocreativecommons' => 'O uso de metadados RDF da Creative Commons foi impossibilitado neste servidor.',
'notacceptable' => 'O servidor não pode fornecer os dados num formato que o seu cliente possa ler.',
# Attribution
'anonymous' => '{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da {{SITENAME}}',
-'siteuser' => '{{GENDER:$2|um utilizador|uma utilizadora|um utilizador}} da {{SITENAME}} ($1)',
+'siteuser' => '$1 da {{SITENAME}}',
'anonuser' => 'utilizador anónimo $1 da {{SITENAME}}',
'lastmodifiedatby' => 'Esta página foi modificada pela última vez às $2 de $1 por $3.',
'othercontribs' => 'Baseado no trabalho de $1.',
@@ -2915,14 +2988,17 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'imagemaxsize' => "Limite de tamanho de imagens:<br />''(para páginas de descrição)''",
'thumbsize' => 'Tamanho de miniaturas:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|página|páginas}}',
-'file-info' => '(tamanho: $1, tipo MIME: $2)',
-'file-info-size' => '($1 × $2 pixels, tamanho: $3, tipo MIME: $4)',
+'file-info' => 'tamanho: $1, tipo MIME: $2',
+'file-info-size' => '$1 × $2 pixels, tamanho: $3, tipo MIME: $4',
'file-nohires' => '<small>Sem resolução maior disponível.</small>',
-'svg-long-desc' => '(ficheiro SVG, de $1 × $2 pixels, tamanho: $3)',
+'svg-long-desc' => 'ficheiro SVG, de $1 × $2 pixels, tamanho: $3',
'show-big-image' => 'Resolução completa',
'show-big-image-thumb' => '<small>Dimensões desta antevisão: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'cíclico',
'file-info-gif-frames' => '$1 {{PLURAL:$1|quadro|quadros}}',
+'file-info-png-looped' => 'ciclo infinito',
+'file-info-png-repeat' => 'reproduzido $1 {{PLURAL:$1|vez|vezes}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogramas}}',
# Special:NewFiles
'newimages' => 'Galeria de novos ficheiros',
@@ -3077,6 +3153,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
'exif-gpsareainformation' => 'Nome da área do GPS',
'exif-gpsdatestamp' => 'Data do GPS',
'exif-gpsdifferential' => 'Correcção do diferencial do GPS',
+'exif-objectname' => 'Título curto',
# EXIF attributes
'exif-compression-1' => 'Descomprimido',
@@ -3236,30 +3313,30 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
'limitall' => 'tudo',
# E-mail address confirmation
-'confirmemail' => 'Confirmar endereço de correio electrónico',
-'confirmemail_noemail' => 'Não tem um endereço de correio electrónico válido nas suas [[Special:Preferences|preferências de utilizador]].',
-'confirmemail_text' => 'A {{SITENAME}} requer que valide o seu endereço de correio electrónico antes de usar as funcionalidades de correio.
+'confirmemail' => 'Confirmar endereço de correio electrónico',
+'confirmemail_noemail' => 'Não tem um endereço de correio electrónico válido nas suas [[Special:Preferences|preferências de utilizador]].',
+'confirmemail_text' => 'A {{SITENAME}} requer que valide o seu endereço de correio electrónico antes de usar as funcionalidades de correio.
Clique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.
A mensagem incluíra uma URL que contém um código;
insira a URL no seu browser para confirmar que o seu endereço de correio electrónico é válido.',
-'confirmemail_pending' => 'Um código de confirmação já lhe foi enviado;
+'confirmemail_pending' => 'Um código de confirmação já lhe foi enviado;
caso tenha criado a conta recentemente, é recomendado que aguarde alguns minutos até o receber antes de tentar pedir um novo código.',
-'confirmemail_send' => 'Enviar código de confirmação',
-'confirmemail_sent' => 'Correio de confirmação enviado.',
-'confirmemail_oncreate' => 'Foi enviado um código de confirmação para o seu endereço de correio electrónico.
+'confirmemail_send' => 'Enviar código de confirmação',
+'confirmemail_sent' => 'Correio de confirmação enviado.',
+'confirmemail_oncreate' => 'Foi enviado um código de confirmação para o seu endereço de correio electrónico.
Este código não é necessário para se autenticar no sistema, mas será necessário para activar qualquer funcionalidade baseada no uso de correio na wiki.',
-'confirmemail_sendfailed' => 'A {{SITENAME}} não conseguiu enviar o correio de confirmação.
+'confirmemail_sendfailed' => 'A {{SITENAME}} não conseguiu enviar o correio de confirmação.
Verifique se o seu endereço de correio electrónico possui caracteres inválidos.
O sistema de correio devolveu o erro: $1',
-'confirmemail_invalid' => 'Código de confirmação inválido. O código poderá ter expirado.',
-'confirmemail_needlogin' => 'Precisa de $1 para confirmar o seu endereço de correio electrónico.',
-'confirmemail_success' => 'O seu endereço de correio electrónico foi confirmado.
+'confirmemail_invalid' => 'Código de confirmação inválido. O código poderá ter expirado.',
+'confirmemail_needlogin' => 'Precisa de $1 para confirmar o seu endereço de correio electrónico.',
+'confirmemail_success' => 'O seu endereço de correio electrónico foi confirmado.
Pode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.',
-'confirmemail_loggedin' => 'O seu endereço de correio electrónico foi confirmado.',
-'confirmemail_error' => 'Alguma coisa correu mal ao gravar a sua confirmação.',
-'confirmemail_subject' => 'Confirmação de endereço de correio electrónico da {{SITENAME}}',
-'confirmemail_body' => 'Alguém, provavelmente você a partir do endereço IP $1,
+'confirmemail_loggedin' => 'O seu endereço de correio electrónico foi confirmado.',
+'confirmemail_error' => 'Alguma coisa correu mal ao gravar a sua confirmação.',
+'confirmemail_subject' => 'Confirmação de endereço de correio electrónico da {{SITENAME}}',
+'confirmemail_body' => 'Alguém, provavelmente você a partir do endereço IP $1,
registou uma conta "$2" com este endereço de correio electrónico na {{SITENAME}}.
Para confirmar que esta conta é realmente sua e activar
@@ -3273,9 +3350,39 @@ a confirmação do endereço de correio electrónico:
$5
-Este código de confirmação irá expirar às $7 de $6.',
-'confirmemail_invalidated' => 'Confirmação de endereço de correio electrónico cancelada',
-'invalidateemail' => 'Cancelar confirmação de correio electrónico',
+Este código de confirmação expira a $4.',
+'confirmemail_body_changed' => 'Alguém, provavelmente você a partir do endereço IP $1,
+alterou o endereço de correio electrónico da conta "$2" para este na {{SITENAME}}.
+
+Para confirmar que esta conta é realmente sua e reactivar
+as funcionalidades de correio electrónico na {{SITENAME}},
+abra o seguinte link no seu browser:
+
+$3
+
+Caso a conta *não* lhe pertença, abra o seguinte link
+para cancelar a confirmação do endereço de correio electrónico:
+
+$5
+
+Este código de confirmação expira a $4.',
+'confirmemail_body_set' => 'Alguém, provavelmente você a partir do endereço IP $1,
+definiu o seu endereço de correio electrónico como correio da conta "$2" na {{SITENAME}}.
+
+Para confirmar que esta conta é realmente sua e reactivar
+as funcionalidades de correio electrónico na {{SITENAME}},
+abra o seguinte link no seu browser:
+
+$3
+
+Caso a conta *não* lhe pertença, abra o seguinte link
+para cancelar a confirmação do endereço de correio electrónico:
+
+$5
+
+Este código de confirmação expira a $4.',
+'confirmemail_invalidated' => 'Confirmação de endereço de correio electrónico cancelada',
+'invalidateemail' => 'Cancelar confirmação de correio electrónico',
# Scary transclusion
'scarytranscludedisabled' => '[Transclusão interwikis foi impossibilitada]',
@@ -3315,6 +3422,7 @@ Confirme que deseja realmente recriar esta página, por favor.",
'table_pager_first' => 'Primeira página',
'table_pager_last' => 'Última página',
'table_pager_limit' => 'Mostrar $1 por página',
+'table_pager_limit_label' => 'Entradas por página:',
'table_pager_limit_submit' => 'Ir',
'table_pager_empty' => 'Sem resultados',
@@ -3373,6 +3481,7 @@ Também pode [[Special:Watchlist/edit|editar a lista da maneira convencional]].'
'version-specialpages' => 'Páginas especiais',
'version-parserhooks' => "''Hooks'' do analisador sintáctico",
'version-variables' => 'Variáveis',
+'version-skins' => 'Temas',
'version-other' => 'Diversos',
'version-mediahandlers' => 'Leitura e tratamento de multimédia',
'version-hooks' => 'Hooks',
@@ -3384,6 +3493,13 @@ Também pode [[Special:Watchlist/edit|editar a lista da maneira convencional]].'
'version-hook-subscribedby' => 'Subscrito por',
'version-version' => '(Versão $1)',
'version-license' => 'Licença',
+'version-poweredby-credits' => "Esta é uma wiki '''[http://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.
+
+O MediaWiki é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; inclusive, sem a garantia implícita da POSSIBILIDADE DE SER COMERCIALIZADO ou de ADEQUAÇÂO PARA QUALQUER FINALIDADE ESPECÃFICA. Consulte a licença GNU General Public License para mais detalhes.
+
+Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYING uma cópia da licença GNU General Public License]; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html leia-a na internet].',
'version-software' => 'Software instalado',
'version-software-product' => 'Produto',
'version-software-version' => 'Versão',
@@ -3455,6 +3571,15 @@ Introduza o nome do ficheiro sem o prefixo \"{{ns:file}}:\".",
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
+# Special:ComparePages
+'comparepages' => 'Comparar páginas',
+'compare-selector' => 'Comparar edições da página',
+'compare-page1' => 'Página 1',
+'compare-page2' => 'Página 2',
+'compare-rev1' => 'Edição 1',
+'compare-rev2' => 'Edição 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
'dberr-header' => 'Esta wiki tem um problema',
'dberr-problems' => 'Desculpe! Este site está a experienciar dificuldades técnicas.',
@@ -3471,8 +3596,13 @@ Introduza o nome do ficheiro sem o prefixo \"{{ns:file}}:\".",
'htmlform-float-invalid' => 'O valor que especificou não é um número.',
'htmlform-int-toolow' => 'O valor que especificou é inferior ao mínimo de $1',
'htmlform-int-toohigh' => 'O valor que especificou é superior ao máximo de $1',
+'htmlform-required' => 'Este valor é necessário',
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfazer alterações',
'htmlform-selectorother-other' => 'Outros',
+# SQLite database support
+'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
+'sqlite-no-fts' => '$1 sem suporte de pesquisa de texto completo',
+
);
diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php
index 02952a29..ef39e48b 100644
--- a/languages/messages/MessagesPt_br.php
+++ b/languages/messages/MessagesPt_br.php
@@ -20,6 +20,7 @@
* @author Eduardo.mps
* @author GKnedo
* @author Giro720
+ * @author GoEThe
* @author Hamilton Abreu
* @author Helder.wiki
* @author Heldergeovane
@@ -31,6 +32,7 @@
* @author Luckas Blade
* @author Malafaya
* @author McDutchie
+ * @author Raylton P. Sousa
* @author Rodrigo Calanca Nishino
* @author Urhixidur
* @author Vuln
@@ -40,10 +42,10 @@
* @author 555
*/
-$fallback = 'pt';
+$fallback = 'pt';
$namespaceNames = array(
- NS_MEDIA => 'Media',
+ NS_MEDIA => 'Mídia',
NS_SPECIAL => 'Especial',
NS_TALK => 'Discussão',
NS_USER => 'Usuário',
@@ -79,96 +81,98 @@ $dateFormats = array(
);
-$separatorTransformTable = array(',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => ' ', '.' => ',' );
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redirecionamentos duplos' ),
- 'BrokenRedirects' => array( 'Redirecionamentos quebrados' ),
- 'Disambiguations' => array( 'Páginas de desambiguação', 'Desambiguar', 'Desambiguações' ),
+ 'DoubleRedirects' => array( 'Redirecionamentos_duplos' ),
+ 'BrokenRedirects' => array( 'Redirecionamentos_quebrados' ),
+ 'Disambiguations' => array( 'Páginas_de_desambiguação', 'Desambiguar', 'Desambiguações' ),
'Userlogin' => array( 'Autenticar-se', 'Entrar', 'Login' ),
'Userlogout' => array( 'Sair', 'Logout' ),
- 'CreateAccount' => array( 'Criar conta' ),
+ 'CreateAccount' => array( 'Criar_conta' ),
'Preferences' => array( 'Preferências' ),
- 'Watchlist' => array( 'Páginas vigiadas', 'Artigos vigiados', 'Vigiados' ),
- 'Recentchanges' => array( 'Mudanças recentes', 'Recentes' ),
- 'Upload' => array( 'Carregar arquivo', 'Carregar imagem', 'Carregar ficheiro', 'Enviar' ),
- 'Listfiles' => array( 'Lista de arquivos', 'Lista de imagens', 'Lista de ficheiros' ),
- 'Newimages' => array( 'Arquivos novos', 'Imagens novas', 'Ficheiros novos' ),
- 'Listusers' => array( 'Lista de usuários', 'Lista de utilizadores' ),
- 'Listgrouprights' => array( 'Listar privilégios de grupos' ),
+ 'Watchlist' => array( 'Páginas_vigiadas', 'Artigos_vigiados', 'Vigiados' ),
+ 'Recentchanges' => array( 'Mudanças_recentes', 'Recentes' ),
+ 'Upload' => array( 'Carregar_arquivo', 'Carregar_imagem', 'Carregar_ficheiro', 'Enviar' ),
+ 'Listfiles' => array( 'Lista_de_arquivos', 'Lista_de_imagens', 'Lista_de_ficheiros' ),
+ 'Newimages' => array( 'Arquivos_novos', 'Imagens_novas', 'Ficheiros_novos' ),
+ 'Listusers' => array( 'Lista_de_usuários', 'Lista_de_utilizadores' ),
+ 'Listgrouprights' => array( 'Listar_privilégios_de_grupos' ),
'Statistics' => array( 'Estatísticas' ),
- 'Randompage' => array( 'Aleatória', 'Aleatório', 'Página aleatória', 'Artigo aleatório' ),
- 'Lonelypages' => array( 'Páginas órfãs', 'Artigos órfãos', 'Páginas sem afluentes', 'Artigos sem afluentes' ),
- 'Uncategorizedpages' => array( 'Páginas sem categorias', 'Artigos sem categorias' ),
- 'Uncategorizedcategories' => array( 'Categorias sem categorias' ),
- 'Uncategorizedimages' => array( 'Arquivos sem categorias', 'Imagens sem categorias', 'Ficheiros sem categorias' ),
- 'Uncategorizedtemplates' => array( 'Predefinições não categorizadas', 'Predefinições sem categorias' ),
- 'Unusedcategories' => array( 'Categorias não utilizadas', 'Categorias sem uso' ),
- 'Unusedimages' => array( 'Arquivos sem uso', 'Arquivos não utilizados', 'Imagens sem uso', 'Imagens não utilizadas', 'Ficheiros sem uso', 'Ficheiros não utilizados' ),
- 'Wantedpages' => array( 'Páginas pedidas', 'Páginas em falta', 'Artigos em falta', 'Artigos pedidos' ),
- 'Wantedcategories' => array( 'Categorias pedidas', 'Categorias em falta', 'Categorias inexistentes' ),
- 'Wantedfiles' => array( 'Arquivos pedidos', 'Arquivos em falta', 'Ficheiros em falta', 'Imagens em falta' ),
- 'Wantedtemplates' => array( 'Predefinições pedidas', 'Predefinições em falta' ),
- 'Mostlinked' => array( 'Páginas com mais afluentes', 'Artigos com mais afluentes' ),
- 'Mostlinkedcategories' => array( 'Categorias com mais afluentes' ),
- 'Mostlinkedtemplates' => array( 'Predefinições com mais afluentes' ),
- 'Mostimages' => array( 'Imagens com mais afluentes', 'Ficheiros com mais afluentes', 'Arquivos com mais afluentes' ),
- 'Mostcategories' => array( 'Páginas com mais categorias', 'Artigos com mais categorias' ),
- 'Mostrevisions' => array( 'Páginas com mais edições', 'Artigos com mais edições' ),
- 'Fewestrevisions' => array( 'Páginas com menos edições', 'Artigos com menos edições', 'Artigos menos editados' ),
- 'Shortpages' => array( 'Páginas curtas', 'Artigos curtos' ),
- 'Longpages' => array( 'Páginas longas', 'Artigos extensos' ),
- 'Newpages' => array( 'Páginas novas', 'Artigos novos' ),
- 'Ancientpages' => array( 'Páginas inativas', 'Artigos inativos' ),
- 'Deadendpages' => array( 'Páginas sem saída', 'Artigos sem saída' ),
- 'Protectedpages' => array( 'Páginas protegidas', 'Artigos protegidos' ),
- 'Protectedtitles' => array( 'Títulos protegidos' ),
- 'Allpages' => array( 'Todas as páginas', 'Todos os artigos', 'Todas páginas', 'Todos artigos' ),
- 'Prefixindex' => array( 'Ãndice de prefixo', 'Ãndice por prefixo' ),
- 'Ipblocklist' => array( 'Registro de bloqueios', 'IPs bloqueados', 'Utilizadores bloqueados', 'Usuários bloqueados', 'Registo de bloqueios' ),
- 'Specialpages' => array( 'Páginas especiais' ),
+ 'Randompage' => array( 'Aleatória', 'Aleatório', 'Página_aleatória', 'Artigo_aleatório' ),
+ 'Lonelypages' => array( 'Páginas_órfãs', 'Artigos_órfãos', 'Páginas_sem_afluentes', 'Artigos_sem_afluentes' ),
+ 'Uncategorizedpages' => array( 'Páginas_sem_categorias', 'Artigos_sem_categorias' ),
+ 'Uncategorizedcategories' => array( 'Categorias_sem_categorias' ),
+ 'Uncategorizedimages' => array( 'Arquivos_sem_categorias', 'Imagens_sem_categorias', 'Ficheiros_sem_categorias' ),
+ 'Uncategorizedtemplates' => array( 'Predefinições_não_categorizadas', 'Predefinições_sem_categorias' ),
+ 'Unusedcategories' => array( 'Categorias_não_utilizadas', 'Categorias_sem_uso' ),
+ 'Unusedimages' => array( 'Arquivos_sem_uso', 'Arquivos_não_utilizados', 'Imagens_sem_uso', 'Imagens_não_utilizadas', 'Ficheiros_sem_uso', 'Ficheiros_não_utilizados' ),
+ 'Wantedpages' => array( 'Páginas_pedidas', 'Páginas_em_falta', 'Artigos_em_falta', 'Artigos_pedidos' ),
+ 'Wantedcategories' => array( 'Categorias_pedidas', 'Categorias_em_falta', 'Categorias_inexistentes' ),
+ 'Wantedfiles' => array( 'Arquivos_pedidos', 'Arquivos_em_falta', 'Ficheiros_em_falta', 'Imagens_em_falta' ),
+ 'Wantedtemplates' => array( 'Predefinições_pedidas', 'Predefinições_em_falta' ),
+ 'Mostlinked' => array( 'Páginas_com_mais_afluentes', 'Artigos_com_mais_afluentes' ),
+ 'Mostlinkedcategories' => array( 'Categorias_com_mais_afluentes' ),
+ 'Mostlinkedtemplates' => array( 'Predefinições_com_mais_afluentes' ),
+ 'Mostimages' => array( 'Imagens_com_mais_afluentes', 'Ficheiros_com_mais_afluentes', 'Arquivos_com_mais_afluentes' ),
+ 'Mostcategories' => array( 'Páginas_com_mais_categorias', 'Artigos_com_mais_categorias' ),
+ 'Mostrevisions' => array( 'Páginas_com_mais_edições', 'Artigos_com_mais_edições' ),
+ 'Fewestrevisions' => array( 'Páginas_com_menos_edições', 'Artigos_com_menos_edições', 'Artigos_menos_editados' ),
+ 'Shortpages' => array( 'Páginas_curtas', 'Artigos_curtos' ),
+ 'Longpages' => array( 'Páginas_longas', 'Artigos_extensos' ),
+ 'Newpages' => array( 'Páginas_novas', 'Artigos_novos' ),
+ 'Ancientpages' => array( 'Páginas_inativas', 'Artigos_inativos' ),
+ 'Deadendpages' => array( 'Páginas_sem_saída', 'Artigos_sem_saída' ),
+ 'Protectedpages' => array( 'Páginas_protegidas', 'Artigos_protegidos' ),
+ 'Protectedtitles' => array( 'Títulos_protegidos' ),
+ 'Allpages' => array( 'Todas_as_páginas', 'Todos_os_artigos', 'Todas_páginas', 'Todos_artigos' ),
+ 'Prefixindex' => array( 'Ãndice_de_prefixo', 'Ãndice_por_prefixo' ),
+ 'Ipblocklist' => array( 'Registro_de_bloqueios', 'IPs_bloqueados', 'Utilizadores_bloqueados', 'Usuários_bloqueados', 'Registo_de_bloqueios' ),
+ 'Unblock' => array( 'Desbloquear' ),
+ 'Specialpages' => array( 'Páginas_especiais' ),
'Contributions' => array( 'Contribuições' ),
- 'Emailuser' => array( 'Contatar usuário', 'Contactar usuário', 'Contactar utilizador' ),
- 'Confirmemail' => array( 'Confirmar e-mail', 'Confirmar email' ),
- 'Whatlinkshere' => array( 'Páginas afluentes', 'Artigos afluentes' ),
- 'Recentchangeslinked' => array( 'Mudanças relacionadas', 'Novidades relacionadas' ),
- 'Movepage' => array( 'Mover página', 'Mover', 'Mover artigo' ),
+ 'Emailuser' => array( 'Contatar_usuário', 'Contactar_usuário', 'Contactar_utilizador' ),
+ 'Confirmemail' => array( 'Confirmar_e-mail', 'Confirmar_email' ),
+ 'Whatlinkshere' => array( 'Páginas_afluentes', 'Artigos_afluentes' ),
+ 'Recentchangeslinked' => array( 'Mudanças_relacionadas', 'Novidades_relacionadas' ),
+ 'Movepage' => array( 'Mover_página', 'Mover', 'Mover_artigo' ),
'Blockme' => array( 'Bloquear-me', 'Auto-bloqueio' ),
- 'Booksources' => array( 'Fontes de livros' ),
+ 'Booksources' => array( 'Fontes_de_livros' ),
'Categories' => array( 'Categorias' ),
'Export' => array( 'Exportar' ),
'Version' => array( 'Versão', 'Sobre' ),
- 'Allmessages' => array( 'Todas as mensagens', 'Todas mensagens' ),
+ 'Allmessages' => array( 'Todas_as_mensagens', 'Todas_mensagens' ),
'Log' => array( 'Registro', 'Registos', 'Registros', 'Registo' ),
- 'Blockip' => array( 'Bloquear', 'Bloquear IP', 'Bloquear utilizador', 'Bloquear usuário' ),
- 'Undelete' => array( 'Restaurar', 'Restaurar páginas eliminadas', 'Restaurar artigos eliminados' ),
+ 'Blockip' => array( 'Bloquear', 'Bloquear_IP', 'Bloquear_utilizador', 'Bloquear_usuário' ),
+ 'Undelete' => array( 'Restaurar', 'Restaurar_páginas_eliminadas', 'Restaurar_artigos_eliminados' ),
'Import' => array( 'Importar' ),
- 'Lockdb' => array( 'Bloquear banco de dados', 'Bloquear a base de dados' ),
- 'Unlockdb' => array( 'Desbloquear banco de dados', 'Desbloquear a base de dados' ),
+ 'Lockdb' => array( 'Bloquear_banco_de_dados', 'Bloquear_a_base_de_dados' ),
+ 'Unlockdb' => array( 'Desbloquear_banco_de_dados', 'Desbloquear_a_base_de_dados' ),
'Userrights' => array( 'Privilégios', 'Direitos', 'Estatutos' ),
- 'MIMEsearch' => array( 'Busca MIME' ),
- 'FileDuplicateSearch' => array( 'Busca de arquivos duplicados', 'Busca de ficheiros duplicados' ),
- 'Unwatchedpages' => array( 'Páginas não-vigiadas', 'Páginas não vigiadas', 'Artigos não-vigiados', 'Artigos não vigiados' ),
- 'Listredirects' => array( 'Lista de redirecionamentos', 'Redirecionamentos' ),
- 'Revisiondelete' => array( 'Eliminar edição', 'Eliminar revisão', 'Apagar edição', 'Apagar revisão' ),
- 'Unusedtemplates' => array( 'Predefinições sem uso', 'Predefinições não utilizadas' ),
- 'Randomredirect' => array( 'Redirecionamento aleatório' ),
- 'Mypage' => array( 'Minha página' ),
- 'Mytalk' => array( 'Minha discussão' ),
- 'Mycontributions' => array( 'Minhas contribuições', 'Minhas edições' ),
- 'Listadmins' => array( 'Lista de administradores', 'Administradores', 'Admins', 'Lista de admins' ),
- 'Listbots' => array( 'Lista de robôs', 'Bots', 'Lista de bots' ),
- 'Popularpages' => array( 'Páginas populares', 'Artigos populares' ),
+ 'MIMEsearch' => array( 'Busca_MIME' ),
+ 'FileDuplicateSearch' => array( 'Busca_de_arquivos_duplicados', 'Busca_de_ficheiros_duplicados' ),
+ 'Unwatchedpages' => array( 'Páginas_não-vigiadas', 'Páginas_não_vigiadas', 'Artigos_não-vigiados', 'Artigos_não_vigiados' ),
+ 'Listredirects' => array( 'Lista_de_redirecionamentos', 'Redirecionamentos' ),
+ 'Revisiondelete' => array( 'Eliminar_edição', 'Eliminar_revisão', 'Apagar_edição', 'Apagar_revisão' ),
+ 'Unusedtemplates' => array( 'Predefinições_sem_uso', 'Predefinições_não_utilizadas' ),
+ 'Randomredirect' => array( 'Redirecionamento_aleatório' ),
+ 'Mypage' => array( 'Minha_página' ),
+ 'Mytalk' => array( 'Minha_discussão' ),
+ 'Mycontributions' => array( 'Minhas_contribuições', 'Minhas_edições' ),
+ 'Listadmins' => array( 'Lista_de_administradores', 'Administradores', 'Admins', 'Lista_de_admins' ),
+ 'Listbots' => array( 'Lista_de_robôs', 'Bots', 'Lista_de_bots' ),
+ 'Popularpages' => array( 'Páginas_populares', 'Artigos_populares' ),
'Search' => array( 'Busca', 'Buscar', 'Procurar', 'Pesquisar', 'Pesquisa' ),
- 'Resetpass' => array( 'Zerar senha', 'Repor senha' ),
- 'Withoutinterwiki' => array( 'Páginas sem interwikis', 'Artigos sem interwikis' ),
- 'MergeHistory' => array( 'Fundir históricos', 'Fundir edições' ),
- 'Filepath' => array( 'Diretório de arquivo', 'Diretório de ficheiro' ),
- 'Invalidateemail' => array( 'Invalidar e-mail' ),
- 'Blankpage' => array( 'Página em branco' ),
- 'LinkSearch' => array( 'Pesquisar links' ),
- 'DeletedContributions' => array( 'Contribuições eliminadas', 'Edições eliminadas' ),
- 'Activeusers' => array( 'Usuários ativos' ),
+ 'Resetpass' => array( 'Trocar_senha', 'Repor_senha' ),
+ 'Withoutinterwiki' => array( 'Páginas_sem_interwikis', 'Artigos_sem_interwikis' ),
+ 'MergeHistory' => array( 'Fundir_históricos', 'Fundir_edições' ),
+ 'Filepath' => array( 'Diretório_de_arquivo', 'Diretório_de_ficheiro' ),
+ 'Invalidateemail' => array( 'Invalidar_e-mail' ),
+ 'Blankpage' => array( 'Página_em_branco' ),
+ 'LinkSearch' => array( 'Pesquisar_links' ),
+ 'DeletedContributions' => array( 'Contribuições_eliminadas', 'Edições_eliminadas' ),
+ 'Tags' => array( 'Etiquetas' ),
+ 'Activeusers' => array( 'Usuários_ativos' ),
);
$magicWords = array(
@@ -224,15 +228,18 @@ $magicWords = array(
'talkpagenamee' => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÃGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
'subjectpagename' => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÃGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÃGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'direita', 'right' ),
'img_left' => array( '1', 'esquerda', 'left' ),
'img_none' => array( '1', 'nenhum', 'none' ),
'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_framed' => array( '1', 'comborda', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'semborda', 'frameless' ),
+ 'img_framed' => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'semmoldura', 'semborda', 'frameless' ),
'img_page' => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'borda', 'border' ),
+ 'img_baseline' => array( '1', 'linhadebase', 'baseline' ),
'img_top' => array( '1', 'acima', 'top' ),
'img_middle' => array( '1', 'meio', 'middle' ),
'img_bottom' => array( '1', 'abaixo', 'bottom' ),
@@ -280,6 +287,7 @@ $magicWords = array(
'numberingroup' => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'NIVELDEPROTECAO', 'NÃVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'CAMINHO', 'PATH' ),
);
$messages = array(
@@ -298,8 +306,7 @@ $messages = array(
'tog-editsection' => 'Habilitar edição de seção via links [editar]',
'tog-editsectiononrightclick' => 'Habilitar edição de seção por clique com o botão direito no título da seção (JavaScript)',
'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
-'tog-rememberpassword' => 'Lembrar senha entre sessões',
-'tog-editwidth' => 'Alargar a caixa de edição para preecher a tela inteira',
+'tog-rememberpassword' => 'Recordar os meus dados neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
'tog-watchcreations' => 'Adicionar páginas criadas por mim à minha lista de páginas vigiadas',
'tog-watchdefault' => 'Adicionar páginas editadas por mim à minha lista de páginas vigiadas',
'tog-watchmoves' => 'Adicionar páginas movidas por mim à minha lista de páginas vigiadas',
@@ -446,31 +453,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Adicionar tópico',
-'vector-action-delete' => 'Eliminar',
-'vector-action-move' => 'Mover',
-'vector-action-protect' => 'Proteger',
-'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Desproteger',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Página de ajuda',
-'vector-namespace-image' => 'Arquivo',
-'vector-namespace-main' => 'Página',
-'vector-namespace-media' => 'Página de mídia',
-'vector-namespace-mediawiki' => 'Mensagem',
-'vector-namespace-project' => 'Página de projeto',
-'vector-namespace-special' => 'Página especial',
-'vector-namespace-talk' => 'Discussão',
-'vector-namespace-template' => 'Predefinição',
-'vector-namespace-user' => 'Página de usuário',
-'vector-view-create' => 'Criar',
-'vector-view-edit' => 'Editar',
-'vector-view-history' => 'Ver histórico',
-'vector-view-view' => 'Ler',
-'vector-view-viewsource' => 'Ver código-fonte',
-'actions' => 'Ações',
-'namespaces' => 'Espaços nominais',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Adicionar tópico',
+'vector-action-delete' => 'Eliminar',
+'vector-action-move' => 'Mover',
+'vector-action-protect' => 'Proteger',
+'vector-action-undelete' => 'Restaurar',
+'vector-action-unprotect' => 'Desproteger',
+'vector-simplesearch-preference' => 'Ativar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-view-create' => 'Criar',
+'vector-view-edit' => 'Editar',
+'vector-view-history' => 'Ver histórico',
+'vector-view-view' => 'Ler',
+'vector-view-viewsource' => 'Ver código-fonte',
+'actions' => 'Ações',
+'namespaces' => 'Espaços nominais',
+'variants' => 'Variantes',
'errorpagetitle' => 'Erro',
'returnto' => 'Retornar para $1.',
@@ -531,6 +528,9 @@ Muitos usuários estão tentando ver esta página.
Aguarde um instante antes de tentar acessar esta página novamente.
$1',
+'pool-timeout' => 'Tempo limite de espera para o bloqueio excedido',
+'pool-queuefull' => 'A pool queue está cheia',
+'pool-errorunknown' => 'Erro desconhecido',
# 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' => 'Sobre {{SITENAME}}',
@@ -696,7 +696,8 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências na
'yourname' => 'Nome de usuário:',
'yourpassword' => 'Senha:',
'yourpasswordagain' => 'Redigite sua senha',
-'remembermypassword' => 'Lembrar da minha senha em outras sessões.',
+'remembermypassword' => 'Recordar os meus dados neste computador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
+'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
'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',
@@ -713,6 +714,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências na
'gotaccount' => "Já possui uma conta? '''$1'''.",
'gotaccountlink' => 'Autenticar-se',
'createaccountmail' => 'por e-mail',
+'createaccountreason' => 'Razão:',
'badretype' => 'As senhas que você digitou não são iguais.',
'userexists' => 'O nome de usuário que você digitou já existe.
Escolha um nome diferente.',
@@ -736,6 +738,7 @@ Verifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].',
'wrongpasswordempty' => 'A senha introduzida está em branco. Por favor, tente novamente.',
'passwordtooshort' => 'As senhas devem ter no mínimo {{PLURAL:$1|1 caractere|$1 caracteres}}.',
'password-name-match' => 'A sua senha deve ser diferente do seu nome de usuário.',
+'password-login-forbidden' => 'Foi proibido o uso deste nome de utilizador e palavra-chave.',
'mailmypassword' => 'Enviar uma nova senha por e-mail',
'passwordremindertitle' => 'Nova senha temporária em {{SITENAME}}',
'passwordremindertext' => 'Alguém (provavelmente você, a partir do endereço de IP $1) solicitou uma nova senha para {{SITENAME}} ($4). Foi criada uma senha temporária para o usuário "$2", sendo ela "$3". Se esta era sua intenção, você precisará se autenticar e escolher uma nova senha agora.
@@ -771,6 +774,9 @@ Por favor aguarde antes de tentar novamente.',
'loginlanguagelabel' => 'Língua: $1',
'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
+# E-mail sending
+'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
+
# Password reset dialog
'resetpass' => 'Alterar senha',
'resetpass_announce' => 'Você foi autenticado através de uma senha temporária. Para prosseguir, será necessário definir uma nova senha.',
@@ -822,9 +828,11 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
'showlivepreview' => 'Pré-visualização em tempo real',
'showdiff' => 'Mostrar alterações',
'anoneditwarning' => "'''Atenção''': Você não se encontra autenticado. O seu endereço de IP será registrado no histórico de edições desta página.",
+'anonpreviewwarning' => "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
'missingsummary' => "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
'missingcommenttext' => 'Por favor, introduzida um comentário abaixo.',
-'missingcommentheader' => "'''Lembrete:''' Você não introduziu um assunto/título para este comentário. Se carregar novamente em Salvar a sua edição será salva sem um título/assunto.",
+'missingcommentheader' => "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.
+Se você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
'summary-preview' => 'Previsão de sumário:',
'subject-preview' => 'Previsão do assunto/título:',
'blockedtitle' => 'O usuário está bloqueado',
@@ -901,7 +909,11 @@ O registro de bloqueio mais recente é fornecido abaixo, para referência:',
'usercsspreview' => "'''Lembre-se de que você está apenas previsualizando o seu CSS particular.'''
'''Ele ainda não foi salvo!'''",
'userjspreview' => "'''Lembre-se que está apenas testando/prevendo o seu JavaScript particular e que ele ainda não foi salvo!'''",
-'userinvalidcssjstitle' => "'''Aviso:''' Não existe um tema \"\$1\". Lembre-se que as páginas .css e .js utilizam um título em minúsculas, exemplo: {{ns:user}}:Alguém/monobook.css aposto a {{ns:user}}:Alguém/Monobook.css.",
+'sitecsspreview' => "'''Lembre-se de que você está apenas previsualizando este CSS.'''
+'''Ele ainda não foi salvo!'''",
+'sitejspreview' => "''Lembre-se de que você está apenas previsualizando este código JavaScript.'''
+'''Ele ainda não foi salvo!'''",
+'userinvalidcssjstitle' => "'''Aviso:''' Não existe um tema \"\$1\". Lembre-se que as páginas .css e .js utilizam um título em minúsculas, exemplo: {{ns:user}}:Alguém/vector.css aposto a {{ns:user}}:Alguém/Vector.css.",
'updated' => '(Atualizado)',
'note' => "'''Nota:'''",
'previewnote' => "'''Isto é apenas uma previsão.
@@ -940,8 +952,6 @@ Você está, ao mesmo tempo, garantindo-nos que isto é algo escrito por você m
'copyrightwarning2' => "Por favor, note que todas as suas contribuições em {{SITENAME}} podem ser editadas, alteradas ou removidas por outros contribuidores. Se você não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />
Você está, ao mesmo tempo, a garantir-nos que isto é algo escrito por si, ou algo copiado de alguma fonte de textos em domínio público ou similarmente de teor livre (veja $1 para detalhes).
'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS DE AUTOR SEM A DEVIDA PERMISSÃO!'''",
-'longpagewarning' => "'''CUIDADO: Esta página tem $1 kilobytes; alguns browsers podem ter problemas ao editar páginas maiores que 32 kb.
-Por gentileza, considere quebrar a página em sessões menores.'''",
'longpageerror' => "'''ERRO: O texto de página que você submeteu tem mais de $1 quilobytes em tamanho, que é maior que o máximo de $2 quilobytes. A página não pode ser salva.'''",
'readonlywarning' => "'''Aviso: A base de dados foi bloqueada para manutenção, por isso você não poderá salvar a sua edição neste momento.'''
Pode, no entanto, copiar o seu texto num editor externo e guardá-lo para posterior envio.
@@ -1118,6 +1128,8 @@ $1",
'logdelete-failure' => "'''A visibilidade do registro não pôde ser estabelecida:'''
$1",
'revdel-restore' => 'Alterar visibilidade',
+'revdel-restore-deleted' => 'revisões eliminadas',
+'revdel-restore-visible' => 'revisões visíveis',
'pagehist' => 'Histórico da página',
'deletedhist' => 'Histórico de eliminações',
'revdelete-content' => 'conteúdo',
@@ -1186,11 +1198,13 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
# Diffs
'history-title' => 'Histórico de edições de "$1"',
'difference' => '(Diferença entre revisões)',
+'difference-multipage' => '(Diferenças entre páginas)',
'lineno' => 'Linha $1:',
'compareselectedversions' => 'Compare as versões selecionadas',
'showhideselectedversions' => 'Mostrar/esconder versões selecionadas',
'editundo' => 'desfazer',
-'diff-multi' => '({{PLURAL:$1|uma edição intermediária não está sendo exibida|$1 edições intermediárias não estão sendo exibidas}}.)',
+'diff-multi' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de {{PLURAL:$2|um usuário|$2 usuários}} {{PLURAL:$1|não apresentada|não apresentadas}})',
+'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',
@@ -1225,6 +1239,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
'searchprofile-everything-tooltip' => 'Pesquisar em todo o conteúdo (incluindo páginas de discussão)',
'searchprofile-advanced-tooltip' => 'Pesquisar nos espaços nominais personalizados',
'search-result-size' => '$1 ({{PLURAL:$2|1 palavra|$2 palavras}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 arquivo|$3 arquivos}})',
'search-result-score' => 'Relevância: $1%',
'search-redirect' => '(redirecionamento de $1)',
'search-section' => '(seção $1)',
@@ -1301,6 +1316,7 @@ Note que os índices do sistema de busca externo poderão conter referências de
'contextlines' => 'Linhas por resultado:',
'contextchars' => 'Contexto por linha:',
'stub-threshold' => 'Links para páginas de conteúdo aparecerão <a href="#" class="stub">desta forma</a> se elas possuírem menos de (bytes):',
+'stub-threshold-disabled' => 'Desabilitado',
'recentchangesdays' => 'Dias a serem exibidos nas Mudanças recentes:',
'recentchangesdays-max' => '(máximo: $1 {{PLURAL:$1|dia|dias}})',
'recentchangescount' => 'Número de edições a serem exibidas por padrão:',
@@ -1334,6 +1350,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
'prefs-files' => 'Arquivos',
'prefs-custom-css' => 'CSS personalizada',
'prefs-custom-js' => 'JS personalizado',
+'prefs-common-css-js' => 'CSS/JS partilhado por todos os temas:',
'prefs-reset-intro' => 'Você pode usar esta página para restaurar as suas preferências para os valores predefinidos do sítio.
Esta ação não pode ser desfeita.',
'prefs-emailconfirm-label' => 'Confirmação do e-mail:',
@@ -1371,9 +1388,15 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'prefs-advancedrendering' => 'Opções avançadas',
'prefs-advancedsearchoptions' => 'Opções avançadas',
'prefs-advancedwatchlist' => 'Opções avançadas',
-'prefs-display' => 'Opções de exibição',
+'prefs-displayrc' => 'Opções de exibição',
+'prefs-displaysearchoptions' => 'Opções de exibição',
+'prefs-displaywatchlist' => 'Opções de exibição',
'prefs-diffs' => 'Diferenças',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Parece válido',
+'email-address-validity-invalid' => 'Forneça um endereço de e-mail válido',
+
# User rights
'userrights' => 'Gestão de privilégios de usuários',
'userrights-lookup-user' => 'Administrar grupos de usuários',
@@ -1457,6 +1480,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'right-hideuser' => 'Bloquear um nome de usuário, escondendo-o do público',
'right-ipblock-exempt' => 'Contornar bloqueios de IP, automáticos e de intervalo',
'right-proxyunbannable' => 'Contornar bloqueios automáticos de proxies',
+'right-unblockself' => 'Desbloquearem-se a si próprios',
'right-protect' => 'Mudar níveis de proteção e editar páginas protegidas',
'right-editprotected' => 'Editar páginas protegidas (sem proteção em cascata)',
'right-editinterface' => 'Editar a interface de usuário',
@@ -1479,7 +1503,6 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'right-siteadmin' => 'Bloquear e desbloquear o banco de dados',
'right-reset-passwords' => 'Redefinir a senha de outros usuários',
'right-override-export-depth' => 'Exportar páginas incluindo páginas ligadas até uma profundidade de 5',
-'right-versiondetail' => "Mostrar informação ampliada sobre a versão do ''software''.",
'right-sendemail' => 'Enviar email a outros usuários',
# User rights log
@@ -1530,14 +1553,9 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'recentchanges-legend' => 'Opções das mudanças recentes',
'recentchangestext' => 'Veja as mais novas mudanças na {{SITENAME}} nesta página.',
'recentchanges-feed-description' => 'Acompanhe as Mudanças recentes deste wiki por este feed.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova página',
'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
-'recentchanges-legend-minor' => '$1 - edição menor',
'recentchanges-label-minor' => 'Esta é uma edição menor',
-'recentchanges-legend-bot' => '$1 - edição de robô',
'recentchanges-label-bot' => 'Esta edição foi feita por um robô',
-'recentchanges-legend-unpatrolled' => '$1 - edição não patrulhada',
'recentchanges-label-unpatrolled' => 'Esta edição ainda não foi patrulhada',
'rcnote' => "A seguir {{PLURAL:$1|está listada '''uma''' alteração ocorrida|estão listadas '''$1''' alterações ocorridas}} {{PLURAL:$2|no último dia|nos últimos '''$2''' dias}}, a partir das $5 de $4.",
'rcnotefrom' => 'Abaixo estão as mudanças desde <b>$2</b> (mostradas até <b>$1</b>).',
@@ -1584,6 +1602,9 @@ Páginas que estejam em [[Special:Watchlist|sua lista de páginas vigiadas]] sã
'upload_directory_missing' => 'O diretório de upload ($1) não existe e não pôde ser criado pelo servidor.',
'upload_directory_read_only' => 'O diretório de download de arquivos ($1) não tem permissões de escrita para o servidor Web.',
'uploaderror' => 'Erro ao fazer upload',
+'upload-recreate-warning' => "'''Aviso: Um arquivo com este nome foi eliminado ou movido.'''
+
+Para sua conveniência, é apresentado a seguir o registro de eliminação e de movimento da página:",
'uploadtext' => "Utilize o formulário abaixo para carregar novos arquivos.
Para ver ou pesquisar imagens anteriormente carregadas consulte a [[Special:FileList|lista de arquivos carregados]]. (Re)Envios são também registrados no [[Special:Log/upload|registro de carregamento]], e as eliminações no [[Special:Log/delete|registro de eliminação]]
@@ -1618,6 +1639,17 @@ A [[Special:NewFiles|galeria de arquivos novos]] oferece uma listagem mais visua
'filetype-banned-type' => "'''\".\$1\"''' é um tipo proibido de arquivo.
{{PLURAL:\$3|O tipo permitido é|Os tipos permitidos são}} \$2.",
'filetype-missing' => 'O arquivo não possui uma extensão (como, por exemplo, ".jpg").',
+'empty-file' => 'O arquivo que você enviou estava vazio.',
+'file-too-large' => 'O arquivo que você enviou era demasiado grande.',
+'filename-tooshort' => 'O nome do arquivo é curto demais.',
+'filetype-banned' => 'Este tipo do arquivo é proibido.',
+'verification-error' => 'Este arquivo não passou pela verificação de arquivos.',
+'hookaborted' => 'A modificação que você tentou realizar foi abortada pelo hook de uma extensão.',
+'illegal-filename' => 'Nome de arquivo não permitido.',
+'overwrite' => 'Não é permitido sobrescrever um arquivo já existente.',
+'unknown-error' => 'Ocorreu um erro desconhecido.',
+'tmp-create-error' => 'Não foi possível criar o arquivo temporário.',
+'tmp-write-error' => 'Erro ao alterar arquivo temporário.',
'large-file' => 'É recomendável que os arquivos não sejam maiores que $1; este possui $2.',
'largefileserver' => 'O tamanho deste arquivo é superior ao qual o servidor encontra-se configurado para permitir.',
'emptyfile' => 'O arquivo que está tentando carregar parece encontrar-se vazio. Isto poderá ser devido a um erro na escrita do nome do arquivo. Por favor verifique se realmente deseja carregar este arquivo.',
@@ -1643,13 +1675,14 @@ Se ainda pretende carregar o seu arquivo, por favor, volte e use um novo nome. [
Se você ainda quer carregar o seu arquivo, por favor volte e use um novo nome. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Esta imagem é uma duplicata do seguinte {{PLURAL:$1|arquivo|arquivos}}:',
'file-deleted-duplicate' => 'Um arquivo idêntico a este ([[:$1]]) foi eliminado anteriormente. Verifique o motivo da eliminação de tal arquivo antes de prosseguir com o re-envio.',
-'successfulupload' => 'Envio efetuado com sucesso',
'uploadwarning' => 'Aviso',
'uploadwarning-text' => 'Por favor modifique a descrição do arquivo abaixo e tente novamente',
'savefile' => 'Salvar arquivo',
'uploadedimage' => 'enviou "[[$1]]"',
'overwroteimage' => 'foi enviada uma nova versão de "[[$1]]"',
'uploaddisabled' => 'Envio de arquivos desativado.',
+'copyuploaddisabled' => 'O upload por URL encontra-se desativado.',
+'uploadfromurl-queued' => 'O seu upload foi adicionado à fila.',
'uploaddisabledtext' => 'O envio de arquivos encontra-se desativado.',
'php-uploaddisabledtext' => 'O carregamento de arquivos via PHP está desativado. Por favor, verifique a configuração file_uploads.',
'uploadscripted' => 'Este arquivo contém HTML ou código que pode ser erradamente interpretado por um navegador web.',
@@ -1682,6 +1715,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- deixe esta linha exatamente como está -->',
+'upload-success-subj' => 'Envio efetuado com sucesso',
+'upload-success-msg' => 'O seu upload desde [$2] foi bem sucedido. Ele está disponível aqui: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema no upload',
+'upload-failure-msg' => 'Ocorreu um problema com o seu upload de [$2]:
+
+$1',
+'upload-warning-subj' => 'Aviso de upload',
+'upload-warning-msg' => 'Houve um problema com o seu formulário de carregamento [$2]. Pode voltar ao [[Special:Upload/stash/$1|formulário]] para corrigir este problema.',
'upload-proto-error' => 'Protocolo incorreto',
'upload-proto-error-text' => 'O envio de arquivos remotos requer endereços (URLs) que iniciem com <code>http://</code> ou <code>ftp://</code>.',
@@ -1743,6 +1784,7 @@ Um clique sobre um cabeçalho de coluna altera a ordenação.',
'listfiles_search_for' => 'Pesquisar por nome de imagem:',
'imgfile' => 'arquivo',
'listfiles' => 'Lista de arquivo',
+'listfiles_thumb' => 'Miniatura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Usuário',
@@ -1855,8 +1897,8 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
'statistics-edits' => 'Edições de página desde que {{SITENAME}} foi instalado',
'statistics-edits-average' => 'Média de edições por página',
'statistics-views-total' => 'Total de visualizações',
+'statistics-views-total-desc' => 'Visualizações de páginas não existentes e páginas especiais não estão incluídas',
'statistics-views-peredit' => 'Visualizações por edição',
-'statistics-jobqueue' => 'Tamanho da [http://www.mediawiki.org/wiki/Manual:Job_queue fila de tarefas]',
'statistics-users' => '[[Special:ListUsers|Usuários]] registrados',
'statistics-users-active' => 'Usuários ativos',
'statistics-users-active-desc' => 'Usuários que efetuaram uma ação {{PLURAL:$1|no último dia|nos últimos $1 dias}}',
@@ -1870,7 +1912,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.
-Entradas <s>riscadas</s> foram resolvidas.',
+Entradas <del>riscadas</del> foram resolvidas.',
'double-redirect-fixed-move' => '[[$1]] foi movido e agora é um redirecionamento para [[$2]]',
'double-redirect-fixer' => 'Corretor de redirecionamentos',
@@ -1893,6 +1935,8 @@ Entradas <s>riscadas</s> foram resolvidas.',
'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
'nrevisions' => '$1 {{PLURAL:$1|revisão|revisões}}',
'nviews' => '$1 {{PLURAL:$1|visita|visitas}}',
+'nimagelinks' => 'Utilizada em $1 {{PLURAL:$1|página|páginas}}',
+'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}}.',
@@ -2049,34 +2093,40 @@ Pode haver [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] s
'listgrouprights-removegroup-self-all' => 'Pode remover todos os grupos da própria conta',
# E-mail user
-'mailnologin' => 'Nenhum endereço de envio',
-'mailnologintext' => 'Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.',
-'emailuser' => 'Contatar este usuário',
-'emailpage' => 'Contactar usuário',
-'emailpagetext' => 'Você pode usar o formulário abaixo para enviar uma mensagem por correio eletrônico para este usuário.
+'mailnologin' => 'Nenhum endereço de envio',
+'mailnologintext' => 'Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.',
+'emailuser' => 'Contatar este usuário',
+'emailpage' => 'Contactar usuário',
+'emailpagetext' => 'Você pode usar o formulário abaixo para enviar uma mensagem por correio eletrônico para este usuário.
O endereço eletrônico que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, então o destinatário poderá responder diretamente para você.',
-'usermailererror' => 'Erro no email:',
-'defemailsubject' => 'E-mail: {{SITENAME}}',
-'noemailtitle' => 'Sem endereço de e-mail',
-'noemailtext' => 'Este usuário não especificou um endereço de e-mail válido.',
-'nowikiemailtitle' => 'E-mail não permitido',
-'nowikiemailtext' => 'Este usuário optou por não receber e-mail de outros usuários.',
-'email-legend' => 'Enviar uma mensagem eletrônica para outro usuário da {{SITENAME}}',
-'emailfrom' => 'De:',
-'emailto' => 'Para:',
-'emailsubject' => 'Assunto:',
-'emailmessage' => 'Mensagem:',
-'emailsend' => 'Enviar',
-'emailccme' => 'Enviar ao meu e-mail uma cópia de minha mensagem.',
-'emailccsubject' => 'Cópia de sua mensagem para $1: $2',
-'emailsent' => 'E-mail enviado',
-'emailsenttext' => 'Sua mensagem foi enviada.',
-'emailuserfooter' => 'Este e-mail foi enviado por $1 para $2 através da opção de "contactar usuário" da {{SITENAME}}.',
+'usermailererror' => 'Erro no email:',
+'defemailsubject' => 'E-mail: {{SITENAME}}',
+'usermaildisabled' => 'O e-mail do usuário foi desativado',
+'usermaildisabledtext' => 'Você não tem como enviar e-mails a outros usuários deste wiki.',
+'noemailtitle' => 'Sem endereço de e-mail',
+'noemailtext' => 'Este usuário não especificou um endereço de e-mail válido.',
+'nowikiemailtitle' => 'E-mail não permitido',
+'nowikiemailtext' => 'Este usuário optou por não receber e-mail de outros usuários.',
+'email-legend' => 'Enviar uma mensagem eletrônica para outro usuário da {{SITENAME}}',
+'emailfrom' => 'De:',
+'emailto' => 'Para:',
+'emailsubject' => 'Assunto:',
+'emailmessage' => 'Mensagem:',
+'emailsend' => 'Enviar',
+'emailccme' => 'Enviar ao meu e-mail uma cópia de minha mensagem.',
+'emailccsubject' => 'Cópia de sua mensagem para $1: $2',
+'emailsent' => 'E-mail enviado',
+'emailsenttext' => 'Sua mensagem foi enviada.',
+'emailuserfooter' => 'Este e-mail foi enviado por $1 para $2 através da opção de "contactar usuário" da {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Deixar mensagem de sistema.',
+'usermessage-editor' => 'Mensagens de sistema',
# Watchlist
'watchlist' => 'Páginas vigiadas',
'mywatchlist' => 'Páginas vigiadas',
-'watchlistfor' => "(para '''$1''')",
+'watchlistfor2' => 'Para $1 $2',
'nowatchlist' => 'A sua lista de páginas vigiadas não possui títulos.',
'watchlistanontext' => 'Por favor $1 para ver ou editar os itens na sua lista de páginas vigiadas.',
'watchnologin' => 'Não está autenticado',
@@ -2196,7 +2246,10 @@ A última edição da página foi feita por [[User:$3|$3]] ([[User talk:$3|discu
'revertpage' => 'Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]',
'revertpage-nouser' => 'Revertidas as edições de (nome de usuário removido) para a última revisão por [[User:$1|$1]]',
'rollback-success' => 'Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.',
-'sessionfailure' => 'Foram detetados problemas com a sua sessão;
+
+# Edit tokens
+'sessionfailure-title' => 'Erro de sessão',
+'sessionfailure' => 'Foram detetados problemas com a sua sessão;
Esta ação foi cancelada como medida de proteção contra a intercepção de sessões.
Experimente usar o botão "Voltar" e atualizar a página de onde veio e tente novamente.',
@@ -2326,18 +2379,22 @@ $1',
'month' => 'Mês (inclusive anteriores):',
'year' => 'Ano (inclusive anteriores):',
-'sp-contributions-newbies' => 'Mostrar só as contribuições das contas recentes',
-'sp-contributions-newbies-sub' => 'Para contas novas',
-'sp-contributions-newbies-title' => 'Contribuições de contas novas',
-'sp-contributions-blocklog' => 'Registro de bloqueios',
-'sp-contributions-deleted' => 'contribuições eliminadas',
-'sp-contributions-logs' => 'registros',
-'sp-contributions-talk' => 'disc',
-'sp-contributions-userrights' => 'gerenciamento de privilégios de usuários',
-'sp-contributions-blocked-notice' => 'Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:',
-'sp-contributions-search' => 'Pesquisar contribuições',
-'sp-contributions-username' => 'Endereço de IP ou usuário:',
-'sp-contributions-submit' => 'Pesquisar',
+'sp-contributions-newbies' => 'Mostrar só as contribuições das contas recentes',
+'sp-contributions-newbies-sub' => 'Para contas novas',
+'sp-contributions-newbies-title' => 'Contribuições de contas novas',
+'sp-contributions-blocklog' => 'Registro de bloqueios',
+'sp-contributions-deleted' => 'contribuições eliminadas',
+'sp-contributions-uploads' => 'carregamentos',
+'sp-contributions-logs' => 'registros',
+'sp-contributions-talk' => 'disc',
+'sp-contributions-userrights' => 'gerenciamento de privilégios de usuários',
+'sp-contributions-blocked-notice' => 'Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:',
+'sp-contributions-blocked-notice-anon' => 'Este endereço IP encontra-se bloqueado.
+Segue, para referência, a entrada mais recente no registro de bloqueios:',
+'sp-contributions-search' => 'Pesquisar contribuições',
+'sp-contributions-username' => 'Endereço de IP ou usuário:',
+'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
+'sp-contributions-submit' => 'Pesquisar',
# What links here
'whatlinkshere' => 'Páginas afluentes',
@@ -2397,7 +2454,6 @@ Consulte a [[Special:IPBlockList|lista de IPs bloqueados]] para rever os bloquei
'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
'ipb-unblock-addr' => 'Desbloquear $1',
'ipb-unblock' => 'Desbloquear um usuário ou endereço de IP',
-'ipb-blocklist-addr' => 'Bloqueios existentes para $1',
'ipb-blocklist' => 'Ver bloqueios em vigência',
'ipb-blocklist-contribs' => 'Contribuições de $1',
'unblockip' => 'Desbloquear usuário',
@@ -2468,6 +2524,8 @@ $1 já se encontra bloqueado. Deseja alterar as configurações?',
'sorbs_create_account_reason' => 'O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta',
'cant-block-while-blocked' => 'Você não pode bloquear outros usuários enquanto estiver bloqueado.',
'cant-see-hidden-user' => 'O usuário que você está tentando bloquear já está bloqueado ou oculto. Como você não possui privilégio de ocultar usuários, você não pode ver ou editar o bloqueio desse usuário.',
+'ipbblocked' => 'Não é possível que você bloqueie ou desbloqueie outros usuários, já que você se encontra bloqueado',
+'ipbnounblockself' => 'Não é permitido que você se desbloqueie',
# Developer tools
'lockdb' => 'Trancar banco de dados',
@@ -2500,6 +2558,17 @@ Note que a página '''não''' será movida se já existir uma página com o novo
<b>CUIDADO!</b>
Isto pode ser uma mudança drástica e inesperada para uma página popular; por favor, tenha certeza de que compreende as consequências da mudança antes de prosseguir.",
+'movepagetext-noredirectfixer' => "Usando o formulário abaixo, você irá alterar o nome de uma página e moverá todo o histórico desta para o nome novo.
+A página antiga será transformada numa página de redirecionamento para a nova.
+Verifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].
+É sua responsabilidade certificar-se de que os links continuam a apontar para onde eles deveriam apontar.
+
+Note que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.
+Isto significa que, se você cometer um engano, poderá alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.
+
+'''Aviso!'''
+Para páginas populares, esta operação pode representar uma mudança drástica e inesperada;
+certifique-se de que compreende as consequências da operação antes de continuar.",
'movepagetalktext' => "A página de \"discussão\" associada, se existir, será automaticamente movida, '''a não ser que:'''
*Uma página de discussão com conteúdo já exista sob o novo título, ou
*Você não marque a caixa abaixo.
@@ -2554,6 +2623,7 @@ A página de destino ("[[:$1]]") já existe. Deseja eliminá-la de modo a poder
'immobile-source-page' => 'Esta página não pode ser movida.',
'immobile-target-page' => 'Não é possível mover para esse título de destino.',
'imagenocrossnamespace' => 'Não é possível mover imagem para espaço nominal que não de imagens',
+'nonfile-cannot-move-to-file' => 'Não é possível mover não arquivos para espaço nominal de arquivos',
'imagetypemismatch' => 'A extensão do novo arquivo não corresponde ao seu tipo',
'imageinvalidfilename' => 'O nome do arquivo alvo é inválido',
'fix-double-redirects' => 'Atualizar todos os redirecionamentos que apontem para o título original',
@@ -2633,6 +2703,7 @@ 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}}',
'importnopages' => 'Não existem páginas a importar.',
+'imported-log-entries' => '{{PLURAL:$1|Importado|Importados}} $1 {{PLURAL:$1|entradas de log|entradas de log}}.',
'importfailed' => 'A importação falhou: $1',
'importunknownsource' => 'Tipo de fonte de importação desconhecida',
'importcantopen' => 'Não foi possível abrir o arquivo de importação',
@@ -2725,6 +2796,8 @@ Salve o arquivo no seu computador e importe-o aqui.',
'tooltip-upload' => 'Iniciar o carregamento',
'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
'tooltip-undo' => '"{{int:editundo}}" reverte esta edição exibindo a caixa de edição no modo de previsão, permitindo alterações adicionais e o uso do sumário de edição para justificativas.',
+'tooltip-preferences-save' => 'Salvar preferências',
+'tooltip-summary' => 'Forneça um breve sumário',
# Stylesheets
'common.css' => '/** o código CSS colocado aqui será aplicado a todos os temas */',
@@ -2846,14 +2919,17 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'imagemaxsize' => "Limite de tamanho de imagem:<br />''(para páginas de descrição de arquivos)''",
'thumbsize' => 'Tamanho de miniaturas:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|página|páginas}}',
-'file-info' => '(tamanho: $1, tipo MIME: $2)',
-'file-info-size' => '($1 × $2 pixels, tamanho: $3, tipo MIME: $4)',
+'file-info' => 'tamanho: $1, tipo MIME: $2',
+'file-info-size' => '$1 × $2 pixels, tamanho: $3, tipo MIME: $4',
'file-nohires' => '<small>Sem resolução maior disponível.</small>',
-'svg-long-desc' => '(arquivo SVG, de $1 × $2 pixels, tamanho: $3)',
+'svg-long-desc' => 'arquivo SVG, de $1 × $2 pixels, tamanho: $3',
'show-big-image' => 'Resolução completa',
'show-big-image-thumb' => '<small>Tamanho desta previsão: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'cíclico',
'file-info-gif-frames' => '$1 {{PLURAL:$1|quadro|quadros}}',
+'file-info-png-looped' => 'cíclico',
+'file-info-png-repeat' => 'tocado $1 {{PLURAL:$1|vez|vezes}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|quadro|quadros}}',
# Special:NewFiles
'newimages' => 'Galeria de novos arquivos',
@@ -3008,6 +3084,7 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
'exif-gpsareainformation' => 'Nome da área do GPS',
'exif-gpsdatestamp' => 'Data do GPS',
'exif-gpsdifferential' => 'Correção do diferencial do GPS',
+'exif-objectname' => 'Título curto',
# EXIF attributes
'exif-compression-1' => 'Sem compressão',
@@ -3089,6 +3166,8 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
'exif-sensingmethod-7' => 'Sensor trilinear',
'exif-sensingmethod-8' => 'Sensor linear sequencial de cores',
+'exif-filesource-3' => 'Câmara fotográfica digital',
+
'exif-scenetype-1' => 'Imagem fotografada diretamente',
'exif-customrendered-0' => 'Processo normal',
@@ -3165,25 +3244,25 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
'limitall' => 'todas',
# 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_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.',
-'confirmemail_oncreate' => 'Foi enviado um código de confirmação para o seu endereço de e-mail.
+'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_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.',
+'confirmemail_oncreate' => 'Foi enviado um código de confirmação para o seu endereço de e-mail.
Tal código não é exigido para que possa se autenticar no sistema, mas será necessário que você o forneça antes de habilitar qualquer ferramenta baseada no uso de e-mail deste wiki.',
-'confirmemail_sendfailed' => 'O {{SITENAME}} não pôde enviar o email de confirmação.
+'confirmemail_sendfailed' => 'O {{SITENAME}} não pôde enviar o email de confirmação.
Verifique se o seu endereço de e-mail possui caracteres inválidos.
O mailer retornou: $1',
-'confirmemail_invalid' => 'Código de confirmação inválido. O código poderá ter expirado.',
-'confirmemail_needlogin' => 'Precisa de $1 para confirmar o seu endereço de e-mail.',
-'confirmemail_success' => 'O seu endereço de e-mail foi confirmado. Pode agora se ligar.',
-'confirmemail_loggedin' => 'O seu endereço de e-mail foi agora confirmado.',
-'confirmemail_error' => 'Alguma coisa correu mal ao guardar a sua confirmação.',
-'confirmemail_subject' => '{{SITENAME}} confirmação de endereço de e-mail',
-'confirmemail_body' => 'Alguém, provavelmente você, com o endereço de IP $1,
+'confirmemail_invalid' => 'Código de confirmação inválido. O código poderá ter expirado.',
+'confirmemail_needlogin' => 'Precisa de $1 para confirmar o seu endereço de e-mail.',
+'confirmemail_success' => 'O seu endereço de e-mail foi confirmado. Pode agora se ligar.',
+'confirmemail_loggedin' => 'O seu endereço de e-mail foi agora confirmado.',
+'confirmemail_error' => 'Alguma coisa correu mal ao guardar a sua confirmação.',
+'confirmemail_subject' => '{{SITENAME}} confirmação de endereço de e-mail',
+'confirmemail_body' => 'Alguém, provavelmente você, com o endereço de IP $1,
registrou uma conta "$2" com este endereço de e-mail em {{SITENAME}}.
Para confirmar que esta conta realmente é sua, e para ativar
@@ -3198,8 +3277,38 @@ para cancelar a confirmação do endereço de e-mail:
$5
Este código de confirmação irá expirar em $4.',
-'confirmemail_invalidated' => 'Confirmação de endereço de e-mail cancelada',
-'invalidateemail' => 'Cancelar confirmação de e-mail',
+'confirmemail_body_changed' => 'Alguém, provavelmente você com o endereço de IP $1,
+alterou o endereço de e-mail da conta "$2" para este em {{SITENAME}}.
+
+Para confirmar que esta conta é realmente sua e reativar
+as funcionalidades de e-mail em {{SITENAME}},
+abra o seguinte link no seu navegador:
+
+$3
+
+Caso a conta *não* lhe pertença, siga o seguinte link
+para cancelar a confirmação do endereço de e-mail:
+
+$5
+
+Este código de confirmação irá expirar em $4.',
+'confirmemail_body_set' => 'Alguém, provavelmente você com o endereço IP $1,
+definiu o endereço de correio eletrónico da conta "$2" para este na {{SITENAME}}.
+
+Para confirmar que esta conta é realmente sua e reativar
+as funcionalidades de correio electrónico na {{SITENAME}},
+abra o seguinte link no seu browser:
+
+$3
+
+Caso a conta *não* lhe pertença, siga o seguinte link
+para cancelar a confirmação do endereço de correio electrónico:
+
+$5
+
+Este código de confirmação irá expirar em $4.',
+'confirmemail_invalidated' => 'Confirmação de endereço de e-mail cancelada',
+'invalidateemail' => 'Cancelar confirmação de e-mail',
# Scary transclusion
'scarytranscludedisabled' => '[A transclusão de páginas de outros wikis encontra-se desabilitada]',
@@ -3239,6 +3348,7 @@ Por favor, confirme que realmente deseja recriar esta página.",
'table_pager_first' => 'Primeira página',
'table_pager_last' => 'Última página',
'table_pager_limit' => 'Mostrar $1 items por página',
+'table_pager_limit_label' => 'Itens por página:',
'table_pager_limit_submit' => 'Ir',
'table_pager_empty' => 'Sem resultados',
@@ -3296,6 +3406,7 @@ Você também pode [[Special:Watchlist/edit|editar a lista da maneira convencion
'version-specialpages' => 'Páginas especiais',
'version-parserhooks' => 'Hooks do analisador (parser)',
'version-variables' => 'Variáveis',
+'version-skins' => 'Temas',
'version-other' => 'Diversos',
'version-mediahandlers' => 'Executores de média',
'version-hooks' => 'Hooks',
@@ -3307,6 +3418,13 @@ Você também pode [[Special:Watchlist/edit|editar a lista da maneira convencion
'version-hook-subscribedby' => 'Subscrito por',
'version-version' => '(Versão $1)',
'version-license' => 'Licença',
+'version-poweredby-credits' => "Esta é uma wiki '''[http://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.
+
+O MediaWiki é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; inclusive, sem a garantia implícita da POSSIBILIDADE DE SER COMERCIALIZADO ou de ADEQUAÇÂO PARA QUALQUER FINALIDADE ESPECÃFICA. Consulte a licença GNU General Public License para mais detalhes.
+
+Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYING uma cópia da licença GNU General Public License]; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html leia-a na internet].',
'version-software' => 'Software instalado',
'version-software-product' => 'Produto',
'version-software-version' => 'Versão',
@@ -3377,6 +3495,15 @@ Entre com o nome de arquivo sem fornecer o prefixo "{{ns:file}}:".',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
+# Special:ComparePages
+'comparepages' => 'Comparar páginas',
+'compare-selector' => 'Comparar edições da página',
+'compare-page1' => 'Página 1',
+'compare-page2' => 'Página 2',
+'compare-rev1' => 'Edição 1',
+'compare-rev2' => 'Edição 2',
+'compare-submit' => 'Comparar',
+
# Database error messages
'dberr-header' => 'Este wiki tem um problema',
'dberr-problems' => 'Desculpe! Este sítio está passando por dificuldades técnicas.',
@@ -3393,8 +3520,13 @@ Entre com o nome de arquivo sem fornecer o prefixo "{{ns:file}}:".',
'htmlform-float-invalid' => 'O valor que você especificou não é um número.',
'htmlform-int-toolow' => 'O valor que você especificou está abaixo do mínimo de $1',
'htmlform-int-toohigh' => 'O valor que você especificou está acima do máximo de $1',
+'htmlform-required' => 'Este valor é necessário',
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfazer alterações',
'htmlform-selectorother-other' => 'Outros',
+# SQLite database support
+'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
+'sqlite-no-fts' => '$1 sem suporte de pesquisa de texto completo',
+
);
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index 923f1d65..6f366c2e 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -53,6 +53,8 @@
* @author Lloffiwr
* @author MF-Warburg
* @author Malafaya
+ * @author MarkvA
+ * @author MaxSem
* @author McDutchie
* @author Meno25
* @author MichaelFrey
@@ -71,6 +73,7 @@
* @author Platonides
* @author Prima klasy4na
* @author Prometheus.pyrphoros
+ * @author Psubhashish
* @author Purodha
* @author Rancher
* @author Raymond
@@ -96,6 +99,7 @@
* @author Verdy p
* @author Vinhtantran
* @author Waldir
+ * @author Whym
* @author Yyy
* @author פוילישער
*/
@@ -118,10 +122,8 @@ This is the toolbar: [[Image:Toolbar.png]]",
'tog-editsection' => "[[Special:Preferences]], tab 'Edit'. Offers user to add links in sub headings for editing sections.",
'tog-editsectiononrightclick' => "[[Special:Preferences]], tab 'Edit'. Offers user to edit a section by clicking on a section title.",
'tog-showtoc' => "[[Special:Preferences]], tab 'Misc'. Offers user to show a table of contents automatically if a page has more than three headings.",
-'tog-rememberpassword' => "[[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details.
-
-{{Identical|Remember my login on this computer}}",
-'tog-editwidth' => "[[Special:Preferences]], tab 'Edit'. Offers user make give edit box full width in browser.",
+'tog-rememberpassword' => "{{Identical|Remember my login on this computer}}[[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details. Parameters:
+* $1 is the number of days the login details are remembered.",
'tog-watchcreations' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add created pages to watchlist.",
'tog-watchdefault' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add edited pages to watchlist.",
'tog-watchmoves' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add moved pages to watchlist.",
@@ -132,7 +134,9 @@ This is the toolbar: [[Image:Toolbar.png]]",
'tog-nocache' => "[[Special:Preferences]], tab 'Misc.'. Offers the user the option of disabling caching of pages in the browser",
'tog-enotifwatchlistpages' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
'tog-enotifusertalkpages' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
-'tog-enotifminoredits' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
+'tog-enotifminoredits' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.
+
+Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwatchlistpages}} are shown.',
'tog-enotifrevealaddr' => 'Toggle option used in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
'tog-shownumberswatching' => 'Toggle option used in [[Special:Preferences]], in the section for recent changes. When this option is activated, the entries in recent changes includes the number of users who watch pages.',
'tog-oldsig' => 'Used in [[Special:Preferences]], tab User profile.',
@@ -191,30 +195,54 @@ This is the toolbar: [[Image:Toolbar.png]]",
'thu' => 'Abbreviation for Thursday, a day of the week.',
'fri' => 'Abbreviation for Friday, a day of the week.',
'sat' => 'Abbreviation for Saturday, a day of the week.',
-'january' => 'The first month of the Gregorian calendar',
-'february' => 'The second month of the Gregorian calendar',
-'march' => 'The third month of the Gregorian calendar',
-'april' => 'The fourth month of the Gregorian calendar',
-'may_long' => 'The fifth month of the Gregorian calendar',
-'june' => 'The sixth month of the Gregorian calendar',
-'july' => 'The seventh month of the Gregorian calendar',
-'august' => 'The eighth month of the Gregorian calendar',
-'september' => 'The ninth month of the Gregorian calendar',
-'october' => 'The tenth month of the Gregorian calendar',
-'november' => 'The eleventh month of the Gregorian calendar',
-'december' => 'The twelfth month of the Gregorian calendar',
-'january-gen' => 'The first month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'february-gen' => 'The second month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'march-gen' => 'The third month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'april-gen' => 'The fourth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'may-gen' => 'The fifth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'june-gen' => 'The sixth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'july-gen' => 'The seventh month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'august-gen' => 'The eighth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'september-gen' => 'The nineth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'october-gen' => 'The tenth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'november-gen' => 'The eleventh month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
-'december-gen' => 'The twelfth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.',
+'january' => 'The first month of the Gregorian calendar
+{{Identical|January}}',
+'february' => 'The second month of the Gregorian calendar
+{{Identical|February}}',
+'march' => 'The third month of the Gregorian calendar
+{{Identical|March}}',
+'april' => 'The fourth month of the Gregorian calendar
+{{Identical|April}}',
+'may_long' => 'The fifth month of the Gregorian calendar
+{{Identical|May}}',
+'june' => 'The sixth month of the Gregorian calendar
+{{Identical|June}}',
+'july' => 'The seventh month of the Gregorian calendar
+{{Identical|July}}',
+'august' => 'The eighth month of the Gregorian calendar
+{{Identical|August}}',
+'september' => 'The ninth month of the Gregorian calendar
+{{Identical|September}}',
+'october' => 'The tenth month of the Gregorian calendar
+{{Identical|October}}',
+'november' => 'The eleventh month of the Gregorian calendar
+{{Identical|November}}',
+'december' => 'The twelfth month of the Gregorian calendar
+{{Identical|December}}',
+'january-gen' => 'The first month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|January}}',
+'february-gen' => 'The second month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|February}}',
+'march-gen' => 'The third month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|March}}',
+'april-gen' => 'The fourth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|April}}',
+'may-gen' => 'The fifth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|May}}',
+'june-gen' => 'The sixth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|June}}',
+'july-gen' => 'The seventh month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|July}}',
+'august-gen' => 'The eighth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|August}}',
+'september-gen' => 'The nineth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|September}}',
+'october-gen' => 'The tenth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|October}}',
+'november-gen' => 'The eleventh month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|November}}',
+'december-gen' => 'The twelfth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.
+{{Identical|December}}',
'jan' => 'Abbreviation of January, the first month of the Gregorian calendar',
'feb' => 'Abbreviation of February, the second month of the Gregorian calendar',
'mar' => 'Abbreviation of March, the thrird month of the Gregorian calendar',
@@ -295,52 +323,33 @@ This can also appear in the credits page if the credits feature is enabled,for e
{{doc-important|Do not translate <tt>Project:</tt> part.}}",
# Vector skin
-'vector-action-addsection' => 'Used in the Vector skin. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector',
-'vector-action-delete' => 'Used in the Vector skin, as the name of a tab at the top of the page. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
+'vector-action-addsection' => 'Used in the Vector skin. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector',
+'vector-action-delete' => 'Used in the Vector skin, as the name of a tab at the top of the page. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
{{Identical|Delete}}',
-'vector-action-move' => 'Used in the Vector skin, on the tabs at the top of the page. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector
+'vector-action-move' => 'Used in the Vector skin, on the tabs at the top of the page. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector
{{Identical|Move}}',
-'vector-action-protect' => 'Tab at top of page, in vector skin
+'vector-action-protect' => 'Tab at top of page, in vector skin
{{Identical|Protect}}',
-'vector-action-undelete' => 'Tab at top of page, in vector skin.
+'vector-action-undelete' => 'Tab at top of page, in vector skin.
{{Identical|Undelete}}',
-'vector-action-unprotect' => 'Tab at top of page, in vector skin.
+'vector-action-unprotect' => 'Tab at top of page, in vector skin.
{{Identical|Unprotect}}',
-'vector-namespace-category' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Category:Translatewiki.net?useskin=vector
-
-{{Identical|Category}}',
-'vector-namespace-help' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Help:Rollback?useskin=vector',
-'vector-namespace-image' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/File:Tournesol.png?useskin=vector
-
-{{Identical|File}}',
-'vector-namespace-main' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
-{{Identical|Page}}',
-'vector-namespace-mediawiki' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/MediaWiki:Vector-namespace-mediawiki?useskin=vector
-{{Identical|Message}}',
-'vector-namespace-project' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Project:About?useskin=vector',
-'vector-namespace-special' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Special:SpecialPages?useskin=vector',
-'vector-namespace-talk' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector
-{{Identical|Discussion}}',
-'vector-namespace-template' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Template:Identical?useskin=vector
-{{Identical|Template}}',
-'vector-namespace-user' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/User:FuzzyBot?useskin=vector
-{{Identical|User page}}',
-'vector-view-create' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Foo?useskin=vector
+'vector-view-create' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Foo?useskin=vector
{{Identical|Create}}',
-'vector-view-edit' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
+'vector-view-edit' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
{{Identical|Edit}}',
-'vector-view-history' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
+'vector-view-history' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
{{Identical|View history}}',
-'vector-view-view' => 'Tab label in the Vector skin (verb). See for example http://translatewiki.net/w/i.php?title=Main_Page&useskin=vector',
-'vector-view-viewsource' => 'Tab label in the Vector skin.
+'vector-view-view' => 'Tab label in the Vector skin (verb). See for example http://translatewiki.net/w/i.php?title=Main_Page&useskin=vector',
+'vector-view-viewsource' => 'Tab label in the Vector skin.
{{Identical|View source}}',
-'actions' => '{{Identical|Action}}',
-'namespaces' => '{{Identical|Namespace}}',
-'variants' => 'Used by the Vector skin.',
+'actions' => '{{Identical|Action}}',
+'namespaces' => '{{Identical|Namespace}}',
+'variants' => 'Used by the Vector skin.',
'errorpagetitle' => 'Message shown in browser title bar when encountering error operation.
@@ -434,6 +443,11 @@ See also [[MediaWiki:Lastmodifiedatby/{{SUBPAGENAME}}]].',
'jumptosearch' => 'Part of the "jump to" navigation links. Hidden by default in monobook skin. The format is: [[MediaWiki:Jumpto/{{SUBPAGENAME}}|{{int:jumpto}}]] [[MediaWiki:Jumptonavigation/{{SUBPAGENAME}}|{{int:jumptonavigation}}]], {{int:jumptosearch}}.
{{Identical|Search}}',
+'pool-timeout' => 'Part of {{msg-mw|view-pool-error}}.',
+'pool-queuefull' => 'Part of {{msg-mw|view-pool-error}}
+
+"Pool" refers to a pool of processes.',
+'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.',
# 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' => 'Used as the label of the link that appears at the footer of every page on the wiki (in most of the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.
@@ -673,6 +687,7 @@ $1 is a filename, I think.',
{{Identical|Log in}}',
'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
+'createaccountreason' => '{{Identical|Reason}}',
'createaccounterror' => 'Parameters:
* $1 is an error message',
'nocookiesnew' => "This message is displayed when a new account was successfully created, but the browser doesn't accept cookies.",
@@ -691,6 +706,7 @@ $1 is a filename, I think.',
* [[Special:CreateAccount]]
$1 is the minimum number of characters in the password.',
+'password-login-forbidden' => 'Error message shown when the user has tried to log in using one of the special username/password combinations used for MediaWiki testing. (See [[mwr:75589]], [[mwr:75605]].)',
'mailmypassword' => 'Shown at [[Special:UserLogin]]',
'passwordremindertitle' => 'Title of e-mail which contains temporary password',
'passwordremindertext' => 'This text is used in an e-mail sent when a user requests a new temporary password (he has forgotten his password) or when an sysop creates a new user account choosing to have password and username sent to the new user by e-mail.
@@ -733,7 +749,7 @@ Parameters:
{{Identical|Reset password}}',
'oldpassword' => "Used on the 'User profile' tab of 'my preferences'. This is the text next to an entry box for the old password in the 'change password' section.",
-'newpassword' => '{{Identical|New password}}',
+'newpassword' => 'ନୂଆ ପାସବାରà­à¬¡à¬¼:',
'retypenew' => "Appears on the 'User profile' tab of the 'Preferences' special page in the 'Change password' section. It appears next to the text box for entering the new password a second time.",
'resetpass_submit' => 'Submit button on [[Special:ChangePassword]]',
'resetpass-submit-loggedin' => 'Button on [[Special:ResetPass]] to submit new password.
@@ -799,11 +815,11 @@ Tip for internal links',
'showpreview' => 'The text of the button to preview the page you are editing. See also {{msg|showdiff}} and {{msg|savearticle}} for the other buttons.',
'showdiff' => 'Button below the edit page. See also {{msg|showpreview}} and {{msg|savearticle}} for the other buttons.',
'anoneditwarning' => 'Shown when editing a page anonymously.',
+'anonpreviewwarning' => 'See also {{msg-mw|Anoneditwarning}}',
'missingsummary' => 'The text "edit summary" is in {{msg-mw|summary}}.
The text "Save" is in {{msg-mw|savearticle}}.',
'missingcommenttext' => 'This message is shown, when the textbox by a new-section is empty.',
-'missingcommentheader' => '
-The text "Save" is in {{msg-mw|savearticle}}.',
+'missingcommentheader' => 'Edit summary that is shown if you enable "Prompt me when entering a blank summary" and add a new section without headline to a talk page.',
'summary-preview' => 'Preview of the edit summary, shown under the edit summary itself.
Should match: {{msg-mw|summary}}.',
'subject-preview' => 'Should match {{msg-mw|subject}}',
@@ -856,6 +872,8 @@ See also {{msg-mw|Noarticletext-nopermission}}.',
'userjsyoucanpreview' => 'Text displayed on every js page.',
'usercsspreview' => 'Text displayed on preview of every user .css subpage',
'userjspreview' => 'Text displayed on preview of every user .js subpage',
+'sitecsspreview' => 'Text displayed on preview of .css pages in MediaWiki namespace',
+'sitejspreview' => 'Text displayed on preview of .js pages in MediaWiki namespace',
'updated' => '{{Identical|Updated}}',
'previewnote' => 'Note displayed when clicking on Show preview',
'editing' => "Shown as page title when editing a page. \$1 is the name of the page that is being edited. Example: \"''Editing Main Page''\".",
@@ -864,7 +882,6 @@ See also {{msg-mw|Noarticletext-nopermission}}.',
'storedversion' => 'This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version that has not been stored which is shown at the bottom of the page.',
'yourdiff' => '',
'copyrightwarning' => 'Copyright warning displayed under the edit box in editor',
-'longpagewarning' => 'Warning displayed when trying to edit a long page',
'longpageerror' => 'Warning displayed when trying to save a text larger than the maximum size allowed',
'protectedpagewarning' => '{{Related|Semiprotectedpagewarning}}',
'semiprotectedpagewarning' => '{{Related|Semiprotectedpagewarning}}',
@@ -892,6 +909,7 @@ Please report at [[Support]] if you are unable to properly translate this messag
* $1 is the current number of parser function calls.
* $2 is the allowed number of parser function calls.',
'expensive-parserfunction-category' => 'This message is used as a category name for a category where pages are placed automatically if they contain too many calls to expensive parser functions.',
+'post-expand-template-inclusion-warning' => 'When templates are expanded, there is a size limit for the number of bytes yielded. Usually that occurs from excessively nested templates, recursive templates, or ones having x-zillion of #if #case or similar contructs in them. When the wikicode parser detects this, it outputs a red warning message to the page.',
'post-expand-template-inclusion-category' => 'When templates are expanded, there is a size limit for the number of bytes yielded. Usually that occurs from excessively nested templates, recursive templates, or ones having x-zillion of #if #case or similar contructs in them. When the wikicode parser detects this, it outputs a red warning message to the page.',
'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax
@@ -960,6 +978,7 @@ Used in History and [[Special:Contributions]].',
* '''$4''' - time.",
# Revision deletion
+'rev-deleted-user-contribs' => 'Part of revision deletion.',
'rev-deleted-text-unhide' => 'This message is very similar to {{msg-mw|rev-suppressed-unhide-diff}}. Parameters:
* $1 is a HTML link to the diff',
'rev-suppressed-unhide-diff' => 'This message is very similar to {{msg-mw|rev-deleted-unhide-diff}} and to {{msg-mw|rev-suppressed-text-unhide}}. Parameters:
@@ -1141,12 +1160,20 @@ Please note that the parameters in a log entry will appear in the log only in th
# Diffs
'history-title' => 'Displayed as page title when you click on the "history" tab. The parameter $1 is the normal page title.',
'difference' => 'Displayed under the title when viewing the difference between two or more edits.',
+'difference-multipage' => 'Displayed under the title when viewing the difference between two or more pages.
+See also {{msg-mw|difference}}.',
'lineno' => 'Message used when comparing different versions of a page (diff). $1 is a line number.',
'compareselectedversions' => 'Used as button in history pages.',
'showhideselectedversions' => 'Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu.',
'editundo' => 'Undo link when viewing diffs
{{Identical|Undo}}',
-'diff-multi' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive.",
+'diff-multi' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive.
+
+*Parameter $1 is the number of revisions
+*Parameter $2 is the number of distinct users who made those revisions",
+'diff-multi-manyusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users. Parameters:
+* $1 is the number of revisions, will always be 101 or more.
+* $2 is the number of users that were found, which was limited at 100.",
# Search results
'searchresults-title' => 'Appears as page title in the html header of the search result special page.',
@@ -1289,6 +1316,7 @@ When changing this message, please also update {{msg-mw|vector-editwarning-warni
'contextlines' => "Option on the 'Search options' tab of [[Special:Preferences]]",
'contextchars' => 'Used in Preferences/Search tab',
'stub-threshold' => 'Used in [[Special:Preferences]], tab "Misc".',
+'stub-threshold-disabled' => 'Used in [[Special:Preferences]].',
'recentchangesdays' => 'Used in [[Special:Preferences]], tab "Recent changes".',
'recentchangesdays-max' => 'Shown as hint in [[Special:Preferences]], tab "Recent changes"',
'recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
@@ -1362,9 +1390,20 @@ Used in [[Special:Preferences]]. Parameters are:
{{Identical|Advanced options}}',
'prefs-advancedwatchlist' => 'Used in [[Special:Preferences]], tab "Watchlist".
{{Identical|Advanced options}}',
-'prefs-display' => '"Display" is a noun that specifies the kind of "options". So translate as "options about display", not as "display the options".
+'prefs-displayrc' => '"Display" is a noun that specifies the kind of "options". So translate as "options about display", not as "display the options".
+
+Used in [[Special:Preferences]], tab "Recent changes". The display options refer to:
+* {{msg-mw|Recentchangesdays}}
+* {{msg-mw|Recentchangescount}}',
+'prefs-displaysearchoptions' => '"Display" is a noun that specifies the kind of "options". So translate as "options about display", not as "display the options".
-Used in [[Special:Preferences]], tab "Recent changes".',
+Used in [[Special:Preferences]], tab "Search options". The display options refer to:
+* {{msg-mw|Vector-simplesearch-preference}}',
+'prefs-displaywatchlist' => '"Display" is a noun that specifies the kind of "options". So translate as "options about display", not as "display the options".
+
+Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
+* {{msg-mw|Prefs-watchlist-days}}
+* {{msg-mw|Prefs-watchlist-edits}}',
'prefs-diffs' => 'Used in [[Special:Preferences]], tab "Misc".',
# User rights
@@ -1517,6 +1556,7 @@ See also
'right-ipblock-exempt' => 'This user automatically
bypasses IP blocks, auto-blocks and range blocks - so I presume - but I am uncertain',
'right-proxyunbannable' => '{{doc-right|proxyunbannable}}',
+'right-unblockself' => '{{doc-right|unblockself}}',
'right-protect' => '{{doc-right|protect}}',
'right-editprotected' => '{{doc-right|editprotected}}',
'right-editinterface' => '{{doc-right|editinterface}}',
@@ -1545,9 +1585,6 @@ An alternative wording for translators could be \'Get the wiki to accept a track
'right-siteadmin' => '{{doc-right|siteadmin}}',
'right-reset-passwords' => '{{doc-right}}',
'right-override-export-depth' => '{{doc-right|override-export-depth}}',
-'right-versiondetail' => '{{doc-right|versiondetail}}
-
-Users having this right receive more detailed information on [[Special:Version]].',
'right-sendemail' => '{{doc-right}}',
# User rights log
@@ -1606,22 +1643,17 @@ This action allows editing of all of the "user rights", not just the rights of t
'action-siteadmin' => '{{Doc-action}}',
# Recent changes
-'nchanges' => 'Appears on the [[Special:RecentChanges]] special page in brackets after pages having more than one change on that date. $1 is the number of changes on that day.',
-'recentchanges' => 'The text of the link in sidebar going to the special page [[Special:RecentChanges]]. Also the page title of that special page.
+'nchanges' => 'Appears on the [[Special:RecentChanges]] special page in brackets after pages having more than one change on that date. $1 is the number of changes on that day.',
+'recentchanges' => 'The text of the link in sidebar going to the special page [[Special:RecentChanges]]. Also the page title of that special page.
{{Identical|Recent changes}}',
-'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
-'recentchangestext' => 'Text in recent changes',
-'recentchanges-label-legend' => 'Used at [[Special:RecentChanges]] and [[Special:Watchlist]].',
-'recentchanges-legend-newpage' => '* $1 - message {{msg-mw|newpageletter}} ({{int:newpageletter}})',
-'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
-'recentchanges-legend-minor' => '* $1 - message {{msg-mw|minoreditletter}} ({{int:minoreditletter}})',
-'recentchanges-label-minor' => 'Tooltip for {{msg-mw|newpageletter}}',
-'recentchanges-legend-bot' => '* $1 - message {{msg-mw|boteditletter}} ({{int:boteditletter}})',
-'recentchanges-label-bot' => 'Tooltip for {{msg-mw|boteditletter}}',
-'recentchanges-legend-unpatrolled' => '* $1 - message {{msg-mw|unpatrolledletter}} ({{int:unpatrolledletter}})',
-'recentchanges-label-unpatrolled' => 'Tooltip for {{msg-mw|unpatrolledletter}}',
-'rcnote' => 'Used on [[Special:RecentChanges]].
+'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
+'recentchangestext' => 'Text in recent changes',
+'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
+'recentchanges-label-minor' => 'Tooltip for {{msg-mw|newpageletter}}',
+'recentchanges-label-bot' => 'Tooltip for {{msg-mw|boteditletter}}',
+'recentchanges-label-unpatrolled' => 'Tooltip for {{msg-mw|unpatrolledletter}}',
+'rcnote' => 'Used on [[Special:RecentChanges]].
* $1 is the number of changes shown,
* $2 is the number of days for which the changes are shown,
* $3 is a date and time (deprecated),
@@ -1630,50 +1662,50 @@ This action allows editing of all of the "user rights", not just the rights of t
<!--Example: "\'\'Below are the last 50 changes in the last 7 days, as of 14:48, 24 January 2008.\'\'"-->
Example: "\'\'{{int:rcnote/en|50|7||24 January 2008|14:48}}\'\'"',
-'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time. The corrosponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
+'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time. The corrosponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
Parameter $1 is the maximum number of changes that are displayed.
Parameter $2 is a date and time.
Parameter $3 is a date.
Parameter $4 is a time.',
-'rclistfrom' => 'Used on [[Special:RecentChanges]]. Parameter $1 is a link to the revision of a specific date and time. The date and the time are the link description (without split of date and time, [[bugzilla:19104|Bug 19104]]). The corrosponding message is {{msg-mw|Rcnotefrom}}.',
-'rcshowhideminor' => "Option text in [[Special:RecentChanges]]. Parameters:
+'rclistfrom' => 'Used on [[Special:RecentChanges]]. Parameter $1 is a link to the revision of a specific date and time. The date and the time are the link description (without split of date and time, [[bugzilla:19104|Bug 19104]]). The corrosponding message is {{msg-mw|Rcnotefrom}}.',
+'rcshowhideminor' => "Option text in [[Special:RecentChanges]]. Parameters:
* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
-'rcshowhidebots' => "Option text in [[Special:RecentChanges]]. Parameters:
+'rcshowhidebots' => "Option text in [[Special:RecentChanges]]. Parameters:
* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.
{{Identical|$1 bots}}",
-'rcshowhideliu' => 'Option text in [[Special:RecentChanges]]',
-'rcshowhideanons' => "Option text in [[Special:RecentChanges]]. Parameters:
+'rcshowhideliu' => 'Option text in [[Special:RecentChanges]]',
+'rcshowhideanons' => "Option text in [[Special:RecentChanges]]. Parameters:
* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
-'rcshowhidepatr' => "Option text in [[Special:RecentChanges]]. Parameters:
+'rcshowhidepatr' => "Option text in [[Special:RecentChanges]]. Parameters:
* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
-'rcshowhidemine' => "Option text in [[Special:RecentChanges]]. Parameters:
+'rcshowhidemine' => "Option text in [[Special:RecentChanges]]. Parameters:
* $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
-'rclinks' => "Used on [[Special:RecentChanges]].
+'rclinks' => "Used on [[Special:RecentChanges]].
* '''\$1''' is a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".
* '''\$2''' is a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".
* '''\$3''' is a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"
List elements are separated by {{msg-mw|pipe-separator}} each. Each list element is, or contains, a link.",
-'diff' => 'Short form of "differences". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...',
-'hist' => 'Short form of "history". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...',
-'hide' => 'Option text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]]
+'diff' => 'Short form of "differences". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...',
+'hist' => 'Short form of "history". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...',
+'hide' => 'Option text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]]
{{Identical|Hide}}',
-'show' => '{{Identical|Show}}',
-'minoreditletter' => "Very short form of \"'''minor edit'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]], [[Special:Contributions]] and history pages.",
-'newpageletter' => "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]].",
-'boteditletter' => 'Abbreviation of "bot". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]].',
-'unpatrolledletter' => '{{optional}}
+'show' => '{{Identical|Show}}',
+'minoreditletter' => "Very short form of \"'''minor edit'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]], [[Special:Contributions]] and history pages.",
+'newpageletter' => "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]].",
+'boteditletter' => 'Abbreviation of "bot". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]].',
+'unpatrolledletter' => '{{optional}}
Used in {{msg-mw|Recentchanges-label-legend}}, meaning "unpatrolled".',
-'sectionlink' => '{{optional}}',
-'rc_categories' => "Probably to do with 'recent changes' special page, either in a particular skin, or for a particular user group.
+'sectionlink' => '{{optional}}',
+'rc_categories' => "Probably to do with 'recent changes' special page, either in a particular skin, or for a particular user group.
I guess that this should appear before an input box where you can specify that recent changes should be shown for pages belonging to certain categories only. You name the categories in the input box, and separate them by a pipe character. If this is right, then you should be able to use 'restrict' instead of 'limit', or even 'show pages in the following categories only'.",
-'rc-change-size' => '{{optional}}
+'rc-change-size' => '{{optional}}
Does not work under $wgMiserMode ([[mwr:48986|r48986]]).',
-'newsectionsummary' => 'Default summary when adding a new section to a page.',
+'newsectionsummary' => 'Default summary when adding a new section to a page.',
# Recent changes linked
'recentchangeslinked' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
@@ -1715,6 +1747,7 @@ Text displayed when uploading a file using [[Special:Upload]].",
* $2 is the list of file extensions that can be uploaded (Example: ''png, gif, jpg, jpeg, ogg, pdf, svg.'')
* $3 is the number of allowed file formats (to be used for the PLURAL function)",
'filetype-missing' => 'Error when uploading a file with no extension',
+'verification-error' => 'Error message shown when an uploaded file contents does not pass verification, i.e. the file is corrupted, it is not the type it claims to be etc.',
'large-file' => 'Variables $1 and $2 have appropriate unit symbols already. See for example [[Mediawiki:size-kilobytes]].',
'largefileserver' => 'Error message when uploading a file whose size is larger than the maximum allowed',
'emptyfile' => 'Error message when trying to upload an empty file',
@@ -1748,6 +1781,12 @@ $1 is the value in KB/MB/GB',
Parameters:
* $1 is a link to the deletion log, with the text from {{msg|deletionlog}}.',
'filename-prefix-blacklist' => "Do not translate the file name prefixes before the hash mark (#). Leave all the wiki markup, including the spaces, as is. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
+'upload-success-msg' => '$1 is the local file name after uploading
+$2 is the url the file was uploaded from, when using upload-by-url.',
+'upload-failure-msg' => '$1 is the specific error message
+$2 is the url the file tried to upload from, when using upload-by-url.',
+'upload-warning-msg' => '$1 is the url the file was uploaded from, when using upload-by-url
+$2 is the session key for the upload',
'upload-proto-error-text' => '"Remote upload" is explained on [http://en.wikipedia.org/wiki/Uploading_and_downloading#Remote_upload Wikipedia].',
'upload-file-error' => 'Unused on core [http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/specials/SpecialUpload.php?r1=53161&r2=53282].
@@ -1760,7 +1799,8 @@ Extensions making use of it:
{{Identical|Internal error}}',
# img_auth script messages
-'img-auth-accessdenied' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied',
+'img-auth-accessdenied' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied
+{{Identical|Access denied}}',
'img-auth-nopathinfo' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description',
'img-auth-notindir' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: When the specified path is not in upload directory.',
'img-auth-badtitle' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Bad title, $1 is the invalid title',
@@ -1793,6 +1833,7 @@ If \'scheme\' is difficult to translate, then you could use \'prefix\' instead.'
'imgfile' => '{{Identical|File}}',
'listfiles' => 'Page title and grouping label for the form displayed on [[Special:ListFiles]].
{{Identical|File list}}',
+'listfiles_thumb' => '{{Identical|Thumbnail}}',
'listfiles_date' => 'Column header for the result table displayed on [[Special:ListFiles]].
{{Identical|Date}}',
'listfiles_name' => 'Column header for the result table displayed on [[Special:ListFiles]].
@@ -1880,6 +1921,7 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
* {{msg-mw|shared-repo-from}}
* {{msg-mw|sharedupload}}, {{msg-mw|sharedupload-desc-here}}, {{msg-mw|sharedupload-desc-there}}',
'shared-repo-name-wikimediacommons' => '{{optional}}',
+'filepage.css' => '{{Optional}}',
# File reversion
'filerevert' => '{{Identical|Revert}}',
@@ -1889,7 +1931,7 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
* $1 is the name of the media
* $2 is a date
* $3 is a hour
-* $4 is an URL and must follow square bracket: [$4
+* $4 is a URL and must follow square bracket: [$4
{{Identical|Revert}}',
'filerevert-comment' => '{{Identical|Reason}}',
'filerevert-defaultcomment' => '* $1 is a date
@@ -1910,7 +1952,7 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
* $1 is the name of the media
* $2 is a date
* $3 is a hour
-* $4 is an URL and must follow square bracket: [$4',
+* $4 is a URL and must follow square bracket: [$4',
'filedelete-comment' => '{{Identical|Reason}}',
'filedelete-submit' => 'Delete button when deleting a file for admins
@@ -1977,7 +2019,6 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
'statistics-edits-average' => 'Used in [[Special:Statistics]]',
'statistics-views-total' => 'Used in [[Special:Statistics]]',
'statistics-views-peredit' => 'Used in [[Special:Statistics]]',
-'statistics-jobqueue' => 'Used in [[Special:Statistics]]',
'statistics-users' => 'Used in [[Special:Statistics]]',
'statistics-users-active' => 'Used in [[Special:Statistics]]',
'statistics-users-active-desc' => "Description shown beneath ''Active users'' in [[Special:Statistics]]
@@ -2023,6 +2064,8 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
'nmembers' => 'Appears in brackets after each category listed on the special page [[Special:WantedCategories]]. $1 is the number of members of the category.',
'nrevisions' => 'Number of revisions.',
'nviews' => 'This message is used on [[Special:PopularPages]] to say how many times each page has been viewed. Parameter $1 is the number of views.',
+'nimagelinks' => 'Used on [[Special:MostLinkedFiles]] to indicate how often a specific file is used.',
+'ntransclusions' => 'Used on [[Special:MostLinkedTemplates]] to indicate how often a template is in use.',
'specialpage-empty' => 'Used on a special page when there is no data. For example on [[Special:Unusedimages]] when all images are used.',
'lonelypages' => 'Name of [[Special:LonelyPages]] displayed in [[Special:SpecialPages]]',
'lonelypagestext' => 'Text displayed in [[Special:LonelyPages]]',
@@ -2239,43 +2282,51 @@ See also {{msg|listgrouprights-addgroup}}.',
* $2 is the number of group names in $1.',
# E-mail user
-'emailuser' => 'Link in the sidebar and title of [[Special:EmailUser|special page]]',
-'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
-'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
+'emailuser' => 'Link in the sidebar and title of [[Special:EmailUser|special page]]',
+'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
+'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser.',
-'noemailtitle' => 'The title of the message that appears instead of Special:EmailUser after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user.',
-'noemailtext' => 'The text of the message that appears in [[Special:EmailUser]] after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user because he has not specified or not confirmed an e-mail address.',
-'nowikiemailtext' => 'This is an error message used in [[Special:Emailuser]] when called with a target user not consenting to be an e-mail recipient.',
-'email-legend' => 'Title of the box in [[Special:EmailUser]]',
-'emailfrom' => 'Field in [[Special:EmailUser]].
+'usermaildisabled' => 'Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).',
+'noemailtitle' => 'The title of the message that appears instead of Special:EmailUser after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user.',
+'noemailtext' => 'The text of the message that appears in [[Special:EmailUser]] after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user because he has not specified or not confirmed an e-mail address.',
+'nowikiemailtext' => 'This is an error message used in [[Special:Emailuser]] when called with a target user not consenting to be an e-mail recipient.',
+'email-legend' => 'Title of the box in [[Special:EmailUser]]',
+'emailfrom' => 'Field in [[Special:EmailUser]].
{{Identical|From}}',
-'emailto' => 'Field in [[Special:EmailUser]].
+'emailto' => 'Field in [[Special:EmailUser]].
{{Identical|To}}',
-'emailsubject' => 'Field in [[Special:EmailUser]].
+'emailsubject' => 'Field in [[Special:EmailUser]].
{{Identical|Subject}}',
-'emailmessage' => 'Field in [[Special:EmailUser]].
+'emailmessage' => 'Field in [[Special:EmailUser]].
{{Identical|Message}}',
-'emailsend' => 'Button name in [[Special:EmailUser]].
+'emailsend' => 'Button name in [[Special:EmailUser]].
{{Identical|Send}}',
-'emailccme' => 'Used at [[Special:Preferences]] > E-mail',
-'emailccsubject' => 'Subject of the carbon-copied email for the sender sent through MediaWiki.',
-'emailuserfooter' => 'This message is appended to every email sent through the "Email user" function.
+'emailccme' => 'Used at [[Special:Preferences]] > E-mail',
+'emailccsubject' => 'Subject of the carbon-copied email for the sender sent through MediaWiki.',
+'emailsent' => 'Title of Special:Emailuser when it says you it sent an email',
+'emailsenttext' => 'When you send an e-mail, Special:Emailuser says you this (Your email has been sent).',
+'emailuserfooter' => 'This message is appended to every email sent through the "Email user" function.
* $1: username of the sender
* $2: username of the recipient',
+# User Messenger
+'usermessage-summary' => 'This message is used as an edit summary for any message that is posted because of a system event. Translate "leaving a message" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.',
+'usermessage-editor' => 'The user name for the user that is the editor of system messages. See [http://translatewiki.net/wiki/Thread:Support/Message_info_please discussion on Support].',
+
# Watchlist
'watchlist' => '{{Identical|My watchlist}}',
'mywatchlist' => 'Link at the upper right corner of the screen.
{{Identical|My watchlist}}',
-'watchlistfor' => 'Subtitle on [[Special:Watchlist]].
+'watchlistfor2' => 'Subtitle on [[Special:Watchlist]].
*$1: Username of current user
+*$2: Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)
{{Identical|For $1}}',
'nowatchlist' => 'Displayed when there is no pages in the watchlist.',
'watchlistanontext' => '* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
@@ -2508,26 +2559,29 @@ This message was something like "unlock move protection" in the past.',
'month' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg|year}}.',
'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a inputbox to select a specific year to view the edits made in that year, and the earlier years. See also {{msg|month}}.',
-'sp-contributions-newbies' => 'Text of radio button on special page [[Special:Contributions]].',
-'sp-contributions-newbies-sub' => "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
-'sp-contributions-newbies-title' => 'The page title in your browser bar, but not the page title. See also {{msg|sp-contributions-newbies-sub}}.',
-'sp-contributions-blocklog' => 'Used as a display name for a link to the block log on for example [[Special:Contributions/Mediawiki default]]
+'sp-contributions-newbies' => 'Text of radio button on special page [[Special:Contributions]].',
+'sp-contributions-newbies-sub' => "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
+'sp-contributions-newbies-title' => 'The page title in your browser bar, but not the page title. See also {{msg|sp-contributions-newbies-sub}}.',
+'sp-contributions-blocklog' => 'Used as a display name for a link to the block log on for example [[Special:Contributions/Mediawiki default]]
{{Identical|Block log}}',
-'sp-contributions-deleted' => "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.",
-'sp-contributions-logs' => "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").",
-'sp-contributions-talk' => "This is a link anchor used in the [[Special:Contributions]]/''usernamename'' pages.
+'sp-contributions-deleted' => "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.",
+'sp-contributions-uploads' => '{{Identical|Upload}}',
+'sp-contributions-logs' => "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").",
+'sp-contributions-talk' => "This is a link anchor used in the [[Special:Contributions]]/''usernamename'' pages.
The link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />
( talk | block log | logs | deleted contributions | rights management )",
-'sp-contributions-userrights' => "This is a link anchor used in [[Special:Contributions]]/''name'', if the user viewing the page has the right to set or alter user rights.",
-'sp-contributions-blocked-notice' => 'Shown on top of contributions special page of currently blocked users. Parameters:
+'sp-contributions-userrights' => "This is a link anchor used in [[Special:Contributions]]/''name'', if the user viewing the page has the right to set or alter user rights.",
+'sp-contributions-blocked-notice' => 'Shown on top of contributions special page of currently blocked users. Parameters:
* $1 is the blocked user. Can be used for GENDER (optional)
Anon version: {{msg-mw|Sp-contributions-blocked-notice-anon}}',
-'sp-contributions-search' => 'Used on [[Special:Contributions]]',
-'sp-contributions-username' => 'This message appears whenever someone requests [[Special:Contributions]].
+'sp-contributions-blocked-notice-anon' => 'Same as {{msg-mw|Sp-contributions-blocked-notice}} but for anonymous users.',
+'sp-contributions-search' => 'Used on [[Special:Contributions]]',
+'sp-contributions-username' => 'This message appears whenever someone requests [[Special:Contributions]].
{{Identical/IP address or username}}',
-'sp-contributions-submit' => '{{Identical|Search}}',
+'sp-contributions-toponly' => '"top revision" means the "latest revision"',
+'sp-contributions-submit' => '{{Identical|Search}}',
# What links here
'whatlinkshere' => 'The text of the link in the toolbox (on the left, below the search menu) going to [[Special:WhatLinksHere]].',
@@ -2685,6 +2739,8 @@ Used on [[Special:Block]] as header for other blocks, i.e. from GlobalBlocking o
'proxyblocksuccess' => '{{Identical|Done}}',
'sorbs' => '{{optional}}',
'cant-see-hidden-user' => 'Used as (red) error message on Special:Block when you try to change (as sysop w/o the hideuser right) the block of a hidden user.',
+'ipbblocked' => 'Error message shown when a user tries to alter block settings when they are themselves blocked.',
+'ipbnounblockself' => 'Error message shown when a user without the <tt>unblockself</tt> right tries to unblock themselves.',
# Developer tools
'lockdb' => 'The title of the special page [[Special:LockDB]].
@@ -2714,6 +2770,7 @@ Shown as subtitle of [[Special:MovePage/testpage]]. $1 is the title of the page
Special pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}
See also {{msg-mw|Movepagetext-noredirectfixer|notext=1}}',
+'movepagetext-noredirectfixer' => 'A variant of {{msg-mw|Movepagetext|notext=1}} displayed when the automatic redirect fixer is not enabled.',
'movepagetalktext' => "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
'movearticle' => 'The text before the name of the page that you are moving. Can be translated as "Page that is going to be moved"
@@ -2991,7 +3048,7 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
# Patrol log
'patrol-log-page' => 'Name of log.',
'patrol-log-header' => 'Text that appears above the log entries on the [[Special:log|patrol log]].',
-'patrol-log-line' => 'Text of notes on entries in the [[Special:Log|patrol log]]. $1 is the link whose text is [[Mediawiki:patrol-log-diff]]. $2 is the name of the page. $3 appears to be [[Mediawiki:Patrol-log-auto]] (at least sometimes).
+'patrol-log-line' => 'Text of notes on entries in the [http://translatewiki.net/w/i.php?title=Special%3ALog&type=patrol&user=&page=&year=&month=-1 patrol log]. $1 is the link whose text is {{msg-mw|patrol-log-diff}}. $2 is the name of the page. $3 appears to be {{msg-mw|Patrol-log-auto}} (at least sometimes).
The message appears after the name of the patroller.',
'patrol-log-auto' => 'Automated edit summary when patrolling.
@@ -3009,15 +3066,33 @@ The message appears after the name of the patroller.',
'mediawarning' => 'Shows up on file description pages if the file type is not listed in [[mw:Manual:$wgTrustedMediaFormats|Manual:$wgTrustedMediaFormats]].',
'imagemaxsize' => 'This is used in Special:Preferences, under Files.',
'widthheight' => '{{optional}}',
-'widthheightpage' => 'This message is used on image pages in the dimensions column in the file history section for images with more than one page. Parameter $1 is the image width (in pixels), parameter $2 is the image height, and parameter $3 is the number of pages.',
+'widthheightpage' => 'This message is used on image pages in the dimensions column in the file history section for images with more than one page.
+
+Parameters:
+* $1 is the width of the image pages in pixels.
+* $2 is the height of the image pages in pixels.
+* $3 is the number of pages in the file.',
'file-info' => 'File info displayed on file description page.',
-'file-info-size' => 'File info displayed on file description page.',
+'file-info-size' => 'File info displayed on file description page.
+
+Parameters:
+* $1 is the width of the image(s) in pixels.
+* $2 is the height of the image(s) in pixels.
+* $3 is the file size as a number followed by a unit — for example: 99 KB
+* $4 is the MIME type, a formalized textual information — for example: <code>image/jpeg</code>',
'file-nohires' => 'File info displayed on file description page. For example of message in use see [[:File:Mouse10.gif]].',
-'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:Image:Wiki.svg]].',
+'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].',
'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
'show-big-image-thumb' => 'File info displayed on file description page.',
'file-info-gif-looped' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/Gif .gif file] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].',
'file-info-gif-frames' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/Gif .gif file] on its file description page.',
+'file-info-png-looped' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/APNG .apng file] on its file description page. Looped means repeating indefinetly in the context of an animated png. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop.',
+'file-info-png-repeat' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/APNG .apng file] on its file description page. The sequence of images is repeating a limited amount of time. It is a sequence of images, each displayed after the other, and the first one displayed after the last, for $1 times.',
+'file-info-png-frames' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/APNG .apng file] on its file description page.
+
+The variable $1 is the number of individual frames in an animated gif file.
+
+For example of message in use see [[:File:Mouse10.gif]].',
# Special:NewFiles
'newimages' => 'Page title of [[Special:NewImages]].',
@@ -3146,7 +3221,9 @@ The sentences are for explanation only and are not shown to the user.",
{{Identical|Height}}',
'exif-bitspersample' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-compression' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-compression' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+
+This field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. http://en.wikipedia.org/wiki/TIFF#TIFF_Compression_Tag has information about this field.',
'exif-photometricinterpretation' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
'exif-orientation' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
'exif-samplesperpixel' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
@@ -3368,6 +3445,9 @@ See also Wikipedia on [http://en.wikipedia.org/wiki/Focal_length#In_photography
{{Identical|Longitude}}',
'exif-gpsdatestamp' => 'Date (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.',
+'exif-objectname' => "This is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image). This is sometimes an id number used to identify the photo, or a (short) title of the photo.
+
+This property is extracted based on XMP's dc:title property ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), PNG's title keyword ( http://www.w3.org/TR/PNG/#11keywords ), or IPTC-iim 2:05 Object name property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).",
# EXIF attributes
'exif-compression-6' => '{{optional}}',
@@ -3520,21 +3600,21 @@ Please leave the link http://www.mediawiki.org/wiki/Manual:External_editors exac
{{Identical|All}}',
# E-mail address confirmation
-'confirmemail' => 'Title of [[Special:ConfirmEmail]] page.',
-'confirmemail_noemail' => 'Failure message on [[Special:ConfirmEmail]].',
-'confirmemail_text' => 'Explanation on [[Special:ConfirmEmail]]',
-'confirmemail_pending' => 'Message on [[Special:ConfirmEmail]] when confirmation of e-mail not yet complete.',
-'confirmemail_send' => 'Button label on [[Special:ConfirmEmail]]',
-'confirmemail_sent' => 'Message appearing after button {{msg-mw|Confirmemail_send}} activated on [[Special:ConfirmEmail]].',
-'confirmemail_sendfailed' => 'Failure message to do with [[Special:ConfirmEmail]].
+'confirmemail' => 'Title of [[Special:ConfirmEmail]] page.',
+'confirmemail_noemail' => 'Failure message on [[Special:ConfirmEmail]].',
+'confirmemail_text' => 'Explanation on [[Special:ConfirmEmail]]',
+'confirmemail_pending' => 'Message on [[Special:ConfirmEmail]] when confirmation of e-mail not yet complete.',
+'confirmemail_send' => 'Button label on [[Special:ConfirmEmail]]',
+'confirmemail_sent' => 'Message appearing after button {{msg-mw|Confirmemail_send}} activated on [[Special:ConfirmEmail]].',
+'confirmemail_sendfailed' => 'Failure message to do with [[Special:ConfirmEmail]].
$1 is a message from the e-mail delivery system.',
-'confirmemail_needlogin' => 'Used on [[Special:ConfirmEmail]] when you are logged out.
+'confirmemail_needlogin' => 'Used on [[Special:ConfirmEmail]] when you are logged out.
* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
-'confirmemail_loggedin' => 'Explanation on [[Special:ConfirmEmail]] on completion of confirmation.',
-'confirmemail_subject' => 'Text in subject box of e-mail sent to user during e-mail address confirmation
+'confirmemail_loggedin' => 'Explanation on [[Special:ConfirmEmail]] on completion of confirmation.',
+'confirmemail_subject' => 'Text in subject box of e-mail sent to user during e-mail address confirmation
{{Identical|SITENAME e-mail address confirmation}}',
-'confirmemail_body' => 'This message is sent as an e-mail to users when they add or change their e-mail adress in [[Special:Preferences]].
+'confirmemail_body' => 'This message is sent as an e-mail to users when they add or change their e-mail adress in [[Special:Preferences]].
*$1 is the IP address of the user that changed the e-mail address
*$2 is the name of the user
*$3 is a URL to [[Special:ConfirmEmail]]
@@ -3542,8 +3622,30 @@ $1 is a message from the e-mail delivery system.',
*$5 is a URL to [[Special:InvalidateEmail]]
*$6 is a date
*$7 is a time',
-'confirmemail_invalidated' => 'This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.',
-'invalidateemail' => "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
+'confirmemail_body_changed' => 'This message is sent as an e-mail to users when they add or change their e-mail adress in [[Special:Preferences]].
+
+See also [[MediaWiki:Confirmemail_body_set]].
+
+*$1 is the IP address of the user that changed the e-mail address
+*$2 is the name of the user
+*$3 is a URL to [[Special:ConfirmEmail]]
+*$4 is a time and date (duplicated by $6 and $7)
+*$5 is a URL to [[Special:InvalidateEmail]]
+*$6 is a date
+*$7 is a time',
+'confirmemail_body_set' => 'This is used in a confirmation e-mail sent when a contact e-mail address is set.
+
+See also [[MediaWiki:Confirmemail_body_changed]].
+
+*$1 is the IP address of the user that set the e-mail address
+*$2 is the name of the user
+*$3 is a URL to [[Special:ConfirmEmail]]
+*$4 is a time and date (duplicated by $6 and $7)
+*$5 is a URL to [[Special:InvalidateEmail]]
+*$6 is a date
+*$7 is a time',
+'confirmemail_invalidated' => 'This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.',
+'invalidateemail' => "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
# Trackbacks
'trackbackbox' => '* $1 is the content of [[MediaWiki:Trackbackexcerpt]] or [[MediaWiki:Trackback]], depending if the trackback has an excerpt
@@ -3764,6 +3866,7 @@ Name of month in Hebrew calender.',
# Core parser functions
'unknown_extension_tag' => '* Description: This is an error shown when you use an unknown extension tag name. This feature allows tags like <tt><nowiki><pre></nowiki></tt> to be called with a parser like <tt><nowiki>{{#tag:pre}}</nowiki></tt>.
* Parameter $1: This is the unknown extension tag name.',
+'duplicate-defaultsort' => 'Definition of [http://en.wikipedia.org/wiki/Sorting sort key] on Wikipedia.',
# Special:Version
'version' => 'Name of special page displayed in [[Special:SpecialPages]]
@@ -3789,6 +3892,11 @@ There are no such extensions here, so look at [[wikipedia:Special:Version]] for
{{Identical|Revision}}',
'version-license' => '{{Identical|License}}',
+'version-poweredby-credits' => 'Message shown on [[Special:Version]]. Parameters are:
+*$1: the current year
+*$2: a list of selected MediaWiki authors',
+'version-poweredby-others' => 'Used at the very end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there\'s a long list of selected MediaWiki authors, then the word "and" (from {{msg-mw|and}}) follows and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.',
+'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See http://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}}',
@@ -3846,7 +3954,9 @@ $1 is the name of the requested file.',
'intentionallyblankpage' => 'Text displayed in [[Special:BlankPage]].',
# External image whitelist
-'external_image_whitelist' => "As usual please leave all the wiki markup, including the spaces, as they are. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
+'external_image_whitelist' => "As usual please leave all the wiki markup, including the spaces, as they are. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.
+
+Definition of [http://en.wikipedia.org/wiki/Regular_expression regular expression] on Wikipedia.",
# Special:Tags
'tags' => "Shown on [[Special:Specialpages]] for page listing the tags that the software may mark an edit with, and their meaning. For more information on tags see [http://www.mediawiki.org/wiki/Manual:Tags Mediawiki].
@@ -3868,6 +3978,19 @@ Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a
* <code>$1</code> is the number of changes marked with the tag',
+# Special:ComparePages
+'comparepages' => 'The title of [[Special:ComparePages]]',
+'compare-selector' => 'Header of the form on [[Special:ComparePages]]',
+'compare-page1' => 'Label for the field of the 1st page in the comparison for [[Special:ComparePages]]
+{{Identical|Page}}',
+'compare-page2' => 'Label for the field of the 2nd page in the comparison for [[Special:ComparePages]]
+{{Identical|Page}}',
+'compare-rev1' => 'Label for the field of the 1st revision in the comparison for [[Special:ComparePages]]
+{{Identical|Revision}}',
+'compare-rev2' => 'Label for the field of the 2nd revision in the comparison for [[Special:ComparePages]]
+{{Identical|Revision}}',
+'compare-submit' => 'Submit button on [[Special:ComparePages]]',
+
# Database error messages
'dberr-header' => 'This message does not allow any wiki nor html markup.',
'dberr-problems' => 'This message does not allow any wiki nor html markup.',
@@ -3885,4 +4008,8 @@ Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a
{{Identical|Other}}',
+# SQLite database support
+'sqlite-has-fts' => 'Shown on Special:Version, $1 is version',
+'sqlite-no-fts' => 'Shown on Special:Version, $1 is version',
+
);
diff --git a/languages/messages/MessagesQu.php b/languages/messages/MessagesQu.php
index af92fed0..e263f11a 100644
--- a/languages/messages/MessagesQu.php
+++ b/languages/messages/MessagesQu.php
@@ -8,6 +8,7 @@
* @file
*
* @author AlimanRuna
+ * @author Diego Grez
* @author Omnipaedista
* @author Reedy
* @author The Evil IP address
@@ -125,70 +126,70 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECT' ),
+ 'redirect' => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
'notoc' => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÃA__', '__NOGALLERY__' ),
+ 'nogallery' => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÃA__', '__NOGALERIA__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
'toc' => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
- 'noeditsection' => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__UMANNAQ__', '__NOTÃTULO__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES ACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE MES ACTUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'KUNANKILLASUTIP', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'KUNANKILLAPISI', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'KUNANPUNCHAW', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA ACTUAL', 'DIA ACTUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'KUNANPUNCHAW2', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA ACTUAL2', 'DIA ACTUAL2', 'CURRENTDAY2' ),
+ 'noeditsection' => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__UMANNAQ__', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'KUNANPUNCHAW', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'KUNANPUNCHAW2', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
'currentdayname' => array( '1', 'KUNANPUNCHAWSUTI', 'NOMBREDÃAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO ACTUAL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'KUNANPACHA', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'KUNANURA', 'HORA ACTUAL', 'HORAACTUAL', 'CURRENTHOUR' ),
+ 'currentyear' => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'KUNANURA', 'HORA_ACTUAL', 'HORAACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'KAYPIKILLASUTI', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'KAYPIKILLASUTIP', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'KAYPIKILLAPISI', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'KAYPIPUNCHAW', 'DÃALOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'KAYPIPUNCHAW2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'KAYPIPUNCHAWSUTI', 'LOCALDAYNAME' ),
+ 'localmonthname' => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'KAYPIPUNCHAW', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'KAYPIPUNCHAW2', 'DIALOCAL2', 'DÃALOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'KAYPIPUNCHAWSUTI', 'NOMBREDIALOCAL', 'NOMBREDÃALOCAL', 'LOCALDAYNAME' ),
'localyear' => array( '1', 'KAYPIWATA', 'AÑOLOCAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'KAYPIPACHA', 'LOCALTIME' ),
- 'localhour' => array( '1', 'KAYPIURA', 'HORALOCAL', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'HAYKAPANQA', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÃCULOS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'PANQASUTI', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'PANQASUTIE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'SUTIKITI', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'SUTIKITIE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'RIMANAKUYKITI', 'RIMAYKITI', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'QILLQAKITI', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'QILLQAKITIE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'HUNTAPANQASUTI', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'HUNTAPANQASUTIE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'URINPANQASUTI', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'URINPANQASUTIE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'TIKSIPANQASUTI', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'TIKSIPANQASUTIE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'RIMANAKUYPANQASUTI', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'RIMANAKUYPANQASUTIE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'QILLQAPANQASUTI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'QILLQAPANQASUTIE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'WILLA:', 'MSG:' ),
+ 'localtime' => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'KAYPIURA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'HAYKAPANQA', 'NÚMERODEPÃGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÃCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'PANQASUTI', 'NOMBREDEPAGINA', 'NOMBREDEPÃGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PANQASUTIE', 'NOMBREDEPAGINAC', 'NOMBREDEPÃGINAC', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'SUTIKITI', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'SUTIKITIE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'RIMANAKUYKITI', 'RIMAYKITI', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'QILLQAKITI', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÃCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'QILLQAKITIE', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÃCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'HUNTAPANQASUTIE', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÃGINAC', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'URINPANQASUTI', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'URINPANQASUTIE', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÃGINAC', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'TIKSIPANQASUTI', 'NOMBREDEPAGINABASE', 'NOMBREDEPÃGINABASE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'TIKSIPANQASUTIE', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÃGINABASEC', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'RIMANAKUYPANQASUTI', 'NOMBREDEPÃGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÃGINADISCUSIÓN', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'RIMANAKUYPANQASUTIE', 'NOMBREDEPÃGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÃGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'QILLQAPANQASUTI', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'QILLQAPANQASUTIE', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'WILLA:', 'MSJ:', 'MSG:' ),
'subst' => array( '0', 'WAKCHAY:', 'SUBST:' ),
'msgnw' => array( '0', 'WILLAMUSUQ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'rikchacha', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'rikchacha=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_thumbnail' => array( '1', 'rikchacha', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'rikchacha=$1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'paña', 'alliq', 'derecha', 'dcha', 'der', 'right' ),
'img_left' => array( '1', 'lluqi', 'ichuq', 'izquierda', 'izda', 'izq', 'left' ),
'img_none' => array( '1', 'manaima', 'mana', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
'img_center' => array( '1', 'chawpi', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
'img_framed' => array( '1', 'inchuyuq', 'inchu', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'inchunnaq', 'sinmarco', 'sin embarcar', 'sinenmarcar', 'sin enmarcar', 'frameless' ),
- 'img_page' => array( '1', 'panqa=$1', 'page=$1', 'page $1' ),
+ 'img_frameless' => array( '1', 'inchunnaq', 'sinmarco', 'sin_embarcar', 'sinenmarcar', 'sin_enmarcar', 'frameless' ),
+ 'img_page' => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'sayaq', 'sayaq=$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'saywa', 'borde', 'border' ),
'img_baseline' => array( '1', 'tiksisiqi', 'baseline' ),
@@ -199,64 +200,64 @@ $magicWords = array(
'img_middle' => array( '1', 'ukhupi', 'middle' ),
'img_bottom' => array( '1', 'sikipi', 'bottom' ),
'img_text_bottom' => array( '1', 'qillqasiki', 'text-bottom' ),
- 'img_link' => array( '1', 'tinki=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'tinki=$1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
'img_alt' => array( '1', 'wak=$1', 'alt=$1' ),
'int' => array( '0', 'WILLAY:', 'INT:' ),
- 'sitename' => array( '1', 'TIYAYSUTI', 'SITENAME' ),
- 'ns' => array( '0', 'SKITI:', 'NS:' ),
- 'localurl' => array( '0', 'KAYLLAURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'KAYLLAURLE:', 'LOCALURLE:' ),
+ 'sitename' => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'SITENAME' ),
+ 'ns' => array( '0', 'SKITI:', 'EN:', 'NS:' ),
+ 'localurl' => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
'server' => array( '0', 'SIRWIQ', 'SERVIDOR', 'SERVER' ),
'servername' => array( '0', 'SIRWIQSUTI', 'NOMBRESERVIDOR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'QILLQAÑAN', 'QILLQANAN', 'RUTASCRIPT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'SIMIKAMACHIY:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'QHARIWARMI:', 'QARIWARMI:', 'GÉNERO:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__AMASUTITAHUKCHAYCHU__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__AMASAMIQTAHUKCHAYCHU__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'KUNANSIMANA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'KUNANSIMANAPUNCHAW', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'KAYLLASIMANA', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'KAYLLASIMANAPUNCHAW', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'MUSUQCHASQAID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'MUSUQCHASQAPUNCHAW', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'MUSUQCHASQAPUNCHAW2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MUSUQCHASQAKILLA', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'MUSUQCHASQAWATA', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'MUSUQCHASQAPACHAQILLPA', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'MUSUQCHASQARURAQ', 'REVISIONUSER' ),
+ 'scriptpath' => array( '0', 'QILLQAÑAN', 'QILLQANAN', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'SIMIKAMACHIY:', 'GRAMATICA:', 'GRAMÃTICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'QHARIWARMI:', 'QARIWARMI:', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__AMASUTITAHUKCHAYCHU__', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÃTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__AMASAMIQTAHUKCHAYCHU__', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'KUNANSIMANA', 'SEMANAACTUAL', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'KUNANSIMANAPUNCHAW', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÃADESEMANAACTUAL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'KAYLLASIMANA', 'SEMANALOCAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'KAYLLASIMANAPUNCHAW', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÃADESEMANALOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'MUSUQCHASQAID', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'MUSUQCHASQAPUNCHAW', 'DIADEREVISION', 'DIAREVISION', 'DÃADEREVISIÓN', 'DÃAREVISIÓN', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'MUSUQCHASQAPUNCHAW2', 'DIADEREVISION2', 'DIAREVISION2', 'DÃADEREVISIÓN2', 'DÃAREVISIÓN2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MUSUQCHASQAKILLA', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'MUSUQCHASQAWATA', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'MUSUQCHASQAPACHAQILLPA', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'MUSUQCHASQARURAQ', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
'plural' => array( '0', 'ACHKA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'HUNTAURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'HUNTAURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'UCHUY:', 'LC:' ),
- 'uc' => array( '0', 'HATUN:', 'UC:' ),
+ 'fullurl' => array( '0', 'HUNTAURL:', 'URLCOMPLETA:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'HUNTAURLE:', 'URLCOMPLETAC:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
+ 'uc' => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
'raw' => array( '0', 'CHAWA:', 'RAW:' ),
'displaytitle' => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'URLENCODE:' ),
+ 'currentversion' => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
'anchorencode' => array( '0', 'WATANALLAWICHAY', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'KUNANPACHAQILLPA', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'KAYLLAPACHAQILLPA', 'LOCALTIMESTAMP' ),
+ 'currenttimestamp' => array( '1', 'KUNANPACHAQILLPA', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'KAYLLAPACHAQILLPA', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
'directionmark' => array( '1', 'PURIRIYSANANCHA', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#RIMAY:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'SAMIQRIMAY', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'language' => array( '0', '#RIMAY:', '#IDIOMA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'SAMIQRIMAY', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
'pagesinnamespace' => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATNUM' ),
+ 'numberofadmins' => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NÚMEROADMINIISTRADORES', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
'padleft' => array( '0', 'PADLLUQI', 'PADICHUQ', 'PADLEFT' ),
'padright' => array( '0', 'PADPAÑA', 'PADALLIQ', 'PADRIGHT' ),
- 'special' => array( '0', 'sapaq', 'special' ),
- 'defaultsort' => array( '1', 'ALLINCHAY', 'SIQINCHAY', 'ORDENAR', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'WILLAÑIQIÑAN', 'WILLANIQINAN', 'RUTAARCHIVO', 'RUTARCHIVO', 'FILEPATH:' ),
+ 'special' => array( '0', 'sapaq', 'especial', 'special' ),
+ 'defaultsort' => array( '1', 'ALLINCHAY:', 'SIQINCHAY:', 'ORDENAR:', 'ORDENPREDETERMINADO:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'WILLAÑIQIÑAN', 'WILLANIQINAN', 'RUTAARCHIVO', 'RUTARCHIVO', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
'tag' => array( '0', 'unanchacha', 'UNANCHACHA', 'etiqueta', 'ETIQUETA', 'tag' ),
'hiddencat' => array( '1', '__PAKASQAKATIGURIYA__', '__CATEGORÃAOCULTA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'KATIGURIYAPIPANQAKUNA', 'PÃGINASENCATEGORÃA', 'PÃGINASENCAT', 'PAGSENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'PANQACHHIKAN', 'PANQACHIKAN', 'PANQACHIKA', 'TAMAÑOPÃGINA', 'PAGESIZE' ),
+ 'pagesincategory' => array( '1', 'KATIGURIYAPIPANQAKUNA', 'PÃGINASENCATEGORÃA', 'PÃGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PANQACHHIKAN', 'PANQACHIKAN', 'PANQACHIKA', 'TAMAÑOPÃGINA', 'TAMAÑODEPÃGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
'index' => array( '1', '__UNANCHAY__', '__INDEXAR__', '__INDEX__' ),
'noindex' => array( '1', '__AMAUNANCHAYCHU__', '__NOINDEXAR__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__TIYAQLLAPUSAPUNA__', '__STATICREDIRECT__' ),
+ 'numberingroup' => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__TIYAQLLAPUSAPUNA__', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÃTICA__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
);
@@ -276,8 +277,7 @@ $messages = array(
'tog-editsection' => "Rakirilla llamk'apuyta saqillay [qillqay] t'inkiwan",
'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa (JavaScript)",
'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)",
-'tog-rememberpassword' => "Yaykuna rimata yuyaykuy llamk'ay tiyaypura",
-'tog-editwidth' => "Llamk'apuna k'itita mast'ariy lliw qhawana pampata hunt'ananpaq",
+'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
'tog-watchcreations' => "Qallarisqay p'anqakunata watiqay.",
'tog-watchdefault' => "Hukchasqay p'anqakunata watiqay",
'tog-watchmoves' => "Astasqay p'anqakunata watiqay",
@@ -424,31 +424,21 @@ $messages = array(
'faqpage' => 'Project:Pasaq tapuykuna',
# Vector skin
-'vector-action-addsection' => 'Allwiyta yapay',
-'vector-action-delete' => 'Qulluy',
-'vector-action-move' => 'Astay',
-'vector-action-protect' => 'Amachay',
-'vector-action-undelete' => 'Qullusqata paqarichiy',
-'vector-action-unprotect' => 'Amaña amachaychu',
-'vector-namespace-category' => 'Katiguriya',
-'vector-namespace-help' => "Yanapana p'anqa",
-'vector-namespace-image' => 'Willañiqi',
-'vector-namespace-main' => "P'anqa",
-'vector-namespace-media' => "Midya p'anqa",
-'vector-namespace-mediawiki' => 'Willay',
-'vector-namespace-project' => "Ruraykamay p'anqa",
-'vector-namespace-special' => "Sapaq p'anqa",
-'vector-namespace-talk' => 'Rimanakuy',
-'vector-namespace-template' => 'Plantilla',
-'vector-namespace-user' => "Ruraqpa p'anqan",
-'vector-view-create' => 'Kamariy',
-'vector-view-edit' => "Llamk'apuy",
-'vector-view-history' => 'Wiñay kawsayta qhaway',
-'vector-view-view' => 'Ñawiriy',
-'vector-view-viewsource' => 'Pukyu qillqata qhaway',
-'actions' => 'Ruraykuna',
-'namespaces' => "Suti k'itikuna",
-'variants' => "Ñawra rikch'akuykuna",
+'vector-action-addsection' => 'Allwiyta yapay',
+'vector-action-delete' => 'Qulluy',
+'vector-action-move' => 'Astay',
+'vector-action-protect' => 'Amachay',
+'vector-action-undelete' => 'Qullusqata paqarichiy',
+'vector-action-unprotect' => 'Amaña amachaychu',
+'vector-simplesearch-preference' => 'Maskanapaq kallpachasqa sakumanakunata atichiy (Vector qarallapi)',
+'vector-view-create' => 'Kamariy',
+'vector-view-edit' => "Llamk'apuy",
+'vector-view-history' => 'Wiñay kawsayta qhaway',
+'vector-view-view' => 'Ñawiriy',
+'vector-view-viewsource' => 'Pukyu qillqata qhaway',
+'actions' => 'Ruraykuna',
+'namespaces' => "Suti k'itikuna",
+'variants' => "Ñawra rikch'akuykuna",
'errorpagetitle' => 'Pantasqa',
'returnto' => '$1-man kutimuy.',
@@ -509,6 +499,9 @@ Nisyu ruraqkunam kay p'anqataqa qhawayta munachkan.
Ama hina kaspa, ratullata suyay kay p'anqata manaraq musuqmanta qhawaykachaspa.
$1",
+'pool-timeout' => "Wichq'aypaq suyaspa mit'a llallisqa",
+'pool-queuefull' => "Suyana siq'iqa huntasqañam",
+'pool-errorunknown' => 'Mana riqsisqa pantasqa',
# 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}}manta',
@@ -664,10 +657,11 @@ Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa
'welcomecreation' => '== Allinmi hamusqayki $1! ==
Rakiqunaykiqa kicharisqañam.
Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] kikinchayta.',
-'yourname' => 'Ruraq sutiyki',
+'yourname' => 'Ruraq sutiyki:',
'yourpassword' => 'Yaykuna rimayki',
'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
-'remembermypassword' => "Llamk'apuy tiyayniykunapura yuyaykuway.",
+'remembermypassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy llamk'ay tiyayniypura ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
+'securelogin-stick-https' => "Yaykurquspa HTTPS nisqawan t'inkisqa kakuy",
'yourdomainname' => 'Duminyuykip sutin',
'externaldberror' => 'Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.',
'login' => 'Yaykuy',
@@ -684,6 +678,7 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] kikinch
'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
'gotaccountlink' => 'Rakiqunaykita willaway',
'createaccountmail' => 'chaskipaq',
+'createaccountreason' => 'Kayrayku:',
'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam. Ama hina kaspa, huk ruraqpa sutiykita qillqamuy.',
'loginerror' => "Pantasqa llamk'apuy tiyaypa qallarisqan",
@@ -704,6 +699,7 @@ Allin qillqasqaykita llanchiriy.',
'wrongpasswordempty' => 'Yaykuna rimaykita qillqamuyta qunqarqunkim, huk kutita ruraykachay.',
'passwordtooshort' => 'Yaykuna rimayqa {{PLURAL:$1|1 icha aswan sanampayuq|$1 icha aswan sanampayuq}} kananmi.',
'password-name-match' => 'Yaykuna rimaykiqa ruraqpa sutiykiman mana kaqlla kananmi.',
+'password-login-forbidden' => 'Kay ruraqpa sutinmanqa yaykuna rimanmanpas ama nisqam.',
'mailmypassword' => 'Musuq yaykuna rimata e-chaskiwan kachamuway',
'passwordremindertitle' => "{{SITENAME}}paq musuq mit'alla yaykuna rima",
'passwordremindertext' => 'Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) mañakuwarqan {{SITENAME}}paq musuq yaykuna rimatam e-chaski imamaytaykiman kachayta ($4).
@@ -736,6 +732,9 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
'loginlanguagelabel' => 'Rimay: $1',
'suspicious-userlogout' => "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.",
+# E-mail sending
+'php-mail-error-unknown' => 'Mana riqsisqa pantasqa PHP mail() rurananpi',
+
# Password reset dialog
'resetpass' => 'Ruraqpa yaykuna rimanta hukchay',
'resetpass_announce' => "E-chaskiwan kachasqa mit'alla yaykuna rimawanmi yaykurqunki. Ama hina kaspa, musuq yaykuna rimaykita qillqamuy:",
@@ -786,9 +785,10 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
'showlivepreview' => 'Kawsaqlla qhawariy',
'showdiff' => 'Hukchasqakunata rikuchiy',
'anoneditwarning' => "''Paqtataq:'' Manaraqmi ruraqpa sutiykita qumurqunkichu. IP huchhaykim kay p'anqap hukchay hallch'ayninpi waqaychasqa kanqa.",
+'anonpreviewwarning' => "''Manam ruraqpa sutiykiwan yaykusqa kachkankichu. Imatapas waqaychaptiykiqa, IP huchhaykim hallch'asqa kanqa kay p'anqap llamk'apuy wiñay kawsayninpi.''",
'missingsummary' => "'''Paqtataq:''' Manaraqmi llamk'apusqaykimanta pisichaytachu qillqamurqunki. Musuqmanta «{{int:savearticle}}» nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana pisichay kaptinpas.",
'missingcommenttext' => 'Ama hina kaspa, kay qatiqpi willaspa qillqamuy.',
-'missingcommentheader' => "'''Paqtataq:''' Manaraqmi kay willaypa umallintachu qillqamurqunki. Musuqmanta «waqaychay» nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana willaypa umallin kaptinpas.",
+'missingcommentheader' => "'''Paqtataq:''' Manaraqmi kay willaypa umallintachu qillqamurqunki. Musuqmanta \"{{int:savearticle}}\" nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana willaypa umallin kaptinpas.",
'summary-preview' => 'Pisichayta ñawpaqta qhawarillay:',
'subject-preview' => 'Yachaywata/umallita ñawpaqta qhawarillay:',
'blockedtitle' => "Ruraqqa hark'asqam",
@@ -848,7 +848,11 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
'userjsyoucanpreview' => "'''Kunay:''' \"{{int:showpreview}}\" nisqa ñit'inata llamk'achiy musuq JavaScript nisqata qhawanaykipaq, manaraq waqaychaspa.",
'usercsspreview' => "Yuyariy, qhawarillachkankim ruraqpa CSS-niykita, manaraqmi waqaychasqachu!'''",
'userjspreview' => "'''Yuyariy, qhawarillachkankim ruraqpa JavaScript-niykita, manaraqmi waqaychasqachu!'''",
-'userinvalidcssjstitle' => "'''Paqtataq:''' Manam kanchu \"\$1\" qara. Yuyariy, kikinpa .css, .js p'anqankunaqa uchuy sanampa umalliyuqmi, ahinataq {{ns:user}}:Foo/monobook.css manataq {{ns:user}}:Foo/Monobook.css nisqachu.",
+'sitecsspreview' => "'''Yuyariy, qhawarillachkankim kay CSS-ta.'''
+'''Manaraqmi waqaychasqachu!'''",
+'sitejspreview' => "'''Yuyariy, qhawarillachkankim kay JavaScript qillqata.'''
+'''Manaraqmi waqaychasqachu!'''",
+'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!'''",
@@ -881,8 +885,6 @@ Takyachichkankim: Kayqa ñuqap qillqasqaymi icha qispi pukyumanta iskaychamusqay
'copyrightwarning2' => "Lliw {{SITENAME}}paq llamk'apuykunaqa huk ruraqkunap llamk'apunallanmi, hukchanallanmi icha qullunallanmi. Llamk'asqaykikunata huk runakunap allinchayninta qispilla mast'ariyninta mana munaspaykiqa, ama kayman qillqamuychu.<br />
Takyachichkankim: Kayqa ñuqap qillqasqaymi, ñuqamanmi kapuwan icha qispi pukyumanta iskaychamusqaymi, nispa ($1 p'anqata qhaway).
<br />'''Mana saqillasqa kaspaykiqa, ama qillqarimuychu iskaychay hayñi ''(copyright)'' nisqayuq qillqakunata iskaychamuspa!'''",
-'longpagewarning' => "'''Paqtataq: Kay p'anqaqa $1 kB hatunmi; huk wamp'unakunaqa sasachakunmanchá 32 kB-manta aswan hatun willañiqita llamk'apuspa.
-Ama hina kaspa, hamut'ariy kay p'anqata rakiyta.'''",
'longpageerror' => "'''PANTASQA: Kachasqayki qillqaqa $1 kB hatunmi, $2 kB-manta aswan hatunmi. Manam waqaychasqa kayta atinchu.'''",
'readonlywarning' => "'''PAQTATAQ: Willañiqintinqa hark'asqam mit'awa kakuchinapaq. Chayrayku kunanqa manam atichkankichu llamk'apusqaykikunata waqaychayta.
Qillqasqaykita iskaychaspa antañiqiqniykipi willañiqiman llut'amuspa chaypi waqaychariy. Kunanmanta huk pachallapi musuqmanta waqaychaykachay.'''
@@ -985,7 +987,7 @@ Wikimanta qullusqachá icha astasqachá.
Musuq chaniyuq p'anqakunata [[Special:Search|wikipi maskaykachay]].",
# Revision deletion
-'rev-deleted-comment' => '(qullusqa rimapuy)',
+'rev-deleted-comment' => "(qullusqa llamk'apuna rimapuy)",
'rev-deleted-user' => '(qullusqa ruraqpa sutin)',
'rev-deleted-event' => "(qullusqa hallch'a)",
'rev-deleted-user-contribs' => "[ruraqpa sutinqa icha IP tiyayqa qichusqam - musuqchasqaqa llamk'apusqakunamanta pakasqam]",
@@ -1059,6 +1061,8 @@ $1",
'logdelete-failure' => "'''Manam atinichu hallch'ap rikunalla kayninta churayta:'''
$1",
'revdel-restore' => 'Rikunalla kayta hukchay',
+'revdel-restore-deleted' => 'qullusqa musuqchasqakuna',
+'revdel-restore-visible' => 'rikuna musuqchasqakuna',
'pagehist' => "P'anqap wiñay kawsaynin",
'deletedhist' => 'Qullusqa wiñay kawsay',
'revdelete-content' => 'samiq',
@@ -1126,11 +1130,13 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
# Diffs
'history-title' => '"$1" p\'anqata hukchasqakunap wiñay kawsaynin',
'difference' => '(Hukchasqapura wak kaynin)',
+'difference-multipage' => "(P'anqakunaqa manam kaqllachu)",
'lineno' => "Siq'i $1:",
'compareselectedversions' => "Akllasqa llamk'apusqakunata wakichay",
'showhideselectedversions' => 'Akllasqa musuqchasqakunata rikuchiy/pakay',
'editundo' => 'kutichiy',
-'diff-multi' => "({{PLURAL:$1|Chawpipi huk llamk'apusqaqa manam rikuchisqachu|Chawpipi $1 llamk'apusqaqa manam rikuchisqachu}}.)",
+'diff-multi' => "({{PLURAL:$2|Huk ruraqpa|$2 ruraqpa}} {{PLURAL:$1|chawpipi huk llamk'apusqanqa manam rikuchisqachu|chawpipi $1 llamk'apusqankunaqa manam rikuchisqachu}})",
+'diff-multi-manyusers' => "({{PLURAL:$2|Hukmanta|$2-manta}} aswan ruraqkunap {{PLURAL:$1|chawpipi huk llamk'apusqanqa manam rikuchisqachu|chawpipi $1 llamk'apusqankunaqa manam rikuchisqachu}})",
# Search results
'searchresults' => 'Maskaymanta tarisqakuna',
@@ -1165,6 +1171,7 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
'searchprofile-everything-tooltip' => "Tukuy samiqninpi maskay (rimanakuy p'anqakunapipas)",
'searchprofile-advanced-tooltip' => "Akllasqa suti k'itikunapi maskay",
'search-result-size' => '$1 ({{PLURAL:$2|1 rima|$2 rimakuna}})',
+'search-result-category-size' => '{{PLURAL:$1|1 wankurisqa|$1 wankurisqa}} ({{PLURAL:$2|1 urin katiguriya|$2 urin katiguriya}}, {{PLURAL:$3|1 willañiqi|$3 willañiqi}})',
'search-result-score' => 'Chaniyuq kaynin: $1%',
'search-redirect' => '(pusapuna $1)',
'search-section' => '(raki $1)',
@@ -1219,7 +1226,7 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
'prefs-rc' => 'Ñaqha hukchasqakuna',
'prefs-watchlist' => "Watiqasqa p'anqakuna",
'prefs-watchlist-days' => "Hayk'a p'unchawkunata watiqana sutisuyupi rikuchiy:",
-'prefs-watchlist-days-max' => "(ama qanchismanta aswan p'unchaw kachunchu)",
+'prefs-watchlist-days-max' => "Ama qanchismanta aswan p'unchaw kachunchu",
'prefs-watchlist-edits' => "Hayk'a hukchasqakunata hatunchasqa watiqana sutisuyupi rikuchiy:",
'prefs-watchlist-edits-max' => 'Ama waranqamanta aswan kachunchu',
'prefs-watchlist-token' => 'Watiqay sutisuyu sanancha:',
@@ -1239,6 +1246,7 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
'contextlines' => "Siq'ikuna taripasqaman:",
'contextchars' => "Ukhunpuray sananchakuna siq'iman:",
'stub-threshold' => 'Kay hatun kaykamam <a href="#" class="stub">t\'una qillqasqa t\'inki</a> nisqa kachun (byte):',
+'stub-threshold-disabled' => 'Ama nisqa',
'recentchangesdays' => "Ñaqha hukchasqakunapi rikuchina p'unchawkuna:",
'recentchangesdays-max' => "(ama $1-manta aswan {{PLURAL:$1|p'unchaw|p'unchaw}} kachunchu)",
'recentchangescount' => 'Rikuchina hukchasqakunap yupaynin, kikinmanta:',
@@ -1271,6 +1279,7 @@ Pi kay k'itichapi llawiykita riqsiqpas watiqasqaykikunata ñawiriytam atinqa. Ch
'prefs-files' => 'Willañiqikuna',
'prefs-custom-css' => 'Munakusqa CSS',
'prefs-custom-js' => 'Munakusqa JS',
+'prefs-common-css-js' => 'Tukuy qarakunapaq rakinakusqa CSS/JS:',
'prefs-reset-intro' => "Kay p'anqataqa llamk'achiyta atinki allinkachinaykikunata kikinmanta kasqaman kutichinaykipaq.
Chaytataq manam kutichiyta atinkichu.",
'prefs-emailconfirm-label' => 'E-chaskita takyachiy:',
@@ -1308,9 +1317,15 @@ Huk ruraqkunata ruraqpa p'anqaykimanta icha rimachinaykimanta qamman qillqamusun
'prefs-advancedrendering' => 'Ñawparikusqa akllanakuna',
'prefs-advancedsearchoptions' => 'Ñawparikusqa akllanakuna',
'prefs-advancedwatchlist' => 'Ñawparikusqa akllanakuna',
-'prefs-display' => 'Akllanakunata rikuchiy',
+'prefs-displayrc' => 'Akllanakunata rikuchiy',
+'prefs-displaysearchoptions' => 'Akllanakunata rikuchiy',
+'prefs-displaywatchlist' => 'Akllanakunata rikuchiy',
'prefs-diffs' => 'Wakin kaykuna',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-chaski imamaytaqa allinchá',
+'email-address-validity-invalid' => 'Allin e-chaski imamaytata yaykuchiy',
+
# User rights
'userrights' => 'Ruraqkunata saqillanap allinkachinan',
'userrights-lookup-user' => 'Ruraqkunap huñunkunata allinkachiy',
@@ -1394,6 +1409,7 @@ Huk ruraqkunata ruraqpa p'anqaykimanta icha rimachinaykimanta qamman qillqamusun
'right-hideuser' => "Ruraqpa sutinta hark'ay, sapsimanta pakaspa",
'right-ipblock-exempt' => "IP hark'ayta, kikinmanta hark'ayta, tawqa hark'aytapas pulqaspa pasay",
'right-proxyunbannable' => "Kikinmanta ''proxy'' nisqa sirwiq hark'ayta pulqaspa pasay",
+'right-unblockself' => "Kikinta hark'asqamanta qispikuy",
'right-protect' => "Amachasqa kachkayta hukchay, amachasqa p'anqakunata llamk'apuy",
'right-editprotected' => "Amachasqa p'anqakunata llamk'apuy (mana phaqcha amachasqa)",
'right-editinterface' => "Ruraqpaq uyapurata llamk'apuy",
@@ -1416,7 +1432,6 @@ Huk ruraqkunata ruraqpa p'anqaykimanta icha rimachinaykimanta qamman qillqamusun
'right-siteadmin' => "Willañiqintinta hark'ay, paskaypas",
'right-reset-passwords' => 'Huk ruraqkunap yaykuna rimanta kutichiy',
'right-override-export-depth' => "P'anqakunata hawaman quy, t'inkisqa p'anqakunatapas pichqa ñiqin t'inkipayasqakama",
-'right-versiondetail' => "Mast'arisqa llamp'u kaqpaq musuqchasqamanta willaykunata rikuchiy",
'right-sendemail' => 'Huk ruraqkunaman e-chaskita kachay',
# User rights log
@@ -1467,14 +1482,9 @@ Huk ruraqkunata ruraqpa p'anqaykimanta icha rimachinaykimanta qamman qillqamusun
'recentchanges-legend' => 'Ñaqha hukchasqapaq allinkachinakuna',
'recentchangestext' => "Kay p'anqapiqa aswan qhipaq ñaqha hukchasqakunam.",
'recentchanges-feed-description' => 'Kay mikhuchinapi wikipi qhipaq ñaqha hukchasqakunata qatiy.',
-'recentchanges-label-legend' => "Ch'uyanchana: $1.",
-'recentchanges-legend-newpage' => "$1 - musuq p'anqa",
'recentchanges-label-newpage' => "Kayta llamk'apuptiykim musuq p'anqam tukukurqun",
-'recentchanges-legend-minor' => "$1 - aslla llamk'apuy",
'recentchanges-label-minor' => "Kayqa aslla llamk'apuymi",
-'recentchanges-legend-bot' => "$1 - rurana antachap llamk'apuynin",
'recentchanges-label-bot' => "Kayqa rurana antachap llamk'apusqanmi",
-'recentchanges-legend-unpatrolled' => "$1 - mana patrullasqa llamk'apuy",
'recentchanges-label-unpatrolled' => "Kay llamk'apusqaqa manaraqmi patrullasqachu",
'rcnote' => "Kay qatiqpiqa qhipaq {{PLURAL:$1|'''1''' hukchasqam|'''$1''' hukchasqakunam}} qhipaq {{PLURAL:$2|p'unchawpi|'''$2''' p'unchawkunapi}}, musuqchasqa $5, $4.",
'rcnotefrom' => "Kay qatiqpiqa '''$2'''-mantapacha ('''$1'''-kama) hukchasqakunatam rikunki.",
@@ -1520,6 +1530,9 @@ Huk ruraqkunata ruraqpa p'anqaykimanta icha rimachinaykimanta qamman qillqamusun
'upload_directory_missing' => 'Churkuna willañiqi churanaqa ($1) manam kanchu. Llika sirwiqpas manam atinchu churkuna willañiqi churanata kamariyta.',
'upload_directory_read_only' => "Llika sirwiqqa manam atinchu churkuna hallch'aman ($1) qillqayta.",
'uploaderror' => 'Willañiqita churkunayaptiyki pantasqam tukurqan',
+'upload-recreate-warning' => "'''Paqtataq: Kay sutiyuq willañiqiqa qullusqañam icha sutin hukchasqañam.'''
+
+Kay qatiqpiqa kay p'anqapaq qulluy, astay hallch'akunatam rikunki:",
'uploadtext' => "Willañiqita churkunaykipaqqa kay qatiqpi kaq hunt'ana p'anqata llamk'achiy.
Churkusqaña rikchakunatataq qhawanaykipaq icha maskanaykipaqqa [[Special:FileList|rikchakuna p'anqaman]] riy. Churkusqakunata [[Special:Log/upload|churkuy hallch'apim]], qullusqakunatataq [[Special:Log/delete|qulluy hallch'apim]] rikunki.
@@ -1551,6 +1564,17 @@ Rikchata huk p'anqaman ch'aqtanaykipaqqa kay hunt'ana p'anqapi t'inkita llamk'ac
'filetype-unwanted-type' => "'''\".\$1\"''' nisqaqa manam munasqachu willañiqi laya. Astawan munasqa willañiqi {{PLURAL:\$3|layaqa|layakunaqa}} kaymi: \$2.",
'filetype-banned-type' => "'''\".\$1\"''' nisqaqa manam saqillasqachu willañiqi laya. Saqillasqa willañiqi {{PLURAL:\$3|layaqa|layakunaqa}} kaymi: \$2.",
'filetype-missing' => 'Manam kachkanchu willañiqip k\'askaqnin (".jpg" hina).',
+'empty-file' => "Kachasqayki willañiqiqa ch'usaqmi.",
+'file-too-large' => 'Kachasqayki willañiqiqa nisyu hatunmi.',
+'filename-tooshort' => 'Kay willañiqi sutiqa nisyu pisillam.',
+'filetype-banned' => 'Kay willañiqi layaqa manam saqillasqachu.',
+'verification-error' => 'Kay willañiqiqa willañiqi chaninchaypi manam yallirqanchu.',
+'hookaborted' => "Wakinchaykachasqaykitaqa mast'ari ch'iwinam puchukachirqan.",
+'illegal-filename' => 'Kay willañiqi sutiqa manam saqillasqachu.',
+'overwrite' => 'Kachkaqña willañiqita huknachayqa manam saqillasqachu.',
+'unknown-error' => 'Mana riqsisqa pantasqam.',
+'tmp-create-error' => "Manam atinichu mit'alla willañiqita qillqayta.",
+'tmp-write-error' => "Mit'alla willañiqita qillqaspa pantakurqan.",
'large-file' => 'Kamalliykiku, willañiqikunaqa ama $1-manta aswan hatun kachunchu; kay willañiqiqa $2 hatunmi.',
'largefileserver' => 'Kay willañiqiqa sirwiqpi allinkachisqakama saqillasqa chhikanmanta aswan hatunmi.',
'emptyfile' => "Churkusqayki willañiqiqa ch'usaqmi rikch'akun. Pantasqa sutinchá. Ama hina kaspa, llanchiy, churkuyman munasqayki willañiqichu.",
@@ -1572,13 +1596,14 @@ Kay churkunayki rikcha hunt'a chhikan kayniyuq kaptinqa, chay hunt'atam churkuy,
'fileexists-shared-forbidden' => "Kay sutiyuq willañiqiqa kachkañam rakinakusqa willañiqi qullqapi. Ama hina kaspa, churkuyta munaspaykiraq, ñawpaq p'anqaman kutispa willañiqiykita huk sutiwan churkuy. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Kay willañiqiqa kay qatiq {{PLURAL:$1|willañiqip|willañiqikunap}} iskaychasqanmi:',
'file-deleted-duplicate' => 'Kay hinalla ([[:$1]]) willañiqiña qullusqam karqa. Qhawariy imarayku qullusqa karqa, manaraq musuqmanta churkuykachaspa.',
-'successfulupload' => 'Aypalla churkusqañam',
'uploadwarning' => 'Willañiqi churkuymanta paqtataq niy',
'uploadwarning-text' => 'Ama hina kaspa, kay qatiqpi kaq willañiqimanta willaykunata hukchaspa musuqmanta ruraykachay.',
'savefile' => 'Willañiqita waqaychay',
'uploadedimage' => '«[[$1]]» churkusqa.',
'overwroteimage' => '"[[$1]]" musuqmanta churkusqa',
'uploaddisabled' => 'Willañiqi churkuyman ama nisqa',
+'copyuploaddisabled' => 'URL-pa churkunanqa manam atinchu.',
+'uploadfromurl-queued' => 'Churkunaykiqa suyana sinruman kachasqam.',
'uploaddisabledtext' => 'Willañiqi churkuyqa manam saqillasqachu.',
'php-uploaddisabledtext' => "PHP-wan willañiqi churkuyqa hark'asqam. Ama hina kaspa, willañiqi churkuy allinkachinakunata llanchiy.",
'uploadscripted' => "Kay willañiqiqa wakichi icha HTML qillqayuqmi, llika wamp'unaqa pantalla unanchanmanchá.",
@@ -1597,6 +1622,14 @@ Kay churkunayki rikcha hunt'a chhikan kayniyuq kaptinqa, chay hunt'atam churkuy,
Hamut'arinaykim tiyanman, kay willañiqita musuqmanta churkuyqa allinchu mana allinchu chaylla.
Kay qatiqpiqa willañiqimanta qulluy hallch'atam rikunki:",
'filename-bad-prefix' => "Churkunayasqayki willañiqip sutinqa '''\"\$1\"''' nisqawanmi qallarin. Chay sutinqa iliktruniku rikcha hap'inap kamasqanmanmi rikch'akun. Ama hina kaspa, willañiqiykita astawan t'iktuq sutinta akllay.",
+'upload-success-subj' => 'Aypalla churkusqañam',
+'upload-success-msg' => '[$2]-manta churkusqaykiqa aypasqam. Kaypim tarinalla: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Churkuy sasachakuy',
+'upload-failure-msg' => '[$2] nisqamanta churkuyniykiwanqa sasachakuymi karqan:
+
+$1',
+'upload-warning-subj' => 'Willañiqi churkuymanta paqtataq niy',
+'upload-warning-msg' => "[$2]-manta churkuyniykiwanqa sasachakuymi karqan. [[Special:Upload/stash/$1|Churkunapaq hunt'ana p'anqaman]] kutimuykiman kay sasachakuyta allinchanaykipaq.",
'upload-proto-error' => 'Tantari qillqaqa manam allinchu',
'upload-proto-error-text' => "Huk p'anqamanta willañiqita churkunapaqqa URL tiyaypa <code>http://</code> icha <code>ftp://</code> nisqawan qallarinanmi.",
@@ -1609,22 +1642,23 @@ Kay qatiqpiqa willañiqimanta qulluy hallch'atam rikunki:",
'upload-http-error' => 'HTTP pantasqam tukusqa: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'Manam chayman saqisqachu',
-'img-auth-nopathinfo' => "Manam kanchu PATH_INFO.
+'img-auth-accessdenied' => 'Manam chayman saqisqachu',
+'img-auth-nopathinfo' => "Manam kanchu PATH_INFO.
Sirwiqniykiqa manam churasqachu kaymanta willananpaq.
CGI nisqawanchá tiksichasqa, chayrayku manachá img_auth nisqata q'imiyta atinchu.
Qhaway http://www.mediawiki.org/wiki/Manual:Image_Authorization.",
-'img-auth-notindir' => 'Mañakusqa ñanqa manam churaykusqa churkuna churanapi kachkanchu.',
-'img-auth-badtitle' => 'Manam atinichu "$1" nisqamanta chaniyuq sutita rurayta.',
-'img-auth-nologinnWL' => 'Manam yaykusqa kachkankichu, "$1" nisqataq manam yuraq sutisuyupi kachkanchu.',
-'img-auth-nofile' => '"$1" sutiyuq willañiqiqa manam kanchu.',
-'img-auth-isdir' => '"$1" nisqa churanatam aypaykachachkanki.
+'img-auth-notindir' => 'Mañakusqa ñanqa manam churaykusqa churkuna churanapi kachkanchu.',
+'img-auth-badtitle' => 'Manam atinichu "$1" nisqamanta chaniyuq sutita rurayta.',
+'img-auth-nologinnWL' => 'Manam yaykusqa kachkankichu, "$1" nisqataq manam yuraq sutisuyupi kachkanchu.',
+'img-auth-nofile' => '"$1" sutiyuq willañiqiqa manam kanchu.',
+'img-auth-isdir' => '"$1" nisqa churanatam aypaykachachkanki.
Willañiqilla aypayllam saqillasqa.',
-'img-auth-streaming' => '"$1" nisqata purichispa.',
-'img-auth-public' => 'img_auth.php nisqap rurananqa akuna wikimanta willañiqikunata lluqsichinam.
+'img-auth-streaming' => '"$1" nisqata purichispa.',
+'img-auth-public' => 'img_auth.php nisqap rurananqa akuna wikimanta willañiqikunata lluqsichinam.
Kay wikiqa sapsi wiki hinam churaykusqa.
Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
-'img-auth-noread' => 'Ruraqqa "$1" nisqata ñawiriyta manam saqillasqachu.',
+'img-auth-noread' => 'Ruraqqa "$1" nisqata ñawiriyta manam saqillasqachu.',
+'img-auth-bad-query-string' => 'URL tiyaypa maskana qillqaqa manam allinchu.',
# HTTP errors
'http-invalid-url' => 'URL tiyayqa manam allinchu: $1',
@@ -1656,6 +1690,7 @@ Wachup umanpi ñit'ispaqa allichaytam hukchanki.",
'listfiles_search_for' => 'Rikchap sutinta maskay:',
'imgfile' => 'willañiqi',
'listfiles' => 'Rikchakuna',
+'listfiles_thumb' => 'Uchuylla rikchacha',
'listfiles_date' => "P'unchaw",
'listfiles_name' => 'Suti',
'listfiles_user' => 'Ruraq',
@@ -1768,8 +1803,8 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'statistics-edits' => "P'anqa llamk'apusqakuna {{SITENAME}}-pa paqarisqanmanta",
'statistics-edits-average' => "Kuskanchaku llamk'apusqakuna p'anqaman",
'statistics-views-total' => 'Tukuy qhawasqakuna',
+'statistics-views-total-desc' => "Mana kaq p'anqakunataqa sapaq p'anqakunatapas kaypi manam rikunki",
'statistics-views-peredit' => "Qhawasqakuna llamk'apusqaman",
-'statistics-jobqueue' => "[http://www.mediawiki.org/wiki/Manual:Job_queue Llamk'ana sinru] chhikan",
'statistics-users' => 'Rakiqunayuq [[Special:ListUsers|ruraqkuna]]',
'statistics-users-active' => "Llamk'achkaq ruraqkuna",
'statistics-users-active-desc' => "Ñaqha {{PLURAL:$1|p'unchawpi|$1 p'unchawkunapi}} llamk'apuq ruraqkuna",
@@ -1781,7 +1816,7 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'doubleredirects' => 'Iskaylla pusapunakuna',
'doubleredirectstext' => "Kay p'anqapiqa huk pusapuna p'anqaman pusapuq p'anqakunap sutinkunatam rikunki. Sapa sinrupiqa ñawpaq ñiqin, iskay ñiqinpas pusapunaman t'inkikunam, iskay ñiqin pusapunap taripananpa qallariyninpas, sapsilla \"chiqap\" allin taripana qillqam, maymanchus ñawpaq ñiqin pusapuna p'anqa pusachun.
-<s>Chakapusqa</s> taripasqakunaqa paskasqañam.",
+<del>Chakapusqa</del> taripasqakunaqa paskasqañam.",
'double-redirect-fixed-move' => '[[$1]] nisqaqa astasqam, kunantaq [[$2]] nisqaman pusapunam',
'double-redirect-fixer' => 'Pusapuna allinchaq',
@@ -1804,6 +1839,8 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'nmembers' => '$1 {{PLURAL:$1|qillqa|qillqakuna}}',
'nrevisions' => "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
'nviews' => '$1 {{PLURAL:$1|rikuy|rikuykuna}}',
+'nimagelinks' => "$1 {{PLURAL:$1|p'anqapi|p'anqakunapi}} llamk'achisqa",
+'ntransclusions' => "$1 {{PLURAL:$1|p'anqapi|p'anqakunapi}} llamk'achisqa",
'specialpage-empty' => "Kay p'anqaqa ch'usaqmi.",
'lonelypages' => "Wakcha p'anqakuna",
'lonelypagestext' => "Kay qatiq p'anqakunaqa manam {{SITENAME}}pi ima huk kaq p'anqawanpas t'inkisqachu, manam ch'aqtasqachu ima.",
@@ -1959,34 +1996,40 @@ Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgro
'listgrouprights-removegroup-self-all' => 'Tukuy huñukunatam qichuyta atin kikinpa raqiqunanmanta',
# E-mail user
-'mailnologin' => 'Imamaytataqa ama kachaychu',
-'mailnologintext' => '[[Special:UserLogin|Yaykunaykim]], [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytappas kananmi tiyan huk ruraqkunaman e-chaskita kachanaykipaq.',
-'emailuser' => 'Kay ruraqman e-chaskita kachay',
-'emailpage' => 'E-chaski kay ruraqman:',
-'emailpagetext' => "Kay hunt'ana p'anqatam llamk'achiyta atinki e-chaskita kachanaykipaq.
+'mailnologin' => 'Imamaytataqa ama kachaychu',
+'mailnologintext' => '[[Special:UserLogin|Yaykunaykim]], [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytappas kananmi tiyan huk ruraqkunaman e-chaskita kachanaykipaq.',
+'emailuser' => 'Kay ruraqman e-chaskita kachay',
+'emailpage' => 'E-chaski kay ruraqman:',
+'emailpagetext' => "Kay hunt'ana p'anqatam llamk'achiyta atinki e-chaskita kachanaykipaq.
Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamaytaqa paqarinqa kachasqayki e-chaskipi chaskiqpa kutichisunaykita atinanpaq.",
-'usermailererror' => 'Chaski llikaqa pantasqatam kutichimurqan:',
-'defemailsubject' => "{{SITENAME}} p'anqamanta chaski",
-'noemailtitle' => 'Manam kanchu e-chaski imamayta',
-'noemailtext' => 'Kay ruraqqa manam willawarqanchu chaniyuq imamaytata.',
-'nowikiemailtitle' => 'E-chaskiqa manam saqillasqachu',
-'nowikiemailtext' => 'Kay ruraqqa nirqan, huk ruraqkunamanta ama e-chaskita chaskisaqchu, nispa.',
-'email-legend' => '{{SITENAME}}pi huk ruraqman e-chaskita kachay',
-'emailfrom' => 'Kachaq:',
-'emailto' => 'Chaskiq:',
-'emailsubject' => 'Yuyancha:',
-'emailmessage' => 'Willay:',
-'emailsend' => 'Kachay',
-'emailccme' => 'Willaypa iskaychasqanta kacharimuway.',
-'emailccsubject' => 'Willaypa iskaychasqan $1: $2-man',
-'emailsent' => 'Chaskiqa kachasqañam',
-'emailsenttext' => 'Chaskiykiqa kachasqañam.',
-'emailuserfooter' => 'Kay e-chaskitaqa $1 sutiyuqmi kacharqan $2 sutiyuqman "e-chaski kachay" nisqapaq ruranawan kay tiyaypi: {{SITENAME}}.',
+'usermailererror' => 'Chaski llikaqa pantasqatam kutichimurqan:',
+'defemailsubject' => "{{SITENAME}} p'anqamanta chaski",
+'usermaildisabled' => "Ruraqpa e-chaskinqa hark'asqam",
+'usermaildisabledtext' => 'Manam atinkichu kay wikipi huk ruraqkunaman e-chaskita kachayta.',
+'noemailtitle' => 'Manam kanchu e-chaski imamayta',
+'noemailtext' => 'Kay ruraqqa manam willawarqanchu chaniyuq imamaytata.',
+'nowikiemailtitle' => 'E-chaskiqa manam saqillasqachu',
+'nowikiemailtext' => 'Kay ruraqqa nirqan, huk ruraqkunamanta ama e-chaskita chaskisaqchu, nispa.',
+'email-legend' => '{{SITENAME}}pi huk ruraqman e-chaskita kachay',
+'emailfrom' => 'Kachaq:',
+'emailto' => 'Chaskiq:',
+'emailsubject' => 'Yuyancha:',
+'emailmessage' => 'Willay:',
+'emailsend' => 'Kachay',
+'emailccme' => 'Willaypa iskaychasqanta kacharimuway.',
+'emailccsubject' => 'Willaypa iskaychasqan $1: $2-man',
+'emailsent' => 'Chaskiqa kachasqañam',
+'emailsenttext' => 'Chaskiykiqa kachasqañam.',
+'emailuserfooter' => 'Kay e-chaskitaqa $1 sutiyuqmi kacharqan $2 sutiyuqman "e-chaski kachay" nisqapaq ruranawan kay tiyaypi: {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Llika willayta kachaspa.',
+'usermessage-editor' => 'Llika willay kachaq',
# Watchlist
'watchlist' => "Watiqasqa p'anqakuna",
'mywatchlist' => 'Watiqasqaykuna',
-'watchlistfor' => "('''$1'''-paq)",
+'watchlistfor2' => '$1-paq $2',
'nowatchlist' => 'Manam watiqasqakunachu kachkan.',
'watchlistanontext' => 'Ama hina kaspa, $1 watiqana sutisuyuykipi imakunatapas qhawanaykipaq icha hukchanaykipaq.',
'watchnologin' => 'Manam yaykurqankichu',
@@ -2044,6 +2087,9 @@ Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk hukchasqakunamanta wil
Tukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan
--
+E-chaski willaykuy allinkachinakunata hukchanaykipaqqa kay p\'anqatam qhaway:
+{{fullurl:{{#special:Preferences}}}}
+
Watiqana sutisuyuykipaq allinkachinakunata hukchanaykipaqqa kay p\'anqatam qhaway:
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2099,7 +2145,10 @@ Qhipaq kaq llamk'apusqaqa [[User:$3|$3]]-pa ([[User talk:$3|rimanakuy]]{{int:pip
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|rimachina]]) sutiyuq ruraqpa hukchasqankunaqa kutichisqam [[User:$1|$1]]-pa ñawpaq hukchasqanman',
'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam [[User:$1|$1]]-pa ñawpaq llamk'apusqanta paqarichispa",
'rollback-success' => "$1-pa hukchasqankunaqa kutichisqañam $2-pa ñawpaq llamk'apusqanta paqarichispa.",
-'sessionfailure' => "Lamk'apuy tiyayniykiwanqa sasachakuymi rikch'akun;
+
+# Edit tokens
+'sessionfailure-title' => "Llamk'ay tiyay pantasqa",
+'sessionfailure' => "Lamk'apuy tiyayniykiwanqa sasachakuymi rikch'akun;
kay rurayqa t'ipisqam karqan millay runap llullaspa yaykunanta hark'anapaq.
Ama hina kaspa, llika wamp'unaykipi \"Ñawpaqman\" (\"Back\") ñit'ispa ñawpaq p'anqata musuqmanta chaqnamuspa huk kutita yaykuykachay.",
@@ -2225,18 +2274,22 @@ $1',
'month' => 'Kay killamanta (ñawpaqmantapas):',
'year' => 'Kay watamanta (ñawpaqmantapas):',
-'sp-contributions-newbies' => "Musuq ruraqkunallap llamk'apusqankunata rikuchiy",
-'sp-contributions-newbies-sub' => 'Musuqkunapaq',
-'sp-contributions-newbies-title' => "Musuq ruraqkunap llamk'apusqankuna",
-'sp-contributions-blocklog' => "Hark'ay hallch'asqakuna",
-'sp-contributions-deleted' => 'qullusqa ruraqpa hukchasqankuna',
-'sp-contributions-logs' => "hallch'akuna",
-'sp-contributions-talk' => 'rimanakuy',
-'sp-contributions-userrights' => 'ruraqkunata saqillanap allinkachinan',
-'sp-contributions-blocked-notice' => "Kay ruraqqa hark'asqam kachkan. Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
-'sp-contributions-search' => "Llamk'apusqakunata maskay",
-'sp-contributions-username' => 'IP huchha icha ruraqpa sutin:',
-'sp-contributions-submit' => 'Maskay',
+'sp-contributions-newbies' => "Musuq ruraqkunallap llamk'apusqankunata rikuchiy",
+'sp-contributions-newbies-sub' => 'Musuqkunapaq',
+'sp-contributions-newbies-title' => "Musuq ruraqkunap llamk'apusqankuna",
+'sp-contributions-blocklog' => "Hark'ay hallch'asqakuna",
+'sp-contributions-deleted' => 'qullusqa ruraqpa hukchasqankuna',
+'sp-contributions-uploads' => 'churkuykuna',
+'sp-contributions-logs' => "hallch'akuna",
+'sp-contributions-talk' => 'rimanakuy',
+'sp-contributions-userrights' => 'ruraqkunata saqillanap allinkachinan',
+'sp-contributions-blocked-notice' => "Kay ruraqqa hark'asqam kachkan. Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
+'sp-contributions-blocked-notice-anon' => "Kay IP tiyayqa hark'asqam kachkan.
+Qhipaq hark'ay hallch'a yaykuchisqatam kay qatiqpi rikunki:",
+'sp-contributions-search' => "Llamk'apusqakunata maskay",
+'sp-contributions-username' => 'IP huchha icha ruraqpa sutin:',
+'sp-contributions-toponly' => 'Pata musuqchasqakunallata rikuchiy',
+'sp-contributions-submit' => 'Maskay',
# What links here
'whatlinkshere' => "Kayman t'inkimuq",
@@ -2296,7 +2349,6 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
'ipb-edit-dropdown' => "Hark'aypa hamunta llamk'apuy",
'ipb-unblock-addr' => "Hark'asqa $1-ta qispichiy",
'ipb-unblock' => "Hark'asqa ruraqta icha IP huchhata qispichiy",
-'ipb-blocklist-addr' => "Kachkaq hark'asqakuna, $1-paq",
'ipb-blocklist' => "Kachkaq hark'asqakunata qhaway",
'ipb-blocklist-contribs' => "$1-paq llamk'apusqakuna",
'unblockip' => "Hark'asqa ruraqta qispichiy",
@@ -2304,7 +2356,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
'ipusubmit' => "Kay hark'asqata qispichiy",
'unblocked' => "Hark'asqa [[User:$1|$1]] qispisqañam",
'unblocked-id' => "Hark'asqa $1-qa qispisqañam",
-'ipblocklist' => "Hark'asqa ruraqkuna IP tiyaykunapas",
+'ipblocklist' => "Hark'asqa ruraqkuna",
'ipblocklist-legend' => "Hark'asqa ruraqta tariy",
'ipblocklist-username' => 'Ruraqpa sutin icha IP huchha:',
'ipblocklist-sh-userblocks' => "$1 rakiquna hark'asqakuna",
@@ -2363,6 +2415,8 @@ $1 sutiyuqqa hark'asqañam. Allinchanakunata hukchayta munankichu?",
'sorbs_create_account_reason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam. Manam atinkichu rakiqunata kichayta',
'cant-block-while-blocked' => "Kikiyki hark'asqa kaspaykiqa, manam huk ruraqkunata hark'ayta atinkichu.",
'cant-see-hidden-user' => "Hark'aykachasqayki ruraqqa pipapas hark'asqanñam pakasqanñapas. Ruraqta pakay hayñiyuq mana kaspaykim, manam atinkichu ruraqpaq hark'ay hallch'asqata rikuyta icha hukchasqayta.",
+'ipbblocked' => "Kikiyki hark'asqa kaspaykim, manam hukkunata hark'ayta icha hark'asqa kaymanta qispichiyta atinkichu",
+'ipbnounblockself' => "Kikiykitaqa manam hark'asqa kaymanta qispikuyta atinkichu",
# Developer tools
'lockdb' => "Willañiqintinta hark'ay",
@@ -2395,6 +2449,17 @@ Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataq huk mawk
<b>PAQTATAQ!</b>
Kay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;
ama hina kaspa, yuyarillay imachus kay astanaykita saqispa tukunata atinman.",
+'movepagetext-noredirectfixer' => "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas musuq sutiman astasqa kanqa.
+Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa.
+Paqtataq [[Special:DoubleRedirects|iskaylla]] icha [[Special:BrokenRedirects|p'akisqa]] pusapuna p'anqakunata allinchallay.
+Ama panta t'inkimuqkunata saqiychu. Qammi chay t'inkikunap allin taripananmanta paqtachiq.
+
+Nisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu.
+Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataq huk mawk'a kachkaqña p'anqamanchu.
+
+'''Paqtataq!'''
+Kay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;
+ama hina kaspa, yuyarillay imachus kay astanaykita saqispa tukunata atinman.",
'movepagetalktext' => "P'anqaman kapuq rimachina p'anqaqa - kachkaspaqa - kikinmanta astasqam kanqa. '''Manallam astasqachu kanqa,'''
*p'anqa huk suti huñumanta huk suti huñuman astasqa kachkaptinqa;
*huk wiñay kawsasqayuq musuq sutiyuq rimachina p'anqa kachkaptinqa;
@@ -2450,6 +2515,7 @@ Tukuna p\'anqaqa ("[[:$1]]") kachkañam. Astanapaq qulluyta munankichu?',
'immobile-source-page' => "Kay p'anqaqa manam astanallachu.",
'immobile-target-page' => 'Manam atinichu chay taripana sutiman astayta.',
'imagenocrossnamespace' => "Manam atinichu p'anqata astayta mana willañiqipaq suti k'itiman",
+'nonfile-cannot-move-to-file' => "Manam atinichu mana willañiqi kaqta astayta willañiqipaq suti k'itiman",
'imagetypemismatch' => "Willañiqip musuq mast'arinanqa kay layapaq manam allinchu",
'imageinvalidfilename' => 'Taripana willañiqip sutinqa manam allinchu',
'fix-double-redirects' => 'Qallariy sutiman astamuq tukuy pusapunakunata musuqchay',
@@ -2528,6 +2594,7 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'importstart' => "P'anqakunatam hawamanta chaskichkani...",
'import-revision-count' => "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
'importnopages' => "Manam kanchu hawamanta chaskina p'anqakuna.",
+'imported-log-entries' => "$1 {{PLURAL:$1|hallch'a yaykuchisqa|hallch'a yaykuchisqa}} hawamanta chaskisqam.",
'importfailed' => 'Manam atinichu hawamanta chaskiy: $1',
'importunknownsource' => 'Hawamanta chaskina pukyu layaqa manam riqsisqachu',
'importcantopen' => 'Manam atinichu kay willañiqita hawamanta chaskiyta',
@@ -2620,6 +2687,8 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'tooltip-upload' => 'Churkuyta qallariy',
'tooltip-rollback' => "\"Kutichina\" nisqapi ñit'ispaykiqa huk ruraqpa tukuy qhipaq llamk'apusqankunatam huklla ñit'iyniykiwan kutichinki.",
'tooltip-undo' => "\"Kutichiy\" nisqapi ñit'ispaykiqa kay llamk'apusqatam kutichinki, p'anqata ñawpaqta qhawaspa llamk'anapaq kichaspa. Pisichaypi imarayku niyta atinki.",
+'tooltip-preferences-save' => 'Akllasqakunata waqaychay',
+'tooltip-summary' => 'Pisichaychata yaykuchiy',
# Stylesheets
'common.css' => "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
@@ -2737,14 +2806,17 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
'imagemaxsize' => "Rikchap chhikan kayninta kaykama saywachay:<br />''(willañiqi ch'uyanchana p'anqakunapaq)''",
'thumbsize' => "Ch'iñicha rikchachap chhikan kaynin:",
'widthheightpage' => "$1×$2, $3 {{PLURAL:$3|p'anqa|p'anqakuna}}",
-'file-info' => '(willañiqip chhikan kaynin: $1; MIME laya: $2)',
-'file-info-size' => '($1 × $2 iñu; willañiqip chhikan kaynin: $3; MIME laya: $4)',
+'file-info' => 'willañiqip chhikan kaynin: $1; MIME laya: $2',
+'file-info-size' => '$1 × $2 iñu; willañiqip chhikan kaynin: $3; MIME laya: $4',
'file-nohires' => '<small>Manam kanchu aswan huyakuyuq rikcha.</small>',
-'svg-long-desc' => '(SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3)',
+'svg-long-desc' => 'SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
'show-big-image' => 'Qallariy huyaku',
'show-big-image-thumb' => '<small>Kay ñawpaq qhawariypa chhikan kaynin: $1 × $2 iñu</small>',
'file-info-gif-looped' => 'muyupayachisqa',
'file-info-gif-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
+'file-info-png-looped' => 'muyupayachisqa',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|kuti|kuti}} pukllasqa',
+'file-info-png-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
# Special:NewFiles
'newimages' => 'Musuq rikchakunap suyu-suyun',
@@ -2814,8 +2886,8 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
'exif-colorspace' => 'Llimphi suyu',
'exif-componentsconfiguration' => "Sapa ñawpariqninpa sut'in",
'exif-compressedbitsperpixel' => "Rikchap mat'isqa kaynin laya",
-'exif-pixelydimension' => 'Rikchap chaniyuq suni kaynin',
-'exif-pixelxdimension' => 'Rikchap chaniyuq hanaq kaynin',
+'exif-pixelydimension' => 'Rikchap suni kaynin',
+'exif-pixelxdimension' => 'Rikchap hanaq kaynin',
'exif-makernote' => 'Ruraqpa willasqankuna',
'exif-usercomment' => "Llamk'achiqpa willayninkuna",
'exif-relatedsoundfile' => 'Ninachiq ruqyay willañiqi',
@@ -2831,9 +2903,9 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
'exif-spectralsensitivity' => 'Ispiktru musyaykuy',
'exif-isospeedratings' => 'ISO utqay chayninchay',
'exif-oecf' => "Achkiy antañiqichana t'ikrana mink'aqi",
-'exif-shutterspeedvalue' => "Wichq'aqpa utqaynin",
-'exif-aperturevalue' => "Illa k'ichkina",
-'exif-brightnessvalue' => "K'anchay",
+'exif-shutterspeedvalue' => "APEX wichq'aqpa utqaynin",
+'exif-aperturevalue' => "APEX illa k'ichkina",
+'exif-brightnessvalue' => "APEX k'anchay",
'exif-exposurebiasvalue' => 'Churapay pantapayay',
'exif-maxaperturevalue' => "Illa k'ichkinap lliwmanta aswan chanin",
'exif-subjectdistance' => 'Rikchachasqamanta karu kaynin',
@@ -2897,6 +2969,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
'exif-gpsareainformation' => 'GPS suyu suti',
'exif-gpsdatestamp' => "GPS p'unchaw",
'exif-gpsdifferential' => 'GPS karuncha allinchay',
+'exif-objectname' => 'Uchuy suti',
# EXIF attributes
'exif-compression-1' => "Mana mat'isqa",
@@ -2978,6 +3051,8 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
'exif-sensingmethod-7' => "Kimsantin siq'i musyachiq",
'exif-sensingmethod-8' => "Qatiqlla siq'i llimphi musyachiq",
+'exif-filesource-3' => "Ruk'aqta sayaq rikch'a hap'ina",
+
'exif-scenetype-1' => "Chiqalla hap'isqa rikcha",
'exif-customrendered-0' => 'Sapsi ruraykuy',
@@ -3054,25 +3129,25 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
'limitall' => 'tukuy',
# E-mail address confirmation
-'confirmemail' => 'E-chaski imamaytaykita takyachiy',
-'confirmemail_noemail' => 'Manaraq [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytayki kachkanchu.',
-'confirmemail_text' => "{{SITENAME}}piqa e-chaski imamaytaykita takyachinaykim tiyan e-chaskita llamk'achinaykipaq. Urapi butunta ñit'ipay e-chaski imamaytaykiman takyachina chaskita kachamunaykupaq.
+'confirmemail' => 'E-chaski imamaytaykita takyachiy',
+'confirmemail_noemail' => 'Manaraq [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytayki kachkanchu.',
+'confirmemail_text' => "{{SITENAME}}piqa e-chaski imamaytaykita takyachinaykim tiyan e-chaskita llamk'achinaykipaq. Urapi butunta ñit'ipay e-chaski imamaytaykiman takyachina chaskita kachamunaykupaq.
Chay takyachina chaskiqa tuyru t'inkiyuqmi kanqa. Chay tuyru t'inkita qatiy e-chaski imamaytaykip chaniyuq kayninta takyachinaykipaq.",
-'confirmemail_pending' => 'Takyachina tuyruqa e-chaski imamaytaykiman kachasqañam; rakiqunaykita ñaqha kichariptiykiqa, huk minutukunata suyanaykichá chayamusunaykipaq, manaraq musuq tuyruta mañakuspayki.',
-'confirmemail_send' => 'Takyachina tuyruta kachamuway',
-'confirmemail_sent' => 'Takyachina chaskiqa kachasqañam.',
-'confirmemail_oncreate' => "Takyachina chaskiqa e-chaski imamaytaykiman kachamusqam. Yaykunaykipaqqa qatinayki manam tiyanchu, ichataq kay wikipi e-chaski ruranakunata llamk'achinaykipaq tiyanmi.",
-'confirmemail_sendfailed' => '{{SITENAME}} manam atinchu takyachina e-chaskita kachayta. Ama hina kaspa, imamaytaykita mana saqillasqa sananchakunakama llanchiy.
+'confirmemail_pending' => 'Takyachina tuyruqa e-chaski imamaytaykiman kachasqañam; rakiqunaykita ñaqha kichariptiykiqa, huk minutukunata suyanaykichá chayamusunaykipaq, manaraq musuq tuyruta mañakuspayki.',
+'confirmemail_send' => 'Takyachina tuyruta kachamuway',
+'confirmemail_sent' => 'Takyachina chaskiqa kachasqañam.',
+'confirmemail_oncreate' => "Takyachina chaskiqa e-chaski imamaytaykiman kachamusqam. Yaykunaykipaqqa qatinayki manam tiyanchu, ichataq kay wikipi e-chaski ruranakunata llamk'achinaykipaq tiyanmi.",
+'confirmemail_sendfailed' => '{{SITENAME}} manam atinchu takyachina e-chaskita kachayta. Ama hina kaspa, imamaytaykita mana saqillasqa sananchakunakama llanchiy.
Kutichisqa chaski: $1',
-'confirmemail_invalid' => "Takyachina tuyruqa manam allinchu, mawk'ayasqañachá.",
-'confirmemail_needlogin' => '$1-llawanmi e-chaski imamaytaykita takyachiyta atinki.',
-'confirmemail_success' => 'E-chaski imamaytaykiqa takyachisqañam.
+'confirmemail_invalid' => "Takyachina tuyruqa manam allinchu, mawk'ayasqañachá.",
+'confirmemail_needlogin' => '$1-llawanmi e-chaski imamaytaykita takyachiyta atinki.',
+'confirmemail_success' => 'E-chaski imamaytaykiqa takyachisqañam.
Kunanqa wikiman [[Special:UserLogin|yaykamuspayki]] ayniytam atinki.',
-'confirmemail_loggedin' => 'E-chaski imamaytaykiqa takyachisqañam.',
-'confirmemail_error' => 'Ima pantasqapas tukurqan takyachinaykita waqaychaypi.',
-'confirmemail_subject' => '{{SITENAME}} e-chaski imamayta takyachina',
-'confirmemail_body' => 'Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) kicharirqan {{SITENAME}}paq "$2" sutiyuq rakiqunatam, kay e-chaski imamaytayuq.
+'confirmemail_loggedin' => 'E-chaski imamaytaykiqa takyachisqañam.',
+'confirmemail_error' => 'Ima pantasqapas tukurqan takyachinaykita waqaychaypi.',
+'confirmemail_subject' => '{{SITENAME}} e-chaski imamayta takyachina',
+'confirmemail_body' => 'Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) kicharirqan {{SITENAME}}paq "$2" sutiyuq rakiqunatam, kay e-chaski imamaytayuq.
Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita takyachinaykipaq:
@@ -3083,8 +3158,31 @@ Rakiquna *mana* qamman kapuptinqa, kay t\'inkita qatiy takyachinaman ama ninayki
$5
Kay takyachina tuyruqa $4 pachapim puchukanqa.',
-'confirmemail_invalidated' => 'E-chaski imamayta takyachinaman ama nisqam',
-'invalidateemail' => 'E-chaski takyachinaman ama niy',
+'confirmemail_body_changed' => 'Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) hukcharqan {{SITENAME}}pi "$2" sutiyuq rakiqunapaq e-chaski imamaytatam kay imamaytaman.
+
+Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita musuqmanta takyachinaykipaq:
+
+$3
+
+Rakiquna *mana* qamman kapuptinqa, kay t\'inkita qatiy takyachinaman ama ninaykipaq:
+
+$5
+
+Kay takyachina tuyruqa $4 pachapim puchukanqa.',
+'confirmemail_body_set' => 'Pipas, qamchiki, $1 IP huchhayuq tiyaymanta,
+hukcharqan {{SITENAME}}pi "$2" sutiyuq rakiqunapaq e-chaski imamaytatam kay imamaytaman.
+
+Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita musuqmanta takyachinaykipaq:
+
+$3
+
+Rakiquna *mana* qamman kapuptinqa, kay t\'inkita qatiy takyachinaman ama ninaykipaq:
+
+$5
+
+Kay takyachina tuyruqa $4 pachapim puchukanqa.',
+'confirmemail_invalidated' => 'E-chaski imamayta takyachinaman ama nisqam',
+'invalidateemail' => 'E-chaski takyachinaman ama niy',
# Scary transclusion
'scarytranscludedisabled' => "[Interwiki ch'aqtayman ama nisqa]",
@@ -3124,6 +3222,7 @@ Ama hina kaspa, chiqapta kay p'anqatam musuqmanta kamayta munani nispa takyachiy
'table_pager_first' => "Ñawpaq ñiqin p'anqa",
'table_pager_last' => "Qhipaq ñiqin p'anqa",
'table_pager_limit' => "$1 kaqkunata p'anqaman rikuchiy",
+'table_pager_limit_label' => "Huk p'anqapi hayk'a qallawakuna:",
'table_pager_limit_submit' => 'Riy',
'table_pager_empty' => 'Manam ima taripasqapas kanchu',
@@ -3177,6 +3276,7 @@ Sapsilla ñawpaq qhawariyta tukuykachay.',
'version-specialpages' => "Sapaq p'anqakuna",
'version-parserhooks' => "T'ikrana ch'iwinakuna",
'version-variables' => 'Hukchakuqkuna',
+'version-skins' => 'Qarakuna',
'version-other' => 'Wakin',
'version-mediahandlers' => "Midya llamk'apuq",
'version-hooks' => "Ch'iwinakuna",
@@ -3188,6 +3288,13 @@ Sapsilla ñawpaq qhawariyta tukuykachay.',
'version-hook-subscribedby' => 'Kay runap mañaykusqan:',
'version-version' => '(Musuqchasqa $1)',
'version-license' => 'Saqillay',
+'version-poweredby-credits' => "Kay wikitaqa '''[http://www.mediawiki.org/ MediaWiki-m]''' atichin, copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'hukkuna',
+'version-license-info' => "MediaWiki llamp'u kaqqa qispim; mast'ariytam icha wakinchaytam atinki GNU General Public License nisqa saqillaypa kamachisqankama, Free Software Foundation nisqap uyaychasqan; saqillaypa iskay ñiqin musuqchasqan, munaspaykiqa aswan musuq musuqchasqan.
+
+MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIYKUCHU; manapas ch'aqtasqa RURANALLA FIYAKUYTACHU manapas ima SAPAQ TUKUYNINPAQCHU. GNU General Public License nisqa saqillayta qhaway aswan yuyaykunapaq.
+
+[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License nisqa saqillaymanta iskaychasqata] chaskiykiman kay wakichinawan; manaqa, kayman qillqamuwayku: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA icha [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html internet llikapi ñawiriy].",
'version-software' => "Tiyachisqa llamp'u kaq",
'version-software-product' => 'Ruruchisqa',
'version-software-version' => 'Musuqchasqa',
@@ -3258,6 +3365,15 @@ Mana “{{ns:file}}:†k'askaqniyuq willañiqip sutinta yaykuchiy.",
'tags-edit' => "llamk'apuy",
'tags-hitcount' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}}',
+# Special:ComparePages
+'comparepages' => "P'anqakunata wakichay",
+'compare-selector' => 'Musuqchasqakunata wakichay',
+'compare-page1' => "P'anqa 1",
+'compare-page2' => "P'anqa 2",
+'compare-rev1' => 'Musuqchasqa 1',
+'compare-rev2' => 'Musuqchasqa 2',
+'compare-submit' => 'Wakichay',
+
# Database error messages
'dberr-header' => 'Kay wikiqa sasachakuyniyuqmi',
'dberr-problems' => 'Achachaw! Kay tiyayqa allwiya sasachakuykunayuqmi kachkan.',
@@ -3274,8 +3390,13 @@ Mana “{{ns:file}}:†k'askaqniyuq willañiqip sutinta yaykuchiy.",
'htmlform-float-invalid' => 'Qusqayki chaniqa manam yupaychu.',
'htmlform-int-toolow' => 'Sapaqchasqayki chaniqa pisi saywa kaq $1-manta aswan pisim.',
'htmlform-int-toohigh' => 'Sapaqchasqayki chaniqa achka saywa kaq $1-manta aswan achkam.',
+'htmlform-required' => 'Kay chaniqa muchusqam',
'htmlform-submit' => 'Kachay',
'htmlform-reset' => 'Hukchasqakunata kutichiy',
'htmlform-selectorother-other' => 'Wakin',
+# SQLite database support
+'sqlite-has-fts' => "$1 hunt'a qillqa maskana yanapawan",
+'sqlite-no-fts' => "$1 mana hunt'a qillqa maskana yanapawan",
+
);
diff --git a/languages/messages/MessagesRgn.php b/languages/messages/MessagesRgn.php
index 6ede0d6c..eef081ec 100644
--- a/languages/messages/MessagesRgn.php
+++ b/languages/messages/MessagesRgn.php
@@ -29,7 +29,7 @@ $messages = array(
'tog-editsection' => "S't'vù l'abilitaziòn ad'cambié al seziòn cum e' link [mudèfica]",
'tog-editsectiononrightclick' => "S't'vù l'abilitaziòn ad cambié al seziòn <br />scjazénd e tast a dèstra sora e titul (u j vò JavaScript)",
'tog-showtoc' => "Fam avdé l'indiz (sol par al pàgin cun piò d'3 seziòn)",
-'tog-rememberpassword' => "Arcurdam la parola d'ordin, par piasé",
+'tog-rememberpassword' => "Arcurdam la parola d'ordin, par piasé (fèn a un masum $1 {{PLURAL:$1|dè|dè}})",
'tog-watchcreations' => "Mett insèn al pàgin ch't'e' fat adès, intla lèsta da tní sot'occ",
'tog-watchdefault' => "Mett insèn al pàgin ch'a j ò lavurè sora int la lèsta dal pàgin da tnì sot'òcc",
'tog-watchmoves' => "Mett insèn al pàgin ch'a j ò spustè int la lèsta dal pàgin da tnì sot'òcc",
@@ -263,7 +263,7 @@ Par piasé, fa raport a un [[Special:ListUsers/sysop|aministrador]] cun la nota
# Login and logout pages
'yourname' => 'Soranòm:',
'yourpassword' => 'Paróla segreta:',
-'remembermypassword' => "Regèstra la mi parola d'ordin sora ste computer",
+'remembermypassword' => "Regèstra la mi parola d'ordin sora ste computer (for a maximum of $1 {{PLURAL:$1|day|days}})",
'login' => 'Va dentar',
'nav-login-createaccount' => 'Va dentar / Èla la prèma volta?',
'userlogin' => 'Vèn dentar/A sit nov?',
@@ -492,7 +492,6 @@ $1 {{PLURAL:$1|elemént|elemént}}',
# Watchlist
'watchlist' => "Pàgin ch'a ten d'öcc",
'mywatchlist' => "Pàgin ch'a ten d'öcc",
-'watchlistfor' => "(da '''$1''')",
'addedwatch' => "Mett insem a la lèsta d'pàgin sot öcc",
'addedwatchtext' => "La pàgina \"[[:\$1]]\" adès l'è int la lèsta dal [[Special:Watchlist|pàgin da tnì d'öcc]]. D'ôra inenz t'pù avdé tòt al mudèfic a sta pàgina e a la pàgina d'cunversaziòn int la [[Special:RecentChanges|lèsta d'j cambiamént rezent]], in '''gros''', acsè j 's'pò guardè mej.
Se in un sgond temp t'vu cavé la pàgina dala lèsta da tnì d'öcc, s-cjaza un'ètra volta sora e' butòn \"ten d'öcc\".",
@@ -703,9 +702,9 @@ Par piasé, met insem al du pàgin te, fasend copia e incola.",
'nextdiff' => 'Mudèfica piò nova →',
# Media information
-'file-info-size' => "($1 × $2 pixel, amsùra d'e' file: $3, tipo MIME: $4)",
+'file-info-size' => "$1 × $2 pixel, amsùra d'e' file: $3, tipo MIME: $4",
'file-nohires' => "<small>U n' è pusèbil d'avdé cun òna risoluziòn piò élta. </small>",
-'svg-long-desc' => "(file d'taja SVG, dimensiòn numinèli $1 × $2 pixel, dimensiòn d'e' file: $3)",
+'svg-long-desc' => "file d'taja SVG, dimensiòn numinèli $1 × $2 pixel, dimensiòn d'e' file: $3",
'show-big-image' => 'Versiòn ad amsura pina',
'show-big-image-thumb' => "<small>Amsùra d'sta versiòn: $1 × $2 pixel</small>",
diff --git a/languages/messages/MessagesRif.php b/languages/messages/MessagesRif.php
index 71decd06..77370423 100644
--- a/languages/messages/MessagesRif.php
+++ b/languages/messages/MessagesRif.php
@@ -78,10 +78,6 @@ $messages = array(
'qbedit' => 'Ẓṛeg',
'qbspecialpages' => 'Tudmawin Special',
-# Vector skin
-'vector-namespace-main' => 'Tasna',
-'vector-namespace-mediawiki' => 'Tabrat',
-
'errorpagetitle' => 'Anezri',
'returnto' => 'Dwl ghar $1.',
'tagline' => 'Zi {{SITENAME}}',
@@ -168,7 +164,7 @@ teqqad ad yilli days ca n usekkil war itwagg deg isem .',
# Login and logout pages
'yourname' => 'Izwl-usqdac:',
'yourpassword' => 'Tawalt n wadaf:',
-'remembermypassword' => 'ejj (login) inu deg uselkim a',
+'remembermypassword' => 'ejj (login) inu deg uselkim a (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Adf',
'nav-login-createaccount' => 'Adef / egg amiá¸an',
'loginprompt' => "itxessa ad-teṭfed (''cookies'') bac ad tadfed ɣar {{SITENAME}}.",
@@ -270,9 +266,6 @@ mala war texsed tirra inac ad twaẓṛegent , ad twamsebá¸ant .
Ur ten-teg ca da.<br />
tjadjid-anÉ£ Æawt ila qa d cekk ig yuran manaya, niÉ£ tesneÉ£let-id zi ca n uÉ£bal nniá¸n d alelli.
'''UR SADDAF CA TIRRA ƔARSENT COPYRIGHTE BLA MA AD-IXES BAB-INES !'''",
-'longpagewarning' => "'''WARNING: Tasna ya dag-s $1 kilobyte ;
-ca n imsuṭṭuyen(browsers) war zemren ca ad ẓṛegen tasniwin dag-sent 32 kb niɣ ktar.
-ixessa ad ten tebá¸id É£ar tigezmin(sections) d timeẓyanin.'''",
'templatesused' => 'Timudmiwin itwaggen di Tasna ya:',
'templatesusedpreview' => 'Timudmiwin igg itwasxdemen dg uzar-ascan a :',
'template-protected' => '(twaḥá¸a)',
@@ -512,7 +505,6 @@ Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
# Watchlist
'watchlist' => 'Tabdart uḥṭṭu inu',
'mywatchlist' => 'Tabdart uḥṭṭu inu',
-'watchlistfor' => "(i '''$1''')",
'addedwatch' => 'Temmarni ɣar Tabdart uḥṭṭu',
'addedwatchtext' => 'Tasna "[[:$1]]" Temmarni ɣar [[Special:Watchlist|Tabdart uḥṭṭu]].',
'removedwatch' => 'twakkes zi Tabdart uḥṭṭu',
@@ -726,9 +718,9 @@ Bbeẓ x ufeskar n uzar-timeẓṛi zzat i gha txemmled min turid',
'nextdiff' => 'Amá¹£ebá¸i zzat →',
# Media information
-'file-info-size' => '($1 × $2 pixel, tiddi(size) n ufaylu: $3, anaw(type) n MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, tiddisize n ufaylu: $3, anawtype n MIME: $4',
'file-nohires' => '<small>walu ca n resolution yemɣa x wa.</small>',
-'svg-long-desc' => '(Afaylu n SVG, dis $1 × $2 pixel, Tiddi n ufaylu: $3)',
+'svg-long-desc' => 'Afaylu n SVG, dis $1 × $2 pixel, Tiddi n ufaylu: $3',
'show-big-image' => 'Resolution ameqran',
'show-big-image-thumb' => '<small>Tiddi n uzar-ascan: $1 × $2 pixel </small>',
diff --git a/languages/messages/MessagesRm.php b/languages/messages/MessagesRm.php
index 231e0cfd..a1044ae9 100644
--- a/languages/messages/MessagesRm.php
+++ b/languages/messages/MessagesRm.php
@@ -14,6 +14,25 @@
* @author לערי ריינה×רט
*/
+$namespaceNames = array(
+ NS_MEDIA => 'Multimedia',
+ NS_SPECIAL => 'Spezial',
+ NS_TALK => 'Discussiun',
+ NS_USER => 'Utilisader',
+ NS_USER_TALK => 'Utilisader_discussiun',
+ NS_PROJECT_TALK => '$1_discussiun',
+ NS_FILE => 'Datoteca',
+ NS_FILE_TALK => 'Datoteca_discussiun',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_discussiun',
+ NS_TEMPLATE => 'Model',
+ NS_TEMPLATE_TALK => 'Model_discussiun',
+ NS_HELP => 'Agid',
+ NS_HELP_TALK => 'Agid_discussiun',
+ NS_CATEGORY => 'Categoria',
+ NS_CATEGORY_TALK => 'Categoria_discussiun',
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'suttastritgar colliaziuns:',
@@ -30,8 +49,7 @@ $messages = array(
'tog-editsection' => 'Mussar links [modifitgar] per modifitgar singulas secziuns',
'tog-editsectiononrightclick' => 'Activar la pussaivladad da modifitgar secziuns cun in clic dretg (basegna JavaScript)',
'tog-showtoc' => 'Mussar ina tabla da cuntegn sin paginas cun dapli che trais tetels',
-'tog-rememberpassword' => 'Restar annunzià permanentamain sin quest computer',
-'tog-editwidth' => "Schlargiar il champ d'entataziun per emplenir l'entir visur",
+'tog-rememberpassword' => "S'annunziar permanantamain cun quest navigatur (per maximalmain $1 {{PLURAL:$1|di|dis}})",
'tog-watchcreations' => "Observar paginas ch'jau hai creà",
'tog-watchdefault' => "Observar paginas ch'jau hai edità",
'tog-watchmoves' => "Observar paginas ch'jau hai spustà",
@@ -175,31 +193,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Agiuntar chapitel',
-'vector-action-delete' => 'Stizzar',
-'vector-action-move' => 'Spustar',
-'vector-action-protect' => 'Bloccar',
-'vector-action-undelete' => 'Restituir',
-'vector-action-unprotect' => 'Debloccar',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => "Pagina d'agid",
-'vector-namespace-image' => 'Datoteca',
-'vector-namespace-main' => 'Pagina',
-'vector-namespace-media' => 'Pagina da medias',
-'vector-namespace-mediawiki' => 'Communicaziun dal sistem MediaWiki',
-'vector-namespace-project' => 'Pagina da project',
-'vector-namespace-special' => 'Pagina speziala',
-'vector-namespace-talk' => 'Discussiun',
-'vector-namespace-template' => 'Model',
-'vector-namespace-user' => "Pagina d'utilisader",
-'vector-view-create' => 'Crear',
-'vector-view-edit' => 'Modifitgar',
-'vector-view-history' => 'Cronologia',
-'vector-view-view' => 'Leger',
-'vector-view-viewsource' => 'Mussar il code',
-'actions' => 'Acziuns',
-'namespaces' => 'Tip da pagina',
-'variants' => 'Variantas',
+'vector-action-addsection' => 'Agiuntar chapitel',
+'vector-action-delete' => 'Stizzar',
+'vector-action-move' => 'Spustar',
+'vector-action-protect' => 'Bloccar',
+'vector-action-undelete' => 'Restituir',
+'vector-action-unprotect' => 'Debloccar',
+'vector-simplesearch-preference' => 'Activar las propostas per tschertgar extendidas (be per il skin Vector)',
+'vector-view-create' => 'Crear',
+'vector-view-edit' => 'Modifitgar',
+'vector-view-history' => 'Cronologia',
+'vector-view-view' => 'Leger',
+'vector-view-viewsource' => 'Mussar il code',
+'actions' => 'Acziuns',
+'namespaces' => 'Tip da pagina',
+'variants' => 'Variantas',
'errorpagetitle' => 'Errur',
'returnto' => 'Enavos tar $1.',
@@ -260,6 +268,9 @@ Memia blers utilisaders emprovan da chargiar questa pagina.
Spetga per plaschair in mument avant che ti eprovas da puspè contemplar questa pagina.
$1',
+'pool-timeout' => 'Surpassà il temp durant spetgar sin la bloccada',
+'pool-queuefull' => 'La colona da spetga dil pool è plaina',
+'pool-errorunknown' => 'Errur nunenconuschenta',
# 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' => 'Davart {{SITENAME}}',
@@ -426,7 +437,8 @@ Betg emblida da midar tias [[Special:Preferences|preferenzas da {{SITENAME}}]].'
'yourname' => "Num d'utilisader",
'yourpassword' => 'pled-clav',
'yourpasswordagain' => 'repeter pled-clav',
-'remembermypassword' => 'Memorisar il pled-clav',
+'remembermypassword' => "S'annunziar permanantamain sin quest computer (per maximalmain $1 {{PLURAL:$1|di|dis}})",
+'securelogin-stick-https' => "Restar collià entras HTTPS suenter l'annunzia",
'yourdomainname' => 'Vossa domain',
'externaldberror' => "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
'login' => "T'annunziar",
@@ -443,6 +455,7 @@ Betg emblida da midar tias [[Special:Preferences|preferenzas da {{SITENAME}}]].'
'gotaccount' => "Gia in conto d'utilisader? '''$1'''.",
'gotaccountlink' => "T'annunziar",
'createaccountmail' => 'per e-mail',
+'createaccountreason' => 'Motiv:',
'badretype' => 'Ils dus pleds-clav na corrispundan betg.',
'userexists' => "Quest num d'utilisader vegn gia duvrà. Tscherna per plaschair in'auter.",
'loginerror' => "Sbagl cun t'annunziar",
@@ -468,6 +481,7 @@ Curregia ti\'endataziun.',
'wrongpasswordempty' => 'Ti as emblidà da scriver tes pled-clav. Prova anc ina giada.',
'passwordtooshort' => 'Tes pled-clav sto cuntegnair almain {{PLURAL:$1|in bustab|$1 bustabs}}.',
'password-name-match' => "Il pled-clav na dastga betg esser il medem sco il num d'utilisader.",
+'password-login-forbidden' => "L'utilisaziun da quest num d'utilisader e pled-clav è vegnida scumandada.",
'mailmypassword' => 'Trametter in nov pled-clav per e-mail',
'passwordremindertitle' => 'Nov pled-clav temporar per {{SITENAME}}',
'passwordremindertext' => 'Insatgi (probablamain ti, cun l\'adressa dad IP $1) ha dumandà in nov pled-clav per {{SITENAME}} ($4). Il pled-clav temporar "$3" per l\'utilisader "$2" è vegnì creà. Sche quai era tes intent, ti al dovras per t\'annunziar e tscherner lura in nov pled-clav. Quest pled-clav temporar vegn a scrudar en {{PLURAL:$5|in di|$5 dis}}.
@@ -504,6 +518,9 @@ Spetga per plaschair avant ch'empruvar anc ina giada.",
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => "Tia dumonda per partir è vegnida refusada perquai ch'i para ch'ella è vegnida tramessa d'in navigatur che funcziuna betg correctamain u d'in proxy da cache.",
+# E-mail sending
+'php-mail-error-unknown' => 'Errur nunenconuschenta en la funcziun mail() da PHP',
+
# Password reset dialog
'resetpass' => 'Midar il pled-clav',
'resetpass_announce' => "Ti ès t'annunzià cun in pled-clav temporar che ti has retschavì per e-mail.
@@ -555,11 +572,12 @@ Eventualmain has ti gia midà cun success tes pled-clav u dumandà per in nov pl
'showlivepreview' => 'Prevista directa',
'showdiff' => 'Mussar midadas',
'anoneditwarning' => "Vus essas betg annunziads. Empè dal num d'utilisader vign l'adressa dad IP registrada en la historia da las versiuns.",
+'anonpreviewwarning' => "''Ti n'es betg t'annunzià. Cun memorisar vegn perquai tia adressa IP registrada en la cronologia da la pagina.''",
'missingsummary' => "'''Avis:''' Ti has betg inditgà ina resumaziun.
Sche ti cliccas danovamain \"{{int:savearticle}}\" vegn tia midada memorisada senza ina tala.",
'missingcommenttext' => 'Endatescha per plaschair ina resumaziun.',
-'missingcommentheader' => "'''Avis:''' Ti has betg inditgà ina resumaziun.
-Sche ti cliccas danovamain \"{{int:savearticle}}\" vegn tia midada memorisada senza ina tala.",
+'missingcommentheader' => "'''Avis:''' Ti n'has betg inditgà in subject/titel per quest commentari.
+Sche ti cliccas anc ina giada sin \"{{int:savearticle}}\" vegn il commentari memorisà senza in tal.",
'summary-preview' => 'prevista da la resumaziun:',
'subject-preview' => "Prevista da l'object:",
'blockedtitle' => 'Utilisader è bloccà',
@@ -636,6 +654,12 @@ L'ultima endataziun dal log da bloccar vegn mussà sutvart sco referenza:",
'''El n'è anc betg memorisà.'''",
'userjspreview' => "'''Fa stim che quai è be ina prevista da tes JavaScript d'utilisader.'''
'''El n'è anc betg memorisà.'''",
+'sitecsspreview' => "'''Fa stim che quai è be ina prevista da quest CSS.'''
+'''El n'è anc betg memorisà.'''",
+'sitejspreview' => "'''Fa stim che quai è be ina prevista da quest JavaScript.'''
+'''El n'è anc betg memorisà.'''",
+'userinvalidcssjstitle' => "'''Attenziun:''' I n'exista nagin skin \"\$1\".
+Fa stim che titels da paginas persunalisadas .css u .js vegnan scrits pitschen, p. ex. {{ns:user}}:Foo/vector.css e betg {{ns:user}}:Foo/Vector.css.",
'updated' => '(midà)',
'note' => "'''Remartga:'''",
'previewnote' => "'''Fa stim che quai è be ina prevista.'''
@@ -677,9 +701,6 @@ Ti garanteschas che ti has scrit tez quai u copià dad ina funtauna ch'è 'publi
Sche ti na vuls betg che tes texts pon vegnir modifitgads, na als endatescha betg qua.<br />
Ti confermas era che ti has scrit sez quest text u al has copià d'ina funtaunda 'public domain' u semigliant libra (guarda $1 per detagls).
'''Betg trametta ovras protegidas dal dretg d'autur senza lubientscha!'''",
-'longpagewarning' => "'''ADATG: Questa artitgel è $1 kilobytes gronda. Insaquants browsers
-han forsa problems cun modifitgar artitgels da la grondezza 32kb u pli grond.
-Ponderai per plaschair da divider quest artitgel en pli pitschnas parts. '''",
'longpageerror' => "'''Errur: Il text che ti has tramess è $1 kilobytes gronds. Quei ei pli grond ch'il maximum da $2 kilobytes. Il text na po betg vegnir memorisà. '''",
'readonlywarning' => "'''Attenziun: La banca da datas è vegnida bloccada per motivs da mantegniment, uschia che ti na sas betg memorisar tias modificaziuns gest ussa.'''
Per betg perder las midadas ta recummandain nus da copiar il text en in editur da text sin tes computer ed al memorisar per pli tard.
@@ -855,11 +876,12 @@ Fa stim che navigar cun agid da las coalliziuns reinizialisescha tia tscherna.',
# Diffs
'history-title' => 'Cronica da versiuns da "$1"',
'difference' => '(differenza tranter versiuns)',
+'difference-multipage' => '(Differenzas tranter las paginas)',
'lineno' => 'Lingia $1:',
'compareselectedversions' => 'cumparegliar las versiuns selecziunadas',
'showhideselectedversions' => 'Mussar/zuppentar las versiuns tschernidas',
'editundo' => 'revocar',
-'diff-multi' => '({{PLURAL:$1|Ina versiun|$1 versiuns}} tranter en na vegnan betg mussadas.)',
+'diff-multi' => '({{PLURAL:$1|Ina versiun|$1 versiuns}} {{PLURAL:$2|dad in utilisader|da $2 utilisaders}} tranter en na {{PLURAL:$1|vegn betg mussada|na vegnan betg mussadas}}.)',
# Search results
'searchresults' => 'Resultats da tschertga',
@@ -894,6 +916,7 @@ Fa stim che navigar cun agid da las coalliziuns reinizialisescha tia tscherna.',
'searchprofile-everything-tooltip' => 'Tschertgar en tut il cuntegn (inclusivamain paginas da discussiun)',
'searchprofile-advanced-tooltip' => 'Tschertgar en ulteriurs tips da pagina',
'search-result-size' => '$1 ({{PLURAL:$2|in pled|$2 pleds}})',
+'search-result-category-size' => '{{PLURAL:$1|1 commember|$1 commembers}} ({{PLURAL:$2|1 sutcategoria|$2 sutcategorias}}, {{PLURAL:$3|1 datoteca|$3 datotecas}})',
'search-result-score' => 'Relevanza: $1 %',
'search-redirect' => '(renvià da $1)',
'search-section' => '(chapitel $1)',
@@ -970,6 +993,7 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
'resultsperpage' => 'resultats per pagina:',
'contextlines' => 'Lingia per resultat:',
'contextchars' => 'Segns per lingia:',
+'stub-threshold-disabled' => 'Deactivà',
'recentchangesdays' => 'Dumber da dis che duain vegnir mussads en las ultimas midadas:',
'recentchangesdays-max' => 'Maximalmain $1 {{PLURAL:$1|di|dis}}',
'recentchangescount' => 'Dumber da modificaziuns che duai vegnir mussà sco standard:',
@@ -1037,7 +1061,7 @@ Questa infurmaziun è publica.',
'prefs-advancedrendering' => 'Opziuns extendidas',
'prefs-advancedsearchoptions' => 'Opziuns extendidas',
'prefs-advancedwatchlist' => 'Opziuns extendidas',
-'prefs-display' => 'Opziuns da visualisar',
+'prefs-displayrc' => 'Opziuns da visualisar',
'prefs-diffs' => 'Cumparegliaziun da versiuns',
# User rights
@@ -1119,7 +1143,6 @@ Questa infurmaziun è publica.',
'right-userrights-interwiki' => "Modifitgar ils dretgs d'utilisaders sin autras wikis",
'right-siteadmin' => 'Bloccar u debloccar la banca da datas',
'right-reset-passwords' => "Redefinir pleds-clav d'auters utilisaders",
-'right-versiondetail' => 'Mussar infurmaziuns detagliadas davart la software e sia versiun',
'right-sendemail' => 'Trametter e-mails ad auters utilisaders',
# User rights log
@@ -1170,14 +1193,9 @@ Questa infurmaziun è publica.',
'recentchanges-legend' => 'Opziuns per las ultimas midadas',
'recentchangestext' => "Sin questa pagina pos ti suandar las ultimas midadas sin '''{{SITENAME}}'''.",
'recentchanges-feed-description' => 'Suonda las ultimas midadas en la wiki cun quet feed.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova pagina',
'recentchanges-label-newpage' => 'Questa modificaziun ha creà ina nova pagina',
-'recentchanges-legend-minor' => '$1 - pitschna midada',
'recentchanges-label-minor' => 'Quai è ina pitschna modificaziun',
-'recentchanges-legend-bot' => '$1 - midada da bot',
'recentchanges-label-bot' => 'Questa modificaziun è vegnida exequida dad in bot',
-'recentchanges-legend-unpatrolled' => '$1 - midada betg controllada',
'recentchanges-label-unpatrolled' => "Questa midada n'è anc betg vegnida controllada",
'rcnote' => "Sutvart {{PLURAL:$1|è '''ina''' midada|èn las ultimas '''$1''' midadass}} {{PLURAL:$2|da l'ultim di|dals ultims '''$2''' dis}}, versiun dals $4 $5.",
'rcnotefrom' => "Midadas dapi '''$2''' (maximalmain '''$1''' vegnan mussads).",
@@ -1224,6 +1242,9 @@ Paginas sin [[Special:Watchlist|tia glista d'observaziun]] èn '''grassas'''.",
'upload_directory_missing' => "L'ordinatur per chargiar viaden ($1) n'exista betg e na pudeva betg vegnir creà dal server.",
'upload_directory_read_only' => "L'ordinatur per chargiar viaden ($1) na po betg vegnir modifitgà dal server.",
'uploaderror' => 'Errur cun chargiar si',
+'upload-recreate-warning' => "'''Attenziun: Ina datoteca cun quest num è vegnida stizzada u spustada.'''
+
+Il log da stizzar e spustar vegn mussà sutvart:",
'uploadtext' => "Utilisescha quest formular per chargiar si datotecas.
Per contemplar u tschertgar datotecas gia chargiada si, visita la pagina [[Special:FileList|glista da datotecas chargiadas si]]. Tut las datotecas che vegnan chargiadas si èn era notads en il [[Special:Log/upload|log da chargiar si]], quellas ch'èn vegnidas stizzadas en il [[Special:Log/delete|log dal stizzar]].
@@ -1258,6 +1279,16 @@ Nus preferin datotecas {{PLURAL:\$3|dal tip|dals tips}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' è in tip da datoteca betg lubì.
Lubidas èn datotecas {{PLURAL:\$3|dal tip|dals tips}} \$2.",
'filetype-missing' => 'La datoteca n\'ha nagina extensiun (p.ex. ".jpg").',
+'empty-file' => 'La datoteca tramessa è vida.',
+'file-too-large' => 'La datoteca tramessa è memia gronda.',
+'filename-tooshort' => 'Il num da datoteca è memia curt.',
+'filetype-banned' => 'Quest tip da datoteca è scumandà.',
+'verification-error' => "Questa datoteca n'è betg passà cun success la verificaziun da datotecas.",
+'illegal-filename' => "Il num da datoteca n'è betg lubì.",
+'overwrite' => "Recuvrir (surscriver) datotecas existentas n'è betg lubì.",
+'unknown-error' => 'Ina errur nunenconuschenta è capitada.',
+'tmp-create-error' => 'Betg pussaivel da crear la datoteca temporara.',
+'tmp-write-error' => 'Errur cun scriver la datoteca temporara.',
'large-file' => "Igl è recumandà che las datotecas n'èn betg pli grondas che $1;
questa datoteca è $2 gronda.",
'largefileserver' => 'Questa datoteca è pli gronda che la grondezza maximala configurada.',
@@ -1289,7 +1320,6 @@ Sche ti vuls anc adina chargiar si tia datoteca, turna anavos e tscherna in aute
'file-exists-duplicate' => 'Questa datoteca è in duplicat da {{PLURAL:$1|suandanta datoteca|suandantas datotecas}}:',
'file-deleted-duplicate' => 'Ina daoteca identica a questa ([[:$1]]) è vegnida stizzada pli baud.
Ti duessas controllar la cronologia da stizzar da questa datoteca avant che puspè chargiar si ella.',
-'successfulupload' => 'Chargia si cun success',
'uploadwarning' => 'Attenziun',
'uploadwarning-text' => 'Mida per plaschair la descripziun da la datoteca sutvart ed emprova danovamain.',
'savefile' => 'Memorisar la datoteca',
@@ -1355,6 +1385,7 @@ In clic sin il titel d'ina colona mida la successiun da zavrar.",
'listfiles_search_for' => 'Tschtgar tenor il num da dateoca:',
'imgfile' => 'datoteca',
'listfiles' => 'Glista dals maletgs',
+'listfiles_thumb' => 'Maletg da prevista',
'listfiles_date' => 'Data',
'listfiles_name' => 'Num',
'listfiles_user' => 'Utilisader',
@@ -1460,6 +1491,7 @@ Betg emblida da controllar sche autras colliaziuns mainan als models avant ch'al
'statistics-edits' => "Modificaziuns da paginas dapi l'installaziun da {{SITENAME}}",
'statistics-edits-average' => 'Media da modificaziuns per pagina',
'statistics-views-total' => 'Visitas totalmain',
+'statistics-views-total-desc' => "Visitas da paginas ch'existan betg u da paginas spezialas n'èn betg inclusas",
'statistics-views-peredit' => 'Visitas per modificaziun',
'statistics-users' => '[[Special:ListUsers|Utilisaders]] registrads',
'statistics-users-active' => 'Utilisaders activs',
@@ -1470,9 +1502,9 @@ Betg emblida da controllar sche autras colliaziuns mainan als models avant ch'al
'disambiguationspage' => 'Template:disambiguiziun',
'doubleredirects' => 'Renviaments dubels',
-'doubleredirectstext' => "Questa glista mussa renviaments che mainan puspè a renviaments.
-Mintga colonna cuntegna colliaziuns a l'emprim ed al segund renviaments, sco era la pagina finala dal segund renviament che è probablamain la pagina a la quala duess vegnir renvià.
-Elements <s>stritgads</s> èn gia eliminads.",
+'doubleredirectstext' => "Questa glista mussa renviaments che mainan puspè a renviaments.
+Mintga colonna cuntegna colliaziuns a l'emprim ed al segund renviaments, sco era la pagina finala dal segund renviament che è probablamain la pagina a la quala duess vegnir renvià.
+Elements <del>stritgads</del> èn gia eliminads.",
'double-redirect-fixed-move' => '[[$1]] è vegnì spustà.
I renviescha uss a [[$2]].',
'double-redirect-fixer' => 'Bot da renviaments',
@@ -1496,6 +1528,8 @@ I renviescha uss a [[$2]].',
'nmembers' => '$1 {{PLURAL:$1|commember|commembers}}',
'nrevisions' => '{{PLURAL:$1|Ina versiun|$1 versiuns}}',
'nviews' => 'Contemplà $1 {{PLURAL:$1|giada|giadas}}',
+'nimagelinks' => 'Utilisà sin $1 {{PLURAL:$1|pagina|paginas}}',
+'ntransclusions' => 'utilisà sin $1 {{PLURAL:$1|pagina|paginas}}',
'specialpage-empty' => 'Questa pagina cuntegna actualmain naginas endataziuns.',
'lonelypages' => 'Paginas bandunadas',
'lonelypagestext' => "Las suandantas paginas n'èn betg integradas u n'èn betg colliadas cun autras paginas sin {{SITENAME}}.",
@@ -1636,7 +1670,7 @@ L'adressa dad e-mail che ti has endatà en [[Special:Preferences|tias preferenza
# Watchlist
'watchlist' => "mia glista d'observaziun",
'mywatchlist' => "Mia glista d'observaziun",
-'watchlistfor' => "(per '''$1''')",
+'watchlistfor2' => 'Per $1 $2',
'nowatchlist' => "Ti n'has nagins elements sin tia glista d'observaziun.",
'watchlistanontext' => "Ti stos $1 per vesair u modifitgar elements sin tia glista d'observaziun",
'watchnologin' => "Ti n'es betg t'annunzià!",
@@ -1757,19 +1791,23 @@ Ti pos midar il livel da protecziun da quest\'artitgel, quai na vegn dentant bet
'month' => 'dal mais (e pli baud):',
'year' => "da l'onn (e pli baud):",
-'sp-contributions-newbies' => 'Be mussar contribuziuns da contos novs',
-'sp-contributions-newbies-sub' => "Per novs contos d'utilisader",
-'sp-contributions-newbies-title' => "Contribuziuns da novs contos d'utilisader",
-'sp-contributions-blocklog' => 'log dal bloccar',
-'sp-contributions-deleted' => 'Contribuziuns da commembers stizzadas',
-'sp-contributions-logs' => 'logs',
-'sp-contributions-talk' => 'discussiun',
-'sp-contributions-userrights' => "administraziun da dretgs d'utilisaders",
-'sp-contributions-blocked-notice' => "Quai utilisader è bloccà actualmain.
+'sp-contributions-newbies' => 'Be mussar contribuziuns da contos novs',
+'sp-contributions-newbies-sub' => "Per novs contos d'utilisader",
+'sp-contributions-newbies-title' => "Contribuziuns da novs contos d'utilisader",
+'sp-contributions-blocklog' => 'log dal bloccar',
+'sp-contributions-deleted' => 'Contribuziuns da commembers stizzadas',
+'sp-contributions-uploads' => 'datotecas chargiadas si',
+'sp-contributions-logs' => 'logs',
+'sp-contributions-talk' => 'discussiun',
+'sp-contributions-userrights' => "administraziun da dretgs d'utilisaders",
+'sp-contributions-blocked-notice' => "Quai utilisader è bloccà actualmain.
+L'ultima endataziun dal log da bloccar vegn mussà sutvart sco referenza:",
+'sp-contributions-blocked-notice-anon' => "Questa adressa IP è bloccada actualmain.
L'ultima endataziun dal log da bloccar vegn mussà sutvart sco referenza:",
-'sp-contributions-search' => "Tschertgar contribuziuns d'utilisaders",
-'sp-contributions-username' => "Adressa IP u num d'utilisader:",
-'sp-contributions-submit' => 'Tschertga',
+'sp-contributions-search' => "Tschertgar contribuziuns d'utilisaders",
+'sp-contributions-username' => "Adressa IP u num d'utilisader:",
+'sp-contributions-toponly' => "Be mussar modificaziuns ch'èn las ulimas versiuns",
+'sp-contributions-submit' => 'Tschertga',
# What links here
'whatlinkshere' => 'Links sin questa pagina',
@@ -1900,6 +1938,8 @@ Ti na pos betg crear in conto d'utilisader.",
'cant-block-while-blocked' => 'Ti na pos betg bloccar auters utilisaders durant che ti es sez bloccà',
'cant-see-hidden-user' => "L'utilisader che ti emprovas da bloccar è gia bloccà e zuppentà.
Perquai che ti h'has betg il dretg «hideuser» na pos ti betg vesair u modifitgar la bloccada da l'utilisader.",
+'ipbblocked' => 'Ti na pos betg bloccar u debloccar auters utilisaders perquai che ti es sez bloccà',
+'ipbnounblockself' => 'Ti na bos betg debloccar tai sez',
# Developer tools
'lockdb' => 'Bloccar la banca da datas',
@@ -2032,6 +2072,7 @@ La memorisescha sin tes computer e chargia si ella qua.",
'importstart' => 'Importar paginas…',
'import-revision-count' => '{{PLURAL:$1|Ina versiun|$1 versiuns}}',
'importnopages' => 'Nagina pagina per importar.',
+'imported-log-entries' => 'Importà $1 {{PLURAL:$1|endataziun dal log|endataziuns dal log}}.',
'importfailed' => "Betg reussì d'importar: <nowiki>$1</nowiki>",
'importunknownsource' => "Funtauna d'import nunenconuschenta",
'importcantopen' => "Betg pussaivel dad avrir la datoteca d'import",
@@ -2130,6 +2171,8 @@ Ti pos vesair il code-fundamental.',
'tooltip-upload' => 'Cumenzar da chargiar si',
'tooltip-rollback' => "Revochescha tut las modificaziuns vid questa pagina da l'ultim utilisader cun be in clic.",
'tooltip-undo' => 'Revochescha be questa midada e mussa il resultat en la prevista, per che ti pos inditgar en il champ da resumaziun in motiv.',
+'tooltip-preferences-save' => 'Memorisar las preferenzas',
+'tooltip-summary' => 'Endatescha ina curta resumaziun',
# Stylesheets
'common.css' => '',
@@ -2225,12 +2268,15 @@ $1',
'nextdiff' => 'versiun pli nova →',
# Media information
+'mediawarning' => "'''Attenziun''': Quest tip da datotecas po cuntegnair code malvulent.
+Cun exequir questa datoteca po tes sistem vegnir donnegià.",
'imagemaxsize' => "Grondezza maximala da maletgs:<br />''(per paginas da descripziun da datotecas)''",
'thumbsize' => 'Grondezza dals maletgs da prevista:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagina|paginas}}',
-'file-info-size' => '($1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4)',
+'file-info' => 'grondezza da datoteca: $1, tip da MIME: $2',
+'file-info-size' => '$1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4',
'file-nohires' => '<small>Nagina resuluziun pli auta disponibla.</small>',
-'svg-long-desc' => '(datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3)',
+'svg-long-desc' => 'datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3',
'show-big-image' => 'Resoluziun cumplaina',
'show-big-image-thumb' => '<small>Grondezza da quest prevista: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'marscha infinit',
@@ -2424,30 +2470,30 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
'limitall' => 'tuts',
# E-mail address confirmation
-'confirmemail' => "Confermar l'adressa dad e-mail",
-'confirmemail_noemail' => "Ti n'has betg inditgà ina adressa dad e-mail valida en tias [[Special:Preferences|preferenzas]].",
-'confirmemail_text' => "{{SITENAME}} pretenda che ti confermas tia adressa dad e-mail avant che ti pos utilisar funcziuns dad e-mail.
+'confirmemail' => "Confermar l'adressa dad e-mail",
+'confirmemail_noemail' => "Ti n'has betg inditgà ina adressa dad e-mail valida en tias [[Special:Preferences|preferenzas]].",
+'confirmemail_text' => "{{SITENAME}} pretenda che ti confermas tia adressa dad e-mail avant che ti pos utilisar funcziuns dad e-mail.
Clicca sin il buttun sutvart per ta trametter in e-mail per confermar a tia adressa.
L'e-mail cuntegna in link cun in code;
Chargia la destinaziun dal link en tes navigatur per confermar che tia adressa dad e-mail è valida.",
-'confirmemail_pending' => "In code per confermar è gia vegnì tramess a tai;
+'confirmemail_pending' => "In code per confermar è gia vegnì tramess a tai;
sche ti has creà avant curt temp tes conto duessas ti anc spitgar in per minutas per che l'e-mail possia arrivar avant che ti genereschas in nov code.",
-'confirmemail_send' => 'Ma trametter in code da confermaziun',
-'confirmemail_sent' => "Tramess l'e-mail da confermaziun.",
-'confirmemail_oncreate' => "In code da confermaziun è vegnì tramess a tia adressa dad e-mail.
+'confirmemail_send' => 'Ma trametter in code da confermaziun',
+'confirmemail_sent' => "Tramess l'e-mail da confermaziun.",
+'confirmemail_oncreate' => "In code da confermaziun è vegnì tramess a tia adressa dad e-mail.
Quest code n'è betg necessari per t'annunziar, ma ti al stos endatar avant che la wiki po activar funcziuns dad e-mail.",
-'confirmemail_sendfailed' => "{{SITENAME}} na pudeva betg trametter l'e-mail da confermaziun.
+'confirmemail_sendfailed' => "{{SITENAME}} na pudeva betg trametter l'e-mail da confermaziun.
Controllescha sche ti has endatà caracters nunvalids en tia adressa dad e-mail.
Il server dad e-mail ha returnà: $1",
-'confirmemail_invalid' => 'Il code da confermaziun è nunvalid. Il code è probablamain scrudà.',
-'confirmemail_needlogin' => 'Ti stos $1 per confermar tia adressa dad e-mail.',
-'confirmemail_success' => "Tia adressa dad e-mail è vegnida confermada.
+'confirmemail_invalid' => 'Il code da confermaziun è nunvalid. Il code è probablamain scrudà.',
+'confirmemail_needlogin' => 'Ti stos $1 per confermar tia adressa dad e-mail.',
+'confirmemail_success' => "Tia adressa dad e-mail è vegnida confermada.
Ussa pos ti [[Special:UserLogin|t'annunziar]] ed utilisar la wiki.",
-'confirmemail_loggedin' => 'Tia adressa dad e-mail è ussa vegnida confermada.',
-'confirmemail_error' => 'Insatge è crappà cun tes mail da confermaziun. Stgisa foll!',
-'confirmemail_subject' => "{{SITENAME}} - Confermaziun da l'adressa dad e-mail",
-'confirmemail_body' => 'Insatgi cun l\'adressa dad IP $1, probablamain ti,
+'confirmemail_loggedin' => 'Tia adressa dad e-mail è ussa vegnida confermada.',
+'confirmemail_error' => 'Insatge è crappà cun tes mail da confermaziun. Stgisa foll!',
+'confirmemail_subject' => "{{SITENAME}} - Confermaziun da l'adressa dad e-mail",
+'confirmemail_body' => 'Insatgi cun l\'adressa dad IP $1, probablamain ti,
ha creà il conto "$2" sin {{SITENAME}} cun questa adressa dad e-mail.
Per confermar ch quest conto tutga propi a tai e per activar las
@@ -2461,8 +2507,22 @@ questa colliaziun per stizzar la confermaziun da questa adressa dad e-mail:
$5
Quest code da confermaziun scroda ils $4.',
-'confirmemail_invalidated' => "La confermaziun da l'adressa dad e-mail è vegnida stizzada",
-'invalidateemail' => "Stizzar la confermaziun da l'adressa dad e-mail",
+'confirmemail_body_changed' => 'Insatgi, probablamain ti, cun l\'adressa dad IP $1
+ha midà l\'adressa d\'e-mail sin questa adressa dal conto "$2" sin {{SITENAME}}.
+
+Per confermar ch quest conto tutga propi a tai e per reactivar las
+funcziuns dad e-mail sin {{SITENAME}} stos ti avrir quest link en tes navigatur:
+
+$3
+
+Sch\'il conto na tutga *betg* a tai, suanda per plaschair a questa colliaziun
+per stizzar la confermaziun da questa adressa dad e-mail:
+
+$5
+
+Quest code da confermaziun scroda ils $4.',
+'confirmemail_invalidated' => "La confermaziun da l'adressa dad e-mail è vegnida stizzada",
+'invalidateemail' => "Stizzar la confermaziun da l'adressa dad e-mail",
# Scary transclusion
'scarytranscludedisabled' => "[L'integraziun interwiki è deactivada]",
@@ -2501,6 +2561,7 @@ Conferma per plaschair che ti vuls propi crear danovamain quest artitgel.",
'table_pager_first' => 'Emprima pagina',
'table_pager_last' => 'Ultima pagina',
'table_pager_limit' => 'Mussar $1 elements per pagina',
+'table_pager_limit_label' => 'Elements per pagina:',
'table_pager_limit_submit' => 'Dai',
'table_pager_empty' => 'Nagins resultats',
@@ -2606,6 +2667,15 @@ Ti pos era utilisar [[Special:Watchlist/edit|la pagina da standard]].',
'tags-edit' => 'modifitgar',
'tags-hitcount' => '$1 {{PLURAL:$1|midada|midadas}}',
+# Special:ComparePages
+'comparepages' => 'Cumparegliar paginas',
+'compare-selector' => "Cumparegliar versiuns d'ina pagina",
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versiun 1',
+'compare-rev2' => 'Versiun 2',
+'compare-submit' => 'Cumparegliar',
+
# Database error messages
'dberr-header' => 'Questa wiki ha in problem',
'dberr-problems' => 'Stgisa!
@@ -2623,8 +2693,13 @@ Questa pagina ha actualmain difficultads tecnicas.',
'htmlform-float-invalid' => "La valur che ti has inditgà n'è betg ina cifra.",
'htmlform-int-toolow' => 'La valur che ti has inditgà è sut il minimum da $1',
'htmlform-int-toohigh' => 'La valur che ti has inditgà è sur il maximum da $1',
+'htmlform-required' => 'Questa valur è necessaria',
'htmlform-submit' => 'Trametter',
'htmlform-reset' => 'Revocar las midadas',
'htmlform-selectorother-other' => 'Auters',
+# SQLite database support
+'sqlite-has-fts' => '$1 cun sustegn per la retschertga da text integrala',
+'sqlite-no-fts' => '$1 senza sustegn per la retschertga da text integrala',
+
);
diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php
index b5bfceea..e55e759e 100644
--- a/languages/messages/MessagesRo.php
+++ b/languages/messages/MessagesRo.php
@@ -97,7 +97,7 @@ $magicWords = array(
'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'dreaptasus', 'dreaptasus=$1', 'dreaptasus $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'chenar', 'border' ),
- 'img_baseline' => array( '1', 'linia de bază', 'baseline' ),
+ 'img_baseline' => array( '1', 'linia_de_bază', 'baseline' ),
'img_sub' => array( '1', 'indice', 'sub' ),
'img_super' => array( '1', 'exponent', 'super', 'sup' ),
'img_top' => array( '1', 'sus', 'top' ),
@@ -192,94 +192,94 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Redirectări duble' ),
- 'BrokenRedirects' => array( 'Redirectări invalide' ),
+ 'DoubleRedirects' => array( 'Redirectări_duble' ),
+ 'BrokenRedirects' => array( 'Redirectări_invalide' ),
'Disambiguations' => array( 'Dezambiguizări' ),
'Userlogin' => array( 'Autentificare' ),
- 'Userlogout' => array( 'IeÅŸire' ),
+ 'Userlogout' => array( 'Ieșire' ),
'CreateAccount' => array( 'ÃŽnregistrare' ),
- 'Preferences' => array( 'Preferinţe' ),
- 'Watchlist' => array( 'Pagini urmărite' ),
- 'Recentchanges' => array( 'Schimbări recente' ),
+ 'Preferences' => array( 'Preferințe' ),
+ 'Watchlist' => array( 'Pagini_urmărite' ),
+ 'Recentchanges' => array( 'Schimbări_recente' ),
'Upload' => array( 'Încărcare' ),
- 'Listfiles' => array( 'Listă imagini' ),
- 'Newimages' => array( 'Imagini noi' ),
- 'Listusers' => array( 'Listă utilizatori' ),
- 'Listgrouprights' => array( 'Listă drepturi grup' ),
+ 'Listfiles' => array( 'Listă_fișiere' ),
+ 'Newimages' => array( 'Imagini_noi' ),
+ 'Listusers' => array( 'Listă_utilizatori' ),
+ 'Listgrouprights' => array( 'Listă_drepturi_grup' ),
'Statistics' => array( 'Statistici' ),
- 'Randompage' => array( 'Aleatoriu', 'Pagină aleatorie' ),
- 'Lonelypages' => array( 'Pagini orfane' ),
- 'Uncategorizedpages' => array( 'Pagini necategorizate' ),
- 'Uncategorizedcategories' => array( 'Categorii necategorizate' ),
- 'Uncategorizedimages' => array( 'Imagini necategorizate' ),
- 'Uncategorizedtemplates' => array( 'Formate necategorizate' ),
- 'Unusedcategories' => array( 'Categorii nefolosite' ),
- 'Unusedimages' => array( 'Imagini nefolosite' ),
- 'Wantedpages' => array( 'Pagini dorite', 'Legături invalide' ),
- 'Wantedcategories' => array( 'Categorii dorite' ),
- 'Wantedfiles' => array( 'FiÅŸiere dorite' ),
- 'Wantedtemplates' => array( 'Formate dorite' ),
- 'Mostlinked' => array( 'Legături multe' ),
- 'Mostlinkedcategories' => array( 'Categorii des folosite' ),
- 'Mostlinkedtemplates' => array( 'Formate des folosite' ),
- 'Mostimages' => array( 'Imagini multe' ),
- 'Mostcategories' => array( 'Categorii multe' ),
- 'Mostrevisions' => array( 'Revizii multe' ),
- 'Fewestrevisions' => array( 'Revizii puţine' ),
- 'Shortpages' => array( 'Pagini scurte' ),
- 'Longpages' => array( 'Pagini lungi' ),
- 'Newpages' => array( 'Pagini noi' ),
- 'Ancientpages' => array( 'Pagini vechi' ),
- 'Deadendpages' => array( 'Pagini fără legături' ),
- 'Protectedpages' => array( 'Pagini protejate' ),
- 'Protectedtitles' => array( 'Titluri protejate' ),
- 'Allpages' => array( 'Toate paginile' ),
+ 'Randompage' => array( 'Aleatoriu', 'Pagină_aleatorie' ),
+ 'Lonelypages' => array( 'Pagini_orfane' ),
+ 'Uncategorizedpages' => array( 'Pagini_necategorizate' ),
+ 'Uncategorizedcategories' => array( 'Categorii_necategorizate' ),
+ 'Uncategorizedimages' => array( 'Imagini_necategorizate' ),
+ 'Uncategorizedtemplates' => array( 'Formate_necategorizate' ),
+ 'Unusedcategories' => array( 'Categorii_nefolosite' ),
+ 'Unusedimages' => array( 'Imagini_nefolosite' ),
+ 'Wantedpages' => array( 'Pagini_dorite', 'Legături_invalide' ),
+ 'Wantedcategories' => array( 'Categorii_dorite' ),
+ 'Wantedfiles' => array( 'Fișiere_dorite' ),
+ 'Wantedtemplates' => array( 'Formate_dorite' ),
+ 'Mostlinked' => array( 'Legături_multe' ),
+ 'Mostlinkedcategories' => array( 'Categorii_des_folosite' ),
+ 'Mostlinkedtemplates' => array( 'Formate_des_folosite' ),
+ 'Mostimages' => array( 'Imagini_multe' ),
+ 'Mostcategories' => array( 'Categorii_multe' ),
+ 'Mostrevisions' => array( 'Revizii_multe' ),
+ 'Fewestrevisions' => array( 'Revizii_puține' ),
+ 'Shortpages' => array( 'Pagini_scurte' ),
+ 'Longpages' => array( 'Pagini_lungi' ),
+ 'Newpages' => array( 'Pagini_noi' ),
+ 'Ancientpages' => array( 'Pagini_vechi' ),
+ 'Deadendpages' => array( 'Pagini_fără_legături' ),
+ 'Protectedpages' => array( 'Pagini_protejate' ),
+ 'Protectedtitles' => array( 'Titluri_protejate' ),
+ 'Allpages' => array( 'Toate_paginile' ),
'Prefixindex' => array( 'Index' ),
- 'Ipblocklist' => array( 'Listă IP blocat' ),
- 'Specialpages' => array( 'Pagini speciale' ),
- 'Contributions' => array( 'Contribuţii' ),
- 'Emailuser' => array( 'Email utilizator' ),
- 'Confirmemail' => array( 'Confirmă email' ),
- 'Whatlinkshere' => array( 'Ce se leagă aici' ),
- 'Recentchangeslinked' => array( 'Modificări corelate' ),
- 'Movepage' => array( 'Mută pagina' ),
+ 'Ipblocklist' => array( 'Listă_IP_blocat' ),
+ 'Specialpages' => array( 'Pagini_speciale' ),
+ 'Contributions' => array( 'Contribuții' ),
+ 'Emailuser' => array( 'Email_utilizator' ),
+ 'Confirmemail' => array( 'Confirmă_email' ),
+ 'Whatlinkshere' => array( 'Ce_se_leagă_aici' ),
+ 'Recentchangeslinked' => array( 'Modificări_corelate' ),
+ 'Movepage' => array( 'Mută_pagina' ),
'Blockme' => array( 'Blochează-mă' ),
- 'Booksources' => array( 'Referinţe în cărţi' ),
+ 'Booksources' => array( 'Referințe_în_cărți' ),
'Categories' => array( 'Categorii' ),
'Export' => array( 'Exportă' ),
'Version' => array( 'Versiune' ),
- 'Allmessages' => array( 'Toate mesajele' ),
+ 'Allmessages' => array( 'Toate_mesajele' ),
'Log' => array( 'Jurnal', 'Jurnale' ),
- 'Blockip' => array( 'Blochează IP' ),
+ 'Blockip' => array( 'Blochează_IP' ),
'Undelete' => array( 'Restaurează' ),
'Import' => array( 'Importă' ),
- 'Lockdb' => array( 'Blochează BD' ),
- 'Unlockdb' => array( 'Deblochează BD' ),
- 'Userrights' => array( 'Drepturi utilizator' ),
- 'MIMEsearch' => array( 'Căutare MIME' ),
- 'FileDuplicateSearch' => array( 'Căutare fişier duplicat' ),
- 'Unwatchedpages' => array( 'Pagini neurmărite' ),
- 'Listredirects' => array( 'Listă redirectări' ),
- 'Revisiondelete' => array( 'Åžterge revizie' ),
- 'Unusedtemplates' => array( 'Formate nefolosite' ),
- 'Randomredirect' => array( 'Redirectare aleatorie' ),
- 'Mypage' => array( 'Pagina mea' ),
- 'Mytalk' => array( 'Discuţiile mele' ),
- 'Mycontributions' => array( 'Contribuţiile mele' ),
- 'Listadmins' => array( 'Listă administratori' ),
- 'Listbots' => array( 'Listă roboţi' ),
- 'Popularpages' => array( 'Pagini populare' ),
+ 'Lockdb' => array( 'Blochează_BD' ),
+ 'Unlockdb' => array( 'Deblochează_BD' ),
+ 'Userrights' => array( 'Drepturi_utilizator' ),
+ 'MIMEsearch' => array( 'Căutare_MIME' ),
+ 'FileDuplicateSearch' => array( 'Căutare_fișier_duplicat' ),
+ 'Unwatchedpages' => array( 'Pagini_neurmărite' ),
+ 'Listredirects' => array( 'Listă_redirectări' ),
+ 'Revisiondelete' => array( 'Åžterge_revizie' ),
+ 'Unusedtemplates' => array( 'Formate_nefolosite' ),
+ 'Randomredirect' => array( 'Redirectare_aleatorie' ),
+ 'Mypage' => array( 'Pagina_mea' ),
+ 'Mytalk' => array( 'Discuțiile_mele' ),
+ 'Mycontributions' => array( 'Contribuțiile_mele' ),
+ 'Listadmins' => array( 'Listă_administratori' ),
+ 'Listbots' => array( 'Listă_roboți' ),
+ 'Popularpages' => array( 'Pagini_populare' ),
'Search' => array( 'Căutare' ),
- 'Resetpass' => array( 'Resetează parola' ),
- 'Withoutinterwiki' => array( 'Fără legături interwiki' ),
- 'MergeHistory' => array( 'Istoria combinărilor' ),
- 'Filepath' => array( 'Cale fiÅŸier' ),
- 'Invalidateemail' => array( 'Invalidează email' ),
- 'Blankpage' => array( 'Pagină goală' ),
- 'LinkSearch' => array( 'Căutare legături' ),
- 'DeletedContributions' => array( 'Contibuţii şterse' ),
+ 'Resetpass' => array( 'Resetează_parola' ),
+ 'Withoutinterwiki' => array( 'Fără_legături_interwiki' ),
+ 'MergeHistory' => array( 'Istoria_combinărilor' ),
+ 'Filepath' => array( 'Cale_fișier' ),
+ 'Invalidateemail' => array( 'Invalidează_email' ),
+ 'Blankpage' => array( 'Pagină_goală' ),
+ 'LinkSearch' => array( 'Căutare_legături' ),
+ 'DeletedContributions' => array( 'Contibuții_șterse' ),
'Tags' => array( 'Etichete' ),
- 'Activeusers' => array( 'Utilizatori activi' ),
+ 'Activeusers' => array( 'Utilizatori_activi' ),
);
$datePreferences = false;
@@ -311,8 +311,7 @@ $messages = array(
'tog-editsectiononrightclick' => 'Activează modificarea secţiunilor prin clic dreapta
pe titlul secțiunii (JavaScript)',
'tog-showtoc' => 'Arată cuprinsul (pentru paginile cu mai mult de 3 paragrafe cu titlu)',
-'tog-rememberpassword' => 'Amintește-ți între sesiuni',
-'tog-editwidth' => 'Extinde câmpul de editare pe tot ecranul',
+'tog-rememberpassword' => 'Autentificare automată de la acest navigator (expiră după $1 {{PLURAL:$1|zi|zile}})',
'tog-watchcreations' => 'Adaugă paginile pe care le creez la lista mea de urmărire',
'tog-watchdefault' => 'Adaugă paginile pe care le modific la lista mea de urmărire',
'tog-watchmoves' => 'Adaugă paginile pe care le redenumesc la lista de pagini urmărite',
@@ -459,31 +458,21 @@ pe titlul secțiunii (JavaScript)',
'faqpage' => 'Project:Întrebări frecvente',
# Vector skin
-'vector-action-addsection' => 'Mesaj nou',
-'vector-action-delete' => 'Ștergere',
-'vector-action-move' => 'Redenumire',
-'vector-action-protect' => 'Protejare',
-'vector-action-undelete' => 'Recuperare',
-'vector-action-unprotect' => 'Deprotejare',
-'vector-namespace-category' => 'Categorie',
-'vector-namespace-help' => 'Pagină de ajutor',
-'vector-namespace-image' => 'Fișier',
-'vector-namespace-main' => 'Articol',
-'vector-namespace-media' => 'Pagină media',
-'vector-namespace-mediawiki' => 'Mesaj',
-'vector-namespace-project' => 'Pagină de proiect',
-'vector-namespace-special' => 'Pagină specială',
-'vector-namespace-talk' => 'Discuție',
-'vector-namespace-template' => 'Format',
-'vector-namespace-user' => 'Pagină de utilizator',
-'vector-view-create' => 'Creare',
-'vector-view-edit' => 'Modificare',
-'vector-view-history' => 'Istoric',
-'vector-view-view' => 'Lectură',
-'vector-view-viewsource' => 'Sursă pagină',
-'actions' => 'Acțiuni',
-'namespaces' => 'Spații de nume',
-'variants' => 'Variante',
+'vector-action-addsection' => 'Mesaj nou',
+'vector-action-delete' => 'Ștergere',
+'vector-action-move' => 'Redenumire',
+'vector-action-protect' => 'Protejare',
+'vector-action-undelete' => 'Recuperare',
+'vector-action-unprotect' => 'Deprotejare',
+'vector-simplesearch-preference' => 'Permite sugestii de căutare superioară (numai interfața Vector)',
+'vector-view-create' => 'Creare',
+'vector-view-edit' => 'Modificare',
+'vector-view-history' => 'Istoric',
+'vector-view-view' => 'Lectură',
+'vector-view-viewsource' => 'Sursă pagină',
+'actions' => 'Acțiuni',
+'namespaces' => 'Spații de nume',
+'variants' => 'Variante',
'errorpagetitle' => 'Eroare',
'returnto' => 'ÃŽnapoi la $1.',
@@ -544,6 +533,9 @@ Prea mulți utilizatori încearcă să vizualizeze această pagină.
Vă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.
$1',
+'pool-timeout' => 'Timpul alocat așteptării pentru blocare a expirat',
+'pool-queuefull' => 'Coada de așteptare este plină',
+'pool-errorunknown' => 'Eroare necunoscută',
# 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' => 'Despre {{SITENAME}}',
@@ -617,7 +609,9 @@ $1',
S-ar putea să fi introdus greșit URL-ul, sau să fi urmat o legătură incorectă.
Aceasta s-ar putea să indice și un bug în programul folosit de {{SITENAME}}.',
'nosuchspecialpage' => 'Această pagină specială nu există',
-'nospecialpagetext' => 'Ai cerut o [[Special:SpecialPages|pagină specială]] care nu este recunoscută de {{SITENAME}}.',
+'nospecialpagetext' => '<strong>Ați cerut o [[Special:SpecialPages|pagină specială]] invalidă.</strong>
+
+O listă cu paginile speciale valide se poate găsi la [[Special:SpecialPages|{{int:specialpages}}]].',
# General errors
'error' => 'Eroare',
@@ -704,7 +698,8 @@ Contul dumneavoatră a fost creat. Nu uitați să vă personalizați [[Special:P
'yourname' => 'Nume de utilizator:',
'yourpassword' => 'Parolă:',
'yourpasswordagain' => 'Repetați parola:',
-'remembermypassword' => 'Reține-mi parola între sesiuni',
+'remembermypassword' => 'Autentificare automată de la acest calculator (expiră după {{PLURAL:$1|24 de ore|$1 zile}})',
+'securelogin-stick-https' => 'Rămâi conectat la HTTPS după autentificare',
'yourdomainname' => 'Domeniul dumneavoastră:',
'externaldberror' => 'A fost fie o eroare de bază de date pentru o autentificare extenă sau nu aveți permisiunea să actualizați contul extern.',
'login' => 'Autentificare',
@@ -721,6 +716,7 @@ Contul dumneavoatră a fost creat. Nu uitați să vă personalizați [[Special:P
'gotaccount' => "Aveți deja un cont de utilizator? '''$1'''.",
'gotaccountlink' => 'Autentificați-vă',
'createaccountmail' => 'după e-mail',
+'createaccountreason' => 'Motiv:',
'badretype' => 'Parolele pe care le-ați introdus diferă.',
'userexists' => 'Numele de utilizator pe care l-ați introdus există deja. Încercați cu un alt nume.',
'loginerror' => 'Eroare de autentificare',
@@ -740,6 +736,7 @@ Verifică dacă ai scris corect sau [[Special:UserLogin/signup|creează un nou c
'wrongpasswordempty' => 'Spațiul pentru introducerea parolei nu a fost completat. Vă rugăm să încercați din nou.',
'passwordtooshort' => 'Parola trebuie să aibă cel puțin {{PLURAL:$1|1 caracter|$1 caractere}}.',
'password-name-match' => 'Parola dumneavoastră trebuie să fie diferită de numele de utilizator.',
+'password-login-forbidden' => 'Utilizarea acestui nume de utilizator și a acestei parole este interzisă.',
'mailmypassword' => 'Trimite-mi parola pe e-mail!',
'passwordremindertitle' => 'Noua parolă temporară la {{SITENAME}}',
'passwordremindertext' => 'Cineva (probabil dumneavoastră, de la adresa $1)
@@ -777,6 +774,9 @@ Vă rugăm să așteptați până să mai încercați.',
'loginlanguagelabel' => 'Limba: $1',
'suspicious-userlogout' => 'Cererea dumneavoastră de a închide sesiunea a fost refuzată întrucât pare că a fost trimisă printr-o eroare a navigatorului sau de un proxy memorat în cache.',
+# E-mail sending
+'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
+
# Password reset dialog
'resetpass' => 'Modifică parola',
'resetpass_announce' => 'Sunteți autentificat cu un cod temporar trimis pe e-mail. Pentru a termina acțiunea de autentificare, trebuie să setați o parolă nouă aici:',
@@ -828,9 +828,11 @@ Este posibil să fi reușit deja schimbarea parolei sau să fi cerut o parolă t
'showlivepreview' => 'Previzualizare live',
'showdiff' => 'Afișare diferențe',
'anoneditwarning' => "'''Atenție:''' Nu v-ați autentificat. Adresa IP vă va fi înregistrată în istoricul acestei pagini.",
+'anonpreviewwarning' => "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
'missingsummary' => "'''AtenÈ›ie:''' Nu aÈ›i completat caseta „descriere modificăriâ€. Dacă apăsaÈ›i din nou butonul „salvează pagina†modificările vor fi salvate fără descriere.",
'missingcommenttext' => 'Vă rugăm să introduceți un comentariu.',
-'missingcommentheader' => "'''Atenție:''' Nu ați furnizat un titlu/subiect pentru acest comentariu. Dacă dați click pe \"Salvați din nou\", modificarea va fi salvată fără titlu.",
+'missingcommentheader' => "'''Atenție,''' nu ați pus titlu sau subiect la acest comentariu.
+Dacă dați din nou clic pe „{{int:savearticle}}†modificarea va fi salvată fără titlu.",
'summary-preview' => 'Previzualizare descriere:',
'subject-preview' => 'Previzualizare subiect/titlu:',
'blockedtitle' => 'Utilizatorul este blocat',
@@ -899,7 +901,11 @@ Ultima intrare în jurnalul blocărilor este afiÈ™ată mai jos pentru referinÈ›Ä
'userjsyoucanpreview' => "'''Sfat:''' Folosiți butonul „{{int:showpreview}}†pentru a testa noul JavaScript înainte de a-l salva.",
'usercsspreview' => "'''Reține că urmărești doar o previzualizare a css-ului tău de utilizator, acesta nu este încă salvat!'''",
'userjspreview' => "'''Reține că urmărești doar un test/o previzualizare a javascript-ului tău de utilizator, acesta nu este încă salvat!'''",
-'userinvalidcssjstitle' => '<b>Avertizare:</b> Nu există skin "$1". Amintește-ți că paginile .css and .js specifice utilizatorilor au titluri care încep cu literă mică, de exemplu {{ns:user}}:Foo/monobook.css în comparație cu {{ns:user}}:Foo/Monobook.css.',
+'sitecsspreview' => "'''Rețineți că doar previzualizați această foaie de stil.'''
+'''Ea nu a fost salvată încă!'''",
+'sitejspreview' => "'''Rețineți că doar previzualizați acest cod JavaScript.'''
+'''El nu a fost salvat încă!'''",
+'userinvalidcssjstitle' => '<b>Avertizare:</b> Nu există skin "$1". Amintește-ți că paginile .css and .js specifice utilizatorilor au titluri care încep cu literă mică, de exemplu {{ns:user}}:Foo/vector.css în comparație cu {{ns:user}}:Foo/Vector.css.',
'updated' => '(Actualizat)',
'note' => "'''Notă:'''",
'previewnote' => "Aceasta este doar o previzualizare! Pentru a salva pagina în forma actuală, descrieți succint modificările efectuate și apăsați butonul '''Salvează pagina'''.",
@@ -937,7 +943,6 @@ De asemenea, ne asigurați că ceea ce ați scris a fost compoziție proprie sau
Dacă nu doriți ca ceea ce scrieți să fie modificat fără milă și redistribuit în voie, atunci nu trimiteți materialele respective aici.<br />
De asemenea, ne asigurați că ceea ce ați scris a fost compoziție proprie sau copie dintr-o resursă publică sau liberă (vedeți $1 pentru detalii).
'''NU INTRODUCEÅ¢I MATERIALE CU DREPTURI DE AUTOR FÄ‚RÄ‚ PERMISIUNE!'''",
-'longpagewarning' => "'''ATENŢIE! Conținutul acestei pagini are $1 kB; unele browsere au probleme la modificarea paginilor în jur de 32 kB sau mai mari. Te rugăm să iei în considerare posibilitatea de a împărți pagina în mai multe secțiuni.'''",
'longpageerror' => "'''EROARE: Textul pe care vrei să-l salvezi are $1 kilobytes,
ceea ce înseamnă mai mult decât maximum de $2 kilobytes. Salvarea nu este posibilă.'''",
'readonlywarning' => "'''ATENŢIE: Baza de date a fost blocată pentru întreținere, deci nu veți putea salva modificările în acest moment. Puteți copia textul într-un fișier text local pentru a-l salva când va fi posibil.'''
@@ -1114,6 +1119,8 @@ $1",
'logdelete-failure' => "'''Vizibilitatea jurnalului nu poate fi definită:'''
$1",
'revdel-restore' => 'Schimbă vizibilitatea',
+'revdel-restore-deleted' => 'versiuni șterse',
+'revdel-restore-visible' => 'versiuni vizibile',
'pagehist' => 'Istoricul paginii',
'deletedhist' => 'Istoric șters',
'revdelete-content' => 'textul versiunii',
@@ -1183,11 +1190,13 @@ Folosirea linkurilor de navigare va reseta această coloană.',
# Diffs
'history-title' => 'Istoricul versiunilor pentru „$1â€',
'difference' => '(Diferența dintre versiuni)',
+'difference-multipage' => '(Diferență între pagini)',
'lineno' => 'Linia $1:',
'compareselectedversions' => 'Compară versiunile marcate',
'showhideselectedversions' => 'Șterge/recuperează versiunile marcate',
'editundo' => 'anulare',
-'diff-multi' => '({{PLURAL:$1|O revizie intermediară neafișată|$1 revizii intermediare neafișate}})',
+'diff-multi' => '({{PLURAL:$1|O revizie intermediară|$1 revizii intermediare}} efectuată de {{PLURAL:$2|un utilizator|$2 utilizatori}} {{PLURAL:$1|neafișată|neafișate}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|O versiune intermediară efectuată de|$1 (de) versiuni intermediare efectuate de peste}} $2 {{PLURAL:$2|utilizator|utilizatori}} {{PLURAL:$1|neafișată|neafișate}})',
# Search results
'searchresults' => 'Rezultatele căutării',
@@ -1222,6 +1231,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
'searchprofile-everything-tooltip' => 'Caută în tot conținutul (incluzând paginile de discuție)',
'searchprofile-advanced-tooltip' => 'Caută în namespace-uri personalizate',
'search-result-size' => '$1 ({{PLURAL:$2|1 cuvânt|$2 cuvinte}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|element|elemente}} ($2 {{PLURAL:$2|categorie|categorii}}, $3 {{PLURAL:$3|fișier|fișiere}})',
'search-result-score' => 'Relevanță: $1%',
'search-redirect' => '(redirecționare către $1)',
'search-section' => '(secțiunea $1)',
@@ -1245,7 +1255,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
'powersearch' => 'Căutare avansată',
'powersearch-legend' => 'Căutare avansată',
'powersearch-ns' => 'Căutare în spațiile de nume:',
-'powersearch-redir' => 'Afișează redirectările',
+'powersearch-redir' => 'Afișează redirecționările',
'powersearch-field' => 'Caută după',
'powersearch-togglelabel' => 'Marchează:',
'powersearch-toggleall' => 'Tot',
@@ -1291,15 +1301,16 @@ Folosirea linkurilor de navigare va reseta această coloană.',
'prefs-editing' => 'Modificare',
'prefs-edit-boxsize' => 'Mărimea ferestrei de modificare.',
'rows' => 'Rânduri:',
-'columns' => 'Coloane',
+'columns' => 'Coloane:',
'searchresultshead' => 'Parametri căutare',
'resultsperpage' => 'Numărul de rezultate per pagină',
'contextlines' => 'Numărul de linii per rezultat',
'contextchars' => 'Numărul de caractere per linie',
'stub-threshold' => 'Valoarea minimă pentru un <a href="#" class="stub">ciot</a> (octeți):',
+'stub-threshold-disabled' => 'Dezactivat',
'recentchangesdays' => 'Numărul de zile afișate în schimbări recente:',
'recentchangesdays-max' => '(maxim {{PLURAL:$1|o zi|$1 zile}})',
-'recentchangescount' => 'Numărul modificărilor arătate implicit:',
+'recentchangescount' => 'Numărul modificărilor afișate implicit:',
'prefs-help-recentchangescount' => 'Sunt incluse schimbările recente, istoricul paginilor și jurnalele.',
'prefs-help-watchlist-token' => 'Completând această căsuță cu o cheie secretă se va genera un flux RSS pentru lista dumneavoastră de pagini urmărite.
Oricine cunoaște cheia din această căsuță va putea citi această listă, așa că alegeți o combinație sigură.
@@ -1330,6 +1341,7 @@ Aici se află o combinație generată întâmplător pe care o puteți folosi: $
'prefs-files' => 'Fișiere',
'prefs-custom-css' => 'CSS personalizat',
'prefs-custom-js' => 'JS personalizat',
+'prefs-common-css-js' => 'Pagini CSS și JavaScript comune pentru toate interfețele:',
'prefs-reset-intro' => 'Poți folosi această pagină pentru a reseta preferințele la valorile implicite.
Acțiunea nu este reversibilă.',
'prefs-emailconfirm-label' => 'Confirmare e-mail:',
@@ -1368,9 +1380,15 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'prefs-advancedrendering' => 'Opțiuni avansate',
'prefs-advancedsearchoptions' => 'Opțiuni avansate',
'prefs-advancedwatchlist' => 'Opțiuni avansate',
-'prefs-display' => 'Opțiuni afișare',
+'prefs-displayrc' => 'Opțiuni de afișare',
+'prefs-displaysearchoptions' => 'Opțiuni de afișare',
+'prefs-displaywatchlist' => 'Opțiuni de afișare',
'prefs-diffs' => 'Diferențe',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Adresa de e-mail pare validă',
+'email-address-validity-invalid' => 'Introduceți o adresă de e-mail validă',
+
# User rights
'userrights' => 'Administrarea permisiunilor de utilizator',
'userrights-lookup-user' => 'Administrare grupuri de utilizatori',
@@ -1454,6 +1472,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'right-hideuser' => 'Blochează un nume de utilizator, ascunzându-l de public',
'right-ipblock-exempt' => 'Nu au fost afectați de blocarea făcută IP-ului.',
'right-proxyunbannable' => 'Treci peste blocarea automată a proxy-urilor',
+'right-unblockself' => 'Se deblochează singur',
'right-protect' => 'Schimbă nivelurile de protejare și modifică pagini protejate',
'right-editprotected' => 'Modificare pagini protejate (fără protejare în cascadă)',
'right-editinterface' => 'Modificare interfața cu utilizatorul',
@@ -1476,7 +1495,6 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'right-siteadmin' => 'Blochează și deblochează baza de date',
'right-reset-passwords' => 'Resetarea parolelor altor utilizatori',
'right-override-export-depth' => 'Exportă inclusiv paginile legate până la o adâncime de 5',
-'right-versiondetail' => 'Arată informații extise despre versiunea programului',
'right-sendemail' => 'Trimite e-mail altor utilizatori',
# User rights log
@@ -1527,14 +1545,9 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'recentchanges-legend' => 'Opțiuni schimbări recente',
'recentchangestext' => 'Urmăriți în această pagină cele mai recente modificări de pe site.',
'recentchanges-feed-description' => 'Urmărește cele mai recente schimbări folosind acest flux.',
-'recentchanges-label-legend' => 'Legendă: $1.',
-'recentchanges-legend-newpage' => '$1 - pagină nouă',
'recentchanges-label-newpage' => 'Această modificare a creat o pagină nouă',
-'recentchanges-legend-minor' => '$1 - modificare minoră',
'recentchanges-label-minor' => 'Aceasta este o modificare minoră',
-'recentchanges-legend-bot' => '$1 - modificare efectuată de un robot',
'recentchanges-label-bot' => 'Această modificare a fost efectuată de un robot',
-'recentchanges-legend-unpatrolled' => '$1 - modificare nepatrulată',
'recentchanges-label-unpatrolled' => 'Această modificare nu a fost patrulată încă',
'rcnote' => "Mai jos se află {{PLURAL:$|ultima modificare|ultimele '''$1''' modificări}} din {{PLURAL:$2|ultima zi|ultimele '''$2''' zile}}, începând cu $5, $4.",
'rcnotefrom' => 'Dedesubt sunt modificările de la <b>$2</b> (maxim <b>$1</b> de modificări sunt afișate - schimbă numărul maxim de linii alegând altă valoare mai jos).',
@@ -1586,6 +1599,8 @@ Paginile pe care le [[Special:Watchlist|urmăriți]] apar în '''aldine'''.",
'upload_directory_missing' => 'Directorul în care sunt încărcate fișierele ($1) lipsește și nu poate fi creat de serverul web.',
'upload_directory_read_only' => 'Directorul de încărcare ($1) nu poate fi scris de server.',
'uploaderror' => 'Eroare la trimitere fișier',
+'upload-recreate-warning' => "'''Atenție, un fișier cu același nume a fost șters sau redenumit.'''
+Iată aici înregistrările relevante din jurnalul de ștergeri și redenumiri:",
'uploadtext' => "Utilizați formularul de mai jos pentru a trimite fișiere.
Pentru a vizualiza sau căuta imagini deja trimise, mergeți la [[Special:FileList|lista cu imagini]]; (re)încărcările și ștergerile sunt de asemenea înregistrate în [[Special:Log/upload|jurnalul fișierelor trimise]], respectiv [[Special:Log/delete|jurnalul fișierelor șterse]].
@@ -1620,6 +1635,17 @@ Vezi [[Special:NewFiles|galeria fișierelor noi]] pentru o mai bună vizualizare
'filetype-banned-type' => "'''\".\$1\"''' este un tip de fișier nepermis.
{{PLURAL:\$3|Tip de fișier permis:|Tipuri de fișiere permise:}} \$2.",
'filetype-missing' => 'Fișierul nu are extensie (precum ".jpg").',
+'empty-file' => 'Fișierul pe care l-ați trimis este gol.',
+'file-too-large' => 'Fișierul pe care l-ați trimis este prea mare.',
+'filename-tooshort' => 'Numele fișierului este prea scurt.',
+'filetype-banned' => 'Acest tip de fișier este interzis.',
+'verification-error' => 'Fișierul nu a trecut testele.',
+'hookaborted' => 'Modificarea pe care ați încercat s-o faceți a fost oprită de apelul unei extensii.',
+'illegal-filename' => 'Numele de fișier nu este permis.',
+'overwrite' => 'Nu este permisă suprascrierea unui fișier existent.',
+'unknown-error' => 'S-a produs o eroare necunoscută.',
+'tmp-create-error' => 'Nu s-a putut crea un fișier temporar.',
+'tmp-write-error' => 'Eroare de scriere la un fișier temporar.',
'large-file' => 'Este recomandat ca fișierele să nu fie mai mari de $1; acest fișier are $2.',
'largefileserver' => 'Fișierul este mai mare decât este configurat serverul să permită.',
'emptyfile' => 'Fișierul pe care l-ați încărcat pare a fi gol. Aceasta poate fi datorită unei greșeli în numele fișierului. Verificați dacă într-adevăr doriți să încărcați acest fișier.',
@@ -1644,13 +1670,14 @@ Mergeți înapoi și încărcați acest fișier sub un nume nou. [[File:$1|thumb
'fileexists-shared-forbidden' => 'Un fișier cu acest nume există deja în magazia de imagini comune; mergeți înapoi și încărcați fișierul sub un nou nume. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Acest fișier este dublura {{PLURAL:$1|fișierului|fișierelor}}:',
'file-deleted-duplicate' => 'Un fișier identic cu acesta ([[:$1]]) a fost șters anterior. Verificați istoricul ștergerilor fișierului înainte de a-l reîncărca.',
-'successfulupload' => 'Fișierul a fost trimis',
'uploadwarning' => 'Avertizare la trimiterea fișierului',
'uploadwarning-text' => 'Vă rugăm să modificați descrierea fișierului mai jos și să încercați din nou.',
'savefile' => 'Salvează fișierul',
'uploadedimage' => 'a trimis [[$1]]',
'overwroteimage' => 'încărcat o versiune nouă a fișierului "[[$1]]"',
'uploaddisabled' => 'Ne pare rău, trimiterea de imagini este dezactivată.',
+'copyuploaddisabled' => 'Trimiterea prin URL este dezactivată.',
+'uploadfromurl-queued' => 'Fișierul a fost pus în șirul de așteptare.',
'uploaddisabledtext' => 'Încărcările de fișiere sunt dezactivate.',
'php-uploaddisabledtext' => 'Încărcarea de fișiere este dezactivată în PHP.
Vă rugăm să verificați setările din file_uploads.',
@@ -1671,6 +1698,14 @@ Vă rugăm să aveți în vedere dacă este utilă reîncărcarea acestuia.
Jurnalul pentru această ștergere este disponibil aici:",
'filename-bad-prefix' => "Numele fișierului pe care îl încărcați începe cu '''\"\$1\"''', care este un nume non-descriptiv alocat automat în general de camerele digitale.
Vă rugăm, alegeți un nume mai descriptiv pentru fișerul dumneavoastră.",
+'upload-success-subj' => 'Fișierul a fost trimis',
+'upload-success-msg' => 'Încărcarea de la [$2] s-a încheiat cu succes. Rezultatul este disponibil aici: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problemă la trimitere',
+'upload-failure-msg' => 'A apărut o problemă cu încărcarea de la [$2]:
+
+$1',
+'upload-warning-subj' => 'Avertizare la încărcare',
+'upload-warning-msg' => 'A apărut o problemă în timpul încărcării de la [$2]. Vă puteți întoarce la [[Special:Upload/stash/$1|formularul de trimitere]]pentru a corecta această problemă.',
'upload-proto-error' => 'Protocol incorect',
'upload-proto-error-text' => 'Importul de la distanță necesită adrese URL care încep cu <code>http://</code> sau <code>ftp://</code>.',
@@ -1737,6 +1772,7 @@ O apăsare pe antetul coloanei schimbă sortarea.',
'listfiles_search_for' => 'Caută imagine după nume:',
'imgfile' => 'fișier',
'listfiles' => 'Lista imaginilor',
+'listfiles_thumb' => 'Miniatură',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nume',
'listfiles_user' => 'Utilizator',
@@ -1862,8 +1898,8 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
'statistics-edits' => 'Editări de la instalarea {{SITENAME}}',
'statistics-edits-average' => 'Media editărilor pe pagină',
'statistics-views-total' => 'Număr de vizualizări',
+'statistics-views-total-desc' => 'Vizualizările paginilor inexistente și a paginilor speciale nu sunt incluse',
'statistics-views-peredit' => 'Vizualizări pe editare',
-'statistics-jobqueue' => 'Lungime [http://www.mediawiki.org/wiki/Manual:Job_queue listă de așteptare]',
'statistics-users' => '[[Special:ListUsers|Utilizatori]] înregistrați',
'statistics-users-active' => 'Utilizatori activi',
'statistics-users-active-desc' => 'Utilizatori care au efectuat o acțiune în {{PLURAL:$1|ultima zi|ultimele $1 zile}}',
@@ -1878,7 +1914,7 @@ O pagină este considerată o pagină de dezambiguizare dacă folosește formate
'doubleredirects' => 'Redirecționări duble',
'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
Fiecare rând conține legături la primele două redirecționări, precum și ținta celei de-a doua redirecționări, care este de obicei pagina țintă "reală", către care ar trebui să redirecționeze prima pagină.
-Intrările <s>tăiate</s> au fost rezolvate.',
+Intrările <del>tăiate</del> au fost rezolvate.',
'double-redirect-fixed-move' => '[[$1]] a fost mutat, acum este un redirect către [[$2]]',
'double-redirect-fixer' => 'Corector de redirecționări',
@@ -1901,6 +1937,8 @@ Intrările <s>tăiate</s> au fost rezolvate.',
'nmembers' => '$1 {{PLURAL:$1|membru|membri}}',
'nrevisions' => '{{PLURAL:$1|o revizie|$1 revizii}}',
'nviews' => '{{PLURAL:$1|o accesare|$1 accesări}}',
+'nimagelinks' => 'Utilizat pe $1 {{PLURAL:$1|pagină|pagini}}',
+'ntransclusions' => 'utilizat pe $1 {{PLURAL:$1|pagină|pagini}}',
'specialpage-empty' => 'Această pagină este goală.',
'lonelypages' => 'Pagini orfane',
'lonelypagestext' => 'La următoarele pagini nu se leagă nici o altă pagină din {{SITENAME}}.',
@@ -1958,7 +1996,7 @@ Vă rugăm să aveți în vedere faptul că alte saituri web pot avea o legătur
# Book sources
'booksources' => 'Surse de cărți',
-'booksources-search-legend' => 'Caută surse pentru cărți',
+'booksources-search-legend' => 'Căutare surse pentru cărți',
'booksources-go' => 'Salt',
'booksources-text' => 'Mai jos se află o listă de legături înspre alte situri care vând cărți noi sau vechi și care pot oferi informații suplimentare despre cărțile pe care le căutați:',
'booksources-invalid-isbn' => 'Codul ISBN oferit nu este valid; verificați dacă a fost copiat corect de la sursa originală.',
@@ -2057,34 +2095,40 @@ Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații adiționale]] de
'listgrouprights-removegroup-self-all' => 'Pot fi șterse toate grupurile din contul propriu',
# E-mail user
-'mailnologin' => 'Nu există adresă de trimitere',
-'mailnologintext' => 'Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.',
-'emailuser' => 'Trimiteți un e-mail',
-'emailpage' => 'E-mail către utilizator',
-'emailpagetext' => 'Poți folosi formularul de mai jos pentru a trimite un e-mail acestui utilizator.
+'mailnologin' => 'Nu există adresă de trimitere',
+'mailnologintext' => 'Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.',
+'emailuser' => 'Trimiteți un e-mail',
+'emailpage' => 'E-mail către utilizator',
+'emailpagetext' => 'Poți folosi formularul de mai jos pentru a trimite un e-mail acestui utilizator.
Adresa de e-mail introdusă de tine în [[Special:Preferences|preferințele de utilizator]] va apărea ca adresa expeditorului e-mail-ului, deci destinatarul va putea să îți răspundă direct.',
-'usermailererror' => 'Obiectul de mail a dat eroare:',
-'defemailsubject' => 'E-mail {{SITENAME}}',
-'noemailtitle' => 'Fără adresă de e-mail',
-'noemailtext' => 'Utilizatorul nu a specificat o adresă validă de e-mail.',
-'nowikiemailtitle' => 'Nu este permis e-mail-ul',
-'nowikiemailtext' => 'Acest utilizator a ales să nu primească e-mail-uri de la alți utilizatori.',
-'email-legend' => 'Trimite e-mail altui utilizator de la {{SITENAME}}',
-'emailfrom' => 'De la:',
-'emailto' => 'Către:',
-'emailsubject' => 'Subiect:',
-'emailmessage' => 'Mesaj:',
-'emailsend' => 'Trimite',
-'emailccme' => 'Trimite-mi pe e-mail o copie a mesajului meu.',
-'emailccsubject' => 'O copie a mesajului la $1: $2',
-'emailsent' => 'E-mail trimis',
-'emailsenttext' => 'E-mailul tău a fost trimis.',
-'emailuserfooter' => 'Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „Trimite e-mail†de la {{SITENAME}}.',
+'usermailererror' => 'Obiectul de mail a dat eroare:',
+'defemailsubject' => 'E-mail {{SITENAME}}',
+'usermaildisabled' => 'E-mail dezactivat',
+'usermaildisabledtext' => 'Nu puteți trimite e-mail altor utilizatori ai acestui wiki.',
+'noemailtitle' => 'Fără adresă de e-mail',
+'noemailtext' => 'Utilizatorul nu a specificat o adresă validă de e-mail.',
+'nowikiemailtitle' => 'Nu este permis e-mail-ul',
+'nowikiemailtext' => 'Acest utilizator a ales să nu primească e-mail-uri de la alți utilizatori.',
+'email-legend' => 'Trimite e-mail altui utilizator de la {{SITENAME}}',
+'emailfrom' => 'De la:',
+'emailto' => 'Către:',
+'emailsubject' => 'Subiect:',
+'emailmessage' => 'Mesaj:',
+'emailsend' => 'Trimite',
+'emailccme' => 'Trimite-mi pe e-mail o copie a mesajului meu.',
+'emailccsubject' => 'O copie a mesajului la $1: $2',
+'emailsent' => 'E-mail trimis',
+'emailsenttext' => 'E-mailul tău a fost trimis.',
+'emailuserfooter' => 'Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „Trimite e-mail†de la {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'a lăsat un mesaj de sistem',
+'usermessage-editor' => 'Mesager de sistem',
# Watchlist
'watchlist' => 'Pagini urmărite',
'mywatchlist' => 'Pagini urmărite',
-'watchlistfor' => "(pentru '''$1''')",
+'watchlistfor2' => 'Pentru $1 $2',
'nowatchlist' => 'Nu ați ales să urmăriți nici o pagină.',
'watchlistanontext' => 'Te rugăm să $1 pentru a vizualiza sau edita itemii de pe lista ta de urmărire.',
'watchnologin' => 'Nu sunteți autentificat',
@@ -2128,7 +2172,7 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
'enotif_anon_editor' => 'utilizator anonim $1',
'enotif_body' => 'Domnule/Doamnă $WATCHINGUSERNAME,
-Pagina $PAGETITLE de la {{SITENAME}} a fost $CHANGEDORCREATED la $PAGEEDITDATE de către $PAGEEDITOR. Vedeți la $PAGETITLE_URL versiunea curentă.
+Pagina $PAGETITLE de la {{SITENAME}} a fost $CHANGEDORCREATED în data de $PAGEEDITDATE de către $PAGEEDITOR. Vedeți la $PAGETITLE_URL versiunea curentă.
$NEWPAGE
@@ -2138,15 +2182,19 @@ Puteți contacta utilizatorul:
e-mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Nu veți mai primi notificări în cazul unor viitoare modificări în afara cazului în care vizitați pagina. Puteți de asemenea reseta notificările pentru alte pagini urmărite.
+Nu veți mai primi notificări în cazul unor viitoare modificări până când nu veți vizitați pagina.
+Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.
- Al dvs. amic, sistemul de notificare de la {{SITENAME}}
+ Al dumneavoastră amic, sistemul de notificare de la {{SITENAME}}
--
-Pentru a modifica preferințele listei de urmărire vizitați
+Pentru a modifica setările notificării prin e-mail, vizitați
+{{fullurl:{{#special:Preferences}}}}
+
+Pentru a modifica setările listei de pagini urmărite, vizitați
{{fullurl:{{#special:Watchlist}}/edit}}
-Pentru a nu mai urmări pagina vizitați
+Pentru a nu mai urmări pagina, vizitați
$UNWATCHURL
Asistență și suport:
@@ -2200,7 +2248,10 @@ Ultima editare a fost făcută de către [[User:$3|$3]] ([[User talk:$3|discuți
'revertpage-nouser' => 'Anularea modificărilor efectuate de (nume de utilizator șters) și revenirea la ultima modificare de către [[User:$1|$1]]',
'rollback-success' => 'Anularea modificărilor făcute de $1;
revenire la ultima versiune de $2.',
-'sessionfailure' => 'Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva hijack. Apăsați "back" și reîncărcați pagina de unde ați venit, apoi reîncercați.',
+
+# Edit tokens
+'sessionfailure-title' => 'Eroare de sesiune',
+'sessionfailure' => 'Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva hijack. Apăsați "back" și reîncărcați pagina de unde ați venit, apoi reîncercați.',
# Protect
'protectlogpage' => 'Jurnal protecții',
@@ -2327,19 +2378,23 @@ $1',
'month' => 'Din luna (și dinainte):',
'year' => 'Până în anul:',
-'sp-contributions-newbies' => 'Arată doar contribuțiile conturilor noi',
-'sp-contributions-newbies-sub' => 'Pentru începători',
-'sp-contributions-newbies-title' => 'Contribuțiile utilizatorului pentru conturile noi',
-'sp-contributions-blocklog' => 'jurnal blocări',
-'sp-contributions-deleted' => 'contribuțiile șterse ale utilizatorului',
-'sp-contributions-logs' => 'jurnale',
-'sp-contributions-talk' => 'discuție',
-'sp-contributions-userrights' => 'administrarea permisiunilor de utilizator',
-'sp-contributions-blocked-notice' => 'Acest utilizator este momentan blocat.
+'sp-contributions-newbies' => 'Arată doar contribuțiile conturilor noi',
+'sp-contributions-newbies-sub' => 'Pentru începători',
+'sp-contributions-newbies-title' => 'Contribuțiile utilizatorului pentru conturile noi',
+'sp-contributions-blocklog' => 'jurnal blocări',
+'sp-contributions-deleted' => 'contribuțiile șterse ale utilizatorului',
+'sp-contributions-uploads' => 'încărcări',
+'sp-contributions-logs' => 'jurnale',
+'sp-contributions-talk' => 'discuție',
+'sp-contributions-userrights' => 'administrarea permisiunilor de utilizator',
+'sp-contributions-blocked-notice' => 'Acest utilizator este momentan blocat.
Ultima blocare este indicată mai jos pentru informare:',
-'sp-contributions-search' => 'Căutare contribuții',
-'sp-contributions-username' => 'Adresă IP sau nume de utilizator:',
-'sp-contributions-submit' => 'Caută',
+'sp-contributions-blocked-notice-anon' => 'Această adresă IP este blocată acum.
+Iată aici ultima înregistrare relevantă din jurnalul blocărilor:',
+'sp-contributions-search' => 'Căutare contribuții',
+'sp-contributions-username' => 'Adresă IP sau nume de utilizator:',
+'sp-contributions-toponly' => 'Afișează numai versiunile recente',
+'sp-contributions-submit' => 'Caută',
# What links here
'whatlinkshere' => 'Ce trimite aici',
@@ -2400,7 +2455,6 @@ Vezi [[Special:IPBlockList|lista de adrese IP și conturi blocate]] pentru a rev
'ipb-edit-dropdown' => 'Modifică motivele blocării',
'ipb-unblock-addr' => 'Deblochează utilizatorul $1',
'ipb-unblock' => 'Deblocați un nume de utilizator sau o adresă IP',
-'ipb-blocklist-addr' => 'Blocări existente pentru $1',
'ipb-blocklist' => 'Vezi blocările existente',
'ipb-blocklist-contribs' => 'Contribuțiile utilizatorului $1',
'unblockip' => 'Deblochează adresă IP',
@@ -2473,6 +2527,8 @@ Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii I
Nu vă puteți crea un cont',
'cant-block-while-blocked' => 'Nu puteți bloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
'cant-see-hidden-user' => 'Utilizatorul pe care încercați să îl blocați este deja blocat și ascuns. Atata timp cât nu aveți drept de hideuser, nu puteți vedea sau modifica blocarea acestuia.',
+'ipbblocked' => 'Nu puteți bloca sau debloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
+'ipbnounblockself' => 'Nu aveți permisiunea de a vă debloca singur',
# Developer tools
'lockdb' => 'Blochează baza de date',
@@ -2515,6 +2571,17 @@ Cu alte cuvinte, veți putea muta înapoi o pagină pe care ați mutat-o greșit
'''ATENÈšIE!'''
Aceasta poate fi o schimbare drastică și neașteptată pentru o pagină populară;
vă rugăm, să vă asigurați că înțelegeți toate consecințele înainte de a continua.",
+'movepagetext-noredirectfixer' => "Completând formularul de mai jos veți redenumi o pagină, mutând tot istoricul la noul nume.
+Vechiul titlu va deveni o pagină de redirecționare către noul titlu.
+Fiți sigur că ați verificat lista redirecționărilor [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|nefuncționale]].
+Vă rugăm să rețineți că aveți responsabilitatea de a verifica dacă nu cumva destinația inițială a vechilor legături s-a modificat.
+
+Nu uitați că pagina '''nu va fi redenumită''' dacă o pagină cu noul titlul există deja, cu excepția cazurilor în care aceasta este complet goală și nu are istoric de modificări sau este o pagină de redirecționare.
+Acest lucru înseamnă că veți putea redenumi la titlul inițial o pagină greșit redenumită, dar nu veți putea suprascrie o pagină existentă.
+
+'''Atenție!'''
+Această acțiune poate determina o schimbare dramatică, neașteptată pentru o pagină cu trafic crescut;
+asigurați-vă că înțelegeți toate consecințele înainte de a continua.",
'movepagetalktext' => "Pagina asociată de discuții, dacă există, va fi mutată
automat odată cu aceasta '''afară de cazul că''':
* Mutați pagina în altă secțiune a {{SITENAME}}
@@ -2573,6 +2640,7 @@ Pagina destinație „[[:$1]]†există deja. Doriți să o ștergeți pentru a
'immobile-source-page' => 'Această pagină nu poate fi mutată.',
'immobile-target-page' => 'Nu poate fi mutat la destinația cu acest titlu.',
'imagenocrossnamespace' => 'Fișierul nu poate fi mutat la un spațiu de nume care nu este destinat fișierelor',
+'nonfile-cannot-move-to-file' => 'Entitatea (care nu este un fișier) nu poate fi mutată în spațiul de nume destinat fișierelor',
'imagetypemismatch' => 'Extensia nouă a fișierului nu se potrivește cu tipul acestuia',
'imageinvalidfilename' => 'Numele fișierului destinație este invalid',
'fix-double-redirects' => 'Actualizează toate redirecționările care trimit la titlul original',
@@ -2650,6 +2718,7 @@ Salvați-l pe calculatorul dumneavoastră și încărcați-l aici.',
'importstart' => 'Se importă paginile...',
'import-revision-count' => '$1 {{PLURAL:$1|versiune|versiuni}}',
'importnopages' => 'Nu există pagini de importat.',
+'imported-log-entries' => '{{PLURAL:$1|A fost importată $1 înregistrare de jurnal|Au fost importate $1 înregistrări de jurnal}}.',
'importfailed' => 'Import eșuat: $1',
'importunknownsource' => 'Tipul sursei de import este necunoscut',
'importcantopen' => 'Fișierul importat nu a putut fi deschis',
@@ -2746,6 +2815,8 @@ Un dosar temporar lipsește.',
'tooltip-rollback' => '„Revenire†anulează modificarea(ările) de pe această pagină a ultimului contribuitor printr-o singură apăsare',
'tooltip-undo' => '"Anulează" șterge această modificare și deschide formularul de modificare în modulul de previzualizare.
Permite adăugarea unui motiv în descrierea modificărilor',
+'tooltip-preferences-save' => 'Salvează preferințele',
+'tooltip-summary' => 'Descrieți pe scurt modificarea',
# Stylesheets
'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
@@ -2864,14 +2935,17 @@ Executându-l, sistemul dvs. poate fi compromis.",
'thumbsize' => 'Dimensiunea miniaturii:',
'widthheight' => '$1x$2',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagină|pagini}}',
-'file-info' => '(mărime fișier: $1, tip MIME: $2)',
-'file-info-size' => '($1 × $2 pixeli, mărime fișier: $3, tip MIME: $4)',
+'file-info' => 'mărime fișier: $1, tip MIME: $2',
+'file-info-size' => '$1 × $2 pixeli, mărime fișier: $3, tip MIME: $4',
'file-nohires' => '<small>Rezoluții mai mari nu sunt disponibile.</small>',
-'svg-long-desc' => '(fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3)',
+'svg-long-desc' => 'fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
'show-big-image' => 'Mărește rezoluția imaginii',
'show-big-image-thumb' => '<small>Mărimea acestei previzualizări: $1 × $2 pixeli</small>',
'file-info-gif-looped' => 'în buclă',
'file-info-gif-frames' => '$1 {{PLURAL:$1|imagine|imagini}}',
+'file-info-png-looped' => 'în buclă',
+'file-info-png-repeat' => 'redat {{PLURAL:$1|o dată|de $1 ori}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|cadru|cadre}}',
# Special:NewFiles
'newimages' => 'Galeria de imagini noi',
@@ -3029,6 +3103,7 @@ Altele vor fi ascunse implicit.
'exif-gpsareainformation' => 'Numele domeniului GPS',
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Corecția diferențială GPS',
+'exif-objectname' => 'Titlu scurt',
# EXIF attributes
'exif-compression-1' => 'Necomprimată',
@@ -3110,6 +3185,8 @@ Altele vor fi ascunse implicit.
'exif-sensingmethod-7' => 'Senzor triliniar',
'exif-sensingmethod-8' => 'Senzorul linear al culorii secvențiale',
+'exif-filesource-3' => 'Aparat de fotografiat digital',
+
'exif-scenetype-1' => 'O imagine fotografiată direct',
'exif-customrendered-0' => 'Prelucrare normală',
@@ -3186,28 +3263,28 @@ Altele vor fi ascunse implicit.
'limitall' => 'toate',
# E-mail address confirmation
-'confirmemail' => 'Confirmă adresa de e-mail',
-'confirmemail_noemail' => 'Nu aveți o adresă de e-mail validă setată la [[Special:Preferences|preferințe]].',
-'confirmemail_text' => '{{SITENAME}} solicită validarea adresei de e-mail înaintea utilizării funcțiilor specifice poștei electronice.
+'confirmemail' => 'Confirmă adresa de e-mail',
+'confirmemail_noemail' => 'Nu aveți o adresă de e-mail validă setată la [[Special:Preferences|preferințe]].',
+'confirmemail_text' => '{{SITENAME}} solicită validarea adresei de e-mail înaintea utilizării funcțiilor specifice poștei electronice.
Apăsați butonul de mai jos pentru ca un e-mail de confirmare să fie trimis către adresa dumneavoastră.
Acesta va include o legătură conținând un cod;
încărcați legătura în navigator pentru a valida adresa de e-mail.',
-'confirmemail_pending' => 'Un cod de confirmare a fost trimis deja la adresa de e-mail indicată;
+'confirmemail_pending' => 'Un cod de confirmare a fost trimis deja la adresa de e-mail indicată;
dacă ați creat recent contul, ar fi bine să așteptați câteva minute e-mailul de confirmare înainte de a cere un nou cod.',
-'confirmemail_send' => 'Trimite un cod de confirmare',
-'confirmemail_sent' => 'E-mailul de confirmare a fost trimis.',
-'confirmemail_oncreate' => 'Un cod de confirmare a fost trimis la adresa dumnevoastră de e-mail.
+'confirmemail_send' => 'Trimite un cod de confirmare',
+'confirmemail_sent' => 'E-mailul de confirmare a fost trimis.',
+'confirmemail_oncreate' => 'Un cod de confirmare a fost trimis la adresa dumnevoastră de e-mail.
Acest cod nu este necesar pentru autentificare, dar trebuie transmis înainte de activarea oricăror funcții din wiki specifice e-mailului.',
-'confirmemail_sendfailed' => 'Nu am putut trimite e-mailul de confirmare. Verificați adresa după caractere invalide.
+'confirmemail_sendfailed' => 'Nu am putut trimite e-mailul de confirmare. Verificați adresa după caractere invalide.
Serverul de mail a returnat: $1',
-'confirmemail_invalid' => 'Cod de confirmare invalid. Acest cod poate fi expirat.',
-'confirmemail_needlogin' => 'Trebuie să vă $1 pentru a vă confirma adresa de e-mail.',
-'confirmemail_success' => 'Adresa de e-mail a fost confirmată. Acum vă puteți [[Special:UserLogin|autentifica]] și bucura de wiki.',
-'confirmemail_loggedin' => 'Adresa de e-mail a fost confirmată.',
-'confirmemail_error' => 'Ceva nu a funcționat la salvarea confirmării.',
-'confirmemail_subject' => 'Confirmarea adresei de e-mail la {{SITENAME}}',
-'confirmemail_body' => 'Cineva, probabil dumneavoastră de la adresa IP $1, și-a înregistrat la {{SITENAME}} contul „$2†cu această adresă de e-mail.
+'confirmemail_invalid' => 'Cod de confirmare invalid. Acest cod poate fi expirat.',
+'confirmemail_needlogin' => 'Trebuie să vă $1 pentru a vă confirma adresa de e-mail.',
+'confirmemail_success' => 'Adresa de e-mail a fost confirmată. Acum vă puteți [[Special:UserLogin|autentifica]] și bucura de wiki.',
+'confirmemail_loggedin' => 'Adresa de e-mail a fost confirmată.',
+'confirmemail_error' => 'Ceva nu a funcționat la salvarea confirmării.',
+'confirmemail_subject' => 'Confirmarea adresei de e-mail la {{SITENAME}}',
+'confirmemail_body' => 'Cineva, probabil dumneavoastră de la adresa IP $1, și-a înregistrat la {{SITENAME}} contul „$2†cu această adresă de e-mail.
Pentru a confirma că acest cont vă aparține într-adevăr și pentru a vă activa funcțiile de e-mail de la {{SITENAME}}, accesați pagina:
@@ -3218,8 +3295,30 @@ Dacă însă NU este contul dumneavoastră, accesați pagina:
$5
Acest cod de confirmare va expira la $4.',
-'confirmemail_invalidated' => 'Confirmarea adresei de e-mail a fost anulată',
-'invalidateemail' => 'Anulează confirmarea adresei de e-mail',
+'confirmemail_body_changed' => 'Cineva, probabil dumneavoastră de la adresa IP $1, a schimbat adresa de e-mail asociată contului „$2†de la {{SITENAME}} cu adresa la care ați primit acest mesaj.
+
+Pentru a confirma că acest cont vă aparține într-adevăr și pentru a vă activa funcțiile de e-mail de la {{SITENAME}}, accesați pagina:
+
+$3
+
+Dacă însă NU este contul dumneavoastră, accesați pagina de mai jos pentru a anula modificarea:
+
+$5
+
+Acest cod de confirmare va expira la $4.',
+'confirmemail_body_set' => 'Cineva, probabil dumneavoastră de la adresa IP $1, a asociat prezenta adresă de e-mail contului „$2†de la la {{SITENAME}}.
+
+Pentru a confirma că acest cont vă aparține într-adevăr și pentru a vă reactiva funcțiile de e-mail de la {{SITENAME}}, accesați pagina:
+
+$3
+
+Dacă însă NU este contul dumneavoastră, accesați pagina de mai jos pentru a anula confirmarea adresei de e-mail:
+
+$5
+
+Acest cod de confirmare va expira la $4.',
+'confirmemail_invalidated' => 'Confirmarea adresei de e-mail a fost anulată',
+'invalidateemail' => 'Anulează confirmarea adresei de e-mail',
# Scary transclusion
'scarytranscludedisabled' => '[Transcluderea interwiki este dezactivată]',
@@ -3259,6 +3358,7 @@ Vă rugăm să confirmați faptul că într-adevăr doriți să recreați acest
'table_pager_first' => 'Prima pagină',
'table_pager_last' => 'Ultima pagină',
'table_pager_limit' => 'Arată $1 itemi pe pagină',
+'table_pager_limit_label' => 'Elemente pe pagină:',
'table_pager_limit_submit' => 'Du-te',
'table_pager_empty' => 'Nici un rezultat',
@@ -3315,6 +3415,7 @@ Puteți folosi în schimb [[Special:Watchlist/edit|editorul standard]].',
'version-specialpages' => 'Pagini speciale',
'version-parserhooks' => 'Hook-uri parser',
'version-variables' => 'Variabile',
+'version-skins' => 'Aspect',
'version-other' => 'Altele',
'version-mediahandlers' => 'Suport media',
'version-hooks' => 'Hook-uri',
@@ -3326,6 +3427,13 @@ Puteți folosi în schimb [[Special:Watchlist/edit|editorul standard]].',
'version-hook-subscribedby' => 'Subscris de',
'version-version' => '(Versiune $1)',
'version-license' => 'Licență',
+'version-poweredby-credits' => "Acest wiki este dezvoltat de '''[http://www.mediawiki.org/ MediaWiki]''', drepturi de autor © 2001-$1 $2.",
+'version-poweredby-others' => 'alții',
+'version-license-info' => 'MediaWiki este un software liber pe care îl puteți redistribui și/sau modifica sub termenii Licenței Publice Generale GNU publicată de Free Software Foundation – fie a doua versiune a acesteia, fie, la alegerea dumneavoastră, orice altă versiune ulterioară.
+
+MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GARANȚIE, nici măcar cea implicită de COMERCIALIZARE sau de ADAPTARE PENTRU UN UN SCOP ANUME. Vedeți Licența Publică Generală GNU pentru mai multe detalii.
+
+În cazul în care nu ați primit [{{SERVER}}{{SCRIPTPATH}}/COPYING o copie a Licenței Publice Generale GNU] împreună cu acest program, scrieți la Free Software Foundation, Inc, 51, Strada Franklin, etajul cinci, Boston, MA 02110-1301, Statele Unite ale Americii sau [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html citiți-o online].',
'version-software' => 'Software instalat',
'version-software-product' => 'Produs',
'version-software-version' => 'Versiune',
@@ -3396,6 +3504,15 @@ Introdu numele fișierului fără prefixul "{{ns:file}}:".',
'tags-edit' => 'modificare',
'tags-hitcount' => '$1 {{PLURAL:$1|modificare|modificări}}',
+# Special:ComparePages
+'comparepages' => 'Comparație între pagini',
+'compare-selector' => 'Comparație între versiuni',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versiunea 1',
+'compare-rev2' => 'Versiunea 2',
+'compare-submit' => 'Comparație',
+
# Database error messages
'dberr-header' => 'Acest site are o problemă',
'dberr-problems' => 'Ne cerem scuze! Acest site întâmpină dificultăți tehnice.',
@@ -3412,8 +3529,13 @@ Introdu numele fișierului fără prefixul "{{ns:file}}:".',
'htmlform-float-invalid' => 'Valoarea specificată nu este un număr.',
'htmlform-int-toolow' => 'Valoarea specificată este sub maximul $1',
'htmlform-int-toohigh' => 'Valoarea specificată este peste maximul $1',
+'htmlform-required' => 'Completare obligatorie',
'htmlform-submit' => 'Trimite',
'htmlform-reset' => 'Anulează modificările',
'htmlform-selectorother-other' => 'Altul',
+# SQLite database support
+'sqlite-has-fts' => '$1 cu suport de căutare în tot textul',
+'sqlite-no-fts' => '$1 fără suport de căutare în tot textul',
+
);
diff --git a/languages/messages/MessagesRoa_rup.php b/languages/messages/MessagesRoa_rup.php
index 7ba99190..1d49ad6a 100644
--- a/languages/messages/MessagesRoa_rup.php
+++ b/languages/messages/MessagesRoa_rup.php
@@ -99,7 +99,7 @@ Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {
'yourname' => 'Numa di ufilizitor:',
'yourpassword' => 'Cljao:',
'yourpasswordagain' => 'Bãgats-u cljao iara:',
-'remembermypassword' => 'Apurã-u ligãtura-a mea pi compiuterlu aistu',
+'remembermypassword' => 'Apurã-u ligãtura-a mea pi compiuterlu aistu (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Ligats-vã',
'userlogin' => 'Ligats-vã / Fãtsets Isape',
'logout' => 'Disligats-vã',
diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php
index 84af15cf..81edcbf7 100644
--- a/languages/messages/MessagesRoa_tara.php
+++ b/languages/messages/MessagesRoa_tara.php
@@ -37,8 +37,7 @@ $messages = array(
'tog-editsection' => 'Abilite le cangiaminde a sezione ausanne [cange]',
'tog-editsectiononrightclick' => "Abilite le cngiaminde d'a sezione ausanne 'u pulsande destre d'u mouse cazzanne sus a 'u titele (Javascript)",
'tog-showtoc' => "Fa vedè 'a taggelle de le condenute (pe le pàggene cu cchiù de 3 testete)",
-'tog-rememberpassword' => "Arrecuèrdete 'u nome mije sus a stu computer",
-'tog-editwidth' => "Scianghe 'a scatele de le cangiaminde pe fà anghjiè tutte 'u scherme",
+'tog-rememberpassword' => "Arrencuerdete 'u nome mije sus a stu browser (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
'tog-watchcreations' => "Mitte le pàggene ca je agghje ccrejete jndr'à le pàggene condrollete",
'tog-watchdefault' => "Mitte le pàggene ca je agghje cangete jndr'à le pàggene condrolleteAdd pages I edit to my watchlist",
'tog-watchmoves' => "Mitte le pàggene ca je agghje spustete jndr'à le pàggene condrollete",
@@ -184,31 +183,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => "Aggiunge 'na discussiona",
-'vector-action-delete' => 'Scangille',
-'vector-action-move' => 'Spuèste',
-'vector-action-protect' => 'Protegge',
-'vector-action-undelete' => 'Repristine',
-'vector-action-unprotect' => 'Sprotegge',
-'vector-namespace-category' => 'Categorije',
-'vector-namespace-help' => "Pàgene d'aijute",
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pàgene',
-'vector-namespace-media' => 'Pàgene de le media',
-'vector-namespace-mediawiki' => 'Messagge',
-'vector-namespace-project' => 'Pàgene de pruggette',
-'vector-namespace-special' => 'Pàgena speciale',
-'vector-namespace-talk' => "'Ngazzamende",
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => "Pàgena de l'utende",
-'vector-view-create' => 'Ccreje',
-'vector-view-edit' => 'Cange',
-'vector-view-history' => "Vide 'u cunde",
-'vector-view-view' => 'Ligge',
-'vector-view-viewsource' => "Vide 'u sorgende",
-'actions' => 'Aziune',
-'namespaces' => 'Namespace',
-'variants' => 'Variande',
+'vector-action-addsection' => "Aggiunge 'na discussiona",
+'vector-action-delete' => 'Scangille',
+'vector-action-move' => 'Spuèste',
+'vector-action-protect' => 'Protegge',
+'vector-action-undelete' => 'Repristine',
+'vector-action-unprotect' => 'Sprotegge',
+'vector-simplesearch-preference' => "Abbilete le suggereminde d'a ricerche avanzate (Sulamende pe le scheme a vettore)",
+'vector-view-create' => 'Ccreje',
+'vector-view-edit' => 'Cange',
+'vector-view-history' => "Vide 'u cunde",
+'vector-view-view' => 'Ligge',
+'vector-view-viewsource' => "Vide 'u sorgende",
+'actions' => 'Aziune',
+'namespaces' => 'Namespace',
+'variants' => 'Variande',
'errorpagetitle' => 'Errore',
'returnto' => 'Tuerne a $1.',
@@ -269,6 +258,9 @@ Troppe utinde stonne a provene a vedè sta pàgene.
Pe piacere aspitte 'nu picche e pò pruève 'n'otra vote a trasè jndr'à sta pàgene.
$1",
+'pool-timeout' => "Tiembe d'attese scadute pu 'u blocche",
+'pool-queuefull' => "'A code de le sondagge jè chiene",
+'pool-errorunknown' => 'Errore scanusciute',
# 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' => 'Sus a {{SITENAME}}',
@@ -440,7 +432,8 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
'yourname' => 'Nome utende:',
'yourpassword' => 'Passuord:',
'yourpasswordagain' => "Scrive 'a passuord notra vote:",
-'remembermypassword' => "Arrencuerdete 'u nome mie sus a stu combiuter",
+'remembermypassword' => "Arrencuerdete 'u nome mije sus a stu combiuter (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
+'securelogin-stick-https' => "Statte collegate ô HTTPS apprisse 'a trasute",
'yourdomainname' => "'U nome d'u dominie tue:",
'externaldberror' => "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
'login' => 'Tràse',
@@ -457,6 +450,7 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
'gotaccount' => "Tine già 'nu cunde? '''$1'''.",
'gotaccountlink' => 'Tràse',
'createaccountmail' => 'pe e-mail',
+'createaccountreason' => 'Mutive:',
'badretype' => 'Le passuord ca è scritte non ge sonde uguale.',
'userexists' => "'U nome de l'utende ca è scritte jè già ausete.
Mittene n'otre.",
@@ -487,6 +481,7 @@ Prueve n'otra vote.",
Mitta n'otra vota.",
'passwordtooshort' => 'Le password onne a essere almene {{PLURAL:$1|1 carattere|$1 carattere}}.',
'password-name-match' => "'A password toje adda essere diverse da 'u nome utende tue.",
+'password-login-forbidden' => "L'ause de stu nome utende e passuord onne state vietate.",
'mailmypassword' => 'Passuord nova pe e-mail',
'passwordremindertitle' => 'Passuord temboranea nova pe {{SITENAME}}',
'passwordremindertext' => "Quacchedune (pò essere tu, da quiste indirizze IP \$1) ha cerchete 'na nova password pe {{SITENAME}} (\$4).
@@ -527,6 +522,9 @@ Pe piacere vide c'aspitte 'nu picche de timbe apprime de pruvà 'n'otra vote.",
'loginlanguagelabel' => 'Lénga: $1',
'suspicious-userlogout' => "'A richiesta toje de assè ha state bloccate purcè pare ca ha state mannate da 'nu browser scuasciate o da 'a cache de 'nu proxy.",
+# E-mail sending
+'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
+
# Password reset dialog
'resetpass' => "Cange 'a password",
'resetpass_announce' => "Tu tè colleghete cu 'nu codece mannete pe e-mail temboranee.
@@ -580,11 +578,12 @@ Pò essere ca tu è già cangete 'a password toje o è richieste una temboranea
'showdiff' => 'Fa vedè le cangiaminde',
'anoneditwarning' => "'''Attenziò:''' Tu non ge sinde colleghete..
L'indirizze IP tue avène reggistrete jndr'à le cangiaminde de sta pàgene.",
+'anonpreviewwarning' => "''Tu non ge sì collegate. Reggistranne le cangiaminde jndr'à sta pàgene iesse l'indirizze IP tune jndr'à storie.''",
'missingsummary' => "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu riepileghe de le cangiaminde.
Ce tu cazze Reggistre 'n'otra vote, 'u cangiamende tue avène memorizzete senze une.",
'missingcommenttext' => "Pe piacere mitte 'nu commende aqquà sotte.",
'missingcommentheader' => "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu soggette/testate pe stu commende.
-Ce tu cazze Reggistre 'n'otra vote, 'u cangiamende tue avène memorizzete senze une.",
+Ce tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
'summary-preview' => "Andeprime d'u riepileghe:",
'subject-preview' => "Andeprime de l'Oggette/Testete:",
'blockedtitle' => "L'utende è blocchete",
@@ -663,8 +662,12 @@ L'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
'''Non g'à state angore reggistrete ninde!'''",
'userjspreview' => "'''Arrecuerdete ca tu ste vide/teste sulamende in andeprime 'u JavaScript tue.'''
'''Non g'à state angore reggistrete ninde!'''",
+'sitecsspreview' => "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tune.'''
+'''Non g'à state angore reggistrate ninde!'''",
+'sitejspreview' => "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u codece JavaScript tune.'''
+'''Non g'à state angore reggistrate ninde!'''",
'userinvalidcssjstitle' => "'''Attenziò:''' Non ge stè 'nu skin \"\$1\".
-Arrecuerdete ca jndr'à le file personalizzete .css e .js s'ause scrivere le titele cu le lettere piccenne, pe esembie {{ns:user}}:Foo/monobook.css è diverse da {{ns:user}}:Foo/Monobook.css.",
+Arrecuerdete ca jndr'à le file personalizzete .css e .js s'ause scrivere le titele cu le lettere piccenne, pe esembie {{ns:user}}:Foo/vector.css è diverse da {{ns:user}}:Foo/Vector.css.",
'updated' => '(Cangiete)',
'note' => "'''Vide Bbuene:'''",
'previewnote' => "'''Queste è sole 'n'andeprime;
@@ -706,9 +709,6 @@ Tu na promettere pure ca le cose ca scrive tu, sonde 'mbormaziune libbere o copi
Ce tu non ge vuè ca quidde ca scrive avène cangete da tre, allore non scè scrivenne proprie aqquà.<br />
Tu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o lè cupiate da risorse de pubbliche dominie o sembre robba libbere (vide $1 pe cchiù dettaglie).
'''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
-'longpagewarning' => "'''ATTENZIO': Sta pàgene jè longhe $1 kilobyte;
-certe brauser ponne avè probleme quanne vuè cu cange pàggene ca sonde granne cchiù o mene 32 KB.
-Pe piacere considere de cangià 'a pàgene a stuezze stuezze ausanne le sezione.'''",
'longpageerror' => "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe $1 kilobyte, invece 'u limite massime jè de $2 kilobyte.'''
Non ge puè reggistrà sta pàggene.",
'readonlywarning' => "'''FA ATTENZIO': 'U database ha state bloccate pe manutenziona, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''
@@ -887,6 +887,8 @@ $1",
'logdelete-failure' => "'''L'archivije d'a visibbilità non ge pò essere 'mbostate:'''
$1",
'revdel-restore' => "Cange 'a visibilità",
+'revdel-restore-deleted' => 'revisiune scangellate',
+'revdel-restore-visible' => 'Revisiune visibbele',
'pagehist' => "Storie d'a vôsce",
'deletedhist' => "Storie d'u scangellamende",
'revdelete-content' => 'condenute',
@@ -956,11 +958,13 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
# Diffs
'history-title' => 'Liste de le versiune de "$1"',
'difference' => "(Differenze 'mbrà versiune)",
+'difference-multipage' => "(Differenze 'mbrà le pàggene)",
'lineno' => 'Linea $1:',
'compareselectedversions' => 'Combronde le versiune selezionete',
'showhideselectedversions' => 'Fà vedè/scunne le revisiune selezionate',
'editundo' => 'annulle',
-'diff-multi' => "({{PLURAL:$1|'na versione de mmienze|$1 cchiù versiune de mmienze}} non ge se vèdene.)",
+'diff-multi' => "({{PLURAL:$1|'na versione de mmienze|$1 cchiù versiune de mmienze}} de {{PLURAL:$2|'n'utende|$2 utinde}} non ge se vèdene)",
+'diff-multi-manyusers' => "({{PLURAL:$1|'Na revisione de 'mmienze|$1 revisiune de 'mmienze}} non g'è viste da cchiù de $2 {{PLURAL:$2|utende|utinde}})",
# Search results
'searchresults' => "Resultete d'a ricerche",
@@ -995,6 +999,7 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
'searchprofile-everything-tooltip' => "Cirche jndr'à tutte le vosce (combrese le vosce de le 'ngazzaminde)",
'searchprofile-advanced-tooltip' => "Cirche jndr'à le namespace personalizzete",
'search-result-size' => '$1 ({{PLURAL:$2|1 parole|$2 parole}})',
+'search-result-category-size' => '{{PLURAL:$1|1 membre|$1 membre}} ({{PLURAL:$2|1 sottecategorije|$2 sottecategorije}}, {{PLURAL:$3|1 file|$3 file}})',
'search-result-score' => "'Mbortanze: $1%",
'search-redirect' => '(Redirette $1)',
'search-section' => '(sezione $1)',
@@ -1072,6 +1077,7 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
'contextlines' => 'Linne pe collegamende:',
'contextchars' => 'Condeste pe linee:',
'stub-threshold' => 'Soglie pe <a href="#" class="stub">collegamende stub</a> de formattazione (byte):',
+'stub-threshold-disabled' => 'Disabbilitate',
'recentchangesdays' => "Sciurne da fà vedè jndr'à le cangiaminde recende:",
'recentchangesdays-max' => '(massime $1 {{PLURAL:$1|sciurne|sciurne}})',
'recentchangescount' => 'Numere de cangiaminde da fà vedè pe default:',
@@ -1105,6 +1111,7 @@ Aqquà ste 'nu valore generate a uecchije ca tu puè ausà: $1",
'prefs-files' => 'Fails',
'prefs-custom-css' => 'CSS Personalizzete',
'prefs-custom-js' => 'JS Personalizzete',
+'prefs-common-css-js' => 'CSS/JS condivise pe tutte le sfonde:',
'prefs-reset-intro' => "Tu puè ausà sta pàgene pe azzerà le preferenze tue a quidde de default d'u site.
Quiste non ge pò essere annullate.",
'prefs-emailconfirm-label' => "Conferme de l'e-mail:",
@@ -1143,9 +1150,15 @@ Tu puè pure scacchià de lassà otre condatte ausanne l'utende tue o le pàggen
'prefs-advancedrendering' => 'Opzione avanzate',
'prefs-advancedsearchoptions' => 'Opzione avanzate',
'prefs-advancedwatchlist' => 'Opzione avanzate',
-'prefs-display' => "Fà vedè l'opzione",
+'prefs-displayrc' => "Fà vedè l'opzione",
+'prefs-displaysearchoptions' => "Fà vedè l'opzione",
+'prefs-displaywatchlist' => "Fà vedè l'opzione",
'prefs-diffs' => 'Diff',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "L'indirizze e-mail pare valide",
+'email-address-validity-invalid' => "Mitte 'n'indirizze e-mail valide",
+
# User rights
'userrights' => 'Gestione de le deritte utende',
'userrights-lookup-user' => "Gestisce le gruppe de l'utinde",
@@ -1230,6 +1243,7 @@ Tu puè pure scacchià de lassà otre condatte ausanne l'utende tue o le pàggen
'right-hideuser' => "Bluecche 'nu cunde utende, scunnènnele da 'u pubbliche",
'right-ipblock-exempt' => "Zumbe le blocche de l'IP, auto blocche e le blocche a indervalle",
'right-proxyunbannable' => "Zumbe automaticamende le condrolle d'u proxy",
+'right-unblockself' => 'Sbluecche lore',
'right-protect' => 'Cange le levèelle de protezione e cange le pàggene prutette',
'right-editprotected' => 'Cange le pàggene prutette (senza protezzione a cascata)',
'right-editinterface' => "Cange l'inderfacce utende",
@@ -1252,7 +1266,6 @@ Tu puè pure scacchià de lassà otre condatte ausanne l'utende tue o le pàggen
'right-siteadmin' => "Blocche e sblocche 'u database",
'right-reset-passwords' => "Azzere l'otre password de l'utinde",
'right-override-export-depth' => "L'esportazione de pàggene inglude pàggene collegate 'mbonde a 'na profonnetà de 5",
-'right-versiondetail' => "Fà vedè le 'mbormaziune d'a versione estese d'u software",
'right-sendemail' => "Manne 'a mail a otre utinde",
# User rights log
@@ -1303,14 +1316,9 @@ Tu puè pure scacchià de lassà otre condatte ausanne l'utende tue o le pàggen
'recentchanges-legend' => 'Opzione pe le cangiaminde recende',
'recentchangestext' => 'Tracce le cchiù recednde cangiaminde de Uicchi sus a sta pàgene.',
'recentchanges-feed-description' => "Tracce le urteme cangiaminde sus 'a sta Uicchipedie jndr'à quiste feed.",
-'recentchanges-label-legend' => 'Legende: $1',
-'recentchanges-legend-newpage' => '$1 - pàgena nove',
'recentchanges-label-newpage' => "Stu cangiamende ha ccrejate 'na pàgena nove",
-'recentchanges-legend-minor' => '$1 - Cangiamende stuèdeche',
'recentchanges-label-minor' => "Quiste ète 'nu cangiamende stuèdeche",
-'recentchanges-legend-bot' => '$1 - cangiamende de bot',
'recentchanges-label-bot' => "Stu cangiamende ha state fatte da 'nu bot",
-'recentchanges-legend-unpatrolled' => '$1 - cangiamende non condrollate',
'recentchanges-label-unpatrolled' => "Stu cangiamende non g'à state angore condrollate",
'rcnote' => "Sotte {{PLURAL:$1|jè '''1''' cangiamende|sonde le urteme '''$1''' cangiaminde}} jndr'à l'urteme{{PLURAL:$2|sciurne|'''$2''' sciurne}}, jndr'à $5, $4.",
'rcnotefrom' => "Sotte stonne le cangiaminde da '''$2''' (fine a '''$1''' mustrete).",
@@ -1359,6 +1367,9 @@ Pàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grasce
'upload_directory_missing' => "'A cartelle de le carecaminde ($1) s'à perdute o pò essere ca non g'à state ccreate da 'u webserver.",
'upload_directory_read_only' => "'A cartelle d'u carecamende ($1) non ge se pò fà scrivere da 'u webserver.",
'uploaderror' => 'Errore de carecamende',
+'upload-recreate-warning' => "'''Attenziò: 'Nu file cu stu nome ha state scangellate o spustate.'''
+
+L'archivije de de scangellaminde e de le spustaminde pe sta pàgene le puè acchià aqquà:",
'uploadtext' => "Ause 'u module aqquà sotte pe carecà le file.
Pe vedè o cercà le file carecate precedendemende veje a 'a [[Special:FileList|liste de le file carecate]], le carecaminde sonde pure reggistrate jndr'à l'[[Special:Log/upload|archivije de le carecaminde]], le scangellazziune jndr'à l'[[Special:Log/delete|archivije de le scangellaminde]].
@@ -1394,6 +1405,17 @@ Pe piacere vide ce renomene 'u file e pruève a carecarle 'n'otra vote.",
'filetype-banned-type' => "'''\".\$1\"''' ète 'nu tipe de file ca non g'è permesse.
{{PLURAL:\$3|'U tipe de file permesse ète|Le tipe de file permesse sonde}} \$2.",
'filetype-missing' => '\'U file non ge tène l\'estenzione (cumme a ".jpg").',
+'empty-file' => "'U file ca tu è mannate ere vacande.",
+'file-too-large' => "'U file ca tu è mannate ere troppe luènghe.",
+'filename-tooshort' => "'U nome d'u file jè troppe curte.",
+'filetype-banned' => 'Stu tipe de file jè vietate.',
+'verification-error' => "Stu file non g'à passate 'a verifeche de le file.",
+'hookaborted' => "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'nu gange estese.",
+'illegal-filename' => "'U nome d'u file non g'è permesse.",
+'overwrite' => "'A sovrascritture de 'nu file ca esiste non ge se pò fà.",
+'unknown-error' => "'N'errore scanusciute s'a verificate.",
+'tmp-create-error' => 'Non ge pozze ccrejà file temboranèe.',
+'tmp-write-error' => "Errore scrivenne 'u file temboranèe.",
'large-file' => "Normalmende 'u file non g'adda essere cchiù granne de $1;
Stu file jè $2.",
'largefileserver' => "Stu file jè troppe gruesse pe quidde ca 'a configurazione d'u server permette.",
@@ -1423,13 +1445,14 @@ ce tu vuè angore carecà stu file, pe piacere tuèrne rrete e ause 'nu nome nuÃ
'file-exists-duplicate' => "Stu file jè 'na copie {{PLURAL:$1|d'u seguende file|de le seguende file}}:",
'file-deleted-duplicate' => "'Nu file uguale a stu file ([[:$1]]) ha state scangellate precedendemende.<br />
Avissa verificà 'a storie d'a scangellazzione d'u file apprime de condinuà a carecarle.",
-'successfulupload' => 'Carecamende sciute apposte',
'uploadwarning' => 'Avvise de carecamende',
'uploadwarning-text' => "Pe piacere cange 'a descrizione d'u file sotte e pruève 'notra vote.",
'savefile' => "Reggistre 'u file",
'uploadedimage' => 'carechete "[[$1]]"',
'overwroteimage' => 'ha state carechete \'na versiona nove de "[[$1]]"',
'uploaddisabled' => 'Carecaminde disabbilitete',
+'copyuploaddisabled' => "Carecamende da l'URL disabbilitate.",
+'uploadfromurl-queued' => "'U carecamende tune ha state mise in code.",
'uploaddisabledtext' => 'Le carecaminde de le file sonde disabbilitete.',
'php-uploaddisabledtext' => "Le carecaminde de file sonde disabilitate in PHP.<br />
Pe piacere verifiche le 'mbostaziune d'u ''file_uploads''.",
@@ -1451,6 +1474,14 @@ Tu avissa considerà ce è proprie utile carecà stu file.
L'archivije de le scangellaminde pe stu file 'u iacchije aqquà pe convenienze:",
'filename-bad-prefix' => "'U nome d'u file ca tu ste careche accumenze pe '''\"\$1\"''', ca normalmende jè 'u nome ca assegne a machena fotografeche e non 'nu nome descrittive d'u file ca vuè ccu careche.
Pe piacere scacchie 'n'otre nome ca jè cchiù descrittive.",
+'upload-success-subj' => 'Carecamende sciute apposte',
+'upload-success-msg' => "'U carecamende tue da [$2] ha riuscite. Mò jè disponibbele aqquà: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => 'Careche le probbleme',
+'upload-failure-msg' => "Stave 'nu probbleme cu 'u carecamende tune da [$2]:
+
+$1",
+'upload-warning-subj' => 'Avvise de carecamende',
+'upload-warning-msg' => "Stave 'nu probbleme cu 'u carecamende tune da [$2]. Tu puè turnà rrete a 'u [[Special:Upload/stash/$1|module de carecamende]] pe aggiustà stu probbleme.",
'upload-proto-error' => 'Protocolle scorrette',
'upload-proto-error-text' => "Le carecaminde remote onne abbesogne de le URL ca accumenzene cu 'a parole <code>http://</code> o <code>ftp://</code>.",
@@ -1517,6 +1548,7 @@ Ce cazze sus a 'a testate d'a colonne cange l'arrengamende.",
'listfiles_search_for' => 'Cirche pe nome de le media:',
'imgfile' => 'file',
'listfiles' => 'Liste de le fail',
+'listfiles_thumb' => 'Miniature',
'listfiles_date' => 'Sciurne',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Utende',
@@ -1633,8 +1665,8 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
'statistics-edits' => 'Cangiaminde de le pàggene da quanne sta {{SITENAME}} ha state ccrejete',
'statistics-edits-average' => 'Cangiaminde medie pe pàgene',
'statistics-views-total' => 'Visite totele',
+'statistics-views-total-desc' => 'Le viste cu le pàggene inesistende e le pàggene speciale non ge sonde ingluse',
'statistics-views-peredit' => 'Visite pe cangiaminde',
-'statistics-jobqueue' => "Lunghezze d'a [http://www.mediawiki.org/wiki/Manual:Job_queue Code de fatije]",
'statistics-users' => '[[Special:ListUsers|Utinde reggistrete]]',
'statistics-users-active' => 'Utinde attive',
'statistics-users-active-desc' => "Sonde l'utinde ca onne fatte quacchecose jndr'à l'urteme {{PLURAL:$1|giurne|$1 giurne}}",
@@ -1649,7 +1681,7 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
'doubleredirects' => 'Ridirezionaminde a doppie',
'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
Ogne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.
-Le situaziune de <s>ingrocie</s> onne state resolte.",
+Le situaziune de <del>ingrocie</del> onne state resolte.",
'double-redirect-fixed-move' => "[[$1]] ha state spustate.
Mò s'avène redirette a [[$2]].",
'double-redirect-fixer' => 'Correttore de redirezionaminde',
@@ -1673,6 +1705,8 @@ Mò s'avène redirette a [[$2]].",
'nmembers' => '$1 {{PLURAL:$1|membre|membre}}',
'nrevisions' => '$1 {{PLURAL:$1|revisione|revisiune}}',
'nviews' => '$1 {{PLURAL:$1|visite|visite}}',
+'nimagelinks' => 'Ausate sus a $1 {{PLURAL:$1|pàgene|pàggene}}',
+'ntransclusions' => 'ausate sus a $1 {{PLURAL:$1|pàgene|pàggene}}',
'specialpage-empty' => 'Non ge stonne resultete pe stu report.',
'lonelypages' => 'Pàggene orfane',
'lonelypagestext' => "Le pàggene ca seguene non ge sonde appondute da otre pàggene o sonde escluse jndr'à otre pàggene sus a {{SITENAME}}.",
@@ -1831,34 +1865,40 @@ Ponne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus
'listgrouprights-removegroup-self-all' => "Live tutte le gruppe da 'u cunde utende mije",
# E-mail user
-'mailnologin' => 'Nisciune indirizze de invie',
-'mailnologintext' => "Tu a essere [[Special:UserLogin|collegate]] e a avè 'n'indirizze email valide jndr'à le [[Special:Preferences|preferenze]] tue pe mannà 'na mail a otre utinde.",
-'emailuser' => "Manne n'email a stu utende",
-'emailpage' => "E-mail de l'utende",
-'emailpagetext' => "Tu puè ausà 'a schermate aqquà sotte pe mannà 'n'email a stu utende.
+'mailnologin' => 'Nisciune indirizze de invie',
+'mailnologintext' => "Tu a essere [[Special:UserLogin|collegate]] e a avè 'n'indirizze email valide jndr'à le [[Special:Preferences|preferenze]] tue pe mannà 'na mail a otre utinde.",
+'emailuser' => "Manne n'email a stu utende",
+'emailpage' => "E-mail de l'utende",
+'emailpagetext' => "Tu puè ausà 'a schermate aqquà sotte pe mannà 'n'email a stu utende.
L'indirizze e-mail ca tu è 'nzerite jndr'à le [[Special:Preferences|preferenze tue]] iesse jndr'à 'u cambe \"Da\" de l'e-mail, accussìa ce riceve 'a mail sape a ce addà responnere.",
-'usermailererror' => "L'oggette ''Mail'' ha returnete 'n'errore:",
-'defemailsubject' => 'e-mail de {{SITENAME}}',
-'noemailtitle' => 'Nisciune indirizze e-mail',
-'noemailtext' => "Stu utende non g'à specificate 'n'indirizze e-mail valide.",
-'nowikiemailtitle' => 'Nisciuna e-mail è permesse',
-'nowikiemailtext' => 'Stu utende ha scacchiate de nò ricevere email da otre utinde.',
-'email-legend' => "Manne 'na mail a n'otre utende de {{SITENAME}}",
-'emailfrom' => 'Da:',
-'emailto' => 'A:',
-'emailsubject' => 'Oggette:',
-'emailmessage' => 'Messagge:',
-'emailsend' => 'Manne',
-'emailccme' => "Manneme 'n'email cu 'na copie d'u messàgge.",
-'emailccsubject' => 'Copie de le messàgge tue a $1: $2',
-'emailsent' => 'E-mail mannete',
-'emailsenttext' => "'U messagge email tue ha state mannete.",
-'emailuserfooter' => 'Sta e-mail ha state mannate da $1 a $2 da \'a funziona "E-mail a l\'utende" de {{SITENAME}}.',
+'usermailererror' => "L'oggette ''Mail'' ha returnete 'n'errore:",
+'defemailsubject' => 'e-mail de {{SITENAME}}',
+'usermaildisabled' => "L'e-mail de l'utende è disabbilitate",
+'usermaildisabledtext' => 'Tu non ge puè mannà e-mail a otre utinde sus a sta uicchi',
+'noemailtitle' => 'Nisciune indirizze e-mail',
+'noemailtext' => "Stu utende non g'à specificate 'n'indirizze e-mail valide.",
+'nowikiemailtitle' => 'Nisciuna e-mail è permesse',
+'nowikiemailtext' => 'Stu utende ha scacchiate de nò ricevere email da otre utinde.',
+'email-legend' => "Manne 'na mail a n'otre utende de {{SITENAME}}",
+'emailfrom' => 'Da:',
+'emailto' => 'A:',
+'emailsubject' => 'Oggette:',
+'emailmessage' => 'Messagge:',
+'emailsend' => 'Manne',
+'emailccme' => "Manneme 'n'email cu 'na copie d'u messàgge.",
+'emailccsubject' => 'Copie de le messàgge tue a $1: $2',
+'emailsent' => 'E-mail mannete',
+'emailsenttext' => "'U messagge email tue ha state mannete.",
+'emailuserfooter' => 'Sta e-mail ha state mannate da $1 a $2 da \'a funziona "E-mail a l\'utende" de {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => "Lassanne 'nu messagge de sisteme.",
+'usermessage-editor' => 'Messaggiatore de sisteme',
# Watchlist
'watchlist' => 'Pàggene condrollete',
'mywatchlist' => 'Pàggene condrollete',
-'watchlistfor' => "(pe '''$1''')",
+'watchlistfor2' => 'Pe $1 $2',
'nowatchlist' => "Non ge tine pàggene jndr'à liste de le pàggene condrollete.",
'watchlistanontext' => 'Pe piacere $1 pe vedè o cangià le vosce sus a liste de le pàggene condrollete.',
'watchnologin' => 'Non ge sinde colleghete',
@@ -1903,7 +1943,7 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
'enotif_body' => 'Care $WATCHINGUSERNAME,
-\'A pàgene $PAGETITLE de {{SITENAME}} ha state $CHANGEDORCREATED \'u $PAGEEDITDATE da $PAGEEDITOR, vide $PAGETITLE_URL pa versiona corrende.
+\'A pàgene $PAGETITLE de {{SITENAME}} ha state $CHANGEDORCREATED \'u $PAGEEDITDATE da $PAGEEDITOR, vide $PAGETITLE_URL pa revisione corrende.
$NEWPAGE
@@ -1914,12 +1954,15 @@ mail: $PAGEEDITOR_EMAIL
uicchi: $PAGEEDITOR_WIKI
Non ge stonne otre notifiche ce tu face otre cangiaminde senza ca tu visite sta pàgene.
-Tu puè pure azzerà \'a spunde de le notifiche pe tutte le pàggene condrollete jndr\'à lista toje.
+Tu puè pure azzerà \'a spunde de le notifiche pe tutte le pàggene condrollate jndr\'à lista toje.
Statte Bbuene, \'u sisteme de notificaziune de {{SITENAME}}
--
-Pe cangià le \'mbostaziune d\'a liste de le pàggene condrollete tue, vè vide
+Pe cangià le \'mbostaziune de notifeche de l\'email toje, vè vide
+{{fullurl:{{#special:Preferences}}}}
+
+Pe cangià le \'mbostaziune de l\'elenghe de le pàggene condrollate tune, vè vide
{{fullurl:{{#special:Watchlist}}/edit}}
Pe scangellà \'a pàgene da \'a liste de le pàggene condrollate, vè vide
@@ -1981,7 +2024,10 @@ L'urteme cangiamende d'a pàgene ere de [[User:$3|$3]] ([[User talk:$3|'Ngazzami
'revertpage-nouser' => "Le cangiaminde annullate ba (nome utende luate) a l'urtema revisione da [[User:$1|$1]]",
'rollback-success' => "Cangiaminde annullate da $1;
turnate rete a l'urtema versione da $2.",
-'sessionfailure' => "Pare ca stonne probbleme cu 'a sessiona toje de collegamende;
+
+# Edit tokens
+'sessionfailure-title' => 'Sessione fallite',
+'sessionfailure' => "Pare ca stonne probbleme cu 'a sessiona toje de collegamende;
st'azione ha state scangellate pe precauzione condre a le 'ngasinaminde d'a sessione.
Pe piacere cazze \"rete\" e recareche 'a pàgene da addò tu è venute e pruève 'n'otra vote.",
@@ -2120,18 +2166,22 @@ $1",
'month' => "Da 'u mese (e cchiù recende):",
'year' => "Da l'anne (e cchiù recende):",
-'sp-contributions-newbies' => 'Fà vedè sulamende le condrebbute de le utinde nueve',
-'sp-contributions-newbies-sub' => "Pe l'utinde nuève",
-'sp-contributions-newbies-title' => "Condrebbute de l'utinde pe le cunde utinde nuéve",
-'sp-contributions-blocklog' => 'Archivije de le Bloccaminde',
-'sp-contributions-deleted' => "condrebbute de l'utende scangellate",
-'sp-contributions-logs' => 'archivije',
-'sp-contributions-talk' => 'parle',
-'sp-contributions-userrights' => 'Gestione de le deritte utende',
-'sp-contributions-blocked-notice' => "Stu utende jè pe mò bloccate. L'urteme archivije de le bloccaminde se iacchie aqquà sotte pe referimende:",
-'sp-contributions-search' => 'Ricerche pe condrebbute',
-'sp-contributions-username' => "Indirizze IP o nome de l'utende:",
-'sp-contributions-submit' => 'Cirche',
+'sp-contributions-newbies' => 'Fà vedè sulamende le condrebbute de le utinde nueve',
+'sp-contributions-newbies-sub' => "Pe l'utinde nuève",
+'sp-contributions-newbies-title' => "Condrebbute de l'utinde pe le cunde utinde nuéve",
+'sp-contributions-blocklog' => 'Archivije de le Bloccaminde',
+'sp-contributions-deleted' => "condrebbute de l'utende scangellate",
+'sp-contributions-uploads' => 'carecaminde',
+'sp-contributions-logs' => 'archivije',
+'sp-contributions-talk' => 'parle',
+'sp-contributions-userrights' => 'Gestione de le deritte utende',
+'sp-contributions-blocked-notice' => "Stu utende jè pe mò bloccate. L'urteme archivije de le bloccaminde se iacchie aqquà sotte pe referimende:",
+'sp-contributions-blocked-notice-anon' => "Stu indirizze IP jè pe mò bloccate.<br />
+L'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
+'sp-contributions-search' => 'Ricerche pe condrebbute',
+'sp-contributions-username' => "Indirizze IP o nome de l'utende:",
+'sp-contributions-toponly' => "Sulamende facenne vedè le cangiaminde de l'urteme revisiune",
+'sp-contributions-submit' => 'Cirche',
# What links here
'whatlinkshere' => 'Appondene aqquà',
@@ -2193,7 +2243,6 @@ Vide [[Special:IPBlockList|'a liste de le IP bloccate]] pe revedè le blocche.",
'ipb-edit-dropdown' => "Cange le mutive d'u blocche",
'ipb-unblock-addr' => 'Sblocche $1',
'ipb-unblock' => 'Sblocche nome utende o indirizze IP',
-'ipb-blocklist-addr' => 'Vide le blocche ca esistene pe $1',
'ipb-blocklist' => 'Vide le blocche ca esistene',
'ipb-blocklist-contribs' => 'Condrebbute pe $1',
'unblockip' => "Sblocche l'utende",
@@ -2270,6 +2319,8 @@ Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbor
Tu nonge puè ccrejà 'nu cunde utende",
'cant-block-while-blocked' => 'Tu non ge puè bloccà otre utinde quanne tu si blocchete.',
'cant-see-hidden-user' => "L'utende ca tu ste pruève a bloccà ha state già bloccate e scunnute. Ce tu non ge tine le deritte ''hideuser'', tu non ge puè vedè o cangià 'u blocche de l'utende.",
+'ipbblocked' => 'Tu non ge puè bloccà o sbloccà otre utinde, purcé tu sì ppure bloccate',
+'ipbnounblockself' => "Non ge t'è permesse de sbloccarte da sule",
# Developer tools
'lockdb' => 'Blocche databeise',
@@ -2308,6 +2359,17 @@ Quieste significhe ca tu puè fà turnà 'u vecchie nome 'a pàgene ce jedde ha
'''ATTENZIONE!'''
Quiste pò essere 'nu cangiamende drastiche e inaspettete de 'na pàgene famose assaje;
pe piacere a essere secure-secure de le conseguenze prime de procedere.",
+'movepagetext-noredirectfixer' => "Ausanne 'u module aqquà sotte puè renomenà 'na pàgene, spustanne tutte 'a storia soje sotte a 'u nome nuève.
+'U titele vecchie addevende 'na pàgene de ridirezionamende a 'u titele nuève.
+Me raccomande condrolle le redirezionaminde [[Special:DoubleRedirects|a doppie]] o [[Special:BrokenRedirects|scuasciate]].
+Tu si responsabbele de assicurarte ca le collagaminde appondene a 'u punde giuste.
+
+Vide ca 'a pàgene '''non''' g'avene spustate ce già stè 'na pàgene cu 'u titele nuève, a meno che non g'è vacande o jè 'nu ridirezionamende e non ge tène 'na storie de cangiaminde.
+Quiste signifeche ca jè possibbele renominà 'na pàgene accume se chiamave apprime addò tu è fatte 'n'errore e non g'è possibbele sovrascirevere 'na pàgene esistende.
+
+'''Fà Attenziò!'''
+Quiste pò essere 'nu cangiamende inaspettate pe 'na pàgene popolare;
+Pe piacere ha essere secure secure de avere capite le conzeguenze apprime de scè nnande.",
'movepagetalktext' => "'A pagene de le 'ngazzaminde associete avène spustete automaticamende ce però:
* Ste 'na pàgene de 'ngazzaminde chiena sotte 'a vôsce nova, o
@@ -2366,6 +2428,7 @@ non ge se pò movere 'na pàgene sus a sè stesse.",
'immobile-source-page' => 'Sta pàgene non ge se pò spustà.',
'immobile-target-page' => 'Non ge puè spustà sus a stu titele de destinazione.',
'imagenocrossnamespace' => "Non ge pozze spustà 'nu file jndr'à 'nu namespace senza file",
+'nonfile-cannot-move-to-file' => "Non ge pozze spustà 'nu file jndr'à 'nu namespace senza file",
'imagetypemismatch' => "L'estenziona nove d'u file non ge se accocchie cu 'u tipe sue",
'imageinvalidfilename' => "'U nome d'u file de destinazzione jè invalide",
'fix-double-redirects' => "Aggiorne ogne redirezionamende ca apponde a 'u titele origginale",
@@ -2446,6 +2509,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
'importstart' => "'Mbortazione de le pàggene...",
'import-revision-count' => '$1 {{PLURAL:$1|revisione|revisiune}}',
'importnopages' => "Nisciuna pàgene da 'mbortà.",
+'imported-log-entries' => "'Mbortate $1 {{PLURAL:$1|vôsce de l'archivije|vôsce de l'archivije}}.",
'importfailed' => "'Mbortaziona fallite: <nowiki>$1</nowiki>",
'importunknownsource' => "Tipe de sorgende de 'mbortaziona scanusciute",
'importcantopen' => "Non ge puè aprè 'u file 'mbortete",
@@ -2544,6 +2608,8 @@ Puè vedè sulamende 'u sorgende.",
'tooltip-rollback' => '"Ripristine" annulle le cangiaminde a sta pàgene de l\'urteme condrebbutore cu \'nu cazzamende',
'tooltip-undo' => "\"Annulle\" annulle stu cangiamende e iapre 'u form de le cangiaminde facenne vedè l'andeprime.
Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
+'tooltip-preferences-save' => 'Reggistre le preferenze',
+'tooltip-summary' => "Mitte 'nu riepileghe piccinne",
# Metadata
'nodublincore' => "'U metadata ''Dublin Core RDF'' ète disabbilitate pe stu server.",
@@ -2640,14 +2706,17 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
'imagemaxsize' => "Limite d'a dimenzione e l'immaggine:<br />''(pe le pàggene de descrizione d'u file)''",
'thumbsize' => "Dimenziona d'a miniature:",
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pàgene|pàggene}}',
-'file-info' => "(dimenzione d'u fail: $1, tipe de MIME: $2)",
-'file-info-size' => "($1 × $2 pixel, dimenzione d'u fail: $3, tipe de MIME: $4)",
+'file-info' => "dimenzione d'u fail: $1, tipe de MIME: $2",
+'file-info-size' => "$1 × $2 pixel, dimenzione d'u fail: $3, tipe de MIME: $4",
'file-nohires' => "<small>Manghe 'a risoluzione ierta.</small>",
-'svg-long-desc' => "(Fail SVG, nominalmende sonde $1 × $2 pixel, dimenzione d'u fail: $3)",
+'svg-long-desc' => "Fail SVG, nominalmende sonde $1 × $2 pixel, dimenzione d'u fail: $3",
'show-big-image' => 'Risoluzione chiena chiena',
'show-big-image-thumb' => '<small>Dimenziune de sta andeprime: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'infinite',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frame}}',
+'file-info-png-looped' => 'infinite',
+'file-info-png-repeat' => 'eseguite $1 {{PLURAL:$1|vote|vote}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frame}}',
# Special:NewFiles
'newimages' => 'Gallerie de le fail nuève',
@@ -2803,6 +2872,7 @@ Otre avènene scunnute pe defolt.
'exif-gpsareainformation' => "Nome de l'area d'u GPS",
'exif-gpsdatestamp' => "Date d'u GPS",
'exif-gpsdifferential' => "Correzzione differenziale d'u GPS",
+'exif-objectname' => 'Titele curte',
# EXIF attributes
'exif-compression-1' => 'No combresse',
@@ -2962,31 +3032,31 @@ Otre avènene scunnute pe defolt.
'limitall' => 'tutte',
# E-mail address confirmation
-'confirmemail' => "Conferme l'indirizze e-mail",
-'confirmemail_noemail' => "Tu non ge tine 'n'indirizze e-mail valide configurate sus a le [[Special:Preferences|preferenze tue]].",
-'confirmemail_text' => "{{SITENAME}} richiede ca tu ha validà l'indirizze email tue apprime de ausà 'a funzione de l'email.
+'confirmemail' => "Conferme l'indirizze e-mail",
+'confirmemail_noemail' => "Tu non ge tine 'n'indirizze e-mail valide configurate sus a le [[Special:Preferences|preferenze tue]].",
+'confirmemail_text' => "{{SITENAME}} richiede ca tu ha validà l'indirizze email tue apprime de ausà 'a funzione de l'email.
Cazze 'u buttone de sotte pe mannà 'na email de conferme a l'indirizze tue.
L'email ca t'arrive tène 'u collegamende cu 'u codece;
careche 'u collegamende jndr'à 'u browser tue pe confermà ca l'indirizze email tue è valide.",
-'confirmemail_pending' => "'Nu codece de conferme ha state già mannate a l'email toje;
+'confirmemail_pending' => "'Nu codece de conferme ha state già mannate a l'email toje;
Ce tu recendemende è ccrejate 'nu cunde utende, tu puè aspettà quacche minute ca jidde arrive e pò puè pruvà a fà 'n'otra richieste pe 'nu codece nuève.",
-'confirmemail_send' => "Manne 'nu codece de conferme",
-'confirmemail_sent' => 'E-mail de conferme mannete.',
-'confirmemail_oncreate' => "'Nu codece de conferme ha state mannate a l'indirizze e-mail tue.
+'confirmemail_send' => "Manne 'nu codece de conferme",
+'confirmemail_sent' => 'E-mail de conferme mannete.',
+'confirmemail_oncreate' => "'Nu codece de conferme ha state mannate a l'indirizze e-mail tue.
Stu codece non g'è richieste pe collegarte, ma tu n'è abbesogne de averle apprime ca tu ause quacche cose ca se base sus a l'use de le e-mail sus a Uicchi.",
-'confirmemail_sendfailed' => "{{SITENAME}} non ge pò mannà l'email toje de conferme.
+'confirmemail_sendfailed' => "{{SITENAME}} non ge pò mannà l'email toje de conferme.
Pe piacere condrolle l'indirizze email ce tène carattere invalide.
Destinatarie returnate: $1",
-'confirmemail_invalid' => "Codece de conferme invalide.
+'confirmemail_invalid' => "Codece de conferme invalide.
Pò essere ca 'u codece ha scadute.",
-'confirmemail_needlogin' => "A confermà $1 l'indirizze email ca è mise.",
-'confirmemail_success' => "L'indirizze e-mail tue ha state confermate.
+'confirmemail_needlogin' => "A confermà $1 l'indirizze email ca è mise.",
+'confirmemail_success' => "L'indirizze e-mail tue ha state confermate.
Tu, mò te puè [[Special:UserLogin|collegà]] e te puè devertì sus 'a Uicchipèdie.",
-'confirmemail_loggedin' => "L'indirizze e-mail tue ha state confermate.",
-'confirmemail_error' => "Quacchedune ha sbagliate reggistranne 'a conferma toje.",
-'confirmemail_subject' => 'Indirizze email de conferme pe {{SITENAME}}',
-'confirmemail_body' => "Quacchedune, pò essere tu, fa l'indirizze IP \$1,
+'confirmemail_loggedin' => "L'indirizze e-mail tue ha state confermate.",
+'confirmemail_error' => "Quacchedune ha sbagliate reggistranne 'a conferma toje.",
+'confirmemail_subject' => 'Indirizze email de conferme pe {{SITENAME}}',
+'confirmemail_body' => "Quacchedune, pò essere tu, fa l'indirizze IP \$1,
ha reggistrate 'nu cunde utende \"\$2\" cu st'indirizze email sus a {{SITENAME}}.
Pe confermà ca stu cunde ète avveramende 'u tue e pe attivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u borwser tue:
@@ -2998,8 +3068,32 @@ Ce tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangell
\$5
Stu codece de conferme more 'u \$4.",
-'confirmemail_invalidated' => "Conferme de l'indirizze e-mail scangellete",
-'invalidateemail' => "Scangille 'a conferme de l'e-mail",
+'confirmemail_body_changed' => "Quacchedune, pò essere tu, da l'indirizze IP \$1,
+ha cangiate l'indirizze e-mail d'u cunde utende \"\$2\" cu st'indirizze e-mail sus a {{SITENAME}}.
+
+Pe confermà ca stu cunde ète avveramende 'u tune e pe reattivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u borwser tune:
+
+\$3
+
+Ce tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:
+
+\$5
+
+Stu codece de conferme scade 'u \$4.",
+'confirmemail_body_set' => "Quacchedune, pò essere tu, da l'indirizze IP \$1,
+ha cangiate l'indirizze e-mail d'u cunde utende \"\$2\" cu st'indirizze e-mail sus a {{SITENAME}}.
+
+Pe confermà ca stu cunde ète avveramende 'u tune e pe reattivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u borwser tune:
+
+\$3
+
+Ce tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:
+
+\$5
+
+Stu codece de conferme scade 'u \$4.",
+'confirmemail_invalidated' => "Conferme de l'indirizze e-mail scangellete",
+'invalidateemail' => "Scangille 'a conferme de l'e-mail",
# Scary transclusion
'scarytranscludedisabled' => "[Collegaminde 'mbrà InterUicchi disabbilitate]",
@@ -3039,6 +3133,7 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
'table_pager_first' => 'Prima pàgene',
'table_pager_last' => 'Urtema pàgene',
'table_pager_limit' => 'Fa vedè $1 vosce pe pàgene',
+'table_pager_limit_label' => 'Vôsce pe pàggene:',
'table_pager_limit_submit' => 'Veje',
'table_pager_empty' => 'Nisciune resultete',
@@ -3096,6 +3191,7 @@ Tu puè pure [[Special:Watchlist/edit|ausà 'u cangiatore standàrd]].",
'version-specialpages' => 'Pàggene speciele',
'version-parserhooks' => 'Hook analizzature',
'version-variables' => 'Variabbele',
+'version-skins' => 'Skin',
'version-other' => 'Otre',
'version-mediahandlers' => 'Gestore de le Media',
'version-hooks' => 'Hook',
@@ -3107,6 +3203,13 @@ Tu puè pure [[Special:Watchlist/edit|ausà 'u cangiatore standàrd]].",
'version-hook-subscribedby' => 'Sottoscritte da',
'version-version' => '(Versione $1)',
'version-license' => 'Licenze',
+'version-poweredby-credits' => "Sta Uicchi jè fatte da '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'otre',
+'version-license-info' => "MediaUicchi jè 'nu softuare libbere, tu 'u puè redestribbuì e/o cangiarle sotte le termine d'a GNU (Licenze Pubbleche Generale) cumme pubblecate da 'a Free Software Foundation; endrambe le versiune 2 d'a Licenze, o (a scelta toje) 'le versiune cchiù nnove.
+
+Mediauicchi jè destribbuite cu 'a speranze ca jè utile, ma SENZE NISCIUNA GARANZIE; senze nemmanghe 'a garanzie imblicite de COMMERCIABBELETÀ o IDONIETÀ PE 'NU SCOPE PARTICOLARE. Vatte a vide 'a GNU (Licenze Pubbleche Generale) pe cchiù 'mbormaziune.
+
+Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenze Pubbleche Generale)] 'nzieme a stu programme, ce none, scrive a 'a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor , Boston, MA 02110-1301, USA o [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html liggele sus a Indernette].",
'version-software' => 'Softuer installete',
'version-software-product' => 'Prodotte',
'version-software-version' => 'Versione',
@@ -3177,6 +3280,15 @@ Mitte 'u nome d'u file senze 'u \"{{ns:file}}:\" prefisse.",
'tags-edit' => 'cange',
'tags-hitcount' => '$1 {{PLURAL:$1|cangiamende|cangiaminde}}',
+# Special:ComparePages
+'comparepages' => 'Combronde le pàggene',
+'compare-selector' => "Combronde le revisiune d'à pàgene",
+'compare-page1' => 'Pàgene 1',
+'compare-page2' => 'Pàgene 2',
+'compare-rev1' => 'Revisione 1',
+'compare-rev2' => 'Revisione 2',
+'compare-submit' => 'Combronde',
+
# Database error messages
'dberr-header' => "Sta Uicchi tène 'nu probbleme",
'dberr-problems' => "Simw spiacende! Stu site stè 'ngondre de le diffcoltà tecniche.",
@@ -3193,8 +3305,13 @@ Mitte 'u nome d'u file senze 'u \"{{ns:file}}:\" prefisse.",
'htmlform-float-invalid' => "'U valore ca è specificate non g'è 'nu numere.",
'htmlform-int-toolow' => "'U valore ca è specificate jè sotte a 'u minime de $1",
'htmlform-int-toohigh' => "'U valore ca è specificate jè suverchie a 'u massime de $1",
+'htmlform-required' => 'Stu valore jè richieste',
'htmlform-submit' => 'Conferme',
'htmlform-reset' => 'Annulle le cangiaminde',
'htmlform-selectorother-other' => 'Otre',
+# SQLite database support
+'sqlite-has-fts' => "$1 cu 'u supporte d'a ricerche full-text",
+'sqlite-no-fts' => "$1 senze 'u supporte d'a ricerche full-text",
+
);
diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php
index 17b5297d..a0de2454 100644
--- a/languages/messages/MessagesRu.php
+++ b/languages/messages/MessagesRu.php
@@ -16,10 +16,14 @@
* @author Assele
* @author Chilin
* @author Claymore
+ * @author DCamer
* @author Don Alessandro
+ * @author Eleferen
* @author EugeneZelenko
* @author Ferrer
* @author Flrn
+ * @author G0rn
+ * @author Gazeb
* @author Grigol
* @author HalanTul
* @author Huuchin
@@ -35,7 +39,11 @@
* @author Putnik
* @author Rubin
* @author Sk
+ * @author TarzanASG
+ * @author Temuri rajavi
+ * @author Vago
* @author VasilievVV
+ * @author Ytsukeng Fyvaprol
* @author ÐлекÑандр Сигачёв
* @author לערי ריינה×רט
* @author გიáƒáƒ áƒ’იმელáƒ
@@ -168,6 +176,7 @@ $magicWords = array(
'subjectpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
'subst' => array( '0', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'ЗÐЩПОДСТ:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -200,6 +209,7 @@ $magicWords = array(
'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
'servername' => array( '0', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
'scriptpath' => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
'grammar' => array( '0', 'ПÐДЕЖ:', 'GRAMMAR:' ),
'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
'notitleconvert' => array( '0', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
@@ -212,6 +222,7 @@ $magicWords = array(
'revisionday' => array( '1', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
@@ -253,6 +264,9 @@ $magicWords = array(
'staticredirect' => array( '1', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
'formatdate' => array( '0', 'форматдаты', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ПУТЬ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
+ 'url_query' => array( '0', 'ЗÐПРОС', 'QUERY' ),
);
$imageFiles = array(
@@ -279,8 +293,7 @@ $messages = array(
'tog-editsection' => 'Показывать ÑÑылку «править» Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñекции',
'tog-editsectiononrightclick' => 'Править Ñекции при правом щелчке мышью на заголовке (JavaScript)',
'tog-showtoc' => 'Показывать оглавление (Ð´Ð»Ñ Ñтраниц более чем Ñ 3 заголовками)',
-'tog-rememberpassword' => 'Помнить мою учётную запиÑÑŒ на Ñтом компьютере',
-'tog-editwidth' => 'Поле Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ вÑÑŽ ширину Ñкрана',
+'tog-rememberpassword' => 'Запомнить мой логин в Ñтом браузере (не более $1 {{PLURAL:$1|днÑ|дней|дней}})',
'tog-watchcreations' => 'ДобавлÑÑ‚ÑŒ Ñозданные мной Ñтраницы в ÑпиÑок наблюдениÑ',
'tog-watchdefault' => 'ДобавлÑÑ‚ÑŒ изменённые мной Ñтраницы в ÑпиÑок наблюдениÑ',
'tog-watchmoves' => 'ДобавлÑÑ‚ÑŒ переименованные мной Ñтраницы в ÑпиÑок наблюдениÑ',
@@ -425,31 +438,21 @@ $messages = array(
'faqpage' => 'Project:ЧаВО',
# Vector skin
-'vector-action-addsection' => 'Добавить тему',
-'vector-action-delete' => 'Удалить',
-'vector-action-move' => 'Переименовать',
-'vector-action-protect' => 'Защитить',
-'vector-action-undelete' => 'ВоÑÑтановить',
-'vector-action-unprotect' => 'СнÑÑ‚ÑŒ защиту',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ñтраница',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Страница',
-'vector-namespace-media' => 'Медиа-Ñтраница',
-'vector-namespace-mediawiki' => 'Сообщение',
-'vector-namespace-project' => 'О проекте',
-'vector-namespace-special' => 'Ð¡Ð»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ñтраница',
-'vector-namespace-talk' => 'ОбÑуждение',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Страница учаÑтника',
-'vector-view-create' => 'Создание',
-'vector-view-edit' => 'Правка',
-'vector-view-history' => 'ИÑториÑ',
-'vector-view-view' => 'Чтение',
-'vector-view-viewsource' => 'ПроÑмотр разметки',
-'actions' => 'ДейÑтвиÑ',
-'namespaces' => 'ПроÑтранÑтва имён',
-'variants' => 'Варианты',
+'vector-action-addsection' => 'Добавить тему',
+'vector-action-delete' => 'Удалить',
+'vector-action-move' => 'Переименовать',
+'vector-action-protect' => 'Защитить',
+'vector-action-undelete' => 'ВоÑÑтановить',
+'vector-action-unprotect' => 'СнÑÑ‚ÑŒ защиту',
+'vector-simplesearch-preference' => 'Включить раÑширенные поиÑковые подÑказки (только Ð´Ð»Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Â«Ð’ÐµÐºÑ‚Ð¾Ñ€Ð½Ð¾ÐµÂ»)',
+'vector-view-create' => 'Создание',
+'vector-view-edit' => 'Правка',
+'vector-view-history' => 'ИÑториÑ',
+'vector-view-view' => 'Чтение',
+'vector-view-viewsource' => 'ПроÑмотр разметки',
+'actions' => 'ДейÑтвиÑ',
+'namespaces' => 'ПроÑтранÑтва имён',
+'variants' => 'Варианты',
'errorpagetitle' => 'Ошибка',
'returnto' => 'Возврат к Ñтранице $1.',
@@ -510,6 +513,9 @@ $messages = array(
ПожалуйÑта, подождите и повторите попытку Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº Ñтранице позже.
$1',
+'pool-timeout' => 'ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸',
+'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' => 'ОпиÑание {{grammar:genitive|{{SITENAME}}}}',
@@ -676,7 +682,8 @@ $2',
'yourname' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
'yourpassword' => 'Пароль:',
'yourpasswordagain' => 'Повторный набор паролÑ:',
-'remembermypassword' => 'Помнить мою учётную запиÑÑŒ на Ñтом компьютере',
+'remembermypassword' => 'Помнить мою учётную запиÑÑŒ на Ñтом компьютере (не более $1 {{PLURAL:$1|днÑ|дней|дней}})',
+'securelogin-stick-https' => 'Продолжить подключение по HTTPS поÑле входа',
'yourdomainname' => 'Ваш домен:',
'externaldberror' => 'Произошла ошибка при аутентификации Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешней базы данных, или у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в Ñвою внешнюю учётную запиÑÑŒ.',
'login' => 'ПредÑтавитьÑÑ ÑиÑтеме',
@@ -693,6 +700,7 @@ $2',
'gotaccount' => "Ð’Ñ‹ уже зарегиÑтрированы? '''$1'''.",
'gotaccountlink' => 'ПредÑтавьтеÑÑŒ',
'createaccountmail' => 'по Ñл. почте',
+'createaccountreason' => 'Причина:',
'badretype' => 'Введённые вами пароли не Ñовпадают.',
'userexists' => 'Введённое Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника уже иÑпользуетÑÑ.
ПожалуйÑта, выберите другое имÑ.',
@@ -713,6 +721,7 @@ $2',
'wrongpasswordempty' => 'ПожалуйÑта, введите непуÑтой пароль.',
'passwordtooshort' => 'Пароль должен ÑоÑтоÑÑ‚ÑŒ не менее чем из $1 {{PLURAL:$1|Ñимвола|Ñимволов|Ñимволов}}.',
'password-name-match' => 'Введённый пароль должен отличатьÑÑ Ð¾Ñ‚ имени учаÑтника.',
+'password-login-forbidden' => 'ИÑпользование Ñтого имени учаÑтника и Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð¾.',
'mailmypassword' => 'Получить новый пароль',
'passwordremindertitle' => 'Ðапоминание Ð¿Ð°Ñ€Ð¾Ð»Ñ ÑƒÑ‡Ð°Ñтника {{grammar:genitive|{{SITENAME}}}}',
'passwordremindertext' => 'Кто-то (вероÑтно, вы, Ñ IP-адреÑа $1) запроÑил Ñоздать
@@ -754,6 +763,9 @@ $2',
'loginlanguagelabel' => 'Язык: $1',
'suspicious-userlogout' => 'Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° завершение ÑеанÑа отклонён, так как он похож на запроÑ, отправленный некорректным браузером или кÑширующим прокÑи.',
+# E-mail sending
+'php-mail-error-unknown' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в PHP-функции mail()',
+
# Password reset dialog
'resetpass' => 'Изменение паролÑ',
'resetpass_announce' => 'Ð’Ñ‹ предÑтавилиÑÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ временного паролÑ, полученного по Ñлектронной почте. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ð° в ÑиÑтему, вы должны уÑтановить новый пароль.',
@@ -804,10 +816,11 @@ $2',
'showdiff' => 'ВнеÑённые изменениÑ',
'anoneditwarning' => "'''Внимание.''' Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме.
Ваш IP-Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ´ÐµÑ‚ запиÑан в иÑторию изменений Ñтой Ñтраницы.",
+'anonpreviewwarning' => "''Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме. Сохранение приведёт к запиÑи вашего IP-адреÑа в иÑторию изменений Ñтраницы.''",
'missingsummary' => "'''Ðапоминание.''' Ð’Ñ‹ не дали краткого опиÑÐ°Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. При повторном нажатии на кнопку «{{int:savearticle}}», ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñохранены без комментариÑ.",
'missingcommenttext' => 'ПожалуйÑта, введите ниже ваше Ñообщение.',
-'missingcommentheader' => "'''Ðапоминание:''' Ð’Ñ‹ не указали заголовок комментариÑ.
-При повторном нажатии на кнопку ÑохранениÑ, ваша правка будет запиÑана без заголовка.",
+'missingcommentheader' => "'''Ðапоминание.''' Ð’Ñ‹ не указали тему/заголовок Ð´Ð»Ñ Ñтого комментариÑ.
+При повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет запиÑана без заголовка.",
'summary-preview' => 'ОпиÑание будет:',
'subject-preview' => 'Заголовок будет:',
'blockedtitle' => 'УчаÑтник заблокирован',
@@ -879,7 +892,11 @@ $2',
'userjsyoucanpreview' => "'''ПодÑказка.''' Ðажмите кнопку «{{int:showpreview}}», чтобы проверить ваш новый JS-файл перед Ñохранением.",
'usercsspreview' => "'''Помните, что Ñто только предварительный проÑмотр вашего CSS-файла, он ещё не Ñохранён!'''",
'userjspreview' => "'''Помните, что Ñто только предварительный проÑмотр вашего javascript-файла, он ещё не Ñохранён!'''",
-'userinvalidcssjstitle' => "'''Внимание:''' тема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Â«$1» не найдена. Помните, что пользовательÑкие Ñтраницы .css и .js должны иметь название, ÑоÑтоÑщее только из Ñтрочных букв, например «{{ns:user}}:Ðекто/monobook.css», а не «{{ns:user}}:Ðекто/Monobook.css».",
+'sitecsspreview' => "'''Помните, что вы только предварительно проÑматриваете Ñтот CSS.'''
+'''Он ещё не Ñохранён!'''",
+'sitejspreview' => "'''Помните, что вы только предварительно проÑматриваете Ñтот JavaScript-код.'''
+'''Он ещё не Ñохранён!'''",
+'userinvalidcssjstitle' => "'''Внимание:''' тема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Â«$1» не найдена. Помните, что пользовательÑкие Ñтраницы .css и .js должны иметь название, ÑоÑтоÑщее только из Ñтрочных букв, например «{{ns:user}}:Ðекто/vector.css», а не «{{ns:user}}:Ðекто/Vector.css».",
'updated' => '(Обновлена)',
'note' => "'''Примечание:'''",
'previewnote' => "'''Это только предварительный проÑмотр, текÑÑ‚ ещё не запиÑан!'''",
@@ -920,9 +937,6 @@ $2',
ЕÑли вы не хотите, чтобы кто-либо изменÑл ваши текÑÑ‚Ñ‹, не помещайте их Ñюда.<br />
Ð’Ñ‹ также подтверждаете, что ÑвлÑетеÑÑŒ автором вноÑимых дополнений, или Ñкопировали их из иÑточника, допуÑкающего Ñвободное раÑпроÑтранение и изменение Ñвоего Ñодержимого (Ñм. $1).
'''ÐЕ РÐЗМЕЩÐЙТЕ БЕЗ РÐЗРЕШЕÐИЯ ОХРÐÐЯЕМЫЕ ÐВТОРСКИМ ПРÐВОМ ÐœÐТЕРИÐЛЫ!'''",
-'longpagewarning' => "'''ПРЕДУПРЕЖДЕÐИЕ: Длина Ñтой Ñтраницы ÑоÑтавлÑет $1 килобайт.
-Страницы, размер которых приближаетÑÑ Ðº 32 КБ или превышает Ñто значение, могут неверно отображатьÑÑ Ð² некоторых браузерах.
-ПожалуйÑта, раÑÑмотрите вариант Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñтраницы на меньшие чаÑти.'''",
'longpageerror' => "'''ОШИБКÐ: запиÑываемый вами текÑÑ‚ имеет размер $1 килобайт, что больше, чем уÑтановленный предел $2 килобайт. Страница не может быть Ñохранена.'''",
'readonlywarning' => "'''ПРЕДУПРЕЖДЕÐИЕ. База данных заблокирована в ÑвÑзи Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°Ð¼Ð¸ обÑлуживаниÑ, поÑтому вы не можете запиÑать ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ñмо ÑейчаÑ.
Возможно, вам Ñледует Ñохранить текÑÑ‚ в файл, чтобы воÑпользоватьÑÑ Ñтим текÑтом позже.'''
@@ -1099,6 +1113,8 @@ $1",
'logdelete-failure' => "'''ВидимоÑÑ‚ÑŒ журнала не уÑтановлена:'''
$1",
'revdel-restore' => 'изменить видимоÑÑ‚ÑŒ',
+'revdel-restore-deleted' => 'удалённые верÑии',
+'revdel-restore-visible' => 'видимые верÑии',
'pagehist' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñтраницы',
'deletedhist' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ð¹',
'revdelete-content' => 'Ñодержимое',
@@ -1166,11 +1182,13 @@ $1",
# Diffs
'history-title' => '$1 — иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹',
'difference' => '(Ð Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ верÑиÑми)',
+'difference-multipage' => '(Ð Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñтраницами)',
'lineno' => 'Строка $1:',
'compareselectedversions' => 'Сравнить выбранные верÑии',
'showhideselectedversions' => 'Показать/Ñкрыть выбранные верÑии',
'editundo' => 'отменить',
-'diff-multi' => '({{PLURAL:$1|$1 Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð½Ðµ показана|$1 промежуточные верÑии не показаны|$1 промежуточных верÑий не показаны.}})',
+'diff-multi' => '({{PLURAL:$1|не показана $1 Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ|не показаны $1 промежуточные верÑии|не показаны $1 промежуточных верÑий}} {{PLURAL:$2|$2 учаÑтника|$2 учаÑтников|$2 учаÑтников}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ|не показаны $1 промежуточные верÑии|не показаны $1 промежуточных верÑий}}, Ñделанные более чем {{PLURAL:$2|$1 учаÑтником|$2 учаÑтниками}})',
# Search results
'searchresults' => 'Результаты поиÑка',
@@ -1205,6 +1223,7 @@ $1",
'searchprofile-everything-tooltip' => 'ПоиÑк на вÑех Ñтраницах (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñтраницы обÑуждениÑ)',
'searchprofile-advanced-tooltip' => 'ИÑкать в заданных проÑтранÑтвах имён',
'search-result-size' => '$1 ({{PLURAL:$2|$2 Ñлово|$2 Ñлова|$2 Ñлов}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 Ñлемент|$1 Ñлемента|$1 Ñлементов}} ({{PLURAL:$2|$2 подкатегориÑ|$2 подкатегории|$2 подкатегорий}}, {{PLURAL:$3|$3 файл|$3 файла|$3 файлов}})',
'search-result-score' => 'РелевантноÑÑ‚ÑŒ: $1 %',
'search-redirect' => '(перенаправление $1)',
'search-section' => '(раздел $1)',
@@ -1219,7 +1238,7 @@ $1",
'searcheverything-enable' => 'ПоиÑк по вÑем проÑтранÑтвам имён',
'searchrelated' => 'ÑвÑзанный',
'searchall' => 'вÑе',
-'showingresults' => 'Ðиже {{PLURAL:$1|показан|показаны|показаны}} <strong>$1</strong> {{PLURAL:$1|результат|результата|результатов}}, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ â„–&nbsp;<strong>$2</strong>.',
+'showingresults' => "Ðиже показаны до {{PLURAL:$1|'''1''' результат |'''$1''' результаты}}, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ #'''$2'''.",
'showingresultsnum' => 'Ðиже {{PLURAL:$3|показан|показаны|показаны}} <strong>$3</strong> {{PLURAL:$3|результат|результата|результатов}}, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ â„–&nbsp;<strong>$2</strong>.',
'showingresultsheader' => "{{PLURAL:$5|Результат '''$1''' из '''$3'''|Результаты '''$1 — $2''' из '''$3'''}} Ð´Ð»Ñ '''$4'''",
'nonefound' => "'''Замечание.''' По умолчанию поиÑк производитÑÑ Ð½Ðµ во вÑех проÑтранÑтвах имён. ИÑпользуйте приÑтавку ''all:'', чтобы иÑкать во вÑех проÑтранÑтвах имён (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ ÑƒÑ‡Ð°Ñтников, шаблоны и пр.), или укажите требуемое проÑтранÑтво имён.",
@@ -1279,6 +1298,7 @@ $1",
'contextlines' => 'КоличеÑтво показываемых Ñтрок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ найденной:',
'contextchars' => 'КоличеÑтво Ñимволов контекÑта на Ñтроку:',
'stub-threshold' => 'Порог Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ <a href="#" class="stub">ÑÑылок на заготовки</a> (в байтах):',
+'stub-threshold-disabled' => 'Отключён',
'recentchangesdays' => 'КоличеÑтво дней, за которые показывать Ñвежие правки:',
'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|днÑ|дней|дней}})',
'recentchangescount' => 'КоличеÑтво правок, отображаемое по умолчанию:',
@@ -1312,6 +1332,7 @@ $1",
'prefs-files' => 'Файлы',
'prefs-custom-css' => 'СобÑтвенный CSS',
'prefs-custom-js' => 'СобÑтвенный JS',
+'prefs-common-css-js' => 'Общие CSS/JS Ð´Ð»Ñ Ð²Ñех тем оформлениÑ:',
'prefs-reset-intro' => 'Эта Ñтраница может быть иÑпользована Ð´Ð»Ñ ÑброÑа ваших наÑтроек на наÑтройки по умолчанию.
Подтвердив данное дейÑтвие, вы не Ñможете его отменить.',
'prefs-emailconfirm-label' => 'Подтверждение Ñлектронной почты:',
@@ -1351,9 +1372,15 @@ $1",
'prefs-advancedrendering' => 'РаÑширенные наÑтройки',
'prefs-advancedsearchoptions' => 'РаÑширенные наÑтройки',
'prefs-advancedwatchlist' => 'РаÑширенные наÑтройки',
-'prefs-display' => 'ÐаÑтройки отображениÑ',
+'prefs-displayrc' => 'ÐаÑтройки отображениÑ',
+'prefs-displaysearchoptions' => 'ÐаÑтройки отображениÑ',
+'prefs-displaywatchlist' => 'ÐаÑтройки отображениÑ',
'prefs-diffs' => 'Разница верÑий',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ВыглÑдит корректно',
+'email-address-validity-invalid' => 'ТребуетÑÑ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¹ адреÑ!',
+
# User rights
'userrights' => 'Управление правами учаÑтника',
'userrights-lookup-user' => 'Управление группами учаÑтников',
@@ -1437,6 +1464,7 @@ $1",
'right-hideuser' => 'запрет имени учаÑтника и его Ñокрытие',
'right-ipblock-exempt' => 'обход блокировок по IP, автоблокировок и блокировок диапазонов',
'right-proxyunbannable' => 'обход автоматичеÑкой блокировки прокÑи',
+'right-unblockself' => 'разблокирование ÑÐµÐ±Ñ Ñамого',
'right-protect' => 'изменение ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñтраниц и правка защищённых Ñтраниц',
'right-editprotected' => 'правка защищённых Ñтраниц (без каÑкадной защиты)',
'right-editinterface' => 'изменение пользовательÑкого интерфейÑа',
@@ -1459,7 +1487,6 @@ $1",
'right-siteadmin' => 'блокировка и разблокировка базы данных',
'right-reset-passwords' => 'ÑбраÑывание паролей других учаÑтников',
'right-override-export-depth' => 'ÑкÑпортирование Ñтраниц, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑвÑзанные Ñтраницы Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð¾Ð¹ до 5',
-'right-versiondetail' => 'проÑмотр раÑширенной информации о верÑии программного обеÑпечениÑ',
'right-sendemail' => 'отправлÑÑ‚ÑŒ Ñлектронную почту другим учаÑтникам',
# User rights log
@@ -1510,14 +1537,9 @@ $1",
'recentchanges-legend' => 'ÐаÑтройки Ñвежих правок',
'recentchangestext' => 'Ðиже в хронологичеÑком порÑдке перечиÑлены поÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° Ñтраницах {{grammar:genitive|{{SITENAME}}}}.',
'recentchanges-feed-description' => 'ОтÑлеживать поÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² вики в Ñтом потоке.',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 — Ð½Ð¾Ð²Ð°Ñ Ñтраница',
'recentchanges-label-newpage' => 'Этой правкой была Ñоздана Ð½Ð¾Ð²Ð°Ñ Ñтраница.',
-'recentchanges-legend-minor' => '$1 — малое изменение',
'recentchanges-label-minor' => 'Это малозначимое изменение',
-'recentchanges-legend-bot' => '$1 — правка бота',
'recentchanges-label-bot' => 'Эта правка Ñделана ботом',
-'recentchanges-legend-unpatrolled' => '$1 — Ð½ÐµÐ¾Ñ‚Ð¿Ð°Ñ‚Ñ€ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ°',
'recentchanges-label-unpatrolled' => 'Эту правку ещё не отпатрулировали',
'rcnote' => "{{PLURAL:$1|ПоÑледнее '''$1''' изменение|ПоÑледние '''$1''' изменениÑ|ПоÑледние '''$1''' изменений}} за '''$2''' {{PLURAL:$2|день|днÑ|дней}}, на момент времени $5 $4.",
'rcnotefrom' => 'Ðиже перечиÑлены Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ <strong>$2</strong> (по <strong>$1</strong>).',
@@ -1566,6 +1588,9 @@ $1",
'upload_directory_missing' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº ($1) отÑутÑтвует и не может быть Ñоздана веб-Ñервером.',
'upload_directory_read_only' => 'Веб-Ñервер не имеет прав запиÑи в папку ($1), в которой предполагаетÑÑ Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÑŒ загружаемые файлы.',
'uploaderror' => 'Ошибка загрузки файла',
+'upload-recreate-warning' => "'''Внимание. Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем был удален или переименован.''
+
+Журнал удалений и переименований Ð´Ð»Ñ Ñтой Ñтранице приведён ниже:",
'uploadtext' => "ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту форму вы можете загрузить на Ñервер файлы.
Чтобы проÑмотреть ранее загруженные файлы, обратитеÑÑŒ к [[Special:FileList|ÑпиÑку загруженных файлов]]. Загрузка файлов также запиÑываетÑÑ Ð² [[Special:Log/upload|журнал загрузок]], ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² запиÑываютÑÑ Ð² [[Special:Log/delete|журнал удалений]].
@@ -1600,6 +1625,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' — запрещённый тип файла.
{{PLURAL:\$3|Разрешённым типом файла ÑвлÑетÑÑ|Разрешённые типы файлов:}} \$2.",
'filetype-missing' => 'ОтÑутÑтвует раÑширение у файла (например, «.jpg»).',
+'empty-file' => 'Отправленный вами файл пуÑÑ‚.',
+'file-too-large' => 'Отправленный вами файл Ñлишком велик.',
+'filename-tooshort' => 'Слишком короткое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°.',
+'filetype-banned' => 'Этот тип файлов запрещён.',
+'verification-error' => 'Этот файл не прошёл процедуру проверки.',
+'hookaborted' => 'Предлагаемое вами изменение было отменено в обработчике раÑширениÑ.',
+'illegal-filename' => 'ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°.',
+'overwrite' => 'Ðе допуÑкаетÑÑ Ð·Ð°Ð¼ÐµÐ½Ð° ÑущеÑтвующего файла.',
+'unknown-error' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°.',
+'tmp-create-error' => 'Ðевозможно Ñоздать временный файл.',
+'tmp-write-error' => 'Ошибка запиÑи во временный файл.',
'large-file' => 'РекомендуетÑÑ Ð¸Ñпользовать файлы, размер которых не превышает $1 байт (размер загруженного файла ÑоÑтавлÑет $2 байт).',
'largefileserver' => 'Размер файла превышает макÑимально разрешённый.',
'emptyfile' => 'Загруженный вами файл вероÑтно пуÑтой. Возможно, Ñто произошло из-за ошибки при наборе имени файла. ПожалуйÑта, проверьте, дейÑтвительно ли вы хотите загрузить Ñтот файл.',
@@ -1625,13 +1661,14 @@ $1",
ЕÑли вы вÑÑ‘-таки хотите загрузить Ñтот файл, пожалуйÑта, вернитеÑÑŒ назад и измените Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Этот файл ÑвлÑетÑÑ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ð¾Ð¼ {{PLURAL:$1|Ñледующего файла|Ñледующих файлов}}:',
'file-deleted-duplicate' => 'Подобный файл ([[:$1]]) уже удалÑлÑÑ. ПожалуйÑта, ознакомьтеÑÑŒ Ñ Ð¸Ñторией ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°, прежде чем загружать его Ñнова.',
-'successfulupload' => 'Загрузка уÑпешно завершена',
'uploadwarning' => 'Предупреждение',
'uploadwarning-text' => 'ПожалуйÑта, измените предÑтавленное ниже опиÑание файла и попробуйте ещё раз.',
'savefile' => 'ЗапиÑать файл',
'uploadedimage' => 'загрузил «[[$1]]»',
'overwroteimage' => 'загружена Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Â«[[$1]]»',
'uploaddisabled' => 'Загрузка запрещена',
+'copyuploaddisabled' => 'Загрузка по URL отключена.',
+'uploadfromurl-queued' => 'Ваша загрузка поÑтавлена в очередь.',
'uploaddisabledtext' => 'Загрузка файлов отключена.',
'php-uploaddisabledtext' => 'Загрузка файлов отключена в наÑтройках PHP. ПожалуйÑта, проверьте значение ÑвойÑтва file_uploads.',
'uploadscripted' => 'Файл Ñодержит HTML-код или Ñкрипт, который может быть ошибочно обработан браузером.',
@@ -1664,6 +1701,14 @@ JD # Jenoptik
MGP # Pentax
PICT # различные
#</pre> <!-- оÑтавьте Ñту Ñтрочку как еÑÑ‚ÑŒ -->',
+'upload-success-subj' => 'Загрузка уÑпешно завершена',
+'upload-success-msg' => 'Ваша загрузка [$2] прошла уÑпешно. Ð’Ñ‹ можете поÑмотреть результат здеÑÑŒ: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Проблема загрузки',
+'upload-failure-msg' => 'Обнаружена проблема Ñ Ð²Ð°ÑˆÐµÐ¹ загрузкой из [$2]:
+
+$1',
+'upload-warning-subj' => 'Предупреждение при загрузке',
+'upload-warning-msg' => 'При загрузке Ñ [$2] произошла ошибка. Ð”Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¸ вернитеÑÑŒ на [[Special:Upload/stash/$1|upload form]].',
'upload-proto-error' => 'Ðеправильный протокол',
'upload-proto-error-text' => 'Ð”Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð¹ загрузки требуетÑÑ Ð°Ð´Ñ€ÐµÑ, начинающийÑÑ Ñ <code>http://</code> или <code>ftp://</code>.',
@@ -1725,6 +1770,7 @@ PICT # различные
'listfiles_search_for' => 'ПоиÑк по имени файла:',
'imgfile' => 'файл',
'listfiles' => 'СпиÑок файлов',
+'listfiles_thumb' => 'Миниатюра',
'listfiles_date' => 'Дата',
'listfiles_name' => 'Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°',
'listfiles_user' => 'УчаÑтник',
@@ -1839,8 +1885,8 @@ PICT # различные
'statistics-edits' => 'ЧиÑло правок Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° уÑтановки {{grammar:genitive|{{SITENAME}}}}',
'statistics-edits-average' => 'Среднее чиÑло правок на Ñтраницу',
'statistics-views-total' => 'Ð’Ñего проÑмотров',
+'statistics-views-total-desc' => 'Ðе учитываютÑÑ Ð¿Ñ€Ð¾Ñмотры неÑущеÑтвующих и Ñлужебных Ñтраниц.',
'statistics-views-peredit' => 'ПроÑмотров на правку',
-'statistics-jobqueue' => 'Величина [http://www.mediawiki.org/wiki/Manual:Job_queue очереди заданий]',
'statistics-users' => 'ЗарегиÑтрированные [[Special:ListUsers|учаÑтники]]',
'statistics-users-active' => 'Ðктивные учаÑтники',
'statistics-users-active-desc' => 'УчаÑтники, Ñовершившие какое-либо дейÑтвие за {{PLURAL:$1|поÑледний $1 день|поÑледние $1 днÑ|поÑледние $1 дней}}',
@@ -1855,7 +1901,7 @@ PICT # различные
'doubleredirects' => 'Двойные перенаправлениÑ',
'doubleredirectstext' => 'Ðа Ñтой Ñтранице предÑтавлен ÑпиÑок перенаправлений на другие перенаправлениÑ.
ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит ÑÑылки на первое и второе перенаправлениÑ, а также целевую Ñтраницу второго перенаправлениÑ, в которой обычно указываетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñтраницы, куда должно ÑÑылатьÑÑ Ð¿ÐµÑ€Ð²Ð¾Ðµ перенаправление.
-<s>Зачёркнутые</s> запиÑи были иÑправлены.',
+<del>Зачёркнутые</del> запиÑи были иÑправлены.',
'double-redirect-fixed-move' => 'Страница [[$1]] была переименована, ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð½Ð° перенаправлÑет на [[$2]]',
'double-redirect-fixer' => 'ИÑправитель перенаправлений',
@@ -1878,6 +1924,8 @@ PICT # различные
'nmembers' => '$1 {{PLURAL:$1|объект|объекта|объектов}}',
'nrevisions' => '$1 {{PLURAL:$1|верÑиÑ|верÑии|верÑий}}',
'nviews' => '$1 {{PLURAL:$1|проÑмотр|проÑмотра|проÑмотров}}',
+'nimagelinks' => 'ИÑпользуетÑÑ Ð½Ð° $1 {{PLURAL:$1|Ñтранице|Ñтраницах|Ñтраницах}}',
+'ntransclusions' => 'иÑпользуетÑÑ Ð½Ð° $1 {{PLURAL:$1|Ñтранице|Ñтраницах|Ñтраницах}}',
'specialpage-empty' => 'Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ дал результатов.',
'lonelypages' => 'Страницы-Ñироты',
'lonelypagestext' => 'Ðа Ñледующие Ñтраницы нет ÑÑылок Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… Ñтраниц {{grammar:genitive|{{SITENAME}}}}, и они не включаютÑÑ Ð² другие Ñтраницы.',
@@ -2034,34 +2082,40 @@ PICT # различные
'listgrouprights-removegroup-self-all' => 'Может удалÑÑ‚ÑŒ вÑе группы Ñо Ñвоей учётной запиÑи',
# E-mail user
-'mailnologin' => 'ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ отÑутÑтвует',
-'mailnologintext' => 'Ð’Ñ‹ должны [[Special:UserLogin|предÑтавитьÑÑ ÑиÑтеме]] и иметь дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в ваших [[Special:Preferences|наÑтройках]], чтобы иметь возможноÑÑ‚ÑŒ отправлÑÑ‚ÑŒ Ñлектронную почту другим учаÑтникам.',
-'emailuser' => 'ПиÑьмо учаÑтнику',
-'emailpage' => 'ПиÑьмо учаÑтнику',
-'emailpagetext' => 'С помощью данной формы можно отправить Ñообщение на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ñтого учаÑтника.
+'mailnologin' => 'ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ отÑутÑтвует',
+'mailnologintext' => 'Ð’Ñ‹ должны [[Special:UserLogin|предÑтавитьÑÑ ÑиÑтеме]] и иметь дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в ваших [[Special:Preferences|наÑтройках]], чтобы иметь возможноÑÑ‚ÑŒ отправлÑÑ‚ÑŒ Ñлектронную почту другим учаÑтникам.',
+'emailuser' => 'ПиÑьмо учаÑтнику',
+'emailpage' => 'ПиÑьмо учаÑтнику',
+'emailpagetext' => 'С помощью данной формы можно отправить Ñообщение на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ñтого учаÑтника.
Ð’ качеÑтве обратного адреÑа будет указан тот адреÑ, который вы указали в [[Special:Preferences|Ñвоих наÑтройках]], таким образом получатель будет иметь возможноÑÑ‚ÑŒ ответить непоÑредÑтвенно вам.',
-'usermailererror' => 'При отправке ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñлектронной почты произошла ошибка:',
-'defemailsubject' => 'ПиÑьмо из {{grammar:genitive|{{SITENAME}}}}',
-'noemailtitle' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты отÑутÑтвует',
-'noemailtext' => 'Этот учаÑтник не указал дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.',
-'nowikiemailtitle' => 'Ðет Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÑÑ‚ÑŒ пиÑьма',
-'nowikiemailtext' => 'Этот учаÑтник указал, что не желает получать пиÑьма от других учаÑтников.',
-'email-legend' => 'Отправить пиÑьмо другому учаÑтнику {{grammar:genitive|{{SITENAME}}}}',
-'emailfrom' => 'От кого:',
-'emailto' => 'Кому:',
-'emailsubject' => 'Тема:',
-'emailmessage' => 'Сообщение:',
-'emailsend' => 'Отправить',
-'emailccme' => 'Отправить мне копию пиÑьма.',
-'emailccsubject' => 'ÐšÐ¾Ð¿Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ $1: $2',
-'emailsent' => 'ПиÑьмо отправлено',
-'emailsenttext' => 'Ваше Ñлектронное Ñообщение отправлено.',
-'emailuserfooter' => 'Это пиÑьмо было отправлено учаÑтнику $2 от учаÑтника $1 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции «Отправить пиÑьмо» проекта {{SITENAME}}.',
+'usermailererror' => 'При отправке ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñлектронной почты произошла ошибка:',
+'defemailsubject' => 'ПиÑьмо из {{grammar:genitive|{{SITENAME}}}}',
+'usermaildisabled' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° учаÑтника отключена',
+'usermaildisabledtext' => 'Ð’Ñ‹ не можете отправлÑÑ‚ÑŒ Ñлектронные пиÑьма другим учаÑтникам Ñтой вики',
+'noemailtitle' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты отÑутÑтвует',
+'noemailtext' => 'Этот учаÑтник не указал дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.',
+'nowikiemailtitle' => 'Ðет Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÑÑ‚ÑŒ пиÑьма',
+'nowikiemailtext' => 'Этот учаÑтник указал, что не желает получать пиÑьма от других учаÑтников.',
+'email-legend' => 'Отправить пиÑьмо другому учаÑтнику {{grammar:genitive|{{SITENAME}}}}',
+'emailfrom' => 'От кого:',
+'emailto' => 'Кому:',
+'emailsubject' => 'Тема:',
+'emailmessage' => 'Сообщение:',
+'emailsend' => 'Отправить',
+'emailccme' => 'Отправить мне копию пиÑьма.',
+'emailccsubject' => 'ÐšÐ¾Ð¿Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ $1: $2',
+'emailsent' => 'ПиÑьмо отправлено',
+'emailsenttext' => 'Ваше Ñлектронное Ñообщение отправлено.',
+'emailuserfooter' => 'Это пиÑьмо было отправлено учаÑтнику $2 от учаÑтника $1 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции «Отправить пиÑьмо» проекта {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'ОÑтавить ÑиÑтемное Ñообщение.',
+'usermessage-editor' => 'СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð´Ð¾Ñтавка',
# Watchlist
'watchlist' => 'СпиÑок наблюдениÑ',
'mywatchlist' => 'СпиÑок наблюдениÑ',
-'watchlistfor' => "(учаÑтника '''$1''')",
+'watchlistfor2' => 'Ð”Ð»Ñ $1 $2',
'nowatchlist' => 'Ваш ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð¿ÑƒÑÑ‚.',
'watchlistanontext' => 'Ð’Ñ‹ должны $1, чтобы проÑмотреть или отредактировать ÑпиÑок наблюдениÑ.',
'watchnologin' => 'Ðужно предÑтавитьÑÑ ÑиÑтеме',
@@ -2121,7 +2175,10 @@ $NEWPAGE
СиÑтема Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ {{grammar:genitive|{{SITENAME}}}}
--
-Изменить наÑтройки вашего ÑпиÑка наблюдениÑ
+Изменение наÑтройки уведомлений
+{{fullurl:{{#special:Preferences}}}}
+
+Изменение наÑтройки вашего ÑпиÑка наблюдениÑ
{{fullurl:{{#special:Watchlist}}/edit}}
Удалить Ñтраницы из вашего ÑпиÑка наблюдениÑ
@@ -2181,7 +2238,10 @@ $UNWATCHURL
'revertpage' => 'Правки [[Special:Contributions/$2|$2]] ([[User talk:$2|обÑуждение]]) откачены к верÑии [[User:$1|$1]]',
'revertpage-nouser' => 'Правки (Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника удалено) откачены к верÑии [[User:$1|$1]]',
'rollback-success' => 'Откачены правки $1; возврат к верÑии $2.',
-'sessionfailure' => 'Похоже, возникли проблемы Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ ÑеанÑом работы;
+
+# Edit tokens
+'sessionfailure-title' => 'Ошибка ÑеанÑа',
+'sessionfailure' => 'Похоже, возникли проблемы Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ ÑеанÑом работы;
Ñто дейÑтвие было отменено в целÑÑ… Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Â«Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° ÑеанÑа».
ПожалуйÑта, нажмите кнопку «Ðазад» и перезагрузите Ñтраницу, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы пришли.',
@@ -2310,18 +2370,22 @@ $1',
'month' => 'С меÑÑца (и ранее):',
'year' => 'С года (и ранее):',
-'sp-contributions-newbies' => 'Показать только вклад, Ñделанный Ñ Ð½Ð¾Ð²Ñ‹Ñ… учётных запиÑей',
-'sp-contributions-newbies-sub' => 'С новых учётных запиÑей',
-'sp-contributions-newbies-title' => 'Вклад Ñ Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ñозданных учётных запиÑей',
-'sp-contributions-blocklog' => 'блокировки',
-'sp-contributions-deleted' => 'удалённые правки учаÑтника',
-'sp-contributions-logs' => 'журналы',
-'sp-contributions-talk' => 'обÑуждение',
-'sp-contributions-userrights' => 'управление правами учаÑтника',
-'sp-contributions-blocked-notice' => 'Этот учаÑтник в данный момент заблокирован. Ðиже приведена поÑледнÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ из журнала блокировок:',
-'sp-contributions-search' => 'ПоиÑк вклада',
-'sp-contributions-username' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
-'sp-contributions-submit' => 'Ðайти',
+'sp-contributions-newbies' => 'Показать только вклад, Ñделанный Ñ Ð½Ð¾Ð²Ñ‹Ñ… учётных запиÑей',
+'sp-contributions-newbies-sub' => 'С новых учётных запиÑей',
+'sp-contributions-newbies-title' => 'Вклад Ñ Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ñозданных учётных запиÑей',
+'sp-contributions-blocklog' => 'блокировки',
+'sp-contributions-deleted' => 'удалённые правки учаÑтника',
+'sp-contributions-uploads' => 'загрузки',
+'sp-contributions-logs' => 'журналы',
+'sp-contributions-talk' => 'обÑуждение',
+'sp-contributions-userrights' => 'управление правами учаÑтника',
+'sp-contributions-blocked-notice' => 'Этот учаÑтник в данный момент заблокирован. Ðиже приведена поÑледнÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ из журнала блокировок:',
+'sp-contributions-blocked-notice-anon' => 'Этот IP-Ð°Ð´Ñ€ÐµÑ Ð² данный момент заблокирован.
+Ðиже приведена поÑледнÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ из журнала блокировок:',
+'sp-contributions-search' => 'ПоиÑк вклада',
+'sp-contributions-username' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
+'sp-contributions-toponly' => 'Показывать только правки, ÑвлÑющиеÑÑ Ð¿Ð¾Ñледними верÑиÑми',
+'sp-contributions-submit' => 'Ðайти',
# What links here
'whatlinkshere' => 'СÑылки Ñюда',
@@ -2382,7 +2446,6 @@ $1',
'ipb-edit-dropdown' => 'Править ÑпиÑок причин',
'ipb-unblock-addr' => 'Разблокировать $1',
'ipb-unblock' => 'Разблокировать учаÑтника или IP-адреÑ',
-'ipb-blocklist-addr' => 'ДейÑтвующие блокировки Ð´Ð»Ñ $1',
'ipb-blocklist' => 'Показать дейÑтвующие блокировки',
'ipb-blocklist-contribs' => 'Вклад учаÑтника $1',
'unblockip' => 'Разблокировать IP-адреÑ',
@@ -2453,6 +2516,8 @@ $1',
'sorbs_create_account_reason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в DNSBL. Ð’Ñ‹ не можете Ñоздать учётную запиÑÑŒ.',
'cant-block-while-blocked' => 'Ð’Ñ‹ не можете блокировать других учаÑтников, пока вы Ñами заблокированы.',
'cant-see-hidden-user' => 'УчаÑтник, которого вы пытаетеÑÑŒ заблокировать, уже заблокирован и Ñкрыт. ПоÑкольку у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° работу по Ñокрытию учаÑтников, вы не можете проÑмотреть или изменить данную блокировку.',
+'ipbblocked' => 'Ð’Ñ‹ не можете блокировать или разблокировать других учаÑтников, так как вы Ñами заблокированы',
+'ipbnounblockself' => 'Ð’Ñ‹ не можете разблокировать Ñамого ÑебÑ',
# Developer tools
'lockdb' => 'Сделать базу данных доÑтупной только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ',
@@ -2493,6 +2558,17 @@ $1',
'''ПРЕДУПРЕЖДЕÐИЕ!'''
Переименование может привеÑти к маÑштабным и неожиданным изменениÑм Ð´Ð»Ñ ''популÑрных'' Ñтраниц.
ПожалуйÑта, прежде чем вы продолжите, убедитеÑÑŒ, что вы понимаете вÑе возможные поÑледÑтвиÑ.",
+'movepagetext-noredirectfixer' => "ВоÑпользовавшиÑÑŒ формой ниже, вы переименуете Ñтраницу, одновременно перемеÑтив на новое меÑто её журнал изменений.
+Старое название Ñтанет перенаправлением на новое название.
+ПожалуйÑта, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].
+Ð’Ñ‹ отвечаете за то, что бы ÑÑылки продолжали и далее указывают туда, куда предполагалоÑÑŒ.
+
+Обратите внимание, что Ñтраница '''не будет''' переименована, еÑли Ñтраница Ñ Ð½Ð¾Ð²Ñ‹Ð¼ названием уже ÑущеÑтвует, кроме Ñлучаев, еÑли она ÑвлÑетÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ или пуÑта и не имеет иÑтории правок.
+Это означает, что вы можете переименовать Ñтраницу обратно в то название, которое у него только что было, еÑли вы переименовали по ошибке, но вы не можете Ñлучайно затереть ÑущеÑтвующую Ñтраницу.
+
+'''ПРЕДУПРЕЖДЕÐИЕ!'''
+Переименование может привеÑти к маÑштабным и неожиданным изменениÑм Ð´Ð»Ñ ''популÑрных'' Ñтраниц.
+ПожалуйÑта, прежде чем вы продолжите, убедитеÑÑŒ, что вы понимаете вÑе возможные поÑледÑтвиÑ.",
'movepagetalktext' => "ПриÑÐ¾ÐµÐ´Ð¸Ð½Ñ‘Ð½Ð½Ð°Ñ Ñтраница обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ также автоматичеÑки переименована, '''кроме Ñлучаев, когда:'''
*Ðе пуÑÑ‚Ð°Ñ Ñтраница обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ ÑущеÑтвует под таким же именем или
@@ -2550,6 +2626,7 @@ $1',
'immobile-source-page' => 'Эту Ñтраницу Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ñ‹Ð²Ð°Ñ‚ÑŒ.',
'immobile-target-page' => 'ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить Ñтранице Ñто имÑ.',
'imagenocrossnamespace' => 'Ðевозможно дать файлу Ð¸Ð¼Ñ Ð¸Ð· другого проÑтранÑтва имён',
+'nonfile-cannot-move-to-file' => 'Ðевозможно переименовывать Ñтраницы в файлы',
'imagetypemismatch' => 'Ðовое раÑширение файла не ÑоответÑтвует его типу',
'imageinvalidfilename' => 'Целевое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° ошибочно',
'fix-double-redirects' => 'ИÑправить перенаправлениÑ, указывающие на прежнее название',
@@ -2628,6 +2705,7 @@ $1',
'importstart' => 'Импортирование Ñтраниц…',
'import-revision-count' => '$1 {{PLURAL:$1|верÑиÑ|верÑии|верÑий}}',
'importnopages' => 'Ðет Ñтраниц Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.',
+'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запиÑÑŒ журнала|Импортировано $1 запиÑи журнала|Импортировано $1 запиÑей журнала}}.',
'importfailed' => 'Ðе удалоÑÑŒ импортировать: $1',
'importunknownsource' => 'ÐеизвеÑтный тип импортируемой Ñтраницы',
'importcantopen' => 'Ðевозможно открыть импортируемый файл',
@@ -2720,6 +2798,8 @@ $1',
'tooltip-upload' => 'Ðачать загрузку',
'tooltip-rollback' => 'Одним нажатием убрать изменениÑ, Ñделанные поÑледним редактором',
'tooltip-undo' => 'Убрать внеÑённую правку и показать предпроÑмотр, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью указать причину отмены',
+'tooltip-preferences-save' => 'Сохранить наÑтройки',
+'tooltip-summary' => 'Введите краткое опиÑание',
# Stylesheets
'common.css' => '/** Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем темам Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ */',
@@ -2837,14 +2917,17 @@ $1',
'thumbsize' => 'Размер уменьшенной верÑии изображениÑ:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|Ñтраница|Ñтраницы|Ñтраниц}}',
-'file-info' => '(размер файла: $1, MIME-тип: $2)',
-'file-info-size' => '($1 × $2 {{PLURAL:$2|пикÑел|пикÑела|пикÑелов}}, размер файла: $3, MIME-тип: $4)',
+'file-info' => 'размер файла: $1, MIME-тип: $2',
+'file-info-size' => '$1 × $2 пикÑелов, размер файла: $3, MIME-тип: $4',
'file-nohires' => '<small>Ðет верÑии Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ разрешением.</small>',
-'svg-long-desc' => '(SVG-файл, номинально $1 × $2 {{PLURAL:$2|пикÑел|пикÑела|пикÑелов}}, размер файла: $3)',
+'svg-long-desc' => 'SVG-файл, номинально $1 × $2 пикÑелов, размер файла: $3',
'show-big-image' => 'Изображение в более выÑоком разрешении',
'show-big-image-thumb' => '<small>Размер при предпроÑмотре: $1 × $2 {{PLURAL:$2|пикÑел|пикÑела|пикÑелов}}</small>',
'file-info-gif-looped' => 'закольцованный',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм|фрейма|фреймов}}',
+'file-info-png-looped' => 'закольцованный',
+'file-info-png-repeat' => 'проигрываетÑÑ $1 {{PLURAL:$1|раз|раза|раз}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадр|кадра|кадров}}',
# Special:NewFiles
'newimages' => 'Ð“Ð°Ð»ÐµÑ€ÐµÑ Ð½Ð¾Ð²Ñ‹Ñ… файлов',
@@ -3005,6 +3088,7 @@ $1',
'exif-gpsareainformation' => 'Ðазвание облаÑти GPS',
'exif-gpsdatestamp' => 'Дата',
'exif-gpsdifferential' => 'Ð”Ð¸Ñ„Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð¿Ñ€Ð°Ð²ÐºÐ°',
+'exif-objectname' => 'Краткое название',
# EXIF attributes
'exif-compression-1' => 'ÐеÑжатый',
@@ -3167,29 +3251,29 @@ $1',
'limitall' => 'вÑе',
# E-mail address confirmation
-'confirmemail' => 'Подтверждение адреÑа Ñлектронной почты',
-'confirmemail_noemail' => 'Ð’Ñ‹ не задали Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в Ñвоих [[Special:Preferences|наÑтройках]], либо он некорректен.',
-'confirmemail_text' => 'Вики-движок требует Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты перед тем, как начать Ñ Ð½Ð¸Ð¼ работать.
+'confirmemail' => 'Подтверждение адреÑа Ñлектронной почты',
+'confirmemail_noemail' => 'Ð’Ñ‹ не задали Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в Ñвоих [[Special:Preferences|наÑтройках]], либо он некорректен.',
+'confirmemail_text' => 'Вики-движок требует Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты перед тем, как начать Ñ Ð½Ð¸Ð¼ работать.
Ðажмите на кнопку, чтобы на указанный Ð°Ð´Ñ€ÐµÑ Ð±Ñ‹Ð»Ð¾ отправлено пиÑьмо, Ñодержащее ÑÑылку на Ñпециальную Ñтраницу, поÑле Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ в браузере Ð°Ð´Ñ€ÐµÑ Ñлектронной почты будет ÑчитатьÑÑ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´Ñ‘Ð½Ð½Ñ‹Ð¼.',
-'confirmemail_pending' => 'ПиÑьмо Ñ ÐºÐ¾Ð´Ð¾Ð¼ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ было отправлено.
+'confirmemail_pending' => 'ПиÑьмо Ñ ÐºÐ¾Ð´Ð¾Ð¼ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ было отправлено.
ЕÑли вы недавно Ñоздали учётную запиÑÑŒ, то, вероÑтно,
вам Ñледует подождать неÑколько минут, пока пиÑьмо придёт, перед тем, как запроÑить код ещё раз.',
-'confirmemail_send' => 'Отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение',
-'confirmemail_sent' => 'ПиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение отправлено.',
-'confirmemail_oncreate' => 'ПиÑьмо Ñ ÐºÐ¾Ð´Ð¾Ð¼ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¾ отправлено на указанный вами почтовый Ñщик.
+'confirmemail_send' => 'Отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение',
+'confirmemail_sent' => 'ПиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение отправлено.',
+'confirmemail_oncreate' => 'ПиÑьмо Ñ ÐºÐ¾Ð´Ð¾Ð¼ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¾ отправлено на указанный вами почтовый Ñщик.
Данный код не требуетÑÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в ÑиÑтему, однако вы должны указать его,
прежде чем будет разрешено иÑпользование возможноÑтей Ñлектронной почты в Ñтом проекте.',
-'confirmemail_sendfailed' => '{{SITENAME}} не может отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение.
+'confirmemail_sendfailed' => '{{SITENAME}} не может отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение.
ПожалуйÑта, проверьте правильноÑÑ‚ÑŒ адреÑа Ñлектронной почты.
Ответ Ñервера: $1',
-'confirmemail_invalid' => 'Ðеправильный код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð´Ð° иÑтёк.',
-'confirmemail_needlogin' => 'Ð’Ñ‹ должны $1 Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ адреÑа Ñлектронной почты.',
-'confirmemail_success' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтверждён.',
-'confirmemail_loggedin' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтверждён.',
-'confirmemail_error' => 'Во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты произошла ошибка.',
-'confirmemail_subject' => '{{SITENAME}}:Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подтверждение адреÑа Ñлектронной почты',
-'confirmemail_body' => 'Кто-то (возможно вы) Ñ IP-адреÑом $1 зарегиÑтрировал
+'confirmemail_invalid' => 'Ðеправильный код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð´Ð° иÑтёк.',
+'confirmemail_needlogin' => 'Ð’Ñ‹ должны $1 Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ адреÑа Ñлектронной почты.',
+'confirmemail_success' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтверждён.',
+'confirmemail_loggedin' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтверждён.',
+'confirmemail_error' => 'Во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты произошла ошибка.',
+'confirmemail_subject' => '{{SITENAME}}:Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подтверждение адреÑа Ñлектронной почты',
+'confirmemail_body' => 'Кто-то (возможно вы) Ñ IP-адреÑом $1 зарегиÑтрировал
на Ñервере проекта {{SITENAME}} учётную запиÑÑŒ «$2»,
указав Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.
@@ -3205,8 +3289,36 @@ $3
$5
Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹Ñтвителен до $4.',
-'confirmemail_invalidated' => 'Подтверждение адреÑа Ñлектронной почты отменено',
-'invalidateemail' => 'Отменить подтверждение адреÑа Ñл. почты',
+'confirmemail_body_changed' => 'Кто-то (возможно вы) Ñ IP-адреÑом $1
+указал данный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в качеÑтве нового Ð´Ð»Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи «$2» в проекте {{SITENAME}}.
+
+Чтобы подтвердить, что Ñта ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ дейÑтвительно принадлежит вам,
+и включить возможноÑÑ‚ÑŒ отправки пиÑем Ñ Ñайта {{SITENAME}}, откройте приведённую ниже ÑÑылку в браузере.
+
+$3
+
+ЕÑли Ð´Ð°Ð½Ð½Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ *не* отноÑитÑÑ Ðº вам, то перейдите по Ñледующей ÑÑылке,
+чтобы отменить подтверждение адреÑа
+
+$5
+
+Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹Ñтвителен до $4.',
+'confirmemail_body_set' => 'Кто-то (возможно вы) Ñ IP-адреÑом $1
+указал данный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ð´Ð»Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи «$2» в проекте {{SITENAME}}.
+
+Чтобы подтвердить, что Ñта ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ дейÑтвительно принадлежит вам,
+и включить возможноÑÑ‚ÑŒ отправки пиÑем Ñ Ñайта {{SITENAME}}, откройте приведённую ниже ÑÑылку в браузере.
+
+$3
+
+ЕÑли Ð´Ð°Ð½Ð½Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ *не* отноÑитÑÑ Ðº вам, то перейдите по Ñледующей ÑÑылке,
+чтобы отменить подтверждение адреÑа
+
+$5
+
+Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹Ñтвителен до $4.',
+'confirmemail_invalidated' => 'Подтверждение адреÑа Ñлектронной почты отменено',
+'invalidateemail' => 'Отменить подтверждение адреÑа Ñл. почты',
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» отключён]',
@@ -3248,6 +3360,7 @@ $1',
'table_pager_first' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница',
'table_pager_last' => 'ПоÑледнÑÑ Ñтраница',
'table_pager_limit' => 'Показать $1 Ñлементов на Ñтранице',
+'table_pager_limit_label' => 'ЗапиÑей на Ñтраницу:',
'table_pager_limit_submit' => 'Выполнить',
'table_pager_empty' => 'Ðе найдено',
@@ -3352,6 +3465,7 @@ $1',
'version-specialpages' => 'Служебные Ñтраницы',
'version-parserhooks' => 'Перехватчики ÑинтакÑичеÑкого анализатора',
'version-variables' => 'Переменные',
+'version-skins' => 'Темы оформлениÑ',
'version-other' => 'Иное',
'version-mediahandlers' => 'Обработчики медиа',
'version-hooks' => 'Перехватчики',
@@ -3363,6 +3477,13 @@ $1',
'version-hook-subscribedby' => 'ПодпиÑан на',
'version-version' => '(ВерÑÐ¸Ñ $1)',
'version-license' => 'ЛицензиÑ',
+'version-poweredby-credits' => "Эта вики работает на движке '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'другие',
+'version-license-info' => 'MediaWiki ÑвлÑетÑÑ Ñвободным программным обеÑпечением, которое вы можете раÑпроÑтранÑÑ‚ÑŒ и/или изменÑÑ‚ÑŒ в ÑоответÑтвии Ñ ÑƒÑловиÑми лицензии GNU General Public License, опубликованной фондом Ñвободного программного обеÑпечениÑ; второй верÑии, либо любой более поздней верÑии.
+
+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 или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].',
'version-software' => 'УÑтановленное программное обеÑпечение',
'version-software-product' => 'Продукт',
'version-software-version' => 'ВерÑиÑ',
@@ -3432,6 +3553,15 @@ $1',
'tags-edit' => 'править',
'tags-hitcount' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}}',
+# Special:ComparePages
+'comparepages' => 'Сравнение Ñтраниц',
+'compare-selector' => 'Сравнение верÑий Ñтраниц',
+'compare-page1' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница',
+'compare-page2' => 'Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ñтраница',
+'compare-rev1' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ',
+'compare-rev2' => 'Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ð²ÐµÑ€ÑиÑ',
+'compare-submit' => 'Сравнить',
+
# Database error messages
'dberr-header' => 'Эта вики иÑпытывает затруднениÑ',
'dberr-problems' => 'Извините! Ðа данном Ñайте возникли техничеÑкие трудноÑти.',
@@ -3448,8 +3578,13 @@ $1',
'htmlform-float-invalid' => 'Указанное вами значение не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом.',
'htmlform-int-toolow' => 'Указанное вами значение ниже минимального — $1',
'htmlform-int-toohigh' => 'указанное вами значение выше макÑимального — $1',
+'htmlform-required' => 'Это значение необходимо',
'htmlform-submit' => 'Отправить',
'htmlform-reset' => 'Отменить изменениÑ',
'htmlform-selectorother-other' => 'Иное',
+# SQLite database support
+'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ полнотекÑтового поиÑка',
+'sqlite-no-fts' => '$1 без поддержки полнотекÑтового поиÑка',
+
);
diff --git a/languages/messages/MessagesRue.php b/languages/messages/MessagesRue.php
index 1417987d..f59c3247 100644
--- a/languages/messages/MessagesRue.php
+++ b/languages/messages/MessagesRue.php
@@ -15,6 +15,25 @@
$fallback = 'uk';
+$namespaceNames = array(
+ NS_MEDIA => 'Медіа',
+ NS_SPECIAL => 'Шпеціална',
+ NS_TALK => 'ДіÑкузіа',
+ NS_USER => 'ХоÑнователь',
+ NS_USER_TALK => 'ДіÑкузіа_з_хоÑнователём',
+ NS_PROJECT_TALK => 'ДіÑкузіÑ_ку_{{grammar:3sg|$1}}',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'ДіÑкузіÑ_ку_файлу',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'ДізкузіÑ_ку_MediaWiki',
+ NS_TEMPLATE => 'Шаблона',
+ NS_TEMPLATE_TALK => 'ДіÑкузіÑ_ку_шаблонї',
+ NS_HELP => 'Поміч',
+ NS_HELP_TALK => 'ДіÑкузіÑ_ку_помочі',
+ NS_CATEGORY => 'КатеґоріÑ',
+ NS_CATEGORY_TALK => 'ДіÑкузіÑ_ку_катеґорії',
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'ПідкреÑлёвати одказы:',
@@ -31,8 +50,7 @@ $messages = array(
'tog-editsection' => 'Поволити ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñекції Ñторінкы через одказ [едіт.]',
'tog-editsectiononrightclick' => 'Поволити ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñекції Ñторінкы через ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð² клапков мышкы на надпиÑÑ‹ Ñторінок (JavaScript)',
'tog-showtoc' => 'Вказовати обÑÑг (на Ñторінках з веце Ñк трёма надпиÑами)',
-'tog-rememberpassword' => 'ЗапамÑтати моє Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð½Ð° тім компютері',
-'tog-editwidth' => 'РоÑшырёвати поле ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð½Ð° цілу образовку',
+'tog-rememberpassword' => 'ЗапамÑтати моє Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð½Ð° тім переглÑдачу (макÑімално $1 {{PLURAL:$1|день|днів}})',
'tog-watchcreations' => 'Придавати Ñторінкы Ñтворены мнов до мого ÑпиÑку Ñлїдованых',
'tog-watchdefault' => 'Придавати мнов едітованы Ñторінкы до ÑпиÑку Ñлїдованых',
'tog-watchmoves' => 'Придавати переменованы Ñторінкы до мого ÑпиÑку Ñлїдованых',
@@ -177,31 +195,21 @@ $messages = array(
'faqpage' => 'Project:ЧаÑÑ‚Ñ‹ звідованÑ',
# Vector skin
-'vector-action-addsection' => 'Придати тему',
-'vector-action-delete' => 'Вымазати',
-'vector-action-move' => 'Переменовати',
-'vector-action-protect' => 'Хранити',
-'vector-action-undelete' => 'Обновити',
-'vector-action-unprotect' => 'Одомкнути',
-'vector-namespace-category' => 'КатеґоріÑ',
-'vector-namespace-help' => 'Сторінка помочі',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Сторінка',
-'vector-namespace-media' => 'Медіа-Ñторінка',
-'vector-namespace-mediawiki' => 'Ознам',
-'vector-namespace-project' => 'Сторінка проєкту',
-'vector-namespace-special' => 'Шпеціална Ñторінка',
-'vector-namespace-talk' => 'ДіÑкузіÑ',
-'vector-namespace-template' => 'Шаблона',
-'vector-namespace-user' => 'Сторінка хоÑнователÑ',
-'vector-view-create' => 'Вытворити',
-'vector-view-edit' => 'Едітовати',
-'vector-view-history' => 'Відїти Ñ–Ñторію',
-'vector-view-view' => 'Чітати',
-'vector-view-viewsource' => 'Відїти код',
-'actions' => 'Дїї',
-'namespaces' => 'ПроÑторы назв',
-'variants' => 'Варіанты',
+'vector-action-addsection' => 'Придати тему',
+'vector-action-delete' => 'Вымазати',
+'vector-action-move' => 'Переменовати',
+'vector-action-protect' => 'Хранити',
+'vector-action-undelete' => 'Обновити',
+'vector-action-unprotect' => 'Одомкнути',
+'vector-simplesearch-preference' => 'Поволити роÑшырены пропозіції глÑÐ´Ð°Ð½Ñ (лем взглÑд Vector )',
+'vector-view-create' => 'Створити',
+'vector-view-edit' => 'Едітовати',
+'vector-view-history' => 'Видїти Ñ–Ñторію',
+'vector-view-view' => 'Чітати',
+'vector-view-viewsource' => 'Видїти код',
+'actions' => 'Дїї',
+'namespaces' => 'ПроÑторы назв',
+'variants' => 'Варіанты',
'errorpagetitle' => 'Хыба',
'returnto' => 'ÐÐ°Ð²ÐµÑ€Ð½ÑƒÑ‚Ñ Ð´Ð¾ Ñторінкы «$1».',
@@ -240,14 +248,14 @@ $messages = array(
'talk' => 'ДіÑкузіÑ',
'views' => 'ПереглÑды',
'toolbox' => 'Інштрументы',
-'userpage' => 'Відїти Ñторінку хоÑнователÑ',
-'projectpage' => 'Відїти Ñторінку проєкту',
-'imagepage' => 'Відїти Ñторінку файлу',
-'mediawikipage' => 'Відїти Ñторінку віÑÑ‚Ñ—',
-'templatepage' => 'Відїти шаблону',
-'viewhelppage' => 'Відїти Ñторінку помочі',
-'categorypage' => 'Відїти Ñторінку катеґорії',
-'viewtalkpage' => 'Відїти діÑкузію',
+'userpage' => 'Видїти Ñторінку хоÑнователÑ',
+'projectpage' => 'Видїти Ñторінку проєкту',
+'imagepage' => 'Видїти Ñторінку файлу',
+'mediawikipage' => 'Видїти Ñторінку повідомлїнь',
+'templatepage' => 'Видїти шаблону',
+'viewhelppage' => 'Видїти Ñторінку помочі',
+'categorypage' => 'Видїти Ñторінку катеґорії',
+'viewtalkpage' => 'Видїти діÑкузію',
'otherlanguages' => 'Іншыма Ñзыками',
'redirectedfrom' => '(ÐапрÑмленый з $1)',
'redirectpagesub' => 'Сторінка-напрÑмлїнÑ',
@@ -262,6 +270,9 @@ $messages = array(
ПроÑиме ВаÑ, почекайте Ñ– Ñпробуйте доÑтупноÑÑ‚ÑŒ пізнїше.
$1',
+'pool-timeout' => 'Ð§Ð°Ñ ÑÐºÑ–Ð½Ñ‡Ñ–Ð½Ñ Ñ‡ÐµÐºÐ°Ñ‚ÑŒ про замок',
+'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' => 'O {{grammar:accusative|{{SITENAME}}}}',
@@ -298,9 +309,9 @@ $1',
'youhavenewmessagesmulti' => 'Маєте новы ознамы на $1',
'editsection' => 'едіт.',
'editold' => 'едіт.',
-'viewsourceold' => 'відїти код',
+'viewsourceold' => 'видїти код',
'editlink' => 'едітовати',
-'viewsourcelink' => 'відїти код',
+'viewsourcelink' => 'видїти код',
'editsectionhint' => 'Едітовати Ñекцію: $1',
'toc' => 'ОбÑÑг',
'showtoc' => 'вказати',
@@ -392,12 +403,12 @@ $1',
'wrong_wfQuery_params' => 'Ðеправилны параметры функцій wfQuery()<br />
ФункціÑ: $1<br />
ЗапроÑ: $2',
-'viewsource' => 'Відїти код',
+'viewsource' => 'Видїти код',
'viewsourcefor' => 'Сторінка «$1»',
'actionthrottled' => 'ÐÐºÑ†Ñ–Ñ Ð±Ñ‹Ð»Ð° придушена',
'actionthrottledtext' => 'ВзглÑдом ку протиÑпамовым опатрїнÑм не можете жадану акцію провеÑти барз чаÑто в короткім чаÑÑ—. Спробуйте то знову о пару мінут.',
'protectedpagetext' => 'Тота Ñторінка была замкнута, также ÑÑ Ð½Ðµ даÑÑ‚ÑŒ едітовати',
-'viewsourcetext' => 'Можете відїти Ñ– копіровати код той Ñторінкы:',
+'viewsourcetext' => 'Можете видїти Ñ– копіровати код той Ñторінкы:',
'protectedinterface' => 'Тота Ñторінка Ñ” чаÑтинов інтрефейÑу проґрамового Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡Ñ–Ð½Ñ Ñ– єй можуть едітовати лем адмініÑтраторы проєкту.',
'editinginterface' => "'''Увага:''' Едітуєте Ñторінку,котра Ñ” чаÑтинов текÑтового інтерфейÑу. Зміны той Ñторінкы выкличуть зміну інтерфейÑу про іншых хоÑнователїв. Про переклад ÑƒÐ²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ñ…Ð¾Ñнуйте [http://translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°Ñ” локалізаціёв MediaWiki.",
'sqlhidden' => '(SQL Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñкрытый)',
@@ -423,23 +434,25 @@ $2',
'yourname' => 'Мено хоÑнователÑ:',
'yourpassword' => 'ГеÑло:',
'yourpasswordagain' => 'ПовторÑйте геÑло:',
-'remembermypassword' => 'ЗапамÑтати моє Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð½Ð° тім компютері',
+'remembermypassword' => 'ЗапамÑтати моє Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð½Ð° тім компютерї (макÑімално $1 {{PLURAL:$1|день|днів}})',
+'securelogin-stick-https' => 'ОÑтаньте припоєны через HTTPS по приголошіню',
'yourdomainname' => 'Ваша домена:',
'externaldberror' => 'Ðбо ÑÑ Ñтала хыба екÑтерной автентіфікачной датабазы, або не маєте поволено мінити Ñвоє екÑтерне конто.',
'login' => 'ПриголошінÑ',
-'nav-login-createaccount' => 'ÐŸÑ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ / Ð’Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð°',
+'nav-login-createaccount' => 'ÐŸÑ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ / ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð°',
'loginprompt' => 'Ку приголошіню до {{grammar:2sg|{{SITENAME}}}} муÑите мати поволены cookies.',
-'userlogin' => 'ÐŸÑ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ / Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð°',
+'userlogin' => 'ÐŸÑ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ / ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð°',
'userloginnocreate' => 'ПриголошінÑ',
'logout' => 'ОдголоÑити',
'userlogout' => 'ОдголошінÑ',
'notloggedin' => 'Ðе Ñьте приголошеный(а)',
'nologin' => "До теперь не маєте конто? '''$1'''.",
-'nologinlink' => 'Вытворити конто',
+'nologinlink' => 'Створити конто',
'createaccount' => 'Вытворити конто',
'gotaccount' => "Уж Ñьте реґіÑтрованы? '''$1'''.",
'gotaccountlink' => 'ПриголошінÑ',
'createaccountmail' => 'електроничнов поштов',
+'createaccountreason' => 'Причіна:',
'badretype' => 'Вами напиÑаны геÑла не ÑуглаÑÑÑ‚ÑŒ.',
'userexists' => 'Уведжене мено хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ¶ екзіÑтує.
Звольте інше мено.',
@@ -461,6 +474,7 @@ $2',
'wrongpasswordempty' => 'Было задане порожнє геÑло. Спробуйте іщі раз.',
'passwordtooshort' => 'ГеÑло муÑить быти довге холем $1 {{PLURAL:$1|знак|знакы|знаків}}.',
'password-name-match' => 'Ваше геÑло не може быти таке Ñаме Ñк Ñ– ваше хоÑновательÑке мено.',
+'password-login-forbidden' => 'ХоÑÐ½Ð¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð³Ð¾ мена хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ– геÑла было заказане.',
'mailmypassword' => 'ПоÑлати нове геÑло',
'passwordremindertitle' => 'Ðове дочаÑне геÑло на {{grammar:4sg|{{SITENAME}}}}',
'passwordremindertext' => 'ХтоÑÑŒ (може Ð’Ñ‹, з IP адреÑÑ‹ $1) пожадав, жебы Ñьме Вам поÑлали нове геÑло
@@ -500,6 +514,9 @@ $2',
'loginlanguagelabel' => 'Язык: $1',
'suspicious-userlogout' => 'Ваша пожадавка на Ð¾Ð´Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð±Ñ‹Ð»Ð° одвергнута, бо вызерає то так, же была поÑлана розбитым переглÑдачом або кешуючім прокÑÑ–-Ñервером.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ðезнама хыба у PHP mail() функції',
+
# Password reset dialog
'resetpass' => 'Змінити геÑло',
'resetpass_announce' => 'Приголошуєте ÑÑ Ð´Ð¾Ñ‡Ð°Ñным геÑлом, котре было поÑлане електронічнов поштов. Про Ð·Ð°ÐºÐ¾Ð½Ñ‡Ñ–Ð½Ñ Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ñ‚Ñ€ÐµÐ±Ð° задати нове геÑло ту:',
@@ -548,6 +565,7 @@ $2',
'showlivepreview' => 'Швыдкый наглÑд',
'showdiff' => 'Указати зміны',
'anoneditwarning' => "'''Увага''': Ðе Ñте приголошены. Ваша IP-адреÑа буде запиÑана до Ñ–Ñторії змін той Ñторінкы.",
+'anonpreviewwarning' => "''Ðе Ñьте приголошеный(а). Уложінём буде ваша IP адреÑа запиÑана в Ñ–Ñторії той Ñторінкы.''",
'missingsummary' => "'''ПрипомÑнутÑ:''' Ðе задали Ñьте Ð·Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ñ ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ—. Кідь іщі раз кликтете на Уложыти зміны, буде вапа ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ Ð·Ð°Ð¿Ð¸Ñана без згорнутÑ.",
'missingcommenttext' => 'Задайте коментарь',
'missingcommentheader' => "'''ПрипомÑнутÑ:''' Ðе задали Ñьте тему/Ð½Ð°Ð´Ð¿Ð¸Ñ Ð¿Ñ€Ð¾ тот коментарь.
@@ -619,7 +637,11 @@ $2',
'usercsspreview' => "'''ПамÑтайте, же Ñобі перезерате лем наглÑд вашого хоÑновательÑкого CSS.'''
'''Іщі не было уложено!'''",
'userjspreview' => "'''ПамÑтайте, же теÑтуєте а перезерате лем наглÑд вашого хоÑновательÑкого JavaScript-у, іщі не быв уложеный!'''",
-'userinvalidcssjstitle' => "'''Увага:''' Тема взглÑду „$1“ не екзіÑтує. Ðе забудьте, же хоÑновательÑке .css Ñ– .js файлы хоÑнують малы пиÑмена, наприклад {{ns:user}}:{{BASEPAGENAME}}/monobook.css, а не {{ns:user}}:{{BASEPAGENAME}}/Monobook.css.",
+'sitecsspreview' => "'''ПамÑтайте, же Ñобі перезерате лем наглÑд того CSS.'''
+'''Іщі не было уложене!'''",
+'sitejspreview' => "'''ПамÑтайте, же Ñобі перезерате лем наглÑд того JavaScript-у.'''
+'''Іщі не быв уложеный!'''",
+'userinvalidcssjstitle' => "'''Увага:''' Тема взглÑду „$1“ не екзіÑтує. Ðе забудьте, же хоÑновательÑке .css Ñ– .js файлы хоÑнують малы пиÑмена, наприклад {{ns:user}}:{{BASEPAGENAME}}/vector.css, а не {{ns:user}}:{{BASEPAGENAME}}/Vector.css.",
'updated' => '(Зміна уложена)',
'note' => "'''Позначка:'''&nbsp;",
'previewnote' => "'''ПамÑтайте, же то лем попереднїй переглÑд,
@@ -656,7 +678,6 @@ $2',
'''ÐЕ ПУБЛІКУЙТЕ ТУ БЕЗ ПОВОЛЇÐЯ ÐœÐТЕРІÐЛЫ, ШТО СЯ ОХРÐÐЮЮТЬ ÐВТОРЬСКЫМ ПРÐВОМ!''",
'copyrightwarning2' => "ПроÑиме ВаÑ, уважте, што вшыткы Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ñ Ñ– зміны до {{grammar:2sg|{{SITENAME}}}} можуть быти другыма хоÑнователÑми управлены, змінены ці одÑтранены. Покы Ñобі не желате, жебы ваш текÑÑ‚ быв немилоÑердно управлÑный, пак го до {{grammar:2sg|{{SITENAME}}}} не укладайте.<br />
Уложінём приÑпевку ÑÑ Ð·Ð°Ð²Ñзуєте, же Ñ” вашым дїлом або Ñ” Ñкопірованый із жрідел, котры не Ñуть хоронены авторьÑкым правом (тзв. <em>public domain</em>), детайлы найдете на $1. '''Ðе копіруйте дїла хоронены авторьÑкым правом без дозволїнÑ!'''",
-'longpagewarning' => 'УВÐГÐ: Тота Ñторінка Ñ” $1 КіБ довга; дакотры переглÑдачі можуть мати проблемы з едітованём Ñторінок, котры ÑÑ Ð±Ð»Ð¸Ð¶Ð°Ñ‚ÑŒ або Ñуть довшы Ñк 32 КіБ. ПроÑиме ВаÑ, уважте Ñ€Ð¾Ð·Ð´Ñ—Ð»Ñ—Ð½Ñ Ñторінкы на веце чаÑтей.',
'longpageerror' => "'''ХЫБÐ: Пробуєте уложыти текÑÑ‚ о великоÑти $1 КіБ, причім доволене макÑімум Ñ” $2 КіБ. Ваша ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ Ð½Ðµ може быти уложена.'''",
'readonlywarning' => "'''УВÐГÐ: Датабаза была замкнута про утримованÑ, также не будете мочі уложыти Ñвої зміны. Можете ÑÑ– го окопіровати до файлу Ñ– уложыти го пізнїше.'''
@@ -701,7 +722,7 @@ $2',
'expensive-parserfunction-warning' => 'Увага: Тота Ñторінка обÑÑгує дуже много ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ð²Ñ‹ÐºÐ¾Ð½Ð¾Ð²Ð¾ нарочных функцій парÑера.
Поволеный ліміт Ñ” $2, теперь шак {{PLURAL:$1|ту єдно ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ñ”|ту Ñуть $2 кликанÑ|ту Ñ” $2 кликань}}.',
-'expensive-parserfunction-category' => 'Сторінкы з дуже великым почтом ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— парÑера',
+'expensive-parserfunction-category' => 'Сторінкы з дуже великым чіÑлом ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— парÑера',
'post-expand-template-inclusion-warning' => 'Увага: розмір шаблон про Ð²ÐºÐ»ÑŽÑ‡Ñ–Ð½Ñ Ñ” барз великый.
Дакотры шаблоны не будуть включены.',
'post-expand-template-inclusion-category' => 'Сторінкы з перевышуючов великоÑтёв включеных шаблон',
@@ -832,6 +853,8 @@ $1",
'logdelete-failure' => "'''Ðе подарило ÑÑ Ð½Ð°Ñтавити видительноÑÑ‚ÑŒ протоколу.'''
$1",
'revdel-restore' => 'Змінити видительноÑÑ‚ÑŒ',
+'revdel-restore-deleted' => 'вымазаны ревізії',
+'revdel-restore-visible' => 'видительны ревізії',
'pagehist' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñторінкы',
'deletedhist' => 'Вымазана Ñ–ÑторіÑ',
'revdelete-content' => 'обÑÑг',
@@ -899,10 +922,13 @@ $1",
# Diffs
'history-title' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð·Ð¼Ñ–Ð½ Ñторінкы «$1»',
'difference' => '(роздїл міджі ревізіÑми)',
+'difference-multipage' => '(Роздїлы міджі Ñторінками)',
'lineno' => 'РÑдок $1:',
'compareselectedversions' => 'Порівнати выбраны верзії',
'showhideselectedversions' => 'Вказати/Ñкрыти выбраны ревізії',
'editundo' => 'вернути назад',
+'diff-multi' => '({{PLURAL:$1|Ðе Ñ” зображена єдна міджілегла верзіÑ|Ðе Ñуть зображены $1 міджілеглы верзії|Ðе Ñ” зображено $1 міджілеглых верзій}} од {{PLURAL:$2|1 хоÑнователÑ|$2 хоÑнователїв}} .)',
+'diff-multi-manyusers' => '(Ðе Ñ” зображено $1 міджілеглых верзій од веце Ñк $2 {{PLURAL:$2|хоÑнователÑ|хоÑнователїв}}.)',
# Search results
'searchresults' => 'Резултаты глÑданÑ',
@@ -935,8 +961,9 @@ $1",
'searchprofile-project-tooltip' => 'ПереглÑдавати: $1',
'searchprofile-images-tooltip' => 'ГлÑдати файлы',
'searchprofile-everything-tooltip' => 'ПереглÑдавати вшыток обÑÑг (рахувчі діÑкузны Ñторінкы)',
-'searchprofile-advanced-tooltip' => 'ÐаÑтавлити меновы проÑторы, в котрых ÑÑ Ð¼Ð°Ñ” глÑдати',
+'searchprofile-advanced-tooltip' => 'Задати проÑторы назв, де ÑÑ Ð¼Ð°Ñ‚ÑŒ глÑдати',
'search-result-size' => '$1 ({{PLURAL:$2|Ñлово|Ñлова|Ñлов}})',
+'search-result-category-size' => '{{PLURAL:$1|1 член|$1 члена|$1 членів}} ({{PLURAL:$2|1 підкатеґоріÑ|$2 підкатеґорії|$2 підкатеґорії}}, {{PLURAL:$3|1 файл|$3 файлы|$3 файлів}})',
'search-result-score' => 'ОдповідноÑÑ‚ÑŒ: $1 %',
'search-redirect' => '(напрÑмити $1)',
'search-section' => '(ÑÐµÐºÑ†Ñ–Ñ $1)',
@@ -992,7 +1019,7 @@ $1",
'prefs-rc' => 'ПоÑлїднї зміны',
'prefs-watchlist' => 'Слїдованы Ñторінкы',
'prefs-watchlist-days' => 'ЧіÑло днїв зображеных в Ñлїдованых Ñторінках:',
-'prefs-watchlist-days-max' => '(макÑімалнї 7 днїв)',
+'prefs-watchlist-days-max' => 'МакÑімално 7 днїв',
'prefs-watchlist-edits' => 'ЧіÑло едітовань зображеных во вылїпшенім ÑпиÑку Ñлїдованых Ñторінок:',
'prefs-watchlist-edits-max' => 'МакÑімалне чіÑло: 1000',
'prefs-watchlist-token' => 'Ключ до ÑпиÑку Ñлїдованых Ñторінок:',
@@ -1012,6 +1039,7 @@ $1",
'contextlines' => 'ЧіÑло Ñ€Ñдків на резултат',
'contextchars' => 'ЧіÑло Ñімболів контекÑту на Ñ€Ñдок',
'stub-threshold' => 'Поріг про Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð¾Ð´ÐºÐ°Ð·Ñƒ Ñк <a href="#" class="stub">одказів на "stub"</a> (v bajtech):',
+'stub-threshold-disabled' => 'Выпнуте',
'recentchangesdays' => 'Ðа кілько днїв вказовати новы едітованÑ',
'recentchangesdays-max' => '(макÑімум $1 {{PLURAL:$1|день|днї|днїв}})',
'recentchangescount' => 'ЧіÑло імпліцітно зображованых едітовань:',
@@ -1045,6 +1073,7 @@ $1",
'prefs-files' => 'Файлы',
'prefs-custom-css' => 'ВлаÑтный CSS',
'prefs-custom-js' => 'ВлаÑтный JS',
+'prefs-common-css-js' => 'СдїлÑне CSS/JS про вшыткы штілы:',
'prefs-reset-intro' => 'Помочов той Ñторінкы можете вшыткы наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ на імпліцітны годноты.
Тоту операцію не годен вернути назад.',
'prefs-emailconfirm-label' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ–Ñ‡Ð½Ð¾Ð¹ пошты:',
@@ -1082,9 +1111,15 @@ $1",
'prefs-advancedrendering' => 'Розшырены можноÑти',
'prefs-advancedsearchoptions' => 'Розшырены можноÑти',
'prefs-advancedwatchlist' => 'Розшырены можноÑти',
-'prefs-display' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
+'prefs-displayrc' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
+'prefs-displaysearchoptions' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
+'prefs-displaywatchlist' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
'prefs-diffs' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ð²ÐµÑ€Ð·Ñ–Ñ—',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ÐдреÑа ел. пошты вызерать быти правилна',
+'email-address-validity-invalid' => 'Задайте правилну адреÑу ел. пошты',
+
# User rights
'userrights' => 'Справа хоÑновательÑкых ґруп',
'userrights-lookup-user' => 'Управовати хоÑновательÑкы ґрупы',
@@ -1168,6 +1203,7 @@ $1",
'right-hideuser' => 'Ð‘Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ð¼ÐµÐ½Ð° хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ– ёго ÑхованÑ',
'right-ipblock-exempt' => 'ÐžÐ±Ñ…Ð¾Ð´Ð¶Ñ–Ð½Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ IP адреÑ, Ñ—Ñ… роÑÑÑгів Ñ– автоблокованÑ',
'right-proxyunbannable' => 'ÐžÐ±Ñ…Ð¾Ð´Ð¶Ñ–Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ– Ñерверів',
+'right-unblockself' => 'Одблоковати Ñамого Ñебе',
'right-protect' => 'Зміна уровнї замків Ñ– ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð·Ð°Ð¼ÐºÐ½ÑƒÑ‚Ñ‹Ñ… Ñторінок',
'right-editprotected' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð·Ð°Ð¼ÐºÐ½ÑƒÑ‚Ñ‹Ñ… Ñторінок (без каÑкадового замку)',
'right-editinterface' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу хоÑнователÑ',
@@ -1190,7 +1226,6 @@ $1",
'right-siteadmin' => 'Замыкана Ñ– Ð¾Ð´Ð¾Ð¼Ñ‹ÐºÐ°Ð½Ñ Ð´Ð°Ñ‚Ð°Ð±Ð°Ð·Ñ‹',
'right-reset-passwords' => 'ÐаÑÑ‚Ð°Ð²Ð¾Ð²Ð°Ð½Ñ Ð³ÐµÑел іншым хоÑнователÑм',
'right-override-export-depth' => 'ЕкÑпорт Ñторінок включаючі звÑзаны Ñторінкы з глубков до 5',
-'right-versiondetail' => 'ПереглÑд роÑшыреной інформації про верзію проґрамного забезпечінÑ',
'right-sendemail' => 'ПоÑÑ‹Ð»Ð°Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ñ‹ іншым хоÑнователÑм',
# User rights log
@@ -1241,14 +1276,9 @@ $1",
'recentchanges-legend' => 'МожноÑти поÑлїднїх змін',
'recentchangestext' => 'Слїдуйте поÑлїднї зміны на {{grammar:genitive|{{SITENAME}}}} на тій Ñторінцї.',
'recentchanges-feed-description' => 'Ðа тотїм каналу Ñлїдуєте поÑлїднї зміны на {{grammar:6sg|{{SITENAME}}}}.',
-'recentchanges-label-legend' => 'Леґенда: $1.',
-'recentchanges-legend-newpage' => '$1 — нова Ñторінка',
'recentchanges-label-newpage' => 'Тым едітованём была Ñтворена нова Ñторінка',
-'recentchanges-legend-minor' => '$1 малы едітованÑ',
'recentchanges-label-minor' => 'Тото є мала зміна',
-'recentchanges-legend-bot' => '$1 — ботове едітованÑ',
'recentchanges-label-bot' => 'Тото ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ðµ ботом',
-'recentchanges-legend-unpatrolled' => '$1 – неперевірене едітованÑ',
'recentchanges-label-unpatrolled' => 'Тота зміна дотеперь не была патролёвана.',
'rcnote' => "{{PLURAL:$1|ПоÑÐ»Ñ—Ð´Ð½Ñ '''$1''' зміна|ПоÑлїднї '''$1''' зміны|ПоÑлїднїх '''$1''' змін}} за '''$2''' {{PLURAL:$2|день|днї|днїв}}, на Ñ‡Ð°Ñ $5, $4.",
'rcnotefrom' => 'Ðиже {{PLURAL:$1|Ñ”|Ñуть|Ñ”}} найвеце <b>$1</b> {{PLURAL:$1|зміна|зміны|змін}} од <b>$2</b>.',
@@ -1295,6 +1325,9 @@ $1",
'upload_directory_missing' => 'ÐдреÑарь про Ð½Ð°Ð³Ñ€Ð°Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² ($1) хыбить Ñ– вебовый Ñервер го не годен Ñтворити.',
'upload_directory_read_only' => 'До адреÑÐ°Ñ€Ñ Ð¿Ñ€Ð¾ начітаны файлы ($1) не має вебовый Ñервер права запиÑу.',
'uploaderror' => 'При начітаваню дішло ку хыби',
+'upload-recreate-warning' => "'''Увага: Файл з тов назвов быв Ñкоре змазаный ці переменованый.'''
+
+Ту Ñ” про переглÑд зображеный ÑпиÑок Ð¼Ð°Ð·Ð°Ð½Ñ Ñ– Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð¹ Ñторінкы:",
'uploadtext' => "Ðиже даный формулар Ñлужыть про Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð². Уж начітаны файлы Ñобі можете перезерати Ñ– глÑдати помочов [[Special:FileList|ÑпиÑку начітаных файлів]], качде Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ ÑÑ Ñ‚Ñ‹Ð¶ зазначує до [[Special:Log/upload|книгы начітаванÑ]], Ð·Ð¼Ð°Ð·Ð°Ð½Ñ Ñуть в [[Special:Log/delete|книзї змазаных Ñторінок]].
Про Ð²Ð»Ð¾Ð¶Ñ–Ð½Ñ Ð¾Ð±Ñ€Ð°Ð·ÐºÑƒ до Ñторінкы хоÑнуйте єден з наÑлїдуючіх ÑпоÑобів запиÑу:
@@ -1325,6 +1358,17 @@ $1",
'filetype-unwanted-type' => "„.$1“''' Ñ” нежеланый формат файлу. {{plural:$3|Желаный формат файлів Ñ”|Желаны форматы файлів Ñуть}} $2.",
'filetype-banned-type' => "'''„.$1“''' Ñ” недоволеный формат файлів. {{plural:$3|Поволеный формат файлів Ñ”|Поволены форматы файлів Ñуть}} $2.",
'filetype-missing' => 'Файл не має роÑÑˆÑ‹Ñ€Ñ–Ð½Ñ (наприклад, «.jpg»).',
+'empty-file' => 'Ðачітаный файл Ñ” порожнїй.',
+'file-too-large' => 'Ðачітаный файл Ñ” барз великый.',
+'filename-tooshort' => 'Ðазва файлу Ñ” барз коротка.',
+'filetype-banned' => 'Тот тіп файлу є заказаный.',
+'verification-error' => 'Тот файл не перешов овіринём файлів.',
+'hookaborted' => 'Пожадована вами зміна была одмітнута дакотрым роÑшырінём.',
+'illegal-filename' => 'Тота назва файлу не є поволена.',
+'overwrite' => 'Ðе Ñ” доволене перепиÑати екзіÑтуючій файл.',
+'unknown-error' => 'Дішло ку незнамій хыбі.',
+'tmp-create-error' => 'Ðе подарило ÑÑ Ñтворити дочаÑный файл.',
+'tmp-write-error' => 'Хыба запиÑу до дочаÑного файлу.',
'large-file' => 'Ð¡Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÑ”, жебы довжка файлу непереÑÑговала $1, тот файл має $2.',
'largefileserver' => 'Розмір файлу Ñ” векшый Ñк ліміт наÑтавленый на Ñервері.',
'emptyfile' => 'Файл, котрый Ñьте вложыли ÑÑ Ð²Ð¸Ð´Ð¸Ñ‚ÑŒ быти порожнїй. Могла то запричінити хыба в назві файлу. ПроÑиме, перевірте ці Ñьте Ñправды хотїли вложыти тот файл.',
@@ -1349,13 +1393,14 @@ $1",
'fileexists-shared-forbidden' => 'Файл з тов назвов уж екзіÑтує в здїлÑнім уÑховіщу. Кідь Ñ– наперек тому хочете ваш файл начітати, вернийте ÑÑ Ñ– звольте іншу назву. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Тот файл є дуплікат {{PLURAL:$1|файлу|такых файлів}}:',
'file-deleted-duplicate' => 'Ідентічный файл ку тому ([[:$1]]) быв уж Ñкоре змазаный. Передтым Ñк файл знову награєте, бы Ñьте мали перевірити запиÑÑ‹ о попереднёму змазаню.',
-'successfulupload' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ð±Ñ‹Ð»Ð¾ уÑпішне',
'uploadwarning' => 'Увага про начітанÑ',
'uploadwarning-text' => 'ПроÑиме, зміньте Ð¾Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñƒ ниже Ñ– Ñпробуйте то знову.',
'savefile' => 'Уложыти файл',
'uploadedimage' => 'награв "[[$1]]"',
'overwroteimage' => 'начітана нова Ð²ÐµÑ€Ð·Ñ–Ñ "[[$1]]"',
'uploaddisabled' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² заборонене',
+'copyuploaddisabled' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² через URL Ñ” выпнуте.',
+'uploadfromurl-queued' => 'Ваша пожадавка про Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ была уложена до фронты.',
'uploaddisabledtext' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ñ” выпнуте.',
'php-uploaddisabledtext' => 'Ð’ PHP Ñ” выпнуте Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð². ПроÑиме, перевірте наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ file_uploads.',
'uploadscripted' => 'Тот файл обÑÑгує HTML-код або Ñкріпт, Ñкый може быти неправилно інтерпретованый вебовым переглÑдÑчом.',
@@ -1374,6 +1419,14 @@ $1",
Уважте ці Ñправды треба продовжовати в начітаню того файлу.
Ту Ñ” даный Ð·Ð°Ð¿Ð¸Ñ Ð· книгы змазаных файлів:",
'filename-bad-prefix' => "Ðазва файлу, котрый начітавате ÑÑ Ð·Ð°Ñ‡Ñ–Ð½Ð°Ñ‚ÑŒ на '''„$1“''', што не Ñ” назва звычайно прирÑджована діґіталным фотоапаратом. Звольте іншу назву, котра ваш файл попише лїпше.",
+'upload-success-subj' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ð±Ñ‹Ð»Ð¾ уÑпішне',
+'upload-success-msg' => 'Файл вами начітаный з [$2] Ñ” доÑтупный на [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Проблем з начітаным файлом',
+'upload-failure-msg' => 'У вами начітаного файлу взникнув проблем з [$2]::
+
+$1',
+'upload-warning-subj' => 'Увага про начітанÑ',
+'upload-warning-msg' => 'ÐŸÐ¾Ñ‡Ð°Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ [$2] ÑÑ Ñтав проблем. Кідь го хочете вырїшыти, можете ÑÑ Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ до [[Special:Upload/stash/$1|Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð°Ñ€Ñ Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð²Ð°Ð½Ñ]].',
'upload-proto-error' => 'Ðеплатный протокол',
'upload-proto-error-text' => 'ÐÐ°Ð³Ñ€Ð°Ð½Ñ Ð²Ð·Ð´Ð°Ð»ÐµÐ½Ð¾Ð³Ð¾ файлу пожадує Ð·Ð°Ð·Ð½Ð°Ñ‡Ñ–Ð½Ñ URLs з початком <code>http://</code> або <code>ftp://</code>.',
@@ -1387,22 +1440,23 @@ $1",
'upload-http-error' => 'Дішло ку хыбі HTTP: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'ПриÑтуп одопертый',
-'img-auth-nopathinfo' => 'Хыбить PATH_INFO.
+'img-auth-accessdenied' => 'ПриÑтуп одопертый',
+'img-auth-nopathinfo' => 'Хыбить PATH_INFO.
Ваш Ñервер не Ñ” наÑтавеный так, жебы давав тоту інформацію.
Може фунґує помочов CGI і img_auth на нім не може фунґовати.
Видьте http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => 'Пожадована Ñтежка не Ñ” в конфіґурованім адреÑарю з начітаныма файлами.',
-'img-auth-badtitle' => 'З „$1“ ÑÑ Ð½Ðµ даÑÑ‚ÑŒ Ñтворити платна назва Ñторінкы.',
-'img-auth-nologinnWL' => 'Ðе Ñьте приголошеный Ñ– „$1“ не Ñ” на білім ÑпиÑку.',
-'img-auth-nofile' => 'Файл «$1» не екзіÑтує.',
-'img-auth-isdir' => 'Пробуєте приÑтуповати до адреÑÐ°Ñ€Ñ â€ž$1“.
+'img-auth-notindir' => 'Пожадована Ñтежка не Ñ” в конфіґурованім адреÑарю з начітаныма файлами.',
+'img-auth-badtitle' => 'З „$1“ ÑÑ Ð½Ðµ даÑÑ‚ÑŒ Ñтворити платна назва Ñторінкы.',
+'img-auth-nologinnWL' => 'Ðе Ñьте приголошеный Ñ– „$1“ не Ñ” на білім ÑпиÑку.',
+'img-auth-nofile' => 'Файл «$1» не екзіÑтує.',
+'img-auth-isdir' => 'Пробуєте приÑтуповати до адреÑÐ°Ñ€Ñ â€ž$1“.
Доволеный Ñ” лем приÑтуп к файлам.',
-'img-auth-streaming' => 'Переношать ÑÑ â€ž$1“.',
-'img-auth-public' => 'Помочов img_auth.php ÑÑ Ð¿Ð¾Ñкытують файлы на пріватных вікі.
+'img-auth-streaming' => 'Переношать ÑÑ â€ž$1“.',
+'img-auth-public' => 'Помочов img_auth.php ÑÑ Ð¿Ð¾Ñкытують файлы на пріватных вікі.
Тота вікі Ñ” наÑтавлена Ñк публічна.
З безпечноÑтных причін Ñ” img_auth.php выпнуте.',
-'img-auth-noread' => 'ХоÑнователь не має приÑтуп про Ñ‡Ñ–Ñ‚Ð°Ð½Ñ â€ž$1“.',
+'img-auth-noread' => 'ХоÑнователь не має приÑтуп про Ñ‡Ñ–Ñ‚Ð°Ð½Ñ â€ž$1“.',
+'img-auth-bad-query-string' => 'URL обÑÑгує неправилный одказ.',
# HTTP errors
'http-invalid-url' => 'Ðеправилне URL: $1',
@@ -1434,6 +1488,7 @@ $1",
'listfiles_search_for' => 'ГлÑдати файл по назві:',
'imgfile' => 'файл',
'listfiles' => 'СпиÑок файлів',
+'listfiles_thumb' => 'Мініатура',
'listfiles_date' => 'Датум',
'listfiles_name' => 'Ðазва',
'listfiles_user' => 'ХоÑнователь',
@@ -1464,7 +1519,7 @@ $1",
ÐаÑлїдуючій ÑпиÑок зображує лем {{PLURAL:$1|тоту першу|першы $1|першых $1}}.
Можете Ñобі поÑмотрити [[Special:WhatLinksHere/$2|повный ÑпиÑок]].',
'nolinkstoimage' => 'Ðа тот файл не одказує жадна Ñторінка',
-'morelinkstoimage' => 'Відїти [[Special:WhatLinksHere/$1|далшы одказы]] на тот файл.',
+'morelinkstoimage' => 'Видїти [[Special:WhatLinksHere/$1|далшы одказы]] на тот файл.',
'redirectstofile' => '{{plural:$1|ÐаÑлідуючій файл напрÑмлює|ÐаÑлїдуючі $1 файлы напрÑмлюють|ÐаÑлїдуючіх $1 файлів напрÑмлює}} на тот файл:',
'duplicatesoffile' => '{{plural:$1|ÐаÑлїдуючій файл Ñ” дуплікат|ÐаÑлїдуючі $1 файлы Ñуть дуплікаты|ÐаÑлїдуючіх $1 файлів Ñ” дуплікатами}} того файлу ([[Special:FileDuplicateSearch/$2|детайлы]]):',
'sharedupload' => 'Тот файл Ñ” з $1 Ñ– Ñ” доÑтупным про іншы проекты.',
@@ -1547,8 +1602,8 @@ $1",
'statistics-edits' => 'ЧіÑло ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð¾Ð´ оÑÐ½Ð¾Ð²Ð°Ð½Ñ Ð²Ñ–ÐºÑ– {{SITENAME}}',
'statistics-edits-average' => 'Середнє чіÑло едітовань на Ñторінку',
'statistics-views-total' => 'Вшыткых переглÑдів',
+'statistics-views-total-desc' => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶Ñ–Ð½Ñ Ð½ÐµÑ”Ñтвуючіх Ñ– шпеціалных Ñторінок ÑÑ Ð½Ðµ рахують',
'statistics-views-peredit' => 'ЧіÑло зображінь на едітованÑ',
-'statistics-jobqueue' => 'Довжка [http://www.mediawiki.org/wiki/Manual:Job_queue фронты утримованÑ]',
'statistics-users' => 'РеґіÑтрованы [[Special:ListUsers|хоÑнователї]]',
'statistics-users-active' => 'Ðктівны хоÑнователї',
'statistics-users-active-desc' => 'ХоÑнователї, котры в {{plural:$1|минулого днÑ|минулых $1 днїв}} провели даÑку операцію',
@@ -1559,9 +1614,9 @@ $1",
'disambiguations-text' => "Одказы на наÑлїдуючіх Ñторінках ведуть на '''богатозначны Ñторінкы'''. (Ñторінкы котры обÑÑгують дакотру з Ñ‚Ñ‹Ñ… шаблон на [[MediaWiki:Disambiguationspage|ÑпиÑку шаблон про богатозначны Ñторінкы]]) наміÑто на дану Ñтатю.",
'doubleredirects' => 'Двоїты напрÑмлїнÑ',
-'doubleredirectstext' => 'Тота Ñторінка обÑÑгує Ñторінкы котры напрÑмлюють на інщы Ñторінкы напрÑмлїнÑ.
-Каждый Ñ€Ñдок обÑÑгує одказ на перше Ñ– друге напрÑмлїнÑ, Ñк Ñ– ціль другого напрÑмлїнÑ, котре Ñ” звычайно "реална" цілёва Ñторінка, де перше напрÑÐ¼Ð»Ñ—Ð½Ñ Ð±Ñ‹ мало веÑти.
-<s>Перекрижены</s> запиÑÑ‹ были вырїшены.',
+'doubleredirectstext' => 'Ðа тій Ñторінцї Ñ” ÑпиÑок напрÑмлїн ведучіх на далшы напрÑмлїнÑ.
+Каждый Ñ€Ñдок обÑÑгує одказ на перше Ñ– друге напрÑÐ¼Ð»Ñ—Ð½Ñ Ñ– ку тому ціль другого напрÑмлїнÑ, котрый звычайно вказує мено „реалной“ цілёвой Ñторінкы, на котру бы ÑÑ Ð¼Ð°Ð»Ð¾ перше напрÑÐ¼Ð»Ñ—Ð½Ñ Ð¾Ð´ÐºÐ°Ð·Ð¾Ð²Ð°Ñ‚Ð¸.
+<del>Перечаркнуты</del> положкы уж были вырїшены.',
'double-redirect-fixed-move' => 'Сторінка [[$1]] была переменована, нынї напрÑмлює на [[$2]]',
'double-redirect-fixer' => 'Оправарь напрÑмлїнь',
@@ -1584,6 +1639,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|обєкт|обєкты|обєктів}}',
'nrevisions' => '$1 {{PLURAL:$1|ревізіÑ|ревізії|ревізій}}',
'nviews' => '$1 {{PLURAL:$1|навщіва|навщівы|навщів}}',
+'nimagelinks' => 'ХоÑнованый Ð½Ñ $1 {{PLURAL:$1|Ñторінка|Ñторінкы|Ñторінках}}',
+'ntransclusions' => 'хоÑнованый Ð½Ñ $1 {{PLURAL:$1|Ñторінка|Ñторінкы|Ñторінках}}',
'specialpage-empty' => 'Той пожадавцї не одповідають жадны запиÑÑ‹.',
'lonelypages' => 'Статї-Ñыроты',
'lonelypagestext' => 'ÐаÑлїдуючі Ñторінкы не Ñуть одказованы з іншых Ñторінок на {{grammar:6sg|{{SITENAME}}}} ани до них вложены.',
@@ -1602,7 +1659,7 @@ $1",
'mostlinked' => 'Ðайодказованїшы Ñторінкы',
'mostlinkedcategories' => 'ÐайхоÑнованїшы катеґорії',
'mostlinkedtemplates' => 'Ðайужыванїшы шаблоны',
-'mostcategories' => 'Сторінкы з найвекшым почтом катеґорій',
+'mostcategories' => 'Сторінкы з найвекшым чіÑлом катеґорій',
'mostimages' => 'Ðайужыванїшы файлы',
'mostrevisions' => 'Сторінкы з найвеце ревізіÑми',
'prefixindex' => 'Вшыткы Ñторінкы з початком назв',
@@ -1679,7 +1736,7 @@ $1",
Ðевказаны Ñуть то [[Special:UnusedCategories|нехоÑнованы катеґорії]].
ПоÑмотьте ÑÑ Ñ‚Ñ‹Ð¶ на [[Special:WantedCategories|жаданы катеґорії]].',
'categoriesfrom' => 'Вказати Ñторінкы, што ÑÑ Ð·Ð°Ñ‡Ñ–Ð½Ð°ÑŽÑ‚ÑŒ на:',
-'special-categories-sort-count' => 'упорÑдковати Ð¿Ð¾Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ñ‚Ñƒ',
+'special-categories-sort-count' => 'упорÑдковати Ð¿Ð¾Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтва',
'special-categories-sort-abc' => 'упорÑдковати за алфавітом',
# Special:DeletedContributions
@@ -1741,34 +1798,40 @@ $1",
'listgrouprights-removegroup-self-all' => 'ОдÑÑ‚Ñ€Ð°Ð½Ñ—Ð½Ñ Ñвого контра з хоцьÑкой ґрупы',
# E-mail user
-'mailnologin' => 'Без адреÑÑ‹ одоÑланÑ',
-'mailnologintext' => 'Кідь хочете поÑылати ел. пошту іншым хоÑнователÑм, муÑите ÑÑ [[Special:UserLogin|приголоÑити]] Ñ– мати платну адреÑу ел. пошты в Ñвоїм [[Special:Preferences|наÑтавлїню]].',
-'emailuser' => 'ПоÑлати е-маіл тому хоÑнователёві',
-'emailpage' => 'Пошлийте е-пошту',
-'emailpagetext' => 'Помочов ниже зображеного Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð°Ñ€Ñ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ тому хоÑнователёви поÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ ÐµÐ». поштов.
+'mailnologin' => 'Без адреÑÑ‹ одоÑланÑ',
+'mailnologintext' => 'Кідь хочете поÑылати ел. пошту іншым хоÑнователÑм, муÑите ÑÑ [[Special:UserLogin|приголоÑити]] Ñ– мати платну адреÑу ел. пошты в Ñвоїм [[Special:Preferences|наÑтавлїню]].',
+'emailuser' => 'ПоÑлати е-маіл тому хоÑнователёві',
+'emailpage' => 'Пошлийте е-пошту',
+'emailpagetext' => 'Помочов ниже зображеного Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð°Ñ€Ñ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ тому хоÑнователёви поÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ ÐµÐ». поштов.
ÐдреÑа ел. пошты, котру мате зазначену в [[Special:Preferences|наÑтавлїнÑ]],ÑÑ Ð¾Ð±Ñвить Ñк адреÑа одоÑÑ‹Ð»Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑˆÑ‚Ñ‹, жебы вам адреÑат міг одповіÑти прÑмо.',
-'usermailererror' => 'Хыба поштового проґраму:',
-'defemailsubject' => '{{SITENAME}}: лиÑÑ‚',
-'noemailtitle' => 'Без адреÑÑ‹ ел. пошты',
-'noemailtext' => 'Тот хоÑнователь не зазначів платну адреÑу ел. пошты.',
-'nowikiemailtitle' => 'Ел. пошта не є доволена',
-'nowikiemailtext' => 'Тот хоÑнователь Ñобі не желать діÑтавати пошту од іншых хоÑнователїв.',
-'email-legend' => 'ОдоÑÑ‹Ð»Ð°Ð½Ñ ÐµÐ». пошты іншому хоÑнователёві {{GRAMMAR:2sg|{{SITENAME}}}}',
-'emailfrom' => 'Од:',
-'emailto' => 'Кому:',
-'emailsubject' => 'Тема:',
-'emailmessage' => 'Ознам:',
-'emailsend' => 'ОдоÑлати',
-'emailccme' => 'ПоÑлати копію Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð½Ð° мою адреÑу ел. пошты.',
-'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð¿Ñ€Ð¾ хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1: $2',
-'emailsent' => 'Пошта одоÑлана',
-'emailsenttext' => 'Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð±Ñ‹Ð»Ð¾ поÑлане.',
-'emailuserfooter' => 'Тота ел. пошта была поÑлана з {{grammar:2sg|{{SITENAME}}}} за помочі функції „ПоÑлати ел, пошту“; одоÑлав го хоÑнователь $1 хоÑнователёві $2',
+'usermailererror' => 'Хыба поштового проґраму:',
+'defemailsubject' => '{{SITENAME}}: лиÑÑ‚',
+'usermaildisabled' => 'ПоÑÑ‹Ð»Ð°Ð½Ñ ÐµÐ». пошты Ñ” выпнуте',
+'usermaildisabledtext' => 'Ðе маєте право одоÑылати ел. пошту іншым хоÑнователÑм той вікі',
+'noemailtitle' => 'Без адреÑÑ‹ ел. пошты',
+'noemailtext' => 'Тот хоÑнователь не зазначів платну адреÑу ел. пошты.',
+'nowikiemailtitle' => 'Ел. пошта не є доволена',
+'nowikiemailtext' => 'Тот хоÑнователь Ñобі не желать діÑтавати пошту од іншых хоÑнователїв.',
+'email-legend' => 'ОдоÑÑ‹Ð»Ð°Ð½Ñ ÐµÐ». пошты іншому хоÑнователёві {{GRAMMAR:2sg|{{SITENAME}}}}',
+'emailfrom' => 'Од:',
+'emailto' => 'Кому:',
+'emailsubject' => 'Тема:',
+'emailmessage' => 'Ознам:',
+'emailsend' => 'ОдоÑлати',
+'emailccme' => 'ПоÑлати копію Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð½Ð° мою адреÑу ел. пошты.',
+'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð¿Ñ€Ð¾ хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1: $2',
+'emailsent' => 'Пошта одоÑлана',
+'emailsenttext' => 'Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð±Ñ‹Ð»Ð¾ поÑлане.',
+'emailuserfooter' => 'Тота ел. пошта была поÑлана з {{grammar:2sg|{{SITENAME}}}} за помочі функції „ПоÑлати ел, пошту“; одоÑлав го хоÑнователь $1 хоÑнователёві $2',
+
+# User Messenger
+'usermessage-summary' => 'Зохабити ÑÑ–Ñтемове повідомлїнÑ',
+'usermessage-editor' => 'СіÑтемовый віÑтник',
# Watchlist
'watchlist' => 'Слїдованы Ñторінкы',
'mywatchlist' => 'Слїдованы Ñторінкы',
-'watchlistfor' => "(хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ '''$1''')",
+'watchlistfor2' => 'Про $1 ($2)',
'nowatchlist' => 'Ваш ÑпиÑок Ñлїдованых Ñторінок Ñ” порожнїй.',
'watchlistanontext' => 'Про Ð¿ÐµÑ€ÐµÐ·ÐµÑ€Ð°Ð½Ñ Ñ†Ñ– управу ÑпиÑку Ñлїдованых Ñторінок ÑÑ Ð¼ÑƒÑите $1.',
'watchnologin' => 'Ðе Ñьте приголошеный(а)',
@@ -1810,29 +1873,33 @@ $1",
'enotif_lastvisited' => 'Видьте $1 про ÑпиÑок вшыткых змін од минулой навщівы.',
'enotif_lastdiff' => 'Тоту зміну видьте на $1',
'enotif_anon_editor' => 'анонімный хоÑнователь $1',
-'enotif_body' => 'Учтивый $WATCHINGUSERNAME,
+'enotif_body' => 'Дорогый хоÑнователю $WATCHINGUSERNAME,
-Ð’ $PAGEEDITDATE $CHANGEDORCREATED $PAGEEDITOR Ñторінку $PAGETITLE, видьте актуалну верзію на $PAGETITLE_URL .
+У $PAGEEDITDATE $CHANGEDORCREATED $PAGEEDITOR Ñторінку $PAGETITLE, Ñмотьте актуалну верзію на $PAGETITLE_URL .
$NEWPAGE
+Куртый Ð¾Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½: $PAGESUMMARY $PAGEMINOREDIT
-Ð—Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ñ ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ: $PAGESUMMARY $PAGEMINOREDIT
-
-ХоÑнователÑ, котрый зміну выконав, можете контактовати:
-ел. поштов: $PAGEEDITOR_EMAIL
+ХоÑнователÑ, котрый учінив зміну, можете контактовати:
+імейлом: $PAGEEDITOR_EMAIL
на вікі: $PAGEEDITOR_WIKI
-Покы Ñторінку не навщівите, не будуть вам поÑыланы далшы Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð¾ змінах той Ñторінкы, припадно Ñобі можете вынуловати флаґы в Ñвоїм ÑпиÑку Ñлїдованых Ñторінок.
- З поздравом ваш заÑылач повідомлїнь {{grammar:2sg|{{SITENAME}}}}
+Покы Ñторінку не навщівите, не будуть вам поÑыланы далшы Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ñ Ð¾ змінах той Ñторінкы.
+Припадно Ñобі можете вынуловати флачы у Ñвоїм ÑпиÑку Ñлїдованых Ñторінок.
+
+ Поздравує ваш поÑылач повідомлїнь {{grammar:2sg|{{SITENAME}}}}
--
+Змінити наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ð¾Ð²Ñ‹Ñ… повідомлїнь можете на
+{{fullurl:{{#special:Preferences}}}}
+
ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ñлїдованых Ñторінок можете змінити на
{{fullurl:Special:Watchlist/edit}}
-Сторінку можете із Ñвоїх Ñлїдованых вырÑдити на
+Сторінку можете із Ñвоїх Ñлїдованых вылучіти на
$UNWATCHURL
-Порада і контакты
+Порада і контакт:
{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
@@ -1881,7 +1948,10 @@ $UNWATCHURL
'revertpage' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ â€ž[[Special:Contributions/$2|$2]]“ ([[User talk:$2|діÑкузіÑ]]) вернуты до минулого Ñтаву, котрого автором Ñ” „[[User:$1|$1]]“',
'revertpage-nouser' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (мено хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ” Ñховане) вернуты до минулого Ñтаву, котрого автором Ñ” „[[User:$1|$1]]“',
'rollback-success' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1 было вернуте на оÑтатню ревізію од хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $2.',
-'sessionfailure' => 'ЗдаÑÑ‚ÑŒ ÑÑ, же Ñ” даÑкый проблем з вашым приголошінём;
+
+# Edit tokens
+'sessionfailure-title' => 'Хыба ÑеанÑу',
+'sessionfailure' => 'ЗдаÑÑ‚ÑŒ ÑÑ, же Ñ” даÑкый проблем з вашым приголошінём;
вами жадана актівіта была зрушена Ñк Ð¿Ñ€ÐµÐ²ÐµÐ½Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸ неоправненым приÑтупам.
СтиÑните клапку „назад“, обновте Ñторінку, з котрой Ñьте пришли Ñ– Ñпробуйте то знову;',
@@ -1901,7 +1971,7 @@ $UNWATCHURL
'protect_expiry_invalid' => 'Ðеправилный Ñ‡Ð°Ñ ÑƒÐºÐ¾Ð½Ñ‡Ñ–Ð½Ñ',
'protect_expiry_old' => 'Ð§Ð°Ñ Ñтраты платноÑти Ñ” в минулоÑти.',
'protect-unchain-permissions' => 'ЗприÑтупнити далшы наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð·Ð°Ð¼ÐºÑƒ',
-'protect-text' => "Ту можете відїти Ñ– змінити рівень охраны Ñторінкы '''<nowiki>$1</nowiki>'''.",
+'protect-text' => "Ту можете видїти Ñ– змінити рівень охраны Ñторінкы '''<nowiki>$1</nowiki>'''.",
'protect-locked-blocked' => "Ðе можете мінити наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð·Ð°Ð¼ÐºÑ–Ð² покы Ñьте заблокованый. СучаÑне наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð¿Ñ€Ð¾ тоту Ñторінку Ñ”: '''$1''':",
'protect-locked-dblock' => "ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð·Ð°Ð¼ÐºÑ–Ð² ÑÑ Ð½Ðµ даÑÑ‚ÑŒ змінити про замкнуту датабазу.
СучаÑне наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð¿Ñ€Ð¾ тоту Ñторінку Ñ”: '''$1''':",
@@ -1964,7 +2034,7 @@ $UNWATCHURL
'undelete-nodiff' => 'Ðе найджена жадна Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð²ÐµÑ€Ð·Ñ–Ñ.',
'undeletebtn' => 'Обновити',
'undeletelink' => 'видїти/обновити',
-'undeleteviewlink' => 'відїти',
+'undeleteviewlink' => 'видїти',
'undeletereset' => 'РеÑетовати',
'undeleteinvert' => 'Інвертовати Ñелекцію',
'undeletecomment' => 'Причіна:',
@@ -2007,19 +2077,23 @@ $1',
'month' => 'Од міÑÑÑ†Ñ (Ñ– Ñкоре):',
'year' => 'Од року (Ñ– Ñкоре):',
-'sp-contributions-newbies' => 'Вказати приÑпевкы лем новых конт',
-'sp-contributions-newbies-sub' => 'Ðовы хоÑнователї',
-'sp-contributions-newbies-title' => 'ПриÑпівкы новый хоÑнователїв',
-'sp-contributions-blocklog' => 'Лоґ блокованÑ',
-'sp-contributions-deleted' => 'вымазаны приÑпевкы хоÑнователÑ',
-'sp-contributions-logs' => 'лоґы',
-'sp-contributions-talk' => 'діÑкузіÑ',
-'sp-contributions-userrights' => 'Справа хоÑновательÑкых прав',
-'sp-contributions-blocked-notice' => 'Тот хоÑнователь Ñ” теперь блокованый.
+'sp-contributions-newbies' => 'Вказати приÑпевкы лем новых конт',
+'sp-contributions-newbies-sub' => 'Ðовы хоÑнователї',
+'sp-contributions-newbies-title' => 'ПриÑпівкы новый хоÑнователїв',
+'sp-contributions-blocklog' => 'Лоґ блокованÑ',
+'sp-contributions-deleted' => 'вымазаны приÑпевкы хоÑнователÑ',
+'sp-contributions-uploads' => 'награванÑ',
+'sp-contributions-logs' => 'лоґы',
+'sp-contributions-talk' => 'діÑкузіÑ',
+'sp-contributions-userrights' => 'Справа хоÑновательÑкых прав',
+'sp-contributions-blocked-notice' => 'Тот хоÑнователь Ñ” теперь блокованый.
+ПоÑлїднїй Ð·Ð°Ð¿Ð¸Ñ Ð² лоґах блоковань Ñ” такый:',
+'sp-contributions-blocked-notice-anon' => 'Тота IP адреÑа Ñ” теперь блокована.
ПоÑлїднїй Ð·Ð°Ð¿Ð¸Ñ Ð² лоґах блоковань Ñ” такый:',
-'sp-contributions-search' => 'ГлÑдати приÑпевкы',
-'sp-contributions-username' => 'IP-адреÑа або мено хоÑнователÑ:',
-'sp-contributions-submit' => 'Ðайти',
+'sp-contributions-search' => 'ГлÑдати приÑпевкы',
+'sp-contributions-username' => 'IP-адреÑа або мено хоÑнователÑ:',
+'sp-contributions-toponly' => 'Вказати лем актуалны ревізії',
+'sp-contributions-submit' => 'Ðайти',
# What links here
'whatlinkshere' => 'Одказы на тоту Ñторінку',
@@ -2080,7 +2154,6 @@ $1',
'ipb-edit-dropdown' => 'Едітовати причіны блоковань',
'ipb-unblock-addr' => 'Одблоковати $1',
'ipb-unblock' => 'Одблоковати хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð°Ð±Ð¾ IP адреÑу',
-'ipb-blocklist-addr' => 'ЕкзіÑтуючі Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ð¿Ñ€Ð¾ $1',
'ipb-blocklist' => 'Вказати екзіÑтуючі блокованÑ',
'ipb-blocklist-contribs' => 'ПриÑпевкы хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1',
'unblockip' => 'Одблоковати хоÑнователÑ',
@@ -2149,6 +2222,8 @@ $1 Ñ” уж заблокованый(а). Хочете змінити наÑтаÐ
'sorbs_create_account_reason' => 'Ваша IP-адреÑа Ñ” веджена Ñк одкрытый прокÑÑ– в DNSBL. З той адреÑÑ‹ Ñобі не можете Ñтворити конто.',
'cant-block-while-blocked' => 'Ðе можете блоковати іншых хоÑнователїв, кідь Ñьте Ñам заблокованый(а).',
'cant-see-hidden-user' => 'ХоÑнователь, котрого хочете заблоковати, уж быв заблокованый Ñ– Ñхованый. Кідьже не маєте права hideuser, не можете Ñобі наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð³Ð¾ хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ñмотрити ани го змінити.',
+'ipbblocked' => 'Ðе можете блоковати або одблоковати іншых хоÑнователїв, {{GENDER:|Ñам|Ñама|Ñам}} Ñьте {{GENDER:|заблокованый|заблокована|заблокованый}}',
+'ipbnounblockself' => 'Ðе маєте доволене одблоковати {{GENDER:|Ñам|Ñама|Ñам}} Ñебе',
# Developer tools
'lockdb' => 'Замкнути датабазу',
@@ -2183,6 +2258,18 @@ $1 Ñ” уж заблокованый(а). Хочете змінити наÑтаÐ
'''Ð’ÐРОВÐÐЯ!'''
Тота Ð´Ñ—Ñ Ð¼Ð¾Ð¶Ðµ ÑÑ Ñтати причінов Ñеріозных а неочекованых змін популарных Ñторінок.
ПроÑиме ВаÑ, перед далшым кроком ÑÑ ÑƒÑ‚Ð²ÐµÑ€Ð´ÑŒÑ‚Ðµ, же розуміте вшыткы можны наÑлїдкы.",
+'movepagetext-noredirectfixer' => "ХоÑнувчі форму ниже, можете переменовати Ñторінку, єдным разом переміÑтивши на нове міÑце Ñ– лоґ єй едітовань.
+Стара назва Ñтане перенапрÑмлинём на нову назву.
+Можете автоматично обновити перенапрÑÐ¼Ð»Ð¸Ð½Ñ Ð½Ð° Ñтрау назву.
+Кідь вы тото не зробите, проÑиме ВаÑ, перевірте наÑвніÑÑ‚ÑŒ [[Special:DoubleRedirects|подвойных]] ці [[Special:BrokenRedirects|розорваных]] перенапрÑмлинь.
+Вы зодповідаєте за то, жебы одказы і надалей вказували там, де мають.
+
+Уважте, же Ñторінка '''не''' буде переменована, кідь Ñторінка з новов назвов уж екзіÑтує, окрем того, коли она Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ Ð°Ð±Ð¾ Ñ” напрÑмлинём, а лоґ єй едітовань порожнїй.
+То значіть, же вы можете вернути Ñторінцї Ñтару назву, кідь вы переменовали єй помылково, але вы не можете перепиÑати екзіÑтуючу Ñторінку.
+
+'''Ð’ÐРОВÐÐЯ!'''
+Тота Ð´Ñ—Ñ Ð¼Ð¾Ð¶Ðµ ÑÑ Ñтати причінов Ñеріозных а неочекаваных змін популарных Ñторінок.
+ПроÑиме ВаÑ, перед далшым кроком ÑÑ ÑƒÑ‚Ð²ÐµÑ€Ð´ÑŒÑ‚Ðµ, же розуміте вшыткы можны наÑлїдкы.",
'movepagetalktext' => "ÐÑоціована діÑкузна Ñторінка буде автоматічно переменована, '''окрем:'''
* ÐÐµÐ¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ Ñторінка діÑкузії з таков назвов уж екзіÑтує або
* Ðе означіли Ñьте в полічку ниже.
@@ -2216,7 +2303,7 @@ $1 Ñ” уж заблокованый(а). Хочете змінити наÑтаÐ
'movepage-page-unmoved' => 'Сторінка $1 не може быти переменована на $2.',
'movepage-max-pages' => '{{PLURAL:$1|Была переменована макÑімално поволена єдна Ñторінка|Были переменованы макÑімално поволены $1 Ñторінкы|Было переменоване макÑімално поволеных $1 Ñторінок}}, веце Ñ—Ñ… уж автоматічно переменованых не буде.',
'1movedto2' => 'переменовав «[[$1]]» на «[[$2]]»',
-'1movedto2_redir' => 'переменовав «[[$1]]» на «[[$2]]» поверх напрÑмлинÑ',
+'1movedto2_redir' => 'переменовав «[[$1]]» на «[[$2]]» поверьх напрÑмлїнÑ',
'move-redirect-suppressed' => 'напрÑÐ¼Ð»Ñ—Ð½Ñ Ð½Ðµ Ñтворене',
'movelogpage' => 'Лоґ переменовань',
'movelogpagetext' => 'Тото Ñ” ÑпиÑок вшыткых переменованый Ñторінок.',
@@ -2239,6 +2326,7 @@ $1 Ñ” уж заблокованый(а). Хочете змінити наÑтаÐ
'immobile-source-page' => 'Тота Ñторінка ÑÑ Ð½Ðµ даÑÑ‚ÑŒ переменовати.',
'immobile-target-page' => 'Сторінка ÑÑ Ð½Ðµ даÑÑ‚ÑŒ переменовати на дану назву.',
'imagenocrossnamespace' => 'Ðе даÑÑ‚ÑŒ ÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ñ‚Ð¸ файл мімо проÑтор назв файлів',
+'nonfile-cannot-move-to-file' => 'До проÑтору назв {{ns:file}} ÑÑ Ð½Ðµ дають переменовати Ñторінкы неналежачі ку файлу',
'imagetypemismatch' => 'Ðове роÑÑˆÑ‹Ñ€Ñ—Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ не одповідать ёго тіпу',
'imageinvalidfilename' => 'Ðазва цілёвого файлу не Ñ” платна',
'fix-double-redirects' => 'Оправити вшыткы напрÑÐ¼Ð»Ñ—Ð½Ñ Ð½Ð° початкову назву',
@@ -2311,10 +2399,11 @@ $1 Ñ” уж заблокованый(а). Хочете змінити наÑтаÐ
'import-interwiki-namespace' => 'Цілёвый проÑтор назв:',
'import-upload-filename' => 'Ðазва файлу:',
'import-comment' => 'Коментарь:',
-'importtext' => 'ПроÑиме ВаÑ, екÑпортуйте Ñторінку з іншой вікі помочов [[Special:Export| екÑпорт]], уложте файл на ваш діÑк а потім го награйте ту.',
+'importtext' => 'ПроÑиме ВаÑ, екÑпортуйте Ñторінку з іншой вікі помочов [[Special:Export|інштрументу на екÑпорт]], уложте файл на ваш діÑк а потім го награйте ту.',
'importstart' => 'Імпорт Ñторінок…',
'import-revision-count' => '$1 {{PLURAL:$1|ревізіÑ|ревізії|ревізій}}',
'importnopages' => 'Ðе Ñ” што імпортовати.',
+'imported-log-entries' => '{{PLURAL:$1|Ðаімпортованый 1 протоколовачій запиÑ|Ðаімпортованы $1 протоколовачі запиÑÑ‹|Ðаімпортованых $1 протоколовачіх запиÑів}}.',
'importfailed' => 'Імпорт ÑÑ Ð½Ðµ подарив: $1',
'importunknownsource' => 'Ðезнамый тіп імпортованой Ñторінкы',
'importcantopen' => 'Ðе дало ÑÑ Ð¾Ñ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ файл імпорту',
@@ -2393,21 +2482,23 @@ $1 Ñ” уж заблокованый(а). Хочете змінити наÑтаÐ
'tooltip-ca-nstab-media' => 'Вказати Ñторінку файлу',
'tooltip-ca-nstab-special' => 'Шпеціална Ñторінка, она Ñ” недоÑтупна про едітованÑ',
'tooltip-ca-nstab-project' => 'Сторінка проєкту',
-'tooltip-ca-nstab-image' => 'Відїти код Ñторінкы',
+'tooltip-ca-nstab-image' => 'Видїти код Ñторінкы',
'tooltip-ca-nstab-mediawiki' => 'Вказати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ ÑÑ–Ñтемы',
'tooltip-ca-nstab-template' => 'Видїти шаблону',
-'tooltip-ca-nstab-help' => 'Відїти Ñторінку помочі',
+'tooltip-ca-nstab-help' => 'Видїти Ñторінку помочі',
'tooltip-ca-nstab-category' => 'Сторінка катеґорії',
'tooltip-minoredit' => 'Позначіти тото Ñк незначне едітованÑ',
'tooltip-save' => 'Уложыти вашы зміны',
'tooltip-preview' => 'ÐаглÑд Ñторінкы, проÑиме ВаÑ, хоÑнуйте перед уложінём!',
'tooltip-diff' => 'Вказати зміны, што были зроблены в текÑÑ‚Ñ–.',
-'tooltip-compareselectedversions' => 'Відїти роздїл міджі двома указаныма верзіÑми той Ñторінкы.',
+'tooltip-compareselectedversions' => 'Видїти роздїл міджі двома указаныма верзіÑми той Ñторінкы.',
'tooltip-watch' => 'Придати тоту Ñторінку до ÑпиÑку Ñлїдованых',
'tooltip-recreate' => 'Обновити Ñторінку Ñ– кідь была змазана',
'tooltip-upload' => 'Почати одоÑыланÑ',
'tooltip-rollback' => 'Єдным кликом вернути зміны, зроблены поÑлїдным приÑпівателём',
'tooltip-undo' => 'Зрушыти зміны Ñ– вказати попереднїй переглÑд. ДоволÑÑ” придати причіну до реÑуме.',
+'tooltip-preferences-save' => 'Уложыти наÑтавлїнÑ',
+'tooltip-summary' => 'Задайте курте згорнутÑ',
# Metadata
'nodublincore' => 'Ðа тім Ñервері Ñ” выпнуте Ò‘ÐµÐ½ÐµÑ€Ð¾Ð²Ð°Ð½Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ñ‚ Dublin Core RDF.',
@@ -2496,26 +2587,32 @@ $1',
'nextdiff' => 'Ðовше ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ â†’',
# Media information
+'mediawarning' => "'''Увага''': Тот тіп файлу може обÑÑговати шкодливый код.
+Отворінём файлу можете огрозити Ñвій компютер.",
'imagemaxsize' => "МакÑімалный розмір образку:<br />
''(на Ñторінцї з попиÑом файлу)''",
'thumbsize' => 'ВеликоÑÑ‚ÑŒ наглÑду:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñторінка|Ñторінкы|Ñторінок}}',
-'file-info-size' => '($1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4)',
+'file-info' => 'розмір файлу: $1, MIME-тіп: $2',
+'file-info-size' => '$1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4',
'file-nohires' => '<small>Ðе Ñ” Ð²ÐµÑ€Ð·Ñ–Ñ Ð· векшым розлишінём.</small>',
-'svg-long-desc' => '(SVG-файл, номінално $1 × $2 пікÑелів, розмір файлу: $3)',
+'svg-long-desc' => 'SVG-файл, номінално $1 × $2 пікÑелів, розмір файлу: $3',
'show-big-image' => 'Повне розлишінÑ',
'show-big-image-thumb' => '<small>Розмір переглÑду: $1 × $2 пікÑелів</small>',
'file-info-gif-looped' => 'в Ñлючцї',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Ñнимок|Ñнимкы|Ñнимків}}',
+'file-info-png-looped' => 'в Ñлючцї',
+'file-info-png-repeat' => 'повторÑне $1{{PLURAL:$1|раз|разы}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Ñнимок|Ñнимкы|Ñнимків}}',
# Special:NewFiles
'newimages' => 'ÒÐ°Ð»ÐµÑ€Ñ–Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлів',
'imagelisttext' => "Ðиже Ñ” {{plural:$1|єден файл|ÑпиÑок '''$1'''&nbsp;файлів Ñортованых $2|ÑпиÑок '''$1'''&nbsp;файлів Ñортованых $2}}.",
'newimages-summary' => 'Ðа тій шпеціалній Ñторінцї ÑÑ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÑƒÑŽÑ‚ÑŒ оÑтатнї начітаны файлы.',
'newimages-legend' => 'Філтер',
-'newimages-label' => 'Ðазва файлу (або єй чаÑтина):',
+'newimages-label' => 'Ðазва файлу (або єй чаÑÑ‚ÑŒ):',
'showhidebots' => '($1 ботів)',
-'noimages' => 'Ðе Ñ” што відїти.',
+'noimages' => 'Ðе Ñ” што зобразити.',
'ilsubmit' => 'ГлÑдати',
'bydate' => 'Ð¿Ð¾Ð´Ð»Ñ Ð´Ð°Ñ‚ÑƒÐ¼Ñƒ',
'sp-newimages-showfrom' => 'Вказати новы файлы почінаючі од $2, $1',
@@ -2579,8 +2676,8 @@ $1',
'exif-colorspace' => 'Фаребный проÑтор',
'exif-componentsconfiguration' => 'ÐšÐ¾Ð½Ñ„Ñ–Ò‘ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ–Ð² фарбы',
'exif-compressedbitsperpixel' => 'Компрімачный режім',
-'exif-pixelydimension' => 'Платна шырка образу',
-'exif-pixelxdimension' => 'Платна вышка образу',
+'exif-pixelydimension' => 'Шырка образчіка',
+'exif-pixelxdimension' => 'Вышка образчіка',
'exif-makernote' => 'Позначкы выробника',
'exif-usercomment' => 'Додатковый коментарь',
'exif-relatedsoundfile' => 'ЗвÑзаный звуковый файл',
@@ -2596,9 +2693,9 @@ $1',
'exif-spectralsensitivity' => 'Спектрална чутливоÑÑ‚ÑŒ',
'exif-isospeedratings' => 'СвітлочутливоÑÑ‚ÑŒ ISO',
'exif-oecf' => 'OECF (коефіцієнт оптікоелектрічного перетворїнÑ)',
-'exif-shutterspeedvalue' => 'ШвыдкоÑÑ‚ÑŒ Ñпущі',
-'exif-aperturevalue' => 'Цлона',
-'exif-brightnessvalue' => 'СвітлоÑÑ‚ÑŒ',
+'exif-shutterspeedvalue' => 'ЕкÑпозічный Ñ‡Ð°Ñ (APEX)',
+'exif-aperturevalue' => 'Цлона (APEX)',
+'exif-brightnessvalue' => 'Ð¯Ñ (APEX)',
'exif-exposurebiasvalue' => 'ÐšÐ¾Ð¼Ð¿ÐµÐ½Ð·Ð°Ñ†Ñ–Ñ ÐµÐºÑпозіції',
'exif-maxaperturevalue' => 'Ðайменша цлона',
'exif-subjectdistance' => 'Далеко ку обєкту',
@@ -2662,6 +2759,7 @@ $1',
'exif-gpsareainformation' => 'Ðазва облаÑти GPS',
'exif-gpsdatestamp' => 'GPS датум',
'exif-gpsdifferential' => 'Діференціална ÐºÐ¾Ñ€ÐµÐºÑ†Ñ–Ñ GPS',
+'exif-objectname' => 'Курта назва',
# EXIF attributes
'exif-compression-1' => 'ÐеÑтиÑнутый',
@@ -2819,25 +2917,25 @@ $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_send' => 'ОдоÑлати підтверджовачій код',
+'confirmemail_sent' => 'Підтверджовачій лиÑÑ‚ быв поÑланый.',
+'confirmemail_oncreate' => 'Ðа вашу адреÑу ел. пошты быв поÑланый підтверджовачій код.
Тот код не треба про приголошінÑ, але буде го треба про актівацію дакотрых функцій заложеных на хоÑнованю ел. пошты.',
-'confirmemail_sendfailed' => '{{GRAMMAR:3sg|{{SITENAME}}}} ÑÑ Ð½Ðµ подарило одоÑлати підтверджовачій лиÑÑ‚. Перевірте ці адреÑа не обÑÑгує хыбны буквы.
+'confirmemail_sendfailed' => '{{GRAMMAR:3sg|{{SITENAME}}}} ÑÑ Ð½Ðµ подарило одоÑлати підтверджовачій лиÑÑ‚. Перевірте ці адреÑа не обÑÑгує хыбны буквы.
Поштовый проґрам одповив: $1',
-'confirmemail_invalid' => 'Ðеплатный підтверджовачій код. Може уж уплинула платноÑÑ‚ÑŒ коду.',
-'confirmemail_needlogin' => 'Про Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ñвоёй Ð°Ð´Ñ€ÐµÑ ÐµÐ». пошты ÑÑ Ð¼ÑƒÑите $1.',
-'confirmemail_success' => 'Ваша адреÑа ел. пошты была підтверджена. Ðынї ÑÑ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ [[Special:UserLogin|приголоÑити]] Ñ– хоÑновати вікі.',
-'confirmemail_loggedin' => 'Ваша адреÑа ел. пошты была підтверджена.',
-'confirmemail_error' => 'Ðе подарило ÑÑ ÑƒÐ»Ð¾Ð¶Ñ‹Ñ‚Ð¸ ваше підтверджінÑ.',
-'confirmemail_subject' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹ ел. пошты про {{grammar:4sg|{{SITENAME}}}}',
-'confirmemail_body' => 'ХтоÑÑŒ (аÑÑ– вы, з IP адреÑÑ‹ $1) Ñобі реґіÑтровав конто з меном "$2" Ñ– тов адреÑов ел. пошты на {{grammar:6sg|{{SITENAME}}}}.
+'confirmemail_invalid' => 'Ðеплатный підтверджовачій код. Може уж уплинула платноÑÑ‚ÑŒ коду.',
+'confirmemail_needlogin' => 'Про Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ñвоёй Ð°Ð´Ñ€ÐµÑ ÐµÐ». пошты ÑÑ Ð¼ÑƒÑите $1.',
+'confirmemail_success' => 'Ваша адреÑа ел. пошты была підтверджена. Ðынї ÑÑ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ [[Special:UserLogin|приголоÑити]] Ñ– хоÑновати вікі.',
+'confirmemail_loggedin' => 'Ваша адреÑа ел. пошты была підтверджена.',
+'confirmemail_error' => 'Ðе подарило ÑÑ ÑƒÐ»Ð¾Ð¶Ñ‹Ñ‚Ð¸ ваше підтверджінÑ.',
+'confirmemail_subject' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹ ел. пошты про {{grammar:4sg|{{SITENAME}}}}',
+'confirmemail_body' => 'ХтоÑÑŒ (аÑÑ– вы, з IP адреÑÑ‹ $1) Ñобі реґіÑтровав конто з меном "$2" Ñ– тов адреÑов ел. пошты на {{grammar:6sg|{{SITENAME}}}}.
Кідь Ñобі желате актівовати функції ел. пошты на {{grammar:6sg|{{SITENAME}}}}, так про підтверджінÑ, же тота адреÑа Ñправды належыть вам, перейдите Ñвоїм інтернетовым переглÑдачом на наÑлїдуючу адреÑу:
@@ -2848,8 +2946,35 @@ $3
$5
ПлатноÑÑ‚ÑŒ того коду Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ ÐµÐºÑпірує $4.',
-'confirmemail_invalidated' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹ електронічной пошты было зрушене',
-'invalidateemail' => 'Зрушыти Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹ електронічной пошты',
+'confirmemail_body_changed' => 'ХтоÑÑŒ (аÑÑ– вы, з IP адреÑÑ‹ $1),
+змінив адреÑу ел. пошты ку конту "$2" на {{grammar:6sg|{{SITENAME}}}} на тоту адреÑу.
+
+Кідь Ñобі желате актівовати функції ел. пошты на {{grammar:6sg|{{SITENAME}}}}, так про підтверджінÑ, же тота адреÑа Ñправды належыть вам, перейдите Ñвоїм інтернетовым переглÑдачом на наÑлїдуючу адреÑу:
+
+$3
+
+Кідь Ñьте о тото Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ *не жадали*, кликните на наÑлїднїй одказ, котрым Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð·Ñ€ÑƒÑˆÑ‹Ñ‚Ðµ:
+
+$5
+
+ПлатноÑÑ‚ÑŒ того коду Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ ÐµÐºÑпірує $4.',
+'confirmemail_body_set' => 'Дахто (аÑÑ– вы, з IP адреÑÑ‹ $1) наÑтавив імейлову адреÑу
+конта „$2“ на {{grammar:6sg|{{SITENAME}}}} на тоту адреÑу.
+
+Кідь хочете знову актівовати імейловы функції на
+{{grammar:6sg|{{SITENAME}}}}, так про підтверджінÑ, же тота адреÑа Ñправды
+належыть вам, ідьте Ñвоїм інтернетовым перезерачом на адреÑу ниже:
+
+$3
+
+Кідь вам тото конто *не належыть*, кликните на наÑтупный
+одказ з чім Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð·Ñ€ÑƒÑˆÑ‹Ñ‚Ðµ:
+
+$5
+
+ПлатноÑÑ‚ÑŒ того коду кінчіть $4.',
+'confirmemail_invalidated' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹ електронічной пошты было зрушене',
+'invalidateemail' => 'Зрушыти Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð°Ð´Ñ€ÐµÑÑ‹ електронічной пошты',
# Scary transclusion
'scarytranscludedisabled' => '[Ð’ÐºÐ»Ð°Ð´Ð°Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½ міджі вікі Ñ” выпнуте]',
@@ -2889,6 +3014,7 @@ $1',
'table_pager_first' => 'Перша Ñторінка',
'table_pager_last' => 'ПоÑÐ»Ñ—Ð´Ð½Ñ Ñторінка',
'table_pager_limit' => 'Вказовати $1 елементів на Ñторінцї',
+'table_pager_limit_label' => 'ЗапиÑів на Ñторінку:',
'table_pager_limit_submit' => 'Выконати',
'table_pager_empty' => 'Ðіч не было найджене',
@@ -2944,6 +3070,7 @@ $1',
'version-specialpages' => 'Шпеціалны Ñторінкы',
'version-parserhooks' => 'Припойны пункты парÑера',
'version-variables' => 'Перемінны',
+'version-skins' => 'ВзглÑды',
'version-other' => 'Інше',
'version-mediahandlers' => 'ОбÑлуга медії',
'version-hooks' => 'Припойны пункты',
@@ -2955,6 +3082,13 @@ $1',
'version-hook-subscribedby' => 'ПідпиÑаный на',
'version-version' => '(Ð’ÐµÑ€Ð·Ñ–Ñ $1)',
'version-license' => 'ЛіценціÑ',
+'version-poweredby-credits' => "Тота вікі біжыть на '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'іншы',
+'version-license-info' => 'MediaWiki Ñ” Ñлободный Ñофтвер; можете го шырити або управлÑти Ð¿Ð¾Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¼Ñ–Ð½Ð¾Ðº GNU General Public License, выдаваной Free Software Foundation; будь Ð²ÐµÑ€Ð·Ñ–Ñ 2 той ліценції або (Ð¿Ð¾Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ уважінÑ) будьÑка пізнїша верзіÑ.
+
+MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑновна, але БЕЗ БУДЬЯКОЙ ЗÐРУКЫ; не давають ÑÑ Ð°Ð½Ð¸ зарукы ПРОДÐЙÐОСТИ або Ð’ÐЛУШÐОСТИ ПРО СТÐÐОВЛЕÐЫЙ ЦІЛЬ. Детайлы ÑÑ Ð´Ð¾Ñ‡Ñ–Ñ‚Ð°Ñ‚Ðµ в текÑÑ‚Ñ— GNU General Public License.
+
+[{{SERVER}}{{SCRIPTPATH}}/COPYING Kopii GNU General Public License] Ñьте мали обтримати вєдно з тым проґрамом, кідь нїт, напиште на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA або [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html ÑÑ– єй прочітайте онлайн].',
'version-software' => 'Іншталованый Ñофтвер',
'version-software-product' => 'Продукт',
'version-software-version' => 'ВерзіÑ',
@@ -3024,6 +3158,15 @@ $1',
'tags-edit' => 'едітовати',
'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
+# Special:ComparePages
+'comparepages' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñторінок',
+'compare-selector' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñ€ÐµÐ²Ñ–Ð·Ñ–Ð¹ Ñторінок',
+'compare-page1' => 'Сторінка 1',
+'compare-page2' => 'Сторінка 2',
+'compare-rev1' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ 1',
+'compare-rev2' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ 2',
+'compare-submit' => 'Порівнати',
+
# Database error messages
'dberr-header' => 'Тота вікі має даÑкы проблемы',
'dberr-problems' => 'Перебачте! Тот Ñервер має теперь технічны проблемы.',
@@ -3040,8 +3183,13 @@ $1',
'htmlform-float-invalid' => 'Зазначена величіна не Ñ” чіÑло.',
'htmlform-int-toolow' => 'Вами зазначена величіна Ñ” менша Ñк доволене мінімум $1',
'htmlform-int-toohigh' => 'Вами зазначена величіна Ñ” менша Ñк доволене макÑімум $1',
+'htmlform-required' => 'Тота величіна є повинна',
'htmlform-submit' => 'ОдоÑлати',
'htmlform-reset' => 'Вернути зміны',
'htmlform-selectorother-other' => 'Інше',
+# SQLite database support
+'sqlite-has-fts' => '$1 з підпоров повнотекÑтового глÑданÑ',
+'sqlite-no-fts' => '$1 без підпоры повнотекÑтового глÑданÑ',
+
);
diff --git a/languages/messages/MessagesRuq_cyrl.php b/languages/messages/MessagesRuq_cyrl.php
index e56f776e..0fbdd0f4 100644
--- a/languages/messages/MessagesRuq_cyrl.php
+++ b/languages/messages/MessagesRuq_cyrl.php
@@ -255,11 +255,10 @@ $3',
'allpagessubmit' => 'Треме',
# Watchlist
-'watchlist' => 'Мај клајаеру',
-'mywatchlist' => 'Мај клајаере',
-'watchlistfor' => "(пентру '''$1''')",
-'watch' => 'клајаере',
-'unwatch' => 'Деклајаера',
+'watchlist' => 'Мај клајаеру',
+'mywatchlist' => 'Мај клајаере',
+'watch' => 'клајаере',
+'unwatch' => 'Деклајаера',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'О клајаере...',
diff --git a/languages/messages/MessagesRuq_latn.php b/languages/messages/MessagesRuq_latn.php
index 81be996f..b1c840e1 100644
--- a/languages/messages/MessagesRuq_latn.php
+++ b/languages/messages/MessagesRuq_latn.php
@@ -255,11 +255,10 @@ $3',
'allpagessubmit' => 'Treme',
# Watchlist
-'watchlist' => 'Maj klăaeru',
-'mywatchlist' => 'Maj klăaere',
-'watchlistfor' => "(pentru '''$1''')",
-'watch' => 'klăaere',
-'unwatch' => 'Deklăaera',
+'watchlist' => 'Maj klăaeru',
+'mywatchlist' => 'Maj klăaere',
+'watch' => 'klăaere',
+'unwatch' => 'Deklăaera',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'O klăaere...',
diff --git a/languages/messages/MessagesSa.php b/languages/messages/MessagesSa.php
index aa0e8977..b853caa6 100644
--- a/languages/messages/MessagesSa.php
+++ b/languages/messages/MessagesSa.php
@@ -8,12 +8,15 @@
* @file
*
* @author Bharata
+ * @author Bhawani Gautam
* @author Hemant wikikosh1
* @author Hrishikesh.kb
+ * @author Htt
* @author Kaustubh
* @author Mahitgar
* @author Naveen Sankar
* @author Omnipaedista
+ * @author Vibhijain
* @author రాకేశà±à°µà°°
*/
@@ -35,109 +38,121 @@ $digitTransformTable = array(
$linkPrefixExtension = false;
$namespaceNames = array(
- NS_MEDIA => 'माधà¥à¤¯à¤®',
+ NS_MEDIA => 'माधà¥à¤¯à¤®à¤®à¥',
NS_SPECIAL => 'विशेष',
- NS_TALK => 'संभाषणं',
+ NS_TALK => 'समà¥à¤­à¤¾à¤·à¤£à¤®à¥',
NS_USER => 'योजकः',
- NS_USER_TALK => 'योजकसंभाषणं',
- NS_PROJECT_TALK => '$1संभाषणं',
- NS_FILE => 'चितà¥à¤°à¤‚',
- NS_FILE_TALK => 'चितà¥à¤°à¤¸à¤‚भाषणं',
+ NS_USER_TALK => 'योजकसमà¥à¤­à¤¾à¤·à¤£à¤®à¥',
+ NS_PROJECT_TALK => '$1समà¥à¤­à¤¾à¤·à¤£à¤®à¥',
+ NS_FILE => 'चितà¥à¤°à¤®à¥',
+ NS_FILE_TALK => 'चितà¥à¤°à¤¸à¤®à¥à¤­à¤¾à¤·à¤£à¤®à¥',
NS_MEDIAWIKI => 'मिडीयाविकी',
- NS_MEDIAWIKI_TALK => 'मिडियाविकीसंभाषणं',
- NS_TEMPLATE => 'बिंबधर',
- NS_TEMPLATE_TALK => 'बिंबधर संभाषणं',
- NS_HELP => 'सहायà¥à¤¯',
- NS_HELP_TALK => 'सहायà¥à¤¯à¤¸à¤‚भाषणं',
+ NS_MEDIAWIKI_TALK => 'मिडियाविकीसमà¥à¤­à¤¾à¤·à¤£à¤®à¥',
+ NS_TEMPLATE => 'फलकमà¥',
+ NS_TEMPLATE_TALK => 'फलकसà¥à¤¯_समà¥à¤­à¤¾à¤·à¤£à¤®à¥',
+ NS_HELP => 'सहायà¥à¤¯à¤®à¥',
+ NS_HELP_TALK => 'सहायà¥à¤¯à¤¸à¥à¤¯_समà¥à¤­à¤¾à¤·à¤£à¤®à¥',
NS_CATEGORY => 'वरà¥à¤—ः',
- NS_CATEGORY_TALK => 'वरà¥à¤—संभाषणं',
+ NS_CATEGORY_TALK => 'वरà¥à¤—समà¥à¤­à¤¾à¤·à¤£à¤®à¥',
);
$namespaceAliases = array(
- 'उपकारः' => NS_HELP,
- 'उपकारसंभाषणं' => NS_HELP_TALK,
+ 'माधà¥à¤¯à¤®' => NS_MEDIA,
+ 'संभाषणं' => NS_TALK,
+ 'योजकसंभाषणं' => NS_USER_TALK,
+ '$1संभाषणं' => NS_PROJECT_TALK,
+ 'चितà¥à¤°à¤‚' => NS_FILE,
+ 'चितà¥à¤°à¤¸à¤‚भाषणं' => NS_FILE_TALK,
+ 'मिडियाविकीसंभाषणं' => NS_MEDIAWIKI_TALK,
+ 'बिंबधर' => NS_TEMPLATE,
+ 'बिंबधर संभाषणं' => NS_TEMPLATE_TALK,
+ 'सहायà¥à¤¯' => NS_HELP,
+ 'सहायà¥à¤¯à¤¸à¤‚भाषणं' => NS_HELP_TALK,
+ 'उपकारः' => NS_HELP,
+ 'उपकारसंभाषणं' => NS_HELP_TALK,
+ 'वरà¥à¤—संभाषणं' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
'DoubleRedirects' => array( 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¤¦à¥à¤µà¤‚दà¥à¤µ' ),
'BrokenRedirects' => array( 'खणà¥à¤¡à¥€à¤¤à¤ªà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨' ),
'Disambiguations' => array( 'नि:संदिगà¥à¤§à¥€à¤•à¤°à¤£' ),
- 'Userlogin' => array( 'सदसà¥à¤¯à¤ªà¥à¤°à¤µà¥‡à¤¶' ),
+ 'Userlogin' => array( 'सदसà¥à¤¯à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¨' ),
'Userlogout' => array( 'सदसà¥à¤¯à¤¬à¤¹à¤¿à¤°à¥à¤—मन' ),
'CreateAccount' => array( 'सृजà¥à¤‰à¤ªà¤¯à¥‹à¤œà¤•à¤¸à¤‚जà¥à¤žà¤¾' ),
- 'Preferences' => array( 'पà¥à¤°à¤¿à¤¯à¤µà¤¿à¤•à¤²à¥à¤ª' ),
- 'Watchlist' => array( 'निरीकà¥à¤·à¤¾ सूची' ),
- 'Recentchanges' => array( 'नवीनतम परिवरà¥à¤¤à¤¨' ),
+ 'Preferences' => array( 'इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿' ),
+ 'Watchlist' => array( 'निरीकà¥à¤·à¤¾_सूची' ),
+ 'Recentchanges' => array( 'नवीनतम_परिवरà¥à¤¤à¤¨' ),
'Upload' => array( 'भारंनà¥à¤¯à¤¸à¥à¤¯à¤¤à¤¿' ),
- 'Listfiles' => array( 'चितà¥à¤°à¤¸à¥‚ची' ),
- 'Newimages' => array( 'नूतनसंचिका' ),
+ 'Listfiles' => array( 'चितà¥à¤°à¤¸à¥‚ची', 'संचिकासूचि' ),
+ 'Newimages' => array( 'नूतनसंचिका', 'नूतनचितà¥à¤°à¤¾à¤¨à¤¿' ),
'Listusers' => array( 'सदसà¥à¤¯à¤¾à¤¸à¥‚ची' ),
'Listgrouprights' => array( 'गटअधिकारसूची' ),
'Statistics' => array( 'सांखà¥à¤¯à¤¿à¤•à¥€' ),
- 'Randompage' => array( 'अविशीषà¥à¤Ÿà¤ªà¥ƒà¤·à¥à¤ ' ),
- 'Lonelypages' => array( 'अकलपृषà¥à¤ ' ),
- 'Uncategorizedpages' => array( 'अवरà¥à¤—ीकृतपृषà¥à¤ ' ),
+ 'Randompage' => array( 'अविशीषà¥à¤Ÿà¤ªà¥ƒà¤·à¥à¤ à¤®à¥' ),
+ 'Lonelypages' => array( 'अकलपृषà¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Uncategorizedpages' => array( 'अवरà¥à¤—ीकृतपृषà¥à¤Ÿà¤¾à¤¨à¤¿' ),
'Uncategorizedcategories' => array( 'अवरà¥à¤—ीकृतवरà¥à¤—' ),
- 'Uncategorizedimages' => array( 'अवरà¥à¤—ीकृतसंचिका' ),
- 'Uncategorizedtemplates' => array( 'अवरà¥à¤—ीकृतबिंबधर' ),
+ 'Uncategorizedimages' => array( 'अवरà¥à¤—ीकृतसंचिका', 'अवरà¥à¤—ीकृतचितà¥à¤°à¤¾à¤¨à¤¿' ),
+ 'Uncategorizedtemplates' => array( 'अवरà¥à¤—ीकृतफलकानि' ),
'Unusedcategories' => array( 'अपà¥à¤°à¤¯à¥‚कà¥à¤¤à¤µà¤°à¥à¤—' ),
'Unusedimages' => array( 'अपà¥à¤°à¤¯à¥‚कà¥à¤¤à¤¸à¤‚चिका' ),
- 'Wantedpages' => array( 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤²à¥‡à¤–' ),
+ 'Wantedpages' => array( 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
'Wantedcategories' => array( 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤µà¤°à¥à¤—' ),
'Wantedfiles' => array( 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤¸à¤‚चिका' ),
- 'Wantedtemplates' => array( 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤¬à¤¿à¤‚बधर' ),
- 'Mostlinked' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥ पृषà¥à¤ ' ),
- 'Mostlinkedcategories' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥ वरà¥à¤—' ),
- 'Mostlinkedtemplates' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥ बिंबधर' ),
- 'Mostimages' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥ संचिका' ),
+ 'Wantedtemplates' => array( 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤«à¤²à¤•à¤¾à¤¨à¤¿' ),
+ 'Mostlinked' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥_पृषà¥à¤Ÿà¤¾à¤¨à¤¿', 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥' ),
+ 'Mostlinkedcategories' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥_वरà¥à¤—' ),
+ 'Mostlinkedtemplates' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥_फलकानि' ),
+ 'Mostimages' => array( 'अधिकतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨à¥_संचिका' ),
'Mostcategories' => array( 'अधिकतमवरà¥à¤—' ),
- 'Mostrevisions' => array( 'अधिकतमपरिवरà¥à¤¤' ),
+ 'Mostrevisions' => array( 'अधिकतमपरिवरà¥à¤¤à¤¨' ),
'Fewestrevisions' => array( 'सà¥à¤µà¤²à¥à¤ªà¤ªà¤°à¤¿à¤µà¤°à¥à¤¤à¤¨' ),
- 'Shortpages' => array( 'लघà¥à¤ªà¥ƒà¤·à¥à¤ ' ),
- 'Longpages' => array( 'दीरà¥à¤˜à¤ªà¥ƒà¤·à¥à¤ ' ),
- 'Newpages' => array( 'नूतनपृषà¥à¤ ' ),
- 'Ancientpages' => array( 'पूरà¥à¤µà¤¤à¤¨à¤ªà¥ƒà¤·à¥à¤ ' ),
- 'Deadendpages' => array( 'निरागà¥à¤°à¤ªà¥ƒà¤·à¥à¤ ' ),
- 'Protectedpages' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤ªà¥ƒà¤·à¥à¤ ' ),
- 'Protectedtitles' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤¶à¤¿à¤°à¥à¤·à¤•' ),
- 'Allpages' => array( 'सरà¥à¤µà¤ªà¥ƒà¤·à¥à¤ ' ),
+ 'Shortpages' => array( 'लघà¥à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Longpages' => array( 'दीरà¥à¤˜à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Newpages' => array( 'नूतनपृषà¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Ancientpages' => array( 'पूरà¥à¤µà¤¤à¤¨à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Deadendpages' => array( 'निरागà¥à¤°à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Protectedpages' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Protectedtitles' => array( 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤¶à¤¿à¤°à¥à¤·à¤•à¤®à¥' ),
+ 'Allpages' => array( 'सरà¥à¤µà¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
'Prefixindex' => array( 'उपसरà¥à¤—अनà¥à¤•à¥à¤°à¤®à¤£à¥€' ),
'Ipblocklist' => array( 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¸à¥‚ची' ),
- 'Specialpages' => array( 'विशेषपृषà¥à¤ ' ),
- 'Contributions' => array( 'योगदान' ),
+ 'Specialpages' => array( 'विशेषपृषà¥à¤Ÿà¤¾à¤¨à¤¿' ),
+ 'Contributions' => array( 'योगदानमà¥' ),
'Emailuser' => array( 'विपतà¥à¤°à¤¯à¥‹à¤œà¤•' ),
'Confirmemail' => array( 'विपतà¥à¤°à¤ªà¥à¤·à¥à¤Ÿà¤¿à¤•à¥ƒà¤¤à¥‡' ),
- 'Whatlinkshere' => array( 'किमपृषà¥à¤  समà¥à¤¬à¤¦à¥à¤§à¤‚करोति' ),
- 'Recentchangeslinked' => array( 'नवीनतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨ परिवरà¥à¤¤' ),
+ 'Whatlinkshere' => array( 'किमपृषà¥à¤ _समà¥à¤¬à¤¦à¥à¤§à¤‚करोति' ),
+ 'Recentchangeslinked' => array( 'नवीनतमसमà¥à¤­à¤¨à¥à¤¦à¤¿à¤¨_परिवरà¥à¤¤' ),
'Movepage' => array( 'पृषà¥à¤ à¤¸à¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°' ),
'Blockme' => array( 'मदरà¥à¤¥à¥‡à¤ªà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§' ),
'Booksources' => array( 'पà¥à¤¸à¥à¤¤à¤•à¤¸à¥à¤°à¥‹à¤¤' ),
- 'Categories' => array( 'वरà¥à¤—' ),
+ 'Categories' => array( 'वरà¥à¤—ः' ),
'Export' => array( 'निरà¥à¤¯à¤¾à¤¤' ),
'Version' => array( 'आवृतà¥à¤¤à¥€' ),
'Allmessages' => array( 'सरà¥à¤µà¤ªà¥à¤°à¤£à¤¾à¤²à¥€-संदेश' ),
'Log' => array( 'अङà¥à¤•à¤¨' ),
'Blockip' => array( 'सदसà¥à¤¯à¤ªà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§' ),
- 'Undelete' => array( 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¦à¤¿à¤¶à¥ परितà¥à¤¯à¤¾à¤—' ),
+ 'Undelete' => array( 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¦à¤¿à¤¶à¥_परितà¥à¤¯à¤¾à¤—' ),
'Import' => array( 'आयात' ),
'Lockdb' => array( 'विदादà¥à¤µà¤¾à¤°à¤‚बनà¥à¤§à¥' ),
'Unlockdb' => array( 'विवृतविदादà¥à¤µà¤¾à¤°à¤‚तालक' ),
'Userrights' => array( 'योजकआधिकार' ),
- 'MIMEsearch' => array( 'विविधामाप (माईम) शोधसि' ),
+ 'MIMEsearch' => array( 'विविधामाप_(माईम)_शोधसि' ),
'FileDuplicateSearch' => array( 'अनà¥à¤•à¥ƒà¤¤à¤¸à¤‚चिकाशोध' ),
'Unwatchedpages' => array( 'अनिरिकà¥à¤·à¥€à¤¤à¤ªà¥ƒà¤·à¥à¤ ' ),
'Listredirects' => array( 'विचालनà¥â€Œà¤¸à¥‚ची' ),
'Revisiondelete' => array( 'आवृतà¥à¤¤à¥€à¤ªà¤°à¤¿à¤¤à¥à¤¯à¤¾à¤—' ),
'Unusedtemplates' => array( 'अपà¥à¤°à¤¯à¥‚कà¥à¤¤à¤¬à¤¿à¤‚बधर' ),
'Randomredirect' => array( 'अविशीषà¥à¤Ÿà¤µà¤¿à¤šà¤¾à¤²à¤¨à¥â€Œ' ),
- 'Mypage' => array( 'मदीयपृषà¥à¤ ' ),
- 'Mytalk' => array( 'मदीयसंवाद' ),
- 'Mycontributions' => array( 'मदीययोगदान' ),
+ 'Mypage' => array( 'मम_पृषà¥à¤Ÿà¤®à¥' ),
+ 'Mytalk' => array( 'मदीयसंवादमà¥' ),
+ 'Mycontributions' => array( 'मदीययोगदानमà¥' ),
'Listadmins' => array( 'पà¥à¤°à¤šà¤¾à¤²à¤•à¤¸à¥‚ची' ),
'Listbots' => array( 'सà¥à¤µà¤¯à¤‚अनà¥à¤•à¥ƒà¤¸à¥‚ची' ),
- 'Popularpages' => array( 'लोकपà¥à¤°à¤¿à¤¯à¤ªà¥ƒà¤·à¥à¤ ' ),
+ 'Popularpages' => array( 'लोकपà¥à¤°à¤¿à¤¯à¤ªà¥ƒà¤·à¥à¤Ÿà¤¾à¤¨à¤¿' ),
'Search' => array( 'शोध' ),
- 'Resetpass' => array( 'सङà¥à¤•à¥‡à¤¤à¤¶à¤¬à¥à¤¦à¤ªà¥à¤¨:पà¥à¤°à¤¯à¥à¥à¤•à¥à¤¤à¤¾' ),
+ 'Resetpass' => array( 'सङà¥à¤•à¥‡à¤¤à¤¶à¤¬à¥à¤¦à¤ªà¥à¤¨:पà¥à¤°à¤¯à¥à¤•à¥à¤¤à¤¾' ),
'Withoutinterwiki' => array( 'आनà¥à¤¤à¤°à¤µà¤¿à¤•à¤¿à¤¹à¥€à¤¨' ),
'MergeHistory' => array( 'इतिहाससंयोग' ),
'Filepath' => array( 'संचिकापथ' ),
@@ -267,8 +282,7 @@ $messages = array(
'tog-editsection' => '[संपादयतà¥à¤¼] इति संबंधनदà¥à¤µà¤¾à¤°à¤¾ विभाग-संपादनं समरà¥à¤¥à¤¯à¤¤à¥à¥¤',
'tog-editsectiononrightclick' => 'विभाग-शीरà¥à¤·à¤•à¤¾à¤£à¤¾à¤®à¥à¤ªà¤°à¤¿ दकà¥à¤·à¤¿à¤£à¤•à¥à¤²à¤¿à¤•à¥à¤•à¤¾à¤°à¥‡à¤£ विभागसंपादनं समरà¥à¤¥à¤¯à¤¤à¥ (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤®à¥ आवशà¥à¤¯à¤•à¤®à¥)।',
'tog-showtoc' => 'अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾à¤‚ दरà¥à¤¶à¤¯à¤¤à¥ (तà¥à¤°à¥à¤¯à¤§à¤¿à¤•à¤¶à¥€à¤°à¥à¤·à¤•à¤¯à¥à¤¤à¥‡à¤·à¥ पृषà¥à¤ à¥‡à¤·à¥)।',
-'tog-rememberpassword' => 'असà¥à¤®à¤¿à¤¨à¥ संगणके मम संपà¥à¤°à¤µà¥‡à¤¶à¤ƒ (लॉगिनॠइति) सà¥à¤®à¥ƒà¤¤à¥€à¤­à¤µà¥‡à¤¤à¥à¥¤',
-'tog-editwidth' => 'संपादन-कोषà¥à¤ à¤•à¤‚ पटलवà¥à¤¯à¤¾à¤ªà¤¿à¤°à¥‚पेण दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
+'tog-rememberpassword' => 'असà¥à¤®à¤¿à¤¨à¥ संगणके मम पà¥à¤°à¤µà¥‡à¤¶à¤¸à¤‚बंधि-सूचनाः सà¥à¤®à¤°à¤¤à¥ (अधिकतम $1 {{PLURAL:$1|दिनमà¥|दिनानि}} परà¥à¤¯à¤¨à¥à¤¤à¤®à¥)',
'tog-watchcreations' => 'मया रचितानि पृषà¥à¤ à¤¾à¤£à¤¿ मम निरीकà¥à¤·à¤¾à¤¸à¥‚चिकायां योजयतà¥à¥¤',
'tog-watchdefault' => 'मया संपादितानि पृषà¥à¤ à¤¾à¤£à¤¿ मम निरीकà¥à¤·à¤¾à¤¸à¥‚चिकायां योजयतà¥à¥¤',
'tog-watchmoves' => 'मया चालितानि पृषà¥à¤ à¤¾à¤£à¤¿ मम निरीकà¥à¤·à¤¾à¤¸à¥‚चिकायां योजयतà¥à¥¤',
@@ -276,7 +290,7 @@ $messages = array(
'tog-minordefault' => 'मम सरà¥à¤µà¤¾à¤£à¤¿ संपादनानि लघà¥à¤¤à¥à¤µà¥‡à¤¨ वरà¥à¤¤à¤¨à¥à¤¤à¥‡à¥¤',
'tog-previewontop' => 'समà¥à¤ªà¤¾à¤¦à¤¨-पिटकसà¥à¤¯à¥‹à¤ªà¤°à¤¿ पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤‚ दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
'tog-previewonfirst' => 'पà¥à¤°à¤¥à¤®-संपादन-पशà¥à¤šà¤¾à¤¤à¥ पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤‚ दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
-'tog-nocache' => 'पृषà¥à¤ à¤¾à¤£à¤¿ उपसà¥à¤®à¥ƒà¤¤à¥Œ (कैशà¥-इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥) मा धारयतà¥à¥¤',
+'tog-nocache' => 'पृषà¥à¤  धारक-बà¥à¤°à¤¾à¤‰à¤œà¤°à¤‚ निसà¥à¤•à¥à¤°à¤¿à¤¯à¤¤à¥ ।',
'tog-enotifwatchlistpages' => 'मम निरीकà¥à¤·à¤¾à¤¸à¥‚चिकायां सतां पृषà¥à¤ à¤¾à¤£à¤¾à¤‚ परिवरà¥à¤¤à¤¨à¤¸à¤®à¤¯à¥‡ मां विदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¥‡à¤£ (ईमेलॠइति) जà¥à¤žà¤¾à¤ªà¤¯à¤¤à¥à¥¤',
'tog-enotifusertalkpages' => 'मम योजकसंभाषणपृषà¥à¤ à¥‡ परिवरà¥à¤¤à¤¿à¤¤à¥‡ सति मां विदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¥‡à¤£ (ईमेलॠइति) जà¥à¤žà¤¾à¤ªà¤¯à¤¤à¥à¥¤',
'tog-enotifminoredits' => 'लघà¥à¤ªà¤°à¤¿à¤µà¤°à¥à¤¤à¤¨à¥‡à¤·à¥ सतà¥à¤¸à¥ अपि मां विदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¥‡à¤£ (ईमेलॠइति) जà¥à¤žà¤¾à¤ªà¤¯à¤¤à¥à¥¤',
@@ -284,7 +298,7 @@ $messages = array(
'tog-shownumberswatching' => 'निरीकà¥à¤·à¤®à¤¤à¤¾à¤‚ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤£à¤¾à¤‚ संखà¥à¤¯à¤¾à¤‚ दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
'tog-oldsig' => 'अधà¥à¤¨à¤¾à¤¤à¤¨à¤¾à¤¨à¤¾à¤‚ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤¾à¤£à¤¾à¤‚ पà¥à¤°à¤¾à¤°à¥‚पमà¥à¥¤',
'tog-fancysig' => 'हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤¾à¤£à¤¿ विकिपाठवतॠसनà¥à¤¤à¥ (सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤-संबंधनेभà¥à¤¯à¤ƒ रहितानि)।',
-'tog-externaleditor' => 'अकथिते (बाइ डिफालà¥à¤Ÿà¥ इति), बाहà¥à¤¯ संपादकं पà¥à¤°à¤¯à¥‹à¤œà¤¯à¤¤à¥ (केवलेभà¥à¤¯à¤ƒ निपà¥à¤£à¥‡à¤­à¥à¤¯à¤ƒ, भवतः संगणके विशेषाः नà¥à¤¯à¤¾à¤¸à¤¾à¤ƒ (सेटिंगà¥à¤¸à¥ इति) आवशà¥à¤¯à¤•à¤¾à¤ƒ)।',
+'tog-externaleditor' => 'Use external editor by default (for experts only, needs special settings on your computer. [http://www.mediawiki.org/wiki/Manual:External_editors More information.])',
'tog-externaldiff' => 'अकथिते (बाइ डिफालà¥à¤Ÿà¥ इति), बाहà¥à¤¯ अंतरकà¥à¤°à¤®à¤¾à¤¦à¥‡à¤¶à¤‚ पà¥à¤°à¤¯à¥‹à¤œà¤¯à¤¤à¥ (केवलेभà¥à¤¯à¤ƒ निपà¥à¤£à¥‡à¤­à¥à¤¯à¤ƒ, भवतः संगणके विशेषाः नà¥à¤¯à¤¾à¤¸à¤¾à¤ƒ आवशà¥à¤¯à¤•à¤¾à¤ƒ)।',
'tog-showjumplinks' => '"इतà¥à¤¯à¥‡à¤¤à¤¤à¥ पà¥à¤°à¤¤à¤¿ कूरà¥à¤¦à¤¯à¤¤à¥" इति संबंधनानि समरà¥à¤¥à¤¯à¤¤à¥à¥¤',
'tog-uselivepreview' => 'संपादनेन सहैव पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤‚ दरà¥à¤¶à¤¯à¤¤à¥ (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤®à¥ आवशà¥à¤¯à¤•à¤®à¥) (पà¥à¤°à¤¯à¥‹à¤—ातà¥à¤®à¤•à¤®à¥)।',
@@ -407,31 +421,21 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'faqpage' => 'Project:बहà¥à¤§à¤¾ पृषà¥à¤Ÿà¤µà¥à¤¯à¤¾à¤ƒ पà¥à¤°à¤¶à¥à¤¨à¤¾à¤ƒ',
# Vector skin
-'vector-action-addsection' => 'विषयं योजयतà¥',
-'vector-action-delete' => 'अपाकरोतà¥',
-'vector-action-move' => 'चालयतà¥',
-'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤‚ करोतà¥',
-'vector-action-undelete' => 'अपाकरणसà¥à¤¯ निरसनमà¥',
-'vector-action-unprotect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¥€à¤•à¤°à¤£à¤¸à¥à¤¯ निरसनमà¥',
-'vector-namespace-category' => 'शà¥à¤°à¥‡à¤£à¥€',
-'vector-namespace-help' => 'सहायकपृषà¥à¤ à¤®à¥',
-'vector-namespace-image' => 'सञà¥à¤šà¤¿à¤•à¤¾',
-'vector-namespace-main' => 'पृषà¥à¤ à¤®à¥',
-'vector-namespace-media' => 'माधà¥à¤¯à¤®-पृषà¥à¤ à¤®à¥',
-'vector-namespace-mediawiki' => 'संदेशः',
-'vector-namespace-project' => 'पà¥à¤°à¤•à¤²à¥à¤ªà¤ªà¥ƒà¤·à¥à¤ à¤®à¥',
-'vector-namespace-special' => 'विशिषà¥à¤Ÿà¤ªà¥ƒà¤·à¥à¤ à¤®à¥',
-'vector-namespace-talk' => 'चरà¥à¤šà¤¾',
-'vector-namespace-template' => 'संफलकमà¥',
-'vector-namespace-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-पृषà¥à¤ à¤®à¥',
-'vector-view-create' => 'सृजतà¥',
-'vector-view-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¯à¤¤à¥',
-'vector-view-history' => 'इतिहासं दरà¥à¤¶à¤¯à¤¤à¥',
-'vector-view-view' => 'पठतà¥',
-'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤à¤¸à¤‚ दरà¥à¤¶à¤¯à¤¤à¥',
-'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾à¤ƒ',
-'namespaces' => 'नामाकाशानि',
-'variants' => 'पà¥à¤°à¤•à¥€à¤°à¥à¤£à¤¤à¥à¤µà¥‡à¤¨',
+'vector-action-addsection' => 'विषयं योजयतà¥',
+'vector-action-delete' => 'अपाकरोतà¥',
+'vector-action-move' => 'चालयतà¥',
+'vector-action-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤‚ करोतà¥',
+'vector-action-undelete' => 'अपाकरणसà¥à¤¯ निरसनमà¥',
+'vector-action-unprotect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¥€à¤•à¤°à¤£à¤¸à¥à¤¯ निरसनमà¥',
+'vector-simplesearch-preference' => 'संवरà¥à¤§à¤¿à¤¤à¤¾à¤ƒ अनà¥à¤µà¥‡à¤·à¤£à¥‹à¤ªà¤•à¥à¤·à¥‡à¤ªà¤¾à¤ƒ समरà¥à¤¥à¥€à¤•à¤°à¥‹à¤¤à¥à¥¤ (केवलं वैकà¥à¤Ÿà¤°-सà¥à¤•à¤¿à¤¨à¥ इतà¥à¤¯à¤¸à¥à¤¯à¤¾à¤°à¥à¤¥à¥‡)',
+'vector-view-create' => 'सृजतà¥',
+'vector-view-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¯à¤¤à¥',
+'vector-view-history' => 'इतिहासं दरà¥à¤¶à¤¯à¤¤à¥',
+'vector-view-view' => 'पठतà¥',
+'vector-view-viewsource' => 'सà¥à¤°à¥‹à¤¤à¤¸à¤‚ दरà¥à¤¶à¤¯à¤¤à¥',
+'actions' => 'कà¥à¤°à¤¿à¤¯à¤¾à¤ƒ',
+'namespaces' => 'नामाकाशानि',
+'variants' => 'पà¥à¤°à¤•à¥€à¤°à¥à¤£à¤¤à¥à¤µà¥‡à¤¨',
'errorpagetitle' => 'विभà¥à¤°à¤®à¤ƒ',
'returnto' => '$1 इतà¥à¤¯à¥‡à¤¤à¤¦à¥ पà¥à¤°à¤¤à¤¿ निवरà¥à¤¤à¤¤à¤¾à¤®à¥à¥¤',
@@ -487,6 +491,13 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'jumpto' => 'कूरà¥à¤¦à¤¯à¤¤à¥ अतà¥à¤° :',
'jumptonavigation' => 'सà¥à¤šà¤²à¤¨à¤®à¥',
'jumptosearch' => 'अनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
+'view-pool-error' => 'कà¥à¤·à¤®à¥à¤¯à¤¤à¤¾à¤®à¥, परिवेषणयनà¥à¤¤à¥à¤°à¤¾à¤£à¤¿ अतिभारितानि असà¥à¤®à¤¿à¤¨à¥ समये।
+बहवः पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤°à¤ƒ à¤à¤¤à¤¤à¥ पृषà¥à¤ à¤‚ दà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ पà¥à¤°à¤¯à¤¤à¤®à¤¾à¤¨à¤¾à¤ƒ सनà¥à¤¤à¤¿à¥¤
+कृपया किंचितà¥à¤•à¤¾à¤²à¤‚ पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¤à¤¾à¤®à¥ भवानà¥, तदा कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥ पà¥à¤°à¤¯à¤¾à¤¸à¤ƒà¥¤
+$1',
+'pool-timeout' => 'कालावधिः समापà¥à¤¤à¤¾, यनà¥à¤¤à¥à¤°à¤£à¤¸à¥à¤¯à¤¾à¤°à¥à¤¥à¥‡ पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¤à¥‡',
+'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}} इतà¥à¤¯à¤¸à¥à¤¯ विषये',
@@ -508,7 +519,12 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'privacy' => 'नैजता-नीतिः',
'privacypage' => 'Project:नैजता-नीतिः',
-'badaccess' => 'अनà¥à¤œà¥à¤žà¤¾-विभà¥à¤°à¤®à¤ƒ',
+'badaccess' => 'अनà¥à¤œà¥à¤žà¤¾-विभà¥à¤°à¤®à¤ƒ',
+'badaccess-group0' => 'भवदरà¥à¤¥à¤®à¥, अतà¥à¤° पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤¾ कà¥à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¤µà¤°à¥à¤¤à¤¿à¤¤à¥à¤‚ न अनà¥à¤®à¤¤à¤®à¥à¥¤',
+'badaccess-groups' => 'भवता पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤¾ कà¥à¤°à¤¿à¤¯à¤¾ केवले {{PLURAL:$2|असà¥à¤®à¤¿à¤¨à¥ समूहे|à¤à¤¤à¥‡à¤·à¥ समूहेषà¥}} अनà¥à¤®à¤¤à¤¾ असà¥à¤¤à¤¿: $1।',
+
+'versionrequired' => 'मीडीयाविके: $1 संसà¥à¤•à¤°à¤£ आवशà¥à¤¯à¤•à¤ƒ ।',
+'versionrequiredtext' => 'à¤à¤¤à¤¤à¥à¤ªà¥ƒà¤·à¥à¤ à¤‚ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥à¤‚ मीडियाविकि इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ $1तमा आवृतà¥à¤¤à¤¿à¤ƒ आवशà¥à¤¯à¤•à¥€à¥¤ पशà¥à¤¯à¤¤à¥ [[Special:Version|आवृतà¥à¤¤à¤¿-सूचिका]]',
'ok' => 'आमà¥',
'pagetitle' => '',
@@ -526,6 +542,7 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'toc' => 'अनà¥à¤¤à¤°à¥à¤µà¤¿à¤·à¤¯à¤¾à¤ƒ',
'showtoc' => 'दरà¥à¤¶à¤¯à¤¤à¥',
'hidetoc' => 'गोपयतà¥',
+'thisisdeleted' => '$1 दरà¥à¤¶à¤¯à¥‡à¤¤à¥ वा पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¨à¤¯à¥‡à¤¤à¥ वा?',
'viewdeleted' => '$1 पशà¥à¤¯à¤¤à¥?',
'feedlinks' => 'अनà¥à¤¬à¤¨à¥à¤§:',
'site-rss-feed' => '$1 आरà¤à¤¸à¤à¤¸ पूरणमà¥',
@@ -551,22 +568,30 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'nosuchspecialpage' => 'à¤à¤¤à¤¾à¤¦à¥ƒà¤¶ विशेष पृषà¥à¤Ÿà¤®à¥ नासà¥à¤¤à¤¿',
# General errors
-'error' => 'विभà¥à¤°à¤®',
-'databaseerror' => 'दतà¥à¤¤à¤¾à¤§à¤¾à¤°-विभà¥à¤°à¤®à¤ƒ',
-'readonly' => 'डाटाबेस बनà¥à¤§à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿',
-'missing-article' => 'दतà¥à¤¤à¤¾à¤§à¤¾à¤°à¥‡à¤£(डाटाबेसॠइतà¥à¤¯à¤¨à¥‡à¤¨) "$1" $2 इतिनामकं पृषà¥à¤ à¤‚ नैव पà¥à¤°à¤¾à¤ªà¥à¤¤à¤®à¥, यतà¥à¤¤à¥ पà¥à¤°à¤¾à¤ªà¥à¤¤à¥€à¤­à¤µà¤¿à¤¤à¤µà¥à¤¯à¤®à¤¾à¤¸à¥€à¤¤à¥à¥¤
+'error' => 'विभà¥à¤°à¤®',
+'databaseerror' => 'दतà¥à¤¤à¤¾à¤§à¤¾à¤°-विभà¥à¤°à¤®à¤ƒ',
+'readonly' => 'डाटाबेस बनà¥à¤§à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿',
+'missing-article' => 'दतà¥à¤¤à¤¾à¤§à¤¾à¤°à¥‡à¤£(डाटाबेसॠइतà¥à¤¯à¤¨à¥‡à¤¨) "$1" $2 इतिनामकं पृषà¥à¤ à¤‚ नैव पà¥à¤°à¤¾à¤ªà¥à¤¤à¤®à¥, यतà¥à¤¤à¥ पà¥à¤°à¤¾à¤ªà¥à¤¤à¥€à¤­à¤µà¤¿à¤¤à¤µà¥à¤¯à¤®à¤¾à¤¸à¥€à¤¤à¥à¥¤
कदाचितॠà¤à¤µà¤‚ तॠअवसिते सति अंतरे अथवा अपाकृतसà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ इतिहास-संबंधनातॠभवति।
यदि न à¤à¤µà¤‚ विदà¥à¤¯à¤¤à¥‡, तदा भवता कà¥à¤°à¤®à¤¾à¤¦à¥‡à¤¶-कीटकं अनà¥à¤µà¤¿à¤·à¥à¤Ÿà¤®à¥à¥¤
कृपया केनचितॠ[[Special:ListUsers/sysop|पà¥à¤°à¤šà¤¾à¤²à¤•à¥‡à¤¨]] सह असà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ URL इतà¥à¤¯à¥‡à¤¤à¤¦à¥- जà¥à¤žà¤¾à¤ªà¤¨à¤ªà¥‚रà¥à¤µà¤•à¤‚ संभाषतामà¥à¥¤',
-'missingarticle-rev' => '(आवृतà¥à¤¤à¤¿à¤ƒ# :$1)',
-'missingarticle-diff' => '(वà¥à¤¯à¤¤à¤¿à¤°à¥‡à¤•: $1, $2)',
-'unexpected' => 'अपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¿à¤¤à¤®à¥‚लà¥à¤¯à¤®à¥ : "$1"="$2"।',
-'badtitletext' => 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤‚ पृषà¥à¤ -शीरà¥à¤·à¤•à¤‚ अमानà¥à¤¯à¤‚ वा, रिकà¥à¤¤à¤‚ वा, अथवा अशà¥à¤¦à¥à¤§à¤¤à¤¯à¤¾ संबंदà¥à¤§à¤‚ आंतरà¥à¤­à¤¾à¤·à¤¿à¤•à¤‚, आंतरà¥à¤µà¤¿à¤•à¥€à¤¯à¤‚ वा शीरà¥à¤·à¤•à¤®à¤¸à¥à¤¤à¤¿à¥¤ असà¥à¤®à¤¿à¤¨à¥ à¤à¤•à¤‚ à¤à¤•à¤¾à¤§à¤¿à¤•à¤¾à¤¨à¤¿ वा à¤à¤¤à¤¾à¤¦à¥ƒà¤¶à¤¾à¤£à¤¿ अकà¥à¤·à¤°à¤¾à¤£à¤¿ विदà¥à¤¯à¤¨à¥à¤¤à¥‡ येषां पà¥à¤°à¤¯à¥‹à¤—ं शीरà¥à¤·à¤•à¥‡à¤·à¥ अशकà¥à¤¯à¤®à¥à¥¤',
-'viewsource' => 'सà¥à¤°à¥‹à¤¤à¤ƒ दरà¥à¤¶à¤¯à¤¤à¥',
-'viewsourcefor' => '$1 कृते',
+'missingarticle-rev' => '(आवृतà¥à¤¤à¤¿à¤ƒ# :$1)',
+'missingarticle-diff' => '(वà¥à¤¯à¤¤à¤¿à¤°à¥‡à¤•: $1, $2)',
+'internalerror' => 'आनà¥à¤¤à¤°à¤¿à¤•à¤¾ तà¥à¤°à¥à¤Ÿà¤¿à¤ƒ',
+'internalerror_info' => 'आनà¥à¤¤à¤°à¤¿à¤•à¤¾ तà¥à¤°à¥à¤Ÿà¤¿à¤ƒ: $1',
+'directorycreateerror' => '$1 इति निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾à¤‚ सà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ न अपारयतà¥',
+'unexpected' => 'अपà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¿à¤¤à¤®à¥‚लà¥à¤¯à¤®à¥ : "$1"="$2"।',
+'formerror' => 'तà¥à¤°à¥à¤Ÿà¤¿à¤ƒ : पà¥à¤°à¤¾à¤°à¥‚पं समरà¥à¤ªà¤¯à¤¿à¤¤à¥à¤‚ न अपारयतà¥',
+'badarticleerror' => 'असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ à¤à¤·à¤¾ कà¥à¤°à¤¿à¤¯à¤¾ करà¥à¤¤à¥à¤‚ न शकà¥à¤¯à¤¾à¥¤',
+'badtitletext' => 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤‚ पृषà¥à¤ -शीरà¥à¤·à¤•à¤‚ अमानà¥à¤¯à¤‚ वा, रिकà¥à¤¤à¤‚ वा, अथवा अशà¥à¤¦à¥à¤§à¤¤à¤¯à¤¾ संबंदà¥à¤§à¤‚ आंतरà¥à¤­à¤¾à¤·à¤¿à¤•à¤‚, आंतरà¥à¤µà¤¿à¤•à¥€à¤¯à¤‚ वा शीरà¥à¤·à¤•à¤®à¤¸à¥à¤¤à¤¿à¥¤ असà¥à¤®à¤¿à¤¨à¥ à¤à¤•à¤‚ à¤à¤•à¤¾à¤§à¤¿à¤•à¤¾à¤¨à¤¿ वा à¤à¤¤à¤¾à¤¦à¥ƒà¤¶à¤¾à¤£à¤¿ अकà¥à¤·à¤°à¤¾à¤£à¤¿ विदà¥à¤¯à¤¨à¥à¤¤à¥‡ येषां पà¥à¤°à¤¯à¥‹à¤—ं शीरà¥à¤·à¤•à¥‡à¤·à¥ अशकà¥à¤¯à¤®à¥à¥¤',
+'viewsource' => 'सà¥à¤°à¥‹à¤¤à¤ƒ दरà¥à¤¶à¤¯à¤¤à¥',
+'viewsourcefor' => '$1 कृते',
+
+# Virus scanner
+'virus-unknownscanner' => 'अजà¥à¤žà¤¾à¤¤à¤‚ विषाणà¥à¤ªà¥à¤°à¤¤à¤¿à¤•à¤¾à¤°à¤•à¤®à¥:',
# Login and logout pages
'welcomecreation' => '==सà¥à¤µà¤¾à¤—तमà¥â€Œ, $1!==
@@ -575,7 +600,7 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'yourname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-नाम :',
'yourpassword' => 'रहसà¥à¤¯à¤µà¤¾à¤•à¥ :',
'yourpasswordagain' => 'रहसà¥à¤¯à¤µà¤¾à¤•à¥ पà¥à¤¨à¤ƒ लिखतà¥à¥¤',
-'remembermypassword' => 'असà¥à¤®à¤¿à¤¨à¥ संगणके मम पà¥à¤°à¤µà¥‡à¤¶à¤¸à¤‚बंधि-सूचनाः सà¥à¤®à¤°à¤¤à¥',
+'remembermypassword' => 'असà¥à¤®à¤¿à¤¨à¥ संगणके मम पà¥à¤°à¤µà¥‡à¤¶à¤¸à¤‚बंधि-सूचनाः सà¥à¤®à¤°à¤¤à¥ (अधिकतमॠ$1 {{PLURAL:$1|दिनà¥|दिनà¥}})',
'login' => 'पà¥à¤°à¤µà¤¿à¤¶à¤¤à¥',
'nav-login-createaccount' => 'पà¥à¤°à¤µà¤¿à¤¶à¤¤à¥ / लेखां सृजतà¥',
'userlogin' => 'पà¥à¤°à¤µà¤¿à¤¶à¤¤à¥ / लेखां सृजतà¥',
@@ -586,8 +611,11 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'nologinlink' => 'लेखां रचयतà¥',
'createaccount' => 'लेखां रचयतà¥',
'gotaccountlink' => 'पà¥à¤°à¤µà¤¿à¤¶à¤¤à¥',
+'createaccountreason' => 'कारणमà¥',
+'createaccounterror' => '$1 इति लेखां सà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ न अपारयतà¥',
'loginsuccesstitle' => 'सà¥à¤¸à¥à¤µà¤¾à¤—तमà¥â€Œà¥¤ पà¥à¤°à¤µà¥‡à¤¶à¤ƒ सिदà¥à¤§à¤ƒà¥¤',
'mailmypassword' => 'नूतनं रहसà¥à¤¯à¤µà¤¾à¤•à¥ विदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¥‡à¤£ पà¥à¤°à¥‡à¤·à¤¯à¤¤à¥',
+'accountcreated' => 'खाता निरà¥à¤®à¤¿à¤¤',
'loginlanguagelabel' => 'भाषा : $1',
# Password reset dialog
@@ -692,6 +720,8 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'revdelete-radio-set' => 'हाà¤',
'revdelete-log' => 'कारणमॠ:',
'revdel-restore' => 'दृशà¥à¤¯à¤¤à¤¾à¤‚ परिवरà¥à¤¤à¤¯à¤¤à¥',
+'revdel-restore-deleted' => 'विलोपितानि संशोधनानि',
+'revdel-restore-visible' => 'दृषà¥à¤Ÿà¤¿à¤—ोचर संशोधनानि',
'pagehist' => 'पà¥à¤Ÿà¤¸à¥à¤¯ चरितà¥à¤°à¤®à¥',
'revdelete-uname' => 'उपयोकà¥à¤¤à¥ƒ-नाम',
'revdelete-otherreason' => 'अनà¥à¤¯/अधिक कारणमॠ:',
@@ -711,42 +741,96 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'editundo' => 'अकरोतà¥',
# Search results
-'searchresults' => 'अनà¥à¤µà¥‡à¤·à¤£ फलानि',
-'searchresults-title' => '"$1" इतà¥à¤¯à¤¸à¥à¤¯ कृते अनà¥à¤µà¥‡à¤·à¤£-फलानि',
-'searchresulttext' => '{{SITENAME}} इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥ अनà¥à¤µà¥‡à¤·à¤£à¥‡ सहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤®à¥ [[{{MediaWiki:Helppage}}|{{int:help}}]] इतà¥à¤¯à¥‡à¤¤à¤¤à¥ पशà¥à¤¯à¤¤à¥ ।',
-'searchsubtitle' => 'भवानॠ\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|सरà¥à¤µà¤¾à¤£à¤¿ "$1" इतà¥à¤¯à¤¸à¥à¤®à¤¾à¤¦à¥ आरभमनà¥à¤¤à¤ƒ पृषà¥à¤ à¤¾à¤£à¤¿]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|सरà¥à¤µà¤¾à¤£à¤¿ "$1" इतà¥à¤¯à¥‡à¤¤à¤¤à¥à¤ªà¥à¤°à¤¤à¤¿ संबदà¥à¤§à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤£à¤¿]]) इतà¥à¤¯à¤¸à¥à¤¯ कृते अनà¥à¤µà¤¿à¤·à¥à¤Ÿà¤µà¤¾à¤¨à¥à¥¤',
-'searchsubtitleinvalid' => "भवता '''$1''' इतà¥à¤¯à¤¸à¥à¤¯ कृते अनà¥à¤µà¥‡à¤·à¤£à¤‚ कृतमà¥",
-'notitlematches' => 'न कसà¥à¤¯à¤¾à¤ªà¤¿ पृषà¥à¤ à¤¸à¥à¤¯ शीरà¥à¤·à¤•à¤®à¥ असà¥à¤¯ सममà¥à¥¤',
-'notextmatches' => 'न कसà¥à¤¯à¤¾à¤ªà¤¿ पृषà¥à¤ à¤¸à¥à¤¯ पाठः असà¥à¤¯ सममसà¥à¤¤à¤¿',
-'prevn' => 'पूरà¥à¤µà¤¤à¤¨à¤¾à¤¨à¤¿ {{PLURAL:$1|$1}}',
-'nextn' => 'आगामि{{PLURAL:$1|$1}}',
-'viewprevnext' => 'दरà¥à¤¶à¤¯à¤¤à¥ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchprofile-everything' => 'सरà¥à¤µà¤®à¥',
-'search-result-size' => '$1 ({{PLURAL:$2|1 शबà¥à¤¦à¤®à¥|$2 शबà¥à¤¦à¥‡}})',
-'search-redirect' => '($1 इतीदं अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¤®à¥)',
-'search-section' => '(विभागः $1)',
-'search-suggest' => 'किं भवतः आशयः à¤à¤µà¤®à¤¸à¥à¤¤à¤¿ : $1',
-'search-interwiki-caption' => 'बनà¥à¤§à¥-पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤ƒ',
-'search-interwiki-default' => '$1 परिणामाः :',
-'search-interwiki-more' => '(अधिकानि)',
-'search-mwsuggest-enabled' => 'उपकà¥à¤·à¥‡à¤ªà¥‡à¤­à¥à¤¯à¤ƒ सह',
-'search-mwsuggest-disabled' => 'नातà¥à¤° उपकà¥à¤·à¥‡à¤ªà¤¾à¤ƒ',
-'searchall' => 'सरà¥à¤µà¤¾à¤£à¤¿',
-'nonefound' => "'''सूचना''': सà¥à¤µà¤¤à¤ƒ अतà¥à¤° केषà¥à¤šà¤¿à¤¦à¥‡à¤µ नामाकाशेषॠअनà¥à¤µà¥‡à¤·à¤£à¤‚ कà¥à¤°à¤¿à¤¯à¤¤à¥‡à¥¤
+'searchresults' => 'अनà¥à¤µà¥‡à¤·à¤£ फलानि',
+'searchresults-title' => '"$1" इतà¥à¤¯à¤¸à¥à¤¯ कृते अनà¥à¤µà¥‡à¤·à¤£-फलानि',
+'searchresulttext' => '{{SITENAME}} इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥ अनà¥à¤µà¥‡à¤·à¤£à¥‡ सहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤®à¥ [[{{MediaWiki:Helppage}}|{{int:help}}]] इतà¥à¤¯à¥‡à¤¤à¤¤à¥ पशà¥à¤¯à¤¤à¥ ।',
+'searchsubtitle' => 'भवानॠ\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|सरà¥à¤µà¤¾à¤£à¤¿ "$1" इतà¥à¤¯à¤¸à¥à¤®à¤¾à¤¦à¥ आरभमनà¥à¤¤à¤ƒ पृषà¥à¤ à¤¾à¤£à¤¿]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|सरà¥à¤µà¤¾à¤£à¤¿ "$1" इतà¥à¤¯à¥‡à¤¤à¤¤à¥à¤ªà¥à¤°à¤¤à¤¿ संबदà¥à¤§à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤£à¤¿]]) इतà¥à¤¯à¤¸à¥à¤¯ कृते अनà¥à¤µà¤¿à¤·à¥à¤Ÿà¤µà¤¾à¤¨à¥à¥¤',
+'searchsubtitleinvalid' => "भवता '''$1''' इतà¥à¤¯à¤¸à¥à¤¯ कृते अनà¥à¤µà¥‡à¤·à¤£à¤‚ कृतमà¥",
+'notitlematches' => 'न कसà¥à¤¯à¤¾à¤ªà¤¿ पृषà¥à¤ à¤¸à¥à¤¯ शीरà¥à¤·à¤•à¤®à¥ असà¥à¤¯ सममà¥à¥¤',
+'notextmatches' => 'न कसà¥à¤¯à¤¾à¤ªà¤¿ पृषà¥à¤ à¤¸à¥à¤¯ पाठः असà¥à¤¯ सममसà¥à¤¤à¤¿',
+'prevn' => 'पूरà¥à¤µà¤¤à¤¨à¤¾à¤¨à¤¿ {{PLURAL:$1|$1}}',
+'nextn' => 'आगामि{{PLURAL:$1|$1}}',
+'prevn-title' => 'विगत {{PLURAL:$1|परिणाम| परिणामानि}}',
+'nextn-title' => 'अवर {{PLURAL:$1| १ परिणाम| $1 परिणामानि}}',
+'shown-title' => 'पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• पृषà¥à¤ à¥‡ $1 {{PLURAL:$1|परिणामं|परिणामानà¥}}पà¥à¤°à¤¦à¤°à¥à¤¶à¤¯à¤¤à¥',
+'viewprevnext' => 'दरà¥à¤¶à¤¯à¤¤à¥ ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-new' => "'''अशà¥à¤®à¤¿à¤¨à¥ विकिते \"[[:\$1]]\" पृषà¥à¤ à¤‚ सृजतà¥!'''",
+'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 ({{PLURAL:$2|1 शबà¥à¤¦à¤®à¥|$2 शबà¥à¤¦à¥‡}})',
+'search-redirect' => '($1 इतीदं अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¤®à¥)',
+'search-section' => '(विभागः $1)',
+'search-suggest' => 'किं भवतः आशयः à¤à¤µà¤®à¤¸à¥à¤¤à¤¿ : $1',
+'search-interwiki-caption' => 'बनà¥à¤§à¥-पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤ƒ',
+'search-interwiki-default' => '$1 परिणामाः :',
+'search-interwiki-more' => '(अधिकानि)',
+'search-mwsuggest-enabled' => 'उपकà¥à¤·à¥‡à¤ªà¥‡à¤­à¥à¤¯à¤ƒ सह',
+'search-mwsuggest-disabled' => 'नातà¥à¤° उपकà¥à¤·à¥‡à¤ªà¤¾à¤ƒ',
+'searchall' => 'सरà¥à¤µà¤¾à¤£à¤¿',
+'showingresultsheader' => "'''$4''' निमितà¥à¤¤à¤¯à¥‡ {{PLURAL:$5|'''$3'''सà¥à¤¯ '''$1''' परिणाम|'''$3'''सà¥à¤¯ '''$1 - $2''' परिणामानि}}",
+'nonefound' => "'''सूचना''': सà¥à¤µà¤¤à¤ƒ अतà¥à¤° केषà¥à¤šà¤¿à¤¦à¥‡à¤µ नामाकाशेषॠअनà¥à¤µà¥‡à¤·à¤£à¤‚ कà¥à¤°à¤¿à¤¯à¤¤à¥‡à¥¤
सकले घटके अनà¥à¤µà¥‡à¤·à¤£à¤‚ करà¥à¤¤à¥à¤‚ सà¥à¤µ अनà¥à¤µà¥‡à¤·à¤£à¤ªà¤¦à¥‡à¤­à¥à¤¯à¤ƒ पूरà¥à¤µà¤‚ ''all:'' इति योजयतà¥, अथवा इषà¥à¤Ÿà¤‚ नामाकाशं पूरà¥à¤µà¤²à¤—à¥à¤¨à¤°à¥‚पेण योजयतà¥à¥¤",
-'powersearch' => 'पà¥à¤°à¤—तमॠअनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
-'powersearch-legend' => 'पà¥à¤°à¤—तमॠअनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
-'powersearch-ns' => 'नामाकाशेषॠअनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¥ :',
-'powersearch-redir' => 'अनà¥à¤ªà¥à¤°à¥‡à¤·à¤£à¤¾à¤¨à¤¾à¤‚ सूचिकां दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
-'powersearch-field' => 'इतà¥à¤¯à¤¸à¥à¤®à¥ˆ अनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¥',
-'powersearch-toggleall' => 'सरà¥à¤µà¤®à¥',
+'powersearch' => 'पà¥à¤°à¤—तमॠअनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
+'powersearch-legend' => 'पà¥à¤°à¤—तमॠअनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
+'powersearch-ns' => 'नामाकाशेषॠअनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¥ :',
+'powersearch-redir' => 'अनà¥à¤ªà¥à¤°à¥‡à¤·à¤£à¤¾à¤¨à¤¾à¤‚ सूचिकां दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
+'powersearch-field' => 'इतà¥à¤¯à¤¸à¥à¤®à¥ˆ अनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¥',
+'powersearch-toggleall' => 'सरà¥à¤µà¤®à¥',
+'powersearch-togglenone' => 'नासà¥à¤¤à¤¿',
+'search-external' => 'वाहà¥à¤¯ अनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
+'searchdisabled' => '{{SITENAME}} अनà¥à¤µà¥‡à¤·à¤£à¤‚ निषà¥à¤•à¥à¤°à¤¿à¤¯à¤®à¥
+अशà¥à¤®à¤¿à¤¨à¥ समये भवानॠगूगल माधà¥à¤¯à¤®à¥‡à¤¨ अनà¥à¤µà¥‡à¤·à¤£à¤‚ करà¥à¤¤à¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿
+सà¥à¤®à¤°à¤¯à¤¤à¥ यतॠ{{SITENAME}} इति सà¥à¤¥à¤²à¤¸à¥à¤¯ कà¥à¤°à¤®à¤¾à¤™à¥à¤•à¤¾ नैव अदà¥à¤¯à¤¾à¤¤à¤¨à¤¾ इति सोचà¥à¤¯à¤¤à¥‡à¥¤',
+
+# Quickbar
+'qbsettings' => 'शीघà¥à¤°à¤ªà¤Ÿ',
+'qbsettings-none' => 'नासà¥à¤¤à¤¿',
+'qbsettings-fixedleft' => 'बामे सà¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤ƒ',
+'qbsettings-fixedright' => 'दकà¥à¤·à¤¿à¤£à¥‡ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤ƒ',
# Preferences page
-'preferences' => 'इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿',
-'mypreferences' => 'मम वरीयांसि',
-'yourlanguage' => 'भाषा:',
-'email' => 'विदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¤µà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾',
+'preferences' => 'इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿',
+'mypreferences' => 'मम वरीयांसि',
+'prefs-edits' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¾à¤‚ सखà¥à¤¯à¤¾à¤ƒ',
+'prefsnologin' => 'नैव पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ',
+'changepassword' => 'पà¥à¤°à¤µà¥‡à¤¶ शवà¥à¤¦à¤‚ परिवरà¥à¤¤à¤¯à¤¤à¥',
+'prefs-skin' => 'तà¥à¤µà¤šà¤¾',
+'skin-preview' => 'पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤®à¥',
+'datedefault' => 'वरीयांसि नासà¥à¤¤à¤¿',
+'prefs-datetime' => 'दिनांक तथा समय',
+'prefs-personal' => 'योजकः वà¥à¤¯à¤•à¥à¤¤à¤¿à¤°à¥‡à¤–ा',
+'prefs-rc' => 'नवतमानि परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿',
+'prefs-watchlist' => 'दृषà¥à¤Ÿà¤¿ सूची',
+'prefs-watchlist-days' => 'दृषà¥à¤Ÿà¤¿ सूची दरà¥à¤¶à¤¨à¤¾à¤°à¥à¤¥à¥‡ दिवसानि',
+'prefs-watchlist-days-max' => 'अधिकतम ७ दिवसानि',
+'prefs-watchlist-edits-max' => 'अधिकतम संखà¥à¤¯à¤¾: १०००',
+'prefs-misc' => 'विविधः',
+'prefs-resetpass' => 'पà¥à¤°à¤µà¥‡à¤¶ शवà¥à¤¦à¤‚ परिवरà¥à¤¤à¤¯à¤¤à¥',
+'prefs-email' => 'इमेल वैकलà¥à¤ªà¤¿à¤•à¤¾à¤ƒ',
+'prefs-rendering' => 'सà¥à¤µà¤°à¥à¤ªà¤ƒ',
+'saveprefs' => 'संरकà¥à¤·à¤¤à¥',
+'resetprefs' => 'असंरकà¥à¤·à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ विलोपयतà¥',
+'restoreprefs' => 'समगà¥à¤°à¤¾à¤ƒ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¦à¤¯ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¨à¥à¤¸à¤¾à¤°à¥‡ पà¥à¤¨à¤ƒ संरकà¥à¤·à¤¤à¥',
+'prefs-editing' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¶à¥€à¤²:',
+'rows' => 'पंकà¥à¤¤à¤¿',
+'columns' => 'अध: पंकà¥à¤¤à¥à¤¯à¤¾à¤ƒ',
+'searchresultshead' => 'अनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
+'resultsperpage' => 'पà¥à¤°à¤¤à¤¿ पृषà¥à¤Ÿ हिटà¥à¤¸:',
+'stub-threshold-disabled' => 'निषà¥à¤•à¥à¤°à¤¿à¤¯à¤ƒ',
+'recentchangesdays' => 'दिवसानि परà¥à¤¯à¤¨à¥à¤¤à¥‹ सदà¥à¤¯à¤¾à¤µà¤§à¤¿-परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ दृशà¥à¤¯à¤¤à¥:',
+'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}',
+'recentchangescount' => 'समà¥à¤ªà¤¾à¤¦à¤¨ संखà¥à¤¯à¤•à¤¾à¤¨à¤¿ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¨à¥à¤¸à¤¾à¤°à¥‡à¤£ दृशà¥à¤¯à¤¤à¥:',
+'yourlanguage' => 'भाषा:',
+'email' => 'विदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¤µà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾',
# Groups
'group-sysop' => 'पà¥à¤°à¤¬à¤‚धकाः',
@@ -798,6 +882,7 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'upload' => 'संचिकामॠउदà¥à¤­à¤¾à¤°à¤¯à¤¤à¥',
'uploadbtn' => 'संचिकामॠउदà¥à¤­à¤¾à¤°à¤¯à¤¤à¥',
'uploadlogpage' => 'उदà¥à¤­à¤¾à¤°à¤£-सूचिका',
+'filedesc' => 'सांकà¥à¤·à¥‡à¤ªà¤¿à¤•',
'uploadedimage' => '"[[$1]]" इतà¥à¤¯à¥‡à¤¤à¤¦à¥ उदà¥à¤­à¤¾à¤°à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿',
# Special:ListFiles
@@ -824,7 +909,10 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'randompage' => 'अविशिषà¥à¤Ÿ पृषà¥à¤ ',
# Statistics
-'statistics' => 'सà¥à¤¥à¤¿à¤¤à¤¿à¤—णितमà¥',
+'statistics' => 'सà¥à¤¥à¤¿à¤¤à¤¿à¤—णितमà¥',
+'statistics-users-active' => 'सकà¥à¤°à¤¿à¤¯ सदसà¥à¤¯',
+
+'doubleredirects' => 'दà¥à¤—à¥à¤¨à¥€-अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¥‡',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|बैटमà¥|बैटानि}}',
@@ -876,7 +964,6 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
# Watchlist
'watchlist' => 'मम निरीकà¥à¤·à¤¾à¤¸à¥‚चिका',
'mywatchlist' => 'मम निरीकà¥à¤·à¤¾à¤¸à¥‚चिका',
-'watchlistfor' => "('''$1''' इतà¥à¤¯à¤¸à¥à¤¯ कृते)",
'addedwatch' => 'निरीकà¥à¤·à¤¾à¤¸à¥‚चिकायां योजितमà¥',
'addedwatchtext' => 'भवतः [[Special:Watchlist|धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चिकायां]] "[[:$1]]" इतà¥à¤¯à¥‡à¤¤à¤¤à¥ योजितमसà¥à¤¤à¤¿à¥¤
इदानींपà¥à¤°à¤­à¥ƒà¤¤à¤¿ असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ तथा असà¥à¤¯ चरà¥à¤šà¤¾à¤ªà¥ƒà¤·à¥à¤ à¥‡ सनà¥à¤¤à¤ƒ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ भवतः निरीकà¥à¤·à¤¾à¤¸à¥‚चिकायां दà¥à¤°à¤•à¥à¤·à¥à¤¯à¤¨à¥à¤¤à¥‡ तथा च [[Special:RecentChanges|सदà¥à¤¯à¤ƒà¤ªà¤°à¤¿à¤µà¤°à¥à¤¤à¤¿à¤¤à¤¾à¤¨à¤¾à¤‚ सूचिकायां]] इदं पृषà¥à¤ à¤‚ सà¥à¤¥à¥‚लाकà¥à¤·à¤°à¥ˆà¤ƒ दà¥à¤°à¤•à¥à¤·à¥à¤¯à¤¤à¥‡, यसà¥à¤®à¤¾à¤¤à¥ भवानॠसरलतया इदं पशà¥à¤¯à¤¤à¥ <p>निरीकà¥à¤·à¤¾à¤¸à¥‚चिकातः निराकरà¥à¤¤à¥à¤®à¤¿à¤šà¥à¤›à¤¤à¤¿ चेतà¥, "मा निरीकà¥à¤·à¤¤à¤¾à¤®à¥" इतà¥à¤¯à¤¸à¤®à¤¿à¤¨à¥ नोदयतà¥à¥¤',
@@ -930,8 +1017,13 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'restriction-type' => 'अनà¥à¤®à¤¤à¤¿à¤ƒ:',
'restriction-level' => 'सà¥à¤°à¤•à¥à¤·à¤¾-सà¥à¤¤à¤°à¤ƒ :',
+# Restriction levels
+'restriction-level-sysop' => 'पूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤',
+'restriction-level-autoconfirmed' => 'अरà¥à¤§ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤',
+
# Undelete
'undeletelink' => 'दरà¥à¤¶à¤¯à¤¤à¥/पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¯à¤¤à¥',
+'undeleteviewlink' => 'दà¥à¤°à¥à¤·à¥à¤Ÿà¥à¤®à¤¿à¤šà¥à¤›à¤¾à¤®à¤¿',
'undeletedarticle' => '"[[$1]]" इतà¥à¤¯à¥‡à¤¤à¤¦à¥ पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿à¥¤',
# Namespace form on various pages
@@ -1073,6 +1165,7 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'tooltip-undo' => '"अकरोतà¥" इतà¥à¤¯à¥‡à¤¤à¤¦à¥ इदं संपादनं विपरीतीकरोति, तथा च संपादन-पà¥à¤°à¤¾à¤°à¥‚पं पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯-रूपेण उदà¥à¤˜à¤¾à¤Ÿà¤¯à¤¤à¤¿à¥¤
असà¥à¤¯ सारांशे कारणमपि लेखितà¥à¤‚ शकà¥à¤¯à¤¤à¥‡à¥¤',
+'tooltip-summary' => 'संकà¥à¤·à¤¿à¤ªà¥à¤¤-सारांशं पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¤à¥',
# Skin names
'skinname-standard' => 'पूरà¥à¤µ',
@@ -1087,9 +1180,9 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'nextdiff' => 'नवतरं संपादनमॠ→',
# Media information
-'file-info-size' => '($1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः: $3, MIME-पà¥à¤°à¤•à¤¾à¤°à¤ƒ: $4)',
+'file-info-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः: $3, MIME-पà¥à¤°à¤•à¤¾à¤°à¤ƒ: $4',
'file-nohires' => '<small>उचà¥à¤šà¤¤à¤°à¤‚ विभेदनं नोपलबà¥à¤§à¤®à¥</small>',
-'svg-long-desc' => '(SVG संचिका, साधारणतया $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः : $3)',
+'svg-long-desc' => 'SVG संचिका, साधारणतया $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः : $3',
'show-big-image' => 'पूरà¥à¤£à¤‚ विभेदनमà¥',
'show-big-image-thumb' => '<small>असà¥à¤¯ पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤¸à¥à¤¯ आकारः : $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿</small>',
diff --git a/languages/messages/MessagesSah.php b/languages/messages/MessagesSah.php
index 9cc8bbf2..67eb5159 100644
--- a/languages/messages/MessagesSah.php
+++ b/languages/messages/MessagesSah.php
@@ -53,8 +53,7 @@ $messages = array(
'tog-editsection' => '[Көннөрүү] диÑн ыйынньыгынан ÑиÑкÑийÑны көннөрүү',
'tog-editsectiononrightclick' => 'СиÑкÑÐ¸Ð¹Ñ Ð±Ð°Ò»Ñ‹Ð³Ð°Ñ€ уҥа тимÑҕинÑн<br />баттаан ÑиÑкÑийÑни көннөрүү (JavaScript)',
'tog-showtoc' => 'ИһинÑÑҕитин көрдөр (Ñ‹Ñтатыйа Ò¯ÑÑ‚Ñн ордук Ð±Ð°Ñ Ñ‚Ñ‹Ð»Ð»Ð°Ð°Ñ… буоллаҕына)',
-'tog-rememberpassword' => 'Ðаппын бу көмпүүтÑÑ€Ð³Ñ ÑигÑÑ',
-'tog-editwidth' => 'Көннөрүү Ñ‚Ò¯Ð½Ð½Ò¯Ð³Ñ Ð¼ÑƒÒ¥ÑƒÑ‚ÑƒÑƒÑ€ кÑтиттÑÑÑ… буоллун',
+'tog-rememberpassword' => 'Миигин бу браузерга ÑигÑÑ ($1 {{PLURAL:$1|күн|күнтÑн ордуга Ñуох}})',
'tog-watchcreations' => 'Суруйбут Ñ‹Ñтатыйаларбын кÑÑ‚ÑÑн ÐºÓ©Ñ€Ò¯Ò¯Ð³Ñ ÐºÐ¸Ð»Ð»ÑÑ€Ñн иÑ',
'tog-watchdefault' => 'Уларыппыт ÑирÑйдÑрбин кÑÑ‚ÑÑн көрүү иÑпииһÑгÑÑ€ киллÑÑ€Ñн иÑ',
'tog-watchmoves' => 'Ðатын уларыппыт ÑирÑйдÑрбин кÑÑ‚ÑÑн көрүү иÑпииһÑгÑÑ€ киллÑÑ€Ñн иÑ',
@@ -200,31 +199,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'ТиÑÐ¼Ñ Ñбии',
-'vector-action-delete' => 'Сот',
-'vector-action-move' => 'Ðатын уларыт',
-'vector-action-protect' => 'Уларыйбат гын',
-'vector-action-undelete' => 'Төннөр',
-'vector-action-unprotect' => 'КөмүÑкÑлин уһул',
-'vector-namespace-category' => 'КатегориÑ',
-'vector-namespace-help' => 'Көмө ÑирÑй',
-'vector-namespace-image' => 'БилÑ',
-'vector-namespace-main' => 'СирÑй',
-'vector-namespace-media' => 'МиÑÐ´ÑŒÐ¸Ð¹Ñ ÑирÑй',
-'vector-namespace-mediawiki' => 'Сурук',
-'vector-namespace-project' => 'Бырайыак туһунан',
-'vector-namespace-special' => 'Ðнал ÑирÑй',
-'vector-namespace-talk' => 'Ырытыы',
-'vector-namespace-template' => 'Халыып',
-'vector-namespace-user' => 'Кыттааччы Ñ‚ÑƒÑ ÑирÑйÑ',
-'vector-view-create' => 'Ðй',
-'vector-view-edit' => 'Уларыт',
-'vector-view-history' => 'УÑтуоруйатын көрүү',
-'vector-view-view' => 'Ðаҕыы',
-'vector-view-viewsource' => 'БÑлиÑлÑрин көрүү',
-'actions' => 'Дьайыылар',
-'namespaces' => 'Ðат даллара',
-'variants' => 'Барыллар',
+'vector-action-addsection' => 'ТиÑÐ¼Ñ Ñбии',
+'vector-action-delete' => 'Сот',
+'vector-action-move' => 'Ðатын уларыт',
+'vector-action-protect' => 'Уларыйбат гын',
+'vector-action-undelete' => 'Төннөр',
+'vector-action-unprotect' => 'КөмүÑкÑлин уһул',
+'vector-simplesearch-preference' => 'Көрдөбүл ÑÑ‚Ñн биÑриилÑрин кÑÒ¥Ñтиллибит барылын туруор («Векторга» ÑÑ€Ñ)',
+'vector-view-create' => 'Ðй',
+'vector-view-edit' => 'Уларыт',
+'vector-view-history' => 'УÑтуоруйатын көрүү',
+'vector-view-view' => 'Ðаҕыы',
+'vector-view-viewsource' => 'БÑлиÑлÑрин көрүү',
+'actions' => 'Дьайыылар',
+'namespaces' => 'Ðат даллара',
+'variants' => 'Барыллар',
'errorpagetitle' => 'Сыыһа',
'returnto' => 'Төттөрү $1 ÑирÑйгÑ.',
@@ -285,6 +274,9 @@ $messages = array(
Бука диÑн, кÑÑ‚ÑÒ»Ñ Ñ‚Ò¯Ò»Ñн баран Ó©ÑÑÓ© боруобалаар.
$1',
+'pool-timeout' => 'Хааччахтааһыны кÑÑ‚Ñһии болдьоҕо ааÑта',
+'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}} туһунан',
@@ -445,7 +437,8 @@ $2',
'yourname' => 'Кыттааччы аатыҥ:',
'yourpassword' => 'Киирии тыла:',
'yourpasswordagain' => 'Киирии тылгын хатылаа:',
-'remembermypassword' => 'Миигин бу көмпүүтÑÑ€Ð³Ñ ÑигÑÑ',
+'remembermypassword' => 'Миигин бу көмпүүтÑÑ€Ð³Ñ ÑигÑÑ ($1 {{PLURAL:$1|күн|күнтÑн ордуга Ñуох}})',
+'securelogin-stick-https' => 'КиирÑн баран HTTPS нөҥүө холбонууну Ñалгыырга',
'yourdomainname' => 'Эн дөмүөнүҥ:',
'externaldberror' => 'Ð¢Ð°Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ билиитин олоҕун Ñыыһата буолла, ÑбÑÑ‚ÑÑ€ Ñ‚Ð°Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ билииҥ олоҕун Ñаҥардар кыаҕыҥ Ñуох.',
'login' => 'Киир',
@@ -462,6 +455,7 @@ $2',
'gotaccount' => "БÑлиÑÑ‚Ñммитиҥ дуо? '''$1'''.",
'gotaccountlink' => 'Ðатыҥ',
'createaccountmail' => 'e-mail-ынан',
+'createaccountreason' => 'ТөрүөтÑ:',
'badretype' => 'Киирии тылларыҥ Ñөп түбÑÑпÑтилÑÑ€.',
'userexists' => 'Суруйбут аатыҥ бÑлиÑÑ€ баар.
Ðтын аатта тал.',
@@ -483,6 +477,7 @@ $2',
'passwordtooshort' => 'Киирии тылыҥ наһаа кылгаÑ.
Кырата {{PLURAL:$1|1 бÑлиÑлÑÑÑ…|$1 бÑлиÑлÑÑÑ…}} буолуохтаах.',
'password-name-match' => 'Киирии тыл ааккыттан атын буолуохтаах.',
+'password-login-forbidden' => 'Маннык ааты уонна киирии тылы туһаныы бобуллар.',
'mailmypassword' => 'Саҥа киирии тылла ыыттар',
'passwordremindertitle' => '{{SITENAME}} киирии тылын Ñанатыы',
'passwordremindertext' => 'Ким ÑÑ€Ñ (бадаҕа Ñн бу IP-аадырыÑтан: $1), {{SITENAME}} ($4) киирии тылын Ñаҥаттан Ñ‹Ñ‹Ñ‚Ñ‹Ò¥ диÑбит.
@@ -525,6 +520,9 @@ $2',
'loginlanguagelabel' => 'Омугун тыла: $1',
'suspicious-userlogout' => 'СеанÑÑ‹ түмүктүүр ыйытыгыҥ ылыныллыбата, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€ ÑбÑÑ‚ÑÑ€ кÑÑштыыр прокÑи Ð°Ð»Ò•Ð°Ñ Ñ‹Ñ‹Ð¿Ð¿Ñ‹Ñ‚ ыйытыктарыгар майгынныыр.',
+# E-mail sending
+'php-mail-error-unknown' => 'mail() PHP-функциÑтыгар туох ÑÑ€Ñ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ñ…Ñыбыт',
+
# Password reset dialog
'resetpass' => 'Киирии тылы уларытыы',
'resetpass_announce' => 'Бу быÑтах кÑÐ¼Ò¥Ñ Ñ‚ÑƒÑ‚Ñ‚ÑƒÐ»Ð»Ð°Ñ€ киирии тылынан киирдиҥ. Ð¢Ò¯Ð¼Ò¯ÐºÐºÑ Ñаҥа киирии тылла Ñуруй:',
@@ -577,9 +575,11 @@ $2',
'showlivepreview' => 'ТүргÑнник ÑÑ€Ð´Ñ ÐºÓ©Ñ€Ò¯Ò¯',
'showdiff' => 'Уларытыылар',
'anoneditwarning' => "'''Болҕой:''' СиÑтемаҕа киирбÑÑ‚Ñххин. Онон аатыҥ оннугар IP аадаырыһыҥ бу ÑирÑй иÑториÑтыгар киириÑ.",
+'anonpreviewwarning' => "''Эн Ñ‚Ð¸Ò»Ð¸ÐºÐºÑ Ð°Ð°ÐºÐºÑ‹Ð½ ÑппÑÑ‚Ñ‚Ñххин. Уларытыыгын бигÑргÑÑ‚Ñ‚ÑÑ…Ñ…Ð¸Ð½Ñ IP-аадырыһыҥ ÑирÑй уÑтуоруйатыгар Ñуруллуо.''",
'missingsummary' => "'''Санатыы:''' Уларыппытыҥ ÐºÑ‹Ð»Ð³Ð°Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ñ‚Ñ‹Ð½ Ñуруйбатаххын. Уларытыыны бигÑргÑÑ‚Ñ‚ÑÑ…Ñ…Ð¸Ð½Ñ ÑƒÐ»Ð°Ñ€Ñ‚Ñ‹Ñ‚Ñ‹Ñ‹Ò¥ Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ñ‚Ð° Ñуох барыа.",
'missingcommenttext' => 'Манна Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð½Ñ‹ Ñуруй.',
-'missingcommentheader' => "'''Санатыы:''' Ð¥Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹ аатын Ñуруйбатаххын. БигÑргÑÑ‚Ñ‚ÑÑ…Ñ…Ð¸Ð½Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ò¥ аата Ñуох барыа.",
+'missingcommentheader' => "'''Санатыы:''' Ð¥Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹ аатын Ñуруйбатаххын.
+«{{int:savearticle}}» тимÑҕи баттаан бигÑргÑÑ‚Ñ‚ÑÑ…Ñ…Ð¸Ð½Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ò¥ аата Ñуох барыа.",
'summary-preview' => 'Ð¥Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð½Ñ‹ көрүү:',
'subject-preview' => 'Ðатын/тиÑмÑтин көрүү:',
'blockedtitle' => 'Кыттааччы уларытар кыаҕа быһылынна',
@@ -652,7 +652,11 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
'usercsspreview' => "'''Умнума: бу CSS тургутуута ÑÑ€Ñ.
Билигин оҥорбутуҥ бигÑргÑÑ‚Ð¸Ð»Ð»Ñ Ð¸Ð»Ð¸Ðº!'''",
'userjspreview' => "'''Умнума: бу JavaScript Ñ‚ÑƒÑ€Ð³ÑƒÑ‚ÑƒÑƒÑ‚Ñ ÑÑ€Ñ, уларыппытыҥ бигÑргÑÑ‚Ð¸Ð»Ð»Ñ Ð¸Ð»Ð¸Ðº!'''",
-'userinvalidcssjstitle' => "'''Болҕой:''' Бу тиÑÐ¼Ñ Â«$1» Ñуох. Кыттааччы .css и .js ÑирÑйдÑÑ€Ñ ÐºÑ‹Ñ€Ð° буукубаннан Ñуруллуохтаахтар, холобур «{{ns:user}}:Ðьургун/monobook.css», маннык буолуо Ñуохтаах «{{ns:user}}:Ðьургун/Monobook.css».",
+'sitecsspreview' => "'''Бу CSS бигÑргÑппÑÐºÐºÑ ÐºÓ©Ñ€Ó© олороргун умнума.'''
+'''БигÑргÑÑ‚Ð¸Ð»Ð»Ñ Ð¸Ð»Ð¸Ðº!'''",
+'sitejspreview' => "'''Бу JavaScript-куодун бигÑргÑппÑÐºÐºÑ ÐºÓ©Ñ€Ó© олороргун умнума.'''
+'''БигÑргÑÑ‚Ð¸Ð»Ð»Ñ Ð¸Ð»Ð¸Ðº!'''",
+'userinvalidcssjstitle' => "'''Болҕой:''' Бу тиÑÐ¼Ñ Â«$1» Ñуох. Кыттааччы .css и .js ÑирÑйдÑÑ€Ñ ÐºÑ‹Ñ€Ð° буукубаннан Ñуруллуохтаахтар, холобур «{{ns:user}}:Ðьургун/vector.css», маннык буолуо Ñуохтаах «{{ns:user}}:Ðьургун/Vector.css».",
'updated' => '(Саҥардылынна)',
'note' => "'''Ð¥Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹:'''",
'previewnote' => "'''Бу көрүү ÑÑ€Ñ; уларытыылар бигÑргÑÑ‚Ð¸Ð»Ð»Ñ Ð¸Ð»Ð¸ÐºÑ‚ÑÑ€!'''",
@@ -688,9 +692,6 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
'''КИМ ЭРЭ БÐС БИЛЭР ÐœÐТЫРЫЙÐÐЛЫРКИÐИТТЭРКӨҤҮЛЭ СУОХ ÐœÐÐÐРУГУМÐ!'''",
'copyrightwarning2' => "Болҕой, Ñн Ñуруйбут матырыйаалгын ким баҕарар уларытар уонна Ñуох гынар бырааптаах. Суруйбуккун уларыталларын ÑөбүлÑÑбÑÑ‚ буоллаххына манна Ñуруйума.<br />
Эбиитин манна Ñуруйдаххына, уларытыы ааптара мин буолабын, ÑбÑÑ‚ÑÑ€ көҥүл туһанары уонна уларытары көҥүллүүр ÑиртÑн ыллым диÑн бигÑргÑÑ‚Ñҕин (маны көр $1).<br /> '''КИМ ЭРЭ БÐС БИЛИИТИРМÐÐÐРКИÐИТТЭРКӨҤҮЛЭ СУОХ УГУМÐ!'''",
-'longpagewarning' => "'''СЭРЭТИИ: Бу ÑирÑй ыйааһына $1 килобайт.
-Сорох интÑриниÑÑ‚ бырагырааммаларыгар 32 kБ ыйааһыҥҥа чугаһыыр ÑирÑйдÑÑ€ үчүгÑйдик көÑтүбÑÑ‚Ñ‚ÑÑ€.
-Онон бука диÑн бу ÑирÑйи кыра ÑирÑйдÑÑ€Ð³Ñ Ñ…Ð°Ð¹Ñ‹Ñ‚Ð°Ñ€ туһунан толкуйдааҥ.'''",
'longpageerror' => "'''ERROR: The text you have submitted is $1 kilobytes
long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''
'''ÐЛҔÐС: Суруйар кÑрчиккит $1 килобайт ыйааһыннаах, онтуккут көҥүллÑммит $2 килобайты куоһарар. Маннык хаалар кыаҕа Ñуох'''",
@@ -873,6 +874,8 @@ $1",
'logdelete-failure' => "'''Сурунаал дөбөҥө быһаарыллыбата:'''
$1",
'revdel-restore' => 'КөÑтүүтүн уларытыы',
+'revdel-restore-deleted' => 'Ñотуллубут барыллар',
+'revdel-restore-visible' => 'көÑÑ‚Ó©Ñ€ барыллар',
'pagehist' => 'ИÑториÑтын ÑирÑйÑ',
'deletedhist' => 'Сотуллубут иÑториÑ',
'revdelete-content' => 'иһинÑÑҕитÑ',
@@ -940,11 +943,13 @@ $1",
# Diffs
'history-title' => 'Көннөрүү иÑториÑта "$1"',
'difference' => '(Торумнар бÑйÑ-бÑйÑлÑриттÑн уратылара)',
+'difference-multipage' => '(СирÑйдÑÑ€ ыккардыларынааҕы уратылар)',
'lineno' => '$1 Ñтрока:',
'compareselectedversions' => 'Талыллыбыт торумнары Ñ‚ÑҥнÑÑ',
'showhideselectedversions' => 'Талыллыбыт барыллары көрдөр/киÑÑ‚ÑÑ',
'editundo' => 'төнүн',
-'diff-multi' => '({{PLURAL:$1|$1 орто торум көрдөрүллүбÑÑ‚Ñ|$1 орто торумнар көрдөрүллүбÑтилÑÑ€|$1.}})',
+'diff-multi' => '({{PLURAL:$2|$2 кыттааччы|$2 ахÑааннаах кыттааччы}} {{PLURAL:$1|$1 ыккардынааҕы барыла көрдөрүллүбÑÑ‚Ñ|$1 ахÑааннаах ыккардынааҕы барыла көрдөрүллүбÑÑ‚Ñ|$1.}})',
+'diff-multi-manyusers' => '(Кырата {{PLURAL:$2|$1 кыттааччы|$2 ахÑааннаах кыттааччы}} оҥорбут {{PLURAL:$1|ыккардынааҕы $1 барыла|ыккардынааҕы $1 барыллара}} көрдөрүллүбÑÑ‚Ñ)',
# Search results
'searchresults' => 'Булулунна',
@@ -979,6 +984,7 @@ $1",
'searchprofile-everything-tooltip' => 'СирÑйдÑÑ€Ð³Ñ Ð±Ð°Ñ€Ñ‹Ñ‚Ñ‹Ð³Ð°Ñ€ (ырытыы гиÑннÑригÑÑ€ ÑмиÑ) көрдөөһүн',
'searchprofile-advanced-tooltip' => 'Этиллибит аат далларыгар көрдөөһүн',
'search-result-size' => '$1 ({{PLURAL:$2|1 тыл|$2 тыл}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 ÑлÑмиÑн|$1 ÑлÑмиÑннÑÑ€}} ({{PLURAL:$2|$2 ÑубкатегориÑ|$2 ÑубкатегориÑлар}}, {{PLURAL:$3|$3 билÑ|$3 билÑлÑÑ€}})',
'search-result-score' => 'Релевантноһа: $1%',
'search-redirect' => '(утаарыы $1)',
'search-section' => '($1 ÑиÑкÑийÑ)',
@@ -1053,6 +1059,7 @@ $1",
'contextlines' => 'Булуллубут ÑирÑй Ñ…Ð°Ñ Ñтрокатын көрдөрөрө:',
'contextchars' => 'Строкааҕа контекÑÑ‚ бÑлиÑлÑрин ахÑаана:',
'stub-threshold' => '<a href="#" class="stub">омооннорго ыйынньыктары</a> оҥоруу боруога:',
+'stub-threshold-disabled' => 'ÐрахÑыбыт',
'recentchangesdays' => 'Ð¥Ð°Ñ Ñ…Ð¾Ð½ÑƒÐº иһинÑн уларытыылары көрдөрөргө:',
'recentchangesdays-max' => '(улааппыта $1 күн)',
'recentchangescount' => 'Саҥа уларытыылар көрдөрүллÑÑ€ ахÑааннара:',
@@ -1086,6 +1093,7 @@ $1",
'prefs-files' => 'БилÑлÑÑ€',
'prefs-custom-css' => 'БÑÐ¹Ñ CSS',
'prefs-custom-js' => 'БÑÐ¹Ñ JS',
+'prefs-common-css-js' => 'Бары тиÑмÑлÑÑ€Ð³Ñ Ð±Ð¸Ð¸Ñ€ CSS/JS',
'prefs-reset-intro' => 'Бу ÑирÑй көмөтүнÑн туруорууларгын Ñаҥаттан туруорар турукка төннөрүөххүн Ñөп.
Маны бигÑргÑÑ‚Ñ‚ÑÑ…Ñ…Ð¸Ð½Ñ Ð±Ð¸Ð»Ð¸Ð³Ð¸Ð½ баар туруоруулары дÑÐ±Ð¸Ð³Ð¸Ñ ÑөргүппÑккин.',
'prefs-emailconfirm-label' => 'Эл. почтаны бигÑргÑтии:',
@@ -1124,9 +1132,15 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'prefs-advancedrendering' => 'ДириҥÑтиллибит туруоруулар',
'prefs-advancedsearchoptions' => 'ДириҥÑтиллибит туруоруулар',
'prefs-advancedwatchlist' => 'ДириҥÑтиллибит туруоруулар',
-'prefs-display' => 'Туруоруулары көрдөр',
+'prefs-displayrc' => 'Туруоруулары көрдөр',
+'prefs-displaysearchoptions' => 'КөÑтүүтүн туруоруулара',
+'prefs-displaywatchlist' => 'КөÑтүүтүн туруоруулара',
'prefs-diffs' => 'Уратылара',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Сөп курдук көÑÑ‚Ó©Ñ€',
+'email-address-validity-invalid' => 'Ðлҕаһа Ñуох Ð°Ð°Ð´Ñ‹Ñ€Ñ‹Ñ Ð¸Ñ€Ð´ÑнÑÑ€',
+
# User rights
'userrights' => 'Кыттааччылар бырааптарын Ñалайыы',
'userrights-lookup-user' => 'Кыттаачылар бөлөхтөрүн Ñалайыы',
@@ -1210,6 +1224,7 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'right-hideuser' => 'Кыттааччы аатын бобуу уонна киÑÑ‚ÑÑһин',
'right-ipblock-exempt' => 'IP хааччахтааһынын, аптамаатынан уонна диапазоннары хааччахтааһыны тумнуу',
'right-proxyunbannable' => 'ПрокÑи аптааматынан хааччахтааһынын тумнуу',
+'right-unblockself' => 'хааччаҕы бÑÐ¹Ñ ÑƒÑтуута',
'right-protect' => 'СирÑйдÑÑ€ көмүÑкÑллÑрин таһымын уонна көмүÑкÑммит ÑирÑйдÑри уларытыы',
'right-editprotected' => 'КөмүÑкÑллÑÑÑ… ÑирÑйдÑри уларытыыы (каÑкаднай көмүÑкÑллÑÑ€Ñ Ñуох буоллаҕына)',
'right-editinterface' => 'Кыттааччы интерфейÑын уларытыы',
@@ -1232,7 +1247,6 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'right-siteadmin' => 'Ð‘Ð¸Ð»Ñ Ð¾Ð»Ð¾Ò•Ð¾Ñ€ (database) киирÑри бобуу уонна көҥүллÑÑһин',
'right-reset-passwords' => 'атын кыттааччылар киирии тылларын уларытыы',
'right-override-export-depth' => 'ÑирÑйдÑри таһаарааһын (ÑкÑпортааһын), ÑитимнÑÑÑ… ÑирÑйдÑри 5-Ñ Ñ‚Ð°Ò»Ñ‹Ð¼Ò¥Ð° дылы холбоон туран',
-'right-versiondetail' => 'программнай обеÑпечение барылын туһунан Ñиһилии көрүү',
'right-sendemail' => 'Ðтын кыттааччыларга Ñл. почтаны ыытарга',
# User rights log
@@ -1283,14 +1297,9 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'recentchanges-legend' => 'КÑлиҥҥи уларытыылар хайдах көÑтөллөрүн туруоруу',
'recentchangestext' => 'Манна хаһан оҥоһуллубуттарынан Ñааһыланан {{SITENAME}} кÑнники уларыытыылара көÑтөллөр.',
'recentchanges-feed-description' => 'Бу ботуокка биики бүтÑһик уларыйыыларын кÑтииргÑ.',
-'recentchanges-label-legend' => 'Легендата: $1.',
-'recentchanges-legend-newpage' => '$1 — Ñаҥа ÑирÑй',
'recentchanges-label-newpage' => 'Бу уларытыы түмүгÑÑ€ Ñаҥа ÑирÑй айыллыбыт.',
-'recentchanges-legend-minor' => '$1 — Ñуолтата Ñуох уларытыы',
'recentchanges-label-minor' => 'Бу улахан Ñуолтата Ñуох уларытыы',
-'recentchanges-legend-bot' => '$1 — робот көннөрүүтÑ',
'recentchanges-label-bot' => 'Бу уларытыыны робот оҥорбут',
-'recentchanges-legend-unpatrolled' => '$1 — ботуруулламматах уларытыы',
'recentchanges-label-unpatrolled' => 'Бу уларытыы Ó©ÑÑÓ© ботурууллана илик',
'rcnote' => "{{PLURAL:$2|хонук|'''$2''' хонуктар}} иһинÑн бүтÑһик {{PLURAL:$1|'''1''' уларыйыы|'''$1''' уларыйыылар}}, $5, $4.",
'rcnotefrom' => "Мантан '''$2''' маныаха '''$1''' дылы уларыыйылар көрдөрүлүннүлÑÑ€.",
@@ -1336,6 +1345,9 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'upload_directory_missing' => 'Суруйуу паапката ($1) Ñуох, ону ааһан ÑиÑрбÑÑ€ ону бÑйÑÑ‚Ñ Ð¾Ò¥Ð¾Ñ€Ð¾Ñ€ кыаҕа Ñуох.',
'upload_directory_read_only' => '($1) директориÑҕа ÑиÑрбÑÑ€ билÑни Ñуруйар кыаҕа Ñуох.',
'uploaderror' => 'Ð‘Ð¸Ð»Ñ Ñуруллубата',
+'upload-recreate-warning' => "'''Болҕой. Маннык ааттаах Ð±Ð¸Ð»Ñ Ñ…Ð°Ò»Ð°Ð½ ÑÑ€Ñ Ñотуллубут ÑбÑÑ‚ÑÑ€ аата уларытыллыбыт.''
+
+Сотуу уонна аат уларытыытын Ñурунаала аллара көÑÑ‚Ó©Ñ€:",
'uploadtext' => "Бу форманы туһанан ÑиÑрбÑÑ€Ð³Ñ Ð±Ð¸Ð»ÑлÑри Ñуруйуоххун Ñөп.
Урут Ñуруллубут билÑлÑри көрөргө манна тиий: [[Special:FileList|ойуулар тиһиктÑÑ€Ñ]]. БилÑлÑри Ñуруйуу уонна иккиÑÑ‚ÑÑн Ñуруйуу уÑтуоруйата [[Special:Log/upload|манна]], Ñотуу уÑтуоруйата [[Special:Log/delete|манна]] көÑтөллөр.
@@ -1370,6 +1382,17 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'filetype-banned-type' => "'''\".\$1\"''' — Ð±Ð¸Ð»Ñ Ð±Ð¾Ð±ÑƒÐ»Ð»ÑƒÐ±ÑƒÑ‚ көрүҥÑ.
КөҥүллÑммит Ð±Ð¸Ð»Ñ {{PLURAL:\$3|көрүҥÑ|көрүҥнÑÑ€Ñ}}: \$2.",
'filetype-missing' => 'Ð‘Ð¸Ð»Ñ Ñ€Ð°ÑширениÑта Ñуох (холобур ".jpg").',
+'empty-file' => 'Ыыппыт билÑÒ¥ кураанах.',
+'file-too-large' => 'Ыыппыт билÑÒ¥ наһаа улахан Ñбит.',
+'filename-tooshort' => 'БилÑÒ¥ аата наһаа кылгаÑ.',
+'filetype-banned' => 'Ð‘Ð¸Ð»Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº ÐºÓ©Ñ€Ò¯Ò¥Ñ Ð±Ð¾Ð±ÑƒÑƒÐ»Ð°Ð°Ñ….',
+'verification-error' => 'Бу Ð±Ð¸Ð»Ñ Ñ‚ÑƒÑ€Ð³ÑƒÑ‚ÑƒÐ»Ð»ÑƒÐ±Ð°Ñ‚Ð°Ñ….',
+'hookaborted' => 'Эн киллÑрбит уларытыыгын кÑÒ¥Ñтии таҥаÑтааччыта оннугар төннөрбүт.',
+'illegal-filename' => 'Ð‘Ð¸Ð»Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº ааттанара Ñатаммат.',
+'overwrite' => 'Баар билÑни уларытар Ñатаммат.',
+'unknown-error' => 'БиллибÑÑ‚ алҕаÑ.',
+'tmp-create-error' => 'БыÑтах кÑмнÑÑÑ… билÑни оҥорор табыллыбат.',
+'tmp-write-error' => 'БыÑтаах кÑмнÑÑÑ… билÑÒ•Ñ Ñуруйуу алҕаһа таҕыÑта.',
'large-file' => 'Манна $1 байт аннынан ыйааһыннаах ойуулары туттар ордук (Ñн Ñуруйбут билÑÒ¥ $2 байтаах).',
'largefileserver' => 'Ð‘Ð¸Ð»Ñ Ñ‹Ð¹Ð°Ð°Ò»Ñ‹Ð½Ð° көҥүллÑммиттÑн ордук.',
'emptyfile' => 'Суруйбут билÑÒ¥ арааһа кураанах быһылаах. Баҕар Ð±Ð¸Ð»Ñ Ð°Ð°Ñ‚Ñ‹Ð½ Ñыыһа Ñуруйбутуҥ буолаарай. Ó¨ÑÑÓ© төгүл көр.',
@@ -1396,13 +1419,14 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
Ол да буоллар билÑни киллÑриÑххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Бу Ð±Ð¸Ð»Ñ Ð°Ñ‚Ñ‹Ð½ {{PLURAL:$1|Ð±Ð¸Ð»Ñ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ð°Ñ‚Ð°|билÑлÑÑ€ дубликааттара}} буолар:',
'file-deleted-duplicate' => 'Маннык Ð±Ð¸Ð»Ñ ([[:$1]]) урут Ñотуллубут Ñбит. Суруттарыаҥ Ð¸Ð½Ð½Ð¸Ð½Ñ Ð±Ð°Ñтаан тоҕо Ñотуллубутун көр.',
-'successfulupload' => 'Сатанна',
'uploadwarning' => 'СÑÑ€Ñтии',
'uploadwarning-text' => 'Бука диÑн аллара баар Ð±Ð¸Ð»Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ Ñуругу уларыт уонна Ó©ÑÑÓ© хатылаа.',
'savefile' => 'БилÑни Ñуруттарыы',
'uploadedimage' => 'Ñуруттарылынна "[[$1]]"',
'overwroteimage' => '"[[$1]]" киллÑриллибит Ñаҥа торума',
'uploaddisabled' => 'Суруттарыы бобуллубут',
+'copyuploaddisabled' => 'URL көмөтүнÑн хачайдыыр кыах араарыллыбыт.',
+'uploadfromurl-queued' => 'Эн хачайдааһыныҥ уочаркка туруорулунна.',
'uploaddisabledtext' => 'БилÑлÑри Ñуруттарар көҥүллÑммÑÑ‚.',
'php-uploaddisabledtext' => 'PHP туруорууларыгар билÑни киллÑрии араарыллыбыт. Бука диÑн, file_uploads туруоруутун көр.',
'uploadscripted' => 'Бу Ð±Ð¸Ð»Ñ HTML ÑбÑÑ‚ÑÑ€ Ñкрипт куодтаах Ñбит. ИнтÑриниÑÑ‚ көрдөрөр бырагыраамма ону Ñыыһа ааҕыан Ñөп.',
@@ -1434,6 +1458,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- Бу Ñтроканы оннунан хааллар -->',
+'upload-success-subj' => 'Сатанна',
+'upload-success-msg' => '[$2] хачайдааһын табылынна. Ол түмүгүн манна көрүөххүн Ñөп: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Хачайдааһын моһуога',
+'upload-failure-msg' => 'Эн хачайдааһыныҥ (мантан [$2]) моһуогурда:
+
+$1',
+'upload-warning-subj' => 'Хачайдыырга ÑÑÑ€Ñтии',
+'upload-warning-msg' => '[$2] хачайдыырга Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта. Ол алҕаһы көннөрөргө манна төнүн [[Special:Upload/stash/$1|upload form]].',
'upload-proto-error' => 'Сыыһа боротокуол',
'upload-proto-error-text' => 'Ыраахтан Ñуруттарарга маннык аадырыÑтар наадалар: <code>http://</code> ÑбÑÑ‚ÑÑ€ <code>ftp://</code>.',
@@ -1497,6 +1529,7 @@ PICT # misc.
'listfiles_search_for' => 'МиÑдьийÑни (ойууну) аатынан көрдөтүү:',
'imgfile' => 'билÑ',
'listfiles' => 'БилÑлÑÑ€',
+'listfiles_thumb' => 'Ойуучаан',
'listfiles_date' => 'КүнÑ-ыйа',
'listfiles_name' => 'Ðата',
'listfiles_user' => 'Кыттааччы',
@@ -1610,8 +1643,8 @@ PICT # misc.
'statistics-edits' => '{{SITENAME}} оҥоһуллуоҕуттан көннөрүү ахÑаана',
'statistics-edits-average' => 'Биир ÑирÑÐ¹Ð³Ñ Ð¾Ñ€Ñ‚Ð¾Ñ‚ÑƒÐ½Ð°Ð½ Ñ…Ð°Ñ ÐºÓ©Ð½Ð½Ó©Ñ€Ò¯Ò¯ тикÑÑÑ€Ñ',
'statistics-views-total' => 'Көрүү ахÑаана',
+'statistics-views-total-desc' => 'Суох уонна аналлаах ÑирÑйдÑри көрүү ааҕыллыбат',
'statistics-views-peredit' => 'Биир улартыыга тикÑÑÑ€ көрүү ахÑаана',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Job queue] кÑÑмÑйÑ',
'statistics-users' => 'БÑлиÑÑ‚Ñммит [[Special:ListUsers|кыттааччы]] ахÑаана',
'statistics-users-active' => 'Көхтөөх кыттааччылар ахÑааннара',
'statistics-users-active-desc' => 'ÐаÑпыт {{PLURAL:$1|биир хонук иһигÑÑ€|$1 хонукка}} тугу ÑÐ¼Ñ Ð¾Ò¥Ð¾Ñ€Ð±ÑƒÑ‚ кыттааччылар',
@@ -1624,7 +1657,7 @@ PICT # misc.
'doubleredirects' => 'Ð¥Ð¾Ñ ÐºÓ©Ò»Ó©Ñ€Ó©Ó©Ò»Ò¯Ð½',
'doubleredirectstext' => 'Бу ÑирÑÐ¹Ð³Ñ Ð°Ñ‚Ñ‹Ð½ ÑÐ¸Ñ€Ð³Ñ ÑƒÑ‚Ð°Ð°Ñ€Ð°Ñ€ Ñ…Ð¾Ñ ÑƒÑ‚Ð°Ð°Ñ€Ñ‹Ñ‹Ð»Ð°Ñ€ тиһиктÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
Ð¥Ð°Ñ ÑƒÑтуруока аайы баÑтакы уонна Ð¸ÐºÐºÐ¸Ñ ÑƒÑ‚Ð°Ð°Ñ€Ñ‹Ð³Ð° ÑÐ¸Ð³Ñ Ð±Ð°Ð°Ñ€, ону таһынан Ð¸ÐºÐºÐ¸Ñ ÑƒÑ‚Ð°Ð°Ñ€Ñ‹Ñ‹Ð³Ð° баар ÑирÑй аадырыһа (аата) баар, ол аата баÑтакы утаарыы дьиҥинÑн ханна утаарыахтааҕа көÑÑ‚Ó©Ñ€.
-<s>Сотуллубут</s> Ñуруктар көннөрүллүбүттÑÑ€.',
+<del>Сотуллубут</del> Ñуруктар көннөрүллүбүттÑÑ€.',
'double-redirect-fixed-move' => '[[$1]] ÑирÑй аата уларытыллыбыт, билигин манна утаарар [[$2]]',
'double-redirect-fixer' => 'Утаарыылары көннөрөөччү',
@@ -1647,6 +1680,8 @@ PICT # misc.
'nmembers' => '$1 {{PLURAL:$1|кыттааччы|кыттааччылаах}}',
'nrevisions' => '$1 {{PLURAL:$1|барыллаах|барыл баар}}',
'nviews' => '$1 көрүүлÑÑÑ…',
+'nimagelinks' => '$1 {{PLURAL:$1|ÑирÑйгÑ|ахÑааннаах ÑирÑйгÑ}} туттуллар',
+'ntransclusions' => '$1 {{PLURAL:$1|ÑирÑйгÑ|ахÑааннаах ÑирÑйгÑ}} туттуллар',
'specialpage-empty' => 'Көрдөөн тугу да булбата.',
'lonelypages' => 'Ðтын ÑирÑйдÑри кытта ÑибÑÑÒ»Ñ Ñуох ÑирÑйдÑÑ€',
'lonelypagestext' => 'Манна көÑÑ‚Ó©Ñ€ ÑирÑйдÑÑ€Ð³Ñ {{SITENAME}} атын ÑирÑйдÑÑ€Ñ ÑигÑммÑÑ‚Ñ‚ÑÑ€.',
@@ -1804,35 +1839,41 @@ PICT # misc.
'listgrouprights-removegroup-self-all' => 'Бары бөлөхтөрү бÑйÑтин аатыттан Ñотуон Ñөп',
# E-mail user
-'mailnologin' => 'Ðадырыһа Ñуох',
-'mailnologintext' => 'Ðтын кыттааччылары кытта e-mail көмөтүнÑн ÑуруйÑуоххун баҕарар буоллаххына бÑйÑҕин [[Special:UserLogin|билиһиннÑриÑÑ…Ñ‚ÑÑххин]] уонна e-mail аадырыÑкын [[Special:Preferences|туруорууларгар]] Ñуруйуохтааххын.',
-'emailuser' => 'Кыттааччыга Ñурук',
-'emailpage' => 'Кыттааччыга E-mail ыыт',
-'emailpagetext' => 'Бу фуорма көмөтүнÑн кыттааччыга Ñурук ыытыаххын Ñөп.
+'mailnologin' => 'Ðадырыһа Ñуох',
+'mailnologintext' => 'Ðтын кыттааччылары кытта e-mail көмөтүнÑн ÑуруйÑуоххун баҕарар буоллаххына бÑйÑҕин [[Special:UserLogin|билиһиннÑриÑÑ…Ñ‚ÑÑххин]] уонна e-mail аадырыÑкын [[Special:Preferences|туруорууларгар]] Ñуруйуохтааххын.',
+'emailuser' => 'Кыттааччыга Ñурук',
+'emailpage' => 'Кыттааччыга E-mail ыыт',
+'emailpagetext' => 'Бу фуорма көмөтүнÑн кыттааччыга Ñурук ыытыаххын Ñөп.
"КимтÑн" графааҕа Ñн [[Special:Preferences|туруорууларгар]] баар аадырыһыҥ киириÑÒ•Ñ,
онон туппут киһи хардарар кыахтаныа.',
-'usermailererror' => 'Сурук кыайан барбата:',
-'defemailsubject' => '{{SITENAME}} Ñл. почтата',
-'noemailtitle' => 'E-mail Ñуох',
-'noemailtext' => 'Бу кыттааччы e-mail аадырыһын ÑппÑÑ‚ÑÑ….',
-'nowikiemailtitle' => 'Сурук ыытар кыах Ñуох',
-'nowikiemailtext' => 'Бу кыттааччы Ñурук тутуон баҕарбат.',
-'email-legend' => '{{SITENAME}} атын кыттааччытыгар Ñурук ыытарга',
-'emailfrom' => 'КимтÑн:',
-'emailto' => 'КимиÑÑ…Ñ:',
-'emailsubject' => 'Сурук аата:',
-'emailmessage' => 'Сурук:',
-'emailsend' => 'Ыыт',
-'emailccme' => 'Сурукпун бÑйÑбÑÑ€ ÑÐ¼Ð¸Ñ Ñ‹Ñ‹Ñ‚.',
-'emailccsubject' => 'Эн Ñуругуҥ куоппуйата $1: $2',
-'emailsent' => 'Сурук барда',
-'emailsenttext' => 'Эн Ñуругуҥ ыытылынна.',
-'emailuserfooter' => 'Бу Ñурук $2 кыттааччыга $1 кыттааччыттан «Сурукта ыыт» диÑн Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÓ©Ð¼Ó©Ñ‚Ò¯Ð½Ñн {{SITENAME}} Ñаайтан ыытыллыбыт.',
+'usermailererror' => 'Сурук кыайан барбата:',
+'defemailsubject' => '{{SITENAME}} Ñл. почтата',
+'usermaildisabled' => 'Кыттааччы Ñл почтата арахÑа Ñылдьар',
+'usermaildisabledtext' => 'Эн атын кыттааччыларга Ñл. почтанан Ñурук ыытар кыаҕыҥ Ñуох Ñбит',
+'noemailtitle' => 'E-mail Ñуох',
+'noemailtext' => 'Бу кыттааччы e-mail аадырыһын ÑппÑÑ‚ÑÑ….',
+'nowikiemailtitle' => 'Сурук ыытар кыах Ñуох',
+'nowikiemailtext' => 'Бу кыттааччы Ñурук тутуон баҕарбат.',
+'email-legend' => '{{SITENAME}} атын кыттааччытыгар Ñурук ыытарга',
+'emailfrom' => 'КимтÑн:',
+'emailto' => 'КимиÑÑ…Ñ:',
+'emailsubject' => 'Сурук аата:',
+'emailmessage' => 'Сурук:',
+'emailsend' => 'Ыыт',
+'emailccme' => 'Сурукпун бÑйÑбÑÑ€ ÑÐ¼Ð¸Ñ Ñ‹Ñ‹Ñ‚.',
+'emailccsubject' => 'Эн Ñуругуҥ куоппуйата $1: $2',
+'emailsent' => 'Сурук барда',
+'emailsenttext' => 'Эн Ñуругуҥ ыытылынна.',
+'emailuserfooter' => 'Бу Ñурук $2 кыттааччыга $1 кыттааччыттан «Сурукта ыыт» диÑн Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÓ©Ð¼Ó©Ñ‚Ò¯Ð½Ñн {{SITENAME}} Ñаайтан ыытыллыбыт.',
+
+# User Messenger
+'usermessage-summary' => 'Тиһилик биллÑриитин хааллар.',
+'usermessage-editor' => 'Тиһилик биллÑÑ€ÑÑччитÑ',
# Watchlist
'watchlist' => 'Мин кÑÑ‚ÑÑһиним',
'mywatchlist' => 'КÑтиир ÑирÑйдÑрим',
-'watchlistfor' => "('''$1''' киÑнÑ)",
+'watchlistfor2' => '$1 $2 аналлаах',
'nowatchlist' => 'Эн кÑтиир ÑирÑйдÑриҥ Ñуохтар.',
'watchlistanontext' => 'КÑÑ‚Ñбилиҥ ÑирÑйин көрөргөр ÑбÑÑ‚ÑÑ€ уларытаргар маны оҥор: $1.',
'watchnologin' => 'БÑйÑҕин билиһиннÑÑ€',
@@ -1949,7 +1990,10 @@ $UNWATCHURL
'revertpage' => '([[User talk:$2|Ырытыы]]) көннөрүүлÑÑ€Ñ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлÑÑ€',
'revertpage-nouser' => 'Бу киһи (аата көÑтүбÑÑ‚) уларытыылара бу киһи барылыгар төннөрүлүннүлÑÑ€ [[User:$1|$1]]',
'rollback-success' => '$1 көннөрүүлÑÑ€ бу торумҥа төннөрүлүннүлÑÑ€: $2.',
-'sessionfailure' => 'Ðрааһа туох ÑÑ€Ñ Ñатаммата, дьайыыҥ оҥоһуллубата. Браузергар "Төнүн" тимÑҕи баттаа уонна бу иннинÑÑҕи ÑирÑйгин иккиÑÑ‚ÑÑн киллÑÑ€Ñн көр.',
+
+# Edit tokens
+'sessionfailure-title' => 'СиÑÑÑÐ¸Ð¹Ñ Ð°Ð»Ò•Ð°Ò»Ð°',
+'sessionfailure' => 'Ðрааһа туох ÑÑ€Ñ Ñатаммата, дьайыыҥ оҥоһуллубата. Браузергар "Төнүн" тимÑҕи баттаа уонна бу иннинÑÑҕи ÑирÑйгин иккиÑÑ‚ÑÑн киллÑÑ€Ñн көр.',
# Protect
'protectlogpage' => 'ХарыÑхал Ñурунаала (көннөрүүттÑн көмүÑкÑммит билÑлÑÑ€ иÑпииһÑктÑÑ€Ñ)',
@@ -2081,18 +2125,22 @@ $1',
'month' => 'Ыйтан бÑÑ‚Ñ‚ÑÑ…:',
'year' => 'Сылтан бÑÑ‚Ñ‚ÑÑ…:',
-'sp-contributions-newbies' => 'Саҥа ÑÑ€Ñ Ð°Ð°Ñ‚Ñ‚Ð°Ð½ оҥоһуллубут уларытыылары көрдөр',
-'sp-contributions-newbies-sub' => 'Саҥа ааттартан',
-'sp-contributions-newbies-title' => 'Саҥа бÑйÑлÑрин билиһиннÑрбит дьон уларытыылара',
-'sp-contributions-blocklog' => 'Бобуу Ñурунаала',
-'sp-contributions-deleted' => 'кыттааччы Ñотуллубут көннөрүүлÑÑ€Ñ',
-'sp-contributions-logs' => 'Ñурунааллар',
-'sp-contributions-talk' => 'ырытыы',
-'sp-contributions-userrights' => 'кыттааччылар бырааптарын Ñалайыы',
-'sp-contributions-blocked-notice' => 'Бу кыттааччы бырайыакка кыттара билигин бобуллубут. Хааччах Ñурунаалыгар ол туһунан бүтÑһик Ñурук:',
-'sp-contributions-search' => 'Кыттааччы оҥорбут уларытыыларын көрдөөһүн',
-'sp-contributions-username' => 'IP аадырыһа ÑбÑÑ‚ÑÑ€ аата:',
-'sp-contributions-submit' => 'Көрдөө',
+'sp-contributions-newbies' => 'Саҥа ÑÑ€Ñ Ð°Ð°Ñ‚Ñ‚Ð°Ð½ оҥоһуллубут уларытыылары көрдөр',
+'sp-contributions-newbies-sub' => 'Саҥа ааттартан',
+'sp-contributions-newbies-title' => 'Саҥа бÑйÑлÑрин билиһиннÑрбит дьон уларытыылара',
+'sp-contributions-blocklog' => 'Бобуу Ñурунаала',
+'sp-contributions-deleted' => 'кыттааччы Ñотуллубут көннөрүүлÑÑ€Ñ',
+'sp-contributions-uploads' => 'киллÑриилÑÑ€',
+'sp-contributions-logs' => 'Ñурунааллар',
+'sp-contributions-talk' => 'ырытыы',
+'sp-contributions-userrights' => 'кыттааччылар бырааптарын Ñалайыы',
+'sp-contributions-blocked-notice' => 'Бу кыттааччы бырайыакка кыттара билигин бобуллубут. Хааччах Ñурунаалыгар ол туһунан бүтÑһик Ñурук:',
+'sp-contributions-blocked-notice-anon' => 'Бу IP бырайыакка кыттара билигин бобуллубут.
+Хааччах Ñурунаалыгар ол туһунан бүтÑһик Ñурук:',
+'sp-contributions-search' => 'Кыттааччы оҥорбут уларытыыларын көрдөөһүн',
+'sp-contributions-username' => 'IP аадырыһа ÑбÑÑ‚ÑÑ€ аата:',
+'sp-contributions-toponly' => 'КÑнники барыллары ÑÑ€Ñ ÐºÓ©Ñ€Ð´Ó©Ñ€',
+'sp-contributions-submit' => 'Көрдөө',
# What links here
'whatlinkshere' => 'Манна ÑигÑнÑллÑÑ€',
@@ -2155,7 +2203,6 @@ $1',
'ipb-edit-dropdown' => 'Бобуу биричиинÑтин уларыт',
'ipb-unblock-addr' => '$1 бобуутун Ñуох гын',
'ipb-unblock' => 'Кыттаачыны ÑбÑÑ‚ÑÑ€ IP-ны бобуллубуттар иÑпииһÑктÑриттÑн таһаар',
-'ipb-blocklist-addr' => '$1 бобууларын көрдөр',
'ipb-blocklist' => 'Бобуулары көрдөр',
'ipb-blocklist-contribs' => '$1 кыттааччы кылаата/киллÑриитÑ',
'unblockip' => 'Кыттааччыны көҥүллÑÑ',
@@ -2224,6 +2271,8 @@ $1 бÑлиÑÑ€ хааччахтаммыт. Хааччахтааһын туруÐ
'sorbs_create_account_reason' => 'Эн IP-Ò¥ {{SITENAME}} Ñаайт DNSBL-гар Ð°Ò»Ð°Ò•Ð°Ñ Ð¿Ñ€Ð¾ÐºÑи быһыытынан Ñылдьар. Саҥаттан бÑлиÑÑ‚ÑнÑÑ€ кыаҕыҥ Ñуох.',
'cant-block-while-blocked' => 'БÑйÑÒ¥ хааччахтаммыт кÑмҥÑÑ€ атын кыттааччылары хааччахтыыр кыаҕыҥ Ñуох.',
'cant-see-hidden-user' => 'Эн хааччахтаары гыммыт кыттааччыҥ урут хааччахтаммыт уонна киÑÑ‚Ñммит Ñбит. Кыттааччылары киÑтиир кыаҕыҥ Ñуох буолан ол туһунан Ñуругу көрөр да уларытар да быраабыҥ Ñуох.',
+'ipbblocked' => 'Ðтын кыттааччылары хааччахтыыр да, хааччахтарын да уÑтар кыаҕыҥ Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð±ÑйÑÒ¥ хааччахтааххын',
+'ipbnounblockself' => 'Эн бÑйÑÒ¥ хааччаххын кыайан уÑтубаккын',
# Developer tools
'lockdb' => 'Билии олоҕо (database) хатаммыт (ÐºÓ©Ñ€Ò¯Ó©Ñ…Ñ…Ñ ÑÑ€Ñ Ñөп)',
@@ -2261,6 +2310,18 @@ $1 бÑлиÑÑ€ хааччахтаммыт. Хааччахтааһын туруÐ
'''СЭРЭТИИ!'''
СирÑй аатын уларытыы улахан уонна ÑрдÑÑ‚Ñ‚Ñн өйдөммөтөх Ñодуллаах буолуон Ñөп.
Онон, бука диÑн Ñалгыаҥ Ð¸Ð½Ð½Ð¸Ð½Ñ Ò¯Ñ‡Ò¯Ð³Ñйдик толкуйдаа.",
+'movepagetext-noredirectfixer' => "Манна баар форманы туһанан ÑирÑй аатын уларытыаххын Ñөп.
+Бу түбÑлтÑÒ•Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ñ‚Ñ‹Ñ‹ Ñурунаала Ñаҥа ÑÐ¸Ñ€Ð³Ñ ÐºÓ©Ò»Ó©Ñ€.
+Урукку аат Ñаҥа ÑирÑÐ¹Ð³Ñ ÑƒÑ‚Ð°Ð°Ñ€Ð°Ñ€ ÑирÑÐ¹Ð³Ñ ÐºÑƒÐ±ÑƒÐ»ÑƒÐ¹Ð°Ñ€.
+Бука диÑн [[Special:DoubleRedirects|Ñ…Ð¾Ñ Ñ‹Ð¹Ñ‹Ð½Ð½ÑŒÑ‹ÐºÑ‚Ð°Ñ€]] уонна [[Special:BrokenRedirects|быÑтыбыт ÑигÑниилÑÑ€]] баалларын көр.
+СигÑлÑÑ€ Ñөпкө ыйалларын Ñн ÑитиһиÑÑ…Ñ‚ÑÑххин.
+
+Ó¨Ñкө маннык ааттаах ÑирÑй хайыы-Ò¯Ð¹Ñ Ð±Ð°Ð°Ñ€ буоллаҕына ÑирÑй аата '''уларыйыа Ñуоҕа''', арай ол ÑирÑй кураанах ÑбÑÑ‚ÑÑ€ утаарар ÑирÑй буолбатах буоллаҕына.
+Ол аата Ñн ÑирÑй аатын Ñыыһа уларыппыт буоллаххына Ñ‚Ó©Ñ‚Ñ‚Ó©Ñ€Ò¯ урукку аатыгар төннөрүөххүн Ñөп гынан баран, баар ÑирÑйи Ð°Ð»Ò•Ð°Ñ Ñотор кыаҕыҥ Ñуох.
+
+'''СЭРЭТИИ!'''
+СирÑй аатын уларытыы улахан уонна ÑрдÑÑ‚Ñ‚Ñн өйдөммөтөх Ñодуллаах буолуон Ñөп.
+Онон, бука диÑн Ñалгыаҥ Ð¸Ð½Ð½Ð¸Ð½Ñ Ò¯Ñ‡Ò¯Ð³Ñйдик толкуйдаа.",
'movepagetalktext' => 'Холбонуллубут ырытыы (баар буоллаҕына) ÑÐ¼Ð¸Ñ Ð°Ð°Ñ‚Ñ‹Ð½ уларытыа. Ол Ñатаммат түбÑлтÑлÑÑ€Ñ:
*Маннык ааттаах кураанах буолбатах ырытыы баар буоллаҕына
*Манна бÑÐ»Ð¸Ñ Ñ‚ÑƒÑ€ÑƒÐ¾Ñ€Ð±Ð°Ñ‚Ð°Ñ…Ñ…Ñ‹Ð½Ð°.
@@ -2317,6 +2378,7 @@ $1 бÑлиÑÑ€ хааччахтаммыт. Хааччахтааһын туруÐ
'immobile-source-page' => 'Бу ÑирÑйи аатын уларытар табыллыбат.',
'immobile-target-page' => 'СирÑÐ¹Ð³Ñ Ð±Ñƒ ааты иҥÑÑ€ÑÑ€ табыллыбат.',
'imagenocrossnamespace' => 'Ойууга атын аат далыттан аат биÑÑ€ÑÑ€ Ñатаммат',
+'nonfile-cannot-move-to-file' => 'СирÑйдÑри Ð±Ð¸Ð»Ñ Ð³Ñ‹Ð½Ð°Ð½ ааттарын уларытар табыллыбат',
'imagetypemismatch' => 'Ð‘Ð¸Ð»Ñ Ñаҥа раÑширениÑта тиибигÑÑ€ Ñөп түбÑÑпÑÑ‚',
'imageinvalidfilename' => 'Ð‘Ð¸Ð»Ñ Ð°Ð°Ñ‚Ð° Ñыыһалаах',
'fix-double-redirects' => 'Утаарыылары урукку ааттарыгар төннөр',
@@ -2400,6 +2462,7 @@ $1 бÑлиÑÑ€ хааччахтаммыт. Хааччахтааһын туруÐ
'importstart' => 'СирÑйдÑри импортааһын...',
'import-revision-count' => '$1 {{PLURAL:$1|торум|торумнар}}',
'importnopages' => 'Импортка аналлаах ÑирÑй Ñуох.',
+'imported-log-entries' => 'Сурунаал $1 {{PLURAL:$1|Ñуруга|Ñуруктара}} импортаннылар.',
'importfailed' => 'Импортыыр табыллыбата: $1',
'importunknownsource' => 'Импортанар ÑирÑй биллибÑÑ‚ көрүҥнÑÑÑ…',
'importcantopen' => 'Импортанар Ð±Ð¸Ð»Ñ ÐºÑ‹Ð°Ð¹Ð°Ð½ арыллыбат',
@@ -2493,6 +2556,8 @@ $1 бÑлиÑÑ€ хааччахтаммыт. Хааччахтааһын туруÐ
'tooltip-rollback' => 'Биир баттааһынынан бүтÑһик көннөрүүлÑри оҥорбут киһи уларытыыларын Ñуох оҥорорго.',
'tooltip-undo' => 'БүтÑһик көннөрүүнү Ñуох оҥор уонна уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ñ…Ð°Ð¹Ð´Ð°Ñ… көÑÑ‚Ò¯Ó©Ñ…Ñ‚ÑÑҕин көрдөрөр түннүгү таһаар.
Уларытыы төрүөтүн быһаарар кыаҕы биÑÑ€.',
+'tooltip-preferences-save' => 'Туруоруулары бигÑргÑÑ‚',
+'tooltip-summary' => 'КылгаÑтык бу туһунан Ñуруй',
# Stylesheets
'common.css' => '/** Манна оҥоһуллубут CSS атын Ñкиннарга ÑÐ¼Ð¸Ñ Ð¾Ð»Ð¾Ñ…Ñ‚Ð¾Ð½ÑƒÐ¾ */',
@@ -2598,19 +2663,22 @@ $1',
'nextdiff' => 'КÑннинÑÑҕи уларытыыга →',
# Media information
-'mediawarning' => "'''СÑÑ€Ñтии''': Бу Ð±Ð¸Ð»Ñ Ð¸Ò»Ð¸Ð³ÑÑ€ бырагыраамма куода баар.
+'mediawarning' => "'''СÑÑ€Ñтии''': Бу Ð±Ð¸Ð»Ñ Ð¸Ò»Ð¸Ð³ÑÑ€ бырагыраамма куода баар.
Куһаҕан буоллаҕына ÑиÑтиÑмÑни алдьатыан Ñөп.",
'imagemaxsize' => "Ойуу улаханын хааччахтааһын:<br />''(Ð±Ð¸Ð»Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ ÑирÑÐ¹Ð³Ñ Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ…)''",
'thumbsize' => 'Кыра ойуу (миниатюра) кÑÑмÑйÑ:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|ÑирÑй|ÑирÑй}}',
-'file-info' => '(Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $1, MIME тиибÑ: $2)',
-'file-info-size' => '($1 × $2 пиикÑÑл, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3, MIME тиибÑ: $4)',
+'file-info' => 'Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $1, MIME тиибÑ: $2',
+'file-info-size' => '$1 × $2 пиикÑÑл, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3, MIME тиибÑ: $4',
'file-nohires' => '<small>Бу ойуу маннааҕар улахан торума Ñуох.</small>',
-'svg-long-desc' => '(SVG билÑ, номинальнай кÑÑмÑÐ¹Ñ $1 × $2 пиикÑÑл, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3)',
+'svg-long-desc' => 'SVG билÑ, номинальнай кÑÑмÑÐ¹Ñ $1 × $2 пиикÑÑл, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3',
'show-big-image' => 'Ойуу бÑйÑтин толору кÑÑмÑйÑ',
'show-big-image-thumb' => '<small>Хачайдыах Ð¸Ð½Ð½Ð¸Ð½Ñ ÐºÓ©Ñ€Ò¯Ò¯ кÑÑмÑйÑ: $1 × $2 пиикÑÑл</small>',
'file-info-gif-looped' => 'хатаммыт (бобуллубут)',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фреймнаах|фреймнардаах}}',
+'file-info-png-looped' => 'Ñ‚Ó©Ñ‚Ñ‚Ó©Ñ€Ò¯ ÑргийÑÑ€',
+'file-info-png-repeat' => '{{PLURAL:$1|биирдÑ|төгүл}} оонньонор $1',
+'file-info-png-frames' => '$1 {{PLURAL:$1|фреймнаах|фреймнардаах}}',
# Special:NewFiles
'newimages' => 'Саҥа билÑлÑÑ€ галереÑлара',
@@ -2768,6 +2836,7 @@ $1',
'exif-gpsareainformation' => 'GPS оройуонун аата',
'exif-gpsdatestamp' => 'GPS ыйа-күнÑ',
'exif-gpsdifferential' => 'GPS көннөрүүтүн дифференциала',
+'exif-objectname' => 'ÐšÑ‹Ð»Ð³Ð°Ñ Ð°Ð°Ñ‚Ð°',
# EXIF attributes
'exif-compression-1' => 'Хам тутуллубатах',
@@ -2849,6 +2918,8 @@ $1',
'exif-sensingmethod-7' => 'Ò®Ñ Ó©Ò¥Ð½Ó©Ó©Ñ… линейнай ÑенÑор',
'exif-sensingmethod-8' => 'Линейный ÑенÑор Ñ Ð¿Ð¾Ñледовательным измерением цвета',
+'exif-filesource-3' => 'Цифровой фотоаппарат',
+
'exif-scenetype-1' => 'Объект бÑйÑтин хаартыÑкаҕа Ñ‚Ò¯Ò»Ñриллибит',
'exif-customrendered-0' => 'Оҥоһуллубатах',
@@ -2925,30 +2996,30 @@ $1',
'limitall' => 'бары',
# E-mail address confirmation
-'confirmemail' => 'Электроннай аадырыһы бигÑргÑтии',
-'confirmemail_noemail' => '[[Special:Preferences|БÑйÑÒ¥ туруорууларгар]] Ñлектроннай аадырыÑкын Ñуруйбатаххын ÑбÑÑ‚ÑÑ€ Ñыыһа Ñуруйбуккун.',
-'confirmemail_text' => '{{SITENAME}} движога үлÑлиÑÒ¥ Ð¸Ð½Ð½Ð¸Ð½Ñ Ñлектроннай аадырыÑкын бигÑргÑÑ‚Ñри ÑÑ€ÑйÑÑ€.
+'confirmemail' => 'Электроннай аадырыһы бигÑргÑтии',
+'confirmemail_noemail' => '[[Special:Preferences|БÑйÑÒ¥ туруорууларгар]] Ñлектроннай аадырыÑкын Ñуруйбатаххын ÑбÑÑ‚ÑÑ€ Ñыыһа Ñуруйбуккун.',
+'confirmemail_text' => '{{SITENAME}} движога үлÑлиÑÒ¥ Ð¸Ð½Ð½Ð¸Ð½Ñ Ñлектроннай аадырыÑкын бигÑргÑÑ‚Ñри ÑÑ€ÑйÑÑ€.
Ðналлаах тимÑҕи баттаан Ñппит аадырыÑкар Ñурукта ыыттар.
Ол Ñуругу арыйдаххына, аадырыһыҥ бигÑргÑтиллиÑ.',
-'confirmemail_pending' => 'БигÑргÑтии куода номнуо ыытыллыбыт.
+'confirmemail_pending' => 'БигÑргÑтии куода номнуо ыытыллыбыт.
БÑйÑҕин Ñоторутааҕыта билиһиннÑрбит буоллаххына ол Ñурук кÑлÑрин кыратык кÑÑ‚ÑÒ»Ñ Ñ‚Ò¯Ñ.
Ол кÑннÑ, кÑлбÑÑ‚ÑҕинÑ, куоду Ó©ÑÑÓ© көрдөөр.',
-'confirmemail_send' => 'БигÑргÑтии куодун почтанан Ñ‹Ñ‹Ñ‚',
-'confirmemail_sent' => 'БигÑргÑÑ‚ÑÑ€ Ñурук ыытылынна.',
-'confirmemail_oncreate' => 'БигÑргÑÑ‚ÑÑ€ Ñурук Ñппит почтаҕар ыытылынна.
+'confirmemail_send' => 'БигÑргÑтии куодун почтанан Ñ‹Ñ‹Ñ‚',
+'confirmemail_sent' => 'БигÑргÑÑ‚ÑÑ€ Ñурук ыытылынна.',
+'confirmemail_oncreate' => 'БигÑргÑÑ‚ÑÑ€ Ñурук Ñппит почтаҕар ыытылынна.
Бу бигÑргÑтии ÑиÑтиÑмÑÒ•Ñ ÐºÐ¸Ð¸Ñ€Ñри хааччахтаабат ÑÑ€ÑÑри, Ñлектроннай почтаны манна туһанаргар бигÑргÑÑ‚Ñриҥ наада.',
-'confirmemail_sendfailed' => '{{SITENAME}} бигÑргÑÑ‚ÑÑ€ Ñуруга кыайан ыытыллыбата.
+'confirmemail_sendfailed' => '{{SITENAME}} бигÑргÑÑ‚ÑÑ€ Ñуруга кыайан ыытыллыбата.
Электроннай аадырыÑкын Ñөпкө Ñуруйбуккун бÑÑ€ÑбиÑркÑлÑÑ.
Сурук барбатах Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ: $1',
-'confirmemail_invalid' => 'БигÑргÑтии куода Ñыыһа ÑбÑÑ‚ÑÑ€ болдьоҕо ааÑпыт.',
-'confirmemail_needlogin' => '$1 - маны оҥордоххуна аадырыÑкын бигÑргÑтиÑÒ¥.',
-'confirmemail_success' => 'Электроннай аадырыһыҥ бигÑргÑтилиннÑ.
+'confirmemail_invalid' => 'БигÑргÑтии куода Ñыыһа ÑбÑÑ‚ÑÑ€ болдьоҕо ааÑпыт.',
+'confirmemail_needlogin' => '$1 - маны оҥордоххуна аадырыÑкын бигÑргÑтиÑÒ¥.',
+'confirmemail_success' => 'Электроннай аадырыһыҥ бигÑргÑтилиннÑ.
[[Special:UserLogin|Ðаккын ÑÑ‚Ñн]] Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ñххин Ñөп.',
-'confirmemail_loggedin' => 'Электроннай почтаҥ аадырыһа бигÑргÑтилиннÑ.',
-'confirmemail_error' => 'БигÑргÑтии кÑмигÑÑ€ моһол таҕыÑта.',
-'confirmemail_subject' => '{{SITENAME}}: Ñл. почта аадырыһын бигÑргÑтии',
-'confirmemail_body' => 'Ким ÑÑ€Ñ, баҕар Ñн буолуо бу IP-ттан: $1, {{SITENAME}} ÑиÑрбÑригÑÑ€
+'confirmemail_loggedin' => 'Электроннай почтаҥ аадырыһа бигÑргÑтилиннÑ.',
+'confirmemail_error' => 'БигÑргÑтии кÑмигÑÑ€ моһол таҕыÑта.',
+'confirmemail_subject' => '{{SITENAME}}: Ñл. почта аадырыһын бигÑргÑтии',
+'confirmemail_body' => 'Ким ÑÑ€Ñ, баҕар Ñн буолуо бу IP-ттан: $1, {{SITENAME}} ÑиÑрбÑригÑÑ€
«$2» диÑн ааты бÑлиÑÑ‚ÑÑÑ‚Ñ ÑƒÐ¾Ð½Ð½Ð° бу Ñлектроннай аадырыһы ыйда.
Маны ÑөбүлÑÒ»ÑÑ€ буоллаххына бу ыйынньыгы: $3 баттаан
@@ -2957,8 +3028,36 @@ $1',
Оттон бу туһунан тугу да билбÑÑ‚ буоллаххына бу ыйынньыгынан баран Ñл. почтаҕын Ñотон кÑбиÑ:
$5',
-'confirmemail_invalidated' => 'Электроннай почта аадырыһын бигÑргÑтиини Ñуох оҥоһулунна',
-'invalidateemail' => 'Эл. почта бигÑргÑÑ‚ÑÑһинин араарга',
+'confirmemail_body_changed' => 'Ким ÑÑ€Ñ (баҕар Ñн буолуо) маннык IP-ттан: $1
+бу аадырыһы «$2» диÑн {{SITENAME}} кыттаччыта бÑйÑтин Ñаҥа аадырыһын курдук ÑÑ‚Ñ‚Ñ.
+
+Бу кытааччы аата кырдьык ÑйиÑÐ½Ñ Ð±ÑƒÐ¾Ð»Ð°Ñ€Ñ‹Ð½ бигÑргÑÑ‚ÑÑ€ буоллаххына,
+уонна {{SITENAME}} Ñаайтан ÑйиÑÑ…Ñ Ñурук кÑлÑрин ÑөбүлÑÒ»ÑÑ€ буоллаххына, аллара баар ÑигÑни арый.
+
+$3
+
+Ó¨Ñкө бу аат ÑйиÑÑ…Ñ Ñыһыана Ñуох буоллаҕына, бу ÑигÑнÑн бараҥҥын,
+Ð°Ð°Ð´Ñ‹Ñ€Ñ‹Ñ Ð±Ð¸Ð³ÑргÑтиитин уурат
+
+$5
+
+БигÑргÑтии куода баччаҕа дылы болдьохтоох: $4.',
+'confirmemail_body_set' => 'Ким ÑÑ€Ñ (баҕар Ñн буолуо) маннык IP-ттан: $1
+бу аадырыһы «$2» диÑн {{SITENAME}} кыттааччыта бÑйÑтин аадырыһын курдук ÑÑ‚Ñ‚Ñ.
+
+Бу кытааччы кырдьык Эн бÑйÑÒ¥ буоларын бигÑргÑÑ‚ÑÑ€ буоллаххына,
+уонна {{SITENAME}} Ñаайтан ÑйиÑÑ…Ñ Ñурук кÑлÑрин ÑөбүлÑÒ»ÑÑ€ буоллаххына, аллара баар ÑигÑни баттаа:
+
+$3
+
+Ó¨Ñкө бу аат ÑйиÑÑ…Ñ Ñыһыана Ñуох буоллаҕына, бу ÑигÑнÑн бараҥҥын,
+Ð°Ð°Ð´Ñ‹Ñ€Ñ‹Ñ Ð±Ð¸Ð³ÑргÑтиитин уурат:
+
+$5
+
+БигÑргÑтии куода баччаҕа дылы болдьохтоох: $4.',
+'confirmemail_invalidated' => 'Электроннай почта аадырыһын бигÑргÑтиини Ñуох оҥоһулунна',
+'invalidateemail' => 'Эл. почта бигÑргÑÑ‚ÑÑһинин араарга',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki transcluding араҕыÑта]',
@@ -2998,6 +3097,7 @@ $1',
'table_pager_first' => 'БаÑтакы ÑирÑй',
'table_pager_last' => 'БүтÑһик ÑирÑй',
'table_pager_limit' => 'СирÑÐ¹Ð³Ñ Ð±Ð°Ñ‡Ñ‡Ð° $1 пууну көрдөр',
+'table_pager_limit_label' => 'СирÑÐ¹Ð³Ñ Ñуруллуу ахÑаана:',
'table_pager_limit_submit' => 'Толор',
'table_pager_empty' => 'Туох да көÑтүбÑÑ‚Ñ',
@@ -3056,6 +3156,7 @@ $1',
'version-specialpages' => 'Ðналлаах ÑирÑйдÑÑ€',
'version-parserhooks' => 'ÑинтакÑичеÑкай анализатор перехватчиктара',
'version-variables' => 'Уларыйар дааннайдар (переменнайдар)',
+'version-skins' => 'Ð¢Ð°Ñ ÐºÓ©ÑÑ‚Ò¯Ò¯ барыллара',
'version-other' => 'Ðтын',
'version-mediahandlers' => 'Медиа уларытааччылар',
'version-hooks' => 'Перехватчиктар',
@@ -3067,6 +3168,13 @@ $1',
'version-hook-subscribedby' => 'Суруттарыыта:',
'version-version' => '(Торум $1)',
'version-license' => 'ЛиÑÑиÑнзийÑ',
+'version-poweredby-credits' => "Бу биики бу движокка олоҕурар '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'атыттар',
+'version-license-info' => 'MediaWiki көҥүл тарҕанар бырагырааммаларга киирÑÑ€, кинини көмпүүтÑÑ€ Ð°Ò»Ð°Ò•Ð°Ñ Ð±Ñ‹Ñ€Ð°Ð³Ñ‹Ñ€Ð°Ð°Ð¼Ð¼Ð°Ð»Ð°Ñ€Ñ‹Ð½ пуондатын GNU General Public License уÑулуобуйатынан көҥүл тарҕатаргыт уонна/ÑбÑÑ‚ÑÑ€ уларытаргыт көҥүллÑнÑÑ€; Ð¸ÐºÐºÐ¸Ñ ÑбÑÑ‚ÑÑ€ онтон хойукку ханнык баҕарар барылыттан Ñаҕалаан.
+
+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 ÑбÑÑ‚ÑÑ€ [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html Ñаайка киирÑн ааҕыҥ].',
'version-software' => 'Туруоруллубут бырагырааммалар',
'version-software-product' => 'Бородуукта',
'version-software-version' => 'Барыл (торум)',
@@ -3136,6 +3244,15 @@ $1',
'tags-edit' => 'уларытыы',
'tags-hitcount' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
+# Special:ComparePages
+'comparepages' => 'СирÑйдÑри Ñ‚ÑҥнииргÑ',
+'compare-selector' => 'СирÑйдÑÑ€ барылларын Ñ‚ÑҥнииргÑ',
+'compare-page1' => 'БаÑтакы ÑирÑй',
+'compare-page2' => 'Ð˜ÐºÐºÐ¸Ñ ÑирÑй',
+'compare-rev1' => 'БаÑтакы барыл',
+'compare-rev2' => 'Ð˜ÐºÐºÐ¸Ñ Ð±Ð°Ñ€Ñ‹Ð»',
+'compare-submit' => 'ТÑҥнииргÑ',
+
# Database error messages
'dberr-header' => 'Бу биики туга ÑÑ€Ñ Ñатаммата',
'dberr-problems' => 'Баалаама! Бу Ñаайт техничеÑкÑй ыарахаттары көрÑүбүт.',
@@ -3152,8 +3269,13 @@ $1',
'htmlform-float-invalid' => 'Эн Ñуруйбутуҥ чыыһыла буолбатах.',
'htmlform-int-toolow' => 'Эппит чыыһылаҥ минимальнайтан кыра — $1',
'htmlform-int-toohigh' => 'Эппит чыыһылаҥ макÑимальнайтан улахан — $1',
+'htmlform-required' => 'Бу хайаан да наада',
'htmlform-submit' => 'Ыыт',
'htmlform-reset' => 'Уларытыыны төннөр',
'htmlform-selectorother-other' => 'Ðтын',
+# SQLite database support
+'sqlite-has-fts' => '$1 толору тиÑкиÑÑ‚ÑÑÑ… көрдөөһүнү өйүүр',
+'sqlite-no-fts' => '$1 толору тиÑкиÑÑ‚ÑÑÑ… көрдөөһүнү өйөөбөт',
+
);
diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php
index 1e543df6..708aeb38 100644
--- a/languages/messages/MessagesSc.php
+++ b/languages/messages/MessagesSc.php
@@ -71,8 +71,7 @@ $messages = array(
'tog-editsection' => 'Acontza setziones dae su butone [acontza]',
'tog-editsectiononrightclick' => "Abilita s'acontzu de is setziones cun dòpiu click in is tìtulos de is setziones (esigit JavaScript)",
'tog-showtoc' => "Ammustra s'ìndixe de is cuntènnidos (pro pàginas cun prus de 3 setziones)",
-'tog-rememberpassword' => 'Ammenta sa password in custu computer',
-'tog-editwidth' => 'Amànnia su box pro acontzare a sa largària màssima',
+'tog-rememberpassword' => 'Ammenta sa sessione in custu navigadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})',
'tog-watchcreations' => 'Aciungi is pàginas chi apo creadu a sa watchlist mea',
'tog-watchdefault' => 'Aciungi is pàginas chi apo acontzadu a sa watchlist mea',
'tog-watchmoves' => 'Aciungi is pàginas chi apo mòvidu a sa watchlist mea',
@@ -205,30 +204,19 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Giunghe cuntierra',
-'vector-action-delete' => 'Cantzella',
-'vector-action-move' => 'Move',
-'vector-action-protect' => 'Ampara',
-'vector-action-undelete' => 'Recùpera',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Pàgina de agiudu',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pàgina',
-'vector-namespace-media' => 'Pàgina de multimedia',
-'vector-namespace-mediawiki' => 'Messàgiu',
-'vector-namespace-project' => 'Pàgina de servìtziu',
-'vector-namespace-special' => 'Pàgina spetziale',
-'vector-namespace-talk' => 'Cuntierra',
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => 'Pàgina usuàriu',
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Acontza',
-'vector-view-history' => 'Càstia istòria',
-'vector-view-view' => 'Leghe',
-'vector-view-viewsource' => 'Càstia mitza',
-'actions' => 'Atziones',
-'namespaces' => 'Nùmene-logos',
-'variants' => 'Variantes',
+'vector-action-addsection' => 'Giunghe cuntierra',
+'vector-action-delete' => 'Cantzella',
+'vector-action-move' => 'Move',
+'vector-action-protect' => 'Ampara',
+'vector-action-undelete' => 'Recùpera',
+'vector-view-create' => 'Crea',
+'vector-view-edit' => 'Acontza',
+'vector-view-history' => 'Càstia istòria',
+'vector-view-view' => 'Leghe',
+'vector-view-viewsource' => 'Càstia mitza',
+'actions' => 'Atziones',
+'namespaces' => 'Nùmene-logos',
+'variants' => 'Variantes',
'errorpagetitle' => 'Faddina',
'returnto' => 'Torra a $1.',
@@ -284,6 +272,7 @@ $messages = array(
'jumpto' => 'Bae a:',
'jumptonavigation' => 'navigadura',
'jumptosearch' => 'chirca',
+'pool-errorunknown' => 'Faddina disconnota',
# 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' => 'A propòsitu de {{SITENAME}}',
@@ -415,7 +404,7 @@ No iscaressa de personalizare sas [[Special:Preferences|preferèntzias de {{SITE
'yourname' => 'Nùmene usuàriu',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Repite sa password:',
-'remembermypassword' => 'Ammenta sa password in custu computer',
+'remembermypassword' => 'Ammenta sa password in custu carculadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})',
'yourdomainname' => 'Spetzificare su domìniu',
'login' => 'Intra',
'nav-login-createaccount' => 'Intra / crea account',
@@ -431,6 +420,7 @@ No iscaressa de personalizare sas [[Special:Preferences|preferèntzias de {{SITE
'gotaccount' => 'Tenes giai unu account? $1.',
'gotaccountlink' => 'Identifica·ti',
'createaccountmail' => 'via e-mail',
+'createaccountreason' => 'Motivu:',
'badretype' => 'Sas passwords chi as insertau non currenspundint.',
'userexists' => 'Su nùmene usuàriu insertadu est giai impreadu.
Sèbera unu nùmene diferente.',
@@ -513,6 +503,7 @@ Pro praxere, cando dda retzis identìfica·ti torra.',
'showdiff' => 'Ammustra is mudàntzias',
'anoneditwarning' => "'''Atentzione:''' Non ses identificadu (log in).
S'indiritzu IP tuo at a èsser registradu in sa stòria de custa pàgina.",
+'anonpreviewwarning' => "''Non ses identificadu. Sarbende s'indiritzu IP tuo at a èsser registradu in sa stòria de sa pàgina.''",
'missingcommenttext' => 'Inserta unu cummentu inoghe a suta.',
'summary-preview' => 'Antiprima ogetu:',
'subject-preview' => 'Antiprima tema/tìtulu:',
@@ -616,6 +607,8 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
'revdelete-show-file-submit' => 'Eja',
'revdelete-radio-set' => 'Eja',
'revdel-restore' => 'Muda sa visibilidade',
+'revdel-restore-deleted' => 'revisiones burradas',
+'revdel-restore-visible' => 'revisiones visìbiles',
'pagehist' => 'Istòria de sa pàgina',
'deletedhist' => 'Istòria fuliada',
'revdelete-content' => 'cuntènnidu',
@@ -722,6 +715,7 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
'resultsperpage' => 'Risultati da visualizzare per pagina',
'contextlines' => 'Righe di testo da mostrare per ciascun risultato',
'contextchars' => 'Caratteri per linea',
+'stub-threshold-disabled' => 'Disativadu',
'recentchangescount' => 'Nùmeru de acontzos de amostare pro definidura:',
'savedprefs' => 'Is preferèntzias tuas sunt stadas sarbadas.',
'timezonelegend' => 'Zona de oràriu:',
@@ -821,12 +815,8 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
'recentchanges' => 'Ùrtimas mudàntzias',
'recentchanges-legend' => 'Possibilidades subra ùrtimas mudàntzias',
'recentchanges-feed-description' => 'Custu feed riportada is ùrtimas mudàntzias a is cuntènnidos de su giassu.',
-'recentchanges-label-legend' => 'Cosas de ammentare: $1.',
-'recentchanges-legend-newpage' => '$1 - pàgina noa',
'recentchanges-label-newpage' => 'Custu acontzu at creadu una pàgina noa',
-'recentchanges-legend-minor' => '$1 - acontzu minore',
'recentchanges-label-minor' => 'Custu est unu acontzu minore',
-'recentchanges-legend-bot' => '$1 - acontzu dae bot',
'recentchanges-label-bot' => 'Custu acontzu est stadu fatu dae unu bot',
'rcnote' => "Inoghe sighende {{PLURAL:$1|b'est s'ùrtima mudàntzia|bi sunt is ùrtimas '''$1''' mudàntzias}} {{PLURAL:$2|in s'ùrtima die|in is ùrtimas '''$2''' dies}}; is datos sunt agiornados a $5, $4.",
'rcnotefrom' => "Sas chi sighint sunt sas mudàntzias dae '''$2''' (fintzas a '''$1''').",
@@ -885,7 +875,6 @@ Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus b
'filesource' => 'Orìgine:',
'uploadedfiles' => 'Files carrigadus',
'badfilename' => 'Su nùmene de su file est stadu cunvertidu in "$1".',
-'successfulupload' => 'Carrigamentu acabau',
'uploadwarning' => 'Avvisu de carrigamentu',
'savefile' => 'Sarva file',
'uploadedimage' => 'carrigadu "[[$1]]"',
@@ -894,6 +883,7 @@ Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus b
'sourceurl' => 'Diretzione originària:',
'destfilename' => 'Nùmene de su file de destinatzione:',
'upload-description' => 'Descritzione de su file',
+'upload-success-subj' => 'Carrigamentu acabau',
'upload-file-error' => 'Faddina a intru',
@@ -966,7 +956,7 @@ Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus b
'doubleredirects' => 'Redirects dòpios',
'doubleredirectstext' => 'Custa pàgina cuntenet una lista de pàginas ki re-indiritzant a àteras pàginas de re-indiritzamentu.
Ogni lìnia cuntenet ligàmines a su primu e a su de duos re-indiritzamentu, aici comente sa prima lìnia de sa de duos re-indiritzamentos, chi de sòlitu adòbiat s\'artìculu "beru", a sa cale fintzas su primu re-indiritzamentu dia depet puntare.
-Is re-indiritzamentos <s>cantzellados</s> sunt stados curretos.',
+Is re-indiritzamentos <del>cantzellados</del> sunt stados curretos.',
'brokenredirects' => 'Redirects isballiaus',
'brokenredirectstext' => 'Custus redirects ligant cun pàginas chi no esistint.',
@@ -1076,10 +1066,12 @@ S'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias usuàriu
'emailsent' => 'E-mail ispedia',
'emailsenttext' => 'Sa e-mail tua est istada imbiada.',
+# User Messenger
+'usermessage-editor' => 'Missu de su sistema',
+
# Watchlist
'watchlist' => 'Sa watchlist mea',
'mywatchlist' => 'Sa watchlist mea',
-'watchlistfor' => "(pro '''$1''')",
'nowatchlist' => 'No as indicadu pàginas in sa watchlist tua.',
'watchnologin' => 'No intrau (log in)',
'watchnologintext' => 'Devi prima fare il [[Special:UserLogin|login]]
@@ -1446,9 +1438,9 @@ Podes agiùnger unu motivu in s\'ogetu de s\'acontzu.',
'nextdiff' => 'Acontzu in fatu →',
# Media information
-'file-info-size' => '($1 × $2 pixels, mannesa de su file: $3, tipu de MIME: $4)',
+'file-info-size' => '$1 × $2 pixels, mannesa de su file: $3, tipu de MIME: $4',
'file-nohires' => '<small>Non si tenent risolutziones prus artas.</small>',
-'svg-long-desc' => '(file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3)',
+'svg-long-desc' => 'file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3',
'show-big-image' => 'Versione a risolutzione arta',
'show-big-image-thumb' => '<small>Mannesa de custa antiprima: $1 × $2 pixels</small>',
diff --git a/languages/messages/MessagesScn.php b/languages/messages/MessagesScn.php
index 2dc46624..bb64cd55 100644
--- a/languages/messages/MessagesScn.php
+++ b/languages/messages/MessagesScn.php
@@ -150,8 +150,7 @@ $messages = array(
'tog-editsection' => 'Abbìlita lu canciamentu dî sezzioni tràmiti lu culligamentu [cancia]',
'tog-editsectiononrightclick' => 'Abbìlita lu canciamentu dî sezzioni tràmiti duppiu click supra lu tìtulu dâ sezzioni (richiedi Javascript)',
'tog-showtoc' => "Ammustra l'ìndici (pi artìculi cu cchiù di 3 sezzioni)",
-'tog-rememberpassword' => "Arricorda la password (richiedi l'usu di cookie)",
-'tog-editwidth' => 'Aumenta a lu màssimu la larghizza dâ casella di canciamentu',
+'tog-rememberpassword' => "Arricorda la password (richiedi l'usu di cookie) (for a maximum of $1 {{PLURAL:$1|day|days}})",
'tog-watchcreations' => "Agghiunci li pàggini criati a l'ossirvati spiciali",
'tog-watchdefault' => "Agghiunci li pàggini canciati a l'ossirvati spiciali",
'tog-watchmoves' => "Agghiunci li pàggini spustati a l'ossirvati spiciali",
@@ -296,31 +295,20 @@ $messages = array(
'faqpage' => 'Project:Dumanni comuni',
# Vector skin
-'vector-action-addsection' => 'Agghiunci argumentu',
-'vector-action-delete' => 'Elìmina',
-'vector-action-move' => 'Sposta',
-'vector-action-protect' => 'Pruteggi',
-'vector-action-undelete' => 'Riprìstina',
-'vector-action-unprotect' => 'Sblocca',
-'vector-namespace-category' => 'Catigurìa',
-'vector-namespace-help' => 'Aiutu',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pàggina',
-'vector-namespace-media' => 'File multimediali',
-'vector-namespace-mediawiki' => 'Misaggiu',
-'vector-namespace-project' => 'Pàggina di sirviziu',
-'vector-namespace-special' => 'Pàggina spiciali',
-'vector-namespace-talk' => 'Discussioni',
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => 'Utenti',
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Cancia',
-'vector-view-history' => 'Talìa a storia',
-'vector-view-view' => 'Leggi',
-'vector-view-viewsource' => 'Talìa la fonti',
-'actions' => 'Azzioni',
-'namespaces' => 'Namespace',
-'variants' => 'Varianti',
+'vector-action-addsection' => 'Agghiunci argumentu',
+'vector-action-delete' => 'Elìmina',
+'vector-action-move' => 'Sposta',
+'vector-action-protect' => 'Pruteggi',
+'vector-action-undelete' => 'Riprìstina',
+'vector-action-unprotect' => 'Sblocca',
+'vector-view-create' => 'Crea',
+'vector-view-edit' => 'Cancia',
+'vector-view-history' => 'Talìa a storia',
+'vector-view-view' => 'Leggi',
+'vector-view-viewsource' => 'Talìa la fonti',
+'actions' => 'Azzioni',
+'namespaces' => 'Namespace',
+'variants' => 'Varianti',
'errorpagetitle' => 'Erruri',
'returnto' => 'Ritorna a $1.',
@@ -379,6 +367,7 @@ $messages = array(
'view-pool-error' => "Ci spiaci, li server ni stu mumentu sunu troppu carichi. Troppi utenti stannu circannu di taliari sta pàggina. Aspetta n'anticchia prima di pruvari a ritaliari sta pàggina.
$1",
+'pool-errorunknown' => 'Erruri scanusciutu',
# 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' => 'Àutri nfurmazzioni supra {{SITENAME}}',
@@ -538,7 +527,7 @@ L'account hà statu criatu currettamenti. Nun ti scurdari di pirsunalizzari li [
'yourname' => "Lu tò nomu d'utenti (''user name'')",
'yourpassword' => "La tò ''password''",
'yourpasswordagain' => "Scrivi la password n'àutra vota",
-'remembermypassword' => "Ricòrdami la mè ''password'' duranti li sissioni.",
+'remembermypassword' => "Ricòrdami la mè ''password'' duranti li sissioni (for a maximum of $1 {{PLURAL:$1|day|days}})",
'yourdomainname' => 'Lu tò dominiu',
'externaldberror' => "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
'login' => 'Trasi',
@@ -555,6 +544,7 @@ L'account hà statu criatu currettamenti. Nun ti scurdari di pirsunalizzari li [
'gotaccount' => "Hai già nu cuntu? '''$1'''.",
'gotaccountlink' => 'Trasi',
'createaccountmail' => 'via e-mail',
+'createaccountreason' => 'Mutivu:',
'badretype' => "La ''password'' chi mittisti nun è bona.",
'userexists' => 'Lu nomu utenti nzeritu è già usatu. Ti prijamu pirciò di vuliri scègghiri nu nomu utenti diversu.',
'loginerror' => "Erruri nta l'accessu",
@@ -657,6 +647,7 @@ Pò èssiri ca ggià canciasti cu successu la tò password o c'addumannasti na n
'showlivepreview' => "Funzioni ''Live preview''",
'showdiff' => 'Ammustra li canciamenti',
'anoneditwarning' => "'''Accura''': nun hai esiquitu lu login. Lu tò ndirizzu IP veni riggistratu ntâ cronoluggìa di sta pàggina.",
+'anonpreviewwarning' => "''Nun trasisti comu utiliggaturi loggatu. Sarbannu, lu tò nnirizzu IP veni arriggistratu ntâ storia dî canciamenti.''",
'missingsummary' => "'''Accura:''' Nun hà statu spicificatu l'uggettu di stu canciamentu. Primennu di novu '''Sarva''' lu canciamentu veni sarvatu cu l'uggettu vacanti.",
'missingcommenttext' => 'Nziriri un cummentu ccà sutta.',
'missingcommentheader' => "'''Accura:''' Nun hà statu spicificatu la ntistazzioni di stu cummentu. Primennu di novu '''Sarva''' lu canciamentu veni saravtu senza ntistazzioni.",
@@ -725,7 +716,7 @@ Siddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina
'usercsspreview' => "'''Arricorda ca stai sulu visualizzannu n'antiprima dû tò CSS pirsunali.'''
'''Nun hà ancora statu sarvatu!'''",
'userjspreview' => "'''Arricorda ca stai sulu tistanno/vidennu 'n antiprima lu tò javascript pirsunali, nun hà statu ancora sarvatu!'''",
-'userinvalidcssjstitle' => "'''Accura:''' Nun esisti arcuna skin cu nomu \"\$1\". S'arricorda ca li pàggini pi li .css e .js pirsunalizzati hannu la nizziali dû tìtulu minùscula, p'asempiu {{ns:user}}:Asempiu/monobook.js e nun {{ns:user}}:Asempiu/Monobook.css.",
+'userinvalidcssjstitle' => "'''Accura:''' Nun esisti arcuna skin cu nomu \"\$1\". S'arricorda ca li pàggini pi li .css e .js pirsunalizzati hannu la nizziali dû tìtulu minùscula, p'asempiu {{ns:user}}:Asempiu/vector.js e nun {{ns:user}}:Asempiu/Vector.css.",
'updated' => '(Aggiurnatu)',
'note' => "'''Accura:'''",
'previewnote' => "'''Ricurdàtivi ca chista è sulu n'antiprima, e ca nun hà statu ancora sarvata!'''",
@@ -755,7 +746,6 @@ Primennu lu pulsanti '{{int:savearticle}}', veni sarvatu '''sulu''' lu testu cun
Vuatri prumittiti puru chi lu scrivìstivu chî vostri palori, o chi lu cupiàstivu di nu duminiu pùbbricu o di risursi sìmili
'''NUN SUTTAMITTÃŒTI MATIRIALI SUTTA COPYRIGHT SENZA PIRMISSU!'''",
'copyrightwarning2' => "Nota: tutti li cuntribbuti mannati a {{SITENAME}} ponnu èssiri mudificati o cancillati di parti di l'àutri participanti. Siddu nun addisìi ca li tò testi ponnu èssiri mudificati senza arcunu riguardu, nun mannàrili a stu situ.<br /> Cu la mannata dû testu dichiari noltri, sutta la tò rispunzabbilitati, ca lu testu hà statu scrittu di tia pirsunalmenti oppuru c'hà statu cupiatu di na fonti di pùbbricu dominiu o analucamenti lìbbira. (vidi $1 pi maiuri dittagghi) '''NUN MANNARI MATIRIALI CUPERTU DI DRITTU D'AUTURI SENZA AUTURIZZAZZIONI!'''",
-'longpagewarning' => "'''ACCURA: Sta pàggina è longa $1 kilobyte. Arcuni browser putìssiru prisintari dî prubbremi ntô canciari pàggini ca s'avvicìnanu o sùpiranu 32 kb. Pi favuri pigghia n cunzidirazzioni la pussibbilitati di suddivìdiri la pàggina n sizzioni cchiù nichi.'''",
'longpageerror' => "'''ERRURI: Lu testu ca hai suttamissu è longu $1 kilobyte, ch'è cchiù dû màssimu di $2 kilobyte. Nun pò èssiri sarvatu.'''",
'readonlywarning' => "'''ACCURA: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu. La cosa megghia è fari un copia e ncolla dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database è accissìbbili.'''
@@ -1080,6 +1070,7 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'contextlines' => 'Righi di testu pi ognunu risurtatu:',
'contextchars' => 'Nùmmaru di caràttiri di cuntestu:',
'stub-threshold' => 'Valuri minimu pî <a href="#" class="stub">liami a li stub</a>:',
+'stub-threshold-disabled' => 'Disabbìlitatu',
'recentchangesdays' => "Nùmmuru di jorna a ammustrari nte l'urtimi cancaiamenti:",
'recentchangesdays-max' => '(màssimu $1 {{PLURAL:$1|jornu|jorna}})',
'recentchangescount' => 'Nùmmiru di canciamenti da ammustrari di default:',
@@ -1146,7 +1137,7 @@ L'operazioni nun pò èssiri annullata.",
'prefs-advancedrendering' => 'Opzioni avanzati',
'prefs-advancedsearchoptions' => 'Opzioni avanzati',
'prefs-advancedwatchlist' => 'Opzioni avanzati',
-'prefs-display' => 'Opzioni di visualizzazioni',
+'prefs-displayrc' => 'Opzioni di visualizzazioni',
'prefs-diffs' => 'Diffirenzi',
# User rights
@@ -1252,7 +1243,6 @@ L'operazioni nun pò èssiri annullata.",
'right-siteadmin' => 'Blocca a sblocca lu databasi',
'right-reset-passwords' => 'Reimposta la password di autri utenti',
'right-override-export-depth' => 'Esporta pàggini cumpresi li pàggini culligati finu ô quintu liveddu',
-'right-versiondetail' => 'Talìa li informazioni cumpleti dô software',
# User rights log
'rightslog' => "Dritti di l'utenti",
@@ -1302,14 +1292,9 @@ L'operazioni nun pò èssiri annullata.",
'recentchanges-legend' => 'Opzioni ùrtimi canciamenti',
'recentchangestext' => 'Chista pàggina prisenta li canci cchiù ricenti ê cuntinuti dô situ.',
'recentchanges-feed-description' => 'Stu feed riporta li canciamenti cchiù ricenti a li cuntinuti dû situ.',
-'recentchanges-label-legend' => 'Liggenda: $1.',
-'recentchanges-legend-newpage' => '$1 - pàggina nova',
'recentchanges-label-newpage' => 'This edit havi creatu na nova pàggina',
-'recentchanges-legend-minor' => '$1 - canciamentu nicu',
'recentchanges-label-minor' => 'Chista è nu canciamentu nnicu',
-'recentchanges-legend-bot' => '$1 - canciamentu dô bot',
'recentchanges-label-bot' => 'Stu canciamentu fu fattu dû bot',
-'recentchanges-legend-unpatrolled' => '$1 - canciamentu nun virificatu',
'recentchanges-label-unpatrolled' => 'Stu canciamentu nun havi ancora statu virificatu',
'rcnote' => "Ccà sutta {{PLURAL:$1|c'è lu canciamentu cchiù ricenti appurtatu|cci sunnu l'ùrtimi '''$1''' canciamenti appurtati}} ô situ {{PLURAL:$2|nta l'ùrtimi 24 uri|nta l'ùrtimi '''$2''' giorni}}; li dati sunnu aggiurnati ê $5 dû $4.",
'rcnotefrom' => 'Ccà sutta cci sunnu li canciamenti a pàrtiri dû <b>$2</b> (ammustrati nzinu ô <b>$1</b>).',
@@ -1384,6 +1369,7 @@ Pi nziriri nu file nta na pàggina, fai nu lijami accussì:
'filetype-unwanted-type' => "Caricari file di tipu '''\".\$1\"''' è scunsigghiatu. {{PLURAL:\$3|Lu tipu di file cunsigghiatu è|Li tipi di file cunsigghiati sunnu}} \$2.",
'filetype-banned-type' => "Caricari file di tipu '''\".\$1\"''' non è cunzintitu. {{PLURAL:\$3|Lu tipu di file cunzintitu è|Li tipi di file cunzintiti sunnu}} \$2.",
'filetype-missing' => 'Lu file è privu d\'estinzioni (p\'asèmpiu ".jpg").',
+'unknown-error' => 'Ci fù un erruri scanusciutu',
'large-file' => 'Si raccumanna di nun supirari li diminzioni di $1 pi ognunu file; stu file è granni $2.',
'largefileserver' => 'Lu file sùpira li diminzioni cunzintiti dâ cunfigurazzioni dû server.',
'emptyfile' => "Lu file appena carricatu pari èssiri vacanti. Chistu putissi èssiri duvutu a n'erruri ntô nomu dû file. Virificari ca si ntenni riarmenti carricari stu file.",
@@ -1404,7 +1390,6 @@ Siddu si disponi dâ mmàggini ntâ risuluzzioni urigginali, si prega di carricÃ
'fileexists-shared-forbidden' => "Nu file cu stu nomu asisti già nta l'archiviu dî risursi multimidiali cundivisi. Siddu voi ancora carricari lu file, pi favuri torna n'arreri e cancia lu nomu ca voi dari a lu file. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Stu file è na copia duppiuni {{PLURAL:$1|dû|dî}} file ccà di sècutu:',
'file-deleted-duplicate' => "Nu file lu stissu comu a chistu file ([[:$1]]) vinni scanciallatu prima di ora. S'aviss'a cuntrullari la stòria e lu picchì dâ scancillazzioni dû file prima di ri-caricàrilu.",
-'successfulupload' => 'Carricamentu cumplitatu',
'uploadwarning' => 'Avvisu di Upload',
'uploadwarning-text' => 'Cancia cà sutta la discrizzioni di lu file e prova arré',
'savefile' => 'Sarva file',
@@ -1439,6 +1424,7 @@ JD # Jenoptik
MGP # Pentax
PICT # arcuni
#</pre> <!-- dassa sta lìnia comu è già -->',
+'upload-success-subj' => 'Carricamentu cumplitatu',
'upload-proto-error' => 'Protucollu erratu',
'upload-proto-error-text' => "Pi l'upload rimotu è nicissariu spicificari URL ca nìzzianu cu <code>http://</code> oppuru <code>ftp://</code>.",
@@ -1584,7 +1570,6 @@ Appressu veni ammustrata la discrizioni prisenti nâ [$2 paggina di discrizzioni
'statistics-edits-average' => 'Media dî canci pi pàggina',
'statistics-views-total' => 'Visualizzazioni totali',
'statistics-views-peredit' => 'Visualizzazioni pî canci',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Cuda dî prucessi] a esiquiri n background',
'statistics-users' => '[[Special:ListUsers|Utilizzatura]] riggistrati',
'statistics-users-active' => 'Utilizzatura attivi',
'statistics-users-active-desc' => "Utilizzatura chi fìciru n'azzioni {{PLURAL:$1|ni l'ultimu ionnu|nî l'ultimi $1 ionna}}",
@@ -1596,9 +1581,9 @@ Appressu veni ammustrata la discrizioni prisenti nâ [$2 paggina di discrizzioni
Vèninu cunzidirati pàggini di disambiguazzioni tutti chiddi ca cuntèninu li template alincati 'n [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Rinnirizzamenti duppi',
-'doubleredirectstext' => 'Chista pàggina alenca li pàggini chi rinnirìzzanu a àutri pàggini di rinnirizzamentu.
+'doubleredirectstext' => 'Chista pàggina alenca li pàggini chi rinnirìzzanu a àutri pàggini di rinnirizzamentu.
Ognuna riga cunteni li culligamenti a lu primu e a lu secunnu redirect, oltri â prima riga di testu dû secunnu redirect ca di sòlitu cunteni la pàggina di distinazzioni "curretta" â quali avissi a puntari macari lu primu redirect.
-Li redirect <s>cancillati</s> furunu curretti.',
+Li redirect <del>cancillati</del> furunu curretti.',
'double-redirect-fixed-move' => "[[$1]] fu spustata 'n modu automàticu, ora è nu redirect a [[$2]]",
'double-redirect-fixer' => 'Curritturi di redirect',
@@ -1801,7 +1786,6 @@ Protucolli suppurtati: <tt>$1</tt>',
# Watchlist
'watchlist' => 'Lista taliata mia',
'mywatchlist' => 'Lista taliata mia',
-'watchlistfor' => "(di l'utenti '''$1''')",
'nowatchlist' => "Nun hai innicatu pàggini a tèniri d'occhiu.",
'watchlistanontext' => "Pi visualizzari e canciari l'alencu di l'ossirvati spiciali è nicissariu $1.",
'watchnologin' => 'Nun hai effittuatu lu login',
@@ -1909,7 +1893,9 @@ Lu canciamentu cchiù ricenti â pàggina fu appurtata di [[User:$3|$3]] ([[User
'editcomment' => "Â discrizzioni â mudìfica era: \"''\$1''\".",
'revertpage' => "Canciu narrè di [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussioni]]) cu l'ùrtima virsioni di [[User:$1|$1]]",
'rollback-success' => 'Annullati li canciamenti di $1; ritornata â virsioni pricidenti di $2.',
-'sessionfailure' => 'S\'hà virificatu un prubbrema cu la tò sissioni di login;
+
+# Edit tokens
+'sessionfailure' => 'S\'hà virificatu un prubbrema cu la tò sissioni di login;
lu sistema nun hà esiquitu lu cumannu mpartitu pi pricauzzioni.
Pi favuri utilizza lu tastu "\'n arreri" dû tò browser, ricàrrica la pàggina e riprova di novu.',
@@ -2098,7 +2084,6 @@ Pi maggiuri nfurmazzioni, talìa la [[Special:IPBlockList|lista di l'IP bluccati
'ipb-edit-dropdown' => 'Mutivi pô bloccu',
'ipb-unblock-addr' => 'Sblocca $1',
'ipb-unblock' => "Sblocca n'utenti o nu ndirizzu IP",
-'ipb-blocklist-addr' => 'Alenca li blocchi attivi pi $1',
'ipb-blocklist' => 'Alenca li blocchi attivi',
'ipb-blocklist-contribs' => 'Cuntribbuti di $1',
'unblockip' => 'Sblocca ndirizzu IP',
@@ -2402,6 +2387,7 @@ Visita [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [ht
'tooltip-upload' => 'Ncigna carricamentu',
'tooltip-rollback' => '"Rollback" annulla li canci di l\'ùrtinu cuntribbuturi â sta pâggina cu nu sulu clic.',
'tooltip-undo' => '"Annulla" pirmetti di annullari sta mudìfica e grapi lu mòdulu di mudifica ntâ mudalità di antiprima. Pirmetti di nsiriri na mutivazziopni nti l\'uggettu dâ mudifica.',
+'tooltip-preferences-save' => 'Sarva prifirenzi',
# Stylesheets
'common.css' => "/* Li stili CSS nziriti ccà s'àpplicanu a tutti li skin */",
@@ -2510,10 +2496,10 @@ $1',
'imagemaxsize' => "Diminzioni màssima dî mmàggini:<br />''(pi li pàggini di discrizzioni dô file)''",
'thumbsize' => 'Grannizza dî miniaturi:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pàggina|pàggini}}',
-'file-info' => '(Diminzioni: $1, tipu MIME: $2)',
-'file-info-size' => '($1 × $2 pixel, diminzioni: $3, tipu MIME: $4)',
+'file-info' => 'Diminzioni: $1, tipu MIME: $2',
+'file-info-size' => '$1 × $2 pixel, diminzioni: $3, tipu MIME: $4',
'file-nohires' => '<small>Nun sunnu dispunìbbili virsioni a risuluzzioni cchiù elivata.</small>',
-'svg-long-desc' => '(file SVG, dimensioni nominali $1 × $2 pixel, dimensioni dô file: $3)',
+'svg-long-desc' => 'file SVG, dimensioni nominali $1 × $2 pixel, dimensioni dô file: $3',
'show-big-image' => 'Virsioni a àuta risuluzzioni',
'show-big-image-thumb' => "<small>Diminzioni di st'antiprima: $1 × $2 pixel</small>",
'file-info-gif-looped' => 'luppatu',
diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php
index e9a89e92..1a5f1ba6 100644
--- a/languages/messages/MessagesSco.php
+++ b/languages/messages/MessagesSco.php
@@ -37,8 +37,7 @@ $messages = array(
'tog-editsection' => 'Enable section editin via [edit] airtins',
'tog-editsectiononrightclick' => 'Enable section editin bi richt-dabbin on section teitles (JavaScript)',
'tog-showtoc' => 'Shaw table o contents (for pages wi mair nor 3 heidins)',
-'tog-rememberpassword' => 'Mynd password ower sessions',
-'tog-editwidth' => 'Edit box haes fou weenth',
+'tog-rememberpassword' => 'Mynd password ower sessions (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Add pages ye mak tar yer watchleet',
'tog-watchdefault' => 'Add pages ye edit tae yer watchleet',
'tog-watchmoves' => 'Eik pages A move tae ma watchleet',
@@ -176,21 +175,15 @@ $messages = array(
'faqpage' => 'Project:ASQ',
# Vector skin
-'vector-action-delete' => 'Delete',
-'vector-action-move' => 'Flit',
-'vector-action-protect' => 'Fend',
-'vector-namespace-category' => 'Category',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Page',
-'vector-namespace-mediawiki' => 'Message',
-'vector-namespace-template' => 'Template',
-'vector-namespace-user' => 'Uiser page',
-'vector-view-create' => 'Mak',
-'vector-view-edit' => 'Edit',
-'vector-view-history' => 'See history',
-'vector-view-viewsource' => 'View soorce',
-'actions' => 'Actions',
-'namespaces' => 'Namespaces',
+'vector-action-delete' => 'Delete',
+'vector-action-move' => 'Flit',
+'vector-action-protect' => 'Fend',
+'vector-view-create' => 'Mak',
+'vector-view-edit' => 'Edit',
+'vector-view-history' => 'See history',
+'vector-view-viewsource' => 'View soorce',
+'actions' => 'Actions',
+'namespaces' => 'Namespaces',
'errorpagetitle' => 'Error',
'returnto' => 'Return tae $1.',
@@ -393,7 +386,7 @@ Mynd an chynge yer [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Yer uiser name',
'yourpassword' => 'Passwaird:',
'yourpasswordagain' => 'Retype passwaird:',
-'remembermypassword' => 'Mynd ma password across sessions.',
+'remembermypassword' => 'Mynd ma password across sessions (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Yer domain:',
'externaldberror' => "Aither the wis an external authenteication database mishanter, or ye'r no alloued tae update yer external accoont.",
'login' => 'Log in',
@@ -565,7 +558,7 @@ Yer block ID is $5. Please include this ID in ony argies ye mak.',
'userjsyoucanpreview' => "'''Tip:''' Uise the 'Show preview' button tae proof yer new JS afore savin.",
'usercsspreview' => "'''Mynd that ye'r juist previewin yer uiser CSS, it haesna yet been hained!'''",
'userjspreview' => "'''Mynd that ye're juist testin/previewing yer uiser JavaScript; it haesna been hained yet!'''",
-'userinvalidcssjstitle' => "'''Warnin:''' There isnae a skin \"\$1\". Mynd that yer ain .css an .js pages uise a lowercase teetle, e.g. {{ns:user}}:Foo/monobook.css instead o {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Warnin:''' There isnae a skin \"\$1\". Mynd that yer ain .css an .js pages uise a lowercase teetle, e.g. {{ns:user}}:Foo/vector.css instead o {{ns:user}}:Foo/Vector.css.",
'updated' => '(Updatit)',
'note' => "'''Mynd:'''",
'previewnote' => "'''Mynd that this is juist a scance-ower, an haesna been hained yet!'''",
@@ -600,7 +593,6 @@ Gin ye dinna want yer writin tae be editit athoot mercy and redistribute at will
YYe'r promisin us forbye that ye wrat this yersel, or copied it frae a
public domain or siclike free resoorce (see $1 for details).
'''DINNA SUBMIT COPYRICHTIT WARK ATHOOT PERMEISSION!'''",
-'longpagewarning' => "WARNIN: This page is $1 kilobytes lang; some brousers micht hae trouble editin pages approachin or langer nor 32 kb. Please conseider brakkin the page intae smaa'er sections.",
'longpageerror' => "'''ERROR: The text ye hae submitted is $1 kilobytes
lang, an that's langer than the maximum of $2 kilobytes. It canna be hained.'''",
'readonlywarning' => "WARNIN: The database haes been lockit for maintenance, sae ye'll no can hain yer edits richt nou. Ye micht wish tae cut-n-paste the text intil a text file an hain it for later.",
@@ -751,6 +743,7 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
'resultsperpage' => 'Hits tae shaw per page',
'contextlines' => 'Lines tae shaw per hit',
'contextchars' => 'Characters o context per line',
+'stub-threshold-disabled' => 'Tuckie',
'recentchangescount' => 'Nummer o teitles in recent chynges',
'savedprefs' => 'Yer preferences haes been hained.',
'timezoneoffset' => 'Affset',
@@ -1347,7 +1340,7 @@ In the saicont case ye can uise an airtin forbye, for exemplar [[{{#Special:Expo
# Media information
'mediawarning' => "'''Warnin''': This file micht haud mislushious code; bi executin it yer seestem micht be compromised.",
'imagemaxsize' => 'Limit eimages on eimage description pages tae:',
-'file-info-size' => '($1 × $2 pixels, file size: $3, MIME type: $4)',
+'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
# Special:NewFiles
'newimages' => 'Gallery o new files',
diff --git a/languages/messages/MessagesSd.php b/languages/messages/MessagesSd.php
index 74a0cfcf..2a4ec705 100644
--- a/languages/messages/MessagesSd.php
+++ b/languages/messages/MessagesSd.php
@@ -253,24 +253,13 @@ $messages = array(
'faqpage' => 'Project:ڪپوس',
# Vector skin
-'vector-action-delete' => 'ڊاھيو',
-'vector-action-move' => 'چوريو',
-'vector-action-protect' => 'تحÙظيو',
-'vector-action-unprotect' => 'اڻتحÙظيو',
-'vector-namespace-category' => 'زمرو',
-'vector-namespace-help' => 'امدادي صÙحو',
-'vector-namespace-image' => 'Ùائيل',
-'vector-namespace-main' => 'صÙحو',
-'vector-namespace-media' => 'ذريعاتي صÙحو',
-'vector-namespace-mediawiki' => 'نياپو',
-'vector-namespace-project' => 'رٿائي صÙحو',
-'vector-namespace-special' => 'خاص صÙحو',
-'vector-namespace-talk' => 'بحث',
-'vector-namespace-template' => 'سانچو',
-'vector-namespace-user' => 'تعارÙÙŠ صÙحو',
-'vector-view-create' => 'سرجيو',
-'vector-view-edit' => 'سنواريو',
-'vector-view-viewsource' => 'ÚªÙˆÚŠ Úسو',
+'vector-action-delete' => 'ڊاھيو',
+'vector-action-move' => 'چوريو',
+'vector-action-protect' => 'تحÙظيو',
+'vector-action-unprotect' => 'اڻتحÙظيو',
+'vector-view-create' => 'سرجيو',
+'vector-view-edit' => 'سنواريو',
+'vector-view-viewsource' => 'ÚªÙˆÚŠ Úسو',
'errorpagetitle' => 'Ú†ÙÚªÙŽ',
'returnto' => '$1 Úانهن وَرو.',
@@ -402,7 +391,7 @@ $messages = array(
# Login and logout pages
'yourname' => 'ÙŠÙوزرنانءÙ:',
'yourpassword' => 'ڳجھو Ù„Ùظ:',
-'remembermypassword' => 'هن ڳڻپيوڪر تي مون کي ياد رکو',
+'remembermypassword' => 'هن ڳڻپيوڪر تي مون کي ياد رکو (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'لاگ اÙÙ†',
'nav-login-createaccount' => 'لاگ اÙÙ† ٿيو / کاتو کوليو',
'loginprompt' => '{{SITENAME}} Û¾ لاگ اÙÙ† ٿيڻ لاء٠ڪوڪيز جي قبوليت لازمي آهي.',
@@ -493,7 +482,6 @@ $messages = array(
'copyrightwarning' => "ياد رکندا ته {{SITENAME}} لاء٠سموريون ڀاڱيداريون $2 تحت پڌريون ڪجن ٿيون (تÙصيلن لاء٠$1 Úسندا). اوهان جي تحرير Ú©ÙŠ {{SITENAME}} جي قائدن تحت ترميمي سگهجي ٿو. جيڪÚهن اوهان نه ٿا چاهيو ته اوهان جي لکڻين Ú©ÙŠ بي رحميءَ سان ترميميو ÙˆÚƒÙŠ يا ورهائي عام ڪيو ÙˆÚƒÙŠ ته پوء٠پنهنجي Ù„Ú©Ú»ÙŠ هتي جمع نه ڪرايو. پنهنجو مواد هتي جمع ڪرڻ جو مطلب هوندو ته توهان Ú©ÙŠ جمع ڪرايل مواد جي Ù…Ùت Ùراهمي Û½ Ú©Ùليل تبديليءَ تي ÚªÙˆ به اعتراز ناهي.<br />
توهان اهڙي Ù¾Úª ÚÙŠÚ» جا پابند Ù¾Ú» آهيو ته توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن Ù…Ùت وسيلي تان ڪاپي ڪيو آهي.
'''تحÙظيل حق Û½ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ کان سواء٠هتي جمع نه ڪريو.'''",
-'longpagewarning' => "'''خبردار: هيء٠صÙحو $1 ڪلوٻاٽڻيون ÙˆÚÙˆ آهي؛ 32 ڪلوٻاٽڻين کان ÙˆÚا صÙحا سنواريندي ÚªÙ† جھانگوئن سان مسئلا ٿين ٿا. مهرباني ڪري هن صÙحي Ú©ÙŠ ننÚÙ† سيڪشنز Û¾ ٽوڙڻ تي ويچاريندا.'''",
'templatesused' => 'هن صÙحي تي استعمال ٿيندڙ سانچا:',
'templatesusedpreview' => 'هن پيش نگاهه ۾ استعمال ٿيل سانچا:',
'template-protected' => '(تحÙظيل)',
@@ -715,7 +703,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
# Watchlist
'watchlist' => 'منهنجي ٽيٽ Ùهرست',
'mywatchlist' => 'منهنجي ٽيٽ Ùهرست',
-'watchlistfor' => "(براء٠'''$1''')",
'addedwatch' => 'ٽيٽ Ùھرست Û¾ شامل ڪيو ويو.',
'addedwatchtext' => "صÙحو بعنوان \"[[:\$1]]\" اوهان جي [[Special:Watchlist|ٽيٽ Ùهرست]] Û¾ شامل ٿي ويو. استقبالي تبديليون هتي درج ٿينديون وينديون. اهو صÙحو [[Special:RecentChanges|تازين تبديلين]] واري صÙحي تي '''گهرن''' اکرن Û¾ نمايان ڪري Úيکاريو ويندو. جيڪÚهن اوهان اهو سڀ نه ٿا چاهيو ته '''اڻ ٽيٽيو''' تي ÚªÙ„Úª ڪريو.",
'removedwatch' => 'ٽيٽ Ùهرست مان هٽايو ويو',
@@ -918,9 +905,9 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
'nextdiff' => 'نئون تÙاوت -->',
# Media information
-'file-info-size' => '($1 × $2 عڪسلون، Ùائيل سائيز: $3ØŒ MIME ٽائيپ: $4)',
+'file-info-size' => '$1 × $2 عڪسلون، Ùائيل سائيز: $3ØŒ MIME ٽائيپ: $4',
'file-nohires' => '<small>اڃا سنهو تحلل ميسر ناهي.</small>',
-'svg-long-desc' => '(ايس وي جي Ùائيل، اٽڪل $1 × $2 عڪسلون، Ùائيل سائيز: $3)',
+'svg-long-desc' => 'ايس وي جي Ùائيل، اٽڪل $1 × $2 عڪسلون، Ùائيل سائيز: $3',
'show-big-image' => 'سنهو ترين تحلل',
'show-big-image-thumb' => '<small>هن پيش نگاهه جي ماپ: $1 × $2 عڪسلون</small>',
diff --git a/languages/messages/MessagesSdc.php b/languages/messages/MessagesSdc.php
index 466f33ff..991b312a 100644
--- a/languages/messages/MessagesSdc.php
+++ b/languages/messages/MessagesSdc.php
@@ -118,8 +118,7 @@ $messages = array(
'tog-editsection' => 'Mudìfigga di li sezzioni attrabessu lu cullegamentu [mudifigga]',
'tog-editsectiononrightclick' => "Mudìfigga di li sezzioni attrabessu lu clic dresthu i' lu tìturu (nezzessàriu JavaScript)",
'tog-showtoc' => "Musthra l'indizi pa li pàgini cun più di 3 sezzioni",
-'tog-rememberpassword' => "Ammenta la paràura d'órdhini (nezzessàriu azzittà li cookie)",
-'tog-editwidth' => 'Aumenta a la massima larghèzia la casella di mudìfigga',
+'tog-rememberpassword' => "Ammenta la paràura d'órdhini (nezzessàriu azzittà li cookie) (for a maximum of $1 {{PLURAL:$1|day|days}})",
'tog-watchcreations' => "Aggiungi li pàgini criaddi a l'abbaidaddi ippiziari",
'tog-watchdefault' => "Aggiungi li pàgini mudìfiggaddi a l'abbaidaddi ippiziari",
'tog-watchmoves' => "Aggiungi li pàgini ippusthaddi a l'abbaidaddi ippiziari",
@@ -249,15 +248,11 @@ Li sighenti cullegamenti so in linga ingrese:
'faqpage' => 'Project:FAQ (infuimmazioni e aggiuddu)',
# Vector skin
-'vector-action-delete' => 'Canzella',
-'vector-action-move' => 'Ippustha',
-'vector-namespace-category' => 'Categuria',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pàgina',
-'vector-namespace-talk' => 'Dischussioni',
-'vector-view-create' => 'Cria',
-'vector-view-edit' => 'Mudifigga',
-'vector-view-view' => 'Leggi',
+'vector-action-delete' => 'Canzella',
+'vector-action-move' => 'Ippustha',
+'vector-view-create' => 'Cria',
+'vector-view-edit' => 'Mudifigga',
+'vector-view-view' => 'Leggi',
'errorpagetitle' => 'Errori',
'returnto' => 'Turra a $1.',
@@ -462,7 +457,7 @@ La registhrazioni è isthadda criadda currettamenti. No dimintiggà di passunari
'yourname' => 'Innòmu utenti',
'yourpassword' => "Paràura d'órdhini",
'yourpasswordagain' => "Ripeti la paràura d'órdhini",
-'remembermypassword' => "Ammenta la paràura d'órdhini",
+'remembermypassword' => "Ammenta la paràura d'órdhini (for a maximum of $1 {{PLURAL:$1|day|days}})",
'yourdomainname' => 'Ippizzificà lu dumìniu',
'externaldberror' => "S'è verifiggaddu un errori cu lu server di autentificazioni esthernu, oppuru nò si diponi di l'autorizazioni nezzessàri pa aggiornà la propria registhrazioni estherna.",
'login' => 'Intra',
@@ -633,7 +628,7 @@ S'ài sighiddu lu cullegamentu pa un'errori, è suffizenti incalchà lu buttoni
'userjsyoucanpreview' => "'''Suggerimentu:''' Usa lu buttoni '''Visuarizza antiprimma''' pa prubà li nobi JS primma di sàivvaddi.",
'usercsspreview' => "'''Ammitanti ch'è soru un'antiprimma di lu propriu CSS passunari; li mudìfigghi nò so ancora isthaddi sàivvaddi!'''",
'userjspreview' => "'''Ammitanti ch'è soru un'antiprimma pa prubà lu propriu JavaScript passunari; li mudìfigghi nò so ancora isthaddi sàivvaddi!'''",
-'userinvalidcssjstitle' => "'''Attinzioni:''' Nò isisthi nisciun aipettu gràficu \"\$1\". Amminta chi li pàgini pa li .css e .js passunari àni lu primu caràtteri di lu tìturu minori, cumenti {{ns:user}}:Foo/monobook.css e nò {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Attinzioni:''' Nò isisthi nisciun aipettu gràficu \"\$1\". Amminta chi li pàgini pa li .css e .js passunari àni lu primu caràtteri di lu tìturu minori, cumenti {{ns:user}}:Foo/vector.css e nò {{ns:user}}:Foo/Vector.css.",
'updated' => '(Aggiornaddu)',
'note' => "'''NOTA:'''",
'previewnote' => "'''Attinzioni: chistha è soru un'antiprimma. Li mudifigghi a la pagina NÒ so ancora isthaddi saivvaddi!'''",
@@ -667,7 +662,6 @@ Inviendi lu testhu ài la ripunsabiriddai chi lu testhu sia toiu oppuru sia i lu
Inviendi lu testhu ài la ripunsabiriddai chi lu testhu sia toiu oppuru sia i lu pùbbriggu dumìniu (vedi $1 pa maggiori dettàgli).
'''NÒ INVIÀ MATERIARI CUBERTHU DA DIRITTU D'AUTORI CHENA AUTORIZZAZIONI!'''",
-'longpagewarning' => "'''ATTINZIONI: Chistha pàgina è longa $1 kilobyte; zerthuni nabiggadori pudiani abé dei prubremi. Si pussìbiri suddibidì la pàgina in sezzioni o sottupàgini minori.'''",
'longpageerror' => "'''ERRORI: Lu testhu ch'ài inviaddu è longu $1 kB (kilobytes), più di la misura massima cunsintidda di $2 kB. Lu testhu nò pò assé sàivvaddu.'''",
'readonlywarning' => "'''ATTINZIONI: La bancadati è isthadda broccadda pa manutinzioni, dunca abà è impussìbiri saivvà li mudìfigghi. Pa no pirdhilli, copia lu testhu mudifiggaddu in un file i' lu to' elaburaddori e torra a saivvallu candu la bancadati sarà ibbruccadda.'''",
'protectedpagewarning' => "'''ATTINZIONI: Chista pàgina è isthadda broccadda parchì soru l'utenti cun pribiréggi di amministhradori possiano mudìfiggarla.'''",
@@ -1052,7 +1046,6 @@ S'è la matessi immàgina, i' li misuri originari, nò è nezzessàriu carriggà
Si si diponi di l'immàgina i' la risoruzioni originari, pa piazeri carriggalla. A l'invessu, pa piazeri ciambà l'innòmmu di lu file.",
'fileexists-forbidden' => "Un file cun chisthu innòmmu isisthi già. Turrà indareddu e mudìfiggà l'innòmmu cu' lu quari carriggà lu file. [[File:$1|thumb|center|$1]]",
'fileexists-shared-forbidden' => "Un file cun chisthu innòmmu isisthi già i l'archìbiu di li risuzzi mùrthimediari cundibisi. Turrà indareddu e mudìfiggà l'innòmmu cu' lu quari carriggà lu file. [[File:$1|thumb|center|$1]]",
-'successfulupload' => 'Carriggamentu cumpritaddu',
'uploadwarning' => 'Avvisu di carriggamentu',
'savefile' => 'Saivva file',
'uploadedimage' => 'ha carriggaddu "[[$1]]"',
@@ -1069,6 +1062,7 @@ Si si diponi di l'immàgina i' la risoruzioni originari, pa piazeri carriggalla.
Pa piazeri verifigga si vói carriggà avveru chisthu file; inogghi v'è lu rigisthru cu' la mutibazioni di la canzilladdura:",
'filename-bad-prefix' => "L'innòmmu di lu file chi sei carrigghendi ischumenza cun '''\"\$1\"''', ch'è un'innòmmu nò dischrittibu assignaddu automatiggamenti da li fotocameri. Pa piazieri sciubarà un'innòmmu più dischrittibu pa lu file tóiu.",
+'upload-success-subj' => 'Carriggamentu cumpritaddu',
'upload-proto-error' => 'Protocollu ibbagliaddu',
'upload-proto-error-text' => 'Pa lu cariggamentu "luntanu" è nezzessàriu ippizzificà indirizzi ch\'ischumenzani cun <code>http://</code> oppuru <code>ftp://</code>.',
@@ -1317,7 +1311,6 @@ Also see [[Special:WantedCategories|wanted categories]].",
# Watchlist
'watchlist' => 'Abbaidaddi ippiziari',
'mywatchlist' => 'Abbaidaddi ippiziari',
-'watchlistfor' => "(pa '''$1''')",
'nowatchlist' => "La listha di l'abbaidaddi ippiziari è biodda.",
'watchlistanontext' => "Pa visuarizzà e mudìfiggà l'erencu di l'abbaidaddi ippiziari è nezzessàriu $1.",
'watchnologin' => 'Intradda nò effettuadda',
@@ -1422,7 +1415,9 @@ Pa piazzeri, cunfèimma chi vói canzillà avveru, ch'ài cumpresu li cunsiguèn
'cantrollback' => "Impussìbiri annullà li mudìfigghi; l'utenti chi n'è l'autori è l'unicu cuntribudori di la pàgina.",
'editcomment' => "L'oggettu di la mudìfigga era: \"''\$1''\".",
'rollback-success' => 'Annulladdi li mudìfigghi di $1; turradda a la versioni prizzidenti di $2.',
-'sessionfailure' => "S'è verifigaddu un probrema i' la sissioni ch'identifigga l'intradda; lu sistham nò à eseguiddu lu cumandu imparthiddu pa precauzioni. Turrà a la pàgina prizzidenti cu' lu buttoni \"Indareddu\" di lu proprio nabigaddori, turrà a carriggà la pàgina e riprubà.",
+
+# Edit tokens
+'sessionfailure' => "S'è verifigaddu un probrema i' la sissioni ch'identifigga l'intradda; lu sistham nò à eseguiddu lu cumandu imparthiddu pa precauzioni. Turrà a la pàgina prizzidenti cu' lu buttoni \"Indareddu\" di lu proprio nabigaddori, turrà a carriggà la pàgina e riprubà.",
# Protect
'protectlogpage' => 'Prutizioni',
@@ -1565,7 +1560,6 @@ $1",
'ipb-edit-dropdown' => 'Mutibi pa lu broccu',
'ipb-unblock-addr' => 'Ibbrucca $1',
'ipb-unblock' => "Ibbrucca un'utenti o un'indirizzu IP",
-'ipb-blocklist-addr' => 'Erenca i brocchi attibi pa $1',
'ipb-blocklist' => 'Erenca i brocchi attibi',
'unblockip' => "Ibbrucca l'utenti",
'unblockiptext' => "Usà lu mòdulu in giossu pa turrà l'intradda i'ischrittura a un'utenti o indirizzu IP broccaddu.",
@@ -1895,9 +1889,9 @@ $1",
'thumbsize' => 'Mannària di li miniadduri:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pàgina|pàgini}}',
'file-info' => 'Misuri: $1, tipu MIME: $2',
-'file-info-size' => '($1 × $2 punti, misuri: $3, tipu MIME: $4)',
+'file-info-size' => '$1 × $2 punti, misuri: $3, tipu MIME: $4',
'file-nohires' => '<small>Nò so dipunìbiri versioni a risoruzioni maggiori.</small>',
-'svg-long-desc' => '(file in fuimmaddu SVG, misuri nominari $1 × $2 punti, misuri di lu file: $3)',
+'svg-long-desc' => 'file in fuimmaddu SVG, misuri nominari $1 × $2 punti, misuri di lu file: $3',
'show-big-image' => 'Versioni a altha risoruzioni',
'show-big-image-thumb' => "<small>Misuri di chisth'antiprimma: $1 × $2 punti</small>",
diff --git a/languages/messages/MessagesSe.php b/languages/messages/MessagesSe.php
index 8c6e7502..73a9cb4f 100644
--- a/languages/messages/MessagesSe.php
+++ b/languages/messages/MessagesSe.php
@@ -27,8 +27,7 @@ $messages = array(
'tog-editsection' => 'Čájet rievdadanliŋkkaid juohke oasáža bájabealde',
'tog-editsectiononrightclick' => 'Rievdat osiid nu ahte deaddilat bájilÄállaga sáhpána olggeÅ¡ boaluin (JavaScript)',
'tog-showtoc' => 'Čájet sisdoallologahallama siidduin, main lea eanet go golbma bájilÄállaga',
-'tog-rememberpassword' => 'Muite mu dieđuid dán dihtoris',
-'tog-editwidth' => 'Ođasmahttinlođa lea olles siiddu viidosaš',
+'tog-rememberpassword' => 'Muite mu dieđuid dán dihtoris (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Lasit Äuovvunlistui siidduid maid lean álggahan',
'tog-watchdefault' => 'Lasit Äuovvunlistui siidduid maid lean oÄ‘asmahttán',
'tog-watchmoves' => 'Lasit Äuovvunlistui siidduid maid lean sirdán',
@@ -133,9 +132,6 @@ $messages = array(
'qbmyoptions' => 'Ãsahusat',
'qbspecialpages' => 'Doaibmasiiddut',
-# Vector skin
-'vector-namespace-image' => 'Fiila',
-
'errorpagetitle' => 'Feaila',
'returnto' => 'Máhcat siidui $1.',
'tagline' => '{{SITENAME}}',
@@ -277,7 +273,7 @@ Du geavaheaddjidovddaldat lea dál anus.
'yourname' => 'Geavaheaddjidovddaldat',
'yourpassword' => 'Suollemassátni:',
'yourpasswordagain' => 'Čále suollemassáni ođđasit:',
-'remembermypassword' => 'Muite mu',
+'remembermypassword' => 'Muite mu (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Fierbmenamma',
'login' => 'Čálligoađe sisa',
'nav-login-createaccount' => 'Daga oÄ‘Ä‘a geavaheaddjidovddaldaga dahje ÄálligoaÄ‘e sisa',
@@ -608,37 +604,37 @@ $1 {{int:pipe-separator}} $2',
'recentchangeslinked-title' => '"$1" laktaseaddji rievdadusat',
# Upload
-'upload' => 'Lasit fiilla',
-'uploadbtn' => 'Lasit fiilla',
-'reuploaddesc' => 'Máhca sáddenskovvái.',
-'uploadnologin' => 'It leat Äálligoahtán sisa',
-'uploadnologintext' => 'Don fertet leat [[Special:UserLogin|Äálligoahtán sisa]], ovdalgo sáhtát vurket fiillaid.',
-'uploaderror' => 'Vurkenfeaila',
-'uploadlog' => 'Fiilalogga',
-'uploadlogpage' => 'Fiilalogga',
-'filename' => 'Fiilla namma:',
-'filedesc' => 'Čoahkkáigeassu',
-'fileuploadsummary' => 'Čoahkkáigeassu',
-'filesource' => 'Gáldu:',
-'uploadedfiles' => 'Lasihuvvon fiillat',
-'ignorewarning' => 'Vurke fuolatkeahttá varuhusas',
-'minlength1' => 'Fiilla namas ferte leat unnimustá okta mearka.',
-'badfilename' => 'Fiilla nama rievdaduvvui: $1.',
-'filetype-missing' => 'Fiillas vailui fiilageažus – ovdamearkkan <tt>.jpg</tt>.',
-'large-file' => 'Fiilla max. sturrodat lea $1. Fiila man lasihit lea $2.',
-'largefileserver' => 'Dát fiila lea menddo stuoris.',
-'successfulupload' => 'Lasiheapmi lihkosmuvai',
-'uploadwarning' => 'Lasihanvaruhus',
-'savefile' => 'Vurke',
-'uploadedimage' => 'vurkii fiilla [[$1]]',
-'uploaddisabled' => '{{GRAMMAR:genitive|{{SITENAME}}}} ii sáhte lasihit fiillaid.',
-'uploaddisabledtext' => 'Fiillaid vurken lea váldojuvvon eret anus.',
-'uploadscripted' => 'Dát fiila sisdisdoalla HTML-koda dahje skriptaid, maid neahttabláđejeaddji sáhttá vahagis dahkat.',
-'uploadvirus' => 'Fiila sisdoalla virusa. Dárkilut dieđut: $1',
-'sourcefilename' => 'Gáldonamma',
-'destfilename' => 'Mearrenamma',
-'watchthisupload' => 'Čuovo dán siiddu',
-'filewasdeleted' => 'Dán nammasaš fiila lea lasihuvvon ja sihkojuvvon jo ovda. Dárkis $1 ovdalgo joatkat.',
+'upload' => 'Lasit fiilla',
+'uploadbtn' => 'Lasit fiilla',
+'reuploaddesc' => 'Máhca sáddenskovvái.',
+'uploadnologin' => 'It leat Äálligoahtán sisa',
+'uploadnologintext' => 'Don fertet leat [[Special:UserLogin|Äálligoahtán sisa]], ovdalgo sáhtát vurket fiillaid.',
+'uploaderror' => 'Vurkenfeaila',
+'uploadlog' => 'Fiilalogga',
+'uploadlogpage' => 'Fiilalogga',
+'filename' => 'Fiilla namma:',
+'filedesc' => 'Čoahkkáigeassu',
+'fileuploadsummary' => 'Čoahkkáigeassu',
+'filesource' => 'Gáldu:',
+'uploadedfiles' => 'Lasihuvvon fiillat',
+'ignorewarning' => 'Vurke fuolatkeahttá varuhusas',
+'minlength1' => 'Fiilla namas ferte leat unnimustá okta mearka.',
+'badfilename' => 'Fiilla nama rievdaduvvui: $1.',
+'filetype-missing' => 'Fiillas vailui fiilageažus – ovdamearkkan <tt>.jpg</tt>.',
+'large-file' => 'Fiilla max. sturrodat lea $1. Fiila man lasihit lea $2.',
+'largefileserver' => 'Dát fiila lea menddo stuoris.',
+'uploadwarning' => 'Lasihanvaruhus',
+'savefile' => 'Vurke',
+'uploadedimage' => 'vurkii fiilla [[$1]]',
+'uploaddisabled' => '{{GRAMMAR:genitive|{{SITENAME}}}} ii sáhte lasihit fiillaid.',
+'uploaddisabledtext' => 'Fiillaid vurken lea váldojuvvon eret anus.',
+'uploadscripted' => 'Dát fiila sisdisdoalla HTML-koda dahje skriptaid, maid neahttabláđejeaddji sáhttá vahagis dahkat.',
+'uploadvirus' => 'Fiila sisdoalla virusa. Dárkilut dieđut: $1',
+'sourcefilename' => 'Gáldonamma',
+'destfilename' => 'Mearrenamma',
+'watchthisupload' => 'Čuovo dán siiddu',
+'filewasdeleted' => 'Dán nammasaš fiila lea lasihuvvon ja sihkojuvvon jo ovda. Dárkis $1 ovdalgo joatkat.',
+'upload-success-subj' => 'Lasiheapmi lihkosmuvai',
'upload-proto-error' => 'Feaila protokollas',
'upload-file-error' => 'Stuorra feaila',
@@ -849,7 +845,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'ÄŒuovvunlistu',
'mywatchlist' => 'ÄŒuovvunlistu',
-'watchlistfor' => '$1',
'nowatchlist' => 'Du Äuovvunlisttus eai leat siiddut.',
'watchlistanontext' => 'Don fertet $1, jus hálidat geavahit Äuovvunlisttu.',
'watchnologin' => 'It leat Äálligoahtán sisa',
diff --git a/languages/messages/MessagesSei.php b/languages/messages/MessagesSei.php
index b856a7f8..c716fb09 100644
--- a/languages/messages/MessagesSei.php
+++ b/languages/messages/MessagesSei.php
@@ -27,8 +27,7 @@ $messages = array(
'tog-editsection' => 'Ton ticpatlöx seccion [edit] linkám via',
'tog-editsectiononrightclick' => 'Ton ticpatlöx seccion pok clickám mii<br /> seccion titelám iti (JavaScript)',
'tog-showtoc' => 'Cohuatlöx insacualte (páhinám bajlip 3 text corridór mii)',
-'tog-rememberpassword' => 'Qualtiinii he quimx canj jan ordinator iti',
-'tog-editwidth' => 'Cui ticpatlöx janvam',
+'tog-rememberpassword' => 'Qualtiinii he quimx canj jan ordinator iti (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Plusöx páhinám he hun he listade cáminot',
'tog-watchdefault' => 'Plusöx páhinám he ticpatlöx he listade cáminot',
'tog-watchmoves' => 'Plusöx páhinám he yacom he listade cáminot',
@@ -331,7 +330,7 @@ Mecaitom coccebj creatöx. Quiix hequáatlaácde {{SITENAME}} pos-poop.",
'yourname' => 'Caitom ID:',
'yourpassword' => 'Quimx canj:',
'yourpasswordagain' => 'Vanquimx canj:',
-'remembermypassword' => 'Qualtiinii he quimx canj jan ordinator iti',
+'remembermypassword' => 'Qualtiinii he quimx canj jan ordinator iti (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Hedomino:',
'externaldberror' => 'Pos-römjde authenticacionde database extername jöx me necoccebj permiccionde updatan mecaitom externom.',
'login' => 'Caápo',
@@ -485,7 +484,7 @@ Me coccebj römjasi poop, clickom meback-buttonde browser coccebj perfectua.',
'userjsyoucanpreview' => "'''Tip:''' Usadad 'Cohuatlöx cuáxiit' testom me hun JS xuniim 'depre.",
'usercsspreview' => "'''He cuáxiit he CSSde caitom, zo necoccebj xuniim!'''",
'userjspreview' => "'''He cuáxiit/testom he JavaScriptde caitom, zo necoccebj xuniim!'''",
-'userinvalidcssjstitle' => "'''Attencion:''' Skin \"\$1\" coccebj ne'dáár. Regardom .css ö .js páhinám usadad titlenam lowercase zo, yanuiíxzo mii yahöxde ti {{ns:user}}:Foo/monobook.css opposadadde {{ns:user}}:Foo/Monobook.css.",
+'userinvalidcssjstitle' => "'''Attencion:''' Skin \"\$1\" coccebj ne'dáár. Regardom .css ö .js páhinám usadad titlenam lowercase zo, yanuiíxzo mii yahöxde ti {{ns:user}}:Foo/vector.css opposadadde {{ns:user}}:Foo/Vector.css.",
'updated' => '(varupdatenám)',
'note' => "'''Notificacion:'''",
'previewnote' => "'''Jan coccebj cuáxiit zo; quiíx necoccebj xuniim!'''",
@@ -508,8 +507,6 @@ Jan lajxepe occuram me usadad proxy service anon web-based buggy.'''",
'nonunicodebrowser' => "'''ATTENCION: Mebrowser necoccebj compliantede 'unicode' (characterám sans huáp ti). Workaround coccebj hant itide me permiccion ticpatlöx páhinám: non-ASCII characterám coccebj codes hexidecimales.'''",
'editingold' => "'''ATTENCION: Me coccebj ticpatlöx revicion outdatenam zode jan páhina. Me xuniim zo, jömde quiíx hunde jan revicion coccebj delar poop.'''",
'yourdiff' => 'Quiíx',
-'longpagewarning' => "'''ATTENCION: Jan páhina coccebj $1 kilobynám; browserám pac pos-coccebj problemámde ticpatlöx páhinám necade jöx plusöxde 32 kb.
-Cahöx ticpatlöx jan páhina minöx seccion iti.'''",
'longpageerror' => "'''RÖMJ: Textua zo mexuniim coccebj $1 kilobytenám, jan coccebj plusöxde maxde $2 kilobytenám. Zo necoccebj xuniim.'''",
'readonlywarning' => "'''ATTENCION: Database zo coccebj lockomde kyépöx, zo necoccebj posde xuniim meticpatlöx cmaa. Me coccebj considerom ''cut-n-paste'' textua zo ciúchande textua iti ö xuniimde diijömdexepe.'''",
'protectedpagewarning' => "'''ATTENCION: Jan páhina coccebj lockomde sysopám coccebj ticpatlöx zo permiccional.'''",
@@ -891,7 +888,6 @@ iitom e-iitomde diijömde caitóm.',
# Watchlist
'watchlist' => 'He listade cáminot',
'mywatchlist' => 'He listade cáminot',
-'watchlistfor' => "('''$1''' mii)",
'nowatchlist' => 'Hecoccebj 0 itémii helistade cáminot iti.',
'watchnologin' => 'Necaápo',
'watchnologintext' => 'Zo coccebj Neces [[Special:UserLogin|caápo]] ticpatlöx helistade cáminot.',
diff --git a/languages/messages/MessagesSgs.php b/languages/messages/MessagesSgs.php
new file mode 100644
index 00000000..17be53f2
--- /dev/null
+++ b/languages/messages/MessagesSgs.php
@@ -0,0 +1,1935 @@
+<?php
+/** Samogitian (Žemaitėška)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Hugo.arg
+ * @author Reedy
+ * @author Urhixidur
+ * @author Zordsdavini
+ * @author לערי ריינה×רט
+ */
+
+$fallback = 'lt';
+
+$namespaceNames = array(
+ NS_MEDIA => 'MedÄ—jÄ—',
+ NS_SPECIAL => 'Specēlos',
+ NS_TALK => 'AptarÄ—ms',
+ NS_USER => 'Nauduotuos',
+ NS_USER_TALK => 'NauduotuojÄ—_aptarÄ—ms',
+ NS_PROJECT_TALK => '$1_aptarÄ—ms',
+ NS_FILE => 'Abruozdielis',
+ NS_FILE_TALK => 'AbruozdielÄ—_aptarÄ—ms',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_aptarÄ—ms',
+ NS_TEMPLATE => 'Å abluons',
+ NS_TEMPLATE_TALK => 'Å abluona_aptarÄ—ms',
+ NS_HELP => 'Pagelba',
+ NS_HELP_TALK => 'Pagelbas_aptarÄ—ms',
+ NS_CATEGORY => 'KateguorÄ—jÄ—',
+ NS_CATEGORY_TALK => 'KateguorÄ—jÄ—s_aptarÄ—ms',
+);
+
+/**
+ * Aliases from the fallback language 'lt' to avoid breakage of links
+ */
+
+$namespaceAliases = array(
+ 'Specialus' => NS_SPECIAL,
+ 'Aptarimas' => NS_TALK,
+ 'Naudotojas' => NS_USER,
+ 'Naudotojo_aptarimas' => NS_USER_TALK,
+ '$1_aptarimas' => NS_PROJECT_TALK,
+ 'Vaizdas' => NS_FILE,
+ 'Vaizdo_aptarimas' => NS_FILE_TALK,
+ 'MediaWiki_aptarimas' => NS_MEDIAWIKI_TALK,
+ 'Å ablonas' => NS_TEMPLATE,
+ 'Å ablono_aptarimas' => NS_TEMPLATE_TALK,
+ 'Pagalba' => NS_HELP,
+ 'Pagalbos_aptarimas' => NS_HELP_TALK,
+ 'Kategorija' => NS_CATEGORY,
+ 'Kategorijos_aptarimas' => NS_CATEGORY_TALK,
+);
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Pabrauktė nūruodas:',
+'tog-highlightbroken' => 'FuormoutÄ— nasontiu poslapiu nÅ«ruodas <a href="#" class="new">Å¡Ä—tÄ“p</a> (prÄ«Å¡Ä—ngÄ - Å¡Ä—tÄ“p <a href="#" class="internal">?</a>).',
+'tog-justify' => 'Līgintė pastraipas palē abi poses',
+'tog-hideminor' => 'PakavuotÄ— mažus pataisÄ—mus vielÄ«bÅ«ju taisÄ«mu sÄraÅ¡Ä—',
+'tog-extendwatchlist' => 'Ä–Å¡pliestÄ— keravuojamu sÄraÅ¡a, kÅ« ruodÄ«tu vÄ—sus tÄ—nkamus pakeitÄ—mus',
+'tog-usenewrc' => 'PažongÄ“ ruodomÄ— vielibÄ—Ì…jÄ— pakeitÄ—mÄ (JavaScript)',
+'tog-numberheadings' => 'AutuomatÄ—Å¡kÄ numeroutÄ— skÄ—rsnelios',
+'tog-showtoolbar' => 'Ruodītė redagavėma rakondinė (JavaScript)',
+'tog-editondblclick' => 'Poslapiu redagavÄ—ms dvÄ—gobu paspaudÄ—mu (JavaScript)',
+'tog-editsection' => 'Ijongtė skėrsneliu redagavėma nauduojant nūruodas [taisītė]',
+'tog-editsectiononrightclick' => 'Ijongtė skėrsneliu redagavėma paspaudos skėrsnelė pavadėnėma<br />dešėniouju pelies klavėšu (JavaScript)',
+'tog-showtoc' => 'RuodÄ«tÄ— torÄ—ni, jÄ“ poslapÄ« daugiau kÄp 3 skÄ—rsnelÄ“',
+'tog-rememberpassword' => 'Atmintė prėsėjongėma infuormacėjė šėtom kuompioterī (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-watchcreations' => 'PridietÄ— poslapius, katrÅ«s sokorio, i keravuojamu sÄraÅ¡a',
+'tog-watchdefault' => 'PridietÄ— poslapius, katrÅ«s taisau, i keravuojamu sÄraÅ¡a',
+'tog-watchmoves' => 'PridietÄ— poslapius, katrÅ«s parkelio, i keravuojamu sÄraÅ¡a',
+'tog-watchdeletion' => 'PridietÄ— poslapius, katrÅ«s Ä—Å¡trino, i keravuojamu sÄraÅ¡a',
+'tog-minordefault' => 'PalÄ“ nutÄ«liejÄ—ma pažīmietÄ— redagavÄ—mus kÄp mažus',
+'tog-previewontop' => 'Ruodītė parvaiza vėrš redagavėma lauka',
+'tog-previewonfirst' => 'Ruodītė straipsnė parvėiza pėrmu redagavėmu',
+'tog-nocache' => "NenauduotÄ— poslapiu kaupÄ—ma (''caching'')",
+'tog-enotifwatchlistpages' => 'SiÅstÄ— mon gromata, kÅ«met pakeitams poslapis, katra stebiu',
+'tog-enotifusertalkpages' => 'SiÅstÄ— mon gromata, kÅ«met pakaitams mona nauduotuojÄ— aptarÄ—ma poslapis',
+'tog-enotifminoredits' => 'SiÅstÄ— mon gromata, kÅ«met poslapÄ— keitÄ—ms Ä«r mažos',
+'tog-enotifrevealaddr' => 'Ruodītė mona el. pašta adresa primėnėma gromatuos',
+'tog-shownumberswatching' => 'Ruodītė keravuojantiu nauduotuoju skatliu',
+'tog-fancysig' => 'Parašos ba autuomatėniu nūruodu',
+'tog-externaleditor' => 'Palē nutīliejėma nauduotė ėšuorini radaktuoriu',
+'tog-externaldiff' => 'Palē nutīliejėma nauduotė ėšuorinė skėrtomu ruodīma pruograma',
+'tog-showjumplinks' => 'Ijongtė „paršuoktė i“ pasėikiamoma nūruodas',
+'tog-uselivepreview' => 'NauduotÄ— tÄ—isiogÄ—ne parvÄ—iza (JavaScript) (EksperimentÄ—nis)',
+'tog-forceeditsummary' => 'KlaustÄ—, kumet palÄ—iku toÅ¡ÄÄ“ pakeitÄ—ma kuomentara',
+'tog-watchlisthideown' => 'Kavuotė mona pakeitėmos keravuojamu sarašė',
+'tog-watchlisthidebots' => 'KavuotÄ— robotu pakeitÄ—mos keravuojamu sÄraÅ¡Ä—',
+'tog-watchlisthideminor' => 'Kavuotė mažos pakeitėmos keravuojamu sarašė',
+'tog-watchlisthideliu' => 'KavuotÄ— prisÄ—jongosium nauduotuojum keitÄ—mus keravuojamu sÄroÅ¡Ä—',
+'tog-watchlisthideanons' => 'Kavuotė anonimėniu nauduotuoju keitėmus keravuojamu sarašė',
+'tog-nolangconversion' => 'Ä–Å¡jongtÄ— variantu keitÄ—ma',
+'tog-ccmeonemails' => 'SiÅstÄ— mon gromatu kopÄ—jÄ—s, katros siontiu kÄ—tÄ—ims nauduotojams',
+'tog-diffonly' => 'NeruodÄ«tÄ— poslapÄ— torÄ—nÄ— puo skÄ—rtomÄs',
+'tog-showhiddencats' => 'Ruodītė pakavuotas kateguorėjės',
+'tog-norollbackdiff' => 'Nekrēptė diemesė i skėrtoma atlėkus atmetėma',
+
+'underline-always' => 'Visumet',
+'underline-never' => 'Nikumet',
+'underline-default' => 'Palē naršīklės nostatīmos',
+
+# Dates
+'sunday' => 'sekma dÄ—ina',
+'monday' => 'pÄ—rmadÄ—inis',
+'tuesday' => 'ontradÄ—inis',
+'wednesday' => 'treÄiadÄ—inis',
+'thursday' => 'ketvÄ—rtadÄ—inis',
+'friday' => 'pÄ—nktadÄ—inis',
+'saturday' => 'subata',
+'sun' => 'Sekm',
+'mon' => 'PÄ—rm',
+'tue' => 'Ontr',
+'wed' => 'TreÄ',
+'thu' => 'Ketv',
+'fri' => 'PÄ—nk',
+'sat' => 'Sub',
+'january' => 'sausÄ—',
+'february' => 'vasarÄ—',
+'march' => 'kuova',
+'april' => 'balondÄ—',
+'may_long' => 'gegožės',
+'june' => 'bėrželė',
+'july' => 'lÄ—ipas',
+'august' => 'rogpjūtė',
+'september' => 'siejÄ—s',
+'october' => 'spalÄ—',
+'november' => 'lapkrÄ—stÄ—',
+'december' => 'groudÄ—',
+'january-gen' => 'Sausis',
+'february-gen' => 'Vasaris',
+'march-gen' => 'Kuovs',
+'april-gen' => 'Balondis',
+'may-gen' => 'Gegožė',
+'june-gen' => 'Bėrželis',
+'july-gen' => 'LÄ—ipa',
+'august-gen' => 'Rogpjūtis',
+'september-gen' => 'SiejÄ—',
+'october-gen' => 'Spalis',
+'november-gen' => 'LapkrÄ—stis',
+'december-gen' => 'Groudis',
+'jan' => 'sau',
+'feb' => 'vas',
+'mar' => 'kuo',
+'apr' => 'bal',
+'may' => 'geg',
+'jun' => 'bÄ—r',
+'jul' => 'lÄ—i',
+'aug' => 'rgp',
+'sep' => 'sie',
+'oct' => 'spa',
+'nov' => 'lap',
+'dec' => 'grd',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|KateguorÄ—jÄ—|KateguorÄ—jÄ—s|KateguorÄ—ju}}',
+'category_header' => 'Kateguorėjės „$1“ straipsnē',
+'subcategories' => 'SubkateguorÄ—jÄ—s',
+'category-media-header' => 'Abruozdielis kateguorėjuo „$1“',
+'category-empty' => "''Å Ä—ta kateguorÄ—jÄ— nÅ«nÄ netor nÄ— vÄ—ina straipsnÄ— a faila.''",
+'hidden-categories' => '{{PLURAL:$1|Pakavuota kateguorÄ—jÄ—|Pakavuotas kateguorÄ—jÄ—s}}',
+'hidden-category-category' => 'Pakavuotas kateguorÄ—jÄ—s',
+'category-subcat-count' => '{{PLURAL:$2|Tuo kateguorÄ—juo Ä«r vÄ—ina subkateguorÄ—jÄ—.|{{PLURAL:$1|Ruodoma|Ruodomas|Ruodoma}} $1 {{PLURAL:$1|subkateguorÄ—jÄ—|subkateguorÄ—jÄ—s|subkateguorÄ—ju}} (Ä—Å¡ vÄ—sa Ä«r $2 {{PLURAL:$2|subkateguorÄ—jÄ—|subkateguorÄ—jÄ—s|subkateguorÄ—ju}}).}}',
+'category-article-count' => '{{PLURAL:$2|Tuo kateguorėjuo īr vėins poslapis.|{{PLURAL:$1|Ruodoms|Ruodomė|Ruodoma}} $1 tuos kateguorėjės {{PLURAL:$1|poslapis|poslapē|poslapiu}} (ėš vėsa kateguorėjuo īr $2 {{PLURAL:$2|poslapis|poslapē|poslapiu}}).}}',
+'listingcontinuesabbrev' => 'tes.',
+
+'about' => 'Aple',
+'article' => 'Straipsnis',
+'newwindow' => '(Ä«r atverams naujam longÄ—)',
+'cancel' => 'NutrauktÄ—',
+'moredotdotdot' => 'Daugiau...',
+'mypage' => 'Mona poslapis',
+'mytalk' => 'Mona aptarÄ—ms',
+'anontalk' => 'Å Ä—ta IP aptarÄ—ms',
+'navigation' => 'Naršīms',
+'and' => '&#32;Ä—r',
+
+# Cologne Blue skin
+'qbfind' => 'Ėiškuotė',
+'qbbrowse' => 'Naršītė',
+'qbedit' => 'Taisītė',
+'qbpageoptions' => 'Tas poslapis',
+'qbpageinfo' => 'Konteksts',
+'qbmyoptions' => 'Mona poslapē',
+'qbspecialpages' => 'Specēlė̅jė poslapē',
+'faq' => 'DOK',
+'faqpage' => 'Project:DOK',
+
+# Vector skin
+'vector-action-addsection' => 'PridietÄ— tema',
+'vector-action-delete' => 'TrintÄ—',
+'vector-action-move' => 'ParvadintÄ—',
+'vector-action-protect' => 'Ožrakintė',
+'vector-action-undelete' => 'AtkortÄ—',
+'vector-action-unprotect' => 'AtrakintÄ—',
+'vector-view-create' => 'SokortÄ—',
+'vector-view-edit' => 'Taisītė',
+'vector-view-history' => 'VeizietÄ— istuorÄ—jÄ—',
+'vector-view-view' => 'Skaitītė',
+'vector-view-viewsource' => 'VeizietÄ— kuoda',
+'actions' => 'VÄ“ksmÄ',
+'namespaces' => 'Vardū srėtīs',
+'variants' => 'VariantÄ',
+
+'errorpagetitle' => 'Klaida',
+'returnto' => 'Grīžtė i $1.',
+'tagline' => 'Straipsnis Ä—Å¡ {{SITENAME}}.',
+'help' => 'Pagelba',
+'search' => 'Ėiškuotė',
+'searchbutton' => 'Ėiškuok',
+'go' => 'Ä’k',
+'searcharticle' => 'Ä’k',
+'history' => 'PoslapÄ— istuorÄ—jÄ—',
+'history_short' => 'IstuorÄ—jÄ—',
+'updatedmarker' => 'atnaujėnta nu paskotėnė mona apsėlonkīma',
+'info_short' => 'InfuormacÄ—jÄ—',
+'printableversion' => 'VersÄ—jÄ— spausdintÄ—',
+'permalink' => 'Nulatėnė nūruoda',
+'print' => 'SpausdÄ—ntÄ—',
+'edit' => 'Taisītė',
+'create' => 'SokortÄ—',
+'editthispage' => 'Taisītė ton poslapė',
+'create-this-page' => 'SokortÄ— ta poslapi',
+'delete' => 'TrintÄ—',
+'deletethispage' => 'TrintÄ— ton poslapÄ—',
+'protect' => 'Ožrakintė',
+'protect_change' => 'pakeistÄ—',
+'protectthispage' => 'Ožrakintė šėta poslapi',
+'unprotect' => 'AtrakintÄ—',
+'unprotectthispage' => 'AtrakintÄ— Å¡Ä—ta poslapi',
+'newpage' => 'Naus poslapis',
+'talkpage' => 'AptartÄ— Å¡Ä—ta poslapi',
+'talkpagelinktext' => 'AptarÄ—ms',
+'specialpage' => 'Specēlosis poslapis',
+'personaltools' => 'PersuonalÄ—nÄ“ rakondÄ',
+'postcomment' => 'Rašītė kuomentara',
+'articlepage' => 'VeizietÄ— straipsnÄ—',
+'talk' => 'AptarÄ—ms',
+'views' => 'ParveizÄ—tÄ—',
+'toolbox' => 'RakondÄ',
+'userpage' => 'Ruodītė nauduotoja poslapi',
+'projectpage' => 'Ruodītė pruojekta poslapi',
+'imagepage' => 'VeizietÄ— abruozdielÄ— poslapi',
+'mediawikipage' => 'Ruodītė pranešėma poslapi',
+'templatepage' => 'Ruodītė šabluona poslapi',
+'viewhelppage' => 'Ruodītė pagelbuos poslapi',
+'categorypage' => 'Ruodītė kateguorėjės poslapi',
+'viewtalkpage' => 'Ruodītė aptarėma poslapi',
+'otherlanguages' => 'KÄ—tuom kalbuom',
+'redirectedfrom' => '(Nokreipta Ä—Å¡ $1)',
+'redirectpagesub' => 'NokreipÄ—ma poslapis',
+'lastmodifiedat' => 'Å Ä—ts poslapis paskotini karta pakeists $1 $2.',
+'viewcount' => 'Tas poslapis bova atverts $1 {{PLURAL:$1|Äiesa|Äiesus|Äiesu}}.',
+'protectedpage' => 'Ožrakints poslapis',
+'jumpto' => 'Paršuoktė i:',
+'jumptonavigation' => 'navÄ—gacÄ—jÄ—',
+'jumptosearch' => 'paėiška',
+
+# 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' => 'Aple {{SITENAME}}',
+'aboutpage' => 'Project:Aple',
+'copyright' => 'Turinīs pateikts so $1 licencėjė.',
+'copyrightpage' => '{{ns:project}}:Autuoriu teisÄ—s',
+'currentevents' => '** Vielībė̅jė ivīkē **',
+'currentevents-url' => 'Project:Vielībė̅jė ivīkē',
+'disclaimers' => 'Atsakuomībės aprėbuojims',
+'disclaimerpage' => 'Project:Atsakuomībės aprėbuojims',
+'edithelp' => 'KÄp redagoutÄ—',
+'edithelppage' => 'Help:RedagavÄ—ms',
+'helppage' => 'Help:Torėnīs',
+'mainpage' => 'PÄ—rms poslapis',
+'mainpage-description' => 'PÄ—rms poslapis',
+'policy-url' => 'Project:PuolitÄ—ka',
+'portal' => 'Kuolektīvs',
+'portal-url' => 'Project:Kuolektīvs',
+'privacy' => 'Privatoma puolitÄ—ka',
+'privacypage' => 'Project:Privatoma puolitÄ—ka',
+
+'badaccess' => 'PrivÄ—lÄ—ju klaida',
+'badaccess-group0' => 'TomstÄ nelÄ“dama ivÄ«kdÄ«tÄ— veiksma, katruo praÅ¡iet.',
+
+'ok' => 'GerÄ',
+'retrievedfrom' => 'Gautė ėš „$1“',
+'youhavenewmessages' => 'Tamsta toret $1 ($2).',
+'newmessageslink' => 'naujū žėnotiu',
+'newmessagesdifflink' => 'paskotinis pakeitÄ—ms',
+'youhavenewmessagesmulti' => 'Toret naujū žėnotiu $1',
+'editsection' => 'taisītė',
+'editold' => 'taisītė',
+'viewsourceold' => 'veizietÄ— Å¡altÄ—ni',
+'editlink' => 'keistÄ—',
+'viewsourcelink' => 'veizietÄ— kuoda',
+'editsectionhint' => 'RedagoutÄ— skirsneli: $1',
+'toc' => 'Torėnīs',
+'showtoc' => 'ruodītė',
+'hidetoc' => 'kavuotÄ—',
+'thisisdeleted' => 'VeizÄ—tÄ— a atkortÄ— $1?',
+'viewdeleted' => 'Ruodītė $1?',
+'restorelink' => '$1 {{PLURAL:$1|ėštrinta keitėma|ėštrintos keitėmos|ėštrintū keitėmu}}',
+'feedlinks' => 'Å altÄ—nis:',
+'site-rss-feed' => '$1 RSS Å¡altÄ—nis',
+'site-atom-feed' => '$1 Atom Å¡altÄ—nis',
+'page-rss-feed' => '„$1“ RSS šaltėnis',
+'page-atom-feed' => '„$1“ Atom šaltėnis',
+'red-link-title' => '$1 (poslapis da neparašīts)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Poslapis',
+'nstab-user' => 'NauduotuojÄ— poslapis',
+'nstab-media' => 'AbruozdielÄ— poslapis',
+'nstab-special' => 'Specēlos poslapis',
+'nstab-project' => 'Proujekta poslapis',
+'nstab-image' => 'Fails',
+'nstab-mediawiki' => 'Teksts',
+'nstab-template' => 'Å abluons',
+'nstab-help' => 'Pagelbuos poslapis',
+'nstab-category' => 'KateguorÄ—jÄ—',
+
+# Main script and global functions
+'nosuchaction' => 'Nier tuokÄ— veiksma',
+'nosuchspecialpage' => 'Nier tuokė specēlėjė poslapė',
+'nospecialpagetext' => 'Tamsta praÅ¡iet nelaistÄ—na specÄ“lÄ—Ì…jÄ— poslapÄ—, laistÄ—nÅ« specÄ“liÅ«ju poslapiu sÅraÅ¡a rasÄ—t [[Special:SpecialPages|specÄ“liÅ«ju poslapiu sÄroÅ¡Ä—]].',
+
+# General errors
+'error' => 'Klaida',
+'databaseerror' => 'Doumenū bazės klaida',
+'laggedslavemode' => 'Diemesė: Poslapī gal nesmatītė naujausiu pakeitėmu.',
+'readonly' => 'Doumenū bazė ožrakėnta',
+'enterlockreason' => 'Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta',
+'readonlytext' => 'Doumenū bazė daba īr ožrakėnta naujėm irašam a kėtėm keitėmam,
+mažo doumenÅ« bazÄ—s techninÄ“ pruofilaktÄ—kÄ,
+puo tuo vėsks griš i sava viežes.
+Ožrakėnusiuojo admėnėstratuoriaus pateikts rakėnima paaiškėnims: $1',
+'missing-article' => 'Doumenū bazė nerada poslapė teksta, katra ana torietu rastė, pavadėnta „$1“ $2.
+
+PaprastÄ tas bÅ«n dielÄ“ pasenosÄ—s skÄ—rtoma vuo istuorÄ—jÄ—s nÅ«ruodas i poslapi, katros bova Ä—Å¡trÄ—nts.
+
+Jēgo tas nie šėts varėjants, Tamsta mažo raduot klaida pruogramėnė ironguo.
+PraÅ¡uom aple Å¡Ä—tÄ paskelbtÄ— [[Special:ListUsers/sysop|adminÄ—stratoriÅ]], nepamÄ—rÅ¡damÄ— nuruodÄ«tÄ— nÅ«ruoda.',
+'missingarticle-rev' => '(versÄ—jÄ—#: $1)',
+'missingarticle-diff' => '(SkÄ—rt.: $1, $2)',
+'readonly_lag' => 'DoumenÅ« bazÄ— bova autuomatÄ—Å¡kÄ ožrakÄ—nta, kuol pagelbinÄ—s doumenÅ« bazÄ—s pasvÄ«s pagrÄ—ndine',
+'internalerror' => 'VÄ—dÄ—nÄ— klaida',
+'internalerror_info' => 'VÄ—dÄ—nÄ— klaida: $1',
+'filecopyerror' => 'Nepavīkst kopėjoutė faila ėš „$1“ i „$2“.',
+'filerenameerror' => 'Nepavīkst parvardėntė faila ėš „$1“ i „$2“.',
+'filenotfound' => 'Nepavīkst rastė faila „$1“.',
+'fileexistserror' => 'Nepavīkst irašītė i faila „$1“: tas fails jau īr',
+'unexpected' => 'Natėkieta raikšmie: „$1“=„$2“.',
+'cannotdelete' => 'Nepavīka ėštrintė nuruodīta poslapė a faila. (Mažo kažkas padarė pėrmesnis šėta)',
+'badtitle' => 'Bluogs pavadÄ—nÄ—ms',
+'badtitletext' => 'NuruodÄ«ts poslapÄ— pavadÄ—nÄ—ms bova neleistÄ—ns, toÅ¡ÄÄ—s a neteisÄ—ngÄ sojongts terpkalbinis a terppruojektÄ—nis pavadÄ—nÄ—ms. AnamÄ— gal bÅ«tÄ— vÄ—ins a daugiau sÄ—mbuoliu, neleistÄ—nÅ« pavadÄ—nÄ—mÅ«s',
+'perfcachedts' => 'Ruodoma ėšsauguota doumenū kopėjė, katra bova atnaujėnta $1.',
+'querypage-no-updates' => 'AtnaujÄ—nÄ—mÄ tam poslapiÅ nÅ«nÄ Ä—Å¡jongtÄ— Ä«r. DoumenÄ«s nÅ«nÄ ÄÄ— nebus atnaujÄ—ntÄ—.',
+'wrong_wfQuery_params' => 'NetaisingÄ— parametrÄ i funkcÄ—jÄ— wfQuery()<br />
+FunkcÄ—jÄ—: $1<br />
+Ožklausėms: $2',
+'viewsource' => 'VeizÄ—tÄ— kuoda',
+'viewsourcefor' => 'poslapiÅ $1',
+'protectedpagetext' => 'Šėts poslapis īr ožrakints, saugont anū nū redagavėma.',
+'viewsourcetext' => 'Tomsta galÄ—t veizietÄ— Ä—r kopÄ—joutÄ— poslapÄ— kuoda:',
+'protectedinterface' => 'Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.',
+'editinginterface' => "'''DiemesÄ—:''' Tamsta keitat poslapi, katros Ä«r nauduojams programÄ—nÄ—s irongas sÅsajÄ—s tekstÄ—. PakeitÄ—mÄ tamÄ— poslapÅ« tÄ“puogi pakeis nauduotuojÄ— sÅsajÄ—s Ä—Å¡ruoda Ä— kÄ—tÄ—ims nauduotujams. JÄ“go nuorÄ—t pargoldÄ«tÄ—, siÅ«luom pasÄ—nauduotÄ— [http://translatewiki.net/wiki/Main_Page?setlang=bat-smg „translatewiki.net“], „MediaWiki“ lokalÄ—zacÄ—jÄ—s pruojÄ—ktu.",
+'sqlhidden' => '(SQL ožklausa pakavuota)',
+'namespaceprotected' => "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
+'ns-specialprotected' => 'Specēlė̅ jė poslapē negal būtė keitamė.',
+
+# Login and logout pages
+'logouttext' => "'''Daba Tamsta esat atsÄ—jongÄ—s.'''
+
+GalÄ—t Ä— tuoliau nauduotÄ— {{SITENAME}} anuonimÄ—Å¡kÄ aba prisÄ—jonkÄ—t Ä—Å¡ naujÄ— Å¡Ä—tuo patiu a kÄ—to nauduotuojÄ— vardu.
+Pastebiejims: katruos nekatruos poslapiuos Ä— tuoliau gal ruodÄ«tÄ— bÅ«ktÄ bÅ«tomiet prisÄ—jongÄ—s lÄ—gÄ— tuol, kumet Ä—Å¡valÄ«sÄ—t sava narÅ¡Ä«klÄ—s dietovÄ— (''cache'').",
+'welcomecreation' => '== Svēkė, $1! ==
+
+Tamstas paskīra bova sokorta. Neožmėrškėt pakeistė sava {{SITENAME}} nustatīmu.',
+'yourname' => 'NauduotuojÄ— vards:',
+'yourpassword' => 'Slaptažuodis:',
+'yourpasswordagain' => 'Pakartuoket slaptažuodė:',
+'remembermypassword' => 'AtmintÄ— Å¡Ä—ta infuormacÄ—jÄ— Å¡Ä—tom kuompioteri(for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourdomainname' => 'Tamstas domens:',
+'login' => 'PrisÄ—jongtÄ—',
+'nav-login-createaccount' => 'Prėsėjongtė / sokortė paskīra',
+'loginprompt' => 'Ijonkėt pakavukus, jēgo nuorėt prisėjongtė pri {{SITENAME}}.',
+'userlogin' => 'Prėsėjongtė / sokortė paskīra',
+'logout' => 'AtsÄ—jongtÄ—',
+'userlogout' => 'AtsÄ—jongtÄ—',
+'notloggedin' => 'NeprisÄ—jongis',
+'nologin' => "NetorÄ—t prisÄ—jongÄ—ma varda? '''$1'''.",
+'nologinlink' => 'Sokorkėt paskīra',
+'createaccount' => 'Sokortė paskīra',
+'gotaccount' => "Jau torėt paskīra? '''$1'''.",
+'gotaccountlink' => 'PrisÄ—jonkÄ—t',
+'badretype' => 'Ivestė slaptažuodē nesotamp.',
+'userexists' => 'Irašīts nauduotuojė vards jau īr nauduojams.
+Prašuom pasėrėnktė kėtuoki varda.',
+'loginerror' => 'PrisÄ—jongÄ—ma klaida',
+'nocookiesnew' => 'Nauduotuojė paskīra bova sokurta, ale Tamsta nēsot prisėjongis. {{SITENAME}} nauduo pakavukus, kū prijongtu nauduotuojus. Tamsta esot ėšjongis anūs. Prašuom ijongtė pakavukus, tumet prisėjonkėt so sava nauju nauduotuojė vardu ė slaptažuodiu.',
+'nocookieslogin' => "Vikipedėjė nauduo pakavukus (''cookies''), kū prijongtu nauduotuojus. Tamsta esat ėšjongės anūs. Prašuom ijongtė pakavukus ė pamiegītė viel.",
+'loginsuccesstitle' => 'SiekmingÄ prisÄ—jongiet.',
+'loginsuccess' => "'''NÅ«nÄ Tamsta esot prisÄ—jongÄ—s pri {{SITENAME}} kÄp „$1“.'''",
+'nosuchuser' => 'Nier anėjuokė nauduotuojė pavadėnta „$1“.
+Patikrėnkėt rašība, aba [[Special:UserLogin/signup|sokorkėt naujė paskīra]].',
+'nosuchusershort' => 'Nier juokė nauduotuojė, pavadėnta „$1“. Patėkrinkėt rašība.',
+'nouserspecified' => 'TamstÄ rÄ“k nuruodÄ«tÄ— nauduotuojÄ— varda.',
+'wrongpassword' => 'Ivests neteisings slaptažuodis. Pameginket dÄ karta.',
+'wrongpasswordempty' => 'Ivests slaptažuodis īr tošts. Pameginket vielėk.',
+'passwordtooshort' => 'Tamstas slaptažuodis nier laistėns aba par tromps īr. Ans tor būtė nuors {{PLURAL:$1|1 sėmbuolė|$1 sėmbuoliu}} ėlgoma ė skėrtės nū Tamstas nauduotuojė varda.',
+'mailmypassword' => 'AtsiÅstÄ— naujÄ— slaptažuodi paÅ¡to',
+'passwordremindertitle' => 'Laikėns {{SITENAME}} slaptažuodis',
+'passwordremindertext' => 'KažkastÄ (tÄ—kriausÄ“ Tamsta, IP adreso $1)
+papraÅ¡Ä—, kÅ« atsiÅstomiet naujÄ— slaptažuodi pruojektÅ {{SITENAME}} ($4).
+LaikÄ—ns slaptažuodis nauduotuojŠ„$2“ bova sokorts Ä—r nustatÄ«ts kÄp „$3“.
+Jēgo Tamsta nuoriejot ana pakeistė tūmet torietomiet prisėjongtė ė daba pakeistė sava slaptažuodi.
+
+Jēgo kažkas kėts atlėka ta prašīma aba Tamsta prisėmėniet sava slaptažuodi ė
+nebnuorÄ—t ana pakeistÄ—, Tamsta galÄ—t tÄ—isiuog nekreiptÄ— diemiesÄ— Ä— Å¡Ä—ta gruomata Ä— tuoliau
+nauduotis sava senu slaptažuodžiu.',
+'noemail' => 'Nier anėjuokė el. pašta adresa ivesta nauduotuojŠ„$1“.',
+'passwordsent' => 'Naus slaptažuodis bova nusiÅsts i el. paÅ¡ta adresa,
+ožregėstrouta nauduotuojė „$1“.
+Prašuom prisėjongtė vielē, kumet Tamsta gausėt anū.',
+'blocked-mailpassword' => 'Tamstas IP adresos īr ožblokouts nū redagavėma, tudie neleidama nauduotė slaptažuodė priminėma funkcėjės, kū apsėsauguotomė nū pėktnaudžēvėma.',
+'eauthentsent' => 'PatvÄ—rtÄ—nÄ—ma gruomata bova nusiÅsta i paskÄ—rta el. paÅ¡ta adresa.
+PrÄ«Å¡ Ä—Å¡siontiant kÄ—ta gruomata i Tamstas diežote, Tamsta torÄ—t vÄ«kdÄ«tÄ— nuruodÄ«mus gruomatuo, kÅ« patvÄ—rtÄ—ntomiet, kÅ« diežotÄ— tÄ—krÄ Ä«r Tamstas.',
+'throttled-mailpassword' => 'Slaptažuodžė priminims jau bova Ä—Å¡siÅsts, par paskotÄ—nes $1 adÄ«nas. Nuorint apsÄ—sauguotÄ— nÅ« pÄ—ktnaudžēvÄ—ma, slaptažuodÄ— priminims gal bÅ«t Ä—Å¡siÅsts tÄ—k kas $1 adÄ«nas.',
+'mailerror' => 'Klaida siontiant pašta: $1',
+'acct_creation_throttle_hit' => 'Tamsta jau sokūriet $1 prisėjongėma varda. Daugiau nebgalėma.',
+'emailauthenticated' => 'Tamstas el. pašta adresos bova ožtvirtėnts $1.',
+'emailnotauthenticated' => 'Tamstas el. pašta adresos da nier patvėrtėnts. Anėjuokės gruomatas
+nebus siontamas ni vÄ—inam žemiau Ä—Å¡vardÄ—ntam puoslaugiÅ.',
+'noemailprefs' => 'Nuruodėkīt el. pašta adresa, kū vėiktu šėtos funkcėjės.',
+'emailconfirmlink' => 'Patvėrtinkėt sava el. pašta adresa',
+'accountcreated' => 'Nauduotuos sokorts',
+'accountcreatedtext' => 'Nauduotuos $1 sokorts.',
+'createaccount-title' => '{{SITENAME}} paskīruos kūrėms',
+'loginlanguagelabel' => 'Kalba: $1',
+
+# Password reset dialog
+'resetpass' => 'Keistė slaptažuodi',
+'resetpass_header' => 'Keistė paskīruos slaptažuodi',
+'oldpassword' => 'Sens slaptažuodis:',
+'newpassword' => 'Naus slaptažuodis:',
+'retypenew' => 'Pakartuokėt nauja slaptažuodi:',
+'resetpass_submit' => 'Nostatītė slaptažuodi ė prėsėjongtė',
+'resetpass_success' => 'Tamstas slaptažuodis pakeists siekmÄ—ngÄ! Daba prÄ—sÄ—jongiama...',
+'resetpass-temp-password' => 'Laikėns slaptažuodis:',
+
+# Edit page toolbar
+'bold_sample' => 'Pastuorints teksts',
+'bold_tip' => 'PastuorintÄ— teksta',
+'italic_sample' => 'Teksts kursīvu',
+'italic_tip' => 'Teksts kursīvu',
+'link_sample' => 'NÅ«ruodas pavadinÄ—ms',
+'link_tip' => 'Vėdinė nūruoda',
+'extlink_sample' => 'http://www.example.com nūruodas pavadėnėms',
+'extlink_tip' => 'Ėšuorėnė nūruoda (nepamėrškėt http:// priraša)',
+'headline_sample' => 'Skīrė pavadėnėms',
+'headline_tip' => 'Ontra līgė skīrė pavadėnėms',
+'math_sample' => 'IveskÄ—t fuormolÄ—',
+'math_tip' => 'MatematinÄ— fuormolÄ— (LaTeX fuormato)',
+'nowiki_sample' => 'IterpkÄ—t nefuormouta teksta ÄÄ—',
+'nowiki_tip' => 'Ä–gnoroutÄ— wiki fuormata',
+'image_sample' => 'Pavīzdīs.jpg',
+'image_tip' => 'IdietÄ— abruozdieli',
+'media_sample' => 'Pavīzdīs.ogg',
+'media_tip' => 'NÅ«ruoda i media faila',
+'sig_tip' => 'Tomstas paraÅ¡os Ä—r Äiesos',
+'hr_tip' => 'Guorizuontali linÄ—jÄ— (nenauduokÄ—t ba reikala)',
+
+# Edit pages
+'summary' => 'Kuomentars:',
+'subject' => 'Tema/ontraštė:',
+'minoredit' => 'Mažos pataisims',
+'watchthis' => 'KeravuotÄ— Å¡Ä—ta poslapÄ—',
+'savearticle' => 'Ä–Å¡sauguotÄ— poslapÄ—',
+'preview' => 'Parveiza',
+'showpreview' => 'Ruodītė parveiza',
+'showlivepreview' => 'TÄ—isiuogÄ—nÄ— parvaiza',
+'showdiff' => 'Ruodītė skėrtomus',
+'anoneditwarning' => "'''Diemesė:''' Tomsta nesat prisėjungės. Jūsa IP adresos būs irašīts i šiuo poslapė istuorėjė.",
+'missingsummary' => "'''PriminÄ—ms:''' Tamsta nenuruodiet pakeitÄ—ma kuomentara. JÄ“go viel paspausÄ—t ''Ä–Å¡sauguotÄ—'', Tamstas pakeitÄ—ms bus Ä—Å¡sauguots ba anuo.",
+'missingcommenttext' => 'Prašuom ivestė kuomentara.',
+'summary-preview' => 'Kuomentara parvaiza:',
+'subject-preview' => 'Skėrsnelė/ontraštės parvaiza:',
+'blockedtitle' => 'Nauduotuos īr ožblokouts',
+'blockedtext' => "'''Tamstas nauduotuojė vards a IP adresos īr ožblokouts.'''
+
+Ožbluokava $1.
+Nuruodīta prižastis īr ''$2''.
+
+* Bluokavėma pradžia: $8
+* BluokavÄ—ma pabenga: $6
+* Numatīts bluokoujamasės: $7
+
+Tamsta galÄ—t sosÄ—sÄ—iktÄ— so $1 a kÄ—tu
+[[{{MediaWiki:Grouppage-sysop}}|adminėstratuoriom]], kū aptartė ožbluokavėma.
+Tamsta negalÄ—t nauduotÄ—s funkcÄ—jÄ— „RaÅ¡Ä«tÄ— laiÅ¡ka tam nauduotuojÅ“, jÄ“go nesot pateikis tÄ—kra sava el. paÅ¡ta adresa sava [[Special:Preferences|paskÄ«ruos nustatÄ«mÅ«s]] Ä— nesot ožblokouts nu anuos nauduojÄ—ma.
+Tamstas dabartÄ—nis IP adresos Ä«r $3, a bluokavÄ—ma ID Ä«r #$5. PraÅ¡uom nuruodÄ«tÄ— Å¡Ä—tÄ, kumet kreipiatÄ—s diel atbluokavÄ—ma.",
+'autoblockedtext' => "Tamstas IP adresos bova autuomatÄ—Å¡kÄ ožblokouts, kadongi ana nauduojÄ— kÄ—ts nauduotuos, katra ožbluokava $1.
+Nuruodīta prīžastis īr tuokė:
+
+:''$2''
+
+* Bluokavėma pradžė: $8
+* BluokavÄ—ma pabenga: $6
+* Numatuoms bluokavÄ—ma Äiesos: $7
+
+Tamsta galėt sosėsėiktė so $1 aba kėtu [[{{MediaWiki:Grouppage-sysop}}|adminėstratuoriom]], kū aprokoutomėt biedas diel bluokavėma.
+
+Tamsta negalÄ—t nauduotÄ—s fonkcÄ—jÄ— „RaÅ¡Ä«tÄ— gruomata tam nauduotuojÅ“, jÄ“go nesot nuruode tÄ—kra el. paÅ¡ta adresa sava [[Special:Preferences|nauduotuojÄ— nustatÄ«mÅ«s]]. TÄ“puogi Tamsta negalat nauduotÄ—s ta fonkcÄ—jÄ—, jÄ“go TamstÄ ožblokouts anuos nauduojÄ—ms.
+
+Tamstas IP adresos Ä«r $3, bluokavÄ—ma ID Ä«r $5.
+Prašuom nuruodītė šėtūs doumenis visūmet, kumet kreipiatės diel bluokavėma.",
+'blockednoreason' => 'prīžastis nier nuruodīta',
+'blockedoriginalsource' => "Žemiau īr ruodoms '''$1''' torėnīs:",
+'blockededitsource' => "''Tamstas keitimu'' teksts poslapiui '''$1''' īr ruodoms žemiau:",
+'whitelistedittitle' => 'Nuorėnt redagoutė rēk prisėjongtė',
+'whitelistedittext' => 'Tamsta torėt $1, kū keistomėt poslapius.',
+'nosuchsectiontitle' => 'Nier tuokė skīrė',
+'loginreqlink' => 'prisÄ—jongtÄ—',
+'accmailtitle' => 'Slaptažuodis ėšsiūsts īr.',
+'accmailtext' => "Nauduotuojė '$1' slaptažuodis nusiūsts i $2 īr.",
+'newarticle' => '(Naus)',
+'newarticletext' => "Tamsta pakliovuot i nÅ«nÄ neesoti poslapi.
+Nuoriedamė sokortė poslapi, pradiekėt rašītė žemiau esontiamė ivedima pluotė
+(platiau [[{{MediaWiki:Helppage}}|pagelbas poslapī]]).
+JÄ“go pakliovuot ÄÄ— netÄ«Äiuom, paprastiausÄ“ paspauskÄ—t narÅ¡Ä«klÄ—s mÄ«gtoka '''atgal'''.",
+'anontalkpagetext' => "----''Tas īr anonimėnė nauduotuojė, katros nier sosėkūrės aba nenauduo paskīruos, aptarėmu poslapis.
+DielÄ“ tuo nauduojams IP adresos anuo atpažėnÄ—mÅ.
+Tas IP adresos gal būtė dalinams keletŠnauduotuoju.
+JÄ“go Tamsta esat anonimÄ—nis nauduotuos Ä—r veizÄ—t, kÅ« kuomentarÄ nier skÄ—rtÄ— TamstÄ, [[Special:UserLogin/signup|sokorkÄ—t paskÄ«ra]] aba [[Special:UserLogin|prisÄ—jonkÄ—t]], Ä— nebÅ«sÄ—t maiÅ¡uoms so kÄ—tÄs anonimÄ—nÄ“s nauduotuojÄs.''",
+'noarticletext' => 'Tuo Äiesu tamÄ— poslapÄ« nier juokÄ— teksta.
+Tamsta galėt [[Special:Search/{{PAGENAME}}|ėiškuotė šėta poslapė pavadėnėma]] kėtūs poslapiūs,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė sosėjosiu regėstru],
+aba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistÄ— ta poslapi]</span>.',
+'userpage-userdoesnotexist' => 'Nauduotuojė paskīra „$1“ nier ožregėstrouta. Prašuom patikrėntė, a Tamsta nuorėt kortė/keistė ta poslapi.',
+'clearyourcache' => "'''DiemesÄ—:''' Ä—Å¡sauguojus TamstÄ gal prireiktÄ— Ä—Å¡valÄ«tÄ— Tamstas narÅ¡Ä«klÄ—s rÄ—nktovÄ—, kÅ« paveizÄ—tomÄ—t pakeitÄ—mus. '''Mozilla / Safari / Konqueror:''' laikÄ«dami ''Shift'' pasÄ—rinkÄ—t ''AtsiÅstÄ— Ä—Å¡ nauja'', a paspauskÄ—t ''Ctrl-Shift-R'' (sÄ—stemuo Apple Mac ''Cmd-Shift-R''); '''IE:''' laikÄ«damÄ— ''Ctrl'' paspauskÄ—t ''AtnaujÄ—ntÄ—'', o paspauskÄ—t ''Ctrl-F5''; '''Konqueror:''' paprastiausÄ“ paspauskÄ—t ''PerkrautÄ—'' mÄ«gtoka, o paspauskÄ—t ''F5''; '''Opera''' nauduotuojam gal prireiktÄ— pÄ—lnÄ Ä—Å¡valÄ«tÄ— anÅ« rÄ—nktovÄ— ''RakondÄ→NustatÄ«mÄ''.",
+'usercssyoucanpreview' => "'''Patarėms:''' Nauduokit „Ruodītė parvaiza“ mīgtoka, kū ėšmiegintomiet sava naujaji CSS priš ėšsaugont.",
+'userjsyoucanpreview' => "'''Patarėms:''' Nauduokit „Ruodītė parvaiza“ mīgtoka, kū ėšmiegintomiet sava naujaji JS priš ėšsaugont.",
+'usercsspreview' => "'''Napamirškėt, kū Tamsta tėk parveizėt sava nauduotoja CSS, ans da nabova ėšsauguots!'''",
+'userjspreview' => "'''Nepamirškėt, kū Tamsta tėk testoujat/parvaizėt sava nauduotoja ''JavaScript'', ans da nabova ėšsauguots!'''",
+'userinvalidcssjstitle' => "'''Diemesė:''' Nė juokės ėšruodos „$1“. Napamirškėt, kū sava .css ėr .js poslapē nauduo pavadėnėma mažuosiomės raidiemis, pvz., Nauduotuos:Foo/vector.css, o ne Nauduotuos:Foo/Vector.css.",
+'updated' => '(AtnaujÄ—nta)',
+'note' => "'''Pastebiejims:'''",
+'previewnote' => "'''NepamÄ—rÅ¡kÄ—t, kÅ« tas tÄ—ktÄs pervaiza, pakeitÄ—mÄ da nier Ä—Å¡sauguotÄ—!'''",
+'previewconflict' => 'Å Ä—ta parvaiza paruod teksta Ä—Å¡ vÄ—rÅ¡otinÄ—jÄ— teksta redagavÄ—ma lauka tÄ“p, kÄp ans bus ruodoms, jei pasirinksÄ—t anÅ« Ä—Å¡sauguotÄ—.',
+'session_fail_preview' => "'''Atsiprašuom! Mes nagalėm vīkdītė Tamstas keitėma diel sesėjės doumenū praradima.
+PraÅ¡uom pamiegintÄ— vielÄ“k. Jei Å¡Ä—tÄ napaded, pamieginkÄ—t atsÄ—jongtÄ— Ä—r prÄ—sÄ—jongtÄ— atgal.'''",
+'session_fail_preview_html' => "'''Atsėprašuom! Mes nagalėm apdoroutė Tamstas keitėma diel sesėjės doumenū praradėma.'''
+''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',
+'editingsection' => 'Taisuoms $1 (skÄ—rsnelis)',
+'editingcomment' => 'Taisuoms $1 (naus skīrius)',
+'editconflict' => 'Ä–Å¡preskÄ—t kuonflÄ—kta: $1',
+'explainconflict' => "Kažėn kas kÄ—ts jau pakeitÄ— poslapi nÅ« tuo Äiesa, kumet Tamsta pradiejuot ana redagoutÄ—.
+VÄ—rÅ¡otÄ—niamÄ— tekstÄ—niamÄ— laukÄ— pateikta Å¡Ä—tu Äiesu esontÄ— poslapÄ— versÄ—jÄ—.
+Tamstas pakeitÄ—mÄ pateiktÄ— žemiau esontiamÄ— laukÄ—.
+TamstÄ rÄ“k sojongtÄ— Tamstas pakeitÄ—mus so esontÄ— versÄ—jÄ—.
+Kumet paspausÄ—te „{{int:savearticle}}“, bus iraÅ¡Ä«ts '''tÄ—ktÄs''' teksts vÄ—rÅ¡otÄ—niam tekstÄ—niam laukÄ—.",
+'yourtext' => 'Tamstas teksts',
+'storedversion' => 'Ä–Å¡sauguota versÄ—jÄ—',
+'editingold' => "'''ISPIEJIMS: Tamsta keitat ne naujausÄ— poslapÄ— versÄ—jÄ—.
+JÄ“go Ä—Å¡sauguosÄ—t sava pakeitÄ—mus, paskum darÄ«tÄ— pakeitÄ—mÄ prapols.'''",
+'yourdiff' => 'SkÄ—rtomÄ',
+'copyrightwarning' => "Primenam, kÅ« vÄ—sks, kas patenk i {{SITENAME}}, Ä«r laikuoma pavÄ—iÅ¡Ä—nto palÄ“ $2 (platiau - $1). JÄ“go nenuorit, kÅ« Tamstas duovis bÅ«tou ba pasÄ—gailiejÄ—ma keitams Ä— platÄ—nams, neraÅ¡Ä«kÄ—t ÄÄ—.<br />
+Tamsta tēpuogi pasėžadat, kū tas īr Tamstas patėis rašīts torėnīs a kuopėjouts ėš vėišū a panašiū valnū šaltėniu.
+'''NEKOPĖJOUKĖT AUTUORĖNIEM TEISIEM APSAUGUOTU DARBŪ BA LEIDĖMA!'''",
+'copyrightwarning2' => "Primenam, kÅ« vÄ—sks, kas patenk i {{SITENAME}} gal bÅ«tÄ— keitama, perdaruoma, a paÅ¡alÄ—nama kÄ—tÅ« nauduotuoju. JÄ“go nenuorÄ—t, kÅ« Tamstas duovis bÅ«tu ba pasÄ—gailiejÄ—ma keitams, ÄiuonÄs neraÅ¡Ä«kÄ—t.<br />
+Tēpuogi Tamsta pasėžadat, kū tas īr Tamstas rašīts teksts aba kuopėjouts
+ėš vėišū liousū šaltėniu (detaliau - $1).
+'''NEKUOPĖJOUKAT AUTUORĖNIEM TEISIEM APSAUGUOTU DARBŪ BA LEIDĖMA!'''",
+'readonlywarning' => "'''DIEMESÄ–: DoumenÅ« bazÄ— bova ožrakÄ—nta teknÄ—nÄ“ pruofilaktÄ—kÄ,
+tudie negaliesÄ—t Ä—Å¡sauguotÄ— sava pakeitÄ—mu daba. Tamsta galÄ—t nosÄ—kopÄ—joutÄ— teksta i tekstÄ—ni faila
+Ä— paskum ikeltÄ— ana ÄÄ—.'''",
+'protectedpagewarning' => "'''DIEMESĖ: Šėts poslapis īr ožrakints ėr anū redagoutė gal tėk admėnėstratuorė teises torėntīs prietelē.'''",
+'semiprotectedpagewarning' => "'''PastebiejÄ—ms:''' Å Ä—ts poslapis bova ožrakÄ—nts Ä—r anuo gal redagoutÄ— tÄ—k regÄ—stroutÄ— nauduotojÄ.",
+'titleprotectedwarning' => "'''DIEMESÄ–: Tas poslapis bova ožrakÄ—nts tÄ“p, ka tÄ—ktÄs kÄpkatrÄ— nauduotuojÄ“ galietu ana sokortÄ—.'''",
+'templatesused' => '{{PLURAL:$1|Å abluons|Å abluonÄ}}, katrÄ—i Ä«r nauduojamÄ— poslapÄ«:',
+'templatesusedpreview' => '{{PLURAL:$1|Å abluons|Å abluonÄ}}, nauduotÄ— Å¡Ä—tuo parvaizuo:',
+'templatesusedsection' => 'Å abluonÄ, nauduotÄ— Å¡Ä—tom skÄ—rsnelÄ«:',
+'template-protected' => '(apsauguots)',
+'template-semiprotected' => '(posiau apsauguots)',
+'hiddencategories' => 'Tas poslapis prÄ—klausa $1 {{PLURAL:$1|pakavuotÄ kateguorÄ—jÄ“|pakavuotoms kateguorÄ—jÄ—ms|pakavuotu kateguorÄ—ju}}:',
+'nocreatetitle' => 'Poslapiu kūrims aprėbuots',
+'nocreatetext' => '{{SITENAME}} aprėbuojė galėmībe kortė naujus poslapius.
+Tamsta galÄ—t grīžtÄ— Ä— redagoutÄ— nÅ«nÄ esonti poslapi, a [[Special:UserLogin|prÄ—sÄ—jongtÄ— a sokortÄ— paskÄ«ra]].',
+'permissionserrors' => 'Teisiu klaida',
+'permissionserrorstext' => 'Tamsta netorėt teisiu šėta darītė diel {{PLURAL:$1|tuos prīžastėis|tū prīžastiū}}:',
+'permissionserrorstext-withaction' => 'Tamsta netorėt leidėma $2 dielē {{PLURAL:$1|tos prīžastėis|tū prīžastiu}}:',
+'recreate-moveddeleted-warn' => "'''DiemesÄ—: Tomsta atkoriat poslapi, katros onkstiau bova Ä—Å¡trints.'''
+
+Tomsta torėt nosprēst, a pritėnk tuoliau redagoutė šėta poslapi.
+Å Ä—ta poslapÄ— Å¡alÄ—nÄ—mu istuorÄ—jÄ— Ä«r pateikta patuogoma vardan:",
+'moveddeleted-notice' => 'Tas poslapis bova Ä—Å¡trÄ—nts.
+Ä–Å¡trÄ—nta poslapÄ— versÄ—ju sÄraÅ¡os Ä«r pateikts paveiziejÄ—mŠžemiau.',
+'edit-conflict' => 'RedagavÄ—ma kuonflÄ—ktos',
+
+# "Undo" feature
+'undo-success' => 'Keitėms gal būtė atšaukts. Prašuom patėkrėntė palīgėnėma, asonti žemiau, kū patvėrtėntomiet, kū Tamsta šėta ė nuorėt padarītė, ė tumet ėšsauguokit pakeitėmos, asontios žemiau, kū ožbėngtomiet keitėma atšaukėma.',
+'undo-failure' => 'Keitėms nagal būt atšaukts diel konflėktounantiu tarpėniu pakeitėmu.',
+'undo-summary' => 'Atšauktė [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarėms]]) versėje $1',
+
+# Account creation failure
+'cantcreateaccount-text' => "Paskīrū kūrėma ėš šėta IP adresa ('''$1''') ožbluokava [[User:$3|$3]].
+
+$3 nuruodīta prīžastis īr ''$2''",
+
+# History pages
+'viewpagelogs' => 'RuodÄ«tÄ— Å¡Ä—tuo poslapÄ— specÄ“liÅsios vaiksmos',
+'nohistory' => 'Å Ä—ts poslapis netor keitÄ—mu istuorÄ—jÄ—s.',
+'currentrev' => 'DabartÄ—nÄ— versÄ—jÄ—',
+'currentrev-asof' => 'DabartÄ—nÄ— $1 versÄ—jÄ—',
+'revisionasof' => '$1 versÄ—jÄ—',
+'revision-info' => '$1 versÄ—jÄ— nauduotuojÄ— $2',
+'previousrevision' => 'â†OnkstesnÄ— versÄ—jÄ—',
+'nextrevision' => 'Paskesnė versėjė→',
+'currentrevisionlink' => 'DabartÄ—nÄ— versÄ—jÄ—',
+'cur' => 'dab',
+'next' => 'kÄ—ts',
+'last' => 'pask',
+'page_first' => 'pÄ—rm',
+'page_last' => 'pask',
+'histlegend' => "SkÄ—rtomÄ terp versÄ—ju: pažīmiekit lÄ«ginamas versÄ—jÄ—s Ä— spauskÄ—t ''Enter'' klavÄ—Å¡a a mÄ«gtuka apatiuo.<br />
+ŽīmiejimÄ: (dab) = palÄ«ginims so vielibiausÄ— versÄ—jÄ—,
+(pask) = palīginims so priš ta bovosia versėjė, S = mažos pataisims.",
+'history-fieldset-title' => 'Naršītė istuorėjuo',
+'histfirst' => 'SeniausÄ—',
+'histlast' => 'VielibÄ—Ì…jÄ—',
+'historysize' => '($1 {{PLURAL:$1|baits|baitÄ|baitu}})',
+'historyempty' => '(nieka nier)',
+
+# Revision feed
+'history-feed-title' => 'VersÄ—ju istuorÄ—jÄ—',
+'history-feed-item-nocomment' => '$1 $2',
+'history-feed-empty' => 'Prašuoms poslapis nēgzėstuo.
+Ans galiejė būtė ėštrėnts ėš pruojekta, aba parvardėnts.
+Pamiegīkėt [[Special:Search|ėiškoutė pruojektė]] sosėjosiu naujū poslapiu.',
+
+# Revision deletion
+'rev-delundel' => 'ruodītė/kavuotė',
+'revisiondelete' => 'TrintÄ—/atkortÄ— versÄ—jÄ—s',
+'logdelete-selected' => "{{PLURAL:$2|PasÄ—rinkts|PasÄ—rinktÄ—|PasÄ—rinktÄ—}} '''$1''' istuorÄ—jÄ—s {{PLURAL:$2|atÄ—tÄ—kims|atsÄ—tÄ—kimÄ|atsÄ—tÄ—kimÄ}}:",
+'revdelete-text' => "'''Ä–Å¡trintuos versÄ—jÄ—s Ä—r ivÄ«kÄ“ vistÄ—ik da bus ruodomÄ— poslapÄ— istuorÄ—juo Ä—r specÄ“liÅ«ju veiksmÅ« istuorÄ—juo, no anÅ« torÄ—nÄ— dalÄ«s nabus vÄ—iÅ¡Ä pasÄ—ikiamos.'''
+KÄ—tÄ— admÄ—nÄ—stratuorÄ“ Å¡Ä—tom pruojekte vÄ—sdar galÄ—s pasÄ—iktÄ— pasliepta torÄ—ni Ä—r galÄ—s ana atkortÄ— viel par Å¡Ä—ta pate sasaja, nabent Ä«r nostatÄ«tÄ— papÄ—lduomÄ— aprÄ—buojÄ—mÄ.",
+'revdelete-unsuppress' => 'Å alÄ—ntÄ— apribuojÄ—mos atkortuos versÄ—jÄ—s',
+'logdelete-logentry' => 'pakeists [[$1]] atsÄ—tÄ—kima veiziemoms',
+'revdel-restore' => 'KeistÄ— veizÄ—muma',
+'revdelete-edit-reasonlist' => 'Keistė trīnėma prīžastis',
+
+# Suppression log
+'suppressionlog' => 'Trīnėma istuorėjė',
+
+# History merging
+'mergehistory-success' => '$3 [[:$1]] versÄ—ju siekmÄ—ngÄ sojongta so [[:$2]].',
+
+# Merge log
+'revertmerge' => 'AtskÄ—rtÄ—',
+
+# Diffs
+'history-title' => 'Poslapė „$1“ istuorėjė',
+'difference' => '(SkÄ—rtomÄ terp versÄ—ju)',
+'lineno' => 'EilotÄ— $1:',
+'compareselectedversions' => 'Palīgintė pasėrinktas versėjės',
+'editundo' => 'atšauktė',
+'diff-multi' => '($1 {{PLURAL:$1|tarpÄ—nis keitÄ—ms nier ruoduoms|tarpÄ—nÄ“ keitÄ—mÄ nier ruoduomÄ—|tarpÄ—niu keitÄ—mu nier ruoduoma}}.)',
+
+# Search results
+'searchresults' => 'PaÄ—iÅ¡kuos rezoltatÄ',
+'searchresults-title' => 'PaÄ—iÅ¡kuos rezoltatÄ "$1"',
+'searchresulttext' => 'Daugiau infuormacėjės aple paėiška pruojektė {{SITENAME}} rasėt [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Tamsta ėiškuojot \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|vėsė poslapē katrėi prasėded so "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|vėsė poslapē katrėi ruod i "$1"]])',
+'searchsubtitleinvalid' => 'Jėškuom „$1“',
+'titlematches' => 'Straipsniu pavadėnėmu atitėkmenīs',
+'notitlematches' => 'Juokiū pavadinėma atitikmenū',
+'textmatches' => 'Poslapė torėnė atėtikmenīs',
+'notextmatches' => 'Juokiū poslapė teksta atitikmenū',
+'prevn' => 'onkstesnius {{PLURAL:$1|$1}}',
+'nextn' => 'paskesnius {{PLURAL:$1|$1}}',
+'viewprevnext' => 'VeizÄ—tÄ— ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'PaÄ—iÅ¡kuos nustatÄ«mÄ',
+'searchmenu-exists' => "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
+'searchmenu-new' => "'''Sokortė poslapi „[[:$1]]“ šėtuo wiki!'''",
+'searchhelp-url' => 'Help:Torėnīs',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ėiškuotė poslapiu so šėtuom prīšdielio]]',
+'searchprofile-articles' => 'Torėnė poslapē',
+'searchprofile-project' => 'Pruojėkta poslapē',
+'searchprofile-images' => 'FailÄ',
+'searchprofile-everything' => 'VÄ—sks',
+'searchprofile-advanced' => 'Prapliesta',
+'searchprofile-articles-tooltip' => 'Ä–iÅ¡kuotÄ— ÄiuonÄs: $1',
+'searchprofile-project-tooltip' => 'Ä–iÅ¡kuotÄ— ÄiuonÄs: $1',
+'searchprofile-images-tooltip' => 'Ėiškuotė failu',
+'searchprofile-everything-tooltip' => 'Ėiškuotė vėsuo torėnė (tuom patėm ėr aptarėma poslapiu)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 žuodis|$2 žuodē|$2 žuodiu}})',
+'search-result-score' => 'TÄ—nkamoms: $1%',
+'search-redirect' => '(paradresavÄ—ms $1)',
+'search-section' => '(skīrios $1)',
+'search-suggest' => 'Mažo nuoriejot $1',
+'search-interwiki-caption' => 'DokterÄ—nÄ“ pruojektÄ',
+'search-interwiki-default' => '$1 rezoltatÄ:',
+'search-interwiki-more' => '(daugiau)',
+'search-mwsuggest-enabled' => 'so pasiÅ«lÄ«mÄs',
+'search-mwsuggest-disabled' => 'nie pasiūlīmu',
+'search-relatedarticle' => 'SosÄ—jÄ—n',
+'mwsuggest-disable' => 'Kavuotė AJAX pasiūlīmus',
+'searchrelated' => 'sosÄ—jÄ—n',
+'searchall' => 'vÄ—sÄ—',
+'showingresults' => "Žemiau ruodoma lėgė '''$1''' {{PLURAL:$1|rezoltata|rezoltatu|rezoltatu}} pradedont #'''$2'''.",
+'showingresultsnum' => "Žemiau ruodoma '''$3''' {{PLURAL:$3|rezoltata|rezoltatu|rezoltatu}} pradedant #'''$2'''.",
+'nonefound' => "'''PastebiejÄ—ms''': PalÄ“ nutÄ«liejÄ—ma Ä—iÅ¡kuoma tÄ—ktÄs kÄp katruosÄ— vardÅ« srÄ—tÄ«sÄ—. PamiegÄ«kÄ—t priraÅ¡Ä«tÄ— prÄ—iÅ¡dieli ''all:'', jÄ“go nuorÄ—t Ä—iÅ¡kiuotÄ— vÄ—sa torÄ—nÄ— (tamÄ— tarpÄ— aptarÄ—ma poslapius, Å¡abluonus Ä— tÄ“p tuoliau), aba nauduokÄ—t nuorÄ—ma vardÅ« srÄ—ti kÄp prÄ—iÅ¡dieli.",
+'search-nonefound' => 'Nier rezoltatu, katrėi atitėktu ožklausėma.',
+'powersearch' => 'Ėiškuotė',
+'powersearch-legend' => 'Prapliesta paėiška',
+'powersearch-ns' => 'Ėiškoutė vardū srėtīsė:',
+'powersearch-redir' => 'ItrauktÄ— paradresavÄ—mus',
+'powersearch-field' => 'Ėiškoutė',
+'search-external' => 'Ėšuorėnė paėiška',
+
+# Quickbar
+'qbsettings' => 'GreitasÄ pasÄ—rÄ—nkÄ—ms',
+'qbsettings-none' => 'Neruodītė',
+
+# Preferences page
+'preferences' => 'NustatÄ«mÄ',
+'mypreferences' => 'Mona nustatÄ«mÄ',
+'prefs-edits' => 'KeitÄ—mu skaitlius:',
+'prefsnologin' => 'NaprisÄ—jongis',
+'prefsnologintext' => 'TamstÄ rÄ“k bÅ«tÄ— <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} prisÄ—jongosam]</span>, kÅ« galietomiet keistÄ— sava nustatÄ«mus.',
+'changepassword' => 'Pakeistė slaptažuodė',
+'prefs-skin' => 'Ä–Å¡ruoda',
+'skin-preview' => 'Parveiza',
+'prefs-math' => 'MatematÄ—ka',
+'datedefault' => 'JuokÄ— pasÄ—rÄ—nkÄ—ma',
+'prefs-datetime' => 'Data Ä— Äiesos',
+'prefs-personal' => 'NauduotuojÄ— pruopilis',
+'prefs-rc' => 'VielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ',
+'prefs-watchlist' => 'Keravuojamu sÄraÅ¡os',
+'prefs-watchlist-days' => 'KÄ—ik dÄ—inÅ« ruodÄ«tÄ— keravuojamu sÄraÅ¡Ä—:',
+'prefs-watchlist-days-max' => '(daugiausē 7 dėinas)',
+'prefs-watchlist-edits' => 'KÄ—ik pakeitÄ—mu ruodÄ«tÄ— Ä—Å¡pliestiniam keravuojamu sÄraÅ¡Ä—:',
+'prefs-watchlist-edits-max' => '(dÄ—dliausias skaitlius: 1000)',
+'prefs-misc' => 'IvairÄ— nustatÄ«mÄ',
+'prefs-resetpass' => 'Keistė slaptažuodi',
+'saveprefs' => 'Ä–Å¡sauguotÄ—',
+'resetprefs' => 'Atstatītė nostatīmos',
+'restoreprefs' => 'Atstatītė vėsus numatītūsius nustatīmus',
+'prefs-editing' => 'RedagavÄ—ms',
+'prefs-edit-boxsize' => 'RedagavÄ—ma longa dÄ—doms.',
+'rows' => 'EilotÄ—s:',
+'columns' => 'Štolpalē:',
+'searchresultshead' => 'PaÄ—iÅ¡kuos nostatÄ«mÄ',
+'resultsperpage' => 'Rezoltatu poslapie:',
+'contextlines' => 'Eilotiu rezoltatÄ—:',
+'contextchars' => 'Konteksta sÄ—mbuoliu eilotie:',
+'stub-threshold' => 'Minimums <a href="#" class="stub">nabÄ—ngta poslapÄ—</a> fuormatavÄ—mÅ:',
+'recentchangesdays' => 'Ruodomas dÄ—inas vielÄ«bÅ«ju pakeitÄ—mu sÄraÅ¡Ä—:',
+'recentchangesdays-max' => '(daugiausē $1 {{PLURAL:$1|dėina|dėinū|dėinas}})',
+'recentchangescount' => 'NumatÄ«tasÄ keitÄ—mu skaitlius, ruodoms vielÄ«bÅ«ju keitÄ—mu, poslapiu istuorÄ—jÄ—sÄ— Ä— notÄ—kÄ—mu saraÅ¡Å«sÄ—:',
+'savedprefs' => 'NostatÄ«mÄ siekmÄ—ngÄ Ä—Å¡sauguotÄ—.',
+'timezonelegend' => 'ÄŒiesa zuona',
+'localtime' => 'VÄ—itinis Äiesos:',
+'timezoneuseserverdefault' => 'Nauduotė palē nutīliejėma ėš serverė',
+'timezoneuseoffset' => 'KÄ—ta (patikslÄ—ntÄ— skÄ—rtoma)',
+'timezoneoffset' => 'Skėrtoms¹:',
+'servertime' => 'ServerÄ— Äiesos:',
+'guesstimezone' => 'Paimtė ėš naršīklės',
+'timezoneregion-africa' => 'AfrÄ—ka',
+'timezoneregion-america' => 'AmerÄ—ka',
+'timezoneregion-antarctica' => 'AntarktÄ—da',
+'timezoneregion-asia' => 'AzÄ—jÄ—',
+'timezoneregion-atlantic' => 'Atlanta ondenīns',
+'timezoneregion-australia' => 'AustralÄ—jÄ—',
+'timezoneregion-europe' => 'Euruopa',
+'timezoneregion-indian' => 'Indėjės ondenīns',
+'timezoneregion-pacific' => 'Ramosis ondenīns',
+'allowemail' => 'Lēstė siūstė el. gramuotelės ėš kėtū nauduotuoju',
+'prefs-searchoptions' => 'PaÄ—iÅ¡kuos nustatÄ«mÄ',
+'prefs-namespaces' => 'Vardū srėtīs',
+'defaultns' => 'Palē nutīliejėma ėiškuotė šėtuosė vardū srėtīsė:',
+'default' => 'palē nūtīliejėma',
+'prefs-files' => 'FailÄ',
+'youremail' => 'El. pašts:',
+'username' => 'NauduotuojÄ— vards:',
+'uid' => 'NauduotuojÄ— ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|Gropės|Gropiu}} narīs:',
+'yourrealname' => 'TÄ—kros vards:',
+'yourlanguage' => 'AplÄ—nkuos kalba:',
+'yourvariant' => 'Variants',
+'yournick' => 'Pasėrinkts slapīvardis:',
+'badsig' => 'Neteisings parašas; patėkrinkėt HTML žīmės.',
+'badsiglength' => 'Tamstas parašos īr par ėlgs.
+Ana gal sodarÄ«tÄ— ne daugiau kÄp $1 {{PLURAL:$1|sÄ—mbuolis|sÄ—mbuolÄ“|sÄ—mbuoliu}}.',
+'yourgender' => 'LÄ«tis:',
+'gender-unknown' => 'Nier nuruodīta',
+'gender-male' => 'VÄ«rs',
+'gender-female' => 'MuoterÄ—Å¡ka',
+'email' => 'El. pašts',
+'prefs-help-realname' => 'TÄ—krs vards nier privaluoms, vuo jÄ“go Tamsta ana ivesÄ—t, ons bus nauduojams Tamstas darba pažīmiejÄ—mÅ.',
+'prefs-help-email' => 'El. paÅ¡ta adresos nier privaloms, ale uns leid TamstÄ gautÄ— nauja slaptažuodi, jÄ“go pamÄ—rÅ¡uot kuoks uns bova, Ä— tÄ“puogi Tamsta galÄ—t leistÄ— kÄ—tÄ—ims pasÄ—iktÄ— Tamsta par Tamstas nauduotuojÄ— a nauduotuojÄ— aptarÄ—ma poslapi neatsklÄ—idont Tamstas tapatoma.',
+
+# User rights
+'userrights' => 'Nauduotuoju teisiu valdīms',
+'userrights-lookup-user' => 'Tvarkītė nauduotuojė gropės',
+'userrights-user-editname' => 'IveskÄ—t nauduotuojÄ— varda:',
+'editusergroup' => 'RedagoutÄ— nauduotuojÄ— gropes',
+'editinguser' => "Taisuoms nauduotuos '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'userrights-editusergroup' => 'KeistÄ— nauduotuoju gropes',
+'saveusergroups' => 'SauguotÄ— nauduotuoju gropes',
+'userrights-groupsmember' => 'Narīs:',
+'userrights-reason' => 'Prīžastis:',
+
+# Groups
+'group' => 'GropÄ—:',
+'group-user' => 'Nauduotuojē',
+'group-autoconfirmed' => 'AutuomatÄ—Å¡kÄ patvirtÄ—ntÄ— nauduotuojÄ“',
+'group-bot' => 'BuotÄ',
+'group-sysop' => 'Adminėstratuorē',
+'group-bureaucrat' => 'BiorokratÄ',
+'group-all' => '(vÄ—sÄ—)',
+
+'group-user-member' => 'Nauduotuos',
+'group-bot-member' => 'Buots',
+'group-sysop-member' => 'AdminÄ—stratuorius',
+'group-bureaucrat-member' => 'Biorokrats',
+
+'grouppage-user' => '{{ns:project}}:Nauduotuojē',
+'grouppage-autoconfirmed' => '{{ns:project}}:AutomatÄ—Å¡kÄ patvÄ—rtintÄ— nauduotuojÄ“',
+'grouppage-bot' => '{{ns:project}}:RobuotÄ',
+'grouppage-sysop' => '{{ns:project}}:Adminėstratuorē',
+'grouppage-bureaucrat' => '{{ns:project}}:BiorokratÄ',
+
+# Rights
+'right-read' => 'Skaitītė poslapius',
+'right-edit' => 'KeistÄ— poslapius',
+
+# User rights log
+'rightslog' => 'Nauduotuoju teisiu istuorÄ—jÄ—',
+'rightslogtext' => 'Pateikiams nauduotuoju teisiu pakeitÄ—mu sÄraÅ¡os.',
+'rightslogentry' => 'pakeista $1 gropės narīstė ėš $2 i $3. Sveikėnam!',
+'rightsnone' => '(juokiū)',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'redagoutÄ— ta poslapi',
+'action-undelete' => 'atkortÄ— ta poslapi',
+'action-patrol' => 'pažīmietÄ— kÄ—tÅ« keitÄ—mus kÄp patikrÄ—ntus',
+'action-userrights' => 'keistė vėsū nauduotuoju teises',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|pakeitÄ—ms|pakeitÄ—mÄ|pakeitÄ—mu}}',
+'recentchanges' => 'VielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ',
+'recentchanges-legend' => 'VielÄ«buju pakeitÄ—mu pasÄ—rinkÄ—mÄ',
+'recentchangestext' => 'TamÄ— poslapÄ« Ä«r patÄ«s vielÄ«bÄ—Ì… jÄ— paketÄ—mÄ tom pruojÄ—ktÄ—.',
+'recentchanges-feed-description' => 'Keravuokėt patius vielībiausius pakeitėmus pruojektŠtamė šaltėnī.',
+'rcnote' => "Žemiau Ä«r '''$1''' {{PLURAL:$1|paskotinis pakeitims|paskotinÄ“ pakeitimÄ|paskotiniu pakeitimu}} par $2 {{PLURAL:$2|paskotinÄ—Ì…jÄ— dÄ—ina|paskotÄ—niasÄ—s '''$2''' dÄ—inas|paskotÄ—niuju '''$2''' dÄ—inÅ«}} skaitlioujant nÅ« $4, $5.",
+'rcnotefrom' => 'Žemiau īr pakeitėma pradedant nū <b>$2</b> (ruodom lėgė <b>$1</b> pakeitėmu).',
+'rclistfrom' => 'Ruodītė naujus pakeitėmus pradedant nū $1',
+'rcshowhideminor' => '$1 mažus pakeitėmus',
+'rcshowhidebots' => '$1 robuotus',
+'rcshowhideliu' => '$1 prėsėjongusiūm nauduotuojūm pakeitėmus',
+'rcshowhideanons' => '$1 anuonimÄ—nius nauduotuojus',
+'rcshowhidepatr' => '$1 patikrÄ—ntus pakeitÄ—mus',
+'rcshowhidemine' => '$1 mona pakeitÄ—mus',
+'rclinks' => 'Ruodītė paskotėnius $1 pakeitėmu par paskotėnė̅sēs $2 dėinū<br />$3',
+'diff' => 'skÄ—rt',
+'hist' => 'ist',
+'hide' => 'KavuotÄ—',
+'show' => 'Ruodītė',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'r',
+'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|keravuojontis nauduotuos|keravuojontīs nauduotuojē|keravuojontiu nauduotuoju}}]',
+'rc_categories' => 'Ruodītė tėk šėtas kateguorėjės (atskirkit nauduodamė „|“)',
+'rc_categories_any' => 'BikuokÄ—',
+'newsectionsummary' => '/* $1 */ naus skÄ—rsnelis',
+'rc-enhanced-expand' => 'Ruodītė detales (rēk JavaScript)',
+'rc-enhanced-hide' => 'KavuotÄ— detales',
+
+# Recent changes linked
+'recentchangeslinked' => 'SosÄ—jÄ—n pakeitÄ—mÄ',
+'recentchangeslinked-feed' => 'SosÄ—jÄ—n pakeitÄ—mÄ',
+'recentchangeslinked-toolbox' => 'SosÄ—jÄ—n pakeitÄ—mÄ',
+'recentchangeslinked-title' => 'So $1 sosÄ—je pakeitimÄ',
+'recentchangeslinked-noresult' => 'Nier juokiÅ« pakeitÄ—mu sosÄ—itous poslapious douto Äieso.',
+'recentchangeslinked-summary' => "Å Ä—tom specÄ“liajam poslapi ruodomÄ— vielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ poslapiÅ«s, i katrÅ«s Ä«r nuruodoma. PoslapÄ“ Ä—Å¡ Tamstas [[Special:Watchlist|keravuojamu sÄraÅ¡a]] Ä«r '''pastuorÄ—ntÄ—'''.",
+'recentchangeslinked-page' => 'PoslapÄ— pavadinÄ—ms:',
+'recentchangeslinked-to' => 'Ruodītė so doutu poslapiu sosėjosiu puslapiu pakeitėmus',
+
+# Upload
+'upload' => 'IkeltÄ— faila',
+'uploadbtn' => 'IkeltÄ— faila',
+'reuploaddesc' => 'Sogrīžtė i ikielima fuorma.',
+'uploadnologin' => 'NaprÄ—sÄ—jongis',
+'uploadnologintext' => 'Nuoriedamė ikeltė faila, torėt būt [[Special:UserLogin|prėsėjongis]].',
+'upload_directory_read_only' => 'Tėnklapė serveris nagal rašītė i ikielima papke ($1).',
+'uploaderror' => 'Ikielima soklīdims',
+'uploadtext' => "Nauduokėtės žemiau pateikta skvarma kū ikeltomėt failus.
+NuoriedamÄ— parveizietÄ— ar Ä—iÅ¡kuotÄ— unkstiau ikeltÅ« abruozdieliu, Ä“kÄ—t i [[Special:FileList|ikeltÅ« failu saraÅ¡a]], ikielÄ—mÄ Ä—r Ä—Å¡trÄ«nÄ—mÄ Ä«r ožregÄ—stroujamÄ— [[Special:Log/upload|ikielÄ—mu istuorÄ—juo]], trÄ«nÄ—mÄ - [[Special:Log/delete|trÄ«nÄ—mu istuorÄ—juo]].
+
+Nuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' aba
+* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' tÄ—isiuogÄ—nÄ“ nÅ«ruodÄ i faila.",
+'upload-permitted' => 'LaistÄ—nÄ— failu tÄ—pÄ: $1.',
+'upload-preferred' => 'PageidajamÄ— failu tÄ—pÄ: $1.',
+'upload-prohibited' => 'OždraustÄ— failu tÄ—pÄ: $1.',
+'uploadlog' => 'ikielimu istuorÄ—jÄ—',
+'uploadlogpage' => 'Ikielimu istuorÄ—jÄ—',
+'uploadlogpagetext' => 'Žemiau pateikiam paskotėniu failu ikielima istuorėjė.',
+'filename' => 'Faila vards',
+'filedesc' => 'Kuomentars',
+'fileuploadsummary' => 'Kuomentars:',
+'uploadedfiles' => 'IkeltÄ— failÄ',
+'ignorewarning' => 'NekrÄ—iptÄ— diemiesÄ— i parspiejÄ—ma Ä—r Ä—Å¡auguotÄ— faila vÄ—svÄ—in.',
+'ignorewarnings' => 'NekrÄ—iptÄ— diemesÄ— i vÄ—suokius perspiejimos',
+'minlength1' => 'Faila pavadinėms tor būtė nuors vėina raidie.',
+'illegalfilename' => 'Faila vardė „$1“ īr sėmbuoliu, katrėi nier leidami poslapė pavadinėmūs. Prašuom parvadėntė faila ė miegītė ikeltė ana par naujė.',
+'badfilename' => 'Faila pavadinėms pakeists i „$1“.',
+'filetype-missing' => 'Fails netor galÅ«nÄ—s (kÄp pavÄ«zdÄ«s „.jpg“).',
+'emptyfile' => 'PanaÅ¡u, ka fails, katra ikieliet Ä«r toÅ¡Äias. Tas gal bÅ«tÄ— diel klaiduos faila pavadÄ—nÄ—mÄ—. PasÄ—tÄ—krinkÄ—t a tÄ—krÄ nuorÄ—t ikeltÄ— Å¡Ä—ta faila.',
+'fileexists' => "Fails so tuokiu vardu jau īr, prašuom paveizėtė '''<tt>[[:$1]]</tt>''', jēgo nesat ožtėkrėnts, a nuorit ana parrašītė.
+[[$1|thumb]]",
+'fileexists-extension' => "Fails so pavÄ—diu pavadinÄ—mu jau Ä«r: [[$2|thumb]]
+* Ikeliama faila pavadinÄ—ms: '''<tt>[[:$1]]</tt>'''
+* Jau esontÄ— faila pavadinÄ—ms: '''<tt>[[:$2]]</tt>'''
+Prašuom ėšsėrėnktė kėta varda.",
+'file-exists-duplicate' => 'Tas fails īr {{PLURAL:$1|šėta faila|šėtū failu}} doblėkats:',
+'uploadwarning' => 'DiemesÄ—',
+'savefile' => 'Ä–Å¡sauguotÄ— faila',
+'uploadedimage' => 'ikielė „[[$1]]“',
+'overwroteimage' => 'ikruovė nauja „[[$1]]“ versėjė',
+'uploaddisabledtext' => 'Failu ikielÄ—mÄ oždraustÄ— Ä«r.',
+'uploadscripted' => 'Å Ä—ts failos tor HTML a programÄ—ni kuoda, katros gal bÅ«tÄ— klaidÄ—ngÄ soprasts interneta narÅ¡Ä«klÄ—s.',
+'uploadvirus' => 'Å Ä—tom faile Ä«r virosas! Ä–Å¡samiau: $1',
+'sourcefilename' => 'Ikeliams fails',
+'destfilename' => 'Nuorims faila pavadinims',
+'upload-maxfilesize' => 'DÄ—dliausias faila dÄ—doms: $1',
+'watchthisupload' => 'KeravuotÄ— Å¡Ä—ta poslapÄ—',
+'upload-wasdeleted' => "'''ParspiejÄ—ms: Tamsta ikeliat faila, katros unkstiau bova Ä—Å¡trÄ—nts.'''
+
+Tamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.
+Tuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
+'upload-success-subj' => 'Ikelt siekmÄ—ngÄ',
+
+'upload-proto-error' => 'NateisÄ—ngs protuokols',
+'upload-proto-error-text' => 'Nutuolinē ikielims raikalaun, kū URL prasėdietu <code>http://</code> o <code>ftp://</code>.',
+'upload-file-error' => 'VÄ—dÄ—nÄ— klaida',
+'upload-file-error-text' => 'Ivīka vėdėnė klaida bandont sokortė laikinaji faila serverī. Prašuom sosėsėiktė so sistemuos admėnėstratuoriom.',
+'upload-misc-error' => 'Nažėnuoma ikielėma klaida',
+'upload-misc-error-text' => 'IvÄ«ka nežėnuoma klaida vÄ«kstont ikielÄ—mÅ. PraÅ¡uom patÄ—krÄ—nt, kÅ« URL teisÄ—ngs teipuogi pasÄ—ikiams Ä—r pamiegÄ«kit viel. JÄ“ bieda Ä—Å¡lÄ—ik, sosÄ—sÄ—ikÄ—t so sistemuos admÄ—nÄ—stratuoriom.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Napavīkst pasėiktė URL',
+'upload-curl-error6-text' => 'Pataikts URL nagal būt pasėikts. Prašuom patėkrėntė, kū URL īr teisings ėr svetainė veik.',
+'upload-curl-error28' => 'Par Ä—lgÄ ikeliama',
+'upload-curl-error28-text' => 'AtsakontÄ— svetainÄ— ožtronk par Ä—lgÄ. PatÄ—krÄ—nkÄ—t, a svetainÄ— veik, palaukÄ—t tropoti Ä— vielÄ“ pamiegÄ«kit. Mažo TamstÄ rÄ“ktu pamiegÄ«tÄ— ne tuokio apkrauto Äieso.',
+
+'license' => 'LicensÄ—jÄ—',
+'license-header' => 'LicensÄ—jÄ—',
+'nolicense' => 'NepasÄ—rÄ—nkt',
+'license-nopreview' => '(Parveiza negalÄ—ma)',
+'upload_source_url' => ' (tÄ—krs, vÄ—iÅ¡Ä priÄ—inams URL)',
+'upload_source_file' => ' (fails Tamstas kompioterī)',
+
+# Special:ListFiles
+'listfiles-summary' => 'Tas specēlus poslapis ruod vėsus ikeltus failus.
+PalÄ“ numatÄ«ma paskiausÄ“ ikeltÄ— failÄ Ä«r ruoduomÄ— sÄroÅ¡a vÄ—rÅ¡ou.
+Paspaude ont štolpelė ontraštės pakeisėt ėšruokavėma.',
+'imgfile' => 'fails',
+'listfiles' => 'Failu sÄraÅ¡os',
+'listfiles_name' => 'PavadinÄ—ms',
+'listfiles_user' => 'Nauduotuos',
+'listfiles_size' => 'DÄ—doms',
+'listfiles_description' => 'Aprašīms',
+'listfiles_count' => 'VersÄ—jÄ—s',
+
+# File description page
+'file-anchor-link' => 'Fails',
+'filehist' => 'AbruozdielÄ— istuorÄ—jÄ—',
+'filehist-help' => 'PaspauskÄ—t ont datas/Äiesa, ka paveizietomÄ—t faila tuoki, kokis ons bova tÅ« Äiesu.',
+'filehist-deleteall' => 'trintÄ— vÄ—sus',
+'filehist-deleteone' => 'trintÄ— Å¡Ä—ta',
+'filehist-revert' => 'sogÅžėntÄ—',
+'filehist-current' => 'dabartÄ—nis',
+'filehist-datetime' => 'Data/ÄŒiesos',
+'filehist-thumb' => 'Miniatiūra',
+'filehist-thumbtext' => 'Versėjės $1 miniatiūra',
+'filehist-user' => 'Nauduotuos',
+'filehist-dimensions' => 'MierÄ',
+'filehist-filesize' => 'Faila dÄ—doms',
+'filehist-comment' => 'Kuomentars',
+'imagelinks' => 'Faila nūruodas',
+'linkstoimage' => '{{PLURAL:$1|Šėts poslapis|Šėtė poslapē}} nuruod i šėta faila:',
+'nolinkstoimage' => 'I faila neruod anÄ—juoks poslapis.',
+'sharedupload' => 'Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.',
+'uploadnewversion-linktext' => 'IkeltÄ— nauja faila versÄ—je',
+
+# File reversion
+'filerevert' => 'SogrÅžėntÄ— $1',
+'filerevert-legend' => 'Faila sogrÅžinÄ—ms',
+'filerevert-intro' => '<span class="plainlinks">Tamsta grÅžėnat \'\'\'[[Media:$1|$1]]\'\'\' i versÄ—je $4 ($2, $3).</span>',
+'filerevert-comment' => 'Kuomentars:',
+'filerevert-submit' => 'GrÅžėntÄ—',
+
+# File deletion
+'filedelete' => 'TrintÄ— $1',
+'filedelete-legend' => 'TrintÄ— faila',
+'filedelete-intro' => "Tamsta roušeties ėštrėntė faila '''[[Media:$1|$1]]''' so vėsa anuo istuorėjė.",
+'filedelete-comment' => 'Prīžastis:',
+'filedelete-submit' => 'TrintÄ—',
+'filedelete-success' => "'''$1''' bova Ä—Å¡trints.",
+'filedelete-nofile' => "'''$1''' nēsa.",
+'filedelete-otherreason' => 'Kėta/papėlduoma prīžastis:',
+'filedelete-reason-otherlist' => 'Kėta prīžastis',
+'filedelete-reason-dropdown' => '*Dažnas trīnėma prīžastīs
+** AutorÄ«stÄ—s teisiu pažeidÄ—mÄ
+** PasÄ—kartuojontis fails',
+'filedelete-edit-reasonlist' => 'Keistė trīnėma prīžastis',
+
+# MIME search
+'mimesearch' => 'MIME paėiška',
+'mimesearch-summary' => 'Šėts poslapis laid ruodīti failus vagol anū MIME tipa. Iveskėt: torėnėtips/potipis, pvz. <tt>image/jpeg</tt>.',
+'mimetype' => 'MIME tips:',
+'download' => 'parsėsiūstė',
+
+# Unwatched pages
+'unwatchedpages' => 'Nekeravuojėmė poslapē',
+
+# List redirects
+'listredirects' => 'ParadresavÄ—mu sÄraÅ¡os',
+
+# Unused templates
+'unusedtemplates' => 'NenauduojamÄ— Å¡abluonÄ',
+'unusedtemplatestext' => 'Å Ä—ts poslapis ruod sÄraÅ¡a poslapiu, esontiu Å¡abluonu vardÅ« srÄ—tÄ«, katrÄ— nÄ— iterptÄ— i juoki kÄ—ta poslapi. NepamÄ—rÅ¡kÄ—t patÄ—krÄ—ntÄ— kÄ—tÅ« nÅ«ruodu priÅ¡ anÅ«s Ä—Å¡trÄ—nont.',
+'unusedtemplateswlh' => 'kėtas nūruodas',
+
+# Random page
+'randompage' => 'Bikuoks poslapis',
+'randompage-nopages' => 'Šėtuo vardū srėti nier anėjuokiu poslapiu.',
+
+# Random redirect
+'randomredirect' => 'Bikuoks paradresavÄ—ms',
+'randomredirect-nopages' => 'Šėtuo vardū srėti nier anėjuokiū paradresavėmu.',
+
+# Statistics
+'statistics' => 'StatÄ—stÄ—ka',
+'statistics-header-pages' => 'Poslapiu statÄ—stÄ—ka',
+'statistics-header-edits' => 'RedagavÄ—mu statÄ—stÄ—ka',
+'statistics-header-views' => 'Parveizu statistÄ—ka',
+'statistics-header-users' => 'Nauduotuoju statÄ—stÄ—ka',
+'statistics-articles' => 'Torėnė poslapē',
+'statistics-pages' => 'Poslapē',
+'statistics-files' => 'IkeltÄ— failÄ',
+'statistics-edits' => 'Poslapiu redagavėmu skaitlius nū {{SITENAME}} sokūrėma',
+'statistics-edits-average' => 'VÄ—dotÄ—nis keitÄ—mu skaitlius poslapiÅ',
+'statistics-users' => 'Ožsėregėstravosiu [[Special:ListUsers|nauduotuoju]]',
+'statistics-users-active' => 'Aktīviu nauduotuoju',
+'statistics-mostpopular' => 'Daugiausē ruodītė poslapē',
+
+'disambiguations' => 'Daugiareikšmiu žuodiu poslapē',
+
+'doubleredirects' => 'DvÄ—gobÄ— paradresavÄ—mÄ',
+'doubleredirectstext' => 'TÄ—i paradresavÄ—mÄ ruod i kÄ—tus paradresavÄ—ma poslapius. Kuožnuo eilotÄ“ pamÄ—navuots pÄ—rmasÄ Ä—r ontrasÄ paradresavÄ—mÄ, tÄ“puogi ontrojÄ— paradresavÄ—ma paskÄ—rtis, katra paprastÄ Ä— paruod i tÄ—kraji poslapi, i katra pÄ—rmasÄ paradresavÄ—ms Ä— torietu ruodÄ«tÄ—.',
+'double-redirect-fixed-move' => '[[$1]] bova parkelts, daba tas Ä«r paradresavÄ—ms i [[$2]]',
+
+'brokenredirects' => 'NeveikiantÄ«s paradresavÄ—mÄ',
+'brokenredirectstext' => 'Žemiau ėšvardintė paradresavėma poslapē ruod i nasontius poslapius:',
+'brokenredirects-edit' => 'redagoutÄ—',
+'brokenredirects-delete' => 'trintÄ—',
+
+'withoutinterwiki' => 'Poslapē ba kalbū nūruodu',
+'withoutinterwiki-summary' => 'Šėtė poslapē neruod i kėtū kalbū versėjės:',
+'withoutinterwiki-submit' => 'Ruodītė',
+
+'fewestrevisions' => 'Straipsnē so mažiausė pakeitėmu',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|baits|baitÄ|baitu}}',
+'ncategories' => '$1 {{PLURAL:$1|kateguorÄ—jÄ—|kateguorÄ—jÄ—s|kateguorÄ—ju}}',
+'nlinks' => '$1 {{PLURAL:$1|nūruoda|nūruodas|nūruodu}}',
+'nmembers' => '$1 {{PLURAL:$1|narīs|narē|nariū}}',
+'nrevisions' => '$1 {{PLURAL:$1|pakeitÄ—ms|pakeitÄ—mÄ|pakeitÄ—mu}}',
+'nviews' => '$1 {{PLURAL:$1|paruodÄ«ms|paruodÄ«mÄ|paruodÄ«mu}}',
+'specialpage-empty' => 'Å Ä—tÄ ataskaitÄ nie rezoltatu.',
+'lonelypages' => 'Vėinišė straipsnē',
+'lonelypagestext' => 'I šėtuos poslapius nier nūruodu ėš kėtū šėta pruojekta poslapiu.',
+'uncategorizedpages' => 'Poslapē, napriskėrtė juokē kateguorėjē',
+'uncategorizedcategories' => 'Kateguorėjės, naprėskėrtas juokē kateguorėjē',
+'uncategorizedimages' => 'Abruozdielē, nepriskėrtė juokē kateguorėjē',
+'uncategorizedtemplates' => 'Å abluonÄ, nepriskÄ—rtÄ— juokÄ“ kateguorÄ—jÄ“',
+'unusedcategories' => 'Nenauduojamas kateguorÄ—jÄ—s',
+'unusedimages' => 'NenauduojamÄ— failÄ',
+'wantedcategories' => 'NuorÄ—miausÄ—s kateguorÄ—jÄ—s',
+'wantedpages' => 'Nuorėmiausē poslapē',
+'wantedfiles' => 'NuorÄ—mÄ— failÄ',
+'wantedtemplates' => 'NuorÄ—mÄ— Å¡abluonÄ',
+'mostlinked' => 'Daugiausē ruodomė straipsnē',
+'mostlinkedcategories' => 'Daugiausē ruodomas kateguorėjės',
+'mostlinkedtemplates' => 'DaugiausÄ“ ruodomÄ— Å¡abluonÄ',
+'mostcategories' => 'Straipsnē so daugiausē kateguorėju',
+'mostimages' => 'Daugiausē ruodomė abruozdielē',
+'mostrevisions' => 'Straipsnē so daugiausē keitėmu',
+'prefixindex' => 'Vėsė poslapē so prīšdielio',
+'shortpages' => 'Trompiausė poslapē',
+'longpages' => 'Ėlgiausė poslapē',
+'deadendpages' => 'Straipsnē-aklavėitės',
+'deadendpagestext' => 'Tė poslapē netor nūruodu i kėtus poslapius šėtom pruojektė.',
+'protectedpages' => 'Apsauguotė poslapē',
+'protectedpagestext' => 'Šėtē poslapē īr apsauguotė nū parkielėma a redagavėma',
+'protectedpagesempty' => 'Å Ä—tu Äiesu nier apsauguots anÄ—juoks fails so Å¡Ä—tÄs parametrÄs.',
+'protectedtitles' => 'ApsauguotÄ— pavadinÄ—mÄ',
+'protectedtitlesempty' => 'Å Ä—tou Äieso nier anÄ—juokÄ— pavadinÄ—ma, katros apsauguots tÄs parametrÄs.',
+'listusers' => 'SÄraÅ¡os nauduotuoju',
+'listusers-editsonly' => 'RuodÄ«tÄ— tÄ—ktÄs nauduotuojus katrÄ—i Ä«r atlÄ—kÄ— pakeitÄ—mus',
+'newpages' => 'Naujausė straipsnē',
+'newpages-username' => 'NauduotuojÄ— vards:',
+'ancientpages' => 'Seniausė poslapē',
+'move' => 'ParvadintÄ—',
+'movethispage' => 'ParvadintÄ— Å¡Ä—ta poslapi',
+'unusedimagestext' => 'Primenam, kÅ« kÄ—tas svetainÄ—s gal bÅ«tÄ— nuruodiosÄ—s i abruozdieli tÄ—isiogÄ—niu URL, no vÄ—stÄ—ik gal bÅ«tÄ— Å¡Ä—tom sÄraÅ¡Ä—, nuors Ä—r Ä«r aktÄ«vÄ“ naudounams.',
+'unusedcategoriestext' => 'Šėtū kateguorėju poslapē sokortė, nuors juoks kėts straipsnis a kateguorėjė ana nenauduo.',
+'notargettitle' => 'Nenuruodīts objekts',
+'notargettext' => 'Tamsta nenuruodiet nuorima poslapÄ— a nauduotuojÄ—,
+katram ivīkdītė šėta funkcėjė.',
+'pager-newer-n' => '$1 {{PLURAL:$1|paskesnis|paskesni|paskesniū}}',
+'pager-older-n' => '{{PLURAL:$1|senesnis|senesni|senesniū}}',
+
+# Book sources
+'booksources' => 'Knīngu šaltinē',
+'booksources-search-legend' => 'Knīngu šaltiniu paėiška',
+'booksources-go' => 'Ä’k!',
+
+# Special:Log
+'specialloguserlabel' => 'Nauduotuos:',
+'speciallogtitlelabel' => 'PavadÄ—nims:',
+'log' => 'Specēliūju veiksmū istuorėjė',
+'all-logs-page' => 'VÄ—sos istuorÄ—jÄ—s',
+'alllogstext' => 'Bėndra idietu failu, ėštrīnėmu, ožrakėnėmu, bluokavėmu ė prėvėlėju soteikėmu istuorėjė.
+Īr galėmībė somažintė rezoltatu skaitliu patėkslėnont vēksma tėpa, nauduotuojė a sosėjosė poslapė.',
+'logempty' => 'Istuorėjuo nier anėjuokiū atitinkontiu atsėtėkimu.',
+'log-title-wildcard' => 'Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto',
+
+# Special:AllPages
+'allpages' => 'Vėsė straipsnē',
+'alphaindexline' => 'Nu $1 lÄ—g $2',
+'nextpage' => 'KÄ—ts poslapis ($1)',
+'prevpage' => 'Unkstesnis poslapis ($1)',
+'allpagesfrom' => 'Ruodītė poslapius pradedont nu:',
+'allpagesto' => 'RuodÄ«tÄ— poslapius, basÄ—bengÄ—nÄios so:',
+'allarticles' => 'Vėsė straipsnē',
+'allinnamespace' => 'Vėsė poslapē (srėtis - $1)',
+'allnotinnamespace' => 'Vėsė poslapē (nesontīs šiuo srėtie - $1)',
+'allpagesprev' => 'Onkstesnis',
+'allpagesnext' => 'Sekontis',
+'allpagessubmit' => 'Tink',
+'allpagesprefix' => 'Ruodītė poslapios so prīdelēs:',
+'allpagesbadtitle' => 'Douts poslapÄ— pavadÄ—nÄ—ms Ä«r neteisings a tor terpkalbÄ—nÄ— a terppruojektÄ—nÄ— prÄ«dielÄ—. AnamÄ— Ä«r vÄ—ns a kelÄ— žėnklÄ, katrÅ« negal nauduotÄ— pavadÄ—nÄ—mÅ«s.',
+'allpages-bad-ns' => '{{SITENAME}} netor „$1“ vardū srėtėis.',
+
+# Special:Categories
+'categories' => 'KateguorÄ—jÄ—s',
+'categoriespagetext' => 'Pruojekte Ä«r Å¡Ä—tuos kateguorÄ—jÄ—s.
+[[Special:UnusedCategories|Unused categories]] are not shown here.
+Also see [[Special:WantedCategories|wanted categories]].',
+'categoriesfrom' => 'Ruodītė kateguorėjės pradedont nu:',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'PanaikÄ—nts nauduotuojÄ— duovis',
+'deletedcontributions-title' => 'Ä–Å¡trÄ—nts nauduotuojÄ— duovis',
+
+# Special:LinkSearch
+'linksearch' => 'Ėšuorėnės nūruodas',
+'linksearch-ns' => 'Vardū srėtis:',
+'linksearch-ok' => 'Ėiškuotė',
+
+# Special:ListUsers
+'listusersfrom' => 'Ruodītė nauduotuojus pradedont nū:',
+'listusers-submit' => 'Ruodītė',
+'listusers-noresult' => 'Nerast anėjuokiū nauduotuoju.',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Nauduotuojė kūrėma regėstros',
+'newuserlog-byemail' => 'slaptažuodis Ä—Å¡siÅsts par el. paÅ¡ta',
+'newuserlog-create-entry' => 'Naus nauduotuos',
+
+# Special:ListGroupRights
+'listgrouprights' => 'Nauduotuoju gropiu teisÄ—s',
+'listgrouprights-group' => 'GropÄ—',
+'listgrouprights-members' => '(nariÅ« sÄroÅ¡os)',
+
+# E-mail user
+'mailnologin' => 'Nier adresa',
+'mailnologintext' => 'TamstÄ reik bÅ«tÄ— [[Special:UserLogin|prisÄ—jongosiam]]
+ė tor būtė ivests teisings el. pašta adresos Tamstas [[Special:Preferences|nustatīmuos]],
+kÅ« siÅstomiet el. gruomatas kÄ—tÄ—m nauduotuojam.',
+'emailuser' => 'RaÅ¡Ä«tÄ— gruomata Å¡Ä—tam nauduotuojÅ',
+'emailpage' => 'Siūstė el. gruomata nauduotuojui',
+'usermailererror' => 'PaÅ¡ta objekts grÅžėna klaida:',
+'noemailtitle' => 'Nier el. pašta adreso',
+'noemailtext' => 'Šėts nauduotuos nier nuruodės teisėnga el.pašta adresa a īr pasėrinkės negautė el. pašta ėš kėtū nauduotuoju.',
+'email-legend' => 'SiÅ«stÄ— elektruonÄ—ne gruomata kÄ—tam {{SITENAME}} nauduotuojÅ',
+'emailfrom' => 'NÅ«:',
+'emailmessage' => 'Pranešėms:',
+'emailsend' => 'SiÅstÄ—',
+'emailccme' => 'SiÅstÄ— monei mona gruomatas kuopÄ—jÄ—.',
+'emailccsubject' => 'Gruomatas kuopÄ—jÄ— nauduotuojÅ $1: $2',
+'emailsent' => 'El. gruomata Ä—Å¡siÅsta',
+'emailsenttext' => 'Tamstas el. paÅ¡ta žėnotÄ— Ä—Å¡siÅsta.',
+
+# Watchlist
+'watchlist' => 'Keravuojamė straipsnē',
+'mywatchlist' => 'Keravuojamė poslapē',
+'nowatchlist' => 'NetorÄ—t anÄ—vÄ—ina keravuojama poslapÄ—.',
+'watchlistanontext' => 'PraÅ¡uom $1, ka parveizietomÄ—t a pakeistomiet elementus sava keravuojamu sÄraÅ¡Ä—.',
+'watchnologin' => 'NeprisÄ—jongÄ—s',
+'watchnologintext' => 'TamstÄ rÄ“k bÅ«tÄ— [[Special:UserLogin|prisÄ—jongosiam]], ka pakeistomiet sava keravuojamu sÄraÅ¡a.',
+'addedwatch' => 'Pridieta pri keravuojamu',
+'addedwatchtext' => "Poslapis \"[[\$1]]\" idiets i [[Special:Watchlist|keravuojamu sÄraÅ¡a]].
+BÅ«santÄ«s poslapÄ— Ä—r atÄ—tinkama aptarÄ—ma poslapÄ— pakeitÄ—mÄ bus paruoduomÄ— keravuojamu poslapiu sÄraÅ¡Ä—,
+tÄ“puogi bus '''parÄ«Å¡kintÄ—''' [[Special:RecentChanges|vielÄ«bÅ«ju pakeitÄ—mu sÄraÅ¡Ä—]], kÅ« Ä—Å¡sÄ—skÄ—rtom Ä—Å¡ kÄ—tÅ« straipsniu.
+Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"nebkeravuotė\" vėršotėniam meniū.",
+'removedwatch' => 'Pašalėntė ėš keravuojamu',
+'removedwatchtext' => 'Poslapis „[[:$1]]“ paÅ¡alÄ—nts Ä—Å¡ [[Special:Watchlist|Tamstas keravuojamu sÄraÅ¡a]].',
+'watch' => 'KeravuotÄ—',
+'watchthispage' => 'KeravuotÄ— Å¡Ä—ta poslapÄ—',
+'unwatch' => 'NebkeravuotÄ—',
+'unwatchthispage' => 'NustuotÄ— keravuotÄ—',
+'notanarticle' => 'Ne torÄ—nÄ— poslapis',
+'watchnochange' => 'PasÄ—rÄ—nkto Äieso nebova redagouts nÄ— vÄ—ins keravuojams straipsnis.',
+'watchlist-details' => 'Keravuojama $1 {{PLURAL:$1|poslapis|$1 poslapē|$1 poslapiu}} neskaitlioujant aptarėmu poslapiu.',
+'wlheader-enotif' => '* El. paÅ¡ta primÄ—nÄ—mÄ ijongtÄ— Ä«r.',
+'wlheader-showupdated' => "* PoslapÄ“, katrÄ—i pakeistÄ— nu Tamstas paskotÄ—nÄ— apsÄ—lonkÄ—ma Äiesa anÅ«s, Ä«r pažīmietÄ— '''pastuorintÄ'''",
+'watchmethod-recent' => 'tÄ—krÄ—namÄ— vielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ keravuojamiems poslapiams',
+'watchmethod-list' => 'Ėiškuoma vielībūju pakeitėmu keravuojamūs poslapiūs',
+'watchlistcontains' => 'Tamstas kervuojamu sÄraÅ¡Ä— Ä«r $1 {{PLURAL:$1|poslapis|poslapÄ“|poslapiu}}.',
+'wlnote' => "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
+'wlshowlast' => 'Ruodītė paskotėniu $1 adīnu, $2 dėinū a $3 pakeitėmus',
+'watchlist-options' => 'Keravuojamu sÄroÅ¡a pasÄ—rinkÄ—mÄ',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Itraukiama i keravuojamu sÄraÅ¡a...',
+'unwatching' => 'Å alÄ—nama Ä—Å¡ keravuojamu sÄraÅ¡a...',
+
+'enotif_reset' => 'PažīmietÄ— vÄ—sus poslapius kÄp aplonkÄ«tus',
+'enotif_newpagetext' => 'Tas Ä«r naus poslapis.',
+'changed' => 'pakeitÄ—',
+'created' => 'sokūrė',
+'enotif_anon_editor' => 'anuonÄ—minis nauduotuos $1',
+
+# Delete
+'deletepage' => 'TrintÄ— poslapi',
+'confirm' => 'Ožtvėrtinu',
+'excontent' => 'boves torinīs: „$1“',
+'excontentauthor' => 'boves torinÄ«s: „$1“ (redagava tÄ—ktÄs „[[Special:Contributions/$2|$2]]“)',
+'exbeforeblank' => 'priš ėštrinant torinīs bova: „$1“',
+'exblank' => 'poslapis bova tuÅ¡Äes',
+'delete-confirm' => 'Ä–Å¡trÄ—nta "$1"',
+'delete-legend' => 'Trīnėms',
+'historywarning' => 'DiemesÄ—: TrÄ—nams poslapis tor istuorÄ—jÄ—:',
+'confirmdeletetext' => 'Tamsta pasÄ—rÄ—nkuot Ä—Å¡trÄ—ntÄ— poslapi a abruozdieli draugum so vÄ—sa anuo istuorÄ—jÄ—.
+PraÅ¡uom patvÄ—rtÄ—ntÄ—, kÅ« Tamsta tÄ—krÄ nuorÄ—t Å¡Ä—tu padarÄ«tÄ—, žėnuot aple galÄ—mus padarÄ—nius, Ä— kÅ« Tamsta Å¡Ä—tÄ daruot atsėžvelgdamÄ— i [[{{MediaWiki:Policy-url}}|puolitÄ—ka]].',
+'actioncomplete' => 'VÄ“ksmos atlÄ—kts Ä«r',
+'deletedtext' => '„$1“ ėštrints.
+Paskotiniu pašalinėmu istuorėjė - $2.',
+'deletedarticle' => 'ėštrīnė „[[$1]]“',
+'suppressedarticle' => 'apžabuots „[[$1]]“',
+'dellogpage' => 'Pašalinėmu istuorėjė',
+'dellogpagetext' => 'Žemiau Ä«r pateikiams paskotiniu Ä—Å¡trÄ«nimu sÄraÅ¡os.',
+'deletionlog' => 'pašalinėmu istuorėjė',
+'reverted' => 'Atkorta i onkstesne versÄ—je',
+'deletecomment' => 'Prīžastis:',
+'deleteotherreason' => 'Kėta/papėlduoma prižastis:',
+'deletereasonotherlist' => 'Kėta prižastis',
+'deletereason-dropdown' => '*Dažnas trīnėma prižastīs
+** Autorė prašīms
+** Autorėniu teisiu pažeidėms
+** VandalÄ—zmos',
+'delete-edit-reasonlist' => 'Keistė trėnėma prīžastis',
+
+# Rollback
+'rollback' => 'AtmestÄ— pakeitÄ—mos',
+'rollback_short' => 'AtmestÄ—',
+'rollbacklink' => 'atmestÄ—',
+'rollbackfailed' => 'Atmetims napavīka',
+'cantrollback' => 'NegalÄ—ma atmestÄ— redagavÄ—ma; paskotinis keitÄ—s nauduotuos Ä«r tuo poslapÄ— autorius.',
+'alreadyrolled' => 'Nepavīka atmestė paskotėnė [[User:$2|$2]] ([[User talk:$2|Aptarėms]]) darīta straipsnė [[$1]] keitėma;
+kažkas jau pakeitė straipsnė arba sospiejė pėrmiesnis atmestė keitėma.
+
+GalÄ—nis keitÄ—ms dÄ—rbts nauduotuojÄ— [[User:$3|$3]] ([[User talk:$3|AptarÄ—ms]]).',
+'editcomment' => "Redagavėma kuomentars bova: „''$1''“.",
+'revertpage' => 'Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|AptarÄ—ms]]) pakeitÄ—ms; sogrÅžėnta nauduotuojÄ— [[User:$1|$1]] versÄ—jÄ—',
+'rollback-success' => 'AtmestÄ— $1 keitÄ—mÄ; grÅžėnta i paskotÄ—ne $2 versÄ—je.',
+
+# Edit tokens
+'sessionfailure' => 'Atruod kÅ« Ä«r biedÅ« so Tamstas prÄ—sÄ—jongÄ—ma sesÄ—jÄ—; Å¡Ä—ts veiksmos bova atÅ¡aukts kÄp atsargoma prÄ—imonÄ— priÅ¡ sesÄ—jÄ—s vuogÄ—ma.
+Prašoum paspaustė „atgal“ ėr parkrautė poslapi ėš katruo atiejot, ė pamieginkėt vielē.',
+
+# Protect
+'protectlogpage' => 'RakinÄ—mu istuorÄ—jÄ—',
+'protectlogtext' => 'Žemiau Ä«r poslapÄ— ožrakinÄ—mu tÄ“puogi atrakinÄ—mu istuorÄ—jÄ—. NÅ«nÄ veikiantiu poslapiu apsaugÅ« sÄraÅ¡a sorasÄ—t [[Special:ProtectedPages|apsauguotu poslapiu saraÅ¡Ä—]].',
+'protectedarticle' => 'ožrakina „[[$1]]“',
+'modifiedarticleprotection' => 'pakeists „[[$1]]“ apsauguos līgis',
+'unprotectedarticle' => 'atrakėna „[[$1]]“',
+'protect-title' => 'Nustatuoms apsauguojėma līgis poslapiŠ„$1“',
+'prot_1movedto2' => 'Straipsnis [[$1]] parvadints i [[$2]]',
+'protect-legend' => 'Ožrakinėma patvėrtinėms',
+'protectcomment' => 'Prīžastis:',
+'protectexpiry' => 'Beng galiuotÄ—:',
+'protect_expiry_invalid' => 'GaliuojÄ—ma Äiesos Ä«r nateisÄ—ngs.',
+'protect_expiry_old' => 'GaliuojÄ—ma Äiesos Ä«r praÄ—itÄ«.',
+'protect-text' => "Čė Tamsta galėt paveizėtė ė pakeistė apsauguos līgi šėtuo poslapio '''$1'''.",
+'protect-locked-access' => "Tamstas paskīra netor teisiu keistė poslapiu apsauguos līgiu.
+Čė Ä«r dabartÄ—nÄ“ nustatÄ«mÄ poslapiÅ '''$1''':",
+'protect-cascadeon' => 'Tas poslapis nÅ«nÄ Ä«r apsauguots, kadongi ons Ä«r itraukts i {{PLURAL:$1|ta poslapi, apsauguota|tÅ«s poslapiÅ«s, apsauguotus}} „pakuopÄ—nÄ—s apsauguos“ pasÄ—rÄ—nkÄ—mu. Tamsta galÄ—t pakeistÄ— Å¡Ä—ta poslapÄ— apsauguos lÄ«gi, no tas nepaveiks pakuopÄ—nÄ—s apsauguos.',
+'protect-default' => 'LeistÄ— vÄ—sÄ—ms nauduotuojams',
+'protect-fallback' => 'Rēkalautė „$1“ teisės',
+'protect-level-autoconfirmed' => 'Blokoutė naujē prisėregėstravosius ė neregėstroutus nauduotuojus',
+'protect-level-sysop' => 'TÄ—ktÄs adminÄ—stratuorÄ“',
+'protect-summary-cascade' => 'pakuopÄ—nÄ— apsauga',
+'protect-expiring' => 'beng galiuotÄ— $1 (UTC)',
+'protect-expiry-indefinite' => 'nerÄ—buotÄ',
+'protect-cascade' => 'ApsaugotÄ— poslapius, itrauktus i Å¡Ä—ta poslapi (pakuopÄ—nÄ— apsauga).',
+'protect-cantedit' => 'Tamsta negalėt keistė šėta poslapė apsauguojėma līgiu, kagongi netorėt teisiu anuo redagoutė.',
+'protect-othertime' => 'KÄ—ts Äiesos:',
+'protect-othertime-op' => 'kÄ—ts Äiesos',
+'protect-existing-expiry' => 'Esams rakÄ—nÄ—ma ožsÄ—bengÄ—ma Äiesos: $3, $2',
+'protect-otherreason' => 'Kėta/papėlduoma prīžastis:',
+'protect-otherreason-op' => 'kėta/papėlduoma prīžastis',
+'protect-dropdown' => '*Iprastas ožrakinėma prīžastīs
+** Intensīvus vandalėzmos
+** Intensīvus nūruodu reklamavėms
+** Neproduktīvi redagavėma vaina
+** DÄ—dlÄ— svarboma poslapis',
+'protect-edit-reasonlist' => 'Keistė ožrakinėma prīžastis',
+'protect-expiry-options' => '1 adÄ«na:1 hour,1 dÄ—ina:1 day,1 nedielÄ—:1 week,2 nedielÄ—s:2 weeks,1 mienou:1 month,3 mieniesÄ“:3 months,6 mieniesÄ“:6 months,1 metÄ:1 year,par omžius:infinite',
+'restriction-type' => 'LaidÄ—ms:',
+'restriction-level' => 'Aprėbuojėma līgis:',
+'minimum-size' => 'MinÄ—malus dÄ—doms',
+'maximum-size' => 'DÄ—dliausis dÄ—doms',
+'pagesize' => '(baitÄs)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'RedagavÄ—ms',
+'restriction-move' => 'ParvadÄ—nÄ—ms',
+'restriction-create' => 'SokortÄ—',
+'restriction-upload' => 'IkeltÄ—',
+
+# Restriction levels
+'restriction-level-sysop' => 'pÄ—lnÄ apsauguota',
+'restriction-level-autoconfirmed' => 'posiau apsauguota',
+'restriction-level-all' => 'bikuoks',
+
+# Undelete
+'undelete' => 'Atstatītė ėštrinta poslapi',
+'undeletepage' => 'Ruodītė ė atkortė ėštrintos poslapios',
+'viewdeletedpage' => 'Ruodītė ėštrintos poslapios',
+'undeletepagetext' => 'Žemiau ėšvardėntė poslapē īr ėštrėntė, no da laikuomi
+arkÄ«ve, tudie anie gal bÅ«t atstatÄ«tÄ—. ArkÄ«vs gal bÅ«t perÄ“odÄ—Å¡kÄ valuoms.',
+'undeleteextrahelp' => "Nuoriedamė atkortė vėsa poslapi, palikit vėsas varnales napažīmietas ėr
+spauskėt '''''Atkortė'''''. Nuoriedamiė atlėktė pasirėnktini atstatīma, pažīmiekit varnales šėtū versėju, katras nuorietomiet atstatītė, ėr spauskėt '''''Atkortė'''''. Paspaudus
+'''''Ėš naujė''''' bos ėšvalītuos vėsos varnalės ėr kuomentara lauks.",
+'undeleterevisions' => '$1 {{PLURAL:$1|versėjė|versėjės|versėju}} soarkīvouta',
+'undeletehistory' => 'Jē atstatīsėt straipsni, istuorėjuo bos atstatītuos vėsos versėjės.
+Jē puo ėštrīnima bova sokuots straipsnis tuokiuo patio pavadėnėmo,
+atstatītuos versėjės atsiras onkstesnie istuorėjuo, o dabartėnė
+versÄ—jÄ— lÄ—ks napakeista. Atkoriant Ä«r prarondamÄ— apribuojimÄ failu versÄ—juom.',
+'undeleterevdel' => 'AtkorÄ—ms nebus ivÄ«kdÄ«ts, jÄ“ Å¡Ä—tÄ nulems paskotÄ—nÄ—s poslapÄ— versÄ—jÄ—s dalini Ä—Å¡trÄ«nima.
+TuokÄ“s atvejÄs, TamstÄ rÄ“k atžīmietÄ— a atkavuotÄ— naujausÄ“s Ä—Å¡trintas versÄ—jÄ—s.
+Failu versėjės, katrū netorėt teisiu veizėtė, nebus atkortas.',
+'undeletehistorynoadmin' => 'Šėts straipsnis bova ėštrints. Trīnima prižastis
+ruodoma žemiau, teipuogi kas redagava poslapi
+lėgė trīnima. Ėštrintū poslapiu tekstos īr galėmas tėk admėnėstratuoriam.',
+'undelete-revision' => 'Ä–Å¡trÄ—nta $1 versÄ—jÄ—, katra $4 d. $5 padÄ—rba $3:',
+'undeleterevision-missing' => 'Neteisėnga a dėngosė versėjė. Tamsta mažo torėt bluoga nūruoda, a versėjė bova atkorta a pašalėnta ėš arkīva.',
+'undeletebtn' => 'AtkortÄ—',
+'undeletelink' => 'veizietė/atstatītė',
+'undeletereset' => 'Ä–Å¡ naujÄ—',
+'undeleteinvert' => 'ŽīmietÄ— prÄ«Å¡Ä—ngÄ',
+'undeletecomment' => 'Kuomentars:',
+'undeletedarticle' => 'atkorta „[[$1]]“',
+'undeletedrevisions' => 'atkorta $1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}}',
+'undeletedrevisions-files' => 'atkorta $1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}} Ä—r $2 {{PLURAL:$2|fails|failÄ|failu}}',
+'undeletedfiles' => 'atkorta $1 {{PLURAL:$1|fails|failÄ|failu}}',
+'undeletedpage' => "'''$1 bova atkurts'''
+ParveizÄ—kiet [[Special:Log/delete|trÄ«nimu sÄraÅ¡a]], nuoriedamÄ— rastÄ— paskotÄ—niu trÄ«nimu Ä—r atkorÄ—mu sÄraÅ¡a.",
+'undelete-header' => 'Veizėkit [[Special:Log/delete|trīnima istuorėjuo]] paskoteniausē ėštrintū poslapiu.',
+'undelete-search-box' => 'Ėiškuotė ėštrintū poslapiu',
+'undelete-search-prefix' => 'Ruodītė poslapios pradedant so:',
+'undelete-search-submit' => 'Ėiškuotė',
+'undelete-no-results' => 'Nabova rasta juokė atėtėnkontė poslapė ėštrīnima arkīve.',
+'undelete-show-file-confirm' => 'A Ä—Å¡ tÄ—krÄ nuorÄ—t parveizietÄ— Ä—Å¡trÄ—nta faila „<nowiki>$1</nowiki>“ $2 $3 versÄ—jÄ—?',
+'undelete-show-file-submit' => 'TÄ“p',
+
+# Namespace form on various pages
+'namespace' => 'Vardū srėtis:',
+'invert' => 'ŽīmietÄ— prÄ«Å¡Ä—ngÄ',
+'blanknamespace' => '(PagrÄ—ndinÄ—)',
+
+# Contributions
+'contributions' => 'NauduotuojÄ— duovis',
+'contributions-title' => 'NauduotuojÄ— $1 duovis',
+'mycontris' => 'Mona duovis',
+'contribsub2' => 'NauduotuojÄ— $1 ($2)',
+'uctop' => ' (paskotinis)',
+'month' => 'Nu mienÄ—sÄ— (Ä—r onkstiau):',
+'year' => 'Nu metu (Ä—r onkstiau):',
+
+'sp-contributions-newbies' => 'Ruodītė tėk naujū prieteliu duovios',
+'sp-contributions-newbies-sub' => 'Naujuoms paskīruoms',
+'sp-contributions-newbies-title' => 'Nauduotuoju keitÄ—mÄ naujuoms paskÄ«ruoms',
+'sp-contributions-blocklog' => 'BluokavÄ—mu istuorÄ—jÄ—',
+'sp-contributions-deleted' => 'PanaikÄ—nts nauduotuojÄ— duovis',
+'sp-contributions-talk' => 'AptarÄ—ms',
+'sp-contributions-userrights' => 'Nauduotuoju teisiu valdīms',
+'sp-contributions-search' => 'Ėiškuotė duovė',
+'sp-contributions-username' => 'IP adresos a nauduotuojÄ— vards:',
+'sp-contributions-submit' => 'Ėiškuotė',
+
+# What links here
+'whatlinkshere' => 'Sosėjėn straipsnē',
+'whatlinkshere-title' => 'Poslapē, katrėi ruod i "$1"',
+'whatlinkshere-page' => 'Poslapis:',
+'linkshere' => "Šėtė poslapē ruod i '''[[:$1]]''':",
+'nolinkshere' => "I '''[[:$1]]''' nūruodu nier.",
+'nolinkshere-ns' => "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''[[:$1]]'''.",
+'isredirect' => 'nukreipēmasės poslapis',
+'istemplate' => 'iterpims',
+'isimage' => 'abruozdielė nūruoda',
+'whatlinkshere-prev' => '$1 {{PLURAL:$1|onkstesnis|onkstesni|onkstesniū}}',
+'whatlinkshere-next' => '$1 {{PLURAL:$1|kėts|kėtė|kėtū}}',
+'whatlinkshere-links' => '↠nūruodas',
+'whatlinkshere-hideredirs' => '$1 nukreipÄ—mus',
+'whatlinkshere-hidetrans' => '$1 itraukÄ—mus',
+'whatlinkshere-hidelinks' => '$1 nūruodas',
+'whatlinkshere-hideimages' => '$1 abruozdieliu nūruodas',
+'whatlinkshere-filters' => 'FÄ—ltrÄ',
+
+# Block/unblock
+'blockip' => 'Ožblokoutė nauduotuoja',
+'blockip-legend' => 'BlokoutÄ— nauduotuoja',
+'blockiptext' => 'Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].
+Žemiau nuruodīkėt tėkslē prižastė.',
+'ipaddress' => 'IP adresos',
+'ipadressorusername' => 'IP adresos a nauduotuojÄ— vards',
+'ipbexpiry' => 'GaliuojÄ—ma Äiesos',
+'ipbreason' => 'Prīžastis:',
+'ipbreasonotherlist' => 'Kėta prīžastis',
+'ipbreason-dropdown' => '*Dažniausės bluokavėma prižastīs
+** Melagėngas infuormacėjės rašīms
+** Torėnė trīnims ėš poslapiu
+** Spaminims
+** Zaunu/bikuo rašīms i poslapios
+** GondinÄ—mÄ/PÄ—ktžuodiavÄ—mÄ
+** Pėktnaudžiavėms paskėruomis
+** NetÄ—nkams nauduotuojÄ— vards',
+'ipbanononly' => 'BlokoutÄ— tÄ—ktÄs anuonimÄ—nius nauduotuojus',
+'ipbcreateaccount' => 'Nelaistė kortė paskīrū',
+'ipbemailban' => 'NelaistÄ— nauduotuojÅ siÅstÄ— el. gruomatas',
+'ipbenableautoblock' => 'AutuomatÄ—Å¡kÄ blokoutÄ— tuo nauduotuojÄ— paskiausÄ“ nauduota IP adresa, Ä— bikuokius paskesnius IP adresus, Ä—Å¡ katrÅ« ons miegin redagoutÄ—',
+'ipbsubmit' => 'BlokoutÄ— Å¡Ä—ta nauduotuoja',
+'ipbother' => 'KÄ—tuoks Äiesos',
+'ipboptions' => '2 adÄ«nas:2 hours,1 dÄ—ina:1 day,3 dÄ—inas:3 days,1 nedielÄ—:1 week,2 nedielÄ—s:2 weeks,1 mienou:1 month,3 mienesÄ“:3 months,6 mienesÄ“:6 months,1 metÄ:1 year,omžėms:infinite',
+'ipbotheroption' => 'kÄ—ta',
+'ipbotherreason' => 'Kėta/papėlduoma prižastis',
+'ipbwatchuser' => 'KeravuotÄ— tuo nauduotuojÄ— poslapi Ä—r anuo aptarÄ—ma poslapi',
+'ipb-change-block' => 'ParblokoutÄ— ta nauduotuoja so Å¡Ä—tÄs nustatÄ«mÄs',
+'badipaddress' => 'NelaistÄ—ns IP adresos',
+'blockipsuccesssub' => 'Ožblokavėms pavīka',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] bova ožblokouts.
+<br />Aplonkīkėt [[Special:IPBlockList|IP blokavėmu istuorėjė]] noriedamė ana parveizėtė.',
+'ipb-edit-dropdown' => 'Redagoutė blokavėmu prīžastis',
+'ipb-unblock-addr' => 'AtblokoutÄ— $1',
+'ipb-unblock' => 'AtblokoutÄ— nauduotuojÄ— varda a IP adresa',
+'ipb-blocklist' => 'Ruodītė asontius bluokavėmus',
+'ipb-blocklist-contribs' => '$1 duovis',
+'unblockip' => 'AtbluokoutÄ— nauduotuoja',
+'unblockiptext' => 'Nauduokėt šėta fuorma, kū atkortomiet rašīma teises
+onkstiau ožbluokoutam IP adresÅ a nauduotuojÅ.',
+'ipusubmit' => 'AtblokoutÄ— Å¡Ä—ta adresa',
+'unblocked' => '[[User:$1|$1]] bova atbluokouts',
+'unblocked-id' => 'Bluokavėms $1 bova pašalėnts',
+'ipblocklist' => 'BlokoutÄ— IP adresÄ Ä— nauduotuojÄ“',
+'ipblocklist-legend' => 'Rastė ožblokouta nauduotuoja',
+'ipblocklist-username' => 'Nauduotuos a IP adresos:',
+'ipblocklist-submit' => 'Ėiškuotė',
+'blocklistline' => '$1, $2 ožblokava $3 ($4)',
+'infiniteblock' => 'neribuotÄ',
+'expiringblock' => 'beng galiuotÄ— $1 $2',
+'anononlyblock' => 'vÄ—n anuonÄ—mÄ',
+'noautoblockblock' => 'autuomatinis blokavÄ—ms Ä—Å¡jongts',
+'createaccountblock' => 'paskīrū korėms oždrausts īr',
+'emailblock' => 'el. pašts ožblokouts',
+'ipblocklist-empty' => 'BlokavÄ—mu saraÅ¡os toÅ¡Äias.',
+'ipblocklist-no-results' => 'Prašuoms IP adresos a nauduotuojė vards ožblokouts nier.',
+'blocklink' => 'ožblokoutė',
+'unblocklink' => 'atbluokoutÄ—',
+'change-blocklink' => 'keistė bluokavėma nustatīmus',
+'contribslink' => 'duovis',
+'autoblocker' => 'Autuomatėnis ožbluokavėms, nes dalėnaties IP adreso so nauduotuojo "$1". Prīžastės - "$2".',
+'blocklogpage' => 'Ožblokavėmu istuorėjė',
+'blocklogentry' => 'ožblokava „[[$1]]“, blokavÄ—ma Äiesos - $2 $3',
+'reblock-logentry' => 'pakeistÄ— [[$1]] bluokavÄ—ma nustatÄ«mÄ, naus bluokavÄ—ma Äiesos Ä«r $2 $3',
+'blocklogtext' => 'Čė Ä«r nauduotuoju blokavÄ—ma Ä—r atblokavÄ—ma sÄraÅ¡os. AutuomatÄ—Å¡kÄ blokoutÄ— IP adresÄ nier Ä—Å¡vardÄ—ntÄ—. Jeigu nuorÄ—t paveizÄ—tÄ— nÅ«nÄ blokoujamus adresus, veizÄ—kÄ—t [[Special:IPBlockList|IP ožbluokavÄ—mu istuorÄ—jÄ—]].',
+'unblocklogentry' => 'atbluokava $1',
+'block-log-flags-anononly' => 'vėn anonėmėnē nauduotuojē',
+'block-log-flags-nocreate' => 'privėlėju kūrėms ėšjungts',
+'block-log-flags-noautoblock' => 'automatÄ—nis blokavÄ—ms Ä—Å¡jungts',
+'block-log-flags-noemail' => 'e-pašts bluokouts īr',
+'ipb_expiry_invalid' => 'GaliuojÄ—ma Äiesos nelaistÄ—ns.',
+'ipb_already_blocked' => '„$1“ jau ožblokouts',
+'ipb-needreblock' => '== Jau ožblokouts ==
+$1 jau īr ožblokouts. A nuorėt pakeistė nustatīmus?',
+'proxyblocksuccess' => 'Padarīt.',
+
+# Developer tools
+'unlockdbtext' => 'AtrakÄ—nos doumenÅ« baze grÅžėns galimÄ«be vÄ—sÄ—m
+nauduotuojam redagoutÄ— poslapios, keistÄ— anÅ« nostatÄ«mos, keistÄ— anÅ« keravuojamu sÄraÅ¡a Ä—
+kėtos dalīkos, rēkalaujontios pakeitėmu doumenū bazė.
+PraÅ¡uom patvÄ—rtÄ—ntÄ— Å¡Ä—tÄ, kÅ« ketinat padarÄ«tÄ—.',
+'locknoconfirm' => 'Tamsta neoždiejot patvėrtinėma varnalės.',
+'unlockdbsuccesstext' => 'Doumenū bazė bova atrakėnta.',
+
+# Move page
+'move-page' => 'PervadÄ—ntÄ— $1',
+'move-page-legend' => 'PoslapÄ— pervadÄ—nims',
+'movepagetext' => "Nauduodamė žemiau pateikta fuorma, parvadinsėt poslapi neprarasdamė anuo istuorėjės.
+SenasÄ pavadinÄ—ms pataps nukrÄ“piamouju - ruodÄ«s i naujÄ«ji.
+Tamsta esat atsakėngs ož šėta, kū nūruodas ruodītu i ten, kor ė nuorieta.
+
+Primenam, kÅ« poslapis '''nebus''' parvadints, jÄ“go jau Ä«r poslapis naujo pavadinÄ—mo, nebent tas poslapis Ä«r tuÅ¡ÄÄ—s a nukreipÄ“masis Ä— netor redagavÄ—ma istuorÄ—jÄ—s.
+Tumet, Tamsta galėt parvadintė poslapi seniau nauduota vardu, jēgo priš šėta ons bova par klaida parvadints, a egzėstounantiu poslapiu sogadintė negalėt.
+
+'''DIEMESÄ–!'''
+Jēgo parvadinat puopoliaru poslapi, tas gal sokeltė nepagēdaunamu šalotiniu efektu, tudie šėta veiksma vīkdīkit tėk isitėkine,
+kū soprantat vėsas pasiekmes.",
+'movepagetalktext' => "SosÄ—its aptarÄ—ma poslapis bus autuomatÄ—Å¡kÄ parkelts draugom so ano, '''Ä—Å¡skÄ«rus:''':
+*Poslapis nauju pavadinėmo tor netoštė aptarėma poslapi, a
+*Paliksėt žemiau asontė varnale nepažīmieta.
+Å Ä—tÄs atviejÄs Tamsta sava nužiÅ«ra torÄ—t parkeltÄ— a apjongtÄ— aptarÄ—ma poslapi.",
+'movearticle' => 'ParvadintÄ— poslapi:',
+'movenologin' => 'NeprisÄ—jongÄ—s',
+'movenologintext' => 'Nuoriedamė parvadintė poslapi, torėt būtė ožsėregėstravės nauduotuos ė tēpuogi būtė [[Special:UserLogin|prisėjongės]].',
+'newtitle' => 'Naus pavadÄ—nÄ—ms:',
+'move-watch' => 'KeravuotÄ— Å¡Ä—ta poslapi',
+'movepagebtn' => 'ParvadintÄ— poslapÄ—',
+'pagemovedsub' => 'Parvadinta siekmingÄ',
+'movepage-moved' => '\'\'\'"$1" bova parvadints i "$2"\'\'\'',
+'movepage-moved-redirect' => 'Nukreipims bova sokorts.',
+'articleexists' => 'Straipsnis so tuokiu vardo jau Ä«r
+a parinktÄsis vards Ä«r bluogs.
+Parinkat kÄ—ta varda.',
+'talkexists' => "'''PatsÄ poslapis bova siekmÄ—ngÄ parvadints, no aptarÄ—mu poslapis nabova parkelts, kadongi nauja
+pavadÄ—nÄ—ma straipsnis jau tor aptarÄ—mu poslapi.
+Prašuom sojongtė šėtuos poslapios.'''",
+'movedto' => 'parvadints i',
+'movetalk' => 'ParkeltÄ— sosÄ—ta aptarÄ—ma poslapi.',
+'1movedto2' => 'Straipsnis [[$1]] parvadints i [[$2]]',
+'1movedto2_redir' => '[[$1]] parvadints i [[$2]] (onkstiau bova nukrÄ“pamÄsis)',
+'movelogpage' => 'ParvardinÄ—mu istuorÄ—jÄ—',
+'movelogpagetext' => 'SÄraÅ¡os parvadintu poslapiu.',
+'movereason' => 'Prīžastis:',
+'revertmove' => 'atmestÄ—',
+'delete_and_move' => 'Ä–Å¡trintÄ— Ä— parkeltÄ—',
+'delete_and_move_text' => '==Rēkalings ėštrīnims==
+Paskėrties straipsnis „[[:$1]]“ jau īr. A nuorėt ana ėštrintė, kū galietomiet parvadintė?',
+'delete_and_move_confirm' => 'TÄ“p, trintÄ— poslapi',
+'delete_and_move_reason' => 'Ä–Å¡trinta diel parkielima',
+'move-leave-redirect' => 'ParvadÄ—nant paliktÄ— nukreipÄ—ma',
+
+# Export
+'export' => 'EkspuortoutÄ— poslapius',
+'exportcuronly' => 'EksportoutÄ— tÄ—ktÄs dabartÄ—ne versÄ—jÄ—, neitraukiant istuorÄ—jÄ—s',
+'export-submit' => 'EksportoutÄ—',
+'export-addcattext' => 'PridietÄ— poslapius Ä—Å¡ kateguorÄ—jÄ—s:',
+'export-addcat' => 'PridietÄ—',
+'export-download' => 'SauguotÄ— kÄp faila',
+
+# Namespace 8 related
+'allmessages' => 'VÄ—sÄ— sÄ—stemas tekstÄ Ä— praneÅ¡Ä—mÄ',
+'allmessagesname' => 'PavadÄ—nÄ—ms',
+'allmessagesdefault' => 'PradÄ—nis teksts',
+'allmessagescurrent' => 'DabartÄ—nis teksts',
+'allmessagestext' => 'Čė pateikamÄ— sÄ—stemÄ—niu praneÅ¡Ä—mu sÄraÅ¡os, esontis MediaWiki srÄ—tie.',
+'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' nepalaikuoms īr, nes nustatīms '''\$wgUseDatabaseMessages''' ėšjungts īr.",
+
+# Thumbnails
+'thumbnail-more' => 'PadÄ—dintÄ—',
+'thumbnail_error' => 'Klaida koriant somažėnta pavēkslieli: $1',
+'thumbnail_invalid_params' => 'Nalaistieni miniatiÅ«ras parametrÄ',
+'thumbnail_dest_directory' => 'Nepavīkst sokortė paskėrtėis papkes',
+
+# Special:Import
+'import' => 'ImportoutÄ— poslapius',
+'import-revision-count' => '$1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}}',
+
+# Import log
+'importlogpage' => 'Impuorta istuorÄ—jÄ—',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|keitims|keitimÄ|keitimu}}',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|keitims|keitimÄ|keitimu}} Ä—Å¡ $2',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Tamstas nauduotuojÄ— poslapis',
+'tooltip-pt-anonuserpage' => 'NauduotuojÄ— poslapis Tamstas IP adresÅ',
+'tooltip-pt-mytalk' => 'Tamstas aptarÄ—ma poslapis',
+'tooltip-pt-preferences' => 'Mona nostatÄ«mÄ',
+'tooltip-pt-watchlist' => 'Poslapiu sÄraÅ¡os, katrÅ«s Tamsta pasÄ—rÄ—nkuot keravuotÄ—.',
+'tooltip-pt-mycontris' => 'Tamstas darÄ«tu keitimu sÄraÅ¡os',
+'tooltip-pt-login' => 'Rekuomendoujam prÄ—sÄ—jongtÄ—, nuors tas nÄ—r privaluoma.',
+'tooltip-pt-logout' => 'AtsÄ—jongtÄ—',
+'tooltip-ca-talk' => 'PoslapÄ— torÄ—nÄ— aptarÄ—ms',
+'tooltip-ca-edit' => 'Tamsta galėt keistė ta poslapi. Nepamėrškėt paspaustė parvaizuos mīgtoka priš ėšsauguodamė.',
+'tooltip-ca-addsection' => 'Pradietė nauja skīriu',
+'tooltip-ca-viewsource' => 'Poslapis īr ožrakints. Galėt parveizėt torini.',
+'tooltip-ca-history' => 'UnkstesnÄ—s poslapÄ— versÄ—jÄ—s.',
+'tooltip-ca-protect' => 'Ožrakintė šėta poslapi',
+'tooltip-ca-delete' => 'TrÄ—ntÄ— ta poslapi',
+'tooltip-ca-move' => 'ParvadÄ—ntÄ— poslapi',
+'tooltip-ca-watch' => 'PridietÄ— poslapi i keravuojamu sÄraÅ¡a',
+'tooltip-ca-unwatch' => 'PaÅ¡alÄ—ntÄ— poslapi Ä—Å¡ keravuojamu sÄraÅ¡a',
+'tooltip-search' => 'Ėiškuotė šėtom pruojektė',
+'tooltip-search-go' => 'Ētė i poslapi su tuokiu pavadėnėmu jēgo tuoks īr',
+'tooltip-search-fulltext' => 'Ėiškuotė poslapiu so tuokiu tekstu',
+'tooltip-p-logo' => 'PÄ—rms poslapis',
+'tooltip-n-mainpage' => 'Aplonkītė pėrma poslapi',
+'tooltip-n-mainpage-description' => 'Ä’tÄ— i pÄ—rma poslapi',
+'tooltip-n-portal' => 'Aple pruojekta, ka galėma vēktė, kamė ka rastė',
+'tooltip-n-currentevents' => 'RaskÄ—t naujausÄ— infuormacÄ—jÄ—',
+'tooltip-n-recentchanges' => 'VielÄ«bÅ«ju pakeitÄ—mu sÄraÅ¡os tamÄ— projektÄ—.',
+'tooltip-n-randompage' => 'Atidarītė bikuoki straipsni',
+'tooltip-n-help' => 'Vėita, katruo rasėt rūpėmus atsakīmus.',
+'tooltip-t-whatlinkshere' => 'Poslapiu sÄraÅ¡os, ruodantiu i ÄÄ—',
+'tooltip-t-recentchangeslinked' => 'PaskotÄ—nÄ“ pakeitÄ—mÄ straipsnious, pasÄ—ikiamous Ä—Å¡ Å¡Ä—ta straipsnÄ—',
+'tooltip-feed-rss' => 'Å Ä—ta poslapÄ— RSS Å¡altÄ—nis',
+'tooltip-feed-atom' => 'Å Ä—ta poslapÄ— Atom Å¡altÄ—nis',
+'tooltip-t-contributions' => 'RuodÄ«tÄ— Å¡Ä—ta nauduotuojÄ— keitÄ—mu sÄraÅ¡a',
+'tooltip-t-emailuser' => 'SiÅstÄ— gromata Å¡Ä—tom prietÄ—liÅ',
+'tooltip-t-upload' => 'IdietÄ— abruozdielios a medÄ—jÄ—s failos',
+'tooltip-t-specialpages' => 'SpecÄ“liÅ«ju poslapiu sÄraÅ¡os',
+'tooltip-t-print' => 'Å Ä—ta poslapÄ— versÄ—jÄ— spausdÄ—nÄ—mÅ',
+'tooltip-t-permalink' => 'Vėslaikėnė nūruoda i šėta poslapė versėje',
+'tooltip-ca-nstab-main' => 'Ruodītė poslapė torėni',
+'tooltip-ca-nstab-user' => 'Ruodītė nauduotuojė poslapi',
+'tooltip-ca-nstab-special' => 'Šėts poslapis īr specēlosis - anuo nagalėm redagoutė.',
+'tooltip-ca-nstab-project' => 'Ruodītė pruojekta poslapi',
+'tooltip-ca-nstab-image' => 'Ruodītė abruozdielė poslapi',
+'tooltip-ca-nstab-template' => 'Ruodītė šabluona',
+'tooltip-ca-nstab-help' => 'Ruodītė pagelbas poslapi',
+'tooltip-ca-nstab-category' => 'Ruodītė kateguorėjės poslapi',
+'tooltip-minoredit' => 'PažīmietÄ— pakeitÄ—ma kÄp maža',
+'tooltip-save' => 'Ä–Å¡sauguotÄ— pakeitÄ—mos',
+'tooltip-preview' => 'Pakeitėmu parveiza, prašuom parveizėt priš ėšsaugont!',
+'tooltip-diff' => 'Ruod, kuokios pakeitÄ—mos padariet tekste.',
+'tooltip-compareselectedversions' => 'Veizėtė abodvėju pasėrėnktū poslapė versėju skėrtomos.',
+'tooltip-watch' => 'PridietÄ— Å¡Ä—ta poslapi i keravuojamu sÄraÅ¡a',
+'tooltip-recreate' => 'Atkortė poslapi napaisant šėto, kū ans bova ėštrints',
+'tooltip-rollback' => 'Atšauktė atmestus šėta poslapė keitėmus i vielībiause versėje par vėina paspaudėma',
+'tooltip-undo' => '"Anolioutė" atmeta ta keitėma ėr atidara unkstesnies versėjės redagavėma skvarma. Leid pridietė atmetėma prīžasti kuomentarūsė.',
+
+# Attribution
+'anonymous' => 'NeregÄ—strouts nauduotuos',
+'siteuser' => '{{SITENAME}} nauduotuos $1',
+'lastmodifiedatby' => 'Å Ä—ta poslapi paskotini karta redagava $3 $2, $1.',
+'others' => 'kÄ—tÄ—',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|nauduotuos|nauduotuojē}} $1',
+'creditspage' => 'Poslapė kūriejē',
+
+# Spam protection
+'spamprotectiontitle' => 'Prišreklamėnis fėltros',
+'spamprotectiontext' => 'Poslapis, katra nuoriejot Ä—Å¡sauguotÄ— bova ožblokouts priÅ¡reklamÄ—nÄ— fÄ—ltra. Å Ä—tÄ tÄ—kriausÄ“ sokielÄ— nÅ«ruoda i kÄ—ta svetaine. Ä–Å¡Ä—mkit nÅ«ruoda Ä— pamieginkÄ—t viel.',
+'spamprotectionmatch' => 'Šėts tekstos bova atpažėnts prišreklamėnė fėltra: $1',
+'spambot_username' => "''MediaWiki'' reklamu Å¡alÄ—nÄ—ms",
+'spam_reverting' => 'Atkoriama i onkstesne versėje, katra nator nūruodu i $1',
+'spam_blanking' => 'Vėsos versėjės toriejė nūruodu i $1. Ėšvaluoma',
+
+# Info page
+'numedits' => 'Pakeitimu skaitlius (straipsnis): $1',
+'numtalkedits' => 'PakeitÄ—mu skaitlius (aptarÄ—ma poslapis): $1',
+'numwatchers' => 'Keravuojantiu skaitlius: $1',
+
+# Math options
+'mw_math_png' => 'VÄ—sumet fuormuotÄ— PNG',
+'mw_math_simple' => 'HTML paprastÄs atvejÄs, kÄ—tÄ“p - PNG',
+'mw_math_html' => 'HTML kumet imanuoma, kėtēp - PNG',
+'mw_math_source' => 'Paliktė TeX fuormata (tekstinems naršīklems)',
+'mw_math_modern' => 'Rekomendounama muodernioms naršīklems',
+'mw_math_mathml' => 'MathML jēgo imanuoma (ekspermentinis)',
+
+# Math errors
+'math_failure' => 'Nepavīka apdoruotė',
+'math_unknown_error' => 'nežinuoma klaida',
+'math_unknown_function' => 'nežinuoma funkcėjė',
+
+# Patrolling
+'markaspatrolleddiff' => 'Žīmietė, kū patikrėnta',
+'markaspatrolledtext' => 'Pažīmietė, ka poslapis patėkrėnts īr',
+'markedaspatrolled' => 'Pažīmiets kÄp patÄ—krints',
+'markedaspatrolledtext' => 'PasÄ—rinkta versÄ—jÄ— siekmingÄ pažīmieta kÄp patÄ—krinta',
+
+# Patrol log
+'patrol-log-page' => 'PatikrinÄ—ma istuorÄ—jÄ—',
+'patrol-log-line' => 'PoslapÄ— „$2“ $1 pažīmieta kÄp patÄ—krinta $3',
+'patrol-log-auto' => '(autuomatÄ—Å¡kÄ)',
+'patrol-log-diff' => 'versÄ—jÄ— $1',
+'log-show-hide-patrol' => '$1 patvirtėnėmu saraša',
+
+# Image deletion
+'deletedrevision' => 'Ä–Å¡trinta sena versÄ—jÄ— $1.',
+'filedeleteerror-short' => 'Klaida trÄ—nont faila: $1',
+
+# Browsing diffs
+'previousdiff' => '↠Onkstesnis pakeitėms',
+'nextdiff' => 'Paskesinis pakeitėms →',
+
+# Media information
+'mediawarning' => "'''Diemesė''': Šėts fails gal torietė kenksmėnga kuoda, anū palaidus Tamstas sėstėma gal būtė sogadinta.",
+'imagemaxsize' => 'Rėbuotė abruozdieliu dėdoma anū aprašīma poslapī lėgė:',
+'thumbsize' => 'Somažėntu pavēkslieliu didums:',
+'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|poslapis|poslapē|poslapiu}}',
+'file-info' => 'faila dÄ—doms: $1, MIME tips: $2',
+'file-info-size' => '$1 × $2 taškū, faila dėdoms: $3, MIME tips: $4',
+'file-nohires' => '<small>Geresnis ėšraiškėms negalėms.</small>',
+'svg-long-desc' => 'SVG fails, fuormalē $1 × $2 puškiu, faila dėdoms: $3',
+'show-big-image' => 'Pėlns ėšraiškėms',
+'show-big-image-thumb' => '<small>Šėtuos parvaizos dėdums: $1 × $2 puškiu</small>',
+
+# Special:NewFiles
+'newimages' => 'Naujausiu abruozdieliu galerÄ—jÄ—',
+'imagelisttext' => "Žemiau Ä«r '''$1''' failu sÄraÅ¡os, sorÅ«Å¡iouts $2.",
+'newimages-label' => 'Faila vards (ar anuo dalis):',
+'showhidebots' => '($1 robotos)',
+'ilsubmit' => 'Ėiškoutė',
+'bydate' => 'palē data',
+'sp-newimages-showfrom' => 'Ruodītė naujus abruozdielius pradedant nū $2, $1',
+
+# Bad image list
+'bad_image_list' => 'Fuormats tuoks Ä«r:
+
+Tėk eilotės, prasėdedantės *, īr itraukiamas. Pėrmuojė nūruoda eilotie tor būtė nūruoda i bluoga abruozdieli.
+Vėsas kėtas nūoruodas tuo patiuo eilotie īr laikomas ėšėmtim, tas rēšk ka poslapē, katrūs leidama iterptė abruozdieli.',
+
+# Metadata
+'metadata' => 'Metadoumenīs',
+'metadata-help' => 'Å Ä—tom failÄ— Ä«r papÄ—lduomos infuormacÄ—jÄ—s, tikriausÄ“ pridietos skaitmeninÄ—s kameruos a skanÄ—rÄ—, katros bova nauduots anam sokortÄ— a parkeltÄ— i skaitmenÄ—ni fuormata. JÄ“go fails bova pakeists Ä—Å¡ pradÄ—nÄ—s versÄ—jÄ—s, katruos nekatruos datalÄ—s gal nepÄ—lnÄ atspÄ—ndietÄ— nauja faila.',
+'metadata-expand' => 'Ruodītė ėšpliestinė infuormacėjė',
+'metadata-collapse' => 'KavuotÄ— Ä—Å¡pliestinÄ— infuormacÄ—jÄ—',
+'metadata-fields' => 'EXIF metadoumenÅ« laukÄ, nuruodÄ«tÄ— tamÄ— praneÅ¡Ä—mÄ—, bus itrauktÄ— i abruozdielÄ— poslapi, kumet metadoumenÅ« lentelÄ— bus suskleista. PalÄ“ nutÄ«liejÄ—ma kÄ—tÄ— laukÄ bus pakavuotÄ—.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength',
+
+# EXIF tags
+'exif-imagewidth' => 'Platoms',
+'exif-imagelength' => 'Aukštoms',
+'exif-orientation' => 'Pasokims',
+'exif-xresolution' => 'Gorizuontalus ėšraiškėms',
+'exif-datetime' => 'Faila keitÄ—ma data Ä— Äiesos',
+'exif-imagedescription' => 'AbruozdielÄ— pavadÄ—nÄ—ms',
+'exif-make' => 'Kameras gamÄ—ntuos',
+'exif-model' => 'Kameras muodelis',
+'exif-colorspace' => 'Spalvū pristatīms',
+'exif-compressedbitsperpixel' => 'Abruozdielė sospaudėma rėžėms',
+'exif-datetimeoriginal' => 'DoumenÅ« generavÄ—ma data Ä— Äiesos',
+'exif-exposuretime' => 'Ä–Å¡laikÄ«ma Äiesos',
+'exif-fnumber' => 'F skaitlius',
+'exif-brightnessvalue' => 'Å vÄ—isoms',
+'exif-lightsource' => 'Å vÄ—isuos Å¡altÄ—nis',
+'exif-flash' => 'BlÄ—cos',
+'exif-focallength' => 'Žėdinė nutuolėms',
+'exif-flashenergy' => 'BlÄ—ca energÄ—jÄ—',
+'exif-contrast' => 'Kuontrasts',
+
+'exif-orientation-1' => 'StandartÄ—Å¡ks',
+
+'exif-xyresolution-i' => '$1 puškē cuolī',
+'exif-xyresolution-c' => '$1 puškē centėmetrė',
+
+'exif-componentsconfiguration-0' => 'nēsa',
+
+'exif-exposureprogram-0' => 'Nenūruodīta',
+
+'exif-contrast-0' => 'Paprasts',
+'exif-contrast-1' => 'Mažos',
+'exif-contrast-2' => 'DÄ—dlis',
+
+# External editor support
+'edit-externally' => 'Atdarītė ėšuoriniam redaktuorio',
+'edit-externally-help' => 'NuoriedamÄ— gautÄ— daugiau infuormacÄ—jÄ—s, veiziekÄ—t [http://www.mediawiki.org/wiki/Manual:External_editors kruovÄ—ma instrokcÄ—jÄ—s].',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'vÄ—sos',
+'imagelistall' => 'vÄ—sÄ—',
+'watchlistall2' => 'vÄ—sos',
+'namespacesall' => 'vÄ—sas',
+'monthsall' => 'vÄ—sÄ—',
+
+# E-mail address confirmation
+'confirmemail' => 'Patvirtėnkėt el. pašta adresa',
+'confirmemail_noemail' => 'Tamsta netorėt nuruodės teisėnga el. pašta adresa [[Special:Preferences|sava nustatīmūs]].',
+'confirmemail_text' => 'Šėtom pruojektė īr rēkalėnga patvirtėntė el. pašta adresa prīš nauduojont el. pašta funkcėjės. Spauskėt žemiau esonti mīgtoka,
+kÅ« Tamstas el. paÅ¡ta adresu bÅ«tom Ä—Å¡siÅsts patvirtÄ—nÄ—ma kods.
+Gruomatuo bus atsiÅsta nÅ«ruoda so kodu, katra nuÄ“jus, el. paÅ¡ta adresos bus patvirtÄ—nts.',
+'confirmemail_send' => 'Ä–Å¡siÅstÄ— patvirtÄ—nÄ—ma koda',
+'confirmemail_sent' => 'PatvirtÄ—nÄ—ma gruomata Ä—Å¡siÅsta.',
+'confirmemail_needlogin' => 'TamstÄ rÄ“k $1, kÅ« patvirtÄ—ntomiet sava el. paÅ¡ta adresa.',
+'confirmemail_loggedin' => 'Tamstas el. pašta adresos ožtvėrtints īr.',
+'confirmemail_body' => 'Kažėnkas, mosiet Tamsta IP adreso $1, ožregėstrava
+paskīra „$2“ sosėita so šėtuom el. pašta adresu pruojektė {{SITENAME}}.
+
+KÅ« patvirtÄ—ntomiet, kÅ« ta diežotÄ— Ä—Å¡ tÄ—krÄ prÄ—klausa TamstÄ, Ä—r aktÄ«voutomiet
+el. pašta puoslaugi pruojėktė {{SITENAME}}, atdarīkiet ta nūruoda sava naršīklie:
+
+$3
+
+Jēgo paskīra regėstravuot *ne* Tamsta, tumet ēkėt ta nūruoda,
+kū atšauktomiet el. pašta adresa patvirtėnėma:
+
+$5
+
+PatvirtÄ—nÄ—ma kods bengs galiuotÄ— $4.',
+'invalidateemail' => 'El. pašta patvirtėnėma atšaukėms',
+
+# Trackbacks
+'trackbackremove' => '([$1 TrintÄ—])',
+
+# Delete conflict
+'deletedwhileediting' => 'DiemesÄ—: Å Ä—ts poslapis Ä—Å¡trints po Å¡Ä—ta, kumet pradiejot redagoutÄ—!',
+'recreate' => 'AtkortÄ—',
+
+# action=purge
+'confirm_purge_button' => 'Tink',
+
+# Multipage image navigation
+'imgmultipageprev' => '↠unkstesnis poslapis',
+'imgmultipagenext' => 'kėts poslapis →',
+'imgmultigo' => 'Ä’tÄ—!',
+'imgmultigoto' => 'Ä’tÄ— i poslapi $1',
+
+# Table pager
+'ascending_abbrev' => 'dÄ—diejÄ—ma tvarka',
+'descending_abbrev' => 'mažiejontė tvarka',
+'table_pager_next' => 'KÄ—ts poslapis',
+'table_pager_prev' => 'Onkstesnis poslapis',
+'table_pager_first' => 'PÄ—rms poslapis',
+'table_pager_last' => 'PaskotÄ—nis poslapis',
+'table_pager_limit' => 'Ruodītė $1 elementu par poslapi',
+'table_pager_limit_submit' => 'Ruodītė',
+'table_pager_empty' => 'Juokiū rezoltatu',
+
+# Auto-summaries
+'autosumm-blank' => 'Šalėnams ciels torėnīs ėš poslapė',
+'autosumm-replace' => "Poslapis keitams so '$1'",
+'autoredircomment' => 'Nukreipama i [[$1]]',
+'autosumm-new' => 'Naus poslapis: $1',
+
+# Live preview
+'livepreview-loading' => 'Kraunama īr…',
+'livepreview-ready' => 'Ikeliama… Padarīta!',
+
+# Friendlier slave lag warnings
+'lag-warn-normal' => 'PakeitÄ—mÄ, naujesnÄ— kÄp $1 {{PLURAL:$1|sekondÄ—|sekondÄ—s|sekondiu}}, tamÄ— sÄraÅ¡Ä— gal bÅ«tÄ— neruodomÄ—.',
+'lag-warn-high' => 'DielÄ“ dÄ—dlÄ— doumenÅ« bazÄ—s pasÄ—likÄ—ma pakeitÄ—mÄ, naujesnÄ— nÄ“go $1 {{PLURAL:$1|sekondÄ—|sekondÄ—s|sekondiu}}, tamÄ— saraÅ¡Ä— gal bÅ«tÄ— neruodomÄ—.',
+
+# Watchlist editor
+'watchlistedit-numitems' => 'Tamstas keravuojamu sÄraÅ¡Ä— Ä«r $1 poslapiu neskaitliuojant aptarÄ—mu poslapiu.',
+'watchlistedit-noitems' => 'Tamstas keravuojamu sÄraÅ¡Ä— nÄ— juokiÅ« poslapiu.',
+'watchlistedit-normal-title' => 'KeistÄ— keravuojamu sÄroÅ¡a',
+'watchlistedit-normal-legend' => 'Å alÄ—ntÄ— poslapios Ä—Å¡ keravuojamu sÄraÅ¡a',
+'watchlistedit-normal-explain' => 'Žemiau Ä«r ruodomÄ— poslapÄ“ Tamstas keravuojamu sÄraÅ¡Ä—.
+Nuoriedamė pašalėntė poslapi, pri anuo oždiekėt varnale ė paspauskėt „Šalėntė poslapios“.
+Tamsta tÄ“puogi galÄ—t [[Special:Watchlist/raw|redagoutÄ— grÄ«naji keravuojamu sÄraÅ¡a]].',
+'watchlistedit-normal-submit' => 'Å alÄ—ntÄ— poslapios',
+'watchlistedit-normal-done' => '$1 {{PLURAL:$1|poslapis bova pašalėnts|poslapē bova pašalėntė|poslapiu bova pašalėnta}} ėš Tamstas keravuojamu saraša:',
+'watchlistedit-raw-title' => 'KeistÄ— grÄ«nÅjÄ— keravuojamu sÄraÅ¡a',
+'watchlistedit-raw-legend' => 'KeistÄ— grÄ«nÅjÄ— keravuojamu sÄraÅ¡a',
+'watchlistedit-raw-explain' => 'Žemiau ruodomÄ— poslapÄ“ Tamstas keravuojamu sÄraÅ¡Ä—, Ä— gal bÅ«tÄ— pridietÄ— i a paÅ¡alÄ—ntÄ— Ä—Å¡ sÄraÅ¡a; vÄ—ins poslapis eilotie. BÄ—ngÄ— paspauskÄ—t „AtnaujÄ—ntÄ— keravuojamu sÄraÅ¡a“. Tamsta tÄ“puogi galÄ—t [[Special:Watchlist/edit|nauduotÄ— standartÄ—ni radaktuoriu]].',
+'watchlistedit-raw-titles' => 'Poslapē:',
+'watchlistedit-raw-submit' => 'AtnaujÄ—ntÄ— keravuojamu sÄraÅ¡a',
+'watchlistedit-raw-done' => 'Tamstas keravuojamu sÄroÅ¡os bova atnaujÄ—nts.',
+'watchlistedit-raw-added' => '$1 {{PLURAL:$1|poslapis bova pridiets|poslapē bova pridietė|poslapiu bova pridieta}}:',
+'watchlistedit-raw-removed' => '$1 {{PLURAL:$1|poslapis bova pašalėnts|poslapē bova pašalėntė|poslapiu bova pašalėnta}}:',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'VeizietÄ— sosÄ—josius pakeitÄ—mus',
+'watchlisttools-edit' => 'VeizietÄ— Ä—r keistÄ— keravuojamu straipsniu sÄraÅ¡a',
+'watchlisttools-raw' => 'KeistÄ— nebÄ—ngta keravuojamu straipsniu sÄraÅ¡a',
+
+# Special:Version
+'version' => 'VersÄ—jÄ—',
+'version-license' => 'LicenzÄ—jÄ—',
+
+# Special:FilePath
+'filepath' => 'Faila maršrots',
+'filepath-page' => 'Fails:',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Ėiškuotė doblikoutu failu',
+'fileduplicatesearch-legend' => 'Ėiškuotė doblėkatu',
+'fileduplicatesearch-filename' => 'Faila vards:',
+'fileduplicatesearch-submit' => 'Ėiškuotė',
+'fileduplicatesearch-info' => '$1 × $2 pėkseliu<br />Faila dėdoms: $3<br />MIME tėps: $4',
+
+# Special:SpecialPages
+'specialpages' => 'Specēlė̅jė poslapē',
+'specialpages-note' => '----
+* Normalūs specēlė̅jė puslapē.
+* <strong class="mw-specialpagerestricted">Apribuotė specēlė̅jė puslapē.</strong>',
+'specialpages-group-maintenance' => 'SÄ—stemas palaikÄ«ma praneÅ¡Ä—mÄ',
+'specialpages-group-other' => 'Kėtė specēlė̅jė poslapē',
+'specialpages-group-login' => 'PrisÄ—jongÄ—ms / RegistracÄ—jÄ—',
+'specialpages-group-changes' => 'VielÄ«biÄ—Ì… jÄ— pakeitÄ—mÄ Ä— regÄ—strÄ',
+'specialpages-group-media' => 'Infuormacėjė aple failus ėr anū pakruovėms',
+'specialpages-group-users' => 'Nauduotuojē ė teisės',
+'specialpages-group-highuse' => 'Platē nauduojamė poslapē',
+'specialpages-group-pages' => 'Poslapiu sarašas',
+'specialpages-group-pagetools' => 'Poslapiu rakondÄ',
+'specialpages-group-wiki' => 'Wiki doumenÄ«s Ä— rakondÄ',
+'specialpages-group-redirects' => 'Specēlė̅jė nukreipėma poslapē',
+'specialpages-group-spam' => 'Å lamÅ¡ta valdÄ«ma rakondÄ',
+
+# Special:BlankPage
+'blankpage' => 'ToÅ¡Äias poslapis',
+
+# Special:Tags
+'tags-edit' => 'taisītė',
+
+);
diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php
index 54863482..2c80150a 100644
--- a/languages/messages/MessagesSh.php
+++ b/languages/messages/MessagesSh.php
@@ -12,16 +12,22 @@
*/
$namespaceNames = array(
+ NS_TALK => 'Razgovor',
NS_USER => 'Korisnik',
NS_USER_TALK => 'Razgovor_sa_korisnikom',
+ NS_PROJECT_TALK => 'Razgovor_o_$1',
NS_FILE => 'Datoteka',
NS_FILE_TALK => 'Razgovor_o_datoteci',
NS_TEMPLATE => 'Å ablon',
NS_TEMPLATE_TALK => 'Razgovor_o_Å¡ablonu',
+ NS_HELP => 'Pomoć',
+ NS_HELP_TALK => 'Razgovor_o_pomoći',
NS_CATEGORY => 'Kategorija',
NS_CATEGORY_TALK => 'Razgovor_o_kategoriji',
);
+$linkTrail = '/^([a-zÄćđžš]+)(.*)$/sDu';
+
$messages = array(
# User preference toggles
'tog-underline' => 'Podvuci linkove:',
@@ -38,8 +44,7 @@ $messages = array(
'tog-editsection' => 'Omogući uređivanje sekcija preko [uredi] linkova',
'tog-editsectiononrightclick' => 'UkljuÄite ureÄ‘ivanje odjeljka sa pritiskom na desno dugme miÅ¡a u naslovu odjeljka (JavaScript)',
'tog-showtoc' => 'Prikaži sadržaj (u svim stranicama sa više od tri podnaslova)',
-'tog-rememberpassword' => 'Upamti moju lozinku na ovom kompjuteru za buduće posjete',
-'tog-editwidth' => 'Proširi kutiju za uređivanje da ispuni cijeli ekran',
+'tog-rememberpassword' => 'Upamti moju prijavu za ovaj preglednik (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
'tog-watchcreations' => 'Dodaj stranice koje sam napravio u moj spisak praćenja',
'tog-watchdefault' => 'Dodaj stranice koje uređujem u moj spisak praćenja',
'tog-watchmoves' => 'Dodaj stranice koje premještam u moj spisak praćenja',
@@ -183,31 +188,21 @@ $messages = array(
'faqpage' => 'Project:ÄŒPP',
# Vector skin
-'vector-action-addsection' => 'Dodaj temu',
-'vector-action-delete' => 'Brisanje',
-'vector-action-move' => 'Preusmjeri',
-'vector-action-protect' => 'Zaštiti',
-'vector-action-undelete' => 'Vrati obrisano',
-'vector-action-unprotect' => 'Oslobodi od zaštite',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Stranica pomoći',
-'vector-namespace-image' => 'Datoteka',
-'vector-namespace-main' => 'Stranica',
-'vector-namespace-media' => 'Medijska stranica',
-'vector-namespace-mediawiki' => 'Poruka',
-'vector-namespace-project' => 'Stranica projekta',
-'vector-namespace-special' => 'Posebna stranica',
-'vector-namespace-talk' => 'Razgovor',
-'vector-namespace-template' => 'Å ablon',
-'vector-namespace-user' => 'KorisniÄka stranica',
-'vector-view-create' => 'Napravi',
-'vector-view-edit' => 'Uredi',
-'vector-view-history' => 'Pregled historije',
-'vector-view-view' => 'ÄŒitaj',
-'vector-view-viewsource' => 'Vidi izvor (source)',
-'actions' => 'Akcije',
-'namespaces' => 'Imenski prostori',
-'variants' => 'Varijante',
+'vector-action-addsection' => 'Dodaj temu',
+'vector-action-delete' => 'Brisanje',
+'vector-action-move' => 'Preusmjeri',
+'vector-action-protect' => 'Zaštiti',
+'vector-action-undelete' => 'Vrati obrisano',
+'vector-action-unprotect' => 'Oslobodi od zaštite',
+'vector-simplesearch-preference' => 'Omogući napredne sugestije pretrage (samo vector skin)',
+'vector-view-create' => 'Napravi',
+'vector-view-edit' => 'Uredi',
+'vector-view-history' => 'Pregled historije',
+'vector-view-view' => 'ÄŒitaj',
+'vector-view-viewsource' => 'Vidi izvor (source)',
+'actions' => 'Akcije',
+'namespaces' => 'Imenski prostori',
+'variants' => 'Varijante',
'errorpagetitle' => 'Greška',
'returnto' => 'Povratak na $1.',
@@ -268,6 +263,9 @@ Previše korisnika pokušava da pregleda ovu stranicu.
Molimo priÄekajte trenutak prije nego Å¡to ponovno pokuÅ¡ate pristupiti ovoj stranici.
$1',
+'pool-timeout' => 'Zaustavi Äekanje za zakljuÄavanje',
+'pool-queuefull' => 'Red na pool je prenapunjen',
+'pool-errorunknown' => 'nepoznata greška',
# 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' => 'O projektu {{SITENAME}}',
@@ -434,7 +432,8 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
'yourname' => 'KorisniÄko ime:',
'yourpassword' => 'Lozinka/zaporka:',
'yourpasswordagain' => 'Ponovno utipkajte lozinku/zaporku:',
-'remembermypassword' => 'Upamti moju lozinku na ovom kompjuteru za buduće posjete',
+'remembermypassword' => 'Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
+'securelogin-stick-https' => 'Ostanite povezani na HTTPS nakon prijave',
'yourdomainname' => 'Vaš domen:',
'externaldberror' => 'DoÅ¡lo je do greÅ¡ke pri vanjskoj autorizaciji baze podataka ili vam nije dopuÅ¡teno osvježavanje VaÅ¡eg vanjskog korisniÄkog raÄuna.',
'login' => 'Prijavi se',
@@ -451,6 +450,7 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
'gotaccount' => "Imate raÄun? '''$1'''.",
'gotaccountlink' => 'Prijavi se',
'createaccountmail' => 'e-mailom',
+'createaccountreason' => 'Razlog:',
'badretype' => 'Lozinke koje ste unijeli se ne poklapaju.',
'userexists' => 'KorisniÄko ime koje ste unijeli je već u upotrebi.
Molimo Vas da izaberete drugo ime.',
@@ -479,6 +479,7 @@ Molimo Vas da pokušate ponovno.',
Molimo Vas da pokušate ponovno.',
'passwordtooshort' => 'Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.',
'password-name-match' => 'VaÅ¡a lozinka mora biti razliÄita od VaÅ¡eg korisniÄkog imena.',
+'password-login-forbidden' => 'KoriÅ¡tenje ovog korisniÄkog imena i lozinke je zabranjeo.',
'mailmypassword' => 'Pošalji mi novu lozinku putem E-maila',
'passwordremindertitle' => 'Nova privremena lozinka za {{SITENAME}}',
'passwordremindertext' => 'Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}} ($4). Privremena šifra za korisnika "$2" je napravljena i glasi "$3". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.
@@ -517,6 +518,9 @@ Molimo Vas da saÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
+# E-mail sending
+'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
+
# Password reset dialog
'resetpass' => 'Promijeni korisniÄku Å¡ifru',
'resetpass_announce' => 'Prijavili ste se sa privremenim kodom koji ste dobili na e-mail.
@@ -567,11 +571,12 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privre
'showdiff' => 'Prikaži izmjene',
'anoneditwarning' => "'''Upozorenje:''' Niste prijavljeni.
Vaša IP adresa će biti zabilježena u historiji ove stranice.",
+'anonpreviewwarning' => "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
'missingsummary' => "'''Podsjećanje:''' Niste unijeli sažetak izmjene.
Ako kliknete na SaÄuvaj/Snimi, VaÅ¡a izmjena će biti snimljena bez sažetka.",
'missingcommenttext' => 'Molimo unesite komentar ispod.',
'missingcommentheader' => "'''Podsjetnik:''' Niste napisali temu/naslov za ovaj komentar.
-Ako ponovo kliknete na '''Snimi stranicu''', Vaše izmjene će biti snimljene bez teme/naslova.",
+Ako ponovo kliknete na '''{{int:savearticle}}''', Vaše izmjene će biti snimljene bez teme/naslova.",
'summary-preview' => 'Pretpregled sažetka:',
'subject-preview' => 'Pretpregled teme/naslova:',
'blockedtitle' => 'Korisnik je blokiran',
@@ -651,8 +656,12 @@ Posljednje stavke evidencije blokiranja možete pogledati ispod:',
'''Još uvijek nije snimljen!'''",
'userjspreview' => "'''Zapamite da je ovo samo test/pretpregled Vaše JavaScript-e.'''
'''Još uvijek nije snimljena!'''",
+'sitecsspreview' => "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''
+'''Još uvijek nije snimljen!'''",
+'sitejspreview' => "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''
+'''Još uvijek nije snimljen!'''",
'userinvalidcssjstitle' => "'''Upozorenje:''' Ne postoji interfejs (skin) pod imenom \"\$1\".
-Ne zaboravite da imena stranica s .css i .js kodom poÄinju malim slovom, npr. {{ns:user}}:Foo/monobook.css, a ne {{ns:user}}:Foo/Monobook.css.",
+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.'''
@@ -691,9 +700,6 @@ Također obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj do
'copyrightwarning2' => "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />
TakoÄ‘er nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sliÄnog slobodnog izvora informacija (pogledajte $1 za viÅ¡e detalja).
'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
-'longpagewarning' => "'''PAŽNJA''': Ova stranica ima $1 kilobajta;
-neki preglednici mogu imati problema kad uređujete stranice skoro ili veće od 32 kilobajta.
-Molimo Vas da razmotrite razbijanje stranice na manje dijelove.",
'longpageerror' => "'''Greška: Tekst, koji ste poslali, je dug $1 kilobajta, što je veće od maksimuma, koji iznosi $2 kilobajta.
Stranica ne može biti spremljena.'''",
'readonlywarning' => "'''PAŽNJA: Baza je zakljuÄana zbog održavanja, tako da nećete moći da snimite svoje izmjene za sada.
@@ -873,6 +879,8 @@ $1",
'logdelete-failure' => "'''Registar vidljivosti nije mogao biti postavljen:'''
$1",
'revdel-restore' => 'promijeni dostupnost',
+'revdel-restore-deleted' => 'izbrisane izmjene',
+'revdel-restore-visible' => 'vidljive izmjene',
'pagehist' => 'Historija stranice',
'deletedhist' => 'Izbrisana historija',
'revdelete-content' => 'sadržaj',
@@ -941,11 +949,13 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
# Diffs
'history-title' => 'Historija izmjena stranice "$1"',
'difference' => '(Razlika između revizija)',
+'difference-multipage' => '(Razlika između stranica)',
'lineno' => 'Linija $1:',
'compareselectedversions' => 'Uporedite oznaÄene verzije',
'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
'editundo' => 'ukloni ovu izmjenu',
-'diff-multi' => '({{plural:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}})',
+'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
+'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
# Search results
'searchresults' => 'Rezultati pretrage',
@@ -980,6 +990,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
'searchprofile-everything-tooltip' => 'Pretraži sve sadržaje (ukljujući i stranice za razgovor)',
'searchprofile-advanced-tooltip' => 'Traži u ostalim imenskim prostorima',
'search-result-size' => '$1 ({{PLURAL:$2|1 rijeÄ|$2 rijeÄi}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Älan|$1 Älana|$1 Älanova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})',
'search-result-score' => 'Relevantnost: $1%',
'search-redirect' => '(preusmjeravanje $1)',
'search-section' => '(sekcija $1)',
@@ -1057,6 +1068,7 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
'contextlines' => 'Linija po pogotku:',
'contextchars' => 'Karaktera konteksta po liniji:',
'stub-threshold' => 'Formatiranje <a href="#" class="stub">linkova stranica u zaÄetku</a> (bajtova):',
+'stub-threshold-disabled' => 'IskljuÄen/a',
'recentchangesdays' => 'Broj dana za prikaz u nedavnim izmjenama:',
'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
@@ -1090,6 +1102,7 @@ Ovdje su navedene neke nasumiÄno odabrane vrijednosti koje možete koristiti: $
'prefs-files' => 'Datoteke',
'prefs-custom-css' => 'Prilagođeni CSS',
'prefs-custom-js' => 'Prilagođeni JS',
+'prefs-common-css-js' => 'ZajedniÄki CSS/JS za sve izglede (skinove):',
'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.
Ovo se ne može vratiti unazad.',
'prefs-emailconfirm-label' => 'E-mail potvrda:',
@@ -1129,9 +1142,15 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'prefs-advancedrendering' => 'Napredne opcije',
'prefs-advancedsearchoptions' => 'Napredne opcije',
'prefs-advancedwatchlist' => 'Napredne opcije',
-'prefs-display' => 'Postavke displeja',
+'prefs-displayrc' => 'Postavke displeja',
+'prefs-displaysearchoptions' => 'Postavke displeja',
+'prefs-displaywatchlist' => 'Postavke prikaza',
'prefs-diffs' => 'Razlike',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail adresa izgleda valjano',
+'email-address-validity-invalid' => 'Unesite valjanu e-mail adresu',
+
# User rights
'userrights' => 'Postavke korisniÄkih prava',
'userrights-lookup-user' => 'Menadžment korisniÄkih prava',
@@ -1215,6 +1234,7 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'right-hideuser' => 'Blokiranje korisniÄkog imena, i njegovo sakrivanje od javnosti',
'right-ipblock-exempt' => 'Zaobilaženje IP blokada, autoblokada i blokada IP grupe',
'right-proxyunbannable' => 'Zaobilaženje automatskih blokada proxy-ja',
+'right-unblockself' => 'Deblokiranje samog sebe',
'right-protect' => 'Promjena nivoa zaštite i uređivanje zaštićenih stranica',
'right-editprotected' => 'Uređivanje zaštićenih stranica (bez povezanih zaštita)',
'right-editinterface' => 'UreÄ‘ivanje korisniÄkog interfejsa',
@@ -1237,7 +1257,6 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'right-siteadmin' => 'ZakljuÄavanje i otkljuÄavanje baze podataka',
'right-reset-passwords' => 'Resetiranje lozinke drugih korisnika',
'right-override-export-depth' => 'Izvoz stranica ukljuÄujući povezane stranice do dubine od 5 linkova',
-'right-versiondetail' => 'Prikaži informaciju o proširenoj verziji softvera',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
# User rights log
@@ -1288,14 +1307,9 @@ TakoÄ‘er omogućuje drugim korisnicima da vas kontaktiraju preko VaÅ¡e korisniÄ
'recentchanges-legend' => 'Postavke za Nedavne promjene',
'recentchangestext' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
'recentchanges-feed-description' => 'Praćenje nedavnih izmjena na ovom wikiju u ovom feedu.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova stranica',
'recentchanges-label-newpage' => 'Ovom izmjenom je stvorena nova stranica',
-'recentchanges-legend-minor' => '$1 - manja izmjena',
'recentchanges-label-minor' => 'Ovo je manja izmjena',
-'recentchanges-legend-bot' => '$1 - izmjena bota',
'recentchanges-label-bot' => 'Ovu je izmjenu uÄinio bot',
-'recentchanges-legend-unpatrolled' => '$1 - nepatrolirana izmjena',
'recentchanges-label-unpatrolled' => 'Ova izmjena još nije patrolirana',
'rcnote' => "Ispod {{PLURAL:$1|je '''$1''' promjena|su '''$1''' zadnje promjene|su '''$1''' zadnjih promjena}} u {{PLURAL:$2|posljednjem '''$2''' danu|posljednja '''$2''' dana|posljednjih '''$2''' dana}}, od $4, $5.",
'rcnotefrom' => "Ispod {{PLURAL:$1|je '''$1''' izmjena|su '''$1''' zadnje izmjene|su '''$1''' zadnjih izmjena}} u {{PLURAL:$2|posljednjem '''$2''' danu|posljednja '''$2''' dana|posljednjih '''$2''' dana}}, od $4, $5.",
@@ -1342,6 +1356,9 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
'upload_directory_missing' => 'Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.',
'upload_directory_read_only' => 'Folder za postavljanje ($1) na webserveru je postavljen samo za Äitanje.',
'uploaderror' => 'Greška pri slanju',
+'upload-recreate-warning' => "'''Upozorenje: Datoteka s tim imenom je obrisana ili premještena.'''
+
+Zapisnik brisanja i premještanja za ovu stranicu je dostupan ovdje na uvid:",
'uploadtext' => "Koristite formu ispod za postavljanje datoteka.
Da bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|evidenciji postavljanja]], a brisanja u [[Special:Log/delete|evidenciji brisanja]].
@@ -1377,6 +1394,17 @@ Molimo Vas da promijenite ime datoteke i pokušate da je ponovo postavite.',
'filetype-banned-type' => "'''\".\$1\"''' nije dopuštena vrsta datoteke.
{{PLURAL:\$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} \$2.",
'filetype-missing' => 'Datoteka nema ekstenziju (poput ".jpg").',
+'empty-file' => 'Datoteka koju ste poslali je bila prazna.',
+'file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
+'filename-tooshort' => 'Ime datoteke je prekratko.',
+'filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'verification-error' => 'Ova datoteka nije prošla provjeru.',
+'hookaborted' => 'Izmjena koju ste pokušali napraviti prekinuta je od strane ekstenzije.',
+'illegal-filename' => 'Ime datoteke nije dopušteno.',
+'overwrite' => 'Presnimavanje preko postojeće datoteke nije dozvoljeno.',
+'unknown-error' => 'Desila se nepoznata greška.',
+'tmp-create-error' => 'Nije moguće napraviti privremenu datoteku.',
+'tmp-write-error' => 'Greška pri pisanju privremene datoteke.',
'large-file' => 'PreporuÄeno je da datoteke nisu veće od $1;
Ova datoteka je velika $2.',
'largefileserver' => 'Ova datoteka je veća nego što server dopušta.',
@@ -1405,13 +1433,14 @@ Ako i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošal
'fileexists-shared-forbidden' => 'Datoteka sa ovim imenom već postoji u zajedniÄkoj ostavi; molimo Vas da se vratite i poÅ¡aljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:',
'file-deleted-duplicate' => 'Datoteka koje je identiÄna ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego Å¡to nastavite sa njenim ponovnim postavljanjem.',
-'successfulupload' => 'Uspješno slanje',
'uploadwarning' => 'Upozorenje pri slanju',
'uploadwarning-text' => 'Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.',
'savefile' => 'Snimi datoteku',
'uploadedimage' => 'postavljeno "[[$1]]"',
'overwroteimage' => 'postavljena nova verzija datoteke "[[$1]]"',
'uploaddisabled' => 'Slanje fajlova je iskljuÄeno',
+'copyuploaddisabled' => 'Postavljanje putem URL nije omogućeno.',
+'uploadfromurl-queued' => 'VaÅ¡e postavljanje je na Äekanju.',
'uploaddisabledtext' => 'Postavljanje datoteka je onemogućeno.',
'php-uploaddisabledtext' => 'Postavljanje datoteka preko PHP je onemogućeno.
Molimo provjerite postavku za postavljanje datoteka.',
@@ -1433,6 +1462,14 @@ Potrebno je da razmotrite da li je u redu nastaviti sa postavljanjem ove datotek
Registar brisanja za ovu datoteku je prikazan ovdje kao referenca:",
'filename-bad-prefix' => "Naziv datoteke koju postavljate poÄinje sa '''\"\$1\"''', Å¡to je naziv koji obiÄno automatski dodjeljuju digitalni fotoaparati i kamere.
Molimo Vas da odaberete naziv datoteke koji opisuje njen sadržaj.",
+'upload-success-subj' => 'Uspješno slanje',
+'upload-success-msg' => 'Vaša datoteka iz [$2] je uspješno postavljena. Dostupna je ovdje: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem pri postavljanju',
+'upload-failure-msg' => 'Nastao je problem s Vašim postavljanjem iz [$2]:
+
+$1',
+'upload-warning-subj' => 'Upozorenje pri slanju',
+'upload-warning-msg' => 'Nastao je problem sa vašim postavljanjem sa [$2]. Morate se vratiti na [[Special:Upload/stash/$1|formular za postavljanje]] kako biste riješili ovaj problem.',
'upload-proto-error' => 'Pogrešan protokol',
'upload-proto-error-text' => 'Postavljanje sa vanjske lokacije zahtjeva URL-ove koji poÄinju sa <code>http://</code> ili <code>ftp://</code>.',
@@ -1499,6 +1536,7 @@ Klikom na zaglavlje kolone možete promjeniti naÄin sortiranja.',
'listfiles_search_for' => 'Traži ime medija:',
'imgfile' => 'datoteka',
'listfiles' => 'Spisak slika',
+'listfiles_thumb' => 'Smanjeni pregled',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Naziv',
'listfiles_user' => 'Korisnik',
@@ -1613,8 +1651,8 @@ Prije brisanja provjerite da li druge stranice vode na te Å¡ablone.',
'statistics-edits' => 'Broj izmjena od kako je instalirana {{SITENAME}}',
'statistics-edits-average' => 'ProsjeÄno izmjena po stranici',
'statistics-views-total' => 'Ukupno pregleda',
+'statistics-views-total-desc' => 'Pregledi nepostojećih stranica i posebnih stranica nisu ukljuÄeni',
'statistics-views-peredit' => 'Pregleda po izmjeni',
-'statistics-jobqueue' => 'Dužina [http://www.mediawiki.org/wiki/Manual:Job_queue akcija na Äekanju]',
'statistics-users' => 'Registrovani [[Special:ListUsers|korisnici]]',
'statistics-users-active' => 'Aktivni korisnici',
'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
@@ -1627,9 +1665,9 @@ Po pravilu, one se trebaju povezati sa konkretnim Älankom.<br />
Stranica se smatra stranicom za razvrstavanje, ukoliko koristi Å¡ablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage|stranica za razvrstavanje]]",
'doubleredirects' => 'Dvostruka preusmjerenja',
-'doubleredirectstext' => 'This page lists pages which redirect to other redirect pages.
-Each row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the "real" target page, which the first redirect should point to.
-<s>Crossed out</s> entries have been solved.',
+'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.
+Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, Å¡to obiÄno daje "pravi" ciljni Älanak, na koji bi prvo preusmjerenje i trebalo da pokazuje.
+<del>Precrtane</del> stavke su riješene.',
'double-redirect-fixed-move' => '[[$1]] je premješten, sada je preusmjerenje na [[$2]]',
'double-redirect-fixer' => 'PopravljaÄ preusmjerenja',
@@ -1652,6 +1690,8 @@ Each row contains links to the first and second redirect, as well as the target
'nmembers' => '$1 {{PLURAL:$1|Älan|Älanova}}',
'nrevisions' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
'nviews' => '$1 {{PLURAL:$1|pregled|pregleda}}',
+'nimagelinks' => 'Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}',
+'ntransclusions' => 'koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}',
'specialpage-empty' => 'Ne postoje rezultati za ovaj izvještaj.',
'lonelypages' => 'Stranice - siroÄići',
'lonelypagestext' => 'Slijedeće stranice nemaju linkove na ostalim stranicama na ovoj {{SITENAME}}.',
@@ -1810,34 +1850,40 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
'listgrouprights-removegroup-self-all' => 'Može ukloniti sve grupe sa svog raÄuna',
# E-mail user
-'mailnologin' => 'Nema adrese za slanje',
-'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.',
-'emailuser' => 'Pošalji E-mail ovom korisniku',
-'emailpage' => 'Pošalji e-mail ovom korisniku',
-'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
+'mailnologin' => 'Nema adrese za slanje',
+'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.',
+'emailuser' => 'Pošalji E-mail ovom korisniku',
+'emailpage' => 'Pošalji e-mail ovom korisniku',
+'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
E-mail adresa koju ste unijeli u [[Special:Preferences|VaÅ¡im korisniÄkim postavkama]] će biti prikazana kao adresa poÅ¡iljaoca, tako da će primaoc poruke moći da Vam odgovori.',
-'usermailererror' => 'Objekat maila je vratio grešku:',
-'defemailsubject' => '{{SITENAME}} e-pošta',
-'noemailtitle' => 'Nema adrese e-pošte',
-'noemailtext' => 'Ovaj korisnik nije naveo ispravnu adresu e-pošte.',
-'nowikiemailtitle' => 'E-mail nije dozvoljen',
-'nowikiemailtext' => 'Ovaj korisnik je odabrao da ne prima e-mail poštu od drugih korisnika.',
-'email-legend' => 'Slanje e-maila drugom {{SITENAME}} korisniku',
-'emailfrom' => 'Od:',
-'emailto' => 'Za:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'Poruka:',
-'emailsend' => 'Pošalji',
-'emailccme' => 'Pošalji mi kopiju moje poruke.',
-'emailccsubject' => 'Kopiranje Vaše poruke za $1: $2',
-'emailsent' => 'E-mail poruka poslata',
-'emailsenttext' => 'Vaša poruka je poslata e-poštom.',
-'emailuserfooter' => 'Ovaj e-mail je poslao $1 korisniku $2 putem funkcije "Pošalji e-mail korisniku" sa {{SITENAME}}.',
+'usermailererror' => 'Objekat maila je vratio grešku:',
+'defemailsubject' => '{{SITENAME}} e-pošta',
+'usermaildisabled' => 'KorisniÄki e-mail onemogućen',
+'usermaildisabledtext' => 'Ne možete poslati e-mail drugim korisnicima na ovoj wiki',
+'noemailtitle' => 'Nema adrese e-pošte',
+'noemailtext' => 'Ovaj korisnik nije naveo ispravnu adresu e-pošte.',
+'nowikiemailtitle' => 'E-mail nije dozvoljen',
+'nowikiemailtext' => 'Ovaj korisnik je odabrao da ne prima e-mail poštu od drugih korisnika.',
+'email-legend' => 'Slanje e-maila drugom {{SITENAME}} korisniku',
+'emailfrom' => 'Od:',
+'emailto' => 'Za:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'Poruka:',
+'emailsend' => 'Pošalji',
+'emailccme' => 'Pošalji mi kopiju moje poruke.',
+'emailccsubject' => 'Kopiranje Vaše poruke za $1: $2',
+'emailsent' => 'E-mail poruka poslata',
+'emailsenttext' => 'Vaša poruka je poslata e-poštom.',
+'emailuserfooter' => 'Ovaj e-mail je poslao $1 korisniku $2 putem funkcije "Pošalji e-mail korisniku" sa {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Ostavljanje sistemske poruke.',
+'usermessage-editor' => 'Sistem za poruke',
# Watchlist
'watchlist' => 'Moj spisak praćenja',
'mywatchlist' => 'Moj spisak praćenja',
-'watchlistfor' => "(za '''$1''')",
+'watchlistfor2' => 'Za $1 $2',
'nowatchlist' => 'Nemate niÅ¡ta na svom spisku praćenih Älanaka.',
'watchlistanontext' => 'Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.',
'watchnologin' => 'Niste prijavljeni',
@@ -1958,7 +2004,10 @@ Posljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]
'revertpage-nouser' => 'Vraćene izmjene korisnika (korisniÄko ime uklonjeno) na posljednju reviziju koju je naÄinio [[User:$1|$1]]',
'rollback-success' => 'Poništene izmjene korisnika $1;
vraćeno na posljednju verziju koju je snimio $2.',
-'sessionfailure' => "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+
+# Edit tokens
+'sessionfailure-title' => 'Greška u sesiji',
+'sessionfailure' => "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
# Protect
'protectlogpage' => 'Registar zaštite',
@@ -2093,19 +2142,23 @@ $1',
'month' => 'Od mjeseca (i ranije):',
'year' => 'Od godine (i ranije):',
-'sp-contributions-newbies' => 'Pokaži doprinose samo novih korisnika',
-'sp-contributions-newbies-sub' => 'Prikaži samo doprinose novih korisnika',
-'sp-contributions-newbies-title' => 'Doprinosi novih korisnika',
-'sp-contributions-blocklog' => 'registar blokiranja',
-'sp-contributions-deleted' => 'obrisani doprinosi korisnika',
-'sp-contributions-logs' => 'registri',
-'sp-contributions-talk' => 'razgovor',
-'sp-contributions-userrights' => 'postavke korisniÄkih prava',
-'sp-contributions-blocked-notice' => 'Ovaj korisnik je trenutno blokiran.
+'sp-contributions-newbies' => 'Pokaži doprinose samo novih korisnika',
+'sp-contributions-newbies-sub' => 'Prikaži samo doprinose novih korisnika',
+'sp-contributions-newbies-title' => 'Doprinosi novih korisnika',
+'sp-contributions-blocklog' => 'registar blokiranja',
+'sp-contributions-deleted' => 'obrisani doprinosi korisnika',
+'sp-contributions-uploads' => 'postavljanja',
+'sp-contributions-logs' => 'registri',
+'sp-contributions-talk' => 'razgovor',
+'sp-contributions-userrights' => 'postavke korisniÄkih prava',
+'sp-contributions-blocked-notice' => 'Ovaj korisnik je trenutno blokiran.
Posljednje stavke evidencije blokiranja možete pogledati ispod:',
-'sp-contributions-search' => 'Pretraga doprinosa',
-'sp-contributions-username' => 'IP adresa ili korisniÄko ime:',
-'sp-contributions-submit' => 'Traži',
+'sp-contributions-blocked-notice-anon' => 'Ova IP adresa je trenutno blokirana.
+Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
+'sp-contributions-search' => 'Pretraga doprinosa',
+'sp-contributions-username' => 'IP adresa ili korisniÄko ime:',
+'sp-contributions-toponly' => 'Prikaži samo izmjene koje su posljednje revizije',
+'sp-contributions-submit' => 'Traži',
# What links here
'whatlinkshere' => 'Å ta je povezano ovdje',
@@ -2166,7 +2219,6 @@ Unesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su
'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
'ipb-unblock-addr' => 'Deblokiraj $1',
'ipb-unblock' => 'Deblokiraj korisniÄko ime ili IP adresu',
-'ipb-blocklist-addr' => 'Postojeće blokade za $1',
'ipb-blocklist' => 'Vidi postojeće blokade',
'ipb-blocklist-contribs' => 'Doprinosi za $1',
'unblockip' => 'Odblokiraj korisnika',
@@ -2244,6 +2296,8 @@ Ne možete napraviti raÄun',
'cant-block-while-blocked' => 'Ne možete blokirati druge korisnike dok ste blokirani.',
'cant-see-hidden-user' => 'Korisnik kojeg pokušavate blokirati je već blokiran i sakriven.
Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.',
+'ipbblocked' => 'Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani',
+'ipbnounblockself' => 'Nije Vam dopušteno da deblokirate samog sebe',
# Developer tools
'lockdb' => 'ZakljuÄajte bazu',
@@ -2281,6 +2335,17 @@ To znaÄi da stranicu možete ponovno preimenovati u stari naslov ako je u pitan
'''UPOZORENJE!'''
Ovo može biti drastiÄna i neoÄekivana promjena za popularnu stranicu;
budite sigurni da ste shvatili sve posljedice prije nego Å¡to nastavite.",
+'movepagetext-noredirectfixer' => "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.
+Stari naziv će postati preusmjerenje na novi naziv.
+Molimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].
+Vi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.
+
+Imajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.
+Ovo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.
+
+'''Pažnja!'''
+Imajte na umu da preusmjeravanje popularnog Älanka može biti
+drastiÄna i neoÄekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego Å¡to nastavite.",
'movepagetalktext' => "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''
*Neprazna stranica za razgovor već postoji pod novim imenom, ili
*OdznaÄite donju kutiju.
@@ -2336,6 +2401,7 @@ Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
'immobile-source-page' => 'Ova stranica se ne može premještati.',
'immobile-target-page' => 'Ne može se preusmjeriti na taj odredišni naslov.',
'imagenocrossnamespace' => 'Ne može se premjestiti datoteka u nedatoteÄni imenski prostor',
+'nonfile-cannot-move-to-file' => 'Ne mogu se premjestiti podaci u datoteÄni imenski prostor',
'imagetypemismatch' => 'Ekstenzija nove datoteke ne odgovara njenom tipu',
'imageinvalidfilename' => 'Ciljno ime datoteke nije valjano',
'fix-double-redirects' => 'Ažuriraj sva preusmjerenja koja vode ka originalnom naslovu',
@@ -2416,6 +2482,7 @@ Snimite je na VaÅ¡em raÄunaru i poÅ¡aljite ovdje.',
'importstart' => 'Uvoženje stranica…',
'import-revision-count' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
'importnopages' => 'Nema stranica za uvoz.',
+'imported-log-entries' => '{{PLURAL:$1|Uvezena $1 stavka registra|Uvezene $1 stavke registra|Uvezeno $1 stavki registra}}.',
'importfailed' => 'Uvoz nije uspio: <nowiki>$1</nowiki>',
'importunknownsource' => 'Nepoznat izvorni tip uvoza',
'importcantopen' => 'Ne može se otvoriti uvozna datoteka',
@@ -2515,6 +2582,8 @@ Možete vidjeti njen izvor',
'tooltip-rollback' => '"Povrat" briÅ¡e izmjenu/e posljednjeg ureÄ‘ivaÄa ove stranice jednim klikom',
'tooltip-undo' => 'Vraća ovu izmjenu i otvara formu uređivanja u modu pretpregleda.
Dozvoljava unošenje razloga za to u sažetku.',
+'tooltip-preferences-save' => 'Snimi postavke',
+'tooltip-summary' => 'Unesite kratki sažetak',
# Metadata
'nodublincore' => 'Dublin Core RDF metapodaci onemogućeni za ovaj server.',
@@ -2604,19 +2673,22 @@ $1',
'nextdiff' => 'Novija izmjena →',
# Media information
-'mediawarning' => "'''Upozorenje''': Ova datoteka može sadržavati loš kod.
+'mediawarning' => "'''Upozorenje''': Ova datoteka sadrži loš kod.
Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
'imagemaxsize' => "OgraniÄenje veliÄine slike:<br />''(za stranice opisa datoteke)''",
'thumbsize' => 'VeliÄina umanjenog prikaza:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|stranica|stranice|stranica}}',
-'file-info' => '(veliÄina datoteke: $1, MIME tip: $2)',
-'file-info-size' => '($1 × $2 piksela, veliÄina datoteke/fajla: $3, MIME tip: $4)',
+'file-info' => 'veliÄina datoteke: $1, MIME tip: $2',
+'file-info-size' => '$1 × $2 piksela, veliÄina datoteke/fajla: $3, MIME tip: $4',
'file-nohires' => '<small>Veća rezolucija nije dostupna.</small>',
-'svg-long-desc' => '(SVG fajl, nominalno $1 × $2 piksela, veliÄina fajla: $3)',
+'svg-long-desc' => 'SVG fajl, nominalno $1 × $2 piksela, veliÄina fajla: $3',
'show-big-image' => 'Puna rezolucija',
'show-big-image-thumb' => '<small>VeliÄina ovog prikaza: $1 × $2 piksela</small>',
'file-info-gif-looped' => 'stalno iznova',
'file-info-gif-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄice|sliÄica}}',
+'file-info-png-looped' => 'stalno iznova',
+'file-info-png-repeat' => 'pregledano $1 {{PLURAL:$1|put|puta}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄice|sliÄica}}',
# Special:NewFiles
'newimages' => 'Galerija novih slika',
@@ -2772,6 +2844,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
'exif-gpsareainformation' => 'Naziv GPS podruÄja',
'exif-gpsdatestamp' => 'GPS datum',
'exif-gpsdifferential' => 'GPS diferencijalna korekcija',
+'exif-objectname' => 'Kratki naslov',
# EXIF attributes
'exif-compression-1' => 'Nekompresovano',
@@ -2938,31 +3011,31 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
'limitall' => 'sve',
# E-mail address confirmation
-'confirmemail' => 'Potvrdite adresu e-pošte',
-'confirmemail_noemail' => 'Niste unijeli taÄnu e-mail adresu u VaÅ¡e [[Special:Preferences|korisniÄke postavke]].',
-'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž
+'confirmemail' => 'Potvrdite adresu e-pošte',
+'confirmemail_noemail' => 'Niste unijeli taÄnu e-mail adresu u VaÅ¡e [[Special:Preferences|korisniÄke postavke]].',
+'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž
Aktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.
PoÅ¡ta ukljuÄuje poveznicu koja sadrži kod;
uÄitajte poveznicu u VaÅ¡ brauzer da bi ste potvrdili da je adresa VaÅ¡e e-poÅ¡te valjana.',
-'confirmemail_pending' => 'Kod za potvrdu Vam je već poslan putem e-maila;
+'confirmemail_pending' => 'Kod za potvrdu Vam je već poslan putem e-maila;
ako ste nedavno otvorili VaÅ¡ raÄun, trebali bi priÄekati par minuta da poslana poÅ¡ta stigne, prije nego Å¡to ponovno zahtijevate novi kod.',
-'confirmemail_send' => 'Pošaljite kod za potvrdu',
-'confirmemail_sent' => 'E-pošta za potvrđivanje poslata.',
-'confirmemail_oncreate' => 'Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.
+'confirmemail_send' => 'Pošaljite kod za potvrdu',
+'confirmemail_sent' => 'E-pošta za potvrđivanje poslata.',
+'confirmemail_oncreate' => 'Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.
Taj kod nije neophodan za prijavljivanje, ali Vam je potreban kako bi ste omogućili funkcije wikija zasnovane na e-mailu.',
-'confirmemail_sendfailed' => '{{SITENAME}} Vam ne može poslati poštu za potvrđivanje.
+'confirmemail_sendfailed' => '{{SITENAME}} Vam ne može poslati poštu za potvrđivanje.
Provjerite adresu zbog nepravilnih karaktera.
Povratna pošta: $1',
-'confirmemail_invalid' => 'NetaÄan kod za potvrdu.
+'confirmemail_invalid' => 'NetaÄan kod za potvrdu.
Moguće je da je kod istekao.',
-'confirmemail_needlogin' => 'Morate $1 da bi ste potvrdili Vašu e-mail adresu.',
-'confirmemail_success' => 'Adresa vaše e-pošte je potvrđena.
+'confirmemail_needlogin' => 'Morate $1 da bi ste potvrdili Vašu e-mail adresu.',
+'confirmemail_success' => 'Adresa vaše e-pošte je potvrđena.
Možete sad da se [[Special:UserLogin|prijavite]] i uživate u viki.',
-'confirmemail_loggedin' => 'Adresa Vaše e-pošte je potvrđena.',
-'confirmemail_error' => 'Nešto je pošlo krivo prilikom snimanja vaše potvrde.',
-'confirmemail_subject' => '{{SITENAME}} adresa e-pošte za potvrdu',
-'confirmemail_body' => 'Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog "$2" sa ovom adresom e-pošte na {{SITENAME}}.
+'confirmemail_loggedin' => 'Adresa Vaše e-pošte je potvrđena.',
+'confirmemail_error' => 'Nešto je pošlo krivo prilikom snimanja vaše potvrde.',
+'confirmemail_subject' => '{{SITENAME}} adresa e-pošte za potvrdu',
+'confirmemail_body' => 'Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog "$2" sa ovom adresom e-pošte na {{SITENAME}}.
Da potvrdite da ovaj nalog stvarno pripada vama i da aktivirate mogućnost e-pošte na {{SITENAME}}, otvorite ovaj link u vašem pregledniku:
@@ -2972,8 +3045,34 @@ Ako ovo niste vi, pratite ovaj link da prekinete prijavu:
$5
Ovaj kod za potvrdu će isteći u $4.',
-'confirmemail_invalidated' => 'Potvrda e-mail adrese otkazana',
-'invalidateemail' => 'Odustani od e-mail potvrde',
+'confirmemail_body_changed' => 'Neko, vjerovatno Vi, je sa IP adrese $1
+je promijenio adresu e-poÅ¡te raÄuna "$2" na ovu adresu za {{SITENAME}}.
+
+Da potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:
+
+$3
+
+Ako ovaj raÄun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-poÅ¡te:
+
+$5
+
+Ovaj kod za potvrdu će isteći u $4.',
+'confirmemail_body_set' => 'Netko, vjerovatno Vi, sa IP adrese $1,
+je postavio e-mail adresu za raÄun "$2" na ovoj adresi za {{SITENAME}}.
+
+Da potvrdite kako ovaj raÄun uistinu pripada Vama i reaktivirate
+e-mail postavke na {{SITENAME}}, otvoriti ovaj link u vašem pregledniku:
+
+$3
+
+Ako raÄun *ne* pripada Vama, pratite ovaj link
+kako bi poništili potvrdu e-mail adrese:
+
+$5
+
+Ovaj kod za potvrdu će isteći u $4.',
+'confirmemail_invalidated' => 'Potvrda e-mail adrese otkazana',
+'invalidateemail' => 'Odustani od e-mail potvrde',
# Scary transclusion
'scarytranscludedisabled' => '[MeÄ‘uwiki umetanje je iskljuÄeno]',
@@ -3014,6 +3113,7 @@ Molimo Vas da potvrdite da stvarno želite da ponovo napravite ovaj Älanak.",
'table_pager_first' => 'Prva stranica',
'table_pager_last' => 'Zadnja stranica',
'table_pager_limit' => 'Pokaži $1 stavki po stranici',
+'table_pager_limit_label' => 'Stavke po stranici:',
'table_pager_limit_submit' => 'Idi',
'table_pager_empty' => 'Bez rezultata',
@@ -3070,6 +3170,7 @@ TakoÄ‘er možete [[Special:Watchlist/edit|koristiti standardni ureÄ‘ivaÄ]].',
'version-specialpages' => 'Posebne stranice',
'version-parserhooks' => 'Kuke parsera',
'version-variables' => 'Promjenjive',
+'version-skins' => 'Izgledi (skinovi)',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'UpravljaÄi medije',
'version-hooks' => 'Kuke',
@@ -3081,6 +3182,13 @@ TakoÄ‘er možete [[Special:Watchlist/edit|koristiti standardni ureÄ‘ivaÄ]].',
'version-hook-subscribedby' => 'Pretplaćeno od',
'version-version' => '(Verzija $1)',
'version-license' => 'Licenca',
+'version-poweredby-credits' => "Ova wiki je zasnovana na '''[http://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
+'version-poweredby-others' => 'ostali',
+'version-license-info' => 'Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.
+
+Mediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, Äak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREÄENU SVRHU. Pogledajte GNU opću javnu licencu za viÅ¡e detalja.
+
+Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] zajedno s ovim programom, ako niste, piÅ¡ite Fondaciji Slobodnog Softvera na adresu Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je proÄitajte [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html online].',
'version-software' => 'Instalirani softver',
'version-software-product' => 'Proizvod',
'version-software-version' => 'Verzija',
@@ -3151,6 +3259,15 @@ Unesite ime datoteke bez "{{ns:file}}:" prefiksa.',
'tags-edit' => 'uređivanje',
'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
+# Special:ComparePages
+'comparepages' => 'Usporedi stranice',
+'compare-selector' => 'Usporedi revizije stranica',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Ispravljanje 1',
+'compare-rev2' => 'Ispravljanje 2',
+'compare-submit' => 'Usporedi',
+
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
'dberr-problems' => 'Žao nam je! Ova stranica ima tehniÄke poteÅ¡koće.',
@@ -3167,8 +3284,13 @@ Unesite ime datoteke bez "{{ns:file}}:" prefiksa.',
'htmlform-float-invalid' => 'Vrijednost koju ste unijeli nije broj.',
'htmlform-int-toolow' => 'Vrijednost koju ste unijeli je ispod minimuma od $1',
'htmlform-int-toohigh' => 'Vrijednost koju ste unijeli je iznad maksimuma od $1',
+'htmlform-required' => 'Ova vrijednost je obavezna',
'htmlform-submit' => 'Unesi',
'htmlform-reset' => 'Vrati izmjene',
'htmlform-selectorother-other' => 'Ostalo',
+# SQLite database support
+'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
+'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
+
);
diff --git a/languages/messages/MessagesShi.php b/languages/messages/MessagesShi.php
index 2a12c4c2..8f271cc2 100644
--- a/languages/messages/MessagesShi.php
+++ b/languages/messages/MessagesShi.php
@@ -11,8 +11,6 @@
* @author Zanatos
*/
-$fallback = 'ar';
-
$messages = array(
# User preference toggles
'tog-underline' => 'krrj du izdayn:',
@@ -29,8 +27,7 @@ $messages = array(
'tog-editsection' => 'Mmurzm i imbddln n w-ayyawn izdayn n « [Bddel] »',
'tog-editsectiononrightclick' => 'Yan uklik s tsga tafasi f uzwl n w-ayyaw bac ad tsbadlt ɣtad (ira JavaScript)',
'tog-showtoc' => 'Mel Taflwit n tngawin (i tisniwin lli dar 3 w-ayyawn)',
-'tog-rememberpassword' => 'Sektid akccum inu ɣu-amsuddas ad',
-'tog-editwidth' => 'Simɣur tanaka n-umẓṛag ard tamu amiẓar',
+'tog-rememberpassword' => 'Askti nu ukcum ɣ Urdinaturad (Iɣ kullu tggut $1 {{PLURAL:$1|Ass|Ass}})',
'tog-watchcreations' => 'Zaydn tasniwin lli skrɣ i umuɣ n tilli ssuġiɣ.',
'tog-watchdefault' => 'Zaydn tasniwin lli tżrigɣ i umuɣ n tilli tsaggaɣ',
'tog-watchmoves' => 'Zayd tisniwin lli smattayɣ i tilli tsggaɣ.',
@@ -174,31 +171,21 @@ $messages = array(
'faqpage' => 'Project: Isqqsit li bdda',
# Vector skin
-'vector-action-addsection' => 'Zayd amli',
-'vector-action-delete' => 'Ḥiyd',
-'vector-action-move' => 'Smmatti',
-'vector-action-protect' => 'Ḥbu',
-'vector-action-undelete' => 'Rard may mayḥiydn',
-'vector-action-unprotect' => 'Ḥiyd aḥbu',
-'vector-namespace-category' => 'Taggayt',
-'vector-namespace-help' => 'Tasnat n w-aws',
-'vector-namespace-image' => 'Asdaw',
-'vector-namespace-main' => 'Tasna',
-'vector-namespace-media' => 'Tasnat ntuzzumt',
-'vector-namespace-mediawiki' => 'Tabrat',
-'vector-namespace-project' => 'Tasnat n tuwuri',
-'vector-namespace-special' => 'Tsnat timẓlit',
-'vector-namespace-talk' => 'Amsgdal',
-'vector-namespace-template' => 'Talɣa',
-'vector-namespace-user' => 'Tasnat user',
-'vector-view-create' => 'Skert',
-'vector-view-edit' => 'Ara',
-'vector-view-history' => 'Mel amzruy',
-'vector-view-view' => 'É£r',
-'vector-view-viewsource' => 'Ẓr asagm',
-'actions' => 'Imskarn',
-'namespaces' => 'Ismawn n tɣula',
-'variants' => 'lmotaghayirat',
+'vector-action-addsection' => 'Zayd amli',
+'vector-action-delete' => 'Ḥiyd',
+'vector-action-move' => 'Smmatti',
+'vector-action-protect' => 'Ḥbu',
+'vector-action-undelete' => 'Rard may mayḥiydn',
+'vector-action-unprotect' => 'Ḥiyd aḥbu',
+'vector-simplesearch-preference' => 'Mmurzm immalatn n icnubcn lan atig (I Vector waḥdut )',
+'vector-view-create' => 'Skert',
+'vector-view-edit' => 'Ara',
+'vector-view-history' => 'Mel amzruy',
+'vector-view-view' => 'É£r',
+'vector-view-viewsource' => 'Ẓr asagm',
+'actions' => 'Imskarn',
+'namespaces' => 'Ismawn n tɣula',
+'variants' => 'lmotaghayirat',
'errorpagetitle' => 'Laffut',
'returnto' => 'Urri s $1.',
@@ -257,6 +244,9 @@ $messages = array(
'view-pool-error' => 'Surf, iqddacn žayn É£ilad. mnnaw midn yaá¸nin ay siggiln tasna yad. Qqel imik fad addaÉ£ talst at tarmt at lkmt tasna yad
$1',
+'pool-timeout' => 'Tzrit tizi n uql lli yak ittuykfan. Ggutn midn lli iran ad iẓr tasna yad. Urrid yan imik..',
+'pool-queuefull' => 'Umuɣ n twuri iẓun (iεmr)',
+'pool-errorunknown' => 'Anzri (error) ur ittuyssan.',
# 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' => 'F {{SITENAME}}',
@@ -390,7 +380,7 @@ lcont nek tuyskar .
'yourname' => 'smiyt o-msxdam:',
'yourpassword' => 'awal iḥdan:',
'yourpasswordagain' => 'Зawd ara awal iḥdan:',
-'remembermypassword' => 'Askti nu ukcum ɣ lurdinaturad',
+'remembermypassword' => 'Askti nu ukcum ɣ Urdinaturad (Iɣ kullu tggut $1 {{PLURAL:$1|Ass|Ass}})',
'yourdomainname' => 'Taɣult nek',
'externaldberror' => 'Imma tlla ɣin kra lafut ɣu ukcumnk ulla urak ittuyskar at tsbddelt lkontnk nbrra.',
'login' => 'Kcm ɣid',
@@ -407,6 +397,7 @@ lcont nek tuyskar .
'gotaccount' => 'Is nit dark amidan(lkunt)? $1.',
'gotaccountlink' => 'Kcm',
'createaccountmail' => 'S tirawt taliktunant',
+'createaccountreason' => 'Maɣ:',
'badretype' => 'Tasarut lin tgit ur dis tucka.',
'userexists' => 'Asaɣ nu umsqdac li tskcmt illa yad',
'loginerror' => 'Gar akccum',
@@ -424,6 +415,9 @@ Ussaɣ n isqdacn ḥiln hlli.
'emailconfirmlink' => 'Als i tasna nk n tbratin izd nit nttat ayan.',
'loginlanguagelabel' => 'Tutlayt: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'Kra ur igadda tasɣnt btbratin() n PHP.',
+
# Password reset dialog
'resetpass' => 'bddl taguri n uzray',
'resetpass_announce' => 'Tkcmt {{GENDER:||e|(e)}} s yat tangalt lli kin ilkmt s tbrat emeil . tangaltad ur tgi abla tin yat twalt. Bac ad tkmlt tqqiyyidank kcm tangalt tamaynut nk ɣid:',
@@ -472,6 +466,7 @@ Han irwas is yad tsbadlt awal n uzri niÉ£d is á¸albt yan yaá¸n n yat tklit.',
'showlivepreview' => 'Iẓṛi izrbn (ⵉⵥⵕⵉ ⵉⵣⵔⴱâµ)',
'showdiff' => 'Mel imbddln lli ifttun',
'anoneditwarning' => "Han ''' ur ttuyssant ''' rad ibayn IP nk ɣ umzrut n tasna yad, ur sul iḥba tamagit nk",
+'anonpreviewwarning' => 'ur ittuyssan mat tgit. Iɣ tgdl tawuri nk, tansa nk IP rad tbayn ɣ umzruy n imbdln n tasna yad.',
'missingsummary' => "'''Adakt nskti :''' ur ta tfit awal imun n imbddln nk.
IÉ£ tklikkit tiklit yaá¸n f tjrrayt « {{int:savearticle}} », aẓṛig rad ittuyskar blla tsnt",
'missingcommenttext' => 'Σafak skjm awnnit (aɣfawal) nk ɣ uflla.',
@@ -561,6 +556,8 @@ ikhssak ola kiyi ador tnqilt ɣtamani yadni.
'revdelete-unsuppress' => 'Kkiss iqqntn i imcggrn llid n surri.',
'revdelete-log' => 'Maɣ..acku:',
'revdel-restore' => 'sbadl tannayt',
+'revdel-restore-deleted' => 'Imsurritn lli ttuykkasnin',
+'revdel-restore-visible' => 'Imsurritn lli baynnin',
'pagehist' => 'Amzruy n tasna',
'deletedhist' => 'Amzruy lli ittuykkasn',
'revdelete-content' => 'Mayllan',
@@ -604,11 +601,13 @@ ikhssak ola kiyi ador tnqilt ɣtamani yadni.
# Diffs
'history-title' => 'Asakud n umcggr n « $1 »',
'difference' => 'laḥna gr tamzwarut d tamǧarut',
+'difference-multipage' => 'Amzaray (laḥna) gr tisniwin',
'lineno' => 'Izriri $1:',
'compareselectedversions' => 'Snahya gr ilqmn lli tuystaynin',
'showhideselectedversions' => 'Ml/Ḥbu ilqmn lli ittuystayn',
'editundo' => 'Urri',
-'diff-multi' => '({{PLURAL:$1|Gr yan usurri|$1 gr isuritn}} ura tuyfsar)',
+'diff-multi' => '({{PLURAL:$1|yan ulqm gratsn|$1 ilqmn gratsn}} z {{PLURAL:$2|umqdac|$2 imqdacn}} {{PLURAL:$1|iḥba|ḥban}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|yan ulqm n gratsn|$1 ilqmn ngratsn}} zdar mnnaw {{PLURAL:$2|amcgr |n $2 imcgrn}} {{PLURAL:$1|iḥba|lli iḥban}})',
# Search results
'searchresults' => 'Mad akkan icnubcn',
@@ -710,6 +709,7 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
'contextlines' => 'stour gh natija',
'contextchars' => 'lhrof gh natija',
'stub-threshold' => 'wasla n <a href="#" class="stub">do amzdoy</a> itforma (bytes):',
+'stub-threshold-disabled' => 'moattal',
'recentchangesdays' => 'adad liyam lmroda gh ahdat tghyirat',
'localtime' => '↓Tizi n ugmaḠad:',
'servertime' => 'Asaru n Tizi',
@@ -974,19 +974,21 @@ Ha riglaj n ɣila lli f tlla tasna '''$1''' :",
'month' => 'Z usggas (d urbur):',
'year' => 'Z usggas (d urbur):',
-'sp-contributions-newbies' => 'Ad ur tmlt abla tiwuriwin n wiyyaá¸',
-'sp-contributions-newbies-sub' => 'Z imiá¸an (comptes) imaynutn',
-'sp-contributions-newbies-title' => 'Tiwuriwin n umqdac z imá¸an imaynutn',
-'sp-contributions-blocklog' => 'Tinɣmas n willi ttuyqqanin (blocage)',
-'sp-contributions-deleted' => 'Tiwuriwin lli ittuykkasnin',
-'sp-contributions-logs' => 'IÉ£misn',
-'sp-contributions-talk' => 'Sgdl (discuter)',
-'sp-contributions-userrights' => 'Sgiddi izrfan',
-'sp-contributions-blocked-notice' => 'Amsqdac ad ittuysbddad. Maf ittuysbddad illa ɣ uɣmmis n n willi n sbid. Mayad ɣ trit ad tsnt maɣ',
-'sp-contributions-search' => 'Cnubc f tiwuriwin',
-'sp-contributions-username' => 'Tansa IP niɣ assaɣ nu umsqdac:',
-'sp-contributions-submit' => 'Cabba (Sigl)',
-'sp-contributions-explain' => '↓',
+'sp-contributions-newbies' => 'Ad ur tmlt abla tiwuriwin n wiyyaá¸',
+'sp-contributions-newbies-sub' => 'Z imiá¸an (comptes) imaynutn',
+'sp-contributions-newbies-title' => 'Tiwuriwin n umqdac z imá¸an imaynutn',
+'sp-contributions-blocklog' => 'Tinɣmas n willi ttuyqqanin (blocage)',
+'sp-contributions-deleted' => 'Tiwuriwin lli ittuykkasnin',
+'sp-contributions-logs' => 'IÉ£misn',
+'sp-contributions-talk' => 'Sgdl (discuter)',
+'sp-contributions-userrights' => 'Sgiddi izrfan',
+'sp-contributions-blocked-notice' => 'Amsqdac ad ittuysbddad. Maf ittuysbddad illa ɣ uɣmmis n n willi n sbid. Mayad ɣ trit ad tsnt maɣ',
+'sp-contributions-blocked-notice-anon' => 'Tansa yad IP ttuysbddad. Maf ittuysbddad illa ɣ uɣmmis n n willi n sbid. Mayad ɣ trit ad tsnt maɣ',
+'sp-contributions-search' => 'Cnubc f tiwuriwin',
+'sp-contributions-username' => 'Tansa IP niɣ assaɣ nu umsqdac:',
+'sp-contributions-toponly' => 'Ad urtmlt adla mat ittuyẓran tigira yad',
+'sp-contributions-submit' => 'Cabba (Sigl)',
+'sp-contributions-explain' => '↓',
# What links here
'whatlinkshere' => 'May izdayn ɣid',
@@ -1134,8 +1136,9 @@ Maya Iẓá¸ar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fl
'nextdiff' => 'Ambdl d ittfrn →',
# Media information
-'file-info-size' => '($1 × $2 piksil, asdaw tugut: $3, MIME anaw: $4)',
+'file-info-size' => '$1 × $2 piksil, asdaw tugut: $3, MIME anaw: $4',
'file-nohires' => '↓<small>Ur tlli tabudut tamqrant.</small>',
+'svg-long-desc' => 'Asdaw SVG, Tabadut n $1 × $2 ifrdan, Tiddi : $3',
'show-big-image' => 'balak',
'show-big-image-thumb' => '<small>Size of this preview: $1 × $2 pixels</small>',
@@ -1263,6 +1266,7 @@ WiyyaḠraggis ḥbun s ɣiklli sttin kkan gantn
'version-extension-functions' => 'lkhdaym n limtidad',
'version-parser-extensiontags' => 'imarkiwn n limtidad n lmohalil',
'version-parser-function-hooks' => 'lkhtatif ndala',
+'version-poweredby-others' => 'wiyyad',
'version-software-product' => 'lmntoj',
'version-software-version' => 'noskha',
@@ -1298,6 +1302,15 @@ WiyyaḠraggis ḥbun s ɣiklli sttin kkan gantn
'tags-hitcount-header' => 'tghyiran markanin',
'tags-edit' => 'bddl',
+# Special:ComparePages
+'comparepages' => 'qarnn tiwriqin',
+'compare-selector' => 'qarn lmorajaa ntwriqin',
+'compare-page1' => 'tawriqt 1',
+'compare-page2' => 'tawriqt 2',
+'compare-rev1' => 'morajaa 1',
+'compare-rev2' => 'morajaa 2',
+'compare-submit' => 'qarn',
+
# HTML forms
'htmlform-submit' => 'sifd',
'htmlform-reset' => 'sglbd tghyirat',
diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php
index 0495e462..928e2f84 100644
--- a/languages/messages/MessagesSi.php
+++ b/languages/messages/MessagesSi.php
@@ -20,7 +20,9 @@
* @author තඹරු විජේසේකර
* @author දසනà·à¶¶à·…යà·
* @author නන්දිමිතුරු
+ * @author පසිඳු කà·à·€à·’න්ද
* @author බිඟුවà·
+ * @author රොමà·à¶±à·’ස් à·ƒà·à¶¸à·”වෙල්
* @author à·à·Šà·€à·™à¶­
*/
@@ -52,100 +54,104 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'ද්විත්ව යළි-යොමුකිරීම්' ),
- 'BrokenRedirects' => array( 'භින්න යළි-යොමුකිරීම්' ),
+ 'DoubleRedirects' => array( 'ද්විත්ව_යළි-යොමුකිරීම්' ),
+ 'BrokenRedirects' => array( 'භින්න_යළි-යොමුකිරීම්' ),
'Disambiguations' => array( 'වක්â€à¶»à·à¶­à·Šà¶­à·’හරණයන්' ),
- 'Userlogin' => array( 'පරිà·à·“ලක ප්â€à¶»à·€à·’ෂ්ටය' ),
- 'Userlogout' => array( 'පරිà·à·“ලක නිෂ්ක්â€à¶»à¶¸à¶«à¶º' ),
- 'CreateAccount' => array( 'ගිණුම තà·à¶±à·“මට' ),
+ 'Userlogin' => array( 'පරිà·à·“ලක_ප්â€à¶»à·€à·’ෂ්ටය' ),
+ 'Userlogout' => array( 'පරිà·à·“ලක_නිෂ්ක්â€à¶»à¶¸à¶«à¶º' ),
+ 'CreateAccount' => array( 'ගිණුම_තà·à¶±à·“මට' ),
'Preferences' => array( 'අභිරුචියන්' ),
- 'Watchlist' => array( 'මුරලà·à¶ºà·’ස්තුව' ),
- 'Recentchanges' => array( 'මෑත වෙනස්වීම්' ),
- 'Upload' => array( 'උඩුගත කිරීම' ),
- 'Listfiles' => array( 'රූප ලà·à¶ºà·’ස්තුව' ),
- 'Newimages' => array( 'අලුත් රූප' ),
- 'Listusers' => array( 'පරිà·à·“ලකයන් ලà·à¶ºà·’ස්තු ගත කරන්න', 'පරිà·à·“ලක ලà·à¶ºà·’ස්තුව' ),
- 'Listgrouprights' => array( 'කණ්ඩà·à¶ºà¶¸à·Š හිමිකම් ලà·à¶ºà·’ස්තුගතකරන්න' ),
- 'Statistics' => array( 'සංඛ්â€à¶ºà·à¶± දත්ත' ),
- 'Randompage' => array( 'අහඹු ලෙස', 'අහඹු පිටුව' ),
- 'Lonelypages' => array( 'හුදකල෠පිටුව' ),
- 'Uncategorizedpages' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය නොකල පිටු' ),
- 'Uncategorizedcategories' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය නොකල ප්â€à¶»à·€à¶»à·Šà¶œ' ),
- 'Uncategorizedimages' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය නොකල රූප' ),
- 'Uncategorizedtemplates' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය නොකල à·ƒà·à¶šà·’ලි' ),
- 'Unusedcategories' => array( 'à·„à·à·€à·’ත෠නොවන ප්â€à¶»à·€à¶»à·Šà¶œ' ),
- 'Unusedimages' => array( 'à·„à·à·€à·’ත෠නොවන රූප' ),
- 'Wantedpages' => array( 'අවà·à·Šâ€à¶º පිටු' ),
- 'Wantedcategories' => array( 'අවà·à·Šâ€à¶º ප්â€à¶»à·€à¶»à·Šà¶œ' ),
- 'Wantedfiles' => array( 'අවà·à·Šâ€à¶º ගොනු' ),
- 'Wantedtemplates' => array( 'අවà·à·Šâ€à¶º à·ƒà·à¶šà·’ලි' ),
- 'Mostlinked' => array( 'බොහ෠ලෙසින් සබà·à¶³à·’' ),
- 'Mostlinkedcategories' => array( 'බොහ෠ලෙසින් සබà·à¶³à·’ ප්â€à¶»à·€à¶»à·Šà¶œ', 'බෙහෙවින් භà·à·€à·’තවූ ප්â€à¶»à·€à¶»à·Šà¶œ' ),
- 'Mostlinkedtemplates' => array( 'බොහ෠ලෙසින් සබà·à¶³à·’ à·ƒà·à¶šà·’ලි', 'බෙහෙවින් භà·à·€à·’තවූ à·ƒà·à¶šà·’ලි' ),
- 'Mostimages' => array( 'බොහ෠රූප' ),
- 'Mostcategories' => array( 'බොහ෠ප්â€à¶»à·€à¶»à·Šà¶œ' ),
- 'Mostrevisions' => array( 'බොහ෠සංà·à·à¶°à¶±' ),
- 'Fewestrevisions' => array( 'අතිස්වල්ප සංà·à·à¶°à¶±' ),
- 'Shortpages' => array( 'කොට පිටුව' ),
- 'Longpages' => array( 'දිගු පිටුව' ),
- 'Newpages' => array( 'නව පිටුව' ),
- 'Ancientpages' => array( 'පුරà·à¶­à¶± පිටුව' ),
- 'Deadendpages' => array( 'අග ඇවුරුණු පිටුව' ),
- 'Protectedpages' => array( 'ආරක්ෂිත පිටුව' ),
- 'Protectedtitles' => array( 'ආරක්ෂිත à·à·“ර්ෂයන්' ),
- 'Allpages' => array( 'සියළු පිටු' ),
- 'Prefixindex' => array( 'උපසර්ග සූචිය' ),
- 'Ipblocklist' => array( 'අන්තර්ජà·à¶½ ලිපින à·€à·à¶»à¶« ලà·à¶ºà·’ස්තුව' ),
- 'Specialpages' => array( 'විà·à·šà·‚ පිටු' ),
+ 'Watchlist' => array( 'මුර_ලà·à¶ºà·’ස්තුව' ),
+ 'Recentchanges' => array( 'මෑත_වෙනස්වීම්' ),
+ 'Upload' => array( 'උඩුගත_කිරීම' ),
+ 'Listfiles' => array( 'රූප_ලà·à¶ºà·’ස්තුව' ),
+ 'Newimages' => array( 'නව_ගොනු', 'නව_රූප' ),
+ 'Listusers' => array( 'පරිà·à·“ලකයන්_ලà·à¶ºà·’ස්තු_ගත_කරන්න', 'පරිà·à·“ලක_ලà·à¶ºà·’ස්තුව' ),
+ 'Listgrouprights' => array( 'කණ්ඩà·à¶ºà¶¸à·Š_හිමිකම්_ලà·à¶ºà·’ස්තුගතකරන්න' ),
+ 'Statistics' => array( 'සංඛ්â€à¶ºà·à¶±_දත්ත' ),
+ 'Randompage' => array( 'අහඹු', 'අහඹු_පිටුව' ),
+ 'Lonelypages' => array( 'හුදකලà·_පිටු' ),
+ 'Uncategorizedpages' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය_නොකල_පිටු' ),
+ 'Uncategorizedcategories' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය_නොකල_ප්â€à¶»à·€à¶»à·Šà¶œ' ),
+ 'Uncategorizedimages' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය_නොකල_රූප' ),
+ 'Uncategorizedtemplates' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà·“කරනය_නොකල_à·ƒà·à¶šà·’ලි' ),
+ 'Unusedcategories' => array( 'à·„à·à·€à·’තà·_නොවන_ප්â€à¶»à·€à¶»à·Šà¶œ' ),
+ 'Unusedimages' => array( 'à·„à·à·€à·’තà·_නොවන_රූප' ),
+ 'Wantedpages' => array( 'අවà·à·Šâ€à¶º_පිටු' ),
+ 'Wantedcategories' => array( 'අවà·à·Šâ€à¶º_ප්â€à¶»à·€à¶»à·Šà¶œ' ),
+ 'Wantedfiles' => array( 'අවà·à·Šâ€à¶º_ගොනු' ),
+ 'Wantedtemplates' => array( 'අවà·à·Šâ€à¶º_à·ƒà·à¶šà·’ලි' ),
+ 'Mostlinked' => array( 'බෙහෙවින්_සබà·à¶³à·’_පිටු', 'බෙහෙවින්_සබà·à¶³à·’' ),
+ 'Mostlinkedcategories' => array( 'බෙහෙවින්_සබà·à¶³à·’_ප්â€à¶»à·€à¶»à·Šà¶œ', 'බෙහෙවින්_භà·à·€à·’ත_ප්â€à¶»à·€à¶»à·Šà¶œ' ),
+ 'Mostlinkedtemplates' => array( 'බෙහෙවින්_සබà·à¶³à·’_à·ƒà·à¶šà·’ලි', 'බෙහෙවින්_භà·à·€à·’ත_à·ƒà·à¶šà·’ලි' ),
+ 'Mostimages' => array( 'බෙහෙවින්_සබà·à¶³à·’_ගොනු', 'බොහà·_ගොනු', 'බොහà·_රූප' ),
+ 'Mostcategories' => array( 'බොහà·_ප්â€à¶»à·€à¶»à·Šà¶œ' ),
+ 'Mostrevisions' => array( 'බොහà·_සංà·à·à¶°à¶±' ),
+ 'Fewestrevisions' => array( 'අතිස්වල්ප_සංà·à·à¶°à¶±' ),
+ 'Shortpages' => array( 'කෙටි_පිටු' ),
+ 'Longpages' => array( 'දිගු_පිටු' ),
+ 'Newpages' => array( 'නව_පිටුව' ),
+ 'Ancientpages' => array( 'පුරà·à¶­à¶±_පිටු' ),
+ 'Deadendpages' => array( 'අග_ඇවුරුණු_පිටුව' ),
+ 'Protectedpages' => array( 'ආරක්â€à·‚ිත_පිටුව' ),
+ 'Protectedtitles' => array( 'ආරක්â€à·‚ිත_à·à·“ර්ෂයන්' ),
+ 'Allpages' => array( 'සියළු_පිටු' ),
+ 'Prefixindex' => array( 'උපසර්ග_සූචිය' ),
+ 'Ipblocklist' => array( 'à·€à·à¶»à¶«_ලà·à¶ºà·’ස්තුව', 'à·€à·à¶»à¶«_ලයිස්තුගතකරන්න_', 'IP_à·€à·à¶»à¶«_ලà·à¶ºà·’ස්තුව' ),
+ 'Unblock' => array( 'à·€à·à¶»à¶«à¶º_ඉවත්කල' ),
+ 'Specialpages' => array( 'විà·à·šà·‚_පිටු' ),
'Contributions' => array( 'දà·à¶ºà¶šà¶­à·Šà·€' ),
- 'Emailuser' => array( 'පරිà·à·“ලකට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à¶šà·Š යà·à·€à·’ම' ),
- 'Confirmemail' => array( 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල තහවුරු කරන්න' ),
- 'Whatlinkshere' => array( 'මෙහි කුමක් සබà·à¶³à·“ ඇතිද' ),
- 'Recentchangeslinked' => array( 'සබà·à¶³à·”නු මෑත වෙනස්වීම්', 'මෑතවෙනස් වීම්' ),
- 'Movepage' => array( 'පිටුව ගෙන යනවà·' ),
- 'Blockme' => array( 'ම෠වà·à¶»à¶«à¶º කරන්න' ),
- 'Booksources' => array( 'ග්â€à¶»à¶±à·Šà¶® මූලà·à·à·Šâ€à¶»' ),
- 'Categories' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶±à·Š' ),
+ 'Emailuser' => array( 'පරිà·à·“ලකට_විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à¶šà·Š_යà·à·€à·’ම' ),
+ 'Confirmemail' => array( 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල_තහවුරු_කරන්න' ),
+ 'Whatlinkshere' => array( 'මෙහි_කුමක්_සබà·à¶³à·“_ඇතිද' ),
+ 'Recentchangeslinked' => array( 'සබà·à¶³à·”නු_මෑත_වෙනස්කිරීම්', 'මෑත_වෙනස්කිරීම්' ),
+ 'Movepage' => array( 'පිටුව_ගෙන_යන්න' ),
+ 'Blockme' => array( 'මà·_à·€à·à¶»à¶«à¶º_කරන්න' ),
+ 'Booksources' => array( 'ග්â€à¶»à¶±à·Šà¶®_මූලà·à·à·Šâ€à¶»' ),
+ 'Categories' => array( 'ප්â€à¶»à·€à¶»à·Šà¶œ' ),
'Export' => array( 'නිර්යà·à¶­à¶šà¶»à¶±à·Šà¶±' ),
- 'Version' => array( 'අනුවà·à¶¯à¶º' ),
- 'Allmessages' => array( 'සියළු පණිවුඩ' ),
- 'Log' => array( 'ලà¶à·” සටහන', 'ලà¶à·” සටහන්' ),
- 'Blockip' => array( 'අන්තර්ජà·à¶½ ලිපිනය à·€à·à¶»à¶«à¶º කරන්න' ),
- 'Undelete' => array( 'මකà·à¶¯à·à¶¸à·“ම අවලංගු කරන්න' ),
- 'Import' => array( 'ආයà·à¶­ කරන්න' ),
- 'Lockdb' => array( 'දත්ත ගබඩà·à·€ අවුරන්න' ),
- 'Unlockdb' => array( 'දත්ත ගබඩà·à·€ ඇවුරුම අවලංගු කරන්න' ),
- 'Userrights' => array( 'පරිà·à·“ලක හිමිකම්' ),
- 'MIMEsearch' => array( 'MIME ගවේෂණය' ),
- 'FileDuplicateSearch' => array( 'ගොනු අනුපිටපත් ගවේෂණය' ),
- 'Unwatchedpages' => array( 'මුර නොකල පිටු' ),
- 'Listredirects' => array( 'යළි-යොමුකිරීම් ලà·à¶ºà·’ස්තුගතකරන්න' ),
- 'Revisiondelete' => array( 'සංà·à·à¶°à¶± මකà·à¶¯à¶¸à¶±à·Šà¶±' ),
- 'Unusedtemplates' => array( 'භà·à·€à·’ත නොකල à·ƒà·à¶šà·’ලි' ),
- 'Randomredirect' => array( 'අහඹු යළි-යොමුකිරිම' ),
- 'Mypage' => array( 'මගේ පිටුව' ),
- 'Mytalk' => array( 'මගේ à·ƒà·à¶šà¶ à·Šà¶¡à·à·€' ),
- 'Mycontributions' => array( 'මගේ දà·à¶ºà¶šà¶­à·Šà·€à¶º' ),
- 'Listadmins' => array( 'පරිපà·à¶½à¶šà¶ºà¶±à·Š ලà·à¶ºà·’ස්තුගත කරන්න' ),
- 'Listbots' => array( 'රොබà·à·€à¶»à·”න් ලà·à¶ºà·’ස්තුගතකරන්න' ),
- 'Popularpages' => array( 'ජනප්â€à¶»à·’ය පිටු' ),
+ 'Version' => array( 'සංà·à·à¶°à¶±à¶º' ),
+ 'Allmessages' => array( 'සියළු_පණිවුඩ' ),
+ 'Log' => array( 'ලà¶à·”_සටහන', 'ලà¶à·”_සටහන්' ),
+ 'Blockip' => array( 'à·€à·à¶»à¶«à¶º_කරන්න', 'IP_à·€à·à¶»à¶«à¶º_කරන්න', 'පරිà·à·“ලක_à·€à·à¶»à¶«à¶º_කරන්න' ),
+ 'Undelete' => array( 'මකà·à¶¯à·à¶¸à·“ම_අවලංගු_කරන්න' ),
+ 'Import' => array( 'ආයà·à¶­_කරන්න' ),
+ 'Lockdb' => array( 'දත්ත_සංචිතය_අවුරන්න' ),
+ 'Unlockdb' => array( 'දත්ත_සංචිතය_ඇවුරුම_අවලංගු_කරන්න' ),
+ 'Userrights' => array( 'පරිà·à·“ලක_හිමිකම්' ),
+ 'MIMEsearch' => array( 'MIME_ගවේෂණය' ),
+ 'FileDuplicateSearch' => array( 'ගොනු_අනුපිටපත්_ගවේෂණය' ),
+ 'Unwatchedpages' => array( 'මුර_නොකල_පිටු' ),
+ 'Listredirects' => array( 'යළි-යොමුකිරීම්_ලà·à¶ºà·’ස්තුගතකරන්න' ),
+ 'Revisiondelete' => array( 'සංà·à·à¶°à¶±_මකà·à¶¯à¶¸à¶±à·Šà¶±' ),
+ 'Unusedtemplates' => array( 'භà·à·€à·’ත_නොකල_à·ƒà·à¶šà·’ලි' ),
+ 'Randomredirect' => array( 'අහඹු_යළි-යොමුකිරිම' ),
+ 'Mypage' => array( 'මගේ_පිටුව' ),
+ 'Mytalk' => array( 'මගේ_à·ƒà·à¶šà¶ à·Šà¶¡à·à·€' ),
+ 'Mycontributions' => array( 'මගේ_දà·à¶ºà¶šà¶­à·Šà·€à¶º' ),
+ 'Listadmins' => array( 'පරිපà·à¶½à¶šà¶ºà¶±à·Š_ලà·à¶ºà·’ස්තුගත_කරන්න' ),
+ 'Listbots' => array( 'රොබà·à·€à¶±à·Š_ලà·à¶ºà·’ස්තුගත_කරන්න' ),
+ 'Popularpages' => array( 'ජනප්â€à¶»à·’ය_පිටු' ),
'Search' => array( 'ගවේෂණය' ),
- 'Resetpass' => array( 'මුර පදය ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන්න' ),
- 'Withoutinterwiki' => array( 'අන්තර් විකි නොමà·à¶­à·’à·€' ),
- 'MergeHistory' => array( 'ඒකà·à¶¶à¶¯à·Šà¶° ඉතිහà·à·ƒà¶º' ),
- 'Filepath' => array( 'ගොනු පෙත' ),
- 'Invalidateemail' => array( 'විද්්â€à¶ºà·”ත් තà·à¶´à·‘ල අනීතික කරන්න' ),
- 'Blankpage' => array( 'හිස් පිටුව' ),
- 'LinkSearch' => array( 'සබà·à¶³à·’ ගවේෂණය' ),
- 'DeletedContributions' => array( 'මකà·à¶¯à·à¶¸à·”ණු දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š' ),
+ 'Resetpass' => array( 'මුරපදය_වෙනස්_කරන්න', 'මුරපදය_ප්â€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º_කරන්න' ),
+ 'Withoutinterwiki' => array( 'අන්තර්_විකි_නොමà·à¶­à·’à·€' ),
+ 'MergeHistory' => array( 'ඒකà·à¶¶à¶¯à·Šà¶°_ඉතිහà·à·ƒà¶º' ),
+ 'Filepath' => array( 'ගොනු_පෙත' ),
+ 'Invalidateemail' => array( 'විද්â€à¶ºà·”ත්_තà·à¶´à·‘ල_අනීතික_කරන්න' ),
+ 'Blankpage' => array( 'හිස්_පිටුව' ),
+ 'LinkSearch' => array( 'සබà·à¶³à·’_ගවේෂණය' ),
+ 'DeletedContributions' => array( 'මකà·à¶¯à·à¶¸à·”ණු_දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š' ),
'Tags' => array( 'ටà·à¶œ' ),
- 'Activeusers' => array( 'ක්â€à¶»à·’යà·à¶šà·à¶»à·“පරිà·à·“ලකයන්' ),
+ 'Activeusers' => array( 'ක්â€à¶»à·’යà·à¶šà·à¶»à·“_පරිà·à·“ලකයන්' ),
+ 'Badtitle' => array( 'නුසුසුදු_මà·à¶­à·˜à¶šà·à·€' ),
);
$magicWords = array(
'redirect' => array( '0', '#යළියොමුව', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'වත්මන්මà·à·ƒà¶º', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth' => array( '1', 'වත්මන්මà·à·ƒà¶º', 'වත්මන්මà·à·ƒà¶º2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'වත්මන්මà·à·ƒà¶º1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'වත්මන්මà·à·ƒà¶±à·à¶¸à¶º', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'වත්මන්මà·à·ƒà¶±à·à¶¸à¶ºà¶´à·œà¶¯à·”', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', 'වත්මන්මà·à·ƒà¶ºà¶šà·™à¶§à·’', 'CURRENTMONTHABBREV' ),
'currentday' => array( '1', 'වත්මන්දිනය', 'CURRENTDAY' ),
'currentday2' => array( '1', 'වත්මන්දිනය2', 'CURRENTDAY2' ),
@@ -155,6 +161,7 @@ $magicWords = array(
'currenthour' => array( '1', 'වත්මන්පà·à¶º', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'දේà·à·“යමà·à·ƒà¶º', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonthname' => array( '1', 'දේà·à·“යමà·à·ƒà¶±à·à¶¸à¶º', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'දේà·à·“යමà·à·ƒà¶±à·à¶¸à¶ºà¶´à·œà¶¯à·”', 'LOCALMONTHNAMEGEN' ),
'localmonthabbrev' => array( '1', 'දේà·à·“යමà·à·ƒà¶ºà¶šà·™à¶§à·’', 'LOCALMONTHABBREV' ),
'localday' => array( '1', 'දේà·à·“යදිනය', 'LOCALDAY' ),
'localday2' => array( '1', 'දේà·à·“යදිනය2', 'LOCALDAY2' ),
@@ -168,21 +175,27 @@ $magicWords = array(
'numberofusers' => array( '1', 'පරිà·à·“ලකයන්සංඛ්â€à¶ºà·à·€', 'NUMBEROFUSERS' ),
'numberofedits' => array( '1', 'සංස්කරණසංඛ්â€à¶ºà·à·€', 'NUMBEROFEDITS' ),
'pagename' => array( '1', 'පිටුනà·à¶¸à¶º', 'PAGENAME' ),
+ 'namespace' => array( '1', 'නà·à¶¸à¶…වකà·à·à¶º', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Š', 'NAMESPACEE' ),
+ 'msg' => array( '0', 'පණිවුඩ:', 'MSG:' ),
'img_right' => array( '1', 'දකුණ', 'right' ),
'img_left' => array( '1', 'වම', 'left' ),
'img_none' => array( '1', 'නොමà·à¶­', 'none' ),
'img_width' => array( '1', '$1පික්', '$1px' ),
'img_center' => array( '1', 'මධ්â€à¶ºà¶º', 'center', 'centre' ),
+ 'img_border' => array( '1', 'දà·à¶»à¶º', 'border' ),
+ 'img_sub' => array( '1', 'උප', 'sub' ),
+ 'img_middle' => array( '1', 'මà·à¶¯', 'middle' ),
'special' => array( '0', 'විà·à·šà·‚', 'special' ),
);
$messages = array(
# User preference toggles
'tog-underline' => 'සබà·à¶³à·’ යටීර කිරීම:',
-'tog-highlightbroken' => 'භින්න සබà·à¶³à·’යන් ආකෘතිකරණය මේ අයුරින් කරන්න <a href="" class="new"> </a> (විකල්ප: මේ අයුරින් කරන්න<a href="" class="internal">?</a>).',
-'tog-justify' => 'ඡේදයන් justify කරන්න',
-'tog-hideminor' => 'මෑත වෙනස්වීකිරීම්වල සුළු සංස්කරණ සඟවන්න',
-'tog-hidepatrolled' => 'විමසුමට ලක්කෙරුණු සංස්කරණයන්, මෑත වෙනස්වීම් හී නොපෙන්වන්න',
+'tog-highlightbroken' => 'භින්න වූ සබà·à¶³à·’යන් <a href="" class="new">මේ අයුරින්</a> ආකෘතිකරණය කරන්න (විකල්පය: මේ අයුරින්<a href="" class="internal">?</a>)',
+'tog-justify' => 'ඡේදයන් පේළ ගස්වන්න',
+'tog-hideminor' => 'මෑත වෙනස් කිරීම්වල සුළු සංස්කරණ සඟවන්න',
+'tog-hidepatrolled' => 'මෑත වෙනස් කිරීම්වල මුර සංචà·à¶»à¶ºÂ à¶šà¶»à¶±Â à¶½à¶¯ සංස්කරණ සඟවන්න',
'tog-newpageshidepatrolled' => 'විමසුමට ලක්කෙරුණු පිටු, අළුත් පිටු ලà·à¶ºà·’ස්තුවෙහි නොපෙන්වන්න',
'tog-extendwatchlist' => 'මෑත වෙනස්වීම් පමණක් නොව, අදà·à·… සියළු වෙනස්වීම් දක්ව෠පෙන්වන අයුරින් මුර-ලà·à¶ºà·’ස්තුව පුළුල් කරන්න',
'tog-usenewrc' => 'ආවර්ධිත මෑත වෙනස්වීම් භà·à·€à·’ත෠කරන්න (ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් ඇවà·à·ƒà·’ය)',
@@ -192,8 +205,7 @@ $messages = array(
'tog-editsection' => '[සංස්කරණය] සබà·à¶³à·’යà·à·€à¶±à·Š මගින් ඡේද සංස්කරණය සක්â€à¶»à·“ය කරන්න',
'tog-editsectiononrightclick' => 'ඡේද à·à·“ර්ෂ මත දකුණු-ක්ලික් කිරීමෙන් ඡේද සංස්කරණය සක්â€à¶»à·“ය කරන්න (ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට්)',
'tog-showtoc' => 'පටුන පෙන්වන්න ( තුනකට වඩ෠වà·à¶©à·’යෙන් à·à·“ර්ෂ-නà·à¶¸ අඩංගු පිටු සඳහà·)',
-'tog-rememberpassword' => 'මà·à¶œà·š ප්â€à¶»à·€à·’ෂ්ටය පිළිබඳ විස්තර මෙම පරිගණකය තුල ධà·à¶»à¶«à¶º කර තබ෠ගන්න',
-'tog-editwidth' => 'සම්පූර්ණ තිරය පිරෙන පරිදී සංස්කරණ කොටුව පළල් කරන්න',
+'tog-rememberpassword' => 'මගේ ප්â€à¶»à·€à·’ෂ්ටය මෙම ගවේà·à¶šà¶ºà·™à·„à·’ උපරිම ලෙස {{PLURAL:$1|දිනයක්|දින $1ක්}} මතක තබ෠ගන්න',
'tog-watchcreations' => 'මම තනන පිටු මගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
'tog-watchdefault' => 'මම සංස්කරණය කරන පිටු මගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
'tog-watchmoves' => 'මම ගෙනයන පිටු මගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
@@ -201,7 +213,7 @@ $messages = array(
'tog-minordefault' => 'සියළු සංස්කරණයන් පෙර-නිමියෙන් සුළු-සංස්කරණ ලෙස සලකුණු කරන්න',
'tog-previewontop' => 'සංස්කරණ කොටුවට ඉදිරියෙන් පෙර-දසුන පෙන්වන්න',
'tog-previewonfirst' => 'පළමු සංස්කරණයෙහිදී පෙර-දසුන පෙන්වන්න',
-'tog-nocache' => 'පිටු කෑෂ්කිරීම (caching) අක්â€à¶»à·“ය කරන්න',
+'tog-nocache' => 'ගවේà·à¶šÂ à¶´à·’ටු මතක තබà·Â à¶œà·à¶±à·“ම අක්â€à¶»à·“ය කරන්න',
'tog-enotifwatchlistpages' => 'මගේ මුර-ලà·à¶ºà·’ස්තුවේ පිටුවක් වෙනස් වූ විට ම෠හට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් එවන්න',
'tog-enotifusertalkpages' => 'මගේ පරිà·à·“ලක à·ƒà·à¶šà¶ à·Šà¶¡à· පිටුව වෙනස් වූ විට ම෠හට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් එවන්න',
'tog-enotifminoredits' => 'පිටුවල සුළු-සංස්කරණයකදී පව෠මට ඊ- තà·à¶´à·à¶½à·Š ලිපියක් එවන්න',
@@ -209,8 +221,8 @@ $messages = array(
'tog-shownumberswatching' => 'මුර කරනු ලබන පරිà·à·“ලකයන් සංඛ්â€à¶ºà·à·€ පෙන්වන්න',
'tog-oldsig' => 'පවතින අත්සනෙහි පූර්ව දර්à·à¶±à¶º:',
'tog-fancysig' => 'අත්සන විකිපෙළ (ස්වයංක්â€à¶»à·“ය සබà·à¶³à·’යක් විරහිතව) ලෙසින් සලකන්න',
-'tog-externaleditor' => 'පෙරනිමියෙන් බà·à·„ිර සංස්කà·à¶»à¶šà¶ºà¶šà·Š භà·à·€à·’ත කරන්න (ප්â€à¶»à·€à·“ණයන් සඳහ෠පමණි, ඔබගේ පරිගණකයට විà·à·šà·‚ à·ƒà·à¶šà·ƒà·”ම් යෙදිය යුතුවේ)',
-'tog-externaldiff' => 'පෙරනිමියෙන් බà·à·„ිර වෙනස භà·à·€à·’ත෠කරන්න (ප්â€à¶»à·€à·“ණයන් සඳහ෠පමණයි, ඔබගේ පරිගණකයෙහි විà·à·šà·‚ පරිස්ථිතීන් අවà·à·Šâ€à¶ºà¶ºà¶ºà·’)',
+'tog-externaleditor' => 'බà·à·„ිර සම්පà·à¶¯à¶šà¶ºà¶šà·ŠÂ à¶·à·à·€à·’ත කරන්න (ප්â€à¶»à·€à·“ණයන් සඳහ෠පමණි, ඔබගේ පරිගණකයේ විà·à·šà·‚ිත වූ සà·à¶šà·ƒà·”ම් අවà·à·Šâ€à¶ºÂ à·€à·š. [http://www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
+'tog-externaldiff' => 'බà·à·„ිර ප්â€à¶»à¶·à·šà¶¯à¶ºà¶šà·ŠÂ à¶·à·à·€à·’ත කරන්න (ප්â€à¶»à·€à·“ණයන් සඳහ෠පමණි, ඔබගේ පරිගණකයේ විà·à·šà·‚ිත වූ සà·à¶šà·ƒà·”ම් අවà·à·Šâ€à¶ºÂ à·€à·š. [http://www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
'tog-showjumplinks' => '"වෙත පනින්න" යන ප්â€à¶»à·€à·šà·à¶­à· සබà·à¶³à·’යන් සක්â€à¶»à·“ය කරන්න',
'tog-uselivepreview' => 'තත්කà·à¶½ පෙර-දසුන භà·à·€à·’ත෠කරන්න (ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට්) (පරීක්ෂණà·à¶­à·Šà¶¸à¶š)',
'tog-forceeditsummary' => 'හිස් සංස්කරණ à·ƒà·à¶»à·à¶‚à·à¶ºà¶šà¶§ ම෠ඇතුළු වන විට මà·à·„ට ඉඟි කරන්න',
@@ -325,7 +337,7 @@ $messages = array(
'mypage' => 'මගේ පිටුව',
'mytalk' => 'මගේ à·ƒà·à¶šà¶ à·Šà¶¡à·',
'anontalk' => 'මෙම IP ලිපිනය සඳහ෠සà·à¶šà¶ à·Šà¶¡à·à·€',
-'navigation' => 'සංචලනය',
+'navigation' => 'යà·à¶­à·Šâ€à¶»à¶«à¶º',
'and' => '&#32;සහ',
# Cologne Blue skin
@@ -340,37 +352,27 @@ $messages = array(
'faqpage' => 'Project:නිති-විමසන-පà·à¶±',
# Vector skin
-'vector-action-addsection' => 'මà·à¶­à·˜à¶šà·à·€ එක්කරන්න',
-'vector-action-delete' => 'මකà·à¶¯à¶¸à¶±à·Šà¶±',
-'vector-action-move' => 'ගෙනයන්න',
-'vector-action-protect' => 'ආරක්ෂ෠කරන්න',
-'vector-action-undelete' => 'මකà·à¶¯à·à¶¸à·“ම අවලංගු කරන්න',
-'vector-action-unprotect' => 'ආරක්ෂà·â€ නොකරන්න',
-'vector-namespace-category' => 'ප්â€à¶»à·€à¶»à·Šà¶œà¶º',
-'vector-namespace-help' => 'උදවු පිටුව',
-'vector-namespace-image' => 'ගොනුව',
-'vector-namespace-main' => 'පිටුව',
-'vector-namespace-media' => 'මà·à¶°à·Šâ€à¶º පිටුව',
-'vector-namespace-mediawiki' => 'පණිවුඩය',
-'vector-namespace-project' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිටුව',
-'vector-namespace-special' => 'විà·à·šà·‚ පිටුව',
-'vector-namespace-talk' => 'à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
-'vector-namespace-template' => 'à·ƒà·à¶šà·’ල්ල',
-'vector-namespace-user' => 'පරිà·à·“ලක පිටුව',
-'vector-view-create' => 'තනන්න',
-'vector-view-edit' => 'සංස්කරණය කරන්න',
-'vector-view-history' => 'ඉතිහà·à·ƒà¶º නරඹන්න',
-'vector-view-view' => 'කියවන්න',
-'vector-view-viewsource' => 'මූලà·à·à·Šâ€à¶»à¶º නරඹන්න',
-'actions' => 'කà·à¶»à·Šà¶ºà¶ºà¶±à·Š',
-'namespaces' => 'නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Š',
-'variants' => 'ප්â€à¶»à¶·à·šà¶¯à·Šâ€à¶ºà¶ºà¶±à·Š',
+'vector-action-addsection' => 'මà·à¶­à·˜à¶šà·à·€ එක්කරන්න',
+'vector-action-delete' => 'මකà·à¶¯à¶¸à¶±à·Šà¶±',
+'vector-action-move' => 'ගෙනයන්න',
+'vector-action-protect' => 'ආරක්â€à·‚ණය කරන්න',
+'vector-action-undelete' => 'මකà·à¶¯à·à¶¸à·“ම අවලංගු කරන්න',
+'vector-action-unprotect' => 'ආරක්ෂà·â€ නොකරන්න',
+'vector-simplesearch-preference' => 'à·€à·à¶©à·’දියුණුකළ සෙවුම් යà·à¶¢à¶±à· සක්â€à¶»à·“ය කරන්න ("Vector" තීමය සඳහ෠පමණි)',
+'vector-view-create' => 'තනන්න',
+'vector-view-edit' => 'සංස්කරණය කරන්න',
+'vector-view-history' => 'ඉතිහà·à·ƒà¶º නරඹන්න',
+'vector-view-view' => 'කියවන්න',
+'vector-view-viewsource' => 'මූලà·à·à·Šâ€à¶»à¶º නරඹන්න',
+'actions' => 'කà·à¶»à·Šà¶ºà¶ºà¶±à·Š',
+'namespaces' => 'නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Š',
+'variants' => 'ප්â€à¶»à¶·à·šà¶¯',
'errorpagetitle' => 'දà·à·‚ය',
'returnto' => '$1 ට නà·à·€à¶­ යන්න.',
'tagline' => '{{SITENAME}} වෙතින්',
'help' => 'උදවු',
-'search' => 'ගවේෂණය',
+'search' => 'සොයන්න',
'searchbutton' => 'සොයන්න',
'go' => 'යන්න',
'searcharticle' => 'යන්න',
@@ -419,16 +421,18 @@ $messages = array(
'protectedpage' => 'ආරක්ෂිත පිටුව',
'jumpto' => 'වෙත යන්න:',
'jumptonavigation' => 'සංචලනය',
-'jumptosearch' => 'ගවේෂණය',
+'jumptosearch' => 'සොයන්න',
'view-pool-error' => "සමà·à·€à¶±à·Šà¶±, à·ƒ'වරයන් (server) මෙම අවස්ථà·à·€à·™à·„ිදී අධිභà·à¶»à¶«à¶º (overloade) වී ඇත.
පමණට වඩ෠පරිà·à·“ලක පිරිසක් මෙම පිටුව නà·à¶»à¶¹à·“මට යත්න දරති.
මද වේලà·à·€à¶šà·Š පමà·à·€à·“ නà·à·€à¶­ උත්සà·à·„කරන්න.
$1",
+'pool-timeout' => 'අගුල සඳහ෠බලà·à¶´à·œà¶»à·œà¶­à·Šà¶­à·”වෙන් සිටීම කල් ඉකුත්වනලදී',
+'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}} පිළිබඳ
-<!--{{SITENAME}}About-->',
+'aboutsite' => '{{SITENAME}} පිළිබඳ',
'aboutpage' => 'Project:පිළිබඳ',
'copyright' => ' $1 යටතේ අන්තර්ගතය දà·à¶š ගත à·„à·à¶š.',
'copyrightpage' => '{{ns:project}}:කර්තෘ-හිමිකම්',
@@ -444,7 +448,7 @@ $1",
'policy-url' => 'Project:ප්â€à¶»à¶­à·’පත්තිය',
'portal' => 'ප්â€à¶»à¶¢à· ද්වà·à¶»à¶º',
'portal-url' => 'Project:ප්â€à¶»à¶¢à· ද්වà·à¶»à¶º',
-'privacy' => 'පෞද්ගලිකත්ව ප්â€à¶»à¶­à·’පත්තිය',
+'privacy' => 'පුද්ගලිකත්ව ප්â€à¶»à¶­à·’පත්තිය',
'privacypage' => 'Project:පුද්ගලිකත්ව ප්â€à¶»à¶­à·’පත්තිය',
'badaccess' => 'අවසරදීමේ දà·à·‚යකි',
@@ -467,7 +471,7 @@ $1",
'viewsourceold' => 'මූලà·à·à·Šâ€à¶»à¶º නරඹන්න',
'editlink' => 'සංස්කරණය',
'viewsourcelink' => 'මූලà·à·à·Šâ€à¶»à¶º නරඹන්න',
-'editsectionhint' => 'ඡේද සංස්කරණය: $1',
+'editsectionhint' => 'ඡේදය සංස්කරණය කරන්න: $1',
'toc' => 'පටුන',
'showtoc' => 'පෙන්වන්න',
'hidetoc' => 'සඟවන්න',
@@ -478,7 +482,7 @@ $1",
'feed-invalid' => 'දà·à¶ºà¶šà¶­à·Šà·€ පà·à·‚කයෙහි à·à·›à¶½à·’ය අනීතිකය.',
'feed-unavailable' => 'සමග්â€à¶»à·„ පà·à·‚කයන් නොමà·à¶­',
'site-rss-feed' => '$1 RSS පà·à·‚කය',
-'site-atom-feed' => '$1 Atom පà·à·‚කය',
+'site-atom-feed' => '$1 අටොම් පà·à·‚කය',
'page-rss-feed' => '"$1" RSS පà·à·‚කය',
'page-atom-feed' => '"$1" Atom පà·à·‚කය',
'feed-atom' => 'Atom',
@@ -598,7 +602,8 @@ $2',
'yourname' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
'yourpassword' => 'මුරපදය:',
'yourpasswordagain' => 'මුරපදය යළි ඇතුළු කරන්න:',
-'remembermypassword' => 'මà·à¶œà·š ප්â€à¶»à·€à·’ෂ්ටය පිළිබඳ විස්තර මෙම පරිගණක මතකයෙහි රඳව෠තබ෠ගන්න',
+'remembermypassword' => 'මà·à¶œà·š පිවිසීම මෙම browser මතකයෙහි (උපරිම ලෙස{{PLURAL:$1|දිනයක්|දින $1 ක්}}) තබà·à¶œà¶±à·Šà¶±',
+'securelogin-stick-https' => 'ඇතුල්වීමෙන් පසුවද HTTPS හරහ෠සම්බන්ධ වන්න',
'yourdomainname' => 'ඔබගේ වසම:',
'externaldberror' => 'එක්ක෠සත්â€à¶ºà·à·€à¶­à·Š දත්ත-ගබඩ෠දà·à·‚යක් පà·à·€à¶­à·”නි නà·à¶­à·’නම් ඔබගේ බà·à·„ිර ගිණුම යà·à·€à¶­à·Šà¶šà·à¶½à·“න කිරීමට ඔබ හට අවසර දී නොමà·à¶­.',
'login' => 'පිවිසෙන්න',
@@ -606,30 +611,31 @@ $2',
'loginprompt' => '{{SITENAME}} වෙත ප්â€à¶»à·€à·’ෂ්ට වීම සඳහ෠ඔබ විසින් කුකීස් සක්â€à¶»à·“ය කොට තිබිය යුතුය.',
'userlogin' => 'පිවිසෙන්න / නව ගිණුමක් තනන්න',
'userloginnocreate' => 'ප්â€à¶»à·€à·’ෂ්ට වන්න',
-'logout' => 'නිෂ්ක්â€à¶»à¶¸à¶«à¶º',
+'logout' => 'නික්මීම',
'userlogout' => 'නික්මීම',
-'notloggedin' => 'ප්â€à¶»à·€à·’ෂ්ට වී නොමà·à¶­',
+'notloggedin' => 'ප්â€à¶»à·€à·’සී නà·à¶­',
'nologin' => "ඔබ හට ගිණුමක් නොමà·à¶­à·’ද? '''$1'''.",
'nologinlink' => 'ගිණුමක් තනන්න',
'createaccount' => 'ගිණුම තනන්න',
'gotaccount' => "දà·à¶±à¶§à¶¸à¶­à·Š ගිණුමක් තිබේද? '''$1'''.",
'gotaccountlink' => 'ප්â€à¶»à·€à·’ෂ්ට වන්න',
'createaccountmail' => 'විද්â€à¶ºà·”ත් තà·à¶´à·‘ල මගින්',
+'createaccountreason' => 'හේතුව:',
'badretype' => 'ඔබ ඇතුළු කල මුරපදය නොගà·à¶½à¶´à·š.',
'userexists' => 'ඔබ ඇතුළු කල පරිà·à·“ලක නà·à¶¸à¶º දà·à¶±à¶§à¶¸à¶­à·Š භà·à·€à·’තයෙහි ඇත.
කරුණà·à¶šà¶» වෙනත් නමක් තà·à¶»à· ගන්න.',
-'loginerror' => 'ප්â€à¶»à·€à·’ෂ්ට වීමේ දà·à·‚යකි',
+'loginerror' => 'ප්â€à¶»à·€à·’සීමේ දà·à·‚යකි',
'createaccounterror' => 'ගිණුම නිර්මà·à¶«à¶º කළ නොහà·à¶šà·’ විය:$1',
-'nocookiesnew' => 'පරිà·à·“ලක ගිණුම තන෠ඇති නමුදු, ඔබ ප්â€à¶»à·€à·’ෂ්ට වී නොමà·à¶­.
+'nocookiesnew' => 'පරිà·à·“ලක ගිණුම තන෠ඇති නමුදු, ඔබ ප්â€à¶»à·€à·’සී නà·à¶­.
පරිà·à·“ලකයන් ප්â€à¶»à·€à·’ෂ්ට කර ගà·à¶±à·“ම සඳහà·, {{SITENAME}} විසින් කුකී භà·à·€à·’ත෠කරයි.
ඔබ විසින් කුකී අක්â€à¶»à·“ය කර ඇත.
-කරුණà·à¶šà¶» ඒව෠සක්â€à¶»à·“ය කොට, ඔබගේ නව පරිà·à·“ලක-නà·à¶¸à¶º හ෠මුර-පදය ඇසුරෙන් ප්â€à¶»à·€à·’ෂ්ට වන්න.',
+කරුණà·à¶šà¶» ඒව෠සක්â€à¶»à·“ය කොට, ඔබගේ නව පරිà·à·“ලක-නà·à¶¸à¶º හ෠මුර-පදය ඇසුරෙන් පිවිසෙන්න.',
'nocookieslogin' => 'පරිà·à·“ලකයන් ප්â€à¶»à·€à·’ෂ්ට කර ගà·à¶±à·“ම සඳහà·, {{SITENAME}} විසින් කුකී භà·à·€à·’ත෠කරනු ලà·à¶¶à·š.
ඔබ විසින් කුකී අක්â€à¶»à·“ය නොට ඇත.
කරුණà·à¶šà¶», ඒව෠සක්â€à¶»à·“ය කොට, නà·à·€à¶­ උත්සà·à·„ â€à¶šà¶»à¶±à·Šà¶±.',
'noname' => 'වලංගු පරිà·à·“ලක-නà·à¶¸à¶ºà¶šà·Š සඳහන් කිරීමට ඔබ අසමත් වී ඇත.',
-'loginsuccesstitle' => 'ප්â€à¶»à·€à·’ෂ්ට වීම à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’',
-'loginsuccess' => "'''ඔබ දà·à¶±à·Š, \"\$1\" ලෙස, {{SITENAME}}ට ප්â€à¶»à·€à·’ෂ්ට විමට සමත් වී ඇත.'''",
+'loginsuccesstitle' => 'ප්â€à¶»à·€à·’සීම à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’',
+'loginsuccess' => "'''ඔබ දà·à¶±à·Š, \"\$1\" ලෙස, {{SITENAME}} වෙත ප්â€à¶»à·€à·’ෂ්ට විමට සමත් වී ඇත.'''",
'nosuchuser' => '"$1" යන නමà·à¶­à·’ පරිà·à·“ලකයෙකු නොමà·à¶­.
පරිà·à·“ලක නà·à¶¸à¶ºà¶±à·Šà·„à·’ මහà·à¶´à·Šâ€à¶»à·à¶« ආදිය à·ƒà·à¶½à¶šà·š.
ඔබගේ අක්ෂර-වින්â€à¶ºà·à·ƒà¶º පිරික්ස෠බà·à¶½à·“ම à·„à·, [[Special:UserLogin/signup|නව ගිණුමක් තà·à¶±à·“ම]] හ෠සිදුකරන්න.',
@@ -643,6 +649,7 @@ $2',
නà·à·€à¶­ උත්සà·à·„ කරන්න.',
'passwordtooshort' => 'මුරපදය අඩුම à·€à·à¶ºà·™à¶±à·Š {{PLURAL:$1|එක් අක්ෂරයක්|අක්ෂර $1 ක්}} සහිත විය යුතුය.',
'password-name-match' => 'ඔබගේ මුරපදය, ඔබගේ පරිà·à·“ලක නà·à¶¸à¶ºà·™à¶±à·Š වෙනස් එකක් විය යුතුය.',
+'password-login-forbidden' => 'මෙම පරිà·à·“ලක නà·à¶¸à¶ºà·š හ෠මුරපදයේ භà·à·€à·’තය වලක්ව෠ඇත.',
'mailmypassword' => 'නව මුරපදය විද්â€à¶ºà·”ත් තà·à¶´à·‘ලâ€à¶§ යවන්න',
'passwordremindertitle' => '{{SITENAME}} සඳහ෠නව තà·à·€à¶šà·à¶½à·’ක මුර-පදය',
'passwordremindertext' => 'යම් අයෙකු ($1 අන්තර්ජà·à¶½ ලිපිනය තුලින් සමහර විට ඔබ) විසින් {{SITENAME}} ($4)සඳහ෠නව මුර-පදයක් ඉල්ල෠සිට ඇත. පරිà·à·“ලක "$2" වෙනුවෙන් තà·à·€à¶šà·à¶½à·’ක මුර-පදයක් තන෠"$3" බවට නියම කර ඇත. මෙය ඔබගේ අභිලà·à·à¶º වූයේ නම් ඔබ විසින් ළහිළහියේ ප්â€à¶»à·€à·’ෂ්ට වී, නව මුර-පදයක් තà·à¶»à· ගත යුතුව ඇත.ඔබගේ තà·à·€à¶šà·à¶½à·’ක මුරපදය {{PLURAL:$5|එක් දිනකින්|දින $5 කින්}}කල් ඉකුත්වනු ඇත.
@@ -680,6 +687,9 @@ $2',
'loginlanguagelabel' => 'භà·à·‚à·à·€: $1',
'suspicious-userlogout' => 'නිෂ්ක්â€à¶»à¶¸à¶«à¶º සඳහ෠ඔබගේ අයà·à¶¯à·”ම නිෂ්ප්â€à¶»à¶·à· කෙරුනේ එය යොමු කොට ඇත්තේ භින්න(කà·à¶©à·”නු) බ්â€à¶»à·€à·”සරයකින් හ෠නිවේෂණය කෙරෙමින් පවතින ප්â€à¶»à·œà¶šà·Šà·ƒà·’යක් වෙතින් යà·à¶ºà·’ බà·à¶½à·– බà·à¶½à·Šà¶¸à¶§ පෙනෙන බà·à·€à·’නි.',
+# E-mail sending
+'php-mail-error-unknown' => 'php mail() à·à·Šâ€à¶»à·’තයේ හඳුනà·à¶±à·œà¶œà¶­à·Š ගà·à¶§à·…ුවකි',
+
# Password reset dialog
'resetpass' => 'මුර-පදය වෙනස් කරන්න',
'resetpass_announce' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලෙන් එවනු ලà·à¶¶à·– තà·à·€à¶šà·à¶½à·’ක කේතයක් උපයà·à¶œà·“කර ඔබ පිවිසීඇත.
@@ -706,16 +716,16 @@ $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වන මට්ටමෙහි සිරස්තලය',
+'headline_sample' => 'සිරස්තල පෙළ',
+'headline_tip' => '2 වන මට්ටමෙහි සිරස්තලය',
'math_sample' => 'සූත්â€à¶»à¶º මෙහි රුවන්න',
'math_tip' => 'ගණිත සූත්â€à¶»à¶º (LaTeX)',
'nowiki_sample' => 'ආකෘතිකරණය-නොකල පෙළ මෙහි රුවන්න',
'nowiki_tip' => 'විකි ආකෘතිකරණය නොසලකà·à·„රින්න',
'image_sample' => 'නිදසුන.jpg',
-'image_tip' => 'නිවේà·à·’ත(embedded) ගොනුව',
+'image_tip' => 'ක෠වà·à¶¯à·Šà¶¯à·– ගොනුව',
'media_sample' => 'නිදසුන.ogg',
'media_tip' => 'ගොනු සබà·à¶³à·’ය',
'sig_tip' => 'වේලà·-මුද්â€à¶»à·à·€ හ෠සමග ඔබගේ විද්â€à¶ºà·”ත් අත්සන',
@@ -731,13 +741,14 @@ $2',
'showpreview' => 'පෙරදසුන පෙන්වන්න',
'showlivepreview' => 'තත්කà·à¶½ පෙර-දසුන',
'showdiff' => 'වෙනස්කිරීම් පෙන්වන්න',
-'anoneditwarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’:''' ඔබ පරිà·à·“ලකයෙකු à·€à·à¶ºà·™à¶±à·Š පද්ධතියට ප්â€à¶»à·€à·’ෂ්ටවී නà·à¶­.
-එබà·à·€à·Šà¶±à·Š මෙම පිටුවෙහි සංස්කරණ ඉතිහà·à·ƒà¶ºà·™à·„à·’, ඔබගේ IP ලිපිනය සටහන් කරගනු ඇත.",
+'anoneditwarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’:''' ඔබ පරිà·à·“ලකයෙකු à·€à·à¶ºà·™à¶±à·Š පද්ධතියට ප්â€à¶»à·€à·’ෂ්ට වී නොමà·à¶­.
+ඔබගේ අයිපී යොමුව මෙම පිටුවෙහි සංස්කරණ ඉතිහà·à·ƒà¶ºà·™à·„à·’ à·€à·à¶»à·Šà¶­à·à¶œà¶­Â à·€à·™à¶±à·” ඇත",
+'anonpreviewwarning' => 'අවවà·à¶¯à¶ºà¶ºà·’: ඔබ පරිà·à·“ලකයෙකු à·€à·à¶ºà·™à¶±à·Š පද්ධතියට ප්â€à¶»à·€à·’ෂ්ට වී නොමà·à¶­. එමනිස෠මෙම පිටුවෙහි සංස්කරණ ඉතිහà·à·ƒà¶ºà·™à·„à·’, ඔබගේ අන්තර්ජà·à¶½ ලිපිනය සටහන් කරගà·à¶±à·“මට සිදුවනු ඇත.',
'missingsummary' => "'''සිහිගà·à¶±à·Šà·€à·“මයි:''' ඔබ විසින් සංස්කරණ à·ƒà·à¶»à·à¶‚à·à¶ºà¶šà·Š සපය෠නොමà·à¶­.
ඔබ නà·à·€à¶­à¶­à·Š සුරà·à¶šà·“ම ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවà·à¶±à·Šà¶±à¶šà·Š විරහිතවම සුරà·à¶šà·™à¶±à·” ඇත.",
'missingcommenttext' => 'කරුණà·à¶šà¶» පහතින් පරිකථනයක් ඇතුළු කරන්න.',
'missingcommentheader' => "'''සිහිගà·à¶±à·Šà·€à·“මයි:''' මෙම පරිකථනය සඳහ෠ඔබ විසින් විෂයයක්/සිරස්තලයක් සපය෠නොමà·à¶­.
-ඔබ නà·à·€à¶­à¶­à·Š සුරà·à¶šà·“ම ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවà·à¶±à·Šà¶±à¶šà·Š විරහිතවම සුරà·à¶šà·™à¶±à·” ඇත.",
+ඔබ නà·à·€à¶­à¶­à·Š \"{{int:savearticle}}\" ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවà·à¶±à·Šà¶±à¶šà·Š විරහිතවම සුරà·à¶šà·™à¶±à·” ඇත.",
'summary-preview' => 'à·ƒà·à¶»à·à¶‚෠පෙර-දසුන:',
'subject-preview' => 'විෂයය/සිරස්තලය හි පෙර-දසුන:',
'blockedtitle' => 'පරිà·à·“ලකය෠වà·à¶»à¶«à¶º කර ඇත',
@@ -780,7 +791,7 @@ $2',
'nosuchsectiontext' => 'ඔබ උත්සà·à·„ කළේ නොපවතින කොටසක් සංස්කරණය කිරීමටයි.
එම කොටස ඔබ පිටුව නරඹමින් සිටින අතරතුර මක෠දමනු ලà·à¶¶ හ෠දලනය කිරීමට ලක් කර හ෠තිබිය à·„à·à¶š.',
'loginreqtitle' => 'ප්â€à¶»à·€à·’ෂ්ට වී සිටීම අවà·à·Šâ€à¶ºà¶ºà·’',
-'loginreqlink' => 'ප්â€à¶»à·€à·’ෂ්ටය',
+'loginreqlink' => 'පිවිසෙන්න',
'loginreqpagetext' => 'අනෙකුත් පිටු නරඹනු වස් ඔබ $1 විය යුතුය.',
'accmailtitle' => 'මුර-පදය යවන ලදි',
'accmailtext' => "[[User talk:$1|$1]] සඳහ෠අහඹු ලෙස ජනනය කරන ලද මුරපදයක් $2 වෙත යව෠ඇත.
@@ -816,12 +827,16 @@ $2',
'''එය තවමත් සුරà·à¶šà·“මට ලක් කොට නොමà·à¶­!'''",
'userjspreview' => "'''ඔබ සිදුකරන්නේ ඔබගේ පරිà·à·“ලක ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් පරික්ෂ෠කිරීම/පෙර-දසුන පමණක් බව ධà·à¶»à¶«à¶º කරන්න.'''
'''එය තවමත් සුරà·à¶šà·“මට ලක් කොට නොමà·à¶­!'''",
+'sitecsspreview' => "'''ඔබ දකින්නේ මෙම CSS à·„à·’ පෙරදසුනක් පමණක් බව සිහි තබà·à¶œà¶±à·Šà¶±.'''
+'''එය තවමත් සුරà·à¶šà·“මට ලක් කොට නොමà·à¶­!'''",
+'sitejspreview' => "'''ඔබ දකින්නේ මෙම JavaScript කේතයෙහි පෙරදසුනක් පමණක් බව සිහි තබà·à¶œà¶±à·Šà¶±.'''
+'''එය තවමත් සුරà·à¶šà·“මට ලක් කොට නොමà·à¶­!'''",
'userinvalidcssjstitle' => "'''අවවà·à¶¯à¶ºà¶ºà·’:''' ඡවියක් නොමà·à¶­ \"\$1\".
-රීති ප්â€à¶»à¶šà·à¶»à·€ .css à·„à· .js පිටු විසින් ඉංග්â€à¶»à·“සි කුඩà·-අකුරු à·à·“ර්ෂ භà·à·€à·’ත෠කෙරෙන බව සිහි තබ෠ගන්න, නිදසුන. {{ns:user}}:Foo/monobook.css මිස {{ns:user}}:Foo/Monobook.css නොවන බව.",
+රීති ප්â€à¶»à¶šà·à¶»à·€ .css à·„à· .js පිටු විසින් ඉංග්â€à¶»à·“සි කුඩà·-අකුරු à·à·“ර්ෂ භà·à·€à·’ත෠කෙරෙන බව සිහි තබ෠ගන්න, නිදසුන. {{ns:user}}:Foo/vector.css මිස {{ns:user}}:Foo/Vector.css නොවන බව.",
'updated' => '(යà·à·€à¶­à·Šà¶šà·à¶½à·“න)',
'note' => "'''සටහන:'''",
-'previewnote' => "'''මෙය පෙරදසුනක් පමණකි;
-වෙනස්වීම් සුරà·à¶šà·“ම තවමත් සිදුකොට නොමà·à¶­!'''",
+'previewnote' => "'''මෙය පෙරදසුනක් පමණි.'''
+ඔබගේ වෙනස්කිරීම් තවමත් සුරක්ෂිත කොට නොමà·à¶­!",
'previewconflict' => 'ඔබ විසින් සුරà·à¶šà·“ම තà·à¶»à·à¶œà¶­à·Šà¶­à·œà¶­à·Š, ඉහළ පෙළ සංස්කරණ සරියෙහි, පෙළ දර්à·à¶±à¶º විය à·„à·à¶šà·’ අයුර මෙම පෙර-දසුනෙන් ආවර්ජනය වේ.',
'session_fail_preview' => "'''කණගà·à¶§à·”යි! à·ƒà·à·ƒà·’ දත්ත à·„à·à¶±à·’යක් හේතුවෙන් අප විසින් ඔබගේ සංස්කරණය ක්â€à¶»à·’යà·à¶ºà¶ºà¶±à¶º කිරීමට නොහà·à¶šà·’ වී ඇත.
කරුණà·à¶šà¶» නà·à·€à¶­ උත්සà·à·„ කරන්න.
@@ -857,9 +872,6 @@ $2',
'copyrightwarning2' => "{{SITENAME}} වෙත දà·à¶ºà¶š වෙමින් ඔබ විසින් යොමු කෙරෙන කෘති, එවà·à¶±à·’ම දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶šà·Š සපයන වෙනයම් ඕනෑම අයෙකුන් විසින්, සංස්කරණය කිරීම, වෙනස් කිරීම, හ෠ඉවත් කිරීම සිදුවිය à·„à·à¶šà·Šà¶šà¶šà·Š බව කරුණà·à·€à·™à¶±à·Š සලකන්න.ඔබගේ ලියà·à·€à·’ලි, හිත්පිත් නà·à¶­à·’ව෠සේ පෙනෙන ඉත෠රළු අයුරින් සංස්කරණයට ලක් කිරීම නොකල යුතු යà·à¶ºà·’ ඔබ හඟින්නේ නම්, ඔබගේ කෘති මෙහි පල කිරීමෙන් වලකින්න.<br />
එසේ ම මෙය ඔබ විසින් ම ලියූ බවට හ෠පොදු විෂයපථයකින්, ඊâ€à¶§ à·ƒâ€à¶¸à·à¶± නිදහස් මූලà·à·à·Šâ€à¶»à¶ºà¶šà·’න් උපුට෠ගත් බවâ€à¶§ හ෠අපහâ€â€à¶§ සහතික විය යුතු ය. (තොරතුරු සඳහ෠$1 බලන්න).
''' හිමිකම් ඇවුරුණු දේ අනවසරයෙන් ප්â€à¶»à¶šà·à· කිරිමෙන් වලකින්න!'''",
-'longpagewarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’: මෙම පිටුව කිල෠බයිට් $1 ක් දිගුය;
-කිල෠බයිට 32ට කිට්ටු හ෠ඊට වඩ෠දිගු පිටු සංස්කරණය කිරීම සමහරක් බ්â€à¶»à·€à·”සර වලට දුෂ්කර විය à·„à·à¶š.
-එබà·à·€à·’න් මෙම â€à¶´à·’ටුව කුඩ෠කොටස් වලට බෙදීම පිළිබඳව අවධà·à¶±à¶º යොමු කරන්න.'''",
'longpageerror' => "'''දà·à·‚ය: ඔබ විසින් ඉදිරිපත් කර ඇති පෙළ, කිලà·à¶¶à¶ºà·’ට් $1 ක් දිගු වන අතර, උපරිමය වන කිලà·à¶¶à¶ºà·’ට් $2 ට වඩ෠දිගය.
එය සුරà·à¶šà·’ය නොහà·à¶š.'''",
'readonlywarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’: නඩත්තු කටයුතු සඳහ෠දත්ත-සංචිතය අවහිරකර ඇති බà·à·€à·’න් ඔබගේ සංස්කරණයන් දà·à¶±à·Šà¶¸à¶¸ සුරà·à¶šà·“මට ඔබ හට නොහà·à¶š.
@@ -1034,6 +1046,8 @@ $1",
'logdelete-failure' => "'''සටහන් දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º නියම කිරීම කල නොහà·à¶šà·’ විය:'''
$1",
'revdel-restore' => 'දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º වෙනස් කරන්න',
+'revdel-restore-deleted' => 'සංà·à·à¶°à¶± මක෠දමන ලදී',
+'revdel-restore-visible' => 'දෘà·à·Šâ€à¶º සංà·à·à¶°à¶±',
'pagehist' => 'පිටු ඉතිහà·à·ƒà¶º',
'deletedhist' => 'මකà·à¶¯à·à¶¸à·– ඉතිහà·à·ƒà¶º',
'revdelete-content' => 'අන්තර්ගතය',
@@ -1104,11 +1118,13 @@ $1",
# Diffs
'history-title' => '"$1"à·„à·’ සංà·à·à¶°à¶± ඉතිහà·à·ƒà¶º',
'difference' => '(අනුවà·à¶¯ අතර වෙනස්කම්)',
+'difference-multipage' => 'පිටු අතර වෙනස',
'lineno' => 'පේළිය $1:',
'compareselectedversions' => 'තà·à¶»à·à¶œà¶­à·Š සංà·à·à¶°à¶± සසඳන්න',
'showhideselectedversions' => 'තà·à¶»à·à¶œà¶­à·Š සංà·à·à¶°à¶± පෙන්වන්න/සඟවන්න',
'editundo' => 'අහà·à·ƒà·’ කරන්න',
-'diff-multi' => '({{PLURAL:$1|එක් අතරමà·à¶¯à·’ සංà·à·à¶°à¶±à¶ºà¶šà·Š| අතරමà·à¶¯à·’ සංà·à·à¶°à¶± $1 ක්}} පෙන්නුම් කර නොමà·à¶­.)',
+'diff-multi' => '({{PLURAL:$2|one user|$2 users}} විසින් සිදුකල {{PLURAL:$1|එක් අතරමà·à¶¯à·’ සංà·à·à¶°à¶±à¶ºà¶šà·Š| අතරමà·à¶¯à·’ සංà·à·à¶°à¶± $1 ක්}} පෙන්නුම් කර නොමà·à¶­.)',
+'diff-multi-manyusers' => '(පරිà·à·“ලකයන් $2 කට වඩ෠වà·à¶©à·’ ගණනකගේ ආසන්න පුනරීක්â€à·‚ණ $1ක් පෙන්ව෠නොමà·à¶­)',
# Search results
'searchresults' => 'ගවේෂණ ප්â€à¶»à¶­à·’ඵල',
@@ -1142,7 +1158,8 @@ $1",
'searchprofile-images-tooltip' => 'ගොනු සඳහ෠ගවේෂණය කරන්න',
'searchprofile-everything-tooltip' => 'සියළු අන්තර්ගතය ගවේෂණය කරන්න(à·ƒà·à¶šà¶ à·Šà¶¡à· පිටුද ඇතුළුව)',
'searchprofile-advanced-tooltip' => 'අභිරුචි නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Šà·„à·’ ගවේෂණය කරන්න',
-'search-result-size' => '$1 ({{PLURAL:$2|වචන1 ක් |වචන $2 ක්}})',
+'search-result-size' => '$1 ({{PLURAL:$2|වචන 1 ක් |වචන $2 ක්}})',
+'search-result-category-size' => '{{PLURAL:$1|එක් à·ƒà·à¶¸à·à¶¢à·“කයෙන්|à·ƒà·à¶¸à·à¶¢à·“කයන් $1 ක්}} ({{PLURAL:$2|එක් උප-ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶šà·Š|උප-ප්â€à¶»à·€à¶»à·Šà¶œ $2 ක්}}, {{PLURAL:$3|එක් ගොනුවක්|ගොනු $3 ක්}})',
'search-result-score' => 'අදà·à·…තà·à·€: $1%',
'search-redirect' => '($1 යළි-යොමු කරන්න)',
'search-section' => '($1 ඡේදය)',
@@ -1200,9 +1217,10 @@ $1",
'prefs-rc' => 'â€à¶±à·€ වෙනස්වීම්',
'prefs-watchlist' => 'මුර-ලà·à¶ºà·’ස්තුව',
'prefs-watchlist-days' => 'මුර-ලà·à¶ºà·’ස්තුවෙහි පෙන්විය යුතු දිනයන්:',
-'prefs-watchlist-days-max' => '(උපරිමයෙන් දින7 ක්)',
+'prefs-watchlist-days-max' => 'Maximum 7 days
+උපරිමය දින 7 කි',
'prefs-watchlist-edits' => 'ආවර්ධිත මුර-ලà·à¶ºà·’ස්තුවෙහි පෙන්විය යුතු උපරිම වෙනස්වීම් සංඛ්â€à¶ºà·à·€:',
-'prefs-watchlist-edits-max' => '(උපරිම සංඛ්â€à¶ºà·à·€: 1000)',
+'prefs-watchlist-edits-max' => 'උපරිම සංඛ්â€à¶ºà·à·€: 1000',
'prefs-watchlist-token' => 'මුරලà·à¶ºà·’ස්තු ටà·à¶šà¶±à¶º:',
'prefs-misc' => 'විවිධ',
'prefs-resetpass' => 'මුර-පදය වෙනස් කරන්න',
@@ -1220,6 +1238,7 @@ $1",
'contextlines' => 'හිට් එකකට පේළි ගණන:',
'contextchars' => 'එක් පේළියකට සන්දර්භය:',
'stub-threshold' => '<a href="#" class="stub">කොට සබà·à¶³à·’</a> ආකෘතිකරණය සඳහ෠සීමකය (බයිට්):',
+'stub-threshold-disabled' => 'අක්â€à¶»à·’ය කෙරිණි',
'recentchangesdays' => 'මෑත වෙනස්වීම්හි පෙන්විය යුතු දිනයන්:',
'recentchangesdays-max' => '(උපරිමයෙන් {{PLURAL:$1|එක් දිනක්|දින $1 ක්}})',
'recentchangescount' => 'පෙරනිමියෙන් පෙන්විය යුතු සංස්කරණ ගණන:',
@@ -1253,6 +1272,7 @@ $1",
'prefs-files' => 'ගොනු',
'prefs-custom-css' => 'අභිරුචි CSS',
'prefs-custom-js' => ' අභිරුචි JS',
+'prefs-common-css-js' => 'සියළු සිවි සඳහ෠හවුලේ භà·à·€à·’ත CSS/ජà·à·€à· ස්ක්â€à¶»à·’ප්ට්:',
'prefs-reset-intro' => 'ඔබගේ අභිප්â€à¶»à·šà¶­à¶ºà¶±à·Š, අඩවි පෙරනිමි වෙතට යළි-පිහිටුවීම සඳහà·, ඔබ හට මෙම පිටුව භà·à·€à·’ත෠කල à·„à·à¶š.
මෙය අහà·à·ƒà·’ කල නොහà·à¶š.',
'prefs-emailconfirm-label' => 'විද්â€à¶ºà·”ත්-ලිපිනය තහවුරුකිරීම:',
@@ -1293,9 +1313,15 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'prefs-advancedrendering' => 'ප්â€à¶»à¶œà¶­ විකල්පයන්',
'prefs-advancedsearchoptions' => 'ප්â€à¶»à¶œà¶­ විකල්පයන්',
'prefs-advancedwatchlist' => 'ප්â€à¶»à¶œà¶­ විකල්පයන්',
-'prefs-display' => 'දර්à·à¶± විකල්පයන්',
+'prefs-displayrc' => 'දර්à·à¶± විකල්පයන්',
+'prefs-displaysearchoptions' => 'විකල්ප පෙන්වන්න',
+'prefs-displaywatchlist' => 'විකල්ප පෙන්වන්න',
'prefs-diffs' => 'වෙනස',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය අනීතික බවක් පෙනෙයි.',
+'email-address-validity-invalid' => 'නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් ඇතුලත් කරන්න',
+
# User rights
'userrights' => 'පරිà·à·“ලක හිමිකම් කළමනà·à¶šà¶»à¶«à¶º',
'userrights-lookup-user' => 'පරිà·à·“ලක කණ්ඩà·à¶ºà¶¸à·Š කළමනà·à¶šà¶»à¶«à¶º කරන්න',
@@ -1380,6 +1406,7 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'right-hideuser' => 'පරිà·à·“ලක නà·à¶¸à¶ºà¶šà·Š à·€à·à¶»à¶«à¶º කරමින්, එය ප්â€à¶»à¶¢à·à·€ වෙතින් සඟවන්න',
'right-ipblock-exempt' => 'අන්තර්ජà·à¶½ ලිපින à·€à·à¶»à¶«à¶ºà¶±à·Š, ස්වයංක්â€à¶»à·“ය-à·€à·à¶»à¶«à¶ºà¶±à·Š හ෠පරà·à·ƒ à·€à·à¶»à¶«à¶ºà¶±à·Š මඟ හරින්න',
'right-proxyunbannable' => 'ප්â€à¶»à¶­à·’යුක්තයන්ගේ ස්වයංක්â€à¶»à·“යව à·€à·à¶»à¶«à¶ºà¶±à·Š මඟහරින්න',
+'right-unblockself' => 'ඔවුන් විසින්ම à·€à·à¶»à¶«à¶ºà·™à¶±à·Š මුදවීම',
'right-protect' => 'ආරක්ෂණ මට්ටම් වෙනස් කරමින් ආරක්ෂිත පිටු සංස්කරණය කරන්න',
'right-editprotected' => 'ආරක්ෂිත පිටු සංස්කරණය කරන්න (තීරු-දර්à·à¶± ආරක්ෂණය විරහිත)',
'right-editinterface' => 'පරිà·à·“ලක අතුරු-මුව සංස්කරණය කරන්න',
@@ -1402,7 +1429,6 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'right-siteadmin' => 'දත්ත-ගබඩà·à·€ අවුරන්න හ෠ඇවුරුම ඉවත් කරන්න',
'right-reset-passwords' => 'අනෙක් පරිà·à·“ලකගේ මුරපදය ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන්න',
'right-override-export-depth' => '5වන මට්ටම දක්ව෠සබà·à¶³à·’ පිටු ද සහිතව පිටු නිර්යà·à¶­ කරන්න',
-'right-versiondetail' => 'විස්කෘත මෘදුකà·à¶‚ග අනුවà·à¶¯ විස්තර පෙන්වන්න',
'right-sendemail' => 'අනෙක් පරිà·à·“ලකයන්ට ඊ-ලිපි යවන්න',
# User rights log
@@ -1453,14 +1479,9 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'recentchanges-legend' => 'â€à¶±à·€ වෙනස්වීම් à·ƒà·à¶šà·ƒà·”ම් තà·à¶»à·à¶œà·à¶±à·“ම',
'recentchangestext' => 'මෙම පිටුවේ විකියට සිදුකල ඉත෠මෑත වෙනස්වීම් පසුහඹන්න.',
'recentchanges-feed-description' => 'මෙම පà·à·‚කයෙහි විකියට බොහ෠මෑතදී සිදුකල වෙනස්වීම් හෙළිකරන්න.',
-'recentchanges-label-legend' => 'පුරà·à·€à·˜à¶­à·Šà¶­à¶º : $1',
-'recentchanges-legend-newpage' => '$1 - නව පිටුව',
'recentchanges-label-newpage' => 'මෙම සංස්කරණය නව පිටුවක් නිර්මà·à¶«à¶º කරන ලදී',
-'recentchanges-legend-minor' => '$1- සුළු සංස්කරණය',
'recentchanges-label-minor' => 'මෙය සුළු සංස්කරණයකි',
-'recentchanges-legend-bot' => '$1 - bot සංස්කරණය',
'recentchanges-label-bot' => 'මෙම සංස්කරණය රොබà·à·€à¶šà·Š (bot) විසින් කරනලද්දකි',
-'recentchanges-legend-unpatrolled' => '$1 - විමර්à·à¶±à¶º නොකළ සංස්කරණ',
'recentchanges-label-unpatrolled' => 'මෙම සංස්කරණය තවම විමර්à·à¶±à¶º කර නොමà·à¶­',
'rcnote' => "$4 දින, $5 වන තෙක්, අවසන් {{PLURAL:$2|දිනදී|දින '''$2''' තුලදී}} සිදුවී ඇති, {{PLURAL:$1| '''1''' ක් වෙනස|අවසන් වෙනස්වීම් '''$1''' }} පහත දà·à¶šà·Šà·€à·š.",
'rcnotefrom' => "'''$2''' න් පසු සිදුවී ඇති වෙනස්කම් මෙහි පහත දà·à¶šà·Šà·€à·š ('''$1''' ක ප්â€à¶»à¶¸à·à¶«à¶ºà¶š උපරිමයක් පෙන්ව෠ඇත).",
@@ -1509,6 +1530,9 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'upload_directory_missing' => 'උඩුගත ඩිරෙක්ටරිය ($1) සොයà·à¶œà¶­ නොහà·à¶šà·’ අතර එය වෙබ්-සේවà·à¶¯à·à¶ºà¶šà¶º විමින් තà·à¶±à·’ය නොහà·à¶šà·’ විය.',
'upload_directory_read_only' => 'වෙබ්-සේවà·à¶¯à·à¶ºà¶šà¶º විසින් උඩුගත ඩිරෙක්ටරිය ($1) වෙත ලිවීමට නොහà·à¶šà·’ විය.',
'uploaderror' => 'උඩුගත කිරීම් දà·à·‚යක්',
+'upload-recreate-warning' => "'''අවවà·à¶¯à¶ºà¶ºà·’: මෙම නම තිබූ ගොනුවක් මකà·à¶¯à·à¶¸à·“මට හ෠ගෙනයෑමට හ෠ලක්ව ඇත.'''
+
+ඔබගේ පහසුව තක෠මෙම පිටුවවෙහි මකà·à¶¯à·à¶¸à·”මෙහි හ෠ගෙනයෑමෙහි ලà¶à·” සටහන මෙහි දà·à¶šà·Šà·€à·š:",
'uploadtext' => "ගොනු උඩුගත කිරීම සඳහ෠පහත ආකෘති පත්â€à¶»à¶º භà·à·€à·’ත෠කරන්න.
පෙරදී උඩුගතකෙරුණු ගොනු නà·à¶»à¶¹à·”ම හ෠ගවේෂණය සඳහ෠[[Special:FileList|උඩුගතකෙරුණු ගොනු ලà·à¶ºà·’ස්තුව]] වෙත යන්න, (යළි)උඩුගතකෙරුම්ද [[Special:Log/upload|උඩුගතකෙරුම් ලà¶à·”-සටහන]] තුල සටහන් කර ඇති අතර, මකà·à¶¯à·à¶¸à·”ම් [[Special:Log/delete|මකà·à¶¯à·à¶¸à·”ම් ලà¶à·”-සටහන]] à·„à·’ ඇත.
@@ -1544,6 +1568,17 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'filetype-banned-type' => "'''\".\$1\"''' යනු අවසරලත් ගොනු වර්ගයක් නොවේ.
අවසරලත් {{PLURAL:\$3|ගොනු වර්ගය|ගොනු වර්ගයන්}} වන්නේ \$2.",
'filetype-missing' => 'ගොනුවට (".jpg" à·€à·à¶±à·’) ප්â€à¶»à·ƒà¶»à·Šà¶¢à¶±à¶ºà¶šà·Š නොමà·à¶­.',
+'empty-file' => 'ඔබ ඉදිරිපත්කල ගොනුව හිස් එකකි.',
+'file-too-large' => 'ඔබ විසින් යොමන ලද ගොනුව පමණට වඩ෠විà·à·˜à¶½à¶º.',
+'filename-tooshort' => 'ගොනුනà·à¶¸à¶º කෙටි à·€à·à¶©à·’ය.',
+'filetype-banned' => 'මෙම වර්ගය තහනම් කර ඇත.',
+'verification-error' => 'මෙම ගොනුව සත්â€à¶ºà·à¶ºà¶±à¶º කිරීමෙන් සමත් වූ බවට පිළිගත නොහà·à¶š.',
+'hookaborted' => 'දිගු ආකුà·à¶ºà¶šà·Š (කොක්කක්) විසින් ඔබ උත්සà·à·„ කල වෙනස්කිරීම රà·à¶°à¶±à¶º කරන ලදි.',
+'illegal-filename' => 'පිටු-නà·à¶¸à¶ºà¶§ ඉඩ දෙනු නොලà·à¶¶à·š.',
+'overwrite' => 'දà·à¶±à¶§ බවතින ගොනුවක් උපරිලේඛනය (උඩින් ලිවීඹ) කෙරුමට ඉඩදෙනු නොලà·à¶¶à·š.',
+'unknown-error' => 'හඳුන෠නොගත් දà·à·‚යක් ඇතිවිය.',
+'tmp-create-error' => 'තà·à·€à¶šà·à¶½à·’ක ගොනුවක් තà·à¶±à·“ම කල නොහà·à¶šà·’ විය.',
+'tmp-write-error' => 'තà·à·€à¶šà·à¶½à·’ක ගොනුව ලිවීමේදී දà·à·‚යක් හට ගà·à¶±à·”නි.',
'large-file' => 'ගොනුවල විà·à·à¶½à¶­à·Šà·€à¶º $1 ට වඩ෠වà·à¶©à·’ නොවීම නිර්දේ෠කරනු ලà·à¶¶à·š;
මෙම ගොනුව $2 ක් විà·à·à¶½à¶º.',
'largefileserver' => 'සේවà·à¶¯à·à¶ºà¶šà¶ºà·š à·„à·à¶©à¶œà·ƒà·Šà·€à·“ම ප්â€à¶»à¶šà·à¶» ඉඩ ලබ෠දෙන ප්â€à¶»à¶¸à·à¶«à¶ºà¶§ වඩ෠මෙම ගොනුව විà·à·à¶½à¶º.',
@@ -1573,13 +1608,14 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'file-exists-duplicate' => 'මෙම ගොනුව පහත {{PLURAL:$1|ගොනුවෙහි|ගොනු වල}} අනුපිටපතකි:',
'file-deleted-duplicate' => 'මෙම ([[:$1]]) ගොනුවට සර්වසà·à¶¸à·Šâ€à¶º ගොනුවක් පෙරදී මකà·à¶¯à¶¸à· ඇත.
එය යළි-උඩුගත කිරීම සඳහ෠කටයුතු කිරීමට පෙර එම ගොනුවෙහි මකà·à¶¯à·à¶¸à·“ම් ඉතිහà·à·ƒà¶º ඔබ විසින් පරීක්ෂ෠කර බà·à¶½à·’ය යුතුව ඇත.',
-'successfulupload' => 'à·ƒà·à¶»à·Šà¶®à¶š උඩුගත කිරීමකි',
'uploadwarning' => 'උඩුගත කිරීම් අවවà·à¶¯à¶ºà¶šà·’',
'uploadwarning-text' => 'කරුණà·à¶šà¶» පහත ගොනු විස්තරය වෙනස් කර නà·à·€à¶­ උත්සà·à·„ කරන්න.',
'savefile' => 'ගොනුව සුරකින්න',
'uploadedimage' => '"[[$1]]" උඩුගත කරන ලදි',
'overwroteimage' => ' "[[$1]]" à·„à·’ නව අනුවà·à¶¯à¶ºà¶šà·Š උඩුගත කරන ලදි',
'uploaddisabled' => 'උඩුගත කිරීම් අක්â€à¶»à·“ය කර ඇත',
+'copyuploaddisabled' => 'URL මගින් උඩුගත කිරීම අක්â€à¶»à·“ය කොට ඇත.',
+'uploadfromurl-queued' => 'ඔබගේ උඩුගත කිරීම පෙළ ගස්ව෠ඇත.',
'uploaddisabledtext' => ' {{SITENAME}} à·„à·’ ගොනු උඩුගත කිරීම් අක්â€à¶»à·“ය කර ඇත.',
'php-uploaddisabledtext' => 'PHP à·„à·’ ගොනු උඩුගතකිරීම් අක්â€à¶»à·“ය කොට ඇත.
කරුණà·à¶šà¶» ගොනු_උඩුගතකිරීම් පරිස්ථිතිය පරික්ෂ෠කර බලන්න.',
@@ -1615,6 +1651,14 @@ JD # ජෙනොප්ටික්
MGP # පෙන්ටà·à¶šà·Šà·ƒà·Š
PICT # විවිධ.
#</pre> <!-- මෙම පේළිය මෙලෙසම පà·à·€à¶­à·“මට ඉඩදෙන්න -->',
+'upload-success-subj' => 'à·ƒà·à¶»à·Šà¶®à¶š උඩුගත කිරීමකි',
+'upload-success-msg' => '[$2]වෙතින් ඔබගේ උඩුගත කිරීම à·ƒà·à¶»à·Šà¶®à¶š විය. එය මෙහි ඇත: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'උඩුගත කිරීමේ ගà·à¶§à·…ුව',
+'upload-failure-msg' => 'ඔබගේ [$2] උඩුගතකිරීම හ෠බà·à¶³à·’ ගà·à¶§à·…ුවක් විය:
+
+$1',
+'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> යන්නෙන් ආරම්භ විය යුතුයි.',
@@ -1680,6 +1724,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'listfiles_search_for' => 'මà·à¶°à·Šâ€à¶º නà·à¶¸à¶º සඳහ෠ගවේෂණය කරන්න:',
'imgfile' => 'ගොනුව',
'listfiles' => 'ගොනු ලà·à¶ºà·’ස්තුව',
+'listfiles_thumb' => 'සිඟිති-රූපය',
'listfiles_date' => 'දිනය',
'listfiles_name' => 'නම',
'listfiles_user' => 'පරිà·à·“ලක',
@@ -1796,8 +1841,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'statistics-edits' => '{{SITENAME}} පිහිටුවීමෙන් අනතුරුව සිදුවූ පිටු සංස්කරණයන්',
'statistics-edits-average' => 'එක් පිටුවකට සංස්කරණයන්හි මධ්â€à¶ºà¶š අගය',
'statistics-views-total' => 'නà·à¶»à¶¹à·”ම් එකතුව',
+'statistics-views-total-desc' => 'විà·à·šà·‚ හ෠දà·à¶±à¶§ නොපවතින පිටු වල දසුන් එක් කොට නà·à¶­',
'statistics-views-peredit' => 'එක් සංස්කරණයකට නà·à¶»à¶¹à·”ම් ගණන',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue කà·à¶»à·Šà¶ºà¶º පà·à¶½à·’මෙහි] දිග',
'statistics-users' => 'ලේඛනගත [[Special:ListUsers|පරිà·à·“ලකයà·]]',
'statistics-users-active' => 'ක්â€à¶»à·’යà·à·à·“ලි පරිà·à·“ලකයන්',
'statistics-users-active-desc' => 'පසුගිය {{PLURAL:$1|දිනය|දින $1}} තුලදී කිසියම් ක්â€à¶»à·’යà·à·€à¶šà·Š සිදු කල පරිà·à·“ලකයන්',
@@ -1811,11 +1856,11 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'doubleredirects' => 'ද්විත්ව යළි-යොමුකිරීම්',
'doubleredirectstext' => 'අනෙකුත් යළි-යොමුවීම් පිටුවලට යළි-යොමුවන පිටුවල ලà·à¶ºà·’ස්තුවක් මෙම පිටුවේ දà·à¶šà·Šà·€à·š.
-එක් එක් පේළියක අඩංගු වන්නේ පළමු හ෠දෙවන යළි-යොමුවීම් වලට සබà·à¶³à·’ හ෠ඒ සමග පළමු යළි-යොමුව එල්ල වන්නà·à·€à·–, à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š "සත්â€à¶º" ඉලක්ක පිටුව වන, දෙවන යළි-යොමුවේ ඉලක්කයයි.<s>කප෠හà·à¶»à·’</s> නිවේà·à·’තයන් පිලිබඳ ගà·à¶§à·…à·” විසඳ෠ඇත.',
+එක් එක් පේළියක අඩංගු වන්නේ පළමු හ෠දෙවන යළි-යොමුවීම් වලට සබà·à¶³à·’ හ෠ඒ සමග පළමු යළි-යොමුව එල්ල වන්නà·à·€à·–, à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š "සත්â€à¶º" ඉලක්ක පිටුව වන, දෙවන යළි-යොමුවේ ඉලක්කයයි.<del>කප෠හà·à¶»à·’</del> නිවේà·à·’තයන් පිලිබඳ ගà·à¶§à·…à·” විසඳ෠ඇත.',
'double-redirect-fixed-move' => '[[$1]] ගෙන ගොස් ඇත, එය දà·à¶±à·Š [[$2]] වෙතට යළි-යොමුවකි',
'double-redirect-fixer' => 'යළි-යොමුවීම් උපස්ථà·à¶ºà¶š',
-'brokenredirects' => 'බිඳුනු යළි-යොමු (Broken redirects)',
+'brokenredirects' => 'භින්න වූ ආපසු à·„à·à¶»à·€à·”ම්',
'brokenredirectstext' => 'මෙහි පහත දà·à¶šà·Šà·€à·™à¶± යළි-යොමුවීම් නොපවතින පිටු වලට සබà·à¶³à·š:',
'brokenredirects-edit' => 'සංස්කරණය',
'brokenredirects-delete' => 'මක෠දà·à¶¸à·“ම',
@@ -1834,6 +1879,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'nmembers' => '{{PLURAL:$1|එක් à·ƒà·à¶¸à·à¶¢à·’කයෙකි|à·ƒà·à¶¸à·à¶¢à·“කයන් $1 කි}}',
'nrevisions' => '{{PLURAL:$1|එක් සංà·à·à¶°à¶±à¶ºà¶šà·’|සංà·à·à¶°à¶± $1 කි }}',
'nviews' => ' {{PLURAL:$1|නà·à¶»à¶¹à·”ම් එකකි|නà·à¶»à¶¹à·”ම් $1 කි}}',
+'nimagelinks' => '{{PLURAL:$1|පිටු|පිටු}} $1 ක භà·à·€à·’තà·à¶šà¶» ඇත',
+'ntransclusions' => '{{PLURAL:$1|පිටු|පිටු}} $1 ක භà·à·€à·’තà·à¶šà¶» ඇත',
'specialpage-empty' => 'මෙම à·€à·à¶»à·Šà¶­à·à·€à¶§ ප්â€à¶»à¶­à·’ඵල කිසිවක් නොමà·à¶­.',
'lonelypages' => 'හුදෙකල෠පිටු',
'lonelypagestext' => 'පහත පිටු, {{SITENAME}} à·„à·’ අනෙකුත් පිටුවලින් සබà·à¶³à·’ නොමà·à¶­.',
@@ -1858,7 +1905,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'prefixindex' => 'උපසර්ගය සහිත සියළු පිටු',
'shortpages' => 'කෙටි පිටු',
'longpages' => 'දිගු පිටු',
-'deadendpages' => 'ආවෘත-අගà·à¶­à·’ (Dead-end) පිටු',
+'deadendpages' => 'අපගත-සීම෠පිටු',
'deadendpagestext' => 'පහත පිටු, {{SITENAME}} à·„à·’ අනෙකුත් පිටු වෙත සබà·à¶³à·“ නොමà·à¶­.',
'protectedpages' => 'ආරක්ෂිත පිටු',
'protectedpages-indef' => 'අනිà·à·Šà¶ à·’ත ආරක්ෂණයන් පමණයි',
@@ -1890,7 +1937,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'suppress' => 'ප්â€à¶»à¶¸à·à¶¯ දà·à·‚ය',
# Book sources
-'booksources' => 'ග්â€à¶»à¶±à·Šà¶® මූලà·à·à·Šâ€à¶»',
+'booksources' => 'මූලà·à·à·Šâ€à¶» පොත්',
'booksources-search-legend' => 'ග්â€à¶»à¶±à·Šà¶® මූලà·à·à·Šâ€à¶» සඳහ෠ගවේෂණය කරන්න',
'booksources-isbn' => 'ISBN:',
'booksources-go' => 'යන්න',
@@ -1992,34 +2039,40 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'listgrouprights-removegroup-self-all' => 'සියළු කà·à¶«à·Šà¶©à¶ºà¶±à·Š ස්වීය ගිණුමෙන් ඉවත් කරන්න',
# E-mail user
-'mailnologin' => 'යà·à¶ºà·”තු ලිපිනය නොමà·à¶­',
-'mailnologintext' => 'අනෙකුත් පරිà·à·“ලකයන්හට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š යà·à·€à·”මට පෙරà·à¶­à·”à·€, ඔබ [[Special:UserLogin|ප්â€à¶»à·€à·’ෂ්ට වී]], ඔබගේ [[Special:Preferences|අභිරුචියන්හි]] නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් සඳහන් කර තිබිය යුතුය.',
-'emailuser' => 'මෙම පරිà·à·“ලක වෙත විද්â€à¶ºà·”ත්-ලිපියක් යවන්න',
-'emailpage' => ' පරිà·à·“ලකට විද්â€à¶ºà·”ත්-ලිපියක් යවන්න',
-'emailpagetext' => 'මෙම පරිà·à·“ලකය෠හට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල් පණිවුඩයක් යà·à·€à·“ම සඳහ෠මෙම ආකෘති පත්â€à¶»à¶º භà·à·€à·’ත෠කිරීමට ඔබ හට à·„à·à¶š.
+'mailnologin' => 'යà·à¶ºà·”තු ලිපිනය නොමà·à¶­',
+'mailnologintext' => 'අනෙකුත් පරිà·à·“ලකයන්හට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š යà·à·€à·”මට පෙරà·à¶­à·”à·€, ඔබ [[Special:UserLogin|ප්â€à¶»à·€à·’ෂ්ට වී]], ඔබගේ [[Special:Preferences|අභිරුචියන්හි]] නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් සඳහන් කර තිබිය යුතුය.',
+'emailuser' => 'මෙම පරිà·à·“ලක වෙත විද්â€à¶ºà·”ත්-ලිපියක් යවන්න',
+'emailpage' => ' පරිà·à·“ලකට විද්â€à¶ºà·”ත්-ලිපියක් යවන්න',
+'emailpagetext' => 'මෙම පරිà·à·“ලකය෠හට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල් පණිවුඩයක් යà·à·€à·“ම සඳහ෠මෙම ආකෘති පත්â€à¶»à¶º භà·à·€à·’ත෠කිරීමට ඔබ හට à·„à·à¶š.
ලබන්න෠විසින් සෘජු ලෙස ඔබ හට පිළිතුරු එවනු à·„à·à¶šà·’ වන පරිදි, ඔබ විසින් [[Special:Preferences|ඔබගේ පරිà·à·“ලක අභිරුචියන්]] à·„à·’ ඇතුළත් කල විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය, විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලෙහි "වෙතින්" ලිපිනයෙහි පෙන්නුම් කරනු ඇත.',
-'usermailererror' => 'Mail object විසින් පහත දà·à·‚ය එවනලදී:',
-'defemailsubject' => '{{SITENAME}} විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල',
-'noemailtitle' => 'විද්â€à¶ºà·”ත්-ලිපිනයක් නොමà·à¶­',
-'noemailtext' => 'මෙම පරිà·à·“ලකය෠නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් සඳහන් කර නà·à¶­.',
-'nowikiemailtitle' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලයන් කිසිවක් සඳහ෠අවසර නොමà·à¶­',
-'nowikiemailtext' => 'අනෙකුත් පරිà·à·“ලකයන්ගෙන් විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලà·à¶¶ නොගà·à¶±à·”ම මෙම පරිà·à·’ලකය෠විසින් තà·à¶»à·à¶œà·™à¶± ඇත.',
-'email-legend' => 'වෙනත් {{SITENAME}} පරිà·à·“ලකයෙකුට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යවන්න',
-'emailfrom' => 'වෙතින්:',
-'emailto' => 'වෙතට:',
-'emailsubject' => 'විෂයය:',
-'emailmessage' => 'පණිවුඩය:',
-'emailsend' => 'යවන්න',
-'emailccme' => 'මගේ පණිවුඩයෙහි පිටපතක් ම෠වෙත විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š කරන්න.',
-'emailccsubject' => '$1: $2 වෙත ඔබගේ පණිවුඩය පිටපත් කරන්න',
-'emailsent' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල යවන ලදි',
-'emailsenttext' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š පණිවුඩය යව෠ඇත.',
-'emailuserfooter' => '{{SITENAME}} à·„à·’ " පරිà·à·“ලකට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à¶šà·Š යවන්න" à·à·Šâ€à¶»à·’තය අනුසà·à¶»à¶ºà·™à¶±à·Š $1 විසින් $2 වෙත විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යවන ලදි.',
+'usermailererror' => 'Mail object විසින් පහත දà·à·‚ය එවනලදී:',
+'defemailsubject' => '{{SITENAME}} විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල',
+'usermaildisabled' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල අක්â€à¶»à·“ය කොට ඇත',
+'usermaildisabledtext' => 'මෙම විකියෙහි අනෙකුත් පරිà·à·“ලකයන් හට විද්â€à¶ºà·”ත්-ගà·à¶´à·à¶½à·Š යà·à·€à·“මට ඔබ හට නොහà·à¶š',
+'noemailtitle' => 'විද්â€à¶ºà·”ත්-ලිපිනයක් නොමà·à¶­',
+'noemailtext' => 'මෙම පරිà·à·“ලකය෠නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් සඳහන් කර නà·à¶­.',
+'nowikiemailtitle' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලයන් කිසිවක් සඳහ෠අවසර නොමà·à¶­',
+'nowikiemailtext' => 'අනෙකුත් පරිà·à·“ලකයන්ගෙන් විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලà·à¶¶ නොගà·à¶±à·”ම මෙම පරිà·à·’ලකය෠විසින් තà·à¶»à·à¶œà·™à¶± ඇත.',
+'email-legend' => 'වෙනත් {{SITENAME}} පරිà·à·“ලකයෙකුට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යවන්න',
+'emailfrom' => 'වෙතින්:',
+'emailto' => 'වෙතට:',
+'emailsubject' => 'විෂයය:',
+'emailmessage' => 'පණිවුඩය:',
+'emailsend' => 'යවන්න',
+'emailccme' => 'මගේ පණිවුඩයෙහි පිටපතක් ම෠වෙත විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š කරන්න.',
+'emailccsubject' => '$1: $2 වෙත ඔබගේ පණිවුඩය පිටපත් කරන්න',
+'emailsent' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල යවන ලදි',
+'emailsenttext' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š පණිවුඩය යව෠ඇත.',
+'emailuserfooter' => '{{SITENAME}} à·„à·’ " පරිà·à·“ලකට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à¶šà·Š යවන්න" à·à·Šâ€à¶»à·’තය අනුසà·à¶»à¶ºà·™à¶±à·Š $1 විසින් $2 වෙත විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යවන ලදි.',
+
+# User Messenger
+'usermessage-summary' => 'පද්ධති පණිවුඩයක් තබමි.',
+'usermessage-editor' => 'පද්ධති පණිවුඩ කරු',
# Watchlist
'watchlist' => 'මගේ මුර-ලà·à¶ºà·’ස්තුව',
'mywatchlist' => 'මගේ මුර ලà·à¶ºà·’ස්තුව',
-'watchlistfor' => "('''$1''' සඳහà·)",
+'watchlistfor2' => '$1 සඳහ෠($2)',
'nowatchlist' => 'ඔබගේ මුර-ලà·à¶ºà·’ස්තුවේ කිසිදු අයිතමයක් නොමà·à¶­.',
'watchlistanontext' => 'ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙහි අයිතම නà·à¶»à¶¹à·“මට හ෠සංස්කරණය කිරීමට හ෠කරුණà·à¶šà¶» $1 සපුරන්න.',
'watchnologin' => 'ප්â€à¶»à·€à·’ෂ්ට වී නොමà·à¶­',
@@ -2061,32 +2114,35 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'enotif_lastvisited' => 'ඔබගේ අවසà·à¶± පිවිසුමට පසු සිදුවූ සියළු වෙනස්වීම් නà·à¶»à¶¹à·”මට $1 බලන්න.',
'enotif_lastdiff' => 'මෙම වෙනස නà·à¶»à¶¹à·“ම සඳහ෠$1 බලන්න.',
'enotif_anon_editor' => 'නිර්නà·à¶¸à·’ක පරිà·à·“ලක $1',
-'enotif_body' => 'à·ƒà·à¶¯à¶» $WATCHINGUSERNAME,
+'enotif_body' => 'හිතවත් $WATCHINGUSERNAME,
-{{SITENAME}} à·„à·’ $PAGETITLE පිටුව, $PAGEEDITDATE දිනදී $PAGEEDITOR විසින් $CHANGEDORCREATED කර ඇති අතර, වත්මන් අනුවà·à¶¯à¶º සඳහ෠$PAGETITLE_URL බලන්න.
+{{SITENAME}} මත ඇති $PAGETITLE පිටුව $PAGEEDITOR විසින් $PAGEEDITDATE à·€à·à¶±à·’ දින $CHANGEDORCREATED, වර්තමà·à¶± සංà·à·à¶°à¶±à¶º සදහ෠$PAGETITLE_URL බලන්න.
$NEWPAGE
-සංස්කà·à¶»à¶šà¶œà·š à·ƒà·à¶»à·à¶‚à·à¶º: $PAGESUMMARY $PAGEMINOREDIT
+Editor\'s summary: $PAGESUMMARY $PAGEMINOREDIT
-සංස්කà·à¶»à¶š හ෠සම්බන්ධවීමට:
-තà·à¶´à·‘ල: $PAGEEDITOR_EMAIL
-විකි: $PAGEEDITOR_WIKI
+Contact the editor:
+mail: $PAGEEDITOR_EMAIL
+wiki: $PAGEEDITOR_WIKI
-ඔබ විසින් මෙම පිටුව වෙත පිවිසුනොත් මිස ඉදිරියෙහිදී සිදුවිය à·„à·à¶šà·’ වෙනස්වීම් අභිමුඛයෙහි වෙනත් කිසිම දෑනුම්දීම් සිදුනොවනු ඇත.
-ඔබගේ මුර ලà·à¶ºà·’ස්තුවෙහි ඔබගේ සියළු මුරකෙරුණු පිටු සඳහ෠දà·à¶±à·”ම්දීමේ සලකුණු ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶»à¶¸à·Šà¶· කෙරුමද ඔබ හට සිදුකල à·„à·à¶š.
+There will be no other notifications in case of further changes unless you visit this page.
+You could also reset the notification flags for all your watched pages on your watchlist.
- ඔබගේ හිතවත් {{SITENAME}} à·„à·’ දà·à¶±à·”ම්දීමේ පද්ධතිය
+ Your friendly {{SITENAME}} notification system
--
-ඔබගේ මුරලà·à¶ºà·’ස්තු පරිස්ථිතීන් වෙනස්කිරීම සඳහà·
-{{fullurl:{{#special:Watchlist}}/edit}} වෙත පිවිසෙන්න
+To change your email notification settings, visit
+{{fullurl:{{#special:Preferences}}}}
+
+To change your watchlist settings, visit
+{{fullurl:{{#special:Watchlist}}/edit}}
-ඔබගේ මුරලà·à¶ºà·’ස්තුවෙන් පිටුව මක෠දà·à¶¸à·“ම සඳහ෠වූ
-$UNWATCHURL වෙත පිවිසෙන්න
+To delete the page from your watchlist, visit
+$UNWATCHURL
-ප්â€à¶»à¶­à·’පà·à·‚ණය à·„à· à·€à·à¶©à·’මනත් සහà·à¶º:
+Feedback and further assistance:
{{fullurl:{{MediaWiki:Helppage}}}}',
# Delete
@@ -2142,7 +2198,10 @@ $UNWATCHURL වෙත පිවිසෙන්න
'revertpage-nouser' => '(පරිà·à·’ලක නම ඉවත් කිරීමෙන්) සංස්කරණයන් [[User:$1|$1]] මඟින් කළ අවසන් සංà·à·à¶°à¶±à¶ºà¶§ ප්â€à¶»à¶­à·’වර්තනය කෙරිණි',
'rollback-success' => ' $1 විසින් සිදුකල සංස්කරණයන් ප්â€à¶»à¶­à·’වර්තනය කරන ලදි;
$2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙනස් කරන ලදි .',
-'sessionfailure' => 'ඔබගේ ප්â€à¶»à·€à·’ෂ්ට වීමේ à·ƒà·à·ƒà·’යෙහි කිසියම් ගà·à¶§à·…ුකà·à¶»à·“ තත්ත්වයක් පà·à¶± නà·à¶œà·“ ඇත;
+
+# Edit tokens
+'sessionfailure-title' => 'à·ƒà·à·ƒà·’ ඇණ හිටීම',
+'sessionfailure' => 'ඔබගේ ප්â€à¶»à·€à·’ෂ්ට වීමේ à·ƒà·à·ƒà·’යෙහි කිසියම් ගà·à¶§à·…ුකà·à¶»à·“ තත්ත්වයක් පà·à¶± නà·à¶œà·“ ඇත;
à·ƒà·à·ƒà·’ පරිග්â€à¶»à·„ණයට එරෙහි ආරක්ෂිත පියවරක් ලෙස මෙම ක්â€à¶»à·’යà·à·€ අත්හà·à¶»à¶¯à¶¸à· ඇත.
"පසුපසට" බොත්තම ක්ලික් කර ඔබ පà·à¶¸à·’ණි පිටුව යළිපූරණය නොට නà·à·€à¶­ උත්සà·à·„ කරන්න.',
@@ -2234,7 +2293,7 @@ $2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙන
එක්ක෠ඔබගේ සබà·à¶³à·’ය සදොස්ය, නà·à¶­à·„ොත් සංà·à·à¶°à¶±à¶º ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶ºà¶§ හ෠සංරක්ෂිතයෙන් ඉවත් කිරීමට හ෠ලක්ව තිබේ.',
'undelete-nodiff' => 'පූර්ව සංà·à·à¶°à¶± කිසිවක් සොය෠ගත නොහà·à¶šà·’ විය.',
'undeletebtn' => 'ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º',
-'undeletelink' => 'නරඹන්න/ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන්න',
+'undeletelink' => 'බලන්න/යලි පිහිටුවන්න',
'undeleteviewlink' => 'නරඹන්න',
'undeletereset' => 'ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶»à¶¸à·Šà¶· කරන්න',
'undeleteinvert' => 'තà·à¶»à·à¶œà·à¶±à·”ම කණපිට පෙරලන්න',
@@ -2280,19 +2339,23 @@ $1',
'month' => 'මෙම මස (හ෠ඉන් පෙර) සිට:',
'year' => 'මෙම වසර (හ෠ඉන් පෙරà·à¶­à·”à·€) සිට:',
-'sp-contributions-newbies' => 'නව ගිණුම් වලට පමණක් අදà·à¶½ දà·à¶ºà¶šà¶­à·Šà·€ පෙන්වන්න',
-'sp-contributions-newbies-sub' => 'නව ගිණුම් වලට අදà·à¶½',
-'sp-contributions-newbies-title' => 'නව ගිණුම් වලට අදà·à¶½ පරිà·à·“ලක දà·à¶ºà¶šà¶­à·Šà·€',
-'sp-contributions-blocklog' => 'à·€à·à¶»à¶« සටහන',
-'sp-contributions-deleted' => 'මකà·à¶¯à·à¶¸à·– පරිà·à·“ලක දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š',
-'sp-contributions-logs' => 'සටහන්',
-'sp-contributions-talk' => 'à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
-'sp-contributions-userrights' => 'පරිà·à·“ලක හිමිකම් කළමනà·à¶šà¶»à¶«à¶º',
-'sp-contributions-blocked-notice' => 'මෙම පරිà·à·“ලකය෠දà·à¶±à¶§ අවහිර කරනු ලà·à¶¶ තිබේ.
+'sp-contributions-newbies' => 'නව ගිණුම් වලට පමණක් අදà·à¶½ දà·à¶ºà¶šà¶­à·Šà·€ පෙන්වන්න',
+'sp-contributions-newbies-sub' => 'නව ගිණුම් වලට අදà·à¶½',
+'sp-contributions-newbies-title' => 'නව ගිණුම් වලට අදà·à¶½ පරිà·à·“ලක දà·à¶ºà¶šà¶­à·Šà·€',
+'sp-contributions-blocklog' => 'à·€à·à¶»à¶« සටහන',
+'sp-contributions-deleted' => 'මකà·à¶¯à·à¶¸à·– පරිà·à·“ලක දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š',
+'sp-contributions-uploads' => 'උඩුගත කිරීම්',
+'sp-contributions-logs' => 'සටහන්',
+'sp-contributions-talk' => 'à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
+'sp-contributions-userrights' => 'පරිà·à·“ලක හිමිකම් කළමනà·à¶šà¶»à¶«à¶º',
+'sp-contributions-blocked-notice' => 'මෙම පරිà·à·“ලකය෠දà·à¶±à¶§ අවහිර කරනු ලà·à¶¶ තිබේ.
නවතම අවහිර කිරීම් ලà¶à·” සටහන පහත යොමුවෙන් සපයනු ලà·à¶¶à·š:',
-'sp-contributions-search' => 'දà·à¶ºà¶šà¶­à·Šà·€ පිළිබඳ ගවේෂණය කරන්න',
-'sp-contributions-username' => 'පරිà·à·“ලක නà·à¶¸à¶º à·„à· IP ලිපිනය:',
-'sp-contributions-submit' => 'ගවේෂණය කරන්න',
+'sp-contributions-blocked-notice-anon' => 'මෙම අන්තර්ජà·à¶½ ලිපිනය දà·à¶±à¶§ à·€à·à¶»à¶«à¶º කොට ඇත.
+ඔබගේ උපමà·à¶±à¶ºà¶±à·Š සඳහ෠නවතම à·€à·à¶»à¶« ලà¶à·” නිවේà·à·’තය මෙහි පහත දක්ව෠ඇත:',
+'sp-contributions-search' => 'දà·à¶ºà¶šà¶­à·Šà·€ පිළිබඳ ගවේෂණය කරන්න',
+'sp-contributions-username' => 'පරිà·à·“ලක නà·à¶¸à¶º à·„à· IP ලිපිනය:',
+'sp-contributions-toponly' => 'නවතම අනුවà·à¶¯à¶ºà¶±à·Š වන සංස්කරණයන් පමණක් පෙන්වයි',
+'sp-contributions-submit' => 'ගවේෂණය කරන්න',
# What links here
'whatlinkshere' => 'සබà·à¶³à·’ පිටු',
@@ -2354,7 +2417,6 @@ $1',
'ipb-edit-dropdown' => 'සංස්කරණ à·€à·à¶»à¶« හේතූන්',
'ipb-unblock-addr' => '$1à·€à·à¶»à¶«à¶º අත්හිටුවන්න',
'ipb-unblock' => 'පරිà·à·“ලක නà·à¶¸à¶ºà¶š හ෠අන්තර්ජà·à¶½ ලිපිනයක à·€à·à¶»à¶«à¶º අත්හිටුවන්න',
-'ipb-blocklist-addr' => '$1 සඳහ෠පවතින à·€à·à¶»à¶«à¶ºà¶±à·Š නරඹන්න',
'ipb-blocklist' => 'පවතින à·€à·à¶»à¶«à¶ºà¶±à·Š නරඹන්න',
'ipb-blocklist-contribs' => '$1 සඳහ෠දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š',
'unblockip' => 'පරිà·à·“ලකයà·à¶œà·š à·€à·à¶»à¶«à¶º අත්හිටුවන්න',
@@ -2362,7 +2424,7 @@ $1',
'ipusubmit' => 'මෙම à·€à·à¶»à¶«à¶º කිරීම අත්හිටුවන්න',
'unblocked' => '[[User:$1|$1]] à·€à·à¶»à¶«à¶º අත්හිටුව෠ඇත',
'unblocked-id' => '$1 à·€à·à¶»à¶«à¶º ඉවත් කරගන්න෠ලදි',
-'ipblocklist' => 'à·€à·à¶»à¶«à¶ºà¶šà¶½ IP ලිපින හ෠පරිà·à·“ලක-නà·à¶¸',
+'ipblocklist' => 'à·€à·à¶»à¶«à¶º කල පරිà·à·“ලකයන්',
'ipblocklist-legend' => 'à·€à·à¶»à¶«à¶º කෙරුනු පරිà·à·“ලකය෠සොයන්න',
'ipblocklist-username' => 'පරිà·à·“ලක නà·à¶¸à¶º à·„à· IP ලිපිනය:',
'ipblocklist-sh-userblocks' => 'ගිණුම් à·€à·à¶»à¶«à¶ºà¶±à·Š $1',
@@ -2399,7 +2461,7 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
වර්තමà·à¶±à¶ºà·™à·„à·’ ක්â€à¶»à·’යà·à¶­à·Šà¶¸à¶š වන තහනම් à·„à· à·€à·à¶»à¶« සඳහ෠[[Special:IPBlockList|අන්තර්ජà·à¶½ ලිපිනයන් à·€à·à¶»à¶« ලà·à¶ºà·’ස්තුව]] බලන්න.',
'unblocklogentry' => '$1 à·„à·’ à·€à·à¶»à¶«à¶º අත්හිටුවන ලදි',
'block-log-flags-anononly' => 'නිර්නà·à¶¸à·’ක පරිà·à·“ලකයන් පමණි',
-'block-log-flags-nocreate' => 'ගිණුම් තà·à¶±à·“ම අක්â€à¶»à·“යකර ඇත',
+'block-log-flags-nocreate' => 'ගිණුම් තà·à¶±à·“ම අක්â€à¶»à·“ය කර ඇත',
'block-log-flags-noautoblock' => 'ස්වයංක්â€à¶»à·“ය à·€à·à¶»à¶«à¶º අක්â€à¶»à·“ය කොට ඇත',
'block-log-flags-noemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල à·€à·à¶»à¶«à¶º කොට ඇත',
'block-log-flags-nousertalk' => 'ස්වීය à·ƒà·à¶šà¶ à·Šà¶¡à· පිටුව සංස්කරණය කල නොහà·à¶š',
@@ -2432,6 +2494,8 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
ඔබ හට ගිණුමක් තà·à¶±à·’ය නොහà·à¶š',
'cant-block-while-blocked' => 'ඔබ à·€à·à¶»à¶«à¶ºà¶§ ලක්ව සිටින අතරතුර අනෙක් පරිà·à·“ලකයන් à·€à·à¶»à¶«à¶º කිරීමට ඔබ හට නොහà·à¶š.',
'cant-see-hidden-user' => 'අවහිර කිරීමට උත්සà·à·„ කරන පරිà·à·“ලකය෠දà·à¶±à¶§à¶¸à¶­à·Š අවහිර කර සඟව෠ඇත.පරිà·à·“ලක à·ƒà·à¶Ÿà·€à·”ම් අයිතිය ඔබ සතු නොවන බà·à·€à·’න් ,ඔබට පරිà·à·“ලක අවහිරය නà·à¶»à¶¹à·“මට හ෠සංස්කරණය කිරීමට නොහà·à¶šà·’ය.',
+'ipbblocked' => 'ඔබද à·€à·à¶»à¶«à¶º කොට ඇති බà·à·€à·’න් අනෙකුත් පරිà·à·“ලකයන් à·€à·à¶»à¶«à¶º කිරීම à·„à· à·€à·à¶»à¶«à¶ºà·™à¶±à·Š මුදවීම ඔබ හට කල නොහà·à¶š',
+'ipbnounblockself' => 'ඔබ විසින්ම ඔබගේ à·€à·à¶»à¶«à¶ºà·™à¶±à·Š බà·à·„à·à¶» වීමට ඉඩදෙනු නොලà·à¶¶à·š',
# Developer tools
'lockdb' => 'දත්ත-ගබඩà·à·€ අවුරන්න',
@@ -2470,6 +2534,18 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'''අවවà·à¶¯à¶ºà¶ºà·’!'''
මෙම වෙනස ජනප්â€à¶»à·’ය පිටුවකට උග්â€à¶» හ෠අනපේක්â€à·‚ිත වෙනස්කමක් විය à·„à·à¶š;
බිඳක් නà·à·€à·à¶­à·“ මෙහි ප්â€à¶»à¶­à·’විපà·à¶š සිතà·à¶¶à¶½à¶±à·Šà¶±.",
+'movepagetext-noredirectfixer' => "පහත ආකෘතිය භà·à·€à·’ත෠කිරීමෙන්, එහි සියළු ඉතිහà·à·ƒà¶º නව නà·à¶¸à¶ºà¶§ අනුයුක්ත කරමින්, පිටුවක නම-වෙනස් කිරීම සිදුවේ.
+නව නà·à¶¸à¶º වෙත යළි-යොමු පිටුවක් බවට පà·à¶»à·à¶«à·’ නà·à¶¸à¶º පත් වෙයි.
+ආදිමය නà·à¶¸à¶º වෙත ස්වයංක්â€à¶»à·“යව එල්ල වන යළි-යොමු යà·à·€à¶­à·Šà¶šà·à¶½à·“න කිරීම් ඔබට සිදු කල à·„à·à¶š.
+එසේ සිදු කිරීමට ඔබ නොරිසි නම්, [[Special:DoubleRedirects|ද්විත්ව]] à·„à· [[Special:BrokenRedirects|භින්න යළි-යොමු වීම්]] පරික්ෂ෠කර බà·à¶½à·“මට යුහුසුළු වන්න.
+නියමිත යොමු කර෠සබà·à¶³à·’යන් දිගටම එල්ල වන බව සහතික කිරීම ඔබගේ වගකීමකි.
+
+නව නà·à¶¸à¶º සහිත පිටුවක් දà·à¶±à¶§à¶¸à¶­à·Š තිබේ නම්, එය හිස් නම් හ෠යළි-යොමුවක් හ෠එහි පූර්ව සංස්කරණ ඉතිහà·à·ƒà¶ºà¶šà·Š නොමà·à¶­à·’ නම් මිස, පිටුව ගෙනයෑම සිදු ''නොකරන''' බව සලකන්න.
+මෙහි අරුත වන්නේ, ඔබ විසින් අත්වà·à¶»à·à¶¯à·Šà¶¯à¶šà·Š සිදුවුනි නම්, නම වෙනස් කල යම් පිටුවක නම â€à·€à·™à¶±à·ƒà·Š කිරීමට පà·à·€à·à¶­à·’ පිටුවට ආපසු නම වෙනස් කල à·„à·à¶šà·’ බවත්, එනමුදු දà·à¶±à¶§ පවතින පිටුවක් අධිලිවීමකට ලක් කිරීම සිදු කල නොහà·à¶šà·’ බවත්ය.
+
+'''අවවà·à¶¯à¶ºà¶ºà·’!'''
+මෙම වෙනස ජනප්â€à¶»à·’ය පිටුවකට උග්â€à¶» හ෠අනපේක්â€à·‚ිත වෙනස්කමක් විය à·„à·à¶š;
+බිඳක් නà·à·€à·à¶­à·“ මෙහි ප්â€à¶»à¶­à·’විපà·à¶š සිතà·à¶¶à¶½à¶±à·Šà¶±",
'movepagetalktext' => "එය සමග ආà·à·Šâ€à¶»à·’ත à·ƒà·à¶šà¶ à·Šà¶¡à· පිටුව ස්වයංක්â€à¶»à·“ය ලෙස ගෙනයà·à¶¸ වළක්වන '''à·€à·à·…à·à·„ීම්:'''
*නව පිටු නà·à¶¸à¶º යටතේ, හිස්-නොවන à·ƒà·à¶šà¶ à·Šà¶¡à· පිටුවක් දà·à¶±à¶§à¶¸à¶­à·Š පà·à·€à·à¶­à·“ම, à·„à·
*පහත කොටුව ඔබ විසින් නොතේරූ නිසà·à·€à·™à¶±à·Š.
@@ -2504,7 +2580,7 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'movepage-page-unmoved' => ' $1 පිටුව $2 වෙත ගෙනයෑම සිදුකල නොහà·à¶šà·’ විය.',
'movepage-max-pages' => '{{PLURAL:$1|එක් පිටුවක|පිටු $1 ක}} උපරිමයකට යටත්ව ගෙනයෑම සිදුකර ඇති අතර ස්වයංක්â€à¶»à·“ය ලෙස ගෙනයෑම තවදුරටත් සිදු නොවනු ඇත.',
'1movedto2' => '[[$1]] යන්න [[$2]] වෙත ගෙන යන ලදි',
-'1movedto2_redir' => 'යළි-යොමුකිරීමක් මගින් [[$2]] වෙත [[$1]] ගෙන යන ලදි',
+'1movedto2_redir' => 'ආපසු හරව෠යà·à·€à·“මක් ඔස්සේ [[$2]] වෙත [[$1]] ගෙන යන ලදි',
'move-redirect-suppressed' => 'යළි-යොමුකිරීම් යටපත් කෙරිණි',
'movelogpage' => 'ගෙනයෑම් සටහන',
'movelogpagetext' => 'පහත දà·à¶šà·Šà·€à·™à¶±à·Šà¶±à·š ගෙනගිය පිටු ලà·à¶ºà·’ස්තුවකි.',
@@ -2527,6 +2603,7 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'immobile-source-page' => 'මෙම පිටුව ගෙනයà·à·„à·à¶šà·Šà¶šà¶šà·Š නොවේ.',
'immobile-target-page' => 'එම අන්ත à·à·“ර්ෂයට ගෙන යෑම කල නොහà·à¶š.',
'imagenocrossnamespace' => 'ගොනුවක්, ගොනුවක්-නොවන නà·à¶¸à¶…වකà·à·à¶ºà¶šà¶§ ගෙනයෑම කල නොහà·à¶š',
+'nonfile-cannot-move-to-file' => 'ගොනුවක්-නොවන්න ගොනු නà·à¶¸à¶…වකà·à·à¶ºà¶§ ගෙනයෑම කල නොහà·à¶š',
'imagetypemismatch' => 'නව ගොනු ප්â€à¶»à·ƒà¶»à·Šà¶¢à¶±à¶º එහි වර්ගය හ෠නොගà·à¶½à¶´à·š',
'imageinvalidfilename' => 'ඉලක්කගත ගොනු නà·à¶¸à¶º අනීතිකයි',
'fix-double-redirects' => 'මුල් à·à·“ර්ෂයට එල්ලවන කිසියම් යළි-යොමුවීම් උඩුගත කරන්න',
@@ -2602,11 +2679,12 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'import-interwiki-namespace' => 'ගමනà·à¶±à·Šà¶­ නà·à¶¸à¶…වකà·à·à¶º:',
'import-upload-filename' => 'ගොනු-නà·à¶¸à¶º:',
'import-comment' => 'පරිකථනය:',
-'importtext' => '[[Special:Export|නිර්යà·à¶­ උපයුක්තය]] භà·à·€à·’ත෠කරමින් ගොනුව මූල විකියෙන් නිර්යà·à¶­ කිරීමට කà·à¶»à·”ණික වන්න.
-ඔය ඔබගේ පරිගණකයෙහි සුරà·à¶š මෙහි උඩුගත කරන්න.',
+'importtext' => 'කරුණà·à¶šà¶» [[Special:Export|නිර්යà·à¶­ උපයුක්තය]] භà·à·€à·’ත කරමින් මූලà·à·à·Šâ€à¶» විකිය මගින් ගොනුව නිර්යà·à¶­ කරන්න .
+එය ඔබේ පරිගණකයෙහි සුරක්ෂිත කොට මෙතà·à¶±à¶§ උඩුගත කරන්න.',
'importstart' => 'පිටු ආයà·à¶­ කරමින්...',
'import-revision-count' => ' {{PLURAL:$1|සංà·à·à¶°à¶±à¶º|සංà·à·à¶°à¶± $1 ක්}}',
'importnopages' => 'ආයà·à¶­ කිරීමට කිසිදු පිටුවක් නොමà·à¶­.',
+'imported-log-entries' => '{{PLURAL:$1|එක් ලà¶à·” සටහනක්|ලà¶à·” සටහන් $1 ක්}} ආනයනය කෙරිණි.',
'importfailed' => 'ආයà·à¶­ කිරීම අසà·à¶»à·Šà¶®à¶šà¶ºà·’: <nowiki>$1</nowiki>',
'importunknownsource' => 'අඥà·à¶­ ආයà·à¶­ මූලà·à·à·Šâ€à¶» වර්ගය',
'importcantopen' => 'ආයà·à¶­ ගොනුව විවෘත කිරීමට නොහà·à¶šà·’ විය',
@@ -2647,7 +2725,7 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'tooltip-pt-preferences' => 'මගේ අභිරුචි',
'tooltip-pt-watchlist' => 'වෙනස්වීම් සිදුවී තිබේදà·à¶ºà·’ යන්න පිලිබඳව ඔබගේ විමසුමට ලක්ව ඇති පිටු ලà·à¶ºà·’ස්තුව',
'tooltip-pt-mycontris' => 'ඔබගේ දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š ලà·à¶ºà·’ස්තුවâ€',
-'tooltip-pt-login' => 'එය අවà·à·Šâ€à¶ºâ€à¶ºà·™à¶±à·Š කල යුත්තක් â€à¶±à·œà·€à·”නද, ප්â€à¶»à·€à·’ෂ්ට වීම සඳහ෠ඔබ ධෛර්යමත් කරනු ලà·à¶¶à·š.',
+'tooltip-pt-login' => 'ප්â€à¶»à·€à·’ෂ්ට වීම සදහ෠ඔබට අනුබල දෙයි; එසේ වුවත්, එය අනුගම්â€à¶º නොවේ',
'tooltip-pt-anonlogin' => 'එය අවà·à·Šâ€à¶ºâ€à¶ºà·™à¶±à·Š කල යුත්තක් â€à¶±à·œà·€à·”නද, ප්â€à¶»à·€à·’ෂ්ට වීම සඳහ෠ඔබ ධෛර්යමත් කරනු ලà·à¶¶à·š.',
'tooltip-pt-logout' => 'නික්මීම',
'tooltip-ca-talk' => 'අන්තර්ගත පිටුව පිළිබඳ à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
@@ -2664,17 +2742,17 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'tooltip-ca-move' => 'මෙම පිටුව ගෙන යන්න',
'tooltip-ca-watch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
'tooltip-ca-unwatch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙන් ඉවත් කරන්න',
-'tooltip-search' => '{{SITENAME}} ගවේෂණය',
+'tooltip-search' => '{{SITENAME}} ගවේෂණය කරන්න',
'tooltip-search-go' => 'මෙම නà·à¶¸à¶º එලෙසම ඇති පිටුවක් ඇත්නම් එය වෙත යන්න',
'tooltip-search-fulltext' => 'මෙම පෙළ අඩංගු පිටු ගවේෂණය කරන්න',
-'tooltip-p-logo' => 'මුල් පිටුව',
+'tooltip-p-logo' => 'මුල් පිටුව වෙත ගමන් කරන්න',
'tooltip-n-mainpage' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
'tooltip-n-mainpage-description' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
-'tooltip-n-portal' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’යට අදà·à·…à·€, ඔබට සිදුකල à·„à·à¶šà·’ දෑ, අවà·à·Šâ€à¶º දෑ සොය෠ගත à·„à·à¶šà·’ අයුරු, යනà·à¶¯à·“ à·€à·à¶¯à¶œà¶­à·Š තොරතුරු',
+'tooltip-n-portal' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිළිබඳ, ඔබට කල à·„à·à¶šà·Šà¶šà·š කුමක්ද, තොරතුරු සොයà·à¶œà¶­ à·„à·à¶šà·Šà¶šà·š කොතà·à¶±à¶¯',
'tooltip-n-currentevents' => 'කà·à¶½à·“න සිදුවීම් පිළිබඳ පසුබිම් තොරතුරු සොය෠දà·à¶±à¶œà¶±à·Šà¶±',
'tooltip-n-recentchanges' => 'විකියෙහි මෑත වෙනස්වීම් දà·à¶šà·Šà·€à·™à¶± ලà·à¶ºà·’ස්තුවක්.',
'tooltip-n-randompage' => 'අහඹු පිටුවක් ප්â€à¶»à·€à·šà·à¶±à¶º කරන්න',
-'tooltip-n-help' => 'තොරතුරු සොයà·à¶œà¶­à·„à·à¶šà·’ තà·à¶±.',
+'tooltip-n-help' => 'සොය෠දà·à¶±à¶œà¶­ à·„à·à¶šà·’ තà·à¶±.',
'tooltip-t-whatlinkshere' => 'මෙය හ෠සබà·â€à¶³à·™à¶± සියළු විකි පිටු ලà·à¶ºà·’ස්තුව',
'tooltip-t-recentchangeslinked' => 'මෙම පිටුව හ෠සබà·à¶³à·’ පිටුවල â€à¶±à·€ වෙනස්වීම්',
'tooltip-feed-rss' => 'මෙම පිටුව සඳහ෠RSS පà·à·‚කය',
@@ -2706,6 +2784,8 @@ $1 දà·à¶±à¶§à¶¸à¶­à·Š à·€à·à¶»à¶«à¶º කොට ඇත.
'tooltip-rollback' => '"ප්â€à¶»à¶­à·’වර්තනය" එක් වරක් ක්ලික් කිරීමෙහි ප්â€à¶»à¶­à·’ඵලය වනුයේ, සංස්කරණය(න්) ප්â€à¶»à¶­à·’වර්තනය වී, අවසන් දà·à¶ºà¶šà¶ºà· විසින් à·ƒà·à¶¯à·– මෙම පිටුව වෙත පිටුව ගෙන ඒමයි.',
'tooltip-undo' => '"අහà·à·ƒà·’" මගින් සිදුකෙරෙනුයේ මෙම සංස්කරණය ප්â€à¶»à¶­à·’වර්තනය කොට, සංස්කරණ-ආකෘතිය, පෙරදසුන් මà·à¶¯à·’ලියෙහි විවෘත කිරීමයි.
à·ƒà·à¶»à·à¶‚à·à¶ºà·™à·„à·’, මේ පිළිබඳව හේතුවක් පල කිරීමට, ඔබට ඉඩ à·ƒà·à¶½à·ƒà·š.',
+'tooltip-preferences-save' => 'අභිරුචීන් සුරකින්න',
+'tooltip-summary' => 'කෙටි à·ƒà·à¶»à·à¶‚à·à¶ºà¶šà·Š ඇතුළත් කරන්න',
# Stylesheets
'common.css' => '/* මෙහි CSS බහà·à¶½à·“ම සියළු ඡවියයන් භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
@@ -2825,14 +2905,17 @@ $1',
'imagemaxsize' => "රූප ප්â€à¶»à¶¸à·à¶« සීමà·à·€:<br />''(ගොනු විස්තර පිටු සඳහà·)''",
'thumbsize' => 'සිඟිති-රූපයේ විà·à·à¶½à¶­à·Šà·€à¶º:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|පිටුව|පිටු}}',
-'file-info' => '(ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $1, MIME වර්ගය: $2)',
-'file-info-size' => '($1 × $2 පික්සල, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3, MIME à·à·›à¶½à·’ය: $4)',
+'file-info' => 'ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $1, MIME වර්ගය: $2',
+'file-info-size' => '$1 × $2 පික්සල, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3, MIME à·à·›à¶½à·’ය: $4',
'file-nohires' => '<small>මෙයට ඉහල විසර්ජනයක්(resolution) දක්ව෠එළඹිය නොහà·à¶š.</small>',
-'svg-long-desc' => '(SVG ගොනුව, නà·à¶¸à¶¸à·à¶­à·Šâ€à¶»à·’කව $1 × $2 පික්සල්, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3)',
+'svg-long-desc' => 'SVG ගොනුව, නà·à¶¸à¶¸à·à¶­à·Šâ€à¶»à·’කව $1 × $2 පික්සල්, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3',
'show-big-image' => 'පූර්ණ විභේදනය (Full resolution)',
'show-big-image-thumb' => '<small>පෙර නà·à¶»à¶¹à·”මෙහි විà·à·à¶½à¶­à·Šà·€à¶º: $1 × $2 පික්සල</small>',
'file-info-gif-looped' => 'වලිත',
'file-info-gif-frames' => '$1 {{PLURAL:$1රà·à¶¸à·”à·€|රà·à¶¸à·”}}',
+'file-info-png-looped' => 'ලුපගත වී ඇත',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|එක් වරක්| $1 වරක්}} ප්â€à¶»à¶­à·’à·€à·à¶¯à¶±à¶º කෙරිණි',
+'file-info-png-frames' => '$1 {{PLURAL:$1|රà·à¶¸à·”à·€|රà·à¶¸à·”}}',
# Special:NewFiles
'newimages' => 'නව ගොනු ගà·à¶½à¶»à·’ය',
@@ -2951,8 +3034,8 @@ Variants for Chinese language
'exif-colorspace' => 'වර්ණ අවකà·à·à¶º',
'exif-componentsconfiguration' => 'එක් එක් සංරචකයේ අර්ථය',
'exif-compressedbitsperpixel' => 'රූප සම්පීඩන මà·à¶¯à·’ලිය',
-'exif-pixelydimension' => 'නීතිකරූප පළල',
-'exif-pixelxdimension' => 'නීතික රූප උස',
+'exif-pixelydimension' => 'ප්â€à¶»à¶­à·’බිම්බයෙහි පළල',
+'exif-pixelxdimension' => 'ප්â€à¶»à¶­à·’බිම්බයෙහි උස',
'exif-makernote' => 'නිෂ්පà·à¶¯à¶šà¶œà·š සටහන්',
'exif-usercomment' => 'පරිà·à·“ලක පරිකථනයන්',
'exif-relatedsoundfile' => 'සහසම්බන්ධිත à·à·Šâ€à¶»à·€à·Šâ€à¶º ගොනුව',
@@ -2969,9 +3052,9 @@ Variants for Chinese language
'exif-spectralsensitivity' => 'වර්ණà·à·€à¶½à·“ සංවේදිතà·à·€à¶º',
'exif-isospeedratings' => 'ISO වේග ඇගà·à¶ºà·”ම',
'exif-oecf' => 'ප්â€à¶»à¶šà·à·à·€à·’ද්â€à¶ºà·”ත් අනුවර්තන à·ƒà·à¶°à¶šà¶º',
-'exif-shutterspeedvalue' => 'ෂටර වේගය',
-'exif-aperturevalue' => 'විවරය',
-'exif-brightnessvalue' => 'දීප්තතà·à·€à¶º',
+'exif-shutterspeedvalue' => 'APEX à·à¶§à¶» වේගය',
+'exif-aperturevalue' => 'APEX විවරය',
+'exif-brightnessvalue' => 'APEX දීප්තිය',
'exif-exposurebiasvalue' => 'නිරà·à·€à¶»à¶« නà·à¶¹à·”රුව',
'exif-maxaperturevalue' => 'උපරිම භූමි විවරය',
'exif-subjectdistance' => 'වස්තු දුර',
@@ -3036,6 +3119,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'GPS සරියෙහි නම',
'exif-gpsdatestamp' => 'GPS දිනය',
'exif-gpsdifferential' => 'GPS ආන්තරීක à·à·à¶°à¶±à¶º',
+'exif-objectname' => 'කෙටි මà·à¶­à·˜à¶šà·à·€',
# EXIF attributes
'exif-compression-1' => 'අසංක්ෂිප්ත',
@@ -3137,7 +3221,7 @@ Variants for Chinese language
'exif-sensingmethod-7' => 'ත්â€à¶»à·’රේඛීය සංවේදකය',
'exif-sensingmethod-8' => 'වර්ණ අනුක්â€à¶»à¶¸à·’ක රේඛීය සංවේදකය',
-'exif-filesource-3' => 'DSC (ආන්තර පරිලà·à¶šà¶± වර්ණමිතිය)',
+'exif-filesource-3' => 'සංඛ්â€à¶ºà·à¶‚ක නිà·à·Šà¶ à¶½ කà·à¶¸à¶»à·à·€',
'exif-scenetype-1' => 'සෘජු ලෙස ඡà·à¶ºà¶»à·–පගතකල රූපයන්',
@@ -3215,31 +3299,31 @@ Variants for Chinese language
'limitall' => 'සියල්ලම',
# E-mail address confirmation
-'confirmemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරු කරන්න',
-'confirmemail_noemail' => 'ඔබගේ [[Special:Preferences|පරිà·à·“ලක අභිරුචියන්]] à·„à·’ නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් ඔබ විසින් පිහිටුව෠නොමà·à¶­.',
-'confirmemail_text' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š අංගයන් භà·à·€à·’ත෠කිරීමට පෙර ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය නීතිකරණය කල යුතු බවට {{SITENAME}} අවධà·à¶»à¶«à¶º කරයි.
+'confirmemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරු කරන්න',
+'confirmemail_noemail' => 'ඔබගේ [[Special:Preferences|පරිà·à·“ලක අභිරුචියන්]] à·„à·’ නීතික විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයක් ඔබ විසින් පිහිටුව෠නොමà·à¶­.',
+'confirmemail_text' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š අංගයන් භà·à·€à·’ත෠කිරීමට පෙර ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය නීතිකරණය කල යුතු බවට {{SITENAME}} අවධà·à¶»à¶«à¶º කරයි.
ඔබගේ ලිපිනයට තහවුරුකරණ තà·à¶´à·‘ලක් යවනු සඳහ෠පහත බොත්තම සක්â€à¶»à·’යනය කරන්න.
මෙම තà·à¶´à·‘ල කේතයක් අඩංගු සබà·à¶³à·’යක් සහිත වනු ඇත;
ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය නීතික බව තහවුරු කරනු වස් මෙම සබà·à¶³à·’ය ඔබගේ බ්â€à¶»à·€à·”සරයෙහි ප්â€à¶»à·€à·šà·à¶±à¶º කරන්න.',
-'confirmemail_pending' => 'තහවුරු කිරීමේ කේතයක් දà·à¶±à¶§à¶¸à¶­à·Š ඔබට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š කොට ඇත;
+'confirmemail_pending' => 'තහවුරු කිරීමේ කේතයක් දà·à¶±à¶§à¶¸à¶­à·Š ඔබට විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š කොට ඇත;
ඔබ විසින් ගිණුම තà·à¶±à·”වේ මෑතකදී නම්, නව තේකයක් ඉල්ල෠සිටීමට පෙර එය ඔබ වෙත ලඟ෠වීම සඳහ෠විනà·à¶©à·’ කිහිපයක් රà·à¶³à·“ සිටින්න.',
-'confirmemail_send' => 'තහවුරුකිරීමේ කේතයක් තà·à¶´à·à¶½à·Š කරන්න',
-'confirmemail_sent' => 'තහවුරුකිරීමේ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යà·à·€à·’ණි.',
-'confirmemail_oncreate' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයට තහවුරුකිරීමේ කේතයක් යවන ලදි.
+'confirmemail_send' => 'තහවුරුකිරීමේ කේතයක් තà·à¶´à·à¶½à·Š කරන්න',
+'confirmemail_sent' => 'තහවුරුකිරීමේ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යà·à·€à·’ණි.',
+'confirmemail_oncreate' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයට තහවුරුකිරීමේ කේතයක් යවන ලදි.
ප්â€à¶»à·€à·’ෂ්ට වීමට මෙම කේතය අනවà·à·Šâ€à¶º නමුදු, විකියෙහි විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š සම්බන්ධ අංගයන් කිසිවක් හ෠සක්â€à¶»à·“ය කිරීමට පෙර මෙය ඉදිරිපත් කල යුතු වේ.',
-'confirmemail_sendfailed' => 'ඔබගේ තහවුරුකිරීමේ තà·à¶´à·‘ල යà·à·€à·“මට {{SITENAME}} හට නොහà·à¶šà·’ විය.
+'confirmemail_sendfailed' => 'ඔබගේ තහවුරුකිරීමේ තà·à¶´à·‘ල යà·à·€à·“මට {{SITENAME}} හට නොහà·à¶šà·’ විය.
අනීතික අක්ෂර තිබේදà·à¶ºà·’ ඔබගේ විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය පරික්ෂ෠කර බලන්න.
තà·à¶´à·à¶½à·Šà¶šà¶»à·” ආපසු දà·à¶±à·”ම්දුන්නේ: $1',
-'confirmemail_invalid' => 'තහවුරුකරණ කේතය අනීතිකයි.
+'confirmemail_invalid' => 'තහවුරුකරණ කේතය අනීතිකයි.
කේතය කල් ඉකුත්වූ එකක් විය à·„à·à¶š.',
-'confirmemail_needlogin' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකිරීමට ඔබ $1 වී සිටිය යුතුය.',
-'confirmemail_success' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකොට ඇත.
+'confirmemail_needlogin' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකිරීමට ඔබ $1 වී සිටිය යුතුය.',
+'confirmemail_success' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකොට ඇත.
ඔබහට දà·à¶±à·Š [[Special:UserLogin|පුවිෂ්ට වී]] විකිය භුක්තිවිඳිය à·„à·à¶š.',
-'confirmemail_loggedin' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය දà·à¶±à·Š තහවුරුකොට ඇත.',
-'confirmemail_error' => 'ඔබගේ තහවුරුකිරීම සුරà·à¶šà·“මට උත්සà·à·„ කිරීමේදී යම් ගà·à¶§à·…ුවක් පà·à¶±à¶±à·à¶œà·”ණි.',
-'confirmemail_subject' => '{{SITENAME}} විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකිරීම',
-'confirmemail_body' => 'යම් අයෙකු, අන්තර්ජà·à¶½ ලිපිනය $1 මගින්, සමහර විට ඔබ,
+'confirmemail_loggedin' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය දà·à¶±à·Š තහවුරුකොට ඇත.',
+'confirmemail_error' => 'ඔබගේ තහවුරුකිරීම සුරà·à¶šà·“මට උත්සà·à·„ කිරීමේදී යම් ගà·à¶§à·…ුවක් පà·à¶±à¶±à·à¶œà·”ණි.',
+'confirmemail_subject' => '{{SITENAME}} විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකිරීම',
+'confirmemail_body' => 'යම් අයෙකු, අන්තර්ජà·à¶½ ලිපිනය $1 මගින්, සමහර විට ඔබ,
{{SITENAME}} à·„à·’ "$2" නමà·à¶­à·’ ගිණුමක් මෙම විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය සහිතව ලියà·à¶´à¶¯à·’ංචි කර ඇත .
මෙම ගිණුම ඇත්ත à·€à·à¶ºà·™à¶±à·Šà¶¸ ඔබගේ බව සහතික කිරීමට à·„à· {{SITENAME}} à·„à·’,
@@ -3253,8 +3337,36 @@ $3
$5
මෙම සහතික කිරීමේ කේතයෙහි වලංගු බව $4 වන විට ඉකුත් වේ.',
-'confirmemail_invalidated' => 'විද්â€à¶ºà·”ත්-ගà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකිරීම අවලංගු කෙරිණි',
-'invalidateemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š තහවුරුකිරීම අවලංගු කරන්න',
+'confirmemail_body_changed' => 'යම් අයෙකු, අන්තර්ජà·à¶½ ලිපිනය $1 මගින්, සමහර විට ඔබ,
+{{SITENAME}} à·„à·’ "$2" නමà·à¶­à·’ ගිණුමෙහි විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය වෙනස් කර ඇත .
+
+මෙම ගිණුම ඇත්ත à·€à·à¶ºà·™à¶±à·Šà¶¸ ඔබගේ බව සහතික කිරීමට à·„à· {{SITENAME}} à·„à·’,
+විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š විà·à·šà·‚à·à¶‚ග සක්â€à¶»à·“යනය කරනු වස්, ඔබගේ බ්â€à¶»à·€à·”සරයෙහි පහත සබà·à¶³à·’ය විවෘත කරන්න:
+
+$3
+
+මෙම ගිණුම, ඔබ හට අයක් *නොවේ* නම්, මෙම සබà·à¶³à·’ය ඔස්සේ සපà·à¶¸à·’ණ
+විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපින සහතික කිරීම අත්හරින්න:
+
+$5
+
+මෙම සහතික කිරීමේ කේතයෙහි වලංගු බව $4 වන විට ඉකුත් වේ',
+'confirmemail_body_set' => 'යමෙක්, සමහරවිට ඔබ, $1 යන අයිපී ලිපිනය මගින්,
+has set the e-mail address of the account "$2" to this address on {{SITENAME}}.
+
+To confirm that this account really does belong to you and reactivate
+e-mail features on {{SITENAME}}, open this link in your browser:
+
+$3
+
+If the account does *not* belong to you, follow this link
+to cancel the e-mail address confirmation:
+
+$5
+
+This confirmation code will expire at $4.',
+'confirmemail_invalidated' => 'විද්â€à¶ºà·”ත්-ගà·à¶´à·à¶½à·Š ලිපිනය තහවුරුකිරීම අවලංගු කෙරිණි',
+'invalidateemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š තහවුරුකිරීම අවලංගු කරන්න',
# Scary transclusion
'scarytranscludedisabled' => '[අන්තර්විකී අන්තඃගතකිරීම් අක්â€à¶»à·“ය කොට ඇත]',
@@ -3296,6 +3408,7 @@ $1',
'table_pager_first' => 'පළමු පිටුව',
'table_pager_last' => 'අවසà·à¶± පිටුව',
'table_pager_limit' => 'එක් පිටුවක් වෙනුවෙන් අයිතම $1 පෙන්වන්න',
+'table_pager_limit_label' => 'එක් පිටුවකට අයිතම:',
'table_pager_limit_submit' => 'යන්න',
'table_pager_empty' => 'ප්â€à¶»à¶­à·’ඵල නොමà·à¶­',
@@ -3419,6 +3532,7 @@ $1',
'version-specialpages' => 'විà·à·šà·‚ පිටු',
'version-parserhooks' => 'ව්â€à¶ºà·à¶šà¶»à¶« විග්â€à¶»à·„ක හසුරු',
'version-variables' => 'විචල්â€à¶ºà¶ºà¶±à·Š',
+'version-skins' => 'ඡවිය',
'version-other' => 'වෙනත්',
'version-mediahandlers' => 'මà·à¶°à·Šâ€à¶º හසුරුවනය',
'version-hooks' => 'හසුරු',
@@ -3430,6 +3544,13 @@ $1',
'version-hook-subscribedby' => 'දà·à¶ºà¶šà·€à·“ ඇත්තේ',
'version-version' => '(අනුවà·à¶¯à¶º $1)',
'version-license' => 'බලපත්â€à¶»à¶º',
+'version-poweredby-credits' => "මෙම විකිය '''[http://www.mediawiki.org/ MediaWiki]''' මගින් බලගන්ව෠ඇත, copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'අනෙකුත්',
+'version-license-info' => 'MediaWiki යනු නිදහස් මෘදුකà·à¶‚ගයකි; නිදහස් මෘදුකà·à¶‚ග පදනමේ (Free Software Foundation) à·„à·’ GNU General Public License නම් බලපත්â€à¶»à¶ºà·š වගන්තිවලට අනුව ඔබට එය නà·à·€à¶­ බෙදà·à·„à·à¶»à·“ම සහ/හ෠සංස්කරණය කළ à·„à·à¶š; ඒ, එම බලපත්â€à¶»à¶ºà·š 2වන à·„à· (ඔබට කà·à¶¸à¶­à·’ නම්) ඉන්පසු එන සංස්කරණයකට අනුවය.
+
+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 වෙත ලියන්න à·„à· [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html එය මà·à¶»à·Šà¶œà¶œà¶­à·€ කියවන්න].',
'version-software' => 'ස්ථà·à¶´à·’ත මෘදුකà·à¶‚ග',
'version-software-product' => 'නිෂ්පà·à¶¯à¶±à¶º',
'version-software-version' => 'අනුවà·à¶¯à¶º',
@@ -3500,6 +3621,15 @@ $1',
'tags-edit' => 'සංස්කරණය',
'tags-hitcount' => '{{PLURAL:$1|වෙනස්කම|වෙනස්කම් $1 }}',
+# Special:ComparePages
+'comparepages' => 'පිටු සසඳන්න',
+'compare-selector' => 'පිටුවේ සංà·à·à¶°à¶± සසඳන්න',
+'compare-page1' => 'පිටුව 1',
+'compare-page2' => 'පිටුව 2',
+'compare-rev1' => '1වන සංà·à·à¶°à¶±à¶º',
+'compare-rev2' => '2වන සංà·à·à¶°à¶±à¶º',
+'compare-submit' => 'සසඳන්න',
+
# Database error messages
'dberr-header' => 'මෙම විකියෙහි ගà·à¶§à·…ුවක් පවතියි',
'dberr-problems' => 'සමà·à·€à¶±à·Šà¶±! මෙම අඩවිය තà·à¶šà·Šà·‚ණික ගà·à¶§à·…à·” අත්දකියි.',
@@ -3516,8 +3646,13 @@ $1',
'htmlform-float-invalid' => 'ඔබ ඉදිරිපත් කල අගය සංඛ්â€à¶ºà·à·€à¶šà·Š නොවේ.',
'htmlform-int-toolow' => 'ඔබ විසින් හුවà·à¶¯à¶šà·Šà·€à· ඇති අගය, අවම අගය වන $1 ට වඩ෠අඩුය',
'htmlform-int-toohigh' => 'ඔබ විසින් හුවà·à¶¯à¶šà·Šà·€à· ඇති අගය, උපරිම අගය වන $1 ට වඩ෠වà·à¶©à·’ය',
+'htmlform-required' => 'මෙම අගය ඇවà·à·ƒà·’ය',
'htmlform-submit' => 'යොමුකරන්න',
'htmlform-reset' => 'වෙනස්කිරීම් අහà·à·ƒà·’කරන්න',
'htmlform-selectorother-other' => 'වෙනත්',
+# SQLite database support
+'sqlite-has-fts' => '$1 සම්පූර්ණ-පෙළ සෙවුම් සහය සමග',
+'sqlite-no-fts' => '$1 සම්පූර්ණ-පෙළ සෙවුම් සහය රහිතව',
+
);
diff --git a/languages/messages/MessagesSimple.php b/languages/messages/MessagesSimple.php
index dd4d376b..8de0e3ad 100644
--- a/languages/messages/MessagesSimple.php
+++ b/languages/messages/MessagesSimple.php
@@ -1,12 +1,20 @@
<?php
-/** English
+/** Simple English (Simple English)
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
*
* @ingroup Language
* @file
- * @comment dummy language file. Falls back to 'en'. Needed for http://simple.wikipedia.org.
+ *
+ * @author Hydra
*/
$fallback = 'en';
+
+$messages = array(
+# Vector skin
+'vector-view-create' => 'Start',
+'vector-view-edit' => 'Change',
+
+);
diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php
index 616e90e8..08f2b9c3 100644
--- a/languages/messages/MessagesSk.php
+++ b/languages/messages/MessagesSk.php
@@ -291,8 +291,7 @@ $messages = array(
'tog-editsection' => 'Umožniť úpravu sekcie pomocu odkazov [upraviť]',
'tog-editsectiononrightclick' => 'UmožniÅ¥ upravovaÅ¥ sekcie po kliknutí pravým tlaÄidlom na nadpisy sekcií (JavaScript)',
'tog-showtoc' => 'Zobrazovať obsah (pre stránky s viac ako 3 nadpismi)',
-'tog-rememberpassword' => 'ZapamätaÅ¥ si heslo na tomto poÄítaÄi',
-'tog-editwidth' => 'Rozšíriť textové pole na úpravy na celú obrazovku',
+'tog-rememberpassword' => 'ZapamätaÅ¥ si prihlásenie na tomto poÄítaÄi (najviac $1 {{PLURAL:$1|deň|dni|dní}})',
'tog-watchcreations' => 'Pridávať stránky, ktoré vytvorím, automaticky medzi sledované',
'tog-watchdefault' => 'Pridávať stránky, ktoré upravujem, automaticky medzi sledované',
'tog-watchmoves' => 'Pridávať stránky, ktoré presuniem, do môjho zoznamu sledovaných',
@@ -439,31 +438,21 @@ $messages = array(
'faqpage' => 'Project:Často kladené otázky',
# Vector skin
-'vector-action-addsection' => 'Pridať tému',
-'vector-action-delete' => 'Zmazať',
-'vector-action-move' => 'Presunúť',
-'vector-action-protect' => 'Zamknúť',
-'vector-action-undelete' => 'Obnoviť',
-'vector-action-unprotect' => 'Odomknúť',
-'vector-namespace-category' => 'Kategória',
-'vector-namespace-help' => 'Pomocník',
-'vector-namespace-image' => 'Súbor',
-'vector-namespace-main' => 'Stránka',
-'vector-namespace-media' => 'Stránka súboru',
-'vector-namespace-mediawiki' => 'Správa',
-'vector-namespace-project' => 'Stránka projektu',
-'vector-namespace-special' => 'Špeciálna stránka',
-'vector-namespace-talk' => 'Diskusia',
-'vector-namespace-template' => 'Šablóna',
-'vector-namespace-user' => 'Používateľská stránka',
-'vector-view-create' => 'Vytvoriť',
-'vector-view-edit' => 'Upraviť',
-'vector-view-history' => 'Zobraziť históriu',
-'vector-view-view' => 'Čítať',
-'vector-view-viewsource' => 'Zobraziť zdroj',
-'actions' => 'Operácie',
-'namespaces' => 'Menné priestory',
-'variants' => 'Varianty',
+'vector-action-addsection' => 'Pridať tému',
+'vector-action-delete' => 'Zmazať',
+'vector-action-move' => 'Presunúť',
+'vector-action-protect' => 'Zamknúť',
+'vector-action-undelete' => 'Obnoviť',
+'vector-action-unprotect' => 'Odomknúť',
+'vector-simplesearch-preference' => 'Povoliť rozšírené návrhy hľadania (iba pre tému Vector)',
+'vector-view-create' => 'Vytvoriť',
+'vector-view-edit' => 'Upraviť',
+'vector-view-history' => 'Zobraziť históriu',
+'vector-view-view' => 'Čítať',
+'vector-view-viewsource' => 'Zobraziť zdroj',
+'actions' => 'Operácie',
+'namespaces' => 'Menné priestory',
+'variants' => 'Varianty',
'errorpagetitle' => 'Chyba',
'returnto' => 'Späť na $1.',
@@ -524,6 +513,9 @@ Príliš veľa používateľov sa pokúša zobraziť túto stránku.
Prosím, poÄkajte chvíľu predtým, než sa pokúsite na túto stránku dostaÅ¥ znova.
$1',
+'pool-timeout' => 'Bol prekroÄený vyhradený Äas Äakania na zámok',
+'pool-queuefull' => 'Front je plný',
+'pool-errorunknown' => 'Neznáma chyba',
# 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' => 'O {{GRAMMAR:lokál|{{SITENAME}}}}',
@@ -687,7 +679,8 @@ Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastaveni
'yourname' => 'Používateľské meno:',
'yourpassword' => 'Heslo:',
'yourpasswordagain' => 'Zopakujte heslo:',
-'remembermypassword' => 'PamätaÅ¥ si prihlásenie na tomto poÄítaÄi',
+'remembermypassword' => 'PamätaÅ¥ si prihlásenie na tomto poÄítaÄi (naviac $1 {{PLURAL:$1|deň|dni|dní}})',
+'securelogin-stick-https' => 'Zostať pripojený cez HTTPS po prihlásení',
'yourdomainname' => 'Vaša doména:',
'externaldberror' => 'BuÄ nastala chyba externej autentifikaÄnej databázy alebo vám nie je povolené aktualizovaÅ¥ váš externý úÄet.',
'login' => 'Prihlásiť',
@@ -704,6 +697,7 @@ Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastaveni
'gotaccount' => "Máte už vytvorený úÄet? '''$1'''.",
'gotaccountlink' => 'Prihlásiť',
'createaccountmail' => 'e-mailom',
+'createaccountreason' => 'Dôvod:',
'badretype' => 'Zadané heslá nie sú rovnaké.',
'userexists' => 'Zadané používateľské meno už používa niekto iný.
Zadajte iné meno.',
@@ -724,6 +718,7 @@ Skontrolujte preklepy alebo sa [[Special:UserLogin/signup|zaregistrujte ako novÃ
'wrongpasswordempty' => 'Zadané heslo bolo prázdne. Skúste prosím znova.',
'passwordtooshort' => 'Heslo musí mať dĺžku aspoň $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'password-name-match' => 'Vaše heslo musí byť iné ako vaše používateľské meno.',
+'password-login-forbidden' => 'Použitie tohto používateľského mena a hesla bolo zakázané.',
'mailmypassword' => 'PoÅ¡lite mi e-mailom doÄasné heslo',
'passwordremindertitle' => 'Nové doÄasné heslo pre {{GRAMMAR:akuzatív|{{SITENAME}}}}',
'passwordremindertext' => 'Niekto (pravdepodobne vy, z IP adresy $1)
@@ -765,6 +760,9 @@ Prosím, poÄkajte predtým, než to skúsite znova.',
'loginlanguagelabel' => 'Jazyk: $1',
'suspicious-userlogout' => 'VaÅ¡a požiadavka odhlásiÅ¥ sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadaÄ alebo proxy server.',
+# E-mail sending
+'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
+
# Password reset dialog
'resetpass' => 'Zmeniť heslo',
'resetpass_announce' => 'Prishlásili ste sa pomocou doÄasného emailom zaslaného kódu. Pre dokonÄenie prihlásenia je potrebné tu nastaviÅ¥ nové heslo:',
@@ -817,9 +815,11 @@ Je možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si
'showdiff' => 'Zobraziť rozdiely',
'anoneditwarning' => "'''Upozornenie:''' Nie ste prihlásený.
Vaša IP adresa bude zaznamenaná v histórii úprav tejto stránky.",
+'anonpreviewwarning' => "''Nie ste prihlásený. Uložením zaznamenáte svoju IP adresu do histórie úprav tejto stránky.''",
'missingsummary' => "'''Pripomienka:''' Neposkytli ste zhrnutie úprav. Ak kliknete znova na Uložiť, vaše úpravy sa uložia bez zhrnutia úprav.",
'missingcommenttext' => 'Prosím, dolu napíšte komentár.',
-'missingcommentheader' => "'''Pripomienka:''' Neposkytli ste predmet/hlaviÄku tohto komentára. Ak znova kliknete na tlaÄidlo UložiÅ¥, vaÅ¡a úprava sa uloží bez nej.",
+'missingcommentheader' => "'''Pripomienka:''' Neposkytli ste predmet/hlaviÄku tohto komentára.
+Ak znova kliknete na tlaÄidlo „{{int:savearticle}}“, vaÅ¡a úprava sa uloží bez nej.",
'summary-preview' => 'Náhľad zhrnutia:',
'subject-preview' => 'Náhľad predmetu/hlaviÄky:',
'blockedtitle' => 'Používateľ je zablokovaný',
@@ -893,7 +893,11 @@ Dolu je pre informáciu posledná položka zo záznamu blokovaní:',
'userjsyoucanpreview' => "'''Tip:''' Váš nový JS pred uložením otestujete stlaÄením tlaÄidla „{{int:showpreview}}“.",
'usercsspreview' => "'''Nezabudnite, že toto je iba náhľad vášho používateľského CSS, ešte nebolo uložené!'''",
'userjspreview' => "'''Nezabudnite, že iba testujete/náhľad vášho používateľského JavaScriptu, ešte nebol uložený!'''",
-'userinvalidcssjstitle' => "'''Upozornenie:''' Neexistuje vzhľad „$1“. Pamätajte, že vlastné .css a .js stránky používajú názov s malými písmenami, napr. {{ns:user}}:Foo/monobook.css a nie {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Nezabudnite, že toto je iba náhľad tohto CSS.'''
+'''Zatiaľ nebolo uložené!'''",
+'sitejspreview' => "'''Nezabudnite, že toto je iba náhľad tohto JavaScriptu.'''
+'''Zatiaľ nebol uložený!'''",
+'userinvalidcssjstitle' => "'''Upozornenie:''' Neexistuje vzhľad „$1“. Pamätajte, že vlastné .css a .js stránky používajú názov s malými písmenami, napr. {{ns:user}}:Foo/vector.css a nie {{ns:user}}:Foo/Vector.css.",
'updated' => '(Aktualizovaný)',
'note' => "'''Poznámka: '''",
'previewnote' => "'''Nezabudnite, toto je iba náhľad stránky, ktorú upravujete.
@@ -933,9 +937,6 @@ z voľného diela (public domain) alebo podobného zdroja neobmedzeného autorsk
Týmto sa právne zaväzujete, že ste tento text buÄ napísali sám, alebo že je skopírovaný
z voľného diela (public domain) alebo podobného zdroja neobmedzeného autorskými právami (podrobnosti: $1).
'''NEUMIESTŇUJTE SEM BEZ POVOLENIA DIELA CHRÃNENÉ AUTORSKÃM PRÃVOM!'''",
-'longpagewarning' => "'''UPOZORNENIE: Táto stránka má $1 kilobajtov; niektoré
-prehliadaÄe by mohli maÅ¥ problémy s úpravou stránok, ktorých veľkosÅ¥ sa blíži k alebo presahuje 32 kb.
-Zvážte, Äi by nebolo možné rozdeliÅ¥ stránku na menÅ¡ie sekcie.'''",
'longpageerror' => "'''CHYBA: Text, ktorý ste poslali má $1 kilobajtov, Äo je viac ako maximum $2 kilobajtov. Nie je možné ho uložiÅ¥.'''",
'readonlywarning' => "'''UPOZORNENIE: Databáza bola poÄas upravovania stránky zamknutá z dôvodu údržby,
takže stránku momentálne nemôžete uložiť. Môžete skopírovať a vložiť
@@ -1114,6 +1115,8 @@ $1",
'logdelete-failure' => "'''Viditeľnosť záznamu nebolo možné nastaviť:'''
$1",
'revdel-restore' => 'Zmeniť viditeľnosť',
+'revdel-restore-deleted' => 'zmazané revízie',
+'revdel-restore-visible' => 'viditeľné revízie',
'pagehist' => 'História stránky',
'deletedhist' => 'Zmazaná história',
'revdelete-content' => 'obsah',
@@ -1180,11 +1183,13 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
# Diffs
'history-title' => 'História revízií „$1“',
'difference' => '(Rozdiel medzi revíziami)',
+'difference-multipage' => '(Rozdiel medzi stránkami)',
'lineno' => 'Riadok $1:',
'compareselectedversions' => 'PorovnaÅ¥ oznaÄené verzie',
'showhideselectedversions' => 'Zobraziť/skryť vybrané revízie',
'editundo' => 'vrátiť',
-'diff-multi' => '{{PLURAL:$1|Jedna medziľahlá revízia nie je zobrazená|$1 medziľahlé revízie nie sú zobrazené|$1 medziľahlých revízií nie je zobrazených}}.',
+'diff-multi' => '{{PLURAL:$1|Jedna medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od {{PLURAL:$2|jedného používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}}.',
+'diff-multi-manyusers' => '({{PLURAL:$1|$1 medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od viac ako {{PLURAL:$2|$2 používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}})',
# Search results
'searchresults' => 'Výsledky vyhľadávania',
@@ -1219,6 +1224,7 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
'searchprofile-everything-tooltip' => 'Hľadať v celom obsahu (vrátane diskusných stránok)',
'searchprofile-advanced-tooltip' => 'Hľadať vo vymenovaných menných priestoroch',
'search-result-size' => '$1 ({{PLURAL:$2|1 slovo|$2 slová|$2 slov}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Älen|$1 Älenovia|$1 Älenov}} ({{PLURAL:$2|1 podkategória|$2 podkategórie|$2 podkategórií}}, {{PLURAL:$3|1 súbor|$3 súbory|$3 súborov}})',
'search-result-score' => 'Relevancia: $1%',
'search-redirect' => '(presmerovanie $1)',
'search-section' => '(sekcia $1)',
@@ -1293,6 +1299,7 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
'contextlines' => 'PoÄet zobrazených riadkov z každej nájdenej stránky:',
'contextchars' => 'PoÄet kontextových znakov v riadku',
'stub-threshold' => 'Prah formátovania <a href="#" class="stub">výhonkov</a> (v bajtoch):',
+'stub-threshold-disabled' => 'Vypnuté',
'recentchangesdays' => 'Koľko dní zobrazovať v posledných úpravách:',
'recentchangesdays-max' => '(maximálne $1 {{PLURAL:$1|deň|dni|dní}})',
'recentchangescount' => 'Å tandardne zobrazovaný poÄet úprav:',
@@ -1325,6 +1332,7 @@ Tu je náhodne vytvorená hodnota, ktorú môžete použiť: $1',
'prefs-files' => 'Súbory',
'prefs-custom-css' => 'Vlastný CSS',
'prefs-custom-js' => 'Vlastný JS',
+'prefs-common-css-js' => 'SpoloÄné CSS/JS pre vÅ¡etky témy vzhľadu:',
'prefs-reset-intro' => 'Túto stránku môžete použiť na vrátenie predvolených hodnôt vašich nastavení.
Túto operáciu nemožno vrátiť.',
'prefs-emailconfirm-label' => 'Potvrdenie emailu:',
@@ -1361,9 +1369,15 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'prefs-advancedrendering' => 'Rozšírené možnosti',
'prefs-advancedsearchoptions' => 'Rozšírené možnosti',
'prefs-advancedwatchlist' => 'Rozšírené možnosti',
-'prefs-display' => 'Možnosti zobrazenia',
+'prefs-displayrc' => 'Možnosti zobrazenia',
+'prefs-displaysearchoptions' => 'Možnosti zobrazenia',
+'prefs-displaywatchlist' => 'Možnosti zobrazenia',
'prefs-diffs' => 'Rozdiely',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Formát e-mailovej adresa vyzerá byť správny',
+'email-address-validity-invalid' => 'Zadajte platnú e-mailovú adresu',
+
# User rights
'userrights' => 'Spravovanie používateľských práv',
'userrights-lookup-user' => 'Spravovať skupiny používateľov',
@@ -1447,6 +1461,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'right-hideuser' => 'Zablokovať používateľské meno tak, že bude verejnosti skryté',
'right-ipblock-exempt' => 'Obchádzať blokovanie IP adries, rozsahov a automatické blokovanie',
'right-proxyunbannable' => 'Obchádzať automatické blokovanie proxy serverov',
+'right-unblockself' => 'Odblokovať samých seba',
'right-protect' => 'Meniť úroveň zamknutia a upravovať zamknuté stránky',
'right-editprotected' => 'Upravovať zamknuté schránky (bez kaskádovej ochrany)',
'right-editinterface' => 'Upravovať správy používateľského rozhrania',
@@ -1469,7 +1484,6 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'right-siteadmin' => 'Zamykať a odomykať databázu',
'right-reset-passwords' => 'Zmeniť heslo iných používateľov',
'right-override-export-depth' => 'Exportovať stránky vrátane okdazovaných stránok do hĺbky 5 odkazov',
-'right-versiondetail' => 'Zobraziť podrobné informácie o verzii softvéru',
'right-sendemail' => 'Posielať e-mail ostatným používateľom',
# User rights log
@@ -1520,14 +1534,9 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'recentchanges-legend' => 'Možnosti posledných zmien',
'recentchangestext' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
'recentchanges-feed-description' => 'Sledovať posledné úpravy tejto wiki týmto kanálom.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nová stránka',
'recentchanges-label-newpage' => 'Táto úprava vytvorila novú stránku.',
-'recentchanges-legend-minor' => '$1 - drobná úprava',
'recentchanges-label-minor' => 'Toto je drobná úprava',
-'recentchanges-legend-bot' => '$1 - úprava bota',
'recentchanges-label-bot' => 'Túto úpravy vykonal robot',
-'recentchanges-legend-unpatrolled' => '$1 - nestrážená úprava',
'recentchanges-label-unpatrolled' => 'Táto úprava zatiaľ nebola strážená',
'rcnote' => "Tu {{PLURAL:$1|je posledná úprava|sú posledné '''$1''' úpravy|je posledných '''$1''' úprav}} poÄas {{PLURAL:$2|posledného dňa|posledných '''$2''' dní}} z $4, $5.",
'rcnotefrom' => "Nižšie sú zobrazené úpravy od '''$2''' (do '''$1''').",
@@ -1574,6 +1583,9 @@ Stránky, ktoré sa nachádzajú vo vaÅ¡om [[Special:Watchlist|zozname sledovanÃ
'upload_directory_missing' => 'Adresár pre nahrávanie ($1) chýba a webový server ho nedokáže vytvoriť.',
'upload_directory_read_only' => 'Webový server nemôže zapisovať do adresára pre nahrávanie ($1).',
'uploaderror' => 'Chyba pri nahrávaní',
+'upload-recreate-warning' => "'''Upozornenie: Súbor s týmto názvom bol zmazaný alebo presunutý.'''
+
+Ďalšie informácie si môžete pozrieť v zázname zmazaní a presunutí:",
'uploadtext' => "Tento formulár použite na nahrávanie súborov.
Už nahrané súbory môžete zobraziť alebo hľadať v [[Special:FileList|zozname nahraných súborov]]. Nahrávania a mazania sa tiež zaznamenávajú v [[Special:Log/upload|zázname nahrávaní]].
@@ -1609,6 +1621,17 @@ Vizuálny prehľad nájdete v [[Special:NewFiles|galérii novo nahraných súbor
'filetype-banned-type' => "„.$1“''' nie je povolený typ súboru.
{{PLURAL:$3|Povolený typ súborov je|Povolené typy súborov sú}} $2.",
'filetype-missing' => 'Súbor nemá príponu (ako „.jpg“).',
+'empty-file' => 'Súbor, ktorý ste poslali bol prázdny.',
+'file-too-large' => 'Súbor, ktorý ste poslali bol príliš veľký.',
+'filename-tooshort' => 'Názov súboru je príliš krátky.',
+'filetype-banned' => 'Tento typ súboru nie je povolené nahrať.',
+'verification-error' => 'Tento súbor neprešiel overením súboru.',
+'hookaborted' => 'Zmena, ktorú ste sa pokúšali vykonať bola zrušená prípojným bodom rozšírenia.',
+'illegal-filename' => 'Názov súboru nie je povolený.',
+'overwrite' => 'Prepísanie existujúceho súboru nie je povolené.',
+'unknown-error' => 'Vyskytla sa neznáma chyba.',
+'tmp-create-error' => 'Nepodarilo sa vytvoriÅ¥ doÄasný súbor.',
+'tmp-write-error' => 'Chyba pri zapisovaní doÄasného súboru.',
'large-file' => 'OdporúÄa sa aby veľkosÅ¥ súborov neprekraÄovala $1; tento súbor má $2.',
'largefileserver' => 'Tento súbor je väÄší ako je možné nahraÅ¥ na server (z dôvodu obmedzenia veľkosti súboru v konfigurácii servera).',
'emptyfile' => 'Zdá sa, že súbor, ktorý ste nahrali je prázdny. Mohlo sa staÅ¥, že ste urobili v názve súboru preklep. Prosím, skontrolujte, Äi skutoÄne chcete nahraÅ¥ tento súbor.',
@@ -1634,13 +1657,14 @@ Ak si aj tak želáte nahraÅ¥ svoj súbor, choÄte prosím späť a nahrajte ten
Ak ho chcete aj napriek tomu nahraÅ¥, choÄte prosím späť a použite iný názov. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Tento súbor je duplikátom {{PLURAL:$1|nasledovného súboru|nasledovných súborov}}:',
'file-deleted-duplicate' => 'Súbor zhodný s týmto súborom ([[:$1]]) už bol v minulosti zmazaný. Mali by ste skontrolovaÅ¥ históriu nahrávania tohto súboru predtým, než budete pokraÄovaÅ¥ v jeho nahrávaní.',
-'successfulupload' => 'Nahranie bolo úspešné',
'uploadwarning' => 'Varovanie pri nahrávaní',
'uploadwarning-text' => 'Prosím, zmeňte popis súboru nižšie a skúste to znova.',
'savefile' => 'Uložiť súbor',
'uploadedimage' => 'nahraný „[[$1]]“',
'overwroteimage' => 'bola nahraná nová verzia „[[$1]]“',
'uploaddisabled' => 'PrepáÄte, nahrávanie je vypnuté.',
+'copyuploaddisabled' => 'Nahrávanie prostredníctvom URL nie je povolené.',
+'uploadfromurl-queued' => 'Súbor, ktorý ste dali nahrať bol uložený do fronty.',
'uploaddisabledtext' => 'Nahrávanie súborov je vypnuté.',
'php-uploaddisabledtext' => 'Nahrávanie PHP súborov je vypnuté. Prosím, skontrolujte nastavenie file_uploads.',
'uploadscripted' => 'Tento súbor obsahuje kód HTML alebo skript, ktorý može byÅ¥ chybne interpretovaný prehliadaÄom.',
@@ -1673,6 +1697,14 @@ JD # Jenoptik
MGP # Pentax
PICT # rôzne
#</pre> <!-- tento riadok ponechajte bez zmeny -->',
+'upload-success-subj' => 'Nahranie bolo úspešné',
+'upload-success-msg' => 'Nahranie súboru [$2]prebehlo úspešne. Je dostupný tu: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problém s nahrávaním',
+'upload-failure-msg' => 'Vyskytol sa problém s vašim nahrávaním z [$2]:
+
+$1',
+'upload-warning-subj' => 'Upozornenie pri nahrávaní',
+'upload-warning-msg' => 'Nastal problém pri nahrávaní z [$2]. Môžete sa vrátiť na [[Special:Upload/stash/$1|nahrávací formulár]] a tento problém napraviť.',
'upload-proto-error' => 'Nesprávny protokol',
'upload-proto-error-text' => 'Vzdialené nahrávanie vyžaduje, aby URL zaÄínali <code>http://</code> alebo <code>ftp://</code>.',
@@ -1736,6 +1768,7 @@ Kliknutím na hlaviÄku stĺpca zmeníte poradie triedenia.',
'listfiles_search_for' => 'Hľadať názov súboru:',
'imgfile' => 'súbor',
'listfiles' => 'Zoznam obrázkov',
+'listfiles_thumb' => 'Náhľad',
'listfiles_date' => 'Dátum',
'listfiles_name' => 'Názov',
'listfiles_user' => 'Používateľ',
@@ -1846,8 +1879,8 @@ Môžete si pozrieť [[Special:WhatLinksHere/$2|úplný zoznam]].',
'statistics-edits' => 'Úprav stránok od založenia {{GRAMMAR:genitív|{{SITENAME}}}}',
'statistics-edits-average' => 'Priemerný poÄet úprav na stránku',
'statistics-views-total' => 'Celkom zobrazení',
+'statistics-views-total-desc' => 'Zobrazenia neexistujúcich stránok a špeciálnych stránok nie sú zahrnuté',
'statistics-views-peredit' => 'Zobrazení na úpravu',
-'statistics-jobqueue' => 'Dĺžka [http://www.mediawiki.org/wiki/Manual:Job_queue frontu úloh]',
'statistics-users' => 'Registrovaných [[Special:ListUsers|používateľov]]',
'statistics-users-active' => 'Aktívnych používateľov',
'statistics-users-active-desc' => 'Používatelia, ktorí za {{PLURAL:$1|posledný deň|posledné $1 dni|posledných $1 dní}} vykonali nejakú operáciu',
@@ -1862,7 +1895,7 @@ Stránka sa považuje za rozliÅ¡ovaciu, keÄ používa Å¡ablónu, na ktorú odka
'doubleredirects' => 'Dvojité presmerovania',
'doubleredirectstext' => 'Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.
Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyÄajne odkazuje na „skutoÄný“ cieľ, na ktorý má odkazovaÅ¥ prvé presmerovanie.
-<s>PreÄiarknuté</s> položky boli vyrieÅ¡ené.',
+<del>PreÄiarknuté</del> položky boli vyrieÅ¡ené.',
'double-redirect-fixed-move' => 'Stránka [[$1]] bola presunutá, teraz je presmerovaním na [[$2]]',
'double-redirect-fixer' => 'Korektor presmerovaní',
@@ -1885,6 +1918,8 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
'nmembers' => '$1 {{PLURAL:$1|Älen|Älenovia|Älenov}}',
'nrevisions' => '$1 {{PLURAL:$1|revízia|revízie|revízií}}',
'nviews' => '$1 {{PLURAL:$1|návšteva|návštevy|návštev}}',
+'nimagelinks' => 'Použité na $1 {{PLURAL:$1|stránke|stránkach}}',
+'ntransclusions' => 'použité na $1 {{PLURAL:$1|stránke|stránkach}}',
'specialpage-empty' => 'Táto správa neobsahuje žiadne položky.',
'lonelypages' => 'Opustené stránky',
'lonelypagestext' => 'Na nasledujúce stránky neodkazujú ani ich nepoužívajú ako šablónu žiadne iné stránky z {{GRAMMAR:genitív|{{SITENAME}}}}.',
@@ -2042,35 +2077,41 @@ Môžete si preÄítaÅ¥ [[{{MediaWiki:Listgrouprights-helppage}}|ÄalÅ¡ie inform
'listgrouprights-removegroup-self-all' => 'Z vlastného úÄtu je možné odstrániÅ¥ vÅ¡etky skupiny',
# E-mail user
-'mailnologin' => 'Žiadna adresa na zaslanie',
-'mailnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.',
-'emailuser' => 'E-mail tomuto používateľovi',
-'emailpage' => 'E-mail používateľovi',
-'emailpagetext' => 'Ak tento používateľ zadal platnú emailovú adresu vo svojich nastaveniach,
+'mailnologin' => 'Žiadna adresa na zaslanie',
+'mailnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.',
+'emailuser' => 'E-mail tomuto používateľovi',
+'emailpage' => 'E-mail používateľovi',
+'emailpagetext' => 'Ak tento používateľ zadal platnú emailovú adresu vo svojich nastaveniach,
môžete mu pomocou nasledovného formulára poslať email.
Emailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa emailu, aby vám mohol príjemca priamo odpovedať.',
-'usermailererror' => 'Emailový program vrátil chybu:',
-'defemailsubject' => 'email {{GRAMMAR:genitív|{{SITENAME}}}}',
-'noemailtitle' => 'Chýba e-mailová adresa',
-'noemailtext' => 'Tento používateľ neuviedol svoju platnú e-mailovú adresu.',
-'nowikiemailtitle' => 'Posielanie emailov nie je umožnené',
-'nowikiemailtext' => 'Tento používateľ sa rozhodol, že si neželá prijímať emaily od ostatných používateľov.',
-'email-legend' => 'Poslať email používateľovi {{GRAMMAR:genitív|{{SITENAME}}}}',
-'emailfrom' => 'Od:',
-'emailto' => 'Komu:',
-'emailsubject' => 'Predmet:',
-'emailmessage' => 'Správa:',
-'emailsend' => 'Odoslať',
-'emailccme' => 'Pošli mi emailom kópiu mojej správy.',
-'emailccsubject' => 'Kópia správy pre $1: $2',
-'emailsent' => 'E-mail bol odoslaný',
-'emailsenttext' => 'Vaša e-mailová správa bola odoslaná.',
-'emailuserfooter' => 'Tento email poslal $1 používateľovi $2 pomocou funkcie „Email používateľovi†na {{GRAMMAR:lokál|{{SITENAME}}}}.',
+'usermailererror' => 'Emailový program vrátil chybu:',
+'defemailsubject' => 'email {{GRAMMAR:genitív|{{SITENAME}}}}',
+'usermaildisabled' => 'Používateľ má vypnuté používanie emailu',
+'usermaildisabledtext' => 'Nemôžete posielať emaily ostatným používateľom na tejto wiki',
+'noemailtitle' => 'Chýba e-mailová adresa',
+'noemailtext' => 'Tento používateľ neuviedol svoju platnú e-mailovú adresu.',
+'nowikiemailtitle' => 'Posielanie emailov nie je umožnené',
+'nowikiemailtext' => 'Tento používateľ sa rozhodol, že si neželá prijímať emaily od ostatných používateľov.',
+'email-legend' => 'Poslať email používateľovi {{GRAMMAR:genitív|{{SITENAME}}}}',
+'emailfrom' => 'Od:',
+'emailto' => 'Komu:',
+'emailsubject' => 'Predmet:',
+'emailmessage' => 'Správa:',
+'emailsend' => 'Odoslať',
+'emailccme' => 'Pošli mi emailom kópiu mojej správy.',
+'emailccsubject' => 'Kópia správy pre $1: $2',
+'emailsent' => 'E-mail bol odoslaný',
+'emailsenttext' => 'Vaša e-mailová správa bola odoslaná.',
+'emailuserfooter' => 'Tento email poslal $1 používateľovi $2 pomocou funkcie „Email používateľovi†na {{GRAMMAR:lokál|{{SITENAME}}}}.',
+
+# User Messenger
+'usermessage-summary' => 'Zanechanie správy systému.',
+'usermessage-editor' => 'Správy systému',
# Watchlist
'watchlist' => 'Sledované stránky',
'mywatchlist' => 'Sledované stránky',
-'watchlistfor' => "(používateľa '''$1''')",
+'watchlistfor2' => '$1 $2',
'nowatchlist' => 'V zozname sledovaných stránok nemáte žiadne položky.',
'watchlistanontext' => 'Prosím $1 pre prezeranie alebo úpravu vášho zoznamu sledovaných stránok.',
'watchnologin' => 'Nie ste prihlásený/á',
@@ -2183,7 +2224,10 @@ Autorom poslednej úpravy je [[User:$3|$3]] ([[User talk:$3|Diskusia]]{{int:pipe
'revertpage' => 'Posledné úpravy používateľa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusia]]) vrátené; bola obnovená posledná úprava $1',
'revertpage-nouser' => 'Vrátené úpravy (meno používateľa odstránené) na poslednú revíziu od [[User:$1|$1]]',
'rollback-success' => 'Úpravy $1 vrátené; obnovená posledná verzia od $2.',
-'sessionfailure' => 'Zdá sa, že je problém s vašou prihlasovacou reláciou;
+
+# Edit tokens
+'sessionfailure-title' => 'Chyba relácie',
+'sessionfailure' => 'Zdá sa, že je problém s vašou prihlasovacou reláciou;
táto akcia bola zrušená ako prevencia proti zneužitiu relácie (session).
Prosím, stlaÄte "naspäť", obnovte stránku, z ktorej ste sa sem dostali, a skúste to znova.',
@@ -2314,18 +2358,22 @@ $1',
'month' => 'Mesiac:',
'year' => 'Rok:',
-'sp-contributions-newbies' => 'ZobraziÅ¥ len príspevky nových úÄtov',
-'sp-contributions-newbies-sub' => 'Príspevky nováÄikov',
-'sp-contributions-newbies-title' => 'Príspevky nových používateľov',
-'sp-contributions-blocklog' => 'záznam blokovaní',
-'sp-contributions-deleted' => 'zmazané príspevky používateľa',
-'sp-contributions-logs' => 'záznamy',
-'sp-contributions-talk' => 'diskusia',
-'sp-contributions-userrights' => 'spravovanie používateľských práv',
-'sp-contributions-blocked-notice' => 'Tento používateľ je momentálne zablokovaný. Dolu je uvedená posledná položka zo záznamu blokovaní:',
-'sp-contributions-search' => 'Hľadať príspevky',
-'sp-contributions-username' => 'IP adresa alebo meno používateľa:',
-'sp-contributions-submit' => 'Hľadať',
+'sp-contributions-newbies' => 'ZobraziÅ¥ len príspevky nových úÄtov',
+'sp-contributions-newbies-sub' => 'Príspevky nováÄikov',
+'sp-contributions-newbies-title' => 'Príspevky nových používateľov',
+'sp-contributions-blocklog' => 'záznam blokovaní',
+'sp-contributions-deleted' => 'zmazané príspevky používateľa',
+'sp-contributions-uploads' => 'nahrané súbory',
+'sp-contributions-logs' => 'záznamy',
+'sp-contributions-talk' => 'diskusia',
+'sp-contributions-userrights' => 'spravovanie používateľských práv',
+'sp-contributions-blocked-notice' => 'Tento používateľ je momentálne zablokovaný. Dolu je uvedená posledná položka zo záznamu blokovaní:',
+'sp-contributions-blocked-notice-anon' => 'Táto IP adresa je momentálne zablokovaná.
+Nižšie si môžete pozrieť najnovšiu položku záznamu blokovaní:',
+'sp-contributions-search' => 'Hľadať príspevky',
+'sp-contributions-username' => 'IP adresa alebo meno používateľa:',
+'sp-contributions-toponly' => 'Zobraziť iba posledné revízie',
+'sp-contributions-submit' => 'Hľadať',
# What links here
'whatlinkshere' => 'Odkazy na túto stránku',
@@ -2386,7 +2434,6 @@ Nižšie uveÄte konkrétny dôvod (napríklad uveÄte konkrétne stránky, ktor
'ipb-edit-dropdown' => 'Upraviť dôvody pre blokovanie',
'ipb-unblock-addr' => 'Odblokovať $1',
'ipb-unblock' => 'Odblokovať používateľa alebo IP adresu',
-'ipb-blocklist-addr' => 'Existujúce blokovania pre $1',
'ipb-blocklist' => 'Zobraziť existujúce blokovania',
'ipb-blocklist-contribs' => 'Príspevky $1',
'unblockip' => 'Odblokovať používateľa',
@@ -2457,6 +2504,8 @@ $1 je už zablokovaný. Chcete zmeniť voľby blokovania?',
'sorbs_create_account_reason' => 'VaÅ¡a IP adresa je vedená ako nezabezpeÄený proxy server v databáze DNSBL, ktorú používa {{SITENAME}}. Nemôžete si vytvoriÅ¥ úÄet.',
'cant-block-while-blocked' => 'Nemôžete blokovať iných používateľov, kým ste zablokovaný.',
'cant-see-hidden-user' => 'Používateľ, ktorého sa pokúšate zablokovať už bol zablokovaný a skrytý. Pretože nemáte právo hideuser, nemôžete vidieť ani upravovať blokovanie používateľa.',
+'ipbblocked' => 'Nemôžete zablokovať ani odblokovať iných používateľov, pretože ste sami zablokovaní',
+'ipbnounblockself' => 'Nie je povolené, aby ste sa sami odblokovali',
# Developer tools
'lockdb' => 'Zamknúť databázu',
@@ -2501,6 +2550,19 @@ existujúcu stránku.
'''UPOZORNENIE!'''
Toto môže byÅ¥ drastická a neÄakaná zmena pre populárnu stránku;
ubezpeÄte sa preto, skôr ako budete pokraÄovaÅ¥, že chápete dôsledky svojho Äinu.",
+'movepagetext-noredirectfixer' => "Pomocou tohto formulára premenujete stránku a premiestnite všetky jej predchádzajúce verzie pod zadaný nový názov.
+Starý názov sa stane presmerovacou stránkou na nový názov.
+UbezpeÄte sa, že ste skontrolovali výskyt [[Special:DoubleRedirects|dvojitých]] a [[Special:BrokenRedirects|pokazených]] presmerovaní.
+Vy ste zodpovedný za to, aby odkazy naÄalej ukazovali tam, kam majú.
+
+Uvedomte si, že stránka sa '''nepremiestni''', ak pod novým názvom už stránka existuje.
+Toto neplatí iba ak je stránka prázdna alebo presmerovacia a nemá žiadne predchádzajúce verzie.
+To znamená, že môžete premenovať stránku späť na názov, ktorý mala pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať
+existujúcu stránku.
+
+'''UPOZORNENIE!'''
+Toto môže byÅ¥ drastická a neÄakaná zmena pre populárnu stránku;
+ubezpeÄte sa preto, skôr ako budete pokraÄovaÅ¥, že chápete dôsledky svojho Äinu.",
'movepagetalktext' => "Príslušná diskusná stránka (ak existuje) bude premiestnená spolu so samotnou stránkou; '''nestane sa tak, iba ak:'''
*už existuje Diskusná stránka pod týmto novým menom, alebo
*nezaÅ¡krtnete nižšie sa nachádzajúci textový rámÄek.
@@ -2560,6 +2622,7 @@ Cieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť ta
'immobile-source-page' => 'Túto stránku nemožno presunúť.',
'immobile-target-page' => 'Nie je možné presunúť na cieľovú stránku z daným názvom.',
'imagenocrossnamespace' => 'Obrázok nemožno presunúť mimo menného priestoru obrázkov',
+'nonfile-cannot-move-to-file' => 'Nie je možné presunúť objekt, ktorý nie je súbor do menného priestoru Súbor',
'imagetypemismatch' => 'Nová prípona súboru nezodpovedá jeho typu',
'imageinvalidfilename' => 'Cieľový názov obrázka nie je platný',
'fix-double-redirects' => 'Aktualizovať všetky presmerovania odkazujúce na pôvodný názov',
@@ -2639,6 +2702,7 @@ Uložte ho na svoj disk a nahrajte sem.',
'importstart' => 'Importujú sa stránky...',
'import-revision-count' => '$1 {{PLURAL:$1|revízia|revízie|revízií}}',
'importnopages' => 'Žiadne stránky pre import.',
+'imported-log-entries' => '{{PLURAL:$1|Importovaná $1 položka záznamu|Importované $1 položky záznamu|Importovaných $1 položiek záznamu}}.',
'importfailed' => 'Chyba pri importe: $1',
'importunknownsource' => 'Neznámy typ zdroja pre import',
'importcantopen' => 'Nedal sa otvoriť súbor importu',
@@ -2732,6 +2796,8 @@ Uložte ho na svoj disk a nahrajte sem.',
'tooltip-rollback' => '„Rollback†vracia úpravy posledného prispievateľa tejto stránky jedným kliknutím.',
'tooltip-undo' => '„Vrátiť†vráti túto úpravu a otvorí formulár úprav v režime náhľadu.
Umožnuje do zhrnutia pridanie dôvodu.',
+'tooltip-preferences-save' => 'Uložiť nastavenia',
+'tooltip-summary' => 'Zadajte krátke zhrnutie',
# Stylesheets
'common.css' => '/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */',
@@ -2862,14 +2928,17 @@ Jeho spustením môžete kompromitovať svoj systém.",
'imagemaxsize' => "Obmedziť veľkosť obrázka:<br />''(na popisnej stránke súboru)''",
'thumbsize' => 'Veľkosť náhľadu:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|stránka|stránky|stránok}}',
-'file-info' => '(veľkosť súboru: $1, MIME typ: $2)',
-'file-info-size' => '($1 × $2 pixelov, veľkosť súboru: $3, MIME typ: $4)',
+'file-info' => 'veľkosť súboru: $1, MIME typ: $2',
+'file-info-size' => '$1 × $2 pixelov, veľkosť súboru: $3, MIME typ: $4',
'file-nohires' => '<small>Nie je dostupné vyššie rozlíšenie.</small>',
-'svg-long-desc' => '(SVG súbor, $1 × $2 pixelov, veľkosť súboru: $3)',
+'svg-long-desc' => 'SVG súbor, $1 × $2 pixelov, veľkosť súboru: $3',
'show-big-image' => 'Obrázok vo vyššom rozlíšení',
'show-big-image-thumb' => '<small>Veľkosť tohto náhľadu: $1 × $2 pixelov</small>',
'file-info-gif-looped' => 'v cykle',
'file-info-gif-frames' => '$1 {{PLURAL:$1|rámec|rámce|rámcov}}',
+'file-info-png-looped' => 'opakované',
+'file-info-png-repeat' => 'prehrané $1-krát{{PLURAL:$1|||}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|rámec|rámce|rámcov}}',
# Special:NewFiles
'newimages' => 'Galéria nových obrázkov',
@@ -2939,8 +3008,8 @@ Každý Äalší odkaz na rovnakom riadku sa považuje za výnimku, t.j. Älánk
'exif-colorspace' => 'Farebný priestor',
'exif-componentsconfiguration' => 'Význam jednotlivých zložiek',
'exif-compressedbitsperpixel' => 'Komprimované bity na pixel',
-'exif-pixelydimension' => 'Platná šírka obrázka',
-'exif-pixelxdimension' => 'Platná vyška obrázka',
+'exif-pixelydimension' => 'Šírka obrázka',
+'exif-pixelxdimension' => 'Výška obrázka',
'exif-makernote' => 'Poznámka výrobcu',
'exif-usercomment' => 'Komentár používateľa',
'exif-relatedsoundfile' => 'Súvisiaci zvukový súbor',
@@ -2956,9 +3025,9 @@ Každý Äalší odkaz na rovnakom riadku sa považuje za výnimku, t.j. Älánk
'exif-spectralsensitivity' => 'Spektrálna citlivosť',
'exif-isospeedratings' => 'Rýchlostné ohodnotenie ISO',
'exif-oecf' => 'Optoelektronický konverzný Äiniteľ',
-'exif-shutterspeedvalue' => 'Rýchlosť uzávierky',
-'exif-aperturevalue' => 'Clona',
-'exif-brightnessvalue' => 'Jas',
+'exif-shutterspeedvalue' => 'Rýchlosť uzávierky APEX',
+'exif-aperturevalue' => 'Clona APEX',
+'exif-brightnessvalue' => 'Jas APEX',
'exif-exposurebiasvalue' => 'ExpoziÄné skreslenie',
'exif-maxaperturevalue' => 'Maximálna krajinná clona',
'exif-subjectdistance' => 'Vzdialenosť subjektu',
@@ -3022,6 +3091,7 @@ Každý Äalší odkaz na rovnakom riadku sa považuje za výnimku, t.j. Älánk
'exif-gpsareainformation' => 'Názov GPS oblasti',
'exif-gpsdatestamp' => 'Dátum GPS',
'exif-gpsdifferential' => 'Diferenciálna korekcia GPS',
+'exif-objectname' => 'Krátky názov',
# EXIF attributes
'exif-compression-1' => 'Bez kompresie',
@@ -3181,31 +3251,31 @@ Každý Äalší odkaz na rovnakom riadku sa považuje za výnimku, t.j. Älánk
'limitall' => 'všetky',
# E-mail address confirmation
-'confirmemail' => 'Potvrdiť e-mailovú adresu',
-'confirmemail_noemail' => 'Nenastavili ste platnú emailovú adresu vo svojich [[Special:Preferences|Nastaveniach]].',
-'confirmemail_text' => '{{SITENAME}} vyžaduje, aby ste potvrdili platnosť vašej e-mailovej adresy
+'confirmemail' => 'Potvrdiť e-mailovú adresu',
+'confirmemail_noemail' => 'Nenastavili ste platnú emailovú adresu vo svojich [[Special:Preferences|Nastaveniach]].',
+'confirmemail_text' => '{{SITENAME}} vyžaduje, aby ste potvrdili platnosť vašej e-mailovej adresy
pred používaním e-mailových funkcií. Kliknite na tlaÄidlo dole, aby sa na vaÅ¡u adresu odoslal potvrdzovací
e-mail. V e-maili bude aj odkaz obsahujúci kód; otvorte odkaz
vo vaÅ¡om prehliadaÄi, Äím potvrdíte, že vaÅ¡a e-mailová adresa je platná.',
-'confirmemail_pending' => 'Potvrdzovací kód vám už bol zaslaný; ak ste si úÄet vytvorili len nedávno
+'confirmemail_pending' => 'Potvrdzovací kód vám už bol zaslaný; ak ste si úÄet vytvorili len nedávno
mali by ste poÄkaÅ¥ niekoľko minút, kým vám bude email doruÄený, predtým
než si vyžiadate nový kód.',
-'confirmemail_send' => 'Odoslať potvrdzovací kód',
-'confirmemail_sent' => 'Potvrdzovací e-mail odoslaný.',
-'confirmemail_oncreate' => 'Na vašu emailovú adresu bol odoslaný potvrdzovací kód.
+'confirmemail_send' => 'Odoslať potvrdzovací kód',
+'confirmemail_sent' => 'Potvrdzovací e-mail odoslaný.',
+'confirmemail_oncreate' => 'Na vašu emailovú adresu bol odoslaný potvrdzovací kód.
Tento kód nie je potrebný na prihlásenie, ale budete ho musieť poskytnúť pred
zapnutím vlastností wiki využívajcich email.',
-'confirmemail_sendfailed' => 'Z {{GRAMMAR:genitív|{{SITENAME}}}} nebolo možné odoslať potvrdzovací e-mail.
+'confirmemail_sendfailed' => 'Z {{GRAMMAR:genitív|{{SITENAME}}}} nebolo možné odoslať potvrdzovací e-mail.
Skontrolujte neplatné znaky vo vašej emailovej adrese.
Hlásenie programu, ktorý odosielal poštu: $1',
-'confirmemail_invalid' => 'Neplatný potvrdzovací kód. Kód možno vypršal.',
-'confirmemail_needlogin' => 'Musíte sa $1 na potvrdenie vašej emailovaj adresy.',
-'confirmemail_success' => 'Vaša e-mailová adresa bola potvrdená. Môžete sa prihlásiť a využívať wiki.',
-'confirmemail_loggedin' => 'Vaša e-mailová adresa bola potvrdená.',
-'confirmemail_error' => 'NieÄo sa pokazilo pri ukladaní vášho potvrdenia.',
-'confirmemail_subject' => '{{SITENAME}} - potvrdenie e-mailovej adresy',
-'confirmemail_body' => 'Niekto, pravdepodobne vy z IP adresy $1, zaregistroval úÄet
+'confirmemail_invalid' => 'Neplatný potvrdzovací kód. Kód možno vypršal.',
+'confirmemail_needlogin' => 'Musíte sa $1 na potvrdenie vašej emailovaj adresy.',
+'confirmemail_success' => 'Vaša e-mailová adresa bola potvrdená. Môžete sa prihlásiť a využívať wiki.',
+'confirmemail_loggedin' => 'Vaša e-mailová adresa bola potvrdená.',
+'confirmemail_error' => 'NieÄo sa pokazilo pri ukladaní vášho potvrdenia.',
+'confirmemail_subject' => '{{SITENAME}} - potvrdenie e-mailovej adresy',
+'confirmemail_body' => 'Niekto, pravdepodobne vy z IP adresy $1, zaregistroval úÄet
„$2“ s touto e-mailovou adresou na {{GRAMMAR:lokál|{{SITENAME}}}}.
Pre potvrdenie, že tento úÄet skutoÄne patrí vám a pre aktivovanie
@@ -3219,8 +3289,37 @@ Ak ste to *neboli* vy, otvorte tento odkaz,
$5
Tento potvrdzovací kód vyprší $4.',
-'confirmemail_invalidated' => 'Potvrdenie emailovej adresy bolo zrušené',
-'invalidateemail' => 'Zrušiť potvrdenie emailovej adresy',
+'confirmemail_body_changed' => 'Niekto, pravdepodobne vy, z IP adresy $1,
+zmenil emailovú adresu úÄtu „$2“ na túto adresu na {{GRAMMAR:lokál|{{SITENAME}}}}.
+
+Aby ste potvrdili, že tento úÄet skutoÄne patrí vám a znova
+aktivovali funkcie emailu na{{GRAMMAR:lokál|{{SITENAME}}}},
+otvorte nasledovný odkaz v prehliadaÄi:
+
+$3
+
+Ak vám úÄet *nepatrí*, otvorte namiesto toho tento odkaz,
+ktorý zruší potvrdenie emailovej adresy:
+
+$5
+
+Platnosť tohto potvrdzovacieho kódu vyprší $4.',
+'confirmemail_body_set' => 'Niekto, pravdepodobne vy, z IP adresy $1,
+nastavil e-mailovú adresu úÄtu „$2“ na túto adresu na {{GRAMMAR:genitív|{{SITENAME}}}}.
+
+Ak chcete potvrdiÅ¥, že tento úÄet skutoÄne patrí vám a aktivovaÅ¥
+e-mailové funkcie na {{GRAMMAR:genitív|{{SITENAME}}}}, otvorte tento odkaz vo vaÅ¡om prehliadaÄi:
+
+$3
+
+Ak úÄet nie je *nepatrí* patrí k vám, nasledujte tento odkaz,
+ktorú zruší potvrdenie e-mailovej adresy:
+
+$5
+
+Platnosť tohto potvrdzovacieho kódu vyprší $4.',
+'confirmemail_invalidated' => 'Potvrdenie emailovej adresy bolo zrušené',
+'invalidateemail' => 'Zrušiť potvrdenie emailovej adresy',
# Scary transclusion
'scarytranscludedisabled' => '[Transklúzia interwiki je vypnutá]',
@@ -3260,6 +3359,7 @@ Prosím, potvrÄte, že túto stránku chcete skutoÄne znovu vytvoriÅ¥.",
'table_pager_first' => 'Prvá stránka',
'table_pager_last' => 'Posledná stránka',
'table_pager_limit' => 'Zobraziť $1 položiek na stránku',
+'table_pager_limit_label' => 'Položiek na stránku:',
'table_pager_limit_submit' => 'Spustiť',
'table_pager_empty' => 'Bez výsledkov',
@@ -3320,6 +3420,7 @@ Tiež môžete [[Special:Watchlist/edit|použiť štandardný editor]].',
'version-specialpages' => 'Špeciálne stránky',
'version-parserhooks' => 'Prípojné body syntaktického analyzátora',
'version-variables' => 'Premenné',
+'version-skins' => 'Témy vzhľadu',
'version-other' => 'Iné',
'version-mediahandlers' => 'Obsluha multimédií',
'version-hooks' => 'Prípojné body',
@@ -3331,6 +3432,13 @@ Tiež môžete [[Special:Watchlist/edit|použiť štandardný editor]].',
'version-hook-subscribedby' => 'Pripojené',
'version-version' => '(Verzia $1)',
'version-license' => 'Licencia',
+'version-poweredby-credits' => "Táto wiki beží na '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'Äalší',
+'version-license-info' => 'MediaWiki je slobodný softvér; môžete ho šíriÅ¥ a / alebo modifikovaÅ¥ podľa podmienok GNU General Public License, ktorú vydala Free Software Foundation; a to buÄ verzie 2 tejto licencie alebo (podľa vášho uváženia) ktorejkoľvek neskorÅ¡ej verzie.
+
+MediaWiki je šírený v nádeji, že bude užitoÄný, avÅ¡ak BEZ AKEJKOĽVEK ZÃRUKY; neposkytujú sa ani implicitné záruky PREDAJNOSTI alebo VHODNOSTI NA URÄŒITà ÚČEL. ÄŽalÅ¡ie informácie nájdete v GNU General Public License.
+
+Spolu s týmto programom by ste obdržaÅ¥ [{{SERVER}}{{SCRIPTPATH}}/COPYING kópiu GNU General Public License]. Ak nie, napíšte na adresu Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA alebo [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html si ju preÄítajte online].',
'version-software' => 'Nainštalovaný softvér',
'version-software-product' => 'Produkt',
'version-software-version' => 'Verzia',
@@ -3401,6 +3509,15 @@ Zadajte názov súboru bez predpony „{{ns:file}}:“.',
'tags-edit' => 'upraviť',
'tags-hitcount' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
+# Special:ComparePages
+'comparepages' => 'Porovnať stránky',
+'compare-selector' => 'Porovnať revízie stránky',
+'compare-page1' => 'Stránka 1',
+'compare-page2' => 'Stránka 2',
+'compare-rev1' => 'Revízia 1',
+'compare-rev2' => 'Revízia 2',
+'compare-submit' => 'Porovnať',
+
# Database error messages
'dberr-header' => 'Táto wiki má problém',
'dberr-problems' => 'PrepáÄte! Táto stránka má práve technické problémy.',
@@ -3417,8 +3534,13 @@ Zadajte názov súboru bez predpony „{{ns:file}}:“.',
'htmlform-float-invalid' => 'Hodnota, ktorú ste zadali nie je Äíslo.',
'htmlform-int-toolow' => 'Hodnota, ktorú ste zadali je menšia ako minimálna hodnota $1',
'htmlform-int-toohigh' => 'Hodnota, ktorú ste zadali je väÄÅ¡ia ako maximálna hodnota $1',
+'htmlform-required' => 'Vyplnenie tejto hodnoty je povinné',
'htmlform-submit' => 'Odoslať',
'htmlform-reset' => 'Vrátiť zmeny',
'htmlform-selectorother-other' => 'Iné',
+# SQLite database support
+'sqlite-has-fts' => '$1 s podporou vyhľadávania v plnom texte',
+'sqlite-no-fts' => '$1 bez podpory vyhľadávania v plnom texte',
+
);
diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php
index c20588e9..276d76f9 100644
--- a/languages/messages/MessagesSl.php
+++ b/languages/messages/MessagesSl.php
@@ -9,6 +9,7 @@
*
* @author Dbc334
* @author Freakolowsky
+ * @author McDutchie
* @author Smihael
* @author XJamRastafire
* @author Yerpo
@@ -37,7 +38,7 @@ $namespaceNames = array(
$specialPageAliases = array(
'DoubleRedirects' => array( 'DvojnePreusmeritve' ),
- 'BrokenRedirects' => array( 'PokvarjenePreusmeritve' ),
+ 'BrokenRedirects' => array( 'PretrganePreusmeritve' ),
'Disambiguations' => array( 'RazloÄitve' ),
'Userlogin' => array( 'Prijava' ),
'Userlogout' => array( 'Odjava' ),
@@ -51,7 +52,7 @@ $specialPageAliases = array(
'Listusers' => array( 'SeznamUporabnikov' ),
'Listgrouprights' => array( 'SeznamPravicSkupin' ),
'Statistics' => array( 'Statistika' ),
- 'Randompage' => array( 'Nakljucno', 'NakljucnaStran' ),
+ 'Randompage' => array( 'NakljuÄno', 'NakljuÄnaStran' ),
'Lonelypages' => array( 'OsiroteleStrani' ),
'Uncategorizedpages' => array( 'NekategoriziraneStrani' ),
'Uncategorizedcategories' => array( 'NekategoriziraneKategorije' ),
@@ -59,43 +60,74 @@ $specialPageAliases = array(
'Uncategorizedtemplates' => array( 'NekategoriziranePredloge' ),
'Unusedcategories' => array( 'NeuporabljeneKategorije' ),
'Unusedimages' => array( 'NeuporabljeneDatoteke', 'NeuporabljeneSlike' ),
- 'Wantedpages' => array( 'ZeleneStrani' ),
- 'Wantedcategories' => array( 'ZeleneKategorije' ),
- 'Wantedfiles' => array( 'ZeleneDatoteke' ),
- 'Wantedtemplates' => array( 'ZelenePredloge' ),
+ 'Wantedpages' => array( 'ŽeleneStrani' ),
+ 'Wantedcategories' => array( 'ŽeleneKategorije' ),
+ 'Wantedfiles' => array( 'ŽeleneDatoteke' ),
+ 'Wantedtemplates' => array( 'ŽelenePredloge' ),
'Mostlinked' => array( 'NajboljPovezaneStrani' ),
- 'Mostcategories' => array( 'NajvecKategorij' ),
- 'Mostrevisions' => array( 'NajvecRedakcij' ),
+ 'Mostlinkedcategories' => array( 'NajboljPovezaneKategorije' ),
+ 'Mostlinkedtemplates' => array( 'NajboljPovezanePredloge' ),
+ 'Mostimages' => array( 'NajboljPovezaneDatoteke' ),
+ 'Mostcategories' => array( 'NajveÄKategorij' ),
+ 'Mostrevisions' => array( 'NajveÄRedakcij' ),
'Fewestrevisions' => array( 'NajmanjRedakcij' ),
'Shortpages' => array( 'KratkeStrani' ),
'Longpages' => array( 'DolgeStrani' ),
'Newpages' => array( 'NoveStrani' ),
'Ancientpages' => array( 'StarodavneStrani' ),
- 'Protectedpages' => array( 'ZasciteneStrani' ),
- 'Protectedtitles' => array( 'ZasciteniNaslovi' ),
+ 'Protectedpages' => array( 'ZaÅ¡ÄiteneStrani' ),
+ 'Protectedtitles' => array( 'ZaÅ¡ÄiteniNaslovi' ),
'Allpages' => array( 'VseStrani' ),
+ 'Unblock' => array( 'Odblokiraj' ),
'Specialpages' => array( 'PosebneStrani' ),
'Contributions' => array( 'Prispevki' ),
+ 'Whatlinkshere' => array( 'KajSePovezujeSem' ),
+ 'Movepage' => array( 'PrestaviStran', 'PremakniStran' ),
+ 'Blockme' => array( 'BlokirajMe' ),
+ 'Booksources' => array( 'ViriKnjig' ),
+ 'Categories' => array( 'Kategorije' ),
'Export' => array( 'Izvozi' ),
- 'Version' => array( 'Verzija' ),
+ 'Version' => array( 'RazliÄica', 'Verzija' ),
+ 'Allmessages' => array( 'VsaSporoÄila' ),
+ 'Log' => array( 'Dnevnik', 'Dnevniki' ),
+ 'Blockip' => array( 'Blokiraj', 'BlokirajIP', 'BlokirajUporabnika' ),
+ 'Undelete' => array( 'Obnovi' ),
+ 'Import' => array( 'Uvoz' ),
+ 'MIMEsearch' => array( 'IskanjeMIME' ),
+ 'Unwatchedpages' => array( 'NespremljaneStrani' ),
'Mypage' => array( 'MojaStran' ),
'Mytalk' => array( 'MojPogovor' ),
+ 'Mycontributions' => array( 'MojiPrispevki' ),
+ 'Listadmins' => array( 'SeznamAdministratorjev' ),
+ 'Listbots' => array( 'SeznamBotov' ),
+ 'Popularpages' => array( 'PriljubljeneStrani' ),
'Search' => array( 'Iskanje' ),
+ 'Resetpass' => array( 'SpremeniGeslo', 'PonastaviGeslo' ),
+ 'Withoutinterwiki' => array( 'BrezInterwikijev' ),
+ 'MergeHistory' => array( 'ZdružiZgodovino' ),
+ 'Filepath' => array( 'PotDatoteke' ),
+ 'Blankpage' => array( 'PraznaStran' ),
+ 'DeletedContributions' => array( 'IzbrisaniPrispevki' ),
+ 'Activeusers' => array( 'AktivniUporabniki' ),
);
$magicWords = array(
'redirect' => array( '0', '#PREUSMERITEV', '#REDIRECT' ),
'notoc' => array( '0', '__BREZKAZALAVSEBINE__', '__NOTOC__' ),
'nogallery' => array( '0', '__BREZGALERIJE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__VSILIKAZALOVSEBINE__', '__FORCETOC__' ),
'toc' => array( '0', '__POGLAVJE__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BREZUREJANJARAZDELKOV__', '__NOEDITSECTION__' ),
+ 'img_thumbnail' => array( '1', 'sliÄica', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'sliÄica=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'desno', 'right' ),
'img_left' => array( '1', 'levo', 'left' ),
'img_none' => array( '1', 'brez', 'none' ),
- 'img_width' => array( '1', '$1pik', '$1px' ),
+ 'img_width' => array( '1', '$1_pik', '$1px' ),
'img_center' => array( '1', 'sredina', 'sredinsko', 'center', 'centre' ),
'img_framed' => array( '1', 'okvir', 'okvirjeno', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'brezokvirja', 'frameless' ),
- 'img_page' => array( '1', 'stran=$1m stran $1', 'page=$1', 'page $1' ),
+ 'img_page' => array( '1', 'stran=$1', 'm_stran $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'zgorajdesno', 'zgorajdesno=$1', 'zgorajdesno $1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'obroba', 'border' ),
'img_sub' => array( '1', 'pod', 'podpisano', 'sub' ),
@@ -116,8 +148,12 @@ $magicWords = array(
'noindex' => array( '1', '__BREZKAZALA__', '__NOINDEX__' ),
'staticredirect' => array( '1', '__STATICNAPREUSMERITEV__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'STOPNJAZASCITE', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'POT', 'PATH' ),
+ 'url_query' => array( '0', 'POIZVEDBA', 'QUERY' ),
);
+$linkTrail = '/^([a-zÄćđžš]+)(.*)$/sDu';
+
$datePreferences = array(
'default',
'dmy short',
@@ -144,7 +180,7 @@ $dateFormats = array(
);
$fallback8bitEncoding = "iso-8859-2";
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -162,8 +198,7 @@ $messages = array(
'tog-editsection' => 'OmogoÄi urejanje delov prek povezav [{{int:editsection}}]',
'tog-editsectiononrightclick' => 'OmogoÄi urejanje razdelkov z desnim klikanjem njihovih naslovov (zahteva JavaScript)',
'tog-showtoc' => 'Prikaži vsebino (strani z veÄ kot tremi naslovi)',
-'tog-rememberpassword' => 'Geslo si zapomni skozi vse seje',
-'tog-editwidth' => 'RazÅ¡iri urejevalno polje Äez vso Å¡irino zaslona',
+'tog-rememberpassword' => 'Zapomni si me v tem brskalniku (za najveÄ $1 {{PLURAL:$1|dan|dneva|dni}})',
'tog-watchcreations' => 'Vse ustvarjene strani dodaj na spisek nadzorov',
'tog-watchdefault' => 'Dodaj na spisek nadzorov vse Älanke, ki sem jih ustvaril/-a ali spremenil/-a',
'tog-watchmoves' => 'Dodaj strani, ki jih premaknem, na moj spisek nadzorov',
@@ -303,31 +338,21 @@ in [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide UporabniÅ¡ki priroÄ
'faqpage' => 'Project:Najpogostejša vprašanja',
# Vector skin
-'vector-action-addsection' => 'Dodaj temo',
-'vector-action-delete' => 'Izbriši',
-'vector-action-move' => 'Prestavi',
-'vector-action-protect' => 'ZaÅ¡Äiti',
-'vector-action-undelete' => 'Vrni',
-'vector-action-unprotect' => 'Odstrani zaÅ¡Äito',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Stran s pomoÄjo',
-'vector-namespace-image' => 'Datoteka',
-'vector-namespace-main' => 'Stran',
-'vector-namespace-media' => 'Multimedijska stran',
-'vector-namespace-mediawiki' => 'SporoÄilo',
-'vector-namespace-project' => 'Projektna stran',
-'vector-namespace-special' => 'Posebna stran',
-'vector-namespace-talk' => 'Pogovor',
-'vector-namespace-template' => 'Predloga',
-'vector-namespace-user' => 'Uporabniška stran',
-'vector-view-create' => 'Ustvari',
-'vector-view-edit' => 'Uredi',
-'vector-view-history' => 'Zgodovina',
-'vector-view-view' => 'Preberi',
-'vector-view-viewsource' => 'Izvorno besedilo',
-'actions' => 'Dejanja',
-'namespaces' => 'Imenski prostori',
-'variants' => 'RazliÄice',
+'vector-action-addsection' => 'Dodaj temo',
+'vector-action-delete' => 'Izbriši',
+'vector-action-move' => 'Prestavi',
+'vector-action-protect' => 'ZaÅ¡Äiti',
+'vector-action-undelete' => 'Vrni',
+'vector-action-unprotect' => 'Odstrani zaÅ¡Äito',
+'vector-simplesearch-preference' => 'OmogoÄi izboljÅ¡ane predloge iskanja (samo koža Vector)',
+'vector-view-create' => 'Ustvari',
+'vector-view-edit' => 'Uredi',
+'vector-view-history' => 'Zgodovina',
+'vector-view-view' => 'Preberi',
+'vector-view-viewsource' => 'Izvorno besedilo',
+'actions' => 'Dejanja',
+'namespaces' => 'Imenski prostori',
+'variants' => 'RazliÄice',
'errorpagetitle' => 'Napaka',
'returnto' => 'Vrnite se na $1.',
@@ -388,6 +413,9 @@ PreveÄ uporabnikov skuÅ¡a obiskati to stran.
Prosimo za potrpežljivost, obiÅ¡Äite nas spet kmalu.
$1',
+'pool-timeout' => 'ÄŒasovno obdobje Äakanja na zaklep',
+'pool-queuefull' => 'ÄŒakalna vrsta zaloge je polna',
+'pool-errorunknown' => 'Neznana napaka',
# 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' => 'O {{GRAMMAR:dajalnik|{{SITENAME}}}}',
@@ -555,7 +583,8 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
'yourname' => 'Uporabniško ime',
'yourpassword' => 'Geslo',
'yourpasswordagain' => 'Ponovno vpišite geslo',
-'remembermypassword' => 'Zapomni si me (samodejna prijava)',
+'remembermypassword' => 'Zapomni si me na tem raÄunalniku (za najveÄ $1 {{PLURAL:$1|dan|dneva|dni}})',
+'securelogin-stick-https' => 'Po prijavi ostani povezan preko HTTPS',
'yourdomainname' => 'Domena',
'externaldberror' => 'Pri potrjevanju istovetnosti je priÅ¡lo do notranje napake ali pa za osveževanje zunanjega raÄuna nimate dovoljenja.',
'login' => 'Prijava',
@@ -572,6 +601,7 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
'gotaccount' => 'RaÄun že imate? $1.',
'gotaccountlink' => 'Prijavite se',
'createaccountmail' => 'Po e-pošti',
+'createaccountreason' => 'Razlog:',
'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
'userexists' => 'Uporabniško ime, ki ste ga vnesli, je že zasedeno.
Prosimo, izberite si drugo.',
@@ -596,6 +626,7 @@ Preverite Ärkovanje.',
'wrongpasswordempty' => 'Vpisali ste prazno geslo. Prosimo, poskusite znova.',
'passwordtooshort' => 'Geslo mora imeti najmanj $1 {{PLURAL:$1|znak|znaka|znake|znakov|znakov}}.',
'password-name-match' => 'Vaše geslo se mora razlikovati od vašega uporabniškega imena.',
+'password-login-forbidden' => 'Uporaba tega uporabniškega imena in gesla je prepovedana.',
'mailmypassword' => 'Pošlji mi novo geslo',
'passwordremindertitle' => 'Novo zaÄasno geslo za {{GRAMMAR:tožilnik|{{SITENAME}}}}',
'passwordremindertext' => 'Nekdo (verjetno vi, z IP-naslova $1) je zahteval novo
@@ -641,6 +672,9 @@ Prosimo poÄakajte, preden poskusite znova.',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaša zahteva za odjavo je bila zavrnjena, saj kaže, da je bila poslana iz pokvarjenega brskalnika ali proxyja s predpomnilnikom.',
+# E-mail sending
+'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
+
# Password reset dialog
'resetpass' => 'Spremeni geslo',
'resetpass_announce' => 'Trenutno ste prijavljeni z zaÄasno e-poÅ¡tno kodo.
@@ -693,10 +727,11 @@ Morda ste že uspeÅ¡no spremenili geslo ali pa ste zahtevali novo zaÄasno geslo
'showlivepreview' => 'Predogled v živo',
'showdiff' => 'Prikaži spremembe',
'anoneditwarning' => "'''Opozorilo''': niste prijavljeni. V zgodovino strani se bo zapisal vaš IP-naslov.",
+'anonpreviewwarning' => 'Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.',
'missingsummary' => "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
'missingcommenttext' => 'Prosimo, vpišite v spodnje polje komentar.',
'missingcommentheader' => "'''Opozorilo:''' Niste vnesli zadeve/naslova za ta komentar.
-Če boste ponovno kliknili Shrani stran, bo vaše urejanje shranjeno brez le-tega.",
+Če boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez le-tega.",
'summary-preview' => 'Predogled povzetka',
'subject-preview' => 'Predogled zadeve/naslova:',
'blockedtitle' => 'Uporabnik je blokiran',
@@ -765,8 +800,12 @@ Najnovejši vnos v dnevniku blokad je prikazan spodaj:',
'''Ni Å¡e bil shranjen!'''",
'userjspreview' => "'''Ne pozabite, da svoj uporabniški JavaScript le preizkušate/predogledujete.'''
'''Ni Å¡e bil shranjen!'''",
+'sitecsspreview' => "'''Ne pozabite, da ta CSS samo preizkušate.'''
+'''Ni Å¡e bil shranjen!'''",
+'sitejspreview' => "'''Ne pozabite, da kodo tega JavaScripta samo preizkušate.'''
+'''Ni Å¡e bila shranjena!'''",
'userinvalidcssjstitle' => "'''Opozorilo:''' Koža »$1« ne obstaja.
-Vedite, da .css in .js strani po meri uporabljajo naslov z malo zaÄetnico, npr. {{ns:user}}:Blabla/monobook.css namesto {{ns:user}}:Blabla/Monobook.css.",
+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' => "'''Stran le predogledujete in Å¡e ni shranjena!'''",
@@ -805,9 +844,6 @@ Poleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa
Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />
Poleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira (za podrobnosti glej $1).
'''Ne dodajajte avtorsko zaÅ¡Äitenega dela brez dovoljenja!'''",
-'longpagewarning' => 'Stran je dolga $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov|kilobajtov}};
-nekateri brskalniki imajo lahko težave z urejanjem strani, daljših od 32 KB.
-Prosimo, razmislite o razdelitvi strani na manjše razdelke.',
'longpageerror' => "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov|kilobajtov}}, s Äimer presega najveÄjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov|kilobajtov}}.'''
Zato ga ni mogoÄe shraniti.",
'readonlywarning' => "'''Opozorilo: Zbirka podatkov je zaradi vzdrževanja zaÄasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti. Prosimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.'''
@@ -982,6 +1018,8 @@ $1",
'logdelete-failure' => "'''Vidnost dnevnika ne more biti nastavljena!:'''
$1",
'revdel-restore' => 'Spremeni vidnost',
+'revdel-restore-deleted' => 'izbrisane redakcije',
+'revdel-restore-visible' => 'vidne redakcije',
'pagehist' => 'Zgodovina strani',
'deletedhist' => 'Zgodovina brisanja',
'revdelete-content' => 'vsebino',
@@ -1052,11 +1090,13 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
# Diffs
'history-title' => 'Zgodovina strani »$1«',
'difference' => '(Primerjava redakcij)',
+'difference-multipage' => '(Razlika med stranmi)',
'lineno' => 'Vrstica $1:',
'compareselectedversions' => 'Primerjaj izbrani redakciji',
'showhideselectedversions' => 'Prikaži/skrij izbrane redakcije',
'editundo' => 'razveljavi',
-'diff-multi' => '({{PLURAL:$1|$1 vmesna redakcija ni prikazana|$1 vmesni redakciji nista prikazani|$1 vmesne redakcije niso prikazane|$1 vmesnih redakcij ni prikazanih}})',
+'diff-multi' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} {{PLURAL:$2|$2 uporabnika|$2 uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} veÄ kot $2 {{PLURAL:$2|uporabnika|uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
# Search results
'searchresults' => 'Izid iskanja',
@@ -1091,6 +1131,7 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
'searchprofile-everything-tooltip' => 'IÅ¡Äi po vsej vsebini (vkljuÄno s pogovornimi stranmi)',
'searchprofile-advanced-tooltip' => 'Iskanje v imenskih prostorih po meri',
'search-result-size' => '$1 ({{PLURAL:$2|1 beseda|2 besedi|$2 besede|$2 besed|$2 besed}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|Älan|Älana|Älani|Älanov}} ($1 {{PLURAL:$2|podkategorija|podkategoriji|podkategorije|podkategorij}}, $1 {{PLURAL:$3|datoteka|datoteki|datoteke|datotek}})',
'search-result-score' => 'Ustreznost: $1%',
'search-redirect' => '(preusmeritev $1)',
'search-section' => '(razdelek $1)',
@@ -1167,6 +1208,7 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
'contextlines' => 'Vrstic na zadetek:',
'contextchars' => 'Znakov na vrstico:',
'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-max' => 'NajveÄ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
'recentchangescount' => 'Privzeto Å¡tevilo prikazanih urejanj:',
@@ -1200,6 +1242,7 @@ Tukaj je nakljuÄno ustvarjena vrednost, ki jo lahko uporabite: $1',
'prefs-files' => 'Datoteke',
'prefs-custom-css' => 'CSS po meri',
'prefs-custom-js' => 'JS po meri',
+'prefs-common-css-js' => 'Skupni CSS/JS za vse kože:',
'prefs-reset-intro' => 'To stran lahko uporabite za ponastavitev nastavitev na privzete za to spletiÅ¡Äe.
Tega ni mogoÄe razveljaviti.',
'prefs-emailconfirm-label' => 'Potrditev e-pošte:',
@@ -1240,9 +1283,15 @@ Poleg tega vpisan e-poÅ¡tni naslov omogoÄa drugim, da vam lahko poÅ¡iljajo elek
'prefs-advancedrendering' => 'Napredne možnosti',
'prefs-advancedsearchoptions' => 'Napredne možnosti',
'prefs-advancedwatchlist' => 'Napredne možnosti',
-'prefs-display' => 'Prikaži možnosti',
+'prefs-displayrc' => 'Možnosti prikaza',
+'prefs-displaysearchoptions' => 'Možnosti prikaza',
+'prefs-displaywatchlist' => 'Možnosti prikaza',
'prefs-diffs' => 'Primerjave',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Izgleda veljaven',
+'email-address-validity-invalid' => 'Obvezen je veljaven naslov!',
+
# User rights
'userrights' => 'Upravljanje s pravicami uporabnikov',
'userrights-lookup-user' => 'Upravljanje z uporabniškimi skupinami',
@@ -1326,6 +1375,7 @@ Poleg tega vpisan e-poÅ¡tni naslov omogoÄa drugim, da vam lahko poÅ¡iljajo elek
'right-hideuser' => 'Blokiranje uporabnika, in skritje pred javnostjo',
'right-ipblock-exempt' => 'Izogne se blokadam IP-naslova, samodejnim blokadam in blokadam obmoÄij',
'right-proxyunbannable' => 'Izogne se samodejnim blokadam proxyjev',
+'right-unblockself' => 'Deblokiraj samega sebe',
'right-protect' => 'Spreminjanje stopnje zaÅ¡Äite in urejanje zaÅ¡Äitenih strani',
'right-editprotected' => 'Urejanje zaÅ¡Äitenih strani (brez kaskadne zaÅ¡Äite)',
'right-editinterface' => 'Urejanje uporabniškega vmesnika',
@@ -1348,7 +1398,6 @@ Poleg tega vpisan e-poÅ¡tni naslov omogoÄa drugim, da vam lahko poÅ¡iljajo elek
'right-siteadmin' => 'Zaklepanje in odklepanje baze podatkov',
'right-reset-passwords' => 'Ponastavljanje gesla drugih uporabnikov',
'right-override-export-depth' => 'Izvoz strani, vkljuÄno s povezaimi straneh do globine 5',
-'right-versiondetail' => 'Pregledovanje razÅ¡irjenih informacij o razliÄici programske opreme',
'right-sendemail' => 'Pošiljanje e-pošte drugim uporabnikom',
# User rights log
@@ -1399,14 +1448,9 @@ Poleg tega vpisan e-poÅ¡tni naslov omogoÄa drugim, da vam lahko poÅ¡iljajo elek
'recentchanges-legend' => 'Možnosti zadnjih sprememb',
'recentchangestext' => 'Na tej strani lahko spremljajte najnedavnejše spremembe wikija.',
'recentchanges-feed-description' => 'Spremljajte najnovejše spremembe wikija prek tega vira.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova stran',
'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
-'recentchanges-legend-minor' => '$1 - manjše urejanje',
'recentchanges-label-minor' => 'To je manjše urejanje',
-'recentchanges-legend-bot' => '$1 - urejanja bota',
'recentchanges-label-bot' => 'To urejanje je bilo izvedeno z botom',
-'recentchanges-legend-unpatrolled' => '$1 - ne-patruljirano urejanje',
'recentchanges-label-unpatrolled' => 'To 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''').",
@@ -1453,6 +1497,9 @@ Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
'upload_directory_missing' => 'Mapa za nalaganje datotek ($1) manjka in je ni bilo mogoÄe ustvariti s spletnim strežnikom.',
'upload_directory_read_only' => 'V mapo za nalaganje datotek ($1) spletni strežnik ne more pisati.',
'uploaderror' => 'Napaka',
+'upload-recreate-warning' => "'''Opozorilo: Datoteka s tem imenom je bila izbrisana ali prestavljena.'''
+
+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]].
@@ -1487,6 +1534,17 @@ Za grafiÄni pogled obiÅ¡Äite [[Special:NewFiles|galerijo novih datotek]].',
'filetype-banned-type' => "'''».$1«''' ni dovoljena datoteÄna vrsta.
{{PLURAL:$3|Dovoljena datoteÄna vrsta je|Dovoljeni datoteÄni vrsti sta|Dovoljene datoteÄne vrste so|Dovoljene datoteÄne vrste so}} $2.",
'filetype-missing' => 'Datoteka nima konÄnice (kot ».jpg«).',
+'empty-file' => 'Datoteka, ki ste jo poslali, je prazna',
+'file-too-large' => 'Datoteka, ki ste jo poslali, je prevelika',
+'filename-tooshort' => 'Ime datoteke je prekratko',
+'filetype-banned' => 'Ta vrsta datoteke je prepovedana',
+'verification-error' => 'Ta datoteka ni opravila preverjanja datoteke',
+'hookaborted' => 'Spremembo, ki ste jo poskušali narediti, je prekinila razširitev.',
+'illegal-filename' => 'Ime datoteke ni dovoljeno',
+'overwrite' => 'Prepisovanje obstojeÄe datoteke ni dovoljeno',
+'unknown-error' => 'Prišlo je do neznane napake.',
+'tmp-create-error' => 'ZaÄasne datoteke ni bilo mogoÄe ustvariti',
+'tmp-write-error' => 'Napaka pri pisanju zaÄasne datoteke',
'large-file' => 'PriporoÄeno je, da datoteke niso veÄje od $1; ta datoteka je $2.',
'largefileserver' => 'Velikost datoteke presega strežnikove nastavitve.',
'emptyfile' => 'Kaže, da je aložena datoteka prazna.
@@ -1517,13 +1575,14 @@ Prosimo, vrnite se in naložite svojo datoteko pod drugim imenom.
'file-exists-duplicate' => 'Ta datoteka je dvojnik {{PLURAL:$1|naslednje datoteke|naslednjih datotek}}:',
'file-deleted-duplicate' => 'Datoteka je identiÄna tej ([[:$1]]), ki je bila predhodno izbrisana.
Preverite zgodovino brisanja datoteke, preden jo ponovno naložite.',
-'successfulupload' => 'Datoteka je bila uspešno naložena',
'uploadwarning' => 'Opozorilo!',
'uploadwarning-text' => 'Prosimo, spremenite opis datoteke spodaj in poskusite ponovno.',
'savefile' => 'Shrani datoteko',
'uploadedimage' => 'je naložil(-a) datoteko »[[$1]]«',
'overwroteimage' => 'je naložil(-a) novo razliÄico datoteke »[[$1]]«',
'uploaddisabled' => 'Nalaganje je onemogoÄeno',
+'copyuploaddisabled' => 'Nalaganje preko URL je onemogoÄeno',
+'uploadfromurl-queued' => 'VaÅ¡e nalaganje je bilo postavljeno v Äakalno vrsto.',
'uploaddisabledtext' => 'Nalaganje datotek je onemogoÄeno.',
'php-uploaddisabledtext' => 'Nalaganje datotek je onemogoÄeno v PHP.
Prosimo preverite file_uploads nastavitev.',
@@ -1559,6 +1618,14 @@ JD # Jenoptik
MGP # Pentax
PICT # mešano
#</pre> <!-- pustite to vrstico takšno, kot je -->',
+'upload-success-subj' => 'Datoteka je bila uspešno naložena',
+'upload-success-msg' => 'Vaša datoteka iz [$2] je bila uspešno naložena. Na voljo je tukaj: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Težava pri nalaganju',
+'upload-failure-msg' => 'Prišlo je do težave z vašo naloženo datoteko iz [$2]:
+
+$1',
+'upload-warning-subj' => 'Opozorilo pri nalaganju',
+'upload-warning-msg' => 'Prišlo je do težave pri nalaganju datoteke iz [$2]. Lahko se vrnete na [[Special:Upload/stash/$1|obrazec za nalaganje]], da odpravite težavo.',
'upload-proto-error' => 'Nepravilni protokol',
'upload-proto-error-text' => 'Oddaljeno nalaganje zahteva, da se URL zaÄenja s <code>http://</code> ali <code>ftp://</code>.',
@@ -1625,6 +1692,7 @@ Za spremembo razvrÅ¡Äanja kliknete na glavo stolpca.',
'listfiles_search_for' => 'IÅ¡Äi po imenu datoteke:',
'imgfile' => 'dat.',
'listfiles' => 'Seznam datotek',
+'listfiles_thumb' => 'SliÄica',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Ime',
'listfiles_user' => 'Uporabnik',
@@ -1740,8 +1808,8 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
'statistics-edits' => 'Urejanja strani od postavitve {{GRAMMAR:rodilnik|{{SITENAME}}}}',
'statistics-edits-average' => 'PovpreÄno Å¡tevilo urejanj na stran',
'statistics-views-total' => 'Vseh ogledov',
+'statistics-views-total-desc' => 'Ogledi neoobstojeÄih in posebnih strani niso vkljuÄeni',
'statistics-views-peredit' => 'Razmerje med ogledi in urejanji',
-'statistics-jobqueue' => 'Dolžina [http://www.mediawiki.org/wiki/Manual:Job_queue vrste opravil]',
'statistics-users' => 'Registrirani [[Special:ListUsers|uporabniki]]',
'statistics-users-active' => 'Aktivni uporabniki',
'statistics-users-active-desc' => 'Uporabniki, ki so izvedli dejanje v {{PLURAL:$1|zadnjem dnevu|zadnjih $1 dneh}}',
@@ -1756,7 +1824,7 @@ Stran se obravnava kot razloÄitvena, Äe uporablja predloge povezane iz [[Media
'doubleredirects' => 'Dvojne preusmeritve',
'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
Vsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.
-<s>PreÄrtani</s> vnosi so bili razreÅ¡eni.',
+<del>PreÄrtani</del> vnosi so bili razreÅ¡eni.',
'double-redirect-fixed-move' => 'Stran [[$1]] je bil premaknjen.
Sedaj je preusmeritev na [[$2]].',
'double-redirect-fixer' => 'Popravljalec preusmeritev',
@@ -1780,6 +1848,8 @@ Sedaj je preusmeritev na [[$2]].',
'nmembers' => '$1 {{PLURAL:$1|element|elementa|elementi|elementov|elementov}}',
'nrevisions' => '$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij|redakcij}}',
'nviews' => '$1 {{PLURAL:$1|ogled|ogleda|ogledi|ogledov|ogledov}}',
+'nimagelinks' => 'Uporabljeno na $1 {{PLURAL:$1|strani|straneh}}',
+'ntransclusions' => 'uporabljeno na $1 {{PLURAL:$1|strani|straneh}}',
'specialpage-empty' => 'Za to poroÄilo ni rezultatov.',
'lonelypages' => 'Osirotele strani',
'lonelypagestext' => 'Naslednje strani niso povezane ali vkljuÄene v nobeno drugo stran na {{GRAMMAR:locative|{{SITENAME}}}}.',
@@ -1936,34 +2006,40 @@ Na voljo so morda [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]]
'listgrouprights-removegroup-self-all' => 'Lastni raÄun odstrani iz vseh skupin',
# E-mail user
-'mailnologin' => 'Manjka naslov pošiljatelja',
-'mailnologintext' => 'Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.',
-'emailuser' => 'Pošlji uporabniku e-pismo',
-'emailpage' => 'Pošlji uporabniku e-pismo',
-'emailpagetext' => 'S spodnjim obrazcem lahko uporabniku poÅ¡ljete e-poÅ¡tno sporoÄilo.
+'mailnologin' => 'Manjka naslov pošiljatelja',
+'mailnologintext' => 'Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.',
+'emailuser' => 'Pošlji uporabniku e-pismo',
+'emailpage' => 'Pošlji uporabniku e-pismo',
+'emailpagetext' => 'S spodnjim obrazcem lahko uporabniku poÅ¡ljete e-poÅ¡tno sporoÄilo.
E-poÅ¡tni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniÅ¡kih nastavitvah]], bo v e-sporoÄilu naveden kot naslov »Od:«, tako da bo prejemnik lahko odgovoril neposredno vam.',
-'usermailererror' => 'Predmet e-pošte je vrnil napako:',
-'defemailsubject' => 'Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}}',
-'noemailtitle' => 'Ni e-poštnega naslova',
-'noemailtext' => 'Uporabnik ni navedel veljavnega e-poštnega naslova.',
-'nowikiemailtitle' => 'E-pošta ni dovoljena',
-'nowikiemailtext' => 'Ta uporabnik se je odloÄil, da ne bo prejmal e-poÅ¡te od drugih uporabnikov.',
-'email-legend' => 'Pošlji e-pošto drugemu uporabniku {{GRAMMAR:akuzativ|{{SITENAME}}}}',
-'emailfrom' => 'Od:',
-'emailto' => 'Za:',
-'emailsubject' => 'Zadeva:',
-'emailmessage' => 'SporoÄilo:',
-'emailsend' => 'Pošlji',
-'emailccme' => 'Po elektronski poÅ¡ti mi poÅ¡lji kopijo mojega sporoÄila.',
-'emailccsubject' => 'Kopija tvojega sporoÄila iz $1: $2',
-'emailsent' => 'E-pismo je poslano!',
-'emailsenttext' => 'E-pismo je poslano.',
-'emailuserfooter' => 'To e-poÅ¡tno sporoÄilo je bilo poslano od $1 uporabniku $2 preko funkcije »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.',
+'usermailererror' => 'Predmet e-pošte je vrnil napako:',
+'defemailsubject' => 'Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}}',
+'usermaildisabled' => 'UporabniÅ¡ka e-poÅ¡ta je onemogoÄena',
+'usermaildisabledtext' => 'Na tem wikiju ne morete poslati e-pošte drugim uporabnikom',
+'noemailtitle' => 'Ni e-poštnega naslova',
+'noemailtext' => 'Uporabnik ni navedel veljavnega e-poštnega naslova.',
+'nowikiemailtitle' => 'E-pošta ni dovoljena',
+'nowikiemailtext' => 'Ta uporabnik se je odloÄil, da ne bo prejmal e-poÅ¡te od drugih uporabnikov.',
+'email-legend' => 'Pošlji e-pošto drugemu uporabniku {{GRAMMAR:akuzativ|{{SITENAME}}}}',
+'emailfrom' => 'Od:',
+'emailto' => 'Za:',
+'emailsubject' => 'Zadeva:',
+'emailmessage' => 'SporoÄilo:',
+'emailsend' => 'Pošlji',
+'emailccme' => 'Po elektronski poÅ¡ti mi poÅ¡lji kopijo mojega sporoÄila.',
+'emailccsubject' => 'Kopija tvojega sporoÄila iz $1: $2',
+'emailsent' => 'E-pismo je poslano!',
+'emailsenttext' => 'E-pismo je poslano.',
+'emailuserfooter' => 'To e-poÅ¡tno sporoÄilo je bilo poslano od $1 uporabniku $2 preko funkcije »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.',
+
+# User Messenger
+'usermessage-summary' => 'Pusti sistemsko sporoÄilo.',
+'usermessage-editor' => 'Sistemski sporoÄevalec',
# Watchlist
'watchlist' => 'Spisek nadzorov',
'mywatchlist' => 'Spisek nadzorov',
-'watchlistfor' => "(za '''$1''')",
+'watchlistfor2' => 'Za $1 $2',
'nowatchlist' => 'Vaš spisek nadzorov je prazen.',
'watchlistanontext' => 'Za pregled ali urejanje vsebine vašega spiska nadzorov se morate $1.',
'watchnologin' => 'Niste prijavljeni',
@@ -2024,6 +2100,9 @@ Na spisku nadzorov lahko tudi ponastavite zastavice obveÅ¡Äanj za vse spremljan
Vaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}
--
+Za spremembo nastavitev e-poÅ¡tnih obvestil obiÅ¡Äite
+{{fullurl:{{#special:Preferences}}}}
+
Za spremembo nastavitev spiska nadzorov obiÅ¡Äite
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2084,7 +2163,10 @@ Zadnji je stran urejal uporabnik [[User:$3|$3]] ([[User talk:$3|pogovor]]{{int:p
'revertpage-nouser' => 'vrnitev sprememb (uporabniško ime odstranjeno) na zadnje urejanje uporabnika [[User:$1|$1]]',
'rollback-success' => 'Razveljavljene spremembe uporabnika $1;
vrnjeno na urejanje uporabnika $2.',
-'sessionfailure' => 'VaÅ¡a prijava ni uspela; da bi prepreÄili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.',
+
+# Edit tokens
+'sessionfailure-title' => 'Neuspeh seje',
+'sessionfailure' => 'VaÅ¡a prijava ni uspela; da bi prepreÄili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.',
# Protect
'protectlogpage' => 'Dnevnik zaÅ¡Äit strani',
@@ -2219,19 +2301,23 @@ $1',
'month' => 'Od meseca (in prej):',
'year' => 'Od leta (in prej):',
-'sp-contributions-newbies' => 'Prikaži samo prispevke novih raÄunov',
-'sp-contributions-newbies-sub' => 'Prispevki novincev',
-'sp-contributions-newbies-title' => 'UporabniÅ¡ki prispevki novih raÄunov',
-'sp-contributions-blocklog' => 'dnevnik blokiranja',
-'sp-contributions-deleted' => 'izbrisani uporabnikovi prispevki',
-'sp-contributions-logs' => 'dnevniki',
-'sp-contributions-talk' => 'pogovor',
-'sp-contributions-userrights' => 'upravljanje s pravicami uporabnikov',
-'sp-contributions-blocked-notice' => 'Ta uporabnik je trenutno blokiran.
+'sp-contributions-newbies' => 'Prikaži samo prispevke novih raÄunov',
+'sp-contributions-newbies-sub' => 'Prispevki novincev',
+'sp-contributions-newbies-title' => 'UporabniÅ¡ki prispevki novih raÄunov',
+'sp-contributions-blocklog' => 'dnevnik blokiranja',
+'sp-contributions-deleted' => 'izbrisani uporabnikovi prispevki',
+'sp-contributions-uploads' => 'naložene datoteke',
+'sp-contributions-logs' => 'dnevniki',
+'sp-contributions-talk' => 'pogovor',
+'sp-contributions-userrights' => 'upravljanje s pravicami uporabnikov',
+'sp-contributions-blocked-notice' => 'Ta uporabnik je trenutno blokiran.
+Najnovejši vnos v dnevniku blokad je naveden spodaj:',
+'sp-contributions-blocked-notice-anon' => 'Ta IP-naslov je trenutno blokiran.
Najnovejši vnos v dnevniku blokad je naveden spodaj:',
-'sp-contributions-search' => 'IÅ¡Äi prispevke',
-'sp-contributions-username' => 'IP-naslov ali uporabniško ime:',
-'sp-contributions-submit' => 'IÅ¡Äi',
+'sp-contributions-search' => 'IÅ¡Äi prispevke',
+'sp-contributions-username' => 'IP-naslov ali uporabniško ime:',
+'sp-contributions-toponly' => 'Prikaži samo vrhnje redakcije',
+'sp-contributions-submit' => 'IÅ¡Äi',
# What links here
'whatlinkshere' => 'Kaj se povezuje sem',
@@ -2292,7 +2378,6 @@ Oglejte si [[Special:IPBlockList|seznam blokiranih IP-naslovov]] za pregled blok
'ipb-edit-dropdown' => 'Uredi razloge blokade',
'ipb-unblock-addr' => 'Deblokiraj $1',
'ipb-unblock' => 'Odblokirajte uporabniško ime ali IP-naslov',
-'ipb-blocklist-addr' => 'ObstojeÄe blokade za $1',
'ipb-blocklist' => 'Ogled obstojeÄih blokad',
'ipb-blocklist-contribs' => 'Prispevki za $1',
'unblockip' => 'Deblokirajte uporabnika',
@@ -2367,6 +2452,8 @@ RaÄuna žal ne morete ustvariti.',
'cant-block-while-blocked' => 'Ne morete blokirati drugih uporabnikove, medtem ko ste sami blokirani.',
'cant-see-hidden-user' => 'Uporabnik, ki ga poskušate blokirate, je že blokiran in skrit.
Ker nimate pravice hideuser, si ne morete ogledati ali urejati uporabnikove blokade.',
+'ipbblocked' => 'Ne morete blokirati ali deblokirati drugih uporabnikov, saj ste sami blokirani',
+'ipbnounblockself' => 'Ni vam dovoljeno deblokirati samega sebe',
# Developer tools
'lockdb' => 'Zakleni zbirko podatkov',
@@ -2403,6 +2490,17 @@ To pomeni, da lahko, Äe se zmotite, strani vrnete prvotno ime, ne morete pa pre
'''Opozorilo!'''
Prestavitev strani je lahko za priljubljeno stran velika in nepriÄakovana sprememba, zato pred izbiro ukaza dobro premislite.",
+'movepagetext-noredirectfixer' => "Z uporabo spodnjega obrazca lahko preimenujete stran tako, da prestavite vso njeno zgodovino na novo ime.
+Star naslov bo postal preusmeritvena stran na nov naslov.
+Ne pozabite preveriti [[Special:DoubleRedirects|dvojnih]] ali [[Special:BrokenRedirects|pretrganih preusmeritev]].
+Vi ste odgovorni, da vse povezave še naprej kažejo tja, kamor naj bi.
+
+UpoÅ¡tevajte, da stran '''ne''' bo prestavljena, Äe že obstaja stran z novim naslovom, razen Äe je prazna ali preusmeritev brez pretekle zgodovine urejanj.
+To pomeni, da lahko stran preimenujete nazaj, Äe ste naredili napako, vendar ne morete prepisati obstojeÄe strani.
+
+'''Opozorilo!'''
+To je lahko velika in nepriÄakovana sprememba za priljubljeno stran;
+prosimo, pred nadaljevanjem se prepriÄajte, da razumete posledice tega dejanja.",
'movepagetalktext' => "ÄŒe obstaja, bo samodejno prestavljena tudi pripadajoÄa pogovorna stran, '''razen kadar'''
*pod novim imenom že obstaja neprazna pogovorna stran ali
*ste odkljukali spodnji okvirÄek.
@@ -2460,6 +2558,7 @@ strani ni mogoÄe prestaviti samo vaÅ¡e.',
'immobile-source-page' => 'Te strani ni mogoÄe prestaviti.',
'immobile-target-page' => 'Ne morem premakniti na ta ciljni naslov.',
'imagenocrossnamespace' => 'Ne morem premakniti datoteke izven imenskega prostora datotek',
+'nonfile-cannot-move-to-file' => 'Ne morem premakniti nedatoteko v imenski prostor datotek',
'imagetypemismatch' => 'Nova konÄnica datoteke se ne ujema z njeno vrsto',
'imageinvalidfilename' => 'Ciljno ime datoteke je neveljavno',
'fix-double-redirects' => 'Posodobi vse preusmeritve, ki kažejo na prvotni naslov',
@@ -2541,6 +2640,7 @@ Shranite jo na vaÅ¡ raÄunalnik in naložite tukaj.',
'importstart' => 'Uvažam strani ...',
'import-revision-count' => '$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij|redakcij}}',
'importnopages' => 'Ni strani za uvoz.',
+'imported-log-entries' => '{{PLURAL:$1|Uvožen je bil $1 dnevniški vnos|Uvožena sta bila $1 dnevniška vnosa|Uvoženi so bili $1 dnevniški vnosi|Uvoženih je bilo $1 dnevniških vnosov}}.',
'importfailed' => 'Uvoz ni uspel: $1',
'importunknownsource' => 'Neznana vrsta vira uvoza',
'importcantopen' => 'Neuspešno odpiranje uvožene datoteke',
@@ -2638,6 +2738,8 @@ Prosimo, poskusite znova.',
'tooltip-rollback' => 'Funkcija »Vrni« z enim klikom povrne vsa urejanja zadnjega urejevalca te strani',
'tooltip-undo' => '"Razveljavi" vrne to urejanje in odpre predogled v oknu za urejanje.
OmogoÄa vnos pojasnila v povzetku urejanja.',
+'tooltip-preferences-save' => 'Shrani nastavitve',
+'tooltip-summary' => 'Vnesite kratek povzetek',
# Metadata
'nodublincore' => 'Metapodatki Dublin Core RDF so na tem strežniku onemogoÄeni.',
@@ -2734,13 +2836,16 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
'widthheight' => '$1&nbsp;×&nbsp;$2',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|stran|strani}}',
'file-info' => 'Velikost datoteke: $1, MIME-vrsta: <code>$2</code>',
-'file-info-size' => '($1 × $2 toÄk, velikost datoteke: $3, MIME-vrsta: $4)',
+'file-info-size' => '$1 × $2 toÄk, velikost datoteke: $3, vrsta MIME: $4',
'file-nohires' => '<small>Slika viÅ¡je loÄljivosti ni na voljo.</small>',
-'svg-long-desc' => '(datoteka SVG, v izvirniku $1 × $2 slikovnih toÄk, velikost datoteke: $3)',
+'svg-long-desc' => 'datoteka SVG, v izvirniku $1 × $2 slikovnih toÄk, velikost datoteke: $3',
'show-big-image' => 'Slika v viÅ¡ji loÄljivosti',
'show-big-image-thumb' => '<small>Velikost predogleda: $1 × $2 toÄk</small>',
'file-info-gif-looped' => 'ponavljajoÄe',
'file-info-gif-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄici|sliÄice|sliÄic}}',
+'file-info-png-looped' => 'ponavljajoÄe',
+'file-info-png-repeat' => 'predvajano {{PLURAL:$1|$1-krat}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄici|sliÄice|sliÄic}}',
# Special:NewFiles
'newimages' => 'Galerija novih datotek',
@@ -2898,6 +3003,7 @@ Druga bodo po privzetem skrita.
'exif-gpsareainformation' => 'Ime GPS-obmoÄja',
'exif-gpsdatestamp' => 'GPS-datum',
'exif-gpsdifferential' => 'Diferencialni popravek GPS',
+'exif-objectname' => 'Kratek naslov',
# EXIF attributes
'exif-compression-1' => 'Nestisnjeno',
@@ -3060,27 +3166,27 @@ Druga bodo po privzetem skrita.
'limitall' => 'vse',
# E-mail address confirmation
-'confirmemail' => 'Potrditev naslova elektronske pošte',
-'confirmemail_noemail' => 'Nimate doloÄenega veljavnega e-poÅ¡tnega naslova v vaÅ¡ih [[Special:Preferences|uporabniÅ¡kih nastavitvah]].',
-'confirmemail_text' => 'Za uporabo e-poštnih možnosti {{GRAMMAR:rodilnik|{{SITENAME}}}} morate najprej potrditi svoj e-poštni naslov.
+'confirmemail' => 'Potrditev naslova elektronske pošte',
+'confirmemail_noemail' => 'Nimate doloÄenega veljavnega e-poÅ¡tnega naslova v vaÅ¡ih [[Special:Preferences|uporabniÅ¡kih nastavitvah]].',
+'confirmemail_text' => 'Za uporabo e-poštnih možnosti {{GRAMMAR:rodilnik|{{SITENAME}}}} morate najprej potrditi svoj e-poštni naslov.
S klikom spodnjega gumba poÅ¡ljite nanj potrditveno sporoÄilo in sledite prejetim navodilom.
Ali ste svoj e-poštni naslov že potrdili, lahko preverite v nastavitvah.',
-'confirmemail_pending' => 'Potrditveno geslo vam je že bilo poslano; Äe ste pred kratkim ustvarili svoj raÄun, boste na njega morali poÄakati nekaj minut da prispe, preden boste poskuÅ¡ali zahtevali novo geslo.',
-'confirmemail_send' => 'PoÅ¡lji mi potrditveno sporoÄilo',
-'confirmemail_sent' => 'Potrditveno e-sporoÄilo je bilo poslano.',
-'confirmemail_oncreate' => 'Potrditveno geslo je bilo poslano na vaš e-poštni naslov.
+'confirmemail_pending' => 'Potrditveno geslo vam je že bilo poslano; Äe ste pred kratkim ustvarili svoj raÄun, boste na njega morali poÄakati nekaj minut da prispe, preden boste poskuÅ¡ali zahtevali novo geslo.',
+'confirmemail_send' => 'PoÅ¡lji mi potrditveno sporoÄilo',
+'confirmemail_sent' => 'Potrditveno e-sporoÄilo je bilo poslano.',
+'confirmemail_oncreate' => 'Potrditveno geslo je bilo poslano na vaš e-poštni naslov.
To geslo ni potrebno za vpis, vendar ga boste morali vnesti pred omogoÄanjem katere koli funkcije temeljeÄe na e-poÅ¡ti na wikiju.',
-'confirmemail_sendfailed' => 'Potrditvenega sporoÄila ni bilo mogoÄe poslati.
+'confirmemail_sendfailed' => 'Potrditvenega sporoÄila ni bilo mogoÄe poslati.
Prosimo, preverite, Äe niste naslova vnesli napaÄno.
Posrednik e-pošte je vrnil: $1',
-'confirmemail_invalid' => 'Potrditveno geslo je neveljavno. Morda je poteklo.',
-'confirmemail_needlogin' => 'Za potrditev svojega e-poštnega naslova se morate $1.',
-'confirmemail_success' => 'Vaš e-poštni naslov je potrjen. Zdaj se lahko prijavite in uporabljate wiki.',
-'confirmemail_loggedin' => 'Svoj elektronski naslov ste uspešno potrdili.',
-'confirmemail_error' => 'Vaša potrditev se žal ni shranila.',
-'confirmemail_subject' => 'Potrditev e-poštnega naslova',
-'confirmemail_body' => 'Nekdo, verjetno vi, z IP-naslovom $1,
+'confirmemail_invalid' => 'Potrditveno geslo je neveljavno. Morda je poteklo.',
+'confirmemail_needlogin' => 'Za potrditev svojega e-poštnega naslova se morate $1.',
+'confirmemail_success' => 'Vaš e-poštni naslov je potrjen. Zdaj se lahko prijavite in uporabljate wiki.',
+'confirmemail_loggedin' => 'Svoj elektronski naslov ste uspešno potrdili.',
+'confirmemail_error' => 'Vaša potrditev se žal ni shranila.',
+'confirmemail_subject' => 'Potrditev e-poštnega naslova',
+'confirmemail_body' => 'Nekdo, verjetno vi, z IP-naslovom $1,
je v {{GRAMMAR:dajalnik|{{SITENAME}}}} ustvaril raÄun »$2« in zanj vpisal ta elektronski naslov.
Da bi potrdili, da ta raÄun resniÄno pripada vam in s tem
@@ -3094,8 +3200,36 @@ in tako prekliÄite potrditev elektronskega naslova:
$5
Potrditvena koda bo potekla $4.',
-'confirmemail_invalidated' => 'Potrditev e-poštnega naslova preklicana',
-'invalidateemail' => 'PrekliÄi potrditev e-poÅ¡tnega naslova',
+'confirmemail_body_changed' => 'Nekdo, najverjetneje vi, je z IP-naslova $1
+na strani {{SITENAME}} spremenil e-poÅ¡tni naslov raÄuna »$2« na ta naslov.
+
+Da potrdite lastniÅ¡tvo tega raÄuna in ponovno aktivirate
+e-poštne funkcije na {{GRAMMAR:dajalnik|{{SITENAME}}}}, odprite to povezavo v vašem brskalniku:
+
+$3
+
+ÄŒe omenjeni raÄun *ni* vaÅ¡, sledite spodnji povezavi za preklic
+potrditve e-poštnega naslova:
+
+$5
+
+Potrditvena koda poteÄe $4.',
+'confirmemail_body_set' => 'Nekdo, najverjetneje vi, je z IP-naslova $1
+na strani {{SITENAME}} nastavil e-poÅ¡tni naslov raÄuna »$2« na ta naslov.
+
+Da potrdite lastniÅ¡tvo tega raÄuna in ponovno aktivirate
+e-poštne funkcije na {{GRAMMAR:dajalnik|{{SITENAME}}}}, odprite to povezavo v vašem brskalniku:
+
+$3
+
+ÄŒe omenjeni raÄun *ni* vaÅ¡, sledite spodnji povezavi za preklic
+potrditve e-poštnega naslova:
+
+$5
+
+Potrditvena koda poteÄe $4.',
+'confirmemail_invalidated' => 'Potrditev e-poštnega naslova preklicana',
+'invalidateemail' => 'PrekliÄi potrditev e-poÅ¡tnega naslova',
# Scary transclusion
'scarytranscludedisabled' => '[PrevkljuÄevanje med wikiji je onemogoÄeno]',
@@ -3137,6 +3271,7 @@ Prosimo, potrdite, da jo resniÄno želite znova ustvariti.",
'table_pager_first' => 'Prva stran',
'table_pager_last' => 'Zadnja stran',
'table_pager_limit' => 'Prikaži $1 postavk na stran',
+'table_pager_limit_label' => 'Postavk na stran:',
'table_pager_limit_submit' => 'Pojdi',
'table_pager_empty' => 'Ni zadetkov',
@@ -3194,6 +3329,7 @@ Uporabite lahko tudi [[Special:Watchlist/edit|standardni urejevalnik]].',
'version-specialpages' => 'Posebne strani',
'version-parserhooks' => 'RazÅ¡iritve razÄlenjevalnika',
'version-variables' => 'Spremenljivke',
+'version-skins' => 'Kože',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'Upravljavci predstavnostnih vsebin',
'version-hooks' => 'Razširitve',
@@ -3205,6 +3341,13 @@ Uporabite lahko tudi [[Special:Watchlist/edit|standardni urejevalnik]].',
'version-hook-subscribedby' => 'NaroÄen s strani',
'version-version' => '(RazliÄica $1)',
'version-license' => 'Dovoljenje',
+'version-poweredby-credits' => "Ta wiki poganja '''[http://www.mediawiki.org/ MediaWiki]''', vse pravice pridržave © 2001-$1 $2.",
+'version-poweredby-others' => 'drugi',
+'version-license-info' => 'MediaWiki je prosto programje; lahko ga razÅ¡irjate in / ali spreminjate pod pogoji GNU General Public License, kot ga je objavila Free Software Foundation; bodisi License razliÄice 2 ali (po vaÅ¡i izbiri) katere koli poznejÅ¡e razliÄice.
+
+MediaWiki je razÅ¡irjan v upanju, da bo uporaben, vendar BREZ KAKRÅ NEGA KOLI ZAGOTOVILA; tudi brez posrednega jamstva PRODAJNE VREDNOSTI ali PRIMERNOSTI ZA DOLOÄŒEN NAMEN. Oglejte si GNU General Public License za veÄ podrobnosti.
+
+Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo GNU General Public License]; Äe je niste, piÅ¡ite Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ali jo [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html preberite na spletu].',
'version-software' => 'NameÅ¡Äena programska oprema',
'version-software-product' => 'Izdelek',
'version-software-version' => 'RazliÄica',
@@ -3275,6 +3418,15 @@ Vnesite ime datoteke brez predpone »{{ns:image}}:«.',
'tags-edit' => 'uredi',
'tags-hitcount' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
+# Special:ComparePages
+'comparepages' => 'Primerjaj strani',
+'compare-selector' => 'Primerjaj redakcije strani',
+'compare-page1' => 'Stran 1',
+'compare-page2' => 'Stran 2',
+'compare-rev1' => 'Redakcija 1',
+'compare-rev2' => 'Redakcija 2',
+'compare-submit' => 'Primerjaj',
+
# Database error messages
'dberr-header' => 'Ta wiki ima težavo',
'dberr-problems' => 'Oprostite!
@@ -3292,8 +3444,13 @@ Ta stran se sooÄa s tehniÄnimi težavami.',
'htmlform-float-invalid' => 'Vrednost, ki ste jo vnesli, ni Å¡tevilo.',
'htmlform-int-toolow' => 'Vrednost, ki ste jo vnesli, je manjša od najmanjše dovoljene vrednosti $1',
'htmlform-int-toohigh' => 'Vrednost, ki ste jo vnesli, je veÄja od najveÄje dovoljene vrednosti $1',
+'htmlform-required' => 'Ta vrednost je zahtevana',
'htmlform-submit' => 'Pošlji',
'htmlform-reset' => 'Razveljavi spremembe',
'htmlform-selectorother-other' => 'Drugo',
+# SQLite database support
+'sqlite-has-fts' => '$1 s podporo iskanju polnih besedil',
+'sqlite-no-fts' => '$1 brez podpore iskanju polnih besedil',
+
);
diff --git a/languages/messages/MessagesSli.php b/languages/messages/MessagesSli.php
index bac2d401..dc75586a 100644
--- a/languages/messages/MessagesSli.php
+++ b/languages/messages/MessagesSli.php
@@ -37,8 +37,7 @@ $messages = array(
'tog-editsection' => 'Verknipfunga zim Beoarbeeta voo eenzelna Obschieta oazeega',
'tog-editsectiononrightclick' => 'Eenzelne Obschniete dorch Rechtsklick beoarbeeta (JavaScript)',
'tog-showtoc' => 'Inhaltsverzeichnis aozäan bei meh wie drei Ieberschrifta',
-'tog-rememberpassword' => 'Notzer sull uff de Lengde oagemeldt blein (login uff diesem Rechner speichern)',
-'tog-editwidth' => 'Eingabefeld erweitern, im dann ganza Bildschirm auszufiella',
+'tog-rememberpassword' => 'Notzer sull uff de Lengde oagemeldt blein (login uff diesem Rechner speichern) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Salber derstallte Seyta automatisch beobachta',
'tog-watchdefault' => 'Salber geänderte on neu erstellte Seyta automatisch beobachta (zu menner Beobachtungsliste hinzufügen)',
'tog-watchmoves' => 'Vo merr salber verschobene Seyta autoatisch beobachta',
@@ -65,74 +64,31 @@ $messages = array(
'tog-watchlisthideliu' => 'Bearbeitungen angemeldeter Benutzer ausblenden',
'tog-watchlisthideanons' => 'Bearbeitungen anonymer Benutzer (IP-Adressen) ausblenden',
'tog-watchlisthidepatrolled' => 'Kontrollierte Änderungen ei der Beobachtungsliste ausblenda',
-'tog-nolangconversion' => 'Konvertierung von Sprachvarianten deaktivieren',
-'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende',
-'tog-diffonly' => 'Zeige beim Versionsvergleich nur die Unterschiede, nicht die vollständige Seite',
'tog-showhiddencats' => 'Vestackte Kategorien oazäan',
'tog-norollbackdiff' => 'Underschied noachm Zericksatza underdricka',
-'underline-always' => 'immer',
-'underline-never' => 'nie',
'underline-default' => 'obhängig voo dan Eistellunga der Suchmaschine',
# Font style option in Special:Preferences
'editfont-style' => 'Schriftfamilie fier dann Text eim Beorbeetungsfanster:',
'editfont-default' => 'obhängig voo dan Eistellunga der Suchmaschine',
'editfont-monospace' => 'Schrift miet faster Zeechabreite',
-'editfont-sansserif' => 'Serifenlose Groteskschrift',
'editfont-serif' => 'Schrift miet Serifen',
# Dates
-'sunday' => 'Sunntich',
-'monday' => 'Montich',
-'tuesday' => 'Dienstich',
-'wednesday' => 'Mietwuch',
-'thursday' => 'Dunnstich',
-'friday' => 'Freitich',
-'saturday' => 'Sinnomd',
-'sun' => 'Su',
-'mon' => 'Mu',
-'tue' => 'Di',
-'wed' => 'Mi',
-'thu' => 'Du',
-'fri' => 'Fr',
-'sat' => 'Si',
-'january' => 'Januar',
-'february' => 'Februar',
-'march' => 'März',
-'april' => 'Oapril',
-'may_long' => 'Mai',
-'june' => 'Juni',
-'july' => 'Juli',
-'august' => 'August',
-'september' => 'September',
-'october' => 'Oktober',
-'november' => 'November',
-'december' => 'Dezember',
-'january-gen' => 'Januar',
-'february-gen' => 'Februars',
-'march-gen' => 'Märzes',
-'april-gen' => 'Aprils',
-'may-gen' => 'Mais',
-'june-gen' => 'Junis',
-'july-gen' => 'Julis',
-'august-gen' => 'Augusts',
-'september-gen' => 'Septembers',
-'october-gen' => 'Oktobers',
-'november-gen' => 'Novembers',
-'december-gen' => 'Dezembers',
-'jan' => 'Jan.',
-'feb' => 'Feb.',
-'mar' => 'Mär.',
-'apr' => 'Apr.',
-'may' => 'Mai',
-'jun' => 'Jun.',
-'jul' => 'Jul.',
-'aug' => 'Aug.',
-'sep' => 'Sep.',
-'oct' => 'Okt.',
-'nov' => 'Nov.',
-'dec' => 'Dez.',
+'sunday' => 'Sunntich',
+'monday' => 'Montich',
+'tuesday' => 'Dienstich',
+'wednesday' => 'Mietwuch',
+'thursday' => 'Dunnstich',
+'friday' => 'Freitich',
+'saturday' => 'Sinnomd',
+'sun' => 'Su',
+'mon' => 'Mu',
+'thu' => 'Du',
+'sat' => 'Si',
+'april' => 'Oapril',
+'january-gen' => 'Januar',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Heetgruppe|Heetgruppa}}',
@@ -168,103 +124,66 @@ $messages = array(
'moredotdotdot' => 'Mehr ...',
'mypage' => 'Eigene Seyte',
'mytalk' => 'Mei Dischkur',
-'anontalk' => 'Diskussionsseite dieser IP',
-'navigation' => 'Navigation',
'and' => ',&#32;und',
# Cologne Blue skin
'qbfind' => 'Fenda',
-'qbbrowse' => 'Blättern',
'qbedit' => 'Ändern',
'qbpageoptions' => 'Seytaoptiona',
'qbpageinfo' => 'Seytadata',
'qbmyoptions' => 'Menne Seyta',
'qbspecialpages' => 'Spezialseyta',
-'faq' => 'FAQ',
-'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Obschnitt hinzufiega',
-'vector-action-delete' => 'Läscha',
-'vector-action-move' => 'Verschieba',
-'vector-action-protect' => 'Schützen',
-'vector-action-undelete' => 'Wiederherstella',
-'vector-action-unprotect' => 'Freigahn',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Hilfeseyte',
-'vector-namespace-image' => 'Datei',
-'vector-namespace-main' => 'Seyte',
-'vector-namespace-media' => 'Mediaseyte',
-'vector-namespace-mediawiki' => 'MediaWiki-Systemtext',
-'vector-namespace-project' => 'Projektseyte',
-'vector-namespace-special' => 'Spezialseyte',
-'vector-namespace-talk' => 'Dischkur',
-'vector-namespace-template' => 'Vierlooche',
-'vector-namespace-user' => 'Notzerseyte',
-'vector-view-create' => 'Erstella',
-'vector-view-edit' => 'Bearbeita',
-'vector-view-history' => 'Versionsgeschichte',
-'vector-view-view' => 'Lessa',
-'vector-view-viewsource' => 'Quelltext siehn',
-'actions' => 'Aksjonna',
-'namespaces' => 'Noamensraum:',
-'variants' => 'Varianta',
-
-'errorpagetitle' => 'Fehler',
-'returnto' => 'Zurück zur Seite $1.',
-'tagline' => 'Aus {{SITENAME}}',
-'help' => 'Hilfe',
-'search' => 'Siche',
-'searchbutton' => 'Sicha',
-'go' => 'Ausfiehrn',
-'searcharticle' => 'Seyte',
-'history' => 'Versionen',
-'history_short' => 'Geschichte',
-'updatedmarker' => '(geändert)',
-'info_short' => 'Information',
-'printableversion' => 'Druckversion',
-'permalink' => 'Permanentlink',
-'print' => 'Drucken',
-'edit' => 'Beoarbeita',
-'create' => 'Erstella',
-'editthispage' => 'Seyte beoarbeeta',
-'create-this-page' => 'Seyte erstella',
-'delete' => 'Löschen',
-'deletethispage' => 'Diese Seyte löschen',
-'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versionen}} wiederherstellen',
-'protect' => 'Schützen',
-'protect_change' => 'ändern',
-'protectthispage' => 'Seite schützen',
-'unprotect' => 'Freigahn',
-'unprotectthispage' => 'Schutz aufheben',
-'newpage' => 'Neue Seyte',
-'talkpage' => 'Diskussion',
-'talkpagelinktext' => 'Dischkur',
-'specialpage' => 'Spezialseyte',
-'personaltools' => 'Persönliche Werkzeuge',
-'postcomment' => 'Neuer Obschnitt',
-'articlepage' => 'Seyte',
-'talk' => 'Dischkur',
-'views' => 'Oansichta',
-'toolbox' => 'Werkzeuge',
-'userpage' => 'Nutzerseyte oazeiga',
-'projectpage' => 'Projektseyte',
-'imagepage' => 'Dateiseyte oazeiga',
-'mediawikipage' => 'Dischkurseyte oazeiga',
-'templatepage' => 'Vurloogaseyte oazeiga',
-'viewhelppage' => 'Hilfeseyte oanzeiga',
-'categorypage' => 'Heetgruppeseyte oazeiga',
-'viewtalkpage' => 'Dischkur',
-'otherlanguages' => 'Ei andern Sproacha',
-'redirectedfrom' => '(Weitergeleitet vo $1)',
-'redirectpagesub' => 'Weiterleitung',
-'lastmodifiedat' => 'Diese Seyte wurde zuletzt oam $1 im $2 Seeger geändert.',
-'viewcount' => 'Diese Seyte wurde bisher {{PLURAL:$1|eimuol|$1 times}} oabgerufa.',
-'protectedpage' => 'Geschützte Seyte',
-'jumpto' => 'Wechseln zu:',
-'jumptonavigation' => 'Navigation',
-'jumptosearch' => 'Siche',
-'view-pool-error' => 'Entschuldigung, de Server sein eim Moment ieberlastet.
+'vector-action-addsection' => 'Obschnitt hinzufiega',
+'vector-action-delete' => 'Läscha',
+'vector-action-move' => 'Verschieba',
+'vector-action-undelete' => 'Wiederherstella',
+'vector-action-unprotect' => 'Freigahn',
+'vector-view-create' => 'Erstella',
+'vector-view-edit' => 'Bearbeita',
+'vector-view-view' => 'Lessa',
+'vector-view-viewsource' => 'Quelltext siehn',
+'actions' => 'Aksjonna',
+'namespaces' => 'Noamensraum:',
+'variants' => 'Varianta',
+
+'search' => 'Siche',
+'searchbutton' => 'Sicha',
+'go' => 'Ausfiehrn',
+'searcharticle' => 'Seyte',
+'history_short' => 'Geschichte',
+'updatedmarker' => '(geändert)',
+'permalink' => 'Permanentlink',
+'edit' => 'Beoarbeita',
+'create' => 'Erstella',
+'editthispage' => 'Seyte beoarbeeta',
+'create-this-page' => 'Seyte erstella',
+'deletethispage' => 'Diese Seyte löschen',
+'unprotect' => 'Freigahn',
+'newpage' => 'Neue Seyte',
+'talkpage' => 'Diskussion',
+'talkpagelinktext' => 'Dischkur',
+'specialpage' => 'Spezialseyte',
+'postcomment' => 'Neuer Obschnitt',
+'articlepage' => 'Seyte',
+'talk' => 'Dischkur',
+'views' => 'Oansichta',
+'userpage' => 'Nutzerseyte oazeiga',
+'projectpage' => 'Projektseyte',
+'imagepage' => 'Dateiseyte oazeiga',
+'mediawikipage' => 'Dischkurseyte oazeiga',
+'templatepage' => 'Vurloogaseyte oazeiga',
+'viewhelppage' => 'Hilfeseyte oanzeiga',
+'categorypage' => 'Heetgruppeseyte oazeiga',
+'viewtalkpage' => 'Dischkur',
+'otherlanguages' => 'Ei andern Sproacha',
+'redirectedfrom' => '(Weitergeleitet vo $1)',
+'lastmodifiedat' => 'Diese Seyte wurde zuletzt oam $1 im $2 Seeger geändert.',
+'viewcount' => 'Diese Seyte wurde bisher {{PLURAL:$1|eimuol|$1 times}} oabgerufa.',
+'protectedpage' => 'Geschützte Seyte',
+'jumptosearch' => 'Siche',
+'view-pool-error' => 'Entschuldigung, de Server sein eim Moment ieberlastet.
Zu viele Benutzer versicha, diese Seyte zu besicha.
Bitte warte eenige Minuta, bevor du is noo eemoll versichst.
@@ -275,11 +194,7 @@ $1',
'aboutpage' => 'Project:Ieber',
'copyright' => 'Inhalt ies verfügbar unter der $1.',
'copyrightpage' => '{{ns:project}}:Urheberrecht',
-'currentevents' => 'Aktuelle Ereignisse',
-'currentevents-url' => 'Project:Aktuelle Ereignisse',
-'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
-'edithelp' => 'Bearbeitungshilfe',
'edithelppage' => 'Help:Bearbeitungshilfe',
'helppage' => 'Help:Hilfe',
'mainpage' => 'Heetseyte',
@@ -287,17 +202,13 @@ $1',
'policy-url' => 'Project:Leitlinien',
'portal' => '{{SITENAME}}-Portal',
'portal-url' => 'Project:Nutzerportal',
-'privacy' => 'Datenschutz',
-'privacypage' => 'Project:Datenschutz',
'badaccess' => 'Kenne ausreichenden Rechte',
-'badaccess-group0' => 'Du hast nicht die erforderliche Berechtigung für diese Aktion.',
'badaccess-groups' => 'Diese Aktion ies beschränkt uff Benutzer, de {{PLURAL:$2|der Gruppe|anner der Gruppen}} „$1“ angehören.',
'versionrequired' => 'Version $1 vo MediaWiki ies erforderlich',
'versionrequiredtext' => 'Version $1 vo MediaWiki ies erforderlich, im diese Seyte zu nutza. Siehe de [[Special:Version|Versionsseyte]]',
-'ok' => 'OK',
'retrievedfrom' => 'voo "$1"',
'youhavenewmessages' => 'Du hust $1 ($2).',
'newmessageslink' => 'Neue Noachrichta',
@@ -315,7 +226,6 @@ $1',
'thisisdeleted' => '$1 oanseha oder wiederherstella?',
'viewdeleted' => '$1 oanzeega?',
'restorelink' => '$1 {{PLURAL:$1|gelöschte Version|gelöschte Versiona}}',
-'feedlinks' => 'Feed:',
'feed-invalid' => 'Ungültiger Abonnement-Typ.',
'feed-unavailable' => 'Es steha keene Feeds zur Verfiegung.',
'site-rss-feed' => 'RSS-Feed fier $1',
@@ -330,14 +240,11 @@ $1',
'nstab-media' => 'Media',
'nstab-special' => 'Spezialseyte',
'nstab-project' => 'Portalseyte',
-'nstab-image' => 'Datei',
'nstab-mediawiki' => 'MediaWiki-Systemtext',
'nstab-template' => 'Vierlooche',
'nstab-help' => 'Hilfeseyte',
-'nstab-category' => 'Kategorie',
# Main script and global functions
-'nosuchaction' => 'Diese Aktion gibt es nicht',
'nosuchactiontext' => "De ei dar URL oagegebene Aksjonn werd vu MediaWiki ne understietzt.
Is koan a Schreibfahler ei dar URL vorliega oder is wurde a fahlerhafter Link oageklickt.
Is koan siech au im an'n Programmierfahler ei dar Software, de uff {{SITENAME}} benutzt werd, handeln.",
@@ -347,7 +254,6 @@ Is koan siech au im an'n Programmierfahler ei dar Software, de uff {{SITENAME}}
Oalle verfügbara Spezialseyta sein ei der [[Special:SpecialPages|Liste der Spezialseyta]] zu finda.',
# General errors
-'error' => 'Fehler',
'databaseerror' => 'Fehler ei der Datenbank',
'dberrortext' => 'Is ies a Datenbankfahler uffgetreten.
Dar Grund koan a Programmierfahler sei.
@@ -360,30 +266,8 @@ De letzte Datenbankobfroage lautete: „$1“ aus dar Funksjonn „<tt>$2</tt>â€
De Datenbank meldete dann Fahler: „<tt>$3: $4</tt>“.",
'laggedslavemode' => 'Achtung: Die angezeigte Seite enthält unter Umständen nicht die jüngsten Bearbeitungen.',
'readonly' => 'Datenbanksperre',
-'enterlockreason' => 'Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
-'readonlytext' => 'Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuche es später noch einmal.
-
-Grund der Sperrung: $1',
-'missing-article' => 'Der Text für „$1“ $2 wurde nicht in der Datenbank gefunden.
-
-Die Seite ist möglicherweise gelöscht oder verschoben worden.
-
-Falls dies nicht der Fall ist, hast du eventuell einen Fehler in der Software gefunden. Bitte melde dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.',
-'missingarticle-rev' => '(Versionsnummer: $1)',
-'missingarticle-diff' => '(Unterschied zwischen Versionen: $1, $2)',
-'readonly_lag' => 'Die Datenbank wurde automatisch für Schreibzugriffe gesperrt, damit sich die verteilten Datenbankserver (slaves) mit dem Hauptdatenbankserver (master) abgleichen können.',
-'internalerror' => 'Interner Fehler',
-'internalerror_info' => 'Interner Fehler: $1',
'fileappenderror' => 'Konnte „$1“ ne oa „$2“ oahänga.',
-'filecopyerror' => 'Die Datei „$1“ konnte nicht nach „$2“ kopiert werden.',
-'filerenameerror' => 'Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.',
-'filedeleteerror' => 'Die Datei „$1“ konnte nicht gelöscht werden.',
-'directorycreateerror' => 'Das Verzeichnis „$1“ konnte nicht angelegt werden.',
-'filenotfound' => 'Die Datei „$1“ wurde nicht gefunden.',
-'fileexistserror' => 'In die Datei „$1“ konnte nicht geschrieben werden, da die Datei bereits vorhanden ist.',
'unexpected' => 'Unerwarteter Wert: „$1“=„$2“.',
-'formerror' => 'Fehler: Die Eingaben konnten nicht verarbeitet werden.',
-'badarticleerror' => 'Diese Aktion kann auf diese Seite nicht angewendet werden.',
'cannotdelete' => 'De Seyte oder Datei „$1“ koan ne geläscht waan.
Meeglicherweise wurde se bereits vu jemand anders entfernt.',
'badtitle' => 'Ungültiger Tittel',
@@ -428,9 +312,8 @@ Beachte, doas einige Seyta noo oazeiga kinna, doas du oagemeldet best, sulange d
Dei Benutzerkonto wurde eigerichtet.
Vergiss nä, denne [[Special:Preferences|{{SITENAME}}-Eistellunga]] oazupoassa.',
'yourname' => 'Benutzernoame:',
-'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort wiederhola:',
-'remembermypassword' => 'uff diesem Computer dauerhaft oanmelda',
+'remembermypassword' => 'uff diesem Computer dauerhaft oanmelda (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Denne Domain:',
'externaldberror' => 'Entweder is leit a Fahler bei der externa Authentifizierung vur, oder du darfst dei externes Benutzerkonto ne aktualisiera.',
'login' => 'Oanmelda',
@@ -519,10 +402,6 @@ Meeglicherweise host du dei Poaßwurt bereits erfolgreich geändert oder a neues
'resetpass-temp-password' => 'Temporäres Poaßwurt:',
# Edit page toolbar
-'bold_sample' => 'Fetter Text',
-'bold_tip' => 'Fetter Text',
-'italic_sample' => 'kursiver Text',
-'italic_tip' => 'kursiver Text',
'link_sample' => 'Verknipfungstext',
'link_tip' => 'Interne Verknipfung',
'extlink_sample' => 'http://www.example.com Verknipfungstittel',
@@ -530,25 +409,19 @@ Meeglicherweise host du dei Poaßwurt bereits erfolgreich geändert oder a neues
'headline_sample' => 'Ieberschreft (Ebene 2)',
'headline_tip' => 'Ebene 2 Ieberschreft',
'math_sample' => 'Formel hier eifiega',
-'math_tip' => 'mathematische Formel (LaTeX)',
'nowiki_sample' => 'unformatierta Text hier eifiega',
'nowiki_tip' => 'unformatierter Text (nowiki)',
-'image_sample' => 'Beispiel.jpg',
'image_tip' => 'Verknipfung miet Datei',
-'media_sample' => 'Beispiel.ogg',
'media_tip' => 'Verknipfung miet Mediadatei',
'sig_tip' => 'Denne Underschrift miet Zeetstempel',
'hr_tip' => 'Hurizuntale Linie (sporsam verwenda)',
# Edit pages
'summary' => 'Zusammafoassung:',
-'subject' => 'Betreff:',
'minoredit' => 'Ocke Kleenigkeeta wurda verändert',
'watchthis' => 'Diese Seyte beoboachta',
'savearticle' => 'Seyte oabspeichern',
-'preview' => 'Vorschau',
'showpreview' => 'Vorschau zeega',
-'showlivepreview' => 'Live-Vorschau',
'showdiff' => 'Änderunga zeega',
'anoneditwarning' => "Du beorbeetest diese Seyte unoagemeldet. Wenn du speicherst, wird denne aktuelle IP-Atresse ei dar Versionsgeschichte uffgezeechnet on ies damit unwiderruflich '''eeffentlich''' einsehbar.",
'missingsummary' => "'''Hinweis:''' Du host kenne Zusommafassung oagegahn. Wenn du erneut uff „Seyte speichern“ klickst, werd denne Änderung ohne Zusommafassung iebernumma.",
@@ -597,7 +470,6 @@ Bitte fiege olle Informationa jeder Oafroage hinzu, de du stallt.",
'loginreqlink' => 'Oanmelda',
'loginreqpagetext' => 'Du mußt diech $1, im Seyta lasa zu kinna.',
'accmailtitle' => 'Passwurt wourde verschickt',
-'newarticle' => '(Neu)',
'newarticletext' => "Du best an'm Link zu a'r Seyte gefolgt, de ne vorhanden ies.
Im de Seyte oazulega, trage denn Text ei de undastehende Box a (siehe de [[{{MediaWiki:Helppage}}|Hilfeseyte]] fier meh Informationen).
Best du fälschlicherweise hier, klicke de '''Zerricke'''-Schaltfläche dennes Browsers.",
@@ -617,9 +489,7 @@ oder ei dann zugehieriga <span class="plainlinks">[{{fullurl:{{#special:Log}}|pa
'''Beachte:''' Noach damm Speichern mußt du dennen Browser oaweisa, de neue Version zu loada: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
'userjspreview' => "== Vurschau Dennes Nutzer-JavaScript ==
'''Beachte:''' Noach damm Speichern mußt du dennen Browser oaweisa, de neue Version zu loada: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
-'userinvalidcssjstitle' => "'''OCHTICHE:''' Skin „$1“ existiert ne. Bedenke, doß nutzerspezifische .css- und .js-Seyta miet a'm Kleenbuchstaba oafanga missa, olso beispielsweise ''{{ns:user}}:Mustermann/monobook.css'' oa Stalle vu ''{{ns:user}}:Mustermoan/Monobook.css''.",
-'updated' => '(Geändert)',
-'note' => "'''Hinweis:'''",
+'userinvalidcssjstitle' => "'''OCHTICHE:''' Skin „$1“ existiert ne. Bedenke, doß nutzerspezifische .css- und .js-Seyta miet a'm Kleenbuchstaba oafanga missa, olso beispielsweise ''{{ns:user}}:Mustermann/vector.css'' oa Stalle vu ''{{ns:user}}:Mustermoan/Vector.css''.",
'previewnote' => "'''Dies ies oack eene Vorschau, de Seyte wurde noo nee gespeichert!'''",
'previewconflict' => 'Diese Vurschau gitt dann Inhalt des obern Textfeldes wieder. Su werd de Seyte aussahn, wenn du jitz speicherst.',
'session_fail_preview' => "'''Denne Beoarbeetung konnte ne gespeichert waan, do Sitzungsdaten verlorn geganga sein.
@@ -643,7 +513,6 @@ Doas undere Textfeld enthält denne Änderungen.
Bitte fiege denne Änderungen ei doas obere Textfeld a.
'''Ock''' dar Inhalt des oberen Textfeldes werd gespeichert, wenn du uff „{{int:savearticle}}“ klickst!",
'yourtext' => 'Deen Text',
-'storedversion' => 'Gespeicherte Version',
'nonunicodebrowser' => "'''Ochtiche:''' Dei Browser koan Unicode-Zeicha ne richtig veroarbeeta. Bitte verwende a'n andern Browser im Seyta zu beoarbeeta.",
'editingold' => "'''OCHTICHE: Du beoarbeetest anne aale Version dieser Seyte. Wenn du speicherst, waan olle neueren Versionen ieberschrieba.'''",
'yourdiff' => 'Underschiede',
@@ -655,8 +524,6 @@ Reiche hier kenne Texte a, falls du ne wielst, doß diese ohne Einschränkung ge
Du bestätigst hiermit au, doß du diese Texte selbst geschrieba host oder diese vu a'r gemeinfreien Quelle kopiert host
(siehe $1 fier wettere Details). '''IEBERTRAGE OHNE GENEHMIGUNG KENNE URHEBERRECHTLICH GESCHIETZTEN INHALTE!'''",
-'longpagewarning' => "'''Warnung:''' Diese Seyte ies $1 KB gruß; einige Browser kinnta Probleme hoan, Seyta zu beoarbeeta, de grießer ols 32 KB sein.
-Ieberlege bitte, ob anne Uffteilung dar Seyte ei klennere Obschnitte meeglich ies.",
'longpageerror' => "'''Fahler: Dar Text, dann du zu speichern versuchst, ies $1 KB gruß. Doas ies grießer ols doas erlaubte Maximum vu $2 KB – Speicherung ne meeglich.'''",
'readonlywarning' => "'''OCHTICHE: De Datenbank wurde fier Wartungsoarbeeta gesperrt, su doaß denne Änderunga derzeit ne gespeichert waan kinna.
Sechere dann Text bitte lokal uff demm Computer und versiche zu a'm späteren Zeitpunkt, de Änderunga zu iebertraga.'''
@@ -675,7 +542,6 @@ Grund fier de Sperre: $1",
'nocreatetitle' => 'De Erstellung neuer Seyta ies eengeschränkt.',
'nocreatetext' => 'Uff {{SITENAME}} wurde doas Erstalla neuer Seyta eengeschränkt. Du koast bestiehende Seyten ändern oder diech [[Special:UserLogin|oamelda]].',
'nocreate-loggedin' => 'Du host kenne Berechtigung, neue Seyta zu erstalla.',
-'permissionserrors' => 'Berechtigungsfehler',
'permissionserrorstext' => 'Du best ne berechtigt, de Aksjonn auszufiehra. {{PLURAL:$1|Grund|Grinde}}:',
'permissionserrorstext-withaction' => 'Du best nee berechtigt, $2.
{{PLURAL:$1|Grund|Griende}}:',
@@ -719,26 +585,18 @@ Grund dar Sperre: ''$2''",
# History pages
'viewpagelogs' => 'Logbicher fier diese Seite oazeega',
'nohistory' => 'Is gitt kenne Versionsgeschichte fier diese Seyte.',
-'currentrev' => 'Aktuelle Version',
'currentrev-asof' => 'Aktuelle Version vum $1',
'revisionasof' => 'Version vum $1',
'revision-info' => 'Version vum $4, $5 Seeger vu $2',
'previousrevision' => '↠aale Version',
'nextrevision' => 'Neue Version →',
-'currentrevisionlink' => 'Aktuelle Version',
-'cur' => 'Aktuell',
-'next' => 'Nächste',
-'last' => 'Vorherige',
'page_first' => 'Oanfoang',
-'page_last' => 'Ende',
'histlegend' => 'Zerr Oazeege dar Änneronga eefach de zu vergleichenda Versiona auswähla on de Schaltfläche „{{int:compareselectedversions}}“ klicka.<br />
* (Aktuell) = Underschied zerr aktuella Version, (Vurherige) = Underschied zerr vurheriga Version
* Seegerzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Atresse des Beorbeeters, K = Kleene Ännerong',
'history-fieldset-title' => 'Suche ei dar Versionsgeschichtla',
'history-show-deleted' => 'ock geläschte Versiona',
'histfirst' => 'aalteste',
-'histlast' => 'Neueste',
-'historysize' => '({{PLURAL:$1|1 Byte|$1 Bytes}})',
'historyempty' => '(laar)',
# Revision feed
@@ -759,7 +617,6 @@ Nähere Oagaba zum Läschvorgang suwie anne Begrindung fenda siech eim [{{fullur
'rev-suppressed-text-view' => "Diese Version wurde '''underdrickt'''.
Administratorn kinna se eensahn; Details stiehn eim [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Underdrickungs-Logbuch].",
'rev-delundel' => 'zeege/verstecke',
-'rev-showdeleted' => 'zeige',
'revisiondelete' => 'Versiona löscha/wiederherstella',
'revdelete-nooldid-title' => 'Keene Version oangegeba',
'revdelete-nooldid-text' => 'Du host entweder kenne Version oagegahn, uff de diese Aksjonn ausgefiehrt waan sull, de gewählte Version ies ne vorhanden oder du versichst, de aktuelle Version zu entferna.',
@@ -790,15 +647,12 @@ $1",
'logdelete-success' => "'''Logbuchoasecht erfolgreich geändert.'''",
'logdelete-failure' => "'''Logbuchsichtbarkeit koan ne geändert waan:'''
$1",
-'revdel-restore' => 'Sichtbarkeit ändern',
-'pagehist' => 'Versionsgeschichte',
'deletedhist' => 'Geläschte Versiona',
'revdelete-content' => 'Seytainhoalt',
'revdelete-summary' => 'Zusommafoassungskommentar',
'revdelete-uname' => 'Benutzernoame',
'revdelete-restricted' => 'Einschränkungen gelten au fier Administratorn',
'revdelete-unrestricted' => 'Einschränkungen fier Administratorn uffgehobn',
-'revdelete-hid' => 'versteckte $1',
'revdelete-unhid' => 'machte $1 wieder effentlich',
'revdelete-log-message' => '$1 fier $2 {{PLURAL:$2|Version|Versiona}}',
'logdelete-log-message' => '$1 fier $2 {{PLURAL:$2|Logbucheintrag|Logbucheinträge}}',
@@ -823,7 +677,6 @@ Stelle secher, doaß de Versionsgeschichte a'r Seyte historisch korrekt ies.",
'mergehistory-list' => 'Versionen, de vereinigt waan kinna',
'mergehistory-merge' => 'De folgenda Versionen vu „[[:$1]]“ kinna noach „[[:$2]]“ iebertraga waan. Markiere de Version, bis zu dar (einschließlich) de Versionen iebertraga waan sulln. Bitte beachte, doaß de Nutzung dar Navigationslinks de Auswoahl zerrickesetzt.',
'mergehistory-go' => 'Zeige Versiona, de vereinigt waan kinna',
-'mergehistory-submit' => 'Vereinige Versionen',
'mergehistory-empty' => 'Is kinna kenne Versiona vereinigt waan.',
'mergehistory-success' => '{{PLURAL:$3|1 Version|$3 Versiona}} vu „[[:$1]]“ erfolgreich noach „[[:$2]]“ vereinigt.',
'mergehistory-fail' => 'Versionsvereinigung ne meeglich, bitte prife de Seyte und de Zeitoagaba.',
@@ -837,7 +690,6 @@ Stelle secher, doaß de Versionsgeschichte a'r Seyte historisch korrekt ies.",
'mergehistory-reason' => 'Begriendung:',
# Merge log
-'mergelog' => 'Vereinigungs-Logbuch',
'pagemerge-logentry' => 'vereinigte [[$1]] ei [[$2]] (Versionen bis $3)',
'revertmerge' => 'Vereinigung rieckgängig macha',
'mergelogpagetext' => 'Dies ies doas Logbuch dar vereinigta Versionsgeschichta.',
@@ -845,7 +697,6 @@ Stelle secher, doaß de Versionsgeschichte a'r Seyte historisch korrekt ies.",
# Diffs
'history-title' => 'Versionsgeschichte vun „$1“',
'difference' => '(Underschied zwischa Versiona)',
-'lineno' => 'Zeile $1:',
'compareselectedversions' => 'Gewählte Versiona vergleichen',
'editundo' => 'rieckgängig',
'diff-multi' => '(Dar Versionsvergleich bezieht {{PLURAL:$1|1 dazwischenliegende Version|$1 dazwischenliegende Versionen}} miet a.)',
@@ -863,61 +714,43 @@ Stelle secher, doaß de Versionsgeschichte a'r Seyte historisch korrekt ies.",
'notextmatches' => 'Kenne Iebereinstimmunga miet Inhalta',
'prevn' => 'vurherige {{PLURAL:$1|$1}}',
'nextn' => 'nächste {{PLURAL:$1|$1}}',
-'nextn-title' => '{{PLURAL:$1|Folgendes Ergebnis|Folgende $1 Ergebnisse}}',
'shown-title' => 'Zeige $1 {{PLURAL:$1|Ergebnis|Ergebnisse}} pro Seyte',
-'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Suchoptiona',
'searchmenu-exists' => "'''Is gitt anne Seyte, de dann Noama „[[:$1]]“ hoot'''",
'searchmenu-new' => "'''Erstalle de Seyte „[[:$1|$1]]“ ei diesem Wiki.'''",
-'searchhelp-url' => 'Help:Hilfe',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige olle Seyta, de miet damm Sichbegriff oafanga]]',
'searchprofile-articles' => 'Inhaltsseyta',
'searchprofile-project' => 'Helfe on Projektseyta',
-'searchprofile-images' => 'Multimedia',
'searchprofile-everything' => 'Olles',
-'searchprofile-advanced' => 'Erweitert',
'searchprofile-articles-tooltip' => 'Sucha ei $1',
'searchprofile-project-tooltip' => 'Sucha ei $1',
'searchprofile-images-tooltip' => 'Noach Bildern sucha',
'searchprofile-everything-tooltip' => 'Gesamta Inhalt durchsicha (inklusive Dischkursseyta)',
'searchprofile-advanced-tooltip' => 'Siche ei wettern Noamensräuma',
'search-result-size' => '$1 ({{PLURAL:$2|1 Wurt|$2 Wärter}})',
-'search-result-score' => 'Relevanz: $1 %',
'search-redirect' => '(Weiterleitung vu „$1“)',
'search-section' => '(Obschnitt $1)',
'search-suggest' => 'Meitest du „$1“?',
'search-interwiki-caption' => 'Schwasterprujätte',
-'search-interwiki-default' => '$1 Ergebnisse:',
-'search-interwiki-more' => '(weitere)',
'search-mwsuggest-enabled' => 'miet Vurschläga',
'search-mwsuggest-disabled' => 'kääne Vurschläge',
-'search-relatedarticle' => 'Verwandte',
'mwsuggest-disable' => 'Vurschläge per Ajax deaktiviern',
-'searchrelated' => 'verwandt',
'searchall' => 'olle',
'showingresults' => "Hier {{PLURAL:$1|ies '''1''' Ergebnis|sein '''$1''' Ergebnisse}}, beginnend miet Nummer '''$2.'''",
'showingresultsnum' => "Hier {{PLURAL:$3|ies '''1''' Ergebnis|sein '''$3''' Ergebnisse}}, beginnend miet Nummer '''$2.'''",
'showingresultsheader' => "{{PLURAL:$5|Ergebnis '''$1''' vu '''$3'''|Ergebnisse '''$1–$2''' vu '''$3'''}} fier '''$4'''",
'nonefound' => "'''Hinweis:''' Is waan standardmäßig ocke eenige Noamensräume dorchsucht. Setze ''all:'' vur denn Suchbegriff, im olle Seita (inkl. Diskussionsseiten, Vorlagen usw.) zu dorchsucha oder gezielt dan Noama des zu dorchsuchenden Noamensraumes.",
'search-nonefound' => 'Fier denne Sichoafroage wurden kenne Ergebnisse gefunda.',
-'powersearch' => 'Erweiterte Suche',
-'powersearch-legend' => 'Erweiterte Suche',
'powersearch-ns' => 'Suche ei Noamasräuma:',
'powersearch-redir' => 'Weiterleitunga oanzeega:',
'powersearch-field' => 'Suche noach:',
-'powersearch-togglelabel' => 'Wähle aus:',
'powersearch-toggleall' => 'Olle',
'powersearch-togglenone' => 'Kenne',
-'search-external' => 'Externe Suche',
'searchdisabled' => 'De {{SITENAME}}-Siche ies deaktiviert. Du koast underdessa miet Google sicha. Bitte bedenke, doaß dar Sichindex fier {{SITENAME}} veraltet sei koan.',
# Quickbar
-'qbsettings' => 'Seytaleiste',
-'qbsettings-none' => 'Keene',
-'qbsettings-fixedleft' => 'Links, fest',
-'qbsettings-fixedright' => 'Rechts, fest',
-'qbsettings-floatingleft' => 'Links, schwebend',
-'qbsettings-floatingright' => 'Rechts, schwebend',
+'qbsettings' => 'Seytaleiste',
+'qbsettings-none' => 'Keene',
# Preferences page
'preferences' => 'Eenstellunga',
@@ -926,64 +759,39 @@ Stelle secher, doaß de Versionsgeschichte a'r Seyte historisch korrekt ies.",
'prefsnologin' => 'Ne oagemeldet',
'prefsnologintext' => 'Du mußt <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} oagemeldet]</span> sei, im denne Einstellunga ändern zu kinna.',
'changepassword' => 'Poaßwurt ändern',
-'prefs-skin' => 'Skin',
-'skin-preview' => 'Vorschau',
-'prefs-math' => 'TeX',
-'datedefault' => 'Standard',
-'prefs-datetime' => 'Datum und Zeit',
'prefs-personal' => 'Nutzerdaten',
'prefs-rc' => 'Letzte Änderunga',
-'prefs-watchlist' => 'Beobachtungsliste',
'prefs-watchlist-days' => 'Oazoahl dar Tage, de de Beobachtungsliste standardmäßig umfassa sull:',
-'prefs-watchlist-days-max' => 'Maximal 7 Tage',
'prefs-watchlist-edits' => 'Maximale Zoahl dar Eenträge:',
'prefs-watchlist-edits-max' => 'Maximale Oazoahl: 1000',
-'prefs-watchlist-token' => 'Beobachtungslisten-Token:',
-'prefs-misc' => 'Verschiedenes',
'prefs-resetpass' => 'Poaßwurt ändern',
-'prefs-email' => 'E-Mail-Optionen',
'prefs-rendering' => 'Aussahn',
'saveprefs' => 'Eenstallunga speichern',
-'resetprefs' => 'Eingaben verwerfen',
'restoreprefs' => 'Olle Standardeinstallunga wiederherstalla',
'prefs-editing' => 'Beorbeeta',
'prefs-edit-boxsize' => 'Griße des Beoarbeetungsfansters:',
'rows' => 'Zeila:',
'columns' => 'Spalta:',
-'searchresultshead' => 'Suche',
'resultsperpage' => 'Treffer pro Seyte:',
'contextlines' => 'Zeila pro Treffer:',
'contextchars' => 'Zeecha pro Zeile:',
'stub-threshold' => 'Linkformatierung <a href="#" class="stub">klenner Seyta</a> (ei Byte):',
'recentchangesdays' => 'Oazoahl dar Tage, de de Liste dar „Letzta Änderunga“ standardmäßig imfassa sull:',
-'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
'recentchangescount' => 'Oazoahl dar standardmäßig oagezeigta Beoarbeetunga:',
'savedprefs' => 'Denne Einstallunga waan gespeichert.',
-'timezonelegend' => 'Zeitzone:',
'localtime' => 'Urtszeit:',
-'timezoneuseserverdefault' => 'Standardzeit des Servers',
'timezoneuseoffset' => 'Andere (Underschied oagahn)',
'timezoneoffset' => 'Underschied¹:',
'servertime' => "Aktuelle Zeit uff'm Server:",
'guesstimezone' => 'Vum Browser iebernahma',
'timezoneregion-africa' => 'Offreka',
-'timezoneregion-america' => 'Amerika',
-'timezoneregion-arctic' => 'Arktis',
-'timezoneregion-asia' => 'Asien',
-'timezoneregion-atlantic' => 'Atlantischer Ozean',
'allowemail' => 'E-Mail-Empfang vu andern Benutzern ermeeglichn',
'prefs-searchoptions' => 'Sichoptiona',
'prefs-namespaces' => 'Noamasräume',
'defaultns' => 'Andernfoalls ei diesen Noamasräumen sicha:',
-'default' => 'Voreinstellung',
-'prefs-files' => 'Dateien',
-'prefs-custom-css' => 'Benutzerdefinierte CSS',
'prefs-custom-js' => 'Nutzerdefiniertes JS',
-'prefs-emailconfirm-label' => 'E-Mail-Bestätigung:',
'prefs-textboxsize' => 'Griße des Beoarbeetungsfansters',
-'youremail' => 'E-Mail-Adresse:',
'username' => 'Benutzernoame:',
-'uid' => 'Benutzer-ID:',
'prefs-memberingroups' => 'Mitglied dar {{PLURAL:$1|Nutzergruppe|Nutzergruppen}}:',
'yourrealname' => 'Echter Noame:',
'yourlanguage' => 'Sproache der Benutzeroberfläche:',
@@ -991,20 +799,15 @@ Stelle secher, doaß de Versionsgeschichte a'r Seyte historisch korrekt ies.",
'yournick' => 'Unterschrift:',
'badsig' => 'De Syntax dar Underschrift ies ungiltig; bitte HTML ieberpriefa.',
'badsiglength' => 'Ihre Underschrift derf ne länger sein als wie $1 {{PLURAL:$1|character|Zeecha}}.',
-'yourgender' => 'Geschlecht:',
'gender-unknown' => 'ne oagagahn',
-'gender-male' => 'männlich',
-'gender-female' => 'weiblich',
-'email' => 'E-mail',
'prefs-help-realname' => 'Optional. Dei echter Noame werd denn Beiträga zugeordnet.',
'prefs-help-email' => "De Angabe a'r E-Mail ies optional, ermeeglicht oaber de Zusendung annes Ersatzpoaßwurtes, wenn du dei Poaßwurt vergessen host.
Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, ohne doaß du denne Identität uffelähn mußt.",
'prefs-help-email-required' => 'Is werd anne giltige E-Mail-Atresse benetigt.',
-'prefs-info' => 'Basisinformationen',
'prefs-signature' => 'Underschrift',
'prefs-dateformat' => 'Datumsfurmat',
'prefs-timeoffset' => 'Zeitunderschied',
-'prefs-display' => 'Oazeigeoptiona',
+'prefs-displayrc' => 'Oazeigeoptiona',
# User rights
'userrights' => 'Nutzerrechteverwaltung',
@@ -1018,7 +821,6 @@ Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, o
'userrights-groups-help' => 'Du koast de Gruppenzugehierigkeit fier diesen Nutzer ändern:
* A markiertes Kästchen bedeutet, doaß dar Nutzer Mitglied dieser Gruppe ies
* A * bedeutet, doaß du doas Nutzerrecht noach Erteilung ne wieder zerrickenahma koast (oder umgekehrt).',
-'userrights-reason' => 'Grund:',
'userrights-no-interwiki' => 'Du host kenne Berechtigung, Nutzerrechte ei andern Wikis zu ändern.',
'userrights-nodatabase' => 'De Datenbank $1 ies ne vurhanda oder ne lokal.',
'userrights-nologin' => "Du mußt diech miet a'm Administrator-Nutzerkonto [[Special:UserLogin|oamelda]], im Nutzerrechte zu ändern.",
@@ -1027,28 +829,17 @@ Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, o
'userrights-unchangeable-col' => 'Gruppazugehierigkeit, de du ne ändern koast',
# Groups
-'group' => 'Gruppe:',
-'group-user' => 'Benutzer',
-'group-autoconfirmed' => 'Automatisch bestätigte Benutzer',
-'group-bot' => 'Bots',
-'group-sysop' => 'Administratora',
-'group-bureaucrat' => 'Birokrata',
-'group-suppress' => 'Oversighter',
-'group-all' => '(olle)',
+'group-sysop' => 'Administratora',
+'group-bureaucrat' => 'Birokrata',
+'group-all' => '(olle)',
'group-user-member' => 'Notzer',
'group-autoconfirmed-member' => 'Automatisch bestätigter Nutzer',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Administrator',
'group-bureaucrat-member' => 'Birokrat',
-'group-suppress-member' => 'Oversighter',
-'grouppage-user' => '{{ns:project}}:Benutzer',
'grouppage-autoconfirmed' => '{{ns:project}}:Automatisch bestätigte Nutzer',
-'grouppage-bot' => '{{ns:project}}:Bots',
'grouppage-sysop' => '{{ns:project}}:Administratora',
'grouppage-bureaucrat' => '{{ns:project}}:Bierokrata',
-'grouppage-suppress' => '{{ns:project}}:Oversighter',
# Rights
'right-read' => 'Seyta lasa',
@@ -1110,10 +901,8 @@ Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, o
'right-sendemail' => 'E-Mails oa andere Nutzer senda',
# User rights log
-'rightslog' => 'Rechte-Logbuch',
'rightslogtext' => 'Dies ies doas Logbuch dar Änderunga dar Nutzerrechte.',
'rightslogentry' => 'änderte de Nutzerrechte fier „$1“ vu „$2“ uff „$3“',
-'rightsnone' => '(–)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'de Seyte zu lasa',
@@ -1157,21 +946,14 @@ Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, o
'recentchanges-legend' => 'Oazeigeoptiona',
'recentchangestext' => "Uff dieser Seyte koanst du de letzta Änderunga uff '''{{SITENAME}}''' noachverfolga.",
'recentchanges-feed-description' => 'Verfolge miet diesem Feed de letzta Änneronga ei {{SITENAME}}.',
-'recentchanges-label-legend' => 'Legende: $1.',
-'recentchanges-legend-newpage' => '$1 - neue Seyte',
'recentchanges-label-newpage' => 'Neue Seyte',
-'recentchanges-legend-minor' => '$1 - klenne Änderung',
'recentchanges-label-minor' => 'Klenne Änderung',
-'recentchanges-legend-bot' => "$1 - Änderung durch an'n Bot",
'recentchanges-label-bot' => "Änderung durch an'n Bot",
-'recentchanges-legend-unpatrolled' => '$1 - ne-kontrollierte Änderung',
'rcnote' => "Oagezeegt {{PLURAL:$1|wird '''1''' Ännerong|waan de letzta '''$1''' Änneronga}} {{PLURAL:$2|des letzta Taages|dar letzta '''$2''' Taage}}. Stand: $4, $5. (<b><tt>N</tt></b>&nbsp;– neuer Eentrag; <b><tt>K</tt></b>&nbsp;– kleene Ännerong; <b><tt>B</tt></b>&nbsp;– Ännerong dorch eena Bot; ''(± Zoahl)''&nbsp;– Greeßaännerong ei Byte)",
'rcnotefrom' => "Oagezeigt waan de Änderunga seit '''$2''' (max. '''$1''' Einträge).",
'rclistfrom' => 'Oack Änneronga seit $1 zeiga.',
'rcshowhideminor' => 'Klenne Änderunga $1',
-'rcshowhidebots' => 'Bots $1',
'rcshowhideliu' => 'Oagemeldete Benutzer $1',
-'rcshowhideanons' => 'Anonyme Benutzer $1',
'rcshowhidepatr' => 'Kontrollierte Änderunga $1',
'rcshowhidemine' => 'Eegene Beiträge $1',
'rclinks' => 'Zeige de letzta $1 Änneronga dar letzta $2 Taage.<br />$3',
@@ -1179,9 +961,6 @@ Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, o
'hist' => 'Versiona',
'hide' => 'ausblenda',
'show' => 'eenblenda',
-'minoreditletter' => 'K',
-'newpageletter' => 'N',
-'boteditletter' => 'B',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|beobachtender|beobachtende}} Nutzer]',
'rc_categories' => 'Ock Seyta aus dann Kategorien (getrennt miet „|“):',
'rc_categories_any' => 'Olle',
@@ -1209,20 +988,11 @@ Miet andern Nutzern koast du au ieber de Nutzerdischkurseyta Kontakt uffnahma, o
'upload_directory_missing' => 'Doas Upload-Verzeichnis ($1) fahlt und konnte durch dann Webserver au ne erstellt waan.',
'upload_directory_read_only' => 'Dar Webserver hoot kenne Schreibrechte fier doas Upload-Verzeichnis ($1).',
'uploaderror' => 'Fehler beim Huchloada',
-'upload-permitted' => 'Erlaubte Dateitypen: $1.',
-'upload-preferred' => 'Bevorzugte Dateitypen: $1.',
'upload-prohibited' => 'Ne erlaubte Dateitypen: $1.',
-'uploadlog' => 'Datei-Logbuch',
-'uploadlogpage' => 'Datei-Logbuch',
'uploadlogpagetext' => "Dies ies doas Logbuch dar huchgeloadena Dateien, siehe au de [[Special:NewFiles|Galerie neuer Dateien]] fier an'n visuellen Ieberblick.",
'filename' => 'Dateinoame',
-'filedesc' => 'Beschreibung',
-'fileuploadsummary' => 'Beschreibung/Quelle:',
'filereuploadsummary' => 'Dateiänderunga:',
-'filestatus' => 'Copyright-Status:',
-'filesource' => 'Quelle:',
'uploadedfiles' => 'Huchgeloadene Dateien',
-'ignorewarning' => 'Warnung ignorieren und Datei speichern',
'ignorewarnings' => 'Warnunga ignoriera',
'minlength1' => "Dateinoama missa mindestens an'n Buchstaba lang sei.",
'illegalfilename' => 'Dar Dateinoame „$1“ enthält mindestens a ne erlaubtes Zeicha. Bitte benenne de Datei im und versiche se erneut huchzuloada.',
@@ -1242,21 +1012,14 @@ Bitte priefe '''<tt>[[:$1]]</tt>''', wenn du dir ne secher biest, ob du se ände
Bitte priefe, ob du doas Bild ei voller Ufflesung vorliegen host und loade dieses under damm Originalnoama huch.",
'file-exists-duplicate' => 'Diese Datei ies a Duplikat dar fulgenda {{PLURAL:$1|Datei|$1 Dateien}}:',
'file-deleted-duplicate' => 'Anne identische Datei dieser Datei ([[:$1]]) wurde frieher geläscht. Ieberpriefe doas Läsch-Logbuch, bevor du se huchlädst.',
-'successfulupload' => 'Erfolgreich huchgeloada',
-'uploadwarning' => 'Warnung',
-'savefile' => 'Datei speichern',
'uploadedimage' => 'hoot „[[$1]]“ huchgeloada',
'overwroteimage' => 'hoot anne neue Version vu „[[$1]]“ huchgeloada',
'uploaddisabled' => 'Huchlada deaktiviert',
'uploaddisabledtext' => 'Doas Huchloada vu Dateien ies deaktiviert.',
'uploadscripted' => "Diese Datei enthält HTML- oder Scriptcode, dar irrtiemlich vu a'm Webbrowser ausgefiehrt waan kennte.",
'uploadvirus' => "Diese Datei enthält an'n Virus! Details: $1",
-'upload-source' => 'Quelldatei',
-'sourcefilename' => 'Quelldatei:',
-'sourceurl' => 'Quell-URL:',
'destfilename' => 'Zielnoame:',
'upload-maxfilesize' => 'Maximale Dateigriße: $1',
-'upload-description' => 'Dateibeschreibung',
'upload-options' => 'Huchloade-Optionen',
'watchthisupload' => 'Diese Datei beobachta',
'filewasdeleted' => 'Anne Datei miet diesem Noama wurde schunnt eemoll huchgeloada und zwischenzeitlich wieder geläscht. Bitte priefe zuerst dann Eintrag eim $1, bevor du de Datei wirklich speicherst.',
@@ -1266,10 +1029,10 @@ Bitte priefe sorgfältig, ob doas erneute Huchloada dann Richtlinien entspricht.
Zu denner Information folgt doas Läsch-Logbuch miet dar Begrindung fier de vorhergehende Läschung:",
'filename-bad-prefix' => "Dar Dateinoame beginnt miet '''„$1“'''. Dies ies eim allgemeena dar vu a'r Digitalkamera vorgegebene Dateinoame und daher ne sehr aussagekräftig.
Bitte gieb dar Datei an'n Noama, dar dann Inhalt besser beschreibt.",
+'upload-success-subj' => 'Erfolgreich huchgeloada',
'upload-proto-error' => 'Foalsches Protokoll',
'upload-proto-error-text' => 'De URL muuß miet <code>http://</code> oder <code>ftp://</code> beginna.',
-'upload-file-error' => 'Interner Fehler',
'upload-file-error-text' => "Bei dar Erstellung a'r temporären Datei uff'd Server ies a interner Fahler uffgetreta.
Bitte informiere an'n [[Special:ListUsers/sysop|System-Administrator]].",
'upload-misc-error' => 'Unbekennter Fahler beim Huchloada',
@@ -1281,9 +1044,8 @@ Wenn doas Problem wetter bestieht, informiere an'n [[Special:ListUsers/sysop|Sys
'upload-http-error' => 'A HTTP-Fahler ies uffgetreta: $1',
# img_auth script messages
-'img-auth-accessdenied' => 'Zugriff verweigert',
-'img-auth-nofile' => 'Datei „$1“ existiert ne.',
-'img-auth-streaming' => 'Loade „$1“.',
+'img-auth-nofile' => 'Datei „$1“ existiert ne.',
+'img-auth-streaming' => 'Loade „$1“.',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL ies nee erreichbar',
@@ -1291,33 +1053,23 @@ Wenn doas Problem wetter bestieht, informiere an'n [[Special:ListUsers/sysop|Sys
'upload-curl-error28' => 'Zeitieberschreitung beim Huchloada',
'upload-curl-error28-text' => "De Seyte braucht zu lange fier anne Antwurt. Priefe, ob de Seyte online ies, warte an'n kurza Moment und versiche is doann erneut. Is koan sinnvoll sei, an'n erneuta Versich zu a'm andern Zeitpunkt zu probieren.",
-'license' => 'Lizenz:',
-'license-header' => 'Lizenz',
'nolicense' => 'kenne Vurauswoahl',
'license-nopreview' => '(is ies kenne Vurschau verfiegbar)',
'upload_source_url' => ' (giltige, effentlich zugängliche URL)',
'upload_source_file' => ' (anne Datei uff dennem Computer)',
# Special:ListFiles
-'listfiles-summary' => "Diese Spezialseyte listet olle huchgeloadena Dateien uff. Standardmäßig waan de zuletzt huchgeloadena Dateien zuerst oagezeigt. Durch an'n Klick uff de Spaltenieberschrifta koan de Sortierung umgedreht waan oder is koan noach a'r andern Spalte sortiert waan.",
-'listfiles_search_for' => 'Siche nooch Datei:',
-'imgfile' => 'Datei',
-'listfiles' => 'Dateiliste',
-'listfiles_date' => 'Datum',
-'listfiles_name' => 'Noame',
-'listfiles_user' => 'Benutzer',
-'listfiles_size' => 'Greeße',
-'listfiles_description' => 'Beschreibung',
-'listfiles_count' => 'Versionen',
+'listfiles-summary' => "Diese Spezialseyte listet olle huchgeloadena Dateien uff. Standardmäßig waan de zuletzt huchgeloadena Dateien zuerst oagezeigt. Durch an'n Klick uff de Spaltenieberschrifta koan de Sortierung umgedreht waan oder is koan noach a'r andern Spalte sortiert waan.",
+'listfiles_search_for' => 'Siche nooch Datei:',
+'listfiles_name' => 'Noame',
+'listfiles_size' => 'Greeße',
# File description page
-'file-anchor-link' => 'Datei',
'filehist' => 'Dateiversiona',
'filehist-help' => 'Klicke uff eenen Zeitpunkt, im diese Version zu loada.',
'filehist-deleteall' => 'Olle Versiona läscha',
'filehist-deleteone' => 'Diese Version läscha',
'filehist-revert' => 'zerricke scherga',
-'filehist-current' => 'aktuell',
'filehist-datetime' => 'Version vum',
'filehist-thumb' => 'Vurschaubild',
'filehist-thumbtext' => 'Vurschaubild fier Version vum $1',
@@ -1325,7 +1077,6 @@ Wenn doas Problem wetter bestieht, informiere an'n [[Special:ListUsers/sysop|Sys
'filehist-user' => 'Nutzer',
'filehist-dimensions' => 'Moaße',
'filehist-filesize' => 'Dateigrieße',
-'filehist-comment' => 'Kommentar',
'filehist-missing' => 'Datei fahlt',
'imagelinks' => 'Woas fiehrt bies zum hier',
'linkstoimage' => 'De {{PLURAL:$1|folgende Seyte verwendet|folgenden $1 Seyta verwenda}} diese Datei:',
@@ -1345,7 +1096,6 @@ Anne [[Special:WhatLinksHere/$2|vullständige Liste]] ies verfiegbar.',
'filerevert' => 'Zerrickesetza vun „$1“',
'filerevert-legend' => 'Datei zerrickesetza',
'filerevert-intro' => "Du setzt de Datei '''[[Media:$1|$1]]''' uff de [$4 Version vum $2, $3 Seeger] zerricke.",
-'filerevert-comment' => 'Grund:',
'filerevert-defaultcomment' => 'Zerrickegesetzt uff de Version vum $1, $2 Seeger',
'filerevert-submit' => 'Zerrickesetza',
'filerevert-success' => "'''[[Media:$1|$1]]''' wurde uff de [$4 Version vum $2, $3 Seeger] zerrickegesetzt.",
@@ -1362,7 +1112,6 @@ Anne [[Special:WhatLinksHere/$2|vullständige Liste]] ies verfiegbar.',
'filedelete-success-old' => "Vu dar Datei '''„[[Media:$1|$1]]“''' wurde de Version vum $2, $3 Seeger geläscht.",
'filedelete-nofile' => "'''„$1“''' ies ne vurhanda.",
'filedelete-nofile-old' => "Is gitt vu '''„$1“''' kenne archivierte Version miet dann oagegebenen Attributen.",
-'filedelete-otherreason' => 'Anderer/ergänzender Grund:',
'filedelete-reason-otherlist' => 'Oanderer Grund',
'filedelete-reason-dropdown' => '* Allgemeene Läschgrinde
** Urheberrechtsverletzung
@@ -1372,7 +1121,6 @@ Anne [[Special:WhatLinksHere/$2|vullständige Liste]] ies verfiegbar.',
# MIME search
'mimesearch' => 'Suche noach MIME-Typ',
'mimesearch-summary' => 'Uff dieser Spezialseyte kinna de Dateien noach damm MIME-Typ gefiltert waan. Die Eingabe muuß emmer dann Medien- und Subtyp beinhalten: <tt>image/jpeg</tt> (siehe Dateibeschreibungsseyte).',
-'mimetype' => 'MIME-Typ:',
'download' => 'Herunderloada',
# Unwatched pages
@@ -1392,15 +1140,12 @@ Ieberpriefe andere Links zu dann Vurloaga, bevor du diese läscht.',
'randompage-nopages' => 'Is sein kenne Seyta {{PLURAL:$2|eim folgenda Noamasraum|ei dann folgenden Noamasräumen}} enthaala: „$1“',
# Random redirect
-'randomredirect' => 'Zufällige Weiterleitung',
'randomredirect-nopages' => 'Eim Noamasraum „$1“ sein kenne Weiterleitunga vurhanda.',
# Statistics
-'statistics' => 'Statistik',
'statistics-header-pages' => 'Seytastatistik',
'statistics-header-edits' => 'Beoarbeetungsstatistik',
'statistics-header-views' => 'Seytauffrufstatistik',
-'statistics-header-users' => 'Benutzerstatistik',
'statistics-header-hooks' => 'Andere Statistika',
'statistics-articles' => 'Inhaltsseyta',
'statistics-pages' => 'Seyta',
@@ -1410,9 +1155,7 @@ Ieberpriefe andere Links zu dann Vurloaga, bevor du diese läscht.',
'statistics-edits-average' => 'Beoarbeetunga pro Seyte eim Durchschnitt',
'statistics-views-total' => 'Seytaaufrufe gesamt',
'statistics-views-peredit' => 'Seyta uffruffe pro Beoarbeetung',
-'statistics-jobqueue' => 'Länge dar [http://www.mediawiki.org/wiki/Manual:Job_queue Ufftragswarteschlange]',
'statistics-users' => 'Registrierte [[Special:ListUsers|Nutzer]]',
-'statistics-users-active' => 'Aktive Benutzer',
'statistics-users-active-desc' => 'Nutzer miet Beoarbeetunga {{PLURAL:$1|enn letzta 24 Stunden|enn vergangenen $1 Tagen}}',
'statistics-mostpopular' => 'Meistbesichte Seyta',
@@ -1423,9 +1166,8 @@ Ieberpriefe andere Links zu dann Vurloaga, bevor du diese läscht.',
'doubleredirects' => 'Doppelte Weiterleitunga',
'doubleredirectstext' => 'Diese Liste enthält Weiterleitunga, de uff wettere Wetterleitunga verlinka.
Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Ziel dar zweeta Wetterleitung, welches fier gewehnlich die gewünschte Zielseyte ies, uff de bereits de erschte Wetterleitung zeiga sullte.
-<s>Durchgestrichene</s> Einträge wurden bereits erledigt.',
+<del>Durchgestrichene</del> Einträge wurden bereits erledigt.',
'double-redirect-fixed-move' => 'doppelte Wetterleitung uffgelest: [[$1]] → [[$2]]',
-'double-redirect-fixer' => 'RedirectBot',
'brokenredirects' => 'Kaputte Wetterleitunga',
'brokenredirectstext' => 'Diese Spezialseyte listet Weiterleitunga uff ne existierende Seyta uff.',
@@ -1434,15 +1176,11 @@ Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Zie
'withoutinterwiki' => 'Seyta ohne Links zu andern Sproacha',
'withoutinterwiki-summary' => 'De folgenda Seyta verlinken ne uff andere Sproachversionen.',
-'withoutinterwiki-legend' => 'Präfix',
-'withoutinterwiki-submit' => 'Zeige',
'fewestrevisions' => 'Seyta miet dann wenigsta Versionen',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategoria}}',
-'nlinks' => '{{PLURAL:$1|1 Link|$1 Links}}',
'nmembers' => '{{PLURAL:$1|1 Eentrag|$1 Eenträge}}',
'nrevisions' => '{{PLURAL:$1|1 Beoarbeetung|$1 Beoarbeetunga}}',
'nviews' => '{{PLURAL:$1|1 Obfroage|$1 Obfroaga}}',
@@ -1453,8 +1191,6 @@ Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Zie
'uncategorizedcategories' => 'Ne kategorisierte Kategorien',
'uncategorizedimages' => 'Ne kategorisierte Dateien',
'uncategorizedtemplates' => 'Ne kategorisierte Vurlagen',
-'unusedcategories' => 'Unbenutzte Kategorien',
-'unusedimages' => 'Unbenutzte Dateien',
'popularpages' => 'Beliebteste Seyta',
'wantedcategories' => 'Nutzte, oaber ne oagelegte Kategorien',
'wantedpages' => 'Gewinschte Seyta',
@@ -1464,7 +1200,6 @@ Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Zie
'mostlinkedcategories' => 'Meistbenutzte Heetgruppa',
'mostlinkedtemplates' => 'Meistbenutzte Vurlooga',
'mostcategories' => 'Meistkategorisierte Seyta',
-'mostimages' => 'Meistbenutzte Dateien',
'mostrevisions' => 'Seyta miet dann meesta Versionen',
'prefixindex' => 'Olle Seita (mit Präfix)',
'shortpages' => 'Korze Seyta',
@@ -1495,9 +1230,7 @@ Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Zie
'notargettext' => 'Du host ne oagegahn, uff welche Seyte diese Funksjonn oagewendet waan sull.',
'nopagetitle' => 'Zielseyte ne vurhanda',
'nopagetext' => 'De oagegebene Zielseyte ies ne vorhanden.',
-'pager-newer-n' => '{{PLURAL:$1|nächster|nächste $1}}',
'pager-older-n' => '{{PLURAL:$1|vurheriger|vurherige $1}}',
-'suppress' => 'Oversight',
# Book sources
'booksources' => 'ISBN-Siche',
@@ -1508,7 +1241,6 @@ Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Zie
Bitte priefe, ob korrekt vu dar Quelle iebertraga wurde.',
# Special:Log
-'specialloguserlabel' => 'Benutzer:',
'speciallogtitlelabel' => 'Tittel:',
'log' => 'Logbicher',
'all-logs-page' => 'Olle effentlicha Logbicher',
@@ -1519,7 +1251,6 @@ De Ausgabe koan durch de Auswoahl des Logbuchtyps, des Nutzers oder des Seytatit
# Special:AllPages
'allpages' => 'Olle Seyta',
-'alphaindexline' => '$1 bis $2',
'nextpage' => 'Nächste Seyte ($1)',
'prevpage' => 'Vurherige Seyte ($1)',
'allpagesfrom' => 'Seyta oazeega oab:',
@@ -1528,7 +1259,6 @@ De Ausgabe koan durch de Auswoahl des Logbuchtyps, des Nutzers oder des Seytatit
'allinnamespace' => 'Olle Seyta (Noamasraum: $1)',
'allnotinnamespace' => 'Olle Seyta (ne eim $1 Noamasraum)',
'allpagesprev' => 'Vurherige',
-'allpagesnext' => 'Nächste',
'allpagessubmit' => 'Oawenda',
'allpagesprefix' => 'Seyta oazeiga mit Präfix:',
'allpagesbadtitle' => 'Dar eingegebene Seytanoame ies ungiltig: Ar hoot entweder a vorangestelltes Sproach-, a Interwiki-Kürzel oder enthält a oder mehrere Zeichen, welche in Seytanoama ne verwendet waan dirfa.',
@@ -1544,13 +1274,10 @@ Siehe au de Liste dar [[Special:WantedCategories|gewienschta Heetgruppa]].',
'special-categories-sort-abc' => 'Sortierung noach Alphabet',
# Special:DeletedContributions
-'deletedcontributions' => 'Geläschte Beiträge',
-'deletedcontributions-title' => 'Geläschte Beiträge',
-'sp-deletedcontributions-contribs' => 'Benutzerbeiträge',
+'deletedcontributions' => 'Geläschte Beiträge',
+'deletedcontributions-title' => 'Geläschte Beiträge',
# Special:LinkSearch
-'linksearch' => 'Weblink-Suche',
-'linksearch-pat' => 'Suchmuster:',
'linksearch-ns' => 'Noamensraum:',
'linksearch-ok' => 'Sucha',
'linksearch-text' => 'Diese Spezialseite ermeeglicht de Siche noach Seyta, ei denen bestimmte Weblinks enthalten sein. Dabei kinna Wildcards wie beispielsweise <tt>*.example.com</tt> benutzt waan.<br />Understitzte Protokolle: <tt>$1</tt>',
@@ -1559,12 +1286,9 @@ Siehe au de Liste dar [[Special:WantedCategories|gewienschta Heetgruppa]].',
# Special:ListUsers
'listusersfrom' => 'Zeige Benutzer ob:',
-'listusers-submit' => 'Zeige',
'listusers-noresult' => 'Kenn Benutzer gefunda.',
-'listusers-blocked' => '(gesperrt)',
# Special:ActiveUsers
-'activeusers' => 'Liste aktiver Benutzer',
'activeusers-noresult' => 'Kenne Benutzer gefunda.',
# Special:Log/newusers
@@ -1579,10 +1303,7 @@ Siehe au de Liste dar [[Special:WantedCategories|gewienschta Heetgruppa]].',
'listgrouprights' => 'Nutzergruppen-Rechte',
'listgrouprights-summary' => 'Dies ies anne Liste dar ei diesem Wiki definierten Nutzergruppen und dar damit verbundenen Rechte.
Zusätzliche Informationen ieber einzelne Rechte kinna [[{{MediaWiki:Listgrouprights-helppage}}|hier]] gefunda waan.',
-'listgrouprights-group' => 'Gruppe',
-'listgrouprights-rights' => 'Rechte',
'listgrouprights-helppage' => 'Help:Grupparechte',
-'listgrouprights-members' => '(Mitgliederliste)',
'listgrouprights-addgroup' => 'Nutzer zu {{PLURAL:$2|dieser Gruppe|diesen Gruppen}} hinzufiega: $1',
'listgrouprights-removegroup' => 'Nutzer aus {{PLURAL:$2|dieser Gruppe|diesen Gruppen}} entferna: $1',
'listgrouprights-addgroup-all' => 'Nutzer zu olla Gruppa hinzufiega',
@@ -1596,26 +1317,20 @@ Zusätzliche Informationen ieber einzelne Rechte kinna [[{{MediaWiki:Listgroupri
'emailpagetext' => 'Du koast damm Nutzer miet damm onda stiehenda Formular anne E-Mail senda.
Ols Obsender werd de E-Mail-Adtresse aus denn [[Special:Preferences|Einstellunga]] eingetraga, damit dar Nutzer dir antwurta koan.',
'usermailererror' => "Doas E-Mail-Objekt gab an'n Fahler zerricke:",
-'defemailsubject' => '{{SITENAME}}-E-Mail',
'noemailtitle' => 'Kenne E-Mail-Atresse',
'noemailtext' => 'Dieser Nutzer hoot kenne giltige E-Mail-Atresse oagegahn.',
'nowikiemailtitle' => 'E-Mail-Versand nee meegliech',
'email-legend' => "E-Mail oa an'n andern {{SITENAME}}-Nutzer senda",
'emailfrom' => 'Vun:',
'emailto' => 'Oa:',
-'emailsubject' => 'Betreff:',
'emailmessage' => 'Noachricht:',
'emailsend' => 'Senda',
'emailccme' => 'Sende anne Kopie dar E-Mail oa miech',
'emailccsubject' => 'Kopie denner Noachricht oa $1: $2',
-'emailsent' => 'E-Mail verschickt',
'emailsenttext' => 'Denne E-Mail wurde verschickt.',
'emailuserfooter' => 'Diese E-Mail wurde vu {{SITENAME}}-Nutzer „$1“ oa „$2“ gesendet.',
# Watchlist
-'watchlist' => 'Beobachtungsliste',
-'mywatchlist' => 'Beobachtungsliste',
-'watchlistfor' => "(fier '''$1''')",
'nowatchlist' => 'Du host kenne Einträge uff denner Beobachtungsliste.',
'watchlistanontext' => 'Du mußt diech $1, im denne Beobachtungsliste zu sahn oder Einträge uff ihr zu beoarbeeta.',
'watchnologin' => 'Du best ne oagemeldet',
@@ -1634,7 +1349,6 @@ Wenn du de Seyte wieder voo denner Beobachtungsliste entferna mechtest, klicke u
'unwatch' => 'nä mehr beobachta',
'unwatchthispage' => 'Nä mehr beobachta',
'notanarticle' => 'Keene Seyte',
-'notvisiblerev' => 'Version wurde gelöscht',
'watchnochange' => 'Kenne dar vu dir beobachteta Seyta wurde während des oagezeigta Zeitraums beoarbeetet.',
'watchlist-details' => 'Du beobachtest {{PLURAL:$1|1 Seyte|$1 Seyta}}.',
'wlheader-enotif' => '* Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
@@ -1651,17 +1365,15 @@ Wenn du de Seyte wieder voo denner Beobachtungsliste entferna mechtest, klicke u
'watching' => 'Beobachta …',
'unwatching' => 'Nee beobachta …',
-'enotif_mailer' => '{{SITENAME}}-E-Mail-Benoachrichtigungsdienst',
-'enotif_reset' => 'Olle Seyta ols besucht markiern',
-'enotif_newpagetext' => 'Doas ies anne neue Seyte.',
-'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'geändert',
-'created' => 'erzeugt',
-'enotif_subject' => '[{{SITENAME}}] De Seyte "$PAGETITLE" wurde vu $PAGEEDITOR $CHANGEDORCREATED',
-'enotif_lastvisited' => "Olle Änderunga uff a'n Blick: $1",
-'enotif_lastdiff' => 'Siehe $1 noach dieser Änderung.',
-'enotif_anon_editor' => 'Anonymer Nutzer $1',
-'enotif_body' => 'Hallo $WATCHINGUSERNAME,
+'enotif_mailer' => '{{SITENAME}}-E-Mail-Benoachrichtigungsdienst',
+'enotif_reset' => 'Olle Seyta ols besucht markiern',
+'enotif_newpagetext' => 'Doas ies anne neue Seyte.',
+'created' => 'erzeugt',
+'enotif_subject' => '[{{SITENAME}}] De Seyte "$PAGETITLE" wurde vu $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_lastvisited' => "Olle Änderunga uff a'n Blick: $1",
+'enotif_lastdiff' => 'Siehe $1 noach dieser Änderung.',
+'enotif_anon_editor' => 'Anonymer Nutzer $1',
+'enotif_body' => 'Hallo $WATCHINGUSERNAME,
de {{SITENAME}}-Seyte „$PAGETITLE“ wurde vu $PAGEEDITOR oam $PAGEEDITDATE im $PAGEEDITTIME Seeger $CHANGEDORCREATED.
@@ -1705,8 +1417,6 @@ Rickmeldungen und wettere Helfe: {{fullurl:{{MediaWiki:Helppage}}}}',
'deletionlog' => 'Läsch-Logbuch',
'reverted' => 'Uff anne aale Version zerrickegesetzt',
'deletecomment' => 'Begriendung:',
-'deleteotherreason' => 'Anderer/ergänzender Grund:',
-'deletereasonotherlist' => 'Anderer Grund',
'deletereason-dropdown' => '* Allgemeene Läschgrinde
** Wunsch des Autors
** Urheberrechtsverletzung
@@ -1727,7 +1437,9 @@ De letzte Änderung stommt vu [[User:$3|$3]] ([[User talk:$3|Dischkur]]{{int:pip
'editcomment' => "De Änderungszusommafassung lautet: ''„$1“''.",
'revertpage' => 'Änderunga vu [[Special:Contributions/$2|$2]] ([[User talk:$2|Dischkur]]) rickgängig gemacht und letzte Version vu [[User:$1|$1]] wiederhergestellt',
'rollback-success' => 'De Änderunga vu $1 wurden rickgängig gemacht und de letzte Version vu $2 wurde wiederhergestellt.',
-'sessionfailure' => "Is goab a Problem miet dar Iebertragung denner Nutzerdaten.
+
+# Edit tokens
+'sessionfailure' => "Is goab a Problem miet dar Iebertragung denner Nutzerdaten.
Diese Aksjonn wurde daher sicherheetsholber obgebrochen, im anne foalsche Zuordnung denner Änderunga zu an'm andern Nutzer zu verhindern.
Bitte gieh zerricke und versiche dann Vurgang erneut auszufiehrn.",
@@ -1742,8 +1454,6 @@ Siehe de [[Special:ProtectedPages|Liste dar geschietzta Seyta]] fier olle aktuel
'protect-title' => 'Schutz ändern vu „$1“',
'prot_1movedto2' => 'hoot „[[$1]]“ nooch „[[$2]]“ verschoba',
'protect-legend' => 'Seytaschutzstatus ändern',
-'protectcomment' => 'Grund:',
-'protectexpiry' => 'Sperrdauer:',
'protect_expiry_invalid' => 'De eengegebene Lengde ies ungieltig.',
'protect_expiry_old' => 'De Sperrzeit liegt ei dar Vergangenheet.',
'protect-text' => 'Hier koast du dan Schutzstatus fier de Seite „$1“ asahn on ändern.',
@@ -1755,15 +1465,10 @@ Siehe de [[Special:ProtectedPages|Liste dar geschietzta Seyta]] fier olle aktuel
'protect-fallback' => 'Is wird de „$1“-Berechtigung beneetigt.',
'protect-level-autoconfirmed' => 'Sperrung fier neue on nee registrierte Benutzer',
'protect-level-sysop' => 'Oack Administratora',
-'protect-summary-cascade' => 'kaskadierend',
'protect-expiring' => 'bis $2, $3 Seeger (UTC)',
-'protect-expiry-indefinite' => 'unbeschränkt',
'protect-cascade' => 'Kaskadierende Sperre – olle ei diese Seyte eingebundena Vorlaga waan ebenfoalls gesperrt.',
'protect-cantedit' => 'Du koast de Sperre dieser Seite nee ändern, doo du keene Berechtigung zim Beoarbeeta dar Seite host.',
-'protect-othertime' => 'Andere Sperrdauer:',
-'protect-othertime-op' => 'andere Sperrdauer',
'protect-existing-expiry' => 'Aktuelles Seytaschutzende: $2, $3 Seeger',
-'protect-otherreason' => 'Anderer/ergänzender Grund:',
'protect-otherreason-op' => 'anderer/ergänzender Grund',
'protect-dropdown' => '*Allgemeene Schutzgrinde
** Weblink-Spam
@@ -1776,7 +1481,6 @@ Siehe de [[Special:ProtectedPages|Liste dar geschietzta Seyta]] fier olle aktuel
'restriction-level' => 'Schutzhiehe',
'minimum-size' => 'Mindestgreeße',
'maximum-size' => 'Maximalgreeße:',
-'pagesize' => '(Bytes)',
# Restrictions (nouns)
'restriction-edit' => 'Beorbeeta',
@@ -1799,7 +1503,6 @@ Siehe de [[Special:ProtectedPages|Liste dar geschietzta Seyta]] fier olle aktuel
'undeleteextrahelp' => '* Im de Seyte komplett miet olla Versionen wiederherzustella, wähle kenne Version aus, gib anne Begrindung oa und klicke uff „Wiederherstellen“.
* Mechtest du ock bestimmte Versionen wiederherstella, su wähle diese bitte einzeln anhand dar Markierungen aus, gib anne Begrindung oa und klicke dann uff „Wiederherstella“.
* „Obbrecha“ laart doas Kommentarfeld und entfernt olle Markierungen bei dann Versionen.',
-'undeleterevisions' => '{{PLURAL:$1|1 Version|$1 Versionen}} archiviert',
'undeletehistory' => 'Wenn du diese Seyte wiederherstellst, waan au olle aaln Versionen wiederhergestellt.
Wenn seit dar Läschung anne neue Seyte gleichen Noamens erstellt wurde, waan de wiederhergestellta Versionen chronologisch ei de Versionsgeschichte eingeordnet.',
'undeleterevdel' => "De Wiederherstellung werd ne durchgefiehrt, wenn de aktuellste Version versteckt ies oder versteckte Teele enthält.
@@ -1813,17 +1516,11 @@ Dar aktuelle Text dar geläschta Seyte ies ock Administratoren zugänglich.',
'undeletebtn' => 'Wiederherstalla',
'undeletelink' => 'oasahn/wiederherstella',
'undeleteviewlink' => 'oasahn',
-'undeletereset' => 'Abbrechen',
'undeleteinvert' => 'Auswoahl umkehra',
'undeletecomment' => 'Begrindung:',
'undeletedarticle' => 'hoot „[[$1]]“ wiederhergestellt',
-'undeletedrevisions' => '{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestallt',
-'undeletedfiles' => '{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt',
'cannotundelete' => 'Wiederherstellung fehlgeschlaga; jemand anderes hoot de Seyte bereits wiederhergestellt.',
-'undeletedpage' => "'''„$1“''' wurde wiederhergestellt.
-
-Eim [[Special:Log/delete|Läsch-Logbuch]] fendest du anne Iebersicht dar geläschta und wiederhergestellta Seyta.",
'undelete-header' => 'Siehe eim [[Special:Log/delete|Läsch-Logbuch]] noach kierzlich geläschta Seyta.',
'undelete-search-box' => 'Siche noach geläschta Seyta',
'undelete-search-prefix' => 'Sichbegriff (Wortanfang ohne Wildcards):',
@@ -1846,19 +1543,16 @@ $1",
'blanknamespace' => '(Seyta)',
# Contributions
-'contributions' => 'Benutzerbeiträge',
'contributions-title' => 'Benutzerbeiträge voo „$1“',
'mycontris' => 'Vu mer verändart',
'contribsub2' => 'Fier $1 ($2)',
'nocontribs' => 'Is wurden kenne Nutzerbeiträge miet diesen Kriterien gefunda.',
-'uctop' => '(aktuell)',
'month' => 'on Moonat:',
'year' => 'bis Joahr:',
'sp-contributions-newbies' => 'Zeige oack Beiträge neuer Benutzer',
'sp-contributions-newbies-sub' => 'Fier Neulinge',
'sp-contributions-newbies-title' => 'Nutzerbeiträge vu neua Nutzern',
-'sp-contributions-blocklog' => 'Sperr-Logbuch',
'sp-contributions-deleted' => 'Geläschte Beiträge',
'sp-contributions-logs' => 'Logbicher',
'sp-contributions-talk' => 'Dischkur',
@@ -1875,29 +1569,21 @@ $1",
'nolinkshere' => "Kenne Seyte verlinkt uff '''„[[:$1]]“'''.",
'nolinkshere-ns' => "Kenne Seyte verlinkt uff '''„[[:$1]]“''' eim gewählta Noamasraum.",
'isredirect' => 'Weiterleitungsseyte',
-'istemplate' => 'Vorlageneinbindung',
-'isimage' => 'Dateilink',
'whatlinkshere-prev' => '{{PLURAL:$1|vurheriger|vurherige $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|nächster|nächste $1}}',
-'whatlinkshere-links' => '↠Links',
'whatlinkshere-hideredirs' => 'Weiterleitunga $1',
'whatlinkshere-hidetrans' => 'Vurlageneinbindunga $1',
-'whatlinkshere-hidelinks' => 'Links $1',
-'whatlinkshere-hideimages' => 'Dateilinks $1',
-'whatlinkshere-filters' => 'Filter',
# Block/unblock
-'blockip' => 'IP-Atresse/Benutzer sperra',
-'blockip-legend' => 'IP-Atresse/Benutzer sperra',
-'blockiptext' => "Mit diesem Formular sperrst du anne IP-Atresse oder an'n Nutzernoama, su doaß vu dort kenne Änderunga meh vorgenumma waan kinna.
+'blockip' => 'IP-Atresse/Benutzer sperra',
+'blockip-legend' => 'IP-Atresse/Benutzer sperra',
+'blockiptext' => "Mit diesem Formular sperrst du anne IP-Atresse oder an'n Nutzernoama, su doaß vu dort kenne Änderunga meh vorgenumma waan kinna.
Dies sullte ock erfolga, im Vandalismus zu verhindern und ei Iebereinstimmung miet dann [[{{MediaWiki:Policy-url}}|Richtlinien]].
Bitte gib dann Grund fier de Sperre oa.",
-'ipaddress' => 'IP-Atresse oder Benutzernoame:',
-'ipadressorusername' => 'IP-Atresse oder Benutzernoame:',
-'ipbexpiry' => 'Sperrdauer:',
-'ipbreason' => 'Begriendung:',
-'ipbreasonotherlist' => 'Andere Begrindung',
-'ipbreason-dropdown' => '* Allgemeene Sperrgrinde
+'ipaddress' => 'IP-Atresse oder Benutzernoame:',
+'ipadressorusername' => 'IP-Atresse oder Benutzernoame:',
+'ipbreason' => 'Begriendung:',
+'ipbreasonotherlist' => 'Andere Begrindung',
+'ipbreason-dropdown' => '* Allgemeene Sperrgrinde
** Eenfiega foalscher Informationa
** Laara vu Seyta
** Fiegt massenweise externe Links a
@@ -1905,90 +1591,76 @@ Bitte gib dann Grund fier de Sperre oa.",
** bedrohliches Verhaala/Belästigung
** Missbrauch durch mehrere Nutzerkonten
** Ungeeigneter Nutzernoame',
-'ipbanononly' => 'Ock anonyme Nutzer sperra',
-'ipbcreateaccount' => 'Erstellung vu Nutzerkonten verhindern',
-'ipbemailban' => 'E-Mail-Versand sperra',
-'ipbenableautoblock' => 'Sperre de aktuell vu diesem Benutzer genutzte IP-Atresse suwie automatisch olle folgenda, vu denen aus ar Beoarbeetunga oder doas Oalega vu Benutzeraccounts versucht',
-'ipbsubmit' => 'IP-Atresse/Benutzer sperra',
-'ipbother' => 'Ondere Dauer (englsch):',
-'ipboptions' => '2 Stonda:2 hours,1 Taag:1 day,3 Taage:3 days,1 Wuche:1 week,2 Wucha:2 weeks,1 Moonat:1 month,3 Moonate:3 months,6 Moonate:6 months,1 Joahr:1 year,Unbeschränkt:infinite',
-'ipbotheroption' => 'Oandere Dauer',
-'ipbotherreason' => 'Andere/ergänzende Begrindung:',
-'ipbhidename' => 'Nutzernoame ei Beoarbeetunga und Listen verstecka',
-'ipbwatchuser' => 'Nutzer(dischkur)seyte beobachta',
-'ipballowusertalk' => 'Nutzer darf eegene Dischkurseyta während senner Sperre beoarbeeta',
-'ipb-change-block' => 'Sperre miet diesen Sperrparametern erneuern',
-'badipaddress' => 'De IP-Atresse hoot a foalsches Furmat.',
-'blockipsuccesssub' => 'Sperre erfolgreich',
-'blockipsuccesstext' => 'Dar Nutzer/de IP-Atresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
+'ipbanononly' => 'Ock anonyme Nutzer sperra',
+'ipbcreateaccount' => 'Erstellung vu Nutzerkonten verhindern',
+'ipbemailban' => 'E-Mail-Versand sperra',
+'ipbenableautoblock' => 'Sperre de aktuell vu diesem Benutzer genutzte IP-Atresse suwie automatisch olle folgenda, vu denen aus ar Beoarbeetunga oder doas Oalega vu Benutzeraccounts versucht',
+'ipbsubmit' => 'IP-Atresse/Benutzer sperra',
+'ipbother' => 'Ondere Dauer (englsch):',
+'ipboptions' => '2 Stonda:2 hours,1 Taag:1 day,3 Taage:3 days,1 Wuche:1 week,2 Wucha:2 weeks,1 Moonat:1 month,3 Moonate:3 months,6 Moonate:6 months,1 Joahr:1 year,Unbeschränkt:infinite',
+'ipbotheroption' => 'Oandere Dauer',
+'ipbotherreason' => 'Andere/ergänzende Begrindung:',
+'ipbhidename' => 'Nutzernoame ei Beoarbeetunga und Listen verstecka',
+'ipbwatchuser' => 'Nutzer(dischkur)seyte beobachta',
+'ipballowusertalk' => 'Nutzer darf eegene Dischkurseyta während senner Sperre beoarbeeta',
+'ipb-change-block' => 'Sperre miet diesen Sperrparametern erneuern',
+'badipaddress' => 'De IP-Atresse hoot a foalsches Furmat.',
+'blockipsuccesstext' => 'Dar Nutzer/de IP-Atresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
Zur Uffhebung dar Sperre siehe ie [[Special:IPBlockList|Liste oller aktiven Sperra]].',
-'ipb-edit-dropdown' => 'Sperrgrinde beoarbeeta',
-'ipb-unblock-addr' => '„$1“ freigahn',
-'ipb-unblock' => 'IP-Atresse/Nutzer freigahn',
-'ipb-blocklist-addr' => 'Aktuelle Sperre fier „$1“ onzeiga',
-'ipb-blocklist' => 'Olle aktuellen Sperra oazeiga',
-'ipb-blocklist-contribs' => 'Nutzerbeiträge fier „$1“',
-'unblockip' => 'IP-Atresse freigahn',
-'unblockiptext' => "Miet diesem Formular koast du anne IP-Atresse oder an'n Nutzer freigahn.",
-'ipusubmit' => 'Freigahn',
-'unblocked' => '[[User:$1|$1]] wurde freigegahn',
-'unblocked-id' => 'Sperr-ID $1 wurde freigegahn',
-'ipblocklist' => 'Gesperrte IP-Atressa on Benutzernoama',
-'ipblocklist-legend' => "Siche noach a'm gesperrta Nutzer",
-'ipblocklist-username' => 'Nutzernoame oder IP-Atresse:',
-'ipblocklist-sh-userblocks' => 'Benutzersperra $1',
-'ipblocklist-sh-tempblocks' => 'Befristete Sperra $1',
-'ipblocklist-sh-addressblocks' => 'IP-Sperra $1',
-'ipblocklist-submit' => 'Sucha',
-'ipblocklist-localblock' => 'Lokale Sperre',
-'ipblocklist-otherblocks' => 'Andere {{PLURAL:$1|Sperre|Sperra}}',
-'blocklistline' => '$1, $2 sperrte $3 (bis $4)',
-'infiniteblock' => 'unbegrenzt',
-'expiringblock' => 'endet oam $1 im $2 Seeger',
-'anononlyblock' => 'ocke Anonyme',
-'noautoblockblock' => 'Autoblock deaktiviert',
-'createaccountblock' => 'Erstellung vu Nutzerkonten gesperrt',
-'emailblock' => 'E-Mail-Versand gesperrt',
-'blocklist-nousertalk' => 'darf eegene Dischkurseyte ne beoarbeeta',
-'ipblocklist-empty' => 'De Liste enthält kenne Eenträge.',
-'ipblocklist-no-results' => 'De gesuchte IP-Atresse/dar Nutzernoame ies ne gesperrt.',
-'blocklink' => 'Sperra',
-'unblocklink' => 'freigahn',
-'change-blocklink' => 'Sperre ändern',
-'contribslink' => 'Beiträge',
-'autoblocker' => 'Automatische Sperre, do du anne gemeinsame IP-Atresse miet [[User:$1|$1]] benutzt. Grund dar Nutzersperre: „$2“.',
-'blocklogpage' => 'Benutzersperr-Logbuch',
-'blocklogentry' => 'sperrte „[[$1]]“ fier dan Zeitraum: $2 $3',
-'reblock-logentry' => 'änderte de Sperre fier „[[$1]]“ fier dann Zeitraum: $2 $3',
-'blocklogtext' => 'Dies ies doas Logbuch ieber Sperrunga und Entsperrunga vu Nutzern und IP-Atressa.
+'ipb-edit-dropdown' => 'Sperrgrinde beoarbeeta',
+'ipb-unblock-addr' => '„$1“ freigahn',
+'ipb-unblock' => 'IP-Atresse/Nutzer freigahn',
+'ipb-blocklist' => 'Olle aktuellen Sperra oazeiga',
+'ipb-blocklist-contribs' => 'Nutzerbeiträge fier „$1“',
+'unblockip' => 'IP-Atresse freigahn',
+'unblockiptext' => "Miet diesem Formular koast du anne IP-Atresse oder an'n Nutzer freigahn.",
+'ipusubmit' => 'Freigahn',
+'unblocked' => '[[User:$1|$1]] wurde freigegahn',
+'unblocked-id' => 'Sperr-ID $1 wurde freigegahn',
+'ipblocklist' => 'Gesperrte IP-Atressa on Benutzernoama',
+'ipblocklist-legend' => "Siche noach a'm gesperrta Nutzer",
+'ipblocklist-username' => 'Nutzernoame oder IP-Atresse:',
+'ipblocklist-sh-userblocks' => 'Benutzersperra $1',
+'ipblocklist-sh-tempblocks' => 'Befristete Sperra $1',
+'ipblocklist-sh-addressblocks' => 'IP-Sperra $1',
+'ipblocklist-submit' => 'Sucha',
+'ipblocklist-otherblocks' => 'Andere {{PLURAL:$1|Sperre|Sperra}}',
+'blocklistline' => '$1, $2 sperrte $3 (bis $4)',
+'expiringblock' => 'endet oam $1 im $2 Seeger',
+'anononlyblock' => 'ocke Anonyme',
+'createaccountblock' => 'Erstellung vu Nutzerkonten gesperrt',
+'blocklist-nousertalk' => 'darf eegene Dischkurseyte ne beoarbeeta',
+'ipblocklist-empty' => 'De Liste enthält kenne Eenträge.',
+'ipblocklist-no-results' => 'De gesuchte IP-Atresse/dar Nutzernoame ies ne gesperrt.',
+'blocklink' => 'Sperra',
+'unblocklink' => 'freigahn',
+'autoblocker' => 'Automatische Sperre, do du anne gemeinsame IP-Atresse miet [[User:$1|$1]] benutzt. Grund dar Nutzersperre: „$2“.',
+'blocklogentry' => 'sperrte „[[$1]]“ fier dan Zeitraum: $2 $3',
+'reblock-logentry' => 'änderte de Sperre fier „[[$1]]“ fier dann Zeitraum: $2 $3',
+'blocklogtext' => 'Dies ies doas Logbuch ieber Sperrunga und Entsperrunga vu Nutzern und IP-Atressa.
Automatisch gesperrte IP-Atressa waan ne erfasst.
Siehe de [[Special:IPBlockList|Liste dar gesperrta IP-Atressa und Nutzernoama]] fier olle aktiven Sperra.',
-'unblocklogentry' => 'hoot de Sperre voo „$1“ uffgehoba',
-'block-log-flags-anononly' => 'ock Anonyme',
-'block-log-flags-nocreate' => 'Erstellung voo Benutzerkonta gesperrt',
-'block-log-flags-noautoblock' => 'Autoblock deaktiviert',
-'block-log-flags-noemail' => 'E-Mail-Versand gesperrt',
-'block-log-flags-nousertalk' => 'darf eegene Dischkurseyte ne beoarbeeta',
-'block-log-flags-angry-autoblock' => 'erweiterter Autoblock aktiviert',
-'block-log-flags-hiddenname' => 'Nutzernoame versteckt',
-'range_block_disabled' => 'De Meeglichkeit, ganze Atressräume zu sperra, ies ne aktiviert.',
-'ipb_expiry_invalid' => 'De eingegebene Dauer ies ungiltig.',
-'ipb_expiry_temp' => 'Versteckte Nutzernoamas-Sperra sulla permanent sei.',
-'ipb_already_blocked' => '„$1“ wurde bereits gesperrt.',
-'ipb-needreblock' => '== Sperre vurhanda ==
+'unblocklogentry' => 'hoot de Sperre voo „$1“ uffgehoba',
+'block-log-flags-anononly' => 'ock Anonyme',
+'block-log-flags-nocreate' => 'Erstellung voo Benutzerkonta gesperrt',
+'block-log-flags-nousertalk' => 'darf eegene Dischkurseyte ne beoarbeeta',
+'block-log-flags-hiddenname' => 'Nutzernoame versteckt',
+'range_block_disabled' => 'De Meeglichkeit, ganze Atressräume zu sperra, ies ne aktiviert.',
+'ipb_expiry_invalid' => 'De eingegebene Dauer ies ungiltig.',
+'ipb_expiry_temp' => 'Versteckte Nutzernoamas-Sperra sulla permanent sei.',
+'ipb-needreblock' => '== Sperre vurhanda ==
„$1“ ies bereits gesperrt. Mechtest du de Sperrparameter ändern?',
-'ipb-otherblocks-header' => 'Andere {{PLURAL:$1|Sperre|Sperra}}',
-'ipb_cant_unblock' => 'Fahler: Sperr-ID $1 ne gefunda. De Sperre wurde bereits uffgehuba.',
-'ipb_blocked_as_range' => 'Fahler: De IP-Atresse $1 wurde ols Teel dar Bereichssperre $2 indirekt gesperrt. Anne Entsperrung vu $1 alleene ies ne meeglich.',
-'ip_range_invalid' => 'Ungiltiger IP-Atressbereich.',
-'blockme' => 'Sperre miech',
-'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Diese Funksjonn ies deaktiviert.',
-'proxyblockreason' => 'Denne IP-Atresse wurde gesperrt, do se a offener Proxy ies. Bitte kontaktiere denn Internet-Provider oder denne Systemadministratoren und informiere se ieber dieses meegliche Sicherheetsproblem.',
-'proxyblocksuccess' => 'Fattich',
-'sorbsreason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet.',
-'sorbs_create_account_reason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet. Doas Oalega neuer Nutzer ies ne meeglich.',
-'cant-block-while-blocked' => 'Du koast kenne andern Nutzer sperra, während du selbst gesperrt best',
+'ipb-otherblocks-header' => 'Andere {{PLURAL:$1|Sperre|Sperra}}',
+'ipb_cant_unblock' => 'Fahler: Sperr-ID $1 ne gefunda. De Sperre wurde bereits uffgehuba.',
+'ipb_blocked_as_range' => 'Fahler: De IP-Atresse $1 wurde ols Teel dar Bereichssperre $2 indirekt gesperrt. Anne Entsperrung vu $1 alleene ies ne meeglich.',
+'ip_range_invalid' => 'Ungiltiger IP-Atressbereich.',
+'blockme' => 'Sperre miech',
+'proxyblocker-disabled' => 'Diese Funksjonn ies deaktiviert.',
+'proxyblockreason' => 'Denne IP-Atresse wurde gesperrt, do se a offener Proxy ies. Bitte kontaktiere denn Internet-Provider oder denne Systemadministratoren und informiere se ieber dieses meegliche Sicherheetsproblem.',
+'proxyblocksuccess' => 'Fattich',
+'sorbsreason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet.',
+'sorbs_create_account_reason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet. Doas Oalega neuer Nutzer ies ne meeglich.',
+'cant-block-while-blocked' => 'Du koast kenne andern Nutzer sperra, während du selbst gesperrt best',
# Developer tools
'lockdb' => 'Datenbank sperra',
@@ -2000,7 +1672,6 @@ Siehe de [[Special:IPBlockList|Liste dar gesperrta IP-Atressa und Nutzernoama]]
'lockbtn' => 'Datenbank sperra',
'unlockbtn' => 'Datenbank freigahn',
'locknoconfirm' => 'Du host doas Bestätigungsfeld ne markiert.',
-'lockdbsuccesssub' => 'Datenbank wurde erfolgreich gesperrt',
'unlockdbsuccesssub' => 'Datenbank wourde erfolgreich freigegahn',
'lockdbsuccesstext' => 'De {{SITENAME}}-Datenbank wurde gesperrt.<br />Bitte gib de Datenbank [[Special:UnlockDB|wieder frei]], sobald de Wartung obgeschlossa ies.',
'unlockdbsuccesstext' => 'De {{SITENAME}}-Datenbank wourde freigegahn.',
@@ -2034,10 +1705,8 @@ Bite dan '''neua''' Tittel under '''Ziel''' eintraga, darunder de Umbenennung bi
'movenotallowed' => 'Du host kenne Berechtigung, Seyta zu verschieba.',
'cant-move-user-page' => 'Du host kenne Berechtigung, Nutzerhauptseyta zu verschieba.',
'cant-move-to-user-page' => 'Du host ne de Berechtigung, Seyta uff anne Nutzerseyte zu verschieba (miet Ausnahme vu Nutzerunderseyta).',
-'newtitle' => 'Ziel:',
'move-watch' => 'Diese Seyte beobachta',
'movepagebtn' => 'Seite verschieba',
-'pagemovedsub' => 'Verschiebung erfolgreich',
'movepage-moved' => "'''De Seyte „$1“ wurde noach „$2“ verschoba.'''",
'articleexists' => 'Under diesem Noama existiert bereits eene Seyte. Bite wähle eena andern Noama.',
'cantmove-titleprotected' => 'De Verschiebung koan ne durchgefiehrt waan, do dar Zieltittel zur Erstellung gesperrt ies.',
@@ -2053,7 +1722,6 @@ Bite dan '''neua''' Tittel under '''Ziel''' eintraga, darunder de Umbenennung bi
'1movedto2' => 'hoot „[[$1]]“ noach „[[$2]]“ verschoba',
'1movedto2_redir' => 'hoot „[[$1]]“ noach „[[$2]]“ verschoba on dabei eene Weiterleitung ieberschrieba',
'move-redirect-suppressed' => 'Weiterleitung underdrickt',
-'movelogpage' => 'Verschiebungs-Logbuch',
'movelogpagetext' => 'Dies ies anne Liste oller verschobena Seyta.',
'movesubpage' => '{{PLURAL:$1|Underseyte|Underseyta}}',
'movenosubpage' => 'Diese Seyte hoot kenne Underseyta.',
@@ -2091,26 +1759,17 @@ Alternativ ies dar Export au miet dar Syntax [[{{#Special:Export}}/{{MediaWiki:M
'export-submit' => 'Seyta exportiera',
'export-addcattext' => 'Seyta aus Kategorie hinzufiega:',
'export-addcat' => 'Hinzufiega',
-'export-addns' => 'Hinzufügen',
'export-download' => 'Ols XML-Datei speichern',
-'export-templates' => 'Inklusive Vorlagen',
'export-pagelinks' => 'Verlinkte Seyta automatisch miet exportiera, bis zer Rekursionstiefe vu:',
# Namespace 8 related
-'allmessages' => 'MediaWiki-Systemtexte',
-'allmessagesname' => 'Noame',
-'allmessagesdefault' => 'Standardtext',
-'allmessagescurrent' => 'Aktueller Text',
-'allmessagestext' => 'Dies ies anne Liste dar MediaWiki-Systemtexte.
+'allmessagesname' => 'Noame',
+'allmessagestext' => 'Dies ies anne Liste dar MediaWiki-Systemtexte.
Besiche de Seyta [http://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisierung] und [http://translatewiki.net translatewiki.net], wenn du diech oa dar Lokalisierung vu MediaWiki beteiliga mechtest.',
-'allmessagesnotsupportedDB' => 'Diese Spezialseyte stieht ne zur Verfigung, do se ieber dann Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.',
-'allmessages-filter-legend' => 'Filter',
-'allmessages-filter-unmodified' => 'Unverändert',
-'allmessages-filter-all' => 'Olle',
-'allmessages-filter-modified' => 'Verändert',
-'allmessages-prefix' => 'Präfixfilter:',
-'allmessages-language' => 'Sproache:',
-'allmessages-filter-submit' => 'Lus',
+'allmessagesnotsupportedDB' => 'Diese Spezialseyte stieht ne zur Verfigung, do se ieber dann Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.',
+'allmessages-filter-all' => 'Olle',
+'allmessages-language' => 'Sproache:',
+'allmessages-filter-submit' => 'Lus',
# Thumbnails
'thumbnail-more' => 'vergrießern',
@@ -2124,20 +1783,16 @@ Besiche de Seyta [http://www.mediawiki.org/wiki/Localisation MediaWiki-Lokalisie
# Special:Import
'import' => 'Seyta importiern',
-'importinterwiki' => 'Transwiki-Import',
'import-interwiki-text' => 'Wähle a Wiki und anne Seyte zum Importiera aus.
De Versionsdaten und Nutzernoama bleiba dabei erhalta.
Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] protokolliert.',
'import-interwiki-source' => 'Quell-Wiki/-Seyte:',
'import-interwiki-history' => 'Importiere olle Versionen dieser Seyte',
'import-interwiki-templates' => 'Olle Vurloaga einschließen',
-'import-interwiki-submit' => 'Import',
'import-interwiki-namespace' => 'Zielnoamasraum:',
'import-upload-filename' => 'Dateinoame:',
-'import-comment' => 'Grund:',
'importtext' => 'Uff dieser Spezialseyte kinna ieber de [[Special:Export|Exportfunktion]] eim Quellwiki exportierte Seyta ei dieses Wiki importiert waan.',
'importstart' => 'Importiere Seyte …',
-'import-revision-count' => '– {{PLURAL:$1|1 Version|$1 Versionen}}',
'importnopages' => 'Kenne Seyte zum Importiern vurhanda.',
'importfailed' => 'Import fehlgeschlaga: $1',
'importunknownsource' => 'Unbekennte Importquelle',
@@ -2154,16 +1809,13 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
'import-parse-failure' => 'Fahler beim XML-Import:',
'import-noarticle' => 'Is wurde kenne zu importierende Seyte oagegahn!',
'import-nonewrevisions' => 'Is sein kenne neua Versiona zum Import vorhanden, olle Versiona wurden bereits frieher importiert.',
-'xml-error-string' => '$1 Zeile $2, Spalte $3, (Byte $4): $5',
'import-upload' => 'XML-Daten importiera',
'import-token-mismatch' => 'Verlust dar Sessiondaten. Bitte versuche is erneut.',
'import-invalid-interwiki' => "Aus damm oagegahn'n Wiki ies kee Import meeglich.",
# Import log
-'importlogpage' => 'Import-Logbuch',
'importlogpagetext' => 'Administrativer Import vu Seyta miet Versionsgeschichte vu andern Wikis.',
'import-logentry-upload' => "hoot „[[$1]]“ vu a'r Datei importiert",
-'import-logentry-upload-detail' => '$1 {{PLURAL:$1|Version|Versionen}}',
'import-logentry-interwiki' => 'hoot „$1“ importiert (Transwiki)',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Version|Versiona}} vun $2',
@@ -2197,12 +1849,8 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
'tooltip-n-mainpage' => 'Heetseyte oanzeiga',
'tooltip-n-mainpage-description' => 'Heetseyte besicha',
'tooltip-n-portal' => 'Iebers Portal: woas du tun koast, wo woas zu finda ies',
-'tooltip-n-currentevents' => 'Hintergrundinformationen zu aktuellen Ereignissen',
-'tooltip-n-recentchanges' => 'Liste der letzten Änderungen in {{SITENAME}}',
'tooltip-n-randompage' => 'Zufällige Seyte',
-'tooltip-n-help' => 'Hilfeseite anzeigen',
'tooltip-t-whatlinkshere' => 'Liste oller Seyta, de hierher zeiga',
-'tooltip-t-recentchangeslinked' => 'Letzte Änderungen an Seiten, die von hier verlinkt sind',
'tooltip-feed-rss' => 'RSS-Feed fier diese Seyte',
'tooltip-feed-atom' => 'Atom-Feed fier diese Seyte',
'tooltip-t-contributions' => 'Liste dar Beiträge voo diesem Benutzer oasahn',
@@ -2240,7 +1888,6 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
# Attribution
'anonymous' => '{{PLURAL:$1|Anonymer Nutzer|Anonyme Nutzer}} uff {{SITENAME}}',
'siteuser' => '{{SITENAME}}-Benutzer $1',
-'anonuser' => 'Anonymer {{SITENAME}}-Benutzer $1',
'lastmodifiedatby' => 'Diese Seyte wurde zuletzt oam $1 im $2 Seeger vu $3 geändert.',
'othercontribs' => 'Basierend uff dar Orbeet vu $1.',
'others' => 'oandera',
@@ -2249,11 +1896,8 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
'nocredits' => 'Fier diese Seyte sein kenne Informationa vorhanda.',
# Spam protection
-'spamprotectiontitle' => 'Spamschutzfilter',
'spamprotectiontext' => "De Seyte, de du speichern wielst, wurde vum Spamschutzfilter blockiert. Doas leit woahrscheinlich oa an'm Link uff anne externe Seyte.",
'spamprotectionmatch' => "'''Dar folgende Text wurde vum Spamfilter gefunda: ''$1'''''",
-'spambot_username' => 'MediaWiki-Spam-Säuberung',
-'spam_reverting' => 'Letzte Version ohne Links zu $1 wiederhergestellt.',
'spam_blanking' => 'Olle Versionen enthielta Links zu $1, bereinigt.',
# Info page
@@ -2270,7 +1914,6 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
'mw_math_html' => 'Wenn meeglich ols HTML darstella, sunst PNG',
'mw_math_source' => 'Ols TeX belassen (fier Textbrowser)',
'mw_math_modern' => 'Empfehlenswert fier moderne Browser',
-'mw_math_mathml' => 'MathML (experimentell)',
# Math errors
'math_failure' => 'Parser-Fahler',
@@ -2298,8 +1941,6 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
'patrol-log-page' => 'Kontroll-Logbichl',
'patrol-log-header' => 'Dies ies doas Kontroll-Logbuch.',
'patrol-log-line' => 'hoot $1 vu „$2“ ols kontrolliert markiert $3',
-'patrol-log-auto' => '(automatisch)',
-'patrol-log-diff' => 'Version $1',
'log-show-hide-patrol' => 'Kontroll-Logbichl $1',
# Image deletion
@@ -2323,22 +1964,17 @@ Durch doas Herunderloada und Effna dar Datei koan dei Computer beschädigt waan.
'imagemaxsize' => "Maximale Bildgrieße:<br />''(fier Dateibeschreibungsseyta)''",
'thumbsize' => 'Standardgriße dar Vurschaubilder (Thumbnails):',
'widthheightpage' => '$1×$2, {{PLURAL:$3|1 Seyte|$3 Seyta}}',
-'file-info' => '(Dateigreeße: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Dateigreeße: $3, MIME-Typ: $4)',
+'file-info' => 'Dateigreeße: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Dateigreeße: $3, MIME-Typ: $4',
'file-nohires' => '<small>Kenne hiehere Uffleesung vurhanda.</small>',
-'svg-long-desc' => '(SVG-Datei, Basisgreeße: $1 × $2 Pixel, Dateigreeße: $3)',
+'svg-long-desc' => 'SVG-Datei, Basisgreeße: $1 × $2 Pixel, Dateigreeße: $3',
'show-big-image' => 'Version ei hieherer Uffleesung',
'show-big-image-thumb' => 'small>Greeße dar Vuroasicht: $1 × $2 Pixel</small>',
-'file-info-gif-looped' => 'Endlosschleife',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Bilder}}',
# Special:NewFiles
-'newimages' => 'Neue Dateien',
'imagelisttext' => "Hier ies anne Liste vu '''$1''' {{PLURAL:$1|Datei|Dateien}}, sortiert $2.",
'newimages-summary' => 'Diese Spezialseyte zeigt de zuletzt huchgeloadena Dateien oa.',
-'newimages-legend' => 'Filter',
'newimages-label' => 'Dateinoame (oder a Teel davon):',
-'showhidebots' => '(Bots $1)',
'noimages' => 'Kenne Dateien gefunda.',
'ilsubmit' => 'Sucha',
'bydate' => 'noach Datum',
@@ -2365,134 +2001,64 @@ Darauf folgende Seitalinks ei derselba Zeile definiera Ausnahma, ei deren Kontex
* focallength',
# EXIF tags
-'exif-imagewidth' => 'Breite',
'exif-imagelength' => 'Länge',
'exif-bitspersample' => 'Bits pro Forbkomponente',
'exif-compression' => 'Oart dar Kompression',
'exif-photometricinterpretation' => 'Pixelzusommasetzung',
-'exif-orientation' => 'Kameraausrichtung',
'exif-samplesperpixel' => 'Oazoahl Komponenten',
-'exif-planarconfiguration' => 'Datenausrichtung',
'exif-ycbcrsubsampling' => 'Subsampling Rate vu Y bis C',
-'exif-ycbcrpositioning' => 'Y und C Positionierung',
'exif-xresolution' => 'Horizontale Ufflesung',
'exif-yresolution' => 'Vertikale Ufflesung',
'exif-resolutionunit' => 'Maßeinheet dar Ufflesung',
-'exif-stripoffsets' => 'Bilddaten-Versatz',
'exif-rowsperstrip' => 'Oazoahl Zeila pro Streifa',
'exif-stripbytecounts' => 'Bytes pro komprimiertem Streifa',
-'exif-jpeginterchangeformat' => 'Offset zu JPEG SOI',
'exif-jpeginterchangeformatlength' => 'Griße dar JPEG-Daten ei Bytes',
'exif-transferfunction' => 'Iebertragungsfunksjonn',
'exif-whitepoint' => 'Manuell miet Messung',
'exif-primarychromaticities' => 'Primäre Forboart',
-'exif-ycbcrcoefficients' => 'YCbCr-Koeffizienten',
'exif-referenceblackwhite' => 'Schworz/Weeß-Referenzpunkte',
-'exif-datetime' => 'Speicherzeitpunkt',
'exif-imagedescription' => 'Bildtittel',
-'exif-make' => 'Hersteller',
-'exif-model' => 'Modell',
-'exif-software' => 'Software',
'exif-artist' => 'Fotogroaf',
-'exif-copyright' => 'Urheberrechte',
-'exif-exifversion' => 'Exif-Version',
'exif-flashpixversion' => 'understitzte Flashpix-Version',
'exif-colorspace' => 'Forbraum',
-'exif-componentsconfiguration' => 'Bedeutung einzelner Komponenten',
-'exif-compressedbitsperpixel' => 'Komprimierte Bits pro Pixel',
'exif-pixelydimension' => 'Giltige Bildbreite',
'exif-pixelxdimension' => 'Giltige Bildhiehe',
'exif-makernote' => 'Herstallernotiz',
'exif-usercomment' => 'Nutzerkommentare',
'exif-relatedsoundfile' => 'Zugehierige Tondatei',
-'exif-datetimeoriginal' => 'Erfassungszeitpunkt',
-'exif-datetimedigitized' => 'Digitalisierungszeitpunkt',
-'exif-subsectime' => 'Speicherzeitpunkt (1/100 s)',
-'exif-subsectimeoriginal' => 'Erfassungszeitpunkt (1/100 s)',
-'exif-subsectimedigitized' => 'Digitalisierungszeitpunkt (1/100 s)',
-'exif-exposuretime' => 'Belichtungsdauer',
'exif-exposuretime-format' => '$1 Sekunda ($2)',
-'exif-fnumber' => 'Blende',
-'exif-exposureprogram' => 'Belichtungsprogramm',
-'exif-spectralsensitivity' => 'Spectral Sensitivity',
-'exif-isospeedratings' => 'Film- oder Sensorempfindlichkeit (ISO)',
-'exif-oecf' => 'Optoelektronischer Umrechnungsfaktor',
-'exif-shutterspeedvalue' => 'Belichtungszeitwert',
-'exif-aperturevalue' => 'Blendenwert',
-'exif-brightnessvalue' => 'Helligkeitswert',
-'exif-exposurebiasvalue' => 'Belichtungsvorgabe',
'exif-maxaperturevalue' => 'Grießte Blende',
-'exif-subjectdistance' => 'Entfernung',
'exif-meteringmode' => 'Messverfoahrn',
-'exif-lightsource' => 'Lichtquelle',
-'exif-flash' => 'Blitz',
-'exif-focallength' => 'Brennweite',
-'exif-subjectarea' => 'Bereich',
-'exif-flashenergy' => 'Blitzstärke',
-'exif-spatialfrequencyresponse' => 'Spatial-Frequenz',
'exif-focalplanexresolution' => 'Sensorufflesung hurizuntal',
'exif-focalplaneyresolution' => 'Sensorufflesung vertikal',
'exif-focalplaneresolutionunit' => 'Einheet dar Sensorufflesung',
'exif-subjectlocation' => 'Motivstandurt',
-'exif-exposureindex' => 'Belichtungsindex',
-'exif-sensingmethod' => 'Messmethode',
'exif-filesource' => 'Quelle dar Datei',
'exif-scenetype' => 'Szenatyp',
-'exif-cfapattern' => 'CFA-Muster',
'exif-customrendered' => 'Nutzerdefinierte Bildveroarbeetung',
-'exif-exposuremode' => 'Belichtungsmodus',
'exif-whitebalance' => 'Weeßabgleich',
-'exif-digitalzoomratio' => 'Digitalzoom',
'exif-focallengthin35mmfilm' => 'Brennweite (Kleenbildäquivalent)',
'exif-scenecapturetype' => 'Uffnahmeoart',
-'exif-gaincontrol' => 'Verstärkung',
-'exif-contrast' => 'Kontrast',
-'exif-saturation' => 'Sättigung',
-'exif-sharpness' => 'Schärfe',
'exif-devicesettingdescription' => 'Geräteeinstallung',
-'exif-subjectdistancerange' => 'Motiventfernung',
-'exif-imageuniqueid' => 'Bild-ID',
-'exif-gpsversionid' => 'GPS-Tag-Version',
-'exif-gpslatituderef' => 'nördl. oder südl. Breite',
-'exif-gpslatitude' => 'Geografische Breite',
-'exif-gpslongituderef' => 'östl. oder westl. Länge',
-'exif-gpslongitude' => 'Geografische Länge',
'exif-gpsaltituderef' => 'Bezugshiehe',
'exif-gpsaltitude' => 'Hiehe',
-'exif-gpstimestamp' => 'GPS-Zeit',
'exif-gpssatellites' => 'Fier de Messung benutzte Satelliten',
-'exif-gpsstatus' => 'Empfängerstatus',
'exif-gpsmeasuremode' => 'Messverfoahrn',
-'exif-gpsdop' => 'Maßpräzision',
'exif-gpsspeedref' => 'Geschwindigkeitseinheet',
-'exif-gpsspeed' => 'Geschwindigkeit des GPS-Empfängers',
'exif-gpstrackref' => 'Referenz fier Bewegungsrichtung',
-'exif-gpstrack' => 'Bewegungsrichtung',
'exif-gpsimgdirectionref' => 'Referenz fier de Ausrichtung des Bildes',
-'exif-gpsimgdirection' => 'Bildrichtung',
'exif-gpsmapdatum' => 'Geodätisches Datum nutzt',
'exif-gpsdestlatituderef' => 'Referenz fier de Breite',
-'exif-gpsdestlatitude' => 'Breite',
'exif-gpsdestlongituderef' => 'Referenz fier de Länge',
-'exif-gpsdestlongitude' => 'Länge',
'exif-gpsdestbearingref' => 'Referenz fier Motivrichtung',
-'exif-gpsdestbearing' => 'Motivrichtung',
'exif-gpsdestdistanceref' => 'Referenz fier de Motiventfernung',
-'exif-gpsdestdistance' => 'Motiventfernung',
'exif-gpsprocessingmethod' => 'Noame des GPS-Verfahras',
'exif-gpsareainformation' => 'Noame des GPS-Gebietes',
-'exif-gpsdatestamp' => 'GPS-Datum',
-'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
-
-# EXIF attributes
-'exif-compression-1' => 'Unkomprimiert',
'exif-unknowndate' => 'Unbekenntes Datum',
-'exif-orientation-1' => 'Normal',
'exif-orientation-2' => 'Hurizuntal gespiegelt',
'exif-orientation-3' => 'Im 180° gedreht',
-'exif-orientation-4' => 'Vertikal gespiegelt',
'exif-orientation-5' => 'Entgegen damm Seegerzeigersinn im 90° gedreht und vertikal gespiegelt',
'exif-orientation-6' => 'Im 90° eim Seegerzeigersinn gedreht',
'exif-orientation-7' => 'Im 90° eim Seegerzeigersinn gedreht und vertikal gespiegelt',
@@ -2504,43 +2070,24 @@ Darauf folgende Seitalinks ei derselba Zeile definiera Ausnahma, ei deren Kontex
'exif-componentsconfiguration-0' => 'Existiert ne',
'exif-exposureprogram-0' => 'Unbekennt',
-'exif-exposureprogram-1' => 'Manuell',
-'exif-exposureprogram-2' => 'Standardprogramm',
-'exif-exposureprogram-3' => 'Zeitautomatik',
-'exif-exposureprogram-4' => 'Blendenautomatik',
'exif-exposureprogram-5' => 'Kreativprogramm miet Bevorzugung huher Schärfentiefe',
'exif-exposureprogram-6' => "Aksjonn-Programm miet Bevorzugung a'r kurza Belichtungszeit",
-'exif-exposureprogram-7' => 'Portrait-Programm',
'exif-exposureprogram-8' => 'Landschoftsuffnahma',
-'exif-subjectdistance-value' => '$1 Meter',
-
'exif-meteringmode-0' => 'Unbekennt',
-'exif-meteringmode-1' => 'Durchschnittlich',
-'exif-meteringmode-2' => 'Mittenzentriert',
-'exif-meteringmode-3' => 'Spotmessung',
'exif-meteringmode-4' => 'Mehfachspotmessung',
-'exif-meteringmode-5' => 'Muster',
'exif-meteringmode-6' => 'Bildteel',
'exif-meteringmode-255' => 'Unbekennt',
-'exif-lightsource-0' => 'Unbekennt',
-'exif-lightsource-1' => 'Taageslicht',
-'exif-lightsource-2' => 'Fluoreszierend',
-'exif-lightsource-3' => 'Glihlompe',
-'exif-lightsource-4' => 'Blitz',
-'exif-lightsource-9' => 'Schie Waater',
-'exif-lightsource-10' => 'Bewelkt',
-'exif-lightsource-11' => 'Schoatta',
-'exif-lightsource-12' => 'Tageslicht fluoreszierend (D 5700–7100 K)',
-'exif-lightsource-13' => 'Tagesweeß fluoreszierend (N 4600–5400 K)',
-'exif-lightsource-14' => 'Kaltweeß fluoreszierend (W 3900–4500 K)',
-'exif-lightsource-15' => 'Weeß fluoreszierend (WW 3200–3700 K)',
-'exif-lightsource-17' => 'Standardlicht A',
-'exif-lightsource-18' => 'Standardlicht B',
-'exif-lightsource-19' => 'Standardlicht C',
-'exif-lightsource-24' => 'ISO Studio Kunstlicht',
-'exif-lightsource-255' => 'Andere Lichtquelle',
+'exif-lightsource-0' => 'Unbekennt',
+'exif-lightsource-1' => 'Taageslicht',
+'exif-lightsource-3' => 'Glihlompe',
+'exif-lightsource-9' => 'Schie Waater',
+'exif-lightsource-10' => 'Bewelkt',
+'exif-lightsource-11' => 'Schoatta',
+'exif-lightsource-13' => 'Tagesweeß fluoreszierend (N 4600–5400 K)',
+'exif-lightsource-14' => 'Kaltweeß fluoreszierend (W 3900–4500 K)',
+'exif-lightsource-15' => 'Weeß fluoreszierend (WW 3200–3700 K)',
# Flash modes
'exif-flash-fired-0' => 'kee Blitz',
@@ -2550,83 +2097,32 @@ Darauf folgende Seitalinks ei derselba Zeile definiera Ausnahma, ei deren Kontex
'exif-flash-return-3' => 'Reflexion des Blitz festgestallt',
'exif-flash-mode-1' => 'erzwungenes Blitza',
'exif-flash-mode-2' => 'Blitz obgeschaltet',
-'exif-flash-mode-3' => 'Automatik',
'exif-flash-function-1' => 'Kenne Blitzfunksjonn',
-'exif-flash-redeye-1' => 'Rotaugen Reduktion',
-
-'exif-focalplaneresolutionunit-2' => 'Zoll',
-'exif-sensingmethod-1' => 'Undefiniert',
'exif-sensingmethod-2' => 'Ein-Chip-Forbsensor',
'exif-sensingmethod-3' => 'Zwee-Chip-Forbsensor',
'exif-sensingmethod-4' => 'Drei-Chip-Forbsensor',
'exif-sensingmethod-5' => 'Forbraum sequentiell Sensor',
-'exif-sensingmethod-7' => 'Trilinearer Sensor',
'exif-sensingmethod-8' => 'Forbraum linear sequentieller Sensor',
-'exif-scenetype-1' => 'Normal',
-
-'exif-customrendered-0' => 'Standard',
'exif-customrendered-1' => 'Nutzerdefiniert',
-'exif-exposuremode-0' => 'Automatische Belichtung',
-'exif-exposuremode-1' => 'Manuelle Belichtung',
-'exif-exposuremode-2' => 'Belichtungsreihe',
-
-'exif-whitebalance-0' => 'Automatisch',
-'exif-whitebalance-1' => 'Manuell',
-
-'exif-scenecapturetype-0' => 'Standard',
'exif-scenecapturetype-1' => 'Landschoft',
-'exif-scenecapturetype-2' => 'Portrait',
'exif-scenecapturetype-3' => 'Noachtszene',
'exif-gaincontrol-0' => 'Keene',
-'exif-gaincontrol-1' => 'Gering',
-'exif-gaincontrol-2' => 'High gain up',
-'exif-gaincontrol-3' => 'Low gain down',
-'exif-gaincontrol-4' => 'High gain down',
-'exif-contrast-0' => 'Normal',
'exif-contrast-1' => 'Schwoch',
'exif-contrast-2' => 'Stork',
-'exif-saturation-0' => 'Normal',
-'exif-saturation-1' => 'Gering',
'exif-saturation-2' => 'Huch',
-'exif-sharpness-0' => 'Normal',
-'exif-sharpness-1' => 'Gering',
'exif-sharpness-2' => 'Stork',
'exif-subjectdistancerange-0' => 'Unbekennt',
-'exif-subjectdistancerange-1' => 'Makro',
-'exif-subjectdistancerange-2' => 'Nah',
-'exif-subjectdistancerange-3' => 'Entfernt',
-
-# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-'exif-gpslatitude-n' => 'nördl. Breite',
-'exif-gpslatitude-s' => 'südl. Breite',
-# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
-'exif-gpslongitude-e' => 'östl. Länge',
-'exif-gpslongitude-w' => 'westl. Länge',
-
-'exif-gpsstatus-a' => 'Messung läuft',
'exif-gpsstatus-v' => 'Interoperabilität vu Messunga',
-'exif-gpsmeasuremode-2' => '2-dimensionale Messung',
-'exif-gpsmeasuremode-3' => '3-dimensionale Messung',
-
-# Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'km/h',
-'exif-gpsspeed-m' => 'mph',
-'exif-gpsspeed-n' => 'Knoten',
-
-# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
-'exif-gpsdirection-t' => 'Tatsächliche Richtung',
-'exif-gpsdirection-m' => 'Magnetische Richtung',
-
# External editor support
'edit-externally' => 'Diese Datei miet eenem externen Programm beorbeeta',
'edit-externally-help' => '(Siehe de [http://www.mediawiki.org/wiki/Manual:External_editors Installationsanweisunga] fier weitere Informationa)',
@@ -2646,7 +2142,6 @@ Darauf folgende Seitalinks ei derselba Zeile definiera Ausnahma, ei deren Kontex
'confirmemail_pending' => "Is wurde dir bereits a Bestätigungscode per E-Mail zugeschickt.
Wenn du dei Nutzerkonto erscht vur kurzem erstallt host, warte bitte noo a poar Minuta uff de E-Mail, bevor du an'n neua Code anforderst.",
'confirmemail_send' => 'Bestätigungscode zuschicka',
-'confirmemail_sent' => 'Bestätigungs-E-Mail wurde verschickt.',
'confirmemail_oncreate' => 'A Bestätigungs-Code wurde oa denne E-Mail-Atresse gesandt. Dieser Code werd fier de Oameldung ne benetigt, jedoch werd ar zer Aktivierung dar E-Mail-Funksjonna innerhalb des Wikis gebraucht.',
'confirmemail_sendfailed' => '{{SITENAME}} konnte de Bestätigungs-E-Mail ne oa diech versenda.
Bitte priefe de E-Mail-Atresse uff ungiltige Zeecha.
@@ -2686,7 +2181,6 @@ Dieser Bestätigungscode ies giltig bis $6, $7 Seeger.',
'trackbackbox' => 'Trackbacks fier diese Seyte:<br />
$1',
'trackbackremove' => '([$1 läscha])',
-'trackbacklink' => 'Trackback',
'trackbackdeleteok' => 'Trackback wurde erfolgreich geläscht.',
# Delete conflict
@@ -2698,14 +2192,12 @@ Bitte bestätige, doß du diese Seyte wirklich neu erstalla mechta.",
'recreate' => 'Erneut oalähn',
# action=purge
-'confirm_purge_button' => 'OK',
'confirm-purge-top' => 'Diese Seyte aus damm Server-Cache läscha?',
'confirm-purge-bottom' => "Laart dann Cache a'r Seyte und erzwingt de Oazeige dar aktuella Version.",
# Multipage image navigation
'imgmultipageprev' => '↠vurherige Seyte',
'imgmultipagenext' => 'nächste Seyte →',
-'imgmultigo' => 'OK',
'imgmultigoto' => 'Gieh zo Seyte $1',
# Table pager
@@ -2748,11 +2240,9 @@ Bitte bestätige, doß du diese Seyte wirklich neu erstalla mechta.",
'watchlistedit-raw-explain' => 'Dies sein de Einträge denner Beobachtungsliste eim Listenfurmat. De Einträge kinna zeilaweise geläscht oder hinzugefiegt waan.
Pro Zeile ies a Eintrag erlaubt. Wenn du fattig best, klicke uff „Beobachtungsliste speichern“.
Du koast au de [[Special:Watchlist/edit|Standard-Beoarbeetungsseyte]] benutza.',
-'watchlistedit-raw-titles' => 'Einträge:',
'watchlistedit-raw-submit' => 'Beobachtungsliste speichern',
'watchlistedit-raw-done' => 'Denne Beobachtungsliste wurde gespeichert.',
'watchlistedit-raw-added' => '{{PLURAL:$1|1 Eintrag wurde|$1 Einträge wurden}} hinzugefiegt:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 Eintrag wurde|$1 Einträge wurden}} entfernt:',
# Watchlist editing tools
'watchlisttools-view' => 'Beobachtungsliste: Änneronga',
@@ -2764,13 +2254,8 @@ Du koast au de [[Special:Watchlist/edit|Standard-Beoarbeetungsseyte]] benutza.',
'duplicate-defaultsort' => 'Ochtiche: Dar Sortierungsschlissel „$2“ ieberschreibt dann vorher verwendeta Schlissel „$1“.',
# Special:Version
-'version' => 'Version',
-'version-extensions' => 'Installierte Erweiterungen',
'version-specialpages' => 'Spezialseyta',
-'version-parserhooks' => 'Parser-Hooks',
-'version-variables' => 'Variablen',
'version-other' => 'Oanderes',
-'version-mediahandlers' => 'Medien-Handler',
'version-hooks' => "Schnittstalla ''(Hooks)''",
'version-extension-functions' => 'Funksjonnsuffruffe',
'version-parser-extensiontags' => "Parser-Erweiterunga ''(tags)''",
@@ -2778,22 +2263,14 @@ Du koast au de [[Special:Watchlist/edit|Standard-Beoarbeetungsseyte]] benutza.',
'version-skin-extension-functions' => 'Skin-Erweiterungs-Funksjonna',
'version-hook-name' => 'Schnittstallanoame',
'version-hook-subscribedby' => 'Uffruff vu',
-'version-version' => '(Version $1)',
-'version-license' => 'Lizenz',
-'version-software' => 'Installierte Software',
-'version-software-product' => 'Produkt',
-'version-software-version' => 'Version',
# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
'filepath-submit' => 'Pfad sucha',
'filepath-summary' => 'Miet dieser Spezialseyte lässt siech dar komplette Pfad dar aktuella Version einer Datei ohne Umweg obfroaga. De oagefroagte Datei werd direkt dargestallt bzw. miet der verkniepfta Oawendung gestartet.
De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
# Special:FileDuplicateSearch
-'fileduplicatesearch' => 'Datei-Duplikat-Suche',
'fileduplicatesearch-summary' => 'Siche noach Datei-Duplikaten uff Basis ihres Hash-Wertes.
De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
@@ -2805,22 +2282,19 @@ De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
'fileduplicatesearch-result-n' => 'De Datei „$1“ hoot {{PLURAL:$2|1 identisches Duplikat|$2 identische Duplikate}}.',
# Special:SpecialPages
-'specialpages' => 'Spezialseyta',
-'specialpages-note' => '----
+'specialpages' => 'Spezialseyta',
+'specialpages-note' => '----
* Spezialseyta fier Jedermoan
* <strong class="mw-specialpagerestricted">Spezialseyta fier Nutzer miet erweiterta Rechta</strong>',
-'specialpages-group-maintenance' => 'Wartungslisten',
-'specialpages-group-other' => 'Andere Spezialseyta',
-'specialpages-group-login' => 'Oamelda',
-'specialpages-group-changes' => 'Letzte Änderunga und Logbicher',
-'specialpages-group-media' => 'Media',
-'specialpages-group-users' => 'Benutzer on Rechte',
-'specialpages-group-highuse' => 'Häufig benutzte Seyta',
-'specialpages-group-pages' => 'Lista vu Seyta',
-'specialpages-group-pagetools' => 'Seytawerkzeuge',
-'specialpages-group-wiki' => 'Systemdaten und Werkzeuge',
-'specialpages-group-redirects' => 'Weiterleitende Spezialseyta',
-'specialpages-group-spam' => 'Spam-Werkzeuge',
+'specialpages-group-other' => 'Andere Spezialseyta',
+'specialpages-group-login' => 'Oamelda',
+'specialpages-group-changes' => 'Letzte Änderunga und Logbicher',
+'specialpages-group-media' => 'Media',
+'specialpages-group-users' => 'Benutzer on Rechte',
+'specialpages-group-highuse' => 'Häufig benutzte Seyta',
+'specialpages-group-pages' => 'Lista vu Seyta',
+'specialpages-group-pagetools' => 'Seytawerkzeuge',
+'specialpages-group-redirects' => 'Weiterleitende Spezialseyta',
# Special:BlankPage
'blankpage' => 'Laare Seyte',
@@ -2837,13 +2311,12 @@ De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
#Fragmente regulärer Ausdricke noach dieser Zeile eintraga. Diese Zeile ne verändern</pre>",
# Special:Tags
-'tags' => 'Giltige Änderungsmarkierungn',
-'tag-filter-submit' => 'Filter',
-'tags-title' => 'Markierunga',
-'tags-intro' => 'Diese Seyte zeigt olle Markierunga, de fier Beoarbeetunga verwendet waan, suwie deren Bedeutung.',
-'tags-tag' => 'Markierungsnoame',
-'tags-edit' => 'beoarbeeta',
-'tags-hitcount' => '$1 {{PLURAL:$1|Änderung|Änderunga}}',
+'tags' => 'Giltige Änderungsmarkierungn',
+'tags-title' => 'Markierunga',
+'tags-intro' => 'Diese Seyte zeigt olle Markierunga, de fier Beoarbeetunga verwendet waan, suwie deren Bedeutung.',
+'tags-tag' => 'Markierungsnoame',
+'tags-edit' => 'beoarbeeta',
+'tags-hitcount' => '$1 {{PLURAL:$1|Änderung|Änderunga}}',
# Database error messages
'dberr-header' => 'Dieses Wiki hoot a Problem',
diff --git a/languages/messages/MessagesSma.php b/languages/messages/MessagesSma.php
index bad581d9..8b635505 100644
--- a/languages/messages/MessagesSma.php
+++ b/languages/messages/MessagesSma.php
@@ -205,7 +205,7 @@ $messages = array(
# Login and logout pages
'yourname' => 'Nuhtjiennomme:',
'yourpassword' => 'Loevesbaakoe:',
-'remembermypassword' => 'Måjhtije mov loggesïjse nille dïhte daatovre',
+'remembermypassword' => 'Måjhtije mov loggesïjse nille dïhte daatovre (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Dov domäne:',
'login' => 'Logge sïjse',
'nav-login-createaccount' => 'Logge sïjse / skaepede nuhtjien',
@@ -290,9 +290,6 @@ Gïemhpes logge sïjse vihth männgan datne åtna låhka dïhte.',
'copyrightwarning' => "Tjaeleste gaajhke värrhtoedimmieh gåajkoe {{SITENAME}} lea ahte gïehtjele goh maam buektedh nuelesne $2 (vuajna $1 ihke detaaljeh). Bïjre datne ijje sïjhtedh dov tjaalege galka värrhtoedimmieh jallh kåpieeres minngesne jeatjebh daerpies voete, galka datne ijje tjaala daesnie.<br />
Datne luhpede mijjieh aaj datne tjaala tjaalege jïjtje, jallh kåpieeret raejeste gaaltjie goh ijje vaarjele dejstie bäjjesereaktah, jallh plïerehke.<br />
'''LISSEHTE IJJE OLKESE BÄJJESEREAKTAHVAARJELE ÃEBNE NAMHTAH LUHPIE!'''",
-'longpagewarning' => "'''VAAROEHTIDH: Dïhte bielie lea $1 kilobyteh guhkie; såemies
-gaskeviermie-låhkoeh åtna tsagkeseh värrhtoedimmie bielih stoerre jallh guhkies enn 32 kb.
-Joekedidh värrhtoedimmie sïjse unnebe sektiovneh.'''",
'templatesused' => '{{PLURAL:$1|Maal|Maler}}Maaleh nuhtjie nille dïhte bielie:',
'templatesusedpreview' => '{{PLURAL:$1|Maal|Maaleh}} nuhtjie sïjse dïhte åvte-vuesiehtidh:',
'template-protected' => '(vaarjeleme)',
@@ -555,7 +552,6 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge sÃ
# Watchlist
'watchlist' => 'Mov sïektjedhlästoe',
'mywatchlist' => 'Mov sïektjedhlästoe',
-'watchlistfor' => "(ihke '''$1''')",
'addedwatch' => 'Lissiehtidh gåajkoe sïektjedhlästoe',
'removedwatch' => 'Sihkojuvvon raejeste sïektjedhlästoe',
'removedwatchtext' => 'Bielie "[[:$1]]" lea sihkojuvvon raejeste [[Special:Watchlist|dov sïektjedhlästoe]].',
@@ -785,10 +781,10 @@ Gïemhpes veeljeme jeatjebh nomme.',
'nextdiff' => 'Minngebe joekehts →',
# Media information
-'file-info' => '(baalka stoerre: $1, MIME-vuekie: $2)',
-'file-info-size' => '($1 × $2 pixel, baalka stoerre: $3, MIME-vuekie: $4)',
+'file-info' => 'baalka stoerre: $1, MIME-vuekie: $2',
+'file-info-size' => '$1 × $2 pixel, baalka stoerre: $3, MIME-vuekie: $4',
'file-nohires' => '<small>Ijje jïlle bäjjeselöösninge jaksoes.</small>',
-'svg-long-desc' => '(SVG baalka, maadth-stoerre $1 × $2 pixel, baalka stoerre: $3)',
+'svg-long-desc' => 'SVG baalka, maadth-stoerre $1 × $2 pixel, baalka stoerre: $3',
'show-big-image' => 'Dïeves stoerre',
'show-big-image-thumb' => '<small>Stoerre ihke dïhte vuesiehtidh: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesSn.php b/languages/messages/MessagesSn.php
index 866bd47f..9b7a4256 100644
--- a/languages/messages/MessagesSn.php
+++ b/languages/messages/MessagesSn.php
@@ -94,7 +94,7 @@ Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
'yourname' => 'Zita:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Nyorazve password:',
-'remembermypassword' => 'Ndiyeuke',
+'remembermypassword' => 'Ndiyeuke (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Gamuchirwa',
'userlogin' => 'Gamuchirwa / Gadzira Akaunzi',
'logout' => 'Chibuda',
diff --git a/languages/messages/MessagesSo.php b/languages/messages/MessagesSo.php
index a8738519..fc9ea2d7 100644
--- a/languages/messages/MessagesSo.php
+++ b/languages/messages/MessagesSo.php
@@ -14,49 +14,48 @@
$messages = array(
# User preference toggles
-'tog-underline' => 'Hoos ka calaamaday linkyada:',
+'tog-underline' => 'Linkiga hoos ka calaamadeysan:',
'tog-highlightbroken' => 'Wax ka bedel linkiyada halaabay <a href="" class="new">Sidaan oo kale</a> (alternative: sidaan oo kale<a href="" class="internal">?</a>).',
'tog-justify' => 'Geesdhig baaragaraafyada',
-'tog-hideminor' => 'Qari wax ka bedelka yar ee isbedelada dhow',
+'tog-hideminor' => 'Qari bedelada yar ee isbedelada dhow',
'tog-hidepatrolled' => 'Qari wax bedelkii ugu danbeeyay oo la waardiyeeyay',
'tog-newpageshidepatrolled' => 'Ka qari maqaalada la waardiyeeyay maqaalada kale ee cusub',
'tog-extendwatchlist' => "Balaari liiska waardiyeyska si loo arko isbedelada la'xiriira, ma ahan kaliya kuwa cusub",
'tog-usenewrc' => "Isticmaal isbdelada dhowdhow oo la'horumariyey (waxaa loo baahanyahay JavaScript)",
'tog-numberheadings' => 'Lambarada automaatik ahaan u tirinaayo Cinwaanada',
-'tog-showtoolbar' => 'Itusi qalabka shaqada ee wax ka bedelka (waxaa loo baahanyahay JavaScript)',
+'tog-showtoolbar' => 'Itus bedelka qalabka shaqada (waxaa loo baahanyahay JavaScript)',
'tog-editondblclick' => 'wax ka bedel maqaalada labo jeer la riixay (waxaa loo baahanyahay JavaScript)',
'tog-editsection' => 'Fasax wax ka bedelida cutubyada dhinaca linkiyada [wax ka bedel]',
'tog-editsectiononrightclick' => 'Fasax cutub wax ka bedelida hadii batoonka midig ee dooliga <br /> dhag lagu siiyo cinwaanka korkiisa (JavaScript)',
-'tog-showtoc' => "I'tus bogga cinwaanada (boggaga leh in kabada 3 cinwaan)",
-'tog-rememberpassword' => 'Kumbuyuutarkaan ku xasuusnaaw gudagaleyheyga',
-'tog-editwidth' => 'Sanduuqa wax ka bedelka wuxuu leeyahay balaarnaan buuxda',
-'tog-watchcreations' => 'Boggaga aan qoro kudar liiska-waardiyaha',
-'tog-watchdefault' => 'Boggaga aan wax ka bedelo kudar liiska-waardiyaha',
+'tog-showtoc' => "I'tus jadwalka (boggaga leh in kabadan 3 qoraalada sare)",
+'tog-rememberpassword' => 'Kumbuyuutarkaan ku xasuusnaaw gudagalkeyga (ilaa $1 {{PLURAL:$1|maalin|maalmood}})',
+'tog-watchcreations' => 'Ku dar boggaga aan aniga sameeyay liiskayga waardiyaha',
+'tog-watchdefault' => 'Ku dar boggaga aan aniga wax ka bedelo liiskayga waardiyaha',
'tog-watchmoves' => 'Boggaga aan wareejiyo ku dar liiska-waardiyaha',
'tog-watchdeletion' => 'Boggaga aan tirtiro ku dar liiska-waardiyaha',
'tog-minordefault' => 'Isbedelada yaryar marwalba calaamadey',
-'tog-previewontop' => "Horfiirinta kahor i'tus sanduuqa wax ka bedelida",
+'tog-previewontop' => 'Itus horfiirinta kahor sanduuqa wax ka bedelida',
'tog-previewonfirst' => 'Horfiirinta itus marka ugu horeeyso oo aan wax ka bedelo',
'tog-nocache' => 'Dami browsaha maqaalada duubo',
'tog-enotifwatchlistpages' => 'E-mail ii soo dir markii oo isbedelo maqaalada ku jira liiska waardiyaheyga',
'tog-enotifusertalkpages' => 'E-mail ii soo dir markii boggayga wadahadalka oo isbedelo',
-'tog-enotifminoredits' => 'Ii soo dir xataa e-mail markii isbedelo yar lagu sameeyo bogyada',
+'tog-enotifminoredits' => 'E-mail Ii soo dir xataa markii bedelo yar lagu sameeyo bogyada',
'tog-enotifrevealaddr' => 'Iigu soo bandhig cinwaankayga e-mailka ah fariimaha wargelinta',
'tog-shownumberswatching' => "I'tus tirada isticmaalayaasha wax waardiyeynaayo",
'tog-oldsig' => 'itusi saxiixa jiro',
'tog-fancysig' => "u isticmaal saxiixa sida qoraalada wiki (ayada oo linki auomaatik la'aan)",
'tog-externaleditor' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan (La'iskuogyahay)",
'tog-externaldiff' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan oo (La'iskuogyahay)",
-'tog-showjumplinks' => 'Shid "ku bood" meelaha la geli karo',
+'tog-showjumplinks' => 'Shid "ku bood" links-ka la geli karo',
'tog-uselivepreview' => 'Isticmaal horfiirinta tooska ah (JavaScript) (Wuxuu ku jiraa tijaabo)',
'tog-forceeditsummary' => "I'xasuusi markii uusan qoraalkeyga raacsiisnay faahfaahin gaaban",
-'tog-watchlisthideown' => 'Maqaalada aan waxka bedelay ka qari liiska waardiyaha',
-'tog-watchlisthidebots' => 'Ka qari botka labedelay liiska waardiyaha',
-'tog-watchlisthideminor' => 'Ka qari waxka bedelada yar liiska waardiyeynta',
+'tog-watchlisthideown' => 'Ka qari wax bedelkeyga liiska waardiyaha',
+'tog-watchlisthidebots' => 'Ka qari bedelada robotka liiska waardiyaha',
+'tog-watchlisthideminor' => 'Ka qari bedelyada yar liiska waardiyaha',
'tog-watchlisthideliu' => 'Ka qari isbedelada ee sameeyeen isticmaalada soo gelay liiska waardiyaha',
'tog-watchlisthideanons' => 'Ka qari isbedelada ee sameeyeen isticmaalada la aqoon liiska waardiyaha',
'tog-watchlisthidepatrolled' => 'Ka qari isbedelada la waardiyeeyay liiska waardiyaha',
-'tog-ccmeonemails' => 'Ii soo dir koobiga E-boostada aan u diro isticmaalayaasha kale',
+'tog-ccmeonemails' => 'Ii soo dir e-mailada aan u diro isticmaalada kale oo koobi ah',
'tog-diffonly' => 'Kaladuwanaanshaha hoostooda qari qoraalka bogga',
'tog-showhiddencats' => 'Itusi ereykoobyada qarsoon',
'tog-norollbackdiff' => 'ha isticmaalin kala duwanaanshaha markii aad dib u soo celisay kadib',
@@ -89,7 +88,7 @@ $messages = array(
'february' => 'Febraayo',
'march' => 'Maarso',
'april' => 'Abriil',
-'may_long' => 'Maajo',
+'may_long' => 'May',
'june' => 'Juun',
'july' => 'Luuliyo',
'august' => 'Agoosto',
@@ -101,7 +100,7 @@ $messages = array(
'february-gen' => 'Febraayo',
'march-gen' => 'Maarso',
'april-gen' => 'Abriil',
-'may-gen' => 'Maajo',
+'may-gen' => 'May',
'june-gen' => 'Juun',
'july-gen' => 'Luuliyo',
'august-gen' => 'Agoosto',
@@ -113,7 +112,7 @@ $messages = array(
'feb' => 'Feb',
'mar' => 'Maar',
'apr' => 'Abr',
-'may' => 'Maj',
+'may' => 'May',
'jun' => 'Juun',
'jul' => 'Luu',
'aug' => 'Ago',
@@ -126,10 +125,10 @@ $messages = array(
'pagecategories' => '{{PLURAL:$1|Qeybta|Qeybaha}}',
'category_header' => 'Maqaalada ku jirta qeybta "$1"',
'subcategories' => 'Qeybaha hoose',
-'category-media-header' => 'war saxaafadeeda ku jirta qeybta"$1"',
+'category-media-header' => 'Wararka ku jiro qeybta"$1"',
'category-empty' => "''Qeybtaan hadda wax maqaal ah kuma jirto''",
'hidden-categories' => '{{PLURAL:$1|Qeybta qarsan|Qeybaha qarsan}}',
-'hidden-category-category' => 'Qeybta qarsoon',
+'hidden-category-category' => 'Qeybaha qarsoon',
'category-subcat-count' => '{{PLURAL:$2|Qeybtaan hadda waxaa ku jirto oo kaliya qeybtaan hoose.|Qeybtaan waxaa ku jirto {{PLURAL:$1|oo qeybta hoose|$1 oo ah qeybaha hoose}} waana $2 oo dhamaantood ah.}}',
'category-subcat-count-limited' => 'Qeybtaan waxaa ku jirto {{PLURAL:$1| oo ah qeybta hoose|$1 oo ah qeybaha hoose}}.',
'category-article-count' => '{{PLURAL:$2|Qeybtaan waxaa ku jirto intaan oo maqaal kaliya.| waxaa meeshaan ku jirto {{PLURAL:$1| oo maqaal|$1 oo maqaalo ah}} waxeena ku jiraan qeybtaan, waana $2 oo dhamaantood ah.}}',
@@ -147,20 +146,20 @@ $messages = array(
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
-'about' => 'Warbixin',
+'about' => 'Ku saabsan',
'article' => 'Maqaalada kooban',
'newwindow' => '(dariishad cusub aa furmeeyso)',
'cancel' => 'iska xir',
'moredotdotdot' => 'wax kale',
'mypage' => 'Boggeyga',
'mytalk' => 'Wadahadalkeyga',
-'anontalk' => 'Wadahadalka IP:gan',
-'navigation' => 'Navigation',
+'anontalk' => 'Wadahadalka ciwaanka IP:kaan',
+'navigation' => 'Jihada',
'and' => '&#32;iyo',
# Cologne Blue skin
'qbfind' => 'Raadi',
-'qbbrowse' => 'Ka dhax raadi',
+'qbbrowse' => 'Ka soo raadi',
'qbedit' => 'Wax ka bedel',
'qbpageoptions' => 'Boggaan',
'qbpageinfo' => 'isku xiran',
@@ -170,23 +169,24 @@ $messages = array(
'faqpage' => 'Project:SIL',
# Vector skin
-'vector-action-addsection' => 'Eray ku dar',
-'vector-action-delete' => 'Tirtir',
-'vector-action-move' => 'Wareeji',
-'vector-action-protect' => 'Difaac',
-'vector-action-undelete' => 'La tirtirin',
-'vector-action-unprotect' => 'La difaacin',
-'vector-view-create' => 'Sameey',
-'vector-view-edit' => 'Wax ka bedel',
-'vector-view-history' => 'Itusi taariikhda',
-'vector-view-view' => 'Akhri',
-'vector-view-viewsource' => 'Itusi ereykoodka',
-'actions' => 'Waxa dhacaayo',
-'namespaces' => 'Qeybta Magacyada',
+'vector-action-addsection' => 'Hadal ku dar',
+'vector-action-delete' => 'Tirtir',
+'vector-action-move' => 'Wareeji',
+'vector-action-protect' => 'Difaac',
+'vector-action-undelete' => 'La tirtirin',
+'vector-action-unprotect' => "Ha'difaacin",
+'vector-simplesearch-preference' => 'Shid kuwa ugu fiican oo kuu soo jeedinaayo raadinta (Jirka vector kaliya)',
+'vector-view-create' => 'Sameey',
+'vector-view-edit' => 'Wax ka bedel',
+'vector-view-history' => 'Itusi taariikhda',
+'vector-view-view' => 'Akhri',
+'vector-view-viewsource' => 'Itusi xogta',
+'actions' => 'Waxa dhacaayo',
+'namespaces' => 'Qeybta Magacyada',
'errorpagetitle' => 'Qalad',
'returnto' => 'Ku noqo $1.',
-'tagline' => 'Ka {{SITENAME}}',
+'tagline' => 'Ka socoto {{SITENAME}}',
'help' => 'Caawinaad',
'search' => 'Raadi',
'searchbutton' => 'Raadi',
@@ -221,27 +221,31 @@ $messages = array(
'talk' => 'Wadahadal',
'views' => 'Muuqaalka',
'toolbox' => 'Qalabka shaqada',
-'userpage' => 'Fiiri bogga isticmaalaha',
-'projectpage' => 'Fiiri bogga mashruuca',
-'imagepage' => 'Itusi fileka bogga',
+'userpage' => 'Itus bogga isticmaalaha',
+'projectpage' => 'Itus bogga mashruuca',
+'imagepage' => 'Itusi faylka bogga',
'mediawikipage' => 'Fiiri bogga fariinta',
'templatepage' => 'Fiiri bogga tusmada',
'viewhelppage' => 'Fiiri bogga caawinaada',
'categorypage' => 'Itusi qeybta bogga',
'viewtalkpage' => 'Fiiri bogga wadahadalka',
'otherlanguages' => 'Luqadaha kale',
-'redirectedfrom' => '(Waxaa laga soo dhiibay $1)',
-'redirectpagesub' => 'Bogga la soo dhiibay',
+'redirectedfrom' => '(Waxaa laga soo wareejiyay $1)',
+'redirectpagesub' => 'Bogga loo wareejiyay',
'lastmodifiedat' => 'Boggan waxaa markii ugu dambeysay wax laga bedelay $2, $1.',
'viewcount' => 'Boggaan waxaa soo booqday {{PLURAL:$1|mar|$1 jeer}}.',
-'protectedpage' => "Bog la'difaacay",
+'protectedpage' => "Bogga la'difaacay",
'jumpto' => 'U bood:',
+'jumptonavigation' => 'jihada',
'jumptosearch' => 'raadi',
'view-pool-error' => 'Naga raali noqo, kombiyutarkaan hadda woo buuxsamay.
Dad badan ayaa waqtigaan xaadirka ah fiirinooyo boggaan.
Fadlan sug intii aad markale ka soo gali kartid.
$1',
+'pool-timeout' => 'Waqtiga woo ka dhamaaday xiritaanka',
+'pool-queuefull' => 'Safka shaqeenta Pool woo buuxsamay',
+'pool-errorunknown' => 'Qalad la aqoon',
# 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' => 'Ku saabsan {{SITENAME}}',
@@ -264,7 +268,7 @@ $1',
'privacypage' => 'Project:siyaasada u gaarka ah',
'badaccess' => 'Qalad dhinaca ogolaashada',
-'badaccess-group0' => 'Laguuma ogalaan in aad sameyso waxaad rabtid',
+'badaccess-group0' => 'Laguuma ogolo in aad sameyso waxa aad rabtid',
'badaccess-groups' => 'Wixii aad na weydiisay waxaa loogu tala galay isticmaaleyaashaan u gaarka ah {{PLURAL:$2|kooxdaan|qaar ka mid ah kooxdaan}}: $1.',
'versionrequired' => 'Nuuca $1 oo MediaWiki ah aa loo baahanyahy',
@@ -273,33 +277,33 @@ fiiri [[Special:Version|nooca bogga]].',
'ok' => 'waayahay',
'retrievedfrom' => 'Waxaa laga keenay "$1"',
-'youhavenewmessages' => 'Waxaa kuu taala $1 ($2).',
+'youhavenewmessages' => 'Waxaa heysataa $1 ($2).',
'newmessageslink' => 'Fariimaha cusub',
-'newmessagesdifflink' => 'Isbedelkii ugu dambeeyay',
+'newmessagesdifflink' => 'bedelkii ugu dambeeyay',
'youhavenewmessagesmulti' => '$1 waxaa kuu yaalo fariimo cusub',
'editsection' => 'Wax ka bedel',
'editold' => 'Wax ka bedel',
-'viewsourceold' => 'Itusi ereykoodka',
+'viewsourceold' => 'Itusi xogta',
'editlink' => 'wax ka bedel',
-'viewsourcelink' => 'Itusi ereykoodka',
+'viewsourcelink' => 'Itusi xogta',
'editsectionhint' => 'Wax ka bedel: $1',
-'toc' => 'oo kooban',
+'toc' => 'waxa ku qoran',
'showtoc' => "I'tus",
'hidetoc' => 'qari',
'thisisdeleted' => 'Fiiri ama dib u sooceli $1?',
'viewdeleted' => 'Fiiri $1?',
'restorelink' => '{{PLURAL:$1|halxabo oo bedelkii la tirtiray edit|$1 wax bedelyadii la tirtiray}}',
'feedlinks' => 'Quudinta wararka:',
-'site-rss-feed' => '$1 RSS feed',
+'site-rss-feed' => '$1 RSS quudiye',
'site-atom-feed' => '$1 Atom quudiye',
'page-rss-feed' => '"$1" RSS quudiye',
'page-atom-feed' => '"$1" Atom quudiye',
'red-link-title' => '$1 (Boggan wali lama qorin)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Maqaal',
+'nstab-main' => 'Bog',
'nstab-user' => 'Bogga isticmaalaha',
-'nstab-media' => 'Bogga war saxaafadeedka',
+'nstab-media' => 'Bogga wararka',
'nstab-special' => 'Bogga khaaska ah',
'nstab-project' => 'Bogga mashruuca',
'nstab-image' => 'Fayl',
@@ -316,45 +320,56 @@ fiiri [[Special:Version|nooca bogga]].',
Waxaa meeshaan ka heli kartaa liiska bogyaasha khaaska ah oo jiro [[Special:SpecialPages|{{int:specialpages}}]].',
# General errors
-'error' => 'Qalad',
-'databaseerror' => 'Qalad ka dhacday database;ka',
-'laggedslavemode' => 'Digniin: Waxaa lagayaabaa bogaan in uusan wax cusub ku kordhin.',
-'enterlockreason' => 'Ku qor sababta loo xiraayo, kuna siidar waqtigii la soo fasaxaayo maqaalka.',
-'missingarticle-diff' => '(Kala duwanaanshaha: $1, $2)',
-'internalerror' => 'Qalad gudaha ah',
-'fileappenderrorread' => 'Ma akhri karin "$1" markii oo ku daraayay.',
-'filenotfound' => 'Ma oo san helin faylka "$1".',
-'cannotdelete' => 'Boggaan ama file\'ka "$1" mala tirtiri karo.
+'error' => 'Qalad',
+'databaseerror' => 'Qalad ka dhacday database;ka',
+'laggedslavemode' => 'Digniin: Waxaa lagayaabaa bogaan in uusan wax cusub ku soo kordhin.',
+'enterlockreason' => 'Ku qor sababta loo xiraayo, kuna siidar waqtigii la soo fasaxaayo maqaalka.',
+'missingarticle-diff' => '(Duwanaan: $1, $2)',
+'internalerror' => 'Qalad gudaha ah',
+'internalerror_info' => 'Qalad gudaha ah: $1',
+'fileappenderrorread' => 'Ma akhri karin "$1" markii oo ku daraayay.',
+'fileappenderror' => 'Ma ku dari karin "$1" ilaa "$2".',
+'filecopyerror' => 'Ma koobi gareen karin faylka "$1" ilaa "$2".',
+'filerenameerror' => 'Maka bedeli karin magaca faylka "$1" ilaa "$2".',
+'filedeleteerror' => 'Ma tirtiri karin faylka "$1".',
+'directorycreateerror' => 'Ma sameyn karin maktabad "$1".',
+'filenotfound' => 'Ma oo san helin faylka "$1".',
+'fileexistserror' => 'Ma ku qori karin faylka "$1": faylkan woo jiraa.',
+'unexpected' => 'Qiimo loo maleeneenin: "$1"="$2".',
+'badarticleerror' => 'Shaqadaan ma lagu sameyn karo boggaan.',
+'cannotdelete' => 'Boggaan ama file\'ka "$1" mala tirtiri karo.
waxaa laga yaabaa in oo qof kale tirtiray .',
-'badtitle' => 'Cinwaan qaldan',
-'viewsource' => 'Itusi ereykoodka',
-'viewsourcefor' => ' ku socoto $1',
-'actionthrottled' => 'Waala ceejiyay',
-'actionthrottledtext' => 'Hadii aan ahay ka hortaga spamka, laguuma ogolo shaqadaan badan oo ku qabatay waqti sidaan u yar,waadna ku xad gudubtay halihii laguu oglolaa.
+'badtitle' => 'Qoraal xun',
+'viewsource' => 'Itusi xogta',
+'viewsourcefor' => ' ku socoto $1',
+'actionthrottled' => 'Shaqada waala ceejiyay',
+'actionthrottledtext' => 'Hadii aan ahay ka hortaga spamka, laguuma ogolo shaqadaan badan oo waqti sidaan u yar ku qabatay,waadna ku xad gudubtay halihii laguu oglolaa.
fadlan waxyar kadib ku soo noqo.',
-'protectedpagetext' => 'Boggaan woo xiranyahay si aan wax looga bedelin.',
-'viewsourcetext' => 'Waad fiirin kartaa waana koobi gareen kartaa ereykoodka boggaan',
-'cascadeprotected' => 'Boggaan waxaa laga difaacay in wax laga bedelo, sababtoo ah waxoo ka midyahay {{PLURAL:$1|bog, oo ah |bogyaalo ah, waana}} kuwa laga difaacay "qoraalada kaskade" dooqyada neh waa la furay:
+'protectedpagetext' => 'Boggaan waala difaacay si aan wax looga bedelin.',
+'viewsourcetext' => 'Waad fiirin kartaa waana koobi gareen kartaa xogta boggaan:',
+'cascadeprotected' => 'Boggaan waxaa laga difaacay in wax laga bedelo, sababtoo ah waxoo ka midyahay {{PLURAL:$1|bog, oo ah |bogyaalo ah, waana}} kuwa laga difaacay "qoraalada kaskadka ah" dooqyada woo u furanyahay:
$2',
-'namespaceprotected' => "Ma laguu ogolo in aad wax ka bedeshid maqaalada ku jiro '''$1''' dhinaca magacyada.",
-'ns-specialprotected' => 'Bogyaasha gaarka ah wax malaga bedeli karo.',
-'titleprotected' => 'Qoraalkaan aad qortay waxaa difaacay [[User:$1|$1]] si loo sameynin.
+'namespaceprotected' => "Ma laguu ogolo in aad wax ka bedesho maqaalada ku jirto '''$1''' meesha magacyada.",
+'customcssjsprotected' => 'Ma laguu ogolo in aad wax ka badashid boggaan, sababtoo ah waxaa ku jiro isticmaalo kale waxyaabo u shaqsi ah.',
+'ns-specialprotected' => 'Bogyaasha gaarka ah wax malaga bedeli karo.',
+'titleprotected' => 'Qoraalkaan aad qortay waxaa difaacay [[User:$1|$1]] si loo sameynin.
Sababta neh waxaa waaye "\'\'$2\'\'".',
# Virus scanner
+'virus-scanfailed' => 'baaritaanka woo shaqeesmi waayay (koodka $1)',
'virus-unknownscanner' => 'ka hor tagga fayruska la aqoon:',
# Login and logout pages
'logouttext' => "'''Hada waad ka baxday.'''
Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama [[Special:UserLogin|gudaha gal]] adiga oo isticmaalaya magacaagii hore ama mid ka duwan. OGEYSIIS waxaa lagayabaa bogyaasha qaarkood in ay yiraahdaan wali gudaha ayaad ku jirtaa, ilaa inta aad ka nadiifineesid browsahaaga Internetka.",
-'welcomecreation' => "== Ku soo dhawoow, $1! ==
+'welcomecreation' => "== Soo dhawoow, $1! ==
Akoon kaada waa la sameeyay.
-Ha' hilmaamin in aad wax ka bedesho [[Special:Preferences|{{SITENAME}} dooqaaga]].",
+Ha' hilmaamin in aad wax ka bedesho [[Special:Preferences|{{SITENAME}} dooqyadaada]].",
'yourname' => 'Magaca gudagalka:',
'yourpassword' => 'Eraysir:',
'yourpasswordagain' => 'Markale qor erayga sirta ah:',
-'remembermypassword' => 'Kumbuyuutarkaan ku xasuusnaaw gudagalkeyga',
+'remembermypassword' => 'Kumbuyuutarkaan ku xasuusnaaw magaceyga gudagalka (ilaa $1 {{PLURAL:$1|maalin|maalmood}})',
'yourdomainname' => 'Magacaga shabakada',
'login' => 'Gudaha gal',
'nav-login-createaccount' => 'Gudaha gal / sameyso akoon',
@@ -370,11 +385,12 @@ Ha' hilmaamin in aad wax ka bedesho [[Special:Preferences|{{SITENAME}} dooqaaga]
'gotaccount' => "Waan heystaa gudagale? '''$1'''.",
'gotaccountlink' => 'Gudaha gal',
'createaccountmail' => 'E-mail ahaan',
+'createaccountreason' => 'Sababta:',
'badretype' => 'Ereyada sirta ah oo qortay ma islahan.',
'userexists' => 'Magaca isticmaalaha aad qortay woo jiraa. Fadlan dooro magac kale.',
'loginerror' => 'Qalad gudagalista',
-'createaccounterror' => 'Ma sameen karin akoon: $1',
-'nocookiesnew' => "Magaca isticmaalahaan waa la sameeyay, laakiin adiga gudaha uma gelin.
+'createaccounterror' => 'Ma sameeyn karin akoon: $1',
+'nocookiesnew' => "Magaca isticmaalahaan waa la sameeyay, laakiin adiga gudaha uma soo gelin.
{{SITENAME}} waxoo isticmaalaa cookies si ee gudaha u galaan isticmaale yaasha.
Adiga cookies'kaaga woo dansanyahay .
Fadlan shid, kadib neh gudaha ku gal magacaaga cusub ee gudagalaha ah iyo ereygaaga sirta ah.",
@@ -383,7 +399,7 @@ Cookies'kaaga woo dansanyahay.
Fadlan shid markale neh ku noqo.",
'noname' => "Magaca gudagalaha sax ma'aha.",
'loginsuccesstitle' => 'Gudagalida waa la dhamaystiray',
-'loginsuccess' => "'''Hada waxaad gudaha ugu soo gashay {{SITENAME}} sida \"\$1\".'''",
+'loginsuccess' => "'''Waxaa hadda gudaha ugu soo gashay {{SITENAME}} sida \"\$1\".'''",
'nosuchuser' => 'Ma jiro isticmaalo leh magacaan "$1".
Magacyada way kala waaweyn yihiin.
Sax hingaada, ama [[Special:UserLogin/signup|samayso magac gudagale ah]].',
@@ -396,7 +412,7 @@ Sax hingaada, ama [[Special:UserLogin/signup|samayso magac gudagale ah]].',
'password-name-match' => 'Eraygaaga sirta ah waa in oo ka badalnaadaa magacaaga gudagale',
'mailmypassword' => 'E-mail iigu soo dir ereysir cusub',
'passwordremindertitle' => 'Eraysir ku meelgaar ah oo loogu talagalay {{SITENAME}}',
-'passwordremindertext' => 'Qof (laga yaabo in aad adiga tahay, kana soo galay cinwaanka-IP $1) ayaa eraysir oo cusub u codsaday {{SITENAME}} ($4).
+'passwordremindertext' => 'Qof (laga yaabo in aad adiga tahay, kana soo galay cinwaanka-IP-ka $1) ayaa eraysir oo cusub u codsaday {{SITENAME}} ($4).
Eraysir oo ku meelgaar ah oo loogu talagalay isticmaalaha "$2" ayaa la sameeyay waxaana loo diray "$3".
Hadii uu ahaa qofka rabay, waxaa la rabaa in aad hadda gudaha u gashid isla markaas neh eraysir cusub dooratid.
Eraygaan sirta oo ku meelgaarka ah waxoo dhici doonaa ilaa {{PLURAL:$5|maalin|$5 maalmood}}.
@@ -404,18 +420,20 @@ Eraygaan sirta oo ku meelgaarka ah waxoo dhici doonaa ilaa {{PLURAL:$5|maalin|$
Hadii u qofkale sameeyay codsigaan, ama aad soo xasuusatay eraysirkaagii,
oo aadan u baahnayn in aad bedeshid, iska ilow farriintaan siina wado eraysirkaagi hore.',
'noemail' => 'E-mailkiisa lama haayo isticmaalaha "$1".',
-'noemailcreate' => 'Waa in aad ciwaan e-mail sax ah keentaa.',
+'noemailcreate' => 'Waa in aad ciwaan e-mail oo sax ah keentaa.',
'passwordsent' => 'Eraysir oo cusub ayaa e-mail loogu diray isticmaalaha "$1".
Fadlan gudaha u gal markii aad fariintaas heshid.',
'blocked-mailpassword' => 'Cinwaankaada IP:ka waxaa laga mamnuucay in oo wax bedelo, sidoo kale looma ogolo in oo bedelo ereyga sirta ah si oo uuga fakado danbiga lagu heesto',
-'eauthentsent' => "Xaqiijin e-mail ah ayaa loo diray e-mailkan aad dooray.
-Intii aadan wax e-mail ah loogu soo dirin akoon'kaada, waa in aad daba kacdaa waxa kuugu jiro e-mailka, si aad u xaqiijisid in aad e-mailka leedahay adi.",
-'mailerror' => 'Waxaa dhacay qalad markii loo diraayey e-mail: $1',
+'eauthentsent' => "Xaqiijin e-mail ah ayaa loo diray e-mailkan aad dooratay.
+Intii aadan wax e-mail ah lagu soo dirin koontada, waa in aad daba kacdaa waxa kuugu jiro e-mailka, si aad u xaqiijisid in aad adiga leedahay akoon'ka.",
+'mailerror' => 'Qalad dirida e-mailka: $1',
'acct_creation_throttle_hit' => "Dadka soo booqanaayo wiki:gaan oo isticmaalaayo cinwaankaaga IP:ka waxay sameeyeen {{PLURAL:$1|1 magac gudagale ah|$1 magac gudagalayaal ah}} maalintii ugu dambeysay, taasina waa inta ugu badan ee la'ogolyahay muddadaas. Sidaas daraadeed, booqoshadayaasha isticmaalaya cinwaankaan-IP:ka hadda ma'sameysankaraan magac gudagale danbe.",
'emailauthenticated' => 'E-mailkaada waxaa lagu xaqiijiyay $2 markey ahayd $3.',
'emailnotauthenticated' => 'Ciwaankaada e-mailka weli lama xaqiijinin.
Wax e-mail ah oo ku saabsan arrimaha soo socdo looma soo diridoono.',
'emailconfirmlink' => 'Soo xaqiiji ciwaankaada e-mailka',
+'invalidemailaddress' => 'e-mailkaan lama ogolaan karo ayada oo ku ku jirto format la aqoonsan..
+Fadlan ku qor ciwaan leh format sax ah ama ebar ka dhig meesha.',
'accountcreated' => "Akoon aa la'sameeyay",
'accountcreatedtext' => "Akoonka isticmaalaha $1 waa la'sameeyay.",
'createaccount-title' => 'Waxaa akoon loo sameeyay {{SITENAME}}',
@@ -431,29 +449,43 @@ Fadlan waxyar sug intii aadan soo gelin.',
'resetpass' => 'Bedel ereysirka',
'resetpass_announce' => 'waxaa ku soo geshay eraysir ku meelgaar ah oo e-mail laguugu soo diray.
Hadii aad rabtid in aad dhameestirtid gudagelkaaga, waa in aad meeshaan ku qortaa eraysir oo cusub:',
-'resetpass_header' => 'bedel ereyga sirta ee koontada',
+'resetpass_header' => 'bedel ereyga sirta ee akoon-ka',
'oldpassword' => 'Ereysirkii hore:',
'newpassword' => 'Ereysir cusub:',
'retypenew' => 'Qor mar labaad ereysirka cusub:',
-'resetpass_forbidden' => 'ereyada sirka ah mala bedeli karo',
+'resetpass_success' => 'Ereysirkaada si fiican oo kuugu bedelmay!
+Hadda gudaha ku gal',
+'resetpass_forbidden' => 'ereyada sirta ah mala bedeli karo',
+'resetpass-no-info' => 'Waa in aad gudaha u gashaa hadii aad rabto in aad si toos ah ugu soo gudubto boggaan.',
'resetpass-submit-loggedin' => 'bedel ereysirka',
'resetpass-submit-cancel' => 'Iska xir',
'resetpass-temp-password' => 'Ereysir ku meel gaar ah:',
# Edit page toolbar
-'media_tip' => 'Linkiga file-ka',
+'bold_sample' => 'Far butac ah',
+'bold_tip' => 'Far butac ah',
+'italic_sample' => 'Farta caatada ah',
+'italic_tip' => 'Farta caatada ah',
+'link_sample' => 'Qoraalka linkiga',
+'headline_sample' => 'Qoraalka madaxa hore',
+'nowiki_tip' => 'Iska dhagooleey formatka wiki',
+'image_tip' => 'Fayl la soo galiyay',
+'media_tip' => 'Linkiga file-ka',
# Edit pages
-'minoredit' => 'Kan waa wax ka bedel yar',
-'watchthis' => 'Boggaan waardiyey',
-'savearticle' => 'Bogga kaydi',
-'preview' => 'Horfiiri',
-'showpreview' => 'Itus horfiirinta',
-'showlivepreview' => 'Horfiirin toos ah',
-'showdiff' => 'Itus isbedelka',
-'anoneditwarning' => "'''Digniin:''' Gudaha kuma jirtid. Cinwaankaaga IP:ga waxaa lagu diiwaangelindoonaa taariikhda bedelida bogan.",
-'blockedtitle' => 'Isticmaalaha waa la mamnuucay',
-'blockedtext' => "'''Magacaaga gudagalaha ama ciwaanka IP'ka waa la mamnuucay.'''
+'summary' => 'Qoraal kooban:',
+'minoredit' => 'Kan waa wax ka bedel yar',
+'watchthis' => 'Boggaan waardiyey',
+'savearticle' => 'Bogga kaydi',
+'preview' => 'Horfiiri',
+'showpreview' => 'Itus horfiirinta',
+'showlivepreview' => 'Horfiirin toos ah',
+'showdiff' => 'Itus isbedelka',
+'anoneditwarning' => "'''Digniin:''' Gudaha kuma jirtid. Cinwaankaaga IP:ga waxaa lagu diiwaangelindoonaa taariikhda bedelida bogan.",
+'anonpreviewwarning' => "''Ma soo gelin. Hadii aad keydisid waxaa ciwaankaada IP:ka lagu duubaa taariikhda bedelka boggaan.''",
+'missingcommenttext' => 'Fadlan ku qor hoostaan hadalkaaga.',
+'blockedtitle' => 'Isticmaalaha waa la mamnuucay',
+'blockedtext' => "'''Magacaaga gudagalaha ama ciwaanka IP'ka waa la mamnuucay.'''
Mamnuucida waxaa sameeyay $1.
Sababta neh waxaa waaye ''$2''.
@@ -466,49 +498,75 @@ Waxaa la xiriiri kartaa $1 ama mid ka mid ah [[{{MediaWiki:Grouppage-sysop}}|m
Ma isticmaali kartid 'e-mailka isticmaalahaan' soo diray hadii aad heesato maa hinee ciwaan e-mail oo kuugu jiro [[Special:Preferences|koontadaada]] oona lagaa mamnuucin in aad isticmaasho.
Ciwaankaada IP'ka waa $3, gudagalahaaga la mamnuucay neh waa #$5.
fadlan ku soo dar su'aalahaaga waxa kor ku qoran.",
-'blockednoreason' => 'wax sabab ah kama bixin',
-'blockedoriginalsource' => "Ereykoodka '''$1''' hoos ka fiiri:",
-'blockededitsource' => "Qoraalkii '''aad waxkaga bedashay''' '''$1''' waxaad ku arkikartaa hoos:",
-'whitelistedittitle' => 'Waxaa loo baahanyahay gudagal si aad wax uga bedeshid',
-'whitelistedittext' => 'Waa in aad $1 si aad wax uga bedeshid boggaga.',
-'confirmedittext' => 'Waa in aad xaqiijisaa e-mailkaada inta aadan sameynin bogaga.
+'blockednoreason' => 'wax sabab ah kama bixin',
+'blockedoriginalsource' => "Xogta '''$1''' hoos aad ka arki kartaa:",
+'blockededitsource' => "Qoraalkii '''aad waxkaga bedashay''' '''$1''' waxaad ku arkikartaa hoos:",
+'whitelistedittitle' => 'Waxaa loo baahanyahay gudagal si aad wax uga bedeshid',
+'whitelistedittext' => 'Waa in aad $1 si aad wax uga bedeshid boggaga.',
+'confirmedittext' => 'Waa in aad xaqiijisaa e-mailkaada inta aadan bogaga wax ka bedelin.
fadlan ku dar kuna xaqiiji e-mailkaada meesha [[Special:Preferences|dooqyada gudagalahaaga]].',
-'loginreqtitle' => 'Waxaa loo baahanyahay gudagalid',
-'loginreqlink' => 'Gudaha gal',
-'loginreqpagetext' => 'Waa in aad $1 si aad u fiirisid bogyaasha kale.',
-'accmailtitle' => "Ereysirka waa la'diray.",
-'accmailtext' => 'Ereysirka "$1" waxaa loo diray $2.',
-'newarticle' => '(Cusub)',
-'anontalkpagetext' => "----''Meeshaan waa bogga wadahadalka isticmaalayaasha aanan la aqoonsanin oo aanan weli sameysanin akoon ama aanan weli isticmaali. Si loo kala sooco isticmaalayaasha, waa in aan isticmaalnaa lambar cinwaaneedka IP:ga. Cinwaanka IP:ga waxaa suurto gal ah in ay wada isticmaalaan dad badan. Hadii aad tahay isticmaale aanan la'aqoonsanin oo aad dareemaysid in laguu gafay, fadlan ka sameyso akoon meeshaan [[Special:UserLogin|sameyso akoon ama gudaha gal]] si aad uga dhowrsatid in laguugu qaldo isticmaalayaasha kale oo aann la'aqoonsanin.''",
-'userpage-userdoesnotexist-view' => 'Isticmaalahaan "$1" lama diiwaan gelinin.',
-'blocked-notice-logextract' => 'Isticmaalahaan hadda waa la mamnuucay.
+'nosuchsectiontext' => 'Waxaa baroobeysay in aad wax ka bedesho maqaal jirin.
+Waxaa laga yaabaa in la wareejiyay ama la tirtiray adiga oo fiirinaayo bogga.',
+'loginreqtitle' => 'Waxaa loo baahanyahay gudagalid',
+'loginreqlink' => 'Gudaha gal',
+'loginreqpagetext' => 'Waa in aad $1 si aad u fiirisid bogyaasha kale.',
+'accmailtitle' => "Ereysirka waa la'diray.",
+'accmailtext' => 'Ereysirka "$1" waxaa loo diray $2.',
+'newarticle' => '(Cusub)',
+'newarticletext' => "Waxaa soo raacday link kula soo xiriiriyay bog oo hadda wali jirin.
+Hadii aad rabto in aad sameyso bogga, hoos ka bilaaw qoraalkaada (fiiri [[{{MediaWiki:Helppage}}|bogga caawinaada]] wax war ah oo kale).
+hadii aad meeshaan ku soo qaldantay, riix batoonka barowsahaaga '''gadaal uuga noqo''' .",
+'anontalkpagetext' => "----''Meeshaan waa bogga wadahadalka isticmaalayaasha la aqoon oo aanan weli sameysanin akoon, ama wali isticmaalin.
+Sidaas darteed, waa in aan isticmaalnaa lambar cinwaaneedka IP:ga. Cinwaanka IP:ga waxaa suurto gal ah in ay wada isticmaalaan dad badan. Hadii aad tahay isticmaale aanan la'aqoonsanin oo aad dareemaysid in laguu gafay, fadlan [[Special:UserLogin/signup|sameyso akoon]] ama [[Special:UserLogin|gudaha gal]] si aad u dhowrsatid in hadhowdi laguugu qaldo isticmaalada kale oo aann la'aqoonsanin.''",
+'noarticletext' => 'Boggaan hadda wax qoraal ah kuma qorno.
+Waxaa [[Special:Search/{{PAGENAME}}|magaca boggaan]] ka raadin kartaa bogyaasha kale,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} raadi kuwo la mid ah],
+ama [{{fullurl:{{FULLPAGENAME}}|action=edit}} wax ka bedel boggaan]</span>.',
+'noarticletext-nopermission' => 'Hadda boggaan wax qoraal ah kuma qorno.
+Waxaa [[Special:Search/{{PAGENAME}}|magaca boggaan ka raadin kartaa]] boggaga kale ama <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ka raadi gudagalayaasha kale]</span>.',
+'userpage-userdoesnotexist' => 'Isticmaalahan "$1" ma diiwaangashno.
+Fadlan fiiri hadii aad rabto in aad sameeyso/wax ka bedesho boggaan.',
+'userpage-userdoesnotexist-view' => 'Isticmaalahaan "$1" ma diiwaangashno.',
+'blocked-notice-logextract' => 'Isticmaalahaan hadda waa la mamnuucay.
Mamnuucida ugu danbeyso in oo soo galo hoostaan ee ku qorantahay',
-'usercssyoucanpreview' => "'''Ogeysiis:''' Isticmaal batoonka \"{{int:showpreview}}\" si aad u baroobeeso CSS'gaaga cusub intii aadan kaydin.",
-'userjsyoucanpreview' => "'''Ogeysiis:''' Isticmaal batoonka \"{{int:showpreview}}\" si aad u baroobeeso JavaScriptigaaga cusub intii aadan kaysin.",
-'userjspreview' => "'''Waa in aad ogaataa waxaa baroobeynoosaa/fiirinoysaa kaliya JavaScript'ka isticmaalahaaga.'''
+'usercssyoucanpreview' => "'''Ogeysiis:''' Isticmaal batoonka \"{{int:showpreview}}\" si aad u baroobeeso CSS'gaaga cusub intii aadan kaydin.",
+'userjsyoucanpreview' => "'''Ogeysiis:''' Isticmaal batoonka \"{{int:showpreview}}\" si aad u baroobeeso JavaScriptigaaga cusub intii aadan kaydin.",
+'userjspreview' => "'''Waa in aad ogaataa waxaa baroobeynoosaa/fiirinoysaa kaliya JavaScript'ka isticmaalahaaga.'''
'''wali lama keydin!'''",
-'updated' => '(waa la opdate gareeyay)',
-'note' => "'''fiiro gaar:'''",
-'previewnote' => "'''Waxa aad aragtid waa horfiirin; wixii aad bedeshay lama keydinin!'''",
-'session_fail_preview' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.
+'updated' => '(waa la opdate gareeyay)',
+'note' => "'''fiiro gaar ah:'''",
+'previewnote' => "'''Waxa aad aragtid waa horfiirin; wixii aad bedeshay lama keydinin!'''",
+'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.'''
+'session_fail_preview_html' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.'''
''Sababtoo ah {{SITENAME}}han wuxuu leeyahay HTML ceyriin ah, horfiirintiisa waxaa loo qariyey si looga hortago weerar ka yimaada JavaScriptga.''
'''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 wax ka bedeloosaa $1',
-'editingsection' => 'Waxaa wax ka bedeloosaa $1 (qaar)',
-'yourtext' => 'Qoraalkaaga',
-'editingold' => "'''DIGNIIN: Waxaad wax ka bedeli rabtaa boggan caddadkiisa duqoobay.
+'editing' => 'Waxaa wax ka badaloosaa $1',
+'editingsection' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
+'editingcomment' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
+'editconflict' => 'Isku dhac badalaadka: $1',
+'yourtext' => 'Qoraalkaaga',
+'editingold' => "'''DIGNIIN: Waxaad wax ka bedeli rabtaa boggan caddadkiisa duqoobay.
Hadii aad keydisid, waxaa dhumidoona caddadyadii kan ka dambeeyey.'''",
-'yourdiff' => 'Kaladuwanaanshaha',
-'semiprotectedpagewarning' => "'''Fiiro gaar ah:''' Beyjkan waa laxiray, kuwa magaca gudagal ka leh kaliya ayaa wax ka badalikara.",
-'template-protected' => '(waa la difaacay)',
-'hiddencategories' => 'Boggaan waxoo ka mid yahay {{PLURAL:$1|1 qeyb oo qarsoon|$1 oo ah qeybaha qarsoon}}:',
-'nocreate-loggedin' => 'Laguuma ogola inaad beyjaj cusub ku sameysid {{SITENAME}}han.',
-'permissionserrors' => 'Cillado ogolaashada ah',
-'edit-conflict' => 'Wax bedel isku dhacay',
+'yourdiff' => 'Kala duwanaanshaha',
+'protectedpagewarning' => "'''Digniin: Boggaan waa la difaacay si ee isticmaalada heesto maamulnimada kaliya wax uuga badali karaan'''
+Fariintii gudagalihii ugu danbeeyay hoostaan ee ku qorontahay:",
+'semiprotectedpagewarning' => "'''Fiiro gaar ah:''' Beyjkan waa laxiray, kuwa magaca gudagal ka leh kaliya ayaa wax ka badalikara.",
+'template-protected' => '(waa la difaacay)',
+'template-semiprotected' => '(difaaca-fudud)',
+'hiddencategories' => 'Boggaan waxoo ka mid yahay {{PLURAL:$1|1 qeyb oo qarsoon|$1 oo ah qeybaha qarsoon}}:',
+'nocreate-loggedin' => 'Ma laguu ogolo in aad sameyso boggag cusub.',
+'permissionserrors' => 'Cillado ogolaashada ah',
+'permissionserrorstext-withaction' => 'Ma laguu ogolo in aad $2, ku sameysid {{PLURAL:$1| sabab|sababahaan }} la xiriiro:',
+'recreate-moveddeleted-warn' => "'''Digniin: waxaa dib u sameyn rabtaa bog mar hore la tirtiray.'''
+
+Waa in aad si fiican uuga fikirtaa hadii ee habboontahay sii socoshada bedelaadka boggaan.
+Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa meeshaan:",
+'moveddeleted-notice' => 'Boggaan waa la tirtiray.
+Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa hoostaan.',
+'edit-conflict' => 'Wax bedel isku dhacay',
# Account creation failure
'cantcreateaccounttitle' => "Ma' sameynkaro gudagal (akoon)",
@@ -517,28 +575,32 @@ Hadii aad keydisid, waxaa dhumidoona caddadyadii kan ka dambeeyey.'''",
Sababta neh waxaa qoray $3 waa ''$2''",
# History pages
+'viewpagelogs' => 'Fiiri guadagalayaasha boggaan',
'currentrev' => 'Cadadka cusub',
-'previousrevision' => 'â†Caddad ka duqsanÅ ',
+'currentrev-asof' => 'Kala duwanaanshihii ugu danbeeyay oo dhacay $1',
+'revisionasof' => 'Muuqaalkii $1',
+'revision-info' => 'Nuucii ahaa $1 ee $2',
+'previousrevision' => 'â†Bedelaadka ka duqsan',
'nextrevision' => 'Caddad ka cusub→',
'currentrevisionlink' => 'Caddadka hada muuqda',
-'cur' => 'kur',
-'next' => 'Ku xiga',
+'cur' => 'kan hadda',
+'next' => 'kan ku xiga',
'last' => 'Ugu dambeeyo',
-'page_first' => 'Ugu horeeyo',
-'page_last' => 'ugu dambeeyo',
-'histlegend' => "Xarafka Diff : waxoo isku aadinaa maqaalada aad rabtid in aad isku fiirisid kadib neh riix gal ama batoonka kuyaalo hoosta.<br />
+'page_first' => 'kan ugu horeeyo',
+'page_last' => 'Kan ugu dambeeyo',
+'histlegend' => "Xarafka Duwanaan : waxoo isku fiirinaa bedelaadyada kadib neh riix gal ama batoonka kuyaalo hoosta.<br />
micnaha: '''({{int:cur}})''' = kala duwanaanshaha maqaaladii ugu danbeeyay, '''({{int:last}})''' = kala duwanaanshaha maqaaladii ka horeeyay, '''{{int:minoreditletter}}''' = bedelada yar.",
-'history-fieldset-title' => 'Gudaha u gal taariikhda',
+'history-fieldset-title' => 'Soo raadi taariikhda',
'history-show-deleted' => 'Wixii la tirtiray kaliya',
-'histfirst' => 'Wixii ugu danbeeyay',
-'histlast' => 'ugu cusub',
+'histfirst' => 'Kuwii ugu dhawaa',
+'histlast' => 'Kuwii ugu cusbaa',
'historyempty' => '(waa ebar)',
# Revision feed
'history-feed-title' => 'Taariikhda caddadyaasha',
'history-feed-empty' => 'Beyjka aad dooneyso majiro.
-Waxaa lagayaabaa in laga tir tiray wikigan, ama magacii laga badalay.
-Iskuday in aad [[Special:Search|karaadiso wikigan]] beyjaj laxiira oo cusub.',
+Waxaa lagayaabaa in laga tirtiray wikigan, ama magacii laga badalay.
+Iskuday in aad [[Special:Search|ka raadiso wikigaan]] Beyjajka la heli karo oo cusub.',
# Revision deletion
'rev-deleted-user' => '(magaca isticmaalaha waa laga saaray)',
@@ -551,6 +613,8 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'revdelete-radio-set' => 'Haa',
'revdelete-radio-unset' => 'Maya',
'revdelete-log' => 'Sababta:',
+'revdel-restore' => 'badal muuqaalka',
+'revdel-restore-deleted' => 'kuwii la tirtiray badalyadooda',
'pagehist' => 'Taariikhda bogga',
'revdelete-content' => 'oo kooban',
'revdelete-uname' => 'Magaca isticmaalaha',
@@ -558,40 +622,59 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'revdelete-reasonotherlist' => 'sabababaha kale',
# History merging
-'mergehistory-from' => 'Ereykoodka bogga:',
+'mergehistory-from' => 'Xogta bogga:',
'mergehistory-reason' => 'Sabab:',
# Diffs
-'difference' => '(Qeybaha kala duwan)',
-'editundo' => 'ka noqo',
+'history-title' => 'Bedelaadka taariikhiga "$1"',
+'difference' => '(Qeybaha kala duwan)',
+'lineno' => 'Safka $1:',
+'compareselectedversions' => 'Isku aadi bedelaadka aad dooratay',
+'showhideselectedversions' => 'Itusi/qari bedelaadyada aad dooratay',
+'editundo' => 'ka noqo',
# Search results
'searchresults' => 'Raadi natiijooyinka',
-'searchresults-title' => 'Natiijoojika raadinta ku aadan "$1"',
+'searchresults-title' => 'Raadi natiijoojika "$1"',
'searchsubtitle' => 'Waxaad raadisay \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|dhamaan bogyaasha ka bilaawdo "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|dhamaan bogyaasha la xiriiro "$1"]])',
-'searchsubtitleinvalid' => "Waxaad raadisay '''$1'''",
+'searchsubtitleinvalid' => "Waxaa raadisay '''$1'''",
'prevn' => 'Ka horeeya {{PLURAL:$1|$1}}',
'nextn' => 'Ku xiga {{PLURAL:$1|$1}}',
+'prevn-title' => 'kan ka horeeyay $1 {{PLURAL:$1|natiijo|natiijooyinka}}',
+'nextn-title' => 'Kan ku xiga $1 {{PLURAL:$1|natiijo|natiijooyinka}}',
+'shown-title' => 'Itusi $1 {{PLURAL:$1|natiijo|natiijooyinka}} halkii bog',
'viewprevnext' => 'Fiiri ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'Raadi doorashooyinka',
+'searchmenu-exists' => "'''Wikigaan woo ku jiraa bog la dhoho \"[[:\$1]]\" .'''",
+'searchmenu-new' => "'''Ku sameey bogga \"[[:\$1]]\" wikigaan!'''",
'searchhelp-url' => 'Help:Caawinaad',
'searchprofile-articles' => 'Maqaalada kooban',
+'searchprofile-project' => 'Caawin iyo Bogga mashruuca',
'searchprofile-everything' => 'Wax kasto',
+'searchprofile-advanced' => 'La talin',
'searchprofile-articles-tooltip' => 'Ka raadi $1',
'searchprofile-project-tooltip' => 'Ka raadi $1',
-'searchprofile-images-tooltip' => 'Maqaalo raadi',
+'searchprofile-images-tooltip' => 'Raadi faylyada',
'searchprofile-everything-tooltip' => 'Raadi wax kasto oo kooban ( xattaa bogga wadahadalka)',
'searchprofile-advanced-tooltip' => 'Ka raadi qeybta isticmaalada',
'search-result-size' => '$1 ({{PLURAL:$2|1 eray|$2 erayo}})',
+'search-result-category-size' => '{{PLURAL:$1|1 ka mid ah|$1 ka mid ah}} ({{PLURAL:$2|1 qeybta hoose|$2 qeybaha hoose}}, {{PLURAL:$3|1 fayl|$3 fayl-yo}})',
+'search-redirect' => '(waxaa loo wareejiyay $1)',
'search-section' => '(maqaalka $1)',
'search-suggest' => 'Waxaa ka waday miyaa: $1',
+'search-interwiki-default' => '$1 natiijooyinka:',
'search-interwiki-more' => '(wax kale)',
'search-mwsuggest-enabled' => 'soojeedin',
'search-mwsuggest-disabled' => 'soojeedin malahan',
'search-relatedarticle' => 'La xiriiro',
'searchrelated' => 'La xiriiro',
'searchall' => 'Dhamaan',
+'showingresultsheader' => "{{PLURAL:$5|Natiijada '''$1''' ee '''$3'''|Natiijooyinka '''$1 - $2''' ee '''$3'''}} oo ah '''$4'''",
+'search-nonefound' => 'Wax natiijo oo ka soo baxay ma jirto wixii aad raadisay',
'powersearch' => 'Sidii aad wax uugu raadin laheed',
+'powersearch-legend' => 'Sidii aad wax uugu raadin laheed',
+'powersearch-ns' => 'ka raadi meesha magacyada:',
+'powersearch-redir' => 'liista inta la wareejiyay',
'powersearch-field' => 'Raadi',
'powersearch-togglelabel' => 'Fiiri',
'powersearch-toggleall' => 'Dhamaan',
@@ -609,7 +692,7 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'skin-preview' => 'Horfiirin',
'prefs-math' => 'Xisaab',
'datedefault' => "Ma'jiro dooq",
-'prefs-datetime' => 'Taariikhda iyo saacadda',
+'prefs-datetime' => 'Taariikhda iyo waqtiga',
'prefs-rc' => 'Isbedelada dhow',
'prefs-watchlist' => 'liiska-waardiyaha',
'prefs-watchlist-days' => 'Tirada maalamaha ay ku jirayaan liiska-waardiyaha:',
@@ -619,6 +702,7 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'searchresultshead' => 'Raadi',
'recentchangesdays' => 'Tirada maalmaha lagu tusaayo isbedelada dhow:',
'savedprefs' => 'Dooqyadaada waa la keydiyey.',
+'timezonelegend' => 'Soonaha waqtiga:',
'localtime' => 'Waqtigaaga',
'timezoneregion-africa' => 'Afrika',
'timezoneregion-america' => 'Ameerika',
@@ -627,6 +711,7 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'timezoneregion-asia' => 'Aasiya',
'timezoneregion-atlantic' => 'Badweynta Atlaantik',
'allowemail' => 'Ogolow in e-mail ay kaagatimaado isticmaalayaasha kale',
+'prefs-searchoptions' => 'Dooqyada raadinta',
'youremail' => 'E-mail:',
'username' => 'Gudagal:',
'uid' => 'Lambarka isticmaalaha:',
@@ -645,7 +730,8 @@ Waa in aysan ka badanin $1 {{PLURAL:$1|eray|erayo}}.',
'prefs-help-email-required' => 'Waxaa loo baahanyahay e-mail.',
# User rights
-'saveusergroups' => 'Kaydi kooxaha isticmaalayaasha',
+'saveusergroups' => 'Kaydi kooxaha isticmaalayaasha',
+'userrights-groupsmember' => 'Ka mid ah:',
# Groups
'group' => 'Koox:',
@@ -682,68 +768,129 @@ Waa in aysan ka badanin $1 {{PLURAL:$1|eray|erayo}}.',
'action-delete' => 'tirtir boggaan',
'action-browsearchive' => 'Raadi maqaalada la tirtiray',
'action-undelete' => 'ha tirtirin boggaan',
+'action-block' => 'ka mamnuuc isticmaalahaan in oo wax badalo',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|bedelka|bedelada}}',
-'recentchanges' => 'Isbedelada dhow',
-'recentchangestext' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay bogaan.',
-'recentchanges-label-newpage' => 'Wax bedelkaan waxoo sameeyay bog cusub',
-'rcshowhideminor' => '$1 bedelada yar',
-'rcshowhidebots' => '$1 botyaalo',
-'rcshowhideliu' => '$1 isticmaalada-soo galay',
-'rcshowhideanons' => '$1 isticmaalada la aqoon',
-'rcshowhidepatr' => '$1 bedelada la waardiyeeyay',
-'rcshowhidemine' => '$1 bedelaadeyda',
-'rclinks' => 'Itusi isbadeladii $1 ee ugu danbeeyay oo dhacay wixii ka danbeeyay $2 maalmood<br />$3',
-'hide' => 'Qari',
-'show' => 'Itus',
-'minoreditletter' => 'by',
-'newpageletter' => 'BC',
-'rc_categories' => 'Waxoo u gaar yahay qeybaha (u kala qeybsan "|")',
+'nchanges' => '$1 {{PLURAL:$1|bedelka|bedelada}}',
+'recentchanges' => 'Isbedelada dhow',
+'recentchanges-legend' => 'Dooqyada isbedelada dhow',
+'recentchangestext' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay bogaan.',
+'recentchanges-feed-description' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay feedkaan',
+'recentchanges-label-newpage' => 'Wax bedelkaan waxoo sameeyay bog cusub',
+'recentchanges-label-minor' => 'Kan waa bedel yar',
+'recentchanges-label-bot' => 'Badalkaan waxaa sameeyay bot',
+'recentchanges-label-unpatrolled' => 'bedelkaan hadda wali lama waardiyeen',
+'rcnotefrom' => "Hoostaan waa isbedaladii dhacay '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
+'rclistfrom' => 'Itusi isbedelada cusub oo ka bilaabaneyso $1',
+'rcshowhideminor' => '$1 bedelada yar',
+'rcshowhidebots' => '$1 botyaalo',
+'rcshowhideliu' => '$1 isticmaalada-soo galay',
+'rcshowhideanons' => '$1 isticmaalada la aqoon',
+'rcshowhidepatr' => '$1 bedelada la waardiyeeyay',
+'rcshowhidemine' => '$1 wax badalkeyga',
+'rclinks' => 'Itusi isbadeladii $1 ee ugu danbeeyay oo dhacay wixii ka danbeeyay $2 maalmood<br />$3',
+'diff' => 'duwanaan',
+'hist' => 'taariikh',
+'hide' => 'Qari',
+'show' => 'Itus',
+'minoreditletter' => 'by',
+'newpageletter' => 'BC',
+'boteditletter' => 'b',
+'rc_categories' => 'Waxoo u gaar yahay qeybaha (u kala qeybsan "|")',
+'rc-enhanced-expand' => 'Itus ka hadalka (waxaa loo baahanyahay JavaScript)',
+'rc-enhanced-hide' => 'Qari ka hadalka',
# Recent changes linked
-'recentchangeslinked' => "Isbedelada la'xiriira",
-'recentchangeslinked-title' => 'Wax bedelka la xiriiro "$1"',
-'recentchangeslinked-page' => 'Magaca bogga:',
+'recentchangeslinked' => "Isbedelada la'xiriira",
+'recentchangeslinked-toolbox' => "Isbedelada la'xiriira",
+'recentchangeslinked-title' => 'Wax bedelka la xiriiro "$1"',
+'recentchangeslinked-summary' => "Liiskaan waa badalyada mardhow lagu sameeyay bogyaasha la xiriiray boggaga khaaska ah (ama ka mid ahaa qeybaha khaaska ah).
+Boggaga ku jiro [[Special:Watchlist|liiskaaga waardiyaha]] waa '''butac'''.",
+'recentchangeslinked-page' => 'Magaca bogga:',
+'recentchangeslinked-to' => 'Itusi isbedelada boggaga la xiriiro bogga aan ku siiyay',
# Upload
-'upload' => 'Soo geli file',
-'uploadbtn' => 'Soo geli file',
-'uploadnologin' => 'Gudaha kuma jirtid',
-'uploaderror' => 'Qalad soo gelinta',
-'uploadlog' => 'soo gelinta gudagalkeeda',
-'uploadlogpage' => 'Soo gelinta gudagalkeeda',
-'filename' => 'Magaca faylka',
-'filestatus' => 'Qeybta ogolaashada koobiga:',
-'ignorewarning' => 'Iska dhagooley digniinta ee faylka keedi',
-'ignorewarnings' => 'Iska dhagooley digkiinwalba',
-'minlength1' => 'Faylka magaciisa waa in uu ugu yaraan noqdaa hal xaraf.',
-'badfilename' => 'Faylka magaciisa waxaa lagu badalay "$1".',
-'large-file' => "waxaa loo baahanyahay in ay san file'yada ka weynaan $1;
+'upload' => 'Soo geli file',
+'uploadbtn' => 'Soo geli file',
+'uploadnologin' => 'Gudaha kuma jirtid',
+'uploaderror' => 'Qalad soo gelinta',
+'uploadlog' => 'gudagalaha soo galiyay',
+'uploadlogpage' => 'Gudagalaha soo galiyay',
+'filename' => 'Magaca faylka',
+'filedesc' => 'Qoraal kooban',
+'filestatus' => 'Qaabka ogolaashada koobiga:',
+'ignorewarning' => 'Iska dhagooleey digniinta faylka neh keydi',
+'ignorewarnings' => 'Iska dhagooley digniin walba',
+'minlength1' => 'Faylka magaciisa waa in uu ugu yaraan noqdaa hal xaraf.',
+'badfilename' => 'Faylka magaciisa waxaa lagu badalay "$1".',
+'filetype-banned' => 'Faylka nuucaan waa laga mamnuucay',
+'illegal-filename' => "Magaca file'kaan lama ogola",
+'unknown-error' => 'Qalad la aqoon aa dhacay.',
+'tmp-create-error' => 'Mala sameyn karin fayl kumeel gaar ah.',
+'large-file' => "waxaa loo baahanyahay in ay san file'yada ka weynaan $1;
file'kaan waa $2.",
-'uploadwarning' => 'Digniin waxa aad soo gelineesid',
-'savefile' => 'Faylka kaydi',
-'uploadedimage' => 'waxaa la soo galiyay "[[$1]]"',
-'overwroteimage' => 'waxaa la soo galiyay nuuc cusub oo ah "[[$1]]"',
-'watchthisupload' => 'Boggaan waardiyey',
+'uploadwarning' => 'Digniin waxa aad soo gelineesid',
+'savefile' => 'Faylka kaydi',
+'uploadedimage' => 'waxaa la soo galiyay "[[$1]]"',
+'overwroteimage' => 'waxaa la soo galiyay nuuc cusub oo ah "[[$1]]"',
+'uploaddisabled' => 'wax soo gelinta waa la xiray.',
+'copyuploaddisabled' => 'wax soo gelinta dhinaca URL:ka waa la xiray',
+'uploadfromurl-queued' => 'Waxa aad soo gelineesid saf oo galay.',
+'uploaddisabledtext' => 'soo gelinta faylyada waa la xiray',
+'uploadvirus' => 'faylka waxaa ku jiro fayrus!
+ku saabsan: $1',
+'upload-options' => 'Dooqyada soo gelinta',
+'watchthisupload' => 'Boggaan waardiyey',
+'upload-failure-subj' => 'Dhibaatada soo gelinta',
+'upload-warning-subj' => 'Digniin waxa aad soo gelineesid',
+
+'upload-unknown-size' => 'lama yaqaano weyninka',
+
+# img_auth script messages
+'img-auth-streaming' => 'Woo dareeraa "$1".',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error28' => 'Waqtiga woo ka dhamaaday soo gelinta',
+
+'license' => 'Laysinka:',
+'license-header' => 'Laysinka',
+'nolicense' => 'Mala dooran',
+'license-nopreview' => '(Hor fiirin malahan)',
+'upload_source_file' => '(Faylka kombiyutarkaada)',
+
+# Special:ListFiles
+'listfiles_search_for' => 'Raadi magacyada wararka:',
# File description page
'file-anchor-link' => 'Fayl',
+'filehist' => 'Taariikhda faylka',
+'filehist-help' => 'Riix taariikhda/waqtiga si aad u argto faylka sida oo ahaa markiisa hore.',
'filehist-deleteall' => 'dirtir dhamaantood',
'filehist-deleteone' => 'tirtir',
+'filehist-revert' => 'soo celin',
+'filehist-current' => 'waxa hadda jiro',
+'filehist-datetime' => 'Taariikhda/Waqtiga',
'filehist-user' => 'Isticmaale',
+'filehist-comment' => 'Ka hadalka',
+'imagelinks' => 'Faylka la xiriira',
+'linkstoimage' => 'Halahaan {{PLURAL:$1|bog waxey la xiriiraan|$1 boggag ah waxey la xiriiraan}} faylkan:',
'nolinkstoimage' => "Ma'ay jiraan beyjaj ku xiran faylkaan.",
# File reversion
'filerevert-comment' => 'Sababta:',
# File deletion
-'filedelete' => 'Tirtir $1',
-'filedelete-legend' => 'Tirtit faylka',
-'filedelete-intro' => "Waxaad tirtireysaa '''[[Media:$1|$1]]'''.",
-'filedelete-comment' => 'Sababta loo tirtiray:',
-'filedelete-submit' => 'Tirtir',
-'filedelete-success' => "'''$1''' waala tirtiray.",
+'filedelete' => 'Tirtir $1',
+'filedelete-legend' => 'Tirtit faylka',
+'filedelete-intro' => "Waxaad tirtireysaa '''[[Media:$1|$1]]'''.",
+'filedelete-comment' => 'Sababta loo tirtiray:',
+'filedelete-submit' => 'Tirtir',
+'filedelete-success' => "'''$1''' waala tirtiray.",
+'filedelete-reason-otherlist' => 'sababaha kale',
+'filedelete-edit-reasonlist' => 'Wax ka bedel sababta loo tirtiray',
+
+# MIME search
+'mimesearch' => 'MIME raadi',
# Random page
'randompage' => 'Ku nasiibso bog',
@@ -752,21 +899,32 @@ file'kaan waa $2.",
'brokenredirects-delete' => 'tirtir',
# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|bayt|bayt}}',
+'nmembers' => ' $1 {{PLURAL:$1|ka mid ah|ka mid ah}}',
'lonelypages' => 'Boggaga agoonta ah',
'uncategorizedpages' => 'Maqaalada aan la aruurin',
'popularpages' => 'Boggaga caanka ah',
-'shortpages' => 'Boggaga gaagaaban',
+'prefixindex' => 'Dhamaan boggaga leh qoraalka hore',
+'shortpages' => 'Boggaga gaaban',
'longpages' => 'Boggaga dhaadheer',
'deadendpages' => 'Boggaga aanan la daba joogin',
'deadendpagestext' => 'Boggogaan linki lamalaha boggaga kale ee wikiga .',
'protectedpages' => "Boggag la'difaacay",
+'usercreated' => 'Waxoo sameeyay $1 at $2',
'newpages' => 'Bogyaalo cusub',
'newpages-username' => 'Magaca gudagalka:',
'ancientpages' => 'Boggaga duqoobay',
'move' => 'Wareeji',
+'pager-newer-n' => '{{PLURAL:$1|ka cusub 1|ka cusub $1}}',
+'pager-older-n' => '{{PLURAL:$1|ka duqsan 1|ka duqsan $1}}',
# Book sources
-'booksources-go' => 'Soco',
+'booksources' => 'Xogta buuga',
+'booksources-search-legend' => 'Raadi xogta buuga',
+'booksources-go' => 'Soco',
+
+# Special:Log
+'log' => 'Guda galayaasha',
# Special:AllPages
'allpages' => 'Dhamaan boggaga',
@@ -788,7 +946,9 @@ file'kaan waa $2.",
'special-categories-sort-count' => 'xisaabi marka aad tirisid',
# Special:LinkSearch
-'linksearch-ok' => 'Raadi',
+'linksearch-ns' => 'Meesha magacyada:',
+'linksearch-ok' => 'Raadi',
+'linksearch-line' => '$1 waxoo ka socdaa $2',
# Special:ListUsers
'listusersfrom' => "I'tus isticmaalayaasha laga bilaabo:",
@@ -797,8 +957,12 @@ file'kaan waa $2.",
'listusers-blocked' => '(waa la mamnuucay)',
# Special:Log/newusers
+'newuserlogpage' => 'Gudagalaha Isticmaale sameeyay',
'newuserlog-create-entry' => 'Isticmaale cusub',
+# Special:ListGroupRights
+'listgrouprights-members' => '(Inta ka mid ah liiskooda)',
+
# E-mail user
'mailnologin' => "Ma'jiro cinwaan wax lagu diro",
'mailnologintext' => 'Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]
@@ -838,26 +1002,35 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'unwatchthispage' => 'Jooji waardiyeyntiisa',
'watchlistcontains' => 'Liiskaaga waardiyeynta waxaa ku jiro $1 {{PLURAL:$1|bog|boggag}}.',
'wlshowlast' => 'Itus wixii ka danbeeyay $1 saacadood $2 maalmood $3',
+'watchlist-options' => 'Dooqyada liiska waardiyaha',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Daawasho...',
# Delete
'confirm' => 'Xaqiiji',
-'excontent' => "qoraalka wuxuu ahaa: '$1'",
+'excontent' => "qoraalka waxoo ahaa: '$1'",
'exbeforeblank' => 'Intii la masaxin waxaa ku qornaa: "$1"',
'exblank' => 'Bogga waxba kuma jirin',
'delete-confirm' => 'Tirtir "$1"',
'delete-legend' => 'Tirtir',
'historywarning' => '<strong>Digniin:</strong> Bogga aad tirtirirabtid wuxuu leeyahay taariikkh hore:',
'actioncomplete' => "Amarka waa la'dhamaystiray",
+'actionfailed' => 'Shaqada waad ku guul dareesatay',
+'deletedarticle' => 'waxoo tirtiray "[[$1]]"',
+'dellogpage' => 'Tirtiraha guda galaheeda',
# Rollback
-'rollback_short' => 'Dib u soo celi',
+'rollback_short' => 'Dib u soo celi',
+'rollbacklink' => 'dib u soo celi',
+'revertpage' => 'Waxoo dib u noqay bedelaadka [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) kuna celiyay bedelkii ka danbeeyay ee [[User:$1|$1]]',
+'revertpage-nouser' => 'Waxoo dib u noqay bedelyada (magaca isticmaalaha waa laga saaray) kuna celiyay [[User:$1|$1]]',
+'rollback-success' => 'Waxoo dib u noqay bedelaadka $1;
+waxoo dib ugu celiyay bedelaadka $2.',
# Protect
-'protectedarticle' => 'la\'difaacay "[[$1]]"',
-'protect-title' => 'la\'difaacaa "$1"',
+'protectedarticle' => 'waxoo difaacay "[[$1]]"',
+'protect-title' => 'Ka badal heerka difaacida "$1"',
'prot_1movedto2' => '[[$1]] waxaa loo wareejiyey [[$2]]',
'protect-legend' => 'Xaqiiji difaacida',
'protectcomment' => 'Sababta loo difaacaayo',
@@ -865,7 +1038,9 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'protect_expiry_invalid' => "Wakhtiga dhicitaanka sax ma'aha.",
'protect_expiry_old' => 'Wakhtiga dhictaanka waa mid laga soo dhaafay.',
'protect-default' => "(la'isku ogyahay)",
-'protect-expiring' => 'wuxuu dhacaayaa $1 (UTC)',
+'protect-fallback' => 'waxaa loo baahanyahay "$1" ogolaasho',
+'protect-level-sysop' => 'Maamulada kaliya',
+'protect-expiring' => 'waxoo dhacaa $1 (UTC)',
'protect-cascade' => 'Is daba dhiga difaacida - difaac bogga walba oo lagu daro boggaan.',
'protect-othertime' => 'Waqti kale:',
'protect-othertime-op' => 'waqti kale',
@@ -884,6 +1059,7 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'undeletepage' => "Fiiri dibna u sooceli boggaga la'tirtiray",
'viewdeletedpage' => "Fiiri boggaga la'tirtiray",
'undeletebtn' => 'Sooceli',
+'undeletelink' => 'fiiri/mar kale sameey',
'undeleteviewlink' => 'itusi',
'undeletereset' => 'Dib u habeey',
'undeletedarticle' => 'La\' sooceliyey "[[$1]]"',
@@ -896,18 +1072,55 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'undelete-search-submit' => 'Raadi',
# Namespace form on various pages
-'invert' => 'Dabagedi dalabka',
+'namespace' => 'Meesha magacyada:',
+'invert' => 'Dabagedi dalabka',
+'blanknamespace' => '(Muhiim)',
# Contributions
-'mycontris' => 'Wax qoraalkeyga',
-
-'sp-contributions-talk' => 'Wadahadal',
-'sp-contributions-submit' => 'Raadi',
+'contributions' => 'Isticmaalada wax ku darsaday',
+'contributions-title' => 'Waxa oo ku darsaday isticmaalaha $1',
+'mycontris' => 'Wax qoraalkeyga',
+'uctop' => '(kor)',
+'month' => 'Bilaawga bisha (iyo wixii ka danbeeyay):',
+'year' => 'Bilaawga sanadka (iyo wixii ka danbeeyay):',
+
+'sp-contributions-newbies' => 'Itus akoonada cusub kaliya oo wax ku darsaday',
+'sp-contributions-blocklog' => 'mamnuucyada',
+'sp-contributions-uploads' => 'kuwa la soo geliyay',
+'sp-contributions-logs' => 'Guda galayaasha',
+'sp-contributions-talk' => 'Wadahadal',
+'sp-contributions-search' => 'Raadi si aad wax uugu darsatid',
+'sp-contributions-username' => 'Ciwaanka IP:ga ama magaca isticmaalaha:',
+'sp-contributions-submit' => 'Raadi',
+
+# What links here
+'whatlinkshere' => 'Maxaa meeshaan la xiriiro',
+'whatlinkshere-title' => 'Boggaga la xiriiro "$1"',
+'whatlinkshere-page' => 'Bogga:',
+'linkshere' => "Bogyaashaan waxey la xiriiraan '''[[:$1]]''':",
+'nolinkshere' => "Boggag la xiriiro '''[[:$1]]''' ma jirto.",
+'isredirect' => 'bogga loo wareejiyay',
+'isimage' => 'Sawirka la xiriiro',
+'whatlinkshere-prev' => '{{PLURAL:$1|kii ka horeeyay|kii ka horeeyay $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|kan ku xiga|kan ku xiga $1}}',
+'whatlinkshere-links' => '↠kuwa la xiriiro',
+'whatlinkshere-hideredirs' => '$1 la wareejiyay',
+'whatlinkshere-hidelinks' => '$1 waxoo la xiriiraa',
+'whatlinkshere-hideimages' => '$1 sawirka inta oo la xiriiro',
# Block/unblock
+'ipboptions' => '2 saacadood:2 hours,1 maalin:1 day,3 maalmood:3 days,1 isbuuc:1 week,2 isbuuc:2 weeks,1 bil:1 month,3 bilood:3 months,6 bilood:6 months,1 sano:1 year,waligeed:infinite',
+'ipblocklist' => 'isticmaalada la mamnuucay',
+'ipblocklist-submit' => 'Raadi',
'anononlyblock' => 'qarsoon. kaliya',
+'blocklink' => 'mamnuuc',
+'unblocklink' => 'ka qaad mamnuucida',
+'change-blocklink' => 'wax ka bedel mamnuucida',
'contribslink' => 'ku darsasho',
'autoblocker' => 'Waxaa automaatik u xirista keenay in mudo dhow uu cinwaanka IP:ga isticmaalay "[[User:$1|$1]]". Sababta keentay in loo xiro $1 waa: "\'\'\'$2\'\'\'"',
+'blocklogpage' => 'Mamnuucida guda galaheeda',
+'blocklogentry' => 'waxoo mamnuucay [[$1]] waxoona mamnuucida ku egyahay $2 $3',
+'unblocklogentry' => 'lama mamnuucin $1',
'block-log-flags-anononly' => "Isticmaalayaasha aanan la'aqoonsanin oo kaliya",
'block-log-flags-nocreate' => 'sameynta gudagalah lamaogola',
'blockme' => 'I mamnuuc',
@@ -919,8 +1132,11 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'movetalk' => "Wareejiyey bogga wadahadalka la'xiriira",
'1movedto2' => '[[$1]] waxaa loo wareejiyey [[$2]]',
'1movedto2_redir' => '[[$1]] waxaa loo wareejiyey [[$2]] si loo sii toosiyo',
+'movelogpage' => 'Wareejinta guda galaheeda',
+'revertmove' => 'soo celin',
# Export
+'export' => 'Dhoofi boggag',
'export-addcattext' => 'Ku dar maqaalo laga soo qaaday qeybaha:',
'export-addns' => 'Ku dar',
@@ -930,41 +1146,71 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'allmessagesdefault' => "Qoraalka la'isku ogyahay",
'allmessagescurrent' => 'Qoraalka hada qoran',
'allmessagestext' => 'Liiskan waxaa ku qoran dhamaan fariimaha lagahelikaro xarun magaceedka MediaWiki.
-Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [http://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
+Fadlan booqo [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [http://translatewiki.net translatewiki.net] hadii aad rabto in aad wax ku darsatid MediaWiki si aad gabi ahaanbo afkaaga ugu fasirtid.',
'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' la'ma isticmaalikaro, '''\$wgUseDatabaseMessages''' oo dansan daraadeed.",
'allmessages-language' => 'Luqad:',
'allmessages-filter-submit' => 'Soco',
+# Thumbnails
+'thumbnail-more' => 'Weyneey',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Bogeyga isticmaalaha',
-'tooltip-pt-preferences' => 'Dooqyadeyda',
-'tooltip-ca-talk' => 'Wadahadal ku saabsan bogga qoraalka',
-'tooltip-ca-edit' => 'Boggaan wax waad ka bedelikartaa. Intii aadan kaydinin fadlan isticmaal batoonka horfiirinta.',
-'tooltip-ca-addsection' => 'Ku darso fikrad wadahadalkaan.',
-'tooltip-ca-history' => 'Noocyadii hore ee boggaan.',
-'tooltip-ca-delete' => 'Bogaan tirtir',
-'tooltip-ca-undelete' => "Sooceli qoraaladii lagu sameeyay boggaan intii aanan la'tirtirin ka hor",
-'tooltip-ca-move' => 'Wareeji boggaan',
-'tooltip-search' => 'Raadi{{SITENAME}}',
-'tooltip-search-go' => 'Aad bog oo magacaan ku qoran hadii oo jiro',
-'tooltip-search-fulltext' => 'Qoraalkaan ka raadi bogyaasha',
-'tooltip-p-logo' => 'Bogga Hore',
-'tooltip-n-mainpage' => 'Soo booqo bogga hore',
-'tooltip-n-portal' => 'Faahfaahinta mashruuca, waxaad ku caawinkartid, xageed ka helikartaa waxaad u baahantahay',
-'tooltip-n-recentchanges' => 'tirada Intii ugu danbeysay oo wax laga bedelay wiki',
-'tooltip-n-randompage' => 'Ku nasiibso bog',
-'tooltip-t-emailuser' => 'E-mail u dir isticmaalahaan',
-'tooltip-t-specialpages' => 'Liiska boggaga qaaska ah oo dhan',
-'tooltip-ca-nstab-main' => 'Itusi bogga qoraaka kooban',
-'tooltip-ca-nstab-user' => 'Fiiri bogga isticmaalaha',
-'tooltip-ca-nstab-media' => 'Fiiri bogga saxaafada',
-'tooltip-ca-nstab-special' => 'Kani bogg khaas ah, waxba kama bedelikartid boggaan',
-'tooltip-ca-nstab-project' => 'Itusi bogga mashruuca',
-'tooltip-ca-nstab-image' => 'Fiiri bogga sawirada',
-'tooltip-ca-nstab-mediawiki' => 'Fiiri bogga fariimaha sistamka',
-'tooltip-ca-nstab-template' => 'Fiiri tusmada',
-'tooltip-ca-nstab-help' => 'Fiiri bogga caawinaad',
-'tooltip-ca-nstab-category' => 'Itusi qeybta bogga',
+'tooltip-pt-userpage' => 'Bogeyga isticmaalaha',
+'tooltip-pt-mytalk' => 'Bogaaga wadahadalka',
+'tooltip-pt-preferences' => 'Dooqyadeyda',
+'tooltip-pt-mycontris' => 'Liiska intii aad ku darsatay',
+'tooltip-pt-login' => 'Waxaa loo baahanyahay in aad gudaha gashid; laakiin, laasim ma ahan',
+'tooltip-pt-logout' => 'Ka bax',
+'tooltip-ca-talk' => 'Wadahadal ku saabsan bogga qoraalka',
+'tooltip-ca-edit' => 'Boggaan wax waad ka bedelikartaa. Intii aadan kaydinin fadlan isticmaal batoonka horfiirinta.',
+'tooltip-ca-addsection' => 'Ku darso fikrad wadahadalkaan.',
+'tooltip-ca-viewsource' => 'Boggaan waa la difaacay.
+Waxaa fiiri kartaa cadaadkiisa',
+'tooltip-ca-history' => 'Noocyadii hore ee boggaan.',
+'tooltip-ca-protect' => 'Difaac boggaan',
+'tooltip-ca-delete' => 'Bogaan tirtir',
+'tooltip-ca-undelete' => "Sooceli qoraaladii lagu sameeyay boggaan intii aanan la'tirtirin ka hor",
+'tooltip-ca-move' => 'Wareeji boggaan',
+'tooltip-ca-watch' => 'Boggaan ku dar liiskaaga waardiyaha',
+'tooltip-ca-unwatch' => 'Boggaan ka saar liiskaaga waardiyaha',
+'tooltip-search' => 'Ka raadi {{SITENAME}}',
+'tooltip-search-go' => 'Aad bog oo magacaan ku qoran hadii oo jiro',
+'tooltip-search-fulltext' => 'Qoraalkaan ka raadi bogyaasha',
+'tooltip-p-logo' => 'Bogga Hore',
+'tooltip-n-mainpage' => 'Soo booqo bogga hore',
+'tooltip-n-mainpage-description' => 'Booqo bogga hore',
+'tooltip-n-portal' => 'Faahfaahinta mashruuca, waxaad ku caawinkartid, xageed ka helikartaa waxaad u baahantahay',
+'tooltip-n-currentevents' => 'Soo raadi war ku saabsan hadda waxa dhacaayo',
+'tooltip-n-recentchanges' => 'tirada Intii ugu danbeysay oo wax laga bedelay wiki',
+'tooltip-n-randompage' => 'Ku nasiibso bog',
+'tooltip-n-help' => 'Meesha lagu ogaan karo',
+'tooltip-t-whatlinkshere' => 'Liiska inta bog oo wiki ah oo meeshaan la xiriiro',
+'tooltip-t-recentchangeslinked' => 'Isbedelada dhow ee boggaga oo laga soo xiriiriyay boggaan',
+'tooltip-feed-atom' => 'Atom aa quudiyo boggaan',
+'tooltip-t-contributions' => 'Itusi liiska inta wax oo ku darsaday isticmaalahaan',
+'tooltip-t-emailuser' => 'E-mail u dir isticmaalahaan',
+'tooltip-t-upload' => 'Soo geli fayl',
+'tooltip-t-specialpages' => 'Liiska boggaga qaaska ah oo dhan',
+'tooltip-t-print' => 'Nuuca la soo daabici karo ee boggaan',
+'tooltip-t-permalink' => 'Linkiga daaimka ah ee bedelaadka boggaan',
+'tooltip-ca-nstab-main' => 'Itusi bogga qoraaka kooban',
+'tooltip-ca-nstab-user' => 'Fiiri bogga isticmaalaha',
+'tooltip-ca-nstab-media' => 'Fiiri bogga saxaafada',
+'tooltip-ca-nstab-special' => 'Kani bogg khaas ah, waxba kama bedelikartid boggaan',
+'tooltip-ca-nstab-project' => 'Itusi bogga mashruuca',
+'tooltip-ca-nstab-image' => 'Fiiri bogga sawirada',
+'tooltip-ca-nstab-mediawiki' => 'Fiiri bogga fariimaha sistamka',
+'tooltip-ca-nstab-template' => 'Fiiri tusmada',
+'tooltip-ca-nstab-help' => 'Fiiri bogga caawinaad',
+'tooltip-ca-nstab-category' => 'Itusi qeybta bogga',
+'tooltip-minoredit' => 'Calaamadeey kan in oo yahay bedel yar',
+'tooltip-save' => 'kaydso badalyadaada',
+'tooltip-preview' => 'Feerinta wixii aad bedeshay, fadlan kan isticmaal intii aadan kaydinin!',
+'tooltip-diff' => 'Fiiri waxa aad ka badashay qoraalka',
+'tooltip-compareselectedversions' => 'Fiiri sida ee u kala duwanyihiin bedelaadka labada aad ka dooratay boggaan',
+'tooltip-watch' => 'Boggaan ku dar liiskaaga waardiyaha',
+'tooltip-rollback' => '"Dib u soo celi" waxoo gadaal u soo celinaa bedel (yadii) boogaan oo sameeyay kii ugu danbeeyay oo ku darsaday adiga oo isticmaalaaya hal riix',
+'tooltip-summary' => 'ku qor qoraal kooban',
# Attribution
'anonymous' => "{{PLURAL:$1|Isticmaalaha|Isticmaaleyaasa}} aanan la'aqoonsanin ee {{SITENAME}}",
@@ -975,19 +1221,31 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
# Info page
'numwatchers' => 'Tirada waardiyeyaasha: $1',
+# Patrol log
+'patrol-log-line' => 'waxa la calaamadeeyay $1 ee $2 waxaa la waardiyeeyay $3',
+'patrol-log-diff' => 'bedelaadka $1',
+
# Browsing diffs
'previousdiff' => '↠bedelkii ka duqsanaa',
'nextdiff' => 'Bedelkii ugu cusbaa →',
+# Media information
+'file-info-size' => '$1 × $2 pixels, weyninka faylka : $3, nuuca MIME: $4',
+
# Special:NewFiles
'imagelisttext' => "Hoos waxaa yaala liiska '''$1''' {{PLURAL:$1|file|faylalka}} oo u kala soocan $2.",
'ilsubmit' => 'Raadi',
'bydate' => 'hab taariikheed',
+# External editor support
+'edit-externally-help' => '(Ka fiiri wax war ah oo kale [http://www.mediawiki.org/wiki/Manual:External_editors sidii oo wax ugu habeysmi lahaa] )',
+
# 'all' in various places, this might be different for inflected languages
'recentchangesall' => 'dhamaan',
'imagelistall' => 'dhamaan',
'watchlistall2' => 'dhamaan',
+'namespacesall' => 'dhamaan',
+'monthsall' => 'Dhamaan',
# E-mail address confirmation
'confirmemail_noemail' => 'Kuma haysatid cinwaan E-boosto sax [[Special:Preferences|isticmaala dooqiisa]].',
@@ -1003,10 +1261,19 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
# Auto-summaries
'autosumm-new' => 'Bog cusub: $1',
+# Watchlist editing tools
+'watchlisttools-edit' => 'Fiiri iyo wax ka badal liiska waardiyaha',
+'watchlisttools-raw' => 'Badal liiska waardiyeenta ceeriinka ah',
+
+# Special:Version
+'version-poweredby-others' => 'kuwa kale',
+
# Special:FilePath
+'filepath-page' => 'Fayl:',
'filepath-submit' => 'Soco',
# Special:FileDuplicateSearch
+'fileduplicatesearch-legend' => 'Raadi mid tusaale ah',
'fileduplicatesearch-submit' => 'Raadi',
# Special:SpecialPages
@@ -1016,4 +1283,11 @@ Please visit [http://www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
# Special:BlankPage
'blankpage' => 'Bog masaxan',
+# Database error messages
+'dberr-usegoogle' => 'Waxaa baroobeen kartaa in aad ka raadiso google',
+
+# HTML forms
+'htmlform-reset' => 'Ka noqo wax bedelka',
+'htmlform-selectorother-other' => 'kuwa kale',
+
);
diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php
index ed310302..5df68ac8 100644
--- a/languages/messages/MessagesSq.php
+++ b/languages/messages/MessagesSq.php
@@ -52,7 +52,11 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
+ 'Userlogin' => array( 'HyrjePërdoruesi' ),
+ 'Userlogout' => array( 'DaljePërdoruesi' ),
+ 'CreateAccount' => array( 'HapLlogari' ),
'Preferences' => array( 'Preferencat' ),
+ 'Recentchanges' => array( 'NdryshimeSëFundmi' ),
'Upload' => array( 'Ngarko' ),
'Listfiles' => array( 'ListaSkedave' ),
'Newimages' => array( 'SkedaTëReja' ),
@@ -76,6 +80,7 @@ $specialPageAliases = array(
'Protectedpages' => array( 'FaqeteMbrojtura' ),
'Protectedtitles' => array( 'TitujteMbrojtur' ),
'Allpages' => array( 'TëgjithaFaqet' ),
+ 'Unblock' => array( 'Zhblloko' ),
'Specialpages' => array( 'FaqetSpeciale' ),
'Contributions' => array( 'Kontributet' ),
'Emailuser' => array( 'EmailPërdoruesit' ),
@@ -96,17 +101,21 @@ $specialPageAliases = array(
'Mypage' => array( 'FaqjaIme' ),
'Mytalk' => array( 'DiskutimiImë' ),
'Mycontributions' => array( 'KontributetëMiat' ),
+ 'Myuploads' => array( 'NgarkimeteMia' ),
'Listadmins' => array( 'RreshtoAdmin' ),
'Listbots' => array( 'RreshtoBotët' ),
'Popularpages' => array( 'FaqetëFamshme' ),
'Search' => array( 'Kërkim' ),
+ 'Resetpass' => array( 'NdryshoFjalëkalimin' ),
+ 'Withoutinterwiki' => array( 'PaInterwiki' ),
'Blankpage' => array( 'FaqeBosh' ),
'DeletedContributions' => array( 'GrisKontributet' ),
);
$magicWords = array(
'redirect' => array( '0', '#RIDREJTO', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'MUAJIMOMENTAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth' => array( '1', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
'currentday' => array( '1', 'DITASOT', 'CURRENTDAY' ),
'currentday2' => array( '1', 'DITASOT2', 'CURRENTDAY2' ),
@@ -139,7 +148,7 @@ $magicWords = array(
'talkpagenamee' => array( '1', 'EMRIIFAQESSËDISKUTIMITE', 'TALKPAGENAMEE' ),
'subst' => array( '0', 'ZËVN', 'SUBST:' ),
'img_thumbnail' => array( '1', 'parapamje', 'pamje', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'parapamje=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_manualthumb' => array( '1', 'parapamje=$1', 'pamje=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'djathtas', 'right' ),
'img_left' => array( '1', 'majtas', 'left' ),
'img_none' => array( '1', 's\'ka', 'none' ),
@@ -178,7 +187,7 @@ $dateFormats = array(
'dmy both' => 'j F Y H:i',
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -196,8 +205,7 @@ $messages = array(
'tog-editsection' => 'Lejo redaktimin e seksioneve me [redakto] lidhje',
'tog-editsectiononrightclick' => 'Lejo redaktimin e seksioneve me djathtas-shtypje<br /> mbi emrin e seksionit (JavaScript)',
'tog-showtoc' => 'Trego tabelën e përmbajtjeve<br />(për faqet me më shume se 3 tituj)',
-'tog-rememberpassword' => 'Mbaj mënd fjalëkalimin për vizitën e ardhshme',
-'tog-editwidth' => 'Kutija e redaktimit ka gjerësi te plotë',
+'tog-rememberpassword' => 'Mbaj mënd fjalëkalimin për vizitën e ardhshme (më së shumti për $1 {{PLURAL:$1|ditë|ditë}})',
'tog-watchcreations' => 'Shto faqet që krijoj tek lista mbikqyrëse',
'tog-watchdefault' => 'Shto faqet që redaktoj tek lista mbikqyrëse',
'tog-watchmoves' => 'Shto faqet që zhvendos tek lista mbikqyrëse',
@@ -341,31 +349,21 @@ $messages = array(
'faqpage' => 'Project:Pyetje e Përgjigje',
# Vector skin
-'vector-action-addsection' => 'Fillo një temë të re',
-'vector-action-delete' => 'Grise',
-'vector-action-move' => 'Zhvendose',
-'vector-action-protect' => 'Mbroje',
-'vector-action-undelete' => 'Jo e grisur',
-'vector-action-unprotect' => 'Liroje',
-'vector-namespace-category' => 'Kategoria',
-'vector-namespace-help' => 'Ndihmë',
-'vector-namespace-image' => 'Skeda',
-'vector-namespace-main' => 'Faqe',
-'vector-namespace-media' => 'Media-faqe',
-'vector-namespace-mediawiki' => 'Mesazh',
-'vector-namespace-project' => 'Faqe e mbrojtur',
-'vector-namespace-special' => 'Faqe speciale',
-'vector-namespace-talk' => 'Diskutimet',
-'vector-namespace-template' => 'Stampa',
-'vector-namespace-user' => 'Përdoruesi',
-'vector-view-create' => 'Krijo',
-'vector-view-edit' => 'Redakto',
-'vector-view-history' => 'Shiko historikun',
-'vector-view-view' => 'Lexoni',
-'vector-view-viewsource' => 'Shikoni tekstin',
-'actions' => 'Veprimet',
-'namespaces' => 'Emri i hapësirës',
-'variants' => 'Variante',
+'vector-action-addsection' => 'Fillo një temë të re',
+'vector-action-delete' => 'Grise',
+'vector-action-move' => 'Zhvendose',
+'vector-action-protect' => 'Mbroje',
+'vector-action-undelete' => 'Jo e grisur',
+'vector-action-unprotect' => 'Liroje',
+'vector-simplesearch-preference' => 'Aktivizoni kërkim të avancuar (vetëm për Vektor)',
+'vector-view-create' => 'Krijo',
+'vector-view-edit' => 'Redakto',
+'vector-view-history' => 'Shiko historikun',
+'vector-view-view' => 'Lexoni',
+'vector-view-viewsource' => 'Shikoni tekstin',
+'actions' => 'Veprimet',
+'namespaces' => 'Emri i hapësirës',
+'variants' => 'Variante',
'errorpagetitle' => 'Gabim',
'returnto' => 'Kthehu tek $1.',
@@ -426,6 +424,9 @@ Shumë përdorues po përpiqen të shikojnë këtë faqe.
Ju lutemi prisni pak para se të hapni sërish këtë faqe.
$1',
+'pool-timeout' => 'Koha duke pritur për të bllokoet',
+'pool-queuefull' => 'Radhja është e plotë',
+'pool-errorunknown' => 'Gabim i panjohur',
# 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' => 'Rreth {{SITENAME}}',
@@ -590,7 +591,8 @@ Arsyeja e dhënë është ''$2''.",
'yourname' => 'Fusni nofkën tuaj',
'yourpassword' => 'Fusni fjalëkalimin tuaj',
'yourpasswordagain' => 'Fusni fjalëkalimin përsëri',
-'remembermypassword' => 'Mbaj mënd fjalëkalimin tim për tërë vizitat e ardhshme.',
+'remembermypassword' => 'Mbaj mënd fjalëkalimin tim për tërë vizitat e ardhshme (për një kohë maksimale prej $1 {{PLURAL:$1|dite|ditësh}})',
+'securelogin-stick-https' => 'Qëndro i lidhur me HTTPS pas hyrjes me emrin përkatës',
'yourdomainname' => 'Faqja juaj',
'externaldberror' => 'Ose kishte një gabim tek regjistri i identifikimit të jashtëm, ose nuk ju lejohet të përtërini llogarinë tuaje të jashtme.',
'login' => 'Hyni',
@@ -607,6 +609,7 @@ Arsyeja e dhënë është ''$2''.",
'gotaccount' => "Keni një llogari? '''$1'''.",
'gotaccountlink' => 'Hyni',
'createaccountmail' => 'me email',
+'createaccountreason' => 'Arsyeja:',
'badretype' => 'Fjalëkalimet nuk janë njësoj.',
'userexists' => 'Nofka që kërkuat është në përdorim. Zgjidhni një nofkë tjetër.',
'loginerror' => 'Gabim hyrje',
@@ -625,6 +628,7 @@ Kontrolloni shkrimin ose [[Special:UserLogin/signup|hapni një llogari të re]].
'wrongpasswordempty' => 'Fjalëkalimi juaj ishte bosh. Ju lutemi provoni përsëri.',
'passwordtooshort' => 'Fjalëkalimi juaj është i pavlefshëm ose tepër i shkurtër. Ai duhet të ketë së paku {{PLURAL:$1|1 shkronjë|$1 shkronja}} dhe duhet të jetë i ndryshëm nga emri i përdoruesit.',
'password-name-match' => 'Fjalëkalimi juaj duhet të jetë i ndryshëm nga emri juaj.',
+'password-login-forbidden' => 'Përdorimi i kësaj nofke dhe fjalëkalimi është i ndaluar.',
'mailmypassword' => 'Më dërgo një fjalëkalim të ri tek adresa ime',
'passwordremindertitle' => 'Kërkesë për fjalëkalim të ri tek {{SITENAME}}',
'passwordremindertext' => 'Dikush (sigurisht ju, nga adresa IP adresa $1) kërkoi një fjalëkalim të ri për hyrje tek {{SITENAME}} ($4). U krijua fjalëkalimi i përkohshëm për përdoruesin "$2" dhe u dërgua tek "$3". Nëse ky ishte tentimi juaj duhet që të kyçeni dhe ndërroni fjalëkalimin tani. Fjalëkalimi juaj i përkohshëm do të skadojë {{PLURAL:$5|një dite|$5 ditësh}}.
@@ -655,6 +659,9 @@ Duhet të hyni brenda dhe të ndërroni fjalëkalimin tani nëse ky person jeni
'loginlanguagelabel' => 'Gjuha: $1',
'suspicious-userlogout' => 'Kërkesa juaj për të shkëputet u mohua sepse duket sikur është dërguar nga një shfletues të thyer ose caching proxy.',
+# E-mail sending
+'php-mail-error-unknown' => 'Gabim i panjohur në funksionin e postës PHP ()',
+
# Password reset dialog
'resetpass' => 'Ndrysho fjalëkalimin',
'resetpass_announce' => 'Ju keni hyrë me një kod të përkohshëm.
@@ -706,6 +713,7 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
'showdiff' => 'Trego ndryshimet',
'anoneditwarning' => "Ju nuk jeni regjistruar. IP adresa juaj do të regjistrohet në historinë e redaktimeve të kësaj faqe.
You are not logged in. Your IP address will be recorded in this page's edit history.",
+'anonpreviewwarning' => 'Nuk jeni futur me emrin tuaj duke u inçizuar të dhënat IP adresën tuaj në këtë faqe dhe është ndryshuar historia.',
'missingsummary' => "'''Vërejtje:''' Ju nuk keni shtuar një përmbledhje për redaktimet.",
'missingcommenttext' => 'Ju lutemi shtoni një koment në vazhdim.',
'missingcommentheader' => "'''Kujdes:''' Ju nuk keni dhënë një titull për këtë koment.
@@ -781,7 +789,11 @@ Regjistri i bllokuar hyrjen e fundit është më poshtë, për referencë:',
'userjsyoucanpreview' => "'''Këshillë:''' Përdorni butonin 'Trego parapamjen' për të provuar ndryshimet tuaja të faqeve css/js përpara se të kryeni ndryshimet.",
'usercsspreview' => "'''Vini re! Kjo është vetëm një parapamje e faqes suaj CSS. Akoma nuk është ruajtur!'''",
'userjspreview' => "'''Vini re se kjo është vetëm një provë ose parapamje e faqes tuaj JavaScript, ajo nuk është ruajtur akoma!'''",
-'userinvalidcssjstitle' => "'''Kujdes:''' Nuk ka pamje të quajtur \"\$1\". Vini re se faqet .css dhe .js përdorin titull me gërma të vogla, p.sh. {{ns:user}}:Foo/monobook.css, jo {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Vini re! Kjo është vetëm një parapamje e faqes suaj CSS.'''
+'''Akoma nuk është ruajtur!'''",
+'sitejspreview' => "'''Vini re se kjo është vetëm një provë ose parapamje e faqes tuaj JavaScript.'''
+'''Nuk është ruajtur akoma!'''",
+'userinvalidcssjstitle' => "'''Kujdes:''' Nuk ka pamje të quajtur \"\$1\". Vini re se faqet .css dhe .js përdorin titull me gërma të vogla, p.sh. {{ns:user}}:Foo/vector.css, jo {{ns:user}}:Foo/Vector.css.",
'updated' => '(E ndryshuar)',
'note' => "'''Shënim:'''",
'previewnote' => "'''Kini kujdes se kjo është vetëm një parapamje, nuk është ruajtur akoma!'''",
@@ -813,9 +825,6 @@ Ju duhet të përputhni ndryshimet tuaja me tekstin ekzistues.
'copyrightwarning2' => "Ju lutem vini re se të gjitha kontributet tek {{SITENAME}} mund të redaktohen, ndryshohen apo fshihen nga përdorues të tjerë. Në qoftë se nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë mos i jepni këtu.<br />
Po na premtoni që ç'ka po jepni këtu e keni kontributin tuaj ose e keni kopjuar nga domeni publik apo nga burime të tjera të lira sipas ligjeve përkatëse (shikoni $1 për hollësirat).
'''NDALOHET DHËNIA E PUNIMEVE PA PASUR LEJE NGA AUTORI NË MOSPËRPUTHJE ME KËTË LICENSË!'''",
-'longpagewarning' => 'KUJDES: Kjo faqe është $1 kilobytes e gjatë; disa
-shfletues mund të kenë probleme për të redaktuar faqe që afrohen ose janë akoma më shumë se 32 kb.
-Konsideroni ta ndani faqen në disa seksione më të vogla.',
'longpageerror' => "'''GABIM: Tesksti që ju po e redaktoni është $1 KB i gjatë dhe është më i gjatë se maksimumi i lejuar prej $2 KB. Ndryshimet nuk mund të ruhen.'''",
'readonlywarning' => "'''KUJDES: Baza e të dhënave është mbyllur për mirëmbajtje, pra ju nuk do të mund të ruani redaktimin tuaj për momentin.
Ju ndoshta doni të kopjoni tekstin në një tekst dokument dhe të e ruani për më vonë.'''
@@ -986,6 +995,8 @@ Si një administrator ju mund ta shikoni këtë ndryshim; detajet mund të gjend
'logdelete-failure' => "'''Dukshmëria nuk u vendos:'''
$1",
'revdel-restore' => 'Ndrysho dukshmërinë',
+'revdel-restore-deleted' => 'fshij rivizonet',
+'revdel-restore-visible' => 'rivizionet e dukshme',
'pagehist' => 'Historiku i faqes',
'deletedhist' => 'Historiku i grisjeve',
'revdelete-content' => 'përmbajtja',
@@ -1055,11 +1066,13 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
# Diffs
'history-title' => 'Historiku i redaktimeve te "$1"',
'difference' => '(Ndryshime midis versioneve)',
+'difference-multipage' => '(Ndryshimi midis faqeve)',
'lineno' => 'Rreshti $1:',
'compareselectedversions' => 'Krahasoni versionet e zgjedhura',
'showhideselectedversions' => 'Shfaq/fshih versionet e zgjedhura',
'editundo' => 'ktheje',
-'diff-multi' => '({{PLURAL:$1|Një redaktim ndërmjet nuk është|$1 redaktime ndërmjet nuk janë}} treguar.)',
+'diff-multi' => '({{PLURAL:$1|Një version i ndërmjetshëm|$1 versione të ndërmjetshme}} nga {{PLURAL:$2|një përdorues|$2 përdorues}} i/të pashfaqur)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Një versioni i ndërmjetshëm|$1 versione të ndërmjetshme}} nga më shumë se $2 {{PLURAL:$2|përdorues|përdorues}} i/të pashfaqur)',
# Search results
'searchresults' => 'Rezultatet e kërkimit',
@@ -1094,6 +1107,7 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'searchprofile-everything-tooltip' => 'Kërko gjithë përmbajtjen (duke përfshirë edhe faqet e diskutimit)',
'searchprofile-advanced-tooltip' => 'Kërkimi në hapësina',
'search-result-size' => '$1 ({{PLURAL:$2|1 fjalë|$2 fjalë}})',
+'search-result-category-size' => '{{PLURAL:$1|1 anëtar|$1 anëtarë}} ({{PLURAL:$2|1 nën-kategori|$2 nën-kategori}}, {{PLURAL:$3|1 skedë|$3 skeda}})',
'search-result-score' => 'Përkatësia: $1%',
'search-redirect' => '(përcjellim $1)',
'search-section' => '(seksioni $1)',
@@ -1168,6 +1182,7 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'contextlines' => 'Sa rreshta të tregohen për përputhje:',
'contextchars' => 'Sa germa të tregohen për çdo rresht:',
'stub-threshold' => 'Kufiri për formatin e <a href="#" class="stub">lidhjeve cung</a> (B):',
+'stub-threshold-disabled' => 'Çaktivizuar',
'recentchangesdays' => 'Numri i ditëve të treguara në ndryshime së fundmi:',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dit|ditë}})',
'recentchangescount' => 'Numri i redaktimeve për të treguar:',
@@ -1201,6 +1216,7 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'prefs-files' => 'Figura',
'prefs-custom-css' => 'CSS i përpunuem',
'prefs-custom-js' => 'JavaScripti i përpunuar',
+'prefs-common-css-js' => 'CSS/Javascript të përbashkët për të gjitha pamjet:',
'prefs-reset-intro' => 'Mundeni me përdorë këtë faqe për me i kthy parapëlqimet tueja në ato të paracaktuemet e faqes.
Kjo nuk mundet me u zhbâ.',
'prefs-emailconfirm-label' => 'Konfirmimi i emailit:',
@@ -1238,8 +1254,15 @@ Kjo informatë është publike.',
'prefs-advancedrendering' => 'Opsionet e avancuar',
'prefs-advancedsearchoptions' => 'Opsionet e avancuar',
'prefs-advancedwatchlist' => 'Opsionet e avancuar',
+'prefs-displayrc' => 'Shfaq opsionet',
+'prefs-displaysearchoptions' => 'Shfaq opsionet',
+'prefs-displaywatchlist' => 'Shfaq opsionet',
'prefs-diffs' => 'Ndryshimet',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail adresa është e vlefshme.',
+'email-address-validity-invalid' => 'Futni një e-mali adresë të vlefshme.',
+
# User rights
'userrights' => 'Ndrysho privilegjet e përdoruesve',
'userrights-lookup-user' => 'Ndrysho grupet e përdoruesit',
@@ -1323,6 +1346,7 @@ Kjo informatë është publike.',
'right-hideuser' => 'Blloko përdorues, duke fshehur nga publiku',
'right-ipblock-exempt' => 'Anashkalo bllokimet e IP-ve, auto-bllokimet dhe linjën e bllokimeve',
'right-proxyunbannable' => 'Anashkalo bllokimet automatike të ndërmjetësve',
+'right-unblockself' => 'Zhblloko veten',
'right-protect' => 'Ndrysho nivelin mbrojtës dhe redakto faqet e mbrojtura',
'right-editprotected' => 'Redakto faqet e mbrojtura (pa ndryshuar mbrojtjen)',
'right-editinterface' => 'Ndrysho parapamjen e përdoruesit',
@@ -1444,6 +1468,9 @@ Faqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.",
'upload_directory_missing' => 'Direktoriumi ($1) i ngarkimit po mungon dhe nuk është arritur që të krijohet nga webserveri.',
'upload_directory_read_only' => 'Skedari i ngarkimit ($1) nuk mund të shkruhet nga shërbyesi.',
'uploaderror' => 'Gabim dhënie',
+'upload-recreate-warning' => "'''Kujdes: Një skedarë me atë emër është fshirë apo lëvizur.'''
+
+Regjistri i fshirjes dhe lëvizjes për këtë faqe për lehtësim ofrohen këtu:",
'uploadtext' => "Përdorni formularin e mëposhtëm për të ngarkuar skeda.
Për të parë ose kërkuar skeda të ngarkuara më parë, shkoni tek [[Special:FileList|lista e ngarkimeve të skedave]],
(ri)ngarkimet janë gjithashtu të regjistruara tek [[Special:Log/upload|regjistri i ngarkimeve]], grisjet tek [[Special:Log/delete|regjistri i grisjeve]].
@@ -1479,6 +1506,17 @@ Parapëlqehet {{PLURAL:\$3|skeda të jetë e |skedat të jenë të}} llojit \$2.
'filetype-banned-type' => "'''\".\$1\"''' nuk është lloj i lejuar i skedave.
Si {{PLURAL:\$3|i lejuar është lloji i skedës|të lejuara janë llojet e skedave}} \$2.",
'filetype-missing' => 'Skeda nuk ka mbaresë (si p.sh. ".jpg").',
+'empty-file' => 'Skeda që paraqitët ishte bosh.',
+'file-too-large' => 'Skeda që paraqitët ishte shumë e madhe.',
+'filename-tooshort' => 'Emri i skedës është shumë i shkurtër.',
+'filetype-banned' => 'Kjo lloji i skedës është e ndalur.',
+'verification-error' => 'Kjo skedë nuk e kaloi verifikimin e skedave.',
+'hookaborted' => 'Modifikimi që ju provuat ta bëni u ndërpre nga një goditje shtesë.',
+'illegal-filename' => 'Emri i skedarit nuk lejohet.',
+'overwrite' => 'Mbishkrimi i një skede ekzistuese nuk lejohet.',
+'unknown-error' => 'Një gabim i panjohur.',
+'tmp-create-error' => 'Nuk mund të krijohej skeda e përkohëshme.',
+'tmp-write-error' => 'Gabim gjatë shkrimit të skedës së përkohshme.',
'large-file' => 'Është e këshillueshme që skedat të jenë jo më shumë se $1;
kjo skedë është $2.',
'largefileserver' => 'Skeda është më e madhe se sa serveri e lejon këtë.',
@@ -1506,13 +1544,14 @@ Nëse keni këtë figurë me madhësi të plotë ju lutem të ngarkoni atë, pë
'file-exists-duplicate' => 'Kjo skedë është dyfish i {{PLURAL:$1|skedës|skedave}} në vijim:',
'file-deleted-duplicate' => 'Një skedë identike më këtë skedë ([[:$1]]) është grisur më përpara.
Ju duhet të kontrolloni historikun e grisjes të asaj skede përpara se ta ri-ngarkoni atë.',
-'successfulupload' => 'Dhënie e sukseshme',
'uploadwarning' => 'Kujdes dhënie',
'uploadwarning-text' => 'Ju lutemi modifikoni përshkrimin e skedës dhe provojen përsëri.',
'savefile' => 'Ruaj skedën',
'uploadedimage' => 'dha "[[$1]]"',
'overwroteimage' => 'dha dhe zëvendësoi me një version të ri të "[[$1]]"',
'uploaddisabled' => 'Ndjesë, dhëniet janë bllokuar në këtë shërbyes dhe nuk është gabimi juaj.',
+'copyuploaddisabled' => 'Ngarkimi nga URL-ja u çaktivizua.',
+'uploadfromurl-queued' => 'Ngarkimi juaj ka qenë në radhë.',
'uploaddisabledtext' => 'Ngarkimi i skedave është i ndaluar.',
'php-uploaddisabledtext' => 'Ngarkimet e skedave në PHP janë të çaktivizuara.
Ju lutemi kontrolloni parametrat e ngarkimeve të skedave.',
@@ -1533,6 +1572,14 @@ Duhet të mendoheni nëse është e pranueshme ngarkimi i kësaj skede.
Regjistri i grisjes së skedës jepet më poshtë:",
'filename-bad-prefix' => "Emri i skedës që po ngarkoni fillon me '''\"\$1\"''' dhe nuk është veçantisht përshkrues pasi përdoret nga shumë kamera.
Ju lutem zgjidhni një emër më përshkrues për skedën tuaj.",
+'upload-success-subj' => 'Dhënie e sukseshme',
+'upload-success-msg' => 'Ngarkimi juaj nga [$2] ishte i suksesshëm. Mund të gjendet këtu: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problem gjatë ngarkimit',
+'upload-failure-msg' => 'Kishte një problem me ngarkimin tuaj nga [$2]:
+
+$1',
+'upload-warning-subj' => 'Paralajmërim për ngarkimin',
+'upload-warning-msg' => 'Kishte një problem me ngarkimin tuaj nga [$2]. Ju mund të ktheheni tek [[Special:Upload/stash/$1|forma e ngarkimit]] për të korrgjuar këtë problem.',
'upload-proto-error' => 'Protokoll i gabuar',
'upload-proto-error-text' => 'Ngarkimet nga rrjeti kërkojnë që adresa URL të fillojë me <code>http://</code> ose <code>ftp://</code>.',
@@ -1598,6 +1645,7 @@ Shtypni kolonat e tjera për të ndryshuar radhitjen.',
'listfiles_search_for' => 'Kërko për emrin e figurës:',
'imgfile' => 'skeda',
'listfiles' => 'Lista e figurave',
+'listfiles_thumb' => 'Parapamje',
'listfiles_date' => 'Data',
'listfiles_name' => 'Emri',
'listfiles_user' => 'Përdoruesi',
@@ -1712,8 +1760,8 @@ Mos harroni të shihni nyje tjera të stampave para grisjes së tyre.',
'statistics-edits' => 'Redaktimet e faqes që kur {{SITENAME}} u regjistrua',
'statistics-edits-average' => 'Ndryshime mesatare për faqe',
'statistics-views-total' => 'Shikimet gjithsej',
+'statistics-views-total-desc' => 'Shikimet tek faqet joekzistuese dhe faqet speciale nuk janë të përfshira',
'statistics-views-peredit' => 'Shikimet për redaktim',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Gjatësia e radhës së punës]',
'statistics-users' => '[[Special:ListUsers|Përdoruesit]] e regjistruar',
'statistics-users-active' => 'Përdoruesit aktiv',
'statistics-users-active-desc' => 'Përdoruesit që kanë së paku një veprim në {{PLURAL:$1|ditën|$1 ditët}} e fundit',
@@ -1726,10 +1774,9 @@ Ato duhet të kenë lidhje të drejtpërdrejtë tek artikujt e nevojshëm.<br />
Një faqe trajtohet si faqe kthjelluese nëse përdor stampat e lidhura nga [[MediaWiki:Disambiguationspage]]",
'doubleredirects' => 'Përcjellime dopjo',
-'doubleredirectstext' => '<b>Kujdes:</b> Kjo listë mund të ketë lidhje gabim. D.m.th. ka tekst dhe lidhje mbas #REDIRECT-it të parë.
-
-<br />
-Çdo rresht ka lidhje tek përcjellimi i parë dhe i dytë, gjithashtu ka edhe rreshtin e parë të tekstit të përcjellimit të dytë, duke dhënë dhe artikullin e "vërtetë", me të cilin përcjellimi i parë duhet të lidhet.',
+'doubleredirectstext' => "Kjo faqe liston faqet përcjellëse tek faqet e tjera përcjellëse.
+Secili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë, gjithashtu synimin e përcjellimit të dytë, që është zakonisht faqja synuese '''e vërtetë''', që faqja w parë duhej të ishte përcjellëse e kësaj faqeje.
+<del>Kalimet nga</del> hyrjet janë zgjidhur.",
'double-redirect-fixed-move' => '[[$1]] u zhvendos, tani është gjendet në [[$2]]',
'double-redirect-fixer' => 'Rregullues zhvendosjesh',
@@ -1752,6 +1799,8 @@ Një faqe trajtohet si faqe kthjelluese nëse përdor stampat e lidhura nga [[Me
'nmembers' => '$1 {{PLURAL:$1|antar|antarë}}',
'nrevisions' => '$1 {{PLURAL:$1|version|versione}}',
'nviews' => '$1 {{PLURAL:$1|shikim|shikime}}',
+'nimagelinks' => 'Përdorur në $1 {{PLURAL:$1|faqe|faqe}}',
+'ntransclusions' => 'përdorur në $1 {{PLURAL:$1|faqe|faqe}}',
'specialpage-empty' => 'Kjo faqe është boshe.',
'lonelypages' => 'Artikuj të palidhur',
'lonelypagestext' => 'Faqet në vijim nuk janë të lidhura ose nuk janë të përfshira në faqet tjera në {{SITENAME}}.',
@@ -1908,34 +1957,40 @@ Protokolle të mbështetura: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Hiq të gjitha grupet nga llogaria',
# E-mail user
-'mailnologin' => "S'ka adresë dërgimi",
-'mailnologintext' => 'Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.',
-'emailuser' => 'Email përdoruesit',
-'emailpage' => 'Dërgo email përdoruesve',
-'emailpagetext' => 'Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.
+'mailnologin' => "S'ka adresë dërgimi",
+'mailnologintext' => 'Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.',
+'emailuser' => 'Email përdoruesit',
+'emailpage' => 'Dërgo email përdoruesve',
+'emailpagetext' => 'Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.
Adresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si "Nga" adresa e email-it, pra marrësi do të ketë mundësinë t\'ju përgjigjet direkt.',
-'usermailererror' => 'Objekti postal ktheu gabimin:',
-'defemailsubject' => '{{SITENAME}} email',
-'noemailtitle' => "S'ka adresë email-i",
-'noemailtext' => 'Ky përdorues nuk ka përcaktuar një adresë të vlefshme e-mail.',
-'nowikiemailtitle' => 'Nuk lejohet postë elektronike',
-'nowikiemailtext' => 'Ky përdorues ka zgjedhur të mos pranojë porosi elektronike nga përdoruesit tjerë.',
-'email-legend' => 'Dërgoni porosi elektronike një përdoruesi të {{SITENAME}}',
-'emailfrom' => 'Nga:',
-'emailto' => 'Për:',
-'emailsubject' => 'Subjekti:',
-'emailmessage' => 'Porosia:',
-'emailsend' => 'Dërgo',
-'emailccme' => 'Ma dërgo edhe mua një kopje të këtij emaili.',
-'emailccsubject' => 'Kopje e emailit tuaj për $1: $2',
-'emailsent' => 'Email-i u dërgua',
-'emailsenttext' => 'Email-i është dërguar.',
-'emailuserfooter' => 'Kjo porosi elektronike u dërgua nga $1 tek $2 nga "Dërgoi postë elektronike përdoruesit" funksion në {{SITENAME}}.',
+'usermailererror' => 'Objekti postal ktheu gabimin:',
+'defemailsubject' => '{{SITENAME}} email',
+'usermaildisabled' => 'Email-i i përdoruesit çaktivizua',
+'usermaildisabledtext' => 'Ju nuk mund të dërgoni e-mail tek përdoruesit e tjerë në këtë wiki',
+'noemailtitle' => "S'ka adresë email-i",
+'noemailtext' => 'Ky përdorues nuk ka përcaktuar një adresë të vlefshme e-mail.',
+'nowikiemailtitle' => 'Nuk lejohet postë elektronike',
+'nowikiemailtext' => 'Ky përdorues ka zgjedhur të mos pranojë porosi elektronike nga përdoruesit tjerë.',
+'email-legend' => 'Dërgoni porosi elektronike një përdoruesi të {{SITENAME}}',
+'emailfrom' => 'Nga:',
+'emailto' => 'Për:',
+'emailsubject' => 'Subjekti:',
+'emailmessage' => 'Porosia:',
+'emailsend' => 'Dërgo',
+'emailccme' => 'Ma dërgo edhe mua një kopje të këtij emaili.',
+'emailccsubject' => 'Kopje e emailit tuaj për $1: $2',
+'emailsent' => 'Email-i u dërgua',
+'emailsenttext' => 'Email-i është dërguar.',
+'emailuserfooter' => 'Kjo porosi elektronike u dërgua nga $1 tek $2 nga "Dërgoi postë elektronike përdoruesit" funksion në {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Lënia e mesazhit të sistemit.',
+'usermessage-editor' => 'I dërguari i sistemit',
# Watchlist
'watchlist' => 'Lista mbikqyrëse',
'mywatchlist' => 'Lista mbikqyrëse',
-'watchlistfor' => "(për '''$1''')",
+'watchlistfor2' => 'Për $1 $2',
'nowatchlist' => 'Nuk keni asnjë faqe në listën mbikqyrëse.',
'watchlistanontext' => 'Ju lutemi $1 për të parë redaktimet e artikujve në listë tuaj mbikqyrëse.',
'watchnologin' => 'Nuk keni hyrë brënda',
@@ -2052,7 +2107,10 @@ Redaktimi i fundit është bërë nga [[User:$3|$3]] ([[User talk:$3|diskuto]]{{
'revertpage' => 'Ndryshimet e [[Special:Contributions/$2|$2]] ([[User talk:$2|diskutimet]]) u kthyen mbrapsht, artikulli tani ndodhet në versionin e fundit nga [[User:$1|$1]].',
'revertpage-nouser' => 'U rikthyen redaktimet nga (përdoruesi i larguar) në versionin e fundit nga [[User:$1|$1]]',
'rollback-success' => 'Ndryshimet e $1 u kthyen mbrapsh; artikulli ndodhet tek verzioni i $2.',
-'sessionfailure' => 'Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.',
+
+# Edit tokens
+'sessionfailure-title' => 'Dështim sesioni',
+'sessionfailure' => 'Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.',
# Protect
'protectlogpage' => 'Regjistri i mbrojtjeve',
@@ -2182,19 +2240,23 @@ $1',
'month' => 'Nga muaji (dhe më herët):',
'year' => 'Nga viti (dhe më herët):',
-'sp-contributions-newbies' => 'Trego vetëm redaktimet e llogarive të reja',
-'sp-contributions-newbies-sub' => 'Për newbies',
-'sp-contributions-newbies-title' => 'Kontributet e përdoruesit për kontot e reja',
-'sp-contributions-blocklog' => 'Regjistri i bllokimeve',
-'sp-contributions-deleted' => 'kontributet e grisura',
-'sp-contributions-logs' => 'Regjistrat',
-'sp-contributions-talk' => 'Diskutoni',
-'sp-contributions-userrights' => 'menaxhimi i të drejtave të përdoruesit',
-'sp-contributions-blocked-notice' => 'Ky përdorues është i bllokuar.
+'sp-contributions-newbies' => 'Trego vetëm redaktimet e llogarive të reja',
+'sp-contributions-newbies-sub' => 'Për newbies',
+'sp-contributions-newbies-title' => 'Kontributet e përdoruesit për kontot e reja',
+'sp-contributions-blocklog' => 'Regjistri i bllokimeve',
+'sp-contributions-deleted' => 'kontributet e grisura',
+'sp-contributions-uploads' => 'ngarkimet',
+'sp-contributions-logs' => 'Regjistrat',
+'sp-contributions-talk' => 'Diskutoni',
+'sp-contributions-userrights' => 'menaxhimi i të drejtave të përdoruesit',
+'sp-contributions-blocked-notice' => 'Ky përdorues është i bllokuar.
Bllokimi i fundit është shfaqur më poshtë për referencë:',
-'sp-contributions-search' => 'Kërko tek kontributet',
-'sp-contributions-username' => 'IP Addresa ose Përdoruesi:',
-'sp-contributions-submit' => 'Kërko',
+'sp-contributions-blocked-notice-anon' => 'Kjo adresë IP është e bllokuar aktualisht.
+Bllokimi i funditë është më poshtë për referencë:',
+'sp-contributions-search' => 'Kërko tek kontributet',
+'sp-contributions-username' => 'IP Addresa ose Përdoruesi:',
+'sp-contributions-toponly' => 'Trego vetëm redaktimet që janë versionet më të fundit',
+'sp-contributions-submit' => 'Kërko',
# What links here
'whatlinkshere' => 'Lidhjet këtu',
@@ -2255,7 +2317,6 @@ Shiko te [[Special:IPBlockList|Lista e përdoruesve dhe e IP adresave të blloku
'ipb-edit-dropdown' => 'Redakto arsyet e bllokimit',
'ipb-unblock-addr' => 'Çblloko $1',
'ipb-unblock' => 'Çblloko përdorues dhe IP të bllokuara',
-'ipb-blocklist-addr' => 'Shikoni bllokime në fuqi për $1',
'ipb-blocklist' => 'Përdorues dhe IP adresa të bllokuara',
'ipb-blocklist-contribs' => 'Kontributet për $1',
'unblockip' => 'Çblloko përdoruesin',
@@ -2330,6 +2391,8 @@ Ajo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhb
'cant-block-while-blocked' => 'Ju nuk mund të bllokoni përdorues të tjerë ndërkohë që jeni i bllokuar.',
'cant-see-hidden-user' => 'Përdoruesi që po përpiqeni të bllokoni është i bllokuar dhe i fshehur.
Përderisa ju nuk keni të drejtën e fshehjes së përdoruesve, ju nuk mund të shikoni ose redaktoni bllokimet e përdoruesit.',
+'ipbblocked' => 'Ju nuk mund të bllokoni ose zhbllokoni përdoruesit e tjerë, sepse jeni për vete i bllokuar',
+'ipbnounblockself' => 'Ju nuk mund të zhbllokoni veten tuaj',
# Developer tools
'lockdb' => 'Blloko regjistrin',
@@ -2366,6 +2429,17 @@ Kjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.
'''KUJDES!'''
Ky mund të jetë një ndryshim i madh dhe i papritur për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
+'movepagetext-noredirectfixer' => "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historinë përkatëse tek titulli i ri.
+Titulli i vjetër do të bëhet një faqe përcjellëse tek titulli i ri.
+Lidhjet tek faqja e vjetër nuk do të ndryshohen;
+duhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].
+Keni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.
+
+Vini re se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse kur ajo të jetë bosh ose një përcjellim dhe të mos ketë një histori të vjetër.
+Kjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.
+
+'''KUJDES!'''
+Ky mund të jetë një ndryshim i madh dhe gjëra të papritura mund të ndodhin për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
'movepagetalktext' => "Faqja a bashkangjitur e diskutimit, n.q.s. ekziston, do të zhvendoset automatikisht '''përveçse''' kur:
*Zhvendosni një faqe midis hapësirave të ndryshme,
*Një faqe diskutimi jo-boshe ekziston nën titullin e ri, ose
@@ -2421,6 +2495,7 @@ Faqja "[[:$1]]" ekziston, dëshironi ta grisni për të mundësuar zhvendosjen?'
'immobile-source-page' => 'Kjo faqe është e pa lëvizshme.',
'immobile-target-page' => 'Nuk mund të zhvendoset tek titulli i destinuar.',
'imagenocrossnamespace' => 'Nuk mund të lëvizet skeda tek hapësira e jo-skedës',
+'nonfile-cannot-move-to-file' => 'Nuk mund të lëvizet jo-skeda tek hapësira e skedës',
'imagetypemismatch' => 'Skeda e re nuk përputhet me llojin e vet',
'imageinvalidfilename' => 'Emri i skedës së synuar është i pavlefshëm',
'fix-double-redirects' => 'Përditësoni çdo përcjellim që tregon titullin origjinal',
@@ -2496,6 +2571,7 @@ Të gjitha veprimet e importit transwiki janë të regjistruara tek [[Special:Lo
'importstart' => 'Duke importuar faqet...',
'import-revision-count' => '$1 {{PLURAL:$1|version|versione}}',
'importnopages' => "S'ka faqe për tu importuar.",
+'imported-log-entries' => 'Importuar $1 {{PLURAL:$1|hyrje|hyrje}}',
'importfailed' => 'Importimi dështoi: $1',
'importunknownsource' => 'Lloj burimi importi i panjohur',
'importcantopen' => 'Nuk mund të hapë skedën e importuar',
@@ -2592,6 +2668,8 @@ Ju lutemi provoni përsëri.',
'tooltip-upload' => 'Fillo ngarkimin',
'tooltip-rollback' => '"Rikthimi" rikthen ndryshimet tek kjo faqe nga redaktuesi i fundit vetëm me një klikim.',
'tooltip-undo' => '"Zhbëj" rikthen këtë ndryshim deh hap formën e redaktimit në mënyrë parapamjeje. Lejon që të shtoni një arsye tek përmbledhja.',
+'tooltip-preferences-save' => 'Ruaj parapëlqimet',
+'tooltip-summary' => 'Fusni një përmbledhje të shkurtër',
# Stylesheets
'monobook.css' => '/* redaktoni këtë faqe për të përshtatur pamjen Monobook për tëra faqet tuaja */',
@@ -2688,18 +2766,22 @@ $1',
'nextdiff' => 'Ndryshimi më pas →',
# Media information
-'mediawarning' => "'''Kujdes''': Kjo skedë mund të ketë përmbajtje të dëmshme, duke e përdorur sistemi juaj mund të rrezikohet.",
+'mediawarning' => "''Kujdes''': Kjo skedë mund të ketë përmbajtje të dëmshme.
+Duke e përdorur sistemi juaj mund të rrezikohet.",
'imagemaxsize' => "Kufizoni madhësinë e fotos:<br />''(për faqet e përshkrimit të skedave)''",
'thumbsize' => 'Madhësia fotove përmbledhëse:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|faqe|faqe}}',
-'file-info' => '(madhësia skedës: $1, lloji MIME: $2)',
-'file-info-size' => '($1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4)',
+'file-info' => 'madhësia skedës: $1, lloji MIME: $2',
+'file-info-size' => '$1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4',
'file-nohires' => '<small>Nuk ka rezolucion më të madh.</small>',
-'svg-long-desc' => '(skedë SVG, fillimisht $1 × $2 pixel, madhësia e skedës: $3)',
+'svg-long-desc' => 'skedë SVG, fillimisht $1 × $2 pixel, madhësia e skedës: $3',
'show-big-image' => 'Rezolucion i plotë',
'show-big-image-thumb' => '<small>Madhësia e këtij shikimi: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'kthyer',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kornizë|korniza}}',
+'file-info-png-looped' => 'kthyer',
+'file-info-png-repeat' => 'luajtur $1 herë',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kornizë|korniza}}',
# Special:NewFiles
'newimages' => 'Galeria e figurave të reja',
@@ -2855,6 +2937,7 @@ Të tjerat do të fshihen.
'exif-gpsareainformation' => 'Emri i zonës GPS',
'exif-gpsdatestamp' => 'E dhënë GPS',
'exif-gpsdifferential' => 'Korrigjim diferencial i GPS',
+'exif-objectname' => 'Titull i shkurtër',
# EXIF attributes
'exif-compression-1' => 'E pangjeshur',
@@ -3012,25 +3095,25 @@ Të tjerat do të fshihen.
'limitall' => 'Të gjitha',
# E-mail address confirmation
-'confirmemail' => 'Vërtetoni adresën tuaj',
-'confirmemail_noemail' => 'Ju nuk keni dhënë email të sakt te [[Special:Preferences|parapëlqimet e juaja]].',
-'confirmemail_text' => 'Për të marrë email duhet të vërtetoni adresen tuaj. Shtypni butonin e mëposhtëm për të dërguar një email vërtetimi tek adresa juaj. Email-i do të përmbajë një lidhje me kod të shifruar. Duke ndjekur lidhjen nëpërmjet shfletuesit tuaj do të vërtetoni adresën.',
-'confirmemail_pending' => "Një kod vërtetimi ju është dërguar më parë. Nëse sapo hapët llogarinë tuaj prisni disa minuta deri sa t'iu arrijë mesazhi përpara se të kërkoni një kod të ri.",
-'confirmemail_send' => 'Dërgo vërtetimin',
-'confirmemail_sent' => 'Email-i për vërtetim është dërguar.',
-'confirmemail_oncreate' => 'Një kod vërtetimi është dërguar tek adresa juaj e email-it.
+'confirmemail' => 'Vërtetoni adresën tuaj',
+'confirmemail_noemail' => 'Ju nuk keni dhënë email të sakt te [[Special:Preferences|parapëlqimet e juaja]].',
+'confirmemail_text' => 'Për të marrë email duhet të vërtetoni adresen tuaj. Shtypni butonin e mëposhtëm për të dërguar një email vërtetimi tek adresa juaj. Email-i do të përmbajë një lidhje me kod të shifruar. Duke ndjekur lidhjen nëpërmjet shfletuesit tuaj do të vërtetoni adresën.',
+'confirmemail_pending' => "Një kod vërtetimi ju është dërguar më parë. Nëse sapo hapët llogarinë tuaj prisni disa minuta deri sa t'iu arrijë mesazhi përpara se të kërkoni një kod të ri.",
+'confirmemail_send' => 'Dërgo vërtetimin',
+'confirmemail_sent' => 'Email-i për vërtetim është dërguar.',
+'confirmemail_oncreate' => 'Një kod vërtetimi është dërguar tek adresa juaj e email-it.
Ky kod nuk kërkohet për të hyrë brenda në llogarinë tuaj, por nevojitet për të mundësuar mjetet që përdorin email në këtë wiki.',
-'confirmemail_sendfailed' => '{{SITENAME}} nuk mundi ta çojë email-in tuaj konfirmues.
+'confirmemail_sendfailed' => '{{SITENAME}} nuk mundi ta çojë email-in tuaj konfirmues.
Ju lutemi kontrolloni adresen e emial-it tuaj per gabime ne shkrim.
Postieri u kthye: $1',
-'confirmemail_invalid' => 'Kodi i shifrimit të vërtetimit është gabim ose ka skaduar.',
-'confirmemail_needlogin' => 'Ju duhet të $1 për ta konfirmuar email-adresën',
-'confirmemail_success' => 'Adresa juaj është vërtetuar. Mund të hyni brënda dhe të përdorni wiki-n.',
-'confirmemail_loggedin' => 'Adresa juaj është vërtetuar.',
-'confirmemail_error' => 'Pati gabim gjatë ruajtjes së vërtetimit tuaj.',
-'confirmemail_subject' => 'Vërtetim adrese nga {{SITENAME}}',
-'confirmemail_body' => 'Dikush, me gjasë ju, nga IP adresa $1,
+'confirmemail_invalid' => 'Kodi i shifrimit të vërtetimit është gabim ose ka skaduar.',
+'confirmemail_needlogin' => 'Ju duhet të $1 për ta konfirmuar email-adresën',
+'confirmemail_success' => 'Adresa juaj është vërtetuar. Mund të hyni brënda dhe të përdorni wiki-n.',
+'confirmemail_loggedin' => 'Adresa juaj është vërtetuar.',
+'confirmemail_error' => 'Pati gabim gjatë ruajtjes së vërtetimit tuaj.',
+'confirmemail_subject' => 'Vërtetim adrese nga {{SITENAME}}',
+'confirmemail_body' => 'Dikush, me gjasë ju, nga IP adresa $1,
ka regjistruar një llogari "$2" me këtë e-mail adresë në {{SITENAME}}.
Për të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të aktivizuar
@@ -3044,8 +3127,36 @@ për të anuluar konfirmimin e e-mail adresës:
$5
Ky kod i konfirmimit skadon me $4.',
-'confirmemail_invalidated' => 'Vërtetimi i adresës së email-it është tërhequr',
-'invalidateemail' => 'Tërhiq vërtetimin e email-it',
+'confirmemail_body_changed' => 'Dikush, me gjasë ju, nga IP adresa $1,
+ka ndryshuar e-mail adresën e llogarisë "$2" me këtë adresë në {{SITENAME}}.
+
+Për të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të rizaktivizuar
+funksionet e \'\'e-mail\'\'-it në {{SITENAME}}, hapni këtë lidhje në shfletuesin tuaj:
+
+$3
+
+Nëse llogaria *nuk* ju përket, ndiqni këtë lidhje
+për të anuluar konfirmimin e e-mail adresës:
+
+$5
+
+Ky kod i konfirmimit skadon me $4.',
+'confirmemail_body_set' => 'Dikush, me gjasë ju, nga IP adresa $1,
+ka ndryshuar e-mail adresën e llogarisë "$2" me këtë adresë në {{SITENAME}}.
+
+Për të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të riaktivizuar
+funksionet e \'\'e-mail\'\'-it në {{SITENAME}}, hapni këtë lidhje në shfletuesin tuaj:
+
+$3
+
+Nëse llogaria *nuk* ju përket, ndiqni këtë lidhje
+për të anuluar konfirmimin e e-mail adresës:
+
+$5
+
+Ky kod i konfirmimit skadon me $4.',
+'confirmemail_invalidated' => 'Vërtetimi i adresës së email-it është tërhequr',
+'invalidateemail' => 'Tërhiq vërtetimin e email-it',
# Scary transclusion
'scarytranscludedisabled' => '[Lidhja Interwiki nuk është i mundshëm]',
@@ -3085,6 +3196,7 @@ Ju lutem konfirmoni nëse dëshironi me të vertetë ta rikrijoni këtë artikul
'table_pager_first' => 'Faqja e parë',
'table_pager_last' => 'Faqja e fundit',
'table_pager_limit' => 'Trego $1 rreshta për faqe',
+'table_pager_limit_label' => 'Artikuj per faqe:',
'table_pager_limit_submit' => 'Shko',
'table_pager_empty' => "S'ka rezultate",
@@ -3140,6 +3252,7 @@ Ju gjithashtu mund [[Special:Watchlist/edit|të përdorni redaktuesin standart]]
'version-specialpages' => 'Faqe speciale',
'version-parserhooks' => 'Parser goditje',
'version-variables' => 'Variabël',
+'version-skins' => 'Pamjet',
'version-other' => 'Të tjera',
'version-mediahandlers' => 'Mbajtesit e Media-s',
'version-hooks' => 'Goditjet',
@@ -3151,6 +3264,13 @@ Ju gjithashtu mund [[Special:Watchlist/edit|të përdorni redaktuesin standart]]
'version-hook-subscribedby' => 'Abonuar nga',
'version-version' => '(Versioni $1)',
'version-license' => 'Licensa',
+'version-poweredby-credits' => "Ky wiki është mundësuar nga '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'të tjerë',
+'version-license-info' => 'MediaWiki është një softuer i lirë; ju mund ta shpërndani dhe redakatoni atë nën kushtet GNU General Public License si e publikuar nga fondacioni Free Software; ose versioni 2 i licensës, ose çdo version më i vonshëm.
+
+MediaWiki është shpërndarë me shpresën se do të jetë i dobishëm, por PA ASNJË GARANCI; as garancinë e shprehur të SHITJES apo PËRDORIMIT PËR NJË QËLLIM TË CAKTUAR. Shikoni GNU General Public License për më shumë detaje.
+
+Ju duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU General Public License] së bashku me këtë program; nëse jo, shkruani tek Free Software Foundation, Inc., 51 Rruga Franklin, Kati i pestë, Boston, MA 02110-1301, ShBA ose [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lexojeni atë online].',
'version-software' => 'Softuerët e instaluar',
'version-software-product' => 'Produkti',
'version-software-version' => 'Versioni',
@@ -3220,6 +3340,15 @@ Faqet speciale normale.
'tags-edit' => 'redakto',
'tags-hitcount' => '$1 {{PLURAL:$1|ndryshim|ndryshime}}',
+# Special:ComparePages
+'comparepages' => 'Krahasoni faqet',
+'compare-selector' => 'Krahasoni versionet e faqeve',
+'compare-page1' => 'Faqe 1',
+'compare-page2' => 'Faqe 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Krahasimi',
+
# Database error messages
'dberr-header' => 'Kjo wiki ka një problem',
'dberr-problems' => 'Na vjen keq!
@@ -3237,8 +3366,13 @@ Kjo faqe është duke përjetuar vështirësi teknike.',
'htmlform-float-invalid' => 'Vlera që ju e specifikuat nuk është numër.',
'htmlform-int-toolow' => 'Vlera që ju e përcaktuat është nën minimumin e $1',
'htmlform-int-toohigh' => 'Vlera që ju e përcaktuat është mbi maksimumin e $1',
+'htmlform-required' => 'Kjo vlerë është e nevojshme',
'htmlform-submit' => 'Dërgo',
'htmlform-reset' => 'Zhbëj ndryshimin',
'htmlform-selectorother-other' => 'Gjitha',
+# SQLite database support
+'sqlite-has-fts' => '$1 me mbështetje të kërkimit me teskt të plotë',
+'sqlite-no-fts' => '$1 pa mbështetje të kërkimit me teskt të plotë',
+
);
diff --git a/languages/messages/MessagesSr.php b/languages/messages/MessagesSr.php
index 4fd8913b..406c6f89 100644
--- a/languages/messages/MessagesSr.php
+++ b/languages/messages/MessagesSr.php
@@ -18,7 +18,7 @@ $linkTrail = '/^([abvgdÄ‘ežzijklljmnnjoprstćufhcÄdžšабвгдђежзијÐ
$messages = array(
# Vector skin
-'vector-view-viewsource' => 'Погледај код',
+'vector-view-viewsource' => 'Изворник',
# Special:LinkSearch
'linksearch' => 'Претрага интернет веза',
diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php
index caca1c1a..ea5f8f8d 100644
--- a/languages/messages/MessagesSr_ec.php
+++ b/languages/messages/MessagesSr_ec.php
@@ -11,6 +11,7 @@
* @author CERminator
* @author Charmed94
* @author FriedrickMILBarbarossa
+ * @author Helios13
* @author Kale
* @author Meno25
* @author Millosh
@@ -86,6 +87,67 @@ $datePreferenceMigrationMap = array(
'h:mm d mon y',
);
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'ДвоÑтрука_преуÑмерења' ),
+ 'BrokenRedirects' => array( 'Покварена_преуÑмерења' ),
+ 'Disambiguations' => array( 'Вишезначне_одреднице' ),
+ 'CreateAccount' => array( 'ОтвориÐалог' ),
+ 'Preferences' => array( 'Подешавања' ),
+ 'Watchlist' => array( 'СпиÑакÐадгледања' ),
+ 'Recentchanges' => array( 'СкорашњеИзмене' ),
+ 'Upload' => array( 'Пошаљи' ),
+ 'Listfiles' => array( 'СпиÑакСлика' ),
+ 'Newimages' => array( 'ÐовиФајлови', 'ÐовеСлике' ),
+ 'Listusers' => array( 'СпиÑакКориÑника', 'КориÑничкиСпиÑак' ),
+ 'Listgrouprights' => array( 'СпиÑакКориÑничкихПрава' ),
+ 'Statistics' => array( 'СтатиÑтике' ),
+ 'Randompage' => array( 'СлучајнаСтрана' ),
+ 'Lonelypages' => array( 'Сирочићи' ),
+ 'Uncategorizedpages' => array( 'ЧланциБезКатегорија' ),
+ 'Uncategorizedcategories' => array( 'КатегоријеБезКатегорија' ),
+ 'Uncategorizedimages' => array( 'СликеБезКатегорија', 'ФајловиБезКатегорија' ),
+ 'Uncategorizedtemplates' => array( 'ШаблониБезКатегорија' ),
+ 'Unusedcategories' => array( 'ÐеиÑкоришћенеКатегорије' ),
+ 'Unusedimages' => array( 'ÐеиÑкоришћенеСлике', 'ÐеиÑкоришћениФајлови' ),
+ 'Wantedpages' => array( 'ТраженеСтране' ),
+ 'Wantedcategories' => array( 'ТраженеКатегорије' ),
+ 'Wantedfiles' => array( 'ТраженеСлике' ),
+ 'Wantedtemplates' => array( 'ТражениШаблони' ),
+ 'Mostlinked' => array( 'ÐајповезанијеСтране' ),
+ 'Mostlinkedcategories' => array( 'ÐајповезанијеКатегорије' ),
+ 'Mostlinkedtemplates' => array( 'ÐајповезанијиШаблони' ),
+ 'Mostimages' => array( 'ÐајповезанијеСлике' ),
+ 'Mostcategories' => array( 'ЧланциСаÐајвишеКатегорија' ),
+ 'Mostrevisions' => array( 'ЧланциСаÐајвишеРевизија' ),
+ 'Fewestrevisions' => array( 'ЧланциСаÐајмањеРевизија' ),
+ 'Shortpages' => array( 'КраткиЧланци' ),
+ 'Longpages' => array( 'ДугачкеСтране' ),
+ 'Newpages' => array( 'ÐовеСтране' ),
+ 'Ancientpages' => array( 'ÐајÑтаријиЧланци' ),
+ 'Protectedpages' => array( 'ЗаштићенеСтранице' ),
+ 'Specialpages' => array( 'СпецијалнеСтране' ),
+ 'Contributions' => array( 'ДоприноÑи' ),
+ 'Confirmemail' => array( 'ПотврдиЕ-пошту' ),
+ 'Movepage' => array( 'ПреуÑмери' ),
+ 'Blockme' => array( 'БлокирајМе' ),
+ 'Categories' => array( 'Категорије' ),
+ 'Export' => array( 'Извези' ),
+ 'Version' => array( 'Верзија' ),
+ 'Allmessages' => array( 'СвеПоруке' ),
+ 'Blockip' => array( 'Блокирај', 'БлокирајИП', 'БлокирајКориÑника' ),
+ 'Import' => array( 'Увези' ),
+ 'Lockdb' => array( 'ЗакључајБазу' ),
+ 'Unlockdb' => array( 'ОткључајБазу' ),
+ 'Listredirects' => array( 'СпиÑакПреуÑмерења' ),
+ 'Mypage' => array( 'МојаСтраница' ),
+ 'Mytalk' => array( 'МојРазговор' ),
+ 'Mycontributions' => array( 'МојиДоприноÑи' ),
+ 'Listadmins' => array( 'ПопиÑÐдминиÑтратора' ),
+ 'Listbots' => array( 'ПопиÑБотова' ),
+ 'Search' => array( 'Претражи' ),
+ 'Activeusers' => array( 'ÐктивниКориÑници' ),
+);
+
$datePreferences = array(
'default',
'hh:mm d. month y.',
@@ -147,18 +209,18 @@ $dateFormats = array(
'h:mm d. mon y. date' => 'j. M Y.',
'h:mm d mon y date' => 'j M Y',
- 'hh:mm d. month y. both' =>'H:i, j. F Y.',
- 'hh:mm d month y both' =>'H:i, j F Y',
- 'hh:mm dd.mm.yyyy both' =>'H:i, d.m.Y',
- 'hh:mm d.m.yyyy both' =>'H:i, j.n.Y',
- 'hh:mm d. mon y. both' =>'H:i, j. M Y.',
- 'hh:mm d mon y both' =>'H:i, j M Y',
- 'h:mm d. month y. both' =>'G:i, j. F Y.',
- 'h:mm d month y both' =>'G:i, j F Y',
- 'h:mm dd.mm.yyyy both' =>'G:i, d.m.Y',
- 'h:mm d.m.yyyy both' =>'G:i, j.n.Y',
- 'h:mm d. mon y. both' =>'G:i, j. M Y.',
- 'h:mm d mon y both' =>'G:i, j M Y',
+ 'hh:mm d. month y. both' => 'H:i, j. F Y.',
+ 'hh:mm d month y both' => 'H:i, j F Y',
+ 'hh:mm dd.mm.yyyy both' => 'H:i, d.m.Y',
+ 'hh:mm d.m.yyyy both' => 'H:i, j.n.Y',
+ 'hh:mm d. mon y. both' => 'H:i, j. M Y.',
+ 'hh:mm d mon y both' => 'H:i, j M Y',
+ 'h:mm d. month y. both' => 'G:i, j. F Y.',
+ 'h:mm d month y both' => 'G:i, j F Y',
+ 'h:mm dd.mm.yyyy both' => 'G:i, d.m.Y',
+ 'h:mm d.m.yyyy both' => 'G:i, j.n.Y',
+ 'h:mm d. mon y. both' => 'G:i, j. M Y.',
+ 'h:mm d mon y both' => 'G:i, j M Y',
);
/* NOT USED IN STABLE VERSION */
@@ -217,7 +279,7 @@ $magicWords = array(
'lc' => array( '0', 'ЛЦ:', 'LC:' ),
'uc' => array( '0', 'УЦ:', 'UC:' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -235,8 +297,7 @@ $messages = array(
'tog-editsection' => 'Везе за уређивање појединачних одељака',
'tog-editsectiononrightclick' => 'Уређивање одељака деÑним кликом на њихове наÑлове (јаваÑкрипт)',
'tog-showtoc' => 'Прикажи Ñадржај за Ñтранице које имају више од три поднаÑлова',
-'tog-rememberpassword' => 'Памти лозинку кроз више ÑеанÑи',
-'tog-editwidth' => 'Рашири поље за измене преко целог екрана',
+'tog-rememberpassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
'tog-watchcreations' => 'Додај Ñтранице које направим у ÑпиÑак надгледања',
'tog-watchdefault' => 'Додај Ñтранице које изменим у ÑпиÑак надгледања',
'tog-watchmoves' => 'Додај Ñтранице које премеÑтим у ÑпиÑак надгледања',
@@ -381,31 +442,21 @@ $messages = array(
'faqpage' => 'Project:ÐПП',
# Vector skin
-'vector-action-addsection' => '+',
-'vector-action-delete' => 'Обриши',
-'vector-action-move' => 'ПремеÑти',
-'vector-action-protect' => 'Заштити',
-'vector-action-undelete' => 'Врати',
-'vector-action-unprotect' => 'Скини заштиту',
-'vector-namespace-category' => 'Категорија',
-'vector-namespace-help' => 'Страна помоћи',
-'vector-namespace-image' => 'Датотека',
-'vector-namespace-main' => 'Страница',
-'vector-namespace-media' => 'Страница на податотека',
-'vector-namespace-mediawiki' => 'Порука',
-'vector-namespace-project' => 'Пројекат',
-'vector-namespace-special' => 'ПоÑебна Ñтраница',
-'vector-namespace-talk' => 'Разговор',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'КориÑник',
-'vector-view-create' => 'Ðаправи',
-'vector-view-edit' => 'Уреди',
-'vector-view-history' => 'ИÑторија',
-'vector-view-view' => 'Читај',
-'vector-view-viewsource' => 'Изворник',
-'actions' => 'Ðкције',
-'namespaces' => 'ИменÑки проÑтори',
-'variants' => 'Варијанте',
+'vector-action-addsection' => '+',
+'vector-action-delete' => 'Обриши',
+'vector-action-move' => 'ПремеÑти',
+'vector-action-protect' => 'Заштити',
+'vector-action-undelete' => 'Врати',
+'vector-action-unprotect' => 'Скини заштиту',
+'vector-simplesearch-preference' => 'Проширени предлози за претрагу (Ñамо за тему Вектор)',
+'vector-view-create' => 'Ðаправи',
+'vector-view-edit' => 'Уреди',
+'vector-view-history' => 'ИÑторија',
+'vector-view-view' => 'Читај',
+'vector-view-viewsource' => 'Изворник',
+'actions' => 'Ðкције',
+'namespaces' => 'ИменÑки проÑтори',
+'variants' => 'Варијанте',
'errorpagetitle' => 'Грешка',
'returnto' => 'Повратак на $1.',
@@ -466,6 +517,9 @@ $messages = array(
Сачекате неко време пре него што поново покушате да јој приÑтупите.
$1',
+'pool-timeout' => 'ИÑтек времена чека на закључавање',
+'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}}',
@@ -635,7 +689,8 @@ $2',
'yourname' => 'КориÑничко име:',
'yourpassword' => 'Лозинка:',
'yourpasswordagain' => 'Потврдите лозинку:',
-'remembermypassword' => 'Запамти ме на овом рачунару',
+'remembermypassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
+'securelogin-stick-https' => 'ОÑтаните повезани на HTTPS након пријаве',
'yourdomainname' => 'Домен:',
'externaldberror' => 'Дошло је до грешке при идентификацији базе података или немате овлашћења да ажурирате Ñвој Ñпољни налог.',
'login' => 'Пријави ме',
@@ -652,6 +707,7 @@ $2',
'gotaccount' => "Имате налог? Идите на Ñтраницу ''$1''.",
'gotaccountlink' => 'Пријава',
'createaccountmail' => 'Е-поштом',
+'createaccountreason' => 'Разлог:',
'badretype' => 'Лозинке које Ñте унели Ñе не поклапају.',
'userexists' => 'КориÑничко име је заузето. Изаберите друго.',
'loginerror' => 'Грешка при пријављивању',
@@ -675,6 +731,7 @@ $2',
'wrongpasswordempty' => 'ÐиÑте унели лозинку. Покушајте поново.',
'passwordtooshort' => 'Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.',
'password-name-match' => 'Лозинка Ñе мора разликовати од кориÑничког имена.',
+'password-login-forbidden' => 'Коришћење овог кориÑничког имена и лозинке је забрањено.',
'mailmypassword' => 'Пошаљи ми нову лозинку',
'passwordremindertitle' => '{{SITENAME}} – подÑетник за лозинку',
'passwordremindertext' => 'Ðеко, вероватно ви, Ñа ИП адреÑе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).
@@ -715,6 +772,9 @@ $2',
'loginlanguagelabel' => 'Језик: $1',
'suspicious-userlogout' => 'Ваш захтев за одјаву је одбијен јер је поÑлат од Ñтране неиÑправног прегледача или поÑредника.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ðепозната грешка у функцији PHP mail()',
+
# Password reset dialog
'resetpass' => 'Промена лозинке',
'resetpass_announce' => 'Пријављени Ñте Ñ Ð¿Ñ€Ð¸Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¾Ð¼ лозинком.
@@ -768,10 +828,12 @@ $2',
'showdiff' => 'Прикажи измене',
'anoneditwarning' => "'''Пажња:''' ÐиÑте пријављени.
Ваша IP адреÑа ће бити забележена у иÑторији ове Ñтранице.",
+'anonpreviewwarning' => "''ÐиÑте пријављени. Ваша IP адреÑа ће бити забележена у иÑторији ове Ñтранице.''",
'missingsummary' => "'''Ðапомена:''' ниÑте унели Ñажетак измене.
Ðко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити Ñачувана без Ñажетка.",
'missingcommenttext' => 'УнеÑите коментар иÑпод.',
-'missingcommentheader' => "'''ПодÑетник:''' ÐиÑте навели наÑлов овог коментара. Уколико кликнете ''Сними поново'', ваш коментар ће бити Ñнимљен без наÑлова.",
+'missingcommentheader' => "'''Ðапомена:''' ниÑте унели тему/наÑлов овог коментара.
+Ðко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити Ñачувана без теме/наÑлова.",
'summary-preview' => 'Преглед Ñажетка:',
'subject-preview' => 'Преглед теме/наÑлова:',
'blockedtitle' => 'КориÑник је блокиран.',
@@ -849,7 +911,12 @@ $2',
'''Страница још увек није Ñачувана.'''",
'userjspreview' => "'''Ово је Ñамо преглед јаваÑкрипта.'''
'''Страница још увек није Ñачувана.'''",
-'userinvalidcssjstitle' => "'''Пажња:''' Ðе поÑтоји кожа \"\$1\". Запамтите да личне .css и .js Ñтранице кориÑте мала почетна Ñлова, нпр. {{ns:user}}:Петар/monobook.css а не {{ns:user}}:Петар/Monobook.css.",
+'sitecsspreview' => "'''Ово је Ñамо преглед CSS-а.'''
+'''Страница још увек није Ñачувана.'''",
+'sitejspreview' => "'''Ово је Ñамо преглед јаваÑкрипта.'''
+'''Страница још увек није Ñачувана.'''",
+'userinvalidcssjstitle' => "'''Упозорење:''' не поÑтоји тема „$1“.
+Прилагођене Ñтранице CSS и јаваÑкрипт почињу малим Ñловом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
'updated' => '(Ðжурирано)',
'note' => "'''Ðапомена:'''",
'previewnote' => "'''Ово је Ñамо преглед.'''
@@ -890,7 +957,6 @@ $2',
Ðко не желите да Ñе ваши прилози немилоÑрдно мењају, не шаљите их овде.<br />
Такође нам обећавате да Ñте ово Ñами напиÑали или умножили Ñ Ð¸Ð·Ð²Ð¾Ñ€Ð° у јавном влаÑништву (погледајте $1 за детаље).
'''Ðе шаљите радове заштићене ауторÑким правима без дозволе!'''",
-'longpagewarning' => "'''ПÐЖЊÐ: Ова Ñтраница има $1 килобајта; неки браузери имају проблема Ñа уређивањем Ñтраница које имају близу или више од 32 килобајта. Молимо Ð²Ð°Ñ Ð´Ð° размотрите разбијање Ñтранице на мање делове.'''",
'longpageerror' => "'''Грешка: текÑÑ‚ који Ñте унели је величине $1 килобајта, што је веће од дозвољених $2 килобајта.
Страница не може бити Ñачувана.'''",
'readonlywarning' => "'''Упозорење: база података је закључана ради одржавања, тако да нећете моћи да Ñачувате измене.
@@ -1070,6 +1136,8 @@ $1",
'logdelete-failure' => "'''ВидљивоÑÑ‚ иÑторије није поÑтављена:'''
$1",
'revdel-restore' => 'промени видљивоÑÑ‚',
+'revdel-restore-deleted' => 'обриÑане измене',
+'revdel-restore-visible' => 'видљиве измене',
'pagehist' => 'ИÑторија Ñтранице',
'deletedhist' => 'ОбриÑана иÑторија',
'revdelete-content' => 'Ñадржај',
@@ -1139,11 +1207,13 @@ $1",
# Diffs
'history-title' => 'ИÑторија измена за „$1“',
'difference' => '(разлике између измена)',
+'difference-multipage' => '(разлике између Ñтраница)',
'lineno' => 'Линија $1:',
'compareselectedversions' => 'Упореди изабране измене',
'showhideselectedversions' => 'Прикажи/Ñакриј изабране измене',
'editundo' => 'поништи',
-'diff-multi' => '({{PLURAL:$1|Једна ревизија није приказана|$1 ревизије ниÑу приказане|$1 ревизија није приказано}}.)',
+'diff-multi' => '({{PLURAL:$1|није приказана међуизмена|ниÑу приказане $1 међуизмене|није приказано $1 међуизмена}} {{PLURAL:$2|једног|$2|$2}} кориÑника)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ðије приказана међуизмена|ÐиÑу приказане $1 међуизмене|Ðије приказано $1 међуизмена}} од више од $2 {{PLURAL:$2|кориÑника|кориÑника|кориÑника}})',
# Search results
'searchresults' => 'Резултати претраге',
@@ -1178,6 +1248,7 @@ $1",
'searchprofile-everything-tooltip' => 'Претражи Ñав Ñадржај (укључујући Ñтранице за разговор)',
'searchprofile-advanced-tooltip' => 'Тражи у прилагођеним именÑким проÑторима',
'search-result-size' => '$1 ({{PLURAL:$2|1 реч|$2 речи|$2 речи}})',
+'search-result-category-size' => '{{PLURAL:$1|1 члан|$1 члана|$1 чланова}}, ({{PLURAL:$2|1 поткатегорија|$2 поткатегорије|$2 поткатегорија}}, {{PLURAL:$3|1 датотека|$3 датотеке|$3 датотека}})',
'search-result-score' => 'РелевантноÑÑ‚: $1%',
'search-redirect' => '(преуÑмерење $1)',
'search-section' => '(одељак $1)',
@@ -1255,6 +1326,7 @@ $1",
'contextlines' => 'Линија по поготку:',
'contextchars' => 'Знакова по линији:',
'stub-threshold' => 'Праг за обликовање <a href="#" class="stub">везе као клице</a> (у бајтовима):',
+'stub-threshold-disabled' => 'Онемогућено',
'recentchangesdays' => 'Број дана у Ñкорашњим изменама:',
'recentchangesdays-max' => '(највише $1 {{PLURAL:$1|дан|дана|дана}})',
'recentchangescount' => 'Број измена за приказ:',
@@ -1288,6 +1360,7 @@ $1",
'prefs-files' => 'Датотеке',
'prefs-custom-css' => 'Прилагођени CSS',
'prefs-custom-js' => 'Прилагођени јаваÑкрипт',
+'prefs-common-css-js' => 'Дељени CSS/јаваÑкрипт за Ñве теме:',
'prefs-reset-intro' => 'Можете кориÑтити ову Ñтраницу да поништите Ñвоје поÑтавке на подразумеване вредноÑти.
Ова радња Ñе не може вратити.',
'prefs-emailconfirm-label' => 'Потврда е-адреÑе:',
@@ -1328,9 +1401,15 @@ $1",
'prefs-advancedrendering' => 'Ðапредне поÑтавке',
'prefs-advancedsearchoptions' => 'Ðапредне поÑтавке',
'prefs-advancedwatchlist' => 'Ðапредне поÑтавке',
-'prefs-display' => 'Опције приказа',
+'prefs-displayrc' => 'ПоÑтавке приказа',
+'prefs-displaysearchoptions' => 'ПоÑтавке приказа',
+'prefs-displaywatchlist' => 'ПоÑтавке приказа',
'prefs-diffs' => 'Разлике',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Е-адреÑа је иÑправна',
+'email-address-validity-invalid' => 'УнеÑите иÑправну е-адреÑу',
+
# User rights
'userrights' => 'Управљање кориÑничким правима',
'userrights-lookup-user' => 'Управљај кориÑничким групама',
@@ -1414,6 +1493,7 @@ $1",
'right-hideuser' => 'блокирање кориÑничког имена и његово Ñакривање од јавноÑти',
'right-ipblock-exempt' => 'заобилажење блокирања IP адреÑе, Ñамоблокирања и блокирања опÑега',
'right-proxyunbannable' => 'заобилажење Ñамоблокирања поÑредника',
+'right-unblockself' => 'деблокирање Ñамог Ñебе',
'right-protect' => 'мењање заштићених Ñтраница и Ñтепена заштите',
'right-editprotected' => 'уређивање заштићених Ñтраница (Ñ Ð¿Ñ€ÐµÐ½Ð¾Ñивом заштитом)',
'right-editinterface' => 'уређивање кориÑничког Ñучеља',
@@ -1436,7 +1516,6 @@ $1",
'right-siteadmin' => 'закључавање и откључавање базе података',
'right-reset-passwords' => 'поништавање туђих лозинки',
'right-override-export-depth' => 'извоз Ñтраница укључујући и повазене Ñтранице до дубине од пет веза',
-'right-versiondetail' => 'Покажи детаљније информације о верзији Ñофтвера',
'right-sendemail' => 'Ñлање е-порука другим кориÑницима',
# User rights log
@@ -1487,14 +1566,9 @@ $1",
'recentchanges-legend' => 'ПоÑтавке Ñкорашњих измена',
'recentchangestext' => 'Пратите Ñкорашње измене на овој Ñтраници.',
'recentchanges-feed-description' => 'Пратите Ñкорашње измене уз помоћ овог довода.',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 - нова Ñтраница',
'recentchanges-label-newpage' => 'Ðова Ñтраница',
-'recentchanges-legend-minor' => '$1 - мала измена',
'recentchanges-label-minor' => 'Мања измена',
-'recentchanges-legend-bot' => '$1 - измена бота',
'recentchanges-label-bot' => 'Ову измену је направио бот',
-'recentchanges-legend-unpatrolled' => '$1 - непатролирана измена',
'recentchanges-label-unpatrolled' => 'Ова измена још увек није прегледана',
'rcnote' => "ИÑпод {{PLURAL:$1|је '''1''' измена|Ñу поÑледње '''$1''' измене|Ñу поÑледњих '''$1''' измена}} {{PLURAL:$2|претходни дан|у поÑледњa '''$2''' дана|у поÑледњих '''$2''' дана}}, од $4; $5.",
'rcnotefrom' => 'ИÑпод Ñу измене од <b>$3; $4</b> (до <b>$1</b> измена).',
@@ -1541,6 +1615,9 @@ $1",
'upload_directory_missing' => 'ФаÑцикла за Ñлање ($1) недоÑтаје и Ñервер је не може направити.',
'upload_directory_read_only' => 'Сервер не може да пише по фаÑцикли за Ñлање ($1).',
'uploaderror' => 'Грешка при Ñлању',
+'upload-recreate-warning' => "'''Упозорење: датотека Ñ Ñ‚Ð¸Ð¼ називом је обриÑана или премештена.'''
+
+ИÑторија бриÑања и премештања Ñе налази иÑпод:",
'uploadtext' => "КориÑтите образац иÑпод да биÑте поÑлали датотеке.
ПоÑтојеће датотеке можете пронаћи у [[Special:FileList|ÑпиÑку поÑлатих датотека]], поновна Ñлања Ñу запиÑана у [[Special:Log/upload|иÑторији Ñлања]], а бриÑања у [[Special:Log/delete|иÑторији бриÑања]].
@@ -1576,6 +1653,17 @@ $1",
'filetype-banned-type' => '„.$1“ је забрањен тип датотеке.
{{PLURAL:$3|Пожељна врÑта датотеке је|Пожељне врÑте датотека Ñу}} $2.',
'filetype-missing' => 'Ова датотека нема екÑтензију.',
+'empty-file' => 'ПоÑлата датотека је празна.',
+'file-too-large' => 'ПоÑлата датотека је превелика.',
+'filename-tooshort' => 'Ðазив датотеке је прекратак.',
+'filetype-banned' => 'Ð’Ñ€Ñта датотеке је забрањена.',
+'verification-error' => 'Ова датотека није прошла проверу.',
+'hookaborted' => 'Измена је одбачена од Ñтране куке проширења.',
+'illegal-filename' => 'Ðазив датотеке је забрањен.',
+'overwrite' => 'Замењивање поÑтојеће датотеке је забрањено.',
+'unknown-error' => 'Дошло је до непознате грешке.',
+'tmp-create-error' => 'Привремена датотека није направљена.',
+'tmp-write-error' => 'Грешка при пиÑању привремене датотеке.',
'large-file' => 'Препоручљиво је да датотеке не буду веће од $1; ова датотека је $2.',
'largefileserver' => 'Ова датотека прелази ограничење величине.',
'emptyfile' => 'Датотека коју Ñте поÑлали је празна.
@@ -1607,13 +1695,14 @@ $1",
'file-exists-duplicate' => 'Ово је дупликат {{PLURAL:$1|Ñледеће датотеке|Ñледећих датотека}}:',
'file-deleted-duplicate' => 'Датотека иÑтоветна овој ([[:$1]]) је претходно обриÑана.
Погледајте иÑторију бриÑања пре поновног Ñлања.',
-'successfulupload' => 'Слање је уÑпело.',
'uploadwarning' => 'Упозорење при Ñлању',
'uploadwarning-text' => 'Измените Ð¾Ð¿Ð¸Ñ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐµ и покушајте поново.',
'savefile' => 'Сачувај датотеку',
'uploadedimage' => '{{GENDER:|је поÑлао|је поÑлала|је поÑлао}} „[[$1]]“',
'overwroteimage' => '{{GENDER:|је поÑлао|је поÑлала|је поÑлао}} ново издање „[[$1]]“',
'uploaddisabled' => 'Слање је онемогућено.',
+'copyuploaddisabled' => 'Слање путем URL адреÑе је онемогућено.',
+'uploadfromurl-queued' => 'Слање је Ñтављено на ÑпиÑак чекања.',
'uploaddisabledtext' => 'Слање је онемогућено.',
'php-uploaddisabledtext' => 'Слање датотека је онемогућено у PHP-у.
Проверите поÑтавке file_uploads.',
@@ -1636,6 +1725,14 @@ $1",
Разлог бриÑања ове датотеке:",
'filename-bad-prefix' => "Ðазив датотеке коју шаљете почиње Ñа '''\"\$1\"''', а њега обично додељују дигитални фотоапарати.
Изаберите назив датотеке који опиÑује њен Ñадржај.",
+'upload-success-subj' => 'УÑпешно Ñлање',
+'upload-success-msg' => 'Датотека из [$2] је поÑлата. ДоÑтупна је овде: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Грешка при Ñлању',
+'upload-failure-msg' => 'Дошло је до проблема при Ñлању из [$2]:
+
+$1',
+'upload-warning-subj' => 'Упозорење при Ñлању',
+'upload-warning-msg' => 'Дошло је до грешке при Ñлању из [$2]. Вратите Ñе на [[Special:Upload/stash/$1|Ñтраницу за Ñлање датотека]] да биÑте решили проблем.',
'upload-proto-error' => 'ÐеиÑправан протокол',
'upload-proto-error-text' => 'Слање Ñа Ñпољне локације захтева адреÑу која почиње Ñа <code>http://</code> или <code>ftp://</code>.',
@@ -1702,6 +1799,7 @@ $1",
'listfiles_search_for' => 'Ðазив датотеке:',
'imgfile' => 'датотека',
'listfiles' => 'СпиÑак датотека',
+'listfiles_thumb' => 'Умањени приказ',
'listfiles_date' => 'Датум',
'listfiles_name' => 'Ðазив',
'listfiles_user' => 'КориÑник',
@@ -1816,8 +1914,8 @@ $1",
'statistics-edits' => 'Број измена Ñтраница откад поÑтоји {{SITENAME}}',
'statistics-edits-average' => 'ПроÑечан број измена по Ñтраници',
'statistics-views-total' => 'Укупно прегледа',
+'statistics-views-total-desc' => 'Прегледи непоÑтојећих и поÑебних Ñтраница ниÑу укључени',
'statistics-views-peredit' => 'Прегледа по измени',
-'statistics-jobqueue' => 'Дужина [http://www.mediawiki.org/wiki/Manual:Job_queue реда за поÑлове]',
'statistics-users' => 'УпиÑани кориÑници ([[Special:ListUsers|ÑпиÑак чланова]])',
'statistics-users-active' => 'Ðктивни кориÑници',
'statistics-users-active-desc' => 'КориÑници који Ñу извршили бар једну радњу {{PLURAL:$1|претходни дан|у поÑледња $1 дана|у поÑледњих $1 дана}}',
@@ -1830,9 +1928,9 @@ $1",
Страница Ñе Ñматра вишезначном одредницом ако кориÑти шаблон који је повезан Ñа ÑпиÑком [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'ДвоÑтрука преуÑмерења',
-'doubleredirectstext' => 'Ова Ñтрана показује ÑпиÑак Ñтрана које преуÑмеравају на друге Ñтране преуÑмерења.
-Сваки ред Ñадржи везе према првом и другом редиректу, као и циљану Ñтрану другог редиректа, која је обично „прави“ чланак, на кога прво преуÑмерење треба да показује.
-<s>Прецртани уноÑи</s> Ñу већ решени.',
+'doubleredirectstext' => 'Ова Ñтраница приказује Ñтранице које преуÑмеравају на друга преуÑмерења.
+Сваки ред Ñадржи везе према првом и другом преуÑмерењу, као и одредишну Ñтраницу другог преуÑмерења која је обично „прави“ чланак на кога прво преуÑмерење треба да упућује.
+<del>Прецртани</del> уноÑи Ñу већ решени.',
'double-redirect-fixed-move' => '[[$1]] је премештен.
Сада је преуÑмерење на [[$2]].',
'double-redirect-fixer' => 'ИÑправљач преуÑмерења',
@@ -1856,6 +1954,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|члан|члана|чланова}}',
'nrevisions' => '$1 {{PLURAL:$1|измена|измене|измена}}',
'nviews' => '$1 {{PLURAL:$1|преглед|прегледа|прегледа}}',
+'nimagelinks' => 'КориÑти Ñе на $1 {{PLURAL:$1|Ñтраници|Ñтранице|Ñтраница}}',
+'ntransclusions' => 'кориÑти Ñе на $1 {{PLURAL:$1|Ñтраници|Ñтранице|Ñтраница}}',
'specialpage-empty' => 'Ðема резултата за овај извештај.',
'lonelypages' => 'Сирочићи',
'lonelypagestext' => 'Следеће Ñтранице ниÑу повезане Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ Ñтраницама, нити Ñу укључене транÑклузијом у друге Ñтранице.',
@@ -1989,7 +2089,7 @@ $1",
'newuserlogpage' => 'ИÑторија отварања налога',
'newuserlogpagetext' => 'Ово је иÑторија нових кориÑника.',
'newuserlog-byemail' => 'лозинка је поÑлата е-поштом',
-'newuserlog-create-entry' => '– нови кориÑник',
+'newuserlog-create-entry' => 'Ðови кориÑник',
'newuserlog-create2-entry' => '{{GENDER:|је отворио|је отворила|је отворио}} налог за $1',
'newuserlog-autocreate-entry' => 'Ðалог је аутоматÑки направљен',
@@ -2013,34 +2113,40 @@ $1",
'listgrouprights-removegroup-self-all' => 'Уклони Ñве групе Ñа Ñвог налога',
# E-mail user
-'mailnologin' => 'Ðема адреÑе за Ñлање',
-'mailnologintext' => 'Морате бити [[Special:UserLogin|пријављени]] и имати иÑправну е-адреÑу у [[Special:Preferences|подешавањима]] да биÑте Ñлали е-поруке другим кориÑницима.',
-'emailuser' => 'Пошаљи е-поруку',
-'emailpage' => 'Слање е-порука',
-'emailpagetext' => 'КориÑтите овај образац да пошаљете е-поруку овом кориÑнику.
+'mailnologin' => 'Ðема адреÑе за Ñлање',
+'mailnologintext' => 'Морате бити [[Special:UserLogin|пријављени]] и имати иÑправну е-адреÑу у [[Special:Preferences|подешавањима]] да биÑте Ñлали е-поруке другим кориÑницима.',
+'emailuser' => 'Пошаљи е-поруку',
+'emailpage' => 'Слање е-порука',
+'emailpagetext' => 'КориÑтите овај образац да пошаљете е-поруку овом кориÑнику.
Е-адреÑа коју Ñте унели у [[Special:Preferences|подешавањима]] ће бити приказана као адреÑа пошиљаоца, тако да ће прималац поруке моћи да вам одговори.',
-'usermailererror' => 'Објекат поште је вратио грешку:',
-'defemailsubject' => '{{SITENAME}} е-пошта',
-'noemailtitle' => 'Ðема е-адреÑе',
-'noemailtext' => 'Овај кориÑник није навео иÑправну е-адреÑу.',
-'nowikiemailtitle' => 'Е-пошта није дозвољена',
-'nowikiemailtext' => 'Овај кориÑник је одлучио да не прима е-поруке од других кориÑника.',
-'email-legend' => 'Слање е-порука другом кориÑнику',
-'emailfrom' => 'Од:',
-'emailto' => 'За:',
-'emailsubject' => 'ÐаÑлов:',
-'emailmessage' => 'Порука:',
-'emailsend' => 'Пошаљи',
-'emailccme' => 'Пошаљи ми примерак поруке е-поштом',
-'emailccsubject' => 'Примерак ваше поруке за $1: $2',
-'emailsent' => 'Порука је поÑлата',
-'emailsenttext' => 'Ваша порука је поÑлата е-поштом.',
-'emailuserfooter' => 'Ову е-поруку је {{GENDER:|поÑлао|поÑлала|поÑлао}} $1 кориÑнику $2 путем е-поште Ñ Ð²Ð¸ÐºÐ¸Ñ˜Ð° {{SITENAME}}.',
+'usermailererror' => 'Објекат поште је вратио грешку:',
+'defemailsubject' => '{{SITENAME}} е-пошта',
+'usermaildisabled' => 'КориÑничка е-пошта је онемогућена',
+'usermaildisabledtext' => 'Ðе можете да шаљете е-поруке другим кориÑницима овог викија',
+'noemailtitle' => 'Ðема е-адреÑе',
+'noemailtext' => 'Овај кориÑник није навео иÑправну е-адреÑу.',
+'nowikiemailtitle' => 'Е-пошта није дозвољена',
+'nowikiemailtext' => 'Овај кориÑник је одлучио да не прима е-поруке од других кориÑника.',
+'email-legend' => 'Слање е-порука другом кориÑнику',
+'emailfrom' => 'Од:',
+'emailto' => 'За:',
+'emailsubject' => 'ÐаÑлов:',
+'emailmessage' => 'Порука:',
+'emailsend' => 'Пошаљи',
+'emailccme' => 'Пошаљи ми примерак поруке е-поштом',
+'emailccsubject' => 'Примерак ваше поруке за $1: $2',
+'emailsent' => 'Порука је поÑлата',
+'emailsenttext' => 'Ваша порука је поÑлата е-поштом.',
+'emailuserfooter' => 'Ову е-поруку је {{GENDER:|поÑлао|поÑлала|поÑлао}} $1 кориÑнику $2 путем е-поште Ñ Ð²Ð¸ÐºÐ¸Ñ˜Ð° {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Слање ÑиÑтемÑке поруке.',
+'usermessage-editor' => 'Уређивач ÑиÑтемÑких порука',
# Watchlist
'watchlist' => 'СпиÑак надгледања',
'mywatchlist' => 'СпиÑак надгледања',
-'watchlistfor' => "(за '''$1''')",
+'watchlistfor2' => 'За $1 $2',
'nowatchlist' => 'Ваш ÑпиÑак надгледања је празан.',
'watchlistanontext' => 'Морате бити $1 да биÑте гледали и уређивали Ñтавке на вашем ÑпиÑку надгледања.',
'watchnologin' => 'ÐиÑте пријављени',
@@ -2087,23 +2193,25 @@ $1",
'enotif_body' => 'Поштовани $WATCHINGUSERNAME,
-Страница $PAGETITLE на викију {{SITENAME}} је $CHANGEDORCREATED дана $PAGEEDITDATE од Ñтране $PAGEEDITOR.
-Погледајте $PAGETITLE_URL за текућу измену.
+Страница $PAGETITLE на викију {{SITENAME}} је $CHANGEDORCREATED дана $PAGEEDITDATE од Ñтране {{GENDER:$PAGEEDITOR|кориÑника|кориÑнице|кориÑника}} $PAGEEDITOR. Погледајте $PAGETITLE_URL за текућу измену.
$NEWPAGE
-Сажетак уредника: $PAGESUMMARY $PAGEMINOREDIT
+Сажетак: $PAGESUMMARY $PAGEMINOREDIT
-Контактирајте уредника:
+Контакт:
е-адреÑа: $PAGEEDITOR_EMAIL
вики: $PAGEEDITOR_WIKI
Ðеће бити других обавештења у Ñлучају даљих измена уколико не поÑетите ову Ñтраницу.
-Можете и поништити поÑтавке обавештења за Ñве Ñтранице у вашем ÑпиÑку надгледања.
+Можете и да поништите поÑтавке обавештења за Ñве Ñтранице у вашем ÑпиÑку надгледања.
- Срдачан поздрав, {{SITENAME}}
+Срдачан поздрав, {{SITENAME}}
--
+Да биÑте променили поÑтавке у вези Ñ Ðµ-обавештењима, поÑетите
+{{fullurl:{{#special:Preferences}}}}
+
Да биÑте променили поÑтавке у вези Ñа ÑпиÑком надгледања, поÑетите
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2162,7 +2270,10 @@ $UNWATCHURL
'revertpage-nouser' => 'Враћене Ñу измене кориÑника (кориÑничко име је уклоњено) на поÑледњу измену члана [[User:$1|$1]]',
'rollback-success' => 'Измене је {{GENDER:|вратио|вратила|вратио}} $1;
враћена је поÑледња измена {{GENDER:$2|кориÑника|кориÑнице|кориÑника}} $2.',
-'sessionfailure' => 'Изгледа да поÑтоји проблем Ñ Ð²Ð°ÑˆÐ¾Ð¼ ÑеÑијом;
+
+# Edit tokens
+'sessionfailure-title' => 'СеÑија је окончана',
+'sessionfailure' => 'Изгледа да поÑтоји проблем Ñ Ð²Ð°ÑˆÐ¾Ð¼ ÑеÑијом;
ова радња је отказана да би Ñе избегла злоупотреба.
Вратите Ñе на претходну Ñтраницу, поново је учитајте и покушајте поново.',
@@ -2299,19 +2410,23 @@ $1',
'month' => 'од меÑеца (и раније):',
'year' => 'од године (и раније):',
-'sp-contributions-newbies' => 'Прикажи Ñамо прилоге нових налога',
-'sp-contributions-newbies-sub' => 'За новајлије',
-'sp-contributions-newbies-title' => 'Прилози кориÑника Ñ Ð½Ð¾Ð²Ð¸Ð¼ налозима',
-'sp-contributions-blocklog' => 'иÑторија блокирања',
-'sp-contributions-deleted' => 'обриÑани прилози',
-'sp-contributions-logs' => 'иÑторије',
-'sp-contributions-talk' => 'разговор',
-'sp-contributions-userrights' => 'подешавање кориÑничких права',
-'sp-contributions-blocked-notice' => 'Овај кориÑник је тренутно блокиран.
+'sp-contributions-newbies' => 'Прикажи Ñамо прилоге нових налога',
+'sp-contributions-newbies-sub' => 'За новајлије',
+'sp-contributions-newbies-title' => 'Прилози кориÑника Ñ Ð½Ð¾Ð²Ð¸Ð¼ налозима',
+'sp-contributions-blocklog' => 'иÑторија блокирања',
+'sp-contributions-deleted' => 'обриÑани прилози',
+'sp-contributions-uploads' => 'Ñлања',
+'sp-contributions-logs' => 'иÑторије',
+'sp-contributions-talk' => 'разговор',
+'sp-contributions-userrights' => 'подешавање кориÑничких права',
+'sp-contributions-blocked-notice' => 'Овај кориÑник је тренутно блокиран.
ПоÑледњи ÑƒÐ½Ð¾Ñ Ñƒ дневник блокирања је понуђен иÑпод као референца:',
-'sp-contributions-search' => 'Претрага прилога',
-'sp-contributions-username' => 'IP адреÑа или кориÑничко име:',
-'sp-contributions-submit' => 'Претражи',
+'sp-contributions-blocked-notice-anon' => 'Овој IP адреÑи је тренутно забрањен приÑтуп.
+Извештај о блокираним кориÑницима Ñе налази иÑпод:',
+'sp-contributions-search' => 'Претрага прилога',
+'sp-contributions-username' => 'IP адреÑа или кориÑничко име:',
+'sp-contributions-toponly' => 'Прикажи Ñамо најновије измене',
+'sp-contributions-submit' => 'Претражи',
# What links here
'whatlinkshere' => 'Шта је повезано овде',
@@ -2375,12 +2490,11 @@ $1',
'ipb-edit-dropdown' => 'Уреди разлоге блокирања',
'ipb-unblock-addr' => 'Деблокирај $1',
'ipb-unblock' => 'Деблокирај кориÑничко име или IP адреÑу',
-'ipb-blocklist-addr' => 'ПоÑтојећи блокови за $1',
'ipb-blocklist' => 'Погледај поÑтојећа блокирања',
'ipb-blocklist-contribs' => 'Прилози за $1',
'unblockip' => 'Деблокирај кориÑника',
'unblockiptext' => 'КориÑтите образац иÑпод да биÑте вратили право пиÑања блокираној IP адреÑи или кориÑничком имену.',
-'ipusubmit' => 'Уклони ово блокирање',
+'ipusubmit' => 'Деблокирај',
'unblocked' => '[[User:$1|$1]] је деблокиран',
'unblocked-id' => 'Блокирање $1 је уклоњено',
'ipblocklist' => 'Блокирани кориÑници',
@@ -2414,7 +2528,7 @@ $1',
'blocklog-showsuppresslog' => '{{GENDER:|Овај кориÑник је раније блокиран и Ñакривен|Ова кориÑница је раније блокирана и Ñакривена|Овај кориÑник је раније блокиран и Ñакривен}}.
ИÑторија Ñакривања Ñе налази иÑпод:',
'blocklogentry' => 'је блокирао „[[$1]]†Ñа временом иÑтицања блокаде од $2 $3',
-'reblock-logentry' => 'промењена подешавања блока за [[$1]] Ñа временом иÑтека $2 ($3)',
+'reblock-logentry' => 'је променио подешавања блока за [[$1]] Ñа временом иÑтека $2 ($3)',
'blocklogtext' => 'Ово је иÑторија блокирања кориÑника.
ÐутоматÑки забрањене IP адреÑе ниÑу иÑпиÑане овде.
Погледајте [[Special:IPBlockList|забрањене IP адреÑе]] за ÑпиÑак тренутних блокова.',
@@ -2450,6 +2564,8 @@ $1 је већ блокиран. Да ли желите да промените
'cant-block-while-blocked' => 'Ðе можете да блокирате друге кориÑнике док Ñте блокирани.',
'cant-see-hidden-user' => 'Члан коме желите да забраните приÑтуп је већ блокиран и Ñакривен.
С обзиром на то да немате права за Ñакривање кориÑника, не можете да видите нити измените забрану.',
+'ipbblocked' => 'Ðе можете забранити или вратити приÑтуп другим кориÑницима јер Ñте и Ñами блокирани',
+'ipbnounblockself' => 'Ðије вам дозвољено да деблокирате Ñебе',
# Developer tools
'lockdb' => 'Закључај базу',
@@ -2491,6 +2607,17 @@ $1 је већ блокиран. Да ли желите да промените
'''Пажња!'''
Ово може предÑтављати драÑтичну и неочекивану измену за популарну Ñтраницу;
добро размиÑлите о поÑледицама пре него што наÑтавите.",
+'movepagetext-noredirectfixer' => "Доњи образац ће преименовати Ñтраницу, премештајући целу иÑторију на ново име.
+Стари наÑлов поÑтаће преуÑмерење на нови наÑлов.
+Погледајте [[Special:DoubleRedirects|двоÑтрука]] или [[Special:BrokenRedirects|неиÑправна]] преуÑмерења.
+Ðа вама је одговорноÑÑ‚ да везе и даље иду тамо где би требало да иду.
+
+Страница '''неће''' бити премештена ако већ поÑтоји Ñтраница Ñ Ñ‚Ð¸Ð¼ именом, оÑим ако је она празна, Ñадржи преуÑмерење или нема иÑторију измена.
+То значи да можете вратити Ñтраницу на претходно меÑто ако погрешите, али не можете заменити поÑтојећу Ñтраницу.
+
+'''Пажња!'''
+Ово може предÑтављати драÑтичну и неочекивану измену за популарну Ñтраницу;
+добро размиÑлите о поÑледицама пре него што наÑтавите.",
'movepagetalktext' => "Одговарајућа Ñтраница за разговор, ако поÑтоји, биће аутоматÑки премештена иÑтовремено '''оÑим ако:'''
*Ðепразна Ñтраница за разговор већ поÑтоји под новим именом, или
*Одбележите доњу кућицу.
@@ -2549,6 +2676,7 @@ $1 је већ блокиран. Да ли желите да промените
'immobile-source-page' => 'Ова Ñтраница Ñе не може премеÑтити.',
'immobile-target-page' => 'Ðе може да Ñе премеÑти на циљани наÑлов.',
'imagenocrossnamespace' => 'Датотека Ñе не може премеÑтити у именÑки проÑтор који не припада датотекама.',
+'nonfile-cannot-move-to-file' => 'Ðе-датотеке не можете премеÑтити у именÑки проÑтор за датотеке',
'imagetypemismatch' => 'Ðови наÑтавак за фајлове Ñе не поклапа Ñа Ñвојим типом.',
'imageinvalidfilename' => 'Циљано име фајла је погрешно.',
'fix-double-redirects' => 'ОÑвежава било које преуÑмерење које веже на оригинални наÑлов',
@@ -2628,6 +2756,7 @@ $1 је већ блокиран. Да ли желите да промените
'importstart' => 'Увожење Ñтраница у току...',
'import-revision-count' => '$1 {{PLURAL:$1|ревизија|ревизије|ревизија}}',
'importnopages' => 'Ðема Ñтраница за увоз.',
+'imported-log-entries' => '{{PLURAL:$1|Увезена је $1 Ñтавка извештаја|Увезене Ñу $1 Ñтавке извештаја|Увезено је $1 Ñтавки извештаја}}.',
'importfailed' => 'Увоз није уÑпео: $1',
'importunknownsource' => 'Ðепознати тип извора уноÑа',
'importcantopen' => 'ÐеуÑпешно отварање фајла за увоз',
@@ -2722,6 +2851,8 @@ $1 је већ блокиран. Да ли желите да промените
'tooltip-upload' => 'Почни Ñлање',
'tooltip-rollback' => '„Врати“ враћа поÑледње измене кориÑника у једном кораку (клику)',
'tooltip-undo' => 'Враћа ову измену и отвара образац за уређивање.',
+'tooltip-preferences-save' => 'Сачувај поÑтавке',
+'tooltip-summary' => 'УнеÑите кратак Ñажетак',
# Stylesheets
'common.css' => '/** CSS Ñтављен овде ће Ñе одноÑити на Ñве коже */',
@@ -2820,14 +2951,17 @@ $1',
'imagemaxsize' => "Ограничење величине Ñлике:<br />''(за Ñтране опиÑа фајлова)''",
'thumbsize' => 'Величина умањеног приказа :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñтраница|Ñтранице|Ñтраница}}',
-'file-info' => '(величина фајла: $1, MIME тип: $2)',
-'file-info-size' => '($1 × $2 пикÑела, величина фајла: $3, MIME тип: $4)',
+'file-info' => 'величина: $1, MIME тип: $2',
+'file-info-size' => '$1×$2 пикÑела, величина: $3, MIME тип: $4',
'file-nohires' => '<small>Ðије доÑтупна већа величина.</small>',
-'svg-long-desc' => '(SVG фајл, номинално $1 × $2 пикÑела, величина фајла: $3)',
+'svg-long-desc' => 'SVG датотека, номинално $1×$2 тачака, величина: $3',
'show-big-image' => 'Пуна величина',
'show-big-image-thumb' => '<small>Величина овог приказа: $1×$2 пикÑела</small>',
'file-info-gif-looped' => 'петља',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадра|кадрова}}',
+'file-info-png-looped' => 'петља',
+'file-info-png-repeat' => 'поновљено $1 {{PLURAL:$1|пут|пута|пута}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадар|кадра|кадрова}}',
# Special:NewFiles
'newimages' => 'Галерија нових Ñлика',
@@ -2987,6 +3121,7 @@ $1',
'exif-gpsareainformation' => 'Име GPS подручја',
'exif-gpsdatestamp' => 'GPS датум',
'exif-gpsdifferential' => 'GPS диференцијална иÑправка',
+'exif-objectname' => 'Кратак наÑлов',
# EXIF attributes
'exif-compression-1' => 'ÐеÑажето',
@@ -3147,29 +3282,29 @@ $1',
'limitall' => 'Ñве',
# E-mail address confirmation
-'confirmemail' => 'Потврда е-адреÑе',
-'confirmemail_noemail' => 'Ðемате потврђену адреÑу ваше е-поште у вашим [[Special:Preferences|кориÑничким подешавањима интерфејÑа]].',
-'confirmemail_text' => '{{SITENAME}} захтева да потврдите е-адреÑу пре него што почнете да кориÑтите могућноÑти е-поште.
+'confirmemail' => 'Потврда е-адреÑе',
+'confirmemail_noemail' => 'Ðемате потврђену адреÑу ваше е-поште у вашим [[Special:Preferences|кориÑничким подешавањима интерфејÑа]].',
+'confirmemail_text' => '{{SITENAME}} захтева да потврдите е-адреÑу пре него што почнете да кориÑтите могућноÑти е-поште.
Кликните на дугме иÑпод за Ñлање поруке на вашу е-адреÑу.
У поруци ће Ñе налазити веза Ñ Ð¿Ð¾Ñ‚Ð²Ñ€Ð´Ð½Ð¸Ð¼ кодом;
унеÑите је у прегледач да биÑте потврдили да је ваша е-адреÑа иÑправна.',
-'confirmemail_pending' => 'Код потврде је већ поÑлат на Вашу е-пошру;
+'confirmemail_pending' => 'Код потврде је већ поÑлат на Вашу е-пошру;
Ðко Ñте Ñкоро направили Ваш налог, вероватно би требало да одчекате неколико минута, како би код Ñтигао, пре него што затражите нови.',
-'confirmemail_send' => 'Пошаљи кôд за потврду',
-'confirmemail_sent' => 'Е-пошта за потврђивање поÑлата.',
-'confirmemail_oncreate' => 'Код за потврду је поÑлат на вашу имејл адреÑу.
+'confirmemail_send' => 'Пошаљи кôд за потврду',
+'confirmemail_sent' => 'Е-пошта за потврђивање поÑлата.',
+'confirmemail_oncreate' => 'Код за потврду је поÑлат на вашу имејл адреÑу.
Овај код није потребан да биÑте Ñе улоговали, али ће од Ð’Ð°Ñ Ð±Ð¸Ñ‚Ð¸ тражено да га приложите да би омогућили погодноÑти Викија везане за коришћење мејлова.',
-'confirmemail_sendfailed' => '{{SITENAME}} није уÑпела да пошање е-пошту.
+'confirmemail_sendfailed' => '{{SITENAME}} није уÑпела да пошање е-пошту.
Проверита адреÑу због неправилних карактера.
Враћено: $1',
-'confirmemail_invalid' => 'Потврдни кôд је неиÑправан. Вероватно је иÑтекао.',
-'confirmemail_needlogin' => 'Морате бити $1 да биÑте потврдили е-адреÑу.',
-'confirmemail_success' => 'ÐдреÑа ваше е-поште је потврђена. Можете Ñада да Ñе пријавите и уживате у викију.',
-'confirmemail_loggedin' => 'ÐдреÑа ваше е-поште је Ñада потврђена.',
-'confirmemail_error' => 'Ðешто је пошло по злу приликом Ñнимања ваше потврде.',
-'confirmemail_subject' => '{{SITENAME}} – потврда е-адреÑе',
-'confirmemail_body' => 'Ðеко Ñа IP адреÑе $1 отвори налог „$2“ на Ñајту {{SITENAME}}, наводећи ову е-адреÑу.
+'confirmemail_invalid' => 'Потврдни кôд је неиÑправан. Вероватно је иÑтекао.',
+'confirmemail_needlogin' => 'Морате бити $1 да биÑте потврдили е-адреÑу.',
+'confirmemail_success' => 'ÐдреÑа ваше е-поште је потврђена. Можете Ñада да Ñе пријавите и уживате у викију.',
+'confirmemail_loggedin' => 'ÐдреÑа ваше е-поште је Ñада потврђена.',
+'confirmemail_error' => 'Ðешто је пошло по злу приликом Ñнимања ваше потврде.',
+'confirmemail_subject' => '{{SITENAME}} – потврда е-адреÑе',
+'confirmemail_body' => 'Ðеко Ñа IP адреÑе $1 отвори налог „$2“ на Ñајту {{SITENAME}}, наводећи ову е-адреÑу.
Да потврдите да овај налог Ñтварно припада вама, као и да
омогућите могућноÑти е-поште, отворите ову везу у прегледачу:
@@ -3182,8 +3317,30 @@ $3
$5
Овај потврдни кôд иÑтиче у $4.',
-'confirmemail_invalidated' => 'Потврда е-поште је отказана',
-'invalidateemail' => 'Отказивање потврде е-поште',
+'confirmemail_body_changed' => 'Ðеко, вероватно ви, Ñа ИП адреÑе $1 је променио е-адреÑу налога „$2“ у ову адреÑу на викију {{SITENAME}}.
+
+Да биÑте потврдили да овај налог Ñтварно припада вама и поново активирали могућноÑти коришћења е-поште на викију {{SITENAME}}, отворите Ñледећу везу у прегледачу:
+
+$3
+
+Ðко налог *не* припада вама, пратите Ñледећу везу да биÑте отказали потврду е-адреÑе:
+
+$5
+
+Овај потврдни кôд иÑтиче $6 у $7.',
+'confirmemail_body_set' => 'Ðеко, вероватно ви, Ñа ИП адреÑе $1 је променио е-адреÑу налога „$2“ у ову адреÑу на викију {{SITENAME}}.
+
+Да биÑте потврдили да овај налог Ñтварно припада вама и поново активирали коришћења е-поште на викију {{SITENAME}}, отворите Ñледећу везу у прегледачу:
+
+$3
+
+Ðко налог *не* припада вама, пратите Ñледећу везу да биÑте отказали потврду е-адреÑе:
+
+$5
+
+Овај потврдни кôд иÑтиче $6 у $7.',
+'confirmemail_invalidated' => 'Потврда е-поште је отказана',
+'invalidateemail' => 'Отказивање потврде е-поште',
# Scary transclusion
'scarytranscludedisabled' => '[Интервики укључивање је онемогућено]',
@@ -3223,6 +3380,7 @@ $1',
'table_pager_first' => 'Прва Ñтраница',
'table_pager_last' => 'ПоÑледња Ñтраница',
'table_pager_limit' => 'Прикажи $1 Ñтавки по Ñтраници',
+'table_pager_limit_label' => 'Ставки по Ñтраници:',
'table_pager_limit_submit' => 'Иди',
'table_pager_empty' => 'Ðема резултата',
@@ -3281,6 +3439,7 @@ $1',
'version-specialpages' => 'ПоÑебне Ñтранице',
'version-parserhooks' => 'Куке рашчлањивача',
'version-variables' => 'Променљиве',
+'version-skins' => 'Теме',
'version-other' => 'ОÑтало',
'version-mediahandlers' => 'Руководиоци медијима',
'version-hooks' => 'Куке',
@@ -3292,6 +3451,13 @@ $1',
'version-hook-subscribedby' => 'Пријављен од',
'version-version' => '(издање $1)',
'version-license' => 'Лиценца',
+'version-poweredby-credits' => "Овај вики покреће '''[http://www.mediawiki.org/ МедијаВики]''', ауторÑка права © 2001–$1 $2.",
+'version-poweredby-others' => 'оÑтали',
+'version-license-info' => 'Медијавики је Ñлободан Ñофтвер; можете га раÑподељивати и мењати под уÑловима ГÐУ-ове опште јавне лиценце (ОЈЛ) коју је објавила Задужбина за Ñлободан Ñофтвер, било да је у питању друго или новије издање лиценце.
+
+Медијавики Ñе раÑподељује у нади да ће бити кориÑтан, али БЕЗ ИКÐКВЕ ГÐРÐÐЦИЈЕ; чак и без имплицитне гаранције о ПРОДÐЈИ или ПОГОДÐОСТИ ЗРОДРЕЂЕÐЕ ÐÐМЕÐЕ. Погледајте ГÐУ-ову општу јавну лиценцу за више детаља.
+
+Требало би да Ñте примили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГÐУ-ове опште јавне лиценце] заједно Ñ Ð¾Ð²Ð¸Ð¼ програмом. Ðко ниÑте, пишите Задужбини за Ñлободан Ñофтвер, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте на мрежи].',
'version-software' => 'ИнÑталиран Ñофтвер',
'version-software-product' => 'Производ',
'version-software-version' => 'Издање',
@@ -3362,6 +3528,15 @@ $1',
'tags-edit' => 'уреди',
'tags-hitcount' => '$1 {{PLURAL:$1|измена|измене|измена}}',
+# Special:ComparePages
+'comparepages' => 'Упоређивање Ñтраница',
+'compare-selector' => 'Упоређивање измена Ñтранице',
+'compare-page1' => 'Страна 1:',
+'compare-page2' => 'Страна 2:',
+'compare-rev1' => 'Ревизија 1:',
+'compare-rev2' => 'Ревизија 2:',
+'compare-submit' => 'Упореди',
+
# Database error messages
'dberr-header' => 'Овај вики има проблем',
'dberr-problems' => 'Дошло је до техничких проблема.',
@@ -3378,8 +3553,13 @@ $1',
'htmlform-float-invalid' => 'Ðаведена вредноÑÑ‚ није број.',
'htmlform-int-toolow' => 'Ðаведена вредноÑÑ‚ је иÑпод минимума од $1',
'htmlform-int-toohigh' => 'Ðаведена вредноÑÑ‚ је изнад макÑимума од $1',
+'htmlform-required' => 'Ова вредноÑÑ‚ Ñе мора навеÑти',
'htmlform-submit' => 'Пошаљи',
'htmlform-reset' => 'Врати измене',
'htmlform-selectorother-other' => 'Друго',
+# SQLite database support
+'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ñ€ÑˆÐºÐ¾Ð¼ претраге пуног текÑта',
+'sqlite-no-fts' => '$1 без подршке претраге пуног текÑта',
+
);
diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php
index d9426460..79b7d2fd 100644
--- a/languages/messages/MessagesSr_el.php
+++ b/languages/messages/MessagesSr_el.php
@@ -39,7 +39,7 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Razgovor_o_kategoriji',
);
-# Aliases to cyrillic namespaces
+# Aliases to cyrillic namespaces
$namespaceAliases = array(
"Медија" => NS_MEDIA,
"ПоÑебно" => NS_SPECIAL,
@@ -114,7 +114,7 @@ $dateFormats = array(
'6:12, 5. јан 2001.',
'6:12, 5 јан 2001',
*/
-
+
'hh:mm d. month y. time' => 'H:i',
'hh:mm d month y time' => 'H:i',
'hh:mm dd.mm.yyyy time' => 'H:i',
@@ -129,30 +129,30 @@ $dateFormats = array(
'h:mm d mon y time' => 'G:i',
'hh:mm d. month y. date' => 'j. F Y.',
- 'hh:mm d month y date' => 'j F Y',
- 'hh:mm dd.mm.yyyy date' => 'd.m.Y',
- 'hh:mm d.m.yyyy date' => 'j.n.Y',
+ 'hh:mm d month y date' => 'j F Y',
+ 'hh:mm dd.mm.yyyy date' => 'd.m.Y',
+ 'hh:mm d.m.yyyy date' => 'j.n.Y',
'hh:mm d. mon y. date' => 'j. M Y.',
- 'hh:mm d mon y date' => 'j M Y',
+ 'hh:mm d mon y date' => 'j M Y',
'h:mm d. month y. date' => 'j. F Y.',
- 'h:mm d month y date' => 'j F Y',
- 'h:mm dd.mm.yyyy date' => 'd.m.Y',
- 'h:mm d.m.yyyy date' => 'j.n.Y',
+ 'h:mm d month y date' => 'j F Y',
+ 'h:mm dd.mm.yyyy date' => 'd.m.Y',
+ 'h:mm d.m.yyyy date' => 'j.n.Y',
'h:mm d. mon y. date' => 'j. M Y.',
- 'h:mm d mon y date' => 'j M Y',
-
- 'hh:mm d. month y. both' =>'H:i, j. F Y.',
- 'hh:mm d month y both' =>'H:i, j F Y',
- 'hh:mm dd.mm.yyyy both' =>'H:i, d.m.Y',
- 'hh:mm d.m.yyyy both' =>'H:i, j.n.Y',
- 'hh:mm d. mon y. both' =>'H:i, j. M Y.',
- 'hh:mm d mon y both' =>'H:i, j M Y',
- 'h:mm d. month y. both' =>'G:i, j. F Y.',
- 'h:mm d month y both' =>'G:i, j F Y',
- 'h:mm dd.mm.yyyy both' =>'G:i, d.m.Y',
- 'h:mm d.m.yyyy both' =>'G:i, j.n.Y',
- 'h:mm d. mon y. both' =>'G:i, j. M Y.',
- 'h:mm d mon y both' =>'G:i, j M Y',
+ 'h:mm d mon y date' => 'j M Y',
+
+ 'hh:mm d. month y. both' => 'H:i, j. F Y.',
+ 'hh:mm d month y both' => 'H:i, j F Y',
+ 'hh:mm dd.mm.yyyy both' => 'H:i, d.m.Y',
+ 'hh:mm d.m.yyyy both' => 'H:i, j.n.Y',
+ 'hh:mm d. mon y. both' => 'H:i, j. M Y.',
+ 'hh:mm d mon y both' => 'H:i, j M Y',
+ 'h:mm d. month y. both' => 'G:i, j. F Y.',
+ 'h:mm d month y both' => 'G:i, j F Y',
+ 'h:mm dd.mm.yyyy both' => 'G:i, d.m.Y',
+ 'h:mm d.m.yyyy both' => 'G:i, j.n.Y',
+ 'h:mm d. mon y. both' => 'G:i, j. M Y.',
+ 'h:mm d mon y both' => 'G:i, j M Y',
);
@@ -209,7 +209,7 @@ $magicWords = array(
'ucfirst' => array( '0', 'UCPRVI:', 'UCFIRST:' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -227,8 +227,7 @@ $messages = array(
'tog-editsection' => 'Omogući izmenu delova [uredi] vezama',
'tog-editsectiononrightclick' => 'Omogući izmenu delova desnim klikom<br />na njihove naslove (zahteva JavaScript)',
'tog-showtoc' => 'Prikaži sadržaj (u Älancima sa viÅ¡e od 3 podnaslova)',
-'tog-rememberpassword' => 'Pamti lozinku kroz više seansi',
-'tog-editwidth' => 'Raširi polje za izmene preko celog ekrana',
+'tog-rememberpassword' => 'Zapamti moju lozinku na ovom raÄunaru (najviÅ¡e $1 {{PLURAL:$1|dan|dana}})',
'tog-watchcreations' => 'Dodaj stranice koje pravim u moj spisak nadgledanja',
'tog-watchdefault' => 'Dodaj stranice koje menjam u moj spisak nadgledanja',
'tog-watchmoves' => 'Dodaj stranice koje premeštam u moj spisak nadgledanja',
@@ -373,31 +372,20 @@ $messages = array(
'faqpage' => 'Project:NPP',
# Vector skin
-'vector-action-addsection' => '+',
-'vector-action-delete' => 'Obriši',
-'vector-action-move' => 'Premesti',
-'vector-action-protect' => 'Zaštiti',
-'vector-action-undelete' => 'Vrati',
-'vector-action-unprotect' => 'Skini zaštitu',
-'vector-namespace-category' => 'Kategorija',
-'vector-namespace-help' => 'Strana pomoći',
-'vector-namespace-image' => 'Datoteka',
-'vector-namespace-main' => 'Strana',
-'vector-namespace-media' => 'Stranica medija',
-'vector-namespace-mediawiki' => 'Poruka',
-'vector-namespace-project' => 'Projekat',
-'vector-namespace-special' => 'Posebna stranica',
-'vector-namespace-talk' => 'Razgovor',
-'vector-namespace-template' => 'Å ablon',
-'vector-namespace-user' => 'Korisnik',
-'vector-view-create' => 'Napravi',
-'vector-view-edit' => 'Uredi',
-'vector-view-history' => 'Istorija',
-'vector-view-view' => 'ÄŒitaj',
-'vector-view-viewsource' => 'Izvornik',
-'actions' => 'Akcije',
-'namespaces' => 'Imenski prostori',
-'variants' => 'Varijante',
+'vector-action-addsection' => '+',
+'vector-action-delete' => 'Obriši',
+'vector-action-move' => 'Premesti',
+'vector-action-protect' => 'Zaštiti',
+'vector-action-undelete' => 'Vrati',
+'vector-action-unprotect' => 'Skini zaštitu',
+'vector-view-create' => 'Napravi',
+'vector-view-edit' => 'Uredi',
+'vector-view-history' => 'Istorija',
+'vector-view-view' => 'ÄŒitaj',
+'vector-view-viewsource' => 'Izvornik',
+'actions' => 'Akcije',
+'namespaces' => 'Imenski prostori',
+'variants' => 'Varijante',
'errorpagetitle' => 'Greška',
'returnto' => 'Povratak na $1.',
@@ -628,7 +616,7 @@ Ne zaboravite da prilagodite svoja [[Special:Preferences|podešavanja]].',
'yourname' => 'KorisniÄko ime',
'yourpassword' => 'Lozinka:',
'yourpasswordagain' => 'Ponovite lozinku',
-'remembermypassword' => 'Zapamti me',
+'remembermypassword' => 'Zapamti moju lozinku na ovom raÄunaru (najviÅ¡e $1 {{PLURAL:$1|dan|dana}})',
'yourdomainname' => 'Domen:',
'externaldberror' => 'Došlo je ili do greške pri spoljašnjoj autentifikaciji baze podataka ili vam nije dozvoljeno da ažurirate svoj spoljašnji nalog.',
'login' => 'Prijavi me',
@@ -645,6 +633,7 @@ Ne zaboravite da prilagodite svoja [[Special:Preferences|podešavanja]].',
'gotaccount' => "Imate nalog? Idite na stranicu ''$1''.",
'gotaccountlink' => 'Prijavi me',
'createaccountmail' => 'E-poštom',
+'createaccountreason' => 'Razlog:',
'badretype' => 'Lozinke koje ste uneli se ne poklapaju.',
'userexists' => 'KorisniÄko ime koje ste uneli već je u upotrebi.
Molimo izaberite drugo ime.',
@@ -665,6 +654,7 @@ Proverite da li ste ga dobro ukucali, ili [[Special:UserLogin/signup|napravite n
'wrongpasswordempty' => 'Lozinka koju ste uneli je prazna. Molimo pokušajte ponovo.',
'passwordtooshort' => 'Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka/znakova}}.',
'password-name-match' => 'VaÅ¡a lozinka mora biti drugaÄija od vaÅ¡eg korisniÄkog imena.',
+'password-login-forbidden' => 'Korišćenje ovog naloga je zabranjeno.',
'mailmypassword' => 'Pošalji mi novu lozinku',
'passwordremindertitle' => '{{SITENAME}} podsetnik za Å¡ifru',
'passwordremindertext' => 'Neko (verovatno vi, sa IP adrese $1) je zahtevao da vam pošaljemo novu
@@ -759,9 +749,11 @@ Možda ste već uspešno promenili lozinku ili zatražili novu privremenu.',
'showdiff' => 'Prikaži promene',
'anoneditwarning' => "'''Pažnja:''' Niste prijavljeni.
Vaša IP adresa će biti zabeležena u istoriji ove stranice.",
+'anonpreviewwarning' => "''Niste prijavljeni. Čuvanje će postaviti Vašu IP adresu u stranici za uređivanje.''",
'missingsummary' => "'''Podsetnik:''' Niste uneli opis izmene. Ukoliko kliknete Snimi stranicu ponovo, vaše izmene će biti snimljene bez opisa.",
'missingcommenttext' => 'Molimo unestite komentar ispod.',
-'missingcommentheader' => "'''Podsetnik:''' Niste naveli naslov ovog komentara. Ukoliko kliknete ''Snimi ponovo'', vaš komentar će biti snimljen bez naslova.",
+'missingcommentheader' => "'''Podsetnik:''' Niste naveli naslov za ovaj komentar.
+Ako opet kliknete \"{{int:savearticle}}\", Vaš komentar će biti snimljen bez njega.",
'summary-preview' => 'Pretpregled opisa izmene:',
'subject-preview' => 'Pretpregled predmeta/odeljka:',
'blockedtitle' => 'Korisnik je blokiran',
@@ -830,7 +822,7 @@ Podaci o poslednjem blokiranju su priloženi ispod kao dodatna informacija:',
'userjsyoucanpreview' => "'''Savet:''' Korisitite dugme \"{{int:showpreview}}\" da biste testirali svoj novi JavaScript pre snimanja.",
'usercsspreview' => "'''Zapamtite ovo je samo pretpregled vašeg CSS, još uvek nije snimljen!'''",
'userjspreview' => "'''Zapamtite ovo je samo pretpregled vaše JavaScript-e i da još uvek nije snimljen!'''",
-'userinvalidcssjstitle' => "'''Pažnja:''' Ne postoji koža \"\$1\". Zapamtite da liÄne .css i .js koriste mala poÄetna slova, npr. {{ns:user}}:Petar/monobook.css a ne {{ns:user}}:Petar/Monobook.css.",
+'userinvalidcssjstitle' => "'''Pažnja:''' Ne postoji koža \"\$1\". Zapamtite da liÄne .css i .js koriste mala poÄetna slova, npr. {{ns:user}}:Petar/vector.css a ne {{ns:user}}:Petar/Vector.css.",
'updated' => '(Ažurirano)',
'note' => "'''Napomena:'''",
'previewnote' => "'''Ovo samo pretpregled; izmene joÅ¡ nisu saÄuvane!'''",
@@ -864,7 +856,6 @@ Takođe nam obećavate da ste ovo sami napisali ili prekopirali iz izvora u javn
'copyrightwarning2' => "Napomena: Sve vaše doprinose ostali korisnici mogu da menjaju ili uklone. Ako ne želite da se vaši doprinosi nemilosrdno menjaju, ne šaljite ih ovde.<br />
TakoÄ‘e nam obećavate da ste ovo sami napisali ili prekopirali iz izvora u javnom vlasniÅ¡tvu ili sliÄnog slobodnog izvora (vidite $1 za detalje).
'''NE ŠALJITE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOZVOLE!'''",
-'longpagewarning' => "'''PAŽNJA: Ova stranica ima $1 kilobajta; neki brauzeri imaju problema sa uređivanjem stranica koje imaju blizu ili više od 32 kilobajta. Molimo vas da razmotrite razbijanje stranice na manje delove.'''",
'longpageerror' => "'''GREÅ KA: Tekst koji snimate je velik $1 kilobajta, Å¡to je veće od maksimalno dozvoljene veliÄine koja iznosi $2 kilobajta. Nemoguće je snimiti stranicu.'''",
'readonlywarning' => "'''PAŽNJA: Baza je upravo zakljuÄana zbog održavanja, tako da sada nećete moći da snimite svoje izmene.
Možda bi bilo dobro da iskopirate tekst u neki editor teksta i saÄuvate za kasnije.'''
@@ -1023,6 +1014,8 @@ Drugi administratori na {{SITENAME}} će još uvek imati pristup ovom skrivenom
$1",
'logdelete-success' => "'''Vidnost loga je uspešno podešena.'''",
'revdel-restore' => 'Promena vidnosti',
+'revdel-restore-deleted' => 'izbrisane revizije',
+'revdel-restore-visible' => 'vidljive revizije',
'pagehist' => 'Istorija stranice',
'deletedhist' => 'Obrisana istorija',
'revdelete-content' => 'sadržaj',
@@ -1078,6 +1071,7 @@ $1",
# Diffs
'history-title' => 'Istorija izmena za „$1â€',
'difference' => '(Razlika između revizija)',
+'difference-multipage' => '(razlike između stranica)',
'lineno' => 'Linija $1:',
'compareselectedversions' => 'Uporedi oznaÄene verzije',
'showhideselectedversions' => 'Prikaži/sakrij odabrane revizije',
@@ -1256,7 +1250,7 @@ TakoÄ‘e možete podesiti da drugi mogu da vas kontaktiraju preko vaÅ¡e korisniÄ
'prefs-advancedrendering' => 'Napredne opcije',
'prefs-advancedsearchoptions' => 'Napredne opcije',
'prefs-advancedwatchlist' => 'Napredne opcije',
-'prefs-display' => 'Opcije prikaza',
+'prefs-displayrc' => 'Opcije prikaza',
'prefs-diffs' => 'Revizije',
# User rights
@@ -1413,14 +1407,9 @@ TakoÄ‘e možete podesiti da drugi mogu da vas kontaktiraju preko vaÅ¡e korisniÄ
'recentchanges-legend' => 'Podešavanja skorašnjih izmena',
'recentchangestext' => 'Ovde pratite najskorije izmene na vikiju.',
'recentchanges-feed-description' => 'Pratite skorašnje izmene uz pomoć ovog fida.',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - nova stranica',
'recentchanges-label-newpage' => 'Ovom izmenom je napravljena nova strana.',
-'recentchanges-legend-minor' => '$1 - mala izmena',
'recentchanges-label-minor' => 'Ovo je mala izmena',
-'recentchanges-legend-bot' => '$1 - izmena bota',
'recentchanges-label-bot' => 'Ovu izmenu je napravio bot',
-'recentchanges-legend-unpatrolled' => '$1 - nepatrolirana izmena',
'recentchanges-label-unpatrolled' => 'Ova izmena još uvek nije patrolirana',
'rcnote' => "Ispod {{PLURAL:$1|je '''1''' promena|su poslednje '''$1''' promene|su poslednjih '''$1''' promena}} u {{PLURAL:$2|poslednjem danu|poslednja '''$2''' dana|poslednjih '''$2''' dana}}, od $5, $4.",
'rcnotefrom' => 'Ispod su promene od <b>$2</b> (do <b>$1</b> prikazano).',
@@ -1500,6 +1489,7 @@ Poželjni {{PLURAL:\$3|tip fajla je|tipovi fajlova su}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' je zabranjen tip fajla.
Poželjni {{PLURAL:\$3|tip fajla je|tipovi fajlova su}} \$2.",
'filetype-missing' => 'Ovaj fajl nema ekstenziju (npr ".jpg").',
+'filename-tooshort' => 'Ime fajla je prekratko.',
'large-file' => 'PreporuÄljivo je da fajlovi ne budu veći od $1; ovaj fajl je $2.',
'largefileserver' => 'Ovaj fajl je veći nego što je podešeno da server dozvoli.',
'emptyfile' => 'Fajl koji ste poslali deluje da je prazan. Ovo je moguće zbog greške u imenu fajla. Molimo proverite da li stvarno želite da pošaljete ovaj fajl.',
@@ -1527,7 +1517,6 @@ Molimo vratite se i pošaljite ovaj fajl pod novim imenom. [[File:$1|thumb|cente
'file-exists-duplicate' => 'Ovaj fajl je duplikat {{PLURAL:$1|sledećeg fajla|sledeđih fajlova}}:',
'file-deleted-duplicate' => 'Fajl identiÄan ovom ([[:$1]]) je već bio obrisan.
Trebalo bi da proverite istoriju brisanja fajla pre ponovnog slanja.',
-'successfulupload' => 'Uspešno slanje',
'uploadwarning' => 'Upozorenje pri slanju',
'uploadwarning-text' => 'Molimo Vas da izmenite opis fajla ispod i pokušate ponovo.',
'savefile' => 'Snimi fajl',
@@ -1553,6 +1542,9 @@ Molimo, proverite podešavanja file_uploads.',
Razmislite da li ste sigurni da želite poslati ovaj fajl.
Razlog brisanja ovog fajla ranije je:",
'filename-bad-prefix' => "Ime ovog fajla poÄinje sa '''\"\$1\"''', Å¡to nije opisno ime, najÄešće je nazvan automatski sa digitalnim fotoaparatom. Molimo izaberite opisnije ime za vaÅ¡ fajl.",
+'upload-success-subj' => 'Uspešno slanje',
+'upload-failure-subj' => 'Greška pri slanju',
+'upload-warning-subj' => 'Upozorenje pri slanju',
'upload-proto-error' => 'Nekorektni protokol',
'upload-proto-error-text' => 'Slanje eksternih fajlova zahteva URLove koji poÄinju sa <code>http://</code> ili <code>ftp://</code>.',
@@ -1704,7 +1696,6 @@ Ne zaboravite da proverite ostale poveznice ka Å¡ablonima pre nego Å¡to ih obriÅ
'statistics-edits-average' => 'ProseÄan broj izmena po stranici',
'statistics-views-total' => 'Ukupan broj pregleda',
'statistics-views-peredit' => 'Pregledi po izmeni',
-'statistics-jobqueue' => 'Dužina [<a href="http://www.mediawiki.org/wiki/Manual:Job_queue">http://www.mediawiki.org/wiki/Manual:Job_queue</a> reda za poslove]',
'statistics-users' => 'Registrovani [[Special:ListUsers|korisnici]]',
'statistics-users-active' => 'Aktivni korisnici',
'statistics-users-active-desc' => 'Korisnici koji su izvršili makar jednu akciju tokom {{PLURAL:$1|zadnjeg dana|$1 zadnjih dana}}',
@@ -1717,9 +1708,9 @@ Ne zaboravite da proverite ostale poveznice ka Å¡ablonima pre nego Å¡to ih obriÅ
Stranica se smatra viÅ¡eznaÄnom odrednicom ako koristi Å¡ablon koji je upućen sa stranice [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'Dvostruka preusmerenja',
-'doubleredirectstext' => 'Ova strana pokazuje spisak strana koje preusmeravaju na druge strane preusmerenja.
-Svaki red sadrži veze prema prvom i drugom redirektu, kao i ciljanu stranu drugog redirekta, koja je obiÄno „pravi“ Älanak, na koga prvo preusmerenje treba da pokazuje.
-<s>Precrtani unosi</s> su već rešeni.',
+'doubleredirectstext' => 'Ova stranica pokazuje spisak stranica koje preusmeravaju na druge stranice preusmerenja.
+Svaki red sadrži veze prema prvom i drugom preusmerenju, kao i ciljanu stranicu drugog preusmerenja, koja je obiÄno „pravi“ Älanak, na koga prvo preusmerenje treba da pokazuje.
+<del>Precrtani unosi</del> su već rešeni.',
'double-redirect-fixed-move' => '[[$1]] je premešten, sada je preusmerenje na [[$2]]',
'double-redirect-fixer' => 'PopravljaÄ preusmerenja',
@@ -1897,35 +1888,36 @@ Mogle bi Vas interesovati [[{{MediaWiki:Listgrouprights-helppage}}|dodatne infor
'listgrouprights-removegroup-self-all' => 'Ukloni sve grupe sa svog naloga',
# E-mail user
-'mailnologin' => 'Nema adrese za slanje',
-'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]
+'mailnologin' => 'Nema adrese za slanje',
+'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]
da biste slali e-poštu drugim korisnicima.',
-'emailuser' => 'Pošalji e-poštu ovom korisniku',
-'emailpage' => 'Pošalji e-pismo korisniku',
-'emailpagetext' => 'Možete koristiti ovaj formular da pošaljete e-poštu ovom korisniku.
+'emailuser' => 'Pošalji e-poštu ovom korisniku',
+'emailpage' => 'Pošalji e-pismo korisniku',
+'emailpagetext' => 'Možete koristiti ovaj formular da pošaljete e-poštu ovom korisniku.
Adresa e-poÅ¡te koju ste vi uneli u svojim [[Special:Preferences|korisniÄkim podeÅ¡avanjima]] će se pojaviti kao "From" adresa poruke, tako da će primalac moći direktno da Vam odgovori.',
-'usermailererror' => 'Objekat pošte je vratio grešku:',
-'defemailsubject' => '{{SITENAME}} e-pošta',
-'noemailtitle' => 'Nema adrese e-pošte',
-'noemailtext' => 'Ovaj korisnik nije naveo ispravnu adresu e-pošte.',
-'nowikiemailtitle' => 'Nije omogućeno slanje mejlova',
-'nowikiemailtext' => 'Ovaj korisnik je onemogućio slanje imejlova od drugih korisnika.',
-'email-legend' => 'Pošaljite mejl drugom korisniku na {{SITENAME}}',
-'emailfrom' => 'Od:',
-'emailto' => 'Za:',
-'emailsubject' => 'Naslov:',
-'emailmessage' => 'Poruka:',
-'emailsend' => 'Pošalji',
-'emailccme' => 'PoÅ¡alji mi kopiju moje poruke u moje sanduÄe e-poÅ¡te.',
-'emailccsubject' => 'Kopija vaše poruke na $1: $2',
-'emailsent' => 'Poruka poslata',
-'emailsenttext' => 'Vaša poruka je poslata elektronskom poštom.',
-'emailuserfooter' => 'Ovaj imejl posla $1 saradniku $2 pomoću "Pošalji imejl" funkcije na sajtu "{{SITENAME}}".',
+'usermailererror' => 'Objekat pošte je vratio grešku:',
+'defemailsubject' => '{{SITENAME}} e-pošta',
+'usermaildisabled' => 'Korisnikova e-pošta je onemogućena',
+'usermaildisabledtext' => 'Ne možete da šaljete e-poruke drugim korisnicima ovog vikija',
+'noemailtitle' => 'Nema adrese e-pošte',
+'noemailtext' => 'Ovaj korisnik nije naveo ispravnu adresu e-pošte.',
+'nowikiemailtitle' => 'Nije omogućeno slanje mejlova',
+'nowikiemailtext' => 'Ovaj korisnik je onemogućio slanje imejlova od drugih korisnika.',
+'email-legend' => 'Pošaljite mejl drugom korisniku na {{SITENAME}}',
+'emailfrom' => 'Od:',
+'emailto' => 'Za:',
+'emailsubject' => 'Naslov:',
+'emailmessage' => 'Poruka:',
+'emailsend' => 'Pošalji',
+'emailccme' => 'PoÅ¡alji mi kopiju moje poruke u moje sanduÄe e-poÅ¡te.',
+'emailccsubject' => 'Kopija vaše poruke na $1: $2',
+'emailsent' => 'Poruka poslata',
+'emailsenttext' => 'Vaša poruka je poslata elektronskom poštom.',
+'emailuserfooter' => 'Ovaj imejl posla $1 saradniku $2 pomoću "Pošalji imejl" funkcije na sajtu "{{SITENAME}}".',
# Watchlist
'watchlist' => 'Spisak nadgledanja',
'mywatchlist' => 'Spisak nadgledanja',
-'watchlistfor' => "(za '''$1''')",
'nowatchlist' => 'Nemate ništa na svom spisku nadgledanja.',
'watchlistanontext' => 'Morate biti $1 da biste gledali ili menjali stavke na vašem spisku nadgledanja.',
'watchnologin' => 'Niste prijavljeni',
@@ -2049,7 +2041,9 @@ Poslednja izmena od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pip
'editcomment' => "Komentar izmene je: \"''\$1''\".",
'revertpage' => 'Vraćene izmene od [[{{ns:special}}:Contributions/$2|$2]] ([[User_talk:$2|razgovor]]) na poslednju izmenu od korisnika [[User:$1|$1]]',
'rollback-success' => 'Vraćene izmene od strane $1; na poslednju izmenu od strane $2.',
-'sessionfailure' => 'Izgleda da postoji problem sa vašom seansom prijave;
+
+# Edit tokens
+'sessionfailure' => 'Izgleda da postoji problem sa vašom seansom prijave;
ova akcija je prekinuta kao predostrožnost protiv preotimanja seansi.
Molimo kliknite "back" i ponovo uÄitajte stranu odakle ste doÅ¡li, a onda pokuÅ¡ajte ponovo.',
@@ -2185,6 +2179,7 @@ $1',
'sp-contributions-newbies-title' => 'Doprinosi korisnika sa novim nalozima',
'sp-contributions-blocklog' => 'istorija blokiranja',
'sp-contributions-deleted' => 'obrisane izmene korisnika',
+'sp-contributions-uploads' => 'slanja',
'sp-contributions-logs' => 'istorije',
'sp-contributions-talk' => 'razgovor',
'sp-contributions-userrights' => 'podeÅ¡avanje korisniÄkih prava',
@@ -2256,13 +2251,12 @@ stranice su vandalizovane).',
'ipb-edit-dropdown' => 'Menjajte razloge bloka',
'ipb-unblock-addr' => 'Deblokiraj $1',
'ipb-unblock' => 'Deblokiraj korisniÄko ime ili IP adresu',
-'ipb-blocklist-addr' => 'Postojeći blokovi za $1',
'ipb-blocklist' => 'Pogledajte postojeće blokove',
'ipb-blocklist-contribs' => 'Doprinosi za $1',
'unblockip' => 'Deblokiraj korisnika',
'unblockiptext' => 'Upotrebite donji upitnik da biste vratili pravo pisanja
ranije blokiranoj IP adresi ili korisniÄkom imenu.',
-'ipusubmit' => 'Ukloni ovaj blok',
+'ipusubmit' => 'Deblokiraj',
'unblocked' => '[[User:$1|$1]] je deblokiran',
'unblocked-id' => 'Blok $1 je uklonjen',
'ipblocklist' => 'Blokirane IP adrese i korisniÄka imena',
@@ -2293,7 +2287,7 @@ ranije blokiranoj IP adresi ili korisniÄkom imenu.',
'blocklog-showlog' => 'Ovaj korisnik je već bio blokiran.
Dnevnik blokiranja je ponuđen ispod kao referenca:',
'blocklogentry' => 'je blokirao „[[$1]]†sa vremenom isticanja blokade od $2 $3',
-'reblock-logentry' => 'promenjena podešavanja bloka za [[$1]] sa vremenom isteka $2 ($3)',
+'reblock-logentry' => 'je promenio podešavanja bloka za [[$1]] sa vremenom isteka $2 ($3)',
'blocklogtext' => 'Ovo je istorija blokiranja korisnika.
Automatski zabranjene IP adrese nisu ispisane ovde.
Pogledajte [[Special:IPBlockList|zabranjene IP adrese]] za spisak trenutnih blokova.',
@@ -2302,7 +2296,7 @@ Pogledajte [[Special:IPBlockList|zabranjene IP adrese]] za spisak trenutnih blok
'block-log-flags-nocreate' => 'onemogućeno otvaranje naloga',
'block-log-flags-noautoblock' => 'iskljuÄeno automatsko blokiranje',
'block-log-flags-noemail' => 'zabranjena e-pošta',
-'block-log-flags-nousertalk' => 'ne može da izmeni sopstvenu stranu za razgovor',
+'block-log-flags-nousertalk' => 'zabranjeno uređivanje sopstvene stranice za razgovor',
'block-log-flags-angry-autoblock' => 'omogućen je poboljšani autoblok',
'block-log-flags-hiddenname' => 'korisniÄko ime sakriveno',
'range_block_disabled' => 'Administratorska mogućnost da blokira blokove IP adresa je iskljuÄena.',
@@ -2699,10 +2693,10 @@ Njegovim izvršavanjem biste mogli da oštetite Vaš sistem.",
'imagemaxsize' => "OgraniÄenje veliÄine slike:<br />''(za strane opisa fajlova)''",
'thumbsize' => 'VeliÄina umanjenog prikaza :',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|stranica|stranice|stranica}}',
-'file-info' => '(veliÄina fajla: $1, MIME tip: $2)',
-'file-info-size' => '($1 × $2 piksela, veliÄina fajla: $3, MIME tip: $4)',
+'file-info' => 'veliÄina fajla: $1, MIME tip: $2',
+'file-info-size' => '$1 × $2 piksela, veliÄina fajla: $3, MIME tip: $4',
'file-nohires' => '<small>Nije dostupna veća rezolucija</small>',
-'svg-long-desc' => '(SVG fajl, nominalno $1 × $2 piksela, veliÄina fajla: $3)',
+'svg-long-desc' => 'SVG fajl, nominalno $1 × $2 piksela, veliÄina fajla: $3',
'show-big-image' => 'Puna rezolucija',
'show-big-image-thumb' => '<small>VeliÄina ovog prikaza: $1 × $2 piksela</small>',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frejm|frejmova}}',
@@ -3234,6 +3228,14 @@ Unesite ime fajla bez prefiksa "{{ns:file}}:".',
'tags-edit' => 'uredi',
'tags-hitcount' => '$1 {{PLURAL:$1|izmena|izmena}}',
+# Special:ComparePages
+'comparepages' => 'Uporedi strane',
+'compare-selector' => 'Upoređivanje izmena stranice',
+'compare-page1' => 'Strana 1',
+'compare-page2' => 'Strana 2',
+'compare-rev2' => 'Revizija 2',
+'compare-submit' => 'Uporedi',
+
# Database error messages
'dberr-header' => 'Ovaj viki ima problem',
'dberr-problems' => 'Žao nam je! Ovaj sajt ima tehniÄkih poteÅ¡koća.',
@@ -3250,6 +3252,7 @@ Unesite ime fajla bez prefiksa "{{ns:file}}:".',
'htmlform-float-invalid' => 'Vrednost koju ste zadali nije broj.',
'htmlform-int-toolow' => 'Vrednosti koju ste naveli je ispod minimuma od $1',
'htmlform-int-toohigh' => 'Vrednost koju ste naveli je iznad maksimuma od $1',
+'htmlform-required' => 'Ova vrednost se mora navesti',
'htmlform-submit' => 'Pošalji',
'htmlform-reset' => 'Vrati izmene',
'htmlform-selectorother-other' => 'Drugo',
diff --git a/languages/messages/MessagesSrn.php b/languages/messages/MessagesSrn.php
index fb4c24e6..33ccb266 100644
--- a/languages/messages/MessagesSrn.php
+++ b/languages/messages/MessagesSrn.php
@@ -165,8 +165,7 @@ $messages = array(
'tog-editsection' => 'Gi primisi fu kenki pisi-papira nanga [kenki]-miti',
'tog-editsectiononrightclick' => "Gi primisi fu kenki pisi-papira nanga wan naki n'a leti-anu sey na tapu wan pisi-ede (JavaScript)",
'tog-showtoc' => 'Sori san de (gi papira nanga moro leki 3 pisi-ede)',
-'tog-rememberpassword' => 'Memre mi psawortu',
-'tog-editwidth' => 'A kenki boksu span na marki na ala tu sei',
+'tog-rememberpassword' => 'Memre mi psawortu (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Tan luku den papira di mi meki',
'tog-watchdefault' => 'Tan luku den papira di mi kenki',
'tog-watchmoves' => 'Tan luku den papira di mi froysi',
@@ -462,7 +461,7 @@ No fergiti fu kenki den seti fu yu gi {{SITENAME}}.',
'yourname' => 'Kebroikiman nen:',
'yourpassword' => 'Psa wortu:',
'yourpasswordagain' => 'Psa wortu ete wan leysi:',
-'remembermypassword' => 'Tan memre mi kebroikiman nen nanga psa wortu.',
+'remembermypassword' => 'Tan memre mi kebroikiman nen nanga psa wortu (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Yu domein:',
'login' => 'Psa kon',
'nav-login-createaccount' => 'Psa kon / meki wan account',
@@ -594,9 +593,6 @@ yu kenki no kibri ete!'''",
Efu yu no wani dati trawan e kenki noso panya san yu skrifi, no skrifi noti dyaso.<br />
Yu e pramisi unu dati na yu skrifi disi yusrefi, noso yu teki en puru fu wan fri, opo presi.<br />
'''NO KEBROIKI SANI DI KIBRI BAKA SKRIFIMAN-LETI, SONDRO FU ABI PRIMISI FU DU SO!'''",
-'longpagewarning' => "'''WARSKOW: A papira disi de $1 kilobyte bigi;
-Son browser abi problema fu kenki papira di bigi moro leki 32 kb.
-Kande yu kan prati a papira disi ini moro pikin pisi.'''",
'templatesused' => 'Template di ben kebroiki tapu a papira disi:',
'templatesusedpreview' => 'Template di ben kebroiki ini a Luku-na-fesi disi:',
'templatesusedsection' => 'Ankra teki opo disi seksi:',
@@ -985,7 +981,6 @@ Papira ini [[Special:Watchlist|yu Tan Luku réy]] '''fatu'''.",
# Watchlist
'watchlist' => 'Mi Tan Luku réy',
'mywatchlist' => 'Mi Tan luku réy',
-'watchlistfor' => "(fu '''$1''')",
'addedwatch' => 'Presi a yu sirey',
'addedwatchtext' => "A papira \"[[:\$1]]\" ben presi a yu [[Special:Watchlist|sirey]]. Folo kenki fu disi papira nanga a taki sey opo [[Special:Watchlist|yu sirey]] nanga sey '''deku''' ini a [[Special:RecentChanges|rey fu bakseywan kenki]].
@@ -1199,9 +1194,9 @@ Yu ka luku a source.',
# Media information
'widthheightpage' => '$1×$2, $3 peprewoysi',
-'file-info-size' => '($1 × $2 pixel, file marki: $3, MIME-type: $4)',
+'file-info-size' => '$1 × $2 pixel, file marki: $3, MIME-type: $4',
'file-nohires' => '<small>Moro srapu no de.</small>',
-'svg-long-desc' => '(SVG file, marki $1 × $2 pixel, bigi: $3)',
+'svg-long-desc' => 'SVG file, marki $1 × $2 pixel, bigi: $3',
'show-big-image' => 'Moro srapu',
'show-big-image-thumb' => '<small>Bigi fu a luku-na-fesi disi: $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesSs.php b/languages/messages/MessagesSs.php
index 7112f096..56c4439f 100644
--- a/languages/messages/MessagesSs.php
+++ b/languages/messages/MessagesSs.php
@@ -95,19 +95,13 @@ $messages = array(
'qbspecialpages' => 'Emakhasi labalulekile',
# Vector skin
-'vector-action-addsection' => 'Ngeta sihloko',
-'vector-action-move' => 'Khweshisa',
-'vector-namespace-help' => 'Likhasi lelusito',
-'vector-namespace-main' => 'Likhasi',
-'vector-namespace-mediawiki' => 'Mlayeto',
-'vector-namespace-special' => 'Likhasi lelibalulekile',
-'vector-namespace-talk' => 'Ingcoco',
-'vector-namespace-user' => 'Likhasi lemuntfu',
-'vector-view-create' => 'Create',
-'vector-view-edit' => 'Hlela',
-'vector-view-history' => 'Bona umlandvo',
-'vector-view-view' => 'Fundza',
-'actions' => 'Tento',
+'vector-action-addsection' => 'Ngeta sihloko',
+'vector-action-move' => 'Khweshisa',
+'vector-view-create' => 'Create',
+'vector-view-edit' => 'Hlela',
+'vector-view-history' => 'Bona umlandvo',
+'vector-view-view' => 'Fundza',
+'actions' => 'Tento',
'returnto' => 'Buyela ku $1.',
'help' => 'Sita',
diff --git a/languages/messages/MessagesSt.php b/languages/messages/MessagesSt.php
index 6fd46ee8..a3b5de72 100644
--- a/languages/messages/MessagesSt.php
+++ b/languages/messages/MessagesSt.php
@@ -85,7 +85,7 @@ $messages = array(
# Login and logout pages
'yourpasswordagain' => 'Ngola lepetjo hape',
-'remembermypassword' => 'O nkgopole',
+'remembermypassword' => 'O nkgopole (for a maximum of $1 {{PLURAL:$1|day|days}})',
'nologinlink' => 'Ingodisetse',
'createaccount' => 'Ingodisetse',
'gotaccount' => "O se o ingodisitse? '''$1'''.",
diff --git a/languages/messages/MessagesStq.php b/languages/messages/MessagesStq.php
index fa6ceb9d..d1d41ccf 100644
--- a/languages/messages/MessagesStq.php
+++ b/languages/messages/MessagesStq.php
@@ -52,8 +52,7 @@ $messages = array(
'tog-editsection' => 'Links toun Beoarbaidjen fon eenpelde Ousatse anwiese',
'tog-editsectiononrightclick' => 'Eenpelde Ousatse mäd Gjuchtsklik beoarbaidje (JavaScript)',
'tog-showtoc' => 'Anwiesen fon n Inhooldsferteeknis bie Artikkele mäd moor as 3 Uurskrifte',
-'tog-rememberpassword' => 'Duurhaft Ienlogjen',
-'tog-editwidth' => 'Iengoawefäild wieder moakje, uum dän ganse Bieldeschärm uuttoufällen',
+'tog-rememberpassword' => 'Mäd dissen Browser duurhaft ounmälded blieuwe (Maximoal foar $1 {{PLURAL:$1|Dai|Deege}})',
'tog-watchcreations' => 'Aal do sälwen näi anlaide Sieden beooboachtje',
'tog-watchdefault' => 'Aal do sälwen annerde Sieden beooboachtje',
'tog-watchmoves' => 'Aal do sälwen ferskäuwene Sieden beooboachtje',
@@ -195,31 +194,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Ousnit bietouföigje',
-'vector-action-delete' => 'Läskje',
-'vector-action-move' => 'Ferskuuwe',
-'vector-action-protect' => 'Skutsje',
-'vector-action-undelete' => 'Wierhäärstaale',
-'vector-action-unprotect' => 'Fräireeke',
-'vector-namespace-category' => 'Kategorie',
-'vector-namespace-help' => 'Hälpesiede',
-'vector-namespace-image' => 'Doatäi',
-'vector-namespace-main' => 'Siede',
-'vector-namespace-media' => 'Mediensiede',
-'vector-namespace-mediawiki' => 'Mediawiki-Systemättergjucht',
-'vector-namespace-project' => 'Projektsiede',
-'vector-namespace-special' => 'Spezioalsiede',
-'vector-namespace-talk' => 'Diskussion',
-'vector-namespace-template' => 'Foarloage',
-'vector-namespace-user' => 'Benutsersiede',
-'vector-view-create' => 'Moakje',
-'vector-view-edit' => 'Beoarbaidje',
-'vector-view-history' => 'Versionsgeskichte',
-'vector-view-view' => 'Leese',
-'vector-view-viewsource' => 'Wältext bekiekje',
-'actions' => 'Aktione',
-'namespaces' => 'Noomeruume',
-'variants' => 'Variante',
+'vector-action-addsection' => 'Ousnit bietouföigje',
+'vector-action-delete' => 'Läskje',
+'vector-action-move' => 'Ferskuuwe',
+'vector-action-protect' => 'Skutsje',
+'vector-action-undelete' => 'Wierhäärstaale',
+'vector-action-unprotect' => 'Fräireeke',
+'vector-simplesearch-preference' => 'Uutwiedede Säikfoarsleeke aktivierje (bloot Vector)',
+'vector-view-create' => 'Moakje',
+'vector-view-edit' => 'Beoarbaidje',
+'vector-view-history' => 'Versionsgeskichte',
+'vector-view-view' => 'Leese',
+'vector-view-viewsource' => 'Wältext bekiekje',
+'actions' => 'Aktione',
+'namespaces' => 'Noomeruume',
+'variants' => 'Variante',
'errorpagetitle' => 'Failer',
'returnto' => 'Tourääch tou Siede $1.',
@@ -280,6 +269,9 @@ Tou fuul Benutsere fersäike, disse Siede tou besäiken.
Täif n poor Minuten, eer du et noch n Moal fersäkst.
$1',
+'pool-timeout' => 'Tiedferloop unner dät Täiwen ap ju Speerenge',
+'pool-queuefull' => 'Pooltäiweslange is ful',
+'pool-errorunknown' => 'Uunbekoanden Failer',
# 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' => 'Uur {{SITENAME}}',
@@ -443,7 +435,8 @@ Ferjeet nit, dien [[Special:Preferences|{{SITENAME}}-Ienstaalengen]] antoupaasje
'yourname' => 'Benutsernoome:',
'yourpassword' => 'Paaswoud:',
'yourpasswordagain' => 'Paaswoud wierhoalje:',
-'remembermypassword' => 'duurhaft anmäldje',
+'remembermypassword' => 'Ap dissen Computer duurhaft ounmälded blieuwe (Maximoal foar $1 {{PLURAL:$1|Dai|Deege}})',
+'securelogin-stick-https' => 'Ätter dät Anmäldjen mäd HTTOS ferbuunen blieuwe',
'yourdomainname' => 'Dien Domain:',
'externaldberror' => 'Äntweeder deer lait n Failer bie ju externe Authentifizierenge foar, of du duurst din extern Benutzerkonto nit aktualisierje.',
'login' => 'Anmäldje',
@@ -460,6 +453,7 @@ Ferjeet nit, dien [[Special:Preferences|{{SITENAME}}-Ienstaalengen]] antoupaasje
'gotaccount' => "Du hääst al n Konto? '''$1'''.",
'gotaccountlink' => 'Hier gungt dät ätter dän Login',
'createaccountmail' => 'Uur Email',
+'createaccountreason' => 'Gruund:',
'badretype' => 'Do bee Paaswoude stimme nit uureen.',
'userexists' => 'Disse Benutsernoomen is al ferroat. Wääl jädden n uur.',
'loginerror' => 'Failer bie ju Anmäldenge',
@@ -478,6 +472,7 @@ Uurpröif ju Skrieuwwiese (Groot-/Littekskrieuwenge beoachtje) of [[Special:User
'wrongpasswordempty' => 'Du hääst ferjeeten, dien Paaswoud ientoureeken. Fersäk dät jädden fonnäien.',
'passwordtooshort' => 'Paaswoude mouten mindestens {{PLURAL:$1|1 Teeken|$1 Teekene}} loang weese.',
'password-name-match' => 'Dien Paaswoud mout sik fon din Benutsernoome unnerskeede.',
+'password-login-forbidden' => 'Ju Ferweendeenge fon dissen Benutsernoome un Paaswoud is nit ferlööwed.',
'mailmypassword' => 'Näi Paaswoud touseende',
'passwordremindertitle' => 'Näi Paaswoud foar n {{SITENAME}}-Benutserkonto',
'passwordremindertext' => 'Wäl (woarskienelk du sälwen, fon ju IP-Adresse $1) häd n näi Paaswoud foar ju Anmäldenge bie {{SITENAME}} ($4) anfoarderd. Dät automatisk generierde tiedwiese Paaswoud foar Benutser "$2" lut nu: "$3". Is dät wät du foarhiest, dan skääst du die nu anmäldje un dät Paaswoud annerje. Dät tiedwiese Paaswoud lapt ou in {{PLURAL:$5|aan Dai|$5 Deege}}.
@@ -514,6 +509,9 @@ Täif, eer du fon näien fersäkst.',
'loginlanguagelabel' => 'Sproake: $1',
'suspicious-userlogout' => 'Dien Oumälde-Anfroage wuud ferwäigerd, deer ju fermoudelk fon n defekten Browser of n Cache-Proxy soand wuud.',
+# E-mail sending
+'php-mail-error-unknown' => 'Uunbekoanden Failer mäd ju Funktion mail() fon PHP',
+
# Password reset dialog
'resetpass' => 'Paaswoud annerje',
'resetpass_announce' => 'Anmäldenge mäd dän uur E-Mail tousoande Code. Uum ju Anmäldenge outousluuten, moast du nu n näi Paaswoud wääle.',
@@ -564,9 +562,10 @@ Muugelkerwiese hääst du dien Paaswoud al mäd Ärfoulch annerd of n näi tiede
'showlivepreview' => 'Live-Foarbekiek',
'showdiff' => 'Annerengen wiese',
'anoneditwarning' => "'''Woarskauenge:''' Du beoarbaidest disse Siede, man du bäst nit anmälded. Wan du spiekerst, wäd dien aktuelle IP-Adresse in ju Versionsgeskichte apteekend un is deermäd '''eepentelk''' ientousjoon.",
+'anonpreviewwarning' => '"Du bäst nit ounmälded. Bie dät Spiekerjen wäd dien IP-Adrässe in ju Versionsgeskichte apteekend."',
'missingsummary' => "'''Waiwiesenge:''' Du hääst neen Touhoopefoatenge anroat. Wan du fonnäien ap „Siede spiekerje“ klikst, wäd dien Annerenge sunner Touhoopefoatenge uurnuumen.",
'missingcommenttext' => 'Reek jädden ne Touhoopefoatenge ien.',
-'missingcommentheader' => "'''OACHTENGE:''' Du hääst neen Uurschrift in dät Fäild „Beträft:“ ienroat. Wan du fonnäien ap „Siede spiekerje“ klikst, wäd dien Beoarbaidenge sunner Uurschrift spiekerd.",
+'missingcommentheader' => "'''OACHTENGE:''' Du hääst neen Uurskrift in dät Fäild „Beträft:“ ienroat. Wan du fonnäien ap „{{int:savearticle}}“ klikst, wäd dien Beoarbaidenge sunner Uurskrift spiekerd.",
'summary-preview' => 'Foarbekiek fon ju Touhoopefoatengsriege:',
'subject-preview' => 'Themoa bekiekje:',
'blockedtitle' => 'Benutser is blokkierd',
@@ -644,7 +643,11 @@ Foar Information foulget n aktuellen Iendraach uut dät Benutser-Logbouk:',
'''Beoachtje:''' Ätter dät Spiekerjen moast du dien Browser anwiese, ju näie Version tou leeden: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
'userjspreview' => "== Foarskau fon dien Benutser-CSS ==
'''Beoachtje:''' Ätter dät Spiekerjen moast du dien Browser kweede, ju näie Version tou leeden: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
-'userinvalidcssjstitle' => "'''Woarschauenge:''' Deer existiert neen Skin \"\$1\". Betoank jädden, dät benutserspezifiske .css- un .js-Sieden män n Littek-Bouksteeuwe anfange mouten, also t.B. ''{{ns:user}}:Mustermann/monobook.css'', nit ''{{ns:user}}:Mustermann/Monobook.css''.",
+'sitecsspreview' => '"Beoachtje, dät du bloot ne Foarskau fon dit CSS bekiekest."
+"Der wuud noch nit spiekerd!"',
+'sitejspreview' => "'''Beoachtje, dät du bloot n Foarbekiek fon dit JavaScript bekiekest.'''
+'''Dät is noch nit spiekerd!'''",
+'userinvalidcssjstitle' => "'''Woarskauenge:''' Deer existiert neen Skin \"\$1\". Betoank jädden, dät benutserspezifiske .css- un .js-Sieden män n Littek-Bouksteeuwe anfange mouten, also t.B. ''{{ns:user}}:Mustermann/vector.css'', nit ''{{ns:user}}:Mustermann/Vector.css''.",
'updated' => '(Annerd)',
'note' => "'''Waiwiesenge:'''",
'previewnote' => "'''Dit is man ne Foarbekiek, die Artikkel wuude noch nit spiekerd!'''",
@@ -679,7 +682,6 @@ Du toukwäst uus hiermäd, dät du dän Text '''sälwen ferfoated''' hääst, dÃ
'copyrightwarning2' => 'Aal Biedraage tou dän {{SITENAME}} konnen fon uur Ljuude ferannerd un fersprat wäide. Fals Jie nit moaten dät Jou Oarbaid hier fon uur Ljuude ferannerd un fersprat wäd, dan drukke Jie nit ap "Spiekerje".
Jie fersicherje hiermäd uk, dät Jie dän Biedraach sälwen ferfoated hääbe blw. dät hie neen froamd Gjucht ferlätset (sjuch fääre: $1).',
-'longpagewarning' => "'''WOARSCHAUENGE: Disse Siede is $1 kb groot; eenige Browsere kuuden Probleme hääbe, Sieden tou beoarbaidjen, do der gratter as 32 kb sunt. Uurlääse Jou jädden, of ne Oudeelenge fon do Sieden in litjere Ousnitte muugelk is.'''",
'longpageerror' => "'''FAILER: Die Text, dän du tou spiekerjen fersäkst, is $1 KB groot. Dät is gratter as dät ferlööwede Maximum fon $2 KB – Spiekerenge nit muugelk.'''",
'readonlywarning' => "'''WOARSKAUENGE: Ju Doatenboank wuude foar Wartengsoarbaiden speerd, so dät dien Annerengen apstuuns nit spiekerd wäide konnen.
Sicherje dän Text jädden lokoal ap dien Computer un fersäik tou n leeteren Tiedpunkt, do Annerengen tou uurdreegen.'''
@@ -847,6 +849,8 @@ $1",
'logdelete-failure' => "'''Logbouksichtboarkaid kon nit annerd wäide:'''
$1",
'revdel-restore' => 'Sichtboarhaid annerje',
+'revdel-restore-deleted' => 'läskede Versione',
+'revdel-restore-visible' => 'sichtboare Revisione',
'pagehist' => 'Siedegeskichte',
'deletedhist' => 'Läskede Versione',
'revdelete-content' => 'Siedeninhoold',
@@ -914,11 +918,13 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
# Diffs
'history-title' => 'Versionsgeskichte fon "$1"',
'difference' => '(Unnerskeed twiske Versione)',
+'difference-multipage' => '(Unnerskeed twiske Sieden)',
'lineno' => 'Riege $1:',
'compareselectedversions' => 'Wäälde Versione ferglieke',
'showhideselectedversions' => 'Uutwäälde Versione wiese/fersteete',
'editundo' => 'tounichte moakje',
-'diff-multi' => '(Die Versionsfergliek belukt {{PLURAL:$1|ne deertwiske lääsende Version|$1 deertwiske lääsende Versione}} mee ien.)',
+'diff-multi' => ' ({{PLURAL:$1|Ne deertwiske lääsende Version|$1 deertwiske lääsende Versione}} fon {{PLURAL:$2|n Benutser|$2 Benutsere}} {{PLURAL:$1|wäd|wäide}} nit wiesd)',
+'diff-multi-manyusers' => ' ({{PLURAL:$1|Ne deertwiske lääsende Version|$1 deertwiske lääsende Versione}} fon moor as {{PLURAL:$2|Benutser|$2 Benutsere}} nit wiesd)',
# Search results
'searchresults' => 'Säikresultoate',
@@ -953,6 +959,7 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'searchprofile-everything-tooltip' => 'Gansen Inhoold truchsäike (inklusive Diskussionssieden)',
'searchprofile-advanced-tooltip' => 'Säik in wiedere Noomensruume',
'search-result-size' => '$1 ({{PLURAL:$2|1 Woud|$2 Woude}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Siede|$1 Sieden}} ({{PLURAL:$2|1 Unnerkategorie|$2 Unnerkategorien}}, {{PLURAL:$3|1 Doatäi|$3 Doatäie}})',
'search-result-score' => 'Relevanz: $1 %',
'search-redirect' => '(Wiederlaitenge $1)',
'search-section' => '(Apsnit $1)',
@@ -1027,6 +1034,7 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'contextlines' => 'Teekene pro Träffer:',
'contextchars' => 'Teekene pro Riege:',
'stub-threshold' => '<a href="#" class="stub">Kuute Artikkele</a> markierje bi (in Byte):',
+'stub-threshold-disabled' => 'Deaktivierd',
'recentchangesdays' => 'Antaal fon Deege, do ju Lieste fon „Lääste Annerengen“ standoardmäitich uumfoatje skäl:',
'recentchangesdays-max' => '(Maximoal $1 {{PLURAL:$1|Dai|Deege}})',
'recentchangescount' => 'Antaal fon do standoardmäitich anwiesde Beoarbaidengen:',
@@ -1060,6 +1068,7 @@ Hier n toufällich generierden Wäid, dän du ferweende koast: $1',
'prefs-files' => 'Doatäie',
'prefs-custom-css' => 'Benutserdefinierde CSS',
'prefs-custom-js' => 'Benutserdefinierd JS',
+'prefs-common-css-js' => 'Gemeensoam CSS/JS foar aal Skins:',
'prefs-reset-intro' => 'Du koast disse Siede bruuke, uum do Ienstaalengen ap do Standoarde touräächtousätten.
Dät kon nit moor tourääch troald wäide.',
'prefs-emailconfirm-label' => 'E-Mail-Bestäätigenge:',
@@ -1097,9 +1106,15 @@ Mäd uur Benutsere koast du uk uur do Benutserdiskussionssieden Kontakt apnieme,
'prefs-advancedrendering' => 'Uutwiedede Optione',
'prefs-advancedsearchoptions' => 'Uutwiedede Optione',
'prefs-advancedwatchlist' => 'Uutwiedede Optione',
-'prefs-display' => 'Anwies-Optione',
+'prefs-displayrc' => 'Anwies-Optione',
+'prefs-displaysearchoptions' => 'Anwies-Optione',
+'prefs-displaywatchlist' => 'Anwies-Optione',
'prefs-diffs' => 'Versionsfergliek',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Gultige E-Mail-Adrässe',
+'email-address-validity-invalid' => 'Ne gultige E-Mail-Adrässe is nöödich.',
+
# User rights
'userrights' => 'Benutsergjuchteferwaltenge',
'userrights-lookup-user' => 'Ferwaltede Gruppentouheeregaid',
@@ -1182,6 +1197,7 @@ Mäd uur Benutsere koast du uk uur do Benutserdiskussionssieden Kontakt apnieme,
'right-hideuser' => 'Speer un ferbiergje n Benutsernoome',
'right-ipblock-exempt' => 'Uutnoame fon IP-Speeren, Autoblocks un Rangespeeren',
'right-proxyunbannable' => 'Uutnoame fon automatiske Proxyspeeren',
+'right-unblockself' => 'Sik sälwen äntspeere',
'right-protect' => 'Siedenskutsstatus annerje',
'right-editprotected' => 'Skutsede Sieden beoarbaidje (sunner Kaskadenskuts)',
'right-editinterface' => 'Benutserinterface beoarbaidje',
@@ -1204,7 +1220,6 @@ Mäd uur Benutsere koast du uk uur do Benutserdiskussionssieden Kontakt apnieme,
'right-siteadmin' => 'Doatenboank speere un äntspeere',
'right-reset-passwords' => 'Dät Paaswoud fon n uur Benutser touräächsätte',
'right-override-export-depth' => 'Exportier Sieden touhoope mäd ferlinkede Sieden bit tou ne Djüpte fon 5',
-'right-versiondetail' => 'Detailinformatione uur ju Software un hiere Versionsdoaten ienkiekje',
'right-sendemail' => 'E-Mails an uur Benutsere seende',
# User rights log
@@ -1255,14 +1270,9 @@ Mäd uur Benutsere koast du uk uur do Benutserdiskussionssieden Kontakt apnieme,
'recentchanges-legend' => 'Anwiesoptione',
'recentchangestext' => "Ap disse Siede koast du do lääste Annerengen ap '''{{SITENAME}}''' ättergunge.",
'recentchanges-feed-description' => 'Ferfoulge mäd dissen Feed do lääste Annerengen in {{SITENAME}}.',
-'recentchanges-label-legend' => 'Legende: $1.',
-'recentchanges-legend-newpage' => '$1 - näie Siede',
'recentchanges-label-newpage' => 'Näie Siede',
-'recentchanges-legend-minor' => '$1 - litje Annerenge',
'recentchanges-label-minor' => 'Litje Annerenge',
-'recentchanges-legend-bot' => '$1 - Annerenge truch n Bot',
'recentchanges-label-bot' => 'Annerenge truch n Bot',
-'recentchanges-legend-unpatrolled' => '$1 - nit-kontrollierde Annerenge',
'recentchanges-label-unpatrolled' => 'Nit-kontrollierde Annerenge',
'rcnote' => "Anwiesd {{PLURAL:$1|wäd '''1''' Annerenge|wäide do lääste '''$1''' Annerengen}} in {{PLURAL:$2|dän lääste Dai|do lääste '''$2''' Deege}} siet $5, $4.",
'rcnotefrom' => "Anwiesd wäide do Annerengen siet '''$2''' (max. '''$1''' Iendraage).",
@@ -1309,6 +1319,9 @@ Mäd uur Benutsere koast du uk uur do Benutserdiskussionssieden Kontakt apnieme,
'upload_directory_missing' => 'Dät Upload-Ferteeknis ($1) failt un kuud truch dän Webserver uk nit moaked wäide.',
'upload_directory_read_only' => 'Die Webserver häd neen Skrieuwgjuchte foar dät Upload-Ferteeknis ($1).',
'uploaderror' => 'Failer bie dät Hoochleeden',
+'upload-recreate-warning' => "'''Woarschauenge: ne Doatäi fon dissen Noome wuud al läsked of ferschäuwen.'''
+
+Der foulget n Uutsuch uut dät Läsk- un Ferschuuwengs-Logbouk fon disse Doatäi.",
'uploadtext' => "Bruuk dit Formular uum näie Doatäie hoochtouleeden.
Gung tou ju [[Special:FileList|Lieste fon hoochleedene Doatäie]], uum foarhoundene Doatäie tou säiken un antouwiesen. Sjuch uk dät [[Special:Log/upload|Doatäi-]] un [[Special:Log/delete|Läsk-Logbouk]].
@@ -1353,6 +1366,17 @@ Beoachtje, dät, juust as bie normoale Sieden-Inhoolde, uur Benutsere dien DoatÃ
'filetype-banned-type' => "'''„.$1“''' is n nit ferlööwed Doatäiformoat.
Ferlööwed {{PLURAL:$3|is|sunt}} $2.",
'filetype-missing' => 'Ju hoochtouleedende Doatäi häd neen Fergratterenge (t. B. „.jpg“).',
+'empty-file' => 'Ju uurdraine Doatäi is loos',
+'file-too-large' => 'Ju uurdraine Doatäi is tou groot',
+'filename-tooshort' => 'Die Doatäinoome is tou kuut',
+'filetype-banned' => 'Disse Doatäi-Eendenge is speerd.',
+'verification-error' => 'Disse Doatäi häd ju Doatäiwröige nit truchsteen.',
+'hookaborted' => 'Die Fersäik, ju Annerenge truchtoufieren, is apgruund fon n Extension-Hook failsloain.',
+'illegal-filename' => 'Die Doatäinoome is nit ferlööwed',
+'overwrite' => 'Dät Uurskrieuwen fon ne existierdende Doatäi is nit toulät.',
+'unknown-error' => 'N uunbekoanden Failer is aptreeden.',
+'tmp-create-error' => 'Tiedwiese Doatäie konnen nit moaked wäide',
+'tmp-write-error' => 'Failer bie dät Skrieuwen fon ju tiedwiese Doatäi',
'large-file' => 'Jädden neen Bielde uur $1 hoochleede; disse Doatäi is $2 groot.',
'largefileserver' => 'Disse Doatäi is tou groot, deer die Server so konfigurierd is, dät Doatäien bloot bit tou ne bestimde Grööte apzeptierd wäide.',
'emptyfile' => 'Ju hoochleedene Doatäi is loos. Die Gruund kon n Typfailer in dän Doatäinoome weese. Kontrollierje jädden, of du ju Doatäi wuddelk hoochleede wolt.',
@@ -1378,13 +1402,14 @@ Pröif, of du ju Bielde in fulle Aplöösenge foarlääsen hääst un leed ju un
Wan du ju Doatäi daach hoochleede moatest, gung dan tourääch un leed dien Doatäi unner n uur Noome hooch. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Disse Doatäi is n Duplikoat fon foulgjende {{PLURAL:$1|Doatäi|$1 Doatäie}}:',
'file-deleted-duplicate' => 'Ne identiske Doatäi fon disse Doatäi ([[:$1]]) wuud fröier läsked. Wröich dät Läsklogbouk, eer du ju hoochlatst.',
-'successfulupload' => 'Mäd Ärfoulch hoochleeden',
'uploadwarning' => 'Woarskauenge',
'uploadwarning-text' => 'Annerje hierunner ju Doatäibeskrieuwenge un fersäik dät nochmoal.',
'savefile' => 'Doatäi spiekerje',
'uploadedimage' => '"[[$1]]" hoochleeden',
'overwroteimage' => 'häd ne näie Version fon „[[$1]]“ hoochleeden',
'uploaddisabled' => 'Äntskeeldigenge, dät Hoochleeden is apstuuns deaktivierd.',
+'copyuploaddisabled' => 'Dät Hoochleeden fon URLs is deaktivierd',
+'uploadfromurl-queued' => 'Dien Hoochleedenge fint sik nu in je Täiweslange.',
'uploaddisabledtext' => 'Dät Hoochleeden fon Doatäie is nit muugelk.',
'php-uploaddisabledtext' => 'PHP-Doatäi-Uploads wuuden deaktivierd. Wröich ju file_uploads-Ienstaalenge.',
'uploadscripted' => 'Disse Doatäi änthaalt HTML- of Scriptcode, ju bie Fersjoon fon aan Webbrowser apfierd wäide kuude.',
@@ -1404,6 +1429,14 @@ Pröif suurgfooldich, of dät fernäide Hoochleeden do Gjuchtlienjen äntspräkt
Tou Dien Information foulget dät Läsk-Logbouk mäd ju Begründenge foar ju foargungende Läskenge:",
'filename-bad-prefix' => "Die Doatäinoome begint mäd '''„$1“'''. Dit is in algemeenen die fon ne Digitoalkamera foarroate Doatäinoome un deeruum nit gjucht uurtjuugend.
Reek ju Doatäi n Noome, die dän Inhoold beeter beskrift.",
+'upload-success-subj' => 'Mäd Ärfoulch hoochleeden',
+'upload-success-msg' => 'Dät Hoochleeden fon [$2] is glukked. Ju stoant hier tou Ferföigenge: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Hoochleedefailer',
+'upload-failure-msg' => 'Dät roat n Problem mäd dien hoochleedene Doatäi fon [$2]:
+
+$1',
+'upload-warning-subj' => 'Hoochleede-Woarskauenge',
+'upload-warning-msg' => 'Dät roat n Problem bie dät Hoochleeden fon [$2]. Gung wier ätter [[Special:Upload/stash/$1|Hoochleedeformular]] wai, uum dit Problem tou löösen.',
'upload-proto-error' => 'Falsk Protokol',
'upload-proto-error-text' => 'Ju URL mout mäd <code>http://</code> of <code>ftp://</code> ounfange.',
@@ -1463,6 +1496,7 @@ Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
'listfiles_search_for' => 'Säik ätter Doatäi:',
'imgfile' => 'Doatäi',
'listfiles' => 'Bieldelieste',
+'listfiles_thumb' => 'Foarbekiekbielde',
'listfiles_date' => 'Doatum',
'listfiles_name' => 'Noome',
'listfiles_user' => 'Benutser',
@@ -1573,8 +1607,8 @@ Ne [[Special:WhatLinksHere/$2|fulständige Lieste]] is ferföigboar.',
'statistics-edits' => 'Siedenbeoarbaidengen siet {{SITENAME}} waas ounfangd',
'statistics-edits-average' => 'Beoarbaidengen pro Siede in n Truchsleek',
'statistics-views-total' => 'Siedenaproupe mädnunner',
+'statistics-views-total-desc' => 'Aproupe fon nit bestoundende Sieden un fon Spezialsieden wäide nit in Reekenge nuumen',
'statistics-views-peredit' => 'Siedenaproupe pro Beoarbaidenge',
-'statistics-jobqueue' => 'Laangte fon ju [http://www.mediawiki.org/wiki/Manual:Job_queue Jobqueue]',
'statistics-users' => 'Registrierde [[Special:ListUsers|Benutsere]]',
'statistics-users-active' => 'Aktive Benutsere',
'statistics-users-active-desc' => 'Benutsere mäd Beoarbaidengen {{PLURAL:$1|in do lääste 24 Uuren|in do fergeene $1 Deege}}',
@@ -1588,8 +1622,8 @@ Ne Siede wäd as Begriepskläärengssiede behonneld, wan [[MediaWiki:Disambiguat
'doubleredirects' => 'Dubbelde Fäärelaitengen',
'doubleredirectstext' => 'Disse Lieste änthoalt Fääreleedengen, do der ap wiedere Fääreleedengen ferlinkje.
-Älke Riege änthoalt Links tou ju eerste un twäide Fääreleedenge as uk dät Siel fon ju twäide Fääreleedenge, wät foar gewöönelk ju wonskede Sielsiede is, ap ju al ju eerste Fääreleedenge wiese schuul.
-<s>Truchstriekene</s> Iendraage wuuden al oumoaked.',
+Älke Riege änthoalt Links tou ju eerste un twäide Fääreleedenge as uk dät Siel fon ju twäide Fääreleedenge, wät foar gewöönelk ju wonskede Sielsiede is, ap ju al ju eerste Fääreleedenge wiese skuul.
+<del>Truchstriekene</del> Iendraage wuuden al oumoaked.',
'double-redirect-fixed-move' => 'dubbelde Fäärelaitenge aplöösd: [[$1]] → [[$2]]',
'double-redirect-fixer' => 'RedirectBot',
@@ -1612,6 +1646,8 @@ Ne Siede wäd as Begriepskläärengssiede behonneld, wan [[MediaWiki:Disambiguat
'nmembers' => '{{PLURAL:$1|1 Iendraach|$1 Iendraage}}',
'nrevisions' => '{{PLURAL:$1|1 Beoarbaideng|$1 Beoarbaidengen}}',
'nviews' => '{{PLURAL:$1|1 Oufroage|$1 Oufroagen}}',
+'nimagelinks' => 'Ferwoand ap $1 {{PLURAL:$1|Siede|Sieden}}',
+'ntransclusions' => 'ferwoand ap $1 {{PLURAL:$1|Siede|Sieden}}',
'specialpage-empty' => 'Ju Siede änthaalt aktuell neen Iendraage.',
'lonelypages' => 'Ferwaisde Sieden',
'lonelypagestext' => 'Do foulgjende Sieden sunt nit ferlinked of ienbuunen fon uur Sieden in {{SITENAME}}.',
@@ -1768,34 +1804,40 @@ Informatione uurhäär uur eenpelde Gjuchte konnen [[{{MediaWiki:Listgrouprights
'listgrouprights-removegroup-self-all' => 'Kon aal Gruppen fon dät oaine Konto wächhoalje',
# E-mail user
-'mailnologin' => 'Du bäst nit anmälded.',
-'mailnologintext' => 'Du moast [[Special:UserLogin|anmälded weese]] un sälwen ne [[Special:Preferences|gultige E-Mail-Adrässe]] anroat hääbe, uum uur Benutsere ne E-Mail tou seenden.',
-'emailuser' => 'Seende E-Mail an dissen Benutser',
-'emailpage' => 'E-mail an Benutser',
-'emailpagetext' => 'Du koast dän Benutser mäd dän unner stoundene Formular ne E-Mail seende.
+'mailnologin' => 'Du bäst nit anmälded.',
+'mailnologintext' => 'Du moast [[Special:UserLogin|anmälded weese]] un sälwen ne [[Special:Preferences|gultige E-Mail-Adrässe]] anroat hääbe, uum uur Benutsere ne E-Mail tou seenden.',
+'emailuser' => 'Seende E-Mail an dissen Benutser',
+'emailpage' => 'E-mail an Benutser',
+'emailpagetext' => 'Du koast dän Benutser mäd dän unner stoundene Formular ne E-Mail seende.
As Ouseender wäd ju E-Mail-Adresse uut dien [[Special:Preferences|Ienstaalengen]] iendrain, deermäd die Benutser die oantwoudje kon.',
-'usermailererror' => 'Dät Mail-Objekt roat n Failer tourääch:',
-'defemailsubject' => '{{SITENAME}}-E-Mail',
-'noemailtitle' => 'Neen Email-Adrässe',
-'noemailtext' => 'Dissen Benutser häd neen gultige Email-Adrässe anroat.',
-'nowikiemailtitle' => 'E-Mail-Ferseendenge nit muugelk',
-'nowikiemailtext' => 'Dissen Benutser moate neen E-Mails fon uur Benutsere kriege.',
-'email-legend' => 'E-Mail an n uur {{SITENAME}}-Benutser seende',
-'emailfrom' => 'Fon:',
-'emailto' => 'An:',
-'emailsubject' => 'Beträf:',
-'emailmessage' => 'Ättergjucht:',
-'emailsend' => 'Seende',
-'emailccme' => 'Seend ne Kopie fon ju E-Mail an mie',
-'emailccsubject' => 'Kopie fon dien Ättergjucht an $1: $2',
-'emailsent' => 'Begjucht fersoand',
-'emailsenttext' => 'Jou Begjucht is soand wuuden.',
-'emailuserfooter' => 'Disse E-Mail wuude fon „Benutzer:$1“ an „Benutzer:$2“ mäd Hälpe fon ju „E-Mail an dissen Benutser“-Funktion fon {{SITENAME}} fersoand.',
+'usermailererror' => 'Dät Mail-Objekt roat n Failer tourääch:',
+'defemailsubject' => '{{SITENAME}}-E-Mail',
+'usermaildisabled' => 'E-Mail-Ämfangst deaktivierd',
+'usermaildisabledtext' => 'Du koast in dissen Wiki neen E-Mails an uur Benutsere seende',
+'noemailtitle' => 'Neen Email-Adrässe',
+'noemailtext' => 'Dissen Benutser häd neen gultige Email-Adrässe anroat.',
+'nowikiemailtitle' => 'E-Mail-Ferseendenge nit muugelk',
+'nowikiemailtext' => 'Dissen Benutser moate neen E-Mails fon uur Benutsere kriege.',
+'email-legend' => 'E-Mail an n uur {{SITENAME}}-Benutser seende',
+'emailfrom' => 'Fon:',
+'emailto' => 'An:',
+'emailsubject' => 'Beträf:',
+'emailmessage' => 'Ättergjucht:',
+'emailsend' => 'Seende',
+'emailccme' => 'Seend ne Kopie fon ju E-Mail an mie',
+'emailccsubject' => 'Kopie fon dien Ättergjucht an $1: $2',
+'emailsent' => 'Begjucht fersoand',
+'emailsenttext' => 'Jou Begjucht is soand wuuden.',
+'emailuserfooter' => 'Disse E-Mail wuude fon „Benutzer:$1“ an „Benutzer:$2“ mäd Hälpe fon ju „E-Mail an dissen Benutser“-Funktion fon {{SITENAME}} fersoand.',
+
+# User Messenger
+'usermessage-summary' => 'Systemättergjucht spiekerd.',
+'usermessage-editor' => 'System-Messenger',
# Watchlist
'watchlist' => 'Beooboachtengslieste',
'mywatchlist' => 'Beooboachtengslieste',
-'watchlistfor' => "(foar '''$1''')",
+'watchlistfor2' => 'Fon $1 $2',
'nowatchlist' => 'Du hääst neen Iendraage ap dien Beooboachtengslieste. Du moast anmälded weese, dät die een Beooboachtengslieste tou Ferföigenge stoant.',
'watchlistanontext' => 'Du moast die $1, uum dien Beooboachtengslieste tou sjoon of Iendraage ap hier tou beoarbaidjen.',
'watchnologin' => 'Du bäst nit anmälded',
@@ -1911,7 +1953,10 @@ Ju lääste Annerenge stamt fon [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int
'revertpage' => 'Tounichte moakede Beoarbaidengen fon [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) tou ju lääste Version fon [[User:$1|$1]]',
'revertpage-nouser' => 'Annerengen fon (Benutsernoome wächhoald) touräächtroald un lääste Version fon [[User:$1|$1]] wier häärstoald',
'rollback-success' => 'Do Annerengen fon $1 wuuden tourääch annerd un ju lääste Version fon $2 wuude wier moaked.',
-'sessionfailure' => 'Dät roat n Problem mäd ju Uurdreegenge fon dien Benutserdoaten. Disse Aktion wuude deeruum sicherheidshoolwe oubreeken, uum ne falske Touoardnenge fon dien Annerengen tou n uur Benutser tou ferhinnerjen. Gung jädden tourääch un fersäik dän Foargong fonnäien uuttoufieren.',
+
+# Edit tokens
+'sessionfailure-title' => 'Sittengsfailer',
+'sessionfailure' => 'Dät roat n Problem mäd ju Uurdreegenge fon dien Benutserdoaten. Disse Aktion wuude deeruum sicherheidshoolwe oubreeken, uum ne falske Touoardnenge fon dien Annerengen tou n uur Benutser tou ferhinnerjen. Gung jädden tourääch un fersäik dän Foargong fonnäien uuttoufieren.',
# Protect
'protectlogpage' => 'Siedenskuts-Logbouk',
@@ -2037,18 +2082,22 @@ $1',
'month' => 'un Mound:',
'year' => 'bit Jier:',
-'sp-contributions-newbies' => 'Wies bloot Biedraage fon näie Benutsere',
-'sp-contributions-newbies-sub' => 'Foar Näilinge',
-'sp-contributions-newbies-title' => 'Benutserbiedraage fon näie Benutsere',
-'sp-contributions-blocklog' => 'Speerlogbouk',
-'sp-contributions-deleted' => 'Läskede Benutserbiedraage',
-'sp-contributions-logs' => 'Logbouke',
-'sp-contributions-talk' => 'Diskussion',
-'sp-contributions-userrights' => 'Benutsergjuchteferwaltenge',
-'sp-contributions-blocked-notice' => 'Dissen Benutser is apstuuns speerd. Hier foulget die aktuelle Iendraach uut dät Benutser-Logbouk:',
-'sp-contributions-search' => 'Säike ätter Benutserbiedraage',
-'sp-contributions-username' => 'IP-Adrässe af Benutsernoome:',
-'sp-contributions-submit' => 'Säike (014)',
+'sp-contributions-newbies' => 'Wies bloot Biedraage fon näie Benutsere',
+'sp-contributions-newbies-sub' => 'Foar Näilinge',
+'sp-contributions-newbies-title' => 'Benutserbiedraage fon näie Benutsere',
+'sp-contributions-blocklog' => 'Speerlogbouk',
+'sp-contributions-deleted' => 'Läskede Benutserbiedraage',
+'sp-contributions-uploads' => 'Hoochleedene Doatäie',
+'sp-contributions-logs' => 'Logbouke',
+'sp-contributions-talk' => 'Diskussion',
+'sp-contributions-userrights' => 'Benutsergjuchteferwaltenge',
+'sp-contributions-blocked-notice' => 'Dissen Benutser is apstuuns speerd. Hier foulget die aktuelle Iendraach uut dät Benutser-Logbouk:',
+'sp-contributions-blocked-notice-anon' => 'Dissen Benutser is apstuuns speerd.
+Foar Information foulget die aktuelle Iendraach uut dät Speer-Logbouk:',
+'sp-contributions-search' => 'Säike ätter Benutserbiedraage',
+'sp-contributions-username' => 'IP-Adrässe af Benutsernoome:',
+'sp-contributions-toponly' => 'Bloot aktuelle Versione wiese',
+'sp-contributions-submit' => 'Säike (014)',
# What links here
'whatlinkshere' => 'Links ap disse Siede',
@@ -2109,7 +2158,6 @@ Reek dän Gruund foar ju Speere oun.',
'ipb-edit-dropdown' => 'Speergruunde beoarbaidje',
'ipb-unblock-addr' => '"$1" fräireeke',
'ipb-unblock' => 'IP-Adrässe/Benutser fräireeke',
-'ipb-blocklist-addr' => 'Aktuelle Speeren foar $1',
'ipb-blocklist' => 'Aal aktuelle Speeren anwiese',
'ipb-blocklist-contribs' => 'Benutserbiedreege foar „$1“',
'unblockip' => 'IP-Adrässe fräireeke',
@@ -2179,6 +2227,8 @@ Sjuch ju [[Special:IPBlockList|Lieste fon de speerde IP-Adrässe un Benutsernoom
'sorbs_create_account_reason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested. Du koast neen Benutser-Account anlääse.',
'cant-block-while-blocked' => 'Du duurst neen uur Benutsere speere, wan du sälwen speerd bäst.',
'cant-see-hidden-user' => 'Die Benutser, dän du fersäkst tou speeren, wuud al speerd un ferstat. Deer du dät „hideuser“-Gjucht nit hääst, koast du ju Benutserspeere nit sjo un nit beoarbaidje.',
+'ipbblocked' => 'Du koast naan uur Benutser speere of äntspeere, deer du sälwen speerd bäst',
+'ipbnounblockself' => 'Du hääst nit ju Begjuchtigenge, die sälwen tou äntspeeren',
# Developer tools
'lockdb' => 'Doatenboank speere',
@@ -2212,6 +2262,17 @@ Beoachtje, dät ju Siede '''nit''' ferskäuwen wäd, wan dät al ne Siede mäd d
'''WOARSKAUENGE!'''
Dit kon ne drastiske un uunferwachtede Ferannerenge reeke foar ne beljoowede Siede;
wääs die deeruum sicher, dät du do Konsequenzen deerfon iensjuchst, eer du fääre moakest.",
+'movepagetext-noredirectfixer' => "Mäd dän unnerstoundende Formular koast du ne Siede uumenaame, wierbie du ju mädsamt aal Versione ap dän näien Tittel ferskufst.
+Die oolde Tittel wäd deerätter tou dän näie fäärelaitje.
+Staal sicher, dät di in n Anslus aal [[Special:DoubleRedirects|dubbelde]] of [[Special:BrokenRedirects|breekene Fäärelaitengen]] wröigest.
+Du bäst deerfoar feroantwoudelk, dät Links uk fääre ap dät korrekte Siel ferwiese.
+
+Ju Siede wäd ‘’‘nit’‘’ferschäuwen, sowied et al ne Siede mäd dän foarsäine Tittel rakt, of ju moaste loos weese of ne Fäärelaitenge sunner Versionsgeskichte.
+Dät betjut, dät du ju Uumenaamenge tourääch traale koast, wan du n Failer moaked hääst. Du koast deerjuun neen Siede uurskrieuwe.
+
+'''WOARSKAUENGE!'''
+Ju Ferskuuwenge kon fierräkkende un uunferwachtede Foulgen foar oafte besoachte Sieden hääbe.
+Du skuust deeruum do Konsequenze fersteen hääbe, eer du nu fääregungst.",
'movepagetalktext' => "Ju touheerige Diskussionssiede wäd, sofier deer, mee ferskäuwen, '''of dät moast weese dät'''
* der bestoant al n Diskussionssiede mäd dän näie Noome
* du wäälst ju unnerstoundene Option ou.
@@ -2267,6 +2328,7 @@ Moatest du him foar ju Ferskuuwenge läskje?',
'immobile-source-page' => 'Disse Siede is nit ferskuuwboar.',
'immobile-target-page' => 'Der kon nit ap disse Sielsiede ferskäuwen wäide.',
'imagenocrossnamespace' => 'Doatäie konnen nit uut dän {{ns:file}}-Noomensruum hääruut ferskäuwen wäide',
+'nonfile-cannot-move-to-file' => 'Nit-Doatäie konnen nit in dän {{ns:file}}-Noomensruum hääroun ferskäuwen wäide',
'imagetypemismatch' => 'Ju näie Doatäifergratterenge is nit mäd ju oolde identisk',
'imageinvalidfilename' => 'Die Siel-Doatäinoome is nit gultich',
'fix-double-redirects' => 'Ätter dät Ferskuuwen dubbelde Fäärelaitengen aplööse',
@@ -2345,6 +2407,7 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
'importstart' => 'Sieden importierje …',
'import-revision-count' => '– {{PLURAL:$1|1 Version|$1 Versione}}',
'importnopages' => 'Neen Sieden toun Importierjen anweesend.',
+'imported-log-entries' => '$1 {{PLURAL:$1|lLogboukiendraach|Logboukiendraage}} importierd.',
'importfailed' => 'Import failsloain: $1',
'importunknownsource' => 'Uunbekoande Importwälle',
'importcantopen' => 'Importdoatäi kuude nit eepend wäide',
@@ -2437,6 +2500,8 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
'tooltip-upload' => 'Hoochleeden startje',
'tooltip-rollback' => 'moaket aal lääste Annerengen fon ju Siede, do der fon dän glieke Benutser moaked sunt, truch aan Klik tounichte.',
'tooltip-undo' => 'moaket bloot disse eene Annerenge tounichte un wiest dät Resultoat in dän Foarbekiek an, deermäd in ju Touhoopefoatengsriege ne Begruundenge ounroat wäide kon.',
+'tooltip-preferences-save' => 'Ienstaalengen spiekerje',
+'tooltip-summary' => 'Reek ne kuute Touhoopefoatenge ien',
# Stylesheets
'common.css' => '/** CSS an disse Steede wirket sik ap aal Skins uut */',
@@ -2533,18 +2598,21 @@ $1',
'nextdiff' => 'Tou ne näiere Version →',
# Media information
-'mediawarning' => "'''Woarschauenge:''' Disse Oard fon Doatäi kon n schoadelken Programcode änthoolde. Truch dät Deelleeden un Eepenjen fon disse Doatäi kon dän Computer Schoade toubroacht wäide.",
+'mediawarning' => "'''Woarskauenge:''' Disse Oard fon Doatäi kon n skoadelken Programcode änthoolde. Truch dät Deelleeden un Eepenjen fon disse Doatäi kon dän Computer Skoade toubroacht wäide.",
'imagemaxsize' => "Maximoale Bieldegrööte:<br />''(foar Doatäibeskrieuwengssieden)''",
'thumbsize' => 'Grööte fon do Foarskaubielden (thumbnails):',
'widthheightpage' => '$1×$2, {{PLURAL:$3|1 Siede|$3 Sieden}}',
-'file-info' => '(Doatäigrööte: $1, MIME-Typ: $2)',
-'file-info-size' => '($1 × $2 Pixel, Doatäigrööte: $3, MIME-Typ: $4)',
+'file-info' => 'Doatäigrööte: $1, MIME-Typ: $2',
+'file-info-size' => '$1 × $2 Pixel, Doatäigrööte: $3, MIME-Typ: $4',
'file-nohires' => '<small>Neen haagere Aplöösenge foarhounden.</small>',
-'svg-long-desc' => '(SVG-Doatäi, Basisgrööte: $1 × $2 Pixel, Doatäigrööte: $3)',
+'svg-long-desc' => 'SVG-Doatäi, Basisgrööte: $1 × $2 Pixel, Doatäigrööte: $3',
'show-big-image' => 'Bielde in hooge Aplöösenge',
'show-big-image-thumb' => '<small>Grööte fon disse Foarschau: $1 × $2 Pixel</small>',
'file-info-gif-looped' => 'Eendloos-Strik',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bielde|Bielden}}',
+'file-info-png-looped' => 'Eendloos-Strik',
+'file-info-png-repeat' => '$1-{{PLURAL:$1|Moal|Moale}} ouspield',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Bielde|Bielden}}',
# Special:NewFiles
'newimages' => 'Näie Bielden',
@@ -2703,6 +2771,7 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
'exif-gpsareainformation' => 'Noome fon dät GPS-Gestrich',
'exif-gpsdatestamp' => 'GPS-Doatum',
'exif-gpsdifferential' => 'GPS-Differentioalkorrektur',
+'exif-objectname' => 'Kuuten Tittel',
# EXIF attributes
'exif-compression-1' => 'Uunkomprimierd',
@@ -2860,24 +2929,24 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
'limitall' => 'aal',
# E-mail address confirmation
-'confirmemail' => 'Email-Adrässe bestäätigje',
-'confirmemail_noemail' => 'Du hääst neen gultige E-Mail-Adresse in dien [[Special:Preferences|persöönelke Ienstaalengen]] iendrain.',
-'confirmemail_text' => '{{SITENAME}} ärfoardert, dät du dien E-Mail-Adresse bestäätigest (authentifizierje), eer du do fergratterde E-Mail-Funktione benutsje koast. Truch n Klik ap ju Skaltfläche unner wäd ne E-Mail an die fersoand. Disse E-Mail änthaalt ne Ferbiendenge mäd n Bestäätigengs-Code. Truch Klikken ap disse Ferbiendenge wäd bestäätiged, dät dien E-Mail-Adresse gultich is.',
-'confirmemail_pending' => 'Der wuude die al n Bestäätigengs-Code per E-Mail tousoand. Wan du dien Benutserkonto eerste knu moaked hääst, täif noch n poor Minuten ap ju E-Mail, eer du n näien Code anfoarderst.',
-'confirmemail_send' => 'Bestäätigengscode touseende',
-'confirmemail_sent' => 'Bestäätigengs-E-Mail wuude fersoand.',
-'confirmemail_oncreate' => 'N Bestäätigengs-Code wuude an dien E-Mail-Adresse soand. Dissen Code is foar ju Anmäldenge nit nöödich, man daach wäd er tou ju Aktivierenge fon do E-Mail-Funktione binne dän Wiki bruukt.',
-'confirmemail_sendfailed' => '{{SITENAME}} kuud ju Bestäätigengs-E-Mail nit an die ferseende.
+'confirmemail' => 'Email-Adrässe bestäätigje',
+'confirmemail_noemail' => 'Du hääst neen gultige E-Mail-Adresse in dien [[Special:Preferences|persöönelke Ienstaalengen]] iendrain.',
+'confirmemail_text' => '{{SITENAME}} ärfoardert, dät du dien E-Mail-Adresse bestäätigest (authentifizierje), eer du do fergratterde E-Mail-Funktione benutsje koast. Truch n Klik ap ju Skaltfläche unner wäd ne E-Mail an die fersoand. Disse E-Mail änthaalt ne Ferbiendenge mäd n Bestäätigengs-Code. Truch Klikken ap disse Ferbiendenge wäd bestäätiged, dät dien E-Mail-Adresse gultich is.',
+'confirmemail_pending' => 'Der wuude die al n Bestäätigengs-Code per E-Mail tousoand. Wan du dien Benutserkonto eerste knu moaked hääst, täif noch n poor Minuten ap ju E-Mail, eer du n näien Code anfoarderst.',
+'confirmemail_send' => 'Bestäätigengscode touseende',
+'confirmemail_sent' => 'Bestäätigengs-E-Mail wuude fersoand.',
+'confirmemail_oncreate' => 'N Bestäätigengs-Code wuude an dien E-Mail-Adresse soand. Dissen Code is foar ju Anmäldenge nit nöödich, man daach wäd er tou ju Aktivierenge fon do E-Mail-Funktione binne dän Wiki bruukt.',
+'confirmemail_sendfailed' => '{{SITENAME}} kuud ju Bestäätigengs-E-Mail nit an die ferseende.
Wröich ju E-Mail-Adresse ap uungultige Teekene.
Touräächmäldenge fon dän Mailserver: $1',
-'confirmemail_invalid' => 'Uungultigen Bestäätigengscode. Eventuell is die Code al wier uungultich wuuden.',
-'confirmemail_needlogin' => 'Du moast die $1, uum dien E-Mail-Adresse tou bestäätigjen.',
-'confirmemail_success' => 'Dien E-Mail-Adresse wuude mäd Ärfoulch bestäätiged. Du koast die nu [[Special:UserLogin|ienlogje]].',
-'confirmemail_loggedin' => 'Dien E-Mail-Adresse wuude mäd Ärfoulch bestäätiged.',
-'confirmemail_error' => 'Et roat n Failer bie ju Bestäätigenge fon dien E-Mail-Adresse.',
-'confirmemail_subject' => '[{{SITENAME}}] - Bestäätigenge fon ju E-Mail-Adresse',
-'confirmemail_body' => 'Moin,
+'confirmemail_invalid' => 'Uungultigen Bestäätigengscode. Eventuell is die Code al wier uungultich wuuden.',
+'confirmemail_needlogin' => 'Du moast die $1, uum dien E-Mail-Adresse tou bestäätigjen.',
+'confirmemail_success' => 'Dien E-Mail-Adresse wuude mäd Ärfoulch bestäätiged. Du koast die nu [[Special:UserLogin|ienlogje]].',
+'confirmemail_loggedin' => 'Dien E-Mail-Adresse wuude mäd Ärfoulch bestäätiged.',
+'confirmemail_error' => 'Et roat n Failer bie ju Bestäätigenge fon dien E-Mail-Adresse.',
+'confirmemail_subject' => '[{{SITENAME}}] - Bestäätigenge fon ju E-Mail-Adresse',
+'confirmemail_body' => 'Moin,
wäl mäd ju IP-Adresse $1, woarskienelk du sälwen, häd dät Benutserkonto "$2" in {{SITENAME}} registrierd.
@@ -2892,8 +2961,36 @@ Wan du dät naamde Benutserkonto *nit* registrierd hääst, foulgje dissen Link,
$5
Disse Bestäätigengscode is gultich bit $4.',
-'confirmemail_invalidated' => 'E-Mail-Adressbestäätigenge oubreeke',
-'invalidateemail' => 'E-Mail-Adressbestäätigenge oubreeke',
+'confirmemail_body_changed' => 'Moin,
+
+wäl mäd ju IP-Adresse $1, woarskienelk du sälwen, häd ju E-Mail-Adresse fon dät Benutserkonto "$2" ap {{SITENAME}} annerd.
+
+Uum tou bestäätigjen, dät dit Benutserkonto wuddelk tou die heert un uum do E-Mail-Features ap {{SITENAME}} tou reaktivierjen, eepenje dissen Link:
+
+$3
+
+Fals dät Konto *nit* die heert, foulge dissen Link,
+uum ju E-Mail-Adräs-Bestäätigenge outoubreeken:
+
+$5
+
+Disse Bestäätigengskode is gultich bit $4',
+'confirmemail_body_set' => 'Wäl mäd ju IP-Adresse $1, woarskienelk du sälwen,
+häd ju E-Mail-Adresse fon dät Benutserkonto "$2" ap {{SITENAME}} tou disse E-Mail-Adresse annerd.
+
+Uum tou bestäätigjen, dät dit Benutserkonto wuddelk tou die heert
+un uum do E-Mail-Funktione ap {{SITENAME}} tou reaktivierjen, eepenje dissen Link:
+
+$3
+
+Fals dät Konto *nit* die heert, foulge dissen Link,
+uum ju E-Mail-Adresse-Bestäätigenge outoubreeken:
+
+$5
+
+Disse Bestäätigengskode is gultich bit $4',
+'confirmemail_invalidated' => 'E-Mail-Adressbestäätigenge oubreeke',
+'invalidateemail' => 'E-Mail-Adressbestäätigenge oubreeke',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Ienbiendenge is deaktivierd]',
@@ -2935,6 +3032,7 @@ Bestäätigje, dät du disse Siede wuddelk näi moakje moatest.",
'table_pager_first' => 'Eerste Siede',
'table_pager_last' => 'Lääste Siede',
'table_pager_limit' => 'Wies $1 Iendraage pro Siede',
+'table_pager_limit_label' => 'Positione pro Siede:',
'table_pager_limit_submit' => 'Loos',
'table_pager_empty' => 'Neen Resultoate',
@@ -2989,6 +3087,7 @@ Du koast dien Beooboachtengslieste uk in dät [[Special:Watchlist/raw|Liestenfor
'version-specialpages' => 'Spezioalsieden',
'version-parserhooks' => 'Parser-Hooks',
'version-variables' => 'Variablen',
+'version-skins' => 'Benutseruurflächen',
'version-other' => 'Uurswät',
'version-mediahandlers' => 'Medien-Handlere',
'version-hooks' => "Snitsteeden ''(Hooks)''",
@@ -3000,6 +3099,13 @@ Du koast dien Beooboachtengslieste uk in dät [[Special:Watchlist/raw|Liestenfor
'version-hook-subscribedby' => 'Aproup fon',
'version-version' => '(Version $1)',
'version-license' => 'Lizenz',
+'version-poweredby-credits' => "Disse Website nutset '''[http://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'uur',
+'version-license-info' => "MediaWiki is fräie Software, dät hat dät ju ätter do Bedingengen fon ju truch de Free Software Foundation fereepenlikede ''GNU General Public License'', fääreferdeeld un/ of modifizierd wäide kon. Deerbie kon ju version 2, of ätter oainen Uurdeel, älke näiere Version fon ju Lizenz ferwoand wäide.
+
+MediaWiki wäd ferdeeld in ju Hoopenge, dät et nutselk weese skäl, man SUNNER EENIGE GARANTIE un sogoar sunner ju implizierde Garantie fon ne MÄÄRKEDGÄNGEGAID of OAINENGE FOAR N BESTIMDEN TSWÄK. Hiertou sunt wiedere Waiwiesengen in ju ''GNU General Public License'' äntheelden.
+
+Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''] skuul touhoope mäd dissen Program ferdeeld wuuden weese. Insofier dät nit dän Fal waas, kon ne Kopie bie ju Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, skriftlek anfoarderd of ap do hiere Website [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html online leesen] wäide.",
'version-software' => 'Installierde Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
@@ -3067,6 +3173,15 @@ Ju Iengoawe mout sunner dän Tousats „{{ns:file}}:“ geböäre.',
'tags-edit' => 'beoarbaidje',
'tags-hitcount' => '$1 {{PLURAL:$1|Annerenge|Annerengen}}',
+# Special:ComparePages
+'comparepages' => 'Sieden ferglieke',
+'compare-selector' => 'Siedeversione ferglieke',
+'compare-page1' => 'Siede 1',
+'compare-page2' => 'Siede 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Fergliek',
+
# Database error messages
'dberr-header' => 'Dit Wiki häd n Problem',
'dberr-problems' => 'Äntskeeldenge. Disse Siede häd apstuuns techniske Meelasje.',
@@ -3083,8 +3198,13 @@ Ju Iengoawe mout sunner dän Tousats „{{ns:file}}:“ geböäre.',
'htmlform-float-invalid' => 'Die anroate Wäid is neen Taal.',
'htmlform-int-toolow' => 'Die anroate Wäid is unner dät Minimum fon $1',
'htmlform-int-toohigh' => 'Die anroate Wäid is buppe dät Maximum fon $1',
+'htmlform-required' => 'Dissen Wäid is nöödich',
'htmlform-submit' => 'Uurdreege',
'htmlform-reset' => 'Annerengen touräächtraale',
'htmlform-selectorother-other' => 'Uur',
+# SQLite database support
+'sqlite-has-fts' => 'Version $1 mäd Unnerstutsenge foar ju Fultäkstsäike',
+'sqlite-no-fts' => 'Version $1 sunner Unnerstutsenge foaar ju Fultäkstsäike',
+
);
diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php
index b17da3cb..bf750732 100644
--- a/languages/messages/MessagesSu.php
+++ b/languages/messages/MessagesSu.php
@@ -141,8 +141,7 @@ $messages = array(
'tog-editsection' => 'Tambahkeun tumbu [édit] ngarah bisa ngarobah eusi bab',
'tog-editsectiononrightclick' => 'Fungsikeun ngédit sub-bagean kalawan klik-katuhu dina judul bagean (JavaScript)',
'tog-showtoc' => 'Témbongkeun daptar eusi<br />(pikeun kaca nu leuwih ti tilu subjudul)',
-'tog-rememberpassword' => 'Inget sandi nembus rintakan',
-'tog-editwidth' => 'Legaan kotak édit luyu jeung lébar layar',
+'tog-rememberpassword' => 'Apalkeun login kuring dina ieu panyungsi (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})',
'tog-watchcreations' => 'Awaskeun kaca jieunan kuring',
'tog-watchdefault' => 'Tambahkeun kaca nu diédit ku anjeun kana awaskeuneun anjeun',
'tog-watchmoves' => 'Awaskeun kaca nu dipindahkeun ku kuring',
@@ -283,31 +282,20 @@ $messages = array(
'faqpage' => 'Project:NLD',
# Vector skin
-'vector-action-addsection' => 'Jieun jejer anyar',
-'vector-action-delete' => 'Hapus',
-'vector-action-move' => 'Pindahkeun',
-'vector-action-protect' => 'Konci',
-'vector-action-undelete' => 'Bolaykeun ngahapus',
-'vector-action-unprotect' => 'Buka konci',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Kaca pitulung',
-'vector-namespace-image' => 'Koropak',
-'vector-namespace-main' => 'Kaca',
-'vector-namespace-media' => 'Kaca média',
-'vector-namespace-mediawiki' => 'Surat',
-'vector-namespace-project' => 'Kaca proyék',
-'vector-namespace-special' => 'Kaca husus',
-'vector-namespace-talk' => 'Sawala',
-'vector-namespace-template' => 'Citakan',
-'vector-namespace-user' => 'Kaca pamaké',
-'vector-view-create' => 'Jieun',
-'vector-view-edit' => 'Édit',
-'vector-view-history' => 'Témbongkeun jujutan',
-'vector-view-view' => 'Baca',
-'vector-view-viewsource' => 'Témbongkeun sumber',
-'actions' => 'Peta',
-'namespaces' => 'Spasi ngaran',
-'variants' => 'Varian',
+'vector-action-addsection' => 'Jieun jejer anyar',
+'vector-action-delete' => 'Hapus',
+'vector-action-move' => 'Pindahkeun',
+'vector-action-protect' => 'Konci',
+'vector-action-undelete' => 'Bolaykeun ngahapus',
+'vector-action-unprotect' => 'Buka konci',
+'vector-view-create' => 'Jieun',
+'vector-view-edit' => 'Édit',
+'vector-view-history' => 'Témbongkeun jujutan',
+'vector-view-view' => 'Baca',
+'vector-view-viewsource' => 'Témbongkeun sumber',
+'actions' => 'Peta',
+'namespaces' => 'Spasi ngaran',
+'variants' => 'Varian',
'errorpagetitle' => 'Kasalahan',
'returnto' => 'Balik deui ka $1.',
@@ -368,6 +356,7 @@ Loba teuing nu nyoba muka ieu kaca.
Mangga cobian sanés waktos.
$1',
+'pool-errorunknown' => 'Éror teu dipikawanoh',
# 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' => 'Ngeunaan {{SITENAME}}',
@@ -527,7 +516,8 @@ Tong hilap ngarobih [[Special:Preferences|{{SITENAME}} préferénsi]] anjeun.',
'yourname' => 'Ngaran pamaké anjeun',
'yourpassword' => 'Sandi anjeun',
'yourpasswordagain' => 'Ketik deui sandi anjeun',
-'remembermypassword' => 'Inget sandi kuring nembus rintakan.',
+'remembermypassword' => 'Apalkeun login kuring dina ieu komputer (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})',
+'securelogin-stick-https' => 'Terus nyambung ka HTTPS sanggeus login',
'yourdomainname' => 'Domain anjeun',
'externaldberror' => 'Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa rekening luar anjeun.',
'login' => 'Asup log',
@@ -544,6 +534,7 @@ Tong hilap ngarobih [[Special:Preferences|{{SITENAME}} préferénsi]] anjeun.',
'gotaccount' => "Geus boga rekening? '''$1'''.",
'gotaccountlink' => 'Asup log',
'createaccountmail' => 'ku surélék',
+'createaccountreason' => 'Alesan:',
'badretype' => 'Sandi nu diasupkeun teu cocog.',
'userexists' => 'Ngaran pamaké nu diasupkeun ku anjeun geus aya nu maké.
Mangga pilih ngaran nu séjén.',
@@ -564,6 +555,7 @@ Pariksa éjahanana, atawa paké formulir di handap pikeun [[Special:UserLogin/si
'wrongpasswordempty' => 'Sandina can kaeusian. Cobaan deui!',
'passwordtooshort' => 'Sandina kudu diwangun ku sahanteuna {{PLURAL:$1|1 karakter|$1 karakter}}.',
'password-name-match' => 'Sandi anjeun kudu béda ti landihan.',
+'password-login-forbidden' => 'Sandiasma jeung sandina teu bisa dipaké.',
'mailmypassword' => 'Kirim sandi anyar ngaliwatan surélék',
'passwordremindertitle' => 'Pangéling sandi ti {{SITENAME}}',
'passwordremindertext' => 'Aya (jigana anjeun ti alamat IP $1) nu ménta sangkan dikiriman sandi anyar asup log {{SITENAME}} ($4). Saheulaanan, sandi anyar keur pamaké "$2" ayeuna diganti jadi "$3". Anjeun kudu asup log sarta ngarobah sandi anjeun ayeuna. Ieu sandi bakal kadaluwarsa dina {{PLURAL:$5|sapoé|$5 poé}}.
@@ -648,6 +640,7 @@ Bisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.
'showlivepreview' => 'Pramidang saharita',
'showdiff' => 'Témbongkeun parobahan',
'anoneditwarning' => "'''Perhatosan:''' Anjeun can asup log. IP anjeun kacatet dina jujutan kaca ieu",
+'anonpreviewwarning' => '"Anjeun can asup log. Mun disimpen, alamat IP anjeun bakal kacatet dina jujutan ieu kaca."',
'missingsummary' => "'''Pépéling:''' Anjeun can ngeusian sari éditan. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa sari éditan",
'missingcommenttext' => 'Mangga tulis koméntar di handapeun ieu.',
'missingcommentheader' => "'''Pépéling:''' Anjeun can ngeusian judul pikeun ieu koméntar. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa judul.",
@@ -722,7 +715,11 @@ Pikeun rujukan, éntri log panungtung dipidangkeun di handap:',
'userjsyoucanpreview' => "Tip:''' Paké tombol \"{{int:showpreview}}\" pikeun nyobaan JavaScript anyar anjeun méméh nyimpen.",
'usercsspreview' => "'''Inget yén anjeun ukur nyawang css pamaké anjeun, can disimpen!'''",
'userjspreview' => "'''Inget yén anjeun ukur nguji/nyawang ''javascript'' pamaké anjeun, can disimpen!'''",
-'userinvalidcssjstitle' => "'''Awas''': kulit \"\$1\" mah teu aya. Sing émut yén kaca .css jeung .js mah migunakeun aksara leutik dina judulna, contona baé {{ns:user}}:Foo/monobook.css lawan {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Inget yén ieu CSS ukur pramidang.'''
+'''Can disimpen!'''",
+'sitejspreview' => "'''Inget yén ieu kodeu JavaScript ukur pramidang.'''
+'''Can disimpen!'''",
+'userinvalidcssjstitle' => "'''Awas''': kulit \"\$1\" mah teu aya. Sing émut yén kaca .css jeung .js mah migunakeun aksara leutik dina judulna, contona baé {{ns:user}}:Foo/vector.css lawan {{ns:user}}:Foo/Vector.css.",
'updated' => '(Geus diropéa)',
'note' => "'''Catetan:'''",
'previewnote' => "'''Inget yén ieu ukur sawangan, can disimpen!'''",
@@ -752,7 +749,6 @@ Anjeun ogé jangji yén tulisan ieu dijieun ku sorangan, atawa disalin ti ''doma
'copyrightwarning2' => "Catet yén sadaya kontribusi ka {{SITENAME}} bisa diédit, dirobah, atawa dihapus ku kontributor séjén. Mun anjeun teu miharep tulisan anjeun dirobah, ulah ngintunkeun ka dieu.<br />
Anjeun ogé mastikeun yén ieu téh pituin tulisan anjeun, atawa salinan ti domain umum atawa sumberdaya bébas séjénna (tempo $1 pikeun écésna).
'''ULAH NGINTUNKEUN KARYA NU MIBANDA HAK CIPTA TANPA WIDI!'''",
-'longpagewarning' => 'PERHATOSAN: Kaca ieu panjangna $1 kb; sababaraha panyungsi boga masalah dina ngédit kaca nu panjangna nepi ka 32 kb. Mun bisa mah bagi-bagi ieu kaca jadi sababaraha bab.',
'longpageerror' => "'''SALAH: Téks anu dikirimkeun gedéna $1 kb, leuwih ti maksimum $2 kb. Téks teu bisa disimpen.'''",
'readonlywarning' => "'''PERHATOSAN''': pangkalan data dikonci pikeun diropéa, anjeun moal bisa nyimpen éditan anjeun ayeuna. Cobi ''cut-n-paste'' téksna ka na koropak téks sarta simpen dina waktu séjén.
@@ -909,6 +905,8 @@ $1",
'logdelete-failure' => "'''Visibilitas log teu bisa disét:'''
$1",
'revdel-restore' => 'robah panémbong',
+'revdel-restore-deleted' => 'révisi nu dihapus',
+'revdel-restore-visible' => 'révisi nu katémbong',
'pagehist' => 'Sajarah kaca',
'deletedhist' => 'Sajarah nu dihapus',
'revdelete-content' => 'eusi',
@@ -972,11 +970,13 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
# Diffs
'history-title' => 'Jujutan révisi "$1"',
'difference' => '(Béda antarrévisi)',
+'difference-multipage' => '(béda antarkaca)',
'lineno' => 'Baris ka-$1:',
'compareselectedversions' => 'Bandingkeun vérsi nu dipilih',
'showhideselectedversions' => 'Témbongkeun/sumputkeun révisi nu dipilih',
'editundo' => 'bolaykeun',
-'diff-multi' => '({{PLURAL:$1|Hiji|$1}} révisi antara teu ditembongkeun.)',
+'diff-multi' => '({{PLURAL:$1|Hiji révisi antara|$1 révisi antara}} karya {{PLURAL:$2|hiji pamaké|$2 pamaké}} teu ditémbongkeun)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Hiji révisi antara|$1 révisi antara}} karya leuwih ti {{PLURAL:$2|pamaké|pamaké}} teu ditémbongkeun)',
# Search results
'searchresults' => 'Hasil néangan',
@@ -1010,6 +1010,7 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
'searchprofile-images-tooltip' => 'Pilari koropak/file',
'searchprofile-everything-tooltip' => 'Pilari di sakabéh eusi (kaasup kaca obrolan)',
'search-result-size' => '$1 ({{PLURAL:$2|1 kecap|$2 kecap}})',
+'search-result-category-size' => '{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})',
'search-result-score' => 'Kacocogan: $1%',
'search-redirect' => '(alihan $1)',
'search-section' => '(bagean $1)',
@@ -1083,6 +1084,7 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
'contextlines' => 'Jumlah baris sakali némbongan',
'contextchars' => 'Karakter kontéks per baris',
'stub-threshold' => 'Wates ambang pikeun format <a href="#" class="stub">tumbu taratas</a> (bit):',
+'stub-threshold-disabled' => 'Tumpur',
'recentchangesdays' => 'Jumlah poé nu dipidangkeun dina Nu anyar robah:',
'recentchangesdays-max' => 'Panglilana $1 {{PLURAL:$1|poé|poé}}',
'recentchangescount' => 'Jumlah éditan anu ditémbongkeun ceuk bawaanana:',
@@ -1146,8 +1148,15 @@ Mun geus anggeus teu bisa dibolaykeun.',
'prefs-advancedrendering' => 'Pilihan lengkep',
'prefs-advancedsearchoptions' => 'Pilihan lengkep',
'prefs-advancedwatchlist' => 'Pilihan lengkep',
+'prefs-displayrc' => 'Pilihan pidangan',
+'prefs-displaysearchoptions' => 'Pilihan pidangan',
+'prefs-displaywatchlist' => 'Pilihan pidangan',
'prefs-diffs' => 'Béda',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Alamat surélék sigana bener',
+'email-address-validity-invalid' => 'Asupkeun alamat ratron nu bener',
+
# User rights
'userrights' => 'Manajemén hak pamaké',
'userrights-lookup-user' => 'Atur gorombolan pamaké',
@@ -1276,11 +1285,8 @@ Mun geus anggeus teu bisa dibolaykeun.',
'recentchanges-legend' => 'Pilihan parobahan anyar',
'recentchangestext' => 'Lacak parobahan ka wiki panganyarna na kaca ieu.',
'recentchanges-feed-description' => 'Manggihan parobahan panganyarna dina wiki di asupan ieu.',
-'recentchanges-legend-newpage' => '$1 - kaca anyar',
'recentchanges-label-newpage' => 'Ieu parobahan bakal ngahasillkeun kaca anyar',
-'recentchanges-legend-minor' => '$1 - éditan minor',
'recentchanges-label-minor' => 'Ieu éditan minor',
-'recentchanges-legend-bot' => '$1 - robahan bot',
'recentchanges-label-bot' => 'Ieu parobahan dijieun ku bot',
'rcnote' => "Di handap ieu {{PLURAL:$1|'''1''' parobahan| '''$1''' parobahan anyar}} dina {{PLURAL:$2|poé|'''$2''' poé}} ahir, nepi $5, $4.",
'rcnotefrom' => 'Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).',
@@ -1324,6 +1330,9 @@ Mun geus anggeus teu bisa dibolaykeun.',
'uploadnologintext' => 'Anjeun kudu [[Special:UserLogin|asup log]] pikeun ngamuat koropak.',
'upload_directory_read_only' => 'Diréktori muatan ($1) teu bisa ditulis ku server ramat.',
'uploaderror' => 'Kasalahan muat',
+'upload-recreate-warning' => "'''Awas: berkas nu ngaranna kitu geus kungsi dihapus atawa dipindahkeun.'''
+
+Log hahapus jeung pipindah pikeun ieu kaca dipidangkeun di handap:",
'uploadtext' => "<strong>HEUP!</strong> Méméh anjeun ngamuat di dieu, pastikeun yén anjeun geus maca sarta tumut ka kawijakan maké gambar.
Mun geus aya koropak na wiki nu ngaranna sarua jeung nu disebutkeun ku anjeun, koropak nu geus lila bakal diganti otomatis. Mangka, iwal ti pikeun ngaropéa hiji koropak, tangtu leuwih hadé mun anjeun mariksa heula bisi koropak nu sarupa geus aya.
@@ -1362,6 +1371,13 @@ Catet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anje
'filetype-banned-type' => "'''\".\$1\"''' kaasup tipeu koropak nu teu dicaram.
{{PLURAL:\$3|Nu diwidian nyaéta|Nu diwidian nyaéta}} \$2.",
'filetype-missing' => 'Koropakna teu boga éksténsi (misalna ".jpg").',
+'empty-file' => 'Berkas nu dikirim kosong.',
+'file-too-large' => 'Berkas nu dikirim gedé teuing.',
+'filename-tooshort' => 'Ngaran berkas pondok teuing.',
+'filetype-banned' => 'Jenis berkas ieu dipahing.',
+'verification-error' => 'Ieu berkas teu lulus vérifikasi.',
+'illegal-filename' => 'Ngaran berkas dipahing.',
+'tmp-create-error' => 'Teu bisa nyieun berkas sementara.',
'large-file' => 'Hadéna mah koropak nu dimuat téh teu leuwih ti $1 bit; ieu koropak gedéna $2 bit.',
'largefileserver' => 'Ieu koropak badag teuing, ngaleuwihan wates nu diwenangkeun ku server.',
'emptyfile' => "Koropak nu dimuatkeun ku anjeun jigana kosong. Hal ieu bisa jadi alatan sarupaning ''typo'' na ngaran koropakna. Mangga parios deui yén anjeun leres-leres hoyong ngamuat koropak éta.",
@@ -1374,7 +1390,6 @@ Pilih ngaran séjén.",
'fileexists-forbidden' => 'Koropak nu ngaranna ieu geus aya; mangga balik deui sarta muatkeun koropakna maké ngaran nu béda. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => "Koropak nu ngaranna ieu geus aya dina gudang koropak babagi (''shared file repository''); mangga balik deui sarta muatkeun koropak ieu maké ngaran nu béda. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Gambar ieu duplikat sareng {{PLURAL:$1|gambar|gambar}}:',
-'successfulupload' => 'Ngamuat geus hasil',
'uploadwarning' => 'Pépéling ngamuat',
'uploadwarning-text' => 'Ropéa pedaran berkas di handap terus cobaan deui.',
'savefile' => 'Simpen koropak',
@@ -1393,6 +1408,7 @@ Pilih ngaran séjén.",
'upload-options' => 'Pilihan muat',
'watchthisupload' => 'Awaskeun ieu kaca',
'filewasdeleted' => 'Ngaran koropak ieu geus di hapus. Anjeun kudu ningali ka $1 sa acan muatkeun koropak deui',
+'upload-success-subj' => 'Ngamuat geus hasil',
'upload-proto-error' => 'Salah protokol',
'upload-file-error' => 'Kasalahan internal',
@@ -1518,7 +1534,6 @@ Saméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.',
'statistics-pages' => 'Kaca',
'statistics-pages-desc' => 'Sakabéh kaca di ieu wiki, kaasup kaca obrolan, alihan, jeung nu lianna.',
'statistics-files' => 'Koropak nu geus dimuat',
-'statistics-jobqueue' => 'Panjang [http://www.mediawiki.org/wiki/Manual:Job_queue antrian pagawéan]',
'statistics-users-active' => 'Pamaké getol',
'statistics-mostpopular' => 'Kaca nu pangmindengna dibuka',
@@ -1709,7 +1724,6 @@ Alamat surélék nu diasupkeun kana [[Special:Preferences|préferénsi pamaké a
# Watchlist
'watchlist' => 'Awaskeuneun',
'mywatchlist' => 'Awaskeuneun',
-'watchlistfor' => "(keur '''$1''')",
'nowatchlist' => 'Anjeun teu boga awaskeuneun.',
'watchlistanontext' => 'Mangga $1 pikeun némbongkeun atawa ngarobah béréndélan awaskeuneun anjeun.',
'watchnologin' => 'Can asup log',
@@ -1817,7 +1831,9 @@ Hal ieu teu diwenangkeun pikeun nyegah karuksakan {{SITENAME}} nu teu dihaja.',
'editcomment' => "Komentar ngéditna: \"''\$1''\".",
'revertpage' => 'Malikkeun éditan $2, diganti deui ka vérsi ahir ku $1',
'rollback-success' => 'Mulangkeun éditan $1; balik deui ka vérsi panungtung ku $2.',
-'sessionfailure' => 'Sigana aya masalah jeung termin log anjeun; peta ieu geus dibolaykeun salaku pépéling pikeun ngalawan ayana pangbajak. Mangga pencét "back" jeung muat ulang ti kaca asal anjeun, lajeng cobaan deui.',
+
+# Edit tokens
+'sessionfailure' => 'Sigana aya masalah jeung termin log anjeun; peta ieu geus dibolaykeun salaku pépéling pikeun ngalawan ayana pangbajak. Mangga pencét "back" jeung muat ulang ti kaca asal anjeun, lajeng cobaan deui.',
# Protect
'protectlogpage' => 'Log_koncian',
@@ -1989,7 +2005,6 @@ Pikeun rujukan, éntri log panungtung dipidangkeun di handap:',
'ipb-edit-dropdown' => 'Édit alesan meungpeuk',
'ipb-unblock-addr' => 'Buka peungpeuk $1',
'ipb-unblock' => 'Nyabut peungpeuk pamaké atawa alamat IP',
-'ipb-blocklist-addr' => 'Tempo peungpeuk nu diterapkeun keur $1',
'ipb-blocklist' => 'Tempo peungpeuk nu diteurapkeun',
'ipb-blocklist-contribs' => 'Ilubiung $1',
'unblockip' => 'Buka peungpeuk pamaké',
@@ -2353,10 +2368,10 @@ $1',
# Media information
'imagemaxsize' => 'Watesan gambar na kaca dadaran gambar nepi ka:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|kaca|kaca}}',
-'file-info' => '(ukuran koropak: $1, tipeu MIME: $2)',
-'file-info-size' => '($1 × $2 piksel, ukuran koropak: $3, tipeu MIME: $4)',
+'file-info' => 'ukuran koropak: $1, tipeu MIME: $2',
+'file-info-size' => '$1 × $2 piksel, ukuran koropak: $3, tipeu MIME: $4',
'file-nohires' => '<small>Euweuh résolusi nu leuwih luhur.</small>',
-'svg-long-desc' => '(Koropak SVG, nominalna $1 × $2 piksel, ukuranana $3)',
+'svg-long-desc' => 'Koropak SVG, nominalna $1 × $2 piksel, ukuranana $3',
'show-big-image' => 'Résolusi pinuh',
'show-big-image-thumb' => '<small>Ukuran ieu pidangan: $1 × $2 piksel</small>',
@@ -2743,6 +2758,13 @@ Coba ku sawangan normal.',
'tags-edit' => 'édit',
'tags-hitcount' => '$1 {{PLURAL:$1|parobahan|parobahan}}',
+# Special:ComparePages
+'compare-page1' => 'Kaca 1',
+'compare-page2' => 'Kaca 2',
+'compare-rev1' => 'Révisi 1',
+'compare-rev2' => 'Révisi 2',
+'compare-submit' => 'Bandingkeun',
+
# Database error messages
'dberr-header' => 'Aya masalah dina ieu wiki',
'dberr-problems' => 'Punten! Nuju aya gangguan téhnis.',
diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php
index 4da0595a..18e72285 100644
--- a/languages/messages/MessagesSv.php
+++ b/languages/messages/MessagesSv.php
@@ -9,6 +9,7 @@
*
* @author Ainali
* @author Boivie
+ * @author Dafer45
* @author EPO
* @author Fluff
* @author GameOn
@@ -36,6 +37,7 @@
* @author Skalman
* @author StefanB
* @author Steinninn
+ * @author Str4nd
* @author Tobulos1
* @author Where next Columbus
* @author Where next Columbus?
@@ -69,59 +71,59 @@ $namespaceAliases = array(
'Hjälp_diskussion' => NS_HELP_TALK
);
+#!!# Translation <b>Prefixindex</b> for <a href="#mw-sp-magic-Prefixindex">Prefixindex</a> is not in normalised form, which is <b>PrefixIndex</b>
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dubbla omdirigeringar' ),
- 'BrokenRedirects' => array( 'Trasiga omdirigeringar', 'DÃ¥liga omdirigeringar' ),
+ 'DoubleRedirects' => array( 'Dubbla_omdirigeringar' ),
+ 'BrokenRedirects' => array( 'Trasiga_omdirigeringar', 'DÃ¥liga_omdirigeringar' ),
'Disambiguations' => array( 'Förgreningssidor' ),
'Userlogin' => array( 'Inloggning' ),
'Userlogout' => array( 'Utloggning' ),
- 'CreateAccount' => array( 'Skapa konto' ),
+ 'CreateAccount' => array( 'Skapa_konto' ),
'Preferences' => array( 'Inställningar' ),
'Watchlist' => array( 'Bevakningslista', 'Övervakningslista' ),
- 'Recentchanges' => array( 'Senaste ändringar' ),
+ 'Recentchanges' => array( 'Senaste_ändringar' ),
'Upload' => array( 'Uppladdning' ),
'Listfiles' => array( 'Fillista', 'Bildlista' ),
- 'Newimages' => array( 'Nya bilder' ),
+ 'Newimages' => array( 'Nya_bilder' ),
'Listusers' => array( 'Användare', 'Användarlista' ),
'Listgrouprights' => array( 'Grupprättighetslista' ),
'Statistics' => array( 'Statistik' ),
'Randompage' => array( 'Slumpsida' ),
- 'Lonelypages' => array( 'Övergivna sidor', 'Sidor utan länkar till' ),
- 'Uncategorizedpages' => array( 'Okategoriserade sidor' ),
- 'Uncategorizedcategories' => array( 'Okategoriserade kategorier' ),
- 'Uncategorizedimages' => array( 'Okategoriserade filer', 'Okategoriserade bilder' ),
- 'Uncategorizedtemplates' => array( 'Okategoriserade mallar' ),
- 'Unusedcategories' => array( 'Oanvända kategorier' ),
- 'Unusedimages' => array( 'Oanvända filer', 'Oanvända bilder' ),
- 'Wantedpages' => array( 'Önskade sidor', 'Trasiga länkar' ),
- 'Wantedcategories' => array( 'Önskade kategorier' ),
- 'Wantedfiles' => array( 'Önskade filer' ),
- 'Wantedtemplates' => array( 'Önskade mallar' ),
- 'Mostlinked' => array( 'Mest länkade sidor' ),
- 'Mostlinkedcategories' => array( 'Största kategorier' ),
- 'Mostlinkedtemplates' => array( 'Mest använda mallar' ),
- 'Mostimages' => array( 'Mest länkade filer', 'Flest bilder' ),
- 'Mostcategories' => array( 'Flest kategorier' ),
- 'Mostrevisions' => array( 'Flest versioner' ),
- 'Fewestrevisions' => array( 'Minst versioner' ),
- 'Shortpages' => array( 'Korta sidor' ),
- 'Longpages' => array( 'LÃ¥nga sidor' ),
- 'Newpages' => array( 'Nya sidor' ),
- 'Ancientpages' => array( 'Gamla sidor' ),
- 'Deadendpages' => array( 'Sidor utan länkar', 'Sidor utan länkar från' ),
- 'Protectedpages' => array( 'Skyddade sidor' ),
- 'Protectedtitles' => array( 'Skyddade titlar' ),
- 'Allpages' => array( 'Alla sidor' ),
- 'Prefixindex' => array( 'Prefixindex' ),
+ 'Lonelypages' => array( 'Föräldralösa_sidor', 'Övergivna_sidor', 'Sidor_utan_länkar_till' ),
+ 'Uncategorizedpages' => array( 'Okategoriserade_sidor' ),
+ 'Uncategorizedcategories' => array( 'Okategoriserade_kategorier' ),
+ 'Uncategorizedimages' => array( 'Okategoriserade_filer', 'Okategoriserade_bilder' ),
+ 'Uncategorizedtemplates' => array( 'Okategoriserade_mallar' ),
+ 'Unusedcategories' => array( 'Oanvända_kategorier' ),
+ 'Unusedimages' => array( 'Oanvända_filer', 'Oanvända_bilder' ),
+ 'Wantedpages' => array( 'Önskade_sidor', 'Trasiga_länkar' ),
+ 'Wantedcategories' => array( 'Önskade_kategorier' ),
+ 'Wantedfiles' => array( 'Önskade_filer' ),
+ 'Wantedtemplates' => array( 'Önskade_mallar' ),
+ 'Mostlinked' => array( 'Mest_länkade_sidor' ),
+ 'Mostlinkedcategories' => array( 'Största_kategorier' ),
+ 'Mostlinkedtemplates' => array( 'Mest_använda_mallar' ),
+ 'Mostimages' => array( 'Mest_länkade_filer', 'Flest_bilder' ),
+ 'Mostcategories' => array( 'Flest_kategorier' ),
+ 'Mostrevisions' => array( 'Flest_versioner' ),
+ 'Fewestrevisions' => array( 'Minst_versioner' ),
+ 'Shortpages' => array( 'Korta_sidor' ),
+ 'Longpages' => array( 'LÃ¥nga_sidor' ),
+ 'Newpages' => array( 'Nya_sidor' ),
+ 'Ancientpages' => array( 'Gamla_sidor' ),
+ 'Deadendpages' => array( 'Sidor_utan_länkar', 'Sidor_utan_länkar_från' ),
+ 'Protectedpages' => array( 'Skyddade_sidor' ),
+ 'Protectedtitles' => array( 'Skyddade_titlar' ),
+ 'Allpages' => array( 'Alla_sidor' ),
'Ipblocklist' => array( 'Blockeringslista' ),
'Specialpages' => array( 'Specialsidor' ),
'Contributions' => array( 'Bidrag' ),
'Emailuser' => array( 'E-mail' ),
- 'Confirmemail' => array( 'Bekräfta epost' ),
- 'Whatlinkshere' => array( 'Länkar hit' ),
- 'Recentchangeslinked' => array( 'Senaste relaterade ändringar' ),
+ 'Confirmemail' => array( 'Bekräfta_epost' ),
+ 'Whatlinkshere' => array( 'Länkar_hit' ),
+ 'Recentchangeslinked' => array( 'Senaste_relaterade_ändringar' ),
'Movepage' => array( 'Flytta' ),
- 'Blockme' => array( 'Blockera mig' ),
+ 'Blockme' => array( 'Blockera_mig' ),
'Booksources' => array( 'Bokkällor' ),
'Categories' => array( 'Kategorier' ),
'Export' => array( 'Exportera' ),
@@ -130,32 +132,32 @@ $specialPageAliases = array(
'Blockip' => array( 'Blockera' ),
'Undelete' => array( 'Återställ' ),
'Import' => array( 'Importera' ),
- 'Lockdb' => array( 'LÃ¥s databasen' ),
- 'Unlockdb' => array( 'LÃ¥s upp databasen' ),
+ 'Lockdb' => array( 'LÃ¥s_databasen' ),
+ 'Unlockdb' => array( 'LÃ¥s_upp_databasen' ),
'Userrights' => array( 'Rättigheter' ),
'MIMEsearch' => array( 'MIME-sökning' ),
'FileDuplicateSearch' => array( 'Dublettfilsökning' ),
- 'Unwatchedpages' => array( 'Obevakade sidor' ),
+ 'Unwatchedpages' => array( 'Obevakade_sidor' ),
'Listredirects' => array( 'Omdirigeringar' ),
- 'Revisiondelete' => array( 'Radera version' ),
- 'Unusedtemplates' => array( 'Oanvända mallar' ),
+ 'Revisiondelete' => array( 'Radera_version' ),
+ 'Unusedtemplates' => array( 'Oanvända_mallar' ),
'Randomredirect' => array( 'Slumpomdirigering' ),
- 'Mypage' => array( 'Min sida' ),
- 'Mytalk' => array( 'Min diskussion' ),
- 'Mycontributions' => array( 'Mina bidrag' ),
+ 'Mypage' => array( 'Min_sida' ),
+ 'Mytalk' => array( 'Min_diskussion' ),
+ 'Mycontributions' => array( 'Mina_bidrag' ),
'Listadmins' => array( 'Administratörer' ),
'Listbots' => array( 'Robotlista' ),
- 'Popularpages' => array( 'Populära sidor' ),
+ 'Popularpages' => array( 'Populära_sidor' ),
'Search' => array( 'Sök' ),
- 'Resetpass' => array( 'Återställ lösenord' ),
- 'Withoutinterwiki' => array( 'Utan interwikilänkar' ),
- 'MergeHistory' => array( 'Slå ihop historik' ),
+ 'Resetpass' => array( 'Återställ_lösenord' ),
+ 'Withoutinterwiki' => array( 'Utan_interwikilänkar' ),
+ 'MergeHistory' => array( 'Slå_ihop_historik' ),
'Filepath' => array( 'Filsökväg' ),
- 'Invalidateemail' => array( 'Ogiltigförklara epost' ),
- 'Blankpage' => array( 'Tom sida' ),
+ 'Invalidateemail' => array( 'Ogiltigförklara_epost' ),
+ 'Blankpage' => array( 'Tom_sida' ),
'LinkSearch' => array( 'Länksökning' ),
- 'DeletedContributions' => array( 'Raderade bidrag' ),
- 'Tags' => array( 'Taggar' ),
+ 'DeletedContributions' => array( 'Raderade_bidrag' ),
+ 'Tags' => array( 'Märken', 'Taggar' ),
);
$magicWords = array(
@@ -251,7 +253,7 @@ $magicWords = array(
'revisionyear' => array( '1', 'REVISIONSÃ…R', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'REVISIONSTIDSSTÄMPEL', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'REVISIONSANVÄNDARE', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'FULLURL:. FULLTURL:', 'FULLURL:' ),
+ 'fullurl' => array( '0', 'FULLTURL:', 'FULLURL:' ),
'fullurle' => array( '0', 'FULLTURLE:', 'FULLURLE:' ),
'lcfirst' => array( '0', 'LBFÖRST:', 'LCFIRST:' ),
'ucfirst' => array( '0', 'UCFIRST', 'SBFÖRST:', 'UCFIRST:' ),
@@ -318,8 +320,7 @@ $messages = array(
'tog-editsection' => 'Aktivera redigering av avsnitt genom [redigera]-länkar',
'tog-editsectiononrightclick' => 'Aktivera redigering av avsnitt genom högerklick på underrubriker (Javascript)',
'tog-showtoc' => 'Visa innehållsförteckning (för sidor som har minst fyra rubriker)',
-'tog-rememberpassword' => 'Kom ihåg lösenordet till nästa besök',
-'tog-editwidth' => 'Utvidga redigeringsrutan till att fylla hela skärmen',
+'tog-rememberpassword' => 'Kom ihåg min inloggning på den här webbläsaren (i maximalt $1 {{PLURAL:$1|dag|dagar}})',
'tog-watchcreations' => 'Lägg till sidor jag skapar i min bevakningslista',
'tog-watchdefault' => 'Lägg till sidor jag redigerar i min bevakningslista',
'tog-watchmoves' => 'Lägg till sidor jag flyttar i min bevakningslista',
@@ -467,31 +468,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Nytt ämne',
-'vector-action-delete' => 'Radera',
-'vector-action-move' => 'Flytta',
-'vector-action-protect' => 'Skrivskydda',
-'vector-action-undelete' => 'Återställ',
-'vector-action-unprotect' => 'Ta bort skrivskydd',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Hjälpsida',
-'vector-namespace-image' => 'Fil',
-'vector-namespace-main' => 'Sida',
-'vector-namespace-media' => 'Mediasida',
-'vector-namespace-mediawiki' => 'Systemmeddelande',
-'vector-namespace-project' => 'Projektsida',
-'vector-namespace-special' => 'Specialsida',
-'vector-namespace-talk' => 'Diskussion',
-'vector-namespace-template' => 'Mall',
-'vector-namespace-user' => 'Användarsida',
-'vector-view-create' => 'Skapa',
-'vector-view-edit' => 'Redigera',
-'vector-view-history' => 'Visa historik',
-'vector-view-view' => 'Visa',
-'vector-view-viewsource' => 'Visa källa',
-'actions' => 'Åtgärder',
-'namespaces' => 'Namnrymder',
-'variants' => 'Varianter',
+'vector-action-addsection' => 'Nytt ämne',
+'vector-action-delete' => 'Radera',
+'vector-action-move' => 'Flytta',
+'vector-action-protect' => 'Skrivskydda',
+'vector-action-undelete' => 'Återställ',
+'vector-action-unprotect' => 'Ta bort skrivskydd',
+'vector-simplesearch-preference' => 'Aktivera utökade sökförslag (endast Vector-utseendet)',
+'vector-view-create' => 'Skapa',
+'vector-view-edit' => 'Redigera',
+'vector-view-history' => 'Visa historik',
+'vector-view-view' => 'Visa',
+'vector-view-viewsource' => 'Visa källa',
+'actions' => 'Åtgärder',
+'namespaces' => 'Namnrymder',
+'variants' => 'Varianter',
'errorpagetitle' => 'Fel',
'returnto' => 'Tillbaka till $1.',
@@ -552,6 +543,9 @@ För många användare försöker visa denna sida.
Vänta en liten stund och försök igen lite senare.
$1',
+'pool-timeout' => 'Timeout i väntan på låsning',
+'pool-queuefull' => 'Kön är full',
+'pool-errorunknown' => 'Okänt fel',
# 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' => 'Om {{SITENAME}}',
@@ -714,7 +708,8 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
'yourname' => 'Användarnamn:',
'yourpassword' => 'Lösenord:',
'yourpasswordagain' => 'Upprepa lösenord',
-'remembermypassword' => 'Automatisk inloggning i framtiden.',
+'remembermypassword' => 'Spara min inloggning på den här datorn (i max $1 {{PLURAL:$1|dag|dagar}})',
+'securelogin-stick-https' => 'Fortsätt vara ansluten till HTTPS efter inloggning',
'yourdomainname' => 'Din domän',
'externaldberror' => 'Antingen inträffade autentiseringsproblem med en extern databas, eller så får du inte uppdatera ditt externa konto.',
'login' => 'Logga in',
@@ -731,6 +726,7 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
'gotaccount' => "Har du redan ett användarkonto? '''$1'''.",
'gotaccountlink' => 'Logga in',
'createaccountmail' => 'med e-post',
+'createaccountreason' => 'Orsak:',
'badretype' => 'De lösenord du uppgett överenstämmer inte med varandra.',
'userexists' => 'Det valda användarnamnet används redan.
Välj ett annat namn.',
@@ -754,6 +750,7 @@ Kontrollera din stavning, eller [[Special:UserLogin/signup|skapa ett nytt konto]
'wrongpasswordempty' => 'Lösenordet som angavs var blankt. Var god försök igen.',
'passwordtooshort' => 'Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.',
'password-name-match' => 'Ditt lösenord måste vara olikt ditt användarnamn.',
+'password-login-forbidden' => 'Användningen av dessa användarnamn och lösenord har förbjudits.',
'mailmypassword' => 'Skicka nytt lösenord',
'passwordremindertitle' => 'Nytt temporärt lösenord från {{SITENAME}}',
'passwordremindertext' => 'Någon (förmodligen du, från IP-adressen $1) har begärt ett nytt lösenord till {{SITENAME}} ($4). Ett tillfälligt lösenordet för användaren "$2" har skapats och det blev "$3". Om detta var vad du önskade, så behöver du nu logga in och välja ett nytt lösenord. Ditt tillfälliga lösenord går ut om {{PLURAL:$5|en dag|$5 dagar}}.
@@ -790,6 +787,9 @@ Vänta innan du försöker igen.',
'loginlanguagelabel' => 'Språk: $1',
'suspicious-userlogout' => 'Din begäran om att logga ut nekades eftersom det ser ut som det skickades av en trasig webbläsare eller cachande proxy.',
+# E-mail sending
+'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
+
# Password reset dialog
'resetpass' => 'Ändra lösenord',
'resetpass_announce' => 'Du loggade in med ett temporärt lösenord. För att slutföra inloggningen måste du välja ett nytt lösenord.',
@@ -842,10 +842,12 @@ Du kanske redan har lyckats ändra ditt lösenord eller begärt ett nytt tillfä
'showdiff' => 'Visa ändringar',
'anoneditwarning' => "'''Varning:''' Du är inte inloggad.
Din IP-adress kommer att sparas i historiken för den här sidan.",
+'anonpreviewwarning' => "''Du är inte inloggad. Vid spara kommer att din IP-adress registreras på denna sidas redigeringshistorik.''",
'missingsummary' => "'''Påminnelse:''' Du har inte skrivit någon redigeringskommentar.
Om du klickar på Spara igen, kommer din redigering att sparas utan en sådan.",
'missingcommenttext' => 'Var god och skriv in en kommentar nedan.',
-'missingcommentheader' => "'''OBS:''' Du har inte skrivit någon rubrik till den här kommentaren. Om du trycker på \"Spara\" igen, så sparas kommentaren utan någon rubrik.",
+'missingcommentheader' => "'''Påminnelse:''' Du har inte skrivit något ämne/rubrik för den här kommentaren.
+Om du trycker på \"{{int:savearticle}}\" igen, kommer din redigering sparas utan rubrik.",
'summary-preview' => 'Förhandsgranskning av sammanfattning:',
'subject-preview' => 'Rubrikförhandsgranskning:',
'blockedtitle' => 'Användaren är blockerad',
@@ -908,13 +910,21 @@ eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}
'userpage-userdoesnotexist-view' => 'Kontot "$1" är inte registrerat.',
'blocked-notice-logextract' => 'Användaren är blockerad.
Orsaken till senaste blockeringen kan ses nedan:',
-'clearyourcache' => "'''Observera: Sedan du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.''' '''Mozilla/Firefox/Safari:''' håll ner ''Skift'' och klicka på ''Reload'' eller tryck antingen ''Ctrl-F5'' eller ''Ctrl-R'' (''Command-R'' på Macintosh); '''Konqueror:''': klicka ''Reload'' eller tryck ''F5;'' '''Opera:''' rensa cachen i ''Tools → Preferences;'' '''Internet Explorer:''' håll ner ''Ctrl'' och klicka på ''Refresh'' eller tryck ''Ctrl-F5.''",
+'clearyourcache' => "'''Observera: Sedan du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.'''
+'''Mozilla/Firefox/Safari:''' håll ner ''Skift'' och klicka på ''Reload'' eller tryck antingen ''Ctrl-F5'' eller ''Ctrl-R'' (''Command-R'' på Macintosh);
+'''Konqueror:''': klicka ''Reload'' eller tryck ''F5;''
+'''Opera:''' rensa cachen i ''Tools → Preferences;''
+'''Internet Explorer:''' håll ner ''Ctrl'' och klicka på ''Refresh'' eller tryck ''Ctrl-F5.''",
'usercssyoucanpreview' => "'''Tips:''' Använd \"{{int:showpreview}}\"-knappen för att testa din nya css innan du sparar.",
'userjsyoucanpreview' => "'''Tips:''' Använd \"{{int:showpreview}}\"-knappen för att testa din nya JavaScript innan du sparar.",
'usercsspreview' => "'''Kom ihåg att du bara förhandsgranskar din användar-CSS.
Den har inte sparats än!'''",
'userjspreview' => "'''Kom ihåg att du bara testar/förhandsgranskar ditt JavaScript, det har inte sparats än!'''",
-'userinvalidcssjstitle' => "'''Varning:''' Skalet \"\$1\" finns inte. Kom ihåg att .css- och .js-sidor för enskilda användare börjar på liten bokstav. Exempel: {{ns:user}}:Foo/monobook.css i stället för {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''Kom ihåg att du bara förhandsgranskar detta CSS.'''
+'''Det har ännu inte sparats!'''",
+'sitejspreview' => "'''Kom ihåg att du bara förhandsgranskar denna JavaScript-kod.'''
+'''Det har ännu inte sparats!'''",
+'userinvalidcssjstitle' => "'''Varning:''' Skalet \"\$1\" finns inte. Kom ihåg att .css- och .js-sidor för enskilda användare börjar på liten bokstav. Exempel: {{ns:user}}:Foo/vector.css i stället för {{ns:user}}:Foo/Vector.css.",
'updated' => '(Uppdaterad)',
'note' => "'''Obs!'''",
'previewnote' => "'''Detta är bara en förhandsvisning;
@@ -953,9 +963,6 @@ Du lovar oss också att du skrev texten själv, eller kopierade från kulturellt
'copyrightwarning2' => "Observera att alla bidrag till {{SITENAME}} kan komma att redigeras, ändras, eller tas bort av andra deltagare. Om du inte vill se din text förändrad efter andras gottfinnade skall du inte skriva in någon text här.<br />
Du lovar oss också att du skrev texten själv, eller kopierade från kulturellt allmängods som inte skyddas av upphovsrätt, eller liknande källor - se $1 för detaljer.
'''LÄGG INTE UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN TILLÅTELSE!'''",
-'longpagewarning' => "'''VARNING: Den här sidan är $1 kilobyte lång;
-vissa webbläsare kan ha problem att redigera sidor som närmar sig eller är större än 32 kB.
-Överväg att bryta upp sidan i mindre delar.'''",
'longpageerror' => "'''FEL: Texten som du försöker spara är $1 kilobyte, vilket är mer än det maximalt tillåtna $2 kilobyte. Den kan inte sparas.'''",
'readonlywarning' => "'''VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.
Det kan vara klokt att kopiera över texten till din egen dator, tills databasen är upplåst igen.'''
@@ -1007,7 +1014,7 @@ Antalet anrop får vara högst $2, nu görs {{PLURAL:$#|$1 anrop}}.',
'expensive-parserfunction-category' => 'Sidor med för många resurskrävande parserfunktioner',
'post-expand-template-inclusion-warning' => 'Varning: Den här sidan innehåller för mycket mallinklusioner.
NÃ¥gra av mallarna kommer inte att inkluderas.',
-'post-expand-template-inclusion-category' => 'Sidor som inkluderar för mycket mallar',
+'post-expand-template-inclusion-category' => 'Sidor som inkluderar för mycket mallkod',
'post-expand-template-argument-warning' => 'Varning: Sidan innehåller en eller flera mallparametrar som blir för långa när de expanderas.
Dessa parametrar har uteslutits.',
'post-expand-template-argument-category' => 'Sidor med uteslutna mallparametrar',
@@ -1079,15 +1086,15 @@ Som administratör kan du se den; det kan finnas mer information i [{{fullurl:{{
Som administratör kan du se den; det kan finnas mer information i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].",
'rev-deleted-no-diff' => "Du kan inte se den här diffen på grund av att en av versionerna har '''raderats'''.
Det kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
-'rev-suppressed-no-diff' => "Du kan inte se skillnaden för en av revisionerna har blivit '''raderad'''.",
+'rev-suppressed-no-diff' => "Du kan inte se den här diffen för en av sidversionerna har '''raderats'''.",
'rev-deleted-unhide-diff' => "En av versionerna för den här diffen har '''raderats'''.
Det kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].
Som administratör kan du fortfarande [$1 se den här diffen] om du önskar att fortsätta.",
'rev-suppressed-unhide-diff' => "En av versionerna för denna diff har blivit '''undanhållen'''.
Det kan finnas detaljer i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].
Som administratör kan du fortfarande [$1 se denna diff] om du önskar fortsätta.",
-'rev-deleted-diff-view' => "En av revisionerna för denna diff har blivit '''raderad'''.
-Som en administratör kan du se denna diff, det kan finnas detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
+'rev-deleted-diff-view' => "En av sidversionerna i denna diff har '''raderats'''.
+Som administratör kan du se denna diff. Mer information kan finnas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
'rev-suppressed-diff-view' => "En av versionerna för denna diff har blivit '''undanhållen'''.
Som administratör kan du se denna diff; det kan finnas detaljer i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].",
'rev-delundel' => 'visa/göm',
@@ -1135,6 +1142,8 @@ $1",
'logdelete-failure' => "'''Loggens synlighet kunde inte ställas in:'''
$1",
'revdel-restore' => 'ändra synlighet',
+'revdel-restore-deleted' => 'borttagna versioner',
+'revdel-restore-visible' => 'synliga versioner',
'pagehist' => 'Sidhistorik',
'deletedhist' => 'Raderad historik',
'revdelete-content' => 'innehåll',
@@ -1203,11 +1212,13 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
# Diffs
'history-title' => 'Versionshistorik för "$1"',
'difference' => '(Skillnad mellan versioner)',
+'difference-multipage' => '(Skillnad mellan sidor)',
'lineno' => 'Rad $1:',
'compareselectedversions' => 'Jämför angivna versioner',
'showhideselectedversions' => 'Visa/dölj valda versioner',
'editundo' => 'gör ogjord',
-'diff-multi' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} visas inte.)',
+'diff-multi' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av {{PLURAL:$2|en användare|$2 användare}} visas inte)',
+'diff-multi-manyusers' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av mer än $2 {{PLURAL:$2|en användare|$2 användare}} visas inte)',
# Search results
'searchresults' => 'Sökresultat',
@@ -1242,6 +1253,7 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
'searchprofile-everything-tooltip' => 'Sök allt innehåll (inklusive diskussionssidor)',
'searchprofile-advanced-tooltip' => 'Sök i vissa namnrymder',
'search-result-size' => '$1 ({{PLURAL:$2|1 ord|$2 ord}})',
+'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmar}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})',
'search-result-score' => 'Relevans: $1%',
'search-redirect' => '(omdirigering $1)',
'search-section' => '(avsnitt $1)',
@@ -1318,6 +1330,7 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
'contextlines' => 'Antal rader per träff:',
'contextchars' => 'Tecken per rad:',
'stub-threshold' => 'Gräns för <a href="#" class="stub">stubblänk</a>-formatering (byte):',
+'stub-threshold-disabled' => 'Avaktiverat',
'recentchangesdays' => 'Antal dygn som skall visas i "senaste ändringarna":',
'recentchangesdays-max' => '(maximalt $1 {{PLURAL:$1|dygn|dygn}})',
'recentchangescount' => 'Antal redigeringar som visas som standard:',
@@ -1351,6 +1364,7 @@ Här är ett slumpmässigt genererat värde som du kan använda: $1',
'prefs-files' => 'Filer',
'prefs-custom-css' => 'personlig CSS',
'prefs-custom-js' => 'personlig JavaScript',
+'prefs-common-css-js' => 'Delad CSS/JS för alla teman:',
'prefs-reset-intro' => 'Du kan använda den här sidan till att återställa dina inställningar till webbplatsens standardinställningar.
Detta kan inte återställas.',
'prefs-emailconfirm-label' => 'E-postbekräftelse:',
@@ -1388,9 +1402,15 @@ Du kan också välja att låta andra användare kontakta dig genom din användar
'prefs-advancedrendering' => 'Avancerade alternativ',
'prefs-advancedsearchoptions' => 'Avancerade alternativ',
'prefs-advancedwatchlist' => 'Avancerade alternativ',
-'prefs-display' => 'Visningsalternativ',
+'prefs-displayrc' => 'Visningsalternativ',
+'prefs-displaysearchoptions' => 'Visningalternativ',
+'prefs-displaywatchlist' => 'Visningalternativ',
'prefs-diffs' => 'Skillnader',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Ser giltig ut',
+'email-address-validity-invalid' => 'Giltig adress krävs!',
+
# User rights
'userrights' => 'Hantering av användarrättigheter',
'userrights-lookup-user' => 'Hantera användargrupper',
@@ -1474,6 +1494,7 @@ Du kan också välja att låta andra användare kontakta dig genom din användar
'right-hideuser' => 'Blockera användarnamn och dölja det från blockeringsloggen',
'right-ipblock-exempt' => 'Kan redigera från blockerade IP-adresser',
'right-proxyunbannable' => 'Kan redigera från blockerade proxyer',
+'right-unblockself' => 'Avblockera sig själva',
'right-protect' => 'Ändra skyddsnivåer och redigera skyddade sidor',
'right-editprotected' => 'Redigera skyddade sidor',
'right-editinterface' => 'Redigera användargränssnittet',
@@ -1496,7 +1517,6 @@ Du kan också välja att låta andra användare kontakta dig genom din användar
'right-siteadmin' => 'Låsa och låsa upp databasen',
'right-reset-passwords' => 'Återställa andra användares lösenord',
'right-override-export-depth' => 'Exportera sidor inklusive länkade sidor till ett djup på 5',
-'right-versiondetail' => 'Visa den utökade mjukvaruversionsinformationen',
'right-sendemail' => 'Skicka e-post till andra användare',
# User rights log
@@ -1547,14 +1567,9 @@ Du kan också välja att låta andra användare kontakta dig genom din användar
'recentchanges-legend' => 'Alternativ för senaste ändringarna',
'recentchangestext' => 'Följ de senaste ändringarna i wikin på denna sida.',
'recentchanges-feed-description' => 'Följ de senaste ändringarna i wikin genom den här matningen.',
-'recentchanges-label-legend' => 'Förklaring: $1',
-'recentchanges-legend-newpage' => '$1 - ny sida',
'recentchanges-label-newpage' => 'Denna redigering skapade en ny sida',
-'recentchanges-legend-minor' => '$1 - mindre ändring',
'recentchanges-label-minor' => 'Detta är en mindre ändring',
-'recentchanges-legend-bot' => '$1 - botredigering',
'recentchanges-label-bot' => 'Denna redigering gjordes av en bot',
-'recentchanges-legend-unpatrolled' => '$1 - okontrollerad redigering',
'recentchanges-label-unpatrolled' => 'Denna redigering har inte blivit kontrollerad ännu',
'rcnote' => "Nedan visas {{PLURAL:$1|'''1''' ändring|de senaste '''$1''' ändringarna}} från {{PLURAL:$2|det senaste dygnet|de senaste '''$2''' dygnen}}, per $4, kl. $5.",
'rcnotefrom' => "Nedan visas ändringar sedan '''$2''' (upp till '''$1''' visas).",
@@ -1601,6 +1616,9 @@ Sidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil
'upload_directory_missing' => 'Uppladdningskatalogen ($1) saknas och kunde inte skapas av webbservern.',
'upload_directory_read_only' => 'Webbservern kan inte skriva till uppladdningskatalogen ($1).',
'uploaderror' => 'Fel vid uppladdningen',
+'upload-recreate-warning' => "'''Varning: En fil med det namnet har tagits bort eller flyttats.'''
+
+Raderings- och sidflyttningsloggen för denna sida återges här:",
'uploadtext' => "Använd formuläret nedan för att ladda upp filer.
För att titta på eller leta efter filer som redan har laddats upp, se [[Special:FileList|listan över uppladdade filer]]. Uppladdningar loggförs även i [[Special:Log/upload|uppladdningsloggen]], och raderingar i [[Special:Log/delete|raderingsloggen]].
@@ -1635,6 +1653,17 @@ Se [[Special:NewFiles|galleriet över nya filer]] för en mer visuell översikt.
'filetype-banned-type' => "'''\".\$1\"''' är inte en tillåten filtyp.
{{PLURAL:\$3|Tillåtna filtyper|Tillåten filtyp}} är \$2.",
'filetype-missing' => 'Filnamnet saknar ändelse (t ex ".jpg").',
+'empty-file' => 'Filen du skickade var tom.',
+'file-too-large' => 'Filen du skickade var för stor.',
+'filename-tooshort' => 'Filnamnet är för kort.',
+'filetype-banned' => 'Denna typ av fil är förbjuden.',
+'verification-error' => 'Denna fil klarade inte verifieringen.',
+'hookaborted' => 'Ändringen du försökte göra avbröts av en extension hook.',
+'illegal-filename' => 'Filnamnet är inte tillåtet.',
+'overwrite' => 'Det är inte tillåtet att skriva över en befintlig fil.',
+'unknown-error' => 'Ett okänt fel uppstod.',
+'tmp-create-error' => 'Kunde inte skapa temporär fil.',
+'tmp-write-error' => 'Fel vid skrivning av temporär fil.',
'large-file' => 'Det rekommenderas att filer inte är större än $1;
denna fil är $2.',
'largefileserver' => 'Denna fil är större än vad servern ställts in att tillåta.',
@@ -1662,13 +1691,14 @@ Om du fortfarande vill ladda upp din fil, var god gå tillbaka och välj ett nyt
Om du ändå vill ladda upp din fil, gå då tillbaka och använd ett annat namn. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Den här filen är en dubblett till följande {{PLURAL:$1|fil|filer}}:',
'file-deleted-duplicate' => 'En identisk fil till den här filen ([[:$1]]) har tidigare raderats. Du bör kontrollera den filens raderingshistorik innan du fortsätter att återuppladda den.',
-'successfulupload' => 'Uppladdningen lyckades',
'uploadwarning' => 'Uppladdningsvarning',
'uploadwarning-text' => 'Var god och ändra filbeskrivningen nedanför och försök igen.',
'savefile' => 'Spara fil',
'uploadedimage' => 'laddade upp "[[$1]]"',
'overwroteimage' => 'laddade upp ny version av "[[$1]]"',
'uploaddisabled' => 'Uppladdningsfunktionen är avstängd',
+'copyuploaddisabled' => 'Uppladdning med URL avstängt.',
+'uploadfromurl-queued' => 'Din uppladdning har lagts i kö.',
'uploaddisabledtext' => 'Uppladdning av filer är avstängd.',
'php-uploaddisabledtext' => 'PHP filuppladdningar är avaktiverade. Kolla inställningarna för file_uploads.',
'uploadscripted' => 'Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.',
@@ -1702,6 +1732,14 @@ JD # Jenoptik
MGP # Pentax
PICT # allmänt bildprefix
#</pre> <!-- ändra inte den här raden -->',
+'upload-success-subj' => 'Uppladdningen lyckades',
+'upload-success-msg' => 'Din uppladdning från [$2] lyckades. Den finns tillgänglig här: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Uppladdningsproblem',
+'upload-failure-msg' => 'Det uppstod ett problem med din uppladdning från [$2]:
+
+$1',
+'upload-warning-subj' => 'Uppladdningsvarning',
+'upload-warning-msg' => 'Det uppstod ett problem med din uppladdning från [$2]. Du kan återvända till [[Special:Upload/stash/$1|uppladdningsformuläret]] för att rätta till detta problem.',
'upload-proto-error' => 'Felaktigt protokoll',
'upload-proto-error-text' => 'Fjärruppladdning kräver URL:ar som börjar med <code>http://</code> eller <code>ftp://</code>.',
@@ -1764,6 +1802,7 @@ Genom att klicka på rubrikerna för kolumnerna kan man ändra sorteringsordning
'listfiles_search_for' => 'Sök efter filnamn:',
'imgfile' => 'fil',
'listfiles' => 'Fillista',
+'listfiles_thumb' => 'Miniatyrbild',
'listfiles_date' => 'Datum',
'listfiles_name' => 'Namn',
'listfiles_user' => 'Användare',
@@ -1877,8 +1916,8 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
'statistics-edits' => 'Sidredigeringar sedan {{SITENAME}} startades',
'statistics-edits-average' => 'Redigeringar per sida i genomsnitt',
'statistics-views-total' => 'Totalt antal sidvisningar',
+'statistics-views-total-desc' => 'Visningar av icke-existerande sidor och specialsidor ingår inte',
'statistics-views-peredit' => 'Antal sidvisningar per redigering',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Jobbköns] längd',
'statistics-users' => 'Registrerade [[Special:ListUsers|användare]]',
'statistics-users-active' => 'Aktiva användare',
'statistics-users-active-desc' => 'Användare som utfört någon åtgärd under {{PLURAL:$1|det senaste dygnet|de senaste $1 dagarna}}',
@@ -1892,7 +1931,7 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
'doubleredirects' => 'Dubbla omdirigeringar',
'doubleredirectstext' => 'Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt till målet för den andra omdirigeringen. Målet för den andra omdirigeringen är ofta den "riktiga" sidan, som den första omdirigeringen egentligen ska leda till.
-<s>Stryk över</s> poster som har åtgärdats.',
+<del>Stryk över</del> poster som har åtgärdats.',
'double-redirect-fixed-move' => '[[$1]] har flyttats, och är nu en omdirigering till [[$2]]',
'double-redirect-fixer' => 'Omdirigeringsrättaren',
@@ -1915,6 +1954,8 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmar}}',
'nrevisions' => '$1 {{PLURAL:$1|version|versioner}}',
'nviews' => '$1 {{PLURAL:$1|visning|visningar}}',
+'nimagelinks' => 'Använd på $1 {{PLURAL:$1|sida|sidor}}',
+'ntransclusions' => 'använd på $1 {{PLURAL:$1|sida|sidor}}',
'specialpage-empty' => 'Den här sidan är tom.',
'lonelypages' => 'Föräldralösa sidor',
'lonelypagestext' => 'Följande sidor länkas inte till från någon annan sida på {{SITENAME}}.',
@@ -2071,34 +2112,40 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
'listgrouprights-removegroup-self-all' => 'Kan ta bort alla grupperna från sitt eget konto',
# E-mail user
-'mailnologin' => 'Ingen adress att skicka till',
-'mailnologintext' => 'För att kunna skicka e-post till andra användare, måste du vara [[Special:UserLogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].',
-'emailuser' => 'Skicka e-post till den här användaren',
-'emailpage' => 'Skicka e-post till användare',
-'emailpagetext' => 'Du kan använda det här formuläret för att skicka e-post till den här användaren.
+'mailnologin' => 'Ingen adress att skicka till',
+'mailnologintext' => 'För att kunna skicka e-post till andra användare, måste du vara [[Special:UserLogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].',
+'emailuser' => 'Skicka e-post till den här användaren',
+'emailpage' => 'Skicka e-post till användare',
+'emailpagetext' => 'Du kan använda det här formuläret för att skicka e-post till den här användaren.
Den e-postadress du har angivit i [[Special:Preferences|dina användarinställningar]] kommer att visas som "Från"-adress i meddelandet, så att mottagaren har möjlighet att svara direkt till dig.',
-'usermailererror' => 'Fel i hanteringen av mail:',
-'defemailsubject' => '{{SITENAME}} e-post',
-'noemailtitle' => 'Ingen e-postadress',
-'noemailtext' => 'Den här användaren har inte angivit en giltig e-postadress.',
-'nowikiemailtitle' => 'Ingen e-post tillåten',
-'nowikiemailtext' => 'Den här användaren har valt att inte motta e-post från andra användare.',
-'email-legend' => 'Skicka ett mail till en annan användare på {{SITENAME}}',
-'emailfrom' => 'Från:',
-'emailto' => 'Till:',
-'emailsubject' => 'Ämne:',
-'emailmessage' => 'Meddelande:',
-'emailsend' => 'Skicka',
-'emailccme' => 'Skicka en kopia av meddelandet till mig.',
-'emailccsubject' => 'Kopia av ditt meddelande till $1: $2',
-'emailsent' => 'E-post har nu skickats',
-'emailsenttext' => 'Din e-post har skickats.',
-'emailuserfooter' => 'Detta e-brev skickades av $1 till $2 genom "Skicka e-post"-funktionen på {{SITENAME}}.',
+'usermailererror' => 'Fel i hanteringen av mail:',
+'defemailsubject' => '{{SITENAME}} e-post',
+'usermaildisabled' => 'Användar-epost avaktiverat',
+'usermaildisabledtext' => 'Du kan inte skicka e-post till andra användare på den här wikin',
+'noemailtitle' => 'Ingen e-postadress',
+'noemailtext' => 'Den här användaren har inte angivit en giltig e-postadress.',
+'nowikiemailtitle' => 'Ingen e-post tillåten',
+'nowikiemailtext' => 'Den här användaren har valt att inte motta e-post från andra användare.',
+'email-legend' => 'Skicka ett mail till en annan användare på {{SITENAME}}',
+'emailfrom' => 'Från:',
+'emailto' => 'Till:',
+'emailsubject' => 'Ämne:',
+'emailmessage' => 'Meddelande:',
+'emailsend' => 'Skicka',
+'emailccme' => 'Skicka en kopia av meddelandet till mig.',
+'emailccsubject' => 'Kopia av ditt meddelande till $1: $2',
+'emailsent' => 'E-post har nu skickats',
+'emailsenttext' => 'Din e-post har skickats.',
+'emailuserfooter' => 'Detta e-brev skickades av $1 till $2 genom "Skicka e-post"-funktionen på {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Lämnar systemmeddelande.',
+'usermessage-editor' => 'Systemmeddelare',
# Watchlist
'watchlist' => 'Bevakningslista',
'mywatchlist' => 'Min bevakningslista',
-'watchlistfor' => "(för '''$1''')",
+'watchlistfor2' => 'För $1 $2',
'nowatchlist' => 'Du har inga sidor i din bevakningslista.',
'watchlistanontext' => 'Du måste $1 för att se eller redigera din bevakningslista.',
'watchnologin' => 'Inte inloggad',
@@ -2158,6 +2205,9 @@ Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i di
Hälsningar från {{SITENAME}}s meddelandesystem
--
+För att ändra inställningarna för dina uppdateringar via e-post, besök
+{{fullurl:{{#special:Preferences}}}}
+
För att ändra inställningarna i din bevakningslista, besök
{{fullurl:{{#special:Watchlist}}/edit}}
@@ -2214,7 +2264,10 @@ Sidan ändrades senast av [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-
'revertpage-nouser' => 'Återställda redigeringar av (användarnamn borttaget) till senaste version av [[User:$1|$1]]',
'rollback-success' => 'Återställde ändringar av $1;
ändrade tillbaka till senaste version av $2.',
-'sessionfailure' => 'Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på "Tillbaka" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.',
+
+# Edit tokens
+'sessionfailure-title' => 'Sessionsfel',
+'sessionfailure' => 'Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på "Tillbaka" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.',
# Protect
'protectlogpage' => 'Skrivskyddslogg',
@@ -2343,19 +2396,23 @@ $1',
'month' => 'Från månad (och tidigare):',
'year' => 'Från år (och tidigare):',
-'sp-contributions-newbies' => 'Visa endast bidrag från nya konton',
-'sp-contributions-newbies-sub' => 'Från nya konton',
-'sp-contributions-newbies-title' => 'Bidrag från nya konton',
-'sp-contributions-blocklog' => 'blockeringslogg',
-'sp-contributions-deleted' => 'raderade användarbidrag',
-'sp-contributions-logs' => 'loggar',
-'sp-contributions-talk' => 'diskussion',
-'sp-contributions-userrights' => 'hantering av användarrättigheter',
-'sp-contributions-blocked-notice' => 'Användaren är blockerad.
+'sp-contributions-newbies' => 'Visa endast bidrag från nya konton',
+'sp-contributions-newbies-sub' => 'Från nya konton',
+'sp-contributions-newbies-title' => 'Bidrag från nya konton',
+'sp-contributions-blocklog' => 'blockeringslogg',
+'sp-contributions-deleted' => 'raderade användarbidrag',
+'sp-contributions-uploads' => 'uppladdningar',
+'sp-contributions-logs' => 'loggar',
+'sp-contributions-talk' => 'diskussion',
+'sp-contributions-userrights' => 'hantering av användarrättigheter',
+'sp-contributions-blocked-notice' => 'Användaren är blockerad.
Orsaken till senaste blockeringen kan ses nedan:',
-'sp-contributions-search' => 'Sök efter användarbidrag',
-'sp-contributions-username' => 'IP-adress eller användarnamn:',
-'sp-contributions-submit' => 'Sök',
+'sp-contributions-blocked-notice-anon' => 'Denna IP-adress är för närvarande blockerad.
+Den senaste posten i blockeringsloggen visas nedan som referens:',
+'sp-contributions-search' => 'Sök efter användarbidrag',
+'sp-contributions-username' => 'IP-adress eller användarnamn:',
+'sp-contributions-toponly' => 'Visa endast aktuella sidversioner',
+'sp-contributions-submit' => 'Sök',
# What links here
'whatlinkshere' => 'Vad som länkar hit',
@@ -2416,7 +2473,6 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
'ipb-edit-dropdown' => 'Redigera blockeringsanledningar',
'ipb-unblock-addr' => 'Ta bort blockering av $1',
'ipb-unblock' => 'Ta bort blockering av en användare eller IP-adress',
-'ipb-blocklist-addr' => 'Gällande blockeringar av $1',
'ipb-blocklist' => 'Visa gällande blockeringar',
'ipb-blocklist-contribs' => 'Bidrag från $1',
'unblockip' => 'Ta bort blockering av användare/IP-adress',
@@ -2434,8 +2490,8 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
'ipblocklist-localblock' => 'Lokalblockering',
'ipblocklist-otherblocks' => 'Övriga {{PLURAL:$1|blockering|blockeringar}}',
'blocklistline' => '$1, $2 blockerade $3 ($4)',
-'infiniteblock' => 'för evigt',
-'expiringblock' => 'utgår den $1 kl $2',
+'infiniteblock' => 'på obestämd tid',
+'expiringblock' => 'upphör den $1 kl $2',
'anononlyblock' => 'endast oinloggade',
'noautoblockblock' => 'utan automatisk blockering',
'createaccountblock' => 'kontoregistrering blockerad',
@@ -2489,6 +2545,8 @@ $1 är redan blockerad. Vill du ändra inställningarna?',
Du får inte skapa ett användarkonto',
'cant-block-while-blocked' => 'Du kan inte blockera andra användare medan du är blockerad.',
'cant-see-hidden-user' => 'Användaren du försöker blockera är redan blockerad och gömd. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.',
+'ipbblocked' => 'Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad',
+'ipbnounblockself' => 'Du har inte tillåtelse att avblockera dig själv',
# Developer tools
'lockdb' => 'LÃ¥s databas',
@@ -2524,6 +2582,17 @@ Det innebär att du kan flytta tillbaks en sida om du råkar göra fel, och att
'''VARNING!'''
Att flytta en populär sida kan vara en drastisk och oväntad ändring;
därför bör du vara säker på att du förstår konsekvenserna innan du fortsätter med flytten.",
+'movepagetext-noredirectfixer' => "Formuläret nedan kommer att byta namn på en sida, och flytta hela sin historik till det nya namnet.
+Den gamla titeln kommer att bli en omdirigeringssida till den nya titeln.
+Glöm inte att kontrollera [[Special:DoubleRedirects|dubbla]] eller [[Special:BrokenRedirects|brutna omdirigeringar]].
+Du är ansvarig för att se till att länkar fortsätter att peka där de förväntas gå.
+
+Observera att sidan '''inte''' kommer att flyttas om det finns redan en sida på den nya titeln, förutom om den är tom eller en omdirigering och saknar tidigare redigeringshistorik.
+Detta innebär att du kan byta tillbaka namnet på en sida om du av misstag bytt namn på den, och du kan inte skriva över en befintlig sida.
+
+'''Varning!'''
+Detta kan vara en drastisk och oväntad förändring för en populär sida;
+se till att du förstår konsekvenserna av detta innan du fortsätter.",
'movepagetalktext' => "Diskussionssidan kommer att även den automatiskt flyttas '''om inte''':
*Det redan finns en diskussionssida som inte är tom med det nya namnet, eller
*Du avmarkerar rutan nedan.
@@ -2579,6 +2648,7 @@ Den titel du vill flytta sidan till, "[[:$1]]", finns redan. Vill du radera den
'immobile-source-page' => 'Denna sida är inte flyttbar.',
'immobile-target-page' => 'Kan inte flytta till det målnamnet.',
'imagenocrossnamespace' => 'Kan inte flytta filer till andra namnrymder än filnamnrymden',
+'nonfile-cannot-move-to-file' => 'Kan inte flytta icke-fil till filnamnrymden',
'imagetypemismatch' => 'Den nya filändelsen motsvarar inte filtypen',
'imageinvalidfilename' => 'Önskat filnamn är ogiltigt',
'fix-double-redirects' => 'Uppdatera omdirigeringar som leder till den gamla titeln',
@@ -2660,6 +2730,7 @@ Spara den på din dator och ladda upp den här.',
'importstart' => 'Importerar sidor....',
'import-revision-count' => '$1 {{PLURAL:$1|version|versioner}}',
'importnopages' => 'Det finns inga sidor att importera.',
+'imported-log-entries' => 'Importerade $1 {{PLURAL: $1 |loggpost|loggposter}}.',
'importfailed' => 'Importen misslyckades: <nowiki>$1</nowiki>',
'importunknownsource' => 'Okänd typ av importkälla',
'importcantopen' => 'Misslyckades med att öppna importfilen.',
@@ -2754,6 +2825,8 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
'tooltip-rollback' => '"Tillbakarullning" tar med en knapptryckning bort ändringar som gjorts av den som senast redigerade sidan',
'tooltip-undo' => '"Gör ogjord" återställer denna redigering och öppnar redigeringsrutan med förhandsgranskning.
Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
+'tooltip-preferences-save' => 'Spara inställningar',
+'tooltip-summary' => 'Skriv en kort sammanfattning',
# Stylesheets
'common.css' => '/* CSS som skrivs här påverkar alla skal */',
@@ -2884,14 +2957,17 @@ Om du kör den kan din dator skadas.",
'imagemaxsize' => "Begränsa bilders storlek:<br />''(för filbeskrivningssidor)''",
'thumbsize' => 'Storlek på minibild:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|sida|sidor}}',
-'file-info' => '(filstorlek: $1, MIME-typ: $2)',
-'file-info-size' => '($1 × $2 pixel, filstorlek: $3, MIME-typ: $4)',
+'file-info' => 'filstorlek: $1, MIME-typ: $2',
+'file-info-size' => '$1 × $2 pixel, filstorlek: $3, MIME-typ: $4',
'file-nohires' => '<small>Det finns ingen version med högre upplösning.</small>',
-'svg-long-desc' => '(SVG-fil, grundstorlek: $1 × $2 pixel, filstorlek: $3)',
+'svg-long-desc' => 'SVG-fil, grundstorlek: $1 × $2 pixel, filstorlek: $3',
'show-big-image' => 'Högupplöst version',
'show-big-image-thumb' => '<small>Storlek på förhandsvisningen: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'upprepad',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ram|ramar}}',
+'file-info-png-looped' => 'loopad',
+'file-info-png-repeat' => 'spelad $1 {{PLURAL:$1|gång|gånger}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|bild|bilder}}',
# Special:NewFiles
'newimages' => 'Galleri över nya filer',
@@ -3049,6 +3125,7 @@ Den första länken på en rad måste vara en länk till en otillåten fil.
'exif-gpsareainformation' => 'GPS-områdets namn',
'exif-gpsdatestamp' => 'GPS-datum',
'exif-gpsdifferential' => 'Differentiell GPS-korrektion',
+'exif-objectname' => 'Kort titel',
# EXIF attributes
'exif-compression-1' => 'Inte komprimerad',
@@ -3208,25 +3285,25 @@ Den första länken på en rad måste vara en länk till en otillåten fil.
'limitall' => 'alla',
# E-mail address confirmation
-'confirmemail' => 'Bekräfta e-postadress',
-'confirmemail_noemail' => 'Du har inte angivit någon giltig e-postadress i dina [[Special:Preferences|inställningar]].',
-'confirmemail_text' => 'Innan du kan använda {{SITENAME}}s funktioner för e-post måste du bekräfta din e-postadress. Aktivera knappen nedan för att skicka en bekräftelsekod till din e-postadress. Mailet kommer att innehålla en länk, som innehåller en kod. Genom att klicka på den länken eller kopiera den till din webbläsares fönster för webbadresser, bekräftar du att din e-postadress fungerar.',
-'confirmemail_pending' => 'En bekräftelsekod har redan skickats till din epostadress. Om du skapade ditt konto nyligen, så kanske du vill vänta några minuter innan du begär en ny kod.',
-'confirmemail_send' => 'Skicka bekräftelsekod',
-'confirmemail_sent' => 'E-post med bekräftelse skickat.',
-'confirmemail_oncreate' => 'En bekräftelsekod skickades till din epostadress. Koden behövs inte för att logga in, men du behöver koden för att få tillgång till de epostbaserade funktionerna på wikin.',
-'confirmemail_sendfailed' => '{{SITENAME}} kunde inte skicka din e-postbekräftelse.
+'confirmemail' => 'Bekräfta e-postadress',
+'confirmemail_noemail' => 'Du har inte angivit någon giltig e-postadress i dina [[Special:Preferences|inställningar]].',
+'confirmemail_text' => 'Innan du kan använda {{SITENAME}}s funktioner för e-post måste du bekräfta din e-postadress. Aktivera knappen nedan för att skicka en bekräftelsekod till din e-postadress. Mailet kommer att innehålla en länk, som innehåller en kod. Genom att klicka på den länken eller kopiera den till din webbläsares fönster för webbadresser, bekräftar du att din e-postadress fungerar.',
+'confirmemail_pending' => 'En bekräftelsekod har redan skickats till din epostadress. Om du skapade ditt konto nyligen, så kanske du vill vänta några minuter innan du begär en ny kod.',
+'confirmemail_send' => 'Skicka bekräftelsekod',
+'confirmemail_sent' => 'E-post med bekräftelse skickat.',
+'confirmemail_oncreate' => 'En bekräftelsekod skickades till din epostadress. Koden behövs inte för att logga in, men du behöver koden för att få tillgång till de epostbaserade funktionerna på wikin.',
+'confirmemail_sendfailed' => '{{SITENAME}} kunde inte skicka din e-postbekräftelse.
Kontrollera om e-postadressen innehåller ogiltiga tecken.
Mailservern svarade: $1',
-'confirmemail_invalid' => 'Ogiltig bekräftelsekod. Dess giltighetstid kan ha löpt ut.',
-'confirmemail_needlogin' => 'Du behöver $1 för att bekräfta din e-postadress',
-'confirmemail_success' => 'Din e-postadress har bekräftats.
+'confirmemail_invalid' => 'Ogiltig bekräftelsekod. Dess giltighetstid kan ha löpt ut.',
+'confirmemail_needlogin' => 'Du behöver $1 för att bekräfta din e-postadress',
+'confirmemail_success' => 'Din e-postadress har bekräftats.
Du kan nu [[Special:UserLogin|logga in]] och använda wikin.',
-'confirmemail_loggedin' => 'Din e-postadress är nu bekräftad.',
-'confirmemail_error' => 'Någonting gick fel när din bekräftelse skulle sparas.',
-'confirmemail_subject' => 'Bekräftelse av e-postadress på {{SITENAME}}',
-'confirmemail_body' => 'Någon, troligen du, har från IP-adressen $1 registrerat användarkontot "$2" med denna e-postadress på {{SITENAME}}.
+'confirmemail_loggedin' => 'Din e-postadress är nu bekräftad.',
+'confirmemail_error' => 'Någonting gick fel när din bekräftelse skulle sparas.',
+'confirmemail_subject' => 'Bekräftelse av e-postadress på {{SITENAME}}',
+'confirmemail_body' => 'Någon, troligen du, har från IP-adressen $1 registrerat användarkontot "$2" med denna e-postadress på {{SITENAME}}.
För att bekräfta att detta konto verkligen är ditt, och för att aktivera funktionerna för e-post på {{SITENAME}}, öppna denna länk i din webbläsare:
@@ -3237,8 +3314,36 @@ Om det *inte* är du som registrerat kontot, följ denna länk för att avbryta
$5
Denna bekräftelsekod kommer inte att fungera efter $4.',
-'confirmemail_invalidated' => 'Bekräftelsen av e-postadressen har ogiltigförklarats',
-'invalidateemail' => 'Avbryt bekräftelse av e-postadress',
+'confirmemail_body_changed' => 'Någon, troligen du, har från IP-adressen $1
+registrerat användarkontot "$2" med denna e-postadress på {{SITENAME}}.
+
+För att bekräfta att detta konto verkligen är ditt, och för att aktivera
+funktionerna för e-post på {{SITENAME}}, öppna denna länk i din webbläsare:
+
+$3
+
+Om det *inte* är du som registrerat kontot, följ denna länk
+för att avbryta bekräftelsen av e-postadressen:
+
+$5
+
+Denna bekräftelsekod kommer inte att fungera efter $4.',
+'confirmemail_body_set' => 'Någon, förmodligen du, från IP-adressen $1,
+har satt e-postadressen till kontot "$2" till den här adressen {{SITENAME}}.
+
+För att bekräfta att kontot verkligen tillhör dig, bör du återaktivera
+e-post funktionerna på {{SITENAME}}, öppna denna länk i din webbläsare:
+
+$3
+
+Om kontot *inte* tillhör dig, följ den här länken
+för att avbryta bekräftelsen av e-postadressen:
+
+$5
+
+Denna bekräftelsekod kommer att sluta fungera efter $4.',
+'confirmemail_invalidated' => 'Bekräftelsen av e-postadressen har ogiltigförklarats',
+'invalidateemail' => 'Avbryt bekräftelse av e-postadress',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-inklusion är inte aktiverad]',
@@ -3278,6 +3383,7 @@ Bekräfta att du verkligen vill återskapa sidan.",
'table_pager_first' => 'Första sidan',
'table_pager_last' => 'Sista sidan',
'table_pager_limit' => 'Visa $1 poster per sida',
+'table_pager_limit_label' => 'Objekt per sida:',
'table_pager_limit_submit' => 'Utför',
'table_pager_empty' => 'Inga resultat',
@@ -3342,6 +3448,7 @@ Du kan också [[Special:Watchlist/edit|använda standardeditorn]].',
'version-specialpages' => 'Specialsidor',
'version-parserhooks' => 'Parsertillägg',
'version-variables' => 'Variabler',
+'version-skins' => 'Utseenden',
'version-other' => 'Annat',
'version-mediahandlers' => 'Mediahanterare',
'version-hooks' => 'Hakar',
@@ -3353,6 +3460,13 @@ Du kan också [[Special:Watchlist/edit|använda standardeditorn]].',
'version-hook-subscribedby' => 'Används av',
'version-version' => '(Version $1)',
'version-license' => 'Licens',
+'version-poweredby-credits' => "Den här wikin drivs av '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'andra',
+'version-license-info' => 'MediaWiki är fri programvara; du kan distribuera det och/eller modifiera det under villkoren i GNU General Public License, publicerad av Free Software Foundation; antingen version 2 av licensen, eller (om du önskar) någon senare version.
+
+MediaWiki distribueras i hopp om att det ska vara användbart, men UTAN NÅGON GARANTI, även utan underförstådd garanti om SÄLJBARHET eller LÄMPLIGHET FÖR ETT VISST SYFTE. Se GNU General Public License för fler detaljer.
+
+Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Public License] tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html läs den online].',
'version-software' => 'Installerad programvara',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
@@ -3422,6 +3536,15 @@ Skriv filnamnet utan prefixet "{{ns:file}}:" .',
'tags-edit' => 'redigera',
'tags-hitcount' => '$1 {{PLURAL:$1|ändring|ändringar}}',
+# Special:ComparePages
+'comparepages' => 'Jämför sidor',
+'compare-selector' => 'Jämför sidversioner',
+'compare-page1' => 'Sida 1',
+'compare-page2' => 'Sida 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Jämför',
+
# Database error messages
'dberr-header' => 'Den här wikin har ett problem',
'dberr-problems' => 'Ursäkta! Denna sajt har just nu tekniska problem.',
@@ -3438,8 +3561,13 @@ Skriv filnamnet utan prefixet "{{ns:file}}:" .',
'htmlform-float-invalid' => 'Värdet du valde är inte en siffra.',
'htmlform-int-toolow' => 'Värdet du valde är under minimumet på $1',
'htmlform-int-toohigh' => 'Värdet du valde är över maximumet på $1',
+'htmlform-required' => 'Det här värdet krävs',
'htmlform-submit' => 'Spara',
'htmlform-reset' => 'Ogör ändringar',
'htmlform-selectorother-other' => 'Andra',
+# SQLite database support
+'sqlite-has-fts' => '$1 med stöd för fulltextsökning',
+'sqlite-no-fts' => '$1 utan stöd för fulltextsökning',
+
);
diff --git a/languages/messages/MessagesSw.php b/languages/messages/MessagesSw.php
index 46f4d642..bfd543d0 100644
--- a/languages/messages/MessagesSw.php
+++ b/languages/messages/MessagesSw.php
@@ -8,6 +8,7 @@
* @file
*
* @author Ikiwaner
+ * @author Jagwar
* @author Lloffiwr
* @author Malangali
* @author Marcos
@@ -136,8 +137,7 @@ $messages = array(
'tog-editsection' => 'Wezesha sehemu ya kuandikia kwa kutumia viungo vya [hariri]',
'tog-editsectiononrightclick' => 'Wezesha sehemu ya kuandikia kwa kubonyeza kitufe cha kulia cha puku yako juu ya sehemu ya majina husika (JavaScript)',
'tog-showtoc' => 'Onyesha mistari ya yaliyomo (kwa kila kurasa iliyo na zaidi ya vichwa vya habari 3)',
-'tog-rememberpassword' => 'Kumbuka kuingia kwangu katika kompyuta hii',
-'tog-editwidth' => 'Sanduku la kuhariri liwe na upana wa kujaza skrini nzima',
+'tog-rememberpassword' => 'Kumbuka kuingia kwangu pamoja na neno la siri katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
'tog-watchcreations' => 'Weka kurasa nilizoumba katika maangalizi yangu',
'tog-watchdefault' => 'Weka kurasa zote nilizohariri katika maangalizi yangu',
'tog-watchmoves' => 'Weka kurasa zote nilizohamisha katika maangalizi yangu',
@@ -283,31 +283,21 @@ $messages = array(
'faqpage' => 'Project:Maswali Yaulizwayo Marakwamara',
# Vector skin
-'vector-action-addsection' => 'Weka mada',
-'vector-action-delete' => 'Futa',
-'vector-action-move' => 'Hamisha',
-'vector-action-protect' => 'Linda',
-'vector-action-undelete' => 'Rudisha',
-'vector-action-unprotect' => 'Ondoa tunzo',
-'vector-namespace-category' => 'Jamii',
-'vector-namespace-help' => 'Ukurasa wa msaada',
-'vector-namespace-image' => 'Faili',
-'vector-namespace-main' => 'Ukurasa',
-'vector-namespace-media' => 'Ukurasa wa faili',
-'vector-namespace-mediawiki' => 'Ujumbe',
-'vector-namespace-project' => 'Ukurasa wa mradi',
-'vector-namespace-special' => 'Ukurasa maalum',
-'vector-namespace-talk' => 'Majadiliano',
-'vector-namespace-template' => 'Kigezo',
-'vector-namespace-user' => 'Ukurasa wa mtumiaji',
-'vector-view-create' => 'Anzisha',
-'vector-view-edit' => 'Hariri',
-'vector-view-history' => 'Fungua historia',
-'vector-view-view' => 'Soma',
-'vector-view-viewsource' => 'Kuonyesha kodi',
-'actions' => 'Vitendo',
-'namespaces' => 'Maeneo ya wiki',
-'variants' => 'Vibadala',
+'vector-action-addsection' => 'Weka mada',
+'vector-action-delete' => 'Futa',
+'vector-action-move' => 'Hamisha',
+'vector-action-protect' => 'Linda',
+'vector-action-undelete' => 'Rudisha',
+'vector-action-unprotect' => 'Ondoa tunzo',
+'vector-simplesearch-preference' => 'Kuwezesha madokezo imara ya tafutaji (umbo la Vector tu)',
+'vector-view-create' => 'Anzisha',
+'vector-view-edit' => 'Hariri',
+'vector-view-history' => 'Fungua historia',
+'vector-view-view' => 'Soma',
+'vector-view-viewsource' => 'Kuonyesha kodi',
+'actions' => 'Vitendo',
+'namespaces' => 'Maeneo ya wiki',
+'variants' => 'Vibadala',
'errorpagetitle' => 'Hitilafu',
'returnto' => 'Rudia $1.',
@@ -368,6 +358,8 @@ Watumiaji wengi mno wanajaribu kutazama ukurasa huu.
Tafadhali subiri kwa muda kadhaa kabla ya kujaribu kufungua tena.
$1',
+'pool-queuefull' => 'Foleni ya michakato imejaa',
+'pool-errorunknown' => 'Hitilafu isiyojulikana',
# 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' => 'Kuhusu {{SITENAME}}',
@@ -491,7 +483,7 @@ Tafadhali ripoti hili kwa [[Special:ListUsers/sysop|mkabidhi]], na uache jina la
'cannotdelete' => 'Haikuweza kufuta kurasa au faili linaloitwa "$1".
Huenda likawa tayari lishafutwa na mtu mwingine.',
'badtitle' => 'Jina halifai',
-'badtitletext' => 'Jina la ukurasa ulilotaka ni batilifu, tupu, au limeungwa vibaya na jina la lugha nyingine au Wiki nyingine. Labda linazo herufi moja a zaidi ambazo hazitumiki katika majina.',
+'badtitletext' => 'Jina la ukurasa ulilotaka ni batilifu, tupu, au limeungwa vibaya na jina la lugha nyingine au Wiki nyingine. Labda linazo herufi moja au zaidi ambazo hazitumiki katika majina.',
'perfcached' => 'Data zifuatazo zinatoka kwenye kache na huenda si ya kisasa.',
'perfcachedts' => 'Data zifuatazo zimetoka kwenye kache iliobadilishwa mara ya mwisho saa $3, tarehe $2.',
'querypage-no-updates' => 'Mabadiliko kwa ajili ya ukurasa huu yamesimamishwa.
@@ -534,7 +526,8 @@ Usisahau kubadilisha mapendekezo yako ya [[Special:Preferences|{{SITENAME}}]].',
'yourname' => 'Jina la mtumiaji:',
'yourpassword' => 'Neno la siri:',
'yourpasswordagain' => 'Andika tena neno la siri',
-'remembermypassword' => 'Nikumbuke katika tarakilishi hii',
+'remembermypassword' => 'Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
+'securelogin-stick-https' => 'Endelea kushikamana na HTTPS baada ya kuingia',
'yourdomainname' => 'Tovuti yako:',
'externaldberror' => 'Huenda kulikuwa na hitilafu ya database au labda hauruhusiwi kubadilisha akaunti yako ya nje.',
'login' => 'Ingia',
@@ -551,6 +544,7 @@ Usisahau kubadilisha mapendekezo yako ya [[Special:Preferences|{{SITENAME}}]].',
'gotaccount' => "Unayo akaunti tayari? '''$1'''",
'gotaccountlink' => 'Ingia',
'createaccountmail' => 'Kwa barua pepe',
+'createaccountreason' => 'Sababu:',
'badretype' => 'Maneno uliyoyaandika ni tofauti.',
'userexists' => 'Jina la mtumiaji uliloingiza tayari linatumika.
Tafadhali chagua jina lingine.',
@@ -574,6 +568,7 @@ Jaribu tena.',
'wrongpasswordempty' => 'Neno la siri lilikuwa tupu. Jaribu tena.',
'passwordtooshort' => 'Ni lazima neno la siri liwe na {{PLURAL:$1|herufi}} $1 au zaidi.',
'password-name-match' => 'Neno lako la siri lazima liwe tofauti na jina lako la mtumiaji.',
+'password-login-forbidden' => 'Imekatzwa kutumia jina hili la mtumiaji pamoja na neno hili la siri.',
'mailmypassword' => 'Nitume neno la siri jipya kwa barua-pepe',
'passwordremindertitle' => 'Neno la siri jipya la muda kwa ajili ya {{SITENAME}}',
'passwordremindertext' => 'Mtu mmoja (yamkini wewe, kutoka anwani ya IP $1)
@@ -666,6 +661,7 @@ Inawezekana ikawa tayari umefaulu kubadilisha neno lako la siri au neno la siri
'showlivepreview' => 'Tazama moja kwa moja',
'showdiff' => 'Onyesha mabadiliko',
'anoneditwarning' => "'''Ilani:''' Wewe hujaingia rasmi kwenye tovuti. Anwani ya IP ya tarakilishi yako itahifadhiwa katika historia ya uhariri wa ukurasa huu.",
+'anonpreviewwarning' => "''Hujaingia rasmi kwenye tovuti. Ukihifadhi ukurasa anwani ya IP ya tarakilishi yako itahifadhiwa katika historia ya uhariri wa ukurasa huu.''",
'missingsummary' => "'''Taarifa:''' Hujaandika muhtasari ya kuhariri.
Ukibonyeza 'Hifadhi ukurasa' tena, badilisho lako litahifadhiwa bila muhtasari.",
'missingcommenttext' => 'Tafadhali andika muhtasari chini.',
@@ -745,8 +741,12 @@ Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
'''Haijahifadhiwa bado!'''",
'userjspreview' => "'''Kumbuka kwamba unajaribu/kuhakiki mandhari ya ukurasa wako wa JavaScript tu.'''
'''Haijahifadhiwa bado!'''",
+'sitecsspreview' => "'''Kumbuka kwamba unahakiki tu mandhari ya CSS hii.'''
+'''Haijahifadhiwa bado!'''",
+'sitejspreview' => "'''Kumbuka kwamba unahakiki tu mandhari ya JavaScript hii.'''
+'''Haijahifadhiwa bado!'''",
'userinvalidcssjstitle' => "'''Onyo:''' Hakuna umbo \"\$1\".
-Kumbuka kwamba desturi ya kurasa za .css na .js hutumia herufi ndogo, yaani, {{ns:user}}:Foo/monobook.css na si {{ns:user}}:Foo/Monobook.css.",
+Kumbuka kwamba desturi ya kurasa za .css na .js hutumia herufi ndogo, yaani, {{ns:user}}:Foo/vector.css na si {{ns:user}}:Foo/Vector.css.",
'updated' => '(Imesasishwa)',
'note' => "'''Taarifa:'''",
'previewnote' => "'''Hii ni hakikisho tu; mabadiliko hayajahifadhiwa bado!'''",
@@ -786,8 +786,6 @@ Unakuwa unaahidi kwamba maandishi unayoyaingia ni yako tu, au uliyapata kutoka b
Ikiwa hutaki maandishi yako yasihaririwe na yeyote, basi usiyaweke hapa.<br />
Pia una tuahidi kwamba umeandika haya wewe mwenyewe, au umenakili kutoka katika tovuti ya umma au chanzo cha wazi sawa na hiki (tazama $1 kwa maelezo).
'''Usiandike makala yenye hakimiliki bila ya ruhusa halali!'''",
-'longpagewarning' => "'''ILANI: Urefu wa ukurasa huu ni kilobaiti $1; vivinjari kadhaa vinaweza kuwa na matatizo ukihariri ukurasa wenye urefu zaidi ya kb 32 hivi.
-Tafadhali fikiria kuhusu kuvunja ukurasa kwa vipande vifupi.'''",
'longpageerror' => "'''Hitilafu: Maandishi uliyoyaweka yana urefu wa kilobati $1, ambayo ni marefu kuliko kiwango cha kawaida cha kilobaiti $2.'''
Hayawezi kuhifadhiwa.",
'readonlywarning' => "'''Onyo: Hifadhidata imefungwa kwa ajili ya matengenezo, kwa hiyo hautakuwa na uwezo wa kuhifadhi maharirio yako kwa sasa.'''
@@ -829,6 +827,13 @@ Inaonekana kwamba ukurasa umefutwa.',
'edit-already-exists' => 'Haikufanikiwa kuanzisha ukurasa mpya.
Ukurasa wa jina hilo unapatikana tayari.',
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Ilani:''' Kigezo kinajumlisha ukubwa uliozidi mno.
+Baadhi ya vigezo havitaweza kuingizwa.",
+'post-expand-template-inclusion-category' => 'Kurasa ambapo vigezo vinajumlisha ukubwa uliozidi',
+'post-expand-template-argument-warning' => "'''Ilani:'''Ukurasa huu una agumeni ya kigezo moja au zaidi, ambayo ukubwa wake wa kupanuliwa unazidi mpaka. Agumeni hizi hazikutumika.",
+'post-expand-template-argument-category' => 'Kurasa zenye vigezo vilivyoruka agumeni',
+
# "Undo" feature
'undo-success' => 'Sahihisho linaweza kutenguliwa.
Tafadhali tazama linganisho lililopo chini ili kuthibitisha kwamba kutengua ndiyo inayotakiwa, na kisha uhifadhi mabadiliko ili kukamilisha kutengua sahihisho.',
@@ -931,6 +936,8 @@ $1",
'logdelete-failure' => "'''Kubadilisha uwezo wa kuona kumbukumbu ulifaulu:'''
$1",
'revdel-restore' => 'badilisha mwonekano',
+'revdel-restore-deleted' => 'mapitio yaliyofutwa',
+'revdel-restore-visible' => 'mapitio yanayoonekana',
'pagehist' => 'Historia ya ukurasa',
'deletedhist' => 'Historia iliyofutwa',
'revdelete-content' => 'maandiko',
@@ -984,11 +991,12 @@ Tazama [[Special:IPBlockList|orodha ya uzuio wa IP]] kuona orodha ya zuio zilizo
# Diffs
'history-title' => 'Historia ya mapitio ya "$1"',
'difference' => '(Tofauti baina ya mapitio)',
+'difference-multipage' => '(Tofauti kati ya kurasa)',
'lineno' => 'Mstari $1:',
'compareselectedversions' => 'Linganisha mapitio mawili uliyochagua',
'showhideselectedversions' => 'Onyesha/ficha mapitio yaliyoteuliwa',
'editundo' => 'tengua',
-'diff-multi' => '(Hatuonyeshi {{PLURAL:$1|pitio moja la katikati|mapitio $1 ya katikati}}.)',
+'diff-multi' => '(Haionyeshwi {{PLURAL:$1|pitio moja la katikati lililoandikwa|mapitio $1 ya katikati yaliyoandikwa}} na {{PLURAL:$2|mtumiaji moja|watumiaji $2}})',
# Search results
'searchresults' => 'Matokeo ya utafutaji',
@@ -1023,6 +1031,7 @@ Tazama [[Special:IPBlockList|orodha ya uzuio wa IP]] kuona orodha ya zuio zilizo
'searchprofile-everything-tooltip' => 'Tafuta wiki nzima (pamoja na kurasa za majadiliano)',
'searchprofile-advanced-tooltip' => 'Tafuta katika maeneo ya wiki utakayoyachagua',
'search-result-size' => '$1 ({{PLURAL:$2|neno 1|maneno $2}})',
+'search-result-category-size' => '{{PLURAL:$1|ukurasa 1|kurasa $1}} ({{PLURAL:$2|kijamii 1|vijamii $2}}, {{PLURAL:$3|faili 1|mafaili $3}})',
'search-result-score' => 'Kiwango cha ulinganisho na ulizo: $1%',
'search-redirect' => '(elekezo toka kwa $1)',
'search-section' => '(fungu $1)',
@@ -1100,6 +1109,7 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
'contextlines' => 'Mistari kwa kila tokeo:',
'contextchars' => 'Herufi za muktadha kwa kila mstari:',
'stub-threshold' => 'Kiwango cha juu cha kuonyesha kiungo kama <a href="#" class="stub">kiungo kinachoelekea mbegu</a> (baiti):',
+'stub-threshold-disabled' => 'Imelemazwa',
'recentchangesdays' => 'Ionyeshwe siku ngapi kwenye orodha ya mabadiliko ya karibuni?',
'recentchangesdays-max' => 'Isizidi {{PLURAL:$1|siku}} $1',
'recentchangescount' => 'Idadi ya masahihisho yatakayoonyeshwa kwa kawaida:',
@@ -1133,6 +1143,7 @@ Hapo kuna ufunguo uliotolewa na programu kwa kubahatisha, ambao unaweza kuutumia
'prefs-files' => 'Mafaili',
'prefs-custom-css' => 'CSS niliyotunga mwenyewe',
'prefs-custom-js' => 'JS niliyotunga mwenyewe',
+'prefs-common-css-js' => 'CSS/JS inayoshirikishwa na maumbo yote:',
'prefs-reset-intro' => 'Unaweza kutumia ukurasa huu ili kurudisha mapendekezo yako kwenye yale ya msingi ya tovuti.
Hutaweza kulibatilisha tendo hili baadaye.',
'prefs-emailconfirm-label' => 'Kuhakikisha barua pepe:',
@@ -1172,9 +1183,15 @@ Pia unaweza kuchagua kuwawezesha watumiaji wengine wawasiliane nawe kwa kupitia
'prefs-advancedrendering' => 'Hitiari za hali ya juu',
'prefs-advancedsearchoptions' => 'Hitiari za hali ya juu',
'prefs-advancedwatchlist' => 'Hitiari za hali ya juu',
-'prefs-display' => 'Hitiari za kutandaza',
+'prefs-displayrc' => 'Hitiari za kutandaza',
+'prefs-displaysearchoptions' => 'Mapendekezo ya kuzinza',
+'prefs-displaywatchlist' => 'Mapendekezo ya kuzinza',
'prefs-diffs' => 'Tofauti',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Inaonekana kwamba anwani wa barua pepe iko halisi',
+'email-address-validity-invalid' => 'Andika anwani halisi ya barua pepe',
+
# User rights
'userrights' => 'Usimamizi wa wezo za mtumiaji',
'userrights-lookup-user' => 'Kusimamia kundi za watumiaji',
@@ -1307,13 +1324,10 @@ Pia unaweza kuchagua kuwawezesha watumiaji wengine wawasiliane nawe kwa kupitia
'recentchanges-legend' => "Machaguo ya 'mabadaliko ya karibuni'",
'recentchangestext' => 'Orodha ya mabadilisho yaliyofanywa katika {{SITENAME}} siku zilizopita.',
'recentchanges-feed-description' => 'Tumia tawanyiko hili kufuatilia mabadiliko yote ya hivi karibuni katika Wiki.',
-'recentchanges-label-legend' => 'Hekaya: $1.',
-'recentchanges-legend-newpage' => '$1 - ukurasa mpya',
'recentchanges-label-newpage' => 'Ukurasa mpya ulianzishwa hapo',
-'recentchanges-legend-minor' => '$1 - badiliko dogo',
'recentchanges-label-minor' => 'Hili ni badiliko dogo',
-'recentchanges-legend-bot' => '$1 - sahihisho la bot',
'recentchanges-label-bot' => 'Sahihisho hili lilitekelezwa na bot',
+'recentchanges-label-unpatrolled' => 'Haririo hili bado halijafanyiwa doria',
'rcnote' => "{{PLURAL:$1|Linalofuata ni badiliko '''1'''|Yanayofuata ni mabadiliko '''$1''' ya mwisho}} kutoka katika {{PLURAL:$2|siku iliyopita|siku '''$2''' zilizopita}}, hadi saa $5, tarehe $4.",
'rcnotefrom' => "Hapo chini yaonekana mabadiliko tangu '''$2''' (tunaonyesha hadi '''$1''').",
'rclistfrom' => 'Onyesha mabadiliko mapya kuanzia $1',
@@ -1356,6 +1370,9 @@ Pia unaweza kuchagua kuwawezesha watumiaji wengine wawasiliane nawe kwa kupitia
'uploadnologin' => 'Hujaingia',
'uploadnologintext' => 'Lazima [[Special:UserLogin|uingie akaunti yako]] ile upakie mafaili.',
'uploaderror' => 'Hitilafu ya kupia',
+'upload-recreate-warning' => "'''Ilani: Faili lenye jina hilo limeshafutwa au limeshasogezwa.'''
+
+Rejea kumbukumbu za kufuta au kuhamisha ukurasa huu zinazotolewa chini:",
'uploadtext' => "Tumia fomu hapo chini kwa kupakizia mafaili.
Kwa kutazama au kutafuta faili zilizopakiwa awali, tafadhali nenda kwenye [[Special:FileList|orodha ya mafaili yaliyopakiwa]]. Kwa zile faili ambazo zishapitiwa, basi angalia [[Special:Log/upload|kumbukumbu ya mafaili]]. Kwa mafaili yaliyofutwa, tafadhali [[Special:Log/delete|tazama hapa]].
@@ -1391,6 +1408,16 @@ Tafadhali uweke jina jipya kwenye faili, halafu jaribu kulipakia upya.',
'filetype-banned-type' => "'''\".\$1\"''' sio aina la faili linaloruhusiwa.
{{PLURAL:\$3|Aina ya faili linaloruhusiwa|Aina za faili zinazoruhusiwa}} ni \$2.",
'filetype-missing' => 'Faili halina mnyambuliko (kama ".jpg").',
+'empty-file' => 'Faili ulilowasilisha ni tupu.',
+'file-too-large' => 'Faili ulilowasilisha ni kubwa mno.',
+'filename-tooshort' => 'Jina la faili ni fupi mno.',
+'filetype-banned' => 'Aina hili la faili haliruhusiwi.',
+'verification-error' => 'Faili hili halikupitishwa katika ukaguzi wa faili.',
+'illegal-filename' => 'Jina hilo la faili haliruhusiwi.',
+'overwrite' => 'Kuandikiza faili lililopo tayari hairuhusiwi.',
+'unknown-error' => 'Ilitokea hitilafu isiyojulikana.',
+'tmp-create-error' => 'Haikuweza kuanzisha faili la muda.',
+'tmp-write-error' => 'Hitilafu ya kuandika faili la muda.',
'large-file' => 'Tunashauri mafaili yasizidi $1;
faili hili lina $2.',
'largefileserver' => 'Faili hili ni kubwa kuliko seva ilivyopangwa kuruhusu.',
@@ -1422,13 +1449,14 @@ Kama bado unataka kupakia faili lako, tafadhali rudi na utumie jina jipya.
'file-exists-duplicate' => 'Faili hili ni nakala ya {{PLURAL:$1|faili lifuatalo|mafaili yafuatayo}}:',
'file-deleted-duplicate' => 'Faili linalofanana na faili hili ([[:$1]]) limeshafutwa hapo awali.
Tazama kumbukumbu za kufuta faili lile kabla hujaendelea kulipakia upya.',
-'successfulupload' => 'Upakiaji ulifaulu',
'uploadwarning' => 'Ilani kuhusu kupakia',
'uploadwarning-text' => 'Tafadhali ubadilishe maelezo ya faili hapo chini, halafu jaribu tena.',
'savefile' => 'Hifadhi faili',
'uploadedimage' => 'ameipakia "[[$1]]"',
'overwroteimage' => 'alipakia toleo jipya la "[[$1]]"',
'uploaddisabled' => 'Upakiaji umelemazwa.',
+'copyuploaddisabled' => 'Kupakia kwa kupitia URL kumelemazwa.',
+'uploadfromurl-queued' => 'Upakiaji wako umewekwa kwenye foleni.',
'uploaddisabledtext' => 'Upakiaji wa mafaili umelemazwa.',
'php-uploaddisabledtext' => 'Upakiaji wa mafaili umelemazwa katika PHP.
Tafadhali utazame kipimo cha file_uploads.',
@@ -1451,6 +1479,14 @@ Fikiria kama inafaa kuendelea kupakia faili hili.
Kumbukumbu ya kufuta faili hili inapatikana hapa kukusaidia:",
'filename-bad-prefix' => "Jina la faili unalolipakia huanza na '''\"\$1\"''', ambalo ni jina lisilo na maana yanayoeleweka kirahisi, ya aina inayotolewa huwa na kamera dijiti.
Tafadhali chagua jina linaloeleweka kirahisi kwa ajili ya faili lako.",
+'upload-success-subj' => 'Upakiaji ulifaulu',
+'upload-success-msg' => 'Umefaulu kupakia faili kutoka kwa [$2]. Faili linapatikana hapa: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Hitilafu ya kupakia',
+'upload-failure-msg' => 'Kulikuwa na tatizo ulipopakia faili kutoka kwa [$2]:
+
+$1',
+'upload-warning-subj' => 'Ilani ya kupakia',
+'upload-warning-msg' => 'Kulitokea tatizo na upakiaji wako kuanzia [$2]. Unaweza kurudi katika [[Special:Upload/stash/$1|fomu ya kupakia]] ili kurekebisha tatizo hili.',
'upload-proto-error' => 'Itifaki isio sahihi',
'upload-proto-error-text' => 'Upakiaji wa mbali lazima URL ianze na <code>http://</code> au <code>ftp://</code>.',
@@ -1502,6 +1538,7 @@ Ukibofya kichwa cha safu mtindo wa kupanga orodha utabadilika.',
'listfiles_search_for' => 'Tafuta jina la faili:',
'imgfile' => 'faili',
'listfiles' => 'Orodha ya mafaili',
+'listfiles_thumb' => 'Picha ndogo',
'listfiles_date' => 'Tarehe',
'listfiles_name' => 'Jina',
'listfiles_user' => 'Mtumiaji',
@@ -1616,8 +1653,8 @@ Kumbuka kuhakikisha kwamba hakuna viungo vingine vinavyoelekea kigezo fulani kab
'statistics-edits' => 'Kurasa zilizohaririwa tangu {{SITENAME}} ilivyoanzishwa',
'statistics-edits-average' => 'Wastani wa uhariri kwa kurasa',
'statistics-views-total' => 'Jumla ya mitazamaji',
+'statistics-views-total-desc' => 'Ziara za kurasa zisizopatikana na kurasa maalum hazihesabiwi',
'statistics-views-peredit' => 'Mitazamaji kwa haririo',
-'statistics-jobqueue' => 'Urefu wa [http://www.mediawiki.org/wiki/Manual:Job_queue foleni ya kazi]',
'statistics-users' => '[[Special:ListUsers|Watumiaji]] waliojisajiri',
'statistics-users-active' => 'Watumiaji wanaofanya kazi',
'statistics-users-active-desc' => 'Watumiaji waliofanya kazi katika siku {{PLURAL:$1|iliyopita|$1 zilizopita}}',
@@ -1630,6 +1667,8 @@ Ni afadhali kiungo kiende makala inayostahili moja kwa moja.<br />
Kurasa za kutofautishana maana ni zile zinazotumia kigezo kinachoorodheshwa katika ukurasa wa [[MediaWiki:Disambiguationspage]].",
'doubleredirects' => 'Maelekezo mawilimawili',
+'doubleredirectstext' => 'Ukurasa huu unaorodhesha kurasa zinazoelekeza kurasa zingine za kuelekeza.
+Katika kila mstari kuna viungo vinavyokwenda katika kurasa za kuelekeza zote mbili, pamoja na ukurasa wa mwishilio mwa elekezo la pili. Ukurasa huu wa mwishilio huwa ni ukurasa unaostahili kuelekezwa kutoka kwa ukurasa wa kuelekeza wa kwanza. Vitu <del>vilivyokatwa kwa mstari</del> vimeshatatuliwa.',
'double-redirect-fixed-move' => '[[$1]] umehamishwa.
Sasa unaelekeza [[$2]].',
'double-redirect-fixer' => 'Boti ya kurekebisha maelekezo',
@@ -1653,6 +1692,8 @@ Sasa unaelekeza [[$2]].',
'nmembers' => '{{PLURAL:$1|kitu|vitu}} $1',
'nrevisions' => '{{PLURAL:$1|pitio|mapitio}} $1',
'nviews' => '{{PLURAL:$1|mtazamaji|mitazamaji}} $1',
+'nimagelinks' => 'Inatumika katika {{PLURAL:$1|ukurasa moja tu|kurasa $1}}',
+'ntransclusions' => 'inatumika katika {{PLURAL:$1|ukurasa moja tu|kurasa $1}}',
'specialpage-empty' => 'Hakuna matokeo katika taarifa hii.',
'lonelypages' => 'Kurasa ambazo haziungwi kutoka ukurasa mwingine wowote',
'uncategorizedpages' => 'Kurasa ambazo hazijawekwa katika jamii',
@@ -1751,7 +1792,7 @@ Tazama pia [[Special:WantedCategories|jamii zinazohitajika]].',
'linksearch-ok' => 'Tafuta',
'linksearch-text' => 'Alama maalum za kutafuta kama "*.wikipedia.org" zinaweza kutumika.<br />
Itifaki zinazoungwa mkono: <tt>$1</tt>',
-'linksearch-line' => '$2 lina kiungo kinachokupeleka hadi $1',
+'linksearch-line' => '$2 umeungwa kutoka $1',
'linksearch-error' => 'Alama maalum za kutafuta zinaweza kutumika mwanzoni mwa URL tu.',
# Special:ListUsers
@@ -1797,34 +1838,36 @@ Labda patakuwa na [[{{MediaWiki:Listgrouprights-helppage}}|maelezo mengine]] kuh
'listgrouprights-removegroup-self-all' => 'Kuondoa makundi yote kutoka akaunti ya binafsi',
# E-mail user
-'mailnologin' => 'Hakuna anwani wa kutuma',
-'mailnologintext' => 'Ukitaka kutuma barua pepe kwa watumiaji wengine inabidi uwe [[Special:UserLogin|umeshaingia kwenye akaunti yako]] na pia uwe na anwani ya barua pepe sahihi pale [[Special:Preferences|mapendekezo yako]].',
-'emailuser' => 'Mtumie mtumiaji huyu barua pepe',
-'emailpage' => 'Kumtumia mtumiaji barua pepe',
-'emailpagetext' => 'Utumie fomu iliopo chini ili kutuma barua pepe kwa mtumiaji huyu.
+'mailnologin' => 'Hakuna anwani wa kutuma',
+'mailnologintext' => 'Ukitaka kutuma barua pepe kwa watumiaji wengine inabidi uwe [[Special:UserLogin|umeshaingia kwenye akaunti yako]] na pia uwe na anwani ya barua pepe sahihi pale [[Special:Preferences|mapendekezo yako]].',
+'emailuser' => 'Mtumie mtumiaji huyu barua pepe',
+'emailpage' => 'Kumtumia mtumiaji barua pepe',
+'emailpagetext' => 'Utumie fomu iliopo chini ili kutuma barua pepe kwa mtumiaji huyu.
Anwani yako ya barua pepe ulioitaja katika [[Special:Preferences|mapendekezo yako]] itaandikwa kwenye sanduku la anwani "Kutoka kwa" katika barua pepe, ili mtu atakayeipokea aweze kukujibu moja kwa moja.',
-'usermailererror' => 'Chombo cha ujumbe kimerejesha hitilafu:',
-'defemailsubject' => 'Barua pepe ya {{SITENAME}}',
-'noemailtitle' => 'Anwani ya barua pepe hakuna',
-'noemailtext' => 'Mtumiaji huyu hajataja anwani sahihi ya barua pepe.',
-'nowikiemailtitle' => 'Barua pepe haziruhusiwi',
-'nowikiemailtext' => 'Mtumiaji huyu hajakubali kupokea barua pepe kutoka kwa watumiaji wengine.',
-'email-legend' => 'Tuma barua pepe kwa mtumiaji mwingine wa {{SITENAME}}',
-'emailfrom' => 'Kutoka kwa:',
-'emailto' => 'Kwa:',
-'emailsubject' => 'Mada:',
-'emailmessage' => 'Ujumbe:',
-'emailsend' => 'Tuma',
-'emailccme' => 'Tuma nakala ya barua yangu ya pepe kwangu.',
-'emailccsubject' => 'Nakala ya barua pepe uliotuma kwa $1: $2',
-'emailsent' => 'Barua pepe imetumwa',
-'emailsenttext' => 'Barua pepe yako imetumwa.',
-'emailuserfooter' => 'Barua pepe hii imetumwa na $1 kwa $2 kwa kutumia zana ya "Kumtumia mtumiaji barua pepe" iliyopo {{SITENAME}}.',
+'usermailererror' => 'Chombo cha ujumbe kimerejesha hitilafu:',
+'defemailsubject' => 'Barua pepe ya {{SITENAME}}',
+'usermaildisabled' => 'Uwezo wa kutuma barua pepe kwa mtumiaji umesitishwa',
+'usermaildisabledtext' => 'Huwezi kutuma barua pepe kwa watumiaji wengine wa wiki hii',
+'noemailtitle' => 'Anwani ya barua pepe hakuna',
+'noemailtext' => 'Mtumiaji huyu hajataja anwani sahihi ya barua pepe.',
+'nowikiemailtitle' => 'Barua pepe haziruhusiwi',
+'nowikiemailtext' => 'Mtumiaji huyu hajakubali kupokea barua pepe kutoka kwa watumiaji wengine.',
+'email-legend' => 'Tuma barua pepe kwa mtumiaji mwingine wa {{SITENAME}}',
+'emailfrom' => 'Kutoka kwa:',
+'emailto' => 'Kwa:',
+'emailsubject' => 'Mada:',
+'emailmessage' => 'Ujumbe:',
+'emailsend' => 'Tuma',
+'emailccme' => 'Tuma nakala ya barua yangu ya pepe kwangu.',
+'emailccsubject' => 'Nakala ya barua pepe uliotuma kwa $1: $2',
+'emailsent' => 'Barua pepe imetumwa',
+'emailsenttext' => 'Barua pepe yako imetumwa.',
+'emailuserfooter' => 'Barua pepe hii imetumwa na $1 kwa $2 kwa kutumia zana ya "Kumtumia mtumiaji barua pepe" iliyopo {{SITENAME}}.',
# Watchlist
'watchlist' => 'Maangalizi yangu',
'mywatchlist' => 'Maangalizi yangu',
-'watchlistfor' => "(kwa '''$1''')",
+'watchlistfor2' => 'Kwa ajili ya $1 $2',
'nowatchlist' => 'Hamna vitu katika maangalizi yako.',
'watchlistanontext' => 'Tafadhali $1 ili kutazama au kuhariri vitu vilivyopo katika orodha yako ya maangalizi.',
'watchnologin' => 'Hujaingia',
@@ -1945,6 +1988,9 @@ ukurasa huu una mhariri mmoja tu.',
'revertpage-nouser' => 'Masahihisho ya mtumiaji (jina lake limefichwa) yamerudishwa hadi pitio la mwisho lililotengenezwa na [[User:$1|$1]].',
'rollback-success' => 'Masahihisho aliyeyafanya $1 yalirejeshwa hadi kufika sahihisho la mwisho aliyefanya $2.',
+# Edit tokens
+'sessionfailure-title' => 'Kushindikana cha kipindi',
+
# Protect
'protectlogpage' => 'Kumbukumbu ya ulindaji',
'protectedarticle' => 'aliulinda "[[$1]]"',
@@ -2041,19 +2087,23 @@ $1',
'month' => 'Kutoka mwezi (na zamani zaidi):',
'year' => 'Kutoka mwakani (na zamani zaidi):',
-'sp-contributions-newbies' => 'Onyesha michango ya akaunti mpya tu',
-'sp-contributions-newbies-sub' => 'Kwa akaunti mpya',
-'sp-contributions-newbies-title' => 'Michango ya watumiaji wenye akaunti mpya',
-'sp-contributions-blocklog' => 'Kumbukumbu ya uzuio',
-'sp-contributions-deleted' => 'michango iliyofutwa ya mtumiaji',
-'sp-contributions-logs' => 'kumbukumbu',
-'sp-contributions-talk' => 'majadiliano',
-'sp-contributions-userrights' => 'usimamizi wa wezo za mtumiaji',
-'sp-contributions-blocked-notice' => 'Mtumiaji huyu bado amezuiwa.
+'sp-contributions-newbies' => 'Onyesha michango ya akaunti mpya tu',
+'sp-contributions-newbies-sub' => 'Kwa akaunti mpya',
+'sp-contributions-newbies-title' => 'Michango ya watumiaji wenye akaunti mpya',
+'sp-contributions-blocklog' => 'Kumbukumbu ya uzuio',
+'sp-contributions-deleted' => 'michango iliyofutwa ya mtumiaji',
+'sp-contributions-uploads' => 'vipakizaji',
+'sp-contributions-logs' => 'kumbukumbu',
+'sp-contributions-talk' => 'majadiliano',
+'sp-contributions-userrights' => 'usimamizi wa wezo za mtumiaji',
+'sp-contributions-blocked-notice' => 'Mtumiaji huyu bado amezuiwa.
Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
-'sp-contributions-search' => 'Tafuta michango',
-'sp-contributions-username' => 'Anwani ya IP au jina la mtumiaji:',
-'sp-contributions-submit' => 'Tafuta',
+'sp-contributions-blocked-notice-anon' => 'Anwani huyu ya IP bado imezuiwa.
+Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
+'sp-contributions-search' => 'Tafuta michango',
+'sp-contributions-username' => 'Anwani ya IP au jina la mtumiaji:',
+'sp-contributions-toponly' => 'Yaonyeshwe maharirio ya mwisho tu katika ukurasa',
+'sp-contributions-submit' => 'Tafuta',
# What links here
'whatlinkshere' => 'Viungo viungavyo ukurasa huu',
@@ -2078,6 +2128,9 @@ Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
'blockip' => 'Zuia mtumiaji',
'blockip-title' => 'Kumzuia mtumiaji',
'blockip-legend' => 'Kumzuia mtumiaji',
+'blockiptext' => 'Tumia fomu iliyopo chini kumzuia mtu asihariri kwa kupitia anwani fulani wa IP au kwa kutumia jina fulani la mtumiaji.
+Nia ya kumzuia mtu inatakiwa kuwa kuzuia uharibifu tu, na ifanikiwe kutokana na masharti ya [[{{MediaWiki:Policy-url}}|sera]].
+Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizoharibiwa).',
'ipaddress' => 'Anwani ya IP:',
'ipadressorusername' => 'Anwani ya IP au jina la mtumiaji:',
'ipbexpiry' => 'Itakwisha:',
@@ -2106,10 +2159,13 @@ Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
'badipaddress' => 'Anwani batili ya IP',
'blockipsuccesssub' => 'Kulifaulu kumzuia',
'ipb-edit-dropdown' => 'Hariri sababu za kuzuia',
+'ipb-unblock-addr' => 'Acha kumzuia $1',
+'ipb-unblock' => 'Acha kumzuia mtumiaji au anwani wa IP',
'ipb-blocklist-contribs' => 'Michango ya $1',
-'ipblocklist' => 'Anwani za IP na majina ya watumiaji waliozuiliwa',
+'ipblocklist' => 'Watumiaji waliozuiliwa',
'ipblocklist-username' => 'Jina la mtumiaji au anwani ya IP:',
'ipblocklist-submit' => 'Tafuta',
+'ipblocklist-otherblocks' => ' {{PLURAL:$1|Uzuio mwingine|Zuio zingine}}',
'blocklistline' => '$1, $2 alimzuia $3 ($4)',
'infiniteblock' => 'milele',
'expiringblock' => 'inakwisha tarehe $1 saa $2',
@@ -2189,6 +2245,8 @@ Chagua jina lengine.',
'movetalk' => 'Hamisha ukurasa wake wa majadiliano',
'move-subpages' => 'Hamisha kurasa ndogo (hadi $1)',
'move-talk-subpages' => 'Hamisha kurasa ndogo za ukurasa wa majadiliano (hadi $1)',
+'movepage-page-moved' => 'Ukurasa wa $1 umehamishwa hadi $2.',
+'movepage-page-unmoved' => 'Ukurasa wa $1 hakuweza kuhamishwa hadi $2.',
'1movedto2' => '[[$1]] umesogezwa hapa [[$2]]',
'1movedto2_redir' => 'alihamisha [[$1]] kwenda [[$2]] kwa kutengeneza elekezo',
'movelogpage' => 'Kumbukumbu ya uhamiaji',
@@ -2206,6 +2264,7 @@ Chagua jina lengine.',
'immobile-source-page' => 'Ukurasa huu hauwezi kuhamishwa.',
'immobile-target-page' => 'Kuhamisha katika jina hilo la mwishilio haiwezikani.',
'imagenocrossnamespace' => 'Faili linaweza kuhamishwa katika eneo la wiki la faili tu.',
+'nonfile-cannot-move-to-file' => 'Ni mafaili tu yanayoweza kuhamishwa katika eneo la faili',
'imageinvalidfilename' => 'Jina la faili la mwishilio ni batili',
'fix-double-redirects' => 'Sasisha maelekezo yanayoelekeza jina la awali la faili',
'move-leave-redirect' => 'Weka elekezo mahali pake',
@@ -2279,12 +2338,14 @@ Ulihafadhi katika tarakalishi yako, halafu ulipakie hapa.',
'importstart' => 'Kurasa zinaletwa...',
'import-revision-count' => '{{PLURAL:$1|pitio|mapitio}} $1',
'importnopages' => 'Hakuna kurasa za kuleta.',
+'imported-log-entries' => 'Kumbukumbu $1 {{PLURAL:$1|ililetwa|zililetwa}}.',
'importfailed' => 'Kuleta hakufaulu: <nowiki>$1</nowiki>',
'importunknownsource' => 'Aina ya kitu unacholeta haijulikani',
'importcantopen' => 'Faili lililoletwa halikuweza kufunguliwa',
'importbadinterwiki' => 'Kiungo kibovu kati za wiki',
'importnotext' => 'Tupu au bila maandishi',
'importsuccess' => 'Kuleta kumekamilishwa!',
+'import-noarticle' => 'Hakuna kurasa za kuleta!',
'import-token-mismatch' => 'Data ya kipindi zilipotelewa.
Tafadhali jaribu tena.',
@@ -2356,6 +2417,8 @@ Tafadhali jaribu tena.',
'tooltip-upload' => 'Kuanza kupakia',
'tooltip-rollback' => '"Rejesha" inarejesha (ma)sahihisho ya ukurasa huu yaliyofanyika na yule aliyeuhariri mwishoni, kwa kubofya mara moja tu.',
'tooltip-undo' => 'Ukibonyeza "tengua" sahihisho hili litarejeshwa na hakiki yake itaonekana pamoja na dirisha la kuhariri, ili uweze kuandika sababu na maelezo kwenye muhtasari.',
+'tooltip-preferences-save' => 'Uhifadhi mapendekezo',
+'tooltip-summary' => 'Andika muhtasari mfupi',
# Attribution
'anonymous' => '{{PLURAL:$1|mtumiaji bila jina|watumiaji bila majina}} wa {{SITENAME}}',
@@ -2381,6 +2444,7 @@ Tafadhali jaribu tena.',
'math_unknown_error' => 'hitilafu isiyojulikana',
# Patrol log
+'patrol-log-line' => 'aliweka alama ya kufanyiwa doria katika $1 ya $2 $3',
'patrol-log-auto' => '(kwa kujiendesha)',
'patrol-log-diff' => 'pitio la $1',
@@ -2401,12 +2465,13 @@ Ukilitekeleza faili, mashine yako huenda ikawa matatani.',
'imagemaxsize' => "Kikomo cha ukubwa wa picha:<br />''(cha kurasa za maelezo ya mafaili)''",
'thumbsize' => 'Ukubwa wa picha ndogo:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|ukurasa|kurasa}} $3',
-'file-info' => '(ukubwa wa faili: $1, aina ya MIME: $2)',
-'file-info-size' => '(piseli $1 × $2, saizi ya faili: $3, aina ya MIME: $4)',
+'file-info' => 'ukubwa wa faili: $1, aina ya MIME: $2',
+'file-info-size' => 'piseli $1 × $2, saizi ya faili: $3, aina ya MIME: $4',
'file-nohires' => '<small>Hakuna saizi kubwa zaidi.</small>',
-'svg-long-desc' => '(faili la SVG, husemwa kuwa piseli $1 × $2, saizi ya faili: $3)',
+'svg-long-desc' => 'faili la SVG, husemwa kuwa piseli $1 × $2, saizi ya faili: $3',
'show-big-image' => 'Ukubwa wa awali',
'show-big-image-thumb' => '<small>Ukubwa wa hakikisho hili: piseli $1 x $2</small>',
+'file-info-png-repeat' => 'inachezwa {{PLURAL:$1|mara}} $1',
# Special:NewFiles
'newimages' => 'Mkusanyiko wa mafaili mapya',
@@ -2457,6 +2522,8 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
'exif-copyright' => 'Mwenye hatimiliki',
'exif-exifversion' => 'Mtindo wa Exif',
'exif-componentsconfiguration' => 'Maana ya kila kijenzi',
+'exif-pixelydimension' => 'Upana wa picha',
+'exif-pixelxdimension' => 'Urefu wa picha',
'exif-makernote' => 'Maelezo ya mtengenezaji',
'exif-usercomment' => 'Maoni ya mtumiaji',
'exif-relatedsoundfile' => 'Faili la sauti linalohusika',
@@ -2474,7 +2541,9 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
'exif-gpsdestlatitude' => 'Latitudo ya kikomo',
'exif-gpsdestlongitude' => 'Longitudo ya kikomo',
'exif-gpsdestdistance' => 'Mbali wa kikomo',
+'exif-gpsareainformation' => 'Jina la eneo la GPS',
'exif-gpsdatestamp' => 'Tarehe ya GPS',
+'exif-objectname' => 'Jina fupi',
'exif-unknowndate' => 'Tarehe haijulikani',
@@ -2559,31 +2628,31 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
'limitall' => 'zote',
# E-mail address confirmation
-'confirmemail' => 'Kuyakinisha anwani ya barua pepe',
-'confirmemail_noemail' => 'Hakuna anwani ya barua pepe halali kwenye [[Special:Preferences|mapendekezo yako]].',
-'confirmemail_text' => '{{SITENAME}} inakutakia uyakinishe anwani yako ya barua pepe kabla kutumia zana zinazohusika barua pepe.
+'confirmemail' => 'Kuyakinisha anwani ya barua pepe',
+'confirmemail_noemail' => 'Hakuna anwani ya barua pepe halali kwenye [[Special:Preferences|mapendekezo yako]].',
+'confirmemail_text' => '{{SITENAME}} inakutakia uyakinishe anwani yako ya barua pepe kabla kutumia zana zinazohusika barua pepe.
Bofya kibonyezi cha chini kuituma barua pepe ya kuyakinisha kwa anwani yako.
Ndani ya barua pepe patakuwa na kiungo chenye ishara;
tumia kiungo kwenye kivinjari chako ili kuyakinisha kwamba anwani yako ya barua pepe ni halali.',
-'confirmemail_pending' => 'Ishara za kuidhinisha zimeshatumwa kwako kwa njia ya barua pepe;
+'confirmemail_pending' => 'Ishara za kuidhinisha zimeshatumwa kwako kwa njia ya barua pepe;
ikiwa umeanzisha akaunti yako sasa hivi tu, tafadhali subiri dakika chache zifike, kabla hujaribu kuomba ishara zingine.',
-'confirmemail_send' => 'Nitumie ishara za kuyakinisha',
-'confirmemail_sent' => 'Barua pepe ya kuyakinisha imetumwa.',
-'confirmemail_oncreate' => 'Ishara za kuyakinisha zilitumwa kwa anwani yako ya barua pepe.
+'confirmemail_send' => 'Nitumie ishara za kuyakinisha',
+'confirmemail_sent' => 'Barua pepe ya kuyakinisha imetumwa.',
+'confirmemail_oncreate' => 'Ishara za kuyakinisha zilitumwa kwa anwani yako ya barua pepe.
Huhitaji ishara hizi ili kuingia akaunti yako, lakini utazihitaji ili kuwezesha zana zozote za wiki hii zinazotumia barua pepe.',
-'confirmemail_sendfailed' => '{{SITENAME}} haikufaulu kutuma barua pepe ya kuyakinisha kwako.
+'confirmemail_sendfailed' => '{{SITENAME}} haikufaulu kutuma barua pepe ya kuyakinisha kwako.
Tafadhali uhakikishe kwamba hakuna ishara batili katika anwani yako ya barua pepe.
Huduma ya barua pepe inasema: $1',
-'confirmemail_invalid' => 'Ishara za kuyakinisha ni batili.
+'confirmemail_invalid' => 'Ishara za kuyakinisha ni batili.
Huenda zimepitwa na wakati.',
-'confirmemail_needlogin' => 'Unahitajika $1 kuthibitisha anwani ya barua pepe yako.',
-'confirmemail_success' => 'Barua pepe yako imethibitishwa.
+'confirmemail_needlogin' => 'Unahitajika $1 kuthibitisha anwani ya barua pepe yako.',
+'confirmemail_success' => 'Barua pepe yako imethibitishwa.
Sasa unaweza [[Special:UserLogin|kuingia]] na kuifurahia {{SITENAME}}.',
-'confirmemail_loggedin' => 'Anwani ya barua pepe yako imethibishwa sasa.',
-'confirmemail_error' => 'Kuna mambo yameenda kombo hifadhi ukamilisho wako.',
-'confirmemail_subject' => 'Barua pepe ya uthibitisho ya {{SITENAME}}',
-'confirmemail_body' => 'Kuna mtu, huenda ikawa wewe, kutoka anwani ya IP $1, amesajili akaunti "$2" na anwani ya barua pepe hii kwenye {{SITENAME}}.
+'confirmemail_loggedin' => 'Anwani ya barua pepe yako imethibishwa sasa.',
+'confirmemail_error' => 'Kuna mambo yameenda kombo hifadhi ukamilisho wako.',
+'confirmemail_subject' => 'Barua pepe ya uthibitisho ya {{SITENAME}}',
+'confirmemail_body' => 'Kuna mtu, huenda ikawa wewe, kutoka anwani ya IP $1, amesajili akaunti "$2" na anwani ya barua pepe hii kwenye {{SITENAME}}.
Kuthibitisha ya kwamba akaunti hii inamilikiwa na wewe, unatakiwa kuwezesha njia ya barua pepe kwenye {{SITENAME}}, fungua kiungo hiki katika kivinjari chako:
@@ -2594,13 +2663,38 @@ na kama *huja* sajili akaunti hii, fuata kiungo hiki ili kubatilisha uthibitisho
$5
Kodi hizi za uthibitisho zitaishia mnamo $4.',
-'confirmemail_invalidated' => 'Uthibitisho wa barua pepe umebatilishwa.',
-'invalidateemail' => 'Batilisha barua pepe ya uthibitisho.',
+'confirmemail_body_changed' => 'Kuna mtu, huenda ikawa wewe, kutoka anwani ya IP $1, ambaye amebadilisha anwani ya barua pepe ya akaunti "$2" iwe anwani ya barua pepe hii, kule {{SITENAME}}.
+
+Ili kuthibitisha ya kwamba akaunti hii inamilikiwa na wewe, pamoja na kuwezesha upya zana zinazotumia barua pepe kule {{SITENAME}}, ufungue kiungo hiki katika kivinjari chako:
+
+$3
+
+na kama *huja* sajili akaunti hii, fuata kiungo hiki ili kubatilisha uthibitisho wa anwani ya barua pepe:
+
+$5
+
+Ishara hizi za uthibitisho zitaishia mnamo $4.',
+'confirmemail_body_set' => 'Kuna mtu, huenda ikawa wewe, kutoka anwani ya IP $1, ambaye ameweka anwani ya barua pepe ya akaunti "$2" iwe anwani ya barua pepe hii, kule {{SITENAME}}.
+
+Ili kuthibitisha ya kwamba akaunti hii inamilikiwa na wewe, pamoja na kuwezesha upya zana zinazotumia barua pepe kule {{SITENAME}}, ufungue kiungo hiki katika kivinjari chako:
+
+$3
+
+na kama *huja* sajili akaunti hii, fuata kiungo hiki ili kubatilisha uthibitisho wa anwani ya barua pepe:
+
+$5
+
+Ishara hizi za uthibitisho zitaishia mnamo $4.',
+'confirmemail_invalidated' => 'Uthibitisho wa barua pepe umebatilishwa.',
+'invalidateemail' => 'Batilisha barua pepe ya uthibitisho.',
# Scary transclusion
'scarytranscludefailed' => '[Kuleta kigezo imeshindikana kwa ajili ya $1]',
'scarytranscludetoolong' => '[URL ni ndefu mno]',
+# Trackbacks
+'trackbackremove' => '([$1 Futa])',
+
# Delete conflict
'deletedwhileediting' => "'''Ilani''': Ukurasa huu ulifutwa ulipokwisha kuanza huuhariri!",
'confirmrecreate' => "Mtumiaji [[User:$1|$1]] ([[User talk:$1|majadiliano]]) aliufuta ukurasa huu wakati umeshaanza kuuhariri, akaandika sababu hii ya kufuta:
@@ -2627,6 +2721,7 @@ Tafadhali uthibitishe kwamba kweli unataka kuanzisha ukurasa huu upya.",
'table_pager_first' => 'Ukurasa wa kwanza',
'table_pager_last' => 'Ukurasa wa mwisho',
'table_pager_limit' => 'Ionyeshwe vitu $1 katika kila ukurasa',
+'table_pager_limit_label' => 'Vitu katika kila ukurasa:',
'table_pager_limit_submit' => 'Nenda',
'table_pager_empty' => 'Hakuna matokeo',
@@ -2674,15 +2769,26 @@ Pia unaweza [[Special:Watchlist/edit|kutumia kihariri cha kawaida]].',
'watchlisttools-edit' => 'Tazama na hariri maangalizi',
'watchlisttools-raw' => 'Hariri maangalizi ghafi',
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Ilani:\'\'\' Neno msingi "$2" ya kupanga inafanya vingine na neno msingi "$1" ya kupanga lilotangulia.',
+
# Special:Version
-'version' => 'Toleo',
-'version-specialpages' => 'Kurasa maalum',
-'version-other' => 'Zingine',
-'version-version' => '(Toleo $1)',
-'version-license' => 'Ruhusa',
-'version-software' => 'Bidhaa pepe iliyosakinishwa',
-'version-software-product' => 'Bidhaa',
-'version-software-version' => 'Toleo',
+'version' => 'Toleo',
+'version-specialpages' => 'Kurasa maalum',
+'version-skins' => 'Maumbo',
+'version-other' => 'Zingine',
+'version-version' => '(Toleo $1)',
+'version-license' => 'Ruhusa',
+'version-poweredby-credits' => "Wiki hii inaendeshwa na bidhaa pepe ya '''[http://www.mediawiki.org/ MediaWiki]''', hakimiliki © 2001-$1 $2.",
+'version-poweredby-others' => 'wengine',
+'version-license-info' => 'MediaWiki ni bidhaa pepe huru; unaweza kuigawanyika pamoja na kuitumia na kuibadilisha kutokana na masharti ya leseni ya GNU General Public License inayotolewa na Free Software Foundation (Shirika la Bidhaa Pepe Huru); ama toleo 2 la hakimiliki, ama (ukitaka) toleo lolote linalofuata.
+
+MediaWiki inagawanyiwa kwa kutumaini kwamba ni ya manufaa, lakini BILA JUKUMU; hata bila jukumu linalojitokeza la KUWA TAYARI KUUZIKA au KUFAA KWA KUSUDI FULANI. Tazama leseni ya GNU General Public License kuona maelezo mengine.
+
+Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public License] pamoja na programu hii; la sivyo, andika kuomba nakala kwa Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA au [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html uisome mkondoni].',
+'version-software' => 'Bidhaa pepe iliyosakinishwa',
+'version-software-product' => 'Bidhaa',
+'version-software-version' => 'Toleo',
# Special:FilePath
'filepath' => 'Njia ya faili',
@@ -2726,6 +2832,16 @@ Andika jina la faili bila kiambishi awali cha "{{ns:file}}:".',
'blankpage' => 'Ukurasa tupu',
'intentionallyblankpage' => 'Ukurasa huu umeachwa tupu kwa makusudi.',
+# External image whitelist
+'external_image_whitelist' => ' #Acha mstari huu jinsi ilivyo<pre>
+#Weka vipande vya uchanuzi wa kawaida (regex) (kipande kinachoingia kati ya // tu) hapo chini
+#Vipande hivi vitaoanishwa na URL ya picha za nje (na kiungo cha moto)
+#Vipande vinavyooanishwa vitaonekana kama picha, la sivyo, itaonyeshwa kiungo kinachokwenda katika picha tu
+#Mistari inayoanza na # zinatumiwa kama maelezo
+#Haitofautishana kati ya herufi kubwa na ndogo
+
+#Weka vipande vyote vya regex juu ya mstari huu. Acha mstari huu jinsi ilivyo</pre>',
+
# Special:Tags
'tag-filter' => 'Chujio cha [[Special:Tags|tagi]]:',
'tag-filter-submit' => 'Chuja',
@@ -2734,6 +2850,15 @@ Andika jina la faili bila kiambishi awali cha "{{ns:file}}:".',
'tags-edit' => 'hariri',
'tags-hitcount' => '{{PLURAL:$1|badiliko|mabadiliko}} $1',
+# Special:ComparePages
+'comparepages' => 'Linganisha kurasa',
+'compare-selector' => 'Kulinganisha mapitio',
+'compare-page1' => 'Ukurasa wa kwanza',
+'compare-page2' => 'Ukurasa wa pili',
+'compare-rev1' => 'Pitio la kwanza',
+'compare-rev2' => 'Pitio la pili',
+'compare-submit' => 'Linganisha',
+
# Database error messages
'dberr-header' => 'Wiki imekuta tatizo',
'dberr-problems' => 'Kumradhi!
@@ -2751,6 +2876,7 @@ Tovuti hii inapata matatatizo wakati huu.',
'htmlform-float-invalid' => 'Kitu ulichokiandika si namba.',
'htmlform-int-toolow' => 'Namba uliyoiandika iko chini ya kiwango cha chini cha $1',
'htmlform-int-toohigh' => 'Namba uliyoiandika iko juu ya kiwango cha juu cha $1',
+'htmlform-required' => 'Ni lazima kujaza kitu hapa',
'htmlform-submit' => 'Wasilisha',
'htmlform-reset' => 'Tengua mabadiliko',
'htmlform-selectorother-other' => 'Nyingine',
diff --git a/languages/messages/MessagesSzl.php b/languages/messages/MessagesSzl.php
index 2a7cef1b..c0080552 100644
--- a/languages/messages/MessagesSzl.php
+++ b/languages/messages/MessagesSzl.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Britscher
* @author Danny B.
* @author Djpalar
* @author Herr Kriss
@@ -22,42 +23,41 @@ $fallback = 'pl';
$messages = array(
# User preference toggles
-'tog-underline' => 'Podkryślyńy linkůw:',
+'tog-underline' => 'Podsztrychńyńcy linkůw:',
'tog-highlightbroken' => 'Uoznocz <a href="" class="new">tak</a> linki do zajtůw kere ńy trefjům (abo: dołůncz pytajńik<a href="" class="internal">?</a>).',
'tog-justify' => 'Wyrůwnowej tekst we akapitach (justowańy)',
-'tog-hideminor' => 'Schow drobne pomjyńańa we "Pomjyńanych na uostatku"',
-'tog-hidepatrolled' => 'Schowej sprowdzůne sprowjyńa we ńydowno pomjyńanych',
-'tog-newpageshidepatrolled' => 'Schowej sprowdzůne zajty na wykoźe nowych zajtůw',
-'tog-extendwatchlist' => 'Pokoż na mjij pozorliśće wszyjske, a ńy yno uostatńe půmjyńańa',
+'tog-hideminor' => 'Schow drobne pomjyńańa we ńydowno pomjyńanych',
+'tog-hidepatrolled' => 'Schow sprowdzůne sprowjyńa we ńydowno pomjyńanych',
+'tog-newpageshidepatrolled' => 'Schow sprowdzůne zajty na wykoźe nowych zajtůw',
+'tog-extendwatchlist' => 'Pokoż na mojij pozůrliśće wszyjske, a ńyjyno uostatńe sprowjyńa',
'tog-usenewrc' => 'Używej poszyrzyńo ńydowno pomjyńanych (JavaScript)',
'tog-numberheadings' => 'Automatyczno numeracyjo titlůw',
-'tog-showtoolbar' => 'Pokoż pasek przirzůndůw (JavaScript)',
-'tog-editondblclick' => 'Przyńdź do sprowjańo po podwůjnym klikńyńću (JavaScript)',
+'tog-showtoolbar' => 'Pokoż gurt werkcojgůw (JavaScript)',
+'tog-editondblclick' => 'Edycja napoczynajům dwa klikńyńća (JavaScript)',
'tog-editsection' => 'Kożdo tajla zajty sprowjano uosobno',
-'tog-editsectiononrightclick' => 'Klikńyńće prawym kneflym myszy na titlu tajli<br />napoczyno jigo sprowjańy(JavaScript)',
-'tog-showtoc' => 'Pokoż spis treśći (na zajtach, kere majům wjyncyj jak trzi tajle)',
-'tog-rememberpassword' => 'Pamjyntej můj ausdruk na tym komputrze',
-'tog-editwidth' => 'Poszyrz plac sprowjyń na cołki ekran',
-'tog-watchcreations' => 'Dowom pozůr na zajty, kere żech naszkryfloł',
-'tog-watchdefault' => 'Dowom pozůr na zajty, kere żech sprowjoł',
-'tog-watchmoves' => 'Dowom pozůr na zajty, kere żech przećepnył',
-'tog-watchdeletion' => 'Dowom pozůr na zajty, kere żech wyćepnył',
+'tog-editsectiononrightclick' => 'Klikńyńće prawym kneflym myszy na titlu tajli<br />napoczyno jego sprowjańy(JavaScript)',
+'tog-showtoc' => 'Pokoż spis treśći (na zajtach, kere majům wjyncy jak trzi tajle)',
+'tog-rememberpassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})',
+'tog-watchcreations' => 'Dowům pozůr na zajty, kere żech naszkryfloł',
+'tog-watchdefault' => 'Dowům pozůr na zajty, kere żech sprowjoł',
+'tog-watchmoves' => 'Dowům pozůr na zajty, kere żech przećepnył',
+'tog-watchdeletion' => 'Dowům pozůr na zajty, kere żech wyćepnył',
'tog-minordefault' => 'Kożde moje sprowjańy je ńywjelge',
-'tog-previewontop' => 'Pokoż poglůnd przed placym sprowjańo',
-'tog-previewonfirst' => 'Pokoż poglůnd zajty przi pjyrszym sprowjańu',
+'tog-previewontop' => 'Uobźyrej przed placym sprowjańo',
+'tog-previewonfirst' => 'Obźyrej zajta przi pjyrszym sprowjańu',
'tog-nocache' => 'Wypńij podrynczno pamjyńć',
'tog-enotifwatchlistpages' => 'Wyślij e-brifa, kej ftoś zmjyńi zajta, na kero dowom pozůr',
-'tog-enotifusertalkpages' => 'Wyślij e-brifa, kej zajta mojij godki bydźe zmjyńono',
-'tog-enotifminoredits' => 'Wyślij e-brifa tyž w takim raźe, kej by chodźiuo uo drobne pomjyńańa',
-'tog-enotifrevealaddr' => 'Ńy chow mojigo e-brifa w powjadomjyńach',
+'tog-enotifusertalkpages' => 'Wyślij e-brifa, kej zajta mojij godki bydźe pomjyńono',
+'tog-enotifminoredits' => 'Wyślij e-brifa tyż, kej by szło uo drobne pomjyńańa',
+'tog-enotifrevealaddr' => 'Ńy chow mojigo e-brifa we powjadomjyńach',
'tog-shownumberswatching' => 'Pokoż, wjela sprowjorzy dowo pozůr',
'tog-oldsig' => 'Teroźni wyglůnd Twojygo szrajbowańo',
'tog-fancysig' => 'Szrajbńij s kodůma wiki (bez autůmatycznygo linka)',
-'tog-externaleditor' => 'Sztandardowo używej zewnyntrznygo edytora (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
-'tog-externaldiff' => 'Sztandardowo używej zewnyntrzny program do filowańo w pomjyńańach (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
+'tog-externaleditor' => 'Sztandardowo używej zewnyntrzny edytor (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
+'tog-externaldiff' => 'Sztandardowo używej zewnyntrzny program do filowańo we pomjyńańach (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
'tog-showjumplinks' => 'Zapńij cajchnůndzki "przyńdź do"',
-'tog-uselivepreview' => 'Używej dynamicznygo poglůndu (JavaScript) (experymentalny)',
-'tog-forceeditsummary' => 'Dej znoć, kejbych ńic ńy naszkryfloł w uopiśe pomjyńań',
+'tog-uselivepreview' => 'Używej dynamiczne uobźyrańy (JavaScript) (eksperymentalny)',
+'tog-forceeditsummary' => 'Pedź, kejbych ńic ńy naszkryfloł we uopiśe pomjyńań',
'tog-watchlisthideown' => 'Schow moje pomjyńańa we artiklach, na kere dowom pozůr',
'tog-watchlisthidebots' => 'Schow pomjyńańa sprowjone bez boty we artiklach, na kere dowom pozůr',
'tog-watchlisthideminor' => 'Schow ńywjelge pomjyńańa w artiklach, na kere dowom pozůr',
@@ -74,8 +74,11 @@ $messages = array(
'underline-default' => 'Podug sztalowańo uoglůndarki',
# Font style option in Special:Preferences
-'editfont-style' => 'Styl czćůnki we placu sprowjyń:',
-'editfont-default' => 'Domyślno przeglůndarki',
+'editfont-style' => 'Styl czćůnki we placu sprowjyń:',
+'editfont-default' => 'Domyślno przeglůndarki',
+'editfont-monospace' => 'Monotypowe krojło',
+'editfont-sansserif' => 'Bezszeryfowe krojło',
+'editfont-serif' => 'Szeryfowe krojło',
# Dates
'sunday' => 'Ńedźela',
@@ -144,6 +147,8 @@ $messages = array(
'category-file-count' => '{{PLURAL:$2|W katygoryji snojduje śe jydyn plik.|W katygoryji {{PLURAL:$1|je pokozany $1 plik|sům pokozane $1 pliki|je pokozanych $1 plikůw}} s cołkyj liczby $2 plikůw.}}',
'category-file-count-limited' => 'W katygoryji {{PLURAL:$1|je pokozany $1 plik|sům pokozane $1 pliki|je pokozanych $1 plikůw}}.',
'listingcontinuesabbrev' => 'ć.d.',
+'index-category' => 'Indeksowane zajty',
+'noindex-category' => 'Ńyindeksowane zajty',
'mainpagetext' => "'''Sztalowańy MediaWiki śe udoło.'''",
'mainpagedocfooter' => 'Uobezdrzij [http://meta.wikimedia.org/wiki/Help:Contents przewodńik sprowjacza], kaj sům informacyje uo dźołańu uoprogramowańo MediaWiki.
@@ -175,11 +180,19 @@ $messages = array(
'faq' => 'FAQ',
'faqpage' => 'Project:FAQ',
+# Vector skin
+'vector-view-edit' => '↓ Sprowjej',
+'vector-view-history' => '↓Uobocz gyszichta',
+'vector-view-view' => 'Czytej',
+'actions' => '↓ Akcyje',
+'namespaces' => '↓ Raumy mjan',
+'variants' => '↓ Warjanty',
+
'errorpagetitle' => 'Feler',
'returnto' => 'Nazod do zajty $1.',
'tagline' => 'S {{GRAMMAR:D.lp|{{SITENAME}}}}',
'help' => 'Půmoc',
-'search' => 'Szukej',
+'search' => 'Sznupej',
'searchbutton' => 'Sznupej',
'go' => 'Przyńdź',
'searcharticle' => 'Przyńdź',
@@ -190,7 +203,7 @@ $messages = array(
'printableversion' => 'Wersyjo do durku',
'permalink' => 'Bezpostrzedńi link',
'print' => 'Durkuj',
-'edit' => 'sprowjej',
+'edit' => 'Sprowjej',
'create' => 'Stwůrz',
'editthispage' => 'Sprowjej ta zajta',
'create-this-page' => 'Stwůrz ta zajta',
@@ -204,12 +217,12 @@ $messages = array(
'unprotectthispage' => 'Uodymkńij ta zajta',
'newpage' => 'Nowy artikel',
'talkpage' => 'Godej uo tym artiklu',
-'talkpagelinktext' => 'dyskusyjo',
+'talkpagelinktext' => 'Dyskusyjo',
'specialpage' => 'Å pecyjalno zajta',
'personaltools' => 'Uosobiste',
'postcomment' => 'Skůmyntuj',
'articlepage' => 'Zajta artikla',
-'talk' => 'dyskusyjo',
+'talk' => 'Dyskusyjo',
'views' => 'Widok',
'toolbox' => 'Werkcojg',
'userpage' => 'Zajta sprowjorza',
@@ -235,19 +248,19 @@ $messages = array(
'aboutpage' => 'Project:Uo serwiśe',
'copyright' => 'Tekst udostympńany na licencyji $1.',
'copyrightpage' => '{{ns:project}}:Prawa autorske',
-'currentevents' => 'Bježůnce wydařyńa',
-'currentevents-url' => 'Project:Bježůnce wydařyńa',
-'disclaimers' => 'Informacyje prawne',
-'disclaimerpage' => 'Project:Informacyje prawne',
+'currentevents' => 'Aktualne przitrefjyńa',
+'currentevents-url' => 'Project:Aktualne przitrefjyńa',
+'disclaimers' => 'Prawne informacyje',
+'disclaimerpage' => 'Project:Prawne informacyje',
'edithelp' => 'Pomoc we pomjyńańu',
'edithelppage' => 'Help:Jak pomjyńać zajta',
-'helppage' => 'Help:Pomoc',
+'helppage' => 'Help:Spis treśći',
'mainpage' => 'Przodńo zajta',
'mainpage-description' => 'Przodńo zajta',
'policy-url' => 'Project:Prawidua',
-'portal' => 'Portal užytkowńikůw',
-'portal-url' => 'Project:Portal užytkowńikůw',
-'privacy' => 'Zasady chrońyńo prywatnośći',
+'portal' => 'Portal używaczůw',
+'portal-url' => 'Project:Portal używaczůw',
+'privacy' => 'Prowidła chrůńyńo prywatności',
'privacypage' => 'Project:Zasady chrońyńo prywatnośći',
'badaccess' => 'Felerne uprawńyńo',
@@ -263,7 +276,7 @@ $messages = array(
'newmessageslink' => 'nowe powjadůmjyńa',
'newmessagesdifflink' => 'uostatńe pomjyńyńy',
'youhavenewmessagesmulti' => 'Mosz nowe powjadůmjyńa: $1',
-'editsection' => 'sprowjej',
+'editsection' => 'Sprowjej',
'editold' => 'sprowjej',
'viewsourceold' => 'pokoż zdrzůdło',
'editlink' => 'sprowjej',
@@ -282,7 +295,7 @@ $messages = array(
'site-atom-feed' => 'Kanau Atom {{GRAMMAR:D.lp|$1}}',
'page-rss-feed' => 'Kanau RSS "$1"',
'page-atom-feed' => 'Kanau Atom "$1"',
-'red-link-title' => '$1 (Å„y ma zajty)',
+'red-link-title' => '$1 (Å„y mo zajty)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Zajta',
@@ -383,7 +396,7 @@ Uotwarli my sam lo Ćebje kůnto.
'yourname' => 'Mjano užytkowńika:',
'yourpassword' => 'Hasuo:',
'yourpasswordagain' => 'Naškryflej hasuo zaś',
-'remembermypassword' => 'Zapamjyntej moje hasuo na tym kůmputře',
+'remembermypassword' => '↓Spamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dni}})',
'yourdomainname' => 'Twoja domyna',
'externaldberror' => 'Je jaki feler we zewnyntřnyj baźe autentyfikacyjnyj, abo ńy moš uprawńyń potřebnych do aktualizacyji zewnyntřnego kůnta.',
'login' => 'Zaloguj śe',
@@ -537,11 +550,11 @@ Možeš to zrobić we [[Special:Preferences|swojich štalowańach]].',
'accmailtitle' => 'Hasuo wysuane.',
'accmailtext' => 'Hasuo užytkowńika "$1" zostauo wysuane pod adres $2.',
'newarticle' => '(Nowy)',
-'newarticletext' => 'Ńy ma sam jeÅ¡Äe artikla uo tym tytule. W polu Å„ižyj možeÅ¡ naÅ¡kryflać jygo pjyrÅ¡y fragmynt. Kej chćoužeÅ› zrobić co inkÅ¡e, naćiÅ› ino knefel "Nazod".',
+'newarticletext' => 'Ńy ma sam jeszcze artikla uo tyj titli. Eli chcesz go sprowjać, naszkryflej niżyj jego tekst (wjyncy informacyj najdźesz [[{{MediaWiki:Helppage}}|na zajće půmocy]]). Eli żeś chćoł zrobić cosik inksze, naćiś ino knefel "Nazod".',
'anontalkpagetext' => "---- ''To jest zajta godki lo užytkowÅ„ikůw anůnimowych - takich, keÅ™i Å„y majům jeÅ¡Äe swojigo kůnta abo Å„y chcům go terozki užywać.
By jeich idyntyfikować, užywomy numerůw IP.
Jeli ježeÅ› anůnimowym užytkowÅ„ikym a wydowo Ći Å›e, aže zamjyÅ¡Äůne sam kůmyntoÅ™e Å„y sům skjyrowane do Ćebje, [[Special:UserLogin|utwůř proÅ¡a kůnto]] abo [[Special:UserLogin|zalůguj Å›e]] - bez tůž uÅ„ikÅ„eÅ¡ potym podobnych Å„yporozumjyÅ„.''",
-'noarticletext' => 'Ńy můmy zajty uo takij titli. Mogesz [{{fullurl:{{FULLPAGENAME}}|action=edit}} wćepać artikel {{FULLPAGENAME}}] abo [[Special:Search/{{PAGENAME}}|szukać {{PAGENAME}} we inkszych artiklach]].',
+'noarticletext' => 'Ńy můmy zajta uo takij titli. Mogesz [{{fullurl:{{FULLPAGENAME}}|action=edit}} wćepać artikel {{FULLPAGENAME}}] abo [[Special:Search/{{PAGENAME}}|sznupać {{PAGENAME}} we inkszych]].',
'userpage-userdoesnotexist' => 'Užytkowńik "$1" ńy je zareještrowany. Sprowdź eli na pewno chćoužeś stwořyć/pomjynić gynau ta zajta.',
'clearyourcache' => "'''Dej pozůr:''' Coby uobejÅ™eć pomjyÅ„aÅ„o pů naÅ¡kryflaÅ„u nowych Å¡talowaÅ„ poleć pÅ™eglůndorce wyÄyśćić zawartość pamjyńći podrynÄnyj (cache). '''Mozilla / Firefox / Safari:''' pÅ™itÅ™imej ''Shift'' klikajůnc na ''UodÅ›wjyž'' abo wciÅ› ''Ctrl-Shift-R'' (''Cmd-Shift-R'' na Macintoshu), '''IE :''' pÅ™itÅ™imej ''Ctrl'' klikajůnc na ''UodÅ›wjyž'' abo wciÅ› ''Ctrl-F5''; '''Konqueror:''': kliknij knefel ''UodÅ›wjyž'' abo wciÅ› ''F5''; užytkowÅ„icy '''Opery''' mogům być zmuÅ¡eÅ„i coby coukym wyÄyśćić jejich pamjyńć podrynÄno we menu ''Werkcojgi→Preferencyje''.; '''Internet Explorer:''' tÅ™im ''Ctrl'' a wćiÅ› ''UodÅ›wjyž'', abo wćiÅ› ''Ctrl-F5''.",
'usercssyoucanpreview' => "'''Podpowjydź:''' Užyj knefla \"Podglůnd\", coby přetestować Twůj nowy arkuš stylůw CSS abo kod JavaScript před jego zašrajbowańym.",
@@ -549,7 +562,7 @@ Jeli ježeÅ› anůnimowym užytkowÅ„ikym a wydowo Ći Å›e, aže zamjyÅ¡Äůne sam
'usercsspreview' => "'''Pamjyntej, aže to je na raźe ino podglůnd Twojego arkuša stylůw CSS.'''
'''Ńic jeÅ¡Äe Å„y zostouo naÅ¡kryflone!'''",
'userjspreview' => "'''Pamjyntej, aže to je na raźe ino podglůnd Twojego JavaScriptu - nic jeÅ¡Äe Å„y zostouo naÅ¡kryflone!'''",
-'userinvalidcssjstitle' => "'''Pozůr:''' Ńy mo skůrki uo mjaÅ„e \"\$1\". Pamjyntej, aže zajty užytkowÅ„ika zawjyrajůnce CSS i JavaScript powinny zaÄynać Å›e mouům buchÅ¡tabům, np. {{ns:user}}:Foo/monobook.css.",
+'userinvalidcssjstitle' => "'''Pozůr:''' Ńy mo skůrki uo mjaÅ„e \"\$1\". Pamjyntej, aže zajty užytkowÅ„ika zawjyrajůnce CSS i JavaScript powinny zaÄynać Å›e mouům buchÅ¡tabům, np. {{ns:user}}:Foo/vector.css.",
'updated' => '(Pomjyńano)',
'note' => "'''Pozůr:'''",
'previewnote' => "'''To je ino podglůnd - artikel jeÅ¡Äe Å„y je naÅ¡kryflany!'''",
@@ -580,7 +593,6 @@ By wćepać swoje pomjyńańo muśiš pomjyńać tekst w polu na wjyrchu.
'copyrightwarning2' => "Pamjyntej uo tym, aže couki wkuod do {{GRAMMAR:MS.lp|{{SITENAME}}}} može być sprowjany, pomjyÅ„any abo wyćepany bez inkÅ¡ych užytkownikůw. Jak Å„y chceÅ¡, coby koždy můg go zmjyÅ„ać i dali rozpowÅ¡ychÅ„ać bez uograniÄyÅ„, Å„y wćepuj go sam.<br />
Å kryflajůnc sam tukej poÅ›wjadÄoÅ¡ tyž, co te pisaÅ„y je twoje wuasne, abo žeÅ› go wźůn(a) s matyrjouůw kere sům na public domain, abo kůmpatybilne (kuknij tyž: $1).
'''PROŠA ŃY WĆEPYWAĆ SAM MATYRJOUŮW KERE SŮM CHRŮŃONE PRAWYM AUTORSKIM BEZ DOZWOLEŃO WUAŚĆIĆELA!'''",
-'longpagewarning' => "'''Dej pozůr: Ta zajta je $1 kilobajt-y/-ůw wjelgo; w ńykerych přyglůndarkach můgům wystůmpić problymy w sprowjańu zajtůw kere majům wjyncyj jak 32 kilobajty. Kejbyś ůmjou, podźel tekst na myńše tajle.'''",
'longpageerror' => "'''Feler: Tekst kery žeś sam wćepywou mo $1 kilobajtůw. Maksymalno dugość tekstu ńy može być wjynkšo kej $2 kilobajtůw. Twůj tekst ńy bydźe sam naškryflany.'''",
'readonlywarning' => "'''Dej pozůr: Baza danych zostoua filowo zawarto skuli potřeb admińistracyjnych. Bestůž ńy do śe terozki naškryflać Twojich pomjyńań. Radzymy přećepać nowy tekst kajś do plika tekstowego (wytnij/wklej) a wćepać sam zaś po uodymkńyńću bazy.'''
@@ -589,7 +601,7 @@ Admińistrator kery zawar baza dou take wyjaśńyńe: $1",
'semiprotectedpagewarning' => "'''Pozůr:''' Ta zajta zostoua zawarto a ino zaregišterowani užytkownicy mogům jům sprowjać.",
'cascadeprotectedwarning' => "'''Dej pozůr:''' Ta zajta zostoua zawarto a ino užytkowÅ„icy s uprawÅ„yÅ„ami admiÅ„istratora mogům jům sprowjać. Zajta ta je podpjynto pod {{PLURAL:$1|nastympujůnco zajta, kero zostoua zawarto|nastympujůncych zajtach, kere zostouy zawarte}} ze zauůnÄonům opcjům dźedźiÄyÅ„o:",
'titleprotectedwarning' => "'''DEJ POZŮR: Zajta uo tym titlu zostoua zawarto a ino ńykeři užytkowńicy mogům jům wćepać.'''",
-'templatesused' => 'Šablůny užyte na tyj zajće:',
+'templatesused' => '↓ {{PLURAL:$1|Szablon|Szablůny}} użyte na tyj zajće:',
'templatesusedpreview' => 'Šablůny užyte we tym podglůńdźe:',
'templatesusedsection' => 'Šablůny užyte w tyj tajli:',
'template-protected' => '(zawarty před sprowjańym)',
@@ -753,7 +765,7 @@ Inkśi admińistratoři {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
'difference' => '(Růžńice mjyndzy škryflańami)',
'lineno' => 'Lińja $1:',
'compareselectedversions' => 'porůwnej wybrane wersyje',
-'editundo' => 'cofej',
+'editundo' => 'uodćepej',
'diff-multi' => '(Ńy pokozano {{PLURAL:$1|jydnyj wersyji postředńij|$1 wersyji postředńich}}.)',
# Search results
@@ -769,14 +781,15 @@ Inkśi admińistratoři {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
'notextmatches' => 'Ńy znejdźono we tekście zajtůw',
'prevn' => 'popředńe {{PLURAL:$1|$1}}',
'nextn' => 'nastympne {{PLURAL:$1|$1}}',
+'shown-title' => '↓Pokoż $1 {{PLURAL:$1|wynik|wyniki|wynikůw}} lo zajta',
'viewprevnext' => 'Uobezdřij ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Uopcyje sznupańo',
'searchmenu-exists' => "'''Ńy ma zajty uo mjańy \"[[:\$1]]\" na tyj wiki'''",
'searchmenu-new' => "'''Stwůrz zajta „[[:$1|$1]]†na tyj wiki!'''",
'searchhelp-url' => 'Help:Pomoc',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Przeglůndej zajty kere s anfanga majům tyn przedrostek]]',
-'searchprofile-articles' => 'Zajty',
-'searchprofile-project' => 'Zajty kere ńy sům we głůwnyj przestrzyńi mjan',
+'searchprofile-articles' => '↓Zajty',
+'searchprofile-project' => 'Zajty půmocy a projektu',
'searchprofile-images' => 'Pliki',
'searchprofile-everything' => 'Wszyjstko',
'searchprofile-advanced' => 'Zaawansowane',
@@ -785,7 +798,7 @@ Inkśi admińistratoři {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
'searchprofile-images-tooltip' => 'Sznupańy za plikůma',
'searchprofile-everything-tooltip' => 'Sznupej we cołkij zawartości (wroz ze zajtami godki)',
'searchprofile-advanced-tooltip' => 'Sznupańy we wybranych przestrzyńach mjan',
-'search-result-size' => '$1 ({{PLURAL:$2|1 suowo|$2 suowa|$2 suůw}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 słowo|$2 słowa|$2 słůw}})',
'search-result-score' => 'Akuratność: $1%',
'search-redirect' => '(překerowańy $1)',
'search-section' => '(tajla $1)',
@@ -1034,6 +1047,7 @@ Inkśi admińistratoři {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
'recentchanges-legend' => 'Uopcyje půmjyńanych na uostatku',
'recentchangestext' => 'Ta zajta předstawjo historyjo uostatńich půmjyńań na tyj wiki',
'recentchanges-feed-description' => 'Dowej pozůr na půmjyńane na uostatku na tyj wiki.',
+'recentchanges-label-newpage' => '↓ W tyj edycyji sprowjůno nowy artikel',
'rcnote' => "Půńižej {{PLURAL:$1|pokozano uostatÅ„o zmjano dokůnano|pokazano uostatÅ„y '''$1''' zmjany naÅ¡kryflane|pokozano uostatÅ„ich '''$1''' Å¡kryflaÅ„ zrobjůnych}} bez {{PLURAL:$2|uostatÅ„i dźyÅ„|uostatÅ„ich '''$2''' dÅ„i}}, zaÄynojůnc uod $5 dÅ„a $4.",
'rcnotefrom' => 'Půńižej pokazano půmjyńańo zrobjůne pů <b>$2</b> (ńy wjyncyj jak <b>$1</b> pozycji).',
'rclistfrom' => 'Pokož půmjyńańo uod $1',
@@ -1130,7 +1144,6 @@ Jak chceš wćepać ta, bydźeš muśou zmjyńić mjano wćepywanygo terozki pli
Idź nazod i wćepej tyn plik pod inkšym mjanym. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Tyn plik je kopjům {{PLURAL:$1|plika|nastypujůncych plikůw:}}',
'file-deleted-duplicate' => 'Identyczny plik jak tyn plik ([[:$1]]) zostoł wyćepany. Sprowdź historyja wyćepań tamtygo plika ńim wćepńesz go nazod.',
-'successfulupload' => 'Wćepańe plika udouo śe',
'uploadwarning' => 'Uostřežyńe uo wćepywańu',
'savefile' => 'Naškryflej plik',
'uploadedimage' => 'wćepano "[[$1]]"',
@@ -1149,6 +1162,7 @@ Idź nazod i wćepej tyn plik pod inkšym mjanym. [[File:$1|thumb|center|$1]]',
Zastanůw Å›e, Äy powinno Å›e go sam wćepywać.
Rejer wyćepań tygo plika je podany půńižej, cobyś miou wygoda:",
'filename-bad-prefix' => "Mjano plika, kery wćepujeÅ¡, zaÄyno Å›e uod '''\"\$1\"''' &ndash; je to mjano nojÄynśćy pÅ™ipisywane autůmatyÄÅ„y bez cyfrowe fotoaparaty, uůno Å„y dowo žodnych informacyji uo zawartośći plika. ProÅ¡ymy cobyÅ› nadou plikowi inkÅ¡e, lepij zrozůmjaue mjano.",
+'upload-success-subj' => 'Wćepańe plika udouo śe',
'upload-proto-error' => 'Ńyprowiduowy protokůu',
'upload-proto-error-text' => 'Zdalne pÅ™esůuaÅ„y plikůw wymago podaÅ„o adresu URL kery zaÄyno Å›e na <code>http://</code> abo <code>ftp://</code>.',
@@ -1206,7 +1220,7 @@ Dostympno je tyž [[Special:WhatLinksHere/$2|pouno lista]].',
'morelinkstoimage' => 'Pokož [[Special:WhatLinksHere/$1|wjyncy uodnośnikůw]] do tygo plika.',
'redirectstofile' => '{{PLURAL:$1|Nastympujůncy plik překerowuje|Nastympujůnce pliki překerowujům}} ku tymu plikowi:',
'duplicatesoffile' => '{{PLURAL:$1|Nastympujůncy plik je kopjům|Nastympujůnce pliki sům kopjůma}} tygo plika:',
-'sharedupload' => 'Tyn plik je wćepńynty na wspůlny serwer a inksze projekty tyż můgům go używać.',
+'sharedupload' => 'Tyn plik je wćepńynty na $1 a inksze projekty tyż go mogům używać.',
'uploadnewversion-linktext' => 'Wćepńij nowšo wersyjo tygo plika',
# File reversion
@@ -1276,7 +1290,6 @@ Dostympno je tyž [[Special:WhatLinksHere/$2|pouno lista]].',
'statistics-edits-average' => 'Strzedńo liczba sprowjyń na zajta',
'statistics-views-total' => 'Cołkowito liczba bezuchůw',
'statistics-views-peredit' => 'Liczba bezuchůw na sprowjyńy',
-'statistics-jobqueue' => 'Rozmjor [http://www.mediawiki.org/wiki/Manual:Job_queue raji zadań]',
'statistics-users' => 'Zarejerowanych [[Special:ListUsers|użytkowńikůw]]',
'statistics-users-active' => 'Aktywnych użytkowńikůw',
'statistics-users-active-desc' => 'Użytkowńiki, kere bůły aktywne bez {{PLURAL:$1|uostatńi dźyń|uostatńich $1 dńi}}',
@@ -1471,7 +1484,6 @@ Adres e-brifa, kery zostoł bez Ćebje wkludzůny we [[Special:Preferences|Twoji
# Watchlist
'watchlist' => 'Pozorlista',
'mywatchlist' => 'Moja pozůrlista',
-'watchlistfor' => "(dla užytkowńika '''$1''')",
'nowatchlist' => 'Ńy ma žodnych pozycyji na liśće zajtůw, na kere dowoš pozůr.',
'watchlistanontext' => '$1 coby uobejřeć abo sprowjać elymynty listy zajtůw, na kere dowoš pozůr',
'watchnologin' => 'Ńy jest žeś zalůgowany',
@@ -1583,7 +1595,9 @@ Autorym ostatńygo pomjyńyńo je terozki [[User:$3|$3]] ([[User talk:$3|godka]]
'revertpage' => 'Wycofano sprowjyńe użytkowńika [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]]). Autor prziwrůcůnej wersyji to [[User:$1|$1]].',
'rollback-success' => 'Wycofano sprowjyńa užytkowńika $1.
Přiwrůcůno uostatńo wersyja autorstwa $2.',
-'sessionfailure' => 'Feler weryfikacyji zalůgowańo.
+
+# Edit tokens
+'sessionfailure' => 'Feler weryfikacyji zalůgowańo.
Polecyńy zostouo anulowane, aby ůńiknůńć přechwycyńo sesyji.
NaćiÅ› „cofejâ€, pÅ™euaduj zajta, a potym zaÅ› wydej polecyÅ„y',
@@ -1608,9 +1622,9 @@ Coby přejřeć lista uobecńy zawartych zajtůw, přeńdź na zajta wykazu [[Sp
'protect-locked-dblock' => "Ńy idźe půmjyńić poźůmu zawarća s kuli tygo co baza danych tyž je zawarto. Uobecne štalowańa dla zajty '''$1''' to:",
'protect-locked-access' => "Ńy moš uprowńyń coby pomjyńyć poziům zawarcia zajty. Uobecne ustawjyńo dlo zajty '''$1''' to:",
'protect-cascadeon' => 'Ta zajta je zawarto od pomjyÅ„aÅ„, po takjymu, co jei užywo {{PLURAL:$1|ta zajta, kero je zawarto|nastympůjůnce zajty, kere zostauy zawarte}} a opcyjo dźedźiÄyÅ„o je zaůonÄono. MožeÅ¡ pomjyÅ„yć poziům zawarcia tyi zajty, ale dlo dźedźiÄyÅ„o zawarcia to Å„y mo wpuywu.',
-'protect-default' => '(důmyślny)',
+'protect-default' => 'Wszyjske używocze mogům sprowjać',
'protect-fallback' => 'Wymago pozwolynjo "$1"',
-'protect-level-autoconfirmed' => 'tylko zaregišterůwani',
+'protect-level-autoconfirmed' => 'Blokuj nowe a ńyregistrowane używocze',
'protect-level-sysop' => 'Ino admini',
'protect-summary-cascade' => 'dźedźiÄyÅ„y',
'protect-expiring' => 'wygaso $1 (UTC)',
@@ -1719,7 +1733,7 @@ $1',
'sp-contributions-newbies-title' => 'Wkłod nowych użytkowńików',
'sp-contributions-blocklog' => 'zawarća',
'sp-contributions-deleted' => 'Wyćepane sprowjyńa użytkowńika',
-'sp-contributions-talk' => 'dyskusyjo',
+'sp-contributions-talk' => '↓ dyskusyjo',
'sp-contributions-userrights' => 'Zařůndzańy prowami užytkowńikůw',
'sp-contributions-search' => 'Å nupej za wkuodym',
'sp-contributions-username' => 'Adres IP abo mjano užytkowńika',
@@ -1785,7 +1799,6 @@ Přyńdź do [[Special:IPBlockList|listy zawartych adresůw IP]] coby přejřeć
'ipb-edit-dropdown' => 'Sprowjej powody zawjyrańo uod sprowjyń',
'ipb-unblock-addr' => 'Uodymknij $1',
'ipb-unblock' => 'Uodymknij užytkowńika abo adres IP',
-'ipb-blocklist-addr' => 'Istńejůnce zawarća uod sprowjyń lů $1',
'ipb-blocklist' => 'ZoboÄ istÅ„ijůnce zawarća',
'ipb-blocklist-contribs' => 'Wkłod $1',
'unblockip' => 'Uodymkńij sprowjyńo užytkowńikowi',
@@ -2017,48 +2030,49 @@ Wšyjstke uoperacyje importu transwiki sům uodnotowywane w [[Special:Log/import
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|wersyja|wersyje|wersyji}} ze $2',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Moja perzůnalno zajta',
+'tooltip-pt-userpage' => 'Mojo perzůnalno zajta',
'tooltip-pt-anonuserpage' => 'Zajta užytkowńika do adresu IP spod kerygo sprowjoš',
-'tooltip-pt-mytalk' => 'Moja zajta dyskusyje',
+'tooltip-pt-mytalk' => 'Mojo zajta dyskusyje',
'tooltip-pt-anontalk' => 'Godka užytkowńika do adresu IP spod kerygo sprowjoš',
'tooltip-pt-preferences' => 'Moje preferéncyje',
'tooltip-pt-watchlist' => 'Lista artiklůw na kere daješ pozor',
'tooltip-pt-mycontris' => 'Lista uody mje sprowjonych',
-'tooltip-pt-login' => 'My by chćeli cobyś śe zalůgowou, ale to ńy je uobowjůnzek.',
+'tooltip-pt-login' => 'My by chćeli, cobyś śe zalůgowoł, nale to ńy je powinne',
'tooltip-pt-anonlogin' => 'Zachyncůmy do zalůgowańo śe, nale to ńy je uobowjůnzek',
'tooltip-pt-logout' => 'Wyloguj sie z wiki',
-'tooltip-ca-talk' => 'Godej uo tym artiklu',
-'tooltip-ca-edit' => 'Možeš sprowjać ta zajta. Ńim naškryfloš půmjyńańo, klikńij we knefel "podglůnd".',
-'tooltip-ca-addsection' => 'Dodej kůmyntoř do godki',
+'tooltip-ca-talk' => 'Dyskusyjo uo tym artiklu',
+'tooltip-ca-edit' => 'Mogesz sprowjać ta zajta. Podwjela spamjyntosz půmjyńańo, klikńij we knefel "Uobźyrej".',
+'tooltip-ca-addsection' => '↓Przidej nowy tymat',
'tooltip-ca-viewsource' => 'Ta zajta je zabezpjeÄůno. MožeÅ¡ Å›e uofilować tekst źrůduowy.',
-'tooltip-ca-history' => 'Starše wersyje tyi zajty.',
+'tooltip-ca-history' => 'Storsz wersyje tyj zajty',
'tooltip-ca-protect' => 'Zawřij ta zajta',
'tooltip-ca-delete' => 'Wyćep ta zajta',
'tooltip-ca-undelete' => 'Přiwrůć wersyja tyi zajty spřed wyćepańo',
'tooltip-ca-move' => 'Přećepnij ta zajta kaj indziy.',
'tooltip-ca-watch' => 'Dodej artikel do pozorlisty',
'tooltip-ca-unwatch' => 'Wyciep ten artikel z pozorlisty',
-'tooltip-search' => 'Å nupej we serwisie {{SITENAME}}',
+'tooltip-search' => 'Sznupej we serwiśe {{SITENAME}}',
'tooltip-search-go' => 'Přyńdź do zajty uo gynau takym titlu, uo ile sam je',
-'tooltip-search-fulltext' => 'Šnupej za wprowadzůnym tekstym na zajtach',
-'tooltip-p-logo' => 'Přodńo zajta',
+'tooltip-search-fulltext' => 'Sznupej wćepany tekst na zajće',
+'tooltip-p-logo' => 'Przodńo zajta',
'tooltip-n-mainpage' => 'Przelyź na Przodńo zajta',
-'tooltip-n-portal' => 'Uo projekće, co sam možeš majštrować, kaj idźe znolyźć informacyje',
-'tooltip-n-currentevents' => 'Informacyje uo aktualnych wydařyńach',
-'tooltip-n-recentchanges' => 'Lista půmjyńanych na uostatku na wiki',
-'tooltip-n-randompage' => 'Pokož losowo zajta',
-'tooltip-n-help' => 'Zapoznej sie z obsůgą wiki',
-'tooltip-t-whatlinkshere' => 'Pokož lista zajtůw kere sam sům adrésowane',
-'tooltip-t-recentchangeslinked' => 'Půmjyńane na uostatku w zajtach adresowanych do tyi zajty',
+'tooltip-n-mainpage-description' => 'Przelyź na przodńo zajta',
+'tooltip-n-portal' => 'Uo projekće, co mogesz robić, kaj mogesz nolyźć informacyje',
+'tooltip-n-currentevents' => 'Informacyje uo aktualnych przitrefjyńach',
+'tooltip-n-recentchanges' => 'Lista ńydowno pomjyńanych we wiki',
+'tooltip-n-randompage' => 'Pokoż losowo zajta',
+'tooltip-n-help' => 'Sam śe mogesz moc przewjedźeć',
+'tooltip-t-whatlinkshere' => 'Pokoż zajty, kere sam linkujům',
+'tooltip-t-recentchangeslinked' => 'Ńydowno půmjyńane na zajtach, do kerych ta zajta linkuje',
'tooltip-feed-rss' => 'Kanau RSS do tyj zajty',
'tooltip-feed-atom' => 'Kanau Atom do tyi zajty',
'tooltip-t-contributions' => 'Pokož lista sprowjyń tygo užytkowńika',
'tooltip-t-emailuser' => 'Wyślij e-brif do tygo užytkowńika',
-'tooltip-t-upload' => 'Wćepńij plik na serwer',
-'tooltip-t-specialpages' => 'Lista wšyskich ekstra zajtów',
+'tooltip-t-upload' => 'Wćepej plik na serwer',
+'tooltip-t-specialpages' => 'Lista wszyjskich ekstra zajtůw',
'tooltip-t-print' => 'Wersyja do wydruku',
'tooltip-t-permalink' => 'Stouy link do tyi wersyji zajty',
-'tooltip-ca-nstab-main' => 'Uobejřij zajta artikla',
+'tooltip-ca-nstab-main' => 'Uobźyrej zajta artikla',
'tooltip-ca-nstab-user' => 'Pokož uosobisto zajta užytkowńika',
'tooltip-ca-nstab-media' => 'Uobejřij zajta artikla',
'tooltip-ca-nstab-special' => 'To je ekstra zajta. Ńy možeš jei sprowjać.',
@@ -2169,10 +2183,10 @@ $1',
'imagemaxsize' => 'Na zajtach uopisu plikůw uůgraÅ„iÄ rozmjar uobrazkůw do:',
'thumbsize' => 'Rozmjar mińjatůrki',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|zajta|zajty|zajtůw}}',
-'file-info' => '(rozmjor plika: $1, typ MIME: $2)',
-'file-info-size' => '($1 × $2 pikseli, rozmior plika: $3, typ MIME: $4)',
+'file-info' => 'rozmjor plika: $1, typ MIME: $2',
+'file-info-size' => '$1 × $2 pikseli, rozmior plika: $3, typ MIME: $4',
'file-nohires' => '<small>Uobrozek we wjynkÅ¡ej rozdźelÄośći Å„y je dostympny.</small>',
-'svg-long-desc' => '(Plik SVG, nůminalńe $1 × $2 pixelůw, rozmior plika: $3)',
+'svg-long-desc' => 'Plik SVG, nůminalńe $1 × $2 pixelůw, rozmior plika: $3',
'show-big-image' => 'Oryginalno rozdźelÄość',
'show-big-image-thumb' => '<small>Rozmiar podglůndu: $1 × $2 pikseli</small>',
@@ -2189,11 +2203,11 @@ $1',
'sp-newimages-showfrom' => 'pokož nowe pliki zaÄynajůnc uod $2, $1',
# Bad image list
-'bad_image_list' => 'Dane noležy prowadźić we formaće:
+'bad_image_list' => 'Dane trza wćepać we formaće:
-Ino elementy tyi listy (linie kere majům na přodku *) bierymy pod uwoga.
-Pjerwšy link w lińii muśi być linkym do zabrůńůnygo pliku.
-Nostympne linki w lińii uwažůmy za wyjůntki, to sům nazwy zajtůw, kaj plik uo zakozanyj nazwje idźe wstawić.',
+Jyno tajle listy (lińije, kere śe napoczynajům uod *) absztychujemy.
+Pjyrszy link w lińiji muśi być linkym do zakozanygo pliku.
+Nostypmne linki w lińiji sům uwożane za wyjimki – sům to mjana zajtůw, na kerych idzie użyć plik ze zakozanym mjanym.',
# Metadata
'metadata' => 'Metadane',
diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php
index 74a9abfa..79b38894 100644
--- a/languages/messages/MessagesTa.php
+++ b/languages/messages/MessagesTa.php
@@ -52,6 +52,18 @@ $namespaceAliases = array(
$magicWords = array(
'redirect' => array( '0', '#வழிமாறà¯à®±à¯', '#REDIRECT' ),
+ 'img_right' => array( '1', 'வலதà¯', 'right' ),
+ 'img_left' => array( '1', 'இடதà¯', 'left' ),
+ 'img_none' => array( '1', 'ஒனà¯à®±à¯à®®à®¿à®²à¯à®²à¯ˆ', 'none' ),
+ 'img_center' => array( '1', 'மையமà¯', 'center', 'centre' ),
+ 'img_top' => array( '1', 'மேலà¯', 'top' ),
+ 'img_middle' => array( '1', 'மதà¯à®¤à®¿à®¯à®¿à®²à¯', 'middle' ),
+ 'img_bottom' => array( '1', 'கீழà¯', 'bottom' ),
+ 'plural' => array( '0', 'பனà¯à®®à¯ˆ', 'PLURAL:' ),
+ 'special' => array( '0', 'சிறபà¯à®ªà¯', 'special' ),
+ 'pagesize' => array( '1', 'பகà¯à®•_அளவà¯', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'வழி', 'PATH' ),
+ 'url_wiki' => array( '0', 'விகà¯à®•à®¿', 'WIKI' ),
);
$linkTrail = "/^([\xE0\xAE\x80-\xE0\xAF\xBF]+)(.*)$/sDu";
@@ -72,8 +84,7 @@ $messages = array(
'tog-editsection' => '(தொகà¯) இணைபà¯à®ªà®¿à®©à¯ வழியாக பிரிவà¯à®¤à¯ தொகà¯à®ªà¯à®ªà¯ˆ à®®à¯à®Ÿà¯à®•à¯à®•à¯',
'tog-editsectiononrightclick' => 'பிரிவà¯à®¤à¯ தலைபà¯à®ªà®¿à®©à¯ மீத௠வலச௠சொடà¯à®•à¯à®•à¯à®µà®¤à®©à¯ மூலம௠பகà¯à®¤à®¿ தொகà¯à®ªà¯à®ªà¯ˆ à®®à¯à®Ÿà¯à®•à¯à®•à¯ (ஜாவா நிரலà¯)',
'tog-showtoc' => 'உளà¯à®³à®Ÿà®•à¯à®• அடà¯à®Ÿà®µà®£à¯ˆà®¯à¯ˆà®•à¯ காணà¯à®ªà®¿<br />(மூனà¯à®±à¯à®•à¯à®•à¯ மேறà¯à®ªà®Ÿà¯à®Ÿ தலைபà¯à®ªà¯à®•à®³à¯ˆà®¯à¯à®Ÿà¯ˆà®¯ கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯à®•à¯à®•à¯)',
-'tog-rememberpassword' => 'அமரà¯à®µà¯à®•à®³à¯à®•à¯à®•à®¿à®Ÿà¯ˆà®¯à¯‡ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ ஞாபகதà¯à®¤à®¿à®²à¯ வைதà¯à®¤à¯à®•à¯à®•à¯Šà®³à¯',
-'tog-editwidth' => 'à®®à¯à®´à¯à®¤à¯à®¤à®¿à®°à¯ˆà®¯à¯ˆ நிரபà¯à®ªà¯à®®à®³à®µà¯à®•à¯à®•à¯, தொகà¯à®•à¯à®•à¯à®®à®¿à®Ÿà®¤à¯à®¤à¯ˆ விரிவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯',
+'tog-rememberpassword' => 'எனத௠பà¯à®•à¯à®ªà®¤à®¿à®µà¯ பறà¯à®±à®¿à®¯ விவரஙà¯à®•à®³à¯ˆ இவà¯à®µà¯à®²à®¾à®µà®¿à®¯à®¿à®²à¯ (மிக அதிகமாக $1 {{PLURAL:$1|நாளà¯|நாடà¯à®•à®³à¯}}) நினைவில௠வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.',
'tog-watchcreations' => 'நான௠உரà¯à®µà®¾à®•à¯à®•à®¿à®¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ எனத௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯à®•à¯à®•à®µà¯à®®à¯.',
'tog-watchdefault' => 'நான௠தொகà¯à®¤à¯à®¤ பகà¯à®•à®™à¯à®•à®³à¯ˆ, என௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯',
'tog-watchmoves' => 'நான௠நகரà¯à®¤à¯à®¤à®¿à®¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ என௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯.',
@@ -131,18 +142,18 @@ $messages = array(
'thu' => 'வியா',
'fri' => 'வெளà¯',
'sat' => 'சனி',
-'january' => 'சனவரி',
+'january' => 'ஜனவரி',
'february' => 'பெபà¯à®°à®µà®°à®¿',
'march' => 'மாரà¯à®šà¯',
'april' => 'à®à®ªà¯à®°à®²à¯',
'may_long' => 'மே',
-'june' => 'சூனà¯',
-'july' => 'சூலை',
-'august' => 'ஆகதà¯à®¤à¯',
+'june' => 'ஜூனà¯',
+'july' => 'ஜூலை',
+'august' => 'ஆகஸà¯à®Ÿà¯',
'september' => 'செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯',
'october' => 'அகà¯à®Ÿà¯‹à®ªà®°à¯',
'november' => 'நவமà¯à®ªà®°à¯',
-'december' => 'திசமà¯à®ªà®°à¯',
+'december' => 'டிசமà¯à®ªà®°à¯',
'january-gen' => 'சனவரி',
'february-gen' => 'பெபà¯à®°à®µà®°à®¿',
'march-gen' => 'மாரà¯à®šà¯',
@@ -218,31 +229,21 @@ $messages = array(
'faqpage' => 'Project:அடிகà¯à®•à®Ÿà®¿ கேடà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ கேளà¯à®µà®¿à®•à®³à¯',
# Vector skin
-'vector-action-addsection' => 'தலைபà¯à®ªà¯ˆà®šà¯ சேரà¯',
-'vector-action-delete' => 'நீகà¯à®•à¯à®•',
-'vector-action-move' => 'நகரà¯à®¤à¯à®¤à®µà¯à®®à¯',
-'vector-action-protect' => 'காகà¯à®•à®µà¯à®®à¯',
-'vector-action-undelete' => 'நீகà¯à®•à®¤à¯à®¤à¯ˆ நிறà¯à®¤à¯à®¤à¯',
-'vector-action-unprotect' => 'காபà¯à®ªà¯ˆà®¨à¯€à®•à¯à®•à¯',
-'vector-namespace-category' => 'பகà¯à®ªà¯à®ªà¯',
-'vector-namespace-help' => 'உதவிப௠பகà¯à®•à®®à¯',
-'vector-namespace-image' => 'கோபà¯à®ªà¯',
-'vector-namespace-main' => 'பகà¯à®•à®®à¯',
-'vector-namespace-media' => 'ஊடகப௠பகà¯à®•à®®à¯',
-'vector-namespace-mediawiki' => 'தகவலà¯',
-'vector-namespace-project' => 'திடà¯à®Ÿà®¤à¯à®¤à®¿à®©à¯ பகà¯à®•à®®à¯',
-'vector-namespace-special' => 'சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à¯',
-'vector-namespace-talk' => 'உரையாடலà¯',
-'vector-namespace-template' => 'வாரà¯à®ªà¯à®ªà¯à®°à¯',
-'vector-namespace-user' => 'பயனர௠பகà¯à®•à®®à¯',
-'vector-view-create' => 'உரà¯à®µà®¾à®•à¯à®•à®µà¯à®®à¯',
-'vector-view-edit' => 'தொகà¯',
-'vector-view-history' => 'வரலாறà¯à®±à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯',
-'vector-view-view' => 'வாசிகà¯à®•à®µà¯à®®à¯',
-'vector-view-viewsource' => 'மூலதà¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯',
-'actions' => 'செயலà¯à®•à®³à¯',
-'namespaces' => 'பெயரà¯à®µà¯†à®³à®¿à®•à®³à¯',
-'variants' => 'மாறà¯à®±à¯à®•à¯à®•à®³à¯
+'vector-action-addsection' => 'தலைபà¯à®ªà¯ˆà®šà¯ சேரà¯',
+'vector-action-delete' => 'நீகà¯à®•à¯à®•',
+'vector-action-move' => 'நகரà¯à®¤à¯à®¤à®µà¯à®®à¯',
+'vector-action-protect' => 'காகà¯à®•à®µà¯à®®à¯',
+'vector-action-undelete' => 'நீகà¯à®•à®¤à¯à®¤à¯ˆ நிறà¯à®¤à¯à®¤à¯',
+'vector-action-unprotect' => 'காபà¯à®ªà¯ˆà®¨à¯€à®•à¯à®•à¯',
+'vector-simplesearch-preference' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ தேடà¯à®¤à®²à¯ à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯ˆà®šà¯ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯ (Vector தோல௠மடà¯à®Ÿà¯à®®à¯)',
+'vector-view-create' => 'உரà¯à®µà®¾à®•à¯à®•à®µà¯à®®à¯',
+'vector-view-edit' => 'தொகà¯',
+'vector-view-history' => 'வரலாறà¯à®±à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯',
+'vector-view-view' => 'வாசிகà¯à®•à®µà¯à®®à¯',
+'vector-view-viewsource' => 'மூலதà¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯',
+'actions' => 'செயலà¯à®•à®³à¯',
+'namespaces' => 'பெயரà¯à®µà¯†à®³à®¿à®•à®³à¯',
+'variants' => 'மாறà¯à®±à¯à®•à¯à®•à®³à¯
மாறà¯à®±à¯à®°à¯à®µà®™à¯à®•à®³à¯',
@@ -305,6 +306,8 @@ $messages = array(
நீஙà¯à®•à®³à¯ மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ அணà¯à®• à®®à¯à®¯à®²à¯à®®à¯ à®®à¯à®©à¯ சறà¯à®±à¯‡ பொறà¯à®•à¯à®•à®µà¯à®®à¯.
$1',
+'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}} பறà¯à®±à®¿',
@@ -343,7 +346,7 @@ $1',
'editold' => 'தொகà¯',
'viewsourceold' => 'மூலதà¯à®¤à¯ˆ காடà¯à®Ÿà¯à®•',
'editlink' => 'தொகà¯',
-'viewsourcelink' => 'மூலதà¯à®¤à¯ˆ காணà¯à®•',
+'viewsourcelink' => 'மூலதà¯à®¤à¯ˆà®•à¯ காணà¯à®•',
'editsectionhint' => '$1 பகà¯à®¤à®¿à®¯à¯ˆ தொகà¯',
'toc' => 'பொரà¯à®³à®Ÿà®•à¯à®•à®®à¯',
'showtoc' => 'காடà¯à®Ÿà¯',
@@ -461,7 +464,8 @@ MySQL returned error "$3: $4".',
'yourname' => 'பயனர௠பெயரà¯:',
'yourpassword' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯:',
'yourpasswordagain' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆà®¤à¯ திரà¯à®®à¯à®ª தடà¯à®Ÿà®šà¯à®šà®¿à®Ÿà¯à®•:',
-'remembermypassword' => 'எனத௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ அமரà¯à®µà¯à®•à®³à®¿à®Ÿà¯ˆà®¯à¯‡ நினைவில௠வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.',
+'remembermypassword' => 'எனத௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ (கூடியத௠$1 {{PLURAL:$1|நாளà¯|நாடà¯à®•à®³à¯}}) அமரà¯à®µà¯à®•à®³à®¿à®Ÿà¯ˆà®¯à¯‡ நினைவில௠வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.',
+'securelogin-stick-https' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®•à¯à®•à¯à®ªà¯ பிறகà¯à®®à¯ HTTPS-இலேயே இரà¯à®•à¯à®•à®µà¯à®®à¯',
'yourdomainname' => 'உஙà¯à®•à®³à¯ உரிமைபà¯à®ªà®°à®ªà¯à®ªà¯:',
'externaldberror' => 'வெளி உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¿à®²à¯ à®à®±à¯à®ªà®Ÿà¯à®Ÿ தவற௠காரணமாக உஙà¯à®•à®³à¯ வெளி கணகà¯à®•à¯ˆ இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'login' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ',
@@ -478,6 +482,7 @@ MySQL returned error "$3: $4".',
'gotaccount' => "à®à®±à¯à®•à®©à®µà¯‡ பயனர௠கணகà¯à®•à¯ உளà¯à®³à®¤à®¾? '''$1'''.",
'gotaccountlink' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ',
'createaccountmail' => 'மினà¯à®©à®žà¯à®šà®²à¯ மூலமà¯',
+'createaccountreason' => 'காரணமà¯:',
'badretype' => 'நீஙà¯à®•à®³à¯ பதிநà¯à®¤ கடவà¯à®šà¯à®šà¯Šà®²à¯ பொரà¯à®¤à¯à®¤à®®à®¾à®• இலà¯à®²à¯ˆ.',
'userexists' => 'நீர௠பதிநà¯à®¤ பயனர௠பெயர௠à®à®±à¯à®•à¯†à®©à®µà¯‡ பாயனà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à¯ உளà¯à®³à®¤à¯. à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ வேற௠பயனர௠பெயரைத௠தெரிவà¯à®šà¯ செயà¯à®•.',
'loginerror' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®¤à¯ தவறà¯',
@@ -562,8 +567,8 @@ MySQL returned error "$3: $4".',
'extlink_tip' => 'வெளியிணைபà¯à®ªà¯ (http:// à®®à¯à®©à¯à®©à®¿à®£à¯ˆà®ªà¯à®ªà¯ˆ மறகà¯à®•à®¾à®¤à¯€à®°à¯)',
'headline_sample' => 'தலைபà¯à®ªà¯',
'headline_tip' => 'இரணà¯à®Ÿà®¾à®®à¯ படித௠தலைபà¯à®ªà¯',
-'math_sample' => 'இஙà¯à®•à¯‡ சூதà¯à®¤à®¿à®°à®¤à¯à®¤à¯ˆà®ªà¯ பà¯à®•à¯à®¤à¯à®¤à®µà¯à®®à¯',
-'math_tip' => 'கணிதச௠சூதà¯à®¤à®¿à®°à®®à¯ (LaTeX)',
+'math_sample' => 'இஙà¯à®•à¯‡ வாயà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ இடà¯à®•',
+'math_tip' => 'கணித வாயà¯à®ªà®¾à®Ÿà¯ (LaTeX)',
'nowiki_sample' => 'விகà¯à®•à®¿ நிரலாகà¯à®•à®¤à¯à®¤à®¾à®²à¯ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà¯‡à®£à¯à®Ÿà®¿à®¯ உரையை இஙà¯à®•à¯‡ இடவà¯à®®à¯',
'nowiki_tip' => 'விகà¯à®•à®¿ நிரலாகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பà¯à®±à®•à¯à®•à®£à®¿',
'image_tip' => 'பொதிநà¯à®¤à¯à®³à¯à®³ படிமமà¯',
@@ -583,11 +588,13 @@ MySQL returned error "$3: $4".',
'showdiff' => 'மாறà¯à®±à®™à¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯',
'anoneditwarning' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ:''' நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®µà®¿à®²à¯à®²à¯ˆ.
உஙà¯à®•à®³à¯ à®.பி. à®®à¯à®•à®µà®°à®¿ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ தொகà¯à®ªà¯à®ªà¯ வரலாறà¯à®±à®¿à®²à¯ பதிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯.",
+'anonpreviewwarning' => 'நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®µà®¿à®²à¯à®²à¯ˆ. இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à¯ˆ சேமிதà¯à®¤à®¾à®²à¯ உஙகள௠à®.பி. à®®à¯à®•à®µà®°à®¿ இதன௠வரலாறà¯à®±à¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ பதிவாகà¯à®®à¯.',
'missingsummary' => "'''நினைவூடà¯à®Ÿà®²à¯:''' நீர௠தொகà¯à®ªà¯à®ªà¯à®šà¯ சà¯à®°à¯à®•à¯à®•à®®à¯Šà®©à¯à®±à¯ˆà®•à¯ கொடà¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ.
இனà¯à®©à¯Šà®°à¯ à®®à¯à®±à¯ˆ பகà¯à®•à®¤à¯à®¤à¯ˆ சேமி எனà¯à®ªà®¤à¯ˆ à®…à®´à¯à®¤à¯à®¤à®¿à®©à®¾à®²à¯ உஙà¯à®•à®³à¯ தொகà¯à®ªà¯à®ªà¯ சà¯à®°à¯à®•à¯à®•à®®à¯†à®¤à¯à®µà¯à®®à®¿à®²à¯à®²à®¾à®®à®²à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯.",
'missingcommenttext' => 'கீழே சà¯à®°à¯à®•à¯à®•à®®à¯Šà®©à¯à®±à®•à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®µà¯à®®à¯.',
-'missingcommentheader' => "'''நினைவூடà¯à®Ÿà®²à¯:''' நீர௠உடà¯à®ªà¯Šà®°à¯à®³à¯/தலைபà¯à®ªà¯ சà¯à®°à¯à®•à¯à®•à®®à¯Šà®©à¯à®±à¯ˆà®•à¯ கொடà¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ.
-இனà¯à®©à¯Šà®°à¯ à®®à¯à®±à¯ˆ பகà¯à®•à®¤à¯à®¤à¯ˆ சேமி எனà¯à®ªà®¤à¯ˆ à®…à®´à¯à®¤à¯à®¤à®¿à®©à®¾à®²à¯ உஙà¯à®•à®³à¯ சà¯à®°à¯à®•à¯à®•à®®à¯†à®¤à¯à®µà¯à®®à®¿à®²à¯à®²à®¾à®®à®²à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯.",
+'missingcommentheader' => "'''நினைவூடà¯à®Ÿà®²à¯:''' தாஙà¯à®•à®³à¯ தொகà¯à®¤à¯à®¤à®±à¯à®•à®¾à®© சà¯à®°à¯à®•à¯à®•à®®à®¾à®© உரையை கொடà¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ.
+
+இனà¯à®©à¯Šà®°à¯à®®à¯à®±à¯ˆ 'சேமி' எனà¯à®ªà®¤à®©à¯ˆ à®…à®´à¯à®¤à¯à®¤à®¿à®©à®¾à®²à¯ எநà¯à®¤à®µà®¿à®¤ சà¯à®°à¯à®•à¯à®•à®®à®¾à®© உரையினà¯à®±à®¿ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯.",
'summary-preview' => 'சà¯à®°à¯à®•à¯à®• à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯:',
'subject-preview' => 'உடà¯à®ªà¯Šà®°à¯à®³à¯/தலைபà¯à®ªà¯ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯:',
'blockedtitle' => 'பயனர௠தடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¾à®°à¯',
@@ -651,7 +658,7 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'usercsspreview' => "'''உஙà¯à®•à®³à®¤à¯ பயனர௠சி.எஸà¯.எஸà¯. இன௠மà¯à®©à¯ தோறà¯à®±à®¤à¯à®¤à¯ˆ மடà¯à®Ÿà¯à®®à¯‡ காணà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ எனà¯à®ªà®¤à¯ˆ நினைவில௠கொளà¯à®³à®µà¯à®®à¯.'''
'''இத௠இனà¯à®©à®®à¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ!'''",
'userjspreview' => "'''நீர௠உமத௠ஜாவா நிரலை சோதிகà¯à®•à®¿à®±à¯€à®°à¯ அலà¯à®²à®¤à¯ à®®à¯à®©à¯ தோறà¯à®±à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®¿à®±à¯€à®°à¯ எனà¯à®ªà®¤à¯ˆ நினைவகà¯à®•à®µà¯à®®à¯, இனà¯à®©à®®à¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ!'''",
-'userinvalidcssjstitle' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ:''' \"\$1\" எனà¯à®±à®ªà¯ பெயரில௠தோலà¯à®²à¯Šà®±à¯à®•à¯ கிடையாதà¯. சி.எஸà¯.எஸ௠மறà¯à®±à¯à®®à¯ ஜெ.எஸà¯. பகà¯à®•à®™à¯à®•à®³à¯ ஆஙà¯à®•à®¿à®² கீழ௠வரிசைப௠பெயரà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯. எ+கா: {{ns:user}}:Foo/monobook.css எனà¯à®ªà®¤à¯ சரியான வடிவம௠{{ns:user}}:Foo/Monobook.css எனà¯à®ªà®¤à¯ பிழையான வடிவமà¯.",
+'userinvalidcssjstitle' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ:''' \"\$1\" எனà¯à®±à®ªà¯ பெயரில௠தோலà¯à®²à¯Šà®±à¯à®•à¯ கிடையாதà¯. சி.எஸà¯.எஸ௠மறà¯à®±à¯à®®à¯ ஜெ.எஸà¯. பகà¯à®•à®™à¯à®•à®³à¯ ஆஙà¯à®•à®¿à®² கீழ௠வரிசைப௠பெயரà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯. எ+கா: {{ns:user}}:Foo/vector.css எனà¯à®ªà®¤à¯ சரியான வடிவம௠{{ns:user}}:Foo/Vector.css எனà¯à®ªà®¤à¯ பிழையான வடிவமà¯.",
'updated' => '(இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯)',
'note' => "'''கà¯à®±à®¿à®ªà¯à®ªà¯:'''",
'previewnote' => "'''இத௠ஒர௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ மடà¯à®Ÿà¯à®®à¯‡, உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ இனà¯à®©à¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ!'''",
@@ -682,7 +689,6 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'''பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®¯à¯à®³à¯à®³ ஆகà¯à®•à®™à¯à®•à®³à¯ˆ அனà¯à®®à®¤à®¿à®¯à®¿à®©à¯à®±à®¿ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®• வேணà¯à®Ÿà®¾à®®à¯!'''",
'copyrightwarning2' => "{{SITENAME}} தளதà¯à®¤à¯à®•à¯à®•à®¾à®© உமத௠பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ அனைதà¯à®¤à¯à®®à¯ வேற௠பயனரà¯à®•à®³à®¾à®²à¯ தொகà¯à®•à¯à®•à®ªà¯ படவோ, மாறà¯à®±à®™à¯à®•à®³à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà¯‹ அலà¯à®²à®¤à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà®µà¯‹ கூடà¯à®®à¯. உமத௠பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à®³à¯ கடà¯à®®à¯ˆà®¯à®¾à®•à®¤à¯ தொகà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆ நீர௠விரà¯à®®à¯à®ªà®¾à®µà®¿à®Ÿà®¿à®²à¯ இஙà¯à®•à¯‡ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¾à®¤à¯€à®°à¯.<br />
நீர௠இதை எழà¯à®¤à®¿à®¯à®¤à®¾à®•à®µà¯‹, அலà¯à®²à®¤à¯ வேற௠பொதà¯à®•à¯ களம௠அலà¯à®²à®¤à¯ அத௠போனà¯à®± விடà¯à®¤à®²à¯ˆà®¯à®³à®¿à®•à¯à®•à¯à®®à¯ மூலஙà¯à®•à®³à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பிரதி பணà¯à®£à®¿à®¯à®¿à®°à¯à®ªà¯à®ªà®¤à®¾à®•à®µà¯‹ உறà¯à®¤à®¿ கூறà¯à®•à®¿à®±à¯€à®°à¯.(மேலதிக தகவலà¯à®•à®³à¯à®•à¯à®•à¯ $1).'''பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®¯à¯à®³à¯à®³ ஆகà¯à®•à®™à¯à®•à®³à¯ˆ அனà¯à®®à®¤à®¿à®¯à®¿à®©à¯à®±à®¿ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¾à®¤à¯€à®°à¯!'''",
-'longpagewarning' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: இநà¯à®¤à®ªà¯ பகà¯à®•à®®à¯ $1 கிலோபைடà¯à®¸à¯ நீளமானதà¯; 32 kb யை அணà¯à®®à®¿à®•à¯à®•à¯à®®à¯ அலà¯à®²à®¤à¯ அதிலà¯à®®à¯ கூடிய அளவà¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொகà¯à®ªà¯à®ªà®¤à®¿à®²à¯ சில உலாவிகளà¯à®•à¯à®•à¯ பிரசà¯à®šà®¿à®©à¯ˆ உணà¯à®Ÿà¯. தயவà¯à®šà¯†à®¯à¯à®¤à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®šà¯ சிறிய பகà¯à®¤à®¿à®•à®³à®¾à®•à®ªà¯ பிரிபà¯à®ªà®¤à¯ பறà¯à®±à®¿à®•à¯ கவனதà¯à®¤à®¿à®²à¯ எடà¯à®•à¯à®•à®µà¯à®®à¯.'''",
'longpageerror' => "'''தவறà¯: நீஙà¯à®•à®³à¯ இடà¯à®Ÿ உரை $1 கிலோபைடà¯à®Ÿà¯à®•à®³à¯ நீளமானதà¯, $2 கிலோபைடà¯à®Ÿà®¿à®²à¯à®®à¯ கூடிய அளவà¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ இஙà¯à®•à¯‡ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¿à®²à¯à®²à¯ˆ. உஙà¯à®•à®³à¯ உரையை சேமிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.'''",
'readonlywarning' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: பராமரிபà¯à®ªà¯à®•à¯à®•à®¾à®•à®¤à¯ தரவà¯à®µà®´à®™à¯à®•à®©à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, எனவே உஙà¯à®•à®³à¯ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இபà¯à®ªà¯Šà®´à¯à®¤à¯ சேமிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. உஙà¯à®•à®³à¯ உரையை இனà¯à®©à¯Šà®°à¯ உரைக௠கோபà¯à®ªà®¿à®²à¯ வெடà¯à®Ÿà®¿ ஒடà¯à®Ÿà®¿ சேமிதà¯à®¤à¯à®µà¯ˆà®¤à¯à®¤à¯à®ªà¯ பினà¯à®ªà¯ உபயோகிகà¯à®•à®²à®¾à®®à¯.'''
@@ -826,6 +832,8 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'revdelete-success' => "'''திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ˆ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà¯à®®à¯ வசதியை வெறà¯à®±à®¿à®•à®°à®®à®¾à®• நிகழà¯à®¨à®¿à®²à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.'''",
'logdelete-success' => "'''நிகழà¯à®µà¯ பாரà¯à®µà¯ˆà®¯à®¿à®¯à®²à¯à®®à¯ˆ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• அமைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.'''",
'revdel-restore' => 'பாரà¯à®µà¯ˆà®¯à®¿à®¯à®²à¯à®®à¯ˆà®¯à¯ˆ மாறà¯à®±à¯à®•',
+'revdel-restore-deleted' => 'நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ மாறà¯à®±à®™à¯à®•à®³à¯',
+'revdel-restore-visible' => 'வெளிபà¯à®ªà®Ÿà¯ˆà®¯à®¾à®•à®¤à¯à®¤à¯†à®°à®¿à®¯à¯à®®à¯ மாறà¯à®±à®™à¯à®•à®³à¯',
'pagehist' => 'பகà¯à®• வரலாறà¯',
'deletedhist' => 'நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ வரலாறà¯',
'revdelete-content' => 'உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯à®¤à¯ˆ',
@@ -882,11 +890,12 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
# Diffs
'history-title' => '"$1" பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ திரà¯à®¤à¯à®¤ வரலாறà¯',
'difference' => '(திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯à®•à¯à®•à®¿à®Ÿà¯ˆà®¯à®¾à®© வேறà¯à®ªà®¾à®Ÿà¯)',
+'difference-multipage' => 'பகà¯à®•à®™à¯à®•à®³à¯à®•à¯à®•à¯ இடையேயான வேறà¯à®ªà®¾à®Ÿà¯',
'lineno' => 'வரிசை $1:',
'compareselectedversions' => 'தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ பதிபà¯à®ªà¯à®•à¯à®•à®³à¯ˆ ஒபà¯à®ªà®¿à®Ÿà®µà¯à®®à¯',
'showhideselectedversions' => 'தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ மாறà¯à®±à®™à¯à®•à®³à¯ˆ காடà¯à®Ÿà¯/மறை',
'editundo' => 'மீளமை',
-'diff-multi' => '({{PLURAL:$1|ஒர௠இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®®à¯|$1 இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} காடà¯à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.)',
+'diff-multi' => '({{PLURAL:$1|ஒர௠இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®®à¯|$1 இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} {{PLURAL:$2|பயனரà¯|$2 பயனரà¯à®•à®³à¯}} செயà¯à®¤à®µà¯ˆà®•à®³à¯ˆ காடà¯à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.)',
# Search results
'searchresults' => 'தேடல௠மà¯à®Ÿà®¿à®µà¯à®•à®³à¯',
@@ -977,9 +986,9 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'prefs-rc' => 'அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯',
'prefs-watchlist' => 'கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯',
'prefs-watchlist-days' => 'கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ காடà¯à®Ÿà®µà¯‡à®£à¯à®Ÿà®¿à®¯ நாடà¯à®•à®³à¯:',
-'prefs-watchlist-days-max' => '(கூடியத௠7 நாடà¯à®•à®³à¯)',
+'prefs-watchlist-days-max' => '(அதிகபடà¯à®šà®®à¯ 7 நாடà¯à®•à®³à¯)',
'prefs-watchlist-edits' => 'விரிவாகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ காடà¯à®Ÿà®µà¯‡à®£à¯à®Ÿà®¿à®¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ:',
-'prefs-watchlist-edits-max' => '(மிககà¯à®•à¯‚டிய எணà¯: 1000)',
+'prefs-watchlist-edits-max' => '(அதிகபடà¯à®š எணà¯: 1000)',
'prefs-watchlist-token' => 'கவனிபà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®©à¯ அடையாளமà¯:',
'prefs-misc' => 'பலதரபà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ',
'prefs-resetpass' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à¯à®•',
@@ -997,6 +1006,7 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'contextlines' => 'அடிதà¯à®¤à®²à¯Šà®©à¯à®±à¯à®•à¯à®•à¯à®•à¯ காடà¯à®Ÿà®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà®¿à®¯ வரிகளà¯:',
'contextchars' => 'ஒர௠வரிகà¯à®•à®¾à®© இடமà¯à®šà®¾à®°à¯ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯',
'stub-threshold' => '<a href="#" class="stub">stub link</a> சீரà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯à®•à¯à®•à®¾à®© எலà¯à®²à¯ˆ (பைடà¯à®Ÿà¯à®•à®³à¯):',
+'stub-threshold-disabled' => 'செயலிழகà¯à®•à®®à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
'recentchangesdays' => 'அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à®¿à®²à¯ காடà¯à®Ÿ வேணà¯à®Ÿà®¿à®¯ நாடà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ:',
'recentchangesdays-max' => 'மிக அதிகமாக $1 {{PLURAL:$1|நாளà¯|நாடà¯à®•à®³à¯}}',
'recentchangescount' => 'மொதà¯à®¤ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆà®¯à¯ˆ தானகவே காடà¯à®Ÿ:',
@@ -1058,7 +1068,9 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'prefs-advancedrendering' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
'prefs-advancedsearchoptions' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
'prefs-advancedwatchlist' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
-'prefs-display' => 'விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯',
+'prefs-displayrc' => 'விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯',
+'prefs-displaysearchoptions' => 'விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯',
+'prefs-displaywatchlist' => 'விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯',
'prefs-diffs' => 'விதà¯à®¤à®¿à®¯à®¾à®šà®™à¯à®•à®³à¯',
# User rights
@@ -1190,11 +1202,8 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'recentchanges-legend' => 'அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ தேரà¯à®µà¯à®•à®³à¯',
'recentchangestext' => 'இநà¯à®¤ விகà¯à®•à®¿à®•à¯à®•à¯ மிக அணà¯à®®à¯ˆà®¯à®¿à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ மாறà¯à®±à®™à¯à®•à®³à¯ˆ, இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ காணலாமà¯.',
'recentchanges-feed-description' => 'இவà¯à®µà¯à®³à¯à®³à¯€à®Ÿà¯à®Ÿà®¿à®²à¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ மிக அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯ கவனிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®©à¯à®±à®©.',
-'recentchanges-legend-newpage' => '$1 - பà¯à®¤à®¿à®¯ பகà¯à®•à®®à¯',
'recentchanges-label-newpage' => 'இநà¯à®¤à®¤à¯ தொகà¯à®ªà¯à®ªà¯ ஒர௠பà¯à®¤à®¿à®¯ பகà¯à®•à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®¿à®¯à¯à®³à¯à®³à®¤à¯',
-'recentchanges-legend-minor' => '$1 - சிறிய தொகà¯à®ªà¯à®ªà¯',
'recentchanges-label-minor' => 'இத௠ஒர௠சிற௠தொகà¯à®ªà¯à®ªà¯',
-'recentchanges-legend-bot' => '$1 - தானியஙà¯à®•à®¿à®¯à®¿à®©à¯ தொகà¯à®ªà¯à®ªà¯',
'recentchanges-label-bot' => 'இநà¯à®¤ தொகà¯à®ªà¯à®ªà®¾à®©à®¤à¯ ஒர௠தானியஙà¯à®•à®¿à®¯à®¾à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®•à¯à®®à¯',
'recentchanges-label-unpatrolled' => 'இநà¯à®¤ தொகà¯à®ªà¯à®ªà¯ இனà¯à®©à¯à®®à¯ ரோநà¯à®¤à®¿à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
'rcnote' => "கீழே காணபà¯à®ªà®Ÿà¯à®µà®¤à¯ $4 ஆம௠தேதி $5 மணிகà¯à®•à¯à¯ உளà¯à®³à®ªà®Ÿà®¿ கடைசி {{PLURAL:$2|24 மணிகளிலà¯|'''$2''' நாடà¯à®•à®³à®¿à®²à¯}} செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ {{PLURAL:$1|'''à®’à®°à¯''' மாறà¯à®±à®®à¯|'''$1''' கடைசி மாறà¯à®±à®™à¯à®•à®³à¯}} ஆகà¯à®®à¯.",
@@ -1271,6 +1280,16 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'filetype-banned-type' => "'''\".\$1\"''' அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®¤ கோபà¯à®ªà¯ வகையாகà¯à®®à¯.
அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ {{PLURAL:\$3|கோபà¯à®ªà¯à®µà®•à¯ˆ|கோபà¯à®ªà¯à®µà®•à¯ˆà®•à®³à¯}} \$2 எனà¯à®ªà®¤à¯(வை) ஆகà¯à®®à¯.",
'filetype-missing' => 'இநà¯à®¤à®•à¯ கோபà¯à®ªà¯ நீடà¯à®šà¯ˆà®¯à¯ˆà®•à¯ (எ+கா ".jpg") கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ.',
+'empty-file' => 'தாஙà¯à®•à®³à¯ சமரà¯à®ªà¯à®ªà®¿à®¤à¯à®¤ கோபà¯à®ªà®¿à®²à¯ ஒனà¯à®±à¯à®®à®¿à®²à¯à®²à¯ˆ.',
+'file-too-large' => 'தாஙà¯à®•à®³à¯ சமரà¯à®ªà¯à®ªà®¿à®¤à¯à®¤ கோபà¯à®ªà¯ மிகபà¯à®ªà¯†à®°à®¿à®¯à®¤à¯.',
+'filename-tooshort' => 'தாஙà¯à®•à®³à¯ சமரà¯à®ªà¯à®ªà®¿à®¤à¯à®¤ கோபà¯à®ªà¯ மிகவà¯à®®à¯ சிறியதà¯.',
+'filetype-banned' => 'இநà¯à®¤ வகையான கோபà¯à®ªà¯ தடை செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'verification-error' => 'இநà¯à®¤ கோபà¯à®ªà¯, கோபà¯à®ªà®¿à®©à¯ சரிபாரà¯à®ªà¯à®ªà®¿à®±à¯à®•à®¾à®© சோதனையில௠வெறà¯à®±à®¿à®¯à®Ÿà¯ˆà®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'illegal-filename' => 'கோபà¯à®ªà®¿à®©à¯ பெயரை கொடà¯à®•à¯à®•à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
+'overwrite' => 'à®®à¯à®©à¯à®ªà¯‡ உளà¯à®³ கோபà¯à®ªà®¿à®©à¯ மேல௠எழà¯à®¤ அனà¯à®®à®¤à®¿à®¯à®¿à®²à¯à®²à¯ˆ.',
+'unknown-error' => 'இனம௠தெரியாத ஒர௠தவற௠நிகழà¯à®¨à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯',
+'tmp-create-error' => 'தறà¯à®•à®¾à®²à®¿à®• கோபà¯à®ªà®¿à®©à¯ˆ உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'tmp-write-error' => 'தறà¯à®•à®¾à®²à®¿à®• கோபà¯à®ªà®¿à®©à¯ˆ எழà¯à®¤à¯à®®à¯ போத௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯à®¤à®µà®±à¯.',
'large-file' => 'பரிநà¯à®¤à¯à®°à¯ˆà®•à®ªà¯à®ªà®Ÿà¯à®®à¯ கோபà¯à®ªà¯à®•à®³à®¿à®©à¯ உசà¯à®š அளவ௠$1; இநà¯à®¤à®•à¯ கோபà¯à®ªà®¿à®©à¯ அளவ௠$2.',
'largefileserver' => 'வழஙà¯à®•à®©à®¾à®²à¯ à®à®±à¯à®•à®•à¯ கூடிய உசà¯à®š அளவ௠கோபà¯à®ªà¯ˆà®µà®¿à®Ÿ இகà¯à®•à¯‹à®ªà¯à®ªà¯ பெரியதாகà¯à®®à¯.',
'emptyfile' => 'நீஙà¯à®•à®³à¯ பதிவேறà¯à®±à®¿à®¯ கோபà¯à®ªà¯ வெறà¯à®±à®¾à®• உளà¯à®³à®¤à¯. இத௠கோபà¯à®ªà®¿à®©à¯ பெயரை பிழையாக தடà¯à®Ÿà®šà¯à®šà®¿à®Ÿà¯à®Ÿà®¤à¯à®¤à®• காரணமாக à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯. à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ இகà¯à®•à¯‹à®ªà¯à®ªà¯ˆ நீஙà¯à®•à®³à¯ பதிவேறà¯à®± வேணà¯à®Ÿà¯à®®à®¾à®• எனà¯à®ªà®¤à¯ˆà®•à¯ கரà¯à®¤à®µà¯à®®à¯.',
@@ -1294,13 +1313,13 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'இபà¯à®ªà¯†à®¯à®°à¯ˆà®•à¯ கொணà¯à®Ÿ கோபà¯à®ªà¯ à®à®±à¯à®•à®©à®µà¯‡ பொதà¯à®•à¯ கோபà¯à®ªà®•à®¤à¯à®¤à®¿à®²à¯ உளà¯à®³à®¤à¯; நீஙà¯à®•à®³à¯ தவறாத௠இகà¯à®•à¯‹à®ªà¯à®ªà¯ˆà®ªà¯ பதிவேறà¯à®± வேணà¯à®Ÿà¯à®®à¯†à®©à¯à®±à®¾à®²à¯ à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ வேற௠பெயரின௠கீழ௠பதிவேறà¯à®±à®µà¯à®®à¯.[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'கீழà¯à®•à®¾à®£à¯à®®à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à¯ இநà¯à®¤ கோபà¯à®ªà¯ˆ போலவே இரà¯à®•à¯à®•à®¿à®©à¯à®±à®©. {{PLURAL:$1|கோபà¯à®ªà¯|கோபà¯à®ªà¯à®•à¯à®•à®³à¯}}:',
-'successfulupload' => 'வெறà¯à®±à®¿à®•à®°à®®à®¾à®© பதிவேறà¯à®±à®®à¯',
'uploadwarning' => 'பதிவேறà¯à®±à®²à¯ எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ',
'uploadwarning-text' => 'கீழà¯à®³à¯à®³ கோபà¯à®ªà¯à®šà¯ சà¯à®°à¯à®•à¯à®•à®¤à¯à®¤à¯ˆ மாறà¯à®±à®¿ விடà¯à®Ÿà¯ மீணà¯à®Ÿà¯à®®à¯ சமரà¯à®ªà¯à®ªà®¿à®¯à¯à®™à¯à®•à®³à¯',
'savefile' => 'கோபà¯à®ªà¯ˆà®šà¯ சேமி',
'uploadedimage' => '"[[$1]]" பதிவேறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'overwroteimage' => '"[[$1]]" கோபà¯à®ªà®¿à®©à¯ பà¯à®¤à®¿à®¯ பதிபà¯à®ªà¯ˆ பதிவேறà¯à®±à¯',
'uploaddisabled' => 'பதிவேறà¯à®±à®®à¯ செயலிழகà¯à®•à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
+'uploadfromurl-queued' => 'தஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ பதிவேறà¯à®±à®®à¯ வரிசையில௠உளà¯à®³à®¤à¯.',
'uploaddisabledtext' => 'கோபà¯à®ªà¯ பதிவேறà¯à®±à®™à¯à®•à®³à¯ செயலிழகà¯à®•à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©.',
'uploadscripted' => 'இநà¯à®¤à®•à¯ கோபà¯à®ªà¯ உலாவியால௠பிழையாக விளஙà¯à®•à®¿à®•à¯ கொளà¯à®³à®•à¯à®•à¯‚டிய எசà¯.டி.எமà¯.எலà¯. அலà¯à®²à®¤à¯ வேற௠நிரலà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'uploadvirus' => 'கோபà¯à®ªà¯ நசà¯à®šà¯à®¨à®¿à®°à®²à¯ˆà®•à¯ (வைரஸà¯) கொணà¯à®Ÿà¯à®³à¯à®³à®¤à¯! விபரஙà¯à®•à®³à¯:$1',
@@ -1318,6 +1337,9 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
இகà¯à®•à¯‹à®ªà¯à®ªà¯ˆ பதிவேறà¯à®±à¯à®µà®¤à¯ சரியா எனà¯à®ªà®¤à¯ˆà®•à¯ கரà¯à®¤à®µà¯à®®à¯.
உஙà¯à®•à®³à¯ வசதிகà¯à®•à®¾à®• இகà¯à®•à¯‹à®ªà¯à®ªà®¿à®±à¯à®•à®¾à®• நீகà¯à®•à®²à¯ பதிவ௠தரபà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:",
'filename-bad-prefix' => "நீஙà¯à®•à®³à¯ பதிவேறà¯à®± எதà¯à®¤à®©à®¿à®•à¯à®•à¯à®®à¯ கோபà¯à®ªà®¿à®©à¯ பெயர௠'''\"\$1\"''' எனà¯à®ªà®¤à¯à®Ÿà®©à¯ தொடஙà¯à®•à¯à®•à®¿à®±à®¤à¯, பொதà¯à®µà®¾à®• இத௠எணà¯à®®à®°à¯à®µà®¿ கமெராகà¯à®•à®²à®¾à®²à¯ தானியகà¯à®•à®®à®¾à®• வழஙà¯à®•à®ªà¯à®ªà¯à®Ÿà¯à®®à¯ பெயராகà¯à®®à¯. à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ கோபà¯à®ªà®¿à®±à¯à®•à¯ விளகà¯à®•à®®à®¾à®© பெயரொனà¯à®±à¯ˆà®•à¯ கொடà¯à®•à¯à®•à®µà¯à®®à¯.",
+'upload-success-subj' => 'வெறà¯à®±à®¿à®•à®°à®®à®¾à®© பதிவேறà¯à®±à®®à¯',
+'upload-failure-subj' => 'பதிவேறà¯à®±à®¤à¯à®¤à®¿à®²à¯ à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯ தொலà¯à®²à¯ˆ',
+'upload-warning-subj' => 'பதிவேறà¯à®±à®²à¯ எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ',
'upload-proto-error' => 'பிழையான நெறி',
'upload-proto-error-text' => 'தொலைவà¯à®ªà¯ பதிவேறà¯à®±à®¤à¯à®¤à¯à®•à¯à®•à¯ யà¯.ஆரà¯.எலà¯. <code>http://</code> அலà¯à®²à®¤à¯ <code>ftp://</code> எனà¯à®± à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯à®Ÿà®©à¯ தொடஙà¯à®•à®µà¯‡à®£à¯à®Ÿà¯à®®à¯.',
@@ -1356,13 +1378,13 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
# File description page
'file-anchor-link' => 'கோபà¯à®ªà¯',
'filehist' => 'கோபà¯à®ªà¯ வரலாறà¯',
-'filehist-help' => 'கà¯à®±à®¿à®¤à¯à®¤ நேரதà¯à®¤à®¿à®²à¯ இரà¯à®¨à¯à®¤ படிமதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®• அநà¯à®¨à¯‡à®°à®¤à¯à®¤à®¿à®©à¯ மீத௠சொடà¯à®•à®µà¯à®®à¯.',
+'filehist-help' => 'கà¯à®±à®¿à®¤à¯à®¤ நேரதà¯à®¤à®¿à®²à¯ இரà¯à®¨à¯à®¤ படிமதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®• அநà¯à®¨à¯‡à®°à®¤à¯à®¤à®¿à®©à¯ மீத௠சொடà¯à®•à¯à®•à®µà¯à®®à¯.',
'filehist-deleteall' => 'சகலதையà¯à®®à¯ நீகà¯à®•à¯',
'filehist-deleteone' => 'நீகà¯à®•à¯à®•',
'filehist-revert' => 'à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à¯',
'filehist-current' => 'தறà¯à®ªà¯‹à®¤à¯ˆà®¯',
'filehist-datetime' => 'நாளà¯/நேரமà¯',
-'filehist-thumb' => 'படதà¯à®¤à®¿à®©à¯ கடà¯à®Ÿà¯ˆà®µà®¿à®°à®²à¯ அளவ௠தோறà¯à®±à®®à¯',
+'filehist-thumb' => 'நகம௠அளவ௠சிறà¯à®ªà®Ÿà®®à¯',
'filehist-thumbtext' => '$1 -ல௠இரà¯à®¨à¯à®¤ பதிபà¯à®ªà®¿à®©à¯ சிற௠தோறà¯à®±à®®à¯',
'filehist-nothumb' => 'சிறà¯à®¤à¯‹à®±à¯à®±à®®à¯ இலà¯à®²à¯ˆ',
'filehist-user' => 'பயனரà¯',
@@ -1491,7 +1513,7 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
'uncategorizedtemplates' => 'வகைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤ வாரà¯à®ªà¯à®ªà¯à®°à¯à®•à¯à®•à®³à¯',
'unusedcategories' => 'பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤ பகà¯à®ªà¯à®ªà¯à®•à®³à¯',
'unusedimages' => 'பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤ படிமஙà¯à®•à®³à¯',
-'popularpages' => 'பிரபலமான பகà¯à®•à®™à¯à®•à®³à¯',
+'popularpages' => 'அடிகà¯à®•à®Ÿà®¿ பாரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯',
'wantedcategories' => 'வேணà¯à®Ÿà®¿à®¯ பகà¯à®ªà¯à®ªà¯à®•à®³à¯',
'wantedpages' => 'வேணà¯à®Ÿà®¿à®¯ பகà¯à®•à®™à¯à®•à®³à¯',
'wantedfiles' => 'வேணà¯à®Ÿà®¿à®¯ கோபà¯à®ªà¯à®•à®³à¯',
@@ -1640,7 +1662,6 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
# Watchlist
'watchlist' => 'என௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯',
'mywatchlist' => 'என௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯',
-'watchlistfor' => "('''$1''' பயனரà¯à®•à¯à®•à®¾à®©)",
'nowatchlist' => 'உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ ஒர௠விடயமà¯à®®à¯ இலà¯à®²à¯ˆ.',
'watchlistanontext' => 'உமத௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆ பாரà¯à®• அலà¯à®²à®¤à¯ தொகà¯à®•à¯à®• à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ $1.',
'watchnologin' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
@@ -1752,7 +1773,9 @@ $NEWPAGE
'editcomment' => "தொகà¯à®ªà¯à®ªà®¿à®±à¯à®•à®¾à®© சிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ இவை:\"''\$1''\".",
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|பேசà¯à®šà¯]]) செயà¯à®¤à®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ [[User:$1|$1]] இன௠பதிபà¯à®ªà¯à®•à¯à®•à¯ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'rollback-success' => '$1 செயà¯à®¤à®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ $2 இன௠பதிபà¯à®ªà¯à®•à¯à®•à¯ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
-'sessionfailure' => 'உஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ அமரà¯à®µà®¿à®²à¯ பிரசà¯à®šà®¿à®©à¯ˆ உளà¯à®³à®¤à¯ போல தோனà¯à®±à¯à®•à®¿à®±à®¤à¯. செலà¯à®µà®´à®¿ திரà¯à®Ÿà¯à®Ÿà¯à®•à¯ கெதிரான à®®à¯à®©à¯à®©à¯†à®šà¯à®šà¯†à®°à®¿à®•à¯à®•à¯ˆà®¯à®¾à®• இநà¯à®¤ நடவடிகà¯à®•à¯ˆ இரதà¯à®¤à¯à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. உஙà¯à®•à®³à¯ உலாவியின௠பின௠செலà¯à®µà®¤à®±à¯à®•à®¾à®© பொதà¯à®¤à®¾à®©à¯ˆà®šà¯ செரà¯à®•à®¿ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®²à®µà¯à®®à¯.',
+
+# Edit tokens
+'sessionfailure' => 'உஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ அமரà¯à®µà®¿à®²à¯ பிரசà¯à®šà®¿à®©à¯ˆ உளà¯à®³à®¤à¯ போல தோனà¯à®±à¯à®•à®¿à®±à®¤à¯. செலà¯à®µà®´à®¿ திரà¯à®Ÿà¯à®Ÿà¯à®•à¯ கெதிரான à®®à¯à®©à¯à®©à¯†à®šà¯à®šà¯†à®°à®¿à®•à¯à®•à¯ˆà®¯à®¾à®• இநà¯à®¤ நடவடிகà¯à®•à¯ˆ இரதà¯à®¤à¯à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. உஙà¯à®•à®³à¯ உலாவியின௠பின௠செலà¯à®µà®¤à®±à¯à®•à®¾à®© பொதà¯à®¤à®¾à®©à¯ˆà®šà¯ செரà¯à®•à®¿ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®²à®µà¯à®®à¯.',
# Protect
'protectlogpage' => 'காபà¯à®ªà¯à®ªà¯ பதிகை',
@@ -1878,7 +1901,7 @@ $1',
'sp-contributions-submit' => 'தேடà¯à®•',
# What links here
-'whatlinkshere' => 'இப௠பகà¯à®•à®¤à¯à®¤à¯ˆ இணைதà¯à®¤à®µà¯ˆ',
+'whatlinkshere' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ இணைதà¯à®¤à®µà¯ˆ',
'whatlinkshere-title' => '"$1" பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ',
'whatlinkshere-page' => 'பகà¯à®•à®®à¯:',
'linkshere' => "'''[[:$1]]''' பினà¯à®µà®°à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à®¿à®²à¯ இபà¯à®ªà®•à¯à®•à®®à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:",
@@ -1930,7 +1953,6 @@ $1',
'ipb-edit-dropdown' => 'தடை காரணஙà¯à®•à®³à¯ தொகà¯',
'ipb-unblock-addr' => '$1 இன௠தடையை நீகà¯à®•à¯',
'ipb-unblock' => 'à®.பி. அலà¯à®²à®¤à¯ பயனரà¯à®•à¯à®•à®¾à®© தடையை நீகà¯à®•à¯',
-'ipb-blocklist-addr' => '$1 இறà¯à®•à¯ தறà¯à®ªà¯‹à®¤à¯à®³à¯à®³ தடà¯à®ªà¯à®ªà¯à®•à®³à¯',
'ipb-blocklist' => 'தறà¯à®ªà¯‹à®¤à¯à®³à¯à®³ தடà¯à®ªà¯à®ªà¯à®•à®³à¯ˆà®ªà¯ பாரà¯',
'unblockip' => 'பயனர௠தடையை நீகà¯à®•à¯',
'unblockiptext' => 'à®®à¯à®©à¯à®©à®°à¯ தடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ à®.பி. à®®à¯à®•à®µà®°à®¿ அலà¯à®²à®¤à¯ பயனரà¯à®ªà¯†à®¯à®°à®¿à®©à¯ எழà¯à®¤à¯à®¤à¯ அணà¯à®•à¯à®•à®¤à¯à®¤à¯ˆ மீழà¯à®µà®¿à®ªà¯à®ªà®¤à®±à¯à®•à¯ கீழேயà¯à®³à¯à®³ படிவதà¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯.',
@@ -1971,7 +1993,7 @@ $1',
'ipb_blocked_as_range' => 'தவறà¯:இநà¯à®¤ à®.பி. $1 நேரடியாக தடைச௠செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ எனவே தடையை நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. இத௠$2 எனà¯à®± à®.பி. வீசà¯à®šà¯ தடைச௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®²à¯ தடைச௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ இவà¯à®µà¯€à®šà¯à®šà®¿à®±à¯à®•à®¾à®© தடையை நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.',
'ip_range_invalid' => 'செலà¯à®²à¯à®ªà®Ÿà®¿à®¯à®±à¯à®± à®.பி. வீசà¯à®šà¯',
'blockme' => 'எனà¯à®©à¯ˆ தடைச௠செயà¯',
-'proxyblocker' => 'பà¯à®°à¯Šà®•à¯à®šà®¿ தடà¯à®ªà¯à®ªà®¿',
+'proxyblocker' => 'மறைவணà¯à®•à¯à®•à®®à¯ (பà¯à®°à¯Šà®•à¯à®šà®¿) தடà¯à®ªà¯à®ªà®¿',
'proxyblocker-disabled' => 'இநà¯à®¤à®šà¯ செயல௠செயலிழகà¯à®•à®šà¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'proxyblocksuccess' => 'வெறà¯à®±à®¿.',
@@ -2111,7 +2133,7 @@ $1',
'import-nonewrevisions' => 'எலà¯à®²à®¾à®¤à¯ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯à®®à¯ à®®à¯à®©à¯à®©à®°à¯ இறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©.',
'xml-error-string' => '$1 நிரை $2, நிரல௠$3 (பைட௠$4): $5',
'import-upload' => 'XML தரவை பதிவேறà¯à®±à¯',
-'import-token-mismatch' => 'உஙà¯à®•à®³à¯ அமரà¯à®µà®¿à®©à¯ தரவà¯à®•à®³à¯ அழிநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®©. தயவà¯à®šà¯†à®¯à¯à®¤à¯ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®µà¯à®®à¯.',
+'import-token-mismatch' => 'உஙà¯à®•à®³à¯ அமரà¯à®µà®¿à®©à¯ தரவà¯à®•à®³à¯ அழிநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®©. à®…à®°à¯à®³à¯à®•à¯‚à®°à¯à®¨à¯à®¤à¯ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®²à¯à®•.',
'import-invalid-interwiki' => 'கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ விகà¯à®•à®¿à®¯à®¿à®²à¯ இரà¯à®¨à¯à®¤à¯ இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯ .',
# Import log
@@ -2133,7 +2155,7 @@ $1',
'tooltip-pt-anonlogin' => 'நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®šà¯ செயà¯à®¯ ஊகà¯à®•à¯à®µà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ எனினà¯à®®à¯ இத௠கடà¯à®Ÿà®¾à®¯à®®à®²à¯à®².',
'tooltip-pt-logout' => 'விடà¯à®ªà®¤à®¿à®•à¯ˆ',
'tooltip-ca-talk' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®®à¯ தொடரà¯à®ªà®¾à®© உரையாடல௠பகà¯à®•à®®à¯',
-'tooltip-ca-edit' => 'நீஙà¯à®•à®³à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. "à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ காடà¯à®Ÿà¯" பொதà¯à®¤à®¾à®©à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ பினà¯à®©à®°à¯ உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ சேமிகà¯à®•à®µà¯à®®à¯.',
+'tooltip-ca-edit' => 'நீஙà¯à®•à®³à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®¤à¯ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. "à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ காடà¯à®Ÿà¯" பொதà¯à®¤à®¾à®©à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ பினà¯à®©à®°à¯ உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ சேமிகà¯à®•à®µà¯à®®à¯.',
'tooltip-ca-addsection' => 'பà¯à®¤à®¿à®¯ பகà¯à®¤à®¿à®¯à¯ˆà®¤à¯ தொடஙà¯à®•à¯',
'tooltip-ca-viewsource' => 'இபà¯à®ªà®•à¯à®•à®®à¯ காகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. நீஙà¯à®•à®³à¯ இதன௠மூலதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®²à®¾à®®à¯.',
'tooltip-ca-history' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ பழைய பதிபà¯à®ªà¯à®•à®³à¯.',
@@ -2146,7 +2168,7 @@ $1',
'tooltip-search' => '{{SITENAME}}-இல௠தேடà¯à®•',
'tooltip-search-go' => 'இபà¯à®ªà¯†à®¯à®°à¯ˆà®•à¯ கொணà¯à®Ÿà®ªà¯ பகà¯à®•à®®à¯ இரà¯à®ªà¯à®ªà®¿à®©à¯ அதறà¯à®•à¯ நேரடியாகச௠செலà¯à®•',
'tooltip-search-fulltext' => 'இசà¯à®šà¯Šà®±à¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தேடà¯à®•',
-'tooltip-p-logo' => 'à®®à¯à®•à®ªà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à¯ செலà¯',
+'tooltip-p-logo' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®®à¯',
'tooltip-n-mainpage' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செலà¯à®²à®µà¯à®®à¯',
'tooltip-n-mainpage-description' => 'à®®à¯à®¤à®±à¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செலà¯à®•',
'tooltip-n-portal' => 'திடà¯à®Ÿà®®à¯ பறà¯à®±à®¿ தெரிநà¯à®¤à¯à®•à¯ கொளà¯à®³, நீஙà¯à®•à®³à¯ எனà¯à®© செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯, தேவையானவறà¯à®±à¯ˆ எஙà¯à®•à¯ தேட எனà¯à®ªà®©à®µà®±à¯à®±à¯ˆ அறிய',
@@ -2167,7 +2189,7 @@ $1',
'tooltip-ca-nstab-main' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
'tooltip-ca-nstab-user' => 'பயனர௠பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
'tooltip-ca-nstab-media' => 'ஊடகக௠கோபà¯à®ªà¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-special' => 'இத௠ஒர௠சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯, இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீஙà¯à®•à®³à¯ நேரடியாக தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
+'tooltip-ca-nstab-special' => 'இத௠ஒர௠சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯, இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீஙà¯à®•à®³à¯ நேரடியாகத௠தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
'tooltip-ca-nstab-project' => 'திடà¯à®Ÿà®ªà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
'tooltip-ca-nstab-image' => 'கோபà¯à®ªà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
'tooltip-ca-nstab-mediawiki' => 'à®®à¯à®±à¯ˆà®®à¯ˆà®šà®¾à®°à¯ தகவலà¯à®•à®³à¯ˆà®ªà¯ பாரà¯',
@@ -2183,7 +2205,7 @@ $1',
'tooltip-recreate' => 'à®à®±à¯à®•à®©à®µà¯‡ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯à®®à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à¯',
'tooltip-upload' => 'பதிவேறà¯à®±à®¤à¯à®¤à¯ˆ தொடஙà¯à®•à¯',
'tooltip-rollback' => '"à®®à¯à®©à¯à®ªà®¿à®°à¯à®¨à¯à®¤ நிலைகà¯à®•à¯à®•à¯ கொணà¯à®Ÿà¯à®µà®°à¯à®¤à®²à¯" எனà¯à®ªà®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ அனைதà¯à®¤à¯ˆà®¯à¯à®®à¯ பழையபடி இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®²à¯ கடைசி பயனர௠தொகà¯à®¤à¯à®¤ நிலைகà¯à®•à¯ ஒரே ஒர௠சொடà¯à®•à¯à®•à®¿à®²à¯ கொணà¯à®Ÿà¯à®µà®°à¯à®®à¯.',
-'tooltip-undo' => '"பினà¯à®µà®¾à®™à¯à®•à¯" எனபத௠மà¯à®©à®ªà¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯à®•à®¿à®±à®¤à¯. மேலà¯à®®à¯ தாஙà¯à®•à®³à¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà®¿à®©à¯ˆ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®± நிலைகà¯à®•à¯ கொணà¯à®Ÿà¯à®µà®¨à¯à®¤à¯ காடà¯à®Ÿà¯à®®à¯. அத௠தஙà¯à®•à®³à¯à®•à¯à®•à¯ சிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ அதறà¯à®•à®¾à®© காரணதà¯à®¤à¯ˆ கூற அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯.',
+'tooltip-undo' => '"பினà¯à®µà®¾à®™à¯à®•à¯" எனà¯à®ªà®¤à¯ à®®à¯à®©à¯à®ªà¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯à®•à®¿à®±à®¤à¯. மேலà¯à®®à¯ தாஙà¯à®•à®³à¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà®¿à®©à¯ˆ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®± நிலைகà¯à®•à¯ கொணà¯à®Ÿà¯à®µà®¨à¯à®¤à¯ காடà¯à®Ÿà¯à®®à¯. அத௠தஙà¯à®•à®³à¯à®•à¯à®•à¯à®šà¯ சிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯à®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ அதறà¯à®•à®¾à®© காரணதà¯à®¤à¯ˆà®•à¯ கூற அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯.',
# Metadata
'notacceptable' => 'உஙà¯à®•à®³à®¤à¯ சேவையாளர௠வாசிகà¯à®• கூடிய விததà¯à®¤à®¿à®²à¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¾à®² தரவà¯à®•à®³à¯ˆ வழஙà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
@@ -2219,16 +2241,16 @@ $1',
'skinname-cologneblue' => 'கொலோன௠(Cologne) நீலம௠Blue',
# Math options
-'mw_math_png' => 'எபà¯à®ªà¯‹à®¤à¯à®®à¯ PNG ஆக மாறà¯à®±à¯',
-'mw_math_simple' => 'சிகà¯à®•à®²à®±à¯à®±à®¤à®¾à®¯à®¿à®©à¯ HTML அலà¯à®²à®¤à¯ PNG',
-'mw_math_html' => 'கூடà¯à®®à®¾à®©à®¾à®²à¯ HTML அலà¯à®²à®¤à¯ PNG',
+'mw_math_png' => 'எபà¯à®ªà¯‹à®¤à¯à®®à¯ பி.எனà¯.ஞà¯à®šà®¿ (PNG) ஆக மாறà¯à®±à¯',
+'mw_math_simple' => 'சிகà¯à®•à®²à®±à¯à®±à®¤à®¾à®¯à®¿à®©à¯ எசà¯.டி.எமà¯.எல௠(HTML), இலà¯à®²à®¾à®µà®¿à®Ÿà®¿à®²à¯ பி.எனà¯.ஞà¯à®šà®¿ (PNG)',
+'mw_math_html' => 'கூடà¯à®®à®¾à®©à®¾à®²à¯ எசà¯.டி.எமà¯.எல௠(HTML), இலà¯à®²à®¾à®µà®¿à®Ÿà®¿à®²à¯ பி.எனà¯.ஞà¯à®šà®¿ (PNG)',
'mw_math_source' => 'TeX ஆக விடà¯à®Ÿà¯ வை (உரைசார௠உலாவிகளà¯à®•à¯à®•à¯)',
'mw_math_modern' => 'பà¯à®¤à®¿à®¯ உலாவிகளà¯à®•à¯à®•à¯à®ªà¯ பரிநà¯à®¤à¯à®°à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯',
'mw_math_mathml' => 'கூடà¯à®®à®¾à®¯à®¿à®©à¯ MathML (சோதனை)',
# Math errors
'math_failure' => 'பாகà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ தோலà¯à®µà®¿',
-'math_unknown_error' => 'அறியபà¯à®ªà®Ÿà®¾à®¤ தவறà¯',
+'math_unknown_error' => 'அறியாத à®à®¤à¯‹à®µà¯Šà®°à¯ பிழை',
'math_unknown_function' => 'அறியபà¯à®ªà®Ÿà®¾à®¤ செயறà¯à®ªà®¾à®Ÿà¯',
'math_lexing_error' => 'தொகà¯à®¤à¯à®¤à®²à¯ (லெகà¯à®šà®¿à®™à¯) தவறà¯',
'math_syntax_error' => 'தொடரமைபà¯à®ªà¯à®¤à¯ தவறà¯',
@@ -2272,10 +2294,10 @@ $1',
'imagemaxsize' => "படிமஙà¯à®•à®³à®¿à®©à¯ உசà¯à®š அளவà¯:<br />''(கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ விவர பகà¯à®•à®™à¯à®•à®³à¯à®•à¯à®•à¯)''",
'thumbsize' => 'சிற௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®¤à¯à®¤à®¿à®©à¯ பரிமாணமà¯:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|பகà¯à®•à®®à¯|பகà¯à®•à®™à¯à®•à®³à¯}}',
-'file-info' => '(கோபà¯à®ªà®¿à®©à¯ அளவà¯: $1, MIME வகை: $2)',
-'file-info-size' => '($1 × $2 பிகà¯à®šà®²à¯, கோபà¯à®ªà®¿à®©à¯ அளவà¯: $3, MIME வகை: $4)',
+'file-info' => 'கோபà¯à®ªà®¿à®©à¯ அளவà¯: $1, MIME வகை: $2',
+'file-info-size' => '$1 × $2 படவணà¯à®•à¯à®•à®³à¯, கோபà¯à®ªà®¿à®©à¯ அளவà¯: $3, MIME வகை: $4',
'file-nohires' => '<small>இதைவிட அளவில௠பெரிய படிமம௠இலà¯à®²à¯ˆ.</small>',
-'svg-long-desc' => '(SVG கோபà¯à®ªà¯, பெயரளவில௠$1 × $2 பிகà¯à®šà®²à¯à®•à®³à¯, கோபà¯à®ªà¯ அளவà¯: $3)',
+'svg-long-desc' => 'SVG கோபà¯à®ªà¯, பெயரளவில௠$1 × $2 பிகà¯à®šà®²à¯à®•à®³à¯, கோபà¯à®ªà¯ அளவà¯: $3',
'show-big-image' => 'à®®à¯à®´à¯ அளவிலான படிமமà¯',
'show-big-image-thumb' => '<small>இநà¯à®¤ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®¤à¯à®¤à®¿à®©à¯ பரிமாணமà¯: $1 × $2 பிகà¯à®šà®²à¯à®•à®³à¯</small>',
@@ -2315,7 +2337,7 @@ $1',
'exif-imagewidth' => 'அகலமà¯',
'exif-imagelength' => 'உயரமà¯',
'exif-compression' => 'சà¯à®°à¯à®•à¯à®•à®¤à¯ திடà¯à®Ÿà®®à¯',
-'exif-photometricinterpretation' => 'பிகà¯à®šà®²à¯ பொதிவà¯',
+'exif-photometricinterpretation' => 'படவணà¯à®•à¯à®•à®³à¯ (பிகà¯à®šà®²à¯) அமைபà¯à®ªà¯à®°à¯à®µà®¾à®•à¯à®•à®®à¯',
'exif-orientation' => 'திசை',
'exif-samplesperpixel' => 'à®…à®™à¯à®•à®™à¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
'exif-planarconfiguration' => 'தரவ௠அமைவà¯',
@@ -2325,7 +2347,7 @@ $1',
'exif-stripoffsets' => 'படிமத௠தரவ௠அமைவிடமà¯',
'exif-rowsperstrip' => 'ஒர௠படà¯à®Ÿà¯ˆà®¯à®¿à®²à¯ உளà¯à®³ நிரைகளின௠எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
'exif-stripbytecounts' => 'சà¯à®°à¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ படà¯à®Ÿà®¿à®¯à®¿à®²à¯ உளà¯à®³ பைடà¯à®Ÿà¯à®•à®³à¯',
-'exif-jpeginterchangeformatlength' => 'JPEG தரவà¯à®•à®³à®¿à®©à¯ பைட௠அளவà¯',
+'exif-jpeginterchangeformatlength' => 'சே.பி.இ.சி (JPEG) தரவà¯à®•à®³à®¿à®©à¯ பைட௠அளவà¯',
'exif-transferfunction' => 'இடமாறà¯à®± செயலà¯à®®à¯à®±à¯ˆ',
'exif-datetime' => 'கோபà¯à®ªà¯ மாறà¯à®± நாள௠நேரமà¯',
'exif-imagedescription' => 'படிம தலைபà¯à®ªà¯',
@@ -2334,8 +2356,8 @@ $1',
'exif-software' => 'பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ மெனà¯à®ªà¯Šà®°à¯à®³à¯',
'exif-artist' => 'ஆகà¯à®•à®°à¯',
'exif-copyright' => 'பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®¯à®¾à®³à®°à¯',
-'exif-exifversion' => 'எகà¯à®ƒà®šà®¿à®ƒà®ªà¯ பதிபà¯à®ªà¯',
-'exif-flashpixversion' => 'ஆதரவà¯à®³à¯à®³ பிளாஷொபிகà¯à®¸à¯ பதிபà¯à®ªà¯',
+'exif-exifversion' => 'எகà¯à®ƒà®šà®¿à®ƒà®ªà¯ (Exif) பதிபà¯à®ªà¯',
+'exif-flashpixversion' => 'பயனà¯à®µà®´à®•à¯à®•à®¿à®²à¯à®³à¯à®³ பிளாழà¯à®šà¯à®ªà®¿à®•à¯à®ƒà®šà¯ (Flashpix) பதிபà¯à®ªà¯',
'exif-colorspace' => 'நிற வெளி',
'exif-componentsconfiguration' => 'ஒவà¯à®µà¯†à®°à¯ à®…à®™à¯à®•à®¤à¯à®¤à®¿à®©à®¤à¯à®®à¯ பொரà¯à®³à¯',
'exif-compressedbitsperpixel' => 'படிம சà¯à®±à¯à®•à¯à®• à®®à¯à®±à¯ˆ',
@@ -2361,7 +2383,7 @@ $1',
'exif-exposurebiasvalue' => 'மறைநீகà¯à®•à®•à¯ கோடலà¯',
'exif-subjectdistance' => 'கரà¯à®ªà¯à®ªà¯Šà®°à¯à®³à®¿à®©à¯ தூரமà¯',
'exif-lightsource' => 'ஒளி மூலமà¯',
-'exif-flash' => 'திடீர௠ஒளி',
+'exif-flash' => 'திடீர௠ஒளிபாயà¯à®šà¯à®šà®¿',
'exif-focallength' => 'விலà¯à®²à¯ˆà®•à¯ கà¯à®µà®¿à®¯à®®à¯ (கà¯à®µà®¿à®¯à®¤à¯à®¤à¯Šà®²à¯ˆà®µà¯)',
'exif-subjectarea' => 'பொரà¯à®³à¯ பகà¯à®¤à®¿',
'exif-flashenergy' => 'திடீர௠ஒளி வலà¯',
@@ -2369,7 +2391,7 @@ $1',
'exif-focalplaneyresolution' => 'Y கà¯à®µà®¿à®¯à®¤à¯ தளதà¯à®¤à®¿à®²à¯ நà¯à®£à¯à®•à¯à®•à®®à¯',
'exif-focalplaneresolutionunit' => 'கà¯à®µà®¿à®¯à®¤à¯ தள நà¯à®£à¯à®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ அலகà¯',
'exif-subjectlocation' => 'பொரà¯à®³à®¿à®©à¯ இடமà¯',
-'exif-exposureindex' => 'மறைநீகà¯à®•à®šà¯ சà¯à®Ÿà¯à®Ÿà®¿',
+'exif-exposureindex' => 'திறபà¯à®ªà¯à®šà¯ சà¯à®Ÿà¯à®Ÿà¯†à®£à¯',
'exif-sensingmethod' => 'உணரà¯à®µà¯ à®®à¯à®±à¯ˆ',
'exif-filesource' => 'கோபà¯à®ªà¯ மூலமà¯',
'exif-scenetype' => 'காடà¯à®šà®¿ வகை',
@@ -2377,7 +2399,7 @@ $1',
'exif-exposuremode' => 'மறைநீகà¯à®• à®®à¯à®±à¯ˆ',
'exif-whitebalance' => 'வெளà¯à®³à¯ˆà®šà¯ சமநிலை',
'exif-digitalzoomratio' => 'எணà¯à®®à®°à¯à®µà®¿ பெரà¯à®ªà¯à®ªà®¿à®¤à¯à®¤à®²à¯ விகிதமà¯',
-'exif-focallengthin35mmfilm' => '35 மி.மி. படசà¯à®šà¯à®°à¯à®³à®¿à®²à¯ கà¯à®µà®¿à®¯à®¤à¯à®¤à¯‚à®°à®®à¯',
+'exif-focallengthin35mmfilm' => '35 மி.மி. படசà¯à®šà¯à®°à¯à®³à®¿à®²à¯ கà¯à®µà®¿à®¯à®¤à¯à®¤à¯Šà®²à¯ˆà®µà¯',
'exif-scenecapturetype' => 'பிடிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ காடà¯à®šà®¿ வகை',
'exif-gaincontrol' => 'காடà¯à®šà®¿à®•à¯ கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯',
'exif-contrast' => 'உறழà¯à®ªà¯Šà®°à¯à®µà¯',
@@ -2395,7 +2417,7 @@ $1',
'exif-gpssatellites' => 'பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ செயà¯à®®à®¤à®¿à®•à®³à¯',
'exif-gpsstatus' => 'வாஙà¯à®•à®¿à®¯à®¿à®©à¯ நிலை',
'exif-gpsmeasuremode' => 'அளவீடà¯à®Ÿà¯ à®®à¯à®±à¯ˆ',
-'exif-gpsdop' => 'அலவீடà¯à®Ÿà¯ செமà¯à®®à¯ˆ',
+'exif-gpsdop' => 'அளவீடà¯à®Ÿà¯à®¤à¯ தà¯à®²à¯à®²à®¿à®¯à®®à¯',
'exif-gpsspeedref' => 'வேகதின௠அலகà¯',
'exif-gpsspeed' => 'பà¯à®µà®¿à®¯à®¿à®Ÿà®®à¯ காலம௠விரைவ௠காடà¯à®Ÿà®¿à®¯à®¿à®©à¯ வேகமà¯',
'exif-gpstrack' => 'அசைவà¯à®¤à¯ திசை',
@@ -2418,10 +2440,10 @@ $1',
'exif-componentsconfiguration-0' => 'இலà¯à®²à¯ˆ',
'exif-exposureprogram-0' => 'வரையறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
-'exif-exposureprogram-1' => 'மனிதசà¯à®šà¯†à®¯à®²à¯',
+'exif-exposureprogram-1' => 'கைமà¯à®±à¯ˆ',
'exif-exposureprogram-2' => 'வழகà¯à®•à®®à®¾à®© நிரலà¯',
-'exif-exposureprogram-3' => 'தà¯à®µà®¾à®° à®®à¯à®©à¯à®©à¯à®°à®¿à®®à¯ˆ',
-'exif-exposureprogram-4' => 'மூடி à®®à¯à®©à¯à®©à¯à®°à®¿à®®à¯ˆ',
+'exif-exposureprogram-3' => 'தà¯à®³à¯ˆ à®®à¯à®©à¯à®©à¯à®°à®¿à®®à¯ˆ',
+'exif-exposureprogram-4' => 'மறைபà¯à®ªà®¾à®©à¯à®µà®¿à®°à¯ˆà®µà¯ à®®à¯à®©à¯à®©à¯à®°à®¿à®®à¯ˆ',
'exif-subjectdistance-value' => '$1 மீடà¯à®Ÿà®°à¯à®•à®³à¯',
@@ -2434,16 +2456,16 @@ $1',
'exif-meteringmode-255' => 'மறà¯à®±à®µà¯ˆ',
'exif-lightsource-0' => 'தெரியாதà¯',
-'exif-lightsource-1' => 'நாள௠ஒளி',
+'exif-lightsource-1' => 'பகலொளி',
'exif-lightsource-2' => 'உடனொளிரà¯à®µà¯ விளகà¯à®•à¯',
-'exif-lightsource-3' => 'தஙà¯à®¸à¯à®¤à®©à¯ (வெளà¯à®³à¯Šà®³à®¿à®°à¯à®µà¯ விளகà¯à®•à¯)',
+'exif-lightsource-3' => 'தஙà¯à®•à®¿à®šà®¿à®Ÿà¯à®Ÿà®©à¯ இழை (விளகà¯à®•à¯ ஒளி)',
'exif-lightsource-4' => 'திடீர௠ஒளி',
-'exif-lightsource-9' => 'சிறபà¯à®ªà®¾à®© தடà¯à®ªà®µà¯†à®ªà¯à®ªà®®à¯',
-'exif-lightsource-10' => 'à®®à¯à®•à®¿à®´à¯ மூடà¯à®Ÿà®®à¯',
+'exif-lightsource-9' => 'நலà¯à®² வானிலை',
+'exif-lightsource-10' => 'மோடம௠(காரà¯à®®à¯à®•à®¿à®²à¯ மூடà¯à®Ÿà®®à¯)',
'exif-lightsource-11' => 'நிழலà¯',
-'exif-lightsource-12' => 'நாள௠ஒளி உடனொளிரà¯à®µà¯ விளகà¯à®•à¯ (D 5700 – 7100K)',
+'exif-lightsource-12' => 'பகலொளி உடனொளிரà¯à®µà¯ (பà¯à®³à¯‹à®°à®šà¯†à®£à¯à®Ÿà¯à®Ÿà¯) விளகà¯à®•à¯ (D 5700 – 7100K)',
'exif-lightsource-13' => 'நாள௠வெளà¯à®³à¯ˆ உடனொளிர௠(N 4600 – 5400K)',
-'exif-lightsource-14' => 'கà¯à®³à®¿à®°à¯ வெளà¯à®³à¯ˆ உடனொளிர௠(W 3900 – 4500K)',
+'exif-lightsource-14' => 'தணà¯à®®à¯ˆà®¯à®¾à®© வெளà¯à®³à¯ˆ உடனொளிரà¯à®šà¯à®šà®¿ (பà¯à®³à¯‹à®°à®šà¯†à®£à¯à®Ÿà¯à®Ÿà¯) (W 3900 – 4500K)',
'exif-lightsource-15' => 'வெளà¯à®³à¯ˆ உடனொளிர௠(WW 3200 – 3700K)',
'exif-lightsource-17' => 'சீரà¯à®¤à®° ஒளி A',
'exif-lightsource-18' => 'சீரà¯à®¤à®° ஒளி B',
@@ -2460,14 +2482,14 @@ $1',
'exif-customrendered-0' => 'சாதரணச௠செயறà¯à®ªà®¾à®Ÿà¯',
'exif-customrendered-1' => 'வடிவமைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ செயறà¯à®ªà®¾à®Ÿà¯',
-'exif-exposuremode-0' => 'தானியகà¯à®• மறைநீகà¯à®•à®®à¯',
+'exif-exposuremode-0' => 'தானியகà¯à®• திறபà¯à®ªà¯',
'exif-exposuremode-2' => 'தானியகà¯à®• அடைபà¯à®ªà¯à®•à¯ கà¯à®±à®¿',
'exif-whitebalance-0' => 'தானியகà¯à®• வெளà¯à®³à¯ˆà®šà¯ சமநிலை',
'exif-scenecapturetype-0' => 'சீரà¯à®¤à®°',
-'exif-scenecapturetype-1' => 'நிலகà¯à®•à®¾à®Ÿà¯à®šà®¿',
-'exif-scenecapturetype-2' => 'உரà¯à®µà®ªà¯à®ªà®Ÿà®®à¯',
+'exif-scenecapturetype-1' => 'அகலவாடà¯à®Ÿà¯',
+'exif-scenecapturetype-2' => 'நெடà¯à®•à¯à®•à¯ வாடà¯à®Ÿà¯ (உரà¯à®µà®ªà¯à®ªà®Ÿà®®à¯)',
'exif-scenecapturetype-3' => 'இராக௠காடà¯à®šà®¿',
'exif-gaincontrol-0' => 'எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ',
@@ -2655,6 +2677,7 @@ $5
'version-hook-subscribedby' => 'பயனà¯à®ªà®¾à®Ÿà¯',
'version-version' => '(பதிபà¯à®ªà¯ $1)',
'version-license' => 'அனà¯à®®à®¤à®¿',
+'version-poweredby-others' => 'மறà¯à®±à®µà¯ˆà®•à®³à¯',
'version-software' => 'நிறà¯à®µà®ªà¯à®ªà®Ÿà¯à®Ÿ மெனà¯à®ªà¯Šà®°à¯à®³à¯',
'version-software-product' => 'உறà¯à®ªà®¤à¯à®¤à®¿à®ªà¯à®ªà¯Šà®°à¯à®³à¯',
'version-software-version' => 'பதிபà¯à®ªà¯',
@@ -2704,7 +2727,15 @@ $5
'tags-edit' => 'தொகà¯',
'tags-hitcount' => '$1 {{PLURAL:$1|மாறà¯à®±à®®à¯|மாறà¯à®±à®™à¯à®•à®³à¯}}',
+# Special:ComparePages
+'compare-page1' => 'பகà¯à®•à®®à¯ 1',
+'compare-page2' => 'பகà¯à®•à®®à¯ 2',
+'compare-rev1' => 'திரà¯à®¤à¯à®¤à®®à¯ 1',
+'compare-rev2' => 'திரà¯à®¤à¯à®¤à®®à¯ 2',
+'compare-submit' => 'ஒபà¯à®ªà®¿à®Ÿà¯',
+
# HTML forms
+'htmlform-required' => 'இதன௠உடà¯à®ªà¯Šà®°à¯à®³à¯ தேவையானத௠(கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà¯à®®à¯)',
'htmlform-submit' => 'சமரà¯à®ªà¯à®ªà®¿',
'htmlform-reset' => 'மாறà¯à®±à®™à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯',
'htmlform-selectorother-other' => 'மறà¯à®±à®µà¯ˆ',
diff --git a/languages/messages/MessagesTcy.php b/languages/messages/MessagesTcy.php
index 4629ca75..9f591338 100644
--- a/languages/messages/MessagesTcy.php
+++ b/languages/messages/MessagesTcy.php
@@ -27,8 +27,7 @@ $messages = array(
'tog-editsection' => 'ಪà³à²Ÿà³Šà²¤ ಭಾಗಲೊನೠ[ಸಂಪಾದನೆ] ಲಿಂಕà³â€™à²²à³†à²¨à³ ಒತà³à²¤à³â€™à²¦à³ ಬದಲೠಮನà³à²ªà³à²²à³†à²• ಉಪà³à²ªà²¡à³',
'tog-editsectiononrightclick' => 'ಪà³à²Ÿà³Šà²¤ ವಿಭಾಗೊಲೆನೠà²à²¤ ಹೆಡà³à²¡à²¿à²‚ಗà³â€™à²¨à³ ರೈಟೠಕà³à²²à²¿à²•à³ ಮಲà³à²¤à³â€™à²¦à³ ಸಂಪಾದನೆ ಮಲà³à²ªà³à²²à³†à²• ಉಪà³à²ªà²¡à³ (JavaScript)',
'tog-showtoc' => 'ಪರಿವಿಡಿನà³(ಟೇಬಲೠಆಫೠಕಂಟೆಂಟà³à²¸à³) ತೊಜà³à²ªà²¾à²²à³† (ಮೂಜೆರà³à²¦à³ ಜಾಸà³à²¤à²¿ ಹೆಡà³à²¡à²¿à²‚ಗೠಉಪà³à²ªà³à²¨à²‚ಚಿನ ಪà³à²Ÿà³Šà²²à³†à²—à³)',
-'tog-rememberpassword' => 'ಈ ಕಂಪà³à²¯à³‚ಟರà³â€™à²¡à³ ಎನà³à²¨ ಲಾಗಿನà³à²¨à³ ನೆನಪà³à²¡à³ ದೀಲ',
-'tog-editwidth' => 'ಸಂಪಾದನೆ ಅಂಕಣ ಪೂರà³à²¤à²¿ ಅಗೆಲ ಉಪà³à²ªà²¡à³',
+'tog-rememberpassword' => 'ಈ ಕಂಪà³à²¯à³‚ಟರà³â€™à²¡à³ ಎನà³à²¨ ಲಾಗಿನà³à²¨à³ ನೆನಪà³à²¡à³ ದೀಲ (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'ಯಾನೠಶà³à²°à³ ಮಲà³à²¤à²¿à²¨ ಪà³à²Ÿà³Šà²²à³†à²¨à³ ಯೆನà³à²¨ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೠಸೇರà³à²ªà²¾à²²à³†',
'tog-watchdefault' => 'ಯಾನೠಸಂಪಾದನೆ ಮನà³à²ªà³à²¨à²‚ಚಿನ ಪà³à²Ÿà³Šà²²à³†à²¨à³ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೠಸೇರà³à²ªà²¾à²²à³†',
'tog-watchmoves' => 'ಯಾನೠಮೂವೠಮಲà³à²¤à²¿à²¨à²‚ಚಿನ ಪà³à²Ÿà³Šà²²à³†à²¨à³ ಎನà³à²¨ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೠಸೇರà³à²ªà²¾à²²à³†',
@@ -555,7 +554,6 @@ $messages = array(
# Watchlist
'watchlist' => 'ವೀಕà³à²·à²£à²¾ ಪಟà³à²Ÿà²¿',
'mywatchlist' => 'ಎನà³à²¨ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿',
-'watchlistfor' => "('''$1''' ಇಂದೆತ)",
'watch' => 'ತೂಲೆ',
'watchthispage' => 'ಈ ಪà³à²Ÿà³Šà²¨à³ ತೂಲೆ',
'unwatch' => 'ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²°à³à²¦à³ ದೆಪà³à²ªà³',
@@ -705,9 +703,9 @@ $messages = array(
'nextdiff' => 'ಪೊಸ ಎಡಿಟೠ→',
# Media information
-'file-info-size' => '($1 × $2 ಪಿಕà³à²¸à³†à²²à³, ಫೈಲà³â€™à²¦ ಗಾತà³à²°: $3, MIME ಪà³à²°à²•à²¾à²°: $4)',
+'file-info-size' => '$1 × $2 ಪಿಕà³à²¸à³†à²²à³, ಫೈಲà³â€™à²¦ ಗಾತà³à²°: $3, MIME ಪà³à²°à²•à²¾à²°: $4',
'file-nohires' => '<small>ಇಂದೆರà³à²¦à³ ಜಾಸà³à²¤à²¿ ವಿವರವಾಯಿನ ನೋಟ ಇಜà³à²œà²¿.</small>',
-'svg-long-desc' => '(ಎಸà³.ವಿ.ಜಿ ಫೈಲà³, ಸà³à²®à²¾à²°à²¾à²¦à³ $1 × $2 ಪಿಕà³à²¸à³†à²²à³, ಫೈಲà³â€™à²¦ ಗಾತà³à²°: $3)',
+'svg-long-desc' => 'ಎಸà³.ವಿ.ಜಿ ಫೈಲà³, ಸà³à²®à²¾à²°à²¾à²¦à³ $1 × $2 ಪಿಕà³à²¸à³†à²²à³, ಫೈಲà³â€™à²¦ ಗಾತà³à²°: $3',
'show-big-image' => 'ಪೂರà³à²¤à²¿ ರೆಸೊಲà³à²¯à³‚ಶನà³',
'show-big-image-thumb' => '<small>ಈ ಮà³à²¨à³à²¨à³‹à²Ÿà²¦ ಗಾತà³à²°: $1 × $2 ಪಿಕà³à²¸à³†à²²à³</small>',
diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php
index d236fc9f..c1a71016 100644
--- a/languages/messages/MessagesTe.php
+++ b/languages/messages/MessagesTe.php
@@ -11,12 +11,15 @@
* @author Kiranmayee
* @author Meno25
* @author Mpradeep
+ * @author Praveen Illa
* @author Ravichandra
* @author Sunil Mohan
+ * @author The Evil IP address
* @author Urhixidur
* @author Veeven
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
* @author לערי ריינה×רט
+ * @author à°°à°¹à±à°®à°¾à°¨à±à°¦à±à°¦à±€à°¨à±
* @author రాకేశà±à°µà°°
* @author వైజాసతà±à°¯
*/
@@ -102,7 +105,7 @@ $specialPageAliases = array(
'Booksources' => array( 'à°ªà±à°¸à±à°¤à°•à°®à±‚లాలà±' ),
'Categories' => array( 'వరà±à°—ాలà±' ),
'Export' => array( 'à°Žà°—à±à°®à°¤à°¿' ),
- 'Version' => array( 'à°ªà±à°°à°¤à°¿' ),
+ 'Version' => array( 'కూరà±à°ªà±' ),
'Allmessages' => array( 'à°…à°¨à±à°¨à°¿à°¸à°‚దేశాలà±' ),
'Log' => array( 'à°šà°¿à°Ÿà±à°Ÿà°¾', 'à°šà°¿à°Ÿà±à°Ÿà°¾à°²à±' ),
'Blockip' => array( 'à°…à°¡à±à°¡à°—à°¿à°‚à°šà±', 'à°à°ªà°¿à°¨à°¿à°…à°¡à±à°¡à°—à°¿à°‚à°šà±', 'వాడà±à°•à°°à°¿à°¨à°¿à°…à°¡à±à°¡à°—à°¿à°‚à°šà±' ),
@@ -114,7 +117,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'యాదà±à°šà±à°šà°¿à°•à°¦à°¾à°°à°¿à°®à°¾à°°à±à°ªà±' ),
'Mypage' => array( 'నాపేజీ' ),
'Mytalk' => array( 'నాచరà±à°š' ),
- 'Mycontributions' => array( 'నా మారà±à°ªà±à°²à±-చేరà±à°ªà±à°²à±' ),
+ 'Mycontributions' => array( 'నా_మారà±à°ªà±à°²à±-చేరà±à°ªà±à°²à±' ),
'Popularpages' => array( 'à°ªà±à°°à°¾à°šà±à°°à±à°¯à°‚పొందినపేజీలà±' ),
'Search' => array( 'à°…à°¨à±à°µà±‡à°·à°£' ),
'Resetpass' => array( 'సంకేతపదమà±à°®à°¾à°°à±à°šà±' ),
@@ -125,6 +128,8 @@ $specialPageAliases = array(
$magicWords = array(
'redirect' => array( '0', '#దారిమారà±à°ªà±', '#REDIRECT' ),
+ 'notoc' => array( '0', '__విషయసూచికవదà±à°¦à±__', '__NOTOC__' ),
+ 'toc' => array( '0', '__విషయసూచిక__', '__TOC__' ),
'pagename' => array( '1', 'పేజీపేరà±', 'PAGENAME' ),
'img_right' => array( '1', 'à°•à±à°¡à°¿', 'right' ),
'img_left' => array( '1', 'à°Žà°¡à°®', 'left' ),
@@ -149,8 +154,7 @@ $messages = array(
'tog-editsection' => '[మారà±à°šà±] లింకౠదà±à°µà°¾à°°à°¾ విభాగం మారà±à°ªà± కావాలి',
'tog-editsectiononrightclick' => 'విభాగం పేరౠమీద à°•à±à°¡à°¿ à°•à±à°²à°¿à°•à±à°•à±à°¤à±‹ విభాగం మారà±à°ªà± కావాలి (జావాసà±à°•à±à°°à°¿à°ªà±à°Ÿà±)',
'tog-showtoc' => 'విషయసూచిక చూపించౠ(3 కంటే à°Žà°•à±à°•à±à°µ శీరà±à°·à°¿à°•à°²à±à°¨à±à°¨ పేజీలకà±)',
-'tog-rememberpassword' => 'à°ˆ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ నేనౠఅనà±à°¨à°¿ సెషనà±à°²à°²à±‹à°¨à±‚ నా లాగినà±à°¨à± à°—à±à°°à±à°¤à±à°ªà±†à°Ÿà±à°Ÿà±à°•à±‹',
-'tog-editwidth' => 'మారà±à°ªà± పెటà±à°Ÿà±†à°¨à°¿ తెర వెడలà±à°ªà°‚తా విసà±à°¤à°°à°¿à°‚à°šà±',
+'tog-rememberpassword' => 'à°ˆ విహారిణిలో నా à°ªà±à°°à°µà±‡à°¶à°¾à°¨à±à°¨à°¿ à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹ (à°—à°°à°¿à°·à±à° à°‚à°—à°¾ $1 {{PLURAL:$1|రోజà±|రోజà±à°²}}à°•à°¿)',
'tog-watchcreations' => 'నేనౠసృషà±à°Ÿà°¿à°‚à°šà°¿à°¨ పేజీలనౠనా వీకà±à°·à°£ జాబితాకౠకలà±à°ªà±',
'tog-watchdefault' => 'నేనౠదిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à± చేసిన పేజీలనౠనా వీకà±à°·à°£ జాబితాకౠకలà±à°ªà±',
'tog-watchmoves' => 'నేనౠతరలించిన పేజీలనౠనా వీకà±à°·à°£ జాబితాకౠకలà±à°ªà±',
@@ -286,7 +290,7 @@ $messages = array(
# Cologne Blue skin
'qbfind' => 'వెతà±à°•à±',
'qbbrowse' => 'విహరించà±',
-'qbedit' => 'మారà±à°šà±',
+'qbedit' => 'సవరించà±',
'qbpageoptions' => 'ఈ పేజీ',
'qbpageinfo' => 'సందరà±à°­à°‚',
'qbmyoptions' => 'నా పేజీలà±',
@@ -295,31 +299,21 @@ $messages = array(
'faqpage' => 'Project:తరచూ అడిగే à°ªà±à°°à°¶à±à°¨à°²à±',
# Vector skin
-'vector-action-addsection' => 'విషయానà±à°¨à°¿ చేరà±à°šà±',
-'vector-action-delete' => 'తొలగించà±',
-'vector-action-move' => 'తరలించà±',
-'vector-action-protect' => 'సంరకà±à°·à°¿à°‚à°šà±',
-'vector-action-undelete' => 'తిరిగి చేరà±à°šà±',
-'vector-action-unprotect' => 'సంరకà±à°·à°¿à°‚à°š వదà±à°¦à±',
-'vector-namespace-category' => 'వరà±à°—à°‚',
-'vector-namespace-help' => 'సహాయపౠపేజీ',
-'vector-namespace-image' => 'ఫైలà±',
-'vector-namespace-main' => 'పేజీ',
-'vector-namespace-media' => 'మాధà±à°¯à°® పేజీ',
-'vector-namespace-mediawiki' => 'సందేశం',
-'vector-namespace-project' => 'à°ªà±à°°à°¾à°œà±†à°•à±à°Ÿà± పేజీ',
-'vector-namespace-special' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీ',
-'vector-namespace-talk' => 'à°šà°°à±à°š',
-'vector-namespace-template' => 'మూస',
-'vector-namespace-user' => 'వాడà±à°•à°°à°¿ పేజీ',
-'vector-view-create' => 'సృషà±à°Ÿà°¿à°‚à°šà±',
-'vector-view-edit' => 'మారà±à°šà±',
-'vector-view-history' => 'à°šà°°à°¿à°¤à±à°°à°¨à°¿ చూడండి',
-'vector-view-view' => 'à°šà°¦à±à°µà±',
-'vector-view-viewsource' => 'మూలానà±à°¨à°¿ చూడండి',
-'actions' => 'à°šà°°à±à°¯à°²à±',
-'namespaces' => 'నేంసà±à°ªà±‡à°¸à±à°²à±',
-'variants' => 'వైవిధà±à°¯à°¾à°²à±',
+'vector-action-addsection' => 'విషయానà±à°¨à°¿ చేరà±à°šà±',
+'vector-action-delete' => 'తొలగించà±',
+'vector-action-move' => 'తరలించà±',
+'vector-action-protect' => 'సంరకà±à°·à°¿à°‚à°šà±',
+'vector-action-undelete' => 'తిరిగి చేరà±à°šà±',
+'vector-action-unprotect' => 'సంరకà±à°·à°¿à°‚à°š వదà±à°¦à±',
+'vector-simplesearch-preference' => 'మెరà±à°—ైన à°…à°¨à±à°µà±‡à°·à°£ సలహాలని చేతనంచేయి (వెకà±à°Ÿà°°à± అలంకారానికి మాతà±à°°à°®à±‡)',
+'vector-view-create' => 'సృషà±à°Ÿà°¿à°‚à°šà±',
+'vector-view-edit' => 'సవరించà±',
+'vector-view-history' => 'à°šà°°à°¿à°¤à±à°°à°¨à°¿ చూడండి',
+'vector-view-view' => 'à°šà°¦à±à°µà±',
+'vector-view-viewsource' => 'మూలానà±à°¨à°¿ చూడండి',
+'actions' => 'à°šà°°à±à°¯à°²à±',
+'namespaces' => 'నేంసà±à°ªà±‡à°¸à±à°²à±',
+'variants' => 'వైవిధà±à°¯à°¾à°²à±',
'errorpagetitle' => 'పొరపాటà±',
'returnto' => 'తిరిగి $1కి.',
@@ -329,27 +323,27 @@ $messages = array(
'searchbutton' => 'వెతà±à°•à±',
'go' => 'వెళà±à°²à±',
'searcharticle' => 'వెళà±à°²à±',
-'history' => 'à°ªà±à°Ÿ à°šà°°à°¿à°¤à±à°°',
+'history' => 'పేజీ à°šà°°à°¿à°¤à±à°°',
'history_short' => 'à°šà°°à°¿à°¤à±à°°',
'updatedmarker' => 'నేనౠకిందటిసారి వచà±à°šà°¿à°¨ తరà±à°µà°¾à°¤ జరిగిన మారà±à°ªà±à°²à±',
'info_short' => 'సమాచారం',
'printableversion' => 'à°®à±à°¦à±à°°à°¿à°‚à°šà±à°•à±‹à°¦à°—à±à°— కూరà±à°ªà±',
'permalink' => 'శాశà±à°µà°¤ లింకà±',
'print' => 'à°®à±à°¦à±à°°à°¿à°‚à°šà±',
-'edit' => 'మారà±à°šà±',
+'edit' => 'సవరించà±',
'create' => 'సృషà±à°Ÿà°¿à°‚à°šà±',
-'editthispage' => 'à°ˆ à°ªà±à°Ÿà°¨à°¿ మారà±à°šà°‚à°¡à°¿',
+'editthispage' => 'ఈ పేజీని సవరించండి',
'create-this-page' => 'à°ˆ పేజీని సృషà±à°Ÿà°¿à°‚à°šà°‚à°¡à°¿',
-'delete' => 'à°¤à±à°¡à°¿à°šà°¿à°µà±‡à°¯à°¿',
-'deletethispage' => 'à°ˆ à°ªà±à°Ÿà°¨à± తొలగించà±',
+'delete' => 'తీసివేయి',
+'deletethispage' => 'ఈ పేజీని తొలగించండి',
'undelete_short' => '{{PLURAL:$1|à°’à°•à±à°• రచననà±|$1 రచనలనà±}} à°ªà±à°¨à°ƒà°¸à±à°¥à°¾à°ªà°¿à°‚à°šà±',
'protect' => 'సంరకà±à°·à°¿à°‚à°šà±',
'protect_change' => 'మారà±à°šà±',
'protectthispage' => 'à°ˆ పేజీని సంరకà±à°·à°¿à°‚à°šà±',
'unprotect' => 'సంరకà±à°·à°¿à°‚à°š వదà±à°¦à±',
'unprotectthispage' => 'à°ˆ పేజీని సంరకà±à°·à°¿à°‚చవదà±à°¦à±',
-'newpage' => 'కొతà±à°¤ à°ªà±à°Ÿ',
-'talkpage' => 'à°ˆ à°ªà±à°Ÿà°¨à°¿ à°šà°°à±à°šà°¿à°‚à°šà°‚à°¡à°¿',
+'newpage' => 'కొతà±à°¤ పేజీ',
+'talkpage' => 'à°ˆ పేజీని à°šà°°à±à°šà°¿à°‚à°šà°‚à°¡à°¿',
'talkpagelinktext' => 'à°šà°°à±à°š',
'specialpage' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీ',
'personaltools' => 'à°µà±à°¯à°•à±à°¤à°¿à°—à°¤ పనిమà±à°Ÿà±à°²à±',
@@ -380,6 +374,9 @@ $messages = array(
à°ˆ పేజీని వీకà±à°·à°¿à°‚చడానికి కొదà±à°¦à°¿à°¸à±‡à°ªà± నిరీకà±à°·à°¿à°‚à°šà°‚à°¡à°¿.
$1',
+'pool-timeout' => 'తాళం కొరకౠవేచివà±à°‚డడానికి కాలపరిమితి అయిపోయింది',
+'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}} à°—à±à°°à°¿à°‚à°šà°¿',
@@ -394,7 +391,7 @@ $1',
'edithelppage' => 'Help:దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à± ఎలా చెయà±à°¯à°¾à°²à°¿',
'helppage' => 'Help:సూచిక',
'mainpage' => 'మొదటి పేజీ',
-'mainpage-description' => 'మొదటి à°ªà±à°Ÿ',
+'mainpage-description' => 'మొదటి పేజీ',
'policy-url' => 'Project:విధానం',
'portal' => 'సమà±à°¦à°¾à°¯ పందిరి',
'portal-url' => 'Project:సమà±à°¦à°¾à°¯ పందిరి',
@@ -415,9 +412,9 @@ $1',
'newmessagesdifflink' => 'à°•à±à°°à°¿à°¤à°‚ సంచికతో à°—à°² తేడాలà±',
'youhavenewmessagesmulti' => '$1లో మీకో సందేశం ఉంది',
'editsection' => 'మారà±à°šà±',
-'editold' => 'మారà±à°šà±',
+'editold' => 'సవరించà±',
'viewsourceold' => 'మూలానà±à°¨à°¿ చూడండి',
-'editlink' => 'మారà±à°šà±',
+'editlink' => 'సవరించà±',
'viewsourcelink' => 'మూలానà±à°¨à°¿ చూడండి',
'editsectionhint' => 'విభాగానà±à°¨à°¿ మారà±à°šà±: $1',
'toc' => 'విషయ సూచిక',
@@ -436,10 +433,10 @@ $1',
'red-link-title' => '$1 (à°ªà±à°Ÿ లేదà±)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'à°ªà±à°Ÿ',
-'nstab-user' => 'వాడà±à°•à°°à°¿ à°ªà±à°Ÿ',
+'nstab-main' => 'పేజీ',
+'nstab-user' => 'వాడà±à°•à°°à°¿ పేజీ',
'nstab-media' => 'మీడియా పేజీ',
-'nstab-special' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• à°ªà±à°Ÿ',
+'nstab-special' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీ',
'nstab-project' => 'à°ªà±à°°à°¾à°œà±†à°•à±à°Ÿà± పేజీ',
'nstab-image' => 'దసà±à°¤à±à°°à°‚',
'nstab-mediawiki' => 'సందేశం',
@@ -547,13 +544,14 @@ $2',
'yourname' => 'వాడà±à°•à°°à°¿à°ªà±‡à°°à±:',
'yourpassword' => 'మీ సంకేతపదం',
'yourpasswordagain' => 'సంకేతపదానà±à°¨à°¿ మళà±à°³à±€ ఇవà±à°µà°‚à°¡à°¿:',
-'remembermypassword' => 'à°ˆ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ ననà±à°¨à± à°—à±à°°à±à°¤à±à°ªà±†à°Ÿà±à°Ÿà±à°•à±‹',
+'remembermypassword' => 'à°ˆ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ నా à°ªà±à°°à°µà±‡à°¶à°¾à°¨à±à°¨à°¿ à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹ (à°—à°°à°¿à°·à±à° à°‚à°—à°¾ $1 {{PLURAL:$1|రోజà±|రోజà±à°²}}à°•à°¿)',
+'securelogin-stick-https' => 'à°ªà±à°°à°µà±‡à°¶à°‚ తరà±à°µà°¾à°¤ కూడా HTTPSà°•à°¿ à°…à°¨à±à°¸à°‚ధానమై ఉండà±',
'yourdomainname' => 'మీ డోమైనà±',
'externaldberror' => 'డేటాబేసౠఅధీకరణలో పొరపాటౠజరిగింది లేదా మీ బయటి ఖాతాని తాజాకరించడానికి మీకౠఅనà±à°®à°¤à°¿ లేదà±.',
'login' => 'à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿',
'nav-login-createaccount' => 'లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿ / ఖాతాని సృషà±à°Ÿà°¿à°‚à°šà±à°•à±‹à°‚à°¡à°¿',
'loginprompt' => '{{SITENAME}}లోకి à°ªà±à°°à°µà±‡à°¶à°¿à°‚చాలంటే మీ విహారిణిలో కూకీలౠచేతనమై ఉండాలి.',
-'userlogin' => 'à°ªà±à°°à°µà±‡à°¶à°‚ / ఖాతా సృషà±à°Ÿà°¿à°‚à°ªà±',
+'userlogin' => 'à°ªà±à°°à°µà±‡à°¶à°‚à°šà± / ఖాతా సృషà±à°Ÿà°¿à°‚à°šà±',
'userloginnocreate' => 'à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿',
'logout' => 'నిషà±à°•à±à°°à°®à°¿à°‚à°šà±',
'userlogout' => 'నిషà±à°•à±à°°à°®à°¿à°‚à°šà±',
@@ -564,6 +562,7 @@ $2',
'gotaccount' => "ఇపà±à°ªà°Ÿà°¿à°•à±‡ మీకౠఖాతా ఉందా? '''$1'''.",
'gotaccountlink' => 'à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿',
'createaccountmail' => 'à°ˆ-మెయిలౠదà±à°µà°¾à°°à°¾',
+'createaccountreason' => 'కారణం:',
'badretype' => 'మీరౠఇచà±à°šà°¿à°¨ రెండౠసంకేతపదాలౠఒకదానితో మరొకటి సరిపోలడం లేదà±.',
'userexists' => 'మీరిచà±à°šà°¿à°¨ వాడà±à°•à°°à°¿à°ªà±‡à°°à± ఇపà±à°ªà°Ÿà°¿à°•à±‡ వాడà±à°•à°²à±‹ ఉంది.
వేరే పేరౠఎంచà±à°•à±‹à°‚à°¡à°¿.',
@@ -589,6 +588,7 @@ $2',
'wrongpasswordempty' => 'ఖాళీ సంకేతపదం ఇచà±à°šà°¾à°°à±. మళà±à°³à±€ à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.',
'passwordtooshort' => 'మీ సంకేతపదం కనీసం {{PLURAL:$1|1 à°…à°•à±à°·à°°à°‚|$1 à°…à°•à±à°·à°°à°¾à°²}} పొడవౠఉండాలి.',
'password-name-match' => 'మీ సంకేతపదం మీ వాడà±à°•à°°à°¿à°ªà±‡à°°à±à°•à°¿ à°­à°¿à°¨à±à°¨à°‚à°—à°¾ ఉండాలి.',
+'password-login-forbidden' => 'à°ˆ వాడà±à°•à°°à°¿à°ªà±‡à°°à± మరియౠసంకేతపదాలనౠఉపయోగించడం నిషిదà±à°§à°‚.',
'mailmypassword' => 'కొతà±à°¤ సంకేతపదానà±à°¨à°¿ à°ˆ-మెయిలà±à°²à±‹ పంపించà±',
'passwordremindertitle' => '{{SITENAME}} కోసం కొతà±à°¤ తాతà±à°•à°¾à°²à°¿à°• సంకేతపదం',
'passwordremindertext' => '{{SITENAME}} ($4) లో కొతà±à°¤ సంకేతపదం పంపించమని ఎవరో (బహà±à°¶ మీరే, à°.పీ. à°šà°¿à°°à±à°¨à°¾à°®à°¾ $1 à°¨à±à°‚à°¡à°¿) అడిగారà±. వాడà±à°•à°°à°¿ "$2" కొరకౠ"$3" అనే తాతà±à°•à°¾à°²à°¿à°• సంకేతపదం సిదà±à°§à°‚చేసి ఉంచాం. మీ ఉదà±à°¦à±‡à°¶à°‚ అదే అయితే, ఇపà±à°ªà±à°¡à± మీరౠసైటà±à°²à±‹à°¨à°¿à°•à°¿ à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿ కొతà±à°¤ సంకేతపదానà±à°¨à°¿ à°Žà°‚à°šà±à°•à±‹à°µà°šà±à°šà±. మీ తాతà±à°•à°¾à°²à°¿à°• సంకేతపదం {{PLURAL:$5|à°’à°• రోజà±|$5 రోజà±à°²}}లో కాలంచెలà±à°²à±à°¤à±à°‚ది.
@@ -625,6 +625,9 @@ $2',
'loginlanguagelabel' => 'భాష: $1',
'suspicious-userlogout' => 'సరిగా పనిచేయని విహారిణి లేదా కాషింగౠపà±à°°à°¾à°•à±à°¸à±€ వలà±à°² పంపబడడం చేత, నిషà±à°•à±à°°à°®à°¿à°‚చాలనే మీ à°…à°­à±à°¯à°°à±à°¥à°¨à°¨à°¿ నిరాకరించారà±.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHP యొకà±à°• mail() à°«à°‚à°•à±à°·à°¨à±â€à°²à±‹ à°à°¦à±‹ తెలియని లోపం దొరà±à°²à°¿à°‚ది',
+
# Password reset dialog
'resetpass' => 'సంకేతపదానà±à°¨à°¿ మారà±à°šà°‚à°¡à°¿',
'resetpass_announce' => 'మీకౠపంపిన తాతà±à°•à°¾à°²à°¿à°• సంకేతంతో à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°¨à±à°¨à°¾à°°à±.
@@ -668,16 +671,18 @@ $2',
'subject' => 'విషయం/శీరà±à°·à°¿à°•:',
'minoredit' => 'ఇది à°’à°• à°šà°¿à°¨à±à°¨ మారà±à°ªà±',
'watchthis' => 'à°ˆ à°ªà±à°Ÿ మీద à°•à°¨à±à°¨à±‡à°¸à°¿ ఉంచà±',
-'savearticle' => 'à°ªà±à°Ÿà°¨à± à°­à°¦à±à°°à°ªà°°à±à°šà±',
-'preview' => 'సరిచూడà±',
-'showpreview' => 'సరిచూడà±',
+'savearticle' => 'పేజీని à°­à°¦à±à°°à°ªà°°à°šà±',
+'preview' => 'à°®à±à°¨à±à°œà±‚à°ªà±',
+'showpreview' => 'à°®à±à°¨à±à°œà±‚à°ªà±',
'showlivepreview' => 'తాజా à°®à±à°¨à±à°œà±‚à°ªà±',
'showdiff' => 'తేడాలనౠచూపించà±',
'anoneditwarning' => "'''హెచà±à°šà°°à°¿à°•:''' మీరౠలోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚చలేదà±.
à°ˆ పేజీ దిదà±à°¦à±à°¬à°¾à°Ÿà± à°šà°°à°¿à°¤à±à°°à°²à±‹ మీ à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ నమోదవà±à°¤à±à°‚ది.",
+'anonpreviewwarning' => "''మీరౠలోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚చలేదà±. à°­à°¦à±à°°à°ªà°°à°¿à°¸à±à°¤à±‡ à°ˆ పేజీ యొకà±à°• దిదà±à°¦à±à°¬à°¾à°Ÿà± à°šà°°à°¿à°¤à±à°°à°²à±‹ మీ à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ నమోదవà±à°¤à±à°‚ది.''",
'missingsummary' => "'''à°—à±à°°à±à°¤à± చేసà±à°¤à±à°¨à±à°¨à°¾à°‚:''' మీరౠదిదà±à°¦à±à°¬à°¾à°Ÿà± సారాంశమేమీ ఇవà±à°µà°²à±‡à°¦à±. పేజీని మళà±à°³à±€ à°­à°¦à±à°°à°ªà°°à°šà°®à°¨à°¿ చెబితే సారాంశమేమీ లేకà±à°‚డానే దిదà±à°¦à±à°¬à°¾à°Ÿà±à°¨à± à°­à°¦à±à°°à°ªà°°à±à°¸à±à°¤à°¾à°‚.",
'missingcommenttext' => 'à°•à°¿à°‚à°¦ à°“ à°µà±à°¯à°¾à°–à±à°¯ రాయండి.',
-'missingcommentheader' => "'''à°—à±à°°à±à°¤à± చేసà±à°¤à±à°¨à±à°¨à°¾à°‚''': à°ˆ à°µà±à°¯à°¾à°–à±à°¯à°•à± మీరౠవిషయం/శీరà±à°·à°¿à°• పెటà±à°Ÿà°²à±‡à°¦à±. పేజీని మళà±à°³à±€ à°­à°¦à±à°°à°ªà°°à°šà°®à°¨à°¿ చెబితే, మీ విభాగానà±à°¨à°¿ శీరà±à°·à°¿à°•à±‡à°®à±€ లేకà±à°‚డానే à°­à°¦à±à°°à°ªà°°à±à°¸à±à°¤à°¾à°‚.",
+'missingcommentheader' => "'''à°—à±à°°à±à°¤à± చేసà±à°¤à±à°¨à±à°¨à°¾à°‚''': à°ˆ à°µà±à°¯à°¾à°–à±à°¯à°•à± మీరౠవిషయం/శీరà±à°·à°¿à°• పెటà±à°Ÿà°²à±‡à°¦à±.
+\"{{int:savearticle}}\"ని మళà±à°³à±€ నొకà±à°•à°¿à°¤à±‡, మీ మారà±à°ªà±à°•à°¿ విషయం/శీరà±à°·à°¿à°• à°à°®à±€ లేకà±à°‚డానే à°­à°¦à±à°°à°ªà°°à±à°¸à±à°¤à°¾à°‚.",
'summary-preview' => 'మీరౠరాసిన సారాంశం:',
'subject-preview' => 'విషయం/శీరà±à°·à°¿à°• à°®à±à°¨à±à°œà±‚à°ªà±:',
'blockedtitle' => 'సభà±à°¯à±à°¨à°¿à°ªà±ˆ నిరోధం అమలయింది',
@@ -748,8 +753,13 @@ $2',
'usercsspreview' => "'''మీరౠవాడà±à°•à°°à°¿ CSSనౠకేవలం సరిచూసà±à°¤à±à°¨à±à°¨à°¾à°°à°¨à°¿ à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿.'''
'''దానà±à°¨à°¿à°‚à°•à°¾ à°­à°¦à±à°°à°ªà°°à°šà°²à±‡à°¦à±!'''",
'userjspreview' => "'''à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿, మీరింకా మీ వాడà±à°•à°°à°¿ జావాసà±à°•à±à°°à°¿à°ªà±à°Ÿà±&zwnj;నౠభదà±à°°à°ªà°°à°šà°²à±‡à°¦à±, కేవలం పరీకà±à°·à°¿à°¸à±à°¤à±à°¨à±à°¨à°¾à°°à±/సరిచూసà±à°¤à±à°¨à±à°¨à°¾à°°à±!'''",
-'userinvalidcssjstitle' => "'''హెచà±à°šà°°à°¿à°•:''' \"\$1\" అనే తొడà±à°—ౠలేదà±. .css మరియౠ.js పేజీల పేరà±à°²à± ఇంగà±à°²à±€à°·à± లోవరౠకేసà±à°²à±‹à°¨à±‡ ఉండాలనà±à°¨ సంగతి à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿. ఉదాహరణకౠ{{ns:user}}:Foo/monobook.css. అంతేగానీ, {{ns:user}}:Foo/Monobook.css -ఇలా కాదà±.",
-'updated' => '(తాజా à°…à°¯à±à°¯à°¿à°‚ది)',
+'sitecsspreview' => "'''మీరౠచూసà±à°¤à±à°¨à±à°¨à°¦à°¿ à°ˆ CSS à°®à±à°¨à±à°œà±‚à°ªà±à°¨à± మాతà±à°°à°®à±‡à°¨à°¨à°¿ à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿.'''
+'''దీనà±à°¨à°¿à°‚à°•à°¾ à°­à°¦à±à°°à°ªà°°à°šà°²à±‡à°¦à±!'''",
+'sitejspreview' => "'''మీరౠచూసà±à°¤à±à°¨à±à°¨à°¦à°¿ à°ˆ JavaScript à°®à±à°¨à±à°œà±‚à°ªà±à°¨à± మాతà±à°°à°®à±‡à°¨à°¨à°¿ à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿.'''
+'''దీనà±à°¨à°¿à°‚à°•à°¾ à°­à°¦à±à°°à°ªà°°à°šà°²à±‡à°¦à±!'''",
+'userinvalidcssjstitle' => "'''హెచà±à°šà°°à°¿à°•:''' \"\$1\" అనే అలంకారం లేదà±.
+అభిమత .css మరియౠ.js à°ªà±à°Ÿà°² శీరà±à°·à°¿à°•à°²à± ఇంగà±à°²à±€à°·à± à°šà°¿à°¨à±à°¨à°¬à°¡à°¿ à°…à°•à±à°·à°°à°¾à°² లోనే ఉండాలని à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿, ఉదాహరణకౠఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదà±.",
+'updated' => '(నవీకరించబడింది)',
'note' => "'''గమనిక:'''",
'previewnote' => "'''ఇది à°®à±à°¨à±à°œà±‚పౠమాతà±à°°à°®à±‡;
మారà±à°ªà±à°²à°¨à°¿ ఇంకా à°­à°¦à±à°°à°ªà°°à°šà°²à±‡à°¦à±!'''",
@@ -781,7 +791,6 @@ $2',
'copyrightwarning2' => "{{SITENAME}}లో à°ªà±à°°à°šà±à°°à°¿à°‚చే రచనలనà±à°¨à°¿à°Ÿà°¿à°¨à±€ ఇతర రచయితలౠసరిదిదà±à°¦à°¡à°‚, మారà±à°šà°¡à°‚, తొలగించడం చేసే అవకాశం ఉంది. మీ రచనలనౠఅలా నిరà±à°¦à°¾à°•à±à°·à°¿à°£à±à°¯à°‚à°—à°¾ దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à± చెయà±à°¯à°¡à°‚ మీకిషà±à°Ÿà°‚ లేకపోతే, వాటిని ఇకà±à°•à°¡ à°ªà±à°°à°šà±à°°à°¿à°‚à°šà°•à°‚à°¡à°¿. <br />
à°ˆ రచననౠమీరే చేసారని, లేదా à°à°¦à±ˆà°¨à°¾ సారà±à°µà°œà°¨à°¿à°• వనరౠనà±à°‚à°¡à°¿ కాపీ చేసి తెచà±à°šà°¾à°°à°¨à°¿, లేదా అలాంటి ఉచిత, à°¸à±à°µà±‡à°šà±à°›à°¾ వనరౠనà±à°‚à°¡à°¿ తెచà±à°šà°¾à°°à°¨à°¿ మాకౠవాగà±à°¦à°¾à°¨à°‚ చేసà±à°¤à±à°¨à±à°¨à°¾à°°à±. (వివరాలకౠ$1 చూడండి).
'''తగౠఅనà±à°®à°¤à±à°²à± లేకà±à°‚à°¡à°¾ కాపీ హకà±à°•à±à°²à± à°—à°² రచనలనౠసమరà±à°ªà°¿à°‚à°šà°•à°‚à°¡à°¿!'''",
-'longpagewarning' => "'''హెచà±à°šà°°à°¿à°•: à°ˆ పేజీ సైజౠ$1 కిలోబైటà±à°²à± ఉంది; 32 kb కంటే పెదà±à°¦ పేజీల తోటి కొనà±à°¨à°¿ à°¬à±à°°à±Œà°œà°°à±à°²à± ఇబà±à°¬à°‚ది పడతాయి. పేజీని à°šà°¿à°¨à±à°¨ పేజీలà±à°—à°¾ విడగొటà±à°Ÿà°¡à°¾à°¨à°¿à°•à°¿ అవకాశం ఉందేమో చూడండి. '''",
'longpageerror' => "'''లోపం: మీరౠసమరà±à°ªà°¿à°‚à°šà°¿à°¨ టెకà±à°¸à±à°Ÿà±, à°—à°°à°¿à°·à±à°  పరిమితి అయిన $2 కిలోబైటà±à°²à°¨à± మించి $1 కిలోబైటà±à°² పొడవà±à°‚ది. దీనà±à°¨à°¿ à°­à°¦à±à°°à°ªà°°à°šà°²à±‡à°®à±.'''",
'readonlywarning' => "'''హెచà±à°šà°°à°¿à°•: నిరà±à°µà°¹à°£ కొరకౠడేటాబేసà±à°•à°¿ తాళం వేసారà±, కాబటà±à°Ÿà°¿ మీ మారà±à°ªà±à°šà±‡à°°à±à°ªà±à°²à°¨à± ఇపà±à°ªà±à°¡à± à°­à°¦à±à°°à°ªà°°à°šà°²à±‡à°°à±. మీ మారà±à°ªà±à°²à°¨à± à°’à°• ఫాఠà±à°¯ ఫైలà±à°²à±‹à°•à°¿ కాపీ చేసి à°­à°¦à±à°°à°ªà°°à°šà±à°•à±Šà°¨à°¿, తరà±à°µà°¾à°¤ సమరà±à°ªà°¿à°‚à°šà°‚à°¡à°¿.'''
@@ -957,6 +966,8 @@ $1",
'logdelete-failure' => "'''à°šà°¿à°Ÿà±à°Ÿà°¾ కనబడే పదà±à°§à°¤à°¿à°¨à°¿ అమరà±à°šà°²à±‡à°•à°ªà±‹à°¯à°¾à°‚:'''
$1",
'revdel-restore' => 'దృశà±à°¯à°¤à°¨à°¿ మారà±à°šà±',
+'revdel-restore-deleted' => 'తొలగించిన కూరà±à°ªà±à°²à±',
+'revdel-restore-visible' => 'కనిపిసà±à°¤à±à°¨à±à°¨ కూరà±à°ªà±à°²à±',
'pagehist' => 'పేజీ à°šà°°à°¿à°¤à±à°°',
'deletedhist' => 'తొలగించిన à°šà°°à°¿à°¤à±à°°',
'revdelete-content' => 'సమాచారానà±à°¨à°¿',
@@ -1024,11 +1035,13 @@ $1",
# Diffs
'history-title' => '"$1" కూరà±à°ªà±à°² చరితం',
'difference' => '(సంచికల మధà±à°¯ తేడా)',
+'difference-multipage' => '(పేజీల మధà±à°¯ తేడా)',
'lineno' => 'పంకà±à°¤à°¿ $1:',
'compareselectedversions' => 'à°Žà°‚à°šà±à°•à±à°¨à±à°¨ సంచికలనౠపోలà±à°šà°¿à°šà±‚à°¡à±',
'showhideselectedversions' => 'à°Žà°‚à°šà±à°•à±à°¨à±à°¨ కూరà±à°ªà±à°²à°¨à± చూపించà±/దాచà±',
'editundo' => 'మారà±à°ªà±à°¨à°¿ à°°à°¦à±à°¦à±à°šà±†à°¯à±à°¯à°¿',
-'diff-multi' => '(మధà±à°¯à°²à±‹ ఉనà±à°¨ {{PLURAL:$1|à°’à°• కూరà±à°ªà±à°¨à±|$1 కూరà±à°ªà±à°²à°¨à±}} చూపించటం లేదà±.)',
+'diff-multi' => '({{PLURAL:$2|à°’à°• వాడà±à°•à°°à°¿|$2 వాడà±à°•à°°à±à°²}} యొకà±à°• {{PLURAL:$1|à°’à°• మధà±à°¯à°‚తర కూరà±à°ªà±à°¨à±|$1 మధà±à°¯à°‚తర కూరà±à°ªà±à°²à°¨à±}} చూపించటà±à°²à±‡à°¦à±)',
+'diff-multi-manyusers' => '$2 మంది పైన ({{PLURAL:$2|à°’à°• వాడà±à°•à°°à°¿|వాడà±à°•à°°à±à°²}} యొకà±à°• {{PLURAL:$1|à°’à°• మధà±à°¯à°‚తర కూరà±à°ªà±à°¨à±|$1 మధà±à°¯à°‚తర కూరà±à°ªà±à°²à°¨à±}} చూపించటà±à°²à±‡à°¦à±)',
# Search results
'searchresults' => 'à°…à°¨à±à°µà±‡à°·à°£ ఫలితాలà±',
@@ -1063,6 +1076,7 @@ $1",
'searchprofile-everything-tooltip' => 'à°…à°¨à±à°¨à°¿ చోటà±à°²à°¾ (à°šà°°à±à°šà°¾ పేజీలతో సహా) వెతకండి',
'searchprofile-advanced-tooltip' => 'à°•à°¸à±à°Ÿà°‚ నేంసà±à°ªà±‡à°¸à±à°²à°²à±‹ వెదà±à°•à±',
'search-result-size' => '$1 ({{PLURAL:$2|1 పదం|$2 పదాలà±}})',
+'search-result-category-size' => '{{PLURAL:$1|1 సభà±à°¯à±à°¡à±|$1 సభà±à°¯à±à°²à±}} ({{PLURAL:$2|1 ఉవవరà±à°—à°‚|$2 ఉపవరà±à°—ాలà±}}, {{PLURAL:$3|1 దసà±à°¤à±à°°à°‚|$3 దసà±à°¤à±à°°à°¾à°²à±}})',
'search-result-score' => 'సంబంధం: $1%',
'search-redirect' => '(దారిమారà±à°ªà± $1)',
'search-section' => '(విభాగం $1)',
@@ -1137,6 +1151,7 @@ $1",
'contextlines' => 'హిటà±à°Ÿà±à°•à± లైనà±à°²à±:',
'contextchars' => 'లైనà±à°•à± సందరà±à°­à°¾à°²à±:',
'stub-threshold' => '<a href="#" class="stub">మొలక లింకà±</a> ఫారà±à°®à°¾à°Ÿà°¿à°‚గౠకొరకౠహదà±à°¦à± (బైటà±à°²à±):',
+'stub-threshold-disabled' => 'అచేతనం',
'recentchangesdays' => 'ఇటీవలి మారà±à°ªà±à°²à± లో చూపించవలసిన రోజà±à°²à±:',
'recentchangesdays-max' => '($1 {{PLURAL:$1|రోజà±|రోజà±à°²à±}} à°—à°°à°¿à°·à±à° à°‚)',
'recentchangescount' => 'à°…à°ªà±à°°à°®à±‡à°¯à°‚à°—à°¾ చూపించాలà±à°¸à°¿à°¨ దిదà±à°¦à±à°¬à°¾à°Ÿà±à°² సంఖà±à°¯:',
@@ -1169,6 +1184,7 @@ $1",
'prefs-files' => 'ఫైళà±à°³à±',
'prefs-custom-css' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• CSS',
'prefs-custom-js' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• JS',
+'prefs-common-css-js' => 'à°…à°¨à±à°¨à°¿ అలంకారాలకై పంచà±à°•à±‹à°¬à°¡à°¿à°¨ CSS/JS:',
'prefs-reset-intro' => 'à°ˆ పేజీలో, మీ à°…à°­à°¿à°°à±à°šà±à°²à°¨à± సైటౠడిఫాలà±à°Ÿà± విలà±à°µà°²à°•à± మారà±à°šà±à°•à±‹à°µà°šà±à°šà±. మళà±à°³à±€ వెనకà±à°•à°¿ తీసà±à°•à±à°ªà±‹à°²à±‡à°°à±.',
'prefs-emailconfirm-label' => 'à°ˆ-మెయిలౠనిరà±à°§à°¾à°°à°£:',
'prefs-textboxsize' => 'ఎడిటింగౠవిండో పరిమాణం',
@@ -1204,9 +1220,15 @@ $1",
'prefs-advancedrendering' => 'ఉనà±à°¨à°¤ ఎంపికలà±',
'prefs-advancedsearchoptions' => 'ఉనà±à°¨à°¤ ఎంపికలà±',
'prefs-advancedwatchlist' => 'ఉనà±à°¨à°¤ ఎంపికలà±',
-'prefs-display' => 'à°ªà±à°°à°¦à°°à±à°¶à°¨ ఎంపికలà±',
+'prefs-displayrc' => 'à°ªà±à°°à°¦à°°à±à°¶à°¨ ఎంపికలà±',
+'prefs-displaysearchoptions' => 'à°ªà±à°°à°¦à°°à±à°¶à°¨ ఎంపికలà±',
+'prefs-displaywatchlist' => 'à°ªà±à°°à°¦à°°à±à°¶à°¨ ఎంపికలà±',
'prefs-diffs' => 'తేడాలà±',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ సరిగానే ఉనà±à°¨à°Ÿà±à°Ÿà±à°‚ది',
+'email-address-validity-invalid' => 'దయచేసి సరైన ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ ఇవà±à°µà°‚à°¡à°¿',
+
# User rights
'userrights' => 'వాడà±à°•à°°à°¿ హకà±à°•à±à°² నిరà±à°µà°¹à°£',
'userrights-lookup-user' => 'వాడà±à°•à°°à°¿ సమూహాలనౠసంభాళించండి',
@@ -1290,6 +1312,7 @@ $1",
'right-hideuser' => 'à°ªà±à°°à°œà°²à°•à± కనబడకà±à°‚à°¡à°¾ చేసి, సభà±à°¯à°¨à°¾à°®à°¾à°¨à±à°¨à°¿ నిరోధించà±',
'right-ipblock-exempt' => 'à°à°ªà±€ నిరోధాలà±, ఆటో నిరోధాలà±, à°¶à±à°°à±‡à°£à°¿ నిరోధాలనౠతపà±à°ªà°¿à°‚à°šà±',
'right-proxyunbannable' => 'à°ªà±à°°à°¾à°•à±à°¸à±€à°² ఆటోమాటికౠనిరోధానà±à°¨à°¿ తపà±à°ªà°¿à°‚à°šà±',
+'right-unblockself' => 'వారినే అనిరోధించà±à°•à±‹à°µà°¡à°‚',
'right-protect' => 'సంరకà±à°·à°£ à°¸à±à°¥à°¾à°¯à°¿à°²à°¨à± మారà±à°šà±, సంరకà±à°·à°¿à°¤ పేజీలలో దిదà±à°¦à±à°¬à°¾à°Ÿà± చెయà±à°¯à°¿',
'right-editprotected' => 'సంరకà±à°·à°¿à°¤ పేజీలలో దిదà±à°¦à±à°¬à°Ÿà± చెయà±à°¯à°¿ (కాసà±à°•à±‡à°¡à°¿à°‚గౠసంరకà±à°·à°£ లేనివి)',
'right-editinterface' => 'యూజరౠఇంటరà±à°«à±‡à°¸à±à°²à±‹ దిదà±à°¦à±à°¬à°¾à°Ÿà± చెయà±à°¯à°¿',
@@ -1312,7 +1335,6 @@ $1",
'right-siteadmin' => 'డేటాబేసà±à°¨à± లాకà±, à°…à°¨à±â€Œà°²à°¾à°•à± చెయà±à°¯à°¿',
'right-reset-passwords' => 'మిగతా వాడà±à°•à°°à±à°² సందేశమà±à°¨à± మారà±à°šà±à°®à±',
'right-override-export-depth' => '5 లింకà±à°² లోతౠవరకౠఉనà±à°¨ పేజీలతో సహా, పేజీలనౠఎగà±à°®à°¤à°¿ చెయà±à°¯à°¿',
-'right-versiondetail' => 'మృదూపకరణ సంచిక యొకà±à°• విసà±à°¤à°°à°¿à°¤ సమాచారానà±à°¨à°¿ చూడడం',
'right-sendemail' => 'ఇతర వాడà±à°•à°°à±à°²à°•à± à°ˆ-మెయిలౠపంపించగలగడం',
# User rights log
@@ -1322,8 +1344,8 @@ $1",
'rightsnone' => '(à°à°®à±€à°²à±‡à°µà±)',
# Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'ఈ పేజీని చూసే',
-'action-edit' => 'à°ˆ à°ªà±à°Ÿà°¨à°¿ మారà±à°šà±‡',
+'action-read' => 'ఈ పేజీని చదవండి',
+'action-edit' => 'ఈ పేజీని సవరించండి',
'action-createpage' => 'పేజీలనౠసృషà±à°Ÿà°¿à°‚చే',
'action-createtalk' => 'à°šà°°à±à°šà°¾à°ªà±‡à°œà±€à°²à°¨à± సృషà±à°Ÿà°¿à°‚చే',
'action-createaccount' => 'à°ˆ వాడà±à°•à°°à°¿ ఖాతాని సృషà±à°Ÿà°¿à°‚చే',
@@ -1363,14 +1385,9 @@ $1",
'recentchanges-legend' => 'ఇటీవలి మారà±à°ªà±à°² ఎంపికలà±',
'recentchangestext' => 'వికీలో ఇటీవల జరిగిన మారà±à°ªà±à°²à°¨à± à°ˆ à°ªà±à°Ÿà°²à±‹ గమనించవచà±à°šà±.',
'recentchanges-feed-description' => 'à°ˆ ఫీడౠదà±à°µà°¾à°°à°¾ వికీలో జరà±à°—à±à°¤à±à°¨à±à°¨ మారà±à°ªà±à°² à°—à±à°°à°¿à°‚à°šà°¿ à°Žà°ªà±à°ªà°Ÿà°¿à°•à°ªà±à°ªà±à°¡à± సమాచారానà±à°¨à°¿ పొందండి.',
-'recentchanges-label-legend' => 'సూచిక: $1.',
-'recentchanges-legend-newpage' => '$1 - కొతà±à°¤ పేజీ',
'recentchanges-label-newpage' => 'à°ˆ మారà±à°ªà± కొతà±à°¤ పేజీని సృషà±à°Ÿà°¿à°‚చింది',
-'recentchanges-legend-minor' => '$1 - à°šà°¿à°¨à±à°¨ మారà±à°ªà±',
'recentchanges-label-minor' => 'ఇది à°’à°• à°šà°¿à°¨à±à°¨ మారà±à°ªà±',
-'recentchanges-legend-bot' => '$1 - బాటౠచేసిన మారà±à°ªà±',
'recentchanges-label-bot' => 'à°ˆ మారà±à°ªà±à°¨à± à°’à°• బాటౠచేసింది',
-'recentchanges-legend-unpatrolled' => '$1 - నిఘాలో లేని మారà±à°ªà±',
'recentchanges-label-unpatrolled' => 'à°ˆ దిదà±à°¦à±à°¬à°¾à°Ÿà± మీద నిఘా లేదà±',
'rcnote' => "$4 నాడౠ$5 సమయానికి, à°—à°¤ {{PLURAL:$2|à°’à°•à±à°• రోజà±à°²à±‹|'''$2''' రోజà±à°²à°²à±‹}} చేసిన చివరి {{PLURAL:$1|à°’à°•à±à°• మారà±à°ªà± à°•à°¿à°‚à°¦ ఉంది|'''$1''' మారà±à°ªà±à°²à± à°•à°¿à°‚à°¦ ఉనà±à°¨à°¾à°¯à°¿}}.",
'rcnotefrom' => '<b>$2</b> à°¨à±à°‚à°¡à°¿ జరిగిన మారà±à°ªà±à°²à± (<b>$1</b> వరకౠచూపబడà±à°¡à°¾à°¯à°¿).',
@@ -1403,7 +1420,7 @@ $1",
'recentchangeslinked-title' => '$1 కౠసంబంధించిన మారà±à°ªà±à°²à±',
'recentchangeslinked-noresult' => 'మీరిచà±à°šà°¿à°¨ కాలంలో ఇకà±à°•à°¡à°¿à°•à°¿ లింకౠఉనà±à°¨ పేజీలలో à°Žà°Ÿà±à°µà°‚టౠమారà±à°ªà±à°²à±‚ జరగలేదà±.',
'recentchangeslinked-summary' => "దీనికి లింకై ఉనà±à°¨ పేజీలà±à°²à±‹ జరిగిన చివరి మారà±à°ªà±à°²à± ఇకà±à°•à°¡ చూడవచà±à°šà±. మీ వీకà±à°·à°£ జాబితాలో ఉనà±à°¨ పేజీలౠ'''బొదà±à°¦à±'''à°—à°¾ ఉంటాయి.",
-'recentchangeslinked-page' => 'à°ªà±à°Ÿ పేరà±:',
+'recentchangeslinked-page' => 'పేజీ పేరà±:',
'recentchangeslinked-to' => 'ఇచà±à°šà°¿à°¨ పేజీకి లింకయివà±à°¨à±à°¨ పేజీలలో జరిగిన మారà±à°ªà±à°²à°¨à± చూపించà±',
# Upload
@@ -1416,6 +1433,9 @@ $1",
'upload_directory_missing' => 'à°Žà°—à±à°®à°¤à°¿ డైరెకà±à°Ÿà°°à±€ ($1) తపà±à°ªà°¿à°‚ది మరియౠవెబౠసరà±à°µà°°à± దానà±à°¨à°¿ సృషà±à°Ÿà°¿à°‚చలేకà±à°¨à±à°¨à°¦à°¿.',
'upload_directory_read_only' => 'à°…à°ªà±â€Œà°²à±‹à°¡à± డైరెకà±à°Ÿà°°à±€ ($1), వెబà±â€Œà°¸à°°à±à°µà°°à± రాసేందà±à°•à± à°…à°¨à±à°•à±‚లంగా లేదà±.',
'uploaderror' => 'à°Žà°•à±à°•à°¿à°‚పౠపొరపాటà±',
+'upload-recreate-warning' => "'''హెచà±à°šà°°à°¿à°•: à°† పేరà±à°¤à±‹ ఉనà±à°¨ దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ తరలించి లేదా తొలగించి ఉనà±à°¨à°¾à°°à±.'''
+
+మీ సౌకరà±à°¯à°‚ కోసం à°ˆ à°ªà±à°Ÿ యొకà±à°• తొలగింపౠమరియౠతరలింపౠచిటà±à°Ÿà°¾à°¨à°¿ ఇకà±à°•à°¡ ఇసà±à°¤à±à°¨à±à°¨à°¾à°‚:",
'uploadtext' => "దసà±à°¤à±à°°à°¾à°²à°¨à± à°Žà°•à±à°•à°¿à°‚చడానికి à°ˆ కింది ఫారానà±à°¨à°¿ ఉపయోగించండి.
గతంలో à°Žà°•à±à°•à°¿à°‚à°šà°¿à°¨ దసà±à°¤à±à°°à°¾à°²à°¨à± చూడడానికి లేదా వెతకడానికి [[Special:FileList|à°Žà°•à±à°•à°¿à°‚à°šà°¿à°¨ దసà±à°¤à±à°°à°¾à°² యొకà±à°• జాబితా]]కౠవెళà±à°³à°‚à°¡à°¿, (à°ªà±à°¨à°ƒ)à°Žà°•à±à°•à°¿à°‚à°ªà±à°²à± [[Special:Log/upload|à°Žà°•à±à°•à°¿à°‚à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾]] లోనూ తొలగింపà±à°²à± [[Special:Log/delete|తొలగింపà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾]] లోనూ కూడా నమోదవà±à°¤à°¾à°¯à°¿.
@@ -1450,6 +1470,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' అనే ఫైలౠరకానà±à°¨à°¿ à°…à°¨à±à°®à°¤à°¿à°‚à°šà°‚.
à°…à°¨à±à°®à°¤à°¿à°‚చే {{PLURAL:\$3|ఫైలౠరకం ఇదీ|ఫైలౠరకాలౠఇవీ}}: \$2.",
'filetype-missing' => 'ఫైలà±à°•à°¿ పొడగింపౠ(".jpg" లాంటిది) లేదà±.',
+'empty-file' => 'మీరౠసమరà±à°ªà°¿à°‚à°šà°¿à°¨ దసà±à°¤à±à°°à°‚ ఖాళీగా ఉంది.',
+'file-too-large' => 'మీరౠసమరà±à°ªà°¿à°‚à°šà°¿à°¨ దసà±à°¤à±à°°à°‚ చాలా పెదà±à°¦à°—à°¾ ఉంది.',
+'filename-tooshort' => 'దసà±à°¤à±à°°à°ªà± పేరౠమరీ à°šà°¿à°¨à±à°¨à°—à°¾ ఉంది.',
+'filetype-banned' => 'à°ˆ రకపౠదసà±à°¤à±à°°à°¾à°²à°¨à°¿ నిషేధించామà±.',
+'verification-error' => 'దసà±à°¤à±à°°à°ªà± తనిఖీలో à°ˆ దసà±à°¤à±à°°à°‚ ఉతà±à°¤à±€à°°à±à°£à°®à°µà°²à±‡à°¦à±.',
+'hookaborted' => 'మీరౠచేయపà±à°°à°¤à±à°¨à°¿à°‚à°šà°¿à°¨ మారà±à°ªà±à°¨à°¿ à°’à°• పొడగింత కొకà±à°•à±†à°‚ విచà±à°›à°¿à°¨à±à°¨à°‚ చేసింది.',
+'illegal-filename' => 'à°† దసà±à°¤à±à°°à°ªà±à°ªà±‡à°°à± à°…à°¨à±à°®à°¤à°¿à°‚చబడదà±.',
+'overwrite' => 'ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఉనà±à°¨ దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ తిరిగరాయడం à°…à°¨à±à°®à°¤à°¿à°‚చబడదà±.',
+'unknown-error' => 'à°à°¦à±‹ తెలియని పొరపాటౠజరిగింది.',
+'tmp-create-error' => 'తాతà±à°•à°¾à°²à°¿à°• దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ సృషà±à°Ÿà°¿à°‚చలేకపోయాం.',
+'tmp-write-error' => 'తాతà±à°•à°¾à°²à°¿à°• దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ రాయడంలో పొరపాటà±.',
'large-file' => 'ఫైళà±à°³à± $1 కంటే పెదà±à°¦à°µà°¿à°—à°¾ ఉండకà±à°‚à°¡à°¾ ఉంటే మంచిది; à°ˆ ఫైలౠ$2 ఉంది.',
'largefileserver' => 'à°ˆ ఫైలౠసైజౠసరà±à°µà°°à±à°²à±‹ విధించిన పరిమితి కంటే à°Žà°•à±à°•à±à°µà°—à°¾ ఉంది.',
'emptyfile' => 'మీరౠఅపà±â€Œà°²à±‹à°¡à± చేసిన ఫైలౠఖాళీగా ఉనà±à°¨à°Ÿà±à°²à±à°‚ది. ఫైలౠపేరà±à°¨à± ఇవà±à°µà°¡à°‚లో à°¸à±à°ªà±†à°²à±à°²à°¿à°‚గౠతపà±à°ªà± దొరà±à°²à°¿ ఉండొచà±à°šà±. మీరౠఅపà±â€Œà°²à±‹à°¡à± చెయà±à°¯à°¦à°²à°šà°¿à°‚ది ఇదో కాదో నిరà±à°§à°¾à°°à°¿à°‚à°šà±à°•à±‹à°‚à°¡à°¿.',
@@ -1474,13 +1505,14 @@ $1",
ఇపà±à°ªà°Ÿà°¿à°•à±€ మీ ఫైలà±à°¨à°¿ à°Žà°—à±à°®à°¤à°¿ చేయాలనà±à°•à±à°‚టే, వెనకà±à°•à°¿à°µà±†à°³à±à°³à°¿ మరో పేరౠవాడండి. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'à°ˆ ఫైలౠకà±à°°à°¿à°‚à°¦ పేరà±à°•à±Šà°¨à±à°¨ {{PLURAL:$1|ఫైలà±à°•à°¿|ఫైళà±à°³à°•à°¿}} నకలà±:',
'file-deleted-duplicate' => 'గతంలో à°ˆ ఫైలౠలాంటిదే à°’à°• ఫైలà±à°¨à°¿ ([[:$1]]) తొలగించివà±à°¨à±à°¨à°¾à°°à±. మీరౠదీనà±à°¨à°¿ à°Žà°—à±à°®à°¤à°¿ చేసేమà±à°‚దౠఆ ఫైలౠయొకà±à°• తొలగింపౠచరితà±à°°à°¨à°¿ à°’à°•à±à°•à°¸à°¾à°°à°¿ చూడండి.',
-'successfulupload' => 'à°…à°ªà±â€Œà°²à±‹à°¡à± జయపà±à°°à°¦à°‚',
'uploadwarning' => 'à°Žà°•à±à°•à°¿à°‚పౠహెచà±à°šà°°à°¿à°•',
'uploadwarning-text' => 'ఫైలౠవివరణని à°•à±à°°à°¿à°‚à°¦ మారà±à°šà°¿ మళà±à°³à±€ à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.',
'savefile' => 'దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ à°­à°¦à±à°°à°ªà°°à°šà±',
'uploadedimage' => '"[[$1]]"ని à°Žà°•à±à°•à°¿à°‚చారà±',
'overwroteimage' => '"[[$1]]" యొకà±à°• కొతà±à°¤ కూరà±à°ªà±à°¨à± à°Žà°•à±à°•à°¿à°‚చారà±',
'uploaddisabled' => 'à°•à±à°·à°®à°¿à°‚à°šà°‚à°¡à°¿, à°…à°ªà±â€Œà°²à±‹à°¡à± చెయà±à°¯à°¡à°‚ à°ªà±à°°à°¸à±à°¤à±à°¤à°¾à°¨à°¿à°•à°¿ ఆపబడింది',
+'copyuploaddisabled' => 'URL à°¦à±à°µà°¾à°°à°¾ à°Žà°•à±à°•à°¿à°‚à°ªà±à°¨à°¿ అశకà±à°¤à°‚ చేసారà±.',
+'uploadfromurl-queued' => 'మీ à°Žà°•à±à°•à°¿à°‚పౠవరà±à°¸à°²à±‹ ఉంది.',
'uploaddisabledtext' => 'ఫైళà±à°³ à°Žà°—à±à°®à°¤à±à°²à°¨à± అచేతనం చేసారà±.',
'php-uploaddisabledtext' => 'PHPలో ఫైలౠఎకà±à°•à°¿à°‚à°ªà±à°²à± అచేతనమై ఉనà±à°¨à°¾à°¯à°¿.
దయచేసి file_uploads అమరికని చూడండి.',
@@ -1500,6 +1532,14 @@ $1",
కొనసాగే à°®à±à°‚దౠఈ ఫైలà±à°¨à°¿ à°Žà°•à±à°•à°¿à°‚à°šà°¡à°‚ సరియో కాదో చూసà±à°•à±‹à°‚à°¡à°¿.
సౌలభà±à°¯à°‚కోసం à°ˆ ఫైలౠయొకà±à°• తొలగింపౠచిటà±à°Ÿà°¾à°¨à°¿ ఇకà±à°•à°¡ ఇసà±à°¤à±à°¨à±à°¨à°¾à°‚:",
'filename-bad-prefix' => "మీరౠఅపà±à°²à±‹à°¡à± చేసà±à°¤à±à°¨à±à°¨ ఫైలౠపేరౠ'''\"\$1\"''' తో మొదలవà±à°¤à±à°‚ది. ఇది డిజిటలౠకెమెరాలౠఆటోమాటిగà±à°—à°¾ ఇచà±à°šà±‡ పేరà±. మరింత వివరంగా ఉండే పేరà±à°¨à± à°Žà°‚à°šà±à°•à±‹à°‚à°¡à°¿.",
+'upload-success-subj' => 'à°…à°ªà±â€Œà°²à±‹à°¡à± జయపà±à°°à°¦à°‚',
+'upload-success-msg' => '[$2] à°¨à±à°‚à°¡à°¿ మీ à°Žà°•à±à°•à°¿à°‚పౠసఫలమైంది. అది ఇకà±à°•à°¡ à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ ఉంది: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'à°Žà°•à±à°•à°¿à°‚పౠసమసà±à°¯',
+'upload-failure-msg' => '[$2] à°¨à±à°‚à°¡à°¿ మీ à°Žà°•à±à°•à°¿à°‚à°ªà±à°¤à±‹ à°à°¦à±‹ సమసà±à°¯ ఉంది:
+
+$1',
+'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> తో మొదలౠకావాలి.',
@@ -1560,6 +1600,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'listfiles_search_for' => 'మీడియా పేరà±à°•à±ˆ వెతà±à°•à±:',
'imgfile' => 'ఫైలà±',
'listfiles' => 'ఫైళà±à°³ జాబితా',
+'listfiles_thumb' => 'నఖచితà±à°°à°‚',
'listfiles_date' => 'తేదీ',
'listfiles_name' => 'పేరà±',
'listfiles_user' => 'వాడà±à°•à°°à°¿',
@@ -1674,8 +1715,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'statistics-edits' => '{{SITENAME}}ని మొదలà±à°ªà±†à°Ÿà±à°Ÿà°¿à°¨à°ªà±à°ªà°Ÿà°¿à°¨à±à°‚à°¡à°¿ జరిగిన మారà±à°ªà±à°²à±',
'statistics-edits-average' => 'పేజీకి సగటౠమారà±à°ªà±à°²à±',
'statistics-views-total' => 'మొతà±à°¤à°‚ వీకà±à°·à°£à°²à±',
+'statistics-views-total-desc' => 'ఉనికిలో లేని à°ªà±à°Ÿà°²à°•à± మరియౠపà±à°°à°¤à±à°¯à±‡à°• à°ªà±à°Ÿà°²à°•à± వచà±à°šà°¿à°¨ సందరà±à°¶à°¨à°²à°¨à°¿ à°•à°²à±à°ªà°²à±‡à°¦à±',
'statistics-views-peredit' => 'à°’à°• మారà±à°ªà±à°•à°¿ వీకà±à°·à°£à°²à±',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue పనà±à°² వరà±à°¸] పొడవà±',
'statistics-users' => 'నమోదైన [[Special:ListUsers|వాడà±à°•à°°à±à°²à±]]',
'statistics-users-active' => 'à°•à±à°°à°¿à°¯à°¾à°¶à±€à°² వాడà±à°•à°°à±à°²à±',
'statistics-users-active-desc' => 'à°—à°¤ {{PLURAL:$1|రోజà±|$1 రోజà±à°²}}లో à°’à°•à±à°• à°šà°°à±à°¯à±ˆà°¨à°¾ చేసిన వాడà±à°•à°°à±à°²à±',
@@ -1686,15 +1727,15 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'disambiguations-text' => "కింది పేజీలౠ'''అయోమయ నివృతà±à°¤à°¿''' పేజీకి లింకవà±à°¤à±à°¨à±à°¨à°¾à°¯à°¿. కానీ అవి సంబంధిత పేజీకి నేరà±à°—à°¾ లింకౠఅవాలి. <br /> [[MediaWiki:Disambiguationspage]] à°¨à±à°‚ది లింకౠఉనà±à°¨ మూసనౠవాడే పేజీని అయోమయ నివృతà±à°¤à°¿ పేజీగా భావిసà±à°¤à°¾à°°à±.",
'doubleredirects' => 'జంట దారిమారà±à°ªà±à°²à±',
-'doubleredirectstext' => 'à°’à°• దారిమారà±à°ªà± పేజీ à°¨à±à°‚à°šà°¿ ఇంకొక దారిమారà±à°ªà± పేజీకి దారిమారà±à°ªà± కలిగి à°µà±à°¨à±à°¨à°¾ à°µà±à°¯à°¾à°¸à°®à±à°² జాబితా ఇకà±à°•à°¡ ఉంటà±à°‚ది.
-à°ªà±à°°à°¤à±€ వరà±à°¸à°²à±‹à°¨à± మొదటి, రెండవ దారిమారà±à°ªà± లింకà±à°²à±, రెండో దారిమారà±à°ªà± పేజీలోని à°µà±à°¯à°¾à°¸à°ªà± మొదటి లైనౠఉనà±à°¨à°¾à°¯à°¿. మొదటి దారిమారà±à°ªà± యొకà±à°• అసలైన లకà±à°·à±à°¯à°‚ à°ˆ రెండో దారిమారà±à°ªà± పేజీయే!
-<s>కొటà±à°Ÿà°¿à°µà±‡à°¯à°¬à°¡à°¿à°¨</s> వాటిని సరిదిదà±à°¦à°¡à°®à± పూరà±à°¤à°¿ అయినది',
+'doubleredirectstext' => 'ఇతర దారిమారà±à°ªà± à°ªà±à°Ÿà°²à°•à°¿ తీసà±à°•à±†à°³à±à°³à±‡ దారిమారà±à°ªà±à°²à°¨à°¿ à°ˆ à°ªà±à°Ÿ చూపిసà±à°¤à±à°‚ది.
+à°ªà±à°°à°¤à±€ వరà±à°¸à°²à±‹ మొదటి మరియౠరెండవ దారిమారà±à°ªà±à°²à°•à± లంకెలà±, ఆలానే రెండవ దారిమారà±à°ªà± à°ªà±à°Ÿ యొకà±à°• లకà±à°·à±à°¯à°‚ ఉనà±à°¨à°¾à°¯à°¿. సాధారణంగా à°ˆ రెండవ దారిమారà±à°ªà± యొకà±à°• లకà±à°·à±à°¯à°®à±‡ "అసలైనది", అదే మొదటి దారిమారà±à°ªà± యొకà±à°• లకà±à°·à±à°¯à°‚à°—à°¾ ఉండాలి.
+<del>కొటà±à°Ÿà°¿à°µà±‡à°¯à°¬à°¡à°¿à°¨</del> పదà±à°¦à±à°²à± పరిషà±à°•à°°à°¿à°‚చబడà±à°¡à°µà°¿.',
'double-redirect-fixed-move' => '[[$1]]ని తరలించారà±, అది à°ªà±à°°à°¸à±à°¤à±à°¤à°‚ [[$2]]à°•à°¿ దారిమారà±à°ªà±.',
'double-redirect-fixer' => 'దారిమారà±à°ªà± సరిదà±à°¦à±à°µà°¾à°°à±',
'brokenredirects' => 'తెగిపోయిన దారిమారà±à°ªà±à°²à±',
'brokenredirectstext' => 'కింది దారిమారà±à°ªà±à°²à± లేని-పేజీలకౠమళà±à°³à°¿à°‚à°šà±à°¤à±à°¨à±à°¨à°¾à°¯à°¿:',
-'brokenredirects-edit' => 'మారà±à°šà±',
+'brokenredirects-edit' => 'సవరించà±',
'brokenredirects-delete' => 'తొలగించà±',
'withoutinterwiki' => 'భాషా లింకà±à°²à± లేని పేజీలà±',
@@ -1711,6 +1752,8 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'nmembers' => '{{PLURAL:$1|à°’à°• ఉపవరà±à°—à°‚/పేజీ/ఫైలà±|$1 ఉపవరà±à°—ాలà±/పేజీలà±/ఫైళà±à°²à±}}',
'nrevisions' => '{{PLURAL:$1|à°’à°• సంచిక|$1 సంచికలà±}}',
'nviews' => '$1 {{PLURAL:$1|దరà±à°¶à°¨à°®à±|దరà±à°¶à°¨à°²à±}}',
+'nimagelinks' => '$1 {{PLURAL:$1|à°ªà±à°Ÿ|à°ªà±à°Ÿà°²}}లో ఉపయోగించారà±',
+'ntransclusions' => '$1 {{PLURAL:$1|à°ªà±à°Ÿ|à°ªà±à°Ÿà°²}}లో ఉపయోగించారà±',
'specialpage-empty' => 'ఈ పేజీ ఖాళీగా ఉంది.',
'lonelypages' => 'అనాధ పేజీలà±',
'lonelypagestext' => 'కింది పేజీలకౠ{{SITENAME}}లోని ఠఇతర పేజీ à°¨à±à°‚à°¡à°¿ కూడా లింకà±à°²à± లేవౠలేదా ఇవి మరే ఇతర పేజీలోనూ కలపబడలేదà±.',
@@ -1750,7 +1793,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'listusers-creationsort' => 'చేరిన తేదీ à°•à±à°°à°®à°‚లో చూపించà±',
'usereditcount' => '$1 {{PLURAL:$1|మారà±à°ªà±|మారà±à°ªà±à°²à±}}',
'usercreated' => '$1à°¨ $2à°•à°¿ చేరారà±',
-'newpages' => 'కొతà±à°¤ à°ªà±à°Ÿà°²à±',
+'newpages' => 'కొతà±à°¤ పేజీలà±',
'newpages-username' => 'వాడà±à°•à°°à°¿à°ªà±‡à°°à±:',
'ancientpages' => 'పాత పేజీలà±',
'move' => 'తరలించà±',
@@ -1790,7 +1833,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'prevpage' => 'à°®à±à°¨à±à°ªà°Ÿà°¿ పేజీ ($1)',
'allpagesfrom' => 'ఇకà±à°•à°¡ మొదలౠపెటà±à°Ÿà°¿ పేజీలౠచూపించà±:',
'allpagesto' => 'ఇకà±à°•à°¡à°µà°°à°•à± ఉనà±à°¨ పేజీలౠచూపించà±:',
-'allarticles' => 'à°…à°¨à±à°¨à°¿ à°ªà±à°Ÿà°²à±',
+'allarticles' => 'à°…à°¨à±à°¨à°¿ పేజీలà±',
'allinnamespace' => 'à°…à°¨à±à°¨à°¿ పేజీలౠ($1 namespace)',
'allnotinnamespace' => 'à°…à°¨à±à°¨à°¿ పేజీలౠ($1 నేంసà±à°ªà±‡à°¸à± లేనివి)',
'allpagesprev' => 'పూరà±à°µà°ªà±',
@@ -1866,33 +1909,39 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'listgrouprights-removegroup-self-all' => 'à°¸à±à°µà°‚à°¤ ఖాతా à°¨à±à°‚à°¡à°¿ à°…à°¨à±à°¨à°¿ సమూహాలనూ తొలగించà±à°•à±‹à°—లగడం',
# E-mail user
-'mailnologin' => 'పంపించవలసిన à°šà°¿à°°à±à°¨à°¾à°®à°¾ లేదà±',
-'mailnologintext' => 'ఇతరà±à°²à°•à± à°ˆ-మెయిలౠపంపించాలంటే, మీరౠ[[Special:UserLogin|లాగినà±â€Œ]] అయి ఉండాలి, మరియౠమీ [[Special:Preferences|à°…à°­à°¿à°°à±à°šà±à°²]]లో సరైన à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ఇచà±à°šà°¿ ఉండాలి.',
-'emailuser' => 'à°ˆ వాడà±à°•à°°à°¿à°•à°¿ à°ˆ-మెయిలà±à°¨à°¿ పంపించండి',
-'emailpage' => 'వాడà±à°•à°°à°¿à°•à°¿ à°ˆ-మెయిలà±à°¨à°¿ పంపించà±',
-'emailpagetext' => 'వాడà±à°•à°°à°¿à°•à°¿ ఈమెయిలౠసందేశమౠపంపించà±à°Ÿà°•à± à°•à±à°°à°¿à°‚ది ఫారంనౠఉపయోగించవచà±à°šà±. [[Special:Preferences|మీ వాడà±à°•à°°à°¿ à°…à°­à°¿à°°à±à°šà±à°²]]లో మీరిచà±à°šà°¿à°¨ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ "à°¨à±à°‚à°¡à°¿" à°† సందేశం వచà±à°šà°¿à°¨à°Ÿà±à°²à±à°—à°¾ ఉంటà±à°‚ది, à°•à°¨à±à°• వేగà±à°¨à°¿ à°…à°‚à°¦à±à°•à±à°¨à±‡à°µà°¾à°°à± నేరà±à°—à°¾ మీకౠజవాబివà±à°µà°—à°²à±à°—à±à°¤à°¾à°°à±.',
-'usermailererror' => 'మెయిలౠఆబà±à°œà±†à°•à±à°Ÿà± à°ˆ లోపానà±à°¨à°¿ చూపింది:',
-'defemailsubject' => '{{SITENAME}} à°ˆ-మెయిలà±',
-'noemailtitle' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ లేదà±',
-'noemailtext' => 'à°ˆ వాడà±à°•à°°à°¿ సరైన à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ ఇవà±à°µà°²à±‡à°¦à±.',
-'nowikiemailtitle' => 'à°ˆ-మెయిళà±à°³à°¨à± à°…à°¨à±à°®à°¤à°¿à°‚à°šà°°à±',
-'nowikiemailtext' => 'ఇతర వాడà±à°•à°°à±à°² à°¨à±à°‚à°¡à°¿ à°ˆ-మెయిళà±à°³à°¨à± à°…à°‚à°¦à±à°•à±‹à°¡à°¾à°¨à°¿à°•à°¿ à°ˆ వాడà±à°•à°°à°¿ à°¸à±à°®à±à°–à°‚à°—à°¾ లేరà±.',
-'email-legend' => 'మరో {{SITENAME}} వాడà±à°•à°°à°¿à°•à°¿ వేగౠపంపించండి',
-'emailfrom' => 'ఎవరà±:',
-'emailto' => 'ఎవరికి:',
-'emailsubject' => 'విషయం:',
-'emailmessage' => 'సందేశం:',
-'emailsend' => 'పంపించà±',
-'emailccme' => 'సందేశపౠఒక à°ªà±à°°à°¤à°¿à°¨à°¿ నాకౠఈమెయిలౠపంపà±.',
-'emailccsubject' => '$1 కౠమీరౠపంపిన సందేశపౠపà±à°°à°¤à°¿: $2',
-'emailsent' => 'ఈ-మెయిలౠపంపించాం',
-'emailsenttext' => 'మీ ఈ-మెయిలౠసందేశం పంపబడింది.',
-'emailuserfooter' => 'à°ˆ à°ˆ-మెయిలà±à°¨à°¿ $2 à°•à°¿ {{SITENAME}} లోని "వాడà±à°•à°°à°¿à°•à°¿ ఈమెయిలà±" అనే సౌలభà±à°¯à°‚ à°¦à±à°µà°¾à°°à°¾ $1 పంపించారà±.',
+'mailnologin' => 'పంపించవలసిన à°šà°¿à°°à±à°¨à°¾à°®à°¾ లేదà±',
+'mailnologintext' => 'ఇతరà±à°²à°•à± à°ˆ-మెయిలౠపంపించాలంటే, మీరౠ[[Special:UserLogin|లాగినà±â€Œ]] అయి ఉండాలి, మరియౠమీ [[Special:Preferences|à°…à°­à°¿à°°à±à°šà±à°²]]లో సరైన à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ఇచà±à°šà°¿ ఉండాలి.',
+'emailuser' => 'à°ˆ వాడà±à°•à°°à°¿à°•à°¿ à°ˆ-మెయిలà±à°¨à°¿ పంపించండి',
+'emailpage' => 'వాడà±à°•à°°à°¿à°•à°¿ à°ˆ-మెయిలà±à°¨à°¿ పంపించà±',
+'emailpagetext' => 'వాడà±à°•à°°à°¿à°•à°¿ ఈమెయిలౠసందేశమౠపంపించà±à°Ÿà°•à± à°•à±à°°à°¿à°‚ది ఫారంనౠఉపయోగించవచà±à°šà±. [[Special:Preferences|మీ వాడà±à°•à°°à°¿ à°…à°­à°¿à°°à±à°šà±à°²]]లో మీరిచà±à°šà°¿à°¨ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ "à°¨à±à°‚à°¡à°¿" à°† సందేశం వచà±à°šà°¿à°¨à°Ÿà±à°²à±à°—à°¾ ఉంటà±à°‚ది, à°•à°¨à±à°• వేగà±à°¨à°¿ à°…à°‚à°¦à±à°•à±à°¨à±‡à°µà°¾à°°à± నేరà±à°—à°¾ మీకౠజవాబివà±à°µà°—à°²à±à°—à±à°¤à°¾à°°à±.',
+'usermailererror' => 'మెయిలౠఆబà±à°œà±†à°•à±à°Ÿà± à°ˆ లోపానà±à°¨à°¿ చూపింది:',
+'defemailsubject' => '{{SITENAME}} à°ˆ-మెయిలà±',
+'usermaildisabled' => 'వాడà±à°•à°°à°¿ à°ˆ-మెయిళà±à°³à± అచేతనం చేసారà±',
+'usermaildisabledtext' => 'à°ˆ వికీలో మీరౠఇతర వాడà±à°•à°°à±à°²à°•à°¿ à°ˆ-మెయిళà±à°³à°¨à°¿ పంపించలేరà±',
+'noemailtitle' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ లేదà±',
+'noemailtext' => 'à°ˆ వాడà±à°•à°°à°¿ సరైన à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ ఇవà±à°µà°²à±‡à°¦à±.',
+'nowikiemailtitle' => 'à°ˆ-మెయిళà±à°³à°¨à± à°…à°¨à±à°®à°¤à°¿à°‚à°šà°°à±',
+'nowikiemailtext' => 'ఇతర వాడà±à°•à°°à±à°² à°¨à±à°‚à°¡à°¿ à°ˆ-మెయిళà±à°³à°¨à± à°…à°‚à°¦à±à°•à±‹à°¡à°¾à°¨à°¿à°•à°¿ à°ˆ వాడà±à°•à°°à°¿ à°¸à±à°®à±à°–à°‚à°—à°¾ లేరà±.',
+'email-legend' => 'మరో {{SITENAME}} వాడà±à°•à°°à°¿à°•à°¿ వేగౠపంపించండి',
+'emailfrom' => 'ఎవరà±:',
+'emailto' => 'ఎవరికి:',
+'emailsubject' => 'విషయం:',
+'emailmessage' => 'సందేశం:',
+'emailsend' => 'పంపించà±',
+'emailccme' => 'సందేశపౠఒక à°ªà±à°°à°¤à°¿à°¨à°¿ నాకౠఈమెయిలౠపంపà±.',
+'emailccsubject' => '$1 కౠమీరౠపంపిన సందేశపౠపà±à°°à°¤à°¿: $2',
+'emailsent' => 'ఈ-మెయిలౠపంపించాం',
+'emailsenttext' => 'మీ ఈ-మెయిలౠసందేశం పంపబడింది.',
+'emailuserfooter' => 'à°ˆ à°ˆ-మెయిలà±à°¨à°¿ $2 à°•à°¿ {{SITENAME}} లోని "వాడà±à°•à°°à°¿à°•à°¿ ఈమెయిలà±" అనే సౌలభà±à°¯à°‚ à°¦à±à°µà°¾à°°à°¾ $1 పంపించారà±.',
+
+# User Messenger
+'usermessage-summary' => 'à°µà±à°¯à°µà°¸à±à°¥ సందేశానà±à°¨à°¿ వదిలివేసà±à°¤à±à°¨à±à°¨à°¾à°‚.',
+'usermessage-editor' => 'à°µà±à°¯à°µà°¸à±à°¥ సందేశకà±à°²à±',
# Watchlist
'watchlist' => 'నా వీకà±à°·à°£ జాబితా',
'mywatchlist' => 'నా వీకà±à°·à°£ జాబితా',
-'watchlistfor' => "('''$1''' కొరకà±)",
+'watchlistfor2' => '$1 కొరకౠ$2',
'nowatchlist' => 'మీ వీకà±à°·à°£ జాబితా ఖాళీగా ఉంది.',
'watchlistanontext' => 'మీ వీకà±à°·à°£ జాబితా లోని అంశాలనౠచూసేందà±à°•à± లేదా మారà±à°šà±‡à°‚à°¦à±à°•à± మీరౠ$1 ఉండాలి.',
'watchnologin' => 'లాగినà±â€Œ అయిలేరà±',
@@ -1904,7 +1953,7 @@ http://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'removedwatchtext' => '"[[:$1]]" అనే పేజీ [[Special:Watchlist|మీ వీకà±à°·à°£ జాబితా]] à°¨à±à°‚à°¡à°¿ తొలగించబడినది.',
'watch' => 'వీకà±à°·à°¿à°‚à°šà±',
'watchthispage' => 'à°ˆ à°ªà±à°Ÿ మీద à°•à°¨à±à°¨à±‡à°¸à°¿ ఉంచà±',
-'unwatch' => 'వీకà±à°·à°¿à°‚à°š వదà±à°¦à±',
+'unwatch' => 'వీకà±à°·à°¿à°‚చవదà±à°¦à±',
'unwatchthispage' => 'వీకà±à°·à°£à°¨à± ఆపà±',
'notanarticle' => 'à°µà±à°¯à°¾à°¸à°‚ పేజీ కాదà±',
'notvisiblerev' => 'à°ˆ కూరà±à°ªà±à°¨à± తొలగించాం',
@@ -1962,7 +2011,7 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
{{fullurl:{{MediaWiki:helppage}}}}',
# Delete
-'deletepage' => 'à°ªà±à°Ÿà°¨à°¿ తొలగించà±',
+'deletepage' => 'పేజీని తొలగించà±',
'confirm' => 'ధృవీకరించà±',
'excontent' => "ఇదివరకౠవిషయ సంగà±à°°à°¹à°‚: '$1'",
'excontentauthor' => 'ఉనà±à°¨ విషయ సంగà±à°°à°¹à°‚: "$1" (మరియౠదీని ఒకే à°’à°•à±à°• రచయిత "[[Special:Contributions/$2|$2]]")',
@@ -2006,7 +2055,10 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|à°šà°°à±à°š]]) చేసిన మారà±à°ªà±à°²à°¨à± [[User:$1|$1]] యొకà±à°• చివరి కూరà±à°ªà± వరకౠతిపà±à°ªà°¿à°•à±Šà°Ÿà±à°Ÿà°¾à°°à±.',
'revertpage-nouser' => '(తొలగించిన వాడà±à°•à°°à°¿à°ªà±‡à°°à±) చేసిన మారà±à°ªà±à°²à°¨à± [[User:$1|$1]] యొకà±à°• చివరి కూరà±à°ªà±à°•à°¿ తిపà±à°ªà°¿à°•à±Šà°Ÿà±à°Ÿà°¾à°°à±',
'rollback-success' => '$1 చేసిన దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à°¨à± వెనకà±à°•à± తీసà±à°•à±†à°³à±à°³à°¾à°‚; తిరిగి $2 చేసిన చివరి కూరà±à°ªà±à°•à± మారà±à°šà°¾à°‚.',
-'sessionfailure' => 'మీ à°ªà±à°°à°µà±‡à°¶à°ªà± సెషనà±à°¤à±‹ à°à°¦à±‹ సమసà±à°¯ ఉనà±à°¨à°Ÿà±à°²à±à°‚ది;
+
+# Edit tokens
+'sessionfailure-title' => 'సెషనౠవైఫలà±à°¯à°‚',
+'sessionfailure' => 'మీ à°ªà±à°°à°µà±‡à°¶à°ªà± సెషనà±à°¤à±‹ à°à°¦à±‹ సమసà±à°¯ ఉనà±à°¨à°Ÿà±à°²à±à°‚ది;
సెషనౠహైజాకౠకాకà±à°‚à°¡à°¾ à°ˆ à°šà°°à±à°¯à°¨à± à°°à°¦à±à°¦à± చేసాం.
"back" కొటà±à°Ÿà°¿, à°Žà°•à±à°•à°¡à°¿ à°¨à±à°‚à°¡à°¿ వచà±à°šà°¾à°°à±‹ à°† పేజీని మళà±à°³à±€ లోడౠచేసి, తిరిగి à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.',
@@ -2132,24 +2184,28 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'month' => 'à°ˆ నెల à°¨à±à°‚à°¡à°¿ (అంతకౠమà±à°‚à°¦à±à°µà°¿):',
'year' => 'à°ˆ సంవతà±à°¸à°°à°‚ à°¨à±à°‚à°¡à°¿ (అంతకౠమà±à°‚à°¦à±à°µà°¿):',
-'sp-contributions-newbies' => 'కొతà±à°¤ ఖాతాల యొకà±à°• రచనలని మాతà±à°°à°®à±‡ చూపించà±',
-'sp-contributions-newbies-sub' => 'కొతà±à°¤à°µà°¾à°°à°¿ కోసం',
-'sp-contributions-newbies-title' => 'కొతà±à°¤ ఖాతాల వాడà±à°•à°°à±à°² మారà±à°ªà±à°šà±‡à°°à±à°ªà±à°²à±',
-'sp-contributions-blocklog' => 'నిరోధాల à°šà°¿à°Ÿà±à°Ÿà°¾',
-'sp-contributions-deleted' => 'తొలగించబడిన వాడà±à°•à°°à°¿ రచనలà±',
-'sp-contributions-logs' => 'à°šà°¿à°Ÿà±à°Ÿà°¾à°²à±',
-'sp-contributions-talk' => 'à°šà°°à±à°š',
-'sp-contributions-userrights' => 'వాడà±à°•à°°à°¿ హకà±à°•à±à°² నిరà±à°µà°¹à°£',
-'sp-contributions-blocked-notice' => 'à°ˆ వాడà±à°•à°°à°¿à°ªà±ˆ à°ªà±à°°à°¸à±à°¤à±à°¤à°‚ నిరోధం ఉంది.
+'sp-contributions-newbies' => 'కొతà±à°¤ ఖాతాల యొకà±à°• రచనలని మాతà±à°°à°®à±‡ చూపించà±',
+'sp-contributions-newbies-sub' => 'కొతà±à°¤à°µà°¾à°°à°¿ కోసం',
+'sp-contributions-newbies-title' => 'కొతà±à°¤ ఖాతాల వాడà±à°•à°°à±à°² మారà±à°ªà±à°šà±‡à°°à±à°ªà±à°²à±',
+'sp-contributions-blocklog' => 'నిరోధాల à°šà°¿à°Ÿà±à°Ÿà°¾',
+'sp-contributions-deleted' => 'తొలగించబడిన వాడà±à°•à°°à°¿ రచనలà±',
+'sp-contributions-uploads' => 'à°Žà°•à±à°•à°¿à°‚à°ªà±à°²à±',
+'sp-contributions-logs' => 'à°šà°¿à°Ÿà±à°Ÿà°¾à°²à±',
+'sp-contributions-talk' => 'à°šà°°à±à°š',
+'sp-contributions-userrights' => 'వాడà±à°•à°°à°¿ హకà±à°•à±à°² నిరà±à°µà°¹à°£',
+'sp-contributions-blocked-notice' => 'à°ˆ వాడà±à°•à°°à°¿à°ªà±ˆ à°ªà±à°°à°¸à±à°¤à±à°¤à°‚ నిరోధం ఉంది.
నిరోధపౠచిటà±à°Ÿà°¾à°²à±‹à°¨à°¿ చివరి పదà±à°¦à±à°¨à°¿ మీ సమాచారంకోసం ఇసà±à°¤à±à°¨à±à°¨à°¾à°‚:',
-'sp-contributions-search' => 'రచనల కోసం à°…à°¨à±à°µà±‡à°·à°£',
-'sp-contributions-username' => 'à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ లేదా వాడà±à°•à°°à°¿à°ªà±‡à°°à±:',
-'sp-contributions-submit' => 'వెతà±à°•à±',
+'sp-contributions-blocked-notice-anon' => 'à°ˆ à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾à°ªà±ˆ à°ªà±à°°à°¸à±à°¤à±à°¤à°‚ నిరోధం ఉంది.
+నిరోధపౠచిటà±à°Ÿà°¾à°²à±‹à°¨à°¿ చివరి పదà±à°¦à±à°¨à°¿ మీ సమాచారంకోసం ఇసà±à°¤à±à°¨à±à°¨à°¾à°‚:',
+'sp-contributions-search' => 'రచనల కోసం à°…à°¨à±à°µà±‡à°·à°£',
+'sp-contributions-username' => 'à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ లేదా వాడà±à°•à°°à°¿à°ªà±‡à°°à±:',
+'sp-contributions-toponly' => 'à°šà°¿à°Ÿà±à°Ÿà°šà°¿à°µà°°à°¿ కూరà±à°ªà±à°²à°¨à± మాతà±à°°à°®à±‡ చూపించà±',
+'sp-contributions-submit' => 'వెతà±à°•à±',
# What links here
'whatlinkshere' => 'ఇకà±à°•à°¡à°¿à°•à°¿ లంకెలà±à°¨à±à°¨ à°ªà±à°Ÿà°²à±',
'whatlinkshere-title' => '"$1"à°•à°¿ లింకà±à°¨à±à°¨ à°ªà±à°Ÿà°²à±',
-'whatlinkshere-page' => 'à°ªà±à°Ÿ:',
+'whatlinkshere-page' => 'పేజీ:',
'linkshere' => "కిందనà±à°¨à±à°¨ పేజీల à°¨à±à°‚à°¡à°¿ '''[[:$1]]'''కౠలింకà±à°²à± ఉనà±à°¨à°¾à°¯à°¿:",
'nolinkshere' => "'''[[:$1]]'''కౠఠపేజీ à°¨à±à°‚à°¡à±€ లింకౠలేదà±.",
'nolinkshere-ns' => "'''[[:$1]]''' పేజీకి లింకయà±à°¯à±‡ పేజీలౠఎంచà±à°•à±à°¨à±à°¨ నేంసà±à°ªà±‡à°¸à±à°²à±‹ లేవà±.",
@@ -2206,7 +2262,6 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'ipb-edit-dropdown' => 'నిరోధపౠకారణాలనౠమారà±à°šà°‚à°¡à°¿',
'ipb-unblock-addr' => '$1 పై ఉనà±à°¨ నిరోధానà±à°¨à°¿ తొలగించండి',
'ipb-unblock' => 'వాడà±à°•à°°à°¿à°ªà±‡à°°à± లేక à°à°ªà±€ à°…à°¡à±à°°à°¸à±à°ªà±ˆ ఉనà±à°¨ నిరోధానà±à°¨à°¿ తొలగించండి',
-'ipb-blocklist-addr' => '$1 పై ఉనà±à°¨ నిరోధాలà±',
'ipb-blocklist' => 'అమలà±à°²à±‹ ఉనà±à°¨ నిరోధాలనౠచూపించà±',
'ipb-blocklist-contribs' => '$1 యొకà±à°• మారà±à°ªà±à°²à±-చేరà±à°ªà±à°²à±',
'unblockip' => 'సభà±à°¯à±à°¨à°¿à°ªà±ˆ నిరోధానà±à°¨à°¿ తొలగించà±',
@@ -2275,6 +2330,8 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'sorbs_create_account_reason' => 'మీ à°à°ªà±€ à°…à°¡à±à°°à°¸à± DNSBL లో ఓపెనౠపà±à°°à°¾à°•à±à°¸à±€à°—à°¾ నమోదయి ఉంది. మీరౠఎకౌంటà±à°¨à± సృషà±à°Ÿà°¿à°‚చజాలరà±.',
'cant-block-while-blocked' => 'నిరోధంలో ఉనà±à°¨ మీరౠఇతర వాడà±à°•à°°à±à°²à°ªà±ˆ నిరోధం అమలà±à°šà±‡à°¯à°²à±‡à°°à±.',
'cant-see-hidden-user' => 'మీరౠనిరోధించదలచిన వాడà±à°•à°°à°¿ ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించబడి, దాచబడి ఉనà±à°¨à°¾à°°à±. మీకౠహకà±à°•à± లేదౠకాబటà±à°Ÿà°¿, à°† వాడà±à°•à°°à°¿ నిరోధానà±à°¨à°¿ చూడటంగానీ, దానà±à°¨à°¿ మారà±à°šà°¡à°‚గానీ చెయà±à°¯à°²à±‡à°°à±.',
+'ipbblocked' => 'మీరౠఇతర వాడà±à°•à°°à±à°²à°¨à°¿ నిరోధించలేరౠలేదా అనిరోధించలేరà±, à°Žà°‚à°¦à±à°•à°‚టే మిమà±à°®à°²à±à°¨à°¿ మీరే నిరోధించà±à°•à±à°¨à±à°¨à°¾à°°à±',
+'ipbnounblockself' => 'మిమà±à°®à°²à±à°¨à°¿ మీరే అనిరోధించà±à°•à±à°¨à±‡ à°…à°¨à±à°®à°¤à°¿ మీకౠలేదà±',
# Developer tools
'lockdb' => 'డాటాబేసà±à°¨à± లాకà±â€Œ చెయà±à°¯à°¿',
@@ -2312,6 +2369,16 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'''హెచà±à°šà°°à°¿à°•!'''
à°ˆ మారà±à°ªà± బాగా జనరంజకమైన పేజీలకౠఅనూహà±à°¯à°‚ కావచà±à°šà±;
దాని పరిణామాలనౠఅరà±à°§à°‚ చేసà±à°•à±à°¨à°¿ à°®à±à°‚à°¦à±à°•à±à°¸à°¾à°—à°‚à°¡à°¿.",
+'movepagetext-noredirectfixer' => "కింది ఫారానà±à°¨à°¿ వాడి, à°“ పేజీ పేరౠమారà±à°šà°µà°šà±à°šà±. దాని à°šà°°à°¿à°¤à±à°° పూరà±à°¤à°¿à°—à°¾ కొతà±à°¤ పేరà±à°•à± తరలిపోతà±à°‚ది.
+పాత శీరà±à°·à°¿à°• కొతà±à°¤à°¦à°¾à°¨à°¿à°•à°¿ దారిమారà±à°ªà± పేజీగా మారిపోతà±à°‚ది.
+[[Special:DoubleRedirects|double]] లేదా [[Special:BrokenRedirects|broken redirects]] లనౠచూడటం మరà±à°µà°•à°‚à°¡à°¿.
+లింకà±à°²à± వెళà±à°³à°¾à°²à±à°¸à°¿à°¨ చోటికి వెళà±à°¤à±à°¨à±à°¨à°¾à°¯à°¨à°¿ నిరà±à°§à°¾à°°à°¿à°‚à°šà±à°•à±‹à°µà°¾à°²à±à°¸à°¿à°¨ బాధà±à°¯à°¤ మీదే.
+కొతà±à°¤ పేరà±à°¤à±‹ ఈసరికే à°à°¦à±ˆà°¨à°¾ పేజీ ఉంటే - అది ఖాళీగా ఉనà±à°¨à°¾ లేక మారà±à°ªà±à°šà±‡à°°à±à°ªà±à°² à°šà°°à°¿à°¤à±à°° à°à°®à±€ లేని దారిమారà±à°ªà± పేజీ అయినా తపà±à°ª- తరలింపౠ’’’జరà±à°—à°¦à±â€™â€™â€™ అని గమనించండి.
+అంటే, à°à°¦à±ˆà°¨à°¾ పొరపాటౠజరిగితే పేరà±à°¨à± తిరిగి పాత పేరà±à°•à±‡ మారà±à°šà°—లరౠతపà±à°ª, ఈపాటికే ఉనà±à°¨ పేజీపై ఓవరరైటౠచెయà±à°¯à°²à±‡à°°à±.
+
+'''హెచà±à°šà°°à°¿à°•!'''
+బహà±à°³ à°µà±à°¯à°¾à°ªà±à°¤à°¿ పొందిన à°“ పేజీలో à°ˆ మారà±à°ªà± చాలా తీవà±à°°à°®à±ˆà°¨à°¦à°¿, ఊహించనిదీ à°…à°µà±à°¤à±à°‚ది.
+దాని పరà±à°¯à°µà°¸à°¾à°¨à°¾à°²à± à°…à°°à±à°¥à°‚ చేసà±à°•à±à°¨à±à°¨à°¾à°•à±‡ à°®à±à°‚à°¦à±à°•à± వెళà±à°³à°‚à°¡à°¿.",
'movepagetalktext' => "దానితో పాటౠసంబంధిత à°šà°°à±à°šà°¾ పేజీ కూడా ఆటోమాటికà±â€Œâ€Œà°—à°¾ తరలించబడà±à°¤à±à°‚ది, '''కింది సందరà±à°­à°¾à°²à°²à±‹ తపà±à°ª:'''
*à°’à°• నేంసà±à°ªà±‡à°¸à± à°¨à±à°‚à°¡à°¿ ఇంకోదానికి తరలించేటపà±à°¡à±,
*కొతà±à°¤ పేరà±à°¤à±‹ ఇపà±à°ªà°Ÿà°¿à°•à±‡ à°’à°• à°šà°°à±à°šà°¾ పేజీ ఉంటే,
@@ -2367,6 +2434,7 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'immobile-source-page' => 'à°ˆ పేజీని తరలించలేరà±.',
'immobile-target-page' => 'à°† లకà±à°·à±à°¯à°¿à°¤ శీరà±à°·à°¿à°•à°•à°¿ తరలించలేమà±.',
'imagenocrossnamespace' => 'ఫైలà±à°¨à±, ఫైలà±à°•à± చెందని నేమà±â€Œà°¸à±à°ªà±‡à°¸à±à°•à± తరలించలేం',
+'nonfile-cannot-move-to-file' => 'దసà±à°¤à±à°°à°¾à°²à± కానివాటిని దసà±à°¤à±à°°à°ªà± పేరà±à°¬à°°à°¿à°•à°¿ తరలించలేరà±',
'imagetypemismatch' => 'à°ˆ కొతà±à°¤ ఫైలౠఎకà±à°¸à±&zwnj;టెనà±à°·à°¨à± ఫైలౠరకానికి సరిపోలేదà±',
'imageinvalidfilename' => 'లకà±à°·à±à°¯à°¿à°¤ దసà±à°¤à±à°°à°ªà± పేరౠచెలà±à°²à°¨à°¿à°¦à°¿',
'fix-double-redirects' => 'పాత పేజీని సూచిసà±à°¤à±à°¨à±à°¨ దారిమారà±à°ªà±à°²à°¨à± తాజాకరించà±',
@@ -2404,14 +2472,14 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'allmessagesname' => 'పేరà±',
'allmessagesdefault' => 'డీఫాలà±à°Ÿà± పాఠà±à°¯à°‚',
'allmessagescurrent' => 'à°ªà±à°°à°¸à±à°¤à±à°¤ పాఠà±à°¯à°‚',
-'allmessagestext' => 'మీడియావికీ నేంసà±à°ªà±‡à°¸à±à°²à±‹ ఉనà±à°¨ à°…à°¨à±à°¨à°¿ సిసà±à°Ÿà°‚ సందేశాల జాబితా ఇది.
-మీరౠఅనà±à°¨à°¿ వికీపీడియాలకూ కలిపి ఒకేసారి à°…à°¨à±à°µà°¦à°¿à°‚చాలని à°…à°¨à±à°•à±à°‚టే, దయచేసి [http://www.mediawiki.org/wiki/Localisation మీడియావికీ à°…à°¨à±à°µà°¾à°¦à°‚] మరియూ [http://translatewiki.net బేటావికీ] సైటà±à°²à°¨à± చూడండి.',
+'allmessagestext' => 'మీడియావికీ పేరà±à°¬à°°à°¿à°²à±‹ ఉనà±à°¨ అంతరవరà±à°¤à°¿ సందేశాల జాబితా ఇది.
+సాధారణ మీడియావికీ à°¸à±à°¥à°¾à°¨à°¿à°•à±€à°•à°°à°£à°•à°¿ మీరౠతోడà±à°ªà°¡à°¾à°²à°¨à±à°•à±à°‚టే, దయచేసి [http://www.mediawiki.org/wiki/Localisation మీడియావికీ à°¸à±à°¥à°¾à°¨à°¿à°•à±€à°•à°°à°£] మరియౠ[http://translatewiki.net à°Ÿà±à°°à°¾à°¨à±à°¸à±&zwnj;లేటà±&zwnj;వికీ.నెటà±] సైటà±à°²à°¨à± చూడండి.',
'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' à°…à°¨à±à°¨à°¦à°¿ అచేతనం చేసి ఉనà±à°¨à°‚à°¦à±à°µà°²à±à°² à°ˆ పేజీని వాడలేరà±.",
'allmessages-filter-legend' => 'వడపోత',
'allmessages-filter' => 'à°•à°¸à±à°Ÿà°®à±ˆà°œà±‡à°·à°¨à± à°¸à±à°¥à°¿à°¤à°¿à°¨à°¿ బటà±à°Ÿà°¿ వడకటà±à°Ÿà±:',
-'allmessages-filter-unmodified' => 'మారà±à°šà°¾à°¬à°¡à°¨à°¿à°¦à°¿',
+'allmessages-filter-unmodified' => 'మారà±à°šà°¬à°¡à°¨à°¿à°µà°¿',
'allmessages-filter-all' => 'à°…à°¨à±à°¨à±€',
-'allmessages-filter-modified' => 'మారà±à°šà°¬à°¡à°¿à°¨à°¦à°¿',
+'allmessages-filter-modified' => 'మారà±à°šà°¬à°¡à°¿à°¨à°µà°¿',
'allmessages-prefix' => 'ఉపసరà±à°— పై వడపోత:',
'allmessages-language' => 'భాష:',
'allmessages-filter-submit' => 'వెళà±à°³à±',
@@ -2446,6 +2514,7 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'importstart' => 'పేజీలనౠదిగà±à°®à°¤à°¿ చేసà±à°¤à±à°¨à±à°¨à°¾à°‚...',
'import-revision-count' => '$1 {{PLURAL:$1|కూరà±à°ªà±|కూరà±à°ªà±à°²à±}}',
'importnopages' => 'దిగà±à°®à°¤à°¿ చెయà±à°¯à°¡à°¾à°¨à°¿à°•à°¿ పేజీలేమీ లేవà±.',
+'imported-log-entries' => '$1 {{PLURAL:$1|à°šà°¿à°Ÿà±à°Ÿà°¾ పదà±à°¦à± దిగà±à°®à°¤à°¯à±à°¯à°¿à°‚ది|à°šà°¿à°Ÿà±à°Ÿà°¾ పదà±à°¦à±à°²à± దిగà±à°®à°¤à°¯à±à°¯à°¾à°¯à°¿}}.',
'importfailed' => 'దిగà±à°®à°¤à°¿ కాలేదà±: $1',
'importunknownsource' => 'దిగà±à°®à°¤à°¿ చేసà±à°•à±à°‚à°Ÿà±à°¨à±à°¨ దాని మాతృక à°°à°•à°‚ తెలియదà±',
'importcantopen' => 'దిగà±à°®à°¤à°¿ చేయబోతà±à°¨à±à°¨ ఫైలà±à°¨à± తెరవలేకపోతà±à°¨à±à°¨à°¾à°¨à±',
@@ -2502,8 +2571,8 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'tooltip-search-go' => 'ఇదే పేరà±à°¤à±‹ పేజీ ఉంటే à°…à°•à±à°•à°¡à°¿à°•à°¿ తీసà±à°•à±†à°³à±à°³à±',
'tooltip-search-fulltext' => 'పేజీలలో à°ˆ పాఠà±à°¯à°‚ కొరకౠవెతà±à°•à±',
'tooltip-p-logo' => 'మొదటి à°ªà±à°Ÿà°¨à± దరà±à°¶à°¿à°‚à°šà°‚à°¡à°¿',
-'tooltip-n-mainpage' => 'మొదటి à°ªà±à°Ÿà°¨à°¿ దరà±à°¶à°¿à°‚à°šà°‚à°¡à°¿',
-'tooltip-n-mainpage-description' => 'మొదటి à°ªà±à°Ÿà°¨à°¿ దరà±à°¶à°¿à°‚à°šà°‚à°¡à°¿',
+'tooltip-n-mainpage' => 'మొదటి పేజీని దరà±à°¶à°¿à°‚à°šà°‚à°¡à°¿',
+'tooltip-n-mainpage-description' => 'మొదటి పేజీని దరà±à°¶à°¿à°‚à°šà°‚à°¡à°¿',
'tooltip-n-portal' => 'à°ªà±à°°à°¾à°œà±†à°•à±à°Ÿà± à°—à±à°°à°¿à°‚à°šà°¿, మీరేం చేయవచà±à°šà±, సమాచారం à°Žà°•à±à°•à°¡ దొరà±à°•à±à°¤à±à°‚ది',
'tooltip-n-currentevents' => 'వరà±à°¤à°®à°¾à°¨ ఘటనలకౠసంబంధించిన సమాచారానà±à°¨à°¿ పొందండి.',
'tooltip-n-recentchanges' => 'వికీలో ఇటీవల జరిగిన మారà±à°ªà±à°² జాబితా.',
@@ -2540,6 +2609,8 @@ $1ని ఇపà±à°ªà°Ÿà°¿à°•à±‡ నిరోధించారà±. à°† à°…à°®à
'tooltip-rollback' => '"à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿" అనేది à°ˆ పేజీని చివరిగా మారà±à°šà°¿à°¨à°µà°¾à°°à°¿ మారà±à°ªà±à°²à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¸à±à°¤à±à°‚ది',
'tooltip-undo' => '"దిదà±à°¦à±à°¬à°¾à°Ÿà±à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿" à°ˆ మారà±à°ªà±à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¸à±à°¤à±à°‚ది మరియౠదిదà±à°¦à±à°¬à°¾à°Ÿà± ఫారానà±à°¨à°¿ à°®à±à°¨à±à°œà±‚à°ªà±à°²à±‹ తెరà±à°¸à±à°¤à±à°‚ది.
సారాంశానికి కారణానà±à°¨à°¿ చేరà±à°šà±‡ వీలà±à°•à°²à±à°ªà°¿à°¸à±à°¤à±à°‚ది',
+'tooltip-preferences-save' => 'à°…à°­à°¿à°°à±à°šà±à°²à°¨à± à°­à°¦à±à°°à°ªà°°à°šà±',
+'tooltip-summary' => 'à°šà°¿à°¨à±à°¨ సారాంశానà±à°¨à°¿ ఇవà±à°µà°‚à°¡à°¿',
# Metadata
'nodublincore' => 'à°¡à°¬à±à°²à°¿à°¨à± కోరౠRDF మెటాడేటానౠఈ సరà±à°µà°°à±à°•à± అశకà±à°¤à°‚ చేసాం.',
@@ -2645,14 +2716,17 @@ $1',
'imagemaxsize' => "బొమà±à°® పరిమాణంపై పరిమితి:<br />''(దసà±à°¤à±à°°à°ªà± వివరణ à°ªà±à°Ÿà°² కొరకà±)''",
'thumbsize' => 'నఖచితà±à°°à°‚ వైశాలà±à°¯à°‚:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|పేజీ|పేజీలà±}}',
-'file-info' => '(ఫైలౠపరిమాణం: $1, MIME రకం: $2)',
-'file-info-size' => '($1 × $2 పికà±à°¸à±†à°³à±à°³à±, ఫైలౠపరిమాణం: $3, MIME à°°à°•à°‚: $4)',
+'file-info' => 'ఫైలౠపరిమాణం: $1, MIME రకం: $2',
+'file-info-size' => '$1 × $2 పికà±à°¸à±†à°³à±à°³à±, ఫైలౠపరిమాణం: $3, MIME à°°à°•à°‚: $4',
'file-nohires' => '<small>మరింత à°¸à±à°ªà°·à±à°Ÿà°®à±ˆà°¨ బొమà±à°® లేదà±.</small>',
-'svg-long-desc' => '(SVG ఫైలà±, నామమాతà±à°°à°‚à°—à°¾ $1 × $2 పికà±à°¸à±†à°³à±à°³à±, ఫైలౠపరిమాణం: $3)',
+'svg-long-desc' => 'SVG ఫైలà±, నామమాతà±à°°à°‚à°—à°¾ $1 × $2 పికà±à°¸à±†à°³à±à°³à±, ఫైలౠపరిమాణం: $3',
'show-big-image' => 'అసలౠపరిమాణం',
'show-big-image-thumb' => '<small>à°ˆ à°®à±à°¨à±à°œà±‚పౠసైజà±: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'లూపà±à°²à±‹ పడింది',
'file-info-gif-frames' => '$1 {{PLURAL:$1|à°«à±à°°à±‡à°®à±|à°«à±à°°à±‡à°®à±à°²à±}}',
+'file-info-png-looped' => 'à°ªà±à°¨à°°à°¾à°µà±ƒà°¤à°®à°µà±à°¤à±à°‚ది',
+'file-info-png-repeat' => '{{PLURAL:$1|ఒకసారి|$1 సారà±à°²à±}} ఆడించారà±',
+'file-info-png-frames' => '$1 {{PLURAL:$1|à°«à±à°°à±‡à°®à±|à°«à±à°°à±‡à°®à±à°²à±}}',
# Special:NewFiles
'newimages' => 'కొతà±à°¤ ఫైళà±à°³ కొలà±à°µà±',
@@ -2807,6 +2881,7 @@ $1',
'exif-gpsareainformation' => 'GPS à°ªà±à°°à°¦à±‡à°¶à°‚ యొకà±à°• పేరà±',
'exif-gpsdatestamp' => 'GPS తేదీ',
'exif-gpsdifferential' => 'GPS తేడా సవరణ',
+'exif-objectname' => 'పొటà±à°Ÿà°¿ శీరà±à°·à°¿à°•',
# EXIF attributes
'exif-compression-1' => 'à°•à±à°¦à°¿à°‚చని',
@@ -2888,6 +2963,8 @@ $1',
'exif-sensingmethod-7' => 'à°¤à±à°°à°¿à°¸à°°à°³à°°à±‡à°–à°¾ సెనà±à°¸à°°à±',
'exif-sensingmethod-8' => 'వరà±à°£ à°…à°¨à±à°•à±à°°à°® రేఖా సెనà±à°¸à°°à±',
+'exif-filesource-3' => 'సాంఖà±à°¯à±€à°• సాధారణ కెమెరా',
+
'exif-scenetype-1' => 'à°Žà°Ÿà±à°µà°‚à°Ÿà°¿ హంగà±à°²à±‚ లేకà±à°‚à°¡à°¾ ఫొటోతీయబడిన బొమà±à°®',
'exif-customrendered-0' => 'సాధారణ à°ªà±à°°à°•à±à°°à°¿à°¯',
@@ -2964,27 +3041,27 @@ $1',
'limitall' => 'à°…à°¨à±à°¨à±€',
# E-mail address confirmation
-'confirmemail' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరించండి',
-'confirmemail_noemail' => '[[Special:Preferences|మీ à°…à°­à°¿à°°à±à°šà±à°²à°²à±‹]] ఈమెయిలౠఅడà±à°°à°¸à± పెటà±à°Ÿà°¿ లేదà±.',
-'confirmemail_text' => '{{SITENAME}}లో à°ˆ-మెయిలౠఅంశాలà±à°¨à°¿ వాడà±à°•à±à°¨à±‡ à°®à±à°‚దౠమీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à± నిరà±à°§à°¾à°°à°¿à°‚చవలసిన అవసరం ఉంది.
+'confirmemail' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరించండి',
+'confirmemail_noemail' => '[[Special:Preferences|మీ à°…à°­à°¿à°°à±à°šà±à°²à°²à±‹]] ఈమెయిలౠఅడà±à°°à°¸à± పెటà±à°Ÿà°¿ లేదà±.',
+'confirmemail_text' => '{{SITENAME}}లో à°ˆ-మెయిలౠఅంశాలà±à°¨à°¿ వాడà±à°•à±à°¨à±‡ à°®à±à°‚దౠమీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à± నిరà±à°§à°¾à°°à°¿à°‚చవలసిన అవసరం ఉంది.
కింది మీటనౠనొకà±à°•à°—ానే మీరిచà±à°šà°¿à°¨ à°šà°¿à°°à±à°¨à°¾à°®à°¾à°•à± ధృవీకరణ మెయిలౠవెళà±à°¤à±à°‚ది. à°† మెయిలà±à°²à±‹ à°’à°• సంకేతం కలిగిన à°’à°• లింకౠఉంటà±à°‚ది; à°† లింకà±à°¨à± మీ à°¬à±à°°à±Œà°œà°°à±à°²à±‹ తెరవండి. à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరణ అయిపోతà±à°‚ది.',
-'confirmemail_pending' => 'à°’à°• నిరà±à°§à°¾à°°à°£ కోడà±à°¨à°¿ మీకౠఇపà±à°ªà°Ÿà°¿à°•à±‡ à°ˆ-మెయిలà±à°²à±‹ పంపించాం; కొదà±à°¦à°¿à°¸à±‡à°ªà°Ÿà°¿ à°•à±à°°à°¿à°¤à°®à±‡ మీ ఖాతా సృషà±à°Ÿà°¿à°‚à°šà°¿ ఉంటే, కొతà±à°¤ కొడౠకోసం à°…à°­à±à°¯à°°à±à°¥à°¨ పంపేమà±à°‚దౠకొదà±à°¦à°¿ నిమిషాలౠవేచిచూడండి.',
-'confirmemail_send' => 'à°’à°• ధృవీకరణ సంకేతానà±à°¨à°¿ పంపించà±',
-'confirmemail_sent' => 'ధృవీకరణ à°ˆ-మెయిలà±à°¨à± పంపబడినది',
-'confirmemail_oncreate' => 'మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°•à°¿ à°’à°• ధృవీకరణ సంకేతానà±à°¨à°¿ పంపించాం.
+'confirmemail_pending' => 'à°’à°• నిరà±à°§à°¾à°°à°£ కోడà±à°¨à°¿ మీకౠఇపà±à°ªà°Ÿà°¿à°•à±‡ à°ˆ-మెయిలà±à°²à±‹ పంపించాం; కొదà±à°¦à°¿à°¸à±‡à°ªà°Ÿà°¿ à°•à±à°°à°¿à°¤à°®à±‡ మీ ఖాతా సృషà±à°Ÿà°¿à°‚à°šà°¿ ఉంటే, కొతà±à°¤ కొడౠకోసం à°…à°­à±à°¯à°°à±à°¥à°¨ పంపేమà±à°‚దౠకొదà±à°¦à°¿ నిమిషాలౠవేచిచూడండి.',
+'confirmemail_send' => 'à°’à°• ధృవీకరణ సంకేతానà±à°¨à°¿ పంపించà±',
+'confirmemail_sent' => 'ధృవీకరణ à°ˆ-మెయిలà±à°¨à± పంపబడినది',
+'confirmemail_oncreate' => 'మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°•à°¿ à°’à°• ధృవీకరణ సంకేతానà±à°¨à°¿ పంపించాం.
లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚చేందà±à°•à± à°† సంకేతం అవసరంలేదà±, కానీ à°ˆ వికీలో à°ˆ-మెయిలౠఆధారిత సౌలభà±à°¯à°¾à°²à°¨à± చేతనం చేసేమà±à°‚దౠదానà±à°¨à°¿ ఇవà±à°µà°µà°²à°¸à°¿ ఉంటà±à°‚ది.',
-'confirmemail_sendfailed' => '{{SITENAME}} మీ నిరà±à°§à°¾à°°à°£ మెయిలà±à°¨à°¿ పంపలేకపోయింది.
+'confirmemail_sendfailed' => '{{SITENAME}} మీ నిరà±à°§à°¾à°°à°£ మెయిలà±à°¨à°¿ పంపలేకపోయింది.
మీ ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°²à±‹ తపà±à°ªà±à°²à±à°¨à±à°¨à°¾à°¯à±‡à°®à±‹ సరిచూసà±à°•à±‹à°‚à°¡à°¿.
మెయిలరౠఇలా చెపà±à°ªà°¿à°‚ది: $1',
-'confirmemail_invalid' => 'ధృవీకరణ సంకేతం సరైనది కాదà±. దానికి కాలం చెలà±à°²à°¿ ఉండవచà±à°šà±.',
-'confirmemail_needlogin' => 'మీ ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ దృవపరచటానికి మీరౠ$1 ఉండాలి.',
-'confirmemail_success' => 'మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరించబడింది.
+'confirmemail_invalid' => 'ధృవీకరణ సంకేతం సరైనది కాదà±. దానికి కాలం చెలà±à°²à°¿ ఉండవచà±à°šà±.',
+'confirmemail_needlogin' => 'మీ ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ దృవపరచటానికి మీరౠ$1 ఉండాలి.',
+'confirmemail_success' => 'మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరించబడింది.
ఇక [[Special:UserLogin|లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿]] వికీని à°…à°¸à±à°µà°¾à°¦à°¿à°‚à°šà°‚à°¡à°¿.',
-'confirmemail_loggedin' => 'మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ఇపà±à°ªà±à°¡à± రూఢి అయింది.',
-'confirmemail_error' => 'మీ ధృవీకరణనౠభదà±à°°à°ªà°°à°šà°¡à°‚లో à°à°¦à±‹ లోపం జరిగింది.',
-'confirmemail_subject' => '{{SITENAME}} à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరణ',
-'confirmemail_body' => '$1 à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ à°¨à±à°‚à°¡à°¿ ఎవరో, బహà±à°¶à°¾ మీరే,
+'confirmemail_loggedin' => 'మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ఇపà±à°ªà±à°¡à± రూఢి అయింది.',
+'confirmemail_error' => 'మీ ధృవీకరణనౠభదà±à°°à°ªà°°à°šà°¡à°‚లో à°à°¦à±‹ లోపం జరిగింది.',
+'confirmemail_subject' => '{{SITENAME}} à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరణ',
+'confirmemail_body' => '$1 à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ à°¨à±à°‚à°¡à°¿ ఎవరో, బహà±à°¶à°¾ మీరే,
{{SITENAME}}లో "$2" అనే ఖాతాని à°ˆ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¤à±‹ నమోదà±à°šà±‡à°¸à±à°•à±à°¨à±à°¨à°¾à°°à±.
à°† ఖాతా నిజంగా మీదే అని నిరà±à°§à°¾à°°à°¿à°‚చేందà±à°•à± మరియౠ{{SITENAME}}లో à°ˆ-మెయిలౠసౌలభà±à°¯à°¾à°²à°¨à°¿
@@ -2997,8 +3074,22 @@ $3
$5
à°ˆ నిరà±à°§à°¾à°°à°£à°¾ సంకేతం $4à°•à°¿ కాలంచెలà±à°²à±à°¤à±à°‚ది.',
-'confirmemail_invalidated' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ నిరà±à°§à°¾à°°à°£à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¸à°¾à°‚',
-'invalidateemail' => 'à°ˆ-మెయిలౠనిరà±à°§à°¾à°°à°£à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¯à°‚à°¡à°¿',
+'confirmemail_body_changed' => '$1 à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ à°¨à±à°‚à°¡à°¿ ఎవరో, బహà±à°¶à°¾ మీరే,
+{{SITENAME}}లో "$2" అనే ఖాతా యొకà±à°• à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ à°ˆ à°šà°¿à°°à±à°¨à°¾à°®à°¾à°•à°¿ మారà±à°šà°¾à°°à±.
+
+à°† ఖాతా నిజంగా మీదే అని నిరà±à°§à°¾à°°à°¿à°‚చేందà±à°•à± మరియౠ{{SITENAME}}లో
+à°ˆ-మెయిలౠసౌలభà±à°¯à°¾à°²à°¨à°¿ à°ªà±à°¨à°ƒà°šà±‡à°¤à°¨à°‚ చేసà±à°•à±à°¨à±‡à°‚à°¦à±à°•à±, à°ˆ లంకెని మీ విహారిణిలో తెరవండి:
+
+$3
+
+ఒకవేళ à°† ఖాతా మీది *కాకపోతే*, à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ నిరà±à°§à°¾à°°à°£à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¸à±‡à°‚à°¦à±à°•à±
+à°ˆ లంకెని à°…à°¨à±à°¸à°°à°¿à°‚à°šà°‚à°¡à°¿:
+
+$5
+
+à°ˆ నిరà±à°§à°¾à°°à°£à°¾ సంకేతం $4à°•à°¿ కాలంచెలà±à°²à±à°¤à±à°‚ది.',
+'confirmemail_invalidated' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ నిరà±à°§à°¾à°°à°£à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¸à°¾à°‚',
+'invalidateemail' => 'à°ˆ-మెయిలౠనిరà±à°§à°¾à°°à°£à°¨à°¿ à°°à°¦à±à°¦à±à°šà±‡à°¯à°‚à°¡à°¿',
# Scary transclusion
'scarytranscludedisabled' => '[ఇతరవికీల మూసలనౠఇకà±à°•à°¡ వాడటానà±à°¨à°¿ à°…à°¨à±à°®à°¤à°¿à°‚à°šà°Ÿà°‚ లేదà±]',
@@ -3034,9 +3125,10 @@ $1',
'descending_abbrev' => 'అవరోహణ',
'table_pager_next' => 'తరà±à°µà°¾à°¤à°¿ పేజీ',
'table_pager_prev' => 'à°®à±à°‚దరి పేజీ',
-'table_pager_first' => 'మొదటి à°ªà±à°Ÿ',
+'table_pager_first' => 'మొదటి పేజీ',
'table_pager_last' => 'చివరి పేజీ',
'table_pager_limit' => 'పేజీకి $1 అంశాలనౠచూపించà±',
+'table_pager_limit_label' => 'పేజీకి à°Žà°¨à±à°¨à°¿ అంశాలà±:',
'table_pager_limit_submit' => 'వెళà±à°³à±',
'table_pager_empty' => 'ఫలితాలౠలేవà±',
@@ -3092,6 +3184,7 @@ $1',
'version-specialpages' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీలà±',
'version-parserhooks' => 'పారà±à°¸à°°à± కొకà±à°•à°¾à°²à±',
'version-variables' => 'చరరాశà±à°²à±',
+'version-skins' => 'అలంకారాలà±',
'version-other' => 'ఇతర',
'version-mediahandlers' => 'మీడియానౠఫైళà±à°²à°¨à± నడిపించే పొడిగింపà±à°²à±',
'version-hooks' => 'కొకà±à°•à°¾à°²à±',
@@ -3103,6 +3196,13 @@ $1',
'version-hook-subscribedby' => 'ఉపయోగిసà±à°¤à±à°¨à±à°¨à°µà°¿',
'version-version' => '(సంచిక $1)',
'version-license' => 'లైసెనà±à°¸à±',
+'version-poweredby-credits' => "à°ˆ వికీ '''[http://www.mediawiki.org/ మీడియావికీ]'''చే శకà±à°¤à°¿à°®à°‚తం, కాపీహకà±à°•à±à°²à± © 2001-$1 $2.",
+'version-poweredby-others' => 'ఇతరà±à°²à±',
+'version-license-info' => 'మీడియావికీ à°…à°¨à±à°¨à°¦à°¿ à°¸à±à°µà±‡à°šà±à°›à°¾ మృదూపకరణం; మీరౠదీనà±à°¨à°¿ à°ªà±à°¨à°ƒà°ªà°‚పిణీ చేయవచà±à°šà± మరియà±/లేదా à°«à±à°°à±€ సాఫà±à°Ÿà±&zwnj;వేరౠఫౌండేషనౠపà±à°°à°šà±à°°à°¿à°‚à°šà°¿à°¨ à°—à±à°¨à±‚ జనరలౠపబà±à°²à°¿à°•à± లైసెసà±à°¸à± వెరà±à°·à°¨à± 2 లేదా (మీ ఎంపిక à°ªà±à°°à°•à°¾à°°à°‚) అంతకంటే కొతà±à°¤ వెరà±à°·à°¨à± యొకà±à°• నియమాలకౠలోబడి మారà±à°šà±à°•à±‹à°µà°šà±à°šà±.
+
+మీడియావికీ à°ªà±à°°à°œà±‹à°ªà°¯à±‹à°— ఆకాంకà±à°·à°¤à±‹ పంపిణీ చేయబడà±à°¤à±à°‚ది, కానీ à°Žà°Ÿà±à°µà°‚à°Ÿà°¿ వారంటీ లేకà±à°‚à°¡à°¾; కనీసం à°à°¦à±ˆà°¨à°¾ à°ªà±à°°à°¤à±à°¯à±‡à°• ఉదà±à°¦à±‡à°¶à°¾à°¨à°¿à°•à°¿ సరిపడà±à°¤à±à°‚దని గానీ లేదా వసà±à°¤à±à°¤à±à°µà°‚ యొకà±à°• అంతరà±à°¨à°¿à°¹à°¿à°¤ వారంటీ లేకà±à°‚à°¡à°¾. మరినà±à°¨à°¿ వివరాలకౠగà±à°¨à±‚ జనరలౠపబà±à°²à°¿à°•à± లైసెనà±à°¸à±à°¨à°¿ చూడండి.
+
+à°ˆ ఉపకరణంతో పాటౠమీకౠ[{{SERVER}}{{SCRIPTPATH}}/COPYING à°—à±à°¨à±‚ జనరలౠపబà±à°²à°¿à°•à± లైసెనà±à°¸à± యొకà±à°• à°’à°• కాపీ] అందివà±à°‚డాలి; లేకపోతే, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à°…à°¨à±à°¨ à°šà°¿à°°à±à°¨à°¾à°®à°¾à°•à°¿ à°µà±à°°à°¾à°¯à°‚à°¡à°¿ లేదా [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html జాలం లోనే చదవండి].',
'version-software' => 'à°ªà±à°°à°µà±‡à°¶à°ªà±†à°Ÿà±à°Ÿà°¿à°¨ సాఫà±à°Ÿà±à°µà±‡à°°à±à°²à±',
'version-software-product' => 'à°ªà±à°°à±‹à°¡à°•à±à°Ÿà±',
'version-software-version' => 'వెరà±à°·à°¨à±',
@@ -3127,7 +3227,7 @@ $1',
'fileduplicatesearch-result-n' => '"$1" అనే పేరà±à°—à°² ఫైలà±à°•à± {{PLURAL:$2|à°’à°• మారà±à°ªà±à°°à°¤à°¿ ఉంది|$2 మారà±à°ªà±à°°à°¤à±à°²à±à°¨à±à°¨à°¾à°¯à°¿}}.',
# Special:SpecialPages
-'specialpages' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• à°ªà±à°Ÿà°²à±',
+'specialpages' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీలà±',
'specialpages-note' => '----
* మామూలౠపà±à°°à°¤à±à°¯à±‡à°• పేజీలà±.
* <strong class="mw-specialpagerestricted">నియంతà±à°°à°¿à°¤ à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీలà±.</strong>',
@@ -3171,6 +3271,15 @@ $1',
'tags-edit' => 'మారà±à°šà±',
'tags-hitcount' => '$1 {{PLURAL:$1|మారà±à°ªà±|మారà±à°ªà±à°²à±}}',
+# Special:ComparePages
+'comparepages' => 'à°ªà±à°Ÿà°² పోలిక',
+'compare-selector' => 'à°ªà±à°Ÿ కూరà±à°ªà±à°² పోలిక',
+'compare-page1' => 'à°ªà±à°Ÿ 1',
+'compare-page2' => 'à°ªà±à°Ÿ 2',
+'compare-rev1' => 'కూరà±à°ªà± 1',
+'compare-rev2' => 'కూరà±à°ªà± 2',
+'compare-submit' => 'పోలà±à°šà°¿à°šà±‚à°¡à±',
+
# Database error messages
'dberr-header' => 'à°ˆ వికీ సమసà±à°¯à°¾à°¤à±à°®à°•à°‚à°—à°¾ ఉంది',
'dberr-problems' => 'à°•à±à°·à°®à°¿à°‚à°šà°‚à°¡à°¿! à°ˆ సైటౠసాంకేతిక సమసà±à°¯à°²à°¨à°¿ à°Žà°¦à±à°°à±à°•à±Šà°‚à°Ÿà±à°‚ది.',
@@ -3187,8 +3296,13 @@ $1',
'htmlform-float-invalid' => 'మీరిచà±à°šà°¿à°¨ విలà±à°µ à°’à°• సంఖà±à°¯ కాదà±.',
'htmlform-int-toolow' => 'మీరిచà±à°šà°¿à°¨ విలà±à°µ $1 యొకà±à°• కనిషà±à°  విలà±à°µ కంటే తకà±à°•à±à°µà°—à°¾ ఉంది.',
'htmlform-int-toohigh' => 'మీరిచà±à°šà°¿à°¨ విలà±à°µ $1 యొకà±à°• à°—à°°à°¿à°·à±à°  విలà±à°µà°•à°‚టే à°Žà°•à±à°•à°µà°—à°¾ ఉంది.',
+'htmlform-required' => 'à°ˆ విలà±à°µ తపà±à°ªà°¨à°¿à°¸à°°à°¿',
'htmlform-submit' => 'దాఖలà±à°šà±†à°¯à±à°¯à°¿',
'htmlform-reset' => 'మారà±à°ªà±à°²à°¨à± à°°à°¦à±à°¦à±à°šà±†à°¯à±à°¯à°¿',
'htmlform-selectorother-other' => 'ఇతర',
+# SQLite database support
+'sqlite-has-fts' => '$1 పూరà±à°¤à°¿-పాఠà±à°¯ à°…à°¨à±à°µà±‡à°·à°£ తోడà±à°ªà°¾à°Ÿà±à°¤à±‹',
+'sqlite-no-fts' => '$1 పూరà±à°¤à°¿-పాఠà±à°¯ à°…à°¨à±à°µà±‡à°·à°£ తోడà±à°ªà°¾à°Ÿà± లేకà±à°‚à°¡à°¾',
+
);
diff --git a/languages/messages/MessagesTet.php b/languages/messages/MessagesTet.php
index 7d38545a..60a1cfab 100644
--- a/languages/messages/MessagesTet.php
+++ b/languages/messages/MessagesTet.php
@@ -38,35 +38,36 @@ $namespaceAliases = array(
$specialPageAliases = array(
'CreateAccount' => array( 'Rejista' ),
'Preferences' => array( 'Preferénsia' ),
- 'Watchlist' => array( 'Lista hateke' ),
- 'Recentchanges' => array( 'Mudansa foufoun sira' ),
- 'Upload' => array( 'Tau iha arkivu laran' ),
- 'Listfiles' => array( 'Lista imajen' ),
- 'Newimages' => array( 'Imajen foun' ),
- 'Listusers' => array( 'Lista uza-na\'in' ),
+ 'Watchlist' => array( 'Lista_hateke' ),
+ 'Recentchanges' => array( 'Mudansa_foufoun_sira' ),
+ 'Upload' => array( 'Tau_iha_arkivu_laran' ),
+ 'Listfiles' => array( 'Lista_imajen' ),
+ 'Newimages' => array( 'Imajen_foun' ),
+ 'Listusers' => array( 'Lista_uza-na\'in' ),
'Statistics' => array( 'Estatístika' ),
- 'Randompage' => array( 'Pájina ruma' ),
- 'Shortpages' => array( 'Pájina badak' ),
- 'Longpages' => array( 'Pájina naruk' ),
- 'Protectedpages' => array( 'Pájina sira-ne\'ebé proteje tiha' ),
- 'Allpages' => array( 'Pájina hotu' ),
- 'Ipblocklist' => array( 'Lista ema sira-ne\'ebé blokeiu tiha' ),
- 'Specialpages' => array( 'Pájina espesiál sira' ),
+ 'Randompage' => array( 'Pájina_ruma' ),
+ 'Shortpages' => array( 'Pájina_badak' ),
+ 'Longpages' => array( 'Pájina_naruk' ),
+ 'Protectedpages' => array( 'Pájina_sira-ne\'ebé_proteje_tiha' ),
+ 'Allpages' => array( 'Pájina_hotu' ),
+ 'Ipblocklist' => array( 'Lista_ema_sira-ne\'ebé_blokeiu_tiha' ),
+ 'Specialpages' => array( 'Pájina_espesiál_sira' ),
'Contributions' => array( 'Kontribuisaun' ),
- 'Emailuser' => array( 'Haruka korreiu eletróniku' ),
- 'Whatlinkshere' => array( 'Pájina sira ne\'ebé bá iha ne\'e' ),
+ 'Emailuser' => array( 'Haruka_korreiu_eletróniku' ),
+ 'Whatlinkshere' => array( 'Pájina_sira_ne\'ebé_bá_iha_ne\'e' ),
'Movepage' => array( 'Book' ),
'Categories' => array( 'Kategoria' ),
'Export' => array( 'Esporta' ),
'Version' => array( 'Versaun' ),
- 'Allmessages' => array( 'Mensajen hotu' ),
+ 'Allmessages' => array( 'Mensajen_hotu' ),
'Blockip' => array( 'Blokeiu' ),
'Undelete' => array( 'Restaurar' ),
- 'Userrights' => array( 'Kuana', 'Priviléjiu' ),
- 'Mypage' => array( 'Ha\'u-nia pájina' ),
- 'Listadmins' => array( 'Lista administradór' ),
+ 'Import' => array( 'Importa' ),
+ 'Userrights' => array( 'Priviléjiu' ),
+ 'Mypage' => array( 'Ha\'u-nia_pájina' ),
+ 'Listadmins' => array( 'Lista_administradór' ),
'Search' => array( 'Buka' ),
- 'Withoutinterwiki' => array( 'Laiha interwiki' ),
+ 'Withoutinterwiki' => array( 'Laiha_interwiki' ),
);
$messages = array(
@@ -144,7 +145,7 @@ $messages = array(
'dec' => 'Dez.',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategoría|Kategoría}}',
+'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoria}}',
'category_header' => 'Artigu iha kategoría "$1"',
'subcategories' => 'Sub-kategoria sira',
'category-empty' => "''Kategoria ne'e agora la iha pájina sira.''",
@@ -170,7 +171,9 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-view-edit' => 'Edita',
+'vector-view-create' => 'Kria',
+'vector-view-edit' => 'Edita',
+'vector-view-history' => 'Haree istória',
'errorpagetitle' => 'Sala',
'returnto' => 'Fali ba $1.',
@@ -194,7 +197,7 @@ $messages = array(
'deletethispage' => "Halakon pájina ne'e",
'undelete_short' => 'Restaurar {{PLURAL:$1|versaun ida|versaun $1}}',
'protect' => 'Proteje',
-'protect_change' => 'filak',
+'protect_change' => 'muda',
'protectthispage' => "Proteje pájina ne'e",
'unprotect' => 'La proteje',
'unprotectthispage' => "La proteje pájina ne'e",
@@ -213,7 +216,7 @@ $messages = array(
'categorypage' => 'Haree pájina kategoría nian',
'viewtalkpage' => 'Haree diskusaun',
'otherlanguages' => 'Iha lian seluk',
-'lastmodifiedat' => "Muda ikus pájina ne'e nian iha $1, $2.",
+'lastmodifiedat' => "Mudansa ba dala ikus pájina ne'e nian iha $1, $2.",
'protectedpage' => 'Pájina maka ema ruma proteje tiha',
'jumpto' => 'Bá:',
'jumptonavigation' => 'hatudu-dalan',
@@ -240,7 +243,7 @@ $messages = array(
'badaccess' => 'Ita la iha permisaun...',
'badaccess-group0' => "Ó la bele halo ne'e.",
-'badaccess-groups' => "Ba halo ne'e tenke iha {{PLURAL:$2|lubu|lubu ida husi}} $1.",
+'badaccess-groups' => "De'it uza-na'in sira-ne'ebé iha {{PLURAL:$2|grupu|grupu ida husi}} $1 bele halo ne'e.",
'versionrequired' => 'Presiza MediaWiki versaun $1',
'versionrequiredtext' => "Presiza MediaWiki versaun $1 ba uza pájina ne'e. Haree [[Special:Version|pájina versaun]].",
@@ -293,8 +296,8 @@ Lista ida pájina espesiál nian [[Special:SpecialPages|iha ne'e]].",
# Login and logout pages
'welcomecreation' => "== Loron di'ak, $1! ==
-Ó kria konta ó-nia.
-La haluha filak ó-nia [[Special:Preferences|preferénsia]].",
+Agora Ita iha konta iha ne'e.
+La haluha muda Ita-nia [[Special:Preferences|preferénsia]].",
'yourname' => "Naran uza-na'in:",
'login' => 'Log in',
'nav-login-createaccount' => 'Log in / kriar konta ida',
@@ -318,15 +321,18 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'resetpass_text' => "<!-- Hakerek testu iha ne'e -->",
# Edit page toolbar
-'link_tip' => 'Ligasaun ba laran',
-'extlink_tip' => "Ligasaun ba li'ur (tau tan http://)",
-'image_sample' => 'Ezemplu.jpg',
-'media_sample' => 'Ezemplu.ogg',
+'link_tip' => 'Ligasaun ba laran',
+'extlink_sample' => "http://www.example.com ligasaun ba li'ur",
+'extlink_tip' => "Ligasaun ba li'ur (tau tan http://)",
+'image_sample' => 'Ezemplu.jpg',
+'media_sample' => 'Ezemplu.ogg',
+'sig_tip' => 'Ita-nia asinatura ho data/oras',
# Edit pages
+'summary' => 'Rezumu:',
'minoredit' => "Ne'e muda ki'ik",
'watchthis' => "Hateke pájina ne'e",
-'savearticle' => 'Filak pájina',
+'savearticle' => 'Muda pájina',
'showdiff' => 'Hatudu diferensa sira',
'anoneditwarning' => 'Ó lá\'os "log-in" iha momentu.',
'blockedtitle' => "Uza-na'in la bele edita (blokeiu)",
@@ -372,10 +378,15 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'history-feed-item-nocomment' => '$1 iha $2',
# Revision deletion
-'rev-delundel' => 'hatudu/subar',
-'revisiondelete' => 'Halakon/restaurar versaun',
-'revdelete-hide-user' => "Subar naran edita-na'in/IP",
-'revdelete-edit-reasonlist' => 'Edita lista motivu nian',
+'rev-delundel' => 'hatudu/subar',
+'revisiondelete' => 'Halakon/restaurar versaun',
+'revdelete-show-file-submit' => 'Sin',
+'revdelete-hide-user' => "Subar naran edita-na'in/IP",
+'revdelete-radio-set' => 'Sin',
+'revdelete-radio-unset' => 'Lae',
+'revdelete-uname' => "naran uza-na'in",
+'revdelete-hid' => 'subar $1',
+'revdelete-edit-reasonlist' => 'Edita lista motivu nian',
# Diffs
'lineno' => 'Liña $1:',
@@ -393,6 +404,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'searchall' => 'hotu',
'powersearch' => 'Buka',
'powersearch-field' => 'Buka',
+'powersearch-toggleall' => 'Hotu',
# Preferences page
'preferences' => 'Preferénsia',
@@ -461,9 +473,9 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'right-userrights-interwiki' => "Edita priviléjiu uza-na'in iha wiki seluk sira",
# User rights log
-'rightslog' => "Lista filak priviléjiu uza-na'in",
-'rightslogtext' => "Ne'e lista ba filak lubu uza-na'in.",
-'rightslogentry' => 'filak lubu $1 nian husi $2 ba $3',
+'rightslog' => "Lista mudansa priviléjiu uza-na'in",
+'rightslogtext' => "Ne'e lista mudansa priviléjiu uza-na'in sira nian.",
+'rightslogentry' => 'muda grupu $1 nian husi $2 ba $3',
'rightsnone' => '(mamuk)',
# Associated actions - in the sentence "You do not have permission to X"
@@ -503,9 +515,10 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'recentchangeslinked-page' => 'Naran pájina nian:',
# Upload
-'upload' => 'Tau iha arkivu laran',
-'uploadbtn' => 'Tau iha arkivu laran',
-'watchthisupload' => "Hateke pájina ne'e",
+'upload' => 'Tau iha arkivu laran',
+'uploadbtn' => 'Tau iha arkivu laran',
+'fileuploadsummary' => 'Rezumu:',
+'watchthisupload' => "Hateke pájina ne'e",
'license' => 'Lisensa:',
'license-header' => 'Lisensa:',
@@ -539,7 +552,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'randompage' => 'Pájina ruma',
# Statistics
-'statistics' => 'Estátistika',
+'statistics' => 'Estatístika',
'brokenredirects-edit' => 'edita',
'brokenredirects-delete' => 'halakon',
@@ -614,10 +627,9 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
# Watchlist
'watchlist' => "Ha'u-nia lista hateke",
'mywatchlist' => "Ha'u-nia lista hateke",
-'watchlistfor' => "('''$1''' nian)",
'addedwatch' => 'tau tan tiha ba lista hateke',
'removedwatch' => 'La hateke pájina ona',
-'removedwatchtext' => 'La hateke pájina "[[:$1]]" ona.',
+'removedwatchtext' => 'La hateke pájina "[[:$1]]" ona (haree [[Special:Watchlist|"lista hateke"]]).',
'watch' => 'Hateke',
'watchthispage' => "Hateke pájina ne'e",
'unwatch' => 'La hateke ona',
@@ -630,8 +642,9 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'enotif_newpagetext' => "Ne'e pájina foun.",
'enotif_impersonal_salutation' => "Uza-na'in {{SITENAME}} nian",
-'changed' => 'filak',
-'created' => 'kria',
+'changed' => 'muda ona',
+'created' => 'kria ona',
+'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED pájina $PAGETITLE iha {{SITENAME}}',
# Delete
'deletepage' => 'Halakon pájina',
@@ -663,7 +676,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'protect-otherreason' => 'Motivu seluk/ida tan:',
'protect-otherreason-op' => 'Motivu seluk',
'protect-edit-reasonlist' => 'Edita lista motivu nian',
-'protect-expiry-options' => '1 hour:1 hours,1 loron:1 day,1 semana:1 week,2 semana:2 weeks,1 fulan:1 month,3 fulan:3 months,6 fulan:6 months,1 tinan:1 year,infinite:infinite',
+'protect-expiry-options' => '1 oras:1 hour,1 loron:1 day,1 semana:1 week,2 semana:2 weeks,1 fulan:1 month,3 fulan:3 months,6 fulan:6 months,1 tinan:1 year,infinite:infinite',
'restriction-type' => 'Permisaun:',
# Restrictions (nouns)
@@ -672,13 +685,15 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'restriction-create' => 'Kria',
# Undelete
-'undelete' => 'Haree pájina halakon tiha',
-'undeletebtn' => 'Restaurar',
-'undeletelink' => 'lee/restaurar',
-'undeletecomment' => 'Razaun:',
-'undeletedarticle' => 'restaurar "[[$1]]"',
-'undeletedrevisions' => 'restaurar {{PLURAL:$1|versaun|versaun}} $1',
-'undelete-search-submit' => 'Buka',
+'undelete' => 'Haree pájina halakon tiha',
+'undeletebtn' => 'Restaurar',
+'undeletelink' => 'lee/restaurar',
+'undeleteviewlink' => 'haree',
+'undeletecomment' => 'Razaun:',
+'undeletedarticle' => 'restaurar "[[$1]]"',
+'undeletedrevisions' => 'restaurar {{PLURAL:$1|versaun|versaun}} $1',
+'undelete-search-submit' => 'Buka',
+'undelete-show-file-submit' => 'Sin',
# Namespace form on various pages
'namespace' => 'Espasu pájina nian:',
@@ -751,13 +766,18 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'export' => 'Esporta pájina sira',
'export-submit' => 'Esporta',
'export-addcat' => 'Tau tan',
+'export-addns' => 'Tau tan',
# Namespace 8 related
-'allmessagesname' => 'Naran',
-'allmessagescurrent' => 'Testu atuál',
+'allmessagesname' => 'Naran',
+'allmessagescurrent' => 'Testu atuál',
+'allmessages-filter-all' => 'Hotu',
+'allmessages-language' => 'Lian:',
# Special:Import
-'import-comment' => 'Komentáriu:',
+'import-interwiki-submit' => 'Importa',
+'import-comment' => 'Komentáriu:',
+'import-revision-count' => '{{PLURAL:$1|versaun ida|versaun $1}}',
# Import log
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versaun|versaun}} husi $2',
@@ -770,7 +790,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'tooltip-pt-login' => 'Ami rekomenda identifikasaun ("log in"), maibé Ita-Boot la presiza halo ne\'e',
'tooltip-pt-logout' => 'Husik',
'tooltip-ca-talk' => 'Diskusaun kona-ba konteúdu pájina nian',
-'tooltip-ca-edit' => "Ó bele filak pájina ne'e. Please use the preview button before saving.",
+'tooltip-ca-edit' => "Ita bele edita pájina ne'e. Please use the preview button before saving.",
'tooltip-ca-addsection' => 'Tau tan seksaun foun ida.',
'tooltip-ca-viewsource' => "Ema ruma proteje tiha pájina ne'e.
Ó bele lee testu.",
@@ -803,7 +823,9 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'tooltip-watch' => 'Tau pájina ne\'e ba Ita-nia "lista hateke"',
# Attribution
-'lastmodifiedatby' => "$3 filak ikus pájina ne'e iha $1, $2.",
+'siteuser' => "uza-na'in {{SITENAME}} nian $1",
+'lastmodifiedatby' => "Pájina ne'e $3 mak muda ba dala ikus iha $1, $2.",
+'siteusers' => "{{PLURAL:$2|uza-na'in|uza-na'in}} {{SITENAME}} nian $1",
# Skin names
'skinname-standard' => 'Klásiku',
@@ -823,10 +845,16 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'ilsubmit' => 'Buka',
# EXIF tags
+'exif-make' => 'Fabrikante kámara nian',
+'exif-model' => 'Kámara',
'exif-artist' => 'Autór',
+'exif-flash' => 'Flax',
'exif-meteringmode-255' => 'Seluk',
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'km iha oras',
+
# External editor support
'edit-externally-help' => "(Haree [http://www.mediawiki.org/wiki/Manual:External_editors iha ne'e] ba informasaun barak liu)",
@@ -836,6 +864,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'watchlistall2' => 'hotu',
'namespacesall' => 'hotu',
'monthsall' => 'hotu',
+'limitall' => 'hotu',
# action=purge
'confirm_purge_button' => 'OK',
@@ -855,7 +884,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'autosumm-new' => "Pájina foun: '$1'",
# Watchlist editor
-'watchlistedit-normal-title' => 'Filak lista hateke',
+'watchlistedit-normal-title' => 'Edita lista hateke',
'watchlistedit-raw-titles' => 'Títulu sira:',
'watchlistedit-raw-added' => '{{PLURAL:$1|Títulu ida|Títulu $1}} tau tan tiha:',
'watchlistedit-raw-removed' => '{{PLURAL:$1|Títulu ida|Títulu $1}} hasai tiha:',
@@ -872,6 +901,9 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'version-software-product' => 'Produtu',
'version-software-version' => 'Versaun',
+# Special:FilePath
+'filepath-submit' => 'Bá',
+
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Buka',
@@ -886,4 +918,17 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
# Special:BlankPage
'blankpage' => 'Pájina mamuk',
+# Special:Tags
+'tags-edit' => 'edita',
+
+# Special:ComparePages
+'compare-page1' => 'Pájina 1',
+'compare-page2' => 'Pájina 2',
+'compare-rev1' => 'Versaun 1',
+'compare-rev2' => 'Versaun 2',
+'compare-submit' => 'Halo komparasaun',
+
+# Database error messages
+'dberr-header' => "Wiki ne'e iha problema",
+
);
diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php
index 98754a7e..9d8b5313 100644
--- a/languages/messages/MessagesTg_cyrl.php
+++ b/languages/messages/MessagesTg_cyrl.php
@@ -84,8 +84,7 @@ $messages = array(
'tog-editsection' => 'Иҷозат додани вироиши қиÑмати Ñаҳифа ба воÑитаи пайванди [вироиш]',
'tog-editsectiononrightclick' => 'Ба кор андохтани вироиши Ñарлавҳаҳои қиÑматҳо бо клики роÑÑ‚ (ҶаваСкрипт)',
'tog-showtoc' => 'Ðамоиши феҳриÑти мундариҷон (барои мақолаҳои бо беш аз 3 Ñарлавҳа)',
-'tog-rememberpassword' => 'Маро дар хотири компютер нигоҳ дор',
-'tog-editwidth' => 'ВаÑеъ кардани қуттии вироиш то ҳадде, ки тамоми Ñаҳифаро баргирад',
+'tog-rememberpassword' => 'Вуруди манро дар ин мурургар дар хотир нигоҳ дор (ҳадди акÑар то $1 {{PLURAL:$1|рӯз|рӯз}})',
'tog-watchcreations' => 'Дохил намудани Ñаҳифаҳое, ки ман Ñохтаам ба феҳриÑти назароти ман',
'tog-watchdefault' => 'Саҳифаҳои Ñҷодкардаамро ба феҳриÑти пайгириам илова кунед',
'tog-watchmoves' => 'Саҳифаҳои кӯчонидаамро ба феҳриÑти пайгириҳоÑм илова кунед',
@@ -230,31 +229,20 @@ $messages = array(
'faqpage' => 'Project:Саволҳои тез-тез пурÑидашуда',
# Vector skin
-'vector-action-addsection' => 'Иловаи унвон',
-'vector-action-delete' => 'Ҳазф',
-'vector-action-move' => 'Кӯчонидан',
-'vector-action-protect' => 'Муҳофизат',
-'vector-action-undelete' => 'Эҳё',
-'vector-action-unprotect' => 'Ба дар овардан аз муҳофизат',
-'vector-namespace-category' => 'Гурӯҳ',
-'vector-namespace-help' => 'Саҳифаи роҳнамо',
-'vector-namespace-image' => 'Парванда',
-'vector-namespace-main' => 'Саҳифа',
-'vector-namespace-media' => 'Саҳифаи раÑона',
-'vector-namespace-mediawiki' => 'Пайғом',
-'vector-namespace-project' => 'Саҳифаи лоиҳа',
-'vector-namespace-special' => 'Саҳифаи вижа',
-'vector-namespace-talk' => 'БаҳÑ',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Саҳифаи корбарӣ',
-'vector-view-create' => 'Эҷод',
-'vector-view-edit' => 'Вироиш',
-'vector-view-history' => 'Ðамоиши таърих',
-'vector-view-view' => 'Хондан',
-'vector-view-viewsource' => 'Ðамоиши манбаъ',
-'actions' => 'Ðмалкардҳо',
-'namespaces' => 'Фазоҳои ном',
-'variants' => 'Вариантҳо',
+'vector-action-addsection' => 'Иловаи унвон',
+'vector-action-delete' => 'Ҳазф',
+'vector-action-move' => 'Кӯчонидан',
+'vector-action-protect' => 'Муҳофизат',
+'vector-action-undelete' => 'Эҳё',
+'vector-action-unprotect' => 'Ба дар овардан аз муҳофизат',
+'vector-view-create' => 'Эҷод',
+'vector-view-edit' => 'Вироиш',
+'vector-view-history' => 'Ðамоиши таърих',
+'vector-view-view' => 'Хондан',
+'vector-view-viewsource' => 'Ðамоиши манбаъ',
+'actions' => 'Ðмалкардҳо',
+'namespaces' => 'Фазоҳои ном',
+'variants' => 'Вариантҳо',
'errorpagetitle' => 'Хато',
'returnto' => 'Бозгашт ба $1.',
@@ -315,6 +303,7 @@ $messages = array(
Лутфан қабл аз талош дубора барои дидани ин Ñаҳифа муддате Ñабр кунед.
$1',
+'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}}',
@@ -476,7 +465,7 @@ $1',
'yourname' => 'Ðоми корбар',
'yourpassword' => 'Калимаи убур\\пароль',
'yourpasswordagain' => 'Калимаи убурро боз навиÑед',
-'remembermypassword' => 'Манро дар хотир нигоҳ дор',
+'remembermypassword' => 'Вуруди манро дар ин мурургар дар хотир нигоҳ дор (то ҳадди акÑар $1 {{PLURAL:$1|рӯз|рӯз}})',
'yourdomainname' => 'Домейни Шумо',
'externaldberror' => 'Хатое дар иртибот бо пойгоҳи дода рух дода аÑÑ‚ Ñ‘ ин ки шумо иҷозат ба рӯзраÑонии ҳиÑоби берунии худро надоред.',
'login' => 'Вуруд',
@@ -493,6 +482,7 @@ $1',
'gotaccount' => "ҲиÑоби корбарӣ доред? '''$1'''.",
'gotaccountlink' => 'Вуруд шавед',
'createaccountmail' => 'бо почтаи Ñлектронӣ',
+'createaccountreason' => 'Сабаб:',
'badretype' => 'Калимаҳои убуре, ки ворид кардаед бо ҳамдигар мувофиқат намекунанд.',
'userexists' => 'Ðоми корбарии дохил кардашуда мавриди иÑтифода аÑÑ‚.
Ðоми дигарероро интихоб кунед.',
@@ -653,7 +643,7 @@ $1',
'userjsyoucanpreview' => "'''Эзоҳ:''' Пеш парвандаи CSS Ñ‘ JS худро захира кунед, бо иÑтифода аз тугмаи \"Пешнамоиш\" метавонед онро озмоиш кунед.",
'usercsspreview' => "'''Фаромӯш накунед, ки шумо фақат CSS корбариатонро пешнамоиш карда иÑтодааед ва он ҳанӯз захира нашудааÑÑ‚!'''",
'userjspreview' => "'''Фаромӯш накунед, ки шумо фақат ҶаваСкрипти корбариатонро имтиҳон,пешнамоиш карда иÑтодаед ва он ҳанӯз захира нашудааÑÑ‚!'''",
-'userinvalidcssjstitle' => "'''Ҳушдор:'''ПӯÑте бо номи \"\$1\" вуҷуд надорад. Таваҷҷӯҳ кунед ки Ñаҳифаҳои .css ва .js бо ҳарфҳои хурд навишта мешаванд, Ðамуна. {{ns:user}}:Фу/monobook.css дар муқобили корбар {{ns:user}}:Фу/Monobook.css.",
+'userinvalidcssjstitle' => "'''Ҳушдор:'''ПӯÑте бо номи \"\$1\" вуҷуд надорад. Таваҷҷӯҳ кунед ки Ñаҳифаҳои .css ва .js бо ҳарфҳои хурд навишта мешаванд, Ðамуна. {{ns:user}}:Фу/vector.css дар муқобили корбар {{ns:user}}:Фу/Vector.css.",
'updated' => '(Ба рӯз шуда)',
'note' => "'''Эзоҳ:'''",
'previewnote' => "'''Ин фақат пешнамоиш аÑÑ‚; дигаргуниҳо ҳоло захира нашудаанд!'''",
@@ -685,8 +675,6 @@ $1',
'copyrightwarning' => "Ҳамаи ҳиÑÑагузорӣ ба {{SITENAME}} аз рӯи қонунҳои зерин $2 (нигаред $1 барои маълумоти бештар) ҳиÑÑагузорӣ мешаванд. Ðгар Шумо намехоҳед, ки навиштаҷоти Шумо вироиш ва паҳн нашаванд, Шумо метавонед ин мақоларо нафириÑтед.<br /> Шумо ваъда медиҳед, ки худатон ин мақоларо навиштед Ñ‘ ки аз Ñарчашмаҳои кушод нуÑхабардорӣ кардаед. '''ÐСÐРҲОИ ҚОБИЛИ ҲУҚУҚИ МУÐЛЛИФРО БЕ ИҶОЗÐТ ÐÐФИРИСТЕД!'''",
'copyrightwarning2' => "Лутфан таваҷҷӯҳ дошта бошед ки ҳамаи ҳиÑÑагузориҳо ба {{SITENAME}} бо таҳти \"Иҷозатномаи муÑтанадоти Озод GNU\" мунташир мешаванд. (барои ҷузъиёти бештар нигаред ба \$1). Ðгар намехоҳед навиштаҳоÑтон бераҳмона вироиш шуда ва ба дилхоҳ тавзеҳ шавад, инҷо нафириÑтед.<br />
Ҳамин тавр шумо қавл медиҳед, ки худатонро инро навиштаед Ñ‘ онро аз Ñк манбаи озод бо моликиÑти умумӣ Ñ‘ мушобеҳи он нуÑхабардорӣ кардаед. '''КОРҲОИ ҲУҚУҚИ ИÐҲИСОРИ МУÐЛЛИФРО (ТÐКСИР) БЕ ИҷОЗÐТЕ ÐÐФИРИСТЕД!'''",
-'longpagewarning' => "'''Ҳушдор: Ин Ñаҳифа $1 килобайт дароз аÑÑ‚; баъзе мурургарҳо мумкин ба вироиши Ñаҳифаҳои наздик ба 32 kb Ñ‘ дарозтар аз он мушкили дошта бошанд.
-Лутфан дар барои ба қиÑматҳои хурд ҷудо кардани ин Ñаҳифа фикр кунед.'''",
'longpageerror' => "'''Ð¥ÐТО: Матне ки ирÑол кардаед $1 килобайт ҳаҷм дорад, ки ин миқдор аз миқдори пешина $2 килобайт бештар аÑÑ‚. Ðаметавон онро захира кард.'''",
'readonlywarning' => "'''ҲУШДОР: Пойгоҳи дода барои нигоҳдорӣ қуфл шудааÑÑ‚, бинобар ин наметавонед вироишҳоÑтонро ҳоло фавран захира кунед. Ðгар мехоҳед матнро дар Ñк парвандаи матнӣ чаÑпонед ва барои оÑнда онро захира кунед.'''",
'protectedpagewarning' => "'''ҲУШДОР: Ин Ñаҳифа қуфл шудааÑÑ‚ то фақат корбароне бо имтиёзи мудир (Ñ‘ болотар) битавонанд онро вироиш кунанд.'''",
@@ -1157,7 +1145,6 @@ $1',
Ðгар акÑи бо андозаи калонтар доред, онро боргузорӣ кунед, вагарна лутфан номи парвандаро тағйир диҳед.",
'fileexists-forbidden' => 'Дар ҳоли ҳозир, парвандае бо ҳамин ном вуҷуд дорад; лутфан бар гардед ва парвандаи мавриди назари худро бо номи дигар бор кунед. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Дар ҳоли ҳозир парванде бо ҳамин ном дар анбори муштараки парвандаҳо вуҷуд дорад; лутфан бар гардед ва парвандаи мавриди назари худро бо номи дигар бо кунед. [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'ФириÑтодан бомуваффақиÑÑ‚',
'uploadwarning' => 'Огоҳии фириÑтодан',
'savefile' => 'Захираи парванда',
'uploadedimage' => 'боршуда "[[$1]]"',
@@ -1176,6 +1163,7 @@ $1',
Шумо боÑд биандешед, ки оё давом додани боргузории ин парванда муноÑиб аÑÑ‚ Ñ‘ на.
Гузориши ҳазфи марбут ба ин парванда дар зер оварда шудааÑÑ‚:",
'filename-bad-prefix' => "Ðоми парвандае, ки шумо боргузори карданиед бо '''\"\$1\"''' оғоз мешавад, ки Ñк пешванди махÑуÑи акÑҳои Ñабтшуда таваÑÑути акÑбардоракҳои рақамӣ аÑÑ‚. Лутфан номи беҳтари тавÑифотӣ барои парванда интихоб кунед.",
+'upload-success-subj' => 'ФириÑтодан бомуваффақиÑÑ‚',
'upload-proto-error' => 'Қарордоди нодуруÑÑ‚',
'upload-proto-error-text' => 'Боргузори аз дурдаÑÑ‚ бо нишонаҳое, ки бо <code>http://</code> Ñ‘ <code>ftp://</code> оғоз мешаванд, ниёз дорад.',
@@ -1469,7 +1457,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'ФеҳриÑти назароти ман',
'mywatchlist' => 'ФеҳриÑти назароти ман',
-'watchlistfor' => "(барои '''$1''')",
'nowatchlist' => 'Дар феҳриÑти пайгириҳои шумо ҳеҷ мавриде неÑÑ‚.',
'watchlistanontext' => 'Лутфан барои мушоҳида ва вироиши феҳриÑти пайгириҳои худ аз $1 иÑтифода кунед.',
'watchnologin' => 'Вуруд нашуда',
@@ -1581,7 +1568,9 @@ $NEWPAGE
'editcomment' => "ХулоÑаи вироиш ин буд: \"''\$1''\".",
'revertpage' => 'Вироиши [[Special:Contributions/$2|$2]] ([[User talk:$2|БаҳÑ]]) вогардонида шуд ба охирин тағйире, ки [[User:$1|$1]] анҷом дода буд',
'rollback-success' => 'Вироишҳои $1 вогардонӣ шуд; Ñаҳифа ба вироиши $2 баргардонида шуд.',
-'sessionfailure' => 'Ба назар мераÑад, мушкилие дар мавриди нишаÑти корбарии шумо вуҷуд дорад; амали дархоÑтшуда ба унвони иқдоми пешгирона дар баробари рабуда шудани иттилооти нишаÑти корбарӣ, лағв шуд. Лутфан тугмаи "бозгашт"-ро дар мурургари худ пахш кунед ва Ñаҳифае, ки аз он инҷо раÑидаед муҷаддадан фарохонӣ кунед, ÑÐ¸Ð¿Ð°Ñ Ð¼ÑƒÒ·Ð°Ð´Ð´Ð°Ð´Ð°Ð½ боз Ñаъй кунед.',
+
+# Edit tokens
+'sessionfailure' => 'Ба назар мераÑад, мушкилие дар мавриди нишаÑти корбарии шумо вуҷуд дорад; амали дархоÑтшуда ба унвони иқдоми пешгирона дар баробари рабуда шудани иттилооти нишаÑти корбарӣ, лағв шуд. Лутфан тугмаи "бозгашт"-ро дар мурургари худ пахш кунед ва Ñаҳифае, ки аз он инҷо раÑидаед муҷаддадан фарохонӣ кунед, ÑÐ¸Ð¿Ð°Ñ Ð¼ÑƒÒ·Ð°Ð´Ð´Ð°Ð´Ð°Ð½ боз Ñаъй кунед.',
# Protect
'protectlogpage' => 'Гузориши муҳофизат',
@@ -1753,7 +1742,6 @@ $1',
'ipb-edit-dropdown' => 'Далели қатъи даÑтраÑÓ£',
'ipb-unblock-addr' => 'Боз кардани $1',
'ipb-unblock' => 'Боз кардани номи корбарӣ ё нишонаи IP',
-'ipb-blocklist-addr' => 'БаÑтаҳои мавҷуд барои $1',
'ipb-blocklist' => 'Дидани баÑтаҳои мавҷуд',
'unblockip' => 'Боз кардани корбар',
'unblockiptext' => 'Барои барқарор кардан даÑтраÑии навиштан барои нишонаи IP Ñ‘ номи корбарии қаблан баÑта шуда, аз форми зерин иÑтифода кунед.',
@@ -2121,10 +2109,10 @@ $1',
'imagemaxsize' => 'Маҳуд кардани акÑҳо дар Ñаҳифаҳои тавÑифоти парванда ба:',
'thumbsize' => 'Ðндозаи ангуштдона (thumbnail):',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|Ñаҳифа|Ñаҳифаҳо}}',
-'file-info' => '(андозаи парванда: $1, навъи MIME: $2)',
-'file-info-size' => '($1 × $2 пикÑел, ҳаҷми парванда: $3, навъи MIME: $4)',
+'file-info' => 'андозаи парванда: $1, навъи MIME: $2',
+'file-info-size' => '$1 × $2 пикÑел, ҳаҷми парванда: $3, навъи MIME: $4',
'file-nohires' => '<small>ÐуÑхаи ҳаҷман ва Ñифатан баландтар даÑÑ‚Ñ€Ð°Ñ Ð½ÐµÑÑ‚.</small>',
-'svg-long-desc' => '(SVG парванда, иÑмӣ $1 × $2 пикÑел, андозаи парванда: $3)',
+'svg-long-desc' => 'SVG парванда, иÑмӣ $1 × $2 пикÑел, андозаи парванда: $3',
'show-big-image' => 'ÐкÑи пурра',
'show-big-image-thumb' => '<small>Ðндозаи ин пешнамоиш: $1 × $2 пикÑел</small>',
diff --git a/languages/messages/MessagesTg_latn.php b/languages/messages/MessagesTg_latn.php
index a930a21b..968163cc 100644
--- a/languages/messages/MessagesTg_latn.php
+++ b/languages/messages/MessagesTg_latn.php
@@ -26,8 +26,7 @@ $messages = array(
'tog-editsection' => 'Içozat dodani viroişi qismati sahifa ba vositai pajvandi [viroiş]',
'tog-editsectiononrightclick' => 'Ba kor andoxtani viroişi sarlavhahoi qismatho bo kliki rost (ÇavaSkript)',
'tog-showtoc' => 'Namoişi fehristi mundariçon (baroi maqolahoi bo beş az 3 sarlavha)',
-'tog-rememberpassword' => 'Maro dar xotiri kompjuter nigoh dor',
-'tog-editwidth' => "Vase' kardani quttiji viroiÅŸ to hadde, ki tamomi sahifaro bargirad",
+'tog-rememberpassword' => 'Maro dar xotiri kompjuter nigoh dor (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Doxil namudani sahifahoe, ki man soxtaam ba fehristi nazaroti man',
'tog-watchdefault' => 'Sahifahoi eçodkardaamro ba fehristi pajgiriam ilova kuned',
'tog-watchmoves' => 'Sahifahoi kūconidaamro ba fehristi pajgirihojam ilova kuned',
@@ -172,31 +171,20 @@ $messages = array(
'faqpage' => 'Project:Savolhoi tez-tez pursidaÅŸuda',
# Vector skin
-'vector-action-addsection' => 'Ilovai unvon',
-'vector-action-delete' => 'Hazf',
-'vector-action-move' => 'KÅ«conidan',
-'vector-action-protect' => 'Muhofizat',
-'vector-action-undelete' => 'Ehjo',
-'vector-action-unprotect' => 'Ba dar ovardan az muhofizat',
-'vector-namespace-category' => 'Gurūh',
-'vector-namespace-help' => 'Sahifai rohnamo',
-'vector-namespace-image' => 'Parvanda',
-'vector-namespace-main' => 'Sahifa',
-'vector-namespace-media' => 'Sahifai rasona',
-'vector-namespace-mediawiki' => 'Pajƣom',
-'vector-namespace-project' => 'Sahifai loiha',
-'vector-namespace-special' => 'Sahifai viƶa',
-'vector-namespace-talk' => 'Bahs',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Sahifai korbarī',
-'vector-view-create' => 'Eçod',
-'vector-view-edit' => 'ViroiÅŸ',
-'vector-view-history' => "NamoiÅŸi ta'rix",
-'vector-view-view' => 'Xondan',
-'vector-view-viewsource' => "NamoiÅŸi manba'",
-'actions' => 'Amalkardho',
-'namespaces' => 'Fazohoi nom',
-'variants' => 'Variantho',
+'vector-action-addsection' => 'Ilovai unvon',
+'vector-action-delete' => 'Hazf',
+'vector-action-move' => 'KÅ«conidan',
+'vector-action-protect' => 'Muhofizat',
+'vector-action-undelete' => 'Ehjo',
+'vector-action-unprotect' => 'Ba dar ovardan az muhofizat',
+'vector-view-create' => 'Eçod',
+'vector-view-edit' => 'ViroiÅŸ',
+'vector-view-history' => "NamoiÅŸi ta'rix",
+'vector-view-view' => 'Xondan',
+'vector-view-viewsource' => "NamoiÅŸi manba'",
+'actions' => 'Amalkardho',
+'namespaces' => 'Fazohoi nom',
+'variants' => 'Variantho',
'errorpagetitle' => 'Xato',
'returnto' => 'BozgaÅŸt ba $1.',
@@ -401,7 +389,7 @@ Tanzim kardani [[Special:Preferences|tarçihoti {{SITENAME}}]] xudro faromūş n
'yourname' => 'Nomi korbar',
'yourpassword' => 'Kalimai ubur\\parolь',
'yourpasswordagain' => 'Kalimai uburro boz navised',
-'remembermypassword' => 'Manro dar xotir nigoh dor',
+'remembermypassword' => 'Manro dar xotir nigoh dor (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Domejni Åžumo',
'externaldberror' => 'Xatoe dar irtibot bo pojgohi doda rux doda ast jo in ki şumo içozat ba rūzrasoniji hisobi beruniji xudro nadored.',
'login' => 'Vurud',
@@ -548,7 +536,7 @@ jo [{{fullurl:{{FULLPAGENAME}}|action=edit}} in sahifaro viroiÅŸ kuned]</span>.'
'usercssyoucanpreview' => "'''Ezoh:''' PeÅŸ parvandai CSS jo JS xudro zaxira kuned, bo istifoda az tugmai \"PeÅŸnamoiÅŸ\" metavoned onro ozmoiÅŸ kuned.",
'userjsyoucanpreview' => "'''Ezoh:''' PeÅŸ parvandai CSS jo JS xudro zaxira kuned, bo istifoda az tugmai \"PeÅŸnamoiÅŸ\" metavoned onro ozmoiÅŸ kuned.",
'userjspreview' => "'''Faromūş nakuned, ki şumo faqat ÇavaSkripti korbariatonro imtihon,peşnamoiş karda istodaed va on hanūz zaxira naşudaast!'''",
-'userinvalidcssjstitle' => "'''Huşdor:'''Pūste bo nomi \"\$1\" vuçud nadorad. Tavaççūh kuned ki sahifahoi .css va .js bo harfhoi xurd navişta meşavand, Namuna. {{ns:user}}:Fu/monobook.css dar muqobili korbar {{ns:user}}:Fu/Monobook.css.",
+'userinvalidcssjstitle' => "'''Huşdor:'''Pūste bo nomi \"\$1\" vuçud nadorad. Tavaççūh kuned ki sahifahoi .css va .js bo harfhoi xurd navişta meşavand, Namuna. {{ns:user}}:Fu/vector.css dar muqobili korbar {{ns:user}}:Fu/Vector.css.",
'updated' => '(Ba rūz şuda)',
'note' => "'''Ezoh:'''",
'previewnote' => "'''In faqat peÅŸnamoiÅŸ ast; digarguniho holo zaxira naÅŸudaand!'''",
@@ -579,8 +567,6 @@ Agar şumo onro zaxira kuned, har taƣjire ki pas az in nusxa ançom şuda, az b
'copyrightwarning' => "Hamai hissaguzorī ba {{SITENAME}} az rūi qonunhoi zerin $2 (nigared $1 baroi ma'lumoti beştar) hissaguzorī meşavand. Agar Şumo namexohed, ki naviştaçoti Şumo viroiş va pahn naşavand, Şumo metavoned in maqolaro nafiristed.<br /> Şumo va'da medihed, ki xudaton in maqolaro navişted jo ki az sarcaşmahoi kuşod nusxabardorī kardaed. '''ASARHOI QOBILI HUQUQI MUALLIFRO BE IÇOZAT NAFIRISTED!'''",
'copyrightwarning2' => "Lutfan tavaççūh doşta boşed ki hamai hissaguzoriho ba {{SITENAME}} bo tahti \"Içozatnomai mustanadoti Ozod GNU\" muntaşir meşavand. (baroi çuz'ijoti beştar nigared ba \$1). Agar namexohed naviştahojaton berahmona viroiş şuda va ba dilxoh tavzeh şavad, inço nafiristed.<br />
Hamin tavr şumo qavl medihed, ki xudatonro inro naviştaed jo onro az jak manbai ozod bo molikijati umumī jo muşobehi on nusxabardorī kardaed. '''KORHOI HUQUQI INHISORI MUALLIFRO (TAKSIR) BE IçOZATE NAFIRISTED!'''",
-'longpagewarning' => "'''HuÅŸdor: In sahifa $1 kilobajt daroz ast; ba'ze mururgarho mumkin ba viroiÅŸi sahifahoi nazdik ba 32 kb jo daroztar az on muÅŸkili doÅŸta boÅŸand.
-Lutfan dar baroi ba qismathoi xurd çudo kardani in sahifa fikr kuned.'''",
'longpageerror' => "'''XATO: Matne ki irsol kardaed $1 kilobajt haçm dorad, ki in miqdor az miqdori peşina $2 kilobajt beştar ast. Nametavon onro zaxira kard.'''",
'protectedpagewarning' => "'''HUÅžDOR: In sahifa qufl ÅŸudaast to faqat korbarone bo imtijozi mudir (jo bolotar) bitavonand onro viroiÅŸ kunand.'''",
'semiprotectedpagewarning' => "'''Tavaççūh:''' In sahifa qufl şudaast to tanho korbaroni sabtinomkarda qodir ba viroişi on boşand.",
@@ -1016,7 +1002,6 @@ Lutfan jak nomi digarero intixob kuned.",
'fileexists-thumbnail-yes' => "Az aks ba nazar merasad, ki aksi andozaaÅŸ xurd ''(anguÅŸtdona)''. [[$1|thumb]]
Lutan parvandaro '''<tt>[[:$1]]</tt>''' barrasī kuned.
Agar parvandai barrasişuda aksi xurd karda şudai on parvandai aslī ast, nijoze ba borguzoriji aksi xurd nest.",
-'successfulupload' => 'Firistodan bomuvaffaqijat',
'uploadwarning' => 'Ogohiji firistodan',
'savefile' => 'Zaxirai parvanda',
'uploadedimage' => 'borÅŸuda "[[$1]]"',
@@ -1033,6 +1018,7 @@ Agar parvandai barrasişuda aksi xurd karda şudai on parvandai aslī ast, nijoz
Åžumo bojad biandeÅŸed, ki ojo davom dodani borguzoriji in parvanda munosib ast jo na.
GuzoriÅŸi hazfi marbut ba in parvanda dar zer ovarda ÅŸudaast:",
'filename-bad-prefix' => "Nomi parvandae, ki şumo borguzori kardanied bo '''\"\$1\"''' oƣoz meşavad, ki jak peşvandi maxsusi akshoi sabtşuda tavassuti aksbardorakhoi raqamī ast. Lutfan nomi behtari tavsifotī baroi parvanda intixob kuned.",
+'upload-success-subj' => 'Firistodan bomuvaffaqijat',
'upload-proto-error' => 'Qarordodi nodurust',
'upload-proto-error-text' => 'Borguzori az durdast bo nişonahoe, ki bo <code>http://</code> jo <code>ftp://</code> oƣoz meşavand, nijoz dorad.',
@@ -1307,7 +1293,6 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
# Watchlist
'watchlist' => 'Fehristi nazaroti man',
'mywatchlist' => 'Fehristi nazaroti man',
-'watchlistfor' => "(baroi '''$1''')",
'nowatchlist' => 'Dar fehristi pajgirihoi şumo heç mavride nest.',
'watchlistanontext' => 'Lutfan baroi muÅŸohida va viroiÅŸi fehristi pajgirihoi xud az $1 istifoda kuned.',
'watchnologin' => 'Vurud naÅŸuda',
@@ -1390,7 +1375,9 @@ Nigared ba $2 baroi guzoriÅŸi hazfi oxirin.',
'editcomment' => "Xulosai viroiÅŸ in bud: \"''\$1''\".",
'revertpage' => 'Viroişi [[Special:Contributions/$2|$2]] ([[User talk:$2|Bahs]]) vogardonida şud ba oxirin taƣjire, ki [[User:$1|$1]] ançom doda bud',
'rollback-success' => 'Viroişhoi $1 vogardonī şud; sahifa ba viroişi $2 bargardonida şud.',
-'sessionfailure' => 'Ba nazar merasad, muşkilie dar mavridi nişasti korbariji şumo vuçud dorad; amali darxostşuda ba unvoni iqdomi peşgirona dar barobari rabuda şudani ittilooti nişasti korbarī, laƣv şud. Lutfan tugmai "bozgaşt"-ro dar mururgari xud paxş kuned va sahifae, ki az on inço rasidaed muçaddadan faroxonī kuned, sipas muçaddadan boz sa\'j kuned.',
+
+# Edit tokens
+'sessionfailure' => 'Ba nazar merasad, muşkilie dar mavridi nişasti korbariji şumo vuçud dorad; amali darxostşuda ba unvoni iqdomi peşgirona dar barobari rabuda şudani ittilooti nişasti korbarī, laƣv şud. Lutfan tugmai "bozgaşt"-ro dar mururgari xud paxş kuned va sahifae, ki az on inço rasidaed muçaddadan faroxonī kuned, sipas muçaddadan boz sa\'j kuned.',
# Protect
'protectlogpage' => 'GuzoriÅŸi muhofizat',
@@ -1555,7 +1542,6 @@ Baroi barrasī ba [[Special:IPBlockList|fehristi nişonahoi IP va nomhoi korbari
'ipb-edit-dropdown' => "Daleli qat'i dastrasī",
'ipb-unblock-addr' => 'Boz kardani $1',
'ipb-unblock' => 'Boz kardani nomi korbarī jo nişonai IP',
-'ipb-blocklist-addr' => 'Bastahoi mavçud baroi $1',
'ipb-blocklist' => 'Didani bastahoi mavçud',
'unblockip' => 'Boz kardani korbar',
'unblockiptext' => 'Baroi barqaror kardan dastrasiji naviÅŸtan baroi niÅŸonai IP jo nomi korbariji qablan basta ÅŸuda, az formi zerin istifoda kuned.',
@@ -1920,10 +1906,10 @@ $1',
Bo içroi on, sistemai şumo şojad oseb bubinad.",
'thumbsize' => 'Andozai anguÅŸtdona (thumbnail):',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|sahifa|sahifaho}}',
-'file-info' => "(andozai parvanda: $1, nav'i MIME: $2)",
-'file-info-size' => "($1 × $2 piksel, haçmi parvanda: $3, nav'i MIME: $4)",
+'file-info' => "andozai parvanda: $1, nav'i MIME: $2",
+'file-info-size' => "$1 × $2 piksel, haçmi parvanda: $3, nav'i MIME: $4",
'file-nohires' => '<small>Nusxai haçman va sifatan balandtar dastras nest.</small>',
-'svg-long-desc' => '(SVG parvanda, ismī $1 × $2 piksel, andozai parvanda: $3)',
+'svg-long-desc' => 'SVG parvanda, ismī $1 × $2 piksel, andozai parvanda: $3',
'show-big-image' => 'Aksi purra',
'show-big-image-thumb' => '<small>Andozai in peşnamoiş: $1 × $2 piksel</small>',
diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php
index 3c01a61b..1cc26fe5 100644
--- a/languages/messages/MessagesTh.php
+++ b/languages/messages/MessagesTh.php
@@ -10,6 +10,7 @@
* @author Ans
* @author Harley Hartwell
* @author Horus
+ * @author Korrawit
* @author LMNOP at Thai Wikipedia (manop@itshee.com) since July 2007
* @author Manop
* @author Mopza
@@ -126,7 +127,7 @@ $specialPageAliases = array(
'Resetpass' => array( 'ตั้งรหัสผ่านใหม่' ),
'Withoutinterwiki' => array( 'หน้าที่ไม่มีลิงà¸à¹Œà¸‚้ามภาษา' ),
'MergeHistory' => array( 'รวมประวัติ' ),
- 'Filepath' => array( 'ตำà¹à¸«à¸™à¹ˆà¸‡à¹„ฟล์' ),
+ 'Filepath' => array( 'พาธของไฟล์', 'ตำà¹à¸«à¸™à¹ˆà¸‡à¹„ฟล์' ),
'Invalidateemail' => array( 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—างอีเมล' ),
'Blankpage' => array( 'หน้าว่าง' ),
'LinkSearch' => array( 'ค้นหาเว็บลิงà¸à¹Œ' ),
@@ -194,8 +195,7 @@ $messages = array(
'tog-editsection' => 'เปิดà¸à¸²à¸£à¹à¸à¹‰à¹„ขเฉพาะส่วนโดยใช้ลิงà¸à¹Œ [à¹à¸à¹‰à¹„ข]',
'tog-editsectiononrightclick' => 'เปิดà¸à¸²à¸£à¹à¸à¹‰à¹„ขเฉพาะส่วนโดยคลิà¸à¸‚วาที่หัวข้อ (จาวาสคริปต์)',
'tog-showtoc' => 'à¹à¸ªà¸”งสารบัà¸<br />(สำหรับหน้าที่มีมาà¸à¸à¸§à¹ˆà¸² 3 หัวข้อ)',
-'tog-rememberpassword' => 'จำà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¸šà¸™à¸„อมพิวเตอร์นี้',
-'tog-editwidth' => 'ทำให้à¸à¸¥à¹ˆà¸­à¸‡à¹à¸à¹‰à¹„ขà¸à¸§à¹‰à¸²à¸‡à¹€à¸•à¹‡à¸¡à¸«à¸™à¹‰à¸²à¸ˆà¸­',
+'tog-rememberpassword' => 'จำข้อมูลà¸à¸²à¸£à¹€à¸‚้าสู่ระบบของฉันในเบราว์เซอร์นี้ (สูงสุด $1 {{PLURAL: $1 | วัน | วัน}})',
'tog-watchcreations' => 'นำหน้าที่สร้างใส่รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'tog-watchdefault' => 'นำหน้าที่à¹à¸à¹‰à¹„ขใส่รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'tog-watchmoves' => 'นำหน้าที่เปลี่ยนชื่อใส่รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
@@ -308,7 +308,7 @@ $messages = array(
'index-category' => 'หน้าที่มีดัชนี',
'noindex-category' => 'หน้าที่ไม่มีดัชนี',
-'mainpagetext' => "'''ซอฟต์à¹à¸§à¸£à¹Œà¸¡à¸µà¹€à¸”ียวิà¸à¸´à¹„ด้ถูà¸à¸•à¸´à¸”ตั้งเรียบร้อย'''",
+'mainpagetext' => "'''ติดตั้งซอฟต์à¹à¸§à¸£à¹Œà¸¡à¸µà¹€à¸”ียวิà¸à¸´à¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢'''",
'mainpagedocfooter' => 'ศึà¸à¸©à¸²[http://meta.wikimedia.org/wiki/Help:Contents คู่มือà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™] สำหรับเริ่มต้นใช้งานซอฟต์à¹à¸§à¸£à¹Œà¸§à¸´à¸à¸´
== เริ่มต้น ==
@@ -340,31 +340,21 @@ $messages = array(
'faqpage' => 'Project:คำถามที่ถามบ่อย',
# Vector skin
-'vector-action-addsection' => 'เพิ่มหัวข้อใหม่',
-'vector-action-delete' => 'ลบ',
-'vector-action-move' => 'ย้าย',
-'vector-action-protect' => 'ป้องà¸à¸±à¸™',
-'vector-action-undelete' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¥à¸š',
-'vector-action-unprotect' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™',
-'vector-namespace-category' => 'หมวดหมู่',
-'vector-namespace-help' => 'หน้าช่วยเหลือ',
-'vector-namespace-image' => 'ไฟล์',
-'vector-namespace-main' => 'หน้า',
-'vector-namespace-media' => 'หน้าที่เป็นสื่อ',
-'vector-namespace-mediawiki' => 'ข้อความ',
-'vector-namespace-project' => 'หน้าโครงà¸à¸²à¸£',
-'vector-namespace-special' => 'หน้าพิเศษ',
-'vector-namespace-talk' => 'สนทนา',
-'vector-namespace-template' => 'à¹à¸¡à¹ˆà¹à¸šà¸š',
-'vector-namespace-user' => 'หน้าของผู้ใช้',
-'vector-view-create' => 'สร้าง',
-'vector-view-edit' => 'à¹à¸à¹‰à¹„ข',
-'vector-view-history' => 'ดูประวัติ',
-'vector-view-view' => 'อ่าน',
-'vector-view-viewsource' => 'ดูโค้ด',
-'actions' => 'à¸à¸²à¸£à¸à¸£à¸°à¸—ำ',
-'namespaces' => 'เนมสเปซ',
-'variants' => 'สิ่งที่à¹à¸•à¸à¸•à¹ˆà¸²à¸‡',
+'vector-action-addsection' => 'เพิ่มหัวข้อใหม่',
+'vector-action-delete' => 'ลบ',
+'vector-action-move' => 'ย้าย',
+'vector-action-protect' => 'ป้องà¸à¸±à¸™',
+'vector-action-undelete' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¥à¸š',
+'vector-action-unprotect' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™',
+'vector-simplesearch-preference' => 'เปิดใช้งานคำà¹à¸™à¸°à¸™à¸³à¸à¸²à¸£à¸„้นหาขั้นสูง (สำหรับสà¸à¸´à¸™ Vector เท่านั้น)',
+'vector-view-create' => 'สร้าง',
+'vector-view-edit' => 'à¹à¸à¹‰à¹„ข',
+'vector-view-history' => 'ดูประวัติ',
+'vector-view-view' => 'อ่าน',
+'vector-view-viewsource' => 'ดูโค้ด',
+'actions' => 'à¸à¸²à¸£à¸à¸£à¸°à¸—ำ',
+'namespaces' => 'เนมสเปซ',
+'variants' => 'สิ่งที่à¹à¸•à¸à¸•à¹ˆà¸²à¸‡',
'errorpagetitle' => 'มีข้อผิดพลาด',
'returnto' => 'à¸à¸¥à¸±à¸šà¹„ปสู่ $1',
@@ -425,6 +415,9 @@ $messages = array(
à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่à¸à¹ˆà¸­à¸™à¸—ี่จะเข้าดูหน้านี้อีà¸à¸„รั้งหนึ่ง
$1',
+'pool-timeout' => 'เà¸à¸´à¸™à¹€à¸§à¸¥à¸²à¸£à¸­à¸à¸²à¸£à¸¥à¹‡à¸­à¸„',
+'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}}',
@@ -582,7 +575,8 @@ $1',
'yourname' => 'ชื่อผู้ใช้',
'yourpassword' => 'รหัสผ่าน',
'yourpasswordagain' => 'พิมพ์รหัสผ่านอีà¸à¸„รั้ง:',
-'remembermypassword' => 'จำà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¸šà¸™à¸„อมพิวเตอร์นี้',
+'remembermypassword' => 'จำฉันจาà¸à¹€à¸„รื่องนี้ (เป็นเวลาอย่างมาภ$1 {{PLURAL:$1|วัน|วัน}})',
+'securelogin-stick-https' => 'ยังคงเชื่อมต่อà¸à¸±à¸š HTTPS หลังจาà¸à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
'yourdomainname' => 'โดเมนของคุณ:',
'externaldberror' => 'เà¸à¸´à¸”ความผิดพลาดในà¸à¸²à¸£à¸£à¸°à¸šà¸¸à¸•à¸±à¸§à¸•à¸™à¸ˆà¸²à¸à¸ à¸²à¸¢à¸™à¸­à¸ หรือคุณไม่มีสิทธิในà¸à¸²à¸£à¹à¸à¹‰à¹„ขบัà¸à¸Šà¸µà¸­à¸·à¹ˆà¸™',
'login' => 'ล็อà¸à¸­à¸´à¸™',
@@ -599,6 +593,7 @@ $1',
'gotaccount' => "มีบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹à¸¥à¹‰à¸§à¸«à¸£à¸·à¸­à¹„ม่ '''$1'''",
'gotaccountlink' => 'ล็อà¸à¸­à¸´à¸™',
'createaccountmail' => 'ผ่านทางอีเมล',
+'createaccountreason' => 'เหตุผล:',
'badretype' => 'รหัสผ่านที่ใส่ไม่ถูà¸à¸•à¹‰à¸­à¸‡',
'userexists' => 'ชื่อบัà¸à¸Šà¸µà¸—ี่ใส่มีผู้อื่นใช้à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเลือà¸à¸Šà¸·à¹ˆà¸­à¸­à¸·à¹ˆà¸™',
'loginerror' => 'ล็อà¸à¸­à¸´à¸™à¸œà¸´à¸”พลาด',
@@ -618,6 +613,7 @@ $1',
'wrongpasswordempty' => 'ยังไม่ได้ระบุรหัสผ่าน à¸à¸£à¸¸à¸“าลองใหม่',
'passwordtooshort' => 'รหัสผ่านต้องมีความยาวอย่างน้อย {{PLURAL:$1|$1 ตัวอัà¸à¸©à¸£}}',
'password-name-match' => 'รหัสผ่านของคุณต้องไม่เหมือนà¸à¸±à¸™à¸à¸±à¸šà¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸‚องคุณ',
+'password-login-forbidden' => 'ชื่อผู้ใช้à¹à¸¥à¸°à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸™à¸µà¹‰à¸–ูà¸à¸«à¹‰à¸²à¸¡à¸¡à¸´à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰',
'mailmypassword' => 'อีเมลรหัสผ่านใหม่',
'passwordremindertitle' => 'คำบอà¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸ˆà¸²à¸ {{SITENAME}}',
'passwordremindertext' => 'ผู้ใดผู้หนึ่ง (ซึ่งอาจจะเป็นคุณได้ใช้หมายเลขไอพี $1) ขอให้ส่งรหัสผ่านใหม่
@@ -656,6 +652,9 @@ $1',
'loginlanguagelabel' => 'ภาษา: $1',
'suspicious-userlogout' => 'คำขอของคุณเพื่อออà¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸šà¸–ูà¸à¸›à¸à¸´à¹€à¸ªà¸˜ เพราะดูเหมือนว่าจะส่งมาจาà¸à¹€à¸šà¸£à¸²à¸§à¹Œà¹€à¸‹à¸­à¸£à¹Œà¸«à¸£à¸·à¸­à¸žà¸£à¹‡à¸­à¸à¸‹à¸µà¹ˆà¹à¸„ชที่เสีย',
+# E-mail sending
+'php-mail-error-unknown' => 'ข้อผิดพลาดที่ไม่รู้จัà¸à¹ƒà¸™à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™ mail() ของ PHP',
+
# Password reset dialog
'resetpass' => 'เปลี่ยนรหัสผ่าน',
'resetpass_announce' => 'คุณล็อà¸à¸­à¸´à¸™à¸œà¹ˆà¸²à¸™à¸£à¸«à¸±à¸ªà¸­à¸µà¹€à¸¡à¸¥à¸Šà¸±à¹ˆà¸§à¸„ราว คุณต้องใส่ค่ารหัสผ่านใหม่เพื่อเสร็จสิ้นขั้นตอนà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™:',
@@ -704,9 +703,10 @@ $1',
'showlivepreview' => 'à¹à¸ªà¸”งตัวอย่างทันที',
'showdiff' => 'à¹à¸ªà¸”งความเปลี่ยนà¹à¸›à¸¥à¸‡',
'anoneditwarning' => "'''คำเตือน:''' หมายเลขไอพีของคุณจะถูà¸à¹€à¸à¹‡à¸šà¹„ว้ในส่วนประวัติของหน้านี้เนื่องจาà¸à¸„ุณไม่ได้ล็อà¸à¸­à¸´à¸™",
+'anonpreviewwarning' => 'คุณยังไม่ได้ล็อà¸à¸­à¸´à¸™ à¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¸ˆà¸°à¹€à¸à¹‡à¸šà¹€à¸¥à¸‚ที่อยู่ไอพีของคุณไว้ในประวัติของหน้านี้',
'missingsummary' => "'''อย่าลืม:''' คุณยังไม่ได้ระบุคำอธิบายà¸à¸²à¸£à¹à¸à¹‰à¹„ขครั้งนี้ ถ้าคุณà¸à¸”บันทึà¸à¹„ปส่วนคำอธิบายà¸à¸²à¸£à¹à¸à¹‰à¹„ขนั้นจะว่างà¹à¸¥à¸°à¹„ม่à¹à¸ªà¸”งผล",
'missingcommenttext' => 'à¸à¸£à¸¸à¸“าใส่ความเห็นด้านล่าง',
-'missingcommentheader' => "'''อย่าลืม:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นในครั้งนี้ ถ้าคุณà¸à¸”บันทึà¸à¹„ปส่วนหัวข้อความเห็นจะว่างไม่à¹à¸ªà¸”งผล",
+'missingcommentheader' => "'''อย่าลืม:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นในครั้งนี้ ถ้าคุณà¸à¸” {{int:savearticle}} อีà¸à¸„รั้งหนึ่ง à¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณจะไม่มีหัวข้อ",
'summary-preview' => 'ตัวอย่างคำอธิบายà¸à¸²à¸£à¹à¸à¹‰à¹„ข:',
'subject-preview' => 'ตัวอย่างหัวข้อ:',
'blockedtitle' => 'ผู้ใช้ถูà¸à¸«à¹‰à¸²à¸¡à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
@@ -779,7 +779,11 @@ $1 เป็นผู้ดำเนินà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹ƒà¸™à¸„รà¸
'usercsspreview' => "'''อย่าลืมว่าสไตล์ชีตที่คุณสร้างยังไม่ได้ถูà¸à¸šà¸±à¸™à¸—ึà¸'''
'''นี่คือà¸à¸²à¸£à¹à¸ªà¸”งตัวอย่างเท่านั้น!'''",
'userjspreview' => "'''อย่าลืมว่าจาวาสคริปต์ยังไม่ได้ถูà¸à¸šà¸±à¸™à¸—ึภขณะนี้à¹à¸ªà¸”งเพียงตัวอย่างเท่านั้น!'''",
-'userinvalidcssjstitle' => "'''คำเตือน:''' ไม่มีà¹à¸šà¸šà¸«à¸™à¹‰à¸²à¸•à¸² \"\$1\" อย่าลืมว่าหน้า .css à¹à¸¥à¸° .js ที่ปรับà¹à¸•à¹ˆà¸‡à¹€à¸­à¸‡ ใช้เป็นอัà¸à¸©à¸£à¸•à¸±à¸§à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸à¸—ั้งหมด เช่น ใช้ {{ns:user}}:Foo/monobook.css à¹à¸—นที่จะเป็น {{ns:user}}:Foo/Monobook.css",
+'sitecsspreview' => "'''โปรดจำไว้ว่า คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸ªà¸”งตัวอย่าง CSS นี้เท่านั้น'''
+'''มันยังไม่ได้ถูà¸à¸šà¸±à¸™à¸—ึà¸!'''",
+'sitejspreview' => "'''โปรดจำไว้ว่า คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸ªà¸”งตัวอย่างรหัส JavaScript นี้เท่านั้น'''
+'''มันยังไม่ได้ถูà¸à¸šà¸±à¸™à¸—ึà¸!'''",
+'userinvalidcssjstitle' => "'''คำเตือน:''' ไม่มีà¹à¸šà¸šà¸«à¸™à¹‰à¸²à¸•à¸² \"\$1\" อย่าลืมว่าหน้า .css à¹à¸¥à¸° .js ที่ปรับà¹à¸•à¹ˆà¸‡à¹€à¸­à¸‡ ใช้เป็นอัà¸à¸©à¸£à¸•à¸±à¸§à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸à¸—ั้งหมด เช่น ใช้ {{ns:user}}:Foo/vector.css à¹à¸—นที่จะเป็น {{ns:user}}:Foo/Vector.css",
'updated' => '(ปรับปรุงà¹à¸¥à¹‰à¸§)',
'note' => "'''คำà¹à¸™à¸°à¸™à¸³:'''",
'previewnote' => "'''ตรงนี้เป็นà¸à¸²à¸£à¹à¸ªà¸”งตัวอย่างเท่านั้น à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸¢à¸±à¸‡à¹„ม่ได้ถูà¸à¸šà¸±à¸™à¸—ึà¸!'''",
@@ -814,9 +818,6 @@ $1 เป็นผู้ดำเนินà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹ƒà¸™à¸„รà¸
ถ้าคุณไม่ต้องà¸à¸²à¸£à¹ƒà¸«à¹‰à¸‡à¸²à¸™à¸‚องคุณถูà¸à¹à¸à¹‰à¹„ข หรือไม่ต้องà¸à¸²à¸£à¹ƒà¸«à¹‰à¸‡à¸²à¸™à¹€à¸œà¸¢à¹à¸žà¸£à¹ˆà¸•à¸²à¸¡à¸—ี่à¸à¸¥à¹ˆà¸²à¸§à¹„ว้ อย่าส่งข้อความของคุณเข้ามาที่นี่<br />
นอà¸à¸ˆà¸²à¸à¸™à¸µà¹‰à¸„ุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸‚้อความที่ส่งเข้ามาคุณได้เขียนด้วยตัวเอง ไม่ได้คัดลอภทำซ้ำส่วนหนึ่งส่วนใดหรือทั้งหมดจาà¸à¹à¸«à¸¥à¹ˆà¸‡à¸­à¸·à¹ˆà¸™ (ดูรายละเอียดที่ $1)
'''อย่าส่งงานที่มีลิขสิทธิ์เข้ามาà¸à¹ˆà¸­à¸™à¹„ด้รับอนุà¸à¸²à¸•à¸ˆà¸²à¸à¹€à¸ˆà¹‰à¸²à¸‚อง!'''",
-'longpagewarning' => "'''คำเตือน: หน้านี้มีความยาว $1 à¸à¸´à¹‚ลไบต์ ซึ่งเว็บเบราว์เซอร์บางตัวอาจจะมีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้าที่ความยาวเà¸à¸´à¸™à¸à¸§à¹ˆà¸² 32 à¸à¸´à¹‚ลไบต์
-
-ลองพิจารณาà¹à¸šà¹ˆà¸‡à¸«à¸™à¹‰à¸²à¸­à¸­à¸à¹€à¸›à¹‡à¸™à¸«à¸±à¸§à¸‚้อย่อย'''",
'longpageerror' => "'''ผิดพลาด: ข้อความที่คุณส่งเข้ามามีขนาด $1 à¸à¸´à¹‚ลไบต์
ซึ่งเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸‚นาดที่à¸à¸³à¸«à¸™à¸”ไว้ที่ $2 à¸à¸´à¹‚ลไบต์ จึงไม่สามารถบันทึà¸à¹„ด้'''",
'readonlywarning' => "'''คำเตือน: ขณะนี้à¸à¸²à¸™à¸‚้อมูลถูà¸à¸¥à¹‡à¸­à¸à¹€à¸žà¸·à¹ˆà¸­à¸šà¸³à¸£à¸¸à¸‡à¸£à¸±à¸à¸©à¸² จึงไม่สามารถบันทึà¸à¸‚้อมูลที่à¹à¸à¹‰à¹„ขได้ à¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¸„ัดลอà¸à¹„ปเà¸à¹‡à¸šà¹„ว้ที่อื่นà¸à¹ˆà¸­à¸™à¹à¸¥à¹‰à¸§à¸™à¸³à¸¡à¸²à¸šà¸±à¸™à¸—ึà¸à¹ƒà¸™à¹€à¸§à¹‡à¸šà¹„ซต์นี้ภายหลัง'''
@@ -991,6 +992,8 @@ $1",
'logdelete-failure' => "'''ไม่สามารถตั้งค่าà¸à¸²à¸£à¹à¸ªà¸”งผลของรายà¸à¸²à¸£à¹à¸à¹‰à¹„ขได้:'''
$1",
'revdel-restore' => 'เปลี่ยนทัศนวิสัย',
+'revdel-restore-deleted' => 'รุ่นที่ถูà¸à¸¥à¸š',
+'revdel-restore-visible' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่มองเห็นได้',
'pagehist' => 'ประวัติหน้า',
'deletedhist' => 'ลบประวัติ',
'revdelete-content' => 'เนื้อหา',
@@ -1059,11 +1062,13 @@ $1",
# Diffs
'history-title' => 'ประวัติà¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้า "$1"',
'difference' => '(ความà¹à¸•à¸à¸•à¹ˆà¸²à¸‡à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡à¸£à¸¸à¹ˆà¸™à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡)',
+'difference-multipage' => '(ความà¹à¸•à¸à¸•à¹ˆà¸²à¸‡à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡à¸«à¸™à¹‰à¸²à¸•à¹ˆà¸²à¸‡à¹†)',
'lineno' => 'à¹à¸–ว $1:',
'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือà¸',
'showhideselectedversions' => 'à¹à¸ªà¸”ง/ซ่อน รุ่นที่เลือà¸',
'editundo' => 'ย้อน',
-'diff-multi' => '({{PLURAL:$1|à¸à¸²à¸£à¹à¸à¹‰à¹„ขหนึ่งรุ่นระหว่างรุ่นที่เปรียบเทียบ|à¸à¸²à¸£à¹à¸à¹‰à¹„ข $1 รุ่นระหว่างรุ่นที่เปรียบเทียบ}}ไม่à¹à¸ªà¸”งผล)',
+'diff-multi' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ข({{PLURAL:$1|หนึ่งรุ่นระหว่างรุ่นที่เปรียบเทียบ|$1 รุ่นระหว่างรุ่นที่เปรียบเทียบ}} โดย {{PLURAL:$2|หนึ่งผู้ใช้|$2 ผู้ใช้}} ไม่à¹à¸ªà¸”งผล)',
+'diff-multi-manyusers' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ข({{PLURAL:$1|หนึ่งรุ่นระหว่างรุ่นที่เปรียบเทียบ|$1 รุ่นระหว่างรุ่นที่เปรียบเทียบ}} โดยผู้ใช้มาà¸à¸à¸§à¹ˆà¸² {{PLURAL:$2|หนึ่งผู้ใช้|$2 ผู้ใช้}} ไม่à¹à¸ªà¸”งผล)',
# Search results
'searchresults' => 'ค้นหา',
@@ -1098,6 +1103,7 @@ $1",
'searchprofile-everything-tooltip' => 'ค้นเนื้อหาทั้งหมด (รวมถึงหน้าอภิปราย)',
'searchprofile-advanced-tooltip' => 'ค้นหาในเนมสเปซที่เลือà¸à¹€à¸­à¸‡',
'search-result-size' => '$1 ({{PLURAL:$2|1 คำ|$2 คำ}})',
+'search-result-category-size' => '{{PLURAL:$1|1 สมาชิà¸|$1 สมาชิà¸}} ({{PLURAL:$2|1 ประเภทย่อย|$2 หมวดหมู่ย่อย}}, {{PLURAL:$3|1 ไฟล์|$3 ไฟล์}})',
'search-result-score' => 'ความเà¸à¸µà¹ˆà¸¢à¸§à¸‚้อง : $1%',
'search-redirect' => '(เปลี่ยนทาง $1)',
'search-section' => '(ส่วน $1)',
@@ -1173,6 +1179,7 @@ $1",
'contextlines' => 'บรรทัดที่à¹à¸ªà¸”งต่อรายà¸à¸²à¸£:',
'contextchars' => 'ตัวอัà¸à¸©à¸£à¸•à¹ˆà¸­à¸šà¸£à¸£à¸—ัด:',
'stub-threshold' => 'ขีดà¹à¸šà¹ˆà¸‡à¸ªà¸³à¸«à¸£à¸±à¸š <a href="#" class="stub">รูปà¹à¸šà¸šà¹‚ครง</a> (ความยาวบทความ):',
+'stub-threshold-disabled' => 'ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
'recentchangesdays' => 'จำนวนวันที่à¹à¸ªà¸”งในปรับปรุงล่าสุด:',
'recentchangesdays-max' => '(สูงสุด $1 {{PLURAL:$1|วัน|วัน}})',
'recentchangescount' => 'จำนวนà¸à¸²à¸£à¹à¸à¹‰à¹„ขที่à¹à¸ªà¸”งโดยปริยาย:',
@@ -1206,6 +1213,7 @@ $1",
'prefs-files' => 'ไฟล์',
'prefs-custom-css' => 'สไตล์ชีตปรับà¹à¸•à¹ˆà¸‡à¹€à¸­à¸‡',
'prefs-custom-js' => 'จาวาสคริปต์ปรับà¹à¸•à¹ˆà¸‡à¹€à¸­à¸‡',
+'prefs-common-css-js' => 'CSS / JavaScript ที่ใช้ร่วมà¸à¸±à¸™à¸ªà¸³à¸«à¸£à¸±à¸šà¸ªà¸à¸´à¸™à¸—ั้งหมด:',
'prefs-reset-intro' => 'คุณสามารถใช้หน้านี้เพื่อล้างà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณà¸à¸¥à¸±à¸šà¹„ปเป็นค่าตั้งต้นทั้งหมด
เมื่อล้างà¹à¸¥à¹‰à¸§à¸ˆà¸°à¹„ม่สามารถย้อนà¸à¸¥à¸±à¸šà¹„ด้',
'prefs-emailconfirm-label' => 'à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥:',
@@ -1219,7 +1227,7 @@ $1",
'yourlanguage' => 'ภาษา:',
'yourvariant' => 'ภาษาอื่น',
'yournick' => 'ลายเซ็น:',
-'prefs-help-signature' => 'คอมเมนต์ในหน้าูพูดคุยควรจะเซ็นลงท้ายด้วย "<nowiki>~~~~</nowiki>" ซึ่งจะถูà¸à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸¥à¸²à¸¢à¹€à¸‹à¹‡à¸™à¸•à¹Œà¹à¸¥à¸°à¸¥à¸‡à¸§à¸±à¸™à¸—ี่เขียน',
+'prefs-help-signature' => 'คอมเมนต์ในหน้าูพูดคุยควรจะเซ็นลงท้ายด้วย "<nowiki>~~~~</nowiki>" ซึ่งจะถูà¸à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸¥à¸²à¸¢à¹€à¸‹à¹‡à¸™à¹à¸¥à¸°à¸¥à¸‡à¸§à¸±à¸™à¸—ี่เขียน',
'badsig' => 'ลายเซ็นที่ใช้ผิดพลาด à¸à¸£à¸¸à¸“าตรวจสอบคำสั่งเอชทีเอ็มà¹à¸­à¸¥',
'badsiglength' => 'ลายเซ็นยาวเà¸à¸´à¸™à¹„ป ต้องมีความยาวไม่เà¸à¸´à¸™ $1 {{PLURAL:$1|ตัวอัà¸à¸©à¸£|ตัวอัà¸à¸©à¸£}}',
'yourgender' => 'เพศ:',
@@ -1242,9 +1250,15 @@ $1",
'prefs-advancedrendering' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าขั้นสูง',
'prefs-advancedsearchoptions' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าขั้นสูง',
'prefs-advancedwatchlist' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าขั้นสูง',
-'prefs-display' => 'ค่าà¸à¸²à¸£à¹à¸ªà¸”งผล',
+'prefs-displayrc' => 'ค่าà¸à¸²à¸£à¹à¸ªà¸”งผล',
+'prefs-displaysearchoptions' => 'ค่าà¸à¸²à¸£à¹à¸ªà¸”งผล',
+'prefs-displaywatchlist' => 'ค่าà¸à¸²à¸£à¹à¸ªà¸”งผล',
'prefs-diffs' => 'ส่วนต่างà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ที่อยู่อีเมลดูเหมือนว่าถูà¸à¸•à¹‰à¸­à¸‡',
+'email-address-validity-invalid' => 'ป้อนที่อยู่อีเมลที่ถูà¸à¸•à¹‰à¸­à¸‡',
+
# User rights
'userrights' => 'บริหารสิทธิผู้ใช้',
'userrights-lookup-user' => 'บริหารสิทธิผู้ใช้',
@@ -1311,7 +1325,7 @@ $1",
'right-purge' => 'ล้างà¹à¸„ชของเว็บไซต์โดยไม่จำเป็นต้องยืนยัน',
'right-autoconfirmed' => 'à¹à¸à¹‰à¹„ขหน้าที่ถูà¸à¸à¸¶à¹ˆà¸‡à¸¥à¹‡à¸­à¸',
'right-bot' => 'à¸à¸³à¸«à¸™à¸”ว่าเป็นà¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸­à¸±à¸•à¹‚นมัติ',
-'right-nominornewtalk' => 'ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢à¸—ี่หน้าสนทนาที่ทำให้à¸à¸²à¸£à¹€à¸•à¸·à¸­à¸™à¸‚้อความใหม่ปราà¸à¸Ž',
+'right-nominornewtalk' => 'ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢à¸—ี่หน้าสนทนาที่ทำให้à¸à¸²à¸£à¹€à¸•à¸·à¸­à¸™à¸‚้อความใหม่ปราà¸à¸',
'right-apihighlimits' => 'ใช้ข้อจำà¸à¸±à¸”ที่สูงขึ้นในคำสั่งเอพีไอ',
'right-writeapi' => 'ใช้à¸à¸²à¸£à¹€à¸‚ียนเอพีไอ',
'right-delete' => 'ลบหน้า',
@@ -1328,6 +1342,7 @@ $1",
'right-hideuser' => 'บล็อà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹à¸¥à¸°à¸‹à¹ˆà¸­à¸™à¹„ม่ให้ผู้อื่นเห็น',
'right-ipblock-exempt' => 'ผ่านà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี บล็อà¸à¹à¸šà¸šà¸­à¸±à¸•à¹‚นมัติ à¹à¸¥à¸°à¸šà¸¥à¹‡à¸­à¸à¹€à¸›à¹‡à¸™à¸Šà¹ˆà¸§à¸‡',
'right-proxyunbannable' => 'ผ่านà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹à¸šà¸šà¸­à¸±à¸•à¹‚นมัติของพร็อà¸à¸‹à¸µ',
+'right-unblockself' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸›à¸´à¸”à¸à¸±à¹‰à¸™à¸”้วยเอง',
'right-protect' => 'เปลี่ยนระดับà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¹à¸¥à¸°à¹à¸à¹‰à¹„ขหน้าที่ถูà¸à¸¥à¹‡à¸­à¸',
'right-editprotected' => 'à¹à¸à¹‰à¹„ขหน้าที่ถูà¸à¸¥à¹‡à¸­à¸ (ที่ไม่ล็อà¸à¹à¸šà¸šà¸ªà¸·à¸šà¸—อด)',
'right-editinterface' => 'à¹à¸à¹‰à¹„ขอินเตอร์เฟซของผู้ใช้',
@@ -1350,7 +1365,6 @@ $1",
'right-siteadmin' => 'ล็อà¸à¹à¸¥à¸°à¸›à¸¥à¸”ล็อà¸à¸à¸²à¸™à¸‚้อมูล',
'right-reset-passwords' => 'ตั้งรหัสผ่านของผู้ใช้อื่นใหม่',
'right-override-export-depth' => 'ส่งออà¸à¸«à¸™à¹‰à¸² รวมหน้าที่เชื่อมโยงà¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸ªà¸¹à¸‡à¸ªà¸¸à¸” 5 ลำดับชั้น',
-'right-versiondetail' => 'à¹à¸ªà¸”งข้อมูลรุ่นปรับปรุงของซอฟต์à¹à¸§à¸£à¹Œ',
'right-sendemail' => 'ส่งอีเมลไปยังผู้ใช้อื่นๆ',
# User rights log
@@ -1401,14 +1415,9 @@ $1",
'recentchanges-legend' => 'ตัวเลือà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”',
'recentchangestext' => 'ในหน้านี้เป็นรายà¸à¸²à¸£à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ที่มีà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡',
'recentchanges-feed-description' => 'ฟีดนี้à¹à¸ªà¸”งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”',
-'recentchanges-label-legend' => 'สัà¸à¸¥à¸±à¸à¸©à¸“์: $1',
-'recentchanges-legend-newpage' => '$1 - หน้าใหม่',
'recentchanges-label-newpage' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขนี้เป็นà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸«à¸™à¹‰à¸²à¹ƒà¸«à¸¡à¹ˆ',
-'recentchanges-legend-minor' => '$1 - à¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢',
'recentchanges-label-minor' => 'เป็นà¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢',
-'recentchanges-legend-bot' => '$1 - à¸à¸²à¸£à¹à¸à¹‰à¹„ขโดยบอต',
'recentchanges-label-bot' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขนี้à¸à¸£à¸°à¸—ำโดยบอต',
-'recentchanges-legend-unpatrolled' => '$1 - à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่รอตรวจสอบ',
'recentchanges-label-unpatrolled' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขนี้ยังไม่ได้ตรวจสอบ',
'rcnote' => "รายà¸à¸²à¸£à¸”้านล่างคือà¸à¸²à¸£à¹à¸à¹‰à¹„ข {{PLURAL:$1|'''1''' รายà¸à¸²à¸£|ล่าสุด '''$1''' รายà¸à¸²à¸£}} ในช่วง {{PLURAL:$2|1 วัน|'''$2''' วัน}}ที่ผ่านมา ตั้งà¹à¸•à¹ˆà¸§à¸±à¸™à¸—ี่ $5; $4",
'rcnotefrom' => "à¹à¸ªà¸”งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸•à¸±à¹‰à¸‡à¹à¸•à¹ˆ '''$2''' (à¹à¸ªà¸”ง '''$1''' รายà¸à¸²à¸£)",
@@ -1455,6 +1464,9 @@ $1",
'upload_directory_missing' => 'ไดเรà¸à¸—อรีสำหรับอัปโหลด ($1) หายไป à¹à¸¥à¸°à¹„ม่สามารถสร้างขึ้นใหม่โดยเว็บเซิร์ฟเวอร์',
'upload_directory_read_only' => 'ไม่สามารถเà¸à¹‡à¸šà¸‚้อมูลในไดเรà¸à¸—อรี ($1) ปัà¸à¸«à¸²à¹€à¸à¸´à¸”ที่เว็บเซิร์ฟเวอร์',
'uploaderror' => 'เà¸à¸´à¸”ความขัดข้องในà¸à¸²à¸£à¸­à¸±à¸›à¹‚หลด',
+'upload-recreate-warning' => "'''คำเตือน: ไฟล์ชื่อดังà¸à¸¥à¹ˆà¸²à¸§à¸–ูà¸à¸¥à¸šà¸«à¸£à¸·à¸­à¸–ูà¸à¸¢à¹‰à¸²à¸¢à¹„ปà¹à¸¥à¹‰à¸§'''
+
+ปูมà¸à¸²à¸£à¸¥à¸šà¹à¸¥à¸°à¸›à¸¹à¸¡à¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¸‚องหน้านี้ถูà¸à¸™à¸³à¸¡à¸²à¹„ว้ด้านล่างเพื่อความสะดวà¸:",
'uploadtext' => "à¸à¸£à¸¸à¸“าใช้à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸”้านล่างในà¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดไฟล์
สำหรับà¸à¸²à¸£à¸”ูหรือà¸à¸²à¸£à¸„้นหาไฟล์ที่เคยอัปโหลดà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰ ให้ไปที่[[Special:FileList|รายชื่อไฟล์ที่ถูà¸à¸­à¸±à¸›à¹‚หลด]] à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดà¹à¸¥à¸°à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดซ้ำดูได้ที่[[Special:Log/upload|บันทึà¸à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลด]] à¹à¸¥à¸°à¸à¸²à¸£à¸¥à¸šà¹„ฟล์ดูได้ที่[[Special:Log/delete|บันทึà¸à¸à¸²à¸£à¸¥à¸š]]
@@ -1462,7 +1474,7 @@ $1",
* '''<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' => 'บันทึà¸à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลด',
@@ -1486,6 +1498,17 @@ $1",
'filetype-unwanted-type' => "{{PLURAL:\$3|ไฟล์|ไฟล์}}ชนิด '''\".\$1\"''' เป็นไฟล์ที่ไม่สามารถอัปโหลดได้ ไฟล์ที่สามารถใช้ได้ ได้à¹à¸à¹ˆ \$2",
'filetype-banned-type' => "ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¹„ฟล์ชนิด '''\".\$1\"''' {{PLURAL:\$3|ชนิดของไฟล์|ชนิดของไฟล์}}ที่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¹„ด้คือ \$2",
'filetype-missing' => 'นามสà¸à¸¸à¸¥à¹„ฟล์หายไป (เช่น ".jpg")',
+'empty-file' => 'ไฟล์ที่คุณส่งมานั้นไม่มีข้อมูล',
+'file-too-large' => 'ไฟล์ที่คุณส่งมามีขนาดใหà¸à¹ˆà¹€à¸à¸´à¸™à¹„ป',
+'filename-tooshort' => 'ชื่อไฟล์สั้นเà¸à¸´à¸™à¹„ป',
+'filetype-banned' => 'ไฟล์ประเภทนี้ถูà¸à¸«à¹‰à¸²à¸¡',
+'verification-error' => 'ไฟล์นี้ไม่ผ่านà¸à¸²à¸£à¸žà¸´à¸ªà¸¹à¸ˆà¸™à¹Œà¸¢à¸·à¸™à¸¢à¸±à¸™à¹„ฟล์',
+'hookaborted' => 'สิ่งที่คุณพยายามที่จะทำà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹„ด้ถูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¹‚ดยส่วนขยาย',
+'illegal-filename' => 'ชื่อไฟล์นี้ไม่ได้รับอนุà¸à¸²à¸•',
+'overwrite' => 'ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹€à¸‚ียนทับไฟล์ที่มีอยู่à¹à¸¥à¹‰à¸§',
+'unknown-error' => 'เà¸à¸´à¸”ข้อผิดพลาดไม่ทราบสาเหตุ',
+'tmp-create-error' => 'ไม่สามารถสร้างไฟล์ชั่วคราว',
+'tmp-write-error' => 'เà¸à¸´à¸”ข้อผิดพลาดในà¸à¸²à¸£à¹€à¸‚ียนไฟล์ชั่วคราว',
'large-file' => 'ไฟล์ไม่ควรมีขนาดใหà¸à¹ˆà¸à¸§à¹ˆà¸² $1 ไฟล์นี้มีขนาด $2',
'largefileserver' => 'ไฟล์นี้มีขนาดใหà¸à¹ˆà¸à¸§à¹ˆà¸²à¸„่าที่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¹„ด้',
'emptyfile' => 'ไฟล์ที่อัปโหลดมาเหมือนไฟล์ว่าง อาจเà¸à¸´à¸”จาà¸à¸›à¸±à¸à¸«à¸²à¸žà¸´à¸¡à¸žà¹Œà¸Šà¸·à¹ˆà¸­à¹„ฟล์ผิด à¸à¸£à¸¸à¸“าตรวจสอบไฟล์อีà¸à¸„รั้ง à¹à¸¥à¸°à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¸—ี่จะอัปโหลดไฟล์นี้',
@@ -1513,13 +1536,14 @@ $1",
'file-exists-duplicate' => 'ไฟล์นี้ซ้ำà¸à¸±à¸š{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้:',
'file-deleted-duplicate' => 'ไฟล์ที่ตรงà¸à¸±à¸šà¸Šà¸·à¹ˆà¸­à¸™à¸µà¹‰ ([[:$1]]) เคยถูà¸à¸¥à¸šà¹„ปà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²
คุณควรตรวจสอบว่าประวัติà¸à¸²à¸£à¸¥à¸šà¸‚องไฟล์à¸à¹ˆà¸­à¸™à¸”ำเนินà¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดใหม่',
-'successfulupload' => 'อัปโหลดสำเร็จ',
'uploadwarning' => 'คำเตือนà¸à¸²à¸£à¸­à¸±à¸›à¹‚หลด',
'uploadwarning-text' => 'à¸à¸£à¸¸à¸“าà¹à¸à¹‰à¹„ขคำอธิบายไฟล์ด้านล่างนี้ à¹à¸¥à¹‰à¸§à¸¥à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆà¸­à¸µà¸à¸„รั้ง',
'savefile' => 'บันทึà¸à¹„ฟล์',
'uploadedimage' => '"[[$1]]" ถูà¸à¸­à¸±à¸›à¹‚หลด',
'overwroteimage' => 'อัปโหลดรุ่นใหม่ของ "[[$1]]"',
'uploaddisabled' => 'อัปโหลดปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
+'copyuploaddisabled' => 'à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดโดย URL ได้ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ว้',
+'uploadfromurl-queued' => 'à¸à¸²à¸£à¸­à¸±à¸žà¹‚หลดของคุณได้ถูà¸à¸ˆà¸±à¸”ในคิวà¹à¸¥à¹‰à¸§',
'uploaddisabledtext' => 'à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดไฟล์ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
'php-uploaddisabledtext' => 'à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดไฟล์ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹ƒà¸™ PHP
à¸à¸£à¸¸à¸“าตรวจสอบà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า file_uploads',
@@ -1539,6 +1563,14 @@ $1",
โปรดพิจารณาความเหมาะสมว่าจะยังอัปโหลดไฟล์นี้ต่อหรือไม่
นี่คือปูมà¸à¸²à¸£à¸¥à¸šà¸‚องไฟล์เพื่อประà¸à¸­à¸šà¸à¸²à¸£à¸•à¸±à¸”สินใจ:",
'filename-bad-prefix' => "ไฟล์ที่คุณà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸­à¸±à¸›à¹‚หลดเข้ามานี้มีชื่อที่ขึ้นต้นด้วย '''\"\$1\"''' ซึ่งเป็นชื่อที่ไม่สื่อความหมายใดๆ (โดยปà¸à¸•à¸´à¹à¸¥à¹‰à¸§à¸Šà¸·à¹ˆà¸­à¸™à¸µà¹‰à¸ˆà¸°à¸–ูà¸à¸•à¸±à¹‰à¸‡à¸¡à¸²à¹‚ดยà¸à¸¥à¹‰à¸­à¸‡à¸–่ายรูปดิจิทัล). à¸à¸£à¸¸à¸“าตั้งชื่อไฟล์ใหม่ที่สื่อความหมายมาà¸à¸à¸§à¹ˆà¸²à¹€à¸”ิม",
+'upload-success-subj' => 'อัปโหลดสำเร็จ',
+'upload-success-msg' => 'à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดของคุณจาภ[$2] สำเร็จà¹à¸¥à¹‰à¸§ à¹à¸¥à¸°à¸ªà¸²à¸¡à¸²à¸£à¸–ใช้ไฟล์ได้ที่นี่: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'ปัà¸à¸«à¸²à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลด',
+'upload-failure-msg' => 'พบปัà¸à¸«à¸²à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดของคุณจาภ[$2]:
+
+$1',
+'upload-warning-subj' => 'คำเตือนà¸à¸²à¸£à¸­à¸±à¸›à¹‚หลด',
+'upload-warning-msg' => 'พบปัà¸à¸«à¸²à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดของคุณจาภ[$2] คุณอาจà¸à¸¥à¸±à¸šà¹„ปยัง[[Special:Upload/stash/$1|ฟอร์มอัปโหลด]]เพื่อà¹à¸à¹‰à¹„ขปัà¸à¸«à¸²à¸™à¸µà¹‰',
'upload-proto-error' => 'โพรโทคอลไม่ถูà¸à¸•à¹‰à¸­à¸‡',
'upload-proto-error-text' => 'à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดโดยตรงจาà¸à¹€à¸§à¹‡à¸šà¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¸¢à¸¹à¸­à¸²à¸£à¹Œà¹à¸­à¸¥à¸—ี่ขึ้นต้นด้วย <code>http://</code> หรือ <code>ftp://</code>',
@@ -1580,7 +1612,7 @@ $1",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'ไม่สามารถติดต่อยูอาร์à¹à¸­à¸¥à¹„ด้',
-'upload-curl-error6-text' => 'ยูอาร์à¹à¸­à¸¥à¸—ี่ใส่ค่ามาไม่สามารถติดต่อได à¸à¸£à¸¸à¸“าตรวจสอบอีà¸à¸„รั้งว่ายูอาร์à¹à¸­à¸¥à¸™à¸±à¹‰à¸™à¸–ูà¸à¸•à¹‰à¸­à¸‡ à¹à¸¥à¸°à¹€à¸§à¹‡à¸šà¹„ซต์นั้นยังใช้งานได้ตามปà¸à¸•à¸´',
+'upload-curl-error6-text' => 'ยูอาร์à¹à¸­à¸¥à¸—ี่ใส่ค่ามาไม่สามารถติดต่อได้ à¸à¸£à¸¸à¸“าตรวจสอบอีà¸à¸„รั้งว่ายูอาร์à¹à¸­à¸¥à¸™à¸±à¹‰à¸™à¸–ูà¸à¸•à¹‰à¸­à¸‡ à¹à¸¥à¸°à¹€à¸§à¹‡à¸šà¹„ซต์นั้นยังใช้งานได้ตามปà¸à¸•à¸´',
'upload-curl-error28' => 'เวลาอัปโหลดถูà¸à¸•à¸±à¸”',
'upload-curl-error28-text' => 'เว็บไซต์นี้ใช้เวลานานเà¸à¸´à¸™à¹„ปในà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­ à¸à¸£à¸¸à¸“าตรวจสอบว่าเว็บนี้ยังใช้งานได้ตามปà¸à¸•à¸´ หรืออาจจะรอสัà¸à¸„รู่à¹à¸¥à¹‰à¸§à¸¥à¸­à¸‡à¸­à¸±à¸›à¹‚หลดใหม่',
@@ -1598,6 +1630,7 @@ $1",
'listfiles_search_for' => 'ค้นหาชื่อภาพ:',
'imgfile' => 'ไฟล์',
'listfiles' => 'รายชื่อไฟล์',
+'listfiles_thumb' => 'รูปย่อ',
'listfiles_date' => 'วันที่',
'listfiles_name' => 'ชื่อ',
'listfiles_user' => 'ผู้ใช้',
@@ -1710,8 +1743,8 @@ $1",
'statistics-edits' => 'à¹à¸à¹‰à¹„ขทั้งหมดตั้งà¹à¸•à¹ˆ{{SITENAME}}ภาษาไทยถูà¸à¸à¹ˆà¸­à¸•à¸±à¹‰à¸‡à¸‚ึ้นมา',
'statistics-edits-average' => 'จำนวนà¹à¸à¹‰à¹„ขต่อหน้าโดยเฉลี่ย',
'statistics-views-total' => 'จำนวนà¸à¸²à¸£à¹€à¸‚้าชมทั้งหมด',
+'statistics-views-total-desc' => 'ไม่นับรวมจำนวนà¸à¸²à¸£à¹€à¸‚้าชมหน้าที่ไม่มีอยู่à¹à¸¥à¸°à¸«à¸™à¹‰à¸²à¸žà¸´à¹€à¸¨à¸©',
'statistics-views-peredit' => 'จำนวนà¸à¸²à¸£à¹€à¸‚้าดูต่อà¸à¸²à¸£à¹à¸à¹‰à¹„ข:',
-'statistics-jobqueue' => 'ความยาว[http://www.mediawiki.org/wiki/Manual:Job_queue คิวงาน]',
'statistics-users' => '[[Special:ListUsers|ผู้ใช้]]ที่ลงทะเบียน',
'statistics-users-active' => 'ผู้ใช้ที่ยังà¹à¸à¹‰à¹„ขอยู่',
'statistics-users-active-desc' => 'ผู้ใช้ที่ได้à¹à¸à¹‰à¹„ขในช่วง $1 วันที่ผ่านมา',
@@ -1726,7 +1759,7 @@ $1",
'doubleredirects' => 'หน้าเปลี่ยนทางซ้ำซ้อน',
'doubleredirectstext' => 'หน้านี้à¹à¸ªà¸”งรายà¸à¸²à¸£à¸Šà¸·à¹ˆà¸­à¸—ี่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น
à¹à¸•à¹ˆà¸¥à¸°à¹à¸–วคือลิงà¸à¹Œà¸‚องà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างครั้งà¹à¸£à¸à¹à¸¥à¸°à¸„รั้งที่สอง พร้อมà¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸›à¸¥à¸²à¸¢à¸—างของà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างครั้งที่สอง ซึ่งควรà¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างครั้งà¹à¸£à¸à¹€à¸›à¹‡à¸™à¸«à¸™à¹‰à¸²à¸›à¸¥à¸²à¸¢à¸—างดังà¸à¸¥à¹ˆà¸²à¸§
-รายà¸à¸²à¸£à¸—ี่ <s>ขีดฆ่า</s> คือรายà¸à¸²à¸£à¸—ี่à¹à¸à¹‰à¹„ขà¹à¸¥à¹‰à¸§',
+รายà¸à¸²à¸£à¸—ี่ <del>ขีดฆ่า</del> คือรายà¸à¸²à¸£à¸—ี่à¹à¸à¹‰à¹„ขà¹à¸¥à¹‰à¸§',
'double-redirect-fixed-move' => '[[$1]] ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹à¸¥à¹‰à¸§ à¹à¸¥à¸°à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างไปยัง [[$2]]',
'double-redirect-fixer' => 'Redirect fixer',
@@ -1749,6 +1782,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|หน้า|หน้า}}',
'nrevisions' => '$1 ครั้ง',
'nviews' => '$1 ครั้ง',
+'nimagelinks' => 'ใช้ใน $1 {{PLURAL: $1|หน้า|หน้า}}',
+'ntransclusions' => 'ใช้ใน $1 {{PLURAL: $1|หน้า|หน้า}}',
'specialpage-empty' => 'ไม่มีหน้าที่เรียà¸à¸”ู',
'lonelypages' => 'หน้าสุดทาง',
'lonelypagestext' => 'หน้าต่อไปนี้ไม่มีà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยงหรือถูà¸à¸£à¸§à¸¡à¹„ว้ในหน้าอื่นใน {{SITENAME}}',
@@ -1793,8 +1828,8 @@ $1",
'ancientpages' => 'หน้าที่ไม่ได้à¹à¸à¹‰à¹„ขนานสุด',
'move' => 'เปลี่ยนชื่อ',
'movethispage' => 'เปลี่ยนชื่อหน้านี้',
-'unusedimagestext' => 'ไฟล์ดังต่อไปนี้ปราà¸à¸Žà¹à¸•à¹ˆà¹„ม่มีà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹ƒà¸Šà¹‰à¸—ี่หน้าใดๆ เลย
-ภาพนี้อาจจะถูà¸à¹ƒà¸Šà¹‰à¸ˆà¸²à¸à¹€à¸§à¹‡à¸šà¹„ซต์อื่น ซึ่งลิงà¸à¹Œà¸¡à¸²à¸ à¸²à¸žà¹ƒà¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¹‚ดยตรง ดังนั้นไฟล์ดังà¸à¸¥à¹ˆà¸²à¸§à¸ˆà¸°à¸¢à¸±à¸‡à¸›à¸£à¸²à¸à¸Žà¹ƒà¸™à¸£à¸²à¸¢à¸à¸²à¸£à¸™à¸µà¹‰à¹à¸¡à¹‰à¸§à¹ˆà¸²à¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸­à¸¢à¹ˆà¸²à¸‡à¸•à¹ˆà¸­à¹€à¸™à¸·à¹ˆà¸­à¸‡',
+'unusedimagestext' => 'ไฟล์ดังต่อไปนี้ปราà¸à¸à¹à¸•à¹ˆà¹„ม่มีà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹ƒà¸Šà¹‰à¸—ี่หน้าใดๆ เลย
+ภาพนี้อาจจะถูà¸à¹ƒà¸Šà¹‰à¸ˆà¸²à¸à¹€à¸§à¹‡à¸šà¹„ซต์อื่น ซึ่งลิงà¸à¹Œà¸¡à¸²à¸ à¸²à¸žà¹ƒà¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¹‚ดยตรง ดังนั้นไฟล์ดังà¸à¸¥à¹ˆà¸²à¸§à¸ˆà¸°à¸¢à¸±à¸‡à¸›à¸£à¸²à¸à¸à¹ƒà¸™à¸£à¸²à¸¢à¸à¸²à¸£à¸™à¸µà¹‰à¹à¸¡à¹‰à¸§à¹ˆà¸²à¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸­à¸¢à¹ˆà¸²à¸‡à¸•à¹ˆà¸­à¹€à¸™à¸·à¹ˆà¸­à¸‡',
'unusedcategoriestext' => 'หมวดหมู่ต่อไปนี้ยังมีอยู่ถึงà¹à¸¡à¹‰à¸§à¹ˆà¸²à¸ˆà¸°à¹„ม่มีว่าไม่มีหน้าไหนหรือบทความไหนใช้ส่วนนี้',
'notargettitle' => 'ไม่พบหน้าปลายทาง',
'notargettext' => 'ไม่ได้ใส่หน้าปลายทางหรือชื่อผู้ใช้ที่ต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸„ำสั่งนี้',
@@ -1823,7 +1858,7 @@ $1",
# Special:AllPages
'allpages' => 'หน้าทุà¸à¸«à¸™à¹‰à¸²',
-'alphaindexline' => '$1 ไป $2',
+'alphaindexline' => '$1 ถึง $2',
'nextpage' => 'ถัดไป ($1)',
'prevpage' => 'à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸² ($1)',
'allpagesfrom' => 'เริ่มà¹à¸ªà¸”งผลจาà¸:',
@@ -1904,34 +1939,40 @@ $1",
'listgrouprights-removegroup-self-all' => 'ลบทุà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸­à¸­à¸à¸ˆà¸²à¸à¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸™à¸µà¹‰',
# E-mail user
-'mailnologin' => 'ไม่มีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥',
-'mailnologintext' => 'ต้องà¸à¸²à¸£à¸—ำ[[Special:UserLogin|ล็อà¸à¸­à¸´à¸™]]à¹à¸¥à¸°à¸•à¸±à¹‰à¸‡à¸„่าอีเมลในส่วน[[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า]] เพื่อจะส่งอีเมลหาผู้ใช้คนอื่น',
-'emailuser' => 'ส่งอีเมลหาผู้ใช้นี้',
-'emailpage' => 'อีเมลผู้ใช้',
-'emailpagetext' => 'คุณสามารถใช้à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸”้านล่างส่งอีเมลหาผู้ใช้คนนี้
+'mailnologin' => 'ไม่มีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥',
+'mailnologintext' => 'ต้องà¸à¸²à¸£à¸—ำ[[Special:UserLogin|ล็อà¸à¸­à¸´à¸™]]à¹à¸¥à¸°à¸•à¸±à¹‰à¸‡à¸„่าอีเมลในส่วน[[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า]] เพื่อจะส่งอีเมลหาผู้ใช้คนอื่น',
+'emailuser' => 'ส่งอีเมลหาผู้ใช้นี้',
+'emailpage' => 'อีเมลผู้ใช้',
+'emailpagetext' => 'คุณสามารถใช้à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸”้านล่างส่งอีเมลหาผู้ใช้คนนี้
ชื่ออีเมลผู้ส่งจะใช้ชื่ออีเมลที่ได้ระบุไว้à¹à¸¥à¹‰à¸§à¹ƒà¸™[[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนตัวของคุณ]] ซึ่งผู้รับสามารถตอบà¸à¸¥à¸±à¸šà¹„ด้',
-'usermailererror' => 'à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥à¸œà¸´à¸”พลาด:',
-'defemailsubject' => '{{SITENAME}} อีเมล',
-'noemailtitle' => 'ไม่ได้ตั้งอีเมล',
-'noemailtext' => 'ผู้ใช้คนนี้ไม่ได้ตั้งค่าอีเมล',
-'nowikiemailtitle' => 'ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¸­à¸µà¹€à¸¡à¸¥',
-'nowikiemailtext' => 'ผู้ใช้ท่านนี้เลือà¸à¹„ม่รับอีเมล์จาà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸­à¸·à¹ˆà¸™',
-'email-legend' => 'ส่งอีเมลถึงผู้ใช้อื่นใน {{SITENAME}}',
-'emailfrom' => 'จาà¸:',
-'emailto' => 'ถึง:',
-'emailsubject' => 'หัวเรื่อง:',
-'emailmessage' => 'ข้อความ:',
-'emailsend' => 'ส่ง',
-'emailccme' => 'ส่งอีเมลสำเนาà¸à¸¥à¸±à¸šà¸¡à¸²',
-'emailccsubject' => 'ส่งข้อความซ้ำไปที่$1: $2',
-'emailsent' => 'อีเมลได้ถูà¸à¸ªà¹ˆà¸‡à¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢',
-'emailsenttext' => 'อีเมลได้ถูà¸à¸ªà¹ˆà¸‡à¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢',
-'emailuserfooter' => 'อีเมลฉบับนี้ถูà¸à¸ªà¹ˆà¸‡à¹‚ดย $1 ถึง $2 ด้วยฟังà¸à¹Œà¸Šà¸±à¸™ "อีเมลผู้ใช้รายนี้" ที่ {{SITENAME}}',
+'usermailererror' => 'à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥à¸œà¸´à¸”พลาด:',
+'defemailsubject' => '{{SITENAME}} อีเมล',
+'usermaildisabled' => 'à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥à¸«à¸²à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹„ม่สามารถใช้งานได้',
+'usermaildisabledtext' => 'คุณไม่สามารถส่งอีเมลไปหาผู้ใช้อื่นบนวิà¸à¸´à¸™à¸µà¹‰',
+'noemailtitle' => 'ไม่ได้ตั้งอีเมล',
+'noemailtext' => 'ผู้ใช้คนนี้ไม่ได้ตั้งค่าอีเมล',
+'nowikiemailtitle' => 'ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¸­à¸µà¹€à¸¡à¸¥',
+'nowikiemailtext' => 'ผู้ใช้ท่านนี้เลือà¸à¹„ม่รับอีเมลจาà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸­à¸·à¹ˆà¸™',
+'email-legend' => 'ส่งอีเมลถึงผู้ใช้อื่นใน {{SITENAME}}',
+'emailfrom' => 'จาà¸:',
+'emailto' => 'ถึง:',
+'emailsubject' => 'หัวเรื่อง:',
+'emailmessage' => 'ข้อความ:',
+'emailsend' => 'ส่ง',
+'emailccme' => 'ส่งอีเมลสำเนาà¸à¸¥à¸±à¸šà¸¡à¸²',
+'emailccsubject' => 'ส่งข้อความซ้ำไปที่$1: $2',
+'emailsent' => 'อีเมลได้ถูà¸à¸ªà¹ˆà¸‡à¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢',
+'emailsenttext' => 'อีเมลได้ถูà¸à¸ªà¹ˆà¸‡à¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢',
+'emailuserfooter' => 'อีเมลฉบับนี้ถูà¸à¸ªà¹ˆà¸‡à¹‚ดย $1 ถึง $2 ด้วยฟังà¸à¹Œà¸Šà¸±à¸™ "อีเมลผู้ใช้รายนี้" ที่ {{SITENAME}}',
+
+# User Messenger
+'usermessage-summary' => 'à¸à¸²à¸à¸‚้อความของระบบ',
+'usermessage-editor' => 'ตัวส่งข้อความของระบบ',
# Watchlist
'watchlist' => 'รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'mywatchlist' => 'รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
-'watchlistfor' => "(สำหรับ '''$1''')",
+'watchlistfor2' => 'สำหรับ $1 ($2)',
'nowatchlist' => 'ไม่ได้ใส่หน้าไหนเข้ารายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'watchlistanontext' => 'à¸à¸£à¸¸à¸“า $1 เพื่อที่จะดูหรือà¹à¸à¹‰à¹„ขหน้าในรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'watchnologin' => 'ไม่ได้ล็อà¸à¸­à¸´à¸™',
@@ -2049,7 +2090,10 @@ $UNWATCHURL
'revertpage' => 'ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขของ [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ไปยังรุ่นของ [[User:$1|$1]]',
'revertpage-nouser' => 'ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขโดย (ชื่อผู้ใช้ถูà¸à¸¥à¸šà¸­à¸­à¸) ไปยังรุ่นล่าสุดโดย [[User:$1|$1]]',
'rollback-success' => 'ย้อนรุ่นที่à¹à¸à¹‰à¹„ขโดย $1 ไปยังรุ่นล่าสุดที่à¹à¸à¹‰à¹„ขโดย $2 à¹à¸¥à¹‰à¸§',
-'sessionfailure' => 'ท่าทางจะมีปัà¸à¸«à¸²à¹€à¸à¸µà¹ˆà¸¢à¸§à¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡à¹€à¸§à¸¥à¸²à¸™à¸µà¹‰ เà¸à¸´à¸”จาà¸à¸—างระบบป้องà¸à¸±à¸™à¸à¸²à¸£à¸¥à¸±à¸à¸¥à¸­à¸šà¸à¸²à¸£à¸‚โมยล็อà¸à¸­à¸´à¸™ à¸à¸£à¸¸à¸“าย้อนà¸à¸¥à¸±à¸šà¹„ปหน้าà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸² à¹à¸¥à¸°à¸¥à¸­à¸‡à¹‚หลดใหม่อีà¸à¸„รั้ง',
+
+# Edit tokens
+'sessionfailure-title' => 'Session นี้ล้มเหลว',
+'sessionfailure' => 'ท่าทางจะมีปัà¸à¸«à¸²à¹€à¸à¸µà¹ˆà¸¢à¸§à¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡à¹€à¸§à¸¥à¸²à¸™à¸µà¹‰ เà¸à¸´à¸”จาà¸à¸—างระบบป้องà¸à¸±à¸™à¸à¸²à¸£à¸¥à¸±à¸à¸¥à¸­à¸šà¸à¸²à¸£à¸‚โมยล็อà¸à¸­à¸´à¸™ à¸à¸£à¸¸à¸“าย้อนà¸à¸¥à¸±à¸šà¹„ปหน้าà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸² à¹à¸¥à¸°à¸¥à¸­à¸‡à¹‚หลดใหม่อีà¸à¸„รั้ง',
# Protect
'protectlogpage' => 'บันทึà¸à¸à¸²à¸£à¸¥à¹‡à¸­à¸',
@@ -2172,19 +2216,23 @@ $1',
'month' => 'จาà¸à¹€à¸”ือน (à¹à¸¥à¸°à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²):',
'year' => 'จาà¸à¸›à¸µ (à¹à¸¥à¸°à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²):',
-'sp-contributions-newbies' => 'à¹à¸ªà¸”งà¸à¸²à¸£à¹à¸à¹‰à¹„ขของผู้ใช้ใหม่เท่านั้น',
-'sp-contributions-newbies-sub' => 'สำหรับผู้ใช้ใหม่',
-'sp-contributions-newbies-title' => 'เรื่องที่เขียนโดยบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹ƒà¸«à¸¡à¹ˆ',
-'sp-contributions-blocklog' => 'บันทึà¸à¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸',
-'sp-contributions-deleted' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่ถูà¸à¸¥à¸š',
-'sp-contributions-logs' => 'ปูม',
-'sp-contributions-talk' => 'พูดคุย',
-'sp-contributions-userrights' => 'บริหารสิทธิผู้ใช้',
-'sp-contributions-blocked-notice' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูà¸à¸šà¸¥à¹‡à¸­à¸
+'sp-contributions-newbies' => 'à¹à¸ªà¸”งà¸à¸²à¸£à¹à¸à¹‰à¹„ขของผู้ใช้ใหม่เท่านั้น',
+'sp-contributions-newbies-sub' => 'สำหรับผู้ใช้ใหม่',
+'sp-contributions-newbies-title' => 'เรื่องที่เขียนโดยบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹ƒà¸«à¸¡à¹ˆ',
+'sp-contributions-blocklog' => 'บันทึà¸à¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸',
+'sp-contributions-deleted' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่ถูà¸à¸¥à¸š',
+'sp-contributions-uploads' => 'อัปโหลด',
+'sp-contributions-logs' => 'ปูม',
+'sp-contributions-talk' => 'พูดคุย',
+'sp-contributions-userrights' => 'บริหารสิทธิผู้ใช้',
+'sp-contributions-blocked-notice' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูà¸à¸šà¸¥à¹‡à¸­à¸
+ปูมà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸¥à¹ˆà¸²à¸ªà¸¸à¸”à¹à¸ªà¸”งด้านล่างนี้เพื่อà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡:',
+'sp-contributions-blocked-notice-anon' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูà¸à¸šà¸¥à¹‡à¸­à¸
ปูมà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸¥à¹ˆà¸²à¸ªà¸¸à¸”à¹à¸ªà¸”งด้านล่างนี้เพื่อà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡:',
-'sp-contributions-search' => 'ค้นหาà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
-'sp-contributions-username' => 'หมายเลขไอพีหรือชื่อผู้ใช้:',
-'sp-contributions-submit' => 'สืบค้น',
+'sp-contributions-search' => 'ค้นหาà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'sp-contributions-username' => 'หมายเลขไอพีหรือชื่อผู้ใช้:',
+'sp-contributions-toponly' => 'à¹à¸ªà¸”งเฉพาะà¸à¸²à¸£à¹à¸à¹‰à¹„ขรุ่นล่าสุด',
+'sp-contributions-submit' => 'สืบค้น',
# What links here
'whatlinkshere' => 'หน้าที่ลิงà¸à¹Œà¸¡à¸²',
@@ -2244,8 +2292,7 @@ $1',
'ipb-edit-dropdown' => 'à¹à¸à¹‰à¹„ขสาเหตุà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸',
'ipb-unblock-addr' => 'เลิà¸à¸šà¸¥à¹‡à¸­à¸ $1',
'ipb-unblock' => 'เลิà¸à¸šà¸¥à¹‡à¸­à¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸«à¸£à¸·à¸­à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี',
-'ipb-blocklist-addr' => 'ดูà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸—ี่มีอยู่สำหรับ $1',
-'ipb-blocklist' => 'ดูà¸à¸²à¸£à¸›à¸¥à¹‡à¸­à¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™',
+'ipb-blocklist' => 'ดูà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™',
'ipb-blocklist-contribs' => 'ผลงานที่สร้างสรรค์โดย $1',
'unblockip' => 'ปลดบล็อà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
'unblockiptext' => 'ใช้à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸”้านล่างสำหรับบล็อà¸à¸«à¸£à¸·à¸­à¹€à¸¥à¸´à¸à¸šà¸¥à¹‡à¸­à¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี หรือผู้ใช้',
@@ -2295,7 +2342,7 @@ $1',
'range_block_disabled' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸Šà¹ˆà¸§à¸‡à¹„อพีของผู้ดูà¹à¸¥à¸£à¸°à¸šà¸š',
'ipb_expiry_invalid' => 'ค่าวันหมดอายุไม่ถูà¸à¸•à¹‰à¸­à¸‡',
'ipb_expiry_temp' => 'ผู้ใช้ที่ถูà¸à¸šà¸¥à¹‡à¸­à¸à¸ˆà¸°à¸‹à¹ˆà¸­à¸™à¹‚ดยถาวร',
-'ipb_hide_invalid' => 'ไม่สามารถยับยั้งชื่อผู้ใช้นี้ได้; เนื่องจาà¸à¸­à¸²à¸ˆà¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¹à¸à¹‰à¹„ขมาà¸à¹€à¸à¸´à¸™à¹„ป',
+'ipb_hide_invalid' => 'ไม่สามารถยับยั้งชื่อผู้ใช้นี้ได้ เนื่องจาà¸à¸­à¸²à¸ˆà¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¹à¸à¹‰à¹„ขมาà¸à¹€à¸à¸´à¸™à¹„ป',
'ipb_already_blocked' => '"$1" ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
'ipb-needreblock' => '== ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ ==
$1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à¹„ขหรือไม่',
@@ -2313,6 +2360,8 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
'sorbs_create_account_reason' => 'หมายเลขไอพีของคุณอยู่ในพร็อà¸à¸‹à¸µà¹€à¸›à¸´à¸”ในส่วน DNSBL ที่ถูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹ƒà¸™à¹€à¸§à¹‡à¸šà¹„ซต์ ดังนั้นคุณไม่สามารถสร้างชื่อบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹„ด้',
'cant-block-while-blocked' => 'คุณไม่สามารถบล็อà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸­à¸·à¹ˆà¸™à¹ƒà¸™à¸‚ณะที่คุณà¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¸šà¸¥à¹‡à¸­à¸',
'cant-see-hidden-user' => 'ผู้ใช่ที่คุณà¸à¸³à¸¥à¸±à¸‡à¸žà¸¢à¸²à¸¢à¸²à¸¡à¸£à¸°à¸‡à¸±à¸šà¸™à¸±à¹‰à¸™à¹„ด้ถูà¸à¸£à¸°à¸‡à¸±à¸šà¸«à¸£à¸·à¸­à¸‹à¹ˆà¸­à¸™à¹€à¸”ิมอยู่à¹à¸¥à¹‰à¸§ ในขณะที่ีคุณไม่มีสิทธิ์ในà¸à¸²à¸£à¸‹à¹ˆà¸­à¸™à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ คุณไม่สามารถดูหรือà¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸£à¸°à¸‡à¸±à¸šà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹„ด้',
+'ipbblocked' => 'คุณไม่สามารถบล็อà¸à¸«à¸£à¸·à¸­à¸›à¸¥à¸”บล็อà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸„นอื่น เนื่องจาà¸à¸„ุณà¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¸šà¸¥à¹‡à¸­à¸',
+'ipbnounblockself' => 'คุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¸›à¸¥à¸”บล็อà¸à¸•à¸™à¹€à¸­à¸‡',
# Developer tools
'lockdb' => 'ล็อà¸à¸à¸²à¸™à¸‚้อมูล',
@@ -2343,6 +2392,17 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
<b>คำเตือน!</b>
à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¸ˆà¸°à¸¡à¸µà¸œà¸¥à¸­à¸¢à¹ˆà¸²à¸‡à¸¡à¸²à¸à¸à¸±à¸šà¸ªà¸–ิติของหน้านิยมที่มีคนเข้าดูมาภให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹ƒà¸™à¸„รั้งนี้",
+'movepagetext-noredirectfixer' => "à¸à¸²à¸£à¹ƒà¸Šà¹‰à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸”้านล่างนี้จะเปลี่ยนชื่อหน้า ซึ่งจะทำให้ประวัติทั้งหมดย้ายไปยังชื่อใหม่
+ชื่อเรื่องเà¸à¹ˆà¸²à¸ˆà¸°à¸à¸¥à¸²à¸¢à¹€à¸›à¹‡à¸™à¸«à¸™à¹‰à¸²à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างไปยังชื่อเรื่องใหม่
+อย่าลืมตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางที่เสีย]]
+คุณจะเป็นผู้รับผิดชอบเพื่อให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยงต่าง ๆ ชี้ไปยังที่ที่พวà¸à¸¡à¸±à¸™à¸„วรจะไป
+
+โปรดทราบว่าหน้าดังà¸à¸¥à¹ˆà¸²à¸§à¸ˆà¸°'''ไม่'''ถูà¸à¸¢à¹‰à¸²à¸¢ ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่à¹à¸¥à¹‰à¸§ เว้นà¹à¸•à¹ˆà¹€à¸›à¹‡à¸™à¸«à¸™à¹‰à¸²à¸§à¹ˆà¸²à¸‡à¸«à¸£à¸·à¸­à¸«à¸™à¹‰à¸²à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—าง à¹à¸¥à¸°à¹„ม่มีประวัติà¸à¸²à¸£à¹à¸à¹‰à¹„ขในอดีต
+ซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้าà¸à¸¥à¸±à¸šà¹„ปเป็นชื่อเดิมหาà¸à¸„ุณทำผิดพลาด à¹à¸¥à¸°à¸„ุณไม่สามารถเขียนทับหน้าที่มีอยู่à¹à¸¥à¹‰à¸§à¹„ด้
+
+'''คำเตือน!'''
+สิ่งนี้อาจเป็นà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ี่รุนà¹à¸£à¸‡à¹à¸¥à¸°à¹„ม่คาดคิดสำหรับหน้าที่เป็นที่นิยม
+โปรดà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸„ุณเข้าใจในผลของà¸à¸²à¸£à¸à¸£à¸°à¸—ำนี้à¸à¹ˆà¸­à¸™à¸—ี่จะดำเนินà¸à¸²à¸£à¸•à¹ˆà¸­à¹„ป",
'movepagetalktext' => "หน้าพูดคุยของหน้านี้จะถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¸•à¸²à¸¡à¹„ปด้วย '''เว้นเสียà¹à¸•à¹ˆ:'''
*หน้าพูดคุยไม่ว่างมีà¹à¸¥à¹‰à¸§à¸—ี่ชื่อใหม่ หรือ
*ได้เลือà¸à¹„ม่ต้องà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¸”้านล่าง
@@ -2397,6 +2457,7 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
'immobile-source-page' => 'หน้านี้ไม่สามารถเปลี่ยนชื่อได้',
'immobile-target-page' => 'ไม่สามารถเปลี่ยนไปยังชื่อที่ต้องà¸à¸²à¸£à¹„ด้',
'imagenocrossnamespace' => 'ไม่สามารถย้ายไฟล์ไปยังเนมสเปซที่ไม่รองรับ',
+'nonfile-cannot-move-to-file' => 'ไม่สามารถย้ายจาà¸à¹€à¸™à¸¡à¸ªà¹€à¸›à¸‹à¸­à¸·à¹ˆà¸™à¸¡à¸²à¹€à¸›à¹‡à¸™à¹€à¸™à¸¡à¸ªà¹€à¸›à¸‹à¹„ฟล์',
'imagetypemismatch' => 'นามสà¸à¸¸à¸¥à¸‚องไฟล์ใหม่ไม่ตรงà¸à¸±à¸šà¸Šà¸™à¸´à¸”ของไฟล์',
'imageinvalidfilename' => 'ชื่อไฟล์เป้าหมายไม่ถูà¸à¸•à¹‰à¸­à¸‡',
'fix-double-redirects' => 'อัปเดตหน้าเปลี่ยนทางทุà¸à¸«à¸™à¹‰à¸²à¸—ี่โอนไปยังชื่อเดิม',
@@ -2405,9 +2466,9 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
บันทึà¸à¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ถูà¸à¹à¸ªà¸”งไว้ด้านล่างเพื่อà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡",
'semiprotectedpagemovewarning' => "'''หมายเหตุ:''' หน้านี้ถูà¸à¸¥à¹‡à¸­à¸ à¹à¸¥à¸°à¹à¸à¹‰à¹„ขได้เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้น
รายà¸à¸²à¸£à¹à¸à¹‰à¹„ขล่าสุดได้ถูà¸à¹à¸ªà¸”งไว้ด้านล่างนี้เพื่อà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡",
-'move-over-sharedrepo' => '== มีไฟล์เดิมปราà¸à¸Ž ==
-ไฟล์ [[:$1]] มีปราà¸à¸Žà¹€à¸”ิมอยู่à¹à¸¥à¹‰à¸§à¹ƒà¸™à¸„ลังเà¸à¹‡à¸šà¸ à¸²à¸žà¸ªà¹ˆà¸§à¸™à¸à¸¥à¸²à¸‡ à¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¹„ฟล์ที่มีชื่อเรื่องนี้อาจจะเป็นà¸à¸²à¸£à¹€à¸‚ียนทับไฟล์เดิมในคลับเà¸à¹‡à¸šà¹„ด้',
-'file-exists-sharedrepo' => 'ชื่อไฟล์นี้มีปราà¸à¸Žà¹€à¸”ิมอยู่à¹à¸¥à¹‰à¸§à¹ƒà¸™à¸„ลังเà¸à¹‡à¸šà¸ à¸²à¸žà¸ªà¹ˆà¸§à¸™à¸à¸¥à¸²à¸‡
+'move-over-sharedrepo' => '== มีไฟล์เดิมปราà¸à¸ ==
+ไฟล์ [[:$1]] มีปราà¸à¸à¹€à¸”ิมอยู่à¹à¸¥à¹‰à¸§à¹ƒà¸™à¸„ลังเà¸à¹‡à¸šà¸ à¸²à¸žà¸ªà¹ˆà¸§à¸™à¸à¸¥à¸²à¸‡ à¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¹„ฟล์ที่มีชื่อเรื่องนี้อาจจะเป็นà¸à¸²à¸£à¹€à¸‚ียนทับไฟล์เดิมในคลังเà¸à¹‡à¸šà¹„ด้',
+'file-exists-sharedrepo' => 'ชื่อไฟล์นี้มีปราà¸à¸à¹€à¸”ิมอยู่à¹à¸¥à¹‰à¸§à¹ƒà¸™à¸„ลังเà¸à¹‡à¸šà¸ à¸²à¸žà¸ªà¹ˆà¸§à¸™à¸à¸¥à¸²à¸‡
à¸à¸£à¸¸à¸“าเลือà¸à¸Šà¸·à¹ˆà¸­à¸­à¸·à¹ˆà¸™',
# Export
@@ -2439,9 +2500,9 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
'allmessagesnotsupportedDB' => "หน้านี้ไม่สามารถใช้งานได้เนื่องจาภ'''\$wgUseDatabaseMessages''' ถูà¸à¸£à¸°à¸‡à¸±à¸šà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™",
'allmessages-filter-legend' => 'à¸à¸£à¸­à¸‡',
'allmessages-filter' => 'à¸à¸£à¸­à¸‡à¸•à¸²à¸¡à¸ªà¸–านะที่เลือà¸:',
-'allmessages-filter-unmodified' => 'มีà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'allmessages-filter-unmodified' => 'ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'allmessages-filter-all' => 'ทั้งหมด',
-'allmessages-filter-modified' => 'ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'allmessages-filter-modified' => 'มีà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'allmessages-prefix' => 'à¸à¸£à¸­à¸‡à¸”้วยคำข้างหน้า:',
'allmessages-language' => 'ภาษา:',
'allmessages-filter-submit' => 'ไป',
@@ -2473,6 +2534,7 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
'importstart' => 'à¸à¸³à¸¥à¸±à¸‡à¸™à¸³à¹€à¸‚้าหน้า...',
'import-revision-count' => '$1 {{PLURAL:$1|รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ข|รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ข}}',
'importnopages' => 'ไม่มีหน้าให้นำเข้า',
+'imported-log-entries' => 'นำ $1 {{PLURAL:$1| เข้าระบบ | รายà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸}}',
'importfailed' => 'à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าไม่สำเร็จ: <nowiki>$1</nowiki>',
'importunknownsource' => 'ไม่ทราบชนิดของไฟล์นำเข้า',
'importcantopen' => 'ไม่สามารถเปิดไฟล์นำเข้าได้',
@@ -2568,6 +2630,8 @@ $1 ถูà¸à¸šà¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ คุณต้องà¸à¸²à¸£à¹à¸à¹‰à
'tooltip-upload' => 'เริ่มอัปโหลด',
'tooltip-rollback' => '"ถอยà¸à¸¥à¸±à¸šà¸‰à¸¸à¸à¹€à¸‰à¸´à¸™" ใช้ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขของหน้านี้ไปยังรุ่นโดยผู้ใช้à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹ƒà¸™à¸„ลิà¸à¹€à¸”ียว',
'tooltip-undo' => '"ย้อน" ใช้ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขครั้งนี้à¹à¸¥à¸°à¹€à¸›à¸´à¸”ฟอร์มให้à¹à¸à¹‰à¹„ข สามารถเพิ่มคำอธิบายในตอนท้าย',
+'tooltip-preferences-save' => 'บันทึà¸à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า',
+'tooltip-summary' => 'ใส่คำอธิบายอย่างย่อสั้น ๆ',
# Stylesheets
'common.css' => '/** CSS ที่อยู่ในหน้านี้จะมีผลต่อทุà¸à¸ªà¸à¸´à¸™à¹ƒà¸™à¹€à¸§à¹‡à¸šà¹„ซต์ */',
@@ -2679,14 +2743,17 @@ $1',
'imagemaxsize' => "ขนาดภาพที่จำà¸à¸±à¸”:<br />''(สำหรับหน้าอธิบายภาพ)''",
'thumbsize' => 'ขนาดรูปย่อ:',
'widthheightpage' => '{{PLURAL:$3|หน้า|หน้า}} $1×$2, $3',
-'file-info' => '(ขนาดไฟล์: $1, ชนิดไมม์: $2)',
-'file-info-size' => '($1 × $2 พิà¸à¹€à¸‹à¸¥, ขนาดไฟล์: $3, ชนิดไมม์: $4)',
+'file-info' => 'ขนาดไฟล์: $1, ชนิดไมม์: $2',
+'file-info-size' => '$1 × $2 พิà¸à¹€à¸‹à¸¥, ขนาดไฟล์: $3, ชนิดไมม์: $4',
'file-nohires' => '<small>ไม่มีภาพความละเอียดสูงà¸à¸§à¹ˆà¸²à¸™à¸µà¹‰</small>',
-'svg-long-desc' => '(ไฟล์ SVG, $1 × $2 พิà¸à¹€à¸‹à¸¥ (พอเป็นพิธี), ขนาดไฟล์: $3)',
+'svg-long-desc' => 'ไฟล์ SVG, $1 × $2 พิà¸à¹€à¸‹à¸¥ พอเป็นพิธี, ขนาดไฟล์: $3',
'show-big-image' => 'ความละเอียดสูงสุด',
'show-big-image-thumb' => '<small>ขนาดของภาพà¹à¸ªà¸”งผล: $1 × $2 พิà¸à¹€à¸‹à¸¥</small>',
'file-info-gif-looped' => 'วนซ้ำ',
'file-info-gif-frames' => '$1 {{PLURAL:$1|เฟรม|เฟรม}}',
+'file-info-png-looped' => 'วนซ้ำ',
+'file-info-png-repeat' => 'เล่นà¹à¸¥à¹‰à¸§ $1 {{PLURAL:$1|ครั้ง|ครั้ง}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|เฟรม|เฟรม}}',
# Special:NewFiles
'newimages' => 'à¹à¸à¸¥à¸¥à¸­à¸£à¸µà¸ à¸²à¸žà¹ƒà¸«à¸¡à¹ˆ',
@@ -2839,6 +2906,7 @@ $1',
'exif-gpsareainformation' => 'ชื่อของพื้นที่จีพีเอส',
'exif-gpsdatestamp' => 'วันที่จีพีเอส',
'exif-gpsdifferential' => 'à¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸„่ข้อà¹à¸•à¸à¸•à¹ˆà¸²à¸‡à¸ˆà¸µà¸žà¸µà¹€à¸­à¸ª',
+'exif-objectname' => 'ชื่อเรื่องสั้น',
# EXIF attributes
'exif-compression-1' => 'ไม่ได้บีบอัด',
@@ -2996,24 +3064,24 @@ $1',
'limitall' => 'ทั้งหมด',
# E-mail address confirmation
-'confirmemail' => 'ยืนยันอีเมล',
-'confirmemail_noemail' => 'ไม่ได้ใส่อีเมลในส่วน [[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนตัว]]',
-'confirmemail_text' => 'ถ้าต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸„ำสั่งพิเศษในด้านอีเมสล จำเป็นต้องใส่ค่าอีเมลà¸à¹ˆà¸­à¸™ โดยà¸à¸”ที่ปุ่มด้านล่าง à¹à¸¥à¸°à¸—างระบบจะส่งไปที่อีเมลนี้ ในอีเมลจะมีลิงà¸à¹Œà¸‹à¸¶à¹ˆà¸‡à¸¡à¸µà¸£à¸«à¸±à¸ªà¸ªà¸³à¸«à¸£à¸±à¸šà¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥',
-'confirmemail_pending' => 'รหัสยืนยันได้ถูà¸à¸ªà¹ˆà¸‡à¹„ปที่อีเมลของคุณ ถ้าได้สร้างบัà¸à¸Šà¸µà¹€à¸£à¹‡à¸§à¸™à¸µà¹‰ ให้รอซัà¸à¸„รู่à¸à¹ˆà¸­à¸™à¸—ี่จะขอรหัสอีà¸à¸„รั้งหนึ่ง',
-'confirmemail_send' => 'ส่งรหัสยืนยันผ่านทางอีเมล',
-'confirmemail_sent' => 'อีเมลยืนยันได้ส่งเรียบร้อย',
-'confirmemail_oncreate' => 'รหัสยืนยันได้ถูà¸à¸ªà¹ˆà¸‡à¹„ปที่อีเมล อย่างไรà¸à¹‡à¸•à¸²à¸¡à¸£à¸«à¸±à¸ªà¸™à¸µà¹‰à¹„ม่จำเป็นสำหรับà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™ เว้นเสียà¹à¸•à¹ˆà¸§à¹ˆà¸²à¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸„ำสั่งพิเศษในด้านอีเมลของวิà¸à¸´à¸™à¸µà¹‰',
-'confirmemail_sendfailed' => 'ขออภัย {{SITENAME}}ภาษาไทยไม่สามารถส่งอีเมลให้คุณยืนยันà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ด้
+'confirmemail' => 'ยืนยันอีเมล',
+'confirmemail_noemail' => 'ไม่ได้ใส่อีเมลในส่วน [[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนตัว]]',
+'confirmemail_text' => 'ถ้าต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸„ำสั่งพิเศษในด้านอีเมสล จำเป็นต้องใส่ค่าอีเมลà¸à¹ˆà¸­à¸™ โดยà¸à¸”ที่ปุ่มด้านล่าง à¹à¸¥à¸°à¸—างระบบจะส่งไปที่อีเมลนี้ ในอีเมลจะมีลิงà¸à¹Œà¸‹à¸¶à¹ˆà¸‡à¸¡à¸µà¸£à¸«à¸±à¸ªà¸ªà¸³à¸«à¸£à¸±à¸šà¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥',
+'confirmemail_pending' => 'รหัสยืนยันได้ถูà¸à¸ªà¹ˆà¸‡à¹„ปที่อีเมลของคุณ ถ้าได้สร้างบัà¸à¸Šà¸µà¹€à¸£à¹‡à¸§à¸™à¸µà¹‰ ให้รอซัà¸à¸„รู่à¸à¹ˆà¸­à¸™à¸—ี่จะขอรหัสอีà¸à¸„รั้งหนึ่ง',
+'confirmemail_send' => 'ส่งรหัสยืนยันผ่านทางอีเมล',
+'confirmemail_sent' => 'อีเมลยืนยันได้ส่งเรียบร้อย',
+'confirmemail_oncreate' => 'รหัสยืนยันได้ถูà¸à¸ªà¹ˆà¸‡à¹„ปที่อีเมล อย่างไรà¸à¹‡à¸•à¸²à¸¡à¸£à¸«à¸±à¸ªà¸™à¸µà¹‰à¹„ม่จำเป็นสำหรับà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™ เว้นเสียà¹à¸•à¹ˆà¸§à¹ˆà¸²à¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸„ำสั่งพิเศษในด้านอีเมลของวิà¸à¸´à¸™à¸µà¹‰',
+'confirmemail_sendfailed' => 'ขออภัย {{SITENAME}}ภาษาไทยไม่สามารถส่งอีเมลให้คุณยืนยันà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ด้
à¸à¸£à¸¸à¸“าตรวจสอบอีเมลว่าถูà¸à¸•à¹‰à¸­à¸‡ à¹à¸¥à¸°à¹„ม่มีอัà¸à¸‚ระที่ไม่สามารถใช้ได้
ข้อความตีà¸à¸¥à¸±à¸š: $1',
-'confirmemail_invalid' => 'รหัสยืนยันไม่ถูà¸à¸•à¹‰à¸­à¸‡ หรือรหัสหมดอายุ',
-'confirmemail_needlogin' => 'ต้องทำà¸à¸²à¸£ $1 เพื่อยืนยันอีเมลของคุณว่าถูà¸à¸•à¹‰à¸­à¸‡',
-'confirmemail_success' => 'อีเมลคุณได้รับà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¹à¸¥à¹‰à¸§ คุณอาจจะล็อà¸à¸­à¸´à¸™à¹à¸¥à¸°à¸¡à¸µà¸„วามสุขà¸à¸±à¸šà¸§à¸´à¸à¸´',
-'confirmemail_loggedin' => 'อีเมลคุณได้รับà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¹à¸¥à¹‰à¸§',
-'confirmemail_error' => 'มีปัà¸à¸«à¸²à¹€à¸à¸´à¸”ขึ้นในà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥',
-'confirmemail_subject' => '{{SITENAME}} ยืนยันà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸­à¸µà¹€à¸¡à¸¥',
-'confirmemail_body' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จาà¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี $1 ได้ลงทะเบียนในชื่อ "$2" โดยใช้อีเมลนี้ที่ {{SITENAME}}
+'confirmemail_invalid' => 'รหัสยืนยันไม่ถูà¸à¸•à¹‰à¸­à¸‡ หรือรหัสหมดอายุ',
+'confirmemail_needlogin' => 'ต้องทำà¸à¸²à¸£ $1 เพื่อยืนยันอีเมลของคุณว่าถูà¸à¸•à¹‰à¸­à¸‡',
+'confirmemail_success' => 'อีเมลคุณได้รับà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¹à¸¥à¹‰à¸§ คุณอาจจะล็อà¸à¸­à¸´à¸™à¹à¸¥à¸°à¸¡à¸µà¸„วามสุขà¸à¸±à¸šà¸§à¸´à¸à¸´',
+'confirmemail_loggedin' => 'อีเมลคุณได้รับà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¹à¸¥à¹‰à¸§',
+'confirmemail_error' => 'มีปัà¸à¸«à¸²à¹€à¸à¸´à¸”ขึ้นในà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥',
+'confirmemail_subject' => '{{SITENAME}} ยืนยันà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸­à¸µà¹€à¸¡à¸¥',
+'confirmemail_body' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จาà¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี $1 ได้ลงทะเบียนในชื่อ "$2" โดยใช้อีเมลนี้ที่ {{SITENAME}}
เพื่อยืนยันว่าบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‚องคุณอย่างà¹à¸™à¹ˆà¸­à¸™ à¹à¸¥à¸°à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸Ÿà¸µà¹€à¸ˆà¸­à¸£à¹Œà¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥à¸«à¸²à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸šà¸™ {{SITENAME}} à¸à¸”ลิงà¸à¹Œà¸™à¸µà¹‰à¹ƒà¸™à¹€à¸§à¹‡à¸šà¹€à¸šà¸£à¸²à¸§à¹€à¸‹à¸­à¸£à¹Œà¸‚องคุณ:
@@ -3024,8 +3092,34 @@ $3
$5
รหัสยืนยันนี้จะหมดอายุเมื่อ $4',
-'confirmemail_invalidated' => 'à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—างอีเมลได้ถูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¹à¸¥à¹‰à¸§',
-'invalidateemail' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—างอีเมล',
+'confirmemail_body_changed' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จาà¸à¹€à¸¥à¸‚ที่อยู่ไอพี $1 ได้เปลี่ยนที่อยู่อีเมลสำหรับบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ "$2" ไปยังที่อยู่นี้บน {{SITENAME}}
+
+เพื่อยืนยันว่าบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‚องคุณอย่างà¹à¸™à¹ˆà¸™à¸­à¸™à¹à¸¥à¸°à¹€à¸›à¸´à¸”ใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} อีà¸à¸„รั้งหนึ่ง à¸à¸”ลิงà¸à¹Œà¸™à¸µà¹‰à¹ƒà¸™à¹€à¸§à¹‡à¸šà¹€à¸šà¸£à¸²à¸§à¹€à¸‹à¸­à¸£à¹Œà¸‚องคุณ:
+
+$3
+
+ถ้าบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸™à¸µà¹‰*ไม่*ได้เป็นของคุณ à¸à¸£à¸¸à¸“าà¸à¸”ลิงà¸à¹Œà¸”้านล่างเพื่อยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—ี่อยู่อีเมล
+
+$5
+
+รหัสยืนยันนี้จะหมดอายุเมื่อ $4',
+'confirmemail_body_set' => 'ใครสัà¸à¸„นจาà¸à¸—ี่อยู่ไอพี $1 ซึ่งอาจเป็นคุณ
+ได้à¸à¸³à¸«à¸™à¸”ที่อยู่อีเมลของบัà¸à¸Šà¸µ "$2" บน {{SITENAME}} มายังที่อยู่อีเมลนี้
+
+เพื่อยืนยันว่าบัà¸à¸Šà¸µà¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‚องคุณจริง ๆ
+à¹à¸¥à¸°à¹€à¸›à¸´à¸”ใช้งานคุณสมบัติอีเมลบน {{SITENAME}} อีà¸à¸„รั้ง
+ให้เปิดลิงà¸à¹Œà¸•à¹ˆà¸­à¹„ปนี้ในเบราว์เซอร์ของคุณ:
+
+$3
+
+หาà¸à¸šà¸±à¸à¸Šà¸µà¸”ังà¸à¸¥à¹ˆà¸²à¸§ *ไม่ใช่* ของคุณ
+ให้เปิดลิงà¸à¹Œà¸•à¹ˆà¸­à¹„ปนี้เพื่อยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—ี่อยู่อีเมล:
+
+$5
+
+รหัสยืนยันนี้จะหมดอายุเมื่อ $4',
+'confirmemail_invalidated' => 'à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—างอีเมลได้ถูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¹à¸¥à¹‰à¸§',
+'invalidateemail' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—างอีเมล',
# Scary transclusion
'scarytranscludedisabled' => '[ส่งค่าของอินเตอร์วิà¸à¸´à¸–ูà¸à¸£à¸°à¸‡à¸±à¸š]',
@@ -3049,7 +3143,7 @@ $1',
# action=purge
'confirm_purge_button' => 'ตà¸à¸¥à¸‡',
'confirm-purge-top' => 'ล้างà¹à¸„ชสำหรับหน้านี้หรือไม่',
-'confirm-purge-bottom' => 'à¸à¸²à¸£à¸à¸³à¸ˆà¸±à¸”หน้าจะล้างà¹à¸„ชของหน้านี้à¹à¸¥à¸°à¸šà¸±à¸‡à¸„ับให้ฉบับปรับปรุงล่าสุดปราà¸à¸Žà¸‚ึ้น',
+'confirm-purge-bottom' => 'à¸à¸²à¸£à¸à¸³à¸ˆà¸±à¸”หน้าจะล้างà¹à¸„ชของหน้านี้à¹à¸¥à¸°à¸šà¸±à¸‡à¸„ับให้ฉบับปรับปรุงล่าสุดปราà¸à¸à¸‚ึ้น',
# Multipage image navigation
'imgmultipageprev' => '↠หน้าà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²',
@@ -3065,6 +3159,7 @@ $1',
'table_pager_first' => 'หน้าà¹à¸£à¸',
'table_pager_last' => 'หน้าสุดท้าย',
'table_pager_limit' => 'à¹à¸ªà¸”ง $1 รายà¸à¸²à¸£à¸•à¹ˆà¸­à¸«à¸™à¹‰à¸²',
+'table_pager_limit_label' => 'รายà¸à¸²à¸£à¸•à¹ˆà¸­à¸«à¸™à¹‰à¸²:',
'table_pager_limit_submit' => 'ค้นหา',
'table_pager_empty' => 'ไม่พบที่ต้องà¸à¸²à¸£',
@@ -3126,6 +3221,7 @@ $1',
'version-specialpages' => 'หน้าพิเศษ',
'version-parserhooks' => 'ฮุà¸à¸—ี่มีà¸à¸²à¸£à¸žà¸²à¸£à¹Œà¸ªà¸„่า',
'version-variables' => 'ตัวà¹à¸›à¸£',
+'version-skins' => 'รูปลัà¸à¸©à¸“์',
'version-other' => 'อื่นๆ',
'version-mediahandlers' => 'ตัวจัดà¸à¸²à¸£à¹€à¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸ªà¸·à¹ˆà¸­ (media handler)',
'version-hooks' => 'ฮุà¸',
@@ -3137,6 +3233,13 @@ $1',
'version-hook-subscribedby' => 'สนับสนุนโดย',
'version-version' => '(รุ่น $1)',
'version-license' => 'สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•',
+'version-poweredby-credits' => "วิà¸à¸´à¸™à¸µà¹‰à¸ˆà¸±à¸”ทำโดย '''[http://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2.",
+'version-poweredby-others' => 'ผู้อื่น',
+'version-license-info' => 'มีเดียวิà¸à¸´à¹€à¸›à¹‡à¸™à¸‹à¸­à¸Ÿà¸•à¹Œà¹à¸§à¸£à¹Œà¹€à¸ªà¸£à¸µ คุณสามารถà¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢à¸•à¹ˆà¸­ à¹à¸¥à¸°/หรือ à¹à¸à¹‰à¹„ขโปรà¹à¸à¸£à¸¡à¹„ด้ภายใต้เงื่อนไขของ GNU General Public License ที่เผยà¹à¸žà¸£à¹ˆà¹‚ดยมูลนิธิซอฟต์à¹à¸§à¸£à¹Œà¹€à¸ªà¸£à¸µ ในรุ่นที่ 2 ของใบอนุà¸à¸²à¸•à¸«à¸£à¸·à¸­à¸£à¸¸à¹ˆà¸™à¸­à¸·à¹ˆà¸™à¹ƒà¸” (ตามที่คุณเลือà¸)
+
+มีเดียวิà¸à¸´à¸¡à¸µà¸à¸²à¸£à¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢à¹‚ดยหวังว่าจะเป็นประโยชน์ à¹à¸•à¹ˆà¹„ม่มีà¸à¸²à¸£à¸£à¸±à¸šà¸›à¸£à¸°à¸à¸±à¸™à¹ƒà¸”ๆ ทั้งสิ้น ไม่มีà¹à¸¡à¹‰à¸à¸²à¸£à¸£à¸±à¸šà¸›à¸£à¸°à¸à¸±à¸™à¹‚ดยนัยเพื่อà¸à¸²à¸£à¸„้า หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดู GNU General Public License เพื่อดูรายละเอียดเพิ่มเติม
+
+คุณควรจะได้รับ [{{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 หรือ [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html อ่านออนไลน์]',
'version-software' => 'ซอฟต์à¹à¸§à¸£à¹Œà¸—ี่ติดตั้ง',
'version-software-product' => 'ชื่อ',
'version-software-version' => 'รุ่น',
@@ -3188,7 +3291,7 @@ $1',
'external_image_whitelist' => ' #เว้นบรรทัดนี้ไว้จาà¸à¸à¸²à¸£à¹à¸à¹‰à¹„ข<pre>
#ใส่คำอธิบายปà¸à¸•à¸´ (เฉพาะในส่วนที่อยู่ระหว่างสัà¸à¸¥à¸±à¸à¸©à¸“์ //) ด้านล่างนี้
#ซึ่งคำอธิบายดังà¸à¸¥à¹ˆà¸²à¸§à¸ˆà¸°à¸–ูà¸à¸ˆà¸±à¸šà¸„ู่à¸à¸±à¸š URL ของรูปถ่ายภายนอà¸
-#ถ้าตรงà¸à¸±à¸™à¸ˆà¸°à¸›à¸£à¸²à¸à¸Žà¹€à¸›à¹‡à¸™à¸ à¸²à¸žà¸­à¸­à¸à¸¡à¸² หรือมิเช่นนั้นจะปราà¸à¸Žà¹€à¸›à¹‡à¸™à¸¥à¸´à¸‡à¸à¹Œà¹„ปยังรูปภาพนั้น
+#ถ้าตรงà¸à¸±à¸™à¸ˆà¸°à¸›à¸£à¸²à¸à¸à¹€à¸›à¹‡à¸™à¸ à¸²à¸žà¸­à¸­à¸à¸¡à¸² หรือมิเช่นนั้นจะปราà¸à¸à¹€à¸›à¹‡à¸™à¸¥à¸´à¸‡à¸à¹Œà¹„ปยังรูปภาพนั้น
#บรรทัดที่ขึ้นต้นด้วย # จะถูà¸à¸à¸³à¸«à¸™à¸”เป็นหมายเหตุเพิ่มเติม
#à¸à¸£à¸¸à¸“าพิมพ์ตัวพิมพ์เล็à¸-ใหà¸à¹ˆà¸•à¸²à¸¡à¸Šà¸·à¹ˆà¸­à¹„ฟล์ให้ตรงà¸à¸±à¸™
@@ -3207,6 +3310,15 @@ $1',
'tags-edit' => 'à¹à¸à¹‰à¹„ข',
'tags-hitcount' => '$1 à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡',
+# Special:ComparePages
+'comparepages' => 'เปรียบเทียบหน้า',
+'compare-selector' => 'เปรียบเทียบรุ่นของหน้า',
+'compare-page1' => 'หน้า 1',
+'compare-page2' => 'หน้า 2',
+'compare-rev1' => 'รุ่น 1',
+'compare-rev2' => 'รุ่น 2',
+'compare-submit' => 'เปรียบเทียบ',
+
# Database error messages
'dberr-header' => 'วิà¸à¸´à¸™à¸µà¹‰à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸°à¸ªà¸šà¸›à¸±à¸à¸«à¸²',
'dberr-problems' => 'ขออภัย เว็บไซต์นี้à¸à¸³à¸¥à¸±à¸‡à¸žà¸šà¸à¸±à¸šà¸‚้อผิดพลาดทางเทคนิค',
@@ -3223,8 +3335,13 @@ $1',
'htmlform-float-invalid' => 'ค่าที่คุณà¸à¸³à¸™à¸«à¸”ไม่ใช่ตัวเลข',
'htmlform-int-toolow' => 'ค่าที่คุณà¸à¸³à¸«à¸™à¸”นั้นต่ำà¸à¸§à¹ˆà¸²à¸„่าต่ำสุดที่ $1',
'htmlform-int-toohigh' => 'ค่าที่คุณà¸à¸³à¸«à¸™à¸”นั้นเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸„่าสูงสุดที่ $1',
+'htmlform-required' => 'จำเป็นต้องà¸à¸£à¸­à¸à¸‚้อมูลนี้',
'htmlform-submit' => 'ส่งข้อมูล',
'htmlform-reset' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹€à¸›à¸¥à¸·à¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡',
'htmlform-selectorother-other' => 'อื่นๆ',
+# SQLite database support
+'sqlite-has-fts' => 'รุ่น $1 พร้อมà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸à¸²à¸£à¸„้นหาข้อความà¹à¸šà¸šà¹€à¸•à¹‡à¸¡',
+'sqlite-no-fts' => 'รุ่น $1 โดยไม่มีà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸à¸²à¸£à¸„้นหาข้อความà¹à¸šà¸šà¹€à¸•à¹‡à¸¡',
+
);
diff --git a/languages/messages/MessagesTi.php b/languages/messages/MessagesTi.php
index 585c5892..2eb4d355 100644
--- a/languages/messages/MessagesTi.php
+++ b/languages/messages/MessagesTi.php
@@ -151,9 +151,6 @@ $messages = array(
'allpagesnext' => 'á‹á‰•áŒ½áˆ',
'allpagessubmit' => 'ኪድ',
-# Watchlist
-'watchlistfor' => "(ን'''$1''')",
-
# Protect
'pagesize' => '(ባይታት)',
diff --git a/languages/messages/MessagesTk.php b/languages/messages/MessagesTk.php
index f782f6ea..0dcde1e2 100644
--- a/languages/messages/MessagesTk.php
+++ b/languages/messages/MessagesTk.php
@@ -10,6 +10,7 @@
* @author Flrn
* @author Hanberke
* @author Runningfridgesrule
+ * @author The Evil IP address
*/
$namespaceNames = array(
@@ -48,8 +49,7 @@ $messages = array(
'tog-editsection' => 'Her bir bölümde [redaktirle] çykgydyny görkez',
'tog-editsectiononrightclick' => 'Bölümleri bölümiň adyna sag tyklap redaktirlemäge mümkinçilik döret (JavaScript)',
'tog-showtoc' => 'Mazmun tablisasyny görkez (3 sanydan köp ady bar bolan sahypalar üçin)',
-'tog-rememberpassword' => 'Parolymy ýatda sakla',
-'tog-editwidth' => 'Özgerdiş gutusyny tutuş ekrany doldurar ýaly edip giňelt',
+'tog-rememberpassword' => 'Sessiýamy şu brauzerde ýatda sakla (iň köp $1 {{PLURAL:$1|günläp|günläp}})',
'tog-watchcreations' => 'Döreden sahypalarymy gözegçilik sanawyma goş',
'tog-watchdefault' => 'Redaktirlän sahypalarymy gözegçilik sanawyma goş',
'tog-watchmoves' => 'Adyny üýtgeden sahypalarymy gözegçilik sanawyma goş',
@@ -194,31 +194,21 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
'faqpage' => 'Project:KSS',
# Vector skin
-'vector-action-addsection' => 'Tema goÅŸ',
-'vector-action-delete' => 'Öçür',
-'vector-action-move' => 'Adyny üýtget',
-'vector-action-protect' => 'Goraga al',
-'vector-action-undelete' => 'Öçürmäni yzyna al',
-'vector-action-unprotect' => 'Goragy aýyr',
-'vector-namespace-category' => 'Kategoriýa',
-'vector-namespace-help' => 'Ãardam sahypasy',
-'vector-namespace-image' => 'Faýl',
-'vector-namespace-main' => 'Sahypa',
-'vector-namespace-media' => 'Media sahypasy',
-'vector-namespace-mediawiki' => 'HabarlaÅŸyk',
-'vector-namespace-project' => 'Taslama sahypasy',
-'vector-namespace-special' => 'Ãörite sahypa',
-'vector-namespace-talk' => 'Çekişme',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Ulanyjy sahypasy',
-'vector-view-create' => 'Döret',
-'vector-view-edit' => 'Redaktirle',
-'vector-view-history' => 'Geçmişi gör',
-'vector-view-view' => 'Oka',
-'vector-view-viewsource' => 'Çeşmäni gör',
-'actions' => 'Hereketler',
-'namespaces' => 'At giňişlikleri',
-'variants' => 'Wariantlar',
+'vector-action-addsection' => 'Tema goÅŸ',
+'vector-action-delete' => 'Öçür',
+'vector-action-move' => 'Adyny üýtget',
+'vector-action-protect' => 'Goraga al',
+'vector-action-undelete' => 'Öçürmäni yzyna al',
+'vector-action-unprotect' => 'Goragy aýyr',
+'vector-simplesearch-preference' => 'Giňeldilen gözleg tekliplerini aç (Diňe Vector bezegi üçin)',
+'vector-view-create' => 'Döret',
+'vector-view-edit' => 'Redaktirle',
+'vector-view-history' => 'Geçmişi gör',
+'vector-view-view' => 'Oka',
+'vector-view-viewsource' => 'Çeşmäni gör',
+'actions' => 'Hereketler',
+'namespaces' => 'At giňişlikleri',
+'variants' => 'Wariantlar',
'errorpagetitle' => 'Säwlik',
'returnto' => '$1.',
@@ -279,6 +269,9 @@ Biçak köp ulanyjy şu sahypany görmäge synanyşýar.
Bir sellem garaşyp, soňra synanyşmagyňyzy towakga edýäris.
$1',
+'pool-timeout' => 'Blokirleme üçin wagtyň gutarmagyna garaşylýar',
+'pool-queuefull' => 'Howzuň nobaty doly',
+'pool-errorunknown' => 'Näbelli säwlik',
# 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}} hakynda',
@@ -445,7 +438,7 @@ Hasabyňyz açyldy.
'yourname' => 'Ulanyjy adyňyz:',
'yourpassword' => 'Parolyňyz:',
'yourpasswordagain' => 'Paroly gaýtadan ýaz:',
-'remembermypassword' => 'Parolymy ýatda sakla',
+'remembermypassword' => 'Sessiýamy şu kompýuterde ýatda sakla (iň köp $1 {{PLURAL:$1|günläp|günläp}})',
'yourdomainname' => 'Siziň domeniňiz:',
'externaldberror' => 'Ãa tassyklama maglumat bazasynyň säwligi bar ýa-da öz ulanyjy hasabyňyzy täzelemegiňize rugsat berilmeýär.',
'login' => 'Sessiýa aç',
@@ -462,6 +455,7 @@ Hasabyňyz açyldy.
'gotaccount' => "Eýýäm hasap açdyňyzmy? '''$1'''.",
'gotaccountlink' => 'Onda giriberiň!',
'createaccountmail' => 'e-poçta bilen',
+'createaccountreason' => 'Sebäp:',
'badretype' => 'Girizen parollaryňyz biri-birine gabat gelmeýär.',
'userexists' => 'Girizen ulanyjy adyňyz ulanylýar.
Başga bir at saýlamagyňyzy haýyş edýäris.',
@@ -573,10 +567,12 @@ Parolyňyzy eýýäm şowlulyk bilen üýtgeden ýa-da täze wagtlaýyn parol ta
'showlivepreview' => 'Gönümel deslapky syn',
'showdiff' => 'Üýtgeşmeleri görkez',
'anoneditwarning' => "'''Duýduryş:''' Sessiýa açmansyňyz. Şonuň üçin hem IP adresiňiz bu sahypanyň özgerdişler geçmişine ýazylyp alynjakdyr.",
+'anonpreviewwarning' => "''Sessiýa açmadyňyz. Ãazdyrsaňyz, sahypanyň redaktirleme geçmiÅŸine IP adresiňiz ýazylar.''",
'missingsummary' => "'''Ãatlatma:''' Redaktirleme mazmunyny ýazmadyňyz.
Sahypany ýazdyr düwmesine ýene bir gezek bassaňyz, özgerdişiňiz mazmunsyz ýazdyrylar.",
'missingcommenttext' => 'Aşakda teswir ýazmagyňyzy haýyş edýäris.',
-'missingcommentheader' => "'''Ãatlatma:''' Bu teswir üçin tema/at görkezmediňiz. Eger Ãazdyr düwmesine gaýtadan bassaňyz, özgerdiÅŸiňiz temasyz/atsyz ýazdyrylar.",
+'missingcommentheader' => "'''Ãatladyjy:''' Bu teswir üçin tema/setirbaÅŸ görkezmediňiz.
+Eger \"{{int:savearticle}}\" düwmesine gaýtadan bassaňyz, özgerdişiňiz temasyz/setirbaşsyz ýazdyrylar.",
'summary-preview' => 'Deslapky synyň mazmuny:',
'subject-preview' => 'Temanyň/adyň deslapky syny:',
'blockedtitle' => 'Ulanyjy blokirlenen',
@@ -653,8 +649,8 @@ Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:
'''Ol heniz ýazdyrylan däldir!'''",
'userjspreview' => "'''Bu ulanyjy JavaScriptiňiziň ýöne bir barlagy/deslapky syny.'''
'''Ol heniz ýazdyrylan däldir!'''",
-'userinvalidcssjstitle' => "''Duýduryş:''' \"\$1\" atly bezeg ýok.
-Hususy .css we .js sahypalarynyň setir harp bilen ýazylýandygyny ýatda saklaň, ýagny {{ns:user}}:Ulanyjy/Monobook.css däl-de, eýsem {{ns:user}}:Ulanyjy/monobook.css.",
+'userinvalidcssjstitle' => "''Duýduryş:''' \"\$1\" atly bezeg ýok.
+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!'''",
@@ -696,9 +692,6 @@ Mundan hem başga, siz bu ýere goşant goşmak bilen bu goşandyň özüňiz ta
Eger-de işiňiziň gypynç etmezden redaktirlenmegini islemeýän bolsaňyz, onda ony goşant etmäň.<br />
Şeýle-de, siz ony özüňiziň ýazandygyňyza ýa-da jemgyýetçilige açyk bir çeşmeden ýa-da bolmasa şoňa meňzeş bir erkin çeşmeden göçürip alandygyňyza güwä geçýärsiňiz (jikme-jiklikler üçin serediň: $1).
'''Awtorlyk hukugy bar bolan hiç biri işi rugsat almazdan goşmaň!'''",
-'longpagewarning' => "'''Duýduryş:''' Bu sahypanyň uzynlygy $1 kilobaýt;
-käbir brauzerlerde 32kb çemesi ýa-da ondanam uzyn sahypalar redaktirlenen mahaly problema ýüz çykmagy mümkin.
-Sahypany has kiçi böleklere bölmekligi göz öňünde tutmagyňyzy haýyş edýäris.",
'longpageerror' => "'''Säwlik: Ãazan tekstiňiziň uzynlygy $1 kilobaýt bolup, ol maksimum uzynlykdan $2 kilobaýt artykmaç.'''
Ãazdyrmaklyk mümkin däl.",
'readonlywarning' => "'''Duýduryş: Maglumat bazasy tehniki işler sebäpli gulplanypdyr, Şonuň üçinem häzirlikçe özgerdişleriňizi ýazdyryp bilmersiňiz.'''
@@ -878,6 +871,8 @@ $1",
'logdelete-failure' => "'''Gündelik görünme derejesini sazlap bolmaýar:'''
$1",
'revdel-restore' => 'Görnüşi üýtget',
+'revdel-restore-deleted' => 'öçürilen wersiýalar',
+'revdel-restore-visible' => 'görünýän wersiýalar',
'pagehist' => 'Sahypanyň geçmişi',
'deletedhist' => 'Öçürilen geçmiş',
'revdelete-content' => 'mazmun',
@@ -947,11 +942,13 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
# Diffs
'history-title' => '"$1" sahypasynyň geçmişi',
'difference' => '(Wersiýalaryň aratapawudy)',
+'difference-multipage' => '(Sahypalaryň arasyndaky tapawut)',
'lineno' => 'Setir $1:',
'compareselectedversions' => 'Saýlanan wersiýalary deňeşdir',
'showhideselectedversions' => 'Saýlanan wersiýalary görkez/gizle',
'editundo' => 'yzyna al',
-'diff-multi' => '(Görkezilmeýän {{PLURAL:$1|$1 sany aralyk wersiýa|$1 sany aralyk wersiýa}} bar.)',
+'diff-multi' => '({{PLURAL:$2|Bir ulanyjy|$2 ulanyjy}} tarapyndan edilen {{PLURAL:$1|aralyk wersiýa|$1 sany aralyk wersiýa}} görkezilmeýär)',
+'diff-multi-manyusers' => '($2 ulanyjydan köp {{PLURAL:$2|ulanyjy|ulanyjy}} tarapyndan edilen {{PLURAL:$1|aralyk wersiýa|$1 sany aralyk wersiýa}} görkezilmeýär)',
# Search results
'searchresults' => 'Gözleg netijeleri',
@@ -986,6 +983,7 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
'searchprofile-everything-tooltip' => 'Ähli sahypalardan gözle (şol sanda çekişme sahypalaryndan)',
'searchprofile-advanced-tooltip' => 'Hususy at giňişliklerinde gözle',
'search-result-size' => '$1 ({{PLURAL:$2|1 söz|$2 söz}})',
+'search-result-category-size' => '{{PLURAL:$1|1 agza|$1 agza}} ({{PLURAL:$2|1 kiçi kategoriýa|$2 kiçi kategoriýa}}, {{PLURAL:$3|1 faýl|$3 faýl}})',
'search-result-score' => 'KybapdaÅŸlyk: $1%',
'search-redirect' => '(gönükdirme $1)',
'search-section' => '(bölüm $1)',
@@ -1063,6 +1061,7 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
'contextlines' => 'Netije baÅŸyna setir sany:',
'contextchars' => 'Setir baÅŸyna harp sany:',
'stub-threshold' => '<a href="#" class="stub">Ownuk makala çykgydynyň</a> formaty üçin bosaga (baýt):',
+'stub-threshold-disabled' => 'Ãapyk',
'recentchangesdays' => 'Soňky üýtgeşmelerde görkeziljek gün sany:',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|gün|gün}})',
'recentchangescount' => 'Gaýybana görkeziljek özgerdiş sany:',
@@ -1096,6 +1095,7 @@ Gabat gelşine görä döredilen şu bahany ulanyp bilersiňiz: $1',
'prefs-files' => 'Faýllar',
'prefs-custom-css' => 'Hususy CSS',
'prefs-custom-js' => 'Hususy JS',
+'prefs-common-css-js' => 'Ähli bezegler üçin paýlaşylýan CSS/JavaScript:',
'prefs-reset-intro' => 'Bu sahypada öz ileri tutmalaryňyzy saýtyň gaýybana ýagdaýyna getirip bilersiňiz. Yzyna dikeldip bolmaýar.',
'prefs-emailconfirm-label' => 'E-poçta tassyklamasy:',
'prefs-textboxsize' => 'Redaktirleme penjiresiniň ölçegi',
@@ -1131,7 +1131,9 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'prefs-advancedrendering' => 'Giňeldilen opsiýalar',
'prefs-advancedsearchoptions' => 'Giňeldilen opsiýalar',
'prefs-advancedwatchlist' => 'Giňeldilen opsiýalar',
-'prefs-display' => 'Görkeziş opsiýalary',
+'prefs-displayrc' => 'Görkeziş opsiýalary',
+'prefs-displaysearchoptions' => 'Görkeziş opsiýalary',
+'prefs-displaywatchlist' => 'Görkeziş opsiýalary',
'prefs-diffs' => 'Tapawutlar',
# User rights
@@ -1217,6 +1219,7 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'right-hideuser' => 'Ulanyjy adyny blokirle we ony jemgyýetçilikden gizle',
'right-ipblock-exempt' => 'IP blokirlemelerden, awtoblokirlemelerden we diapazon blokirlemelerinden aýlanyp geç',
'right-proxyunbannable' => 'Proksileriň awtomatik blokirlemelerinden aýlanyp geç',
+'right-unblockself' => 'Öz blokirlemesini aýyr',
'right-protect' => 'Gorag derejelerini üýtget we goragly sahypalary redaktirle',
'right-editprotected' => 'Goragly sahypalary redaktirle (goragy kaskadlamazdan)',
'right-editinterface' => 'Ulanyjy interfeýsini redaktirle',
@@ -1239,7 +1242,6 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'right-siteadmin' => 'Maglumat bazasyny gulpla we aç',
'right-reset-passwords' => 'Başga ulanyjylaryň parollaryny başky ýagdaýyna getir',
'right-override-export-depth' => 'Sahypalary, şol sanda çykgytly sahypalary 5-e çenli çuňlukda eksportirle',
-'right-versiondetail' => 'Giňeldilen programma wersiýasy maglumatyny görkez',
'right-sendemail' => 'Başga ulanyjylara e-poçta iber',
# User rights log
@@ -1290,14 +1292,9 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'recentchanges-legend' => 'Soňky üýtgeşmeleriň opsiýalary',
'recentchangestext' => 'Wikidäki iň soňky üýtgeşmeleri şu sahypadan yzarlaň.',
'recentchanges-feed-description' => 'Bu lentadaky wikide edilen iň soňky üýtgeşmeleri yzarlaň.',
-'recentchanges-label-legend' => 'Åžertli belgiler: $1.',
-'recentchanges-legend-newpage' => '$1 - täze sahypa',
'recentchanges-label-newpage' => 'Bu özgerdiş täze bir sahypa döretdi',
-'recentchanges-legend-minor' => '$1 - ujypsyzja özgerdiş',
'recentchanges-label-minor' => 'Bu bir ujypsyzja özgerdiş',
-'recentchanges-legend-bot' => '$1 - bot özgerdişi',
'recentchanges-label-bot' => 'Bu özgerdiş bir bot tarapyndan amala aşyryldy',
-'recentchanges-legend-unpatrolled' => '$1 - patrullyk edilmedik özgerdiş',
'recentchanges-label-unpatrolled' => 'Bu özgerdişe heniz patrullyk edilmändir',
'rcnote' => "Aşakda $5, $4 senesinden başlap, soňky {{PLURAL:$2|1 günde|'''$2''' günde}} edilen {{PLURAL:$1|'''1''' üýtgeşme|'''$1''' üýtgeşme}} görkezilýär.",
'rcnotefrom' => '<b>$2</b> senesinden bäri edilen özgerdişler aşakda görkezilýär (<b>$1</b> sanysyna çenli).',
@@ -1344,6 +1341,9 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'upload_directory_missing' => '($1) ýükleme direktoriýasy ýok we web serwer ony döredip bilmeýär.',
'upload_directory_read_only' => '($1) ýükleme direktoriýasyna web serweriň ýazmak rugsady ýok.',
'uploaderror' => 'Ãükleme säwligi',
+'upload-recreate-warning' => "Üns beriň: Şeýle atly bir faýl öçürildi ýa-da geçirildi.'''
+
+Bu sahypanyň öçürme ýa-da at üýtgetme gündeligi aşakda berilýär:",
'uploadtext' => "Faýl ýüklemek üçin aşakdaky formdan peýdalanyň.
Ozaldan ýüklenilgi faýllary görmek ýa-da agtarmak üçin [[Special:FileList|ýüklenilgi faýllaryň sanawyna]] serediň, (gaýtadan) ýüklenenler [[Special:Log/upload|ýükleme gündeliginde]], öçürilenler [[Special:Log/delete|öçürme gündeliginde]] saklanylýar.
@@ -1379,6 +1379,17 @@ Ileri tutulýan {{PLURAL:\$3|faýl görnüşi|faýl görnüşleri}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' rugsat berilýän faýl görnüşi däl.
Rugsat berilýän {{PLURAL:\$3|faýl görnüşi|faýl görnüşleri}} \$2.",
'filetype-missing' => 'Faýlyň hiçhili giňeltmesi ýok (".jpg" ýaly).',
+'empty-file' => 'Tabşyran faýlyňyz boş.',
+'file-too-large' => 'Tabşyran faýlyňyz örän uly.',
+'filename-tooshort' => 'Faýl ady örän gysga.',
+'filetype-banned' => 'Bu görnüşdäki faýllar gadagan.',
+'verification-error' => 'Bu faýl barlag prosedurasyndan geçmedi.',
+'hookaborted' => 'Etjek bolýan üýtgeşikligiňiz giňeltme gaňyrçagy tarapyndan bes edildi.',
+'illegal-filename' => 'Faýl adyna rugsat berilmeýär.',
+'overwrite' => 'Bar bolan faýlyň üstüne ýazmaklyga rugsat berilmeýär.',
+'unknown-error' => 'Näbelli bir säwlik ýüze çykdy.',
+'tmp-create-error' => 'Wagtlaýyn faýl döredip bolmady.',
+'tmp-write-error' => 'Wagtlaýyn faýl ýazmakda säwlik.',
'large-file' => 'Faýllaryň $1 ölçeginden has uly bolmaklygy maslahat berilmeýär;
bu faýlyň ölçegi $2.',
'largefileserver' => 'Bu faýl serweriň rugsat berýän ölçeginden has uly.',
@@ -1409,13 +1420,14 @@ Faýlyňyzy şonda-da ýüklemek isleýän bolsaňyz, onda yza gaýdyp täze bir
Faýlyňyzy şonda-da ýüklemek isleýän bolsaňyz, onda yza gaýdyp täze bir at ulanmagyňyzy haýyş edýäris. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Bu faýl aşakdaky {{PLURAL:$1|faýlyň|faýllaryň}} dublikatydyr:',
'file-deleted-duplicate' => 'Şu faýl bilen birmeňzeş bir faýl ([[:$1]]) ozal öçürilipdir. Bu faýly gaýtadan ýüklemänkäňiz şol faýlyň öçürme geçmişini barlaň.',
-'successfulupload' => 'Şowly ýükleme',
'uploadwarning' => 'Ãükleme duýduryÅŸy',
'uploadwarning-text' => 'Aşakdaky faýl düşündirişini üýtgediň we gaýtadan synanyşyň.',
'savefile' => 'Faýly ýazdyr',
'uploadedimage' => 'Ãüklenen: "[[$1]]"',
'overwroteimage' => '"[[$1]]" faýlynyň täze wersiýasy ýüklendi',
'uploaddisabled' => 'Ãüklemeklik ýapyk',
+'copyuploaddisabled' => 'URL arkaly ýüklemek ýapyk.',
+'uploadfromurl-queued' => 'Ãüklemäňiz nobata goýuldy.',
'uploaddisabledtext' => 'Faýl ýüklemeklik ýapyk.',
'php-uploaddisabledtext' => 'PHP-de faýl ýüklemek ýapyk dur. file_uploads sazlamasyny barlap görüň.',
'uploadscripted' => 'Bu faýlda web brauzeri tarapyndan ýalňyş teswirlenmegi mümkin bolan bir HTML ýa-da skript kody bar.',
@@ -1435,6 +1447,14 @@ Faýly ýüklemekligiň ýerliklidigini ýa-da däldigini göz öňünde tutuň.
Bu faýlyň öçürme gündeligi aşakda berilýär:",
'filename-bad-prefix' => "Ãükleýän faýlyňyzyň ady umuman sanly kameralar tarapyndan awtomatik usulda goÅŸulýan düşnüksiz '''\"\$1\"''' bilen baÅŸlanýar.
Faýlyňyz üçin has düşnükli bir at saýlamagyňyzy haýyş edýäris.",
+'upload-success-subj' => 'Şowly ýükleme',
+'upload-success-msg' => '[$2] ýüklemäňiz şowly boldy. Ol şu ýerde elýeterli: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Ãükleme problemasy',
+'upload-failure-msg' => '[$2] adresinden eden ýüklemäňizde bir problema bar:
+
+$1',
+'upload-warning-subj' => 'Ãükleme duýduryÅŸy',
+'upload-warning-msg' => '[$2] adresinden eden ýüklemäňizde bir problema ýüze çykdy. Ony düzetmek üçin [[Special:Upload/stash/$1|ýükleme formuna]] dolanyp bilersiňiz.',
'upload-proto-error' => 'Nädogry protokol',
'upload-proto-error-text' => 'Uzakdan ýükleme, <code>http://</code> ýa-da <code>ftp://</code> bilen başlaýan URL talap edýär.',
@@ -1614,7 +1634,6 @@ Giriş formaty: mazmuntip/kiçitip, meselem <tt>surat/jpeg</tt>.',
'statistics-edits-average' => 'Sahypa başyna ortaça özgerdiş',
'statistics-views-total' => 'Jemi synlama',
'statistics-views-peredit' => 'Özgerdiş başyna synlama',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Tabşyryk nobatynyň] uzynlygy',
'statistics-users' => 'Hasaba alnan [[Special:ListUsers|ulanyjylar]]',
'statistics-users-active' => 'Işjeň ulanyjylar',
'statistics-users-active-desc' => 'Soňky {{PLURAL:$1|1 günde|$1 günde}} haýsydyr bir iş geçiren ulanyjylar',
@@ -1628,8 +1647,8 @@ Olar muňa derek degişli anyk sahypa çykgyt bermelidir.<br />
'doubleredirects' => 'Jübüt gönükdirmeler',
'doubleredirectstext' => 'Bu sahypa başga gönükdirme sahypalaryna gönükdirýän sahypalaryň sanawyny görkezýär.
-Her bir hatar birinji we ikinji gönükdirmeleri, şeýle-de ikinji gönükdirmäniň maksady bolup durýan hem-de şol bir wagtyň özünde birinji gönükdirmäniň adatça barmaly ýeri bolan "hakyky" maksat edinilýän sahypany öz içine alýar.
-<s>Üsti çyzylan</s> ýazgylar düzedilenlerdir.',
+Her bir hatar birinji we ikinji gönükdirmeleri, şeýle-de ikinji gönükdirmäniň maksady bolup durýan hem-de şol bir wagtyň özünde birinji gönükdirmäniň adatça barmaly ýeri bolan "hakyky" maksat edinilýän sahypany öz içine alýar.
+<del>Üsti çyzylan</del> ýazgylar düzedilenlerdir.',
'double-redirect-fixed-move' => '[[$1]] sahypasynyň ady üýtgedildi.
Ol indi [[$2]] sahypasyna gönükdirýär.',
'double-redirect-fixer' => 'Gönükdirme bejeriji',
@@ -1809,34 +1828,40 @@ Goldanylýan protokollar: <tt>$1</tt>',
'listgrouprights-removegroup-self-all' => 'Ähli toparlary öz hasabyňdan aýyr',
# E-mail user
-'mailnologin' => 'Iberer ýaly adres ýok',
-'mailnologintext' => 'Başga ulanyjylara e-poçta ibermek üçin [[Special:UserLogin|sessiýaňyz açyk bolmaly]] hem-de [[Special:Preferences|ileri tutmalarda]] dogry bir e-poçta adresiňiz bolmalydyr.',
-'emailuser' => 'Bu ulanyja e-poçta iber',
-'emailpage' => 'Ulanyja e-poçta iber',
-'emailpagetext' => 'Bu ulanyja e-poçta habarlaşygy ibermek üçin aşakdaky formdan peýdalanyp bilersiňiz.
+'mailnologin' => 'Iberer ýaly adres ýok',
+'mailnologintext' => 'Başga ulanyjylara e-poçta ibermek üçin [[Special:UserLogin|sessiýaňyz açyk bolmaly]] hem-de [[Special:Preferences|ileri tutmalarda]] dogry bir e-poçta adresiňiz bolmalydyr.',
+'emailuser' => 'Bu ulanyja e-poçta iber',
+'emailpage' => 'Ulanyja e-poçta iber',
+'emailpagetext' => 'Bu ulanyja e-poçta habarlaşygy ibermek üçin aşakdaky formdan peýdalanyp bilersiňiz.
[[Special:Preferences|Ulanyjy ileri tutmalaryňyzda]] görkezen e-poçta adresiňiz e-poçtanyň "Kimden" adresinde peýda bolar, şeýlelikde kabul ediji size gönüden-göni jogap berip biler.',
-'usermailererror' => 'E-poçta säwlige duçar boldy:',
-'defemailsubject' => '{{SITENAME}} e-poçtasy',
-'noemailtitle' => 'E-poçta adresi ýok',
-'noemailtext' => 'Bu ulanyjy dogry bir e-poçta adresini görkezmändir.',
-'nowikiemailtitle' => 'E-poçta ibermeklige rugsat berilmeýär',
-'nowikiemailtext' => 'Bu ulanyjy başga ulanyjylardan e-poçta almak islemeýär.',
-'email-legend' => 'Başga {{SITENAME}} ulanyjysyna e-poçta iber',
-'emailfrom' => 'Kimden:',
-'emailto' => 'Kime:',
-'emailsubject' => 'Tema:',
-'emailmessage' => 'HabarlaÅŸyk:',
-'emailsend' => 'Iber',
-'emailccme' => 'Habarlaşygymyň özüme-de bir nusgasyny iber.',
-'emailccsubject' => '$1 ulanyjysyna iberen habarlaşygyňyzyň nusgasy: $2',
-'emailsent' => 'E-poçta iberildi',
-'emailsenttext' => 'E-poçtaňyz iberildi.',
-'emailuserfooter' => 'Bu e-poçta $1 tarapyndan $2 ulanyjysyna {{SITENAME}} saýtyndaky "Ulanyja e-poçta iber" funksiýasy arkaly iberildi.',
+'usermailererror' => 'E-poçta säwlige duçar boldy:',
+'defemailsubject' => '{{SITENAME}} e-poçtasy',
+'usermaildisabled' => 'Ulanyjy e-poçtasy ýapyk',
+'usermaildisabledtext' => 'Bu wikide başga ulanyjylara e-poçta iberip bilmeýärsiňiz.',
+'noemailtitle' => 'E-poçta adresi ýok',
+'noemailtext' => 'Bu ulanyjy dogry bir e-poçta adresini görkezmändir.',
+'nowikiemailtitle' => 'E-poçta ibermeklige rugsat berilmeýär',
+'nowikiemailtext' => 'Bu ulanyjy başga ulanyjylardan e-poçta almak islemeýär.',
+'email-legend' => 'Başga {{SITENAME}} ulanyjysyna e-poçta iber',
+'emailfrom' => 'Kimden:',
+'emailto' => 'Kime:',
+'emailsubject' => 'Tema:',
+'emailmessage' => 'HabarlaÅŸyk:',
+'emailsend' => 'Iber',
+'emailccme' => 'Habarlaşygymyň özüme-de bir nusgasyny iber.',
+'emailccsubject' => '$1 ulanyjysyna iberen habarlaşygyňyzyň nusgasy: $2',
+'emailsent' => 'E-poçta iberildi',
+'emailsenttext' => 'E-poçtaňyz iberildi.',
+'emailuserfooter' => 'Bu e-poçta $1 tarapyndan $2 ulanyjysyna {{SITENAME}} saýtyndaky "Ulanyja e-poçta iber" funksiýasy arkaly iberildi.',
+
+# User Messenger
+'usermessage-summary' => 'Ulgam habary goýuň.',
+'usermessage-editor' => 'Ulgam habarçysy',
# Watchlist
'watchlist' => 'Gözegçilik sanawym',
'mywatchlist' => 'Gözegçilik sanawym',
-'watchlistfor' => "('''$1''' üçin)",
+'watchlistfor2' => '$1 üçin $2',
'nowatchlist' => 'Gözegçilik sanawyňyzda hiçhili sahypa ýok.',
'watchlistanontext' => 'Gözegçilik sanawyňyzdaky sahypalary görmek ýa-da redaktirlemek üçin $1.',
'watchnologin' => 'Sessiýa açmansyňyz',
@@ -1960,7 +1985,10 @@ Iň soňky özgerdiş eden: [[User:$3|$3]] ([[User talk:$3|Çekişme]]{{int:pipe
'revertpage-nouser' => '(ulanyjy ady aýyrylan) tarapyndan edilen özgerdişler [[User:$1|$1]] tarapyndan redaktirlenen soňky wersiýasyna yzyna getirildi.',
'rollback-success' => '$1 tarapyndan edilen özgerdişler yzyna getirildi;
$2 tarapyndan edilen soňky wersiýa gaýdyp gelindi.',
-'sessionfailure' => 'Giriş sessiýaňyz bilen baglanyşykly bir probleme bar ýaly;
+
+# Edit tokens
+'sessionfailure-title' => 'Sessiýa şowsuzlygy',
+'sessionfailure' => 'Giriş sessiýaňyz bilen baglanyşykly bir probleme bar ýaly;
sessiýaňyzyň birugsat ele geçirilmezligi üçin bu iş goýbolsun edildi.
"Yza" düwmwsine basyň we gelen sahypaňyzy gaýtadan ýükläň, soňra ýaňadan synynyşyp görüň.',
@@ -2097,19 +2125,22 @@ $1',
'month' => 'Aý:',
'year' => 'Ãyl:',
-'sp-contributions-newbies' => 'Diňe täze hasap açan ulanyjylaryň goşantlaryny görkez',
-'sp-contributions-newbies-sub' => 'Täze hasaplar üçin',
-'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-logs' => 'gündelikler',
-'sp-contributions-talk' => 'çekişme',
-'sp-contributions-userrights' => 'ulanyjy hukuklary dolandyryÅŸy',
-'sp-contributions-blocked-notice' => 'Bu ulanyjy ÅŸu wagt blokirlengi.
+'sp-contributions-newbies' => 'Diňe täze hasap açan ulanyjylaryň goşantlaryny görkez',
+'sp-contributions-newbies-sub' => 'Täze hasaplar üçin',
+'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-logs' => 'gündelikler',
+'sp-contributions-talk' => 'çekişme',
+'sp-contributions-userrights' => 'ulanyjy hukuklary dolandyryÅŸy',
+'sp-contributions-blocked-notice' => 'Bu ulanyjy ÅŸu wagt blokirlengi.
+Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:',
+'sp-contributions-blocked-notice-anon' => 'Bu IP adresi ÅŸu wagt blokirlengi.
Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:',
-'sp-contributions-search' => 'Goşantlary gözle',
-'sp-contributions-username' => 'IP adresi ýa-da ulanyjy ady:',
-'sp-contributions-submit' => 'Gözle',
+'sp-contributions-search' => 'Goşantlary gözle',
+'sp-contributions-username' => 'IP adresi ýa-da ulanyjy ady:',
+'sp-contributions-toponly' => 'Diňe iň soňky wersiýalary görkez',
+'sp-contributions-submit' => 'Gözle',
# What links here
'whatlinkshere' => 'Bu sahypa çykgytlar',
@@ -2170,7 +2201,6 @@ Aşakda blokirlemäniň takyk sebäbini ýazyň (meselem: wandalizm eden sahypal
'ipb-edit-dropdown' => 'Blokirleme sebäplerini redaktirle',
'ipb-unblock-addr' => '$1 üçin blokirlemäni aýyr',
'ipb-unblock' => 'Ulanyjy adynyň ýa-da IP adresiniň blokirlemesini aýyr',
-'ipb-blocklist-addr' => '$1 üçin bar bolan blokirlemeler',
'ipb-blocklist' => 'Bar bolan blokirlemeleri görkez',
'ipb-blocklist-contribs' => '$1 ulanyjysynyň goşantlary',
'unblockip' => 'Ulanyjynyň blokirlemesini aýyr',
@@ -2245,6 +2275,8 @@ Internet üpjün edijiňiz ýa-da goldaw gullugy bilen habarlaşyp, olary bu çy
Hasap açyp bilmeýärsiňiz.',
'cant-block-while-blocked' => 'Özüňiz blokirlengikäňiz başga ulanyjylary blokirläp bilmeýärsiňiz.',
'cant-see-hidden-user' => 'Blokirlejek bolýan ulanyjyňyz eýýäm blokirlenipdir hem-de gizlenilipdir. Ulanyjy gizlemek hukugyňyz ýokdugy sebäpli, ulanyjynyň blokirlemesini görüp ýa-da redaktirläp bilmeýärsiňiz.',
+'ipbblocked' => 'Beýleki ulanyjylary blokirläp ýa-da olaryň blokirlemesini aýryp bilmeýärsiňiz, sebäbi özüňiz blokirlenipsiňiz',
+'ipbnounblockself' => 'Öz blokirlemäňizi aýyrmagyňyza rugsat berilmeýär',
# Developer tools
'lockdb' => 'Maglumat bazasy gulply',
@@ -2334,6 +2366,7 @@ Ady üýgetmek üçin ony öçürmek isleýärsiňizmi?',
'immobile-source-page' => 'Bu sahypanyň ady üýtgedilmeýär.',
'immobile-target-page' => 'Niýetlenilýän ada üýtgedip bolmaýar.',
'imagenocrossnamespace' => 'Faýlyň adyny faýl däl at giňişliklerine üýtgedip bolmaýar',
+'nonfile-cannot-move-to-file' => 'Faýl dälleri faýl at giňişligine geçirip bolmaýar',
'imagetypemismatch' => 'Täze faýl giňeltmesi onuň görnüşine gabat gelmeýär',
'imageinvalidfilename' => 'Maksat edinilýän faýlyň ady nädogry',
'fix-double-redirects' => 'Başdaky ady görkezýän gönükdirmeleri täzele',
@@ -2413,6 +2446,7 @@ Kompýuteriňize ýazdyryň we şu ýere ýükläň.',
'importstart' => 'Sahypalar importirlenýär...',
'import-revision-count' => '$1 {{PLURAL:$1|wersiýa|wersiýa}}',
'importnopages' => 'Importirlemäge sahypa ýok.',
+'imported-log-entries' => '$1 {{PLURAL:$1|gündelik ýazgysyny|sany gündelik ýazgysyny}} importirledi.',
'importfailed' => 'Importirleme ÅŸowsuz: <nowiki>$1</nowiki>',
'importunknownsource' => 'Näbelli importirleme çeşmesi görnüşi',
'importcantopen' => 'Importirlenen faýly açyp bolmady',
@@ -2507,6 +2541,8 @@ Onuň çeşmesini görüp bilersiňiz',
'tooltip-rollback' => '"Öňki katdyna getir" ýeke gezek tyklananda bu sahypa iň soňky goşant goşanyň özgerdişlerini yzyna getirýär',
'tooltip-undo' => '"Yzyna al" bu özgerdişi yzyna getirýär we özgerdiş formuny deslapky syn modunda açýar.
Mazmun üçin bir sebäp goşmaga rugsat berýär',
+'tooltip-preferences-save' => 'Ileri tutmalary ýazdyr',
+'tooltip-summary' => 'Gysgaça düşündiriş giriziň',
# Metadata
'nodublincore' => 'Bu serwer üçin Dublin Core RDF metamaglumatlary ýapyldy.',
@@ -2602,14 +2638,17 @@ Ony işletseňiz iş ulgamyňyza howp astyna salmagyňyz mümkin.",
'imagemaxsize' => "Surat ölçeginiň çägi:<br />''(faýl düşündiriş sahypalary üçin)''",
'thumbsize' => 'Miniatýura ölçegi:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|sahypa|sahypa}}',
-'file-info' => '(faýl ölçegi: $1, MIME tipi: $2)',
-'file-info-size' => '($1 × $2 piksel, faýlyň ölçegi: $3, MIME tipli: $4)',
+'file-info' => 'faýl ölçegi: $1, MIME tipi: $2',
+'file-info-size' => '$1 × $2 piksel, faýlyň ölçegi: $3, MIME tipli: $4',
'file-nohires' => '<small>Wersiýanyň mundan uly ölçegi ýok.</small>',
-'svg-long-desc' => '(SVG faýly, nominal $1 × $2 piksel, faýl ölçegi: $3)',
+'svg-long-desc' => 'SVG faýly, nominal $1 × $2 piksel, faýl ölçegi: $3',
'show-big-image' => 'Suratyň doly ölçegi',
'show-big-image-thumb' => '<small>Deslapky synyň ölçegi: $1 × $2 piksel</small>',
'file-info-gif-looped' => 'halkaly',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kadr|kadr}}',
+'file-info-png-looped' => 'halkaly',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|gezek|gezek}} görkezildi',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kadr|kadr}}',
# Special:NewFiles
'newimages' => 'Täze faýllaryň galereýasy',
@@ -2919,28 +2958,28 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
'limitall' => 'ählisi',
# E-mail address confirmation
-'confirmemail' => 'E-poçta adresini tassykla',
-'confirmemail_noemail' => '[[Special:Preferences|Ulanyjy sazlamalaryňyzda]] bellenilen dogry bir e-poçta adresiňiz ýok.',
-'confirmemail_text' => '{{SITENAME}} saýtynyň e-poçta amallaryny ulanmak üçin, ilki bilen e-poçta adresiňiziň tassyklanmagy zerurdyr.
+'confirmemail' => 'E-poçta adresini tassykla',
+'confirmemail_noemail' => '[[Special:Preferences|Ulanyjy sazlamalaryňyzda]] bellenilen dogry bir e-poçta adresiňiz ýok.',
+'confirmemail_text' => '{{SITENAME}} saýtynyň e-poçta amallaryny ulanmak üçin, ilki bilen e-poçta adresiňiziň tassyklanmagy zerurdyr.
Adresiňize tassyklama e-poçtasyny ibermek üçin aşakdaky düwmä basyň.
Iberiljek habarda içinde kod ýazylan bir çykgyt bolar;
e-poçta adresiňiziň dogrudygyny tassyklamak üçin ol çykgydy öz brauzeriňizde açyň.',
-'confirmemail_pending' => 'Tassyklama kody size eýýäm ugradylypdyr;
+'confirmemail_pending' => 'Tassyklama kody size eýýäm ugradylypdyr;
eger hasabyňyzy ýaňy-ýakynda açan bolsaňyz, ol gelýänçä biraz tagapyl ediň, bolmasa täze kod sorap bilersiňiz.',
-'confirmemail_send' => 'Tassyklama koduny ugrat',
-'confirmemail_sent' => 'Tassyklama e-poçtasy ugradyldy.',
-'confirmemail_oncreate' => 'Tassyklama kody e-poçta adresiňize iberildi.
+'confirmemail_send' => 'Tassyklama koduny ugrat',
+'confirmemail_sent' => 'Tassyklama e-poçtasy ugradyldy.',
+'confirmemail_oncreate' => 'Tassyklama kody e-poçta adresiňize iberildi.
Sessiýa açmak üçin bu kod gerek däldir, emma bu wikidäki haýsydyr bir bir e-poçta amalyny işletmek üçin muny üpjün etmegiňiz zerurdyr.',
-'confirmemail_sendfailed' => '{{SITENAME}} tassyklama poçtaňyzy iberip bilmedi. E-poçtaňyz nädogry ýazylan bolmagy ähtimal. Barlap görüň.
+'confirmemail_sendfailed' => '{{SITENAME}} tassyklama poçtaňyzy iberip bilmedi. E-poçtaňyz nädogry ýazylan bolmagy ähtimal. Barlap görüň.
Serwer yzyna gaýtardy:$1',
-'confirmemail_invalid' => 'Nädogry tassyklama kody. Koduň möhleti gutaran bolmagy ahmal.',
-'confirmemail_needlogin' => 'E-poçta adresiňizi tassyklamak üçin $1.',
-'confirmemail_success' => 'E-poçta adresiňiz tassyklandy. [[Special:UserLogin|Sessiýa açyň-da]] wikini ulanyberiň.',
-'confirmemail_loggedin' => 'E-poçta adresiňiz tassyklandy.',
-'confirmemail_error' => 'Tassyklamaňyz ýazdyrylanda bir ýalňyşlyk boldy.',
-'confirmemail_subject' => '{{SITENAME}} e-poçta adres tassyklamasy.',
-'confirmemail_body' => 'Kimdir biri, ähtimal özüňiz, $1 IP adresinden,
+'confirmemail_invalid' => 'Nädogry tassyklama kody. Koduň möhleti gutaran bolmagy ahmal.',
+'confirmemail_needlogin' => 'E-poçta adresiňizi tassyklamak üçin $1.',
+'confirmemail_success' => 'E-poçta adresiňiz tassyklandy. [[Special:UserLogin|Sessiýa açyň-da]] wikini ulanyberiň.',
+'confirmemail_loggedin' => 'E-poçta adresiňiz tassyklandy.',
+'confirmemail_error' => 'Tassyklamaňyz ýazdyrylanda bir ýalňyşlyk boldy.',
+'confirmemail_subject' => '{{SITENAME}} e-poçta adres tassyklamasy.',
+'confirmemail_body' => 'Kimdir biri, ähtimal özüňiz, $1 IP adresinden,
{{SITENAME}} saýtynda bu e-poçta adresi bilen $2 hasabyny açdy.
Bu hasabyň hakykatdan-da size degişlidigini tassyklamak hem-de {{SITENAME}} saýtyndaky
@@ -2954,8 +2993,22 @@ Eger-de hasaby siz *açmadyk bolsaňyz*, e-poçta adresi tassyklamasyny
$5
Bu tassyklama kody $4 senesine çenli güýjüni saklaýar.',
-'confirmemail_invalidated' => 'E-poçta tassyklamasy ýatyryldy',
-'invalidateemail' => 'E-poçta tassyklamasyny ýatyr',
+'confirmemail_body_changed' => 'Kimdir biri, ähtimal özüňiz, $1 IP adresinden,
+{{SITENAME}} saýtynda bu e-poçta adresi üçin $2 hasabyny açdy.
+
+Bu hasabyň hakykatdan-da size degişlidigini tassyklamak hem-de {{SITENAME}} saýtyndaky
+e-poçta funksiýalaryny täzeden işjeňleşdirmek üçin aşakdaky çykgydy öz brauzeriňizde açyň:
+
+$3
+
+Eger-de hasap size *degişli däl* bolsa, onda e-poçta adresi tassyklamasyny
+ýatyrmak üçin aşakdaky çykgydy yzarlaň:
+
+$5
+
+Bu tassyklama kody $4 senesine çenli güýjüni saklaýar.',
+'confirmemail_invalidated' => 'E-poçta tassyklamasy ýatyryldy',
+'invalidateemail' => 'E-poçta tassyklamasyny ýatyr',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki atanaklaýyn girizme ýapyk]',
@@ -2995,6 +3048,7 @@ Sahypany gaýtadan döretmek isleýän bolsaňyz, tassyklamagyňyzy haýyş edý
'table_pager_first' => 'Birinji sahypa',
'table_pager_last' => 'Soňky sahypa',
'table_pager_limit' => 'Sahypa başyna $1 element görkez',
+'table_pager_limit_label' => 'Sahypa baÅŸyna element:',
'table_pager_limit_submit' => 'Git',
'table_pager_empty' => 'Netije ýok',
@@ -3062,6 +3116,13 @@ Bolanyňyzdan soňra "{{int:Watchlistedit-raw-submit}}" düwmesine basyň.
'version-hook-subscribedby' => 'Abuna ýazylan',
'version-version' => '(Wersiýa $1)',
'version-license' => 'Ygtyýarnama',
+'version-poweredby-credits' => "Bu wiki '''[http://www.mediawiki.org/ MediaWiki]''' arkaly üpjün edilýär, awtorlyk hukugy © 2001-$1 $2.",
+'version-poweredby-others' => 'beýlekiler',
+'version-license-info' => 'MediaWiki erkin programmadyr; MediaWiki-ni Erkin programma fondy tarapyndan çazp edilen GNU General Public License lisenziýasynyň ikini wersiýasynyň ýa-da (islegiňize görä) has täzeki bir wersiýasynyň şertlerine laýyklykda täzeden paýlap we/ýa-da üýtgedip bilersiňiz.
+
+MediaWiki programmasy peýdaly bolar diýen umyt bilen paýlanylýar, emma onuň üçin hatda TÄJIRÇILIK GYMMATY ýa-da KESGITLENILEN MAKSADA ÃARAMLYLYK boýunça hem hiç hili KEPILLIK BERILMEÃÄR. Has giňiÅŸleýin maglumat üçin GNU General Public License lisenziýasyna serediň.
+
+Bu programmanyň ýany bilen siz [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License lisenziýasynyň bir nusgasyny] hem edinen bolmaly. Eger edinmedik bolsaňyz, onda Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA adresine ýazyň ýa-da [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lisenziýasyny onlaýn okaň].',
'version-software' => 'Gurlan programma üpjünçiligi',
'version-software-product' => 'Önüm',
'version-software-version' => 'Wersiýa',
@@ -3132,6 +3193,15 @@ Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
'tags-edit' => 'redaktirle',
'tags-hitcount' => '$1 {{PLURAL:$1|üýtgeşme|üýtgeşme}}',
+# Special:ComparePages
+'comparepages' => 'Sahypalary deňeşdir',
+'compare-selector' => 'Sahypa wersiýalaryny deňeşdir',
+'compare-page1' => 'Sahypa 1',
+'compare-page2' => 'Sahypa 2',
+'compare-rev1' => 'Wersiýa 1',
+'compare-rev2' => 'Wersiýa 2',
+'compare-submit' => 'Deňeşdir',
+
# Database error messages
'dberr-header' => 'Bu wikiniň bir problemasy bar',
'dberr-problems' => 'Bagyşlaň! Bu saýtda tehniki kynçylyklar ýüze çykdy.',
@@ -3148,8 +3218,13 @@ Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
'htmlform-float-invalid' => 'Görkezen bahaňyz san däl.',
'htmlform-int-toolow' => 'Görkezen bahaňyz $1 minimumyndan pes.',
'htmlform-int-toohigh' => 'Görkezen bahaňyz $1 maksimumyndan ýokary.',
+'htmlform-required' => 'Bu baha hökmandyr',
'htmlform-submit' => 'TabÅŸyr',
'htmlform-reset' => 'Üýtgeşmeleri yzyna al',
'htmlform-selectorother-other' => 'BaÅŸga',
+# SQLite database support
+'sqlite-has-fts' => '$1 (doly tekstli gözleg goldawly)',
+'sqlite-no-fts' => '$1 (doly tekstli gözleg goldawsyz)',
+
);
diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php
index 71277bcb..13c3ce25 100644
--- a/languages/messages/MessagesTl.php
+++ b/languages/messages/MessagesTl.php
@@ -19,25 +19,25 @@ $namespaceNames = array(
NS_SPECIAL => 'Natatangi',
NS_TALK => 'Usapan',
NS_USER => 'Tagagamit',
- NS_USER_TALK => 'Usapang tagagamit',
- NS_PROJECT_TALK => 'Usapang $1',
+ NS_USER_TALK => 'Usapang_tagagamit',
+ NS_PROJECT_TALK => 'Usapang_$1',
NS_FILE => 'Talaksan',
- NS_FILE_TALK => 'Usapang talaksan',
+ NS_FILE_TALK => 'Usapang_talaksan',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'Usapang MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Usapang_MediaWiki',
NS_TEMPLATE => 'Suleras',
- NS_TEMPLATE_TALK => 'Usapang suleras',
+ NS_TEMPLATE_TALK => 'Usapang_suleras',
NS_HELP => 'Tulong',
- NS_HELP_TALK => 'Usapang tulong',
- NS_CATEGORY => 'Kaurian',
- NS_CATEGORY_TALK => 'Usapang kaurian',
+ NS_HELP_TALK => 'Usapang_tulong',
+ NS_CATEGORY => 'Kategorya',
+ NS_CATEGORY_TALK => 'Usapang_kategorya',
);
$namespaceAliases = array(
'Talaksan' => NS_FILE,
'Usapang talaksan' => NS_FILE_TALK,
- 'Kategorya' => NS_CATEGORY,
- 'Usapang kategorya' => NS_CATEGORY_TALK,
+ 'Kaurian' => NS_CATEGORY,
+ 'Usapang_kaurian' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
@@ -146,8 +146,7 @@ $messages = array(
'tog-editsection' => 'Payagan ang mga pagbabagong panseksyon sa mga [baguhin] na kawing',
'tog-editsectiononrightclick' => 'Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat (JavaScript)',
'tog-showtoc' => 'Ipakita ang talaan ng mga nilalaman (sa mga pahinang may higit sa 3 punong pamagat)',
-'tog-rememberpassword' => 'Tandaan ang paglagda ko sa kompyuter na ito',
-'tog-editwidth' => 'Palaparin ang kahon ng pagbabago upang mapuno ang buong tanawan',
+'tog-rememberpassword' => 'Tandaan ang paglagda ko sa panghanaphanap na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
'tog-watchcreations' => 'Idagdag ang mga pahinang nilikha ko sa aking tala ng mga binabantayan',
'tog-watchdefault' => 'Idagdag ang mga pahinang binago ko sa aking tala ng mga binabantayan',
'tog-watchmoves' => 'Idagdag ang mga pahinang inilipat ko sa aking tala ng mga binabantayan',
@@ -294,31 +293,21 @@ $messages = array(
'faqpage' => "Project:Mga malimit itanong (''FAQ'')",
# Vector skin
-'vector-action-addsection' => 'Magdagdag ng paksa',
-'vector-action-delete' => 'Burahin',
-'vector-action-move' => 'Ilipat',
-'vector-action-protect' => 'Ipagsanggalang',
-'vector-action-undelete' => 'Alisin ang pagbubura',
-'vector-action-unprotect' => 'Alisin ang pagsasanggalang',
-'vector-namespace-category' => 'Kategorya',
-'vector-namespace-help' => 'Pahina ng tulong',
-'vector-namespace-image' => 'Talaksan',
-'vector-namespace-main' => 'Pahina',
-'vector-namespace-media' => 'Pahina ng midya',
-'vector-namespace-mediawiki' => 'Mensahe',
-'vector-namespace-project' => 'Pahina ng proyekto',
-'vector-namespace-special' => 'Natatanging pahina',
-'vector-namespace-talk' => 'Usapan',
-'vector-namespace-template' => 'Suleras',
-'vector-namespace-user' => 'Pahina ng tagagamit',
-'vector-view-create' => 'Likhain',
-'vector-view-edit' => 'Baguhin',
-'vector-view-history' => 'Tingnan ang kasaysayan',
-'vector-view-view' => 'Basahin',
-'vector-view-viewsource' => 'Tingnan ang pinagmulan',
-'actions' => 'Mga kilos',
-'namespaces' => 'Mga ngalan-espasyo',
-'variants' => 'Naiiba pa',
+'vector-action-addsection' => 'Magdagdag ng paksa',
+'vector-action-delete' => 'Burahin',
+'vector-action-move' => 'Ilipat',
+'vector-action-protect' => 'Ipagsanggalang',
+'vector-action-undelete' => 'Alisin ang pagbubura',
+'vector-action-unprotect' => 'Alisin ang pagsasanggalang',
+'vector-simplesearch-preference' => 'Paganahin ang pinainam na mga mungkahi sa paghahanap (pabalat na Vector lang)',
+'vector-view-create' => 'Likhain',
+'vector-view-edit' => 'Baguhin',
+'vector-view-history' => 'Tingnan ang kasaysayan',
+'vector-view-view' => 'Basahin',
+'vector-view-viewsource' => 'Tingnan ang pinagmulan',
+'actions' => 'Mga kilos',
+'namespaces' => 'Mga ngalan-espasyo',
+'variants' => 'Naiiba pa',
'errorpagetitle' => 'Pagkakamali',
'returnto' => 'Bumalik sa $1.',
@@ -379,6 +368,9 @@ Masyadong maraming tagagamit ay sinusubukang tingnan ang pahinang ito.
Mangyari lamang na maghintay po nang sandali bago niyo pong subukang mataanin muli ang pahinang ito.
$1',
+'pool-timeout' => 'Ang pagpapahinga ay naghihintay ng kandado',
+'pool-queuefull' => 'Puno na ang pisan ng mga pila',
+'pool-errorunknown' => 'Hindi nalalamang kamalian',
# 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' => 'Tungkol sa {{SITENAME}}',
@@ -547,7 +539,8 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
'yourname' => 'Bansag:',
'yourpassword' => 'Hudyat:',
'yourpasswordagain' => 'Hudyat mo uli:',
-'remembermypassword' => 'Tandaan ang hudyat sa kompyuter na ito',
+'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
+'securelogin-stick-https' => 'Manatiling konektado sa HTTPS matapos lumagda',
'yourdomainname' => 'Dominyo mo:',
'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
'login' => 'Lumagda',
@@ -564,6 +557,7 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
'gotaccount' => 'May kuwenta ka na ba? $1.',
'gotaccountlink' => 'Lumagda',
'createaccountmail' => 'sa pamamagitan ng e-liham',
+'createaccountreason' => 'Dahilan:',
'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
'userexists' => 'May gumagamit na ng ganyang pangalang pantagagamit.
Pumili lamang ng iba pang pangalan.',
@@ -592,6 +586,7 @@ Pakisubok muli.',
Pakisubok muli.',
'passwordtooshort' => 'Ang mga hudyat ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).',
'password-name-match' => 'Dapat magkaiba ang hudyat mo sa bansag mo.',
+'password-login-forbidden' => 'Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at hudyat.',
'mailmypassword' => 'Ipadala sa pamamagitan ng e-liham ang bagong hudyat',
'passwordremindertitle' => 'Bagong pansamantalang hudyat para sa {{SITENAME}}',
'passwordremindertext' => 'Mayroong (na maaaring ikaw, mula sa adres ng IP na $1) humiling ng isang bagong
@@ -635,6 +630,9 @@ Maghintay po muna bago subukan uli.',
'loginlanguagelabel' => 'Wika: $1',
'suspicious-userlogout' => "Tinanggihan ang inyong kahilingang umalis sa pagkalagda dahil tila ito ay ipinadala ng sirang pambasa-basa o apoderadong pambaon (''caching proxy'')",
+# E-mail sending
+'php-mail-error-unknown' => 'Hindi malamang kamalian sa tungkulin ng liham ng PHP ()',
+
# Password reset dialog
'resetpass' => 'Palitan ang hudyat',
'resetpass_announce' => 'Lumagda ka sa pamamagitan ng isang pansamantalang ini-e-liham na kodigo.
@@ -688,11 +686,12 @@ Maaaring matagumpay mo nang nabago ang iyong hudyat o nakahiling na ng isang bag
'showdiff' => 'Ipakita ang mga pagbabago',
'anoneditwarning' => "'''Babala:''' Hindi ka nakalagda.
Matatala ang adres ng IP mo sa kasaysayan ng pagbabago ng pahinang ito.",
+'anonpreviewwarning' => "''Hindi ka nakalagda. Itatala sa inyong pagtatala ang inyong adres ng IP sa kasaysayan ng pagbabago ng pahinang ito.''",
'missingsummary' => "'''Paalala:''' Hindi ka nagbigay ng buod ng pagbabago.
Kapag pinindot mo uli ang Sagip, masasagip ang pagbabago mo na wala nito.",
'missingcommenttext' => 'Magbigay ng isang kumento/puna sa ibaba.',
-'missingcommentheader' => "'''Paalala:''' Hindi ka nagbigay ng isang paksa/paulo para sa puna/kumentong ito.
-Kapag pinindot mo uli ang Sagip, masasagip ang pagbabago mo na wala nito.",
+'missingcommentheader' => "'''Paalala:''' Hindi ka nagbigay ng isang paksa/paulo para sa punang ito.
+Kapag pinindot mo uli ang \"{{int:savearticle}}\", masasagip ang pagbabago mo na wala nito.",
'summary-preview' => 'Paunang tingin sa buod:',
'subject-preview' => 'Paunang tingin sa paksa/paulo:',
'blockedtitle' => 'Hinarang ang tagagamit',
@@ -771,8 +770,12 @@ Ang pinakahuling entrada sa talaan ng pagharang ay ibinigay sa baba para sa iny
'''Hindi pa ito nasasagip!'''",
'userjspreview' => "'''Tandaang pagsubok/paunang tingin mo pa lang ito ng iyong JavaScript.'''
'''Hindi pa ito nasasagip!'''",
+'sitecsspreview' => "'''Tandaan mong paunang tingin pa lamang ito ng nasabing CSS.'''
+'''Hindi pa ito nasasagip!'''",
+'sitejspreview' => "'''Tandaan mong paunang tingin pa lamang ito ng nasabing kodigong JavaScript.'''
+'''Hindi pa ito nasasagip!'''",
'userinvalidcssjstitle' => "'''Babala:''' Walang pabalat na \"\$1\".
-Tandaang gumagamit ang pinasadyang mga pahinang .css at .js ng mga pamagat na may maliliit na mga titik, halimbawa na ang {{ns:user}}:Foo/monobook.css na taliwas sa {{ns:user}}:Foo/Monobook.css.",
+Tandaang gumagamit ang pinasadyang mga pahinang .css at .js ng mga pamagat na may maliliit na mga titik, halimbawa na ang {{ns:user}}:Foo/vector.css na taliwas sa {{ns:user}}:Foo/Vector.css.",
'updated' => '(Naisapanahon na)',
'note' => "'''Paunawa:'''",
'previewnote' => "'''Isang lamang itong paunang tingin;
@@ -813,7 +816,6 @@ Nangangako ka rin sa amin na ikaw mismo ang sumulat nito, sumipi/kumopya nito mu
Kung ayaw mong mabago nang labis-labis ang mga isinulat mo, mas mabuting huwag mo na lamang ipasa iyan dito.<br />
Nangangako ka rin sa amin na ikaw ang mismong sumulat nito, o sinipi/kinopya mo ito mula sa isang pinagmulang nasa dominyo na ng publiko o katulad (tingnan ang $1 para sa mga detalye).
'''HUWAG MAGTALA NG AKDANG NAKAKARAPATANG-ARI (NAKAKOPIRAYT) NA HINDI MUNA HUMIHINGI NG PAHINTULOT!'''",
-'longpagewarning' => "'''BABALA: May habang $1 ''kilobyte'' ang pahinang ito; maaaring magkaroon ng suliranin sa pagbabago ng mga pahina ang ilang mga pantingin-tinging (''browser'') malapit nang umabot o mas mahaba na sa 32kb. Isaalang-alang ang paghahati ng pahina patungo sa mas maliliit na mga seksyon/bahagi.'''",
'longpageerror' => "'''KAMALIAN: May habang $1 ''kilobyte'' ang ipinasa mong teksto, na mas mahaba kaysa $2 ''kilobyte'' na siyang pinakamataas na nakatakdang halaga.
Hindi ito masasagip.'''",
'readonlywarning' => "'''BABALA: Ikinandado ang kalipunan ng dato para sa gawaing pampagpapanatili, kaya't hindi mo pa masasagip ang mga pagbabagong ginawa mo ngayon.
@@ -991,6 +993,8 @@ $1",
'logdelete-failure' => "'''Hindi maitakda ang kaantasan ng pagpapakita ng kalap:'''
$1",
'revdel-restore' => 'Baguhin ang kaantasan ng pagpapakita',
+'revdel-restore-deleted' => 'naburang mga binago',
+'revdel-restore-visible' => 'makikitang mga binago',
'pagehist' => 'Kasaysayan ng pahina',
'deletedhist' => 'Naburang kasaysayan',
'revdelete-content' => 'nilalaman',
@@ -1059,11 +1063,13 @@ Tiyakin na ang pagbabago ay makapagpapanatili ng pagkakatuluy-tuloy ng pahinang
# Diffs
'history-title' => 'Kasaysayan ng pagbabago ng "$1"',
'difference' => '(Pagkakaiba sa pagitan ng mga pagbabago)',
+'difference-multipage' => '(Pagkakaiba sa pagitan ng mga pahina)',
'lineno' => 'Linya $1:',
'compareselectedversions' => 'Paghambingin ang mga napiling bersyon',
'showhideselectedversions' => 'Ipakita/itago ang napiling mga bersyon',
'editundo' => 'ibalik',
-'diff-multi' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang pagbabago}} ang hindi ipinakita.)',
+'diff-multi' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang mga pagbabago}} ng {{PLURAL:$2|isang tagagamit|$2 mga tagagamit}} ang hindi ipinakikita.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang mga pagbabago}} ng {{PLURAL:$2|isang tagagamit|$2 mga tagagamit}} ang hindi ipinapakikita.)',
# Search results
'searchresults' => 'Kinalabasan/Resulta ng paghahanap',
@@ -1098,6 +1104,7 @@ Tiyakin na ang pagbabago ay makapagpapanatili ng pagkakatuluy-tuloy ng pahinang
'searchprofile-everything-tooltip' => 'Hanapin ang lahat ng nilalaman (kabilang ang mga pahina ng usapan)',
'searchprofile-advanced-tooltip' => 'Hanapin sa pinasadyang mga espasyo ng pangalan',
'search-result-size' => '$1 ({{PLURAL:$2|1 salita|$2 salita}})',
+'search-result-category-size' => '{{PLURAL:$1|isang kasapi|$1 kasapi}} ({{PLURAL:$2|isang subkategorya|$2 subkategorya}}, {{PLURAL:$3|isang talaksan|$3 talaksan}})',
'search-result-score' => 'Kaugnayan: $1%',
'search-redirect' => '(ipanuto/ituro ang $1)',
'search-section' => '(seksyong $1)',
@@ -1173,6 +1180,7 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'contextlines' => 'Linya bawat pagtama:',
'contextchars' => 'Konteksto ng bawat guhit:',
'stub-threshold' => 'Kakayanan para sa pagpopormat ng <a href="#" class="usbong">kawing ng usbong</a> (mga \'\'byte\'\'):',
+'stub-threshold-disabled' => 'Hindi pinagagana',
'recentchangesdays' => 'Mga araw na ipapakita sa kamakailan lamang na mga pagbabago:',
'recentchangesdays-max' => '(pinakamataas na ang $1 {{PLURAL:$1|araw|mga araw}})',
'recentchangescount' => 'Bilang ng mga pagbabagong ipapakita sa pamamagitan ng likas na katakdaan:',
@@ -1204,6 +1212,7 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'prefs-files' => 'Mga talaksan',
'prefs-custom-css' => 'Pasadyang CSS',
'prefs-custom-js' => 'Pasadyang JS',
+'prefs-common-css-js' => 'Naibahaging CSS/JS para sa lahat ng pabalat:',
'prefs-reset-intro' => 'Magagamit mo ang pahinang ito upang muling maitakda ang mga kagustuhan mo sa likas na pagtatakda ng sityo.
Hindi ito maibabalik sa dating gawi.',
'prefs-emailconfirm-label' => 'Kumpirmasyon ng e-liham:',
@@ -1243,9 +1252,15 @@ Mapipili mo ring payagan ang ibang tagagamit na makapagugnayan sa iyo sa pamamag
'prefs-advancedrendering' => 'Masulong na mga mapagpipilian',
'prefs-advancedsearchoptions' => 'Masulong na mga mapagpipilian',
'prefs-advancedwatchlist' => 'Masulong na mga mapagpipilian',
-'prefs-display' => 'Ipakita ang mga pagpipilian',
+'prefs-displayrc' => 'Ipakita ang mga pagpipilian',
+'prefs-displaysearchoptions' => 'Ipakita ang mga pagpipilian',
+'prefs-displaywatchlist' => 'Ipakita ang mga pagpipilian',
'prefs-diffs' => 'Mga pagkakaiba',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Mukhang katanggap-tanggap ang tirahan ng e-liham',
+'email-address-validity-invalid' => 'Magpasok ng isang tanggap na tirahan ng e-liham',
+
# User rights
'userrights' => 'Pamamahala ng mga karapatan ng tagagamit',
'userrights-lookup-user' => 'Pamahalaan ang mga pangkat ng tagagamit',
@@ -1329,6 +1344,7 @@ Mapipili mo ring payagan ang ibang tagagamit na makapagugnayan sa iyo sa pamamag
'right-hideuser' => 'Harangin ang isang tagagamit, na itinatago mula sa publiko',
'right-ipblock-exempt' => 'Laktawan ang mga pagharang/paghadlang na pang-IP, kusang pagharang/paghadlang at mga saklaw ng pagharang/paghadlang',
'right-proxyunbannable' => 'Laktawan ang mga kusang pagharang ng mga kahalili',
+'right-unblockself' => 'Tanggalin ang pagkakaharang ng kanilang mga sarili',
'right-protect' => 'Baguhin ang mga antas ng panananggalang at baguhin ang mga pahinang nakasanggalang',
'right-editprotected' => 'Baguhin ang mga pahinang nakasanggalang (walang baita-baitang na panananggalang)',
'right-editinterface' => 'Baguhin ang ugnayang-hangganan ng tagagamit',
@@ -1351,7 +1367,6 @@ Mapipili mo ring payagan ang ibang tagagamit na makapagugnayan sa iyo sa pamamag
'right-siteadmin' => 'Ikandado at alisin ang pagkakakandado ng kalipunan ng dato',
'right-reset-passwords' => 'Mulng itakda ang mga hudyat ng iba pang mga tagagamit',
'right-override-export-depth' => 'Iluwas ang mga pahina na kabilang ang mga pahinang nakakawing magpahanggang sa isang lalim na 5',
-'right-versiondetail' => 'Ipakita ang karugtong na kabatiran ng bersyong pangsopwer',
'right-sendemail' => 'Magpadala ng e-liham sa ibang mga tagagamit',
# User rights log
@@ -1402,14 +1417,9 @@ Mapipili mo ring payagan ang ibang tagagamit na makapagugnayan sa iyo sa pamamag
'recentchanges-legend' => 'Mga pagpipilian para sa kamakailang mga pagbabago',
'recentchangestext' => 'Subaybayan ang mga pinakahuling pagbabago sa wiki sa pahinang ito.',
'recentchanges-feed-description' => 'Sundan ang pinakahuling mga pagbabago sa wiki sa pamamagitan ng feed na ito.',
-'recentchanges-label-legend' => 'Kahulugan : $1.',
-'recentchanges-legend-newpage' => '$1 - bagong pahina',
'recentchanges-label-newpage' => 'Lumikha ng isang bagong pahina ang pagbabagong ito',
-'recentchanges-legend-minor' => '$1 - maliliit na pagbabago',
'recentchanges-label-minor' => 'Isa itong munting pagbabago',
-'recentchanges-legend-bot' => '$1 - binago ng bot',
'recentchanges-label-bot' => 'Gawa ng isang bot ang pagbabagong ito',
-'recentchanges-legend-unpatrolled' => '$1 - hindi napatrulyang pagbabago',
'recentchanges-label-unpatrolled' => 'Hindi pa napapatrulyahan ang pagbabagong ito',
'rcnote' => "Nasa ibaba {{PLURAL:$1|ang '''1''' pagbabago|ang pinakahuling '''$1''' mga pagbabago}} sa huling {{PLURAL:$2|araw|'''$2''' mga araw}}, mula noong $5, $4.",
'rcnotefrom' => "Nasa ibaba ang mga pagbabago mula pa noong '''$2''' (ipinapakita ang magpahanggang sa '''$1''').",
@@ -1456,6 +1466,9 @@ upang makapagkarga ng talaksan.',
'upload_directory_missing' => 'Nawawala ang direktoryo ng pagkarga ($1) at hindi na mailikha ng webserver.',
'upload_directory_read_only' => 'Ang direktoryo ng pagkarga ($1) ay hindi maisulat ng webserver.',
'uploaderror' => 'Kamalian sa pagkarga',
+'upload-recreate-warning' => "'''Babala: Ang isang talaksan na may ganyang pangalan ay nabura o inilipat.'''
+
+Ang talaan ng pagbubura at paglipat para sa pahinang ito ay ibinigay dito para sa kaginhawahan:",
'uploadtext' => "Gamitin ang pormularyong nasa ibaba para magkarga ng mga talaksan.
Para tingnan o maghanap ng mga dati nang naikargang mga talaksan pumunta sa [[Special:FileList|talaan ng ikinargang mga talaksan]], ang (muling) mga pagkakarga ay nakatala rin sa [[Special:Log/upload|talaan ng pagkarga]], ang mga binura/nabura sa [[Special:Log/delete|talaan ng pagbubura]].
@@ -1490,6 +1503,17 @@ Ang ninanais na {{PLURAL:\$3|uri ng talaksan ay ang|mga uri ng talaksan ay ang m
'filetype-banned-type' => "Isang hindi pinapahintulutang uri ng talaksan ang '''\".\$1\"'''.
Ang pinapahintulutang {{PLURAL:\$3|uri ng talaksan ay ang|mga uri ng talaksan ay ang mga}} \$2.",
'filetype-missing' => 'Walang karugtong/hulapi ang talaksan (katulad ng ".jpg").',
+'empty-file' => 'Walang laman ang ipinasa mong talaksan.',
+'file-too-large' => 'Napakalaki ng ipinasa mong talaksan.',
+'filename-tooshort' => 'Napakaikli ng pangalan ng talaksan.',
+'filetype-banned' => 'Pinagbabawal ang ganitong uri ng talaksan.',
+'verification-error' => 'Hindi pumasa sa pagpapatunay na pangtalaksan ang ganitong talaksan.',
+'hookaborted' => 'Ang pagbabagong sinubok mong gawin ay hindi itinuloy ng isang kawil ng dugtong.',
+'illegal-filename' => 'Hindi pinapayagan ang pangalan ng talaksan.',
+'overwrite' => 'Hindi pinapahintulutan ang pagsusulat sa ibabaw ng umiiral na talaksan.',
+'unknown-error' => 'Naganap ang isang hindi nakikilalang kamalian.',
+'tmp-create-error' => 'Hindi malikha ang pansamantalang talaksan.',
+'tmp-write-error' => 'Kamalian sa pagsusulat ng pansamantalang talaksan.',
'large-file' => 'Iminumungkahing hindi hihigit ang laki ng mga talaksan sa $1;
ang talaksang ito ay $2.',
'largefileserver' => 'Mas malaki ang talaksan kaysa nakatakdang papahintulutan ng serbidor.',
@@ -1516,13 +1540,14 @@ Kung nais mo pa ring ikarga pataas ang iyong talaksan, paki bumalik lamang at gu
bumalik at ikarga ang talaksan na ito sa bagong pangalan. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ang talaksang ito ay isang kakambal ng sumusunod na {{PLURAL:$1|talaksan|mga talaksan}}:',
'file-deleted-duplicate' => 'Dating nabura ang isang talaksang katulad ng talaksang ito ([[:$1]]). Dapat mong suriin ang kasaysayan ng pagbubura ng talaksang iyon bago magpatuloy sa muling pagkarga nito.',
-'successfulupload' => 'Matagumpay na pagkakarga',
'uploadwarning' => 'Babala sa pagkakarga',
'uploadwarning-text' => 'Pakibago ang nasa ibabang paglalarawan ng talaksan at subukan muli.',
'savefile' => 'Sagipin ang talaksan',
'uploadedimage' => 'ikinarga ang "[[$1]]"',
'overwroteimage' => 'nagkarga ng isang bagong bersyon ng "[[$1]]"',
'uploaddisabled' => 'Hindi pinagana ang mga pagkarga',
+'copyuploaddisabled' => 'Ikargang paitaas ayon sa hindi pinaganang URL.',
+'uploadfromurl-queued' => 'Inilagay sa pila ang iyong pagkakargang paitaas.',
'uploaddisabledtext' => 'Hindi pinagana ang mga pagkakarga ng talaksan.',
'php-uploaddisabledtext' => 'Hindi pinapagana ang mga pagkakarga ng talaksang PHP. Pakisuri ang katakdaan ng mga_pagkakarga_ng_talaksan.',
'uploadscripted' => 'Naglalaman ang talaksan na ito ng HTML o kodigong script na maaaring mali ang pagkaintindi ng isang web browser.',
@@ -1541,6 +1566,14 @@ bumalik at ikarga ang talaksan na ito sa bagong pangalan. [[File:$1|thumb|center
Ikunsidera mo kung nararapat ba na ipagpatuloy ang pagkarga ng talaksang ito.
Ibinigay ang tala ng pagbura ng talaksang ito para konbinyente:",
'filename-bad-prefix' => "Ang talaksan na ikakarga mo ay nagsisimula sa '''\"\$1\"''', na isang hindi naglalarawang pangalan na karaniwang tinatakda ng mga kamerang digital. Paki pili ang isang mas naglalarawang pangalan para sa iyong talaksan.",
+'upload-success-subj' => 'Matagumpay na pagkakarga',
+'upload-success-msg' => 'Matagumpay ang ikinarga mo mula sa [$2]. Makukuha ito mula rito: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema sa pagkarga',
+'upload-failure-msg' => 'May suliranin sa iyong pagkakarga mula sa [$2]:
+
+$1',
+'upload-warning-subj' => 'Babala sa pagkakarga',
+'upload-warning-msg' => 'May suliranin sa iyong pagkakarga mula sa [$2]. Maaari kang magbalik sa [[Special:Upload/stash/$1|upload form]] upang itama ang suliraning ito.',
'upload-proto-error' => 'Maling protokolo',
'upload-proto-error-text' => 'Nangangailangan ang malayong pagkarga ng mga URL na nagsisimula sa <code>http://</code> o <code>ftp://</code>.',
@@ -1606,6 +1639,7 @@ Mababago ang pagkakapangkat-pangkat sa pamamagitan ng pagpindot sa isang paulo n
'listfiles_search_for' => 'Hanapin ang pangalan ng midya:',
'imgfile' => 'talaksan',
'listfiles' => 'Talaan ng talaksan',
+'listfiles_thumb' => 'Kagyat',
'listfiles_date' => 'Petsa',
'listfiles_name' => 'Pangalan',
'listfiles_user' => 'Tagagamit',
@@ -1720,8 +1754,8 @@ Ang paglalarawang nasa ibabaw ng [$2 pahina ng paglalarawan ng talaksan] nito do
'statistics-edits' => 'Naihanda na ang mga pagbabago ng pahina mula sa {{SITENAME}}',
'statistics-edits-average' => 'Karaniwang pagbabago sa bawat pahina',
'statistics-views-total' => 'Kalahatang pagdayo',
+'statistics-views-total-desc' => 'Hindi kabilang ang mga pagtanaw sa mga pahinang hindi umiiral at mga pahinang natatangi',
'statistics-views-peredit' => 'Pagtingin sa bawat pagbabago',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Bilang ng gagawin]',
'statistics-users' => 'Mga nakatalang [[Special:ListUsers|tagagamit]]',
'statistics-users-active' => 'Mga masusugid na tagagamit <small>(mga nakatalang mang-aambag sa buwang ito)</small>',
'statistics-users-active-desc' => 'Mga tagagamit na nagsagawa ng isang galaw/gawain sa huling {{PLURAL:$1|araw|$1 mga araw}}',
@@ -1735,7 +1769,7 @@ Tinuturing ang isang pahina bilang pahinang naglilinaw kung ginagamit nito ang i
'doubleredirects' => 'Mga dobleng karga',
'doubleredirectstext' => 'Nagtatala ang pahinang ito ng mga pahinang pumupunta sa iba pang mga pahinang nililipatan. Naglalaman ang bawat hanay ng mga kawing sa una ang pangalawang kapupuntahan, maging ng puntiryang pangalawang kapupuntahan, na karaniwang "tunay" na puntiryang pahina, na dapat kinatuturuan ng unang pupuntahan.
-Nasugpo na ang mga ipinasok na <s>inekisan</s>.',
+Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
'double-redirect-fixed-move' => 'Inilipat na ang [[$1]], isa na ngayon itong panuto/panturo patungo sa [[$2]]',
'double-redirect-fixer' => 'Tagapagayos ng panuto/panturo',
@@ -1758,6 +1792,8 @@ Nasugpo na ang mga ipinasok na <s>inekisan</s>.',
'nmembers' => '$1 {{PLURAL:$1|kasapi|mga kasapi}}',
'nrevisions' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
'nviews' => '$1 {{PLURAL:$1|nakita|mga nakikita}}',
+'nimagelinks' => 'Ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}',
+'ntransclusions' => 'ginamit sa $1 {{plural:$1|pahina|mga pahina}}',
'specialpage-empty' => 'Walang resulta para sa ulat na ito.',
'lonelypages' => 'Mga inulilang pahina',
'lonelypagestext' => 'Ang mga sumusunod ng mga pahina ay hindi nakaturo mula sa ibang mga pahina sa wiking ito.',
@@ -1914,34 +1950,40 @@ Maaaring may mga [[{{MediaWiki:Listgrouprights-helppage}}|karagdagang kabatiran]
'listgrouprights-removegroup-self-all' => 'Alisin ang lahat ng mga pangkat mula sa sariling akawnt',
# E-mail user
-'mailnologin' => 'Walang adres na mapagpapadalahan',
-'mailnologintext' => 'Kailangan mong [[Special:UserLogin|lumagda]] at magkaroon ng tanggap na e-liham sa iyong [[Special:Preferences|mga kagustuhan]] para makapagpadala ng e-liham sa ibang mga tagagamit.',
-'emailuser' => 'Padalhan ng e-liham ang tagagamit',
-'emailpage' => 'Magpadala ng e-liham sa tagagamit',
-'emailpagetext' => 'Magagamit mo ang pormularyo sa ibaba para makapagpadala ng mensahe sa pamamagitan ng isang e-liham para sa tagagamit na ito.
+'mailnologin' => 'Walang adres na mapagpapadalahan',
+'mailnologintext' => 'Kailangan mong [[Special:UserLogin|lumagda]] at magkaroon ng tanggap na e-liham sa iyong [[Special:Preferences|mga kagustuhan]] para makapagpadala ng e-liham sa ibang mga tagagamit.',
+'emailuser' => 'Padalhan ng e-liham ang tagagamit',
+'emailpage' => 'Magpadala ng e-liham sa tagagamit',
+'emailpagetext' => 'Magagamit mo ang pormularyo sa ibaba para makapagpadala ng mensahe sa pamamagitan ng isang e-liham para sa tagagamit na ito.
Ang ipinasok mong adres ng e-liham sa [[Special:Preferences|iyong mga kagustuhan ng tagagamit]] ay lilitaw bilang adres na "Mula kay" ng e-liham, para tuwirang makatugon sa iyo ang nakatanggap.',
-'usermailererror' => 'Pagkakamaling sanhi ng pagkakabalik ng liham mula sa puntirya:',
-'defemailsubject' => 'E-liham ng {{SITENAME}}',
-'noemailtitle' => 'Walang adres ng e-liham',
-'noemailtext' => 'Ang tagagamit na ito ay hindi tumukoy ng isang tanggap na adres ng e-liham.',
-'nowikiemailtitle' => 'Walang pinapahintulutang e-liham',
-'nowikiemailtext' => 'Pinili ng tagagamit na ito na huwag makatanggap ng e-liham mula sa ibang mga tagagamit.',
-'email-legend' => 'Magpadala ng e-liham patungo sa isa pang tagagamit ng {{SITENAME}}',
-'emailfrom' => 'Mula kay:',
-'emailto' => 'Para kay:',
-'emailsubject' => 'Paksa:',
-'emailmessage' => 'Mensahe:',
-'emailsend' => 'Ipadala',
-'emailccme' => 'Padalhan ako ng sipi ng aking mensahe sa pamamagitan ng e-liham.',
-'emailccsubject' => 'Kopya ng iyong mensahe sa $1: $2',
-'emailsent' => 'Naipadala na ang e-liham',
-'emailsenttext' => 'Naipadala na ang mensahe ng iyong e-liham.',
-'emailuserfooter' => 'Ipinadala ang e-liham na ito ni $1 para kay $2 sa pamamagitan ng tungkuling "Magpadala ng e-liham" na nasa {{SITENAME}}.',
+'usermailererror' => 'Pagkakamaling sanhi ng pagkakabalik ng liham mula sa puntirya:',
+'defemailsubject' => 'E-liham ng {{SITENAME}}',
+'usermaildisabled' => 'Hindi pinagana ang e-liham ng tagagamit',
+'usermaildisabledtext' => 'Hindi maaaring magpadala ng e-liham sa ibang mga tagagamit sa wiki na ito.',
+'noemailtitle' => 'Walang adres ng e-liham',
+'noemailtext' => 'Ang tagagamit na ito ay hindi tumukoy ng isang tanggap na adres ng e-liham.',
+'nowikiemailtitle' => 'Walang pinapahintulutang e-liham',
+'nowikiemailtext' => 'Pinili ng tagagamit na ito na huwag makatanggap ng e-liham mula sa ibang mga tagagamit.',
+'email-legend' => 'Magpadala ng e-liham patungo sa isa pang tagagamit ng {{SITENAME}}',
+'emailfrom' => 'Mula kay:',
+'emailto' => 'Para kay:',
+'emailsubject' => 'Paksa:',
+'emailmessage' => 'Mensahe:',
+'emailsend' => 'Ipadala',
+'emailccme' => 'Padalhan ako ng sipi ng aking mensahe sa pamamagitan ng e-liham.',
+'emailccsubject' => 'Kopya ng iyong mensahe sa $1: $2',
+'emailsent' => 'Naipadala na ang e-liham',
+'emailsenttext' => 'Naipadala na ang mensahe ng iyong e-liham.',
+'emailuserfooter' => 'Ipinadala ang e-liham na ito ni $1 para kay $2 sa pamamagitan ng tungkuling "Magpadala ng e-liham" na nasa {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Nag-iiwan ng mensaheng pangsistema.',
+'usermessage-editor' => 'Mensahero ng sistema',
# Watchlist
'watchlist' => 'Mga binabantayan ko',
'mywatchlist' => 'Bantayan ko',
-'watchlistfor' => "(para sa '''$1''')",
+'watchlistfor2' => 'Para sa $1 $2',
'nowatchlist' => 'Wala kang pahinang binabantayan.',
'watchlistanontext' => 'Paki $1 upang makita o mabago ang mga aytem sa iyong binabantayan.',
'watchnologin' => 'Di ka naka-lagda',
@@ -2057,7 +2099,10 @@ Ang huling pagbabago sa pahina ay ginawa ni [[User:$3|$3]] ([[User talk:$3|Usapa
'revertpage' => 'Ibinalik ang mga pagbabago ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Usapan]]) patungo sa huling rebisyon ni [[User:$1|$1]]',
'revertpage-nouser' => 'Ibinalik ang mga pagbabago ni (tinanggal ang bansag) patungo sa huling rebisyon ni [[User:$1|$1]]',
'rollback-success' => 'Ibinalik ang mga pagbabago ni $1; ibinalik sa huling bersyon ni $2.',
-'sessionfailure' => "Tila mayroong suliraning may kaugnayan sa iyong sesyon/panahon ng pagkakalagda;
+
+# Edit tokens
+'sessionfailure-title' => 'Nabigong pulong',
+'sessionfailure' => "Tila mayroong suliraning may kaugnayan sa iyong sesyon/panahon ng pagkakalagda;
Kinansela ang galaw/gawaing ito bilang pagiingat laban sa pagnanakaw (panghahaydyak) ng sesyon/panahon.
Pakipindot ang pindutang \"ibalik\" (''back'') at ikarga uli ang pinanggalingan mong pahina, sumubok uli pagkaraan.",
@@ -2189,19 +2234,23 @@ $1',
'month' => 'Mula sa buwan (at nauna):',
'year' => 'Mula sa taon (at nauna):',
-'sp-contributions-newbies' => 'Ipakita ang mga ambag ng mga bagong kuwenta lamang',
-'sp-contributions-newbies-sub' => 'Para sa mga bagong kuwenta',
-'sp-contributions-newbies-title' => 'Mga ambag ng tagagamit para sa mga bagong kuwenta/akawnt',
-'sp-contributions-blocklog' => 'Tala ng paglipat',
-'sp-contributions-deleted' => 'naburang mga ambag ng tagagamit',
-'sp-contributions-logs' => 'mga tala',
-'sp-contributions-talk' => 'usapan',
-'sp-contributions-userrights' => 'pamamahala ng mga karapatan ng tagagamit',
-'sp-contributions-blocked-notice' => 'Kasalukuyang hinarang ang tagagamit na ito.
+'sp-contributions-newbies' => 'Ipakita ang mga ambag ng mga bagong kuwenta lamang',
+'sp-contributions-newbies-sub' => 'Para sa mga bagong kuwenta',
+'sp-contributions-newbies-title' => 'Mga ambag ng tagagamit para sa mga bagong kuwenta/akawnt',
+'sp-contributions-blocklog' => 'Tala ng paglipat',
+'sp-contributions-deleted' => 'naburang mga ambag ng tagagamit',
+'sp-contributions-uploads' => 'mga ikinargang paitaas',
+'sp-contributions-logs' => 'mga tala',
+'sp-contributions-talk' => 'usapan',
+'sp-contributions-userrights' => 'pamamahala ng mga karapatan ng tagagamit',
+'sp-contributions-blocked-notice' => 'Kasalukuyang hinarang ang tagagamit na ito.
Ang pinakahuling entrada sa talaan ng pagharang ay ibinigay sa ibaba para sa pagsangguni:',
-'sp-contributions-search' => 'Maghanap ng ambag',
-'sp-contributions-username' => 'IP Address o bansag:',
-'sp-contributions-submit' => 'Hanapin',
+'sp-contributions-blocked-notice-anon' => 'Kasalukuyang hinarang ang adres ng IP na ito.
+Ang pinakahuling entrada sa talaan ng pagharang ay ibinigay sa ibaba para sa pagsangguni:',
+'sp-contributions-search' => 'Maghanap ng ambag',
+'sp-contributions-username' => 'IP Address o bansag:',
+'sp-contributions-toponly' => 'Ipakita lang ang mga pamamatnugot na mga huling rebisyon',
+'sp-contributions-submit' => 'Hanapin',
# What links here
'whatlinkshere' => 'Mga nakaturo dito',
@@ -2262,7 +2311,6 @@ Tingnan ang [[Special:IPBlockList|talaan ng mga hinadlangang IP]] upang makita a
'ipb-edit-dropdown' => 'Baguhin ang mga dahilan sa pagharang',
'ipb-unblock-addr' => 'Tanggalin ang pagkaharang ng $1',
'ipb-unblock' => 'Tanggalin ang pagkaharang ng isang bansag o IP address',
-'ipb-blocklist-addr' => 'Umiiral na pagharang/paghadlang para kay $1',
'ipb-blocklist' => 'Tingnan ang umiiral na mga pagharang/paghadlang',
'ipb-blocklist-contribs' => 'Mga ambag ni $1',
'unblockip' => 'Tanggalin ang pagharang/paghadlang sa tagagamit',
@@ -2335,6 +2383,8 @@ Hinarang/hinadlangan na si $1. Ibig mo bang baguhin ang mga pagtatakda?',
'cant-block-while-blocked' => 'Hindi mo mahahadlangan/mahaharang ang ibang mga tagagamit habang hinahadlangan ka.',
'cant-see-hidden-user' => 'Ang tagagamit na sinusubukan mong hadlangan ay naharang at naikubli na.
Dahil wala kang karapatang magkubli ng tagagamit, hindi mo makikita o mababago ang paghadlang sa tagagamit.',
+'ipbblocked' => 'Hindi mo mahahadlangan o tanggalin ang hadlang ng ibang mga tagagamit, dahil hinadlangan ka rin',
+'ipbnounblockself' => 'Hindi ka pinahihintulutang tanggalin ang pagharang sa iyo.',
# Developer tools
'lockdb' => 'Ikandado ang kalipunan ng datos',
@@ -2373,6 +2423,17 @@ Nangangahulugan ito na maaari mong muling pangalanan ang isang pahina pabalik sa
'''BABALA!'''
Maaaring itong maging isang marahas at hindi inaaasang pagbabago para sa isang bantog na pahina;
pakitiyak na nauunawaan mo ang mga kahihinatnan nito bago magpatuloy.",
+'movepagetext-noredirectfixer' => "Ang paggamit ng pormularyo sa ibaba ay muling magpapangalan ng isang pahina, na maglilipat sa lahat ng kasaysayan nito papunta sa bagong pangalan.
+Ang lumang pamagat ay magiging isang pahina binago ang pupuntahan papunta sa bagong pamagat.
+Tiyaking suriin ang [[Special:DoubleRedirects|nagkadalawa]] o [[Special:BrokenRedirects|putol na mga pagpapapunta]].
+Ikaw ang may pananagutan sa pagtitiyak na ang mga kawin ay patuloy na nakaturo kung saan sila dapat pumunta.
+
+Tandaan na ang pahina ay '''hindi''' ililipat kung mayroon nang isang pahina sa bagong pamagat, maliban na lang kung wala itong laman o isang pagpapapunta sa ibang lugar at walang nakaraang kasaysayan ng pagbago.
+Nangangahulugan ito na maaari mong muling pangalanan ang isang pahina pabalik sa kung saan ito nagsimulang muling pinangalanan kung nagkamali ka, at hindi mo mapangibabawan ang isang umiiral na pahina.
+
+'''Babala!'''
+Maaari itong maging isang marahas at hindi inaasahang pagbabago para sa isang tanyag na pahina;
+mangyaring tiyakin na nauunawaan mo ang mga kahihinatnan nito bago magpatuloy.",
'movepagetalktext' => "Kusa/awtomatikong ililipat din ang mga kasama/kakabit na mga kaugnay na mga pahina '''maliban na lamang kung''':
*Mayroon nang isang pahina ng usapang may laman na at umiiral na sa ilalim ng isang bagong pangalan, o
*Hindi mo nilagyan ng tsek ang kahong nasa ibaba.
@@ -2429,6 +2490,7 @@ Mayroon na ang pupuntahang artikulo na "[[$1]]". Nais mo bang burahin ito para m
'immobile-source-page' => 'Hindi naililipat ang pahinang ito.',
'immobile-target-page' => 'Hindi makakalipat papunta sa ganyang kapupuntahang pamagat.',
'imagenocrossnamespace' => 'Hindi mailipat ang talaksan patungo sa hindi pangtalaksang espasyo ng pangalan',
+'nonfile-cannot-move-to-file' => 'Hindi maililipat ang hindi talaksan sa puwang na pampangalan ng talaksan',
'imagetypemismatch' => 'Hindi tumutugma sa uri nito ang bagong pandugtong/karugtong ng talaksan',
'imageinvalidfilename' => 'Hindi tanggap ang patutunguhan/puntiryang pangalan ng talaksan.',
'fix-double-redirects' => 'Isapanahon ang kahit anong panuto/panutong tumuturo sa orihinal na pamagat',
@@ -2508,6 +2570,7 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
'importstart' => 'Inaangkat na ang mga pahina...',
'import-revision-count' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
'importnopages' => 'Walang mga pahinang maangkat.',
+'imported-log-entries' => 'Inangkat na $1 {{PLURAL:$1|pagpasok sa talaan|mga pagpasok sa talaan}}.',
'importfailed' => 'Bigo ang pag-angkat: $1',
'importunknownsource' => 'Hindi alam na pinagmulang uri ng angkat',
'importcantopen' => 'Hindi mabuksan ang talaksan ng angkat',
@@ -2600,6 +2663,8 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
'tooltip-upload' => 'Simulan ang pagkarga',
'tooltip-rollback' => 'Ibinabalik ng "Pagulungin pabalik sa dati" ang (mga) pagbabago sa pahinang ito patungo sa huling bersyon ng huling tagapagambag sa pamamagitan ng isang pindot lamang.',
'tooltip-undo' => 'Ibinabalit ng "Ibalik" ang pagbabagong ito at binubuksan ang pahinang gawaan ng pagbabago sa anyong paunang-tingin muna. Nagpapahintulot na makapagdagdag ng dahilan sa buod.',
+'tooltip-preferences-save' => 'Itakda ang mga kagustuhan',
+'tooltip-summary' => 'Magbigay ng maikling buod',
# Stylesheets
'common.css' => '/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */',
@@ -2729,14 +2794,17 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
'imagemaxsize' => "Takdang hangganan sa laki ng larawan: <br />''(para sa mga pahina ng paglalarawan ng talaksan)''",
'thumbsize' => 'Maliit na sukat (parang "kuko sa hinlalaki" lamang):',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pahina|mga pahina}}',
-'file-info' => '(sukat ng talaksan: $1, tipo ng MIME: $2)',
-'file-info-size' => '($1 × $2 piksel, sukat ng talaksan: $3, tipo ng MIME: $4)',
+'file-info' => 'sukat ng talaksan: $1, tipo ng MIME: $2',
+'file-info-size' => '$1 × $2 piksel, sukat ng talaksan: $3, tipo ng MIME: $4',
'file-nohires' => '<small>Walang makuhang mas mataas na resolusyon (kalinawan).</small>',
-'svg-long-desc' => '(Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3)',
+'svg-long-desc' => 'Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3',
'show-big-image' => 'Buong resolusyon (kalinawan)',
'show-big-image-thumb' => '<small>Laki ng paunang tinging ganito: $1 × $2 mga piksel</small>',
'file-info-gif-looped' => 'nasilo na',
'file-info-gif-frames' => '$1 {{PLURAL:$1|banhay|mga banhay}}',
+'file-info-png-looped' => 'nakalikaw',
+'file-info-png-repeat' => 'pinaandar ng $1 {{PLURAL:$1|ulit|mga ulit}}',
+'file-info-png-frames' => ' $1 {{PLURAL:$1|kuwadro|mga kuwadro}}',
# Special:NewFiles
'newimages' => 'Galerya ng mga bagong talaksan',
@@ -2895,6 +2963,7 @@ Nakatakdang itago ang iba pa.
'exif-gpsareainformation' => 'Pangalan ng lugar ng GPS',
'exif-gpsdatestamp' => 'Petsa ng GPS',
'exif-gpsdifferential' => 'Pagtatama sa pakakaiba ng GPS',
+'exif-objectname' => 'Maiksing pamagat',
# EXIF attributes
'exif-compression-1' => 'Walang kompresyon',
@@ -3058,26 +3127,26 @@ Nakatakdang itago ang iba pa.
'limitall' => 'lahat',
# E-mail address confirmation
-'confirmemail' => 'Patotohanan ang adres ng e-liham',
-'confirmemail_noemail' => 'Wala kang nakatakdang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan ng tagagamit]].',
-'confirmemail_text' => "Pinagagawa ng {{SITENAME}} na patotohanan mo ang iyong adres ng e-liham bago gamitin ang mga kasangkapang-katangian ng e-liham. Pindutin at buhayin ang pindutan sa ibaba para makapagpadala ng isang makapagpapatotoong e-liham (kompirmasyon) patungo sa iyong adres.
+'confirmemail' => 'Patotohanan ang adres ng e-liham',
+'confirmemail_noemail' => 'Wala kang nakatakdang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan ng tagagamit]].',
+'confirmemail_text' => "Pinagagawa ng {{SITENAME}} na patotohanan mo ang iyong adres ng e-liham bago gamitin ang mga kasangkapang-katangian ng e-liham. Pindutin at buhayin ang pindutan sa ibaba para makapagpadala ng isang makapagpapatotoong e-liham (kompirmasyon) patungo sa iyong adres.
Makakasama sa liham ang isang kawing na naglalaman ng kodigo;
Ikarga ang kawing sa iyong pantingin-tingin (''browser'') para mapatotohanang katanggap-tanggap ang iyong adres ng e-liham.",
-'confirmemail_pending' => 'Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta/akawnt, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.',
-'confirmemail_send' => 'Magpadala ng isang kodigo ng pagpapatotoo (kumpirmasyon)',
-'confirmemail_sent' => 'Naipadala na ang magpapatotoong e-liham (kumpirmasyon).',
-'confirmemail_oncreate' => 'Nagpadala na ng isang kodigo ng pagpapatotoo (kumpirmasyon) patungo sa iyong adres ng e-liham. Hindi kailangan ang kodigong ito para makalagda, ngunit kailangan mong ibigay muna ito bago paganahin/paandarin ang anumang pang e-liham na kasangkapang-katangiang nasa loob ng wiki.',
-'confirmemail_sendfailed' => 'Hindi maipadala ng {{SITENAME}} ang iyong liham ng pagpapatotoo (kumpirmasyon).
+'confirmemail_pending' => 'Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta/akawnt, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.',
+'confirmemail_send' => 'Magpadala ng isang kodigo ng pagpapatotoo (kumpirmasyon)',
+'confirmemail_sent' => 'Naipadala na ang magpapatotoong e-liham (kumpirmasyon).',
+'confirmemail_oncreate' => 'Nagpadala na ng isang kodigo ng pagpapatotoo (kumpirmasyon) patungo sa iyong adres ng e-liham. Hindi kailangan ang kodigong ito para makalagda, ngunit kailangan mong ibigay muna ito bago paganahin/paandarin ang anumang pang e-liham na kasangkapang-katangiang nasa loob ng wiki.',
+'confirmemail_sendfailed' => 'Hindi maipadala ng {{SITENAME}} ang iyong liham ng pagpapatotoo (kumpirmasyon).
Pakisuri ang iyong adres ng e-liham kung may mga hindi tanggap na mga panitik/karakter.
Ibinalik ng tagapagpadala ang: $1',
-'confirmemail_invalid' => 'Hindi tamang kodigo ng kumpirmasyon. Maaaring lumagpas na sa taning ang kodigo.',
-'confirmemail_needlogin' => 'Kailangan mong $1 upang kumpirmahin/mapatotohanan ang iyong adres ng e-liham.',
-'confirmemail_success' => 'Nakumpirma/napatotohanan na ang adres ng e-liham mo. Maaari ka ng [[Special:UserLogin|lumagda]] at maglibang sa wiki.',
-'confirmemail_loggedin' => 'Nakumpirma/napatotohanan na ngayon ang adres ng e-liham mo.',
-'confirmemail_error' => 'May nangyaring kamalian sa pagsasagip ng iyong kumpirmasyon.',
-'confirmemail_subject' => 'Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}',
-'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
+'confirmemail_invalid' => 'Hindi tamang kodigo ng kumpirmasyon. Maaaring lumagpas na sa taning ang kodigo.',
+'confirmemail_needlogin' => 'Kailangan mong $1 upang kumpirmahin/mapatotohanan ang iyong adres ng e-liham.',
+'confirmemail_success' => 'Nakumpirma/napatotohanan na ang adres ng e-liham mo. Maaari ka ng [[Special:UserLogin|lumagda]] at maglibang sa wiki.',
+'confirmemail_loggedin' => 'Nakumpirma/napatotohanan na ngayon ang adres ng e-liham mo.',
+'confirmemail_error' => 'May nangyaring kamalian sa pagsasagip ng iyong kumpirmasyon.',
+'confirmemail_subject' => 'Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}',
+'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
ang nagtala ng isang akawnt/kuwentang "$2" na mayroong ganitong adres ng e-liham sa {{SITENAME}}.
Para patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin (\'\'browser\'\'):
@@ -3090,8 +3159,35 @@ para kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng adres ng
$5
Magwawakas ang pagiging mabisa ng kodigo ng pagpapatotoong ito sa $4.',
-'confirmemail_invalidated' => 'Hindi itinuloy/kinansela ang pagpapatotoo ng e-liham',
-'invalidateemail' => 'Huwag ituloy/kanselahin ang pagpapatotoo ng e-liham',
+'confirmemail_body_changed' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
+ang nagbago ng adres ng e-liham ng akawnt na "$2" sa ganitong adres sa {{SITENAME}}.
+
+Para patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhaying muli ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin:
+
+$3
+
+Kung *hindi* iyo ang akawnt, sundan mo ang kawing na ito
+para huwag nang ituloy ang pagpapatotoo ng adres ng e-liham:
+
+$5
+
+Magwawakas ang kodigo ng pagpapatotoong ito sa $4.',
+'confirmemail_body_set' => 'May isang tao, maaaring ikaw, mula sa tirahan ng IP na $1,
+ang nagtakda ng tirahan ng e-liham ng akawnt na "$2" papunta sa tirahang ito sa {{SITENAME}}.
+
+Upang tiyakin na ang akawnt na ito ay talagang sa iyo at muling buhayin
+ang mga tampok ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin:
+
+$3
+
+Kung ang akawnt ay *hindi* iyo, sundan ang kawing na ito
+upang huwag ituloy ang pagpapatunay ng tirahan ng e-liham:
+
+$5
+
+Mawawalan ng bisa ang kodigong ito ng pagpapatunay pagsapit ng $4.',
+'confirmemail_invalidated' => 'Hindi itinuloy/kinansela ang pagpapatotoo ng e-liham',
+'invalidateemail' => 'Huwag ituloy/kanselahin ang pagpapatotoo ng e-liham',
# Scary transclusion
'scarytranscludedisabled' => '[Nakapatay ang interwiki transcluding]',
@@ -3133,6 +3229,7 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
'table_pager_first' => 'Unang pahina',
'table_pager_last' => 'Huling pahina',
'table_pager_limit' => 'Ipakita ang $1 aytem bawat pahina',
+'table_pager_limit_label' => 'Mga bagay sa bawat pahina:',
'table_pager_limit_submit' => 'Punta',
'table_pager_empty' => 'Walang resulta',
@@ -3234,6 +3331,7 @@ Maaari mo ring [[Special:Watchlist/edit|gamitin ang pangkaraniwang pampatnugot]]
'version-specialpages' => 'Natatanging mga pahina',
'version-parserhooks' => "Mga pangkawit ng banghay (''parser'')",
'version-variables' => 'Mga bagay na nababago/nagbabago',
+'version-skins' => 'Mga pabalat',
'version-other' => 'Iba pa',
'version-mediahandlers' => 'Mga tagahawak/tagapamahala ng midya',
'version-hooks' => 'Mga pangkawit',
@@ -3245,6 +3343,11 @@ Maaari mo ring [[Special:Watchlist/edit|gamitin ang pangkaraniwang pampatnugot]]
'version-hook-subscribedby' => 'Sinuskribi ng/ni/nina',
'version-version' => '(Bersyon $1)',
'version-license' => 'Lisensiya',
+'version-poweredby-credits' => "Ang wiking ito ay pinapatakbo ng '''[http://www.mediawiki.org/ MediaWiki]''', karapatang-ari © 2001-$1 $2.",
+'version-poweredby-others' => 'iba pa',
+'version-license-info' => 'Ang MediaWiki ay isang malayang sopwer; maaari mo itong ipamahagi at/o baguhin ito sa ilalim ng mga patakaran ng Pangkalahatang Pangmadlang Lisensiyang GNU ayon sa pagkakalathala ng Pundasyon ng Malayang Sopwer; na maaaring bersyong 2 ng Lisensiya, o (kung nais mo) anumang susunod na bersyon.
+Ang MediaWiki ay ipinamamahagi na umaasang magiging gamitin, subaliut WALANG ANUMANG KATIYAKAN; ni walang pahiwatig ng PAGIGING MABENTA o KAANGKUPAN PARA ISANG TIYAK NA LAYUNIN. Tingnan ang Pangkalahatang Pangmadlang Lisensiyang GNU para sa mas marami pang mga detalye.
+Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangkalahatang Pangmadlang Lisensiyang GNU] kasama ang programang ito; kung hindi, sumulat sa Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html basahin ito habang nasa Internet].',
'version-software' => 'Inistalang software',
'version-software-product' => 'Produkto',
'version-software-version' => 'Bersyon',
@@ -3313,6 +3416,15 @@ Ipasok ang pangalan ng talaksan na wala ang unlaping \"{{ns:image}}:\".",
'tags-edit' => 'baguhin',
'tags-hitcount' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
+# Special:ComparePages
+'comparepages' => 'Paghambingin ang mga pahina',
+'compare-selector' => 'Paghambingin ang mga pahina ng rebisyon',
+'compare-page1' => 'Pahina 1',
+'compare-page2' => 'Pahina 2',
+'compare-rev1' => 'Rebisyon 1',
+'compare-rev2' => 'Rebisyon 2',
+'compare-submit' => 'Paghambingin',
+
# Database error messages
'dberr-header' => 'May isang suliranin ang wiking ito',
'dberr-problems' => 'Paumanhin! Dumaranas ng mga kahirapang teknikal ang sityong ito.',
@@ -3329,8 +3441,13 @@ Ipasok ang pangalan ng talaksan na wala ang unlaping \"{{ns:image}}:\".",
'htmlform-float-invalid' => 'Ang tinukoy mong halagay ay hindi isang bilang.',
'htmlform-int-toolow' => 'Ang tinukoy mong halaga ay mas mababa kaysa sa pinakamababa ng $1',
'htmlform-int-toohigh' => 'Ang tinukoy mong halaga ay mahigit kaysa pinakamataas ng $1',
+'htmlform-required' => 'Kailangan ang halagang ito',
'htmlform-submit' => 'Ipasa',
'htmlform-reset' => 'Bawiin ang mga pagbabago',
'htmlform-selectorother-other' => 'Iba pa',
+# SQLite database support
+'sqlite-has-fts' => '$1 na may suportang paghahanap ng buong teksto',
+'sqlite-no-fts' => '$1 na walang suporta ng paghahanap ng buong teksto',
+
);
diff --git a/languages/messages/MessagesTn.php b/languages/messages/MessagesTn.php
index ca78461a..e1c0e632 100644
--- a/languages/messages/MessagesTn.php
+++ b/languages/messages/MessagesTn.php
@@ -94,7 +94,7 @@ O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago
'yourname' => 'Leina la modirisi:',
'yourpassword' => 'Selotlolo sa sephiri:',
'yourpasswordagain' => 'Kwala selotlolo sa gago sa sephiri gape:',
-'remembermypassword' => 'Gakologelwa ikwadiso yame mo khompiutareng e',
+'remembermypassword' => 'Gakologelwa ikwadiso yame mo khompiutareng e (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Ikwadise',
'userlogin' => 'Ikwadise / ipulela tsebe',
'logout' => 'Tswala',
diff --git a/languages/messages/MessagesTo.php b/languages/messages/MessagesTo.php
index f00e9436..9226fb60 100644
--- a/languages/messages/MessagesTo.php
+++ b/languages/messages/MessagesTo.php
@@ -16,7 +16,7 @@ $messages = array(
# User preference toggles
'tog-underline' => 'Ngaahi fehokotaki ʻoku laineʻi ʻi lalo:',
'tog-highlightbroken' => 'Ngaohi ʻa e ngaahi fehokotaki maumau ʻoku <a href="" class="new">pehē</a> (meʻa kehe ʻoku pehē <a href="" class="internal">?</a>).',
-'tog-rememberpassword' => 'Manatuʻi ʻeku kau-ki-ai ʻi he komipiuta ʻeni',
+'tog-rememberpassword' => 'Manatuʻi ʻeku kau-ki-ai ʻi he komipiuta ʻeni (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'TÄnaki ngaahi peesi Ê»oku fakatupu Ê»e au ki he hokohoko leÊ»o',
'tog-watchdefault' => 'TÄnaki ngaahi peesi Ê»oku fatu Ê»e au ki he hokohoko leÊ»o',
'tog-watchmoves' => 'TÄnaki ki heÊ»eku hokohoko leÊ»o Ê»a e ngaahi peesi kuo Ê»unu Ê»e au',
@@ -269,7 +269,7 @@ Kuo fakatupu hoʻo tohi kau-ki-ai. ʻOua ʻe ngalo ke liliu hoʻo faʻiteliha {{
'yourname' => 'Hingoa ʻetita',
'yourpassword' => 'Leatapu',
'yourpasswordagain' => 'Toe ʻai leatapu',
-'remembermypassword' => 'Manatuʻi au',
+'remembermypassword' => 'Manatuʻi au (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'ho ngÄueÊ»anga',
'login' => 'Kau ki ai',
'nav-login-createaccount' => 'Kau ki ai',
@@ -567,7 +567,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
[[$1|thumb]]",
'fileexists-forbidden' => 'ʻOku toka ʻi ai ha peesi mo e hingoa ē, pea ʻe ʻikai lava liliu; fakamolemole ʻe foki pea hiki hake ʻa e failé ni mo e ha hingoa foʻou. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'ʻOku toka ʻi ai ha peesi mo e hingoa ē ʻi he kalasi vahevahe; fakamolemole ʻe foki pea hiki hake ʻa e failé ni mo e ha hingoa foʻou. [[File:$1|thumb|center|$1]]',
-'successfulupload' => 'Kuo ola ʻa e hiki hake',
'uploadwarning' => 'Tokanga hiki hake',
'savefile' => 'Haofaki faitaá ni',
'uploadedimage' => '"[[$1]]" ʻosi hiki hake',
@@ -578,6 +577,7 @@ Ko e ʻuhinga loka ko e $1 ia.",
'destfilename' => 'Hingoa ʻo e faile ʻe ʻalu ki ai:',
'watchthisupload' => 'Leʻo he pēsí ni',
'filewasdeleted' => 'Kuo hiki hake Ê»a e faile mo e hingoa Ê»eni pea naÊ»e tÄmateÊ»i ia. Kuo pau te ke vakai ki he $1 Ê»i muÊ»a haÊ»o feinga Ê»o toe hiki hake ia.',
+'upload-success-subj' => 'Kuo ola ʻa e hiki hake',
'license' => 'Laiseni:',
'license-header' => 'Laiseni:',
@@ -765,7 +765,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Hokohoko leʻo ʻaʻaku',
'mywatchlist' => 'Hokohoko leʻo ʻaʻaku',
-'watchlistfor' => "(maʻa e '''$1''')",
'nowatchlist' => 'ʻOku ʻikai ha meʻa ʻi hoʻo hokohoko leʻo.',
'watchlistanontext' => 'KÄtaki, Ê»e $1 kapau te ke fievakai pe fiefatu ha ngaahi meÊ»a Ê»i hoÊ»o hokohoko leÊ»o.',
'watchnologin' => 'Teʻeki kau ki ai',
diff --git a/languages/messages/MessagesTpi.php b/languages/messages/MessagesTpi.php
index c3c6a2ea..edaba022 100644
--- a/languages/messages/MessagesTpi.php
+++ b/languages/messages/MessagesTpi.php
@@ -45,8 +45,7 @@ $messages = array(
'tog-editsection' => 'Soim ol [senisim] link long wanwan hap bilong ol pes',
'tog-editsectiononrightclick' => 'Senisim ol hap bilong pes taim yu paitim nem bilong hap<br />wantaim raithan-klik (i nidim Javascript)',
'tog-showtoc' => 'Soim ol nem bilong hap insait long liklik bokis, taim igat antap long 3 hap long pes',
-'tog-rememberpassword' => 'Holim nem bilong yusa bilong mi long dispela kompiuta',
-'tog-editwidth' => 'Larim bokis bilong senisim igo bikpela olgeta',
+'tog-rememberpassword' => 'Holim nem bilong yusa bilong mi long dispela kompiuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Putim ol nupela pes mi wokim long lukautbuk',
'tog-watchdefault' => 'Putim ol pes mi senisim long lukautbuk bilong mi',
'tog-watchmoves' => 'Putim ol pes mi surikim long lukautbuk bilong mi',
@@ -152,20 +151,14 @@ $messages = array(
'qbspecialpages' => 'Ol sipesol pes',
# Vector skin
-'vector-action-delete' => 'Rausim',
-'vector-action-move' => 'Surikim',
-'vector-action-protect' => 'Tambuim',
-'vector-namespace-category' => 'Grup',
-'vector-namespace-image' => 'Fail',
-'vector-namespace-mediawiki' => 'Mesej',
-'vector-namespace-special' => 'Sipesol pes',
-'vector-namespace-talk' => 'Toktok',
-'vector-namespace-template' => 'Templet',
-'vector-view-create' => 'Kirapim',
-'vector-view-edit' => 'Senisim',
-'vector-view-history' => 'Ol senis',
-'vector-view-view' => 'Rit',
-'vector-view-viewsource' => 'Lukim as tok',
+'vector-action-delete' => 'Rausim',
+'vector-action-move' => 'Surikim',
+'vector-action-protect' => 'Tambuim',
+'vector-view-create' => 'Kirapim',
+'vector-view-edit' => 'Senisim',
+'vector-view-history' => 'Ol senis',
+'vector-view-view' => 'Rit',
+'vector-view-viewsource' => 'Lukim as tok',
'errorpagetitle' => 'Samting i kranki',
'returnto' => 'Go bek long $1',
@@ -271,14 +264,15 @@ $messages = array(
'viewsourcefor' => 'bilong $1',
# Login and logout pages
-'yourname' => 'Yusanem:',
-'yourpassword' => 'Paswot:',
-'logout' => 'Logaut',
-'userlogout' => 'Logaut',
-'gotaccountlink' => 'Log in',
-'createaccountmail' => 'Long e-mel',
-'mailmypassword' => 'E-mel nupela paswot',
-'loginlanguagelabel' => 'Tokples: $1',
+'yourname' => 'Yusanem:',
+'yourpassword' => 'Paswot:',
+'logout' => 'Logaut',
+'userlogout' => 'Logaut',
+'gotaccountlink' => 'Log in',
+'createaccountmail' => 'Long e-mel',
+'createaccountreason' => 'As bilong en:',
+'mailmypassword' => 'E-mel nupela paswot',
+'loginlanguagelabel' => 'Tokples: $1',
# Edit page toolbar
'link_sample' => 'Link taitel',
@@ -607,7 +601,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Lukautbuk bilong mi',
'mywatchlist' => 'Lukautbuk bilong mi',
-'watchlistfor' => "(bilong '''$1''')",
+'watchlistfor2' => 'Bilong $1 $2',
'nowatchlist' => 'Nogat wanpela samting istap long lukautbuk bilong yu.',
'watchlistanontext' => 'Yu mas $1 long lukim o senisim ol samting long lukautbuk bilong yu.',
'watchnologintext' => 'Yu mas [[Special:UserLogin|login]] long senisim lukautbuk bilong yu.',
@@ -845,8 +839,9 @@ Yu inap lukim as tok bilong em',
'watchlisttools-raw' => 'Senisim lukautbuk insait long wanpela bokis',
# Special:Version
-'version-other' => 'Narapela',
-'version-license' => 'Laisens',
+'version-other' => 'Narapela',
+'version-license' => 'Laisens',
+'version-poweredby-others' => 'ol narapela',
# Special:FilePath
'filepath-page' => 'Fail:',
@@ -865,6 +860,10 @@ Yu inap lukim as tok bilong em',
# Special:Tags
'tags-edit' => 'senisim',
+# Special:ComparePages
+'compare-page1' => 'Pes 1',
+'compare-page2' => 'Pes 2',
+
# HTML forms
'htmlform-selectorother-other' => 'Narapela',
diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php
index 1b999727..2707fc8a 100644
--- a/languages/messages/MessagesTr.php
+++ b/languages/messages/MessagesTr.php
@@ -19,12 +19,14 @@
* @author Karduelis
* @author Katpatuka
* @author Mach
+ * @author Manco Capac
* @author Metal Militia
* @author Mirzali
* @author Mskyrider
* @author Myildirim2007
* @author Runningfridgesrule
* @author Srhat
+ * @author Stultiwikia
* @author Suelnur
* @author Szoszv
* @author Tarikozket
@@ -71,7 +73,7 @@ $specialPageAliases = array(
'Watchlist' => array( 'Ä°zlemeListesi' ),
'Recentchanges' => array( 'SonDeÄŸiÅŸiklikler' ),
'Upload' => array( 'Yükle' ),
- 'Listfiles' => array( 'DosyaListesi' ),
+ 'Listfiles' => array( 'DosyaListesi', 'DosyaListele' ),
'Newimages' => array( 'YeniDosyalar' ),
'Listusers' => array( 'KullanıcıListesi' ),
'Listgrouprights' => array( 'GrupHaklarıListesi' ),
@@ -105,6 +107,7 @@ $specialPageAliases = array(
'Allpages' => array( 'TümSayfalar' ),
'Prefixindex' => array( 'ÖnekDizini' ),
'Ipblocklist' => array( 'IPEngelListesi' ),
+ 'Unblock' => array( 'EngeliKaldır' ),
'Specialpages' => array( 'ÖzelSayfalar' ),
'Contributions' => array( 'Katkılar' ),
'Emailuser' => array( 'E-postaGönder' ),
@@ -135,6 +138,8 @@ $specialPageAliases = array(
'Mypage' => array( 'BenimSayfam' ),
'Mytalk' => array( 'MesajSayfam' ),
'Mycontributions' => array( 'Katkılarım' ),
+ 'Myuploads' => array( 'Yüklemelerim' ),
+ 'PermanentLink' => array( 'KalıcıBağ' ),
'Listadmins' => array( 'HizmetliListesi' ),
'Listbots' => array( 'BotListesi' ),
'Popularpages' => array( 'PopülerSayfalar' ),
@@ -149,6 +154,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'SilinenKatkılar' ),
'Tags' => array( 'Etiketler' ),
'Activeusers' => array( 'AktifKullanıcılar' ),
+ 'ComparePages' => array( 'SayfaKarşılaştır' ),
+ 'Badtitle' => array( 'KötüBaşlık' ),
+ 'DisableAccount' => array( 'HesapKapat' ),
);
$magicWords = array(
@@ -159,16 +167,16 @@ $magicWords = array(
'toc' => array( '0', '__İÇİNDEKİLER__', '__TOC__' ),
'noeditsection' => array( '0', '__DEĞİŞTİRYOK__', '__NOEDITSECTION__' ),
'noheader' => array( '0', '__BAÅžLIKYOK__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MEVCUTAY1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'MEVCUTAYADI', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'MEVCUTAYKISALTMASI', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'MEVCUTGÃœN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'MEVCUTGÃœN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'MEVCUTGÃœNADI', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'MEVCUTYIL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'MEVCUTZAMAN', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'MEVCUTSAAT', 'CURRENTHOUR' ),
+ 'currentmonth' => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'GÃœNCELAY', 'GÃœNCELAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MEVCUTAY1', 'GÃœNCELAY1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'MEVCUTAYADI', 'GÃœNCELAYADI', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'MEVCUTAYKISALTMASI', 'GÃœNCELAYKISALTMASI', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'MEVCUTGÃœN', 'GÃœNCELGÃœN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'MEVCUTGÃœN2', 'GÃœNCELGÃœN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'MEVCUTGÃœNADI', 'GÃœNCELGÃœNADI', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'MEVCUTYIL', 'GÃœNCELYIL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'MEVCUTZAMAN', 'GÃœNCELZAMAN', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'MEVCUTSAAT', 'GÃœNCELSAAT', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'YERELAY', 'YERELAY2', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonth1' => array( '1', 'YERELAY1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'YERELAYADI', 'LOCALMONTHNAME' ),
@@ -191,10 +199,10 @@ $magicWords = array(
'pagenamee' => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
'namespace' => array( '1', 'Ä°SÄ°MALANI', 'NAMESPACE' ),
'namespacee' => array( '1', 'Ä°SÄ°MALANIU', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'TARTIÅžMAALANI', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'TARTIÅžMAALANIU', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'KONUALANI', 'MADDEALANI', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'KONUALANIU', 'MADDEALANIU', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'talkspace' => array( '1', 'TARTIÅžMAALANI', 'TARTIÅžMABOÅžLUÄžU', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'TARTIÅžMAALANIU', 'TARTIÅžMABOÅžLUÄžUU', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'KONUALANI', 'MADDEALANI', 'KONUBOÅžLUÄžU', 'MADDEBOÅžLUÄžU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'KONUALANIU', 'MADDEALANIU', 'KONUBOÅžLUÄžUU', 'MADDEBOÅžLUÄžUU', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
'fullpagename' => array( '1', 'TAMSAYFAADI', 'FULLPAGENAME' ),
'fullpagenamee' => array( '1', 'TAMSAYFAADIU', 'FULLPAGENAMEE' ),
'subpagename' => array( '1', 'ALTSAYFAADI', 'SUBPAGENAME' ),
@@ -206,7 +214,8 @@ $magicWords = array(
'subjectpagename' => array( '1', 'KONUSAYFASIADI', 'MADDESAYFASIADI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'KONUSAYFASIADIU', 'MADDESAYFASIADIU', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'subst' => array( '0', 'KOPYALA:', 'SUBST:' ),
+ 'subst' => array( '0', 'KOPYALA:', 'AKTAR:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'GÃœVENLÄ°AKTAR:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'MSJNW:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'küçükresim', 'küçük', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'küçükresim=$1', 'küçük=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -231,7 +240,8 @@ $magicWords = array(
'img_link' => array( '1', 'bağlantı=$1', 'link=$1' ),
'int' => array( '0', 'Ä°NT:', 'INT:' ),
'sitename' => array( '1', 'SÄ°TEADI', 'SITENAME' ),
- 'ns' => array( '0', 'Ä°A:', 'NS:' ),
+ 'ns' => array( '0', 'AA:', 'AB:', 'NS:' ),
+ 'nse' => array( '0', 'AAU:', 'ABU:', 'NSE:' ),
'localurl' => array( '0', 'YERELURL:', 'LOCALURL:' ),
'localurle' => array( '0', 'YERELURLU:', 'LOCALURLE:' ),
'server' => array( '0', 'SUNUCU', 'SERVER' ),
@@ -242,8 +252,8 @@ $magicWords = array(
'gender' => array( '0', 'CÄ°NSÄ°YET:', 'GENDER:' ),
'notitleconvert' => array( '0', '__BAŞLIKDÖNÜŞÜMÜYOK__', '__BDY__', '__NOTITLECONVERT__', '__NOTC__' ),
'nocontentconvert' => array( '0', '__İÇERİKDÖNÜŞÜMÜYOK__', '__İDY__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'MEVCUTHAFTA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'MEVCUTHAFTANINGÜNÜ', 'CURRENTDOW' ),
+ 'currentweek' => array( '1', 'MEVCUTHAFTA', 'GÃœNCELHAFTA', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'MEVCUTHAFTANINGÜNÜ', 'GÜNCELHAFTANINGÜNÜ', 'CURRENTDOW' ),
'localweek' => array( '1', 'YERELHAFTA', 'LOCALWEEK' ),
'localdow' => array( '1', 'YERELHAFTANINGÜNÜ', 'LOCALDOW' ),
'revisionid' => array( '1', 'SÃœRÃœMNO', 'REVISIONID' ),
@@ -264,8 +274,8 @@ $magicWords = array(
'displaytitle' => array( '1', 'BAŞLIKGÖSTER', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISI__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISIYOK__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'MEVCUTSÃœRÃœM', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'MEVCUTZAMANBÄ°LGÄ°SÄ°', 'CURRENTTIMESTAMP' ),
+ 'currentversion' => array( '1', 'MEVCUTSÃœRÃœM', 'GÃœNCELSÃœRÃœM', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'MEVCUTZAMANBÄ°LGÄ°SÄ°', 'GÃœNCELZAMANBÄ°LGÄ°SÄ°', 'CURRENTTIMESTAMP' ),
'localtimestamp' => array( '1', 'YERELZAMANBÄ°LGÄ°SÄ°', 'LOCALTIMESTAMP' ),
'language' => array( '0', '#DÄ°L:', '#LÄ°SAN:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'İÇERİKDİLİ', 'İÇERİKLİSANI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
@@ -273,7 +283,7 @@ $magicWords = array(
'numberofadmins' => array( '1', 'HÄ°ZMETLÄ°SAYISI', 'NUMBEROFADMINS' ),
'special' => array( '0', 'özel', 'special' ),
'defaultsort' => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORÄ°SIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'DOSYA YOLU:', 'FILEPATH:' ),
+ 'filepath' => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
'tag' => array( '0', 'etiket', 'tag' ),
'hiddencat' => array( '1', '__GÄ°ZLÄ°KAT__', '__GÄ°ZLÄ°KATEGORÄ°__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'KATEGORÄ°DEKÄ°SAYFALAR', 'KATTAKÄ°SAYFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
@@ -286,7 +296,7 @@ $magicWords = array(
'formatdate' => array( '0', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
);
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zÇĞçğİıÖöŞşÜüÂâÎîÛû]+)(.*)$/sDu';
$messages = array(
@@ -305,8 +315,7 @@ $messages = array(
'tog-editsection' => 'Bölümleri [değiştir] bağlantıları ile değiştirebilme olanağı ver',
'tog-editsectiononrightclick' => 'Bölümleri bölüm başlığına sağ tıklayarak değiştirebilme olanağı ver (JavaScript)',
'tog-showtoc' => 'İçindekiler tablosunu göster (3 taneden fazla başlığı olan sayfalar için)',
-'tog-rememberpassword' => 'Parolayı hatırla',
-'tog-editwidth' => 'Yazma alanını tüm ekranı dolduracak şekilde genişlet',
+'tog-rememberpassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
'tog-watchcreations' => 'Oluşturmuş olduğum sayfaları izleme listeme ekle',
'tog-watchdefault' => 'Değişiklik yapılan sayfayı izleme listesine ekle',
'tog-watchmoves' => 'Taşıdığım sayfaları izleme listeme ekle',
@@ -361,8 +370,8 @@ $messages = array(
'sun' => 'Paz',
'mon' => 'Pzt',
'tue' => 'Sal',
-'wed' => 'Çar',
-'thu' => 'Per',
+'wed' => 'Çrş',
+'thu' => 'PrÅŸ',
'fri' => 'Cum',
'sat' => 'Cts',
'january' => 'Ocak',
@@ -403,18 +412,18 @@ $messages = array(
'dec' => 'Ara',
# Categories related messages
-'pagecategories' => 'Sayfa {{PLURAL:$1|kategorisi|kategorileri}}',
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
'category_header' => '"$1" kategorisindeki sayfalar',
-'subcategories' => 'Alt Kategoriler',
+'subcategories' => 'Alt kategoriler',
'category-media-header' => '"$1" kategorisindeki medya',
'category-empty' => "''Bu kategoride henüz herhangi bir madde ya da medya bulunmamaktadır.''",
'hidden-categories' => '{{PLURAL:$1|Gizli kategori|Gizli kategoriler}}',
'hidden-category-category' => 'Gizli kategoriler',
-'category-subcat-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategori toplam $2 kategoriden {{PLURAL:$1|alt kategori|$1 alt kategori}}ye sahiptir}}',
+'category-subcat-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki {{PLURAL:$1|alt kategori|$1 alt kategori}} dahil $2 alt kategori vardır.}}',
'category-subcat-count-limited' => 'Bu kategori aşağıdaki {{PLURAL:$1|alt kategoriye|$1 alt kategoriye}} sahiptir.',
-'category-article-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki sayfayı içermektedir.|Toplam $2 den, aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} bu kategoridedir.}}',
+'category-article-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki sayfayı içermektedir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} bu kategoridedir.}}',
'category-article-count-limited' => 'Aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} mevcut kategoridedir.',
-'category-file-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki dosyayı içerir.|Toplam $2 den, aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.}}',
+'category-file-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki dosyayı içerir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.}}',
'category-file-count-limited' => 'Aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} mevcut kategoridedir.',
'listingcontinuesabbrev' => '(devam)',
'index-category' => 'Dizinli sayfalar',
@@ -436,7 +445,7 @@ $messages = array(
'mypage' => 'sayfam',
'mytalk' => 'Mesaj sayfam',
'anontalk' => "Bu IP'nin iletileri",
-'navigation' => 'gezinti',
+'navigation' => 'Gezinti',
'and' => '&#32;ve',
# Cologne Blue skin
@@ -451,31 +460,21 @@ $messages = array(
'faqpage' => 'Project:SSS',
# Vector skin
-'vector-action-addsection' => 'Konu ekle',
-'vector-action-delete' => 'Sil',
-'vector-action-move' => 'Taşı',
-'vector-action-protect' => 'Koru',
-'vector-action-undelete' => 'Silinmeyi geri al',
-'vector-action-unprotect' => 'Korumayı kaldır',
-'vector-namespace-category' => 'Kategori',
-'vector-namespace-help' => 'Yardım sayfası',
-'vector-namespace-image' => 'Dosya',
-'vector-namespace-main' => 'Sayfa',
-'vector-namespace-media' => 'Ortam sayfası',
-'vector-namespace-mediawiki' => 'Ä°leti',
-'vector-namespace-project' => 'Proje sayfası',
-'vector-namespace-special' => 'Özel sayfa',
-'vector-namespace-talk' => 'Tartışma',
-'vector-namespace-template' => 'Åžablon',
-'vector-namespace-user' => 'Kullanıcı sayfası',
-'vector-view-create' => 'OluÅŸtur',
-'vector-view-edit' => 'Düzenle',
-'vector-view-history' => 'Geçmişi gör',
-'vector-view-view' => 'Oku',
-'vector-view-viewsource' => 'Kaynağı gör',
-'actions' => 'Eylemler',
-'namespaces' => 'İsim alanları',
-'variants' => 'Türevler',
+'vector-action-addsection' => 'Konu ekle',
+'vector-action-delete' => 'Sil',
+'vector-action-move' => 'Taşı',
+'vector-action-protect' => 'Koru',
+'vector-action-undelete' => 'Silinmeyi geri al',
+'vector-action-unprotect' => 'Korumayı kaldır',
+'vector-simplesearch-preference' => 'Gelişmiş arama önerilerini getir (Sadece Vector görünümü için)',
+'vector-view-create' => 'OluÅŸtur',
+'vector-view-edit' => 'Düzenle',
+'vector-view-history' => 'Geçmişi gör',
+'vector-view-view' => 'Oku',
+'vector-view-viewsource' => 'Kaynağı gör',
+'actions' => 'Eylemler',
+'namespaces' => 'Ad alanları',
+'variants' => 'Türevler',
'errorpagetitle' => 'Hata',
'returnto' => '$1 sayfasına dön.',
@@ -485,12 +484,12 @@ $messages = array(
'searchbutton' => 'Ara',
'go' => 'Git',
'searcharticle' => 'Git',
-'history' => 'Sayfanın geçmişi',
+'history' => 'Sayfa geçmişi',
'history_short' => 'Geçmiş',
'updatedmarker' => 'son ziyaretimden sonra güncellenmiş',
'info_short' => 'Bilgi',
'printableversion' => 'Yazdırılabilir sürüm',
-'permalink' => 'Bu hâline bağlantı',
+'permalink' => 'Kalıcı bağlantı',
'print' => 'Bastır',
'edit' => 'Düzenle',
'create' => 'OluÅŸtur',
@@ -500,7 +499,7 @@ $messages = array(
'deletethispage' => 'Bu sayfayı sil',
'undelete_short' => '$1 deÄŸiÅŸikliÄŸi geri getir',
'protect' => 'Korumaya al',
-'protect_change' => 'DeÄŸiÅŸtir',
+'protect_change' => 'deÄŸiÅŸtir',
'protectthispage' => 'Sayfayı koruma altına al',
'unprotect' => 'Korumayı kaldır',
'unprotectthispage' => 'Sayfa korumasını kaldır',
@@ -522,13 +521,13 @@ $messages = array(
'viewhelppage' => 'Yardım sayfasına bak',
'categorypage' => 'Kategori sayfasını göster',
'viewtalkpage' => 'Tartışma sayfasına git',
-'otherlanguages' => 'DiÄŸer diller',
+'otherlanguages' => 'DiÄŸer dillerde',
'redirectedfrom' => '($1 sayfasından yönlendirildi)',
'redirectpagesub' => 'Yönlendirme sayfası',
'lastmodifiedat' => 'Bu sayfa son olarak $2, $1 tarihinde güncellenmiştir.',
'viewcount' => 'Bu sayfaya {{PLURAL:$1|bir|$1 }} defa eriÅŸilmiÅŸ.',
'protectedpage' => 'Korumalı sayfa',
-'jumpto' => 'Git ve:',
+'jumpto' => 'Atla:',
'jumptonavigation' => 'kullan',
'jumptosearch' => 'ara',
'view-pool-error' => 'Üzgünüz, sunucular şu anda aşırı yüklendi.
@@ -536,6 +535,9 @@ Birçok kullanıcı bu sayfayı görüntülemeye çalışıyor.
Lütfen bu sayfaya tekrar erişmeyi denemeden önce biraz bekleyin.
$1',
+'pool-timeout' => 'Kilit için zaman bitimi bekleniyor',
+'pool-queuefull' => 'Havuz sırası dolu',
+'pool-errorunknown' => 'Bilinmeyen hata',
# 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}} hakkında',
@@ -545,7 +547,7 @@ $1',
'currentevents' => 'Güncel olaylar',
'currentevents-url' => 'Project:Güncel olaylar',
'disclaimers' => 'Sorumluluk reddi',
-'disclaimerpage' => 'Project:Genel_sorumluluk_reddi',
+'disclaimerpage' => 'Project:Genel sorumluluk reddi',
'edithelp' => 'Nasıl değiştirilir?',
'edithelppage' => 'Help:Sayfa nasıl değiştirilir',
'helppage' => 'Help:İçindekiler',
@@ -571,7 +573,7 @@ $1',
'newmessagesdifflink' => 'son deÄŸiÅŸiklik',
'youhavenewmessagesmulti' => "$1'de yeni mesajınız var.",
'editsection' => 'düzenle',
-'editold' => 'DeÄŸiÅŸtir',
+'editold' => 'deÄŸiÅŸtir',
'viewsourceold' => 'kaynağı gör',
'editlink' => 'deÄŸiÅŸtir',
'viewsourcelink' => 'kaynağı gör',
@@ -586,13 +588,13 @@ $1',
'feed-invalid' => 'Hatalı besleme tipi.',
'feed-unavailable' => 'Sendikalaşma özet akışları geçerli değil.',
'site-rss-feed' => '$1 RSS AboneliÄŸi',
-'site-atom-feed' => '$1 Atom Beslemesi',
+'site-atom-feed' => '$1 Atom beslemesi',
'page-rss-feed' => '"$1" RSS Beslemesi',
-'page-atom-feed' => '"$1" Atom Beslemesi',
+'page-atom-feed' => '"$1" Atom beslemesi',
'red-link-title' => '$1 (sayfa mevcut deÄŸil)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Sayfa',
+'nstab-main' => 'Madde',
'nstab-user' => 'Kullanıcı sayfası',
'nstab-media' => 'Medya sayfası',
'nstab-special' => 'Özel sayfa',
@@ -630,12 +632,12 @@ Veritabanının verdiği hata mesajı "$3: $4"',
'readonlytext' => 'Veritabanı olağan bakım/onarım çalışmaları sebebiyle, geçici olarak giriş ve değişiklik yapmaya kapatılmıştır. Kısa süre sonra normale dönecektir.
Veritabanını kilitleyen operatörün açıklaması: $1',
-'missing-article' => 'Veritabanı, bulunması istenen "$1" $2 isimli sayfaya ait metni bulamadı.
+'missing-article' => 'Veritabanında bulunması istenen "$1" $2 adlı sayfaya ait metin bulunamadı.
-Bu durum sayfanın, silinmiş bir sayfanın geçmiş sürümü olmasından kaynaklanabilir.
+Bu durum, genellikle silinmiş bir sayfanın geçmiş bir sürümüne yönlendirilmekten kaynaklanır.
-Eğer neden bu değilse, yazılımda bir hata ile karşılaşmış olabilirsiniz
-Lütfen bunu bir [[Special:ListUsers/sysop|hizmetliye]], URL\'yi not ederek iletin',
+Eğer neden bu değilse yazılımda bir hata ile karşılaşmış olabilirsiniz.
+Lütfen URL\'yi not ederek bunu bir [[Special:ListUsers/sysop|hizmetliye]] iletin.',
'missingarticle-rev' => '(revizyon#: $1)',
'missingarticle-diff' => '(Fark: $1, $2)',
'readonly_lag' => 'Yedek sunucular ana sunucu ile güncellemeye çalışırken veritabanı otomatik olarak kilitlendi.',
@@ -655,7 +657,7 @@ Lütfen bunu bir [[Special:ListUsers/sysop|hizmetliye]], URL\'yi not ederek ilet
'cannotdelete' => '"$1" sayfa ya da dosyası silinemedi.
Başka bir kullanıcı tarafından silinmiş olabilir.',
'badtitle' => 'Geçersiz başlık',
-'badtitletext' => 'Girilen sayfa ismi ya hatalı ya boş ya da diller arası bağlantı veya 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.',
+'badtitletext' => 'Girilen sayfa adı ya hatalı ya boş ya da diller arası bağlantı veya 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.',
'perfcached' => 'Veriler daha önceden hazırlanmış olabilir. Bu sebeple güncel olmayabilir!',
'perfcachedts' => 'Aşağıda saklanmış bilgiler bulunmaktadır, son güncelleme tarihi: $1.',
'querypage-no-updates' => 'Şu an için güncellemeler devre dışı bırakıldı. Buradaki veri hemen yenilenmeyecektir.',
@@ -694,26 +696,28 @@ Web tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hala
Hesabınız açıldı.
[[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
-'yourname' => 'Kullanıcı adınız:',
+'yourname' => 'Kullanıcı adı:',
'yourpassword' => 'Parola:',
-'yourpasswordagain' => 'Parolayı yeniden yaz',
-'remembermypassword' => 'Parolayı hatırla.',
+'yourpasswordagain' => 'Parolayı yeniden yaz:',
+'remembermypassword' => 'Girişimi bu bilgisayarda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
+'securelogin-stick-https' => "Giriş yaptıktan sonra HTTPS'e bağlı kal",
'yourdomainname' => 'Alan adınız',
'externaldberror' => 'Ya doğrulama veritabanı hatası var ya da kullanıcı hesabınızı güncellemeye yetkiniz yok.',
'login' => 'Oturum aç',
-'nav-login-createaccount' => 'Oturum aç ya da yeni hesap edin',
+'nav-login-createaccount' => 'Oturum aç / yeni hesap oluştur',
'loginprompt' => '{{SITENAME}} sitesinde oturum açabilmek için çerezleri etkinleştirmeniz gerekmektedir.',
-'userlogin' => 'Oturum aç',
+'userlogin' => 'Oturum aç / hesap oluştur',
'userloginnocreate' => 'GiriÅŸ yap',
'logout' => 'Oturumu kapat',
'userlogout' => 'Oturumu kapat',
'notloggedin' => 'Oturum açık değil',
-'nologin' => "Daha üye değil misiniz? '''$1'''",
-'nologinlink' => 'Eğer şimdiye kadar kayıt olmadıysanız bu bağlantıyı takip edin.',
-'createaccount' => 'Yeni hesap aç',
-'gotaccount' => "Daha önceden kayıt oldunuz mu? '''$1'''.",
-'gotaccountlink' => 'Eğer önceden hesap açtırdıysanız bu bağlantıdan giriş yapınız.',
+'nologin' => "Kayıtlı değil misiniz? '''$1'''",
+'nologinlink' => 'Hesap oluÅŸturun',
+'createaccount' => 'Hesap oluÅŸtur',
+'gotaccount' => "Çoktan kayıt oldunuz mu? '''$1'''.",
+'gotaccountlink' => 'Oturum açın',
'createaccountmail' => 'e-posta ile',
+'createaccountreason' => 'Sebep:',
'badretype' => 'GirdiÄŸiniz ÅŸifreler birbirleriyle uyuÅŸmuyor.',
'userexists' => 'Girdiğiniz kullanıcı adı kullanımda. Lütfen farklı bir kullanıcı adı seçin.',
'loginerror' => 'Oturum açma hatası.',
@@ -736,6 +740,7 @@ Yazılışı kontrol edin veya [[Special:UserLogin/signup|yeni bir hesap açın]
'wrongpasswordempty' => 'Boş parola girdiniz. Lütfen tekrar deneyiniz.',
'passwordtooshort' => 'Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.',
'password-name-match' => 'Şifreniz kullanıcı adınızdan farklı olmalıdır.',
+'password-login-forbidden' => 'Bu kullanıcı adı ve şifre kullanımı yasaklanmıştır',
'mailmypassword' => 'Bana e-posta ile yeni parola gönder',
'passwordremindertitle' => '{{SITENAME}} için yeni geçici şifre',
'passwordremindertext' => 'Birisi (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. "$2" kullanıcısına geçici olarak "$3" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.
@@ -773,6 +778,9 @@ Lütfen tekrar denemeden önce bekleyin.',
'loginlanguagelabel' => 'Dil: $1',
'suspicious-userlogout' => 'Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.',
+# E-mail sending
+'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
+
# Password reset dialog
'resetpass' => 'Parolayı değiştir',
'resetpass_announce' => 'Size gönderilen muvakkat bir parola ile oturum açtınız.
@@ -796,40 +804,42 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
# Edit page toolbar
'bold_sample' => 'Kalın yazı',
'bold_tip' => 'Kalın yazı',
-'italic_sample' => 'İtalik yazı',
-'italic_tip' => 'İtalik yazı',
+'italic_sample' => 'Eğik yazı',
+'italic_tip' => 'Eğik yazı',
'link_sample' => 'Bağlantı başlığı',
'link_tip' => 'İç bağlantı',
'extlink_sample' => 'http://www.example.com adres açıklaması',
'extlink_tip' => 'Dış bağlantı (Adresin önüne http:// koymayı unutmayın)',
-'headline_sample' => 'Başlık yazısı',
+'headline_sample' => 'Başlık metni',
'headline_tip' => '2. seviye başlık',
'math_sample' => 'Matematiksel-ifadeyi-girin',
'math_tip' => 'Matematik formülü (LaTeX formatında)',
-'nowiki_sample' => 'Serbest format yazınızı buraya yazınız',
-'nowiki_tip' => 'wiki formatlamasını devre dışı bırak',
+'nowiki_sample' => 'Biçimlendirilmeyecek metni buraya girin',
+'nowiki_tip' => 'viki formatlamasını devre dışı bırak',
'image_sample' => 'Örnek.jpg',
'image_tip' => 'Gömülü dosya',
'media_sample' => 'Örnek.ogg',
-'media_tip' => 'Medya dosyasına bağlantı',
-'sig_tip' => 'İmzanız ve tarih',
+'media_tip' => 'Dosya bağlantısı',
+'sig_tip' => 'İmzanız ve zaman',
'hr_tip' => 'Yatay çizgi (çok sık kullanmayın)',
# Edit pages
'summary' => 'Özet:',
'subject' => 'Konu/başlık:',
'minoredit' => 'Küçük değişiklik',
-'watchthis' => 'Sayfayı izle',
+'watchthis' => 'Bu sayfayı izle',
'savearticle' => 'Sayfayı kaydet',
-'preview' => 'Ön izleme',
-'showpreview' => 'Ön izlemeyi göster',
+'preview' => 'Önizleme',
+'showpreview' => 'Önizlemeyi göster',
'showlivepreview' => 'Canlı ön izleme',
'showdiff' => 'Değişiklikleri göster',
-'anoneditwarning' => 'Oturum açmadığınızdan maddenin değişiklik kayıtlarına rumuzunuz yerine IP adresiniz kaydedilecektir.',
+'anoneditwarning' => "'''Uyarı:''' Oturum açmadınız.
+IP adresiniz sayfanın değişiklik geçmişine kaydedilecektir.",
+'anonpreviewwarning' => "''Giriş yapmadınız. Kaydederseniz, sayfanın değişiklik geçmişine IP adresiniz yazılır.''",
'missingsummary' => "'''Uyarı:''' Herhangi bir özet yazmadın.
Kaydet tuşuna tekrar basarsan sayfa özetsiz kaydedilecek.",
'missingcommenttext' => 'Lütfen aşağıda bir açıklama yazınız.',
-'missingcommentheader' => "'''Hatırlatıcı:''' Bu yorum için konu/başlık sunmadınız. Eğer tekrar Kaydet tuşuna basarsanız, değişikliğiniz konu/başlık olmadan kaydedilecektir.",
+'missingcommentheader' => "'''Hatırlatma''' Bu yorum için bir konu/başlık sunmadınız. Eğer \"((int: savearticle))\" tuşuna tekrar basarsanız, değişikliğiniz konu/başlık olmadan kaydedilecektir.",
'summary-preview' => 'Ön izleme özeti:',
'subject-preview' => 'Konu/Başlık ön izlemesi:',
'blockedtitle' => 'Kullanıcı erişimi engellendi.',
@@ -877,15 +887,17 @@ Siz sayfayı görüntülerken taşınmış veya silinmiş olabilir.',
Bu yeni hesap için parola, giriş yapıldıktan sonra ''[[Special:ChangePassword|parolayı değiştir]]'' bölümünde değiştirilebilir.",
'newarticle' => '(Yeni)',
-'newarticletext' => "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız. Bu sayfayı oluşturmak için aşağıdaki metin kutusunu kullanınız. Bilgi için [[{{MediaWiki:Helppage}}|yardım sayfasına]] bakınız. Buraya yanlışlıkla geldiyseniz, programınızın '''Geri''' tuşuna tıklayınız.",
+'newarticletext' => "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız.
+Sayfayı oluşturmak için aşağıdaki metin kutusunu kullanın. ([[{{MediaWiki:Helppage}}|yardım sayfasına]] bakınız).
+Buraya yanlışlıkla geldiyseniz tarayıcınızın '''geri''' tuşuna tıklayın.",
'anontalkpagetext' => "----''Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının ileti sayfasıdır. Bu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız. Bu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir. Eğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:UserLogin/signup|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].''",
'noarticletext' => 'Bu sayfa ÅŸu anda boÅŸtur.
-Bu başlığı diğer sayfalarda [[Special:Search/{{PAGENAME}}|arayabilir]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili günlükleri arayabilir],
+Bu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],
ya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} değiştirebilirsiniz]</span>.',
'noarticletext-nopermission' => 'Bu sayfa ÅŸu anda boÅŸtur.
Bu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]]
-ya da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili günlükleri tarayabilirsiniz].</span>',
+ya da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz].</span>',
'userpage-userdoesnotexist' => '"$1" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.',
'userpage-userdoesnotexist-view' => '"$1" kullanıcı hesabı kayıtlı değil.',
'blocked-notice-logextract' => 'Bu kullanıcı şuanda engellenmiş.
@@ -895,7 +907,11 @@ Son engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:',
'userjsyoucanpreview' => "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni JavaScript'inizi test edin.",
'usercsspreview' => "'''Sadece kullanıcı CSS dosyanızın önizlemesini görüyorsun.''' '''Kullanıcı CSS dosyası henüz kaydolmadı!'''",
'userjspreview' => "'''Sadece test ediyorsun ya da önizleme görüyorsun - kullanıcı JavaScript'i henüz kaydolmadı.'''",
-'userinvalidcssjstitle' => "''Uyarı:''' \"\$1\" adıyla bir tema yoktur. tema-adı.css ve .js dosyalarının adları küçük harf ile yazması gerek, yani {{ns:user}}:Temel/'''M'''onobook.css değil, {{ns:user}}:Temel/'''m'''onobook.css.",
+'sitecsspreview' => "'''Sadece kullanıcı CSS dosyanızın önizlemesini görüyorsunuz.'''
+'''Henüz kaydedilmedi!'''",
+'sitejspreview' => "'''Sadece kullanıcı JavaScript kod dosyanızın önizlemesini görüyorsunuz.'''
+'''Henüz kaydedilmedi!'''",
+'userinvalidcssjstitle' => "''Uyarı:''' \"\$1\" adıyla bir tema yoktur. tema-adı.css ve .js dosyalarının adları küçük harf ile yazması gerek, yani {{ns:user}}:Temel/'''V'''ector.css değil, {{ns:user}}:Temel/'''v'''ector.css.",
'updated' => '(Güncellendi)',
'note' => "'''Not: '''",
'previewnote' => "'''Bu yalnızca bir önizlemedir, ve değişiklikleriniz henüz kaydedilmemiştir!'''",
@@ -931,7 +947,6 @@ Ayrıca, buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldı
'''<center>TELİF HAKKI İLE KORUNAN HİÇBİR ÇALIŞMAYI BURAYA EKLEMEYİNİZ!</center>'''",
'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).',
-'longpagewarning' => "'''UYARI: Bu sayfa $1 kilobayt büyüklüğündedir; bazı tarayıcılar değişiklik yaparken 32 kb ve üstü büyüklüklerde sorunlar yaşayabilir. Sayfayı bölümlere ayırmaya çalışın.'''",
'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu $1 kilobayt, ve en fazla uzunluktan $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'''
@@ -947,8 +962,8 @@ Son günlük girdisi referans amaçlı aşağıda verilmiştir:",
'templatesused' => 'Bu sayfada kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
'templatesusedpreview' => 'Bu önizlemede kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
'templatesusedsection' => 'Bu bölümde kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
-'template-protected' => '(koruma)',
-'template-semiprotected' => '(yarı-koruma)',
+'template-protected' => '(korumada)',
+'template-semiprotected' => '(yarı-korumada)',
'hiddencategories' => 'Bu sayfa {{PLURAL:$1|1 gizli kategoriye|$1 gizli kategoriye}} mensuptur:',
'nocreatetitle' => 'Sayfa oluşturulması sınırlandı',
'nocreatetext' => '{{SITENAME}}, yeni sayfa oluÅŸturulabilmesini engelledi.
@@ -962,9 +977,9 @@ Geri giderek varolan sayfayı değiştirebilirsiniz ya da kayıtlı iseniz [[Spe
'recreate-moveddeleted-warn' => "'''Uyarı: Daha önceden silinmiş bir sayfayı tekrar oluşturuyorsunuz.'''
Sayfayı değiştirmeye devam etmenin uygun olup olmadığını düşünmelisiniz.
-Sayfanın silme ve taşıma günlüğü uygunluk için burada verilmiştir:",
+Sayfanın silme ve taşıma kaydı kolaylık için burada verilmiştir:",
'moveddeleted-notice' => 'Bu sayfa silinmiÅŸ.
-Sayfanın silme ve taşıma günlüğü referans için aşağıda verilmiştir.',
+Sayfanın silme ve taşıma kaydı referans için aşağıda verilmiştir.',
'log-fulllog' => 'Tam günlüğü gör',
'edit-hook-aborted' => 'Değişiklik çengelle durduruldu.
Bir açıklama verilmedi.',
@@ -980,11 +995,11 @@ Sayfa zaten mevcut.',
Bu $2 çağrıdan az olmalı, şu anda {{PLURAL:$1|1 çağrı var|$1 çağrı var}}.',
'expensive-parserfunction-category' => 'Çok fazla zengin derleyici fonksiyonu çağrısına sahip sayfalar',
-'post-expand-template-inclusion-warning' => 'Uyarı: Katılan şablon içeriği çok geniş.
-Bazı şablonlar sayfaya katılmayacak.',
-'post-expand-template-inclusion-category' => 'Şablon içerik genişliği sınırı aşılan sayfalar',
-'post-expand-template-argument-warning' => 'Uyarı: Bu sayfa çok fazla genişleme boyutuna sahip bir şablon değişkeninden en az bir tane içeriyor.
-Bu değişkenler atlandı.',
+'post-expand-template-inclusion-warning' => "'''Uyarı''': Şablon içeriği çok büyük.
+Bazı şablonlar eklenemeyecek.",
+'post-expand-template-inclusion-category' => 'Şablon içerme büyüklüğü sınırı aşılan sayfalar',
+'post-expand-template-argument-warning' => "'''Uyarı:''' Bu sayfa çok fazla genişleme boyutuna sahip en az bir şablon değişkeni içeriyor.
+Bu değişkenler atlandı.",
'post-expand-template-argument-category' => 'Geçersiz şablon değiştirgenleri içeren sayfalar',
'parser-template-loop-warning' => 'Şablon düğümü tespit edildi: [[$1]]',
'parser-template-recursion-depth-warning' => 'Şablon özyineleme yoğunluğu sınırı aşıldı ($1)',
@@ -1006,10 +1021,10 @@ $3 tarafından verilen sebep ''$2''",
'viewpagelogs' => 'Bu sayfa ile ilgili kayıtları göster',
'nohistory' => 'Bu sayfanın geçmiş sürümü yok.',
'currentrev' => 'Güncel sürüm',
-'currentrev-asof' => '$1 itibarı ile sayfanın şu anki hâli.',
-'revisionasof' => 'Sayfanın $1 tarihindeki hâli',
+'currentrev-asof' => '$1 itibarı ile sayfanın şu anki hâli',
+'revisionasof' => '$1 tarihindeki hâli',
'revision-info' => '$2 tarafından oluşturulmuş $1 tarihli sürüm',
-'previousrevision' => '↠Önceki hali',
+'previousrevision' => '↠Önceki hâli',
'nextrevision' => 'Sonraki hali →',
'currentrevisionlink' => 'en güncel halini göster',
'cur' => 'fark',
@@ -1017,9 +1032,8 @@ $3 tarafından verilen sebep ''$2''",
'last' => 'son',
'page_first' => 'ilk',
'page_last' => 'son',
-'histlegend' => "Fark seçimi: karşılaştırmayı istediğiniz 2 sürümün önündeki dairelere tıklayıp, enter'a basın ya da sayfanın en altında bulunan düğmeye basın.<br />
-Tanımlar: '''({{int:cur}})''' = güncel sürümle aradaki fark,
-'''({{int:last}})''' = bir önceki sürümle aradaki fark, '''{{int:minoreditletter}}''' = küçük değişiklik.",
+'histlegend' => "Fark seçimi: karşılaştırmayı istediğiniz 2 sürümün önündeki daireleri işaretleyip, enter'a ya da sayfanın en altında bulunan düğmeye basın.<br />
+Tanımlar: '''({{int:cur}})''' = güncel sürümle aradaki fark, '''({{int:last}})''' = bir önceki sürümle aradaki fark, '''{{int:minoreditletter}}''' = küçük değişiklik.",
'history-fieldset-title' => 'Geçmişe gözat',
'history-show-deleted' => 'Sadece silinenler',
'histfirst' => 'En eski',
@@ -1107,7 +1121,9 @@ $1",
'logdelete-success' => "'''Günlük görünürlüğü başarıyla ayarlandı.'''",
'logdelete-failure' => "'''Günlük görünürlüğü ayarlanamadı:'''
$1",
-'revdel-restore' => 'Görünürlüğü değiştir',
+'revdel-restore' => 'görünürlüğü değiştir',
+'revdel-restore-deleted' => 'silinmiÅŸ revizyonlar',
+'revdel-restore-visible' => 'görünür revizyonlar',
'pagehist' => 'Sayfa geçmişi',
'deletedhist' => 'Silinmiş geçmiş',
'revdelete-content' => 'içerik',
@@ -1177,11 +1193,13 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
# Diffs
'history-title' => '"$1" sayfasının geçmişi',
'difference' => '(Sürümler arası farklar)',
+'difference-multipage' => '(Sayfalar arasındaki fark)',
'lineno' => '$1. satır:',
'compareselectedversions' => 'Seçilen sürümleri karşılaştır',
'showhideselectedversions' => 'Seçili sürümleri göster/gizle',
'editundo' => 'geri al',
-'diff-multi' => '(Gösterilmeyen {{PLURAL:$1|$1 ara değişiklik|$1 ara değişiklik}} bulunmaktadır.)',
+'diff-multi' => '({{PLURAL:$2|Bir kullanıcı|$2 kullanıcı}} tarafından yapılan {{PLURAL:$1|bir ara revizyon|$1 ara revizyon}} gösterilmiyor)',
+'diff-multi-manyusers' => '($2 kullancıdan fazla {{PLURAL:$2|kullanıcı|kullanıcı}} tarafından yapılan {{PLURAL:$1|bir ara revizyon|$1 ara revizyon}} gösterilmiyor)',
# Search results
'searchresults' => 'Arama sonuçları',
@@ -1212,13 +1230,14 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
'searchprofile-advanced' => 'GeliÅŸmiÅŸ',
'searchprofile-articles-tooltip' => '$1 içinde ara',
'searchprofile-project-tooltip' => '$1 içinde ara',
-'searchprofile-images-tooltip' => 'Dosyalar için ara',
-'searchprofile-everything-tooltip' => 'Tüm içeriği ara (tartışma sayfaları dahil)',
+'searchprofile-images-tooltip' => 'Dosya ara',
+'searchprofile-everything-tooltip' => 'Tüm içerikte ara (tartışma sayfaları dahil)',
'searchprofile-advanced-tooltip' => 'Özel ad alanlarında ara',
'search-result-size' => '$1 ({{PLURAL:$2|1 kelime|$2 kelime}})',
+'search-result-category-size' => '{{PLURAL:$1|1 üye|$1 üye}} ({{PLURAL:$2|1 altkategori|$2 altkategori}}, {{PLURAL:$3|1 dosya|$3 dosya}})',
'search-result-score' => 'Uygunluk: $1%',
-'search-redirect' => '(yönlendirme $1)',
-'search-section' => '(bölüm $1)',
+'search-redirect' => '($1 sayfasından yönlendirme)',
+'search-section' => '($1 bölümü)',
'search-suggest' => 'Bunu mu demek istediniz: $1',
'search-interwiki-caption' => 'KardeÅŸ projeler',
'search-interwiki-default' => '$1 sonuçlar:',
@@ -1291,6 +1310,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
'contextlines' => 'Bulunan madde için ayrılan satır sayısı',
'contextchars' => 'Satırdaki karakter sayısı',
'stub-threshold' => '<a href="#" class="stub">Taslak bağlantısı</a> formatı için baraj (bayt):',
+'stub-threshold-disabled' => 'Devre dışı',
'recentchangesdays' => 'Son değişikliklerde gösterilecek günler:',
'recentchangesdays-max' => '(en fazla $1 {{PLURAL:$1|gün|gün}})',
'recentchangescount' => 'Varsayılan olarak gösterilecek değişiklik sayısı:',
@@ -1324,15 +1344,16 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
'prefs-files' => 'Dosyalar',
'prefs-custom-css' => 'Özel CSS',
'prefs-custom-js' => 'Özel JS',
+'prefs-common-css-js' => 'Tüm kaplamalar için paylaşılan CSS/JS:',
'prefs-reset-intro' => 'Bu sayfayı tercihlerinizi site varsayılanına döndürmek için kullanabilirsiniz. Bu geri alınamaz.',
'prefs-emailconfirm-label' => 'E-posta doğrulaması:',
'prefs-textboxsize' => 'DeÄŸiÅŸtirme penceresinin boyutu',
-'youremail' => 'E-posta adresiniz*',
+'youremail' => 'E-posta:',
'username' => 'Kullanıcı adı:',
'uid' => 'Kayıt numarası:',
'prefs-memberingroups' => '{{PLURAL:$1|grup|grup}} üyesi:',
'prefs-registration' => 'Kayıt zamanı:',
-'yourrealname' => 'Gerçek isminiz:',
+'yourrealname' => 'Gerçek adınız:',
'yourlanguage' => 'Dil:',
'yourvariant' => 'Sizce:',
'yournick' => 'İmzalarda gözükmesini istediğiniz isim',
@@ -1360,9 +1381,15 @@ Aynı zamanda diğer kullanıcıların kullanıcı ve kullanıcı mesaj sayfalar
'prefs-advancedrendering' => 'Gelişmiş seçenekler',
'prefs-advancedsearchoptions' => 'Gelişmiş seçenekler',
'prefs-advancedwatchlist' => 'Gelişmiş seçenekler',
-'prefs-display' => 'Görüntü seçenekleri',
+'prefs-displayrc' => 'Görüntü seçenekleri',
+'prefs-displaysearchoptions' => 'Görüntüleme seçenekleri',
+'prefs-displaywatchlist' => 'Görüntüleme seçenekleri',
'prefs-diffs' => 'Farklar',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-posta adresi geçerli görünüyor',
+'email-address-validity-invalid' => 'Geçerli bir e-posta adresi girin',
+
# User rights
'userrights' => 'Kullanıcı hakları yönetimi',
'userrights-lookup-user' => 'Kullanıcı gruplarını düzenle',
@@ -1446,6 +1473,7 @@ Aynı zamanda diğer kullanıcıların kullanıcı ve kullanıcı mesaj sayfalar
'right-hideuser' => 'Bir kullanıcı adını engelle, genelden gizleyerek',
'right-ipblock-exempt' => 'IP engellemelerini atla, otomatik engelle ve aralık engellemeleri',
'right-proxyunbannable' => 'Proxylerin otomatik engellemelerini atla',
+'right-unblockself' => 'Kendi engellemesini kaldır',
'right-protect' => 'Koruma seviyelerini değiştir ve korumalı sayfalarda değişiklik yap',
'right-editprotected' => 'Korumalı sayfalarda değişiklik yap (korumayı basamaklamadan)',
'right-editinterface' => 'Kullanıcı arayüzünü değiştirmek',
@@ -1468,7 +1496,6 @@ Aynı zamanda diğer kullanıcıların kullanıcı ve kullanıcı mesaj sayfalar
'right-siteadmin' => 'Veritabanını kilitle ve kilidi aç',
'right-reset-passwords' => 'Diğer kullanıcıların parolalarını sıfırla',
'right-override-export-depth' => "Sayfaları, derinlik 5'e kadar bağlantılı sayfalarla beraber, dışa aktar",
-'right-versiondetail' => 'Genişletilmiş yazılım sürüm bilgilerini göster',
'right-sendemail' => 'Diğer kullanıcılara e-posta gönder',
# User rights log
@@ -1518,31 +1545,26 @@ Aynı zamanda diğer kullanıcıların kullanıcı ve kullanıcı mesaj sayfalar
'recentchanges' => 'Son deÄŸiÅŸiklikler',
'recentchanges-legend' => 'Son değişiklikler seçenekleri',
'recentchangestext' => 'Yapılan en son değişiklikleri bu sayfadan izleyin.',
-'recentchanges-feed-description' => "Bu beslemedeki viki'de yapılan en son değişiklikleri takip edin.",
-'recentchanges-label-legend' => 'Açıklamalar: $1.',
-'recentchanges-legend-newpage' => '$1 - yeni sayfa',
+'recentchanges-feed-description' => "Bu beslemede, viki'de yapılan en son değişiklikleri takip edin.",
'recentchanges-label-newpage' => 'Bu deÄŸiÅŸiklik yeni bir sayfa oluÅŸturdu',
-'recentchanges-legend-minor' => '$1 - küçük değişiklik',
'recentchanges-label-minor' => 'Bu küçük bir değişiklik',
-'recentchanges-legend-bot' => '$1 - bot deÄŸiÅŸikliÄŸi',
'recentchanges-label-bot' => 'Bu değişiklik bir bot tarafından yapıldı',
-'recentchanges-legend-unpatrolled' => '$1 - gözlenmemiş değişiklik',
'recentchanges-label-unpatrolled' => 'Bu değişiklik henüz gözlenmemiş',
'rcnote' => "$4 tarihi ve saat $5 itibarı ile, son {{PLURAL:$2|1 günde|'''$2''' günde}} yapılan, {{PLURAL:$1|'''1''' değişiklik|'''$1''' değişiklik}}, aşağıdadır.",
-'rcnotefrom' => '<b>$2</b> tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> adet madde gösterilmektedir).',
-'rclistfrom' => '$1 tarihinden beri yapılan değişiklikleri göster',
-'rcshowhideminor' => 'küçük değişiklikleri $1',
+'rcnotefrom' => "'''$2''' tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> tanesi gösterilmektedir).",
+'rclistfrom' => '$1 tarihinden itibaren yeni değişiklikleri göster',
+'rcshowhideminor' => 'Küçük değişiklikleri $1',
'rcshowhidebots' => 'botları $1',
-'rcshowhideliu' => 'kayıtlı kullanıcıları $1',
-'rcshowhideanons' => 'anonim kullanıcıları $1',
-'rcshowhidepatr' => 'izlenmiÅŸ deÄŸiÅŸiklikleri $1',
-'rcshowhidemine' => 'deÄŸiÅŸikliklerimi $1',
+'rcshowhideliu' => 'Kayıtlı kullanıcıları $1',
+'rcshowhideanons' => 'Anonim kullanıcıları $1',
+'rcshowhidepatr' => 'Ä°zlenmiÅŸ deÄŸiÅŸiklikleri $1',
+'rcshowhidemine' => 'DeÄŸiÅŸikliklerimi $1',
'rclinks' => 'Son $2 günde yapılan son $1 değişikliği göster;<br /> $3',
'diff' => 'fark',
'hist' => 'geçmiş',
'hide' => 'gizle',
'show' => 'göster',
-'minoreditletter' => 'K',
+'minoreditletter' => 'k',
'newpageletter' => 'Y',
'boteditletter' => 'b',
'number_of_watching_users_pageview' => '[$1 izlenilen {{PLURAL:$1|kullanıcı|kullanıcı}}]',
@@ -1557,11 +1579,11 @@ Aynı zamanda diğer kullanıcıların kullanıcı ve kullanıcı mesaj sayfalar
'recentchangeslinked-feed' => 'Ä°lgili deÄŸiÅŸiklikler',
'recentchangeslinked-toolbox' => 'Ä°lgili deÄŸiÅŸiklikler',
'recentchangeslinked-title' => '"$1" ile iliÅŸkili deÄŸiÅŸiklikler',
-'recentchangeslinked-noresult' => 'Verilen süre içerisinde belirtilen sayfaya bağlı diğer sayfalarda değişiklik bulunmamaktadır.',
+'recentchangeslinked-noresult' => 'Verilen dönemde bağlantılı sayfalarda değişiklik yok.',
'recentchangeslinked-summary' => "Aşağıdaki liste, belirtilen sayfaya (ya da belirtilen kategorinin üyelerine) bağlantı veren sayfalarda yapılan son değişikliklerin listesidir.
-[[Special:Watchlist|İzleme listenizdeki]] sayfalar '''kalın''' yazıyla belirtilmiştir.",
+[[Special:Watchlist|İzleme listenizdeki]] sayfalar '''kalın''' olarak belirtilmiştir.",
'recentchangeslinked-page' => 'Sayfa adı:',
-'recentchangeslinked-to' => 'Verilen sayfa yerine verilen sayfaya bağlantı vermiş olan sayfaları göster',
+'recentchangeslinked-to' => 'Belirtilen sayfadan verilenler yerine, sayfaya verilen bağlantıları göster.',
# Upload
'upload' => 'Dosya yükle',
@@ -1573,6 +1595,9 @@ Aynı zamanda diğer kullanıcıların kullanıcı ve kullanıcı mesaj sayfalar
'upload_directory_missing' => 'Yükleme dizini ($1) kayıp ve websunucusu tarafından oluşturulamıyor.',
'upload_directory_read_only' => 'Dosya yükleme dizinine ($1) web sunucusunun yazma izni yok.',
'uploaderror' => 'Yükleme hatası',
+'upload-recreate-warning' => "'''Uyarı: Bu adı taşıyan bir dosya silindi veya taşındı.'''
+
+Bu sayfanın silme ve taşıma günlüğü kolaylık için burada sağlanmıştır:",
'uploadtext' => "Dosya yüklemek için aşağıdaki formu kullanın.
Önceden yüklenmiş dosyaları görmek ya da aramak için [[Special:FileList|yüklenmiş dosyalar listesine]] bakın, (tekrar) yüklenenler [[Special:Log/upload|yükleme günlüğü]]nde, silinenler [[Special:Log/delete|silinme günlüğü]]nde tutulumaktadır.
@@ -1584,10 +1609,10 @@ Bir sayfaya dosya koymak için bağlantınızda aşağıdaki formlardan birini k
'upload-preferred' => 'Tercih edilen dosya türleri: $1.',
'upload-prohibited' => 'Yasaklanan dosya türleri: $1.',
'uploadlog' => 'yükleme kaydı',
-'uploadlogpage' => 'Dosya yükleme kayıtları',
+'uploadlogpage' => 'Dosya yükleme kaydı',
'uploadlogpagetext' => 'Aşağıda en son eklenen [[Special:NewFiles|dosyaların bir listesi]] bulunmaktadır.',
'filename' => 'Dosya adı',
-'filedesc' => 'Dosya ile ilgili açıklama',
+'filedesc' => 'Açıklama',
'fileuploadsummary' => 'Özet:',
'filereuploadsummary' => 'Dosya deÄŸiÅŸiklikleri:',
'filestatus' => 'Telif hakkı durumu:',
@@ -1604,6 +1629,17 @@ Bir sayfaya dosya koymak için bağlantınızda aşağıdaki formlardan birini k
'filetype-unwanted-type' => "'''\".\$1\"''' istenmeyen bir dosya türüdür. Önerilen {{PLURAL:\$3|dosya türü|dosya türleri}} \$2.",
'filetype-banned-type' => "'''\".\$1\"''' izin verilen bir dosya türü değil. İzin verilen {{PLURAL:\$3|dosya türü|dosya türleri}} \$2.",
'filetype-missing' => 'Dosyanın hiçbir uzantısı yok (".jpg" gibi).',
+'empty-file' => 'Gönderdiğiniz dosya boştu.',
+'file-too-large' => 'Gönderdiğiniz dosya çok büyük.',
+'filename-tooshort' => 'Dosya adı çok kısa.',
+'filetype-banned' => 'Bu tür dosyalar yasaklanmıştır.',
+'verification-error' => 'Bu dosya, dosya doğrulamasını geçemedi.',
+'hookaborted' => 'Yapmaya çalıştığınız değişiklik bir uzantı çengeliyle iptal edildi.',
+'illegal-filename' => 'Dosya adına izin verilmiyor.',
+'overwrite' => 'Varolan dosyanın üzerine yazmaya izin verilmiyor.',
+'unknown-error' => 'Bilinmeyen bir hata oluÅŸtu.',
+'tmp-create-error' => 'Geçici dosya oluşturulamadı.',
+'tmp-write-error' => 'Geçici dosya yazılırken hata.',
'large-file' => 'Dosyaların $1 boyutundan daha büyük olmaması önerilmektedir;
bu dosyanın boyutu $2.',
'largefileserver' => 'Bu dosyanın uzunluğu sunucuda izin verilenden daha büyüktür.',
@@ -1631,13 +1667,14 @@ Dosyanızı yinede yüklemek istiyorsanız, lütfen geri dönüp yeni bir isim k
Dosyanızı yinede yüklemek istiyorsanız, lütfen geri gidip yeni bir isim kullanın. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Bu dosya aşağıdaki {{PLURAL:$1|dosyanın|dosyaların}} kopyasıdır:',
'file-deleted-duplicate' => 'Bu dosyanın özdeşi olan başka bir dosya ([[:$1]]) daha önceden silindi. Bu dosyayı yeniden yüklemeden önce diğer dosyanın silme kayıtlarını kontrol etmelisiniz.',
-'successfulupload' => 'Yükleme başarılı',
'uploadwarning' => 'Yükleme uyarısı',
'uploadwarning-text' => 'Lütfen aşağıdaki dosya açıklamasını değiştirin ve tekrar deneyin.',
'savefile' => 'Dosyayı kaydet',
'uploadedimage' => 'Yüklenen: "[[$1]]"',
'overwroteimage' => '"[[$1]]" resminin yeni sürümü yüklenmiştir',
'uploaddisabled' => 'Geçici olarak şu anda herhangi bir dosya yüklenmez. Biraz sonra bir daha deneyiniz.',
+'copyuploaddisabled' => 'URL ile yükleme devre dışı.',
+'uploadfromurl-queued' => 'Yüklemeniz sıraya alınmıştır.',
'uploaddisabledtext' => 'Dosya yüklemeleri devredışı bırakılmıştır.',
'php-uploaddisabledtext' => 'PHP dosyası yüklemeleri devre dışıdır. Lütfen file_uploads ayarını kontrol edin.',
'uploadscripted' => 'Bu dosya bir internet tarayıcısı tarafından hatalı çevrilebilecek bir HTML veya script kodu içermektedir.',
@@ -1671,6 +1708,14 @@ JD # Jenoptik
MGP # Pentax
PICT # misc.
#</pre> <!-- leave this line exactly as it is -->',
+'upload-success-subj' => 'Yükleme başarılı',
+'upload-success-msg' => '[$2] yüklemeniz başarılı oldu. Yüklemeniz burada mevcut: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Yükleme sorunu',
+'upload-failure-msg' => '[$2] adresinden yapılan yüklemenizle ilgili bir sorun var:
+
+$1',
+'upload-warning-subj' => 'Yükleme uyarısı',
+'upload-warning-msg' => '[$2] yüklemenizde bir sorun oluştu. Sorunu düzeltmek için [[Special:Upload/stash/$1|yükleme formuna]] geri dönebilirsiniz.',
'upload-proto-error' => 'Hatalı protokol',
'upload-proto-error-text' => "Uzaktan yükleme, <code>http://</code> veya <code>ftp://</code> ile başlayan URL'ler gerektirmektedir.",
@@ -1736,6 +1781,7 @@ Bir sütünun başlığına tıklayarak sıralamayı değiştirebilirsiniz.',
'listfiles_search_for' => 'Medya adı ara:',
'imgfile' => 'dosya',
'listfiles' => 'Dosya listesi',
+'listfiles_thumb' => 'Küçük resim',
'listfiles_date' => 'Tarih',
'listfiles_name' => 'Ad',
'listfiles_user' => 'Kullanıcı',
@@ -1746,14 +1792,14 @@ Bir sütünun başlığına tıklayarak sıralamayı değiştirebilirsiniz.',
# File description page
'file-anchor-link' => 'Dosya',
'filehist' => 'Dosya geçmişi',
-'filehist-help' => 'Dosyanın geçmişini görebilmek için Gün/Zaman bölümündeki tarihleri tıklayınız.',
+'filehist-help' => 'Dosyanın herhangi bir zamandaki hâli için ilgili tarih/saat kısmına tıklayın.',
'filehist-deleteall' => 'Hepsini sil',
'filehist-deleteone' => 'sil',
'filehist-revert' => 'geri al',
-'filehist-current' => 'Åžimdiki',
-'filehist-datetime' => 'Gün/Zaman',
+'filehist-current' => 'ÅŸimdiki',
+'filehist-datetime' => 'Tarih/Saat',
'filehist-thumb' => 'Küçük resim',
-'filehist-thumbtext' => '$1 tarihindeki sürümün küçültülmüş hali',
+'filehist-thumbtext' => '$1 tarihindeki sürümün küçültülmüş hâli',
'filehist-nothumb' => 'Küçük resim yok',
'filehist-user' => 'Kullanıcı',
'filehist-dimensions' => 'Boyutlar',
@@ -1765,13 +1811,14 @@ Bir sütünun başlığına tıklayarak sıralamayı değiştirebilirsiniz.',
'linkstoimage-more' => "$1'den fazla {{PLURAL:$1|sayfa|sayfa}} bu dosyaya bağlantı veriyor.
Sıradaki liste sadece bu dosyaya bağlantı veren {{PLURAL:$1|ilk dosyayı|ilk $1 dosyayı}} gösteriyor.
[[Special:WhatLinksHere/$2|Tam bir liste]] mevcuttur.",
-'nolinkstoimage' => 'Bu görüntü dosyasına bağlanan sayfa yok.',
+'nolinkstoimage' => 'Bu dosyaya bağlantı veren bir sayfa yok.',
'morelinkstoimage' => 'Bu dosyaya [[Special:WhatLinksHere/$1|daha fazla bağlantıları]] gör.',
'redirectstofile' => 'Şu {{PLURAL:$1|dosya|$1 dosya}}, bu dosyaya yönlendiriyor:',
'duplicatesoffile' => 'Şu {{PLURAL:$1|dosya|$1 dosya}}, bu dosyanın kopyası ([[Special:FileDuplicateSearch/$2|daha fazla ayrıntı]]):',
'sharedupload' => 'Bu dosya $1 deposundan ve diğer projelerde kullanılıyor olabilir.',
'sharedupload-desc-there' => 'Bu dosya $1 deposundan ve diğer projeler tarafından kullanılıyor olabilir. Daha fazla bilgi için lütfen [$2 dosya açıklama sayfasına] bakın.',
-'sharedupload-desc-here' => 'Bu dosya $1 deposundan ve diğer projeler tarafından kullanılıyor olabilir. [$2 Dosya açıklama sayfasındaki] açıklama aşağıda gösteriliyor.',
+'sharedupload-desc-here' => 'Bu dosya $1 deposundan ve diğer projeler tarafından kullanılıyor olabilir.
+Aşağıda [$2 dosya açıklama sayfasındaki] açıklama gösteriliyor.',
'filepage-nofile' => 'Bu isimde bir dosya yok.',
'filepage-nofile-link' => 'Bu isimde bir dosya yok, ama siz [$1 yükleyebilirsiniz].',
'uploadnewversion-linktext' => 'Dosyanın yenisini yükleyin',
@@ -1846,8 +1893,8 @@ Sıradaki liste sadece bu dosyaya bağlantı veren {{PLURAL:$1|ilk dosyayı|ilk
'statistics-edits' => '{{SITENAME}} kurulduğundan beri yapılan sayfa değişiklikleri',
'statistics-edits-average' => 'Her sayfadaki ortalama deÄŸiÅŸiklik',
'statistics-views-total' => 'Toplam görüntüleme',
+'statistics-views-total-desc' => 'Varolmayan ve özel sayfaların görüntülenmeleri dahil edilmemiştir.',
'statistics-views-peredit' => 'Değişiklik başına görüntüleme',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue İş sırası] uzunluğu',
'statistics-users' => 'Kayıtlı [[Special:ListUsers|kullanıcılar]]',
'statistics-users-active' => 'Aktif kullanıcılar',
'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 günde}} çalışma yapan kullanıcılar',
@@ -1860,7 +1907,7 @@ Sıradaki liste sadece bu dosyaya bağlantı veren {{PLURAL:$1|ilk dosyayı|ilk
'doubleredirects' => 'Çift yönlendirmeler',
'doubleredirectstext' => 'Bu sayfa diğer yönlendirme sayfalarına yönlendirme yapan sayfaları listeler.
Her satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca ikinci yönlendirmenin hedefi, ki bu genelde birinci yönlendirmenin göstermesi gereken "gerçek" hedef sayfasıdır.
-<s>Üstü çizili</s> girdiler çözülmüştür.',
+<del>Üstü çizili</del> girdiler çözülmüştür.',
'double-redirect-fixed-move' => '[[$1]] taşındı, artık [[$2]] sayfasına yönlendiriyor',
'double-redirect-fixer' => 'Yönlendirme tamircisi',
@@ -1880,9 +1927,11 @@ Her satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca
'nbytes' => '$1 {{PLURAL:$1|bayt|bayt}}',
'ncategories' => '{{PLURAL:$1|kategori|kategoriler}}',
'nlinks' => '$1 {{PLURAL:$1|bağlantı|bağlantılar}}',
-'nmembers' => '{{PLURAL:$1|üye|üyeler}}',
+'nmembers' => '{{PLURAL:$1|üye|üye}}',
'nrevisions' => '{{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklikler}}',
'nviews' => '$1 {{PLURAL:$1|görünüm|görünüm}}',
+'nimagelinks' => '$1 {{PLURAL:$1|sayfada|sayfada}} kullanılıyor',
+'ntransclusions' => '$1 {{PLURAL:$1|sayfada|sayfada}} kullanılıyor',
'specialpage-empty' => 'Bu rapor için hiç sonuç yok.',
'lonelypages' => 'Kendisine hiç bağlantı olmayan sayfalar',
'lonelypagestext' => 'Aşağıdaki sayfalara {{SITENAME}} sitesindeki diğer sayfalardan bağlantı verilmemiş ya da çapraz dahil edilmemişler.',
@@ -2039,34 +2088,40 @@ Bireysel haklarla ilgili [[{{MediaWiki:Listgrouprights-helppage}}|daha fazla bil
'listgrouprights-removegroup-self-all' => 'Kendi hesabından tüm grupları çıkarabilir',
# E-mail user
-'mailnologin' => 'Gönderi adresi yok.',
-'mailnologintext' => 'Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.',
-'emailuser' => 'Kullanıcıya e-posta gönder',
-'emailpage' => 'Kullanıcıya e-posta gönder',
-'emailpagetext' => 'Bu kullanıcıya e-posta mesajı göndermek için aşağıdaki formu kullanabilirsiniz.
+'mailnologin' => 'Gönderi adresi yok.',
+'mailnologintext' => 'Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.',
+'emailuser' => 'Bu kullanıcıya e-posta gönder',
+'emailpage' => 'Kullanıcıya e-posta gönder',
+'emailpagetext' => 'Bu kullanıcıya e-posta mesajı göndermek için aşağıdaki formu kullanabilirsiniz.
[[Special:Preferences|Kullanıcı tercihlerinizde]] girdiğiniz e-posta adresiniz, e-postanın "From (Kimden)" adresinde görünecektir, bu yüzden alıcı size direk cevap verebilecektir.',
-'usermailererror' => 'E-posta hizmeti hata verdi:',
-'defemailsubject' => '{{SITENAME}} e-posta',
-'noemailtitle' => 'e-posta adresi yok',
-'noemailtext' => 'Bu kullanıcı geçerli bir e-posta adresi belirtmemiş.',
-'nowikiemailtitle' => 'E-postalara izin verilmiyor',
-'nowikiemailtext' => 'Bu kullanıcı, diğer kullanıcılardan e-posta almamayı tercih etti.',
-'email-legend' => 'Diğer {{SITENAME}} kullanıcısına e-posta gönder',
-'emailfrom' => 'Kimden:',
-'emailto' => 'Kime:',
-'emailsubject' => 'Konu:',
-'emailmessage' => 'E-posta:',
-'emailsend' => 'Gönder',
-'emailccme' => 'Mesajın bir kopyasını da bana gönder.',
-'emailccsubject' => "$1'e gönderdiğiniz mesajın kopyası: $2",
-'emailsent' => 'E-posta gönderildi',
-'emailsenttext' => 'E-postanız gönderildi.',
-'emailuserfooter' => 'Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki "Kullanıcıya e-posta gönder" fonksiyonu ile gönderilmiştir.',
+'usermailererror' => 'E-posta hizmeti hata verdi:',
+'defemailsubject' => '{{SITENAME}} e-posta',
+'usermaildisabled' => 'Kullanıcı e-postası devre dışı',
+'usermaildisabledtext' => 'Bu vikide diğer kullanıcılara e-posta gönderemezsiniz',
+'noemailtitle' => 'e-posta adresi yok',
+'noemailtext' => 'Bu kullanıcı geçerli bir e-posta adresi belirtmemiş.',
+'nowikiemailtitle' => 'E-postalara izin verilmiyor',
+'nowikiemailtext' => 'Bu kullanıcı, diğer kullanıcılardan e-posta almamayı tercih etti.',
+'email-legend' => 'Diğer {{SITENAME}} kullanıcısına e-posta gönder',
+'emailfrom' => 'Kimden:',
+'emailto' => 'Kime:',
+'emailsubject' => 'Konu:',
+'emailmessage' => 'E-posta:',
+'emailsend' => 'Gönder',
+'emailccme' => 'Mesajın bir kopyasını da bana gönder.',
+'emailccsubject' => "$1'e gönderdiğiniz mesajın kopyası: $2",
+'emailsent' => 'E-posta gönderildi',
+'emailsenttext' => 'E-postanız gönderildi.',
+'emailuserfooter' => 'Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki "Kullanıcıya e-posta gönder" fonksiyonu ile gönderilmiştir.',
+
+# User Messenger
+'usermessage-summary' => 'Sistem mesajı bırakın.',
+'usermessage-editor' => 'Sistem habercisi',
# Watchlist
'watchlist' => 'Ä°zleme listem',
'mywatchlist' => 'Ä°zleme listem',
-'watchlistfor' => "('''$1''' için)",
+'watchlistfor2' => '$1 için $2',
'nowatchlist' => 'İzleme listesinde hiçbir madde bulunmuyor.',
'watchlistanontext' => 'Lütfen izleme listenizdeki maddeleri görmek ya da değiştirmek için $1.',
'watchnologin' => 'Oturum açık değil.',
@@ -2081,9 +2136,9 @@ Kolayca seçilebilmeleri için de [[Special:RecentChanges|son değişiklikler li
Sayfayı izleme listenizden çıkarmak istediğinizde "sayfayı izlemeyi durdur" bağlantısına tıklayabilirsiniz.',
'removedwatch' => 'Ä°zleme listenizden silindi',
'removedwatchtext' => '"[[:$1]]" sayfası [[Special:Watchlist|izleme listenizden]] silinmiştir.',
-'watch' => 'Ä°zlemeye al',
+'watch' => 'Ä°zle',
'watchthispage' => 'Sayfayı izle',
-'unwatch' => 'Sayfa izlemeyi durdur',
+'unwatch' => 'Ä°zleme',
'unwatchthispage' => 'Sayfa izlemeyi durdur',
'notanarticle' => 'İçerik sayfası değil',
'notvisiblerev' => 'Revizyon silinmiÅŸ',
@@ -2151,8 +2206,8 @@ Geri bildirim ve daha fazla yardım için:
'historywarning' => "'''Uyarı:''' Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 {{PLURAL:$1|sürüme|sürüme}} sahip bir geçmişi var:",
'confirmdeletetext' => 'Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.
Bu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.',
-'actioncomplete' => 'İşlem tamamlandı.',
-'actionfailed' => 'Eylem başarısız oldu',
+'actioncomplete' => 'İşlem tamamlandı',
+'actionfailed' => 'İşlem başarısız oldu',
'deletedtext' => '"<nowiki>$1</nowiki>" silindi.
Yakın zamanda silinenleri görmek için: $2.',
'deletedarticle' => '"[[$1]]" silindi',
@@ -2178,7 +2233,7 @@ dikkatle devam edin.',
# Rollback
'rollback' => 'deÄŸiÅŸiklikleri geri al',
'rollback_short' => 'geri al',
-'rollbacklink' => 'eski haline getir',
+'rollbacklink' => 'geridöndür',
'rollbackfailed' => 'geri alma işlemi başarısız',
'cantrollback' => 'Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.',
'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geriye alınamıyor;
@@ -2190,7 +2245,10 @@ Son deÄŸiÅŸikliÄŸi yapan: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separa
'revertpage-nouser' => '(kullanıcı adı çıkarılmış) tarafından yapılan değişiklikler [[User:$1|$1]] tarafından yapılan son revizyona geri alındı',
'rollback-success' => '$1 tarafından yapılan değişiklikler geri alınarak;
$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.',
-'sessionfailure' => 'Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;
+
+# Edit tokens
+'sessionfailure-title' => 'Oturum başarısızlığı',
+'sessionfailure' => 'Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;
bu eylem, oturum gaspına karşı önlem olarak iptal edildi.
Lütfen "geri" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.',
@@ -2322,35 +2380,39 @@ $1',
'month' => 'Ay:',
'year' => 'Yıl:',
-'sp-contributions-newbies' => 'Sadece yeni hesap açan kullanıcıların katkılarını göster',
-'sp-contributions-newbies-sub' => 'Yeni kullanıcılar için',
-'sp-contributions-newbies-title' => 'Yeni hesaplar için kullanıcı katkıları',
-'sp-contributions-blocklog' => 'Engel kaydı',
-'sp-contributions-deleted' => 'silinen kullanıcı katkıları',
-'sp-contributions-logs' => 'günlükler',
-'sp-contributions-talk' => 'tartışma',
-'sp-contributions-userrights' => 'kullanıcı hakları yönetimi',
-'sp-contributions-blocked-notice' => 'Bu kullanıcı engellenmiştir. Referans için en son engellenme kaydı aşağıda belirtilmiştir:',
-'sp-contributions-search' => 'Katkıları ara',
-'sp-contributions-username' => 'IP veya kullanıcı:',
-'sp-contributions-submit' => 'Ara',
+'sp-contributions-newbies' => 'Sadece yeni kullanıcıların katkılarını göster',
+'sp-contributions-newbies-sub' => 'Yeni kullanıcılar için',
+'sp-contributions-newbies-title' => 'Yeni hesaplar için kullanıcı katkıları',
+'sp-contributions-blocklog' => 'Engel kaydı',
+'sp-contributions-deleted' => 'silinen kullanıcı katkıları',
+'sp-contributions-uploads' => 'yüklenenler',
+'sp-contributions-logs' => 'kayıtlar',
+'sp-contributions-talk' => 'tartışma',
+'sp-contributions-userrights' => 'kullanıcı hakları yönetimi',
+'sp-contributions-blocked-notice' => 'Bu kullanıcı engellenmiştir. Referans için en son engellenme kaydı aşağıda belirtilmiştir:',
+'sp-contributions-blocked-notice-anon' => 'Bu IP adresi ÅŸu anda engellenmiÅŸ.
+Son engelleme günlüğü girdisi kaynak amacıyla aşağıda verilmiştir:',
+'sp-contributions-search' => 'Katkıları ara',
+'sp-contributions-username' => 'IP adresi veya kullanıcı adı:',
+'sp-contributions-toponly' => 'Sadece son revizyon olan değişiklikleri göster',
+'sp-contributions-submit' => 'Ara',
# What links here
'whatlinkshere' => 'Sayfaya bağlantılar',
'whatlinkshere-title' => '"$1" maddesine bağlantı veren sayfalar',
'whatlinkshere-page' => 'Sayfa:',
'linkshere' => "'''[[:$1]]''' sayfasına bağlantısı olan sayfalar:",
-'nolinkshere' => "'''[[:$1]]''' sayfasına bağlantı yapan sayfa yok.",
+'nolinkshere' => "'''[[:$1]]''' sayfasına bağlantı veren sayfa yok.",
'nolinkshere-ns' => "Seçilen ad alanında hiçbir sayfa '''[[:$1]]''' sayfasına bağlanmıyor.",
'isredirect' => 'yönlendirme sayfası',
-'istemplate' => 'ekleme',
+'istemplate' => 'dönüştürülme',
'isimage' => 'dosya bağlantısı',
'whatlinkshere-prev' => '{{PLURAL:$1|önceki|önceki $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|sonraki|sonraki $1}}',
'whatlinkshere-links' => '↠bağlantılar',
-'whatlinkshere-hideredirs' => 'yönlendirmeleri $1',
-'whatlinkshere-hidetrans' => 'Çapraz eklemeleri $1',
-'whatlinkshere-hidelinks' => 'bağlantıları $1',
+'whatlinkshere-hideredirs' => 'Yönlendirmeleri $1',
+'whatlinkshere-hidetrans' => 'Dönüştürmeleri $1',
+'whatlinkshere-hidelinks' => 'Bağlantıları $1',
'whatlinkshere-hideimages' => 'Resim bağlantılarını $1',
'whatlinkshere-filters' => 'Süzgeçler',
@@ -2378,7 +2440,7 @@ $1',
'ipbenableautoblock' => 'Bu kullanıcı tarafından kullanılan son IP adresini ve değişiklik yapmaya çalıştığı sonraki IP adreslerini otomatik olarak engelle',
'ipbsubmit' => 'Bu kullanıcıyı engelle',
'ipbother' => 'Farklı zaman',
-'ipboptions' => '2 saat:2 hours,1 gün:1 day,3 gün:3 days,1 hafta:1 week,2 hafta:2 weeks,1 ay:1 month,3 ay:3 months,6 ay:6 months,1 yıl:1 year,Süresiz:infinite',
+'ipboptions' => '2 saat:2 hours,1 gün:1 day,3 gün:3 days,1 hafta:1 week,2 hafta:2 weeks,1 ay:1 month,3 ay:3 months,6 ay:6 months,1 yıl:1 year,süresiz:infinite',
'ipbotheroption' => 'farklı',
'ipbotherreason' => 'BaÅŸka/ek sebepler:',
'ipbhidename' => 'Kullanıcı adını katkılarda ve listelerde gizle',
@@ -2392,7 +2454,6 @@ $1',
'ipb-edit-dropdown' => 'Engelleme nedenleri düzenle',
'ipb-unblock-addr' => '$1 için engellemeyi kaldır',
'ipb-unblock' => 'Engellemeyi kaldır',
-'ipb-blocklist-addr' => '$1 için mevcut engellemeler',
'ipb-blocklist' => 'Mevcut olan engellemeleri göster',
'ipb-blocklist-contribs' => '$1 için katkılar',
'unblockip' => 'Kullanıcının engellemesini kaldır',
@@ -2420,11 +2481,11 @@ $1',
'ipblocklist-empty' => 'Engelleme listesi boÅŸ.',
'ipblocklist-no-results' => 'İstenen IP adresi ya da kullanıcı adı engellenmedi.',
'blocklink' => 'engelle',
-'unblocklink' => 'engellemeyi kaldır',
+'unblocklink' => 'engeli kaldır',
'change-blocklink' => 'engeli deÄŸiÅŸtir',
-'contribslink' => 'Katkılar',
+'contribslink' => 'katkılar',
'autoblocker' => 'Otomatik olarak engellendiniz çünkü yakın zamanda IP adresiniz "[[User:$1|$1]]" kullanıcısı tarafından kullanılmıştır. $1 isimli kullanıcının engellenmesi için verilen sebep: "\'\'\'$2\'\'\'"',
-'blocklogpage' => 'Erişim engelleme kayıtları',
+'blocklogpage' => 'Engel kaydı',
'blocklog-showlog' => 'Bu kullanıcı daha önceden engellenmiş.
Engelleme günlüğü referans için aşağıda sağlanmıştır:',
'blocklog-showsuppresslog' => 'Bu kullanıcı daha önceden engellenmiş ve gizlenmiş.
@@ -2465,6 +2526,8 @@ Lütfen İnternet sevis sağlayınız ile ya da teknik destek ile irtibat kurun
Hesap oluşturamazsınız",
'cant-block-while-blocked' => 'Siz engelliyken başka kullanıcıları engelleyemezsiniz.',
'cant-see-hidden-user' => 'Engellemek istediğiniz kullanıcı zaten engellenmiş ve gizlenmiş. Kullanıcıgizle yetkiniz olmadığı için, kullanıcının engellenmesini göremez ya da değiştiremezsiniz.',
+'ipbblocked' => 'Diğer kullanıcıları engelleyemez ya da engellemesini kaldıramazsınız, çünkü kendiniz engellenmişsiz',
+'ipbnounblockself' => 'Kendi engellemenizi kaldırmanıza izniniz yok',
# Developer tools
'lockdb' => 'Veritabanı kilitli',
@@ -2496,6 +2559,17 @@ Eğer yeni isimde bir madde zaten varsa isim değişikliği '''yapılmayacaktır
'''UYARI!'''
Bu değişim popüler bir sayfa için beklenmeyen sonuçlar doğurabilir; lütfen değişikliği yapmadan önce olabilecekleri göz önünde bulundurun.",
+'movepagetext-noredirectfixer' => "Aşağıdaki formu doldurmak bir sayfayı yeniden adlandırır, tüm geçmişini yeni ada taşır.
+Eski başlık yeni başlığa bir yönlendirme sayfası olur.
+[[Special:DoubleRedirects|Çift]] ya da [[Special:BrokenRedirects|nozuk yönlendirmeler]] sayfalarını kontrol edin.
+Bağlantıların gitmeleri gereken yerlere gittiklerinden emin olmak sizin sorumluluğunuzdadır.
+
+Yeni başlıkta mevcut bir sayfa varsa, boş yada bir yönlendirme olmadıkça ve değişiklik geçmişi bulunmadıkça, sayfa '''taşınmayacaktır'''.
+Bu şu anlama gelir, bir sayfayı yanlışlık yaparsanız sayfayı eski adıyla yeniden adlandırabilirsiniz, bu mevcut sayfanın üzerine yazmaz.
+
+'''Uyarı!'''
+Bu popüler bir sayfa için etkili ve beklenmedik bir değişiklik olabilir;
+Lütfen onaylamadan önce bunun sonuçlarını anladığınızdan emin olun.",
'movepagetalktext' => "İlişikteki tartışma sayfası da (eğer varsa) otomatik olarak yeni isme taşınacaktır. Ama şu durumlarda '''taşınmaz''':
*Alanlar arası bir taşıma ise, (örnek: \"Project:\" --> \"Help:\")
@@ -2533,7 +2607,7 @@ Lütfen başka bir isim deneyiniz.',
'1movedto2' => '[[$1]] sayfasının yeni adı: [[$2]]',
'1movedto2_redir' => '[[$1]] başlığı [[$2]] sayfasına yönlendirildi',
'move-redirect-suppressed' => 'yönlendirme bastırılmış',
-'movelogpage' => 'İsim değişikliği kayıtları',
+'movelogpage' => 'Taşıma kaydı',
'movelogpagetext' => 'Aşağıda bulunan liste adı değiştirilmiş sayfaları gösterir.',
'movesubpage' => '{{PLURAL:$1|Subpage|Alt sayfalar}}',
'movesubpagetext' => 'Bu sayfanın aşağıda gösterilen $1 {{PLURAL:$1|altsayfası|altsayfası}} vardır.',
@@ -2553,6 +2627,7 @@ Lütfen başka bir isim deneyiniz.',
'immobile-source-page' => 'Bu sayfanın adı değiştirilemez.',
'immobile-target-page' => 'Bu hedef başlığına taşınamaz.',
'imagenocrossnamespace' => 'Dosya, dosyalar için olmayan ad alanına taşınamaz',
+'nonfile-cannot-move-to-file' => 'Dosya olmayanlar, dosya ad alanına taşınamaz',
'imagetypemismatch' => 'Yeni dosya eklentisi tipiyle eÅŸleÅŸmiyor',
'imageinvalidfilename' => 'Hedef dosya adı geçersiz',
'fix-double-redirects' => 'Orijinal başlığa işaret eden yönlendirmeleri güncelle',
@@ -2567,7 +2642,7 @@ Son günlük girdisi referans amaçlı aşağıda verilmiştir:",
Lütfen başka bir isim seçin.',
# Export
-'export' => 'Sayfa kaydet',
+'export' => 'Sayfaları dışa aktar',
'exporttext' => 'Belirli bir sayfa ya da sayfa takımının metni ve değiştirme geçmişini XML ile sarılı olarak dışa aktarabilirsiniz.
Bu, MedyaViki kullanan başka bir vikide [[Special:Import|içe aktarım sayfası]] ile içe aktarılabilir.
@@ -2588,8 +2663,8 @@ Sonuncu durumda, bir link de kullanabilirsiniz, ör: "[[{{MediaWiki:Mainpage}}]]
# Namespace 8 related
'allmessages' => 'Sistem iletileri',
-'allmessagesname' => 'Ä°sim',
-'allmessagesdefault' => 'Orjinal metin',
+'allmessagesname' => 'Ad',
+'allmessagesdefault' => 'Varsayılan mesaj metni',
'allmessagescurrent' => 'Kullanımdaki metin',
'allmessagestext' => 'Bu liste MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.
Genel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [http://www.mediawiki.org/wiki/Localisation MediaWiki Yerelleştirmesi] ve [http://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.',
@@ -2606,7 +2681,7 @@ Genel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [http:/
# Thumbnails
'thumbnail-more' => 'Büyüt',
'filemissing' => 'Dosya bulunmadı',
-'thumbnail_error' => 'Ön izleme oluşturmada hata: $1',
+'thumbnail_error' => 'Küçük resim oluşturmada hata: $1',
'djvu_page_error' => 'DjVu sayfası kapsamdışı',
'djvu_no_xml' => 'DjVu dosyası için XML alınamıyor',
'thumbnail_invalid_params' => 'Geçersiz küçük resim parametreleri',
@@ -2633,6 +2708,7 @@ Bilgisayarınıza kaydedin ve buraya yükleyin.',
'importstart' => 'Sayfalar aktarmaktadır...',
'import-revision-count' => '$1 {{PLURAL:$1|revizyon|revizyon}}',
'importnopages' => 'Aktarılacak dosya yok.',
+'imported-log-entries' => '$1 {{PLURAL:$1|günlük girdisi|günlük girdisi}} içe aktardı.',
'importfailed' => '$1 aktarımı başarısız',
'importunknownsource' => 'Bilinmeyen içeri aktarım kaynak türü',
'importcantopen' => 'İçeri aktarma dosyası açılamadı',
@@ -2669,49 +2745,49 @@ Geçici dosya kayıp.',
'tooltip-pt-anonuserpage' => 'The user page for the ip you',
'tooltip-pt-mytalk' => 'Mesaj sayfanız',
'tooltip-pt-anontalk' => 'Bu IP adresinden yapılmış değişiklikleri tartış',
-'tooltip-pt-preferences' => 'Ayarlarım',
-'tooltip-pt-watchlist' => 'İzlemeye aldığım sayfalar',
-'tooltip-pt-mycontris' => 'Yaptığınız katkıların listesi',
-'tooltip-pt-login' => 'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.',
+'tooltip-pt-preferences' => 'Tercihleriniz (ayarlarınız)',
+'tooltip-pt-watchlist' => 'Değişiklikler için izlemeye aldığınız sayfaların listesi',
+'tooltip-pt-mycontris' => 'Katkılarınızın listesi',
+'tooltip-pt-login' => 'Mecbur değilsiniz fakat oturum açmanız tavsiye olunur',
'tooltip-pt-anonlogin' => 'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.',
'tooltip-pt-logout' => 'Sistemden çık',
-'tooltip-ca-talk' => 'İçerik ile ilgili görüş belirt',
-'tooltip-ca-edit' => 'Bu sayfayı değiştirebilirsiniz. Kaydetmeden önce önizleme yapmayı unutmayın.',
-'tooltip-ca-addsection' => 'Yeni bir bölüm başlat.',
-'tooltip-ca-viewsource' => 'Bu sayfa koruma altında. Sadece kaynak kodunu sadece görebilirsiniz. İçeriği değiştiremezsiniz.',
-'tooltip-ca-history' => 'Bu sayfanın geçmiş versiyonları.',
+'tooltip-ca-talk' => 'İçerik ile ilgili tartışma',
+'tooltip-ca-edit' => 'Bu sayfayı değiştirebilirsiniz. Lütfen kaydetmeden önce önizleme düğmesini kullanın.',
+'tooltip-ca-addsection' => 'Yeni bir altbaşlık aç',
+'tooltip-ca-viewsource' => 'Bu sayfa koruma altında. Sadece kaynağını görebilirsiniz.',
+'tooltip-ca-history' => 'Bu sayfanın geçmiş sürümleri',
'tooltip-ca-protect' => 'Bu sayfayı koru',
'tooltip-ca-unprotect' => 'Bu sayfanın korumasını kaldır',
-'tooltip-ca-delete' => 'Sayfayı sil',
+'tooltip-ca-delete' => 'Bu sayfayı sil',
'tooltip-ca-undelete' => 'Sayfayı silinmeden önceki haline geri getirin',
-'tooltip-ca-move' => 'Sayfanın adını değiştir',
-'tooltip-ca-watch' => 'Bu sayfayı izlemeye al',
-'tooltip-ca-unwatch' => 'Bu sayfayı izlemeyi bırakın',
+'tooltip-ca-move' => 'Bu sayfayı taşı',
+'tooltip-ca-watch' => 'Bu sayfayı izleme listenize ekleyin',
+'tooltip-ca-unwatch' => 'Bu sayfayı izleme listenizden çıkarın',
'tooltip-search' => '{{SITENAME}} içinde ara',
'tooltip-search-go' => 'EÄŸer varsa, tam bu addaki bir sayfaya git',
-'tooltip-search-fulltext' => 'Bu metin için sayfaları ara',
+'tooltip-search-fulltext' => 'Sayfalarda bu metni ara',
'tooltip-p-logo' => 'Ana sayfa',
-'tooltip-n-mainpage' => 'Ana sayfaya dön',
+'tooltip-n-mainpage' => 'Ana sayfaya git',
'tooltip-n-mainpage-description' => 'Ana sayfaya git',
-'tooltip-n-portal' => 'Proje üzerine, ne nerdedir, neler yapılabilir',
+'tooltip-n-portal' => 'Proje hakkında, neler yapabilirsiniz, ne nerdedir',
'tooltip-n-currentevents' => 'Güncel olaylarla ilgili son bilgiler',
-'tooltip-n-recentchanges' => 'Vikide yapılmış son değişikliklerin listesi.',
+'tooltip-n-recentchanges' => 'Vikide yapılmış son değişikliklerin listesi',
'tooltip-n-randompage' => 'Rastgele bir maddeye gidin',
-'tooltip-n-help' => 'Yardım almak için.',
-'tooltip-t-whatlinkshere' => 'Bu sayfaya bağlantı vermiş diğer viki sayfalarının listesi',
-'tooltip-t-recentchangeslinked' => 'Bu sayfaya bağlantı veren sayfalardaki son değişiklikler',
+'tooltip-n-help' => 'Yardım almak için',
+'tooltip-t-whatlinkshere' => 'Bu sayfaya bağlantı vermiş tüm viki sayfalarının listesi',
+'tooltip-t-recentchangeslinked' => 'Bu sayfadan bağlantı verilen sayfalardaki son değişiklikler',
'tooltip-feed-rss' => 'Bu sayfa için RSS beslemesi',
'tooltip-feed-atom' => 'Bu sayfa için atom beslemesi',
-'tooltip-t-contributions' => 'Kullanıcının katkı listesini gör',
-'tooltip-t-emailuser' => 'Kullanıcıya e-posta gönder',
+'tooltip-t-contributions' => 'Kullanıcının katkılarının listesini gör',
+'tooltip-t-emailuser' => 'Bu kullanıcıya e-posta gönder',
'tooltip-t-upload' => 'Dosya yükle',
-'tooltip-t-specialpages' => 'Tüm özel sayfaların listesini göster',
-'tooltip-t-print' => 'Bu sayfanın basılmaya uygun görünümü',
+'tooltip-t-specialpages' => 'Tüm özel sayfaların listesi',
+'tooltip-t-print' => 'Bu sayfanın basılmaya uygun sürümü',
'tooltip-t-permalink' => 'Sayfanın bu sürümüne kalıcı bağlantı',
-'tooltip-ca-nstab-main' => 'Sayfayı göster',
+'tooltip-ca-nstab-main' => 'İçerik sayfasını göster',
'tooltip-ca-nstab-user' => 'Kullanıcı sayfasını göster',
'tooltip-ca-nstab-media' => 'Medya sayfasını göster',
-'tooltip-ca-nstab-special' => 'Bu özel sayfa olduğu için değişiklik yapamazsınız.',
+'tooltip-ca-nstab-special' => 'Bu özel sayfa olduğu için üzerinde değişiklik yapamazsınız.',
'tooltip-ca-nstab-project' => 'Proje sayfasını göster',
'tooltip-ca-nstab-image' => 'Dosya sayfasını göster',
'tooltip-ca-nstab-mediawiki' => 'Sistem mesajını göster',
@@ -2720,15 +2796,16 @@ Geçici dosya kayıp.',
'tooltip-ca-nstab-category' => 'Kategori sayfasını göster',
'tooltip-minoredit' => 'Küçük değişiklik olarak işaretle',
'tooltip-save' => 'DeÄŸiÅŸiklikleri kaydet',
-'tooltip-preview' => 'Önizleme; kaydetmeden önce bu özelliği kullanarak değişikliklerinizi gözden geçirin!',
-'tooltip-diff' => 'Metine yaptığınız değişiklikleri gösterir.',
-'tooltip-compareselectedversions' => 'Seçilmiş iki sürüm arasındaki farkları göster.',
-'tooltip-watch' => 'Sayfayı izleme listene ekle',
+'tooltip-preview' => 'Değişikliklerinizi gözden geçirin, lütfen kaydetmeden önce bunu kullanın!',
+'tooltip-diff' => 'Metin üzerinde yaptığınız değişiklikleri gösterir',
+'tooltip-compareselectedversions' => 'Bu sayfanın seçilmiş iki sürümü arasındaki farkları gör.',
+'tooltip-watch' => 'Sayfayı izleme listenize ekleyin',
'tooltip-recreate' => 'Silinmiş olmasına rağmen sayfayı geri getir',
'tooltip-upload' => 'Yüklemeyi başlat',
-'tooltip-rollback' => '"Geri dönüş" tek tıklamayla bu sayfaya son katkı yapanın değişikliklerini geri döndürür',
-'tooltip-undo' => '"Geri al" bu değişikliği geri döndürür ve değişiklik formunu önizleme modunda açar.
-Özet için bir sebep eklemeye izin verir',
+'tooltip-rollback' => '"Geridöndür" tek tıklamayla bu sayfaya son katkı yapanın değişikliklerini geri alır',
+'tooltip-undo' => '"Geri al" bu değişikliği geri alır ve değişiklik formunu önizleme modunda açar.Özete bir sebep eklemeye olanak tanır.',
+'tooltip-preferences-save' => 'Tercihleri kaydet',
+'tooltip-summary' => 'Kısa bir özet girin',
# Stylesheets
'common.css' => '/* Buraya konulacak CSS kodu tüm temalarda etkin olur */',
@@ -2828,8 +2905,8 @@ $1',
'filedelete-archive-read-only' => '"$1" arşiv dizini websunucusu tarafından yazılabilir değil.',
# Browsing diffs
-'previousdiff' => '↠Önceki sürümle aradaki fark',
-'nextdiff' => 'Sonraki sürümle aradaki fark →',
+'previousdiff' => '↠Önceki değişiklik',
+'nextdiff' => 'Sonraki değişiklik →',
# Media information
'mediawarning' => "'''Uyarı''': Bu dosya türü kötü niyetli kodlar içerebilir.
@@ -2837,14 +2914,17 @@ Bunu çalıştırarak, sisteminiz tehlikeye atılabilir.",
'imagemaxsize' => "Resim boyutu sınırı:<br />''(dosya açıklama sayfaları için)''",
'thumbsize' => 'Küçük boyut:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|sayfa|sayfa}}',
-'file-info' => '(dosya boyutu: $1, MIME tipi: $2)',
-'file-info-size' => '($1 × $2 piksel, dosya boyutu: $3, MIME tipi: $4)',
-'file-nohires' => '<small>Daha yüksek çözünürlüğe sahip sürüm bulunmamaktadır.</small>',
-'svg-long-desc' => '(SVG dosyası, sözde $1 × $2 piksel, dosya boyutu: $3)',
+'file-info' => 'dosya boyutu: $1, MIME tipi: $2',
+'file-info-size' => '$1 × $2 piksel, dosya boyutu: $3, MIME tipi: $4',
+'file-nohires' => '<small>Daha yüksek çözünürlük yok.</small>',
+'svg-long-desc' => 'SVG dosyası, sözde $1 × $2 piksel, dosya boyutu: $3',
'show-big-image' => 'Tam çözünürlük',
'show-big-image-thumb' => '<small>Ön izleme boyutu: $1 × $2 piksel</small>',
'file-info-gif-looped' => 'döngüye girdi',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kare|kare}}',
+'file-info-png-looped' => 'döngüye girdi',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|defa|defa}} oynatıldı',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
# Special:NewFiles
'newimages' => 'Yeni dosya galerisi',
@@ -2865,11 +2945,11 @@ Bunu çalıştırarak, sisteminiz tehlikeye atılabilir.",
'hours-abbrev' => 's',
# Bad image list
-'bad_image_list' => 'Format ÅŸu ÅŸekildedir:
+'bad_image_list' => 'Biçim aşağıdaki gibidir:
-Sadece liste öğeleri (* ile başlayanlar) dikkate alınmaktadır.
+Sadece liste öğeleri (* ile başlayan satırlar) dikkate alınmaktadır.
Satırdaki ilk bağlantı, kötü dosyaya giden bir bağlantı olmalıdır.
-Ondan sonraki bağlantılar istisna olarak kabul edilmektedir. Örneğin: dosya, sayfada satır içinde görünebilir.',
+Takip eden bağlantılar istisna olarak kabul edilmektedir. Örneğin: dosya, sayfada satır içinde görünebilir.',
# Variants for Tajiki language
'variantname-tg' => 'tg',
@@ -3010,6 +3090,7 @@ Ondan sonraki bağlantılar istisna olarak kabul edilmektedir. Örneğin: dosya,
'exif-gpsareainformation' => 'GPS alan adı',
'exif-gpsdatestamp' => 'GPS zamanı',
'exif-gpsdifferential' => 'GPS differential correction',
+'exif-objectname' => 'Kısa başlık',
# EXIF attributes
'exif-compression-1' => 'Sıkıştırılmamış',
@@ -3177,40 +3258,40 @@ Ondan sonraki bağlantılar istisna olarak kabul edilmektedir. Örneğin: dosya,
'exif-gpsdirection-m' => 'Manyetik yönü',
# External editor support
-'edit-externally' => 'Dosya üzerinde bilgisayarınızda bulunan uygulamalar ile değişiklikler yapın',
+'edit-externally' => 'Dosyayı harici bir uygulamayla değiştirin.',
'edit-externally-help' => '(Daha fazla bilgi için metadaki [http://www.mediawiki.org/wiki/Manual:External_editors dış uygulama ayarları] (İngilizce) sayfasına bakabilirsiniz)',
# 'all' in various places, this might be different for inflected languages
'recentchangesall' => 'hepsi',
'imagelistall' => 'Tümü',
'watchlistall2' => 'Hepsini göster',
-'namespacesall' => 'Hepsi',
+'namespacesall' => 'hepsi',
'monthsall' => 'hepsi',
'limitall' => 'tümü',
# E-mail address confirmation
-'confirmemail' => 'E-posta adresini onayla',
-'confirmemail_noemail' => '[[Special:Preferences|Kullanıcı tercihlerinizde]] tanımlanmış uygun bir e-posta adresiniz yok.',
-'confirmemail_text' => "Viki'nin e-posta işlevlerini kullanmabilmek için, önce e-posta adresinizin doğrulanması gerekiyor.
+'confirmemail' => 'E-posta adresini onayla',
+'confirmemail_noemail' => '[[Special:Preferences|Kullanıcı tercihlerinizde]] tanımlanmış uygun bir e-posta adresiniz yok.',
+'confirmemail_text' => "Viki'nin e-posta işlevlerini kullanmabilmek için, önce e-posta adresinizin doğrulanması gerekiyor.
Adresinize onay e-postası göndermek için aşağıdaki butonu tıklayın.
Gönderilecek iletide adresinizi onaylamak için tarayıcınızla erişebileceğiniz, onay kodu içeren bir bağlantı olacak;
linki tarayıcınıda açın ve e-posta adresinizin geçerliliğini doğrulayın.",
-'confirmemail_pending' => 'Bir doğrulama kodu size zaten e-postalandı;
+'confirmemail_pending' => 'Bir doğrulama kodu size zaten e-postalandı;
Eğer hesabınızı yeni oluşturduysanız, yeni bir kod istemeye çalışmadan önce gelmesini biraz beklemeyi isteyebilirsiniz.',
-'confirmemail_send' => 'Onay kodu gönder',
-'confirmemail_sent' => 'Onay e-postası gönderildi.',
-'confirmemail_oncreate' => 'Bir doğrulama kodu e-posta adresinize gönderildi.
+'confirmemail_send' => 'Onay kodu gönder',
+'confirmemail_sent' => 'Onay e-postası gönderildi.',
+'confirmemail_oncreate' => 'Bir doğrulama kodu e-posta adresinize gönderildi.
Giriş yapmak için bu kod gerekli değildir, ancak bu vikideki herhangi bir e-posta tabanlı özelliği devreye sokmak için bunu sağlamak zorundasınız.',
-'confirmemail_sendfailed' => '{{SITENAME}} Onay maili gönderemedi. Geçersiz karakterler olabilir adresi kontrol edin
+'confirmemail_sendfailed' => '{{SITENAME}} Onay maili gönderemedi. Geçersiz karakterler olabilir adresi kontrol edin
Mail yazılımı iade etti:$1',
-'confirmemail_invalid' => 'Geçersiz onay kodu. Onay kodunun son kullanma tarihi geçmiş olabilir.',
-'confirmemail_needlogin' => 'E-posta adresinizi onaylamak için önce $1 yapmalısınız.',
-'confirmemail_success' => "E-posta adresiniz onaylandı. Oturum açıp Viki'nin tadını çıkarabilirsiniz.",
-'confirmemail_loggedin' => 'E-posta adresiniz onaylandı.',
-'confirmemail_error' => 'Onayınız bilinmeyen bir hata nedeniyle kaydedilemedi.',
-'confirmemail_subject' => '{{SITENAME}} e-posta adres onayı.',
-'confirmemail_body' => 'Birisi, muhtemelen siz, $1 IP adresinden,
+'confirmemail_invalid' => 'Geçersiz onay kodu. Onay kodunun son kullanma tarihi geçmiş olabilir.',
+'confirmemail_needlogin' => 'E-posta adresinizi onaylamak için önce $1 yapmalısınız.',
+'confirmemail_success' => "E-posta adresiniz onaylandı. Oturum açıp Viki'nin tadını çıkarabilirsiniz.",
+'confirmemail_loggedin' => 'E-posta adresiniz onaylandı.',
+'confirmemail_error' => 'Onayınız bilinmeyen bir hata nedeniyle kaydedilemedi.',
+'confirmemail_subject' => '{{SITENAME}} e-posta adres onayı.',
+'confirmemail_body' => 'Birisi, muhtemelen siz, $1 IP adresinden,
{{SITENAME}} sitesinde bu e-posta adresi ile $2 hesabını açtı.
Bu hesabın gerçekten size ait olduğunu onaylamak ve {{SITENAME}} sitesindeki
@@ -3224,8 +3305,33 @@ iptal etmek için aşağıdaki bağlantıyı takip edin:
$5
Bu onay kodu $4 tarihine kadar geçerli olacak.',
-'confirmemail_invalidated' => 'E-posta adresi doğrulaması iptal edildi',
-'invalidateemail' => 'E-posta doğrulamasını iptal et',
+'confirmemail_body_changed' => 'Birisi, muhtemelen siz, $1 IP adresinden,
+{{SITENAME}} sitesinde "$2" hesabı için e-posta adresini değiştirdi.
+
+Bu hesabın gerçekten size ait olduğunu onaylamak ve {{SITENAME}} sitesindeki
+e-posta işlevlerini tekrar aktif hale getirmek için aşağıdakı bağlantıyı tarayıcınızda açın.:
+
+$3
+
+Eğer hesap size ait *değilse*, e-posta adresi doğrulamasını
+iptal etmek için aşağıdaki bağlantıyı takip edin:
+
+$5
+
+Bu onay kodu $4 tarihine kadar geçerli olacak.',
+'confirmemail_body_set' => 'Birisi $1 IP adresiyle {{SITENAME}} sitesinde "$2" kullanıcı hesabının e-posta adresi olarak bu e-posta adresini belirtti.
+
+Eğer bu işlemi yapan sizseniz ve {{SITENAME}} sitesindeki e-posta işlevlerini tekrar aktif etmek istiyorsanız alttaki bağlantıyı tarayıcınızda açmanız gerekiyor:
+
+$3
+
+Eğer bu işlemi yapan siz değilseniz ve böyle bir üyeliğiniz yoksa e-posta onay işlemini iptal etmek için alttaki bağlantıyı tarayıcınızda açmanız gerekiyor:
+
+$5
+
+Bu onay kodu $4 tarihine kadar geçerlidir.',
+'confirmemail_invalidated' => 'E-posta adresi doğrulaması iptal edildi',
+'invalidateemail' => 'E-posta doğrulamasını iptal et',
# Scary transclusion
'scarytranscludedisabled' => '[Vikilerarası çapraz ekleme devre dışı]',
@@ -3270,6 +3376,7 @@ Sayfayı baştan açmak isityorsanız, lütfen onaylayın.",
'table_pager_first' => 'Ä°lk',
'table_pager_last' => 'Son',
'table_pager_limit' => 'Her sayfada $1 nesne göster',
+'table_pager_limit_label' => 'Sayfa başına öğe:',
'table_pager_limit_submit' => 'Git',
'table_pager_empty' => 'Sonuç yok',
@@ -3318,7 +3425,7 @@ Ayrıca [[Special:Watchlist/edit|standart düzenleme sayfasını]] da kullanabil
# Core parser functions
'unknown_extension_tag' => 'Bilinmeyen eklenti etiketi "$1"',
-'duplicate-defaultsort' => 'Uyarı: Varsayılan "$2" sınıflandırma anahtarı, önceki "$1" sınıflandırma anahtarını geçersiz kılıyor.',
+'duplicate-defaultsort' => '\'\'\'Uyarı:\'\'\' Varsayılan "$2" sınıflandırma anahtarı, önceki "$1" sınıflandırma anahtarını geçersiz kılıyor.',
# Special:Version
'version' => 'Sürüm',
@@ -3326,6 +3433,7 @@ Ayrıca [[Special:Watchlist/edit|standart düzenleme sayfasını]] da kullanabil
'version-specialpages' => 'Özel sayfalar',
'version-parserhooks' => 'Derleyici çengelleri',
'version-variables' => 'DeÄŸiÅŸkenler',
+'version-skins' => 'Görünümler',
'version-other' => 'DiÄŸer',
'version-mediahandlers' => 'Ortam iÅŸleyiciler',
'version-hooks' => 'Çengeller',
@@ -3337,6 +3445,13 @@ Ayrıca [[Special:Watchlist/edit|standart düzenleme sayfasını]] da kullanabil
'version-hook-subscribedby' => 'Abone olan',
'version-version' => '(Sürüm $1)',
'version-license' => 'Lisans',
+'version-poweredby-credits' => "Bu wiki '''[http://www.mediawiki.org/ MediaWiki]''' programı kullanılarak oluşturulmuştur, telif © 2001-$1 $2.",
+'version-poweredby-others' => 'diÄŸerleri',
+'version-license-info' => "MediaWiki özgür bir yazılımdır; MediaWiki'yi, Özgür Yazılım Vakfı tarafından yayımlanmış olan GNU Genel Kamu Lisansının 2. veya (seçeceğiniz) daha sonraki bir sürümünün koşulları altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.
+
+MediaWiki yazılımı faydalı olacağı ümidiyle dağıtılmaktadır; ancak kastedilen SATILABİLİRLİK veya BELİRLİ BİR AMACA UYGUNLUK garantisi hariç HİÇBİR GARANTİSİ YOKTUR. Daha fazla ayrıntı için GNU Genel Kamu Lisansı'na bakınız.
+
+Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansının bir kopyasını] da edinmiş olmalısınız; eğer edinmediyseniz, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA adresine yazın veya [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lisansı çevrim içi olarak okuyun].",
'version-software' => 'Yüklü yazılım',
'version-software-product' => 'Ürün',
'version-software-version' => 'Versiyon',
@@ -3387,10 +3502,10 @@ Dosya adını "{{ns:file}}:" öneki olmadan gir.',
# External image whitelist
'external_image_whitelist' => ' #Bu satırı olduğu gibi bırakın<pre>
#Düzenli ifade parçalarını (sadece // arasında kalan kısmı) aşağıya ekleyin
-#Bunlar dış (hotlink) resimlerin URLleri ile eşlenecektir
+#Bunlar harici (hotlink) resimlerin URLleri ile eÅŸlenecektir
#Eşleşenler resim olarak görünecek, aksi takdirde sadece resme bir bağlantı görünecektir
# # ile başlayan satırlar yorum olarak muamele görecektir
-#Bu büyük-küçük harf duyarsızdır
+#Büyük-küçük harf duyarsızdır
#Bütün düzenli ifade parçalarını bu satırın üstüne ekleyin. Bu satırı olduğu gibi bırakın</pre>',
@@ -3407,6 +3522,15 @@ Dosya adını "{{ns:file}}:" öneki olmadan gir.',
'tags-edit' => 'deÄŸiÅŸtir',
'tags-hitcount' => '$1 {{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklik}}',
+# Special:ComparePages
+'comparepages' => 'Sayfaları karşılaştır',
+'compare-selector' => 'Sayfa sürümlerini karşılaştır',
+'compare-page1' => 'Sayfa 1',
+'compare-page2' => 'Sayfa 2',
+'compare-rev1' => 'Sürüm 1',
+'compare-rev2' => 'Sürüm 2',
+'compare-submit' => 'Karşılaştır',
+
# Database error messages
'dberr-header' => 'Bu vikinin bir sorunu var',
'dberr-problems' => 'Üzgünüz! Bu site teknik zorluklar yaşıyor.',
@@ -3423,8 +3547,13 @@ Dosya adını "{{ns:file}}:" öneki olmadan gir.',
'htmlform-float-invalid' => 'Belirttiğiniz değer bir sayı değil.',
'htmlform-int-toolow' => "Belirttiğiniz değer asgari $1'in altında",
'htmlform-int-toohigh' => "Belirttiğiniz değer azami $1'in üstünde",
+'htmlform-required' => 'Bu deÄŸer gereklidir',
'htmlform-submit' => 'Gönder',
'htmlform-reset' => 'DeÄŸiÅŸiklikleri geri al',
'htmlform-selectorother-other' => 'DiÄŸer',
+# SQLite database support
+'sqlite-has-fts' => '$1 tam-metin arama desteÄŸi ile',
+'sqlite-no-fts' => '$1 tam-metin arama desteği olmaksızın',
+
);
diff --git a/languages/messages/MessagesTs.php b/languages/messages/MessagesTs.php
index 146080bd..bec0df41 100644
--- a/languages/messages/MessagesTs.php
+++ b/languages/messages/MessagesTs.php
@@ -16,7 +16,7 @@ $messages = array(
'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',
+'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",
diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php
index a92e6efc..6fc942c9 100644
--- a/languages/messages/MessagesTt_cyrl.php
+++ b/languages/messages/MessagesTt_cyrl.php
@@ -105,33 +105,103 @@ $namespaceAliases = array(
'Törkem_bäxäse' => NS_CATEGORY_TALK,
);
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'Икеле_күчеш' ),
+ 'BrokenRedirects' => array( 'Өзелгән_күчеш' ),
+ 'Userlogin' => array( 'Кулланучы_иÑеме' ),
+ 'Userlogout' => array( 'Чыгу' ),
+ 'CreateAccount' => array( 'Теркәлү' ),
+ 'Preferences' => array( 'Көйләнмәләр' ),
+ 'Watchlist' => array( 'Күзәтү_иÑемлеге' ),
+ 'Recentchanges' => array( 'Соңгы_үзгәртүләр' ),
+ 'Upload' => array( 'Йөкләү' ),
+ 'Listfiles' => array( 'Файллар_иÑемлеге' ),
+ 'Newimages' => array( 'Яңа_файл' ),
+ 'Listusers' => array( 'Кулланучылар_иÑемлеге' ),
+ 'Listgrouprights' => array( 'Төркемнәр_иÑемлеге' ),
+ 'Statistics' => array( 'СтатиÑтика' ),
+ 'Randompage' => array( 'Очраклы_мәкалә' ),
+ 'Uncategorizedpages' => array( 'Үзләштерелмәгән_битләр' ),
+ 'Uncategorizedcategories' => array( 'Үзләштерелмәгән__бүлекләр' ),
+ 'Uncategorizedimages' => array( 'Үзләштерелмәгән_файллар' ),
+ 'Uncategorizedtemplates' => array( 'Үзләштерелмәгән__үрнәкләр' ),
+ 'Unusedcategories' => array( 'Кулланылмаучы_бүлекләр' ),
+ 'Unusedimages' => array( 'Кулланылмаучы__файллар' ),
+ 'Wantedpages' => array( 'Мондый_бит_юк' ),
+ 'Wantedcategories' => array( 'Мондый_бүлек_юк' ),
+ 'Wantedfiles' => array( 'Мондый_файл_юк' ),
+ 'Wantedtemplates' => array( 'Мондый_үрнәк_юк' ),
+ 'Mostcategories' => array( 'Зур_төркемнәр' ),
+ 'Mostrevisions' => array( 'Зур_үзгәртүләр' ),
+ 'Fewestrevisions' => array( 'Кечкенә_үзгәртүләр' ),
+ 'Shortpages' => array( 'КыÑка_битләр' ),
+ 'Longpages' => array( 'Озын_битләр' ),
+ 'Newpages' => array( 'Яңа_бит' ),
+ 'Ancientpages' => array( 'ИÑке_битләр' ),
+ 'Protectedpages' => array( 'Якланган_битләр' ),
+ 'Protectedtitles' => array( 'Якланган_башлыклар' ),
+ 'Allpages' => array( 'Барлык_битләр' ),
+ 'Specialpages' => array( 'МахÑуÑ_битләр' ),
+ 'Contributions' => array( 'Кертемнәр' ),
+ 'Emailuser' => array( 'Кулланучының_E-mail\'лы' ),
+ 'Confirmemail' => array( 'Электрон_почтаны_раÑлау' ),
+ 'Whatlinkshere' => array( 'Биткә_юнәлтүче_Ñылтамалар' ),
+ 'Recentchangeslinked' => array( 'Бәйләнгән_Ñоңгы_үзгәртүләр' ),
+ 'Movepage' => array( 'Битне_күчерү' ),
+ 'Booksources' => array( 'Китап_чыганаклары' ),
+ 'Categories' => array( 'Төркемнәр' ),
+ 'Export' => array( 'ЭкÑпорт' ),
+ 'Version' => array( 'Юрама' ),
+ 'Allmessages' => array( 'Барлык_хатлар' ),
+ 'Log' => array( 'Көндәлек' ),
+ 'Import' => array( 'Импорт' ),
+ 'Mypage' => array( 'Сәхифәм' ),
+ 'Mytalk' => array( 'БәхәÑем' ),
+ 'Listadmins' => array( 'Идарәчеләр_иÑемлеге' ),
+ 'Listbots' => array( 'Ботлар_иÑемлеге' ),
+ 'Popularpages' => array( 'ПопулÑÑ€_битләр' ),
+ 'Search' => array( 'Эзләү' ),
+ 'Tags' => array( 'Теглар' ),
+ 'Activeusers' => array( 'Ðктив_кулланучылар' ),
+);
+
$magicWords = array(
- 'redirect' => array( '0', '#yünältü', '#перенаправление', '#перенапр', '#REDIRECT' ),
- 'notoc' => array( '0', '__ETYUQ__', '__БЕЗ_ОГЛ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__NOTOC__' ),
+ 'redirect' => array( '0', '#ЮÐӘЛТҮ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БÐШЛЫКЮК__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
'forcetoc' => array( '0', '__ETTIQ__', '__ОБЯЗ_ОГЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ET__', '__ОГЛ__', '__ОГЛÐВЛЕÐИЕ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BÃœLEMTÖZÄTÃœYUQ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'AĞIMDAĞI_AY', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'AÄžIMDAÄžI_AY_Ä°SEME', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'AÄžIMDAÄžI_AY_Ä°SEME_GEN', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentday' => array( '1', 'AÄžIMDAÄžI_KÖN', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'AÄžIMDAÄžI_KÖN_Ä°SEME', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AĞIMDAĞI_YIL', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AĞIMDAĞI_WAQIT', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
- 'numberofarticles' => array( '1', 'MÄQÄLÄ_SANI', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
- 'pagename' => array( '1', 'BÄ°TÄ°SEME', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
- 'namespace' => array( '1', 'Ä°SEMARA', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'toc' => array( '0', '__ЭЧТЕЛЕК__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БҮЛЕКҮЗГӘРТҮЮК__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ', 'ÐГЫМДÐГЫ_ÐЙ2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ_ИСЕМЕ_GEN', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentday' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ÐГЫМДÐГЫ_ЕЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ÐГЫМДÐГЫ_Ð’ÐКЫТ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'numberofarticles' => array( '1', 'МӘКÐЛӘ_СÐÐЫ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'pagename' => array( '1', 'БИТ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'namespace' => array( '1', 'ИСЕМÐӘР_МӘЙДÐÐЫ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'msg' => array( '0', 'ХӘБӘР', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
'subst' => array( '0', 'TÖPÇEK:', 'ПОДСТ:', 'ПОДСТÐÐОВКÐ:', 'SUBST:' ),
- 'img_right' => array( '1', 'uñda', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'sulda', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'yuq', 'без', 'none' ),
- 'int' => array( '0', 'EÇKE:', 'Ð’ÐУТР:', 'INT:' ),
- 'sitename' => array( '1', 'SÄXÄ°FÄİSEME', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'img_right' => array( '1', 'уңда', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'Ñулда', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'юк', 'без', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'үзәк', 'центр', 'center', 'centre' ),
+ 'int' => array( '0', 'ЭЧКЕ:', 'Ð’ÐУТР:', 'INT:' ),
+ 'sitename' => array( '1', 'СӘХИФӘ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
'ns' => array( '0', 'İA:', 'ПИ:', 'NS:' ),
'localurl' => array( '0', 'URINLIURL:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
'localurle' => array( '0', 'URINLIURLE:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
+ 'language' => array( '0', '#ТЕЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'махÑуÑ', 'ÑлужебнаÑ', 'special' ),
+ 'tag' => array( '0', 'тамга', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
+ 'noindex' => array( '1', '__ИÐДЕКССЫЗ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
);
+$linkTrail = '/^([a-zабвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑÓ˜Ó™Ó¨Ó©Ò®Ò¯Ò–Ò—Ò¢Ò£ÒºÒ»]+)(.*)$/sDu';
+
$messages = array(
# User preference toggles
'tog-underline' => 'Сылтамаларның аÑтына Ñызу:',
@@ -148,8 +218,7 @@ $messages = array(
'tog-editsection' => 'Һәр бүлектә «үзгәртү» ÑылтамаÑÑ‹ күрÑәтелÑен',
'tog-editsectiononrightclick' => 'Бүлек иÑеменә тычканның уң чирттермәÑе белән төрткәч үзгәртү бите ачылÑын (JavaScript кирәк)',
'tog-showtoc' => 'Эчтәлек күрÑәтелÑен (3 тән күбрәк башламлы битләрдә)',
-'tog-rememberpassword' => 'ХиÑап Ñзмам бу компьютерда хәтерләнÑен',
-'tog-editwidth' => 'Үзгәртү урыны күзәтүче тәрәзәÑенең тулы киңлегендә',
+'tog-rememberpassword' => 'ХиÑап Ñзмамны бу браузерда ÑакланÑын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)',
'tog-watchcreations' => 'Төзегән битләрем күзәтү иÑемлегемә Ó©ÑтәлÑен',
'tog-watchdefault' => 'Үзгәрткән битләрем күзәтү иÑемлегемә Ó©ÑтәлÑен',
'tog-watchmoves' => 'Күчергән битләрем күзәтү иÑемлегемә Ó©ÑтәлÑен',
@@ -295,31 +364,21 @@ $messages = array(
'faqpage' => 'Project:ЕБС',
# Vector skin
-'vector-action-addsection' => 'Яңа тема Ó©ÑÑ‚Ó™Ò¯',
-'vector-action-delete' => 'Бетерү',
-'vector-action-move' => 'Күчерү',
-'vector-action-protect' => 'Яклау',
-'vector-action-undelete' => 'Кайтару',
-'vector-action-unprotect' => 'Яклауны бетерү',
-'vector-namespace-category' => 'Төркем',
-'vector-namespace-help' => 'Ярдәм бите',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Бит',
-'vector-namespace-media' => 'Медиа-бит',
-'vector-namespace-mediawiki' => 'Хәбәр',
-'vector-namespace-project' => 'Проект бите',
-'vector-namespace-special' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚',
-'vector-namespace-talk' => 'БәхәÑ',
-'vector-namespace-template' => 'Үрнәк',
-'vector-namespace-user' => 'Кулланучы бите',
-'vector-view-create' => 'Төзү',
-'vector-view-edit' => 'Үзгәртү',
-'vector-view-history' => 'Тарихын карау',
-'vector-view-view' => 'Уку',
-'vector-view-viewsource' => 'Чыганагын карау',
-'actions' => 'Хәрәкәт',
-'namespaces' => 'ИÑемнәр мәйданы',
-'variants' => 'Төрләр',
+'vector-action-addsection' => 'Яңа тема Ó©ÑÑ‚Ó™Ò¯',
+'vector-action-delete' => 'Бетерү',
+'vector-action-move' => 'Күчерү',
+'vector-action-protect' => 'Яклау',
+'vector-action-undelete' => 'Кайтару',
+'vector-action-unprotect' => 'Яклауны бетерү',
+'vector-simplesearch-preference' => 'Эзләү өчен киңәйтелгән Ñрдәм хәбәрләрен күрÑәтү («Векторлы» бизәлеше өчен генә кулланылыа)',
+'vector-view-create' => 'Төзү',
+'vector-view-edit' => 'Үзгәртү',
+'vector-view-history' => 'Тарихын карау',
+'vector-view-view' => 'Уку',
+'vector-view-viewsource' => 'Чыганагын карау',
+'actions' => 'Хәрәкәт',
+'namespaces' => 'ИÑемнәр мәйданы',
+'variants' => 'Төрләр',
'errorpagetitle' => 'Хата',
'returnto' => '$1 битенә кайту.',
@@ -380,6 +439,9 @@ $messages = array(
Бу биткә Ñоңарак керүегез Ñорала.
$1',
+'pool-timeout' => 'КыÑылуның вакыты узды',
+'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}} турында',
@@ -546,7 +608,8 @@ $2',
'yourname' => 'Кулланучы иÑеме:',
'yourpassword' => 'СерÑүз:',
'yourpasswordagain' => 'СерÑүзне кабат кертү:',
-'remembermypassword' => 'Кулланучы иÑемемне бу компьютерда онытмаÑка',
+'remembermypassword' => 'ХиÑап Ñзмамны бу браузерда ÑакланÑын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)',
+'securelogin-stick-https' => 'Керүдән Ñоң HTTPS буенча тоташтыруны дәвам итәргә',
'yourdomainname' => 'Сезнең доменыгыз:',
'externaldberror' => 'Тышкы мәгълүмат базаÑÑ‹ Ñрдәмендә Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ò¯Ñ‚ÐºÓ™Ð½Ð´Ó™ хата чыкты, ÑиÑÓ™ тышкы хиÑап Ñзмагызга үзгәрешләр кертү хокукыгыз юк.',
'login' => 'Керү',
@@ -563,6 +626,7 @@ $2',
'gotaccount' => "Сез инде теркәлдегезме? '''$1'''.",
'gotaccountlink' => 'Керү',
'createaccountmail' => 'Ñлектрон почта аша',
+'createaccountreason' => 'Сәбәп:',
'badretype' => 'Кертелгән ÑерÑүзләр бер үк түгел.',
'userexists' => 'Кертелгән иÑем кулланыла.
Зинһар, башка иÑем Ñайлагыз.',
@@ -583,6 +647,7 @@ $2',
'wrongpasswordempty' => 'СерÑүз юлы буш булырга тиеш түгел.',
'passwordtooshort' => 'СезÑүз $1 {{PLURAL:$1|Ñимволдан}} торырга тиеш.',
'password-name-match' => 'Кертелгән ÑерÑүз кулланучы иÑеменнән аерылырга тиеш.',
+'password-login-forbidden' => 'Бу кулланучы иÑемен һәм ÑерÑүзне куллану тыелган',
'mailmypassword' => 'Электрон почтага Ñңа ÑерÑүз җибәрү',
'passwordremindertitle' => '{{SITENAME}} кулланучыÑына вакытлы ÑерÑүз тапшыру',
'passwordremindertext' => 'Кемдер (бәлки, Ñездер, IP адреÑÑ‹: $1) {{SITENAME}} ($4) өчен Ñңа ÑерÑүз Ñоратты. $2 өчен Ñңа ÑерÑүз: $3. Әгәр бу Ñез булÑагыз, ÑиÑтемага керегез һәм ÑерÑүзне алмаштырыгыз. Яңа ÑерÑүз $5 {{PLURAL:$5|көн}} гамәлдә булачак.
@@ -615,6 +680,9 @@ $2',
'loginlanguagelabel' => 'Тел: $1',
'suspicious-userlogout' => 'Сезнең Ñшчәнлекне бетерү Ñоравыгыз кире кагылды, чөнки ул Ñлгыш браузер ÑиÑÓ™ кÑшлаучы прокÑи аша Ò—Ð¸Ð±Ó™Ñ€ÐµÐ»ÐµÑ€Ð³Ñ Ð¼Ó©Ð¼ÐºÐ¸Ð½.',
+# E-mail sending
+'php-mail-error-unknown' => 'PHP mail() функциÑÑендә билгеÑез хата',
+
# Password reset dialog
'resetpass' => 'СерÑүзне үзгәртү',
'resetpass_announce' => 'Сез Ñлектрон почта аша вакытлыча бирелгән ÑерÑүз Ñрдәмендә кердегез. СиÑтемага керүне төгәлләү өчен Ñңа ÑерÑүз төзегез.',
@@ -665,10 +733,11 @@ $2',
'showlivepreview' => 'Тиз алдан карау',
'showdiff' => 'Кертелгән үзгәртүләр',
'anoneditwarning' => "'''Игътибар''': Сез ÑиÑтемага кермәгәнÑез. IP адреÑыгыз бу битнең тарихына Ñзылачак.",
+'anonpreviewwarning' => "''Сез ÑиÑтемада теркәлмәдегез.Сезнең тарафтан Ñшләнгән барлык үзгәртүләр дә Ñезнең IP-юлламагызны Ñаклауга китерә.''",
'missingsummary' => "'''ИÑкәртү.''' Сез үзгәртүгә кыÑкача таÑвирлау Ñзмадыгыз. Сез «Битне Ñаклау» төймәÑенә тагын бер тапкыр баÑÑагыз, үзгәртүләр таÑвирламаÑыз Ñакланачак.",
'missingcommenttext' => 'ÐÑка таÑвирлама Ñзуыгыз Ñорала.',
-'missingcommentheader' => "'''ИÑкәртү:''' Сез таÑвирламага иÑем бирмәдегез.
-«Битне Ñакларга» төймәÑенә кабат баÑÑагыз, үзгәртүләр иÑемÑез Ñзылачак.",
+'missingcommentheader' => "''ИÑкәртү:''' Сез таÑвирламага иÑем бирмәдегез.
+«{{int:savearticle}}» төймәÑенә кабат баÑÑагыз, үзгәртүләр иÑемÑез Ñзылачак.",
'summary-preview' => 'ТаÑвирламаны алдан карау:',
'subject-preview' => 'БашиÑемне алдан карау:',
'blockedtitle' => 'Кулланучы тыелды',
@@ -739,7 +808,11 @@ $2',
'userjsyoucanpreview' => "'''Ярдәм:''' \"{{int:showpreview}}\" төймәÑенә баÑып, Ñңа JS-файлны тикшереп була.",
'usercsspreview' => "'''Бу бары тик CSS-файлны алдан карау гына, ул әле Ñакланмаган!'''",
'userjspreview' => "'''Бу бары тик JavaScript файлын алдан карау гына, ул әле Ñакланмаган!'''",
-'userinvalidcssjstitle' => "'''Игътибар:''' \"\$1\" бизәү темаÑÑ‹ табылмады. Кулланучының .css һәм .js битләре иÑемнәре бары тик кечкенә (юл) хәрефләрдән генә торырга тиеш икәнен онытмагыз. МиÑалга: {{ns:user}}:Foo/monobook.css, Ó™ {{ns:user}}:Foo/Monobook.css түгел!",
+'sitecsspreview' => "'''онытмагыз, бу бары тик CSS-файлны алдан карау гына.'''
+'''Ул әле Ñакланмаган!'''",
+'sitejspreview' => "'''Бу бары тик JavaScript файлын алдан карау гына.'''
+'''Ул әле Ñакланмаган!'''",
+'userinvalidcssjstitle' => "'''Игътибар:''' \"\$1\" бизәү темаÑÑ‹ табылмады. Кулланучының .css һәм .js битләре иÑемнәре бары тик кечкенә (юл) хәрефләрдән генә торырга тиеш икәнен онытмагыз. МиÑалга: {{ns:user}}:Foo/vector.css, Ó™ {{ns:user}}:Foo/Vector.css түгел!",
'updated' => '(Яңартылды)',
'note' => "'''ИÑкәрмә:'''",
'previewnote' => "'''Бу фәкать алдан карау гына, үзгәртүләрегез әле Ñакланмаган!'''",
@@ -779,9 +852,6 @@ $2',
Әгәр аларның үзгәртелүен теләмәÑәгез, монда Ó©Ñтәмәвегез Ñорала.<br />
Сез Ó©Ñтәмәләрнең авторы булырга ÑиÑÓ™ мәгълүматның ирекле чыганаклардан алынуын күрÑәтергә тиеш (карагыз: $1).
'''ÐœÐХСУС РӨХСӘТТӘРБÐШКРÐВТОРЛЫК ХОКУКЫ БУЕÐЧРСÐКЛÐÐУЧЫ МӘГЪЛҮМÐТЛÐР УРÐÐШТЫРМÐГЫЗ!'''",
-'longpagewarning' => "'''КиÑәтү:''' Бу битнең зурлыгы - $1 килобайт.
-32 Кб ÑиÑÓ™ аннан зуррак битләр кайбер браузерларда Ñлгыш күренергә мөмкин.
-ТекÑтны берничә өлешкә бүләргә тәгъдим ителә.",
'longpageerror' => "'''Ð¥ÐТÐ: Ñакланучы текÑÑ‚ зурлыгы - $1 килобайт, бу $2 килобайт чигеннән күбрәк. Бит Ñаклана алмый.'''",
'readonlywarning' => "'''КиÑәтү: мәгълүматлар базаÑында техник Ñшләр башкарыла, Ñезнең үзгәртүләр хәзер үк Ñаклана алмый.
ТекÑÑ‚ югалмаÑын өчен аны компьютерыгызга Ñаклап тора алаÑыз.'''
@@ -924,6 +994,8 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'revdelete-nologid-title' => 'Көндәлектәге Ñзма хаталы',
'revdelete-no-file' => 'Бу файл бар түгел',
'revdelete-show-file-submit' => 'Әйе',
+'revdelete-selected' => "'''[[:$1]] битенең {{PLURAL:$2|Сайланган юрама|Ñайланган юрамалары}}:'''",
+'logdelete-selected' => "'''Журналның {{PLURAL:$1|Сайланган Ñзма|Ñайланган Ñзмалары}} :'''",
'revdelete-legend' => 'Чикләүләр урнаштыр:',
'revdelete-hide-text' => 'Битнең бу юрамаÑÑ‹ текÑтын Ñшер',
'revdelete-hide-image' => 'Файл Ñчендәгеләрне качыр',
@@ -932,6 +1004,8 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'revdelete-radio-set' => 'Әйе',
'revdelete-radio-unset' => 'Юк',
'revdel-restore' => 'күренүчәнлекне үзгәртү',
+'revdel-restore-deleted' => 'бетерелгән юрамалар',
+'revdel-restore-visible' => 'күрÑәтелгән юрамалар',
'pagehist' => 'битнең тарихы',
'deletedhist' => 'Бетерүләр тарихы',
'revdelete-content' => 'Ñчтәлек',
@@ -1067,6 +1141,7 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'contextlines' => 'Һәрбер табылдыкта күрÑәтелүче юллар Ñаны:',
'contextchars' => 'Бер юлга туры килгән тамгалар:',
'stub-threshold' => '<a href="#" class="stub">ЯÑалма Ñылтамаларның</a> бизәлеше буенча чикләүләр (байтларда):',
+'stub-threshold-disabled' => 'Ябылган',
'recentchangesdays' => 'Соңгы үзгәртүләрне күрÑәтүче көннәр Ñаны:',
'recentchangesdays-max' => '( $1 {{PLURAL:$1|көннән}} дә артык булмаÑка тиеш)',
'recentchangescount' => 'Төп буларак кулланучы үзгәртүләр Ñаны:',
@@ -1098,6 +1173,7 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'prefs-files' => 'Файллар',
'prefs-custom-css' => 'Үземнең CSS',
'prefs-custom-js' => 'Үземнең JS',
+'prefs-common-css-js' => 'Барлык бизәлешләр өчен гомуми CSS/JS:',
'prefs-reset-intro' => 'Бу бит Ñезнең көйләнмәләрегезне бетерү өчен кулланыла. Бу Ñшне башкару нәтиҗәÑендә Ñез Ñңадан үз көйләнмәләрне Ñңадан кайтара алмыйÑыз.',
'prefs-emailconfirm-label' => 'E-mail раÑлау',
'prefs-textboxsize' => 'Үзгәртү тәрәзәÑенең зурлыгы',
@@ -1135,6 +1211,9 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'prefs-advancedrendering' => 'Киңәйтелгән көйләүләр',
'prefs-advancedsearchoptions' => 'Киңәйтелгән көйләүләр',
'prefs-advancedwatchlist' => 'Киңәйтелгән көйләүләр',
+'prefs-displayrc' => 'КүрÑәтү көйләнмәләре',
+'prefs-displaysearchoptions' => 'КүрÑәтү көйләнмәләре',
+'prefs-displaywatchlist' => 'КүрÑәтү көйләнмәләре',
'prefs-diffs' => 'Юрамалар аермаÑÑ‹',
# User rights
@@ -1211,12 +1290,8 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'recentchanges-legend' => 'Соңгы үзгәртүләр көйләүләре',
'recentchangestext' => 'Бу биттә {{grammar:genitive|{{SITENAME}}}} проектының Ñоңгы үзгәртүләре күрÑәтелә.',
'recentchanges-feed-description' => 'Бу агымда Ñоңгы үзгәртүләрне күзәтү.',
-'recentchanges-label-legend' => 'МахÑÑƒÑ Ñ‚Ð°Ð¼Ð³Ð°Ð»Ð°Ñ€: $1.',
-'recentchanges-legend-newpage' => '$1 — Ñңа бит',
'recentchanges-label-newpage' => 'Бу үзгәртү белән Ñңа бит төзелде',
-'recentchanges-legend-minor' => '$1 — кече үзгәртү',
'recentchanges-label-minor' => 'Бу кече үзгәртү',
-'recentchanges-legend-bot' => '$1 — ботның үзгәртүе',
'recentchanges-label-bot' => 'Бу үзгәртү бот белән Ñшләнгән иде',
'rcnote' => 'ÐÑта $4 $5 вакытынна Ñоңгы {{PLURAL:$2|1|$2}} көн Ñчендә булган Ñоңгы {{PLURAL:$1|1|$1}} үзгәртмә күрÑәтелә:',
'rcnotefrom' => "ÐÑтарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрÑәтелгән.",
@@ -1264,6 +1339,7 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'upload_directory_missing' => '$1 Йөкләнү директориÑÑе юк',
'upload_directory_read_only' => 'Моңа Сезнең хокукларыгыз юк һәм веб-Ñервер $1 папкаÑыны йөкли алмый.',
'uploaderror' => 'Файлны йөкләүдә хата',
+'upload-recreate-warning' => "'''Игътибар: Мондый иÑемле файл бетерелгән Ñки иÑеме алмаштырылган '''",
'uploadtext' => "Бу форманы кулланып Ñерверга файллар йөкли алаÑыз. Элегрәк йөкләнелгән файлларны карау өчен [[Special:FileList|йөкләнелгән файллар иÑемлегенә]] мәрәҗәгать итегез. Шулай ук ул [[Special:Log/upload|йөкләнмәләр иÑемлегенә]] һәм [[Special:Log/delete|бетерелгән файллар]] иÑемлегенә дә Ñзыла.
Файлны мәкаләгә йөкләү өчен Сез менә бу үрнәкләрне куллана алаÑыз:
@@ -1297,10 +1373,18 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'filetype-banned-type' => "'''\".\$1\"''' — тыелган файл төре.
{{PLURAL:\$3|Киңәйтелгән файл төре булып|Киңәйтелгән файл төре:}} \$2.",
'filetype-missing' => "Файлның киңәйтелмәÑе юк ''(мәÑәлән,«.jpg»)''.",
+'empty-file' => 'Сезнең тарафтан җибәрелгән файл буш.',
+'file-too-large' => 'Сезнең тарафтан җибәрелгән файл артык зур.',
+'filename-tooshort' => 'Файлның иÑеме артык кыÑка.',
+'filetype-banned' => 'Бу файл төре тыелган.',
+'verification-error' => 'Бу файл әлегә тикшерү узмаган.',
+'illegal-filename' => 'Мондый файл иÑеменә Ñ€Ó©Ñ…Ñәт юк',
'savefile' => 'Файлны Ñаклау',
'uploadedimage' => '«[[$1]]» йөкләнгән',
'overwroteimage' => '«[[$1]]» файлының Ñңа юрамаÑÑ‹ йөкләнелде',
'uploaddisabled' => 'Йөкләү тыелган',
+'copyuploaddisabled' => 'URL адреÑÑ‹ буенча йөкләү Ñбылган.',
+'uploadfromurl-queued' => 'Сезнең йөкләвегез чиратка куелды.',
'uploaddisabledtext' => 'Файлларны йөкләү Ñбылган.',
'upload-source' => 'Файлның чыганагы',
'sourcefilename' => 'Файлның чыганагы:',
@@ -1330,6 +1414,7 @@ JD # Jenoptik
MGP # Pentax
PICT # төрле
#</pre> <!-- ничек бар шулай калдырыгыз -->',
+'upload-success-subj' => 'Йөкләү әйбәт үтте',
# HTTP errors
'http-read-error' => 'HTTP укуда хата.',
@@ -1343,6 +1428,7 @@ PICT # төрле
# Special:ListFiles
'imgfile' => 'файл',
'listfiles' => 'Сүрәтләр иÑемлеге',
+'listfiles_thumb' => 'Миниатюра',
'listfiles_date' => 'Вакыт',
'listfiles_name' => 'ÐÑ‚',
'listfiles_user' => 'Кулланучы',
@@ -1427,7 +1513,6 @@ PICT # төрле
'statistics-edits-average' => 'Бер биткә уртача үзгәртүләр иÑәбе',
'statistics-views-total' => 'Барлык каралган битләр',
'statistics-views-peredit' => 'Үзгәртүләргә карау',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Эшләнәчәк Ñшләр] чираты',
'statistics-users' => 'Теркәлгән [[Special:ListUsers|кулланучылар]]',
'statistics-users-active' => 'Ðктив кулланучылар',
'statistics-users-active-desc' => '{{PLURAL:$1|$1 көн }} өчендә нинди дә булÑа үзгәртүләр керткән кулланучылар',
@@ -1579,7 +1664,6 @@ PICT # төрле
# Watchlist
'watchlist' => 'Күзәтү иÑемлегем',
'mywatchlist' => 'Күзәтү иÑемлегем',
-'watchlistfor' => "('''$1''' өчен)",
'nowatchlist' => 'Күзәтү иÑемлегегездә битләр юк.',
'watchnologin' => 'Кермәдегез',
'watchnologintext' => 'Күзәтү иÑемлегегезне үзгәртү өчен Ñез [[Special:UserLogin|керергә]] тиешÑез.',
@@ -1973,6 +2057,8 @@ $1',
'tooltip-upload' => 'Йөкләүне башлау',
'tooltip-rollback' => "\"Кире кайтару\" Ñоңгы кулланучының бу биттә ÑÑаган '''барлык''' үзгәртүләрен бетерә.",
'tooltip-undo' => 'Бу үзгәртүне алдан карап үткәрмәү. Шулай ук үткәрмәүнең Ñәбәбен Ñзып була.',
+'tooltip-preferences-save' => 'Көйләнмәләрегезне Ñаклау',
+'tooltip-summary' => 'КыÑка иÑемен кертү',
# Stylesheets
'common.css' => '/* Монда урнаштырылган CSS башкаларында да урнашачак */',
@@ -2046,9 +2132,10 @@ $1',
'thumbsize' => 'РәÑемнең кечерәйтелгән юрамаÑÑ‹ өчен:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3{{PLURAL:$1|бит|битләр}}',
-'file-info-size' => '($1 × $2 нокта, файлның зурлыгы: $3, MIME тибы: $4)',
+'file-info' => 'файл зурлыгы: $1, MIME-тип: $2',
+'file-info-size' => '$1 × $2 нокта, файлның зурлыгы: $3, MIME тибы: $4',
'file-nohires' => '<small>Югары ачыклык белән юрама юк.</small>',
-'svg-long-desc' => '(SVG файлы, шартлы $1 × $2 нокта, файлның зурлыгы: $3)',
+'svg-long-desc' => 'SVG файлы, шартлы $1 × $2 нокта, файлның зурлыгы: $3',
'show-big-image' => 'Тулы ачыклык',
'show-big-image-thumb' => '<small>Ðлдан карау зурлыгы: $1 × $2 нокта</small>',
@@ -2093,8 +2180,8 @@ $1',
'exif-colorspace' => 'ТөÑләр тирәлеге',
'exif-componentsconfiguration' => 'ТөÑләр төзелешенең конфигурациÑÑе',
'exif-compressedbitsperpixel' => 'КыÑылудан Ñоң Ñ‚Ó©Ñнең тирәнлеге',
-'exif-pixelydimension' => 'РәÑемнең тулы биеклеге',
-'exif-pixelxdimension' => 'РәÑемнең тулы киңлеге',
+'exif-pixelydimension' => 'РәÑемнең киңлеге',
+'exif-pixelxdimension' => 'РәÑемнең биеклеге',
'exif-makernote' => 'Җитештерүче турында Ó©Ñтәмә мәгълүматлар',
'exif-usercomment' => 'Ó¨Ñтәмә җавап',
'exif-relatedsoundfile' => 'Тавыш файлы җавабы',
@@ -2111,9 +2198,9 @@ $1',
'exif-spectralsensitivity' => 'Спектраль Ñизүчәнлек',
'exif-isospeedratings' => 'ISO Ñктылык Ñизүчәнлеге',
'exif-oecf' => 'OECF (оптоÑлектрик күчерү коÑффициенты)',
-'exif-shutterspeedvalue' => 'Саклау',
-'exif-aperturevalue' => 'Диафрагма',
-'exif-brightnessvalue' => 'Яктылык',
+'exif-shutterspeedvalue' => 'APEX Ñаклау',
+'exif-aperturevalue' => 'APEX диафрагма',
+'exif-brightnessvalue' => 'APEX Ñктылык',
'exif-exposurebiasvalue' => 'ЭкÑÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ ÐºÐ¾Ð¼Ð¿ÐµÐ½ÑациÑÑе',
'exif-maxaperturevalue' => 'Диафрагманың минималь Ñаны',
'exif-subjectdistance' => 'ҖиÑемгә кадәр ераклык',
@@ -2176,6 +2263,8 @@ $1',
'exif-lightsource-9' => 'Яхшы һава торышы',
'exif-lightsource-11' => 'Күләгә',
+'exif-sensingmethod-1' => 'БилгеÑез',
+
'exif-scenecapturetype-0' => 'Стандарт',
'exif-scenecapturetype-1' => 'Ландшафт',
'exif-scenecapturetype-2' => 'Портрет',
@@ -2327,6 +2416,15 @@ $1',
'tags-tag' => 'Тег иÑеме',
'tags-edit' => 'үзгәртү',
+# Special:ComparePages
+'comparepages' => 'Битләрне чагыштыру',
+'compare-selector' => 'Битләрнең юрамаларын чагыштыру',
+'compare-page1' => 'Беренче Ñәхифә',
+'compare-page2' => 'Икенче Ñәхифә',
+'compare-rev1' => 'Беренче юрама',
+'compare-rev2' => 'Икенче юрама',
+'compare-submit' => 'Чагыштыр',
+
# Database error messages
'dberr-header' => 'Бу вики авырлык кичерә',
'dberr-problems' => 'Гафу итегез! Сайтта техник кыенлыклар чыкты.',
diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php
index 389ba6ff..b1c71978 100644
--- a/languages/messages/MessagesTt_latn.php
+++ b/languages/messages/MessagesTt_latn.php
@@ -107,6 +107,7 @@ $messages = array(
'tog-editsection' => 'Här bülektä «üzgärtü» sıltaması kürsätelsen',
'tog-editsectiononrightclick' => 'Bülek isemenä tıçqannıñ uñ çirttermäse belän törtkäç üzgärtü bite açılsın (JavaScript kiräk)',
'tog-showtoc' => 'Eçtälek kürsätelsen (3 tän kübräk başlamlı bitlärdä)',
+'tog-rememberpassword' => 'Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)',
'tog-watchcreations' => 'Tözegän bitlärem küzätü isemlegemä östälsen',
'tog-watchdefault' => 'Üzgärtkän bitlärem küzätü isemlegemä östälsen',
'tog-watchmoves' => 'Küçergän bitlärem küzätü isemlegemä östälsen',
@@ -252,20 +253,21 @@ $messages = array(
'faqpage' => 'Project:YBS',
# Vector skin
-'vector-action-addsection' => 'Yaña tema östäw',
-'vector-action-delete' => 'Beterü',
-'vector-action-move' => 'Küçerü',
-'vector-action-protect' => 'Yaqlaw',
-'vector-action-undelete' => 'Qaytaru',
-'vector-action-unprotect' => 'Yaqlawnı beterü',
-'vector-view-create' => 'Tözü',
-'vector-view-edit' => 'Üzgärtü',
-'vector-view-history' => 'Tarixın qaraw',
-'vector-view-view' => 'Uqu',
-'vector-view-viewsource' => 'Çığanağın qaraw',
-'actions' => 'Xäräkät',
-'namespaces' => 'İsemnär mäydanı',
-'variants' => 'Törlär',
+'vector-action-addsection' => 'Yaña tema östäw',
+'vector-action-delete' => 'Beterü',
+'vector-action-move' => 'Küçerü',
+'vector-action-protect' => 'Yaqlaw',
+'vector-action-undelete' => 'Qaytaru',
+'vector-action-unprotect' => 'Yaqlawnı beterü',
+'vector-simplesearch-preference' => 'Ezläw öçen kiñäytelgän yärdäm xäbärlären kürsätü («Vektorlı» bizäleşe öçen genä qullanılıa)',
+'vector-view-create' => 'Tözü',
+'vector-view-edit' => 'Üzgärtü',
+'vector-view-history' => 'Tarixın qaraw',
+'vector-view-view' => 'Uqu',
+'vector-view-viewsource' => 'Çığanağın qaraw',
+'actions' => 'Xäräkät',
+'namespaces' => 'İsemnär mäydanı',
+'variants' => 'Törlär',
'errorpagetitle' => 'Xata',
'returnto' => '$1 bitenä qaytu.',
@@ -326,6 +328,9 @@ Bu bitne qararğa teläwçelär artıq küp.
Bu bitkä soñaraq kerüegez sorala.
$1',
+'pool-timeout' => 'Qısılunıñ waqıtı uzdı',
+'pool-queuefull' => 'Sorawlarnı saqlaw bite tulı',
+'pool-errorunknown' => 'Bilgesez xata',
# 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}} turında',
@@ -492,7 +497,8 @@ Saytnıñ şäxsi [[Special:Preferences|köylänmälären]] qararğa onıtmağı
'yourname' => 'Qullanuçı iseme:',
'yourpassword' => 'Sersüz:',
'yourpasswordagain' => 'Sersüzne qabat kertü:',
-'remembermypassword' => 'Tanı mine kergändä.',
+'remembermypassword' => 'Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)',
+'securelogin-stick-https' => 'Kerüdän soñ HTTPS buyınça totaştırunı däwam itärgä',
'yourdomainname' => 'Sezneñ domenığız:',
'externaldberror' => 'Tışqı mäğlümat bazası yärdämendä awtentifikatsiä ütkändä xata çıqtı, yäisä tışqı xisap yazmağızğa üzgäreşlär kertü xoquqığız yuq.',
'login' => 'Kerü',
@@ -509,6 +515,7 @@ Saytnıñ şäxsi [[Special:Preferences|köylänmälären]] qararğa onıtmağı
'gotaccount' => "Sez inde terkäldegezme? '''$1'''.",
'gotaccountlink' => 'Kerü',
'createaccountmail' => 'elektron poçta aşa',
+'createaccountreason' => 'Säbäp:',
'badretype' => 'Kertelgän sersüzlär ber ük tügel.',
'userexists' => 'Kertelgän isem qullanıla.
Zinhar, başqa isem saylağız.',
@@ -612,8 +619,11 @@ Sez sersüzegezne üzgärtkän yäisä yaña waqıtlı sersüz soratqan bulırğ
'showlivepreview' => 'Tiz aldan qaraw',
'showdiff' => 'Kertelgän üzgärtülär',
'anoneditwarning' => "'''İğtibar''': Sez sistemağa kermägänsez. IP adresığız bu bitneñ tarixına yazılaçaq.",
+'anonpreviewwarning' => "''Sez sistemada terkälmädegez.Sezneñ taraftan eşlängän barlıq üzgärtülär dä sezneñ IP-yullamağıznı saqlawğa kiterä.''",
'missingsummary' => "'''İskärtü.''' Sez üzgärtügä qısqaça taswirlaw yazmadığız. Sez «Bitne saqlaw» töymäsenä tağın ber tapqır bassağız, üzgärtülär taswirlamasız saqlanaçaq.",
'missingcommenttext' => 'Asqa taswirlama yazuığız sorala.',
+'missingcommentheader' => "''İskärtü:''' Sez taswirlamağa isem birmädegez.
+«{{int:savearticle}}» töymäsenä qabat bassağız, üzgärtülär isemsez yazılaçaq.",
'summary-preview' => 'Taswirlamanı aldan qaraw:',
'subject-preview' => 'BaÅŸisemne aldan qaraw:',
'blockedtitle' => 'Qullanuçı tıyıldı',
@@ -684,6 +694,7 @@ Monı '''Mozilla / Firefox''': ''Ctrl+Shift+R'', '''Safari''': ''Cmd+Shift+R'',
'userjsyoucanpreview' => "'''Yärdäm:''' \"{{int:showpreview}}\" töymäsenä basıp, yaña JS-faylnı tikşerep bula.",
'usercsspreview' => "'''Bu barı tik CSS-faylnı aldan qaraw ğına, ul äle saqlanmağan!'''",
'userjspreview' => "'''Bu barı tik JavaScript faylın aldan qaraw ğına, ul äle saqlanmağan!'''",
+'userinvalidcssjstitle' => "'''İğtibar:''' \"\$1\" bizäw teması tabılmadı. Qullanuçınıñ .css häm .js bitläre isemnäre barı tik keçkenä (yul) xäreflärdän genä torırğa tieş ikänen onıtmağız. Misalğa: {{ns:user}}:Foo/vector.css, ä {{ns:user}}:Foo/Vector.css tügel!",
'updated' => '(Yañartıldı)',
'note' => "'''İskärmä:'''",
'previewnote' => "'''Bu fäqät aldan qaraw ğına, üzgärtüläregez äle saqlanmağan!'''",
@@ -723,9 +734,6 @@ Sez östämälärneñ avtorı bulırğa yäisä mäğlümatnıñ irekle çığan
Ägär alarnıñ üzgärtelüen telämäsägez, monda östämäwegez sorala.<br />
Sez östämälärneñ avtorı bulırğa yäisä mäğlümatnıñ irekle çığanaqlardan alınuın kürsätergä tieş (qarağız: $1).
'''MAXSUS RÖXSÄTTÄN BAŞQA AVTORLIQ XOQUQI BUYINÇA SAQLANUÇI MÄĞLÜMATLAR URNAŞTIRMAĞIZ!'''",
-'longpagewarning' => "'''Kisätü:''' Bu bitneñ zurlığı - $1 kilobayt.
-32 Kb yäisä annan zurraq bitlär qayber brauzerlarda yalğış kürenergä mömkin.
-Tekstnı berniçä öleşkä bülärgä täğdim itelä.",
'longpageerror' => "'''XATA: saqlanuçı tekst zurlığı - $1 kilobayt, bu $2 kilobayt çigennän kübräk. Bit saqlana almıy.'''",
'readonlywarning' => "'''Kisätü: mäğlümatlar bazasında texnik eşlär başqarıla, sezneñ üzgärtülär xäzer ük saqlana almıy.
Tekst yuğalmasın öçen anı kompyuterığızğa saqlap tora alasız.'''
@@ -870,6 +878,8 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
'revdelete-radio-set' => 'Äye',
'revdelete-radio-unset' => 'Yuq',
'revdel-restore' => 'kürenüçänlekne üzgärtü',
+'revdel-restore-deleted' => 'beterelgän yuramalar',
+'revdel-restore-visible' => 'kürsätelgän yuramalar',
'pagehist' => 'bitneñ tarixı',
'deletedhist' => 'Beterülär tarixı',
'revdelete-content' => 'eçtälek',
@@ -1005,6 +1015,7 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'contextlines' => 'Härber tabıldıqta kürsätelüçe yullar sanı:',
'contextchars' => 'Ber yulğa turı kilgän tamğalar:',
'stub-threshold' => '<a href="#" class="stub">Yasalma sıltamalarnıñ</a> bizäleşe buyınça çikläwlär (baytlarda):',
+'stub-threshold-disabled' => 'Yabılğan',
'recentchangesdays' => 'Soñğı üzgärtülärne kürsätüçe könnär sanı:',
'recentchangesdays-max' => '( $1 {{PLURAL:$1|könnän}} dä artıq bulmasqa tieş)',
'recentchangescount' => 'Töp bularaq qullanuçı üzgärtülär sanı:',
@@ -1036,6 +1047,7 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'prefs-files' => 'Fayllar',
'prefs-custom-css' => 'Üzemneñ CSS',
'prefs-custom-js' => 'Üzemneñ JS',
+'prefs-common-css-js' => 'Barlıq bizäleşlär öçen ğomumi CSS/JS:',
'prefs-reset-intro' => 'Bu bit sezneñ köylänmäläregezne beterü öçen qullanıla. Bu eşne başqaru näticäsendä sez yañadan üz köylänmälärne yañadan qaytara almıysız.',
'prefs-emailconfirm-label' => 'E-mail raslaw',
'prefs-textboxsize' => 'Üzgärtü täräzäseneñ zurlığı',
@@ -1073,6 +1085,9 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
'prefs-advancedrendering' => 'Kiñäytelgän köyläwlär',
'prefs-advancedsearchoptions' => 'Kiñäytelgän köyläwlär',
'prefs-advancedwatchlist' => 'Kiñäytelgän köyläwlär',
+'prefs-displayrc' => 'Kürsätü köylänmäläre',
+'prefs-displaysearchoptions' => 'Kürsätü köylänmäläre',
+'prefs-displaywatchlist' => 'Kürsätü köylänmäläre',
'prefs-diffs' => 'Yuramalar ayırması',
# User rights
@@ -1197,6 +1212,7 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
'upload_directory_missing' => '$1 Yöklänü direktoriäse yuq',
'upload_directory_read_only' => 'Moña Sezneñ xoquqlarığız yuq häm web-server $1 papqasını yökli almıy.',
'uploaderror' => 'Faylnı yökläwdä xata',
+'upload-recreate-warning' => "'''İğtibar: Mondıy isemle fayl beterelgän yäki iseme almaştırılğan '''",
'uploadtext' => "Bu formanı qullanıp serverğa fayllar yökli alasız. Elegräk yöklänelgän fayllarnı qaraw öçen [[Special:FileList|Yöklänelgän fayllar isemlegenä]] märäcäğät itegez. Şulay uq ul [[Special:Log/upload|yöklänmälär isemlegenä]] häm [[Special:Log/delete|beterelgän fayllar]] isemlegenä dä yazıla.
Faylnı mäqälägä yökläw öçen Sez menä bu ürnäklärne qullana alasız:
@@ -1230,12 +1246,18 @@ Faylnı mäqälägä yökläw öçen Sez menä bu ürnäklärne qullana alasız:
'filetype-banned-type' => "'''\".\$1\"''' — tıyılğan fayl töre.
{{PLURAL:\$3|Kiñäytelgän fayl töre bulıp|Kiñäytelgän fayl töre:}} \$2.",
'filetype-missing' => "Faylnıñ kiñäytelmäse yuq ''(mäsälän,«.jpg»)''.",
-'successfulupload' => 'Yökläw uñışlı uzdı',
+'empty-file' => 'Sezneñ taraftan cibärelgän fayl buş.',
+'file-too-large' => 'Sezneñ taraftan cibärelgän fayl artıq zur.',
+'filename-tooshort' => 'Faylnıñ iseme artıq qısqa.',
+'filetype-banned' => 'Bu fayl töre tıyılğan.',
+'verification-error' => 'Bu fayl älegä tikşerü uzmağan.',
'uploadwarning' => 'Yökläw kisätmäse',
'savefile' => 'Faylnı saqlaw',
'uploadedimage' => '«[[$1]]» yöklängän',
'overwroteimage' => '«[[$1]]» faylınıñ yaña yuraması yöklänelde',
'uploaddisabled' => 'Yökläw tıyılğan',
+'copyuploaddisabled' => 'URL adresı buyınça yökläw yabılğan.',
+'uploadfromurl-queued' => 'Sezneñ yökläwegez çiratqa quyıldı.',
'uploaddisabledtext' => 'Fayllarnı yökläw yabılğan.',
'upload-source' => 'Faylnıñ çığanağı',
'sourcefilename' => 'Faylnıñ çığanağı:',
@@ -1265,6 +1287,7 @@ JD # Jenoptik
MGP # Pentax
PICT # törle
#</pre> <!-- niçek bar şulay qaldırığız -->',
+'upload-success-subj' => 'Yökläw äybät ütte',
'license' => 'Litsenziäse:',
'license-header' => 'Litsenziäse',
@@ -1907,6 +1930,8 @@ Zinhar başqa isem saylağız.',
'tooltip-upload' => 'Yökläwne başlaw',
'tooltip-rollback' => "\"Kire qaytaru\" soñğı qullanuçınıñ bu bittä yasağan '''barlıq''' üzgärtülären beterä.",
'tooltip-undo' => 'Bu üzgärtüne aldan qarap ütkärmäw. Şulay uq ütkärmäwneñ säbäben yazıp bula.',
+'tooltip-preferences-save' => 'Köylänmäläregezne saqlaw',
+'tooltip-summary' => 'Qısqa isemen kertü',
# Stylesheets
'common.css' => '/* Monda urnaştırılğan CSS başqalarında da urnaşaçaq */',
@@ -1981,7 +2006,10 @@ $1',
'thumbsize' => 'Räsemneñ keçeräytelgän yuraması öçen:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3{{PLURAL:$1|bit|bitlär}}',
+'file-info' => 'fayl zurlığı: $1, MIME-tip: $2',
+'file-info-size' => '$1 × $2 noqta, faylnıñ zurlığı: $3, MIME tibı: $4',
'file-nohires' => '<small>Yuğarı açıqlıq belän yurama yuq.</small>',
+'svg-long-desc' => 'SVG faylı, şartlı $1 × $2 noqta, faylnıñ zurlığı: $3',
'show-big-image' => 'Tulı açıqlıq',
'show-big-image-thumb' => '<small>Aldan qaraw zurlığı: $1 × $2 noqta</small>',
@@ -2221,6 +2249,9 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
'tag-filter-submit' => 'Filtrlaw',
'tags-edit' => 'üzgärtü',
+# Special:ComparePages
+'compare-submit' => 'Çağıştır',
+
# Database error messages
'dberr-header' => 'Bu wiki awırlıq kiçerä',
'dberr-problems' => 'Ğafu itegez! Saytta texnik qıyınlıqlar çıqtı.',
diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php
index bbad4a5c..3b49888f 100644
--- a/languages/messages/MessagesTyv.php
+++ b/languages/messages/MessagesTyv.php
@@ -62,7 +62,7 @@ $messages = array(
'tog-hideminor' => 'Сөөлгү Ó©Ñкерлиишкиннер арында бичии Ó©Ñкерлиишкиннерни чажырар',
'tog-showtoolbar' => 'Ó¨Ñкертир херекÑелдерни көргүзер (JavaScript)',
'tog-editondblclick' => 'Ðрынны Ó©Ñкертирде ийи катап базар (JavaScript)',
-'tog-rememberpassword' => 'Мени Ñактып алыр',
+'tog-rememberpassword' => 'Remember my login on this computer (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchlisthideown' => 'Хайгаарылга даңзызындан мÑÑÒ£ Ó©Ñкерлиишкиннерымны чажырары',
'tog-watchlisthidebots' => 'Хайгаарылга даңзызындан роботтарның Ó©Ñкерлиишкиннерын чажырары',
'tog-watchlisthideminor' => 'Хайгаарылга даңзызындан бичии Ó©Ñкерлиишкиннерны чажырары',
@@ -147,13 +147,12 @@ $messages = array(
'qbspecialpages' => 'ТуÑкай арыннар',
# Vector skin
-'vector-action-delete' => 'Ырадыры',
-'vector-action-move' => 'ШимчÑÑри',
-'vector-action-protect' => 'Камгалаары',
-'vector-namespace-category' => 'Бөлүк',
-'vector-view-edit' => 'Ó¨Ñкертири',
-'vector-view-history' => 'Төөгүнү көөрү',
-'vector-view-view' => 'Ðомчууру',
+'vector-action-delete' => 'Ырадыры',
+'vector-action-move' => 'ШимчÑÑри',
+'vector-action-protect' => 'Камгалаары',
+'vector-view-edit' => 'Ó¨Ñкертири',
+'vector-view-history' => 'Төөгүнү көөрү',
+'vector-view-view' => 'Ðомчууру',
'errorpagetitle' => 'Ðлдаг',
'returnto' => '$1 деп арынже Ñглири.',
@@ -271,7 +270,7 @@ $messages = array(
# Login and logout pages
'yourname' => 'Aжыглакчының ады',
'yourpassword' => 'Чажыт ÑÓ©Ñ',
-'remembermypassword' => 'Ðдымны Ñактып алыры',
+'remembermypassword' => 'Мени бо компютерде Ñактып алыры (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Кирери',
'nav-login-createaccount' => 'Кирери / бүрүткел бижикти бүдүрери',
'userlogin' => 'Кирери / бүрүткел бижикти бүдүрери',
@@ -483,8 +482,6 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Ó©Ñкерлиишкин}}',
'recentchanges' => 'Ðмгы Ó©Ñкерлиишкиннер',
-'recentchanges-legend-newpage' => '$1 — чаа арын',
-'recentchanges-legend-minor' => '$1 — бичии Ó©Ñкерлиишкин',
'recentchanges-label-minor' => 'Бо Ó©Ñкерлиишкин биче-дир',
'rcshowhideminor' => 'Бичии Ó©Ñкерлиишкиннерни $1',
'rcshowhidebots' => 'Роботтарну $1',
@@ -922,6 +919,10 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
'tag-filter-submit' => 'Шүүрү',
'tags-edit' => 'Ó©Ñкертири',
+# Special:ComparePages
+'compare-page1' => 'Ðрын 1',
+'compare-page2' => 'Ðрын 2',
+
# HTML forms
'htmlform-submit' => 'Күүcедири',
diff --git a/languages/messages/MessagesUdm.php b/languages/messages/MessagesUdm.php
index 0235c656..3c0d30c2 100644
--- a/languages/messages/MessagesUdm.php
+++ b/languages/messages/MessagesUdm.php
@@ -37,7 +37,7 @@ $namespaceNames = array(
$linkTrail = '/^([a-zа-ÑÑ‘Óӟӥӧӵ“»]+)(.*)$/sDu';
$fallback8bitEncoding = 'windows-1251';
-$separatorTransformTable = array(',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => ' ', '.' => ',' );
$messages = array(
# User preference toggles
diff --git a/languages/messages/MessagesUg.php b/languages/messages/MessagesUg.php
index 2c5d62c6..0e929755 100644
--- a/languages/messages/MessagesUg.php
+++ b/languages/messages/MessagesUg.php
@@ -6,7 +6,7 @@
*
* @ingroup Language
* @file
- * @comment falls back to Uyghurche‎ (Latin)
+ * @comment falls back to Uighur (Arabic script) - ug-arab.
*/
-$fallback = 'ug-latn';
+$fallback = 'ug-arab';
diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php
index 4cfb5d99..ebbdfcc9 100644
--- a/languages/messages/MessagesUg_arab.php
+++ b/languages/messages/MessagesUg_arab.php
@@ -48,8 +48,7 @@ $messages = array(
'tog-editsection' => '[تەھرىر] ئۇلانمىسىنى Ú†Ûكىپ ئابزاس تەھرىرلەشكە يول قوي',
'tog-editsectiononrightclick' => 'ماۋزۇنى چاشقىنەكتە ئوڭ Ú†Ûكىپ ئابزاس تەھرىرلەشكە يول قوي (JavaScript زۆرۈر)',
'tog-showtoc' => 'مەزمۇن جەدۋىلى كۆرسەت (بىر بەتتە 3 تىن ئارتۇق ماۋزۇ بار بەتكە قارىتىلغان)',
-'tog-rememberpassword' => 'بۇ كومپيۇتÛردا كىرگىنىمنى ئەستە ساقلا',
-'tog-editwidth' => 'تەھرىرلەش رامكىسىنى ÙƒÛڭەيتىپ پۈتۈن ئÛكرانغا تولدۇر',
+'tog-rememberpassword' => 'بۇ كومپيۇتÛردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|ÙƒÛˆÙ†|ÙƒÛˆÙ†}})',
'tog-watchcreations' => 'مەن قۇرغان بەتنى كۆزەت تىزىملىكىمگە قوش',
'tog-watchdefault' => 'مەن تەھرىرلىگەن بەتنى كۆزەت تىزىملىكىمگە قوش',
'tog-watchmoves' => 'مەن يۆتكىگەن بەتنى كۆزەت تىزىملىكىمگە قوش',
@@ -193,31 +192,21 @@ $messages = array(
'faqpage' => 'Project:كۆپ كۆرۈلىدىغان مەسىلىلەر',
# Vector skin
-'vector-action-addsection' => 'ÙŠÛÚ­Ù‰ باش تÛما قوش',
-'vector-action-delete' => 'ئۆچۈر',
-'vector-action-move' => 'يۆتكە',
-'vector-action-protect' => 'قوغدا',
-'vector-action-undelete' => 'ئەسلىگە قايتۇر',
-'vector-action-unprotect' => 'قوغدىما',
-'vector-namespace-category' => 'تۈر',
-'vector-namespace-help' => 'ياردەم بەت',
-'vector-namespace-image' => 'ھۆججەت',
-'vector-namespace-main' => 'بەت',
-'vector-namespace-media' => 'ۋاسىتە بÛتى',
-'vector-namespace-mediawiki' => 'ئۇچۇر',
-'vector-namespace-project' => 'قۇرۇلۇش بÛتى',
-'vector-namespace-special' => 'ئالاھىدە بەت',
-'vector-namespace-talk' => 'مۇنازىرە',
-'vector-namespace-template' => 'Ù‚Ûلىپ',
-'vector-namespace-user' => 'ئىشلەتكۈچى بÛتى',
-'vector-view-create' => 'قۇر',
-'vector-view-edit' => 'تەھرىر',
-'vector-view-history' => 'تارىخ كۆرسەت',
-'vector-view-view' => 'ئوقۇ',
-'vector-view-viewsource' => 'مەنبەنى كۆرسەت',
-'actions' => 'مەشغۇلات',
-'namespaces' => 'ئات بوشلۇقى',
-'variants' => 'ۋارىيانتلار',
+'vector-action-addsection' => 'ÙŠÛÚ­Ù‰ باش تÛما قوش',
+'vector-action-delete' => 'ئۆچۈر',
+'vector-action-move' => 'يۆتكە',
+'vector-action-protect' => 'قوغدا',
+'vector-action-undelete' => 'ئەسلىگە قايتۇر',
+'vector-action-unprotect' => 'قوغدىما',
+'vector-simplesearch-preference' => 'ئالىي ئىزدەش تەكلىپىنى ئاچ (Vector تÛرىدىلا)',
+'vector-view-create' => 'قۇر',
+'vector-view-edit' => 'تەھرىر',
+'vector-view-history' => 'تارىخ كۆرسەت',
+'vector-view-view' => 'ئوقۇ',
+'vector-view-viewsource' => 'مەنبەنى كۆرسەت',
+'actions' => 'مەشغۇلات',
+'namespaces' => 'ئات بوشلۇقى',
+'variants' => 'ۋارىيانتلار',
'errorpagetitle' => 'خاتالىق',
'returnto' => '$1 غا قايت.',
@@ -278,6 +267,9 @@ $messages = array(
بۇ بەتنى قايتا زىيارەت قىلىشتىن ئىلگىرى سەل كۈتۈڭ.
$1',
+'pool-timeout' => 'قۇلۇپنى ساقلاش ۋاقىت ھالقىدى',
+'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}} ھەققىدە',
@@ -462,7 +454,7 @@ $2',
'yourname' => 'ئىشلەتكۈچى ئاتى:',
'yourpassword' => 'ئىم:',
'yourpasswordagain' => 'ئاچقۇچنى قايتا بەسىڭ:',
-'remembermypassword' => 'بۇ كومپيۇتÛردا كىرگىنىمنى ئەستە ساقلا',
+'remembermypassword' => 'بۇ كومپيۇتÛردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|ÙƒÛˆÙ†|ÙƒÛˆÙ†}})',
'yourdomainname' => 'دائىرە ئاتىڭىز:',
'externaldberror' => 'بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى Ú¾Ûساباتىڭىزنى ÙŠÛڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.',
'login' => 'تىزىمغا كىر',
@@ -479,6 +471,7 @@ $2',
'gotaccount' => "Ú¾Ûساباتىم بار؟ '''$1'''.",
'gotaccountlink' => 'تىزىمغا كىر',
'createaccountmail' => 'ئÛلخەتتە',
+'createaccountreason' => 'سەۋەب:',
'badretype' => 'سىز كىرگۈزگەن ئىم ماس كەلمىدى.',
'userexists' => 'كىرگۈزگەن ئىشلەتكۈچى ئاتى ئىشلىتىلىۋاتىدۇ.
باشقا ئاتنى تاللاڭ.',
@@ -607,11 +600,12 @@ $2',
'showdiff' => 'ئۆزگەرتىشنى كۆرسەت',
'anoneditwarning' => "'''ئاگاھلاندۇرۇش:''' سىز تÛخى كىرمىدىڭىز.
سىزنىڭ IP ئادرÛسىڭىز بۇ بەتنىڭ تەھرىرلەش تارىخىغا خاتىرىلىنىدۇ.",
+'anonpreviewwarning' => "''سىز تÛخى تىزىمغا كىرمىدىڭىز. سىزنىڭ IP ئادرÛسىڭىز بۇ بەتنىڭ تەھرىرلەش تارىخىغا خاتىرىلىنىدۇ.''",
'missingsummary' => "'''ئەسكەرتىش:''' سىز تەھرىرلەش ئۈزۈندىسى تەمىنلىمىدىڭىز. .
ئەگەر ساقلانى ÙŠÛ•Ù†Û• بىر Ù‚Ûتىم چەكسىڭىز، تەھرىرلىگىنىڭىزنى ئۈزۈندە يوق ھالەتتە ساقلايدۇ.",
'missingcommenttext' => 'تۆۋەندە ئىزاھات كىرگۈزۈڭ.',
-'missingcommentheader' => "'''ئەسكەرتىش:''' سىز ئىزاھاتقا ماۋزۇ تەمىنلىمىدىڭىز.
-ئەگەر ساقلانى ÙŠÛ•Ù†Û• بىر Ù‚Ûتىم چەكسىڭىز، تەھرىرلىگىنىڭىزنى ماۋزۇسىز ھالەتتە ساقلايدۇ.",
+'missingcommentheader' => "'''ئەسكەرتىش:''' سىز ئىزاھاتقا ماۋزۇ تەمىنلىمىدىڭىز.
+ئەگەر \"{{int:savearticle}}\"نى ÙŠÛ•Ù†Û• بىر Ù‚Ûتىم چەكسىڭىز، تەھرىرلىگىنىڭىزنى ماۋزۇسىز ھالەتتە ساقلايدۇ.",
'summary-preview' => 'ئۈزۈندە ئالدىن كۆزىتىش:',
'subject-preview' => 'تÛما/ماۋزۇنى ئالدىن كۆزەت:',
'blockedtitle' => 'ئىشلەتكۈچى چەكلەنگەن',
@@ -688,7 +682,7 @@ $2',
'userjspreview' => "'''دىققەت سىز پەقەت ئۆزىڭىزنىڭ شەخسىي JavaScript نى ئالدىن كۆزىتىۋاتىسىز/سىناۋاتىسىز.'''
'''ئۇ تÛخى ساقلانمىدى!'''",
'userinvalidcssjstitle' => "'''ئاگاھلاندۇرۇش:''' تÛرە\\\"\$1\" مەۋجۇد ئەمەس.
-ئادەتلەنگەن .css Û‹Û• .js تور بەت ماۋزۇسىغا كىچىك ÙŠÛزىلىشتىكى ھەرپ ئىشلىتىلىدۇ، مەسىلەن، {{ns:user}}:Foo/monobook.css بىلەن {{ns:user}}:Foo/Monobook.css ئوخشاش ئەمەس.",
+ئادەتلەنگەن .css Û‹Û• .js تور بەت ماۋزۇسىغا كىچىك ÙŠÛزىلىشتىكى ھەرپ ئىشلىتىلىدۇ، مەسىلەن، {{ns:user}}:Foo/vector.css بىلەن {{ns:user}}:Foo/Vector.css ئوخشاش ئەمەس.",
'updated' => '(ÙŠÛڭىلاندى)',
'note' => "'''ئىزاھات:'''",
'previewnote' => "'''ئÛسىڭىزدە بولسۇنكى بۇ پەقەتلا ئالدىن كۆزىتىش.'''
@@ -730,9 +724,6 @@ $2',
ئەگەر يازمىڭىزنىڭ خالىغانچە ئۆزگەرتىلىشى ياكى قايتا تارقىلىشىنى خالىمىسىڭىز، يوللىماڭ. <br />
سىز يوللىغان مەزمۇننىڭ ئۆزىڭىزنىڭ يازغانلىقى ياكى يەرلىك تور دائىرىسىدىن ياكى ئەركىن مەنبە ($1 دىكى تەپسىلاتنى كۆرۈڭ) دىن كەلگەنلىكىگە كاپالەتلىك قىلىڭ.
'''ئىجازەتكە ئÛرىشمەي تۇرۇپ يوللىماڭ!'''",
-'longpagewarning' => "'''ئاگاھلاندۇرۇش:''' بۇ بەتنىڭ چوڭلۇقى $1 كىلوبايت؛
-بەزى تور كۆرگۈ چوڭلۇقى 32kb غا ÙŠÛقىنلاشقان ياكى Ú†ÙˆÚ­ بولغان بەتنى تەھرىرلىگەندە مەسىلە كۆرۈلۈشى مۇمكىن.
-بۇ بەتنى تÛخىمۇ ÙƒÛ†Ù¾ كىچىك بۆلەككە بۆلۈشنى ئويلىشىپ بÛقىڭ.",
'longpageerror' => "'''خاتالىق: سىز يوللىغان تÛكستنىڭ چوڭلۇقى $1 كىلوبايت، بۇ $2 كىلوبايتلىق ئەڭ Ú†ÙˆÚ­ قىممەتتىن ئÛشىپ كەتتى.'''
ئۇنى ساقلىغىلى بولمايدۇ.",
'readonlywarning' => "'''ئاگاھلاندۇرۇش: ساندان قۇلۇپلىنىپ ئاسرىلىۋاتىدۇ، شۇڭلاشقا ئۆزگەرتىشىڭىزنى ساقلىيالمايسىز.'''
@@ -910,6 +901,8 @@ $1",
'logdelete-failure' => "'''خاتىرىنىڭ كۆرۈنۈشچانلىقىنى تەڭشىيەلمىدى:'''
$1",
'revdel-restore' => 'كۆرۈنۈشچانلىقنى ئۆزگەرت',
+'revdel-restore-deleted' => 'ئۆچۈرۈلگەن تۈزىتىلگەن نەشرى',
+'revdel-restore-visible' => 'كۆرۈنىدىغان تۈزىتىلگەن نەشرى',
'pagehist' => 'بەتنىڭ تارىخى',
'deletedhist' => 'ئۆچۈرۈلگەن تارىخ',
'revdelete-content' => 'مەزمۇن',
@@ -977,11 +970,13 @@ $1",
# Diffs
'history-title' => '"$1" نىڭ ئۆزگەرتىش خاتىرىسى',
'difference' => '(تۈزەتكەن نەشرىلىرىنىڭ پەرقى)',
+'difference-multipage' => '(بەتلەر ئارىسىدىكى پەرق)',
'lineno' => '$1 -قۇر:',
'compareselectedversions' => 'تاللانغان نەشرىنى سÛلىشتۇر',
'showhideselectedversions' => 'تاللانغان تۈزىتىلگەن نەشرىنى كۆرسەت/يوشۇر',
'editundo' => 'ÙŠÛنىۋال',
-'diff-multi' => '({{PLURAL:$1| بىر ئوتتۇرىدىكى تۈزىتىلگەن نەشرى |$1 ئوتتۇرىدىكى تۈزىتىلگەن نەشرى }} كۆرسىتىلمىدى)',
+'diff-multi' => '({{PLURAL:$2|ئىشلەتكۈچى|$2 ئىشلەتكۈچى}} نىڭ{{PLURAL:$1|تۈزىتىلگەن نەشرى|$1 تۈزىتىلگەن نەشرى}} كۆرسىتىلمىدى)',
+'diff-multi-manyusers' => '( $2 دىن كۆپ{{PLURAL:$2|ئىشلەتكۈچى|ئىشلەتكۈچى}} نىڭ {{PLURAL:$1|تۈزىتىلگەن نەشرى|$1 تۈزىتىلگەن نەشرى}} كۆرسىتىلمىدى)',
# Search results
'searchresults' => 'ئىزدەش نەتىجىسى',
@@ -1016,6 +1011,7 @@ $1",
'searchprofile-everything-tooltip' => 'ھەممە مەزمۇننى ئىزدە (مۇنازىرە بەتمۇ ئىچىدە)',
'searchprofile-advanced-tooltip' => 'ئادەتلەنگەن ئات بوشلۇقىدىن ئىزدە',
'search-result-size' => '$1 ({{PLURAL:$2|1 سۆز|$2 سۆز}})',
+'search-result-category-size' => '{{PLURAL:$1|1 ئەزا|$1 ئەزا}}({{PLURAL:$2|1 تارماق تۈر|$2 تارماق تۈر}}, {{PLURAL:$3|1 ھۆججەت|$3 ھۆججەت}})',
'search-result-score' => 'باغلىنىشچانلىق: $1%',
'search-redirect' => '($1 قايتا نىشانلا)',
'search-section' => '(ئابزاس $1)',
@@ -1092,6 +1088,7 @@ $1",
'contextlines' => 'ھەر ئۇلانمىدىكى قۇر سانى:',
'contextchars' => 'ھەر قۇردىكى ھەرپ سانى:',
'stub-threshold' => '<a href="#" class="stub">قىسقا بەت ئۇلانمىسى</a> Ùورمات Ú†Û•Ùƒ قىممىتى (بايت) :',
+'stub-threshold-disabled' => 'چەكلەنگەن',
'recentchangesdays' => 'ÙŠÛقىنقى ئۆزگەرتىشنىڭ كۆرۈنىدىغان ÙƒÛˆÙ† سانى:',
'recentchangesdays-max' => 'ئەڭ چوڭ $1 {{PLURAL:$1|كۈن|كۈن}}',
'recentchangescount' => 'كۆرسىتىدىغان تەھرىرنىڭ كۆڭۈلدىكى سانى:',
@@ -1125,6 +1122,7 @@ $1",
'prefs-files' => 'ھۆججەتلەر',
'prefs-custom-css' => 'ئىختىيارى CSS',
'prefs-custom-js' => 'ئىختىيارى JS',
+'prefs-common-css-js' => 'ھەممە تÛرىدە ھەمبەھىرلەنگەن CSS/JS:',
'prefs-reset-intro' => 'سىز بۇ بەتنى ئىشلىتىپ تەڭشەكلىرىڭىزنى تور بÛكەتنىڭ كۆڭۈلدىكى قىممىتىگە تەڭشىيەلەيسىز.
بۇ مەشغۇلاتتىن يانغىلى بولمايدۇ.',
'prefs-emailconfirm-label' => 'ئÛلخەت جەزملەش:',
@@ -1169,7 +1167,9 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'prefs-advancedrendering' => 'ئالىي تاللانما',
'prefs-advancedsearchoptions' => 'ئالىي تاللانما',
'prefs-advancedwatchlist' => 'ئالىي تاللانما',
-'prefs-display' => 'كۆرسىتىش تاللانما',
+'prefs-displayrc' => 'كۆرسىتىش تاللانما',
+'prefs-displaysearchoptions' => 'كۆرسىتىش تاللانما',
+'prefs-displaywatchlist' => 'كۆرسىتىش تاللانما',
'prefs-diffs' => 'پەرقلەر',
# User rights
@@ -1255,6 +1255,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'right-hideuser' => 'ئىشلەتكۈچى ئاتىنى چەكلە، كۆپچىلىككە نىسبەتەن يوشۇر',
'right-ipblock-exempt' => 'IP چەكلەش، ئاپتوماتىك چەكلەش ۋە دائىرە چەكلەشتىن ئايلىنىپ ئۆت',
'right-proxyunbannable' => 'ۋاكالەتچىنى ئاپتوماتىك چەكلەشتىن ئايلىنىپ ئۆت',
+'right-unblockself' => 'چەكلەشنى بىكار قىل',
'right-protect' => 'قوغداش دەرىجىسىنى ئۆزگەرتىپ، قوغدالغان بەتنى تەھرىرلە',
'right-editprotected' => 'قوغدالغان بەتنى تەھرىرلە (زەنجىرسىمان قۇلۇپلانمىغان)',
'right-editinterface' => 'ئىشلەتكۈچى كۆرۈنمە يۈزىنى تەھرىرلە',
@@ -1277,7 +1278,6 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'right-siteadmin' => 'ساندان قۇلۇپلا ۋە قۇلۇپ ئاچ',
'right-reset-passwords' => 'باشقا ئىشلەتكۈچى ئىمنى ئەسلىگە قايتۇر',
'right-override-export-depth' => 'بەت قەۋەتلىك ئۇلىنىشى بار بەتنى چىقار',
-'right-versiondetail' => 'ÙƒÛڭەيتىلگەن يۇمشاق دÛتال نەشر ئۇچۇرىنى كۆرسەت',
'right-sendemail' => 'باشقا ئىشلەتكۈچىگە ئÛلخەت يوللا',
# User rights log
@@ -1328,14 +1328,9 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'recentchanges-legend' => 'ÙŠÛقىنقى ئۆزگەرتىش تاللانمىسى',
'recentchangestext' => 'بۇ wiki نىڭ ÙŠÛقىنقى ئۆزگىرىشىنى ئىز قوغلا.',
'recentchanges-feed-description' => 'بۇ قانالنىڭ wiki دىكى ÙŠÛقىنقى ئۆزگىرىشىنى ئىز قوغلا.',
-'recentchanges-label-legend' => 'رەسىم چۈشەندۈرۈشى :$1',
-'recentchanges-legend-newpage' => '$1 - ÙŠÛÚ­Ù‰ بەت',
'recentchanges-label-newpage' => 'بۇ Ù‚Ûتىملىق تەھىر ÙŠÛÚ­Ù‰ بەتتىن بىرنى قۇرىدۇ',
-'recentchanges-legend-minor' => '$1 - ئازراقلا تەھرىر',
'recentchanges-label-minor' => 'بۇ ئازراقلا تەھرىرلەش',
-'recentchanges-legend-bot' => '$1 - ماشىنا ئادەم تەھرىرى',
'recentchanges-label-bot' => 'بۇ تەھرىرنى ماشىنا ئادەم ئÛلىپ بارغان',
-'recentchanges-legend-unpatrolled' => '$1 - كۆزىتىلمىگەن تەھرىر',
'recentchanges-label-unpatrolled' => 'بۇ تەھرىر تÛخى كۆزىتىلمىگەن',
'rcnote' => "تۆۋەندىكى $4 $5 ÙŠÛقىنقى {{PLURAL:$2|ÙƒÛˆÙ†|'''$2''' ÙƒÛˆÙ†}} ئىچىدىكى {{PLURAL:$1| '''1''' ئۆزگەرتىش| '''$1''' ئۆزگەرتىش}} خاتىرىسى",
'rcnotefrom' => "تۆۋەندىكىسى '''$2''' نىڭ ئۆزگەرتىشى (ئەڭ كۆپ بولغاندا '''$1''' كۆرسىتىدۇ )",
@@ -1382,6 +1377,8 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'upload_directory_missing' => 'يۈكلەش مۇندەرىجىسى ($1) يوقالغان، تور بەت مۇلازىمىتىرى قۇرالمايدۇ.',
'upload_directory_read_only' => 'تور مۇلازىمىتىرىنىڭ يۈكلەش مۇندەرىجىسى ($1) Ú¯Û• ÙŠÛزىش ھوقۇقى يوق.',
'uploaderror' => 'يۈكلەش خاتالىقى',
+'upload-recreate-warning' => "'''ئاگاھلاندۇرۇش: ئوخشاش ئاتلىق ھۆججەتتىن بىرى ئىلگىرى ئۆچۈرۈلگەن ياكى باشقا جايغا يۆتكەلگەن.'''
+پايدىلىنىش ئۈچۈن بۇ بەتنىڭ ئۆچۈرۈش ۋە يۆتكەش خاتىرىسى بۇ جايدا تەمىنلەندى:",
'uploadtext' => "تۆۋەندىكى كۆزنەكنى ئىشلىتىپ ھۆججەت يۈكلەڭ.
ئىلگىرى يۈكلەنگەن ھۆججەتلەرنى كۆرۈش ياكى ئىزدەشتە [[Special:FileList|ھۆججەت يۈكلەش تىزىملىكى]]Ú¯Û• كىرىپ، (ÙŠÛڭىدىن) يۈكلەنگەننى [[Special:Log/upload|يۈكلەش خاتىرىسى]]دە خاتىرىلىنىدۇ، ئۆچۈرۈلگىنى [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دە خاتىرىلىنىدۇ.
@@ -1417,6 +1414,17 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'filetype-banned-type' => "'''\".\$1\"''' يول قويمايدىغان ھۆججەت تىپى.
يول قويىدىغان {{PLURAL:\$3|بىر|بىر قانچە}} ھۆججەت تىپى \$2.",
'filetype-missing' => 'بۇ ھۆججەتنىڭ ÙƒÛڭەيتىلگەن ئاتى يوق (مەسىلەن ".jpg").',
+'empty-file' => 'يوللىغان ھۆججىتىڭىز بوش.',
+'file-too-large' => 'يوللىغان ھۆججىتىڭىز بەك چوڭ.',
+'filename-tooshort' => 'ھۆججەت ئاتى بەك قىسقا.',
+'filetype-banned' => 'بۇ خىل ھۆججەت چەكلەنگەن.',
+'verification-error' => 'ھۆججەت دەلىللەشتىن ئۆتەلمىدى.',
+'hookaborted' => 'سىز سىنىغان ئۆزگەرتىش قىستۇرما ئىلمەك تەرىپىدىن توختىتىلدى.',
+'illegal-filename' => 'ھۆججەت ئاتىغا يول قويمايدۇ.',
+'overwrite' => 'مەۋجۇد ھۆججەت قاپلاشقا يول قويمايدۇ.',
+'unknown-error' => 'نامەلۇم خاتالىق كۆرۈلدى.',
+'tmp-create-error' => 'ۋاقىتلىق ھۆججەت قۇرالمىدى.',
+'tmp-write-error' => 'ۋاقىتلىق ھۆججەت ÙŠÛزىش خاتالىقى.',
'large-file' => 'تەۋسىيە قىلىنىدىغان ھۆججەت چوڭلۇقى $1 دىن ئÛشىپ كەتمەيدۇ؛
بۇ ھۆججەتنىڭ چوڭلۇقى $2.',
'largefileserver' => 'بۇ ھۆججەتنىڭ چوڭلۇقى مۇلازىمىتىر سەپلىمىسى يول قويىدىغان ھۆججەتتىنمۇ چوڭ.',
@@ -1447,13 +1455,14 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'file-exists-duplicate' => 'بۇ ھۆججەت تۆۋەندىكى{{PLURAL:$1|بىر|بىر قانچە}} ھۆججەت بىلەن تەكرار:',
'file-deleted-duplicate' => 'ئوخشاش ئاتتىكى بىر ھۆججەت ([[:$1]]) بايىلا ئۆچۈرۈلگەن.
سىز قايتا يۈكلەشتىن ئىلگىرى Ø´Û‡ ھۆججەتنىڭ ئۆچۈرۈش خاتىرىسىنى تەكشۈرۈپ بÛقىڭ.',
-'successfulupload' => 'مۇۋەپپەقىيەتلىك يۈكلەندى',
'uploadwarning' => 'يۈكلەش ئاگاھلاندۇرۇشى',
'uploadwarning-text' => 'تۆۋەندىكى ھۆججەت چۈشەندۈرۈشىنى ئۆزگەرتىپ ئاندىن قايتا سىناڭ.',
'savefile' => 'ھۆججەت ساقلا',
'uploadedimage' => '"[[$1]]" يۈكلەنگەن',
'overwroteimage' => ' "[[$1]]" نىڭ ÙŠÛÚ­Ù‰ نەشرى يۈكلەندى',
'uploaddisabled' => 'يۈكلەش چەكلەنگەن',
+'copyuploaddisabled' => 'URL ئارقىلىق يۈكلەش ئىقتىدارى چەكلەنگەن.',
+'uploadfromurl-queued' => 'يۈكلەش قاتارغا تىزىلدى.',
'uploaddisabledtext' => 'ھۆججەت يۈكلەش چەكلەنگەن.',
'php-uploaddisabledtext' => 'PHP ھۆججەت يۈكلەش چەكلەنگەن.
file_uploads تەڭشىكىنى تەكشۈرۈڭ.',
@@ -1475,6 +1484,14 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
قولايلىق بولۇشى ئۈچۈن بۇ ھۆججەتنىڭ ئۆچۈرۈش خاتىرىسى تۆۋەندە تەمىنلەندى:",
'filename-bad-prefix' => "سىز يۈكلىگەن ھۆججەتنىڭ ئاتى'''\\\"\$1\\\"''' دىن باشلىنىپتۇ، بۇ خىل مەنىسى يوق ھۆججەت ئاتىنى رەقەملىك Ùوتو ئاپپارات ئۆزلۈكىدىن ھاسىل قىلىدۇ.
ھۆججىتىڭىزگە تÛخىمۇ ئەھمىيەتلىك ھۆججەت ئاتىدىن بىرنى تاللاڭ.",
+'upload-success-subj' => 'مۇۋەپپەقىيەتلىك يۈكلەندى',
+'upload-success-msg' => '[$2] دىن مۇۋەپپەقىيەتلىك يۈكلىدىڭىز. ئۇنىڭ مەۋجۇد ئورنى: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'يۈكلەش كاشىلىسى',
+'upload-failure-msg' => '[$2] دىن يۈكلەشتە خاتالىق بار:
+
+$1',
+'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> دىن باشلىنىدۇ.',
@@ -1655,7 +1672,6 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'statistics-edits-average' => 'ھەر بىر بەتنىڭ ئوتتۇرىچە تەھرىر سانى',
'statistics-views-total' => 'كۆرسىتىش ئومۇمى سانى',
'statistics-views-peredit' => 'ھەر Ù‚Ûتىملىق تەھرىرنى كۆرسىتىش سانى',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue خىزمەت قاتارى] ئۇزۇنلۇقى',
'statistics-users' => 'خەتلەتكەن [[Special:ListUsers|ئىشلەتكۈچى]]',
'statistics-users-active' => 'ئاكتىپ ئىشلەتكۈچى',
'statistics-users-active-desc' => 'ئالدىنقى {{PLURAL:$1|كۈن|$1 كۈن}} دىكى مەشغۇلات قىلغان ئىشلەتكۈچىلەر',
@@ -1849,34 +1865,40 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'listgrouprights-removegroup-self-all' => 'شەخسىي Ú¾Ûساباتىمدىن ھەممە گۇرۇپپىنى چىقىرىۋەت',
# E-mail user
-'mailnologin' => 'يوللايدىغان ئادرÛس يوق',
-'mailnologintext' => 'سىز ئالدى بىلەن [[Special:UserLogin|تىزىمغا كىر]]ىپ، [[Special:Preferences|مايىللىق]] تەڭشىكىدە ئىناۋەتلىك ئÛلخەت ئادرÛسىڭىزدىن بىرسى بولغاندا ئاندىن باشقا ئىشلەتكۈچىلەرگە ئÛلخەت يوللىيالايسىز.',
-'emailuser' => 'بۇ ئىشلەتكۈچىگە ئÛلخەت يوللا',
-'emailpage' => 'بۇ ئىشلەتكۈچىگە ئÛلخەت يوللا',
-'emailpagetext' => 'سىز تۆۋەندىكى جەدۋەلنى ئىشلىتىپ، بۇ ئىشلەتكۈچىگە ئÛلخەت يوللىيالايسىز.
+'mailnologin' => 'يوللايدىغان ئادرÛس يوق',
+'mailnologintext' => 'سىز ئالدى بىلەن [[Special:UserLogin|تىزىمغا كىر]]ىپ، [[Special:Preferences|مايىللىق]] تەڭشىكىدە ئىناۋەتلىك ئÛلخەت ئادرÛسىڭىزدىن بىرسى بولغاندا ئاندىن باشقا ئىشلەتكۈچىلەرگە ئÛلخەت يوللىيالايسىز.',
+'emailuser' => 'بۇ ئىشلەتكۈچىگە ئÛلخەت يوللا',
+'emailpage' => 'بۇ ئىشلەتكۈچىگە ئÛلخەت يوللا',
+'emailpagetext' => 'سىز تۆۋەندىكى جەدۋەلنى ئىشلىتىپ، بۇ ئىشلەتكۈچىگە ئÛلخەت يوللىيالايسىز.
[[Special:Preferences|ئىشلەتكۈچى مايىللىقىڭىز]]دىكى ئÛلخەت ئادرÛسى "يوللىغۇچى" ستونىدا كۆرۈنىدۇ، مۇشۇنداق بولغاندا Ø´Û‡ ئىشلەتكۈچى سىزگە بىۋاسىتە جاۋاب قايتۇرالايدۇ.',
-'usermailererror' => 'Mail ئوبيÛكتى خاتالىق قايتۇردى:',
-'defemailsubject' => '{{SITENAME}} ئÛلخەت',
-'noemailtitle' => 'ئÛلخەت ئادرÛس يوق',
-'noemailtext' => 'بۇ ئىشلەتكۈچى تÛخى ئىناۋەتلىك ئÛلخەت ئادرÛسى بەلگىلىمىگەن.',
-'nowikiemailtitle' => 'ئÛلخەتكە يول قويمايدۇ',
-'nowikiemailtext' => 'بۇ ئىشلەتكۈچى باشقىلارنىڭ ئÛلخىتىنى قوبۇل قىلماسلىقنى تاللىغان.',
-'email-legend' => 'باشقا {{SITENAME}} ئىشلەتكۈچىگە ئÛلخەت يوللا',
-'emailfrom' => 'يوللىغۇچى:',
-'emailto' => 'قوبۇللىغۇچى:',
-'emailsubject' => 'تÛما:',
-'emailmessage' => 'ئۇچۇر:',
-'emailsend' => 'يوللا',
-'emailccme' => 'ئۇچۇرۇمنىڭ كۆچۈرۈلمىسىدىن بىرنى ئÛلخىتىمگە يوللا.',
-'emailccsubject' => 'ئۇچۇرىڭىزنى كۆچۈرۈدىغان ئورۇن: $1: $2',
-'emailsent' => 'ئÛلخەت يوللاندى',
-'emailsenttext' => 'ئÛلخىتىڭىز يوللاندى.',
-'emailuserfooter' => '$1 بۇ ئÛلخەتنى $2 غا {{SITENAME}} نىڭ "ئÛلخەت ئىشلەتكۈچى" ئىقتىدارى ئارقىلىق يوللانغان.',
+'usermailererror' => 'Mail ئوبيÛكتى خاتالىق قايتۇردى:',
+'defemailsubject' => '{{SITENAME}} ئÛلخەت',
+'usermaildisabled' => 'ئىشلەتكۈچى ئÛلخەت چەكلەنگەن',
+'usermaildisabledtext' => 'سىز بۇ wiki دىكى باشقا ئىشلەتكۈچىگە ئÛلخەت يوللىيالمايسىز.',
+'noemailtitle' => 'ئÛلخەت ئادرÛس يوق',
+'noemailtext' => 'بۇ ئىشلەتكۈچى تÛخى ئىناۋەتلىك ئÛلخەت ئادرÛسى بەلگىلىمىگەن.',
+'nowikiemailtitle' => 'ئÛلخەتكە يول قويمايدۇ',
+'nowikiemailtext' => 'بۇ ئىشلەتكۈچى باشقىلارنىڭ ئÛلخىتىنى قوبۇل قىلماسلىقنى تاللىغان.',
+'email-legend' => 'باشقا {{SITENAME}} ئىشلەتكۈچىگە ئÛلخەت يوللا',
+'emailfrom' => 'يوللىغۇچى:',
+'emailto' => 'قوبۇللىغۇچى:',
+'emailsubject' => 'تÛما:',
+'emailmessage' => 'ئۇچۇر:',
+'emailsend' => 'يوللا',
+'emailccme' => 'ئۇچۇرۇمنىڭ كۆچۈرۈلمىسىدىن بىرنى ئÛلخىتىمگە يوللا.',
+'emailccsubject' => 'ئۇچۇرىڭىزنى كۆچۈرۈدىغان ئورۇن: $1: $2',
+'emailsent' => 'ئÛلخەت يوللاندى',
+'emailsenttext' => 'ئÛلخىتىڭىز يوللاندى.',
+'emailuserfooter' => '$1 بۇ ئÛلخەتنى $2 غا {{SITENAME}} نىڭ "ئÛلخەت ئىشلەتكۈچى" ئىقتىدارى ئارقىلىق يوللانغان.',
+
+# User Messenger
+'usermessage-summary' => 'سىستÛما ئۇچۇرىنى ساقلاپ قال',
+'usermessage-editor' => 'سىستÛما خەۋەرچىسى',
# Watchlist
'watchlist' => 'كۆزەت تىزىملىكىم',
'mywatchlist' => 'كۆزەت تىزىملىكىم',
-'watchlistfor' => "('''$1''' نىڭ كۆزەت تىزىملىكى)",
+'watchlistfor2' => '$1 $2 ئۈچۈن',
'nowatchlist' => 'كۆزەت تىزىملىكىڭىز بوش.',
'watchlistanontext' => '$1 كۆزەت تىزىملىكىڭىزنى كۆرۈپ تەھرىرلەڭ.',
'watchnologin' => 'تىزىمغا كىرمىدى',
@@ -1998,7 +2020,10 @@ $UNWATCHURL زىيارەت قىلىڭ
'revertpage-nouser' => '(چىقىرىۋÛتىلگەن ئىشلەتكۈچى)نىڭ تەھرىرىدىن [[User:$1|$1]] نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئەاسلىگە كەلتۈرۈلدى',
'rollback-success' => '$1 نىڭ تەھرىرى ئەسلىگە كەلتۈرۈلدى؛
$2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىلدى.',
-'sessionfailure' => 'تىزىمغا كىرگەندە مەسىلە كۆرۈلگەندەك تۇرىدۇ؛
+
+# Edit tokens
+'sessionfailure-title' => 'تىزىمغا كىرىش ئۇچۇرى مەغلۇپ بولدى',
+'sessionfailure' => 'تىزىمغا كىرگەندە مەسىلە كۆرۈلگەندەك تۇرىدۇ؛
قوغدىنىش تەدبىرى سۈپىتىدە بۇ مەشغۇلات بىكار قىلىندى.
\\"كەينى\\"نى Ú†Ûكىپ قايتا سىناڭ.',
@@ -2135,19 +2160,22 @@ $1',
'month' => 'ئايدىن بۇيان (ياكى ئىلگىرى):',
'year' => 'يىلدىن بۇيان (ياكى ئىلگىرى):',
-'sp-contributions-newbies' => 'ÙŠÛÚ­Ù‰ قۇرۇلغان ئىشلەتكۈچى تۆھپىسىنىلا كۆرسەت',
-'sp-contributions-newbies-sub' => 'ÙŠÛÚ­Ù‰ Ú¾Ûسابات',
-'sp-contributions-newbies-title' => 'ÙŠÛÚ­Ù‰ Ú¾Ûساباتنىڭ ئىشلەتكۈچى تۆھپىسى',
-'sp-contributions-blocklog' => 'چەكلەنگەن خاتىرە',
-'sp-contributions-deleted' => 'ئۆچۈرۈلگەن ئىشلەتكۈچىنىڭ تۆھپىسى',
-'sp-contributions-logs' => 'خاتىرە',
-'sp-contributions-talk' => 'مۇنازىرە',
-'sp-contributions-userrights' => 'ئىشلەتكۈچى ھوقۇقى باشقۇرۇش',
-'sp-contributions-blocked-notice' => 'بۇ ئىشلەتكۈچى نۆۋەتتە چەكلەنگەن.
+'sp-contributions-newbies' => 'ÙŠÛÚ­Ù‰ قۇرۇلغان ئىشلەتكۈچى تۆھپىسىنىلا كۆرسەت',
+'sp-contributions-newbies-sub' => 'ÙŠÛÚ­Ù‰ Ú¾Ûسابات',
+'sp-contributions-newbies-title' => 'ÙŠÛÚ­Ù‰ Ú¾Ûساباتنىڭ ئىشلەتكۈچى تۆھپىسى',
+'sp-contributions-blocklog' => 'چەكلەنگەن خاتىرە',
+'sp-contributions-deleted' => 'ئۆچۈرۈلگەن ئىشلەتكۈچىنىڭ تۆھپىسى',
+'sp-contributions-logs' => 'خاتىرە',
+'sp-contributions-talk' => 'مۇنازىرە',
+'sp-contributions-userrights' => 'ئىشلەتكۈچى ھوقۇقى باشقۇرۇش',
+'sp-contributions-blocked-notice' => 'بۇ ئىشلەتكۈچى نۆۋەتتە چەكلەنگەن.
پايدىلىنىش ئۈچۈن ÙŠÛقىنقى چەكلەش خاتىرە تۈرلىرى تۆۋەندە تەمىنلەندى:',
-'sp-contributions-search' => 'تۆھپە ئىزدە',
-'sp-contributions-username' => 'IP ئادرÛس ياكى ئىشلەتكۈچى ئاتى:',
-'sp-contributions-submit' => 'ئىزدە',
+'sp-contributions-blocked-notice-anon' => 'بۇ IP ئادرÛس نۆۋەتتە چەكلەنگەن.
+پايدىلىنىش ئۈچۈن تۆۋەندە ÙŠÛقىنقى چەكلەش خاتىرە تۈرلىرى تەمىنلەندى:',
+'sp-contributions-search' => 'تۆھپە ئىزدە',
+'sp-contributions-username' => 'IP ئادرÛس ياكى ئىشلەتكۈچى ئاتى:',
+'sp-contributions-toponly' => 'ئەڭ ÙŠÛÚ­Ù‰ تۈزىتىلگەن نەشرىنىلا كۆرسەت',
+'sp-contributions-submit' => 'ئىزدە',
# What links here
'whatlinkshere' => 'بۇ جايدىكى ئۇلانما',
@@ -2208,7 +2236,6 @@ $1',
'ipb-edit-dropdown' => 'چەكلەش سەۋەبىنى تەھرىرلە',
'ipb-unblock-addr' => '$1 چەكلەشنى بىكار قىل',
'ipb-unblock' => 'چەكلەش بىكار قىلىغان ئىشلەتكۈچى ئاتى ياكى IP ئادرÛس',
-'ipb-blocklist-addr' => '$1 نىڭ نۆۋەتتىكى چەكلىشى',
'ipb-blocklist' => 'نۆۋەتتىكى چەكلەشنى كۆرسەت',
'ipb-blocklist-contribs' => '$1 نىڭ ئىشلەتكۈچى تۆھپىسى',
'unblockip' => 'چەكلەش بىكار قىلىنغان ئىشلەتكۈچى',
@@ -2286,6 +2313,8 @@ $1 ئاللىبۇرۇن چەكلەنگەن.
'cant-block-while-blocked' => 'ئەگەر سىز چەكلەنسىڭىز باشقىلارنى چەكلىيەلمەيسىز.',
'cant-see-hidden-user' => 'سىز چەكلىمەكچى بولغان ئىشلەتكۈچى ئاللىبۇرۇن چەكلىنىپ يوشۇرۇلغان.
ھازىر سىزنىڭ ئىشلەتكۈچى يوشۇرۇش ھوقۇقىڭىز يوق، سىز بۇ چەكلەنگەن ئىشلەتكۈچىنى كۆرسىتىپ ياكى تەھرىرلىيەلمەيسىز.',
+'ipbblocked' => 'سىز بااشقا ئىشلەتكۈچىنى چەكلەپ ياكى چەكلەشنى بىكار قىلالمايسىز چۈنكى ئۆزىڭىز چەكلەندىڭىز.',
+'ipbnounblockself' => 'سىز ئۆزىڭىزنىڭ چەكلىنىشىنى بىكارقىلالمايسىز.',
# Developer tools
'lockdb' => 'سانداننى قۇلۇپلا',
@@ -2382,6 +2411,7 @@ $1 ئاللىبۇرۇن چەكلەنگەن.
'immobile-source-page' => 'بۇ بەتنى يۆتكىگىلى بولمايدۇ.',
'immobile-target-page' => 'بۇ نىشان ماۋزۇغا يۆتكىگىلى بولمايدۇ.',
'imagenocrossnamespace' => 'ھۆججەتنى غەيرى ھۆججەت ئات بوشلۇقىغا يۆتكىگىلى بولمايدۇ.',
+'nonfile-cannot-move-to-file' => 'غەيرى ھۆججەتنى ھۆججەت ئات بوشلۇقىغا يۆتكىگىلى بولمايدۇ.',
'imagetypemismatch' => 'بۇ ÙŠÛÚ­Ù‰ ÙƒÛڭەيتىلگەن ئات بىلەن باشقا تىپ ماسلاشمىدى.',
'imageinvalidfilename' => 'نىشان ھۆججەت ئاتى ئىناۋەتسىز',
'fix-double-redirects' => 'ئەسلى ماۋزۇغا قايتا نىشانلانغان ھەممە ئۇلىنىشنى ÙŠÛڭىلا.',
@@ -2460,6 +2490,7 @@ $1 ئاللىبۇرۇن چەكلەنگەن.
'importstart' => 'بەت ئەكىرىۋاتىدۇ…',
'import-revision-count' => '$1 {{PLURAL:$1|تۈزىتىش|تۈزىتىش}}',
'importnopages' => 'ئەكىرىدىغان بەت يوق.',
+'imported-log-entries' => '$1 {{PLURAL:$1|خاتىرە تۈرى|خاتىرە تۈرى}} ئەكىرىلدى.',
'importfailed' => 'ئەكىرىش مەغلۇپ بولدى: <nowiki>$1</nowiki>',
'importunknownsource' => 'نامەلۇم مەنبە ئەكىرىش تىپى',
'importcantopen' => 'ئەكىرگەن ھۆججەتنى ئاچالمىدى',
@@ -2559,6 +2590,8 @@ $1 ئاللىبۇرۇن چەكلەنگەن.
'tooltip-rollback' => '"ئەسلىگە قايتۇر" بىر Ú†Ûكىلسە ئالدىنقى تۆھپىكارنىڭ تەھرىرىلىگەن ھالىتىگە قايتۇرىدۇ.',
'tooltip-undo' => '\\"ÙŠÛنىۋال\\" تەھرىرلەش ھالىتىدە ئەسلىگە كەلتۈرۈش ئۈچۈن ئالدىن كۆزىتىش ھالىتىدىن تەھرىرلەشنى ئاچىدۇ
ئۇ قىسقىچە مەزمۇنغا سەۋەبىنى قوشۇشغا يول قويىدۇ.',
+'tooltip-preferences-save' => 'مايىللىق ساقلا',
+'tooltip-summary' => 'قىسقىچە ئۈزۈندە كىرگۈزۈڭ',
# Metadata
'nodublincore' => 'Dublin Core RDF Ù…Ûتا سانلىق مەلۇماتىنى بۇ مۇلازىمىتىردا ئىشلەتكىلى بولمايدۇ.',
@@ -2653,14 +2686,17 @@ $1',
'imagemaxsize' => "سۈرەت Ú†ÙˆÚ­Ù„Û‡Ù‚ چەكلىمىسى: <br />''(ھۆججەت چۈشەندۈرۈش بÛتى ئۈچۈن)''",
'thumbsize' => 'كىچىك سۈرەت چوڭلۇقى:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|بەت|بەت}}',
-'file-info' => '(ھۆججەت چوڭلۇقى: $1, MIME تىپى: $2)',
-'file-info-size' => '($1×$2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3ØŒ MIME تىپى: $4)',
+'file-info' => 'ھۆججەت چوڭلۇقى: $1, MIME تىپى: $2',
+'file-info-size' => '$1×$2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3ØŒ MIME تىپى: $4',
'file-nohires' => '<small>يۇقىرىراق پەرق ئÛتىش نىسبىتى يوق.</small>',
-'svg-long-desc' => '(SVG ھۆججىتى، ئاتاقتىكى چوڭلۇقى $1×$2 نۇقتا، ھۆججەت چوڭلۇقى: $3)',
+'svg-long-desc' => 'SVG ھۆججىتى، ئاتاقتىكى چوڭلۇقى $1×$2 نۇقتا، ھۆججەت چوڭلۇقى: $3',
'show-big-image' => 'تولۇق ئÛنىقلىق دەرىجىسى',
'show-big-image-thumb' => '<small>بۇ ئالدىن كۆزىتىشنىڭ چوڭلۇقى: $1 × $2 نۇقتا</small>',
'file-info-gif-looped' => 'دەۋرىيلەنگەن',
'file-info-gif-frames' => '$1 {{PLURAL:$1|كاندۇك|كاندۇك}}',
+'file-info-png-looped' => 'دەۋرىيلەنگەن',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|Ù‚Ûتىم|Ù‚Ûتىم}} قويۇلدى',
+'file-info-png-frames' => '$1 {{PLURAL:$1|كاندۇك|كاندۇك}}',
# Special:NewFiles
'newimages' => 'ÙŠÛÚ­Ù‰ ھۆججەت كارىدورى',
@@ -2974,31 +3010,31 @@ $1',
'limitall' => 'ھەممىسى',
# E-mail address confirmation
-'confirmemail' => 'جەزملەش ئÛلخەت ئادرÛسى',
-'confirmemail_noemail' => 'سىز ئۆزىڭىزنىڭ [[Special:Preferences|user مايىللىق]] تەڭشىكىڭىزگە ئىناۋەتلىك ئÛلخەت ئادرÛسى كىرگۈزمەپسىز.',
-'confirmemail_text' => '{{SITENAME}} ئÛلخەت ئىقتىدارى ئىشلىتىشتىن ئىلگىرى ئÛلخەت ئادرÛسىڭىزنى دەلىللەشنى تەلەپ قىلىدۇ.
+'confirmemail' => 'جەزملەش ئÛلخەت ئادرÛسى',
+'confirmemail_noemail' => 'سىز ئۆزىڭىزنىڭ [[Special:Preferences|user مايىللىق]] تەڭشىكىڭىزگە ئىناۋەتلىك ئÛلخەت ئادرÛسى كىرگۈزمەپسىز.',
+'confirmemail_text' => '{{SITENAME}} ئÛلخەت ئىقتىدارى ئىشلىتىشتىن ئىلگىرى ئÛلخەت ئادرÛسىڭىزنى دەلىللەشنى تەلەپ قىلىدۇ.
تۆۋەندىكى كۇنۇپكىنى چەكسىڭىز ئاكتىپلاش ئÛلخىتىدىن بىرنى سىزگە ئەۋەتىدۇ.
ئۇ ئىلخەتتە بىر قۇر ئۇلانما كود بار؛
توركۆرگۈڭىزدە بۇ ئۇلانمىنى يۈكلەپ ئÛلخەت ئادرÛسىڭىزنىڭ ئىناۋەتلىكلىكىنى جەزملەڭ.',
-'confirmemail_pending' => 'جەزملەش كودى ئÛلخەت ئادرÛسىڭىزغا يوللاندى؛
+'confirmemail_pending' => 'جەزملەش كودى ئÛلخەت ئادرÛسىڭىزغا يوللاندى؛
ئەگەر Ú¾Ûساباتىڭىزنى ÙŠÛقىندا قۇرغان بولسىڭىز، بىر قانچە مىنۇتتىن ÙƒÛيىن تاپشۇرۇۋÛلىشىڭىز مۇمكىن. ئەگەر تاپشۇرۇۋالمىغان بولسىڭىز، ÙŠÛڭىدىن بىرنى ئىلتىماس قىلىڭ.',
-'confirmemail_send' => 'جەزملەش كودىنى ئÛلخەتكە يوللا',
-'confirmemail_sent' => 'جەزملەش ئÛلخىتى يوللاندى.',
-'confirmemail_oncreate' => 'جەزملەش كودى ئÛلخەت ئادرÛسىڭىزغا يوللاندى.
+'confirmemail_send' => 'جەزملەش كودىنى ئÛلخەتكە يوللا',
+'confirmemail_sent' => 'جەزملەش ئÛلخىتى يوللاندى.',
+'confirmemail_oncreate' => 'جەزملەش كودى ئÛلخەت ئادرÛسىڭىزغا يوللاندى.
بۇ كود سىزنىڭ تىزىمغا كىرىشىڭىزنى تەلەپ قىلمايدۇ، ئەمما سىز بۇ wiki دىكى ھەر قانداق ئÛلخەت ئىقتىدارىنى قوزغاتماقچى بولسىڭىز چوقۇم بۇ كودنى تاپشۇرۇشىڭىز لازىم.',
-'confirmemail_sendfailed' => '{{SITENAME}} جەزملەش ئÛلخىتى يوللىيالمىدى
+'confirmemail_sendfailed' => '{{SITENAME}} جەزملەش ئÛلخىتى يوللىيالمىدى
ئÛلخەت ئادرÛسىڭىزدا قانۇنسىز ھەرپ بار يوقلۇقىنى تەكشۈرۈڭ.
ئÛلخەت يوللىغۇچى جاۋابى: $1',
-'confirmemail_invalid' => 'ئىناۋەتسىز جەزملەش كودى.
+'confirmemail_invalid' => 'ئىناۋەتسىز جەزملەش كودى.
بۇ كودنىڭ ۋاقتى ئۆتكەن بولۇشى مۇمكىن.',
-'confirmemail_needlogin' => 'سىز $1 ئارقىلىق ئÛلخەت ئادرÛسىڭىزنى جەزملەڭ.',
-'confirmemail_success' => 'ئÛلخەت ئادرÛسىڭىز جەزملەندى.
+'confirmemail_needlogin' => 'سىز $1 ئارقىلىق ئÛلخەت ئادرÛسىڭىزنى جەزملەڭ.',
+'confirmemail_success' => 'ئÛلخەت ئادرÛسىڭىز جەزملەندى.
سىز ھازىر [[Special:UserLogin|تىزىمغا كىر]]ىپ، wiki بÛكەتنى ئىشلىتەلەيسىز.',
-'confirmemail_loggedin' => 'ئÛلخەت ئادرÛسىڭىز ھازىر جەزملەندى.',
-'confirmemail_error' => 'جەزملەش جەريانىدا خاتالىق كۆرۈلدى.',
-'confirmemail_subject' => '{{SITENAME}} ئÛلخەت ئادرÛس جەزملەش',
-'confirmemail_body' => 'IP ئادرÛس $1 دىن ÙƒÛ•Ù„Ú¯Û•Ù† ئىشلەتكۈچى (بەلكىم سىز بولۇشىڭىز مۇمكىن) {{SITENAME}} دا “$2†ھÛسابات قۇردى ھەمدە بۇ ئÛلخەت ئادرÛسىنى تاپشۇردى.
+'confirmemail_loggedin' => 'ئÛلخەت ئادرÛسىڭىز ھازىر جەزملەندى.',
+'confirmemail_error' => 'جەزملەش جەريانىدا خاتالىق كۆرۈلدى.',
+'confirmemail_subject' => '{{SITENAME}} ئÛلخەت ئادرÛس جەزملەش',
+'confirmemail_body' => 'IP ئادرÛس $1 دىن ÙƒÛ•Ù„Ú¯Û•Ù† ئىشلەتكۈچى (بەلكىم سىز بولۇشىڭىز مۇمكىن) {{SITENAME}} دا “$2†ھÛسابات قۇردى ھەمدە بۇ ئÛلخەت ئادرÛسىنى تاپشۇردى.
بۇ Ú¾Ûساباتنىڭ سىزگە تەۋە ئىكەنلىكىنى، شۇنىڭ بىلەن بىللە {{SITENAME}} دىكى ئÛلخەت ئىقتىدارىنى قوزغىتىشنى جەزملەڭ. توركۆرگۈدە تۆۋەندىكى ئۇلانمىنى ئÛÚ†Ù‰Ú­:
@@ -3010,8 +3046,20 @@ $3
$5
جەزملەش كودى $4 دىن ÙƒÛيىن ۋاقتى ئۆتىدۇ.',
-'confirmemail_invalidated' => 'ئÛلخەت ئادرÛس جەزملەش بىكار قىلىندى',
-'invalidateemail' => 'ئÛلخەت جەزملەشتىن ۋاز ÙƒÛ•Ú†',
+'confirmemail_body_changed' => 'IP ئادرÛس $1 دىن ÙƒÛ•Ù„Ú¯Û•Ù† ئىشلەتكۈچى (بەلكىم سىز بولۇشىڭىز مۇمكىن) {{SITENAME}} دا “$2†ھÛساباتنىڭ ئÛلخەت ئادرÛسىنى ئۆزگەرتتى.
+
+بۇ Ú¾Ûساباتنىڭ سىزگە تەۋە ئىكەنلىكىنى، شۇنىڭ بىلەن بىللە {{SITENAME}} دىكى ئÛلخەت ئىقتىدارىنى قوزغىتىشنى جەزملەڭ. توركۆرگۈدە تۆۋەندىكى ئۇلانمىنى ئÛÚ†Ù‰Ú­:
+
+$3
+
+ئەگەر Ú¾Ûسابات سىزگە تەۋە *بولمىسا*ØŒ
+تۆۋەندىكى ئۇلانمىنى ئÛچىپ ئÛلخەت جەزملەشتىن ۋاز ÙƒÛÚ†Ù‰Ú­.
+
+$5
+
+جەزملەش كودى $4 دىن ÙƒÛيىن ۋاقتى ئۆتىدۇ.',
+'confirmemail_invalidated' => 'ئÛلخەت ئادرÛس جەزملەش بىكار قىلىندى',
+'invalidateemail' => 'ئÛلخەت جەزملەشتىن ۋاز ÙƒÛ•Ú†',
# Scary transclusion
'scarytranscludedisabled' => '[بÛكەت ئاتلىغان كود ئايلاندۇرۇش چەكلەنگەن]',
@@ -3051,6 +3099,7 @@ $1',
'table_pager_first' => 'بىرىنچى بەت',
'table_pager_last' => 'ئەڭ ئاخىرقى بەت',
'table_pager_limit' => 'ھەر بىر بەتتە $1 تۈر كۆرسەت',
+'table_pager_limit_label' => 'ھەر بەتتىكى تۈر سانى:',
'table_pager_limit_submit' => 'يۆتكەل',
'table_pager_empty' => 'نەتىجە يوق',
@@ -3119,6 +3168,8 @@ $1',
'version-hook-subscribedby' => 'ئىمزا قويغۇچى',
'version-version' => '(نەشرى $1)',
'version-license' => 'ئىجازەتنامە',
+'version-poweredby-credits' => "بۇ ۋىكىنى '''[http://www.mediawiki.org/ MediaWiki]''' تÛخنىكىلىق قوللايدۇ، نەشر ھوقۇقى © 2001-$1 $2",
+'version-poweredby-others' => 'باشقا',
'version-software' => 'قاچىلانغان يۇمشاق دÛتال',
'version-software-product' => 'مەھسۇلات',
'version-software-version' => 'نەشرى',
@@ -3189,6 +3240,15 @@ $1',
'tags-edit' => 'ئۆزگەرتىش',
'tags-hitcount' => '$1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
+# Special:ComparePages
+'comparepages' => 'بەت سÛلىشتۇر',
+'compare-selector' => 'بەتنىڭ تۈزىتىلگەن نەشرىنى سÛلىشتۇر',
+'compare-page1' => '1- بەت',
+'compare-page2' => '2- بەت',
+'compare-rev1' => 'تۈزىتىلگەن نەشرى 1',
+'compare-rev2' => 'تۈزىتىلگەن نەشرى 2',
+'compare-submit' => 'سÛلىشتۇر',
+
# Database error messages
'dberr-header' => 'بۇ wiki مەسىلىگە يولۇقتى',
'dberr-problems' => 'كەچۈرۈڭ!
@@ -3206,8 +3266,13 @@ $1',
'htmlform-float-invalid' => 'سىز بەلگىلىگەن قىممەت سان ئەمەس.',
'htmlform-int-toolow' => 'سىز بەلگىلىگەن قىممەت ئەڭ كىچىك قىممەت $1 تىن كىچىك',
'htmlform-int-toohigh' => 'سىز بەلگىلىگەن قىممەت ئەڭ چوڭ قىممەت $1 تىن چوڭ',
+'htmlform-required' => 'بۇ قىممەت زۆرۈر',
'htmlform-submit' => 'تاپشۇر',
'htmlform-reset' => 'ئۆزگەرتىشتىن ÙŠÛنىۋال',
'htmlform-selectorother-other' => 'باشقا',
+# SQLite database support
+'sqlite-has-fts' => '$1 پۈتۈن تÛكست ئىزدەشنى قوللايدۇ',
+'sqlite-no-fts' => '$1 پۈتۈن تÛكست ئىزدەشنى قوللىمايدۇ',
+
);
diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php
index 3e7a120a..b644b71d 100644
--- a/languages/messages/MessagesUk.php
+++ b/languages/messages/MessagesUk.php
@@ -13,6 +13,8 @@
* @author Aleksandrit
* @author Alex Khimich
* @author AlexSm
+ * @author Andrijko Z.
+ * @author Arturyatsko
* @author DixonD
* @author Dubyk
* @author EugeneZelenko
@@ -20,12 +22,14 @@
* @author Ickis
* @author Ilyaroz
* @author Innv
+ * @author KEL
* @author Kalan
* @author NickK
* @author Prima klasy4na
* @author Riwnodennyk
* @author Urhixidur
* @author VolodymyrF
+ * @author Yuriy Apostol
* @author ТеÑÑ‚
*/
@@ -58,7 +62,7 @@ $namespaceNames = array(
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'ОбговореннÑ_MediaWiki',
NS_TEMPLATE => 'Шаблон',
- NS_TEMPLATE_TALK => 'ОбговореннÑ_шаблону',
+ NS_TEMPLATE_TALK => 'ОбговореннÑ_шаблона',
NS_HELP => 'Довідка',
NS_HELP_TALK => 'ОбговореннÑ_довідки',
NS_CATEGORY => 'КатегоріÑ',
@@ -69,9 +73,9 @@ $namespaceAliases = array(
'Спеціальні' => NS_SPECIAL,
'ЗображеннÑ' => NS_FILE,
'ОбговореннÑ_зображеннÑ' => NS_FILE_TALK,
+ 'ОбговореннÑ_шаблону' => NS_TEMPLATE_TALK,
);
-
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'xg j, Y',
@@ -151,7 +155,7 @@ $magicWords = array(
'subjectpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐТТІ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'ПОВІД:', 'ПОВІДОМЛЕÐÐЯ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
'subst' => array( '0', 'ПІДСТ:', 'ПІДСТÐÐОВКÐ:', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
- 'safesubst' => array( '0', 'БЕЗПЕЧÐÐ_ПІДСТÐÐОВКÐ:', 'SAFESUBST:' ),
+ 'safesubst' => array( '0', 'БЕЗПЕЧÐÐ_ПІДСТÐÐОВКÐ:', 'ЗÐЩПОДСТ:', 'SAFESUBST:' ),
'msgnw' => array( '0', 'ПОВІД_БЕЗ_ВІКІ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'міні', 'мініатюра', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'міні=$1', 'мініатюра=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -257,8 +261,7 @@ $messages = array(
'tog-editsection' => 'Показувати поÑÐ¸Ð»Ð°Ð½Ð½Ñ [ред.] Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ розділу',
'tog-editsectiononrightclick' => 'Редагувати розділи при клацанні правою кнопкою мишки на заголовку (JavaScript)',
'tog-showtoc' => 'Показувати зміÑÑ‚ (Ð´Ð»Ñ Ñторінок з більш ніж трьома заголовками)',
-'tog-rememberpassword' => "Запам'Ñтати мій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° цьому комп'ютері",
-'tog-editwidth' => 'Розширювати поле Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° веÑÑŒ екран',
+'tog-rememberpassword' => "Запам'Ñтати мій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ браузера (на Ñтрок не більше $1 {{PLURAL:$1|днÑ|днів}})",
'tog-watchcreations' => 'Додавати Ñтворені мною Ñторінки до мого ÑпиÑку ÑпоÑтереженнÑ',
'tog-watchdefault' => 'Додавати змінені мною Ñторінки до мого ÑпиÑку ÑпоÑтереженнÑ',
'tog-watchmoves' => 'Додавати перейменовані мною Ñторінки до мого ÑпиÑку ÑпоÑтереженнÑ',
@@ -404,31 +407,21 @@ $messages = array(
'faqpage' => 'Project:ЧаÑÑ‚Ñ– питаннÑ',
# Vector skin
-'vector-action-addsection' => 'Додати тему',
-'vector-action-delete' => 'Вилучити',
-'vector-action-move' => 'Перейменувати',
-'vector-action-protect' => 'ЗахиÑтити',
-'vector-action-undelete' => 'Відновити',
-'vector-action-unprotect' => 'ЗнÑти захиÑÑ‚',
-'vector-namespace-category' => 'КатегоріÑ',
-'vector-namespace-help' => 'Сторінка довідки',
-'vector-namespace-image' => 'Файл',
-'vector-namespace-main' => 'Сторінка',
-'vector-namespace-media' => 'Медіа-Ñторінка',
-'vector-namespace-mediawiki' => 'ПовідомленнÑ',
-'vector-namespace-project' => 'Сторінка проекту',
-'vector-namespace-special' => 'Спеціальна Ñторінка',
-'vector-namespace-talk' => 'ОбговореннÑ',
-'vector-namespace-template' => 'Шаблон',
-'vector-namespace-user' => 'Сторінка кориÑтувача',
-'vector-view-create' => 'Створити',
-'vector-view-edit' => 'Редагувати',
-'vector-view-history' => 'ПереглÑнути Ñ–Ñторію',
-'vector-view-view' => 'Читати',
-'vector-view-viewsource' => 'ПереглÑнути код',
-'actions' => 'Дії',
-'namespaces' => 'ПроÑтори назв',
-'variants' => 'Варіанти',
+'vector-action-addsection' => 'Додати тему',
+'vector-action-delete' => 'Вилучити',
+'vector-action-move' => 'Перейменувати',
+'vector-action-protect' => 'ЗахиÑтити',
+'vector-action-undelete' => 'Відновити',
+'vector-action-unprotect' => 'ЗнÑти захиÑÑ‚',
+'vector-simplesearch-preference' => 'Увімкнути розширені пошукові підказки (лише Ð´Ð»Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ "Векторне")',
+'vector-view-create' => 'Створити',
+'vector-view-edit' => 'Редагувати',
+'vector-view-history' => 'ПереглÑнути Ñ–Ñторію',
+'vector-view-view' => 'Читати',
+'vector-view-viewsource' => 'ПереглÑнути код',
+'actions' => 'Дії',
+'namespaces' => 'ПроÑтори назв',
+'variants' => 'Варіанти',
'errorpagetitle' => 'Помилка',
'returnto' => 'ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ Ñторінки «$1».',
@@ -489,6 +482,9 @@ $messages = array(
Будь лаÑка, почекайте Ñ– повторіть Ñпробу отримати доÑтуп пізніше.
$1',
+'pool-timeout' => 'Ð§Ð°Ñ Ð¾Ñ‡Ñ‹ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð½Ð¾',
+'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' => 'Про {{grammar:accusative|{{SITENAME}}}}',
@@ -653,7 +649,8 @@ $1',
'yourname' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
'yourpassword' => 'Пароль:',
'yourpasswordagain' => 'Повторний набір паролÑ:',
-'remembermypassword' => "Запам'Ñтовувати мій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° цьому комп'ютері",
+'remembermypassword' => "Запам'Ñтати мій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° цьому комп'ютері (на Ñтрок не більше $1 {{PLURAL:$1|днÑ|днів}})",
+'securelogin-stick-https' => 'ЗалишайтиÑÑŒ підключенним через HTTPS піÑÐ»Ñ Ð²Ñ…Ð¾Ð´Ñƒ',
'yourdomainname' => 'Ваш домен:',
'externaldberror' => 'СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при автентифікації за допомогою зовнішньої бази даних, або у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до Ñвого зовнішнього облікового запиÑу.',
'login' => 'Вхід до ÑиÑтеми',
@@ -670,6 +667,7 @@ $1',
'gotaccount' => "Ви вже зареєÑтровані? '''$1'''.",
'gotaccountlink' => 'Увійдіть',
'createaccountmail' => 'електронною поштою',
+'createaccountreason' => 'Причина:',
'badretype' => 'Уведені вами паролі не збігаютьÑÑ.',
'userexists' => "Уведене ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача вже Ñ–Ñнує.
Оберіть інше ім'Ñ.",
@@ -696,6 +694,7 @@ $1',
'wrongpasswordempty' => 'Ви не ввели пароль. Будь лаÑка, Ñпробуйте ще раз.',
'passwordtooshort' => 'Ваш пароль закороткий, він має міÑтити принаймні $1 {{PLURAL:$1|Ñимвол|Ñимволи|Ñимволів}}.',
'password-name-match' => 'Уведений пароль має відрізнÑтиÑÑ Ð²Ñ–Ð´ імені кориÑтувача.',
+'password-login-forbidden' => 'ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ імені кориÑтувача Ñ– Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾.',
'mailmypassword' => 'ÐадіÑлати новий пароль',
'passwordremindertitle' => "Пам'Ñтка Ð¿Ð°Ñ€Ð¾Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача {{grammar:genitive|{{SITENAME}}}}",
'passwordremindertext' => 'ХтоÑÑŒ (можливо, ви, з IP-адреÑи $1) зробив запит
@@ -737,6 +736,9 @@ $1',
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запит на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÑеанÑа відхилений, оÑкільки він Ñхожий на запит, відправлений зіпÑованим веб-оглÑдачем або кешуючим прокÑÑ–-Ñервером.',
+# E-mail sending
+'php-mail-error-unknown' => 'Ðевідома помилка в PHP-mail() функції',
+
# Password reset dialog
'resetpass' => 'Змінити пароль',
'resetpass_announce' => 'Ви ввійшли, викориÑтовуючи тимчаÑовий пароль, Ñкий отримали електронною поштою. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ñ…Ð¾Ð´Ñƒ до ÑиÑтеми, ви повинні вказати новий пароль тут:',
@@ -785,11 +787,12 @@ $1',
'showlivepreview' => 'Швидкий попередній переглÑд',
'showdiff' => 'Показати зміни',
'anoneditwarning' => "'''Увага''': Ви не увійшли до ÑиÑтеми. Ваша IP-адреÑа буде запиÑана до Ñ–Ñторії змін цієї Ñторінки.",
+'anonpreviewwarning' => "''Ви не увійшли в ÑиÑтему. Якщо ви виконаєте збереженнÑ, то в Ñ–Ñторію Ñторінки буде запиÑана ваша IP-адреÑа.''",
'missingsummary' => "'''ÐагадуваннÑ''': Ви не дали короткого опиÑу змін.
ÐатиÑнувши кнопку «Зберегти» ще раз, ви збережете зміни без коментарÑ.",
'missingcommenttext' => 'Будь лаÑка, введіть нижче ваше повідомленнÑ.',
-'missingcommentheader' => "'''ÐагадуваннÑ''': Ви не зазначили коментар до редагуваннÑ.
-ÐатиÑнувши кнопку «Зберегти Ñторінку» ще раз, ви збережете Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ· коментарÑ.",
+'missingcommentheader' => "'''ÐагадуваннÑ''': ви не вказали тему/заголовок Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ коментарÑ.
+ÐатиÑнувши кнопку «{{int:savearticle}}» ще раз, ви збережете Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ· заголовка.",
'summary-preview' => 'ÐžÐ¿Ð¸Ñ Ð±ÑƒÐ´Ðµ:',
'subject-preview' => 'Заголовок буде:',
'blockedtitle' => 'КориÑтувача заблоковано',
@@ -863,8 +866,12 @@ $1',
'usercsspreview' => "'''Пам'Ñтайте, що це лише попередній переглÑд вашого css-файлу.'''
'''Його ще не збережено!'''",
'userjspreview' => "'''Пам'Ñтайте, що це тільки попередній переглÑд вашого JavaScript-файлу Ñ– поки він ще не збережений!'''",
+'sitecsspreview' => "'''Пам'Ñтайте, що це тільки попередній переглÑд цього CSS.'''
+'''Його ще не збережено!'''",
+'sitejspreview' => "'''Пам'Ñтайте, що це лише попередній переглÑд вашого JavaScript-коду.'''
+'''Його ще не збережено!'''",
'userinvalidcssjstitle' => "'''Увага:''' тема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Â«$1» не знайдена.
-Пам'Ñтайте, що кориÑтувацькі .css та .js Ñторінки повинні мати назву, що ÑкладаєтьÑÑ Ð»Ð¸ÑˆÐµ з малих літер, наприклад «{{ns:user}}:ХтоÑÑŒ/monobook.css», а не «{{ns:user}}:ХтоÑÑŒ/Monobook.css».",
+Пам'Ñтайте, що кориÑтувацькі .css та .js Ñторінки повинні мати назву, що ÑкладаєтьÑÑ Ð»Ð¸ÑˆÐµ з малих літер, наприклад «{{ns:user}}:ХтоÑÑŒ/vector.css», а не «{{ns:user}}:ХтоÑÑŒ/Vector.css».",
'updated' => '(Оновлена)',
'note' => "'''ЗауваженнÑ:'''",
'previewnote' => "'''Це лише попередній переглÑд,
@@ -902,9 +909,6 @@ $1',
Якщо ви не бажаєте, щоб напиÑане вами безжаліÑно редагувалоÑÑŒ — не пишіть тут.<br />
Ви також зобов'ÑзуєтеÑÑŒ, що напиÑане вами тут належить вам або взÑте з джерела, що Ñ” ÑуÑпільним надбаннÑм, або подібного вільного джерела (див. $1).<br />
'''ÐЕ ПУБЛІКУЙТЕ ТУТ БЕЗ ДОЗВОЛУ ÐœÐТЕРІÐЛИ, ЩО Є ОБ'ЄКТОМ ÐВТОРСЬКОГО ПРÐÐ’Ð!'''",
-'longpagewarning' => "'''ПОПЕРЕДЖЕÐÐЯ: Довжина цієї Ñторінки $1 кб;
-Ñторінки, розмір Ñких перевищує 32&nbsp;кб, можуть Ñтворювати проблеми Ð´Ð»Ñ Ð´ÐµÑких браузерів.
-Будь лаÑка, розглÑньте варіанти Ñ€Ð¾Ð·Ð±Ð¸Ñ‚Ñ‚Ñ Ñторінки на менші чаÑтини.'''",
'longpageerror' => "'''ПОМИЛКÐ: текÑÑ‚, що ви хочете зберегти має $1 кілобайт, що більше ніж вÑтановлену межу $2 кілобайт. Сторінку неможливо зберегти.'''",
'readonlywarning' => "'''ПОПЕРЕДЖЕÐÐЯ: База даних заблокована в зв'Ñзку з процедурами обÑлуговуваннÑ,
тому, на даний момент, ви не можете запиÑати ваші зміни.
@@ -1086,6 +1090,8 @@ $1",
'logdelete-failure' => "'''Ðе вдалоÑÑ Ð²Ñтановити видиміÑÑ‚ÑŒ журналу:'''
$1",
'revdel-restore' => 'Змінити видиміÑÑ‚ÑŒ',
+'revdel-restore-deleted' => 'вилучені верÑÑ–Ñ—',
+'revdel-restore-visible' => 'видимі верÑÑ–Ñ—',
'pagehist' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñторінки',
'deletedhist' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½ÑŒ',
'revdelete-content' => 'вміÑÑ‚',
@@ -1153,11 +1159,13 @@ $1",
# Diffs
'history-title' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð·Ð¼Ñ–Ð½ Ñторінки «$1»',
'difference' => '(відмінноÑÑ‚Ñ– між верÑÑ–Ñми)',
+'difference-multipage' => '(Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð¼Ñ–Ð¶ Ñторінками)',
'lineno' => 'РÑдок $1:',
'compareselectedversions' => 'ПорівнÑти вибрані верÑÑ–Ñ—',
'showhideselectedversions' => 'Показати/приховати обрані верÑÑ–Ñ—',
'editundo' => 'ÑкаÑувати',
-'diff-multi' => '($1 {{PLURAL:$1|проміжна верÑÑ–Ñ Ð½Ðµ показана|проміжні верÑÑ–Ñ— не показані|проміжних верÑій не показані}}.)',
+'diff-multi' => '({{PLURAL:$1|Одна проміжна верÑÑ–Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кориÑтувача не показана|$1 проміжні верÑÑ–Ñ— {{PLURAL:$2|одного кориÑтувача|$2 кориÑтувачів}} не показані|$1 проміжних верÑій {{PLURAL:$2|одного кориÑтувача|$2 кориÑтувачів}} не показані}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 проміжна Ñ Ð²ÐµÑ€ÑÑ–Ñ|не показані $1 проміжні верÑÑ–Ñ—|не показано $1 проміжних верÑій}}, зроблених більш, ніж {{PLURAL:$2|$1 кориÑтувачем|$2 кориÑтувачами}})',
# Search results
'searchresults' => 'Результати пошуку',
@@ -1192,6 +1200,7 @@ $1",
'searchprofile-everything-tooltip' => 'Пошук на вÑÑ–Ñ… Ñторінках (включаючи Ñторінки обговореннÑ)',
'searchprofile-advanced-tooltip' => 'Шукати в заданих проÑторах назв',
'search-result-size' => '$1 ($2 {{PLURAL:$2|Ñлово|Ñлова|Ñлів}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 елемент|$1 елементи|$1 елементів}} ({{PLURAL:$2|$2 підкатегоріÑ|$2 підкатегорії|$2 підкатегорій}}, {{PLURAL:$3|$3 файл|$3 файли|$3 файлів}})',
'search-result-score' => 'ВідповідніÑÑ‚ÑŒ: $1 %',
'search-redirect' => '(Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ $1)',
'search-section' => '(розділ $1)',
@@ -1266,6 +1275,7 @@ $1",
'contextlines' => 'КількіÑÑ‚ÑŒ Ñ€Ñдків на результат',
'contextchars' => 'КількіÑÑ‚ÑŒ Ñимволів контекÑту на Ñ€Ñдок',
'stub-threshold' => 'Поріг Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ <a href="#" class="stub">поÑилань на Ñтаби</a> (у байтах):',
+'stub-threshold-disabled' => 'Вимкнений',
'recentchangesdays' => 'Ðа Ñкільки днів показувати нові редагуваннÑ:',
'recentchangesdays-max' => '(макÑимум $1 {{PLURAL:$1|день|дні|днів}})',
'recentchangescount' => 'КількіÑÑ‚ÑŒ редагувань Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ за умовчаннÑм:',
@@ -1299,6 +1309,7 @@ $1",
'prefs-files' => 'Файли',
'prefs-custom-css' => 'ВлаÑний CSS',
'prefs-custom-js' => 'ВлаÑний JS',
+'prefs-common-css-js' => 'CSS/JS Ñпільні Ð´Ð»Ñ Ð²ÑÑ–Ñ… тем оформленнÑ:',
'prefs-reset-intro' => 'Ð¦Ñ Ñторінка може бути викориÑтана Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ ваших налаштувань на Ñтандартні.
ПіÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— дії ви не зможете відкотити зміни.',
'prefs-emailconfirm-label' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти:',
@@ -1338,9 +1349,15 @@ $1",
'prefs-advancedrendering' => 'Розширені налаштуваннÑ',
'prefs-advancedsearchoptions' => 'Розширені налаштуваннÑ',
'prefs-advancedwatchlist' => 'Розширені налаштуваннÑ',
-'prefs-display' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
+'prefs-displayrc' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
+'prefs-displaysearchoptions' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
+'prefs-displaywatchlist' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
'prefs-diffs' => 'Різниці верÑій',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ÐдреÑа електронної пошти Ñ” чинною',
+'email-address-validity-invalid' => 'Введіть чинну адреÑу електронної пошти',
+
# User rights
'userrights' => 'Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ кориÑтувачів',
'userrights-lookup-user' => 'Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð°Ð¼Ð¸ кориÑтувача',
@@ -1424,6 +1441,7 @@ $1",
'right-hideuser' => 'Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– кориÑтувача Ñ– Ð¿Ñ€Ð¸Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¹Ð¾Ð³Ð¾',
'right-ipblock-exempt' => 'Ð£Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° IP-адреÑою, Ð°Ð²Ñ‚Ð¾Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ–Ð²',
'right-proxyunbannable' => 'Ð£Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–-Ñерверів',
+'right-unblockself' => 'розблоковувати Ñамого Ñебе',
'right-protect' => 'Зміна рівнів захиÑту, Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… Ñторінок',
'right-editprotected' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… Ñторінок (без каÑкадного захиÑту)',
'right-editinterface' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу кориÑтувача',
@@ -1446,7 +1464,6 @@ $1",
'right-siteadmin' => 'Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних',
'right-reset-passwords' => 'ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð² інших кориÑтувачів',
'right-override-export-depth' => "екÑпорт Ñторінок, включаючи пов'Ñзані Ñторінки з глибиною до 5",
-'right-versiondetail' => 'ПереглÑд розширеної інформації про верÑÑ–ÑŽ програмного забезпеченнÑ',
'right-sendemail' => 'відправлÑти пошту іншим кориÑтувачам',
# User rights log
@@ -1497,14 +1514,9 @@ $1",
'recentchanges-legend' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… редагувань',
'recentchangestext' => 'Ðа цій Ñторінці показані оÑтанні зміни на Ñторінках {{grammar:genitive|{{SITENAME}}}}.',
'recentchanges-feed-description' => 'ВідÑтежувати оÑтанні зміни у вікі в цьому потоці.',
-'recentchanges-label-legend' => 'Легенда: $1.',
-'recentchanges-legend-newpage' => '$1 — нова Ñторінка',
'recentchanges-label-newpage' => 'Цим редагуваннÑм Ñтворена нова Ñторінка',
-'recentchanges-legend-minor' => '$1 — незначне редагуваннÑ',
'recentchanges-label-minor' => 'Це незначна зміна',
-'recentchanges-legend-bot' => '$1 — Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð¾Ñ‚Ð°',
'recentchanges-label-bot' => 'Це Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ðµ ботом',
-'recentchanges-legend-unpatrolled' => '$1 — невідпатрульоване редагуваннÑ',
'recentchanges-label-unpatrolled' => 'Це Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‰Ðµ не було відпатрульоване',
'rcnote' => "{{PLURAL:$1|ОÑÑ‚Ð°Ð½Ð½Ñ '''$1''' зміна|ОÑтанні '''$1''' зміни|ОÑтанні '''$1''' змін}} за '''$2''' {{PLURAL:$2|день|дні|днів}}, на Ñ‡Ð°Ñ $5, $4.",
'rcnotefrom' => 'Ðижче відображені Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð· <strong>$2</strong> (до <strong>$1</strong>).',
@@ -1551,6 +1563,9 @@ $1",
'upload_directory_missing' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½ÑŒ ($1) відÑÑƒÑ‚Ð½Ñ Ñ– не може бути Ñтворена веб-Ñервером.',
'upload_directory_read_only' => 'Веб-Ñервер не має прав запиÑу в папку ($1), в Ñкій плануєтьÑÑ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ñ‚Ð¸ завантажувані файли.',
'uploaderror' => 'Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ',
+'upload-recreate-warning' => "'''Увага. Файл з такою назвою був раніше вилучений або перейменований.''
+
+Далі наведено журнал вилучень і перейменувань цього файлу:",
'uploadtext' => "За допомогою цієї форми ви можете завантажити файли на Ñервер.
Якщо файл із зазначеною вами назвою вже Ñ–Ñнує в проекті, то його буде замінено без попередженнÑ. Тому, Ñкщо ви не збираєтеÑÑŒ оновлювати файл,
@@ -1594,6 +1609,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"''' — заборонений тип файлу.
{{PLURAL:\$3|Дозволений тип файлів|Дозволені типи файлів}}: \$2.",
'filetype-missing' => 'ВідÑутнє Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ (наприклад, «.jpg»).',
+'empty-file' => 'ÐадіÑланий вами файл порожній.',
+'file-too-large' => 'Файл, Ñкий ви надіÑлали, завеликий.',
+'filename-tooshort' => 'Ðазва файлу занадто коротка.',
+'filetype-banned' => 'Цей тип файлів заборонений.',
+'verification-error' => 'Файлу не вдалоÑÑ Ð¿Ñ€Ð¾Ð¹Ñ‚Ð¸ процедуру перевірки.',
+'hookaborted' => 'Запропоновану вами зміну перервав обробник розширеннÑ.',
+'illegal-filename' => 'Ðедозволена назва файлу.',
+'overwrite' => 'Заміну Ñ–Ñнуючого файлу не дозволено.',
+'unknown-error' => 'ТрапилаÑÑŒ невідома помилка.',
+'tmp-create-error' => 'Ðе вдалоÑÑ Ñтворити тимчаÑовий файл.',
+'tmp-write-error' => 'Помилка запиÑу тимчаÑового файлу.',
'large-file' => 'РекомендуєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати зображеннÑ, розмір Ñких не перевищує $1 байтів (размір завантаженого файлу Ñкладає $2 байтів).',
'largefileserver' => 'Розмір файлу більший за макÑимальнодозволений.',
'emptyfile' => 'Завантажений вами файл ймовірно порожній. Можливо, це ÑталоÑÑ Ñ‡ÐµÑ€ÐµÐ· помилку при введенні імені файлу. Будь-лаÑка, перевірте, чи Ñправді ви бажаєте звантажити цей файл.',
@@ -1618,13 +1644,14 @@ $1",
Якщо ви вÑе ж хочете завантажити цей файл, будь лаÑка, повернітьÑÑ Ð½Ð°Ð·Ð°Ð´ Ñ– змініть назву файлу. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Цей файл є дублікатом {{PLURAL:$1|файлу|таких файлів}}:',
'file-deleted-duplicate' => 'Такий Ñамий файл ([[:$1]]) уже вилучавÑÑ Ñ€Ð°Ð½Ñ–ÑˆÐµ. Будь лаÑка, ознайомтеÑÑ Ð· Ñ–Ñторією вилучень файлу перед тим, Ñк завантажити його знову.',
-'successfulupload' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÑпішно завершено',
'uploadwarning' => 'ПопередженнÑ',
'uploadwarning-text' => 'Будь лаÑка, змініть наданий нижче Ð¾Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñ– Ñпробуйте ще раз.',
'savefile' => 'Зберегти файл',
'uploadedimage' => 'завантажив «[[$1]]»',
'overwroteimage' => 'завантажив нову верÑÑ–ÑŽ «[[$1]]»',
'uploaddisabled' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ðµ',
+'copyuploaddisabled' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· URL вимкнене.',
+'uploadfromurl-queued' => 'Ваше Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñтавлене в чергу.',
'uploaddisabledtext' => 'МожливіÑÑ‚ÑŒ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² відключена.',
'php-uploaddisabledtext' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² вимкнене у налаштуваннÑÑ… PHP. Будь лаÑка, перевірте Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ file_uploads.',
'uploadscripted' => 'Файл міÑтить HTML-код або Ñкрипт, Ñкий може неправильно обробитиÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼.',
@@ -1658,6 +1685,14 @@ JD # Jenoptik
MGP # Pentax
PICT # різні
#</pre> <!-- не мінÑйте цей Ñ€Ñдок -->',
+'upload-success-subj' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÑпішно завершено',
+'upload-success-msg' => 'Ваше Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð· [$2] було уÑпішним. Воно доÑтупне тут: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Проблема із завантаженнÑм',
+'upload-failure-msg' => 'З вашим завантаженнÑм від [$2] виникла проблема:
+
+$1',
+'upload-warning-subj' => 'ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ завантаженні',
+'upload-warning-msg' => 'СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при переÑиланні з [$2]. Ви можете повернутиÑÑ Ð´Ð¾ [[Special:Upload/stash/$1|формулÑру переÑиланнÑ]], щоб вирішити проблему.',
'upload-proto-error' => 'Ðевірний протокол',
'upload-proto-error-text' => 'Віддалене Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” адреÑів, що починаютьÑÑ Ð· <code>http://</code> або <code>ftp://</code>.',
@@ -1720,6 +1755,7 @@ PICT # різні
'listfiles_search_for' => 'Пошук по назві зображеннÑ:',
'imgfile' => 'файл',
'listfiles' => 'СпиÑок файлів',
+'listfiles_thumb' => 'Мініатюра',
'listfiles_date' => 'Дата',
'listfiles_name' => 'Ðазва',
'listfiles_user' => 'КориÑтувач',
@@ -1834,8 +1870,8 @@ PICT # різні
'statistics-edits' => 'КількіÑÑ‚ÑŒ редагувань з моменту уÑтановки {{grammar:genitive|{{SITENAME}}}}',
'statistics-edits-average' => 'Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ редагувань на Ñторінку',
'statistics-views-total' => 'УÑього переглÑдів',
+'statistics-views-total-desc' => 'ПереглÑди неіÑнуючих та Ñпеціальних Ñторінок не враховані',
'statistics-views-peredit' => 'ПереглÑдів на редагуваннÑ',
-'statistics-jobqueue' => 'Величина [http://www.mediawiki.org/wiki/Manual:Job_queue черги завдань]',
'statistics-users' => 'ЗареєÑтрованих [[Special:ListUsers|кориÑтувачів]]',
'statistics-users-active' => 'Ðктивні кориÑтувачі',
'statistics-users-active-desc' => 'КориÑтувачі, Ñкі здійÑнили ÑкуÑÑŒ дію протÑгом {{PLURAL:$1|минулого днÑ|минулих $1 днів}}',
@@ -1848,7 +1884,7 @@ PICT # різні
'doubleredirects' => 'Подвійні перенаправленнÑ',
'doubleredirectstext' => 'Ðа цій Ñторінці наведено ÑпиÑок перенаправлень на інші перенаправленнÑ.
Кожен Ñ€Ñдок міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° перше та друге перенаправленнÑ, а також перший Ñ€Ñдок текÑту другого перенаправленнÑ, що зазвичай міÑтить «реальне» Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° необхідну Ñторінку, куди повинно вказувати й перше перенаправленнÑ.
-<s>ЗакреÑлені</s> запиÑи були виправлені.',
+<del>ЗакреÑлені</del> запиÑи були виправлені.',
'double-redirect-fixed-move' => 'Сторінка «[[$1]]» була перейменована, зараз вона Ñ” перенаправленнÑм на «[[$2]]»',
'double-redirect-fixer' => 'Redirect fixer',
@@ -1871,6 +1907,8 @@ PICT # різні
'nmembers' => "$1 {{PLURAL:$1|об'єкт|об'єкти|об'єктів}}",
'nrevisions' => '$1 {{PLURAL:$1|верÑÑ–Ñ|верÑÑ–Ñ—|верÑій}}',
'nviews' => '$1 {{PLURAL:$1|переглÑд|переглÑди|переглÑдів}}',
+'nimagelinks' => 'ВикориÑтовуєтьÑÑ Ð½Ð° $1 {{PLURAL:$1|Ñторінці|Ñторінках}}',
+'ntransclusions' => 'викориÑтовуєтьÑÑ Ð½Ð° $1 {{PLURAL:$1|Ñторінці|Ñторінках}}',
'specialpage-empty' => 'Запит не дав результатів.',
'lonelypages' => 'Статті-Ñироти',
'lonelypagestext' => 'Ðа такі Ñторінки нема поÑилань з інших Ñторінок Ñ– вони не включаютьÑÑ Ð´Ð¾ інших Ñторінок {{grammar:genitive|{{SITENAME}}}}.',
@@ -2026,34 +2064,40 @@ PICT # різні
'listgrouprights-removegroup-self-all' => 'може вилучати вÑÑ– групи зі Ñвого облікового запиÑу',
# E-mail user
-'mailnologin' => 'ВідÑÑƒÑ‚Ð½Ñ Ð°Ð´Ñ€ÐµÑа Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸',
-'mailnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до ÑиÑтеми]] Ñ– мати підтверджену адреÑу електронної пошти у ваших [[Special:Preferences|налаштуваннÑÑ…]], щоб мати змогу надÑилати електронну пошту іншим кориÑтувачам.',
-'emailuser' => 'ÐадіÑлати лиÑта',
-'emailpage' => 'ЛиÑÑ‚ кориÑтувачеві',
-'emailpagetext' => 'Заповнивши наведену нижче форму, можна надіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð¼Ñƒ кориÑтувачу.
+'mailnologin' => 'ВідÑÑƒÑ‚Ð½Ñ Ð°Ð´Ñ€ÐµÑа Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸',
+'mailnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до ÑиÑтеми]] Ñ– мати підтверджену адреÑу електронної пошти у ваших [[Special:Preferences|налаштуваннÑÑ…]], щоб мати змогу надÑилати електронну пошту іншим кориÑтувачам.',
+'emailuser' => 'ÐадіÑлати лиÑта',
+'emailpage' => 'ЛиÑÑ‚ кориÑтувачеві',
+'emailpagetext' => 'Заповнивши наведену нижче форму, можна надіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð¼Ñƒ кориÑтувачу.
Електронна адреÑа, Ñку ви зазначили у [[Special:Preferences|Ñвоїх налаштуваннÑÑ…]], буде зазначена в полі «Від кого» лиÑта, тому одержувач матиме можливіÑÑ‚ÑŒ відповіÑти безпоÑередньо вам.',
-'usermailererror' => 'При відправці Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°:',
-'defemailsubject' => '{{SITENAME}}: лиÑÑ‚',
-'noemailtitle' => 'ВідÑÑƒÑ‚Ð½Ñ Ð°Ð´Ñ€ÐµÑа електронної пошти',
-'noemailtext' => 'Цей кориÑтувач не вказав коректної адреÑи електронної пошти.',
-'nowikiemailtitle' => 'Ел. пошти не дозволено',
-'nowikiemailtext' => 'Цей кориÑтувач вирішив не отримувати ел. пошту від інших кориÑтувачів.',
-'email-legend' => 'ÐадіÑлати лиÑта іншому кориÑтувачеві {{grammar:genitive|{{SITENAME}}}}',
-'emailfrom' => 'Від кого:',
-'emailto' => 'Кому:',
-'emailsubject' => 'Тема:',
-'emailmessage' => 'ПовідомленнÑ:',
-'emailsend' => 'ÐадіÑлати',
-'emailccme' => 'ÐадіÑлати мені копію повідомленнÑ.',
-'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ $1: $2',
-'emailsent' => 'Електронне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлано',
-'emailsenttext' => 'Ваше електронне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлано.',
-'emailuserfooter' => 'Цей лиÑÑ‚ був надіÑланий кориÑтувачеві $2 від кориÑтувача $1 за допомогою функції «ÐадіÑлати лиÑта» проекту {{SITENAME}}.',
+'usermailererror' => 'При відправці Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°:',
+'defemailsubject' => '{{SITENAME}}: лиÑÑ‚',
+'usermaildisabled' => 'Електронне лиÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ кориÑтувачами вимкнене',
+'usermaildisabledtext' => 'Ви не можете надÑилати електронні лиÑти іншим кориÑтувачам цієї вікі',
+'noemailtitle' => 'ВідÑÑƒÑ‚Ð½Ñ Ð°Ð´Ñ€ÐµÑа електронної пошти',
+'noemailtext' => 'Цей кориÑтувач не вказав коректної адреÑи електронної пошти.',
+'nowikiemailtitle' => 'Ел. пошти не дозволено',
+'nowikiemailtext' => 'Цей кориÑтувач вирішив не отримувати ел. пошту від інших кориÑтувачів.',
+'email-legend' => 'ÐадіÑлати лиÑта іншому кориÑтувачеві {{grammar:genitive|{{SITENAME}}}}',
+'emailfrom' => 'Від кого:',
+'emailto' => 'Кому:',
+'emailsubject' => 'Тема:',
+'emailmessage' => 'ПовідомленнÑ:',
+'emailsend' => 'ÐадіÑлати',
+'emailccme' => 'ÐадіÑлати мені копію повідомленнÑ.',
+'emailccsubject' => 'ÐšÐ¾Ð¿Ñ–Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ $1: $2',
+'emailsent' => 'Електронне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлано',
+'emailsenttext' => 'Ваше електронне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлано.',
+'emailuserfooter' => 'Цей лиÑÑ‚ був надіÑланий кориÑтувачеві $2 від кориÑтувача $1 за допомогою функції «ÐадіÑлати лиÑта» проекту {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Залишити ÑиÑтемне повідомленнÑ.',
+'usermessage-editor' => 'СиÑтемний віÑник',
# Watchlist
'watchlist' => 'СпиÑок ÑпоÑтереженнÑ',
'mywatchlist' => 'СпиÑок ÑпоÑтереженнÑ',
-'watchlistfor' => "(кориÑтувача '''$1''')",
+'watchlistfor2' => 'Ð”Ð»Ñ $1 $2',
'nowatchlist' => 'Ваш ÑпиÑок ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ–Ð¹.',
'watchlistanontext' => 'Вам необхідно $1, щоб переглÑнути чи редагувати ÑпиÑок ÑпоÑтереженнÑ.',
'watchnologin' => 'Ви не ввійшли до ÑиÑтеми',
@@ -2171,7 +2215,10 @@ $UNWATCHURL
'revertpage' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача [[Special:Contributions/$2|$2]] ([[User talk:$2|обговореннÑ]]) відкинуті до верÑÑ–Ñ— кориÑтувача [[User:$1|$1]]',
'revertpage-nouser' => "Відкинуто Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ (ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача приховано) до зробленого [[User:$1|$1]]",
'rollback-success' => 'Відкинуті Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача $1; Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ верÑÑ–Ñ— кориÑтувача $2.',
-'sessionfailure' => 'ЗдаєтьÑÑ, виникли проблеми з поточним ÑеанÑом роботи;
+
+# Edit tokens
+'sessionfailure-title' => 'Помилка ÑеанÑу',
+'sessionfailure' => 'ЗдаєтьÑÑ, виникли проблеми з поточним ÑеанÑом роботи;
Ñ†Ñ Ð´Ñ–Ñ Ð±ÑƒÐ»Ð° ÑкаÑована з метою попередити Â«Ð·Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ ÑеанÑу».
Будь лаÑка, натиÑніть кнопку «Ðазад» Ñ– перезавантажте Ñторінку, з Ñкої ви прийшли.',
@@ -2300,18 +2347,22 @@ $1',
'month' => 'Від міÑÑÑ†Ñ (Ñ– раніше):',
'year' => 'Від року (і раніше):',
-'sp-contributions-newbies' => 'Показати лише внеÑок з нових облікових запиÑів',
-'sp-contributions-newbies-sub' => 'ВнеÑок новачків',
-'sp-contributions-newbies-title' => 'ВнеÑок з нових облікових запиÑів',
-'sp-contributions-blocklog' => 'протокол блокувань',
-'sp-contributions-deleted' => 'вилучені Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача',
-'sp-contributions-logs' => 'журнали',
-'sp-contributions-talk' => 'обговореннÑ',
-'sp-contributions-userrights' => 'ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ кориÑтувача',
-'sp-contributions-blocked-notice' => 'Цей кориÑтувач наразі заблокований. ОÑтанній Ð·Ð°Ð¿Ð¸Ñ Ñƒ журналі блокувань такий:',
-'sp-contributions-search' => 'Пошук внеÑку',
-'sp-contributions-username' => "IP-адреÑа або ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
-'sp-contributions-submit' => 'Знайти',
+'sp-contributions-newbies' => 'Показати лише внеÑок з нових облікових запиÑів',
+'sp-contributions-newbies-sub' => 'ВнеÑок новачків',
+'sp-contributions-newbies-title' => 'ВнеÑок з нових облікових запиÑів',
+'sp-contributions-blocklog' => 'протокол блокувань',
+'sp-contributions-deleted' => 'вилучені Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача',
+'sp-contributions-uploads' => 'завантаженнÑ',
+'sp-contributions-logs' => 'журнали',
+'sp-contributions-talk' => 'обговореннÑ',
+'sp-contributions-userrights' => 'ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ кориÑтувача',
+'sp-contributions-blocked-notice' => 'Цей кориÑтувач наразі заблокований. ОÑтанній Ð·Ð°Ð¿Ð¸Ñ Ñƒ журналі блокувань такий:',
+'sp-contributions-blocked-notice-anon' => 'ДоÑтуп з цієї IP-адреÑи зараз заблокований.
+Далі наведено оÑтанній Ð·Ð°Ð¿Ð¸Ñ Ð· журналу блокувань:',
+'sp-contributions-search' => 'Пошук внеÑку',
+'sp-contributions-username' => "IP-адреÑа або ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
+'sp-contributions-toponly' => 'Показувати тільки редагуваннÑ, що Ñ” оÑтанніми верÑÑ–Ñми',
+'sp-contributions-submit' => 'Знайти',
# What links here
'whatlinkshere' => 'ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñюди',
@@ -2372,7 +2423,6 @@ $1',
'ipb-edit-dropdown' => 'Редагувати причини блокувань',
'ipb-unblock-addr' => 'Розблокувати $1',
'ipb-unblock' => 'Розблокувати кориÑтувача або IP-адреÑу',
-'ipb-blocklist-addr' => 'Чинні Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ $1',
'ipb-blocklist' => 'Показати чинні блокуваннÑ',
'ipb-blocklist-contribs' => 'ВнеÑок кориÑтувача $1',
'unblockip' => 'Розблокувати IP-адреÑу',
@@ -2443,6 +2493,8 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'sorbs_create_account_reason' => 'Ваша IP-адреÑа чиÑлитьÑÑ Ñк відкритий прокÑÑ– в DNSBL. Ви не можете Ñтворити обліковий запиÑ.',
'cant-block-while-blocked' => 'Ви не можете блокувати інших кориÑтувачів, поки ви Ñамі заблоковані.',
'cant-see-hidden-user' => 'КориÑтувача, Ñкого ви хочете заблокувати, вже заблоковано та приховано. ОÑкільки у Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав щодо Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів, ви не можете переглÑнути або змінити дане блокуваннÑ.',
+'ipbblocked' => 'Ви не можете блокувати чи розблоковувати інших кориÑтувачів, оÑкільки Ñамі заблоковані',
+'ipbnounblockself' => 'Ви не можете розблокувати Ñебе',
# Developer tools
'lockdb' => 'Заблокувати базу даних (режим "тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ")',
@@ -2479,6 +2531,17 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'''ПОПЕРЕДЖЕÐÐЯ!'''
Ð¦Ñ Ð´Ñ–Ñ Ð¼Ð¾Ð¶Ðµ Ñтати причиною Ñерйозних та неочікуваних змін популÑрних Ñторінок.
Будь лаÑка, перед продовженнÑм переконайтеÑÑŒ, що ви розумієте вÑÑ– можливі наÑлідки.",
+'movepagetext-noredirectfixer' => "Ð¦Ñ Ñ„Ð¾Ñ€Ð¼Ð° дозволÑÑ” перейменувати Ñторінку з одночаÑним переміщеннÑм Ñ—Ñ— журналу змін.
+Стара назва Ñтане перенаправленнÑм на нову.
+Будь лаÑка, не забудьте виправити [[Special:DoubleRedirects|подвійні]] Ñ– [[Special:BrokenRedirects|розірвані перенаправленнÑ]].
+Ви відповідаєте за те, щоб поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ– далі вказували туди, куди треба.
+
+Зверніть увагу, що Ñторінка '''не буде''' перейменована, Ñкщо Ñторінка з новою назвою вже Ñ–Ñнує, крім випадків, коли вона Ñ” перенаправленнÑм або Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ Ñ‚Ð° не має Ñ–Ñторії редагувань.
+Це означає, що Ви можете перейменувати Ñторінку назад, Ñкщо Ви допуÑтилиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸, Ñ– при цьому не зможете випадково перезапиÑати Ñ–Ñнуючу Ñторінку.
+
+'''ПопередженнÑ!'''
+ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ призвеÑти до маÑштабних Ñ– неÑподіваних змін Ð´Ð»Ñ ''популÑрних'' Ñторінок.
+Тому перед перейменуваннÑм упевнітьÑÑ, що Ви розумієте оцінили можливі наÑлідки.",
'movepagetalktext' => "Приєднана Ñторінка Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð°ÐºÐ¾Ð¶ буде автоматично перейменована, '''окрім наÑтупних випадків:'''
* ÐÐµÐ¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ Ñторінка Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð· такою назвою вже Ñ–Ñнує або
* Ви не поÑтавили галочку в полі нижче.
@@ -2534,6 +2597,7 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'immobile-source-page' => 'Цю Ñторінку не можна перейменувати.',
'immobile-target-page' => 'Ðе можна приÑвоїти Ñторінці цю назву.',
'imagenocrossnamespace' => 'Ðеможливо дати файлові назву з іншого проÑтору назв',
+'nonfile-cannot-move-to-file' => 'Ðе можна перейменовувати Ñторінки з інших проÑторів назв на файли',
'imagetypemismatch' => 'Ðове Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ не Ñпівпадає з його типом',
'imageinvalidfilename' => 'Ðазва цільового файлу неправильна',
'fix-double-redirects' => 'Виправити вÑÑ– Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° попередню назву',
@@ -2612,6 +2676,7 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'importstart' => 'Імпорт Ñторінок…',
'import-revision-count' => '$1 {{PLURAL:$1|верÑÑ–Ñ|верÑÑ–Ñ—|верÑій}}',
'importnopages' => 'Сторінки Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ відÑутні.',
+'imported-log-entries' => '{{PLURAL:$1|Заімпортований $1 Ð·Ð°Ð¿Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ|Заімпортовані $1 запиÑи журналу|Заімпортовані $1 запиÑів журналу}}.',
'importfailed' => 'Ðе вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸: $1',
'importunknownsource' => 'Ðевідомий тип імпортованої Ñторінки',
'importcantopen' => 'Ðеможливо відкрити файл імпорту',
@@ -2704,6 +2769,8 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'tooltip-upload' => 'Почати завантаженнÑ',
'tooltip-rollback' => 'Одним кліком прибрати зміни, зроблені оÑтаннім редактором',
'tooltip-undo' => 'Прибрати внеÑені зміни Ñ– показати попередній переглÑд. ДозволÑÑ” зазначити причину ÑкаÑуваннÑ.',
+'tooltip-preferences-save' => 'Зберегти налаштуваннÑ',
+'tooltip-summary' => 'Введіть короткий опиÑ',
# Stylesheets
'common.css' => '/** Розміщений тут CSS буде заÑтоÑовуватиÑÑ Ð´Ð¾ вÑÑ–Ñ… тем Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
@@ -2829,14 +2896,17 @@ $1',
'thumbsize' => 'Розмір зменшеної верÑÑ–Ñ— зображеннÑ:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|$3 Ñторінка|$3 Ñторінки|$3 Ñторінок}}',
-'file-info' => '(розмір файлу: $1, MIME-тип: $2)',
-'file-info-size' => '($1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4)',
+'file-info' => 'розмір файлу: $1, MIME-тип: $2',
+'file-info-size' => '$1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4',
'file-nohires' => '<small>Ðема верÑÑ–Ñ— з більшою роздільніÑÑ‚ÑŽ.</small>',
-'svg-long-desc' => '(SVG-файл, номінально $1 × $2 пікÑелів, розмір файлу: $3)',
+'svg-long-desc' => 'SVG-файл, номінально $1 × $2 пікÑелів, розмір файлу: $3',
'show-big-image' => 'Повна роздільніÑÑ‚ÑŒ',
'show-big-image-thumb' => '<small>Розмір при попередньому переглÑді: $1 × $2 пікÑелів</small>',
'file-info-gif-looped' => 'кільцеве',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадр|кадри|кадрів}}',
+'file-info-png-looped' => 'закільцьований',
+'file-info-png-repeat' => 'продемонÑтрований $1 {{PLURAL:$1|раз|рази|разів}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадр|кадри|кадрів}}',
# Special:NewFiles
'newimages' => 'Ð“Ð°Ð»ÐµÑ€ÐµÑ Ð½Ð¾Ð²Ð¸Ñ… файлів',
@@ -2850,6 +2920,9 @@ $1',
'bydate' => 'за датою',
'sp-newimages-showfrom' => 'Показати нові зображеннÑ, починаючи з $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'minutes-abbrev' => 'хв',
+
# Bad image list
'bad_image_list' => 'Формат має бути наÑтупним:
@@ -2924,9 +2997,9 @@ $1',
'exif-spectralsensitivity' => 'Спектральна чутливіÑÑ‚ÑŒ',
'exif-isospeedratings' => 'СвітлочутливіÑÑ‚ÑŒ ISO',
'exif-oecf' => 'OECF (коефіцієнт оптикоелектричного перетвореннÑ)',
-'exif-shutterspeedvalue' => 'Витримка',
-'exif-aperturevalue' => 'Діафрагма',
-'exif-brightnessvalue' => 'ЯÑкравіÑÑ‚ÑŒ',
+'exif-shutterspeedvalue' => 'Витримка в APEX',
+'exif-aperturevalue' => 'Діафрагма в APEX',
+'exif-brightnessvalue' => 'ЯÑкравіÑÑ‚ÑŒ в APEX',
'exif-exposurebiasvalue' => 'КомпенÑÐ°Ñ†Ñ–Ñ ÐµÐºÑпозиції',
'exif-maxaperturevalue' => 'Мінімальне чиÑло діафрагми',
'exif-subjectdistance' => "ВідÑтань до об'єкту",
@@ -2991,6 +3064,7 @@ $1',
'exif-gpsareainformation' => 'Ðазва облаÑÑ‚Ñ– GPS',
'exif-gpsdatestamp' => 'Дата',
'exif-gpsdifferential' => 'Диференціальна поправка',
+'exif-objectname' => 'Коротка назва',
# EXIF attributes
'exif-compression-1' => 'ÐеÑтиÑнутий',
@@ -3153,25 +3227,25 @@ $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' => '{{SITENAME}} не може надіÑлати лиÑта із запитом на підтвердженнÑ.
+'confirmemail_send' => 'ÐадіÑлати лиÑÑ‚ із запитом на підтвердженнÑ',
+'confirmemail_sent' => 'ЛиÑÑ‚ із запитом на Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹.',
+'confirmemail_oncreate' => "Код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¾ на вашу електронну адреÑу. Цей код не вимагаєтьÑÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ в ÑиÑтему, але він вам знадобитьÑÑ Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— будь-Ñких можливоÑтей вікі, що пов'Ñзані з викориÑтаннÑм електронної пошти.",
+'confirmemail_sendfailed' => '{{SITENAME}} не може надіÑлати лиÑта із запитом на підтвердженнÑ.
Будь лаÑка, перевірте правильніÑÑ‚ÑŒ адреÑи електронної пошти.
Відповідь Ñервера: $1',
-'confirmemail_invalid' => 'Ðевірний код підтвердженнÑ, або термін дії коду вичерпавÑÑ.',
-'confirmemail_needlogin' => 'Ð”Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ñ— адреÑи електронної пошти вам необхідно $1.',
-'confirmemail_success' => 'Вашу адреÑу електронної пошти підтверджено.',
-'confirmemail_loggedin' => 'Вашу адреÑу електронної пошти підтверджено.',
-'confirmemail_error' => 'Під Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи електронної пошти ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.',
-'confirmemail_subject' => '{{SITENAME}}:Запит на Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи ел. пошти',
-'confirmemail_body' => 'ХтоÑÑŒ з IP-адреÑою $1 зареєÑтрував на Ñервері проекту {{SITENAME}} обліковий запиÑ
+'confirmemail_invalid' => 'Ðевірний код підтвердженнÑ, або термін дії коду вичерпавÑÑ.',
+'confirmemail_needlogin' => 'Ð”Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ñ— адреÑи електронної пошти вам необхідно $1.',
+'confirmemail_success' => 'Вашу адреÑу електронної пошти підтверджено.',
+'confirmemail_loggedin' => 'Вашу адреÑу електронної пошти підтверджено.',
+'confirmemail_error' => 'Під Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи електронної пошти ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.',
+'confirmemail_subject' => '{{SITENAME}}:Запит на Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи ел. пошти',
+'confirmemail_body' => 'ХтоÑÑŒ з IP-адреÑою $1 зареєÑтрував на Ñервері проекту {{SITENAME}} обліковий запиÑ
«$2», вказавши вашу адреÑу електронної пошти.
Щоб підтвердити, що ви дозволÑєте викориÑтовувати вашу адреÑу електронної пошти в цьому проекті, відкрийте у браузері наведене нижче поÑиланнÑ:
@@ -3184,8 +3258,36 @@ $3
$5
Цей код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ñ–Ð¹Ñний до $4.',
-'confirmemail_invalidated' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи електронної пошти ÑкаÑоване',
-'invalidateemail' => 'СкаÑувати Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи електронної пошти',
+'confirmemail_body_changed' => 'ХтоÑÑŒ (можливо ви) з IP-адреÑи $1
+вказав дану адреÑу електронної пошти Ñк нову Ð´Ð»Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу «$2» в проекті {{SITENAME}}.
+
+Ðби підтвердити, що цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ñправді ваш,
+й увімкнути Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ð¸Ñтів з Ñайту {{SITENAME}}, відкрийте наÑтупне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ веб-оглÑдачі:
+
+$3
+
+Якщо даний обліковий Ð·Ð°Ð¿Ð¸Ñ *не* належить вам, то перейдіть за наÑтупним поÑиланнÑм,
+щоб відмінити Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи:
+
+$5
+
+Код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ñ–Ð¹Ñний до $4.',
+'confirmemail_body_set' => 'ХтоÑÑŒ (можливо ви) з IP-адреÑи $1
+назначив цю електронну Ñкриньку Ð´Ð»Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу «$2» в проекті {{SITENAME}}.
+
+Ðби підтвердити, що цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ñправді належить вам, Ñ– дозволити надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð»Ð¸Ñтів
+з Ñайту {{SITENAME}}, відкрийте наÑтупне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ веб-оглÑдачі:
+
+$3
+
+Якщо даний обліковий Ð·Ð°Ð¿Ð¸Ñ *не* належить вам, перейдіть за наÑтупним поÑиланнÑм
+Ñ– відмініть цим Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— адреÑи:
+
+$5
+
+Код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ñ–Ð¹Ñний до $4.',
+'confirmemail_invalidated' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи електронної пошти ÑкаÑоване',
+'invalidateemail' => 'СкаÑувати Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи електронної пошти',
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» вимкнено]',
@@ -3227,6 +3329,7 @@ $1',
'table_pager_first' => 'Перша Ñторінка',
'table_pager_last' => 'ОÑÑ‚Ð°Ð½Ð½Ñ Ñторінка',
'table_pager_limit' => 'Показувати $1 елементів на Ñторінці',
+'table_pager_limit_label' => 'ЗапиÑів на Ñторінку:',
'table_pager_limit_submit' => 'Виконати',
'table_pager_empty' => 'Ðе знайдено',
@@ -3287,6 +3390,7 @@ $1',
'version-specialpages' => 'Спеціальні Ñторінки',
'version-parserhooks' => 'Перехоплювачі ÑинтакÑичного аналізатора',
'version-variables' => 'Змінні',
+'version-skins' => 'ОформленнÑ',
'version-other' => 'Інше',
'version-mediahandlers' => 'Обробники медіа',
'version-hooks' => 'Перехоплювачі',
@@ -3298,6 +3402,13 @@ $1',
'version-hook-subscribedby' => 'ПідпиÑаний на',
'version-version' => '(ВерÑÑ–Ñ $1)',
'version-license' => 'ЛіцензіÑ',
+'version-poweredby-credits' => "Ð¦Ñ Ð’Ñ–ÐºÑ– працює на ÑиÑтемі ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ð¼Ñ–Ñтом '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'інші',
+'version-license-info' => 'MediaWiki Ñ” вільним програмним забезпеченнÑм, ви можете розповÑюджувати та/або модифікувати його відповідно до умов GNU General Public License, Ñка Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ¾Ð²Ð°Ð½Ñ Ñ„Ð¾Ð½Ð´Ð¾Ð¼ вільного програмного забезпеченнÑ; або верÑÑ–Ñ— 2 Ліцензії, або (на Ваш розÑуд) будь-Ñкої наÑтупної верÑÑ–Ñ—.
+
+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, СШРабо [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитайте Ñ—Ñ— онлайн].',
'version-software' => 'УÑтановлене програмне забезпеченнÑ',
'version-software-product' => 'Продукт',
'version-software-version' => 'ВерÑÑ–Ñ',
@@ -3367,6 +3478,15 @@ $1',
'tags-edit' => 'редагувати',
'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
+# Special:ComparePages
+'comparepages' => 'ПорівнÑÐ½Ð½Ñ Ñторінок',
+'compare-selector' => 'ПорівнÑÐ½Ð½Ñ Ð²ÐµÑ€Ñій Ñторінок',
+'compare-page1' => 'Сторінка 1',
+'compare-page2' => 'Сторінка 2',
+'compare-rev1' => 'ВерÑÑ–Ñ 1',
+'compare-rev2' => 'ВерÑÑ–Ñ 2',
+'compare-submit' => 'ПорівнÑти',
+
# Database error messages
'dberr-header' => 'Ð¦Ñ Ð²Ñ–ÐºÑ– має проблеми',
'dberr-problems' => 'Вибачте! Ðа цьому Ñайті виникли технічні труднощі.',
@@ -3383,8 +3503,13 @@ $1',
'htmlform-float-invalid' => 'Вказане вами Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” чиÑлом.',
'htmlform-int-toolow' => 'Вказане вами Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ за мінімальне — $1',
'htmlform-int-toohigh' => 'Зазначене вами Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ñ‰Ðµ за макÑимальне — $1',
+'htmlform-required' => "Це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð±Ð¾Ð²'Ñзкове",
'htmlform-submit' => 'Відправити',
'htmlform-reset' => 'Відкотити зміни',
'htmlform-selectorother-other' => 'Інше',
+# SQLite database support
+'sqlite-has-fts' => '$1 з підтримкою повнотекÑтового пошуку',
+'sqlite-no-fts' => '$1 без підтримки повнотекÑтового пошуку',
+
);
diff --git a/languages/messages/MessagesUr.php b/languages/messages/MessagesUr.php
index 87837d79..481dd235 100644
--- a/languages/messages/MessagesUr.php
+++ b/languages/messages/MessagesUr.php
@@ -13,6 +13,7 @@
* @author Reedy
* @author Wisesabre
* @author לערי ריינה×רט
+ * @author سمرقندی
* @author محبوب عالم
*/
@@ -62,8 +63,7 @@ $messages = array(
'tog-editsection' => '[ترمیم] روابط Ú©Û’ ذریعے سطری ترمیم کاری Ùعال کرو',
'tog-editsectiononrightclick' => 'سطری عنوانات پر دایاں طق Ú©Û’ ذریعے سطری ترمیم کاری Ùعال بناؤ',
'tog-showtoc' => 'ÙÛرست٠مندرجات دکھاؤ (3 سے Ø²ÛŒØ§Ø¯Û Ø³Ø±Ø®ÛŒÙˆÚº والے صÙحات کیلئے)',
-'tog-rememberpassword' => 'اÙس Ø´Ù…Ø§Ø±Ù†Ø¯Û Ù¾Ø± میری Ø¯Ø§Ø®Ù„Û Ú©Ø§Ø±ÛŒ معلومات یاد رکھو',
-'tog-editwidth' => 'تدوینی Ø®Ø§Ù†Û Ú©Ùˆ اتنا چوڑا کرو Ú©Û ÛŒÛ Ù¾ÙˆØ±ÛŒ سکرین پر محیط Ûوجائے',
+'tog-rememberpassword' => 'اÙس Ø´Ù…Ø§Ø±Ù†Ø¯Û Ù¾Ø± میری Ø¯Ø§Ø®Ù„Û Ú©Ø§Ø±ÛŒ معلومات یاد رکھو (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'میرے مرتب Ø´Ø¯Û ØµÙحات Ú©Ùˆ میری زیرÙنظرÙÛرست میں شامل کیا کرو',
'tog-watchdefault' => 'میرے ترمیم Ø´Ø¯Û ØµÙحات Ú©Ùˆ میری زیرÙنظرÙÛرست میں شامل کیا کرو',
'tog-watchmoves' => 'میں جن صÙحات Ú©Ùˆ منتقل کرتا Ûوں، اÙÙ† Ú©Ùˆ میری زیرÙنظرÙÛرست میں شامل کیا کرو',
@@ -99,8 +99,9 @@ $messages = array(
'underline-default' => 'متصÙØ­ کا Ø·Û’ شدÛ',
# Font style option in Special:Preferences
-'editfont-style' => 'خانۂ تدوین کا انداز٠تحریر:',
-'editfont-default' => 'متصÙØ­ کا Ø·Û’ شدÛ',
+'editfont-style' => 'خانۂ تدوین کا انداز٠تحریر:',
+'editfont-default' => 'متصÙØ­ کا Ø·Û’ شدÛ',
+'editfont-monospace' => 'یکÙضائی نویسÛ',
# Dates
'sunday' => 'اتوار',
@@ -191,29 +192,18 @@ $messages = array(
'faqpage' => 'Project:معلومات٠عامÛ',
# Vector skin
-'vector-action-addsection' => 'نیا موضوع',
-'vector-action-delete' => 'حذ٠کرو',
-'vector-action-move' => 'منتقل کرو',
-'vector-action-protect' => 'محÙوظ کرو',
-'vector-action-unprotect' => 'غیر محÙوظ',
-'vector-namespace-category' => 'زمرÛ',
-'vector-namespace-help' => 'صÙØ­Û‚ مدد',
-'vector-namespace-image' => 'ملÙ',
-'vector-namespace-main' => 'صÙØ­Û',
-'vector-namespace-media' => 'صÙØ­Û‚ وسیط',
-'vector-namespace-mediawiki' => 'پیغام',
-'vector-namespace-project' => 'صÙØ­Û‚ منصوبÛ',
-'vector-namespace-special' => 'خاص صÙØ­Û',
-'vector-namespace-talk' => 'تبادلÛÙ´ خیال',
-'vector-namespace-template' => 'سانچÛ',
-'vector-namespace-user' => 'صÙØ­Û‚ صارÙ',
-'vector-view-create' => 'تخلیق',
-'vector-view-edit' => 'ترمیم',
-'vector-view-history' => 'تاریخچÛ',
-'vector-view-view' => 'پڑھیں',
-'vector-view-viewsource' => 'مسودÛ',
-'actions' => 'ایکشنز',
-'namespaces' => 'جائے نام',
+'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' => 'خطاء',
'returnto' => 'واپس $1۔',
@@ -436,7 +426,7 @@ Warning: Page may not contain recent updates.',
'yourname' => 'اسم٠رکنیت',
'yourpassword' => 'کلمۂ شناخت',
'yourpasswordagain' => 'کلمۂ شناخت Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾ÛŒÚº',
-'remembermypassword' => 'مجھے یاد رکھیں',
+'remembermypassword' => 'مجھے یاد رکھیں (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'آپکا ڈومین',
'externaldberror' => 'یا تو توثیقی ڈیٹابیس میں خطا واقع Ûوئی اور یا آپ Ú©Ùˆ بیرونی Ú©Ú¾Ø§ØªÛ Ø¨ØªØ§Ø±ÛŒØ® کرنے Ú©ÛŒ اÙجازت Ù†Ûیں ÛÛ’.',
'login' => 'داخل ÛÙˆÚº',
@@ -453,6 +443,7 @@ Warning: Page may not contain recent updates.',
'gotaccount' => "Ù¾ÛÙ„Û’ سے Ú©Ú¾Ø§ØªÛ Ø¨Ù†Ø§ Ûوا ÛÛ’? '''$1'''.",
'gotaccountlink' => 'داخل Ûوجائیے',
'createaccountmail' => 'بذریعۂ برقی ڈاک',
+'createaccountreason' => 'وجÛ:',
'badretype' => 'درج Ø´Ø¯Û Ú©Ù„Ù…Û‚ شناخت اصل سے مطابقت Ù†Ûیں رکھتا۔',
'userexists' => 'درج Ø´Ø¯Û Ø§Ø³Ù…Ù ØµØ§Ø±Ù Ù¾ÛÙ„Û’ سے زیرÙاستعمال ÛÛ’.
براÛ٠کرم، کوئی دوسرا اسم٠صار٠استعمال کریں.',
@@ -1118,7 +1109,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'میری زیرنظرÙÛرست',
'mywatchlist' => 'میری زیرنظرÙÛرست',
-'watchlistfor' => "(براۓ '''$1''')",
'addedwatch' => 'زیر نظر ÙÛرست میں اندراج کردیاگیا',
'addedwatchtext' => "ÛŒÛ ØµÙØ­Û \"<nowiki>\$1</nowiki>\" آپکی [[Special:Watchlist|زیرنظر]] ÙÛرست میں شامل کردیا گیا ÛÛ’Û” اب مستقل میں اس صÙØ­Û’ اور اس سے Ù…Ù„Ø­Ù‚Û ØªØ¨Ø§Ø¯Ù„Û Ø®ÛŒØ§Ù„ کا صÙØ­Û’ میں Ú©ÛŒ جانے والی تبدیلوں کا اندراج کیا جاتا رÛÛ’ گا، اور ان صÙحات Ú©ÛŒ شناخت Ú©Ùˆ سÛÙ„ بنانے Ú©Û’ لیۓ [[Special:Ø­Ø§Ù„ÛŒÛ ØªØ¨Ø¯ÛŒÙ„ÛŒØ§Úº|Ø­Ø§Ù„ÛŒÛ ØªØ¨Ø¯ÛŒÙ„ÛŒÙˆÚº Ú©ÛŒ ÙÛرست]] میں انکو '''Ù…Ùتَجَل''' (bold) تحریر کیا جاۓ گا۔ <p> اگر آپ کسی وقت اس صÙØ­Û Ú©Ùˆ زیرنظرÙÛرست سے خارج کرنا چاÛیں تو اوپر دیۓ Ú¯Û“ \"زیرنظرمنسوخ\" پر Ù¹Ú© کیجیۓ۔",
'removedwatch' => 'زیرنظرÙÛرست سے خارج کر دیا گیا',
diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php
index 4b9f36fd..b3db4124 100644
--- a/languages/messages/MessagesUz.php
+++ b/languages/messages/MessagesUz.php
@@ -34,7 +34,7 @@ $namespaceNames = array(
NS_CATEGORY => 'Turkum',
NS_CATEGORY_TALK => 'Turkum_munozarasi',
);
-
+
$namespaceAliases = array(
'Mediya' => NS_MEDIA,
'MediyaViki' => NS_MEDIAWIKI,
@@ -237,7 +237,7 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
'yourname' => 'Foydalanuvchi nomi',
'yourpassword' => "Maxfiy so'z",
'yourpasswordagain' => "Maxfiy so'zni qayta kiriting",
-'remembermypassword' => "Hisob ma'lumotlarini shu kompyuterda eslab qolish",
+'remembermypassword' => "Hisob ma'lumotlarini shu kompyuterda eslab qolish (for a maximum of $1 {{PLURAL:$1|day|days}})",
'login' => 'Kirish',
'nav-login-createaccount' => 'Kirish / Hisob yaratish',
'loginprompt' => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
@@ -307,8 +307,6 @@ Siz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini
'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!'''",
-'longpagewarning' => "'''DIQQAT: Ushbu sahifa hajmi $1 kilobaytdir; ayrim browser'lar 32 kb dan oshiq hajmli sahifalarni tahrirlashda muammolarga duch kelishi mumkin.
-Agar sizda shunday muammolar yuzaga kelsa, iltimos, sahifani butunlay emas, qismlab tahrirlang.'''",
'templatesused' => 'Ushbu sahifada ishlatilgan andozalar:',
'template-protected' => '(himoyalangan)',
'template-semiprotected' => '(yarim-himoyalangan)',
@@ -502,7 +500,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Kuzatuv roʻyxatim',
'mywatchlist' => 'Kuzatuv roʻyxatim',
-'watchlistfor' => "('''$1''' uchun)",
'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
'addedwatch' => "Kuzatuv ro'yxatiga qo'shildi",
'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.
@@ -654,9 +651,9 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
# Media information
'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-info-size' => '$1 × $2 piksel, fayl hajmi: $3, MIME tipi: $4',
'file-nohires' => '<small>Bundan kattaroq tasvir yoʻq.</small>',
-'svg-long-desc' => '(SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3)',
+'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
'show-big-image' => 'Asl hajmdagi tasvir',
'show-big-image-thumb' => '<small>Ushbu koʻrinish oʻlchamlari: $1 × $2 piksel</small>',
diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php
index b41dc599..3a03aa44 100644
--- a/languages/messages/MessagesVec.php
+++ b/languages/messages/MessagesVec.php
@@ -9,8 +9,10 @@
*
* @author BrokenArrow
* @author Candalua
+ * @author Frigotoni
* @author Nick1915
* @author Omnipaedista
+ * @author OrbiliusMagister
* @author Reedy
* @author Urhixidur
* @author Vajotwo
@@ -52,11 +54,11 @@ $namespaceAliases = array(
$specialPageAliases = array(
'DoubleRedirects' => array( 'DópiRimandi' ),
- 'BrokenRedirects' => array( 'RimandiSbaglià' ),
+ 'BrokenRedirects' => array( 'RimandiSbalià' ),
'Disambiguations' => array( 'Disanbiguassion' ),
'Userlogin' => array( 'Entra' ),
'Userlogout' => array( 'VàFora' ),
- 'CreateAccount' => array( 'CreaAccount' ),
+ 'CreateAccount' => array( 'CreaUtente' ),
'Preferences' => array( 'Preferense' ),
'Watchlist' => array( 'TegnùiDeOcio' ),
'Recentchanges' => array( 'ÙltimiCanbiamenti' ),
@@ -66,36 +68,37 @@ $specialPageAliases = array(
'Listusers' => array( 'Utenti' ),
'Listgrouprights' => array( 'ListaDiritiDeGrupo' ),
'Statistics' => array( 'Statìsteghe' ),
- 'Randompage' => array( 'PàxenaACaso' ),
- 'Lonelypages' => array( 'PàxenaÒrfana' ),
- 'Uncategorizedpages' => array( 'PàxeneSensaCategorie' ),
+ 'Randompage' => array( 'PaginaAOcio' ),
+ 'Lonelypages' => array( 'PagineSolitarie' ),
+ 'Uncategorizedpages' => array( 'PagineSensaCategorie' ),
'Uncategorizedcategories' => array( 'CategorieSensaCategorie' ),
'Uncategorizedimages' => array( 'FileSensaCategorie' ),
- 'Uncategorizedtemplates' => array( 'ModèiMiaCategorizà' ),
+ 'Uncategorizedtemplates' => array( 'ModèiSensaCategorie' ),
'Unusedcategories' => array( 'CategorieMiaDoparà' ),
'Unusedimages' => array( 'FileMiaDoparà' ),
- 'Wantedpages' => array( 'PàxeneRichieste' ),
- 'Wantedcategories' => array( 'CategorieRichieste' ),
- 'Wantedfiles' => array( 'FileRichiesti' ),
- 'Wantedtemplates' => array( 'ModèiRichiesti' ),
- 'Mostlinked' => array( 'PàxenePiassèRiciamà' ),
- 'Mostlinkedcategories' => array( 'CategoriePiassèRiciamà' ),
+ 'Wantedpages' => array( 'PagineDomandà' ),
+ 'Wantedcategories' => array( 'CategorieDomandà' ),
+ 'Wantedfiles' => array( 'FileDomandà' ),
+ 'Wantedtemplates' => array( 'ModèiDomandà' ),
+ 'Mostlinked' => array( 'PaginePiassèRiciamà' ),
+ 'Mostlinkedcategories' => array( 'CategoriePiassèDoparà' ),
'Mostlinkedtemplates' => array( 'ModèiPiassèDoparà' ),
- 'Mostimages' => array( 'FilePiassèRiciamà' ),
- 'Mostcategories' => array( 'PàxeneConPiassèCategorie' ),
- 'Mostrevisions' => array( 'PàxeneConPiassèRevision' ),
- 'Fewestrevisions' => array( 'PàxeneConMancoRevision' ),
- 'Shortpages' => array( 'PàxenePiCurte' ),
- 'Longpages' => array( 'PàxenePiLonghe' ),
- 'Newpages' => array( 'PàxenePiNove' ),
- 'Ancientpages' => array( 'PàxeneMancoNove' ),
- 'Deadendpages' => array( 'PàxeneSensaUscita' ),
- 'Protectedpages' => array( 'PàxeneProtete' ),
+ 'Mostimages' => array( 'FilePiassèDoparà' ),
+ 'Mostcategories' => array( 'PagineConPiassèCategorie' ),
+ 'Mostrevisions' => array( 'PagineConPiassèRevision' ),
+ 'Fewestrevisions' => array( 'PagineConMancoRevision' ),
+ 'Shortpages' => array( 'PaginePiCurte' ),
+ 'Longpages' => array( 'PaginePiLonghe' ),
+ 'Newpages' => array( 'PagineNove' ),
+ 'Ancientpages' => array( 'PagineMancoNove' ),
+ 'Deadendpages' => array( 'PagineSensaUscita' ),
+ 'Protectedpages' => array( 'PagineProtete' ),
'Protectedtitles' => array( 'TitoliProteti' ),
- 'Allpages' => array( 'TuteLePàxene' ),
+ 'Allpages' => array( 'TuteLePagine' ),
'Prefixindex' => array( 'Prefissi' ),
'Ipblocklist' => array( 'IPBlocài' ),
- 'Specialpages' => array( 'PàxeneSpeciali' ),
+ 'Unblock' => array( 'Desbloca' ),
+ 'Specialpages' => array( 'PagineSpeciali' ),
'Contributions' => array( 'Contributi' ),
'Emailuser' => array( 'MandaEMail' ),
'Confirmemail' => array( 'ConfermaEMail' ),
@@ -116,28 +119,30 @@ $specialPageAliases = array(
'Userrights' => array( 'ParmessiUtente' ),
'MIMEsearch' => array( 'SercaMIME' ),
'FileDuplicateSearch' => array( 'SercaDopioniDeiFile' ),
- 'Unwatchedpages' => array( 'PàxeneMiaTegnùDeOcio' ),
+ 'Unwatchedpages' => array( 'PagineMiaTegnùDeOcio' ),
'Listredirects' => array( 'Rimandi' ),
'Revisiondelete' => array( 'ScancelaRevision' ),
'Unusedtemplates' => array( 'ModèiMiaDoparà' ),
- 'Randomredirect' => array( 'RImandoCasuale' ),
- 'Mypage' => array( 'LaMePàxenaUtente' ),
+ 'Randomredirect' => array( 'UnRimandoAOcio' ),
+ 'Mypage' => array( 'LaMePaginaUtente' ),
'Mytalk' => array( 'LeMeDiscussion' ),
'Mycontributions' => array( 'IMeContributi' ),
'Listadmins' => array( 'Aministradori' ),
'Listbots' => array( 'ListaDeiBot' ),
- 'Popularpages' => array( 'PàxenePiassèVisità' ),
+ 'Popularpages' => array( 'PaginePiassèVisità' ),
'Search' => array( 'Serca' ),
'Resetpass' => array( 'ReinpostaPassword' ),
- 'Withoutinterwiki' => array( 'PàxeneSensaInterwiki' ),
+ 'Withoutinterwiki' => array( 'PagineSensaInterwiki' ),
'MergeHistory' => array( 'FondiCronologia' ),
'Filepath' => array( 'PercorsoFile' ),
'Invalidateemail' => array( 'InvalidaEMail' ),
- 'Blankpage' => array( 'PàxenaVoda' ),
+ 'Blankpage' => array( 'PaginaVoda' ),
'LinkSearch' => array( 'SercaLigamenti' ),
'DeletedContributions' => array( 'ContributiScancelà' ),
'Tags' => array( 'Tag' ),
'Activeusers' => array( 'UtentiAtivi' ),
+ 'ComparePages' => array( 'ConfrontaPagine' ),
+ 'Badtitle' => array( 'TitoloSbalià' ),
);
$messages = array(
@@ -156,8 +161,7 @@ $messages = array(
'tog-editsection' => 'Modifega de łe sesion tramite el cołegamento [modifega]',
'tog-editsectiononrightclick' => 'Modifega de łe sesion tramite clic destro sol titoło (el richiede JavaScript)',
'tog-showtoc' => "Mostra l'indexe par łe pajine con pì de 3 sesion",
-'tog-rememberpassword' => 'Ricorda Å‚a password so sto computer (el richiede de asetare i cookies)',
-'tog-editwidth' => 'Slarga al masimo ła caseła de modifega',
+'tog-rememberpassword' => 'Tiente in mente la me password so sto computer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
'tog-watchcreations' => 'Zonta łe pajine creae a i oservai spesałi',
'tog-watchdefault' => 'Zonta łe pajine modifegae a i oservai spesałi',
'tog-watchmoves' => 'Zonta łe pajine spostae a i oservai spesałi',
@@ -304,31 +308,21 @@ I seguenti cołegamenti i xé en łengua inglese:
'faqpage' => 'Project:Domande frequenti',
# Vector skin
-'vector-action-addsection' => 'Zonta discusion',
-'vector-action-delete' => 'Scanseła',
-'vector-action-move' => 'Sposta',
-'vector-action-protect' => 'Protezi',
-'vector-action-undelete' => 'Recupera',
-'vector-action-unprotect' => 'Sbloca',
-'vector-namespace-category' => 'Categoria',
-'vector-namespace-help' => 'Ajuto',
-'vector-namespace-image' => 'File',
-'vector-namespace-main' => 'Pajina',
-'vector-namespace-media' => 'File multimediałe',
-'vector-namespace-mediawiki' => 'Mesajo',
-'vector-namespace-project' => 'Pajina de servisio',
-'vector-namespace-special' => 'Pajina spesałe',
-'vector-namespace-talk' => 'Discusion',
-'vector-namespace-template' => 'Modeło',
-'vector-namespace-user' => 'Pajina utente',
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Canbia',
-'vector-view-history' => 'Varda la storia',
-'vector-view-view' => 'Lezi',
-'vector-view-viewsource' => 'Varda el testo',
-'actions' => 'Asion',
-'namespaces' => 'Namespace',
-'variants' => 'Varianse',
+'vector-action-addsection' => 'Zonta discusion',
+'vector-action-delete' => 'Scanseła',
+'vector-action-move' => 'Sposta',
+'vector-action-protect' => 'Protezi',
+'vector-action-undelete' => 'Recupera',
+'vector-action-unprotect' => 'Sbloca',
+'vector-simplesearch-preference' => "Intaca i sugerimenti di ricerca avansadi (solo par l'interfacia Vector)",
+'vector-view-create' => 'Crea',
+'vector-view-edit' => 'Canbia',
+'vector-view-history' => 'Varda la storia',
+'vector-view-view' => 'Lezi',
+'vector-view-viewsource' => 'Varda el testo',
+'actions' => 'Asion',
+'namespaces' => 'Namespace',
+'variants' => 'Varianse',
'errorpagetitle' => 'Erore',
'returnto' => 'Torna a $1.',
@@ -389,6 +383,9 @@ Tropi utenti i sta tentando de visuałisare sta pajina.
Atendare qualche minudo prima de riprovare a cargare Å‚a pajina.
$1',
+'pool-timeout' => "Timeout durante l'atesa de lo sbloco",
+'pool-queuefull' => 'La cóa de laorassion la xe piena',
+'pool-errorunknown' => 'Eror sconossùo',
# 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' => 'Se parla de {{SITENAME}}',
@@ -420,7 +417,7 @@ $1',
'ok' => 'OK',
'retrievedfrom' => 'Cavà fora da "$1"',
'youhavenewmessages' => 'Te ghè $1 ($2).',
-'newmessageslink' => 'dei messagi novi',
+'newmessageslink' => 'dei mesagi novi',
'newmessagesdifflink' => 'ultimo canbiamento',
'youhavenewmessagesmulti' => 'Te ghè messagi novi su $1',
'editsection' => 'canbia',
@@ -510,7 +507,7 @@ 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.',
-'badtitle' => 'Titolo mia giusto',
+'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.',
'perfcachedts' => "Sti dati qua i xe stà azornà l'ultima olta el $1.",
@@ -554,7 +551,8 @@ Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITEN
'yourname' => 'Nome utente:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'De novo la password:',
-'remembermypassword' => 'Ricorda Å‚a password so sto computer',
+'remembermypassword' => 'Tiente in mente la password su sto conputer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
+'securelogin-stick-https' => 'Resta tacà par HTTPS dopo èssar entrà',
'yourdomainname' => 'Spesifegare el dominio',
'externaldberror' => "Se xè verifegà n'erore con el server de autenticasion esterno, opure no se dispone de łe autorizasion nesesarie par ajornare el proprio aceso esterno.",
'login' => 'Entra',
@@ -571,6 +569,7 @@ Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITEN
'gotaccount' => "Sito zà iscrito? '''$1'''.",
'gotaccountlink' => 'Entra',
'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.',
@@ -589,6 +588,7 @@ Tòtene uno difarente.',
'wrongpasswordempty' => 'No xè sta inseria alcuna password. Riprovare.',
'passwordtooshort' => 'Åe password e ga da contegnere almanco {{PLURAL:$1|1 caratere|$1 carateri}}.',
'password-name-match' => 'Åa password a ga da esare difarente dal nome utente.',
+'password-login-forbidden' => 'Sto nome utente e/o password i xè stai proibìi',
'mailmypassword' => 'Màndeme na password nova al me indirisso e-mail',
'passwordremindertitle' => 'Servisio Password Reminder de {{SITENAME}}',
'passwordremindertext' => 'Qualcheduni (probabilmente ti, da l\'indirizo IP $1) el gà domandà che ghe vegna mandà na nova password par {{SITENAME}} ($4).
@@ -675,11 +675,12 @@ Forse te ghè zà canbià la to password o te ghè domandà na password tenporan
'showpreview' => 'Varda anteprima',
'showlivepreview' => 'Anteprima in tenpo reàl',
'showdiff' => 'Mostra canbiamenti',
-'anoneditwarning' => "'''Ocio:''' No te sì entrà con un nome utente.
-In te la storia de la pagina restarà el to indirizo IP.",
+'anoneditwarning' => "'''Ocio:''' Nò te sì entrà co' un nome utente.
+In te ła storia de ła pajina restarà el to indiriso IP.",
+'anonpreviewwarning' => '"No te ghe eseguio el login. Salvando el to indiriso IP sarà rejistrà ne ła cronołosia de sta voxe."',
'missingsummary' => "'''Ocio:''' No te ghè indicà l'ogeto de la modifica. Macando de novo 'Salva la pagina' la modifica la vegnerà con l'ogeto vodo.",
'missingcommenttext' => 'Inserissi un comento qua soto.',
-'missingcommentheader' => "'''Ocio:''' No te ghè specificà l'intestazion de sto commento. Macando de novo '''Salva la pagina''' la modifica la vegnarà salvà senza intestazion.",
+'missingcommentheader' => "'''Ocio:''' No te ghè fornìo un ogeto par sto comento. Macando da novo \"{{int:savearticle}}\" la modifica la vegnarà salvà sensa ogeto.",
'summary-preview' => 'Anteprima del comento:',
'subject-preview' => 'Anteprima ogeto/intestazion:',
'blockedtitle' => 'Utente blocà',
@@ -752,7 +753,7 @@ L'ultimo ełemento del rejistro de i blochi xè riportà de seguito par informas
'usercsspreview' => "'''Sta qua la xe solo n'anteprima del proprio CSS personal.
Le modifiche no le xe gnancora stà salvà!'''",
'userjspreview' => "'''Sta qua la xe solo n'anteprima par proar el proprio JavaScript personal; 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/monobook.css e no {{ns:user}}:Esenpio/Monobook.css.",
+'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à!'''",
@@ -788,17 +789,16 @@ 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!'''",
-'longpagewarning' => "'''OCIO: Sta pàxena la xè longa $1 kilobyte; serti browser i podarìa verghe dei problemi ne ła modifega de pàxene che se avisina o supera i 32 kB. Valuta l'oportunità de sudivìdar ła pàxena in sezion pìassè picenine.'''",
'longpageerror' => "'''ERROR: The text you have submitted is $1 kilobytes
long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''",
'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.'''
L'aministrador che gà blocà el database el gà dato la seguente spiegassion: $1",
-'protectedpagewarning' => "'''Ocio: Sta pagina la xe sta proteta e solo i aministradori i pode modificarla.''' Sta qua la xe l'ultima operassion catà sul registro de la pagina:",
-'semiprotectedpagewarning' => "'''Ocio:''' Sta pàxena la xe stà blocà in maniera che solo i utenti registrài i possa canbiarla. Sta qua la xe l'ultima operassion catà sul registro de la pagina:",
-'cascadeprotectedwarning' => "'''Ocio:''' Sta pagina la xe stà blocà in modo che solo i utenti con privilegi de aministrador i possa modificarla. Questo sucede parché la pagina la xe inclusa {{PLURAL:\$1|ne la pagina indicà de seguito, che la xe stà proteta|ne le pagine indicà de seguito, che le xe stà protete}} selezionando la protezion \"ricorsiva\":",
-'titleprotectedwarning' => "'''OCIO: Sta pàxena la xe stà blocà in modo che solo i utenti con [[Special:ListGroupRights|serti privilègi]] i la possa crear.''' Sta qua la xe l'ultima operassion catà sul registro de la pagina:",
+'protectedpagewarning' => "'''Ocio:''' Sta pajina ła xe sta proteta in maniera che soło i aministradori i posa canbiarla. Sta qua ła xe l'ultima operasion catà sul registro de ła pajina:",
+'semiprotectedpagewarning' => "'''Ocio:''' Sta pajina ła xe stà proteta in maniera che soło i utenti rexistrài i posa canbiarla. Sta qua ła xe l'ultima operasion catà sul registro de ła pajina:",
+'cascadeprotectedwarning' => "'''Ocio:''' Sta pajina ła xe stà proteta in maniera che soło i utenti co priviłegi de aministrador i posa canbiarla. Questo sucede parché ła pajina ła xe inclusa {{PLURAL:\$1|'nte ła pajina indicà de seguito, che ła xe stà proteta|ne le pagine indicà de seguito, che łe xe stae protete}} sełesionando ła protesion \"ricorsiva\":",
+'titleprotectedwarning' => "'''Ocio:''' Sta pajina ła xe stà proteta in modo che soło i utenti co [[Special:ListGroupRights|serti privilègi]] i ła posa crear. Sta qua ła xe l'ultima operasion catà sul registro de ła pajina:",
'templatesused' => '{{PLURAL:$1|Modèl doparà|Modèi doparà}} su sta pagina:',
'templatesusedpreview' => '{{PLURAL:$1|Modèl|Modèi}} doparà su sta anteprima:',
'templatesusedsection' => '{{PLURAL:$1|Modèl|Modèi}} doparà in sta sezion:',
@@ -811,8 +811,8 @@ L'aministrador che gà blocà el database el gà dato la seguente spiegassion: $
'sectioneditnotsupported-title' => 'Modifica de sezion mia suportà',
'sectioneditnotsupported-text' => 'La modifica de singole sezion no le xe mia suportà su sta pagina.',
'permissionserrors' => 'Eror nei permessi',
-'permissionserrorstext' => "No te ghè i permessi necessari ad eseguir l'azion richiesta, par {{PLURAL:$1|el seguente motivo|i seguenti motivi}}:",
-'permissionserrorstext-withaction' => 'No se dispone de i parmesi nesesari par $2, par {{PLURAL:$1|el seguente modivo|i seguenti modivi}}:',
+'permissionserrorstext' => "Nò se dispone dei parmesi nesessari ad eseguir l'asion richiesta, par {{PLURAL:$1|el seguente motivo|i seguenti motivi}}:",
+'permissionserrorstext-withaction' => 'Nò se dispone dei parmesi nesesari par $2, par {{PLURAL:$1|el seguente modivo|i seguenti modivi}}:',
'recreate-moveddeleted-warn' => "'''Ocio: te stè par ricrear na pagina zà scancelà precedentemente.'''
Par piaser assicùrete che sia dal bon el caso de 'ndar vanti a modificar sta pagina.
@@ -963,6 +963,8 @@ $1",
'logdelete-failure' => "'''No se riesse a inpostar la visibilità 'ntel registro:'''
$1",
'revdel-restore' => 'Canbia la visibilità',
+'revdel-restore-deleted' => 'revision scancelà',
+'revdel-restore-visible' => 'revision visibili',
'pagehist' => 'Cronologia de la pagina',
'deletedhist' => 'Cronologia scancelà',
'revdelete-content' => 'contenuto',
@@ -1027,11 +1029,13 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
# Diffs
'history-title' => "Storia dei canbiamenti de ''$1''",
'difference' => '(Difarense fra le version)',
+'difference-multipage' => '(Difarensa tra le pagine)',
'lineno' => 'Riga $1:',
'compareselectedversions' => 'Confronta le version segnàe',
'showhideselectedversions' => 'Mostra/scondi version selessionà',
'editundo' => 'tira indrìo',
-'diff-multi' => '({{PLURAL:$1|Una revision intermedia non mostrà|$1 revision intermedie non mostrà}}.)',
+'diff-multi' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de pi de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
# Search results
'searchresults' => 'Risultati de la riserca',
@@ -1066,6 +1070,7 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
'searchprofile-everything-tooltip' => 'Serca dapartuto (anca su le pagine de discussion)',
'searchprofile-advanced-tooltip' => 'Serca nei namespace personalixài',
'search-result-size' => '$1 ({{PLURAL:$2|na parola|$2 parole}})',
+'search-result-category-size' => '{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sotocategoria|$2 sotocategorie}}, {{PLURAL:$3|1 file|$3 file}})',
'search-result-score' => 'Rilevansa: $1%',
'search-redirect' => '(redirect $1)',
'search-section' => '(sesion $1)',
@@ -1141,6 +1146,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'contextlines' => 'Righe de testo par ciascun risultato',
'contextchars' => 'Caratteri par linea:',
'stub-threshold' => 'Valor minimo par i <a href="#" class="stub">colegamenti ai stub</a>:',
+'stub-threshold-disabled' => 'Disativà',
'recentchangesdays' => 'Nùmaro de giòrni da mostrar ne le ultime modifiche:',
'recentchangesdays-max' => '($1 {{PLURAL:$1|zorno|zorni}} massimo)',
'recentchangescount' => 'Nùmaro de modìfeghe da far védar (valor predefinìo):',
@@ -1172,6 +1178,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'prefs-files' => 'File',
'prefs-custom-css' => 'CSS personalixà',
'prefs-custom-js' => 'JS personalixà',
+'prefs-common-css-js' => 'CSS/JS condiviso par tute Å‚e skin:',
'prefs-reset-intro' => 'Te pol doparar sta pagina par riportar le to preferense a quele predefinìe.
Sta operassion no la pol èssar anulà.',
'prefs-emailconfirm-label' => "Conferma de l'e-mail:",
@@ -1209,7 +1216,9 @@ In più te pol anca farte scrìvar da altri tramite la to pagina personale o la
'prefs-advancedrendering' => 'Preferense avansade',
'prefs-advancedsearchoptions' => 'Preferense avansade',
'prefs-advancedwatchlist' => 'Preferense avansade',
-'prefs-display' => 'Preferense de visualixassion',
+'prefs-displayrc' => 'Preferense de visualixassion',
+'prefs-displaysearchoptions' => 'Opzioni de visualixassion',
+'prefs-displaywatchlist' => 'Opzioni de visualixassion',
'prefs-diffs' => 'Difarense',
# User rights
@@ -1295,6 +1304,7 @@ In più te pol anca farte scrìvar da altri tramite la to pagina personale o la
'right-hideuser' => 'Bloca un nome utente, scondéndolo al publico',
'right-ipblock-exempt' => "Scavalca i blochi de l'IP, i auto-blochi e i blochi de grupi de IP",
'right-proxyunbannable' => 'Salta via i blochi sui proxy',
+'right-unblockself' => 'Sbloca se steso',
'right-protect' => 'Canbia i livèi de protezion',
'right-editprotected' => 'Modifica pagine protete',
'right-editinterface' => "Modifica l'interfacia utente",
@@ -1317,7 +1327,6 @@ In più te pol anca farte scrìvar da altri tramite la to pagina personale o la
'right-siteadmin' => 'Bloca e desbloca el database',
'right-reset-passwords' => 'Reinposta la password de altri utenti',
'right-override-export-depth' => 'Esporta le pàxene, includendo le pàxene ligàe fin a na profondità de 5',
-'right-versiondetail' => 'Fà védar le informassion conplete su la version del software',
'right-sendemail' => 'Mandarghe e-mail a cheialtri utenti',
# User rights log
@@ -1368,14 +1377,9 @@ In più te pol anca farte scrìvar da altri tramite la to pagina personale o la
'recentchanges-legend' => 'Prefarense par i ultimi canbiamenti',
'recentchangestext' => 'Qua se vede i ultimi canbiamenti fati a sto sito.',
'recentchanges-feed-description' => 'Tien tracia dei ultimi canbiamenti fati a sto sito',
-'recentchanges-label-legend' => 'Legenda: $1.',
-'recentchanges-legend-newpage' => '$1 - pagina nova',
'recentchanges-label-newpage' => 'Sta modifica la ga creà na pagina nova',
-'recentchanges-legend-minor' => '$1 - modifica picenina',
'recentchanges-label-minor' => 'Sto qua el xe un canbiamento picenin',
-'recentchanges-legend-bot' => '$1 - modifica bot',
'recentchanges-label-bot' => 'Sta modifica el la ga fata un bot',
-'recentchanges-legend-unpatrolled' => '$1 - modifica mia verificà',
'recentchanges-label-unpatrolled' => 'Sta modifica no la xe stà gnancora verificà',
'rcnote' => "Qua soto se vede {{PLURAL:$1|l'ultimo canbiamento|i ultimi '''$1''' canbiamenti}} {{PLURAL:$2|in te l'ultimo zorno|in tei ultimi '''$2''' zorni}}, fin a le $5 del $4.",
'rcnotefrom' => " Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
@@ -1423,6 +1427,9 @@ par poder cargar dei file.',
'upload_directory_missing' => 'La cartèla de caricamento ($1) no la esiste mìa e no la pode vegner creàda dal browser web.',
'upload_directory_read_only' => "El server web no l'è bon de scrìvar ne la directory de caricamento ($1).",
'uploaderror' => 'Eror nel caricamento',
+'upload-recreate-warning' => "'''Ocio: Un file co sto nome el xe stà scancelà o spostà.'''
+
+Qua ghe xe el registro de le scancelassion e dei spostamenti:",
'uploadtext' => "Par cargar novi file, dopara el modulo qua soto.
Par védar o sercar i file zà caricà, consulta la [[Special:FileList|lista dei file caricà]]. I caricamenti de file te pol védarli nel [[Special:Log/upload|registro dei caricamenti]], le scancelasion nel [[Special:Log/delete|registro de le scancelasion]].
@@ -1455,6 +1462,17 @@ Varda la [[Special:NewFiles|galerìa dei file nóvi]] par na vision de insieme.'
'filetype-unwanted-type' => "Cargar file de tipo '''\".\$1\"''' xe sconsiglià. {{PLURAL:\$3|El tipo de file consiglià el|I tipi de file consiglià i}} xe \$2.",
'filetype-banned-type' => "Cargar file de tipo '''\".\$1\"''' no xe mìa consentìo. {{PLURAL:\$3|El tipo de file consentìo el|I tipi de file consentìi i}} xe \$2.",
'filetype-missing' => 'El file no\'l gà nissuna estension (ad es. ".jpg").',
+'empty-file' => 'El file che te ghè cargà el xe vodo.',
+'file-too-large' => 'El file che te ghè cargà el xe massa grando.',
+'filename-tooshort' => 'El nome del file el xe massa curto.',
+'filetype-banned' => 'Sto tipo de file el xe vietà.',
+'verification-error' => "Sto file no'l gà passà la verifica.",
+'hookaborted' => 'La modifica che te voli fare la xe stà interota da un hook de na estension.',
+'illegal-filename' => 'El nome del file no xe parmesso.',
+'overwrite' => 'No xe parmesso de sorascrìvar un file esistente.',
+'unknown-error' => 'Se gà verifica un eror sconossùo.',
+'tmp-create-error' => 'Inpussibile creare el file tenporaneo.',
+'tmp-write-error' => 'Eror de scritura del file temporaneo.',
'large-file' => 'Se racomanda de no superar mìa le dimension de $1 par ciascun file; sto file el xe grando $2.',
'largefileserver' => 'El file el supera le dimension consentìe da la configurazion del server.',
'emptyfile' => 'El file che te ghè caricà el xè aparentemente vodo. Podarìa èssar par un eror nel nome del file. Par piaser controla se te vol dal bon caricar sto file.',
@@ -1479,13 +1497,14 @@ Se te vol cargar istesso el to file, par piaser torna indrio e cànbia el nome d
Se te vol cargar el file istesso, par piaser torna indrio e canbia el nome che te vol darghe al file. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Sto file el xe un duplicato {{PLURAL:$1|del seguente file|dei seguenti file}}:',
'file-deleted-duplicate' => "Un file preciso identico de sto file ([[:$1]]) el xe stà zà scancelà in precedensa. Te dovaressi darghe n'ociada a la cronologia scancelà prima de cargarlo de novo.",
-'successfulupload' => 'Caricamento conpletà',
'uploadwarning' => 'Avixo de caricamento',
'uploadwarning-text' => 'Par piaser, cànbia la descrission del file qua de soto e próa da novo.',
'savefile' => 'Salva file',
'uploadedimage' => 'ga cargà "[[$1]]"',
'overwroteimage' => 'gà cargà na version nova de "[[$1]]"',
'uploaddisabled' => 'Semo spiacenti, ma el caricamento de file el xe tenporaneamente sospeso.',
+'copyuploaddisabled' => 'El caricamento tramite URL el xe disabilità.',
+'uploadfromurl-queued' => 'El to caricamento el xe stà messo in coa.',
'uploaddisabledtext' => "El caricamento dei file no'l xe mìa ativo.",
'php-uploaddisabledtext' => 'El caricamento de file tramite PHP el xe disabilità. Contròla la configurassion de file_uploads.',
'uploadscripted' => 'Sto file contegne codexe HTML o de script, che podaria essere interpretà eroneamente da un browser web.',
@@ -1504,6 +1523,14 @@ Se te vol cargar el file istesso, par piaser torna indrio e canbia el nome che t
Verifica par piaser se xe el caso de continuare col caricamento de sto file.
Par to comodità qua ghe xe la registrazion de la scancelazion:",
'filename-bad-prefix' => "El nome del file che te sì drio cargar el scuminsia con '''\"\$1\"''', che el xe un nome non-descritivo tipicamente assegnà automaticamente da le fotocàmare digitali. Par piaser siegli un nome piassè descritivo par el to file.",
+'upload-success-subj' => 'Caricamento conpletà',
+'upload-success-msg' => "El to caricamento da [$2] el xe 'ndà ben. Te lo cati qua: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => 'Problema nel caricamento',
+'upload-failure-msg' => 'Ghe xe stà un problema col caricamento da [$2]:
+
+$1',
+'upload-warning-subj' => 'Aviso de caricamento',
+'upload-warning-msg' => 'Ghe xe stà un problema col caricamento da [$2]. Torna al [[Special:Upload/stash/$1|modulo de caricamento]] par sistemarlo.',
'upload-proto-error' => 'Protocòl mìa giusto',
'upload-proto-error-text' => 'Par el caricamento remoto bisogna specificar URL che scuminsia con <code>http://</code> opure <code>ftp://</code>.',
@@ -1566,6 +1593,7 @@ Par modificar l'ordinamento, struca su l'intestazion de la colona presièlta.",
'listfiles_search_for' => 'Serca file par nome:',
'imgfile' => 'file',
'listfiles' => 'Lista dei file',
+'listfiles_thumb' => 'Miniadura',
'listfiles_date' => 'Data',
'listfiles_name' => 'Nome',
'listfiles_user' => 'Utente',
@@ -1678,8 +1706,8 @@ Qua soto vien mostrà la descrission presente in te la [$2 pàxena de descrissio
'statistics-edits' => "Modifiche a scuminsiar da l'istalassion de {{SITENAME}}",
'statistics-edits-average' => 'Canbiamenti in media par pagina',
'statistics-views-total' => 'Visualizasion totali',
+'statistics-views-total-desc' => 'Xe lassà fora le viste de pagine speciali o mia esistenti',
'statistics-views-peredit' => 'Visualizassion par modifica',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Cóa dei processi] da far girar in background',
'statistics-users' => '[[Special:ListUsers|Utenti]] registrà',
'statistics-users-active' => 'Utenti atìvi',
'statistics-users-active-desc' => "Utenti che gà fato almanco un'azion in {{PLURAL:$1|tel'ultimo zorno|in tei ultimi $1 zorni}}",
@@ -1693,7 +1721,7 @@ Vien considerà pagine de disanbiguazion tute quele che contien i modèi elencà
'doubleredirects' => 'Redirect dopi',
'doubleredirectstext' => 'Sta pagina le elenca pagine che rimanda a altre pagine de rimando.
Ogni riga la contien dei colegamenti al primo e al secondo rimando, oltre a la destinassion del secondo rimando, che de solito la xe la "vera" pagina de destinassion, a cui dovarìa pontar el primo rimando.
-Le righe <s>sbarà</s> le xe xà stà sistemà.',
+Le righe <del>sbarà</del> le xe xà stà sistemà.',
'double-redirect-fixed-move' => '[[$1]] xe stà spostà, desso el xe solo un rimando a [[$2]]',
'double-redirect-fixer' => 'Coretòr de redirect',
@@ -1716,6 +1744,8 @@ Le righe <s>sbarà</s> le xe xà stà sistemà.',
'nmembers' => '$1 {{PLURAL:$1|elemento|elementi}}',
'nrevisions' => '$1 {{PLURAL:$1|revision|revision}}',
'nviews' => '$1 {{PLURAL:$1|visita|visite}}',
+'nimagelinks' => 'Doparà su $1 {{PLURAL:$1|pagina|pagine}}',
+'ntransclusions' => 'doparà su $1 {{PLURAL:$1|pagina|pagine}}',
'specialpage-empty' => "Sto raporto no'l contien nissun risultato.",
'lonelypages' => 'Pagine solitarie',
'lonelypagestext' => 'Le pagine indicà de seguito no le gà colegamenti o trasclusioni che vegna da altre pagine de {{SITENAME}}.',
@@ -1872,34 +1902,40 @@ Se pol consultar anca dele altre [[{{MediaWiki:Listgrouprights-helppage}}|inform
'listgrouprights-removegroup-self-all' => 'Pode cavar la propria utensa da tuti i grupi',
# E-mail user
-'mailnologin' => 'Nissun indirizo a cui mandarghe el messagio',
-'mailnologintext' => 'Par inviare messagi e-mail ad altri utenti bisogna [[Special:UserLogin|acedere al sito]] e aver registrà un indirisso vałido ne łe proprie [[Special:Preferences|preferense]].',
-'emailuser' => 'Scrìveghe a sto utente',
-'emailpage' => "Scrivi na e-mail a l'utente",
-'emailpagetext' => 'Te podi usar el modulo chi soto par mandare na e-mail a sto utente.
+'mailnologin' => 'Nissun indirizo a cui mandarghe el messagio',
+'mailnologintext' => 'Par inviare messagi e-mail ad altri utenti bisogna [[Special:UserLogin|acedere al sito]] e aver registrà un indirisso vałido ne łe proprie [[Special:Preferences|preferense]].',
+'emailuser' => 'Scrìveghe a sto utente',
+'emailpage' => "Scrivi na e-mail a l'utente",
+'emailpagetext' => 'Te podi usar el modulo chi soto par mandare na e-mail a sto utente.
La e-mail che te ghè indicà ne le [[Special:Preferences|to preferense]] la vegnarà fora nel canpo "Da" de la mail, così che el destinatario el possa rispóndarte a ti diretamente.',
-'usermailererror' => "L'ogeto mail el gà restituìo l'eror:",
-'defemailsubject' => 'Messagio da {{SITENAME}}',
-'noemailtitle' => 'Nissun indirisso e-mail',
-'noemailtext' => "Sto utente no'l gà indicà nissuna casela e-mail valida.",
-'nowikiemailtitle' => 'Posta elétronega mia parmessa',
-'nowikiemailtext' => 'Sto utente el ga sielto de no ricévar e-mail da i altri utenti.',
-'email-legend' => "Màndeghe na e-mail a n'altro utente de {{SITENAME}}",
-'emailfrom' => 'Da:',
-'emailto' => 'A:',
-'emailsubject' => 'Ogeto:',
-'emailmessage' => 'Messajo:',
-'emailsend' => 'Invia',
-'emailccme' => 'Màndeme na copia al me indirizo.',
-'emailccsubject' => 'Copia del messagio invià a $1: $2',
-'emailsent' => 'E-mail invià',
-'emailsenttext' => 'La to e-mail la xè stà invià.',
-'emailuserfooter' => 'Sta e-mail la xe stà mandà da $1 a $2 \'traverso la funsion "Manda na e-mail a l\'utente" su {{SITENAME}}.',
+'usermailererror' => "L'ogeto mail el gà restituìo l'eror:",
+'defemailsubject' => 'Messagio da {{SITENAME}}',
+'usermaildisabled' => 'e-mail utente disabiłità',
+'usermaildisabledtext' => 'No xè posibiłe inviare e-mail ad altri utenti so sto wiki',
+'noemailtitle' => 'Nissun indirisso e-mail',
+'noemailtext' => "Sto utente no'l gà indicà nissuna casela e-mail valida.",
+'nowikiemailtitle' => 'Posta elétronega mia parmessa',
+'nowikiemailtext' => 'Sto utente el ga sielto de no ricévar e-mail da i altri utenti.',
+'email-legend' => "Màndeghe na e-mail a n'altro utente de {{SITENAME}}",
+'emailfrom' => 'Da:',
+'emailto' => 'A:',
+'emailsubject' => 'Ogeto:',
+'emailmessage' => 'Messajo:',
+'emailsend' => 'Invia',
+'emailccme' => 'Màndeme na copia al me indirizo.',
+'emailccsubject' => 'Copia del messagio invià a $1: $2',
+'emailsent' => 'E-mail invià',
+'emailsenttext' => 'La to e-mail la xè stà invià.',
+'emailuserfooter' => 'Sta e-mail la xe stà mandà da $1 a $2 \'traverso la funsion "Manda na e-mail a l\'utente" su {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Messajo de sistema.',
+'usermessage-editor' => 'Messagero de sistema',
# Watchlist
'watchlist' => "Pagine tegnùe d'ocio",
'mywatchlist' => "pagine tegnùe d'ocio",
-'watchlistfor' => "(de l'utente '''$1''')",
+'watchlistfor2' => 'De $1 $2',
'nowatchlist' => "No te ghè indicà pagine da tegner d'ocio.",
'watchlistanontext' => "Per vardar e modifegar l'ełenco de i osservati speciałi bisogna $1.",
'watchnologin' => 'Acesso mia efetuà',
@@ -2013,7 +2049,10 @@ L'ultima modefega l'è stà fata da [[User:$3|$3]] ([[User talk:$3|discussion]]{
'revertpage' => 'Anułàe łe modifeghe de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]), riportà a ła version de prima de [[User:$1|$1]]',
'revertpage-nouser' => 'Anulà le modìfeghe de (nome utente cavà), riportà a la version precedente de [[User:$1|$1]]',
'rollback-success' => 'Anulà le modifiche de $1; riportà a la version precedente de $2.',
-'sessionfailure' => "Se gà verificà un problema ne la session che identifica l'acesso; el sistema, par precauzion, no'l gà mìa eseguìo el comando che te ghè dato. Torna a la pagina precedente col boton 'Indrìo' del to browser, ricarica la pagina e ripróa da novo.",
+
+# Edit tokens
+'sessionfailure-title' => 'Eròr de session',
+'sessionfailure' => "Se gà verificà un problema ne la session che identifica l'acesso; el sistema, par precauzion, no'l gà mìa eseguìo el comando che te ghè dato. Torna a la pagina precedente col boton 'Indrìo' del to browser, ricarica la pagina e ripróa da novo.",
# Protect
'protectlogpage' => 'Protesion',
@@ -2139,18 +2178,20 @@ $1',
'month' => 'Dal mese (e quei prima):',
'year' => "Da l'ano (e quei prima):",
-'sp-contributions-newbies' => 'Fame védar solo i contributi de i utenti novi',
-'sp-contributions-newbies-sub' => 'Par i novi utenti',
-'sp-contributions-newbies-title' => 'Contributi dei utenti novi',
-'sp-contributions-blocklog' => 'blochi',
-'sp-contributions-deleted' => 'contributi utente scancelà',
-'sp-contributions-logs' => 'registri',
-'sp-contributions-talk' => 'discussion',
-'sp-contributions-userrights' => 'gestion dei parmessi relativi ai utenti',
-'sp-contributions-blocked-notice' => "Sto utente el xe atualmente blocà. L'ultimo elemento del registro dei blochi el xè riportà qua soto par informassion:",
-'sp-contributions-search' => 'Serca contributi',
-'sp-contributions-username' => 'Indirizo IP o nome utente:',
-'sp-contributions-submit' => 'Riserca',
+'sp-contributions-newbies' => 'Fame védar solo i contributi de i utenti novi',
+'sp-contributions-newbies-sub' => 'Par i novi utenti',
+'sp-contributions-newbies-title' => 'Contributi dei utenti novi',
+'sp-contributions-blocklog' => 'blochi',
+'sp-contributions-deleted' => 'contributi utente scancelà',
+'sp-contributions-logs' => 'registri',
+'sp-contributions-talk' => 'discussion',
+'sp-contributions-userrights' => 'gestion dei parmessi relativi ai utenti',
+'sp-contributions-blocked-notice' => "Sto utente el xe atualmente blocà. L'ultimo elemento del registro dei blochi el xè riportà qua soto par informassion:",
+'sp-contributions-blocked-notice-anon' => "Sto indiriso IP el xè atualmente blocà. De seguito xè riportà l'ultimo ełemento del rejistro de i blochi:",
+'sp-contributions-search' => 'Serca contributi',
+'sp-contributions-username' => 'Indirizo IP o nome utente:',
+'sp-contributions-toponly' => "Mostra solo i contributi che i xe l'ultima revision de la pagina",
+'sp-contributions-submit' => 'Riserca',
# What links here
'whatlinkshere' => 'Punta qua',
@@ -2209,7 +2250,6 @@ Varda [[Special:IPBlockList|lista IP bloccati]] par védar tuti i blochi.",
'ipb-edit-dropdown' => 'Motivi par el bloco',
'ipb-unblock-addr' => 'Sbloca $1',
'ipb-unblock' => 'Sbloca un utente o un indirizo IP',
-'ipb-blocklist-addr' => 'Blochi esistenti par $1',
'ipb-blocklist' => 'Elenca i blochi ativi',
'ipb-blocklist-contribs' => 'Contributi de $1',
'unblockip' => 'Sbloca indirizzo IP',
@@ -2278,6 +2318,8 @@ $1 xe xà blocà. Vuto canbiar le inpostassion?',
'sorbs_create_account_reason' => 'No se pol crear acessi novi da sto indirizo IP parché el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
'cant-block-while-blocked' => 'No se pode blocar altri utenti finché se xe blocài.',
'cant-see-hidden-user' => "L'utente che te vol blocar el xe zà stà blocà e sconto. Sicome a no te ghè mia i diriti de hideuser, no te pol mia védar o canbiar el bloco de l'utente.",
+'ipbblocked' => 'No te pui blocare o sblocare altri utenti, parché ti steso te si blocà',
+'ipbnounblockself' => 'No te pui sblocare ti steso',
# Developer tools
'lockdb' => 'Blocca el database',
@@ -2313,6 +2355,17 @@ Questo significa che, se te fè un eror, te podi da novo rinominar na pagina col
'''OCIO!'''
Sto canbiamento drastico el podarìa dar problemi che no se se speta, specialmente se se trata de na pagina molto visità.
Stà ben tento a le conseguense del spostamento, prima de farlo.",
+'movepagetext-noredirectfixer' => "Col modulo qua soto te podi rinominar na pagina, spostando anca tuta la so storia al titolo novo.
+El vecio titolo el deventarà automaticamente un rimando (redirect) che punta al titolo novo.
+Tiente in mente de controlar ben che no se crea [[Special:DoubleRedirects|dopi redirect]] o [[Special:BrokenRedirects|redirect interoti]].
+Resta ne la to responsabilità de controlar che i colegamenti i continua a puntar dove che i deve.
+
+Ocio: la pagina '''no''' la sarà spostà se ghe fusse zà na pagina col titolo novo, a meno che no la sia na pagina voda o un rimando, e senpre che no la gabia na storia.
+Questo significa che, se te fè un eror, te podi da novo rinominar na pagina col vecio titolo, ma no te podi sovrascrìvar na pagina zà esistente.
+
+'''OCIO!'''
+Sto canbiamento drastico el podarìa dar problemi che no se se speta, specialmente se se trata de na pagina molto visità.
+Stà ben tento a le conseguense del spostamento, prima de farlo.",
'movepagetalktext' => "La corispondente pagina de discussion la sarà spostà automaticamente insieme a la pagina prinsipale, '''trane che nei seguenti casi:'''
* El spostamento de la pagina el xe tra namespace diversi
* In corispondenza del titolo novo ghe xe xà na pagina de discussion (mìa voda)
@@ -2367,6 +2420,7 @@ La voxe specificà come destinassion "[[:$1]]" l\'esiste xà. Vóto scancełarla
'immobile-source-page' => 'Sta pàxena no la pol vegner spostà.',
'immobile-target-page' => 'No te pol spostar a sto titolo.',
'imagenocrossnamespace' => 'No se pol spostar un file verso un namespace diverso da quelo dei file.',
+'nonfile-cannot-move-to-file' => 'Tuto quel che no xe un file, no se pode spostarlo al namespace dei file.',
'imagetypemismatch' => "L'estension nova del file no la corisponde mìa al tipo de file",
'imageinvalidfilename' => "El nome file de destinassion no'l xe mia valido",
'fix-double-redirects' => 'Agiorna tuti quanti i redirect che ponta al titolo originàl',
@@ -2445,6 +2499,7 @@ Salvalo sul to computer e càrghelo qua.',
'importstart' => 'Inportazion de łe pàxene in corso...',
'import-revision-count' => '{{PLURAL:$1|una revixion importà|$1 revixion importae}}',
'importnopages' => 'Nissuna pàxena da inportar.',
+'imported-log-entries' => 'Inportà $1 {{PLURAL:$1|evento|eventi}} del registro.',
'importfailed' => 'Inportassion falía: $1',
'importunknownsource' => "Tipo de origine sconossiùo par l'inportassion",
'importcantopen' => 'Impossibiłe vèrzar el file de inportassion',
@@ -2537,6 +2592,8 @@ Salvalo sul to computer e càrghelo qua.',
'tooltip-upload' => 'Intaca el caricamento',
'tooltip-rollback' => 'El "tira indrio" el desfa i canbiamenti a sta pagina fati de l\'ultimo che gà messo le mane.',
'tooltip-undo' => 'El "Tira indrìo" el parmete de anular sto canbiamento e el verze la pagina da canbiar in modalità de anteprima. Se pole métarghe anca na motivassion.',
+'tooltip-preferences-save' => 'Salve le preferense',
+'tooltip-summary' => 'Inserissi un breve riassunto',
# Metadata
'nodublincore' => 'Metadati Dublin Core RDF non ativi su sto server.',
@@ -2632,13 +2689,16 @@ La so esecuzion la podarìa danegiar el to computer.",
'thumbsize' => 'Grandeza de le miniature:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|pagina|pagine}}',
'file-info' => 'Dimensioni: $1, tipo MIME: $2',
-'file-info-size' => '($1 × $2 pixel, dimension del file: $3, tipo MIME: $4)',
+'file-info-size' => '$1 × $2 pixel, dimension del file: $3, tipo MIME: $4',
'file-nohires' => '<small>No ghe xe version a risolussion pì granda.</small>',
-'svg-long-desc' => '(file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3)',
+'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
'show-big-image' => 'Version ad alta risołusion',
'show-big-image-thumb' => '<small>Dimension de sta anteprima: $1 × $2 pixel</small>',
'file-info-gif-looped' => 'ripetù',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frame}}',
+'file-info-png-looped' => 'ripetù',
+'file-info-png-repeat' => 'ripetù $1 {{PLURAL:$1|olta|olte}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogrami}}',
# Special:NewFiles
'newimages' => 'Galeria dei file novi',
@@ -2956,30 +3016,30 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
'limitall' => 'tuti quanti',
# E-mail address confirmation
-'confirmemail' => 'Conferma indirisso e-mail',
-'confirmemail_noemail' => 'No te ghè indicà un indirizo e-mail valido ne le to [[Special:Preferences|preferense]].',
-'confirmemail_text' => "{{SITENAME}} el richiede la verifica de l'indirizo e-mail prima che te possi doparar le funzion ligà a l'e-mail.
+'confirmemail' => 'Conferma indirisso e-mail',
+'confirmemail_noemail' => 'No te ghè indicà un indirizo e-mail valido ne le to [[Special:Preferences|preferense]].',
+'confirmemail_text' => "{{SITENAME}} el richiede la verifica de l'indirizo e-mail prima che te possi doparar le funzion ligà a l'e-mail.
Struca el boton qua soto par mandar na richiesta de conferma al to indirizo.
Nel messagio che te riva te catarè un colegamento che contien un codice.
Visita el colegamento col to browser par confermar che el to indirizo el xe valido.",
-'confirmemail_pending' => "El codice de conferma el xe zà stà spedìo par posta eletronica; se l'account el xe stà
+'confirmemail_pending' => "El codice de conferma el xe zà stà spedìo par posta eletronica; se l'account el xe stà
creà de reçente, par piaser speta par qualche minuto che riva el codice prima de domandàrghene uno novo.",
-'confirmemail_send' => 'Spedissi un codice de conferma par e-mail',
-'confirmemail_sent' => 'Email de conferma invià.',
-'confirmemail_oncreate' => "Un codice de conferma el xe stà spedìo a l'indirizo
+'confirmemail_send' => 'Spedissi un codice de conferma par e-mail',
+'confirmemail_sent' => 'Email de conferma invià.',
+'confirmemail_oncreate' => "Un codice de conferma el xe stà spedìo a l'indirizo
de posta eletronica indicà. El codice no'l xe necessario par entrar nel sito,
ma bisogna fornirlo par poder abilitar tute le funzion del sito che dòpara la posta eletronica.",
-'confirmemail_sendfailed' => "{{SITENAME}} no l'è stà bon da inviar el messagio e-mail de conferma.
+'confirmemail_sendfailed' => "{{SITENAME}} no l'è stà bon da inviar el messagio e-mail de conferma.
Controla che l'indirizo no'l contegna carateri mìa validi.
El messagio de eror el xe: $1",
-'confirmemail_invalid' => 'Codice de conferma mìa valido. El codice el podarìa èssar scadùo.',
-'confirmemail_needlogin' => 'Xè necessario $1 par confermare el proprio indirisso e-mail.',
-'confirmemail_success' => "El to indirisso email l'è stado confermà. Ora te podi loggarte e gòderte la wiki.",
-'confirmemail_loggedin' => 'El to indirisso email el xè stà confermà.',
-'confirmemail_error' => "Qualcossa l'è andà storto nel salvar la to conferma.",
-'confirmemail_subject' => "{{SITENAME}}: e-mail par la conferma de l'indirisso",
-'confirmemail_body' => 'Qualcheduni, probabilmente ti stesso da l\'indirizo IP $1, el ga registrà n\'account "$2" con sto indirizo e-mail su {{SITENAME}}.
+'confirmemail_invalid' => 'Codice de conferma mìa valido. El codice el podarìa èssar scadùo.',
+'confirmemail_needlogin' => 'Xè necessario $1 par confermare el proprio indirisso e-mail.',
+'confirmemail_success' => "El to indirisso email l'è stado confermà. Ora te podi loggarte e gòderte la wiki.",
+'confirmemail_loggedin' => 'El to indirisso email el xè stà confermà.',
+'confirmemail_error' => "Qualcossa l'è andà storto nel salvar la to conferma.",
+'confirmemail_subject' => "{{SITENAME}}: e-mail par la conferma de l'indirisso",
+'confirmemail_body' => 'Qualcheduni, probabilmente ti stesso da l\'indirizo IP $1, el ga registrà n\'account "$2" con sto indirizo e-mail su {{SITENAME}}.
Par confermar che sto account el xe veramente tuo e poder ativar le funzion relative a l\'e-mail su {{SITENAME}}, verzi sto colegamento col to browser:
@@ -2990,8 +3050,14 @@ Se l\'account *no* te lo ghè registrà ti, verzi st\'altro colegamento par anul
$5
El codice de conferma el scadrà in automatico a le $4.',
-'confirmemail_invalidated' => 'Richiesta de conferma indirizo e-mail anulà',
-'invalidateemail' => 'Anula richiesta de conferma e-mail',
+'confirmemail_body_changed' => 'Qualcheduni, probabilmente ti steso da l\'indiriso IP $1 el ga rejistrà n\'acount "$2" con sto indiriso e-mail so {{SITENAME}}.
+Par confermare che sto acount el xè veramente tuo e poder ativar łe funsion rełative a l\'e-mail so {{SITENAME}} verzi sto cołegamento nel to browser:
+$3
+Se l\'acount *no* te o ghe rejistrà ti, verzi st\'altro cołegamento par anułar ła conferma de l\'indiriso e-mail:
+$5
+El codexe de conferma el scadrà en automatego a łe $4.',
+'confirmemail_invalidated' => 'Richiesta de conferma indirizo e-mail anulà',
+'invalidateemail' => 'Anula richiesta de conferma e-mail',
# Scary transclusion
'scarytranscludedisabled' => "[L'inclusion de pagine tra siti wiki no la xe ativa]",
@@ -3031,6 +3097,7 @@ Par piaser, conferma che te vołi dal bon ricrear sta voxe.",
'table_pager_first' => 'Prima pagina',
'table_pager_last' => 'Ultima pagina',
'table_pager_limit' => 'Mostra $1 file par pagina',
+'table_pager_limit_label' => 'Elementi par pagina:',
'table_pager_limit_submit' => 'Và',
'table_pager_empty' => 'Nissun risultato',
@@ -3100,6 +3167,13 @@ Nota che te pol anca [[Special:Watchlist/edit|modificar la lista con l'interfaci
'version-hook-subscribedby' => 'Sotoscrizioni',
'version-version' => '(Version $1)',
'version-license' => 'Licensa',
+'version-poweredby-credits' => "Sta wiki la va con '''[http://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'altri',
+'version-license-info' => "MediaWiki xe un software lìbaro; te pol redistribuirlo e/o modificarlo secondo i termini de la Licensa Publica Zeneral GNU publicà da la Free Software Foundation; secondo la version 2 de la Licensa, o (a scelta tua) una qualunque altra version sucessiva.
+
+MediaWiki el xe distribuìo sperando che el possa vegner utile, ma SENSA NISSUNA GARANSIA; sensa gnanca la garansia inplicita de COMERCIALIZASSION o de ADATAMENTO A UN USO PARTICOLARE. Varda la Licensa Publica Zeneral GNU par ulteriori detagli.
+
+Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Publica Zeneral GNU; se nò, scrìveghe a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html và a lèzartela online].",
'version-software' => 'Software instalà',
'version-software-product' => 'Prodoto',
'version-software-version' => 'Version',
@@ -3169,6 +3243,15 @@ Inserissi el nome del file senza el prefisso \"{{ns:file}}:\"",
'tags-edit' => 'modìfega',
'tags-hitcount' => '$1 {{PLURAL:$1|modìfega|modìfeghe}}',
+# Special:ComparePages
+'comparepages' => 'Confronta le pagine',
+'compare-selector' => 'Confronta le revision de na pagina',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Confronta',
+
# Database error messages
'dberr-header' => 'Sta wiki la ga un problema',
'dberr-problems' => 'Sto sito al momento el gà qualche problema tènico.',
@@ -3185,8 +3268,13 @@ Inserissi el nome del file senza el prefisso \"{{ns:file}}:\"",
'htmlform-float-invalid' => "El valor indicà no'l xe mia un nùmaro.",
'htmlform-int-toolow' => 'El valor che te ghè indicà el xe soto al minimo, che xe $1',
'htmlform-int-toohigh' => 'El valor che te ghè indicà el xe sora al màssimo, che xe $1',
+'htmlform-required' => 'Sto vałore xè necesario',
'htmlform-submit' => 'Manda',
'htmlform-reset' => 'Scancèla modifiche',
'htmlform-selectorother-other' => 'Altro',
+# SQLite database support
+'sqlite-has-fts' => '$1 con la possibilità de riserca completa nel testo',
+'sqlite-no-fts' => '$1 sensa la possibilità de riserca completa nel testo',
+
);
diff --git a/languages/messages/MessagesVep.php b/languages/messages/MessagesVep.php
index 52d4a58e..c704c1e1 100644
--- a/languages/messages/MessagesVep.php
+++ b/languages/messages/MessagesVep.php
@@ -101,8 +101,7 @@ $messages = array(
'tog-editsection' => 'Ozutada "Redaktiruida"-kosketuz kaikuÄÄen sekcijan täht',
'tog-editsectiononrightclick' => 'Redaktiruida sekcijad hiren oiktal plokul pälkirjutesele (JavaScript)',
'tog-showtoc' => 'Ozutada südäimišt (lehtpoled, kudambil om enamba, mi 3 pälkirjutest)',
-'tog-rememberpassword' => 'Muštta minun kävutajan nimi neciš kompjuteras',
-'tog-editwidth' => 'Tehta redaktiruindan pöud iknan leveÄÄeks',
+'tog-rememberpassword' => 'Muštta minun kävutajan nimi neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})',
'tog-watchcreations' => 'Ližata kaik minai sätud lehtpoled minun kaclendkirjuteshe',
'tog-watchdefault' => 'Ližata kaik minai toižetadud lehtpoled minun kaclendkirjuteshe',
'tog-watchmoves' => 'Ližata kaik minai udesnimitadud lehtpoled minun kaclendkirjuteshe',
@@ -247,31 +246,20 @@ $messages = array(
'faqpage' => 'Project:PPK',
# Vector skin
-'vector-action-addsection' => 'Ližada tem',
-'vector-action-delete' => 'Čuta poiš',
-'vector-action-move' => 'Udesnimitada',
-'vector-action-protect' => 'Kaita',
-'vector-action-undelete' => 'Pördutada',
-'vector-action-unprotect' => 'Heitta kaiÄend',
-'vector-namespace-category' => 'Kategorii',
-'vector-namespace-help' => "Abun lehtpol'",
-'vector-namespace-image' => 'Fail',
-'vector-namespace-main' => "Lehtpol'",
-'vector-namespace-media' => "Medialehtpol'",
-'vector-namespace-mediawiki' => 'Kirjeine',
-'vector-namespace-project' => "Projektan lehtpol'",
-'vector-namespace-special' => "Specialine lehtpol'",
-'vector-namespace-talk' => 'Diskussii',
-'vector-namespace-template' => 'Å ablon',
-'vector-namespace-user' => "Kävutajan lehtpol'",
-'vector-view-create' => 'Säta',
-'vector-view-edit' => 'Redaktiruida',
-'vector-view-history' => 'Kacta istorii',
-'vector-view-view' => 'Lugeda',
-'vector-view-viewsource' => 'Kacta purtkehe',
-'actions' => 'Tegendad',
-'namespaces' => 'Nimiavaruded',
-'variants' => 'Variantad',
+'vector-action-addsection' => 'Ližada tem',
+'vector-action-delete' => 'Čuta poiš',
+'vector-action-move' => 'Udesnimitada',
+'vector-action-protect' => 'Kaita',
+'vector-action-undelete' => 'Pördutada',
+'vector-action-unprotect' => 'Heitta kaiÄend',
+'vector-view-create' => 'Säta',
+'vector-view-edit' => 'Redaktiruida',
+'vector-view-history' => 'Kacta istorii',
+'vector-view-view' => 'Lugeda',
+'vector-view-viewsource' => 'Kacta purtkehe',
+'actions' => 'Tegendad',
+'namespaces' => 'Nimiavaruded',
+'variants' => 'Variantad',
'errorpagetitle' => 'Petuz',
'returnto' => 'Pörttas lehtpolele $1.',
@@ -333,6 +321,7 @@ Serverad oma üläkormatud.
Varastagat pordon aigad i lat'kät pörttas lehtpolele.
$1",
+'pool-errorunknown' => 'Tundmatoi petuz',
# 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' => 'Informacii saitas {{SITENAME}}',
@@ -477,79 +466,81 @@ Sü om "\'\'$2\'\'".',
'virus-unknownscanner' => 'tundmatoi antivirus:',
# Login and logout pages
-'logouttext' => "'''Tö olet lähtnuded sistemaspäi.'''
+'logouttext' => "'''Tö olet lähtnuded sistemaspäi.'''
Sab jatkta rad {{SITENAME}}-saital anonimižikš, vai [[Special:UserLogin|kirjutagatoiš udes]] sil-žo vai toižel kävutajan nimel.
Otkat sil'mnägubale, miše erasid lehtpolid ozutaškatas mugažo, kut i edel teiden lähtendad sistemaspäi. Miše vajehtada niiden nägu, puhtastagat teiden kaclimen keš.",
-'welcomecreation' => '== Tulgat tervhen, $1! ==
+'welcomecreation' => '== Tulgat tervhen, $1! ==
Teiden registracii om loptud.
Algat unohtagoi [[Special:Preferences|järgeta personaližikš]] sait.',
-'yourname' => 'Kävutajan nimi:',
-'yourpassword' => 'Peitsana:',
-'yourpasswordagain' => 'Kirjutagat peitsana udes:',
-'remembermypassword' => 'Panda muštho minun tulendandmused neciš kompjuteras',
-'yourdomainname' => 'Teiden domen:',
-'externaldberror' => 'Ozaižihe petuz autentifikacijan, kudamb tehtihe andmusiden irdbazan turbiÅ¡, aigan, vai teile ei ulotu oiktusid toižetada iÄetoi irdregistracijad.',
-'login' => 'Kirjutadas sistemha',
-'nav-login-createaccount' => 'Kirjutadas / Sada registracii',
-'loginprompt' => 'Pidab laskta sada "cookies", miše kirjutadas {{SITENAME}}he.',
-'userlogin' => 'Kirjutadas / Sada registracii',
-'userloginnocreate' => 'Kirjutagatoiš sistemha',
-'logout' => 'Lähtta',
-'userlogout' => 'Lähtta',
-'notloggedin' => 'Tö et olgoi kirjutanus sistemha',
-'nologin' => "Ku tö et völ olgoi sanuded registracijad, '''$1'''.",
-'nologinlink' => 'Sada registracii',
-'createaccount' => 'Sada registracii',
-'gotaccount' => "Ku teil om jo registracii, '''$1'''.",
-'gotaccountlink' => 'Kirjutagatoiš sistemha',
-'createaccountmail' => 'e-poÄtaiÄi',
-'badretype' => 'Teil kirjutadud peitsanad ei kožugoi toine toižhe.',
-'userexists' => 'Kirjutadud kävutajan nimi om jo rezerviruidud.
+'yourname' => 'Kävutajan nimi:',
+'yourpassword' => 'Peitsana:',
+'yourpasswordagain' => 'Kirjutagat peitsana udes:',
+'remembermypassword' => 'Panda muštho minun tulendandmused neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})',
+'yourdomainname' => 'Teiden domen:',
+'externaldberror' => 'Ozaižihe petuz autentifikacijan, kudamb tehtihe andmusiden irdbazan turbiÅ¡, aigan, vai teile ei ulotu oiktusid toižetada iÄetoi irdregistracijad.',
+'login' => 'Kirjutadas sistemha',
+'nav-login-createaccount' => 'Kirjutadas / Sada registracii',
+'loginprompt' => 'Pidab laskta sada "cookies", miše kirjutadas {{SITENAME}}he.',
+'userlogin' => 'Kirjutadas / Sada registracii',
+'userloginnocreate' => 'Kirjutagatoiš sistemha',
+'logout' => 'Lähtta',
+'userlogout' => 'Lähtta',
+'notloggedin' => 'Tö et olgoi kirjutanus sistemha',
+'nologin' => "Ku tö et völ olgoi sanuded registracijad, '''$1'''.",
+'nologinlink' => 'Sada registracii',
+'createaccount' => 'Sada registracii',
+'gotaccount' => "Ku teil om jo registracii, '''$1'''.",
+'gotaccountlink' => 'Kirjutagatoiš sistemha',
+'createaccountmail' => 'e-poÄtaiÄi',
+'createaccountreason' => 'Sü:',
+'badretype' => 'Teil kirjutadud peitsanad ei kožugoi toine toižhe.',
+'userexists' => 'Kirjutadud kävutajan nimi om jo rezerviruidud.
Olgat hüväd, valikat toine kävutajan nimi.',
-'loginerror' => 'Sistemha tulendan peituz.',
-'createaccounterror' => 'Ei voi säta registracijad: $1',
-'nocookieslogin' => '{{SITENAME}}-sait kävutab "cookie"-failad, miše tundištada kävutajid.
+'loginerror' => 'Sistemha tulendan peituz.',
+'createaccounterror' => 'Ei voi säta registracijad: $1',
+'nocookieslogin' => '{{SITENAME}}-sait kävutab "cookie"-failad, miše tundištada kävutajid.
Tö olet saupnuded "cookie"-failad.
Otkat ned kävutamižhe i toštkat teiden tegend.',
-'noname' => 'Tö ei olgoi kirjutanuded lasktud kävutajan nimed.',
-'loginsuccesstitle' => 'Tulend sistemha om lopnus satusekahas.',
-'loginsuccess' => "'''Tö radat nügüd' {{SITENAME}}-saital kut \"\$1\".'''",
-'nosuchuser' => 'Ei ole kävutajad "$1"-nimenke.
+'noname' => 'Tö ei olgoi kirjutanuded lasktud kävutajan nimed.',
+'loginsuccesstitle' => 'Tulend sistemha om lopnus satusekahas.',
+'loginsuccess' => "'''Tö radat nügüd' {{SITENAME}}-saital kut \"\$1\".'''",
+'nosuchuser' => 'Ei ole kävutajad "$1"-nimenke.
Kävutajan nimiden oigedkirjutamine rippub kirjamiden registraspäi.
Kodvgat teiden oigedkirjutamine, vai [[Special:UserLogin/signup|säkat uz\' registracii]].',
-'nosuchusershort' => 'Ei ole kävutajad "<nowiki>$1</nowiki>"-nimenke.
+'nosuchusershort' => 'Ei ole kävutajad "<nowiki>$1</nowiki>"-nimenke.
Kodvgat teiden oigedkirjutamine.',
-'nouserspecified' => 'Pidab kirjutada kävutajan nimi.',
-'login-userblocked' => "Nece kävutai om blokiruidud. Tulend sistemha om kel'tud.",
-'wrongpassword' => 'Peitsana om vär.
+'nouserspecified' => 'Pidab kirjutada kävutajan nimi.',
+'login-userblocked' => "Nece kävutai om blokiruidud. Tulend sistemha om kel'tud.",
+'wrongpassword' => 'Peitsana om vär.
Kirjutagat se völ kerdan.',
-'wrongpasswordempty' => "Nece peitsana om pall'az.
+'wrongpasswordempty' => "Nece peitsana om pall'az.
Kirjutagat toine peitsana.",
-'passwordtooshort' => 'Peitsanha pidab mülütada {{PLURAL:$1|1 znam|$1 znamad}}.',
-'password-name-match' => 'Teiden peitsanale pidab erineda kävutajan nimespäi.',
-'mailmypassword' => "Oigeta minei uz' peitsana e-poÄtadme",
-'passwordremindertitle' => "Uz' pordaigaline peitsana {{SITENAME}}-saitan täht",
-'noemail' => '"$1"-kävutai ei ole andnu iÄeze e-poÄtan adresad.',
-'noemailcreate' => 'Bidab kirjutada todesine e-poÄtan adres',
-'passwordsent' => "Uz' peitsana om oigetud $1-kävutajan e-poÄtan adresale.
+'passwordtooshort' => 'Peitsanha pidab mülütada {{PLURAL:$1|1 znam|$1 znamad}}.',
+'password-name-match' => 'Teiden peitsanale pidab erineda kävutajan nimespäi.',
+'password-login-forbidden' => "Necen kävutajannimen da peitsanan kävutamine om kel'tud.",
+'mailmypassword' => "Oigeta minei uz' peitsana e-poÄtadme",
+'passwordremindertitle' => "Uz' pordaigaline peitsana {{SITENAME}}-saitan täht",
+'noemail' => '"$1"-kävutai ei ole andnu iÄeze e-poÄtan adresad.',
+'noemailcreate' => 'Bidab kirjutada todesine e-poÄtan adres',
+'passwordsent' => "Uz' peitsana om oigetud $1-kävutajan e-poÄtan adresale.
Olgat hüväd, kirjutagatoiš sistemha, konz sat sen.",
-'blocked-mailpassword' => "Redaktiruind teiden IP-adresalpäi om kel'tud, peitsanan udiÅ¡tandan funkcii om mugažo blokiruidud, miÅ¡e kaitas abidoiÄendaspäi.",
-'eauthentsent' => 'Vahvištoituzkirjeine om oigetud teiden adresale. Kirjeižes om mugažo kirjutadud, midä pidab tehta, miše vahvištoitta teiden registracijad.',
-'mailerror' => 'E-poÄtan oigendamižen petuz: $1',
-'emailauthenticated' => 'Teiden e-poÄtan adres vahviÅ¡toittihe datal $2 aigal $3.',
-'emailnotauthenticated' => 'Teiden e-poÄtan adres ei ole völ vahviÅ¡toittud.
+'blocked-mailpassword' => "Redaktiruind teiden IP-adresalpäi om kel'tud, peitsanan udiÅ¡tandan funkcii om mugažo blokiruidud, miÅ¡e kaitas abidoiÄendaspäi.",
+'eauthentsent' => 'Vahvištoituzkirjeine om oigetud teiden adresale. Kirjeižes om mugažo kirjutadud, midä pidab tehta, miše vahvištoitta teiden registracijad.',
+'mailerror' => 'E-poÄtan oigendamižen petuz: $1',
+'emailauthenticated' => 'Teiden e-poÄtan adres vahviÅ¡toittihe datal $2 aigal $3.',
+'emailnotauthenticated' => 'Teiden e-poÄtan adres ei ole völ vahviÅ¡toittud.
Wiki-likutimen poÄtfunkcijad ei olgoi kävutamas.',
-'noemailprefs' => 'Kirjutagat e-poÄtan adres teiden järgendusihe, miÅ¡e se oliži kävutamas.',
-'emailconfirmlink' => 'VahviÅ¡toitkat teiden e-poÄtan adres',
-'invalidemailaddress' => 'Ningomal e-poÄtan adresal om vär format. Olgat hüväd, kirjutagat e-poÄtan adres oiktas formatas vai puhtastagat e-poÄtan pöud.',
-'accountcreated' => 'Registracii om OK',
-'accountcreatedtext' => 'Registracii $1-kävutajan täht om sätud.',
-'createaccount-title' => '{{SITENAME}}: registracijan sädand.',
-'usernamehasherror' => 'Kävutajan nimes ei voi olda mugošt znamad.',
-'login-throttled' => 'Tö olet tehnu äjahkon naprindoid kirjutadas sistemha.
+'noemailprefs' => 'Kirjutagat e-poÄtan adres teiden järgendusihe, miÅ¡e se oliži kävutamas.',
+'emailconfirmlink' => 'VahviÅ¡toitkat teiden e-poÄtan adres',
+'invalidemailaddress' => 'Ningomal e-poÄtan adresal om vär format. Olgat hüväd, kirjutagat e-poÄtan adres oiktas formatas vai puhtastagat e-poÄtan pöud.',
+'accountcreated' => 'Registracii om OK',
+'accountcreatedtext' => 'Registracii $1-kävutajan täht om sätud.',
+'createaccount-title' => '{{SITENAME}}: registracijan sädand.',
+'usernamehasherror' => 'Kävutajan nimes ei voi olda mugošt znamad.',
+'login-throttled' => 'Tö olet tehnu äjahkon naprindoid kirjutadas sistemha.
Olgat hüväd, varastagat pordon aigad edel ut naprindad.',
-'loginlanguagelabel' => 'Kel’: $1',
+'loginlanguagelabel' => 'Kel’: $1',
# Password reset dialog
'resetpass' => 'Vajehtada peitsana',
@@ -608,7 +599,7 @@ Teiden IP-adres om kirjutadud necen lehtpolen redaktiruindan istorijaha.",
Ku tö valiÄet völ kerdan \"Kirjutada lehtpol'\", ka teiden toižetused kirjutase ningoižeta ümbrikacundata.",
'missingcommenttext' => 'Olgat hüväd, pangat teiden tedotuz alahaks.',
'missingcommentheader' => "'''Muštatez:''' Tö et olgoi andnuded toižetusiden ümbrikacundoiden pälkirjutest.
-Ku tö valiÄet völ kerdan \"Kirjutada lehtpol'\", ka teiden toižetusiden ümbrikacund kirjutase ningoižeta pälkirjuteseta.",
+Ku tö valiÄet völ kerdan â€{{int:savearticle}}†\"Kirjutada lehtpol'\", ka teiden toižetusiden ümbrikacund kirjutase ningoižeta pälkirjuteseta.",
'summary-preview' => 'Ãœmbrikacund linneb mugoi:',
'subject-preview' => 'Ümbrikacundan pälkirjutez linneb mugoi:',
'blockedtitle' => 'Kävutai om blokiruidud',
@@ -659,6 +650,9 @@ Ku tö olet petnus tänna tuldes, pingat teiden kaclimen '''tagaze'''-kingitimel
Tö voit [[Special:Search/{{PAGENAME}}|ectä nece nimi]] toižil lehtpolil,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ectä pojavid aigkirjoiden kirjutesid],
vai [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktiruida nece lehtpol\']</span>.',
+'noarticletext-nopermission' => 'Necil lehtpolel ei ole nügüd\' tekstad.
+Tö voit [[Special:Search/{{PAGENAME}}|ectä necen lehtpolen nimi]] toižil lehtpolil,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ectä pojavid aigkirjoiden kirjutesid]</span>.',
'userpage-userdoesnotexist' => "Kävutajan nimed «$1» ei ole. Todeks-ik tahtoit säta vai toižetada nece lehtpol'?",
'userpage-userdoesnotexist-view' => '"$1"-kävutai ei ole registriruidud.',
'blocked-notice-logextract' => "Nece kävutai om nügüd' blokiruidud.
@@ -692,9 +686,6 @@ Ku tö et tahtkoi, miÅ¡e teiden tekstad levitaižiba da redaktiruižiba miÄÄed
Tö vahvištoitat mugažo, miše olet toižetusiden avtoran vai olet kopiruinuded tekstad joudjas purtkespäi.
'''ALGAT SIJAKOI LASKMATA AVTORANOIKTUSEL KAITUD MATERIALOID!'''",
-'longpagewarning' => "'''HOMAIKAT:''' Necen lehtpolen suruz om $1 kb;
-erasil kaclimil om problemoid, konz ned kaceltas 32 kb ülitajid lehtpolid.
-Olgat hüväd, jagakat lehtpol' penembihe paloihe.",
'longpageerror' => "'''PETUZ: Teiden tekstan suruz om $1 kb, a lasktud maksimum om $2 kb.'''
Ei voi kirjutada muštho.",
'protectedpagewarning' => "'''VARUTUZ: nece lehtpol' om luklostadud, sidä voidas redaktiruida vaiše administratorad.'''
@@ -722,6 +713,10 @@ Tö voit pörttas tagaze i redaktiruida toine lehtpol', vai [[Special:UserLogin|
'permissionserrors' => 'Oiktusiden petused',
'permissionserrorstext' => 'Teile ei sa tehta muga {{PLURAL:$1|necen sün|neniden süiden}} tagut:',
'permissionserrorstext-withaction' => 'Teile ei sa $2 {{PLURAL:$1|necen sün|neciden süiden}} tagut:',
+'recreate-moveddeleted-warn' => "Homaikat!
+Tö ladit säta lehtpol', kudamb om Äutud poiÅ¡ aigemba.
+Kodvgat, pidab-ik säta nece lehtpol' udes.
+Alemba anttas necen lehtpolen Äudandoiden da udesnimitandoiden aiglehtez.",
'moveddeleted-notice' => "Nece lehtpol' om Äutud poiÅ¡.
Alemba om anttud lehtpolen Äudandan vai sirdandan istorii kut abuandmused.",
'log-fulllog' => 'Ozutada kaclendnimikirjutez kogonaz',
@@ -739,6 +734,8 @@ Wikiš om jo mugoi lehtpol'.",
'post-expand-template-inclusion-warning' => 'Varutuz: lehtpolele pandud Å¡ablonoiden suruz om surehk.
Ei voi mülütada erasid šablonoid.',
'post-expand-template-inclusion-category' => 'Lehtpoled, kudambiden mülütadud šablonoiden suruz om ülitadud',
+'post-expand-template-argument-warning' => "Homaikat! Necil lehtpolel om hot' üks' surehk šablonan argument.
+Mugomad argumentad Äutihe.",
'post-expand-template-argument-category' => 'Lehtpoled, kudambil om keskhe jättud šablonoiden argumentid',
'parser-template-loop-warning' => "Sol'm om löutud šablonas: [[$1]]",
'parser-template-recursion-depth-warning' => 'Šablonan rekursijan süvuzröun om ülitadud ($1)',
@@ -831,6 +828,8 @@ $1",
'logdelete-failure' => "'''Ei voi toižetada aigkirjutesen näguladud:'''
$1",
'revdel-restore' => 'Toižetada nägubuz',
+'revdel-restore-deleted' => 'Äutud poiÅ¡ versijad',
+'revdel-restore-visible' => 'versijad, kudambad voib nähta',
'pagehist' => 'Lehtpolen istorii',
'deletedhist' => 'ÄŒudandoiden istorii',
'revdelete-content' => 'südäimišt',
@@ -890,7 +889,7 @@ Tö ei voigoi kävutada sidä.',
'compareselectedversions' => 'Rindatada valitud versijad',
'showhideselectedversions' => 'Ozutada/peitta valitud versijad',
'editundo' => 'heitta pätand',
-'diff-multi' => "({{PLURAL:$1|üks' keskmäine versii ei ole|$1 keskmäšt versijad ei olgoi}} ozutadud)",
+'diff-multi' => "({{PLURAL:$1|üks' keskmäine versii ei ole|$1 keskmäšt versijad ei olgoi}} {{PLURAL:$2|one user|$2 users}} ozutadud)",
# Search results
'searchresults' => "Ectä rezul'tatad",
@@ -926,6 +925,7 @@ Tö ei voigoi kävutada sidä.',
'searchprofile-everything-tooltip' => 'Ectä kaikil lehtpolil (lodulehtpolid mülütaden)',
'searchprofile-advanced-tooltip' => 'Ectä märitud nimiavarusiš',
'search-result-size' => '$1 ({{PLURAL:$2|1 sana|$2 sanad}})',
+'search-result-category-size' => '{{PLURAL:$1|1 element|$1 elementad}} ({{PLURAL:$2|1 alakategorii|$2 alakategorijad}}, {{PLURAL:$3|1 fail|$3 failad}})',
'search-result-score' => 'Relevantižuz: $1%',
'search-redirect' => '(oigenduz $1)',
'search-section' => '(jaguz $1)',
@@ -942,6 +942,7 @@ Tö ei voigoi kävutada sidä.',
'searchall' => 'kaik',
'showingresults' => "Alemba ozutadas {{PLURAL:$1|'''1''' rezul'tat|'''$1''' rezul'tatad}} nomeraspäi #'''$2''' augotaden.",
'showingresultsnum' => "Alemba ozutadas {{PLURAL:$3|'''1''' rezul'tat|'''$3''' rezul'tatad}} nomeraspäi '''$2''' augotaden.",
+'showingresultsheader' => "{{PLURAL:$5|'''$1''' '''$3'''-š rezul'tatoišpäi|Rezul'tatad '''$1–$2''' '''$3'''-špäi}} '''$4'''-n täht",
'nonefound' => "'''Note''': Ectäs tobjimalaz kaidetud nimiavaruzišpäi.
Kävutagat prefiks ''all:'', miše ectä kaikes südäimištospäi (lodulehtpolid, šablonoid i m. e. mülütaden), vai kävutagat tarbhaine nimiavaruz.",
'search-nonefound' => "Ecmižhe ei löudnus rezul'tatoid.",
@@ -1002,6 +1003,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
'contextlines' => 'Ozutadud rividen lugu kaikuÄÄen löutud kirjutesen täht:',
'contextchars' => 'Kontekstznamoiden lugu rives:',
'stub-threshold' => 'Nägutesen märitamižen künduz <a href="#" class="stub">kosketust otetile</a> (baitoiš)',
+'stub-threshold-disabled' => 'Ei ole kävutamas',
'recentchangesdays' => 'Päiväd veresiden toižetusidenke, lugumär:',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|päiv|päiväd}})',
'recentchangescount' => 'Redakcijoiden lugu, kudamb pidab ozutada augotižjärgendusen mödhe:',
@@ -1066,9 +1068,15 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'prefs-advancedrendering' => 'Ližaopcijad',
'prefs-advancedsearchoptions' => 'Ližaopcijad',
'prefs-advancedwatchlist' => 'Ližaopcijad',
-'prefs-display' => 'Nägun opcijad',
+'prefs-displayrc' => 'Nägun opcijad',
+'prefs-displaysearchoptions' => 'Nägun opcijad',
+'prefs-displaywatchlist' => 'Nägun opcijad',
'prefs-diffs' => 'Erod',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'VerkpoÄtan adres nägub korrektižeks.',
+'email-address-validity-invalid' => 'Antkat verkpoÄtan korrektine adres',
+
# User rights
'userrights' => 'Kävutajiden oiktusiden ohjandamine',
'userrights-lookup-user' => 'Kävutajiden gruppiden ohjendamine',
@@ -1214,14 +1222,9 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'recentchanges-legend' => 'Tantoižiden toižetusiden järgendused',
'recentchangestext' => 'Necil lehtpolil om tantoižid toižetusid {{SITENAME}}-saital.',
'recentchanges-feed-description' => "Kacelta jäl'gmäižid toižetusid wikiš neciš valus.",
-'recentchanges-label-legend' => 'Legend: $1.',
-'recentchanges-legend-newpage' => "$1 - uz' lehtpol'",
'recentchanges-label-newpage' => 'Nece redakcii sädi uden lehtpolen',
-'recentchanges-legend-minor' => '$1 - penikaine redakcii',
'recentchanges-label-minor' => 'Nece redakcii om penikaine',
-'recentchanges-legend-bot' => '$1 - botan redakcii',
'recentchanges-label-bot' => 'Necen redakcijan tegi bot',
-'recentchanges-legend-unpatrolled' => '$1 - patruliruimatoi redakcii',
'recentchanges-label-unpatrolled' => 'Necidä redakcijad ei völ patruliruinugoi',
'rcnote' => "Alahan om ozutadud {{PLURAL:$1| '''1''' toižetuz|'''$1''' toižetust}} {{PLURAL:$2|jäl'gmäižes päiväs|jäl'gmäižiš '''$2''' päiviš}}, aigal $5, $4.",
'rcnotefrom' => "Alemba oma anttud toižetused '''$2'''-späi ( '''$1'''-hesai).",
@@ -1293,6 +1296,17 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'filetype-banned-type' => "'''\".\$1\"''' om laskmatoi failan tip.
Lasktud {{PLURAL:\$3|failan tip om|failoiden tipad oma}} \$2.",
'filetype-missing' => 'Necil failal ei ole ližad (ozutesikš, ".jpg").',
+'empty-file' => "Teil oigetud fail om pall'az.",
+'file-too-large' => 'Teil oigetud fail om surembahk.',
+'filename-tooshort' => 'Lühudahk failannimi.',
+'filetype-banned' => "Nece failtip om kel'tud.",
+'verification-error' => 'Nece fail ei völ sanu vahvištust.',
+'hookaborted' => "Ližoiden ümbriradai kel'di teid tehta nece toižetuz.",
+'illegal-filename' => "Kel'tud failannimi.",
+'overwrite' => 'Ei sa kirjutada muštho olijan failan päle.',
+'unknown-error' => 'Tundmatoi petuz.',
+'tmp-create-error' => 'Ei voi säta pordaigašt failad.',
+'tmp-write-error' => 'Petuz pordaigaižen failan kirjutamižen aigan.',
'largefileserver' => 'Failan suruz om suremb, mi lasktud serveral.',
'emptyfile' => "Teil jügutoittud fail nägub pal'haks.
Voib olda, necen sü om vär failannimen kirjutamine.
@@ -1300,7 +1314,6 @@ Olgat hüväd, kodvgat, todeks-ik tö tahtoit jügutoitta nece fail.",
'fileexists' => "Fail mugoman nimenke om jo olmas, olgat hüväd, kodvgat '''<tt>[[:$1]]</tt>''' ku teil ei ole varmdust, tahtoižit-ik tö toižetada sidä.
[[$1|thumb]]",
'file-exists-duplicate' => 'Nece fail om {{PLURAL:$1|necen failan|neniden failoiden}} dublikat:',
-'successfulupload' => 'Jügutoitand lopihe satusekahas',
'uploadwarning' => 'Varutuz jügutoitmižes',
'savefile' => 'Kirjutada fail',
'uploadedimage' => 'om jügutoitnu "[[$1]]"',
@@ -1317,6 +1330,9 @@ Olgat hüväd, kodvgat, todeks-ik tö tahtoit jügutoitta nece fail.",
'upload-maxfilesize' => 'Failan maksimaline suruz: $1',
'upload-description' => 'failan ümbrikirjutand',
'watchthisupload' => 'Kacelta necidä failad',
+'upload-success-subj' => 'Jügutoitand lopihe satusekahas',
+'upload-failure-subj' => 'Jügutoitandan problem',
+'upload-warning-subj' => 'Jügutoitandvarutuz',
'upload-proto-error' => 'Vär protokol',
'upload-proto-error-text' => 'Miše jügutoitta edahanpäi, kävutagat URL, kudamb augotase <code>http://</code> vai <code>ftp://</code>.',
@@ -1394,6 +1410,8 @@ Plok pachan pälkirjutesele toižetab sortiruindan järgenduz.',
'redirectstofile' => '{{PLURAL:$1|Nece fail läbikosketab|$1 Nened failad läbikosketadas}} necile failale:',
'duplicatesoffile' => '{{PLURAL:$1|Nece fail om|$1 Nened failad oma}} ([[Special:FileDuplicateSearch/$2|ližainformacii]])-failan {{PLURAL:$1|dublikat|$1 dublikatad}}:',
'sharedupload' => 'Nece fail om ühthižes $1-varaaitaspäi, sidä voiži kävutada mugažo toižiš projektoiš.',
+'sharedupload-desc-here' => 'Nece fail om $1-späi i se sab kävutada toižiš projektoiš.
+Informacijad sen [$2 andmusiden lehtpolelpäi] om anttud alemba.',
'filepage-nofile' => 'Ei ole failad mugoižen nimenke.',
'filepage-nofile-link' => 'Ei ole failad mugoižen nimenke, no tö voit [$1 jügutoitta se].',
'uploadnewversion-linktext' => "Jügutoitta necen failan uz' versii",
@@ -1465,7 +1483,6 @@ Plok pachan pälkirjutesele toižetab sortiruindan järgenduz.',
'statistics-edits-average' => 'Toižetusiden keskmäine lugu lehtpolel',
'statistics-views-total' => 'Kaiked kacundoid',
'statistics-views-peredit' => 'Kacundoid redakcijas',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Töiden jonon] piduz',
'statistics-users' => 'Registriruidud [[Special:ListUsers|kävutajad]]',
'statistics-users-active' => 'Activižed kävutajad',
'statistics-mostpopular' => 'Kaikiš populärižembad lehtpoled',
@@ -1660,7 +1677,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
# Watchlist
'watchlist' => 'Kaclendnimikirjutez',
'mywatchlist' => 'Minun kaclendnimikirjutez',
-'watchlistfor' => "('''$1''')",
+'watchlistfor2' => 'Kävutajale $1 $2',
'nowatchlist' => "Teiden kaclendnimikirjutez om pall'az.",
'watchlistanontext' => 'Olgat hüväd, $1, miše lugeda vai redaktiruida teiden kaclendnimikirjutez.',
'watchnologin' => 'Pidab kirjutadas sistemha',
@@ -1775,7 +1792,9 @@ Jäl'gmäižed toižetused om tehnu [[User:$3|$3]] ([[User talk:$3|Lodud]]{{int:
'editcomment' => "Redaktiruindan ümbrikacund oli: \"''\$1''\".",
'revertpage' => 'Kävutajan [[Special:Contributions/$2|$2]] ([[User talk:$2|Lodud]]) tožetused oma endištadud edeližhe versijahasai (avtor: [[User:$1|$1]])',
'rollback-success' => '$1-kävutajan toižetused oma endištadud $2-kävutajan versijahasai.',
-'sessionfailure' => 'Om problemoid nügüdläižes radseansas; nece tegend om kel\'tud, miše kaita "seansan anastusespäi".
+
+# Edit tokens
+'sessionfailure' => 'Om problemoid nügüdläižes radseansas; nece tegend om kel\'tud, miše kaita "seansan anastusespäi".
Olgat hüväd, paingat "tagaze"-kingitimele i jügutoitkat lehtpol\' udes, sid\' naprigat toštta tegend völ kerdan.',
# Protect
@@ -1894,6 +1913,7 @@ $1',
'sp-contributions-newbies-title' => 'Uziden kävutajiden tond',
'sp-contributions-blocklog' => 'Blokiruindoiden aigkirj',
'sp-contributions-deleted' => 'Čutud kävutajan tond',
+'sp-contributions-uploads' => 'jügutoitandad',
'sp-contributions-logs' => 'aigkirjad',
'sp-contributions-talk' => 'lodu',
'sp-contributions-userrights' => 'kävutajiden oiktusiden ohjandamine',
@@ -1901,6 +1921,7 @@ $1',
Alemba om anttud jälgmäine kirjutuz blokiruindaiglehtesespäi:",
'sp-contributions-search' => 'Ectä tond',
'sp-contributions-username' => 'IP-adres vai kävutajan nimi:',
+'sp-contributions-toponly' => "Ozutada vaiše toižetused, kudambad oma jäl'gmäižin versijoin",
'sp-contributions-submit' => 'Ectä',
# What links here
@@ -1963,7 +1984,6 @@ Kc. [[Special:IPBlockList|blokiruidud IP-adresoiden nimikirjuteshe]].',
'ipb-edit-dropdown' => 'Redaktiruida süiden nimikirjutez',
'ipb-unblock-addr' => 'Heitta blokiruind kävutajalpäi $1',
'ipb-unblock' => 'Heitta blokiruind kävutajan nimelpäi vai IP-adresalpäi',
-'ipb-blocklist-addr' => 'Kävutajan $1 aktualižed blokiruindad',
'ipb-blocklist' => 'Ozutada aktualižed blokiruindad',
'ipb-blocklist-contribs' => 'Kävutajan $1 tond',
'unblockip' => 'Heitta blokiruind IP-adresalpäi',
@@ -1971,7 +1991,7 @@ Kc. [[Special:IPBlockList|blokiruidud IP-adresoiden nimikirjuteshe]].',
'ipusubmit' => 'Heitta nece blokiruind',
'unblocked' => '[[User:$1|$1]]-kävutajan blokiruind om heittud',
'unblocked-id' => 'Blokiruind $1 om heittud',
-'ipblocklist' => 'Blokiruidud IP-adresad da kävutajiden nimed',
+'ipblocklist' => 'Blokiruidud kävutajad',
'ipblocklist-legend' => 'Löuta blokiruidud kävutajad',
'ipblocklist-username' => 'Kävutajan nimi vai IP-adres:',
'ipblocklist-sh-userblocks' => '$1 kävutajiden nimiden blokiruindad',
@@ -2249,6 +2269,7 @@ Sab lugeda sen augotižkod da kopiruida se.",
'tooltip-upload' => 'Augotada jügutoitand',
'tooltip-rollback' => "Čukat jäl'gmäižel redaktoral tehtud toižetused ühtel painandal",
'tooltip-undo' => "ÄŒuta jäl'gmäine toižetuz i avaita redaktiruindan lehtpol'. Sab kirjutada Äudandad sü.",
+'tooltip-summary' => 'Kirjutagat lühüd ümbristarinoiÄend',
# Stylesheets
'common.css' => '/* Pandud tänna CSS painastaškandeb kaikile irdnägun temoile */',
@@ -2321,6 +2342,7 @@ kc. math/README järgendamižen täht.',
# Patrol log
'patrol-log-page' => 'Patruliruindan aigkirj',
'patrol-log-header' => 'Nece om patruliruidud versijoiden aiglehtez.',
+'patrol-log-line' => 'kodvi $1 $2-špäi $3',
'patrol-log-auto' => '(avtomatižikš)',
'patrol-log-diff' => 'versii $1',
'log-show-hide-patrol' => '$1 patruliruindan aigkirj',
@@ -2336,10 +2358,10 @@ kc. math/README järgendamižen täht.',
# Media information
'thumbsize' => 'PiÄukuvan suruz:',
'widthheightpage' => "$1×$2, $3 {{PLURAL:$3|lehtpol'|lehtpol't}}",
-'file-info' => '(failan suruz: $1, MIME-tip: $2)',
-'file-info-size' => '($1 × $2 pikselad, failan suruz: $3, MIME-tip: $4)',
+'file-info' => 'failan suruz: $1, MIME-tip: $2',
+'file-info-size' => '$1 × $2 pikselad, failan suruz: $3, MIME-tip: $4',
'file-nohires' => '<small>Ei ole versijad paremban tarkoiktusenke.</small>',
-'svg-long-desc' => '(SVG-fail, nominaližikš $1 × $2 pikselid, failan suruz: $3)',
+'svg-long-desc' => 'SVG-fail, nominaližikš $1 × $2 pikselid, failan suruz: $3',
'show-big-image' => 'Korgedtarkoiktuseline kuvan versii',
'show-big-image-thumb' => '<small>Ezikacundan suruz: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'toštase',
@@ -2788,6 +2810,7 @@ Kävutagat normaline ezikacund.',
'version-specialpages' => 'Specialižed lehtpoled',
'version-parserhooks' => 'Sintaksižen analizatoran sabustajad',
'version-variables' => 'Vajehtujad lugud',
+'version-skins' => 'Nägutemad',
'version-other' => 'Toine',
'version-mediahandlers' => 'Median radimed',
'version-hooks' => 'Sabutajad',
@@ -2799,6 +2822,7 @@ Kävutagat normaline ezikacund.',
'version-hook-subscribedby' => 'Ezipakitoitajad',
'version-version' => '(Versii $1)',
'version-license' => 'Licenzii',
+'version-poweredby-others' => 'toižed',
'version-software' => 'Seižutadud programmišt',
'version-software-product' => 'Produkt',
'version-software-version' => 'Versii',
@@ -2865,6 +2889,15 @@ Kirjutagat failan nimi «{{ns:file}}:»-pkefiksata.',
'tags-edit' => 'redaktiruida',
'tags-hitcount' => '$1 {{PLURAL:$1|toižetuz|toižetust}}',
+# Special:ComparePages
+'comparepages' => 'Lehtpoliden rindatuz',
+'compare-selector' => 'Lehtpoliden versijoiden rindatuz',
+'compare-page1' => "Ezmäine lehtpol'",
+'compare-page2' => "Toine lehtpol'",
+'compare-rev1' => 'Ezmäine versii',
+'compare-rev2' => 'Toine versii',
+'compare-submit' => 'Rindatada',
+
# Database error messages
'dberr-header' => 'Necil wikil om problemoid',
'dberr-problems' => 'PakiÄem armahtust! Necil saital om tehnižid problemoid.',
@@ -2885,4 +2918,7 @@ Kirjutagat failan nimi «{{ns:file}}:»-pkefiksata.',
'htmlform-reset' => 'Tühjitada toižetused',
'htmlform-selectorother-other' => 'Toine',
+# SQLite database support
+'sqlite-no-fts' => " $1 täuz'tekstaižen ecindan tügedamižeta",
+
);
diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php
index 8d315aa1..23148462 100644
--- a/languages/messages/MessagesVi.php
+++ b/languages/messages/MessagesVi.php
@@ -15,6 +15,7 @@
* @author Neoneurone
* @author Nguyá»…n Thanh Quang
* @author Thaisk
+ * @author Thanhtai2009
* @author Tmct
* @author Trần Nguyễn Minh Huy
* @author Trần Thế Trung
@@ -52,104 +53,105 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Äổi hÆ°á»›ng kép' ),
- 'BrokenRedirects' => array( 'Äổi hÆ°á»›ng sai' ),
- 'Disambiguations' => array( 'Trang định hướng' ),
- 'Userlogin' => array( 'Äăng nhập' ),
- 'Userlogout' => array( 'Äăng xuất' ),
- 'CreateAccount' => array( 'Äăng ký' ),
- 'Preferences' => array( 'Tùy chá»n' ),
- 'Watchlist' => array( 'Danh sách theo dõi' ),
- 'Recentchanges' => array( 'Thay đổi gần đây' ),
- 'Upload' => array( 'Tải lên' ),
- 'Listfiles' => array( 'Danh sách hình', 'Danh sách tập tin' ),
- 'Newimages' => array( 'Tập tin mới', 'Hình mới' ),
- 'Listusers' => array( 'Danh sách thành viên' ),
- 'Listgrouprights' => array( 'Quyá»n nhóm ngÆ°á»i dùng' ),
- 'Statistics' => array( 'Thống kê' ),
- 'Randompage' => array( 'Ngẫu nhiên' ),
- 'Lonelypages' => array( 'Trang mồ côi' ),
- 'Uncategorizedpages' => array( 'Trang chưa phân loại' ),
- 'Uncategorizedcategories' => array( 'Thể loại chưa phân loại' ),
- 'Uncategorizedimages' => array( 'Hình chưa phân loại' ),
- 'Uncategorizedtemplates' => array( 'Bản mẫu chưa phân loại', 'Tiêu bản chưa phân loại' ),
- 'Unusedcategories' => array( 'Thể loại chưa dùng' ),
- 'Unusedimages' => array( 'Hình chưa dùng' ),
- 'Wantedpages' => array( 'Trang cần thiết' ),
- 'Wantedcategories' => array( 'Thể loại cần thiết' ),
- 'Wantedfiles' => array( 'Tập tin cần thiết' ),
- 'Wantedtemplates' => array( 'Bản mẫu cần thiết', 'Tiêu bản cần thiết' ),
- 'Mostlinked' => array( 'Liên kết nhiá»u nhất' ),
- 'Mostlinkedcategories' => array( 'Thể loại liên kết nhiá»u nhất' ),
- 'Mostlinkedtemplates' => array( 'Bản mẫu liên kết nhiá»u nhất', 'Tiêu bản liên kết nhiá»u nhất' ),
- 'Mostimages' => array( 'Tập tin liên kết nhiá»u nhất' ),
- 'Mostcategories' => array( 'Thể loại lớn nhất' ),
- 'Mostrevisions' => array( 'Nhiá»u phiên bản nhất' ),
- 'Fewestrevisions' => array( 'Ãt phiên bản nhất' ),
- 'Shortpages' => array( 'Trang ngắn' ),
- 'Longpages' => array( 'Trang dài' ),
- 'Newpages' => array( 'Trang má»›i' ),
- 'Ancientpages' => array( 'Trang cũ' ),
- 'Deadendpages' => array( 'Trang Ä‘Æ°á»ng cùng' ),
- 'Protectedpages' => array( 'Trang khóa' ),
- 'Protectedtitles' => array( 'Tựa đỠbị khóa' ),
- 'Allpages' => array( 'Má»i bài' ),
- 'Prefixindex' => array( 'Tiá»n tố' ),
- 'Ipblocklist' => array( 'Danh sách cấm' ),
- 'Specialpages' => array( 'Trang đặc biệt' ),
- 'Contributions' => array( 'Äóng góp' ),
- 'Emailuser' => array( 'Gá»­i thÆ°' ),
- 'Confirmemail' => array( 'Xác nhận thư' ),
- 'Whatlinkshere' => array( 'Liên kết đến đây' ),
- 'Recentchangeslinked' => array( 'Thay đổi liên quan' ),
- 'Movepage' => array( 'Di chuyển' ),
- 'Blockme' => array( 'Khóa tôi' ),
- 'Booksources' => array( 'Nguồn sách' ),
- 'Categories' => array( 'Thể loại' ),
+ 'DoubleRedirects' => array( 'Äổi_hÆ°á»›ng_kép' ),
+ 'BrokenRedirects' => array( 'Äổi_hÆ°á»›ng_sai' ),
+ 'Disambiguations' => array( 'Trang_định_hướng' ),
+ 'Userlogin' => array( 'Äăng_nhập' ),
+ 'Userlogout' => array( 'Äăng_xuất' ),
+ 'CreateAccount' => array( 'Äăng_ký' ),
+ 'Preferences' => array( 'Tùy_chá»n' ),
+ 'Watchlist' => array( 'Danh_sách_theo_dõi' ),
+ 'Recentchanges' => array( 'Thay_đổi_gần_đây' ),
+ 'Upload' => array( 'Tải_lên' ),
+ 'Listfiles' => array( 'Danh_sách_hình', 'Danh_sách_tập_tin' ),
+ 'Newimages' => array( 'Tập_tin_mới', 'Hình_mới' ),
+ 'Listusers' => array( 'Danh_sách_thành_viên' ),
+ 'Listgrouprights' => array( 'Quyá»n_nhóm_ngÆ°á»i_dùng' ),
+ 'Statistics' => array( 'Thống_kê' ),
+ 'Randompage' => array( 'Ngẫu_nhiên' ),
+ 'Lonelypages' => array( 'Trang_mồ_côi' ),
+ 'Uncategorizedpages' => array( 'Trang_chưa_phân_loại' ),
+ 'Uncategorizedcategories' => array( 'Thể_loại_chưa_phân_loại' ),
+ 'Uncategorizedimages' => array( 'Hình_chưa_phân_loại' ),
+ 'Uncategorizedtemplates' => array( 'Bản_mẫu_chưa_phân_loại', 'Tiêu_bản_chưa_phân_loại' ),
+ 'Unusedcategories' => array( 'Thể_loại_chưa_dùng' ),
+ 'Unusedimages' => array( 'Hình_chưa_dùng' ),
+ 'Wantedpages' => array( 'Trang_cần_thiết' ),
+ 'Wantedcategories' => array( 'Thể_loại_cần_thiết' ),
+ 'Wantedfiles' => array( 'Tập_tin_cần_thiết' ),
+ 'Wantedtemplates' => array( 'Bản_mẫu_cần_thiết', 'Tiêu_bản_cần_thiết' ),
+ 'Mostlinked' => array( 'Liên_kết_nhiá»u_nhất' ),
+ 'Mostlinkedcategories' => array( 'Thể_loại_liên_kết_nhiá»u_nhất' ),
+ 'Mostlinkedtemplates' => array( 'Bản_mẫu_liên_kết_nhiá»u_nhất', 'Tiêu_bản_liên_kết_nhiá»u_nhất' ),
+ 'Mostimages' => array( 'Tập_tin_liên_kết_nhiá»u_nhất' ),
+ 'Mostcategories' => array( 'Thể_loại_lớn_nhất' ),
+ 'Mostrevisions' => array( 'Nhiá»u_phiên_bản_nhất' ),
+ 'Fewestrevisions' => array( 'Ãt_phiên_bản_nhất' ),
+ 'Shortpages' => array( 'Trang_ngắn' ),
+ 'Longpages' => array( 'Trang_dài' ),
+ 'Newpages' => array( 'Trang_má»›i' ),
+ 'Ancientpages' => array( 'Trang_cũ' ),
+ 'Deadendpages' => array( 'Trang_Ä‘Æ°á»ng_cùng' ),
+ 'Protectedpages' => array( 'Trang_khóa' ),
+ 'Protectedtitles' => array( 'Tá»±a_Ä‘á»_bị_khóa' ),
+ 'Allpages' => array( 'Má»i_bài' ),
+ 'Prefixindex' => array( 'Tiá»n_tố' ),
+ 'Ipblocklist' => array( 'Danh_sách_cấm' ),
+ 'Specialpages' => array( 'Trang_đặc_biệt' ),
+ 'Contributions' => array( 'Äóng_góp' ),
+ 'Emailuser' => array( 'Gá»­i_thÆ°' ),
+ 'Confirmemail' => array( 'Xác_nhận_thư' ),
+ 'Whatlinkshere' => array( 'Liên_kết_đến_đây' ),
+ 'Recentchangeslinked' => array( 'Thay_đổi_liên_quan' ),
+ 'Movepage' => array( 'Di_chuyển' ),
+ 'Blockme' => array( 'Khóa_tôi' ),
+ 'Booksources' => array( 'Nguồn_sách' ),
+ 'Categories' => array( 'Thể_loại' ),
'Export' => array( 'Xuất' ),
- 'Version' => array( 'Phiên bản' ),
- 'Allmessages' => array( 'Má»i thông báo' ),
- 'Log' => array( 'Nhật trình' ),
- 'Blockip' => array( 'Cấm IP' ),
- 'Undelete' => array( 'Phục hồi' ),
+ 'Version' => array( 'Phiên_bản' ),
+ 'Allmessages' => array( 'Má»i_thông_báo' ),
+ 'Log' => array( 'Nhật_trình' ),
+ 'Blockip' => array( 'Cấm_IP' ),
+ 'Undelete' => array( 'Phục_hồi' ),
'Import' => array( 'Nhập' ),
- 'Lockdb' => array( 'Khóa CSDL' ),
- 'Unlockdb' => array( 'Mở khóa CSDL' ),
- 'Userrights' => array( 'Quyá»n thành viên' ),
- 'MIMEsearch' => array( 'Tìm MIME' ),
- 'FileDuplicateSearch' => array( 'Tìm tập tin trùng' ),
- 'Unwatchedpages' => array( 'Trang chưa theo dõi' ),
- 'Listredirects' => array( 'Trang đổi hướng' ),
- 'Revisiondelete' => array( 'Xóa phiên bản' ),
- 'Unusedtemplates' => array( 'Tiêu bản chưa dùng', 'Bản mẫu chưa dùng' ),
- 'Randomredirect' => array( 'Äổi hÆ°á»›ng ngẫu nhiên' ),
- 'Mypage' => array( 'Trang tôi', 'Trang cá nhân' ),
- 'Mytalk' => array( 'Thảo luận tôi', 'Trang thảo luận của tôi' ),
- 'Mycontributions' => array( 'Äóng góp của tôi', 'Tôi đóng góp' ),
- 'Listadmins' => array( 'Danh sách admin' ),
- 'Listbots' => array( 'Danh sách bot' ),
- 'Popularpages' => array( 'Trang phổ biến' ),
- 'Search' => array( 'Tìm kiếm' ),
- 'Resetpass' => array( 'Äổi mật khẩu' ),
- 'Withoutinterwiki' => array( 'Không interwiki' ),
- 'MergeHistory' => array( 'Trộn lịch sử' ),
- 'Filepath' => array( 'ÄÆ°á»ng dẫn file' ),
- 'Invalidateemail' => array( 'Tắt thư' ),
- 'Blankpage' => array( 'Trang trắng' ),
- 'LinkSearch' => array( 'Tìm liên kết' ),
- 'DeletedContributions' => array( 'Äóng góp bị xóa' ),
+ 'Lockdb' => array( 'Khóa_CSDL' ),
+ 'Unlockdb' => array( 'Mở_khóa_CSDL' ),
+ 'Userrights' => array( 'Quyá»n_thành_viên' ),
+ 'MIMEsearch' => array( 'Tìm_MIME' ),
+ 'FileDuplicateSearch' => array( 'Tìm_tập_tin_trùng' ),
+ 'Unwatchedpages' => array( 'Trang_chưa_theo_dõi' ),
+ 'Listredirects' => array( 'Trang_đổi_hướng' ),
+ 'Revisiondelete' => array( 'Xóa_phiên_bản' ),
+ 'Unusedtemplates' => array( 'Tiêu_bản_chưa_dùng', 'Bản_mẫu_chưa_dùng' ),
+ 'Randomredirect' => array( 'Äổi_hÆ°á»›ng_ngẫu_nhiên' ),
+ 'Mypage' => array( 'Trang_tôi', 'Trang_cá_nhân' ),
+ 'Mytalk' => array( 'Thảo_luận_tôi', 'Trang_thảo_luận_của_tôi' ),
+ 'Mycontributions' => array( 'Äóng_góp_của_tôi', 'Tôi_đóng_góp' ),
+ 'Listadmins' => array( 'Danh_sách_admin' ),
+ 'Listbots' => array( 'Danh_sách_bot' ),
+ 'Popularpages' => array( 'Trang_phổ_biến' ),
+ 'Search' => array( 'Tìm_kiếm' ),
+ 'Resetpass' => array( 'Äổi_mật_khẩu' ),
+ 'Withoutinterwiki' => array( 'Không_interwiki' ),
+ 'MergeHistory' => array( 'Trộn_lịch_sử' ),
+ 'Filepath' => array( 'ÄÆ°á»ng_dẫn_file' ),
+ 'Invalidateemail' => array( 'Tắt_thư' ),
+ 'Blankpage' => array( 'Trang_trắng' ),
+ 'LinkSearch' => array( 'Tìm_liên_kết' ),
+ 'DeletedContributions' => array( 'Äóng_góp_bị_xóa' ),
'Tags' => array( 'Thẻ' ),
- 'Activeusers' => array( 'NgÆ°á»i dùng tích cá»±c' ),
+ 'Activeusers' => array( 'NgÆ°á»i_dùng_tích_cá»±c' ),
);
$magicWords = array(
- 'redirect' => array( '0', '#đổi', '#đổi', '#REDIRECT' ),
+ 'redirect' => array( '0', '#đổi', '#REDIRECT' ),
'notoc' => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
'nogallery' => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
'toc' => array( '0', '__MỤCLỤC__', '__TOC__' ),
'noeditsection' => array( '0', '__KHÔNGSỬAMỤC__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'THÃNGNÀY', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth' => array( '1', 'THÃNGNÀY', 'THÃNGNÀY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'THÃNGNÀY1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'TÊNTHÃNGNÀY', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'TÊNDÀITHÃNGNÀY', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', 'TÊNNGẮNTHÃNGNÀY', 'CURRENTMONTHABBREV' ),
@@ -159,7 +161,9 @@ $magicWords = array(
'currentyear' => array( '1', 'NĂMNÀY', 'CURRENTYEAR' ),
'currenttime' => array( '1', 'GIỜNÀY', 'CURRENTTIME' ),
'localmonth' => array( '1', 'THÃNGÄỊAPHƯƠNG', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'THÃNGÄỊAPHƯƠNG1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'TÊNTHÃNGÄỊAPHƯƠNG', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'THÃNGÄỊAPHƯƠNGTẮT', 'LOCALMONTHABBREV' ),
'localday' => array( '1', 'NGÀYÄỊAPHƯƠNG', 'LOCALDAY' ),
'localday2' => array( '1', 'NGÀYÄỊAPHƯƠNG2', 'LOCALDAY2' ),
'localdayname' => array( '1', 'TÊNNGÀYÄỊAPHƯƠNG', 'LOCALDAYNAME' ),
@@ -169,10 +173,19 @@ $magicWords = array(
'numberofarticles' => array( '1', 'Sá»BÀI', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'Sá»TẬPTIN', 'NUMBEROFFILES' ),
'numberofusers' => array( '1', 'Sá»THÀNHVIÊN', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'Sá»THÀNHVIÊNTÃCHCá»°C', 'NUMBEROFACTIVEUSERS' ),
'numberofedits' => array( '1', 'Sá»SỬAÄá»”I', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'Sá»LẦNXEM', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'TÊNTRANG', 'PAGENAME' ),
'pagenamee' => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
'namespace' => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
+ 'subjectspace' => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'fullpagename' => array( '1', 'TÊNTRANGÄỦ', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'TÊNTRANGPHỤ', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'TÊNTRANGGá»C', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'TÊNTRANGTHẢOLUẬN', 'TALKPAGENAME' ),
+ 'subjectpagename' => array( '1', 'TÊNTRANGNỘIDUNG', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'msg' => array( '0', 'NHẮN:', 'MSG:' ),
'subst' => array( '0', 'THẾ:', 'SUBST:' ),
'msgnw' => array( '0', 'NHẮNMỚI:', 'MSGNW:' ),
@@ -185,24 +198,33 @@ $magicWords = array(
'img_framed' => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
'img_page' => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_link' => array( '1', 'liên kết=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'liên_kết=$1', 'link=$1' ),
+ 'int' => array( '0', 'NỘI:', 'INT:' ),
'sitename' => array( '1', 'TÊNMẠNG', 'SITENAME' ),
+ 'ns' => array( '0', 'KGT:', 'NS:' ),
'localurl' => array( '0', 'URLÄỊAPHƯƠNG:', 'LOCALURL:' ),
+ 'articlepath' => array( '0', 'Lá»IBÀI', 'ARTICLEPATH' ),
'server' => array( '0', 'MÃYCHỦ', 'SERVER' ),
'servername' => array( '0', 'TÊNMÃYCHỦ', 'SERVERNAME' ),
'scriptpath' => array( '0', 'ÄƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
'grammar' => array( '0', 'NGá»®PHÃP:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GIá»NG:', 'GENDER:' ),
'notitleconvert' => array( '0', '__KHÔNGCHUYỂNTÊN__', '__NOTITLECONVERT__', '__NOTC__' ),
'nocontentconvert' => array( '0', '__KHÔNGCHUYỂNNỘIDUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
'currentweek' => array( '1', 'TUẦNNÀY', 'CURRENTWEEK' ),
'localweek' => array( '1', 'TUẦNÄỊAPHƯƠNG', 'LOCALWEEK' ),
'revisionid' => array( '1', 'Sá»BẢN', 'REVISIONID' ),
'revisionday' => array( '1', 'NGÀYBẢN', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'NGÀYBẢN2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'THÃNGBẢN', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'THÃNGBẢN1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
'plural' => array( '0', 'Sá»NHIỀU:', 'PLURAL:' ),
'fullurl' => array( '0', 'URLÄỦ:', 'FULLURL:' ),
+ 'newsectionlink' => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
'language' => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
'pagesinnamespace' => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
@@ -256,7 +278,7 @@ $datePreferenceMigrationMap = array(
$linkTrail = "/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÃÖÜÀÈÙ]+)(.*)$/sDu";
-$separatorTransformTable = array(',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$messages = array(
# User preference toggles
@@ -274,8 +296,7 @@ $messages = array(
'tog-editsection' => 'Cho phép sửa đổi đỠmục qua liên kết [sửa]',
'tog-editsectiononrightclick' => 'Cho phép sửa đổi đỠmục bằng cách bấm chuột phải trên tên đỠmục (JavaScript)',
'tog-showtoc' => 'Hiển thị mục lục (cho trang có trên 3 đỠmục)',
-'tog-rememberpassword' => 'Nhớ thông tin đăng nhập của tôi trên máy tính này',
-'tog-editwidth' => 'Mở rộng ô sửa đổi ra toàn màn hình',
+'tog-rememberpassword' => 'Nhớ thông tin đăng nhập của tôi trong trình duyệt này (cho đến $1 ngày)',
'tog-watchcreations' => 'Tự động theo dõi trang tôi viết mới',
'tog-watchdefault' => 'Tự động theo dõi trang tôi sửa',
'tog-watchmoves' => 'Tự động theo dõi trang tôi di chuyển',
@@ -388,7 +409,7 @@ $messages = array(
'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',
'index-category' => 'Trang được ghi chỉ mục',
-'noindex-category' => 'Trang không ghi chỉ mục',
+'noindex-category' => 'Trang không hiển thị trong bộ máy tìm kiếm',
'mainpagetext' => "'''MediaWiki đã được cài đặt thành công.'''",
'mainpagedocfooter' => 'Xin Ä‘á»c [http://meta.wikimedia.org/wiki/Help:Contents HÆ°á»›ng dẫn sá»­ dụng] để biết thêm thông tin vá» cách sá»­ dụng phần má»m wiki.
@@ -422,31 +443,21 @@ $messages = array(
'faqpage' => 'Project:Các câu há»i thÆ°á»ng gặp',
# Vector skin
-'vector-action-addsection' => 'Thêm chủ Ä‘á»',
-'vector-action-delete' => 'Xóa',
-'vector-action-move' => 'Di chuyển',
-'vector-action-protect' => 'Khóa',
-'vector-action-undelete' => 'Phục hồi',
-'vector-action-unprotect' => 'Mở khóa',
-'vector-namespace-category' => 'Thể loại',
-'vector-namespace-help' => 'Trang trợ giúp',
-'vector-namespace-image' => 'Tập tin',
-'vector-namespace-main' => 'Trang',
-'vector-namespace-media' => 'Trang phương tiện',
-'vector-namespace-mediawiki' => 'Thông điệp',
-'vector-namespace-project' => 'Trang dự án',
-'vector-namespace-special' => 'Trang đặc biệt',
-'vector-namespace-talk' => 'Thảo luận',
-'vector-namespace-template' => 'Bản mẫu',
-'vector-namespace-user' => 'Trang cá nhân',
-'vector-view-create' => 'Tạo',
-'vector-view-edit' => 'Sá»­a',
-'vector-view-history' => 'Xem lịch sử',
-'vector-view-view' => 'Xem',
-'vector-view-viewsource' => 'Xem mã nguồn',
-'actions' => 'Tác vụ',
-'namespaces' => 'Không gian tên',
-'variants' => 'Biến thể',
+'vector-action-addsection' => 'Thêm chủ Ä‘á»',
+'vector-action-delete' => 'Xóa',
+'vector-action-move' => 'Di chuyển',
+'vector-action-protect' => 'Khóa',
+'vector-action-undelete' => 'Phục hồi',
+'vector-action-unprotect' => 'Mở khóa',
+'vector-simplesearch-preference' => 'Gợi ý tìm kiếm nâng cao (cần bỠngoài Vectơ)',
+'vector-view-create' => 'Tạo',
+'vector-view-edit' => 'Sá»­a',
+'vector-view-history' => 'Xem lịch sử',
+'vector-view-view' => 'Xem',
+'vector-view-viewsource' => 'Xem mã nguồn',
+'actions' => 'Tác vụ',
+'namespaces' => 'Không gian tên',
+'variants' => 'Biến thể',
'errorpagetitle' => 'Lá»—i',
'returnto' => 'Quay lại $1.',
@@ -507,13 +518,16 @@ Có quá nhiá»u thành viên Ä‘ang cố gắng xem trang này.
Xin hãy đợi một lát rồi thử truy cập lại vào trang.
$1',
+'pool-timeout' => 'Hết thá»i gian chỠđợi khóa',
+'pool-queuefull' => 'Äầy hàng đợi khối ứng dụng (pool queue)',
+'pool-errorunknown' => 'Lỗi lạ',
# 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' => 'Giới thiệu {{SITENAME}}',
'aboutpage' => 'Project:Giới thiệu',
'copyright' => 'Bản quyá»n $1.',
'copyrightpage' => '{{ns:project}}:Bản quyá»n',
-'currentevents' => 'Thá»i sá»±',
+'currentevents' => 'Tin tức',
'currentevents-url' => 'Project:Thá»i sá»±',
'disclaimers' => 'Phủ nhận',
'disclaimerpage' => 'Project:Phủ nhận chung',
@@ -555,12 +569,12 @@ $1',
'viewdeleted' => 'Xem $1?',
'restorelink' => '{{PLURAL:$1|một|$1}} sửa đổi đã xóa',
'feedlinks' => 'Nạp:',
-'feed-invalid' => 'Äịnh dạng feed không hợp lệ.',
-'feed-unavailable' => 'Website không cung cấp bản tin',
-'site-rss-feed' => '$1 mục RSS',
-'site-atom-feed' => '$1 mục Atom',
-'page-rss-feed' => 'Mục RSS của “$1â€',
-'page-atom-feed' => 'Mục Atom của “$1â€',
+'feed-invalid' => 'Äịnh dạng nguồn tin (feed) không hợp lệ.',
+'feed-unavailable' => 'Nguồn tin (feed) không có sẵn tại đây',
+'site-rss-feed' => 'Nguồn tin RSS của $1',
+'site-atom-feed' => 'Nguồn tin Atom của $1',
+'page-rss-feed' => 'Nguồn tin RSS của “$1â€',
+'page-atom-feed' => 'Nguồn tin Atom của “$1â€',
'red-link-title' => '$1 (trang chưa được viết)',
# Short words for each namespace, by default used in the namespace tab in monobook
@@ -668,7 +682,8 @@ Tài khoản của bạn đã mở.
'yourname' => 'Tên ngÆ°á»i dùng:',
'yourpassword' => 'Mật khẩu:',
'yourpasswordagain' => 'Gõ lại mật khẩu',
-'remembermypassword' => 'Nhớ thông tin đăng nhập của tôi trên máy tính này',
+'remembermypassword' => 'Nhớ thông tin đăng nhập của tôi trên máy tính này (cho đến $1 ngày)',
+'securelogin-stick-https' => 'Giữ kết nối với HTTPS sau khi đăng nhập',
'yourdomainname' => 'Tên miá»n của bạn:',
'externaldberror' => 'Có lỗi khi xác nhận cơ sở dữ liệu bên ngoài hoặc bạn không được phép cập nhật tài khoản bên ngoài.',
'login' => 'Äăng nhập',
@@ -685,6 +700,7 @@ Tài khoản của bạn đã mở.
'gotaccount' => "Äã mở tài khoản rồi? '''$1'''.",
'gotaccountlink' => 'Äăng nhập',
'createaccountmail' => 'qua thư điện tử',
+'createaccountreason' => 'Lý do:',
'badretype' => 'Hai mật khẩu không khớp.',
'userexists' => 'Tên ngÆ°á»i dùng này đã có ngÆ°á»i lấy.
Hãy chá»n má»™t tên khác.',
@@ -705,6 +721,7 @@ Hãy kiểm tra lại chính tả, hoặc [[Special:UserLogin/signup|mở tài k
'wrongpasswordempty' => 'Bạn chưa gõ vào mật khẩu. Xin thử lần nữa.',
'passwordtooshort' => 'Mật khẩu phải có ít nhất {{PLURAL:$1|1 ký tự|$1 ký tự}}.',
'password-name-match' => 'Mật khẩu của bạn phải khác vá»›i tên ngÆ°á»i dùng của bạn.',
+'password-login-forbidden' => 'Tên đăng nhập và mật khẩu này đã bị cấm không được sử dụng.',
'mailmypassword' => 'Gửi mật khẩu mới qua thư điện tử',
'passwordremindertitle' => 'Mật khẩu tạm thá»i cho {{SITENAME}}',
'passwordremindertext' => 'Ai đó (có thể là bạn, có địa chỉ IP $1) đã yêu cầu chúng tôi gá»­i mật khẩu má»›i của {{SITENAME}} ($4). Chúng tôi đã tạo má»™t mật khẩu tạm “$3†cho thành viên “$2â€. Nếu bạn chính là ngÆ°á»i đã yêu cầu mật khẩu, bạn cần phải đăng nhập và thay đổi mật khẩu ngay bây giá». Mật khẩu tạm sẽ hết hạn trong vòng {{PLURAL:$5|má»™t ngày|$5 ngày}}.
@@ -736,6 +753,9 @@ Xin hãy đợi chốc lát rồi thử lại.',
'loginlanguagelabel' => 'Ngôn ngữ: $1',
'suspicious-userlogout' => 'Äã bá» qua yêu cầu đăng xuất bạn, hình nhÆ° được gá»­i từ trình duyệt hoặc máy proxy nhá»› đệm hÆ°.',
+# E-mail sending
+'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
+
# Password reset dialog
'resetpass' => 'Äổi mật khẩu',
'resetpass_announce' => 'Bạn đã đăng nhập bằng mật khẩu tạm gởi qua e-mail. Äể hoàn tất việc đăng nhập, bạn phải tạo lại mật khẩu má»›i tại đây:',
@@ -787,9 +807,11 @@ Có thể bạn đã thay đổi thành công mật khẩu của mình hoặc đ
'showlivepreview' => 'Xem thá»­ nhanh',
'showdiff' => 'Xem thay đổi',
'anoneditwarning' => "'''Cảnh báo:''' Bạn chÆ°a đăng nhập. Äịa chỉ IP của bạn sẽ được ghi lại trong lịch sá»­ sá»­a đổi của trang.",
+'anonpreviewwarning' => "''Bạn chưa đăng nhập. Khi lưu trang này, địa chỉ IP của bạn sẽ được ghi vào lịch sử trang.''",
'missingsummary' => "'''Nhắc nhở:''' Bạn đã không ghi lại tóm lược sửa đổi. Nếu bạn nhấn Lưu trang một lần nữa, sửa đổi của bạn sẽ được lưu mà không có tóm lược.",
'missingcommenttext' => 'Xin hãy gõ vào lá»i bàn luận ở dÆ°á»›i.',
-'missingcommentheader' => "'''Nhắc nhở:''' Bạn chưa cung cấp đỠmục cho bàn luận này. Nếu bạn nhấn nút Lưu trang lần nữa, sửa đổi của bạn sẽ được lưu mà không có đỠmục.",
+'missingcommentheader' => "'''Nhắc nhở:''' Bạn chÆ°a ghi chủ Ä‘á»/tiêu Ä‘á» cho bàn luận này.
+Nếu bạn nhấn nút \"{{int:savearticle}}\" lần nữa, sửa đổi của bạn sẽ được lưu mà không có đỠmục.",
'summary-preview' => 'Xem trước dòng tóm lược:',
'subject-preview' => 'Xem trước đỠmục:',
'blockedtitle' => 'Thành viên bị cấm',
@@ -859,6 +881,10 @@ hoặc <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE
'usercsspreview' => "'''Hãy nhớ rằng bạn chỉ đang xem thử trang CSS cá nhân của bạn.
Nó chưa được lưu!'''",
'userjspreview' => "'''Nhớ rằng bạn chỉ đang kiểm thử/xem thử trang JavaScript, nó chưa được lưu!'''",
+'sitecsspreview' => "'''Nhớ rằng bạn chỉ đang xem thử bản CSS này.'''
+'''Nó chưa được lưu!'''",
+'sitejspreview' => "'''Nhớ rằng bạn chỉ đang kiểm thử/xem thử bản JavaScript này.
+'''Nó chưa được lưu!'''",
'userinvalidcssjstitle' => "'''Cảnh báo:''' Không có skin “$1â€. Hãy nhá»› rằng các trang .css và .js tùy chỉnh sá»­ dụng tiêu Ä‘á» chữ thÆ°á»ng, nhÆ° {{ns:user}}:Ví&nbsp;dụ/vector.css chứ không phải {{ns:user}}:Ví&nbsp;dụ/Vector.css.",
'updated' => '(Cập nhật)',
'note' => "'''Ghi chú:'''",
@@ -896,7 +922,6 @@ Bạn phải đảm bảo vá»›i chúng tôi rằng chính bạn là ngÆ°á»i viá
'copyrightwarning2' => "Xin chú ý rằng tất cả các đóng góp của bạn tại {{SITENAME}} có thể được sửa đổi, thay thế, hoặc xóa bỠbởi các thành viên khác. Nếu bạn không muốn trang của bạn bị sửa đổi không thương tiếc, đừng đăng trang ở đây.<br />
Bạn phải đảm bảo vá»›i chúng tôi rằng chính bạn là ngÆ°á»i viết nên, hoặc chép nó từ má»™t nguồn thuá»™c phạm vi công cá»™ng hoặc tá»± do tÆ°Æ¡ng Ä‘Æ°Æ¡ng (xem $1 để biết thêm chi tiết).
'''ÄỪNG ÄÄ‚NG TÃC PHẨM CÓ BẢN QUYỀN MÀ CHƯA XIN PHÉP!'''",
-'longpagewarning' => "'''CẢNH BÃO: Trang này dài $1 kilobyte; má»™t số trình duyệt không tải được trang dài hÆ¡n 32 kb. Bạn nên chia nhá» trang này thành nhiá»u trang.'''",
'longpageerror' => "'''LỖI: Văn bạn mà bạn muốn lưu dài $1 kilobyte, dài hơn độ dài tối đa cho phép $2 kilobyte. Không thể lưu trang.'''",
'readonlywarning' => "'''CẢNH BÃO: CÆ¡ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lÆ°u các sá»­a đổi của mình. Bạn nên cắt-dán Ä‘oạn bạn vừa sá»­a vào má»™t tập tin và lÆ°u nó lại để sá»­a đổi sau này.'''
@@ -1073,6 +1098,8 @@ $1",
'logdelete-failure' => "'''Không thể thiết lập khả năng hiện thị của nhật trình:'''
$1",
'revdel-restore' => 'Thay đổi mức khả kiến',
+'revdel-restore-deleted' => 'các phiên bản xóa',
+'revdel-restore-visible' => 'các phiên bản được hiện',
'pagehist' => 'Lịch sử trang',
'deletedhist' => 'Lịch sử đã xóa',
'revdelete-content' => 'ná»™i dung',
@@ -1140,11 +1167,13 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
# Diffs
'history-title' => 'Lịch sá»­ sá»­a đổi của “$1â€',
'difference' => '(Khác biệt giữa các bản)',
+'difference-multipage' => '(Khác biệt giữa các trang)',
'lineno' => 'Dòng $1:',
'compareselectedversions' => 'So sánh các bản đã chá»n',
'showhideselectedversions' => 'Hiện/ẩn các phiên bản được chá»n',
'editundo' => 'lùi sửa',
-'diff-multi' => '(Không hiển thị {{PLURAL:$1|một|$1}} phiên bản ở giữa)',
+'diff-multi' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản {{PLURAL:$2||của $2 thành viên}} ở giữa)',
+'diff-multi-manyusers' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản của hơn $2 thành viên ở giữa)',
# Search results
'searchresults' => 'Kết quả tìm kiếm',
@@ -1179,6 +1208,7 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
'searchprofile-everything-tooltip' => 'Tìm tất cả nội dung (gồm cả các trang thảo luận)',
'searchprofile-advanced-tooltip' => 'Tìm trong không gian tên tùy chá»n',
'search-result-size' => '$1 ({{PLURAL:$2|1 từ|$2 từ}})',
+'search-result-category-size' => '{{PLURAL:$1|1 trang thành viên|$1 trang thành viên}} ({{PLURAL:$2|1 tiểu thể loại|$2 tiểu thể loại}}, {{PLURAL:$3|1 tập tin|$3 tập tin}})',
'search-result-score' => 'Äá»™ phù hợp: $1%',
'search-redirect' => '(đổi hướng $1)',
'search-section' => '(đỠmục $1)',
@@ -1253,6 +1283,7 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
'contextlines' => 'Số hàng trong trang dùng để tìm ra kết quả:',
'contextchars' => 'Số chữ trong một hàng kết quả:',
'stub-threshold' => 'Äịnh dạng <a href="#" class="stub">liên kết đến sÆ¡ khai</a> cho các trang ngắn hÆ¡n (byte):',
+'stub-threshold-disabled' => 'Tắt',
'recentchangesdays' => 'Số ngày hiển thị trong thay đổi gần đây:',
'recentchangesdays-max' => '(tối đa $1 {{PLURAL:$1|ngày|ngày}})',
'recentchangescount' => 'Số sửa đổi hiển thị mặc định:',
@@ -1286,6 +1317,7 @@ Bất cứ ai biết được khóa trong ô này cÅ©ng có thể Ä‘á»c đượ
'prefs-files' => 'Tập tin',
'prefs-custom-css' => 'sá»­a CSS',
'prefs-custom-js' => 'sá»­a JS',
+'prefs-common-css-js' => 'CSS/JS chung cho má»i hình dạng:',
'prefs-reset-intro' => 'Có thể mặc định lại toàn bá»™ tùy chá»n dùng trang này.
Không có thể lùi lại tác động này.',
'prefs-emailconfirm-label' => 'Xác nhận thư điện tử:',
@@ -1325,9 +1357,15 @@ Bạn cÅ©ng có thể lá»±a chá»n cho phép ngÆ°á»i khác liên lạc vá»›i bá
'prefs-advancedrendering' => 'Tùy chá»n nâng cao',
'prefs-advancedsearchoptions' => 'Tùy chá»n nâng cao',
'prefs-advancedwatchlist' => 'Tùy chá»n nâng cao',
-'prefs-display' => 'Tùy chá»n hiển thị',
+'prefs-displayrc' => 'Tùy chá»n hiển thị',
+'prefs-displaysearchoptions' => 'Tùy chá»n hiển thị',
+'prefs-displaywatchlist' => 'Tùy chá»n hiển thị',
'prefs-diffs' => 'Khác biệt',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Có vẻ hợp lệ',
+'email-address-validity-invalid' => 'Yêu cầu địa chỉ hợp lệ!',
+
# User rights
'userrights' => 'Quản lý quyá»n thành viên',
'userrights-lookup-user' => 'Quản lý nhóm thành viên',
@@ -1411,6 +1449,7 @@ Bạn cÅ©ng có thể lá»±a chá»n cho phép ngÆ°á»i khác liên lạc vá»›i bá
'right-hideuser' => 'Cấm thành viên, rồi ẩn nó đi',
'right-ipblock-exempt' => 'BỠqua cấm IP, tự động cấm và cấm dải IP',
'right-proxyunbannable' => 'BỠqua cấm proxy tự động',
+'right-unblockself' => 'Tự bỠcấm',
'right-protect' => 'Thay đổi mức khóa và sửa trang khóa',
'right-editprotected' => 'Sửa trang khóa (không bị khóa theo tầng)',
'right-editinterface' => 'Sá»­a giao diện ngÆ°á»i dùng',
@@ -1433,7 +1472,6 @@ Bạn cÅ©ng có thể lá»±a chá»n cho phép ngÆ°á»i khác liên lạc vá»›i bá
'right-siteadmin' => 'Khóa và mở khóa cơ sở dữ liệu',
'right-reset-passwords' => 'Tái tạo mật khẩu của thành viên khác',
'right-override-export-depth' => 'Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5',
-'right-versiondetail' => 'Hiện thông tin phiên bản phần má»m mở rá»™ng',
'right-sendemail' => 'Gửi thư điện tử cho thành viên khác',
# User rights log
@@ -1483,15 +1521,10 @@ Bạn cÅ©ng có thể lá»±a chá»n cho phép ngÆ°á»i khác liên lạc vá»›i bá
'recentchanges' => 'Thay đổi gần đây',
'recentchanges-legend' => 'Tùy chá»n thay đổi gần đây',
'recentchangestext' => 'Xem các thay đổi gần đây nhất tại wiki trên trang này.',
-'recentchanges-feed-description' => 'Theo dõi các thay đổi gần đây nhất của wiki dùng feed này.',
-'recentchanges-label-legend' => 'Giải thích: $1.',
-'recentchanges-legend-newpage' => '$1 - trang má»›i',
+'recentchanges-feed-description' => 'Theo dõi các thay đổi gần đây nhất của wiki dùng nguồn tin này.',
'recentchanges-label-newpage' => 'Bản sửa này tạo ra trang mới',
-'recentchanges-legend-minor' => '$1 - sá»­a đổi nhá»',
'recentchanges-label-minor' => 'Äây là má»™t sá»­a đổi nhá»',
-'recentchanges-legend-bot' => '$1 - sửa đổi bot',
'recentchanges-label-bot' => 'Sửa đổi này do bot thực hiện',
-'recentchanges-legend-unpatrolled' => '$1 - sửa đổi chưa tuần tra',
'recentchanges-label-unpatrolled' => 'Sửa đổi này chưa được tuần tra',
'rcnote' => "Dưới đây là {{PLURAL:$1|'''1''' thay đổi|'''$1''' thay đổi gần nhất}} trong {{PLURAL:$2|ngày qua|'''$2''' ngày qua}}, tính tới $5, $4.",
'rcnotefrom' => "Thay đổi từ '''$2''' (hiển thị tối đa '''$1''' thay đổi).",
@@ -1538,6 +1571,9 @@ Các trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tÃ
'upload_directory_missing' => 'Thư mục tải lên ($1) không có hoặc máy chủ web không thể tạo được.',
'upload_directory_read_only' => 'Máy chủ không thể sửa đổi thư mục tải lên ($1) được.',
'uploaderror' => 'Lỗi khi tải lên',
+'upload-recreate-warning' => "'''Cảnh báo: Một tập tin với tên này đã từng bị xóa hoặc di chuyển.'''
+
+Nhật trình xóa và di chuyển của trang này được ghi ở dưới để bạn tiện theo dõi:",
'uploadtext' => "Hãy sử dụng mẫu sau để tải tập tin lên.
Äể xem hoặc tìm kiếm những hình ảnh đã được tải lên trÆ°á»›c đây, xin má»i xem [[Special:FileList|danh sách các tập tin đã tải lên]].
việc tải lên và tải lên lại được ghi lại trong [[Special:Log/upload|nhật trình tải lên]], việc xóa đi được ghi trong [[Special:Log/delete|nhật trình xóa]].
@@ -1566,13 +1602,24 @@ Xem [[Special:NewFiles|trang trưng bày các tập tin mới]] để xem trực
'illegalfilename' => 'Tên tập tin “$1†có chứa ký tự không được phép dùng cho tựa trang. Xin hãy đổi tên và tải lên lại.',
'badfilename' => 'Tên tập tin đã được đổi thành “$1â€.',
'filetype-mime-mismatch' => 'Phần mở rộng của tập tin không phù hợp kiểu MIME.',
-'filetype-badmime' => 'Không thể tải lên các tập tin có định dạng MIME “$1â€.',
+'filetype-badmime' => 'Không thể tải lên các tập tin có kiểu MIME “$1â€.',
'filetype-bad-ie-mime' => 'Không thể tải tập tin này lên vì Internet Explorer sẽ nhận diện tập tin này là “$1â€, má»™t định dạng tập tin tiá»m ẩn nguy hiểm và không được cho phép.',
'filetype-unwanted-type' => "'''“.$1â€''' là định dạng tập tin không được trông đợi.
{{PLURAL:$3|Loại|Những loại}} tập tin thích hợp hơn là $2.",
'filetype-banned-type' => "'''“.$1â€''' là định dạng tập tin không được chấp nhận.
{{PLURAL:$3|Loại tập tin|Những loại tập tin}} được chấp nhận là $2.",
'filetype-missing' => 'Tập tin không có phần mở rá»™ng (ví dụ “.jpgâ€).',
+'empty-file' => 'Bạn đã gửi tập tin rỗng.',
+'file-too-large' => 'Bạn đã gửi tập tin lớn quá hạn.',
+'filename-tooshort' => 'Tên tập tin ngắn quá.',
+'filetype-banned' => 'Kiểu tập tin này đã bị cấm.',
+'verification-error' => 'Tập tin này không qua được bước thẩm tra.',
+'hookaborted' => 'Sá»­a đổi của bạn bị hook phần mở rá»™ng hủy bá».',
+'illegal-filename' => 'Không được đặt tên tập tin này.',
+'overwrite' => 'Không được ghi đè một tập tin đã tồn tại.',
+'unknown-error' => 'Gặp lá»—i không ngá».',
+'tmp-create-error' => 'Không thể tạo tập tin tạm thá»i.',
+'tmp-write-error' => 'Gặp lá»—i khi ghi vào tập tin tạm thá»i.',
'large-file' => 'Các tập tin được khuyến cáo không được lớn hơn $1; tập tin này lớn đến $2.',
'largefileserver' => 'Tập tin này quá lớn so với khả năng phục vụ của máy chủ.',
'emptyfile' => 'Tập tin bạn vừa má»›i tải lên có vẻ trống không. Äiá»u này có thể xảy ra khi bạn đánh sai tên tập tin. Xin hãy chắc chắn rằng bạn thật sá»± muốn tải lên tập tin này.',
@@ -1598,13 +1645,14 @@ Nếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại v
Nếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại và dùng một tên khác. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Tập tin này có vẻ là bản sao của {{PLURAL:$1|tập tin|các tập tin}} sau:',
'file-deleted-duplicate' => 'Một tập tin giống hệt như tập tin này ([[:$1]]) đã từng bị xóa trước đây. Bạn nên xem lại lịch sử xóa tập tin trước khi tiếp tục tải nó lên lại.',
-'successfulupload' => 'Äã tải xong',
'uploadwarning' => 'Cảnh báo!',
'uploadwarning-text' => 'Xin hãy chỉnh sửa miêu tả tập tin ở dưới và thử lại.',
'savefile' => 'Lưu tập tin',
'uploadedimage' => 'đã tải “[[$1]]†lên',
'overwroteimage' => 'đã tải lên má»™t phiên bản má»›i của “[[$1]]â€',
'uploaddisabled' => 'Chức năng tải lên đã bị khóa.',
+'copyuploaddisabled' => 'Chức năng tải lên từ địa chỉ URL đã bị tắt.',
+'uploadfromurl-queued' => 'Tập tin của bạn đã được xếp vào hàng đợi tải lên.',
'uploaddisabledtext' => 'Chức năng tải tập tin đã bị tắt.',
'php-uploaddisabledtext' => 'Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.',
'uploadscripted' => 'Tập tin này có chứa mã HTML hoặc script có thể khiến trình duyệt web thông dịch sai.',
@@ -1636,6 +1684,14 @@ JD # Jenoptik
MGP # Pentax
PICT # khác
#</pre> <!-- xin để nguyên hàng này -->',
+'upload-success-subj' => 'Äã tải xong',
+'upload-success-msg' => 'Bạn đã tải lên tập tin thành công từ [$2]. Nó có sẵn tại [[:{{ns:file}}:$1]].',
+'upload-failure-subj' => 'Vấn đỠtải lên',
+'upload-failure-msg' => 'Tập tin bạn tải lên từ [$2] có má»™t vấn Ä‘á»:
+
+$1',
+'upload-warning-subj' => 'Cảnh báo tải lên',
+'upload-warning-msg' => 'Tập tin tải lên từ [$2] đã gặp vấn Ä‘á». Xin hãy trở vá» [[Special:Upload/stash/$1|biểu mẫu tải lên]] để giải quyết vấn Ä‘á» này.',
'upload-proto-error' => 'Giao thức sai',
'upload-proto-error-text' => 'Phải đưa vào URL bắt đầu với <code>http://</code> hay <code>ftp://</code> để tải lên tập tin từ trang web khác.',
@@ -1699,6 +1755,7 @@ Hãy nhấn chuá»™t vào tiêu Ä‘á» cá»™t để thay đổi thứ tá»± sắp xá
'listfiles_search_for' => 'Tìm kiếm theo tên tập tin:',
'imgfile' => 'tập tin',
'listfiles' => 'Danh sách tập tin',
+'listfiles_thumb' => 'Hình nhá»',
'listfiles_date' => 'Ngày tải',
'listfiles_name' => 'Tên',
'listfiles_user' => 'Thành viên tải',
@@ -1742,6 +1799,7 @@ Lá»i miêu tả tại [$2 trang mô tả tập tin] tại đấy được hiể
'uploadnewversion-linktext' => 'Tải lên phiên bản mới',
'shared-repo-from' => 'tại $1',
'shared-repo' => 'kho lưu trữ dùng chung',
+'filepage.css' => '/* Mã CSS tại đây sẽ ảnh hướng đến trang miêu tả tập tin, cũng như các wiki khách bên ngoài dựa trên wiki này */',
# File reversion
'filerevert' => 'Lùi lại phiên bản của $1',
@@ -1774,8 +1832,8 @@ Lá»i miêu tả tại [$2 trang mô tả tập tin] tại đấy được hiể
# MIME search
'mimesearch' => 'Tìm kiếm theo định dạng',
-'mimesearch-summary' => 'Trang này có khả năng lá»c tập tin theo định dạng MIME. Äầu vào: contenttype/subtype, v.d. <tt>image/jpeg</tt>.',
-'mimetype' => 'Äịnh dạng MIME:',
+'mimesearch-summary' => 'Trang này có khả năng lá»c tập tin theo kiểu MIME. Äầu vào: kiểu-ná»™i-dung/kiểu-phụ, v.d. <tt>image/jpeg</tt>.',
+'mimetype' => 'Kiểu MIME:',
'download' => 'tải vá»',
# Unwatched pages
@@ -1813,8 +1871,8 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
'statistics-edits' => 'Số sửa đổi trang từ khi {{SITENAME}} được thành lập',
'statistics-edits-average' => 'Số sửa đổi trung bình trên một trang',
'statistics-views-total' => 'Số lần xem tổng cộng',
+'statistics-views-total-desc' => 'Không bao gồm số lần xem các trang không tồn tại và các trang đặc biệt',
'statistics-views-peredit' => 'Số lần xem trên một sửa đổi',
-'statistics-jobqueue' => 'Chiá»u dài [http://www.mediawiki.org/wiki/Manual:Job_queue hàng đợi việc]',
'statistics-users' => 'Số [[Special:ListUsers|thành viên]] đã đăng ký',
'statistics-users-active' => 'Số thành viên tích cực',
'statistics-users-active-desc' => 'Những thành viên đã hoạt động trong {{PLURAL:$1|ngày|$1 ngày}} qua',
@@ -1827,7 +1885,7 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
'doubleredirects' => 'Äổi hÆ°á»›ng kép',
'doubleredirectstext' => 'Trang này liệt kê các trang đổi hướng đến một trang đổi hướng khác.
Má»—i hàng có chứa các liên kết đến trang đổi hÆ°á»›ng thứ nhất và thứ hai, cÅ©ng nhÆ° mục tiêu của trang đổi hÆ°á»›ng thứ hai, thÆ°á»ng là trang đích “thá»±c sá»±â€, là nÆ¡i mà trang đổi hÆ°á»›ng đầu tiên nên trỠđến.
-Các mục <s>bị gạch bá»</s> là các trang đã được sá»­a.',
+Các mục <del>bị gạch bá»</del> là các trang đã được sá»­a.',
'double-redirect-fixed-move' => '[[$1]] đã được đổi tên, giỠnó là trang đổi hướng đến [[$2]]',
'double-redirect-fixer' => 'NgÆ°á»i sá»­a trang đổi hÆ°á»›ng',
@@ -1850,6 +1908,8 @@ Các mục <s>bị gạch bá»</s> là các trang đã được sá»­a.',
'nmembers' => '$1 {{PLURAL:$1|trang|trang}}',
'nrevisions' => '$1 {{PLURAL:$1|phiên bản|phiên bản}}',
'nviews' => '$1 {{PLURAL:$1|lượt truy cập|lượt truy cập}}',
+'nimagelinks' => 'Äược sá»­ dụng trong $1 trang',
+'ntransclusions' => 'được sử dụng trong $1 trang',
'specialpage-empty' => 'Trang này đang trống.',
'lonelypages' => 'Trang mồ côi',
'lonelypagestext' => 'Chưa có trang nào liên kết đến hoặc nhúng vào các trang này tại {{SITENAME}}.',
@@ -1923,7 +1983,7 @@ Bạn có thể thu hẹp kết quả bằng cách chá»n loại nhật trình,
'log-title-wildcard' => 'Tìm các tựa trang bắt đầu bằng các chữ này',
# Special:AllPages
-'allpages' => 'Tất cả các trang',
+'allpages' => 'Má»i trang',
'alphaindexline' => '$1 đến $2',
'nextpage' => 'Trang sau ($1)',
'prevpage' => 'Trang trÆ°á»›c ($1)',
@@ -2005,34 +2065,40 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] vỠtừng nhó
'listgrouprights-removegroup-self-all' => 'Có thể loại tài khoản của chính mình ra khá»i tất cả các nhóm',
# E-mail user
-'mailnologin' => 'Không có địa chỉ gửi thư',
-'mailnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] và khai báo má»™t địa chỉ thÆ° Ä‘iện tá»­ hợp lệ trong phần [[Special:Preferences|tùy chá»n cá nhân]] thì má»›i gá»­i được thÆ° cho ngÆ°á»i khác.',
-'emailuser' => 'Gá»­i thÆ° cho ngÆ°á»i này',
-'emailpage' => 'Gá»­i thÆ°',
-'emailpagetext' => 'Mẫu dÆ°á»›i đây sẽ gá»­i má»™t bức thÆ° Ä‘iện tá»­ tá»›i ngÆ°á»i dùng này.
+'mailnologin' => 'Không có địa chỉ gửi thư',
+'mailnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] và khai báo má»™t địa chỉ thÆ° Ä‘iện tá»­ hợp lệ trong phần [[Special:Preferences|tùy chá»n cá nhân]] thì má»›i gá»­i được thÆ° cho ngÆ°á»i khác.',
+'emailuser' => 'Gá»­i thÆ° cho ngÆ°á»i này',
+'emailpage' => 'Gá»­i thÆ°',
+'emailpagetext' => 'Mẫu dÆ°á»›i đây sẽ gá»­i má»™t bức thÆ° Ä‘iện tá»­ tá»›i ngÆ°á»i dùng này.
Äịa chỉ thÆ° Ä‘iện tá»­ mà bạn đã cung cấp trong [[Special:Preferences|tùy chá»n cá nhân của mình]] sẽ xuất hiện trong phần địa chỉ “NgÆ°á»i gá»­i†của bức thÆ°, do đó ngÆ°á»i nhận sẽ có thể trả lá»i trá»±c tiếp cho bạn.',
-'usermailererror' => 'Lá»—i gá»­i thÆ°:',
-'defemailsubject' => 'thư gửi từ {{SITENAME}}',
-'noemailtitle' => 'Không có địa chỉ nhận thư',
-'noemailtext' => 'NgÆ°á»i này không cung cấp má»™t địa chỉ thÆ° hợp lệ.',
-'nowikiemailtitle' => 'Không cho phép thư điện tử',
-'nowikiemailtext' => 'Thành viên này quyết định không nhận thư từ các thành viên khác.',
-'email-legend' => 'Gửi thư điện tử đến thành viên {{SITENAME}} khác',
-'emailfrom' => 'NgÆ°á»i gá»­i:',
-'emailto' => 'NgÆ°á»i nhận:',
-'emailsubject' => 'Chủ Ä‘á»:',
-'emailmessage' => 'Ná»™i dung:',
-'emailsend' => 'Gá»­i',
-'emailccme' => 'Gửi cho tôi bản sao của thư này.',
-'emailccsubject' => 'Bản sao của thư gửi cho $1: $2',
-'emailsent' => 'Äã gá»­i',
-'emailsenttext' => 'Thư của bạn đã được gửi.',
-'emailuserfooter' => 'ThÆ° Ä‘iện tá»­ này được $1 gá»­i đến $2 thông qua chức năng “Gá»­i thÆ° cho ngÆ°á»i này†của {{SITENAME}}.',
+'usermailererror' => 'Lá»—i gá»­i thÆ°:',
+'defemailsubject' => 'thư gửi từ {{SITENAME}}',
+'usermaildisabled' => 'Chức năng gá»­i thÆ° cho ngÆ°á»i dùng đã bị tắt.',
+'usermaildisabledtext' => 'Bạn không thể gá»­i thÆ° Ä‘iện tá»­ cho những ngÆ°á»i dùng khác trên wiki này.',
+'noemailtitle' => 'Không có địa chỉ nhận thư',
+'noemailtext' => 'NgÆ°á»i này không cung cấp má»™t địa chỉ thÆ° hợp lệ.',
+'nowikiemailtitle' => 'Không cho phép thư điện tử',
+'nowikiemailtext' => 'Thành viên này quyết định không nhận thư từ các thành viên khác.',
+'email-legend' => 'Gửi thư điện tử đến thành viên {{SITENAME}} khác',
+'emailfrom' => 'NgÆ°á»i gá»­i:',
+'emailto' => 'NgÆ°á»i nhận:',
+'emailsubject' => 'Chủ Ä‘á»:',
+'emailmessage' => 'Ná»™i dung:',
+'emailsend' => 'Gá»­i',
+'emailccme' => 'Gửi cho tôi bản sao của thư này.',
+'emailccsubject' => 'Bản sao của thư gửi cho $1: $2',
+'emailsent' => 'Äã gá»­i',
+'emailsenttext' => 'Thư của bạn đã được gửi.',
+'emailuserfooter' => 'ThÆ° Ä‘iện tá»­ này được $1 gá»­i đến $2 thông qua chức năng “Gá»­i thÆ° cho ngÆ°á»i này†của {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Äang để lại thông báo hệ thống.',
+'usermessage-editor' => 'Trình thông báo hệ thống',
# Watchlist
'watchlist' => 'Trang tôi theo dõi',
'mywatchlist' => 'Trang tôi theo dõi',
-'watchlistfor' => "(của '''$1''')",
+'watchlistfor2' => 'Của $1 $2',
'nowatchlist' => 'Danh sách theo dõi của bạn không có gì.',
'watchlistanontext' => 'Xin hãy $1 để xem hay sửa đổi các trang được theo dõi.',
'watchnologin' => 'Chưa đăng nhập',
@@ -2094,10 +2160,13 @@ Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả cá
Hệ thống báo tin {{SITENAME}} thân thiện của bạn
--
-Äể thay đổi các thiết lập danh sách theo dõi, má»i xem
+Äể thay đổi các thiết lập thÆ° Ä‘iện tá»­ thông báo, má»i xem:
+{{fullurl:{{#special:Preferences}}}}
+
+Äể thay đổi các thiết lập danh sách theo dõi, má»i xem:
{{fullurl:{{#special:Watchlist}}/edit}}
-Äể xóa trang ra khá»i danh sách theo dõi của bạn, má»i xem
+Äể xóa trang ra khá»i danh sách theo dõi của bạn, má»i xem:
$UNWATCHURL
Phản hồi và cần sự hỗ trợ:
@@ -2153,7 +2222,10 @@ Sửa đổi cuối cùng tại trang do [[User:$3|$3]] ([[User talk:$3|thảo l
'revertpage-nouser' => 'Lùi sá»­a đổi của (tên ngÆ°á»i dùng đã xóa) quay lại phiên bản cuối của [[User:$1|$1]]',
'rollback-success' => 'Äã hủy sá»­a đổi của $1;
quay vỠphiên bản cuối của $2.',
-'sessionfailure' => 'DÆ°á»ng nhÆ° có trục trặc vá»›i phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cÆ°á»›p quyá»n đăng nhập. Xin hãy nhấn nút “Backâ€, tải lại trang đó, rồi thá»­ lại.',
+
+# Edit tokens
+'sessionfailure-title' => 'Phiên thất bại',
+'sessionfailure' => 'DÆ°á»ng nhÆ° có trục trặc vá»›i phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cÆ°á»›p quyá»n đăng nhập. Xin hãy nhấn nút “Backâ€, tải lại trang đó, rồi thá»­ lại.',
# Protect
'protectlogpage' => 'Nhật trình khóa',
@@ -2283,18 +2355,21 @@ $1',
'month' => 'Từ tháng (trở vỠtrước):',
'year' => 'Từ năm (trở vỠtrước):',
-'sp-contributions-newbies' => 'Chỉ hiển thị đóng góp của tài khoản mới',
-'sp-contributions-newbies-sub' => 'Các thành viên mới',
-'sp-contributions-newbies-title' => 'Äóng góp của các thành viên má»›i',
-'sp-contributions-blocklog' => 'Nhật trình cấm',
-'sp-contributions-deleted' => 'đóng góp đã bị xóa của thành viên',
-'sp-contributions-logs' => 'nhật trình',
-'sp-contributions-talk' => 'thảo luận',
-'sp-contributions-userrights' => 'quản lý quyá»n thành viên',
-'sp-contributions-blocked-notice' => 'Thành viên này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:',
-'sp-contributions-search' => 'Tìm kiếm đóng góp',
-'sp-contributions-username' => 'Äịa chỉ IP hay tên thành viên:',
-'sp-contributions-submit' => 'Tìm kiếm',
+'sp-contributions-newbies' => 'Chỉ hiển thị đóng góp của tài khoản mới',
+'sp-contributions-newbies-sub' => 'Các thành viên mới',
+'sp-contributions-newbies-title' => 'Äóng góp của các thành viên má»›i',
+'sp-contributions-blocklog' => 'Nhật trình cấm',
+'sp-contributions-deleted' => 'đóng góp đã bị xóa của thành viên',
+'sp-contributions-uploads' => 'tập tin tải lên',
+'sp-contributions-logs' => 'nhật trình',
+'sp-contributions-talk' => 'thảo luận',
+'sp-contributions-userrights' => 'quản lý quyá»n thành viên',
+'sp-contributions-blocked-notice' => 'Thành viên này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:',
+'sp-contributions-blocked-notice-anon' => 'Äịa chỉ IP này Ä‘ang bị cấm. Hãy tham khảo mục má»›i nhất trong nhật trình cấm IP này:',
+'sp-contributions-search' => 'Tìm kiếm đóng góp',
+'sp-contributions-username' => 'Äịa chỉ IP hay tên thành viên:',
+'sp-contributions-toponly' => 'Chỉ hiện các phiên bản gần đây',
+'sp-contributions-submit' => 'Tìm kiếm',
# What links here
'whatlinkshere' => 'Các liên kết đến đây',
@@ -2359,7 +2434,6 @@ $1',
'ipb-edit-dropdown' => 'Sửa đổi lý do cấm',
'ipb-unblock-addr' => 'BỠcấm $1',
'ipb-unblock' => 'BỠcấm thành viên hay địa chỉ IP',
-'ipb-blocklist-addr' => 'Tình trạng cấm hiện tại của $1',
'ipb-blocklist' => 'Xem danh sách đang bị cấm',
'ipb-blocklist-contribs' => 'Äóng góp của $1',
'unblockip' => 'BỠcấm thành viên',
@@ -2426,6 +2500,8 @@ $1 đã bị cấm. Bạn có muốn thay đổi các thiết lập?',
'sorbs_create_account_reason' => 'Äịa chỉ chỉ IP của bạn bị liệt kê là má»™t proxy mở trong DNSBL mà {{SITENAME}} Ä‘ang sá»­ dụng. Bạn không thể mở tài khoản.',
'cant-block-while-blocked' => 'Bạn không thể cấm thành viên khác trong khi bạn đang bị cấm.',
'cant-see-hidden-user' => 'Thành viên bạn muốn cấm đã bị cấm trÆ°á»›c đây hoặc đã bị ẩn Ä‘i. Vì bạn không có quyá»n hideuser, bạn không thể xem hoặc thay đổi mức cấm của thành viên.',
+'ipbblocked' => 'Bạn không thể cấm hay bá» cấm ngÆ°á»i dùng khác vì chính bạn Ä‘ang bị cấm.',
+'ipbnounblockself' => 'Bạn không được bỠcấm chính mình.',
# Developer tools
'lockdb' => 'Khóa cơ sở dữ liệu',
@@ -2463,6 +2539,17 @@ Chú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một tra
'''CẢNH BÃO!'''
Việc làm này có thể dẫn đến sá»± thay đổi mạnh mẽ và không lÆ°á»ng trÆ°á»›c đối vá»›i các trang dá»… nhìn thấy;
xin hãy chắc chắn rằng bạn đã nhận thức được những hệ lụy của nó trước khi thực hiện.",
+'movepagetext-noredirectfixer' => "Dùng mẫu dưới đây để đổi tên một trang, di chuyển tất cả lịch sử của nó sang tên mới.
+Tên cũ sẽ trở thành trang đổi hướng sang tên mới.
+Hãy nhớ kiểm tra [[Special:DoubleRedirects|đổi hướng kép]] hoặc [[Special:BrokenRedirects|đổi hướng đến trang không tồn tại]].
+Bạn phải chịu trách nhiệm đảm bảo các liên kết đó tiếp tục trỠđến nơi chúng cần đến.
+
+Chú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi nó rỗng hoặc là trang đổi hướng và không có lịch sử sửa đổi trước đây.
+Äiá»u này có nghÄ©a là bạn có thể đổi tên trang lại nhÆ° cÅ© nếu bạn có nhầm lẫn, và bạn không thể ghi đè lên má»™t trang đã có sẵn.
+
+'''CẢNH BÃO!'''
+Việc làm này có thể dẫn đến sá»± thay đổi mạnh mẽ và không lÆ°á»ng trÆ°á»›c đối vá»›i các trang dá»… nhìn thấy;
+xin hãy chắc chắn rằng bạn đã nhận thức được những hệ lụy của nó trước khi thực hiện.",
'movepagetalktext' => "Trang thảo luận đi kèm sẽ được tự động di chuyển theo '''trừ khi''':
*Äã tồn tại má»™t trang thảo luận không trống tại tên má»›i, hoặc
*Bạn không đánh vào ô bên dưới.
@@ -2481,7 +2568,7 @@ Trong những trÆ°á»ng hợp đó, bạn phải di chuyển hoặc hợp nhất
'movepagebtn' => 'Di chuyển trang',
'pagemovedsub' => 'Di chuyển thành công',
'movepage-moved' => "'''“$1†đã được di chuyển đến “$2â€'''",
-'movepage-moved-redirect' => 'Äã tạo trang chuyển hÆ°á»›ng.',
+'movepage-moved-redirect' => 'Äã tạo trang đổi hÆ°á»›ng.',
'movepage-moved-noredirect' => 'Chức năng tạo trang chuyển hướng đã bị tắt.',
'articleexists' => 'Äã có má»™t trang vá»›i tên đó, hoặc tên bạn chá»n không hợp lệ.
Xin hãy chá»n tên khác.',
@@ -2497,7 +2584,7 @@ Xin hãy chá»n tên khác.',
'movepage-max-pages' => 'Äã có tối Ä‘a $1 {{PLURAL:$1|trang|trang}} đã di chuyển và không tá»± Ä‘á»™ng di chuyển thêm được nữa.',
'1movedto2' => '[[$1]] đổi thành [[$2]]',
'1movedto2_redir' => '[[$1]] đổi thành [[$2]] qua đổi hướng',
-'move-redirect-suppressed' => 'đã tắt chuyển hướng',
+'move-redirect-suppressed' => 'đã tắt đổi hướng',
'movelogpage' => 'Nhật trình di chuyển',
'movelogpagetext' => 'Dưới đây là danh sách các trang đã được di chuyển.',
'movesubpage' => '{{PLURAL:$1|Trang con|Các trang con}}',
@@ -2518,6 +2605,7 @@ Trang với tên “[[:$1]]†đã tồn tại. Bạn có muốn xóa nó để
'immobile-source-page' => 'Bạn không thể di chuyển trang này.',
'immobile-target-page' => 'Không thể di chuyển đến tựa đỠđích.',
'imagenocrossnamespace' => 'Không thể di chuyển tập tin ra khá»i không gian tên Tập tin',
+'nonfile-cannot-move-to-file' => 'Không thể di chuyển những gì không phải là tập tin vào không gian tên Tập tin',
'imagetypemismatch' => 'Phần mở rộng trong tên tập tin mới không hợp dạng của tập tin',
'imageinvalidfilename' => 'Tên tập tin đích không hợp lệ',
'fix-double-redirects' => 'Cập nhật tất cả các trang đổi hướng chỉ đến tựa đỠcũ',
@@ -2546,7 +2634,7 @@ Trong trÆ°á»ng hợp sau bạn cÅ©ng có thể dùng má»™t liên kết, ví dá»
'export-addcattext' => 'Thêm trang từ thể loại:',
'export-addcat' => 'Thêm',
'export-addnstext' => 'Thêm trang từ không gian tên:',
-'export-addns' => 'Thêm vào',
+'export-addns' => 'Thêm',
'export-download' => 'Lưu xuống tập tin',
'export-templates' => 'Gồm cả bản mẫu',
'export-pagelinks' => 'Gồm cả các trang liên kết sâu đến:',
@@ -2598,6 +2686,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'importstart' => 'Äang nhập các trang…',
'import-revision-count' => '$1 {{PLURAL:$1|phiên bản|phiên bản}}',
'importnopages' => 'Không có trang để nhập vào.',
+'imported-log-entries' => 'Äã nhập {{PLURAL:$1|mục nhật trình|$1 mục nhật trình}}.',
'importfailed' => 'Không nhập được: $1',
'importunknownsource' => 'Không hiểu nguồn trang để nhập vào',
'importcantopen' => 'Không có thể mở tập tin để nhập vào',
@@ -2627,7 +2716,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|phiên bản|phiên bản}} từ $2',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Trang thành viên của tôi',
+'tooltip-pt-userpage' => 'Trang cá nhân của tôi',
'tooltip-pt-anonuserpage' => 'Trang của IP bạn đang dùng',
'tooltip-pt-mytalk' => 'Thảo luận với tôi',
'tooltip-pt-anontalk' => 'Thảo luận với địa chỉ IP này',
@@ -2656,14 +2745,14 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'tooltip-n-mainpage' => 'Äi đến Trang Chính',
'tooltip-n-mainpage-description' => 'Xem trang chính',
'tooltip-n-portal' => 'Giới thiệu dự án, cách sử dụng và tìm kiếm thông tin ở đây',
-'tooltip-n-currentevents' => 'Các trang có liên quan đến thá»i sá»±',
+'tooltip-n-currentevents' => 'Các trang có liên quan đến tin tức',
'tooltip-n-recentchanges' => 'Danh sách các thay đổi gần đây',
'tooltip-n-randompage' => 'Xem trang ngẫu nhiên',
'tooltip-n-help' => 'Nơi tìm hiểu thêm cách dùng.',
'tooltip-t-whatlinkshere' => 'Các trang liên kết đến đây',
'tooltip-t-recentchangeslinked' => 'Thay đổi gần đây của các trang liên kết đến đây',
-'tooltip-feed-rss' => 'Nạp RSS cho trang này',
-'tooltip-feed-atom' => 'Nạp Atom cho trang này',
+'tooltip-feed-rss' => 'Nguồn tin RSS của trang này',
+'tooltip-feed-atom' => 'Nguồn tin Atom của trang này',
'tooltip-t-contributions' => 'Xem đóng góp của ngÆ°á»i này',
'tooltip-t-emailuser' => 'Gá»­i thÆ° cho ngÆ°á»i này',
'tooltip-t-upload' => 'Tải hình ảnh hoặc tập tin lên',
@@ -2690,6 +2779,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'tooltip-upload' => 'Bắt đầu tải lên',
'tooltip-rollback' => '"Lùi tất cả" sẽ lùi má»i sá»­a đổi của ngÆ°á»i sá»­a đổi cuối cùng chỉ bằng má»™t cú nhấp chuá»™t.',
'tooltip-undo' => '"Lùi lại" sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem thử. Cho phép thêm lý do vào tóm lược.',
+'tooltip-preferences-save' => 'LÆ°u tùy chá»n',
+'tooltip-summary' => 'Hãy nhập câu tóm lược',
# Stylesheets
'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho má»i hình dạng */',
@@ -2819,14 +2910,17 @@ Nếu thá»±c thi nó máy tính của bạn có thể bị tiếm quyá»n.",
'imagemaxsize' => "Giới hạn cỡ hình:<br />''(trên trang miêu tả tập tin)''",
'thumbsize' => 'Cỡ hình thu nhá»:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|trang|trang}}',
-'file-info' => '(kích thước tập tin: $1, định dạng MIME: $2)',
-'file-info-size' => '($1×$2 điểm ảnh, kích thước: $3, định dạng MIME: $4)',
+'file-info' => 'kích thước tập tin: $1, kiểu MIME: $2',
+'file-info-size' => '$1 × $2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4',
'file-nohires' => '<small>Không có độ phân giải cao hơn.</small>',
-'svg-long-desc' => '(tập tin SVG, $1 × $2 điểm ảnh trên danh nghĩa, kích thước: $3)',
+'svg-long-desc' => 'tập tin SVG, $1 × $2 điểm ảnh trên danh nghĩa, kích thước: $3',
'show-big-image' => 'Äá»™ phân giải tối Ä‘a',
'show-big-image-thumb' => '<small>Kích thước xem thử: $1 × $2 điểm ảnh</small>',
'file-info-gif-looped' => 'có lặp',
'file-info-gif-frames' => '$1 {{PLURAL:$1|khung ảnh|khung ảnh}}',
+'file-info-png-looped' => 'có lặp',
+'file-info-png-repeat' => 'chơi $1 lần',
+'file-info-png-frames' => '$1 khung ảnh',
# Special:NewFiles
'newimages' => 'Trang trưng bày hình ảnh mới',
@@ -3021,6 +3115,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
'exif-gpsareainformation' => 'Tên khu vực theo GPS',
'exif-gpsdatestamp' => 'Ngày theo GPS',
'exif-gpsdifferential' => 'Sá»­a vi sai GPS',
+'exif-objectname' => 'Tên ngắn',
# EXIF attributes
'exif-compression-1' => 'Không nén',
@@ -3183,30 +3278,30 @@ Những thông tin khác mặc định sẽ được ẩn đi.
'limitall' => 'tất cả',
# E-mail address confirmation
-'confirmemail' => 'Xác nhận thư điện tử',
-'confirmemail_noemail' => 'Bạn chÆ°a Ä‘Æ°a vào địa chỉ thÆ° Ä‘iện tá»­ hợp lệ ở [[Special:Preferences|tùy chá»n cá nhân]].',
-'confirmemail_text' => '{{SITENAME}} đòi há»i bạn xác minh thÆ° Ä‘iện tá»­ của mình
+'confirmemail' => 'Xác nhận thư điện tử',
+'confirmemail_noemail' => 'Bạn chÆ°a Ä‘Æ°a vào địa chỉ thÆ° Ä‘iện tá»­ hợp lệ ở [[Special:Preferences|tùy chá»n cá nhân]].',
+'confirmemail_text' => '{{SITENAME}} đòi há»i bạn xác minh thÆ° Ä‘iện tá»­ của mình
trước khi sử dụng tính năng thư điện tử. Nhấn vào nút bên dưới để gửi thư
xác nhận đến địa chỉ của bạn. Thư xác nhận sẽ có kèm một liên kết có chứa một mã số;
tải liên kết đó trong trình duyệt để xác nhận địa chỉ thư điện tử của bạn là đúng.',
-'confirmemail_pending' => 'Mã xác đã được gửi đến địa chỉ thư điện tử của bạn; nếu bạn
+'confirmemail_pending' => 'Mã xác đã được gửi đến địa chỉ thư điện tử của bạn; nếu bạn
mới vừa tạo tài khoản, xin chỠvài phút để thư tới nơi rồi
hãy cố gắng yêu cầu mã mới.',
-'confirmemail_send' => 'Gửi thư xác nhận',
-'confirmemail_sent' => 'Thư xác nhận đã được gửi',
-'confirmemail_oncreate' => 'Äã gá»­i mã xác nhận đến địa chỉ thÆ° Ä‘iện tá»­ của bạn.
+'confirmemail_send' => 'Gửi thư xác nhận',
+'confirmemail_sent' => 'Thư xác nhận đã được gửi',
+'confirmemail_oncreate' => 'Äã gá»­i mã xác nhận đến địa chỉ thÆ° Ä‘iện tá»­ của bạn.
Bạn không cần mã này để đăng nhập, nhưng sẽ cần sử dụng nó để bật các tính năng có dùng thư điện tử của wiki.',
-'confirmemail_sendfailed' => '{{SITENAME}} không thể gửi thư xác nhận.
+'confirmemail_sendfailed' => '{{SITENAME}} không thể gửi thư xác nhận.
Xin kiểm tra lại địa chỉ thư xem có bị nhầm ký tự nào không.
Chương trình thư báo rằng: $1',
-'confirmemail_invalid' => 'Mã xác nhận sai. Mã này có thể đã hết hạn',
-'confirmemail_needlogin' => 'Bạn cần phải $1 để xác nhận địa chỉ thư điện tử.',
-'confirmemail_success' => 'Thư điện tử của bạn đã được xác nhận. Bạn đã có thể đăng nhập và bắt đầu sử dụng wiki.',
-'confirmemail_loggedin' => 'Äịa chỉ thÆ° Ä‘iện tá»­ của bạn đã được xác nhận',
-'confirmemail_error' => 'Có trục trặc khi lưu xác nhận của bạn.',
-'confirmemail_subject' => 'Xác nhận thư điện tử tại {{SITENAME}}',
-'confirmemail_body' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1,
+'confirmemail_invalid' => 'Mã xác nhận sai. Mã này có thể đã hết hạn',
+'confirmemail_needlogin' => 'Bạn cần phải $1 để xác nhận địa chỉ thư điện tử.',
+'confirmemail_success' => 'Thư điện tử của bạn đã được xác nhận. Bạn đã có thể đăng nhập và bắt đầu sử dụng wiki.',
+'confirmemail_loggedin' => 'Äịa chỉ thÆ° Ä‘iện tá»­ của bạn đã được xác nhận',
+'confirmemail_error' => 'Có trục trặc khi lưu xác nhận của bạn.',
+'confirmemail_subject' => 'Xác nhận thư điện tử tại {{SITENAME}}',
+'confirmemail_body' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1,
đã đăng ký tài khoản có tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
Äể xác nhận rằng tài khoản này thá»±c sá»± là của bạn và để kích hoạt tính năng thÆ° Ä‘iện tá»­ tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:
@@ -3219,8 +3314,36 @@ Nếu bạn *không* đăng ký tài khoản, hãy nhấn vào liên kết này
$5
Mã xác nhận này sẽ hết hạn vào $4.',
-'confirmemail_invalidated' => 'Äã hủy xác nhận địa chỉ thÆ° Ä‘iện tá»­',
-'invalidateemail' => 'Hủy xác nhận thư điện tử',
+'confirmemail_body_changed' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1, đã đăng ký tài khoản có
+tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
+
+Äể xác nhận rằng tài khoản này thá»±c sá»± là của bạn và để kích hoạt tính năng
+thư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:
+
+$3
+
+Nếu tài khoản *không* phải là của bạn, hãy nhấn vào liên kết này để hủy thủ
+tục xác nhận địa chỉ thư điện tử:
+
+$5
+
+Mã xác nhận này sẽ hết hạn vào $4.',
+'confirmemail_body_set' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1, đã đặt địa chỉ này là địa
+chỉ thư điện tử của tài khoản "$2" tại {{SITENAME}}.
+
+Äể xác nhận rằng tài khoản này thá»±c sá»± là của bạn và để tái kích hoạt tính năng
+thư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:
+
+$3
+
+Nếu tài khoản *không* phải là của bạn, hãy nhấn vào liên kết này để hủy thủ
+tục xác nhận địa chỉ thư điện tử:
+
+$5
+
+Mã xác nhận này sẽ hết hạn vào $4.',
+'confirmemail_invalidated' => 'Äã hủy xác nhận địa chỉ thÆ° Ä‘iện tá»­',
+'invalidateemail' => 'Hủy xác nhận thư điện tử',
# Scary transclusion
'scarytranscludedisabled' => '[Nhúng giữa các wiki bị tắt]',
@@ -3263,6 +3386,7 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
'table_pager_first' => 'Trang đầu',
'table_pager_last' => 'Trang cuối',
'table_pager_limit' => 'Xem $1 kết quả mỗi trang',
+'table_pager_limit_label' => 'Số khoản mỗi trang:',
'table_pager_limit_submit' => 'Xem',
'table_pager_empty' => 'Không có kết quả nào.',
@@ -3363,6 +3487,7 @@ Bạn cũng có thể [[Special:Watchlist/edit|dùng trang sửa đổi bình th
'version-specialpages' => 'Trang đặc biệt',
'version-parserhooks' => 'Hook trong bộ xử lý',
'version-variables' => 'Biến',
+'version-skins' => 'Hình dạng',
'version-other' => 'Phần mở rộng khác',
'version-mediahandlers' => 'Bộ xử lý phương tiện',
'version-hooks' => 'Các hook',
@@ -3374,6 +3499,18 @@ Bạn cũng có thể [[Special:Watchlist/edit|dùng trang sửa đổi bình th
'version-hook-subscribedby' => 'Äược theo dõi bởi',
'version-version' => '(Phiên bản $1)',
'version-license' => 'Giấy phép bản quyá»n',
+'version-poweredby-credits' => "Wiki này chạy trên '''[http://www.mediawiki.org/ MediaWiki]''', bản quyá»n © 2001–$1 $2.",
+'version-poweredby-others' => 'những ngÆ°á»i khác',
+'version-license-info' => "MediaWiki là phần má»m tá»± do; bạn được phép tái phân phối và/hoặc sá»­a đổi nó theo những Ä‘iá»u khoản của Giấy phép Công cá»™ng GNU do Quỹ Phần má»m Tá»± do xuất bản; phiên bản 2 hay bất kỳ phiên bản nào má»›i hÆ¡n nào của Giấy phép.
+
+MediaWiki được phân phối vá»›i hy vá»ng rằng nó sẽ hữu ích, nhÆ°ng '''không có bất kỳ má»™t bảo đảm nào cả''', ngay cả những bảo đảm ngụ ý cho '''các mục đích thÆ°Æ¡ng mại''' hoặc cho '''má»™t mục đích đặc biệt nào đó'''. Xem Giấy phép Công cá»™ng GNU để biết thêm chi tiết.
+
+Có lẽ bạn đã nhận [{{SERVER}}{{SCRIPTPATH}}/COPYING bản sao Giấy phép Công cộng GNU] đi kèm với tác phẩm này; nếu không, hãy viết thư đến:
+ Free Software Foundation, Inc.
+ 51 Franklin St., Fifth Floor
+ Boston, MA 02110-1301
+ USA
+hoặc [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html Ä‘á»c nó trá»±c tuyến].",
'version-software' => 'Phần má»m được cài đặt',
'version-software-product' => 'Phần má»m',
'version-software-version' => 'Phiên bản',
@@ -3394,7 +3531,7 @@ Hãy cho vào tên của tập tin, trừ tiá»n tố “{{ns:file}}:â€.',
'fileduplicatesearch-legend' => 'Tìm kiếm tập tin trùng lắp',
'fileduplicatesearch-filename' => 'Tên tập tin:',
'fileduplicatesearch-submit' => 'Tìm kiếm',
-'fileduplicatesearch-info' => '$1×$2 Ä‘iểm ảnh<br />Kích thÆ°á»›c tập tin: $3<br />Äịnh dạng MIME: $4',
+'fileduplicatesearch-info' => '$1 × $2 điểm ảnh<br />Kích thước tập tin: $3<br />Kiểu MIME: $4',
'fileduplicatesearch-result-1' => 'Không có bản sao y hệt vá»›i tập tin “$1â€.',
'fileduplicatesearch-result-n' => 'Có {{PLURAL:$2|1 bản sao|$2 bản sao}} y hệt vá»›i tập tin “$1â€.',
@@ -3443,6 +3580,15 @@ Hãy cho vào tên của tập tin, trừ tiá»n tố “{{ns:file}}:â€.',
'tags-edit' => 'sá»­a',
'tags-hitcount' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
+# Special:ComparePages
+'comparepages' => 'So sánh trang',
+'compare-selector' => 'So sánh phiên bản trang',
+'compare-page1' => 'Trang 1',
+'compare-page2' => 'Trang 2',
+'compare-rev1' => 'Phiên bản 1',
+'compare-rev2' => 'Phiên bản 2',
+'compare-submit' => 'So sánh',
+
# Database error messages
'dberr-header' => 'Wiki này đang gặp trục trặc',
'dberr-problems' => 'Xin lỗi! Trang này đang gặp phải những khó khăn vỠkỹ thuật.',
@@ -3459,8 +3605,13 @@ Hãy cho vào tên của tập tin, trừ tiá»n tố “{{ns:file}}:â€.',
'htmlform-float-invalid' => 'Giá trị chỉ định không phải là con số.',
'htmlform-int-toolow' => 'Giá trị đưa vào phải ít nhất $1',
'htmlform-int-toohigh' => 'Giá trị không được vượt quá $1',
+'htmlform-required' => 'Phần này đòi giá trị',
'htmlform-submit' => 'Äăng',
'htmlform-reset' => 'Hủy các thay đổi',
'htmlform-selectorother-other' => 'Khác',
+# SQLite database support
+'sqlite-has-fts' => '$1 với sự hỗ trợ tìm kiếm toàn văn',
+'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
+
);
diff --git a/languages/messages/MessagesVls.php b/languages/messages/MessagesVls.php
index de3f82cf..dee3558c 100644
--- a/languages/messages/MessagesVls.php
+++ b/languages/messages/MessagesVls.php
@@ -111,15 +111,13 @@ $messages = array(
'qbspecialpages' => 'Specioale bloadn',
# Vector skin
-'vector-action-delete' => 'Wegdoen',
-'vector-action-move' => 'Ernoemn',
-'vector-namespace-project' => 'Projectblad',
-'vector-namespace-special' => 'Specioal blad',
-'vector-view-create' => 'Anmoakn',
-'vector-view-edit' => 'Bewerkn',
-'vector-view-history' => 'Geschiedenisse bekykn',
-'vector-view-view' => 'Leezn',
-'vector-view-viewsource' => 'Brontekst bekykn',
+'vector-action-delete' => 'Wegdoen',
+'vector-action-move' => 'Ernoemn',
+'vector-view-create' => 'Anmoakn',
+'vector-view-edit' => 'Bewerkn',
+'vector-view-history' => 'Geschiedenisse bekykn',
+'vector-view-view' => 'Leezn',
+'vector-view-viewsource' => 'Brontekst bekykn',
'tagline' => 'Van {{SITENAME}}',
'help' => 'Ulpe',
diff --git a/languages/messages/MessagesVmf.php b/languages/messages/MessagesVmf.php
index 8277a0f7..368e808f 100644
--- a/languages/messages/MessagesVmf.php
+++ b/languages/messages/MessagesVmf.php
@@ -33,28 +33,28 @@ $namespaceNames = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'Dobâldâ Wajdârlajdungân' ),
+ 'DoubleRedirects' => array( 'Dobâldâ_Wajdârlajdungân' ),
'Userlogin' => array( 'Ôômäldâ' ),
'Userlogout' => array( 'Ôbmäldâ' ),
'Preferences' => array( 'Ôischtälungâ' ),
'Watchlist' => array( 'Bäoobôchdungslisdâ' ),
- 'Recentchanges' => array( 'Lädsdâ Änârungâ' ),
+ 'Recentchanges' => array( 'Lädsdâ_Änârungâ' ),
'Upload' => array( 'Hoochlaadâ' ),
'Statistics' => array( 'Schdadisdign' ),
- 'Newpages' => array( 'Nojâ Sajdâ' ),
- 'Allpages' => array( 'Ôlâ Sajdâ' ),
+ 'Newpages' => array( 'Nojâ_Sajdâ' ),
+ 'Allpages' => array( 'Ôlâ_Sajdâ' ),
'Prefixindex' => array( 'Indägs' ),
'Specialpages' => array( 'Schbädsjaalsajdâ' ),
'Contributions' => array( 'Bajdräächâ' ),
'Emailuser' => array( 'Iimäjlâ' ),
- 'Confirmemail' => array( 'Iimäjl bschdädigâ' ),
- 'Movepage' => array( 'Sajdâ färschiibâ' ),
+ 'Confirmemail' => array( 'Iimäjl_bschdädigâ' ),
+ 'Movepage' => array( 'Sajdâ_färschiibâ' ),
'Categories' => array( 'Gadâgoriin' ),
'Export' => array( 'Ägsbordiirn' ),
- 'Allmessages' => array( 'Ôlâ Nôôchrichdâ' ),
+ 'Allmessages' => array( 'Ôlâ_Nôôchrichdâ' ),
'Undelete' => array( 'Wiidârhärschdälâ' ),
'Import' => array( 'Imbordiirn' ),
- 'Unwatchedpages' => array( 'Unbäoobôchdâdâ Sajdn' ),
+ 'Unwatchedpages' => array( 'Unbäoobôchdâdâ_Sajdn' ),
);
$messages = array(
@@ -65,8 +65,7 @@ $messages = array(
'tog-hideminor' => 'Glaane ändrungn ned ôôdsajchn',
'tog-hidepatrolled' => 'Ned dsajchn in dâ „Ledschdâ Ändrungn“, was an andrar schon brüüfd had',
'tog-showtoc' => 'Inhalds-fârdsajchnis ôôdsajchn baj määr wi 3 iiwârschrifdn',
-'tog-rememberpassword' => 'Uf dem Ghombjuudâr schdändich ôôgmäld blajwn',
-'tog-editwidth' => "S'âjgaawefäld sol soo braad wi dr bildschirm wärn",
+'tog-rememberpassword' => 'Uf dem Ghombjuudâr schdändich ôôgmäld blajwn (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Ale fon miir sälwâr gmachdn sajdn soln uf mâj beoobachdungs-lischdn',
'tog-watchdefault' => 'Ale fon miir gändârdnd sajdn soln uf mâj beoobachdungs-lischdn',
'tog-watchmoves' => 'Ale fon miir fârschoobnen sajdn soln uf mâj beoobachdungs-lischdn',
@@ -164,30 +163,19 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Ân najn abschnid ôôfangn',
-'vector-action-delete' => 'Leschn',
-'vector-action-move' => 'Umdaafn',
-'vector-action-protect' => 'Schidsn',
-'vector-action-undelete' => 'Leschn riggängich machn',
-'vector-action-unprotect' => 'Schuds ufgeebn',
-'vector-namespace-category' => 'Ghadegorii',
-'vector-namespace-help' => 'Hilfe-sajdn',
-'vector-namespace-image' => 'Dadhaj',
-'vector-namespace-main' => 'Sajdn',
-'vector-namespace-media' => 'Meedjân-sajdn',
-'vector-namespace-mediawiki' => 'Mäldung fon MediaWiki',
-'vector-namespace-project' => 'Brojägd-sajdn',
-'vector-namespace-special' => 'Sondâr-sajdn',
-'vector-namespace-talk' => 'Disghusjoon',
-'vector-namespace-template' => 'Foorlaach',
-'vector-namespace-user' => 'Benudsâr-sajdn',
-'vector-view-create' => 'Ôôleechn',
-'vector-view-edit' => 'Bearbajdn',
-'vector-view-history' => 'Wärsjoonsfolche',
-'vector-view-view' => 'Leesn',
-'vector-view-viewsource' => 'Gwäl-dhägsd ôôgugn',
-'namespaces' => 'Nôômsrajm',
-'variants' => 'Warjandn',
+'vector-action-addsection' => 'Ân najn abschnid ôôfangn',
+'vector-action-delete' => 'Leschn',
+'vector-action-move' => 'Umdaafn',
+'vector-action-protect' => 'Schidsn',
+'vector-action-undelete' => 'Leschn riggängich machn',
+'vector-action-unprotect' => 'Schuds ufgeebn',
+'vector-view-create' => 'Ôôleechn',
+'vector-view-edit' => 'Bearbajdn',
+'vector-view-history' => 'Wärsjoonsfolche',
+'vector-view-view' => 'Leesn',
+'vector-view-viewsource' => 'Gwäl-dhägsd ôôgugn',
+'namespaces' => 'Nôômsrajm',
+'variants' => 'Warjandn',
'errorpagetitle' => 'Feelär',
'returnto' => 'Dsrig dsur sajdn $1.',
@@ -349,7 +337,7 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
# Login and logout pages
'yourname' => 'Benudsârnôômâ',
'yourpassword' => 'Bhaswôrd:',
-'remembermypassword' => 'Af dem ghombjuudâr schdändich ôôgmäld blajm',
+'remembermypassword' => 'Af dem ghombjuudâr schdändich ôôgmäld blajm (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Ôômeldn',
'nav-login-createaccount' => 'Oomeldn / Ghondoo ooleeng',
'userlogin' => 'Ôômeldn / Als Bajdräächâr ajschrajm',
@@ -684,7 +672,6 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
# Watchlist
'watchlist' => 'Maj beoobachdungs-lisdn',
'mywatchlist' => 'Mâj beoobachdungslisdn',
-'watchlistfor' => "(fär '''$1''')",
'addedwatch' => 'Wärd ab jeds beoobachd',
'addedwatchtext' => "Di sajdn „[[:$1]]“ schdäd eds mid af dajnâr [[Special:Watchlist|beoobachdungs-lisdn]] .
@@ -936,9 +923,9 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
'nextdiff' => 'Undârschiid fo där nägsdn ändrung →',
# Media information
-'file-info-size' => '($1 × $2 pigsl, dadajgrääsn: $3, MIME-tib: $4)',
+'file-info-size' => '$1 × $2 pigsl, dadajgrääsn: $3, MIME-tib: $4',
'file-nohires' => "<small>A he´äre aafleesung gibd's ghaane.</small>",
-'svg-long-desc' => '(SVG-dadaj, ufleesung: $1 × $2 pigsl, dadajgreesn: $3)',
+'svg-long-desc' => 'SVG-dadaj, ufleesung: $1 × $2 pigsl, dadajgreesn: $3',
'show-big-image' => 'Bild in hegsdâr aufleesung',
'show-big-image-thumb' => '<small>Greäs fo där schbigg-ôôsichd: $1 × $2 bhigsl</small>',
diff --git a/languages/messages/MessagesVo.php b/languages/messages/MessagesVo.php
index 59df6ba9..8c573f8c 100644
--- a/languages/messages/MessagesVo.php
+++ b/languages/messages/MessagesVo.php
@@ -125,8 +125,7 @@ $messages = array(
'tog-editsection' => 'Dälön redakami dilädas me yüms: [redakön]',
'tog-editsectiononrightclick' => 'Dälön redakami diläda me klik mugaknopa detik su dilädatiäds (JavaScript)',
'tog-showtoc' => 'Jonön ninädalisedi (su pads labü diläds plu 3)',
-'tog-rememberpassword' => 'Dakipön nunädamanünis obik in nünöm at',
-'tog-editwidth' => 'Vidotön redakaspadi lölöfiko',
+'tog-rememberpassword' => 'Dakipolös nunädamanünis obik in bevüresodatävöm at (muiko {{PLURAL:$1|del|dels}} $1)',
'tog-watchcreations' => 'Läükön padis fa ob pejafölis lä galädalised obik',
'tog-watchdefault' => 'Läükön padis fa ob peredakölis la galädalised obik',
'tog-watchmoves' => 'Läükön padis fa ob petopätükölis lä galädalised obik',
@@ -265,30 +264,19 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Lüükön yegädi',
-'vector-action-delete' => 'Moükön',
-'vector-action-move' => 'Topätükön',
-'vector-action-protect' => 'Jelön',
-'vector-action-undelete' => 'Sämoükön',
-'vector-action-unprotect' => 'Säjelön',
-'vector-namespace-category' => 'Klad',
-'vector-namespace-help' => 'Yufapad',
-'vector-namespace-image' => 'Ragiv',
-'vector-namespace-main' => 'Pad',
-'vector-namespace-media' => 'Nünamakanädapad',
-'vector-namespace-mediawiki' => 'Nun',
-'vector-namespace-project' => 'Proyegapad',
-'vector-namespace-special' => 'Pad patik',
-'vector-namespace-talk' => 'Bespik',
-'vector-namespace-template' => 'Samafomot',
-'vector-namespace-user' => 'Gebanapad',
-'vector-view-create' => 'Jafön',
-'vector-view-edit' => 'Redakön',
-'vector-view-history' => 'Logön jenotemi',
-'vector-view-view' => 'Reidön',
-'vector-view-viewsource' => 'Logön fonäti',
-'actions' => 'Duns',
-'namespaces' => 'Nemaspads',
+'vector-action-addsection' => 'Lüükön yegädi',
+'vector-action-delete' => 'Moükön',
+'vector-action-move' => 'Topätükön',
+'vector-action-protect' => 'Jelön',
+'vector-action-undelete' => 'Sämoükön',
+'vector-action-unprotect' => 'Säjelön',
+'vector-view-create' => 'Jafön',
+'vector-view-edit' => 'Redakön',
+'vector-view-history' => 'Logön jenotemi',
+'vector-view-view' => 'Reidön',
+'vector-view-viewsource' => 'Logön fonäti',
+'actions' => 'Duns',
+'namespaces' => 'Nemaspads',
'errorpagetitle' => 'Pöl',
'returnto' => 'Geikön lü $1.',
@@ -344,6 +332,7 @@ $messages = array(
'jumpto' => 'Bunön lü:',
'jumptonavigation' => 'nafam',
'jumptosearch' => 'suk',
+'pool-errorunknown' => 'Pöl nesevädik',
# 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' => 'Tefü {{SITENAME}}',
@@ -503,7 +492,7 @@ No glömolöd ad votükön [[Special:Preferences|buükamis olik in {{SITENAME}}]
'yourname' => 'Gebananem:',
'yourpassword' => 'Letavöd:',
'yourpasswordagain' => 'Klavolös dönu letavödi:',
-'remembermypassword' => 'Dakipolöd ninädamanünis obik in nünöm at',
+'remembermypassword' => 'Dakipolöd ninädamanünis obik in nünöm at (muiko {{PLURAL:$1|del|dels}} $1)',
'yourdomainname' => 'Domen olik:',
'externaldberror' => 'U ejenon fümükamapöl plödik nünödema, u no dalol atimükön kali plödik ola.',
'login' => 'Nunädolös obi',
@@ -520,6 +509,7 @@ No glömolöd ad votükön [[Special:Preferences|buükamis olik in {{SITENAME}}]
'gotaccount' => "Ya labol-li kali? '''$1'''.",
'gotaccountlink' => 'Nunädolös obi',
'createaccountmail' => 'me pot leäktronik',
+'createaccountreason' => 'Kod:',
'badretype' => 'Letavöds fa ol pepenöls no leigons.',
'userexists' => 'Gebananem at ya dabinon. Välolös, begö! nemik votik.',
'loginerror' => 'Nunädamapöl',
@@ -619,7 +609,8 @@ Ba ya evotükol benosekiko letavödi olik, u ya ebegol benosekiko letavödi nela
'anoneditwarning' => "'''Nuned:''' No enunädol oli. Ladet-IP olik poregistaron su redakamajenotem pada at.",
'missingsummary' => "'''Noet:''' No epenol redakamipläni. If ovälol dönu knopi: Dakipolöd, redakam olik podakipon nen plän.",
'missingcommenttext' => 'Penolös, begö! küpeti dono.',
-'missingcommentheader' => "'''Noet:''' No epenol yegädi/tiädi küpete at. If ovälol dönu knopi: Dakipolöd, redakam olik podakipon nen on.",
+'missingcommentheader' => "'''Meib:''' No epenol yegädi/tiädi küpete at.
+If ovälol dönu knopi: \"{{int:savearticle}}\", redakam olik podakipon nen on.",
'summary-preview' => 'Büologed brefik:',
'subject-preview' => 'Büologed yegäda/diläda:',
'blockedtitle' => 'Geban peblokon',
@@ -683,7 +674,7 @@ Kanol [[Special:Search/{{PAGENAME}}|sukön padatiädi at]] su pads votik, <span
'''No nog pedakipon!'''",
'userjspreview' => "'''Memolös, das anu te blufol/büologol eli JavaScript olik, no nog pedakipon!'''",
'userinvalidcssjstitle' => "'''Nuned:''' No dabinon fomät: \"\$1\".
-Memolös, das pads: .css e .js mutons labön tiädi minudik: {{ns:user}}:Foo/monobook.css, no {{ns:user}}:Foo/Monobook.css.",
+Memolös, das pads: .css e .js mutons labön tiädi minudik: {{ns:user}}:Foo/vector.css, no {{ns:user}}:Foo/Vector.css.",
'updated' => '(peatimükon)',
'note' => "'''Penet:'''",
'previewnote' => "'''Is pajonon te büologed; votükams no nog pedakipons!'''",
@@ -721,9 +712,6 @@ If no vilol, das vödems olik poredakons nenmisero, tän no pladolös onis isio.
Garanol obes, das ol it epenol atosi, u das ekopiedol atosi se räyun notidik u se fon libik sümik (logolös eli $1 pro notets).
'''NO PLADOLÖD ISIO NEN DÄL LAUTANA VÖDEMIS LABÜ KOPIEDAGITÄT!'''",
-'longpagewarning' => "'''NUNED: Pad at labon lunoti miljölätas $1;
-bevüresodatävöms anik ba no fägons ad redakön nendsäkädo padis lunotü miljölats plu 32.
-Betikolös dilami pada at ad pads smalikum.'''",
'longpageerror' => "'''PÖL: Vödem fa ol pesedöl labon lunoti miljölätas $1, kelos pluon leigodü völad muik pedälöl miljölätas $2. No kanon padakipön.'''",
'readonlywarning' => "'''NUNED: Vük pefärmükon kodü kodididazesüd. No kanol dakipön votükamis olik anu. Kopiedolös vödemi nulik ini program votik e dakipolös oni in nünöm olik. Poso okanol dönu steifülön ad pladön oni isio.'''
@@ -909,11 +897,12 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
# Diffs
'history-title' => 'Revidajenotem pada: "$1"',
'difference' => '(Dif vü revids)',
+'difference-multipage' => '(Dif vü pads)',
'lineno' => 'Lien $1:',
'compareselectedversions' => 'Leigodolöd fomamis pevälöl',
'showhideselectedversions' => 'Jonön/klänedön fomamis pevälöl',
'editundo' => 'sädunön',
-'diff-multi' => '({{PLURAL:$1|Revid vüik bal no pejonon|Revids vüik $1 no pejonons}}.)',
+'diff-multi' => '({{PLURAL:$1|Revid vüik bal|Revids vüik $1}} fa {{PLURAL:$2|geban bal|gebans $2}} no {{PLURAL:$1|pejonon|pejonons}})',
# Search results
'searchresults' => 'Sukaseks',
@@ -948,6 +937,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
'searchprofile-everything-tooltip' => 'Sukön in ninäd lölik (keninükamü bespikapads)',
'searchprofile-advanced-tooltip' => 'Sukön in nemaspads patik',
'search-result-size' => '$1 ({{PLURAL:$2|vöd 1|vöds $2}})',
+'search-result-category-size' => '{{PLURAL:$1|liman 1|limans $1}} ({{PLURAL:$2|donaklad 1|donaklads $2}}, {{PLURAL:$3|ragiv 1|ragivs $3}})',
'search-result-score' => 'Demäd: $1%',
'search-redirect' => '(lüodüköm: $1)',
'search-section' => '(diläd: $1)',
@@ -1221,11 +1211,8 @@ Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sä
'recentchanges-legend' => 'Votükams nulik: paramets',
'recentchangestext' => 'Su pad at binons votükams nulikün in vüki at.',
'recentchanges-feed-description' => 'Getön votükamis nulikün in vük at me nünakanad at.',
-'recentchanges-legend-newpage' => '$1 - pad nulik',
'recentchanges-label-newpage' => 'Redakam at päjafon pad nulik',
-'recentchanges-legend-minor' => '$1 - votükam pülik',
'recentchanges-label-minor' => 'Atos binon redakam pülik',
-'recentchanges-legend-bot' => '$1 - votükam fa el bot',
'recentchanges-label-bot' => 'Redakam at pädunon fa el bot',
'rcnote' => "Dono {{PLURAL:$1|binon votükam '''1'''|binons votükams '''$1'''}} lätikün {{PLURAL:$2|dela|delas '''$2'''}} lätikün, pänumädöls tü $5, $4.",
'rcnotefrom' => "Is palisedons votükams sis '''$2''' (jü '''$1''').",
@@ -1327,7 +1314,6 @@ If nog vilol lopükön ragivi olik, geikolös e gebolös nemi votik. [[File:$1|t
'fileexists-shared-forbidden' => 'Ragiv labü nem at ya dabinon in ragivastok kobädik. If nog vilol löpükön ragivi olik, geikolös e löpükolös ragivi at me nem votik. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Ragiv at leigon ko {{PLURAL:$1|ragiv|ragivs}} fovik:',
'file-deleted-duplicate' => 'Ragiv votik, kel leigon ko ragiv at ([[:$1]]), pemoükon büo. Sötol kontrolön moükamajenotemi ragiva et büä odönulöpükol oni.',
-'successfulupload' => 'Löpükam eplöpon',
'uploadwarning' => 'Löpükamanuned',
'savefile' => 'Dakipolöd ragivi',
'uploadedimage' => '"[[$1]]" pelöpüköl',
@@ -1346,6 +1332,7 @@ If nog vilol lopükön ragivi olik, geikolös e gebolös nemi votik. [[File:$1|t
Vätälolös, va pötos ad löpükön ragivi at. Kodü koveniäl, jenotalised tefü moükam ragiva at pagivon is.",
'filename-bad-prefix' => "Nem ragiva fa ol palöpüköl primon me '''\"\$1\"''': nem no bepenöl nomiko pagevöl itjäfidiko fa käms nulädik. Välolös, begö! nemi bepenöl pro ragiv olik.",
+'upload-success-subj' => 'Löpükam eplöpon',
'upload-proto-error' => 'Protok neverätik',
'upload-proto-error-text' => 'Löpükam flagon elis URLs me <code>http://</code> u <code>ftp://</code> primölis.',
@@ -1485,7 +1472,6 @@ Primanünods: ninädasot/donasot, a.s. <tt>image/jpeg</tt>.',
'statistics-edits-average' => 'Num zänedik redakamas a pad',
'statistics-views-total' => 'Logams (valod)',
'statistics-views-peredit' => 'Logams a redakam',
-'statistics-jobqueue' => 'Gretot [http://www.mediawiki.org/wiki/Manual:Job_queue vobodaliseda]',
'statistics-users' => '[[Special:ListUsers|Gebans]] peregistaröl',
'statistics-users-active' => 'Gebans jäfedik',
'statistics-users-active-desc' => 'Gebans, kels edunons bosi ün {{PLURAL:$1|del lätik|dels lätik $1}}',
@@ -1521,6 +1507,8 @@ Pad palelogon telplänovapad if gebon samafomoti, lü kel payümon pad [[MediaWi
'nmembers' => '{{PLURAL:$1|liman|limans}} $1',
'nrevisions' => '{{PLURAL:$1|fomam|fomams}} $1',
'nviews' => '{{PLURAL:$1|logam|logams}} $1',
+'nimagelinks' => 'Pageböl in {{PLURAL:$1|pad|pads}} $1',
+'ntransclusions' => 'pageböl in {{PLURAL:$1|pad|pads}} $1',
'specialpage-empty' => 'Pad at vagon.',
'lonelypages' => 'Pads, lü kels yüms nonik dugons',
'lonelypagestext' => 'Pads nonik in vük at peyümons ad pads sököl in {{SITENAME}}.',
@@ -1691,7 +1679,6 @@ Ba dabinons [[{{MediaWiki:Listgrouprights-helppage}}|nüns pluik]] tefü gebanag
# Watchlist
'watchlist' => 'Galädalised obik',
'mywatchlist' => 'Galädalised obik',
-'watchlistfor' => "(tefü '''$1''')",
'nowatchlist' => 'Labol nosi in galädalised olik.',
'watchlistanontext' => '$1 ad logön u redakön lienis galädaliseda olik',
'watchnologin' => 'No enunädon oki',
@@ -1805,7 +1792,9 @@ Redakam lätik päjenükon fa geban: [[User:$3|$3]] ([[User talk:$3|Bespikapad]]
'editcomment' => "Redakamaplän äbinon: „''$1''“.",
'revertpage' => 'Redakams ela [[Special:Contributions/$2|$2]] ([[User talk:$2|Bespik]]) pegeükons ad fomam ma redakam lätik gebana: [[User:$1|$1]]',
'rollback-success' => 'Redakams gebana: $1 pesädunons; pad pevotükon ad fomam lätik fa geban: $2.',
-'sessionfailure' => 'Jiniko ädabinon säkäd seimik pö nunädam olik.
+
+# Edit tokens
+'sessionfailure' => 'Jiniko ädabinon säkäd seimik pö nunädam olik.
Dun at no pelasumon ad vitön mögi, das votükams olik pogivulons gebane votik.
Välolös knopi: „Geikön“ e dönulodolös padi, de kel ekömol, e tän steifülolös nogna.',
@@ -2002,7 +1991,6 @@ $1',
'ipb-edit-dropdown' => 'Redakön kodis blokama',
'ipb-unblock-addr' => 'Säblokön eli $1',
'ipb-unblock' => 'Säblokön gebananemi u ladeti-IP',
-'ipb-blocklist-addr' => 'Blokams dabinöl tefü el $1',
'ipb-blocklist' => 'Logön blokamis dabinöl',
'ipb-blocklist-contribs' => 'Keblünots gebana: $1',
'unblockip' => 'Säblokön gebani',
@@ -2403,10 +2391,10 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
'imagemaxsize' => 'Miedükön magodis su pads magodis bepenöls ad:',
'thumbsize' => 'Gretot magodüla:',
'widthheightpage' => '$1×$2, {{PLURAL:$3|pad|pads}} $3',
-'file-info' => '(ragivagretot: $1, MIME-pated: $2)',
-'file-info-size' => '($1 × $2 pixel, ragivagret: $3, pated MIME: $4)',
+'file-info' => 'ragivagretot: $1, MIME-pated: $2',
+'file-info-size' => '$1 × $2 pixel, ragivagret: $3, pated MIME: $4',
'file-nohires' => '<small>Gretot gudikum no pagebidon.</small>',
-'svg-long-desc' => '(ragiv in fomät: SVG, magodaziöbs $1 × $2, gretot: $3)',
+'svg-long-desc' => 'ragiv in fomät: SVG, magodaziöbs $1 × $2, gretot: $3',
'show-big-image' => 'Gretot gudikün',
'show-big-image-thumb' => '<small>Gretot büologeda at: magodaziöbs $1 × $2</small>',
@@ -2804,6 +2792,7 @@ Kanol i [[Special:Watchlist/edit|gebön redakametodi kösömik]].',
'version' => 'Fomam',
'version-extensions' => 'Veitükumams pestitöl',
'version-specialpages' => 'Pads patik',
+'version-skins' => 'Fomäts',
'version-other' => 'Votik',
'version-hooks' => 'Huköms',
'version-hook-name' => 'Hukömanem',
@@ -2862,6 +2851,14 @@ Penolös ragivanemi nen foyümot: „{{ns:file}}:“.',
'tags-edit' => 'redakön',
'tags-hitcount' => '$1 {{PLURAL:$1|votükam|votükams}}',
+# Special:ComparePages
+'comparepages' => 'Leigodön padis',
+'compare-page1' => 'Pad 1',
+'compare-page2' => 'Pad 2',
+'compare-rev1' => 'Revid 1',
+'compare-rev2' => 'Revid 2',
+'compare-submit' => 'Leigodolöd',
+
# Database error messages
'dberr-header' => 'Vük at labon säkädi',
'dberr-problems' => 'Säkusadolös! Bevüresodatopäd at nu labon säkädis kaenik.',
diff --git a/languages/messages/MessagesVot.php b/languages/messages/MessagesVot.php
index 43e3d6f0..17f5f02f 100644
--- a/languages/messages/MessagesVot.php
+++ b/languages/messages/MessagesVot.php
@@ -161,7 +161,7 @@ Kui tšüsümüssessä ebõõ rootšittu tšültši, võib õlla õlõttõ löü
# Login and logout pages
'yourname' => 'Tšäüttijänimi:',
'yourpassword' => 'Salasõna',
-'remembermypassword' => 'Mäleht minuu',
+'remembermypassword' => 'Mäleht minuu (enintään $1 {{PLURAL:$1|päivä|päivää}})',
'login' => 'Tširjut süäme',
'nav-login-createaccount' => 'Tširjut süäme vai registriiroit tšäüttijässi',
'userlogin' => 'Tširjut süäme',
@@ -388,7 +388,6 @@ Tšüľľed, kummad õmad teÄÄellä [[Special:Watchlist|kattsõspiizgalla]] on
# Watchlist
'watchlist' => 'Minu kattsõspiiska',
'mywatchlist' => 'Minu kattsõspiiska',
-'watchlistfor' => '$1',
'addedwatch' => 'Lisättü kattsospiizgallõ',
'addedwatchtext' => "TšültÅ¡i \"[[:\$1]]\" on lisättü TeÄÄee [[Special:Watchlist|kattsospiizgallõ]].
Tšültšese ja sene juttutšültšese tehäväd tulõvaizõd muutuhsõd leeväd tšisloitõtud siäll.
@@ -596,9 +595,9 @@ Toož, võittõ tširjutta väänteüssee süü.',
'nextdiff' => 'Uuvvõpi muutuz →',
# Media information
-'file-info-size' => '($1 × $2 px, $3, MIME-sortta: $4)',
+'file-info-size' => '$1 × $2 px, $3, MIME-sortta: $4',
'file-nohires' => '<small>Suurõpaa kuva ebõõ.</small>',
-'svg-long-desc' => '(SVG-faili $1 × $2 px, failii suuruz: $3)',
+'svg-long-desc' => 'SVG-faili $1 × $2 px, failii suuruz: $3',
'show-big-image' => 'Kõrka-rezoľuuttsiin verzija',
'show-big-image-thumb' => '<small>Prestavľeńńaa suuruz: $1 × $2 px</small>',
diff --git a/languages/messages/MessagesVro.php b/languages/messages/MessagesVro.php
index cbc6a041..3bb6a1c4 100644
--- a/languages/messages/MessagesVro.php
+++ b/languages/messages/MessagesVro.php
@@ -55,8 +55,7 @@ $messages = array(
'tog-editsection' => 'Lupaq lõikõ toimõndaq [toimõndaq]-linkõga',
'tog-editsectiononrightclick' => 'Lupaq lõikõ toimõndaq hüäpoolidsõ klõpsutusõga <br /> lõigu päälkirä pääl (JavaScript)',
'tog-showtoc' => 'Näütäq sisukõrda (rohkõmb ku kolmõ vaihõpäälkiräga lehile)',
-'tog-rememberpassword' => 'Salasõna miildejätmine tulõvaidsis kõrros',
-'tog-editwidth' => 'Tiiq toimõnduskast terve lehe lakjudsõs',
+'tog-rememberpassword' => 'Salasõna miildejätmine tulõvaidsis kõrros (kõgõ inämb $1 {{PLURAL:$1|pääväs|pääväs}})',
'tog-watchcreations' => 'Panõq mu luuduq leheq mu perräkaemisnimekirjä',
'tog-watchdefault' => 'Kaeq vahtsidõ ja muudõtuidõ artiklidõ perrä',
'tog-watchmoves' => 'Panõq mu ümbrenõstõduq leheküleq mu perräkaemisnimekirjä',
@@ -200,31 +199,20 @@ $messages = array(
'faqpage' => 'Project:KKK',
# Vector skin
-'vector-action-addsection' => 'Vahtsõ teema ülespandminõ',
-'vector-action-delete' => 'Kistudaq ärq',
-'vector-action-move' => 'Nõstaq ümbre',
-'vector-action-protect' => 'Kaidsaq',
-'vector-action-undelete' => 'Tiiq tagasi',
-'vector-action-unprotect' => 'Kaitsku-i',
-'vector-namespace-category' => 'Katõgooria',
-'vector-namespace-help' => 'Abileht',
-'vector-namespace-image' => 'Teedüstü',
-'vector-namespace-main' => 'Leht',
-'vector-namespace-media' => 'Meediäleht',
-'vector-namespace-mediawiki' => 'Tallitusteedüs',
-'vector-namespace-project' => 'Projektileht',
-'vector-namespace-special' => 'Tallituslehekülg',
-'vector-namespace-talk' => 'Arotus',
-'vector-namespace-template' => 'Näüdüs',
-'vector-namespace-user' => 'Pruukjalehekülg',
-'vector-view-create' => 'Luuq',
-'vector-view-edit' => 'Toimõndaq',
-'vector-view-history' => 'Näütäq aoluku',
-'vector-view-view' => 'Loeq',
-'vector-view-viewsource' => 'Kaeq lätteteksti',
-'actions' => 'Tallitusõq',
-'namespaces' => 'Nimeruumiq',
-'variants' => 'Tõõsõndiq',
+'vector-action-addsection' => 'Vahtsõ teema ülespandminõ',
+'vector-action-delete' => 'Kistudaq ärq',
+'vector-action-move' => 'Nõstaq ümbre',
+'vector-action-protect' => 'Kaidsaq',
+'vector-action-undelete' => 'Tiiq tagasi',
+'vector-action-unprotect' => 'Kaitsku-i',
+'vector-view-create' => 'Luuq',
+'vector-view-edit' => 'Toimõndaq',
+'vector-view-history' => 'Näütäq aoluku',
+'vector-view-view' => 'Loeq',
+'vector-view-viewsource' => 'Kaeq lätteteksti',
+'actions' => 'Tallitusõq',
+'namespaces' => 'Nimeruumiq',
+'variants' => 'Tõõsõndiq',
'errorpagetitle' => 'Viga',
'returnto' => 'Tagasi lehe manoq $1.',
@@ -280,6 +268,9 @@ $messages = array(
'jumpto' => 'Mineq üle:',
'jumptonavigation' => 'juhtminõ',
'jumptosearch' => 'otsminõ',
+'pool-timeout' => 'Kinniqpidämise uutmisaig om läbi',
+'pool-queuefull' => 'Kinniqpandmiisi järekõrd om täüs',
+'pool-errorunknown' => 'Tiidmäldä hädä',
# 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}} tutvustus',
@@ -438,7 +429,7 @@ Tähelepandmisõs: niikavva, ku sa olõ-i tühäs tennüq uma võrgokaeja vaihõ
'yourname' => 'Pruukjanimi',
'yourpassword' => 'Salasõna',
'yourpasswordagain' => 'Kirodaq viilkõrd salasõna',
-'remembermypassword' => 'Salasõna miildejätmine järgmäidsis kõrros',
+'remembermypassword' => 'Jätäq salasõna miilde (kooniq $1 {{PLURAL:$1|pääväs|pääväs}})',
'yourdomainname' => 'Võrgonimi',
'externaldberror' => 'Välitsen kimmästegemisteedüskogon om viga vai olõ-i sul lubat umma pruukjanimme muutaq.',
'login' => 'Nimega sisseminek',
@@ -455,6 +446,7 @@ Tähelepandmisõs: niikavva, ku sa olõ-i tühäs tennüq uma võrgokaeja vaihõ
'gotaccount' => "Ku sul jo om uma pruukjanimi, sis '''$1'''.",
'gotaccountlink' => 'võit nimega sisse minnäq',
'createaccountmail' => 'e-postiga',
+'createaccountreason' => 'Põhjus:',
'badretype' => 'Kirotõduq salasõnaq ei klapiq kokko.',
'userexists' => 'Taad pruukjanimme jo pruugitas.
Valiq tõõnõ nimi.',
@@ -651,7 +643,6 @@ Ku klõpsahtat nuppi \"{{int:savearticle}}\", sis pästetäs '''õnnõ''' ülemb
'copyrightwarning' => 'Pruukjapalgõ ümbrepandmisõq loetasõq avaldõdus $2 perrä
(täpsämbähe kaeq $1). Muud sissu või pruukiq tävveste vabalt, ku olõ-i tõisildõ näüdät.',
'copyrightwarning2' => "Rehkendäq tuud, et kõiki seo lehe pääle tettüid kirotuisi ja toimõnduisi või kiä taht muutaq vai ärq kistutaq. Ku sa taha-i, et su tüüd armuhiitmäldä ümbre tetäs ja uma ärqnägemise perrä pruugitas, sis pästku-i taad siiäq. Sa piät ka lubama, et kirotit uma jutu esiq vai võtit kopimiskeelüldä paigast (täpsämbält kaeq $1). '''PANGU-I TAAHA TEGIJÄÕIGUISIGA KAIDSÕTUT MATÕRJAALI ILMA LUALDA!'''",
-'longpagewarning' => '<center>HOIATUS: Seo lehe suurus om $1 kilobaiti. Mõnõ võrgokaejaga või ollaq hätä jo 32-kilobaididsõ lehe toimõndamisõga. Märgiq perrä, kas seod lehte andnuq jakaq vähämbis lehis.</center>',
'longpageerror' => "'''VIGA: Lehe suurus om $1 kilobaiti. Taad saa-i pästäq, selle et kõgõ suurõmb lubat suurus om $2 kilobaiti.'''",
'readonlywarning' => "'''HOIATUS: Teedüskogo om huuldustöie jaos lukku pant, nii et parhilla saa-i paranduisi pästäq. Võit teksti alalõ hoitaq tekstifailin ja pästäq taa siiäq peränpoolõ.'''",
'protectedpagewarning' => '<center><small>Taa leht om lukun. Taad saavaq toimõndaq õnnõ kõrraldajaõiguisiga pruukjaq.</small></center>',
@@ -1050,7 +1041,6 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
'file-thumbnail-no' => "Teedüstü nimi nakkas pääle '''<tt>$1</tt>'''. Taa paistus ollõv vähändet pilt ''(thumbnail)''. Ku sul om olõman taa pilt tävven suurusõn, sis laadiq üles tuu, ku olõ-i, sis muudaq teedüstü nimi ärq.",
'fileexists-forbidden' => 'Sääntse nimega teedüstü om jo olõman. Pästäq teedüstü tõõsõ nimega. Parhillanõ teedüstü: [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Sama nimega teedüstü om jo olõman jaetuidõ teedüstüide hulgan. Pästäq teedüstü mõnõ tõõsõ nime ala. Parhillanõ teedüstü: [[File:$1|thumb|center|$1]]',
-'successfulupload' => "Üleslaatminõ läts' kõrda",
'uploadwarning' => 'Ãœleslaatmishoiatus',
'savefile' => 'Pästäq teedüstü ärq',
'uploadedimage' => 'laadõ üles "$1"',
@@ -1066,6 +1056,7 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
'upload-wasdeleted' => "'''Hoiatus: Sa proovit üles laatiq teedüstüt, miä om innemb ärq kistutõt.'''
Kas olõt kimmäs, et tahat taad üles laatiq? Kaeq ka sissekirotust taa teedüstü ärqkistutamisõ kotsilõ:",
+'upload-success-subj' => "Üleslaatminõ läts' kõrda",
'upload-proto-error' => 'Viganõ protokoll',
'upload-proto-error-text' => 'Üles saa laatiq õnnõ aadrõssidõ päält, mink alostusõn om <code>http://</code> vai <code>ftp://</code>.',
@@ -1321,7 +1312,6 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
# Watchlist
'watchlist' => 'Perräkaemisnimekiri',
'mywatchlist' => 'mu perräkaemisnimekiri',
-'watchlistfor' => "(pruukjalõ '''$1''')",
'nowatchlist' => 'Perräkaemisnimekiri om tühi.',
'watchlistanontext' => 'Perräkaemisnimekirä pruukmisõs $1.',
'watchnologin' => 'Olõ-i nimega sisse mint',
@@ -1417,6 +1407,8 @@ Kelläaoq ummaq serveriao perrä.',
'alreadyrolled' => 'Pruukja [[User:$2|$2]] ([[User talk:$2|arotus]]) tettüid lehe [[:$1]] muutmiisi saa-i tagasi võttaq, selle et pruukja [[User:$3|$3]] ([[User talk:$3|arotus]]) om tennüq vahtsõmbit muutmiisi.',
'editcomment' => "Toimõndamiskokkovõtõq oll': \"''\$1''\".",
'revertpage' => 'Pruukja [[Special:Contributions/$2|$2]] ([[User_talk:$2|arotus]]) toimõndusõq pöörediq tagasi ja leht panti tagasi pruukja [[User:$1|$1]] tettü kujo pääle.',
+
+# Edit tokens
'sessionfailure' => 'Paistus ollõv määnegi hädä su toimõndamiskõrraga, tuuperäst om viimäne muutminõ egäs johtumisõs jätet tegemäldä. Vaodaq võrgokaeja "tagasi"-nuppi, laadiq üle lehekülg, kost sa tullit ja prooviq vahtsõst.',
# Protect
@@ -1567,7 +1559,6 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu
'ipb-edit-dropdown' => 'Toimõndaq kinniqpidämise põhjuisi',
'ipb-unblock-addr' => 'Lõpõdaq pruukja $1 kinniqpidämine ärq',
'ipb-unblock' => 'Lõpõdaq pruukja vai puutri võrgoaadrõasi kinniqpidämine ärq',
-'ipb-blocklist-addr' => 'Näütäq pruukja $1 kinniqpidämiisi',
'ipb-blocklist' => 'Näütäq kinnniqpidämiisi',
'unblockip' => 'Lõpõdaq puutri võrgoaadrõsi kinniqpidämine ärq',
'unblockiptext' => 'Täüdäq ärq taa vorm, et lõpõtaq ärq pruukja vai puutri võrgoaadrõsi kinniqpidämine',
@@ -1898,9 +1889,9 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
'imagemaxsize' => 'Pildi seletüslehe pääl näütämise suuruspiir:',
'thumbsize' => 'Väikupildi suurus:',
'file-info' => '$1, MIME-tüüp: $2',
-'file-info-size' => '($1×$2 pikslit, $3, MIME-tüüp: $4)',
+'file-info-size' => '$1×$2 pikslit, $3, MIME-tüüp: $4',
'file-nohires' => '<small>Taast terävämpä pilti olõ-i saiaq.</small>',
-'svg-long-desc' => '(SVG-teedüstü, põhisuurus $1 × $2 pikslit, teedüstü suurus $3)',
+'svg-long-desc' => 'SVG-teedüstü, põhisuurus $1 × $2 pikslit, teedüstü suurus $3',
'show-big-image' => 'Täüsterräv kujo',
'show-big-image-thumb' => '<small>Proovikaemisõ suurus: $1×$2 pikslit</small>',
diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php
index 0f567fa6..438026fb 100644
--- a/languages/messages/MessagesWa.php
+++ b/languages/messages/MessagesWa.php
@@ -58,9 +58,9 @@ $namespaceNames = array(
# definixha del cogne po les limeros
# (number format definition)
# en: 12,345.67 -> wa: 12 345,67
-$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
-#$linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
+# $linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
$linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
#
@@ -83,8 +83,7 @@ $messages = array(
'tog-editsection' => "Eployî les loyéns «[candjî]» po candjî rén k' ene seccion",
'tog-editsectiononrightclick' => 'Candjî les seccions avou on dobe-clitch sol tite (JavaScript)',
'tog-showtoc' => "Mostrer l' tåvlea d' ådvins<br />(po ls årtikes avou pus di 3 seccions)",
-'tog-rememberpassword' => 'Rimimbrer li scret inte les sessions',
-'tog-editwidth' => "Li boesse d' aspougnaedje prind tote li lårdjeu",
+'tog-rememberpassword' => 'Rimimbrer li scret inte les sessions (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => "Mete les pådjes ki dj' askepeye dins l' djivêye des pådjes shuvowes",
'tog-watchdefault' => "Shuve les årtikes ki dj' fwai ou ki dj' candje",
'tog-watchmoves' => "Radjouter a m' djivêye des shuvous les pådjes ki dji displaece",
@@ -364,7 +363,7 @@ Vosse conte a stî ahivé.
'yourname' => "Vosse no d' elodjaedje",
'yourpassword' => 'Vosse sicret',
'yourpasswordagain' => 'Ritapez vosse sicret',
-'remembermypassword' => "Rimimbrer m' sicret inte les sessions.",
+'remembermypassword' => "Rimimbrer m' sicret inte les sessions (nén dpus ki po $1 {{PLURAL:$1|djoû|djoûs}})",
'yourdomainname' => 'Vosse dominne',
'login' => "S' elodjî",
'nav-login-createaccount' => "Ahiver on conte, udon-bén s' elodjî",
@@ -488,7 +487,7 @@ Si vos n' voloz nén scrire cisse pådje chal, clitchîz simplumint sol boton ''
'userjsyoucanpreview' => "'''Racsegne:''' eployîz l' boton «Vey divant» po sayî vosse novea JS divant del schaper.",
'usercsspreview' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje di vosse stîle CSS d' uzeu, i n' a nén co stî schapé!'''",
'userjspreview' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje/saye di vosse JavaScript d' uzeu, i n' a nén co stî schapé!'''",
-'userinvalidcssjstitle' => "'''Asteme:''' I n' a pont d' pea lomêye «$1». Tuzez ki les pådjes .css eyet .js des uzeus eployèt des tite e ptitès letes, metans {{ns:user}}:Toto/monobook.css et nén {{ns:user}}:Toto/Monobook.css.",
+'userinvalidcssjstitle' => "'''Asteme:''' I n' a pont d' pea lomêye «$1». Tuzez ki les pådjes .css eyet .js des uzeus eployèt des tite e ptitès letes, metans {{ns:user}}:Toto/vector.css et nén {{ns:user}}:Toto/Vector.css.",
'updated' => '(Ramidré)',
'previewnote' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje, li pådje n' est nén co schapêye!'''",
'previewconflict' => 'Ci prévoeyaedje ci mostere kimint kel tecse del boesse di tecse do dzeu sereut håyné si vos decidez di clitchî so «schaper».',
@@ -524,10 +523,6 @@ Vos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz c
Si vos n' voloz nén scrire des årtikes ki polèt esse candjîs pa des ôtes, adon nels evoyîz nén chal.<br />
Vos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz copyî d' on sourdant libe (voeyoz $1 po pus di racsegnes).
'''N' EVOYÎZ NÉN DES TECSES DIZO ABONDROETS SINS PERMISSION!'''",
-'longpagewarning' => "'''ASTEME: Cisse pådje fwait $1 kilo-octets; des
-betchteus waibes k' i gn a polèt aveut des rujhes po-z aspougnî
-des pådjes k' aprepièt ou di pus di 32 ko.
-Vos dvrîz tuzer a pårti l' pådje e pus ptits bokets.'''",
'longpageerror' => "'''AROKE: Li tecse ki vos avoz evoyî fwait di pus d' $1 kilo-octets, çou k' est pus ki l' macsimom di $2 kilo-octets. C' est nén possible del schaper sol sierveu.'''",
'readonlywarning' => "'''ASTEME: On-z overe sol båze di dnêyes pol moumint, ey elle a stî metowe e mode seulmint-lére.
Do côp, vos n' såroz schaper vos candjmints asteure; motoit vos dvrîz copyî et aclaper l' tecse dins on fitchî da vosse pol poleur rimete pus tård.'''",
@@ -803,7 +798,6 @@ ou co po les sons
[[$1|thumb]]",
'fileexists-forbidden' => "I gn a ddja on fitchî avou ç' no la; rivnoz s' i vs plait en erî et s' reberwetez l' fitchî dizo èn ôte no. [[File:$1|thumb|center|$1]]",
'fileexists-shared-forbidden' => "I gn a ddja on fitchî avou ç' no la e ridant des fitchîs pårtaedjîs; rivnoz s' i vs plait en erî et s' reberwetez l' fitchî dizo èn ôte no. [[File:$1|thumb|center|$1]]",
-'successfulupload' => "L' eberwetaedje a stî comifåt",
'uploadwarning' => "Adviertixhmint so l' eberwetaedje",
'savefile' => "Schaper l' fitchî",
'uploadedimage' => 'eberwetaedje di «[[$1]]»',
@@ -814,6 +808,7 @@ ou co po les sons
'sourcefilename' => "No d' fitchî so vosse copiutrece:",
'destfilename' => "No d' fitchî a eployî so {{SITENAME}}:",
'filewasdeleted' => "On fitchî avou ç' no la a ddja stî disfacé. Vos dvrîz loukî å $1 divant d' continouwer.",
+'upload-success-subj' => "L' eberwetaedje a stî comifåt",
'upload-file-error' => 'Divintrinne aroke',
@@ -1001,7 +996,6 @@ Do côp, c' est nén possibe di lyi evoyî èn emile.",
# Watchlist
'watchlist' => 'PÃ¥djes shuvowes',
'mywatchlist' => 'PÃ¥djes shuvowes',
-'watchlistfor' => "(po l' uzeu «'''$1'''»)",
'nowatchlist' => 'Vosse djivêye des pådjes a shuve est vude.',
'watchlistanontext' => 'I vs fåt $1 po vey ou candjî les cayets di vosse djivêye des shuvous.',
'watchnologin' => "Vos n' estoz nén elodjî",
@@ -1427,7 +1421,7 @@ Totes les accions di rcopiaedje eterwiki sont metowes e [[Special:Log/import|djo
'mediawarning' => "'''Asteme''': Ci fitchî chal pôreut esse evirussé, si vos l' enondez vos pôrîz infecter l' sistinme da vosse.",
'imagemaxsize' => "Limite pol håynaedje ezès pådjes d' imådje:",
'thumbsize' => 'Grandeu po les imådjetes (thumb):',
-'file-info-size' => '($1 × $2 picsels, groxheur do fitchî: $3, del sôre "MIME": $4)',
+'file-info-size' => '$1 × $2 picsels, groxheur do fitchî: $3, del sôre "MIME": $4',
'show-big-image' => 'Pus grande imådje',
'show-big-image-thumb' => '<small>Grandeur di ci prevoeyaedje ci : $1 × $2 picsels</small>',
diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php
index 0aea6f49..d3d638ad 100644
--- a/languages/messages/MessagesWar.php
+++ b/languages/messages/MessagesWar.php
@@ -49,8 +49,7 @@ $messages = array(
'tog-editsection' => 'Tugoti in seksyon nga pagliwat pinaagi hin [igliwat] nga mga sumpay',
'tog-editsectiononrightclick' => 'Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon (nakinahanglan hin JavaScript)',
'tog-showtoc' => 'Igpakita in tabla hin sulod (para hin mga pakli nga sobra hin 3 ka titulo o pagngaran)',
-'tog-rememberpassword' => 'Hinumdomi an akon pan-sakob dinhi nga komputadora',
-'tog-editwidth' => 'Igpahaluag an kahon hin pagliwat agod magamitan an bug-os nga pabyon o pantalya',
+'tog-rememberpassword' => 'Hinumdomi an akon pan-sakob dinhi nga komputadora (para hin maximum nga $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
'tog-watchcreations' => 'Igdugang in mga pakli nga akon ginhimo ngadto han akon angay timan-an',
'tog-watchdefault' => 'Igdugang in mga pakli nga akon ginliwat ngadto han akon angay timan-an',
'tog-watchmoves' => 'Igdugang in mga pakli nga akon ginpamalhin ngadto han akon angay timan-an',
@@ -183,31 +182,20 @@ $messages = array(
'faqpage' => 'Project:AGG',
# Vector skin
-'vector-action-addsection' => 'Igdugang hin himangrawon',
-'vector-action-delete' => 'Para-a',
-'vector-action-move' => 'Balhina',
-'vector-action-protect' => 'Panalipda',
-'vector-action-undelete' => 'Igbalik an ginpara',
-'vector-action-unprotect' => 'Kuhaa an panalipod',
-'vector-namespace-category' => 'Kaarangay',
-'vector-namespace-help' => 'Pagbulig nga pakli',
-'vector-namespace-image' => 'Fayl',
-'vector-namespace-main' => 'Pakli',
-'vector-namespace-media' => 'Pakli hin medya',
-'vector-namespace-mediawiki' => 'Mensahe',
-'vector-namespace-project' => 'Proyekto nga pakli',
-'vector-namespace-special' => 'Nalalain nga pakli',
-'vector-namespace-talk' => 'Hiruhimangraw',
-'vector-namespace-template' => 'Plantilya',
-'vector-namespace-user' => 'Pakli hin nágámit',
-'vector-view-create' => 'Himo-a',
-'vector-view-edit' => 'Igliwat',
-'vector-view-history' => 'Kitaa an kaagi',
-'vector-view-view' => 'Basaha',
-'vector-view-viewsource' => 'Kitaa an ginkuhaan',
-'actions' => 'Mga buhat',
-'namespaces' => "Mga ngaran-lat'ang",
-'variants' => 'Mga pagkadirudilain',
+'vector-action-addsection' => 'Igdugang hin himangrawon',
+'vector-action-delete' => 'Para-a',
+'vector-action-move' => 'Balhina',
+'vector-action-protect' => 'Panalipda',
+'vector-action-undelete' => 'Igbalik an ginpara',
+'vector-action-unprotect' => 'Kuhaa an panalipod',
+'vector-view-create' => 'Himo-a',
+'vector-view-edit' => 'Igliwat',
+'vector-view-history' => 'Kitaa an kaagi',
+'vector-view-view' => 'Basaha',
+'vector-view-viewsource' => 'Kitaa an ginkuhaan',
+'actions' => 'Mga buhat',
+'namespaces' => "Mga ngaran-lat'ang",
+'variants' => 'Mga pagkadirudilain',
'errorpagetitle' => 'Sayop',
'returnto' => 'Balik ngadto ha $1.',
@@ -268,6 +256,8 @@ Damo nga nagamit in gusto sinmulod hini nga pakli.
Alayon paghulat makadali san-o ka inmutro pagsulod hin nga pakli utro.
$1',
+'pool-queuefull' => 'Puno an katitirok nga pila',
+'pool-errorunknown' => 'Waray kasabti nga kasaypanan',
# 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' => 'Mahitungod han {{SITENAME}}',
@@ -404,6 +394,7 @@ Ayaw paghingalimot hin pagbalyo han imo [[Special:Preferences|{{SITENAME}} mga g
'gotaccount' => '¿Mayda kana akawnt? $1.',
'gotaccountlink' => 'Sakob',
'createaccountmail' => 'Ha e-mail',
+'createaccountreason' => 'Rason:',
'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
'userexists' => 'An agnay-hit-nagamit nga im ginbutang in gingamit na.
Alayon pagpili hin lain nga ngaran.',
@@ -838,6 +829,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
'tooltip-save' => 'Ig-seyb an imo mga pagbabag-o',
# Media information
+'file-info-size' => '$1 × $2 nga pixel, kadako han fayl: $3, MIME nga tipo: $4',
'show-big-image' => 'Bug-os nga resolusyon',
# Special:NewFiles
diff --git a/languages/messages/MessagesWo.php b/languages/messages/MessagesWo.php
index ac498184..e1c9a9e7 100644
--- a/languages/messages/MessagesWo.php
+++ b/languages/messages/MessagesWo.php
@@ -94,8 +94,7 @@ $messages = array(
'tog-editsection' => 'Soppi ab xaaj jaare ko cib lëkkalekaay [Soppi]',
'tog-editsectiononrightclick' => 'Soppi ab xaaj cib cuqub ndeyjoor ci kojam (JavaScript)',
'tog-showtoc' => 'Wone tëralinu ne-ne yi (ngir xët yi ëpp 3 xaaj)',
-'tog-rememberpassword' => 'Fattaliku sama baatujàll(cookie)',
-'tog-editwidth' => 'Wone palanteeru coppite bi ci yaatuwaay bépp',
+'tog-rememberpassword' => 'Fattalikul sama baatujàll (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => 'Yokk ci sama limu toppte xët yi may sos',
'tog-watchdefault' => 'Yokk ci sama limu toppte xët yi may soppi',
'tog-watchmoves' => 'Yokk ci sama limu toppte xët yi may tuddaat',
@@ -238,31 +237,20 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Yokkuw tëriit',
-'vector-action-delete' => 'Far',
-'vector-action-move' => 'Tuddewaat',
-'vector-action-protect' => 'Aar',
-'vector-action-undelete' => 'Delloowaat',
-'vector-action-unprotect' => 'Aaradi',
-'vector-namespace-category' => 'Wàll',
-'vector-namespace-help' => 'Ndimbal',
-'vector-namespace-image' => 'Dencukaay',
-'vector-namespace-main' => 'Xët',
-'vector-namespace-media' => 'Xëtu xibaarukaay',
-'vector-namespace-mediawiki' => 'Bataaxal',
-'vector-namespace-project' => 'Xëtu sémb',
-'vector-namespace-special' => 'Xëtu jagleel',
-'vector-namespace-talk' => 'Diisoo',
-'vector-namespace-template' => 'Royuwaay',
-'vector-namespace-user' => 'Xëtu jëfandikukat',
-'vector-view-create' => 'Sos',
-'vector-view-edit' => 'Soppi',
-'vector-view-history' => 'Wone jaar-jaaram',
-'vector-view-view' => 'Jàng',
-'vector-view-viewsource' => 'Wone gongikuwaayam',
-'actions' => 'Jëf',
-'namespaces' => 'Barabu tur',
-'variants' => 'Wuute',
+'vector-action-addsection' => 'Yokkuw tëriit',
+'vector-action-delete' => 'Far',
+'vector-action-move' => 'Tuddewaat',
+'vector-action-protect' => 'Aar',
+'vector-action-undelete' => 'Delloowaat',
+'vector-action-unprotect' => 'Aaradi',
+'vector-view-create' => 'Sos',
+'vector-view-edit' => 'Soppi',
+'vector-view-history' => 'Wone jaar-jaaram',
+'vector-view-view' => 'Jàng',
+'vector-view-viewsource' => 'Wone gongikuwaayam',
+'actions' => 'Jëf',
+'namespaces' => 'Barabu tur',
+'variants' => 'Wuute',
'errorpagetitle' => 'Njuumte',
'returnto' => 'Dellu ci wii xët $1.',
@@ -481,7 +469,7 @@ Bul fatte soppi say [[Special:Preferences|{{SITENAME}} tànneef]].',
'yourname' => 'Sa turu jëfandikukat',
'yourpassword' => 'Sa baatujàll',
'yourpasswordagain' => 'Bindaatal sa baatujàll',
-'remembermypassword' => 'Fattaliku sama baatujàll ci bii nosukaay',
+'remembermypassword' => 'Denc sama yëgley dukkukaay ci bii joowukaay (lu ëpp nag $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Sa barab',
'externaldberror' => 'Njuumte judd na ci dàttub njoxe bi, walla day ni rekk amuloo sañ-sañu yeesal sa sàqum biti.',
'login' => 'xammeeku',
@@ -662,7 +650,7 @@ walla <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}
'userjsyoucanpreview' => "'''Xelal :''' di la digël nga cuq ci «Wonendi» ngir gis say xobi CSS walla JavaScript yu bees laata nga leen di denc.",
'usercsspreview' => "Bul fatte ne lii wonendib sa CSS rekk la; dencagoo say coppite!'''",
'userjspreview' => "'''Bul fatte ne lii ab wonendib sa yoonu javaScript rekk la; dencagoo say coppite!'''",
-'userinvalidcssjstitle' => "'''Moytul :''' amul genn col gu tudd « $1 ». Bul fatte ne xët yiy jeexee .css ak .js seeni koj ay araf yu tuut ñoo ciy tegu/.<br />ci misaal, {{ns:user}}:Foo/'''m'''onobook.css moo baax, waaye bii du baax {{ns:user}}:Foo/'''M'''onobook.css .",
+'userinvalidcssjstitle' => "'''Moytul :''' amul genn col gu tudd « $1 ». Bul fatte ne xët yiy jeexee .css ak .js seeni koj ay araf yu tuut ñoo ciy tegu/.<br />ci misaal, {{ns:user}}:Foo/'''v'''ector.css moo baax, waaye bii du baax {{ns:user}}:Foo/'''V'''ector.css .",
'updated' => '(bees na)',
'note' => "'''Karmat :'''",
'previewnote' => "'''Lii ab wonendi rekk la; coppite yi ci xët wi dencagoo leen!'''",
@@ -698,8 +686,6 @@ Te it na wóor ne li nga fiy dugal yaa leen moom, yaa leen bind, walla fa nga le
Soo bëggul keneen jël say mbind soppi leen, tas leen teg ci, bu leen fi dugal.<br />
Te it na wóor ne li nga fiy dugal yaa leen moom, yaa leen bind, walla fa nga leen jële gongikuwaay bu ubbeeku la, lu kenn moomul (xoolal $1 ngir yeneeni xamle).
'''BUL FI DUGAL LIGGÉEYI KENEEN YU AQI AJI-SOS AAR TE AMOO CI BENN NDIGËL!'''",
-'longpagewarning' => "'''Muytul: guddaayu xët wi dafa romb $1 Kio ;
-yenn joowukaay yi, man nañoo wone ay jafe-jafe ci bu ñuy soppi xët yi romb dayoob 32 Kio. Li doon gën mooy nga séddatle ko ci ay xaaj yu bari.'''",
'longpageerror' => "'''NJUUMTE : mbind mi nga yónne guddee na $1 kio, kon romb na dig bi di $2 kio. Mbind mi maneesu kaa denc.'''",
'readonlywarning' => "'''Moytul: dàttub njoxe bi dañu koo caabi ngir ay liggéey,
kon doo man a denc say coppite fi mu nekk nii. Man ngaa duppi mbind mi taf ko cib tëriin bu ñuy binde te taaxirlu ñu ubbi dàttub njoxe bi.'''
@@ -1073,7 +1059,7 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'prefs-advancedrendering' => 'Tànneef yu xóot',
'prefs-advancedsearchoptions' => 'Tànneef yu xóot',
'prefs-advancedwatchlist' => 'Tànneef yu xóot',
-'prefs-display' => 'Tànneefi wonewiin',
+'prefs-displayrc' => 'Tànneefi wonewiin',
'prefs-diffs' => 'Wuute',
# User rights
@@ -1176,7 +1162,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'right-siteadmin' => 'Caabi walla caabeedi dàttub njoxe bi',
'right-reset-passwords' => 'Soppi baatujàllub ay jëfandikukat',
'right-override-export-depth' => 'génne ay xët yu ëmbi xët yu lëkkaloo ba-ci xóotaay bu tolluwaayam àgg 5',
-'right-versiondetail' => 'Wone xamle yu matale ci sumbi tëriin wi',
# User rights log
'rightslog' => 'Sañ-sañi jëfandikukat',
@@ -1224,13 +1209,9 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'recentchanges-legend' => 'tànneefi coppite yu mujj',
'recentchangestext' => 'Toppal ci wii xët coppite yu mujj ci {{SITENAME}}.',
'recentchanges-feed-description' => 'Toppal coppite yu mujj yu bii wiki.',
-'recentchanges-legend-newpage' => '$1 - xët wu bees',
'recentchanges-label-newpage' => 'Coppite gi sos na xët wu bees',
-'recentchanges-legend-minor' => '$1 - Coppite yu néewal',
'recentchanges-label-minor' => 'Coppite gu néewal la',
-'recentchanges-legend-bot' => '$1 - coppiteb bot',
'recentchanges-label-bot' => 'Coppite bu ab bot def',
-'recentchanges-legend-unpatrolled' => '$1 - coppite bees fugluwul',
'recentchanges-label-unpatrolled' => 'Coppite bii kenn fugloogu ko',
'rcnote' => '{{PLURAL:$1|Lii mooy coppite bu mujj bees def|Yii ñooy coppite yu mujj yees def}} ci {{PLURAL:$2|bés bu mujj bi|<b>$2</b> bés yu mujj yi}}; njoxe yi ñoo ngi leen yeesal $5 ci $4.',
'rcnotefrom' => "Yii ñooy coppite yi dalee '''$2''' (ba '''$1''').",
@@ -1317,7 +1298,6 @@ Tànnal weneen tur.",
[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Am na ŋara wu ni tudd ba noppi ci dencuwaayu ŋara bi ñuy bokk; Dellul ginnaaw ngir yeb ŋara wi ak weneen tur. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'ŋara wi ñaaralub {{PLURAL:$1| ŋara wii di toftal la| ŋara yii di toftal lañu}} :',
-'successfulupload' => 'Yeb gi jàll na',
'uploadwarning' => 'Moytul !',
'savefile' => 'Denc dencukaay bi',
'uploadedimage' => 'Yeb na « [[$1]] »',
@@ -1336,6 +1316,7 @@ Tànnal weneen tur.",
Jaar-jaaru far gi man na laa dimbali ci nga see ndaxam jar na nga yebaat ko.",
'filename-bad-prefix' => "Turu dencukaay bi ngay yeb moo ngi tambalee '''\"\$1\"''', te muy tur wu nosukaay bi di joxal boppam nataalukaay yi.
Dila ñaan nga tànn tur wuy faramfacce dencukaay bi.",
+'upload-success-subj' => 'Yeb gi jàll na',
# Special:ListFiles
'imgfile' => 'Dencukaay',
@@ -1454,7 +1435,6 @@ Bul fattee seet baxam amul yeneen lëkkalekaay yu lay jëmale ci royuwaay yi bal
'statistics-edits' => 'Coppitey xët yi dalee ca campug {{SITENAME}}',
'statistics-views-total' => 'Mbooleem saytu yi',
'statistics-views-peredit' => 'Saytu ngir soppi',
-'statistics-jobqueue' => 'Guddaayu [http://www.mediawiki.org/wiki/Manual:Job_queue liggéey] biy xaar',
'statistics-users' => '[[Special:ListUsers|Jëfandikukat]] yi bindu',
'statistics-users-active' => 'Jëfandikukat yu yëngu',
'statistics-users-active-desc' => 'Jëfandikukat yi amal ag yëngu-yëngu ci {{PLURAL:$1|bés bu mujj bi|$1 bés yu mujj yi}}',
@@ -1663,7 +1643,6 @@ Man ngaa fee gis itam [[{{MediaWiki:Listgrouprights-helppage}}|yeneen xibaar]] Ã
# Watchlist
'watchlist' => 'Limu toppte',
'mywatchlist' => 'Limu toppte',
-'watchlistfor' => "(yu jëfandikukat '''$1''')",
'nowatchlist' => 'Sa limu toppte amul benn jukki.',
'watchlistanontext' => 'Ngir mana gis walla soppi jëfkayu sa limu toppte, faw nga $1.',
'watchnologin' => 'Duggoo de',
@@ -1749,7 +1728,9 @@ Ki mujje soppi xët wi mooy [[User:$3|$3]] ([[User talk:$3|Waxtaan]]{{int:pipe-s
'revertpage' => 'Loppantig coppite gu [[Special:Contributions/$2|$2]] ([[User talk:$2|Waxtaan]]) dello ko ci sumb mu [[User:$1|$1]]',
'rollback-success' => 'Ki loppanti mooy $1 ;
Ki ko dello ci sumb mu mujj mi mooy $2.',
-'sessionfailure' => 'Dafa mel ne sa dugg gi am na ay tolof-tolof ;
+
+# Edit tokens
+'sessionfailure' => 'Dafa mel ne sa dugg gi am na ay tolof-tolof ;
Noste gi téye na sag dugg ngir wattu kaaraange.
Di la ñaan nga dellu ginnaaw te yesalaat xët wa jóge, te jéemaat',
@@ -1923,7 +1904,6 @@ Xoolal [[Special:IPBlockList|limu IP yees téye]] ngir gis ñees téye ñépp.',
'ipb-edit-dropdown' => 'Soppi ngirtey téye gi',
'ipb-unblock-addr' => 'Téyedi $1',
'ipb-unblock' => 'Téyedi ab turu jëfandikukat walla ab màkkaanub IP',
-'ipb-blocklist-addr' => 'Téye yi teew yu $1',
'ipb-blocklist' => 'Xool téye yi teew',
'ipb-blocklist-contribs' => 'Cëru yu $1',
'unblockip' => 'Téyedi jëfandikukat bi',
@@ -2208,9 +2188,9 @@ Dafay tax nga man a bind ngirte li ci boyotu tënk bi.',
# Media information
'file-info' => 'Réyaayu file bi : $1, type MIME : $2',
-'file-info-size' => '($1 × $2 pixels, réyaayu file bi : $3, type MIME : $4)',
+'file-info-size' => '$1 × $2 pixels, réyaayu file bi : $3, type MIME : $4',
'file-nohires' => '<small>Amul kem bu ëpp bii bu jàppandi.</small>',
-'svg-long-desc' => '(Dencukaay SVG, kem bu jaadu $1 × $2 pixel, dayoo dencukaay bi: $3)',
+'svg-long-desc' => 'Dencukaay SVG, kem bu jaadu $1 × $2 pixel, dayoo dencukaay bi: $3',
'show-big-image' => 'Ngandalal nataal gii',
'show-big-image-thumb' => '<small>Dayoob wonendi gi : $1 × $2 pixel</small>',
diff --git a/languages/messages/MessagesWuu.php b/languages/messages/MessagesWuu.php
index cee365a3..8f9b31d0 100644
--- a/languages/messages/MessagesWuu.php
+++ b/languages/messages/MessagesWuu.php
@@ -31,7 +31,7 @@ $messages = array(
'tog-editsection' => 'å…许通过点击ã€ç¼–辑】链接æ¥ç¼–辑段è½',
'tog-editsectiononrightclick' => 'å…许å³å‡»æ ‡é¢˜ç¼–辑段è½ï¼ˆJavaScript)',
'tog-showtoc' => '显示目录(针对超过三åªæ ‡é¢˜ä¸ªé¡µé¢ï¼‰',
-'tog-rememberpassword' => '登该å°ç”µè„‘浪记牢我个登录',
+'tog-rememberpassword' => 'æ¥è®¸ç®‡å°ç”µè„‘上记牢我个密ç ï¼ˆå¯ç»´æŒ$1{{PLURAL:$1|æ—¥|æ—¥}})',
'tog-watchcreations' => '拿我创建个页é¢æ·»åŠ åˆ°æˆ‘个监控列表里å‘',
'tog-watchdefault' => '拿我编辑个页é¢æ·»åŠ åˆ°æˆ‘个监控列表里å‘',
'tog-watchmoves' => '拿我移动个页é¢æ·»åŠ åˆ°æˆ‘个监控列表里å‘',
@@ -175,31 +175,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => '加入è¯é¢˜',
-'vector-action-delete' => '删除',
-'vector-action-move' => '移动',
-'vector-action-protect' => 'ä¿æŠ¤',
-'vector-action-undelete' => 'å删除',
-'vector-action-unprotect' => 'åä¿æŠ¤',
-'vector-namespace-category' => '分类',
-'vector-namespace-help' => '帮助页',
-'vector-namespace-image' => '文件',
-'vector-namespace-main' => '页é¢',
-'vector-namespace-media' => '媒体页é¢',
-'vector-namespace-mediawiki' => '讯æ¯',
-'vector-namespace-project' => '项目页é¢',
-'vector-namespace-special' => '特殊页é¢',
-'vector-namespace-talk' => '讨论',
-'vector-namespace-template' => '模æ¿',
-'vector-namespace-user' => '用户页é¢',
-'vector-view-create' => '创建',
-'vector-view-edit' => '编辑',
-'vector-view-history' => '望历å²',
-'vector-view-view' => '阅读',
-'vector-view-viewsource' => '查看æºç ',
-'actions' => '动作',
-'namespaces' => 'å字空间',
-'variants' => 'å˜é‡',
+'vector-action-addsection' => '加入è¯é¢˜',
+'vector-action-delete' => '删除',
+'vector-action-move' => '移动',
+'vector-action-protect' => 'ä¿æŠ¤',
+'vector-action-undelete' => 'å删除',
+'vector-action-unprotect' => 'åä¿æŠ¤',
+'vector-simplesearch-preference' => '打开高级æœç´¢å»ºè®®ï¼ˆä»…适用于Vector皮肤)',
+'vector-view-create' => '创建',
+'vector-view-edit' => '编辑',
+'vector-view-history' => '望历å²',
+'vector-view-view' => '阅读',
+'vector-view-viewsource' => '查看æºç ',
+'actions' => '动作',
+'namespaces' => 'å字空间',
+'variants' => 'å˜é‡',
'errorpagetitle' => '错误',
'returnto' => '回转到$1。',
@@ -412,7 +402,7 @@ $2',
'yourname' => '用户å:',
'yourpassword' => '密ç :',
'yourpasswordagain' => 'å†æ‹ä¸€é密ç :',
-'remembermypassword' => '登该å°ç”µè„‘浪记牢我个登录',
+'remembermypassword' => '垃拉箇部电脑上记牢我个密ç ï¼ˆå¯ç»´æŒ$1{{PLURAL:$1|æ—¥|æ—¥}})',
'yourdomainname' => '侬个域å:',
'externaldberror' => '迭个作兴是由于验è¯æ•°æ®åº“错误或者侬拨ç¦æ­¢æ›´æ–°ä¾¬ä¸ªå¤–部账å·ã€‚',
'login' => '登录',
@@ -429,6 +419,7 @@ $2',
'gotaccount' => "å·²ç»æœ‰ä»”å¸å·å“‰ï¼Ÿ '''$1'''。",
'gotaccountlink' => '登录',
'createaccountmail' => '通过 e-mail',
+'createaccountreason' => 'ç†ç”±ï¼š',
'badretype' => '倷输入个密ç æ­å€ªä¸ªæ¡£æ¡ˆå¼—é…。',
'userexists' => '箇åªIDå·²ç»æ‹¨æ³¨å†Œè„±å“‰ã€‚请é‡æ–°å†æ‹£ä¸ªç”¨æˆ·å。',
'loginerror' => '登录错误',
@@ -530,8 +521,10 @@ $2',
'showlivepreview' => '实时预览',
'showdiff' => '显示改动',
'anoneditwarning' => "'''警告:''' 侬弗曾登录。侬个IP地å€ä¼šå¾—记录拉页é¢ä¸ªç¼–辑历å²é‡Œå‘。",
+'anonpreviewwarning' => "''侬弗曾登录。侬个IPä½å€ä¼šå¾—记录拉此页个编辑历å²é‡Œå‘。''",
'missingsummary' => "'''æ示:''' 侬弗曾æ供编辑摘è¦ã€‚å‡ä½¿ä¾¬å†æ¬¡å•å‡»ä¿å­˜ï¼Œä¾¬ä¸ªç¼–辑将弗带编辑摘è¦ä¿å­˜ã€‚",
'missingcommenttext' => '请垃下头输入备注。',
+'missingcommentheader' => "'''æ示:''' 侬弗曾为此评论æä¾›åªæ ‡é¢˜ã€‚如果侬å†æ¬¡å•å‡»â€œ{{int:savearticle}}â€ï¼Œä¾¬ä¸ªç¼–辑将弗带标题ä¿å­˜ã€‚",
'summary-preview' => '摘è¦é¢„览:',
'subject-preview' => '主题 / 标题 预览:',
'blockedtitle' => '用户拨查å°',
@@ -599,7 +592,7 @@ $2',
'''还弗曾ä¿å­˜ï¼'''",
'userjspreview' => "'''注æ„侬åªæ˜¯åžƒè®¸æµ‹è¯•ï¼é¢„览侬个 JavaScript。'''
'''还弗曾ä¿å­˜ï¼'''",
-'userinvalidcssjstitle' => "'''警告:''' 弗存在皮肤\"\$1\"。注æ„自定义个 .css æ­ .js 页è¦ä½¿ç”¨å°å†™æ ‡é¢˜ï¼Œè­¬å¦‚,{{ns:user}}:Foo/monobook.css å¼—åŒäºŽ {{ns:user}}:Foo/Monobook.css。",
+'userinvalidcssjstitle' => "'''警告:''' 弗存在皮肤\"\$1\"。注æ„自定义个 .css æ­ .js 页è¦ä½¿ç”¨å°å†™æ ‡é¢˜ï¼Œè­¬å¦‚,{{ns:user}}:Foo/vector.css å¼—åŒäºŽ {{ns:user}}:Foo/Vector.css。",
'updated' => '(已更新)',
'note' => "'''注æ„:'''",
'previewnote' => "'''该个还åªæ˜¯é¢„览;改动还朆ä¿å­˜ï¼'''",
@@ -635,8 +628,6 @@ $2',
å‡ä½¿ä¾¬å¼—希望侬个文字畀任æ„修改æ­ä»”å†å‘布,请弗è¦æ交。<br />
侬åŒæ—¶ä¹Ÿè¦å‘我伲ä¿è¯ä¾¬æ交个内容是侬自家所作,或得自一个弗å—版æƒä¿æŠ¤æˆ–相似自由个æ¥æºï¼ˆå‚阅$1个细节)。
''' å¼—è¦åžƒæ‹‰å¼—曾获得授æƒä¸ªæƒ…况下头å‘表ï¼'''",
-'longpagewarning' => "'''警告''':箇页é¢ä¸ªé•¿åº¦æ˜¯$1KB;一些æµè§ˆå™¨åžƒæ‹‰ç¼–辑长度接近或大于32KB个页é¢ä½œå…´å­˜åœ¨é—®é¢˜ã€‚
-侬应该考虑拿箇åªé¡µé¢åˆ†æˆåŠŸæ›´åŠ å°ä¸ªç« èŠ‚。",
'longpageerror' => "'''错误:侬æ交个文本长度有$1KB,大于$2KB个顶大值。'''该文本弗能ä¿å­˜ã€‚",
'readonlywarning' => "'''警告:数æ®åº“é”定垃许维护,侬箇歇弗好ä¿å­˜ä¾¬ä¸ªä¿®æ”¹ã€‚'''侬作兴希望先拿本段文字å¤åˆ¶å¹¶ä¿å­˜åˆ°æ–‡æœ¬æ–‡ä»¶ï¼Œç­‰æ­‡å†ä¿®æ”¹ã€‚
@@ -810,6 +801,8 @@ $1",
'logdelete-failure' => "'''事件个å¯è§æ€§æ— æ³•è®¾ç½®ï¼š'''
$1",
'revdel-restore' => '更改å¯è§æ€§',
+'revdel-restore-deleted' => '已删除个修订版本',
+'revdel-restore-visible' => 'å¯è§ä¸ªä¿®è®¢ç‰ˆæœ¬',
'pagehist' => '页é¢åŽ†å²',
'deletedhist' => '已删除之历å²',
'revdelete-content' => '内容',
@@ -912,6 +905,7 @@ $1",
'searchprofile-everything-tooltip' => 'æœç´¢å…¨éƒ¨ï¼ˆåŒ…括讨论页é¢ï¼‰',
'searchprofile-advanced-tooltip' => '垃拉自定义å字空间里å‘æœç´¢',
'search-result-size' => '$1($2字)',
+'search-result-category-size' => '$1ä½æˆå‘˜ï¼ˆ$2个å­åˆ†ç±»ï¼Œ$3个文件)',
'search-result-score' => '相关度:$1%',
'search-redirect' => '(é‡å®šå‘ $1)',
'search-section' => 'ï¼ˆæ®µè½ $1)',
@@ -1083,34 +1077,34 @@ $1",
'recentchangeslinked-to' => '显示链接到指定页é¢ä¸ªé¡µé¢ä¸ªæ”¹åŠ¨',
# Upload
-'upload' => '上载文物',
-'uploadbtn' => '上载文件',
-'uploadnologin' => '朆登录',
-'uploadnologintext' => '倷æ¿å®šè¦[[Special:UserLogin|登录]]ä»”å†å¥½ä¸Šè½½æ–‡ä»¶ã€‚',
-'uploaderror' => '上载出错',
-'uploadtext' => "拿下头åªè¡¨æ ¼æ¥ä¸Šè½½æ–‡ä»¶ã€‚è¦æŸ¥çœ‹æˆ–者æœå¯»ä¹‹å‰ä¸Šè½½ä¸ªå›¾ç‰‡ä¸ªè¯´æ³•ï¼Œè¯·åˆ°[[Special:FileList|已上载文件列表]],上载æ­ä»”删脱也记录勒拉[[Special:Log/upload|上载日志]]里å‘。
+'upload' => '上载文物',
+'uploadbtn' => '上载文件',
+'uploadnologin' => '朆登录',
+'uploadnologintext' => '倷æ¿å®šè¦[[Special:UserLogin|登录]]ä»”å†å¥½ä¸Šè½½æ–‡ä»¶ã€‚',
+'uploaderror' => '上载出错',
+'uploadtext' => "拿下头åªè¡¨æ ¼æ¥ä¸Šè½½æ–‡ä»¶ã€‚è¦æŸ¥çœ‹æˆ–者æœå¯»ä¹‹å‰ä¸Šè½½ä¸ªå›¾ç‰‡ä¸ªè¯´æ³•ï¼Œè¯·åˆ°[[Special:FileList|已上载文件列表]],上载æ­ä»”删脱也记录勒拉[[Special:Log/upload|上载日志]]里å‘。
è¦å‹’拉页é¢é‡Œå‘摆进图片个说法,用下头该ç§å½¢å¼ä¸ªé“¾æŽ¥
'''<nowiki>[[{{ns:file}}:文件.jpg]]</nowiki>''',
'''<nowiki>[[{{ns:file}}:文件.png|替代文本]]</nowiki>''' 或者用
'''<nowiki>[[{{ns:media}}:文件.ogg]]</nowiki>''' 直接链到文件。",
-'uploadlog' => '文件上载日志',
-'uploadlogpage' => '文件上载日志',
-'uploadlogpagetext' => '下底是最近上载文件列表。',
-'filename' => '文件å',
-'filedesc' => 'å°ç»“',
-'fileuploadsummary' => 'å°ç»“:',
-'filestatus' => '版æƒçŠ¶æ€:',
-'filesource' => 'æ¥æº:',
-'uploadedfiles' => 'å·²ç»ä¸Šè½½ä¸ªæ–‡ä»¶',
-'ignorewarning' => '弗管警告,éšä¾¿å“ªäº¨è¦ä¿å­˜æ–‡ä»¶ã€‚',
-'successfulupload' => '上载æˆåŠŸå“‰',
-'uploadwarning' => '上载警告',
-'savefile' => 'ä¿å­˜æ–‡ä»¶',
-'uploadedimage' => '上载 "[[$1]]"',
-'sourcefilename' => 'æºæ–‡ä»¶:',
-'destfilename' => '目标文件å:',
-'watchthisupload' => '监控该åªé¡µé¢',
+'uploadlog' => '文件上载日志',
+'uploadlogpage' => '文件上载日志',
+'uploadlogpagetext' => '下底是最近上载文件列表。',
+'filename' => '文件å',
+'filedesc' => 'å°ç»“',
+'fileuploadsummary' => 'å°ç»“:',
+'filestatus' => '版æƒçŠ¶æ€:',
+'filesource' => 'æ¥æº:',
+'uploadedfiles' => 'å·²ç»ä¸Šè½½ä¸ªæ–‡ä»¶',
+'ignorewarning' => '弗管警告,éšä¾¿å“ªäº¨è¦ä¿å­˜æ–‡ä»¶ã€‚',
+'uploadwarning' => '上载警告',
+'savefile' => 'ä¿å­˜æ–‡ä»¶',
+'uploadedimage' => '上载 "[[$1]]"',
+'sourcefilename' => 'æºæ–‡ä»¶:',
+'destfilename' => '目标文件å:',
+'watchthisupload' => '监控该åªé¡µé¢',
+'upload-success-subj' => '上载æˆåŠŸå“‰',
# Special:ListFiles
'listfiles_search_for' => '寻图片åå­—:',
@@ -1252,7 +1246,6 @@ $1",
# Watchlist
'watchlist' => '监控列表',
'mywatchlist' => '我个监控列表',
-'watchlistfor' => "('''$1'''个监控列表)",
'nowatchlist' => '倷个监控列表是空个。',
'watchnologin' => '朆登录',
'addedwatch' => '加到监控列表哉',
@@ -1523,9 +1516,9 @@ $1",
'nextdiff' => '新版→',
# Media information
-'file-info-size' => '($1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4)',
+'file-info-size' => '$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4',
'file-nohires' => '<small>无更高分辨率å¯æ供。</small>',
-'svg-long-desc' => '(SVG文件,å义大å°ï¼š$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3)',
+'svg-long-desc' => 'SVG文件,å义大å°ï¼š$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3',
'show-big-image' => '完整分辨率',
'show-big-image-thumb' => '<small>迭幅缩略图个分辨率:$1×$2åƒç´ </small>',
diff --git a/languages/messages/MessagesXal.php b/languages/messages/MessagesXal.php
index 6871838a..6f9d85e2 100644
--- a/languages/messages/MessagesXal.php
+++ b/languages/messages/MessagesXal.php
@@ -27,7 +27,7 @@ $namespaceNames = array(
NS_FILE_TALK => 'Боомгин_туÑк_меткән',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_туÑк_меткән',
- NS_TEMPLATE => 'Зура',
+ NS_TEMPLATE => 'Кевләр',
NS_TEMPLATE_TALK => 'Зуран_туÑк_меткән',
NS_HELP => 'Цәәлһлһн',
NS_HELP_TALK => 'Цәәлһлһин_туÑк_меткән',
@@ -44,6 +44,7 @@ $namespaceAliases = array(
'Зург' => NS_FILE,
'Зургин_туÑкар_ухалвр' => NS_FILE_TALK,
'MediaWiki_туÑкар_ухалвр' => NS_MEDIAWIKI_TALK,
+ 'Зура' => NS_TEMPLATE,
'Зуран_туÑкар_ухалвр' => NS_TEMPLATE_TALK,
'Цəəлһлһн' => NS_HELP,
'Цəəлһлһин_туÑкар_ухалвр' => NS_HELP_TALK,
@@ -67,8 +68,7 @@ $messages = array(
'tog-editsection' => '«Чиклх» заавр болвчн хүвд үзүлх',
'tog-editsectiononrightclick' => 'Һарчига барун индÑтлһар хүвиг чиклх (JavaScript кергтә)',
'tog-showtoc' => 'Һарг үзүлх (3 икәр толһата халхÑд)',
-'tog-rememberpassword' => 'Ðамаг Ñн тоолдврд тодлх',
-'tog-editwidth' => 'Чикллһнә тег цуг харата болулх',
+'tog-rememberpassword' => 'Ðамаг Ñн тоолдврт тодлх ($1 {{PLURAL:$1|өдрт|өдрмүдт}} икәр биш)',
'tog-watchcreations' => 'Би Ñврәннь немгдÑн Ñ…Ð°Ð»Ñ…Ñ ÑˆÐ¸Ð½Ò—Ð»Ð»Ò»Ð½Ó™ Ñеткүлд немх',
'tog-watchdefault' => 'Би Ñврәннь чиклÑн Ñ…Ð°Ð»Ñ…Ñ ÑˆÐ¸Ð½Ò—Ð»Ð»Ò»Ð½Ó™ Ñеткүлд немх',
'tog-watchmoves' => 'Би Ñврәннь көндÑн Ñ…Ð°Ð»Ñ…Ñ ÑˆÐ¸Ð½Ò—Ð»Ð»Ò»Ð½Ó™ Ñеткүлд немх',
@@ -212,31 +212,20 @@ $messages = array(
'faqpage' => 'Project:Юм би',
# Vector skin
-'vector-action-addsection' => 'Төриг немх',
-'vector-action-delete' => 'Һарһх',
-'vector-action-move' => 'Көндәх',
-'vector-action-protect' => 'ХарÑÑ…',
-'vector-action-undelete' => 'Һарһх биш',
-'vector-action-unprotect' => 'ХарÑÑ… биш',
-'vector-namespace-category' => 'Әәшл',
-'vector-namespace-help' => 'Цәәлһлһнә халх',
-'vector-namespace-image' => 'Боомг',
-'vector-namespace-main' => 'Халх',
-'vector-namespace-media' => 'Ðһарин халх',
-'vector-namespace-mediawiki' => 'Зәңг',
-'vector-namespace-project' => 'ТөÑлин халх',
-'vector-namespace-special' => 'Көдлхнә халх',
-'vector-namespace-talk' => 'Меткән',
-'vector-namespace-template' => 'Кевләр',
-'vector-namespace-user' => 'Демнчна халх',
-'vector-view-create' => 'Бүтәх',
-'vector-view-edit' => 'Чиклх',
-'vector-view-history' => 'Тууҗин хәләвр',
-'vector-view-view' => 'Умшлһн',
-'vector-view-viewsource' => 'Темдгллһнә хәләвр',
-'actions' => 'Үүлд',
-'namespaces' => 'Ðернә уÑ',
-'variants' => 'СуңһлтÑ',
+'vector-action-addsection' => 'Төриг немх',
+'vector-action-delete' => 'Һарһх',
+'vector-action-move' => 'Көндәх',
+'vector-action-protect' => 'ХарÑÑ…',
+'vector-action-undelete' => 'Һарһх биш',
+'vector-action-unprotect' => 'ХарÑÑ… биш',
+'vector-view-create' => 'Бүтәх',
+'vector-view-edit' => 'Чиклх',
+'vector-view-history' => 'Тууҗин хәләвр',
+'vector-view-view' => 'Умшлһн',
+'vector-view-viewsource' => 'Темдгллһнә хәләвр',
+'actions' => 'Үүлд',
+'namespaces' => 'Ðернә уÑ',
+'variants' => 'СуңһлтÑ',
'errorpagetitle' => 'Эндү',
'returnto' => '«$1» тал хәрү ирх.',
@@ -424,7 +413,7 @@ $1',
'yourname' => 'Демнчна нернь:',
'yourpassword' => 'Ðууц үг:',
'yourpasswordagain' => 'Ðууц үгиг давтн:',
-'remembermypassword' => 'Мини нерн Ñн тоолдврд тодлх',
+'remembermypassword' => 'Ðамаг Ñн тоолдврд тодлх ($1 {{PLURAL:$1|өдрт|өдрмүдт}} икәр биш)',
'yourdomainname' => 'Тана домен:',
'login' => 'Орлһн',
'nav-login-createaccount' => 'Харһх / бичгдлһн кех',
@@ -522,7 +511,7 @@ $1',
'userjsyoucanpreview' => "'''Селвг:''' тана шин JS боомг шүүҗ хадһлар, «{{int:showpreview}}» товч олзлтн.",
'usercsspreview' => "'''Тана CSS боомгин мел хәләвр бәәдг туÑкар тодлтн, тер ода чигн хадһлÑн уга!'''",
'userjspreview' => "'''Тана JavaScript боомгин мел хәләвр бәәдг туÑкар тодлтн. Тана Ñольлһн ода чигн хадһлÑн уга!'''",
-'userinvalidcssjstitle' => "'''Оньг өгтн:''' «$1» гидг нерәдлһтә хувцнь олҗ биш. Күүнә .css болн .js Ñ…Ð°Ð»Ñ…Ñ Ò»Ð°Ð½Ñ†Ñ…Ð½ бичкн үзгүдтә бичÑн кергтә, үлгүрнь «{{ns:user}}:Болвчн/monobook.css»; «{{ns:user}}:Болвчн/Monobook.css» - буру.",
+'userinvalidcssjstitle' => "'''Оньг өгтн:''' «$1» гидг нерәдлһтә хувцнь олҗ биш. Күүнә .css болн .js Ñ…Ð°Ð»Ñ…Ñ Ò»Ð°Ð½Ñ†Ñ…Ð½ бичкн үзгүдтә бичÑн кергтә, үлгүрнь «{{ns:user}}:Болвчн/vector.css»; «{{ns:user}}:Болвчн/Vector.css» - буру.",
'updated' => '(ШинрүлÑн)',
'note' => "'''Ðҗгллһн:'''",
'previewnote' => "'''Эн мел хәләвр бәәдг туÑкар тодлтн.'''
@@ -750,12 +739,8 @@ $1',
'recentchanges-legend' => 'Шидрә Ñольлһна көгүд',
'recentchangestext' => 'Эн цагин дараһар бичÑн шидрә Ñольлһн',
'recentchanges-feed-description' => 'Эн зәңгллһд шидрә хүврһд шинҗлх.',
-'recentchanges-label-legend' => 'Тәәлвр: $1.',
-'recentchanges-legend-newpage' => '$1 — шин халх',
'recentchanges-label-newpage' => 'Тер үүләр шин халх бүтәв',
-'recentchanges-legend-minor' => '$1 — баһ Ñольлһн',
'recentchanges-label-minor' => 'Эн баһ чинртә Ñольлһн',
-'recentchanges-legend-bot' => '$1 — көдлврә Ñольлһн',
'recentchanges-label-bot' => 'Эн Ñольлһн көдлвр (робот) кехв',
'rcnote' => "{{PLURAL:$1|'''$1''' шидрә Ñольлһн|'''$1''' шидрә Ñольлһн|'''$1''' шидрә Ñольлһн}}, '''$2''' өдрә, $5 $4 цагин.",
'rclistfrom' => 'Тер Ñ†Ð°Ð³Ð°Ñ Ð°Ð²Ð½ Ñольлһн үзүлх: $1.',
@@ -788,17 +773,17 @@ $1',
'recentchangeslinked-to' => 'Зөрүһәр, Ñн халхд заалдг халхÑин хүврлһиг үзүлх',
# Upload
-'upload' => 'Боомгиг тәвх',
-'uploadbtn' => 'Боомгиг тәвх',
-'uploadnologintext' => 'Та [[Special:UserLogin|харһх]] кергтә.',
-'uploaderror' => 'Тәвллһнә Ñндү',
-'uploadlogpage' => 'Тәвллһнә Ñеткүл',
-'filename' => 'Боомгна нернь',
-'filedesc' => 'Учр-утх',
-'fileuploadsummary' => 'Учр-утх:',
-'successfulupload' => 'Йовудта тәвллһн',
-'savefile' => 'Хадһлх',
-'uploadedimage' => '«[[$1]]» тәвв',
+'upload' => 'Боомгиг тәвх',
+'uploadbtn' => 'Боомгиг тәвх',
+'uploadnologintext' => 'Та [[Special:UserLogin|харһх]] кергтә.',
+'uploaderror' => 'Тәвллһнә Ñндү',
+'uploadlogpage' => 'Тәвллһнә Ñеткүл',
+'filename' => 'Боомгна нернь',
+'filedesc' => 'Учр-утх',
+'fileuploadsummary' => 'Учр-утх:',
+'savefile' => 'Хадһлх',
+'uploadedimage' => '«[[$1]]» тәвв',
+'upload-success-subj' => 'Йовудта тәвллһн',
'license' => 'Закан:',
'license-header' => 'Закан:',
@@ -848,7 +833,6 @@ $1',
'statistics-edits-average' => 'Халхарн Ñольлһна то',
'statistics-views-total' => 'Цуг хәләврин то',
'statistics-views-peredit' => 'Сольлһарн хәләврин то',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue Даалһврин дарана] кемҗән',
'statistics-users' => 'Бичгдлһтә [[Special:ListUsers|демнчнр]]',
'statistics-users-active' => 'Үүлтә демнчнр',
'statistics-users-active-desc' => '{{PLURAL:$1|$1 өдрт|$1 өдрмүдт|$1 өдрмүдт}} болв чигн үүл кеÑн демнчнр',
@@ -900,7 +884,6 @@ $1',
# Watchlist
'watchlist' => 'Шинҗллһнә Ñеткүл',
'mywatchlist' => 'Шинҗллһнә Ñеткүл',
-'watchlistfor' => "('''$1''' төлә)",
'addedwatch' => 'Шинҗллһнә Ñеткүлд немв.',
'addedwatchtext' => "«[[:$1]]» гидг нерәдлһтә халх тана [[Special:Watchlist|шинҗллһнә Ñеткүлд]] немв.
Тегәд тер халхна болн терүнә ухалврин Ñольлһн Ñнд шиҗлÑн болх. Эн халх '''тарһн'' үзгәр [[Special:RecentChanges|шидрә Ñольлһна]] халхд бичÑн (амр умшхар) болх.",
@@ -1166,10 +1149,10 @@ $2 шидрә һарһлһна төлә хәләтн.',
'nextdiff' => 'Дарук Ñольлһн →',
# Media information
-'file-info' => '(боомгин кемҗә: $1, MIME төрл: $2)',
-'file-info-size' => '($1 × $2 цегтә, боомгин кемҗән: $3, MIME Ñнз: $4)',
+'file-info' => 'боомгин кемҗә: $1, MIME төрл: $2',
+'file-info-size' => '$1 × $2 цегтә, боомгин кемҗән: $3, MIME Ñнз: $4',
'file-nohires' => '<small>Икәр чинртә Ñнз уга.</small>',
-'svg-long-desc' => '(SVG боомг, $1 × $2 мет цегтә, боомгин кемҗән: $3)',
+'svg-long-desc' => 'SVG боомг, $1 × $2 мет цегтә, боомгин кемҗән: $3',
'show-big-image' => 'Күцц чинр',
'show-big-image-thumb' => '<small>УрдаÑнь хәләврин кемҗән: $1 × $2 цегтә</small>',
'file-info-gif-looped' => 'билцгÑн',
diff --git a/languages/messages/MessagesXh.php b/languages/messages/MessagesXh.php
index 8d9580af..c5946608 100644
--- a/languages/messages/MessagesXh.php
+++ b/languages/messages/MessagesXh.php
@@ -88,7 +88,7 @@ I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENA
'yourname' => 'Igama lelungu:',
'yourpassword' => 'Igama elifihlakeleyo lelungu:',
'yourpasswordagain' => 'Faka kwakhona igama elifihlakeleyo:',
-'remembermypassword' => 'Khumbula igama lam elifihlakeleyo kule Khompyutha',
+'remembermypassword' => 'Khumbula igama lam elifihlakeleyo kule Khompyutha (for a maximum of $1 {{PLURAL:$1|day|days}})',
'createaccount' => 'Vula I Account',
'loginlanguagelabel' => 'Ulwimi: $1',
diff --git a/languages/messages/MessagesXmf.php b/languages/messages/MessagesXmf.php
index 30a8154a..feb5f7e5 100644
--- a/languages/messages/MessagesXmf.php
+++ b/languages/messages/MessagesXmf.php
@@ -23,12 +23,21 @@ $fallback = 'ka';
$messages = array(
# User preference toggles
-'tog-underline' => 'რცხიეფს თუდრქუდუჸნე ღáƒáƒ–ი:',
-'tog-highlightbroken' => 'ქáƒáƒáƒ«áƒ˜áƒ áƒ˜ ვáƒáƒáƒ áƒáƒ áƒ¡áƒ”ბულ ბუნილეფ <a href="" class="new">მუჭáƒáƒ— თენáƒ</a> (áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ•áƒ: მუჭáƒáƒ— თენáƒ<a href="" class="internal">?</a>).',
-'tog-justify' => 'გáƒáƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ’რáƒáƒ¤áƒ”ფ',
-'tog-hideminor' => 'დáƒáƒ©áƒ£áƒšáƒ˜ ჭიჭე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრბáƒáƒšáƒ თირáƒáƒ¤áƒ”ფს',
-'tog-showtoolbar' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨ ინსტრუმენტეფიშ ძირáƒáƒ¤áƒ (ჯáƒáƒ•áƒáƒ¡áƒ™áƒ áƒ˜áƒžáƒ¢)',
-'tog-showhiddencats' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ ფულირი კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ფი',
+'tog-underline' => 'რცხუეფიშ áƒáƒ—áƒáƒ¦áƒáƒ–უáƒ:',
+'tog-highlightbroken' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ მესáƒáƒ¤áƒ˜áƒš რცხუეფი <a href="" class="new">მუჭáƒáƒ— თენáƒ</a> (áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ•áƒ: მუჭáƒáƒ— თენáƒ<a href="" class="internal">?</a>).',
+'tog-justify' => 'გáƒáƒ›áƒáƒœáƒ’ი áƒáƒ‘ზáƒáƒªáƒ”ფი',
+'tog-hideminor' => 'დáƒáƒ¤áƒ£áƒšáƒ˜ ციქრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ ეკáƒáƒœáƒ˜áƒ თირáƒáƒ¤áƒ”ფს',
+'tog-hidepatrolled' => 'დáƒáƒ¤áƒ£áƒšáƒ˜áƒ— პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფი áƒáƒ¡áƒ”რდეიáƒáƒœ თირáƒáƒ¤áƒ”ფს',
+'tog-newpageshidepatrolled' => 'დáƒáƒ¤áƒ£áƒšáƒ˜áƒ— პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულ ხáƒáƒ¡áƒ·áƒšáƒ”ფი áƒáƒ®áƒáƒš ხáƒáƒ¡áƒ·áƒšáƒ”ფიშ ერკებულშე',
+'tog-extendwatchlist' => 'გáƒáƒ¤áƒáƒ©áƒ˜ áƒáƒ—áƒáƒ¸áƒ£áƒ¯áƒ” ერკებული áƒáƒ áƒ«áƒ თირáƒáƒ¤áƒ”ფიშ áƒáƒ«áƒ˜áƒ áƒáƒ¤áƒáƒšáƒ, áƒáƒ›áƒáƒ áƒ“ეიáƒáƒœ თირáƒáƒ¤áƒ”ფიშ მეკáƒáƒ áƒáƒªáƒ®áƒ˜áƒšáƒ',
+'tog-usenewrc' => 'გეგმირინე ეკáƒáƒœáƒ˜áƒ თირáƒáƒ¤áƒ”ფიშ უჯგუში ერკებული (ითხინს JavaScript-ის)',
+'tog-numberheadings' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ დáƒáƒœáƒáƒ›áƒ”რე დუდჯáƒáƒ®áƒáƒ”ფი',
+'tog-showtoolbar' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨ ხეჭკუდეფიშ ძირáƒáƒ¤áƒ (ითხინს JavaScript-ის)',
+'tog-editondblclick' => 'ხáƒáƒ¡áƒ·áƒšáƒ”ფიშ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ ჟირმáƒáƒœáƒ’ი გეწკáƒáƒœáƒ¢áƒáƒ¤áƒáƒ— (ითხინს JavaScript-ის)',
+'tog-editsection' => 'ჩáƒáƒ áƒ—ი სექციáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ [რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨] რცხუეფით',
+'tog-editsectiononrightclick' => 'ჩáƒáƒ áƒ—ი სექციáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ სექციáƒáƒ¨ ჯáƒáƒ®áƒáƒ¨áƒ მáƒáƒ áƒ«áƒ’ვáƒáƒœ გეწკáƒáƒœáƒ¢áƒáƒ¤áƒáƒ— (ითხინს JavaScript-ის)"',
+'tog-showtoc' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ გჷშáƒáƒ’áƒáƒ áƒáƒšáƒ˜ (სუმშე უმáƒáƒ¡ დუდჯáƒáƒ®áƒáƒáƒ› ხáƒáƒ¡áƒ·áƒšáƒ”ფშáƒ)',
+'tog-showhiddencats' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ ფულირი კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ფი',
'underline-always' => 'ირáƒ',
'underline-never' => 'შურáƒ',
@@ -99,7 +108,9 @@ $messages = array(
'hidden-category-category' => 'ფულირი კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ფი',
'category-subcat-count' => '{{PLURAL:$2|თე კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ იკáƒáƒ—უáƒáƒœáƒ¡ ხვáƒáƒšáƒ” áƒáƒ—ე გიმენკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¡.|თე კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¡ მáƒáƒ©áƒáƒ›áƒ˜áƒšáƒ˜ რე $1 გიმენკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ $2-შე.}}',
'category-article-count' => '{{PLURAL:$2|áƒáƒ—ე კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ იკáƒáƒ—უáƒáƒœáƒ¡ ხვáƒáƒšáƒ” გეჸვენჯ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¡.|გეჸვენჯ {{PLURAL:$1|ხáƒáƒ¡áƒ˜áƒšáƒ რე|$1 ხáƒáƒ¡áƒ˜áƒšáƒ”ფ რე}} თე კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¡, გვáƒáƒšáƒ $2–შე.}}',
+'category-file-count' => '{{PLURAL:$2|თე კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¡ ხვáƒáƒšáƒ” áƒáƒ—ე გეჸვენჯი ფáƒáƒ˜áƒšáƒ˜ რე.|თე კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¡ რე გეჸვენჯი $1, áƒáƒ áƒ—áƒáƒ˜áƒáƒœáƒ $2-შე.}}',
'listingcontinuesabbrev' => 'გინძáƒáƒ .',
+'noindex-category' => 'ხáƒáƒ¡áƒ·áƒšáƒ”ფი ინდექსირáƒáƒ¤áƒáƒ¨ უმუშáƒ',
'about' => '-შენი',
'article' => 'სტáƒáƒ¢áƒ˜áƒ',
@@ -118,14 +129,21 @@ $messages = array(
'qbpageinfo' => 'კáƒáƒœáƒ¢áƒ”ქსტ',
'qbmyoptions' => 'ჩქიმ ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'qbspecialpages' => 'სპეციáƒáƒšáƒ£áƒ  ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
+'faq' => 'ბხშირი კითხვეფი',
# Vector skin
-'vector-namespace-category' => 'კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ',
-'vector-namespace-main' => 'ხáƒáƒ¡áƒ˜áƒšáƒ',
-'vector-namespace-special' => 'სპეციáƒáƒšáƒ£áƒ áƒ˜ ხáƒáƒ¡áƒ˜áƒšáƒ',
-'vector-view-create' => 'დáƒáƒ áƒ¡áƒ®áƒ£áƒáƒ¤áƒ',
-'vector-view-edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
-'vector-view-viewsource' => 'ქიძირე წყუ',
+'vector-action-addsection' => 'თემáƒáƒ¨ მიშáƒáƒ«áƒ˜áƒœáƒ',
+'vector-action-delete' => 'ლáƒáƒ¡áƒ£áƒ',
+'vector-action-move' => 'გინáƒáƒ¦áƒáƒšáƒ',
+'vector-action-protect' => 'თხილუáƒ',
+'vector-view-create' => 'დáƒáƒ áƒ¡áƒ®áƒ£áƒáƒ¤áƒ',
+'vector-view-edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
+'vector-view-history' => 'ისტáƒáƒ áƒ˜áƒáƒ¨ ძირáƒáƒ¤áƒ',
+'vector-view-view' => 'კითხირი',
+'vector-view-viewsource' => 'ქიძირე წყუ',
+'actions' => 'მáƒáƒ¥áƒ›áƒ”დáƒáƒšáƒ”ფი',
+'namespaces' => 'ჯáƒáƒ®áƒáƒ”ფიშ áƒáƒ¤áƒ˜áƒ áƒ©áƒ',
+'variants' => 'ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ფი',
'errorpagetitle' => 'ჩილáƒáƒ—áƒ',
'returnto' => 'დირთი $1-შáƒ',
@@ -159,7 +177,7 @@ $messages = array(
'otherlanguages' => 'შხვრნინეფს',
'redirectedfrom' => '(გიáƒáƒœáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ˜áƒš რე $1-იშე)',
'redirectpagesub' => 'ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ გინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ',
-'lastmodifiedat' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¥ ეკáƒáƒœáƒ˜áƒáƒ¡ გეáƒáƒ®áƒáƒšáƒ£ $2-ს (თáƒáƒ áƒ˜áƒ¦), $1-ის (სáƒáƒáƒ—ი).',
+'lastmodifiedat' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¥ ეკáƒáƒœáƒ˜áƒáƒ¡ გეáƒáƒ®áƒáƒšáƒ£ $2-ს, $1-ის.',
'jumpto' => 'გეგნáƒáƒ áƒ—ი:',
'jumptonavigation' => 'ნáƒáƒ•áƒ˜áƒ’áƒáƒªáƒ˜áƒ',
'jumptosearch' => 'გáƒáƒ áƒ£áƒ',
@@ -176,7 +194,7 @@ $messages = array(
'edithelp' => 'მáƒáƒ®áƒ•áƒáƒ áƒ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¡',
'edithelppage' => 'Help:ტექსტიშ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
'helppage' => 'Help:დინáƒáƒ áƒ”',
-'mainpage' => 'დუდ ხáƒáƒ¡áƒ˜áƒšáƒ',
+'mainpage' => 'დუდ ხáƒáƒ¡áƒ·áƒšáƒ',
'mainpage-description' => 'დუდ ხáƒáƒ¡áƒ˜áƒšáƒ',
'portal' => 'სáƒáƒ–áƒáƒ’áƒáƒ“áƒáƒ”ბáƒáƒ¨ ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'portal-url' => 'Project:სáƒáƒ–áƒáƒ’áƒáƒ“áƒáƒ”ბáƒáƒ¨ ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
@@ -192,6 +210,7 @@ $messages = array(
'newmessagesdifflink' => 'ეკáƒáƒœáƒ˜áƒ თირáƒáƒ¤áƒ',
'editsection' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
'editold' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
+'viewsourceold' => 'წყუშ ძირáƒáƒ¤áƒ',
'editlink' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
'viewsourcelink' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ წყუ',
'editsectionhint' => 'სექციáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ: $1',
@@ -234,16 +253,18 @@ $messages = array(
# Login and logout pages
'yourname' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ ჯáƒáƒ®áƒ:',
'yourpassword' => 'პáƒáƒ áƒáƒš',
-'remembermypassword' => 'ქიმკáƒáƒ›áƒ˜áƒ¬áƒáƒœáƒ˜',
+'yourpasswordagain' => 'კჷნე გეკáƒáƒ áƒáƒ‘ით პáƒáƒ áƒáƒšáƒ˜:',
+'remembermypassword' => 'ქჷდემáƒáƒ®áƒ¡áƒáƒ•áƒ  ჩქიმ მიშულრáƒáƒ—ე ბრáƒáƒ£áƒ–ერშრ(მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღáƒáƒ¡|დღáƒáƒ¡}})',
'yourdomainname' => 'თქვáƒáƒœ დáƒáƒ›áƒ”ნ',
'login' => 'მიშულáƒ',
'nav-login-createaccount' => 'მინულáƒ/áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¨ გáƒáƒœáƒ¬áƒ§áƒ£áƒ›áƒ',
-'loginprompt' => 'ვიკიპედიáƒáƒ¨áƒ მიშáƒáƒ£áƒšáƒáƒ áƒ áƒáƒ®áƒ•áƒ˜áƒšáƒ£áƒ— კუკიშ გáƒáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¡.',
+'loginprompt' => '{{SITENAME}}-შრმიშáƒáƒ£áƒšáƒáƒ áƒ áƒáƒ®áƒ•áƒ˜áƒšáƒ£áƒ— ეკáƒáƒ™áƒ˜áƒšáƒ”ფიშ (cookies) გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒáƒ¤áƒáƒ¡.',
'userlogin' => 'მიშულáƒ/áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¨ გáƒáƒœáƒ¬áƒ§áƒ£áƒ›áƒ',
'logout' => 'გიშულáƒ',
'userlogout' => 'გიშულáƒ',
-'nologin' => "დიáƒáƒ áƒ“ე ვáƒáƒ áƒ”თ რეგისტრირებულ? '''$1'''.",
+'nologin' => 'დიáƒáƒ áƒ“ე ვáƒáƒ áƒ”თრრეგისტრირებულ? $1.',
'nologinlink' => 'გáƒáƒœáƒ¬áƒ§áƒ˜áƒ— áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨',
+'createaccount' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¨ გáƒáƒœáƒ¬áƒ§áƒ£áƒ›áƒ',
'gotaccount' => "უკვე რეგისტრირებულ რეთ? '''$1'''",
'gotaccountlink' => 'მინულáƒ',
'loginsuccess' => "'''áƒáƒ¡áƒ” მიშულირ რეთ {{SITENAME}}-ს მუჭáƒáƒ— \"\$1\".'''",
@@ -304,6 +325,8 @@ $messages = array(
თქვრშეილებუნრ[[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>."',
'previewnote' => "'''რშუდáƒáƒœ თენრრე ხვáƒáƒšáƒ” გიწáƒáƒ—áƒáƒšáƒáƒ áƒáƒ¤áƒ'''
თქვáƒáƒœ თირáƒáƒ¤áƒ”ფ დირვრრე ჩუáƒáƒšáƒ˜áƒ !",
'editing' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ $1',
@@ -320,10 +343,18 @@ $messages = array(
'hiddencategories' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒ áƒáƒ™áƒáƒ—უ {{PLURAL:$1|1 ტყáƒáƒ‘ინáƒáƒ¤áƒ˜áƒš კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¡|$1 ტყáƒáƒ‘ინáƒáƒ¤áƒ˜áƒš კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ფს}}:',
'nocreatetext' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¡ ვრშილებე áƒáƒ®áƒáƒš ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ გექიმინურდáƒáƒ áƒªáƒ®áƒ£áƒáƒ¤áƒ˜áƒš ვáƒáƒ áƒ˜áƒáƒ¨ გეშáƒ. თქვრშეგილებუნრკინáƒáƒ áƒ—რდრგექიმინელ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ, ვáƒáƒ áƒ [[სპეციáƒáƒšáƒ£áƒ :Userlogin|მიშულრდრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¨ დáƒáƒ áƒªáƒ®áƒ£áƒáƒ¤áƒ]]',
'permissionserrorstext-withaction' => 'თქვრვრგიღუნრ$2–იშ ღáƒáƒšáƒáƒ›áƒáƒ¨ áƒáƒšáƒáƒ‘რთე გეჸვენჯი {{PLURAL:$1|სáƒáƒ›áƒáƒœáƒ¯áƒ”ლით|სáƒáƒ›áƒáƒœáƒ¯áƒ”ლეფით}}:',
-'recreate-moveddeleted-warn' => "'''გáƒáƒ áƒ—ხილებáƒ: თქვრკინე áƒáƒ®áƒáƒšáƒ¨áƒ დუთმáƒáƒ áƒªáƒ®áƒ£áƒáƒœáƒ— ხáƒáƒ¡áƒ˜áƒšáƒáƒ¡, ნáƒáƒ›áƒ£áƒ¥áƒ£áƒ— áƒáƒ áƒ“რილáƒáƒ¡áƒ£áƒœ'''
+'recreate-moveddeleted-warn' => "'''გáƒáƒ áƒ—ხილებáƒ: თქვრკინე áƒáƒ®áƒáƒšáƒ¨áƒ áƒáƒ áƒ¡áƒ®áƒ£áƒáƒœáƒ— ხáƒáƒ¡áƒ·áƒšáƒáƒ¡, ნáƒáƒ›áƒ£áƒ¥áƒ·áƒ— ლáƒáƒ¡áƒ˜áƒ áƒ¥ იჸუ áƒáƒ¬áƒáƒ®áƒáƒšáƒ”'''
-რთხინთ, დეფირქáƒáƒ—, მისáƒáƒ¦áƒ”ფ რე დრვáƒáƒ  თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨ გáƒáƒ’ინძáƒáƒ áƒáƒ¤áƒ.
-ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ¨áƒ თუდáƒáƒšáƒ” მáƒáƒ©áƒáƒ›áƒ˜áƒšáƒ˜áƒ” თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ლáƒáƒ¡áƒ£áƒáƒ¨ ისტáƒáƒ áƒ˜áƒ:",
+რთხიინთ, დეფირქáƒáƒ—, ქáƒáƒ áƒ” თუ ვáƒáƒ  მისáƒáƒ¦áƒ”ფ თე ხáƒáƒ¡áƒ·áƒšáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨ გáƒáƒ’ინძáƒáƒ áƒ”ბáƒ.
+თქვáƒáƒœ áƒáƒ®áƒ£áƒ¯áƒ£áƒ áƒ, áƒáƒ—ე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ლáƒáƒ¡áƒ£áƒáƒ¨ დრგინáƒáƒ¦áƒáƒšáƒáƒ¨ ჟურნáƒáƒšáƒ˜ მáƒáƒ©áƒáƒ›áƒ˜áƒš რე თუდáƒ:",
+'moveddeleted-notice' => 'თე ხáƒáƒ¡áƒ·áƒšáƒáƒ¥ ლáƒáƒ¡áƒ˜áƒ áƒ¥ იჸუ. ლáƒáƒ¡áƒ£áƒáƒ¨ დრგინáƒáƒ¦áƒáƒšáƒáƒ¨ ჟურნáƒáƒšáƒ˜ მáƒáƒ©áƒáƒ›áƒ˜áƒš რე თუდრგიმáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒáƒšáƒ',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '"გური ქუჩით:" ინáƒáƒ®áƒ£áƒœáƒáƒ¤áƒ˜áƒš თáƒáƒœáƒ’ეფიშ ზáƒáƒ›áƒ ნáƒáƒ‘ტáƒáƒœáƒ˜ დიდი რე. კáƒáƒœáƒ™áƒáƒšáƒ” თáƒáƒœáƒ’ეფი ვენიკáƒáƒ—ინე.',
+'post-expand-template-inclusion-category' => 'ხáƒáƒ¡áƒ·áƒšáƒ”ფი ნáƒáƒ›áƒ£áƒ¡áƒ£áƒ— ინáƒáƒ®áƒ£áƒœáƒáƒ¤áƒ˜áƒšáƒ˜ თáƒáƒœáƒ’ეფიშ ზáƒáƒ›áƒ გინáƒáƒ›áƒ”ტებული რე.',
+'post-expand-template-argument-warning' => "\"'''გური ქუჩით:''' თე ხáƒáƒ¡áƒ·áƒšáƒáƒ¡ áƒáƒ™áƒáƒ— áƒáƒ áƒ«áƒáƒ¨ უკლáƒáƒ¨ áƒáƒ áƒ— თიცáƒáƒš თáƒáƒœáƒ’იშ áƒáƒ áƒ’უმენტი, ნáƒáƒ›áƒ£áƒ¡áƒ£áƒ— უღუ გáƒáƒ«áƒ˜áƒœáƒ”ლáƒáƒ¤áƒáƒ¨ ნáƒáƒ‘ტáƒáƒœ დიდ ზáƒáƒ›áƒ.
+თე áƒáƒ áƒ’უმენტეფქ გჷშáƒáƒ¢áƒ”ბულქ იჸუ.\"",
+'post-expand-template-argument-category' => 'უáƒáƒ áƒ’უმენტრთáƒáƒœáƒ’áƒáƒ›áƒ˜ ხáƒáƒ¡áƒ·áƒšáƒ”ფი',
# History pages
'viewpagelogs' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ áƒáƒ áƒ”გისტრáƒáƒªáƒ˜áƒ” ჟურნáƒáƒšáƒ”ფიშ ძირáƒáƒ¤áƒ',
@@ -341,6 +372,7 @@ $messages = array(
'histlegend' => "მეღáƒáƒœáƒ™áƒ˜áƒš: áƒáƒ áƒ—იáƒáƒœáƒ˜áƒ¨ მიáƒáƒ–იმáƒáƒ¤áƒáƒšáƒ კáƒáƒ áƒœáƒ”ბულ ვერსიეფიშ რáƒáƒ“იáƒáƒ¨ áƒáƒ­áƒ™áƒáƒ áƒ˜áƒ”ფ ქიმიáƒáƒ¦áƒáƒœáƒ™áƒ”თ დრგეუნჭირით მიშულáƒáƒ¨ კáƒáƒœáƒ­áƒ˜áƒ¡, ვáƒáƒ áƒ ქვინჯის რენ თი კáƒáƒœáƒ­áƒ˜áƒ¡.
ლეგენდáƒ: '''კუნტáƒáƒ áƒáƒ¤áƒ”ფ: ({{მიმ.}})''' = შხვáƒáƒáƒ‘რმიმáƒáƒš ვერსიáƒáƒ¬áƒ™áƒ£áƒ›áƒ, '''({{ეკáƒáƒœáƒ˜áƒ}}) = შხვáƒáƒáƒ‘რáƒáƒ¬áƒáƒ®áƒáƒšáƒ”ნ ვერსიáƒáƒ¬áƒ™áƒ£áƒ›áƒ, ჭ = ჭიჭე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფ.",
'history-fieldset-title' => 'ისტáƒáƒ áƒ˜áƒáƒ¨ გინáƒáƒ¯áƒ˜áƒœáƒ',
+'history-show-deleted' => 'ხვáƒáƒšáƒ” ლáƒáƒ¡áƒ˜áƒ áƒ”ფი',
'histfirst' => 'პირველი',
'histlast' => 'ეკáƒáƒœáƒ˜áƒ',
'historysize' => '($1 ბáƒáƒ˜áƒ¢)',
@@ -352,8 +384,14 @@ $messages = array(
'history-feed-item-nocomment' => '$1 $2-ს',
# Revision deletion
-'rev-delundel' => 'ძირáƒáƒ¤áƒ/ტყáƒáƒ‘ინáƒáƒ¤áƒ',
-'revdel-restore' => 'áƒáƒ áƒ¬áƒ§áƒ”ნჯáƒáƒ‘áƒáƒ¨ თირუáƒ',
+'rev-delundel' => 'ძირáƒáƒ¤áƒ/ტყáƒáƒ‘ინáƒáƒ¤áƒ',
+'revdelete-logentry' => '"[[$1]]"-შ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფიშ ძირáƒáƒ¤áƒáƒ‘áƒáƒ¥ დითირჷ',
+'revdel-restore' => 'áƒáƒ áƒ¬áƒ§áƒ”ნჯáƒáƒ‘áƒáƒ¨ თირუáƒ',
+'revdel-restore-deleted' => 'ლáƒáƒ¡áƒ˜áƒ áƒ˜ რევიზიეფი',
+'revdel-restore-visible' => 'ძირáƒáƒ¤áƒáƒ“ი რევიზიეფი',
+'revdelete-content' => 'დინáƒáƒ áƒ”',
+'revdelete-hid' => 'დიფულუ $1',
+'revdelete-log-message' => '$1 $2- შრ{{PLURAL:$2|რევიზიáƒ|რევიზიეფი}}',
# Merge log
'revertmerge' => 'ეკáƒáƒ áƒ¢áƒ§áƒ£áƒáƒšáƒáƒ¨ მáƒáƒšáƒáƒ¡áƒ£áƒ',
@@ -364,39 +402,61 @@ $messages = array(
'lineno' => 'ღáƒáƒ–ი $1:',
'compareselectedversions' => 'გიშáƒáƒ’áƒáƒ áƒ˜áƒš ვერსიეფიშ მეზიმáƒáƒ¤áƒ',
'editundo' => 'გáƒáƒ£áƒ¥áƒ•áƒáƒ¤áƒ',
+'diff-multi' => '( {{PLURAL:$2|áƒáƒ áƒ—ი მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ|$2 მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ}} {{PLURAL:$1|áƒáƒ áƒ—ი შქáƒáƒ¨áƒ¥áƒ£áƒ›áƒáƒšáƒ˜áƒ áƒ˜ რევიზიáƒ|$1 შქáƒáƒ¨áƒ¥áƒ£áƒ›áƒáƒšáƒ˜áƒ áƒ˜ რევიზიáƒ}} ვრრე ძირáƒáƒ¤áƒ˜áƒšáƒ˜)',
# Search results
-'searchresults' => 'გáƒáƒ áƒ£áƒáƒ¨ მáƒáƒ¦áƒáƒšáƒ˜áƒ áƒáƒ‘ეფ',
-'searchresults-title' => '"$1"–იშ გáƒáƒ áƒ£áƒáƒ¨ მáƒáƒ¦áƒáƒšáƒ˜áƒ áƒáƒ‘ეფ',
-'searchresulttext' => '{{SITENAME}}–იშ áƒáƒ’áƒáƒ áƒáƒšáƒ უმáƒáƒ¡ იმფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒáƒ¨áƒ ქáƒáƒ«áƒ˜áƒ áƒ˜áƒ— [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'თქვრდáƒáƒ’áƒáƒ áƒ˜áƒ— \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|ირი ხáƒáƒ¡áƒ˜áƒšáƒ, დáƒáƒ­áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ "$1"-ით]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ირი ხáƒáƒ¡áƒ˜áƒšáƒ, გინáƒáƒ áƒªáƒ®áƒ˜áƒš "$1"-შáƒ]])',
-'searchsubtitleinvalid' => "თქვრგáƒáƒ áƒ£áƒœáƒ“ით '''$1'''",
-'notitlematches' => 'ვრუხუჯáƒáƒœáƒ¡ ნáƒáƒ›áƒ£áƒ—ინი ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ჯáƒáƒ®áƒ',
-'notextmatches' => 'ნáƒáƒ›áƒ—ინ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ტექსტი ვრუხუჯáƒáƒœáƒ¡',
-'prevn' => 'წáƒáƒ®áƒšáƒ”ნ $1',
-'nextn' => 'უკულიáƒáƒœ {{PLURAL:$1|$1}}',
-'viewprevnext' => 'ქáƒáƒ«áƒ˜áƒ  ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:მáƒáƒ®áƒ•áƒáƒ áƒ',
-'search-result-size' => '$1 ({{PLURAL:$2|1 ზიტყვáƒ|$2 ზიტყვეფ}})',
-'search-redirect' => '(გინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ $1)',
-'search-section' => '(სექცირ$1)',
-'search-suggest' => 'áƒáƒ—ენáƒáƒ¡ ხრვრგáƒáƒ áƒ£áƒœáƒ“ით: $1',
-'search-interwiki-caption' => 'ჯიმáƒáƒ˜áƒ პრáƒáƒ”ქტეფ',
-'search-interwiki-default' => 'მáƒáƒ¦áƒáƒšáƒ˜áƒ áƒ”ფი $1-შე:',
-'search-interwiki-more' => '(უმáƒáƒ¡)',
-'search-mwsuggest-enabled' => 'ელáƒáƒ©áƒáƒ›áƒ”ფით',
-'search-mwsuggest-disabled' => 'ელáƒáƒ©áƒáƒ›áƒ”ფიშ უმუშáƒáƒ—',
-'nonefound' => "'''გეთáƒáƒšáƒ¬áƒáƒœáƒ˜áƒ—''': სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ ხვáƒáƒšáƒ” ნáƒáƒ›áƒ—ინე ჯáƒáƒ®áƒáƒ— áƒáƒ¤áƒ˜áƒ áƒ©áƒáƒ¡ მეურს გáƒáƒ áƒ£áƒ.
+'searchresults' => 'გáƒáƒ áƒ£áƒáƒ¨ მáƒáƒ¦áƒáƒšáƒ˜áƒ áƒáƒ‘ეფ',
+'searchresults-title' => '"$1"–იშ გáƒáƒ áƒ£áƒáƒ¨ მáƒáƒ¦áƒáƒšáƒ˜áƒ áƒáƒ‘ეფ',
+'searchresulttext' => '{{SITENAME}}–იშ áƒáƒ’áƒáƒ áƒáƒšáƒ უმáƒáƒ¡ იმფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒáƒ¨áƒ ქáƒáƒ«áƒ˜áƒ áƒ˜áƒ— [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'თქვრდáƒáƒ’áƒáƒ áƒ˜áƒ— \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|ირი ხáƒáƒ¡áƒ˜áƒšáƒ, დáƒáƒ­áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ "$1"-ით]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ირი ხáƒáƒ¡áƒ˜áƒšáƒ, გინáƒáƒ áƒªáƒ®áƒ˜áƒš "$1"-შáƒ]])',
+'searchsubtitleinvalid' => "თქვრგáƒáƒ áƒ£áƒœáƒ“ით '''$1'''",
+'notitlematches' => 'ვრუხუჯáƒáƒœáƒ¡ ნáƒáƒ›áƒ£áƒ—ინი ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ჯáƒáƒ®áƒ',
+'notextmatches' => 'ნáƒáƒ›áƒ—ინ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ტექსტი ვრუხუჯáƒáƒœáƒ¡',
+'prevn' => 'წáƒáƒ®áƒšáƒ”ნ $1',
+'nextn' => 'უკულიáƒáƒœ {{PLURAL:$1|$1}}',
+'prevn-title' => 'წáƒáƒ®áƒáƒšáƒ”ნი $1 მáƒáƒ¦áƒáƒšáƒ£',
+'nextn-title' => 'გეჸვენჯი $1 მáƒáƒ¦áƒáƒšáƒ£',
+'shown-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-advanced' => 'გáƒáƒ£áƒ¯áƒ’უშებული',
+'searchprofile-articles-tooltip' => 'დáƒáƒ’áƒáƒ áƒ˜ $1-ს',
+'searchprofile-project-tooltip' => 'გáƒáƒ áƒ£áƒ $1-ის',
+'searchprofile-images-tooltip' => 'დáƒáƒ’áƒáƒ áƒ˜ ფáƒáƒ˜áƒšáƒ”ფი',
+'searchprofile-everything-tooltip' => 'გáƒáƒ áƒ£áƒ áƒáƒ áƒ«áƒ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¡ (áƒáƒ©áƒ˜áƒ”ბელი ხáƒáƒ¡áƒ·áƒšáƒ”ფიშ მეკáƒáƒ áƒáƒªáƒ®áƒ˜áƒšáƒ)',
+'searchprofile-advanced-tooltip' => 'გáƒáƒ áƒ£áƒ მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ გენჭყილ ჯáƒáƒ®áƒáƒ”ფიშ áƒáƒ¤áƒ˜áƒ áƒ©áƒáƒ¡',
+'search-result-size' => '$1 ({{PLURAL:$2|1 ზიტყვáƒ|$2 ზიტყვეფ}})',
+'search-result-category-size' => '{{PLURAL:$1|1 მáƒáƒ™áƒáƒ—ური|$1 მáƒáƒ™áƒáƒ—ური}} ({{PLURAL:$2|1 გიმენკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ|$2 გიმენკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ}}, {{PLURAL:$3|1 ფáƒáƒ˜áƒšáƒ˜|$3 ფáƒáƒ˜áƒšáƒ”ფი}})',
+'search-redirect' => '(გინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ $1)',
+'search-section' => '(სექცირ$1)',
+'search-suggest' => 'áƒáƒ—ენáƒáƒ¡ ხრვრგáƒáƒ áƒ£áƒœáƒ“ით: $1',
+'search-interwiki-caption' => 'ჯიმáƒáƒ˜áƒ პრáƒáƒ”ქტეფ',
+'search-interwiki-default' => 'მáƒáƒ¦áƒáƒšáƒ˜áƒ áƒ”ფი $1-შე:',
+'search-interwiki-more' => '(უმáƒáƒ¡)',
+'search-mwsuggest-enabled' => 'ელáƒáƒ©áƒáƒ›áƒ”ფით',
+'search-mwsuggest-disabled' => 'ელáƒáƒ©áƒáƒ›áƒ”ფიშ უმუშáƒáƒ—',
+'searchrelated' => 'მáƒáƒ—áƒáƒœáƒ’ეფ',
+'searchall' => 'áƒáƒ áƒ«áƒ',
+'showingresultsheader' => "{{PLURAL:$5|მáƒáƒ¦áƒáƒšáƒ£ '''$1''' '''$3'''-შე|მáƒáƒ¦áƒáƒšáƒ£áƒ”ფ '''$1 - $2''' '''$3'''-შე}} '''$4'''-შáƒ",
+'nonefound' => "'''გეთáƒáƒšáƒ¬áƒáƒœáƒ˜áƒ—''': სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ ხვáƒáƒšáƒ” ნáƒáƒ›áƒ—ინე ჯáƒáƒ®áƒáƒ— áƒáƒ¤áƒ˜áƒ áƒ©áƒáƒ¡ მეურს გáƒáƒ áƒ£áƒ.
áƒáƒ’áƒáƒ áƒáƒšáƒ˜ ზიტყვáƒáƒ¡ ვáƒáƒ áƒ ზიტყვეფიშ ბუნáƒáƒ¡ წáƒáƒ®áƒáƒšáƒ” ქეწუყ’უნეთ ''all:'' ირდიხáƒáƒ¡ იგáƒáƒ áƒáƒ¡áƒ˜áƒœ თიშენ (სხუნუáƒáƒ¨ ხáƒáƒ¡áƒ˜áƒšáƒ”ფიშ, თáƒáƒœáƒ’ეფიშ დრáƒ.უ. მეკáƒáƒ áƒáƒªáƒ®áƒ£áƒáƒ—,), ვáƒáƒ -დრპრეფიქსრგიმირინეთ კáƒáƒ áƒœáƒ”ბულ ჯáƒáƒ®áƒáƒ— áƒáƒ¤áƒ˜áƒ áƒ©áƒ.",
-'powersearch' => 'გáƒáƒ«áƒ˜áƒœáƒ”ლ გáƒáƒ áƒ£áƒ',
-'powersearch-legend' => 'გáƒáƒ«áƒ˜áƒœáƒ”ლ გáƒáƒ áƒ£áƒ',
-'powersearch-ns' => 'დáƒáƒ’áƒáƒ  ჯáƒáƒ®áƒáƒ”ფიშ áƒáƒ¤áƒ˜áƒ áƒ©áƒáƒ¡:',
-'powersearch-redir' => 'გინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ”ფიშ ერკებულიშ ძირáƒáƒ¤áƒ',
-'powersearch-field' => 'დáƒáƒ’áƒáƒ áƒ˜ áƒáƒ—ენáƒ',
+'search-nonefound' => 'თქვáƒáƒœáƒ˜ მáƒáƒ’áƒáƒ áƒáƒ¤áƒ˜áƒšáƒ˜áƒ¨ მუთუნნერ მáƒáƒœáƒ’ი მáƒáƒ¦áƒáƒšáƒ£áƒ¥ ვეძირჷ.',
+'powersearch' => 'გáƒáƒ«áƒ˜áƒœáƒ”ლ გáƒáƒ áƒ£áƒ',
+'powersearch-legend' => 'გáƒáƒ«áƒ˜áƒœáƒ”ლ გáƒáƒ áƒ£áƒ',
+'powersearch-ns' => 'დáƒáƒ’áƒáƒ  ჯáƒáƒ®áƒáƒ”ფიშ áƒáƒ¤áƒ˜áƒ áƒ©áƒáƒ¡:',
+'powersearch-redir' => 'გინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ”ფიშ ერკებულიშ ძირáƒáƒ¤áƒ',
+'powersearch-field' => 'დáƒáƒ’áƒáƒ áƒ˜ áƒáƒ—ენáƒ',
# Preferences page
'preferences' => 'კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
'mypreferences' => 'ჩქიმ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ფ',
+'youremail' => 'ელ-ფáƒáƒ¨áƒ¢áƒ:',
'yourrealname' => 'ნáƒáƒœáƒ“ულ სáƒáƒ®áƒ”ლ *',
'yourlanguage' => 'ნინáƒ:',
@@ -412,29 +472,34 @@ $messages = array(
'action-edit' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|თირáƒáƒ¤áƒ|თირáƒáƒ¤áƒ”ფ}}',
-'recentchanges' => 'áƒáƒ¡áƒ”რდენ თირáƒáƒ¤áƒ”ფ',
-'recentchanges-legend' => 'áƒáƒ¡áƒ”რდენ თირáƒáƒ¤áƒ”ფიშ áƒáƒ¤áƒªáƒ˜áƒ”ფ',
-'recentchanges-feed-description' => "ვიკიშ უáƒáƒ®áƒáƒšáƒáƒ¨ თირáƒáƒ¤áƒ”ფიშრთáƒáƒšáƒ§'უჯიშ მეყ'უნáƒáƒ¤áƒ თე áƒáƒ áƒ®áƒ˜áƒ¡",
-'rcnote' => "თუდáƒáƒšáƒ” ძირით ეკáƒáƒœáƒ˜áƒ {{PLURAL:$1|'''1''' თირáƒáƒ¤áƒ|$1 თირáƒáƒ¤áƒ}} ეკáƒáƒœáƒ˜áƒ {{PLURAL:$2|დღáƒáƒ¨|'''$2''' დღáƒáƒ¨}}, $5, $4 რენჯáƒáƒ‘áƒáƒ—.",
-'rcnotefrom' => 'თუდრმáƒáƒ¸áƒ£áƒœáƒáƒ¤áƒ˜áƒšáƒ˜áƒ” თირáƒáƒ¤áƒ”ფ, â€â€™$2â€â€-შე (ძირáƒáƒ¤áƒ˜áƒšáƒ˜áƒ” â€â€™$1â€â€™)',
-'rclistfrom' => 'áƒáƒ®áƒáƒš თირáƒáƒ¤áƒ”ფიშ ძირáƒáƒ¤áƒ დáƒáƒ­áƒ§áƒáƒ¤áƒ˜áƒš $1-შე',
-'rcshowhideminor' => '$1 ჭიჭე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფ',
-'rcshowhidebots' => 'ბáƒáƒ¢áƒ”ფიშ $1',
-'rcshowhideliu' => '$1 მიშულირ მáƒáƒ®áƒ•áƒáƒ áƒ”ბუეფ',
-'rcshowhideanons' => '$1 áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ  მáƒáƒ®áƒ•áƒáƒ áƒ”ბუეფ',
-'rcshowhidepatr' => 'გáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¤áƒ˜áƒ  თირáƒáƒ¤áƒ”ფიშ $1',
-'rcshowhidemine' => 'ჩქიმ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფიშ $1',
-'rclinks' => 'ეკáƒáƒœáƒ˜áƒ $2 დღáƒáƒ¡ ღáƒáƒšáƒáƒ›áƒ˜áƒ  ეკáƒáƒœáƒ˜áƒ $1 თირáƒáƒ¤áƒ”ფიშ ძირáƒáƒ¤áƒ <br />$3',
-'diff' => 'შხვáƒáƒœáƒ”რáƒáƒ‘áƒ',
-'hist' => 'ისტ.',
-'hide' => 'ტყáƒáƒ‘ინáƒáƒ¤áƒ',
-'show' => 'ძირáƒáƒ¤áƒ',
-'minoreditletter' => 'ჭ.რ.',
-'newpageletter' => 'áƒáƒ®.',
-'boteditletter' => 'ბ',
-'rc-enhanced-expand' => 'დეტáƒáƒšáƒ”ფიშ ძირáƒáƒ¤áƒ (ითხინს ჯáƒáƒ•áƒáƒ¡áƒ¥áƒ áƒ˜áƒ¤áƒ—ის)',
-'rc-enhanced-hide' => 'დეტáƒáƒšáƒ”ფიშ ტყáƒáƒ‘ინáƒáƒ¤áƒ',
+'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 ჭიჭე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფ',
+'rcshowhidebots' => 'ბáƒáƒ¢áƒ”ფიშ $1',
+'rcshowhideliu' => '$1 მიშულირ მáƒáƒ®áƒ•áƒáƒ áƒ”ბუეფ',
+'rcshowhideanons' => '$1 áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ  მáƒáƒ®áƒ•áƒáƒ áƒ”ბუეფ',
+'rcshowhidepatr' => 'გáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¤áƒ˜áƒ  თირáƒáƒ¤áƒ”ფიშ $1',
+'rcshowhidemine' => 'ჩქიმ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფიშ $1',
+'rclinks' => 'ეკáƒáƒœáƒ˜áƒ $2 დღáƒáƒ¡ ღáƒáƒšáƒáƒ›áƒ˜áƒ  ეკáƒáƒœáƒ˜áƒ $1 თირáƒáƒ¤áƒ”ფიშ ძირáƒáƒ¤áƒ <br />$3',
+'diff' => 'შხვáƒáƒœáƒ”რáƒáƒ‘áƒ',
+'hist' => 'ისტ.',
+'hide' => 'ტყáƒáƒ‘ინáƒáƒ¤áƒ',
+'show' => 'ძირáƒáƒ¤áƒ',
+'minoreditletter' => 'ჭ.რ.',
+'newpageletter' => 'áƒáƒ®.',
+'boteditletter' => 'ბ',
+'rc-enhanced-expand' => 'დეტáƒáƒšáƒ”ფიშ ძირáƒáƒ¤áƒ (ითხინს ჯáƒáƒ•áƒáƒ¡áƒ¥áƒ áƒ˜áƒ¤áƒ—ის)',
+'rc-enhanced-hide' => 'დეტáƒáƒšáƒ”ფიშ ტყáƒáƒ‘ინáƒáƒ¤áƒ',
# Recent changes linked
'recentchangeslinked' => 'áƒáƒ™áƒáƒ®áƒ•áƒáƒšáƒáƒ›áƒ˜áƒ  თირáƒáƒ¤áƒ”ფ',
@@ -447,11 +512,15 @@ $messages = array(
'recentchangeslinked-to' => 'მáƒáƒœáƒ’იერრქáƒáƒ«áƒ˜áƒ áƒ” áƒáƒ—ე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ მერცხილ ხáƒáƒ¡áƒ˜áƒšáƒ”ფშრმიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თირáƒáƒ¤áƒ”ფ',
# Upload
-'upload' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¨ ეშáƒáƒ®áƒáƒ áƒ’უáƒ',
+'upload' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¨ ეხáƒáƒ áƒ’უáƒ',
'uploadbtn' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¨ გეთებáƒ',
'uploadlogpage' => 'ეხáƒáƒ áƒ’უáƒáƒ¨ áƒáƒ áƒ”გისტრირებელ ჟურნáƒáƒš',
+'filedesc' => 'რეზიუმე',
'uploadedimage' => 'ეხáƒáƒ áƒ’ელი რე "[[$1]]"',
+'license' => 'ლიცენზირáƒáƒ¤áƒ:',
+'license-header' => 'ლიცენზირáƒáƒ¤áƒ',
+
# Special:ListFiles
'listfiles' => 'სურáƒáƒ—ეფიშ ერკებულ',
'listfiles_name' => 'სáƒáƒ®áƒ”ლ',
@@ -460,6 +529,7 @@ $messages = array(
'file-anchor-link' => 'ფáƒáƒ˜áƒšáƒ˜',
'filehist' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¨ ისტáƒáƒ áƒ˜áƒ',
'filehist-help' => 'ქიგუნჭირით რიცხვის/ბáƒáƒ áƒ¯áƒ˜áƒ¡ თიშáƒ, ნáƒáƒ›áƒ“რქáƒáƒ«áƒ˜áƒ áƒáƒ— ფáƒáƒ˜áƒšáƒ˜ თი რედáƒáƒ¥áƒªáƒ˜áƒáƒ—, მუ რედáƒáƒ¥áƒªáƒ˜áƒáƒ¡ თი რიცხვის/ბáƒáƒ áƒ¯áƒ˜áƒ¡ რდუნ.',
+'filehist-revert' => 'დáƒáƒ áƒ—ინე',
'filehist-current' => 'მიმáƒáƒš',
'filehist-datetime' => 'რიცხვი/ბáƒáƒ áƒ¯áƒ˜',
'filehist-thumb' => 'ჭკუდი',
@@ -472,6 +542,7 @@ $messages = array(
'linkstoimage' => 'გეყ’ვენჯი {{PLURAL:$1|ხáƒáƒ¡áƒ˜áƒšáƒ|ხáƒáƒ¡áƒ˜áƒšáƒ”ფ}} მერცხილ რე თე ფáƒáƒ˜áƒšáƒ¨áƒ',
'nolinkstoimage' => 'ვრრე თე ფáƒáƒ˜áƒšáƒ¬áƒ™áƒ£áƒ›áƒ მერსხილ ხáƒáƒ¡áƒ˜áƒšáƒ”ფ.',
'sharedupload' => 'თე ფáƒáƒ˜áƒš რე $1-შე დრშილებე თენრშხვრპრáƒáƒ”ქტეფც ხáƒáƒšáƒ გიმირინáƒáƒ£áƒ¤áƒ£áƒ“áƒáƒ¡áƒ˜áƒœ',
+'sharedupload-desc-here' => 'თე ფáƒáƒ˜áƒšáƒ˜ რე $1-შე დრშილებე გჷმáƒáƒ áƒœáƒáƒ¤áƒ˜áƒšáƒ¥ იჸუáƒáƒ¡ შხვრპრáƒáƒ”ქტეფს. თეშ ეჭáƒáƒ áƒ£áƒ [$2 ფáƒáƒ˜áƒšáƒ˜áƒ¨ ეჭáƒáƒ áƒ£áƒáƒ¨ ხáƒáƒ¡áƒ·áƒšáƒ] თუდáƒáƒšáƒ” რე მáƒáƒ©áƒáƒ›áƒ˜áƒšáƒ˜.',
'uploadnewversion-linktext' => 'გეშáƒáƒ®áƒáƒ áƒ’ე áƒáƒ—ე ფáƒáƒ˜áƒšáƒ˜áƒ¨ áƒáƒ®áƒáƒš ვერსიáƒ',
# MIME search
@@ -483,10 +554,12 @@ $messages = array(
# Statistics
'statistics' => 'სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ',
+'disambiguationspage' => 'Template:áƒáƒœáƒ“áƒáƒ‘ურმნიშვნელიáƒáƒœáƒ˜',
+
'withoutinterwiki' => 'ხáƒáƒ¡áƒ˜áƒšáƒ”ფ ნინáƒáƒ¨ რსხილეფიშ გáƒáƒ áƒ”შე',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|ბáƒáƒ˜áƒ¢|ბáƒáƒ˜áƒ¢áƒ”ფ}}',
+'nbytes' => '$1 ბáƒáƒ˜áƒ¢áƒ˜',
'nlinks' => '$1 რსხილ',
'nmembers' => '$1 {{PLURAL:$1|მáƒáƒ™áƒáƒ—ურ|მáƒáƒ™áƒáƒ—ურეფ}}',
'uncategorizedpages' => 'უკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ” ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
@@ -498,6 +571,7 @@ $messages = array(
'prefixindex' => 'áƒáƒ áƒ«áƒ ხáƒáƒ¡áƒ˜áƒšáƒ პრეფიქსით',
'shortpages' => 'ჭიჭე ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'longpages' => 'გინძე ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
+'usercreated' => 'დირსხუ $1 $2-ს',
'newpages' => 'áƒáƒ®áƒáƒš ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'ancientpages' => 'ჯვეშ ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'move' => 'გინáƒáƒ¦áƒáƒšáƒ',
@@ -530,7 +604,8 @@ $messages = array(
'categories' => 'კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ფ',
# Special:LinkSearch
-'linksearch' => 'გáƒáƒšáƒ”ნ რცხიეფ',
+'linksearch' => 'გáƒáƒšáƒ”ნ რცხიეფ',
+'linksearch-line' => '$1 მერცხიილი რე $2-შე',
# Special:Log/newusers
'newuserlogpage' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ რეგისტრáƒáƒªáƒ˜áƒáƒ¨ ჟურნáƒáƒš',
@@ -545,7 +620,7 @@ $messages = array(
# Watchlist
'watchlist' => 'ჩქიმ áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბულეფიშ ერკებულ',
'mywatchlist' => 'ჩქიმ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¨ ერკებულ',
-'watchlistfor' => "('''$1'''-შენი)",
+'watchlistfor2' => '$1 $2-ს',
'addedwatch' => 'გეძინელ რე კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¨ ერკებულშáƒ',
'addedwatchtext' => "\"[[:\$1]]\" ხáƒáƒ¡áƒ˜áƒšáƒáƒ¥ გეძინელქ იყ’უ თქვáƒáƒœ [[Special:Watchlist|watchlist]]–შáƒ.
თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ დრთეწკუმრáƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბულ სხუნუáƒáƒ¨ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ მუმáƒáƒ£áƒšáƒáƒ  თირáƒáƒ¤áƒ”ფ მáƒáƒ©áƒáƒ›áƒ˜áƒš იყ’ი თექ დრთქვრგეგეáƒáƒ“ვილáƒáƒœ თიშ გიშáƒáƒ’áƒáƒ áƒ£áƒáƒ¥áƒ˜áƒœ, ხáƒáƒ¡áƒ˜áƒšáƒ გუმáƒáƒ áƒ©áƒ¥áƒ˜áƒœáƒ“უ '''რუმეთ''' [[Special:RecentChanges|list of recent changes]]–ს.\"",
@@ -566,7 +641,8 @@ $messages = array(
'deletepage' => 'ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ლáƒáƒ¡áƒ£áƒ',
'confirmdeletetext' => 'თქვრთე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨, თელ მუშ ისტáƒáƒ áƒ˜áƒáƒ—, ლáƒáƒ¡áƒ£áƒáƒ¨ პიჯის რეთ.
დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ˜áƒ—, ნáƒáƒ›áƒ“რთქვრნáƒáƒœáƒ“ულრგáƒáƒ™áƒáƒœáƒ თეშ ღáƒáƒšáƒáƒ›áƒ დრნáƒáƒ›áƒ£áƒ“რთქვრგáƒáƒ áƒ©áƒ¥áƒ˜áƒšáƒ”ნრთე ქიმინჯáƒáƒšáƒáƒ¨ მáƒáƒ¦áƒáƒšáƒ£áƒ”ფ დრმუჭáƒáƒ— თქვრთეს áƒáƒ áƒ—უთ [[{{MediaWiki:Policy-url}}|წესეფიშ]] მეხუჯáƒáƒ¤áƒ˜áƒšáƒ.',
-'actioncomplete' => 'ქიმინჯურრსულებულ რე',
+'actioncomplete' => 'მáƒáƒ¥áƒ›áƒ”დáƒáƒšáƒ რსულებულ რე',
+'actionfailed' => 'მáƒáƒ¥áƒ›áƒ”დáƒáƒšáƒáƒ¥ დემáƒáƒ áƒªáƒ®áƒ·',
'deletedtext' => '"<nowiki>$1</nowiki>\\" ლáƒáƒ¡áƒ˜áƒ áƒ¥ იყ’უ.
áƒáƒ¡áƒ”რდე ლáƒáƒ¡áƒ˜áƒ  ხáƒáƒ¡áƒ˜áƒšáƒ”ფიშ ერკებულ ქáƒáƒ«áƒ˜áƒ áƒ˜áƒ— $2–ს.',
'deletedarticle' => '"[[$1]]" ლáƒáƒ¡áƒ˜áƒ  რე',
@@ -607,6 +683,7 @@ $messages = array(
# Undelete
'undeletebtn' => 'áƒáƒ®áƒáƒšáƒ¨áƒ ეკáƒáƒœáƒ¬áƒ§áƒ£áƒáƒšáƒ',
'undeletelink' => 'ძირáƒáƒ¤áƒ/ეკáƒáƒœáƒ¬áƒ§áƒ£áƒáƒšáƒ',
+'undeleteviewlink' => 'ძირáƒáƒ¤áƒ',
'undeletedarticle' => 'ეკáƒáƒœáƒ¬áƒ§áƒ˜áƒšáƒ¥ იყ’უ "[[$1]]"',
'undelete-search-submit' => 'გáƒáƒ áƒ£áƒ',
@@ -627,9 +704,12 @@ $messages = array(
'sp-contributions-newbies' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜áƒ— ხვáƒáƒšáƒ” áƒáƒ®áƒáƒš მáƒáƒ®áƒ•áƒáƒ áƒ”ბუეფიშ მიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თიეფ',
'sp-contributions-newbies-sub' => 'áƒáƒ®áƒáƒšáƒ”ფშáƒáƒ—',
'sp-contributions-blocklog' => 'ბლáƒáƒ™áƒ˜áƒ áƒáƒ¤áƒáƒ¨ ისტáƒáƒ áƒ˜áƒ',
-'sp-contributions-talk' => 'სხუნუáƒ',
+'sp-contributions-uploads' => 'ეხáƒáƒ áƒ’უეფ',
+'sp-contributions-logs' => 'ჟურნáƒáƒšáƒ”ფი',
+'sp-contributions-talk' => 'áƒáƒ©áƒ˜áƒ”ბელი',
'sp-contributions-search' => 'მიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თიáƒáƒ¨ გáƒáƒ áƒ£áƒ',
'sp-contributions-username' => 'IP მიáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ£ ვáƒáƒ áƒ მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ ჯáƒáƒ®áƒ:',
+'sp-contributions-toponly' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ ხვáƒáƒšáƒ” ეკáƒáƒœáƒ˜áƒ რევიზიეფი რენ ფერი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფი',
'sp-contributions-submit' => 'გáƒáƒ áƒ£áƒ',
# What links here
@@ -647,6 +727,7 @@ $messages = array(
'whatlinkshere-hideredirs' => 'გინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒ $1',
'whatlinkshere-hidetrans' => '$1 ტრáƒáƒœáƒ¡áƒ™áƒšáƒ£áƒ–იეფ',
'whatlinkshere-hidelinks' => '$1 რცხუეფ',
+'whatlinkshere-hideimages' => '$1 სურáƒáƒ—იშ რცხუეფი',
'whatlinkshere-filters' => 'ტკიბირეფი',
# Block/unblock
@@ -706,7 +787,9 @@ $messages = array(
'export' => 'ხáƒáƒ¡áƒ˜áƒšáƒ”ფიშ ექსპáƒáƒ áƒ¢',
# Namespace 8 related
-'allmessages' => 'ირ სისტემურ შეტყვინáƒáƒ¤áƒ',
+'allmessages' => 'ირ სისტემურ შეტყვინáƒáƒ¤áƒ',
+'allmessagesname' => 'ჯáƒáƒ®áƒ',
+'allmessagesdefault' => 'შáƒáƒ¢áƒ§áƒ•áƒ˜áƒœáƒáƒ¤áƒáƒ¨ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš ტექსტი',
# Thumbnails
'thumbnail-more' => 'მáƒáƒ áƒ“ი',
@@ -737,6 +820,7 @@ $messages = array(
'tooltip-search' => 'გáƒáƒ áƒ£áƒ {{SITENAME}}',
'tooltip-search-go' => 'გეგნáƒáƒ áƒ—ი წáƒáƒ áƒáƒ¡ áƒáƒ—ე ჯáƒáƒ®áƒáƒ¨ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ შურრქრრენ-დáƒ',
'tooltip-search-fulltext' => 'დáƒáƒ’áƒáƒ áƒ˜ ხáƒáƒ¡áƒ˜áƒšáƒ”ფი, ნáƒáƒ›áƒ£áƒ— თე ტექსტის იკáƒáƒ—უáƒáƒœáƒáƒœ',
+'tooltip-p-logo' => 'დუდ ხáƒáƒ¡áƒ·áƒšáƒáƒ¨ ძირáƒáƒ¤áƒ',
'tooltip-n-mainpage' => 'დუდ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ძირáƒáƒ¤áƒ',
'tooltip-n-mainpage-description' => 'დუდ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ გინáƒáƒ–áƒáƒ¯áƒ£áƒ',
'tooltip-n-portal' => 'პრáƒáƒ”ქტიშენი, მუშ ქიმინურშეილებუნáƒ, სáƒáƒ“ე შილებე გáƒáƒ áƒáƒ—ინ',
@@ -750,7 +834,7 @@ $messages = array(
'tooltip-feed-atom' => 'áƒáƒ—ე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ áƒáƒ¢áƒáƒ› áƒáƒ áƒ®áƒ˜áƒ¨ ტრáƒáƒœáƒ¡áƒšáƒáƒªáƒ˜áƒ',
'tooltip-t-contributions' => 'თე მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ მიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თიáƒáƒ¨ ერკებულიშ ძირáƒáƒ¤áƒ',
'tooltip-t-emailuser' => 'მიდუჯღáƒáƒœáƒ˜áƒ— ელ.ფáƒáƒ¨áƒ¢áƒ áƒáƒ—ე მáƒáƒ®áƒ•áƒáƒ áƒ”ბუს',
-'tooltip-t-upload' => 'გეშáƒáƒ®áƒáƒ áƒ’ე ფáƒáƒ˜áƒš',
+'tooltip-t-upload' => 'გეხáƒáƒ áƒ’ე ფáƒáƒ˜áƒšáƒ˜',
'tooltip-t-specialpages' => 'áƒáƒ áƒ«áƒ სპეციáƒáƒšáƒ£áƒ  ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ერკებულ',
'tooltip-t-print' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ áƒáƒ‘ეშტáƒáƒšáƒ˜ ვერსიáƒ',
'tooltip-t-permalink' => 'პერმáƒáƒœáƒ”ნტულ რცხი ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ თე ვერსიáƒáƒ¨áƒ',
@@ -770,15 +854,20 @@ $messages = array(
'tooltip-watch' => 'თე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ გეძინრთქვáƒáƒœ áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ” ერკებულშრ[alt-w]',
'tooltip-rollback' => '"დáƒáƒ áƒ—ინáƒ" áƒáƒ—ე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ ეკáƒáƒœáƒ˜áƒ გინმáƒáƒ®áƒáƒœáƒ“ეშ ნáƒáƒ¦áƒáƒšáƒ”მ თირáƒáƒ¤áƒáƒ¡(ეფს) გáƒáƒ£áƒ¥áƒ•áƒ”ნს áƒáƒ áƒ— გენჭირáƒáƒ—',
'tooltip-undo' => '"გáƒáƒ£áƒ¥áƒ•áƒáƒ¤áƒ" მიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თირáƒáƒ¤áƒ”ფს გáƒáƒ£áƒ¥áƒ•áƒ”ნს დრგუთმáƒáƒœáƒ¬áƒ§áƒ£áƒœáƒ¡ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨ ფáƒáƒ áƒ›áƒáƒ¡ გიწáƒáƒ—áƒáƒšáƒáƒ áƒáƒ¤áƒáƒ¨ რეჟიმს. თენრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡ ირძენს რეზიუმეს სáƒáƒ›áƒáƒœáƒ¯áƒ”ლქ იყ’უáƒáƒ¡ დáƒáƒ™áƒáƒœáƒ™áƒ áƒ”ტებულქინ.',
+'tooltip-summary' => 'კუნტრრეზიუმეშ მიშáƒáƒ¸áƒáƒœáƒáƒ¤áƒ',
+
+# Patrol log
+'patrol-log-line' => 'მერჩქინელი $1 $2-შე პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒáƒ¤áƒ˜áƒšáƒ˜ $3',
+'patrol-log-diff' => 'რევიზირ$1',
# Browsing diffs
'previousdiff' => '↠წáƒáƒ®áƒáƒšáƒ”ნი თირáƒáƒ¤áƒ”ფ',
'nextdiff' => 'უáƒáƒ®áƒáƒšáƒáƒ¨ თირáƒáƒ¤áƒ →',
# Media information
-'file-info-size' => '($1 × $2 პიქსელ, ფáƒáƒ˜áƒšáƒ˜áƒ¨ ზáƒáƒ›áƒ: $3, MIME ტიპ: $4)',
+'file-info-size' => '$1 × $2 პიქსელ, ფáƒáƒ˜áƒšáƒ˜áƒ¨ ზáƒáƒ›áƒ: $3, MIME ტიპ: $4',
'file-nohires' => '<small> უმáƒáƒ¡ მáƒáƒ¦áƒáƒš გიშáƒáƒ’áƒáƒ áƒáƒœáƒ¯áƒáƒšáƒ ვრრე შელებუáƒáƒœ.</small>',
-'svg-long-desc' => '(ფáƒáƒ˜áƒš SVG, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒ $1×$2 პიქსელ, ფáƒáƒ˜áƒšáƒ˜áƒ¨ ზიმáƒ: $3)',
+'svg-long-desc' => 'SVG ფáƒáƒ˜áƒš, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒ $1×$2 პიქსელ, ფáƒáƒ˜áƒšáƒ˜áƒ¨ ზიმáƒ: $3',
'show-big-image' => 'რსული გიშáƒáƒ’áƒáƒ áƒáƒœáƒ¯áƒáƒšáƒ',
'show-big-image-thumb' => '<small>ზáƒáƒ›áƒ გიწáƒáƒ—áƒáƒšáƒáƒ áƒáƒ¤áƒáƒ¨ ბáƒáƒ áƒ¯áƒ˜áƒ¡: $1 × $2 პიქსელ</small>',
@@ -827,10 +916,26 @@ $messages = array(
'watchlisttools-edit' => 'áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბელ ხáƒáƒ¡áƒ˜áƒšáƒ”ფიშ ძირáƒáƒ¤áƒ დრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
'watchlisttools-raw' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¨ ერკებულიშ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ ტექსტიშ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡',
+# Core parser functions
+'duplicate-defaultsort' => '\'\'გური ქუჩით:\'\'\' სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ დáƒáƒœáƒ¬áƒ§áƒ£áƒáƒšáƒáƒ¨ კილრ"$2"-შრგინáƒáƒ áƒ¯áƒ’ინáƒáƒœáƒ¡ áƒáƒ áƒ“áƒáƒœáƒ˜ დáƒáƒœáƒ¬áƒ§áƒ£áƒáƒšáƒáƒ¨ კილრ"$1"-ს.',
+
# Special:Version
'version' => 'ვერსიáƒ',
# Special:SpecialPages
'specialpages' => 'სპეციáƒáƒšáƒ£áƒ  ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
+# External image whitelist
+'external_image_whitelist' => '"#ქჷდიტე თე ღáƒáƒ–ი კáƒáƒ™áƒáƒ‘რმუჭრრენ თეში<pre>
+#ქინáƒáƒ®áƒ£áƒœáƒ” რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨ ფრáƒáƒ’მენტეფი (თი ნáƒáƒ¬áƒ˜áƒšáƒ˜ ნáƒáƒ›áƒ£áƒ— თეშ // შქáƒáƒ¡ ინáƒáƒ“áƒáƒ®áƒáƒ“) თუდáƒáƒšáƒ”
+#თენეფი მეზჷმáƒáƒ¤áƒ˜áƒš იჸე გáƒáƒšáƒ”ნ (hotlinked) სურáƒáƒ—ეფიშ URL-ეფშáƒ.
+#ნáƒáƒ›áƒ£áƒ— მიáƒáƒ áƒ”ნ თინრსურáƒáƒ—ეფრგáƒáƒ’შáƒáƒ áƒ©áƒ¥áƒ˜áƒœáƒ“ჷ, ვáƒáƒ -დრხვáƒáƒšáƒ” სურáƒáƒ—იშ რცხუ ირწყებედáƒáƒ¡áƒ˜áƒ˜.
+#ღáƒáƒ–ეფი #-თ დáƒáƒ­áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ კáƒáƒ›áƒ”ნტáƒáƒ áƒ რე მერჩქინელი.
+#თენრგჷნáƒáƒ¤áƒ£áƒšáƒ”ნს áƒáƒ¡áƒáƒ”ფიშ რეგისტრის.
+
+#ქინáƒáƒ®áƒ£áƒœáƒ” áƒáƒ áƒ«áƒ regex ფრáƒáƒ’მენტეფი თე ღáƒáƒ–იშ ჟი. ქჷდიტე თე ღáƒáƒ–ი კáƒáƒ™áƒáƒ‘რმუჭრრენ თეში</pre>"',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|ხინტკეფიშ]] ტკიბირი:',
+
);
diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php
index bd67fc2c..1c51393c 100644
--- a/languages/messages/MessagesYi.php
+++ b/languages/messages/MessagesYi.php
@@ -56,66 +56,80 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'DoubleRedirects' => array( 'פ×רט×פלטע ווייטערפירונגען' ),
- 'BrokenRedirects' => array( 'צעבר××›×¢× ×¢ ווייטערפירונגען' ),
+ 'DoubleRedirects' => array( 'פ×רט×פלטע_ווייטערפירונגען' ),
+ 'BrokenRedirects' => array( 'צעבר××›×¢× ×¢_ווייטערפירונגען' ),
'Disambiguations' => array( 'ב×דייטן' ),
- 'Userlogin' => array( 'ב×ניצער ×יינל×גירן' ),
+ 'Userlogin' => array( 'ב×ניצער_×יינל×גירן' ),
+ 'Userlogout' => array( '×רויסל×גירן' ),
+ 'CreateAccount' => array( 'ש×פֿן_ק×נטע' ),
'Preferences' => array( 'פרעפערענצן' ),
- 'Watchlist' => array( '×ויפֿפ×סן ליסטע', 'מיין ×ויפֿפ×סן ליסטע' ),
- 'Recentchanges' => array( 'לעצטע ענדערונגען' ),
+ 'Watchlist' => array( '×ויפֿפ×סן_ליסטע', 'מיין_×ויפֿפ×סן_ליסטע' ),
+ 'Recentchanges' => array( 'לעצטע_ענדערונגען' ),
'Upload' => array( '×רויפל×דן' ),
'Listfiles' => array( 'בילדער' ),
- 'Newimages' => array( 'נייע בילדער' ),
- 'Listusers' => array( 'ליסטע פון ב×ניצערס' ),
+ 'Newimages' => array( 'נייע_בילדער' ),
+ 'Listusers' => array( 'ליסטע_פון_ב×ניצערס' ),
'Statistics' => array( 'סט×טיסטיק' ),
- 'Randompage' => array( 'צופעליג', 'צופעליגער בל×ט' ),
- 'Lonelypages' => array( 'פ×ר\'יתומ\'טע בלעטער' ),
- 'Uncategorizedpages' => array( 'בלעטער ×ן ק×טעג×ריעס' ),
- 'Uncategorizedcategories' => array( 'ק×טעג×ריעס ×ן ק×טעג×ריעס' ),
- 'Uncategorizedimages' => array( 'בילדער ×ן ק×טעג×ריעס' ),
- 'Uncategorizedtemplates' => array( 'מוסטערן ×ן ק×טעג×ריעס' ),
- 'Unusedcategories' => array( '×ומב×ניצטע ק×טעג×ריעס' ),
- 'Unusedimages' => array( '×ומב×ניצטע בילדער' ),
- 'Wantedpages' => array( 'געזוכטע בלעטער' ),
- 'Wantedcategories' => array( 'געזוכטע ק×טעג×ריעס' ),
- 'Mostlinked' => array( 'מערסטע פ×רבונדענע בלעטער' ),
- 'Mostlinkedcategories' => array( 'מערסטע פ×רבונדענע ק×טעג×ריעס' ),
- 'Mostlinkedtemplates' => array( 'מערסטע פ×רבונדענע מוסטערן' ),
- 'Mostimages' => array( 'מערסטע פ×רבונדענע בילדער' ),
- 'Shortpages' => array( 'קורצע בלעטער' ),
- 'Longpages' => array( 'ל×× ×’×¢ בלעטער' ),
- 'Newpages' => array( 'נייע בלעטער' ),
- 'Ancientpages' => array( '×ור×לטע בלעטער' ),
- 'Deadendpages' => array( 'בלעטער ×ן פ×רבינדונגען' ),
- 'Protectedpages' => array( 'געשיצטע בלעטער' ),
- 'Protectedtitles' => array( 'געשיצטע קעפלעך' ),
- 'Allpages' => array( '×לע בלעטער' ),
- 'Prefixindex' => array( 'בלעטער וו×ס הייבן ×ין מיט' ),
- 'Specialpages' => array( 'ב×זונדערע בלעטער' ),
+ 'Randompage' => array( 'צופעליג', 'צופעליגער_בל×ט' ),
+ 'Lonelypages' => array( 'פ×ר\'יתומ\'טע_בלעטער' ),
+ 'Uncategorizedpages' => array( 'בלעטער_×ן_ק×טעג×ריעס' ),
+ 'Uncategorizedcategories' => array( 'ק×טעג×ריעס_×ן_ק×טעג×ריעס' ),
+ 'Uncategorizedimages' => array( 'בילדער_×ן_ק×טעג×ריעס' ),
+ 'Uncategorizedtemplates' => array( 'מוסטערן_×ן_ק×טעג×ריעס' ),
+ 'Unusedcategories' => array( '×ומב×ניצטע_ק×טעג×ריעס' ),
+ 'Unusedimages' => array( '×ומב×ניצטע_בילדער' ),
+ 'Wantedpages' => array( 'געזוכטע_בלעטער' ),
+ 'Wantedcategories' => array( 'געזוכטע_ק×טעג×ריעס' ),
+ 'Wantedfiles' => array( 'געזוכטע_טעקעס' ),
+ 'Wantedtemplates' => array( 'געזוכטע_מוסטערן' ),
+ 'Mostlinked' => array( 'מערסטע_פ×רבונדענע_בלעטער' ),
+ 'Mostlinkedcategories' => array( 'מערסטע_פ×רבונדענע_ק×טעג×ריעס' ),
+ 'Mostlinkedtemplates' => array( 'מערסטע_פ×רבונדענע_מוסטערן' ),
+ 'Mostimages' => array( 'מערסטע_פ×רבונדענע_בילדער' ),
+ 'Mostcategories' => array( 'מערסטע_ק×טעג×ריעס' ),
+ 'Mostrevisions' => array( 'מערסטע_רעוויזיעס' ),
+ 'Fewestrevisions' => array( 'ווייניגסטע_רעוויזיעס' ),
+ 'Shortpages' => array( 'קורצע_בלעטער' ),
+ 'Longpages' => array( 'ל×× ×’×¢_בלעטער' ),
+ 'Newpages' => array( 'נייע_בלעטער' ),
+ 'Ancientpages' => array( '×ור×לטע_בלעטער' ),
+ 'Deadendpages' => array( 'בלעטער_×ן_פ×רבינדונגען' ),
+ 'Protectedpages' => array( 'געשיצטע_בלעטער' ),
+ 'Protectedtitles' => array( 'געשיצטע_קעפלעך' ),
+ 'Allpages' => array( '×לע_בלעטער' ),
+ 'Prefixindex' => array( 'בלעטער_וו×ס_הייבן_×ין_מיט' ),
+ 'Ipblocklist' => array( 'בל×קירן_ליסטע' ),
+ 'Specialpages' => array( 'ב×זונדערע_בלעטער' ),
'Contributions' => array( 'בײַשטײַערונגען' ),
- 'Emailuser' => array( 'שיקן ×ן ×¢-פ×סט ×¦×•× ×‘×ניצער' ),
- 'Confirmemail' => array( 'ב×שטעטיגן ×¢-פ×סט' ),
- 'Whatlinkshere' => array( 'בלעטער וו×ס פ×רבונדן ×הער' ),
- 'Movepage' => array( 'ב×וועגן בל×ט' ),
+ 'Emailuser' => array( 'שיקן_×ן_×¢-פ×סט_צו×_ב×ניצער' ),
+ 'Confirmemail' => array( 'ב×שטעטיגן_×¢-פ×סט' ),
+ 'Whatlinkshere' => array( 'בלעטער_וו×ס_פ×רבונדן_×הער' ),
+ 'Movepage' => array( 'ב×וועגן_בל×ט' ),
+ 'Blockme' => array( 'בל×קירט_מיך' ),
'Categories' => array( 'ק×טעג×ריעס' ),
'Export' => array( 'עקספ×רט' ),
'Version' => array( 'ווערזיע' ),
- 'Allmessages' => array( '×¡×™×¡×˜×¢× ×ž×¢×œ×“×•× ×’×¢×Ÿ' ),
+ 'Allmessages' => array( 'סיסטע×_מעלדונגען' ),
'Log' => array( 'ל×גביכער' ),
'Blockip' => array( 'בל×קירן' ),
'Import' => array( '×ימפ×רט' ),
- 'Unwatchedpages' => array( 'נישט ×ויפגעפ×סטע בלעטער' ),
+ 'Userrights' => array( 'ב×ניצער_רעכטן' ),
+ 'Unwatchedpages' => array( 'נישט_×ויפגעפ×סטע_בלעטער' ),
'Listredirects' => array( 'ווייטערפירונגען' ),
- 'Mypage' => array( 'מײַן בל×ט' ),
- 'Mytalk' => array( 'מײַן שמועס בל×ט' ),
- 'Mycontributions' => array( 'מיינע ביישטייערן' ),
- 'Listadmins' => array( 'ליסטע פון סיס×פן' ),
- 'Listbots' => array( 'ליסטע פון ב×טס' ),
- 'Popularpages' => array( 'פ×פולערע בלעטער' ),
+ 'Unusedtemplates' => array( '×ומב×ניצטע_מוסטערן' ),
+ 'Randomredirect' => array( 'צופעליק_ווײַטערפֿירן' ),
+ 'Mypage' => array( 'מײַן_בל×ט' ),
+ 'Mytalk' => array( 'מײַן_שמועס_בל×ט' ),
+ 'Mycontributions' => array( 'מיינע_ביישטייערן' ),
+ 'Listadmins' => array( 'ליסטע_פון_סיס×פן' ),
+ 'Listbots' => array( 'ליסטע_פון_ב×טס' ),
+ 'Popularpages' => array( 'פ×פולערע_בלעטער' ),
'Search' => array( 'זוכן' ),
- 'Withoutinterwiki' => array( 'בלעטער ×ָן ×ינטערוויקי' ),
- 'Blankpage' => array( 'ליידיגער בל×ט' ),
+ 'Resetpass' => array( 'ענדערן_פ×סוו×רט' ),
+ 'Withoutinterwiki' => array( 'בלעטער_×ָן_×ינטערוויקי' ),
+ 'Blankpage' => array( 'ליידיגער_בל×ט' ),
'Tags' => array( 'ט×גן' ),
+ 'Activeusers' => array( 'טעטיגע_ב×ניצער' ),
);
$defaultUserOptionOverrides = array(
@@ -129,7 +143,7 @@ $magicWords = array(
'nogallery' => array( '0', '__קיין_×’×לעריע__', '__לל×_גלריה__', '__NOGALLERY__' ),
'toc' => array( '0', '__××™× ×”×לט__', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
'noeditsection' => array( '0', '__נישט_רעד×קטירן__', '__לל×_עריכה__', '__NOEDITSECTION__' ),
- 'numberofarticles' => array( '1', 'צ×ל ×רטיקלען', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
+ 'numberofarticles' => array( '1', 'צ×ל_×רטיקלען', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
'pagename' => array( '1', 'בל×טנ×מען', '×©× ×”×“×£', 'PAGENAME' ),
'namespace' => array( '1', '× ×מענטייל', 'מרחב הש×', 'NAMESPACE' ),
'fullpagename' => array( '1', 'פולבל×טנ×מען', '×©× ×”×“×£ המל×', 'FULLPAGENAME' ),
@@ -143,10 +157,15 @@ $magicWords = array(
'img_none' => array( '1', '×ן', 'לל×', 'none' ),
'img_center' => array( '1', 'צענטער', 'מרכז', 'center', 'centre' ),
'img_sub' => array( '1', '×ונטער', 'תחתי', 'sub' ),
+ 'img_top' => array( '1', '×ויבן', 'למעלה', 'top' ),
+ 'img_bottom' => array( '1', '×ונטן', 'למטה', 'bottom' ),
+ 'img_link' => array( '1', 'לינק=$1', 'קישור=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'טעקסט=$1', 'טקסט=$1', 'alt=$1' ),
+ 'grammar' => array( '0', 'גר×מ×טיק:', 'דקדוק:', 'GRAMMAR:' ),
'plural' => array( '0', 'מערצ×ל:', 'רבי×:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'פֿולער × ×מען:', 'כתובת מל××”:', 'FULLURL:' ),
+ 'fullurl' => array( '0', 'פֿולער_× ×מען:', 'כתובת מל××”:', 'FULLURL:' ),
'raw' => array( '0', 'רוי:', '×œ×œ× ×¢×™×‘×•×“:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ווייזן קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
+ 'displaytitle' => array( '1', 'ווייזן_קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
'language' => array( '0', '#שפר×ך:', '#שפה:', '#LANGUAGE:' ),
'defaultsort' => array( '1', 'גרונטס×רטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'pagesize' => array( '1', 'בל×טגרייס', 'גודל דף', 'PAGESIZE' ),
@@ -168,8 +187,7 @@ $messages = array(
'tog-editsection' => 'ערמעגליכט ×פטייל ענדערן דורך [ענדערן] לינקס',
'tog-editsectiononrightclick' => 'ב×מעגליך פ×ר×גר××£ ענדערונגען דורכן קוועטשן ×ויפן רעכטן<br />×ויף ×פטייל קעפל (JavaScript)',
'tog-showtoc' => 'ווייז ד×ס ××™× ×”×לט קעסטל<br />(פ×ר בלעטער מיט מער ווי 3 קעפלעך)',
-'tog-rememberpassword' => 'געדענק מיין ל×גירן ×ין ×“×¢× ×§×מפיוטער',
-'tog-editwidth' => 'פֿ×ַרברייטערן ד×ס רעד×ַקטירונג קעסטל ×¦×•× ×¤Ö¿×•×œ×Ÿ ברייט',
+'tog-rememberpassword' => 'געדענק מיין ×ריינל×גירן ×ין ×“×¢× ×‘×œ×¢×˜×¢×¨×¢×¨ (ביז $1 {{PLURAL:$1|ט×ָג|טעג}})',
'tog-watchcreations' => 'לייג צו בלעטער וו×ס ×יך ב×ש××£ צו מיין ×כטונג ליסטע',
'tog-watchdefault' => '×ויפפ×סן ×ױט×ָמ×ַטיש די ×רטיקלען ×°×ָס ×יך ב×Ö·×ַרבעט',
'tog-watchmoves' => 'לייג צו בלעטער וו×ס ×יך ב×וועג צו מיין ×כטונג ליסטע',
@@ -316,31 +334,21 @@ $messages = array(
'faqpage' => 'Project:מערסטע געפרעגט פר×געס',
# Vector skin
-'vector-action-addsection' => 'צושטעלן טעמע',
-'vector-action-delete' => '×ויסמעקן',
-'vector-action-move' => 'ב×ַוועגן',
-'vector-action-protect' => 'שיצן',
-'vector-action-undelete' => 'מבטל זיין ×ויסמעקן',
-'vector-action-unprotect' => '×ר×פנעמען שיץ',
-'vector-namespace-category' => 'ק×ַטעג×ָריע',
-'vector-namespace-help' => 'הילף בל×ַט',
-'vector-namespace-image' => 'טעקע',
-'vector-namespace-main' => 'בל×ַט',
-'vector-namespace-media' => 'מעדיע בל×ַט',
-'vector-namespace-mediawiki' => 'מודעה',
-'vector-namespace-project' => 'פּר×ָיעקט בל×ַט',
-'vector-namespace-special' => 'ב×ַזונדערער בל×ַט',
-'vector-namespace-talk' => 'שמועס',
-'vector-namespace-template' => 'מוסטער',
-'vector-namespace-user' => 'ב×ַניצער בל×ַט',
-'vector-view-create' => 'ש×ַפֿן',
-'vector-view-edit' => 'רעד×ַקטירן',
-'vector-view-history' => 'ווײַזן היסט×ָריע',
-'vector-view-view' => 'לייענען',
-'vector-view-viewsource' => 'ווײַזן מקור',
-'actions' => '×ַקציעס',
-'namespaces' => '× ×ָמענטיילן',
-'variants' => '×°×ַרי×ַנטן',
+'vector-action-addsection' => 'צושטעלן טעמע',
+'vector-action-delete' => '×ויסמעקן',
+'vector-action-move' => 'ב×ַוועגן',
+'vector-action-protect' => 'שיצן',
+'vector-action-undelete' => 'מבטל זיין ×ויסמעקן',
+'vector-action-unprotect' => '×ר×פנעמען שיץ',
+'vector-simplesearch-preference' => '×ַקטיווירן פֿ×ַרברייטערטע זוך פֿ×רשל×ָגן',
+'vector-view-create' => 'ש×ַפֿן',
+'vector-view-edit' => 'רעד×ַקטירן',
+'vector-view-history' => 'ווײַזן היסט×ָריע',
+'vector-view-view' => 'לייענען',
+'vector-view-viewsource' => 'ווײַזן מקור',
+'actions' => '×ַקציעס',
+'namespaces' => '× ×ָמענטיילן',
+'variants' => '×°×ַרי×ַנטן',
'errorpagetitle' => 'פֿעלער',
'returnto' => 'צוריקקערן צו $1.',
@@ -354,15 +362,15 @@ $messages = array(
'history_short' => 'היסט×ריע',
'updatedmarker' => 'דערהיינטיגט זינט מיין לעצטע וויזיט',
'info_short' => '×ינפ×רמ×ציע',
-'printableversion' => 'ווערסיע פֿ×ַר פּרינטן',
+'printableversion' => 'דרוק ווערסיע',
'permalink' => 'שטענדיגער לינק',
'print' => 'דרוק',
'edit' => 'רעד×ַקטירן',
-'create' => 'ש×פֿן',
+'create' => 'ש×ַפֿן',
'editthispage' => 'ענדערן ×“×¢× ×‘×œ×ט',
'create-this-page' => 'ש×ַפֿן ×“×¢× ×‘×œ×ַט',
'delete' => '×ויסמעקן',
-'deletethispage' => 'מעק ×ויס ×“×¢× ×‘×œ×ט',
+'deletethispage' => '×ויסמעקן ×“×¢× ×‘×œ×ַט',
'undelete_short' => 'צוריקשטעלן {{PLURAL:$1|×יין רעד×ַקטירונג|$1 רעד×ַקטירונגען}}',
'protect' => 'ב×שיצן',
'protect_change' => 'טוישן',
@@ -401,6 +409,9 @@ $messages = array(
ביטע וו×רטן × ×‘×™×¡×œ צייט בעפ×ר ×יר פרובירט ווידער ×ריינגיין ××™× ×¢× ×‘×œ×ט.
$1',
+'pool-timeout' => '×ַריבער די צײַט וו×ַרטן פֿ×ר דער שליסונג',
+'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}}',
@@ -567,7 +578,8 @@ $2',
'yourname' => 'ב×ַניצער × ×ָמען:',
'yourpassword' => 'פ×סוו×רט',
'yourpasswordagain' => 'ווידער ×ריינקל×פן פ×סוו×רט',
-'remembermypassword' => 'געדיינק מיך',
+'remembermypassword' => 'געדיינק מײַן ×ַרײַנל×גירן ×ויף ×“×¢× ×§×מפיוטער (ביז $1 {{PLURAL:$1|ט×ָג|טעג}})',
+'securelogin-stick-https' => 'בלייַבן פ×רבונדן צו HTTPS × ×ָכן ×רײַנל×ָגירן',
'yourdomainname' => '×ײַער געביט:',
'externaldberror' => 'עס ××™×– ×דער פ×רגעקומען ×ן ×ויטענטיק×ציע ד×טנב××–×¢ פעלער ×דער ×יר זענט נישט ערמעגליכט צו דערהיינטיגן ×ייער דרויסנדיגע ק×נטע.',
'login' => '×ַרײַנל×ָגירן',
@@ -584,6 +596,7 @@ $2',
'gotaccount' => "×”×סט שוין × ×§×נטע? '''$1'''.",
'gotaccountlink' => '×ריינל×גירן',
'createaccountmail' => 'דורך ×¢-פ×סט',
+'createaccountreason' => '×ורז×ַך:',
'badretype' => 'די פ×סווערטער וו×ס ×יר ×”×ט ×ריינגעלייגט זענען נישט ××™×™× ×™×’.',
'userexists' => 'דער ב×ַנוצער × ×ָמען ××™×– שוין ×ין ב×ַנוץ. ביטע קלײַב ×ױס ×ַן ×ַנדער × ×ָמען.',
'loginerror' => 'ל×גירן פֿעלער',
@@ -605,6 +618,7 @@ $2',
'wrongpasswordempty' => 'פ×סוו×רט ×ריינגעלייגט ××™×– געווען ליידיג, ביטע פרובירט × ××›×מ×ל.',
'passwordtooshort' => 'פ×ַסווערטער מוזן זײַן ×›×טש {{PLURAL:$1|×יין ×›×ַר×ַקטער|$1 ×›×ַר×ַקטערס}}.',
'password-name-match' => '×ײַער פ×ַסוו×רט מוז זײַן ×נדערש פון ×ײַער ב×ַניצער × ×ָמען.',
+'password-login-forbidden' => 'ב×ַניצן ×“×¢× × ×ָמען ×ון שפּריכוו×ָרט ××™×– פ×ַרב×ָטן.',
'mailmypassword' => 'שיקט מיין × ×™×™×¢ פ×סוו×רט',
'passwordremindertitle' => '× ×™×™ צייטווייליג פ×סוו×רט פ×ר {{SITENAME}}',
'passwordremindertext' => 'עמעצער (×ž×¡×ª×ž× ×יר, פֿון IP ×דרעס $1)
@@ -694,9 +708,10 @@ $2',
'showlivepreview' => 'לעבעדיגע פ×ר×ויסדיגע ווייזונג',
'showdiff' => 'ווײַז די ענדערונגען',
'anoneditwarning' => "'''וו×רענונג:''' ×יר זענט נישט ×ריינל×גירט ×ין ×ייער ק×נטע. ×ייער ××™×™ פי ×דרעס וועט ווערן ד×קומענטירט ×ין ×“×¢× ×‘×œ×טס היסט×ריע פון ענדערונגען. ×ויב ×–×רגט ×יר זיך פ×ר פריוו×טקייטן, ביטע טוט זיך ×ריינל×גירן.",
+'anonpreviewwarning' => "''×יר זענט נישט ×ַרײַנל×גירט. ×ויפֿהיטן וועט ×רײַנשרײַבן ×ײַער IP ×ַדרעס ×ין דער רעד×ַקטירונג היסט×ריע ×¤×•× ×¢× ×‘×œ×ַט.''",
'missingsummary' => "'''דערמ×נונג:''' ×יר ×”×ט נישט ×ויסגעפילט ×“×¢× ×§×•×¨×¥ וו×רט ×ויפקלערונג ×ויף ×ייער עדיט. ×ויב וועט ×יר דרוקן × ××›×מ×ל ×ויף \"היט ×פ ×“×¢× ×‘×œ×ט\", וועט ×ייער ענדערונג ווערן געהיטן ×ן דע×.",
'missingcommenttext' => 'ביטע שטעלט ×ריין × ×נמערקונג פון ×ונטן.',
-'missingcommentheader' => "'''דערמ×נונג:''' ×יר ×”×ט נישט ×ריינגעשטעלט × ×˜×¢×ž×¢/קעפל פ×ר ×“×¢× ×נמערקונג. ×ויב וועט ×יר דרוקן × ××›×מ×ל ×ויפן \"היט-×פ בל×ט\", וועט ×ייער ענדערונג ווערן ×פגעהיטן ×ן דע×.",
+'missingcommentheader' => "'''דערמ×ַנונג:''' ×יר ×”×ט נישט ×ַרײַנגעשטעלט × ×˜×¢×ž×¢/קעפל פ×ר דער ×נמערקונג. ×ויב וועט ×יר דרוקן × ××›×מ×ל ×ויפן \"{{int:savearticle}}\", וועט ×ייער ענדערונג ווערן ×פגעהיטן ×ן דע×.",
'summary-preview' => 'סך-הכל פ×ר×ויסדיגע ווייזונג:',
'subject-preview' => 'טעמע/קעפל פ×ר×ויסדיגע ווייזונג:',
'blockedtitle' => 'ב×נוצער ××™×– בל×קירט',
@@ -776,7 +791,11 @@ $2',
'''ער ××™×– דערווייל × ×כנישט ×ויפֿגעהיטן!'''",
'userjspreview' => "'''געדענקט ×Ö·×– ×יר טוט בלויז ×ויספרו×וון\\פֿ×ר×ויסזען ×ייער ב×ַניצער JavaScript.'''
'''עס ××™×– דערווײַל × ×כנישט ×ָפגעהיטן!'''",
-'userinvalidcssjstitle' => "'''וו×רענונג:''' ס××™×– × ×™×©×˜× ×§×™×™×Ÿ סקין \"\$1\". גדענקט ××– ק××¡×˜×¢× .css ×ון .js בלעטער נוצען ל×וער קעיס טיטול, e.g. {{ns:user}}:Foo/monobook.css ווי ×נדערשט צו {{ns:user}}:Foo/Monobook.css.",
+'sitecsspreview' => "'''געדענקט ×Ö·×– ×יר טוט בלויז פֿ×ר×ויסזען ×“×¢× ×“×ָזיקן CSS ק×ד.'''
+'''ער ××™×– דערווײַל × ×כנישט ×ויפֿגעהיטן!'''",
+'sitejspreview' => "'''געדענקט ×Ö·×– ×יר טוט בלויז פֿ×ר×ויסזען ×“×¢× ×“×ָזיקן JavaScript ק×ד.'''
+'''ער ××™×– דערווײַל × ×כנישט ×ויפֿגעהיטן!'''",
+'userinvalidcssjstitle' => "'''וו×רענונג:''' ס××™×– × ×™×©×˜× ×§×™×™×Ÿ סקין \"\$1\". גדענקט ××– ק××¡×˜×¢× .css ×ון .js בלעטער נוצען ל×וער קעיס טיטול, e.g. {{ns:user}}:Foo/vector.css ווי ×נדערשט צו {{ns:user}}:Foo/Vector.css.",
'updated' => '(דערהיינטיגט)',
'note' => "'''ב×מערקונג:'''",
'previewnote' => "'''ד×ס ××™×– × ×ָר ×ין ×Ö· פֿ×ָרויסיקע ווייזונג, דער ×ַרטיקל ××™×– דערווייל × ×ָך נישט געהיט!'''",
@@ -812,8 +831,6 @@ $2',
×זוי ×ויך, ×–×גט ×יר צו ××– ×יר ×”×ט ד×ס געשריבן ×ליין, ×דער ד×ס ×יבערק×פירט פון × ×ž×§×•×¨ מיט פולן רשות ד×ס מפקיר זיין (זעט $1 פ×ר מער פרטי×).
'''זיכט נישט ב×ניצן מיט שט××£ וו×ס ××™×– ב×שיצט מיט ק×פירעכטן!'''",
-'longpagewarning' => "'''וו×רענונג: דער בל×ט ××™×– ל×× ×’ $1 קיל×בייטן; געוויסע בלעטערערס קענען מעגלעך ×”×בן פר×בלעמען צו רעד×קטירן בלעטער וו×ס גרייכן ×דער זענען לענגער פֿון 32kb.
-ביטע ב×טר×כט ×יינטיילן ×“×¢× ×‘×œ×ט צו קלענערע ×פטיילונגען.'''",
'longpageerror' => "'''פעילער: די טעקסט וו×ס ×יר ×”×ט ×ריינגעשטעלט ××™×– $1 קיל×בייטס ל×× ×’, וו×ס ××™×– לענגער פון די מ××§×¡×™×ž×•× ×¤×•×Ÿ $2 קיל×בייטס. עס קען נישט ווערן ×פגעהיטן.'''",
'readonlywarning' => "'''וו×רענונג: די ד×טעב××–×¢ ××™×– געוו×רן פ×רשל×סן פ×ר סייט ×ויפה×לטונג,
×ž×ž×™×œ× ×•×•×¢×˜ ×יר נישט קענען ×פהיטן ×ייערע ענדערונגען ×צינד. ×יר קענט ק×פירן ×ון ×רײַנלייגן ×“×¢× ×˜×¢×§×¡×˜ ×ריין צו × ×˜×¢×§×¡×˜ טעקע ×ון ד×ס ד×רטן ×פהיטן פ×ר שפעטער.'''
@@ -889,8 +906,8 @@ $2',
'currentrev-asof' => 'לויפיקע רעוויזיע פון $1',
'revisionasof' => 'רעוויזיע ביי $1',
'revision-info' => 'רעוויזיע ביי $1 פון $2',
-'previousrevision' => '→ עלטערער ווערסיע',
-'nextrevision' => '× ×™×™×¢ ווערסיע â†',
+'previousrevision' => '→ עלטערע ווערסיע',
+'nextrevision' => 'נײַערע ווערסיע â†',
'currentrevisionlink' => '×יצטיגע ווערסיע',
'cur' => '×יצט',
'next' => 'קומענדיגע',
@@ -944,8 +961,9 @@ $2',
'revdelete-nologtype-title' => 'קיין ל××’ טיפ נישט געקליבן',
'revdelete-nologtype-text' => '×יר ×”×ט נישט ספעציפֿירט קיין ל××’ טיפ דורצוכפֿירן די פֿונקציע.',
'revdelete-nologid-title' => '×ומגילטיגער ל×ג־פֿ×ַרשרײַב',
-'revdelete-no-file' => 'די טעקע ספעציפֿירט עקזיסטירט נישט.',
-'revdelete-show-file-confirm' => 'צי זענט ×יר זעכער ×יר ווילט ב×ַקוקן ×ן ×ויסגעמעקטע רעוויזיע פון דער טעקע "<nowiki>$1</nowiki>" פון $2 בשעה $3?',
+'revdelete-nologid-text' => '×דער ×”×ט ×יר נישט ספעציפֿיצירט × ×¦×™×œ ל×גטיפ ×דער ××™×– נישט פֿ×ַרה×ַן דער ספעציפֿיצירטער ל×גטיפ.',
+'revdelete-no-file' => 'די ספעציפֿירטע טעקע עקזיסטירט נישט.',
+'revdelete-show-file-confirm' => 'צי זענט ×יר זעכער ×יר ווילט ב×ַקוקן ×ַן ×ויסגעמעקטע רעוויזיע פון דער טעקע "<nowiki>$1</nowiki>" פון $2 בשעה $3?',
'revdelete-show-file-submit' => '×™×',
'revdelete-selected' => "'''{{PLURAL:$2|×ויסדערוויילטע ווערסיע| ×ויסדערוויילטע ווערסיעס}} פון [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1| ×ויסדערוויילטע ל××’ ×קציע|×ויסדערוויילטע ל××’ ×קציעס}}:'''",
@@ -975,6 +993,8 @@ $1",
'logdelete-failure' => "'''נישט מעגלעך צו שטעלן ל××’ זעב×ַרקייט:'''
$1",
'revdel-restore' => 'טויש די זעב×רקייט',
+'revdel-restore-deleted' => '×ויסגעמעקטע ווערסיעס',
+'revdel-restore-visible' => 'זעב×ַרע ווערסיעס',
'pagehist' => 'בל×ט היסט×ריע',
'deletedhist' => '×ויסגעמעקטע ווערסיעס',
'revdelete-content' => '××™× ×”×לט',
@@ -1031,11 +1051,13 @@ $1",
# Diffs
'history-title' => 'רעוויזיע היסט×ריע פֿון $1',
'difference' => '(×ונטערשייד צווישן ווערסיעס)',
+'difference-multipage' => '(×ונטערשייד צווישן בלעטער)',
'lineno' => 'שורה $1:',
'compareselectedversions' => 'פ×רגלייך סעלעקטירטע ווערסיעס',
'showhideselectedversions' => 'ווײַזן/ב×Ö·×”×ַלטן געקליבענע רעוויזיעס',
'editundo' => '×ַנולירן',
-'diff-multi' => '({{PLURAL:$1|×יין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} נישט געוויזן.)',
+'diff-multi' => '({{PLURAL:$1|×יין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון {{PLURAL:$2|×יין ב×ַניצער|$2 ב×ַניצער}} נישט געוויזן.)',
+'diff-multi-manyusers' => '({{PLURAL:$1|×יין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון מער ווי {{PLURAL:$2|×יין ב×ַניצער|$2 ב×ַניצער}} נישט געוויזן.)',
# Search results
'searchresults' => 'זוכן רעזולט×טן',
@@ -1070,6 +1092,7 @@ $1",
'searchprofile-everything-tooltip' => 'זוך ××™× ×¢× ×’×נצען ××™× ×”×לט (×ריינגערעכנט רעדן בלעטער)',
'searchprofile-advanced-tooltip' => 'זוכן ×ין צוגעשטעלטע ָנ×ָמענטיילן',
'search-result-size' => '$1 ({{PLURAL:$2|×יין וו×רט|$2 ווערטער}})',
+'search-result-category-size' => '{{PLURAL:$1|1 מיטגליד|$1 מיטגלידער}} ({{PLURAL:$2|1 ×ונטער־ק×ַטעג×ריע|$2 ×ונטער־ק×ַטעג×ריעס}}, {{PLURAL:$3|1 טעקע|$3 טעקעס}})',
'search-result-score' => 'שייכותדיקייט: $1%',
'search-redirect' => '(ווײַטערפֿירן $1)',
'search-section' => '(×פטיילונג $1)',
@@ -1099,6 +1122,9 @@ $1",
'powersearch-toggleall' => '×לע',
'powersearch-togglenone' => 'קיין',
'search-external' => 'דרויסנדיק זוכן',
+'searchdisabled' => "{{SITENAME}} זוך ××™×– ×ָפ×ַקטיווירט.
+צווישנצײַט קענט ×יר זוכן מיט גוגל.
+געב ×כט ××– ס'××™×– מעגלעך ×Ö·×– זייער ×ינדעקס פֿון {{SITENAME}} ××™× ×”×ַלט ××™×– ×פשר פֿ×ַרעלטערט.",
# Quickbar
'qbsettings' => 'גיכפ×ַס',
@@ -1124,9 +1150,9 @@ $1",
'prefs-rc' => 'לעצטע ענדערונגען',
'prefs-watchlist' => '×ויפפ×סונג ליסטע',
'prefs-watchlist-days' => 'טעג צו ווייזן ×ין דער ×ויפפ×סונג ליסטע:',
-'prefs-watchlist-days-max' => '(מ××§×¡×™×ž×•× 7 טעג)',
+'prefs-watchlist-days-max' => 'העכסטן 7 טעג',
'prefs-watchlist-edits' => 'מ×Ö·×§×¡×™×ž×•× × ×•×ž×¢×¨ פון נײַע ענדערונגען צו ווייַזן ×ין פֿ×ַרברייטערטער ×ויפֿפ×ַסונג ליסטע:',
-'prefs-watchlist-edits-max' => '(מ××§×¡×™×ž×•× ×¦×ל: 1000)',
+'prefs-watchlist-edits-max' => 'מ×Ö·×§×¡×™×ž×•× × ×•×ž×¢×¨: 1000',
'prefs-watchlist-token' => '×ויפֿפ×ַסונג ליסטע סימן:',
'prefs-misc' => 'פֿ×ַרשידנס',
'prefs-resetpass' => 'טוישן פ×ַסוו×רט',
@@ -1144,6 +1170,7 @@ $1",
'contextlines' => 'שורות פער רעזולט×ט',
'contextchars' => 'ק×נטעקסט פער שורה',
'stub-threshold' => 'שוועל פֿ×ַר <a href="#" class="stub">שטומף לינק</a> פֿ×ָרמ×ַטירונג (בייטן):',
+'stub-threshold-disabled' => '×ַנולירט',
'recentchangesdays' => 'צ×ל פון טעג צו ווייזן ×ין די לעצטע ענדערונגן:',
'recentchangesdays-max' => 'מ×Ö·×§×¡×™×ž×•× $1 {{PLURAL:$1|ט×ָג|טעג}}',
'recentchangescount' => 'די צ×ָל רעד×ַקטירונגען צו ווײַזן גרונטלעך:',
@@ -1174,6 +1201,7 @@ $1",
'prefs-files' => 'טעקעס',
'prefs-custom-css' => 'ב×ַניצער דעפֿינירט CSS',
'prefs-custom-js' => 'ב×ַניצער דעפֿינירט JS',
+'prefs-common-css-js' => 'שותפֿותדיקער CSS/JS פֿ×ַר ×ַלע ×ויספֿ×רמירונגען:',
'prefs-reset-intro' => '×יר קענט ניצן ×“×¢× ×‘×œ×ַט צוריקצושטעלן ×ײַערע פרעפֿערענצן גרונטלעך פֿ×ַרן ×רט. to reset your preferences to the site defaults.
מען קען ד×ָס נישט ×ַנולירן.',
'prefs-emailconfirm-label' => '×¢-פ×סט ב×ַשטעטיקונג:',
@@ -1210,9 +1238,15 @@ $1",
'prefs-advancedrendering' => '×דוו×נסירטע ×פציעס',
'prefs-advancedsearchoptions' => '×דוו×נסירטע ×פציעס',
'prefs-advancedwatchlist' => '×דוו×נסירטע ×פציעס',
-'prefs-display' => 'ווייז ×פציעס',
+'prefs-displayrc' => 'ווייז ×פציעס',
+'prefs-displaysearchoptions' => 'ווײַז ×פציעס',
+'prefs-displaywatchlist' => 'ווײַז ×פציעס',
'prefs-diffs' => 'צווישנשיידן',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => '×¢-פּ×ָסט ×ַדרעס זעט ×ויס גילטיק',
+'email-address-validity-invalid' => 'לייגט ×ַרײַן × ×’×™×œ×˜×™×§×Ÿ ע־פ×סט ×ַדרעס',
+
# User rights
'userrights' => 'ב×נוצער רעכטן פ×רוו×לטערש×פט',
'userrights-lookup-user' => 'פֿ×ַרוו×ַלטן ב×ניצער גרופעס',
@@ -1350,14 +1384,9 @@ $1",
'recentchanges-legend' => 'ברירות פ×ר לעצטע ענדערונגען',
'recentchangestext' => '×’×™×™ × ×ך די לעצטע ענדערונגען צו דער וויקי ×ויף ×“×¢× ×‘×œ×ט.',
'recentchanges-feed-description' => 'גייט × ×ך די לעצטע ענדערונגען צו דער וויקי ×ין ×“×¢× ×‘×œ×ט.',
-'recentchanges-label-legend' => 'לעגענדע: $1.',
-'recentchanges-legend-newpage' => '$1 - נײַער בל×ַט',
'recentchanges-label-newpage' => 'די רעד×ַקטירונג ×”×ט ב×ש×פֿן × × ×²Ö·×¢× ×‘×œ×ַט',
-'recentchanges-legend-minor' => '$1 - מינערדיקע רעד×ַקטירונג',
'recentchanges-label-minor' => 'ד×ָס ××™×– ×Ö· מינערדיקע רעד×ַקטירונג',
-'recentchanges-legend-bot' => '$1 - ב×ט רעד×ַקטירונג',
'recentchanges-label-bot' => ' די רעד×ַקטירונג ×”×ט ×ויסגעפירט × ×‘×ט',
-'recentchanges-legend-unpatrolled' => '$1 - ×ומפ×ַטר×לירטע רעד×ַקטירונג',
'recentchanges-label-unpatrolled' => 'די רעד×קטירונג ××™×– × ×ך נישט × ×כגעקוקט',
'rcnote' => "×ונטן {{PLURAL:$1|××™×– '''1''' ענדערונג|זײַנען די לעצטע '''$1''' ענדערונגען}} ×ין {{PLURAL:$2|×“×¢× ×œ×¢×¦×˜×Ÿ ט××’|די לעצטע $2 טעג}}, ביז $5, $4.",
'rcnotefrom' => "פֿ×לגנד זענען די ענדערונגען זײַט '''$2''' (ביז '''$1''')",
@@ -1397,6 +1426,7 @@ $1",
# Upload
'upload' => '×ַרױפֿל×ָדן בילדער/טעקעס',
'uploadbtn' => '×ַרױפֿל×ָדן טעקע',
+'reuploaddesc' => '×ַנולירן ×ַרויפֿל×ָד ×ון צוריקגיין צו דער ×ַרויפֿל×ָדן פֿ×רע×',
'upload-tryagain' => 'פֿ×ָרלייגן מ×דיפֿיצירטע טעקע ב×ַשרײַבונג',
'uploadnologin' => 'נישט ×ַרײַנל×גירט',
'uploadnologintext' => '×יר מוזט זײַן [[Special:UserLogin| ×ַרײַנל×ָָגירט]] כדי ×רויפֿצול×ָדן טעקעס',
@@ -1429,6 +1459,14 @@ $1",
ביטע גיט דער טעקע × × ×²Ö·×¢× × ×מען ×ון פּרובירט ×רויפֿל×ָדן × ××›×ַמ×ָל.',
'badfilename' => 'טעקע × ×מען ××™×– געטוישט צו "$1".',
'filetype-missing' => 'די טעקע ×”×ט נישט קיין פ×רברייטערונג (למשל ".jpg").',
+'empty-file' => 'די טעקע וו×ָס ×יר ×”×ט ×ײַנגעגעבן ××™×– ליידיג.',
+'file-too-large' => 'די טעקע וו×ָס ×יר ×”×ט ×ײַנגעגעבן ××™×– צו גרויס.',
+'filename-tooshort' => 'דער טעקענ×מען ××™×– צו קורץ',
+'filetype-banned' => 'דער טיפ טעקע ××™×– ×’×¢×ַסרט',
+'illegal-filename' => 'דער טעקע־נ×ָמען ××™×– נישט ערלויבט',
+'unknown-error' => '×ַן ×ומב×ַק×ַנט טעות ××™×– פֿ×רגעקומען.',
+'tmp-create-error' => 'קען נישט ש×ַפֿן צייַטווייַליקע טעקע.',
+'tmp-write-error' => 'טעות ×‘×²Ö·× ×©×¨×™×™Ö·×‘×Ÿ צייַטווייַליקע טעקע.',
'large-file' => 'רעק×מענדירט ××– טעקעס ×–×ל נישט זײַן גרעסער פֿון$1;
די טעקע ××™×– $2.',
'emptyfile' => 'די טעקע וו×ס ×יר ×”×ט ×רויפֿלגעל×ָדן ××™×– ליידיג.
@@ -1443,7 +1481,6 @@ $1",
×ויב ×יר ווילט ד×ך ×ַרויפֿל×ָדן ×ײַער טעקע, ביטע גיין צוריק ×ון ניצן ×ַן ×ַנדער × ×ָמען.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'די טעקע ××™×– × ×“×•×¤×œ×™×§×ַט פון די פֿ×לגנדע {{PLURAL:$1|טעקע|טעקעס}}:',
-'successfulupload' => 'דערפֿ×לגרייכער ×רויפֿל×ָד',
'uploadwarning' => '×ַרויפֿל×ָדן וו×ָרענונג',
'uploadwarning-text' => 'זײַט ×ַזוי גוט מ×דיפֿיצירן די טעקע ב×ַשרייבונג ×ון פרובירט × ××›×ַמ×ָל.',
'savefile' => 'טעקע ×ױפֿהיטן',
@@ -1461,6 +1498,13 @@ $1",
'upload-description' => 'טעקע שילדערונג',
'upload-options' => "×ַרויפֿל×ָדן ברירה'ס",
'watchthisupload' => '×ויפֿפ×ַסן ×“×¢× ×‘×œ×ט',
+'upload-success-subj' => 'דערפֿ×לגרייכער ×רויפֿל×ָד',
+'upload-success-msg' => '×ײַער ×ַרויפֿל×ָד פֿון [$2] ××™×– געווען דערפֿ×לגרייך. עס ××™×– פֿ×ַר×ָן ד×Ö¸: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => '×ַרויפֿל×ָדן פר×בלע×',
+'upload-failure-msg' => "ס'××™×– געווען × ×¤×¨××‘×œ×¢× ×ž×™×˜ ×ײַער ×ָרויפֿל×ַד פֿון [$2]:
+
+$1",
+'upload-warning-subj' => '×ַרויפֿל×ָדן וו×ָרענונג',
'upload-proto-error' => 'פ×לשער פר×ט×ק×ל',
'upload-file-error' => '×ינערליכער פעלער',
@@ -1495,6 +1539,7 @@ $1",
'listfiles_search_for' => 'זוכן פֿ×ַר מעדיע × ×ָמען:',
'imgfile' => 'טעקע',
'listfiles' => 'טעקע ליסטע',
+'listfiles_thumb' => 'געמינערט בילד',
'listfiles_date' => 'ד×טע',
'listfiles_name' => '× ×מען',
'listfiles_user' => 'ב×ַניצער',
@@ -1604,8 +1649,8 @@ $1",
'statistics-edits' => 'רעד×ַקטירונגען זײַט {{SITENAME}} ××™×– ×ויפֿגעשטעלט',
'statistics-edits-average' => 'דורכשניט רעד×ַקטירונגען ×ין × ×‘×œ×ַט',
'statistics-views-total' => 'צ×ל קוקן ××™× ×’×ַנצן',
+'statistics-views-total-desc' => 'ב×ַקוקן צו נישט־פֿ×ַרה×ַנען בלעטער ×ון ב×ַזונדערע בלעטער זענען נישט ×ַרייַנגערעכנט.',
'statistics-views-peredit' => 'צ×ל קוקן צו × ×¨×¢×“×ַקטירונג',
-'statistics-jobqueue' => 'לענג [http://www.mediawiki.org/wiki/Manual:Job_queue ×ויפֿג×ַבעס ריי]',
'statistics-users' => '×יינגעשריבענע [[Special:ListUsers|ב×ניצערס]]',
'statistics-users-active' => 'טעטיקע ב×ניצערס',
'statistics-users-active-desc' => 'ב×ניצערס וו×ס ×”×בן דורכגעפירט × ×¤×¢×•×œ×” ×ין די לעצטע {{PLURAL:$1|ט××’|$1 טעג}}',
@@ -1618,7 +1663,7 @@ $1",
'doubleredirects' => 'געט×פלטע ווײַטערפֿירונגען',
'doubleredirectstext' => 'דער בל×ט רעכנט ×ויס בלעטער וו×ס פירן ווייטער צו ×נדערע ווייטערפירן בלעטער.
יעדע שורה ×נטה×לט × ×œ×™× ×§ ×¦×•× ×¢×¨×©×˜×Ÿ ×ון צווייטן ווייטערפירונג, ווי ×ויך די ציל פון דער צווייטער ווייטערפירונג, וו×ס רוב מ×ל געפינט זיך די ריכטיגע ציל וו×ו די ערשטע ווייטערפירונג ×–×ל ווייזן.
-<s>×ויסגעשטר××›×¢× ×¢</s> טעמעס זענען שוין געלייזט.',
+<del>×ויסגעשטר××›×¢× ×¢</del> טעמעס זענען שוין געלייזט.',
'double-redirect-fixed-move' => '[[$1]] ××™×– געוו×רן ב×וועגט, ×ון ××™×– יעצט × ×•×•×™×™×˜×¢×¨×¤Ö¿×™×¨×•× ×’ צו [[$2]]',
'double-redirect-fixer' => 'מתקן ווײַטערפֿירונגען',
@@ -1641,6 +1686,8 @@ $1",
'nmembers' => '$1 {{PLURAL:$1|בל×ט|בלעטער}}',
'nrevisions' => '{{PLURAL:$1|×יין רעוויזיע|$1 רעוויזיעס}}',
'nviews' => '{{PLURAL:$1|×יין קוק|$1 קוקן}}',
+'nimagelinks' => 'געניצט ×ויף $1 {{PLURAL:$1|בל×ַט|בלעטער}}',
+'ntransclusions' => 'געניצט ×ויף $1 {{PLURAL:$1|בל×ַט|בלעטער}}',
'specialpage-empty' => 'דער בל×ט ××™×– ליידיג.',
'lonelypages' => "פֿ×ר'יתומ'טע בלעטער",
'lonelypagestext' => 'די פֿ×לגנדע בלעטער זענען נישט פֿ×ַרבינדן פֿון ×דער ×ריבערגעשל×סן ×ין ×נדערע בלעטער ×ין {{SITENAME}}.',
@@ -1791,34 +1838,40 @@ $1",
'listgrouprights-removegroup-self-all' => '×ר×ָפנעמען ×ַלע גרופעס פֿון ×ייגענער ק×נטע',
# E-mail user
-'mailnologin' => '× ×™×©×˜× ×§×™×™×Ÿ ×דרעס צו שיקן',
-'mailnologintext' => '×יר ברויכט זײַן [[Special:UserLogin|×ַרײַנל×גירט]] ×ון ×”×ָבן × ×’×™×œ×˜×™×’×Ÿ ע־פ×סט ×ַדרעס ×ין ×ײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פ×סט צו ×ַנדערע ב×ַניצער.',
-'emailuser' => '×ַרויסשיקן ×¢-פ×סט צו ×“×¢× ×‘×ַניצער',
-'emailpage' => '×ַרויסשיקן ×¢-פ×סט צו ב×ַניצער.',
-'emailpagetext' => '×יר קענט ניצן ×“×¢× ×¤Ö¿××¨×¢× ×ונטן צו שיקן ×ן בליצבריוו צו ×“×¢× ×“×זיגן ב×ַניצער.
+'mailnologin' => '× ×™×©×˜× ×§×™×™×Ÿ ×דרעס צו שיקן',
+'mailnologintext' => '×יר ברויכט זײַן [[Special:UserLogin|×ַרײַנל×גירט]] ×ון ×”×ָבן × ×’×™×œ×˜×™×’×Ÿ ע־פ×סט ×ַדרעס ×ין ×ײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פ×סט צו ×ַנדערע ב×ַניצער.',
+'emailuser' => '×ַרויסשיקן ×¢-פ×סט צו ×“×¢× ×‘×ַניצער',
+'emailpage' => '×ַרויסשיקן ×¢-פ×סט צו ב×ַניצער.',
+'emailpagetext' => '×יר קענט ניצן ×“×¢× ×¤Ö¿××¨×¢× ×ונטן צו שיקן ×ן בליצבריוו צו ×“×¢× ×“×זיגן ב×ַניצער.
דער ×¢-פ×סט ×דרעס וו×ס ×יר ×”×ט ×ריינגעלייגט ×ין [[Special:Preferences| ×ייערע ב×ניצער פרעפערנעצן]] וועט זיך ווייזן ×›×ילו ד×ס ××™×– געקומען פון ד×רטן, בכדי צו דערמעגלעכן × ×ª×©×•×‘×”.',
-'usermailererror' => 'בליצבריוו ×”×ט צוריקגעשיקט × ×˜×¢×•×ª:',
-'defemailsubject' => '×¢-פ×סט {{SITENAME}}',
-'noemailtitle' => '× ×™×©×˜× ×§×™×™×Ÿ ××™-מעיל ×דרעס',
-'noemailtext' => 'דער ב×ַניצער ×”×ט נישט ב×שטימט קיין גילטיקן ×¢-פ×סט ×דרעס.',
-'nowikiemailtitle' => 'קיין ×¢-פ×סט נישט דערלויבט',
-'nowikiemailtext' => 'דער ב×ַניצער ×”×ט געקליבן נישט ב×ַקומען ע־פ×סט פֿון ×ַנדערע ב×ַניצער.',
-'email-legend' => '×ַרויסשיקן ×¢-פ×סט צו ×ַן ×ַנדער {{SITENAME}} ב×ַניצער',
-'emailfrom' => 'פון',
-'emailto' => 'צו',
-'emailsubject' => 'טעמע:',
-'emailmessage' => 'מעלדונג:',
-'emailsend' => 'שיק',
-'emailccme' => 'שיק מיר דורך ע־פ×סט × ×§×פיע פֿון מיין מעלדונג.',
-'emailccsubject' => 'ק×פיע פון ×ײַער מעלדונג צו $1: $2',
-'emailsent' => '×¢-פ×סט געשיקט',
-'emailsenttext' => '×ײַער ××™-בריוו ××™×– געשיקט געוו×רן.',
-'emailuserfooter' => 'דער בליצבריוו ××™×– געשיקט געוו×רן דורך$1 צו $2 מיט דער "שיקן בליצבריוו" פֿונקציע בײַ {{SITENAME}}.',
+'usermailererror' => 'בליצבריוו ×”×ט צוריקגעשיקט × ×˜×¢×•×ª:',
+'defemailsubject' => '×¢-פ×סט {{SITENAME}}',
+'usermaildisabled' => 'ב×ַניצער ע־פ×סט ×ומ×ַקטיוויזירט',
+'usermaildisabledtext' => '×יר קענט נישט שיקן ע־פ×סט צו ×נדערע ב×ַניצערס ×ויף דער ד×ָזיקער וויקי',
+'noemailtitle' => '× ×™×©×˜× ×§×™×™×Ÿ ××™-מעיל ×דרעס',
+'noemailtext' => 'דער ב×ַניצער ×”×ט נישט ב×שטימט קיין גילטיקן ×¢-פ×סט ×דרעס.',
+'nowikiemailtitle' => 'קיין ×¢-פ×סט נישט דערלויבט',
+'nowikiemailtext' => 'דער ב×ַניצער ×”×ט געקליבן נישט ב×ַקומען ע־פ×סט פֿון ×ַנדערע ב×ַניצער.',
+'email-legend' => '×ַרויסשיקן ×¢-פ×סט צו ×ַן ×ַנדער {{SITENAME}} ב×ַניצער',
+'emailfrom' => 'פון',
+'emailto' => 'צו',
+'emailsubject' => 'טעמע:',
+'emailmessage' => 'מעלדונג:',
+'emailsend' => 'שיק',
+'emailccme' => 'שיק מיר דורך ע־פ×סט × ×§×פיע פֿון מיין מעלדונג.',
+'emailccsubject' => 'ק×פיע פון ×ײַער מעלדונג צו $1: $2',
+'emailsent' => '×¢-פ×סט געשיקט',
+'emailsenttext' => '×ײַער ××™-בריוו ××™×– געשיקט געוו×רן.',
+'emailuserfooter' => 'דער בליצבריוו ××™×– געשיקט געוו×רן דורך$1 צו $2 מיט דער "שיקן בליצבריוו" פֿונקציע בײַ {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => '×יבערל×זן ×¡×™×¡×˜×¢× ×ָנז×ָג',
+'usermessage-editor' => '×¡×™×¡×˜×¢× ×©×œ×™×—',
# Watchlist
'watchlist' => 'מיין ×ויפפַּ×סונג ליסטע',
'mywatchlist' => 'מיין ×ויפפַּ×סונג ליסטע',
-'watchlistfor' => "(פ×ר '''$1''')",
+'watchlistfor2' => 'פֿ×ַר $1 $2',
'nowatchlist' => '×יר ×”×ט נישט קיין ×©×•× ×‘×œ×¢×˜×¢×¨ ×ין ×ייער ×ויפפַּ×סונג ליסטע.',
'watchlistanontext' => 'ביטע $1 כדי צו זען ×דער ענדערן בלעטער ×ין ×ייער ×ַכטגעבן ליסטע.',
'watchnologin' => '×יר זענט נישט ×ַרײַנל×גירט',
@@ -1939,7 +1992,10 @@ $UNWATCHURL
'revertpage' => 'רעד×ַקטירונגען פֿון [[Special:Contributions/$2|$2]] צוריקגענומען ([[User talk:$2|רעדן]]) צו דער לעצטער ווערסיע פֿון [[User:$1|$1]]',
'revertpage-nouser' => 'צוריקגעשטעלט רעד×ַקטירונגען פֿון (ב×ַניצער־נ×ָמען ×ַר×ָפגענומען) צו לעצטער רעוויזיע פֿון [[User:$1|$1]]',
'rollback-success' => 'צוריקגעדרייט רעד×ַקטירונגען פֿון $1 צו דער לעצטע ווערסיע פֿון $2',
-'sessionfailure' => "ווײַזט ×ויס ××– ס'××™×– ×“× × ×¤×¨××‘×œ×¢× ×ž×™×˜ ×ייער ×רײַנל×גירן; די פעולה ××™×– געוו×רן ×נולירט צו פֿ×ַרהיטן קעגן פֿ×ַרשטעלן ×ייער סעסיע. זייט ×זוי גוט ×ון גייט צוריק ×¦×•× ×¤Ö¿×¨×™×¢×¨×“×™×§×Ÿ בל×ט, ×ון פרובירט × ××›×ַמ×ָל.",
+
+# Edit tokens
+'sessionfailure-title' => 'זיצונג דורכפֿ×ַל',
+'sessionfailure' => "ווײַזט ×ויס ××– ס'××™×– ×“× × ×¤×¨××‘×œ×¢× ×ž×™×˜ ×ייער ×רײַנל×גירן; די פעולה ××™×– געוו×רן ×נולירט צו פֿ×ַרהיטן קעגן פֿ×ַרשטעלן ×ייער סעסיע. זייט ×זוי גוט ×ון גייט צוריק ×¦×•× ×¤Ö¿×¨×™×¢×¨×“×™×§×Ÿ בל×ט, ×ון פרובירט × ××›×ַמ×ָל.",
# Protect
'protectlogpage' => 'ב×שיצונג ל×ָג-בוך',
@@ -2059,18 +2115,22 @@ $UNWATCHURL
'month' => 'ביז חודש:',
'year' => 'ביז ×™×ר:',
-'sp-contributions-newbies' => 'ווײַזן בײַשטײַערונגען × ×ר פֿון נײַע ב×ַניצערס',
-'sp-contributions-newbies-sub' => 'פ×ר × ×™×™×¢ ק×נטעס',
-'sp-contributions-newbies-title' => 'בײַשטײַערונגען פֿון נײַע ב×ַניצערס',
-'sp-contributions-blocklog' => 'בל×קירן ל××’',
-'sp-contributions-deleted' => '×ויסגעמעקטע ב×ַניצער בײַשטײַערונגען',
-'sp-contributions-logs' => 'ל×גביכער',
-'sp-contributions-talk' => 'שמועס',
-'sp-contributions-userrights' => 'ב×ַניצער רעכטן פֿ×ַרוו×ַלטונג',
-'sp-contributions-blocked-notice' => 'דער ב×ַניצער ××™×– ×ַצינד בל×קירט. פֿ×לגנד ××™×– די לעצטע ×ַקציע ××™× ×¢× ×¤Ö¿×ַרשפ×ַרונג ל×גבוך:',
-'sp-contributions-search' => 'זוכן בײַשטײַערונגען',
-'sp-contributions-username' => 'ב×ניצער × ×מען ×דער IP ×דרעס:',
-'sp-contributions-submit' => 'זוכן',
+'sp-contributions-newbies' => 'ווײַזן בײַשטײַערונגען × ×ר פֿון נײַע ב×ַניצערס',
+'sp-contributions-newbies-sub' => 'פ×ר × ×™×™×¢ ק×נטעס',
+'sp-contributions-newbies-title' => 'בײַשטײַערונגען פֿון נײַע ב×ַניצערס',
+'sp-contributions-blocklog' => 'בל×קירן ל××’',
+'sp-contributions-deleted' => '×ויסגעמעקטע ב×ַניצער בײַשטײַערונגען',
+'sp-contributions-uploads' => '×ַרויפֿל×ָדונגען',
+'sp-contributions-logs' => 'ל×גביכער',
+'sp-contributions-talk' => 'שמועס',
+'sp-contributions-userrights' => 'ב×ַניצער רעכטן פֿ×ַרוו×ַלטונג',
+'sp-contributions-blocked-notice' => 'דער ב×ַניצער ××™×– ×ַצינד בל×קירט. פֿ×לגנד ××™×– די לעצטע ×ַקציע ××™× ×¢× ×¤Ö¿×ַרשפ×ַרונג ל×גבוך:',
+'sp-contributions-blocked-notice-anon' => 'דער IP ×ַדרעס ××™×– דערווייַל פֿ×ַרשפ×ַרט.
+די לעצטע בל×ָקירן ל××’ ×ַקציע ××™×– צוגעשטעלט ×ונטן:',
+'sp-contributions-search' => 'זוכן בײַשטײַערונגען',
+'sp-contributions-username' => 'ב×ניצער × ×מען ×דער IP ×דרעס:',
+'sp-contributions-toponly' => 'בלויז ווײַזן רעד×ַקטירונגען וו×ָס זענען די לעצטיקע רעוויזיעס',
+'sp-contributions-submit' => 'זוכן',
# What links here
'whatlinkshere' => '×°×ָס פֿ×ַרבינדט ×ַהער',
@@ -2142,14 +2202,13 @@ $UNWATCHURL
'ipb-edit-dropdown' => 'רעד×קטיר בל×קירונג סיבות',
'ipb-unblock-addr' => '×ויפֿבל×קירן $1',
'ipb-unblock' => '×ויפֿבל×קירן × ×‘×ַניצער × ×מען ×דער IP ×דרעס',
-'ipb-blocklist-addr' => '×ַקטועלע בל×קירונגען פֿ×ַר $1',
'ipb-blocklist' => 'זעט עקזיסטירנדע בל×קירונגען',
'ipb-blocklist-contribs' => 'בײַשטײַערונגען פֿון $1',
'unblockip' => '×ויפֿבל×קירן ב×ניצער',
'ipusubmit' => '×וועקנעמען ×“×¢× ×‘×œ×ק',
'unblocked' => '[[User:$1|$1]] ××™×– געוו×רן ב×ַפֿרייט פון זײַן בל×ק',
'unblocked-id' => 'בל×ק $1 ××™×– געוו×רן ×ַר×ָפגענומען.',
-'ipblocklist' => 'ליסטע פון בל×קירטע ב×ניצערס ×ון IP ×דרעסן',
+'ipblocklist' => 'בל×קירטע ב×ַניצער',
'ipblocklist-legend' => 'געפֿינען × ×‘×œ×קירטן ב×ניצער',
'ipblocklist-username' => 'ב×ניצער × ×מען ×דער IP ×דרעס:',
'ipblocklist-sh-userblocks' => '$1 ק×נטע בל×קן',
@@ -2204,6 +2263,7 @@ $1 ××™×– שוין בל×קירט. צי ווילט ×יר טוישן די ב×Ö·
'proxyblocker-disabled' => 'די פֿונקציע ××™×– ×ומ×ַקטיווירט.',
'proxyblockreason' => '×ייער ××™×™.פי. ×דרעס ××™×– געוו×רן געבל×קט צוליב ×“×¢× ×•×•×™×™×œ ד×ס ××™×– × ×פענער פר×קסי. ביטע פ×רבינדט זיך מיט ×ייער ×ינטערנעט סערוויס פר×וויידער ×דער טעקס ס×פ×רט צו ×ינפ×רמירן ×–×™×™ ×יבער ×“×¢× ×¢×¨×¢× ×¡×˜×Ÿ זיכערהייט פר×בלע×.',
'proxyblocksuccess' => 'געט×ן.',
+'ipbnounblockself' => '×יר זענט נישט ערלויבט זיך ×ליין ×ויסבל×קירן',
# Developer tools
'lockdb' => 'פֿ×ַרשליסן די ד×ַטנב×Ö·×–×¢',
@@ -2233,6 +2293,18 @@ $1 ××™×– שוין בל×קירט. צי ווילט ×יר טוישן די ב×Ö·
×כטונג: דער בל×ט וועט נישט ווערן ×ריבערגעפֿירט ×ויב עס ××™×– שוין ×“× × ×‘×œ×ט ×ונטער ×“×¢× × ×™×™×¢× × ×מען, ×חוץ ווען ער ××™×– ליידיג. ×דער ער ××™×– × ×•×•×™×™×˜×¢×¨×¤Ö¿×™×¨×•× ×’ בל×ט, ×ון ער ×”×ט נישט קיין געשיכטע פון ענדערונגען. פשט דערפֿון, ××– ×יר קענט ×יבערקערן × ×•×•×™×™×˜×¢×¨×¤Ö¿×™×¨×•× ×’ וו×ס ×יר ×”×ט ×ט געמ×כט בטעות, ×ון ×יר קענט נישט ×ריבערשרייבן ×ן עקסיסטירנדן בל×ט.
'''וו×רענונג:''' ××–× ×¢× ×“×¢×¨×•× ×’ קען זיין דר×סטיש ×ון נישט געווינטשען פ×ר × ×¤×פולערן בל×ט; ביטע פֿ×רזיכערט ××– ×יר פֿ×רשטייט די ווייטגרייכנדע ק×נסקווענסן צו דער ×קציע בעפֿ×ר ×יר פֿירט ד×ס ×ויס.",
+'movepagetext-noredirectfixer' => "זיך ב×ניצן מיט ×“×¢× ×¤Ö¿××¨×¢× ×ונטן וועט פֿ×רענדערן ×“×¢× × ×מען פֿון ×“×¢× ×‘×œ×ט, ×ון וועט ×ריבערפֿירן זיין געשיכטע ×¦×•× × ×™×™×¢× × ×מען.
+
+ד×ס ×לטע קעפל וועט ווערן × ×•×•×™×™×˜×¢×¨×¤Ö¿×™×¨×Ÿ בל×ט ×¦×•× × ×²Ö·×¢× × ×מען.
+
+טוט פֿ×רזיכערן ××– עס בלײַבן נישט קיין [[Special:DoubleRedirects|געט×פלטע]] ×דער [[Special:BrokenRedirects|צעבר××›×¢× ×¢]] ווייטערפֿירונגען.
+
+×יר זענט פֿ×ר×נטוו×רטלעך זיכער מ×כן ××– ×לע פֿ×רבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.
+
+×ַכטונג: דער בל×ַט וועט '''נישט''' ווערן ×ַריבערגעפֿירט ×ויב עס ××™×– שוין ד×Ö¸ × ×‘×œ×ט ×ונטער ×“×¢× × ×²Ö·×¢× × ×מען, ×חוץ ווען ער ××™×– ליידיג. ×דער ער ××™×– × ×•×•×²Ö·×˜×¢×¨×¤Ö¿×™×¨×•× ×’ בל×ט, ×ון ער ×”×ט נישט קיין געשיכטע פון ענדערונגען.
+פשט דערפֿון, ××– ×יר קענט ×יבערקערן × ×•×•×™×™×˜×¢×¨×¤Ö¿×™×¨×•× ×’ וו×ס ×יר ×”×ט ×ט געמ×כט בטעות, ×ון ×יר קענט נישט ×ריבערשרײַבן ×ַן עקסיסטירנדן בל×ט.
+
+'''וו×רענונג:''' ××–× ×¢× ×“×¢×¨×•× ×’ קען זיין דר×ַסטיש ×ון נישט געוו×ונטשן פֿ×ַר × ×¤×פולערן בל×ַט; ביטע פֿ×ַזיכערט ××– ×יר פֿ×ַרשטייט די ווײַטגרייכנדע ק×נסעקווענסן צו דער ×ַקציע בעפֿ×ַר ×יר גייט ווײַטער.",
'movepagetalktext' => "דער רעדן בל×ט וועט ווערן ב×ַוועגט ×ויט×מ×ֵטיש מיט ××™×, '''×חוץ:'''
* ס'××™×– שוין ×“× × × ×™×©×˜-ליידיגער בל×ט מיטן × ×™×™×¢× × ×מען, ×דער.
* ×יר נעמט ×ר×פ ×“×¢× ×¦×™×™×›×Ÿ ×¤×•× ×¢× ×§×¢×¡×˜×œ ×ונטן.
@@ -2286,6 +2358,7 @@ $1 ××™×– שוין בל×קירט. צי ווילט ×יר טוישן די ב×Ö·
'immobile-source-page' => 'דער ד×זיגער בל×ט קען נישט ווערן ב×וועגט.',
'immobile-target-page' => 'קען נישט ב×ַוועגן צו ×“×¢× ×¦×™×œ טיטל.',
'imagenocrossnamespace' => 'קען נישט ב×ַוועגן טעקע צו נישט-טעקע × ×ָמענטייל',
+'nonfile-cannot-move-to-file' => 'קען נישט ב×ַוועגן וו×ָס ××™×– נישט קיין טעקע ×¦×•× ×˜×¢×§×¢ × ×ָמענטייל',
'imageinvalidfilename' => 'דער ציל טעקע × ×מען ××™×– נישט גילטיק.',
'move-leave-redirect' => '×יבערל×זן × ×•×•×²Ö·×˜×¢×¨×¤Ö¿×™×¨×•× ×’',
@@ -2353,10 +2426,11 @@ $1 ××™×– שוין בל×קירט. צי ווילט ×יר טוישן די ב×Ö·
'import-interwiki-namespace' => 'ציל × ×מענטייל:',
'import-upload-filename' => 'טעקע × ×מען:',
'import-comment' => 'הערה:',
-'importtext' => 'ביטע עקספ×רטירט די טעקע פון דער מקור וויקי ניצנדיג ד×ס [[Special:Export|עקספ×רט הילפמיטל]], שפייכלט ×יין ×ויף ×ייער ×”×רטדיסק ×ון ל×דט ×ויף ד×.',
+'importtext' => 'ביטע עקספ×רטירט די טעקע פון דער מקור וויקי ניצנדיג ד×ס [[Special:Export|עקספ×רט הילפמיטל]], שפייכלט ×ײַן ×ויף ×ײַער ק×מפיוטער ×ון ל×דט ×ַרויף ד×.',
'importstart' => '×ימפ×רטירט בלעטער…',
'import-revision-count' => '{{PLURAL:$1|×יין ווערסיע|$1 ווערסיעס}}',
'importnopages' => '× ×™×©×˜× ×§×™×™×Ÿ בלעטער צו ×ימפ×רטירן.',
+'imported-log-entries' => '$1 {{PLURAL:$1|ל××’ ×ַקציע|ל××’ ×ַקציעס}} ×ימפ×רטירט.',
'importfailed' => '×ימפ×רט דורכגעפֿ×לן: <nowiki>$1</nowiki>',
'importunknownsource' => '×ומב×ק×נטער ×ימפ×רט טיפ',
'importcantopen' => 'נישט געקענט עפֿענען ×ימפ×רט טעקע',
@@ -2383,6 +2457,7 @@ $1 ××™×– שוין בל×קירט. צי ווילט ×יר טוישן די ב×Ö·
# Import log
'importlogpage' => '×ימפ×רט ל××’',
+'importlogpagetext' => '×ַדמיניסטר×ַטיווער ×ימפ×רט פון בלעטער מיט רעד×ַגירן היסט×ריע פֿון ​​×ַנדערע וויקיס.',
'import-logentry-upload' => '×”×ט ×ימפ×רטירט [[$1]] דורך טעקע ×ַרויפֿל×ָדן',
'import-logentry-upload-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}',
'import-logentry-interwiki' => '×ריבערגעוויקיט $1',
@@ -2452,6 +2527,8 @@ $1 ××™×– שוין בל×קירט. צי ווילט ×יר טוישן די ב×Ö·
'tooltip-upload' => 'הייב ×ן ×ויפל×דן',
'tooltip-rollback' => '"צוריקדרייען" דרײט צוריק רעד×ַקטירונג(ען) צו ×“×¢× ×‘×œ×ַט ×¤Ö¿×•× ×¢× ×œ×¢×¦×˜×Ÿ בײַשטײַערער מיט ×ײן קװעטש',
'tooltip-undo' => 'עפֿנט ×“×¢× ×¨×¢×“×ַגיר־פֿענסטער ×ין ×Ö· פֿ×ָרױסדיקן ×ױסקוק כּדי צוריקדרײען די רעד×ַקציע. עס ××™×– מעגלעך צוצולײגן ×Ö· סיבה דערװעגן ×ין ×“×¢× "קורץ ×°×ָרט" קעסטל.',
+'tooltip-preferences-save' => 'היטן פרעפֿערענצן',
+'tooltip-summary' => '×ײַנגעבן × ×§×•×¨×¦×¢ רעזומע',
# Stylesheets
'common.css' => '/* CSS געשריבן ×“× ×•×•×¢×˜ ×פילירן ×ון ב×יינפלוסן ×לע סקינס */',
@@ -2519,26 +2596,29 @@ $1',
'filedelete-archive-read-only' => 'דער וועבס×רווער קען נישט שרייבן ×¦×•× ×רכיוו פֿ×רצייכעניש "$1".',
# Browsing diffs
-'previousdiff' => 'פריִערדיקע ווערסיע →',
+'previousdiff' => 'פריערדיקער ×ונטערשייד →',
'nextdiff' => 'קומענדיקע ווערסיע â†',
# Media information
'widthheightpage' => '$1×$2, {{PLURAL:$3|×יין בל×ט|$3 בלעטער}}',
-'file-info' => '(טעקע גרייס: $1, MIME טיפ: $2)',
-'file-info-size' => '($1 × $2 פיקסעל, טעקע גרייס: $3, טיפ MIME: $4)',
+'file-info' => 'טעקע גרייס: $1, MIME טיפ: $2',
+'file-info-size' => '$1 × $2 פיקסעל, טעקע גרייס: $3, טיפ MIME: $4',
'file-nohires' => '<small>× ×™×©×˜× ×ž×™×˜ × ×”×¢×›×¢×¨×¢ רעז×לוציע.</small>',
-'svg-long-desc' => '(טעקע SVG, × ×מינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3)',
+'svg-long-desc' => 'טעקע SVG, × ×מינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3',
'show-big-image' => 'בילד מיט דער גרעסטער רעז×לוציע',
'show-big-image-thumb' => '<small>גרייס פון דער ווײַזונג: $1 × $2 פיקסעלן</small>',
'file-info-gif-looped' => '×ין × ×¤×¢×˜×œ×™×¢',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|ר××|ר×מען}}',
+'file-info-gif-frames' => '$1 {{PLURAL:$1| ר×Ö·× | ר×ָמען}}',
+'file-info-png-looped' => '×ין × ×¤×¢×˜×œ×™×¢',
+'file-info-png-repeat' => 'געשפילט{{PLURAL:$1|×יינמ×ָל|$1 מ×ָל}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|ר××|ר×מען}}',
# Special:NewFiles
-'newimages' => '×’×ַלעריע פֿון נײַע בילדער',
-'imagelisttext' => 'פ×לגנד × ×œ×™×¡×˜×¢ פון {{PLURAL:$1|×יין בילד|$1 בילדער}}, ס×רטירט $2:',
-'newimages-summary' => 'דער ב×זונדערער בל×ט ווײַזט די לעצטע ×רויפגעל×דענע טעקעס',
+'newimages' => '×’×ַלעריע פון ​​נײַע טעקעס',
+'imagelisttext' => 'פֿ×לגנד ××™×– × ×œ×™×¡×˜×¢ פון {{PLURAL:$1|×יין טעקע|$1 טעקעס}}, ס×רטירט $2:',
+'newimages-summary' => 'דער ב×ַזונדערער בל×ַט ווײַזט די לעצטע ×רויפֿגעל×ָדענע טעקעס.',
'newimages-legend' => 'פֿילטער',
-'newimages-label' => 'טעקע × ×ָמען (×דער ×Ö· טײל פֿון ××™×):',
+'newimages-label' => 'טעקע × ×ָמען (×דער ×Ö· טײל דערפֿון):',
'showhidebots' => '($1 ר×ָב×ָטן)',
'noimages' => '× ×™×©×˜× ×§×™×™×Ÿ בילדער.',
'ilsubmit' => 'זוכן',
@@ -2588,22 +2668,27 @@ $1',
'exif-colorspace' => 'ק×ליר רוי×',
'exif-componentsconfiguration' => 'מיינונג פון יעדן ב×שט×נדטייל',
'exif-compressedbitsperpixel' => 'בילד צוז×מקוועטשן מ×וד',
-'exif-pixelydimension' => 'גילטיגע ברייט פֿון בילד',
-'exif-pixelxdimension' => 'גילטיגע הייך פֿון בילד',
+'exif-pixelydimension' => 'בילד ברייט',
+'exif-pixelxdimension' => 'בילד הייך',
'exif-makernote' => 'פֿ×ַבריצירער הערות',
'exif-usercomment' => 'ב×נוצער ק×מענטורן',
+'exif-relatedsoundfile' => 'פֿ×ַרבונדענע ×וידי×Ö¸ טעקע',
'exif-datetimeoriginal' => 'ד××˜×•× ×ון צייט פון ד×ַטן ב×ש×פונג',
'exif-datetimedigitized' => 'ד××˜×•× ×ון צייט פון דיזשיטייזונג',
+'exif-subsectime' => 'צײַטפונקט (×ונטערסעקונדן)',
+'exif-subsectimeoriginal' => 'פֿ×ַרפֿ×ַסן צײַטפונקט (×ונטערסעקונדן)',
+'exif-subsectimedigitized' => 'דיגיט×ַליזירן צײַטפונקט (×ונטערסעקונדן)',
'exif-exposuretime' => 'ב×ַלײַכטן צייט',
'exif-exposuretime-format' => '$1 סעק ($2)',
'exif-fnumber' => 'נומער F',
'exif-exposureprogram' => '×ויפדעקונג פר×גר××',
-'exif-shutterspeedvalue' => 'לעדל גיך',
-'exif-aperturevalue' => 'עפֿן',
-'exif-brightnessvalue' => '×פֿנקייט',
+'exif-shutterspeedvalue' => 'APEX לעדל גיך',
+'exif-aperturevalue' => 'APEX עפֿענונג',
+'exif-brightnessvalue' => 'APEX העלקייט',
'exif-exposurebiasvalue' => 'ב×ַלײַכטן נייגונג',
'exif-maxaperturevalue' => 'מ××§×¡×™×ž×•× ×’×¨×™×™×¡ פון עפענונג',
'exif-subjectdistance' => 'סוביעקט ווייט',
+'exif-meteringmode' => 'מעסטן מ×ָדע',
'exif-lightsource' => 'ליכט מקור',
'exif-flash' => 'בליץ',
'exif-focallength' => 'לענס פֿ×ק×ַלע לענג',
@@ -2642,6 +2727,7 @@ $1',
'exif-gpsareainformation' => '× ×מען פון GPS געגענט',
'exif-gpsdatestamp' => 'ד××˜×•× GPS',
'exif-gpsdifferential' => 'דיפר×נצי×לע ק×קרעקציע GPS',
+'exif-objectname' => 'קורצער טיטל',
# EXIF attributes
'exif-compression-1' => '×ומ-צ×מגעקוועטשט',
@@ -2738,26 +2824,26 @@ $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_send' => 'שיקט ב×ַשטעטיקונג ק×ד',
+'confirmemail_sent' => 'ב×שטעטיקונג בליצברװ געשיקט.',
+'confirmemail_oncreate' => '× ×‘×שטעטיגונג ק×ד ××™×– געשיקט געוו×רן צו ×ייער ע־פ×סט ×דרעס.
דער ק×ד ווערט נישט פֿ×רל×נגט צו קענען ×רײַנל×גירן, ×בער ×יר וועט ××™× ×“×רפן דערל×נגן ×ויף צו קענען ב×ניצן מיט ע־פ×סט ב×ַזירטע ×יינהייטן ×ין דער וויקי.',
-'confirmemail_sendfailed' => '{{SITENAME}} ×”×ט נישט געקענט שיקן ×ייך די ב×שטעטיגונג ק×ד. ביטע טוט ק×נטר×לירן ×ייער ×דרעס ×ויב עס ×”×ט נישט קיין טעות.
+'confirmemail_sendfailed' => '{{SITENAME}} ×”×ט נישט געקענט שיקן ×ייך די ב×שטעטיגונג ק×ד. ביטע טוט ק×נטר×לירן ×ייער ×דרעס ×ויב עס ×”×ט נישט קיין טעות.
×¢-פ×סט צוריגעקערט: $1',
-'confirmemail_invalid' => 'נישט קיין גוטער ב×ַשטעטיקן ק×ָד. ער ××™×– מעגלעך ×ויסגעג×ַנגען.',
-'confirmemail_needlogin' => '×יר ברויכט דורכפֿירן $1 כדי צו ב×שטעטיגן ×ײַער ×¢-פ×סט ×דרעס.',
-'confirmemail_success' => '×ײַער בליצפּ×ָסט ×ַדרעס ××™×– ב×ַשטעטיקט ×’×¢×°×ָרן.
+'confirmemail_invalid' => 'נישט קיין גוטער ב×ַשטעטיקן ק×ָד. ער ××™×– מעגלעך ×ויסגעג×ַנגען.',
+'confirmemail_needlogin' => '×יר ברויכט דורכפֿירן $1 כדי צו ב×שטעטיגן ×ײַער ×¢-פ×סט ×דרעס.',
+'confirmemail_success' => '×ײַער בליצפּ×ָסט ×ַדרעס ××™×– ב×ַשטעטיקט ×’×¢×°×ָרן.
×יר קענט ×יצט [[Special:UserLogin|×ַרײַנל×גירן]] ×ון ×”× ××” ×”×ָבן פֿון דער וויקי.',
-'confirmemail_loggedin' => '×ייער ע־פ×סט ×דרעס ××™×– ×יצט געוו×רן ב×שטעטיגט.',
-'confirmemail_error' => 'עפעס ××™×– ×’×¢×’×נגען שלעכט מיט ×ָפּהיטן ×ײַער ב×ַשטעטיקונג.',
-'confirmemail_subject' => '{{SITENAME}} בליצבריװ ×דרעס ב×ַשטעטיקונג',
-'confirmemail_body' => 'עמעצער, וו×רשיינליך ×יר (פון ××™×™ פי ×דרעס: $1), ×”×ט ×יינגעשריבן די קונטע: "$2" מיט ×ט ×“×¢× ×‘×œ×™×¦×¤×סט ×דרעס ×ויף {{SITENAME}}.
+'confirmemail_loggedin' => '×ייער ע־פ×סט ×דרעס ××™×– ×יצט געוו×רן ב×שטעטיגט.',
+'confirmemail_error' => 'עפעס ××™×– ×’×¢×’×נגען שלעכט מיט ×ָפּהיטן ×ײַער ב×ַשטעטיקונג.',
+'confirmemail_subject' => '{{SITENAME}} בליצבריװ ×דרעס ב×ַשטעטיקונג',
+'confirmemail_body' => 'עמעצער, וו×רשיינליך ×יר (פון ××™×™ פי ×דרעס: $1), ×”×ט ×יינגעשריבן די קונטע: "$2" מיט ×ט ×“×¢× ×‘×œ×™×¦×¤×סט ×דרעס ×ויף {{SITENAME}}.
כדי זיכער מ×כן ××– די קונטע געהערט ט×קע צו ×ייך, ביטע טוט עפענען ×“×¢× ×œ×™× ×§ ×ין די ×ייער בלעטערער:
@@ -2768,8 +2854,19 @@ $3
$5
דער ב×שטעטיגונג ק×ד גייט ×ויס $4.',
-'confirmemail_invalidated' => 'בליצפ×סט ×דרעס ב×שטעטיקונג ×ַנולירט',
-'invalidateemail' => '×ַנולירן בליצפ×סט ב×ַשטעטיקונג',
+'confirmemail_body_changed' => 'עמעצער, וו×רשיינליך ×יר, פֿון IP ×ַדרעס: $1, ×”×ט געענדערט ×“×¢× ×¢Ö¾×¤×סט ×ַדרעס פֿון דער ק×נטע "$2" צו ×“×¢× ×דרעס ×ויף {{SITENAME}}.
+
+צו ב×ַשטעטיקן ×Ö·×– די קונטע געהערט ט×קע צו ×ייך ×ון ווידער ×ַקטיווירן ע־פ×סט דינסטן ×ויף {{SITENAME}}, ביטע טוט עפֿענען ×“×¢× ×œ×™× ×§ ×ין ×ייער בלעטערער:
+
+$3
+
+×ויב די ק×נטע געהערט *נישט* ×ײַך, פ×לגט די ד×ָזיגע לינק מבטל צו זיין די ×¢-פ×סט ×דרעס ב×שטעטיגונג:
+
+$5
+
+דער ב×שטעטיגונג ק×ד גייט ×ויס $4.',
+'confirmemail_invalidated' => 'בליצפ×סט ×דרעס ב×שטעטיקונג ×ַנולירט',
+'invalidateemail' => '×ַנולירן בליצפ×סט ב×ַשטעטיקונג',
# Scary transclusion
'scarytranscludedisabled' => '[×ינטערוויקי ×ריבערשליסן ××™×– ×ַנולירט]',
@@ -2803,6 +2900,7 @@ $5
'table_pager_first' => 'ערשטער בל×ט',
'table_pager_last' => 'לעצטער בל×ט',
'table_pager_limit' => 'ווײַז $1 ×¤×¨×˜×™× × ×‘×œ×ט',
+'table_pager_limit_label' => '×יינהייטן ×ין × ×‘×œ×ַט',
'table_pager_limit_submit' => 'גיין',
'table_pager_empty' => 'קיין רעזולט×טן',
@@ -2875,6 +2973,7 @@ $5
'version-other' => '×נדער',
'version-version' => '(ווערסיע $1)',
'version-license' => 'ליצענץ',
+'version-poweredby-others' => '×ַנדערע',
'version-software' => '×ינסט×ַלירט ווייכוו×ַרג',
'version-software-product' => 'פר×דוקט',
'version-software-version' => 'ווערסיע',
@@ -2912,6 +3011,16 @@ $5
'blankpage' => 'ליידיגער בל×ַט',
'intentionallyblankpage' => 'דער בל×ַט ××™×– ליידיג בכוונה',
+# External image whitelist
+'external_image_whitelist' => ' # ל×זט די שורה גענוי ווי ×–×™ ××™×–<pre>
+#לייגט רעגולערע ×ויסדרוק פֿר×גמענטן (× ×ר ×“×¢× ×˜×™×™×œ צווישן די //) ×ונטן
+#מען וועט ×–×™×™ צופ×סן מיט די URL ×דרעסן פון ×ויסערלעכע בילדער
+#די וו×ס זענען צוגעפ×סט וועט מען ×ויסשטעלן ווי בילדער, ×נדערשט וועט מען ווייזן × ×œ×™× ×§ ×¦×•× ×‘×™×œ×“
+#שורות וו×ס הייבן ×ן # ווערן גערעכנט הערות
+#ד×ס ××™×– נישט ×פהענגיק ×ין קליינע ×דער גרויסע ×ותיות
+
+#×לע רעגולערע ×ויסדרוקן ×–×ל מען שטעלן העכער פון דער שורה. ל×זט די שורה גענוי ווי ×–×™ ××™×–</pre>',
+
# Special:Tags
'tag-filter' => '[[Special:Tags|מ×ַרקירונג]] פֿילטער:',
'tag-filter-submit' => 'פֿילטער',
@@ -2920,6 +3029,12 @@ $5
'tags-edit' => 'רעד×ַקטירן',
'tags-hitcount' => ' {{PLURAL:$1|ענדערונג|$1 ענדערונגען}}',
+# Special:ComparePages
+'comparepages' => 'פ×ַרגלייַכן בלעטער',
+'compare-selector' => 'פ×ַרגלייַכן בל×ַט רעוויזיעס',
+'compare-page1' => 'עמוד 1',
+'compare-submit' => 'פֿ×ַרגלייַכן',
+
# Database error messages
'dberr-header' => 'די וויקי ×”×ט × ×¤×¨×בלע×',
'dberr-problems' => '×נטשולדיגט! דער ד×זיקער סייט ×”×ט טעכנישע פר×בלעמען.',
diff --git a/languages/messages/MessagesYo.php b/languages/messages/MessagesYo.php
index 396a7bda..c3337822 100644
--- a/languages/messages/MessagesYo.php
+++ b/languages/messages/MessagesYo.php
@@ -36,6 +36,21 @@ $namespaceAliases = array(
'Ọ̀rá»Ì€_àwòrán' => NS_FILE_TALK,
);
+$specialPageAliases = array(
+ 'Userlogin' => array( 'ÃŒwá»léOníse' ),
+ 'Userlogout' => array( 'ÃŒbá»Ì€sódeOníṣe' ),
+ 'Preferences' => array( 'Àwá»nÃŒfẹÌràn' ),
+ 'Recentchanges' => array( 'Àwá»nÀtúná¹£eTuntun' ),
+ 'Newpages' => array( 'Àwá»nOjúewéTuntun' ),
+ 'Allpages' => array( 'GbogboÀwá»nOjúewé' ),
+ 'Specialpages' => array( 'Àwá»nOjúewéPàtàkì' ),
+ 'Contributions' => array( 'Àwá»nÀfikún' ),
+ 'Categories' => array( 'Àwá»nẸ̀ka' ),
+ 'Mypage' => array( 'OjúwéMi' ),
+ 'Mytalk' => array( 'Ọ̀rá»Ì€Mi' ),
+ 'Mycontributions' => array( 'Àwá»nÀfikúnMi' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Fàlàsí àwá»n ijápá»Ì€:',
@@ -52,8 +67,7 @@ $messages = array(
'tog-editsection' => 'Já»Ì€wá»Ì àtúná¹£e abala láti inú àwá»n ìjápá»Ì€',
'tog-editsectiononrightclick' => 'ÃŒgbàláyè àtúná¹£e abala nípa klííkì á»Ì€tún lórí àká»lé abala (JavaScript pá»ndandan)',
'tog-showtoc' => 'ÃŒfihàn tábìlì àkóónú (fún àwá»n ojúewé tó ní ju orí á»Ì€rá»Ì€ 3 lá»)',
-'tog-rememberpassword' => "Sè'rántí á»Ì€rá»Ì€Ã¬pamí mi lórí ká»mputa yi",
-'tog-editwidth' => 'Fífẹ àpótí àtúnṣe kó gba gbogbo ààyè ojúìran',
+'tog-rememberpassword' => "Ṣè'rántí àká»á»Ìlẹ̀ ìwá»lé mi lórí agbétàkùn yìí (fún {{PLURAL:$1|á»já»Ì|á»já»Ì}} $1 pípẹÌjùlá»)",
'tog-watchcreations' => "á¹¢'àfikún ojúewé tí mo dá má»Ì ìmójútó mi",
'tog-watchdefault' => "S'àfikún ojúewé tí mo s'àtúnse má»Ì ìmójútó mi",
'tog-watchmoves' => "S'àfikún ojúewé tí mo yípò má»Ì ìmójútó mi",
@@ -195,30 +209,19 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => 'Àfikún orí-á»Ì€rá»Ì€',
-'vector-action-delete' => 'ÃŒparẹÌ',
-'vector-action-move' => 'Ìyípòdà',
-'vector-action-protect' => 'Àbò',
-'vector-action-undelete' => 'ÃŒmúkúrò ìparẹÌ',
-'vector-action-unprotect' => 'ÃŒjáwá»Ì àbò',
-'vector-namespace-category' => 'Ẹ̀ka',
-'vector-namespace-help' => 'Ojúewé ìrànwá»Ì',
-'vector-namespace-image' => 'Fáìlì',
-'vector-namespace-main' => 'Ojúewé',
-'vector-namespace-media' => 'Ojúewé amóhùnmáwòrán',
-'vector-namespace-mediawiki' => 'ÃŒránṣẹÌ',
-'vector-namespace-project' => 'Ojúewé iṣẹÌ-á»wá»Ì',
-'vector-namespace-special' => 'Ojúewé pàtàkì',
-'vector-namespace-talk' => 'ÃŒfá»Ì€rá»Ì€wérá»Ì€',
-'vector-namespace-template' => 'Àdàká»',
-'vector-namespace-user' => 'Ojúewé oníṣe',
-'vector-view-create' => "Ṣ'èdá",
-'vector-view-edit' => 'Àtúnṣe',
-'vector-view-history' => 'Wo ìtàn',
-'vector-view-view' => 'Kíkà',
-'vector-view-viewsource' => 'Wo àmìá»Ì€rá»Ì€',
-'actions' => 'Àwá»n ìgbéṣe',
-'namespaces' => 'Àwá»n orúká»Ã yè',
+'vector-action-addsection' => 'Àfikún orí-á»Ì€rá»Ì€',
+'vector-action-delete' => 'ÃŒparẹÌ',
+'vector-action-move' => 'Ìyípòdà',
+'vector-action-protect' => 'Àbò',
+'vector-action-undelete' => 'ÃŒmúkúrò ìparẹÌ',
+'vector-action-unprotect' => 'ÃŒjáwá»Ì àbò',
+'vector-view-create' => "Ṣ'èdá",
+'vector-view-edit' => 'Àtúnṣe',
+'vector-view-history' => 'Wo ìtàn',
+'vector-view-view' => 'Kíkà',
+'vector-view-viewsource' => 'Wo àmìá»Ì€rá»Ì€',
+'actions' => 'Àwá»n ìgbéṣe',
+'namespaces' => 'Àwá»n orúká»Ã yè',
'errorpagetitle' => 'Àsìṣe',
'returnto' => 'Padà sí $1.',
@@ -280,6 +283,7 @@ $messages = array(
Ẹ já»Ì€wá»Ì ẹ dúro ná díẹ̀ kí ẹ tó tún gbìyànjú láti wo ojúewé yìí.
$1',
+'pool-errorunknown' => 'Àsìṣe àwámárìdí',
# 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' => 'Nípa {{SITENAME}}',
@@ -432,7 +436,8 @@ A ti á¹£'èdá àpamá»Ì yín.
'yourname' => 'OrúkỠoníṣe (username):',
'yourpassword' => 'Ọ̀rá»Ì€Ã¬pamá»Ì:',
'yourpasswordagain' => 'Ká» á»Ì€rá»Ì€Ã¬pamá»Ì lẹÌẹ̀kansí:',
-'remembermypassword' => "Sè'rántí á»Ì€rá»Ì€Ã¬pamí mi lórí ká»mputa yi (cookies)",
+'remembermypassword' => "Ṣè'rántí ìwá»lé mi lórí ká»Ì€mpútà yìí (fún ó páº¹Ì jù {{PLURAL:$1|á»já»Ì|á»já»Ì}} $1)",
+'securelogin-stick-https' => 'ÃŒwàní sísopá»Ì€ má»Ì HTTPS lẹÌyín ìwá»lé',
'yourdomainname' => 'Domain yín:',
'externaldberror' => 'Bóyá àsìṣe ìfidájú ibùdó dátà ló ṣẹlẹ̀ tàbí ẹ kò jáº¹Ì gbígbà ní ààyè láti sỠàpamá»Ì òde yín di á»Ì€tun.',
'login' => 'ÃŒwá»lé',
@@ -449,6 +454,7 @@ A ti á¹£'èdá àpamá»Ì yín.
'gotaccount' => "Ṣé ẹ ti ní àpamá»Ì tẹÌlẹ̀? '''$1'''.",
'gotaccountlink' => "Ẹ w'á»lé",
'createaccountmail' => 'pẹ̀lú e-mail',
+'createaccountreason' => 'Ìdíẹ̀:',
'badretype' => 'Àwá»n á»Ì€rá»Ì€Ã¬pamá»Ì tí ẹ ká» kò já» ra wá»n.',
'userexists' => 'Orúká» oníṣe tí ẹ mú jáº¹Ì ti ẹlòmíràn.
Ẹjá»Ì€wá»Ì ẹ yan orúká» mìíràn tó yàtá»Ì€.',
@@ -517,6 +523,9 @@ E-mail kankan kò ní jáº¹Ì fífiráná¹£áº¹Ì fún ìkankan nínú àwá»n ìnÃ
Ẹ já»Ì€wá»Ì ẹ dúró ná kí ẹ tó gbìyànjú lẹÌẹ̀kan síi.',
'loginlanguagelabel' => 'Èdè: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'Àsìṣe àìmá»Ì€ nínú ìgbéṣe mail() ti PHP',
+
# Password reset dialog
'resetpass' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì',
'resetpass_announce' => 'Ẹ ti wá»lé pẹ̀lú àmìá»Ì€rá»Ì€ e-mail ìgbàdíẹ̀.
@@ -567,11 +576,12 @@ Láti parí ìmúwá»lẹÌ, ẹ gbá»Ìdá»Ì€ ṣètò á»Ì€rá»Ì€Ã¬pamá»Ì tu
'showdiff' => 'ÃŒfihàn àwá»n àtúná¹£e',
'anoneditwarning' => "'''ÃŒkìlá»Ì€:''' Ẹ kò tíì wá»lé.
ÀdírẹÌẹ̀sì IP yín yíò jáº¹Ì kíká»pamá»Ì sínú ìwé ìtàn àtúná¹£e ojúewé yìí.",
+'anonpreviewwarning' => "''Ẹ kò tíì wá»lé. ÀdírẹÌẹ̀sì IP yín yíò jáº¹Ì kíká»sílẹ̀ sínú ìwé ìtàn àtúná¹£e ojúewé yìí tí ẹ bá ṣàmúpamá»Ì rẹ̀.''",
'missingsummary' => "'''Ìránlétí:''' Ẹ kò pèsè àkótán fún àtúnṣe yìí
Tí ẹ bá tẹ ÃŒmúpamá»Ì lẹÌẹ̀kansi, àtúná¹£e yín yíò jẹ̀ mímúpamá»Ì láìní kankan.",
'missingcommenttext' => 'Ẹjá»Ì€wá»Ì ẹ á¹£e áríwí ní ìsàlẹ̀',
-'missingcommentheader' => "'''ÃŒránlétí:''' Ẹ kò pèsè àká»lé kankan fún àríwí yìí.
-Tí ẹ bá tẹ ÃŒmúpamá»Ì lẹÌẹ̀kansi, àtúná¹£e yín yíò jáº¹Ì mímúpamá»Ì láìní kankan.",
+'missingcommentheader' => "'''ÃŒránlétí:''' Ẹ kò pèsè àká»lé/oríá»Ì€rá»Ì€ kankan fún àríwí yìí.
+Tí ẹ bá tẹ \"{{int:savearticle}}\" lẹÌẹ̀kansi, àtúná¹£e yín yíò jáº¹Ì mímúpamá»Ì láìní kankan.",
'summary-preview' => 'Àká»Ìyẹ̀wò àkótán:',
'subject-preview' => 'Àyẹ̀wò àká»lé',
'blockedtitle' => 'Ìdínà oníṣe',
@@ -647,6 +657,12 @@ T'óbá sepé àsìse ló gbé yin dé bi, ẹ ká»n bá»Ìtìnì ìpadàsẹÌy
'''Kò tíì jáº¹Ì mímúpamá»Ì!'''",
'userjspreview' => "''''Ẹ má»Ì gbàgbé pé àdánwò/àká»Ìyẹ̀wò JavaScript oníṣe yín nìyí.'''
'''Kò tíì jáº¹Ì mímúpamá»Ì!'''",
+'sitecsspreview' => "'''Ẹ rántí pé àká»Ìyẹ̀wò CSS nìyí.'''
+'''Kò tíì jáº¹Ì mímúpamá»!'''",
+'sitejspreview' => "'''Ẹ rántí pé àká»Ìyẹ̀wò àmìá»Ì€rá»Ì€ JavaScript nìyí.'''
+'''Kò tíì jáº¹Ì mímúpamá»!'''",
+'userinvalidcssjstitle' => "'''ÃŒkìlá»Ì€:''' Kò sí awá»-ìbojú \"\$1\".
+Ẹ rántí pé àwá»n ojúewé àkàná¹£e .css àti .js únlo àká»lé onílẹÌtà kékeré, f.a. {{ns:user}}:Foo/vector.css yàtò sí {{ns:user}}:Foo/Vector.css.",
'updated' => '(Sísá»dá»Ì€tun)',
'note' => "'''Àkíyèsí:'''",
'previewnote' => "'''Ẹ rántí pé àyẹ̀wò lásán nì yí.'''
@@ -671,9 +687,6 @@ Tí kò bá á¹£iá¹£áº¹Ì síbẹ̀, ẹ gbìyànjú láti [[Special:UserLogout|j
Tí ẹ kò bá fáº¹Ì kí ìká»á»Ìlẹ̀ yín ó jáº¹Ì títúná¹£e tàbí kì ó jáº¹Ì pípìn kiri lá»Ìná tí kò wù yín, ẹ má»Ì mù wá síbí.<br />
Bákannà ẹ tún ṣèlérí fún wa wípé ẹ̀yin lẹká»Ì fúnra arayín, tàbí ẹ wòóká» láti agbègbè ìgboro tàbí irú ìtìlẹÌyín á»Ì€fáº¹Ì bíi bẹÌẹ̀.
'''Ẹ Má»ŒÌ MÚ Iá¹¢áº¸Ì TÓ Nà Ẹ̀TỌÌÀWÃ’KỌ SÃLẸ̀ LÃÃŒ GBÀṢẸ!'''",
-'longpagewarning' => "'''ÃŒKILỌ̀: Ojúewé yìí jáº¹Ì $1 kilobytes ní gúngùn;
-àwá»n browsers míràn le è ní ṣòro láti á¹£'àtúná¹£e àwá»n ojúewé tó tó tàbí tògùnju 32 kb lá».
-Ẹ já»Ì€wá»Ì ẹ rò ó wò bóyá ẹ lè fá»Ì ojúewé á»Ì€Ãºn sí abala kéékèké.'''",
'longpageerror' => "'''Àsìṣe: ÃŒká»Ì€wé tí ẹ fisílẹ̀ gùn tó $1 Kilobytes, èyí gùn ju $2 kilobytes lá» tó jáº¹Ì Ã jà.'''
Kò á¹£e é múpamá»Ì.",
'protectedpagewarning' => "'''ÃŒkìlá»Ì€: Ojúewé yìí ti jáº¹Ì títìpa, nítoríẹ̀ àwá»n alámòjútó nìkan ni wá»Ìn ní ẹ̀tá»Ì láti ṣàtúná¹£e rẹ̀.'''
@@ -816,6 +829,8 @@ GẹÌgáº¹Ì bíi olùmójútó ẹ ṣì le wo ìyàtá»Ì€ yìí; ẹ̀kúnrẹ
'revdelete-log' => 'Ìdíẹ̀:',
'revdelete-submit' => 'á¹¢e é sí {{PLURAL:$1|àtúnyẹ̀wò|àwá»n àtúnyẹ̀wò}} ṣíṣàyàn',
'revdel-restore' => 'ìyípadà ìríran',
+'revdel-restore-deleted' => 'àwá»n àtúnyẹ̀wò píparẹÌ',
+'revdel-restore-visible' => 'àwá»n àtúnyẹ̀wò aá¹£eéfojúrí',
'pagehist' => 'Ìtàn ojúewé',
'deletedhist' => 'ÃŒtàn ìparẹÌ',
'revdelete-content' => 'àkóónú',
@@ -860,10 +875,13 @@ GẹÌgáº¹Ì bíi olùmójútó ẹ ṣì le wo ìyàtá»Ì€ yìí; ẹ̀kúnrẹ
# Diffs
'history-title' => 'Ìtàn àtúnyẹ̀wò fún "$1"',
'difference' => '(ÃŒyàtá»Ì€ láàrin àwá»n àtúnyẹÌwò)',
+'difference-multipage' => '(ÃŒyàtá»Ì€ láàrin àwá»n ojúewé)',
'lineno' => 'Ìlà $1:',
'compareselectedversions' => 'ÃŒfiwéra àwá»n àtúná¹£e ìṣàyàn',
'showhideselectedversions' => 'ÃŒfihàn/ìbòmá»Ìlẹ̀ àwá»n àtúnyẹ̀wò ṣíṣàyàn',
'editundo' => 'dápadà',
+'diff-multi' => '({{PLURAL:$1|Àtúnyẹ̀wò inú àrin kan|Àwá»n àtúnyẹ̀wò inú àrin $1}} látá»wá»Ì {{PLURAL:$2|oníṣe kan|àwá»n oníṣe $2}} kò jáº¹Ì fífihàn)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Àtúnyẹ̀wò inú àrin kan|Àwá»n àtúnyẹ̀wò inú àrin $1}} látá»wá»Ì {{PLURAL:$2|oníṣe|àwá»n oníṣe}} tó pá»Ì€ju $2 lá» kò jáº¹Ì fífihàn)',
# Search results
'searchresults' => 'Àwá»n èsì àwárí',
@@ -970,6 +988,7 @@ Ní báyìí ná ẹ le ṣàwárí lá»Ìdá»Ì€ Google.
'searchresultshead' => 'Àwárí',
'resultsperpage' => 'Àwá»n èsì ní ojúewé ká»Ì€á»Ì€kan:',
'contextlines' => 'ÃŒye ìlà lórí èsì ká»Ì€á»Ì€kan:',
+'stub-threshold-disabled' => 'DídálẹÌkun',
'recentchangesdays' => 'Iye á»já»Ì láti fihàn nínú àwá»n àtúná¹£e tuntun:',
'recentchangesdays-max' => '{{PLURAL:$1|Ọjá»Ì|Ọjá»Ì}} $1 púpá»Ì€jùlá»',
'recentchangescount' => 'Iye àtúnṣe láti fihàn látìbẹ̀rẹ̀:',
@@ -1029,7 +1048,7 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
'prefs-advancedrendering' => 'Àwá»n àṣàyàn onígíga',
'prefs-advancedsearchoptions' => 'Àwá»n àṣàyàn onígíga',
'prefs-advancedwatchlist' => 'Àwá»n àṣàyàn onígíga',
-'prefs-display' => 'ÃŒfihàn àwá»n àṣàyàn',
+'prefs-displayrc' => 'ÃŒfihàn àwá»n àṣàyàn',
'prefs-diffs' => 'Àwá»n ìyàtá»Ì€',
# User rights
@@ -1093,6 +1112,7 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
'right-block' => 'ÃŒdínà àwá»n oníṣe yìókù láti ṣàtúná¹£e',
'right-blockemail' => 'ÃŒdínà oníṣe kan láti fi e-mail ránṣẹÌ',
'right-hideuser' => 'ÃŒdínà orúká» oníṣe kan, ìbòmá»Ìlẹ̀ rẹ̀ kúrò ní ìgboro',
+'right-unblockself' => 'ÃŒmúkúrò ìdínà ara wá»n',
'right-editinterface' => 'Àtúnṣe ìfojúkojú oníṣe',
'right-editusercssjs' => 'Àtúná¹£e àwá»n fáìlì CSS àti JS ti àwá»n oníṣe mìíràn',
'right-editusercss' => 'Àtúná¹£e àwá»n fáìlì CSS ti àwá»n oníṣe mìíràn',
@@ -1143,12 +1163,8 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
'recentchanges' => 'Àwá»n àtúná¹£e tuntun',
'recentchanges-legend' => 'Àwá»n àṣàyàn fún àtúná¹£e tuntun',
'recentchanges-feed-description' => 'Ẹ tẹ̀ lé àwá»n àtúná¹£e àìpáº¹Ì á»já»Ì sí wiki nínú àkótán feed yìí.',
-'recentchanges-label-legend' => 'Àlàyé: $1.',
-'recentchanges-legend-newpage' => '$1 - ojúewé tuntun',
'recentchanges-label-newpage' => 'Àtúnṣe yìí dá ojúewé tuntun',
-'recentchanges-legend-minor' => '$1 - àtúnṣe kékeré',
'recentchanges-label-minor' => 'Àtùnṣe kékeré nìyí',
-'recentchanges-legend-bot' => '$1 - àtúná¹£e bá»t',
'recentchanges-label-bot' => 'Rá»Ìbá»Ìá»Ì€tì ni ó á¹£e àtúná¹£e yìí',
'rcnote' => "Lábáº¹Ì ni {{PLURAL:$1|àtúná¹£e '''kan'''|àwá»n àtúná¹£e '''$1''' tí wá»n gbẹ̀yìn}} láàrin {{PLURAL:$2|á»já»Ì kan|á»já»Ì '''$2'''}} sẹÌyìn ní ago $5, lá»Ìjá»Ì $4.",
'rcnotefrom' => "Àwá»n àtúná¹£e láti ''''$2''' (títí dé '''$1''' hàn) lábẹÌ.",
@@ -1210,6 +1226,11 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
'minlength1' => 'Ó kéréjù àwá»n orúká» fáìlì gbá»dá»Ì€ jáº¹Ì lẹÌtà kan.',
'badfilename' => 'OrúkỠfáìlì ti yípadà sí "$1".',
'filetype-badmime' => 'Àwá»n fáìlì MIME irú "$1" kò jáº¹Ì gbígbà láyè láti rù wá»Ìn sókè.',
+'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ú.',
+'filetype-banned' => 'Irú fáílì yìí ti jáº¹Ì dídí lá»Ìnà.',
+'illegal-filename' => 'Orúká» fáílì yìí kò jáº¹Ì gbígbàláàyè.',
'fileexists' => "Fáìlì kan tilẹ̀ wà pẹ̀lú orúká» yìí, ẹ já»Ì€wá»Ì ẹ yẹ '''<tt>[[:$1]]</tt>''' wò tí kò bá dá yín lójú pé ẹ fáº¹Ì yipadà.
[[$1|thumb]]",
'fileexists-extension' => "Fáìlì kan wà pẹ̀lú orúká» tó já»ra: [[$2|thumb]]
@@ -1217,7 +1238,6 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
* OrúkỠfáìlì tó wà: '''<tt>[[:$2]]</tt>'''
Ẹ já»Ì€wá»Ì ẹ mú orúká» tó yàtá»Ì€.",
'file-exists-duplicate' => 'Fáìlì yìí jáº¹Ì Ã wòká» kan {{PLURAL:$1|fáìlì yìí|àwá»n fáìlì wá»Ì€nyí}}:',
-'successfulupload' => 'Ìjásírere ìrùsókè',
'uploadwarning' => 'ÃŒkìlá»Ì€ ìrùsókè',
'savefile' => 'ÃŒmúpamá»Ì fáìlì',
'uploadedimage' => '"[[$1]]" ti jẹÌrírùsókè',
@@ -1234,6 +1254,14 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
'upload-description' => 'Ìjúwe fáìlì',
'upload-options' => 'Àwá»n àṣàyàn ìrùsókè',
'watchthisupload' => "M'ójútó fáilì yìí",
+'upload-success-subj' => 'Ìjásírere ìrùsókè',
+'upload-success-msg' => 'Ìrùsókè yín láti [$2] ti jásírere. Ó ṣeéwò níbí: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Ìṣòro ìrùsókè',
+'upload-failure-msg' => 'Ìṣòro kan wà pẹ̀lú fá»Ìá»Ì€mù ìrùsókè yín [$2]:
+
+$1',
+'upload-warning-subj' => 'ÃŒkìlá»Ì€ ìrùsókè',
+'upload-warning-msg' => 'Ìṣòro kan wà pẹ̀lú ìrùsókè yín láti [$2]. Ẹ le padà sí orí [[Special:Upload/stash/$1|fá»Ìá»Ìmù ìrùsókè]] láti ṣàtúná¹£e ìṣòro náà.',
'upload-proto-error' => 'Prótókólù àìtá»Ì',
'upload-file-error' => 'Àsiṣe ínú',
@@ -1355,7 +1383,6 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
'statistics-edits-average' => 'Iye àtúná¹£e apínlàrin fún ojúewé ká»Ì€á»Ì€kan',
'statistics-views-total' => 'Àpapá»Ì€ iye ìwò',
'statistics-views-peredit' => 'Iye ìwò fún àtúná¹£e ká»Ì€á»Ì€kan',
-'statistics-jobqueue' => 'ÃŒgùn [http://www.mediawiki.org/wiki/Manual:Job_queue ìlà iá¹£áº¹Ì gbígbíṣe]',
'statistics-users' => '[[Special:ListUsers|Àwá»n oníṣe]] ajẹÌfífilórúká»sílẹ̀',
'statistics-users-active' => 'Àwá»n oníṣe agbéṣe',
'statistics-users-active-desc' => 'Àwá»n oníṣe tí wá»Ìn ti á¹£e ìgbéṣe kan ní {{PLURAL:$1|á»já»Ì kan|á»já»Ì $1}} sẹÌyìn',
@@ -1518,7 +1545,7 @@ Bákannáà ẹ le è yàn láti jáº¹Ì kí àwá»n ẹlòmíràn kó báyiín s
# Watchlist
'watchlist' => 'Ìmójútó mi',
'mywatchlist' => 'Ìmójútó mi',
-'watchlistfor' => "(fún '''$1''')",
+'watchlistfor2' => 'Fún $1 $2',
'nowatchlist' => 'Ẹ kò ní ohun kankan nínú ìmójútó yín.',
'watchlistanontext' => 'Ẹ já»Ì€wá»Ì $1 láti wò tàbí ṣàtúná¹£e àwá»n ohun inú ìmójútó yín.',
'watchnologin' => 'Ẹ kò tíì wá»lé',
@@ -1722,6 +1749,7 @@ $1',
Àká»sílẹ̀ ìdínà àìpáº¹Ì nìyí nísàlẹ̀ fún ìtá»Ìkasí:',
'sp-contributions-search' => 'Àwáàrí fún àwá»n àfikún',
'sp-contributions-username' => 'ÀdírẹÌẹ̀sì IP tàbí orúká» oníṣe:',
+'sp-contributions-toponly' => 'ÃŒfihàn àwá»n àtúná¹£e tí wá»n jáº¹Ì Ã túnyẹ̀wò àìpáº¹Ì nìkan',
'sp-contributions-submit' => 'Ṣàwárí',
# What links here
@@ -1972,6 +2000,7 @@ Ojúewé àdésí "[[:$1]]" wà tẹÌlẹ̀tẹÌlẹ̀.
'tooltip-upload' => 'Bẹ̀rẹ̀ ìrùsókè',
'tooltip-rollback' => '"ÃŒyíṣẹÌyìn" ún á¹£e ìdápadà àwá»n àtúná¹£e sí ojúewé yìí',
'tooltip-undo' => '"Dápadà" ṣèyíṣẹÌyìn àtúná¹£e yìí, yíò ṣí fá»Ìá»Ì€mù àtúná¹£e bíi àká»Ìbojúwò. Ó gba ààyè láti sỠìdí nínú àkótán.',
+'tooltip-preferences-save' => 'ÃŒmúpamá»Ì àwá»n ìfẹÌràn',
# Attribution
'anonymous' => '{{PLURAL:$1|Oníṣe|Àwá»n oníṣe}} aláìlórúká» ti {{SITENAME}}',
@@ -2009,13 +2038,14 @@ Ojúewé àdésí "[[:$1]]" wà tẹÌlẹ̀tẹÌlẹ̀.
# Media information
'thumbsize' => 'Ìtóbi àwòrán kékeré:',
'widthheightpage' => '$1×$2, $3 {{PLURAL:$3|ojúewé|àwá»n ojúewé}}',
-'file-info' => '(ìtóbi faili: $1, irú MIME: $2)',
-'file-info-size' => '($1 × $2 pixel, ìtóbi faili: $3, irú MIME: $4)',
+'file-info' => 'ìtóbi faili: $1, irú MIME: $2',
+'file-info-size' => '$1 × $2 pixel, ìtóbi faili: $3, irú MIME: $4',
'file-nohires' => '<small>Kò sí ìgbéhàn gíga jù báun lá».</small>',
-'svg-long-desc' => '(faili SVG, pẹ̀lú $1 × $2 pixels, ìtòbi faili: $3)',
+'svg-long-desc' => 'faili SVG, pẹ̀lú $1 × $2 pixels, ìtòbi faili: $3',
'show-big-image' => 'Pẹ̀lú ìgbéhàn gíga',
'show-big-image-thumb' => '<small>ÃŒtóbi àká»Ìká»Ìyẹ̀wò yìí: $1 × $2 pixels</small>',
'file-info-gif-looped' => 'lílá»Ìpo',
+'file-info-png-looped' => 'lílá»Ìpo',
# Special:NewFiles
'newimages' => 'Ọ̀dẹ̀dẹ̀ àwòrán àwá»n faili tuntun',
@@ -2182,6 +2212,13 @@ TóbájẹÌpé fáìlì á»Ì€hún ti jáº¹Ì títúná¹£e sí bóṣewà ní bẹ
'tags-edit' => 'àtúnṣe',
'tags-hitcount' => '{{PLURAL:$1|Àtúná¹£e|Àwá»n àtúná¹£e}} $1',
+# Special:ComparePages
+'compare-page1' => 'Ojúewé 1',
+'compare-page2' => 'Ojúewé 2',
+'compare-rev1' => 'Àtúnyẹ̀wò 1',
+'compare-rev2' => 'Àtúnyẹ̀wò 2',
+'compare-submit' => 'Ṣàfiwé',
+
# Database error messages
'dberr-header' => 'Wiki yìí ní ìsòro',
diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php
index 554c0daf..1d6c3855 100644
--- a/languages/messages/MessagesYue.php
+++ b/languages/messages/MessagesYue.php
@@ -89,8 +89,8 @@ $namespaceAliases = array(
"用戶 討論" => NS_USER_TALK,
"用户 讨论" => NS_USER_TALK,
# This has never worked so it's unlikely to annoy anyone if I disable it -- TS
- #"{$wgMetaNamespace} 討論" => NS_PROJECT_TALK,
- #"{$wgMetaNamespace} 讨论" => NS_PROJECT_TALK,
+ # "{$wgMetaNamespace} 討論" => NS_PROJECT_TALK,
+ # "{$wgMetaNamespace} 讨论" => NS_PROJECT_TALK,
"檔" => NS_FILE,
"檔案" => NS_FILE,
"æ¡£" => NS_FILE,
@@ -136,9 +136,9 @@ $namespaceAliases = array(
$linkTrail = '/^([a-z]+)(.*)$/sD';
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Default messages
-#-------------------------------------------------------------------
+# -------------------------------------------------------------------
# Allowed characters in keys are: A-Z, a-z, 0-9, underscore (_) and
# hyphen (-). If you need more characters, you may be able to change
# the regex in MagicWord::initRegex
@@ -159,8 +159,7 @@ $messages = array(
'tog-editsection' => 'å¯ä»¥ç”¨ [修改] 掣更改個別段è½',
'tog-editsectiononrightclick' => 'å¯ä»¥æ’³å³æŽ£æ›´æ”¹å€‹åˆ¥æ®µè½ï¼ˆéœ€è¦JavaScript)',
'tog-showtoc' => '多éŽä¸‰æ®µæ™‚顯示目錄',
-'tog-rememberpassword' => '響呢部電腦度記ä½æˆ‘嘅密碼',
-'tog-editwidth' => '加闊修改欄到æˆå€‹èž¢å¹•',
+'tog-rememberpassword' => '響呢個ç€è¦½å™¨åº¦è¨˜ä½æˆ‘嘅登入資料 (最高維æŒ$1{{PLURAL:$1|æ—¥|æ—¥}})',
'tog-watchcreations' => '將我開嘅é åŠ å…¥ç›£è¦–清單',
'tog-watchdefault' => '將我修改嘅é åŠ å…¥ç›£è¦–清單',
'tog-watchmoves' => '將我移動嘅é åŠ å…¥ç›£è¦–清單',
@@ -306,31 +305,21 @@ $messages = array(
'faqpage' => 'Project:FAQ',
# Vector skin
-'vector-action-addsection' => '加主題',
-'vector-action-delete' => '刪除',
-'vector-action-move' => '移動',
-'vector-action-protect' => 'ä¿è­·',
-'vector-action-undelete' => '去ç‡åˆªé™¤å’—嘅é é¢',
-'vector-action-unprotect' => '解除ä¿è­·',
-'vector-namespace-category' => '分類',
-'vector-namespace-help' => '幫助é ',
-'vector-namespace-image' => '檔案',
-'vector-namespace-main' => '版',
-'vector-namespace-media' => '媒體é ',
-'vector-namespace-mediawiki' => 'ä¿¡æ¯',
-'vector-namespace-project' => '計劃é ',
-'vector-namespace-special' => '特別é ',
-'vector-namespace-talk' => '討論',
-'vector-namespace-template' => '模',
-'vector-namespace-user' => '用戶é ',
-'vector-view-create' => '建立',
-'vector-view-edit' => '編輯',
-'vector-view-history' => 'ç‡å“æ­·å²',
-'vector-view-view' => 'é–±',
-'vector-view-viewsource' => 'ç‡å“原始碼',
-'actions' => '動作',
-'namespaces' => '空間å',
-'variants' => '變æ›',
+'vector-action-addsection' => '加主題',
+'vector-action-delete' => '刪除',
+'vector-action-move' => '移動',
+'vector-action-protect' => 'ä¿è­·',
+'vector-action-undelete' => '去ç‡åˆªé™¤å’—嘅é é¢',
+'vector-action-unprotect' => '解除ä¿è­·',
+'vector-simplesearch-preference' => '打開加強æµå˜¢å»ºè­°ï¼ˆåªé™Vectorç•«é¢ï¼‰',
+'vector-view-create' => '建立',
+'vector-view-edit' => '編輯',
+'vector-view-history' => 'ç‡å“æ­·å²',
+'vector-view-view' => 'é–±',
+'vector-view-viewsource' => 'ç‡å“原始碼',
+'actions' => '動作',
+'namespaces' => '空間å',
+'variants' => '變æ›',
'errorpagetitle' => '錯誤',
'returnto' => '返去$1 。',
@@ -391,6 +380,9 @@ $messages = array(
響å†ç‡å‘¢ä¸€ç‰ˆä¹‹å‰è«‹ç­‰å¤šä¸€é™£ã€‚
$1',
+'pool-timeout' => '等死鎖超時',
+'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}}',
@@ -551,7 +543,8 @@ $1',
'yourname' => '用戶å:',
'yourpassword' => '密碼:',
'yourpasswordagain' => 'å†è¼¸å…¥å¯†ç¢¼:',
-'remembermypassword' => '響呢部電腦度記ä½æˆ‘嘅密碼',
+'remembermypassword' => '響呢個ç€è¦½å™¨åº¦è¨˜ä½æˆ‘嘅登入資料 (最高維æŒ$1{{PLURAL:$1|æ—¥|æ—¥}})',
+'securelogin-stick-https' => '登入後繼續以HTTPS連接',
'yourdomainname' => '你嘅網域:',
'externaldberror' => '驗證資料庫出錯,或者唔å…許你更新你嘅外部帳戶。',
'login' => '登入',
@@ -568,6 +561,7 @@ $1',
'gotaccount' => '已經有戶å£ï¼Ÿ $1。',
'gotaccountlink' => '登入',
'createaccountmail' => '用電郵',
+'createaccountreason' => '原因:',
'badretype' => '你入嘅密碼唔一致。',
'userexists' => '你入嘅用戶å已經有人用咗,唔該æ€éŽå€‹å啦。',
'loginerror' => '登入錯誤',
@@ -587,6 +581,7 @@ $1',
'wrongpasswordempty' => '你都未入密碼,唔該å†è©¦å¤šæ¬¡å•¦ã€‚',
'passwordtooshort' => '你嘅密碼最少è¦æœ‰$1個åŠå½¢å­—元。',
'password-name-match' => '你嘅密碼一定è¦åŒä½ å˜…用戶å唔一樣。',
+'password-login-forbidden' => '呢個用戶ååŒå¯†ç¢¼å˜…利用係被ç¦æ­¢å˜…。',
'mailmypassword' => '寄個新密碼',
'passwordremindertitle' => '{{SITENAME}}嘅新臨時密碼',
'passwordremindertext' => '有人(å¯èƒ½ä¿‚你,IP ä½ç½® $1)
@@ -623,6 +618,9 @@ $1',
'loginlanguagelabel' => '語言:$1',
'suspicious-userlogout' => '你去登出嘅è¦æ±‚已經拒絕咗,因為佢å¯èƒ½ç”±å£žå’—嘅ç€è¦½å™¨æˆ–者快å–代ç†å‚³é€ã€‚',
+# E-mail sending
+'php-mail-error-unknown' => '響 PHP 嘅 mail() åƒæ•¸åº¦å‡ºç¾å’—未知嘅錯誤',
+
# Password reset dialog
'resetpass' => '改密碼',
'resetpass_announce' => '你已經用咗一個臨時電郵碼登入。è¦å®Œæˆç™»å…¥ï¼Œä½ ä¸€å®šè¦éŸ¿å‘¢åº¦å®šä¸€å€‹æ–°å˜…密碼:',
@@ -673,9 +671,10 @@ $1',
'showlivepreview' => '實時é è¦½',
'showdiff' => '顯示差異',
'anoneditwarning' => "'''警告:'''ä½ é‡æœªç™»å…¥ã€‚你嘅 IP ä½å€æœƒå–ºå‘¢å€‹é é¢å˜…修訂歷å²ä¸­è¨˜éŒ„è½åšŸã€‚",
+'anonpreviewwarning' => "''ä½ é‡æœªç™»å…¥ï¼Œä½ å˜… IP ä½å€æœƒå–ºå‘¢å€‹é é¢å˜…修訂歷å²ä¸­è¨˜éŒ„è½åšŸã€‚''",
'missingsummary' => "'''æ醒:''' 你未æ供編輯摘è¦ã€‚如果你å†æ’³å¤šä¸€ä¸‹ã€Œ{{int:savearticle}}ã€å˜…話,å’你儲存嘅編輯就會無摘è¦ã€‚",
'missingcommenttext' => '請輸入一個註解。',
-'missingcommentheader' => "'''æ醒:'''你響呢個註解度並無æ供一個主題ï¼æ¨™é¡Œã€‚如果你å†æ’³ä¸€æ¬¡å„²å­˜ï¼Œä½ å˜…編輯就會無題。",
+'missingcommentheader' => "'''æ醒:'''你響呢個註解度並無æ供一個主題ï¼æ¨™é¡Œã€‚如果你å†æ’³ä¸€æ¬¡ã€Œ{{int:savearticle}}ã€ï¼Œä½ å˜…編輯就會無題。",
'summary-preview' => '摘è¦é è¦½:',
'subject-preview' => '標題ï¼é ­æ¢é è¦½:',
'blockedtitle' => '用戶已經å°éŽ–',
@@ -746,7 +745,11 @@ $1',
'''佢嘅內容é‡æœªå„²å­˜ï¼'''",
'userjspreview' => "'''記ä½ä½ è€Œå®¶åªä¿‚測試ï¼é è¦½ç·Šä½ å®šç¾©å˜…JavaScript。'''
'''佢嘅內容é‡æœªå„²å­˜ï¼'''",
-'userinvalidcssjstitle' => "'''警告:''' ç„¡å«åš \"\$1\" 嘅畫é¢ã€‚請記ä½è‡ªè¨‚介é¢çš„ .css å’Œ .js é é¢æ™‚應使用細楷,例如:{{ns:user}}:Foo/monobook.css 而唔係 {{ns:user}}:Foo/Monobook.css 。",
+'sitecsspreview' => "'''記ä½ä½ è€Œå®¶åªä¿‚é è¦½å‘¢æ®µ CSS。'''
+'''佢嘅內容é‡æœªå„²å­˜ï¼'''",
+'sitejspreview' => "'''記ä½ä½ è€Œå®¶åªä¿‚é è¦½å‘¢æ®µ JavaScript 代碼。'''
+'''佢嘅內容é‡æœªå„²å­˜ï¼'''",
+'userinvalidcssjstitle' => "'''警告:''' ç„¡å«åš \"\$1\" 嘅畫é¢ã€‚請記ä½è‡ªè¨‚介é¢çš„ .css å’Œ .js é é¢æ™‚應使用細楷,例如:{{ns:user}}:Foo/vector.css 而唔係 {{ns:user}}:Foo/Vector.css 。",
'updated' => '(己更新)',
'note' => "'''ç•™æ„:'''",
'previewnote' => "'''請記ä½å‘¢å€‹åªä¿‚é è¦½ã€‚'''
@@ -783,8 +786,6 @@ $1',
你亦都è¦åŒæˆ‘å“‹ä¿è­‰å•²æ–‡å­—係你自己寫嘅,或者係由公有領域或相似嘅自由資æºè¤‡è£½è½åšŸï¼ˆç‡$1有更詳細嘅資訊)。
'''喺未有任何許å¯å˜…情æ³ä¹‹ä¸‹åƒç¥ˆå””好éžäº¤æœ‰ç‰ˆæ¬Šå˜…作å“ï¼'''",
-'longpagewarning' => "'''警告''':呢一é æœ‰ $1 kilobytes å’長;有啲ç€è¦½å™¨å¯èƒ½æœƒå–ºå°±é›¢æˆ–è€…è¶…éŽ 32kb 編輯é é¢æœƒå‡ºç¾ä¸€å•²å•é¡Œã€‚
-請考慮分割呢個é é¢åˆ°ç´°å•²å˜…å°ç¯€ã€‚",
'longpageerror' => "'''錯誤:你所éžäº¤å˜…文字係有 $1 kilobytes å’長,係長éŽæœ€å¤§å˜… $2 kilobytes。'''儲唔到你éžäº¤å˜…文字。",
'readonlywarning' => "'''錯誤:料庫已經鎖ä½å’—,以便定期ä¿é¤Šã€‚而家你唔å¯ä»¥å„²èµ·ä½ å˜…編輯。'''ä½ å¯ä»¥å„²å•²æ–‡å­—è½ä¸€ä»½æ–‡å­—檔先。
@@ -963,6 +964,8 @@ $1",
'logdelete-failure' => "'''事件å¯è¦‹æ€§å””能夠更新:'''
$1",
'revdel-restore' => '改å¯è¦‹æ€§',
+'revdel-restore-deleted' => '刪除咗嘅修訂',
+'revdel-restore-visible' => 'ç‡åˆ°å˜…修訂',
'pagehist' => 'é é¢æ­·å²',
'deletedhist' => '刪除咗嘅歷å²',
'revdelete-content' => '內容',
@@ -1026,11 +1029,13 @@ $1",
# Diffs
'history-title' => '"$1"嘅修訂歷å²',
'difference' => '(修訂之間嘅差異)',
+'difference-multipage' => '(版之間嘅差異)',
'lineno' => '第$1行:',
'compareselectedversions' => '比較被é¸å˜…修訂',
'showhideselectedversions' => '顯示ï¼éš±è—æ€å’—嘅修訂',
'editundo' => '復原',
-'diff-multi' => '($1個中途嘅修訂冇顯示到)',
+'diff-multi' => '(由$2ä½ç”¨æˆ¶æ‰€åšå˜…$1個中途修訂冇顯示到)',
+'diff-multi-manyusers' => '(由$2ä½æ›´å¤šç”¨æˆ¶æ‰€åšå˜…$1個中途修訂冇顯示到)',
# Search results
'searchresults' => 'æµå˜¢çµæžœ',
@@ -1065,6 +1070,7 @@ $1",
'searchprofile-everything-tooltip' => 'æµå…¨éƒ¨å˜¢ï¼ˆåŒ…埋討論版)',
'searchprofile-advanced-tooltip' => '響自定空間å度æµ',
'search-result-size' => '$1 ($2個字)',
+'search-result-category-size' => '$1ä½æˆå“¡ ($2個細類,$3個檔案)',
'search-result-score' => '相關度: $1%',
'search-redirect' => '(跳轉 $1)',
'search-section' => '(å°ç¯€ $1)',
@@ -1139,6 +1145,7 @@ $1",
'contextlines' => 'æ¯ä¸€æ“Šé¡¯ç¤ºå˜…行數:',
'contextchars' => 'æ¯ä¸€è¡Œå˜…字數:',
'stub-threshold' => '<a href="#" class="stub">楔ä½é€£çµ</a>æ ¼å¼é–€æª» (bytes):',
+'stub-threshold-disabled' => 'é–‚å’—',
'recentchangesdays' => '最近更改中嘅顯示日數:',
'recentchangesdays-max' => '最多 $1 日',
'recentchangescount' => 'é è¨­é¡¯ç¤ºå˜…編輯數:',
@@ -1172,6 +1179,7 @@ $1",
'prefs-files' => '檔案',
'prefs-custom-css' => '自定 CSS',
'prefs-custom-js' => '自定 JavaScript',
+'prefs-common-css-js' => '共有嘅CSSåŒåŸ‹JavaScript畀所有畫é¢ç”¨ï¼š',
'prefs-reset-intro' => 'ä½ å¯ä»¥ç”¨å‘¢ç‰ˆåŽ»é‡è¨­ä½ å˜…喜好設定到網站é è¨­å€¼ã€‚呢個動作無得番轉頭。',
'prefs-emailconfirm-label' => '電郵確èª:',
'prefs-textboxsize' => '編輯窗大細',
@@ -1208,9 +1216,15 @@ $1",
'prefs-advancedrendering' => '進階é¸é …',
'prefs-advancedsearchoptions' => '進階é¸é …',
'prefs-advancedwatchlist' => '進階é¸é …',
-'prefs-display' => '顯示é¸é …',
+'prefs-displayrc' => '顯示é¸é …',
+'prefs-displaysearchoptions' => '顯示é¸é …',
+'prefs-displaywatchlist' => '顯示é¸é …',
'prefs-diffs' => '差異',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => '電郵地å€ç‡åšŸæœ‰æ•ˆ',
+'email-address-validity-invalid' => '請打一個有效嘅電郵地å€',
+
# User rights
'userrights' => '用戶權é™ç®¡ç†',
'userrights-lookup-user' => '管ç†ç”¨æˆ¶çµ„',
@@ -1294,6 +1308,7 @@ $1",
'right-hideuser' => 'å°éŽ–用戶å,å°å…¬çœ¾éš±è—',
'right-ipblock-exempt' => '繞éŽIPå°éŽ–ã€è‡ªå‹•å°éŽ–åŒåŸ‹ç¯„åœå°éŽ–',
'right-proxyunbannable' => '繞éŽProxy嘅自動å°éŽ–',
+'right-unblockself' => '解å°ä½¢å“‹è‡ªå·±',
'right-protect' => '改ä¿è­·ç­‰ç´šåŒåŸ‹ç·¨è¼¯ä¿è­·ç‰ˆ',
'right-editprotected' => '編輯ä¿è­·ç‰ˆï¼ˆç„¡é€£ä¸²ä¿è­·ï¼‰',
'right-editinterface' => '編輯用戶界é¢',
@@ -1316,7 +1331,6 @@ $1",
'right-siteadmin' => '鎖åŒè§£éŽ–資料庫',
'right-reset-passwords' => 'é‡è¨­å…¶ä»–用戶嘅密碼',
'right-override-export-depth' => '倒出包å«æœ‰äº”層深連版嘅é é¢',
-'right-versiondetail' => '顯示伸展軟件版本嘅資料',
'right-sendemail' => '寄電郵畀其他用戶',
# User rights log
@@ -1367,14 +1381,9 @@ $1",
'recentchanges-legend' => '最近更改é¸é …',
'recentchangestext' => '追蹤å°å“©ä¸€å€‹ wiki 嘅最後更改。',
'recentchanges-feed-description' => '追蹤å°å“©ä¸€å€‹ wiki 度呢個集åˆå˜…最後更改。',
-'recentchanges-label-legend' => '圖例: $1',
-'recentchanges-legend-newpage' => '$1 - 新版',
'recentchanges-label-newpage' => '呢次編輯開咗一個新版',
-'recentchanges-legend-minor' => '$1 - 細編輯',
'recentchanges-label-minor' => '呢個係一個細編輯',
-'recentchanges-legend-bot' => '$1 - 機械人編輯',
'recentchanges-label-bot' => '呢次編輯係由機械人進行',
-'recentchanges-legend-unpatrolled' => '$1 - 未巡查éŽå˜…編輯',
'recentchanges-label-unpatrolled' => '呢次編輯é‡æœªå·¡æŸ¥éŽ',
'rcnote' => "以下係響$4 $5,近'''$2'''日嘅最後'''$1'''次修改。",
'rcnotefrom' => "以下係自'''$2'''嘅更改(顯示到'''$1''')。",
@@ -1421,6 +1430,9 @@ $1",
'upload_directory_missing' => '嗰個上載嘅目錄 ($1) 唔見咗,唔å¯ä»¥ç”±ç¶²é ä¼ºæœå™¨å»ºç«‹ã€‚',
'upload_directory_read_only' => '嗰個上載嘅目錄 ($1) 而家唔能夠被網é ä¼ºæœå™¨å¯«å…¥ã€‚',
'uploaderror' => '上載錯誤',
+'upload-recreate-warning' => "'''警告:一個åŒå嘅檔案曾經被刪除éŽæˆ–者æ¬èµ°å’—。'''
+
+呢版嘅刪除åŒç§»å‹•æ—¥èªŒéŸ¿å‘¢åº¦æ供以便åƒè€ƒï¼š",
'uploadtext' => "用下é¢å˜…表格嚟上載檔案。
è¦ç‡æˆ–者æµå˜¢ä¹‹å‰ä¸Šè¼‰å˜…圖åƒè«‹åŽ»[[Special:FileList|已上載檔案一覽]],(å†ï¼‰ä¸Šè¼‰å˜…動作會喺[[Special:Log/upload|上載日誌]]è£é¢è¨˜éŒ„è½åšŸï¼Œè€Œåˆªé™¤å˜…動作會喺[[Special:Log/delete|刪除日誌]]è£é¢è¨˜éŒ„è½åšŸã€‚
@@ -1455,6 +1467,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"'''係一種唔准許嘅檔案類型。
容許嘅{{PLURAL:\$3|一種|多種}}檔案類型有\$2。",
'filetype-missing' => '個檔å並冇副檔å(好以「.jpgã€ï¼‰ã€‚',
+'empty-file' => '你所éžäº¤å˜…檔案係空嘅。',
+'file-too-large' => '你所éžäº¤å˜…檔案太大。',
+'filename-tooshort' => '檔å太短。',
+'filetype-banned' => '呢種類型嘅檔案係ç¦æ­¢å’—1。',
+'verification-error' => '檔案未通éŽé©—證。',
+'hookaborted' => '你所嘗試嘅修改被擴展鈎æ¨æ£„咗。',
+'illegal-filename' => '檔案å唔容許。',
+'overwrite' => '唔容許覆蓋ç¾æœ‰å˜…檔案。',
+'unknown-error' => '發生未知嘅錯誤。',
+'tmp-create-error' => '唔能夠建立臨時檔案。',
+'tmp-write-error' => '臨時檔案寫入嗰陣出錯。',
'large-file' => '建議檔案嘅大細唔好大éŽ$1 bytes,呢個檔案有$2 bytes',
'largefileserver' => '呢個檔案超éŽå’—伺æœå™¨è¨­å®šå…許嘅大細。',
'emptyfile' => '你上載嘅檔案似乎係空嘅。噉樣å¯èƒ½ä¿‚因為你打錯咗個檔å。請檢查å“你係唔係真係è¦ä¸Šè¼‰å‘¢å€‹æª”案。',
@@ -1475,13 +1498,14 @@ $1",
如果你ä»ç„¶æƒ³åŽ»ä¸Šè¼‰ä½¢å˜…話,麻煩返轉去用第二個å嚟上載呢個檔案。[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => '呢個檔案係åŒä¸‹é¢å˜…{{PLURAL:$1|一|å¹¾}}個檔案é‡è¦†:',
'file-deleted-duplicate' => '一個åŒå嘅檔案 ([[:$1]]) 響之å‰åˆªé™¤éŽã€‚你應該響é‡æ–°ä¸Šè¼‰ä¹‹å‰æª¢æŸ¥ä¸€ä¸‹å—°å€‹æª”案嘅刪除紀錄。',
-'successfulupload' => 'æˆåŠŸå˜…上載',
'uploadwarning' => '上載警告',
'uploadwarning-text' => '請修改下é¢å˜…檔案æè¿°å†é‡è©¦ã€‚',
'savefile' => '儲存檔案',
'uploadedimage' => '上載咗"[[$1]]"',
'overwroteimage' => '已經上載咗"[[$1]]"嘅新版本',
'uploaddisabled' => '上載已åœç”¨ã€‚',
+'copyuploaddisabled' => 'ç”±URL嘅上載已經åœç”¨ã€‚',
+'uploadfromurl-queued' => '你嘅上載已經開始排隊。',
'uploaddisabledtext' => '檔案上載已經åœç”¨ã€‚',
'php-uploaddisabledtext' => 'PHP 檔案上載已經åœç”¨ã€‚請檢查 file_uploads 設定。',
'uploadscripted' => '呢個檔案包å«å¯èƒ½æœƒèª¤è¢«ç€è¦½å™¨è§£é‡‹åŸ·è¡Œå˜… HTML 或 script 代碼。',
@@ -1501,6 +1525,14 @@ $1",
你應該è¦è€ƒæ…®å“繼續上載呢個檔案係唔係é©åˆå˜…。
為咗方便起見,呢個檔案嘅刪除記錄已經響下é¢æä¾›:",
'filename-bad-prefix' => "你上載嘅檔å係以'''\"\$1\"'''åšé–‹é ­ï¼Œé€šå¸¸å‘¢ç¨®ç„¡å«æ„嘅檔å係響數碼相機度自動編排。請響你個檔案度æ€éŽä¸€å€‹æ›´åŠ æœ‰æ„義嘅檔å。",
+'upload-success-subj' => 'æˆåŠŸå˜…上載',
+'upload-success-msg' => '你響[$2]嘅上載已經æˆåŠŸï¼Œå¯ä»¥å–ºå‘¢åº¦æµåˆ°ï¼š[[:{{ns:file}}:$1]]。',
+'upload-failure-subj' => '上載出咗å•é¡Œ',
+'upload-failure-msg' => '你響[$2]嘅上載出ç¾å’—å•é¡Œï¼š
+
+$1',
+'upload-warning-subj' => '上載警告',
+'upload-warning-msg' => '你響[$2]嘅上載出咗å•é¡Œã€‚ä½ å¯ä»¥è¿”去[[Special:Upload/stash/$1|上載表格]]並更正å•é¡Œã€‚',
'upload-proto-error' => '唔正確嘅å”è­°',
'upload-proto-error-text' => 'é™é ä¸Šè¼‰éœ€è¦ä¸€å€‹ä»¥ <code>http://</code> 或者 <code>ftp://</code> 作為開頭嘅URL。',
@@ -1560,6 +1592,7 @@ $1",
'listfiles_search_for' => 'æµåª’é«”å:',
'imgfile' => '檔案',
'listfiles' => '檔案清單',
+'listfiles_thumb' => '縮圖',
'listfiles_date' => '日期',
'listfiles_name' => 'å',
'listfiles_user' => '用戶',
@@ -1673,8 +1706,8 @@ $1",
'statistics-edits' => '自從{{SITENAME}}設定後嘅é ç·¨è¼¯æ•¸',
'statistics-edits-average' => 'æ¯ä¸€ç‰ˆå¹³å‡ç·¨è¼¯æ•¸',
'statistics-views-total' => '查看總數',
+'statistics-views-total-desc' => '唔包唔存在é é¢åŒç‰¹åˆ¥é å˜…查看數',
'statistics-views-peredit' => 'æ¯æ¬¡ç·¨è¼¯æŸ¥çœ‹æ•¸',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue 工作隊列]長度',
'statistics-users' => '註冊咗嘅[[Special:ListUsers|用戶]]',
'statistics-users-active' => 'æ´»èºç”¨æˆ¶',
'statistics-users-active-desc' => '響$1æ—¥å‰åšéŽå‹•ä½œå˜…用戶',
@@ -1687,7 +1720,7 @@ Template:æžæ¸…楚',
'doubleredirects' => 'é›™é‡è·³è½‰',
'doubleredirectstext' => 'æ¯ä¸€è¡Œéƒ½é †æ¬¡åºå¯«ä½ç¬¬ä¸€é å,佢嘅目的é ï¼ŒåŒåŸ‹ç›®çš„é å†æŒ‡åŽ»é‚Šåº¦ã€‚改嘅時候,應該將第一個跳轉é è½‰å…¥ç¬¬ä¸‰é ã€‚
-<s>劃咗</s>嘅項目係已經解決咗嘅。',
+<del>劃咗</del>嘅項目係已經解決咗嘅。',
'double-redirect-fixed-move' => '[[$1]]已經æ¬å¥½å’—,佢而家跳轉éŽåŽ»[[$2]]。',
'double-redirect-fixer' => '跳轉修正器',
@@ -1710,6 +1743,8 @@ Template:æžæ¸…楚',
'nmembers' => '$1 ä½æˆå“¡',
'nrevisions' => '$1 次修訂',
'nviews' => '$1 次ç€è¦½',
+'nimagelinks' => '用響$1版',
+'ntransclusions' => '用響$1版',
'specialpage-empty' => '呢個報告嘅çµæžœä¿‚空嘅。',
'lonelypages' => '孤立咗嘅é é¢',
'lonelypagestext' => '以下嘅é¢é ä¿‚響{{SITENAME}}度未有連çµåˆ°æˆ–包å«åˆ°å…¶å®ƒé é¢ã€‚',
@@ -1865,34 +1900,40 @@ Template:æžæ¸…楚',
'listgrouprights-removegroup-self-all' => '響自己嘅戶å£åº¦å¯ä»¥æ‹Žèµ°å…¨éƒ¨çµ„',
# E-mail user
-'mailnologin' => '冇傳é€åœ°å€',
-'mailnologintext' => '你一定è¦[[Special:UserLogin|登入咗]]åŒåŸ‹å–ºä½ å˜…[[Special:Preferences|喜好設定]]度有個有效嘅電郵地å€å…ˆå¯ä»¥å‚³é€é›»éƒµç•€å…¶ä»–用戶。',
-'emailuser' => '發電郵畀呢ä½ç”¨æˆ¶',
-'emailpage' => '發電郵畀用戶',
-'emailpagetext' => 'ä½ å¯ä»¥ç”¨ä¸‹é¢å˜…表去寄一å°é›»éƒµç•€å‘¢ä½ç”¨æˆ¶ã€‚
+'mailnologin' => '冇傳é€åœ°å€',
+'mailnologintext' => '你一定è¦[[Special:UserLogin|登入咗]]åŒåŸ‹å–ºä½ å˜…[[Special:Preferences|喜好設定]]度有個有效嘅電郵地å€å…ˆå¯ä»¥å‚³é€é›»éƒµç•€å…¶ä»–用戶。',
+'emailuser' => '發電郵畀呢ä½ç”¨æˆ¶',
+'emailpage' => '發電郵畀用戶',
+'emailpagetext' => 'ä½ å¯ä»¥ç”¨ä¸‹é¢å˜…表去寄一å°é›»éƒµç•€å‘¢ä½ç”¨æˆ¶ã€‚
ä½ å–º[[Special:Preferences|你嘅用戶喜好設定]]å…¥é¢å¡«å¯«å˜…電郵地å€æœƒå‡ºç¾å–ºå‘¢å°é›»éƒµã€Œç”±ã€å˜…地å€åº¦ï¼Œä»¥ä¾¿æ”¶ä»¶äººå¯ä»¥å›žè¦†åˆ°ã€‚',
-'usermailererror' => '目標郵件地å€è¿”回錯誤:',
-'defemailsubject' => '{{SITENAME}} 電郵',
-'noemailtitle' => '無電郵地å€',
-'noemailtext' => '呢個用戶é‡æœªæŒ‡å®šä¸€å€‹æœ‰æ•ˆå˜…電郵地å€ã€‚',
-'nowikiemailtitle' => '唔容許電郵',
-'nowikiemailtext' => 'å‘¢ä½ç”¨æˆ¶æ€å’—唔收其他用戶畀佢嘅電郵。',
-'email-legend' => '寄電郵畀å¦ä¸€ä½{{SITENAME}}用戶',
-'emailfrom' => 'ç”±:',
-'emailto' => '到:',
-'emailsubject' => '主題:',
-'emailmessage' => 'ä¿¡æ¯:',
-'emailsend' => '傳é€',
-'emailccme' => '傳é€ä¸€å€‹æˆ‘嘅信æ¯é›»éƒµç•€æˆ‘。',
-'emailccsubject' => 'ä½ ç•€$1: $2å°ä¿¡å˜…副本',
-'emailsent' => '電郵已傳é€',
-'emailsenttext' => '你嘅電郵信æ¯å·²å‚³é€ã€‚',
-'emailuserfooter' => 'å‘¢å°é›»éƒµä¿‚ç”±$1寄畀$2經{{SITENAME}}嘅「電郵用戶ã€åŠŸèƒ½ç™¼å‡ºå˜…。',
+'usermailererror' => '目標郵件地å€è¿”回錯誤:',
+'defemailsubject' => '{{SITENAME}} 電郵',
+'usermaildisabled' => '用戶電郵已åœç”¨',
+'usermaildisabledtext' => 'ä½ å””å¯ä»¥ç™¼é€é›»éƒµåˆ°éŸ¿å‘¢å€‹wiki度嘅其他用戶',
+'noemailtitle' => '無電郵地å€',
+'noemailtext' => '呢個用戶é‡æœªæŒ‡å®šä¸€å€‹æœ‰æ•ˆå˜…電郵地å€ã€‚',
+'nowikiemailtitle' => '唔容許電郵',
+'nowikiemailtext' => 'å‘¢ä½ç”¨æˆ¶æ€å’—唔收其他用戶畀佢嘅電郵。',
+'email-legend' => '寄電郵畀å¦ä¸€ä½{{SITENAME}}用戶',
+'emailfrom' => 'ç”±:',
+'emailto' => '到:',
+'emailsubject' => '主題:',
+'emailmessage' => 'ä¿¡æ¯:',
+'emailsend' => '傳é€',
+'emailccme' => '傳é€ä¸€å€‹æˆ‘嘅信æ¯é›»éƒµç•€æˆ‘。',
+'emailccsubject' => 'ä½ ç•€$1: $2å°ä¿¡å˜…副本',
+'emailsent' => '電郵已傳é€',
+'emailsenttext' => '你嘅電郵信æ¯å·²å‚³é€ã€‚',
+'emailuserfooter' => 'å‘¢å°é›»éƒµä¿‚ç”±$1寄畀$2經{{SITENAME}}嘅「電郵用戶ã€åŠŸèƒ½ç™¼å‡ºå˜…。',
+
+# User Messenger
+'usermessage-summary' => '留低系統訊æ¯ã€‚',
+'usermessage-editor' => '系統訊æ¯',
# Watchlist
'watchlist' => '監視清單',
'mywatchlist' => '監視清單',
-'watchlistfor' => "(用戶「'''$1'''ã€å˜…監視清單)",
+'watchlistfor2' => '$1嘅監視清單 $2',
'nowatchlist' => '你嘅監視清單度並冇任何項目。',
'watchlistanontext' => 'è«‹å…ˆ$1去ç‡æˆ–者改響你監視清單度嘅項目。',
'watchnologin' => '未登入',
@@ -2003,7 +2044,10 @@ wiki: $PAGEEDITOR_WIKI
'revertpage' => '已經å轉由[[Special:Contributions/$2|$2]]([[User talk:$2|å°è©±]])所寫嘅編輯到[[User:$1|$1]]嘅最後修訂。',
'revertpage-nouser' => '已經å轉由(刪咗用戶å)所寫嘅編輯到[[User:$1|$1]]所寫嘅最後修訂。',
'rollback-success' => '已經å轉由$1所寫嘅編輯;æ¢å¾©åˆ°$2嘅最後修訂。',
-'sessionfailure' => '你嘅登入會話 (session) 好似有啲å•é¡Œï¼›
+
+# Edit tokens
+'sessionfailure-title' => '會話失敗',
+'sessionfailure' => '你嘅登入會話 (session) 好似有啲å•é¡Œï¼›
為咗防止會話劫æŒï¼Œå‘¢å€‹æ“作已經å–消。
請返去之å‰å—°ç‰ˆï¼Œé‡æ–°è¼‰å…¥å—°ç‰ˆç„¶å¾Œå†è©¦ã€‚',
@@ -2130,19 +2174,23 @@ $1',
'month' => '由呢個月 (åŒæ›´æ—©):',
'year' => '由呢一年 (åŒæ›´æ—©):',
-'sp-contributions-newbies' => 'åªé¡¯ç¤ºæ–°æˆ¶å£å˜…è²¢ç»',
-'sp-contributions-newbies-sub' => '新戶å£å˜…è²¢ç»',
-'sp-contributions-newbies-title' => '新戶å£å˜…用戶貢ç»',
-'sp-contributions-blocklog' => 'å°éŽ–日誌',
-'sp-contributions-deleted' => '已經刪除咗嘅用戶貢ç»',
-'sp-contributions-logs' => '日誌',
-'sp-contributions-talk' => '傾åˆ',
-'sp-contributions-userrights' => '用戶權é™ç®¡ç†',
-'sp-contributions-blocked-notice' => 'å‘¢ä½ç”¨æˆ¶ç¾æ™‚å°éŽ–緊。
+'sp-contributions-newbies' => 'åªé¡¯ç¤ºæ–°æˆ¶å£å˜…è²¢ç»',
+'sp-contributions-newbies-sub' => '新戶å£å˜…è²¢ç»',
+'sp-contributions-newbies-title' => '新戶å£å˜…用戶貢ç»',
+'sp-contributions-blocklog' => 'å°éŽ–日誌',
+'sp-contributions-deleted' => '已經刪除咗嘅用戶貢ç»',
+'sp-contributions-uploads' => '上載',
+'sp-contributions-logs' => '日誌',
+'sp-contributions-talk' => '傾åˆ',
+'sp-contributions-userrights' => '用戶權é™ç®¡ç†',
+'sp-contributions-blocked-notice' => 'å‘¢ä½ç”¨æˆ¶ç¾æ™‚å°éŽ–緊。
+最近嘅å°éŽ–日誌項目響下é¢æ供以便åƒè€ƒï¼š',
+'sp-contributions-blocked-notice-anon' => '呢個IP地å€ç¾æ™‚å°éŽ–緊。
最近嘅å°éŽ–日誌項目響下é¢æ供以便åƒè€ƒï¼š',
-'sp-contributions-search' => 'æµè²¢ç»',
-'sp-contributions-username' => 'IP地å€æˆ–用戶å:',
-'sp-contributions-submit' => 'æµ',
+'sp-contributions-search' => 'æµè²¢ç»',
+'sp-contributions-username' => 'IP地å€æˆ–用戶å:',
+'sp-contributions-toponly' => 'åªé¡¯ç¤ºæœ€æ–°ä¿®è¨‚嘅編輯',
+'sp-contributions-submit' => 'æµ',
# What links here
'whatlinkshere' => '有乜嘢連çµä¾†å‘¢åº¦',
@@ -2203,7 +2251,6 @@ $1',
'ipb-edit-dropdown' => '改å°éŽ–原因',
'ipb-unblock-addr' => '解å°$1',
'ipb-unblock' => '解å°ä¸€å€‹ç”¨æˆ¶å或IP地å€',
-'ipb-blocklist-addr' => '$1嘅ç¾æ™‚å°éŽ–',
'ipb-blocklist' => '去ç‡ç¾æ™‚嘅å°éŽ–',
'ipb-blocklist-contribs' => '$1嘅貢ç»',
'unblockip' => '解å°ç”¨æˆ¶',
@@ -2271,6 +2318,8 @@ $1已經被å°éŽ–。你係咪想更改呢個設定?',
'cant-block-while-blocked' => '當你被å°éŽ–嗰陣唔å¯ä»¥å°éŽ–其他用戶。',
'cant-see-hidden-user' => '你試緊å°éŽ–嘅用戶已經å°éŽ–咗或者隱è—咗。
你而家冇隱è—用戶嘅權é™ï¼Œä½ å””å¯ä»¥ç‡æˆ–者改呢ä½ç”¨æˆ¶å˜…å°éŽ–。',
+'ipbblocked' => 'ä½ å””å¯ä»¥å°éŽ–或者解å°å…¶ä»–用戶,因為你自己已經俾人å°éŽ–咗。',
+'ipbnounblockself' => '你唔容許å°éŽ–你自己。',
# Developer tools
'lockdb' => '鎖定資料庫',
@@ -2305,6 +2354,15 @@ $1已經被å°éŽ–。你係咪想更改呢個設定?',
'''警告ï¼'''
噉樣å°æ–¼ä¸€å€‹å¥½å¤šäººç¶“éŽå˜…é é¢åšŸè¬›å¯èƒ½ä¿‚一個好大嘅åŒåŸ‹å‡ºäººæ„表嘅修改;請你喺行動之å‰ç¢ºèªä½ æ¸…楚噉åšå˜…後果。",
+'movepagetext-noredirectfixer' => "用下é¢å€‹è¡¨æ”¹ç‰ˆå,æ¬åŸ‹ä½¢å˜…æ­·å²ã€‚
+舊標題會變åšè·³è½‰ã€‚
+請肯定檢查清楚[[Special:DoubleRedirects|é›™é‡]]或者[[Special:BrokenRedirects|死跳轉]]。
+你有責任確ä¿å•²é€£çµä¾ç„¶æŒ‡åŽ»ä½¢å“‹æ‡‰è©²æŒ‡åŽ»å˜…地方。
+
+注æ„如果已經有一個åŒå€‹æ–°ååŒå嘅é ï¼Œå™‰å‘¢å€‹é ä¿‚æ¬'''唔到'''嘅,除éžå—°å€‹åŒå嘅é ä¿‚空嘅或者佢係一個跳轉é ï¼Œå…¼ä¸”è¦ä¹‹å‰å†‡ç·¨è¼¯éŽï¼ˆå†‡ç·¨è¼¯æ­·å²ï¼‰å…ˆå¾—。噉å³ä¿‚講è¬ä¸€ä½ æžéŒ¯å’—,你å¯ä»¥å°‡å‘¢å€‹é æ”¹è¿”去佢改之å‰å™‰ï¼Œä½ å””å¯ä»¥è¦†è“‹ä¸€å€‹ç¾æœ‰å˜…é ã€‚
+
+'''警告ï¼'''
+噉樣å°æ–¼ä¸€å€‹å¥½å¤šäººç¶“éŽå˜…é é¢åšŸè¬›å¯èƒ½ä¿‚一個好大嘅åŒåŸ‹å‡ºäººæ„表嘅修改;請你喺行動之å‰ç¢ºèªä½ æ¸…楚噉åšå˜…後果。",
'movepagetalktext' => "相應嘅討論é æœƒé€£åŒä½¢ä¸€é½Šè‡ªå‹•æ¬éŽåŽ»ï¼Œ'''除éž''':
*新嘅é é¢å下é¢å·²ç¶“有咗一個éžç©ºå˜…討論é ï¼Œåˆæˆ–者
*你唔剔下é¢å€‹æ¡†ã€‚
@@ -2359,6 +2417,7 @@ $1已經被å°éŽ–。你係咪想更改呢個設定?',
'immobile-source-page' => '呢版唔æ¬å¾—。',
'immobile-target-page' => 'æ¬å””到去目標標題度。',
'imagenocrossnamespace' => 'å””å¯ä»¥æ¬æª”案到éžæª”案空間å',
+'nonfile-cannot-move-to-file' => 'å””å¯ä»¥æ¬éžæª”案到檔案空間å',
'imagetypemismatch' => '個新副檔åå””é…佢嘅類型',
'imageinvalidfilename' => '個目標檔å係無效嘅',
'fix-double-redirects' => '更新指到原先標題嘅任何跳轉',
@@ -2438,6 +2497,7 @@ $1已經被å°éŽ–。你係咪想更改呢個設定?',
'importstart' => '倒入緊...',
'import-revision-count' => '$1次修訂',
'importnopages' => '冇é é¢åŽ»å€’入。',
+'imported-log-entries' => '倒入咗$1項日誌紀錄。',
'importfailed' => '倒入失敗:<nowiki>$1</nowiki>',
'importunknownsource' => 'ä¸æ˜Žå˜…倒入來æºé¡žåž‹',
'importcantopen' => '唔能夠開個倒入檔案',
@@ -2530,6 +2590,8 @@ $1已經被å°éŽ–。你係咪想更改呢個設定?',
'tooltip-upload' => '開始上載',
'tooltip-rollback' => '『å轉ã€å¯ä»¥ä¸€æ’³å¾©åŽŸä¸Šä¸€ä½è²¢ç»è€…å°å‘¢ç‰ˆå˜…編輯',
'tooltip-undo' => '『復原ã€å¯ä»¥éŸ¿ç·¨è¼¯æ¨¡å¼åº¦é–‹ç·¨è¼¯è¡¨ä»¥ä¾¿å¾©åŽŸã€‚佢容許響摘è¦åº¦åŠ å…¥åŽŸå› ã€‚',
+'tooltip-preferences-save' => 'ä¿å­˜è¨­å®š',
+'tooltip-summary' => '輸入一個簡短嘅摘è¦',
# Stylesheets
'common.css' => '/* 響呢度放 CSS 碼來改æˆå€‹ç¶²ç«™å˜…ç•«é¢ */',
@@ -2661,14 +2723,17 @@ $1',
'imagemaxsize' => "圖åƒå¤§ç´°é™åˆ¶:<br />''(用響檔案æè¿°é )''",
'thumbsize' => '縮圖大細:',
'widthheightpage' => '$1×$2, $3版',
-'file-info' => '(檔案大細:$1 ,MIME類型:$2)',
-'file-info-size' => '($1 × $2 åƒç´ ï¼Œæª”案大細:$3 ,MIME類型:$4)',
+'file-info' => '檔案大細:$1 ,MIME類型:$2',
+'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大細:$3 ,MIME類型:$4',
'file-nohires' => '<small>冇更高解åƒåº¦å˜…圖åƒã€‚</small>',
-'svg-long-desc' => '(SVG檔案,表é¢å¤§ç´°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大細:$3)',
+'svg-long-desc' => 'SVG檔案,表é¢å¤§ç´°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大細:$3',
'show-big-image' => '完整解åƒåº¦',
'show-big-image-thumb' => '<small>呢個é è¦½å˜…大細: $1 × $2 åƒç´ </small>',
'file-info-gif-looped' => '循環',
'file-info-gif-frames' => '$1æ ¼',
+'file-info-png-looped' => '循環',
+'file-info-png-repeat' => '播咗$1次',
+'file-info-png-frames' => '$1æ ¼',
# Special:NewFiles
'newimages' => '新檔案畫廊',
@@ -2851,6 +2916,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'GPS 地å€å',
'exif-gpsdatestamp' => 'GPS 日期',
'exif-gpsdifferential' => 'GPS 差動修正',
+'exif-objectname' => '短標題',
# EXIF attributes
'exif-compression-1' => '未壓éŽ',
@@ -3008,24 +3074,24 @@ Variants for Chinese language
'limitall' => '全部',
# E-mail address confirmation
-'confirmemail' => '確èªé›»éƒµåœ°å€',
-'confirmemail_noemail' => '你唔需è¦éŸ¿ä½ å˜…[[Special:Preferences|用戶喜好設定]]度設定一個有效嘅電郵地å€ã€‚',
-'confirmemail_text' => '{{SITENAME}}需è¦ä½ å–ºä½¿ç”¨é›»éƒµåŠŸèƒ½ä¹‹å‰é©—è­‰å“你嘅電郵地å€ã€‚啟用下邊個掣嚟發å°ç¢ºèªä¿¡åŽ»ä½ å€‹åœ°å€åº¦ã€‚å°ä¿¡å…¥é¢æœƒé™„帶一æ¢åŒ…å«ä»£ç¢¼å˜…連çµï¼›å–ºä½ å€‹ç€è¦½å™¨åº¦æ‰“é–‹æ¢é€£çµåšŸç¢ºèªä½ å˜…電郵地å€ä¿‚有效嘅。',
-'confirmemail_pending' => '一個確èªç¢¼å·²ç¶“電郵咗畀你;如果你係啱啱開咗個新戶å£å˜…,你å¯ä»¥éŸ¿è«‹æ±‚一個新嘅確èªç¢¼ä¹‹å‰ç­‰å¤šå¹¾åˆ†é˜ç­‰ä½¢å¯„畀你。',
-'confirmemail_send' => '寄出確èªç¢¼ã€‚',
-'confirmemail_sent' => '確èªé›»éƒµå·²ç¶“寄出。',
-'confirmemail_oncreate' => '一個確èªç¢¼å·²ç¶“寄é€å’—到嘅嘅電郵地å€ã€‚
+'confirmemail' => '確èªé›»éƒµåœ°å€',
+'confirmemail_noemail' => '你唔需è¦éŸ¿ä½ å˜…[[Special:Preferences|用戶喜好設定]]度設定一個有效嘅電郵地å€ã€‚',
+'confirmemail_text' => '{{SITENAME}}需è¦ä½ å–ºä½¿ç”¨é›»éƒµåŠŸèƒ½ä¹‹å‰é©—è­‰å“你嘅電郵地å€ã€‚啟用下邊個掣嚟發å°ç¢ºèªä¿¡åŽ»ä½ å€‹åœ°å€åº¦ã€‚å°ä¿¡å…¥é¢æœƒé™„帶一æ¢åŒ…å«ä»£ç¢¼å˜…連çµï¼›å–ºä½ å€‹ç€è¦½å™¨åº¦æ‰“é–‹æ¢é€£çµåšŸç¢ºèªä½ å˜…電郵地å€ä¿‚有效嘅。',
+'confirmemail_pending' => '一個確èªç¢¼å·²ç¶“電郵咗畀你;如果你係啱啱開咗個新戶å£å˜…,你å¯ä»¥éŸ¿è«‹æ±‚一個新嘅確èªç¢¼ä¹‹å‰ç­‰å¤šå¹¾åˆ†é˜ç­‰ä½¢å¯„畀你。',
+'confirmemail_send' => '寄出確èªç¢¼ã€‚',
+'confirmemail_sent' => '確èªé›»éƒµå·²ç¶“寄出。',
+'confirmemail_oncreate' => '一個確èªç¢¼å·²ç¶“寄é€å’—到嘅嘅電郵地å€ã€‚
呢個代碼唔係登入嗰陣去用,但係你需è¦ä½¢åŽ»é–‹éŸ¿å‘¢å€‹wiki度,任何åŒé›»éƒµæœ‰é—œå˜…功能。',
-'confirmemail_sendfailed' => '{{SITENAME}}發唔到確èªä¿¡ã€‚請檢查å“個地å€æœ‰å†‡ç„¡æ•ˆå˜…字。
+'confirmemail_sendfailed' => '{{SITENAME}}發唔到確èªä¿¡ã€‚請檢查å“個地å€æœ‰å†‡ç„¡æ•ˆå˜…字。
郵件éžé€å“¡å›žæ‡‰å’—:$1',
-'confirmemail_invalid' => '無效嘅確èªç¢¼ã€‚個代碼å¯èƒ½å·²ç¶“éŽå’—期。',
-'confirmemail_needlogin' => '你需è¦å…ˆ$1去確èªä½ å˜…電郵地å€ã€‚',
-'confirmemail_success' => '你嘅電郵地å€å·²ç¶“得到確èªã€‚你而家å¯ä»¥[[Special:UserLogin|登入]]åŒç›¡æƒ…享å—wiki啦。',
-'confirmemail_loggedin' => '你嘅電郵地å€ç¾å·²å¾—到確èªã€‚',
-'confirmemail_error' => '儲存你嘅確èªè³‡æ–™å˜…時候有å°å°å˜¢ç™¼ç”Ÿå’—æ„外。',
-'confirmemail_subject' => '{{SITENAME}}電郵地å€ç¢ºèª',
-'confirmemail_body' => '有人(好有å¯èƒ½ä¿‚嚟自你嘅IPåœ°å€ $1)已經用呢個電郵地å€å–º{{SITENAME}}度註冊咗帳戶"$2"。
+'confirmemail_invalid' => '無效嘅確èªç¢¼ã€‚個代碼å¯èƒ½å·²ç¶“éŽå’—期。',
+'confirmemail_needlogin' => '你需è¦å…ˆ$1去確èªä½ å˜…電郵地å€ã€‚',
+'confirmemail_success' => '你嘅電郵地å€å·²ç¶“得到確èªã€‚你而家å¯ä»¥[[Special:UserLogin|登入]]åŒç›¡æƒ…享å—wiki啦。',
+'confirmemail_loggedin' => '你嘅電郵地å€ç¾å·²å¾—到確èªã€‚',
+'confirmemail_error' => '儲存你嘅確èªè³‡æ–™å˜…時候有å°å°å˜¢ç™¼ç”Ÿå’—æ„外。',
+'confirmemail_subject' => '{{SITENAME}}電郵地å€ç¢ºèª',
+'confirmemail_body' => '有人(好有å¯èƒ½ä¿‚嚟自你嘅IPåœ°å€ $1)已經用呢個電郵地å€å–º{{SITENAME}}度註冊咗帳戶"$2"。
è¦ç¢ºèªå‘¢å€‹å¸³æˆ¶çš„而且確屬於你åŒåŸ‹å•Ÿç”¨{{SITENAME}}嘅電郵功能,請喺你嘅ç€è¦½å™¨åº¦æ‰“é–‹å‘¢æ¢é€£çµï¼š
@@ -3037,8 +3103,32 @@ $3
$5
呢個確èªä»£ç¢¼æœƒå–º$4到期。',
-'confirmemail_invalidated' => '電郵地å€ç¢ºèªå–消咗',
-'invalidateemail' => 'å–消電郵確èª',
+'confirmemail_body_changed' => '有人(好有å¯èƒ½ä¿‚嚟自你嘅IPåœ°å€ $1)已經用呢個電郵地å€å–º{{SITENAME}}度改咗戶å£"$2"嘅電郵地å€"$2"。
+
+è¦ç¢ºèªå‘¢å€‹å¸³æˆ¶çš„而且確屬於你åŒåŸ‹é‡æ–°å•Ÿç”¨{{SITENAME}}嘅電郵功能,請喺你嘅ç€è¦½å™¨åº¦æ‰“é–‹å‘¢æ¢é€£çµï¼š
+
+$3
+
+如果呢個戶å£*唔係*屬於你嘅,
+è«‹è·Ÿä½å‘¢å€‹é€£çµåŽ»å–消電郵地å€ç¢ºèªï¼š
+
+$5
+
+呢個確èªä»£ç¢¼æœƒå–º$4到期。',
+'confirmemail_body_set' => '有個人,å¯èƒ½ä¿‚你,來自$1呢個IP,
+幫係{{SITENAME}}嘅用戶"$2"設定左個電郵地å€ã€‚
+
+è¦ç¢ºèªå‘¢å€‹é›»éƒµçœŸä¿‚你嘅åŒåŸ‹å†æ¬¡å•Ÿå‹•{{SITENAME}}嘅電郵功能,請開啟呢個網å€ç¢ºèªï¼š
+
+$3
+
+如果呢個*唔係*你嘅戶å£ï¼Œç”¨ä¸‹é¢å‘¢å€‹ç¶²å€åŽ»å–消呢個電郵確èªï¼š
+
+$5
+
+呢個確èªç¢¼æœƒå–º$4到期。',
+'confirmemail_invalidated' => '電郵地å€ç¢ºèªå–消咗',
+'invalidateemail' => 'å–消電郵確èª',
# Scary transclusion
'scarytranscludedisabled' => '[è·¨ wiki 滲æ¼æ­£åœç”¨]',
@@ -3083,6 +3173,7 @@ $1',
'table_pager_first' => '第一版',
'table_pager_last' => '最後一版',
'table_pager_limit' => 'æ¯ä¸€ç‰ˆé¡¯ç¤º$1個項目',
+'table_pager_limit_label' => 'æ¯ä¸€ç‰ˆé …目數:',
'table_pager_limit_submit' => '去',
'table_pager_empty' => 'ç„¡çµæžœ',
@@ -3136,6 +3227,7 @@ $1',
'version-specialpages' => '特別é ',
'version-parserhooks' => '語法鈎',
'version-variables' => '變數',
+'version-skins' => 'ç•«é¢',
'version-other' => '其他',
'version-mediahandlers' => '媒體處ç†å™¨',
'version-hooks' => '鈎',
@@ -3147,6 +3239,13 @@ $1',
'version-hook-subscribedby' => '利用於',
'version-version' => '(版本 $1)',
'version-license' => '牌照',
+'version-poweredby-credits' => "呢個 Wiki 係由 '''[http://www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
+'version-poweredby-others' => '其他',
+'version-license-info' => 'MediaWiki係自由軟件;你å¯ä»¥æ ¹æ“šFree Software Foundation所發表嘅GNU General Public Licenseæ¢æ¬¾è¦å®šï¼Œå°±æœ¬ç¨‹å¼å†ç™¼ä½ˆåŒï¼æˆ–修改;無論你根據嘅係呢個牌照嘅第二版或(任你æ€ï¼‰ä»»ä¸€æ—¥ä¹‹å¾Œç™¼è¡Œå˜…版本。
+
+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,或[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 上網ç‡]。',
'version-software' => 'è£å’—嘅軟件',
'version-software-product' => '產å“',
'version-software-version' => '版本',
@@ -3216,6 +3315,15 @@ $1',
'tags-edit' => '編輯',
'tags-hitcount' => '$1次更改',
+# Special:ComparePages
+'comparepages' => '比較版',
+'compare-selector' => '比較版修訂',
+'compare-page1' => '第1版',
+'compare-page2' => '第2版',
+'compare-rev1' => '修訂1',
+'compare-rev2' => '修訂2',
+'compare-submit' => '比較',
+
# Database error messages
'dberr-header' => '呢個 wiki 出咗å•é¡Œ',
'dberr-problems' => 'å°å””ä½ï¼
@@ -3233,8 +3341,13 @@ $1',
'htmlform-float-invalid' => '你所指定嘅值唔係一個數字。',
'htmlform-int-toolow' => '你所指定嘅值低éŽæœ€ç´°å€¼$1',
'htmlform-int-toohigh' => '你所指定嘅值高éŽæœ€å¤§å€¼$1',
+'htmlform-required' => '呢個數值係必填嘅',
'htmlform-submit' => 'éžäº¤',
'htmlform-reset' => '復原更改',
'htmlform-selectorother-other' => '其他',
+# SQLite database support
+'sqlite-has-fts' => '$1 有全文æœå°‹æ”¯æ´',
+'sqlite-no-fts' => '$1 冇全文æœå°‹æ”¯æ´',
+
);
diff --git a/languages/messages/MessagesZa.php b/languages/messages/MessagesZa.php
index df39ba6c..47da51a6 100644
--- a/languages/messages/MessagesZa.php
+++ b/languages/messages/MessagesZa.php
@@ -87,19 +87,12 @@ $messages = array(
'faqpage' => 'Project:Cam caeuq dap',
# Vector skin
-'vector-action-delete' => 'Ca',
-'vector-action-move' => 'Daen',
-'vector-action-protect' => 'Bauj',
-'vector-namespace-category' => 'Faendingz',
-'vector-namespace-help' => 'Yieb bangcoh',
-'vector-namespace-image' => 'Vwnzgen',
-'vector-namespace-main' => 'Yieb',
-'vector-namespace-media' => 'Yieb moizdij',
-'vector-namespace-mediawiki' => 'Siusik',
-'vector-namespace-template' => 'Mozbanj',
-'vector-view-create' => 'Laeb',
-'vector-view-edit' => 'gaij',
-'vector-view-history' => 'Cazyawj lizsij',
+'vector-action-delete' => 'Ca',
+'vector-action-move' => 'Daen',
+'vector-action-protect' => 'Bauj',
+'vector-view-create' => 'Laeb',
+'vector-view-edit' => 'gaij',
+'vector-view-history' => 'Cazyawj lizsij',
'errorpagetitle' => 'Loengloek',
'tagline' => 'okcih {{SITENAME}}',
diff --git a/languages/messages/MessagesZea.php b/languages/messages/MessagesZea.php
index f5058151..7b752376 100644
--- a/languages/messages/MessagesZea.php
+++ b/languages/messages/MessagesZea.php
@@ -56,8 +56,7 @@ $messages = array(
'tog-editsection' => "Bewerken van deêlpahina's meuhlijk maeken via [bewerken]-koppeliengen",
'tog-editsectiononrightclick' => "Bewerken van deêlpahina's meulijk maeken mie een rechtermuusklik op een tussenkopje (JavaScript vereist)",
'tog-showtoc' => "Inoudsopgaeve weerheven (voe pahina's mie minstes 3 tussenkopjes)",
-'tog-rememberpassword' => 'Wachtwoôrd ontouwe',
-'tog-editwidth' => 'Bewerkiengsveld over de volle breêdte',
+'tog-rememberpassword' => 'Wachtwoôrd ontouwe (for a maximum of $1 {{PLURAL:$1|day|days}})',
'tog-watchcreations' => "Pahina's die ak anmik automaotisch volhen",
'tog-watchdefault' => "Pahina's die ak bewerk automaotisch volhen",
'tog-watchmoves' => "Pahina's die ak verplekke automaotisch volhen",
@@ -385,7 +384,7 @@ Vergeet nie je [[Special:Preferences|vòkeuren voe {{SITENAME}}]] an te passen.'
'yourname' => 'Gebrukersnaem',
'yourpassword' => 'Wachtwoôrd',
'yourpasswordagain' => 'Heef je wachtwoôrd opnieuw in:',
-'remembermypassword' => 'Anmeldhehevens ontouwen',
+'remembermypassword' => 'Anmeldhehevens ontouwen (for a maximum of $1 {{PLURAL:$1|day|days}})',
'yourdomainname' => 'Je domein:',
'externaldberror' => "Der is een fout opetreeën bie 't anmelden bie de database of je ei hin toestemmieng jen externe gebruker bie te werken.",
'login' => 'Anmelden',
@@ -563,7 +562,7 @@ Je kan [[Special:Search/{{PAGENAME}}|ni deêze term zoeken]] in aore pagina\'s o
'userjsyoucanpreview' => "'''Tip:''' Gebruuk de knoppe 'Naekieken' om je nieuwe JS te tessen voe da je opsli.",
'usercsspreview' => "'''Dit is alleên een voeôvertonieng van je persoônlijke CSS, dezen is nog nie opeslogen!'''",
'userjspreview' => "'''Let op: je test noe je persoônlijke JavaScript. De pagina is nie opeslogen!'''",
-'userinvalidcssjstitle' => "'''Waerschuwieng:''' der is hin skin \"\$1\". Let op: jen eihen .css- en .js-pagina's behunnen mie een kleine letter, buvobbeld {{ns:user}}:Naem/monobook.css in plekke van {{ns:user}}:Naem/Monobook.css.",
+'userinvalidcssjstitle' => "'''Waerschuwieng:''' der is hin skin \"\$1\". Let op: jen eihen .css- en .js-pagina's behunnen mie een kleine letter, buvobbeld {{ns:user}}:Naem/vector.css in plekke van {{ns:user}}:Naem/Vector.css.",
'updated' => '(Biehewerkt)',
'note' => "'''Opmerkieng:'''",
'previewnote' => "'''Let op: dit is een controlepagina; je tekst is nie opeslogen!'''",
@@ -603,7 +602,6 @@ Ierbie beloof je ons ok da je deêze tekst zelf eschreven ei, of overenomen uut
A je nie wil dan je teksen rihoreus anepast worn deur aore, plek ze ier dan nie.<br />
Je beloof ok da je de oôrspronkelijke auteur bin van dit materiaol, of da je 't ei ekopieerd uut een bron in 't publieke domein, of een soôrthelieke vrieë bron (zie $1 voor details).
'''GEBRUUK HIN MATERIAOL DAT A BESCHERMD WOR DEUR AUTEURSRECHT, TENZIE A JE DIVOE TOESTEMMIENG EI!'''",
-'longpagewarning' => "'''WAERSCHUWIENG: Deêze pagina is $1 kilobyte hroôt; sommihe browsers èn probleemn mie 't bewerken van pagina's die an hrotter zien dan 32 kb. Misschien kan deêze pagina esplitst worn in kleinere deêln.'''",
'longpageerror' => "'''FOUT: de tekst die a je ei toe'evoegd is $1 kilobyte hroôt, wat a hrotter is dan 't maximum van $2 kilobyte.
Opslaene is nie meuhlijk.'''",
'readonlywarning' => "'''WAERSCHUWIENG: de database is eblokkeerd voe onderoud, dus je kan dezen noe nie opslaen.
@@ -1026,7 +1024,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Volglieste',
'mywatchlist' => 'Mien volglieste',
-'watchlistfor' => "(vò '''$1''')",
'watchnologin' => 'Je bin nie angemolde.',
'watchnologintext' => 'Je moe [[Special:UserLogin|angemolde]] weze om je volglieste an te passen.',
'addedwatch' => 'An de volglieste toegevoegd',
diff --git a/languages/messages/MessagesZh.php b/languages/messages/MessagesZh.php
index a6647335..adff55b2 100644
--- a/languages/messages/MessagesZh.php
+++ b/languages/messages/MessagesZh.php
@@ -7,7 +7,6 @@
* @ingroup Language
* @file
*
- * @author Horacewai2
* @author PhiLiP
* @author Philip
* @author Wong128hk
@@ -51,8 +50,8 @@ $namespaceAliases = array(
'用户讨论' => NS_USER_TALK,
'用戶討論' => NS_USER_TALK,
# This has never worked so it's unlikely to annoy anyone if I disable it -- TS
- #'{{SITENAME}}_对è¯' => NS_PROJECT_TALK
- #"{{SITENAME}}_å°è©±" => NS_PROJECT_TALK
+ # '{{SITENAME}}_对è¯' => NS_PROJECT_TALK
+ # "{{SITENAME}}_å°è©±" => NS_PROJECT_TALK
'图åƒ' => NS_FILE,
'圖åƒ' => NS_FILE,
'档案' => NS_FILE,
@@ -89,9 +88,9 @@ $namespaceAliases = array(
'幫助討論' => NS_HELP_TALK,
'分类' => NS_CATEGORY,
'分類' => NS_CATEGORY,
- '分类对è¯'=> NS_CATEGORY_TALK,
+ '分类对è¯' => NS_CATEGORY_TALK,
'分類å°è©±' => NS_CATEGORY_TALK,
- '分类讨论'=> NS_CATEGORY_TALK,
+ '分类讨论' => NS_CATEGORY_TALK,
'分類討論' => NS_CATEGORY_TALK,
);
@@ -179,10 +178,6 @@ $messages = array(
# Move page
'move-redirect-suppressed' => 'å·²ç¦æ­¢é‡æ–°å®šå‘',
-# Patrolling
-'markaspatrolleddiff' => '标记为已巡查',
-'markaspatrolledtext' => '标记此页é¢ä¸ºå·²å·¡æŸ¥',
-
/*
Short names for language variants used for language conversion links.
To disable showing a particular link, set it to 'disable', e.g.
diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php
index 722f0a85..b440fc94 100644
--- a/languages/messages/MessagesZh_hans.php
+++ b/languages/messages/MessagesZh_hans.php
@@ -11,14 +11,19 @@
* @author Bencmq
* @author Biŋhai
* @author Chenxiaoqino
+ * @author Chinalace
+ * @author Fantasticfears
* @author Franklsf95
* @author Gaoxuewei
* @author Gzdavidwong
+ * @author Hercule
* @author Horacewai2
* @author Hydra
+ * @author Jding2010
* @author Jidanni
* @author Jimmy xu wrk
* @author KaiesTse
+ * @author Kuailong
* @author Liangent
* @author Mark85296341
* @author MarkAHershberger
@@ -29,16 +34,18 @@
* @author Shizhao
* @author Tommyang
* @author Waihorace
+ * @author Wilsonmess
* @author Wmr89502270
* @author Wong128hk
* @author Xiaomingyan
+ * @author Yfdyh000
* @author 阿pp
*/
$fallback8bitEncoding = 'windows-936';
$namespaceNames = array(
- NS_MEDIA => '媒体',
+ NS_MEDIA => '媒体文件',
NS_SPECIAL => '特殊',
NS_TALK => '讨论',
NS_USER => '用户',
@@ -65,7 +72,7 @@ $namespaceAliases = array(
'用户对è¯' => NS_USER_TALK,
'用户讨论' => NS_USER_TALK,
# This has never worked so it's unlikely to annoy anyone if I disable it -- TS
- #'{{SITENAME}}_对è¯' => NS_PROJECT_TALK
+ # '{{SITENAME}}_对è¯' => NS_PROJECT_TALK
'图åƒ' => NS_FILE,
'档案' => NS_FILE,
'文件' => NS_FILE,
@@ -78,14 +85,14 @@ $namespaceAliases = array(
'文件对è¯' => NS_FILE_TALK,
'文件讨论' => NS_FILE_TALK,
'模æ¿' => NS_TEMPLATE,
- '模æ¿å¯¹è¯'=> NS_TEMPLATE_TALK,
- '模æ¿è®¨è®º'=> NS_TEMPLATE_TALK,
+ '模æ¿å¯¹è¯' => NS_TEMPLATE_TALK,
+ '模æ¿è®¨è®º' => NS_TEMPLATE_TALK,
'帮助' => NS_HELP,
- '帮助对è¯'=> NS_HELP_TALK,
- '帮助讨论'=> NS_HELP_TALK,
+ '帮助对è¯' => NS_HELP_TALK,
+ '帮助讨论' => NS_HELP_TALK,
'分类' => NS_CATEGORY,
- '分类对è¯'=> NS_CATEGORY_TALK,
- '分类讨论'=> NS_CATEGORY_TALK,
+ '分类对è¯' => NS_CATEGORY_TALK,
+ '分类讨论' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
@@ -133,9 +140,10 @@ $specialPageAliases = array(
'Allpages' => array( '所有页é¢' ),
'Prefixindex' => array( 'å‰ç¼€ç´¢å¼•' ),
'Ipblocklist' => array( 'å°ç¦åˆ—表' ),
+ 'Unblock' => array( '解除å°ç¦' ),
'Specialpages' => array( '特殊页é¢' ),
'Contributions' => array( '用户贡献' ),
- 'Emailuser' => array( '电邮用户' ),
+ 'Emailuser' => array( '邮件用户' ),
'Confirmemail' => array( '确认电å­é‚®ä»¶' ),
'Whatlinkshere' => array( '链入页é¢' ),
'Recentchangeslinked' => array( '链出更改' ),
@@ -155,7 +163,7 @@ $specialPageAliases = array(
'Userrights' => array( '用户æƒé™' ),
'MIMEsearch' => array( 'MIMEæœç´¢' ),
'FileDuplicateSearch' => array( 'æœç´¢é‡å¤æ–‡ä»¶' ),
- 'Unwatchedpages' => array( '未被监视的页é¢' ),
+ 'Unwatchedpages' => array( '未å—监视页é¢' ),
'Listredirects' => array( 'é‡å®šå‘页é¢åˆ—表' ),
'Revisiondelete' => array( '删除或æ¢å¤ç‰ˆæœ¬' ),
'Unusedtemplates' => array( '未使用模æ¿' ),
@@ -163,12 +171,14 @@ $specialPageAliases = array(
'Mypage' => array( '我的用户页' ),
'Mytalk' => array( '我的讨论页' ),
'Mycontributions' => array( '我的贡献' ),
+ 'Myuploads' => array( '我的上传' ),
+ 'PermanentLink' => array( '永久链接' ),
'Listadmins' => array( '管ç†å‘˜åˆ—表' ),
'Listbots' => array( '机器人列表' ),
'Popularpages' => array( '热点页é¢' ),
'Search' => array( 'æœç´¢' ),
'Resetpass' => array( '修改密ç ' ),
- 'Withoutinterwiki' => array( '没有跨语言链接的页é¢' ),
+ 'Withoutinterwiki' => array( '无跨维基链接页é¢' ),
'MergeHistory' => array( 'åˆå¹¶åŽ†å²' ),
'Filepath' => array( '文件路径' ),
'Invalidateemail' => array( 'ä¸å¯è¯†åˆ«çš„电邮地å€' ),
@@ -177,6 +187,9 @@ $specialPageAliases = array(
'DeletedContributions' => array( '已删除的用户贡献' ),
'Tags' => array( '标签' ),
'Activeusers' => array( '活跃用户' ),
+ 'ComparePages' => array( '对比页å­' ),
+ 'Badtitle' => array( 'å标题' ),
+ 'DisableAccount' => array( 'ç¦ç”¨å¸æˆ·' ),
);
$linkTrail = '/^()(.*)$/sD';
@@ -224,8 +237,7 @@ $messages = array(
'tog-editsection' => 'å…许点击[编辑]链接编辑段è½',
'tog-editsectiononrightclick' => 'å…许å³å‡»æ ‡é¢˜ç¼–辑段è½ï¼ˆJavaScript)',
'tog-showtoc' => '显示目录(针对超过3个标题的页é¢ï¼‰',
-'tog-rememberpassword' => '在此计算机上记ä½æˆ‘的密ç ',
-'tog-editwidth' => '将编辑框扩展到全å±å®½åº¦',
+'tog-rememberpassword' => '在此æµè§ˆå™¨ä¸Šä¿ç•™æˆ‘的登录信æ¯ï¼ˆæœ€é•¿$1{{PLURAL:$1|æ—¥|æ—¥}})',
'tog-watchcreations' => '将我创建的页é¢æ·»åŠ åˆ°æˆ‘的监视列表',
'tog-watchdefault' => '将我编辑的页é¢æ·»åŠ åˆ°æˆ‘的监视列表',
'tog-watchmoves' => '将我移动的页é¢æ·»åŠ åˆ°æˆ‘的监视列表',
@@ -371,31 +383,21 @@ $messages = array(
'faqpage' => 'Project:常è§é—®é¢˜',
# Vector skin
-'vector-action-addsection' => '添加è¯é¢˜',
-'vector-action-delete' => '删除',
-'vector-action-move' => '移动',
-'vector-action-protect' => 'ä¿æŠ¤',
-'vector-action-undelete' => 'æ¢å¤è¢«åˆ é¡µé¢',
-'vector-action-unprotect' => '解除ä¿æŠ¤',
-'vector-namespace-category' => '分类',
-'vector-namespace-help' => '帮助页é¢',
-'vector-namespace-image' => '文件',
-'vector-namespace-main' => '页é¢',
-'vector-namespace-media' => '媒体页é¢',
-'vector-namespace-mediawiki' => 'ä¿¡æ¯',
-'vector-namespace-project' => '计划页é¢',
-'vector-namespace-special' => '特殊页é¢',
-'vector-namespace-talk' => '讨论',
-'vector-namespace-template' => '模æ¿',
-'vector-namespace-user' => '用户页é¢',
-'vector-view-create' => '创建',
-'vector-view-edit' => '编辑',
-'vector-view-history' => '查看历å²',
-'vector-view-view' => '阅读',
-'vector-view-viewsource' => '查看æºä»£ç ',
-'actions' => '动作',
-'namespaces' => 'å字空间',
-'variants' => 'å˜æ¢',
+'vector-action-addsection' => '添加è¯é¢˜',
+'vector-action-delete' => '删除',
+'vector-action-move' => '移动',
+'vector-action-protect' => 'ä¿æŠ¤',
+'vector-action-undelete' => 'æ¢å¤è¢«åˆ é¡µé¢',
+'vector-action-unprotect' => '解除ä¿æŠ¤',
+'vector-simplesearch-preference' => '打开增强æœç´¢å»ºè®®ï¼ˆä»…é™Vector皮肤)',
+'vector-view-create' => '创建',
+'vector-view-edit' => '编辑',
+'vector-view-history' => '查看历å²',
+'vector-view-view' => '阅读',
+'vector-view-viewsource' => '查看æºä»£ç ',
+'actions' => '动作',
+'namespaces' => 'å字空间',
+'variants' => 'å˜æ¢',
'errorpagetitle' => '错误',
'returnto' => '返回到$1。',
@@ -456,6 +458,9 @@ $messages = array(
请在å†æ¬¡å°è¯•è®¿é—®æœ¬é¡µé¢ä¹‹å‰ç¨ç­‰ç‰‡åˆ»ã€‚
$1',
+'pool-timeout' => '等待é”超时',
+'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}}',
@@ -610,7 +615,8 @@ $2',
'yourname' => '用户å:',
'yourpassword' => '密ç ï¼š',
'yourpasswordagain' => 'å†æ¬¡è¾“入密ç ï¼š',
-'remembermypassword' => '下次登录记ä½å¯†ç ',
+'remembermypassword' => '在此æµè§ˆå™¨ä¸Šä¿ç•™æˆ‘的登录信æ¯ï¼ˆæœ€é•¿$1{{PLURAL:$1|æ—¥|æ—¥}})',
+'securelogin-stick-https' => '登陆åŽç»§ç»­ä½¿ç”¨ HTTPS 连接',
'yourdomainname' => '您的域å:',
'externaldberror' => 'è¿™å¯èƒ½æ˜¯ç”±äºŽéªŒè¯æ•°æ®åº“错误或您被ç¦æ­¢æ›´æ–°æ‚¨çš„外部账å·ã€‚',
'login' => '登录',
@@ -627,6 +633,7 @@ $2',
'gotaccount' => 'å·²ç»æ‹¥æœ‰è´¦æˆ·ï¼Ÿ$1。',
'gotaccountlink' => '登录',
'createaccountmail' => '通过电å­é‚®ä»¶',
+'createaccountreason' => 'ç†ç”±ï¼š',
'badretype' => '您所输入的密ç å¹¶ä¸ç›¸åŒã€‚',
'userexists' => '您所输入的用户å称已ç»å­˜åœ¨ï¼Œè¯·å¦é€‰ä¸€ä¸ªå称。',
'loginerror' => '登录错误',
@@ -644,6 +651,7 @@ $2',
'wrongpasswordempty' => '您没有输入密ç ï¼Œè¯·é‡è¯•ï¼',
'passwordtooshort' => '您的密ç è‡³å°‘需è¦$1个字符。',
'password-name-match' => '您的密ç å¿…须和您的用户åä¸ç›¸åŒã€‚',
+'password-login-forbidden' => '这个用户å称åŠå¯†ç çš„使用是被ç¦æ­¢çš„。',
'mailmypassword' => '将新密ç å¯„给我',
'passwordremindertitle' => '{{SITENAME}}的新临时密ç ',
'passwordremindertext' => '有人(å¯èƒ½æ˜¯æ‚¨ï¼Œæ¥è‡ªIP地å€$1)已请求{{SITENAME}}的新密ç ï¼ˆ$4)。
@@ -679,6 +687,9 @@ $2',
'loginlanguagelabel' => '语言:$1',
'suspicious-userlogout' => '您登出的è¦æ±‚å·²ç»è¢«æ‹’ç»ï¼Œå› ä¸ºå®ƒå¯èƒ½æ˜¯ç”±å·²æŸåçš„æµè§ˆå™¨æˆ–者缓存代ç†ä¼ é€ã€‚',
+# E-mail sending
+'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
+
# Password reset dialog
'resetpass' => '更改密ç ',
'resetpass_announce' => '您是通过å‘é€åˆ°ç”µå­é‚®ç®±çš„临时密ç ç™»å½•çš„。è¦å®Œæˆç™»å½•ï¼Œè¯·è®¾å®šä¸€ä¸ªæ–°çš„密ç ï¼š',
@@ -728,9 +739,10 @@ $2',
'showdiff' => '显示差异',
'anoneditwarning' => "'''警告:'''您没有登录。
您的IP地å€å°†è®°å½•åœ¨æ­¤é¡µçš„编辑历å²ä¸­ã€‚",
+'anonpreviewwarning' => "''您没有登录。ä¿å­˜é¡µé¢å°†ä¼šæŠŠæ‚¨çš„IP地å€è®°å½•åœ¨æ­¤é¡µçš„编辑历å²ä¸­ã€‚''",
'missingsummary' => "'''æ示:''' 您没有æ供一个编辑摘è¦ã€‚如果您å†æ¬¡å•å‡»â€œ{{int:savearticle}}â€ï¼Œæ‚¨çš„编辑将ä¸å¸¦ç¼–辑摘è¦ä¿å­˜ã€‚",
'missingcommenttext' => '请在下é¢è¾“入评论。',
-'missingcommentheader' => "'''æ示:''' 您没有为此评论æ供一个标题。如果您å†æ¬¡å•å‡»ä¿å­˜ï¼Œæ‚¨çš„编辑将ä¸å¸¦æ ‡é¢˜ä¿å­˜ã€‚",
+'missingcommentheader' => "'''æ示:''' 您没有为此评论æ供一个标题。如果您å†æ¬¡å•å‡»â€œ{{int:savearticle}}â€ï¼Œæ‚¨çš„编辑将ä¸å¸¦æ ‡é¢˜ä¿å­˜ã€‚",
'summary-preview' => '摘è¦é¢„览:',
'subject-preview' => '标题预览:',
'blockedtitle' => '用户被å°ç¦',
@@ -789,7 +801,11 @@ $2',
'''还没有ä¿å­˜ï¼'''",
'userjspreview' => "'''è®°ä½æ‚¨åªæ˜¯åœ¨æµ‹è¯•ï¼é¢„览您的个人 JavaScript。'''
'''还没有ä¿å­˜ï¼'''",
-'userinvalidcssjstitle' => "'''警告:''' ä¸å­˜åœ¨çš®è‚¤\"\$1\"。注æ„自定义的 .css å’Œ .js 页è¦ä½¿ç”¨å°å†™æ ‡é¢˜ï¼Œä¾‹å¦‚,{{ns:user}}:Foo/monobook.css ä¸åŒäºŽ {{ns:user}}:Foo/Monobook.css。",
+'sitecsspreview' => "'''è®°ä½ä½ çŽ°åœ¨åªæ˜¯é¢„览此 CSS。'''
+'''还没有ä¿å­˜ï¼'''",
+'sitejspreview' => "'''è®°ä½ä½ çŽ°åœ¨åªæ˜¯é¢„览此 JavaScript 代ç ã€‚'''
+'''还没有ä¿å­˜ï¼'''",
+'userinvalidcssjstitle' => "'''警告:''' ä¸å­˜åœ¨çš®è‚¤\"\$1\"。注æ„自定义的 .css å’Œ .js 页è¦ä½¿ç”¨å°å†™æ ‡é¢˜ï¼Œä¾‹å¦‚,{{ns:user}}:Foo/vector.css ä¸åŒäºŽ {{ns:user}}:Foo/Vector.css。",
'updated' => '(已更新)',
'note' => "'''注æ„:'''",
'previewnote' => "'''请记ä½è¿™åªæ˜¯é¢„览。'''内容还未ä¿å­˜ï¼",
@@ -826,8 +842,6 @@ $2',
如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£å¸ƒï¼Œè¯·ä¸è¦æ交。<br />
您åŒæ—¶ä¹Ÿè¦å‘我们ä¿è¯æ‚¨æ‰€æ交的内容是您自己所作,或得自一个ä¸å—版æƒä¿æŠ¤æˆ–相似自由的æ¥æºï¼ˆå‚阅$1的细节)。
'''ä¸è¦åœ¨æœªèŽ·æŽˆæƒçš„情况下å‘表ï¼'''",
-'longpagewarning' => "'''警告''':该页é¢çš„长度是$1KB;一些æµè§ˆå™¨åœ¨ç¼–辑长度接近或大于32KB的页é¢å¯èƒ½å­˜åœ¨é—®é¢˜ã€‚
-您应该考虑将此页é¢åˆ†æˆæ›´å°çš„章节。",
'longpageerror' => "'''错误:您所æ交的文本长度有$1KB,这大于$2KB的最大值。'''该文本ä¸èƒ½è¢«ä¿å­˜ã€‚",
'readonlywarning' => "'''警告:数æ®åº“被é”定以进行维护,所以您目å‰å°†æ— æ³•ä¿å­˜æ‚¨çš„修改。'''您或许希望将本段文字先å¤åˆ¶å¹¶ä¿å­˜åˆ°æ–‡æœ¬æ–‡ä»¶ï¼Œå¹¶åœ¨ç¨åŽè¿›è¡Œä¿®æ”¹ã€‚
@@ -1002,6 +1016,8 @@ $1",
'logdelete-failure' => "'''事件的å¯è§æ€§æ— æ³•è®¾ç½®ï¼š'''
$1",
'revdel-restore' => '更改å¯è§æ€§',
+'revdel-restore-deleted' => '已删除的修订版本',
+'revdel-restore-visible' => 'å¯è§çš„修订版本',
'pagehist' => '页é¢åŽ†å²',
'deletedhist' => '已删除之历å²',
'revdelete-content' => '内容',
@@ -1065,11 +1081,13 @@ $1",
# Diffs
'history-title' => '“$1â€çš„修订历å²',
'difference' => '(修订版本间的差异)',
+'difference-multipage' => '(页é¢é—´çš„差异)',
'lineno' => '第$1行:',
'compareselectedversions' => '比较选定的修订版本',
'showhideselectedversions' => '显示ï¼éšè—选定的修订版本',
'editundo' => '撤销',
-'diff-multi' => '($1个中途的修订版本没有显示)',
+'diff-multi' => '(由{{PLURAL:$2|1å用户|$2å用户}}作出的{{PLURAL:$1|一个中途修订版本|$1个中途修订版本}}未被显示)',
+'diff-multi-manyusers' => '(由多于$2å用户作出的{{PLURAL:$1|一个中途修订版本|$1个中途修订版本}} 未被显示)',
# Search results
'searchresults' => 'æœç´¢ç»“æžœ',
@@ -1104,6 +1122,7 @@ $1",
'searchprofile-everything-tooltip' => 'æœç´¢å…¨éƒ¨ï¼ˆåŒ…括讨论页é¢ï¼‰',
'searchprofile-advanced-tooltip' => '在自定义的å字空间中æœç´¢',
'search-result-size' => '$1($2个字)',
+'search-result-category-size' => '$1ä½æˆå‘˜ï¼ˆ$2个å­åˆ†ç±»ï¼Œ$3个文件)',
'search-result-score' => '相关度:$1%',
'search-redirect' => '(é‡å®šå‘ $1)',
'search-section' => 'ï¼ˆæ®µè½ $1)',
@@ -1178,6 +1197,7 @@ $1",
'contextlines' => 'æ¯é“¾æ˜¾ç¤ºè¡Œæ•°ï¼š',
'contextchars' => 'æ¯è¡Œæ˜¾ç¤ºå­—数:',
'stub-threshold' => '<a href="#" class="stub">短页é¢é“¾æŽ¥</a>æ ¼å¼é—¨æ§›å€¼ï¼ˆå­—节):',
+'stub-threshold-disabled' => 'å·²åœç”¨',
'recentchangesdays' => '最近更改中的显示日数:',
'recentchangesdays-max' => '最多 $1 {{PLURAL:$1|天|天}}',
'recentchangescount' => '默认显示的编辑数:',
@@ -1209,6 +1229,7 @@ $1",
'prefs-files' => '文件',
'prefs-custom-css' => '自定义CSS',
'prefs-custom-js' => '自定义JavaScript',
+'prefs-common-css-js' => '共享CSS/JavaScript于所有皮肤中:',
'prefs-reset-intro' => '您å¯ä»¥åˆ©ç”¨è¿™ä¸ªé¡µé¢åŽ»é‡è®¾æ‚¨çš„å‚数设置到网站默认值。这个动作无法å¤åŽŸã€‚',
'prefs-emailconfirm-label' => '电å­é‚®ä»¶ç¡®è®¤ï¼š',
'prefs-textboxsize' => '编辑框大å°',
@@ -1245,9 +1266,15 @@ $1",
'prefs-advancedrendering' => '高级选项',
'prefs-advancedsearchoptions' => '高级选项',
'prefs-advancedwatchlist' => '高级选项',
-'prefs-display' => '显示选项',
+'prefs-displayrc' => '显示选项',
+'prefs-displaysearchoptions' => '显示选项',
+'prefs-displaywatchlist' => '显示选项',
'prefs-diffs' => '差异',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => '电å­é‚®ä»¶åœ°å€æœ‰æ•ˆ',
+'email-address-validity-invalid' => '请æ供一个有效的电å­é‚®ä»¶åœ°å€',
+
# User rights
'userrights' => '用户æƒé™ç®¡ç†',
'userrights-lookup-user' => '管ç†ç”¨æˆ·ç¾¤ç»„',
@@ -1331,6 +1358,7 @@ $1",
'right-hideuser' => 'å°é”用户å,对公众éšè—',
'right-ipblock-exempt' => '绕过IPå°é”ã€è‡ªåŠ¨å°é”以åŠèŒƒå›´å°é”',
'right-proxyunbannable' => '绕过Proxy的自动å°é”',
+'right-unblockself' => '自我解除å°é”',
'right-protect' => '更改ä¿æŠ¤ç­‰çº§ä»¥åŠç¼–辑ä¿æŠ¤é¡µé¢',
'right-editprotected' => '编辑ä¿æŠ¤é¡µé¢ï¼ˆæ— è¿žé”ä¿æŠ¤ï¼‰',
'right-editinterface' => '编辑用户接å£',
@@ -1353,7 +1381,6 @@ $1",
'right-siteadmin' => 'é”定和解除é”定数æ®åº“',
'right-reset-passwords' => 'é‡è®¾å…¶ä»–用户的密ç ',
'right-override-export-depth' => '导出å«æœ‰äº”层深度链接页é¢ä¹‹é¡µé¢',
-'right-versiondetail' => '显示延伸软件版本的资料',
'right-sendemail' => 'å‘电å­é‚®ä»¶ç»™å…¶ä»–用户',
# User rights log
@@ -1404,14 +1431,9 @@ $1",
'recentchanges-legend' => '最近更改选项',
'recentchangestext' => '跟踪这个wiki上的最新更改。',
'recentchanges-feed-description' => '跟踪此订阅在 wiki 上的最近更改。',
-'recentchanges-label-legend' => '图例: $1',
-'recentchanges-legend-newpage' => '$1 - 新页é¢',
'recentchanges-label-newpage' => '这次编辑建立了一个新页é¢',
-'recentchanges-legend-minor' => '$1 - å°ç¼–辑',
'recentchanges-label-minor' => '这是一个å°ç¼–辑',
-'recentchanges-legend-bot' => '$1 - 机器人编辑',
'recentchanges-label-bot' => '这次编辑是由机器人进行',
-'recentchanges-legend-unpatrolled' => '$1 - 未巡查过的编辑',
'recentchanges-label-unpatrolled' => '这次编辑尚未巡查过',
'rcnote' => "以下是在$4 $5,最近'''$2'''天内的'''$1'''次最近更改记录:",
'rcnotefrom' => "以下是自'''$2'''的更改(最多显示'''$1'''):",
@@ -1458,6 +1480,9 @@ $1",
'upload_directory_missing' => '上传目录($1)é—失,ä¸èƒ½ç”±ç½‘页æœåŠ¡å™¨å»ºç«‹ã€‚',
'upload_directory_read_only' => '上传目录($1)ä¸å­˜åœ¨æˆ–无写æƒé™ã€‚',
'uploaderror' => '上传错误',
+'upload-recreate-warning' => "'''警告:一个相åŒå字的文件曾ç»è¢«åˆ é™¤æˆ–者移动至别处。'''
+
+这个页é¢çš„删除和移动日志在这里æ供以便å‚考:",
'uploadtext' => "使用下é¢çš„表å•æ¥ä¸Šä¼ æ–‡ä»¶ã€‚
è¦æŸ¥çœ‹æˆ–æœç´¢ä»¥å‰ä¸Šä¼ çš„文件,å¯ä»¥è¿›å…¥[[Special:FileList|文件上传列表]],(é‡æ–°ï¼‰ä¸Šä¼ ä¹Ÿå°†åœ¨[[Special:Log/upload|上传日志]]中记录,而删除将在[[Special:Log/delete|删除日志]]中记录。
@@ -1492,6 +1517,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"'''是一ç§ä¸å‡†è®¸çš„文件类型。
容许的{{PLURAL:\$3|一ç§|多ç§}}文件类型有\$2。",
'filetype-missing' => '该文件å称并没有扩展å(例如“.jpgâ€ï¼‰ã€‚',
+'empty-file' => '您所æ交的文件为空文件。',
+'file-too-large' => '您所æ交的文件过大。',
+'filename-tooshort' => '文件å过短。',
+'filetype-banned' => '此类文件被ç¦æ­¢ã€‚',
+'verification-error' => '文件未通过验è¯ã€‚',
+'hookaborted' => '您所å°è¯•çš„修改被æ’件钩å­èˆå¼ƒã€‚',
+'illegal-filename' => '文件åéžæ³•ã€‚',
+'overwrite' => 'ä¸å…许覆盖现有文件。',
+'unknown-error' => 'å‘生未知错误。',
+'tmp-create-error' => '无法创建临时文件。',
+'tmp-write-error' => '临时文件写入å‘生错误。',
'large-file' => '建议文件大å°ä¸èƒ½è¶…过 $1;本文件大å°ä¸º $2。',
'largefileserver' => '这个文件的大å°æ¯”æœåŠ¡å™¨é…ç½®å…许的大å°è¿˜è¦å¤§ã€‚',
'emptyfile' => '您所上传的文件ä¸å­˜åœ¨ã€‚è¿™å¯èƒ½æ˜¯ç”±äºŽæ–‡ä»¶å键入错误。请检查您是å¦çœŸçš„è¦ä¸Šä¼ æ­¤æ–‡ä»¶ã€‚',
@@ -1514,13 +1550,14 @@ $1",
如果你ä»ç„¶æƒ³åŽ»ä¸Šä¼ å®ƒçš„è¯ï¼Œè¯·è¿”回并用一个新的å称æ¥ä¸Šä¼ æ­¤æ–‡ä»¶ã€‚[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => '这个文件与以下{{PLURAL:$1|一|多}}个文件é‡å¤ï¼š',
'file-deleted-duplicate' => '一个相åŒå称的文件 ([[:$1]]) 在先å‰åˆ é™¤è¿‡ã€‚您应该在é‡æ–°ä¸Šä¼ ä¹‹å‰æ£€æŸ¥ä¸€ä¸‹è¯¥æ–‡ä»¶ä¹‹åˆ é™¤çºªå½•ã€‚',
-'successfulupload' => '上传æˆåŠŸ',
'uploadwarning' => '上传警告',
'uploadwarning-text' => '请修改以下的文件æ述并é‡è¯•ã€‚',
'savefile' => 'ä¿å­˜æ–‡ä»¶',
'uploadedimage' => '已上传“[[$1]]â€',
'overwroteimage' => '已上传“[[$1]]â€çš„新版本',
'uploaddisabled' => '上传己åœç”¨ã€‚',
+'copyuploaddisabled' => '通过网å€ä¸Šä¼ åŠŸèƒ½æœªå¼€é€šã€‚',
+'uploadfromurl-queued' => '上传已被列入队列。',
'uploaddisabledtext' => '文件上传ä¸å¯ç”¨ã€‚',
'php-uploaddisabledtext' => 'PHP 文件上传已ç»åœç”¨ã€‚请检查 file_uploads 设置。',
'uploadscripted' => '该文件包å«å¯èƒ½è¢«ç½‘络æµè§ˆå™¨é”™è¯¯è§£é‡Šçš„ HTML 或脚本代ç ã€‚',
@@ -1540,6 +1577,14 @@ $1",
您应该è¦è€ƒè™‘一下继续上传一个文件页é¢æ˜¯å¦åˆé€‚。
为方便起è§ï¼Œè¿™ä¸€ä¸ªæ–‡ä»¶çš„删除记录已ç»åœ¨ä¸‹é¢æä¾›:",
'filename-bad-prefix' => '您上传的文件å称是以<strong>“$1â€</strong>作为开头,通常这ç§æ²¡æœ‰å«æ„的文件å称是由数ç ç›¸æœºä¸­è‡ªåŠ¨ç¼–排。请在您的文件中é‡æ–°é€‰æ‹©ä¸€ä¸ªæ›´åŠ æœ‰æ„义的文件å称。',
+'upload-success-subj' => '上传æˆåŠŸ',
+'upload-success-msg' => '您在[$2]的上传已ç»æˆåŠŸï¼Œå¯ä»¥åœ¨è¿™é‡Œæ‰¾åˆ°ï¼š[[:{{ns:file}}:$1]]',
+'upload-failure-subj' => '上传问题',
+'upload-failure-msg' => '您在[$2]的上传出现了问题:
+
+$1',
+'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> 开头。',
@@ -1594,6 +1639,7 @@ $1",
'listfiles_search_for' => '按媒体å称æœç´¢ï¼š',
'imgfile' => '文件',
'listfiles' => '文件列表',
+'listfiles_thumb' => '缩略图',
'listfiles_date' => '日期',
'listfiles_name' => 'å称',
'listfiles_user' => '用户',
@@ -1708,8 +1754,8 @@ $1",
'statistics-edits' => '自从{{SITENAME}}设置的页é¢ç¼–辑数',
'statistics-edits-average' => 'æ¯ä¸€é¡µé¢çš„å¹³å‡ç¼–辑数',
'statistics-views-total' => '查看总数',
+'statistics-views-total-desc' => 'ä¸å­˜åœ¨é¡µé¢å’Œç‰¹æ®Šé¡µé¢çš„查看数未计入',
'statistics-views-peredit' => 'æ¯æ¬¡ç¼–辑查看数',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue 工作队列]长度',
'statistics-users' => '已注册[[Special:ListUsers|用户]]',
'statistics-users-active' => '活跃用户',
'statistics-users-active-desc' => '在å‰$1天中æ“作过的用户',
@@ -1726,7 +1772,7 @@ Template:消除歧義',
'disambiguations-text' => '以下的页é¢éƒ½æœ‰åˆ°<b>消歧义页</b>的链接, 但它们应该是链到适当的标题。<br />一个页é¢ä¼šè¢«è§†ä¸ºæ¶ˆæ­§ä¹‰é¡µå¦‚果它是链自[[MediaWiki:Disambiguationspage]]。',
'doubleredirects' => 'åŒé‡é‡å®šå‘页é¢',
-'doubleredirectstext' => '此页列出了所有é‡å®šå‘到å¦ä¸€é‡å®šå‘页é¢çš„页é¢ã€‚æ¯ä¸€è¡Œéƒ½åŒ…å«æœ‰åˆ°ç¬¬ä¸€å’Œç¬¬äºŒä¸ªé‡å®šå‘页é¢çš„链接,以åŠç¬¬äºŒä¸ªé‡å®šå‘页é¢çš„目标——通常就是“真正的â€ç›®æ ‡é¡µé¢ï¼Œäº¦å³æ˜¯ç¬¬ä¸€ä¸ªé‡å®šå‘页é¢åº”该指å‘的页é¢ã€‚<s>已划去</s>的为已ç»è§£å†³çš„项目。',
+'doubleredirectstext' => '此页列出了所有é‡å®šå‘到å¦ä¸€é‡å®šå‘页é¢çš„页é¢ã€‚æ¯ä¸€è¡Œéƒ½åŒ…å«æœ‰åˆ°ç¬¬ä¸€å’Œç¬¬äºŒä¸ªé‡å®šå‘页é¢çš„链接,以åŠç¬¬äºŒä¸ªé‡å®šå‘页é¢çš„目标——通常就是“真正的â€ç›®æ ‡é¡µé¢ï¼Œäº¦å³æ˜¯ç¬¬ä¸€ä¸ªé‡å®šå‘页é¢åº”该指å‘的页é¢ã€‚<del>已划去</del>的为已ç»è§£å†³çš„项目。',
'double-redirect-fixed-move' => '[[$1]]å·²ç»å®Œæˆç§»åŠ¨ï¼Œå®ƒçŽ°åœ¨é‡å®šå‘到[[$2]]。',
'double-redirect-fixer' => 'é‡å®šå‘修正器',
@@ -1749,6 +1795,8 @@ Template:消除歧義',
'nmembers' => '$1个æˆå‘˜',
'nrevisions' => '$1个修订',
'nviews' => '$1次æµè§ˆ',
+'nimagelinks' => '用于$1个页é¢ä¸­',
+'ntransclusions' => '用于$1个页é¢ä¸­',
'specialpage-empty' => '这个报告的结果为空。',
'lonelypages' => '孤立页é¢',
'lonelypagestext' => '以下页é¢å°šæœªè¢«{{SITENAME}}中的其它页é¢é“¾æŽ¥æˆ–被之包å«ã€‚',
@@ -1906,36 +1954,42 @@ Template:消除歧義',
'listgrouprights-removegroup-self-all' => '在自己的账户中移除所有群组',
# E-mail user
-'mailnologin' => '无电邮地å€',
-'mailnologintext' => '您必须先[[Special:UserLogin|登录]]
+'mailnologin' => '无电邮地å€',
+'mailnologintext' => '您必须先[[Special:UserLogin|登录]]
并在[[Special:Preferences|å‚数设置]]
中有一个有效的电å­é‚®ç®±åœ°å€æ‰å¯ä»¥å‘其他用户å‘邮件。',
-'emailuser' => 'å‘该用户å‘邮件',
-'emailpage' => 'å‘用户å‘邮件',
-'emailpagetext' => '您å¯ä»¥ç”¨ä¸‹é¢çš„表格去寄一å°ç”µé‚®ç»™è¿™ä½ç”¨æˆ·ã€‚
+'emailuser' => 'å‘该用户å‘邮件',
+'emailpage' => 'å‘用户å‘邮件',
+'emailpagetext' => '您å¯ä»¥ç”¨ä¸‹é¢çš„表格去寄一å°ç”µé‚®ç»™è¿™ä½ç”¨æˆ·ã€‚
您在[[Special:Preferences|您å‚数设置]]中所输入的电å­é‚®ç®±åœ°å€å°†å‡ºçŽ°åœ¨é‚®ä»¶"å‘件人"一æ ä¸­ï¼Œè¿™æ ·è¯¥ç”¨æˆ·å°±å¯ä»¥å›žå¤æ‚¨ã€‚',
-'usermailererror' => 'Mail 对象返回错误:',
-'defemailsubject' => '{{SITENAME}}电å­é‚®ä»¶',
-'noemailtitle' => '无电å­é‚®ä»¶åœ°å€',
-'noemailtext' => '该用户还没有指定一个有效的电å­é‚®ä»¶åœ°å€ã€‚',
-'nowikiemailtitle' => 'ä¸å®¹è®¸ç”µå­é‚®ä»¶',
-'nowikiemailtext' => 'è¿™ä½ç”¨æˆ·é€‰æ‹©ä¸æŽ¥æ”¶å…¶ä»–用户的电å­é‚®ä»¶ã€‚',
-'email-legend' => 'å‘一å°ç”µå­é‚®ä»¶è‡³å¦ä¸€ä½{{SITENAME}}用户',
-'emailfrom' => 'å‘件人:',
-'emailto' => '收件人:',
-'emailsubject' => '主题:',
-'emailmessage' => 'ä¿¡æ¯ï¼š',
-'emailsend' => 'å‘é€',
-'emailccme' => '将我的消æ¯çš„副本å‘é€ä¸€ä»½åˆ°æˆ‘的邮箱。',
-'emailccsubject' => '将您的消æ¯å¤åˆ¶åˆ° $1:$2',
-'emailsent' => '电å­é‚®ä»¶å·²å‘é€',
-'emailsenttext' => '您的电å­é‚®ä»¶å·²ç»å‘出。',
-'emailuserfooter' => 'è¿™å°ç”µé‚®æ˜¯ç”±$1寄给$2ç»{{SITENAME}}的“电邮用户â€åŠŸèƒ½å‘出的。',
+'usermailererror' => 'Mail 对象返回错误:',
+'defemailsubject' => '{{SITENAME}}电å­é‚®ä»¶',
+'usermaildisabled' => '用户电邮已åœç”¨',
+'usermaildisabledtext' => '您ä¸å¯ä»¥å‘é€ç”µé‚®åˆ°è¿™ä¸ªwiki上的其他用户',
+'noemailtitle' => '无电å­é‚®ä»¶åœ°å€',
+'noemailtext' => '该用户还没有指定一个有效的电å­é‚®ä»¶åœ°å€ã€‚',
+'nowikiemailtitle' => 'ä¸å®¹è®¸ç”µå­é‚®ä»¶',
+'nowikiemailtext' => 'è¿™ä½ç”¨æˆ·é€‰æ‹©ä¸æŽ¥æ”¶å…¶ä»–用户的电å­é‚®ä»¶ã€‚',
+'email-legend' => 'å‘一å°ç”µå­é‚®ä»¶è‡³å¦ä¸€ä½{{SITENAME}}用户',
+'emailfrom' => 'å‘件人:',
+'emailto' => '收件人:',
+'emailsubject' => '主题:',
+'emailmessage' => 'ä¿¡æ¯ï¼š',
+'emailsend' => 'å‘é€',
+'emailccme' => '将我的消æ¯çš„副本å‘é€ä¸€ä»½åˆ°æˆ‘的邮箱。',
+'emailccsubject' => '将您的消æ¯å¤åˆ¶åˆ° $1:$2',
+'emailsent' => '电å­é‚®ä»¶å·²å‘é€',
+'emailsenttext' => '您的电å­é‚®ä»¶å·²ç»å‘出。',
+'emailuserfooter' => 'è¿™å°ç”µé‚®æ˜¯ç”±$1寄给$2ç»{{SITENAME}}的“电邮用户â€åŠŸèƒ½å‘出的。',
+
+# User Messenger
+'usermessage-summary' => '留下系统信æ¯ã€‚',
+'usermessage-editor' => '系统界é¢',
# Watchlist
'watchlist' => '监视列表',
'mywatchlist' => '监视列表',
-'watchlistfor' => "('''$1'''的监视列表')",
+'watchlistfor2' => '$1的监视列表 $2',
'nowatchlist' => '您的监视列表为空。',
'watchlistanontext' => '请$1以查看或编辑您的监视列表。',
'watchnologin' => '未登录',
@@ -2050,7 +2104,10 @@ $UNWATCHURL
'revertpage-nouser' => 'æ¢å¤ç”±ï¼ˆç§»é™¤äº†çš„用户å)的编辑到[[User:$1|$1]]的最åŽä¸€ä¸ªä¿®è®¢ç‰ˆæœ¬',
'rollback-success' => 'å·²æ¢å¤$1的编辑;
更改回$2的最åŽä¿®è®¢ç‰ˆæœ¬ã€‚',
-'sessionfailure' => '似乎您的登录会è¯æœ‰é—®é¢˜ï¼›
+
+# Edit tokens
+'sessionfailure-title' => '登录信æ¯å¤±è´¥',
+'sessionfailure' => '似乎您的登录会è¯æœ‰é—®é¢˜ï¼›
为了防止会è¯åŠ«æŒï¼Œè¿™ä¸ªæ“作已ç»è¢«å–消。
请返回先å‰çš„页é¢ï¼Œé‡æ–°è½½å…¥è¯¥é¡µé¢ï¼Œç„¶åŽé‡è¯•ã€‚',
@@ -2174,19 +2231,23 @@ $1',
'month' => '从该月份 (或更早):',
'year' => '从该年份 (或更早):',
-'sp-contributions-newbies' => 'åªæ˜¾ç¤ºæ–°åˆ›å»ºä¹‹ç”¨æˆ·çš„贡献',
-'sp-contributions-newbies-sub' => '新手',
-'sp-contributions-newbies-title' => '新手的用户贡献',
-'sp-contributions-blocklog' => 'å°ç¦æ—¥å¿—',
-'sp-contributions-deleted' => '已删除的用户贡献',
-'sp-contributions-logs' => '日志',
-'sp-contributions-talk' => '讨论',
-'sp-contributions-userrights' => '用户æƒé™ç®¡ç†',
-'sp-contributions-blocked-notice' => 'è¿™ä½ç”¨æˆ·çŽ°æ—¶æ­£åœ¨è¢«å°é”中。
+'sp-contributions-newbies' => 'åªæ˜¾ç¤ºæ–°åˆ›å»ºä¹‹ç”¨æˆ·çš„贡献',
+'sp-contributions-newbies-sub' => '新手',
+'sp-contributions-newbies-title' => '新手的用户贡献',
+'sp-contributions-blocklog' => 'å°ç¦æ—¥å¿—',
+'sp-contributions-deleted' => '已删除的用户贡献',
+'sp-contributions-uploads' => '上载',
+'sp-contributions-logs' => '日志',
+'sp-contributions-talk' => '讨论',
+'sp-contributions-userrights' => '用户æƒé™ç®¡ç†',
+'sp-contributions-blocked-notice' => 'è¿™ä½ç”¨æˆ·çŽ°æ—¶æ­£åœ¨è¢«å°é”中。
最近的å°é”日志项目在下é¢æ供以便å‚考:',
-'sp-contributions-search' => 'æœç´¢è´¡çŒ®è®°å½•',
-'sp-contributions-username' => 'IP地å€æˆ–用户å称:',
-'sp-contributions-submit' => 'æœç´¢',
+'sp-contributions-blocked-notice-anon' => '这个IP地å€çŽ°æ—¶æ­£åœ¨è¢«å°é”中。
+最近的å°é”日志项目在下é¢æ供以便å‚考:',
+'sp-contributions-search' => 'æœç´¢è´¡çŒ®è®°å½•',
+'sp-contributions-username' => 'IP地å€æˆ–用户å称:',
+'sp-contributions-toponly' => 'åªæ˜¾ç¤ºæœ€æ–°ä¿®è®¢ç‰ˆæœ¬çš„编辑',
+'sp-contributions-submit' => 'æœç´¢',
# What links here
'whatlinkshere' => '链入页é¢',
@@ -2247,7 +2308,6 @@ $1',
'ipb-edit-dropdown' => '编辑å°ç¦ç†ç”±',
'ipb-unblock-addr' => '解å°$1',
'ipb-unblock' => '解å°ç”¨æˆ·å或IP地å€',
-'ipb-blocklist-addr' => '$1的现有å°ç¦',
'ipb-blocklist' => '查看现有å°ç¦',
'ipb-blocklist-contribs' => '$1的贡献',
'unblockip' => '解å°ç”¨æˆ·',
@@ -2316,6 +2376,8 @@ $1已被å°ç¦ã€‚您是å¦æƒ³æ›´æ”¹å°ç¦è®¾ç½®ï¼Ÿ',
'cant-block-while-blocked' => '您无法在å°ç¦æœŸå†…å°ç¦å…¶ä»–用户。',
'cant-see-hidden-user' => '您å°è¯•å°ç¦çš„用户已被å°ç¦å¹¶éšè—。
由于您尚无éšè—用户的æƒé™ï¼Œæ‚¨æ— æ³•æŸ¥çœ‹æˆ–编辑此用户的å°ç¦ã€‚',
+'ipbblocked' => '您无法å°ç¦æˆ–解å°å…¶ä»–用户,因为您自己已被å°ç¦',
+'ipbnounblockself' => '您无法自我解除å°ç¦',
# Developer tools
'lockdb' => 'é”定数æ®åº“',
@@ -2351,6 +2413,19 @@ $1已被å°ç¦ã€‚您是å¦æƒ³æ›´æ”¹å°ç¦è®¾ç½®ï¼Ÿ',
'''警告ï¼'''
对一个ç»å¸¸è¢«è®¿é—®çš„页é¢è€Œè¨€è¿™å¯èƒ½æ˜¯ä¸€ä¸ªé‡å¤§ä¸Žå”çªçš„更改;
请在行动å‰å…ˆäº†è§£å…¶æ‰€å¯èƒ½å¸¦æ¥çš„åŽæžœã€‚",
+'movepagetext-noredirectfixer' => "用下é¢çš„表å•æ¥é‡å‘½å一个页é¢ï¼Œå¹¶å°†å…¶ä¿®è®¢åŽ†å²åŒæ—¶ç§»åŠ¨åˆ°æ–°é¡µé¢ã€‚
+è€çš„页é¢å°†æˆä¸ºæ–°é¡µé¢çš„é‡å®šå‘页。
+请检查[[Special:DoubleRedirects|åŒé‡é‡å®šå‘]]或[[Special:BrokenRedirects|æŸåé‡å®šå‘]]链接。
+您应当负责确定所有链接ä¾ç„¶ä¼šé“¾åˆ°æŒ‡å®šçš„页é¢ã€‚
+
+注æ„如果新页é¢å·²ç»æœ‰å†…容的è¯ï¼Œé¡µé¢å°†'''ä¸ä¼š'''被移动,
+除éžæ–°é¡µé¢æ— å†…容或是é‡å®šå‘页,而且没有修订历å²ã€‚
+è¿™æ„味ç€æ‚¨å†å¿…è¦æ—¶å¯ä»¥åœ¨ç§»åŠ¨åˆ°æ–°é¡µé¢åŽå†ç§»å›žè€çš„页é¢ï¼Œ
+åŒæ—¶æ‚¨ä¹Ÿæ— æ³•è¦†ç›–现有页é¢ã€‚
+
+'''警告ï¼'''
+对一个ç»å¸¸è¢«è®¿é—®çš„页é¢è€Œè¨€è¿™å¯èƒ½æ˜¯ä¸€ä¸ªé‡å¤§ä¸Žå”çªçš„更改;
+请在行动å‰å…ˆç¡®å®šæ‚¨äº†è§£å…¶æ‰€å¯èƒ½å¸¦æ¥çš„åŽæžœã€‚",
'movepagetalktext' => "有关的讨论页将被自动与该页é¢ä¸€èµ·ç§»åŠ¨ï¼Œ'''除éž''':
*新页é¢å·²ç»æœ‰ä¸€ä¸ªåŒ…å«å†…容的讨论页,或者
*您ä¸å‹¾é€‰ä¸‹é¢çš„å¤é€‰æ¡†ã€‚
@@ -2406,6 +2481,7 @@ $1已被å°ç¦ã€‚您是å¦æƒ³æ›´æ”¹å°ç¦è®¾ç½®ï¼Ÿ',
'immobile-source-page' => '此页é¢ä¸èƒ½ç§»åŠ¨ã€‚',
'immobile-target-page' => '无法移动至该目标标题。',
'imagenocrossnamespace' => '无法将文件移动到éžæ–‡ä»¶å字空间',
+'nonfile-cannot-move-to-file' => '无法将éžæ–‡ä»¶ç§»åŠ¨åˆ°æ–‡ä»¶å字空间',
'imagetypemismatch' => '该新扩展å与其类型ä¸åŒ¹é…',
'imageinvalidfilename' => '目标文件å称无效',
'fix-double-redirects' => '更新所有指å‘原始标题的é‡å®šå‘',
@@ -2485,6 +2561,7 @@ $1已被å°ç¦ã€‚您是å¦æƒ³æ›´æ”¹å°ç¦è®¾ç½®ï¼Ÿ',
'importstart' => '页é¢å¯¼å…¥ä¸­â€¦â€¦',
'import-revision-count' => '$1个修订',
'importnopages' => '没有导入的页é¢ã€‚',
+'imported-log-entries' => '导入了$1项日志记录。',
'importfailed' => '导入失败:<nowiki>$1</nowiki>',
'importunknownsource' => '未知的æºå¯¼å…¥ç±»åž‹',
'importcantopen' => '无法打开导入文件',
@@ -2577,6 +2654,8 @@ $1已被å°ç¦ã€‚您是å¦æƒ³æ›´æ”¹å°ç¦è®¾ç½®ï¼Ÿ',
'tooltip-upload' => '开始上传',
'tooltip-rollback' => '“回退â€å•å‡»æ¢å¤ä¸Šä¸€ä½è´¡çŒ®è€…对此页é¢ä½œå‡ºçš„编辑',
'tooltip-undo' => '“撤销â€å¯ä»¥æ¢å¤è¯¥ç¼–辑并在预览模å¼ä¸‹æ‰“开编辑表å•ã€‚它å…许在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
+'tooltip-preferences-save' => 'ä¿å­˜è®¾å®š',
+'tooltip-summary' => '输入一个简短的摘è¦',
# Stylesheets
'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
@@ -2704,14 +2783,17 @@ $1',
'imagemaxsize' => "图åƒå¤§å°é™åˆ¶ï¼š<br />''(用于文件æ述页é¢ï¼‰''",
'thumbsize' => '缩略图大å°ï¼š',
'widthheightpage' => '$1×$2,$3页',
-'file-info' => '(文件大å°ï¼š$1,MIME类型:$2)',
-'file-info-size' => '($1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4)',
+'file-info' => '文件大å°ï¼š$1,MIME类型:$2',
+'file-info-size' => '$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4',
'file-nohires' => '<small>无更高分辨率å¯æ供。</small>',
-'svg-long-desc' => '(SVG文件,å义大å°ï¼š$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3)',
+'svg-long-desc' => 'SVG文件,å义大å°ï¼š$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3',
'show-big-image' => '完整分辨率',
'show-big-image-thumb' => '<small>这幅缩略图的分辨率:$1×$2åƒç´ </small>',
'file-info-gif-looped' => '循环',
'file-info-gif-frames' => '$1帧',
+'file-info-png-looped' => '循环',
+'file-info-png-repeat' => '已播放$1é',
+'file-info-png-frames' => '$1帧',
# Special:NewFiles
'newimages' => '新文件画廊',
@@ -2887,6 +2969,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'GPS区域å称',
'exif-gpsdatestamp' => 'GPS日期',
'exif-gpsdifferential' => 'GPS差动修正',
+'exif-objectname' => '简称',
# EXIF attributes
'exif-compression-1' => '未压缩',
@@ -3047,26 +3130,26 @@ Variants for Chinese language
'limitall' => '全部',
# E-mail address confirmation
-'confirmemail' => '确认邮箱地å€',
-'confirmemail_noemail' => '您还没有在您的[[Special:Preferences|å‚数设置]]中设定一个有效的电å­é‚®ä»¶åœ°å€ã€‚',
-'confirmemail_text' => '{{SITENAME}}è¦æ±‚您在使用邮件功能之å‰éªŒè¯æ‚¨çš„邮箱地å€ã€‚
+'confirmemail' => '确认邮箱地å€',
+'confirmemail_noemail' => '您还没有在您的[[Special:Preferences|å‚数设置]]中设定一个有效的电å­é‚®ä»¶åœ°å€ã€‚',
+'confirmemail_text' => '{{SITENAME}}è¦æ±‚您在使用邮件功能之å‰éªŒè¯æ‚¨çš„邮箱地å€ã€‚
点击以下按钮å¯å‘您的邮箱å‘é€ä¸€å°ç¡®è®¤é‚®ä»¶ã€‚该邮件包å«æœ‰ä¸€è¡Œä»£ç é“¾æŽ¥ï¼›
请在您的æµè§ˆå™¨ä¸­åŠ è½½æ­¤é“¾æŽ¥ä»¥ç¡®è®¤æ‚¨çš„邮箱地å€æ˜¯æœ‰æ•ˆçš„。',
-'confirmemail_pending' => '一个确认ç å·²ç»è¢«å‘é€åˆ°æ‚¨çš„邮箱,您å¯èƒ½éœ€è¦ç­‰å‡ åˆ†é’Ÿæ‰èƒ½æ”¶åˆ°ã€‚如果无法收到,请å†ç”³è¯·ä¸€ä¸ªæ–°çš„确认ç ã€‚',
-'confirmemail_send' => '邮件å‘é€ç¡®è®¤ä»£ç ',
-'confirmemail_sent' => '确认邮件已å‘é€ã€‚',
-'confirmemail_oncreate' => '一个确认代ç å·²ç»è¢«å‘é€åˆ°æ‚¨çš„邮箱。登录时无需使用该代ç ï¼Œ
+'confirmemail_pending' => '一个确认ç å·²ç»è¢«å‘é€åˆ°æ‚¨çš„邮箱,您å¯èƒ½éœ€è¦ç­‰å‡ åˆ†é’Ÿæ‰èƒ½æ”¶åˆ°ã€‚如果无法收到,请å†ç”³è¯·ä¸€ä¸ªæ–°çš„确认ç ã€‚',
+'confirmemail_send' => '邮件å‘é€ç¡®è®¤ä»£ç ',
+'confirmemail_sent' => '确认邮件已å‘é€ã€‚',
+'confirmemail_oncreate' => '一个确认代ç å·²ç»è¢«å‘é€åˆ°æ‚¨çš„邮箱。登录时无需使用该代ç ï¼Œ
但若è¦å¯ç”¨åœ¨æ­¤ç»´åŸºçš„电å­é‚®ä»¶ç›¸å…³åŠŸèƒ½ï¼Œåˆ™å¿…须先æ交此代ç ã€‚',
-'confirmemail_sendfailed' => '{{SITENAME}}ä¸èƒ½å‘é€ç¡®è®¤é‚®ä»¶ï¼Œè¯·æ£€æŸ¥æ‚¨çš„邮箱地å€æ˜¯å¦åŒ…å«æ— æ•ˆå­—符。
+'confirmemail_sendfailed' => '{{SITENAME}}ä¸èƒ½å‘é€ç¡®è®¤é‚®ä»¶ï¼Œè¯·æ£€æŸ¥æ‚¨çš„邮箱地å€æ˜¯å¦åŒ…å«æ— æ•ˆå­—符。
邮件å‘é€å™¨çš„返回信æ¯ï¼š$1',
-'confirmemail_invalid' => '无效的确认ç ï¼Œè¯¥ä»£ç å¯èƒ½å·²ç»è¿‡æœŸã€‚',
-'confirmemail_needlogin' => '您需è¦$1以确认您的邮箱地å€ã€‚',
-'confirmemail_success' => '您的邮箱已ç»è¢«ç¡®è®¤ã€‚您现在å¯ä»¥[[Special:UserLogin|登录]]并使用此网站了。',
-'confirmemail_loggedin' => '您的邮箱地å€çŽ°åœ¨å·²è¢«ç¡®è®¤ã€‚',
-'confirmemail_error' => '你的确认过程å‘生错误。',
-'confirmemail_subject' => '{{SITENAME}}邮箱地å€ç¡®è®¤',
-'confirmemail_body' => 'æ¥è‡ªIP地å€$1的用户(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}上创建了账户“$2â€ï¼Œå¹¶æ交了您
+'confirmemail_invalid' => '无效的确认ç ï¼Œè¯¥ä»£ç å¯èƒ½å·²ç»è¿‡æœŸã€‚',
+'confirmemail_needlogin' => '您需è¦$1以确认您的邮箱地å€ã€‚',
+'confirmemail_success' => '您的邮箱已ç»è¢«ç¡®è®¤ã€‚您现在å¯ä»¥[[Special:UserLogin|登录]]并使用此网站了。',
+'confirmemail_loggedin' => '您的邮箱地å€çŽ°åœ¨å·²è¢«ç¡®è®¤ã€‚',
+'confirmemail_error' => '你的确认过程å‘生错误。',
+'confirmemail_subject' => '{{SITENAME}}邮箱地å€ç¡®è®¤',
+'confirmemail_body' => 'æ¥è‡ªIP地å€$1的用户(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}上创建了账户“$2â€ï¼Œå¹¶æ交了您
的电å­é‚®ç®±åœ°å€ã€‚
请确认这个账户是属于您的,并åŒæ—¶æ¿€æ´»åœ¨{{SITENAME}}上的电å­é‚®ä»¶åŠŸèƒ½ã€‚请在æµ
@@ -3079,8 +3162,33 @@ $3
$5
确认ç ä¼šåœ¨$4过期。',
-'confirmemail_invalidated' => '电邮地å€ç¡®è®¤å·²å–消',
-'invalidateemail' => 'å–消电邮确认',
+'confirmemail_body_changed' => '拥有IP地å€$1的用户(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}更改了账户“$2â€çš„电å­é‚®ç®±åœ°å€ã€‚
+
+请确认这个账户是属于您的,并åŒæ—¶é‡æ–°æ¿€æ´»åœ¨{{SITENAME}}上的电å­é‚®ä»¶åŠŸèƒ½ã€‚请
+在æµè§ˆå™¨ä¸­æ‰“开下é¢çš„链接:
+
+$3
+
+如果这个账户*ä¸æ˜¯*属于您的,请打开下é¢çš„链接去å–消电å­é‚®ä»¶ç¡®è®¤ï¼š
+
+$5
+
+确认ç ä¼šåœ¨$4过期。',
+'confirmemail_body_set' => '拥有IP地å€$1的用户(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}将账户“$2â€çš„电å­é‚®ç®±åœ°å€è®¾ç½®
+到了这个电å­é‚®ä»¶åœ°å€ã€‚
+
+请确认这个账户是属于您的,并åŒæ—¶é‡æ–°æ¿€æ´»åœ¨{{SITENAME}}上的电å­é‚®ä»¶åŠŸèƒ½ã€‚请
+在æµè§ˆå™¨ä¸­æ‰“开下é¢çš„链接:
+
+$3
+
+如果这个账户*ä¸æ˜¯*属于您的,请打开下é¢çš„链接去å–消电å­é‚®ä»¶ç¡®è®¤ï¼š
+
+$5
+
+确认ç ä¼šåœ¨$4过期。',
+'confirmemail_invalidated' => '电邮地å€ç¡®è®¤å·²å–消',
+'invalidateemail' => 'å–消电邮确认',
# Scary transclusion
'scarytranscludedisabled' => '[跨网站的编ç è½¬æ¢ä¸å¯ç”¨]',
@@ -3125,6 +3233,7 @@ $1',
'table_pager_first' => '第一页',
'table_pager_last' => '末一页',
'table_pager_limit' => 'æ¯é¡µæ˜¾ç¤º$1项',
+'table_pager_limit_label' => 'æ¯é¡µé¡¹ç›®æ•°ï¼š',
'table_pager_limit_submit' => '到',
'table_pager_empty' => '没有结果',
@@ -3183,6 +3292,7 @@ $1',
'version-specialpages' => '特殊页é¢',
'version-parserhooks' => '解æžå™¨é’©',
'version-variables' => 'å˜é‡',
+'version-skins' => '皮肤',
'version-other' => '其他',
'version-mediahandlers' => '媒体处ç†å™¨',
'version-hooks' => 'é’©',
@@ -3194,6 +3304,13 @@ $1',
'version-hook-subscribedby' => 'ç½²å',
'version-version' => '(版本$1)',
'version-license' => '授æƒ',
+'version-poweredby-credits' => "本Wikiç”±'''[http://www.mediawiki.org/ MediaWiki]'''驱动,版æƒæ‰€æœ‰ © 2001-$1 $2。",
+'version-poweredby-others' => '其他',
+'version-license-info' => 'MediaWiki为自由软件;您å¯ä¾æ®è‡ªç”±è½¯ä»¶åŸºé‡‘会所å‘表的GNU通用公共授æƒæ¡æ¬¾è§„定,就本程åºå†ä¸ºå‘布与ï¼æˆ–修改;无论您ä¾æ®çš„是本授æƒçš„第二版或(您自行选择的)任一日åŽå‘行的版本。
+
+MediaWiki是基于使用目的而加以å‘布,然而ä¸è´Ÿä»»ä½•æ‹…ä¿è´£ä»»ï¼›äº¦æ— å¯¹é€‚售性或特定目的适用性所为的默示性担ä¿ã€‚详情请å‚ç…§GNU通用公共授æƒã€‚
+
+您应已收到附éšäºŽæœ¬ç¨‹åºçš„[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授æƒçš„副本];如果没有,请写信至自由软件基金会:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 在线阅读]。',
'version-software' => '已安装软件',
'version-software-product' => '产å“',
'version-software-version' => '版本',
@@ -3263,6 +3380,15 @@ $1',
'tags-edit' => '编辑',
'tags-hitcount' => '$1次更改',
+# Special:ComparePages
+'comparepages' => '比较页é¢',
+'compare-selector' => '比较页é¢çš„修订',
+'compare-page1' => '第1页',
+'compare-page2' => '第2页',
+'compare-rev1' => '修订版本1',
+'compare-rev2' => '修订版本2',
+'compare-submit' => '比较',
+
# Database error messages
'dberr-header' => '本wiki出现了问题',
'dberr-problems' => '抱歉ï¼
@@ -3280,8 +3406,13 @@ $1',
'htmlform-float-invalid' => '您指定的值ä¸æ˜¯æ•°å­—。',
'htmlform-int-toolow' => '您指定的值å°äºŽæœ€å°å€¼$1',
'htmlform-int-toohigh' => '您指定的值大于最大值$1',
+'htmlform-required' => '本值必填',
'htmlform-submit' => 'æ交',
'htmlform-reset' => '撤销更改',
'htmlform-selectorother-other' => '其他',
+# SQLite database support
+'sqlite-has-fts' => '带全文æœç´¢çš„版本$1',
+'sqlite-no-fts' => 'ä¸å¸¦å…¨æ–‡æœç´¢çš„版本$1',
+
);
diff --git a/languages/messages/MessagesZh_hant.php b/languages/messages/MessagesZh_hant.php
index 1e3a3fb4..2e81b68a 100644
--- a/languages/messages/MessagesZh_hant.php
+++ b/languages/messages/MessagesZh_hant.php
@@ -8,8 +8,10 @@
* @file
*
* @author Alexsh
+ * @author Andrew971218
* @author Bencmq
* @author FireJackey
+ * @author Frankou
* @author Gaoxuewei
* @author Hakka
* @author Horacewai2
@@ -62,7 +64,7 @@ $namespaceAliases = array(
"用戶å°è©±" => NS_USER_TALK,
"用戶討論" => NS_USER_TALK,
# This has never worked so it's unlikely to annoy anyone if I disable it -- TS
- #"{{SITENAME}}_å°è©±" => NS_PROJECT_TALK
+ # "{{SITENAME}}_å°è©±" => NS_PROJECT_TALK
"圖åƒ" => NS_FILE,
"檔案" => NS_FILE,
"文件" => NS_FILE,
@@ -133,6 +135,7 @@ $specialPageAliases = array(
'Allpages' => array( '所有é é¢' ),
'Prefixindex' => array( 'å‰ç¶´ç´¢å¼•' ),
'Ipblocklist' => array( 'å°ç¦åˆ—表' ),
+ 'Unblock' => array( '解除å°ç¦' ),
'Specialpages' => array( '特殊é é¢' ),
'Contributions' => array( '用戶貢ç»' ),
'Emailuser' => array( '電郵用戶' ),
@@ -177,6 +180,8 @@ $specialPageAliases = array(
'DeletedContributions' => array( '已刪除的用戶貢ç»' ),
'Tags' => array( '標籤' ),
'Activeusers' => array( 'æ´»èºç”¨æˆ¶' ),
+ 'ComparePages' => array( 'é é¢æ¯”較' ),
+ 'Badtitle' => array( 'ä¸å¥½çš„標題' ),
);
$bookstoreList = array(
@@ -202,8 +207,7 @@ $messages = array(
'tog-editsection' => 'å…許通éŽé»žæ“Š[編輯]連çµç·¨è¼¯æ®µè½',
'tog-editsectiononrightclick' => 'å…許å³æ“Šæ¨™é¡Œç·¨è¼¯æ®µè½ (需è¦JavaScript)',
'tog-showtoc' => '顯示目錄 (é‡å°ä¸€é è¶…éŽ3個標題的é é¢ï¼‰',
-'tog-rememberpassword' => '在這部電腦上記ä½æˆ‘的密碼',
-'tog-editwidth' => '加寬編輯欄ä½åˆ°æ•´å€‹èž¢å…‰å¹•',
+'tog-rememberpassword' => '在這個ç€è¦½å™¨ä¸Šè¨˜ä½æˆ‘的登入資訊(å¯ç¶­æŒ $1 {{PLURAL:$1|天|天}})',
'tog-watchcreations' => '將我建立的é é¢æ·»åŠ åˆ°æˆ‘的監視列表中',
'tog-watchdefault' => '將我更改的é é¢æ·»åŠ åˆ°æˆ‘的監視列表中',
'tog-watchmoves' => '將我移動的é é¢åŠ å…¥æˆ‘的監視列表',
@@ -349,31 +353,21 @@ $messages = array(
'faqpage' => 'Project:常見å•é¡Œè§£ç­”',
# Vector skin
-'vector-action-addsection' => '加入主題',
-'vector-action-delete' => '刪除',
-'vector-action-move' => '移動',
-'vector-action-protect' => 'ä¿è­·',
-'vector-action-undelete' => 'æ¢å¾©è¢«åˆªé é¢',
-'vector-action-unprotect' => '解除ä¿è­·',
-'vector-namespace-category' => '分類',
-'vector-namespace-help' => '幫助é é¢',
-'vector-namespace-image' => '檔案',
-'vector-namespace-main' => 'é é¢',
-'vector-namespace-media' => '媒體é é¢',
-'vector-namespace-mediawiki' => '訊æ¯',
-'vector-namespace-project' => '計劃é é¢',
-'vector-namespace-special' => '特殊é é¢',
-'vector-namespace-talk' => '討論',
-'vector-namespace-template' => '模æ¿',
-'vector-namespace-user' => '用戶é é¢',
-'vector-view-create' => '建立',
-'vector-view-edit' => '編輯',
-'vector-view-history' => '檢視歷å²',
-'vector-view-view' => '閱讀',
-'vector-view-viewsource' => '檢視原始碼',
-'actions' => '動作',
-'namespaces' => 'å字空間',
-'variants' => '變æ›',
+'vector-action-addsection' => '加入主題',
+'vector-action-delete' => '刪除',
+'vector-action-move' => '移動',
+'vector-action-protect' => 'ä¿è­·',
+'vector-action-undelete' => 'æ¢å¾©è¢«åˆªé é¢',
+'vector-action-unprotect' => '解除ä¿è­·',
+'vector-simplesearch-preference' => '啟用加強æœå°‹å»ºè­°ï¼ˆåƒ…é™ Vector 外觀)',
+'vector-view-create' => '建立',
+'vector-view-edit' => '編輯',
+'vector-view-history' => '檢視歷å²',
+'vector-view-view' => '閱讀',
+'vector-view-viewsource' => '檢視原始碼',
+'actions' => '動作',
+'namespaces' => 'å字空間',
+'variants' => '變æ›',
'errorpagetitle' => '錯誤',
'returnto' => '返回到$1。',
@@ -434,6 +428,9 @@ $messages = array(
在嘗試訪å•é€™å€‹é é¢ä¹‹å‰è«‹å†ç¨ç­‰ä¸€æœƒã€‚
$1',
+'pool-timeout' => '等待鎖死時超時',
+'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}}',
@@ -595,7 +592,8 @@ $2',
'yourname' => '您的使用者å稱:',
'yourpassword' => '您的密碼:',
'yourpasswordagain' => 'å†æ¬¡è¼¸å…¥å¯†ç¢¼:',
-'remembermypassword' => '下次登入記ä½å¯†ç¢¼ã€‚',
+'remembermypassword' => '在這個ç€è¦½å™¨ä¸Šè¨˜ä½æˆ‘的登入資訊(å¯ç¶­æŒ $1 {{PLURAL:$1|天|天}})',
+'securelogin-stick-https' => '登入後繼續以HTTPS連接',
'yourdomainname' => '您的網域:',
'externaldberror' => '這å¯èƒ½æ˜¯ç”±æ–¼é©—證資料庫錯誤或您被ç¦æ­¢æ›´æ–°æ‚¨çš„外部賬號。',
'login' => '登入',
@@ -612,6 +610,7 @@ $2',
'gotaccount' => '已經æ“有帳號?$1。',
'gotaccountlink' => '登入',
'createaccountmail' => '通éŽé›»éƒµ',
+'createaccountreason' => 'ç†ç”±ï¼š',
'badretype' => '您所輸入的密碼並ä¸ç›¸åŒã€‚',
'userexists' => '您所輸入的用戶å稱已經存在,請å¦é¸ä¸€å€‹å稱。',
'loginerror' => '登入錯誤',
@@ -631,6 +630,7 @@ $2',
'wrongpasswordempty' => '沒有輸入密碼ï¼è«‹é‡è©¦ã€‚',
'passwordtooshort' => '您的密碼ä¸èƒ½å°‘æ–¼$1個字元。',
'password-name-match' => '您的密碼必須跟您的用戶åä¸ç›¸åŒã€‚',
+'password-login-forbidden' => '這個用戶å稱åŠå¯†ç¢¼çš„使用是被ç¦æ­¢çš„。',
'mailmypassword' => '將新密碼寄給我',
'passwordremindertitle' => '{{SITENAME}}的新臨時密碼',
'passwordremindertext' => '有人(å¯èƒ½æ˜¯æ‚¨ï¼Œä¾†è‡ªIPä½å€$1)已請求{{SITENAME}}的新密碼 ($4)。
@@ -667,6 +667,9 @@ $2',
'loginlanguagelabel' => '語言: $1',
'suspicious-userlogout' => '您登出的è¦æ±‚已經被拒絕,因為它å¯èƒ½æ˜¯ç”±å·²æ壞的ç€è¦½å™¨æˆ–者快å–代ç†å‚³é€ã€‚',
+# E-mail sending
+'php-mail-error-unknown' => '在 PHP çš„ mail() åƒæ•¸ä¸­çš„未知錯誤',
+
# Password reset dialog
'resetpass' => '更改密碼',
'resetpass_announce' => '您是é€éŽä¸€å€‹è‡¨æ™‚的發é€åˆ°éƒµä»¶ä¸­çš„代碼登入的。è¦å®Œæˆç™»å…¥ï¼Œæ‚¨å¿…須在這裡設定一個新密碼:',
@@ -718,9 +721,10 @@ $2',
'showdiff' => '顯示差異',
'anoneditwarning' => "'''警告:'''您沒有登入。
您的IPä½å€å°‡è¨˜éŒ„在此é çš„編輯歷å²ä¸­ã€‚",
+'anonpreviewwarning' => "''您沒有登入。ä¿å­˜é é¢å°‡æœƒæŠŠæ‚¨çš„IPä½å€è¨˜éŒ„在此é çš„編輯歷å²ä¸­ã€‚''",
'missingsummary' => "'''æ示:''' 您沒有æ供一個編輯摘è¦ã€‚如果您å†æ¬¡å–®æ“Šã€Œ{{int:savearticle}}ã€ï¼Œæ‚¨çš„編輯將ä¸å¸¶ç·¨è¼¯æ‘˜è¦å„²å­˜ã€‚",
'missingcommenttext' => '請在下é¢è¼¸å…¥è©•è«–。',
-'missingcommentheader' => "'''æ示:''' 您沒有為此評論æ供一個標題。如果您å†æ¬¡å–®æ“Šå„²å­˜ï¼Œæ‚¨çš„編輯將ä¸å¸¶æ¨™é¡Œå„²å­˜ã€‚",
+'missingcommentheader' => "'''æ示:''' 您沒有為此評論æ供一個標題。如果您å†æ¬¡å–®æ“Šã€Œ{{int:savearticle}}ã€ï¼Œæ‚¨çš„編輯將ä¸å¸¶æ¨™é¡Œå„²å­˜ã€‚",
'summary-preview' => '摘è¦é è¦½:',
'subject-preview' => '主題/標題é è¦½:',
'blockedtitle' => '用戶被查å°',
@@ -790,7 +794,11 @@ $2',
'''還沒有儲存﹗'''",
'userjspreview' => "'''記ä½æ‚¨åªæ˜¯åœ¨æ¸¬è©¦ï¼é è¦½æ‚¨çš„個人 JavaScript。'''
'''還沒有儲存﹗'''",
-'userinvalidcssjstitle' => "'''警告:''' ä¸å­˜åœ¨é¢æ¿\"\$1\"。注æ„自訂的 .css å’Œ .js é è¦ä½¿ç”¨å°å¯«æ¨™é¡Œï¼Œä¾‹å¦‚,{{ns:user}}:Foo/monobook.css ä¸åŒæ–¼ {{ns:user}}:Foo/Monobook.css。",
+'sitecsspreview' => "'''記ä½ä½ ç¾åœ¨åªæ˜¯é è¦½æ­¤ CSS。'''
+'''還沒有儲存ï¼'''",
+'sitejspreview' => "'''記ä½ä½ ç¾åœ¨åªæ˜¯é è¦½æ­¤ JavaScript 代碼。'''
+'''還沒有儲存ï¼'''",
+'userinvalidcssjstitle' => "'''警告:''' ä¸å­˜åœ¨é¢æ¿\"\$1\"。注æ„自訂的 .css å’Œ .js é è¦ä½¿ç”¨å°å¯«æ¨™é¡Œï¼Œä¾‹å¦‚,{{ns:user}}:Foo/vector.css ä¸åŒæ–¼ {{ns:user}}:Foo/Vector.css。",
'updated' => '(已更新)',
'note' => "'''注æ„:'''",
'previewnote' => "'''請記ä½é€™åªæ˜¯é è¦½ï¼Œå…§å®¹å°šæœªå„²å­˜ï¼'''",
@@ -829,7 +837,6 @@ $2',
如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£ä½ˆï¼Œè«‹ä¸è¦æ交。<br />
您åŒæ™‚也è¦å‘我們ä¿è­‰æ‚¨æ‰€æ交的內容是您自己所作,或得自一個ä¸å—版權ä¿è­·æˆ–相似自由的來æºï¼ˆåƒé–±$1的細節)。
'''ä¸è¦åœ¨æœªç²æŽˆæ¬Šçš„情æ³ä¸‹ç™¼è¡¨ï¼'''",
-'longpagewarning' => "'''警告''': 本é é•·åº¦é”$1KB;一些ç€è¦½å™¨å°‡ç„¡æ³•ç·¨è¼¯é•·éŽ32KBé é¢ã€‚請考慮將本文切割æˆå¹¾å€‹å°æ®µè½ã€‚",
'longpageerror' => "'''錯誤: 您所æ交的文字長度有$1KB,這大於$2KB的最大值。'''該文本ä¸èƒ½è¢«å„²å­˜ã€‚",
'readonlywarning' => "'''警告: 資料庫被鎖定以進行維護,所以您目å‰å°‡ç„¡æ³•ä¿å­˜æ‚¨çš„修改。'''您或許希望先將本段文字複製並ä¿å­˜åˆ°æ–‡å­—文件,然後等一會兒å†ä¿®æ”¹ã€‚
@@ -931,7 +938,7 @@ $2',
嘗試[[Special:Search|æœç´¢æœ¬ç«™]]ç²å¾—相關的新建é é¢ã€‚',
# Revision deletion
-'rev-deleted-comment' => '(註釋已除)',
+'rev-deleted-comment' => '(編輯摘è¦å·²é™¤ï¼‰',
'rev-deleted-user' => '(用戶å已移除)',
'rev-deleted-event' => '(日誌已除)',
'rev-deleted-user-contribs' => '[用戶å或IP地å€å·²ç§»é™¤ - 從貢ç»ä¸­éš±è—編輯]',
@@ -1004,6 +1011,8 @@ $1",
'logdelete-failure' => "'''事件的å¯è¦‹æ€§ç„¡æ³•è¨­å®šï¼š'''
$1",
'revdel-restore' => '更改å¯è¦‹æ€§',
+'revdel-restore-deleted' => '已刪除的修訂版本',
+'revdel-restore-visible' => 'å¯è¦‹çš„修訂版本',
'pagehist' => 'é é¢æ­·å²',
'deletedhist' => '已刪除之歷å²',
'revdelete-content' => '內容',
@@ -1067,11 +1076,13 @@ $1",
# Diffs
'history-title' => '「$1ã€çš„修訂歷å²',
'difference' => '(修訂版本間的差異)',
+'difference-multipage' => '(é é¢é–“的差異)',
'lineno' => '第$1行:',
'compareselectedversions' => '比較é¸å®šçš„修訂版本',
'showhideselectedversions' => '顯示ï¼éš±è—é¸å®šçš„修訂版本',
'editundo' => '撤銷',
-'diff-multi' => '($1個中途的修訂版本沒有顯示)',
+'diff-multi' => '(由{{PLURAL:$2|1å用戶|$2å用戶}}作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}}未被顯示)',
+'diff-multi-manyusers' => '(由多於$2å用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示)',
# Search results
'searchresults' => 'æœå°‹çµæžœ',
@@ -1106,6 +1117,7 @@ $1",
'searchprofile-everything-tooltip' => 'æœå°‹å…¨éƒ¨ï¼ˆåŒ…括討論é é¢ï¼‰',
'searchprofile-advanced-tooltip' => '在自定å字空間中度æœå°‹',
'search-result-size' => '$1 ($2個字)',
+'search-result-category-size' => '$1ä½æˆå“¡ï¼ˆ$2個å­åˆ†é¡žï¼Œ$3個檔案)',
'search-result-score' => '相關度: $1%',
'search-redirect' => '(é‡å®šå‘ $1)',
'search-section' => 'ï¼ˆæ®µè½ $1)',
@@ -1180,6 +1192,7 @@ $1",
'contextlines' => 'æ¯é€£çµè¡Œæ•¸:',
'contextchars' => 'æ¯è¡Œå­—數:',
'stub-threshold' => '<a href="#" class="stub">短é é¢é€£çµ</a>æ ¼å¼é–€æª»å€¼ (ä½å…ƒçµ„):',
+'stub-threshold-disabled' => 'å·²åœç”¨',
'recentchangesdays' => '最近更改中的顯示日數:',
'recentchangesdays-max' => '最多 $1 {{PLURAL:$1|天|天}}',
'recentchangescount' => 'é è¨­é¡¯ç¤ºçš„編輯數:',
@@ -1213,6 +1226,7 @@ $1",
'prefs-files' => '檔案',
'prefs-custom-css' => '自定CSS',
'prefs-custom-js' => '自定JavaScript',
+'prefs-common-css-js' => '共用 CSS/JavaScript 於所有的外觀中:',
'prefs-reset-intro' => '您å¯ä»¥åˆ©ç”¨é€™å€‹é é¢åŽ»é‡è¨­æ‚¨çš„åƒæ•¸è¨­ç½®åˆ°ç¶²ç«™é è¨­å€¼ã€‚這個動作無法復原。',
'prefs-emailconfirm-label' => 'é›»å­éƒµä»¶ç¢ºèªï¼š',
'prefs-textboxsize' => '編輯框大å°',
@@ -1249,9 +1263,15 @@ $1",
'prefs-advancedrendering' => '進階é¸é …',
'prefs-advancedsearchoptions' => '進階é¸é …',
'prefs-advancedwatchlist' => '進階é¸é …',
-'prefs-display' => '顯示é¸é …',
+'prefs-displayrc' => '顯示é¸é …',
+'prefs-displaysearchoptions' => '顯示é¸é …',
+'prefs-displaywatchlist' => '顯示é¸é …',
'prefs-diffs' => '差異',
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'é›»å­éƒµä»¶åœ°å€æœ‰æ•ˆ',
+'email-address-validity-invalid' => 'è«‹æ供一個有效的電å­éƒµä»¶åœ°å€',
+
# User rights
'userrights' => '用戶權é™ç®¡ç†',
'userrights-lookup-user' => '管ç†ç”¨æˆ¶ç¾¤çµ„',
@@ -1335,6 +1355,7 @@ $1",
'right-hideuser' => 'å°éŽ–用戶å,å°å…¬çœ¾éš±è—',
'right-ipblock-exempt' => '繞éŽIPå°éŽ–ã€è‡ªå‹•å°éŽ–以åŠç¯„åœå°éŽ–',
'right-proxyunbannable' => '繞éŽProxy的自動å°éŽ–',
+'right-unblockself' => '自我解除å°éŽ–',
'right-protect' => '更改ä¿è­·ç­‰ç´šä»¥åŠç·¨è¼¯ä¿è­·é é¢',
'right-editprotected' => '編輯ä¿è­·é é¢ï¼ˆç„¡é€£éŽ–ä¿è­·ï¼‰',
'right-editinterface' => '編輯用戶界é¢',
@@ -1357,7 +1378,6 @@ $1",
'right-siteadmin' => '鎖定和解除鎖定資料庫',
'right-reset-passwords' => 'é‡è¨­å…¶ä»–用戶的密碼',
'right-override-export-depth' => '匯出å«æœ‰äº”層深度連çµé é¢ä¹‹é é¢',
-'right-versiondetail' => '顯示延伸軟件版本的資料',
'right-sendemail' => '發電å­éƒµä»¶çµ¦å…¶ä»–用戶',
# User rights log
@@ -1408,14 +1428,9 @@ $1",
'recentchanges-legend' => '最近更改é¸é …',
'recentchangestext' => '跟蹤這個wiki上的最新更改。',
'recentchanges-feed-description' => '追蹤此訂閱在 wiki 上的最近更改。',
-'recentchanges-label-legend' => '圖例: $1',
-'recentchanges-legend-newpage' => '$1 - æ–°é é¢',
'recentchanges-label-newpage' => '這次編輯建立了一個新é é¢',
-'recentchanges-legend-minor' => '$1 - å°ç·¨è¼¯',
'recentchanges-label-minor' => '這是一個å°ç·¨è¼¯',
-'recentchanges-legend-bot' => '$1 - 機器人編輯',
'recentchanges-label-bot' => '這次編輯是由機器人進行',
-'recentchanges-legend-unpatrolled' => '$1 - 未巡查éŽçš„編輯',
'recentchanges-label-unpatrolled' => '這次編輯尚未巡查éŽ',
'rcnote' => "以下是在$4 $5,最近 '''$2''' 天內的 '''$1''' 次最近更改記錄。",
'rcnotefrom' => "下é¢æ˜¯è‡ª'''$2'''(最多顯示'''$1'''):",
@@ -1463,6 +1478,9 @@ $1",
'upload_directory_missing' => '上傳目錄($1)éºå¤±ï¼Œä¸èƒ½ç”±ç¶²é ä¼ºæœå™¨å»ºç«‹ã€‚',
'upload_directory_read_only' => '上傳目錄($1)ä¸å­˜åœ¨æˆ–無寫權é™ã€‚',
'uploaderror' => '上載錯誤',
+'upload-recreate-warning' => "'''警告:一個相åŒå字的檔案曾經被刪除或者移動至別處。'''
+
+這個é é¢çš„刪除和移動日誌在這è£æ供以便åƒè€ƒï¼š",
'uploadtext' => "使用下é¢çš„表單來上傳檔案。
è¦æª¢è¦–或æœå°‹ä»¥å‰ä¸Šå‚³çš„檔案,å¯ä»¥é€²å…¥[[Special:FileList|檔案上傳清單]],(é‡æ–°ï¼‰ä¸Šå‚³ä¹Ÿå°‡åœ¨[[Special:Log/upload|上傳日誌]]中記錄,而刪除將在[[Special:Log/delete|刪除日誌]]中記錄。
@@ -1497,6 +1515,17 @@ $1",
'filetype-banned-type' => "'''\".\$1\"'''是一種ä¸å‡†è¨±çš„檔案類型。
容許的{{PLURAL:\$3|一種|多種}}檔案類型有\$2。",
'filetype-missing' => '該檔案å稱並沒有副檔å ï¼ˆåƒ ".jpg")。',
+'empty-file' => '您所æ交的檔案為空檔案。',
+'file-too-large' => '您所æ交的檔案éŽå¤§ã€‚',
+'filename-tooshort' => '檔案åéŽçŸ­ã€‚',
+'filetype-banned' => '此類檔案被ç¦æ­¢ã€‚',
+'verification-error' => '檔案未通éŽé©—證。',
+'hookaborted' => '您所嘗試的修改被擴展鈎æ¨æ£„。',
+'illegal-filename' => '檔案åéžæ³•ã€‚',
+'overwrite' => 'ä¸å…許覆蓋ç¾æœ‰æª”案。',
+'unknown-error' => '發生未知錯誤。',
+'tmp-create-error' => '無法建立臨時檔案。',
+'tmp-write-error' => '臨時檔案寫入發生錯誤。',
'large-file' => '建議檔案大å°ä¸èƒ½è¶…éŽ $1;本檔案大å°ç‚º $2。',
'largefileserver' => '這個檔案的大å°æ¯”伺æœå™¨é…ç½®å…許的大å°é‚„è¦å¤§ã€‚',
'emptyfile' => '您所上傳的檔案ä¸å­˜åœ¨ã€‚這å¯èƒ½æ˜¯ç”±æ–¼æª”案åéµå…¥éŒ¯èª¤ã€‚請檢查您是å¦çœŸçš„è¦ä¸Šå‚³æ­¤æª”案。',
@@ -1517,13 +1546,14 @@ $1",
如果{{GENDER:|ä½ |妳|ä½ }}ä»ç„¶æƒ³åŽ»ä¸Šè¼‰å®ƒçš„話,請返回並用一個新的å稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => '這個檔案是跟以下的{{PLURAL:$1|一|多}}個檔案é‡è¦†:',
'file-deleted-duplicate' => '一個相åŒå稱的檔案 ([[:$1]]) 在先å‰åˆªé™¤éŽã€‚您應該在é‡æ–°ä¸Šå‚³ä¹‹å‰æª¢æŸ¥ä¸€ä¸‹è©²æª”案之刪除紀錄。',
-'successfulupload' => '上傳æˆåŠŸ',
'uploadwarning' => '上載警告',
'uploadwarning-text' => '請修改以下的檔案æ述並é‡è©¦ã€‚',
'savefile' => 'ä¿å­˜æª”案',
'uploadedimage' => '已上載「[[$1]]ã€',
'overwroteimage' => '已經上傳「[[$1]]ã€çš„新版本',
'uploaddisabled' => '上傳己åœç”¨ã€‚',
+'copyuploaddisabled' => '通éŽç¶²å€ä¸Šå‚³åŠŸèƒ½æœªé–‹é€šã€‚',
+'uploadfromurl-queued' => '上傳已被列入隊列。',
'uploaddisabledtext' => '檔案上傳ä¸å¯ç”¨ã€‚',
'php-uploaddisabledtext' => 'PHP 檔案上載已經åœç”¨ã€‚請檢查 file_uploads 設定。',
'uploadscripted' => '該檔案包å«å¯èƒ½è¢«ç¶²è·¯ç€è¦½å™¨éŒ¯èª¤è§£é‡‹çš„ HTML 或腳本代碼。',
@@ -1543,6 +1573,14 @@ $1",
您應該è¦è€ƒæ…®ä¸€ä¸‹ç¹¼çºŒä¸Šå‚³ä¸€å€‹æª”案é é¢æ˜¯å¦åˆé©ã€‚
為方便起見,這一個檔案的刪除記錄已經在下é¢æä¾›:",
'filename-bad-prefix' => "您上傳的檔案å稱是以'''「$1ã€'''作為開頭,通常這種沒有å«æ„的檔案å稱是由數碼相機中自動編排。請在您的檔案中é‡æ–°é¸æ“‡ä¸€å€‹æ›´åŠ æœ‰æ„義的檔案å稱。",
+'upload-success-subj' => '上傳æˆåŠŸ',
+'upload-success-msg' => '您在[$2]的上传已ç»æˆåŠŸï¼Œå¯ä»¥åœ¨è¿™é‡Œæ‰¾åˆ°ï¼š[[:{{ns:file}}:$1]]',
+'upload-failure-subj' => '上傳å•é¡Œ',
+'upload-failure-msg' => '您在[$2]的上傳出ç¾äº†å•é¡Œï¼š
+
+$1',
+'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> 開頭。',
@@ -1603,6 +1641,7 @@ $1",
'listfiles_search_for' => '按檔案å稱æœç´¢:',
'imgfile' => '檔案',
'listfiles' => '檔案列表',
+'listfiles_thumb' => '縮圖',
'listfiles_date' => '日期',
'listfiles_name' => 'å稱',
'listfiles_user' => '用戶',
@@ -1717,8 +1756,8 @@ $1",
'statistics-edits' => '自從{{SITENAME}}設定的é é¢ç·¨è¼¯æ•¸',
'statistics-edits-average' => 'æ¯ä¸€é é¢çš„å¹³å‡ç·¨è¼¯æ•¸',
'statistics-views-total' => '檢視總數',
+'statistics-views-total-desc' => 'ä¸å­˜åœ¨é é¢å’Œç‰¹æ®Šé é¢çš„查看數未計入',
'statistics-views-peredit' => 'æ¯æ¬¡ç·¨è¼¯æª¢è¦–數',
-'statistics-jobqueue' => '[http://www.mediawiki.org/wiki/Manual:Job_queue 工作隊列]長度',
'statistics-users' => '已註冊[[Special:ListUsers|用戶]]',
'statistics-users-active' => 'æ´»èºç”¨æˆ¶',
'statistics-users-active-desc' => '在å‰$1天中æ“作éŽçš„用戶',
@@ -1735,8 +1774,8 @@ Template:消除歧義',
'disambiguations-text' => '以下的é é¢éƒ½æœ‰åˆ°<b>消å«ç³Šé </b>的連çµï¼Œä½†å®ƒå€‘應該是連到é©ç•¶çš„標題。<br />一個é é¢æœƒè¢«è¦–為消å«ç³Šé å¦‚果它是連自[[MediaWiki:Disambiguationspage]]。',
'doubleredirects' => 'é›™é‡é‡å®šå‘é é¢',
-'doubleredirectstext' => '這一é åˆ—出所有é‡å®šå‘é é¢é‡å®šå‘到å¦ä¸€å€‹é‡å®šå‘é çš„é é¢ã€‚æ¯ä¸€è¡Œéƒ½åŒ…å«åˆ°ç¬¬ä¸€å’Œç¬¬äºŒå€‹é‡å®šå‘é é¢çš„éˆæŽ¥ï¼Œä»¥åŠç¬¬äºŒå€‹é‡å®šå‘é é¢çš„目標,通常顯示的都會是"真正"的目標é é¢ï¼Œä¹Ÿå°±æ˜¯ç¬¬ä¸€å€‹é‡å®šå‘é é¢æ‡‰è©²æŒ‡å‘çš„é é¢ã€‚
-<s>已劃去</s>的為已經解決之項目。',
+'doubleredirectstext' => '這一é åˆ—出所有é‡å®šå‘é é¢é‡å®šå‘到å¦ä¸€å€‹é‡å®šå‘é çš„é é¢ã€‚æ¯ä¸€è¡Œéƒ½åŒ…å«åˆ°ç¬¬ä¸€å’Œç¬¬äºŒå€‹é‡å®šå‘é é¢çš„連çµï¼Œä»¥åŠç¬¬äºŒå€‹é‡å®šå‘é é¢çš„目標,通常顯示的都會是"真正"的目標é é¢ï¼Œä¹Ÿå°±æ˜¯ç¬¬ä¸€å€‹é‡å®šå‘é é¢æ‡‰è©²æŒ‡å‘çš„é é¢ã€‚
+<del>已劃去</del>的為已經解決之項目。',
'double-redirect-fixed-move' => '[[$1]]已經完æˆç§»å‹•ï¼Œå®ƒç¾åœ¨é‡æ–°å®šå‘到[[$2]]。',
'double-redirect-fixer' => 'é‡æ–°å®šå‘修正器',
@@ -1759,6 +1798,8 @@ Template:消除歧義',
'nmembers' => '$1個æˆå“¡',
'nrevisions' => '$1個修訂',
'nviews' => '$1次ç€è¦½',
+'nimagelinks' => '用於$1個é é¢ä¸­',
+'ntransclusions' => '用於$1個é é¢ä¸­',
'specialpage-empty' => '這個報告的çµæžœç‚ºç©ºã€‚',
'lonelypages' => '孤立é é¢',
'lonelypagestext' => '以下é é¢å°šæœªè¢«{{SITENAME}}中的其它é é¢é€£çµæˆ–被之包å«ã€‚',
@@ -1914,36 +1955,42 @@ Template:消除歧義',
'listgrouprights-removegroup-self-all' => '在自己的賬戶中移除所有群組',
# E-mail user
-'mailnologin' => '無電郵地å€',
-'mailnologintext' => '您必須先[[Special:UserLogin|登入]]
+'mailnologin' => '無電郵地å€',
+'mailnologintext' => '您必須先[[Special:UserLogin|登入]]
並在[[Special:Preferences|å好設定]]
中有一個有效的 e-mail 地å€æ‰å¯ä»¥é›»éƒµå…¶ä»–用戶。',
-'emailuser' => 'E-mail該用戶',
-'emailpage' => 'E-mail用戶',
-'emailpagetext' => '您å¯ä»¥ç”¨ä¸‹é¢çš„表格去寄一å°é›»éƒµçµ¦é€™ä½ç”¨æˆ¶ã€‚
+'emailuser' => 'E-mail該用戶',
+'emailpage' => 'E-mail用戶',
+'emailpagetext' => '您å¯ä»¥ç”¨ä¸‹é¢çš„表格去寄一å°é›»éƒµçµ¦é€™ä½ç”¨æˆ¶ã€‚
您在[[Special:Preferences|您åƒæ•¸è¨­ç½®]]中所輸入的e-mail地å€å°‡å‡ºç¾åœ¨éƒµä»¶ã€Œç™¼ä»¶äººã€ä¸€æ¬„中,這樣該用戶就å¯ä»¥å›žè¦†æ‚¨ã€‚',
-'usermailererror' => '目標郵件地å€è¿”回錯誤:',
-'defemailsubject' => '{{SITENAME}}é›»å­éƒµä»¶',
-'noemailtitle' => 'ç„¡e-mail地å€',
-'noemailtext' => '該用戶還沒有指定一個有效的e-mail地å€ã€‚',
-'nowikiemailtitle' => 'ä¸å®¹è¨±é›»å­éƒµä»¶',
-'nowikiemailtext' => '這ä½ç”¨æˆ¶é¸æ“‡ä¸æŽ¥æ”¶å…¶ä»–用戶的電å­éƒµä»¶ã€‚',
-'email-legend' => '發一å°é›»å­éƒµä»¶è‡³å¦ä¸€ä½{{SITENAME}}用戶',
-'emailfrom' => '發件人:',
-'emailto' => '收件人:',
-'emailsubject' => '主題:',
-'emailmessage' => '訊æ¯ï¼š',
-'emailsend' => '發é€',
-'emailccme' => '將我的消æ¯çš„副本發é€ä¸€ä»½åˆ°æˆ‘的電郵信箱。',
-'emailccsubject' => '將您的訊æ¯è¤‡è£½åˆ° $1: $2',
-'emailsent' => 'é›»å­éƒµä»¶å·²ç™¼é€',
-'emailsenttext' => '您的電å­éƒµä»¶å·²ç¶“發出。',
-'emailuserfooter' => '這å°é›»éƒµæ˜¯ç”±$1寄給$2經{{SITENAME}}的「電郵用戶ã€åŠŸèƒ½ç™¼å‡ºçš„。',
+'usermailererror' => '目標郵件地å€è¿”回錯誤:',
+'defemailsubject' => '{{SITENAME}}é›»å­éƒµä»¶',
+'usermaildisabled' => '用戶電郵已åœç”¨',
+'usermaildisabledtext' => '您ä¸å¯ä»¥ç™¼é€é›»éƒµåˆ°é€™å€‹wiki上的其他用戶',
+'noemailtitle' => 'ç„¡e-mail地å€',
+'noemailtext' => '該用戶還沒有指定一個有效的e-mail地å€ã€‚',
+'nowikiemailtitle' => 'ä¸å®¹è¨±é›»å­éƒµä»¶',
+'nowikiemailtext' => '這ä½ç”¨æˆ¶é¸æ“‡ä¸æŽ¥æ”¶å…¶ä»–用戶的電å­éƒµä»¶ã€‚',
+'email-legend' => '發一å°é›»å­éƒµä»¶è‡³å¦ä¸€ä½{{SITENAME}}用戶',
+'emailfrom' => '發件人:',
+'emailto' => '收件人:',
+'emailsubject' => '主題:',
+'emailmessage' => '訊æ¯ï¼š',
+'emailsend' => '發é€',
+'emailccme' => '將我的消æ¯çš„副本發é€ä¸€ä»½åˆ°æˆ‘的電郵信箱。',
+'emailccsubject' => '將您的訊æ¯è¤‡è£½åˆ° $1: $2',
+'emailsent' => 'é›»å­éƒµä»¶å·²ç™¼é€',
+'emailsenttext' => '您的電å­éƒµä»¶å·²ç¶“發出。',
+'emailuserfooter' => '這å°é›»éƒµæ˜¯ç”±$1寄給$2經{{SITENAME}}的「電郵用戶ã€åŠŸèƒ½ç™¼å‡ºçš„。',
+
+# User Messenger
+'usermessage-summary' => '給系統消æ¯ã€‚',
+'usermessage-editor' => '系統界é¢',
# Watchlist
'watchlist' => '監視列表',
'mywatchlist' => '我的監視列表',
-'watchlistfor' => "('''$1'''的監視列表)",
+'watchlistfor2' => '$1的監視列表 $2',
'nowatchlist' => '您的監視列表為空。',
'watchlistanontext' => '請$1以檢視或編輯您的監視列表。',
'watchnologin' => '未登入',
@@ -2059,7 +2106,10 @@ $UNWATCHURL
'revertpage-nouser' => 'æ¢å¾©ç”±ï¼ˆç§»é™¤äº†çš„用戶å)的編輯到[[User:$1|$1]]的最後一個修訂版本',
'rollback-success' => 'å·²æ¢å¾©$1的編輯;
更改回$2的最後修訂版本。',
-'sessionfailure' => '似乎您的登錄會話有å•é¡Œï¼›
+
+# Edit tokens
+'sessionfailure-title' => '登入資訊失敗',
+'sessionfailure' => '似乎您的登錄會話有å•é¡Œï¼›
為了防止會話劫æŒï¼Œé€™å€‹æ“作已經被å–消。
請返回先å‰çš„é é¢ï¼Œé‡æ–°è¼‰å…¥è©²é é¢ï¼Œç„¶å¾Œé‡è©¦ã€‚',
@@ -2186,19 +2236,23 @@ $1',
'month' => '從該月份 (或更早):',
'year' => '從該年份 (或更早):',
-'sp-contributions-newbies' => 'åªé¡¯ç¤ºæ–°å»ºç«‹ä¹‹ç”¨æˆ¶çš„è²¢ç»',
-'sp-contributions-newbies-sub' => '新手',
-'sp-contributions-newbies-title' => '新手的用戶貢ç»',
-'sp-contributions-blocklog' => 'å°ç¦è¨˜éŒ„',
-'sp-contributions-deleted' => '已刪除的用戶貢ç»',
-'sp-contributions-logs' => '日誌',
-'sp-contributions-talk' => 'å°è©±',
-'sp-contributions-userrights' => '用戶權é™ç®¡ç†',
-'sp-contributions-blocked-notice' => '這ä½ç”¨æˆ¶ç¾æ™‚正在被å°éŽ–中。
+'sp-contributions-newbies' => 'åªé¡¯ç¤ºæ–°å»ºç«‹ä¹‹ç”¨æˆ¶çš„è²¢ç»',
+'sp-contributions-newbies-sub' => '新手',
+'sp-contributions-newbies-title' => '新手的用戶貢ç»',
+'sp-contributions-blocklog' => 'å°ç¦è¨˜éŒ„',
+'sp-contributions-deleted' => '已刪除的用戶貢ç»',
+'sp-contributions-uploads' => '上載',
+'sp-contributions-logs' => '日誌',
+'sp-contributions-talk' => 'å°è©±',
+'sp-contributions-userrights' => '用戶權é™ç®¡ç†',
+'sp-contributions-blocked-notice' => '這ä½ç”¨æˆ¶ç¾æ™‚正在被å°éŽ–中。
+最近的å°éŽ–日誌項目在下é¢æ供以便åƒè€ƒï¼š',
+'sp-contributions-blocked-notice-anon' => '這個IP地å€ç¾æ™‚正在被å°éŽ–中。
最近的å°éŽ–日誌項目在下é¢æ供以便åƒè€ƒï¼š',
-'sp-contributions-search' => 'æœå°‹è²¢ç»è¨˜éŒ„',
-'sp-contributions-username' => 'IPä½å€æˆ–用戶å稱:',
-'sp-contributions-submit' => 'æœå°‹',
+'sp-contributions-search' => 'æœå°‹è²¢ç»è¨˜éŒ„',
+'sp-contributions-username' => 'IPä½å€æˆ–用戶å稱:',
+'sp-contributions-toponly' => 'åªé¡¯ç¤ºæœ€æ–°ä¿®è¨‚版本的編輯',
+'sp-contributions-submit' => 'æœå°‹',
# What links here
'whatlinkshere' => '連入é é¢',
@@ -2259,7 +2313,6 @@ $1',
'ipb-edit-dropdown' => '編輯查å°åŽŸå› ',
'ipb-unblock-addr' => '解å°$1',
'ipb-unblock' => '解除ç¦å°ç”¨æˆ¶å或IP地å€',
-'ipb-blocklist-addr' => '$1çš„ç¾æœ‰å°ç¦',
'ipb-blocklist' => '檢視ç¾æœ‰çš„å°ç¦',
'ipb-blocklist-contribs' => '$1çš„è²¢ç»',
'unblockip' => '解å°ç”¨æˆ¶',
@@ -2267,7 +2320,7 @@ $1',
'ipusubmit' => '移除這個å°éŽ–',
'unblocked' => '[[User:$1|$1]] çš„å°ç¦å·²ç¶“解除。',
'unblocked-id' => 'å°ç¦ $1 已經被移除',
-'ipblocklist' => '被å°IP地å€åˆ—表',
+'ipblocklist' => '被å°ç”¨æˆ¶åˆ—表',
'ipblocklist-legend' => 'æœå°‹ä¸€ä½å·²ç¶“被查å°çš„用戶',
'ipblocklist-username' => '用戶å稱或IP地å€:',
'ipblocklist-sh-userblocks' => '$1賬戶å°éŽ–',
@@ -2328,6 +2381,8 @@ $1已經被å°éŽ–。您是å¦æƒ³æ›´æ”¹é€™å€‹è¨­å®šï¼Ÿ',
'cant-block-while-blocked' => '當您被å°éŽ–時ä¸å¯ä»¥å°éŽ–其他用戶。',
'cant-see-hidden-user' => '您ç¾æ­£å˜—試å°éŽ–的用戶已經被å°éŽ–或隱è—。
您ç¾åœ¨æ²’有隱è—用戶的權é™ï¼Œæ‚¨ä¸å¯ä»¥æª¢è¦–或者編輯這ä½ç”¨æˆ¶çš„å°éŽ–。',
+'ipbblocked' => '您無法å°ç¦æˆ–解å°å…¶ä»–用戶,因為您自己已被å°ç¦',
+'ipbnounblockself' => '您ä¸å®¹è¨±è‡ªæˆ‘解除å°ç¦',
# Developer tools
'lockdb' => 'ç¦æ­¢æ›´æ”¹è³‡æ–™åº«',
@@ -2366,6 +2421,19 @@ $1已經被å°éŽ–。您是å¦æƒ³æ›´æ”¹é€™å€‹è¨­å®šï¼Ÿ',
'''警告ï¼'''
å°ä¸€å€‹ç¶“常被訪å•çš„é é¢è€Œè¨€é€™å¯èƒ½æ˜¯ä¸€å€‹é‡å¤§èˆ‡å”çªçš„更改;
請在行動å‰å…ˆäº†è§£å…¶æ‰€å¯èƒ½å¸¶ä¾†çš„後果。",
+'movepagetext-noredirectfixer' => "用下é¢çš„表單來é‡å‘½å一個é é¢ï¼Œä¸¦å°‡å…¶ä¿®è¨‚æ­·å²åŒæ™‚移動到新é é¢ã€‚
+è€çš„é é¢å°‡æˆç‚ºæ–°é é¢çš„é‡å®šå‘é ã€‚
+請檢查[[Special:DoubleRedirects|é›™é‡é‡å®šå‘]]或[[Special:BrokenRedirects|æ壞é‡å®šå‘]]連çµã€‚
+您應當負責確定所有連çµä¾ç„¶æœƒé€£åˆ°æŒ‡å®šçš„é é¢ã€‚
+
+注æ„如果新é é¢å·²ç¶“有內容的話,é é¢å°‡'''ä¸æœƒ'''被移動,
+除éžæ–°é é¢ç„¡å…§å®¹æˆ–是é‡å®šå‘é ï¼Œè€Œä¸”沒有修訂歷å²ã€‚
+這æ„味著您å†å¿…è¦æ™‚å¯ä»¥åœ¨ç§»å‹•åˆ°æ–°é é¢å¾Œå†ç§»å›žè€çš„é é¢ï¼Œ
+åŒæ™‚您也無法覆蓋ç¾æœ‰é é¢ã€‚
+
+'''警告ï¼'''
+å°ä¸€å€‹ç¶“常被訪å•çš„é é¢è€Œè¨€é€™å¯èƒ½æ˜¯ä¸€å€‹é‡å¤§èˆ‡å”çªçš„更改;
+請在行動å‰å…ˆç¢ºå®šæ‚¨äº†è§£å…¶æ‰€å¯èƒ½å¸¶ä¾†çš„後果。",
'movepagetalktext' => "有關的å°è©±é ï¼ˆå¦‚果有的話)將被自動與該é é¢ä¸€èµ·ç§»å‹•ï¼Œ'''除éž''':
*您將é é¢ç§»å‹•åˆ°ä¸åŒçš„å字空間;
*æ–°é é¢å·²ç¶“有一個包å«å…§å®¹çš„å°è©±é ï¼Œæˆ–者
@@ -2423,6 +2491,7 @@ $1已經被å°éŽ–。您是å¦æƒ³æ›´æ”¹é€™å€‹è¨­å®šï¼Ÿ',
'immobile-source-page' => '這個é é¢ä¸èƒ½ç§»å‹•ã€‚',
'immobile-target-page' => '無法移動至目標標題中。',
'imagenocrossnamespace' => 'ä¸å¯ä»¥ç§»å‹•æª”案到éžæª”案å字空間',
+'nonfile-cannot-move-to-file' => 'ä¸å¯ä»¥ç§»å‹•éžæª”案到檔案å字空間',
'imagetypemismatch' => '該新副檔åä¸åŒ¹é…它的類型',
'imageinvalidfilename' => '目標檔案å稱是無效的',
'fix-double-redirects' => '更新指到原先標題的任何é‡æ–°å®šå‘',
@@ -2499,11 +2568,12 @@ $1已經被å°éŽ–。您是å¦æƒ³æ›´æ”¹é€™å€‹è¨­å®šï¼Ÿ',
'import-interwiki-namespace' => '目的å字空間:',
'import-upload-filename' => '檔案å稱:',
'import-comment' => '註解:',
-'importtext' => '請使用[[Special:Export|匯出功能]]å¾žä¾†æº wiki 匯出檔案,
-儲存到您的ç£ç‰‡ä¸¦ä¸Šå‚³åˆ°é€™è£¡ã€‚',
+'importtext' => '請使用[[Special:Export|匯出功能]]從來æºç¶­åŸºåŒ¯å‡ºæª”案,
+儲存到您的電腦中並上傳到這裡。',
'importstart' => '正在匯入é é¢...',
'import-revision-count' => '$1個修訂',
'importnopages' => '沒有匯入的é é¢ã€‚',
+'imported-log-entries' => '匯入了$1項日誌記錄。',
'importfailed' => '匯入失敗: <nowiki>$1</nowiki>',
'importunknownsource' => '未知的æºåŒ¯å…¥é¡žåž‹',
'importcantopen' => '無法打開匯入檔案',
@@ -2596,6 +2666,8 @@ $1已經被å°éŽ–。您是å¦æƒ³æ›´æ”¹é€™å€‹è¨­å®šï¼Ÿ',
'tooltip-upload' => '開始上傳',
'tooltip-rollback' => '『å轉ã€å¯ä»¥ä¸€æŒ‰æ¢å¾©ä¸Šä¸€ä½è²¢ç»è€…å°é€™å€‹é é¢çš„編輯',
'tooltip-undo' => '『復原ã€å¯ä»¥åœ¨ç·¨è¼¯æ¨¡å¼ä¸Šé–‹å•Ÿç·¨è¼¯è¡¨æ ¼ä»¥ä¾¿å¾©åŽŸã€‚它容許在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
+'tooltip-preferences-save' => '儲存使用å好',
+'tooltip-summary' => '輸入一個簡短的摘è¦',
# Stylesheets
'common.css' => '/* 此處的 CSS 將應用於所有的é¢æ¿ */',
@@ -2722,14 +2794,17 @@ $1',
'imagemaxsize' => "å½±åƒå¤§å°é™åˆ¶:<br />''(用在檔案æè¿°é é¢ä¸­ï¼‰''",
'thumbsize' => '略圖大å°:',
'widthheightpage' => '$1×$2, $3é ',
-'file-info' => '(檔案大å°: $1, MIME é¡žåž‹: $2)',
-'file-info-size' => '($1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3 ,MIME類型:$4)',
+'file-info' => '檔案大å°: $1, MIME é¡žåž‹: $2',
+'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3,MIME類型:$4',
'file-nohires' => '<small>無更高解åƒåº¦å¯æ供。</small>',
-'svg-long-desc' => '(SVG檔案,表é¢å¤§å°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3)',
+'svg-long-desc' => 'SVG 檔案,表é¢å¤§å°ï¼š$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3',
'show-big-image' => '完整解åƒåº¦',
'show-big-image-thumb' => '<small>這幅縮圖的解åƒåº¦: $1 × $2 åƒç´ </small>',
'file-info-gif-looped' => '循環',
'file-info-gif-frames' => '$1å¹€',
+'file-info-png-looped' => '循環',
+'file-info-png-repeat' => '已播放$1次',
+'file-info-png-frames' => '$1å¹€',
# Special:NewFiles
'newimages' => '新建圖片畫廊',
@@ -2816,8 +2891,8 @@ Variants for Chinese language
'exif-colorspace' => 'é¡è‰²ç©ºé–“',
'exif-componentsconfiguration' => 'æ¯åˆ†é‡å«ç¾©',
'exif-compressedbitsperpixel' => '圖片壓縮模å¼',
-'exif-pixelydimension' => '有效圖片寬度',
-'exif-pixelxdimension' => '有效圖片高度',
+'exif-pixelydimension' => '圖片寬度',
+'exif-pixelxdimension' => '圖片高度',
'exif-makernote' => '製造商註釋',
'exif-usercomment' => '用戶註釋',
'exif-relatedsoundfile' => '相關的音頻檔案',
@@ -2833,9 +2908,9 @@ Variants for Chinese language
'exif-spectralsensitivity' => 'æ„Ÿå…‰',
'exif-isospeedratings' => 'ISO 速率',
'exif-oecf' => '光電轉æ›å› å­',
-'exif-shutterspeedvalue' => '快門速度',
-'exif-aperturevalue' => '光圈',
-'exif-brightnessvalue' => '亮度',
+'exif-shutterspeedvalue' => 'APEX快門速度',
+'exif-aperturevalue' => 'APEX光圈',
+'exif-brightnessvalue' => 'APEX亮度',
'exif-exposurebiasvalue' => 'æ›å…‰è£œå„Ÿ',
'exif-maxaperturevalue' => '最大陸地光圈',
'exif-subjectdistance' => '物è·',
@@ -2899,6 +2974,7 @@ Variants for Chinese language
'exif-gpsareainformation' => 'GPS å€åŸŸå稱',
'exif-gpsdatestamp' => 'GPS 日期',
'exif-gpsdifferential' => 'GPS 差動修正',
+'exif-objectname' => '簡稱',
# EXIF attributes
'exif-compression-1' => '未壓縮',
@@ -2980,6 +3056,8 @@ Variants for Chinese language
'exif-sensingmethod-7' => '三線傳感器',
'exif-sensingmethod-8' => '連續彩色線性傳感器',
+'exif-filesource-3' => '數碼相機',
+
'exif-scenetype-1' => '直接照åƒåœ–片',
'exif-customrendered-0' => '標準處ç†',
@@ -3056,26 +3134,26 @@ Variants for Chinese language
'limitall' => '全部',
# E-mail address confirmation
-'confirmemail' => '確èªéƒµç®±ä½å€',
-'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|用戶設定]]裡é¢è¼¸å…¥ä¸€å€‹æœ‰æ•ˆçš„ email ä½å€ã€‚',
-'confirmemail_text' => '{{SITENAME}}è¦æ±‚您在使用郵件功能之å‰é©—證您的郵箱ä½å€ã€‚
+'confirmemail' => '確èªéƒµç®±ä½å€',
+'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|用戶設定]]裡é¢è¼¸å…¥ä¸€å€‹æœ‰æ•ˆçš„ email ä½å€ã€‚',
+'confirmemail_text' => '{{SITENAME}}è¦æ±‚您在使用郵件功能之å‰é©—證您的郵箱ä½å€ã€‚
點擊以下按鈕å¯å‘您的郵箱發é€ä¸€å°ç¢ºèªéƒµä»¶ã€‚該郵件包å«æœ‰ä¸€è¡Œä»£ç¢¼é€£çµï¼›
請在您的ç€è¦½å™¨ä¸­åŠ è¼‰æ­¤é€£çµä»¥ç¢ºèªæ‚¨çš„郵箱ä½å€æ˜¯æœ‰æ•ˆçš„。',
-'confirmemail_pending' => '一個確èªç¢¼å·²ç¶“被發é€åˆ°æ‚¨çš„郵箱,您å¯èƒ½éœ€è¦ç­‰å¹¾åˆ†é˜æ‰èƒ½æ”¶åˆ°ã€‚如果無法收到,請å†ç”³è«‹ä¸€å€‹æ–°çš„確èªç¢¼ã€‚',
-'confirmemail_send' => '郵發確èªä»£ç¢¼',
-'confirmemail_sent' => '確èªéƒµä»¶å·²ç™¼é€ã€‚',
-'confirmemail_oncreate' => '一個確èªä»£ç¢¼å·²ç¶“被發é€åˆ°æ‚¨çš„郵箱。該代碼並ä¸è¦æ±‚您進行登入,
+'confirmemail_pending' => '一個確èªç¢¼å·²ç¶“被發é€åˆ°æ‚¨çš„郵箱,您å¯èƒ½éœ€è¦ç­‰å¹¾åˆ†é˜æ‰èƒ½æ”¶åˆ°ã€‚如果無法收到,請å†ç”³è«‹ä¸€å€‹æ–°çš„確èªç¢¼ã€‚',
+'confirmemail_send' => '郵發確èªä»£ç¢¼',
+'confirmemail_sent' => '確èªéƒµä»¶å·²ç™¼é€ã€‚',
+'confirmemail_oncreate' => '一個確èªä»£ç¢¼å·²ç¶“被發é€åˆ°æ‚¨çš„郵箱。該代碼並ä¸è¦æ±‚您進行登入,
但若您è¦å•Ÿç”¨åœ¨æ­¤ wiki 上的任何基於電å­éƒµä»¶çš„功能,您必須先æ交此代碼。',
-'confirmemail_sendfailed' => '{{SITENAME}}無法發é€ç¢ºèªéƒµä»¶ï¼Œè«‹æª¢æŸ¥éƒµç®±ä½å€æ˜¯å¦åŒ…å«éžæ³•å­—元。
+'confirmemail_sendfailed' => '{{SITENAME}}無法發é€ç¢ºèªéƒµä»¶ï¼Œè«‹æª¢æŸ¥éƒµç®±ä½å€æ˜¯å¦åŒ…å«éžæ³•å­—元。
郵件傳é€å“¡å›žæ‡‰: $1',
-'confirmemail_invalid' => '無效的確èªç¢¼ï¼Œè©²ä»£ç¢¼å¯èƒ½å·²ç¶“éŽæœŸã€‚',
-'confirmemail_needlogin' => '您需è¦$1以確èªæ‚¨çš„郵箱ä½å€ã€‚',
-'confirmemail_success' => '您的郵箱已經被確èªã€‚您ç¾åœ¨å¯ä»¥[[Special:UserLogin|登錄]]並使用此網站了。',
-'confirmemail_loggedin' => '您的郵箱ä½å€ç¾ä¸‹å·²è¢«ç¢ºèªã€‚',
-'confirmemail_error' => '{{GENDER:|ä½ |妳|ä½ }}的確èªéŽç¨‹ç™¼ç”ŸéŒ¯èª¤ã€‚',
-'confirmemail_subject' => '{{SITENAME}}郵箱ä½å€ç¢ºèª',
-'confirmemail_body' => 'æ“有IPä½å€$1的用戶(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}創建了賬戶"$2",並æ交了您的電å­éƒµç®±ä½å€ã€‚
+'confirmemail_invalid' => '無效的確èªç¢¼ï¼Œè©²ä»£ç¢¼å¯èƒ½å·²ç¶“éŽæœŸã€‚',
+'confirmemail_needlogin' => '您需è¦$1以確èªæ‚¨çš„郵箱ä½å€ã€‚',
+'confirmemail_success' => '您的郵箱已經被確èªã€‚您ç¾åœ¨å¯ä»¥[[Special:UserLogin|登錄]]並使用此網站了。',
+'confirmemail_loggedin' => '您的郵箱ä½å€ç¾ä¸‹å·²è¢«ç¢ºèªã€‚',
+'confirmemail_error' => '{{GENDER:|ä½ |妳|ä½ }}的確èªéŽç¨‹ç™¼ç”ŸéŒ¯èª¤ã€‚',
+'confirmemail_subject' => '{{SITENAME}}郵箱ä½å€ç¢ºèª',
+'confirmemail_body' => 'æ“有IPä½å€$1的用戶(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}創建了賬戶"$2",並æ交了您的電å­éƒµç®±ä½å€ã€‚
請確èªé€™å€‹è³¬æˆ¶æ˜¯å±¬æ–¼æ‚¨çš„,並åŒæ™‚啟用在{{SITENAME}}上的
é›»å­éƒµä»¶åŠŸèƒ½ã€‚請在ç€è¦½å™¨ä¸­æ‰“開下é¢çš„連çµ:
@@ -3088,8 +3166,32 @@ $3
$5
確èªç¢¼æœƒåœ¨$4éŽæœŸã€‚',
-'confirmemail_invalidated' => '電郵地å€ç¢ºèªå·²å–消',
-'invalidateemail' => 'å–消電郵確èª',
+'confirmemail_body_changed' => 'æ“有IPä½å€$1的用戶(å¯èƒ½æ˜¯æ‚¨ï¼‰åœ¨{{SITENAME}}更改了賬戶"$2"çš„é›»å­éƒµç®±ä½å€ã€‚
+
+請確èªé€™å€‹è³¬æˆ¶æ˜¯å±¬æ–¼æ‚¨çš„,並åŒæ™‚é‡æ–°å•Ÿç”¨åœ¨{{SITENAME}}上的
+é›»å­éƒµä»¶åŠŸèƒ½ã€‚請在ç€è¦½å™¨ä¸­æ‰“開下é¢çš„連çµ:
+
+$3
+
+如果這個賬戶*ä¸æ˜¯*屬於您的,
+請打開下é¢çš„連çµåŽ»å–消電å­éƒµä»¶ç¢ºèª:
+
+$5
+
+確èªç¢¼æœƒåœ¨$4éŽæœŸã€‚',
+'confirmemail_body_set' => '有人,å¯èƒ½æ˜¯æ‚¨ï¼Œä¾†è‡ªIP地å€$1,已設置的戶å£"$2"這個地å€{{SITENAME}}網站å稱電郵地å€ã€‚
+
+為了確èªé€™å€‹å¸³æˆ¶ç¢ºå¯¦å±¬æ–¼è‡ªå·±çš„,é‡æ–°ç¢ºèªé›»å­éƒµä»¶åŠŸèƒ½æ–¼{{SITENAME}}網站å稱,請在ç€è¦½å™¨ä¸­æ‰“開這個éˆæŽ¥ï¼š
+
+$3
+
+如果這帳戶*ä¸*是你的,請點此éˆæŽ¥å–消電å­éƒµä»¶åœ°å€ç¢ºèªï¼š
+
+$5
+
+這個確èªç¢¼æœƒåœ¨$4時éŽæœŸã€‚',
+'confirmemail_invalidated' => '電郵地å€ç¢ºèªå·²å–消',
+'invalidateemail' => 'å–消電郵確èª',
# Scary transclusion
'scarytranscludedisabled' => '[è·¨wiki轉æ›ä»£ç¢¼ä¸å¯ç”¨]',
@@ -3134,6 +3236,7 @@ $1',
'table_pager_first' => '第一é ',
'table_pager_last' => '最末é ',
'table_pager_limit' => 'æ¯é é¡¯ç¤º $1 筆記錄',
+'table_pager_limit_label' => 'æ¯é é …目數︰',
'table_pager_limit_submit' => 'é€å‡º',
'table_pager_empty' => '沒有çµæžœ',
@@ -3190,6 +3293,7 @@ $1',
'version-specialpages' => '特殊é é¢',
'version-parserhooks' => '語法鈎',
'version-variables' => '變數',
+'version-skins' => '外觀',
'version-other' => '其他',
'version-mediahandlers' => '媒體處ç†å™¨',
'version-hooks' => '鈎',
@@ -3201,6 +3305,13 @@ $1',
'version-hook-subscribedby' => '利用於',
'version-version' => '(版本 $1)',
'version-license' => '授權',
+'version-poweredby-credits' => "這個 Wiki 由 '''[http://www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
+'version-poweredby-others' => '其他',
+'version-license-info' => 'MediaWiki為自由軟件;您å¯ä¾æ“šè‡ªç”±è»Ÿä»¶åŸºé‡‘會所發表的GNU通用公共授權æ¢æ¬¾è¦å®šï¼Œå°±æœ¬ç¨‹å¼å†ç‚ºç™¼ä½ˆèˆ‡ï¼æˆ–修改;無論您ä¾æ“šçš„是本授權的第二版或(您自行é¸æ“‡çš„)任一日後發行的版本。
+
+MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼›äº¦ç„¡å°é©å”®æ€§æˆ–特定目的é©ç”¨æ€§æ‰€ç‚ºçš„默示性擔ä¿ã€‚詳情請åƒç…§GNU通用公共授權。
+
+您應已收到附隨於本程å¼çš„[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授權的副本];如果沒有,請寫信至自由軟件基金會:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。',
'version-software' => '已經安è£çš„軟件',
'version-software-product' => '產å“',
'version-software-version' => '版本',
@@ -3270,6 +3381,15 @@ $1',
'tags-edit' => '編輯',
'tags-hitcount' => '$1次更改',
+# Special:ComparePages
+'comparepages' => '比較é é¢',
+'compare-selector' => '比較é é¢çš„修訂',
+'compare-page1' => '第1é ',
+'compare-page2' => '第2é ',
+'compare-rev1' => '修訂版本1',
+'compare-rev2' => '修訂版本2',
+'compare-submit' => '比較',
+
# Database error messages
'dberr-header' => '這個 wiki 出ç¾äº†å•é¡Œ',
'dberr-problems' => '抱歉ï¼
@@ -3287,8 +3407,13 @@ $1',
'htmlform-float-invalid' => '您所指定的值ä¸æ˜¯ä¸€å€‹æ•¸å­—。',
'htmlform-int-toolow' => '您所指定的值低於最å°å€¼$1',
'htmlform-int-toohigh' => '您所指定的值高於最大值$1',
+'htmlform-required' => '此值是必填項',
'htmlform-submit' => 'éžäº¤',
'htmlform-reset' => '撤銷更改',
'htmlform-selectorother-other' => '其他',
+# SQLite database support
+'sqlite-has-fts' => '帶全文æœå°‹çš„版本$1',
+'sqlite-no-fts' => 'ä¸å¸¶å…¨æ–‡æœå°‹çš„版本$1',
+
);
diff --git a/languages/messages/MessagesZh_hk.php b/languages/messages/MessagesZh_hk.php
index 5ec432cc..0b2f2c4a 100644
--- a/languages/messages/MessagesZh_hk.php
+++ b/languages/messages/MessagesZh_hk.php
@@ -21,6 +21,11 @@ $fallback = 'zh-hant';
$fallback8bitEncoding = 'Big5-HKSCS';
+$specialPageAliases = array(
+ 'Unblock' => array( '解除å°ç¦' ),
+ 'ComparePages' => array( 'é é¢æ¯”較' ),
+);
+
$messages = array(
# User preference toggles
'tog-watchlisthidebots' => '監視列表中隱è—機械人的編輯',
@@ -46,35 +51,23 @@ $messages = array(
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見å•é¡Œè§£ç­”]
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]',
-'mytalk' => '我的討論é ',
-'navigation' => '導航',
+'mytalk' => '我的討論é ',
'tagline' => '從 {{SITENAME}}',
'search' => 'æœå°‹',
-'searchbutton' => 'æœå°‹',
-'searcharticle' => '進入',
'printableversion' => 'å¯æ‰“å°ç‰ˆ',
'permalink' => '永久連接',
'print' => '打å°',
-'edit' => '編輯',
-'talkpagelinktext' => 'å°è©±',
'specialpage' => '特殊é é¢',
-'personaltools' => '個人工具',
-'toolbox' => '工具箱',
'jumpto' => '跳到:',
-'jumptonavigation' => '導航',
'jumptosearch' => 'æœå°‹',
# 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:關於我們',
-'mainpage' => '首é ',
-'portal' => '社群入å£',
'privacy' => 'ç§éš±æ”¿ç­–',
'privacypage' => 'Project:ç§éš±æ”¿ç­–',
-'editsectionhint' => '編輯段è½: $1',
-'red-link-title' => '$1 (é é¢ä¸å­˜åœ¨)',
+'red-link-title' => '$1 (é é¢ä¸å­˜åœ¨)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-special' => '特殊é é¢',
@@ -84,9 +77,12 @@ $messages = array(
'userlogin' => '登入ï¼å‰µé€ å¸³æˆ¶',
# Revision deletion
+'rev-deleted-comment' => '(註釋已除)',
+'rev-deleted-event' => '(日誌已除)',
'revdelete-suppress-text' => "壓制'''åª'''應用於以下的情æ³:
* ä¸åˆé©çš„個人資料
*: ''地å€ã€é›»è©±è™Ÿç¢¼ã€èº«ä»½è­‰è™Ÿç¢¼ç­‰ã€‚''",
+'revdelete-logentry' => '已更改「[[$1]]ã€ä¹‹ä¿®è¨‚å¯è¦‹åº¦',
# Diffs
'editundo' => '撤銷',
@@ -105,9 +101,8 @@ $messages = array(
'grouppage-bot' => '{{ns:project}}:機械人',
# Recent changes
-'recentchanges-legend-bot' => '$1 - 機械人編輯',
-'recentchanges-label-bot' => '這次編輯是由機械人進行',
-'rcshowhidebots' => '$1機械人的編輯',
+'recentchanges-label-bot' => '這次編輯是由機械人進行',
+'rcshowhidebots' => '$1機械人的編輯',
# Special:ActiveUsers
'activeusers-hidebots' => 'éš±è—機械人',
diff --git a/languages/messages/MessagesZh_tw.php b/languages/messages/MessagesZh_tw.php
index a8ae2578..9fa0adc3 100644
--- a/languages/messages/MessagesZh_tw.php
+++ b/languages/messages/MessagesZh_tw.php
@@ -25,16 +25,20 @@ $specialPageAliases = array(
'Disambiguations' => array( '消歧義é ' ),
'Recentchanges' => array( '近期變動' ),
'Ancientpages' => array( '最舊é é¢' ),
+ 'Unblock' => array( '解除å°éŽ–' ),
'Blockme' => array( 'å°ç¦æˆ‘' ),
'Blockip' => array( '查å°ç”¨æˆ¶' ),
'Lockdb' => array( '鎖定數據庫' ),
'Unlockdb' => array( '解除數據庫鎖定' ),
+ 'Userrights' => array( '用戶權é™' ),
+ 'MIMEsearch' => array( 'MIMEæœç´¢' ),
'FileDuplicateSearch' => array( 'æœç´¢é‡å¾©æ–‡ä»¶' ),
'Unwatchedpages' => array( '未被監視的é é¢' ),
'Listredirects' => array( 'é‡å®šå‘é é¢åˆ—表' ),
'Revisiondelete' => array( '刪除或æ¢å¾©ç‰ˆæœ¬' ),
'Randomredirect' => array( '隨機é‡å®šå‘é é¢' ),
'Withoutinterwiki' => array( '沒有跨語言éˆæŽ¥çš„é é¢' ),
+ 'Invalidateemail' => array( '無法識別的電郵地å€' ),
'LinkSearch' => array( 'æœç´¢ç¶²é éˆæŽ¥' ),
);
@@ -106,8 +110,6 @@ $messages = array(
'tog-usenewrc' => '使用強化的近期變動 (需è¦JavaScript)',
'tog-numberheadings' => '自動編號標題',
'tog-showtoolbar' => '顯示編輯工具欄 (需è¦JavaScript)',
-'tog-rememberpassword' => '記ä½æˆ‘在這å°é›»è…¦ä¸Šçš„登入',
-'tog-editwidth' => '將編輯欄ä½æ‹“寬到整個螢幕的大å°',
'tog-watchcreations' => '將我建立的é é¢åŠ é€²æˆ‘的監視列表',
'tog-watchdefault' => '將我更改的é é¢æ·»åŠ åˆ°æˆ‘的監視列表中',
'tog-minordefault' => 'é è¨­å°‡ç·¨è¼¯è¨­å®šç‚ºç´°å¾®ä¿®æ”¹',
@@ -345,7 +347,6 @@ $messages = array(
'nonunicodebrowser' => "'''警告: 您的ç€è¦½å™¨ä¸ç›¸å®¹Unicode編碼。這裡有一個工作å€å°‡ä½¿æ‚¨èƒ½å®‰å…¨åœ°ç·¨è¼¯é é¢: éžASCII字元將以å六進製編碼模å¼å‡ºç¾åœ¨ç·¨è¼¯æ¡†ä¸­ã€‚'''",
'editingold' => "'''警告:你正在編輯的是本é çš„舊版本。
如果你ä¿å­˜å®ƒçš„話,在本版本之後的任何修改都會éºå¤±ã€‚'''",
-'longpagewarning' => "'''警告: 本é é•·åº¦é”$1 kB;一些ç€è¦½å™¨å°‡ç„¡æ³•ç·¨è¼¯é•·éŽ32KBé é¢ã€‚請考慮將本文切割æˆå¹¾å€‹å°æ®µè½ã€‚'''",
'longpageerror' => "'''錯誤: 您所æ交的文字長度有$1KB,這大於$2KB的最大值。該文字ä¸èƒ½è¢«å„²å­˜ã€‚'''",
'protectedpagewarning' => "'''警告: 本é å·²ç¶“被ä¿è­·ï¼Œåªæœ‰æ“有管ç†å“¡è¨±å¯æ¬Šçš„使用者æ‰å¯ä¿®æ”¹ã€‚'''",
'semiprotectedpagewarning' => "'''注æ„:''' 本é é¢è¢«éŽ–定,僅é™è¨»å†Šä½¿ç”¨è€…編輯。",
@@ -508,6 +509,7 @@ $messages = array(
'ignorewarning' => '忽略警告並儲存檔案。',
'illegalfilename' => '檔案å"$1"包å«æœ‰é é¢æ¨™é¡Œæ‰€ç¦æ­¢çš„字符。請改å後é‡æ–°ä¸Šå‚³ã€‚',
'badfilename' => '檔案å已被改為"$1"。',
+'hookaborted' => '您所嘗試的修改被擴展鉤æ¨æ£„。',
'fileexists-thumbnail-yes' => "這個檔案好åƒæ˜¯ä¸€å¹…圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]
請檢查清楚該檔案'''<tt>[[:$1]]</tt>'''。
如果檢查後的檔案是åŒåŽŸæœ¬åœ–片的大å°æ˜¯ä¸€æ¨£çš„話,就ä¸ç”¨å†ä¸Šè¼‰å¤šä¸€å¹…縮圖。",
@@ -589,9 +591,6 @@ $messages = array(
'specialloguserlabel' => '使用者:',
'alllogstext' => '綜åˆé¡¯ç¤º {{SITENAME}} 的上傳ã€åˆªé™¤ã€ä¿è­·ã€æŸ¥å°ä»¥åŠç«™å‹™æ—¥èªŒã€‚',
-# Special:Categories
-'categoriespagetext' => '以下列出所有的é é¢åˆ†é¡žã€‚',
-
# Special:ListUsers
'listusersfrom' => '給定顯示使用者æ¢ä»¶:',
'listusers-noresult' => '找ä¸åˆ°ä½¿ç”¨è€…。',
diff --git a/languages/messages/MessagesZu.php b/languages/messages/MessagesZu.php
index f754b2ed..537786a3 100644
--- a/languages/messages/MessagesZu.php
+++ b/languages/messages/MessagesZu.php
@@ -125,7 +125,7 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
'yourname' => 'Isiga',
'yourpassword' => 'Izwi elingenangozi',
'yourpasswordagain' => 'Bhala izwi elingenangozi lakho kabusha',
-'remembermypassword' => 'Ngikhumbule',
+'remembermypassword' => 'Ngikhumbule (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Ngena',
'nav-login-createaccount' => 'Ngena / Dala ikhawundi',
'userlogin' => 'Ngena / Dala ikhawundi',
@@ -209,11 +209,11 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
'recentchangeslinked-toolbox' => 'Izinguquko ezilandiweyo',
# Upload
-'upload' => 'Layisha ifayili',
-'uploadbtn' => 'Layisha ifayili',
-'filesource' => 'Umthombo:',
-'ignorewarnings' => 'Duba imiyalo',
-'successfulupload' => 'Ukulayisha okuchumile',
+'upload' => 'Layisha ifayili',
+'uploadbtn' => 'Layisha ifayili',
+'filesource' => 'Umthombo:',
+'ignorewarnings' => 'Duba imiyalo',
+'upload-success-subj' => 'Ukulayisha okuchumile',
'nolicense' => 'Ubekhetha lutho',
diff --git a/load.php b/load.php
new file mode 100644
index 00000000..d360bd2b
--- /dev/null
+++ b/load.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * This file is the entry point for the resource loader.
+ *
+ * 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 Roan Kattouw
+ * @author Trevor Parscal
+ *
+ */
+
+require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+wfProfileIn( 'load.php' );
+
+// URL safety checks
+if ( !$wgRequest->checkUrlExtension() ) {
+ return;
+}
+
+// Respond to resource loading request
+$resourceLoader = new ResourceLoader();
+$resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
+
+wfProfileOut( 'load.php' );
+wfLogProfilingData();
+
+// Shut down the database
+wfGetLBFactory()->shutdown();
diff --git a/load.php5 b/load.php5
new file mode 100644
index 00000000..529e7f7c
--- /dev/null
+++ b/load.php5
@@ -0,0 +1 @@
+<?php require './load.php'; \ No newline at end of file
diff --git a/maintenance/7zip.inc b/maintenance/7zip.inc
index 617083bf..4ac480ed 100644
--- a/maintenance/7zip.inc
+++ b/maintenance/7zip.inc
@@ -1,5 +1,12 @@
<?php
/**
+ * 7z stream wrapper
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+/**
* Stream wrapper around 7za filter program.
* Required since we can't pass an open file resource to XMLReader->open()
* which is used for the text prefetch.
@@ -8,62 +15,62 @@
*/
class SevenZipStream {
var $stream;
-
+
private function stripPath( $path ) {
$prefix = 'mediawiki.compress.7z://';
return substr( $path, strlen( $prefix ) );
}
-
+
function stream_open( $path, $mode, $options, &$opened_path ) {
- if( $mode[0] == 'r' ) {
+ if ( $mode[0] == 'r' ) {
$options = 'e -bd -so';
- } elseif( $mode[0] == 'w' ) {
+ } elseif ( $mode[0] == 'w' ) {
$options = 'a -bd -si';
} else {
return false;
}
$arg = wfEscapeShellArg( $this->stripPath( $path ) );
$command = "7za $options $arg";
- if( !wfIsWindows() ) {
+ if ( !wfIsWindows() ) {
// Suppress the stupid messages on stderr
$command .= ' 2>/dev/null';
}
- $this->stream = popen( $command, $mode );
- return ($this->stream !== false);
+ $this->stream = popen( $command, $mode[0] ); // popen() doesn't like two-letter modes
+ return ( $this->stream !== false );
}
-
+
function url_stat( $path, $flags ) {
return stat( $this->stripPath( $path ) );
}
-
+
// This is all so lame; there should be a default class we can extend
-
+
function stream_close() {
return fclose( $this->stream );
}
-
+
function stream_flush() {
return fflush( $this->stream );
}
-
+
function stream_read( $count ) {
return fread( $this->stream, $count );
}
-
+
function stream_write( $data ) {
return fwrite( $this->stream, $data );
}
-
+
function stream_tell() {
return ftell( $this->stream );
}
-
+
function stream_eof() {
return feof( $this->stream );
}
-
+
function stream_seek( $offset, $whence ) {
return fseek( $this->stream, $offset, $whence );
}
}
-stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' ); \ No newline at end of file
+stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' );
diff --git a/maintenance/Doxyfile b/maintenance/Doxyfile
index db737bff..3d037651 100644
--- a/maintenance/Doxyfile
+++ b/maintenance/Doxyfile
@@ -9,6 +9,7 @@
# {{INPUT}}
#
# A number of MediaWiki-specific aliases are near the end of this file.
+# To generate documentation run: php mwdocgen.php --no-extensions
#---------------------------------------------------------------------------
# Project related configuration options
@@ -39,7 +40,6 @@ STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
@@ -76,6 +76,7 @@ ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = NO
+SHOW_NAMESPACES = NO
FILE_VERSION_FILTER = {{SVNSTAT}}
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
@@ -135,7 +136,7 @@ FILE_PATTERNS = *.c \
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = YES
-EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php .svn {{EXCLUDE}}
+EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE}}
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
@@ -245,7 +246,7 @@ SKIP_FUNCTION_MACROS = YES
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
-GENERATE_TAGFILE =
+GENERATE_TAGFILE = {{OUTPUT_DIRECTORY}}/html/tagfile.xml
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
@@ -284,13 +285,16 @@ ALIASES = "type{1}=<b> \1 </b>:" \
"arrayof{2}=<b> Array </b> of \2" \
"null=\type{Null}" \
"boolean=\type{Boolean}" \
- "bool=\boolean" \
+ "bool=\type{Boolean}" \
"integer=\type{Integer}" \
- "int=\integer" \
+ "int=\type{Integer}" \
"string=\type{String}" \
- "str=\string" \
+ "str=\type{String}" \
"mixed=\type{Mixed}" \
"access=\par Access:\n" \
"private=\access private" \
"protected=\access protected" \
- "public=\access public" \ No newline at end of file
+ "public=\access public" \
+ "copyright=\note" \
+ "license=\note"
+
diff --git a/maintenance/FiveUpgrade.inc b/maintenance/FiveUpgrade.inc
deleted file mode 100644
index be0112e9..00000000
--- a/maintenance/FiveUpgrade.inc
+++ /dev/null
@@ -1,1190 +0,0 @@
-<?php
-/**
- * @file
- * @ingroup Maintenance
- */
-
-require_once( 'cleanupDupes.inc' );
-require_once( 'userDupes.inc' );
-require_once( 'updaters.inc' );
-
-define( 'MW_UPGRADE_COPY', false );
-define( 'MW_UPGRADE_ENCODE', true );
-define( 'MW_UPGRADE_NULL', null );
-define( 'MW_UPGRADE_CALLBACK', null ); // for self-documentation only
-
-/**
- * @ingroup Maintenance
- */
-class FiveUpgrade {
- function FiveUpgrade() {
- $this->conversionTables = $this->prepareWindows1252();
-
- $this->loadBalancers = array();
- $this->dbw = wfGetDB( DB_MASTER );
- $this->dbr = $this->streamConnection();
-
- $this->cleanupSwaps = array();
- $this->emailAuth = false; # don't preauthenticate emails
- $this->maxLag = 10; # if slaves are lagged more than 10 secs, wait
- }
-
- function doing( $step ) {
- return is_null( $this->step ) || $step == $this->step;
- }
-
- function upgrade( $step ) {
- $this->step = $step;
-
- $tables = array(
- 'page',
- 'links',
- 'user',
- 'image',
- 'oldimage',
- 'watchlist',
- 'logging',
- 'archive',
- 'imagelinks',
- 'categorylinks',
- 'ipblocks',
- 'recentchanges',
- 'querycache' );
- foreach( $tables as $table ) {
- if( $this->doing( $table ) ) {
- $method = 'upgrade' . ucfirst( $table );
- $this->$method();
- }
- }
-
- if( $this->doing( 'cleanup' ) ) {
- $this->upgradeCleanup();
- }
- }
-
-
- /**
- * Open a connection to the master server with the admin rights.
- * @return Database
- * @access private
- */
- function newConnection() {
- $lb = wfGetLBFactory()->newMainLB();
- $db = $lb->getConnection( DB_MASTER );
-
- $this->loadBalancers[] = $lb;
- return $db;
- }
-
- /**
- * Commit transactions and close the connections when we're done...
- */
- function close() {
- foreach( $this->loadBalancers as $lb ) {
- $lb->commitMasterChanges();
- $lb->closeAll();
- }
- }
-
- /**
- * Open a second connection to the master server, with buffering off.
- * This will let us stream large datasets in and write in chunks on the
- * other end.
- * @return Database
- * @access private
- */
- function streamConnection() {
- global $wgDBtype;
-
- $timeout = 3600 * 24;
- $db = $this->newConnection();
- $db->bufferResults( false );
- if ($wgDBtype == 'mysql') {
- $db->query( "SET net_read_timeout=$timeout" );
- $db->query( "SET net_write_timeout=$timeout" );
- }
- return $db;
- }
-
- /**
- * Prepare a conversion array for converting Windows Code Page 1252 to
- * UTF-8. This should provide proper conversion of text that was miscoded
- * as Windows-1252 by naughty user-agents, and doesn't rely on an outside
- * iconv library.
- *
- * @return array
- * @access private
- */
- function prepareWindows1252() {
- # Mappings from:
- # http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
- static $cp1252 = array(
- 0x80 => 0x20AC, #EURO SIGN
- 0x81 => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
- 0x82 => 0x201A, #SINGLE LOW-9 QUOTATION MARK
- 0x83 => 0x0192, #LATIN SMALL LETTER F WITH HOOK
- 0x84 => 0x201E, #DOUBLE LOW-9 QUOTATION MARK
- 0x85 => 0x2026, #HORIZONTAL ELLIPSIS
- 0x86 => 0x2020, #DAGGER
- 0x87 => 0x2021, #DOUBLE DAGGER
- 0x88 => 0x02C6, #MODIFIER LETTER CIRCUMFLEX ACCENT
- 0x89 => 0x2030, #PER MILLE SIGN
- 0x8A => 0x0160, #LATIN CAPITAL LETTER S WITH CARON
- 0x8B => 0x2039, #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- 0x8C => 0x0152, #LATIN CAPITAL LIGATURE OE
- 0x8D => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
- 0x8E => 0x017D, #LATIN CAPITAL LETTER Z WITH CARON
- 0x8F => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
- 0x90 => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
- 0x91 => 0x2018, #LEFT SINGLE QUOTATION MARK
- 0x92 => 0x2019, #RIGHT SINGLE QUOTATION MARK
- 0x93 => 0x201C, #LEFT DOUBLE QUOTATION MARK
- 0x94 => 0x201D, #RIGHT DOUBLE QUOTATION MARK
- 0x95 => 0x2022, #BULLET
- 0x96 => 0x2013, #EN DASH
- 0x97 => 0x2014, #EM DASH
- 0x98 => 0x02DC, #SMALL TILDE
- 0x99 => 0x2122, #TRADE MARK SIGN
- 0x9A => 0x0161, #LATIN SMALL LETTER S WITH CARON
- 0x9B => 0x203A, #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- 0x9C => 0x0153, #LATIN SMALL LIGATURE OE
- 0x9D => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
- 0x9E => 0x017E, #LATIN SMALL LETTER Z WITH CARON
- 0x9F => 0x0178, #LATIN CAPITAL LETTER Y WITH DIAERESIS
- );
- $pairs = array();
- for( $i = 0; $i < 0x100; $i++ ) {
- $unicode = isset( $cp1252[$i] ) ? $cp1252[$i] : $i;
- $pairs[chr( $i )] = codepointToUtf8( $unicode );
- }
- return $pairs;
- }
-
- /**
- * Convert from 8-bit Windows-1252 to UTF-8 if necessary.
- * @param string $text
- * @return string
- * @access private
- */
- function conv( $text ) {
- global $wgUseLatin1;
- return is_null( $text )
- ? null
- : ( $wgUseLatin1
- ? strtr( $text, $this->conversionTables )
- : $text );
- }
-
- /**
- * Dump timestamp and message to output
- * @param string $message
- * @access private
- */
- function log( $message ) {
- echo wfWikiID() . ' ' . wfTimestamp( TS_DB ) . ': ' . $message . "\n";
- flush();
- }
-
- /**
- * Initialize the chunked-insert system.
- * Rows will be inserted in chunks of the given number, rather
- * than in a giant INSERT...SELECT query, to keep the serialized
- * MySQL database replication from getting hung up. This way other
- * things can be going on during conversion without waiting for
- * slaves to catch up as badly.
- *
- * @param int $chunksize Number of rows to insert at once
- * @param int $final Total expected number of rows / id of last row,
- * used for progress reports.
- * @param string $table to insert on
- * @param string $fname function name to report in SQL
- * @access private
- */
- function setChunkScale( $chunksize, $final, $table, $fname ) {
- $this->chunkSize = $chunksize;
- $this->chunkFinal = $final;
- $this->chunkCount = 0;
- $this->chunkStartTime = wfTime();
- $this->chunkOptions = array( 'IGNORE' );
- $this->chunkTable = $table;
- $this->chunkFunction = $fname;
- }
-
- /**
- * Chunked inserts: perform an insert if we've reached the chunk limit.
- * Prints a progress report with estimated completion time.
- * @param array &$chunk -- This will be emptied if an insert is done.
- * @param int $key A key identifier to use in progress estimation in
- * place of the number of rows inserted. Use this if
- * you provided a max key number instead of a count
- * as the final chunk number in setChunkScale()
- * @access private
- */
- function addChunk( &$chunk, $key = null ) {
- if( count( $chunk ) >= $this->chunkSize ) {
- $this->insertChunk( $chunk );
-
- $this->chunkCount += count( $chunk );
- $now = wfTime();
- $delta = $now - $this->chunkStartTime;
- $rate = $this->chunkCount / $delta;
-
- if( is_null( $key ) ) {
- $completed = $this->chunkCount;
- } else {
- $completed = $key;
- }
- $portion = $completed / $this->chunkFinal;
-
- $estimatedTotalTime = $delta / $portion;
- $eta = $this->chunkStartTime + $estimatedTotalTime;
-
- printf( "%s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec\n",
- wfTimestamp( TS_DB, intval( $now ) ),
- $portion * 100.0,
- $this->chunkTable,
- wfTimestamp( TS_DB, intval( $eta ) ),
- $completed,
- $this->chunkFinal,
- $rate );
- flush();
-
- $chunk = array();
- }
- }
-
- /**
- * Chunked inserts: perform an insert unconditionally, at the end, and log.
- * @param array &$chunk -- This will be emptied if an insert is done.
- * @access private
- */
- function lastChunk( &$chunk ) {
- $n = count( $chunk );
- if( $n > 0 ) {
- $this->insertChunk( $chunk );
- }
- $this->log( "100.00% done on $this->chunkTable (last chunk $n rows)." );
- }
-
- /**
- * Chunked inserts: perform an insert.
- * @param array &$chunk -- This will be emptied if an insert is done.
- * @access private
- */
- function insertChunk( &$chunk ) {
- // Give slaves a chance to catch up
- wfWaitForSlaves( $this->maxLag );
- $this->dbw->insert( $this->chunkTable, $chunk, $this->chunkFunction, $this->chunkOptions );
- }
-
-
- /**
- * Copy and transcode a table to table_temp.
- * @param string $name Base name of the source table
- * @param string $tabledef CREATE TABLE definition, w/ $1 for the name
- * @param array $fields set of destination fields to these constants:
- * MW_UPGRADE_COPY - straight copy
- * MW_UPGRADE_ENCODE - for old Latin1 wikis, conv to UTF-8
- * MW_UPGRADE_NULL - just put NULL
- * @param callable $callback An optional callback to modify the data
- * or perform other processing. Func should be
- * ( object $row, array $copy ) and return $copy
- * @access private
- */
- function copyTable( $name, $tabledef, $fields, $callback = null ) {
- $fname = 'FiveUpgrade::copyTable';
-
- $name_temp = $name . '_temp';
- $this->log( "Migrating $name table to $name_temp..." );
-
- $table_temp = $this->dbw->tableName( $name_temp );
-
- // Create temporary table; we're going to copy everything in there,
- // then at the end rename the final tables into place.
- $def = str_replace( '$1', $table_temp, $tabledef );
- $this->dbw->query( $def, $fname );
-
- $numRecords = $this->dbw->selectField( $name, 'COUNT(*)', '', $fname );
- $this->setChunkScale( 100, $numRecords, $name_temp, $fname );
-
- // Pull all records from the second, streaming database connection.
- $sourceFields = array_keys( array_filter( $fields,
- create_function( '$x', 'return $x !== MW_UPGRADE_NULL;' ) ) );
- $result = $this->dbr->select( $name,
- $sourceFields,
- '',
- $fname );
-
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $copy = array();
- foreach( $fields as $field => $source ) {
- if( $source === MW_UPGRADE_COPY ) {
- $copy[$field] = $row->$field;
- } elseif( $source === MW_UPGRADE_ENCODE ) {
- $copy[$field] = $this->conv( $row->$field );
- } elseif( $source === MW_UPGRADE_NULL ) {
- $copy[$field] = null;
- } else {
- $this->log( "Unknown field copy type: $field => $source" );
- }
- }
- if( is_callable( $callback ) ) {
- $copy = call_user_func( $callback, $row, $copy );
- }
- $add[] = $copy;
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
- $this->dbr->freeResult( $result );
-
- $this->log( "Done converting $name." );
- $this->cleanupSwaps[] = $name;
- }
-
- function upgradePage() {
- $fname = "FiveUpgrade::upgradePage";
- $chunksize = 100;
-
- if( $this->dbw->tableExists( 'page' ) ) {
- $this->log( 'Page table already exists; aborting.' );
- die( -1 );
- }
-
- $this->log( "Checking cur table for unique title index and applying if necessary" );
- checkDupes( true );
-
- $this->log( "...converting from cur/old to page/revision/text DB structure." );
-
- list ($cur, $old, $page, $revision, $text) = $this->dbw->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
-
- $this->log( "Creating page and revision tables..." );
- $this->dbw->query("CREATE TABLE $page (
- page_id int(8) unsigned NOT NULL auto_increment,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL default '',
- page_counter bigint(20) unsigned NOT NULL default '0',
- page_is_redirect tinyint(1) unsigned NOT NULL default '0',
- page_is_new tinyint(1) unsigned NOT NULL default '0',
- page_random real unsigned NOT NULL,
- page_touched char(14) binary NOT NULL default '',
- page_latest int(8) unsigned NOT NULL,
- page_len int(8) unsigned NOT NULL,
-
- PRIMARY KEY page_id (page_id),
- UNIQUE INDEX name_title (page_namespace,page_title),
- INDEX (page_random),
- INDEX (page_len)
- ) TYPE=InnoDB", $fname );
- $this->dbw->query("CREATE TABLE $revision (
- rev_id int(8) unsigned NOT NULL auto_increment,
- rev_page int(8) unsigned NOT NULL,
- rev_text_id int(8) unsigned NOT NULL,
- rev_comment tinyblob NOT NULL default '',
- rev_user int(5) unsigned NOT NULL default '0',
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp char(14) binary NOT NULL default '',
- rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
- rev_deleted tinyint(1) unsigned NOT NULL default '0',
-
- PRIMARY KEY rev_page_id (rev_page, rev_id),
- UNIQUE INDEX rev_id (rev_id),
- INDEX rev_timestamp (rev_timestamp),
- INDEX page_timestamp (rev_page,rev_timestamp),
- INDEX user_timestamp (rev_user,rev_timestamp),
- INDEX usertext_timestamp (rev_user_text,rev_timestamp)
- ) TYPE=InnoDB", $fname );
-
- $maxold = intval( $this->dbw->selectField( 'old', 'max(old_id)', '', $fname ) );
- $this->log( "Last old record is {$maxold}" );
-
- global $wgLegacySchemaConversion;
- if( $wgLegacySchemaConversion ) {
- // Create HistoryBlobCurStub entries.
- // Text will be pulled from the leftover 'cur' table at runtime.
- echo "......Moving metadata from cur; using blob references to text in cur table.\n";
- $cur_text = "concat('O:18:\"historyblobcurstub\":1:{s:6:\"mCurId\";i:',cur_id,';}')";
- $cur_flags = "'object'";
- } else {
- // Copy all cur text in immediately: this may take longer but avoids
- // having to keep an extra table around.
- echo "......Moving text from cur.\n";
- $cur_text = 'cur_text';
- $cur_flags = "''";
- }
-
- $maxcur = $this->dbw->selectField( 'cur', 'max(cur_id)', '', $fname );
- $this->log( "Last cur entry is $maxcur" );
-
- /**
- * Copy placeholder records for each page's current version into old
- * Don't do any conversion here; text records are converted at runtime
- * based on the flags (and may be originally binary!) while the meta
- * fields will be converted in the old -> rev and cur -> page steps.
- */
- $this->setChunkScale( $chunksize, $maxcur, 'old', $fname );
- $result = $this->dbr->query(
- "SELECT cur_id, cur_namespace, cur_title, $cur_text AS text, cur_comment,
- cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags AS flags
- FROM $cur
- ORDER BY cur_id", $fname );
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $add[] = array(
- 'old_namespace' => $row->cur_namespace,
- 'old_title' => $row->cur_title,
- 'old_text' => $row->text,
- 'old_comment' => $row->cur_comment,
- 'old_user' => $row->cur_user,
- 'old_user_text' => $row->cur_user_text,
- 'old_timestamp' => $row->cur_timestamp,
- 'old_minor_edit' => $row->cur_minor_edit,
- 'old_flags' => $row->flags );
- $this->addChunk( $add, $row->cur_id );
- }
- $this->lastChunk( $add );
- $this->dbr->freeResult( $result );
-
- /**
- * Copy revision metadata from old into revision.
- * We'll also do UTF-8 conversion of usernames and comments.
- */
- #$newmaxold = $this->dbw->selectField( 'old', 'max(old_id)', '', $fname );
- #$this->setChunkScale( $chunksize, $newmaxold, 'revision', $fname );
- #$countold = $this->dbw->selectField( 'old', 'count(old_id)', '', $fname );
- $countold = $this->dbw->selectField( 'old', 'max(old_id)', '', $fname );
- $this->setChunkScale( $chunksize, $countold, 'revision', $fname );
-
- $this->log( "......Setting up revision table." );
- $result = $this->dbr->query(
- "SELECT old_id, cur_id, old_comment, old_user, old_user_text,
- old_timestamp, old_minor_edit
- FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title",
- $fname );
-
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $add[] = array(
- 'rev_id' => $row->old_id,
- 'rev_page' => $row->cur_id,
- 'rev_text_id' => $row->old_id,
- 'rev_comment' => $this->conv( $row->old_comment ),
- 'rev_user' => $row->old_user,
- 'rev_user_text' => $this->conv( $row->old_user_text ),
- 'rev_timestamp' => $row->old_timestamp,
- 'rev_minor_edit' => $row->old_minor_edit );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
- $this->dbr->freeResult( $result );
-
-
- /**
- * Copy page metadata from cur into page.
- * We'll also do UTF-8 conversion of titles.
- */
- $this->log( "......Setting up page table." );
- $this->setChunkScale( $chunksize, $maxcur, 'page', $fname );
- $result = $this->dbr->query( "
- SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
- cur_random, cur_touched, rev_id, LENGTH(cur_text) AS len
- FROM $cur,$revision
- WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}
- ORDER BY cur_id", $fname );
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $add[] = array(
- 'page_id' => $row->cur_id,
- 'page_namespace' => $row->cur_namespace,
- 'page_title' => $this->conv( $row->cur_title ),
- 'page_restrictions' => $row->cur_restrictions,
- 'page_counter' => $row->cur_counter,
- 'page_is_redirect' => $row->cur_is_redirect,
- 'page_is_new' => $row->cur_is_new,
- 'page_random' => $row->cur_random,
- 'page_touched' => $this->dbw->timestamp(),
- 'page_latest' => $row->rev_id,
- 'page_len' => $row->len );
- #$this->addChunk( $add, $row->cur_id );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
- $this->dbr->freeResult( $result );
-
- $this->log( "...done with cur/old -> page/revision." );
- }
-
- function upgradeLinks() {
- $fname = 'FiveUpgrade::upgradeLinks';
- $chunksize = 200;
- list ($links, $brokenlinks, $pagelinks, $cur) = $this->dbw->tableNamesN( 'links', 'brokenlinks', 'pagelinks', 'cur' );
-
- $this->log( 'Checking for interwiki table change in case of bogus items...' );
- if( $this->dbw->fieldExists( 'interwiki', 'iw_trans' ) ) {
- $this->log( 'interwiki has iw_trans.' );
- } else {
- global $IP;
- $this->log( 'adding iw_trans...' );
- $this->dbw->sourceFile( $IP . '/maintenance/archives/patch-interwiki-trans.sql' );
- $this->log( 'added iw_trans.' );
- }
-
- $this->log( 'Creating pagelinks table...' );
- $this->dbw->query( "
-CREATE TABLE $pagelinks (
- -- Key to the page_id of the page containing the link.
- pl_from int(8) unsigned NOT NULL default '0',
-
- -- Key to page_namespace/page_title of the target page.
- -- The target page may or may not exist, and due to renames
- -- and deletions may refer to different page records as time
- -- goes by.
- pl_namespace int NOT NULL default '0',
- pl_title varchar(255) binary NOT NULL default '',
-
- UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
- KEY (pl_namespace,pl_title)
-
-) TYPE=InnoDB" );
-
- $this->log( 'Importing live links -> pagelinks' );
- $nlinks = $this->dbw->selectField( 'links', 'count(*)', '', $fname );
- if( $nlinks ) {
- $this->setChunkScale( $chunksize, $nlinks, 'pagelinks', $fname );
- $result = $this->dbr->query( "
- SELECT l_from,cur_namespace,cur_title
- FROM $links, $cur
- WHERE l_to=cur_id", $fname );
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $add[] = array(
- 'pl_from' => $row->l_from,
- 'pl_namespace' => $row->cur_namespace,
- 'pl_title' => $this->conv( $row->cur_title ) );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
- } else {
- $this->log( 'no links!' );
- }
-
- $this->log( 'Importing brokenlinks -> pagelinks' );
- $nbrokenlinks = $this->dbw->selectField( 'brokenlinks', 'count(*)', '', $fname );
- if( $nbrokenlinks ) {
- $this->setChunkScale( $chunksize, $nbrokenlinks, 'pagelinks', $fname );
- $result = $this->dbr->query(
- "SELECT bl_from, bl_to FROM $brokenlinks",
- $fname );
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $pagename = $this->conv( $row->bl_to );
- $title = Title::newFromText( $pagename );
- if( is_null( $title ) ) {
- $this->log( "** invalid brokenlink: $row->bl_from -> '$pagename' (converted from '$row->bl_to')" );
- } else {
- $add[] = array(
- 'pl_from' => $row->bl_from,
- 'pl_namespace' => $title->getNamespace(),
- 'pl_title' => $title->getDBkey() );
- $this->addChunk( $add );
- }
- }
- $this->lastChunk( $add );
- } else {
- $this->log( 'no brokenlinks!' );
- }
-
- $this->log( 'Done with links.' );
- }
-
- function upgradeUser() {
- // Apply unique index, if necessary:
- $duper = new UserDupes( $this->dbw );
- if( $duper->hasUniqueIndex() ) {
- $this->log( "Already have unique user_name index." );
- } else {
- $this->log( "Clearing user duplicates..." );
- if( !$duper->clearDupes() ) {
- $this->log( "WARNING: Duplicate user accounts, may explode!" );
- }
- }
-
- $tabledef = <<<END
-CREATE TABLE $1 (
- user_id int(5) unsigned NOT NULL auto_increment,
- user_name varchar(255) binary NOT NULL default '',
- user_real_name varchar(255) binary NOT NULL default '',
- user_password tinyblob NOT NULL default '',
- user_newpassword tinyblob NOT NULL default '',
- user_email tinytext NOT NULL default '',
- user_options blob NOT NULL default '',
- user_touched char(14) binary NOT NULL default '',
- user_token char(32) binary NOT NULL default '',
- user_email_authenticated CHAR(14) BINARY,
- user_email_token CHAR(32) BINARY,
- user_email_token_expires CHAR(14) BINARY,
-
- PRIMARY KEY user_id (user_id),
- UNIQUE INDEX user_name (user_name),
- INDEX (user_email_token)
-
-) TYPE=InnoDB
-END;
- $fields = array(
- 'user_id' => MW_UPGRADE_COPY,
- 'user_name' => MW_UPGRADE_ENCODE,
- 'user_real_name' => MW_UPGRADE_ENCODE,
- 'user_password' => MW_UPGRADE_COPY,
- 'user_newpassword' => MW_UPGRADE_COPY,
- 'user_email' => MW_UPGRADE_ENCODE,
- 'user_options' => MW_UPGRADE_ENCODE,
- 'user_touched' => MW_UPGRADE_CALLBACK,
- 'user_token' => MW_UPGRADE_COPY,
- 'user_email_authenticated' => MW_UPGRADE_CALLBACK,
- 'user_email_token' => MW_UPGRADE_NULL,
- 'user_email_token_expires' => MW_UPGRADE_NULL );
- $this->copyTable( 'user', $tabledef, $fields,
- array( &$this, 'userCallback' ) );
- }
-
- function userCallback( $row, $copy ) {
- $now = $this->dbw->timestamp();
- $copy['user_touched'] = $now;
- $copy['user_email_authenticated'] = $this->emailAuth ? $now : null;
- return $copy;
- }
-
- function upgradeImage() {
- $tabledef = <<<END
-CREATE TABLE $1 (
- img_name varchar(255) binary NOT NULL default '',
- img_size int(8) unsigned NOT NULL default '0',
- img_width int(5) NOT NULL default '0',
- img_height int(5) NOT NULL default '0',
- img_metadata mediumblob NOT NULL,
- img_bits int(3) NOT NULL default '0',
- img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- img_minor_mime varchar(32) NOT NULL default "unknown",
- img_description tinyblob NOT NULL default '',
- img_user int(5) unsigned NOT NULL default '0',
- img_user_text varchar(255) binary NOT NULL default '',
- img_timestamp char(14) binary NOT NULL default '',
-
- PRIMARY KEY img_name (img_name),
- INDEX img_size (img_size),
- INDEX img_timestamp (img_timestamp)
-) TYPE=InnoDB
-END;
- $fields = array(
- 'img_name' => MW_UPGRADE_ENCODE,
- 'img_size' => MW_UPGRADE_COPY,
- 'img_width' => MW_UPGRADE_CALLBACK,
- 'img_height' => MW_UPGRADE_CALLBACK,
- 'img_metadata' => MW_UPGRADE_CALLBACK,
- 'img_bits' => MW_UPGRADE_CALLBACK,
- 'img_media_type' => MW_UPGRADE_CALLBACK,
- 'img_major_mime' => MW_UPGRADE_CALLBACK,
- 'img_minor_mime' => MW_UPGRADE_CALLBACK,
- 'img_description' => MW_UPGRADE_ENCODE,
- 'img_user' => MW_UPGRADE_COPY,
- 'img_user_text' => MW_UPGRADE_ENCODE,
- 'img_timestamp' => MW_UPGRADE_COPY );
- $this->copyTable( 'image', $tabledef, $fields,
- array( &$this, 'imageCallback' ) );
- }
-
- function imageCallback( $row, $copy ) {
- global $options;
- if( !isset( $options['noimage'] ) ) {
- // Fill in the new image info fields
- $info = $this->imageInfo( $row->img_name );
-
- $copy['img_width' ] = $info['width'];
- $copy['img_height' ] = $info['height'];
- $copy['img_metadata' ] = ""; // loaded on-demand
- $copy['img_bits' ] = $info['bits'];
- $copy['img_media_type'] = $info['media'];
- $copy['img_major_mime'] = $info['major'];
- $copy['img_minor_mime'] = $info['minor'];
- }
-
- // If doing UTF8 conversion the file must be renamed
- $this->renameFile( $row->img_name, 'wfImageDir' );
-
- return $copy;
- }
-
- function imageInfo( $filename ) {
- $info = array(
- 'width' => 0,
- 'height' => 0,
- 'bits' => 0,
- 'media' => '',
- 'major' => '',
- 'minor' => '' );
-
- $magic = MimeMagic::singleton();
- $mime = $magic->guessMimeType( $filename, true );
- list( $info['major'], $info['minor'] ) = explode( '/', $mime );
-
- $info['media'] = $magic->getMediaType( $filename, $mime );
-
- $image = UnregisteredLocalFile::newFromPath( $filename, $mime );
-
- $info['width'] = $image->getWidth();
- $info['height'] = $image->getHeight();
-
- $gis = $image->getImageSize();
- if ( isset( $gis['bits'] ) ) {
- $info['bits'] = $gis['bits'];
- }
-
- return $info;
- }
-
-
- /**
- * Truncate a table.
- * @param string $table The table name to be truncated
- */
- function clearTable( $table ) {
- print "Clearing $table...\n";
- $tableName = $this->db->tableName( $table );
- $this->db->query( "TRUNCATE $tableName" );
- }
-
- /**
- * Rename a given image or archived image file to the converted filename,
- * leaving a symlink for URL compatibility.
- *
- * @param string $oldname pre-conversion filename
- * @param string $basename pre-conversion base filename for dir hashing, if an archive
- * @access private
- */
- function renameFile( $oldname, $subdirCallback='wfImageDir', $basename=null ) {
- $newname = $this->conv( $oldname );
- if( $newname == $oldname ) {
- // No need to rename; another field triggered this row.
- return false;
- }
-
- if( is_null( $basename ) ) $basename = $oldname;
- $ubasename = $this->conv( $basename );
- $oldpath = call_user_func( $subdirCallback, $basename ) . '/' . $oldname;
- $newpath = call_user_func( $subdirCallback, $ubasename ) . '/' . $newname;
-
- $this->log( "$oldpath -> $newpath" );
- if( rename( $oldpath, $newpath ) ) {
- $relpath = wfRelativePath( $newpath, dirname( $oldpath ) );
- if( !symlink( $relpath, $oldpath ) ) {
- $this->log( "... symlink failed!" );
- }
- return $newname;
- } else {
- $this->log( "... rename failed!" );
- return false;
- }
- }
-
- function upgradeOldImage() {
- $tabledef = <<<END
-CREATE TABLE $1 (
- -- Base filename: key to image.img_name
- oi_name varchar(255) binary NOT NULL default '',
-
- -- Filename of the archived file.
- -- This is generally a timestamp and '!' prepended to the base name.
- oi_archive_name varchar(255) binary NOT NULL default '',
-
- -- Other fields as in image...
- oi_size int(8) unsigned NOT NULL default 0,
- oi_width int(5) NOT NULL default 0,
- oi_height int(5) NOT NULL default 0,
- oi_bits int(3) NOT NULL default 0,
- oi_description tinyblob NOT NULL default '',
- oi_user int(5) unsigned NOT NULL default '0',
- oi_user_text varchar(255) binary NOT NULL default '',
- oi_timestamp char(14) binary NOT NULL default '',
-
- INDEX oi_name (oi_name(10))
-
-) TYPE=InnoDB;
-END;
- $fields = array(
- 'oi_name' => MW_UPGRADE_ENCODE,
- 'oi_archive_name' => MW_UPGRADE_ENCODE,
- 'oi_size' => MW_UPGRADE_COPY,
- 'oi_width' => MW_UPGRADE_CALLBACK,
- 'oi_height' => MW_UPGRADE_CALLBACK,
- 'oi_bits' => MW_UPGRADE_CALLBACK,
- 'oi_description' => MW_UPGRADE_ENCODE,
- 'oi_user' => MW_UPGRADE_COPY,
- 'oi_user_text' => MW_UPGRADE_ENCODE,
- 'oi_timestamp' => MW_UPGRADE_COPY );
- $this->copyTable( 'oldimage', $tabledef, $fields,
- array( &$this, 'oldimageCallback' ) );
- }
-
- function oldimageCallback( $row, $copy ) {
- global $options;
- if( !isset( $options['noimage'] ) ) {
- // Fill in the new image info fields
- $info = $this->imageInfo( $row->oi_archive_name, 'wfImageArchiveDir', $row->oi_name );
- $copy['oi_width' ] = $info['width' ];
- $copy['oi_height'] = $info['height'];
- $copy['oi_bits' ] = $info['bits' ];
- }
-
- // If doing UTF8 conversion the file must be renamed
- $this->renameFile( $row->oi_archive_name, 'wfImageArchiveDir', $row->oi_name );
-
- return $copy;
- }
-
-
- function upgradeWatchlist() {
- $fname = 'FiveUpgrade::upgradeWatchlist';
- $chunksize = 100;
-
- list ($watchlist, $watchlist_temp) = $this->dbw->tableNamesN( 'watchlist', 'watchlist_temp' );
-
- $this->log( 'Migrating watchlist table to watchlist_temp...' );
- $this->dbw->query(
-"CREATE TABLE $watchlist_temp (
- -- Key to user_id
- wl_user int(5) unsigned NOT NULL,
-
- -- Key to page_namespace/page_title
- -- Note that users may watch patches which do not exist yet,
- -- or existed in the past but have been deleted.
- wl_namespace int NOT NULL default '0',
- wl_title varchar(255) binary NOT NULL default '',
-
- -- Timestamp when user was last sent a notification e-mail;
- -- cleared when the user visits the page.
- -- FIXME: add proper null support etc
- wl_notificationtimestamp varchar(14) binary NOT NULL default '0',
-
- UNIQUE KEY (wl_user, wl_namespace, wl_title),
- KEY namespace_title (wl_namespace,wl_title)
-
-) TYPE=InnoDB;", $fname );
-
- // Fix encoding for Latin-1 upgrades, add some fields,
- // and double article to article+talk pairs
- $numwatched = $this->dbw->selectField( 'watchlist', 'count(*)', '', $fname );
-
- $this->setChunkScale( $chunksize, $numwatched * 2, 'watchlist_temp', $fname );
- $result = $this->dbr->select( 'watchlist',
- array(
- 'wl_user',
- 'wl_namespace',
- 'wl_title' ),
- '',
- $fname );
-
- $add = array();
- while( $row = $this->dbr->fetchObject( $result ) ) {
- $add[] = array(
- 'wl_user' => $row->wl_user,
- 'wl_namespace' => MWNamespace::getSubject( $row->wl_namespace ),
- 'wl_title' => $this->conv( $row->wl_title ),
- 'wl_notificationtimestamp' => '0' );
- $this->addChunk( $add );
-
- $add[] = array(
- 'wl_user' => $row->wl_user,
- 'wl_namespace' => MWNamespace::getTalk( $row->wl_namespace ),
- 'wl_title' => $this->conv( $row->wl_title ),
- 'wl_notificationtimestamp' => '0' );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
- $this->dbr->freeResult( $result );
-
- $this->log( 'Done converting watchlist.' );
- $this->cleanupSwaps[] = 'watchlist';
- }
-
- function upgradeLogging() {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- -- Symbolic keys for the general log type and the action type
- -- within the log. The output format will be controlled by the
- -- action field, but only the type controls categorization.
- log_type char(10) NOT NULL default '',
- log_action char(10) NOT NULL default '',
-
- -- Timestamp. Duh.
- log_timestamp char(14) NOT NULL default '19700101000000',
-
- -- The user who performed this action; key to user_id
- log_user int unsigned NOT NULL default 0,
-
- -- Key to the page affected. Where a user is the target,
- -- this will point to the user page.
- log_namespace int NOT NULL default 0,
- log_title varchar(255) binary NOT NULL default '',
-
- -- Freeform text. Interpreted as edit history comments.
- log_comment varchar(255) NOT NULL default '',
-
- -- LF separated list of miscellaneous parameters
- log_params blob NOT NULL default '',
-
- KEY type_time (log_type, log_timestamp),
- KEY user_time (log_user, log_timestamp),
- KEY page_time (log_namespace, log_title, log_timestamp)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'log_type' => MW_UPGRADE_COPY,
- 'log_action' => MW_UPGRADE_COPY,
- 'log_timestamp' => MW_UPGRADE_COPY,
- 'log_user' => MW_UPGRADE_COPY,
- 'log_namespace' => MW_UPGRADE_COPY,
- 'log_title' => MW_UPGRADE_ENCODE,
- 'log_comment' => MW_UPGRADE_ENCODE,
- 'log_params' => MW_UPGRADE_ENCODE );
- $this->copyTable( 'logging', $tabledef, $fields );
- }
-
- function upgradeArchive() {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- ar_namespace int NOT NULL default '0',
- ar_title varchar(255) binary NOT NULL default '',
- ar_text mediumblob NOT NULL default '',
-
- ar_comment tinyblob NOT NULL default '',
- ar_user int(5) unsigned NOT NULL default '0',
- ar_user_text varchar(255) binary NOT NULL,
- ar_timestamp char(14) binary NOT NULL default '',
- ar_minor_edit tinyint(1) NOT NULL default '0',
-
- ar_flags tinyblob NOT NULL default '',
-
- ar_rev_id int(8) unsigned,
- ar_text_id int(8) unsigned,
-
- KEY name_title_timestamp (ar_namespace,ar_title,ar_timestamp)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'ar_namespace' => MW_UPGRADE_COPY,
- 'ar_title' => MW_UPGRADE_ENCODE,
- 'ar_text' => MW_UPGRADE_COPY,
- 'ar_comment' => MW_UPGRADE_ENCODE,
- 'ar_user' => MW_UPGRADE_COPY,
- 'ar_user_text' => MW_UPGRADE_ENCODE,
- 'ar_timestamp' => MW_UPGRADE_COPY,
- 'ar_minor_edit' => MW_UPGRADE_COPY,
- 'ar_flags' => MW_UPGRADE_COPY,
- 'ar_rev_id' => MW_UPGRADE_NULL,
- 'ar_text_id' => MW_UPGRADE_NULL );
- $this->copyTable( 'archive', $tabledef, $fields );
- }
-
- function upgradeImagelinks() {
- global $wgUseLatin1;
- if( $wgUseLatin1 ) {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- -- Key to page_id of the page containing the image / media link.
- il_from int(8) unsigned NOT NULL default '0',
-
- -- Filename of target image.
- -- This is also the page_title of the file's description page;
- -- all such pages are in namespace 6 (NS_FILE).
- il_to varchar(255) binary NOT NULL default '',
-
- UNIQUE KEY il_from(il_from,il_to),
- KEY (il_to)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'il_from' => MW_UPGRADE_COPY,
- 'il_to' => MW_UPGRADE_ENCODE );
- $this->copyTable( 'imagelinks', $tabledef, $fields );
- }
- }
-
- function upgradeCategorylinks() {
- global $wgUseLatin1;
- if( $wgUseLatin1 ) {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- cl_from int(8) unsigned NOT NULL default '0',
- cl_to varchar(255) binary NOT NULL default '',
- cl_sortkey varchar(86) binary NOT NULL default '',
- cl_timestamp timestamp NOT NULL,
-
- UNIQUE KEY cl_from(cl_from,cl_to),
- KEY cl_sortkey(cl_to,cl_sortkey),
- KEY cl_timestamp(cl_to,cl_timestamp)
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'cl_from' => MW_UPGRADE_COPY,
- 'cl_to' => MW_UPGRADE_ENCODE,
- 'cl_sortkey' => MW_UPGRADE_ENCODE,
- 'cl_timestamp' => MW_UPGRADE_COPY );
- $this->copyTable( 'categorylinks', $tabledef, $fields );
- }
- }
-
- function upgradeIpblocks() {
- global $wgUseLatin1;
- if( $wgUseLatin1 ) {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- ipb_id int(8) NOT NULL auto_increment,
- ipb_address varchar(40) binary NOT NULL default '',
- ipb_user int(8) unsigned NOT NULL default '0',
- ipb_by int(8) unsigned NOT NULL default '0',
- ipb_reason tinyblob NOT NULL default '',
- ipb_timestamp char(14) binary NOT NULL default '',
- ipb_auto tinyint(1) NOT NULL default '0',
- ipb_expiry char(14) binary NOT NULL default '',
-
- PRIMARY KEY ipb_id (ipb_id),
- INDEX ipb_address (ipb_address),
- INDEX ipb_user (ipb_user)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'ipb_id' => MW_UPGRADE_COPY,
- 'ipb_address' => MW_UPGRADE_COPY,
- 'ipb_user' => MW_UPGRADE_COPY,
- 'ipb_by' => MW_UPGRADE_COPY,
- 'ipb_reason' => MW_UPGRADE_ENCODE,
- 'ipb_timestamp' => MW_UPGRADE_COPY,
- 'ipb_auto' => MW_UPGRADE_COPY,
- 'ipb_expiry' => MW_UPGRADE_COPY );
- $this->copyTable( 'ipblocks', $tabledef, $fields );
- }
- }
-
- function upgradeRecentchanges() {
- // There's a format change in the namespace field
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- rc_id int(8) NOT NULL auto_increment,
- rc_timestamp varchar(14) binary NOT NULL default '',
- rc_cur_time varchar(14) binary NOT NULL default '',
-
- rc_user int(10) unsigned NOT NULL default '0',
- rc_user_text varchar(255) binary NOT NULL default '',
-
- rc_namespace int NOT NULL default '0',
- rc_title varchar(255) binary NOT NULL default '',
-
- rc_comment varchar(255) binary NOT NULL default '',
- rc_minor tinyint(3) unsigned NOT NULL default '0',
-
- rc_bot tinyint(3) unsigned NOT NULL default '0',
- rc_new tinyint(3) unsigned NOT NULL default '0',
-
- rc_cur_id int(10) unsigned NOT NULL default '0',
- rc_this_oldid int(10) unsigned NOT NULL default '0',
- rc_last_oldid int(10) unsigned NOT NULL default '0',
-
- rc_type tinyint(3) unsigned NOT NULL default '0',
- rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
- rc_moved_to_title varchar(255) binary NOT NULL default '',
-
- rc_patrolled tinyint(3) unsigned NOT NULL default '0',
-
- rc_ip char(15) NOT NULL default '',
-
- PRIMARY KEY rc_id (rc_id),
- INDEX rc_timestamp (rc_timestamp),
- INDEX rc_namespace_title (rc_namespace, rc_title),
- INDEX rc_cur_id (rc_cur_id),
- INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
- INDEX rc_ip (rc_ip)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'rc_id' => MW_UPGRADE_COPY,
- 'rc_timestamp' => MW_UPGRADE_COPY,
- 'rc_cur_time' => MW_UPGRADE_COPY,
- 'rc_user' => MW_UPGRADE_COPY,
- 'rc_user_text' => MW_UPGRADE_ENCODE,
- 'rc_namespace' => MW_UPGRADE_COPY,
- 'rc_title' => MW_UPGRADE_ENCODE,
- 'rc_comment' => MW_UPGRADE_ENCODE,
- 'rc_minor' => MW_UPGRADE_COPY,
- 'rc_bot' => MW_UPGRADE_COPY,
- 'rc_new' => MW_UPGRADE_COPY,
- 'rc_cur_id' => MW_UPGRADE_COPY,
- 'rc_this_oldid' => MW_UPGRADE_COPY,
- 'rc_last_oldid' => MW_UPGRADE_COPY,
- 'rc_type' => MW_UPGRADE_COPY,
- 'rc_moved_to_ns' => MW_UPGRADE_COPY,
- 'rc_moved_to_title' => MW_UPGRADE_ENCODE,
- 'rc_patrolled' => MW_UPGRADE_COPY,
- 'rc_ip' => MW_UPGRADE_COPY );
- $this->copyTable( 'recentchanges', $tabledef, $fields );
- }
-
- function upgradeQuerycache() {
- // There's a format change in the namespace field
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- -- A key name, generally the base name of of the special page.
- qc_type char(32) NOT NULL,
-
- -- Some sort of stored value. Sizes, counts...
- qc_value int(5) unsigned NOT NULL default '0',
-
- -- Target namespace+title
- qc_namespace int NOT NULL default '0',
- qc_title char(255) binary NOT NULL default '',
-
- KEY (qc_type,qc_value)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'qc_type' => MW_UPGRADE_COPY,
- 'qc_value' => MW_UPGRADE_COPY,
- 'qc_namespace' => MW_UPGRADE_COPY,
- 'qc_title' => MW_UPGRADE_ENCODE );
- $this->copyTable( 'querycache', $tabledef, $fields );
- }
-
- /**
- * Rename all our temporary tables into final place.
- * We've left things in place so a read-only wiki can continue running
- * on the old code during all this.
- */
- function upgradeCleanup() {
- $this->renameTable( 'old', 'text' );
-
- foreach( $this->cleanupSwaps as $table ) {
- $this->swap( $table );
- }
- }
-
- function renameTable( $from, $to ) {
- $this->log( "Renaming $from to $to..." );
-
- $fromtable = $this->dbw->tableName( $from );
- $totable = $this->dbw->tableName( $to );
- $this->dbw->query( "ALTER TABLE $fromtable RENAME TO $totable" );
- }
-
- function swap( $base ) {
- $this->renameTable( $base, "{$base}_old" );
- $this->renameTable( "{$base}_temp", $base );
- }
-
-}
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index ee35df7c..d7297e98 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -6,16 +6,27 @@
*/
// Define this so scripts can easily find doMaintenance.php
-define( 'DO_MAINTENANCE', dirname( __FILE__ ) . '/doMaintenance.php' );
+define( 'RUN_MAINTENANCE_IF_MAIN', dirname( __FILE__ ) . '/doMaintenance.php' );
+define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
+
$maintClass = false;
// Make sure we're on PHP5 or better
-if( version_compare( PHP_VERSION, '5.0.0' ) < 0 ) {
- echo( "Sorry! This version of MediaWiki requires PHP 5; you are running " .
+if ( version_compare( PHP_VERSION, '5.2.3' ) < 0 ) {
+ die ( "Sorry! This version of MediaWiki requires PHP 5.2.3; you are running " .
PHP_VERSION . ".\n\n" .
- "If you are sure you already have PHP 5 installed, it may be installed\n" .
- "in a different path from PHP 4. Check with your system administrator.\n" );
- die();
+ "If you are sure you already have PHP 5.2.3 or higher installed, it may be\n" .
+ "installed in a different path from PHP " . PHP_VERSION . ". Check with your system\n" .
+ "administrator.\n" );
+}
+
+// Wrapper for posix_isatty()
+if ( !function_exists( 'posix_isatty' ) ) {
+ # We default as considering stdin a tty (for nice readline methods)
+ # but treating stout as not a tty to avoid color codes
+ function posix_isatty( $fd ) {
+ return !$fd;
+ }
}
/**
@@ -93,15 +104,38 @@ abstract class Maintenance {
protected static $mCoreScripts = null;
/**
- * Default constructor. Children should call this if implementing
+ * Default constructor. Children should call this *first* if implementing
* their own constructors
*/
public function __construct() {
+ // Setup $IP, using MW_INSTALL_PATH if it exists
+ global $IP;
+ $IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== ''
+ ? getenv( 'MW_INSTALL_PATH' )
+ : realpath( dirname( __FILE__ ) . '/..' );
+
$this->addDefaultParams();
register_shutdown_function( array( $this, 'outputChanneled' ), false );
}
/**
+ * Should we execute the maintenance script, or just allow it to be included
+ * as a standalone class? It checks that the call stack only includes this
+ * function and a require (meaning was called from the file scope)
+ *
+ * @return Boolean
+ */
+ public static function shouldExecute() {
+ $bt = debug_backtrace();
+ if( count( $bt ) !== 2 ) {
+ return false;
+ }
+ return $bt[1]['function'] == 'require_once' &&
+ $bt[0]['class'] == 'Maintenance' &&
+ $bt[0]['function'] == 'shouldExecute';
+ }
+
+ /**
* Do the actual work. All child classes will need to implement this
*/
abstract public function execute();
@@ -110,10 +144,10 @@ abstract class Maintenance {
* Add a parameter to the script. Will be displayed on --help
* with the associated description
*
- * @param $name String The name of the param (help, version, etc)
- * @param $description String The description of the param to show on --help
- * @param $required boolean Is the param required?
- * @param $withArg Boolean Is an argument required with this option?
+ * @param $name String: the name of the param (help, version, etc)
+ * @param $description String: the description of the param to show on --help
+ * @param $required Boolean: is the param required?
+ * @param $withArg Boolean: is an argument required with this option?
*/
protected function addOption( $name, $description, $required = false, $withArg = false ) {
$this->mParams[$name] = array( 'desc' => $description, 'require' => $required, 'withArg' => $withArg );
@@ -121,8 +155,8 @@ abstract class Maintenance {
/**
* Checks to see if a particular param exists.
- * @param $name String The name of the param
- * @return boolean
+ * @param $name String: the name of the param
+ * @return Boolean
*/
protected function hasOption( $name ) {
return isset( $this->mOptions[$name] );
@@ -130,12 +164,12 @@ abstract class Maintenance {
/**
* Get an option, or return the default
- * @param $name String The name of the param
- * @param $default mixed Anything you want, default null
- * @return mixed
+ * @param $name String: the name of the param
+ * @param $default Mixed: anything you want, default null
+ * @return Mixed
*/
protected function getOption( $name, $default = null ) {
- if( $this->hasOption( $name ) ) {
+ if ( $this->hasOption( $name ) ) {
return $this->mOptions[$name];
} else {
// Set it so we don't have to provide the default again
@@ -146,22 +180,38 @@ abstract class Maintenance {
/**
* Add some args that are needed
- * @param $arg String Name of the arg, like 'start'
- * @param $description String Short description of the arg
- * @param $required Boolean Is this required?
+ * @param $arg String: name of the arg, like 'start'
+ * @param $description String: short description of the arg
+ * @param $required Boolean: is this required?
*/
protected function addArg( $arg, $description, $required = true ) {
- $this->mArgList[] = array(
+ $this->mArgList[] = array(
'name' => $arg,
- 'desc' => $description,
- 'require' => $required
+ 'desc' => $description,
+ 'require' => $required
);
}
/**
+ * Remove an option. Useful for removing options that won't be used in your script.
+ * @param $name String: the option to remove.
+ */
+ protected function deleteOption( $name ) {
+ unset( $this->mParams[$name] );
+ }
+
+ /**
+ * Set the description text.
+ * @param $text String: the text of the description
+ */
+ protected function addDescription( $text ) {
+ $this->mDescription = $text;
+ }
+
+ /**
* Does a given argument exist?
- * @param $argId int The integer value (from zero) for the arg
- * @return boolean
+ * @param $argId Integer: the integer value (from zero) for the arg
+ * @return Boolean
*/
protected function hasArg( $argId = 0 ) {
return isset( $this->mArgs[$argId] );
@@ -169,8 +219,8 @@ abstract class Maintenance {
/**
* Get an argument.
- * @param $argId int The integer value (from zero) for the arg
- * @param $default mixed The default if it doesn't exist
+ * @param $argId Integer: the integer value (from zero) for the arg
+ * @param $default Mixed: the default if it doesn't exist
* @return mixed
*/
protected function getArg( $argId = 0, $default = null ) {
@@ -179,7 +229,7 @@ abstract class Maintenance {
/**
* Set the batch size.
- * @param $s int The number of operations to do in a batch
+ * @param $s Integer: the number of operations to do in a batch
*/
protected function setBatchSize( $s = 0 ) {
$this->mBatchSize = $s;
@@ -195,33 +245,42 @@ abstract class Maintenance {
/**
* Return input from stdin.
- * @param $length int The number of bytes to read. If null,
+ * @param $len Integer: the number of bytes to read. If null,
* just return the handle. Maintenance::STDIN_ALL returns
* the full length
- * @return mixed
+ * @return Mixed
*/
protected function getStdin( $len = null ) {
- if ( $len == Maintenance::STDIN_ALL )
+ if ( $len == Maintenance::STDIN_ALL ) {
return file_get_contents( 'php://stdin' );
+ }
$f = fopen( 'php://stdin', 'rt' );
- if( !$len )
+ if ( !$len ) {
return $f;
+ }
$input = fgets( $f, $len );
fclose( $f );
return rtrim( $input );
}
+ public function isQuiet() {
+ return $this->mQuiet;
+ }
+
/**
* Throw some output to the user. Scripts can call this with no fears,
* as we handle all --quiet stuff here
- * @param $out String The text to show to the user
- * @param $channel Mixed Unique identifier for the channel. See function outputChanneled.
+ * @param $out String: the text to show to the user
+ * @param $channel Mixed: unique identifier for the channel. See
+ * function outputChanneled.
*/
protected function output( $out, $channel = null ) {
- if( $this->mQuiet ) {
+ if ( $this->mQuiet ) {
return;
}
if ( $channel === null ) {
+ $this->cleanupChanneled();
+
$f = fopen( 'php://stdout', 'w' );
fwrite( $f, $out );
fclose( $f );
@@ -235,41 +294,54 @@ abstract class Maintenance {
/**
* Throw an error to the user. Doesn't respect --quiet, so don't use
* this for non-error output
- * @param $err String The error to display
- * @param $die boolean If true, go ahead and die out.
+ * @param $err String: the error to display
+ * @param $die Boolean: If true, go ahead and die out.
*/
protected function error( $err, $die = false ) {
$this->outputChanneled( false );
if ( php_sapi_name() == 'cli' ) {
fwrite( STDERR, $err . "\n" );
} else {
- $f = fopen( 'php://stderr', 'w' );
+ $f = fopen( 'php://stderr', 'w' );
fwrite( $f, $err . "\n" );
fclose( $f );
}
- if( $die ) die();
+ if ( $die ) {
+ die();
+ }
}
private $atLineStart = true;
private $lastChannel = null;
-
+
+ /**
+ * Clean up channeled output. Output a newline if necessary.
+ */
+ public function cleanupChanneled() {
+ if ( !$this->atLineStart ) {
+ $handle = fopen( 'php://stdout', 'w' );
+ fwrite( $handle, "\n" );
+ fclose( $handle );
+ $this->atLineStart = true;
+ }
+ }
+
/**
* Message outputter with channeled message support. Messages on the
* same channel are concatenated, but any intervening messages in another
* channel start a new line.
- * @param $msg String The message without trailing newline
- * @param $channel Channel identifier or null for no channel. Channel comparison uses ===.
+ * @param $msg String: the message without trailing newline
+ * @param $channel Channel identifier or null for no
+ * channel. Channel comparison uses ===.
*/
public function outputChanneled( $msg, $channel = null ) {
- $handle = fopen( 'php://stdout', 'w' );
-
if ( $msg === false ) {
- // For cleanup
- if ( !$this->atLineStart ) fwrite( $handle, "\n" );
- fclose( $handle );
+ $this->cleanupChanneled();
return;
}
+ $handle = fopen( 'php://stdout', 'w' );
+
// End the current line if necessary
if ( !$this->atLineStart && $channel !== $this->lastChannel ) {
fwrite( $handle, "\n" );
@@ -292,12 +364,12 @@ abstract class Maintenance {
/**
* Does the script need different DB access? By default, we give Maintenance
* scripts normal rights to the DB. Sometimes, a script needs admin rights
- * access for a reason and sometimes they want no access. Subclasses should
+ * access for a reason and sometimes they want no access. Subclasses should
* override and return one of the following values, as needed:
* Maintenance::DB_NONE - For no DB access at all
* Maintenance::DB_STD - For normal DB access, default
* Maintenance::DB_ADMIN - For admin DB access
- * @return int
+ * @return Integer
*/
public function getDbType() {
return Maintenance::DB_STD;
@@ -307,44 +379,41 @@ abstract class Maintenance {
* Add the default parameters to the scripts
*/
protected function addDefaultParams() {
- $this->addOption( 'help', "Display this help message" );
- $this->addOption( 'quiet', "Whether to supress non-error output" );
- $this->addOption( 'conf', "Location of LocalSettings.php, if not default", false, true );
- $this->addOption( 'wiki', "For specifying the wiki ID", false, true );
- $this->addOption( 'globals', "Output globals at the end of processing for debugging" );
- $this->addOption( 'server', "The protocol and server name to use in URLs, e.g.\n" .
- "\t\thttp://en.wikipedia.org. This is sometimes necessary because\n" .
- "\t\tserver name detection may fail in command line scripts.", false, true );
+ $this->addOption( 'help', 'Display this help message' );
+ $this->addOption( 'quiet', 'Whether to supress non-error output' );
+ $this->addOption( 'conf', 'Location of LocalSettings.php, if not default', false, true );
+ $this->addOption( 'wiki', 'For specifying the wiki ID', false, true );
+ $this->addOption( 'globals', 'Output globals at the end of processing for debugging' );
+ $this->addOption( 'memory-limit', 'Set a specific memory limit for the script, "max" for no limit or "default" to avoid changing it' );
+ $this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
+ "http://en.wikipedia.org. This is sometimes necessary because " .
+ "server name detection may fail in command line scripts.", false, true );
// If we support a DB, show the options
- if( $this->getDbType() > 0 ) {
- $this->addOption( 'dbuser', "The DB user to use for this script", false, true );
- $this->addOption( 'dbpass', "The password to use for this script", false, true );
+ if ( $this->getDbType() > 0 ) {
+ $this->addOption( 'dbuser', 'The DB user to use for this script', false, true );
+ $this->addOption( 'dbpass', 'The password to use for this script', false, true );
}
// If we support $mBatchSize, show the option
- if( $this->mBatchSize ) {
+ if ( $this->mBatchSize ) {
$this->addOption( 'batch-size', 'Run this many operations ' .
- 'per batch, default: ' . $this->mBatchSize , false, true );
+ 'per batch, default: ' . $this->mBatchSize, false, true );
}
}
/**
* Run a child maintenance script. Pass all of the current arguments
* to it.
- * @param $maintClass String A name of a child maintenance class
- * @param $classFile String Full path of where the child is
+ * @param $maintClass String: a name of a child maintenance class
+ * @param $classFile String: full path of where the child is
* @return Maintenance child
*/
- protected function runChild( $maintClass, $classFile = null ) {
- // If we haven't already specified, kill setup procedures
- // for child scripts, we've already got a sane environment
- self::disableSetup();
-
+ public function runChild( $maintClass, $classFile = null ) {
// Make sure the class is loaded first
- if( !class_exists( $maintClass ) ) {
- if( $classFile ) {
+ if ( !class_exists( $maintClass ) ) {
+ if ( $classFile ) {
require_once( $classFile );
}
- if( !class_exists( $maintClass ) ) {
+ if ( !class_exists( $maintClass ) ) {
$this->error( "Cannot spawn child: $maintClass" );
}
}
@@ -355,34 +424,26 @@ abstract class Maintenance {
}
/**
- * Disable Setup.php mostly
- */
- protected static function disableSetup() {
- if( !defined( 'MW_NO_SETUP' ) )
- define( 'MW_NO_SETUP', true );
- }
-
- /**
* Do some sanity checking and basic setup
*/
public function setup() {
- global $IP, $wgCommandLineMode, $wgRequestTime;
+ global $wgCommandLineMode, $wgRequestTime;
# Abort if called from a web server
- if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
- $this->error( "This script must be run from the command line", true );
+ if ( isset( $_SERVER ) && isset( $_SERVER['REQUEST_METHOD'] ) ) {
+ $this->error( 'This script must be run from the command line', true );
}
# Make sure we can handle script parameters
- if( !ini_get( 'register_argc_argv' ) ) {
- $this->error( "Cannot get command line arguments, register_argc_argv is set to false", true );
+ if ( !ini_get( 'register_argc_argv' ) ) {
+ $this->error( 'Cannot get command line arguments, register_argc_argv is set to false', true );
}
- if( version_compare( phpversion(), '5.2.4' ) >= 0 ) {
+ if ( version_compare( phpversion(), '5.2.4' ) >= 0 ) {
// Send PHP warnings and errors to stderr instead of stdout.
// This aids in diagnosing problems, while keeping messages
// out of redirected output.
- if( ini_get( 'display_errors' ) ) {
+ if ( ini_get( 'display_errors' ) ) {
ini_set( 'display_errors', 'stderr' );
}
@@ -393,9 +454,12 @@ abstract class Maintenance {
// command-line mode is on, regardless of PHP version.
}
+ $this->loadParamsAndArgs();
+ $this->maybeHelp();
+
# Set the memory limit
# Note we need to set it again later in cache LocalSettings changed it
- ini_set( 'memory_limit', $this->memoryLimit() );
+ $this->adjustMemoryLimit();
# Set max execution time to 0 (no limit). PHP.net says that
# "When running PHP from the command line the default setting is 0."
@@ -407,27 +471,38 @@ abstract class Maintenance {
# Define us as being in MediaWiki
define( 'MEDIAWIKI', true );
- # Setup $IP, using MW_INSTALL_PATH if it exists
- $IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== ''
- ? getenv( 'MW_INSTALL_PATH' )
- : realpath( dirname( __FILE__ ) . '/..' );
-
$wgCommandLineMode = true;
# Turn off output buffering if it's on
@ob_end_flush();
- $this->loadParamsAndArgs();
- $this->maybeHelp();
$this->validateParamsAndArgs();
}
/**
* Normally we disable the memory_limit when running admin scripts.
* Some scripts may wish to actually set a limit, however, to avoid
- * blowing up unexpectedly.
+ * blowing up unexpectedly. We also support a --memory-limit option,
+ * to allow sysadmins to explicitly set one if they'd prefer to override
+ * defaults (or for people using Suhosin which yells at you for trying
+ * to disable the limits)
*/
public function memoryLimit() {
- return -1;
+ $limit = $this->getOption( 'memory-limit', 'max' );
+ $limit = trim( $limit, "\" '" ); // trim quotes in case someone misunderstood
+ return $limit;
+ }
+
+ /**
+ * Adjusts PHP's memory limit to better suit our needs, if needed.
+ */
+ protected function adjustMemoryLimit() {
+ $limit = $this->memoryLimit();
+ if ( $limit == 'max' ) {
+ $limit = -1; // no memory limit
+ }
+ if ( $limit != 'default' ) {
+ ini_set( 'memory_limit', $limit );
+ }
}
/**
@@ -450,15 +525,15 @@ abstract class Maintenance {
*/
public function loadParamsAndArgs( $self = null, $opts = null, $args = null ) {
# If we were given opts or args, set those and return early
- if( $self ) {
+ if ( $self ) {
$this->mSelf = $self;
$this->mInputLoaded = true;
}
- if( $opts ) {
+ if ( $opts ) {
$this->mOptions = $opts;
$this->mInputLoaded = true;
}
- if( $args ) {
+ if ( $args ) {
$this->mArgs = $args;
$this->mInputLoaded = true;
}
@@ -466,7 +541,7 @@ abstract class Maintenance {
# If we've already loaded input (either by user values or from $argv)
# skip on loading it again. The array_shift() will corrupt values if
# it's run again and again
- if( $this->mInputLoaded ) {
+ if ( $this->mInputLoaded ) {
$this->loadSpecialVars();
return;
}
@@ -478,11 +553,11 @@ abstract class Maintenance {
$args = array();
# Parse arguments
- for( $arg = reset( $argv ); $arg !== false; $arg = next( $argv ) ) {
+ for ( $arg = reset( $argv ); $arg !== false; $arg = next( $argv ) ) {
if ( $arg == '--' ) {
# End of options, remainder should be considered arguments
$arg = next( $argv );
- while( $arg !== false ) {
+ while ( $arg !== false ) {
$args[] = $arg;
$arg = next( $argv );
}
@@ -499,7 +574,7 @@ abstract class Maintenance {
$options[$option] = $param;
} else {
$bits = explode( '=', $option, 2 );
- if( count( $bits ) > 1 ) {
+ if ( count( $bits ) > 1 ) {
$option = $bits[0];
$param = $bits[1];
} else {
@@ -509,8 +584,8 @@ abstract class Maintenance {
}
} elseif ( substr( $arg, 0, 1 ) == '-' ) {
# Short options
- for ( $p=1; $p<strlen( $arg ); $p++ ) {
- $option = $arg{$p};
+ for ( $p = 1; $p < strlen( $arg ); $p++ ) {
+ $option = $arg { $p } ;
if ( isset( $this->mParams[$option]['withArg'] ) && $this->mParams[$option]['withArg'] ) {
$param = next( $argv );
if ( $param === false ) {
@@ -539,35 +614,41 @@ abstract class Maintenance {
protected function validateParamsAndArgs() {
$die = false;
# Check to make sure we've got all the required options
- foreach( $this->mParams as $opt => $info ) {
- if( $info['require'] && !$this->hasOption( $opt ) ) {
+ foreach ( $this->mParams as $opt => $info ) {
+ if ( $info['require'] && !$this->hasOption( $opt ) ) {
$this->error( "Param $opt required!" );
$die = true;
}
}
# Check arg list too
- foreach( $this->mArgList as $k => $info ) {
- if( $info['require'] && !$this->hasArg($k) ) {
- $this->error( "Argument <" . $info['name'] . "> required!" );
+ foreach ( $this->mArgList as $k => $info ) {
+ if ( $info['require'] && !$this->hasArg( $k ) ) {
+ $this->error( 'Argument <' . $info['name'] . '> required!' );
$die = true;
}
}
-
- if( $die ) $this->maybeHelp( true );
+
+ if ( $die ) {
+ $this->maybeHelp( true );
+ }
}
/**
* Handle the special variables that are global to all scripts
*/
protected function loadSpecialVars() {
- if( $this->hasOption( 'dbuser' ) )
+ if ( $this->hasOption( 'dbuser' ) ) {
$this->mDbUser = $this->getOption( 'dbuser' );
- if( $this->hasOption( 'dbpass' ) )
+ }
+ if ( $this->hasOption( 'dbpass' ) ) {
$this->mDbPass = $this->getOption( 'dbpass' );
- if( $this->hasOption( 'quiet' ) )
+ }
+ if ( $this->hasOption( 'quiet' ) ) {
$this->mQuiet = true;
- if( $this->hasOption( 'batch-size' ) )
+ }
+ if ( $this->hasOption( 'batch-size' ) ) {
$this->mBatchSize = $this->getOption( 'batch-size' );
+ }
}
/**
@@ -575,40 +656,62 @@ abstract class Maintenance {
* @param $force boolean Whether to force the help to show, default false
*/
protected function maybeHelp( $force = false ) {
- $screenWidth = 80; // TODO: Caculate this!
+ if( !$force && !$this->hasOption( 'help' ) ) {
+ return;
+ }
+
+ $screenWidth = 80; // TODO: Caculate this!
$tab = " ";
$descWidth = $screenWidth - ( 2 * strlen( $tab ) );
-
+
ksort( $this->mParams );
- if( $this->hasOption( 'help' ) || $force ) {
- $this->mQuiet = false;
+ $this->mQuiet = false;
- if( $this->mDescription ) {
- $this->output( "\n" . $this->mDescription . "\n" );
- }
- $output = "\nUsage: php " . basename( $this->mSelf );
- if( $this->mParams ) {
- $output .= " [--" . implode( array_keys( $this->mParams ), "|--" ) . "]";
- }
- if( $this->mArgList ) {
- $output .= " <";
- foreach( $this->mArgList as $k => $arg ) {
- $output .= $arg['name'] . ">";
- if( $k < count( $this->mArgList ) - 1 )
- $output .= " <";
+ // Description ...
+ if ( $this->mDescription ) {
+ $this->output( "\n" . $this->mDescription . "\n" );
+ }
+ $output = "\nUsage: php " . basename( $this->mSelf );
+
+ // ... append parameters ...
+ if ( $this->mParams ) {
+ $output .= " [--" . implode( array_keys( $this->mParams ), "|--" ) . "]";
+ }
+
+ // ... and append arguments.
+ if ( $this->mArgList ) {
+ $output .= ' ';
+ foreach ( $this->mArgList as $k => $arg ) {
+ if ( $arg['require'] ) {
+ $output .= '<' . $arg['name'] . '>';
+ } else {
+ $output .= '[' . $arg['name'] . ']';
}
+ if ( $k < count( $this->mArgList ) - 1 )
+ $output .= ' ';
}
- $this->output( "$output\n" );
- foreach( $this->mParams as $par => $info ) {
- $this->output( wordwrap( "$tab$par : " . $info['desc'], $descWidth,
- "\n$tab$tab" ) . "\n" );
- }
- foreach( $this->mArgList as $info ) {
- $this->output( wordwrap( "$tab<" . $info['name'] . "> : " .
- $info['desc'], $descWidth, "\n$tab$tab" ) . "\n" );
- }
- die( 1 );
}
+ $this->output( "$output\n\n" );
+
+ // Parameters description
+ foreach ( $this->mParams as $par => $info ) {
+ $this->output(
+ wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
+ "\n$tab$tab" ) . "\n"
+ );
+ }
+
+ // Arguments description
+ foreach ( $this->mArgList as $info ) {
+ $openChar = $info['require'] ? '<' : '[';
+ $closeChar = $info['require'] ? '>' : ']';
+ $this->output(
+ wordwrap( "$tab$openChar" . $info['name'] . "$closeChar: " .
+ $info['desc'], $descWidth, "\n$tab$tab" ) . "\n"
+ );
+ }
+
+ die( 1 );
}
/**
@@ -616,11 +719,11 @@ abstract class Maintenance {
*/
public function finalSetup() {
global $wgCommandLineMode, $wgShowSQLErrors, $wgServer;
- global $wgTitle, $wgProfiling, $IP, $wgDBadminuser, $wgDBadminpassword;
+ global $wgProfiling, $wgDBadminuser, $wgDBadminpassword;
global $wgDBuser, $wgDBpassword, $wgDBservers, $wgLBFactoryConf;
# Turn off output buffering again, it might have been turned on in the settings files
- if( ob_get_level() ) {
+ if ( ob_get_level() ) {
ob_end_flush();
}
# Same with these
@@ -632,45 +735,54 @@ abstract class Maintenance {
}
# If these were passed, use them
- if( $this->mDbUser )
+ if ( $this->mDbUser ) {
$wgDBadminuser = $this->mDbUser;
- if( $this->mDbPass )
+ }
+ if ( $this->mDbPass ) {
$wgDBadminpassword = $this->mDbPass;
+ }
if ( $this->getDbType() == self::DB_ADMIN && isset( $wgDBadminuser ) ) {
$wgDBuser = $wgDBadminuser;
$wgDBpassword = $wgDBadminpassword;
- if( $wgDBservers ) {
+ if ( $wgDBservers ) {
foreach ( $wgDBservers as $i => $server ) {
$wgDBservers[$i]['user'] = $wgDBuser;
$wgDBservers[$i]['password'] = $wgDBpassword;
}
}
- if( isset( $wgLBFactoryConf['serverTemplate'] ) ) {
+ if ( isset( $wgLBFactoryConf['serverTemplate'] ) ) {
$wgLBFactoryConf['serverTemplate']['user'] = $wgDBuser;
$wgLBFactoryConf['serverTemplate']['password'] = $wgDBpassword;
}
+ LBFactory::destroyInstance();
}
- if ( defined( 'MW_CMDLINE_CALLBACK' ) ) {
- $fn = MW_CMDLINE_CALLBACK;
- $fn();
- }
+ $this->afterFinalSetup();
$wgShowSQLErrors = true;
@set_time_limit( 0 );
- ini_set( 'memory_limit', $this->memoryLimit() );
+ $this->adjustMemoryLimit();
$wgProfiling = false; // only for Profiler.php mode; avoids OOM errors
}
/**
+ * Execute a callback function at the end of initialisation
+ */
+ protected function afterFinalSetup() {
+ if ( defined( 'MW_CMDLINE_CALLBACK' ) ) {
+ call_user_func( MW_CMDLINE_CALLBACK );
+ }
+ }
+
+ /**
* Potentially debug globals. Originally a feature only
* for refreshLinks
*/
public function globals() {
- if( $this->hasOption( 'globals' ) ) {
+ if ( $this->hasOption( 'globals' ) ) {
print_r( $GLOBALS );
}
}
@@ -711,13 +823,12 @@ abstract class Maintenance {
# This is for the IRC scripts, which now run as the apache user
# The apache user doesn't have access to the wikiadmin_pass command
if ( $_ENV['USER'] == 'apache' ) {
- #if ( posix_geteuid() == 48 ) {
+ # if ( posix_geteuid() == 48 ) {
$wgUseNormalUser = true;
}
putenv( 'wikilang=' . $lang );
- $DP = $IP;
ini_set( 'include_path', ".:$IP:$IP/includes:$IP/languages:$IP/maintenance" );
if ( $lang == 'test' && $site == 'wikipedia' ) {
@@ -730,11 +841,13 @@ abstract class Maintenance {
* @return String
*/
public function loadSettings() {
- global $wgWikiFarm, $wgCommandLineMode, $IP, $DP;
+ global $wgWikiFarm, $wgCommandLineMode, $IP;
$wgWikiFarm = false;
if ( isset( $this->mOptions['conf'] ) ) {
$settingsFile = $this->mOptions['conf'];
+ } else if ( defined("MW_CONFIG_FILE") ) {
+ $settingsFile = MW_CONFIG_FILE;
} else {
$settingsFile = "$IP/LocalSettings.php";
}
@@ -749,19 +862,19 @@ abstract class Maintenance {
if ( !is_readable( $settingsFile ) ) {
$this->error( "A copy of your installation's LocalSettings.php\n" .
- "must exist and be readable in the source directory.", true );
+ "must exist and be readable in the source directory.\n" .
+ "Use --conf to specify it." , true );
}
$wgCommandLineMode = true;
- $DP = $IP;
return $settingsFile;
}
/**
* Support function for cleaning up redundant text records
- * @param $delete boolean Whether or not to actually delete the records
+ * @param $delete Boolean: whether or not to actually delete the records
* @author Rob Church <robchur@gmail.com>
*/
- protected function purgeRedundantText( $delete = true ) {
+ public function purgeRedundantText( $delete = true ) {
# Data should come off the master, wrapped in a transaction
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
@@ -771,27 +884,27 @@ abstract class Maintenance {
$tbl_txt = $dbw->tableName( 'text' );
# Get "active" text records from the revisions table
- $this->output( "Searching for active text records in revisions table..." );
+ $this->output( 'Searching for active text records in revisions table...' );
$res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$cur[] = $row->rev_text_id;
}
$this->output( "done.\n" );
# Get "active" text records from the archive table
- $this->output( "Searching for active text records in archive table..." );
+ $this->output( 'Searching for active text records in archive table...' );
$res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$cur[] = $row->ar_text_id;
}
$this->output( "done.\n" );
# Get the IDs of all text records not in these sets
- $this->output( "Searching for inactive text records..." );
+ $this->output( 'Searching for inactive text records...' );
$set = implode( ', ', $cur );
$res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" );
$old = array();
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$old[] = $row->old_id;
}
$this->output( "done.\n" );
@@ -801,8 +914,8 @@ abstract class Maintenance {
$this->output( "$count inactive items found.\n" );
# Delete as appropriate
- if( $delete && $count ) {
- $this->output( "Deleting..." );
+ if ( $delete && $count ) {
+ $this->output( 'Deleting...' );
$set = implode( ', ', $old );
$dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
$this->output( "done.\n" );
@@ -823,7 +936,7 @@ abstract class Maintenance {
* Get the list of available maintenance scripts. Note
* that if you call this _before_ calling doMaintenance
* you won't have any extensions in it yet
- * @return array
+ * @return Array
*/
public static function getMaintenanceScripts() {
global $wgMaintenanceScripts;
@@ -835,8 +948,7 @@ abstract class Maintenance {
* @return array
*/
protected static function getCoreScripts() {
- if( !self::$mCoreScripts ) {
- self::disableSetup();
+ if ( !self::$mCoreScripts ) {
$paths = array(
dirname( __FILE__ ),
dirname( __FILE__ ) . '/gearman',
@@ -844,19 +956,20 @@ abstract class Maintenance {
dirname( __FILE__ ) . '/storage',
);
self::$mCoreScripts = array();
- foreach( $paths as $p ) {
+ foreach ( $paths as $p ) {
$handle = opendir( $p );
- while( ( $file = readdir( $handle ) ) !== false ) {
- if( $file == 'Maintenance.php' )
+ while ( ( $file = readdir( $handle ) ) !== false ) {
+ if ( $file == 'Maintenance.php' ) {
continue;
+ }
$file = $p . '/' . $file;
- if( is_dir( $file ) || !strpos( $file, '.php' ) ||
+ if ( is_dir( $file ) || !strpos( $file, '.php' ) ||
( strpos( file_get_contents( $file ), '$maintClass' ) === false ) ) {
continue;
}
require( $file );
$vars = get_defined_vars();
- if( array_key_exists( 'maintClass', $vars ) ) {
+ if ( array_key_exists( 'maintClass', $vars ) ) {
self::$mCoreScripts[$vars['maintClass']] = $file;
}
}
@@ -865,4 +978,167 @@ abstract class Maintenance {
}
return self::$mCoreScripts;
}
+
+ /**
+ * Lock the search index
+ * @param &$db Database object
+ */
+ private function lockSearchindex( &$db ) {
+ $write = array( 'searchindex' );
+ $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache' );
+ $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
+ }
+
+ /**
+ * Unlock the tables
+ * @param &$db Database object
+ */
+ private function unlockSearchindex( &$db ) {
+ $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
+ }
+
+ /**
+ * Unlock and lock again
+ * Since the lock is low-priority, queued reads will be able to complete
+ * @param &$db Database object
+ */
+ private function relockSearchindex( &$db ) {
+ $this->unlockSearchindex( $db );
+ $this->lockSearchindex( $db );
+ }
+
+ /**
+ * Perform a search index update with locking
+ * @param $maxLockTime Integer: the maximum time to keep the search index locked.
+ * @param $callback callback String: the function that will update the function.
+ * @param $dbw Database object
+ * @param $results
+ */
+ public function updateSearchIndex( $maxLockTime, $callback, $dbw, $results ) {
+ $lockTime = time();
+
+ # Lock searchindex
+ if ( $maxLockTime ) {
+ $this->output( " --- Waiting for lock ---" );
+ $this->lockSearchindex( $dbw );
+ $lockTime = time();
+ $this->output( "\n" );
+ }
+
+ # Loop through the results and do a search update
+ foreach ( $results as $row ) {
+ # Allow reads to be processed
+ if ( $maxLockTime && time() > $lockTime + $maxLockTime ) {
+ $this->output( " --- Relocking ---" );
+ $this->relockSearchindex( $dbw );
+ $lockTime = time();
+ $this->output( "\n" );
+ }
+ call_user_func( $callback, $dbw, $row );
+ }
+
+ # Unlock searchindex
+ if ( $maxLockTime ) {
+ $this->output( " --- Unlocking --" );
+ $this->unlockSearchindex( $dbw );
+ $this->output( "\n" );
+ }
+
+ }
+
+ /**
+ * Update the searchindex table for a given pageid
+ * @param $dbw Database: a database write handle
+ * @param $pageId Integer: the page ID to update.
+ */
+ public function updateSearchIndexForPage( $dbw, $pageId ) {
+ // Get current revision
+ $rev = Revision::loadFromPageId( $dbw, $pageId );
+ $title = null;
+ if ( $rev ) {
+ $titleObj = $rev->getTitle();
+ $title = $titleObj->getPrefixedDBkey();
+ $this->output( "$title..." );
+ # Update searchindex
+ $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getText() );
+ $u->doUpdate();
+ $this->output( "\n" );
+ }
+ return $title;
+ }
+
+ /**
+ * Prompt the console for input
+ * @param $prompt String what to begin the line with, like '> '
+ * @return String response
+ */
+ public static function readconsole( $prompt = '> ' ) {
+ static $isatty = null;
+ if ( is_null( $isatty ) ) {
+ if ( posix_isatty( 0 /*STDIN*/ ) ) {
+ $isatty = true;
+ } else {
+ $isatty = false;
+ }
+ }
+
+ if ( $isatty && function_exists( 'readline' ) ) {
+ return readline( $prompt );
+ } else {
+ if ( $isatty ) {
+ $st = self::readlineEmulation( $prompt );
+ } else {
+ if ( feof( STDIN ) ) {
+ $st = false;
+ } else {
+ $st = fgets( STDIN, 1024 );
+ }
+ }
+ if ( $st === false ) return false;
+ $resp = trim( $st );
+ return $resp;
+ }
+ }
+
+ /**
+ * Emulate readline()
+ * @param $prompt String what to begin the line with, like '> '
+ * @return String
+ */
+ private static function readlineEmulation( $prompt ) {
+ $bash = Installer::locateExecutableInDefaultPaths( array( 'bash' ) );
+ if ( !wfIsWindows() && $bash ) {
+ $retval = false;
+ $encPrompt = wfEscapeShellArg( $prompt );
+ $command = "read -er -p $encPrompt && echo \"\$REPLY\"";
+ $encCommand = wfEscapeShellArg( $command );
+ $line = wfShellExec( "$bash -c $encCommand", $retval );
+
+ if ( $retval == 0 ) {
+ return $line;
+ } elseif ( $retval == 127 ) {
+ // Couldn't execute bash even though we thought we saw it.
+ // Shell probably spit out an error message, sorry :(
+ // Fall through to fgets()...
+ } else {
+ // EOF/ctrl+D
+ return false;
+ }
+ }
+
+ // Fallback... we'll have no editing controls, EWWW
+ if ( feof( STDIN ) ) {
+ return false;
+ }
+ print $prompt;
+ return fgets( STDIN, 1024 );
+ }
}
+
+class FakeMaintenance extends Maintenance {
+ protected $mSelf = "FakeMaintenanceScript";
+ public function execute() {
+ return;
+ }
+}
+
diff --git a/maintenance/Makefile b/maintenance/Makefile
index 82476139..a92751c9 100644
--- a/maintenance/Makefile
+++ b/maintenance/Makefile
@@ -3,7 +3,7 @@ help:
@echo "Run 'make doc' to run the doxygen generation."
test:
- php parserTests.php --quiet
+ php tests/parserTests.php --quiet
doc:
php mwdocgen.php --all
diff --git a/maintenance/addwiki.php b/maintenance/addwiki.php
index 0cb4d74a..e86a8c5d 100644
--- a/maintenance/addwiki.php
+++ b/maintenance/addwiki.php
@@ -27,15 +27,16 @@
* @ingroup Wikimedia
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class AddWiki extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Add a new wiki to the family. Wikimedia specific!";
- $this->addArg( 'language', 'Language code of new site' );
- $this->addArg( 'site', 'Type of site' );
- $this->addArg( 'dbname', 'Name of database to create' );
+ $this->addArg( 'language', 'Language code of new site, e.g. en' );
+ $this->addArg( 'site', 'Type of site, e.g. wikipedia' );
+ $this->addArg( 'dbname', 'Name of database to create, e.g. enwiki' );
+ $this->addArg( 'domain', 'Domain name of the wiki, e.g. en.wikipedia.org' );
}
public function getDbType() {
@@ -43,17 +44,19 @@ class AddWiki extends Maintenance {
}
public function execute() {
- global $IP, $wgLanguageNames, $wgDefaultExternalStore, $wgNoDBParam;
+ global $IP, $wgDefaultExternalStore, $wgNoDBParam;
$wgNoDBParam = true;
- $lang = $this->getArg(0);
- $site = $this->getArg(1);
- $dbName = $this->getArg(2);
+ $lang = $this->getArg( 0 );
+ $site = $this->getArg( 1 );
+ $dbName = $this->getArg( 2 );
+ $domain = $this->getArg( 3 );
+ $languageNames = Language::getLanguageNames();
- if ( !isset( $wgLanguageNames[$lang] ) ) {
+ if ( !isset( $languageNames[$lang] ) ) {
$this->error( "Language $lang not found in \$wgLanguageNames", true );
}
- $name = $wgLanguageNames[$lang];
+ $name = $languageNames[$lang];
$dbw = wfGetDB( DB_MASTER );
$common = "/home/wikipedia/common";
@@ -80,13 +83,14 @@ class AddWiki extends Maintenance {
$dbw->sourceFile( "$IP/extensions/UsabilityInitiative/ClickTracking/ClickTrackingEvents.sql" );
$dbw->sourceFile( "$IP/extensions/UsabilityInitiative/ClickTracking/ClickTracking.sql" );
$dbw->sourceFile( "$IP/extensions/UsabilityInitiative/UserDailyContribs/UserDailyContribs.sql" );
+ $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/OptIn/OptIn.sql" );
$dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" );
# Initialise external storage
if ( is_array( $wgDefaultExternalStore ) ) {
$stores = $wgDefaultExternalStore;
- } elseif ( $stores ) {
+ } elseif ( $wgDefaultExternalStore ) {
$stores = array( $wgDefaultExternalStore );
} else {
$stores = array();
@@ -138,11 +142,21 @@ class AddWiki extends Maintenance {
fclose( $file );
# Update the sublists
- shell_exec("cd $common && ./refresh-dblist");
+ shell_exec( "cd $common && ./refresh-dblist" );
- #print "Constructing interwiki SQL\n";
+ # print "Constructing interwiki SQL\n";
# Rebuild interwiki tables
- #passthru( '/home/wikipedia/conf/interwiki/update' );
+ # passthru( '/home/wikipedia/conf/interwiki/update' );
+
+ $time = wfTimestamp( TS_RFC2822 );
+ // These arguments need to be escaped twice: once for echo and once for at
+ $escDbName = wfEscapeShellArg( wfEscapeShellArg( $dbName ) );
+ $escTime = wfEscapeShellArg( wfEscapeShellArg( $time ) );
+ $escUcsite = wfEscapeShellArg( wfEscapeShellArg( $ucsite ) );
+ $escName = wfEscapeShellArg( wfEscapeShellArg( $name ) );
+ $escLang = wfEscapeShellArg( wfEscapeShellArg( $lang ) );
+ $escDomain = wfEscapeShellArg( wfEscapeShellArg( $domain ) );
+ shell_exec( "echo notifyNewProjects $escDbName $escTime $escUcsite $escName $escLang $escDomain | at now + 15 minutes" );
$this->output( "Script ended. You still have to:
* Add any required settings in InitialiseSettings.php
@@ -150,7 +164,7 @@ class AddWiki extends Maintenance {
* Run /home/wikipedia/conf/interwiki/update
" );
}
-
+
private function getFirstArticle( $ucsite, $name ) {
return <<<EOT
==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language==
@@ -451,4 +465,4 @@ EOT;
}
$maintClass = "AddWiki";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/archives/patch-archive_ar_revid.sql b/maintenance/archives/patch-archive_ar_revid.sql
new file mode 100644
index 00000000..67ee97b1
--- /dev/null
+++ b/maintenance/archives/patch-archive_ar_revid.sql
@@ -0,0 +1,4 @@
+-- Hopefully temporary index.
+-- For https://bugzilla.wikimedia.org/show_bug.cgi?id=21279
+ALTER TABLE /*$wgDBprefix*/archive
+ ADD INDEX ar_revid ( ar_rev_id ); \ No newline at end of file
diff --git a/maintenance/archives/patch-archive_kill_ar_page_revid.sql b/maintenance/archives/patch-archive_kill_ar_page_revid.sql
new file mode 100644
index 00000000..2e6fe453
--- /dev/null
+++ b/maintenance/archives/patch-archive_kill_ar_page_revid.sql
@@ -0,0 +1,4 @@
+-- Used for killing the wrong index added during SVN for 1.17
+-- Won't affect most people, but it doesn't need to exist
+ALTER TABLE /*$wgDBprefix*/archive
+ DROP INDEX ar_page_revid; \ No newline at end of file
diff --git a/maintenance/archives/patch-categorylinks-better-collation.sql b/maintenance/archives/patch-categorylinks-better-collation.sql
new file mode 100644
index 00000000..c1499c15
--- /dev/null
+++ b/maintenance/archives/patch-categorylinks-better-collation.sql
@@ -0,0 +1,19 @@
+--
+-- patch-categorylinks-better-collation.sql
+--
+-- Bugs 164, 1211, 23682. This is the second version of this patch; the
+-- changes are also incorporated into patch-categorylinks-better-collation2.sql,
+-- for the benefit of trunk users who applied the original.
+--
+-- Due to bug 25254, the length limit of 255 bytes for cl_sortkey_prefix
+-- is also enforced in php. If you change the length of that field, make
+-- sure to also change the check in LinksUpdate.php.
+ALTER TABLE /*$wgDBprefix*/categorylinks
+ CHANGE COLUMN cl_sortkey cl_sortkey varbinary(230) NOT NULL default '',
+ ADD COLUMN cl_sortkey_prefix varchar(255) binary NOT NULL default '',
+ ADD COLUMN cl_collation varbinary(32) NOT NULL default '',
+ ADD COLUMN cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page',
+ ADD INDEX (cl_collation),
+ DROP INDEX cl_sortkey,
+ ADD INDEX cl_sortkey (cl_to, cl_type, cl_sortkey, cl_from);
+INSERT IGNORE INTO /*$wgDBprefix*/updatelog (ul_key) VALUES ('cl_fields_update');
diff --git a/maintenance/archives/patch-categorylinks-better-collation2.sql b/maintenance/archives/patch-categorylinks-better-collation2.sql
new file mode 100644
index 00000000..e9574693
--- /dev/null
+++ b/maintenance/archives/patch-categorylinks-better-collation2.sql
@@ -0,0 +1,12 @@
+--
+-- patch-categorylinks-better-collation2.sql
+--
+-- Bugs 164, 1211, 23682. This patch exists for trunk users who already
+-- applied the first patch in its original version. The first patch was
+-- updated to incorporate the changes as well, so as not to do two alters on a
+-- large table unnecessarily for people upgrading from 1.16, so this will be
+-- skipped if unneeded.
+ALTER TABLE /*$wgDBprefix*/categorylinks
+ CHANGE COLUMN cl_sortkey cl_sortkey varbinary(230) NOT NULL default '',
+ CHANGE COLUMN cl_collation cl_collation varbinary(32) NOT NULL default '';
+INSERT IGNORE INTO /*$wgDBprefix*/updatelog (ul_key) VALUES ('cl_fields_update');
diff --git a/maintenance/archives/patch-iw_api_and_wikiid.sql b/maintenance/archives/patch-iw_api_and_wikiid.sql
new file mode 100644
index 00000000..4384a715
--- /dev/null
+++ b/maintenance/archives/patch-iw_api_and_wikiid.sql
@@ -0,0 +1,9 @@
+--
+-- Add iw_api and iw_wikiid to interwiki table
+--
+
+ALTER TABLE /*_*/interwiki
+ ADD iw_api BLOB NOT NULL;
+ALTER TABLE /*_*/interwiki
+ ADD iw_wikiid varchar(64) NOT NULL;
+
diff --git a/maintenance/archives/patch-iwlinks.sql b/maintenance/archives/patch-iwlinks.sql
new file mode 100644
index 00000000..89b34cb1
--- /dev/null
+++ b/maintenance/archives/patch-iwlinks.sql
@@ -0,0 +1,16 @@
+--
+-- Track inline interwiki links
+--
+CREATE TABLE /*_*/iwlinks (
+ -- page_id of the referring page
+ iwl_from int unsigned NOT NULL default 0,
+
+ -- Interwiki prefix code of the target
+ iwl_prefix varbinary(20) NOT NULL default '',
+
+ -- Title of the target, including namespace
+ iwl_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-kill-iwl_pft.sql b/maintenance/archives/patch-kill-iwl_pft.sql
new file mode 100644
index 00000000..96e14356
--- /dev/null
+++ b/maintenance/archives/patch-kill-iwl_pft.sql
@@ -0,0 +1,7 @@
+--
+-- Kill the old iwl_prefix_from_title index, which may be present on some
+-- installs if they ran update.php between it being added and being renamed
+--
+
+DROP INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks;
+
diff --git a/maintenance/archives/patch-kill-iwl_prefix.sql b/maintenance/archives/patch-kill-iwl_prefix.sql
new file mode 100644
index 00000000..1cd9b454
--- /dev/null
+++ b/maintenance/archives/patch-kill-iwl_prefix.sql
@@ -0,0 +1,7 @@
+--
+-- Kill the old iwl_prefix index, which may be present on some
+-- installs if they ran update.php between it being added and being renamed
+--
+
+DROP INDEX /*i*/iwl_prefix ON /*_*/iwlinks;
+
diff --git a/maintenance/archives/patch-langlinks-ll_lang-20.sql b/maintenance/archives/patch-langlinks-ll_lang-20.sql
new file mode 100644
index 00000000..ce026382
--- /dev/null
+++ b/maintenance/archives/patch-langlinks-ll_lang-20.sql
@@ -0,0 +1,3 @@
+ALTER TABLE /*$wgDBprefix*/langlinks
+ MODIFY `ll_lang`
+ VARBINARY(20) NOT NULL DEFAULT ''; \ No newline at end of file
diff --git a/maintenance/archives/patch-mime_minor_length.sql b/maintenance/archives/patch-mime_minor_length.sql
index 3a3c5c4f..8b63d1f0 100644
--- a/maintenance/archives/patch-mime_minor_length.sql
+++ b/maintenance/archives/patch-mime_minor_length.sql
@@ -7,4 +7,4 @@ ALTER TABLE /*_*/image
ALTER TABLE /*_*/oldimage
MODIFY COLUMN oi_minor_mime varbinary(100) NOT NULL default "unknown";
-INSERT INTO /*_*/updatelog VALUES ('mime_minor_length'); \ No newline at end of file
+INSERT INTO /*_*/updatelog(ul_key) VALUES ('mime_minor_length');
diff --git a/maintenance/archives/patch-module_deps.sql b/maintenance/archives/patch-module_deps.sql
new file mode 100644
index 00000000..ffc94829
--- /dev/null
+++ b/maintenance/archives/patch-module_deps.sql
@@ -0,0 +1,12 @@
+-- Table for tracking which local files a module depends on that aren't
+-- registered directly.
+-- Currently only used for tracking images that CSS depends on
+CREATE TABLE /*_*/module_deps (
+ -- Module name
+ md_module varbinary(255) NOT NULL,
+ -- Skin name
+ md_skin varbinary(32) NOT NULL,
+ -- JSON blob with file dependencies
+ md_deps mediumblob NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
diff --git a/maintenance/archives/patch-msg_resource.sql b/maintenance/archives/patch-msg_resource.sql
new file mode 100644
index 00000000..f4f35339
--- /dev/null
+++ b/maintenance/archives/patch-msg_resource.sql
@@ -0,0 +1,20 @@
+-- Table for storing JSON message blobs for the resource loader
+CREATE TABLE /*_*/msg_resource (
+ -- Resource name
+ mr_resource varbinary(255) NOT NULL,
+ -- Language code
+ mr_lang varbinary(32) NOT NULL,
+ -- JSON blob. This is an incomplete JSON object, i.e. without the wrapping {}
+ mr_blob mediumblob NOT NULL,
+ -- Timestamp of last update
+ mr_timestamp binary(14) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource(mr_resource, mr_lang);
+
+-- Table for administering which message is contained in which resource
+CREATE TABLE /*_*/msg_resource_links (
+ mrl_resource varbinary(255) NOT NULL,
+ -- Message key
+ mrl_message varbinary(255) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
diff --git a/maintenance/archives/patch-profiling.sql b/maintenance/archives/patch-profiling.sql
index e748ca31..29663341 100644
--- a/maintenance/archives/patch-profiling.sql
+++ b/maintenance/archives/patch-profiling.sql
@@ -1,11 +1,12 @@
-- profiling table
-- This is optional
-CREATE TABLE /*$wgDBprefix*/profiling (
+CREATE TABLE /*_*/profiling (
pf_count int NOT NULL default 0,
pf_time float NOT NULL default 0,
pf_memory float NOT NULL default 0,
pf_name varchar(255) NOT NULL default '',
- pf_server varchar(30) NOT NULL default '',
- UNIQUE KEY pf_name_server (pf_name, pf_server)
+ pf_server varchar(30) NOT NULL default ''
) ENGINE=HEAP;
+
+CREATE UNIQUE INDEX /*i*/pf_name_server ON /*_*/profiling (pf_name, pf_server) \ No newline at end of file
diff --git a/maintenance/archives/patch-rename-iwl_prefix.sql b/maintenance/archives/patch-rename-iwl_prefix.sql
new file mode 100644
index 00000000..4b11b36b
--- /dev/null
+++ b/maintenance/archives/patch-rename-iwl_prefix.sql
@@ -0,0 +1,4 @@
+--
+-- Recreates the iwl_prefix index for the iwlinks table
+--
+CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-tc-timestamp.sql b/maintenance/archives/patch-tc-timestamp.sql
index 4d90cf34..3f7dde41 100644
--- a/maintenance/archives/patch-tc-timestamp.sql
+++ b/maintenance/archives/patch-tc-timestamp.sql
@@ -1,4 +1,4 @@
ALTER TABLE /*_*/transcache MODIFY tc_time binary(14);
UPDATE /*_*/transcache SET tc_time = DATE_FORMAT(FROM_UNIXTIME(tc_time), "%Y%c%d%H%i%s");
-INSERT INTO /*_*/updatelog VALUES ('convert transcache field');
+INSERT INTO /*_*/updatelog(ul_key) VALUES ('convert transcache field');
diff --git a/maintenance/testRunner.sql b/maintenance/archives/patch-testrun.sql
index 8591d81d..8591d81d 100644
--- a/maintenance/testRunner.sql
+++ b/maintenance/archives/patch-testrun.sql
diff --git a/maintenance/archives/patch-ul_value.sql b/maintenance/archives/patch-ul_value.sql
new file mode 100644
index 00000000..50f4e9a8
--- /dev/null
+++ b/maintenance/archives/patch-ul_value.sql
@@ -0,0 +1,4 @@
+-- Add the ul_value column to updatelog
+
+ALTER TABLE /*_*/updatelog
+ add ul_value blob;
diff --git a/maintenance/archives/upgradeLogging.php b/maintenance/archives/upgradeLogging.php
index f79bbabc..54a82c09 100644
--- a/maintenance/archives/upgradeLogging.php
+++ b/maintenance/archives/upgradeLogging.php
@@ -6,7 +6,7 @@
* @ingroup MaintenanceArchive
*/
-require( dirname(__FILE__).'/../commandLine.inc' );
+require( dirname( __FILE__ ) . '/../commandLine.inc' );
class UpdateLogging {
var $dbw;
@@ -130,7 +130,7 @@ EOT;
} else {
$conds = array( 'log_timestamp > ' . $this->dbw->addQuotes( $copyPos ) );
}
- $srcRes = $this->dbw->select( $srcTable, '*', $conds, __METHOD__,
+ $srcRes = $this->dbw->select( $srcTable, '*', $conds, __METHOD__,
array( 'LIMIT' => $batchSize, 'ORDER BY' => 'log_timestamp' ) );
if ( ! $srcRes->numRows() ) {
diff --git a/maintenance/attachLatest.php b/maintenance/attachLatest.php
index 67f3088b..e6287f43 100644
--- a/maintenance/attachLatest.php
+++ b/maintenance/attachLatest.php
@@ -3,7 +3,7 @@
* quick hackjob to fix damages imports on wikisource
* page records have page_latest wrong
*
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -21,19 +21,20 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class AttachLatest extends Maintenance {
-
+
public function __construct() {
parent::__construct();
$this->addOption( "fix", "Actually fix the entries, will dry run otherwise" );
$this->mDescription = "Fix page_latest entries in the page table";
}
-
+
public function execute() {
$this->output( "Looking for pages with page_latest set to 0...\n" );
$dbw = wfGetDB( DB_MASTER );
@@ -43,7 +44,7 @@ class AttachLatest extends Maintenance {
__METHOD__ );
$n = 0;
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$pageId = intval( $row->page_id );
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$name = $title->getPrefixedText();
@@ -51,31 +52,30 @@ class AttachLatest extends Maintenance {
'MAX(rev_timestamp)',
array( 'rev_page' => $pageId ),
__METHOD__ );
- if( !$latestTime ) {
- $this->output( wfWikiID()." $pageId [[$name]] can't find latest rev time?!\n" );
+ if ( !$latestTime ) {
+ $this->output( wfWikiID() . " $pageId [[$name]] can't find latest rev time?!\n" );
continue;
}
-
+
$revision = Revision::loadFromTimestamp( $dbw, $title, $latestTime );
- if( is_null( $revision ) ) {
- $this->output( wfWikiID()." $pageId [[$name]] latest time $latestTime, can't find revision id\n" );
+ if ( is_null( $revision ) ) {
+ $this->output( wfWikiID() . " $pageId [[$name]] latest time $latestTime, can't find revision id\n" );
continue;
}
$id = $revision->getId();
- $this->output( wfWikiID()." $pageId [[$name]] latest time $latestTime, rev id $id\n" );
- if( $this->hasOption('fix') ) {
+ $this->output( wfWikiID() . " $pageId [[$name]] latest time $latestTime, rev id $id\n" );
+ if ( $this->hasOption( 'fix' ) ) {
$article = new Article( $title );
$article->updateRevisionOn( $dbw, $revision );
}
$n++;
}
- $dbw->freeResult( $result );
$this->output( "Done! Processed $n pages.\n" );
- if( !$this->hasOption('fix') ) {
+ if ( !$this->hasOption( 'fix' ) ) {
$this->output( "This was a dry run; rerun with --fix to update page_latest.\n" );
}
}
}
$maintClass = "AttachLatest";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/backup.inc b/maintenance/backup.inc
index 30bd0d88..9ed463c9 100644
--- a/maintenance/backup.inc
+++ b/maintenance/backup.inc
@@ -1,6 +1,8 @@
<?php
/**
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Base classes for database dumpers
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -27,7 +29,7 @@
*/
class DumpDBZip2Output extends DumpPipeOutput {
function DumpDBZip2Output( $file ) {
- parent::DumpPipeOutput( "dbzip2", $file );
+ parent::__construct( "dbzip2", $file );
}
}
@@ -67,16 +69,16 @@ class BackupDumper {
}
/**
- * @param string $name
- * @param string $class name of output filter plugin class
+ * @param $name String
+ * @param $class String: name of output filter plugin class
*/
function registerOutput( $name, $class ) {
$this->outputTypes[$name] = $class;
}
/**
- * @param string $name
- * @param string $class name of filter plugin class
+ * @param $name String
+ * @param $class String: name of filter plugin class
*/
function registerFilter( $name, $class ) {
$this->filterTypes[$name] = $class;
@@ -84,12 +86,13 @@ class BackupDumper {
/**
* Load a plugin and register it
- * @param string $class Name of plugin class; must have a static 'register'
- * method that takes a BackupDumper as a parameter.
- * @param string $file Full or relative path to the PHP file to load, or empty
+ *
+ * @param $class String: name of plugin class; must have a static 'register'
+ * method that takes a BackupDumper as a parameter.
+ * @param $file String: full or relative path to the PHP file to load, or empty
*/
function loadPlugin( $class, $file ) {
- if( $file != '' ) {
+ if ( $file != '' ) {
require_once( $file );
}
$register = array( $class, 'register' );
@@ -97,37 +100,36 @@ class BackupDumper {
}
/**
- * @param array $args
- * @return array
- * @static
+ * @param $args Array
+ * @return Array
*/
function processArgs( $args ) {
$sink = null;
$sinks = array();
- foreach( $args as $arg ) {
+ foreach ( $args as $arg ) {
$matches = array();
- if( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
+ if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
@list( /* $full */ , $opt, $val, $param ) = $matches;
switch( $opt ) {
case "plugin":
$this->loadPlugin( $val, $param );
break;
case "output":
- if( !is_null( $sink ) ) {
+ if ( !is_null( $sink ) ) {
$sinks[] = $sink;
}
- if( !isset( $this->outputTypes[$val] ) ) {
+ if ( !isset( $this->outputTypes[$val] ) ) {
wfDie( "Unrecognized output sink type '$val'\n" );
}
$type = $this->outputTypes[$val];
$sink = new $type( $param );
break;
case "filter":
- if( is_null( $sink ) ) {
+ if ( is_null( $sink ) ) {
$this->progress( "Warning: assuming stdout for filter output\n" );
$sink = new DumpOutput();
}
- if( !isset( $this->filterTypes[$val] ) ) {
+ if ( !isset( $this->filterTypes[$val] ) ) {
wfDie( "Unrecognized filter type '$val'\n" );
}
$type = $this->filterTypes[$val];
@@ -145,9 +147,9 @@ class BackupDumper {
$this->server = $val;
break;
case "force-normal":
- if( !function_exists( 'utf8_normalize' ) ) {
- dl( "php_utfnormal.so" );
- if( !function_exists( 'utf8_normalize' ) ) {
+ if ( !function_exists( 'utf8_normalize' ) ) {
+ wfDl( "php_utfnormal.so" );
+ if ( !function_exists( 'utf8_normalize' ) ) {
wfDie( "Failed to load UTF-8 normalization extension. " .
"Install or remove --force-normal parameter to use slower code.\n" );
}
@@ -159,12 +161,12 @@ class BackupDumper {
}
}
- if( is_null( $sink ) ) {
+ if ( is_null( $sink ) ) {
$sink = new DumpOutput();
}
$sinks[] = $sink;
- if( count( $sinks ) > 1 ) {
+ if ( count( $sinks ) > 1 ) {
return new DumpMultiWriter( $sinks );
} else {
return $sink;
@@ -178,7 +180,7 @@ class BackupDumper {
function dump( $history, $text = WikiExporter::TEXT ) {
# Notice messages will foul up your XML output even if they're
# relatively harmless.
- if( ini_get( 'display_errors' ) )
+ if ( ini_get( 'display_errors' ) )
ini_set( 'display_errors', 'stderr' );
$this->initProgress( $history );
@@ -190,18 +192,18 @@ class BackupDumper {
$wrapper = new ExportProgressFilter( $this->sink, $this );
$exporter->setOutputSink( $wrapper );
- if( !$this->skipHeader )
+ if ( !$this->skipHeader )
$exporter->openStream();
# Log item dumps: all or by range
- if( $history & WikiExporter::LOGS ) {
- if( $this->startId || $this->endId ) {
+ if ( $history & WikiExporter::LOGS ) {
+ if ( $this->startId || $this->endId ) {
$exporter->logsByRange( $this->startId, $this->endId );
} else {
$exporter->allLogs();
}
# Page dumps: all or by page ID range
- } else if( is_null( $this->pages ) ) {
- if( $this->startId || $this->endId ) {
+ } else if ( is_null( $this->pages ) ) {
+ if ( $this->startId || $this->endId ) {
$exporter->pagesByRange( $this->startId, $this->endId );
} else {
$exporter->allPages();
@@ -211,44 +213,45 @@ class BackupDumper {
$exporter->pagesByName( $this->pages );
}
- if( !$this->skipFooter )
+ if ( !$this->skipFooter )
$exporter->closeStream();
$this->report( true );
}
-
+
/**
* Initialise starting time and maximum revision count.
* We'll make ETA calculations based an progress, assuming relatively
* constant per-revision rate.
- * @param int $history WikiExporter::CURRENT or WikiExporter::FULL
+ * @param $history Integer: WikiExporter::CURRENT or WikiExporter::FULL
*/
function initProgress( $history = WikiExporter::FULL ) {
- $table = ($history == WikiExporter::CURRENT) ? 'page' : 'revision';
- $field = ($history == WikiExporter::CURRENT) ? 'page_id' : 'rev_id';
-
+ $table = ( $history == WikiExporter::CURRENT ) ? 'page' : 'revision';
+ $field = ( $history == WikiExporter::CURRENT ) ? 'page_id' : 'rev_id';
+
$dbr = wfGetDB( DB_SLAVE );
- $this->maxCount = $dbr->selectField( $table, "MAX($field)", '', 'BackupDumper::dump' );
+ $this->maxCount = $dbr->selectField( $table, "MAX($field)", '', __METHOD__ );
$this->startTime = wfTime();
}
/**
- * @fixme the --server parameter is currently not respected, as it doesn't seem
- * terribly easy to ask the load balancer for a particular connection by name.
+ * @todo Fixme: the --server parameter is currently not respected, as it
+ * doesn't seem terribly easy to ask the load balancer for a particular
+ * connection by name.
*/
function backupDb() {
$this->lb = wfGetLBFactory()->newMainLB();
$db = $this->lb->getConnection( DB_SLAVE, 'backup' );
-
+
// Discourage the server from disconnecting us if it takes a long time
// to read out the big ol' batch query.
$db->setTimeout( 3600 * 24 );
-
+
return $db;
}
-
+
function __destruct() {
- if( isset( $this->lb ) ) {
+ if ( isset( $this->lb ) ) {
$this->lb->closeAll();
}
}
@@ -270,16 +273,16 @@ class BackupDumper {
}
function report( $final = false ) {
- if( $final xor ( $this->revCount % $this->reportingInterval == 0 ) ) {
+ if ( $final xor ( $this->revCount % $this->reportingInterval == 0 ) ) {
$this->showReport();
}
}
function showReport() {
- if( $this->reporting ) {
+ if ( $this->reporting ) {
$delta = wfTime() - $this->startTime;
$now = wfTimestamp( TS_DB );
- if( $delta ) {
+ if ( $delta ) {
$rate = $this->pageCount / $delta;
$revrate = $this->revCount / $delta;
$portion = $this->revCount / $this->maxCount;
@@ -302,7 +305,7 @@ class BackupDumper {
class ExportProgressFilter extends DumpFilter {
function ExportProgressFilter( &$sink, &$progress ) {
- parent::DumpFilter( $sink );
+ parent::__construct( $sink );
$this->progress = $progress;
}
diff --git a/maintenance/backupPrefetch.inc b/maintenance/backupPrefetch.inc
index 512af1c7..9d743137 100644
--- a/maintenance/backupPrefetch.inc
+++ b/maintenance/backupPrefetch.inc
@@ -1,42 +1,10 @@
<?php
-
-// Some smart guy removed XMLReader's global constants from PHP 5.1
-// and replaced them with class constants. Breaking source compatibility
-// is SUPER awesome, and I love languages which do this constantly!
-$xmlReaderConstants = array(
- "NONE",
- "ELEMENT",
- "ATTRIBUTE",
- "TEXT",
- "CDATA",
- "ENTITY_REF",
- "ENTITY",
- "PI",
- "COMMENT",
- "DOC",
- "DOC_TYPE",
- "DOC_FRAGMENT",
- "NOTATION",
- "WHITESPACE",
- "SIGNIFICANT_WHITESPACE",
- "END_ELEMENT",
- "END_ENTITY",
- "XML_DECLARATION",
- "LOADDTD",
- "DEFAULTATTRS",
- "VALIDATE",
- "SUBST_ENTITIES" );
-foreach( $xmlReaderConstants as $name ) {
- $fullName = "XMLREADER_$name";
- $newName = "XMLReader::$name";
- if( !defined( $fullName ) ) {
- if( defined( $newName ) ) {
- define( $fullName, constant( $newName ) );
- } else {
- // broken or missing the extension...
- }
- }
-}
+/**
+ * Helper class for the --prefetch option of dumpTextPass.php
+ *
+ * @file
+ * @ingroup Maintenance
+ */
/**
* Readahead helper for making large MediaWiki data dumps;
@@ -51,7 +19,6 @@ foreach( $xmlReaderConstants as $name ) {
* - text contents are immutable and should not change once
* recorded, so the previous dump is a reliable source
*
- * Requires PHP 5 and the XMLReader PECL extension.
* @ingroup Maintenance
*/
class BaseDump {
@@ -60,9 +27,12 @@ class BaseDump {
var $atPageEnd = false;
var $lastPage = 0;
var $lastRev = 0;
+ var $infiles = null;
function BaseDump( $infile ) {
+ $this->infiles = explode(';',$infile);
$this->reader = new XMLReader();
+ $infile = array_shift($this->infiles);
$this->reader->open( $infile );
}
@@ -71,26 +41,26 @@ class BaseDump {
* from the dump stream. May return null if the page is
* unavailable.
*
- * @param int $page ID number of page to read
- * @param int $rev ID number of revision to read
+ * @param $page Integer: ID number of page to read
+ * @param $rev Integer: ID number of revision to read
* @return string or null
*/
function prefetch( $page, $rev ) {
$page = intval( $page );
$rev = intval( $rev );
- while( $this->lastPage < $page && !$this->atEnd ) {
+ while ( $this->lastPage < $page && !$this->atEnd ) {
$this->debug( "BaseDump::prefetch at page $this->lastPage, looking for $page" );
$this->nextPage();
}
- if( $this->lastPage > $page || $this->atEnd ) {
+ if ( $this->lastPage > $page || $this->atEnd ) {
$this->debug( "BaseDump::prefetch already past page $page looking for rev $rev [$this->lastPage, $this->lastRev]" );
return null;
}
- while( $this->lastRev < $rev && !$this->atEnd && !$this->atPageEnd ) {
+ while ( $this->lastRev < $rev && !$this->atEnd && !$this->atPageEnd ) {
$this->debug( "BaseDump::prefetch at page $this->lastPage, rev $this->lastRev, looking for $page, $rev" );
$this->nextRev();
}
- if( $this->lastRev == $rev && !$this->atEnd ) {
+ if ( $this->lastRev == $rev && !$this->atEnd ) {
$this->debug( "BaseDump::prefetch hit on $page, $rev [$this->lastPage, $this->lastRev]" );
return $this->nextText();
} else {
@@ -101,22 +71,27 @@ class BaseDump {
function debug( $str ) {
wfDebug( $str . "\n" );
- //global $dumper;
- //$dumper->progress( $str );
+ // global $dumper;
+ // $dumper->progress( $str );
}
/**
* @access private
*/
function nextPage() {
- if( $this->skipTo( 'page', 'mediawiki' ) ) {
- if( $this->skipTo( 'id' ) ) {
+ if ( $this->skipTo( 'page', 'mediawiki' ) ) {
+ if ( $this->skipTo( 'id' ) ) {
$this->lastPage = intval( $this->nodeContents() );
$this->lastRev = 0;
$this->atPageEnd = false;
}
} else {
- $this->atEnd = true;
+ $this->close();
+ if (count($this->infiles)) {
+ $infile = array_shift($this->infiles);
+ $this->reader->open( $infile );
+ $this->atEnd = false;
+ }
}
}
@@ -124,8 +99,8 @@ class BaseDump {
* @access private
*/
function nextRev() {
- if( $this->skipTo( 'revision' ) ) {
- if( $this->skipTo( 'id' ) ) {
+ if ( $this->skipTo( 'revision' ) ) {
+ if ( $this->skipTo( 'id' ) ) {
$this->lastRev = intval( $this->nodeContents() );
}
} else {
@@ -144,16 +119,16 @@ class BaseDump {
/**
* @access private
*/
- function skipTo( $name, $parent='page' ) {
- if( $this->atEnd ) {
+ function skipTo( $name, $parent = 'page' ) {
+ if ( $this->atEnd ) {
return false;
}
- while( $this->reader->read() ) {
- if( $this->reader->nodeType == XMLREADER_ELEMENT &&
+ while ( $this->reader->read() ) {
+ if ( $this->reader->nodeType == XMLReader::ELEMENT &&
$this->reader->name == $name ) {
return true;
}
- if( $this->reader->nodeType == XMLREADER_END_ELEMENT &&
+ if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
$this->reader->name == $parent ) {
$this->debug( "BaseDump::skipTo found </$parent> searching for <$name>" );
return false;
@@ -166,25 +141,26 @@ class BaseDump {
* Shouldn't something like this be built-in to XMLReader?
* Fetches text contents of the current element, assuming
* no sub-elements or such scary things.
- * @return string
+ *
+ * @return String
* @access private
*/
function nodeContents() {
- if( $this->atEnd ) {
+ if ( $this->atEnd ) {
return null;
}
- if( $this->reader->isEmptyElement ) {
+ if ( $this->reader->isEmptyElement ) {
return "";
}
$buffer = "";
- while( $this->reader->read() ) {
+ while ( $this->reader->read() ) {
switch( $this->reader->nodeType ) {
- case XMLREADER_TEXT:
-// case XMLREADER_WHITESPACE:
- case XMLREADER_SIGNIFICANT_WHITESPACE:
+ case XMLReader::TEXT:
+// case XMLReader::WHITESPACE:
+ case XMLReader::SIGNIFICANT_WHITESPACE:
$buffer .= $this->reader->value;
break;
- case XMLREADER_END_ELEMENT:
+ case XMLReader::END_ELEMENT:
return $buffer;
}
}
diff --git a/maintenance/benchmarkPurge.php b/maintenance/benchmarkPurge.php
index d167cf92..8360ef85 100644
--- a/maintenance/benchmarkPurge.php
+++ b/maintenance/benchmarkPurge.php
@@ -17,39 +17,40 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class BenchmarkPurge extends Maintenance {
-
+
public function __construct() {
parent::__construct();
$this->addOption( "count", "How many URLs to feed to Squid for purging", false, true );
$this->mDescription = "Benchmark the Squid purge functions.";
}
-
+
public function execute() {
- global $wgUseSquid;
- if( !$wgUseSquid ) {
- $this->error( "Squid purge benchmark doesn't do much without squid support on.". true );
+ global $wgUseSquid, $wgSquidServers;
+ if ( !$wgUseSquid ) {
+ $this->error( "Squid purge benchmark doesn't do much without squid support on.", true );
} else {
$this->output( "There are " . count( $wgSquidServers ) . " defined squid servers:\n" );
- if( $this->hasOption( 'count' ) ) {
- $lengths = array( intval( $this->getOption('count') ) );
+ if ( $this->hasOption( 'count' ) ) {
+ $lengths = array( intval( $this->getOption( 'count' ) ) );
} else {
$lengths = array( 1, 10, 100 );
}
- foreach( $lengths as $length ) {
+ foreach ( $lengths as $length ) {
$urls = $this->randomUrlList( $length );
$trial = $this->benchSquid( $urls );
$this->output( $trial . "\n" );
}
}
}
-
- /**
+
+ /**
* Run a bunch of URLs through SquidUpdate::purge()
* to benchmark Squid response times.
* @param $urls array A bunch of URLs to purge
@@ -57,7 +58,7 @@ class BenchmarkPurge extends Maintenance {
*/
private function benchSquid( $urls, $trials = 1 ) {
$start = wfTime();
- for( $i = 0; $i < $trials; $i++) {
+ for ( $i = 0; $i < $trials; $i++ ) {
SquidUpdate::purge( $urls );
}
$delta = wfTime() - $start;
@@ -66,37 +67,37 @@ class BenchmarkPurge extends Maintenance {
return sprintf( "%4d titles in %6.2fms (%6.2fms each)",
count( $urls ), $pertrial * 1000.0, $pertitle * 1000.0 );
}
-
- /**
+
+ /**
* Get an array of randomUrl()'s.
* @param $length int How many urls to add to the array
*/
private function randomUrlList( $length ) {
$list = array();
- for( $i = 0; $i < $length; $i++ ) {
+ for ( $i = 0; $i < $length; $i++ ) {
$list[] = $this->randomUrl();
}
return $list;
}
-
- /**
+
+ /**
* Return a random URL of the wiki. Not necessarily an actual title in the
- * database, but at least a URL that looks like one.
+ * database, but at least a URL that looks like one.
*/
private function randomUrl() {
global $wgServer, $wgArticlePath;
return $wgServer . str_replace( '$1', $this->randomTitle(), $wgArticlePath );
}
-
- /**
- * Create a random title string (not necessarily a Title object).
+
+ /**
+ * Create a random title string (not necessarily a Title object).
* For use with randomUrl().
*/
private function randomTitle() {
$str = '';
$length = mt_rand( 1, 20 );
- for( $i = 0; $i < $length; $i++ ) {
- $str .= chr( mt_rand( ord('a'), ord('z') ) );
+ for ( $i = 0; $i < $length; $i++ ) {
+ $str .= chr( mt_rand( ord( 'a' ), ord( 'z' ) ) );
}
return ucfirst( $str );
}
diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php
new file mode 100644
index 00000000..66789ea4
--- /dev/null
+++ b/maintenance/benchmarks/Benchmarker.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Create a doxygen subgroup of Maintenance for benchmarks
+ * @defgroup Benchmark Benchmark
+ * @ingroup Maintenance
+ */
+
+/**
+ * TODO: report PHP version, OS ..
+ * @file
+ * @ingroup Benchmark
+ */
+
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+abstract class Benchmarker extends Maintenance {
+ private $results;
+
+ public function __construct() {
+ parent::__construct();
+ $this->addOption( 'count', "How many time to run a benchmark", false, true );
+ }
+
+ public function bench( array $benchs ) {
+ $bench_number = 0;
+ $count = $this->getOption( 'count', 100 );
+
+ foreach( $benchs as $bench ) {
+ // handle empty args
+ if(!array_key_exists( 'args', $bench )) {
+ $bench['args'] = array();
+ }
+
+ $bench_number++;
+ $start = wfTime();
+ for( $i=0; $i<$count; $i++ ) {
+ call_user_func_array( $bench['function'], $bench['args'] );
+ }
+ $delta = wfTime() - $start;
+
+ // function passed as a callback
+ if( is_array( $bench['function'] ) ) {
+ $ret = get_class( $bench['function'][0] ). '->' . $bench['function'][1];
+ $bench['function'] = $ret;
+ }
+
+ $this->results[$bench_number] = array(
+ 'function' => $bench['function'],
+ 'arguments' => $bench['args'],
+ 'count' => $count,
+ 'delta' => $delta,
+ 'average' => $delta / $count,
+ );
+ }
+ }
+
+ public function getFormattedResults( ) {
+ $ret = '';
+ foreach( $this->results as $res ) {
+ // show function with args
+ $ret .= sprintf( "%s times: function %s(%s) :\n",
+ $res['count'],
+ $res['function'],
+ join( ', ', $res['arguments'] )
+ );
+ $ret .= sprintf( " %6.2fms (%6.2fms each)\n",
+ $res['delta'] * 1000,
+ $res['average'] * 1000
+ );
+ }
+ return $ret;
+ }
+}
diff --git a/maintenance/benchmarks/bench_HTTP_HTTPS.php b/maintenance/benchmarks/bench_HTTP_HTTPS.php
new file mode 100644
index 00000000..13d15fce
--- /dev/null
+++ b/maintenance/benchmarks/bench_HTTP_HTTPS.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * This come from r75429 message
+ * @author Platonides
+ */
+
+require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+class bench_HTTP_HTTPS extends Benchmarker {
+
+ public function __construct() {
+ parent::__construct();
+ }
+
+ public function execute() {
+ $this->bench( array(
+ array( 'function' => array( $this, 'getHTTP' ) ),
+ array( 'function' => array( $this, 'getHTTPS' ) ),
+ ));
+ print $this->getFormattedResults();
+ }
+
+ static function doRequest( $proto ) {
+ Http::get( "$proto://localhost/" );
+ }
+
+ // bench function 1
+ function getHTTP() {
+ $this->doRequest( 'http' );
+ }
+
+ // bench function 2
+ function getHTTPS() {
+ $this->doRequest( 'https' );
+ }
+}
+
+$maintClass = 'bench_HTTP_HTTPS';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/benchmarks/bench_wfIsWindows.php b/maintenance/benchmarks/bench_wfIsWindows.php
new file mode 100644
index 00000000..2f759e07
--- /dev/null
+++ b/maintenance/benchmarks/bench_wfIsWindows.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * This come from r75429 message
+ * @author Platonides
+ */
+
+require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+class bench_wfIsWindows extends Benchmarker {
+
+ public function __construct() {
+ parent::__construct();
+ }
+
+ public function execute() {
+ $this->bench( array(
+ array( 'function' => array( $this, 'wfIsWindows' ) ),
+ array( 'function' => array( $this, 'wfIsWindowsCached' ) ),
+ ));
+ print $this->getFormattedResults();
+ }
+
+ static function is_win() {
+ return substr( php_uname(), 0, 7 ) == 'Windows' ;
+ }
+
+ // bench function 1
+ function wfIsWindows() {
+ return self::is_win();
+ }
+
+ // bench function 2
+ function wfIsWindowsCached() {
+ static $isWindows = null;
+ if( $isWindows == null ) {
+ $isWindows = self::is_win();
+ }
+ return $isWindows;
+ }
+}
+
+$maintClass = 'bench_wfIsWindows';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/changePassword.php b/maintenance/changePassword.php
index fbc3fa76..568952b9 100644
--- a/maintenance/changePassword.php
+++ b/maintenance/changePassword.php
@@ -2,6 +2,8 @@
/**
* Change the password of a given user
*
+ * Copyright © 2005, Ævar Arnfjörð Bjarmason
+ *
* 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
@@ -17,13 +19,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ChangePassword extends Maintenance {
public function __construct() {
@@ -32,21 +33,21 @@ class ChangePassword extends Maintenance {
$this->addOption( "password", "The password to use", true, true );
$this->mDescription = "Change a user's password";
}
-
+
public function execute() {
- $user = User::newFromName( $this->getOption('user') );
- if( !$user->getId() ) {
- $this->error( "No such user: " . $this->getOption('user'), true );
+ $user = User::newFromName( $this->getOption( 'user' ) );
+ if ( !$user->getId() ) {
+ $this->error( "No such user: " . $this->getOption( 'user' ), true );
}
try {
- $user->setPassword( $this->getOption('password') );
+ $user->setPassword( $this->getOption( 'password' ) );
$user->saveSettings();
$this->output( "Password set for " . $user->getName() . "\n" );
- } catch( PasswordError $pwe ) {
+ } catch ( PasswordError $pwe ) {
$this->error( $pwe->getText(), true );
}
}
}
$maintClass = "ChangePassword";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/checkAutoLoader.php b/maintenance/checkAutoLoader.php
index 9c8f29e3..d199b6fe 100644
--- a/maintenance/checkAutoLoader.php
+++ b/maintenance/checkAutoLoader.php
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CheckAutoLoader extends Maintenance {
public function __construct() {
@@ -31,8 +32,8 @@ class CheckAutoLoader extends Maintenance {
global $wgAutoloadLocalClasses, $IP;
$files = array_unique( $wgAutoloadLocalClasses );
- foreach( $files as $file ) {
- if( function_exists( 'parsekit_compile_file' ) ){
+ foreach ( $files as $file ) {
+ if ( function_exists( 'parsekit_compile_file' ) ) {
$parseInfo = parsekit_compile_file( "$IP/$file" );
$classes = array_keys( $parseInfo['class_table'] );
} else {
@@ -43,7 +44,7 @@ class CheckAutoLoader extends Maintenance {
}
foreach ( $classes as $class ) {
if ( !isset( $wgAutoloadLocalClasses[$class] ) ) {
- //printf( "%-50s Unlisted, in %s\n", $class, $file );
+ // printf( "%-50s Unlisted, in %s\n", $class, $file );
$this->output( "\t'$class' => '$file',\n" );
} elseif ( $wgAutoloadLocalClasses[$class] !== $file ) {
$this->output( "$class: Wrong file: found in $file, listed in " . $wgAutoloadLocalClasses[$class] . "\n" );
@@ -54,4 +55,4 @@ class CheckAutoLoader extends Maintenance {
}
$maintClass = "CheckAutoLoader";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/checkBadRedirects.php b/maintenance/checkBadRedirects.php
index 32f04f45..52bfa65a 100644
--- a/maintenance/checkBadRedirects.php
+++ b/maintenance/checkBadRedirects.php
@@ -18,10 +18,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CheckBadRedirects extends Maintenance {
public function __construct() {
@@ -34,19 +35,19 @@ class CheckBadRedirects extends Maintenance {
$dbr = wfGetDB( DB_SLAVE );
$result = $dbr->select(
array( 'page' ),
- array( 'page_namespace','page_title', 'page_latest' ),
+ array( 'page_namespace', 'page_title', 'page_latest' ),
array( 'page_is_redirect' => 1 ) );
-
+
$count = $result->numRows();
$this->output( "Found $count total redirects.\n" .
"Looking for bad redirects:\n\n" );
-
- foreach( $result as $row ) {
+
+ foreach ( $result as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$rev = Revision::newFromId( $row->page_latest );
- if( $rev ) {
+ if ( $rev ) {
$target = Title::newFromRedirect( $rev->getText() );
- if( !$target ) {
+ if ( !$target ) {
$this->output( $title->getPrefixedText() . "\n" );
}
}
@@ -56,4 +57,4 @@ class CheckBadRedirects extends Maintenance {
}
$maintClass = "CheckBadRedirects";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/checkImages.php b/maintenance/checkImages.php
index 5dcaac28..96b93f22 100644
--- a/maintenance/checkImages.php
+++ b/maintenance/checkImages.php
@@ -17,9 +17,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CheckImages extends Maintenance {
@@ -28,16 +29,16 @@ class CheckImages extends Maintenance {
$this->mDescription = "Check images to see if they exist, are readable, etc";
$this->setBatchSize( 1000 );
}
-
+
public function execute() {
$start = '';
$dbr = wfGetDB( DB_SLAVE );
$numImages = 0;
$numGood = 0;
-
+
do {
- $res = $dbr->select( 'image', '*', array( 'img_name > ' . $dbr->addQuotes( $start ) ),
+ $res = $dbr->select( 'image', '*', array( 'img_name > ' . $dbr->addQuotes( $start ) ),
__METHOD__, array( 'LIMIT' => $this->mBatchSize ) );
foreach ( $res as $row ) {
$numImages++;
@@ -53,30 +54,30 @@ class CheckImages extends Maintenance {
$this->output( "{$row->img_name}: missing\n" );
continue;
}
-
+
if ( $stat['mode'] & 040000 ) {
$this->output( "{$row->img_name}: is a directory\n" );
continue;
}
-
+
if ( $stat['size'] == 0 && $row->img_size != 0 ) {
$this->output( "{$row->img_name}: truncated, was {$row->img_size}\n" );
continue;
}
-
+
if ( $stat['size'] != $row->img_size ) {
$this->output( "{$row->img_name}: size mismatch DB={$row->img_size}, actual={$stat['size']}\n" );
continue;
}
-
+
$numGood++;
}
-
+
} while ( $res->numRows() );
-
+
$this->output( "Good images: $numGood/$numImages\n" );
}
}
$maintClass = "CheckImages";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/checkSyntax.php b/maintenance/checkSyntax.php
index 22832dce..396cac5f 100644
--- a/maintenance/checkSyntax.php
+++ b/maintenance/checkSyntax.php
@@ -17,9 +17,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-
+
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CheckSyntax extends Maintenance {
@@ -33,8 +34,8 @@ class CheckSyntax extends Maintenance {
$this->mDescription = "Check syntax for all PHP files in MediaWiki";
$this->addOption( 'with-extensions', 'Also recurse the extensions folder' );
$this->addOption( 'path', 'Specific path (file or directory) to check, either with absolute path or relative to the root of this MediaWiki installation',
- false, true);
- $this->addOption( 'list-file', 'Text file containing list of files or directories to check', false, true);
+ false, true );
+ $this->addOption( 'list-file', 'Text file containing list of files or directories to check', false, true );
$this->addOption( 'modified', 'Check only files that were modified (requires SVN command-line client)' );
$this->addOption( 'syntax-only', 'Check for syntax validity only, skip code style warnings' );
}
@@ -49,16 +50,16 @@ class CheckSyntax extends Maintenance {
// ParseKit is broken on PHP 5.3+, disabled until this is fixed
$useParseKit = function_exists( 'parsekit_compile_file' ) && version_compare( PHP_VERSION, '5.3', '<' );
- $str = 'Checking syntax (using ' . ( $useParseKit ?
- 'parsekit)' : ' php -l, this can take a long time)' );
+ $str = 'Checking syntax (using ' . ( $useParseKit ?
+ 'parsekit' : ' php -l, this can take a long time' ) . ")\n";
$this->output( $str );
- foreach( $this->mFiles as $f ) {
- if( $useParseKit ) {
+ foreach ( $this->mFiles as $f ) {
+ if ( $useParseKit ) {
$this->checkFileWithParsekit( $f );
} else {
$this->checkFileWithCli( $f );
}
- if( !$this->hasOption( 'syntax-only' ) ) {
+ if ( !$this->hasOption( 'syntax-only' ) ) {
$this->checkForMistakes( $f );
}
}
@@ -76,18 +77,17 @@ class CheckSyntax extends Maintenance {
$this->mIgnorePaths = array(
// Compat stuff, explodes on PHP 5.3
"includes/NamespaceCompat.php$",
- "DiscussionThreading/REV",
);
-
+
$this->mNoStyleCheckPaths = array(
// Third-party code we don't care about
"/activemq_stomp/",
- "EmailPage/phpMailer",
+ "EmailPage/PHPMailer",
"FCKeditor/fckeditor/",
'\bphplot-',
"/svggraph/",
"\bjsmin.php$",
- "OggHandler/PEAR/",
+ "PEAR/File_Ogg/",
"QPoll/Excel/",
"/geshi/",
"/smarty/",
@@ -105,7 +105,8 @@ class CheckSyntax extends Maintenance {
if ( !$f ) {
$this->error( "Can't open file $file\n", true );
}
- while( $path = trim( fgets( $f ) ) ) {
+ $path = trim( fgets( $f ) );
+ while ( $path ) {
$this->addPath( $path );
}
fclose( $f );
@@ -113,6 +114,7 @@ class CheckSyntax extends Maintenance {
} elseif ( $this->hasOption( 'modified' ) ) {
$this->output( "Retrieving list from Subversion... " );
$parentDir = wfEscapeShellArg( dirname( __FILE__ ) . '/..' );
+ $retval = null;
$output = wfShellExec( "svn status --ignore-externals $parentDir", $retval );
if ( $retval ) {
$this->error( "Error retrieving list from Subversion!\n", true );
@@ -122,7 +124,7 @@ class CheckSyntax extends Maintenance {
preg_match_all( '/^\s*[AM].{7}(.*?)\r?$/m', $output, $matches );
foreach ( $matches[1] as $file ) {
- if ( self::isSuitableFile( $file ) && !is_dir( $file ) ) {
+ if ( $this->isSuitableFile( $file ) && !is_dir( $file ) ) {
$this->mFiles[] = $file;
}
}
@@ -131,20 +133,20 @@ class CheckSyntax extends Maintenance {
$this->output( 'Building file list...', 'listfiles' );
- // Only check files in these directories.
+ // Only check files in these directories.
// Don't just put $IP, because the recursive dir thingie goes into all subdirs
- $dirs = array(
+ $dirs = array(
$IP . '/includes',
$IP . '/config',
$IP . '/languages',
$IP . '/maintenance',
$IP . '/skins',
);
- if( $this->hasOption( 'with-extensions' ) ) {
+ if ( $this->hasOption( 'with-extensions' ) ) {
$dirs[] = $IP . '/extensions';
}
- foreach( $dirs as $d ) {
+ foreach ( $dirs as $d ) {
$this->addDirectoryContent( $d );
}
@@ -158,15 +160,16 @@ class CheckSyntax extends Maintenance {
$this->output( 'done.', 'listfiles' );
}
-
+
/**
* Returns true if $file is of a type we can check
*/
private function isSuitableFile( $file ) {
+ $file = str_replace( '\\', '/', $file );
$ext = pathinfo( $file, PATHINFO_EXTENSION );
if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' )
return false;
- foreach( $this->mIgnorePaths as $regex ) {
+ foreach ( $this->mIgnorePaths as $regex ) {
$m = array();
if ( preg_match( "~{$regex}~", $file, $m ) )
return false;
@@ -203,7 +206,7 @@ class CheckSyntax extends Maintenance {
*/
private function addDirectoryContent( $dir ) {
$iterator = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator( $dir ),
+ new RecursiveDirectoryIterator( $dir ),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ( $iterator as $file ) {
@@ -248,8 +251,8 @@ class CheckSyntax extends Maintenance {
* @return boolean
*/
private function checkFileWithCli( $file ) {
- $res = exec( 'php -l ' . wfEscapeShellArg( $file ) );
- if( strpos( $res, 'No syntax errors detected' ) === false ) {
+ $res = exec( 'php -l ' . wfEscapeShellArg( $file ) );
+ if ( strpos( $res, 'No syntax errors detected' ) === false ) {
$this->mFailures[$file] = $res;
$this->output( $res . "\n" );
return false;
@@ -265,7 +268,7 @@ class CheckSyntax extends Maintenance {
* @return boolean
*/
private function checkForMistakes( $file ) {
- foreach( $this->mNoStyleCheckPaths as $regex ) {
+ foreach ( $this->mNoStyleCheckPaths as $regex ) {
$m = array();
if ( preg_match( "~{$regex}~", $file, $m ) )
return;
@@ -292,5 +295,5 @@ class CheckSyntax extends Maintenance {
}
$maintClass = "CheckSyntax";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/checkUsernames.php b/maintenance/checkUsernames.php
index 85a3d157..9b98721d 100644
--- a/maintenance/checkUsernames.php
+++ b/maintenance/checkUsernames.php
@@ -19,11 +19,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CheckUsernames extends Maintenance {
@@ -44,11 +45,11 @@ class CheckUsernames extends Maintenance {
foreach ( $res as $row ) {
if ( ! User::isValidUserName( $row->user_name ) ) {
$this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
- wfDebugLog( 'checkUsernames', $out );
+ wfDebugLog( 'checkUsernames', $row->user_name );
}
}
}
}
$maintClass = "CheckUsernames";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupCaps.php b/maintenance/cleanupCaps.php
index 6a48ea83..2d945a52 100644
--- a/maintenance/cleanupCaps.php
+++ b/maintenance/cleanupCaps.php
@@ -1,12 +1,12 @@
<?php
-/*
+/**
* Script to clean up broken page links when somebody turns on $wgCapitalLinks.
*
* Usage: php cleanupCaps.php [--dry-run]
* Options:
* --dry-run don't actually try moving them
*
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -24,11 +24,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author Brion Vibber <brion at pobox.com>
- * @ingroup maintenance
+ * @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/cleanupTable.inc' );
+require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
class CapsCleanup extends TableCleanup {
public function __construct() {
@@ -42,7 +43,7 @@ class CapsCleanup extends TableCleanup {
$this->namespace = intval( $this->getOption( 'namespace', 0 ) );
$this->dryrun = $this->hasOption( 'dry-run' );
$wgUser->setName( 'Conversion script' );
- if( $wgCapitalLinks )
+ if ( $wgCapitalLinks )
$this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
$this->runTable( array(
@@ -59,31 +60,31 @@ class CapsCleanup extends TableCleanup {
$display = $current->getPrefixedText();
$upper = $row->page_title;
$lower = $wgContLang->lcfirst( $row->page_title );
- if( $upper == $lower ) {
+ if ( $upper == $lower ) {
$this->output( "\"$display\" already lowercase.\n" );
return $this->progress( 0 );
}
$target = Title::makeTitle( $row->page_namespace, $lower );
$targetDisplay = $target->getPrefixedText();
- if( $target->exists() ) {
+ if ( $target->exists() ) {
$this->output( "\"$display\" skipped; \"$targetDisplay\" already exists\n" );
return $this->progress( 0 );
}
- if( $this->dryrun ) {
+ if ( $this->dryrun ) {
$this->output( "\"$display\" -> \"$targetDisplay\": DRY RUN, NOT MOVED\n" );
$ok = true;
} else {
$ok = $current->moveTo( $target, false, 'Converting page titles to lowercase' );
$this->output( "\"$display\" -> \"$targetDisplay\": $ok\n" );
}
- if( $ok === true ) {
+ if ( $ok === true ) {
$this->progress( 1 );
- if( $row->page_namespace == $this->namespace ) {
+ if ( $row->page_namespace == $this->namespace ) {
$talk = $target->getTalkPage();
$row->page_namespace = $talk->getNamespace();
- if( $talk->exists() ) {
+ if ( $talk->exists() ) {
return $this->processRow( $row );
}
}
@@ -94,4 +95,4 @@ class CapsCleanup extends TableCleanup {
}
$maintClass = "CapsCleanup";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupDupes.inc b/maintenance/cleanupDupes.inc
deleted file mode 100644
index bb408007..00000000
--- a/maintenance/cleanupDupes.inc
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * If on the old non-unique indexes, check the cur table for duplicate
- * entries and remove them...
- *
- * @file
- * @ingroup Maintenance
- */
-
-function fixDupes( $fixthem = false) {
- $dbw = wfGetDB( DB_MASTER );
- $cur = $dbw->tableName( 'cur' );
- $old = $dbw->tableName( 'old' );
- $dbw->query( "LOCK TABLES $cur WRITE, $old WRITE" );
- echo "Checking for duplicate cur table entries... (this may take a while on a large wiki)\n";
- $res = $dbw->query( <<<END
-SELECT cur_namespace,cur_title,count(*) as c,min(cur_id) as id
- FROM $cur
- GROUP BY cur_namespace,cur_title
-HAVING c > 1
-END
- );
- $n = $dbw->numRows( $res );
- echo "Found $n titles with duplicate entries.\n";
- if( $n > 0 ) {
- if( $fixthem ) {
- echo "Correcting...\n";
- } else {
- echo "Just a demo...\n";
- }
- while( $row = $dbw->fetchObject( $res ) ) {
- $ns = intval( $row->cur_namespace );
- $title = $dbw->addQuotes( $row->cur_title );
-
- # Get the first responding ID; that'll be the one we keep.
- $id = $dbw->selectField( 'cur', 'cur_id', array(
- 'cur_namespace' => $row->cur_namespace,
- 'cur_title' => $row->cur_title ) );
-
- echo "$ns:$row->cur_title (canonical ID $id)\n";
- if( $id != $row->id ) {
- echo " ** minimum ID $row->id; ";
- $timeMin = $dbw->selectField( 'cur', 'cur_timestamp', array(
- 'cur_id' => $row->id ) );
- $timeFirst = $dbw->selectField( 'cur', 'cur_timestamp', array(
- 'cur_id' => $id ) );
- if( $timeMin == $timeFirst ) {
- echo "timestamps match at $timeFirst; ok\n";
- } else {
- echo "timestamps don't match! min: $timeMin, first: $timeFirst; ";
- if( $timeMin > $timeFirst ) {
- $id = $row->id;
- echo "keeping minimum: $id\n";
- } else {
- echo "keeping first: $id\n";
- }
- }
- }
-
- if( $fixthem ) {
- $dbw->query( <<<END
-INSERT
- INTO $old
- (old_namespace, old_title, old_text,
- old_comment, old_user, old_user_text,
- old_timestamp, old_minor_edit, old_flags,
- inverse_timestamp)
-SELECT cur_namespace, cur_title, cur_text,
- cur_comment, cur_user, cur_user_text,
- cur_timestamp, cur_minor_edit, '',
- inverse_timestamp
- FROM $cur
- WHERE cur_namespace=$ns
- AND cur_title=$title
- AND cur_id != $id
-END
- );
- $dbw->query( <<<END
-DELETE
- FROM $cur
- WHERE cur_namespace=$ns
- AND cur_title=$title
- AND cur_id != $id
-END
- );
- }
- }
- }
- $dbw->query( 'UNLOCK TABLES' );
- if( $fixthem ) {
- echo "Done.\n";
- } else {
- echo "Run again with --fix option to delete the duplicates.\n";
- }
-}
-
-function checkDupes( $fixthem = false, $indexonly = false ) {
- $dbw = wfGetDB( DB_MASTER );
- if( $dbw->indexExists( 'cur', 'name_title' ) &&
- $dbw->indexUnique( 'cur', 'name_title' ) ) {
- echo wfWikiID().": cur table has the current unique index; no duplicate entries.\n";
- } elseif( $dbw->indexExists( 'cur', 'name_title_dup_prevention' ) ) {
- echo wfWikiID().": cur table has a temporary name_title_dup_prevention unique index; no duplicate entries.\n";
- } else {
- echo wfWikiID().": cur table has the old non-unique index and may have duplicate entries.\n";
- if( !$indexonly ) {
- fixDupes( $fixthem );
- }
- }
-}
diff --git a/maintenance/cleanupImages.php b/maintenance/cleanupImages.php
index db13f4c9..b25b9bbe 100644
--- a/maintenance/cleanupImages.php
+++ b/maintenance/cleanupImages.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Script to clean up broken, unparseable upload filenames.
*
* Usage: php cleanupImages.php [--fix]
@@ -24,11 +24,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author Brion Vibber <brion at pobox.com>
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/cleanupTable.inc' );
+require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
class ImageCleanup extends TableCleanup {
protected $defaultParams = array(
@@ -47,38 +48,38 @@ class ImageCleanup extends TableCleanup {
global $wgContLang;
$source = $row->img_name;
- if( $source == '' ) {
+ if ( $source == '' ) {
// Ye olde empty rows. Just kill them.
$this->killRow( $source );
return $this->progress( 1 );
}
-
+
$cleaned = $source;
-
+
// About half of old bad image names have percent-codes
$cleaned = rawurldecode( $cleaned );
// We also have some HTML entities there
$cleaned = Sanitizer::decodeCharReferences( $cleaned );
-
+
// Some are old latin-1
$cleaned = $wgContLang->checkTitleEncoding( $cleaned );
-
+
// Many of remainder look like non-normalized unicode
$cleaned = $wgContLang->normalize( $cleaned );
-
+
$title = Title::makeTitleSafe( NS_FILE, $cleaned );
-
- if( is_null( $title ) ) {
+
+ if ( is_null( $title ) ) {
$this->output( "page $source ($cleaned) is illegal.\n" );
$safe = $this->buildSafeTitle( $cleaned );
- if( $safe === false )
+ if ( $safe === false )
return $this->progress( 0 );
$this->pokeFile( $source, $safe );
return $this->progress( 1 );
}
- if( $title->getDBkey() !== $source ) {
+ if ( $title->getDBkey() !== $source ) {
$munged = $title->getDBkey();
$this->output( "page $source ($munged) doesn't match self.\n" );
$this->pokeFile( $source, $munged );
@@ -89,7 +90,7 @@ class ImageCleanup extends TableCleanup {
}
private function killRow( $name ) {
- if( $this->dryrun ) {
+ if ( $this->dryrun ) {
$this->output( "DRY RUN: would delete bogus row '$name'\n" );
} else {
$this->output( "deleting bogus row '$name'\n" );
@@ -99,7 +100,7 @@ class ImageCleanup extends TableCleanup {
__METHOD__ );
}
}
-
+
private function filePath( $name ) {
if ( !isset( $this->repo ) ) {
$this->repo = RepoGroup::singleton()->getLocalRepo();
@@ -114,14 +115,14 @@ class ImageCleanup extends TableCleanup {
private function pageExists( $name, $db ) {
return $db->selectField( 'page', '1', array( 'page_namespace' => NS_FILE, 'page_title' => $name ), __METHOD__ );
}
-
+
private function pokeFile( $orig, $new ) {
$path = $this->filePath( $orig );
- if( !file_exists( $path ) ) {
+ if ( !file_exists( $path ) ) {
$this->output( "missing file: $path\n" );
return $this->killRow( $orig );
}
-
+
$db = wfGetDB( DB_MASTER );
/*
@@ -134,18 +135,18 @@ class ImageCleanup extends TableCleanup {
$version = 0;
$final = $new;
$conflict = ( $this->imageExists( $final, $db ) ||
- ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
-
- while( $conflict ) {
+ ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
+
+ while ( $conflict ) {
$this->output( "Rename conflicts with '$final'...\n" );
$version++;
$final = $this->appendTitle( $new, "_$version" );
$conflict = ( $this->imageExists( $final, $db ) || $this->pageExists( $final, $db ) );
}
-
+
$finalPath = $this->filePath( $final );
-
- if( $this->dryrun ) {
+
+ if ( $this->dryrun ) {
$this->output( "DRY RUN: would rename $path to $finalPath\n" );
} else {
$this->output( "renaming $path to $finalPath\n" );
@@ -164,14 +165,14 @@ class ImageCleanup extends TableCleanup {
array( 'page_title' => $orig, 'page_namespace' => NS_FILE ),
__METHOD__ );
$dir = dirname( $finalPath );
- if( !file_exists( $dir ) ) {
- if( !wfMkdirParents( $dir ) ) {
+ if ( !file_exists( $dir ) ) {
+ if ( !wfMkdirParents( $dir ) ) {
$this->log( "RENAME FAILED, COULD NOT CREATE $dir" );
$db->rollback();
return;
}
}
- if( rename( $path, $finalPath ) ) {
+ if ( rename( $path, $finalPath ) ) {
$db->commit();
} else {
$this->error( "RENAME FAILED" );
@@ -191,16 +192,16 @@ class ImageCleanup extends TableCleanup {
"/([^$wgLegalTitleChars]|~)/",
array( $this, 'hexChar' ),
$name );
-
+
$test = Title::makeTitleSafe( NS_FILE, $x );
- if( is_null( $test ) || $test->getDBkey() !== $x ) {
+ if ( is_null( $test ) || $test->getDBkey() !== $x ) {
$this->error( "Unable to generate safe title from '$name', got '$x'" );
return false;
}
-
+
return $x;
}
}
$maintClass = "ImageCleanup";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupRemovedModules.php b/maintenance/cleanupRemovedModules.php
new file mode 100644
index 00000000..fb8afd2d
--- /dev/null
+++ b/maintenance/cleanupRemovedModules.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Maintenance script to remove cache entries for removed ResourceLoader modules
+ * from 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
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Roan Kattouw
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class CleanupRemovedModules extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Remove cache entries for removed ResourceLoader modules from the database';
+ $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+ $this->addOption( 'max-slave-lag', 'If the slave lag exceeds this many seconds, wait until it drops below this value. Default: 5', false, true );
+ }
+
+ public function execute() {
+ $dbw = wfGetDB( DB_MASTER );
+ $rl = new ResourceLoader();
+ $moduleNames = $rl->getModuleNames();
+ $moduleList = implode( ', ', array_map( array( $dbw, 'addQuotes' ), $moduleNames ) );
+ $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+ $maxlag = intval( $this->getOption( 'max-slave-lag', 5 ) );
+
+ $this->output( "Cleaning up module_deps table...\n" );
+ $i = 1;
+ $modDeps = $dbw->tableName( 'module_deps' );
+ do {
+ // $dbw->delete() doesn't support LIMIT :(
+ $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
+ $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ );
+ $numRows = $dbw->affectedRows();
+ $this->output( "Batch $i: $numRows rows\n" );
+ $i++;
+ wfWaitForSlaves( $maxlag );
+ } while( $numRows > 0 );
+ $this->output( "done\n" );
+
+ $this->output( "Cleaning up msg_resource table...\n" );
+ $i = 1;
+
+ $mrRes = $dbw->tableName( 'msg_resource' );
+ do {
+ $where = $moduleList ? "mr_resource NOT IN ($moduleList)" : '1=1';
+ $dbw->query( "DELETE FROM $mrRes WHERE $where LIMIT $limit", __METHOD__ );
+ $numRows = $dbw->affectedRows();
+ $this->output( "Batch $i: $numRows rows\n" );
+ $i++;
+ wfWaitForSlaves( $maxlag );
+ } while( $numRows > 0 );
+ $this->output( "done\n" );
+
+ $this->output( "Cleaning up msg_resource_links table...\n" );
+ $i = 1;
+ $msgResLinks = $dbw->tableName( 'msg_resource_links' );
+ do {
+ $where = $moduleList ? "mrl_resource NOT IN ($moduleList)" : '1=1';
+ $dbw->query( "DELETE FROM $msgResLinks WHERE $where LIMIT $limit", __METHOD__ );
+ $numRows = $dbw->affectedRows();
+ $this->output( "Batch $i: $numRows rows\n" );
+ $i++;
+ wfWaitForSlaves( $maxlag );
+ } while( $numRows > 0 );
+ $this->output( "done\n" );
+ }
+}
+
+$maintClass = "CleanupRemovedModules";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupSpam.php b/maintenance/cleanupSpam.php
index e78ffe41..39abe4c5 100644
--- a/maintenance/cleanupSpam.php
+++ b/maintenance/cleanupSpam.php
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CleanupSpam extends Maintenance {
public function __construct() {
@@ -31,7 +32,7 @@ class CleanupSpam extends Maintenance {
}
public function execute() {
- global $wgLocalDatabases;
+ global $wgLocalDatabases, $wgUser;
$username = wfMsg( 'spambot_username' );
$wgUser = User::newFromName( $username );
@@ -44,15 +45,15 @@ class CleanupSpam extends Maintenance {
if ( !$like ) {
$this->error( "Not a valid hostname specification: $spec", true );
}
-
- if ( $this->hasOption('all') ) {
+
+ if ( $this->hasOption( 'all' ) ) {
// Clean up spam on all wikis
$this->output( "Finding spam on " . count( $wgLocalDatabases ) . " wikis\n" );
$found = false;
foreach ( $wgLocalDatabases as $wikiID ) {
$dbr = wfGetDB( DB_SLAVE, array(), $wikiID );
- $count = $dbr->selectField( 'externallinks', 'COUNT(*)',
+ $count = $dbr->selectField( 'externallinks', 'COUNT(*)',
array( 'el_index' . $dbr->buildLike( $like ) ), __METHOD__ );
if ( $count ) {
$found = true;
@@ -68,7 +69,7 @@ class CleanupSpam extends Maintenance {
// Clean up spam on this wiki
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'externallinks', array( 'DISTINCT el_from' ),
+ $res = $dbr->select( 'externallinks', array( 'DISTINCT el_from' ),
array( 'el_index' . $dbr->buildLike( $like ) ), __METHOD__ );
$count = $dbr->numRows( $res );
$this->output( "Found $count articles containing $spec\n" );
@@ -87,15 +88,15 @@ class CleanupSpam extends Maintenance {
$this->error( "Internal error: no page for ID $id" );
return;
}
-
+
$this->output( $title->getPrefixedDBkey() . " ..." );
$rev = Revision::newFromTitle( $title );
$revId = $rev->getId();
$currentRevId = $revId;
-
+
while ( $rev && LinkFilter::matchEntry( $rev->getText() , $domain ) ) {
# Revision::getPrevious can't be used in this way before MW 1.6 (Revision.php 1.26)
- #$rev = $rev->getPrevious();
+ # $rev = $rev->getPrevious();
$revId = $title->getPreviousRevisionID( $revId );
if ( $revId ) {
$rev = Revision::newFromTitle( $title, $revId );
@@ -114,14 +115,12 @@ class CleanupSpam extends Maintenance {
// Didn't find a non-spammy revision, blank the page
$this->output( "blanking\n" );
$article = new Article( $title );
- $article->updateArticle( '', wfMsg( 'spam_blanking', $domain ),
- false, false );
-
+ $article->doEdit( '', wfMsg( 'spam_blanking', $domain ) );
} else {
// Revert to this revision
$this->output( "reverting\n" );
$article = new Article( $title );
- $article->updateArticle( $rev->getText(), wfMsg( 'spam_reverting', $domain ), false, false );
+ $article->doEdit( $rev->getText(), wfMsg( 'spam_reverting', $domain ), EDIT_UPDATE );
}
$dbw->commit();
wfDoUpdates();
@@ -130,4 +129,4 @@ class CleanupSpam extends Maintenance {
}
$maintClass = "CleanupSpam";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupTable.inc b/maintenance/cleanupTable.inc
index 3549a9a1..67a32510 100644
--- a/maintenance/cleanupTable.inc
+++ b/maintenance/cleanupTable.inc
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class TableCleanup extends Maintenance {
protected $defaultParams = array(
@@ -44,7 +45,7 @@ class TableCleanup extends Maintenance {
global $wgUser;
$wgUser->setName( 'Conversion script' );
$this->dryrun = $this->hasOption( 'dry-run' );
- if( $this->dryrun ) {
+ if ( $this->dryrun ) {
$this->output( "Checking for bad titles...\n" );
} else {
$this->output( "Checking and fixing bad titles...\n" );
@@ -63,7 +64,7 @@ class TableCleanup extends Maintenance {
protected function progress( $updated ) {
$this->updated += $updated;
$this->processed++;
- if( $this->processed % $this->reportInterval != 0 ) {
+ if ( $this->processed % $this->reportInterval != 0 ) {
return;
}
$portion = $this->processed / $this->count;
@@ -74,7 +75,7 @@ class TableCleanup extends Maintenance {
$estimatedTotalTime = $delta / $portion;
$eta = $this->startTime + $estimatedTotalTime;
- $this->output(
+ $this->output(
sprintf( "%s %s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec <%.2f%% updated>\n",
wfWikiID(),
wfTimestamp( TS_DB, intval( $now ) ),
@@ -84,7 +85,7 @@ class TableCleanup extends Maintenance {
$this->processed,
$this->count,
$this->processed / $delta,
- $updateRate * 100.0
+ $updateRate * 100.0
)
);
flush();
@@ -94,9 +95,9 @@ class TableCleanup extends Maintenance {
$dbr = wfGetDB( DB_SLAVE );
if ( array_diff( array_keys( $params ),
- array( 'table', 'conds', 'index', 'callback' ) ) )
+ array( 'table', 'conds', 'index', 'callback' ) ) )
{
- throw new MWException( __METHOD__.': Missing parameter ' . implode( ', ', $params ) );
+ throw new MWException( __METHOD__ . ': Missing parameter ' . implode( ', ', $params ) );
}
$table = $params['table'];
diff --git a/maintenance/cleanupTitles.php b/maintenance/cleanupTitles.php
index ed714b2d..f03b7957 100644
--- a/maintenance/cleanupTitles.php
+++ b/maintenance/cleanupTitles.php
@@ -1,12 +1,12 @@
<?php
-/*
+/**
* Script to clean up broken, unparseable titles.
*
* Usage: php cleanupTitles.php [--fix]
* Options:
* --fix Actually clean up titles; otherwise just checks for them
*
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -24,11 +24,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author Brion Vibber <brion at pobox.com>
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/cleanupTable.inc' );
+require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
class TitleCleanup extends TableCleanup {
public function __construct() {
@@ -42,7 +43,7 @@ class TitleCleanup extends TableCleanup {
$verified = $wgContLang->normalize( $display );
$title = Title::newFromText( $verified );
- if( !is_null( $title )
+ if ( !is_null( $title )
&& $title->canExist()
&& $title->getNamespace() == $row->page_namespace
&& $title->getDBkey() === $row->page_title )
@@ -50,10 +51,10 @@ class TitleCleanup extends TableCleanup {
return $this->progress( 0 ); // all is fine
}
- if( $row->page_namespace == NS_FILE && $this->fileExists( $row->page_title ) ) {
+ if ( $row->page_namespace == NS_FILE && $this->fileExists( $row->page_title ) ) {
$this->output( "file $row->page_title needs cleanup, please run cleanupImages.php.\n" );
return $this->progress( 0 );
- } elseif( is_null( $title ) ) {
+ } elseif ( is_null( $title ) ) {
$this->output( "page $row->page_id ($display) is illegal.\n" );
$this->moveIllegalPage( $row );
return $this->progress( 1 );
@@ -77,23 +78,23 @@ class TitleCleanup extends TableCleanup {
$legalized = preg_replace_callback( "!([^$legal])!",
array( &$this, 'hexChar' ),
$row->page_title );
- if( $legalized == '.' ) $legalized = '(dot)';
- if( $legalized == '_' ) $legalized = '(space)';
+ if ( $legalized == '.' ) $legalized = '(dot)';
+ if ( $legalized == '_' ) $legalized = '(space)';
$legalized = 'Broken/' . $legalized;
$title = Title::newFromText( $legalized );
- if( is_null( $title ) ) {
+ if ( is_null( $title ) ) {
$clean = 'Broken/id:' . $row->page_id;
$this->output( "Couldn't legalize; form '$legalized' still invalid; using '$clean'\n" );
$title = Title::newFromText( $clean );
- } elseif( $title->exists() ) {
+ } elseif ( $title->exists() ) {
$clean = 'Broken/id:' . $row->page_id;
$this->output( "Legalized for '$legalized' exists; using '$clean'\n" );
$title = Title::newFromText( $clean );
}
$dest = $title->getDBkey();
- if( $this->dryrun ) {
+ if ( $this->dryrun ) {
$this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
} else {
$this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
@@ -106,28 +107,34 @@ class TitleCleanup extends TableCleanup {
}
protected function moveInconsistentPage( $row, $title ) {
- if( $title->exists() || $title->getInterwiki() ) {
- if( $title->getInterwiki() ) {
+ if ( $title->exists() || $title->getInterwiki() || !$title->canExist() ) {
+ if ( $title->getInterwiki() || !$title->canExist() ) {
$prior = $title->getPrefixedDbKey();
} else {
$prior = $title->getDBkey();
}
+
+ # Old cleanupTitles could move articles there. See bug 23147.
+ $ns = $row->page_namespace;
+ if ( $ns < 0 ) $ns = 0;
+
$clean = 'Broken/' . $prior;
- $verified = Title::makeTitleSafe( $row->page_namespace, $clean );
- if( $verified->exists() ) {
+ $verified = Title::makeTitleSafe( $ns, $clean );
+ if ( $verified->exists() ) {
$blah = "Broken/id:" . $row->page_id;
$this->output( "Couldn't legalize; form '$clean' exists; using '$blah'\n" );
- $verified = Title::makeTitleSafe( $row->page_namespace, $blah );
+ $verified = Title::makeTitleSafe( $ns, $blah );
}
$title = $verified;
}
- if( is_null( $title ) ) {
+ if ( is_null( $title ) ) {
$this->error( "Something awry; empty title.", true );
}
$ns = $title->getNamespace();
$dest = $title->getDBkey();
- if( $this->dryrun ) {
- $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
+
+ if ( $this->dryrun ) {
+ $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
} else {
$this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
$dbw = wfGetDB( DB_MASTER );
@@ -145,4 +152,4 @@ class TitleCleanup extends TableCleanup {
}
$maintClass = "TitleCleanup";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupWatchlist.php b/maintenance/cleanupWatchlist.php
index ed84b268..a9b20fea 100644
--- a/maintenance/cleanupWatchlist.php
+++ b/maintenance/cleanupWatchlist.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Script to remove broken, unparseable titles in the Watchlist.
*
* Usage: php cleanupWatchlist.php [--fix]
@@ -24,11 +24,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author Brion Vibber <brion at pobox.com>
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/cleanupTable.inc' );
+require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
class WatchlistCleanup extends TableCleanup {
protected $defaultParams = array(
@@ -58,7 +59,7 @@ class WatchlistCleanup extends TableCleanup {
$verified = $wgContLang->normalize( $display );
$title = Title::newFromText( $verified );
- if( $row->wl_user == 0 || is_null( $title ) || !$title->equals( $current ) ) {
+ if ( $row->wl_user == 0 || is_null( $title ) || !$title->equals( $current ) ) {
$this->output( "invalid watch by {$row->wl_user} for ({$row->wl_namespace}, \"{$row->wl_title}\")\n" );
$updated = $this->removeWatch( $row );
$this->progress( $updated );
@@ -68,7 +69,7 @@ class WatchlistCleanup extends TableCleanup {
}
private function removeWatch( $row ) {
- if( !$this->dryrun && $this->hasOption( 'fix' ) ) {
+ if ( !$this->dryrun && $this->hasOption( 'fix' ) ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'watchlist', array(
'wl_user' => $row->wl_user,
@@ -84,4 +85,4 @@ class WatchlistCleanup extends TableCleanup {
}
$maintClass = "WatchlistCleanup";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clear_interwiki_cache.php b/maintenance/clear_interwiki_cache.php
index a3510a06..953bd4ce 100644
--- a/maintenance/clear_interwiki_cache.php
+++ b/maintenance/clear_interwiki_cache.php
@@ -18,10 +18,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ClearInterwikiCache extends Maintenance {
@@ -42,7 +43,7 @@ class ClearInterwikiCache extends Maintenance {
foreach ( $wgLocalDatabases as $db ) {
$this->output( "$db..." );
foreach ( $prefixes as $prefix ) {
- $wgMemc->delete("$db:interwiki:$prefix");
+ $wgMemc->delete( "$db:interwiki:$prefix" );
}
$this->output( "done\n" );
}
@@ -50,4 +51,4 @@ class ClearInterwikiCache extends Maintenance {
}
$maintClass = "ClearInterwikiCache";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clear_stats.php b/maintenance/clear_stats.php
index 6a6a4981..8f91864e 100644
--- a/maintenance/clear_stats.php
+++ b/maintenance/clear_stats.php
@@ -1,7 +1,7 @@
<?php
/**
* This script remove all statistics tracking from the 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
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class clear_stats extends Maintenance {
@@ -32,22 +33,22 @@ class clear_stats extends Maintenance {
public function execute() {
global $wgLocalDatabases, $wgMemc;
foreach ( $wgLocalDatabases as $db ) {
- $wgMemc->delete("$db:stats:request_with_session");
- $wgMemc->delete("$db:stats:request_without_session");
- $wgMemc->delete("$db:stats:pcache_hit");
- $wgMemc->delete("$db:stats:pcache_miss_invalid");
- $wgMemc->delete("$db:stats:pcache_miss_expired");
- $wgMemc->delete("$db:stats:pcache_miss_absent");
- $wgMemc->delete("$db:stats:pcache_miss_stub");
- $wgMemc->delete("$db:stats:image_cache_hit");
- $wgMemc->delete("$db:stats:image_cache_miss");
- $wgMemc->delete("$db:stats:image_cache_update");
- $wgMemc->delete("$db:stats:diff_cache_hit");
- $wgMemc->delete("$db:stats:diff_cache_miss");
- $wgMemc->delete("$db:stats:diff_uncacheable");
+ $wgMemc->delete( "$db:stats:request_with_session" );
+ $wgMemc->delete( "$db:stats:request_without_session" );
+ $wgMemc->delete( "$db:stats:pcache_hit" );
+ $wgMemc->delete( "$db:stats:pcache_miss_invalid" );
+ $wgMemc->delete( "$db:stats:pcache_miss_expired" );
+ $wgMemc->delete( "$db:stats:pcache_miss_absent" );
+ $wgMemc->delete( "$db:stats:pcache_miss_stub" );
+ $wgMemc->delete( "$db:stats:image_cache_hit" );
+ $wgMemc->delete( "$db:stats:image_cache_miss" );
+ $wgMemc->delete( "$db:stats:image_cache_update" );
+ $wgMemc->delete( "$db:stats:diff_cache_hit" );
+ $wgMemc->delete( "$db:stats:diff_cache_miss" );
+ $wgMemc->delete( "$db:stats:diff_uncacheable" );
}
}
}
$maintClass = "clear_stats";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc
index 332527ba..4ae753ba 100644
--- a/maintenance/commandLine.inc
+++ b/maintenance/commandLine.inc
@@ -3,10 +3,11 @@
/**
* Backwards-compatibility wrapper for old-style maintenance scripts
*/
-require( dirname(__FILE__) . '/Maintenance.php' );
+require( dirname( __FILE__ ) . '/Maintenance.php' );
+global $optionsWithArgs;
if ( !isset( $optionsWithArgs ) ) {
- $optionsWithArgs = array();
+ $optionsWithArgs = array();
}
class CommandLineInc extends Maintenance {
@@ -42,5 +43,5 @@ class CommandLineInc extends Maintenance {
}
$maintClass = 'CommandLineInc';
-require( DO_MAINTENANCE );
+require( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/convertLinks.inc b/maintenance/convertLinks.inc
deleted file mode 100644
index 7c7b8aff..00000000
--- a/maintenance/convertLinks.inc
+++ /dev/null
@@ -1,218 +0,0 @@
-<?php
-/**
- * @file
- * @todo document
- * @ingroup Maintenance
- */
-
-/** */
-function convertLinks() {
- global $wgDBtype;
- if( $wgDBtype == 'postgres' ) {
- wfOut( "Links table already ok on Postgres.\n" );
- return;
- }
-
- wfOut( "Converting links table to ID-ID...\n" );
-
- global $wgLang, $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname;
- global $noKeys, $logPerformance, $fh;
-
- $tuplesAdded = $numBadLinks = $curRowsRead = 0; #counters etc
- $totalTuplesInserted = 0; # total tuples INSERTed into links_temp
-
- $reportCurReadProgress = true; #whether or not to give progress reports while reading IDs from cur table
- $curReadReportInterval = 1000; #number of rows between progress reports
-
- $reportLinksConvProgress = true; #whether or not to give progress reports during conversion
- $linksConvInsertInterval = 1000; #number of rows per INSERT
-
- $initialRowOffset = 0;
- #$finalRowOffset = 0; # not used yet; highest row number from links table to process
-
- # Overwrite the old links table with the new one. If this is set to false,
- # the new table will be left at links_temp.
- $overwriteLinksTable = true;
-
- # Don't create keys, and so allow duplicates in the new links table.
- # This gives a huge speed improvement for very large links tables which are MyISAM. (What about InnoDB?)
- $noKeys = false;
-
-
- $logPerformance = false; # output performance data to a file
- $perfLogFilename = "convLinksPerf.txt";
- #--------------------------------------------------------------------
-
- $dbw = wfGetDB( DB_MASTER );
- list ($cur, $links, $links_temp, $links_backup) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
-
- // Get database-agnostic limit clause
- $sql_limit = $dbw->limitResult( "SELECT l_from FROM $links", 1 );
- $res = $dbw->query( $sql_limit );
- if ( $dbw->fieldType( $res, 0 ) == "int" ) {
- wfOut( "Schema already converted\n" );
- return;
- }
-
- $res = $dbw->query( "SELECT COUNT(*) AS count FROM $links" );
- $row = $dbw->fetchObject($res);
- $numRows = $row->count;
- $dbw->freeResult( $res );
-
- if ( $numRows == 0 ) {
- wfOut( "Updating schema (no rows to convert)...\n" );
- createTempTable();
- } else {
- if ( $logPerformance ) { $fh = fopen ( $perfLogFilename, "w" ); }
- $baseTime = $startTime = getMicroTime();
- # Create a title -> cur_id map
- wfOut( "Loading IDs from $cur table...\n" );
- performanceLog ( "Reading $numRows rows from cur table...\n" );
- performanceLog ( "rows read vs seconds elapsed:\n" );
-
- $dbw->bufferResults( false );
- $res = $dbw->query( "SELECT cur_namespace,cur_title,cur_id FROM $cur" );
- $ids = array();
-
- while ( $row = $dbw->fetchObject( $res ) ) {
- $title = $row->cur_title;
- if ( $row->cur_namespace ) {
- $title = $wgLang->getNsText( $row->cur_namespace ) . ":$title";
- }
- $ids[$title] = $row->cur_id;
- $curRowsRead++;
- if ($reportCurReadProgress) {
- if (($curRowsRead % $curReadReportInterval) == 0) {
- performanceLog( $curRowsRead . " " . (getMicroTime() - $baseTime) . "\n" );
- wfOut( "\t$curRowsRead rows of $cur table read.\n" );
- }
- }
- }
- $dbw->freeResult( $res );
- $dbw->bufferResults( true );
- wfOut( "Finished loading IDs.\n\n" );
- performanceLog( "Took " . (getMicroTime() - $baseTime) . " seconds to load IDs.\n\n" );
- #--------------------------------------------------------------------
-
- # Now, step through the links table (in chunks of $linksConvInsertInterval rows),
- # convert, and write to the new table.
- createTempTable();
- performanceLog( "Resetting timer.\n\n" );
- $baseTime = getMicroTime();
- wfOut( "Processing $numRows rows from $links table...\n" );
- performanceLog( "Processing $numRows rows from $links table...\n" );
- performanceLog( "rows inserted vs seconds elapsed:\n" );
-
- for ($rowOffset = $initialRowOffset; $rowOffset < $numRows; $rowOffset += $linksConvInsertInterval) {
- $sqlRead = "SELECT * FROM $links ";
- $sqlRead = $dbw->limitResult($sqlRead, $linksConvInsertInterval,$rowOffset);
- $res = $dbw->query($sqlRead);
- if ( $noKeys ) {
- $sqlWrite = array("INSERT INTO $links_temp (l_from,l_to) VALUES ");
- } else {
- $sqlWrite = array("INSERT IGNORE INTO $links_temp (l_from,l_to) VALUES ");
- }
-
- $tuplesAdded = 0; # no tuples added to INSERT yet
- while ( $row = $dbw->fetchObject($res) ) {
- $fromTitle = $row->l_from;
- if ( array_key_exists( $fromTitle, $ids ) ) { # valid title
- $from = $ids[$fromTitle];
- $to = $row->l_to;
- if ( $tuplesAdded != 0 ) {
- $sqlWrite[] = ",";
- }
- $sqlWrite[] = "($from,$to)";
- $tuplesAdded++;
- } else { # invalid title
- $numBadLinks++;
- }
- }
- $dbw->freeResult($res);
- #wfOut( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
- if ( $tuplesAdded != 0 ) {
- if ($reportLinksConvProgress) {
- wfOut( "Inserting $tuplesAdded tuples into $links_temp..." );
- }
- $dbw->query( implode("",$sqlWrite) );
- $totalTuplesInserted += $tuplesAdded;
- if ($reportLinksConvProgress)
- wfOut( " done. Total $totalTuplesInserted tuples inserted.\n" );
- performanceLog( $totalTuplesInserted . " " . (getMicroTime() - $baseTime) . "\n" );
- }
- }
- wfOut( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n\n" );
- performanceLog( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n" );
- performanceLog( "Total execution time: " . (getMicroTime() - $startTime) . " seconds.\n" );
- if ( $logPerformance ) { fclose ( $fh ); }
- }
- #--------------------------------------------------------------------
-
- if ( $overwriteLinksTable ) {
- $dbConn = Database::newFromParams( $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname );
- if (!($dbConn->isOpen())) {
- wfOut( "Opening connection to database failed.\n" );
- return;
- }
- # Check for existing links_backup, and delete it if it exists.
- wfOut( "Dropping backup links table if it exists..." );
- $dbConn->query( "DROP TABLE IF EXISTS $links_backup", DB_MASTER);
- wfOut( " done.\n" );
-
- # Swap in the new table, and move old links table to links_backup
- wfOut( "Swapping tables '$links' to '$links_backup'; '$links_temp' to '$links'..." );
- $dbConn->query( "RENAME TABLE links TO $links_backup, $links_temp TO $links", DB_MASTER );
- wfOut( " done.\n\n" );
-
- $dbConn->close();
- wfOut( "Conversion complete. The old table remains at $links_backup;\n" );
- wfOut( "delete at your leisure.\n" );
- } else {
- wfOut( "Conversion complete. The converted table is at $links_temp;\n" );
- wfOut( "the original links table is unchanged.\n" );
- }
-}
-
-#--------------------------------------------------------------------
-
-function createTempTable() {
- global $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname;
- global $noKeys;
- $dbConn = Database::newFromParams( $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname );
-
- if (!($dbConn->isOpen())) {
- wfOut( "Opening connection to database failed.\n" );
- return;
- }
- $links_temp = $dbConn->tableName( 'links_temp' );
-
- wfOut( "Dropping temporary links table if it exists..." );
- $dbConn->query( "DROP TABLE IF EXISTS $links_temp");
- wfOut( " done.\n" );
-
- wfOut( "Creating temporary links table..." );
- if ( $noKeys ) {
- $dbConn->query( "CREATE TABLE $links_temp ( " .
- "l_from int(8) unsigned NOT NULL default '0', " .
- "l_to int(8) unsigned NOT NULL default '0')");
- } else {
- $dbConn->query( "CREATE TABLE $links_temp ( " .
- "l_from int(8) unsigned NOT NULL default '0', " .
- "l_to int(8) unsigned NOT NULL default '0', " .
- "UNIQUE KEY l_from(l_from,l_to), " .
- "KEY (l_to))");
- }
- wfOut( " done.\n\n" );
-}
-
-function performanceLog( $text ) {
- global $logPerformance, $fh;
- if ( $logPerformance ) {
- fwrite( $fh, $text );
- }
-}
-
-function getMicroTime() { # return time in seconds, with microsecond accuracy
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec + (float)$sec);
-}
diff --git a/maintenance/convertLinks.php b/maintenance/convertLinks.php
index 415662a0..b7a55d57 100644
--- a/maintenance/convertLinks.php
+++ b/maintenance/convertLinks.php
@@ -18,95 +18,111 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ConvertLinks extends Maintenance {
+ private $logPerformance;
public function __construct() {
parent::__construct();
$this->mDescription = "Convert from the old links schema (string->ID) to the new schema (ID->ID)
The wiki should be put into read-only mode while this script executes";
+
+ $this->addArg( 'logperformance', "Log performance to perfLogFilename.", false );
+ $this->addArg( 'perfLogFilename', "Filename where performance is logged if --logperformance was set (defaults to 'convLinksPerf.txt').", false );
+ $this->addArg( 'keep-links-table', "Don't overwrite the old links table with the new one, leave the new table at links_temp.", false );
+ $this->addArg( 'nokeys', "Don't create keys, and so allow duplicates in the new links table.\n
+This gives a huge speed improvement for very large links tables which are MyISAM." /* (What about InnoDB?) */, false );
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_ADMIN;
}
public function execute() {
- global $wgDBtype;
- if( $wgDBtype == 'postgres' ) {
- $this->output( "Links table already ok on Postgres.\n" );
+ $dbw = wfGetDB( DB_MASTER );
+
+ $type = $dbw->getType();
+ if ( $type != 'mysql' ) {
+ $this->output( "Link table conversion not necessary for $type\n" );
return;
}
- $this->output( "Converting links table to ID-ID...\n" );
+ global $wgContLang;
- global $wgLang, $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname;
- global $noKeys, $logPerformance, $fh;
-
- $tuplesAdded = $numBadLinks = $curRowsRead = 0; #counters etc
+ $numBadLinks = $curRowsRead = 0; # counters etc
$totalTuplesInserted = 0; # total tuples INSERTed into links_temp
-
- $reportCurReadProgress = true; #whether or not to give progress reports while reading IDs from cur table
- $curReadReportInterval = 1000; #number of rows between progress reports
-
- $reportLinksConvProgress = true; #whether or not to give progress reports during conversion
- $linksConvInsertInterval = 1000; #number of rows per INSERT
-
+
+ $reportCurReadProgress = true; # whether or not to give progress reports while reading IDs from cur table
+ $curReadReportInterval = 1000; # number of rows between progress reports
+
+ $reportLinksConvProgress = true; # whether or not to give progress reports during conversion
+ $linksConvInsertInterval = 1000; # number of rows per INSERT
+
$initialRowOffset = 0;
- #$finalRowOffset = 0; # not used yet; highest row number from links table to process
-
- # Overwrite the old links table with the new one. If this is set to false,
- # the new table will be left at links_temp.
- $overwriteLinksTable = true;
-
- # Don't create keys, and so allow duplicates in the new links table.
- # This gives a huge speed improvement for very large links tables which are MyISAM. (What about InnoDB?)
- $noKeys = false;
-
-
- $logPerformance = false; # output performance data to a file
- $perfLogFilename = "convLinksPerf.txt";
- #--------------------------------------------------------------------
-
- $dbw = wfGetDB( DB_MASTER );
- list ($cur, $links, $links_temp, $links_backup) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
-
+ # $finalRowOffset = 0; # not used yet; highest row number from links table to process
+
+ $overwriteLinksTable = !$this->hasOption( 'keep-links-table' );
+ $noKeys = $this->hasOption( 'noKeys' );
+ $this->logPerformance = $this->hasOption( 'logperformance' );
+ $perfLogFilename = $this->getArg( 'perfLogFilename', "convLinksPerf.txt" );
+
+ # --------------------------------------------------------------------
+
+ list ( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
+
+ if( $dbw->tableExists( 'pagelinks' ) ) {
+ $this->output( "...have pagelinks; skipping old links table updates\n" );
+ return;
+ }
+
$res = $dbw->query( "SELECT l_from FROM $links LIMIT 1" );
if ( $dbw->fieldType( $res, 0 ) == "int" ) {
$this->output( "Schema already converted\n" );
return;
}
-
+
$res = $dbw->query( "SELECT COUNT(*) AS count FROM $links" );
- $row = $dbw->fetchObject($res);
+ $row = $dbw->fetchObject( $res );
$numRows = $row->count;
$dbw->freeResult( $res );
-
+
if ( $numRows == 0 ) {
$this->output( "Updating schema (no rows to convert)...\n" );
$this->createTempTable();
} else {
- if ( $logPerformance ) { $fh = fopen ( $perfLogFilename, "w" ); }
+ $fh = false;
+ if ( $this->logPerformance ) {
+ $fh = fopen ( $perfLogFilename, "w" );
+ if ( !$fh ) {
+ $this->error( "Couldn't open $perfLogFilename" );
+ $this->logPerformance = false;
+ }
+ }
$baseTime = $startTime = $this->getMicroTime();
# Create a title -> cur_id map
$this->output( "Loading IDs from $cur table...\n" );
- $this->performanceLog ( "Reading $numRows rows from cur table...\n" );
- $this->performanceLog ( "rows read vs seconds elapsed:\n" );
+ $this->performanceLog ( $fh, "Reading $numRows rows from cur table...\n" );
+ $this->performanceLog ( $fh, "rows read vs seconds elapsed:\n" );
$dbw->bufferResults( false );
$res = $dbw->query( "SELECT cur_namespace,cur_title,cur_id FROM $cur" );
$ids = array();
- while ( $row = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$title = $row->cur_title;
if ( $row->cur_namespace ) {
- $title = $wgLang->getNsText( $row->cur_namespace ) . ":$title";
+ $title = $wgContLang->getNsText( $row->cur_namespace ) . ":$title";
}
$ids[$title] = $row->cur_id;
$curRowsRead++;
- if ($reportCurReadProgress) {
- if (($curRowsRead % $curReadReportInterval) == 0) {
- $this->performanceLog( $curRowsRead . " " . ($this->getMicroTime() - $baseTime) . "\n" );
+ if ( $reportCurReadProgress ) {
+ if ( ( $curRowsRead % $curReadReportInterval ) == 0 ) {
+ $this->performanceLog( $fh, $curRowsRead . " " . ( $this->getMicroTime() - $baseTime ) . "\n" );
$this->output( "\t$curRowsRead rows of $cur table read.\n" );
}
}
@@ -114,30 +130,31 @@ The wiki should be put into read-only mode while this script executes";
$dbw->freeResult( $res );
$dbw->bufferResults( true );
$this->output( "Finished loading IDs.\n\n" );
- $this->performanceLog( "Took " . ($this->getMicroTime() - $baseTime) . " seconds to load IDs.\n\n" );
- #--------------------------------------------------------------------
-
+ $this->performanceLog( $fh, "Took " . ( $this->getMicroTime() - $baseTime ) . " seconds to load IDs.\n\n" );
+
+ # --------------------------------------------------------------------
+
# Now, step through the links table (in chunks of $linksConvInsertInterval rows),
# convert, and write to the new table.
$this->createTempTable();
- $this->performanceLog( "Resetting timer.\n\n" );
+ $this->performanceLog( $fh, "Resetting timer.\n\n" );
$baseTime = $this->getMicroTime();
$this->output( "Processing $numRows rows from $links table...\n" );
- $this->performanceLog( "Processing $numRows rows from $links table...\n" );
- $this->performanceLog( "rows inserted vs seconds elapsed:\n" );
-
- for ($rowOffset = $initialRowOffset; $rowOffset < $numRows; $rowOffset += $linksConvInsertInterval) {
+ $this->performanceLog( $fh, "Processing $numRows rows from $links table...\n" );
+ $this->performanceLog( $fh, "rows inserted vs seconds elapsed:\n" );
+
+ for ( $rowOffset = $initialRowOffset; $rowOffset < $numRows; $rowOffset += $linksConvInsertInterval ) {
$sqlRead = "SELECT * FROM $links ";
- $sqlRead = $dbw->limitResult($sqlRead, $linksConvInsertInterval,$rowOffset);
- $res = $dbw->query($sqlRead);
+ $sqlRead = $dbw->limitResult( $sqlRead, $linksConvInsertInterval, $rowOffset );
+ $res = $dbw->query( $sqlRead );
if ( $noKeys ) {
- $sqlWrite = array("INSERT INTO $links_temp (l_from,l_to) VALUES ");
+ $sqlWrite = array( "INSERT INTO $links_temp (l_from,l_to) VALUES " );
} else {
- $sqlWrite = array("INSERT IGNORE INTO $links_temp (l_from,l_to) VALUES ");
+ $sqlWrite = array( "INSERT IGNORE INTO $links_temp (l_from,l_to) VALUES " );
}
-
+
$tuplesAdded = 0; # no tuples added to INSERT yet
- while ( $row = $dbw->fetchObject($res) ) {
+ foreach ( $res as $row ) {
$fromTitle = $row->l_from;
if ( array_key_exists( $fromTitle, $ids ) ) { # valid title
$from = $ids[$fromTitle];
@@ -151,43 +168,40 @@ The wiki should be put into read-only mode while this script executes";
$numBadLinks++;
}
}
- $dbw->freeResult($res);
- #$this->output( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
+ $dbw->freeResult( $res );
+ # $this->output( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
if ( $tuplesAdded != 0 ) {
- if ($reportLinksConvProgress) {
+ if ( $reportLinksConvProgress ) {
$this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
}
- $dbw->query( implode("",$sqlWrite) );
+ $dbw->query( implode( "", $sqlWrite ) );
$totalTuplesInserted += $tuplesAdded;
- if ($reportLinksConvProgress)
+ if ( $reportLinksConvProgress )
$this->output( " done. Total $totalTuplesInserted tuples inserted.\n" );
- $this->performanceLog( $totalTuplesInserted . " " . ($this->getMicroTime() - $baseTime) . "\n" );
+ $this->performanceLog( $fh, $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n" );
}
}
$this->output( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n\n" );
- $this->performanceLog( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n" );
- $this->performanceLog( "Total execution time: " . ($this->getMicroTime() - $startTime) . " seconds.\n" );
- if ( $logPerformance ) { fclose ( $fh ); }
+ $this->performanceLog( $fh, "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n" );
+ $this->performanceLog( $fh, "Total execution time: " . ( $this->getMicroTime() - $startTime ) . " seconds.\n" );
+ if ( $this->logPerformance ) {
+ fclose ( $fh );
+ }
}
- #--------------------------------------------------------------------
-
+ # --------------------------------------------------------------------
+
if ( $overwriteLinksTable ) {
- $dbConn = Database::newFromParams( $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname );
- if (!($dbConn->isOpen())) {
- $this->output( "Opening connection to database failed.\n" );
- return;
- }
# Check for existing links_backup, and delete it if it exists.
$this->output( "Dropping backup links table if it exists..." );
- $dbConn->query( "DROP TABLE IF EXISTS $links_backup", DB_MASTER);
+ $dbw->query( "DROP TABLE IF EXISTS $links_backup", DB_MASTER );
$this->output( " done.\n" );
-
+
# Swap in the new table, and move old links table to links_backup
$this->output( "Swapping tables '$links' to '$links_backup'; '$links_temp' to '$links'..." );
- $dbConn->query( "RENAME TABLE links TO $links_backup, $links_temp TO $links", DB_MASTER );
+ $dbw->query( "RENAME TABLE links TO $links_backup, $links_temp TO $links", DB_MASTER );
$this->output( " done.\n\n" );
-
- $dbConn->close();
+
+ $dbw->close();
$this->output( "Conversion complete. The old table remains at $links_backup;\n" );
$this->output( "delete at your leisure.\n" );
} else {
@@ -197,47 +211,44 @@ The wiki should be put into read-only mode while this script executes";
}
private function createTempTable() {
- global $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname;
- global $noKeys;
- $dbConn = Database::newFromParams( $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname );
+ $dbConn = wfGetDB( DB_MASTER );
- if (!($dbConn->isOpen())) {
+ if ( !( $dbConn->isOpen() ) ) {
$this->output( "Opening connection to database failed.\n" );
return;
}
$links_temp = $dbConn->tableName( 'links_temp' );
$this->output( "Dropping temporary links table if it exists..." );
- $dbConn->query( "DROP TABLE IF EXISTS $links_temp");
+ $dbConn->query( "DROP TABLE IF EXISTS $links_temp" );
$this->output( " done.\n" );
$this->output( "Creating temporary links table..." );
- if ( $noKeys ) {
+ if ( $this->hasOption( 'noKeys' ) ) {
$dbConn->query( "CREATE TABLE $links_temp ( " .
"l_from int(8) unsigned NOT NULL default '0', " .
- "l_to int(8) unsigned NOT NULL default '0')");
+ "l_to int(8) unsigned NOT NULL default '0')" );
} else {
$dbConn->query( "CREATE TABLE $links_temp ( " .
"l_from int(8) unsigned NOT NULL default '0', " .
"l_to int(8) unsigned NOT NULL default '0', " .
"UNIQUE KEY l_from(l_from,l_to), " .
- "KEY (l_to))");
+ "KEY (l_to))" );
}
$this->output( " done.\n\n" );
}
- private function performanceLog( $text ) {
- global $logPerformance, $fh;
- if ( $logPerformance ) {
+ private function performanceLog( $fh, $text ) {
+ if ( $this->logPerformance ) {
fwrite( $fh, $text );
}
}
private function getMicroTime() { # return time in seconds, with microsecond accuracy
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec + (float)$sec);
+ list( $usec, $sec ) = explode( " ", microtime() );
+ return ( (float)$usec + (float)$sec );
}
}
$maintClass = "ConvertLinks";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php
index 657a82c1..278d40ff 100644
--- a/maintenance/convertUserOptions.php
+++ b/maintenance/convertUserOptions.php
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ConvertUserOptions extends Maintenance {
@@ -30,24 +31,24 @@ class ConvertUserOptions extends Maintenance {
parent::__construct();
$this->mDescription = "Convert user options from old to new system";
}
-
+
public function execute() {
$this->output( "Beginning batch conversion of user options.\n" );
$id = 0;
$dbw = wfGetDB( DB_MASTER );
- while ($id !== null) {
- $idCond = 'user_id>'.$dbw->addQuotes( $id );
- $optCond = "user_options!=".$dbw->addQuotes( '' ); // For compatibility
+ while ( $id !== null ) {
+ $idCond = 'user_id>' . $dbw->addQuotes( $id );
+ $optCond = "user_options!=" . $dbw->addQuotes( '' ); // For compatibility
$res = $dbw->select( 'user', '*',
array( $optCond, $idCond ), __METHOD__,
array( 'LIMIT' => 50, 'FOR UPDATE' ) );
$id = $this->convertOptionBatch( $res, $dbw );
$dbw->commit();
-
+
wfWaitForSlaves( 1 );
-
- if ($id)
+
+ if ( $id )
$this->output( "--Converted to ID $id\n" );
}
$this->output( "Conversion done. Converted " . $this->mConversionCount . " user records.\n" );
@@ -57,16 +58,16 @@ class ConvertUserOptions extends Maintenance {
$id = null;
foreach ( $res as $row ) {
$this->mConversionCount++;
-
+
$u = User::newFromRow( $row );
-
+
$u->saveSettings();
$id = $row->user_id;
}
-
+
return $id;
}
}
$maintClass = "ConvertUserOptions";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/createAndPromote.php b/maintenance/createAndPromote.php
index 391d1226..8bff284a 100644
--- a/maintenance/createAndPromote.php
+++ b/maintenance/createAndPromote.php
@@ -1,5 +1,4 @@
<?php
-
/**
* Maintenance script to create an account and grant it administrator rights
*
@@ -18,11 +17,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
* @author Rob Church <robchur@gmail.com>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CreateAndPromote extends Maintenance {
@@ -35,41 +35,41 @@ class CreateAndPromote extends Maintenance {
}
public function execute() {
- $username = $this->getArg(0);
- $password = $this->getArg(1);
-
+ $username = $this->getArg( 0 );
+ $password = $this->getArg( 1 );
+
$this->output( wfWikiID() . ": Creating and promoting User:{$username}..." );
-
+
$user = User::newFromName( $username );
- if( !is_object( $user ) ) {
+ if ( !is_object( $user ) ) {
$this->error( "invalid username.", true );
- } elseif( 0 != $user->idForName() ) {
+ } elseif ( 0 != $user->idForName() ) {
$this->error( "account exists.", true );
}
# Try to set the password
try {
$user->setPassword( $password );
- } catch( PasswordError $pwe ) {
+ } catch ( PasswordError $pwe ) {
$this->error( $pwe->getText(), true );
}
# Insert the account into the database
$user->addToDatabase();
$user->saveSettings();
-
+
# Promote user
$user->addGroup( 'sysop' );
- if( $this->hasOption( 'bureaucrat' ) )
+ if ( $this->hasOption( 'bureaucrat' ) )
$user->addGroup( 'bureaucrat' );
-
+
# Increment site_stats.ss_users
$ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
$ssu->doUpdate();
-
+
$this->output( "done.\n" );
}
}
$maintClass = "CreateAndPromote";
-require_once( DO_MAINTENANCE ); \ No newline at end of file
+require_once( RUN_MAINTENANCE_IF_MAIN ); \ No newline at end of file
diff --git a/skins/vector/cssjanus/COPYING b/maintenance/cssjanus/COPYING
index 3f2c8953..3f2c8953 100644
--- a/skins/vector/cssjanus/COPYING
+++ b/maintenance/cssjanus/COPYING
diff --git a/skins/vector/cssjanus/LICENSE b/maintenance/cssjanus/LICENSE
index d6456956..d6456956 100644
--- a/skins/vector/cssjanus/LICENSE
+++ b/maintenance/cssjanus/LICENSE
diff --git a/skins/vector/cssjanus/README b/maintenance/cssjanus/README
index 9b922156..9b922156 100644
--- a/skins/vector/cssjanus/README
+++ b/maintenance/cssjanus/README
diff --git a/skins/vector/cssjanus/cssjanus.py b/maintenance/cssjanus/cssjanus.py
index dd14bd58..dd14bd58 100644
--- a/skins/vector/cssjanus/cssjanus.py
+++ b/maintenance/cssjanus/cssjanus.py
diff --git a/skins/vector/cssjanus/csslex.py b/maintenance/cssjanus/csslex.py
index 1fc7304e..1fc7304e 100644
--- a/skins/vector/cssjanus/csslex.py
+++ b/maintenance/cssjanus/csslex.py
diff --git a/maintenance/deleteArchivedFiles.inc b/maintenance/deleteArchivedFiles.inc
new file mode 100644
index 00000000..e0ac225e
--- /dev/null
+++ b/maintenance/deleteArchivedFiles.inc
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Core functions for deleteArchivedFiles.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
+ *
+ * @ingroup Maintenance
+ */
+
+class DeleteArchivedFilesImplementation {
+ static public function doDelete( $output, $force ) {
+ # Data should come off the master, wrapped in a transaction
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+ $tbl_arch = $dbw->tableName( 'filearchive' );
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ # Get "active" revisions from the filearchive table
+ $output->handleOutput( "Searching for and deleting archived files...\n" );
+ $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" );
+ $count = 0;
+ foreach ( $res as $row ) {
+ $key = $row->fa_storage_key;
+ $group = $row->fa_storage_group;
+ $id = $row->fa_id;
+ $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
+ $sha1 = substr( $key, 0, strcspn( $key, '.' ) );
+ // Check if the file is used anywhere...
+ $inuse = $dbw->selectField( 'oldimage', '1',
+ array( 'oi_sha1' => $sha1,
+ 'oi_deleted & ' . File::DELETED_FILE => File::DELETED_FILE ),
+ __METHOD__,
+ array( 'FOR UPDATE' )
+ );
+ if ( $path && file_exists( $path ) && !$inuse ) {
+ unlink( $path ); // delete
+ $count++;
+ $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
+ } else {
+ $output->handleOutput( "Notice - file '$key' not found in group '$group'\n" );
+ if ( $force ) {
+ $output->handleOutput( "Got --force, deleting DB entry\n" );
+ $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
+ }
+ }
+ }
+ $dbw->commit();
+ $output->handleOutput( "Done! [$count file(s)]\n" );
+ }
+} \ No newline at end of file
diff --git a/maintenance/deleteArchivedFiles.php b/maintenance/deleteArchivedFiles.php
index af4bbb74..6067c807 100644
--- a/maintenance/deleteArchivedFiles.php
+++ b/maintenance/deleteArchivedFiles.php
@@ -23,7 +23,8 @@
* Based on deleteOldRevisions.php by Rob Church
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/deleteArchivedFiles.inc' );
class DeleteArchivedFiles extends Maintenance {
public function __construct() {
@@ -33,50 +34,19 @@ class DeleteArchivedFiles extends Maintenance {
$this->addOption( 'force', 'Force deletion of rows from filearchive' );
}
+ public function handleOutput( $str ) {
+ return $this->output( $str );
+ }
+
public function execute() {
- if( !$this->hasOption('delete') ) {
+ if ( !$this->hasOption( 'delete' ) ) {
$this->output( "Use --delete to actually confirm this script\n" );
return;
}
$force = $this->hasOption( 'force' );
- # Data should come off the master, wrapped in a transaction
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
- $tbl_arch = $dbw->tableName( 'filearchive' );
- $repo = RepoGroup::singleton()->getLocalRepo();
- # Get "active" revisions from the filearchive table
- $this->output( "Searching for and deleting archived files...\n" );
- $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" );
- $count = 0;
- foreach( $res as $row ) {
- $key = $row->fa_storage_key;
- $group = $row->fa_storage_group;
- $id = $row->fa_id;
- $path = $repo->getZonePath( 'deleted' ).'/'.$repo->getDeletedHashPath($key).$key;
- $sha1 = substr( $key, 0, strcspn( $key, '.' ) );
- // Check if the file is used anywhere...
- $inuse = $dbw->selectField( 'oldimage', '1',
- array( 'oi_sha1' => $sha1,
- 'oi_deleted & '.File::DELETED_FILE => File::DELETED_FILE ),
- __METHOD__,
- array( 'FOR UPDATE' )
- );
- if ( $path && file_exists($path) && !$inuse ) {
- unlink($path); // delete
- $count++;
- $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
- } else {
- $this->output( "Notice - file '$key' not found in group '$group'\n" );
- if ( $force ) {
- $this->output( "Got --force, deleting DB entry\n" );
- $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
- }
- }
- }
- $dbw->commit();
- $this->output( "Done! [$count file(s)]\n" );
+ DeleteArchivedFilesImplementation::doDelete( $this, $force );
}
}
$maintClass = "DeleteArchivedFiles";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteArchivedRevisions.inc b/maintenance/deleteArchivedRevisions.inc
new file mode 100644
index 00000000..10bd4cff
--- /dev/null
+++ b/maintenance/deleteArchivedRevisions.inc
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Delete archived (deleted from public) revisions from 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
+ *
+ * @ingroup Maintenance
+ */
+
+class DeleteArchivedRevisionsImplementation {
+
+ /**
+ * Perform the delete on archived revisions.
+
+ * @param $maint Object An object (typically of class Maintenance)
+ * that implements two methods: handleOutput() and
+ * purgeRedundantText(). See Maintenance for a description of
+ * those methods.
+ */
+ static public function doDelete( $maint ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ $dbw->begin();
+
+ $tbl_arch = $dbw->tableName( 'archive' );
+
+ # Delete as appropriate
+ $maint->handleOutput( "Deleting archived revisions... " );
+ $dbw->query( "DELETE FROM $tbl_arch" );
+
+ $count = $dbw->affectedRows();
+ $deletedRows = $count != 0;
+
+ $maint->handleOutput( "done. $count revisions deleted.\n" );
+
+ # This bit's done
+ # Purge redundant text records
+ $dbw->commit();
+ if ( $deletedRows ) {
+ $maint->purgeRedundantText( true );
+ }
+ }
+} \ No newline at end of file
diff --git a/maintenance/deleteArchivedRevisions.php b/maintenance/deleteArchivedRevisions.php
index c3f8bf11..0faa0abb 100644
--- a/maintenance/deleteArchivedRevisions.php
+++ b/maintenance/deleteArchivedRevisions.php
@@ -23,7 +23,8 @@
* Shamelessly stolen from deleteOldRevisions.php by Rob Church :)
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/deleteArchivedRevisions.inc' );
class DeleteArchivedRevisions extends Maintenance {
public function __construct() {
@@ -32,31 +33,17 @@ class DeleteArchivedRevisions extends Maintenance {
$this->addOption( 'delete', 'Performs the deletion' );
}
+ public function handleOutput( $str ) {
+ $this->output( $str );
+ }
+
public function execute() {
$this->output( "Delete archived revisions\n\n" );
# Data should come off the master, wrapped in a transaction
- $dbw = wfGetDB( DB_MASTER );
- if( $this->hasOption('delete') ) {
- $dbw->begin();
-
- $tbl_arch = $dbw->tableName( 'archive' );
-
- # Delete as appropriate
- $this->output( "Deleting archived revisions... " );
- $dbw->query( "TRUNCATE TABLE $tbl_arch" );
-
- $count = $dbw->affectedRows();
- $deletedRows = $count != 0;
-
- $this->output( "done. $count revisions deleted.\n" );
-
- # This bit's done
- # Purge redundant text records
- $dbw->commit();
- if( $deletedRows ) {
- $this->purgeRedundantText( true );
- }
+ if ( $this->hasOption( 'delete' ) ) {
+ DeleteArchivedRevisionsImplementation::doDelete( $this );
} else {
+ $dbw = wfGetDB( DB_MASTER );
$res = $dbw->selectRow( 'archive', 'COUNT(*) as count', array(), __FUNCTION__ );
$this->output( "Found {$res->count} revisions to delete.\n" );
$this->output( "Please run the script again with the --delete option to really delete the revisions.\n" );
@@ -65,4 +52,4 @@ class DeleteArchivedRevisions extends Maintenance {
}
$maintClass = "DeleteArchivedRevisions";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteBatch.php b/maintenance/deleteBatch.php
index 56afd86c..c8bb4803 100644
--- a/maintenance/deleteBatch.php
+++ b/maintenance/deleteBatch.php
@@ -26,39 +26,40 @@
*
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteBatch extends Maintenance {
-
+
public function __construct() {
parent::__construct();
$this->mDescription = "Deletes a batch of pages";
$this->addOption( 'u', "User to perform deletion", false, true );
$this->addOption( 'r', "Reason to delete page", false, true );
$this->addOption( 'i', "Interval to sleep between deletions" );
- $this->addArg( 'listfile', 'File with titles to delete, separated by newlines', false );
+ $this->addArg( 'listfile', 'File with titles to delete, separated by newlines. ' .
+ 'If not given, stdin will be used.', false );
}
-
+
public function execute() {
global $wgUser;
# Change to current working directory
$oldCwd = getcwd();
chdir( $oldCwd );
-
+
# Options processing
$user = $this->getOption( 'u', 'Delete page script' );
$reason = $this->getOption( 'r', '' );
$interval = $this->getOption( 'i', 0 );
- if( $this->hasArg() ) {
+ if ( $this->hasArg() ) {
$file = fopen( $this->getArg(), 'r' );
} else {
$file = $this->getStdin();
}
# Setup
- if( !$file ) {
+ if ( !$file ) {
$this->error( "Unable to read file, exiting", true );
}
$wgUser = User::newFromName( $user );
@@ -75,18 +76,18 @@ class DeleteBatch extends Maintenance {
$this->output( "Invalid title '$line' on line $linenum\n" );
continue;
}
- if( !$page->exists() ) {
+ if ( !$page->exists() ) {
$this->output( "Skipping nonexistent page '$line'\n" );
continue;
}
-
-
+
+
$this->output( $page->getPrefixedText() );
$dbw->begin();
- if( $page->getNamespace() == NS_FILE ) {
+ if ( $page->getNamespace() == NS_FILE ) {
$art = new ImagePage( $page );
$img = wfFindFile( $art->mTitle );
- if( !$img || !$img->delete( $reason ) ) {
+ if ( !$img || !$img->delete( $reason ) ) {
$this->output( "FAILED to delete image file... " );
}
} else {
@@ -99,7 +100,7 @@ class DeleteBatch extends Maintenance {
} else {
$this->output( " FAILED to delete article\n" );
}
-
+
if ( $interval ) {
sleep( $interval );
}
@@ -109,4 +110,4 @@ class DeleteBatch extends Maintenance {
}
$maintClass = "DeleteBatch";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php
index 3f0e1b1c..fc482ac0 100644
--- a/maintenance/deleteDefaultMessages.php
+++ b/maintenance/deleteDefaultMessages.php
@@ -1,6 +1,6 @@
<?php
/**
- * Deletes all pages in the MediaWiki namespace which were last edited by
+ * Deletes all pages in the MediaWiki namespace which were last edited by
* "MediaWiki default".
*
* This program is free software; you can redistribute it and/or modify
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteDefaultMessages extends Maintenance {
public function __construct() {
@@ -31,17 +31,11 @@ class DeleteDefaultMessages extends Maintenance {
}
public function execute() {
- self::reallyExecute();
- }
-
- public static function reallyExecute() {
+
$user = 'MediaWiki default';
$reason = 'No longer required';
- global $wgUser;
- $wgUser = User::newFromName( $user );
- $wgUser->addGroup( 'bot' );
-
+ $this->output( "Checking existence of old default messages..." );
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( array( 'page', 'revision' ),
array( 'page_namespace', 'page_title' ),
@@ -52,6 +46,20 @@ class DeleteDefaultMessages extends Maintenance {
)
);
+ if( $dbr->numRows( $res ) == 0 ) {
+ # No more messages left
+ $this->output( "done.\n" );
+ return;
+ }
+
+ # Deletions will be made by $user temporarly added to the bot group
+ # in order to hide it in RecentChanges.
+ global $wgUser;
+ $wgUser = User::newFromName( $user );
+ $wgUser->addGroup( 'bot' );
+
+ # Handle deletion
+ $this->output( "\n...deleting old default messages (this may take a long time!)...", 'msg' );
$dbw = wfGetDB( DB_MASTER );
foreach ( $res as $row ) {
@@ -65,8 +73,10 @@ class DeleteDefaultMessages extends Maintenance {
$article->doDeleteArticle( $reason );
$dbw->commit();
}
+
+ $this->output( 'done!', 'msg' );
}
}
$maintClass = "DeleteDefaultMessages";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteImageMemcached.php b/maintenance/deleteImageMemcached.php
index 9becddb8..007f0d17 100644
--- a/maintenance/deleteImageMemcached.php
+++ b/maintenance/deleteImageMemcached.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteImageCache extends Maintenance {
public function __construct() {
@@ -36,8 +36,8 @@ class DeleteImageCache extends Maintenance {
public function execute() {
global $wgMemc;
- $until = preg_replace( "/[^\d]/", '', $this->getOption('until') );
- $sleep = (int)$this->getOption('sleep') * 1000; // milliseconds
+ $until = preg_replace( "/[^\d]/", '', $this->getOption( 'until' ) );
+ $sleep = (int)$this->getOption( 'sleep' ) * 1000; // milliseconds
ini_set( 'display_errors', false );
@@ -53,12 +53,12 @@ class DeleteImageCache extends Maintenance {
$total = $this->getImageCount();
foreach ( $res as $row ) {
- if ($i % $this->report == 0)
- $this->output( sprintf("%s: %13s done (%s)\n", wfWikiID(), "$i/$total", wfPercent( $i / $total * 100 ) ) );
+ if ( $i % $this->report == 0 )
+ $this->output( sprintf( "%s: %13s done (%s)\n", wfWikiID(), "$i/$total", wfPercent( $i / $total * 100 ) ) );
$md5 = md5( $row->img_name );
$wgMemc->delete( wfMemcKey( 'Image', $md5 ) );
- if ($sleep != 0)
+ if ( $sleep != 0 )
usleep( $sleep );
++$i;
@@ -72,4 +72,4 @@ class DeleteImageCache extends Maintenance {
}
$maintClass = "DeleteImageCache";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteOldRevisions.php b/maintenance/deleteOldRevisions.php
index 1f4dc4c9..ba76e9e9 100644
--- a/maintenance/deleteOldRevisions.php
+++ b/maintenance/deleteOldRevisions.php
@@ -22,7 +22,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteOldRevisions extends Maintenance {
public function __construct() {
@@ -31,24 +31,24 @@ class DeleteOldRevisions extends Maintenance {
$this->addOption( 'delete', 'Actually perform the deletion' );
$this->addOption( 'page_id', 'List of page ids to work on', false );
}
-
+
public function execute() {
$this->output( "Delete old revisions\n\n" );
$this->doDelete( $this->hasOption( 'delete' ), $this->mArgs );
}
-
+
function doDelete( $delete = false, $args = array() ) {
# Data should come off the master, wrapped in a transaction
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
-
+
$tbl_pag = $dbw->tableName( 'page' );
$tbl_rev = $dbw->tableName( 'revision' );
-
+
$pageIdClause = '';
$revPageClause = '';
-
+
# If a list of page_ids was provided, limit results to that set of page_ids
if ( sizeof( $args ) > 0 ) {
$pageIdList = implode( ',', $args );
@@ -56,46 +56,46 @@ class DeleteOldRevisions extends Maintenance {
$revPageClause = " AND rev_page IN ({$pageIdList})";
$this->output( "Limiting to {$tbl_pag}.page_id IN ({$pageIdList})\n" );
}
-
+
# Get "active" revisions from the page table
$this->output( "Searching for active revisions..." );
$res = $dbw->query( "SELECT page_latest FROM $tbl_pag{$pageIdClause}" );
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$cur[] = $row->page_latest;
}
$this->output( "done.\n" );
-
+
# Get all revisions that aren't in this set
$old = array();
$this->output( "Searching for inactive revisions..." );
$set = implode( ', ', $cur );
$res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_id NOT IN ( $set ){$revPageClause}" );
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$old[] = $row->rev_id;
}
$this->output( "done.\n" );
-
+
# Inform the user of what we're going to do
$count = count( $old );
$this->output( "$count old revisions found.\n" );
-
+
# Delete as appropriate
- if( $delete && $count ) {
+ if ( $delete && $count ) {
$this->output( "Deleting..." );
$set = implode( ', ', $old );
$dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" );
$this->output( "done.\n" );
}
-
+
# This bit's done
# Purge redundant text records
$dbw->commit();
- if( $delete ) {
+ if ( $delete ) {
$this->purgeRedundantText( true );
}
}
}
$maintClass = "DeleteOldRevisions";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteOrphanedRevisions.php b/maintenance/deleteOrphanedRevisions.php
index 1146befb..e972d1fa 100644
--- a/maintenance/deleteOrphanedRevisions.php
+++ b/maintenance/deleteOrphanedRevisions.php
@@ -24,7 +24,7 @@
* @todo More efficient cleanup of text records
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteOrphanedRevisions extends Maintenance {
public function __construct() {
@@ -36,7 +36,7 @@ class DeleteOrphanedRevisions extends Maintenance {
public function execute() {
$this->output( "Delete Orphaned Revisions\n" );
- $report = $this->hasOption('report');
+ $report = $this->hasOption( 'report' );
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
@@ -46,45 +46,44 @@ class DeleteOrphanedRevisions extends Maintenance {
$this->output( "Checking for orphaned revisions..." );
$sql = "SELECT rev_id FROM {$revision} LEFT JOIN {$page} ON rev_page = page_id WHERE page_namespace IS NULL";
$res = $dbw->query( $sql, 'deleteOrphanedRevisions' );
-
+
# Stash 'em all up for deletion (if needed)
$revisions = array();
- foreach( $res as $row )
+ foreach ( $res as $row )
$revisions[] = $row->rev_id;
- $dbw->freeResult( $res );
$count = count( $revisions );
$this->output( "found {$count}.\n" );
-
+
# Nothing to do?
- if( $report || $count == 0 ) {
+ if ( $report || $count == 0 ) {
$dbw->commit();
- exit(0);
+ exit( 0 );
}
-
+
# Delete each revision
$this->output( "Deleting..." );
$this->deleteRevs( $revisions, $dbw );
$this->output( "done.\n" );
-
+
# Close the transaction and call the script to purge unused text records
$dbw->commit();
$this->purgeRedundantText( true );
}
-
+
/**
* Delete one or more revisions from the database
* Do this inside a transaction
*
* @param $id Array of revision id values
- * @param $db Database class (needs to be a master)
+ * @param $dbw Database class (needs to be a master)
*/
private function deleteRevs( $id, &$dbw ) {
- if( !is_array( $id ) )
+ if ( !is_array( $id ) )
$id = array( $id );
$dbw->delete( 'revision', array( 'rev_id' => $id ), __METHOD__ );
}
}
$maintClass = "DeleteOrphanedRevisions";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteRevision.php b/maintenance/deleteRevision.php
index 5dc0b59f..5e8ecaac 100644
--- a/maintenance/deleteRevision.php
+++ b/maintenance/deleteRevision.php
@@ -20,24 +20,24 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteRevision extends Maintenance {
-
+
public function __construct() {
parent::__construct();
$this->mDescription = "Delete one or more revisions by moving them to the archive table";
}
-
+
public function execute() {
- if( count( $this->mArgs ) == 0 ) {
+ if ( count( $this->mArgs ) == 0 ) {
$this->error( "No revisions specified", true );
}
- $this->output( "Deleting revision(s) " . implode( ',', $this->mArgs ) .
+ $this->output( "Deleting revision(s) " . implode( ',', $this->mArgs ) .
" from " . wfWikiID() . "...\n" );
$dbw = wfGetDB( DB_MASTER );
-
+
$affected = 0;
foreach ( $this->mArgs as $revID ) {
$dbw->insertSelect( 'archive', array( 'page', 'revision' ),
@@ -78,4 +78,4 @@ class DeleteRevision extends Maintenance {
}
$maintClass = "DeleteRevision";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteSelfExternals.php b/maintenance/deleteSelfExternals.php
index 1ab2839e..db23e92c 100644
--- a/maintenance/deleteSelfExternals.php
+++ b/maintenance/deleteSelfExternals.php
@@ -2,7 +2,7 @@
/**
* We want to make this whole thing as seamless as possible to the
* end-user. Unfortunately, we can't do _all_ of the work in the class
- * because A) included files are not in global scope, but in the scope
+ * because A) included files are not in global scope, but in the scope
* of their caller, and B) MediaWiki has way too many globals. So instead
* we'll kinda fake it, and do the requires() inline. <3 PHP
*
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( "Maintenance.php" );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DeleteSelfExternals extends Maintenance {
@@ -33,22 +33,22 @@ class DeleteSelfExternals extends Maintenance {
$this->mDescription = 'Delete self-references to $wgServer from externallinks';
$this->mBatchSize = 1000;
}
-
+
public function execute() {
global $wgServer;
$this->output( "Deleting self externals from $wgServer\n" );
- $db = wfGetDB(DB_MASTER);
- while (1) {
+ $db = wfGetDB( DB_MASTER );
+ while ( 1 ) {
wfWaitForSlaves( 2 );
$db->commit();
- $q = $db->limitResult( "DELETE /* deleteSelfExternals */ FROM externallinks WHERE el_to"
+ $q = $db->limitResult( "DELETE /* deleteSelfExternals */ FROM externallinks WHERE el_to"
. $db->buildLike( $wgServer . '/', $db->anyString() ), $this->mBatchSize );
$this->output( "Deleting a batch\n" );
- $db->query($q);
- if (!$db->affectedRows()) exit(0);
+ $db->query( $q );
+ if ( !$db->affectedRows() ) return;
}
}
}
$maintClass = "DeleteSelfExternals";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php
index 008c5b87..a9f5fae7 100644
--- a/maintenance/doMaintenance.php
+++ b/maintenance/doMaintenance.php
@@ -2,7 +2,7 @@
/**
* We want to make this whole thing as seamless as possible to the
* end-user. Unfortunately, we can't do _all_ of the work in the class
- * because A) included files are not in global scope, but in the scope
+ * because A) included files are not in global scope, but in the scope
* of their caller, and B) MediaWiki has way too many globals. So instead
* we'll kinda fake it, and do the requires() inline. <3 PHP
*
@@ -26,18 +26,21 @@
* @ingroup Maintenance
*/
-if ( !defined( 'DO_MAINTENANCE' ) ) {
+if ( !defined( 'RUN_MAINTENANCE_IF_MAIN' ) ) {
echo "This file must be included after Maintenance.php\n";
exit( 1 );
}
-if( !$maintClass || !class_exists( $maintClass ) ) {
- echo "\$maintClass is not set or is set to a non-existent class.\n";
- exit( 1 );
+// Wasn't included from the file scope, halt execution (probably wanted the class)
+// If a class is using commandLine.inc (old school maintenance), they definitely
+// cannot be included and will proceed with execution
+if( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
+ return;
}
-if( defined( 'MW_NO_SETUP' ) ) {
- return;
+if ( !$maintClass || !class_exists( $maintClass ) ) {
+ echo "\$maintClass is not set or is set to a non-existent class.\n";
+ exit( 1 );
}
// Get an object to start us off
@@ -51,6 +54,7 @@ $maintenance->setup();
$self = $maintenance->getName();
# Setup the profiler
+global $IP;
if ( file_exists( "$IP/StartProfiler.php" ) ) {
require_once( "$IP/StartProfiler.php" );
} else {
@@ -60,10 +64,19 @@ if ( file_exists( "$IP/StartProfiler.php" ) ) {
// Some other requires
require_once( "$IP/includes/AutoLoader.php" );
require_once( "$IP/includes/Defines.php" );
+require_once( "$IP/includes/DefaultSettings.php" );
-// Load settings, using wikimedia-mode if needed
-// Fixme: replace this hack with general farm-friendly code
-if( file_exists( "$IP/wmf-config/wikimedia-mode" ) ) {
+if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
+ # Use a callback function to configure MediaWiki
+ $callback = MW_CONFIG_CALLBACK;
+ # PHP 5.1 doesn't support "class::method" for call_user_func, so split it
+ if ( strpos( $callback, '::' ) !== false ) {
+ $callback = explode( '::', $callback, 2 );
+ }
+ call_user_func( $callback );
+} elseif ( file_exists( "$IP/wmf-config/wikimedia-mode" ) ) {
+ // Load settings, using wikimedia-mode if needed
+ // Fixme: replace this hack with general farm-friendly code
# TODO FIXME! Wikimedia-specific stuff needs to go away to an ext
# Maybe a hook?
global $cluster;
@@ -72,10 +85,11 @@ if( file_exists( "$IP/wmf-config/wikimedia-mode" ) ) {
require_once( "$IP/includes/SiteConfiguration.php" );
require( "$IP/wmf-config/wgConf.php" );
$maintenance->loadWikimediaSettings();
- require( $IP.'/wmf-config/CommonSettings.php' );
+ require( $IP . '/wmf-config/CommonSettings.php' );
} else {
require_once( $maintenance->loadSettings() );
}
+
if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
is_readable( "$IP/AdminSettings.php" ) )
{
@@ -87,7 +101,7 @@ require_once( "$IP/includes/Setup.php" );
require_once( "$IP/maintenance/install-utils.inc" );
// Much much faster startup than creating a title object
-$wgTitle = null;
+$wgTitle = null;
// Do the work
try {
@@ -95,7 +109,7 @@ try {
// Potentially debug globals
$maintenance->globals();
-} catch( MWException $mwe ) {
+} catch ( MWException $mwe ) {
echo( $mwe->getText() );
exit( 1 );
}
diff --git a/maintenance/dumpBackup.php b/maintenance/dumpBackup.php
index 3f4530ed..90e8f72f 100644
--- a/maintenance/dumpBackup.php
+++ b/maintenance/dumpBackup.php
@@ -1,6 +1,9 @@
<?php
/**
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Script that dumps wiki pages or logging database into an XML interchange
+ * wrapper format for export or backup
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -26,12 +29,12 @@ $originalDir = getcwd();
$optionsWithArgs = array( 'pagelist', 'start', 'end' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
require_once( 'backup.inc' );
$dumper = new BackupDumper( $argv );
-if( isset( $options['quiet'] ) ) {
+if ( isset( $options['quiet'] ) ) {
$dumper->reporting = false;
}
@@ -47,10 +50,10 @@ if ( isset( $options['pagelist'] ) ) {
$dumper->pages = array_filter( $pages, create_function( '$x', 'return $x !== "";' ) );
}
-if( isset( $options['start'] ) ) {
+if ( isset( $options['start'] ) ) {
$dumper->startId = intval( $options['start'] );
}
-if( isset( $options['end'] ) ) {
+if ( isset( $options['end'] ) ) {
$dumper->endId = intval( $options['end'] );
}
$dumper->skipHeader = isset( $options['skip-header'] );
@@ -59,13 +62,13 @@ $dumper->dumpUploads = isset( $options['uploads'] );
$textMode = isset( $options['stub'] ) ? WikiExporter::STUB : WikiExporter::TEXT;
-if( isset( $options['full'] ) ) {
+if ( isset( $options['full'] ) ) {
$dumper->dump( WikiExporter::FULL, $textMode );
-} elseif( isset( $options['current'] ) ) {
+} elseif ( isset( $options['current'] ) ) {
$dumper->dump( WikiExporter::CURRENT, $textMode );
-} elseif( isset( $options['stable'] ) ) {
+} elseif ( isset( $options['stable'] ) ) {
$dumper->dump( WikiExporter::STABLE, $textMode );
-} elseif( isset( $options['logs'] ) ) {
+} elseif ( isset( $options['logs'] ) ) {
$dumper->dump( WikiExporter::LOGS );
} else {
$dumper->progress( <<<ENDS
@@ -79,11 +82,14 @@ Actions:
--full Dump all revisions of every page.
--current Dump only the latest revision of every page.
--logs Dump all log events.
+ --stable Stable versions of pages?
+ --pagelist=<file>
+ Where <file> is a list of page titles to be dumped
Options:
--quiet Don't dump status reports to stderr.
--report=n Report position and speed after every n pages processed.
- (Default: 100)
+ (Default: 100)
--server=h Force reading from MySQL server h
--start=n Start from page_id or log_id n
--end=n Stop before page_id or log_id n (exclusive)
@@ -91,11 +97,14 @@ Options:
--skip-footer Don't output the </mediawiki> footer
--stub Don't perform old_text lookups; for 2-pass dump
--uploads Include upload records (experimental)
+ --conf=<file> Use the specified configuration file (LocalSettings.php)
+
+ --wiki=<wiki> Only back up the specified <wiki>
Fancy stuff: (Works? Add examples please.)
--plugin=<class>[:<file>] Load a dump plugin class
--output=<type>:<file> Begin a filtered output stream;
- <type>s: file, gzip, bzip2, 7zip
+ <type>s: file, gzip, bzip2, 7zip
--filter=<type>[:<options>] Add a filter on an output branch
ENDS
diff --git a/maintenance/dumpInterwiki.inc b/maintenance/dumpInterwiki.inc
deleted file mode 100644
index c366b08c..00000000
--- a/maintenance/dumpInterwiki.inc
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-/**
- * Rebuild interwiki table using the file on meta and the language list
- * Wikimedia specific!
- *
- * @file
- * @todo document
- * @ingroup Maintenance
- * @ingroup Wikimedia
- */
-
-/**
- * @todo document
- * @ingroup Maintenance
- */
-class Site {
- var $suffix, $lateral, $url;
-
- function __construct( $s, $l, $u ) {
- $this->suffix = $s;
- $this->lateral = $l;
- $this->url = $u;
- }
-
- function getURL( $lang ) {
- $xlang = str_replace( '_', '-', $lang );
- return "http://$xlang.{$this->url}/wiki/\$1";
- }
-}
-
-function getRebuildInterwikiDump() {
- global $langlist, $languageAliases, $prefixRewrites;
-
- # Multi-language sites
- # db suffix => db suffix, iw prefix, hostname
- $sites = array(
- 'wiki' => new Site( 'wiki', 'w', 'wikipedia.org' ),
- 'wiktionary' => new Site( 'wiktionary', 'wikt', 'wiktionary.org' ),
- 'wikiquote' => new Site( 'wikiquote', 'q', 'wikiquote.org' ),
- 'wikibooks' => new Site( 'wikibooks', 'b', 'wikibooks.org' ),
- 'wikinews' => new Site( 'wikinews', 'n', 'wikinews.org' ),
- 'wikisource' => new Site( 'wikisource', 's', 'wikisource.org' ),
- 'wikimedia' => new Site( 'wikimedia', 'chapter', 'wikimedia.org' ),
- 'wikiversity' => new Site( 'wikiversity', 'v', 'wikiversity.org' ),
- );
-
- # List of language prefixes likely to be found in multi-language sites
- $langlist = array_map( "trim", file( "/home/wikipedia/common/langlist" ) );
-
- # List of all database names
- $dblist = array_map( "trim", file( "/home/wikipedia/common/all.dblist" ) );
-
- # Special-case databases
- $specials = array_flip(
- array_map( "trim",
- file( "/home/wikipedia/common/special.dblist" ) ) );
-
- # Extra interwiki links that can't be in the intermap for some reason
- $extraLinks = array(
- array( 'm', 'http://meta.wikimedia.org/wiki/$1', 1 ),
- array( 'meta', 'http://meta.wikimedia.org/wiki/$1', 1 ),
- array( 'sep11', 'http://sep11.wikipedia.org/wiki/$1', 1 ),
- );
-
- # Language aliases, usually configured as redirects to the real wiki in apache
- # Interlanguage links are made directly to the real wiki
- # Something horrible happens if you forget to list an alias here, I can't
- # remember what
- $languageAliases = array(
- 'zh-cn' => 'zh',
- 'zh-tw' => 'zh',
- 'dk' => 'da',
- 'nb' => 'no',
- );
-
- # Special case prefix rewrites, for the benefit of Swedish which uses s:t
- # as an abbreviation for saint
- $prefixRewrites = array(
- 'svwiki' => array ( 's' => 'src'),
- );
-
- # Construct a list of reserved prefixes
- $reserved = array();
- foreach ( $langlist as $lang ) {
- $reserved[$lang] = 1;
- }
- foreach ( $languageAliases as $alias => $lang ) {
- $reserved[$alias] = 1;
- }
- foreach( $sites as $site ) {
- $reserved[$site->lateral] = 1;
- }
-
- # Extract the intermap from meta
- $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 );
- $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) );
-
- if ( !$lines || count( $lines ) < 2 ) {
- wfDie( "m:Interwiki_map not found" );
- }
-
- # Global iterwiki map
- foreach ( $lines as $line ) {
- if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(.*?)\s*$/', $line, $matches ) ) {
- $prefix = strtolower( $matches[1] );
- $url = $matches[2];
- if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia)\.org/', $url ) ) {
- $local = 1;
- } else {
- $local = 0;
- }
-
- if ( empty( $reserved[$prefix] ) ) {
- $imap = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local );
- makeLink ($imap, "__global");
- }
- }
- }
-
- # Exclude Wikipedia for Wikipedia
- makeLink ( array ('iw_prefix' => 'wikipedia', 'is_url' => null ), "_wiki" );
-
- #Multilanguage sites
- foreach ($sites as $site)
- makeLanguageLinks ( $site, "_".$site->suffix );
-
-
- foreach ( $dblist as $db ) {
- if ( isset( $specials[$db] ) ) {
- # Special wiki
- # Has interwiki links and interlanguage links to wikipedia
-
- makeLink( array( 'iw_prefix' => $db, 'iw_url' => "wiki"), "__sites" );
- # Links to multilanguage sites
- foreach ( $sites as $targetSite ) {
- makeLink( array( 'iw_prefix' => $targetSite->lateral,
- 'iw_url' =>$targetSite->getURL( 'en' ),
- 'iw_local' => 1 ), $db );
- }
-
- } else {
- # Find out which site this DB belongs to
- $site = false;
- foreach( $sites as $candidateSite ) {
- $suffix = $candidateSite->suffix;
- if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) {
- $site = $candidateSite;
- break;
- }
- }
- makeLink( array( 'iw_prefix' => $db, 'iw_url' => $site->suffix), "__sites" );
- if ( !$site ) {
- print "Invalid database $db\n";
- continue;
- }
- $lang = $matches[1];
-
- # Lateral links
- foreach ( $sites as $targetSite ) {
- if ( $targetSite->suffix != $site->suffix ) {
- makeLink( array( 'iw_prefix' => $targetSite->lateral,
- 'iw_url' => $targetSite->getURL( $lang ),
- 'iw_local' => 1 ), $db );
- }
- }
-
- if ( $site->suffix == "wiki" ) {
- makeLink( array('iw_prefix' => 'w',
- 'iw_url' => "http://en.wikipedia.org/wiki/$1",
- 'iw_local' => 1), $db );
- }
-
- }
- }
- foreach ( $extraLinks as $link )
- makeLink( $link, "__global" );
-}
-
-# ------------------------------------------------------------------------------------------
-
-# Executes part of an INSERT statement, corresponding to all interlanguage links to a particular site
-function makeLanguageLinks( &$site, $source ) {
- global $langlist, $languageAliases;
- # Actual languages with their own databases
- foreach ( $langlist as $targetLang ) {
- makeLink( array( $targetLang, $site->getURL( $targetLang ), 1 ), $source );
- }
-
- # Language aliases
- foreach ( $languageAliases as $alias => $lang ) {
- makeLink( array( $alias, $site->getURL( $lang ), 1 ), $source );
- }
-}
-
-function makeLink( $entry, $source ) {
- global $prefixRewrites, $dbFile;
- if ( isset( $prefixRewrites[$source] ) && isset( $prefixRewrites[$source][$entry[0]] ) )
- $entry[0] = $prefixRewrites[$source][$entry[0]];
- if (!array_key_exists("iw_prefix",$entry))
- $entry = array("iw_prefix" => $entry[0], "iw_url" => $entry[1], "iw_local" => $entry[2]);
- if ( array_key_exists($source,$prefixRewrites) &&
- array_key_exists($entry['iw_prefix'],$prefixRewrites[$source]))
- $entry['iw_prefix'] = $prefixRewrites[$source][$entry['iw_prefix']];
- if ($dbFile)
- $dbFile->set( "{$source}:{$entry['iw_prefix']}", trim("{$entry['iw_local']} {$entry['iw_url']}") );
- else
- print "{$source}:{$entry['iw_prefix']} {$entry['iw_url']} {$entry['iw_local']}\n";
-
- }
diff --git a/maintenance/dumpInterwiki.php b/maintenance/dumpInterwiki.php
index 045e393b..4a4b6791 100644
--- a/maintenance/dumpInterwiki.php
+++ b/maintenance/dumpInterwiki.php
@@ -1,6 +1,6 @@
<?php
/**
- * Rebuild interwiki table using the file on meta and the language list
+ * Build constant slightly compact database of interwiki prefixes
* Wikimedia specific!
*
* @file
@@ -9,19 +9,231 @@
* @ingroup Wikimedia
*/
-/** */
-$oldCwd = getcwd();
+/**
+ * @todo document
+ * @ingroup Maintenance
+ */
+class Site {
+ var $suffix, $lateral, $url;
+
+ function __construct( $s, $l, $u ) {
+ $this->suffix = $s;
+ $this->lateral = $l;
+ $this->url = $u;
+ }
+
+ function getURL( $lang ) {
+ $xlang = str_replace( '_', '-', $lang );
+ return "http://$xlang.{$this->url}/wiki/\$1";
+ }
+}
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class DumpInterwiki extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Build constant slightly compact database of interwiki prefixes.";
+ $this->addOption( 'langlist', 'File with one language code per line', false, true );
+ $this->addOption( 'dblist', 'File with one db per line', false, true );
+ $this->addOption( 'specialdbs', "File with one 'special' db per line", false, true );
+ $this->addOption( 'o', 'Cdb output file', false, true );
+ }
+
+ function execute() {
+ # List of language prefixes likely to be found in multi-language sites
+ $this->langlist = array_map( "trim", file( $this->getOption( 'langlist', "/home/wikipedia/common/langlist" ) ) );
+
+ # List of all database names
+ $this->dblist = array_map( "trim", file( $this->getOption( 'dblist', "/home/wikipedia/common/all.dblist" ) ) );
+
+ # Special-case databases
+ $this->specials = array_flip( array_map( "trim", file( $this->getOption( 'specialdbs', "/home/wikipedia/common/special.dblist" ) ) ) );
+
+ if ( $this->hasOption( 'o' ) ) {
+ $this->dbFile = CdbWriter::open( $this->getOption( 'o' ) ) ;
+ } else {
+ $this->dbFile = false;
+ }
+
+ $this->getRebuildInterwikiDump();
+ }
+
+ function getRebuildInterwikiDump() {
+ global $wgContLang;
+
+ # Multi-language sites
+ # db suffix => db suffix, iw prefix, hostname
+ $sites = array(
+ 'wiki' => new Site( 'wiki', 'w', 'wikipedia.org' ),
+ 'wiktionary' => new Site( 'wiktionary', 'wikt', 'wiktionary.org' ),
+ 'wikiquote' => new Site( 'wikiquote', 'q', 'wikiquote.org' ),
+ 'wikibooks' => new Site( 'wikibooks', 'b', 'wikibooks.org' ),
+ 'wikinews' => new Site( 'wikinews', 'n', 'wikinews.org' ),
+ 'wikisource' => new Site( 'wikisource', 's', 'wikisource.org' ),
+ 'wikimedia' => new Site( 'wikimedia', 'chapter', 'wikimedia.org' ),
+ 'wikiversity' => new Site( 'wikiversity', 'v', 'wikiversity.org' ),
+ );
+
+ # Extra interwiki links that can't be in the intermap for some reason
+ $extraLinks = array(
+ array( 'm', 'http://meta.wikimedia.org/wiki/$1', 1 ),
+ array( 'meta', 'http://meta.wikimedia.org/wiki/$1', 1 ),
+ array( 'sep11', 'http://sep11.wikipedia.org/wiki/$1', 1 ),
+ );
+
+ # Language aliases, usually configured as redirects to the real wiki in apache
+ # Interlanguage links are made directly to the real wiki
+ # Something horrible happens if you forget to list an alias here, I can't
+ # remember what
+ $this->languageAliases = array(
+ 'zh-cn' => 'zh',
+ 'zh-tw' => 'zh',
+ 'dk' => 'da',
+ 'nb' => 'no',
+ );
+
+ # Special case prefix rewrites, for the benefit of Swedish which uses s:t
+ # as an abbreviation for saint
+ $this->prefixRewrites = array(
+ 'svwiki' => array( 's' => 'src' ),
+ );
+
+ # Construct a list of reserved prefixes
+ $reserved = array();
+ foreach ( $this->langlist as $lang ) {
+ $reserved[$lang] = 1;
+ }
+ foreach ( $this->languageAliases as $alias => $lang ) {
+ $reserved[$alias] = 1;
+ }
+ foreach ( $sites as $site ) {
+ $reserved[$site->lateral] = 1;
+ }
+
+ # Extract the intermap from meta
+ $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 );
+ $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) );
+
+ if ( !$lines || count( $lines ) < 2 ) {
+ $this->error( "m:Interwiki_map not found", true );
+ }
+
+ # Global iterwiki map
+ foreach ( $lines as $line ) {
+ if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(.*?)\s*$/', $line, $matches ) ) {
+ $prefix = $wgContLang->lc( $matches[1] );
+ $prefix = str_replace( ' ', '_', $prefix );
+
+ $url = $matches[2];
+ if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia)\.org/', $url ) ) {
+ $local = 1;
+ } else {
+ $local = 0;
+ }
+
+ if ( empty( $reserved[$prefix] ) ) {
+ $imap = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local );
+ $this->makeLink ( $imap, "__global" );
+ }
+ }
+ }
+
+ # Exclude Wikipedia for Wikipedia
+ $this->makeLink ( array ( 'iw_prefix' => 'wikipedia', 'is_url' => null ), "_wiki" );
+
+ # Multilanguage sites
+ foreach ( $sites as $site ) {
+ $this->makeLanguageLinks ( $site, "_" . $site->suffix );
+ }
+
+ foreach ( $this->dblist as $db ) {
+ if ( isset( $this->specials[$db] ) ) {
+ # Special wiki
+ # Has interwiki links and interlanguage links to wikipedia
+
+ $this->makeLink( array( 'iw_prefix' => $db, 'iw_url' => "wiki" ), "__sites" );
+ # Links to multilanguage sites
+ foreach ( $sites as $targetSite ) {
+ $this->makeLink( array( 'iw_prefix' => $targetSite->lateral,
+ 'iw_url' => $targetSite->getURL( 'en' ),
+ 'iw_local' => 1 ), $db );
+ }
+ } else {
+ # Find out which site this DB belongs to
+ $site = false;
+ foreach ( $sites as $candidateSite ) {
+ $suffix = $candidateSite->suffix;
+ if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) {
+ $site = $candidateSite;
+ break;
+ }
+ }
+ $this->makeLink( array( 'iw_prefix' => $db, 'iw_url' => $site->suffix ), "__sites" );
+ if ( !$site ) {
+ $this->error( "Invalid database $db\n" );
+ continue;
+ }
+ $lang = $matches[1];
+
+ # Lateral links
+ foreach ( $sites as $targetSite ) {
+ if ( $targetSite->suffix != $site->suffix ) {
+ $this->makeLink( array( 'iw_prefix' => $targetSite->lateral,
+ 'iw_url' => $targetSite->getURL( $lang ),
+ 'iw_local' => 1 ), $db );
+ }
+ }
+
+ if ( $site->suffix == "wiki" ) {
+ $this->makeLink( array( 'iw_prefix' => 'w',
+ 'iw_url' => "http://en.wikipedia.org/wiki/$1",
+ 'iw_local' => 1 ), $db );
+ }
+
+ }
+ }
+ foreach ( $extraLinks as $link ) {
+ $this->makeLink( $link, "__global" );
+ }
+ }
+
+ # ------------------------------------------------------------------------------------------
+
+ # Executes part of an INSERT statement, corresponding to all interlanguage links to a particular site
+ function makeLanguageLinks( &$site, $source ) {
+ # Actual languages with their own databases
+ foreach ( $this->langlist as $targetLang ) {
+ $this->makeLink( array( $targetLang, $site->getURL( $targetLang ), 1 ), $source );
+ }
+
+ # Language aliases
+ foreach ( $this->languageAliases as $alias => $lang ) {
+ $this->makeLink( array( $alias, $site->getURL( $lang ), 1 ), $source );
+ }
+ }
+
+ function makeLink( $entry, $source ) {
+ if ( isset( $this->prefixRewrites[$source] ) && isset( $this->prefixRewrites[$source][$entry[0]] ) )
+ $entry[0] = $this->prefixRewrites[$source][$entry[0]];
-$optionsWithArgs = array( "o" );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-require( dirname(__FILE__)."/dumpInterwiki.inc" );
-chdir( $oldCwd );
+ if ( !array_key_exists( "iw_prefix", $entry ) ) {
+ $entry = array( "iw_prefix" => $entry[0], "iw_url" => $entry[1], "iw_local" => $entry[2] );
+ }
+ if ( array_key_exists( $source, $this->prefixRewrites ) &&
+ array_key_exists( $entry['iw_prefix'], $this->prefixRewrites[$source] ) ) {
+ $entry['iw_prefix'] = $this->prefixRewrites[$source][$entry['iw_prefix']];
+ }
-# Output
-if ( isset( $options['o'] ) ) {
- # To database specified with -o
- $dbFile = CdbWriter::open( $options['o'] );
-}
+ if ( $this->dbFile ) {
+ $this->dbFile->set( "{$source}:{$entry['iw_prefix']}", trim( "{$entry['iw_local']} {$entry['iw_url']}" ) );
+ } else {
+ $this->output( "{$source}:{$entry['iw_prefix']} {$entry['iw_url']} {$entry['iw_local']}\n" );
+ }
+ }
+}
-getRebuildInterwikiDump();
+$maintClass = "DumpInterwiki";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/dumpLinks.php b/maintenance/dumpLinks.php
index 529cd1aa..39a9e955 100644
--- a/maintenance/dumpLinks.php
+++ b/maintenance/dumpLinks.php
@@ -29,7 +29,7 @@
* @ingroup Mainatenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DumpLinks extends Maintenance {
public function __construct() {
@@ -49,11 +49,11 @@ class DumpLinks extends Maintenance {
array( 'page_id=pl_from' ),
__METHOD__,
array( 'ORDER BY' => 'page_id' ) );
-
+
$lastPage = null;
- foreach( $result as $row ) {
- if( $lastPage != $row->page_id ) {
- if( isset( $lastPage ) ) {
+ foreach ( $result as $row ) {
+ if ( $lastPage != $row->page_id ) {
+ if ( isset( $lastPage ) ) {
$this->output( "\n" );
}
$page = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -63,11 +63,11 @@ class DumpLinks extends Maintenance {
$link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
$this->output( " " . $link->getPrefixedUrl() );
}
- if( isset( $lastPage ) )
+ if ( isset( $lastPage ) )
$this->output( "\n" );
}
}
$maintClass = "DumpLinks";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/dumpSisterSites.php b/maintenance/dumpSisterSites.php
index d9fd28a6..f5abcd1b 100644
--- a/maintenance/dumpSisterSites.php
+++ b/maintenance/dumpSisterSites.php
@@ -24,14 +24,14 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DumpSisterSites extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Quickie page name dump script for SisterSites usage";
}
-
+
public function execute() {
$dbr = wfGetDB( DB_SLAVE );
$dbr->bufferResults( false );
@@ -42,15 +42,14 @@ class DumpSisterSites extends Maintenance {
),
__METHOD__ );
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$url = $title->getFullUrl();
$text = $title->getPrefixedText();
$this->output( "$url $text\n" );
}
- $dbr->freeResult( $result );
}
}
$maintClass = "DumpSisterSites";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
index 2e639e68..98d4af0e 100644
--- a/maintenance/dumpTextPass.php
+++ b/maintenance/dumpTextPass.php
@@ -1,6 +1,8 @@
<?php
/**
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Script that postprocesses XML dumps from dumpBackup.php to add page text
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>, 2010 Alexandre Emsenhuber
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -24,7 +26,7 @@
$originalDir = getcwd();
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
require_once( 'backup.inc' );
/**
@@ -33,14 +35,15 @@ require_once( 'backup.inc' );
class TextPassDumper extends BackupDumper {
var $prefetch = null;
var $input = "php://stdin";
- var $history = WikiExporter::FULL;
var $fetchCount = 0;
var $prefetchCount = 0;
-
+
var $failures = 0;
- var $maxFailures = 200;
+ var $maxFailures = 5;
+ var $failedTextRetrievals = 0;
+ var $maxConsecutiveFailedTextRetrievals = 200;
var $failureTimeout = 5; // Seconds to sleep after db failure
-
+
var $php = "php";
var $spawn = false;
var $spawnProc = false;
@@ -48,29 +51,22 @@ class TextPassDumper extends BackupDumper {
var $spawnRead = false;
var $spawnErr = false;
- function dump() {
+ function dump( $history, $text = WikiExporter::TEXT ) {
# This shouldn't happen if on console... ;)
header( 'Content-type: text/html; charset=UTF-8' );
# Notice messages will foul up your XML output even if they're
# relatively harmless.
- if( ini_get( 'display_errors' ) )
+ if ( ini_get( 'display_errors' ) )
ini_set( 'display_errors', 'stderr' );
- $this->initProgress( $this->history );
+ $this->initProgress( $history );
$this->db = $this->backupDb();
- $this->egress = new ExportProgressFilter( $this->sink, $this );
+ $this->readDump();
- $input = fopen( $this->input, "rt" );
- $result = $this->readDump( $input );
-
- if( WikiError::isError( $result ) ) {
- wfDie( $result->getMessage() );
- }
-
- if( $this->spawnProc ) {
+ if ( $this->spawnProc ) {
$this->closeSpawn();
}
@@ -78,59 +74,63 @@ class TextPassDumper extends BackupDumper {
}
function processOption( $opt, $val, $param ) {
+ global $IP;
$url = $this->processFileOpt( $val, $param );
-
+
switch( $opt ) {
case 'prefetch':
- global $IP;
require_once "$IP/maintenance/backupPrefetch.inc";
$this->prefetch = new BaseDump( $url );
break;
case 'stub':
$this->input = $url;
break;
- case 'current':
- $this->history = WikiExporter::CURRENT;
- break;
- case 'full':
- $this->history = WikiExporter::FULL;
- break;
case 'spawn':
$this->spawn = true;
- if( $val ) {
+ if ( $val ) {
$this->php = $val;
}
break;
}
}
-
+
function processFileOpt( $val, $param ) {
- switch( $val ) {
- case "file":
- return $param;
- case "gzip":
- return "compress.zlib://$param";
- case "bzip2":
- return "compress.bzip2://$param";
- case "7zip":
- return "mediawiki.compress.7z://$param";
- default:
- return $val;
+ $fileURIs = explode(';',$param);
+ foreach ( $fileURIs as $URI ) {
+ switch( $val ) {
+ case "file":
+ $newURI = $URI;
+ break;
+ case "gzip":
+ $newURI = "compress.zlib://$URI";
+ break;
+ case "bzip2":
+ $newURI = "compress.bzip2://$URI";
+ break;
+ case "7zip":
+ $newURI = "mediawiki.compress.7z://$URI";
+ break;
+ default:
+ $newURI = $URI;
+ }
+ $newFileURIs[] = $newURI;
}
+ $val = implode( ';', $newFileURIs );
+ return $val;
}
/**
* Overridden to include prefetch ratio if enabled.
*/
function showReport() {
- if( !$this->prefetch ) {
+ if ( !$this->prefetch ) {
return parent::showReport();
}
-
- if( $this->reporting ) {
+
+ if ( $this->reporting ) {
$delta = wfTime() - $this->startTime;
$now = wfTimestamp( TS_DB );
- if( $delta ) {
+ if ( $delta ) {
$rate = $this->pageCount / $delta;
$revrate = $this->revCount / $delta;
$portion = $this->revCount / $this->maxCount;
@@ -148,150 +148,207 @@ class TextPassDumper extends BackupDumper {
}
}
- function readDump( $input ) {
- $this->buffer = "";
- $this->openElement = false;
- $this->atStart = true;
- $this->state = "";
- $this->lastName = "";
+ function readDump() {
+ $state = '';
+ $lastName = '';
$this->thisPage = 0;
$this->thisRev = 0;
- $parser = xml_parser_create( "UTF-8" );
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
+ $reader = new XMLReader();
+ $reader->open( $this->input );
+ $writer = new XMLWriter();
+ $writer->openMemory();
+
- xml_set_element_handler( $parser, array( &$this, 'startElement' ), array( &$this, 'endElement' ) );
- xml_set_character_data_handler( $parser, array( &$this, 'characterData' ) );
+ while ( $reader->read() ) {
+ $tag = $reader->name;
+ $type = $reader->nodeType;
- $offset = 0; // for context extraction on error reporting
- $bufferSize = 512 * 1024;
- do {
- $chunk = fread( $input, $bufferSize );
- if( !xml_parse( $parser, $chunk, feof( $input ) ) ) {
- wfDebug( "TextDumpPass::readDump encountered XML parsing error\n" );
- return new WikiXmlError( $parser, 'XML import parse failure', $chunk, $offset );
+ if ( $type == XmlReader::END_ELEMENT ) {
+ $writer->endElement();
+
+ if ( $tag == 'revision' ) {
+ $this->revCount();
+ $this->thisRev = '';
+ } elseif ( $tag == 'page' ) {
+ $this->reportPage();
+ $this->thisPage = '';
+ }
+ } elseif ( $type == XmlReader::ELEMENT ) {
+ $attribs = array();
+ if ( $reader->hasAttributes ) {
+ for ( $i = 0; $reader->moveToAttributeNo( $i ); $i++ ) {
+ $attribs[$reader->name] = $reader->value;
+ }
+ }
+
+ if ( $reader->isEmptyElement && $tag == 'text' && isset( $attribs['id'] ) ) {
+ $writer->startElement( 'text' );
+ $writer->writeAttribute( 'xml:space', 'preserve' );
+ $text = $this->getText( $attribs['id'] );
+ if ( strlen( $text ) ) {
+ $writer->text( $text );
+ }
+ $writer->endElement();
+ } else {
+ $writer->startElement( $tag );
+ foreach( $attribs as $name => $val ) {
+ $writer->writeAttribute( $name, $val );
+ }
+ if ( $reader->isEmptyElement ) {
+ $writer->endElement();
+ }
+ }
+
+ $lastName = $tag;
+ if ( $tag == 'revision' ) {
+ $state = 'revision';
+ } elseif ( $tag == 'page' ) {
+ $state = 'page';
+ }
+ } elseif ( $type == XMLReader::SIGNIFICANT_WHITESPACE || $type = XMLReader::TEXT ) {
+ if ( $lastName == 'id' ) {
+ if ( $state == 'revision' ) {
+ $this->thisRev .= $reader->value;
+ } elseif ( $state == 'page' ) {
+ $this->thisPage .= $reader->value;
+ }
+ }
+ $writer->text( $reader->value );
}
- $offset += strlen( $chunk );
- } while( $chunk !== false && !feof( $input ) );
- xml_parser_free( $parser );
-
- return true;
+ $this->sink->write( $writer->outputMemory() );
+ }
}
function getText( $id ) {
$this->fetchCount++;
- if( isset( $this->prefetch ) ) {
+ if ( isset( $this->prefetch ) ) {
$text = $this->prefetch->prefetch( $this->thisPage, $this->thisRev );
- if( $text === null ) {
- // Entry missing from prefetch dump
- } elseif( $text === "" ) {
- // Blank entries may indicate that the prior dump was broken.
- // To be safe, reload it.
- } else {
- $this->prefetchCount++;
- return $text;
+ if ( $text !== null ) { // Entry missing from prefetch dump
+ $dbr = wfGetDB( DB_SLAVE );
+ $revID = intval( $this->thisRev );
+ $revLength = $dbr->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+ // if length of rev text in file doesn't match length in db, we reload
+ // this avoids carrying forward broken data from previous xml dumps
+ if( strlen( $text ) == $revLength ) {
+ $this->prefetchCount++;
+ return $text;
+ }
}
}
return $this->doGetText( $id );
}
-
+
private function doGetText( $id ) {
- if( $this->spawn ) {
- return $this->getTextSpawned( $id );
- } else {
- return $this->getTextDbSafe( $id );
+ $id = intval( $id );
+ $this->failures = 0;
+ $ex = new MWException( "Graceful storage failure" );
+ while (true) {
+ if ( $this->spawn ) {
+ if ($this->failures) {
+ // we don't know why it failed, could be the child process
+ // borked, could be db entry busted, could be db server out to lunch,
+ // so cover all bases
+ $this->closeSpawn();
+ $this->openSpawn();
+ }
+ $text = $this->getTextSpawned( $id );
+ } else {
+ $text = $this->getTextDbSafe( $id );
+ }
+ if ( $text === false ) {
+ $this->failures++;
+ if ( $this->failures > $this->maxFailures) {
+ $this->progress( "Failed to retrieve revision text for text id ".
+ "$id after $this->maxFailures tries, giving up" );
+ // were there so many bad retrievals in a row we want to bail?
+ // at some point we have to declare the dump irretrievably broken
+ $this->failedTextRetrievals++;
+ if ($this->failedTextRetrievals > $this->maxConsecutiveFailedTextRetrievals) {
+ throw $ex;
+ }
+ else {
+ // would be nice to return something better to the caller someday,
+ // log what we know about the failure and about the revision
+ return("");
+ }
+ } else {
+ $this->progress( "Error $this->failures " .
+ "of allowed $this->maxFailures retrieving revision text for text id $id! " .
+ "Pausing $this->failureTimeout seconds before retry..." );
+ sleep( $this->failureTimeout );
+ }
+ } else {
+ $this->failedTextRetrievals= 0;
+ return( $text );
+ }
}
+
}
-
+
/**
* Fetch a text revision from the database, retrying in case of failure.
* This may survive some transitory errors by reconnecting, but
* may not survive a long-term server outage.
*/
private function getTextDbSafe( $id ) {
- while( true ) {
+ while ( true ) {
try {
$text = $this->getTextDb( $id );
- $ex = new MWException("Graceful storage failure");
- } catch (DBQueryError $ex) {
+ } catch ( DBQueryError $ex ) {
$text = false;
}
- if( $text === false ) {
- $this->failures++;
- if( $this->failures > $this->maxFailures ) {
- throw $ex;
- } else {
- $this->progress( "Database failure $this->failures " .
- "of allowed $this->maxFailures for revision $id! " .
- "Pausing $this->failureTimeout seconds..." );
- sleep( $this->failureTimeout );
- }
- } else {
- return $text;
- }
+ return $text;
}
}
-
+
/**
* May throw a database error if, say, the server dies during query.
*/
private function getTextDb( $id ) {
global $wgContLang;
- $id = intval( $id );
$row = $this->db->selectRow( 'text',
array( 'old_text', 'old_flags' ),
array( 'old_id' => $id ),
- 'TextPassDumper::getText' );
+ __METHOD__ );
$text = Revision::getRevisionText( $row );
- if( $text === false ) {
+ if ( $text === false ) {
return false;
}
$stripped = str_replace( "\r", "", $text );
$normalized = $wgContLang->normalize( $stripped );
return $normalized;
}
-
+
private function getTextSpawned( $id ) {
wfSuppressWarnings();
- if( !$this->spawnProc ) {
+ if ( !$this->spawnProc ) {
// First time?
$this->openSpawn();
}
- while( true ) {
-
- $text = $this->getTextSpawnedOnce( $id );
- if( !is_string( $text ) ) {
- $this->progress("Database subprocess failed. Respawning...");
-
- $this->closeSpawn();
- sleep( $this->failureTimeout );
- $this->openSpawn();
-
- continue;
- }
- wfRestoreWarnings();
- return $text;
- }
+ $text = $this->getTextSpawnedOnce( $id );
+ wfRestoreWarnings();
+ return $text;
}
-
+
function openSpawn() {
- global $IP, $wgDBname;
-
+ global $IP;
+
$cmd = implode( " ",
array_map( 'wfEscapeShellArg',
array(
$this->php,
"$IP/maintenance/fetchText.php",
- $wgDBname ) ) );
+ '--wiki', wfWikiID() ) ) );
$spec = array(
0 => array( "pipe", "r" ),
1 => array( "pipe", "w" ),
2 => array( "file", "/dev/null", "a" ) );
$pipes = array();
-
+
$this->progress( "Spawning database subprocess: $cmd" );
$this->spawnProc = proc_open( $cmd, $spec, $pipes );
- if( !$this->spawnProc ) {
+ if ( !$this->spawnProc ) {
// shit
$this->progress( "Subprocess spawn failed." );
return false;
@@ -300,138 +357,83 @@ class TextPassDumper extends BackupDumper {
$this->spawnWrite, // -> stdin
$this->spawnRead, // <- stdout
) = $pipes;
-
+
return true;
}
-
+
private function closeSpawn() {
wfSuppressWarnings();
- if( $this->spawnRead )
+ if ( $this->spawnRead )
fclose( $this->spawnRead );
$this->spawnRead = false;
- if( $this->spawnWrite )
+ if ( $this->spawnWrite )
fclose( $this->spawnWrite );
$this->spawnWrite = false;
- if( $this->spawnErr )
+ if ( $this->spawnErr )
fclose( $this->spawnErr );
$this->spawnErr = false;
- if( $this->spawnProc )
+ if ( $this->spawnProc )
pclose( $this->spawnProc );
$this->spawnProc = false;
wfRestoreWarnings();
}
-
+
private function getTextSpawnedOnce( $id ) {
global $wgContLang;
$ok = fwrite( $this->spawnWrite, "$id\n" );
- //$this->progress( ">> $id" );
- if( !$ok ) return false;
-
+ // $this->progress( ">> $id" );
+ if ( !$ok ) return false;
+
$ok = fflush( $this->spawnWrite );
- //$this->progress( ">> [flush]" );
- if( !$ok ) return false;
-
+ // $this->progress( ">> [flush]" );
+ if ( !$ok ) return false;
+
+ // check that the text id they are sending is the one we asked for
+ // this avoids out of sync revision text errors we have encountered in the past
+ $newId = fgets( $this->spawnRead );
+ if ( $newId === false ) {
+ return false;
+ }
+ if ( $id != intval( $newId ) ) {
+ return false;
+ }
+
$len = fgets( $this->spawnRead );
- //$this->progress( "<< " . trim( $len ) );
- if( $len === false ) return false;
-
+ // $this->progress( "<< " . trim( $len ) );
+ if ( $len === false ) return false;
+
$nbytes = intval( $len );
+ // actual error, not zero-length text
+ if ($nbytes < 0 ) return false;
+
$text = "";
-
+
// Subprocess may not send everything at once, we have to loop.
- while( $nbytes > strlen( $text ) ) {
+ while ( $nbytes > strlen( $text ) ) {
$buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
- if( $buffer === false ) break;
+ if ( $buffer === false ) break;
$text .= $buffer;
}
-
+
$gotbytes = strlen( $text );
- if( $gotbytes != $nbytes ) {
- $this->progress( "Expected $nbytes bytes from database subprocess, got $gotbytes ");
+ if ( $gotbytes != $nbytes ) {
+ $this->progress( "Expected $nbytes bytes from database subprocess, got $gotbytes " );
return false;
}
-
+
// Do normalization in the dump thread...
$stripped = str_replace( "\r", "", $text );
$normalized = $wgContLang->normalize( $stripped );
return $normalized;
}
-
- function startElement( $parser, $name, $attribs ) {
- $this->clearOpenElement( null );
- $this->lastName = $name;
-
- if( $name == 'revision' ) {
- $this->state = $name;
- $this->egress->writeOpenPage( null, $this->buffer );
- $this->buffer = "";
- } elseif( $name == 'page' ) {
- $this->state = $name;
- if( $this->atStart ) {
- $this->egress->writeOpenStream( $this->buffer );
- $this->buffer = "";
- $this->atStart = false;
- }
- }
-
- if( $name == "text" && isset( $attribs['id'] ) ) {
- $text = $this->getText( $attribs['id'] );
- $this->openElement = array( $name, array( 'xml:space' => 'preserve' ) );
- if( strlen( $text ) > 0 ) {
- $this->characterData( $parser, $text );
- }
- } else {
- $this->openElement = array( $name, $attribs );
- }
- }
-
- function endElement( $parser, $name ) {
- if( $this->openElement ) {
- $this->clearOpenElement( "" );
- } else {
- $this->buffer .= "</$name>";
- }
-
- if( $name == 'revision' ) {
- $this->egress->writeRevision( null, $this->buffer );
- $this->buffer = "";
- $this->thisRev = "";
- } elseif( $name == 'page' ) {
- $this->egress->writeClosePage( $this->buffer );
- $this->buffer = "";
- $this->thisPage = "";
- } elseif( $name == 'mediawiki' ) {
- $this->egress->writeCloseStream( $this->buffer );
- $this->buffer = "";
- }
- }
-
- function characterData( $parser, $data ) {
- $this->clearOpenElement( null );
- if( $this->lastName == "id" ) {
- if( $this->state == "revision" ) {
- $this->thisRev .= $data;
- } elseif( $this->state == "page" ) {
- $this->thisPage .= $data;
- }
- }
- $this->buffer .= htmlspecialchars( $data );
- }
-
- function clearOpenElement( $style ) {
- if( $this->openElement ) {
- $this->buffer .= Xml::element( $this->openElement[0], $this->openElement[1], $style );
- $this->openElement = false;
- }
- }
}
$dumper = new TextPassDumper( $argv );
-if( true ) {
- $dumper->dump();
+if ( !isset( $options['help'] ) ) {
+ $dumper->dump( WikiExporter::FULL );
} else {
$dumper->progress( <<<ENDS
This script postprocesses XML dumps from dumpBackup.php to add
@@ -444,14 +446,16 @@ Usage: php dumpTextPass.php [<options>]
Options:
--stub=<type>:<file> To load a compressed stub dump instead of stdin
--prefetch=<type>:<file> Use a prior dump file as a text source, to save
- pressure on the database.
- (Requires PHP 5.0+ and the XMLReader PECL extension)
- --quiet Don't dump status reports to stderr.
+ pressure on the database.
+ --quiet Don't dump status reports to stderr.
--report=n Report position and speed after every n pages processed.
- (Default: 100)
+ (Default: 100)
--server=h Force reading from MySQL server h
- --current Base ETA on number of pages in database instead of all revisions
- --spawn Spawn a subprocess for loading text records
+ --output=<type>:<file> Write to a file instead of stdout
+ <type>s: file, gzip, bzip2, 7zip
+ --current Base ETA on number of pages in database instead of all revisions
+ --spawn Spawn a subprocess for loading text records
+ --help Display this help message
ENDS
);
}
diff --git a/maintenance/dumpUploads.php b/maintenance/dumpUploads.php
index c8f1667b..74c0cb0b 100644
--- a/maintenance/dumpUploads.php
+++ b/maintenance/dumpUploads.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class UploadDumper extends Maintenance {
public function __construct() {
@@ -34,22 +34,22 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
}
public function execute() {
- global $IP, $wgUseSharedUploads;
+ global $IP;
$this->mAction = 'fetchLocal';
$this->mBasePath = $this->getOption( 'base', $IP );
$this->mShared = false;
$this->mSharedSupplement = false;
- if( $this->hasOption('local') ) {
+ if ( $this->hasOption( 'local' ) ) {
$this->mAction = 'fetchLocal';
}
-
- if( $this->hasOption('used') ) {
+
+ if ( $this->hasOption( 'used' ) ) {
$this->mAction = 'fetchUsed';
}
-
- if( $this->hasOption('shared') ) {
- if( $this->hasOption('used') ) {
+
+ if ( $this->hasOption( 'shared' ) ) {
+ if ( $this->hasOption( 'used' ) ) {
// Include shared-repo files in the used check
$this->mShared = true;
} else {
@@ -57,51 +57,53 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
$this->mSharedSupplement = true;
}
}
- $this->{$this->mAction}( $this->mShared );
- if( $this->mSharedSupplement ) {
+ $this-> { $this->mAction } ( $this->mShared );
+ if ( $this->mSharedSupplement ) {
$this->fetchUsed( true );
}
}
/**
- * Fetch a list of all or used images from a particular image source.
- * @param string $table
- * @param string $directory Base directory where files are located
- * @param bool $shared true to pass shared-dir settings to hash func
+ * Fetch a list of used images from a particular image source.
+ *
+ * @param $shared Boolean: true to pass shared-dir settings to hash func
*/
function fetchUsed( $shared ) {
$dbr = wfGetDB( DB_SLAVE );
$image = $dbr->tableName( 'image' );
$imagelinks = $dbr->tableName( 'imagelinks' );
-
+
$sql = "SELECT DISTINCT il_to, img_name
FROM $imagelinks
LEFT OUTER JOIN $image
ON il_to=img_name";
$result = $dbr->query( $sql );
-
- foreach( $result as $row ) {
+
+ foreach ( $result as $row ) {
$this->outputItem( $row->il_to, $shared );
}
- $dbr->freeResult( $result );
}
+ /**
+ * Fetch a list of all images from a particular image source.
+ *
+ * @param $shared Boolean: true to pass shared-dir settings to hash func
+ */
function fetchLocal( $shared ) {
$dbr = wfGetDB( DB_SLAVE );
$result = $dbr->select( 'image',
array( 'img_name' ),
'',
__METHOD__ );
-
- foreach( $result as $row ) {
+
+ foreach ( $result as $row ) {
$this->outputItem( $row->img_name, $shared );
}
- $dbr->freeResult( $result );
}
-
+
function outputItem( $name, $shared ) {
$file = wfFindFile( $name );
- if( $file && $this->filterItem( $file, $shared ) ) {
+ if ( $file && $this->filterItem( $file, $shared ) ) {
$filename = $file->getFullPath();
$rel = wfRelativePath( $filename, $this->mBasePath );
$this->output( "$rel\n" );
@@ -116,4 +118,4 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
}
$maintClass = "UploadDumper";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/edit.php b/maintenance/edit.php
index 8d0068c3..40623afb 100644
--- a/maintenance/edit.php
+++ b/maintenance/edit.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class EditCLI extends Maintenance {
public function __construct() {
@@ -36,7 +36,7 @@ class EditCLI extends Maintenance {
}
public function execute() {
- global $wgUser, $wgTitle, $wgArticle;
+ global $wgUser, $wgTitle;
$userName = $this->getOption( 'u', 'Maintenance script' );
$summary = $this->getOption( 's', '' );
@@ -44,7 +44,7 @@ class EditCLI extends Maintenance {
$bot = $this->hasOption( 'b' );
$autoSummary = $this->hasOption( 'a' );
$noRC = $this->hasOption( 'no-rc' );
-
+
$wgUser = User::newFromName( $userName );
if ( !$wgUser ) {
$this->error( "Invalid username", true );
@@ -52,22 +52,22 @@ class EditCLI extends Maintenance {
if ( $wgUser->isAnon() ) {
$wgUser->addToDatabase();
}
-
+
$wgTitle = Title::newFromText( $this->getArg() );
if ( !$wgTitle ) {
$this->error( "Invalid title", true );
}
-
- $wgArticle = new Article( $wgTitle );
-
+
+ $article = new Article( $wgTitle );
+
# Read the text
$text = $this->getStdin( Maintenance::STDIN_ALL );
-
+
# Do the edit
$this->output( "Saving... " );
- $status = $wgArticle->doEdit( $text, $summary,
+ $status = $article->doEdit( $text, $summary,
( $minor ? EDIT_MINOR : 0 ) |
- ( $bot ? EDIT_FORCE_BOT : 0 ) |
+ ( $bot ? EDIT_FORCE_BOT : 0 ) |
( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
( $noRC ? EDIT_SUPPRESS_RC : 0 ) );
if ( $status->isOK() ) {
@@ -85,5 +85,5 @@ class EditCLI extends Maintenance {
}
$maintClass = "EditCLI";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/eval.php b/maintenance/eval.php
index a990a4d8..3cc1d16a 100644
--- a/maintenance/eval.php
+++ b/maintenance/eval.php
@@ -16,7 +16,7 @@
* @ingroup Maintenance
*/
-$wgUseNormalUser = (bool)getenv('MW_WIKIUSER');
+$wgUseNormalUser = (bool)getenv( 'MW_WIKIUSER' );
$optionsWithArgs = array( 'd' );
@@ -39,8 +39,8 @@ if ( isset( $options['d'] ) ) {
}
}
-if ( function_exists( 'readline_add_history' )
- && function_exists( 'posix_isatty' ) && posix_isatty( 0 /*STDIN*/ ) )
+if ( function_exists( 'readline_add_history' )
+ && posix_isatty( 0 /*STDIN*/ ) )
{
$useReadline = true;
} else {
@@ -48,19 +48,20 @@ if ( function_exists( 'readline_add_history' )
}
if ( $useReadline ) {
- $historyFile = "{$_ENV['HOME']}/.mweval_history";
+ $historyFile = isset( $_ENV['HOME'] ) ?
+ "{$_ENV['HOME']}/.mweval_history" : "$IP/maintenance/.mweval_history";
readline_read_history( $historyFile );
}
-while ( ( $line = readconsole( '> ' ) ) !== false ) {
+while ( ( $line = Maintenance::readconsole() ) !== false ) {
if ( $useReadline ) {
readline_add_history( $line );
readline_write_history( $historyFile );
}
$val = eval( $line . ";" );
- if( is_null( $val ) ) {
+ if ( is_null( $val ) ) {
echo "\n";
- } elseif( is_string( $val ) || is_numeric( $val ) ) {
+ } elseif ( is_string( $val ) || is_numeric( $val ) ) {
echo "$val\n";
} else {
var_dump( $val );
diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php
index 746ef8ad..ea56535d 100644
--- a/maintenance/fetchText.php
+++ b/maintenance/fetchText.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class FetchText extends Maintenance {
public function __construct() {
@@ -28,35 +28,52 @@ class FetchText extends Maintenance {
$this->mDescription = "Fetch the revision text from an old_id";
}
- public function execute() {
+ /*
+ * returns a string containing the following in order:
+ * textid
+ * \n
+ * length of text (-1 on error = failure to retrieve/unserialize/gunzip/etc)
+ * \n
+ * text (may be empty)
+ *
+ * note that that the text string itself is *not* followed by newline
+ */
+ public function execute() {
$db = wfGetDB( DB_SLAVE );
$stdin = $this->getStdin();
- while( !feof( $stdin ) ) {
+ while ( !feof( $stdin ) ) {
$line = fgets( $stdin );
- if( $line === false ) {
+ if ( $line === false ) {
// We appear to have lost contact...
break;
}
$textId = intval( $line );
$text = $this->doGetText( $db, $textId );
- $this->output( strlen( $text ) . "\n". $text );
+ if ($text === false) {
+ # actual error, not zero-length text
+ $textLen = "-1";
+ }
+ else {
+ $textLen = strlen($text);
+ }
+ $this->output( $textId . "\n" . $textLen . "\n" . $text );
}
}
-
+
/**
- * May throw a database error if, say, the server dies during query.
+ * May throw a database error if, say, the server dies during query.
* @param $db Database object
* @param $id int The old_id
* @return String
- */
+ */
private function doGetText( $db, $id ) {
$id = intval( $id );
$row = $db->selectRow( 'text',
array( 'old_text', 'old_flags' ),
array( 'old_id' => $id ),
- 'TextPassDumper::getText' );
+ __METHOD__ );
$text = Revision::getRevisionText( $row );
- if( $text === false ) {
+ if ( $text === false ) {
return false;
}
return $text;
@@ -64,4 +81,4 @@ class FetchText extends Maintenance {
}
$maintClass = "FetchText";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/findhooks.php b/maintenance/findhooks.php
index 13236b6b..04a5faef 100644
--- a/maintenance/findhooks.php
+++ b/maintenance/findhooks.php
@@ -2,7 +2,7 @@
/**
* Simple script that try to find documented hook and hooks actually
* in the code and show what's missing.
- *
+ *
* This script assumes that:
* - hooks names in hooks.txt are at the beginning of a line and single quoted.
* - hooks names in code are the first parameter of wfRunHooks.
@@ -12,6 +12,8 @@
*
* Any instance of wfRunHooks that doesn't meet these parameters will be noted.
*
+ * Copyright © Ashar Voultoiz
+ *
* 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
@@ -27,14 +29,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
- *
- * @author Ashar Voultoiz <hashar@altern.org>
- * @copyright Copyright © Ashar voultoiz
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public Licence 2.0 or later
+ * @author Ashar Voultoiz <hashar at free dot fr>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class FindHooks extends Maintenance {
public function __construct() {
@@ -54,37 +54,42 @@ class FindHooks extends Maintenance {
$potential = array();
$bad = array();
$pathinc = array(
- $IP.'/',
- $IP.'/includes/',
- $IP.'/includes/api/',
- $IP.'/includes/db/',
- $IP.'/includes/diff/',
- $IP.'/includes/filerepo/',
- $IP.'/includes/parser/',
- $IP.'/includes/search/',
- $IP.'/includes/specials/',
- $IP.'/includes/upload/',
- $IP.'/languages/',
- $IP.'/maintenance/',
- $IP.'/skins/',
+ $IP . '/',
+ $IP . '/includes/',
+ $IP . '/includes/api/',
+ $IP . '/includes/db/',
+ $IP . '/includes/diff/',
+ $IP . '/includes/filerepo/',
+ $IP . '/includes/installer/',
+ $IP . '/includes/parser/',
+ $IP . '/includes/resourceloader/',
+ $IP . '/includes/revisiondelete/',
+ $IP . '/includes/search/',
+ $IP . '/includes/specials/',
+ $IP . '/includes/upload/',
+ $IP . '/languages/',
+ $IP . '/maintenance/',
+ $IP . '/maintenance/tests/',
+ $IP . '/maintenance/tests/parser/',
+ $IP . '/skins/',
);
- foreach( $pathinc as $dir ) {
+ foreach ( $pathinc as $dir ) {
$potential = array_merge( $potential, $this->getHooksFromPath( $dir ) );
$bad = array_merge( $bad, $this->getBadHooksFromPath( $dir ) );
}
-
+
$potential = array_unique( $potential );
$bad = array_unique( $bad );
$todo = array_diff( $potential, $documented );
$deprecated = array_diff( $documented, $potential );
-
+
// let's show the results:
- $this->printArray('Undocumented', $todo );
- $this->printArray('Documented and not found', $deprecated );
- $this->printArray('Unclear hook calls', $bad );
-
- if ( count( $todo ) == 0 && count( $deprecated ) == 0 && count( $bad ) == 0 )
+ $this->printArray( 'Undocumented', $todo );
+ $this->printArray( 'Documented and not found', $deprecated );
+ $this->printArray( 'Unclear hook calls', $bad );
+
+ if ( count( $todo ) == 0 && count( $deprecated ) == 0 && count( $bad ) == 0 )
$this->output( "Looks good!\n" );
}
@@ -93,14 +98,14 @@ class FindHooks extends Maintenance {
* @return array of documented hooks
*/
private function getHooksFromDoc( $doc ) {
- if( $this->hasOption( 'online' ) ){
+ if ( $this->hasOption( 'online' ) ) {
// All hooks
$allhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php' );
$allhookdata = unserialize( $allhookdata );
$allhooks = array();
- foreach( $allhookdata['query']['categorymembers'] as $page ) {
+ foreach ( $allhookdata['query']['categorymembers'] as $page ) {
$found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
- if( $found ) {
+ if ( $found ) {
$hook = str_replace( ' ', '_', $matches[1] );
$allhooks[] = $hook;
}
@@ -109,9 +114,9 @@ class FindHooks extends Maintenance {
$oldhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Removed_hooks&cmlimit=500&format=php' );
$oldhookdata = unserialize( $oldhookdata );
$removed = array();
- foreach( $oldhookdata['query']['categorymembers'] as $page ) {
+ foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
$found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
- if( $found ) {
+ if ( $found ) {
$hook = str_replace( ' ', '_', $matches[1] );
$removed[] = $hook;
}
@@ -133,7 +138,7 @@ class FindHooks extends Maintenance {
private function getHooksFromFile( $file ) {
$content = file_get_contents( $file );
$m = array();
- preg_match_all( '/wfRunHooks\(\s*([\'"])(.*?)\1/', $content, $m);
+ preg_match_all( '/wfRunHooks\(\s*([\'"])(.*?)\1/', $content, $m );
return $m[2];
}
@@ -144,13 +149,14 @@ class FindHooks extends Maintenance {
*/
private function getHooksFromPath( $path ) {
$hooks = array();
- if( $dh = opendir($path) ) {
- while(($file = readdir($dh)) !== false) {
- if( filetype($path.$file) == 'file' ) {
- $hooks = array_merge( $hooks, $this->getHooksFromFile($path.$file) );
+ $dh = opendir( $path );
+ if ( $dh ) {
+ while ( ( $file = readdir( $dh ) ) !== false ) {
+ if ( filetype( $path . $file ) == 'file' ) {
+ $hooks = array_merge( $hooks, $this->getHooksFromFile( $path . $file ) );
}
}
- closedir($dh);
+ closedir( $dh );
}
return $hooks;
}
@@ -164,9 +170,9 @@ class FindHooks extends Maintenance {
$content = file_get_contents( $file );
$m = array();
# We want to skip the "function wfRunHooks()" one. :)
- preg_match_all( '/(?<!function )wfRunHooks\(\s*[^\s\'"].*/', $content, $m);
+ preg_match_all( '/(?<!function )wfRunHooks\(\s*[^\s\'"].*/', $content, $m );
$list = array();
- foreach( $m[0] as $match ){
+ foreach ( $m[0] as $match ) {
$list[] = $match . "(" . $file . ")";
}
return $list;
@@ -179,14 +185,15 @@ class FindHooks extends Maintenance {
*/
private function getBadHooksFromPath( $path ) {
$hooks = array();
- if( $dh = opendir($path) ) {
- while(($file = readdir($dh)) !== false) {
+ $dh = opendir( $path );
+ if ( $dh ) {
+ while ( ( $file = readdir( $dh ) ) !== false ) {
# We don't want to read this file as it contains bad calls to wfRunHooks()
- if( filetype( $path.$file ) == 'file' && !$path.$file == __FILE__ ) {
- $hooks = array_merge( $hooks, $this->getBadHooksFromFile($path.$file) );
+ if ( filetype( $path . $file ) == 'file' && !$path . $file == __FILE__ ) {
+ $hooks = array_merge( $hooks, $this->getBadHooksFromFile( $path . $file ) );
}
}
- closedir($dh);
+ closedir( $dh );
}
return $hooks;
}
@@ -198,10 +205,10 @@ class FindHooks extends Maintenance {
* @param $sort Boolean : wheter to sort the array (Default: true)
*/
private function printArray( $msg, $arr, $sort = true ) {
- if($sort) asort($arr);
- foreach($arr as $v) $this->output( "$msg: $v\n" );
+ if ( $sort ) asort( $arr );
+ foreach ( $arr as $v ) $this->output( "$msg: $v\n" );
}
}
$maintClass = "FindHooks";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
index c585beb1..fe892944 100644
--- a/maintenance/fixSlaveDesync.php
+++ b/maintenance/fixSlaveDesync.php
@@ -18,32 +18,29 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class FixSlaveDesync extends Maintenance {
public function __construct() {
- global $wgUseRootUser;
- $wgUseRootUser = true;
-
parent::__construct();
$this->mDescription = "";
-
}
-
+
+ public function getDbType() {
+ return Maintenance::DB_ADMIN;
+ }
+
public function execute() {
- global $slaveIndexes, $wgDBservers;
- $slaveIndexes = array();
- for ( $i = 1; $i < count( $wgDBservers ); $i++ ) {
+ $this->slaveIndexes = array();
+ for ( $i = 1; $i < wfGetLB()->getServerCount(); $i++ ) {
if ( wfGetLB()->isNonZeroLoad( $i ) ) {
- $slaveIndexes[] = $i;
+ $this->slaveIndexes[] = $i;
}
}
if ( $this->hasArg() ) {
$this->desyncFixPage( $this->getArg() );
} else {
- $dbw = wfGetDB( DB_MASTER );
- $maxPage = $dbw->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
$corrupt = $this->findPageLatestCorruption();
foreach ( $corrupt as $id => $dummy ) {
$this->desyncFixPage( $id );
@@ -69,10 +66,8 @@ class FixSlaveDesync extends Maintenance {
}
}
$this->output( "\n" );
- $dbw->freeResult( $res );
- global $slaveIndexes;
- foreach ( $slaveIndexes as $i ) {
+ foreach ( $this->slaveIndexes as $i ) {
$db = wfGetDB( $i );
$res = $db->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
foreach ( $res as $row ) {
@@ -81,7 +76,6 @@ class FixSlaveDesync extends Maintenance {
$this->output( $row->page_id . "\t" );
}
}
- $db->freeResult( $res );
}
$this->output( "\n" );
return $desync;
@@ -92,16 +86,14 @@ class FixSlaveDesync extends Maintenance {
* @param $pageID int The page_id to fix
*/
private function desyncFixPage( $pageID ) {
- global $slaveIndexes;
-
# Check for a corrupted page_latest
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
- $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
+ $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
__METHOD__, 'FOR UPDATE' );
- #list( $masterFile, $masterPos ) = $dbw->getMasterPos();
+ # list( $masterFile, $masterPos ) = $dbw->getMasterPos();
$found = false;
- foreach ( $slaveIndexes as $i ) {
+ foreach ( $this->slaveIndexes as $i ) {
$db = wfGetDB( $i );
/*
if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
@@ -109,7 +101,7 @@ class FixSlaveDesync extends Maintenance {
$dbw->commit();
sleep(10);
return;
- }*/
+ }*/
$latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
$max = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
if ( $latest != $realLatest && $realLatest < $max ) {
@@ -125,20 +117,18 @@ class FixSlaveDesync extends Maintenance {
}
# Find the missing revisions
- $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ),
+ $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ),
__METHOD__, 'FOR UPDATE' );
$masterIDs = array();
foreach ( $res as $row ) {
$masterIDs[] = $row->rev_id;
}
- $dbw->freeResult( $res );
$res = $db->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), __METHOD__ );
$slaveIDs = array();
foreach ( $res as $row ) {
$slaveIDs[] = $row->rev_id;
}
- $db->freeResult( $res );
if ( count( $masterIDs ) < count( $slaveIDs ) ) {
$missingIDs = array_diff( $slaveIDs, $masterIDs );
if ( count( $missingIDs ) ) {
@@ -167,7 +157,7 @@ class FixSlaveDesync extends Maintenance {
# Revision
$row = $dbFrom->selectRow( 'revision', '*', array( 'rev_id' => $rid ), __METHOD__ );
if ( $toMaster ) {
- $id = $dbw->selectField( 'revision', 'rev_id', array( 'rev_id' => $rid ),
+ $id = $dbw->selectField( 'revision', 'rev_id', array( 'rev_id' => $rid ),
__METHOD__, 'FOR UPDATE' );
if ( $id ) {
$this->output( "Revision already exists\n" );
@@ -177,7 +167,7 @@ class FixSlaveDesync extends Maintenance {
$dbw->insert( 'revision', get_object_vars( $row ), __METHOD__, 'IGNORE' );
}
} else {
- foreach ( $slaveIndexes as $i ) {
+ foreach ( $this->slaveIndexes as $i ) {
$db = wfGetDB( $i );
$db->insert( 'revision', get_object_vars( $row ), __METHOD__, 'IGNORE' );
}
@@ -188,7 +178,7 @@ class FixSlaveDesync extends Maintenance {
if ( $toMaster ) {
$dbw->insert( 'text', get_object_vars( $row ), __METHOD__, 'IGNORE' );
} else {
- foreach ( $slaveIndexes as $i ) {
+ foreach ( $this->slaveIndexes as $i ) {
$db = wfGetDB( $i );
$db->insert( 'text', get_object_vars( $row ), __METHOD__, 'IGNORE' );
}
@@ -200,9 +190,9 @@ class FixSlaveDesync extends Maintenance {
if ( $found ) {
$this->output( "Fixing page_latest... " );
if ( $toMaster ) {
- #$dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
+ # $dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
} else {
- foreach ( $slaveIndexes as $i ) {
+ foreach ( $this->slaveIndexes as $i ) {
$db = wfGetDB( $i );
$db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
}
@@ -214,4 +204,4 @@ class FixSlaveDesync extends Maintenance {
}
$maintClass = "FixSlaveDesync";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/fixTimestamps.php b/maintenance/fixTimestamps.php
index ea102fb8..3e3bd0a5 100644
--- a/maintenance/fixTimestamps.php
+++ b/maintenance/fixTimestamps.php
@@ -1,9 +1,9 @@
<?php
/**
- * This script fixes timestamp corruption caused by one or more webservers
+ * This script fixes timestamp corruption caused by one or more webservers
* temporarily being set to the wrong time. The time offset must be known and
- * consistent. Start and end times (in 14-character format) restrict the search,
- * and must bracket the damage. There must be a majority of good timestamps in the
+ * consistent. Start and end times (in 14-character format) restrict the search,
+ * and must bracket the damage. There must be a majority of good timestamps in the
* search period.
*
* This program is free software; you can redistribute it and/or modify
@@ -23,8 +23,8 @@
*
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class FixTimestamps extends Maintenance {
public function __construct() {
@@ -36,25 +36,25 @@ class FixTimestamps extends Maintenance {
}
public function execute() {
- $offset = $this->getArg(0) * 3600;
- $start = $this->getArg(1);
- $end = $this->getArg(2);
+ $offset = $this->getArg( 0 ) * 3600;
+ $start = $this->getArg( 1 );
+ $end = $this->getArg( 2 );
$grace = 60; // maximum normal clock offset
-
+
# Find bounding revision IDs
$dbw = wfGetDB( DB_MASTER );
$revisionTable = $dbw->tableName( 'revision' );
$res = $dbw->query( "SELECT MIN(rev_id) as minrev, MAX(rev_id) as maxrev FROM $revisionTable " .
"WHERE rev_timestamp BETWEEN '{$start}' AND '{$end}'", __METHOD__ );
$row = $dbw->fetchObject( $res );
-
+
if ( is_null( $row->minrev ) ) {
$this->error( "No revisions in search period.", true );
}
-
+
$minRev = $row->minrev;
$maxRev = $row->maxrev;
-
+
# Select all timestamps and IDs
$sql = "SELECT rev_id, rev_timestamp FROM $revisionTable " .
"WHERE rev_id BETWEEN $minRev AND $maxRev";
@@ -64,13 +64,13 @@ class FixTimestamps extends Maintenance {
} else {
$expectedSign = 1;
}
-
+
$res = $dbw->query( $sql, __METHOD__ );
-
+
$lastNormal = 0;
$badRevs = array();
$numGoodRevs = 0;
-
+
foreach ( $res as $row ) {
$timestamp = wfTimestamp( TS_UNIX, $row->rev_timestamp );
$delta = $timestamp - $lastNormal;
@@ -89,26 +89,25 @@ class FixTimestamps extends Maintenance {
$badRevs[] = $row->rev_id;
}
}
- $dbw->freeResult( $res );
-
+
$numBadRevs = count( $badRevs );
if ( $numBadRevs > $numGoodRevs ) {
- $this->error(
+ $this->error(
"The majority of revisions in the search interval are marked as bad.
- Are you sure the offset ($offset) has the right sign? Positive means the clock
+ Are you sure the offset ($offset) has the right sign? Positive means the clock
was incorrectly set forward, negative means the clock was incorrectly set back.
- If the offset is right, then increase the search interval until there are enough
+ If the offset is right, then increase the search interval until there are enough
good revisions to provide a majority reference.", true );
} elseif ( $numBadRevs == 0 ) {
$this->output( "No bad revisions found.\n" );
- exit(0);
+ exit( 0 );
}
-
- $this->output( sprintf( "Fixing %d revisions (%.2f%% of revisions in search interval)\n",
- $numBadRevs, $numBadRevs / ($numGoodRevs + $numBadRevs) * 100 ) );
-
+
+ $this->output( sprintf( "Fixing %d revisions (%.2f%% of revisions in search interval)\n",
+ $numBadRevs, $numBadRevs / ( $numGoodRevs + $numBadRevs ) * 100 ) );
+
$fixup = -$offset;
$sql = "UPDATE $revisionTable " .
"SET rev_timestamp=DATE_FORMAT(DATE_ADD(rev_timestamp, INTERVAL $fixup SECOND), '%Y%m%d%H%i%s') " .
@@ -119,4 +118,4 @@ class FixTimestamps extends Maintenance {
}
$maintClass = "FixTimestamps";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/fixUserRegistration.php b/maintenance/fixUserRegistration.php
index d3305358..d4ff7c23 100644
--- a/maintenance/fixUserRegistration.php
+++ b/maintenance/fixUserRegistration.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class FixUserRegistration extends Maintenance {
public function __construct() {
@@ -52,4 +52,4 @@ class FixUserRegistration extends Maintenance {
}
$maintClass = "FixUserRegistration";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php
index 6d8c57f2..a78522cd 100644
--- a/maintenance/fuzz-tester.php
+++ b/maintenance/fuzz-tester.php
@@ -13,9 +13,9 @@ Description:
How:
- Generate lots of nasty wiki text.
- - Ask the Parser to render that wiki text to HTML, or ask MediaWiki's forms
- to deal with that wiki text.
- - Check MediaWiki's output for problems.
+ - Ask the Parser to render that wiki text to HTML, or ask MediaWiki's forms
+ to deal with that wiki text.
+ - Check MediaWiki's output for problems.
- Repeat.
Why:
@@ -32,7 +32,7 @@ What type of problems are being checked for:
- Optionally checking for malformed HTML using the W3C validator.
Background:
- Many of the wikiFuzz class methods are a modified PHP port,
+ Many of the wikiFuzz class methods are a modified PHP port,
of a "shameless" Python port, of LCAMTUF'S MANGELME:
- http://www.securiteam.com/tools/6Z00N1PBFK.html
- http://www.securityfocus.com/archive/1/378632/2004-10-15/2004-10-21/0
@@ -43,15 +43,15 @@ Video:
Requirements:
To run this, you will need:
- - Command-line PHP5, with PHP-curl enabled (not all installations have this
- enabled - try "apt-get install php5-curl" if you're on Debian to install).
+ - Command-line PHP5, with PHP-curl enabled (not all installations have this
+ enabled - try "apt-get install php5-curl" if you're on Debian to install).
- the Tidy standalone executable. ("apt-get install tidy").
Optional:
- If you want to run the curl scripts, you'll need standalone curl installed
- ("apt-get install curl")
+ ("apt-get install curl")
- For viewing the W3C validator output on a command line, the "html2text"
- program may be useful ("apt-get install html2text")
+ program may be useful ("apt-get install html2text")
Saving tests and test results:
Any of the fuzz tests which find problems are saved for later review.
@@ -65,7 +65,7 @@ Saving tests and test results:
Wiki configuration for testing:
You should make some additions to LocalSettings.php in order to catch the most
errors. Note this configuration is for **TESTING PURPOSES ONLY**, and is IN NO
- WAY, SHAPE, OR FORM suitable for deployment on a hostile network. That said,
+ WAY, SHAPE, OR FORM suitable for deployment on a hostile network. That said,
personally I find these additions to be the most helpful for testing purposes:
// --------- Start ---------
@@ -99,7 +99,7 @@ Wiki configuration for testing:
$wgGroupPermissions['*']['makesysop'] = true;
// Enable weird and wonderful options:
- // Increase default error reporting level.
+ // Increase default error reporting level.
error_reporting (E_ALL); // At a later date could be increased to E_ALL | E_STRICT
$wgBlockOpenProxies = true; // Some block pages require this to be true in order to test.
$wgEnableUploads = true; // enable uploads.
@@ -127,14 +127,14 @@ Wiki configuration for testing:
require_once("extensions/Renameuser/SpecialRenameuser.php");
require_once("extensions/LinkSearch/LinkSearch.php");
// --------- End ---------
-
+
If you want to try E_STRICT error logging, add this to the above:
// --------- Start ---------
error_reporting (E_ALL | E_STRICT);
set_error_handler( 'error_handler' );
function error_handler ($type, $message, $file=__FILE__, $line=__LINE__) {
- if ($message == "var: Deprecated. Please use the public/private/protected modifiers") return;
- print "<br />\n<b>Strict Standards:</b> Type: <b>$type</b>: $message in <b>$file</b> on line <b>$line</b><br />\n";
+ if ($message == "var: Deprecated. Please use the public/private/protected modifiers") return;
+ print "<br />\n<b>Strict Standards:</b> Type: <b>$type</b>: $message in <b>$file</b> on line <b>$line</b><br />\n";
}
// --------- End ---------
@@ -152,62 +152,62 @@ Usage:
Console output:
- If requested, first any previously failed tests will be rerun.
- Then new tests will be generated and run. Any tests that fail will be saved,
- and a brief message about why they failed will be printed on the console.
+ and a brief message about why they failed will be printed on the console.
- The console will show the number of tests run, time run, number of tests
- failed, number of tests being done per minute, and the name of the current test.
+ failed, number of tests being done per minute, and the name of the current test.
TODO:
Some known things that could improve this script:
- - Logging in with cookie jar storage needed for some tests (as there are some
- pages that cannot be tested without being logged in, and which are currently
- untested - e.g. Special:Emailuser, Special:Preferences, adding to Watchist).
+ - Logging in with cookie jar storage needed for some tests (as there are some
+ pages that cannot be tested without being logged in, and which are currently
+ untested - e.g. Special:Emailuser, Special:Preferences, adding to Watchist).
- Testing of Timeline extension (I cannot test as ploticus has/had issues on
- my architecture).
+ my architecture).
*/
-/////////////////////////// COMMAND LINE HELP ////////////////////////////////////
+// ///////////////////////// COMMAND LINE HELP ////////////////////////////////////
// This is a command line script, load MediaWiki env (gives command line options);
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
// if the user asked for an explanation of command line options.
if ( isset( $options["help"] ) ) {
- print <<<ENDS
+ print <<<ENDS
MediaWiki $wgVersion fuzz tester
Usage: php {$_SERVER["SCRIPT_NAME"]} [--quiet] [--base-url=<url-to-test-wiki>]
- [--directory=<failed-test-path>] [--include-binary]
- [--w3c-validate] [--delete-passed-retests] [--help]
- [--user=<username>] [--password=<password>]
- [--rerun-failed-tests] [--max-errors=<int>]
- [--max-runtime=<num-minutes>]
- [--specific-test=<test-name>]
+ [--directory=<failed-test-path>] [--include-binary]
+ [--w3c-validate] [--delete-passed-retests] [--help]
+ [--user=<username>] [--password=<password>]
+ [--rerun-failed-tests] [--max-errors=<int>]
+ [--max-runtime=<num-minutes>]
+ [--specific-test=<test-name>]
Options:
--quiet : Hides passed tests, shows only failed tests.
- --base-url : URL to a wiki on which to run the tests.
- The "http://" is optional and can be omitted.
+ --base-url : URL to a wiki on which to run the tests.
+ The "http://" is optional and can be omitted.
--directory : Full path to directory for storing failed tests.
- Will be created if it does not exist.
+ Will be created if it does not exist.
--include-binary : Includes non-alphanumeric characters in the tests.
- --w3c-validate : Validates pages using the W3C's web validator.
- Slow. Currently many pages fail validation.
+ --w3c-validate : Validates pages using the W3C's web validator.
+ Slow. Currently many pages fail validation.
--user : Login name of a valid user on your test wiki.
- --password : Password for the valid user on your test wiki.
+ --password : Password for the valid user on your test wiki.
--delete-passed-retests : Will delete retests that now pass.
- Requires --rerun-failed-tests to be meaningful.
+ Requires --rerun-failed-tests to be meaningful.
--rerun-failed-tests : Whether to rerun any previously failed tests.
--max-errors : Maximum number of errors to report before exiting.
- Does not include errors from --rerun-failed-tests
+ Does not include errors from --rerun-failed-tests
--max-runtime : Maximum runtime, in minutes, to run before exiting.
- Only applies to new tests, not --rerun-failed-tests
- --specific-test : Runs only the specified fuzz test.
- Only applies to new tests, not --rerun-failed-tests
+ Only applies to new tests, not --rerun-failed-tests
+ --specific-test : Runs only the specified fuzz test.
+ Only applies to new tests, not --rerun-failed-tests
--keep-passed-tests : Saves all test files, even those that pass.
--help : Show this help message.
Example:
- If you wanted to fuzz test a nightly MediaWiki checkout using cron for 1 hour,
+ If you wanted to fuzz test a nightly MediaWiki checkout using cron for 1 hour,
and only wanted to be informed of errors, and did not want to redo previously
failed tests, and wanted a maximum of 100 errors, then you could do:
php {$_SERVER["SCRIPT_NAME"]} --quiet --max-errors=100 --max-runtime=60
@@ -215,659 +215,660 @@ Example:
ENDS;
- exit( 0 );
+ exit( 0 );
}
// if we got command line options, check they look valid.
-$validOptions = array ("quiet", "base-url", "directory", "include-binary",
- "w3c-validate", "user", "password", "delete-passed-retests",
- "rerun-failed-tests", "max-errors",
- "max-runtime", "specific-test", "keep-passed-tests", "help" );
-if (!empty($options)) {
- $unknownArgs = array_diff (array_keys($options), $validOptions);
- foreach ($unknownArgs as $invalidArg) {
- print "Ignoring invalid command-line option: --$invalidArg\n";
- }
+$validOptions = array ( "quiet", "base-url", "directory", "include-binary",
+ "w3c-validate", "user", "password", "delete-passed-retests",
+ "rerun-failed-tests", "max-errors",
+ "max-runtime", "specific-test", "keep-passed-tests", "help" );
+if ( !empty( $options ) ) {
+ $unknownArgs = array_diff ( array_keys( $options ), $validOptions );
+ foreach ( $unknownArgs as $invalidArg ) {
+ print "Ignoring invalid command-line option: --$invalidArg\n";
+ }
}
-///////////////////////////// CONFIGURATION ////////////////////////////////////
+// /////////////////////////// CONFIGURATION ////////////////////////////////////
// URL to some wiki on which we can run our tests.
-if (!empty($options["base-url"])) {
- define("WIKI_BASE_URL", $options["base-url"]);
+if ( !empty( $options["base-url"] ) ) {
+ define( "WIKI_BASE_URL", $options["base-url"] );
} else {
- define("WIKI_BASE_URL", $wgServer . $wgScriptPath . '/');
+ define( "WIKI_BASE_URL", $wgServer . $wgScriptPath . '/' );
}
// The directory name where we store the output.
// Example for Windows: "c:\\temp\\wiki-fuzz"
-if (!empty($options["directory"])) {
- define("DIRECTORY", $options["directory"] );
+if ( !empty( $options["directory"] ) ) {
+ define( "DIRECTORY", $options["directory"] );
} else {
- define("DIRECTORY", "{$wgUploadDirectory}/fuzz-tests");
+ define( "DIRECTORY", "{$wgUploadDirectory}/fuzz-tests" );
}
// Should our test fuzz data include binary strings?
-define("INCLUDE_BINARY", isset($options["include-binary"]) );
+define( "INCLUDE_BINARY", isset( $options["include-binary"] ) );
// Whether we want to validate HTML output on the web.
// At the moment very few generated pages will validate, so not recommended.
-define("VALIDATE_ON_WEB", isset($options["w3c-validate"]) );
+define( "VALIDATE_ON_WEB", isset( $options["w3c-validate"] ) );
// URL to use to validate our output:
-define("VALIDATOR_URL", "http://validator.w3.org/check");
+define( "VALIDATOR_URL", "http://validator.w3.org/check" );
// Location of Tidy standalone executable.
-define("PATH_TO_TIDY", "/usr/bin/tidy");
+define( "PATH_TO_TIDY", "/usr/bin/tidy" );
-// The name of a user who has edited on your wiki. Used
+// The name of a user who has edited on your wiki. Used
// when testing the Special:Contributions and Special:Userlogin page.
-if (!empty($options["user"])) {
- define("USER_ON_WIKI", $options["user"] );
+if ( !empty( $options["user"] ) ) {
+ define( "USER_ON_WIKI", $options["user"] );
} else {
- define("USER_ON_WIKI", "nickj");
+ define( "USER_ON_WIKI", "nickj" );
}
// The password of the above user. Used when testing the login page,
-// and to do this we sometimes need to login successfully.
-if (!empty($options["password"])) {
- define("USER_PASSWORD", $options["password"] );
+// and to do this we sometimes need to login successfully.
+if ( !empty( $options["password"] ) ) {
+ define( "USER_PASSWORD", $options["password"] );
} else {
- // And no, this is not a valid password on any public wiki.
- define("USER_PASSWORD", "nickj");
+ // And no, this is not a valid password on any public wiki.
+ define( "USER_PASSWORD", "nickj" );
}
// If we have a test that failed, and then we run it again, and it passes,
// do you want to delete it or keep it?
-define("DELETE_PASSED_RETESTS", isset($options["delete-passed-retests"]) );
+define( "DELETE_PASSED_RETESTS", isset( $options["delete-passed-retests"] ) );
// Do we want to rerun old saved tests at script startup?
// Set to true to help catch regressions, or false if you only want new stuff.
-define("RERUN_OLD_TESTS", isset($options["rerun-failed-tests"]) );
+define( "RERUN_OLD_TESTS", isset( $options["rerun-failed-tests"] ) );
// File where the database errors are logged. Should be defined in LocalSettings.php.
-define("DB_ERROR_LOG_FILE", $wgDBerrorLog );
+define( "DB_ERROR_LOG_FILE", $wgDBerrorLog );
// Run in chatty mode (all output, default), or run in quiet mode (only prints out details of failed tests)?
-define("QUIET", isset($options["quiet"]) );
+define( "QUIET", isset( $options["quiet"] ) );
// Keep all test files, even those that pass. Potentially useful to tracking input that causes something
// unusual to happen, if you don't know what "unusual" is until later.
-define("KEEP_PASSED_TESTS", isset($options["keep-passed-tests"]) );
+define( "KEEP_PASSED_TESTS", isset( $options["keep-passed-tests"] ) );
// The maximum runtime, if specified.
-if (!empty($options["max-runtime"]) && intval($options["max-runtime"])>0) {
- define("MAX_RUNTIME", intval($options["max-runtime"]) );
+if ( !empty( $options["max-runtime"] ) && intval( $options["max-runtime"] ) > 0 ) {
+ define( "MAX_RUNTIME", intval( $options["max-runtime"] ) );
}
// The maximum number of problems to find, if specified. Excludes retest errors.
-if (!empty($options["max-errors"]) && intval($options["max-errors"])>0) {
- define("MAX_ERRORS", intval($options["max-errors"]) );
+if ( !empty( $options["max-errors"] ) && intval( $options["max-errors"] ) > 0 ) {
+ define( "MAX_ERRORS", intval( $options["max-errors"] ) );
}
// if the user has requested a specific test (instead of all tests), and the test they asked for looks valid.
-if (!empty($options["specific-test"])) {
- if (class_exists($options["specific-test"]) && get_parent_class($options["specific-test"])=="pageTest") {
- define("SPECIFIC_TEST", $options["specific-test"] );
- }
- else {
- print "Ignoring invalid --specific-test\n";
- }
+if ( !empty( $options["specific-test"] ) ) {
+ if ( class_exists( $options["specific-test"] ) && get_parent_class( $options["specific-test"] ) == "pageTest" ) {
+ define( "SPECIFIC_TEST", $options["specific-test"] );
+ }
+ else {
+ print "Ignoring invalid --specific-test\n";
+ }
}
// Define the file extensions we'll use:
-define("PHP_TEST" , ".test.php");
-define("CURL_TEST", ".curl.sh" );
-define("DATA_FILE", ".data.bin");
-define("INFO_FILE", ".info.txt");
-define("HTML_FILE", ".wiki_preview.html");
+define( "PHP_TEST" , ".test.php" );
+define( "CURL_TEST", ".curl.sh" );
+define( "DATA_FILE", ".data.bin" );
+define( "INFO_FILE", ".info.txt" );
+define( "HTML_FILE", ".wiki_preview.html" );
// If it goes wrong, we want to know about it.
-error_reporting(E_ALL | E_STRICT);
+error_reporting( E_ALL | E_STRICT );
-//////////////// A CLASS THAT GENERATES RANDOM NASTY WIKI & HTML STRINGS //////////////////////
+// ////////////// A CLASS THAT GENERATES RANDOM NASTY WIKI & HTML STRINGS //////////////////////
class wikiFuzz {
- // Only some HTML tags are understood with params by MediaWiki, the rest are ignored.
- // List the tags that accept params below, as well as what those params are.
- public static $data = array(
- "B" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "CAPTION" => array("CLASS", "ID", "STYLE", "align", "lang", "dir", "title"),
- "CENTER" => array("CLASS", "STYLE", "ID", "lang", "dir", "title"),
- "DIV" => array("CLASS", "STYLE", "ID", "align", "lang", "dir", "title"),
- "FONT" => array("CLASS", "STYLE", "ID", "lang", "dir", "title", "face", "size", "color"),
- "H1" => array("STYLE", "CLASS", "ID", "align", "lang", "dir", "title"),
- "H2" => array("STYLE", "CLASS", "ID", "align", "lang", "dir", "title"),
- "HR" => array("STYLE", "CLASS", "ID", "WIDTH", "lang", "dir", "title", "size", "noshade"),
- "LI" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", "type", "value"),
- "TABLE" => array("STYLE", "CLASS", "ID", "BGCOLOR", "WIDTH", "ALIGN", "BORDER", "CELLPADDING",
- "CELLSPACING", "lang", "dir", "title", "summary", "frame", "rules"),
- "TD" => array("STYLE", "CLASS", "ID", "BGCOLOR", "WIDTH", "ALIGN", "COLSPAN", "ROWSPAN",
- "VALIGN", "abbr", "axis", "headers", "scope", "nowrap", "height", "lang",
- "dir", "title", "char", "charoff"),
- "TH" => array("STYLE", "CLASS", "ID", "BGCOLOR", "WIDTH", "ALIGN", "COLSPAN", "ROWSPAN",
- "VALIGN", "abbr", "axis", "headers", "scope", "nowrap", "height", "lang",
- "dir", "title", "char", "charoff"),
- "TR" => array("CLASS", "STYLE", "ID", "BGCOLOR", "ALIGN", "VALIGN", "lang", "dir", "title", "char", "charoff"),
- "UL" => array("CLASS", "STYLE", "ID", "lang", "dir", "title", "type"),
- "P" => array("style", "class", "id", "align", "lang", "dir", "title"),
- "blockquote" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", "cite"),
- "span" => array("CLASS", "ID", "STYLE", "align", "lang", "dir", "title"),
- "code" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "tt" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "small" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "big" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "s" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "u" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "del" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", "datetime", "cite"),
- "ins" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", "datetime", "cite"),
- "sub" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "sup" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "ol" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", "type", "start"),
- "br" => array("CLASS", "ID", "STYLE", "title", "clear"),
- "cite" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "var" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "dl" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "ruby" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "rt" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "rp" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "dt" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "dl" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "em" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "strong" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "i" => array("CLASS", "ID", "STYLE", "lang", "dir", "title"),
- "thead" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign'),
- "tfoot" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign'),
- "tbody" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign'),
- "colgroup" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign', 'span', 'width'),
- "col" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign', 'span', 'width'),
- "pre" => array("CLASS", "ID", "STYLE", "lang", "dir", "title", "width"),
-
- // extension tags that accept parameters:
- "sort" => array("order", "class"),
- "ref" => array("name"),
- "categorytree" => array("hideroot", "mode", "style"),
- "chemform" => array("link", "wikilink", "query"),
- "section" => array("begin", "new"),
-
- // older MW transclusion.
- "transclude" => array("page"),
- );
-
- // The types of the HTML that we will be testing were defined above
- // Note: this needs to be initialized later to be equal to: array_keys(wikiFuzz::$data);
- // as such, it also needs to also be publicly modifiable.
- public static $types;
-
-
- // Some attribute values.
- static private $other = array("&","=",":","?","\"","\n","%n%n%n%n%n%n%n%n%n%n%n%n","\\");
- static private $ints = array(
- // various numbers
- "0","-1","127","-7897","89000","808080","90928345",
- "0xfffffff","ffff",
-
- // Different ways of saying: '
- "&#0000039;", // Long UTF-8 Unicode encoding
- "&#39;", // dec version.
- "&#x27;", // hex version.
- "&#xA7;", // malformed hex variant, MSB not zero.
-
- // Different ways of saying: "
- "&#0000034;", // Long UTF-8 Unicode encoding
- "&#34;",
- "&#x22;", // hex version.
- "&#xA2;", // malformed hex variant, MSB not zero.
-
- // Different ways of saying: <
- "<",
- "&#0000060", // Long UTF-8 Unicode encoding without semicolon (Mediawiki wants the colon)
- "&#0000060;", // Long UTF-8 Unicode encoding with semicolon
- "&#60;",
- "&#x3C;", // hex version.
- "&#xBC;", // malformed hex variant, MSB not zero.
- "&#x0003C;", // mid-length hex version
- "&#X00003C;", // slightly longer hex version, with capital "X"
-
- // Different ways of saying: >
- ">",
- "&#0000062;", // Long UTF-8 Unicode encoding
- "&#62;",
- "&#x3E;", // hex version.
- "&#xBE;", // malformed variant, MSB not zero.
-
- // Different ways of saying: [
- "&#0000091;", // Long UTF-8 Unicode encoding
- "&#91;",
- "&#x5B;", // hex version.
-
- // Different ways of saying: {{
- "&#0000123;&#0000123;", // Long UTF-8 Unicode encoding
- "&#123;&#123;",
- "&#x7B;&#x7B;", // hex version.
-
- // Different ways of saying: |
- "&#0000124;", // Long UTF-8 Unicode encoding
- "&#124;",
- "&#x7C;", // hex version.
- "&#xFC;", // malformed hex variant, MSB not zero.
-
- // a "lignature" - http://www.robinlionheart.com/stds/html4/spchars#ligature
- "&zwnj;"
- );
-
- // Defines various wiki-related bits of syntax, that can potentially cause
- // MediaWiki to do something other than just print that literal text.
- static private $ext = array(
- // links, templates, parameters.
- "[[", "]]", "{{", "}}", "|", "[", "]", "{{{", "}}}", "|]]",
-
- // wiki tables.
- "\n{|", "\n|}",
- "!",
- "\n!",
- "!!",
- "||",
- "\n|-", "| ", "\n|",
-
- // section headings.
- "=", "==", "===", "====", "=====", "======",
-
- // lists (ordered and unordered) and indentation.
- "\n*", "*", "\n:", ":",
- "\n#", "#",
-
- // definition lists (dl, dt, dd), newline, and newline with pre, and a tab.
- "\n;", ";", "\n ",
-
- // Whitespace: newline, tab, space.
- "\n", "\t", " ",
-
- // Some XSS attack vectors from http://ha.ckers.org/xss.html
- "&#x09;", // tab
- "&#x0A;", // newline
- "&#x0D;", // carriage return
- "\0", // null character
- " &#14; ", // spaces and meta characters
- "'';!--\"<XSS>=&{()}", // compact injection of XSS & SQL tester
-
- // various NULL fields
- "%00",
- "&#00;",
- "\0",
-
- // horizontal rule.
- "-----", "\n-----",
-
- // signature, redirect, bold, italics.
- "~~~~", "#REDIRECT [[", "'''", "''",
-
- // comments.
- "<!--", "-->",
-
- // quotes.
- "\"", "'",
-
- // tag start and tag end.
- "<", ">",
-
- // implicit link creation on URIs.
- "http://",
- "https://",
- "ftp://",
- "irc://",
- "news:",
- 'gopher://',
- 'telnet://',
- 'nntp://',
- 'worldwind://',
- 'mailto:',
-
- // images.
- "[[image:",
- ".gif",
- ".png",
- ".jpg",
- ".jpeg",
- 'thumbnail=',
- 'thumbnail',
- 'thumb=',
- 'thumb',
- 'right',
- 'none',
- 'left',
- 'framed',
- 'frame',
- 'enframed',
- 'centre',
- 'center',
- "Image:",
- "[[:Image",
- 'px',
- 'upright=',
- 'border',
-
- // misc stuff to throw at the Parser.
- '%08X',
- '/',
- ":x{|",
- "\n|+",
- "<noinclude>",
- "</noinclude>",
- " \302\273",
- " :",
- " !",
- " ;",
- "\302\253",
- "[[category:",
- "?=",
- "(",
- ")",
- "]]]",
- "../",
- "{{{{",
- "}}}}",
- "[[Special:",
- "<includeonly>",
- "</includeonly>",
- "<!--MWTEMPLATESECTION=",
- '<!--MWTOC-->',
-
- // implicit link creation on booknum, RFC, and PubMed ID usage (both with and without IDs)
- "ISBN 2",
- "RFC 000",
- "PMID 000",
- "ISBN ",
- "RFC ",
- "PMID ",
-
- // magic words:
- '__NOTOC__',
- '__FORCETOC__',
- '__NOEDITSECTION__',
- '__START__',
- '__NOTITLECONVERT__',
- '__NOCONTENTCONVERT__',
- '__END__',
- '__TOC__',
- '__NOTC__',
- '__NOCC__',
- "__FORCETOC__",
- "__NEWSECTIONLINK__",
- "__NOGALLERY__",
-
- // more magic words / internal templates.
- '{{PAGENAME}}',
- '{{PAGENAMEE}}',
- '{{NAMESPACE}}',
- "{{MSG:",
- "}}",
- "{{MSGNW:",
- "}}",
- "{{INT:",
- "}}",
- '{{SITENAME}}',
- "{{NS:",
- "}}",
- "{{LOCALURL:",
- "}}",
- "{{LOCALURLE:",
- "}}",
- "{{SCRIPTPATH}}",
- "{{GRAMMAR:gentiv|",
- "}}",
- "{{REVISIONID}}",
- "{{SUBPAGENAME}}",
- "{{SUBPAGENAMEE}}",
- "{{ns:0}}",
- "{{fullurle:",
- "}}",
- "{{subst::",
- "}}",
- "{{UCFIRST:",
- "}}",
- "{{UC:",
- '{{SERVERNAME}}',
- '{{SERVER}}',
- "{{RAW:",
- "}}",
- "{{PLURAL:",
- "}}",
- "{{LCFIRST:",
- "}}",
- "{{LC:",
- "}}",
- '{{CURRENTWEEK}}',
- '{{CURRENTDOW}}',
- "{{INT:{{LC:contribs-showhideminor}}|",
- "}}",
- "{{INT:googlesearch|",
- "}}",
- "{{BASEPAGENAME}}",
- "{{CONTENTLANGUAGE}}",
- "{{PAGESINNAMESPACE:}}",
- "{{#language:",
- "}}",
- "{{#special:",
- "}}",
- "{{#special:emailuser",
- "}}",
-
- // Some raw link for magic words.
- "{{NUMBEROFPAGES:R",
- "}}",
- "{{NUMBEROFUSERS:R",
- "}}",
- "{{NUMBEROFARTICLES:R",
- "}}",
- "{{NUMBEROFFILES:R",
- "}}",
- "{{NUMBEROFADMINS:R",
- "}}",
- "{{padleft:",
- "}}",
- "{{padright:",
- "}}",
- "{{DEFAULTSORT:",
- "}}",
-
- // internal Math "extension":
- "<math>",
- "</math>",
-
- // Parser extension functions:
- "{{#expr:",
- "{{#if:",
- "{{#ifeq:",
- "{{#ifexist:",
- "{{#ifexpr:",
- "{{#switch:",
- "{{#time:",
- "}}",
-
- // references table for the Cite extension.
- "<references/>",
-
- // Internal Parser tokens - try inserting some of these.
- "UNIQ25f46b0524f13e67NOPARSE",
- "UNIQ17197916557e7cd6-HTMLCommentStrip46238afc3bb0cf5f00000002",
- "\x07UNIQ17197916557e7cd6-HTMLCommentStrip46238afc3bb0cf5f00000002-QINU",
-
- // Inputbox extension:
- "<inputbox>\ntype=search\nsearchbuttonlabel=\n",
- "</inputbox>",
-
- // charInsert extension:
- "<charInsert>",
- "</charInsert>",
-
- // wikiHiero extension:
- "<hiero>",
- "</hiero>",
-
- // Image gallery:
- "<gallery>",
- "</gallery>",
-
- // FixedImage extension.
- "<fundraising/>",
-
- // Timeline extension: currently untested.
-
- // Nowiki:
- "<nOwIkI>",
- "</nowiki>",
-
- // an external image to test the external image displaying code
- "http://debian.org/Pics/debian.png",
-
- // LabeledSectionTransclusion extension.
- "{{#lstx:",
- "}}",
- "{{#lst:",
- "}}",
- "{{#lst:Main Page|",
- "}}"
- );
-
- /**
- ** Randomly returns one element of the input array.
- */
- static public function chooseInput(array $input) {
- $randindex = wikiFuzz::randnum(count($input) - 1);
- return $input[$randindex];
- }
-
- // Max number of parameters for HTML attributes.
- static private $maxparams = 10;
-
- /**
- ** Returns random number between finish and start.
- */
- static public function randnum($finish,$start=0) {
- return mt_rand($start,$finish);
- }
-
- /**
- ** Returns a mix of random text and random wiki syntax.
- */
- static private function randstring() {
- $thestring = "";
-
- for ($i=0; $i<40; $i++) {
- $what = wikiFuzz::randnum(1);
-
- if ($what == 0) { // include some random wiki syntax
- $which = wikiFuzz::randnum(count(wikiFuzz::$ext) - 1);
- $thestring .= wikiFuzz::$ext[$which];
- }
- else { // include some random text
- $char = INCLUDE_BINARY
- // Decimal version:
- // "&#" . wikiFuzz::randnum(255) . ";"
- // Hex version:
- ? "&#x" . str_pad(dechex(wikiFuzz::randnum(255)), wikiFuzz::randnum(2, 7), "0", STR_PAD_LEFT) . ";"
- // A truly binary version:
- // ? chr(wikiFuzz::randnum(0,255))
- : chr(wikiFuzz::randnum(126,32));
-
- $length = wikiFuzz::randnum(8);
- $thestring .= str_repeat ($char, $length);
- }
- }
- return $thestring;
- }
-
- /**
- ** Returns either random text, or random wiki syntax, or random data from "ints",
- ** or random data from "other".
- */
- static private function makestring() {
- $what = wikiFuzz::randnum(2);
- if ($what == 0) {
- return wikiFuzz::randstring();
- }
- elseif ($what == 1) {
- return wikiFuzz::$ints[wikiFuzz::randnum(count(wikiFuzz::$ints) - 1)];
- }
- else {
- return wikiFuzz::$other[wikiFuzz::randnum(count(wikiFuzz::$other) - 1)];
- }
- }
-
-
- /**
- ** Strips out the stuff that Mediawiki balks at in a page's title.
- ** Implementation copied/pasted from cleanupTable.inc & cleanupImages.php
- */
- static public function makeTitleSafe($str) {
- $legalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF";
- return preg_replace_callback(
- "/([^$legalTitleChars])/",
- create_function(
- // single quotes are essential here,
- // or alternative escape all $ as \$
- '$matches',
- 'return sprintf( "\\x%02x", ord( $matches[1] ) );'
- ),
- $str );
- }
-
- /**
- ** Returns a string of fuzz text.
- */
- static private function loop() {
- switch ( wikiFuzz::randnum(3) ) {
- case 1: // an opening tag, with parameters.
- $string = "";
- $i = wikiFuzz::randnum(count(wikiFuzz::$types) - 1);
- $t = wikiFuzz::$types[$i];
- $arr = wikiFuzz::$data[$t];
- $string .= "<" . $t . " ";
- $num_params = min(wikiFuzz::$maxparams, count($arr));
- for ($z=0; $z<$num_params; $z++) {
- $badparam = $arr[wikiFuzz::randnum(count($arr) - 1)];
- $badstring = wikiFuzz::makestring();
- $string .= $badparam . "=" . wikiFuzz::getRandQuote() . $badstring . wikiFuzz::getRandQuote() . " ";
- }
- $string .= ">\n";
- return $string;
- case 2: // a closing tag.
- $i = wikiFuzz::randnum(count(wikiFuzz::$types) - 1);
- return "</". wikiFuzz::$types[$i] . ">";
- case 3: // a random string, between tags.
- return wikiFuzz::makeString();
- }
- return ""; // catch-all, should never be called.
- }
-
- /**
- ** Returns one of the three styles of random quote: ', ", and nothing.
- */
- static private function getRandQuote() {
- switch ( wikiFuzz::randnum(3) ) {
- case 1 : return "'";
- case 2 : return "\"";
- default: return "";
- }
- }
-
- /**
- ** Returns fuzz text, with the parameter indicating approximately how many lines of text you want.
- */
- static public function makeFuzz($maxtypes = 2) {
- $page = "";
- for ($k=0; $k<$maxtypes; $k++) {
- $page .= wikiFuzz::loop();
- }
- return $page;
- }
-}
-
-
-//////// MEDIAWIKI PAGES TO TEST, AND HOW TO TEST THEM ///////
+ // Only some HTML tags are understood with params by MediaWiki, the rest are ignored.
+ // List the tags that accept params below, as well as what those params are.
+ public static $data = array(
+ "B" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "CAPTION" => array( "CLASS", "ID", "STYLE", "align", "lang", "dir", "title" ),
+ "CENTER" => array( "CLASS", "STYLE", "ID", "lang", "dir", "title" ),
+ "DIV" => array( "CLASS", "STYLE", "ID", "align", "lang", "dir", "title" ),
+ "FONT" => array( "CLASS", "STYLE", "ID", "lang", "dir", "title", "face", "size", "color" ),
+ "H1" => array( "STYLE", "CLASS", "ID", "align", "lang", "dir", "title" ),
+ "H2" => array( "STYLE", "CLASS", "ID", "align", "lang", "dir", "title" ),
+ "HR" => array( "STYLE", "CLASS", "ID", "WIDTH", "lang", "dir", "title", "size", "noshade" ),
+ "LI" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", "type", "value" ),
+ "TABLE" => array( "STYLE", "CLASS", "ID", "BGCOLOR", "WIDTH", "ALIGN", "BORDER", "CELLPADDING",
+ "CELLSPACING", "lang", "dir", "title", "summary", "frame", "rules" ),
+ "TD" => array( "STYLE", "CLASS", "ID", "BGCOLOR", "WIDTH", "ALIGN", "COLSPAN", "ROWSPAN",
+ "VALIGN", "abbr", "axis", "headers", "scope", "nowrap", "height", "lang",
+ "dir", "title", "char", "charoff" ),
+ "TH" => array( "STYLE", "CLASS", "ID", "BGCOLOR", "WIDTH", "ALIGN", "COLSPAN", "ROWSPAN",
+ "VALIGN", "abbr", "axis", "headers", "scope", "nowrap", "height", "lang",
+ "dir", "title", "char", "charoff" ),
+ "TR" => array( "CLASS", "STYLE", "ID", "BGCOLOR", "ALIGN", "VALIGN", "lang", "dir", "title", "char", "charoff" ),
+ "UL" => array( "CLASS", "STYLE", "ID", "lang", "dir", "title", "type" ),
+ "P" => array( "style", "class", "id", "align", "lang", "dir", "title" ),
+ "blockquote" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", "cite" ),
+ "span" => array( "CLASS", "ID", "STYLE", "align", "lang", "dir", "title" ),
+ "code" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "tt" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "small" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "big" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "s" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "u" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "del" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", "datetime", "cite" ),
+ "ins" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", "datetime", "cite" ),
+ "sub" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "sup" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "ol" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", "type", "start" ),
+ "br" => array( "CLASS", "ID", "STYLE", "title", "clear" ),
+ "cite" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "var" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "dl" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "ruby" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "rt" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "rp" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "dt" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "dl" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "em" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "strong" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "i" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
+ "thead" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign' ),
+ "tfoot" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign' ),
+ "tbody" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign' ),
+ "colgroup" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign', 'span', 'width' ),
+ "col" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", 'align', 'char', 'charoff', 'valign', 'span', 'width' ),
+ "pre" => array( "CLASS", "ID", "STYLE", "lang", "dir", "title", "width" ),
+
+ // extension tags that accept parameters:
+ "sort" => array( "order", "class" ),
+ "ref" => array( "name" ),
+ "categorytree" => array( "hideroot", "mode", "style" ),
+ "chemform" => array( "link", "wikilink", "query" ),
+ "section" => array( "begin", "new" ),
+
+ // older MW transclusion.
+ "transclude" => array( "page" ),
+ );
+
+ // The types of the HTML that we will be testing were defined above
+ // Note: this needs to be initialized later to be equal to: array_keys(wikiFuzz::$data);
+ // as such, it also needs to also be publicly modifiable.
+ public static $types;
+
+
+ // Some attribute values.
+ static private $other = array( "&", "=", ":", "?", "\"", "\n", "%n%n%n%n%n%n%n%n%n%n%n%n", "\\" );
+ static private $ints = array(
+ // various numbers
+ "0", "-1", "127", "-7897", "89000", "808080", "90928345",
+ "0xfffffff", "ffff",
+
+ // Different ways of saying: '
+ "&#0000039;", // Long UTF-8 Unicode encoding
+ "&#39;", // dec version.
+ "&#x27;", // hex version.
+ "&#xA7;", // malformed hex variant, MSB not zero.
+
+ // Different ways of saying: "
+ "&#0000034;", // Long UTF-8 Unicode encoding
+ "&#34;",
+ "&#x22;", // hex version.
+ "&#xA2;", // malformed hex variant, MSB not zero.
+
+ // Different ways of saying: <
+ "<",
+ "&#0000060", // Long UTF-8 Unicode encoding without semicolon (Mediawiki wants the colon)
+ "&#0000060;", // Long UTF-8 Unicode encoding with semicolon
+ "&#60;",
+ "&#x3C;", // hex version.
+ "&#xBC;", // malformed hex variant, MSB not zero.
+ "&#x0003C;", // mid-length hex version
+ "&#X00003C;", // slightly longer hex version, with capital "X"
+
+ // Different ways of saying: >
+ ">",
+ "&#0000062;", // Long UTF-8 Unicode encoding
+ "&#62;",
+ "&#x3E;", // hex version.
+ "&#xBE;", // malformed variant, MSB not zero.
+
+ // Different ways of saying: [
+ "&#0000091;", // Long UTF-8 Unicode encoding
+ "&#91;",
+ "&#x5B;", // hex version.
+
+ // Different ways of saying: {{
+ "&#0000123;&#0000123;", // Long UTF-8 Unicode encoding
+ "&#123;&#123;",
+ "&#x7B;&#x7B;", // hex version.
+
+ // Different ways of saying: |
+ "&#0000124;", // Long UTF-8 Unicode encoding
+ "&#124;",
+ "&#x7C;", // hex version.
+ "&#xFC;", // malformed hex variant, MSB not zero.
+
+ // a "lignature" - http://www.robinlionheart.com/stds/html4/spchars#ligature
+ // &#8204; == &zwnj;
+ "&#8204;"
+ );
+
+ // Defines various wiki-related bits of syntax, that can potentially cause
+ // MediaWiki to do something other than just print that literal text.
+ static private $ext = array(
+ // links, templates, parameters.
+ "[[", "]]", "{{", "}}", "|", "[", "]", "{{{", "}}}", "|]]",
+
+ // wiki tables.
+ "\n{|", "\n|}",
+ "!",
+ "\n!",
+ "!!",
+ "||",
+ "\n|-", "| ", "\n|",
+
+ // section headings.
+ "=", "==", "===", "====", "=====", "======",
+
+ // lists (ordered and unordered) and indentation.
+ "\n*", "*", "\n:", ":",
+ "\n#", "#",
+
+ // definition lists (dl, dt, dd), newline, and newline with pre, and a tab.
+ "\n;", ";", "\n ",
+
+ // Whitespace: newline, tab, space.
+ "\n", "\t", " ",
+
+ // Some XSS attack vectors from http://ha.ckers.org/xss.html
+ "&#x09;", // tab
+ "&#x0A;", // newline
+ "&#x0D;", // carriage return
+ "\0", // null character
+ " &#14; ", // spaces and meta characters
+ "'';!--\"<XSS>=&{()}", // compact injection of XSS & SQL tester
+
+ // various NULL fields
+ "%00",
+ "&#00;",
+ "\0",
+
+ // horizontal rule.
+ "-----", "\n-----",
+
+ // signature, redirect, bold, italics.
+ "~~~~", "#REDIRECT [[", "'''", "''",
+
+ // comments.
+ "<!--", "-->",
+
+ // quotes.
+ "\"", "'",
+
+ // tag start and tag end.
+ "<", ">",
+
+ // implicit link creation on URIs.
+ "http://",
+ "https://",
+ "ftp://",
+ "irc://",
+ "news:",
+ 'gopher://',
+ 'telnet://',
+ 'nntp://',
+ 'worldwind://',
+ 'mailto:',
+
+ // images.
+ "[[image:",
+ ".gif",
+ ".png",
+ ".jpg",
+ ".jpeg",
+ 'thumbnail=',
+ 'thumbnail',
+ 'thumb=',
+ 'thumb',
+ 'right',
+ 'none',
+ 'left',
+ 'framed',
+ 'frame',
+ 'enframed',
+ 'centre',
+ 'center',
+ "Image:",
+ "[[:Image",
+ 'px',
+ 'upright=',
+ 'border',
+
+ // misc stuff to throw at the Parser.
+ '%08X',
+ '/',
+ ":x{|",
+ "\n|+",
+ "<noinclude>",
+ "</noinclude>",
+ " \302\273",
+ " :",
+ " !",
+ " ;",
+ "\302\253",
+ "[[category:",
+ "?=",
+ "(",
+ ")",
+ "]]]",
+ "../",
+ "{{{{",
+ "}}}}",
+ "[[Special:",
+ "<includeonly>",
+ "</includeonly>",
+ "<!--MWTEMPLATESECTION=",
+ '<!--MWTOC-->',
+
+ // implicit link creation on booknum, RFC, and PubMed ID usage (both with and without IDs)
+ "ISBN 2",
+ "RFC 000",
+ "PMID 000",
+ "ISBN ",
+ "RFC ",
+ "PMID ",
+
+ // magic words:
+ '__NOTOC__',
+ '__FORCETOC__',
+ '__NOEDITSECTION__',
+ '__START__',
+ '__NOTITLECONVERT__',
+ '__NOCONTENTCONVERT__',
+ '__END__',
+ '__TOC__',
+ '__NOTC__',
+ '__NOCC__',
+ "__FORCETOC__",
+ "__NEWSECTIONLINK__",
+ "__NOGALLERY__",
+
+ // more magic words / internal templates.
+ '{{PAGENAME}}',
+ '{{PAGENAMEE}}',
+ '{{NAMESPACE}}',
+ "{{MSG:",
+ "}}",
+ "{{MSGNW:",
+ "}}",
+ "{{INT:",
+ "}}",
+ '{{SITENAME}}',
+ "{{NS:",
+ "}}",
+ "{{LOCALURL:",
+ "}}",
+ "{{LOCALURLE:",
+ "}}",
+ "{{SCRIPTPATH}}",
+ "{{GRAMMAR:gentiv|",
+ "}}",
+ "{{REVISIONID}}",
+ "{{SUBPAGENAME}}",
+ "{{SUBPAGENAMEE}}",
+ "{{ns:0}}",
+ "{{fullurle:",
+ "}}",
+ "{{subst::",
+ "}}",
+ "{{UCFIRST:",
+ "}}",
+ "{{UC:",
+ '{{SERVERNAME}}',
+ '{{SERVER}}',
+ "{{RAW:",
+ "}}",
+ "{{PLURAL:",
+ "}}",
+ "{{LCFIRST:",
+ "}}",
+ "{{LC:",
+ "}}",
+ '{{CURRENTWEEK}}',
+ '{{CURRENTDOW}}',
+ "{{INT:{{LC:contribs-showhideminor}}|",
+ "}}",
+ "{{INT:googlesearch|",
+ "}}",
+ "{{BASEPAGENAME}}",
+ "{{CONTENTLANGUAGE}}",
+ "{{PAGESINNAMESPACE:}}",
+ "{{#language:",
+ "}}",
+ "{{#special:",
+ "}}",
+ "{{#special:emailuser",
+ "}}",
+
+ // Some raw link for magic words.
+ "{{NUMBEROFPAGES:R",
+ "}}",
+ "{{NUMBEROFUSERS:R",
+ "}}",
+ "{{NUMBEROFARTICLES:R",
+ "}}",
+ "{{NUMBEROFFILES:R",
+ "}}",
+ "{{NUMBEROFADMINS:R",
+ "}}",
+ "{{padleft:",
+ "}}",
+ "{{padright:",
+ "}}",
+ "{{DEFAULTSORT:",
+ "}}",
+
+ // internal Math "extension":
+ "<math>",
+ "</math>",
+
+ // Parser extension functions:
+ "{{#expr:",
+ "{{#if:",
+ "{{#ifeq:",
+ "{{#ifexist:",
+ "{{#ifexpr:",
+ "{{#switch:",
+ "{{#time:",
+ "}}",
+
+ // references table for the Cite extension.
+ "<references/>",
+
+ // Internal Parser tokens - try inserting some of these.
+ "UNIQ25f46b0524f13e67NOPARSE",
+ "UNIQ17197916557e7cd6-HTMLCommentStrip46238afc3bb0cf5f00000002",
+ "\x07UNIQ17197916557e7cd6-HTMLCommentStrip46238afc3bb0cf5f00000002-QINU",
+
+ // Inputbox extension:
+ "<inputbox>\ntype=search\nsearchbuttonlabel=\n",
+ "</inputbox>",
+
+ // charInsert extension:
+ "<charInsert>",
+ "</charInsert>",
+
+ // wikiHiero extension:
+ "<hiero>",
+ "</hiero>",
+
+ // Image gallery:
+ "<gallery>",
+ "</gallery>",
+
+ // FixedImage extension.
+ "<fundraising/>",
+
+ // Timeline extension: currently untested.
+
+ // Nowiki:
+ "<nOwIkI>",
+ "</nowiki>",
+
+ // an external image to test the external image displaying code
+ "http://debian.org/Pics/debian.png",
+
+ // LabeledSectionTransclusion extension.
+ "{{#lstx:",
+ "}}",
+ "{{#lst:",
+ "}}",
+ "{{#lst:Main Page|",
+ "}}"
+ );
+
+ /**
+ ** Randomly returns one element of the input array.
+ */
+ static public function chooseInput( array $input ) {
+ $randindex = wikiFuzz::randnum( count( $input ) - 1 );
+ return $input[$randindex];
+ }
+
+ // Max number of parameters for HTML attributes.
+ static private $maxparams = 10;
+
+ /**
+ ** Returns random number between finish and start.
+ */
+ static public function randnum( $finish, $start = 0 ) {
+ return mt_rand( $start, $finish );
+ }
+
+ /**
+ ** Returns a mix of random text and random wiki syntax.
+ */
+ static private function randstring() {
+ $thestring = "";
+
+ for ( $i = 0; $i < 40; $i++ ) {
+ $what = wikiFuzz::randnum( 1 );
+
+ if ( $what == 0 ) { // include some random wiki syntax
+ $which = wikiFuzz::randnum( count( wikiFuzz::$ext ) - 1 );
+ $thestring .= wikiFuzz::$ext[$which];
+ }
+ else { // include some random text
+ $char = INCLUDE_BINARY
+ // Decimal version:
+ // "&#" . wikiFuzz::randnum(255) . ";"
+ // Hex version:
+ ? "&#x" . str_pad( dechex( wikiFuzz::randnum( 255 ) ), wikiFuzz::randnum( 2, 7 ), "0", STR_PAD_LEFT ) . ";"
+ // A truly binary version:
+ // ? chr(wikiFuzz::randnum(0,255))
+ : chr( wikiFuzz::randnum( 126, 32 ) );
+
+ $length = wikiFuzz::randnum( 8 );
+ $thestring .= str_repeat ( $char, $length );
+ }
+ }
+ return $thestring;
+ }
+
+ /**
+ ** Returns either random text, or random wiki syntax, or random data from "ints",
+ ** or random data from "other".
+ */
+ static private function makestring() {
+ $what = wikiFuzz::randnum( 2 );
+ if ( $what == 0 ) {
+ return wikiFuzz::randstring();
+ }
+ elseif ( $what == 1 ) {
+ return wikiFuzz::$ints[wikiFuzz::randnum( count( wikiFuzz::$ints ) - 1 )];
+ }
+ else {
+ return wikiFuzz::$other[wikiFuzz::randnum( count( wikiFuzz::$other ) - 1 )];
+ }
+ }
+
+
+ /**
+ ** Strips out the stuff that Mediawiki balks at in a page's title.
+ ** Implementation copied/pasted from cleanupTable.inc & cleanupImages.php
+ */
+ static public function makeTitleSafe( $str ) {
+ $legalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF";
+ return preg_replace_callback(
+ "/([^$legalTitleChars])/",
+ create_function(
+ // single quotes are essential here,
+ // or alternative escape all $ as \$
+ '$matches',
+ 'return sprintf( "\\x%02x", ord( $matches[1] ) );'
+ ),
+ $str );
+ }
+
+ /**
+ ** Returns a string of fuzz text.
+ */
+ static private function loop() {
+ switch ( wikiFuzz::randnum( 3 ) ) {
+ case 1: // an opening tag, with parameters.
+ $string = "";
+ $i = wikiFuzz::randnum( count( wikiFuzz::$types ) - 1 );
+ $t = wikiFuzz::$types[$i];
+ $arr = wikiFuzz::$data[$t];
+ $string .= "<" . $t . " ";
+ $num_params = min( wikiFuzz::$maxparams, count( $arr ) );
+ for ( $z = 0; $z < $num_params; $z++ ) {
+ $badparam = $arr[wikiFuzz::randnum( count( $arr ) - 1 )];
+ $badstring = wikiFuzz::makestring();
+ $string .= $badparam . "=" . wikiFuzz::getRandQuote() . $badstring . wikiFuzz::getRandQuote() . " ";
+ }
+ $string .= ">\n";
+ return $string;
+ case 2: // a closing tag.
+ $i = wikiFuzz::randnum( count( wikiFuzz::$types ) - 1 );
+ return "</" . wikiFuzz::$types[$i] . ">";
+ case 3: // a random string, between tags.
+ return wikiFuzz::makeString();
+ }
+ return ""; // catch-all, should never be called.
+ }
+
+ /**
+ ** Returns one of the three styles of random quote: ', ", and nothing.
+ */
+ static private function getRandQuote() {
+ switch ( wikiFuzz::randnum( 3 ) ) {
+ case 1 : return "'";
+ case 2 : return "\"";
+ default: return "";
+ }
+ }
+
+ /**
+ ** Returns fuzz text, with the parameter indicating approximately how many lines of text you want.
+ */
+ static public function makeFuzz( $maxtypes = 2 ) {
+ $page = "";
+ for ( $k = 0; $k < $maxtypes; $k++ ) {
+ $page .= wikiFuzz::loop();
+ }
+ return $page;
+ }
+}
+
+
+// ////// MEDIAWIKI PAGES TO TEST, AND HOW TO TEST THEM ///////
/**
** A page test has just these things:
@@ -875,30 +876,30 @@ class wikiFuzz {
** 2) the URL we are going to test those parameters on.
** 3) Any cookies required for the test.
** 4) Whether Tidy should validate the page. Defaults to true, but can be turned off.
- ** Declared abstract because it should be extended by a class
+ ** Declared abstract because it should be extended by a class
** that supplies these parameters.
*/
abstract class pageTest {
- protected $params;
- protected $pagePath;
- protected $cookie = "";
- protected $tidyValidate = true;
+ protected $params;
+ protected $pagePath;
+ protected $cookie = "";
+ protected $tidyValidate = true;
+
+ public function getParams() {
+ return $this->params;
+ }
- public function getParams() {
- return $this->params;
- }
+ public function getPagePath() {
+ return $this->pagePath;
+ }
- public function getPagePath() {
- return $this->pagePath;
- }
+ public function getCookie() {
+ return $this->cookie;
+ }
- public function getCookie() {
- return $this->cookie;
- }
-
- public function tidyValidate() {
- return $this->tidyValidate;
- }
+ public function tidyValidate() {
+ return $this->tidyValidate;
+ }
}
@@ -906,31 +907,31 @@ abstract class pageTest {
** a page test for the "Edit" page. Tests Parser.php and Sanitizer.php.
*/
class editPageTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=WIKIFUZZ";
-
- $this->params = array (
- "action" => "submit",
- "wpMinoredit" => wikiFuzz::makeFuzz(2),
- "wpPreview" => wikiFuzz::makeFuzz(2),
- "wpSection" => wikiFuzz::makeFuzz(2),
- "wpEdittime" => wikiFuzz::makeFuzz(2),
- "wpSummary" => wikiFuzz::makeFuzz(2),
- "wpScrolltop" => wikiFuzz::makeFuzz(2),
- "wpStarttime" => wikiFuzz::makeFuzz(2),
- "wpAutoSummary" => wikiFuzz::makeFuzz(2),
- "wpTextbox1" => wikiFuzz::makeFuzz(40) // the main wiki text, need lots of this.
- );
-
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpSection"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpEdittime"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpSummary"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpScrolltop"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpStarttime"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpAutoSummary"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpTextbox1"]);
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=WIKIFUZZ";
+
+ $this->params = array (
+ "action" => "submit",
+ "wpMinoredit" => wikiFuzz::makeFuzz( 2 ),
+ "wpPreview" => wikiFuzz::makeFuzz( 2 ),
+ "wpSection" => wikiFuzz::makeFuzz( 2 ),
+ "wpEdittime" => wikiFuzz::makeFuzz( 2 ),
+ "wpSummary" => wikiFuzz::makeFuzz( 2 ),
+ "wpScrolltop" => wikiFuzz::makeFuzz( 2 ),
+ "wpStarttime" => wikiFuzz::makeFuzz( 2 ),
+ "wpAutoSummary" => wikiFuzz::makeFuzz( 2 ),
+ "wpTextbox1" => wikiFuzz::makeFuzz( 40 ) // the main wiki text, need lots of this.
+ );
+
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpSection"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpEdittime"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpSummary"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpScrolltop"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpStarttime"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpAutoSummary"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpTextbox1"] );
+ }
}
@@ -938,18 +939,18 @@ class editPageTest extends pageTest {
** a page test for "Special:Listusers".
*/
class listusersTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Listusers";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Listusers";
- $this->params = array (
- "title" => wikiFuzz::makeFuzz(2),
- "group" => wikiFuzz::makeFuzz(2),
- "username" => wikiFuzz::makeFuzz(2),
- "Go" => wikiFuzz::makeFuzz(2),
- "limit" => wikiFuzz::chooseInput( array("0", "-1", "---'----------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "offset" => wikiFuzz::chooseInput( array("0", "-1", "--------'-----0", "+1", "81343242346234234", wikiFuzz::makeFuzz(2)) )
- );
- }
+ $this->params = array (
+ "title" => wikiFuzz::makeFuzz( 2 ),
+ "group" => wikiFuzz::makeFuzz( 2 ),
+ "username" => wikiFuzz::makeFuzz( 2 ),
+ "Go" => wikiFuzz::makeFuzz( 2 ),
+ "limit" => wikiFuzz::chooseInput( array( "0", "-1", "---'----------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "offset" => wikiFuzz::chooseInput( array( "0", "-1", "--------'-----0", "+1", "81343242346234234", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+ }
}
@@ -957,34 +958,34 @@ class listusersTest extends pageTest {
** a page test for "Special:Search".
*/
class searchTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Search";
-
- $this->params = array (
- "action" => "index.php?title=Special:Search",
- "ns0" => wikiFuzz::makeFuzz(2),
- "ns1" => wikiFuzz::makeFuzz(2),
- "ns2" => wikiFuzz::makeFuzz(2),
- "ns3" => wikiFuzz::makeFuzz(2),
- "ns4" => wikiFuzz::makeFuzz(2),
- "ns5" => wikiFuzz::makeFuzz(2),
- "ns6" => wikiFuzz::makeFuzz(2),
- "ns7" => wikiFuzz::makeFuzz(2),
- "ns8" => wikiFuzz::makeFuzz(2),
- "ns9" => wikiFuzz::makeFuzz(2),
- "ns10" => wikiFuzz::makeFuzz(2),
- "ns11" => wikiFuzz::makeFuzz(2),
- "ns12" => wikiFuzz::makeFuzz(2),
- "ns13" => wikiFuzz::makeFuzz(2),
- "ns14" => wikiFuzz::makeFuzz(2),
- "ns15" => wikiFuzz::makeFuzz(2),
- "redirs" => wikiFuzz::makeFuzz(2),
- "search" => wikiFuzz::makeFuzz(2),
- "offset" => wikiFuzz::chooseInput( array("", "0", "-1", "--------'-----0", "+1", "81343242346234234", wikiFuzz::makeFuzz(2)) ),
- "fulltext" => wikiFuzz::chooseInput( array("", "0", "1", "--------'-----0", "+1", wikiFuzz::makeFuzz(2)) ),
- "searchx" => wikiFuzz::chooseInput( array("", "0", "1", "--------'-----0", "+1", wikiFuzz::makeFuzz(2)) )
- );
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Search";
+
+ $this->params = array (
+ "action" => "index.php?title=Special:Search",
+ "ns0" => wikiFuzz::makeFuzz( 2 ),
+ "ns1" => wikiFuzz::makeFuzz( 2 ),
+ "ns2" => wikiFuzz::makeFuzz( 2 ),
+ "ns3" => wikiFuzz::makeFuzz( 2 ),
+ "ns4" => wikiFuzz::makeFuzz( 2 ),
+ "ns5" => wikiFuzz::makeFuzz( 2 ),
+ "ns6" => wikiFuzz::makeFuzz( 2 ),
+ "ns7" => wikiFuzz::makeFuzz( 2 ),
+ "ns8" => wikiFuzz::makeFuzz( 2 ),
+ "ns9" => wikiFuzz::makeFuzz( 2 ),
+ "ns10" => wikiFuzz::makeFuzz( 2 ),
+ "ns11" => wikiFuzz::makeFuzz( 2 ),
+ "ns12" => wikiFuzz::makeFuzz( 2 ),
+ "ns13" => wikiFuzz::makeFuzz( 2 ),
+ "ns14" => wikiFuzz::makeFuzz( 2 ),
+ "ns15" => wikiFuzz::makeFuzz( 2 ),
+ "redirs" => wikiFuzz::makeFuzz( 2 ),
+ "search" => wikiFuzz::makeFuzz( 2 ),
+ "offset" => wikiFuzz::chooseInput( array( "", "0", "-1", "--------'-----0", "+1", "81343242346234234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "fulltext" => wikiFuzz::chooseInput( array( "", "0", "1", "--------'-----0", "+1", wikiFuzz::makeFuzz( 2 ) ) ),
+ "searchx" => wikiFuzz::chooseInput( array( "", "0", "1", "--------'-----0", "+1", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+ }
}
@@ -992,28 +993,28 @@ class searchTest extends pageTest {
** a page test for "Special:Recentchanges".
*/
class recentchangesTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Recentchanges";
-
- $this->params = array (
- "action" => wikiFuzz::makeFuzz(2),
- "title" => wikiFuzz::makeFuzz(2),
- "namespace" => wikiFuzz::chooseInput( range(-1, 15) ),
- "Go" => wikiFuzz::makeFuzz(2),
- "invert" => wikiFuzz::chooseInput( array("-1", "---'----------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "hideanons" => wikiFuzz::chooseInput( array("-1", "------'-------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- 'limit' => wikiFuzz::chooseInput( array("0", "-1", "---------'----0", "+1", "81340909772349234", wikiFuzz::makeFuzz(2)) ),
- "days" => wikiFuzz::chooseInput( array("-1", "----------'---0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "hideminor" => wikiFuzz::chooseInput( array("-1", "-----------'--0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "hidebots" => wikiFuzz::chooseInput( array("-1", "---------'----0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "hideliu" => wikiFuzz::chooseInput( array("-1", "-------'------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "hidepatrolled" => wikiFuzz::chooseInput( array("-1", "-----'--------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "hidemyself" => wikiFuzz::chooseInput( array("-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- 'categories_any'=> wikiFuzz::chooseInput( array("-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- 'categories' => wikiFuzz::chooseInput( array("-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- 'feed' => wikiFuzz::chooseInput( array("-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz(2)) )
- );
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Recentchanges";
+
+ $this->params = array (
+ "action" => wikiFuzz::makeFuzz( 2 ),
+ "title" => wikiFuzz::makeFuzz( 2 ),
+ "namespace" => wikiFuzz::chooseInput( range( -1, 15 ) ),
+ "Go" => wikiFuzz::makeFuzz( 2 ),
+ "invert" => wikiFuzz::chooseInput( array( "-1", "---'----------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "hideanons" => wikiFuzz::chooseInput( array( "-1", "------'-------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'limit' => wikiFuzz::chooseInput( array( "0", "-1", "---------'----0", "+1", "81340909772349234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "days" => wikiFuzz::chooseInput( array( "-1", "----------'---0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "hideminor" => wikiFuzz::chooseInput( array( "-1", "-----------'--0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "hidebots" => wikiFuzz::chooseInput( array( "-1", "---------'----0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "hideliu" => wikiFuzz::chooseInput( array( "-1", "-------'------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "hidepatrolled" => wikiFuzz::chooseInput( array( "-1", "-----'--------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "hidemyself" => wikiFuzz::chooseInput( array( "-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'categories_any' => wikiFuzz::chooseInput( array( "-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'categories' => wikiFuzz::chooseInput( array( "-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'feed' => wikiFuzz::chooseInput( array( "-1", "--'-----------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+ }
}
@@ -1021,25 +1022,25 @@ class recentchangesTest extends pageTest {
** a page test for "Special:Prefixindex".
*/
class prefixindexTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Prefixindex";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Prefixindex";
- $this->params = array (
- "title" => "Special:Prefixindex",
- "namespace" => wikiFuzz::randnum(-10,101),
- "Go" => wikiFuzz::makeFuzz(2)
- );
+ $this->params = array (
+ "title" => "Special:Prefixindex",
+ "namespace" => wikiFuzz::randnum( -10, 101 ),
+ "Go" => wikiFuzz::makeFuzz( 2 )
+ );
- // sometimes we want 'prefix', sometimes we want 'from', and sometimes we want nothing.
- if (wikiFuzz::randnum(3) == 0) {
- $this->params["prefix"] = wikiFuzz::chooseInput( array("-1", "-----'--------0", "+++--+1",
- wikiFuzz::randnum(-10,8134), wikiFuzz::makeFuzz(2)) );
- }
- if (wikiFuzz::randnum(3) == 0) {
- $this->params["from"] = wikiFuzz::chooseInput( array("-1", "-----'--------0", "+++--+1",
- wikiFuzz::randnum(-10,8134), wikiFuzz::makeFuzz(2)) );
- }
- }
+ // sometimes we want 'prefix', sometimes we want 'from', and sometimes we want nothing.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) {
+ $this->params["prefix"] = wikiFuzz::chooseInput( array( "-1", "-----'--------0", "+++--+1",
+ wikiFuzz::randnum( -10, 8134 ), wikiFuzz::makeFuzz( 2 ) ) );
+ }
+ if ( wikiFuzz::randnum( 3 ) == 0 ) {
+ $this->params["from"] = wikiFuzz::chooseInput( array( "-1", "-----'--------0", "+++--+1",
+ wikiFuzz::randnum( -10, 8134 ), wikiFuzz::makeFuzz( 2 ) ) );
+ }
+ }
}
@@ -1047,16 +1048,16 @@ class prefixindexTest extends pageTest {
** a page test for "Special:MIMEsearch".
*/
class mimeSearchTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:MIMEsearch";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:MIMEsearch";
- $this->params = array (
- "action" => "index.php?title=Special:MIMEsearch",
- "mime" => wikiFuzz::makeFuzz(3),
- 'limit' => wikiFuzz::chooseInput( array("0", "-1", "-------'------0", "+1", "81342321351235325", wikiFuzz::makeFuzz(2)) ),
- 'offset' => wikiFuzz::chooseInput( array("0", "-1", "-----'--------0", "+1", "81341231235365252234324", wikiFuzz::makeFuzz(2)) )
- );
- }
+ $this->params = array (
+ "action" => "index.php?title=Special:MIMEsearch",
+ "mime" => wikiFuzz::makeFuzz( 3 ),
+ 'limit' => wikiFuzz::chooseInput( array( "0", "-1", "-------'------0", "+1", "81342321351235325", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'offset' => wikiFuzz::chooseInput( array( "0", "-1", "-----'--------0", "+1", "81341231235365252234324", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+ }
}
@@ -1064,19 +1065,19 @@ class mimeSearchTest extends pageTest {
** a page test for "Special:Log".
*/
class specialLogTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Log";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Log";
- $this->params = array (
- "type" => wikiFuzz::chooseInput( array("", wikiFuzz::makeFuzz(2)) ),
- "par" => wikiFuzz::makeFuzz(2),
- "user" => wikiFuzz::makeFuzz(2),
- "page" => wikiFuzz::makeFuzz(2),
- "from" => wikiFuzz::makeFuzz(2),
- "until" => wikiFuzz::makeFuzz(2),
- "title" => wikiFuzz::makeFuzz(2)
- );
- }
+ $this->params = array (
+ "type" => wikiFuzz::chooseInput( array( "", wikiFuzz::makeFuzz( 2 ) ) ),
+ "par" => wikiFuzz::makeFuzz( 2 ),
+ "user" => wikiFuzz::makeFuzz( 2 ),
+ "page" => wikiFuzz::makeFuzz( 2 ),
+ "from" => wikiFuzz::makeFuzz( 2 ),
+ "until" => wikiFuzz::makeFuzz( 2 ),
+ "title" => wikiFuzz::makeFuzz( 2 )
+ );
+ }
}
@@ -1084,18 +1085,18 @@ class specialLogTest extends pageTest {
** a page test for "Special:Userlogin", with a successful login.
*/
class successfulUserLoginTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Userlogin&action=submitlogin&type=login&returnto=" . wikiFuzz::makeFuzz(2);
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Userlogin&action=submitlogin&type=login&returnto=" . wikiFuzz::makeFuzz( 2 );
- $this->params = array (
- "wpName" => USER_ON_WIKI,
- // sometimes real password, sometimes not:
- 'wpPassword' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz(2), USER_PASSWORD ) ),
- 'wpRemember' => wikiFuzz::makeFuzz(2)
- );
+ $this->params = array (
+ "wpName" => USER_ON_WIKI,
+ // sometimes real password, sometimes not:
+ 'wpPassword' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ), USER_PASSWORD ) ),
+ 'wpRemember' => wikiFuzz::makeFuzz( 2 )
+ );
- $this->cookie = "wikidb_session=" . wikiFuzz::chooseInput( array("1" , wikiFuzz::makeFuzz(2) ) );
- }
+ $this->cookie = "wikidb_session=" . wikiFuzz::chooseInput( array( "1" , wikiFuzz::makeFuzz( 2 ) ) );
+ }
}
@@ -1103,30 +1104,30 @@ class successfulUserLoginTest extends pageTest {
** a page test for "Special:Userlogin".
*/
class userLoginTest extends pageTest {
- function __construct() {
+ function __construct() {
- $this->pagePath = "index.php?title=Special:Userlogin";
+ $this->pagePath = "index.php?title=Special:Userlogin";
- $this->params = array (
- 'wpRetype' => wikiFuzz::makeFuzz(2),
- 'wpRemember' => wikiFuzz::makeFuzz(2),
- 'wpRealName' => wikiFuzz::makeFuzz(2),
- 'wpPassword' => wikiFuzz::makeFuzz(2),
- 'wpName' => wikiFuzz::makeFuzz(2),
- 'wpMailmypassword'=> wikiFuzz::makeFuzz(2),
- 'wpLoginattempt' => wikiFuzz::makeFuzz(2),
- 'wpEmail' => wikiFuzz::makeFuzz(2),
- 'wpDomain' => wikiFuzz::chooseInput( array("", "local", wikiFuzz::makeFuzz(2)) ),
- 'wpCreateaccountMail' => wikiFuzz::chooseInput( array("", wikiFuzz::makeFuzz(2)) ),
- 'wpCreateaccount' => wikiFuzz::chooseInput( array("", wikiFuzz::makeFuzz(2)) ),
- 'wpCookieCheck' => wikiFuzz::chooseInput( array("", wikiFuzz::makeFuzz(2)) ),
- 'type' => wikiFuzz::chooseInput( array("signup", "login", "", wikiFuzz::makeFuzz(2)) ),
- 'returnto' => wikiFuzz::makeFuzz(2),
- 'action' => wikiFuzz::chooseInput( array("", "submitlogin", wikiFuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ 'wpRetype' => wikiFuzz::makeFuzz( 2 ),
+ 'wpRemember' => wikiFuzz::makeFuzz( 2 ),
+ 'wpRealName' => wikiFuzz::makeFuzz( 2 ),
+ 'wpPassword' => wikiFuzz::makeFuzz( 2 ),
+ 'wpName' => wikiFuzz::makeFuzz( 2 ),
+ 'wpMailmypassword' => wikiFuzz::makeFuzz( 2 ),
+ 'wpLoginattempt' => wikiFuzz::makeFuzz( 2 ),
+ 'wpEmail' => wikiFuzz::makeFuzz( 2 ),
+ 'wpDomain' => wikiFuzz::chooseInput( array( "", "local", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpCreateaccountMail' => wikiFuzz::chooseInput( array( "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpCreateaccount' => wikiFuzz::chooseInput( array( "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpCookieCheck' => wikiFuzz::chooseInput( array( "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'type' => wikiFuzz::chooseInput( array( "signup", "login", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'returnto' => wikiFuzz::makeFuzz( 2 ),
+ 'action' => wikiFuzz::chooseInput( array( "", "submitlogin", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- $this->cookie = "wikidb_session=" . wikiFuzz::chooseInput( array("1" , wikiFuzz::makeFuzz(2) ) );
- }
+ $this->cookie = "wikidb_session=" . wikiFuzz::chooseInput( array( "1" , wikiFuzz::makeFuzz( 2 ) ) );
+ }
}
@@ -1134,32 +1135,32 @@ class userLoginTest extends pageTest {
** a page test for "Special:Ipblocklist" (also includes unblocking)
*/
class ipblocklistTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Ipblocklist";
-
- $this->params = array (
- 'wpUnblockAddress'=> wikiFuzz::makeFuzz(2),
- 'ip' => wikiFuzz::chooseInput( array("20398702394", "", "Nickj2", wikiFuzz::makeFuzz(2),
- // something like an IP address, sometimes invalid:
- ( wikiFuzz::randnum(300,-20) . "." . wikiFuzz::randnum(300,-20) . "."
- . wikiFuzz::randnum(300,-20) . "." .wikiFuzz::randnum(300,-20) ) ) ),
- 'id' => wikiFuzz::makeFuzz(2),
- 'wpUnblockReason' => wikiFuzz::makeFuzz(2),
- 'action' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "success", "submit", "unblock") ),
- 'wpEditToken' => wikiFuzz::makeFuzz(2),
- 'wpBlock' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "") ),
- 'limit' => wikiFuzz::chooseInput( array("0", "-1", "--------'-----0", "+1",
- "09700982312351132098234", wikiFuzz::makeFuzz(2)) ),
- 'offset' => wikiFuzz::chooseInput( array("0", "-1", "------'-------0", "+1",
- "09700980982341535324234234", wikiFuzz::makeFuzz(2)) )
- );
-
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(4) == 0) unset($this->params["action"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["ip"]);
- if (wikiFuzz::randnum(2) == 0) unset($this->params["id"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["wpUnblockAddress"]);
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Ipblocklist";
+
+ $this->params = array (
+ 'wpUnblockAddress' => wikiFuzz::makeFuzz( 2 ),
+ 'ip' => wikiFuzz::chooseInput( array( "20398702394", "", "Nickj2", wikiFuzz::makeFuzz( 2 ),
+ // something like an IP address, sometimes invalid:
+ ( wikiFuzz::randnum( 300, -20 ) . "." . wikiFuzz::randnum( 300, -20 ) . "."
+ . wikiFuzz::randnum( 300, -20 ) . "." . wikiFuzz::randnum( 300, -20 ) ) ) ),
+ 'id' => wikiFuzz::makeFuzz( 2 ),
+ 'wpUnblockReason' => wikiFuzz::makeFuzz( 2 ),
+ 'action' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ), "success", "submit", "unblock" ) ),
+ 'wpEditToken' => wikiFuzz::makeFuzz( 2 ),
+ 'wpBlock' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ), "" ) ),
+ 'limit' => wikiFuzz::chooseInput( array( "0", "-1", "--------'-----0", "+1",
+ "09700982312351132098234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'offset' => wikiFuzz::chooseInput( array( "0", "-1", "------'-------0", "+1",
+ "09700980982341535324234234", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["action"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["ip"] );
+ if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["id"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpUnblockAddress"] );
+ }
}
@@ -1167,20 +1168,20 @@ class ipblocklistTest extends pageTest {
** a page test for "Special:Newimages".
*/
class newImagesTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Newimages";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Newimages";
- $this->params = array (
- 'hidebots' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "1", "", "-1") ),
- 'wpIlMatch' => wikiFuzz::makeFuzz(2),
- 'until' => wikiFuzz::makeFuzz(2),
- 'from' => wikiFuzz::makeFuzz(2)
- );
+ $this->params = array (
+ 'hidebots' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ), "1", "", "-1" ) ),
+ 'wpIlMatch' => wikiFuzz::makeFuzz( 2 ),
+ 'until' => wikiFuzz::makeFuzz( 2 ),
+ 'from' => wikiFuzz::makeFuzz( 2 )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["until"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["from"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["until"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["from"] );
+ }
}
@@ -1188,16 +1189,16 @@ class newImagesTest extends pageTest {
** a page test for the "Special:Imagelist" page.
*/
class imagelistTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Imagelist";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Imagelist";
- $this->params = array (
- 'sort' => wikiFuzz::chooseInput( array("bysize", "byname" , "bydate", wikiFuzz::makeFuzz(2)) ),
- 'limit' => wikiFuzz::chooseInput( array("0", "-1", "--------'-----0", "+1", "09700982312351132098234", wikiFuzz::makeFuzz(2)) ),
- 'offset' => wikiFuzz::chooseInput( array("0", "-1", "------'-------0", "+1", "09700980982341535324234234", wikiFuzz::makeFuzz(2)) ),
- 'wpIlMatch' => wikiFuzz::makeFuzz(2)
- );
- }
+ $this->params = array (
+ 'sort' => wikiFuzz::chooseInput( array( "bysize", "byname" , "bydate", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'limit' => wikiFuzz::chooseInput( array( "0", "-1", "--------'-----0", "+1", "09700982312351132098234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'offset' => wikiFuzz::chooseInput( array( "0", "-1", "------'-------0", "+1", "09700980982341535324234234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpIlMatch' => wikiFuzz::makeFuzz( 2 )
+ );
+ }
}
@@ -1205,27 +1206,27 @@ class imagelistTest extends pageTest {
** a page test for "Special:Export".
*/
class specialExportTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Export";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Export";
- $this->params = array (
- 'action' => wikiFuzz::chooseInput( array("submit", "", wikiFuzz::makeFuzz(2)) ),
- 'pages' => wikiFuzz::makeFuzz(2),
- 'curonly' => wikiFuzz::chooseInput( array("", "0", "-1", wikiFuzz::makeFuzz(2)) ),
- 'listauthors' => wikiFuzz::chooseInput( array("", "0", "-1", wikiFuzz::makeFuzz(2)) ),
- 'history' => wikiFuzz::chooseInput( array("0", "-1", "------'-------0", "+1", "09700980982341535324234234", wikiFuzz::makeFuzz(2)) ),
+ $this->params = array (
+ 'action' => wikiFuzz::chooseInput( array( "submit", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'pages' => wikiFuzz::makeFuzz( 2 ),
+ 'curonly' => wikiFuzz::chooseInput( array( "", "0", "-1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'listauthors' => wikiFuzz::chooseInput( array( "", "0", "-1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'history' => wikiFuzz::chooseInput( array( "0", "-1", "------'-------0", "+1", "09700980982341535324234234", wikiFuzz::makeFuzz( 2 ) ) ),
- );
+ );
- // For the time being, need to disable "submit" action as Tidy barfs on MediaWiki's XML export.
- if ($this->params['action'] == 'submit') $this->params['action'] = '';
+ // For the time being, need to disable "submit" action as Tidy barfs on MediaWiki's XML export.
+ if ( $this->params['action'] == 'submit' ) $this->params['action'] = '';
- // Sometimes remove the history field.
- if (wikiFuzz::randnum(2) == 0) unset($this->params["history"]);
-
- // page does not produce HTML.
- $this->tidyValidate = false;
- }
+ // Sometimes remove the history field.
+ if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["history"] );
+
+ // page does not produce HTML.
+ $this->tidyValidate = false;
+ }
}
@@ -1233,15 +1234,15 @@ class specialExportTest extends pageTest {
** a page test for "Special:Booksources".
*/
class specialBooksourcesTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Booksources";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Booksources";
- $this->params = array (
- 'go' => wikiFuzz::makeFuzz(2),
- // ISBN codes have to contain some semi-numeric stuff or will be ignored:
- 'isbn' => "0X0" . wikiFuzz::makeFuzz(2)
- );
- }
+ $this->params = array (
+ 'go' => wikiFuzz::makeFuzz( 2 ),
+ // ISBN codes have to contain some semi-numeric stuff or will be ignored:
+ 'isbn' => "0X0" . wikiFuzz::makeFuzz( 2 )
+ );
+ }
}
@@ -1249,15 +1250,15 @@ class specialBooksourcesTest extends pageTest {
** a page test for "Special:Allpages".
*/
class specialAllpagesTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special%3AAllpages";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special%3AAllpages";
- $this->params = array (
- 'from' => wikiFuzz::makeFuzz(2),
- 'namespace' => wikiFuzz::chooseInput( range(-1, 15) ),
- 'go' => wikiFuzz::makeFuzz(2)
- );
- }
+ $this->params = array (
+ 'from' => wikiFuzz::makeFuzz( 2 ),
+ 'namespace' => wikiFuzz::chooseInput( range( -1, 15 ) ),
+ 'go' => wikiFuzz::makeFuzz( 2 )
+ );
+ }
}
@@ -1265,19 +1266,19 @@ class specialAllpagesTest extends pageTest {
** a page test for the page History.
*/
class pageHistoryTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Main_Page&action=history";
+ function __construct() {
+ $this->pagePath = "index.php?title=Main_Page&action=history";
- $this->params = array (
- 'limit' => wikiFuzz::chooseInput( array("-1", "0", "-------'------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- 'offset' => wikiFuzz::chooseInput( array("-1", "0", "------'-------0", "+1", "9823412312312412435", wikiFuzz::makeFuzz(2)) ),
- "go" => wikiFuzz::chooseInput( array("first", "last", wikiFuzz::makeFuzz(2)) ),
- "dir" => wikiFuzz::chooseInput( array("prev", "next", wikiFuzz::makeFuzz(2)) ),
- "diff" => wikiFuzz::chooseInput( array("-1", "--------'-----0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "oldid" => wikiFuzz::chooseInput( array("prev", "-1", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- "feed" => wikiFuzz::makeFuzz(2)
- );
- }
+ $this->params = array (
+ 'limit' => wikiFuzz::chooseInput( array( "-1", "0", "-------'------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'offset' => wikiFuzz::chooseInput( array( "-1", "0", "------'-------0", "+1", "9823412312312412435", wikiFuzz::makeFuzz( 2 ) ) ),
+ "go" => wikiFuzz::chooseInput( array( "first", "last", wikiFuzz::makeFuzz( 2 ) ) ),
+ "dir" => wikiFuzz::chooseInput( array( "prev", "next", wikiFuzz::makeFuzz( 2 ) ) ),
+ "diff" => wikiFuzz::chooseInput( array( "-1", "--------'-----0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "oldid" => wikiFuzz::chooseInput( array( "prev", "-1", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ "feed" => wikiFuzz::makeFuzz( 2 )
+ );
+ }
}
@@ -1285,17 +1286,17 @@ class pageHistoryTest extends pageTest {
** a page test for the Special:Contributions".
*/
class contributionsTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Contributions/" . USER_ON_WIKI;
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Contributions/" . USER_ON_WIKI;
- $this->params = array (
- 'target' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "newbies", USER_ON_WIKI) ),
- 'namespace' => wikiFuzz::chooseInput( array(-1, 15, 1, wikiFuzz::makeFuzz(2)) ),
- 'offset' => wikiFuzz::chooseInput( array("0", "-1", "------'-------0", "+1", "982342131232131231241", wikiFuzz::makeFuzz(2)) ),
- 'bot' => wikiFuzz::chooseInput( array("", "-1", "0", "1", wikiFuzz::makeFuzz(2)) ),
- 'go' => wikiFuzz::chooseInput( array("-1", 'prev', 'next', wikiFuzz::makeFuzz(2)) )
- );
- }
+ $this->params = array (
+ 'target' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ), "newbies", USER_ON_WIKI ) ),
+ 'namespace' => wikiFuzz::chooseInput( array( -1, 15, 1, wikiFuzz::makeFuzz( 2 ) ) ),
+ 'offset' => wikiFuzz::chooseInput( array( "0", "-1", "------'-------0", "+1", "982342131232131231241", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'bot' => wikiFuzz::chooseInput( array( "", "-1", "0", "1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'go' => wikiFuzz::chooseInput( array( "-1", 'prev', 'next', wikiFuzz::makeFuzz( 2 ) ) )
+ );
+ }
}
@@ -1303,66 +1304,66 @@ class contributionsTest extends pageTest {
** a page test for viewing a normal page, whilst posting various params.
*/
class viewPageTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Main_Page";
-
- $this->params = array (
- "useskin" => wikiFuzz::chooseInput( array("chick", "cologneblue", "myskin",
- "nostalgia", "simple", "standard", wikiFuzz::makeFuzz(2)) ),
- "uselang" => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz(2),
- "ab", "af", "an", "ar", "arc", "as", "ast", "av", "ay", "az", "ba",
- "bat-smg", "be", "bg", "bm", "bn", "bo", "bpy", "br", "bs", "ca",
- "ce", "cs", "csb", "cv", "cy", "da", "de", "dv", "dz", "el", "en",
- "eo", "es", "et", "eu", "fa", "fi", "fo", "fr", "fur", "fy", "ga",
- "gn", "gsw", "gu", "he", "hi", "hr", "hu", "ia", "id", "ii", "is",
- "it", "ja", "jv", "ka", "km", "kn", "ko", "ks", "ku", "kv", "la",
- "li", "lo", "lt", "lv", "mk", "ml", "ms", "nah", "nap", "nds",
- "nds-nl", "nl", "nn", "no", "non", "nv", "oc", "or", "os", "pa",
- "pl", "pms", "ps", "pt", "pt-br", "qu", "rmy", "ro", "ru", "sc",
- "sd", "sk", "sl", "sq", "sr", "sr-ec", "sr-el",
- "su", "sv", "ta", "te", "th", "tr", "tt", "ty", "tyv", "udm",
- "ug", "uk", "ur", "utf8", "vec", "vi", "wa", "xal", "yi", "za",
- "zh", "zh-cn", "zh-hk", "zh-sg", "zh-tw", "zh-tw") ),
- "returnto" => wikiFuzz::makeFuzz(2),
- "feed" => wikiFuzz::chooseInput( array("atom", "rss", wikiFuzz::makeFuzz(2)) ),
- "rcid" => wikiFuzz::makeFuzz(2),
- "action" => wikiFuzz::chooseInput( array("view", "raw", "render", wikiFuzz::makeFuzz(2), "markpatrolled") ),
- "printable" => wikiFuzz::makeFuzz(2),
- "oldid" => wikiFuzz::makeFuzz(2),
- "redirect" => wikiFuzz::makeFuzz(2),
- "diff" => wikiFuzz::makeFuzz(2),
- "search" => wikiFuzz::makeFuzz(2),
- "rdfrom" => wikiFuzz::makeFuzz(2), // things from Article.php from here on:
- "token" => wikiFuzz::makeFuzz(2),
- "tbid" => wikiFuzz::makeFuzz(2),
- "action" => wikiFuzz::chooseInput( array("purge", wikiFuzz::makeFuzz(2)) ),
- "wpReason" => wikiFuzz::makeFuzz(2),
- "wpEditToken" => wikiFuzz::makeFuzz(2),
- "from" => wikiFuzz::makeFuzz(2),
- "bot" => wikiFuzz::makeFuzz(2),
- "summary" => wikiFuzz::makeFuzz(2),
- "direction" => wikiFuzz::chooseInput( array("next", "prev", wikiFuzz::makeFuzz(2)) ),
- "section" => wikiFuzz::makeFuzz(2),
- "preload" => wikiFuzz::makeFuzz(2),
-
- );
-
- // Tidy does not know how to valid atom or rss, so exclude from testing for the time being.
- if ($this->params["feed"] == "atom") { unset($this->params["feed"]); }
- else if ($this->params["feed"] == "rss") { unset($this->params["feed"]); }
-
- // Raw pages cannot really be validated
- if ($this->params["action"] == "raw") unset($this->params["action"]);
-
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["rcid"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["diff"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["rdfrom"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["oldid"]);
-
- // usually don't want action == purge.
- if (wikiFuzz::randnum(6) > 1) unset($this->params["action"]);
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Main_Page";
+
+ $this->params = array (
+ "useskin" => wikiFuzz::chooseInput( array( "chick", "cologneblue", "myskin",
+ "nostalgia", "simple", "standard", wikiFuzz::makeFuzz( 2 ) ) ),
+ "uselang" => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ),
+ "ab", "af", "an", "ar", "arc", "as", "ast", "av", "ay", "az", "ba",
+ "bat-smg", "be", "bg", "bm", "bn", "bo", "bpy", "br", "bs", "ca",
+ "ce", "cs", "csb", "cv", "cy", "da", "de", "dv", "dz", "el", "en",
+ "eo", "es", "et", "eu", "fa", "fi", "fo", "fr", "fur", "fy", "ga",
+ "gn", "gsw", "gu", "he", "hi", "hr", "hu", "ia", "id", "ii", "is",
+ "it", "ja", "jv", "ka", "km", "kn", "ko", "ks", "ku", "kv", "la",
+ "li", "lo", "lt", "lv", "mk", "ml", "ms", "nah", "nap", "nds",
+ "nds-nl", "nl", "nn", "no", "non", "nv", "oc", "or", "os", "pa",
+ "pl", "pms", "ps", "pt", "pt-br", "qu", "rmy", "ro", "ru", "sc",
+ "sd", "sk", "sl", "sq", "sr", "sr-ec", "sr-el",
+ "su", "sv", "ta", "te", "th", "tr", "tt", "ty", "tyv", "udm",
+ "ug", "uk", "ur", "utf8", "vec", "vi", "wa", "xal", "yi", "za",
+ "zh", "zh-cn", "zh-hk", "zh-sg", "zh-tw", "zh-tw" ) ),
+ "returnto" => wikiFuzz::makeFuzz( 2 ),
+ "feed" => wikiFuzz::chooseInput( array( "atom", "rss", wikiFuzz::makeFuzz( 2 ) ) ),
+ "rcid" => wikiFuzz::makeFuzz( 2 ),
+ "action" => wikiFuzz::chooseInput( array( "view", "raw", "render", wikiFuzz::makeFuzz( 2 ), "markpatrolled" ) ),
+ "printable" => wikiFuzz::makeFuzz( 2 ),
+ "oldid" => wikiFuzz::makeFuzz( 2 ),
+ "redirect" => wikiFuzz::makeFuzz( 2 ),
+ "diff" => wikiFuzz::makeFuzz( 2 ),
+ "search" => wikiFuzz::makeFuzz( 2 ),
+ "rdfrom" => wikiFuzz::makeFuzz( 2 ), // things from Article.php from here on:
+ "token" => wikiFuzz::makeFuzz( 2 ),
+ "tbid" => wikiFuzz::makeFuzz( 2 ),
+ "action" => wikiFuzz::chooseInput( array( "purge", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpReason" => wikiFuzz::makeFuzz( 2 ),
+ "wpEditToken" => wikiFuzz::makeFuzz( 2 ),
+ "from" => wikiFuzz::makeFuzz( 2 ),
+ "bot" => wikiFuzz::makeFuzz( 2 ),
+ "summary" => wikiFuzz::makeFuzz( 2 ),
+ "direction" => wikiFuzz::chooseInput( array( "next", "prev", wikiFuzz::makeFuzz( 2 ) ) ),
+ "section" => wikiFuzz::makeFuzz( 2 ),
+ "preload" => wikiFuzz::makeFuzz( 2 ),
+
+ );
+
+ // Tidy does not know how to valid atom or rss, so exclude from testing for the time being.
+ if ( $this->params["feed"] == "atom" ) { unset( $this->params["feed"] ); }
+ else if ( $this->params["feed"] == "rss" ) { unset( $this->params["feed"] ); }
+
+ // Raw pages cannot really be validated
+ if ( $this->params["action"] == "raw" ) unset( $this->params["action"] );
+
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["rcid"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["diff"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["rdfrom"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["oldid"] );
+
+ // usually don't want action == purge.
+ if ( wikiFuzz::randnum( 6 ) > 1 ) unset( $this->params["action"] );
+ }
}
@@ -1370,50 +1371,50 @@ class viewPageTest extends pageTest {
** a page test for "Special:Allmessages".
*/
class specialAllmessagesTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Allmessages";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Allmessages";
- // only really has one parameter
- $this->params = array (
- "ot" => wikiFuzz::chooseInput( array("php", "html", wikiFuzz::makeFuzz(2)) )
- );
- }
+ // only really has one parameter
+ $this->params = array (
+ "ot" => wikiFuzz::chooseInput( array( "php", "html", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+ }
}
/**
** a page test for "Special:Newpages".
*/
class specialNewpages extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Newpages";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Newpages";
- $this->params = array (
- "namespace" => wikiFuzz::chooseInput( range(-1, 15) ),
- "feed" => wikiFuzz::chooseInput( array("atom", "rss", wikiFuzz::makeFuzz(2)) ),
- 'limit' => wikiFuzz::chooseInput( array("-1", "0", "-------'------0", "+1", "8134", wikiFuzz::makeFuzz(2)) ),
- 'offset' => wikiFuzz::chooseInput( array("-1", "0", "------'-------0", "+1", "9823412312312412435", wikiFuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ "namespace" => wikiFuzz::chooseInput( range( -1, 15 ) ),
+ "feed" => wikiFuzz::chooseInput( array( "atom", "rss", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'limit' => wikiFuzz::chooseInput( array( "-1", "0", "-------'------0", "+1", "8134", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'offset' => wikiFuzz::chooseInput( array( "-1", "0", "------'-------0", "+1", "9823412312312412435", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- // Tidy does not know how to valid atom or rss, so exclude from testing for the time being.
- if ($this->params["feed"] == "atom") { unset($this->params["feed"]); }
- else if ($this->params["feed"] == "rss") { unset($this->params["feed"]); }
- }
+ // Tidy does not know how to valid atom or rss, so exclude from testing for the time being.
+ if ( $this->params["feed"] == "atom" ) { unset( $this->params["feed"] ); }
+ else if ( $this->params["feed"] == "rss" ) { unset( $this->params["feed"] ); }
+ }
}
/**
** a page test for "redirect.php"
*/
class redirectTest extends pageTest {
- function __construct() {
- $this->pagePath = "redirect.php";
+ function __construct() {
+ $this->pagePath = "redirect.php";
- $this->params = array (
- "wpDropdown" => wikiFuzz::makeFuzz(2)
- );
+ $this->params = array (
+ "wpDropdown" => wikiFuzz::makeFuzz( 2 )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpDropdown"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpDropdown"] );
+ }
}
@@ -1421,14 +1422,14 @@ class redirectTest extends pageTest {
** a page test for "Special:Confirmemail"
*/
class confirmEmail extends pageTest {
- function __construct() {
- // sometimes we send a bogus confirmation code, and sometimes we don't.
- $this->pagePath = "index.php?title=Special:Confirmemail" . wikiFuzz::chooseInput( array("", "/" . wikiFuzz::makeTitleSafe(wikiFuzz::makeFuzz(1)) ) );
+ function __construct() {
+ // sometimes we send a bogus confirmation code, and sometimes we don't.
+ $this->pagePath = "index.php?title=Special:Confirmemail" . wikiFuzz::chooseInput( array( "", "/" . wikiFuzz::makeTitleSafe( wikiFuzz::makeFuzz( 1 ) ) ) );
- $this->params = array (
- "token" => wikiFuzz::makeFuzz(2)
- );
- }
+ $this->params = array (
+ "token" => wikiFuzz::makeFuzz( 2 )
+ );
+ }
}
@@ -1437,24 +1438,24 @@ class confirmEmail extends pageTest {
** Note: this test would be better if we were logged in.
*/
class watchlistTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Watchlist";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Watchlist";
- $this->params = array (
- "remove" => wikiFuzz::chooseInput( array("Remove checked items from watchlist", wikiFuzz::makeFuzz(2))),
- 'days' => wikiFuzz::chooseInput( array(0, -1, -230, "--", 3, 9, wikiFuzz::makeFuzz(2)) ),
- 'hideOwn' => wikiFuzz::chooseInput( array("", "0", "1", wikiFuzz::makeFuzz(2)) ),
- 'hideBots' => wikiFuzz::chooseInput( array("", "0", "1", wikiFuzz::makeFuzz(2)) ),
- 'namespace'=> wikiFuzz::chooseInput( array("", "0", "1", wikiFuzz::makeFuzz(2)) ),
- 'action' => wikiFuzz::chooseInput( array("submit", "clear", wikiFuzz::makeFuzz(2)) ),
- 'id[]' => wikiFuzz::makeFuzz(2),
- 'edit' => wikiFuzz::makeFuzz(2),
- 'token' => wikiFuzz::chooseInput( array("", "1243213", wikiFuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ "remove" => wikiFuzz::chooseInput( array( "Remove checked items from watchlist", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'days' => wikiFuzz::chooseInput( array( 0, -1, -230, "--", 3, 9, wikiFuzz::makeFuzz( 2 ) ) ),
+ 'hideOwn' => wikiFuzz::chooseInput( array( "", "0", "1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'hideBots' => wikiFuzz::chooseInput( array( "", "0", "1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'namespace' => wikiFuzz::chooseInput( array( "", "0", "1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'action' => wikiFuzz::chooseInput( array( "submit", "clear", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'id[]' => wikiFuzz::makeFuzz( 2 ),
+ 'edit' => wikiFuzz::makeFuzz( 2 ),
+ 'token' => wikiFuzz::chooseInput( array( "", "1243213", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- // sometimes we specifiy "reset", and sometimes we don't.
- if (wikiFuzz::randnum(3) == 0) $this->params["reset"] = wikiFuzz::chooseInput( array("", "0", "1", wikiFuzz::makeFuzz(2)) );
- }
+ // sometimes we specifiy "reset", and sometimes we don't.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) $this->params["reset"] = wikiFuzz::chooseInput( array( "", "0", "1", wikiFuzz::makeFuzz( 2 ) ) );
+ }
}
@@ -1462,16 +1463,16 @@ class watchlistTest extends pageTest {
** a page test for "Special:Blockme"
*/
class specialBlockmeTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Blockme";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Blockme";
- $this->params = array ( );
+ $this->params = array ( );
- // sometimes we specify "ip", and sometimes we don't.
- if (wikiFuzz::randnum(1) == 0) {
- $this->params["ip"] = wikiFuzz::chooseInput( array("10.12.41.213", wikiFuzz::randnum(-10,8134), wikiFuzz::makeFuzz(2)) );
- }
- }
+ // sometimes we specify "ip", and sometimes we don't.
+ if ( wikiFuzz::randnum( 1 ) == 0 ) {
+ $this->params["ip"] = wikiFuzz::chooseInput( array( "10.12.41.213", wikiFuzz::randnum( -10, 8134 ), wikiFuzz::makeFuzz( 2 ) ) );
+ }
+ }
}
@@ -1479,32 +1480,32 @@ class specialBlockmeTest extends pageTest {
** a page test for "Special:Movepage"
*/
class specialMovePage extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Movepage";
-
- $this->params = array (
- "action" => wikiFuzz::chooseInput( array("success", "submit", "", wikiFuzz::makeFuzz(2)) ),
- 'wpEditToken' => wikiFuzz::chooseInput( array('', 0, 34987987, wikiFuzz::makeFuzz(2)) ),
- 'target' => wikiFuzz::chooseInput( array("x", wikiFuzz::makeTitleSafe(wikiFuzz::makeFuzz(2)) ) ),
- 'wpOldTitle' => wikiFuzz::chooseInput( array("z", wikiFuzz::makeTitleSafe(wikiFuzz::makeFuzz(2)), wikiFuzz::makeFuzz(2) ) ),
- 'wpNewTitle' => wikiFuzz::chooseInput( array("y", wikiFuzz::makeTitleSafe(wikiFuzz::makeFuzz(2)), wikiFuzz::makeFuzz(2) ) ),
- 'wpReason' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2)) ),
- 'wpMovetalk' => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- 'wpDeleteAndMove' => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- 'wpConfirm' => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- 'talkmoved' => wikiFuzz::chooseInput( array("1", wikiFuzz::makeFuzz(2), "articleexists", 'notalkpage') ),
- 'oldtitle' => wikiFuzz::makeFuzz(2),
- 'newtitle' => wikiFuzz::makeFuzz(2),
- 'wpMovetalk' => wikiFuzz::chooseInput( array("1", "0", wikiFuzz::makeFuzz(2)) )
- );
-
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(2) == 0) unset($this->params["wpEditToken"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["target"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["wpNewTitle"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpReason"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpOldTitle"]);
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Movepage";
+
+ $this->params = array (
+ "action" => wikiFuzz::chooseInput( array( "success", "submit", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpEditToken' => wikiFuzz::chooseInput( array( '', 0, 34987987, wikiFuzz::makeFuzz( 2 ) ) ),
+ 'target' => wikiFuzz::chooseInput( array( "x", wikiFuzz::makeTitleSafe( wikiFuzz::makeFuzz( 2 ) ) ) ),
+ 'wpOldTitle' => wikiFuzz::chooseInput( array( "z", wikiFuzz::makeTitleSafe( wikiFuzz::makeFuzz( 2 ) ), wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpNewTitle' => wikiFuzz::chooseInput( array( "y", wikiFuzz::makeTitleSafe( wikiFuzz::makeFuzz( 2 ) ), wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpReason' => wikiFuzz::chooseInput( array( wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpMovetalk' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpDeleteAndMove' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpConfirm' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'talkmoved' => wikiFuzz::chooseInput( array( "1", wikiFuzz::makeFuzz( 2 ), "articleexists", 'notalkpage' ) ),
+ 'oldtitle' => wikiFuzz::makeFuzz( 2 ),
+ 'newtitle' => wikiFuzz::makeFuzz( 2 ),
+ 'wpMovetalk' => wikiFuzz::chooseInput( array( "1", "0", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["wpEditToken"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["target"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpNewTitle"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpReason"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpOldTitle"] );
+ }
}
@@ -1512,26 +1513,26 @@ class specialMovePage extends pageTest {
** a page test for "Special:Undelete"
*/
class specialUndelete extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Undelete";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Undelete";
- $this->params = array (
- "action" => wikiFuzz::chooseInput( array("submit", "", wikiFuzz::makeFuzz(2)) ),
- 'wpEditToken' => wikiFuzz::chooseInput( array('', 0, 34987987, wikiFuzz::makeFuzz(2)) ),
- 'target' => wikiFuzz::chooseInput( array("x", wikiFuzz::makeTitleSafe(wikiFuzz::makeFuzz(2)) ) ),
- 'timestamp' => wikiFuzz::chooseInput( array("125223", wikiFuzz::makeFuzz(2) ) ),
- 'file' => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- 'restore' => wikiFuzz::chooseInput( array("0", "1", wikiFuzz::makeFuzz(2)) ),
- 'preview' => wikiFuzz::chooseInput( array("0", "1", wikiFuzz::makeFuzz(2)) ),
- 'wpComment' => wikiFuzz::makeFuzz(2)
- );
+ $this->params = array (
+ "action" => wikiFuzz::chooseInput( array( "submit", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpEditToken' => wikiFuzz::chooseInput( array( '', 0, 34987987, wikiFuzz::makeFuzz( 2 ) ) ),
+ 'target' => wikiFuzz::chooseInput( array( "x", wikiFuzz::makeTitleSafe( wikiFuzz::makeFuzz( 2 ) ) ) ),
+ 'timestamp' => wikiFuzz::chooseInput( array( "125223", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'file' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'restore' => wikiFuzz::chooseInput( array( "0", "1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'preview' => wikiFuzz::chooseInput( array( "0", "1", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpComment' => wikiFuzz::makeFuzz( 2 )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(2) == 0) unset($this->params["wpEditToken"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["target"]);
- if (wikiFuzz::randnum(1) == 0) unset($this->params["restore"]);
- if (wikiFuzz::randnum(1) == 0) unset($this->params["preview"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["wpEditToken"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["target"] );
+ if ( wikiFuzz::randnum( 1 ) == 0 ) unset( $this->params["restore"] );
+ if ( wikiFuzz::randnum( 1 ) == 0 ) unset( $this->params["preview"] );
+ }
}
@@ -1539,20 +1540,20 @@ class specialUndelete extends pageTest {
** a page test for "Special:Unlockdb"
*/
class specialUnlockdb extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Unlockdb";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Unlockdb";
- $this->params = array (
- "action" => wikiFuzz::chooseInput( array("submit", "success", "", wikiFuzz::makeFuzz(2)) ),
- 'wpEditToken' => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- 'wpLockConfirm' => wikiFuzz::chooseInput( array("0", "1", wikiFuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ "action" => wikiFuzz::chooseInput( array( "submit", "success", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpEditToken' => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpLockConfirm' => wikiFuzz::chooseInput( array( "0", "1", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpEditToken"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["action"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpLockConfirm"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpEditToken"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["action"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpLockConfirm"] );
+ }
}
@@ -1560,21 +1561,21 @@ class specialUnlockdb extends pageTest {
** a page test for "Special:Lockdb"
*/
class specialLockdb extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Lockdb";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Lockdb";
- $this->params = array (
- "action" => wikiFuzz::chooseInput( array("submit", "success", "", wikiFuzz::makeFuzz(2)) ),
- 'wpEditToken' => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- 'wpLockReason' => wikiFuzz::makeFuzz(2),
- 'wpLockConfirm'=> wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ "action" => wikiFuzz::chooseInput( array( "submit", "success", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpEditToken' => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpLockReason' => wikiFuzz::makeFuzz( 2 ),
+ 'wpLockConfirm' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpEditToken"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["action"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpLockConfirm"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpEditToken"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["action"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpLockConfirm"] );
+ }
}
@@ -1582,22 +1583,22 @@ class specialLockdb extends pageTest {
** a page test for "Special:Userrights"
*/
class specialUserrights extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Userrights";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Userrights";
- $this->params = array (
- 'wpEditToken' => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- 'user-editname' => wikiFuzz::chooseInput( array("Nickj2", "Nickj2\n<xyz>", wikiFuzz::makeFuzz(2)) ),
- 'ssearchuser' => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- 'saveusergroups'=> wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)), "Save User Groups"),
- 'member[]' => wikiFuzz::chooseInput( array("0", "bot", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "available[]" => wikiFuzz::chooseInput( array("0", "sysop", "bureaucrat", "1", "++--34234", wikiFuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ 'wpEditToken' => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'user-editname' => wikiFuzz::chooseInput( array( "Nickj2", "Nickj2\n<xyz>", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'ssearchuser' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'saveusergroups' => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ), "Save User Groups" ),
+ 'member[]' => wikiFuzz::chooseInput( array( "0", "bot", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "available[]" => wikiFuzz::chooseInput( array( "0", "sysop", "bureaucrat", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(3) == 0) unset($this->params['ssearchuser']);
- if (wikiFuzz::randnum(3) == 0) unset($this->params['saveusergroups']);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params['ssearchuser'] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params['saveusergroups'] );
+ }
}
@@ -1605,23 +1606,23 @@ class specialUserrights extends pageTest {
** a test for page protection and unprotection.
*/
class pageProtectionForm extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Main_Page";
+ function __construct() {
+ $this->pagePath = "index.php?title=Main_Page";
- $this->params = array (
- "action" => "protect",
- 'wpEditToken' => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- "mwProtect-level-edit" => wikiFuzz::chooseInput( array('', 'autoconfirmed', 'sysop', wikifuzz::makeFuzz(2)) ),
- "mwProtect-level-move" => wikiFuzz::chooseInput( array('', 'autoconfirmed', 'sysop', wikifuzz::makeFuzz(2)) ),
- "mwProtectUnchained" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- 'mwProtect-reason' => wikiFuzz::chooseInput( array("because it was there", wikifuzz::makeFuzz(2)) )
- );
+ $this->params = array (
+ "action" => "protect",
+ 'wpEditToken' => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ "mwProtect-level-edit" => wikiFuzz::chooseInput( array( '', 'autoconfirmed', 'sysop', wikiFuzz::makeFuzz( 2 ) ) ),
+ "mwProtect-level-move" => wikiFuzz::chooseInput( array( '', 'autoconfirmed', 'sysop', wikiFuzz::makeFuzz( 2 ) ) ),
+ "mwProtectUnchained" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'mwProtect-reason' => wikiFuzz::chooseInput( array( "because it was there", wikiFuzz::makeFuzz( 2 ) ) )
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(3) == 0) unset($this->params["mwProtectUnchained"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params['mwProtect-reason']);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["mwProtectUnchained"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params['mwProtect-reason'] );
+ }
}
@@ -1629,38 +1630,38 @@ class pageProtectionForm extends pageTest {
** a page test for "Special:Blockip".
*/
class specialBlockip extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Blockip";
-
- $this->params = array (
- "action" => wikiFuzz::chooseInput( array("submit", "", wikiFuzz::makeFuzz(2)) ),
- 'wpEditToken' => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- "wpBlockAddress" => wikiFuzz::chooseInput( array("20398702394", "", "Nickj2", wikiFuzz::makeFuzz(2),
- // something like an IP address, sometimes invalid:
- ( wikiFuzz::randnum(300,-20) . "." . wikiFuzz::randnum(300,-20) . "."
- . wikiFuzz::randnum(300,-20) . "." .wikiFuzz::randnum(300,-20) ) ) ),
- "ip" => wikiFuzz::chooseInput( array("20398702394", "", "Nickj2", wikiFuzz::makeFuzz(2),
- // something like an IP address, sometimes invalid:
- ( wikiFuzz::randnum(300,-20) . "." . wikiFuzz::randnum(300,-20) . "."
- . wikiFuzz::randnum(300,-20) . "." .wikiFuzz::randnum(300,-20) ) ) ),
- "wpBlockOther" => wikiFuzz::chooseInput( array('', 'Nickj2', wikifuzz::makeFuzz(2)) ),
- "wpBlockExpiry" => wikiFuzz::chooseInput( array("other", "2 hours", "1 day", "3 days", "1 week", "2 weeks",
- "1 month", "3 months", "6 months", "1 year", "infinite", wikiFuzz::makeFuzz(2)) ),
- "wpBlockReason" => wikiFuzz::chooseInput( array("because it was there", wikifuzz::makeFuzz(2)) ),
- "wpAnonOnly" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "wpCreateAccount" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "wpBlock" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) )
- );
-
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpBlockOther"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpBlockExpiry"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpBlockReason"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpAnonOnly"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpCreateAccount"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["wpBlockAddress"]);
- if (wikiFuzz::randnum(4) == 0) unset($this->params["ip"]);
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Blockip";
+
+ $this->params = array (
+ "action" => wikiFuzz::chooseInput( array( "submit", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ 'wpEditToken' => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpBlockAddress" => wikiFuzz::chooseInput( array( "20398702394", "", "Nickj2", wikiFuzz::makeFuzz( 2 ),
+ // something like an IP address, sometimes invalid:
+ ( wikiFuzz::randnum( 300, -20 ) . "." . wikiFuzz::randnum( 300, -20 ) . "."
+ . wikiFuzz::randnum( 300, -20 ) . "." . wikiFuzz::randnum( 300, -20 ) ) ) ),
+ "ip" => wikiFuzz::chooseInput( array( "20398702394", "", "Nickj2", wikiFuzz::makeFuzz( 2 ),
+ // something like an IP address, sometimes invalid:
+ ( wikiFuzz::randnum( 300, -20 ) . "." . wikiFuzz::randnum( 300, -20 ) . "."
+ . wikiFuzz::randnum( 300, -20 ) . "." . wikiFuzz::randnum( 300, -20 ) ) ) ),
+ "wpBlockOther" => wikiFuzz::chooseInput( array( '', 'Nickj2', wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpBlockExpiry" => wikiFuzz::chooseInput( array( "other", "2 hours", "1 day", "3 days", "1 week", "2 weeks",
+ "1 month", "3 months", "6 months", "1 year", "infinite", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpBlockReason" => wikiFuzz::chooseInput( array( "because it was there", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpAnonOnly" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpCreateAccount" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpBlock" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) )
+ );
+
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpBlockOther"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpBlockExpiry"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpBlockReason"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpAnonOnly"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpCreateAccount"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["wpBlockAddress"] );
+ if ( wikiFuzz::randnum( 4 ) == 0 ) unset( $this->params["ip"] );
+ }
}
@@ -1668,22 +1669,22 @@ class specialBlockip extends pageTest {
** a test for the imagepage.
*/
class imagepageTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Image:Small-email.png";
+ function __construct() {
+ $this->pagePath = "index.php?title=Image:Small-email.png";
- $this->params = array (
- "image" => wikiFuzz::chooseInput( array("Small-email.png", wikifuzz::makeFuzz(2)) ),
- "wpReason" => wikifuzz::makeFuzz(2),
- "oldimage" => wikiFuzz::chooseInput( array("Small-email.png", wikifuzz::makeFuzz(2)) ),
- "wpEditToken" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "image" => wikiFuzz::chooseInput( array( "Small-email.png", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpReason" => wikiFuzz::makeFuzz( 2 ),
+ "oldimage" => wikiFuzz::chooseInput( array( "Small-email.png", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpEditToken" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["image"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpReason"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["oldimage"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpEditToken"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["image"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpReason"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["oldimage"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpEditToken"] );
+ }
}
@@ -1691,20 +1692,20 @@ class imagepageTest extends pageTest {
** a test for page deletion form.
*/
class pageDeletion extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Main_Page&action=delete";
+ function __construct() {
+ $this->pagePath = "index.php?title=Main_Page&action=delete";
- $this->params = array (
- "wpEditToken" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- "wpReason" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "wpConfirm" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "wpEditToken" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpReason" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpConfirm" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(5) == 0) unset($this->params["wpReason"]);
- if (wikiFuzz::randnum(5) == 0) unset($this->params["wpEditToken"]);
- if (wikiFuzz::randnum(5) == 0) unset($this->params["wpConfirm"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 5 ) == 0 ) unset( $this->params["wpReason"] );
+ if ( wikiFuzz::randnum( 5 ) == 0 ) unset( $this->params["wpEditToken"] );
+ if ( wikiFuzz::randnum( 5 ) == 0 ) unset( $this->params["wpConfirm"] );
+ }
}
@@ -1713,30 +1714,30 @@ class pageDeletion extends pageTest {
** a test for Revision Deletion.
*/
class specialRevisionDelete extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Revisiondelete";
-
- $this->params = array (
- "target" => wikiFuzz::chooseInput( array("Main Page", wikifuzz::makeFuzz(2)) ),
- "oldid" => wikifuzz::makeFuzz(2),
- "oldid[]" => wikifuzz::makeFuzz(2),
- "wpReason" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "revdelete-hide-text" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "revdelete-hide-comment" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "revdelete-hide-user" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "revdelete-hide-restricted" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- );
-
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(3) == 0) unset($this->params["target"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["oldid"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["oldid[]"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["wpReason"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["revdelete-hide-text"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["revdelete-hide-comment"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["revdelete-hide-user"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["revdelete-hide-restricted"]);
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Revisiondelete";
+
+ $this->params = array (
+ "target" => wikiFuzz::chooseInput( array( "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
+ "oldid" => wikiFuzz::makeFuzz( 2 ),
+ "oldid[]" => wikiFuzz::makeFuzz( 2 ),
+ "wpReason" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "revdelete-hide-text" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "revdelete-hide-comment" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "revdelete-hide-user" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "revdelete-hide-restricted" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
+
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["target"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["oldid"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["oldid[]"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["wpReason"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["revdelete-hide-text"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["revdelete-hide-comment"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["revdelete-hide-user"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["revdelete-hide-restricted"] );
+ }
}
@@ -1744,31 +1745,31 @@ class specialRevisionDelete extends pageTest {
** a test for Special:Import.
*/
class specialImport extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Import";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Import";
- $this->params = array (
- "action" => "submit",
- "source" => wikiFuzz::chooseInput( array("upload", "interwiki", wikifuzz::makeFuzz(2)) ),
- "MAX_FILE_SIZE" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikifuzz::makeFuzz(2)) ),
- "xmlimport" => wikiFuzz::chooseInput( array("/var/www/hosts/mediawiki/wiki/AdminSettings.php", "1", "++--34234", wikiFuzz::makeFuzz(2)) ),
- "namespace" => wikiFuzz::chooseInput( array(wikiFuzz::randnum(30,-6), wikiFuzz::makeFuzz(2)) ),
- "interwiki" => wikiFuzz::makeFuzz(2),
- "interwikiHistory" => wikiFuzz::makeFuzz(2),
- "frompage" => wikiFuzz::makeFuzz(2),
- );
+ $this->params = array (
+ "action" => "submit",
+ "source" => wikiFuzz::chooseInput( array( "upload", "interwiki", wikiFuzz::makeFuzz( 2 ) ) ),
+ "MAX_FILE_SIZE" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "xmlimport" => wikiFuzz::chooseInput( array( "/var/www/hosts/mediawiki/wiki/AdminSettings.php", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "namespace" => wikiFuzz::chooseInput( array( wikiFuzz::randnum( 30, -6 ), wikiFuzz::makeFuzz( 2 ) ) ),
+ "interwiki" => wikiFuzz::makeFuzz( 2 ),
+ "interwikiHistory" => wikiFuzz::makeFuzz( 2 ),
+ "frompage" => wikiFuzz::makeFuzz( 2 ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["action"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["source"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["MAX_FILE_SIZE"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["xmlimport"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["interwiki"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["interwikiHistory"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["frompage"]);
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["action"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["source"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["MAX_FILE_SIZE"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["xmlimport"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["interwiki"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["interwikiHistory"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["frompage"] );
- // Note: Need to do a file upload to fully test this Special page.
- }
+ // Note: Need to do a file upload to fully test this Special page.
+ }
}
@@ -1776,20 +1777,20 @@ class specialImport extends pageTest {
** a test for thumb.php
*/
class thumbTest extends pageTest {
- function __construct() {
- $this->pagePath = "thumb.php";
+ function __construct() {
+ $this->pagePath = "thumb.php";
- $this->params = array (
- "f" => wikiFuzz::chooseInput( array("..", "\\", "small-email.png", wikifuzz::makeFuzz(2)) ),
- "w" => wikiFuzz::chooseInput( array("80", wikiFuzz::randnum(6000,-200), wikifuzz::makeFuzz(2)) ),
- "r" => wikiFuzz::chooseInput( array("0", wikifuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "f" => wikiFuzz::chooseInput( array( "..", "\\", "small-email.png", wikiFuzz::makeFuzz( 2 ) ) ),
+ "w" => wikiFuzz::chooseInput( array( "80", wikiFuzz::randnum( 6000, -200 ), wikiFuzz::makeFuzz( 2 ) ) ),
+ "r" => wikiFuzz::chooseInput( array( "0", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["f"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["w"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["r"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["f"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["w"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["r"] );
+ }
}
@@ -1797,24 +1798,24 @@ class thumbTest extends pageTest {
** a test for trackback.php
*/
class trackbackTest extends pageTest {
- function __construct() {
- $this->pagePath = "trackback.php";
+ function __construct() {
+ $this->pagePath = "trackback.php";
+
+ $this->params = array (
+ "url" => wikiFuzz::makeFuzz( 2 ),
+ "blog_name" => wikiFuzz::chooseInput( array( "80", wikiFuzz::randnum( 6000, -200 ), wikiFuzz::makeFuzz( 2 ) ) ),
+ "article" => wikiFuzz::chooseInput( array( "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
+ "title" => wikiFuzz::chooseInput( array( "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
+ "excerpt" => wikiFuzz::makeFuzz( 2 ),
+ );
- $this->params = array (
- "url" => wikifuzz::makeFuzz(2),
- "blog_name" => wikiFuzz::chooseInput( array("80", wikiFuzz::randnum(6000,-200), wikifuzz::makeFuzz(2)) ),
- "article" => wikiFuzz::chooseInput( array("Main Page", wikifuzz::makeFuzz(2)) ),
- "title" => wikiFuzz::chooseInput( array("Main Page", wikifuzz::makeFuzz(2)) ),
- "excerpt" => wikifuzz::makeFuzz(2),
- );
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["title"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["excerpt"] );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(3) == 0) unset($this->params["title"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["excerpt"]);
-
- // page does not produce HTML.
- $this->tidyValidate = false;
- }
+ // page does not produce HTML.
+ $this->tidyValidate = false;
+ }
}
@@ -1822,19 +1823,19 @@ class trackbackTest extends pageTest {
** a test for profileinfo.php
*/
class profileInfo extends pageTest {
- function __construct() {
- $this->pagePath = "profileinfo.php";
+ function __construct() {
+ $this->pagePath = "profileinfo.php";
- $this->params = array (
- "expand" => wikifuzz::makeFuzz(2),
- "sort" => wikiFuzz::chooseInput( array("time", "count", "name", wikifuzz::makeFuzz(2)) ),
- "filter" => wikiFuzz::chooseInput( array("Main Page", wikifuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "expand" => wikiFuzz::makeFuzz( 2 ),
+ "sort" => wikiFuzz::chooseInput( array( "time", "count", "name", wikiFuzz::makeFuzz( 2 ) ) ),
+ "filter" => wikiFuzz::chooseInput( array( "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(3) == 0) unset($this->params["sort"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["filter"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["sort"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["filter"] );
+ }
}
@@ -1842,18 +1843,18 @@ class profileInfo extends pageTest {
** a test for Special:Cite (extension Special page).
*/
class specialCite extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Cite";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Cite";
- $this->params = array (
- "page" => wikiFuzz::chooseInput( array("\" onmouseover=\"alert(1);\"", "Main Page", wikifuzz::makeFuzz(2)) ),
- "id" => wikiFuzz::chooseInput( array("-1", "0", "------'-------0", "+1", "-9823412312312412435", wikiFuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "page" => wikiFuzz::chooseInput( array( "\" onmouseover=\"alert(1);\"", "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
+ "id" => wikiFuzz::chooseInput( array( "-1", "0", "------'-------0", "+1", "-9823412312312412435", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(6) == 0) unset($this->params["page"]);
- if (wikiFuzz::randnum(6) == 0) unset($this->params["id"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["page"] );
+ if ( wikiFuzz::randnum( 6 ) == 0 ) unset( $this->params["id"] );
+ }
}
@@ -1861,13 +1862,13 @@ class specialCite extends pageTest {
** a test for Special:Filepath (extension Special page).
*/
class specialFilepath extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Filepath";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Filepath";
- $this->params = array (
- "file" => wikiFuzz::chooseInput( array("Small-email.png", "Small-email.png" . wikifuzz::makeFuzz(1), wikiFuzz::makeFuzz(2)) ),
- );
- }
+ $this->params = array (
+ "file" => wikiFuzz::chooseInput( array( "Small-email.png", "Small-email.png" . wikiFuzz::makeFuzz( 1 ), wikiFuzz::makeFuzz( 2 ) ) ),
+ );
+ }
}
@@ -1875,22 +1876,22 @@ class specialFilepath extends pageTest {
** a test for Special:Makebot (extension Special page).
*/
class specialMakebot extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Makebot";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Makebot";
- $this->params = array (
- "username" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ),
- "dosearch" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikifuzz::makeFuzz(2)) ),
- "grant" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikifuzz::makeFuzz(2)) ),
- "comment" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- "token" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "username" => wikiFuzz::chooseInput( array( "Nickj2", "192.168.0.2", wikiFuzz::makeFuzz( 1 ) ) ),
+ "dosearch" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "grant" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "comment" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ "token" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(2) == 0) unset($this->params["dosearch"]);
- if (wikiFuzz::randnum(2) == 0) unset($this->params["grant"]);
- if (wikiFuzz::randnum(5) == 0) unset($this->params["token"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["dosearch"] );
+ if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["grant"] );
+ if ( wikiFuzz::randnum( 5 ) == 0 ) unset( $this->params["token"] );
+ }
}
@@ -1898,22 +1899,22 @@ class specialMakebot extends pageTest {
** a test for Special:Makesysop (extension Special page).
*/
class specialMakesysop extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Makesysop";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Makesysop";
- $this->params = array (
- "wpMakesysopUser" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ),
- "action" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikifuzz::makeFuzz(2)) ),
- "wpMakesysopSubmit" => wikiFuzz::chooseInput( array("0", "1", "++--34234", wikifuzz::makeFuzz(2)) ),
- "wpEditToken" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- "wpSetBureaucrat" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "wpMakesysopUser" => wikiFuzz::chooseInput( array( "Nickj2", "192.168.0.2", wikiFuzz::makeFuzz( 1 ) ) ),
+ "action" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpMakesysopSubmit" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpEditToken" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ "wpSetBureaucrat" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(3) == 0) unset($this->params["wpMakesysopSubmit"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["wpEditToken"]);
- if (wikiFuzz::randnum(3) == 0) unset($this->params["wpSetBureaucrat"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpMakesysopSubmit"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpEditToken"] );
+ if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpSetBureaucrat"] );
+ }
}
@@ -1921,15 +1922,15 @@ class specialMakesysop extends pageTest {
** a test for Special:Renameuser (extension Special page).
*/
class specialRenameuser extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Renameuser";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Renameuser";
- $this->params = array (
- "oldusername" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ),
- "newusername" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ),
- "token" => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ),
- );
- }
+ $this->params = array (
+ "oldusername" => wikiFuzz::chooseInput( array( "Nickj2", "192.168.0.2", wikiFuzz::makeFuzz( 1 ) ) ),
+ "newusername" => wikiFuzz::chooseInput( array( "Nickj2", "192.168.0.2", wikiFuzz::makeFuzz( 1 ) ) ),
+ "token" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
+ }
}
@@ -1937,16 +1938,16 @@ class specialRenameuser extends pageTest {
** a test for Special:Linksearch (extension Special page).
*/
class specialLinksearch extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special%3ALinksearch";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special%3ALinksearch";
- $this->params = array (
- "target" => wikifuzz::makeFuzz(2),
- );
+ $this->params = array (
+ "target" => wikiFuzz::makeFuzz( 2 ),
+ );
- // sometimes we don't want to specify certain parameters.
- if (wikiFuzz::randnum(10) == 0) unset($this->params["target"]);
- }
+ // sometimes we don't want to specify certain parameters.
+ if ( wikiFuzz::randnum( 10 ) == 0 ) unset( $this->params["target"] );
+ }
}
@@ -1954,20 +1955,20 @@ class specialLinksearch extends pageTest {
** a test for Special:CategoryTree (extension Special page).
*/
class specialCategoryTree extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:CategoryTree";
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:CategoryTree";
- $this->params = array (
- "target" => wikifuzz::makeFuzz(2),
- "from" => wikifuzz::makeFuzz(2),
- "until" => wikifuzz::makeFuzz(2),
- "showas" => wikifuzz::makeFuzz(2),
- "mode" => wikiFuzz::chooseInput( array("pages", "categories", "all", wikifuzz::makeFuzz(2)) ),
- );
+ $this->params = array (
+ "target" => wikiFuzz::makeFuzz( 2 ),
+ "from" => wikiFuzz::makeFuzz( 2 ),
+ "until" => wikiFuzz::makeFuzz( 2 ),
+ "showas" => wikiFuzz::makeFuzz( 2 ),
+ "mode" => wikiFuzz::chooseInput( array( "pages", "categories", "all", wikiFuzz::makeFuzz( 2 ) ) ),
+ );
- // sometimes we do want to specify certain parameters.
- if (wikiFuzz::randnum(5) == 0) $this->params["notree"] = wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) );
- }
+ // sometimes we do want to specify certain parameters.
+ if ( wikiFuzz::randnum( 5 ) == 0 ) $this->params["notree"] = wikiFuzz::chooseInput( array( "1", 0, "", wikiFuzz::makeFuzz( 2 ) ) );
+ }
}
@@ -1975,40 +1976,40 @@ class specialCategoryTree extends pageTest {
** a test for "Special:Chemicalsources" (extension Special page).
*/
class specialChemicalsourcesTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Chemicalsources";
-
- // choose an input format to use.
- $format = wikiFuzz::chooseInput(
- array( 'go',
- 'CAS',
- 'EINECS',
- 'CHEBI',
- 'PubChem',
- 'SMILES',
- 'InChI',
- 'ATCCode',
- 'KEGG',
- 'RTECS',
- 'ECNumber',
- 'DrugBank',
- 'Formula',
- 'Name'
- )
- );
-
- // values for different formats usually start with either letters or numbers.
- switch ($format) {
- case 'Name' : $value = "A"; break;
- case 'InChI' :
- case 'SMILES' :
- case 'Formula': $value = "C"; break;
- default : $value = "0"; break;
- }
-
- // and then we append the fuzz input.
- $this->params = array ($format => $value . wikifuzz::makeFuzz(2) );
- }
+ function __construct() {
+ $this->pagePath = "index.php?title=Special:Chemicalsources";
+
+ // choose an input format to use.
+ $format = wikiFuzz::chooseInput(
+ array( 'go',
+ 'CAS',
+ 'EINECS',
+ 'CHEBI',
+ 'PubChem',
+ 'SMILES',
+ 'InChI',
+ 'ATCCode',
+ 'KEGG',
+ 'RTECS',
+ 'ECNumber',
+ 'DrugBank',
+ 'Formula',
+ 'Name'
+ )
+ );
+
+ // values for different formats usually start with either letters or numbers.
+ switch ( $format ) {
+ case 'Name' : $value = "A"; break;
+ case 'InChI' :
+ case 'SMILES' :
+ case 'Formula': $value = "C"; break;
+ default : $value = "0"; break;
+ }
+
+ // and then we append the fuzz input.
+ $this->params = array ( $format => $value . wikiFuzz::makeFuzz( 2 ) );
+ }
}
@@ -2023,143 +2024,143 @@ class specialChemicalsourcesTest extends pageTest {
*/
class api extends pageTest {
- // API login mode.
- private static function loginMode() {
- $arr = array ( "lgname" => wikifuzz::makeFuzz(2),
- "lgpassword" => wikifuzz::makeFuzz(2),
- );
- // sometimes we want to specify the extra "lgdomain" parameter.
- if (wikiFuzz::randnum(3) == 0) {
- $arr["lgdomain"] = wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) );
- }
-
- return $arr;
- }
-
- // API OpenSearch mode.
- private static function opensearchMode() {
- return array ("search" => wikifuzz::makeFuzz(2));
- }
-
- // API watchlist feed mode.
- private static function feedwatchlistMode() {
- // FIXME: add "wikifuzz::makeFuzz(2)" as possible value below?
- return array ("feedformat" => wikiFuzz::chooseInput( array("rss", "atom") ) );
- }
-
- // API query mode.
- private static function queryMode() {
- // FIXME: add "wikifuzz::makeFuzz(2)" as possible params for the elements below?
- // Suspect this will stuff up the tests more, but need to check.
- $params = array (
- // FIXME: More titles.
- "titles" => wikiFuzz::chooseInput( array("Main Page")),
- // FIXME: More pageids.
- "pageids" => 1,
- "prop" => wikiFuzz::chooseInput( array("info", "revisions", "watchlist")),
- "list" => wikiFuzz::chooseInput( array("allpages", "logevents", "watchlist", "usercontribs", "recentchanges", "backlinks", "embeddedin", "imagelinks") ),
- "meta" => wikiFuzz::chooseInput( array("siteinfo")),
- "generator" => wikiFuzz::chooseInput( array("allpages", "logevents", "watchlist", "info", "revisions") ),
- "siprop" => wikiFuzz::chooseInput( array("general", "namespaces", "general|namespaces") ),
- );
-
- // Add extra parameters based on what list choice we got.
- switch ($params["list"]) {
- case "usercontribs" : self::addListParams ($params, "uc", array("limit", "start", "end", "user", "dir") ); break;
- case "allpages" : self::addListParams ($params, "ap", array("from", "prefix", "namespace", "filterredir", "limit") ); break;
- case "watchlist" : self::addListParams ($params, "wl", array("allrev", "start", "end", "namespace", "dir", "limit", "prop") ); break;
- case "logevents" : self::addListParams ($params, "le", array("limit", "type", "start", "end", "user", "dir") ); break;
- case "recentchanges": self::addListParams ($params, "rc", array("limit", "prop", "show", "namespace", "start", "end", "dir") ); break;
- case "backlinks" : self::addListParams ($params, "bl", array("continue", "namespace", "redirect", "limit") ); break;
- case "embeddedin" : self::addListParams ($params, "ei", array("continue", "namespace", "redirect", "limit") ); break;
- case "imagelinks" : self::addListParams ($params, "il", array("continue", "namespace", "redirect", "limit") ); break;
- }
-
- if ($params["prop"] == "revisions") {
- self::addListParams ($params, "rv", array("prop", "limit", "startid", "endid", "end", "dir") );
- }
-
- // Sometimes we want redirects, sometimes we don't.
- if (wikiFuzz::randnum(3) == 0) {
- $params["redirects"] = wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) );
- }
-
- return $params;
- }
-
- // Adds all the elements to the array, using the specified prefix.
- private static function addListParams(&$array, $prefix, $elements) {
- foreach ($elements as $element) {
- $array[$prefix . $element] = self::getParamDetails($element);
- }
- }
-
- // For a given element name, returns the data for that element.
- private static function getParamDetails($element) {
- switch ($element) {
- case 'startid' :
- case 'endid' :
- case 'start' :
- case 'end' :
- case 'limit' : return wikiFuzz::chooseInput( array("0", "-1", "---'----------0", "+1", "8134", "320742734234235", "20060230121212", wikiFuzz::randnum(9000, -100), wikiFuzz::makeFuzz(2)) );
- case 'dir' : return wikiFuzz::chooseInput( array("newer", "older", wikifuzz::makeFuzz(2) ) );
- case 'user' : return wikiFuzz::chooseInput( array(USER_ON_WIKI, wikifuzz::makeFuzz(2) ) );
- case 'namespace' : return wikiFuzz::chooseInput( array(-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 200000, wikifuzz::makeFuzz(2)) );
- case 'filterredir': return wikiFuzz::chooseInput( array("all", "redirects", "nonredirectsallpages", wikifuzz::makeFuzz(2)) );
- case 'allrev' : return wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) );
- case 'prop' : return wikiFuzz::chooseInput( array("user", "comment", "timestamp", "patrol", "flags", "user|user|comment|flags", wikifuzz::makeFuzz(2) ) );
- case 'type' : return wikiFuzz::chooseInput( array("block", "protect", "rights", "delete", "upload", "move", "import", "renameuser", "newusers", "makebot", wikifuzz::makeFuzz(2) ) );
- case 'hide' : return wikiFuzz::chooseInput( array("minor", "bots", "anons", "liu", "liu|bots|", wikifuzz::makeFuzz(2) ) );
- case 'show' : return wikiFuzz::chooseInput( array('minor', '!minor', 'bot', '!bot', 'anon', '!anon', wikifuzz::makeFuzz(2) ) );
- default : return wikifuzz::makeFuzz(2);
- }
- }
-
- // Entry point.
- function __construct() {
- $this->pagePath = "api.php";
-
- $modes = array ("help",
- "login",
- "opensearch",
- "feedwatchlist",
- "query");
- $action = wikiFuzz::chooseInput( array_merge ($modes, array(wikifuzz::makeFuzz(2))) );
-
- switch ($action) {
- case "login" : $this->params = self::loginMode();
- break;
- case "opensearch" : $this->params = self::opensearchMode();
- break;
- case "feedwatchlist" : $this->params = self::feedwatchlistMode();
- break;
- case "query" : $this->params = self::queryMode();
- break;
- case "help" :
- default : // Do something random - "Crazy Ivan" mode.
- $random_mode = wikiFuzz::chooseInput( $modes ) . "Mode";
- // There is no "helpMode".
- if ($random_mode == "helpMode") $random_mode = "queryMode";
- $this->params = self::$random_mode();
- break;
- }
-
- // Save the selected action.
- $this->params["action"] = $action;
-
- // Set the cookie:
- // FIXME: need to get this cookie dynamically set, rather than hard-coded.
- $this->cookie = "wikidbUserID=10001; wikidbUserName=Test; wikidb_session=178df0fe68c75834643af65dec9ec98a; wikidbToken=1adc6753d62c44aec950c024d7ae0540";
-
- // Output format
- $this->params["format"] = wikiFuzz::chooseInput( array("json", "jsonfm", "php", "phpfm",
- "wddx", "wddxfm", "xml", "xmlfm",
- "yaml", "yamlfm", "raw", "rawfm",
- wikifuzz::makeFuzz(2) ) );
-
- // Page does not produce HTML (sometimes).
- $this->tidyValidate = false;
- }
+ // API login mode.
+ private static function loginMode() {
+ $arr = array ( "lgname" => wikiFuzz::makeFuzz( 2 ),
+ "lgpassword" => wikiFuzz::makeFuzz( 2 ),
+ );
+ // sometimes we want to specify the extra "lgdomain" parameter.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) {
+ $arr["lgdomain"] = wikiFuzz::chooseInput( array( "1", 0, "", wikiFuzz::makeFuzz( 2 ) ) );
+ }
+
+ return $arr;
+ }
+
+ // API OpenSearch mode.
+ private static function opensearchMode() {
+ return array ( "search" => wikiFuzz::makeFuzz( 2 ) );
+ }
+
+ // API watchlist feed mode.
+ private static function feedwatchlistMode() {
+ // FIXME: add "wikiFuzz::makeFuzz(2)" as possible value below?
+ return array ( "feedformat" => wikiFuzz::chooseInput( array( "rss", "atom" ) ) );
+ }
+
+ // API query mode.
+ private static function queryMode() {
+ // FIXME: add "wikiFuzz::makeFuzz(2)" as possible params for the elements below?
+ // Suspect this will stuff up the tests more, but need to check.
+ $params = array (
+ // FIXME: More titles.
+ "titles" => wikiFuzz::chooseInput( array( "Main Page" ) ),
+ // FIXME: More pageids.
+ "pageids" => 1,
+ "prop" => wikiFuzz::chooseInput( array( "info", "revisions", "watchlist" ) ),
+ "list" => wikiFuzz::chooseInput( array( "allpages", "logevents", "watchlist", "usercontribs", "recentchanges", "backlinks", "embeddedin", "imagelinks" ) ),
+ "meta" => wikiFuzz::chooseInput( array( "siteinfo" ) ),
+ "generator" => wikiFuzz::chooseInput( array( "allpages", "logevents", "watchlist", "info", "revisions" ) ),
+ "siprop" => wikiFuzz::chooseInput( array( "general", "namespaces", "general|namespaces" ) ),
+ );
+
+ // Add extra parameters based on what list choice we got.
+ switch ( $params["list"] ) {
+ case "usercontribs" : self::addListParams ( $params, "uc", array( "limit", "start", "end", "user", "dir" ) ); break;
+ case "allpages" : self::addListParams ( $params, "ap", array( "from", "prefix", "namespace", "filterredir", "limit" ) ); break;
+ case "watchlist" : self::addListParams ( $params, "wl", array( "allrev", "start", "end", "namespace", "dir", "limit", "prop" ) ); break;
+ case "logevents" : self::addListParams ( $params, "le", array( "limit", "type", "start", "end", "user", "dir" ) ); break;
+ case "recentchanges": self::addListParams ( $params, "rc", array( "limit", "prop", "show", "namespace", "start", "end", "dir" ) ); break;
+ case "backlinks" : self::addListParams ( $params, "bl", array( "continue", "namespace", "redirect", "limit" ) ); break;
+ case "embeddedin" : self::addListParams ( $params, "ei", array( "continue", "namespace", "redirect", "limit" ) ); break;
+ case "imagelinks" : self::addListParams ( $params, "il", array( "continue", "namespace", "redirect", "limit" ) ); break;
+ }
+
+ if ( $params["prop"] == "revisions" ) {
+ self::addListParams ( $params, "rv", array( "prop", "limit", "startid", "endid", "end", "dir" ) );
+ }
+
+ // Sometimes we want redirects, sometimes we don't.
+ if ( wikiFuzz::randnum( 3 ) == 0 ) {
+ $params["redirects"] = wikiFuzz::chooseInput( array( "1", 0, "", wikiFuzz::makeFuzz( 2 ) ) );
+ }
+
+ return $params;
+ }
+
+ // Adds all the elements to the array, using the specified prefix.
+ private static function addListParams( &$array, $prefix, $elements ) {
+ foreach ( $elements as $element ) {
+ $array[$prefix . $element] = self::getParamDetails( $element );
+ }
+ }
+
+ // For a given element name, returns the data for that element.
+ private static function getParamDetails( $element ) {
+ switch ( $element ) {
+ case 'startid' :
+ case 'endid' :
+ case 'start' :
+ case 'end' :
+ case 'limit' : return wikiFuzz::chooseInput( array( "0", "-1", "---'----------0", "+1", "8134", "320742734234235", "20060230121212", wikiFuzz::randnum( 9000, -100 ), wikiFuzz::makeFuzz( 2 ) ) );
+ case 'dir' : return wikiFuzz::chooseInput( array( "newer", "older", wikiFuzz::makeFuzz( 2 ) ) );
+ case 'user' : return wikiFuzz::chooseInput( array( USER_ON_WIKI, wikiFuzz::makeFuzz( 2 ) ) );
+ case 'namespace' : return wikiFuzz::chooseInput( array( -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 200000, wikiFuzz::makeFuzz( 2 ) ) );
+ case 'filterredir': return wikiFuzz::chooseInput( array( "all", "redirects", "nonredirectsallpages", wikiFuzz::makeFuzz( 2 ) ) );
+ case 'allrev' : return wikiFuzz::chooseInput( array( "1", 0, "", wikiFuzz::makeFuzz( 2 ) ) );
+ case 'prop' : return wikiFuzz::chooseInput( array( "user", "comment", "timestamp", "patrol", "flags", "user|user|comment|flags", wikiFuzz::makeFuzz( 2 ) ) );
+ case 'type' : return wikiFuzz::chooseInput( array( "block", "protect", "rights", "delete", "upload", "move", "import", "renameuser", "newusers", "makebot", wikiFuzz::makeFuzz( 2 ) ) );
+ case 'hide' : return wikiFuzz::chooseInput( array( "minor", "bots", "anons", "liu", "liu|bots|", wikiFuzz::makeFuzz( 2 ) ) );
+ case 'show' : return wikiFuzz::chooseInput( array( 'minor', '!minor', 'bot', '!bot', 'anon', '!anon', wikiFuzz::makeFuzz( 2 ) ) );
+ default : return wikiFuzz::makeFuzz( 2 );
+ }
+ }
+
+ // Entry point.
+ function __construct() {
+ $this->pagePath = "api.php";
+
+ $modes = array ( "help",
+ "login",
+ "opensearch",
+ "feedwatchlist",
+ "query" );
+ $action = wikiFuzz::chooseInput( array_merge ( $modes, array( wikiFuzz::makeFuzz( 2 ) ) ) );
+
+ switch ( $action ) {
+ case "login" : $this->params = self::loginMode();
+ break;
+ case "opensearch" : $this->params = self::opensearchMode();
+ break;
+ case "feedwatchlist" : $this->params = self::feedwatchlistMode();
+ break;
+ case "query" : $this->params = self::queryMode();
+ break;
+ case "help" :
+ default : // Do something random - "Crazy Ivan" mode.
+ $random_mode = wikiFuzz::chooseInput( $modes ) . "Mode";
+ // There is no "helpMode".
+ if ( $random_mode == "helpMode" ) $random_mode = "queryMode";
+ $this->params = self::$random_mode();
+ break;
+ }
+
+ // Save the selected action.
+ $this->params["action"] = $action;
+
+ // Set the cookie:
+ // FIXME: need to get this cookie dynamically set, rather than hard-coded.
+ $this->cookie = "wikidbUserID=10001; wikidbUserName=Test; wikidb_session=178df0fe68c75834643af65dec9ec98a; wikidbToken=1adc6753d62c44aec950c024d7ae0540";
+
+ // Output format
+ $this->params["format"] = wikiFuzz::chooseInput( array( "json", "jsonfm", "php", "phpfm",
+ "wddx", "wddxfm", "xml", "xmlfm",
+ "yaml", "yamlfm", "raw", "rawfm",
+ wikiFuzz::makeFuzz( 2 ) ) );
+
+ // Page does not produce HTML (sometimes).
+ $this->tidyValidate = false;
+ }
}
@@ -2167,152 +2168,152 @@ class api extends pageTest {
** a page test for the GeSHi extension.
*/
class GeSHi_Test extends pageTest {
-
- private function getGeSHiContent() {
- return "<source lang=\"" . $this->getLang() . "\" "
- . (wikiFuzz::randnum(2) == 0 ? "line " : "")
- . (wikiFuzz::randnum(2) == 0 ? "strict " : "")
- . "start=" . wikiFuzz::chooseInput( array(wikiFuzz::randnum(-6000,6000), wikifuzz::makeFuzz(2)) )
- . ">"
- . wikiFuzz::makeFuzz(2)
- . "</source>";
- }
-
- private function getLang() {
+
+ private function getGeSHiContent() {
+ return "<source lang=\"" . $this->getLang() . "\" "
+ . ( wikiFuzz::randnum( 2 ) == 0 ? "line " : "" )
+ . ( wikiFuzz::randnum( 2 ) == 0 ? "strict " : "" )
+ . "start=" . wikiFuzz::chooseInput( array( wikiFuzz::randnum( -6000, 6000 ), wikiFuzz::makeFuzz( 2 ) ) )
+ . ">"
+ . wikiFuzz::makeFuzz( 2 )
+ . "</source>";
+ }
+
+ private function getLang() {
return wikiFuzz::chooseInput( array( "actionscript", "ada", "apache", "applescript", "asm", "asp", "autoit", "bash", "blitzbasic", "bnf", "c", "c_mac", "caddcl", "cadlisp",
- "cfdg", "cfm", "cpp", "cpp-qt", "csharp", "css", "d", "delphi", "diff", "div", "dos", "eiffel", "fortran", "freebasic", "gml", "groovy", "html4strict", "idl",
- "ini", "inno", "io", "java", "java5", "javascript", "latex", "lisp", "lua", "matlab", "mirc", "mpasm", "mysql", "nsis", "objc", "ocaml", "ocaml-brief", "oobas",
- "oracle8", "pascal", "perl", "php", "php-brief", "plsql", "python", "qbasic", "rails", "reg", "robots", "ruby", "sas", "scheme", "sdlbasic", "smalltalk", "smarty",
- "sql", "tcl", "text", "thinbasic", "tsql", "vb", "vbnet", "vhdl", "visualfoxpro", "winbatch", "xml", "xpp", "z80", wikifuzz::makeFuzz(1) ) );
- }
-
- function __construct() {
- $this->pagePath = "index.php?title=WIKIFUZZ";
-
- $this->params = array (
- "action" => "submit",
- "wpMinoredit" => "test",
- "wpPreview" => "test",
- "wpSection" => "test",
- "wpEdittime" => "test",
- "wpSummary" => "test",
- "wpScrolltop" => "test",
- "wpStarttime" => "test",
- "wpAutoSummary" => "test",
- "wpTextbox1" => $this->getGeSHiContent() // the main wiki text, contains fake GeSHi content.
- );
- }
+ "cfdg", "cfm", "cpp", "cpp-qt", "csharp", "css", "d", "delphi", "diff", "div", "dos", "eiffel", "fortran", "freebasic", "gml", "groovy", "html4strict", "idl",
+ "ini", "inno", "io", "java", "java5", "javascript", "latex", "lisp", "lua", "matlab", "mirc", "mpasm", "mysql", "nsis", "objc", "ocaml", "ocaml-brief", "oobas",
+ "oracle8", "pascal", "perl", "php", "php-brief", "plsql", "python", "qbasic", "rails", "reg", "robots", "ruby", "sas", "scheme", "sdlbasic", "smalltalk", "smarty",
+ "sql", "tcl", "text", "thinbasic", "tsql", "vb", "vbnet", "vhdl", "visualfoxpro", "winbatch", "xml", "xpp", "z80", wikiFuzz::makeFuzz( 1 ) ) );
+ }
+
+ function __construct() {
+ $this->pagePath = "index.php?title=WIKIFUZZ";
+
+ $this->params = array (
+ "action" => "submit",
+ "wpMinoredit" => "test",
+ "wpPreview" => "test",
+ "wpSection" => "test",
+ "wpEdittime" => "test",
+ "wpSummary" => "test",
+ "wpScrolltop" => "test",
+ "wpStarttime" => "test",
+ "wpAutoSummary" => "test",
+ "wpTextbox1" => $this->getGeSHiContent() // the main wiki text, contains fake GeSHi content.
+ );
+ }
}
/**
** selects a page test to run.
*/
-function selectPageTest($count) {
-
- // if the user only wants a specific test, then only ever give them that.
- if (defined("SPECIFIC_TEST")) {
- $testType = SPECIFIC_TEST;
- return new $testType ();
- }
-
- // Some of the time we test Special pages, the remaining
- // time we test using the standard edit page.
- switch ($count % 100) {
- case 0 : return new successfulUserLoginTest();
- case 1 : return new listusersTest();
- case 2 : return new searchTest();
- case 3 : return new recentchangesTest();
- case 4 : return new prefixindexTest();
- case 5 : return new mimeSearchTest();
- case 6 : return new specialLogTest();
- case 7 : return new userLoginTest();
- case 8 : return new ipblocklistTest();
- case 9 : return new newImagesTest();
- case 10: return new imagelistTest();
- case 11: return new specialExportTest();
- case 12: return new specialBooksourcesTest();
- case 13: return new specialAllpagesTest();
- case 14: return new pageHistoryTest();
- case 15: return new contributionsTest();
- case 16: return new viewPageTest();
- case 17: return new specialAllmessagesTest();
- case 18: return new specialNewpages();
- case 19: return new searchTest();
- case 20: return new redirectTest();
- case 21: return new confirmEmail();
- case 22: return new watchlistTest();
- case 23: return new specialBlockmeTest();
- case 24: return new specialUndelete();
- case 25: return new specialMovePage();
- case 26: return new specialUnlockdb();
- case 27: return new specialLockdb();
- case 28: return new specialUserrights();
- case 29: return new pageProtectionForm();
- case 30: return new specialBlockip();
- case 31: return new imagepageTest();
- case 32: return new pageDeletion();
- case 33: return new specialRevisionDelete();
- case 34: return new specialImport();
- case 35: return new thumbTest();
- case 36: return new trackbackTest();
- case 37: return new profileInfo();
- case 38: return new specialCite();
- case 39: return new specialFilepath();
- case 40: return new specialMakebot();
- case 41: return new specialMakesysop();
- case 42: return new specialRenameuser();
- case 43: return new specialLinksearch();
- case 44: return new specialCategoryTree();
- case 45: return new api();
- case 45: return new specialChemicalsourcesTest();
- default: return new editPageTest();
- }
-}
-
-
-/////////////////////// SAVING OUTPUT /////////////////////////
+function selectPageTest( $count ) {
+
+ // if the user only wants a specific test, then only ever give them that.
+ if ( defined( "SPECIFIC_TEST" ) ) {
+ $testType = SPECIFIC_TEST;
+ return new $testType ();
+ }
+
+ // Some of the time we test Special pages, the remaining
+ // time we test using the standard edit page.
+ switch ( $count % 100 ) {
+ case 0 : return new successfulUserLoginTest();
+ case 1 : return new listusersTest();
+ case 2 : return new searchTest();
+ case 3 : return new recentchangesTest();
+ case 4 : return new prefixindexTest();
+ case 5 : return new mimeSearchTest();
+ case 6 : return new specialLogTest();
+ case 7 : return new userLoginTest();
+ case 8 : return new ipblocklistTest();
+ case 9 : return new newImagesTest();
+ case 10: return new imagelistTest();
+ case 11: return new specialExportTest();
+ case 12: return new specialBooksourcesTest();
+ case 13: return new specialAllpagesTest();
+ case 14: return new pageHistoryTest();
+ case 15: return new contributionsTest();
+ case 16: return new viewPageTest();
+ case 17: return new specialAllmessagesTest();
+ case 18: return new specialNewpages();
+ case 19: return new searchTest();
+ case 20: return new redirectTest();
+ case 21: return new confirmEmail();
+ case 22: return new watchlistTest();
+ case 23: return new specialBlockmeTest();
+ case 24: return new specialUndelete();
+ case 25: return new specialMovePage();
+ case 26: return new specialUnlockdb();
+ case 27: return new specialLockdb();
+ case 28: return new specialUserrights();
+ case 29: return new pageProtectionForm();
+ case 30: return new specialBlockip();
+ case 31: return new imagepageTest();
+ case 32: return new pageDeletion();
+ case 33: return new specialRevisionDelete();
+ case 34: return new specialImport();
+ case 35: return new thumbTest();
+ case 36: return new trackbackTest();
+ case 37: return new profileInfo();
+ case 38: return new specialCite();
+ case 39: return new specialFilepath();
+ case 40: return new specialMakebot();
+ case 41: return new specialMakesysop();
+ case 42: return new specialRenameuser();
+ case 43: return new specialLinksearch();
+ case 44: return new specialCategoryTree();
+ case 45: return new api();
+ case 45: return new specialChemicalsourcesTest();
+ default: return new editPageTest();
+ }
+}
+
+
+// ///////////////////// SAVING OUTPUT /////////////////////////
/**
** Utility function for saving a file. Currently has no error checking.
*/
-function saveFile($data, $name) {
- file_put_contents($name, $data);
+function saveFile( $data, $name ) {
+ file_put_contents( $name, $data );
}
/**
** Returns a test as an experimental GET-to-POST URL.
- ** This doesn't seem to always work though, and sometimes the output is too long
+ ** This doesn't seem to always work though, and sometimes the output is too long
** to be a valid GET URL, so we also save in other formats.
*/
-function getAsURL(pageTest $test) {
- $used_question_mark = (strpos($test->getPagePath(), "?") !== false);
- $retval = "http://get-to-post.nickj.org/?" . WIKI_BASE_URL . $test->getPagePath();
- foreach ($test->getParams() as $param => $value) {
- if (!$used_question_mark) {
- $retval .= "?";
- $used_question_mark = true;
- }
- else {
- $retval .= "&";
- }
- $retval .= $param . "=" . urlencode($value);
- }
- return $retval;
+function getAsURL( pageTest $test ) {
+ $used_question_mark = ( strpos( $test->getPagePath(), "?" ) !== false );
+ $retval = "http://get-to-post.nickj.org/?" . WIKI_BASE_URL . $test->getPagePath();
+ foreach ( $test->getParams() as $param => $value ) {
+ if ( !$used_question_mark ) {
+ $retval .= "?";
+ $used_question_mark = true;
+ }
+ else {
+ $retval .= "&";
+ }
+ $retval .= $param . "=" . urlencode( $value );
+ }
+ return $retval;
}
/**
** Saves a plain-text human-readable version of a test.
*/
-function saveTestAsText(pageTest $test, $filename) {
- $str = "Test: " . $test->getPagePath();
- foreach ($test->getParams() as $param => $value) {
- $str .= "\n$param: $value";
- }
- $str .= "\nGet-to-post URL: " . getAsURL($test) . "\n";
- saveFile($str, $filename);
+function saveTestAsText( pageTest $test, $filename ) {
+ $str = "Test: " . $test->getPagePath();
+ foreach ( $test->getParams() as $param => $value ) {
+ $str .= "\n$param: $value";
+ }
+ $str .= "\nGet-to-post URL: " . getAsURL( $test ) . "\n";
+ saveFile( $str, $filename );
}
@@ -2320,37 +2321,37 @@ function saveTestAsText(pageTest $test, $filename) {
** Saves a test as a standalone basic PHP script that shows this one problem.
** Resulting script requires PHP-Curl be installed in order to work.
*/
-function saveTestAsPHP(pageTest $test, $filename) {
- $str = "<?php\n"
- . "\$params = " . var_export(escapeForCurl($test->getParams()), true) . ";\n"
- . "\$ch = curl_init();\n"
- . "curl_setopt(\$ch, CURLOPT_POST, 1);\n"
- . "curl_setopt(\$ch, CURLOPT_POSTFIELDS, \$params );\n"
- . "curl_setopt(\$ch, CURLOPT_URL, " . var_export(WIKI_BASE_URL . $test->getPagePath(), true) . ");\n"
- . "curl_setopt(\$ch, CURLOPT_RETURNTRANSFER,1);\n"
- . ($test->getCookie() ? "curl_setopt(\$ch, CURLOPT_COOKIE, " . var_export($test->getCookie(), true) . ");\n" : "")
- . "\$result=curl_exec(\$ch);\n"
- . "curl_close (\$ch);\n"
- . "print \$result;\n"
- . "?>\n";
- saveFile($str, $filename);
+function saveTestAsPHP( pageTest $test, $filename ) {
+ $str = "<?php\n"
+ . "\$params = " . var_export( escapeForCurl( $test->getParams() ), true ) . ";\n"
+ . "\$ch = curl_init();\n"
+ . "curl_setopt(\$ch, CURLOPT_POST, 1);\n"
+ . "curl_setopt(\$ch, CURLOPT_POSTFIELDS, \$params );\n"
+ . "curl_setopt(\$ch, CURLOPT_URL, " . var_export( WIKI_BASE_URL . $test->getPagePath(), true ) . ");\n"
+ . "curl_setopt(\$ch, CURLOPT_RETURNTRANSFER,1);\n"
+ . ( $test->getCookie() ? "curl_setopt(\$ch, CURLOPT_COOKIE, " . var_export( $test->getCookie(), true ) . ");\n" : "" )
+ . "\$result=curl_exec(\$ch);\n"
+ . "curl_close (\$ch);\n"
+ . "print \$result;\n"
+ . "?>\n";
+ saveFile( $str, $filename );
}
/**
** Escapes a value so that it can be used on the command line by Curl.
- ** Specifically, "<" and "@" need to be escaped if they are the first character,
+ ** Specifically, "<" and "@" need to be escaped if they are the first character,
** otherwise curl interprets these as meaning that we want to insert a file.
*/
-function escapeForCurl(array $input_params) {
- $output_params = array();
- foreach ($input_params as $param => $value) {
- if (strlen($value) > 0 && ( $value[0] == "@" || $value[0] == "<")) {
- $value = "\\" . $value;
- }
- $output_params[$param] = $value;
- }
- return $output_params;
+function escapeForCurl( array $input_params ) {
+ $output_params = array();
+ foreach ( $input_params as $param => $value ) {
+ if ( strlen( $value ) > 0 && ( $value[0] == "@" || $value[0] == "<" ) ) {
+ $value = "\\" . $value;
+ }
+ $output_params[$param] = $value;
+ }
+ return $output_params;
}
@@ -2358,124 +2359,124 @@ function escapeForCurl(array $input_params) {
** Saves a test as a standalone CURL shell script that shows this one problem.
** Resulting script requires standalone Curl be installed in order to work.
*/
-function saveTestAsCurl(pageTest $test, $filename) {
- $str = "#!/bin/bash\n"
- . "curl --silent --include --globoff \\\n"
- . ($test->getCookie() ? " --cookie " . escapeshellarg($test->getCookie()) . " \\\n" : "");
- foreach (escapeForCurl($test->getParams()) as $param => $value) {
- $str .= " -F " . escapeshellarg($param) . "=" . escapeshellarg($value) . " \\\n";
- }
- $str .= " " . escapeshellarg(WIKI_BASE_URL . $test->getPagePath()); // beginning space matters.
- $str .= "\n";
- saveFile($str, $filename);
- chmod($filename, 0755); // make executable
+function saveTestAsCurl( pageTest $test, $filename ) {
+ $str = "#!/bin/bash\n"
+ . "curl --silent --include --globoff \\\n"
+ . ( $test->getCookie() ? " --cookie " . escapeshellarg( $test->getCookie() ) . " \\\n" : "" );
+ foreach ( escapeForCurl( $test->getParams() ) as $param => $value ) {
+ $str .= " -F " . escapeshellarg( $param ) . "=" . escapeshellarg( $value ) . " \\\n";
+ }
+ $str .= " " . escapeshellarg( WIKI_BASE_URL . $test->getPagePath() ); // beginning space matters.
+ $str .= "\n";
+ saveFile( $str, $filename );
+ chmod( $filename, 0755 ); // make executable
}
/**
** Saves the internal data structure to file.
*/
-function saveTestData (pageTest $test, $filename) {
- saveFile(serialize($test), $filename);
+function saveTestData ( pageTest $test, $filename ) {
+ saveFile( serialize( $test ), $filename );
}
/**
** saves a test in the various formats.
*/
-function saveTest(pageTest $test, $testname) {
- $base_name = DIRECTORY . "/" . $testname;
- saveTestAsText($test, $base_name . INFO_FILE);
- saveTestAsPHP ($test, $base_name . PHP_TEST );
- saveTestAsCurl($test, $base_name . CURL_TEST);
- saveTestData ($test, $base_name . DATA_FILE);
+function saveTest( pageTest $test, $testname ) {
+ $base_name = DIRECTORY . "/" . $testname;
+ saveTestAsText( $test, $base_name . INFO_FILE );
+ saveTestAsPHP ( $test, $base_name . PHP_TEST );
+ saveTestAsCurl( $test, $base_name . CURL_TEST );
+ saveTestData ( $test, $base_name . DATA_FILE );
}
-//////////////////// MEDIAWIKI OUTPUT /////////////////////////
+// ////////////////// MEDIAWIKI OUTPUT /////////////////////////
/**
** Asks MediaWiki for the HTML output of a test.
*/
-function wikiTestOutput(pageTest $test) {
+function wikiTestOutput( pageTest $test ) {
- $ch = curl_init();
+ $ch = curl_init();
- // specify the cookie, if required.
- if ($test->getCookie()) curl_setopt($ch, CURLOPT_COOKIE, $test->getCookie());
- curl_setopt($ch, CURLOPT_POST, 1); // save form using a POST
+ // specify the cookie, if required.
+ if ( $test->getCookie() ) curl_setopt( $ch, CURLOPT_COOKIE, $test->getCookie() );
+ curl_setopt( $ch, CURLOPT_POST, 1 ); // save form using a POST
- $params = escapeForCurl($test->getParams());
- curl_setopt($ch, CURLOPT_POSTFIELDS, $params ); // load the POST variables
+ $params = escapeForCurl( $test->getParams() );
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, $params ); // load the POST variables
- curl_setopt($ch, CURLOPT_URL, WIKI_BASE_URL . $test->getPagePath() ); // set url to post to
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
+ curl_setopt( $ch, CURLOPT_URL, WIKI_BASE_URL . $test->getPagePath() ); // set url to post to
+ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // return into a variable
- $result=curl_exec ($ch);
+ $result = curl_exec ( $ch );
- // if we encountered an error, then say so, and return an empty string.
- if (curl_error($ch)) {
- print "\nCurl error #: " . curl_errno($ch) . " - " . curl_error ($ch);
- $result = "";
- }
+ // if we encountered an error, then say so, and return an empty string.
+ if ( curl_error( $ch ) ) {
+ print "\nCurl error #: " . curl_errno( $ch ) . " - " . curl_error ( $ch );
+ $result = "";
+ }
- curl_close ($ch);
+ curl_close ( $ch );
- return $result;
+ return $result;
}
-//////////////////// HTML VALIDATION /////////////////////////
+// ////////////////// HTML VALIDATION /////////////////////////
/*
** Asks the validator whether this is valid HTML, or not.
*/
-function validateHTML($text) {
+function validateHTML( $text ) {
- $params = array ("fragment" => $text);
+ $params = array ( "fragment" => $text );
- $ch = curl_init();
+ $ch = curl_init();
- curl_setopt($ch, CURLOPT_POST, 1); // save form using a POST
- curl_setopt($ch, CURLOPT_POSTFIELDS, $params); // load the POST variables
- curl_setopt($ch, CURLOPT_URL, VALIDATOR_URL); // set url to post to
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
+ curl_setopt( $ch, CURLOPT_POST, 1 ); // save form using a POST
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, $params ); // load the POST variables
+ curl_setopt( $ch, CURLOPT_URL, VALIDATOR_URL ); // set url to post to
+ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // return into a variable
- $result=curl_exec ($ch);
+ $result = curl_exec ( $ch );
- // if we encountered an error, then log it, and exit.
- if (curl_error($ch)) {
- trigger_error("Curl error #: " . curl_errno($ch) . " - " . curl_error ($ch) );
- print "Curl error #: " . curl_errno($ch) . " - " . curl_error ($ch) . " - exiting.\n";
- exit(1);
- }
+ // if we encountered an error, then log it, and exit.
+ if ( curl_error( $ch ) ) {
+ trigger_error( "Curl error #: " . curl_errno( $ch ) . " - " . curl_error ( $ch ) );
+ print "Curl error #: " . curl_errno( $ch ) . " - " . curl_error ( $ch ) . " - exiting.\n";
+ exit( 1 );
+ }
- curl_close ($ch);
+ curl_close ( $ch );
- $valid = (strpos($result, "Failed validation") === false ? true : false);
+ $valid = ( strpos( $result, "Failed validation" ) === false ? true : false );
- return array($valid, $result);
+ return array( $valid, $result );
}
/**
** Get tidy to check for no HTML errors in the output file (e.g. unescaped strings).
*/
-function tidyCheckFile($name) {
- $file = DIRECTORY . "/" . $name;
- $command = PATH_TO_TIDY . " -output /tmp/out.html -quiet $file 2>&1";
- $x = `$command`;
+function tidyCheckFile( $name ) {
+ $file = DIRECTORY . "/" . $name;
+ $command = PATH_TO_TIDY . " -output /tmp/out.html -quiet $file 2>&1";
+ $x = `$command`;
- // Look for the most interesting Tidy errors and warnings.
- if ( strpos($x,"end of file while parsing attributes") !== false
- || strpos($x,"attribute with missing trailing quote mark") !== false
- || strpos($x,"missing '>' for end of tag") !== false
- || strpos($x,"Error:") !== false) {
- print "\nTidy found something - view details with: $command";
- return false;
- } else {
- return true;
- }
+ // Look for the most interesting Tidy errors and warnings.
+ if ( strpos( $x, "end of file while parsing attributes" ) !== false
+ || strpos( $x, "attribute with missing trailing quote mark" ) !== false
+ || strpos( $x, "missing '>' for end of tag" ) !== false
+ || strpos( $x, "Error:" ) !== false ) {
+ print "\nTidy found something - view details with: $command";
+ return false;
+ } else {
+ return true;
+ }
}
@@ -2484,267 +2485,267 @@ function tidyCheckFile($name) {
** the last time this was run. This is used to tell if a test caused a DB error.
*/
function dbErrorLogged() {
- static $filesize;
+ static $filesize;
- // first time running this function
- if (!isset($filesize)) {
- // create log if it does not exist
- if (!file_exists(DB_ERROR_LOG_FILE)) {
- saveFile("", DB_ERROR_LOG_FILE);
- }
- $filesize = filesize(DB_ERROR_LOG_FILE);
- return false;
- }
+ // first time running this function
+ if ( !isset( $filesize ) ) {
+ // create log if it does not exist
+ if ( !file_exists( DB_ERROR_LOG_FILE ) ) {
+ saveFile( "", DB_ERROR_LOG_FILE );
+ }
+ $filesize = filesize( DB_ERROR_LOG_FILE );
+ return false;
+ }
- $newsize = filesize(DB_ERROR_LOG_FILE);
- // if the log has grown, then assume the current test caused it.
- if ($newsize != $filesize) {
- $filesize = $newsize;
- return true;
- }
+ $newsize = filesize( DB_ERROR_LOG_FILE );
+ // if the log has grown, then assume the current test caused it.
+ if ( $newsize != $filesize ) {
+ $filesize = $newsize;
+ return true;
+ }
- return false;
+ return false;
}
-////////////////// TOP-LEVEL PROBLEM-FINDING FUNCTION ////////////////////////
+// //////////////// TOP-LEVEL PROBLEM-FINDING FUNCTION ////////////////////////
/**
** takes a page test, and runs it and tests it for problems in the output.
** Returns: False on finding a problem, or True on no problems being found.
*/
-function runWikiTest(pageTest $test, &$testname, $can_overwrite = false) {
-
- // by default don't overwrite a previous test of the same name.
- while ( ! $can_overwrite && file_exists(DIRECTORY . "/" . $testname . DATA_FILE)) {
- $testname .= "-" . mt_rand(0,9);
- }
-
- $filename = DIRECTORY . "/" . $testname . DATA_FILE;
-
- // Store the time before and after, to find slow pages.
- $before = microtime(true);
-
- // Get MediaWiki to give us the output of this test.
- $wiki_preview = wikiTestOutput($test);
-
- $after = microtime(true);
-
- // if we received no response, then that's interesting.
- if ($wiki_preview == "") {
- print "\nNo response received for: $filename";
- return false;
- }
-
- // save output HTML to file.
- $html_file = DIRECTORY . "/" . $testname . HTML_FILE;
- saveFile($wiki_preview, $html_file);
-
- // if there were PHP errors in the output, then that's interesting too.
- if ( strpos($wiki_preview, "<b>Warning</b>: " ) !== false
- || strpos($wiki_preview, "<b>Fatal error</b>: " ) !== false
- || strpos($wiki_preview, "<b>Notice</b>: " ) !== false
- || strpos($wiki_preview, "<b>Error</b>: " ) !== false
- || strpos($wiki_preview, "<b>Strict Standards:</b>") !== false
- ) {
- $error = substr($wiki_preview, strpos($wiki_preview, "</b>:") + 7, 50);
- // Avoid probable PHP bug with bad session ids; http://bugs.php.net/bug.php?id=38224
- if ($error != "Unknown: The session id contains illegal character") {
- print "\nPHP error/warning/notice in HTML output: $html_file ; $error";
- return false;
- }
- }
-
- // if there was a MediaWiki Backtrace message in the output, then that's also interesting.
- if( strpos($wiki_preview, "Backtrace:") !== false ) {
- print "\nInternal MediaWiki error in HTML output: $html_file";
- return false;
- }
-
- // if there was a Parser error comment in the output, then that's potentially interesting.
- if( strpos($wiki_preview, "!-- ERR") !== false ) {
- print "\nParser Error comment in HTML output: $html_file";
- return false;
- }
-
- // if a database error was logged, then that's definitely interesting.
- if( dbErrorLogged() ) {
- print "\nDatabase Error logged for: $filename";
- return false;
- }
-
- // validate result
- $valid = true;
- if( VALIDATE_ON_WEB ) {
- list ($valid, $validator_output) = validateHTML($wiki_preview);
- if (!$valid) print "\nW3C web validation failed - view details with: html2text " . DIRECTORY . "/" . $testname . ".validator_output.html";
- }
-
- // Get tidy to check the page, unless we already know it produces non-XHTML output.
- if( $test->tidyValidate() ) {
- $valid = tidyCheckFile( $testname . HTML_FILE ) && $valid;
- }
-
- // if it took more than 2 seconds to render, then it may be interesting too. (Possible DoS attack?)
- if (($after - $before) >= 2) {
- print "\nParticularly slow to render (" . round($after - $before, 2) . " seconds): $filename";
- return false;
- }
-
- if( $valid ) {
- // Remove temp HTML file if test was valid:
- unlink( $html_file );
- } elseif( VALIDATE_ON_WEB ) {
- saveFile($validator_output, DIRECTORY . "/" . $testname . ".validator_output.html");
- }
-
- return $valid;
-}
-
-
-/////////////////// RERUNNING OLD TESTS ///////////////////
+function runWikiTest( pageTest $test, &$testname, $can_overwrite = false ) {
+
+ // by default don't overwrite a previous test of the same name.
+ while ( ! $can_overwrite && file_exists( DIRECTORY . "/" . $testname . DATA_FILE ) ) {
+ $testname .= "-" . mt_rand( 0, 9 );
+ }
+
+ $filename = DIRECTORY . "/" . $testname . DATA_FILE;
+
+ // Store the time before and after, to find slow pages.
+ $before = microtime( true );
+
+ // Get MediaWiki to give us the output of this test.
+ $wiki_preview = wikiTestOutput( $test );
+
+ $after = microtime( true );
+
+ // if we received no response, then that's interesting.
+ if ( $wiki_preview == "" ) {
+ print "\nNo response received for: $filename";
+ return false;
+ }
+
+ // save output HTML to file.
+ $html_file = DIRECTORY . "/" . $testname . HTML_FILE;
+ saveFile( $wiki_preview, $html_file );
+
+ // if there were PHP errors in the output, then that's interesting too.
+ if ( strpos( $wiki_preview, "<b>Warning</b>: " ) !== false
+ || strpos( $wiki_preview, "<b>Fatal error</b>: " ) !== false
+ || strpos( $wiki_preview, "<b>Notice</b>: " ) !== false
+ || strpos( $wiki_preview, "<b>Error</b>: " ) !== false
+ || strpos( $wiki_preview, "<b>Strict Standards:</b>" ) !== false
+ ) {
+ $error = substr( $wiki_preview, strpos( $wiki_preview, "</b>:" ) + 7, 50 );
+ // Avoid probable PHP bug with bad session ids; http://bugs.php.net/bug.php?id=38224
+ if ( $error != "Unknown: The session id contains illegal character" ) {
+ print "\nPHP error/warning/notice in HTML output: $html_file ; $error";
+ return false;
+ }
+ }
+
+ // if there was a MediaWiki Backtrace message in the output, then that's also interesting.
+ if ( strpos( $wiki_preview, "Backtrace:" ) !== false ) {
+ print "\nInternal MediaWiki error in HTML output: $html_file";
+ return false;
+ }
+
+ // if there was a Parser error comment in the output, then that's potentially interesting.
+ if ( strpos( $wiki_preview, "!-- ERR" ) !== false ) {
+ print "\nParser Error comment in HTML output: $html_file";
+ return false;
+ }
+
+ // if a database error was logged, then that's definitely interesting.
+ if ( dbErrorLogged() ) {
+ print "\nDatabase Error logged for: $filename";
+ return false;
+ }
+
+ // validate result
+ $valid = true;
+ if ( VALIDATE_ON_WEB ) {
+ list ( $valid, $validator_output ) = validateHTML( $wiki_preview );
+ if ( !$valid ) print "\nW3C web validation failed - view details with: html2text " . DIRECTORY . "/" . $testname . ".validator_output.html";
+ }
+
+ // Get tidy to check the page, unless we already know it produces non-XHTML output.
+ if ( $test->tidyValidate() ) {
+ $valid = tidyCheckFile( $testname . HTML_FILE ) && $valid;
+ }
+
+ // if it took more than 2 seconds to render, then it may be interesting too. (Possible DoS attack?)
+ if ( ( $after - $before ) >= 2 ) {
+ print "\nParticularly slow to render (" . round( $after - $before, 2 ) . " seconds): $filename";
+ return false;
+ }
+
+ if ( $valid ) {
+ // Remove temp HTML file if test was valid:
+ unlink( $html_file );
+ } elseif ( VALIDATE_ON_WEB ) {
+ saveFile( $validator_output, DIRECTORY . "/" . $testname . ".validator_output.html" );
+ }
+
+ return $valid;
+}
+
+
+// ///////////////// RERUNNING OLD TESTS ///////////////////
/**
** We keep our failed tests so that they can be rerun.
** This function does that retesting.
*/
function rerunPreviousTests() {
- print "Retesting previously found problems.\n";
+ print "Retesting previously found problems.\n";
- $dir_contents = scandir (DIRECTORY);
+ $dir_contents = scandir ( DIRECTORY );
- // sort file into the order a normal person would use.
- natsort ($dir_contents);
+ // sort file into the order a normal person would use.
+ natsort ( $dir_contents );
- foreach ($dir_contents as $file) {
+ foreach ( $dir_contents as $file ) {
- // if file is not a test, then skip it.
- // Note we need to escape any periods or will be treated as "any character".
- $matches = array();
- if (!ereg("(.*)" . str_replace(".", "\.", DATA_FILE) . "$", $file, $matches)) continue;
+ // if file is not a test, then skip it.
+ // Note we need to escape any periods or will be treated as "any character".
+ $matches = array();
+ if ( !preg_match( "/(.*)" . str_replace( ".", "\.", DATA_FILE ) . "$/", $file, $matches ) ) continue;
- // reload the test.
- $full_path = DIRECTORY . "/" . $file;
- $test = unserialize(file_get_contents($full_path));
+ // reload the test.
+ $full_path = DIRECTORY . "/" . $file;
+ $test = unserialize( file_get_contents( $full_path ) );
- // if this is not a valid test, then skip it.
- if (! $test instanceof pageTest) {
- print "\nSkipping invalid test - $full_path";
- continue;
- }
+ // if this is not a valid test, then skip it.
+ if ( ! $test instanceof pageTest ) {
+ print "\nSkipping invalid test - $full_path";
+ continue;
+ }
- // The date format is in Apache log format, which makes it easier to locate
- // which retest caused which error in the Apache logs (only happens usually if
- // apache segfaults).
- if (!QUIET) print "[" . date ("D M d H:i:s Y") . "] Retesting $file (" . get_class($test) . ")";
+ // The date format is in Apache log format, which makes it easier to locate
+ // which retest caused which error in the Apache logs (only happens usually if
+ // apache segfaults).
+ if ( !QUIET ) print "[" . date ( "D M d H:i:s Y" ) . "] Retesting $file (" . get_class( $test ) . ")";
- // run test
- $testname = $matches[1];
- $valid = runWikiTest($test, $testname, true);
+ // run test
+ $testname = $matches[1];
+ $valid = runWikiTest( $test, $testname, true );
- if (!$valid) {
- saveTest($test, $testname);
- if (QUIET) {
- print "\nTest: " . get_class($test) . " ; Testname: $testname\n------";
- } else {
- print "\n";
- }
- }
- else {
- if (!QUIET) print "\r";
- if (DELETE_PASSED_RETESTS) {
- $prefix = DIRECTORY . "/" . $testname;
- if (is_file($prefix . DATA_FILE)) unlink($prefix . DATA_FILE);
- if (is_file($prefix . PHP_TEST )) unlink($prefix . PHP_TEST );
- if (is_file($prefix . CURL_TEST)) unlink($prefix . CURL_TEST);
- if (is_file($prefix . INFO_FILE)) unlink($prefix . INFO_FILE);
- }
- }
- }
+ if ( !$valid ) {
+ saveTest( $test, $testname );
+ if ( QUIET ) {
+ print "\nTest: " . get_class( $test ) . " ; Testname: $testname\n------";
+ } else {
+ print "\n";
+ }
+ }
+ else {
+ if ( !QUIET ) print "\r";
+ if ( DELETE_PASSED_RETESTS ) {
+ $prefix = DIRECTORY . "/" . $testname;
+ if ( is_file( $prefix . DATA_FILE ) ) unlink( $prefix . DATA_FILE );
+ if ( is_file( $prefix . PHP_TEST ) ) unlink( $prefix . PHP_TEST );
+ if ( is_file( $prefix . CURL_TEST ) ) unlink( $prefix . CURL_TEST );
+ if ( is_file( $prefix . INFO_FILE ) ) unlink( $prefix . INFO_FILE );
+ }
+ }
+ }
- print "\nDone retesting.\n";
+ print "\nDone retesting.\n";
}
-////////////////////// MAIN LOOP ////////////////////////
+// //////////////////// MAIN LOOP ////////////////////////
// first check whether CURL is installed, because sometimes it's not.
-if( ! function_exists('curl_init') ) {
- die("Could not find 'curl_init' function. Is the curl extension compiled into PHP?\n");
+if ( ! function_exists( 'curl_init' ) ) {
+ die( "Could not find 'curl_init' function. Is the curl extension compiled into PHP?\n" );
}
-// Initialization of types. wikiFuzz doesn't have a constructor because we want to
+// Initialization of types. wikiFuzz doesn't have a constructor because we want to
// access it staticly and not have any globals.
-wikiFuzz::$types = array_keys(wikiFuzz::$data);
+wikiFuzz::$types = array_keys( wikiFuzz::$data );
// Make directory if doesn't exist
-if (!is_dir(DIRECTORY)) {
- mkdir (DIRECTORY, 0700 );
+if ( !is_dir( DIRECTORY ) ) {
+ mkdir ( DIRECTORY, 0700 );
}
// otherwise, we first retest the things that we have found in previous runs
-else if (RERUN_OLD_TESTS) {
- rerunPreviousTests();
+else if ( RERUN_OLD_TESTS ) {
+ rerunPreviousTests();
}
// main loop.
-$start_time = date("U");
+$start_time = date( "U" );
$num_errors = 0;
-if (!QUIET) {
- print "Beginning main loop. Results are stored in the " . DIRECTORY . " directory.\n";
- print "Press CTRL+C to stop testing.\n";
-}
-
-for ($count=0; true; $count++) {
- if (!QUIET) {
- // spinning progress indicator.
- switch( $count % 4 ) {
- case '0': print "\r/"; break;
- case '1': print "\r-"; break;
- case '2': print "\r\\"; break;
- case '3': print "\r|"; break;
- }
- print " $count";
- }
-
- // generate a page test to run.
- $test = selectPageTest($count);
-
- $mins = ( date("U") - $start_time ) / 60;
- if (!QUIET && $mins > 0) {
- print ". $num_errors poss errors. "
- . floor($mins) . " mins. "
- . round ($count / $mins, 0) . " tests/min. "
- . get_class($test); // includes the current test name.
- }
-
- // run this test against MediaWiki, and see if the output was valid.
- $testname = $count;
- $valid = runWikiTest($test, $testname, false);
-
- // save the failed test
- if ( ! $valid ) {
- if (QUIET) {
- print "\nTest: " . get_class($test) . " ; Testname: $testname\n------";
- } else {
- print "\n";
- }
- saveTest($test, $testname);
- $num_errors += 1;
- } else if ( KEEP_PASSED_TESTS ) {
- // print current time, with microseconds (matches "strace" format), and the test name.
- print " " . date("H:i:s.") . substr(current(explode(" ", microtime())), 2) . " " . $testname;
- saveTest($test, $testname);
- }
-
- // stop if we have reached max number of errors.
- if (defined("MAX_ERRORS") && $num_errors>=MAX_ERRORS) {
- break;
- }
-
- // stop if we have reached max number of mins runtime.
- if (defined("MAX_RUNTIME") && $mins>=MAX_RUNTIME) {
- break;
- }
+if ( !QUIET ) {
+ print "Beginning main loop. Results are stored in the " . DIRECTORY . " directory.\n";
+ print "Press CTRL+C to stop testing.\n";
+}
+
+for ( $count = 0; true; $count++ ) {
+ if ( !QUIET ) {
+ // spinning progress indicator.
+ switch( $count % 4 ) {
+ case '0': print "\r/"; break;
+ case '1': print "\r-"; break;
+ case '2': print "\r\\"; break;
+ case '3': print "\r|"; break;
+ }
+ print " $count";
+ }
+
+ // generate a page test to run.
+ $test = selectPageTest( $count );
+
+ $mins = ( date( "U" ) - $start_time ) / 60;
+ if ( !QUIET && $mins > 0 ) {
+ print ". $num_errors poss errors. "
+ . floor( $mins ) . " mins. "
+ . round ( $count / $mins, 0 ) . " tests/min. "
+ . get_class( $test ); // includes the current test name.
+ }
+
+ // run this test against MediaWiki, and see if the output was valid.
+ $testname = $count;
+ $valid = runWikiTest( $test, $testname, false );
+
+ // save the failed test
+ if ( ! $valid ) {
+ if ( QUIET ) {
+ print "\nTest: " . get_class( $test ) . " ; Testname: $testname\n------";
+ } else {
+ print "\n";
+ }
+ saveTest( $test, $testname );
+ $num_errors += 1;
+ } else if ( KEEP_PASSED_TESTS ) {
+ // print current time, with microseconds (matches "strace" format), and the test name.
+ print " " . date( "H:i:s." ) . substr( current( explode( " ", microtime() ) ), 2 ) . " " . $testname;
+ saveTest( $test, $testname );
+ }
+
+ // stop if we have reached max number of errors.
+ if ( defined( "MAX_ERRORS" ) && $num_errors >= MAX_ERRORS ) {
+ break;
+ }
+
+ // stop if we have reached max number of mins runtime.
+ if ( defined( "MAX_RUNTIME" ) && $mins >= MAX_RUNTIME ) {
+ break;
+ }
}
diff --git a/maintenance/gearman/gearman.inc b/maintenance/gearman/gearman.inc
index 514b9bac..15f80e62 100644
--- a/maintenance/gearman/gearman.inc
+++ b/maintenance/gearman/gearman.inc
@@ -72,7 +72,7 @@ class NonScaryGearmanWorker extends Net_Gearman_Worker {
if (isset($resp['data']['arg']) &&
Net_Gearman_Connection::stringLength($resp['data']['arg'])) {
$arg = json_decode($resp['data']['arg'], true);
- }
+ }
### START MW DIFFERENT BIT
if ( $name != 'mw_job' ) {
diff --git a/maintenance/gearman/gearmanRefreshLinks.php b/maintenance/gearman/gearmanRefreshLinks.php
index eb3104eb..730db96b 100644
--- a/maintenance/gearman/gearmanRefreshLinks.php
+++ b/maintenance/gearman/gearmanRefreshLinks.php
@@ -2,8 +2,8 @@
$optionsWithArgs = array( 'fake-job' );
-require( dirname(__FILE__).'/../commandLine.inc' );
-require( dirname(__FILE__).'/gearman.inc' );
+require( dirname( __FILE__ ) . '/../commandLine.inc' );
+require( dirname( __FILE__ ) . '/gearman.inc' );
if ( !$args ) {
$args = array( 'localhost' );
@@ -15,12 +15,12 @@ $dbr = wfGetDB( DB_SLAVE );
$startId = 0;
$endId = $dbr->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
while ( true ) {
- $res = $dbr->select(
- 'page',
+ $res = $dbr->select(
+ 'page',
array( 'page_namespace', 'page_title', 'page_id' ),
- array( 'page_id > ' . intval( $startId ) ),
+ array( 'page_id > ' . intval( $startId ) ),
__METHOD__,
- array( 'LIMIT' => $batchSize )
+ array( 'LIMIT' => $batchSize )
);
if ( $res->numRows() == 0 ) {
diff --git a/maintenance/gearman/gearmanWorker.php b/maintenance/gearman/gearmanWorker.php
index d6f3949f..aea126a7 100644
--- a/maintenance/gearman/gearmanWorker.php
+++ b/maintenance/gearman/gearmanWorker.php
@@ -1,10 +1,10 @@
<?php
$optionsWithArgs = array( 'fake-job', 'procs' );
-require( dirname(__FILE__).'/../commandLine.inc' );
-require( dirname(__FILE__).'/gearman.inc' );
+require( dirname( __FILE__ ) . '/../commandLine.inc' );
+require( dirname( __FILE__ ) . '/gearman.inc' );
-ini_set('memory_limit', '150M' );
+ini_set( 'memory_limit', '150M' );
if ( isset( $options['procs'] ) ) {
$procs = $options['procs'];
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index 04dbbc4d..e483f7c9 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -4,6 +4,9 @@ define( 'GS_TALK', -1 );
/**
* Creates a sitemap for the site
*
+ * Copyright © 2005, Ævar Arnfjörð Bjarmason, Jens Frank <jeluf@gmx.de> and
+ * Brion Vibber <brion@pobox.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
@@ -19,19 +22,13 @@ define( 'GS_TALK', -1 );
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
- *
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @copyright Copyright © 2005, Jens Frank <jeluf@gmx.de>
- * @copyright Copyright © 2005, Brion Vibber <brion@pobox.com>
- *
* @see http://www.sitemaps.org/
* @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
- *
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class GenerateSitemap extends Maintenance {
/**
@@ -60,11 +57,11 @@ class GenerateSitemap extends Maintenance {
var $fspath;
/**
- * The path to append to the domain name
+ * The URL path to prepend to filenames in the index; should resolve to the same directory as $fspath
*
* @var string
*/
- var $path;
+ var $urlpath;
/**
* Whether or not to use compression
@@ -129,8 +126,8 @@ class GenerateSitemap extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Creates a sitemap for the site";
- $this->addOption( 'fspath', 'The file system path to save to, e.g. /tmp/sitemap' .
- "\n\t\tdefaults to current directory", false, true );
+ $this->addOption( 'fspath', 'The file system path to save to, e.g. /tmp/sitemap; defaults to current directory', false, true );
+ $this->addOption( 'urlpath', 'The URL path corresponding to --fspath, prepended to filenames in the index; defaults to an empty string', false, true );
$this->addOption( 'compress', 'Compress the sitemap files, can take value yes|no, default yes', false, true );
}
@@ -138,11 +135,14 @@ class GenerateSitemap extends Maintenance {
* Execute
*/
public function execute() {
- global $wgScriptPath;
$this->setNamespacePriorities();
$this->url_limit = 50000;
$this->size_limit = pow( 2, 20 ) * 10;
$this->fspath = self::init_path( $this->getOption( 'fspath', getcwd() ) );
+ $this->urlpath = $this->getOption( 'urlpath', "" );
+ if ( $this->urlpath !== "" && substr( $this->urlpath, -1 ) !== '/' ) {
+ $this->urlpath .= '/';
+ }
$this->compress = $this->getOption( 'compress', 'yes' ) !== 'no';
$this->dbr = wfGetDB( DB_SLAVE );
$this->generateNamespaces();
@@ -179,15 +179,15 @@ class GenerateSitemap extends Maintenance {
* Create directory if it does not exist and return pathname with a trailing slash
*/
private static function init_path( $fspath ) {
- if( !isset( $fspath ) ) {
+ if ( !isset( $fspath ) ) {
return null;
}
# Create directory if needed
- if( $fspath && !is_dir( $fspath ) ) {
- wfMkdirParents( $fspath ) or die("Can not create directory $fspath.\n");
+ if ( $fspath && !is_dir( $fspath ) ) {
+ wfMkdirParents( $fspath ) or die( "Can not create directory $fspath.\n" );
}
- return realpath( $fspath ). DIRECTORY_SEPARATOR ;
+ return realpath( $fspath ) . DIRECTORY_SEPARATOR ;
}
/**
@@ -196,7 +196,7 @@ class GenerateSitemap extends Maintenance {
function generateNamespaces() {
// Only generate for specific namespaces if $wgSitemapNamespaces is an array.
global $wgSitemapNamespaces;
- if( is_array( $wgSitemapNamespaces ) ) {
+ if ( is_array( $wgSitemapNamespaces ) ) {
$this->namespaces = $wgSitemapNamespaces;
return;
}
@@ -218,11 +218,9 @@ class GenerateSitemap extends Maintenance {
/**
* Get the priority of a given namespace
*
- * @param int $namespace The namespace to get the priority for
- +
- * @return string
+ * @param $namespace Integer: the namespace to get the priority for
+ * @return String
*/
-
function priority( $namespace ) {
return isset( $this->priorities[$namespace] ) ? $this->priorities[$namespace] : $this->guessPriority( $namespace );
}
@@ -232,9 +230,8 @@ class GenerateSitemap extends Maintenance {
* default priority for the namespace, varies depending on whether it's
* a talkpage or not.
*
- * @param int $namespace The namespace to get the priority for
- *
- * @return string
+ * @param $namespace Integer: the namespace to get the priority for
+ * @return String
*/
function guessPriority( $namespace ) {
return MWNamespace::isMain( $namespace ) ? $this->priorities[GS_MAIN] : $this->priorities[GS_TALK];
@@ -243,9 +240,8 @@ class GenerateSitemap extends Maintenance {
/**
* Return a database resolution of all the pages in a given namespace
*
- * @param int $namespace Limit the query to this namespace
- *
- * @return resource
+ * @param $namespace Integer: limit the query to this namespace
+ * @return Resource
*/
function getPageRes( $namespace ) {
return $this->dbr->select( 'page',
@@ -261,10 +257,8 @@ class GenerateSitemap extends Maintenance {
/**
* Main loop
- *
- * @access public
*/
- function main() {
+ public function main() {
global $wgContLang;
fwrite( $this->findex, $this->openIndex() );
@@ -298,11 +292,11 @@ class GenerateSitemap extends Maintenance {
$length += strlen( $entry );
$this->write( $this->file, $entry );
// generate pages for language variants
- if($wgContLang->hasVariants()){
+ if ( $wgContLang->hasVariants() ) {
$variants = $wgContLang->getVariants();
- foreach($variants as $vCode){
- if($vCode==$wgContLang->getCode()) continue; // we don't want default variant
- $entry = $this->fileEntry( $title->getFullURL('',$vCode), $date, $this->priority( $namespace ) );
+ foreach ( $variants as $vCode ) {
+ if ( $vCode == $wgContLang->getCode() ) continue; // we don't want default variant
+ $entry = $this->fileEntry( $title->getFullURL( '', $vCode ), $date, $this->priority( $namespace ) );
$length += strlen( $entry );
$this->write( $this->file, $entry );
}
@@ -320,7 +314,7 @@ class GenerateSitemap extends Maintenance {
/**
* gzopen() / fopen() wrapper
*
- * @return resource
+ * @return Resource
*/
function open( $file, $flags ) {
return $this->compress ? gzopen( $file, $flags ) : fopen( $file, $flags );
@@ -349,23 +343,18 @@ class GenerateSitemap extends Maintenance {
/**
* Get a sitemap filename
*
- * @static
- *
- * @param int $namespace The namespace
- * @param int $count The count
- *
- * @return string
+ * @param $namespace Integer: the namespace
+ * @param $count Integer: the count
+ * @return String
*/
function sitemapFilename( $namespace, $count ) {
$ext = $this->compress ? '.gz' : '';
- return "sitemap-".wfWikiID()."-NS_$namespace-$count.xml$ext";
+ return "sitemap-" . wfWikiID() . "-NS_$namespace-$count.xml$ext";
}
/**
* Return the XML required to open an XML file
*
- * @static
- *
* @return string
*/
function xmlHead() {
@@ -375,9 +364,7 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML schema being used
*
- * @static
- *
- * @returns string
+ * @return String
*/
function xmlSchema() {
return 'http://www.sitemaps.org/schemas/sitemap/0.9';
@@ -386,7 +373,7 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML required to open a sitemap index file
*
- * @return string
+ * @return String
*/
function openIndex() {
return $this->xmlHead() . '<sitemapindex xmlns="' . $this->xmlSchema() . '">' . "\n";
@@ -395,16 +382,13 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML for a single sitemap indexfile entry
*
- * @static
- *
- * @param string $filename The filename of the sitemap file
- *
- * @return string
+ * @param $filename String: the filename of the sitemap file
+ * @return String
*/
function indexEntry( $filename ) {
return
"\t<sitemap>\n" .
- "\t\t<loc>$filename</loc>\n" .
+ "\t\t<loc>{$this->urlpath}$filename</loc>\n" .
"\t\t<lastmod>{$this->timestamp}</lastmod>\n" .
"\t</sitemap>\n";
}
@@ -412,9 +396,7 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML required to close a sitemap index file
*
- * @static
- *
- * @return string
+ * @return String
*/
function closeIndex() {
return "</sitemapindex>\n";
@@ -423,7 +405,7 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML required to open a sitemap file
*
- * @return string
+ * @return String
*/
function openFile() {
return $this->xmlHead() . '<urlset xmlns="' . $this->xmlSchema() . '">' . "\n";
@@ -432,13 +414,10 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML for a single sitemap entry
*
- * @static
- *
- * @param string $url An RFC 2396 compliant URL
- * @param string $date A ISO 8601 date
- * @param string $priority A priority indicator, 0.0 - 1.0 inclusive with a 0.1 stepsize
- *
- * @return string
+ * @param $url String: an RFC 2396 compliant URL
+ * @param $date String: a ISO 8601 date
+ * @param $priority String: a priority indicator, 0.0 - 1.0 inclusive with a 0.1 stepsize
+ * @return String
*/
function fileEntry( $url, $date, $priority ) {
return
@@ -452,8 +431,7 @@ class GenerateSitemap extends Maintenance {
/**
* Return the XML required to close sitemap file
*
- * @static
- * @return string
+ * @return String
*/
function closeFile() {
return "</urlset>\n";
@@ -474,4 +452,4 @@ class GenerateSitemap extends Maintenance {
}
$maintClass = "GenerateSitemap";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/getLagTimes.php b/maintenance/getLagTimes.php
index bc14ae71..0322fa2d 100644
--- a/maintenance/getLagTimes.php
+++ b/maintenance/getLagTimes.php
@@ -18,7 +18,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class GetLagTimes extends Maintenance {
public function __construct() {
@@ -29,14 +29,14 @@ class GetLagTimes extends Maintenance {
public function execute() {
$lb = wfGetLB();
- if( $lb->getServerCount() == 1 ) {
+ if ( $lb->getServerCount() == 1 ) {
$this->error( "This script dumps replication lag times, but you don't seem to have\n"
- . "a multi-host db server configuration." );
+ . "a multi-host db server configuration." );
} else {
$lags = $lb->getLagTimes();
- foreach( $lags as $n => $lag ) {
+ foreach ( $lags as $n => $lag ) {
$host = $lb->getServerName( $n );
- if( IP::isValid( $host ) ) {
+ if ( IP::isValid( $host ) ) {
$ip = $host;
$host = gethostbyaddr( $host );
} else {
@@ -51,4 +51,4 @@ class GetLagTimes extends Maintenance {
}
$maintClass = "GetLagTimes";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/getSlaveServer.php b/maintenance/getSlaveServer.php
index eac97a59..a9d93f1d 100644
--- a/maintenance/getSlaveServer.php
+++ b/maintenance/getSlaveServer.php
@@ -19,8 +19,8 @@
*
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class GetSlaveServer extends Maintenance {
public function __construct() {
@@ -30,11 +30,11 @@ class GetSlaveServer extends Maintenance {
}
public function execute() {
global $wgAllDBsAreLocalhost;
- if( $wgAllDBsAreLocalhost ) {
+ if ( $wgAllDBsAreLocalhost ) {
$host = 'localhost';
} else {
- if( $this->hasOption('group') ) {
- $db = wfGetDB( DB_SLAVE, $this->getOption('group') );
+ if ( $this->hasOption( 'group' ) ) {
+ $db = wfGetDB( DB_SLAVE, $this->getOption( 'group' ) );
$host = $db->getServer();
} else {
$lb = wfGetLB();
@@ -47,4 +47,4 @@ class GetSlaveServer extends Maintenance {
}
$maintClass = "GetSlaveServer";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/getText.php b/maintenance/getText.php
index 6326267d..eb044117 100644
--- a/maintenance/getText.php
+++ b/maintenance/getText.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class GetTextMaint extends Maintenance {
public function __construct() {
@@ -45,7 +45,7 @@ class GetTextMaint extends Maintenance {
$titleText = $title->getPrefixedText();
$this->error( "Page $titleText does not exist.\n", true );
}
- $text = $rev->getText( $this->hasOption('show-private') ? Revision::RAW : Revision::FOR_PUBLIC );
+ $text = $rev->getText( $this->hasOption( 'show-private' ) ? Revision::RAW : Revision::FOR_PUBLIC );
if ( $text === false ) {
$titleText = $title->getPrefixedText();
$this->error( "Couldn't extract the text from $titleText.\n", true );
@@ -55,4 +55,4 @@ class GetTextMaint extends Maintenance {
}
$maintClass = "GetTextMaint";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/httpSessionDownload.php b/maintenance/httpSessionDownload.php
index cab6e872..3c4f16a0 100644
--- a/maintenance/httpSessionDownload.php
+++ b/maintenance/httpSessionDownload.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class HttpSessionDownload extends Maintenance {
public function __construct() {
@@ -34,10 +34,10 @@ class HttpSessionDownload extends Maintenance {
}
public function execute() {
- wfProfileIn(__METHOD__);
+ wfProfileIn( __METHOD__ );
- //run the download:
- Http::doSessionIdDownload( $this->getOption('sid'), $this->getOption('usk') );
+ // run the download:
+ Http::doSessionIdDownload( $this->getOption( 'sid' ), $this->getOption( 'usk' ) );
// close up shop:
// Execute any deferred updates
@@ -49,9 +49,9 @@ class HttpSessionDownload extends Maintenance {
// Shut down the database before exit
wfGetLBFactory()->shutdown();
- wfProfileOut(__METHOD__);
+ wfProfileOut( __METHOD__ );
}
}
$maintClass = "HttpSessionDownload";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/ibm_db2/foreignkeys.sql b/maintenance/ibm_db2/foreignkeys.sql
new file mode 100644
index 00000000..81a88eb9
--- /dev/null
+++ b/maintenance/ibm_db2/foreignkeys.sql
@@ -0,0 +1,107 @@
+-- good
+ALTER TABLE user_groups ADD CONSTRAINT USER_GROUPS_FK1 FOREIGN KEY (ug_user) REFERENCES user(user_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE user_newtalk ADD CONSTRAINT USER_NEWTALK_FK1 FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
+;
+
+-- referenced value not found
+ALTER TABLE revision ADD CONSTRAINT REVISION_PAGE_FK FOREIGN KEY (rev_page) REFERENCES page(page_id) ON DELETE CASCADE
+;
+-- referenced value not found
+ALTER TABLE revision ADD CONSTRAINT REVISION_USER_FK FOREIGN KEY (rev_user) REFERENCES user(user_id) ON DELETE RESTRICT
+;
+
+-- good
+ALTER TABLE page_restrictions ADD CONSTRAINT PAGE_RESTRICTIONS_PAGE_FK FOREIGN KEY (pr_page) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE page_props ADD CONSTRAINT PAGE_PROPS_PAGE_FK FOREIGN KEY (pp_page) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- cannot contain null values
+-- ALTER TABLE archive ADD CONSTRAINT ARCHIVE_USER_FK FOREIGN KEY (ar_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- referenced value not found
+ALTER TABLE redirect ADD CONSTRAINT REDIRECT_FROM_FK FOREIGN KEY (rd_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- referenced value not found
+ALTER TABLE pagelinks ADD CONSTRAINT PAGELINKS_FROM_FK FOREIGN KEY (pl_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE templatelinks ADD CONSTRAINT TEMPLATELINKS_FROM_FK FOREIGN KEY (tl_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE imagelinks ADD CONSTRAINT IMAGELINKS_FROM_FK FOREIGN KEY (il_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE categorylinks ADD CONSTRAINT CATEGORYLINKS_FROM_FK FOREIGN KEY (cl_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE externallinks ADD CONSTRAINT EXTERNALLINKS_FROM_FK FOREIGN KEY (el_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- good
+ALTER TABLE langlinks ADD CONSTRAINT LANGLINKS_FROM_FK FOREIGN KEY (ll_from) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- cannot contain null values
+-- ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_USER_FK FOREIGN KEY (ipb_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- good
+ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_BY_FK FOREIGN KEY (ipb_by) REFERENCES user(user_id) ON DELETE CASCADE
+;
+
+-- cannot contain null values
+-- ALTER TABLE image ADD CONSTRAINT IMAGE_USER_FK FOREIGN KEY (img_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- cannot contain null values
+-- ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_USER_FK FOREIGN KEY (oi_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- good
+ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_NAME_FK FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
+;
+
+-- cannot contain null values
+-- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_DELETED_USER_FK FOREIGN KEY (fa_deleted_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- cannot contain null values
+-- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_USER_FK FOREIGN KEY (fa_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- cannot contain null values
+-- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_USER_FK FOREIGN KEY (rc_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- cannot contain null values
+-- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_CUR_ID_FK FOREIGN KEY (rc_cur_id) REFERENCES page(page_id) ON DELETE SET NULL
+--;
+
+-- good
+ALTER TABLE watchlist ADD CONSTRAINT WATCHLIST_USER_FK FOREIGN KEY (wl_user) REFERENCES user(user_id) ON DELETE CASCADE
+;
+
+-- good
+-- already in MySQL schema
+ALTER TABLE trackbacks ADD CONSTRAINT TRACKBACKS_PAGE_FK FOREIGN KEY (tb_page) REFERENCES page(page_id) ON DELETE CASCADE
+;
+
+-- cannot contain null values
+-- ALTER TABLE protected_titles ADD CONSTRAINT PROTECTED_TITLES_USER_FK FOREIGN KEY (pt_user) REFERENCES user(user_id) ON DELETE SET NULL
+--;
+
+-- cannot contain null values
+-- ALTER TABLE logging ADD CONSTRAINT LOGGING_USER_FK FOREIGN KEY (log_user) REFERENCES user(user_id) ON DELETE SET NULL
+--; \ No newline at end of file
diff --git a/maintenance/ibm_db2/tables.sql b/maintenance/ibm_db2/tables.sql
index 71c161c6..546c871d 100644
--- a/maintenance/ibm_db2/tables.sql
+++ b/maintenance/ibm_db2/tables.sql
@@ -8,6 +8,7 @@
CREATE TABLE user (
+ -- Needs to start with 0
user_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
user_name VARCHAR(255) NOT NULL UNIQUE,
user_real_name VARCHAR(255),
@@ -47,11 +48,7 @@ CREATE TABLE user_groups (
-- REFERENCES user(user_id) ON DELETE CASCADE,
ug_group VARCHAR(255) NOT NULL
);
-CREATE UNIQUE INDEX user_groups_unique ON user_groups (ug_user, ug_group);
---leonsp:
-CREATE UNIQUE INDEX user_groups_include_idx
- ON user_groups(ug_user)
- INCLUDE (ug_group);
+CREATE INDEX user_groups_unique ON user_groups (ug_user, ug_group);
CREATE TABLE user_newtalk (
@@ -71,7 +68,7 @@ CREATE UNIQUE INDEX user_newtalk_include_idx
CREATE TABLE page (
- page_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
+ page_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
page_namespace SMALLINT NOT NULL,
page_title VARCHAR(255) NOT NULL,
page_restrictions VARCHAR(1024),
@@ -96,7 +93,7 @@ CREATE UNIQUE INDEX page_name_include
CREATE TABLE revision (
- rev_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
+ rev_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
rev_page BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page (page_id) ON DELETE CASCADE,
rev_text_id BIGINT, -- FK
@@ -119,9 +116,7 @@ CREATE INDEX rev_user_text_idx ON revision (rev_user_text);
CREATE TABLE text ( -- replaces reserved word 'text'
- --old_id INTEGER NOT NULL,
- old_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
- --PRIMARY KEY DEFAULT nextval('text_old_id_val'),
+ old_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
old_text CLOB(16M) INLINE LENGTH 4096,
old_flags VARCHAR(1024)
);
@@ -129,8 +124,8 @@ CREATE TABLE text ( -- replaces reserved word 'text'
CREATE TABLE page_restrictions (
--pr_id INTEGER NOT NULL UNIQUE, --DEFAULT nextval('pr_id_val'),
- --pr_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
- pr_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
+ --pr_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ pr_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
pr_page INTEGER NOT NULL DEFAULT 0,
--(used to be nullable)
-- REFERENCES page (page_id) ON DELETE CASCADE,
@@ -184,7 +179,7 @@ CREATE INDEX archive_user_text ON archive (ar_user_text);
CREATE TABLE redirect (
- rd_from BIGINT NOT NULL PRIMARY KEY,
+ rd_from BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--REFERENCES page(page_id) ON DELETE CASCADE,
rd_namespace SMALLINT NOT NULL DEFAULT 0,
rd_title VARCHAR(255) NOT NULL DEFAULT '',
@@ -248,7 +243,7 @@ CREATE INDEX externallinks_index ON externallinks (el_index);
--
CREATE TABLE external_user (
-- Foreign key to user_id
- eu_local_id BIGINT NOT NULL PRIMARY KEY,
+ eu_local_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-- Some opaque identifier provided by the external database
eu_external_id VARCHAR(255) NOT NULL
@@ -289,7 +284,7 @@ CREATE TABLE hitcounter (
);
CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL PRIMARY KEY,
+ ipb_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--DEFAULT nextval('ipblocks_ipb_id_val'),
ipb_address VARCHAR(1024),
ipb_user BIGINT NOT NULL DEFAULT 0,
@@ -358,7 +353,6 @@ CREATE TABLE oldimage (
oi_sha1 VARCHAR(255) NOT NULL DEFAULT ''
--FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
);
---ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascade FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE;
CREATE INDEX oi_name_timestamp ON oldimage (oi_name,oi_timestamp);
CREATE INDEX oi_name_archive_name ON oldimage (oi_name,oi_archive_name);
CREATE INDEX oi_sha1 ON oldimage (oi_sha1);
@@ -366,7 +360,7 @@ CREATE INDEX oi_sha1 ON oldimage (oi_sha1);
CREATE TABLE filearchive (
- fa_id INTEGER NOT NULL PRIMARY KEY,
+ fa_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--PRIMARY KEY DEFAULT nextval('filearchive_fa_id_seq'),
fa_name VARCHAR(255) NOT NULL,
fa_archive_name VARCHAR(255),
@@ -398,7 +392,7 @@ CREATE INDEX fa_nouser ON filearchive (fa_deleted_user);
CREATE TABLE recentchanges (
- rc_id INTEGER NOT NULL PRIMARY KEY,
+ rc_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--PRIMARY KEY DEFAULT nextval('rc_rc_id_seq'),
rc_timestamp TIMESTAMP(3) NOT NULL,
rc_cur_time TIMESTAMP(3) NOT NULL,
@@ -509,7 +503,7 @@ CREATE TABLE transcache (
CREATE TABLE logging (
- log_id BIGINT NOT NULL PRIMARY KEY,
+ log_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--PRIMARY KEY DEFAULT nextval('log_log_id_seq'),
log_type VARCHAR(32) NOT NULL,
log_action VARCHAR(32) NOT NULL,
@@ -534,10 +528,11 @@ CREATE INDEX log_page_id_time ON logging (log_page,log_timestamp);
CREATE TABLE trackbacks (
- tb_id INTEGER NOT NULL PRIMARY KEY,
+ tb_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--PRIMARY KEY DEFAULT nextval('trackbacks_tb_id_seq'),
-- foreign key also in MySQL
- tb_page INTEGER REFERENCES page(page_id) ON DELETE CASCADE,
+ tb_page INTEGER,
+ -- REFERENCES page(page_id) ON DELETE CASCADE,
tb_title VARCHAR(255) NOT NULL,
tb_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
tb_ex CLOB(64K) INLINE LENGTH 4096,
@@ -548,7 +543,7 @@ CREATE INDEX trackback_page ON trackbacks (tb_page);
CREATE TABLE job (
- job_id BIGINT NOT NULL PRIMARY KEY,
+ job_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
job_cmd VARCHAR(255) NOT NULL,
job_namespace SMALLINT NOT NULL,
@@ -558,47 +553,6 @@ CREATE TABLE job (
CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
-
--- Postgres' Tsearch2 dropped
---ALTER TABLE page ADD titlevector tsvector;
---CREATE FUNCTION ts2_page_title() RETURNS TRIGGER LANGUAGE plpgsql AS
---$mw$
---BEGIN
---IF TG_OP = 'INSERT' THEN
--- NEW.titlevector = to_tsvector('default',REPLACE(NEW.page_title,'/',' '));
---ELSIF NEW.page_title != OLD.page_title THEN
--- NEW.titlevector := to_tsvector('default',REPLACE(NEW.page_title,'/',' '));
---END IF;
---RETURN NEW;
---END;
---$mw$;
-
---CREATE TRIGGER ts2_page_title BEFORE INSERT OR UPDATE ON page
--- FOR EACH ROW EXECUTE PROCEDURE ts2_page_title();
-
-
---ALTER TABLE text ADD textvector tsvector;
---CREATE FUNCTION ts2_page_text() RETURNS TRIGGER LANGUAGE plpgsql AS
---$mw$
---BEGIN
---IF TG_OP = 'INSERT' THEN
--- NEW.textvector = to_tsvector('default',NEW.old_text);
---ELSIF NEW.old_text != OLD.old_text THEN
--- NEW.textvector := to_tsvector('default',NEW.old_text);
---END IF;
---RETURN NEW;
---END;
---$mw$;
-
---CREATE TRIGGER ts2_page_text BEFORE INSERT OR UPDATE ON text
--- FOR EACH ROW EXECUTE PROCEDURE ts2_page_text();
-
--- These are added by the setup script due to version compatibility issues
--- If using 8.1, we switch from "gin" to "gist"
-
---CREATE INDEX ts2_page_title ON page USING gin(titlevector);
---CREATE INDEX ts2_page_text ON text USING gin(textvector);
-
--TODO
--CREATE FUNCTION add_interwiki (TEXT,INT,SMALLINT) RETURNS INT LANGUAGE SQL AS
--$mw$
@@ -644,7 +598,7 @@ CREATE TABLE updatelog (
CREATE TABLE category (
- cat_id INTEGER NOT NULL PRIMARY KEY,
+ cat_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--PRIMARY KEY DEFAULT nextval('category_id_seq'),
cat_title VARCHAR(255) NOT NULL,
cat_pages INTEGER NOT NULL DEFAULT 0,
@@ -721,27 +675,6 @@ CREATE TABLE log_search (
CREATE UNIQUE INDEX ls_field_val ON log_search (ls_field,ls_value,ls_log_id);
CREATE INDEX ls_log_id ON log_search (ls_log_id);
-CREATE TABLE mediawiki_version (
- type VARCHAR(1024) NOT NULL,
- mw_version VARCHAR(1024) NOT NULL,
- notes VARCHAR(1024) ,
-
- pg_version VARCHAR(1024) ,
- pg_dbname VARCHAR(1024) ,
- pg_user VARCHAR(1024) ,
- pg_port VARCHAR(1024) ,
- mw_schema VARCHAR(1024) ,
- ts2_schema VARCHAR(1024) ,
- ctype VARCHAR(1024) ,
-
- sql_version VARCHAR(1024) ,
- sql_date VARCHAR(1024) ,
- cdate TIMESTAMP(3) NOT NULL DEFAULT CURRENT TIMESTAMP
-);
-
-INSERT INTO mediawiki_version (type,mw_version,sql_version,sql_date)
- VALUES ('Creation','??','$LastChangedRevision: 34049 $','$LastChangedDate: 2008-04-30 10:20:36 -0400 (Wed, 30 Apr 2008) $');
-
-- Table for storing localisation data
CREATE TABLE l10n_cache (
-- Language code
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index 714d76d8..5f47635e 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -24,7 +24,7 @@
$optionsWithArgs = array( 'report' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
/**
* @ingroup Maintenance
@@ -38,7 +38,7 @@ class BackupReader {
var $debug = false;
var $uploads = false;
- function BackupReader() {
+ function __construct() {
$this->stderr = fopen( "php://stderr", "wt" );
}
@@ -48,7 +48,7 @@ class BackupReader {
function handleRevision( $rev ) {
$title = $rev->getTitle();
- if( !$title ) {
+ if ( !$title ) {
$this->progress( "Got bogus revision with null title!" );
return;
}
@@ -56,20 +56,20 @@ class BackupReader {
$this->revCount++;
$this->report();
- if( !$this->dryRun ) {
+ if ( !$this->dryRun ) {
call_user_func( $this->importCallback, $rev );
}
}
-
+
function handleUpload( $revision ) {
- if( $this->uploads ) {
+ if ( $this->uploads ) {
$this->uploadCount++;
- //$this->report();
+ // $this->report();
$this->progress( "upload: " . $revision->getFilename() );
-
- if( !$this->dryRun ) {
+
+ if ( !$this->dryRun ) {
// bluuuh hack
- //call_user_func( $this->uploadCallback, $revision );
+ // call_user_func( $this->uploadCallback, $revision );
$dbw = wfGetDB( DB_MASTER );
return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
}
@@ -80,34 +80,34 @@ class BackupReader {
$this->revCount++;
$this->report();
- if( !$this->dryRun ) {
+ if ( !$this->dryRun ) {
call_user_func( $this->logItemCallback, $rev );
}
}
function report( $final = false ) {
- if( $final xor ( $this->pageCount % $this->reportingInterval == 0 ) ) {
+ if ( $final xor ( $this->pageCount % $this->reportingInterval == 0 ) ) {
$this->showReport();
}
}
function showReport() {
- if( $this->reporting ) {
+ if ( $this->reporting ) {
$delta = wfTime() - $this->startTime;
- if( $delta ) {
- $rate = sprintf("%.2f", $this->pageCount / $delta);
- $revrate = sprintf("%.2f", $this->revCount / $delta);
+ if ( $delta ) {
+ $rate = sprintf( "%.2f", $this->pageCount / $delta );
+ $revrate = sprintf( "%.2f", $this->revCount / $delta );
} else {
$rate = '-';
$revrate = '-';
}
# Logs dumps don't have page tallies
- if( $this->pageCount )
+ if ( $this->pageCount )
$this->progress( "$this->pageCount ($rate pages/sec $revrate revs/sec)" );
else
$this->progress( "$this->revCount ($revrate revs/sec)" );
}
- wfWaitForSlaves(5);
+ wfWaitForSlaves( 5 );
}
function progress( $string ) {
@@ -115,19 +115,17 @@ class BackupReader {
}
function importFromFile( $filename ) {
- $t = true;
- if( preg_match( '/\.gz$/', $filename ) ) {
+ if ( preg_match( '/\.gz$/', $filename ) ) {
$filename = 'compress.zlib://' . $filename;
}
- elseif( preg_match( '/\.bz2$/', $filename ) ) {
+ elseif ( preg_match( '/\.bz2$/', $filename ) ) {
$filename = 'compress.bzip2://' . $filename;
}
- elseif( preg_match( '/\.7z$/', $filename ) ) {
+ elseif ( preg_match( '/\.7z$/', $filename ) ) {
$filename = 'mediawiki.compress.7z://' . $filename;
- $t = false;
}
- $file = fopen( $filename, $t ? 'rt' : 't' ); //our 7zip wrapper uses popen, which seems not to like two-letter modes
+ $file = fopen( $filename, 'rt' );
return $this->importFromHandle( $file );
}
@@ -151,43 +149,41 @@ class BackupReader {
$this->logItemCallback = $importer->setLogItemCallback(
array( &$this, 'handleLogItem' ) );
+ if ( $this->dryRun ) {
+ $importer->setPageOutCallback( null );
+ }
+
return $importer->doImport();
}
}
-if( wfReadOnly() ) {
+if ( wfReadOnly() ) {
wfDie( "Wiki is in read-only mode; you'll need to disable it for import to work.\n" );
}
$reader = new BackupReader();
-if( isset( $options['quiet'] ) ) {
+if ( isset( $options['quiet'] ) ) {
$reader->reporting = false;
}
-if( isset( $options['report'] ) ) {
+if ( isset( $options['report'] ) ) {
$reader->reportingInterval = intval( $options['report'] );
}
-if( isset( $options['dry-run'] ) ) {
+if ( isset( $options['dry-run'] ) ) {
$reader->dryRun = true;
}
-if( isset( $options['debug'] ) ) {
+if ( isset( $options['debug'] ) ) {
$reader->debug = true;
}
-if( isset( $options['uploads'] ) ) {
+if ( isset( $options['uploads'] ) ) {
$reader->uploads = true; // experimental!
}
-if( isset( $args[0] ) ) {
+if ( isset( $args[0] ) ) {
$result = $reader->importFromFile( $args[0] );
} else {
$result = $reader->importFromStdin();
}
-if( WikiError::isError( $result ) ) {
- echo $result->getMessage() . "\n";
-} else {
- echo "Done!\n";
- echo "You might want to run rebuildrecentchanges.php to regenerate\n";
- echo "the recentchanges page.\n";
-}
-
-
+echo "Done!\n";
+echo "You might want to run rebuildrecentchanges.php to regenerate\n";
+echo "the recentchanges page.\n";
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
index 7bb50eb8..ad88b07c 100644
--- a/maintenance/importImages.inc
+++ b/maintenance/importImages.inc
@@ -17,13 +17,14 @@
* @return mixed Array of filenames on success, or false on failure
*/
function findFiles( $dir, $exts ) {
- if( is_dir( $dir ) ) {
- if( $dhl = opendir( $dir ) ) {
+ if ( is_dir( $dir ) ) {
+ $dhl = opendir( $dir );
+ if ( $dhl ) {
$files = array();
- while( ( $file = readdir( $dhl ) ) !== false ) {
- if( is_file( $dir . '/' . $file ) ) {
+ while ( ( $file = readdir( $dhl ) ) !== false ) {
+ if ( is_file( $dir . '/' . $file ) ) {
list( /* $name */, $ext ) = splitFilename( $dir . '/' . $file );
- if( array_search( strtolower( $ext ), $exts ) !== false )
+ if ( array_search( strtolower( $ext ), $exts ) !== false )
$files[] = $dir . '/' . $file;
}
}
@@ -51,10 +52,10 @@ function splitFilename( $filename ) {
}
/**
- * Find an auxilliary file with the given extension, matching
- * the give base file path. $maxStrip determines how many extensions
+ * Find an auxilliary file with the given extension, matching
+ * the give base file path. $maxStrip determines how many extensions
* may be stripped from the original file name before appending the
- * new extension. For example, with $maxStrip = 1 (the default),
+ * new extension. For example, with $maxStrip = 1 (the default),
* file files acme.foo.bar.txt and acme.foo.txt would be auxilliary
* files for acme.foo.bar and the extension ".txt". With $maxStrip = 2,
* acme.txt would also be acceptable.
@@ -90,23 +91,23 @@ function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
}
# FIXME: Access the api in a saner way and performing just one query (preferably batching files too).
-function getFileCommentFromSourceWiki($wiki_host, $file) {
- $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:' . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
- $body = Http::get($url);
- if (preg_match('#<ii comment="([^"]*)" />#', $body, $matches) == 0) {
- return false;
- }
+function getFileCommentFromSourceWiki( $wiki_host, $file ) {
+ $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:' . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+ $body = Http::get( $url );
+ if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
+ return false;
+ }
- return html_entity_decode( $matches[1] );
+ return html_entity_decode( $matches[1] );
}
-function getFileUserFromSourceWiki($wiki_host, $file) {
- $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:' . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
- $body = Http::get($url);
- if (preg_match('#<ii user="([^"]*)" />#', $body, $matches) == 0) {
- return false;
- }
+function getFileUserFromSourceWiki( $wiki_host, $file ) {
+ $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:' . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+ $body = Http::get( $url );
+ if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
+ return false;
+ }
- return html_entity_decode( $matches[1] );
+ return html_entity_decode( $matches[1] );
}
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index f0dd388a..befbe64d 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -18,23 +18,23 @@
*/
$optionsWithArgs = array( 'extensions', 'comment', 'comment-file', 'comment-ext', 'user', 'license', 'sleep', 'limit', 'from', 'source-wiki-url' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-require_once( dirname(__FILE__) . '/importImages.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/importImages.inc' );
$processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
echo( "Import Images\n\n" );
# Need a path
-if( count( $args ) > 0 ) {
+if ( count( $args ) > 0 ) {
$dir = $args[0];
# Check Protection
- if (isset($options['protect']) && isset($options['unprotect']))
- die("Cannot specify both protect and unprotect. Only 1 is allowed.\n");
+ if ( isset( $options['protect'] ) && isset( $options['unprotect'] ) )
+ die( "Cannot specify both protect and unprotect. Only 1 is allowed.\n" );
-if (isset($options['protect']) && $options['protect'] == 1)
- die("You must specify a protection option.\n");
+ if ( isset( $options['protect'] ) && $options['protect'] == 1 )
+ die( "You must specify a protection option.\n" );
# Prepare the list of allowed extensions
global $wgFileExtensions;
@@ -49,31 +49,31 @@ if (isset($options['protect']) && $options['protect'] == 1)
$user = isset( $options['user'] )
? User::newFromName( $options['user'] )
: User::newFromName( 'Maintenance script' );
- if( !$user instanceof User )
+ if ( !$user instanceof User )
$user = User::newFromName( 'Maintenance script' );
$wgUser = $user;
# Get block check. If a value is given, this specified how often the check is performed
if ( isset( $options['check-userblock'] ) ) {
if ( !$options['check-userblock'] ) $checkUserBlock = 1;
- else $checkUserBlock = (int)$options['check-userblock'];
+ else $checkUserBlock = (int)$options['check-userblock'];
} else {
$checkUserBlock = false;
}
- # Get --from
+ # Get --from
$from = @$options['from'];
- # Get sleep time.
+ # Get sleep time.
$sleep = @$options['sleep'];
- if ( $sleep ) $sleep = (int)$sleep;
+ if ( $sleep ) $sleep = (int)$sleep;
# Get limit number
$limit = @$options['limit'];
- if ( $limit ) $limit = (int)$limit;
+ if ( $limit ) $limit = (int)$limit;
- # Get the upload comment
- $comment = NULL;
+ # Get the upload comment. Provide a default one in case there's no comment given.
+ $comment = 'Importing image file';
if ( isset( $options['comment-file'] ) ) {
$comment = file_get_contents( $options['comment-file'] );
@@ -91,18 +91,18 @@ if (isset($options['protect']) && $options['protect'] == 1)
$license = isset( $options['license'] ) ? $options['license'] : '';
# Batch "upload" operation
- if( ( $count = count( $files ) ) > 0 ) {
-
- foreach( $files as $file ) {
+ if ( ( $count = count( $files ) ) > 0 ) {
+
+ foreach ( $files as $file ) {
$base = wfBaseName( $file );
-
+
# Validate a title
$title = Title::makeTitleSafe( NS_FILE, $base );
- if( !is_object( $title ) ) {
+ if ( !is_object( $title ) ) {
echo( "{$base} could not be imported; a valid title cannot be produced\n" );
continue;
}
-
+
if ( $from ) {
if ( $from == $title->getDBkey() ) {
$from = NULL;
@@ -113,7 +113,7 @@ if (isset($options['protect']) && $options['protect'] == 1)
}
if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
- $user->clearInstanceCache( 'name' ); //reload from DB!
+ $user->clearInstanceCache( 'name' ); // reload from DB!
if ( $user->isBlocked() ) {
echo( $user->getName() . " was blocked! Aborting.\n" );
break;
@@ -122,8 +122,8 @@ if (isset($options['protect']) && $options['protect'] == 1)
# Check existence
$image = wfLocalFile( $title );
- if( $image->exists() ) {
- if( isset( $options['overwrite'] ) ) {
+ if ( $image->exists() ) {
+ if ( isset( $options['overwrite'] ) ) {
echo( "{$base} exists, overwriting..." );
$svar = 'overwritten';
} else {
@@ -134,7 +134,7 @@ if (isset($options['protect']) && $options['protect'] == 1)
} else {
if ( isset( $options['skip-dupes'] ) ) {
$repo = $image->getRepo();
- $sha1 = File::sha1Base36( $file ); #XXX: we end up calculating this again when actually uploading. that sucks.
+ $sha1 = File::sha1Base36( $file ); # XXX: we end up calculating this again when actually uploading. that sucks.
$dupes = $repo->findBySha1( $sha1 );
@@ -149,73 +149,73 @@ if (isset($options['protect']) && $options['protect'] == 1)
$svar = 'added';
}
- if (isset( $options['source-wiki-url'])) {
- /* find comment text directly from source wiki, through MW's API */
- $real_comment = getFileCommentFromSourceWiki($options['source-wiki-url'], $base);
- if ($real_comment === false)
- $commentText = $comment;
- else
- $commentText = $real_comment;
-
- /* find user directly from source wiki, through MW's API */
- $real_user = getFileUserFromSourceWiki($options['source-wiki-url'], $base);
- if ($real_user === false) {
- $wgUser = $user;
- } else {
- $wgUser = User::newFromName($real_user);
- if ($wgUser === false) {
- # user does not exist in target wiki
- echo ("failed: user '$real_user' does not exist in target wiki.");
- continue;
- }
- }
- } else {
- # Find comment text
- $commentText = false;
-
- if ( $commentExt ) {
- $f = findAuxFile( $file, $commentExt );
- if ( !$f ) {
- echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
- } else {
- $commentText = file_get_contents( $f );
- if ( !$f ) {
- echo( " Failed to load comment file {$f}, using default comment. " );
- }
- }
- }
-
- if ( !$commentText ) {
- $commentText = $comment;
- }
- }
-
-
- # Import the file
+ if ( isset( $options['source-wiki-url'] ) ) {
+ /* find comment text directly from source wiki, through MW's API */
+ $real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
+ if ( $real_comment === false )
+ $commentText = $comment;
+ else
+ $commentText = $real_comment;
+
+ /* find user directly from source wiki, through MW's API */
+ $real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
+ if ( $real_user === false ) {
+ $wgUser = $user;
+ } else {
+ $wgUser = User::newFromName( $real_user );
+ if ( $wgUser === false ) {
+ # user does not exist in target wiki
+ echo ( "failed: user '$real_user' does not exist in target wiki." );
+ continue;
+ }
+ }
+ } else {
+ # Find comment text
+ $commentText = false;
+
+ if ( $commentExt ) {
+ $f = findAuxFile( $file, $commentExt );
+ if ( !$f ) {
+ echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
+ } else {
+ $commentText = file_get_contents( $f );
+ if ( !$f ) {
+ echo( " Failed to load comment file {$f}, using default comment. " );
+ }
+ }
+ }
+
+ if ( !$commentText ) {
+ $commentText = $comment;
+ }
+ }
+
+
+ # Import the file
if ( isset( $options['dry'] ) ) {
echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
} else {
$archive = $image->publish( $file );
- if( WikiError::isError( $archive ) || !$archive->isGood() ) {
+ if ( !$archive->isGood() ) {
echo( "failed.\n" );
$failed++;
continue;
}
}
-
+
$doProtect = false;
$restrictions = array();
-
+
global $wgRestrictionLevels;
-
- $protectLevel = isset($options['protect']) ? $options['protect'] : null;
-
+
+ $protectLevel = isset( $options['protect'] ) ? $options['protect'] : null;
+
if ( $protectLevel && in_array( $protectLevel, $wgRestrictionLevels ) ) {
$restrictions['move'] = $protectLevel;
$restrictions['edit'] = $protectLevel;
$doProtect = true;
}
- if (isset($options['unprotect'])) {
+ if ( isset( $options['unprotect'] ) ) {
$restrictions['move'] = '';
$restrictions['edit'] = '';
$doProtect = true;
@@ -227,26 +227,26 @@ if (isset($options['protect']) && $options['protect'] == 1)
} else if ( $image->recordUpload( $archive->value, $commentText, $license ) ) {
# We're done!
echo( "done.\n" );
- if ($doProtect) {
+ if ( $doProtect ) {
# Protect the file
$article = new Article( $title );
echo "\nWaiting for slaves...\n";
// Wait for slaves.
- sleep(2.0);
+ sleep( 2.0 );
wfWaitForSlaves( 1.0 );
-
+
echo( "\nSetting image restrictions ... " );
- if ( $article->updateRestrictions($restrictions) )
- echo( "done.\n" );
+ if ( $article->updateRestrictions( $restrictions ) )
+ echo( "done.\n" );
else
- echo( "failed.\n" );
+ echo( "failed.\n" );
}
} else {
echo( "failed.\n" );
$svar = 'failed';
}
-
+
$$svar++;
$processed++;
@@ -256,16 +256,16 @@ if (isset($options['protect']) && $options['protect'] == 1)
if ( $sleep )
sleep( $sleep );
}
-
+
# Print out some statistics
echo( "\n" );
- foreach( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
- 'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
+ foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
+ 'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
'failed' => 'Failed' ) as $var => $desc ) {
- if( $$var > 0 )
+ if ( $$var > 0 )
echo( "{$desc}: {$$var}\n" );
}
-
+
} else {
echo( "No suitable files could be found for import.\n" );
}
@@ -274,10 +274,10 @@ if (isset($options['protect']) && $options['protect'] == 1)
showUsage();
}
-exit(0);
+exit( 0 );
function showUsage( $reason = false ) {
- if( $reason ) {
+ if ( $reason ) {
echo( $reason . "\n" );
}
@@ -292,7 +292,7 @@ Options:
--overwrite Overwrite existing images with the same name (default is to skip them)
--limit=<num> Limit the number of images to process. Ignored or skipped images are not counted.
--from=<name> Ignore all files until the one with the given name. Useful for resuming
- aborted imports. <name> should be the file's canonical database form.
+ aborted imports. <name> should be the file's canonical database form.
--skip-dupes Skip images that were already uploaded under a different name (check SHA1)
--sleep=<sec> Sleep between files. Useful mostly for debugging.
--user=<username> Set username of uploader, default 'Maintenance script'
@@ -306,8 +306,8 @@ Options:
--protect=<protect> Specify the protect value (autoconfirmed,sysop)
--unprotect Unprotects all uploaded images
--source-wiki-url if specified, take User and Comment data for each imported file from this URL.
- For example, --source-wiki-url="http://en.wikipedia.org/"
+ For example, --source-wiki-url="http://en.wikipedia.org/"
TEXT;
- exit(1);
+ exit( 1 );
}
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
index 955d01f4..3b77eb5f 100644
--- a/maintenance/importTextFile.php
+++ b/maintenance/importTextFile.php
@@ -11,30 +11,30 @@
$options = array( 'help', 'nooverwrite', 'norc' );
$optionsWithArgs = array( 'title', 'user', 'comment' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
echo( "Import Text File\n\n" );
-if( count( $args ) < 1 || isset( $options['help'] ) ) {
+if ( count( $args ) < 1 || isset( $options['help'] ) ) {
showHelp();
} else {
$filename = $args[0];
echo( "Using {$filename}..." );
- if( is_file( $filename ) ) {
+ if ( is_file( $filename ) ) {
$title = isset( $options['title'] ) ? $options['title'] : titleFromFilename( $filename );
$title = Title::newFromURL( $title );
- if( is_object( $title ) ) {
+ if ( is_object( $title ) ) {
echo( "\nUsing title '" . $title->getPrefixedText() . "'..." );
- if( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
+ if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
$text = file_get_contents( $filename );
$user = isset( $options['user'] ) ? $options['user'] : 'Maintenance script';
$user = User::newFromName( $user );
- if( is_object( $user ) ) {
+ if ( is_object( $user ) ) {
echo( "\nUsing username '" . $user->getName() . "'..." );
$wgUser =& $user;
diff --git a/maintenance/importUseModWiki.php b/maintenance/importUseModWiki.php
index 0d014145..bff4cd02 100644
--- a/maintenance/importUseModWiki.php
+++ b/maintenance/importUseModWiki.php
@@ -26,7 +26,7 @@
* @ingroup Maintenance
*/
-if( php_sapi_name() != 'cli' ) {
+if ( php_sapi_name() != 'cli' ) {
echo "Please customize the settings and run me from the command line.";
die( -1 );
}
@@ -41,9 +41,9 @@ $wgRootDirectory = "/kalman/Projects/wiki2002/wiki/lib-http/db/wiki";
/* globals */
$wgFieldSeparator = "\xb3"; # Some wikis may use different char
$FS = $wgFieldSeparator ;
- $FS1 = $FS."1" ;
- $FS2 = $FS."2" ;
- $FS3 = $FS."3" ;
+ $FS1 = $FS . "1" ;
+ $FS2 = $FS . "2" ;
+ $FS3 = $FS . "3" ;
# Unicode sanitization tools
require_once( dirname( dirname( __FILE__ ) ) . '/includes/normal/UtfNormal.php' );
@@ -60,13 +60,13 @@ function importPages()
$gt = '>';
echo <<<XML
-<?xml version="1.0" encoding="UTF-8" ?$gt
+<?xml version="1.0" encoding="UTF-8" ?>
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.1/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.1/
- http://www.mediawiki.org/xml/export-0.1.xsd"
- version="0.1"
- xml:lang="en">
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.1/
+ http://www.mediawiki.org/xml/export-0.1.xsd"
+ version="0.1"
+ xml:lang="en">
<!-- generated by importUseModWiki.php -->
XML;
@@ -74,9 +74,9 @@ XML;
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'other' );
- foreach( $letters as $letter ) {
+ foreach ( $letters as $letter ) {
$dir = "$wgRootDirectory/page/$letter";
- if( is_dir( $dir ) )
+ if ( is_dir( $dir ) )
importPageDirectory( $dir );
}
echo <<<XML
@@ -89,13 +89,13 @@ function importPageDirectory( $dir, $prefix = "" )
{
echo "\n<!-- Checking page directory " . xmlCommentSafe( $dir ) . " -->\n";
$mydir = opendir( $dir );
- while( $entry = readdir( $mydir ) ) {
+ while ( $entry = readdir( $mydir ) ) {
$m = array();
- if( preg_match( '/^(.+)\.db$/', $entry, $m ) ) {
+ if ( preg_match( '/^(.+)\.db$/', $entry, $m ) ) {
echo importPage( $prefix . $m[1] );
} else {
- if( is_dir( "$dir/$entry" ) ) {
- if( $entry != '.' && $entry != '..' ) {
+ if ( is_dir( "$dir/$entry" ) ) {
+ if ( $entry != '.' && $entry != '..' ) {
importPageDirectory( "$dir/$entry", "$entry/" );
}
} else {
@@ -114,7 +114,7 @@ function importPageDirectory( $dir, $prefix = "" )
function useModFilename( $title ) {
$c = substr( $title, 0, 1 );
- if(preg_match( '/[A-Z]/i', $c ) ) {
+ if ( preg_match( '/[A-Z]/i', $c ) ) {
return strtoupper( $c ) . "/$title";
}
return "other/$title";
@@ -122,10 +122,10 @@ function useModFilename( $title ) {
function fetchPage( $title )
{
- global $FS1,$FS2,$FS3, $wgRootDirectory;
+ global $FS1, $FS2, $FS3, $wgRootDirectory;
$fname = $wgRootDirectory . "/page/" . useModFilename( $title ) . ".db";
- if( !file_exists( $fname ) ) {
+ if ( !file_exists( $fname ) ) {
echo "Couldn't open file '$fname' for page '$title'.\n";
die( -1 );
}
@@ -141,19 +141,19 @@ function fetchPage( $title )
function fetchKeptPages( $title )
{
- global $FS1,$FS2,$FS3, $wgRootDirectory;
+ global $FS1, $FS2, $FS3, $wgRootDirectory;
$fname = $wgRootDirectory . "/keep/" . useModFilename( $title ) . ".kp";
- if( !file_exists( $fname ) ) return array();
+ if ( !file_exists( $fname ) ) return array();
$keptlist = explode( $FS1, file_get_contents( $fname ) );
array_shift( $keptlist ); # Drop the junk at beginning of file
$revisions = array();
- foreach( $keptlist as $rev ) {
+ foreach ( $keptlist as $rev ) {
$section = splitHash( $FS2, $rev );
$text = splitHash( $FS3, $section["data"] );
- if ( $text["text"] && $text["minor"] != "" && ( $section["ts"]*1 > 0 ) ) {
+ if ( $text["text"] && $text["minor"] != "" && ( $section["ts"] * 1 > 0 ) ) {
array_push( $revisions, array2object( array ( "text" => $text["text"] , "summary" => $text["summary"] ,
"minor" => $text["minor"] , "ts" => $section["ts"] ,
"username" => $section["username"] , "host" => $section["host"] ) ) );
@@ -167,7 +167,7 @@ function fetchKeptPages( $title )
function splitHash ( $sep , $str ) {
$temp = explode ( $sep , $str ) ;
$ret = array () ;
- for ( $i = 0; $i+1 < count ( $temp ) ; $i++ ) {
+ for ( $i = 0; $i + 1 < count ( $temp ) ; $i++ ) {
$ret[$temp[$i]] = $temp[++$i] ;
}
return $ret ;
@@ -182,8 +182,8 @@ function checkUserCache( $name, $host )
{
global $usercache;
- if( $name ) {
- if( in_array( $name, $usercache ) ) {
+ if ( $name ) {
+ if ( in_array( $name, $usercache ) ) {
$userid = $usercache[$name];
} else {
# If we haven't imported user accounts
@@ -199,15 +199,13 @@ function checkUserCache( $name, $host )
function importPage( $title )
{
- global $usercache;
-
echo "\n<!-- Importing page " . xmlCommentSafe( $title ) . " -->\n";
$page = fetchPage( $title );
$newtitle = xmlsafe( str_replace( '_', ' ', recodeText( $title ) ) );
$munged = mungeFormat( $page->text );
- if( $munged != $page->text ) {
+ if ( $munged != $page->text ) {
/**
* Save a *new* revision with the conversion, and put the
* previous last version into the history.
@@ -235,13 +233,13 @@ XML;
# History
$revisions = array_merge( $revisions, fetchKeptPages( $title ) );
- if(count( $revisions ) == 0 ) {
+ if ( count( $revisions ) == 0 ) {
return NULL; // Was "$sql", which does not appear to be defined.
}
- foreach( $revisions as $rev ) {
+ foreach ( $revisions as $rev ) {
$text = xmlsafe( recodeText( $rev->text ) );
- $minor = ($rev->minor ? '<minor/>' : '');
+ $minor = ( $rev->minor ? '<minor/>' : '' );
list( /* $userid */ , $username ) = checkUserCache( $rev->username, $rev->host );
$username = xmlsafe( recodeText( $username ) );
$timestamp = xmlsafe( timestamp2ISO8601( $rev->ts ) );
@@ -272,22 +270,22 @@ function recodeText( $string ) {
return $string;
}
-function wfUtf8Sequence($codepoint) {
- if($codepoint < 0x80) return chr($codepoint);
- if($codepoint < 0x800) return chr($codepoint >> 6 & 0x3f | 0xc0) .
- chr($codepoint & 0x3f | 0x80);
- if($codepoint < 0x10000) return chr($codepoint >> 12 & 0x0f | 0xe0) .
- chr($codepoint >> 6 & 0x3f | 0x80) .
- chr($codepoint & 0x3f | 0x80);
- if($codepoint < 0x100000) return chr($codepoint >> 18 & 0x07 | 0xf0) . # Double-check this
- chr($codepoint >> 12 & 0x3f | 0x80) .
- chr($codepoint >> 6 & 0x3f | 0x80) .
- chr($codepoint & 0x3f | 0x80);
+function wfUtf8Sequence( $codepoint ) {
+ if ( $codepoint < 0x80 ) return chr( $codepoint );
+ if ( $codepoint < 0x800 ) return chr( $codepoint >> 6 & 0x3f | 0xc0 ) .
+ chr( $codepoint & 0x3f | 0x80 );
+ if ( $codepoint < 0x10000 ) return chr( $codepoint >> 12 & 0x0f | 0xe0 ) .
+ chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+ chr( $codepoint & 0x3f | 0x80 );
+ if ( $codepoint < 0x100000 ) return chr( $codepoint >> 18 & 0x07 | 0xf0 ) . # Double-check this
+ chr( $codepoint >> 12 & 0x3f | 0x80 ) .
+ chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+ chr( $codepoint & 0x3f | 0x80 );
# Doesn't yet handle outside the BMP
return "&#$codepoint;";
}
-function wfMungeToUtf8($string) {
+function wfMungeToUtf8( $string ) {
$string = preg_replace ( '/&#([0-9]+);/e', 'wfUtf8Sequence($1)', $string );
$string = preg_replace ( '/&#x([0-9a-f]+);/ie', 'wfUtf8Sequence(0x$1)', $string );
# Should also do named entities here
@@ -295,7 +293,7 @@ function wfMungeToUtf8($string) {
}
function timestamp2ISO8601( $ts ) {
- #2003-08-05T18:30:02Z
+ # 2003-08-05T18:30:02Z
return gmdate( 'Y-m-d', $ts ) . 'T' . gmdate( 'H:i:s', $ts ) . 'Z';
}
@@ -318,7 +316,7 @@ function xmlCommentSafe( $text ) {
function array2object( $arr ) {
$o = (object)0;
- foreach( $arr as $x => $y ) {
+ foreach ( $arr as $x => $y ) {
$o->$x = $y;
}
return $o;
diff --git a/maintenance/initEditCount.php b/maintenance/initEditCount.php
index b7301643..e421e29b 100644
--- a/maintenance/initEditCount.php
+++ b/maintenance/initEditCount.php
@@ -1,5 +1,8 @@
<?php
/**
+ * Init the user_editcount database field based on the number of rows in the
+ * revision 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
@@ -15,10 +18,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class InitEditCount extends Maintenance {
public function __construct() {
@@ -30,12 +34,11 @@ class InitEditCount extends Maintenance {
Background mode will be automatically used if the server is MySQL 4.0
(which does not support subqueries) or if multiple servers are listed
-in $wgDBservers, usually indicating a replication environment.' );
+in the load balancer, usually indicating a replication environment.' );
$this->mDescription = "Batch-recalculate user_editcount fields from the revision table";
}
public function execute() {
- global $wgDBservers;
$dbw = wfGetDB( DB_MASTER );
$user = $dbw->tableName( 'user' );
$revision = $dbw->tableName( 'revision' );
@@ -43,16 +46,16 @@ in $wgDBservers, usually indicating a replication environment.' );
$dbver = $dbw->getServerVersion();
// Autodetect mode...
- $backgroundMode = count( $wgDBservers ) > 1 ||
- ($dbw instanceof DatabaseMySql && version_compare( $dbver, '4.1' ) < 0);
-
- if( $this->hasOption('background') ) {
+ $backgroundMode = wfGetLB()->getServerCount() > 1 ||
+ ( $dbw instanceof DatabaseMysql && version_compare( $dbver, '4.1' ) < 0 );
+
+ if ( $this->hasOption( 'background' ) ) {
$backgroundMode = true;
- } elseif( $this->hasOption('quick') ) {
+ } elseif ( $this->hasOption( 'quick' ) ) {
$backgroundMode = false;
}
- if( $backgroundMode ) {
+ if ( $backgroundMode ) {
$this->output( "Using replication-friendly background mode...\n" );
$dbr = wfGetDB( DB_SLAVE );
@@ -61,7 +64,7 @@ in $wgDBservers, usually indicating a replication environment.' );
$start = microtime( true );
$migrated = 0;
- for( $min = 0; $min <= $lastUser; $min += $chunkSize ) {
+ for ( $min = 0; $min <= $lastUser; $min += $chunkSize ) {
$max = $min + $chunkSize;
$result = $dbr->query(
"SELECT
@@ -73,17 +76,16 @@ in $wgDBservers, usually indicating a replication environment.' );
GROUP BY user_id",
__METHOD__ );
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$dbw->update( 'user',
array( 'user_editcount' => $row->user_editcount ),
array( 'user_id' => $row->user_id ),
__METHOD__ );
++$migrated;
}
- $dbr->freeResult( $result );
$delta = microtime( true ) - $start;
- $rate = ($delta == 0.0) ? 0.0 : $migrated / $delta;
+ $rate = ( $delta == 0.0 ) ? 0.0 : $migrated / $delta;
$this->output( sprintf( "%s %d (%0.1f%%) done in %0.1f secs (%0.3f accounts/sec).\n",
wfWikiID(),
$migrated,
@@ -105,4 +107,4 @@ in $wgDBservers, usually indicating a replication environment.' );
}
$maintClass = "InitEditCount";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/initStats.php b/maintenance/initStats.php
index b92d46c5..1ec5c925 100644
--- a/maintenance/initStats.php
+++ b/maintenance/initStats.php
@@ -1,5 +1,4 @@
<?php
-
/**
* Maintenance script to re-initialise or update the site statistics table
*
@@ -18,13 +17,13 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
* @author Brion Vibber
* @author Rob Church <robchur@gmail.com>
- * @licence GNU General Public Licence 2.0 or later
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class InitStats extends Maintenance {
public function __construct() {
@@ -56,13 +55,13 @@ class InitStats extends Maintenance {
$image = $counter->files();
$this->output( "{$image}\n" );
- if( !$this->hasOption('noviews') ) {
+ if ( !$this->hasOption( 'noviews' ) ) {
$this->output( "Counting total page views..." );
$views = $counter->views();
$this->output( "{$views}\n" );
}
- if( $this->hasOption( 'active' ) ) {
+ if ( $this->hasOption( 'active' ) ) {
$this->output( "Counting active users..." );
$active = SiteStatsUpdate::cacheUpdate();
$this->output( "{$active}\n" );
@@ -70,7 +69,7 @@ class InitStats extends Maintenance {
$this->output( "\nUpdating site statistics..." );
- if( $this->hasOption( 'update' ) ) {
+ if ( $this->hasOption( 'update' ) ) {
$counter->update();
} else {
$counter->refresh();
@@ -81,4 +80,4 @@ class InitStats extends Maintenance {
}
$maintClass = "InitStats";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/install-utils.inc b/maintenance/install-utils.inc
index f2d48e9a..93ca0b58 100644
--- a/maintenance/install-utils.inc
+++ b/maintenance/install-utils.inc
@@ -1,219 +1,31 @@
<?php
-
/**
- * This file contains functions used by the install script (config/index.php)
- * and maintenance scripts. It is not loaded in normal web requests.
+ * This file contains ancient db-related functions that have been deprecated. Do
+ * not use them. Please find the appropriate replacements.
*
* @file
*/
-function install_version_checks() {
- # We dare not turn output buffer _off_ since this will break completely
- # if PHP is globally configured to run through a gzip filter.
- @ob_implicit_flush( true );
-
- if( !function_exists( 'version_compare' ) ) {
- # version_compare was introduced in 4.1.0
- echo "Your PHP version is much too old; 4.0.x will _not_ work. 5.1.0 or higher is required. ABORTING.\n";
- die( 1 );
- }
- if( version_compare( phpversion(), '5.1.0' ) < 0 ) {
- echo "PHP 5.1.0 or higher is required. If PHP 5 is available only when \n".
- "PHP files have a .php5 extension, please navigate to <a href=\"index.php5\">index.php5</a> \n".
- "to continue installation. ABORTING.\n";
- die( 1 );
- }
-
- $test = new PhpXmlBugTester();
- if( !$test->ok ) {
- echo "Your system has a combination of PHP and libxml2 versions which is buggy\n" .
- "and can cause hidden data corruption in MediaWiki and other web apps.\n" .
- "Upgrade to PHP 5.2.9 or later and libxml2 2.7.3 or later!\n" .
- "ABORTING (http://bugs.php.net/bug.php?id=45996 for details).\n";
- die( 1 );
- }
-
- $test = new PhpRefCallBugTester;
- $test->execute();
- if ( !$test->ok ) {
- echo "PHP 5.3.1 is not compatible with MediaWiki due to a bug involving\n" .
- "reference parameters to __call. Upgrade to PHP 5.3.2 or higher, or \n" .
- "downgrade to PHP 5.3.0 to fix this.\n" .
- "ABORTING (see http://bugs.php.net/bug.php?id=50394 for details)\n";
- die( 1 );
- }
-
- global $wgCommandLineMode;
- $wgCommandLineMode = true;
- umask( 000 );
- @set_time_limit( 0 );
-}
-
/**
- * Test for PHP+libxml2 bug which breaks XML input subtly with certain versions.
- * http://bugs.php.net/bug.php?id=45996
- * Known fixed with PHP 5.2.9 + libxml2-2.7.3
+ * @deprecated Use DatabaseBase::sourceFile(). Will probably be removed in 1.19
*/
-class PhpXmlBugTester {
- private $parsedData = '';
- public $ok = false;
- public function __construct() {
- $charData = '<b>c</b>';
- $xml = '<a>' . htmlspecialchars( $charData ) . '</a>';
-
- $parser = xml_parser_create();
- xml_set_character_data_handler( $parser, array( $this, 'chardata' ) );
- $parsedOk = xml_parse($parser, $xml, true);
- $this->ok = $parsedOk && ($this->parsedData == $charData);
- }
- public function chardata($parser, $data) {
- $this->parsedData .= $data;
- }
-}
-
-/**
- * Test for PHP bug #50394 (PHP 5.3.x conversion to null only, not 5.2.x)
- */
-class PhpRefCallBugTester {
- public $ok = false;
-
- function __call( $name, $args ) {
- $old = error_reporting( E_ALL & ~E_WARNING );
- call_user_func_array( array( $this, 'checkForBrokenRef' ), $args );
- error_reporting( $old );
- }
-
- function checkForBrokenRef( &$var ) {
- if ( $var ) {
- $this->ok = true;
- }
- }
-
- function execute() {
- $var = true;
- call_user_func_array( array( $this, 'foo' ), array( &$var ) );
- }
-}
-
-function readconsole( $prompt = '' ) {
- static $isatty = null;
- if ( is_null( $isatty ) ) {
- if ( !function_exists( 'posix_isatty' ) || posix_isatty( 0 /*STDIN*/ ) ) {
- $isatty = true;
- } else {
- $isatty = false;
- }
- }
-
- if ( $isatty && function_exists( 'readline' ) ) {
- return readline( $prompt );
- } else {
- if ( $isatty ) {
- $st = readlineEmulation( $prompt );
- } else {
- if ( feof( STDIN ) ) {
- $st = false;
- } else {
- $st = fgets(STDIN, 1024);
- }
- }
- if ($st === false) return false;
- $resp = trim( $st );
- return $resp;
- }
-}
-
-function findExecutable( $name ) {
- $paths = explode( PATH_SEPARATOR, getenv( "PATH" ) );
- foreach( $paths as $path ) {
- $full = $path . DIRECTORY_SEPARATOR . $name;
- if( file_exists( $full ) ) {
- if( wfIsWindows() || is_executable( $full ) ) {
- return $full;
- }
- }
- }
- return false;
-}
-
-function readlineEmulation( $prompt ) {
- $bash = "bash";
- if( !wfIsWindows() && findExecutable( $bash ) ) {
- $retval = false;
- $encPrompt = wfEscapeShellArg( $prompt );
- $command = "read -er -p $encPrompt && echo \"\$REPLY\"";
- $encCommand = wfEscapeShellArg( $command );
- $line = wfShellExec( "$bash -c $encCommand", $retval );
-
- if( $retval == 0 ) {
- return $line;
- } elseif( $retval == 127 ) {
- // Couldn't execute bash even though we thought we saw it.
- // Shell probably spit out an error message, sorry :(
- // Fall through to fgets()...
- } else {
- // EOF/ctrl+D
- return false;
- }
- }
-
- // Fallback... we'll have no editing controls, EWWW
- if ( feof( STDIN ) ) {
- return false;
- }
- print $prompt;
- return fgets(STDIN, 1024);
-}
-
-
-#
-# Read and execute SQL commands from a file
-#
function dbsource( $fname, $db = false ) {
wfDeprecated( __METHOD__ );
if ( !$db ) {
- // Try $wgDatabase, which is used in the install and update scripts
- global $wgDatabase;
- if ( isset( $wgDatabase ) ) {
- $db = $wgDatabase;
- } else {
- // No? Well, we must be outside of those scripts, so use the standard method
- $db = wfGetDB( DB_MASTER );
- }
+ $db = wfGetDB( DB_MASTER );
}
$error = $db->sourceFile( $fname );
if ( $error !== true ) {
print $error;
- exit(1);
+ exit( 1 );
}
}
/**
- * Get the value of session.save_path
- *
- * Per http://www.php.net/manual/en/ref.session.php#ini.session.save-path,
- * this might have some additional preceding parts which need to be
- * ditched
- *
- * @return string
- */
-function mw_get_session_save_path() {
- $path = ini_get( 'session.save_path' );
- $path = substr( $path, strrpos( $path, ';' ) );
- return $path;
-}
-
-/**
- * Is dl() available to us?
- *
- * According to http://www.php.net/manual/en/function.dl.php, dl()
- * is *not* available when `enable_dl` is off, or under `safe_mode`
- *
- * @return bool
+ * @deprecated Use DatabaseBase::patchPath(). Will probably be removed in 1.18
*/
-function mw_have_dl() {
- return function_exists( 'dl' )
- && is_callable( 'dl' )
- && wfIniGetBool( 'enable_dl' )
- && !wfIniGetBool( 'safe_mode' );
+function archive( $name ) {
+ wfDeprecated( __METHOD__ );
+ $dbr = wfGetDB( DB_SLAVE );
+ return $dbr->patchPath( $name );
}
diff --git a/maintenance/install.php b/maintenance/install.php
new file mode 100644
index 00000000..34e3ea85
--- /dev/null
+++ b/maintenance/install.php
@@ -0,0 +1,95 @@
+<?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
+ *
+ * @ingroup Maintenance
+ * @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" .
+ "Check if you have a newer php executable with a different name, such as php5.\n";
+ die( 1 );
+}
+
+define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
+define( 'MEDIAWIKI_INSTALL', true );
+
+require_once( dirname( dirname( __FILE__ ) )."/maintenance/Maintenance.php" );
+
+class CommandLineInstaller extends Maintenance {
+ function __construct() {
+ parent::__construct();
+ global $IP;
+
+ $this->addArg( 'name', 'The name of the wiki', true);
+
+ $this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
+ $this->addOption( 'pass', 'The password for the wiki administrator. You will be prompted for this if it isn\'t provided', false, true );
+ $this->addOption( 'email', 'The email for the wiki administrator', false, true );
+ $this->addOption( 'scriptpath', 'The relative path of the wiki in the web server (/wiki)', false, true );
+
+ $this->addOption( 'lang', 'The language to use (en)', false, true );
+ /* $this->addOption( 'cont-lang', 'The content language (en)', false, true ); */
+
+ $this->addOption( 'dbtype', 'The type of database (mysql)', false, true );
+ $this->addOption( 'dbserver', 'The database host (localhost)', false, true );
+ $this->addOption( 'dbport', 'The database port; only for PostgreSQL (5432)', false, true );
+ $this->addOption( 'dbname', 'The database name (my_wiki)', false, true );
+ $this->addOption( 'dbpath', 'The path for the SQLite DB (/var/data)', false, true );
+ $this->addOption( 'installdbuser', 'The user to use for installing (root)', false, true );
+ $this->addOption( 'installdbpass', 'The pasword for the DB user to install as.', false, true );
+ $this->addOption( 'dbuser', 'The user to use for normal operations (wikiuser)', false, true );
+ $this->addOption( 'dbpass', 'The pasword for the DB user for normal operations', false, true );
+ $this->addOption( 'confpath', "Path to write LocalSettings.php to, default $IP", false, true );
+ /* $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in pg (mediawiki)', false, true ); */
+ /* $this->addOption( 'namespace', 'The project namespace (same as the name)', false, true ); */
+ $this->addOption( 'env-checks', "Run environment checks only, don't change anything" );
+ }
+
+ function execute() {
+ global $IP, $wgTitle;
+ $siteName = isset( $this->mArgs[0] ) ? $this->mArgs[0] : "Don't care"; // Will not be set if used with --env-checks
+ $adminName = isset( $this->mArgs[1] ) ? $this->mArgs[1] : null;
+ $wgTitle = Title::newFromText( 'Installer script' );
+
+ $installer =
+ new CliInstaller( $siteName, $adminName, $this->mOptions );
+
+ $status = $installer->doEnvironmentChecks();
+ if( $status->isGood() ) {
+ $installer->showMessage( 'config-env-good' );
+ } else {
+ $installer->showStatusMessage( $status );
+ return;
+ }
+ if( !$this->hasOption( 'env-checks' ) ) {
+ $installer->execute();
+ $installer->writeConfigurationFile( $this->getOption( 'confpath', $IP ) );
+ }
+ }
+
+ function validateParamsAndArgs() {
+ if ( !$this->hasOption( 'env-checks' ) ) {
+ parent::validateParamsAndArgs();
+ }
+ }
+}
+
+$maintClass = "CommandLineInstaller";
+
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/installExtension.php b/maintenance/installExtension.php
deleted file mode 100644
index ea4c191c..00000000
--- a/maintenance/installExtension.php
+++ /dev/null
@@ -1,683 +0,0 @@
-<?php
-/**
- * Copyright (C) 2006 Daniel Kinzler, brightbyte.de
- *
- * 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 Maintenance
- */
-
-$optionsWithArgs = array( 'target', 'repository', 'repos' );
-
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-
-define('EXTINST_NOPATCH', 0);
-define('EXTINST_WRITEPATCH', 6);
-define('EXTINST_HOTPATCH', 10);
-
-/**
- * @ingroup Maintenance
- */
-class InstallerRepository {
- var $path;
-
- function InstallerRepository( $path ) {
- $this->path = $path;
- }
-
- function printListing( ) {
- trigger_error( 'override InstallerRepository::printListing()', E_USER_ERROR );
- }
-
- function getResource( $name ) {
- trigger_error( 'override InstallerRepository::getResource()', E_USER_ERROR );
- }
-
- static function makeRepository( $path, $type = NULL ) {
- if ( !$type ) {
- $m = array();
- preg_match( '!(([-+\w]+)://)?.*?(\.[-\w\d.]+)?$!', $path, $m );
- $proto = @$m[2];
-
- if ( !$proto ) {
- $type = 'dir';
- } else if ( ( $proto == 'http' || $proto == 'https' ) && preg_match( '!([^\w]svn|svn[^\w])!i', $path) ) {
- $type = 'svn'; #HACK!
- } else {
- $type = $proto;
- }
- }
-
- if ( $type == 'dir' || $type == 'file' ) { return new LocalInstallerRepository( $path ); }
- else if ( $type == 'http' || $type == 'http' ) { return new WebInstallerRepository( $path ); }
- else { return new SVNInstallerRepository( $path ); }
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class LocalInstallerRepository extends InstallerRepository {
-
- function LocalInstallerRepository ( $path ) {
- InstallerRepository::InstallerRepository( $path );
- }
-
- function printListing( ) {
- $ff = glob( "{$this->path}/*" );
- if ( $ff === false || $ff === NULL ) {
- ExtensionInstaller::error( "listing directory {$this->path} failed!" );
- return false;
- }
-
- foreach ( $ff as $f ) {
- $n = basename($f);
-
- if ( !is_dir( $f ) ) {
- $m = array();
- if ( !preg_match( '/(.*)\.(tgz|tar\.gz|zip)/', $n, $m ) ) continue;
- $n = $m[1];
- }
-
- print "\t$n\n";
- }
- }
-
- function getResource( $name ) {
- $path = $this->path . '/' . $name;
-
- if ( !file_exists( $path ) || !is_dir( $path ) ) $path = $this->path . '/' . $name . '.tgz';
- if ( !file_exists( $path ) ) $path = $this->path . '/' . $name . '.tar.gz';
- if ( !file_exists( $path ) ) $path = $this->path . '/' . $name . '.zip';
-
- return new LocalInstallerResource( $path );
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class WebInstallerRepository extends InstallerRepository {
-
- function WebInstallerRepository ( $path ) {
- InstallerRepository::InstallerRepository( $path );
- }
-
- function printListing( ) {
- ExtensionInstaller::note( "listing index from {$this->path}..." );
-
- $txt = @file_get_contents( $this->path . '/index.txt' );
- if ( $txt ) {
- print $txt;
- print "\n";
- }
- else {
- $txt = file_get_contents( $this->path );
- if ( !$txt ) {
- ExtensionInstaller::error( "listing index from {$this->path} failed!" );
- print ( $txt );
- return false;
- }
-
- $m = array();
- $ok = preg_match_all( '!<a\s[^>]*href\s*=\s*['."'".'"]([^/'."'".'"]+)\.tgz['."'".'"][^>]*>.*?</a>!si', $txt, $m, PREG_SET_ORDER );
- if ( !$ok ) {
- ExtensionInstaller::error( "listing index from {$this->path} does not match!" );
- print ( $txt );
- return false;
- }
-
- foreach ( $m as $l ) {
- $n = $l[1];
- print "\t$n\n";
- }
- }
- }
-
- function getResource( $name ) {
- $path = $this->path . '/' . $name . '.tgz';
- return new WebInstallerResource( $path );
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class SVNInstallerRepository extends InstallerRepository {
-
- function SVNInstallerRepository ( $path ) {
- InstallerRepository::InstallerRepository( $path );
- }
-
- function printListing( ) {
- ExtensionInstaller::note( "SVN list {$this->path}..." );
- $code = null; // Shell Exec return value.
- $txt = wfShellExec( 'svn ls ' . escapeshellarg( $this->path ), $code );
- if ( $code !== 0 ) {
- ExtensionInstaller::error( "svn list for {$this->path} failed!" );
- return false;
- }
-
- $ll = preg_split('/(\s*[\r\n]\s*)+/', $txt);
-
- foreach ( $ll as $line ) {
- $m = array();
- if ( !preg_match('!^(.*)/$!', $line, $m) ) continue;
- $n = $m[1];
-
- print "\t$n\n";
- }
- }
-
- function getResource( $name ) {
- $path = $this->path . '/' . $name;
- return new SVNInstallerResource( $path );
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class InstallerResource {
- var $path;
- var $isdir;
- var $islocal;
-
- function InstallerResource( $path, $isdir, $islocal ) {
- $this->path = $path;
-
- $this->isdir= $isdir;
- $this->islocal = $islocal;
-
- $m = array();
- preg_match( '!([-+\w]+://)?.*?(\.[-\w\d.]+)?$!', $path, $m );
-
- $this->protocol = @$m[1];
- $this->extensions = @$m[2];
-
- if ( $this->extensions ) $this->extensions = strtolower( $this->extensions );
- }
-
- function fetch( $target ) {
- trigger_error( 'override InstallerResource::fetch()', E_USER_ERROR );
- }
-
- function extract( $file, $target ) {
-
- if ( $this->extensions == '.tgz' || $this->extensions == '.tar.gz' ) { #tgz file
- ExtensionInstaller::note( "extracting $file..." );
- $code = null; // shell Exec return value.
- wfShellExec( 'tar zxvf ' . escapeshellarg( $file ) . ' -C ' . escapeshellarg( $target ), $code );
-
- if ( $code !== 0 ) {
- ExtensionInstaller::error( "failed to extract $file!" );
- return false;
- }
- }
- else if ( $this->extensions == '.zip' ) { #zip file
- ExtensionInstaller::note( "extracting $file..." );
- $code = null; // shell Exec return value.
- wfShellExec( 'unzip ' . escapeshellarg( $file ) . ' -d ' . escapeshellarg( $target ) , $code );
-
- if ( $code !== 0 ) {
- ExtensionInstaller::error( "failed to extract $file!" );
- return false;
- }
- }
- else {
- ExtensionInstaller::error( "unknown extension {$this->extensions}!" );
- return false;
- }
-
- return true;
- }
-
- /*static*/ function makeResource( $url ) {
- $m = array();
- preg_match( '!(([-+\w]+)://)?.*?(\.[-\w\d.]+)?$!', $url, $m );
- $proto = @$m[2];
- $ext = @$m[3];
- if ( $ext ) $ext = strtolower( $ext );
-
- if ( !$proto ) { return new LocalInstallerResource( $url, $ext ? false : true ); }
- else if ( $ext && ( $proto == 'http' || $proto == 'http' || $proto == 'ftp' ) ) { return new WebInstallerResource( $url ); }
- else { return new SVNInstallerResource( $url ); }
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class LocalInstallerResource extends InstallerResource {
- function LocalInstallerResource( $path ) {
- InstallerResource::InstallerResource( $path, is_dir( $path ), true );
- }
-
- function fetch( $target ) {
- if ( $this->isdir ) return ExtensionInstaller::copyDir( $this->path, dirname( $target ) );
- else return $this->extract( $this->path, dirname( $target ) );
- }
-
-}
-
-/**
- * @ingroup Maintenance
- */
-class WebInstallerResource extends InstallerResource {
- function WebInstallerResource( $path ) {
- InstallerResource::InstallerResource( $path, false, false );
- }
-
- function fetch( $target ) {
- $tmp = wfTempDir() . '/' . basename( $this->path );
-
- ExtensionInstaller::note( "downloading {$this->path}..." );
- $ok = copy( $this->path, $tmp );
-
- if ( !$ok ) {
- ExtensionInstaller::error( "failed to download {$this->path}" );
- return false;
- }
-
- $this->extract( $tmp, dirname( $target ) );
- unlink($tmp);
-
- return true;
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class SVNInstallerResource extends InstallerResource {
- function SVNInstallerResource( $path ) {
- InstallerResource::InstallerResource( $path, true, false );
- }
-
- function fetch( $target ) {
- ExtensionInstaller::note( "SVN checkout of {$this->path}..." );
- $code = null; // shell exec return val.
- wfShellExec( 'svn co ' . escapeshellarg( $this->path ) . ' ' . escapeshellarg( $target ), $code );
-
- if ( $code !== 0 ) {
- ExtensionInstaller::error( "checkout failed for {$this->path}!" );
- return false;
- }
-
- return true;
- }
-}
-
-/**
- * @ingroup Maintenance
- */
-class ExtensionInstaller {
- var $source;
- var $target;
- var $name;
- var $dir;
- var $tasks;
-
- function ExtensionInstaller( $name, $source, $target ) {
- if ( !is_object( $source ) ) $source = InstallerResource::makeResource( $source );
-
- $this->name = $name;
- $this->source = $source;
- $this->target = realpath( $target );
- $this->extdir = "$target/extensions";
- $this->dir = "{$this->extdir}/$name";
- $this->incpath = "extensions/$name";
- $this->tasks = array();
-
- #TODO: allow a subdir different from "extensions"
- #TODO: allow a config file different from "LocalSettings.php"
- }
-
- static function note( $msg ) {
- print "$msg\n";
- }
-
- static function warn( $msg ) {
- print "WARNING: $msg\n";
- }
-
- static function error( $msg ) {
- print "ERROR: $msg\n";
- }
-
- function prompt( $msg ) {
- if ( function_exists( 'readline' ) ) {
- $s = readline( $msg );
- }
- else {
- if ( !@$this->stdin ) $this->stdin = fopen( 'php://stdin', 'r' );
- if ( !$this->stdin ) die( "Failed to open stdin for user interaction!\n" );
-
- print $msg;
- flush();
-
- $s = fgets( $this->stdin );
- }
-
- $s = trim( $s );
- return $s;
- }
-
- function confirm( $msg ) {
- while ( true ) {
- $s = $this->prompt( $msg . " [yes/no]: ");
- $s = strtolower( trim($s) );
-
- if ( $s == 'yes' || $s == 'y' ) { return true; }
- else if ( $s == 'no' || $s == 'n' ) { return false; }
- else { print "bad response: $s\n"; }
- }
- }
-
- function deleteContents( $dir ) {
- $ff = glob( $dir . "/*" );
- if ( !$ff ) return;
-
- foreach ( $ff as $f ) {
- if ( is_dir( $f ) && !is_link( $f ) ) $this->deleteContents( $f );
- unlink( $f );
- }
- }
-
- function copyDir( $dir, $tgt ) {
- $d = $tgt . '/' . basename( $dir );
-
- if ( !file_exists( $d ) ) {
- $ok = mkdir( $d );
- if ( !$ok ) {
- ExtensionInstaller::error( "failed to create director $d" );
- return false;
- }
- }
-
- $ff = glob( $dir . "/*" );
- if ( $ff === false || $ff === NULL ) return false;
-
- foreach ( $ff as $f ) {
- if ( is_dir( $f ) && !is_link( $f ) ) {
- $ok = ExtensionInstaller::copyDir( $f, $d );
- if ( !$ok ) return false;
- }
- else {
- $t = $d . '/' . basename( $f );
- $ok = copy( $f, $t );
-
- if ( !$ok ) {
- ExtensionInstaller::error( "failed to copy $f to $t" );
- return false;
- }
- }
- }
-
- return true;
- }
-
- function setPermissions( $dir, $dirbits, $filebits ) {
- if ( !chmod( $dir, $dirbits ) ) ExtensionInstaller::warn( "faield to set permissions for $dir" );
-
- $ff = glob( $dir . "/*" );
- if ( $ff === false || $ff === NULL ) return false;
-
- foreach ( $ff as $f ) {
- $n= basename( $f );
- if ( $n{0} == '.' ) continue; #HACK: skip dot files
-
- if ( is_link( $f ) ) continue; #skip link
-
- if ( is_dir( $f ) ) {
- ExtensionInstaller::setPermissions( $f, $dirbits, $filebits );
- }
- else {
- if ( !chmod( $f, $filebits ) ) ExtensionInstaller::warn( "faield to set permissions for $f" );
- }
- }
-
- return true;
- }
-
- function fetchExtension( ) {
- if ( $this->source->islocal && $this->source->isdir && realpath( $this->source->path ) === $this->dir ) {
- $this->note( "files are already in the extension dir" );
- return true;
- }
-
- if ( file_exists( $this->dir ) && glob( $this->dir . "/*" ) ) {
- if ( $this->confirm( "{$this->dir} exists and is not empty.\nDelete all files in that directory?" ) ) {
- $this->deleteContents( $this->dir );
- }
- else {
- return false;
- }
- }
-
- $ok = $this->source->fetch( $this->dir );
- if ( !$ok ) return false;
-
- if ( !file_exists( $this->dir ) && glob( $this->dir . "/*" ) ) {
- $this->error( "{$this->dir} does not exist or is empty. Something went wrong, sorry." );
- return false;
- }
-
- if ( file_exists( $this->dir . '/README' ) ) $this->tasks[] = "read the README file in {$this->dir}";
- if ( file_exists( $this->dir . '/INSTALL' ) ) $this->tasks[] = "read the INSTALL file in {$this->dir}";
- if ( file_exists( $this->dir . '/RELEASE-NOTES' ) ) $this->tasks[] = "read the RELEASE-NOTES file in {$this->dir}";
-
- #TODO: configure this smartly...?
- $this->setPermissions( $this->dir, 0755, 0644 );
-
- $this->note( "fetched extension to {$this->dir}" );
- return true;
- }
-
- function patchLocalSettings( $mode ) {
- #NOTE: if we get a better way to hook up extensions, that should be used instead.
-
- $f = $this->dir . '/install.settings';
- $t = $this->target . '/LocalSettings.php';
-
- #TODO: assert version ?!
- #TODO: allow custom installer scripts + sql patches
-
- if ( !file_exists( $f ) ) {
- self::warn( "No install.settings file provided!" );
- $this->tasks[] = "Please read the instructions and edit LocalSettings.php manually to activate the extension.";
- return '?';
- }
- else {
- self::note( "applying settings patch..." );
- }
-
- $settings = file_get_contents( $f );
-
- if ( !$settings ) {
- self::error( "failed to read settings from $f!" );
- return false;
- }
-
- $settings = str_replace( '{{path}}', $this->incpath, $settings );
-
- if ( $mode == EXTINST_NOPATCH ) {
- $this->tasks[] = "Please put the following into your LocalSettings.php:" . "\n$settings\n";
- self::note( "Skipping patch phase, automatic patching is off." );
- return true;
- }
-
- if ( $mode == EXTINST_HOTPATCH ) {
- #NOTE: keep php extension for backup file!
- $bak = $this->target . '/LocalSettings.install-' . $this->name . '-' . wfTimestamp(TS_MW) . '.bak.php';
-
- $ok = copy( $t, $bak );
-
- if ( !$ok ) {
- self::warn( "failed to create backup of LocalSettings.php!" );
- return false;
- }
- else {
- self::note( "created backup of LocalSettings.php at $bak" );
- }
- }
-
- $localsettings = file_get_contents( $t );
-
- if ( !$settings ) {
- self::error( "failed to read $t for patching!" );
- return false;
- }
-
- $marker = "<@< extension {$this->name} >@>";
- $blockpattern = "/\n\s*#\s*BEGIN\s*$marker.*END\s*$marker\s*/smi";
-
- if ( preg_match( $blockpattern, $localsettings ) ) {
- $localsettings = preg_replace( $blockpattern, "\n", $localsettings );
- $this->warn( "removed old configuration block for extension {$this->name}!" );
- }
-
- $newblock= "\n# BEGIN $marker\n$settings\n# END $marker\n";
-
- $localsettings = preg_replace( "/\?>\s*$/si", "$newblock?>", $localsettings );
-
- if ( $mode != EXTINST_HOTPATCH ) {
- $t = $this->target . '/LocalSettings.install-' . $this->name . '-' . wfTimestamp(TS_MW) . '.php';
- }
-
- $ok = file_put_contents( $t, $localsettings );
-
- if ( !$ok ) {
- self::error( "failed to patch $t!" );
- return false;
- }
- else if ( $mode == EXTINST_HOTPATCH ) {
- self::note( "successfully patched $t" );
- }
- else {
- self::note( "created patched settings file $t" );
- $this->tasks[] = "Replace your current LocalSettings.php with ".basename($t);
- }
-
- return true;
- }
-
- function printNotices( ) {
- if ( !$this->tasks ) {
- $this->note( "Installation is complete, no pending tasks" );
- }
- else {
- $this->note( "" );
- $this->note( "PENDING TASKS:" );
- $this->note( "" );
-
- foreach ( $this->tasks as $t ) {
- $this->note ( "* " . $t );
- }
-
- $this->note( "" );
- }
-
- return true;
- }
-
-}
-
-$tgt = isset ( $options['target'] ) ? $options['target'] : $IP;
-
-$repos = @$options['repository'];
-if ( !$repos ) $repos = @$options['repos'];
-if ( !$repos ) $repos = @$wgExtensionInstallerRepository;
-
-if ( !$repos && file_exists("$tgt/.svn") && is_dir("$tgt/.svn") ) {
- $svn = file_get_contents( "$tgt/.svn/entries" );
-
- $m = array();
- if ( preg_match( '!url="(.*?)"!', $svn, $m ) ) {
- $repos = dirname( $m[1] ) . '/extensions';
- }
-}
-
-if ( !$repos ) $repos = 'http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions';
-
-if( !isset( $args[0] ) && !@$options['list'] ) {
- die( "USAGE: installExtension.php [options] <name> [source]\n" .
- "OPTIONS: \n" .
- " --list list available extensions. <name> is ignored / may be omitted.\n" .
- " --repository <n> repository to fetch extensions from. May be a local directoy,\n" .
- " an SVN repository or a HTTP directory\n" .
- " --target <dir> mediawiki installation directory to use\n" .
- " --nopatch don't create a patched LocalSettings.php\n" .
- " --hotpatch patched LocalSettings.php directly (creates a backup)\n" .
- "SOURCE: specifies the package source directly. If given, the repository is ignored.\n" .
- " The source my be a local file (tgz or zip) or directory, the URL of a\n" .
- " remote file (tgz or zip), or a SVN path.\n"
- );
-}
-
-$repository = InstallerRepository::makeRepository( $repos );
-
-if ( isset( $options['list'] ) ) {
- $repository->printListing();
- exit(0);
-}
-
-$name = $args[0];
-
-$src = isset( $args[1] ) ? $args[1] : $repository->getResource( $name );
-
-#TODO: detect $source mismatching $name !!
-
-$mode = EXTINST_WRITEPATCH;
-if ( isset( $options['nopatch'] ) || @$wgExtensionInstallerNoPatch ) { $mode = EXTINST_NOPATCH; }
-else if ( isset( $options['hotpatch'] ) || @$wgExtensionInstallerHotPatch ) { $mode = EXTINST_HOTPATCH; }
-
-if ( !file_exists( "$tgt/LocalSettings.php" ) ) {
- die("can't find $tgt/LocalSettings.php\n");
-}
-
-if ( $mode == EXTINST_HOTPATCH && !is_writable( "$tgt/LocalSettings.php" ) ) {
- die("can't write to $tgt/LocalSettings.php\n");
-}
-
-if ( !file_exists( "$tgt/extensions" ) ) {
- die("can't find $tgt/extensions\n");
-}
-
-if ( !is_writable( "$tgt/extensions" ) ) {
- die("can't write to $tgt/extensions\n");
-}
-
-$installer = new ExtensionInstaller( $name, $src, $tgt );
-
-$installer->note( "Installing extension {$installer->name} from {$installer->source->path} to {$installer->dir}" );
-
-print "\n";
-print "\tTHIS TOOL IS EXPERIMENTAL!\n";
-print "\tEXPECT THE UNEXPECTED!\n";
-print "\n";
-
-if ( !$installer->confirm("continue") ) die("aborted\n");
-
-$ok = $installer->fetchExtension();
-
-if ( $ok ) $ok = $installer->patchLocalSettings( $mode );
-
-if ( $ok ) $ok = $installer->printNotices();
-
-if ( $ok ) $installer->note( "$name extension installed." );
-
diff --git a/maintenance/interwiki.list b/maintenance/interwiki.list
new file mode 100644
index 00000000..d6abd1a7
--- /dev/null
+++ b/maintenance/interwiki.list
@@ -0,0 +1,97 @@
+# Based more or less on the public interwiki map from MeatballWiki
+# Default interwiki prefixes...
+acronym|http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1|0
+advogato|http://www.advogato.org/$1|0
+annotationwiki|http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1|0
+arxiv|http://www.arxiv.org/abs/$1|0
+c2find|http://c2.com/cgi/wiki?FindPage&value=$1|0
+cache|http://www.google.com/search?q=cache:$1|0
+commons|http://commons.wikimedia.org/wiki/$1|0
+corpknowpedia|http://corpknowpedia.org/wiki/index.php/$1|0
+dictionary|http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1|0
+disinfopedia|http://www.disinfopedia.org/wiki.phtml?title=$1|0
+docbook|http://wiki.docbook.org/topic/$1|0
+doi|http://dx.doi.org/$1|0
+drumcorpswiki|http://www.drumcorpswiki.com/index.php/$1|0
+dwjwiki|http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1|0
+emacswiki|http://www.emacswiki.org/cgi-bin/wiki.pl?$1|0
+elibre|http://enciclopedia.us.es/index.php/$1|0
+foldoc|http://foldoc.org/?$1|0
+foxwiki|http://fox.wikis.com/wc.dll?Wiki~$1|0
+freebsdman|http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1|0
+gej|http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1|0
+gentoo-wiki|http://gentoo-wiki.com/$1|0
+google|http://www.google.com/search?q=$1|0
+googlegroups|http://groups.google.com/groups?q=$1|0
+hammondwiki|http://www.dairiki.org/HammondWiki/$1|0
+hewikisource|http://he.wikisource.org/wiki/$1|1
+hrwiki|http://www.hrwiki.org/index.php/$1|0
+imdb|http://us.imdb.com/Title?$1|0
+jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0
+jspwiki|http://www.jspwiki.org/wiki/$1|0
+keiki|http://kei.ki/en/$1|0
+kmwiki|http://kmwiki.wikispaces.com/$1|0
+linuxwiki|http://linuxwiki.de/$1|0
+lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0
+lqwiki|http://wiki.linuxquestions.org/wiki/$1|0
+lugkr|http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1|0
+mathsongswiki|http://SeedWiki.com/page.cfm?wikiid=237&doc=$1|0
+meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0
+mediazilla|https://bugzilla.wikimedia.org/$1|1
+mediawikiwiki|http://www.mediawiki.org/wiki/$1|0
+memoryalpha|http://www.memory-alpha.org/en/index.php/$1|0
+metawiki|http://sunir.org/apps/meta.pl?$1|0
+metawikipedia|http://meta.wikimedia.org/wiki/$1|0
+moinmoin|http://purl.net/wiki/moin/$1|0
+mozillawiki|http://wiki.mozilla.org/index.php/$1|0
+mw|http://www.mediawiki.org/wiki/$1|0
+oeis|http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1|0
+openfacts|http://openfacts.berlios.de/index.phtml?title=$1|0
+openwiki|http://openwiki.com/?$1|0
+# patwiki|http://gauss.ffii.org/$1|0 # 2008-02-27: lots of spambots
+pmeg|http://www.bertilow.com/pmeg/$1.php|0
+ppr|http://c2.com/cgi/wiki?$1|0
+pythoninfo|http://wiki.python.org/moin/$1|0
+rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0
+s23wiki|http://is-root.de/wiki/index.php/$1|0
+seattlewiki|http://seattle.wikia.com/wiki/$1|0
+seattlewireless|http://seattlewireless.net/?$1|0
+senseislibrary|http://senseis.xmp.net/?$1|0
+# slashdot|http://slashdot.org/article.pl?sid=$1|0 # 2008-02-27: update me
+sourceforge|http://sourceforge.net/$1|0
+squeak|http://wiki.squeak.org/squeak/$1|0
+susning|http://www.susning.nu/$1|0
+svgwiki|http://wiki.svg.org/$1|0
+tavi|http://tavi.sourceforge.net/$1|0
+tejo|http://www.tejo.org/vikio/$1|0
+tmbw|http://www.tmbw.net/wiki/$1|0
+tmnet|http://www.technomanifestos.net/?$1|0
+tmwiki|http://www.EasyTopicMaps.com/?page=$1|0
+theopedia|http://www.theopedia.com/$1|0
+twiki|http://twiki.org/cgi-bin/view/$1|0
+uea|http://www.tejo.org/uea/$1|0
+unreal|http://wiki.beyondunreal.com/wiki/$1|0
+usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0
+vinismo|http://vinismo.com/en/$1|0
+webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0
+why|http://clublet.com/c/c/why?$1|0
+wiki|http://c2.com/cgi/wiki?$1|0
+wikia|http://www.wikia.com/wiki/$1|0
+wikibooks|http://en.wikibooks.org/wiki/$1|1
+wikicities|http://www.wikia.com/wiki/$1|0
+wikif1|http://www.wikif1.org/$1|0
+wikihow|http://www.wikihow.com/$1|0
+wikinfo|http://www.wikinfo.org/index.php/$1|0
+wikimedia|http://wikimediafoundation.org/wiki/$1|0
+wikinews|http://en.wikinews.org/wiki/$1|1
+wikiquote|http://en.wikiquote.org/wiki/$1|1
+wikipedia|http://en.wikipedia.org/wiki/$1|1
+wikisource|http://wikisource.org/wiki/$1|1
+wikispecies|http://species.wikimedia.org/wiki/$1|1
+wikitravel|http://wikitravel.org/en/$1|0
+wikiversity|http://en.wikiversity.org/wiki/$1|1
+wikt|http://en.wiktionary.org/wiki/$1|1
+wiktionary|http://en.wiktionary.org/wiki/$1|1
+wlug|http://www.wlug.org.nz/$1|0
+zwiki|http://zwiki.org/$1|0
+zzz wiki|http://wiki.zzz.ee/index.php/$1|0
diff --git a/maintenance/interwiki.sql b/maintenance/interwiki.sql
index 2ce0e23f..6efc1e0e 100644
--- a/maintenance/interwiki.sql
+++ b/maintenance/interwiki.sql
@@ -87,7 +87,7 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
('wikimedia','http://wikimediafoundation.org/wiki/$1',0),
('wikinews','http://en.wikinews.org/wiki/$1',1),
('wikiquote','http://en.wikiquote.org/wiki/$1',1),
-('wikipedia', 'http://en.wikipedia.org/wiki/$1', 1),
+('wikipedia','http://en.wikipedia.org/wiki/$1',1),
('wikisource','http://wikisource.org/wiki/$1',1),
('wikispecies','http://species.wikimedia.org/wiki/$1',1),
('wikitravel','http://wikitravel.org/en/$1',0),
diff --git a/maintenance/lag.php b/maintenance/lag.php
index 47b4c47b..fdc74293 100644
--- a/maintenance/lag.php
+++ b/maintenance/lag.php
@@ -6,7 +6,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DatabaseLag extends Maintenance {
public function __construct() {
@@ -19,18 +19,18 @@ class DatabaseLag extends Maintenance {
if ( $this->hasOption( 'r' ) ) {
$lb = wfGetLB();
echo 'time ';
- for( $i = 1; $i < $lb->getServerCount(); $i++ ) {
+ for ( $i = 1; $i < $lb->getServerCount(); $i++ ) {
$hostname = $lb->getServerName( $i );
printf( "%-12s ", $hostname );
}
echo "\n";
- while( 1 ) {
+ while ( 1 ) {
$lb->clearLagTimeCache();
$lags = $lb->getLagTimes();
unset( $lags[0] );
echo gmdate( 'H:i:s' ) . ' ';
- foreach( $lags as $i => $lag ) {
+ foreach ( $lags as $lag ) {
printf( "%-12s " , $lag === false ? 'false' : $lag );
}
echo "\n";
@@ -39,7 +39,7 @@ class DatabaseLag extends Maintenance {
} else {
$lb = wfGetLB();
$lags = $lb->getLagTimes();
- foreach( $lags as $i => $lag ) {
+ foreach ( $lags as $i => $lag ) {
$name = $lb->getServerName( $i );
$this->output( sprintf( "%-20s %s\n" , $name, $lag === false ? 'false' : $lag ) );
}
@@ -48,4 +48,4 @@ class DatabaseLag extends Maintenance {
}
$maintClass = "DatabaseLag";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php
index 169a4d41..b8e28302 100644
--- a/maintenance/language/StatOutputs.php
+++ b/maintenance/language/StatOutputs.php
@@ -1,12 +1,12 @@
<?php
-if (!defined('MEDIAWIKI')) die();
+if ( !defined( 'MEDIAWIKI' ) ) die();
/**
* Statistic output classes.
*
* @file
* @ingroup MaintenanceLanguage
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @author Ashar Voultoiz <thoane@altern.org>
+ * @author Ashar Voultoiz <hashar at free dot fr>
*/
/** A general output object. Need to be overriden */
@@ -31,12 +31,11 @@ class statsOutput {
/** Outputs WikiText */
class wikiStatsOutput extends statsOutput {
function heading() {
- global $IP;
$version = SpecialVersion::getVersion( 'nodb' );
echo "'''Statistics are based on:''' <code>" . $version . "</code>\n\n";
echo "'''Note:''' These statistics can be generated by running <code>php maintenance/language/transstat.php</code>.\n\n";
echo "For additional information on specific languages (the message names, the actual problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n";
- echo '{| class="sortable wikitable" border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both;" width="100%"'."\n";
+ echo '{| class="sortable wikitable" border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both;" width="100%"' . "\n";
}
function footer() {
echo "|}\n";
@@ -48,11 +47,15 @@ class wikiStatsOutput extends statsOutput {
echo '';
}
function element( $in, $heading = false ) {
- echo ($heading ? '!' : '|') . "$in\n";
+ echo ( $heading ? '!' : '|' ) . "$in\n";
}
function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
- $v = @round(255 * $subset / $total);
+ $v = @round( 255 * $subset / $total );
if ( $revert ) {
+ # Weigh reverse with factor 20 so coloring takes effect more quickly as
+ # this option is used solely for reporting 'bad' percentages.
+ $v = $v * 20;
+ if ( $v > 255 ) $v = 255;
$v = 255 - $v;
}
if ( $v < 128 ) {
@@ -61,21 +64,21 @@ class wikiStatsOutput extends statsOutput {
$green = sprintf( '%02X', 2 * $v );
} else {
# Yellow to Green
- $red = sprintf('%02X', 2 * ( 255 - $v ) );
+ $red = sprintf( '%02X', 2 * ( 255 - $v ) );
$green = 'FF';
}
$blue = '00';
$color = $red . $green . $blue;
- $percent = statsOutput::formatPercent( $subset, $total, $revert, $accuracy );
- return 'bgcolor="#'. $color .'"|'. $percent;
+ $percent = parent::formatPercent( $subset, $total, $revert, $accuracy );
+ return 'bgcolor="#' . $color . '"|' . $percent;
}
}
/** Output text. To be used on a terminal for example. */
class textStatsOutput extends statsOutput {
function element( $in, $heading = false ) {
- echo $in."\t";
+ echo $in . "\t";
}
function blockend() {
echo "\n";
diff --git a/maintenance/language/alltrans.php b/maintenance/language/alltrans.php
index 420386fd..f872e6a6 100644
--- a/maintenance/language/alltrans.php
+++ b/maintenance/language/alltrans.php
@@ -20,7 +20,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class AllTrans extends Maintenance {
public function __construct() {
@@ -29,12 +29,12 @@ class AllTrans extends Maintenance {
}
public function execute() {
- $wgEnglishMessages = array_keys( Language::getMessagesFor( 'en' ) );
- foreach( $wgEnglishMessages as $key ) {
+ $englishMessages = array_keys( Language::getMessagesFor( 'en' ) );
+ foreach ( $englishMessages as $key ) {
$this->output( "$key\n" );
}
}
}
$maintClass = "AllTrans";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/checkDupeMessages.php b/maintenance/language/checkDupeMessages.php
index 81eafccf..ea9d5fb7 100644
--- a/maintenance/language/checkDupeMessages.php
+++ b/maintenance/language/checkDupeMessages.php
@@ -5,22 +5,22 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__).'/../commandLine.inc' );
-$messagesDir = dirname(__FILE__).'/../../languages/messages/';
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+$messagesDir = dirname( __FILE__ ) . '/../../languages/messages/';
$runTest = false;
$run = false;
$runMode = 'text';
// Check parameters
-if ( isset( $options['lang'] ) && isset( $options['clang'] )) {
- if (!isset( $options['mode'] )) {
+if ( isset( $options['lang'] ) && isset( $options['clang'] ) ) {
+ if ( !isset( $options['mode'] ) ) {
$runMode = 'text';
} else {
- if (!strcmp($options['mode'],'wiki')) {
+ if ( !strcmp( $options['mode'], 'wiki' ) ) {
$runMode = 'wiki';
- } else if (!strcmp($options['mode'],'php')) {
+ } else if ( !strcmp( $options['mode'], 'php' ) ) {
$runMode = 'php';
- } else if (!strcmp($options['mode'],'raw')) {
+ } else if ( !strcmp( $options['mode'], 'raw' ) ) {
$runMode = 'raw';
} else {
}
@@ -45,11 +45,11 @@ TEXT;
if ( $runTest ) {
$langCode = $options['lang'];
$langCodeC = $options['clang'];
- $langCodeF = ucfirst(strtolower(preg_replace('/-/','_',$langCode)));
- $langCodeFC = ucfirst(strtolower(preg_replace('/-/','_',$langCodeC)));
- $messagesFile = $messagesDir.'Messages'.$langCodeF.'.php';
- $messagesFileC = $messagesDir.'Messages'.$langCodeFC.'.php';
- if (file_exists($messagesFile) && file_exists($messagesFileC)) {
+ $langCodeF = ucfirst( strtolower( preg_replace( '/-/', '_', $langCode ) ) );
+ $langCodeFC = ucfirst( strtolower( preg_replace( '/-/', '_', $langCodeC ) ) );
+ $messagesFile = $messagesDir . 'Messages' . $langCodeF . '.php';
+ $messagesFileC = $messagesDir . 'Messages' . $langCodeFC . '.php';
+ if ( file_exists( $messagesFile ) && file_exists( $messagesFileC ) ) {
$run = true;
}
else {
@@ -59,60 +59,60 @@ if ( $runTest ) {
// Run to check the dupes
if ( $run ) {
- if (!strcmp($runMode,'wiki')) {
+ if ( !strcmp( $runMode, 'wiki' ) ) {
$runMode = 'wiki';
- } else if (!strcmp($runMode,'raw')) {
+ } else if ( !strcmp( $runMode, 'raw' ) ) {
$runMode = 'raw';
}
include( $messagesFile );
- $messageExist = isset($messages);
- if ($messageExist)
+ $messageExist = isset( $messages );
+ if ( $messageExist )
$wgMessages[$langCode] = $messages;
include( $messagesFileC );
- $messageCExist = isset($messages);
- if ($messageCExist)
+ $messageCExist = isset( $messages );
+ if ( $messageCExist )
$wgMessages[$langCodeC] = $messages;
$count = 0;
- if (($messageExist) && ($messageCExist)) {
+ if ( ( $messageExist ) && ( $messageCExist ) ) {
- if (!strcmp($runMode,'php')) {
- print("<?php\n");
- print('$dupeMessages = array('."\n");
+ if ( !strcmp( $runMode, 'php' ) ) {
+ print( "<?php\n" );
+ print( '$dupeMessages = array(' . "\n" );
}
- foreach ($wgMessages[$langCodeC] as $key => $value) {
- foreach ($wgMessages[$langCode] as $ckey => $cvalue) {
- if (!strcmp($key,$ckey)) {
- if ((!strcmp($key,$ckey)) && (!strcmp($value,$cvalue))) {
- if (!strcmp($runMode,'raw')) {
- print("$key\n");
- } else if (!strcmp($runMode,'php')) {
- print("'$key' => '',\n");
- } else if (!strcmp($runMode,'wiki')) {
- $uKey = ucfirst($key);
- print("* MediaWiki:$uKey/$langCode\n");
+ foreach ( $wgMessages[$langCodeC] as $key => $value ) {
+ foreach ( $wgMessages[$langCode] as $ckey => $cvalue ) {
+ if ( !strcmp( $key, $ckey ) ) {
+ if ( ( !strcmp( $key, $ckey ) ) && ( !strcmp( $value, $cvalue ) ) ) {
+ if ( !strcmp( $runMode, 'raw' ) ) {
+ print( "$key\n" );
+ } else if ( !strcmp( $runMode, 'php' ) ) {
+ print( "'$key' => '',\n" );
+ } else if ( !strcmp( $runMode, 'wiki' ) ) {
+ $uKey = ucfirst( $key );
+ print( "* MediaWiki:$uKey/$langCode\n" );
} else {
- print("* $key\n");
+ print( "* $key\n" );
}
$count++;
}
}
}
}
- if (!strcmp($runMode,'php')) {
- print(");\n");
+ if ( !strcmp( $runMode, 'php' ) ) {
+ print( ");\n" );
}
- if (!strcmp($runMode,'text')) {
- if ($count == 1) {
+ if ( !strcmp( $runMode, 'text' ) ) {
+ if ( $count == 1 ) {
echo "\nThere are $count duplicated message in $langCode, against to $langCodeC.\n";
} else {
echo "\nThere are $count duplicated messages in $langCode, against to $langCodeC.\n";
}
}
} else {
- if (!$messageExist)
+ if ( !$messageExist )
echo "There are no messages defined in $langCode.\n";
- if (!$messageCExist)
+ if ( !$messageCExist )
echo "There are no messages defined in $langCodeC.\n";
- }
+ }
}
diff --git a/maintenance/language/checkExtensions.php b/maintenance/language/checkExtensions.php
index ed1855c1..c05cf193 100644
--- a/maintenance/language/checkExtensions.php
+++ b/maintenance/language/checkExtensions.php
@@ -6,11 +6,11 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__).'/../commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
require_once( 'languages.inc' );
require_once( 'checkLanguage.inc' );
-if( !class_exists( 'MessageGroups' ) || !class_exists( 'PremadeMediawikiExtensionGroups' ) ) {
+if ( !class_exists( 'MessageGroups' ) || !class_exists( 'PremadeMediawikiExtensionGroups' ) ) {
echo <<<TEXT
Please add the Translate extension to LocalSettings.php, and enable the extension groups:
require_once( 'extensions/Translate/Translate.php' );
@@ -18,7 +18,7 @@ Please add the Translate extension to LocalSettings.php, and enable the extensio
If you still get this message, update Translate to its latest version.
TEXT;
- exit(-1);
+ exit( -1 );
}
$cli = new CheckExtensionsCLI( $options, $argv[0] );
diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc
index fc77aad3..d8480c0f 100644
--- a/maintenance/language/checkLanguage.inc
+++ b/maintenance/language/checkLanguage.inc
@@ -1,8 +1,8 @@
<?php
+
/**
* @ingroup MaintenanceLanguage
*/
-
class CheckLanguageCLI {
protected $code = null;
protected $level = 2;
@@ -190,17 +190,23 @@ class CheckLanguageCLI {
Run this script to check a specific language file, or all of them.
Command line settings are in form --parameter[=value].
Parameters:
- * lang: Language code (default: the installation default language).
- * all: Check all customized languages.
- * help: Show this help.
- * level: Show the following display level (default: 2).
- * links: Link the message values (default off).
- * prefix: prefix to add to links.
- * wikilang: For the links, what is the content language of the wiki to display the output in (default en).
- * whitelist: Do only the following checks (form: code,code).
- * blacklist: Don't do the following checks (form: code,code).
- * easy: Do only the easy checks, which can be treated by non-speakers of the language.
- * noexif: Don't check for EXIF messages (a bit hard and boring to translate), if you know that they are currently not translated and want to focus on other problems (default off).
+ --help: Show this help.
+ --lang: Language code (default: the installation default language).
+ --all: Check all customized languages.
+ --level: Show the following display level (default: 2):
+ * 0: Skip the checks (useful for checking syntax).
+ * 1: Show only the stub headers and number of wrong messages, without list of messages.
+ * 2: Show only the headers and the message keys, without the message values.
+ * 3: Show both the headers and the complete messages, with both keys and values.
+ --links: Link the message values (default off).
+ --prefix: prefix to add to links.
+ --wikilang: For the links, what is the content language of the wiki to display the output in (default en).
+ --noexif: Don't check for EXIF messages (a bit hard and boring to translate), if you know
+ that they are currently not translated and want to focus on other problems (default off).
+ --whitelist: Do only the following checks (form: code,code).
+ --blacklist: Don't do the following checks (form: code,code).
+ --easy: Do only the easy checks, which can be treated by non-speakers of the language.
+
Check codes (ideally, all of them should result 0; all the checks are executed by default (except language-specific check blacklists in checkLanguage.inc):
* untranslated: Messages which are required to translate, but are not translated.
* duplicate: Messages which translation equal to fallback
@@ -220,11 +226,6 @@ Check codes (ideally, all of them should result 0; all the checks are executed b
* magic-case: Magic words whose translation changes the case-sensitivity of the original English word.
* special: Special page names that were not translated.
* special-old: Special page names which do not exist.
-Display levels (default: 2):
- * 0: Skip the checks (useful for checking syntax).
- * 1: Show only the stub headers and number of wrong messages, without list of messages.
- * 2: Show only the headers and the message keys, without the message values.
- * 3: Show both the headers and the complete messages, with both keys and values.
ENDS;
}
@@ -382,7 +383,7 @@ ENDS;
* @return The checks results as wiki text.
*/
function outputWiki() {
- global $wgContLang, $IP;
+ global $wgContLang;
$detailText = '';
$rows[] = '! Language !! Code !! Total !! ' . implode( ' !! ', array_diff( $this->checks, $this->nonMessageChecks() ) );
foreach ( $this->results as $code => $results ) {
@@ -443,8 +444,8 @@ EOL;
* @return True if there are any results, false if not.
*/
protected function isEmpty() {
- foreach( $this->results as $code => $results ) {
- foreach( $results as $check => $messages ) {
+ foreach( $this->results as $results ) {
+ foreach( $results as $messages ) {
if( !empty( $messages ) ) {
return false;
}
@@ -454,6 +455,9 @@ EOL;
}
}
+/**
+ * @ingroup MaintenanceLanguage
+ */
class CheckExtensionsCLI extends CheckLanguageCLI {
private $extensions;
diff --git a/maintenance/language/checkLanguage.php b/maintenance/language/checkLanguage.php
index 7a4d3dd2..9396e8c1 100644
--- a/maintenance/language/checkLanguage.php
+++ b/maintenance/language/checkLanguage.php
@@ -6,7 +6,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__).'/../commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
require_once( 'checkLanguage.inc' );
require_once( 'languages.inc' );
@@ -14,6 +14,6 @@ $cli = new CheckLanguageCLI( $options );
try {
$cli->execute();
-} catch( MWException $e ) {
+} catch ( MWException $e ) {
print 'Error: ' . $e->getMessage() . "\n";
}
diff --git a/maintenance/language/countMessages.php b/maintenance/language/countMessages.php
index 826c43cb..f949ddc2 100644
--- a/maintenance/language/countMessages.php
+++ b/maintenance/language/countMessages.php
@@ -20,7 +20,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class CountMessages extends Maintenance {
public function __construct() {
@@ -35,12 +35,12 @@ class CountMessages extends Maintenance {
$nonZero = 0;
foreach ( glob( "$dir/*.php" ) as $file ) {
$baseName = basename( $file );
- if( !preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $baseName, $m ) ) {
+ if ( !preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $baseName, $m ) ) {
continue;
}
- $code = str_replace( '_', '-', strtolower( $m[1] ) );
+
$numMessages = $this->getNumMessages( $file );
- //print "$code: $numMessages\n";
+ // print "$code: $numMessages\n";
$total += $numMessages;
if ( $numMessages > 0 ) {
$nonZero ++;
@@ -62,4 +62,4 @@ class CountMessages extends Maintenance {
}
$maintClass = "CountMessages";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/date-formats.php b/maintenance/language/date-formats.php
index 54a6a26d..04f5e8ba 100644
--- a/maintenance/language/date-formats.php
+++ b/maintenance/language/date-formats.php
@@ -20,7 +20,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class DateFormats extends Maintenance {
@@ -60,7 +60,7 @@ class DateFormats extends Maintenance {
}
$this->output( $lang->time( $this->ts, false, $pref ) );
}
- $this->output( "\n$code both: " );
+ $this->output( "\n$code both: " );
foreach ( $prefs as $index => $pref ) {
if ( $index > 0 ) {
$this->output( ' | ' );
@@ -73,4 +73,4 @@ class DateFormats extends Maintenance {
}
$maintClass = "DateFormats";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/diffLanguage.php b/maintenance/language/diffLanguage.php
deleted file mode 100644
index bbdb8653..00000000
--- a/maintenance/language/diffLanguage.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-# MediaWiki web-based config/installation
-# Copyright (C) 2004 Ashar Voultoiz <thoane@altern.org> and others
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * Usage: php DiffLanguage.php [lang [file]]
- *
- * lang: Enter the language code following "Language" of the LanguageXX.php you
- * want to check. If using linux you might need to follow case aka Zh and not
- * zh.
- *
- * file: A php language file you want to include to compare mediawiki
- * Language{Lang}.php against (for example Special:Allmessages PHP output).
- *
- * The goal is to get a list of messages not yet localised in a languageXX.php
- * file using the language.php file as reference.
- *
- * The script then print a list of wgAllMessagesXX keys that aren't localised, a
- * percentage of messages correctly localised and the number of messages to be
- * translated.
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-/** This script run from the commandline */
-require_once( dirname(__FILE__).'/../parserTests.inc' );
-require_once( dirname(__FILE__).'/../commandLine.inc' );
-
-if( isset($options['help']) ) { usage(); wfDie(); }
-
-$wgLanguageCode = ucfirstlcrest($wgLanguageCode);
-/** Language messages we will use as reference. By default 'en' */
-$referenceMessages = $wgAllMessagesEn;
-$referenceLanguage = 'En';
-$referenceFilename = 'Language'.$referenceLanguage.'.php';
-/** Language messages we will test. */
-$testMessages = array();
-$testLanguage = '';
-/** whereas we use an external language file */
-$externalRef = false;
-
-# FUNCTIONS
-/** @todo more informations !! */
-function usage() {
-echo 'php DiffLanguage.php [lang [file]] [--color=(yes|no|light)]'."\n";
-}
-
-/** Return a given string with first letter upper case, the rest lowercase */
-function ucfirstlcrest($string) {
- return strtoupper(substr($string,0,1)).strtolower(substr($string,1));
-}
-
-/**
- * Return a $wgAllmessages array shipped in MediaWiki
- * @param $languageCode String: formated language code
- * @return array The MediaWiki default $wgAllMessages array requested
- */
-function getMediawikiMessages($languageCode = 'En') {
-
- $foo = "wgAllMessages$languageCode";
- global $$foo;
- global $wgSkinNamesEn; // potentially unused global declaration?
-
- // it might already be loaded in LocalSettings.php
- if(!isset($$foo)) {
- global $IP;
- $langFile = $IP.'/languages/classes/Language'.$languageCode.'.php';
- if (file_exists( $langFile ) ) {
- print "Including $langFile\n";
- include($langFile);
- } else wfDie("ERROR: The file $langFile does not exist !\n");
- }
- return $$foo;
-}
-
-/**
- * Return a $wgAllmessages array in a given file. Language of the array
- * need to be given cause we can not detect which language it provides
- * @param $filename String: filename of the file containing a message array
- * @param $languageCode String: language of the external array
- * @return array A $wgAllMessages array from an external file.
- */
-function getExternalMessages($filename, $languageCode) {
- print "Including external file $filename.\n";
- include($filename);
- $foo = "wgAllMessages$languageCode";
- return $$foo;
-}
-
-# MAIN ENTRY
-if ( isset($args[0]) ) {
- $lang = ucfirstlcrest($args[0],1);
-
- // eventually against another language file we will use as reference instead
- // of the default english language.
- if( isset($args[1])) {
- // we assume the external file contain an array of messages for the
- // lang we are testing
- $referenceMessages = getExternalMessages( $args[1], $lang );
- $referenceLanguage = $lang;
- $referenceFilename = $args[1];
- $externalRef = true;
- }
-
- // Load datas from MediaWiki
- $testMessages = getMediawikiMessages($lang);
- $testLanguage = $lang;
-} else {
- usage();
- wfDie();
-}
-
-/** parsertest is used to do differences */
-$myParserTest = new ParserTest();
-
-# Get all references messages and check if they exist in the tested language
-$i = 0;
-
-$msg = "MW Language{$testLanguage}.php against ";
-if($externalRef) { $msg .= 'external file '; }
-else { $msg .= 'internal file '; }
-$msg .= $referenceFilename.' ('.$referenceLanguage."):\n----\n";
-echo $msg;
-
-// process messages
-foreach($referenceMessages as $index => $ref)
-{
- // message is not localized
- if(!(isset($testMessages[$index]))) {
- $i++;
- print "'$index' => \"$ref\",\n";
- // Messages in the same language differs
- } elseif( ($lang == $referenceLanguage) AND ($testMessages[$index] != $ref)) {
- print "\n$index differs:\n";
- print $myParserTest->quickDiff($testMessages[$index],$ref,'tested','reference');
- }
-}
-
-echo "\n----\n".$msg;
-echo "$referenceLanguage language is complete at ".number_format((100 - $i/count($wgAllMessagesEn) * 100),2)."%\n";
-echo "$i unlocalised messages of the ".count($wgAllMessagesEn)." messages available.\n";
-
diff --git a/maintenance/language/digit2html.php b/maintenance/language/digit2html.php
index 54630af0..a80ac014 100644
--- a/maintenance/language/digit2html.php
+++ b/maintenance/language/digit2html.php
@@ -18,17 +18,17 @@
* @ingroup MaintenanceLanguage
*/
-require_once( dirname(__FILE__).'/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class Digit2Html extends Maintenance {
# A list of unicode numerals is available at:
# http://www.fileformat.info/info/unicode/category/Nd/list.htm
- private $mLangs = array(
- 'Ar', 'As', 'Bh', 'Bo', 'Dz',
- 'Fa', 'Gu', 'Hi', 'Km', 'Kn',
- 'Ks', 'Lo', 'Ml', 'Mr', 'Ne',
- 'New', 'Or', 'Pa', 'Pi', 'Sa'
+ private $mLangs = array(
+ 'Ar', 'As', 'Bh', 'Bo', 'Dz',
+ 'Fa', 'Gu', 'Hi', 'Km', 'Kn',
+ 'Ks', 'Lo', 'Ml', 'Mr', 'Ne',
+ 'New', 'Or', 'Pa', 'Pi', 'Sa'
);
public function __construct() {
@@ -37,18 +37,18 @@ class Digit2Html extends Maintenance {
}
public function execute() {
- foreach( $this->mLangs as $code ) {
+ foreach ( $this->mLangs as $code ) {
$filename = Language::getMessagesFileName( $code );
$this->output( "Loading language [$code] ... " );
unset( $digitTransformTable );
require_once( $filename );
- if( !isset( $digitTransformTable ) ) {
+ if ( !isset( $digitTransformTable ) ) {
$this->error( "\$digitTransformTable not found for lang: $code" );
continue;
}
$this->output( "OK\n\$digitTransformTable = array(\n" );
- foreach( $digitTransformTable as $latin => $translation ) {
+ foreach ( $digitTransformTable as $latin => $translation ) {
$htmlent = utf8ToHexSequence( $translation );
$this->output( "'$latin' => '$translation', # &#x$htmlent;\n" );
}
@@ -58,4 +58,4 @@ class Digit2Html extends Maintenance {
}
$maintClass = "Digit2Html";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/dumpMessages.php b/maintenance/language/dumpMessages.php
index a0f0a9ab..9bdda09d 100644
--- a/maintenance/language/dumpMessages.php
+++ b/maintenance/language/dumpMessages.php
@@ -22,7 +22,7 @@
* @todo Make this more useful, right now just dumps $wgContentLang
*/
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class DumpMessages extends Maintenance {
public function __construct() {
@@ -31,6 +31,8 @@ class DumpMessages extends Maintenance {
}
public function execute() {
+ global $wgVersion;
+
$messages = array();
foreach ( array_keys( Language::getMessagesFor( 'en' ) ) as $key ) {
$messages[$key] = wfMsg( $key );
@@ -41,4 +43,4 @@ class DumpMessages extends Maintenance {
}
$maintClass = "DumpMessages";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/function-list.php b/maintenance/language/function-list.php
index f0c398a6..7985f37d 100644
--- a/maintenance/language/function-list.php
+++ b/maintenance/language/function-list.php
@@ -7,15 +7,15 @@
define( 'MEDIAWIKI', 1 );
define( 'NOT_REALLY_MEDIAWIKI', 1 );
-class Language {}
+class Language { }
foreach ( glob( 'Language*.php' ) as $file ) {
if ( $file != 'Language.php' ) {
require_once( $file );
}
}
-$removedFunctions = array( 'date', 'time', 'timeanddate', 'formatMonth', 'formatDay',
- 'getMonthName', 'getMonthNameGen', 'getMonthAbbreviation', 'getWeekdayName',
+$removedFunctions = array( 'date', 'time', 'timeanddate', 'formatMonth', 'formatDay',
+ 'getMonthName', 'getMonthNameGen', 'getMonthAbbreviation', 'getWeekdayName',
'userAdjust', 'dateFormat', 'timeSeparator', 'timeDateSeparator', 'timeBeforeDate',
'monthByLatinNumber', 'getSpecialMonthName',
diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php
new file mode 100644
index 00000000..68ad2ddf
--- /dev/null
+++ b/maintenance/language/generateCollationData.php
@@ -0,0 +1,381 @@
+<?php
+
+require_once( dirname( __FILE__ ) .'/../Maintenance.php' );
+
+/**
+ * Generate first letter data files for Collation.php
+ */
+class GenerateCollationData extends Maintenance {
+ /** The directory with source data files in it */
+ var $dataDir;
+
+ /** The primary weights, indexed by codepoint */
+ var $weights;
+
+ /**
+ * A hashtable keyed by codepoint, where presence indicates that a character
+ * has a decomposition mapping. This makes it non-preferred for group header
+ * selection.
+ */
+ var $mappedChars;
+
+ var $debugOutFile;
+
+ /**
+ * Important tertiary weights from UTS #10 section 7.2
+ */
+ const NORMAL_UPPERCASE = 0x08;
+ const NORMAL_HIRAGANA = 0X0E;
+
+ public function __construct() {
+ parent::__construct();
+ $this->addOption( 'data-dir', 'A directory on the local filesystem ' .
+ 'containing allkeys.txt and ucd.all.grouped.xml from unicode.org',
+ false, true );
+ $this->addOption( 'debug-output', 'Filename for sending debug output to',
+ false, true );
+ }
+
+ public function execute() {
+ $this->dataDir = $this->getOption( 'data-dir', '.' );
+ if ( !file_exists( "{$this->dataDir}/allkeys.txt" ) ) {
+ $this->error( "Unable to find allkeys.txt. Please download it from " .
+ "http://www.unicode.org/Public/UCA/latest/allkeys.txt and specify " .
+ "its location with --data-dir=<DIR>" );
+ exit( 1 );
+ }
+ if ( !file_exists( "{$this->dataDir}/ucd.all.grouped.xml" ) ) {
+ $this->error( "Unable to find ucd.all.grouped.xml. Please download it " .
+ "from http://www.unicode.org/Public/6.0.0/ucdxml/ucd.all.grouped.zip " .
+ "and specify its location with --data-dir=<DIR>" );
+ exit( 1 );
+ }
+ $debugOutFileName = $this->getOption( 'debug-output' );
+ if ( $debugOutFileName ) {
+ $this->debugOutFile = fopen( $debugOutFileName, 'w' );
+ if ( !$this->debugOutFile ) {
+ $this->error( "Unable to open debug output file for writing" );
+ exit( 1 );
+ }
+ }
+ $this->loadUcd();
+ $this->generateFirstChars();
+ }
+
+ function loadUcd() {
+ $uxr = new UcdXmlReader( "{$this->dataDir}/ucd.all.grouped.xml" );
+ $uxr->readChars( array( $this, 'charCallback' ) );
+ }
+
+ function charCallback( $data ) {
+ // Skip non-printable characters
+ $category = substr( $data['gc'], 0, 1 );
+ if ( strpos( 'LNPS', $category ) === false ) {
+ return;
+ }
+ $cp = hexdec( $data['cp'] );
+
+ // Skip the CJK ideograph blocks, as an optimisation measure.
+ // UCA doesn't sort them properly anyway, without tailoring.
+ if ( IcuCollation::isCjk( $cp ) ) {
+ return;
+ }
+
+ // Skip the composed Hangul syllables, we will use the bare Jamo
+ // as first letters
+ if ( $data['block'] == 'Hangul Syllables' ) {
+ return;
+ }
+
+ // Calculate implicit weight per UTS #10 v6.0.0, sec 7.1.3
+ if ( $data['UIdeo'] === 'Y' ) {
+ if ( $data['block'] == 'CJK Unified Ideographs'
+ || $data['block'] == 'CJK Compatibility Ideographs' )
+ {
+ $base = 0xFB40;
+ } else {
+ $base = 0xFB80;
+ }
+ } else {
+ $base = 0xFBC0;
+ }
+ $a = $base + ( $cp >> 15 );
+ $b = ( $cp & 0x7fff ) | 0x8000;
+
+ $this->weights[$cp] = sprintf( ".%04X.%04X", $a, $b );
+
+ if ( $data['dm'] !== '#' ) {
+ $this->mappedChars[$cp] = true;
+ }
+
+ if ( $cp % 4096 == 0 ) {
+ print "{$data['cp']}\n";
+ }
+ }
+
+ function generateFirstChars() {
+ $file = fopen( "{$this->dataDir}/allkeys.txt", 'r' );
+ if ( !$file ) {
+ $this->error( "Unable to open allkeys.txt" );
+ exit( 1 );
+ }
+ global $IP;
+ $outFile = fopen( "$IP/serialized/first-letters-root.ser", 'w' );
+ if ( !$outFile ) {
+ $this->error( "Unable to open output file first-letters-root.ser" );
+ exit( 1 );
+ }
+
+ $goodTertiaryChars = array();
+
+ // For each character with an entry in allkeys.txt, overwrite the implicit
+ // entry in $this->weights that came from the UCD.
+ // Also gather a list of tertiary weights, for use in selecting the group header
+ while ( false !== ( $line = fgets( $file ) ) ) {
+ // We're only interested in single-character weights, pick them out with a regex
+ $line = trim( $line );
+ if ( !preg_match( '/^([0-9A-F]+)\s*;\s*([^#]*)/', $line, $m ) ) {
+ continue;
+ }
+
+ $cp = hexdec( $m[1] );
+ $allWeights = trim( $m[2] );
+ $primary = '';
+ $tertiary = '';
+
+ if ( !isset( $this->weights[$cp] ) ) {
+ // Non-printable, ignore
+ continue;
+ }
+ foreach ( StringUtils::explode( '[', $allWeights ) as $weightStr ) {
+ preg_match_all( '/[*.]([0-9A-F]+)/', $weightStr, $m );
+ if ( !empty( $m[1] ) ) {
+ if ( $m[1][0] !== '0000' ) {
+ $primary .= '.' . $m[1][0];
+ }
+ if ( $m[1][2] !== '0000' ) {
+ $tertiary .= '.' . $m[1][2];
+ }
+ }
+ }
+ $this->weights[$cp] = $primary;
+ if ( $tertiary === '.0008'
+ || $tertiary === '.000E' )
+ {
+ $goodTertiaryChars[$cp] = true;
+ }
+ }
+ fclose( $file );
+
+ // Identify groups of characters with the same primary weight
+ $this->groups = array();
+ asort( $this->weights, SORT_STRING );
+ $prevWeight = reset( $this->weights );
+ $group = array();
+ foreach ( $this->weights as $cp => $weight ) {
+ if ( $weight !== $prevWeight ) {
+ $this->groups[$prevWeight] = $group;
+ $prevWeight = $weight;
+ if ( isset( $this->groups[$weight] ) ) {
+ $group = $this->groups[$weight];
+ } else {
+ $group = array();
+ }
+ }
+ $group[] = $cp;
+ }
+ if ( $group ) {
+ $this->groups[$prevWeight] = $group;
+ }
+
+ // If one character has a given primary weight sequence, and a second
+ // character has a longer primary weight sequence with an initial
+ // portion equal to the first character, then remove the second
+ // character. This avoids having characters like U+A732 (double A)
+ // polluting the basic latin sort area.
+ $prevWeights = array();
+ foreach ( $this->groups as $weight => $group ) {
+ if ( preg_match( '/(\.[0-9A-F]*)\./', $weight, $m ) ) {
+ if ( isset( $this->groups[$m[1]] ) ) {
+ unset( $this->groups[$weight] );
+ }
+ }
+ }
+
+ ksort( $this->groups, SORT_STRING );
+
+ // Identify the header character in each group
+ $headerChars = array();
+ $prevChar = "\000";
+ $tertiaryCollator = new Collator( 'root' );
+ $primaryCollator = new Collator( 'root' );
+ $primaryCollator->setStrength( Collator::PRIMARY );
+ $numOutOfOrder = 0;
+ foreach ( $this->groups as $weight => $group ) {
+ $uncomposedChars = array();
+ $goodChars = array();
+ foreach ( $group as $cp ) {
+ if ( isset( $goodTertiaryChars[$cp] ) ) {
+ $goodChars[] = $cp;
+ }
+ if ( !isset( $this->mappedChars[$cp] ) ) {
+ $uncomposedChars[] = $cp;
+ }
+ }
+ $x = array_intersect( $goodChars, $uncomposedChars );
+ if ( !$x ) {
+ $x = $uncomposedChars;
+ if ( !$x ) {
+ $x = $group;
+ }
+ }
+
+ // Use ICU to pick the lowest sorting character in the selection
+ $tertiaryCollator->sort( $x );
+ $cp = $x[0];
+
+ $char = codepointToUtf8( $cp );
+ $headerChars[] = $char;
+ if ( $primaryCollator->compare( $char, $prevChar ) <= 0 ) {
+ $numOutOfOrder ++;
+ /*
+ printf( "Out of order: U+%05X > U+%05X\n",
+ utf8ToCodepoint( $prevChar ),
+ utf8ToCodepoint( $char ) );
+ */
+ }
+ $prevChar = $char;
+
+ if ( $this->debugOutFile ) {
+ fwrite( $this->debugOutFile, sprintf( "%05X %s %s (%s)\n", $cp, $weight, $char,
+ implode( ' ', array_map( 'codepointToUtf8', $group ) ) ) );
+ }
+ }
+
+ print "Out of order: $numOutOfOrder / " . count( $headerChars ) . "\n";
+
+ fwrite( $outFile, serialize( $headerChars ) );
+ }
+}
+
+class UcdXmlReader {
+ var $fileName;
+ var $callback;
+ var $groupAttrs;
+ var $xml;
+ var $blocks = array();
+ var $currentBlock;
+
+ function __construct( $fileName ) {
+ $this->fileName = $fileName;
+ }
+
+ public function readChars( $callback ) {
+ $this->getBlocks();
+ $this->currentBlock = reset( $this->blocks );
+ $xml = $this->open();
+ $this->callback = $callback;
+
+ while ( $xml->name !== 'repertoire' && $xml->next() );
+
+ while ( $xml->read() ) {
+ if ( $xml->nodeType == XMLReader::ELEMENT ) {
+ if ( $xml->name === 'group' ) {
+ $this->groupAttrs = $this->readAttributes();
+ } elseif ( $xml->name === 'char' ) {
+ $this->handleChar();
+ }
+ } elseif ( $xml->nodeType === XMLReader::END_ELEMENT ) {
+ if ( $xml->name === 'group' ) {
+ $this->groupAttrs = array();
+ }
+ }
+ }
+ $xml->close();
+ }
+
+ protected function open() {
+ $this->xml = new XMLReader;
+ $this->xml->open( $this->fileName );
+ if ( !$this->xml ) {
+ throw new MWException( __METHOD__.": unable to open {$this->fileName}" );
+ }
+ while ( $this->xml->name !== 'ucd' && $this->xml->read() );
+ $this->xml->read();
+ return $this->xml;
+ }
+
+ /**
+ * Read the attributes of the current element node and return them
+ * as an array
+ */
+ protected function readAttributes() {
+ $attrs = array();
+ while ( $this->xml->moveToNextAttribute() ) {
+ $attrs[$this->xml->name] = $this->xml->value;
+ }
+ return $attrs;
+ }
+
+ protected function handleChar() {
+ $attrs = $this->readAttributes() + $this->groupAttrs;
+ if ( isset( $attrs['cp'] ) ) {
+ $first = $last = hexdec( $attrs['cp'] );
+ } else {
+ $first = hexdec( $attrs['first-cp'] );
+ $last = hexdec( $attrs['last-cp'] );
+ unset( $attrs['first-cp'] );
+ unset( $attrs['last-cp'] );
+ }
+
+ for ( $cp = $first; $cp <= $last; $cp++ ) {
+ $hexCp = sprintf( "%04X", $cp );
+ foreach ( array( 'na', 'na1' ) as $nameProp ) {
+ if ( isset( $attrs[$nameProp] ) ) {
+ $attrs[$nameProp] = str_replace( '#', $hexCp, $attrs[$nameProp] );
+ }
+ }
+
+ while ( $this->currentBlock ) {
+ if ( $cp < $this->currentBlock[0] ) {
+ break;
+ } elseif ( $cp <= $this->currentBlock[1] ) {
+ $attrs['block'] = key( $this->blocks );
+ break;
+ } else {
+ $this->currentBlock = next( $this->blocks );
+ }
+ }
+
+ $attrs['cp'] = $hexCp;
+ call_user_func( $this->callback, $attrs );
+ }
+ }
+
+ public function getBlocks() {
+ if ( $this->blocks ) {
+ return $this->blocks;
+ }
+
+ $xml = $this->open();
+ while ( $xml->name !== 'blocks' && $xml->read() );
+
+ while ( $xml->read() ) {
+ if ( $xml->nodeType == XMLReader::ELEMENT ) {
+ if ( $xml->name === 'block' ) {
+ $attrs = $this->readAttributes();
+ $first = hexdec( $attrs['first-cp'] );
+ $last = hexdec( $attrs['last-cp'] );
+ $this->blocks[$attrs['name']] = array( $first, $last );
+ }
+ }
+ }
+ $xml->close();
+ return $this->blocks;
+ }
+
+}
+
+$maintClass = 'GenerateCollationData';
+require_once( DO_MAINTENANCE );
+
diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerData.php
index d6b7aaa6..cb9910f3 100644
--- a/maintenance/language/generateNormalizerData.php
+++ b/maintenance/language/generateNormalizerData.php
@@ -87,8 +87,8 @@ class GenerateNormalizerData extends Maintenance {
// No decomposition
continue;
}
- if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
- $data['Decomposition_Type_Mapping'], $m ) )
+ if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
+ $data['Decomposition_Type_Mapping'], $m ) )
{
$this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" );
$this->error( $line );
@@ -133,5 +133,5 @@ class GenerateNormalizerData extends Maintenance {
}
$maintClass = 'GenerateNormalizerData';
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/lang2po.php b/maintenance/language/lang2po.php
index c7484d63..7e5dc472 100644
--- a/maintenance/language/lang2po.php
+++ b/maintenance/language/lang2po.php
@@ -25,18 +25,18 @@
*/
/** This is a command line script */
-require_once(dirname(__FILE__) . '/../Maintenance.php' );
-require_once(dirname(__FILE__) . '/languages.inc' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/languages.inc' );
-define('ALL_LANGUAGES', true);
-define('XGETTEXT_BIN', 'xgettext');
-define('MSGMERGE_BIN', 'msgmerge');
+define( 'ALL_LANGUAGES', true );
+define( 'XGETTEXT_BIN', 'xgettext' );
+define( 'MSGMERGE_BIN', 'msgmerge' );
// used to generate the .pot
-define('XGETTEXT_OPTIONS', '-n --keyword=wfMsg --keyword=wfMsgForContent --keyword=wfMsgHtml --keyword=wfMsgWikiHtml ');
-define('MSGMERGE_OPTIONS', ' -v ');
+define( 'XGETTEXT_OPTIONS', '-n --keyword=wfMsg --keyword=wfMsgForContent --keyword=wfMsgHtml --keyword=wfMsgWikiHtml ' );
+define( 'MSGMERGE_OPTIONS', ' -v ' );
-define('LOCALE_OUTPUT_DIR', $IP.'/locale');
+define( 'LOCALE_OUTPUT_DIR', $IP . '/locale' );
class Lang2Po extends Maintenance {
public function __construct() {
@@ -53,27 +53,28 @@ class Lang2Po extends Maintenance {
$langTool = new languages();
- if( $this->getOption( 'lang', ALL_LANGUAGES ) === ALL_LANGUAGES ) {
+ if ( $this->getOption( 'lang', ALL_LANGUAGES ) === ALL_LANGUAGES ) {
$codes = $langTool->getLanguages();
} else {
$codes = array( $this->getOption( 'lang' ) );
}
// Do all languages
- foreach ( $codes as $langcode) {
+ foreach ( $codes as $langcode ) {
$this->output( "Loading messages for $langcode:\n" );
- if( !$this->generatePo($langcode, $langTool->getMessages($langcode) ) ) {
+ if ( !$this->generatePo( $langcode, $langTool->getMessages( $langcode ) ) ) {
$this->error( "ERROR: Failed to write file." );
} else {
$this->output( "Applying template:" );
- $this->applyPot($langcode);
+ $this->applyPot( $langcode );
}
}
}
/**
* Return a dummy header for later edition.
- * @return string A dummy header
+ *
+ * @return String: a dummy header
*/
private function poHeader() {
return '# SOME DESCRIPTIVE TITLE.
@@ -99,34 +100,34 @@ msgstr ""
/**
* generate and write a file in .po format.
*
- * @param string $langcode Code of a language it will process.
- * @param array &$messages Array containing the various messages.
+ * @param $langcode String: code of a language it will process.
+ * @param $messages Array containing the various messages.
* @return string Filename where stuff got saved or false.
*/
- private function generatePo($langcode, $messages) {
+ private function generatePo( $langcode, $messages ) {
$data = $this->poHeader();
// Generate .po entries
- foreach( $messages['all'] as $identifier => $content ) {
+ foreach ( $messages['all'] as $identifier => $content ) {
$data .= "msgid \"$identifier\"\n";
// Escape backslashes
- $tmp = str_replace('\\', '\\\\', $content);
+ $tmp = str_replace( '\\', '\\\\', $content );
// Escape doublelquotes
- $tmp = preg_replace( "/(?<!\\\\)\"/", '\"', $tmp);
+ $tmp = preg_replace( "/(?<!\\\\)\"/", '\"', $tmp );
// Rewrite multilines to gettext format
- $tmp = str_replace("\n", "\"\n\"", $tmp);
+ $tmp = str_replace( "\n", "\"\n\"", $tmp );
- $data .= 'msgstr "'. $tmp . "\"\n\n";
+ $data .= 'msgstr "' . $tmp . "\"\n\n";
}
// Write the content to a file in locale/XX/messages.po
- $dir = LOCALE_OUTPUT_DIR.'/'.$langcode;
- if( !is_dir($dir) ) { mkdir( $dir, 0770 ); }
- $filename = $dir.'/fromlanguagefile.po';
+ $dir = LOCALE_OUTPUT_DIR . '/' . $langcode;
+ if ( !is_dir( $dir ) ) { mkdir( $dir, 0770 ); }
+ $filename = $dir . '/fromlanguagefile.po';
$file = fopen( $filename , 'wb' );
- if( fwrite( $file, $data ) ) {
+ if ( fwrite( $file, $data ) ) {
fclose( $file );
return $filename;
} else {
@@ -138,28 +139,28 @@ msgstr ""
private function generatePot() {
global $IP;
$curdir = getcwd();
- chdir($IP);
+ chdir( $IP );
exec( XGETTEXT_BIN
- .' '.XGETTEXT_OPTIONS
- .' -o '.LOCALE_OUTPUT_DIR.'/wfMsg.pot'
- .' includes/*php'
+ . ' ' . XGETTEXT_OPTIONS
+ . ' -o ' . LOCALE_OUTPUT_DIR . '/wfMsg.pot'
+ . ' includes/*php'
);
- chdir($curdir);
+ chdir( $curdir );
}
- private function applyPot($langcode) {
- $langdir = LOCALE_OUTPUT_DIR.'/'.$langcode;
+ private function applyPot( $langcode ) {
+ $langdir = LOCALE_OUTPUT_DIR . '/' . $langcode;
- $from = $langdir.'/fromlanguagefile.po';
- $pot = LOCALE_OUTPUT_DIR.'/wfMsg.pot';
- $dest = $langdir.'/messages.po';
+ $from = $langdir . '/fromlanguagefile.po';
+ $pot = LOCALE_OUTPUT_DIR . '/wfMsg.pot';
+ $dest = $langdir . '/messages.po';
// Merge template and generate file to get final .po
- exec(MSGMERGE_BIN.MSGMERGE_OPTIONS." $from $pot -o $dest ");
+ exec( MSGMERGE_BIN . MSGMERGE_OPTIONS . " $from $pot -o $dest " );
// delete no more needed file
// unlink($from);
}
}
$maintClass = "Lang2Po";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/langmemusage.php b/maintenance/language/langmemusage.php
index 71135474..28fe120e 100644
--- a/maintenance/language/langmemusage.php
+++ b/maintenance/language/langmemusage.php
@@ -22,8 +22,8 @@
*/
/** This is a command line script */
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
-require_once( dirname(__FILE__) . '/languages.inc' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/languages.inc' );
class LangMemUsage extends Maintenance {
@@ -45,15 +45,15 @@ class LangMemUsage extends Maintenance {
foreach ( $langtool->getLanguages() as $langcode ) {
Language::factory( $langcode );
$memstep = memory_get_usage();
- $this->output( sprintf( "%12s: %d\n", $langcode, ($memstep- $memlast) ) );
+ $this->output( sprintf( "%12s: %d\n", $langcode, ( $memstep - $memlast ) ) );
$memlast = $memstep;
}
$memend = memory_get_usage();
- $this->output( ' Total Usage: '.($memend - $memstart)."\n" );
+ $this->output( ' Total Usage: ' . ( $memend - $memstart ) . "\n" );
}
}
$maintClass = "LangMemUsage";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc
index 98464292..c5c9f650 100644
--- a/maintenance/language/languages.inc
+++ b/maintenance/language/languages.inc
@@ -547,7 +547,9 @@ class languages {
public function getUntranslatedNamespaces( $code ) {
$this->loadFile( 'en' );
$this->loadFile( $code );
- return array_flip( array_diff_key( $this->mNamespaceNames['en'], $this->mNamespaceNames[$code] ) );
+ $namespacesDiff = array_diff_key( $this->mNamespaceNames['en'], $this->mNamespaceNames[$code] );
+ if ( isset( $namespacesDiff[NS_MAIN] ) ) unset( $namespacesDiff[NS_MAIN] );
+ return $namespacesDiff;
}
/**
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
index 9b979b19..9baf7e76 100644
--- a/maintenance/language/messageTypes.inc
+++ b/maintenance/language/messageTypes.inc
@@ -69,11 +69,18 @@ $wgIgnoredMessages = array(
'accesskey-compareselectedversions',
'accesskey-watch',
'accesskey-upload',
+ 'accesskey-preferences-save',
+ 'accesskey-summary',
+ 'accesskey-userrights-set',
+ 'accesskey-blockip-block',
+ 'accesskey-export',
+ 'accesskey-import',
'addsection',
'talkpageheader',
'anonnotice',
'autoblock_whitelist',
'searchmenu-help',
+ 'searchmenu-new-nocreate',
'googlesearch',
'opensearch-desc',
'exif-make-value',
@@ -84,6 +91,8 @@ $wgIgnoredMessages = array(
'loginstart',
'loginend',
'loginlanguagelinks',
+ 'pear-mail-error',
+ 'php-mail-error',
'markaspatrolledlink',
'newarticletextanon',
'newsectionheaderdefaultlevel',
@@ -94,13 +103,13 @@ $wgIgnoredMessages = array(
'pubmedurl',
'randompage-url',
'recentchanges-url',
- 'cantcreateaccount-nonblock-text',
'revision-info-current',
'revision-nav',
'rfcurl',
'shareddescriptionfollows',
'signature',
'signature-anon',
+ 'signupstart',
'signupend',
'sitenotice',
'sitesubtitle',
@@ -160,6 +169,7 @@ $wgIgnoredMessages = array(
'editpage-tos-summary',
'addsection-preload',
'addsection-editintro',
+ 'longpage-hint',
);
/** Optional messages, which may be translated only if changed in the target language. */
@@ -257,7 +267,6 @@ $wgOptionalMessages = array(
'exif-lightsource-21',
'exif-lightsource-22',
'exif-lightsource-23',
- 'exif-filesource-3',
'booksources-isbn',
'sp-contributions-explain',
'sorbs',
@@ -353,6 +362,8 @@ $wgOptionalMessages = array(
'prefs-registration-date-time',
'prefs-memberingroups-type',
'shared-repo-name-wikimediacommons',
+ 'usermessage-template',
+ 'filepage.css',
);
/** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
@@ -589,4 +600,5 @@ $wgEXIFMessages = array(
'exif-gpsdestdistance-n',
'exif-gpsdirection-t',
'exif-gpsdirection-m',
+ 'exif-objectname',
);
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
index 4c907a16..a0b19ac6 100644
--- a/maintenance/language/messages.inc
+++ b/maintenance/language/messages.inc
@@ -27,7 +27,6 @@ $wgMessageStructure = array(
'tog-editsectiononrightclick',
'tog-showtoc',
'tog-rememberpassword',
- 'tog-editwidth',
'tog-watchcreations',
'tog-watchdefault',
'tog-watchmoves',
@@ -181,17 +180,7 @@ $wgMessageStructure = array(
'vector-action-protect',
'vector-action-undelete',
'vector-action-unprotect',
- 'vector-namespace-category',
- 'vector-namespace-help',
- 'vector-namespace-image',
- 'vector-namespace-main',
- 'vector-namespace-media',
- 'vector-namespace-mediawiki',
- 'vector-namespace-project',
- 'vector-namespace-special',
- 'vector-namespace-talk',
- 'vector-namespace-template',
- 'vector-namespace-user',
+ 'vector-simplesearch-preference',
'vector-view-create',
'vector-view-edit',
'vector-view-history',
@@ -259,6 +248,9 @@ $wgMessageStructure = array(
'jumptonavigation',
'jumptosearch',
'view-pool-error',
+ 'pool-timeout',
+ 'pool-queuefull',
+ 'pool-errorunknown',
),
'links' => array(
'aboutsite',
@@ -405,6 +397,7 @@ $wgMessageStructure = array(
'yourpassword',
'yourpasswordagain',
'remembermypassword',
+ 'securelogin-stick-https',
'yourdomainname',
'externaldberror',
'login',
@@ -421,6 +414,7 @@ $wgMessageStructure = array(
'gotaccount',
'gotaccountlink',
'createaccountmail',
+ 'createaccountreason',
'badretype',
'userexists',
'loginerror',
@@ -438,6 +432,7 @@ $wgMessageStructure = array(
'wrongpasswordempty',
'passwordtooshort',
'password-name-match',
+ 'password-login-forbidden',
'mailmypassword',
'passwordremindertitle',
'passwordremindertext',
@@ -449,6 +444,7 @@ $wgMessageStructure = array(
'throttled-mailpassword',
'loginstart',
'loginend',
+ 'signupstart',
'signupend',
'mailerror',
'acct_creation_throttle_hit',
@@ -467,6 +463,11 @@ $wgMessageStructure = array(
'loginlanguagelinks',
'suspicious-userlogout',
),
+ 'mail' => array(
+ 'pear-mail-error',
+ 'php-mail-error',
+ 'php-mail-error-unknown',
+ ),
'resetpass' => array(
'resetpass',
'resetpass_announce',
@@ -517,6 +518,7 @@ $wgMessageStructure = array(
'showlivepreview',
'showdiff',
'anoneditwarning',
+ 'anonpreviewwarning',
'missingsummary',
'missingcommenttext',
'missingcommentheader',
@@ -554,6 +556,8 @@ $wgMessageStructure = array(
'userjsyoucanpreview',
'usercsspreview',
'userjspreview',
+ 'sitecsspreview',
+ 'sitejspreview',
'userinvalidcssjstitle',
'updated',
'note',
@@ -575,7 +579,7 @@ $wgMessageStructure = array(
'copyrightwarning',
'copyrightwarning2',
'editpage-tos-summary',
- 'longpagewarning',
+ 'longpage-hint',
'longpageerror',
'readonlywarning',
'protectedpagewarning',
@@ -628,7 +632,6 @@ $wgMessageStructure = array(
'cantcreateaccount' => array(
'cantcreateaccounttitle',
'cantcreateaccount-text',
- 'cantcreateaccount-nonblock-text',
),
'history' => array(
'viewpagelogs',
@@ -718,6 +721,8 @@ $wgMessageStructure = array(
'logdelete-success',
'logdelete-failure',
'revdel-restore',
+ 'revdel-restore-deleted',
+ 'revdel-restore-visible',
'pagehist',
'deletedhist',
'revdelete-content',
@@ -777,11 +782,13 @@ $wgMessageStructure = array(
'diffs' => array(
'history-title',
'difference',
+ 'difference-multipage',
'lineno',
'compareselectedversions',
'showhideselectedversions',
'editundo',
'diff-multi',
+ 'diff-multi-manyusers',
),
'search' => array(
'search-summary',
@@ -804,6 +811,7 @@ $wgMessageStructure = array(
'searchmenu-legend',
'searchmenu-exists',
'searchmenu-new',
+ 'searchmenu-new-nocreate',
'searchhelp-url',
'searchmenu-prefix',
'searchmenu-help',
@@ -818,6 +826,7 @@ $wgMessageStructure = array(
'searchprofile-everything-tooltip',
'searchprofile-advanced-tooltip',
'search-result-size',
+ 'search-result-category-size',
'search-result-score',
'search-redirect',
'search-section',
@@ -898,6 +907,7 @@ $wgMessageStructure = array(
'contextlines',
'contextchars',
'stub-threshold',
+ 'stub-threshold-disabled',
'recentchangesdays',
'recentchangesdays-max',
'recentchangescount',
@@ -930,6 +940,7 @@ $wgMessageStructure = array(
'prefs-files',
'prefs-custom-css',
'prefs-custom-js',
+ 'prefs-common-css-js',
'prefs-reset-intro',
'prefs-emailconfirm-label',
'prefs-textboxsize',
@@ -966,9 +977,15 @@ $wgMessageStructure = array(
'prefs-advancedrendering',
'prefs-advancedsearchoptions',
'prefs-advancedwatchlist',
- 'prefs-display',
+ 'prefs-displayrc',
+ 'prefs-displaysearchoptions',
+ 'prefs-displaywatchlist',
'prefs-diffs',
),
+ 'preferences-email' => array(
+ 'email-address-validity-valid',
+ 'email-address-validity-invalid',
+ ),
'userrights' => array(
'userrights',
'userrights-summary',
@@ -1053,6 +1070,7 @@ $wgMessageStructure = array(
'right-hideuser',
'right-ipblock-exempt',
'right-proxyunbannable',
+ 'right-unblockself',
'right-protect',
'right-editprotected',
'right-editinterface',
@@ -1075,7 +1093,6 @@ $wgMessageStructure = array(
'right-siteadmin',
'right-reset-passwords',
'right-override-export-depth',
- 'right-versiondetail',
'right-sendemail',
),
'rightslog' => array(
@@ -1127,14 +1144,9 @@ $wgMessageStructure = array(
'recentchanges-legend',
'recentchangestext',
'recentchanges-feed-description',
- 'recentchanges-label-legend',
- 'recentchanges-legend-newpage',
'recentchanges-label-newpage',
- 'recentchanges-legend-minor',
'recentchanges-label-minor',
- 'recentchanges-legend-bot',
'recentchanges-label-bot',
- 'recentchanges-legend-unpatrolled',
'recentchanges-label-unpatrolled',
'rcnote',
'rcnotefrom',
@@ -1186,6 +1198,7 @@ $wgMessageStructure = array(
'upload_directory_read_only',
'uploaderror',
'upload-summary',
+ 'upload-recreate-warning',
'uploadtext',
'upload-permitted',
'upload-preferred',
@@ -1212,6 +1225,17 @@ $wgMessageStructure = array(
'filetype-unwanted-type',
'filetype-banned-type',
'filetype-missing',
+ 'empty-file',
+ 'file-too-large',
+ 'filename-tooshort',
+ 'filetype-banned',
+ 'verification-error',
+ 'hookaborted',
+ 'illegal-filename',
+ 'overwrite',
+ 'unknown-error',
+ 'tmp-create-error',
+ 'tmp-write-error',
'large-file',
'largefileserver',
'emptyfile',
@@ -1224,13 +1248,14 @@ $wgMessageStructure = array(
'fileexists-shared-forbidden',
'file-exists-duplicate',
'file-deleted-duplicate',
- 'successfulupload',
'uploadwarning',
'uploadwarning-text',
'savefile',
'uploadedimage',
'overwroteimage',
'uploaddisabled',
+ 'copyuploaddisabled',
+ 'uploadfromurl-queued',
'uploaddisabledtext',
'php-uploaddisabledtext',
'uploadscripted',
@@ -1247,6 +1272,12 @@ $wgMessageStructure = array(
'upload-wasdeleted',
'filename-bad-prefix',
'filename-prefix-blacklist',
+ 'upload-success-subj',
+ 'upload-success-msg',
+ 'upload-failure-subj',
+ 'upload-failure-msg',
+ 'upload-warning-subj',
+ 'upload-warning-msg',
),
'upload-errors' => array(
'upload-proto-error',
@@ -1306,6 +1337,7 @@ $wgMessageStructure = array(
'listfiles_search_for',
'imgfile',
'listfiles',
+ 'listfiles_thumb',
'listfiles_date',
'listfiles_name',
'listfiles_user',
@@ -1347,6 +1379,7 @@ $wgMessageStructure = array(
'shared-repo-from',
'shared-repo',
'shared-repo-name-wikimediacommons',
+ 'filepage.css',
),
'filerevert' => array(
'filerevert',
@@ -1421,8 +1454,8 @@ $wgMessageStructure = array(
'statistics-edits',
'statistics-edits-average',
'statistics-views-total',
+ 'statistics-views-total-desc',
'statistics-views-peredit',
- 'statistics-jobqueue',
'statistics-users',
'statistics-users-active',
'statistics-users-active-desc',
@@ -1467,6 +1500,8 @@ $wgMessageStructure = array(
'nrevisions',
'nviews',
'nchanges',
+ 'nimagelinks',
+ 'ntransclusions',
'specialpage-empty',
'lonelypages',
'lonelypages-summary',
@@ -1662,6 +1697,8 @@ $wgMessageStructure = array(
'emailpagetext',
'usermailererror',
'defemailsubject',
+ 'usermaildisabled',
+ 'usermaildisabledtext',
'noemailtitle',
'noemailtext',
'nowikiemailtitle',
@@ -1678,10 +1715,15 @@ $wgMessageStructure = array(
'emailsenttext',
'emailuserfooter',
),
+ 'usermessage' => array(
+ 'usermessage-summary',
+ 'usermessage-editor',
+ 'usermessage-template',
+ ),
'watchlist' => array(
'watchlist',
'mywatchlist',
- 'watchlistfor',
+ 'watchlistfor2',
'nowatchlist',
'watchlistanontext',
'watchnologin',
@@ -1765,6 +1807,9 @@ $wgMessageStructure = array(
'revertpage',
'revertpage-nouser',
'rollback-success',
+ ),
+ 'edittokens' => array(
+ 'sessionfailure-title',
'sessionfailure',
),
'protect' => array(
@@ -1884,12 +1929,15 @@ $wgMessageStructure = array(
'sp-contributions-newbies-title',
'sp-contributions-blocklog',
'sp-contributions-deleted',
+ 'sp-contributions-uploads',
'sp-contributions-logs',
'sp-contributions-talk',
'sp-contributions-userrights',
'sp-contributions-blocked-notice',
+ 'sp-contributions-blocked-notice-anon',
'sp-contributions-search',
'sp-contributions-username',
+ 'sp-contributions-toponly',
'sp-contributions-submit',
'sp-contributions-explain',
'sp-contributions-footer',
@@ -1946,7 +1994,6 @@ $wgMessageStructure = array(
'ipb-edit-dropdown',
'ipb-unblock-addr',
'ipb-unblock',
- 'ipb-blocklist-addr',
'ipb-blocklist',
'ipb-blocklist-contribs',
'unblockip',
@@ -2013,7 +2060,9 @@ $wgMessageStructure = array(
'sorbsreason',
'sorbs_create_account_reason',
'cant-block-while-blocked',
- 'cant-see-hidden-user'
+ 'cant-see-hidden-user',
+ 'ipbblocked',
+ 'ipbnounblockself',
),
'developertools' => array(
'lockdb',
@@ -2037,6 +2086,7 @@ $wgMessageStructure = array(
'move-page-backlink',
'move-page-legend',
'movepagetext',
+ 'movepagetext-noredirectfixer',
'movepagetalktext',
'movearticle',
'moveuserpage-warning',
@@ -2086,6 +2136,7 @@ $wgMessageStructure = array(
'immobile-target-page',
'immobile_namespace',
'imagenocrossnamespace',
+ 'nonfile-cannot-move-to-file',
'imagetypemismatch',
'imageinvalidfilename',
'fix-double-redirects',
@@ -2152,6 +2203,7 @@ $wgMessageStructure = array(
'importstart',
'import-revision-count',
'importnopages',
+ 'imported-log-entries',
'importfailed',
'importunknownsource',
'importcantopen',
@@ -2242,6 +2294,12 @@ $wgMessageStructure = array(
'accesskey-compareselectedversions',
'accesskey-watch',
'accesskey-upload',
+ 'accesskey-preferences-save',
+ 'accesskey-summary',
+ 'accesskey-userrights-set',
+ 'accesskey-blockip-block',
+ 'accesskey-export',
+ 'accesskey-import',
),
'tooltips' => array(
'tooltip-pt-userpage',
@@ -2308,6 +2366,8 @@ $wgMessageStructure = array(
'tooltip-upload',
'tooltip-rollback',
'tooltip-undo',
+ 'tooltip-preferences-save',
+ 'tooltip-summary',
),
'stylesheets' => array(
'common.css',
@@ -2445,6 +2505,9 @@ $wgMessageStructure = array(
'show-big-image-thumb',
'file-info-gif-looped',
'file-info-gif-frames',
+ 'file-info-png-looped',
+ 'file-info-png-repeat',
+ 'file-info-png-frames',
),
'newfiles' => array(
'newimages',
@@ -2635,6 +2698,7 @@ $wgMessageStructure = array(
'exif-gpsareainformation',
'exif-gpsdatestamp',
'exif-gpsdifferential',
+ 'exif-objectname',
),
'exif-values' => array(
'exif-make-value',
@@ -2860,6 +2924,8 @@ $wgMessageStructure = array(
'confirmemail_error',
'confirmemail_subject',
'confirmemail_body',
+ 'confirmemail_body_changed',
+ 'confirmemail_body_set',
'confirmemail_invalidated',
'invalidateemail',
),
@@ -2915,6 +2981,7 @@ $wgMessageStructure = array(
'table_pager_first',
'table_pager_last',
'table_pager_limit',
+ 'table_pager_limit_label',
'table_pager_limit_submit',
'table_pager_empty',
),
@@ -3038,6 +3105,7 @@ $wgMessageStructure = array(
'version-specialpages',
'version-parserhooks',
'version-variables',
+ 'version-skins',
'version-other',
'version-mediahandlers',
'version-hooks',
@@ -3050,6 +3118,9 @@ $wgMessageStructure = array(
'version-version',
'version-svn-revision',
'version-license',
+ 'version-poweredby-credits',
+ 'version-poweredby-others',
+ 'version-license-info',
'version-software',
'version-software-product',
'version-software-version',
@@ -3107,6 +3178,15 @@ $wgMessageStructure = array(
'tags-edit',
'tags-hitcount',
),
+ 'comparepages' => array(
+ 'comparepages',
+ 'compare-selector',
+ 'compare-page1',
+ 'compare-page2',
+ 'compare-rev1',
+ 'compare-rev2',
+ 'compare-submit',
+ ),
'db-error-messages' => array(
'dberr-header',
'dberr-problems',
@@ -3123,10 +3203,15 @@ $wgMessageStructure = array(
'htmlform-float-invalid',
'htmlform-int-toolow',
'htmlform-int-toohigh',
+ 'htmlform-required',
'htmlform-submit',
'htmlform-reset',
'htmlform-selectorother-other',
),
+ 'sqlite' => array(
+ 'sqlite-has-fts',
+ 'sqlite-no-fts',
+ ),
);
/** Comments for each block */
@@ -3156,6 +3241,8 @@ XHTML id names.",
'errors' => 'General errors',
'virus' => 'Virus scanner',
'login' => 'Login and logout pages',
+ 'mail' => 'E-mail sending',
+ 'passwordstrength' => 'JavaScript password checks',
'resetpass' => 'Password reset dialog',
'toolbar' => 'Edit page toolbar',
'edit' => 'Edit pages',
@@ -3173,6 +3260,7 @@ XHTML id names.",
'opensearch' => 'OpenSearch description',
'quickbar' => 'Quickbar',
'preferences' => 'Preferences page',
+ 'preferences-email' => 'User preference: e-mail validation using jQuery',
'userrights' => 'User rights',
'group' => 'Groups',
'group-member' => '',
@@ -3217,11 +3305,13 @@ XHTML id names.",
'newuserlog' => 'Special:Log/newusers',
'listgrouprights' => 'Special:ListGroupRights',
'emailuser' => 'E-mail user',
+ 'usermessage' => 'User Messenger',
'watchlist' => 'Watchlist',
'watching' => 'Displayed when you click the "watch" button and it is in the process of watching',
'enotif' => '',
'delete' => 'Delete',
'rollback' => 'Rollback',
+ 'edittokens' => 'Edit tokens',
'protect' => 'Protect',
'restrictions' => 'Restrictions (nouns)',
'restriction-levels' => 'Restriction levels',
@@ -3331,6 +3421,8 @@ Variants for Chinese language",
'special-blank' => 'Special:BlankPage',
'external_images' => 'External image whitelist',
'special-tags' => 'Special:Tags',
+ 'comparepages' => 'Special:ComparePages',
'db-error-messages' => 'Database error messages',
'html-forms' => 'HTML forms',
+ 'sqlite' => 'SQLite database support',
);
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
index 6c624ca3..fd8d62ee 100644
--- a/maintenance/language/rebuildLanguage.php
+++ b/maintenance/language/rebuildLanguage.php
@@ -7,7 +7,7 @@
* @defgroup MaintenanceLanguage MaintenanceLanguage
*/
-require_once( dirname(__FILE__).'/../commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
require_once( 'languages.inc' );
require_once( 'writeMessagesArray.inc' );
@@ -21,11 +21,10 @@ require_once( 'writeMessagesArray.inc' );
* @param $removeDupes Remove the duplicated messages?
* @param $dupeMsgSource The source file intended to remove from the array.
*/
-function rebuildLanguage( $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource ) {
- global $wgLanguages;
- $messages = $wgLanguages->getMessages( $code );
+function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource ) {
+ $messages = $languages->getMessages( $code );
$messages = $messages['all'];
- if ($removeDupes) {
+ if ( $removeDupes ) {
$messages = removeDupes( $messages, $dupeMsgSource );
}
MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown );
@@ -39,20 +38,20 @@ function rebuildLanguage( $code, $write, $listUnknown, $removeUnknown, $removeDu
* @return $newMsgArray The output message array, with duplicates removed.
*/
function removeDupes( $oldMsgArray, $dupeMsgSource ) {
- if (file_exists($dupeMsgSource)) {
- include($dupeMsgSource);
- if (!isset($dupeMessages)) {
- echo("There are no duplicated messages in the source file provided.");
- exit(1);
+ if ( file_exists( $dupeMsgSource ) ) {
+ include( $dupeMsgSource );
+ if ( !isset( $dupeMessages ) ) {
+ echo( "There are no duplicated messages in the source file provided." );
+ exit( 1 );
}
} else {
- echo ("The specified file $dupeMsgSource cannot be found.");
- exit(1);
+ echo ( "The specified file $dupeMsgSource cannot be found." );
+ exit( 1 );
}
$newMsgArray = $oldMsgArray;
- foreach ($oldMsgArray as $key => $value) {
+ foreach ( $oldMsgArray as $key => $value ) {
if ( array_key_exists( $key, $dupeMessages ) ) {
- unset($newMsgArray[$key]);
+ unset( $newMsgArray[$key] );
}
}
return $newMsgArray;
@@ -72,7 +71,7 @@ Options:
* remove-duplicates: Remove duplicated messages based on a PHP source file.
TEXT;
- exit(1);
+ exit( 1 );
}
# Get the language code
@@ -96,13 +95,13 @@ $wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
$wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
# Get language objects
-$wgLanguages = new languages();
+$languages = new languages();
# Write all the language
if ( $wgCode == 'all' ) {
- foreach ( $wgLanguages->getLanguages() as $language ) {
- rebuildLanguage( $language, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+ foreach ( $languages->getLanguages() as $languageCode ) {
+ rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
}
} else {
- rebuildLanguage( $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+ rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
}
diff --git a/maintenance/language/transstat.php b/maintenance/language/transstat.php
index eeded34e..c2144eb6 100644
--- a/maintenance/language/transstat.php
+++ b/maintenance/language/transstat.php
@@ -6,16 +6,16 @@
* @ingroup MaintenanceLanguage
*
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @author Ashar Voultoiz <thoane@altern.org>
+ * @author Ashar Voultoiz <hashar at free dot fr>
*
* Output is posted from time to time on:
* http://www.mediawiki.org/wiki/Localisation_statistics
*/
$optionsWithArgs = array( 'output' );
-require_once( dirname(__FILE__).'/../commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
require_once( 'languages.inc' );
-require_once( dirname(__FILE__).'/StatOutputs.php' );
+require_once( dirname( __FILE__ ) . '/StatOutputs.php' );
if ( isset( $options['help'] ) ) {
@@ -39,7 +39,7 @@ Usage: php transstat.php [--help] [--output=csv|text|wiki]
Example: php maintenance/transstat.php --output=text
TEXT;
- exit(1);
+ exit( 1 );
}
diff --git a/maintenance/language/validate.php b/maintenance/language/validate.php
index e84aa29d..d897e467 100644
--- a/maintenance/language/validate.php
+++ b/maintenance/language/validate.php
@@ -29,7 +29,7 @@ foreach ( $files as $filename ) {
$keys = array_keys( $vars );
$diff = array_diff( $keys, Language::$mLocalisationKeys );
if ( $diff ) {
- print "\nWarning: unrecognised variable(s): " . implode( ', ', $diff ) ."\n";
+ print "\nWarning: unrecognised variable(s): " . implode( ', ', $diff ) . "\n";
} else {
print " ok\n";
}
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
index e28a5c04..e3a48abd 100644
--- a/maintenance/language/writeMessagesArray.inc
+++ b/maintenance/language/writeMessagesArray.inc
@@ -21,10 +21,11 @@ class MessageWriter {
/**
* Write a messages array as a PHP text and write it to the messages file.
*
- * @param $messages The messages array.
- * @param $code The language code.
- * @param $write Write to the messages file?
- * @param $listUnknown List the unknown messages?
+ * @param $messages Array: the messages array.
+ * @param $code String: the language code.
+ * @param $write Boolean: write to the messages file?
+ * @param $listUnknown Boolean: list the unknown messages?
+ * @param $removeUnknown Boolean: whether to remove unkown messages
*/
public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown ) {
# Rewrite the messages array
@@ -66,8 +67,12 @@ class MessageWriter {
/**
* Write a messages array as a PHP text.
*
- * @param $messages The messages array.
- * @param $ignoredComments Show comments about ignored and optional messages? (For English.)
+ * @param $messages Array: the messages array.
+ * @param $ignoredComments Boolean: show comments about ignored and optional
+ * messages? (For English.)
+ * @param $prefix String: base path for messages.inc and messageTypes.inc files
+ * or false for default path (this directory)
+ * @param $removeUnknown Boolean: whether to remove unkown messages
*
* @return Array of the PHP text and the sorted messages array.
*/
@@ -130,9 +135,9 @@ class MessageWriter {
/**
* Generates an array of comments for messages.
*
- * @param $messages Key of messages.
- * @param $ignored List of ingored message keys.
- * @param $optional List of optional message keys.
+ * @param $messages Array: key of messages.
+ * @param $ignored Array: list of ingored message keys.
+ * @param $optional Array: list of optional message keys.
*/
public static function makeComments( $messages, $ignored, $optional ) {
# Comment collector
@@ -153,10 +158,10 @@ class MessageWriter {
/**
* Write a block of messages to PHP.
*
- * @param $blockComment The comment of whole block.
- * @param $messages The block messages.
- * @param $messageComments Optional comments for messages in this block.
- * @param $prefix Prefix for every line, for indenting purposes.
+ * @param $blockComment String: the comment of whole block.
+ * @param $messages Array: the block messages.
+ * @param $messageComments Array: optional comments for messages in this block.
+ * @param $prefix String: prefix for every line, for indenting purposes.
*
* @return The block, formatted in PHP.
*/
diff --git a/maintenance/mcc.php b/maintenance/mcc.php
index e90266ae..a8c79a72 100644
--- a/maintenance/mcc.php
+++ b/maintenance/mcc.php
@@ -8,14 +8,14 @@
*/
/** */
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-$mcc = new MWMemcached( array('persistant' => true/*, 'debug' => true*/) );
+$mcc = new MWMemcached( array( 'persistant' => true/*, 'debug' => true*/ ) );
$mcc->set_servers( $wgMemCachedServers );
-#$mcc->set_debug( true );
+# $mcc->set_debug( true );
-function mccShowHelp($command) {
- $commandList = array(
+function mccShowHelp( $command ) {
+ $commandList = array(
'get' => 'grabs something',
'getsock' => 'lists sockets',
'set' => 'changes something',
@@ -27,14 +27,15 @@ function mccShowHelp($command) {
'quit' => 'exit mcc',
'help' => 'help about a command',
);
- if( !$command ) {
+ if ( !$command ) {
$command = 'fullhelp';
}
- if( $command === 'fullhelp' ) {
- foreach( $commandList as $cmd => $desc ) {
- print "$cmd: $desc\n";
+ if ( $command === 'fullhelp' ) {
+ $max_cmd_len = max( array_map( 'strlen', array_keys( $commandList ) ) );
+ foreach ( $commandList as $cmd => $desc ) {
+ printf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
}
- } elseif( isset( $commandList[$command] ) ) {
+ } elseif ( isset( $commandList[$command] ) ) {
print "$command: $commandList[$command]\n";
} else {
print "$command: command does not exist or no help for it\n";
@@ -46,8 +47,8 @@ do {
$showhelp = false;
$quit = false;
- $line = readconsole( '> ' );
- if ($line === false) exit;
+ $line = Maintenance::readconsole();
+ if ( $line === false ) exit;
$args = explode( ' ', $line );
$command = array_shift( $args );
@@ -56,7 +57,7 @@ do {
switch ( $command ) {
case 'help':
// show an help message
- mccShowHelp(array_shift($args));
+ mccShowHelp( array_shift( $args ) );
break;
case 'get':
@@ -70,7 +71,7 @@ do {
$res = $res[$args[1]];
}
if ( $res === false ) {
- #print 'Error: ' . $mcc->error_string() . "\n";
+ # print 'Error: ' . $mcc->error_string() . "\n";
print "MemCached error\n";
} elseif ( is_string( $res ) ) {
print "$res\n";
@@ -106,7 +107,7 @@ do {
$value = implode( ' ', $args );
}
if ( !$mcc->set( $key, $value, 0 ) ) {
- #print 'Error: ' . $mcc->error_string() . "\n";
+ # print 'Error: ' . $mcc->error_string() . "\n";
print "MemCached error\n";
}
break;
@@ -114,14 +115,14 @@ do {
case 'delete':
$key = implode( ' ', $args );
if ( !$mcc->delete( $key ) ) {
- #print 'Error: ' . $mcc->error_string() . "\n";
+ # print 'Error: ' . $mcc->error_string() . "\n";
print "MemCached error\n";
}
break;
case 'history':
if ( function_exists( 'readline_list_history' ) ) {
- foreach( readline_list_history() as $num => $line) {
+ foreach ( readline_list_history() as $num => $line ) {
print "$num: $line\n";
}
} else {
diff --git a/maintenance/mctest.php b/maintenance/mctest.php
index 3667cb93..651b2958 100644
--- a/maintenance/mctest.php
+++ b/maintenance/mctest.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class mcTest extends Maintenance {
public function __construct() {
@@ -36,36 +36,36 @@ class mcTest extends Maintenance {
global $wgMemCachedServers;
$iterations = $this->getOption( 'i', 100 );
- if( $this->hasArg() )
+ if ( $this->hasArg() )
$wgMemCachedServers = array( $this->getArg() );
foreach ( $wgMemCachedServers as $server ) {
- $this->output( $server . " " );
- $mcc = new MemCachedClientforWiki( array('persistant' => true) );
+ $this->output( $server . " ", $server );
+ $mcc = new MemCachedClientforWiki( array( 'persistant' => true ) );
$mcc->set_servers( array( $server ) );
$set = 0;
$incr = 0;
$get = 0;
$time_start = $this->microtime_float();
- for ( $i=1; $i<=$iterations; $i++ ) {
+ for ( $i = 1; $i <= $iterations; $i++ ) {
if ( !is_null( $mcc->set( "test$i", $i ) ) ) {
$set++;
}
}
- for ( $i=1; $i<=$iterations; $i++ ) {
+ for ( $i = 1; $i <= $iterations; $i++ ) {
if ( !is_null( $mcc->incr( "test$i", $i ) ) ) {
$incr++;
}
}
- for ( $i=1; $i<=$iterations; $i++ ) {
+ for ( $i = 1; $i <= $iterations; $i++ ) {
$value = $mcc->get( "test$i" );
- if ( $value == $i*2 ) {
+ if ( $value == $i * 2 ) {
$get++;
}
}
$exectime = $this->microtime_float() - $time_start;
-
- $this->output( "set: $set incr: $incr get: $get time: $exectime\n" );
+
+ $this->output( "set: $set incr: $incr get: $get time: $exectime", $server );
}
}
@@ -74,10 +74,10 @@ class mcTest extends Maintenance {
* @return float
*/
private function microtime_float() {
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec + (float)$sec);
+ list( $usec, $sec ) = explode( " ", microtime() );
+ return ( (float)$usec + (float)$sec );
}
}
$maintClass = "mcTest";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/mergeMessageFileList.php b/maintenance/mergeMessageFileList.php
index 57d9ebb0..00c8cae5 100644
--- a/maintenance/mergeMessageFileList.php
+++ b/maintenance/mergeMessageFileList.php
@@ -3,7 +3,7 @@
# Start from scratch
define( 'MW_NO_EXTENSION_MESSAGES', 1 );
-require_once( dirname( __FILE__ ).'/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
$maintClass = 'MergeMessageFileList';
$mmfl = false;
class MergeMessageFileList extends Maintenance {
@@ -11,12 +11,12 @@ class MergeMessageFileList extends Maintenance {
function __construct() {
$this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', false, true );
$this->addOption( 'output', 'Send output to this file (omit for stdout)', false, true );
- $this->mDescription = 'Merge $wgExtensionMessagesFiles from various extensions to produce a ' .
+ $this->mDescription = 'Merge $wgExtensionMessagesFiles from various extensions to produce a ' .
'single array containing all message files.';
}
public function execute() {
- global $IP, $mmfl;
+ global $mmfl;
if ( !$this->hasOption( 'list-file' ) ) {
$this->error( 'The --list-file option must be specified.' );
return;
@@ -33,7 +33,7 @@ class MergeMessageFileList extends Maintenance {
}
}
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
foreach ( $mmfl['setupFiles'] as $fileName ) {
if ( strval( $fileName ) === '' ) {
@@ -44,8 +44,8 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
include_once( $fileName );
}
fwrite( STDERR, "\n" );
-$s =
- "<" . "?php\n" .
+$s =
+ "<" . "?php\n" .
"## This file is generated by mergeMessageFileList.php. Do not edit it directly.\n\n" .
"if ( defined( 'MW_NO_EXTENSION_MESSAGES' ) ) return;\n\n" .
'$wgExtensionMessagesFiles = ' . var_export( $wgExtensionMessagesFiles, true ) . ";\n\n" .
@@ -53,14 +53,14 @@ $s =
$dirs = array(
$IP,
- dirname( dirname( __FILE__ ) ),
+ dirname( dirname( __FILE__ ) ),
realpath( $IP )
);
foreach ( $dirs as $dir ) {
- $s = preg_replace(
+ $s = preg_replace(
"/'" . preg_quote( $dir, '/' ) . "([^']*)'/",
- '"$IP\1"',
+ '"$IP\1"',
$s );
}
diff --git a/maintenance/migrateUserGroup.php b/maintenance/migrateUserGroup.php
index 6d584f7d..c4163208 100644
--- a/maintenance/migrateUserGroup.php
+++ b/maintenance/migrateUserGroup.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class MigrateUserGroup extends Maintenance {
public function __construct() {
@@ -37,10 +37,10 @@ class MigrateUserGroup extends Maintenance {
$newGroup = $this->getArg( 1 );
$dbw = wfGetDB( DB_MASTER );
$start = $dbw->selectField( 'user_groups', 'MIN(ug_user)',
- array('ug_group' => $oldGroup), __FUNCTION__ );
+ array( 'ug_group' => $oldGroup ), __FUNCTION__ );
$end = $dbw->selectField( 'user_groups', 'MAX(ug_user)',
- array('ug_group' => $oldGroup), __FUNCTION__ );
- if( $start === null ) {
+ array( 'ug_group' => $oldGroup ), __FUNCTION__ );
+ if ( $start === null ) {
$this->error( "Nothing to do - no users in the '$oldGroup' group", true );
}
# Do remaining chunk
@@ -48,12 +48,12 @@ class MigrateUserGroup extends Maintenance {
$blockStart = $start;
$blockEnd = $start + $this->mBatchSize - 1;
// Migrate users over in batches...
- while( $blockEnd <= $end ) {
+ while ( $blockEnd <= $end ) {
$this->output( "Doing users $blockStart to $blockEnd\n" );
$dbw->begin();
$dbw->update( 'user_groups',
- array('ug_group' => $newGroup),
- array('ug_group' => $oldGroup,
+ array( 'ug_group' => $newGroup ),
+ array( 'ug_group' => $oldGroup,
"ug_user BETWEEN $blockStart AND $blockEnd" )
);
$count += $dbw->affectedRows();
@@ -67,4 +67,4 @@ class MigrateUserGroup extends Maintenance {
}
$maintClass = "MigrateUserGroup";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/minify.php b/maintenance/minify.php
index 601a4d67..2884fd7b 100644
--- a/maintenance/minify.php
+++ b/maintenance/minify.php
@@ -10,15 +10,21 @@ class MinifyScript extends Maintenance {
public function __construct() {
parent::__construct();
- $this->addOption( 'outfile',
- 'File for output. Only a single file may be specified for input.',
+ $this->addOption( 'outfile',
+ 'File for output. Only a single file may be specified for input.',
false, true );
$this->addOption( 'outdir',
- "Directory for output. If this is not specified, and neither is --outfile, then the\n" .
+ "Directory for output. If this is not specified, and neither is --outfile, then the\n" .
"output files will be sent to the same directories as the input files.",
false, true );
+ $this->addOption( 'js-statements-on-own-line',
+ "Boolean value for putting statements on their own line when minifying JavaScript.",
+ false, true );
+ $this->addOption( 'js-max-line-length',
+ "Maximum line length for JavaScript minification.",
+ false, true );
$this->mDescription = "Minify a file or set of files.\n\n" .
- "If --outfile is not specified, then the output file names will have a .min extension\n" .
+ "If --outfile is not specified, then the output file names will have a .min extension\n" .
"added, e.g. jquery.js -> jquery.min.js.";
}
@@ -48,13 +54,12 @@ class MinifyScript extends Maintenance {
$inDir = dirname( $inPath );
if ( strpos( $inName, '.min.' ) !== false ) {
- echo "Skipping $inName\n";
+ $this->error( "Skipping $inName\n" );
continue;
}
if ( !file_exists( $inPath ) ) {
- $this->error( "File does not exist: $arg" );
- exit( 1 );
+ $this->error( "File does not exist: $arg", true );
}
$extension = $this->getExtension( $inName );
@@ -72,15 +77,17 @@ class MinifyScript extends Maintenance {
public function getExtension( $fileName ) {
$dotPos = strrpos( $fileName, '.' );
if ( $dotPos === false ) {
- $this->error( "No file extension, cannot determine type: $arg" );
+ $this->error( "No file extension, cannot determine type: $fileName" );
exit( 1 );
}
return substr( $fileName, $dotPos + 1 );
}
public function minify( $inPath, $outPath ) {
+ global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
+
$extension = $this->getExtension( $inPath );
- echo basename( $inPath ) . ' -> ' . basename( $outPath ) . '...';
+ $this->output( basename( $inPath ) . ' -> ' . basename( $outPath ) . '...' );
$inText = file_get_contents( $inPath );
if ( $inText === false ) {
@@ -95,7 +102,13 @@ class MinifyScript extends Maintenance {
switch ( $extension ) {
case 'js':
- $outText = JSMin::minify( $inText );
+ $outText = JavaScriptMinifier::minify( $inText,
+ $this->getOption( 'js-statements-on-own-line', $wgResourceLoaderMinifierStatementsOnOwnLine ),
+ $this->getOption( 'js-max-line-length', $wgResourceLoaderMinifierMaxLineLength )
+ );
+ break;
+ case 'css':
+ $outText = CSSMin::minify( $inText );
break;
default:
$this->error( "No minifier defined for extension \"$extension\"" );
@@ -103,9 +116,9 @@ class MinifyScript extends Maintenance {
fwrite( $outFile, $outText );
fclose( $outFile );
- echo " ok\n";
+ $this->output( " ok\n" );
}
}
$maintClass = 'MinifyScript';
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/moveBatch.php b/maintenance/moveBatch.php
index d1d3193b..c7495338 100644
--- a/maintenance/moveBatch.php
+++ b/maintenance/moveBatch.php
@@ -33,7 +33,7 @@
* e.g. immobile_namespace for namespaces which can't be moved
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class MoveBatch extends Maintenance {
public function __construct() {
@@ -44,7 +44,7 @@ class MoveBatch extends Maintenance {
$this->addOption( 'i', "Interval to sleep between moves" );
$this->addArg( 'listfile', 'List of pages to move, newline delimited', false );
}
-
+
public function execute() {
global $wgUser;
@@ -56,18 +56,18 @@ class MoveBatch extends Maintenance {
$user = $this->getOption( 'u', 'Move page script' );
$reason = $this->getOption( 'r', '' );
$interval = $this->getOption( 'i', 0 );
- if( $this->hasArg() ) {
+ if ( $this->hasArg() ) {
$file = fopen( $this->getArg(), 'r' );
} else {
$file = $this->getStdin();
}
# Setup
- if( !$file ) {
+ if ( !$file ) {
$this->error( "Unable to read file, exiting", true );
}
$wgUser = User::newFromName( $user );
-
+
# Setup complete, now start
$dbw = wfGetDB( DB_MASTER );
for ( $linenum = 1; !feof( $file ); $linenum++ ) {
@@ -86,18 +86,18 @@ class MoveBatch extends Maintenance {
$this->error( "Invalid title on line $linenum" );
continue;
}
-
-
+
+
$this->output( $source->getPrefixedText() . ' --> ' . $dest->getPrefixedText() );
$dbw->begin();
$err = $source->moveTo( $dest, false, $reason );
- if( $err !== true ) {
+ if ( $err !== true ) {
$msg = array_shift( $err[0] );
$this->output( "\nFAILED: " . wfMsg( $msg, $err[0] ) );
}
$dbw->commit();
$this->output( "\n" );
-
+
if ( $interval ) {
sleep( $interval );
}
@@ -107,4 +107,4 @@ class MoveBatch extends Maintenance {
}
$maintClass = "MoveBatch";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/mssql/README b/maintenance/mssql/README
deleted file mode 100644
index bcdeb82a..00000000
--- a/maintenance/mssql/README
+++ /dev/null
@@ -1,78 +0,0 @@
-== Syntax differences between MySQL and MSSQL ==
-{| border cellspacing=0 cellpadding=4
-!MySQL!!MSSQL
-|-
-
-|AUTO_INCREMENT
-|IDENTITY(1,1)
-|-
-
-|binary
-|varchar NULL ''(MSSQL doesn't allow setting of binary's to string values, and won't implicitly allow NULL's)''
-|-
-
-|bool
-|bit
-|-
-
-|[UN]SIGNED
-|''not valid''
-|-
-
-|SELECT * FROM foo LIMIT x
-|SELECT TOP x * FROM foo
-|-
-
-|SELECT * FROM foo LIMIT x,y|
-''not sure how to implement yet because it must be applied from within '''DatabaseMssql::limitResult'''''
-|-
-
-|INSERT IGNORE INTO foo (foo_id,bar) VALUES ('1','xyz')
-|IF NOT EXISTS (SELECT * FROM foo WHERE foo_id = '1') INSERT INTO foo (foo_id,bar) VALUES ('1','xyz')
-|-
-
-|IF(cond,trueVal,falseVal)
-|CASE WHEN cond THEN trueVal ELSE falseVal END
-|-
-
-|SHOW TABLES
-|SELECT * FROM INFORMATION_SCHEMA.TABLES
-|-
-
-|ENUM
-|''not natively supported, change to text''
-|}
-
-== MSSQL Variables ==
-{| border cellspacing=0 cellpadding=4
-
-|@@VERSION
-|Server version information
-|-
-
-|@@IDENTITY
-|Last inserted row
-|-
-
-|@@ERROR
-|Last error number
-|}
-
-== Changes to INSERT wrapper ==
-=== AUTOINCREMENT vs IDENTITY ===
-MySQL style ''AUTOINCREMENT'' columns are inplemented in MSSQL using ''IDENTITY(x,y)'' where ''x'' is the initial value and ''y'' is the amount to add on each insert. The last value resulting from an insert into an IDENTITY column is stored in the ''@@IDENTITY'' variable. These kinds of columns are usually used as primary keys and are therefore assigned the ''NOT NULL'' property.
-
-In MySQL the standard way of inserting data into rows exhibiting AUTOINCREMENT columns is simply to use a ''NULL'' value which will be ignored. In MSSQL however assigning a ''NULL'' to an ''IDENTITY'' column is not allowed, instead the best way is not to include those items in the list of columns to be updated at all.
-
-To get round this in the MediaWiki MSSQL layer, I've modified the insert wrapper in the ''DatabaseMssql'' class to check if the primary key is used in the insert and remove it if so. It checks this by assuming that the primary key will be of the same name as the table but with ''_id'' on the end, and that it will the first item in the list of columns to update.
-
-=== IGNORE ===
-As you can see from the comparison table above, the MySQL ''INSERT IGNORE'' option takes quite a different form in MSSQL. This is handled in the ''insert'' wrapper method. In the case of multiple row inserts, a separate conditional insert query is performed for each item.
-
-== NULL values and NOT NULL columns ==
-MySQL implicitly casts NULL assignments to NOT NULL columns to an empty string or zero value accordingly, but MSSQL raises an error instead. This is a big problem within the MediaWiki environment because the code relies heavily on this implicit NULL casting. I've tried to get round the problem by replacing NULL's with empty strings from update and insert queries, and MSSQL is happy to cast the empty string to a numeric zero if necessary.
-
-== See also ==
-*[http://msdn.microsoft.com/en-us/library/ms188783.aspx MSSQL reference]
-*[http://doc.ddart.net/mssql/sql70/ca-co_1.htm Type casting]
-*[http://msdn.microsoft.com/en-us/library/ms187752.aspx TransactSQL datatypes]
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index 24847330..3d3d3592 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -1,395 +1,764 @@
+-- Experimental table definitions for Microsoft SQL Server with
+-- content-holding fields switched to explicit BINARY charset.
+-- ------------------------------------------------------------
+
+-- SQL to create the initial tables for the MediaWiki database.
+-- This is read and executed by the install script; you should
+-- not have to run it by itself unless doing a manual install.
+
+--
+-- General notes:
+--
+-- The comments in this and other files are
+-- replaced with the defined table prefix by the installer
+-- and updater scripts. If you are installing or running
+-- updates manually, you will need to manually insert the
+-- table prefix if any when running these scripts.
+--
+
+
+--
+-- The user table contains basic account information,
+-- authentication keys, etc.
+--
+-- Some multi-wiki sites may share a single central user table
+-- between separate wikis using the $wgSharedDB setting.
+--
+-- Note that when a external authentication plugin is used,
+-- user table entries still need to be created to store
+-- preferences and to key tracking information in the other
+-- tables.
+
+-- LINE:53
CREATE TABLE /*$wgDBprefix*/user (
- user_id int NOT NULL IDENTITY(1,1),
- user_name varchar(255) NOT NULL default '',
- user_real_name varchar(255) NOT NULL default '',
- user_password text NOT NULL,
- user_newpassword text NOT NULL,
- user_newpass_time varchar(5) NULL,
- user_email text NOT NULL,
- user_options text NOT NULL,
- user_touched varchar(5) NOT NULL default '',
- user_token varchar(10) NOT NULL default '',
- user_email_authenticated varchar(5) NULL,
- user_email_token varchar(10) NULL,
- user_email_token_expires varchar(5) NULL,
- user_registration varchar(5) NULL,
- user_editcount int,
- PRIMARY KEY (user_id)
-);
-
+ user_id INT NOT NULL PRIMARY KEY IDENTITY(0,1),
+ user_name NVARCHAR(255) NOT NULL UNIQUE DEFAULT '',
+ user_real_name NVARCHAR(255) NOT NULL DEFAULT '',
+ user_password NVARCHAR(255) NOT NULL DEFAULT '',
+ user_newpassword NVARCHAR(255) NOT NULL DEFAULT '',
+ user_newpass_time DATETIME NULL,
+ user_email NVARCHAR(255) NOT NULL DEFAULT '',
+ user_options NVARCHAR(MAX) NOT NULL DEFAULT '',
+ user_touched DATETIME NOT NULL DEFAULT GETDATE(),
+ user_token NCHAR(32) NOT NULL DEFAULT '',
+ user_email_authenticated DATETIME DEFAULT NULL,
+ user_email_token NCHAR(32) DEFAULT '',
+ user_email_token_expires DATETIME DEFAULT NULL,
+ user_registration DATETIME DEFAULT NULL,
+ user_editcount INT NULL
+);
+CREATE INDEX /*$wgDBprefix*/user_email_token ON /*$wgDBprefix*/[user](user_email_token);
+CREATE UNIQUE INDEX /*$wgDBprefix*/[user_name] ON /*$wgDBprefix*/[user]([user_name]);
+;
+
+--
+-- User permissions have been broken out to a separate table;
+-- this allows sites with a shared user table to have different
+-- permissions assigned to a user in each project.
+--
+-- This table replaces the old user_rights field which used a
+-- comma-separated blob.
CREATE TABLE /*$wgDBprefix*/user_groups (
- ug_user int NOT NULL default '0',
- ug_group varchar(5) NOT NULL default '',
- PRIMARY KEY (ug_user,ug_group)
+ ug_user INT NOT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE CASCADE,
+ ug_group NVARCHAR(16) NOT NULL DEFAULT '',
);
+CREATE UNIQUE clustered INDEX /*$wgDBprefix*/user_groups_unique ON /*$wgDBprefix*/user_groups(ug_user, ug_group);
+CREATE INDEX /*$wgDBprefix*/user_group ON /*$wgDBprefix*/user_groups(ug_group);
+-- Stores notifications of user talk page changes, for the display
+-- of the "you have new messages" box
+-- Changed user_id column to mwuser_id to avoid clashing with user_id function
CREATE TABLE /*$wgDBprefix*/user_newtalk (
- user_id int NOT NULL default '0',
- user_ip varchar(13) NOT NULL default '',
- user_last_timestamp varchar(5) NOT NULL default ''
-);
-
+ user_id INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE CASCADE,
+ user_ip NVARCHAR(40) NOT NULL DEFAULT '',
+ user_last_timestamp DATETIME NOT NULL DEFAULT '',
+);
+CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
+CREATE INDEX /*$wgDBprefix*/user_ip ON /*$wgDBprefix*/user_newtalk(user_ip);
+
+--
+-- User preferences and other fun stuff
+-- replaces old user.user_options BLOB
+--
+CREATE TABLE /*$wgDBprefix*/user_properties (
+ up_user INT NOT NULL,
+ up_property NVARCHAR(32) NOT NULL,
+ up_value NVARCHAR(MAX),
+);
+CREATE UNIQUE clustered INDEX /*$wgDBprefix*/user_props_user_prop ON /*$wgDBprefix*/user_properties(up_user, up_property);
+CREATE INDEX /*$wgDBprefix*/user_props_prop ON /*$wgDBprefix*/user_properties(up_property);
+
+
+--
+-- Core of the wiki: each page has an entry here which identifies
+-- it by title and contains some essential metadata.
+--
CREATE TABLE /*$wgDBprefix*/page (
- page_id int NOT NULL IDENTITY(1,1),
- page_namespace int NOT NULL,
- page_title varchar(255) NOT NULL,
- page_restrictions text NOT NULL,
- page_counter bigint NOT NULL default '0',
- page_is_redirect tinyint NOT NULL default '0',
- page_is_new tinyint NOT NULL default '0',
- page_random real NOT NULL,
- page_touched varchar(5) NOT NULL default '',
- page_latest int NOT NULL,
- page_len int NOT NULL,
- PRIMARY KEY (page_id)
-);
-
+ page_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
+ page_namespace INT NOT NULL,
+ page_title NVARCHAR(255) NOT NULL,
+ page_restrictions NVARCHAR(255) NULL,
+ page_counter BIGINT NOT NULL DEFAULT 0,
+ page_is_redirect BIT NOT NULL DEFAULT 0,
+ page_is_new BIT NOT NULL DEFAULT 0,
+ page_random NUMERIC(15,14) NOT NULL DEFAULT RAND(),
+ page_touched DATETIME NOT NULL DEFAULT GETDATE(),
+ page_latest INT NOT NULL,
+ page_len INT NOT NULL,
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/page_unique_name ON /*$wgDBprefix*/page(page_namespace, page_title);
+CREATE INDEX /*$wgDBprefix*/page_random_idx ON /*$wgDBprefix*/page(page_random);
+CREATE INDEX /*$wgDBprefix*/page_len_idx ON /*$wgDBprefix*/page(page_len);
+;
+
+--
+-- Every edit of a page creates also a revision row.
+-- This stores metadata about the revision, and a reference
+-- to the TEXT storage backend.
+--
CREATE TABLE /*$wgDBprefix*/revision (
- rev_id int NOT NULL IDENTITY(1,1),
- rev_page int NOT NULL,
- rev_text_id int NOT NULL,
- rev_comment text NOT NULL,
- rev_user int NOT NULL default '0',
- rev_user_text varchar(255) NOT NULL default '',
- rev_timestamp varchar(5) NOT NULL default '',
- rev_minor_edit tinyint NOT NULL default '0',
- rev_deleted tinyint NOT NULL default '0',
- rev_len int,
- rev_parent_id int default NULL,
- PRIMARY KEY (rev_page, rev_id)
-);
-
+ rev_id INT NOT NULL UNIQUE IDENTITY,
+ rev_page INT NOT NULL,
+ rev_text_id INT NOT NULL,
+ rev_comment NVARCHAR(max) NOT NULL,
+ rev_user INT NOT NULL DEFAULT 0 /*REFERENCES [user](user_id)*/,
+ rev_user_text NVARCHAR(255) NOT NULL DEFAULT '',
+ rev_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ rev_minor_edit BIT NOT NULL DEFAULT 0,
+ rev_deleted BIT NOT NULL DEFAULT 0,
+ rev_len INT,
+ rev_parent_id INT DEFAULT NULL,
+
+);
+CREATE UNIQUE clustered INDEX /*$wgDBprefix*/revision_unique ON /*$wgDBprefix*/revision(rev_page, rev_id);
+CREATE UNIQUE INDEX /*$wgDBprefix*/rev_id ON /*$wgDBprefix*/revision(rev_id);
+CREATE INDEX /*$wgDBprefix*/rev_timestamp ON /*$wgDBprefix*/revision(rev_timestamp);
+CREATE INDEX /*$wgDBprefix*/page_timestamp ON /*$wgDBprefix*/revision(rev_page, rev_timestamp);
+CREATE INDEX /*$wgDBprefix*/user_timestamp ON /*$wgDBprefix*/revision(rev_user, rev_timestamp);
+CREATE INDEX /*$wgDBprefix*/usertext_timestamp ON /*$wgDBprefix*/revision(rev_user_text, rev_timestamp);
+;
+
+--
+-- Holds TEXT of individual page revisions.
+--
+-- Field names are a holdover from the 'old' revisions table in
+-- MediaWiki 1.4 and earlier: an upgrade will transform that
+-- table INTo the 'text' table to minimize unnecessary churning
+-- and downtime. If upgrading, the other fields will be left unused.
CREATE TABLE /*$wgDBprefix*/text (
- old_id int NOT NULL IDENTITY(1,1),
- old_text text NOT NULL,
- old_flags text NOT NULL,
- PRIMARY KEY (old_id)
-);
-
+ old_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
+ old_text TEXT NOT NULL,
+ old_flags NVARCHAR(255) NOT NULL,
+);
+
+--
+-- Holding area for deleted articles, which may be viewed
+-- or restored by admins through the Special:Undelete interface.
+-- The fields generally correspond to the page, revision, and text
+-- fields, with several caveats.
+-- Cannot reasonably create views on this table, due to the presence of TEXT
+-- columns.
CREATE TABLE /*$wgDBprefix*/archive (
- ar_namespace int NOT NULL default '0',
- ar_title varchar(255) NOT NULL default '',
- ar_text text NOT NULL,
- ar_comment text NOT NULL,
- ar_user int NOT NULL default '0',
- ar_user_text varchar(255) NOT NULL,
- ar_timestamp varchar(5) NOT NULL default '',
- ar_minor_edit tinyint NOT NULL default '0',
- ar_flags text NOT NULL,
- ar_rev_id int,
- ar_text_id int,
- ar_deleted tinyint NOT NULL default '0',
- ar_len int,
- ar_page_id int,
- ar_parent_id int default NULL
-);
-
+ ar_namespace SMALLINT NOT NULL DEFAULT 0,
+ ar_title NVARCHAR(255) NOT NULL DEFAULT '',
+ ar_text NVARCHAR(MAX) NOT NULL,
+ ar_comment NVARCHAR(255) NOT NULL,
+ ar_user INT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE SET NULL,
+ ar_user_text NVARCHAR(255) NOT NULL,
+ ar_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ ar_minor_edit BIT NOT NULL DEFAULT 0,
+ ar_flags NVARCHAR(255) NOT NULL,
+ ar_rev_id INT,
+ ar_text_id INT,
+ ar_deleted BIT NOT NULL DEFAULT 0,
+ ar_len INT DEFAULT NULL,
+ ar_page_id INT NULL,
+ ar_parent_id INT NULL,
+);
+CREATE INDEX /*$wgDBprefix*/ar_name_title_timestamp ON /*$wgDBprefix*/archive(ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_usertext_timestamp ON /*$wgDBprefix*/archive(ar_user_text,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_user_text ON /*$wgDBprefix*/archive(ar_user_text);
+
+
+--
+-- Track page-to-page hyperlinks within the wiki.
+--
CREATE TABLE /*$wgDBprefix*/pagelinks (
- pl_from int NOT NULL default '0',
- pl_namespace int NOT NULL default '0',
- pl_title varchar(255) NOT NULL default ''
+ pl_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
+ pl_namespace SMALLINT NOT NULL DEFAULT 0,
+ pl_title NVARCHAR(255) NOT NULL DEFAULT '',
);
+CREATE UNIQUE INDEX /*$wgDBprefix*/pl_from ON /*$wgDBprefix*/pagelinks(pl_from,pl_namespace,pl_title);
+CREATE UNIQUE INDEX /*$wgDBprefix*/pl_namespace ON /*$wgDBprefix*/pagelinks(pl_namespace,pl_title,pl_from);
+--
+-- Track template inclusions.
+--
CREATE TABLE /*$wgDBprefix*/templatelinks (
- tl_from int NOT NULL default '0',
- tl_namespace int NOT NULL default '0',
- tl_title varchar(255) NOT NULL default ''
-);
-
+ tl_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
+ tl_namespace SMALLINT NOT NULL DEFAULT 0,
+ tl_title NVARCHAR(255) NOT NULL DEFAULT '',
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/tl_from ON /*$wgDBprefix*/templatelinks(tl_from,tl_namespace,tl_title);
+CREATE UNIQUE INDEX /*$wgDBprefix*/tl_namespace ON /*$wgDBprefix*/templatelinks(tl_namespace,tl_title,tl_from);
+
+--
+-- Track links to images *used inline*
+-- We don't distinguish live from broken links here, so
+-- they do not need to be changed ON upload/removal.
+--
CREATE TABLE /*$wgDBprefix*/imagelinks (
- il_from int NOT NULL default '0',
- il_to varchar(255) NOT NULL default ''
-);
-
+ il_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
+ il_to NVARCHAR(255) NOT NULL DEFAULT '',
+ CONSTRAINT /*$wgDBprefix*/il_from PRIMARY KEY(il_from,il_to),
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/il_from_to ON /*$wgDBprefix*/imagelinks(il_from,il_to);
+CREATE UNIQUE INDEX /*$wgDBprefix*/il_to_from ON /*$wgDBprefix*/imagelinks(il_to,il_from);
+
+--
+-- Track category inclusions *used inline*
+-- This tracks a single level of category membership
+-- (folksonomic tagging, really).
+--
CREATE TABLE /*$wgDBprefix*/categorylinks (
- cl_from int NOT NULL default '0',
- cl_to varchar(255) NOT NULL default '',
- cl_sortkey varchar(70) NOT NULL default '',
- cl_timestamp timestamp NOT NULL
-);
-
+ cl_from INT NOT NULL DEFAULT 0,
+ cl_to NVARCHAR(255) NOT NULL DEFAULT '',
+ cl_sortkey NVARCHAR(150) NOT NULL DEFAULT '',
+ cl_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ CONSTRAINT /*$wgDBprefix*/cl_from PRIMARY KEY(cl_from, cl_to),
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/cl_from_to ON /*$wgDBprefix*/categorylinks(cl_from,cl_to);
+-- We always sort within a given category...
+CREATE INDEX /*$wgDBprefix*/cl_sortkey ON /*$wgDBprefix*/categorylinks(cl_to,cl_sortkey);
+-- Not really used?
+CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
+--;
+
+--
+-- Track all existing categories. Something is a category if 1) it has an en-
+-- try somewhere in categorylinks, or 2) it once did. Categories might not
+-- have corresponding pages, so they need to be tracked separately.
+--
CREATE TABLE /*$wgDBprefix*/category (
cat_id int NOT NULL IDENTITY(1,1),
- cat_title varchar(255) NOT NULL,
+ cat_title nvarchar(255) NOT NULL,
cat_pages int NOT NULL default 0,
cat_subcats int NOT NULL default 0,
cat_files int NOT NULL default 0,
cat_hidden tinyint NOT NULL default 0,
- PRIMARY KEY (cat_id)
);
-CREATE TABLE /*$wgDBprefix*/externallinks (
- el_from int NOT NULL default '0',
- el_to text NOT NULL,
- el_index text NOT NULL
-);
+CREATE UNIQUE INDEX /*$wgDBprefix*/cat_title ON /*$wgDBprefix*/category(cat_title);
+-- For Special:Mostlinkedcategories
+CREATE INDEX /*$wgDBprefix*/cat_pages ON /*$wgDBprefix*/category(cat_pages);
-CREATE TABLE /*$wgDBprefix*/langlinks (
- ll_from int NOT NULL default '0',
- ll_lang varchar(7) NOT NULL default '',
- ll_title varchar(255) NOT NULL default ''
-);
-CREATE TABLE /*$wgDBprefix*/site_stats (
- ss_row_id int NOT NULL,
- ss_total_views bigint default '0',
- ss_total_edits bigint default '0',
- ss_good_articles bigint default '0',
- ss_total_pages bigint default '-1',
- ss_users bigint default '-1',
- ss_admins int default '-1',
- ss_images int default '0'
+CREATE TABLE /*$wgDBprefix*/change_tag (
+ ct_rc_id int NOT NULL default 0,
+ ct_log_id int NOT NULL default 0,
+ ct_rev_id int NOT NULL default 0,
+ ct_tag varchar(255) NOT NULL,
+ ct_params varchar(255) NOT NULL,
);
+CREATE UNIQUE INDEX /*$wgDBprefix*/change_tag_rc_tag ON /*$wgDBprefix*/change_tag(ct_rc_id,ct_tag);
+CREATE UNIQUE INDEX /*$wgDBprefix*/change_tag_log_tag ON /*$wgDBprefix*/change_tag(ct_log_id,ct_tag);
+CREATE UNIQUE INDEX /*$wgDBprefix*/change_tag_rev_tag ON /*$wgDBprefix*/change_tag(ct_rev_id,ct_tag);
+CREATE INDEX /*$wgDBprefix*/change_tag_tag_id ON /*$wgDBprefix*/change_tag(ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-CREATE TABLE /*$wgDBprefix*/hitcounter (
- hc_id int NOT NULL
+CREATE TABLE /*$wgDBprefix*/tag_summary (
+ ts_rc_id INT NOT NULL default 0,
+ ts_log_id INT NOT NULL default 0,
+ ts_rev_id INT NOT NULL default 0,
+ ts_tags varchar(255) NOT NULL
);
+CREATE UNIQUE INDEX /*$wgDBprefix*/tag_summary_rc_id ON /*$wgDBprefix*/tag_summary(ts_rc_id);
+CREATE UNIQUE INDEX /*$wgDBprefix*/tag_summary_log_id ON /*$wgDBprefix*/tag_summary(ts_log_id);
+CREATE UNIQUE INDEX /*$wgDBprefix*/tag_summary_rev_id ON /*$wgDBprefix*/tag_summary(ts_rev_id);
-CREATE TABLE /*$wgDBprefix*/ipblocks (
- ipb_id int NOT NULL IDENTITY(1,1),
- ipb_address text NOT NULL,
- ipb_user int NOT NULL default '0',
- ipb_by int NOT NULL default '0',
- ipb_by_text varchar(255) NOT NULL default '',
- ipb_reason text NOT NULL,
- ipb_timestamp varchar(5) NOT NULL default '',
- ipb_auto bit NOT NULL default 0,
- ipb_anon_only bit NOT NULL default 0,
- ipb_create_account bit NOT NULL default 1,
- ipb_enable_autoblock bit NOT NULL default '1',
- ipb_expiry varchar(5) NOT NULL default '',
- ipb_range_start text NOT NULL,
- ipb_range_end text NOT NULL,
- ipb_deleted bit NOT NULL default 0,
- ipb_block_email bit NOT NULL default 0,
- PRIMARY KEY (ipb_id)
+CREATE TABLE /*$wgDBprefix*/valid_tag (
+ vt_tag varchar(255) NOT NULL PRIMARY KEY
);
-CREATE TABLE /*$wgDBprefix*/image (
- img_name varchar(255) NOT NULL default '',
- img_size int NOT NULL default '0',
- img_width int NOT NULL default '0',
- img_height int NOT NULL default '0',
- img_metadata text NOT NULL,
- img_bits int NOT NULL default '0',
- img_media_type TEXT default NULL,
- img_major_mime TEXT NOT NULL default "unknown",
- img_minor_mime varchar(10) NOT NULL default "unknown",
- img_description text NOT NULL,
- img_user int NOT NULL default '0',
- img_user_text varchar(255) NOT NULL,
- img_timestamp varchar(5) NOT NULL default '',
- img_sha1 varchar(10) NOT NULL default '',
- PRIMARY KEY (img_name)
+--
+-- Table for storing localisation data
+--
+CREATE TABLE /*$wgDBprefix*/l10n_cache (
+ -- language code
+ lc_lang NVARCHAR(32) NOT NULL,
+
+ -- cache key
+ lc_key NVARCHAR(255) NOT NULL,
+
+ -- Value
+ lc_value TEXT NOT NULL DEFAULT '',
);
+CREATE INDEX /*$wgDBprefix*/lc_lang_key ON /*$wgDBprefix*/l10n_cache (lc_lang, lc_key);
-CREATE TABLE /*$wgDBprefix*/oldimage (
- oi_name varchar(255) NOT NULL default '',
- oi_archive_name varchar(255) NOT NULL default '',
- oi_size int NOT NULL default 0,
- oi_width int NOT NULL default 0,
- oi_height int NOT NULL default 0,
- oi_bits int NOT NULL default 0,
- oi_description text NOT NULL,
- oi_user int NOT NULL default '0',
- oi_user_text varchar(255) NOT NULL,
- oi_timestamp varchar(5) NOT NULL default '',
- oi_metadata text NOT NULL,
- oi_media_type TEXT default NULL,
- oi_major_mime TEXT NOT NULL default "unknown",
- oi_minor_mime varchar(10) NOT NULL default "unknown",
- oi_deleted tinyint NOT NULL default '0',
- oi_sha1 varchar(10) NOT NULL default ''
+--
+-- Track links to external URLs
+-- IE >= 4 supports no more than 2083 characters in a URL
+CREATE TABLE /*$wgDBprefix*/externallinks (
+ el_from INT NOT NULL DEFAULT '0',
+ el_to VARCHAR(2083) NOT NULL,
+ el_index VARCHAR(896) NOT NULL,
+);
+-- Maximum key length ON SQL Server is 900 bytes
+CREATE INDEX /*$wgDBprefix*/externallinks_index ON /*$wgDBprefix*/externallinks(el_index);
+
+--
+-- Track external user accounts, if ExternalAuth is used
+--
+CREATE TABLE /*$wgDBprefix*/external_user (
+ -- Foreign key to user_id
+ eu_local_id INT NOT NULL PRIMARY KEY,
+ -- opaque identifier provided by the external database
+ eu_external_id NVARCHAR(255) NOT NULL,
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/eu_external_idx ON /*$wgDBprefix*/external_user(eu_external_id);
+
+--
+-- Track INTerlanguage links
+--
+CREATE TABLE /*$wgDBprefix*/langlinks (
+ ll_from INT NOT NULL DEFAULT 0,
+ ll_lang NVARCHAR(20) NOT NULL DEFAULT '',
+ ll_title NVARCHAR(255) NOT NULL DEFAULT '',
+ CONSTRAINT /*$wgDBprefix*/langlinks_pk PRIMARY KEY(ll_from, ll_lang),
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
+
+--
+-- Track inline interwiki links
+--
+CREATE TABLE /*$wgDBprefix*/iwlinks (
+ -- page_id of the referring page
+ iwl_from INT NOT NULL DEFAULT 0,
+
+ -- Interwiki prefix code of the target
+ iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
+
+ -- Title of the target, including namespace
+ iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
+);
+
+CREATE UNIQUE INDEX /*$wgDBprefix*/iwl_from ON /*$wgDBprefix*/iwlinks(iwl_from,iwl_prefix,iwl_title);
+CREATE UNIQUE INDEX /*$wgDBprefix*/iwl_prefix ON /*$wgDBprefix*/iwlinks(iwl_prefix,iwl_title);
+
+
+--
+-- Contains a single row with some aggregate info
+-- ON the state of the site.
+--
+CREATE TABLE /*$wgDBprefix*/site_stats (
+ ss_row_id INT NOT NULL DEFAULT 1 PRIMARY KEY,
+ ss_total_views BIGINT DEFAULT 0,
+ ss_total_edits BIGINT DEFAULT 0,
+ ss_good_articles BIGINT DEFAULT 0,
+ ss_total_pages BIGINT DEFAULT -1,
+ ss_users BIGINT DEFAULT -1,
+ ss_active_users BIGINT DEFAULT -1,
+ ss_admins INT DEFAULT -1,
+ ss_images INT DEFAULT 0,
+);
+
+-- INSERT INTO site_stats DEFAULT VALUES;
+
+--
+-- Stores an ID for every time any article is visited;
+-- depending ON $wgHitcounterUpdateFreq, it is
+-- periodically cleared and the page_counter column
+-- in the page table updated for the all articles
+-- that have been visited.)
+--
+CREATE TABLE /*$wgDBprefix*/hitcounter (
+ hc_id BIGINT NOT NULL
);
+--
+-- The Internet is full of jerks, alas. Sometimes it's handy
+-- to block a vandal or troll account.
+--
+CREATE TABLE /*$wgDBprefix*/ipblocks (
+ ipb_id INT NOT NULL PRIMARY KEY,
+ ipb_address NVARCHAR(255) NOT NULL,
+ ipb_user INT NOT NULL DEFAULT 0,
+ ipb_by INT NOT NULL DEFAULT 0,
+ ipb_by_text NVARCHAR(255) NOT NULL DEFAULT '',
+ ipb_reason NVARCHAR(255) NOT NULL,
+ ipb_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ ipb_auto BIT NOT NULL DEFAULT 0,
+ ipb_anon_only BIT NOT NULL DEFAULT 0,
+ ipb_create_account BIT NOT NULL DEFAULT 1,
+ ipb_enable_autoblock BIT NOT NULL DEFAULT 1,
+ ipb_expiry DATETIME NOT NULL DEFAULT GETDATE(),
+ ipb_range_start NVARCHAR(32) NOT NULL DEFAULT '',
+ ipb_range_end NVARCHAR(32) NOT NULL DEFAULT '',
+ ipb_deleted BIT NOT NULL DEFAULT 0,
+ ipb_block_email BIT NOT NULL DEFAULT 0,
+ ipb_allow_usertalk BIT NOT NULL DEFAULT 0,
+);
+-- Unique index to support "user already blocked" messages
+-- Any new options which prevent collisions should be included
+--UNIQUE INDEX ipb_address (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only),
+CREATE UNIQUE INDEX /*$wgDBprefix*/ipb_address ON /*$wgDBprefix*/ipblocks(ipb_address, ipb_user, ipb_auto, ipb_anon_only);
+CREATE INDEX /*$wgDBprefix*/ipb_user ON /*$wgDBprefix*/ipblocks(ipb_user);
+CREATE INDEX /*$wgDBprefix*/ipb_range ON /*$wgDBprefix*/ipblocks(ipb_range_start, ipb_range_end);
+CREATE INDEX /*$wgDBprefix*/ipb_timestamp ON /*$wgDBprefix*/ipblocks(ipb_timestamp);
+CREATE INDEX /*$wgDBprefix*/ipb_expiry ON /*$wgDBprefix*/ipblocks(ipb_expiry);
+;
+
+--
+-- Uploaded images and other files.
+CREATE TABLE /*$wgDBprefix*/image (
+ img_name varchar(255) NOT NULL default '',
+ img_size INT NOT NULL DEFAULT 0,
+ img_width INT NOT NULL DEFAULT 0,
+ img_height INT NOT NULL DEFAULT 0,
+ img_metadata TEXT NOT NULL, -- was MEDIUMBLOB
+ img_bits SMALLINT NOT NULL DEFAULT 0,
+ img_media_type NVARCHAR(MAX) DEFAULT 'UNKNOWN',
+ img_major_mime NVARCHAR(MAX) DEFAULT 'UNKNOWN',
+ img_minor_mime NVARCHAR(MAX) NOT NULL DEFAULT 'unknown',
+ img_description NVARCHAR(MAX) NOT NULL,
+ img_user INT NOT NULL DEFAULT 0,
+ img_user_text VARCHAR(255) NOT NULL DEFAULT '',
+ img_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ img_sha1 VARCHAR(255) NOT NULL default '',
+);
+-- Used by Special:Imagelist for sort-by-size
+CREATE INDEX /*$wgDBprefix*/img_size ON /*$wgDBprefix*/[image](img_size);
+-- Used by Special:Newimages and Special:Imagelist
+CREATE INDEX /*$wgDBprefix*/img_timestamp ON /*$wgDBprefix*/[image](img_timestamp)
+CREATE INDEX /*$wgDBprefix*/[img_sha1] ON /*wgDBprefix*/[image](img_sha1)
+
+--
+-- Previous revisions of uploaded files.
+-- Awkwardly, image rows have to be moved into
+-- this table at re-upload time.
+--
+CREATE TABLE /*$wgDBprefix*/oldimage (
+ oi_name VARCHAR(255) NOT NULL DEFAULT '',
+ oi_archive_name VARCHAR(255) NOT NULL DEFAULT '',
+ oi_size INT NOT NULL DEFAULT 0,
+ oi_width INT NOT NULL DEFAULT 0,
+ oi_height INT NOT NULL DEFAULT 0,
+ oi_bits SMALLINT NOT NULL DEFAULT 0,
+ oi_description NVARCHAR(MAX) NOT NULL,
+ oi_user INT NOT NULL DEFAULT 0,
+ oi_user_text VARCHAR(255) NOT NULL DEFAULT '',
+ oi_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ oi_metadata TEXT NOT NULL,
+ oi_media_type NVARCHAR(MAX) DEFAULT 'UNKNOWN',
+ oi_major_mime NVARCHAR(MAX) NOT NULL DEFAULT 'UNKNOWN',
+ oi_minor_mime NVARCHAR(MAX) NOT NULL DEFAULT 'unknown',
+ oi_deleted BIT NOT NULL default 0,
+ oi_sha1 VARCHAR(255) NOT NULL default '',
+);
+CREATE INDEX /*$wgDBprefix*/oi_usertext_timestamp ON /*$wgDBprefix*/oldimage(oi_user_text,oi_timestamp);
+CREATE INDEX /*$wgDBprefix*/oi_name_timestamp ON /*$wgDBprefix*/oldimage(oi_name, oi_timestamp);
+CREATE INDEX /*$wgDBprefix*/oi_name_archive_name ON /*$wgDBprefix*/oldimage(oi_name,oi_archive_name);
+CREATE INDEX /*$wgDBprefix*/[oi_sha1] ON /*$wgDBprefix*/oldimage(oi_sha1);
+
+--
+-- Record of deleted file data
+--
CREATE TABLE /*$wgDBprefix*/filearchive (
- fa_id int NOT NULL IDENTITY(1,1),
- fa_name varchar(255) NOT NULL default '',
- fa_archive_name varchar(255) NULL default '',
- fa_storage_group varchar(5) NULL,
- fa_storage_key varchar(17) NULL default '',
- fa_deleted_user int,
- fa_deleted_timestamp varchar(5) NULL default '',
- fa_deleted_reason text,
- fa_size int default '0',
- fa_width int default '0',
- fa_height int default '0',
- fa_metadata text,
- fa_bits int default '0',
- fa_media_type TEXT default NULL,
- fa_major_mime TEXT default "unknown",
- fa_minor_mime varchar(10) NULL default "unknown",
- fa_description text,
- fa_user int default '0',
- fa_user_text varchar(255) NULL,
- fa_timestamp varchar(5) NULL default '',
- fa_deleted tinyint NOT NULL default '0',
- PRIMARY KEY (fa_id)
-);
-
+ fa_id INT NOT NULL PRIMARY KEY,
+ fa_name NVARCHAR(255) NOT NULL DEFAULT '',
+ fa_archive_name NVARCHAR(255) DEFAULT '',
+ fa_storage_group NVARCHAR(16),
+ fa_storage_key NVARCHAR(64) DEFAULT '',
+ fa_deleted_user INT,
+ fa_deleted_timestamp NVARCHAR(14) DEFAULT NULL,
+ fa_deleted_reason NVARCHAR(255),
+ fa_size SMALLINT DEFAULT 0,
+ fa_width SMALLINT DEFAULT 0,
+ fa_height SMALLINT DEFAULT 0,
+ fa_metadata NVARCHAR(MAX), -- was mediumblob
+ fa_bits SMALLINT DEFAULT 0,
+ fa_media_type NVARCHAR(11) DEFAULT NULL,
+ fa_major_mime NVARCHAR(11) DEFAULT 'unknown',
+ fa_minor_mime NVARCHAR(32) DEFAULT 'unknown',
+ fa_description NVARCHAR(255),
+ fa_user INT DEFAULT 0,
+ fa_user_text NVARCHAR(255) DEFAULT '',
+ fa_timestamp DATETIME DEFAULT GETDATE(),
+ fa_deleted BIT NOT NULL DEFAULT 0,
+);
+-- Pick by image name
+CREATE INDEX /*$wgDBprefix*/filearchive_name ON /*$wgDBprefix*/filearchive(fa_name,fa_timestamp);
+-- Pick by dupe files
+CREATE INDEX /*$wgDBprefix*/filearchive_dupe ON /*$wgDBprefix*/filearchive(fa_storage_group,fa_storage_key);
+-- Pick by deletion time
+CREATE INDEX /*$wgDBprefix*/filearchive_time ON /*$wgDBprefix*/filearchive(fa_deleted_timestamp);
+-- Pick by deleter
+CREATE INDEX /*$wgDBprefix*/filearchive_user ON /*$wgDBprefix*/filearchive(fa_deleted_user);
+
+--
+-- Primarily a summary table for Special:Recentchanges,
+-- this table contains some additional info on edits from
+-- the last few days, see Article::editUpdates()
+--
CREATE TABLE /*$wgDBprefix*/recentchanges (
- rc_id int NOT NULL IDENTITY(1,1),
- rc_timestamp varchar(5) NOT NULL default '',
- rc_cur_time varchar(5) NOT NULL default '',
- rc_user int NOT NULL default '0',
- rc_user_text varchar(255) NOT NULL,
- rc_namespace int NOT NULL default '0',
- rc_title varchar(255) NOT NULL default '',
- rc_comment varchar(255) NOT NULL default '',
- rc_minor tinyint NOT NULL default '0',
- rc_bot tinyint NOT NULL default '0',
- rc_new tinyint NOT NULL default '0',
- rc_cur_id int NOT NULL default '0',
- rc_this_oldid int NOT NULL default '0',
- rc_last_oldid int NOT NULL default '0',
- rc_type tinyint NOT NULL default '0',
- rc_moved_to_ns tinyint NOT NULL default '0',
- rc_moved_to_title varchar(255) NOT NULL default '',
- rc_patrolled tinyint NOT NULL default '0',
- rc_ip varchar(13) NOT NULL default '',
- rc_old_len int,
- rc_new_len int,
- rc_deleted tinyint NOT NULL default '0',
- rc_logid int NOT NULL default '0',
- rc_log_type varchar(17) NULL default NULL,
- rc_log_action varchar(17) NULL default NULL,
- rc_params text NULL,
- PRIMARY KEY (rc_id)
-);
+ rc_id INT NOT NULL,
+ rc_timestamp DATETIME DEFAULT GETDATE(),
+ rc_cur_time DATETIME DEFAULT GETDATE(),
+ rc_user INT DEFAULT 0,
+ rc_user_text NVARCHAR(255) DEFAULT '',
+ rc_namespace SMALLINT DEFAULT 0,
+ rc_title NVARCHAR(255) DEFAULT '',
+ rc_comment NVARCHAR(255) DEFAULT '',
+ rc_minor BIT DEFAULT 0,
+ rc_bot BIT DEFAULT 0,
+ rc_new BIT DEFAULT 0,
+ rc_cur_id INT DEFAULT 0,
+ rc_this_oldid INT DEFAULT 0,
+ rc_last_oldid INT DEFAULT 0,
+ rc_type tinyint DEFAULT 0,
+ rc_moved_to_ns BIT DEFAULT 0,
+ rc_moved_to_title NVARCHAR(255) DEFAULT '',
+ rc_patrolled BIT DEFAULT 0,
+ rc_ip NCHAR(40) DEFAULT '',
+ rc_old_len INT DEFAULT 0,
+ rc_new_len INT DEFAULT 0,
+ rc_deleted BIT DEFAULT 0,
+ rc_logid INT DEFAULT 0,
+ rc_log_type NVARCHAR(255) NULL DEFAULT NULL,
+ rc_log_action NVARCHAR(255) NULL DEFAULT NULL,
+ rc_params NVARCHAR(MAX) DEFAULT '',
+);
+CREATE INDEX /*$wgDBprefix*/rc_timestamp ON /*$wgDBprefix*/recentchanges(rc_timestamp);
+CREATE INDEX /*$wgDBprefix*/rc_namespace_title ON /*$wgDBprefix*/recentchanges(rc_namespace, rc_title);
+CREATE INDEX /*$wgDBprefix*/rc_cur_id ON /*$wgDBprefix*/recentchanges(rc_cur_id);
+CREATE INDEX /*$wgDBprefix*/new_name_timestamp ON /*$wgDBprefix*/recentchanges(rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*$wgDBprefix*/rc_ip ON /*$wgDBprefix*/recentchanges(rc_ip);
+CREATE INDEX /*$wgDBprefix*/rc_ns_usertext ON /*$wgDBprefix*/recentchanges(rc_namespace, rc_user_text);
+CREATE INDEX /*$wgDBprefix*/rc_user_text ON /*$wgDBprefix*/recentchanges(rc_user_text, rc_timestamp);
+;
CREATE TABLE /*$wgDBprefix*/watchlist (
- wl_user int NOT NULL,
- wl_namespace int NOT NULL default '0',
- wl_title varchar(255) NOT NULL default '',
- wl_notificationtimestamp varchar(5) NULL
+ wl_user INT NOT NULL,
+ wl_namespace SMALLINT NOT NULL DEFAULT 0,
+ wl_title NVARCHAR(255) NOT NULL DEFAULT '',
+ wl_notificationtimestamp NVARCHAR(14) DEFAULT NULL,
+
);
+CREATE UNIQUE INDEX /*$wgDBprefix*/namespace_title ON /*$wgDBprefix*/watchlist(wl_namespace,wl_title);
+--
+-- Used by the math module to keep track
+-- of previously-rendered items.
+--
CREATE TABLE /*$wgDBprefix*/math (
- math_inputhash varchar(5) NOT NULL,
- math_outputhash varchar(5) NOT NULL,
- math_html_conservativeness tinyint NOT NULL,
- math_html text,
- math_mathml text
+ math_inputhash varbinary(16) NOT NULL PRIMARY KEY,
+ math_outputhash varbinary(16) NOT NULL,
+ math_html_conservativeness tinyint NOT NULL,
+ math_html NVARCHAR(MAX),
+ math_mathml NVARCHAR(MAX),
);
+-- Needs fulltext index.
CREATE TABLE /*$wgDBprefix*/searchindex (
- si_page int NOT NULL,
- si_title varchar(255) NOT NULL default '',
- si_text text NOT NULL
-);
-
+ si_page INT NOT NULL unique REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
+ si_title varbinary(max) NOT NULL,
+ si_text varbinary(max) NOT NULL,
+ si_ext CHAR(4) NOT NULL DEFAULT '.txt',
+);
+CREATE FULLTEXT CATALOG wikidb AS DEFAULT;
+CREATE UNIQUE CLUSTERED INDEX searchindex_page ON searchindex (si_page);
+CREATE FULLTEXT INDEX on searchindex (si_title TYPE COLUMN si_ext, si_text TYPE COLUMN si_ext)
+KEY INDEX searchindex_page
+;
+
+-- This table is not used unless profiling is turned on
+CREATE TABLE profiling (
+ pf_count INTEGER NOT NULL DEFAULT 0,
+ pf_time NUMERIC(18,10) NOT NULL DEFAULT 0,
+ pf_name NVARCHAR(200) NOT NULL,
+ pf_server NVARCHAR(200) NULL
+);
+CREATE UNIQUE INDEX pf_name_server ON profiling (pf_name, pf_server);
+
+--
+-- Recognized INTerwiki link prefixes
+--
CREATE TABLE /*$wgDBprefix*/interwiki (
- iw_prefix varchar(32) NOT NULL,
- iw_url text NOT NULL,
- iw_local bit NOT NULL,
- iw_trans tinyint NOT NULL default 0
+ iw_prefix NCHAR(32) NOT NULL PRIMARY KEY,
+ iw_url NCHAR(127) NOT NULL,
+ iw_api TEXT NOT NULL DEFAULT '',
+ iw_wikiid NVARCHAR(64) NOT NULL DEFAULT '',
+ iw_local BIT NOT NULL,
+ iw_trans BIT NOT NULL DEFAULT 0,
);
+--
+-- Used for caching expensive grouped queries
+--
CREATE TABLE /*$wgDBprefix*/querycache (
- qc_type varchar(10) NOT NULL,
- qc_value int NOT NULL default '0',
- qc_namespace int NOT NULL default '0',
- qc_title varchar(255) NOT NULL default ''
+ qc_type NCHAR(32) NOT NULL,
+ qc_value INT NOT NULL DEFAULT '0',
+ qc_namespace SMALLINT NOT NULL DEFAULT 0,
+ qc_title NCHAR(255) NOT NULL DEFAULT '',
+ CONSTRAINT /*$wgDBprefix*/qc_pk PRIMARY KEY (qc_type,qc_value)
);
+--
+-- For a few generic cache operations if not using Memcached
+--
CREATE TABLE /*$wgDBprefix*/objectcache (
- keyname varchar(17) NOT NULL default '',
- value text,
- exptime datetime
-);
-
+ keyname NCHAR(255) NOT NULL DEFAULT '',
+ [value] NVARCHAR(MAX), -- IMAGE,
+ exptime DATETIME, -- This is treated as a DATETIME
+);
+CREATE CLUSTERED INDEX /*$wgDBprefix*/[objectcache_time] ON /*$wgDBprefix*/objectcache(exptime);
+CREATE UNIQUE INDEX /*$wgDBprefix*/[objectcache_PK] ON /*wgDBprefix*/objectcache(keyname);
+--
+-- Cache of INTerwiki transclusion
+--
CREATE TABLE /*$wgDBprefix*/transcache (
- tc_url varchar(17) NOT NULL,
- tc_contents text,
- tc_time int NOT NULL
+ tc_url NVARCHAR(255) NOT NULL PRIMARY KEY,
+ tc_contents NVARCHAR(MAX),
+ tc_time INT NOT NULL,
);
CREATE TABLE /*$wgDBprefix*/logging (
- log_id int NOT NULL IDENTITY(1,1),
- log_type varchar(4) NOT NULL default '',
- log_action varchar(4) NOT NULL default '',
- log_timestamp varchar(5) NOT NULL default '19700101000000',
- log_user int NOT NULL default 0,
- log_namespace int NOT NULL default 0,
- log_title varchar(255) NOT NULL default '',
- log_comment varchar(255) NOT NULL default '',
- log_params text NOT NULL,
- log_deleted tinyint NOT NULL default '0',
- PRIMARY KEY (log_id)
-);
+ log_id INT PRIMARY KEY IDENTITY,
+ log_type NCHAR(10) NOT NULL DEFAULT '',
+ log_action NCHAR(10) NOT NULL DEFAULT '',
+ log_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+ log_user INT NOT NULL DEFAULT 0,
+ log_user_text NVARCHAR(255) NOT NULL DEFAULT '',
+ log_namespace INT NOT NULL DEFAULT 0,
+ log_title NVARCHAR(255) NOT NULL DEFAULT '',
+ log_page INT NULL DEFAULT NULL,
+ log_comment NVARCHAR(255) NOT NULL DEFAULT '',
+ log_params NVARCHAR(MAX) NOT NULL,
+ log_deleted BIT NOT NULL DEFAULT 0,
+);
+CREATE INDEX /*$wgDBprefix*/type_time ON /*$wgDBprefix*/logging (log_type, log_timestamp);
+CREATE INDEX /*$wgDBprefix*/user_time ON /*$wgDBprefix*/logging (log_user, log_timestamp);
+CREATE INDEX /*$wgDBprefix*/page_time ON /*$wgDBprefix*/logging (log_namespace, log_title, log_timestamp);
+CREATE INDEX /*$wgDBprefix*/times ON /*$wgDBprefix*/logging (log_timestamp);
+CREATE INDEX /*$wgDBprefix*/log_user_type_time ON /*$wgDBprefix*/logging (log_user, log_type, log_timestamp);
+CREATE INDEX /*$wgDBprefix*/log_page_id_time ON /*$wgDBprefix*/logging (log_page,log_timestamp);
+
+CREATE TABLE /*$wgDBprefix*/log_search (
+ -- The type of ID (rev ID, log ID, rev timestamp, username)
+ ls_field NVARCHAR(32) NOT NULL,
+ -- The value of the ID
+ ls_value NVARCHAR(255) NOT NULL,
+ -- Key to log_id
+ ls_log_id INT NOT NULL default 0,
+);
+CREATE UNIQUE INDEX /*$wgDBprefix*/ls_field_val ON /*$wgDBprefix*/log_search (ls_field,ls_value,ls_log_id);
+CREATE INDEX /*$wgDBprefix*/ls_log_id ON /*$wgDBprefix*/log_search (ls_log_id);
+
CREATE TABLE /*$wgDBprefix*/trackbacks (
- tb_id int IDENTITY(1,1),
- tb_page int REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url text NOT NULL,
- tb_ex text,
- tb_name varchar(255) NULL,
- PRIMARY KEY (tb_id)
+ tb_id INT PRIMARY KEY,
+ tb_page INT REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
+ tb_title NVARCHAR(255) NOT NULL,
+ tb_url NVARCHAR(255) NOT NULL,
+ tb_ex NVARCHAR(MAX),
+ tb_name NVARCHAR(255),
);
+CREATE INDEX /*$wgDBprefix*/trackbacks_page ON /*$wgDBprefix*/trackbacks(tb_page);
+-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*$wgDBprefix*/job (
- job_id int NOT NULL IDENTITY(1,1),
- job_cmd varchar(17) NOT NULL default '',
- job_namespace int NOT NULL,
- job_title varchar(255) NOT NULL,
- job_params text NOT NULL,
- PRIMARY KEY (job_id)
+ job_id INT NOT NULL PRIMARY KEY,
+ job_cmd NVARCHAR(200) NOT NULL DEFAULT '',
+ job_namespace INT NOT NULL,
+ job_title NVARCHAR(200) NOT NULL,
+ job_params NVARCHAR(255) NOT NULL,
);
+CREATE INDEX /*$wgDBprefix*/job_idx ON /*$wgDBprefix*/job(job_cmd,job_namespace,job_title);
+-- Details of updates to cached special pages
CREATE TABLE /*$wgDBprefix*/querycache_info (
- qci_type varchar(10) NOT NULL default '',
- qci_timestamp varchar(5) NOT NULL default '19700101000000'
+ qci_type NVARCHAR(32) NOT NULL DEFAULT '' PRIMARY KEY,
+ qci_timestamp NVARCHAR(14) NOT NULL DEFAULT '19700101000000',
);
+-- For each redirect, this table contains exactly one row defining its target
CREATE TABLE /*$wgDBprefix*/redirect (
- rd_from int NOT NULL default '0',
- rd_namespace int NOT NULL default '0',
- rd_title varchar(255) NOT NULL default '',
- PRIMARY KEY (rd_from)
+ rd_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/[page](page_id) ON DELETE CASCADE,
+ rd_namespace SMALLINT NOT NULL DEFAULT '0',
+ rd_title NVARCHAR(255) NOT NULL DEFAULT '',
+ rd_interwiki NVARCHAR(32) DEFAULT NULL,
+ rd_fragment NVARCHAR(255) DEFAULT NULL,
);
+CREATE UNIQUE INDEX /*$wgDBprefix*/rd_ns_title ON /*$wgDBprefix*/redirect(rd_namespace,rd_title,rd_from);
+-- Used for caching expensive grouped queries that need two links (for example double-redirects)
CREATE TABLE /*$wgDBprefix*/querycachetwo (
- qcc_type varchar(10) NOT NULL,
- qcc_value int NOT NULL default '0',
- qcc_namespace int NOT NULL default '0',
- qcc_title varchar(255) NOT NULL default '',
- qcc_namespacetwo int NOT NULL default '0',
- qcc_titletwo varchar(255) NOT NULL default ''
+ qcc_type NCHAR(32) NOT NULL,
+ qcc_value INT NOT NULL DEFAULT 0,
+ qcc_namespace INT NOT NULL DEFAULT 0,
+ qcc_title NCHAR(255) NOT NULL DEFAULT '',
+ qcc_namespacetwo INT NOT NULL DEFAULT 0,
+ qcc_titletwo NCHAR(255) NOT NULL DEFAULT '',
+ CONSTRAINT /*$wgDBprefix*/qcc_type PRIMARY KEY(qcc_type,qcc_value),
);
+CREATE UNIQUE INDEX /*$wgDBprefix*/qcc_title ON /*$wgDBprefix*/querycachetwo(qcc_type,qcc_namespace,qcc_title);
+CREATE UNIQUE INDEX /*$wgDBprefix*/qcc_titletwo ON /*$wgDBprefix*/querycachetwo(qcc_type,qcc_namespacetwo,qcc_titletwo);
-CREATE TABLE /*$wgDBprefix*/page_restrictions (
- pr_page int NOT NULL,
- pr_type varchar(17) NOT NULL,
- pr_level varchar(17) NOT NULL,
- pr_cascade tinyint NOT NULL,
- pr_user int NULL,
- pr_expiry varchar(5) NULL,
- pr_id int NOT NULL IDENTITY(1,1),
- PRIMARY KEY (pr_page,pr_type)
-);
+--- Used for storing page restrictions (i.e. protection levels)
+CREATE TABLE /*$wgDBprefix*/page_restrictions (
+ pr_page INT NOT NULL REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
+ pr_type NVARCHAR(200) NOT NULL,
+ pr_level NVARCHAR(200) NOT NULL,
+ pr_cascade SMALLINT NOT NULL,
+ pr_user INT NULL,
+ pr_expiry DATETIME NULL,
+ pr_id INT UNIQUE IDENTITY,
+ CONSTRAINT /*$wgDBprefix*/pr_pagetype PRIMARY KEY(pr_page,pr_type),
+);
+CREATE INDEX /*$wgDBprefix*/pr_page ON /*$wgDBprefix*/page_restrictions(pr_page);
+CREATE INDEX /*$wgDBprefix*/pr_typelevel ON /*$wgDBprefix*/page_restrictions(pr_type,pr_level);
+CREATE INDEX /*$wgDBprefix*/pr_pagelevel ON /*$wgDBprefix*/page_restrictions(pr_level);
+CREATE INDEX /*$wgDBprefix*/pr_cascade ON /*$wgDBprefix*/page_restrictions(pr_cascade);
+;
+
+-- Protected titles - nonexistent pages that have been protected
CREATE TABLE /*$wgDBprefix*/protected_titles (
pt_namespace int NOT NULL,
- pt_title varchar(255) NOT NULL,
+ pt_title NVARCHAR(255) NOT NULL,
pt_user int NOT NULL,
- pt_reason text,
- pt_timestamp varchar(5) NOT NULL,
- pt_expiry varchar(5) NOT NULL default '',
- pt_create_perm varchar(17) NOT NULL,
- PRIMARY KEY (pt_namespace,pt_title)
+ pt_reason NVARCHAR(3555),
+ pt_timestamp DATETIME NOT NULL,
+ pt_expiry DATETIME NOT NULL default '',
+ pt_create_perm NVARCHAR(60) NOT NULL,
+ PRIMARY KEY (pt_namespace,pt_title),
);
+CREATE INDEX /*$wgDBprefix*/pt_timestamp ON /*$wgDBprefix*/protected_titles(pt_timestamp);
+;
+-- Name/value pairs indexed by page_id
CREATE TABLE /*$wgDBprefix*/page_props (
pp_page int NOT NULL,
- pp_propname varchar(17) NOT NULL,
- pp_value text NOT NULL,
+ pp_propname NVARCHAR(60) NOT NULL,
+ pp_value NVARCHAR(MAX) NOT NULL,
PRIMARY KEY (pp_page,pp_propname)
);
+-- A table to log updates, one text key row per update.
CREATE TABLE /*$wgDBprefix*/updatelog (
- ul_key varchar(255) NOT NULL,
+ ul_key NVARCHAR(255) NOT NULL,
PRIMARY KEY (ul_key)
);
+-- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
+-- AND assign a password for the FDHOST process to run under
+-- Once you have assigned a password to that account, you need to run the following stored procedure
+-- replacing XXXXX with the password you used.
+-- EXEC sp_fulltext_resetfdhostaccount @username = 'FDH$MSSQLSERVER', @password = 'XXXXXX' ;
+
+--- Add the full-text capabilities, depricated in SQL Server 2005, FTS is enabled on all user created tables by default unless you are using SQL Server 2005 Express
+--sp_fulltext_database 'enable';
+--sp_fulltext_catalog 'WikiCatalog', 'create'
+--sp_fulltext_table
+--sp_fulltext_column
+--sp_fulltext_table 'Articles', 'activate'
diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php
index b91922c3..92311521 100644
--- a/maintenance/mwdocgen.php
+++ b/maintenance/mwdocgen.php
@@ -21,7 +21,9 @@
* @todo document
* @ingroup Maintenance
*
- * @author Ashar Voultoiz <thoane@altern.org>
+ * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Brion Vibber
+ * @author Alexandre Emsenhuber
* @version first release
*/
@@ -29,7 +31,7 @@
# Variables / Configuration
#
-if( php_sapi_name() != 'cli' ) {
+if ( php_sapi_name() != 'cli' ) {
echo 'Run me from the command line.';
die( -1 );
}
@@ -37,9 +39,6 @@ if( php_sapi_name() != 'cli' ) {
/** Figure out the base directory for MediaWiki location */
$mwPath = dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR;
-/** Global variable: temporary directory */
-$tmpPath = '/tmp/';
-
/** doxygen binary script */
$doxygenBin = 'doxygen';
@@ -50,14 +49,14 @@ $doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
$svnstat = $mwPath . 'bin/svnstat';
/** where Phpdoc should output documentation */
-#$doxyOutput = '/var/www/mwdoc/';
+# $doxyOutput = '/var/www/mwdoc/';
$doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
/** MediaWiki subpaths */
-$mwPathI = $mwPath.'includes/';
-$mwPathL = $mwPath.'languages/';
-$mwPathM = $mwPath.'maintenance/';
-$mwPathS = $mwPath.'skins/';
+$mwPathI = $mwPath . 'includes/';
+$mwPathL = $mwPath . 'languages/';
+$mwPathM = $mwPath . 'maintenance/';
+$mwPathS = $mwPath . 'skins/';
/** Variable to get user input */
$input = '';
@@ -67,11 +66,14 @@ $exclude = '';
# Functions
#
+define( 'MEDIAWIKI', true );
+require_once( "$mwPath/includes/GlobalFunctions.php" );
+
/**
* Read a line from the shell
* @param $prompt String
*/
-function readaline( $prompt = '' ){
+function readaline( $prompt = '' ) {
print $prompt;
$fp = fopen( "php://stdin", "r" );
$resp = trim( fgets( $fp, 1024 ) );
@@ -88,27 +90,27 @@ function getSvnRevision( $dir ) {
// http://svnbook.red-bean.com/nightly/en/svn.developer.insidewc.html
$entries = $dir . '/.svn/entries';
- if( !file_exists( $entries ) ) {
+ if ( !file_exists( $entries ) ) {
return false;
}
$content = file( $entries );
// check if file is xml (subversion release <= 1.3) or not (subversion release = 1.4)
- if( preg_match( '/^<\?xml/', $content[0] ) ) {
+ if ( preg_match( '/^<\?xml/', $content[0] ) ) {
// subversion is release <= 1.3
- if( !function_exists( 'simplexml_load_file' ) ) {
+ if ( !function_exists( 'simplexml_load_file' ) ) {
// We could fall back to expat... YUCK
return false;
}
$xml = simplexml_load_file( $entries );
- if( $xml ) {
- foreach( $xml->entry as $entry ) {
- if( $xml->entry[0]['name'] == '' ) {
+ if ( $xml ) {
+ foreach ( $xml->entry as $entry ) {
+ if ( $xml->entry[0]['name'] == '' ) {
// The directory entry should always have a revision marker.
- if( $entry['revision'] ) {
+ if ( $entry['revision'] ) {
return intval( $entry['revision'] );
}
}
@@ -129,15 +131,14 @@ function getSvnRevision( $dir ) {
* @param $currentVersion String: Version number of the software
* @param $svnstat String: path to the svnstat file
* @param $input String: Path to analyze.
- * @param $exclude String: Additionals path regex to exlcude
- * (LocalSettings.php, AdminSettings.php and .svn directories are always excluded)
+ * @param $exclude String: Additionals path regex to exlcude
+ * (LocalSettings.php, AdminSettings.php, .svn and .git directories are always excluded)
*/
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude ){
- global $tmpPath;
+function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude ) {
$template = file_get_contents( $doxygenTemplate );
- // Replace template placeholders by correct values.
+ // Replace template placeholders by correct values.
$replacements = array(
'{{OUTPUT_DIRECTORY}}' => $outputDirectory,
'{{STRIP_FROM_PATH}}' => $stripFromPath,
@@ -147,8 +148,8 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
'{{EXCLUDE}}' => $exclude,
);
$tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
- $tmpFileName = $tmpPath . 'mwdocgen'. rand() .'.tmp';
- file_put_contents( $tmpFileName , $tmpCfg ) or die("Could not write doxygen configuration to file $tmpFileName\n");
+ $tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
+ file_put_contents( $tmpFileName , $tmpCfg ) or die( "Could not write doxygen configuration to file $tmpFileName\n" );
return $tmpFileName;
}
@@ -159,7 +160,7 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
unset( $file );
-if( is_array( $argv ) && isset( $argv[1] ) ) {
+if ( is_array( $argv ) && isset( $argv[1] ) ) {
switch( $argv[1] ) {
case '--all': $input = 0; break;
case '--includes': $input = 1; break;
@@ -168,7 +169,7 @@ if( is_array( $argv ) && isset( $argv[1] ) ) {
case '--skins': $input = 4; break;
case '--file':
$input = 5;
- if( isset( $argv[2] ) ) {
+ if ( isset( $argv[2] ) ) {
$file = $argv[2];
}
break;
@@ -178,7 +179,7 @@ if( is_array( $argv ) && isset( $argv[1] ) ) {
// TODO : generate a list of paths ))
-if( $input === '' ) {
+if ( $input === '' ) {
echo <<<OPTIONS
Several documentation possibilities:
0 : whole documentation (1 + 2 + 3 + 4)
@@ -189,33 +190,33 @@ Several documentation possibilities:
5 : only a given file
6 : all but the extensions directory
OPTIONS;
- while ( !is_numeric($input) )
+ while ( !is_numeric( $input ) )
{
$input = readaline( "\nEnter your choice [0]:" );
- if($input == '') {
+ if ( $input == '' ) {
$input = 0;
}
}
}
-switch ($input) {
+switch ( $input ) {
case 0: $input = $mwPath; break;
case 1: $input = $mwPathI; break;
case 2: $input = $mwPathL; break;
case 3: $input = $mwPathM; break;
case 4: $input = $mwPathS; break;
case 5:
- if( !isset( $file ) ) {
+ if ( !isset( $file ) ) {
$file = readaline( "Enter file name $mwPath" );
}
- $input = $mwPath.$file;
+ $input = $mwPath . $file;
case 6:
$input = $mwPath;
$exclude = 'extensions';
}
$versionNumber = getSvnRevision( $input );
-if( $versionNumber === false ){ #Not using subversion ?
+if ( $versionNumber === false ) { # Not using subversion ?
$svnstat = ''; # Not really useful if subversion not available
$version = 'trunk'; # FIXME
} else {
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php
index dd29558c..dbb16bcd 100644
--- a/maintenance/namespaceDupes.php
+++ b/maintenance/namespaceDupes.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class NamespaceConflictChecker extends Maintenance {
public function __construct() {
@@ -47,13 +47,13 @@ class NamespaceConflictChecker extends Maintenance {
$prefix = $this->getOption( 'prefix', '' );
$key = intval( $this->getOption( 'key', 0 ) );
- if( $prefix ) {
+ if ( $prefix ) {
$retval = $this->checkPrefix( $key, $prefix, $fix, $suffix );
} else {
$retval = $this->checkAll( $fix, $suffix );
}
-
- if( $retval ) {
+
+ if ( $retval ) {
$this->output( "\nLooks good!\n" );
} else {
$this->output( "\nOh noeees\n" );
@@ -62,44 +62,44 @@ class NamespaceConflictChecker extends Maintenance {
/**
* @todo Document
- * @param $fix bool Whether or not to fix broken entries
- * @param $suffix String Suffix to append to renamed articles
+ * @param $fix Boolean: whether or not to fix broken entries
+ * @param $suffix String: suffix to append to renamed articles
*/
private function checkAll( $fix, $suffix = '' ) {
global $wgContLang, $wgNamespaceAliases, $wgCanonicalNamespaceNames;
global $wgCapitalLinks;
-
+
$spaces = array();
-
+
// List interwikis first, so they'll be overridden
// by any conflicting local namespaces.
- foreach( $this->getInterwikiList() as $prefix ) {
+ foreach ( $this->getInterwikiList() as $prefix ) {
$name = $wgContLang->ucfirst( $prefix );
$spaces[$name] = 0;
}
// Now pull in all canonical and alias namespaces...
- foreach( $wgCanonicalNamespaceNames as $ns => $name ) {
+ foreach ( $wgCanonicalNamespaceNames as $ns => $name ) {
// This includes $wgExtraNamespaces
- if( $name !== '' ) {
+ if ( $name !== '' ) {
$spaces[$name] = $ns;
}
}
- foreach( $wgContLang->getNamespaces() as $ns => $name ) {
- if( $name !== '' ) {
+ foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
+ if ( $name !== '' ) {
$spaces[$name] = $ns;
}
}
- foreach( $wgNamespaceAliases as $name => $ns ) {
+ foreach ( $wgNamespaceAliases as $name => $ns ) {
$spaces[$name] = $ns;
}
- foreach( $wgContLang->getNamespaceAliases() as $name => $ns ) {
+ foreach ( $wgContLang->getNamespaceAliases() as $name => $ns ) {
$spaces[$name] = $ns;
}
-
+
// We'll need to check for lowercase keys as well,
// since we're doing case-sensitive searches in the db.
- foreach( $spaces as $name => $ns ) {
+ foreach ( $spaces as $name => $ns ) {
$moreNames = array();
$moreNames[] = $wgContLang->uc( $name );
$moreNames[] = $wgContLang->ucfirst( $wgContLang->lc( $name ) );
@@ -107,24 +107,24 @@ class NamespaceConflictChecker extends Maintenance {
$moreNames[] = $wgContLang->ucwords( $wgContLang->lc( $name ) );
$moreNames[] = $wgContLang->ucwordbreaks( $name );
$moreNames[] = $wgContLang->ucwordbreaks( $wgContLang->lc( $name ) );
- if( !$wgCapitalLinks ) {
- foreach( $moreNames as $altName ) {
+ if ( !$wgCapitalLinks ) {
+ foreach ( $moreNames as $altName ) {
$moreNames[] = $wgContLang->lcfirst( $altName );
}
$moreNames[] = $wgContLang->lcfirst( $name );
}
- foreach( array_unique( $moreNames ) as $altName ) {
- if( $altName !== $name ) {
+ foreach ( array_unique( $moreNames ) as $altName ) {
+ if ( $altName !== $name ) {
$spaces[$altName] = $ns;
}
}
}
-
+
ksort( $spaces );
asort( $spaces );
-
+
$ok = true;
- foreach( $spaces as $name => $ns ) {
+ foreach ( $spaces as $name => $ns ) {
$ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok;
}
return $ok;
@@ -132,44 +132,44 @@ class NamespaceConflictChecker extends Maintenance {
/**
* Get the interwiki list
+ *
* @todo Needs to respect interwiki cache!
- * @return array
+ * @return Array
*/
private function getInterwikiList() {
$result = $this->db->select( 'interwiki', array( 'iw_prefix' ) );
$prefixes = array();
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$prefixes[] = $row->iw_prefix;
}
- $this->db->freeResult( $result );
return $prefixes;
}
/**
* @todo Document
- * @param $ns int A namespace id
+ * @param $ns Integer: a namespace id
* @param $name String
- * @param $fix bool Whether to fix broken entries
- * @param $suffix String Suffix to append to renamed articles
+ * @param $fix Boolean: whether to fix broken entries
+ * @param $suffix String: suffix to append to renamed articles
*/
private function checkNamespace( $ns, $name, $fix, $suffix = '' ) {
$conflicts = $this->getConflicts( $ns, $name );
$count = count( $conflicts );
- if( $count == 0 ) {
+ if ( $count == 0 ) {
return true;
}
$ok = true;
- foreach( $conflicts as $row ) {
+ foreach ( $conflicts as $row ) {
$resolvable = $this->reportConflict( $row, $suffix );
$ok = $ok && $resolvable;
- if( $fix && ( $resolvable || $suffix != '' ) ) {
+ if ( $fix && ( $resolvable || $suffix != '' ) ) {
$ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok;
}
}
return $ok;
}
-
+
/**
* @todo: do this for reals
*/
@@ -181,8 +181,9 @@ class NamespaceConflictChecker extends Maintenance {
/**
* Find pages in mainspace that have a prefix of the new namespace
* so we know titles that will need migrating
- * @param $ns int Namespace id (id for new namespace?)
- * @param $name String Prefix that is being made a namespace
+ *
+ * @param $ns Integer: namespace id (id for new namespace?)
+ * @param $name String: prefix that is being made a namespace
*/
private function getConflicts( $ns, $name ) {
$page = 'page';
@@ -192,27 +193,26 @@ class NamespaceConflictChecker extends Maintenance {
$encNamespace = $this->db->addQuotes( $ns );
$titleSql = "TRIM(LEADING '$prefix:' FROM {$page}_title)";
- if( $ns == 0 ) {
+ if ( $ns == 0 ) {
// An interwiki; try an alternate encoding with '-' for ':'
$titleSql = $this->db->buildConcat( array( "'$prefix-'", $titleSql ) );
}
-
+
$sql = "SELECT {$page}_id AS id,
- {$page}_title AS oldtitle,
- $encNamespace AS namespace,
- $titleSql AS title
- FROM {$table}
- WHERE {$page}_namespace=0
- AND {$page}_title " . $this->db->buildLike( $name . ':', $this->db->anyString() );
+ {$page}_title AS oldtitle,
+ $encNamespace + {$page}_namespace AS namespace,
+ $titleSql AS title,
+ {$page}_namespace AS oldnamespace
+ FROM {$table}
+ WHERE ( {$page}_namespace=0 OR {$page}_namespace=1 )
+ AND {$page}_title " . $this->db->buildLike( $name . ':', $this->db->anyString() );
$result = $this->db->query( $sql, __METHOD__ );
$set = array();
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$set[] = $row;
}
- $this->db->freeResult( $result );
-
return $set;
}
@@ -221,25 +221,27 @@ class NamespaceConflictChecker extends Maintenance {
*/
private function reportConflict( $row, $suffix ) {
$newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
- if( is_null($newTitle) || !$newTitle->canExist() ) {
+ if ( is_null( $newTitle ) || !$newTitle->canExist() ) {
// Title is also an illegal title...
// For the moment we'll let these slide to cleanupTitles or whoever.
- $this->output( sprintf( "... %d (0,\"%s\")\n",
+ $this->output( sprintf( "... %d (%d,\"%s\")\n",
$row->id,
+ $row->oldnamespace,
$row->oldtitle ) );
$this->output( "... *** cannot resolve automatically; illegal title ***\n" );
return false;
}
- $this->output( sprintf( "... %d (0,\"%s\") -> (%d,\"%s\") [[%s]]\n",
+ $this->output( sprintf( "... %d (%d,\"%s\") -> (%d,\"%s\") [[%s]]\n",
$row->id,
+ $row->oldnamespace,
$row->oldtitle,
$newTitle->getNamespace(),
$newTitle->getDBkey(),
$newTitle->getPrefixedText() ) );
$id = $newTitle->getArticleId();
- if( $id ) {
+ if ( $id ) {
$this->output( "... *** cannot resolve automatically; page exists with ID $id ***\n" );
return false;
} else {
@@ -249,24 +251,26 @@ class NamespaceConflictChecker extends Maintenance {
/**
* Resolve any conflicts
- * @param $row Row from the page table to fix
- * @param $resolveable bool
- * @param $suffix String Suffix to append to the fixed page
+ *
+ * @param $row Object: row from the page table to fix
+ * @param $resolvable Boolean
+ * @param $suffix String: suffix to append to the fixed page
*/
private function resolveConflict( $row, $resolvable, $suffix ) {
- if( !$resolvable ) {
+ if ( !$resolvable ) {
$this->output( "... *** old title {$row->title}\n" );
- while( true ) {
+ while ( true ) {
$row->title .= $suffix;
$this->output( "... *** new title {$row->title}\n" );
$title = Title::makeTitleSafe( $row->namespace, $row->title );
- if ( ! $title ) {
+ if ( !$title ) {
$this->output( "... !!! invalid title\n" );
return false;
}
- if ( $id = $title->getArticleId() ) {
+ $id = $title->getArticleId();
+ if ( $id ) {
$this->output( "... *** page exists with ID $id ***\n" );
- } else {
+ } else {
break;
}
}
@@ -278,9 +282,10 @@ class NamespaceConflictChecker extends Maintenance {
/**
* Resolve a given conflict
- * @param $row Row from the old broken entry
- * @param $table String Table to update
- * @param $prefix String Prefix for column name, like page or ar
+ *
+ * @param $row Object: row from the old broken entry
+ * @param $table String: table to update
+ * @param $prefix String: prefix for column name, like page or ar
*/
private function resolveConflictOn( $row, $table, $prefix ) {
$this->output( "... resolving on $table... " );
@@ -291,8 +296,9 @@ class NamespaceConflictChecker extends Maintenance {
"{$prefix}_title" => $newTitle->getDBkey(),
),
array(
- "{$prefix}_namespace" => 0,
- "{$prefix}_title" => $row->oldtitle,
+ // "{$prefix}_namespace" => 0,
+ // "{$prefix}_title" => $row->oldtitle,
+ "{$prefix}_id" => $row->id,
),
__METHOD__ );
$this->output( "ok.\n" );
@@ -301,4 +307,4 @@ class NamespaceConflictChecker extends Maintenance {
}
$maintClass = "NamespaceConflictChecker";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/nextJobDB.php b/maintenance/nextJobDB.php
index 75855bb3..8d8229e2 100644
--- a/maintenance/nextJobDB.php
+++ b/maintenance/nextJobDB.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class nextJobDB extends Maintenance {
public function __construct() {
@@ -39,13 +39,13 @@ class nextJobDB extends Maintenance {
$pendingDBs = $wgMemc->get( $mckey );
# If we didn't get it from the cache
- if( !$pendingDBs ) {
+ if ( !$pendingDBs ) {
$pendingDBs = $this->getPendingDbs( $type );
- $wgMemc->get( $mckey, $pendingDBs, 300 );
+ $wgMemc->set( $mckey, $pendingDBs, 300 );
}
# If we've got a pending job in a db, display it.
if ( $pendingDBs ) {
- $this->output( $pendingDBs[mt_rand(0, count( $pendingDBs ) - 1)] );
+ $this->output( $pendingDBs[mt_rand( 0, count( $pendingDBs ) - 1 )] );
}
}
@@ -61,10 +61,10 @@ class nextJobDB extends Maintenance {
$dbsByMaster = array();
foreach ( $wgLocalDatabases as $db ) {
$lb = wfGetLB( $db );
- $dbsByMaster[$lb->getServerName(0)][] = $db;
+ $dbsByMaster[$lb->getServerName( 0 )][] = $db;
}
- foreach ( $dbsByMaster as $master => $dbs ) {
+ foreach ( $dbsByMaster as $dbs ) {
$dbConn = wfGetDB( DB_MASTER, array(), $dbs[0] );
$stype = $dbConn->addQuotes( $type );
@@ -100,4 +100,4 @@ class nextJobDB extends Maintenance {
}
$maintClass = "nextJobDb";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/nukeNS.php b/maintenance/nukeNS.php
index 21e921fe..c89fa94b 100644
--- a/maintenance/nukeNS.php
+++ b/maintenance/nukeNS.php
@@ -33,7 +33,7 @@
* based on nukePage by Rob Church
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class NukeNS extends Maintenance {
public function __construct() {
@@ -55,8 +55,8 @@ class NukeNS extends Maintenance {
$n_deleted = 0;
- foreach( $res as $row ) {
- //echo "$ns_name:".$row->page_title, "\n";
+ foreach ( $res as $row ) {
+ // echo "$ns_name:".$row->page_title, "\n";
$title = Title::makeTitle( $ns, $row->page_title );
$id = $title->getArticleID();
@@ -64,19 +64,19 @@ class NukeNS extends Maintenance {
$res2 = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_page = $id" );
$revs = array();
- foreach( $res2 as $row2 ) {
+ foreach ( $res2 as $row2 ) {
$revs[] = $row2->rev_id;
}
$count = count( $revs );
- //skip anything that looks modified (i.e. multiple revs)
+ // skip anything that looks modified (i.e. multiple revs)
if ( $count == 1 ) {
- #echo $title->getPrefixedText(), "\t", $count, "\n";
+ # echo $title->getPrefixedText(), "\t", $count, "\n";
$this->output( "delete: " . $title->getPrefixedText() . "\n" );
- //as much as I hate to cut & paste this, it's a little different, and
- //I already have the id & revs
- if( $delete ) {
+ // as much as I hate to cut & paste this, it's a little different, and
+ // I already have the id & revs
+ if ( $delete ) {
$dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" );
$dbw->commit();
// Delete revisions as appropriate
@@ -92,18 +92,18 @@ class NukeNS extends Maintenance {
$dbw->commit();
if ( $n_deleted > 0 ) {
- #update statistics - better to decrement existing count, or just count
- #the page table?
+ # update statistics - better to decrement existing count, or just count
+ # the page table?
$pages = $dbw->selectField( 'site_stats', 'ss_total_pages' );
$pages -= $n_deleted;
$dbw->update(
- 'site_stats',
- array( 'ss_total_pages' => $pages ),
+ 'site_stats',
+ array( 'ss_total_pages' => $pages ),
array( 'ss_row_id' => 1 ),
__METHOD__
);
}
-
+
if ( !$delete ) {
$this->output( "To update the database, run the script with the --delete option.\n" );
}
@@ -111,4 +111,4 @@ class NukeNS extends Maintenance {
}
$maintClass = "NukeNS";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/nukePage.php b/maintenance/nukePage.php
index 16ff2e40..4a073a5e 100644
--- a/maintenance/nukePage.php
+++ b/maintenance/nukePage.php
@@ -22,7 +22,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class NukePage extends Maintenance {
public function __construct() {
@@ -47,7 +47,7 @@ class NukePage extends Maintenance {
# Get page ID
$this->output( "Searching for \"$name\"..." );
$title = Title::newFromText( $name );
- if( $title ) {
+ if ( $title ) {
$id = $title->getArticleID();
$real = $title->getPrefixedText();
$isGoodArticle = $title->isContentPage();
@@ -56,14 +56,14 @@ class NukePage extends Maintenance {
# Get corresponding revisions
$this->output( "Searching for revisions..." );
$res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_page = $id" );
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$revs[] = $row->rev_id;
}
$count = count( $revs );
$this->output( "found $count.\n" );
# Delete the page record and associated recent changes entries
- if( $delete ) {
+ if ( $delete ) {
$this->output( "Deleting page record..." );
$dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" );
$this->output( "done.\n" );
@@ -75,7 +75,7 @@ class NukePage extends Maintenance {
$dbw->commit();
# Delete revisions as appropriate
- if( $delete && $count ) {
+ if ( $delete && $count ) {
$this->output( "Deleting revisions..." );
$this->deleteRevisions( $revs );
$this->output( "done.\n" );
@@ -105,9 +105,9 @@ class NukePage extends Maintenance {
$set = implode( ', ', $ids );
$dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" );
- $dbw->commit();
+ $dbw->commit();
}
}
$maintClass = "NukePage";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/testRunner.ora.sql b/maintenance/oracle/archives/patch-testrun.sql
index 6e3e1b7c..6e3e1b7c 100644
--- a/maintenance/testRunner.ora.sql
+++ b/maintenance/oracle/archives/patch-testrun.sql
diff --git a/maintenance/oracle/archives/patch_16_17_schema_changes.sql b/maintenance/oracle/archives/patch_16_17_schema_changes.sql
new file mode 100644
index 00000000..64c28481
--- /dev/null
+++ b/maintenance/oracle/archives/patch_16_17_schema_changes.sql
@@ -0,0 +1,98 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive MODIFY ar_user DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.archive MODIFY ar_deleted CHAR(1);
+CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
+
+ALTER TABLE &mw_prefix.page MODIFY page_is_redirect default '0';
+ALTER TABLE &mw_prefix.page MODIFY page_is_new default '0';
+ALTER TABLE &mw_prefix.page MODIFY page_latest default 0;
+ALTER TABLE &mw_prefix.page MODIFY page_len default 0;
+
+ALTER TABLE &mw_prefix.categorylinks MODIFY cl_sortkey VARCHAR2(230);
+ALTER TABLE &mw_prefix.categorylinks ADD cl_sortkey_prefix VARCHAR2(255) DEFAULT '' NOT NULL;
+ALTER TABLE &mw_prefix.categorylinks ADD cl_collation VARCHAR2(32) DEFAULT '' NOT NULL;
+ALTER TABLE &mw_prefix.categorylinks ADD cl_type VARCHAR2(6) DEFAULT 'page' NOT NULL;
+DROP INDEX &mw_prefix.categorylinks_i01;
+CREATE INDEX &mw_prefix.categorylinks_i01 ON &mw_prefix.categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
+CREATE INDEX &mw_prefix.categorylinks_i03 ON &mw_prefix.categorylinks (cl_collation);
+
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_deleted_user DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_size DEFAULT 0;
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_width DEFAULT 0;
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_height DEFAULT 0;
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_bits DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_user DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.filearchive MODIFY fa_deleted DEFAULT 0;
+
+ALTER TABLE &mw_prefix.image MODIFY img_size DEFAULT 0;
+ALTER TABLE &mw_prefix.image MODIFY img_width DEFAULT 0;
+ALTER TABLE &mw_prefix.image MODIFY img_height DEFAULT 0;
+ALTER TABLE &mw_prefix.image MODIFY img_bits DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.image MODIFY img_user DEFAULT 0 NOT NULL;
+
+ALTER TABLE &mw_prefix.interwiki ADD iw_api BLOB DEFAULT EMPTY_BLOB();
+ALTER TABLE &mw_prefix.interwiki MODIFY iw_api DEFAULT NULL NOT NULL;
+ALTER TABLE &mw_prefix.interwiki ADD iw_wikiid VARCHAR2(64);
+
+ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_user DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_by DEFAULT 0;
+
+CREATE TABLE &mw_prefix.iwlinks (
+ iwl_from NUMBER DEFAULT 0 NOT NULL,
+ iwl_prefix VARCHAR2(20) DEFAULT '' NOT NULL,
+ iwl_title VARCHAR2(255) DEFAULT '' NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui01 ON &mw_prefix.iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, iwl_title, iwl_from);
+
+ALTER TABLE &mw_prefix.logging MODIFY log_user DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.logging MODIFY log_deleted CHAR(1);
+
+CREATE TABLE &mw_prefix.module_deps (
+ md_module VARCHAR2(255) NOT NULL,
+ md_skin VARCHAR2(32) NOT NULL,
+ md_deps BLOB NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
+
+CREATE TABLE &mw_prefix.msg_resource_links (
+ mrl_resource VARCHAR2(255) NOT NULL,
+ mrl_message VARCHAR2(255) NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.msg_resource_links_u01 ON &mw_prefix.msg_resource_links (mrl_message, mrl_resource);
+
+CREATE TABLE &mw_prefix.msg_resource (
+ mr_resource VARCHAR2(255) NOT NULL,
+ mr_lang varchar2(32) NOT NULL,
+ mr_blob BLOB NOT NULL,
+ mr_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL
+) ;
+CREATE UNIQUE INDEX &mw_prefix.msg_resource_u01 ON &mw_prefix.msg_resource (mr_resource, mr_lang);
+
+ALTER TABLE &mw_prefix.oldimage MODIFY oi_name DEFAULT 0;
+ALTER TABLE &mw_prefix.oldimage MODIFY oi_size DEFAULT 0;
+ALTER TABLE &mw_prefix.oldimage MODIFY oi_width DEFAULT 0;
+ALTER TABLE &mw_prefix.oldimage MODIFY oi_height DEFAULT 0;
+ALTER TABLE &mw_prefix.oldimage MODIFY oi_bits DEFAULT 0;
+ALTER TABLE &mw_prefix.oldimage MODIFY oi_user DEFAULT 0 NOT NULL;
+
+ALTER TABLE &mw_prefix.querycache MODIFY qc_value DEFAULT 0;
+
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_user DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_cur_id DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_this_oldid DEFAULT 0;
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_last_oldid DEFAULT 0;
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_moved_to_ns DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_deleted CHAR(1);
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_logid DEFAULT 0;
+
+ALTER TABLE &mw_prefix.revision MODIFY rev_page NOT NULL;
+ALTER TABLE &mw_prefix.revision MODIFY rev_user DEFAULT 0;
+
+ALTER TABLE &mw_prefix.updatelog ADD ul_value BLOB;
+
+ALTER TABLE &mw_prefix.user_groups MODIFY ug_user DEFAULT 0 NOT NULL;
+
+ALTER TABLE &mw_prefix.user_newtalk MODIFY user_id DEFAULT 0;
+
diff --git a/maintenance/oracle/archives/patch_create_17_functions.sql b/maintenance/oracle/archives/patch_create_17_functions.sql
new file mode 100644
index 00000000..6c9c9542
--- /dev/null
+++ b/maintenance/oracle/archives/patch_create_17_functions.sql
@@ -0,0 +1,125 @@
+define mw_prefix='{$wgDBprefix}';
+
+/*$mw$*/
+CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname IN VARCHAR2,
+ p_oldprefix IN VARCHAR2,
+ p_newprefix IN VARCHAR2,
+ p_temporary IN BOOLEAN) IS
+ e_table_not_exist EXCEPTION;
+ PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
+ l_temp_ei_sql VARCHAR2(2000);
+BEGIN
+ BEGIN
+ EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
+ ' CASCADE CONSTRAINTS';
+ EXCEPTION
+ WHEN e_table_not_exist THEN
+ NULL;
+ END;
+ IF (p_temporary) THEN
+ EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
+ p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
+ p_tabname || ' WHERE ROWNUM = 0';
+ ELSE
+ EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
+ ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
+ ' WHERE ROWNUM = 0';
+ END IF;
+ FOR rc IN (SELECT column_name, data_default
+ FROM user_tab_columns
+ WHERE table_name = p_oldprefix || p_tabname
+ AND data_default IS NOT NULL) LOOP
+ EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
+ ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
+ SUBSTR(rc.data_default, 1, 2000);
+ END LOOP;
+ FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
+ constraint_name),
+ 32767,
+ 1),
+ USER || '"."' || p_oldprefix,
+ USER || '"."' || p_newprefix),
+ '"' || constraint_name || '"',
+ '"' || p_newprefix || constraint_name || '"') DDLVC2,
+ constraint_name
+ FROM user_constraints uc
+ WHERE table_name = p_oldprefix || p_tabname
+ AND constraint_type = 'P') LOOP
+ l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+ l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, 'PRIMARY KEY')+1)+1);
+ EXECUTE IMMEDIATE l_temp_ei_sql;
+ END LOOP;
+ IF (NOT p_temporary) THEN
+ FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
+ constraint_name),
+ 32767,
+ 1),
+ USER || '"."' || p_oldprefix,
+ USER || '"."' || p_newprefix) DDLVC2,
+ constraint_name
+ FROM user_constraints uc
+ WHERE table_name = p_oldprefix || p_tabname
+ AND constraint_type = 'R') LOOP
+ EXECUTE IMMEDIATE rc.ddlvc2;
+ END LOOP;
+ END IF;
+ FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
+ index_name),
+ 32767,
+ 1),
+ USER || '"."' || p_oldprefix,
+ USER || '"."' || p_newprefix),
+ '"' || index_name || '"',
+ '"' || p_newprefix || index_name || '"') DDLVC2,
+ index_name,
+ index_type
+ FROM user_indexes ui
+ WHERE table_name = p_oldprefix || p_tabname
+ AND index_type NOT IN ('LOB', 'DOMAIN')
+ AND NOT EXISTS
+ (SELECT NULL
+ FROM user_constraints
+ WHERE table_name = ui.table_name
+ AND constraint_name = ui.index_name)) LOOP
+ l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+ l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, '"' || USER || '"."' || p_newprefix || '"')+1)+1);
+ EXECUTE IMMEDIATE l_temp_ei_sql;
+ END LOOP;
+ FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
+ trigger_name),
+ 32767,
+ 1)),
+ USER || '"."' || p_oldprefix,
+ USER || '"."' || p_newprefix),
+ ' ON ' || p_oldprefix || p_tabname,
+ ' ON ' || p_newprefix || p_tabname) DDLVC2,
+ trigger_name
+ FROM user_triggers
+ WHERE table_name = p_oldprefix || p_tabname) LOOP
+ l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
+ dbms_output.put_line(l_temp_ei_sql);
+ EXECUTE IMMEDIATE l_temp_ei_sql;
+ END LOOP;
+END;
+/*$mw$*/
+
+CREATE OR REPLACE TYPE GET_OUTPUT_TYPE IS TABLE OF VARCHAR2(255);
+
+/*$mw$*/
+CREATE OR REPLACE FUNCTION GET_OUTPUT_LINES RETURN GET_OUTPUT_TYPE PIPELINED AS
+ v_line VARCHAR2(255);
+ v_status INTEGER := 0;
+BEGIN
+
+ LOOP
+ DBMS_OUTPUT.GET_LINE(v_line, v_status);
+ IF (v_status = 0) THEN RETURN; END IF;
+ PIPE ROW (v_line);
+ END LOOP;
+ RETURN;
+EXCEPTION
+ WHEN OTHERS THEN
+ RETURN;
+END;
+/*$mw$*/
+
diff --git a/maintenance/oracle/archives/patch_fk_rename_deferred.sql b/maintenance/oracle/archives/patch_fk_rename_deferred.sql
new file mode 100644
index 00000000..ce5be9af
--- /dev/null
+++ b/maintenance/oracle/archives/patch_fk_rename_deferred.sql
@@ -0,0 +1,41 @@
+define mw_prefix='{$wgDBprefix}';
+
+/*$mw$*/
+BEGIN
+-- drop all, recreate manual in case anyone was missing
+ FOR cc1 IN (SELECT uc.table_name,
+ uc.constraint_name
+ FROM user_constraints uc
+ WHERE uc.constraint_type = 'R') LOOP
+ EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.' || cc1.table_name ||
+ ' DROP CONSTRAINT ' || cc1.constraint_name;
+ END LOOP;
+END;
+/*$mw$*/
+
+ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.user_newtalk ADD CONSTRAINT &mw_prefix.user_newtalk_fk1 FOREIGN KEY (user_id) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk2 FOREIGN KEY (rev_user) REFERENCES &mw_prefix.mwuser(user_id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.pagelinks ADD CONSTRAINT &mw_prefix.pagelinks_fk1 FOREIGN KEY (pl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.templatelinks ADD CONSTRAINT &mw_prefix.templatelinks_fk1 FOREIGN KEY (tl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.imagelinks ADD CONSTRAINT &mw_prefix.imagelinks_fk1 FOREIGN KEY (il_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.categorylinks ADD CONSTRAINT &mw_prefix.categorylinks_fk1 FOREIGN KEY (cl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.langlinks ADD CONSTRAINT &mw_prefix.langlinks_fk1 FOREIGN KEY (ll_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+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;
+ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk2 FOREIGN KEY (ipb_by) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk1 FOREIGN KEY (img_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk1 FOREIGN KEY (oi_name) REFERENCES &mw_prefix.image(img_name) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (oi_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk2 FOREIGN KEY (fa_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1 FOREIGN KEY (rc_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.trackbacks ADD CONSTRAINT &mw_prefix.trackbacks_fk1 FOREIGN KEY (tb_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.redirect ADD CONSTRAINT &mw_prefix.redirect_fk1 FOREIGN KEY (rd_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
diff --git a/maintenance/oracle/archives/patch_namespace_defaults.sql b/maintenance/oracle/archives/patch_namespace_defaults.sql
new file mode 100644
index 00000000..24c95643
--- /dev/null
+++ b/maintenance/oracle/archives/patch_namespace_defaults.sql
@@ -0,0 +1,17 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page MODIFY page_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.pagelinks MODIFY pl_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.templatelinks MODIFY tl_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.recentchanges MODIFY rc_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.querycache MODIFY qc_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.logging MODIFY log_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.job MODIFY job_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.redirect MODIFY rd_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.protected_titles MODIFY pt_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
+ALTER TABLE &mw_prefix.archive MODIFY ar_namespace DEFAULT 0;
+
diff --git a/maintenance/ora/patch_seq_names_pre1.16.sql b/maintenance/oracle/patch_seq_names_pre1.16.sql
index 5346b141..5346b141 100644
--- a/maintenance/ora/patch_seq_names_pre1.16.sql
+++ b/maintenance/oracle/patch_seq_names_pre1.16.sql
diff --git a/maintenance/ora/tables.sql b/maintenance/oracle/tables.sql
index d2d1a21b..b8ecc2b9 100644
--- a/maintenance/ora/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -29,17 +29,19 @@ INSERT INTO &mw_prefix.mwuser
VALUES (user_user_id_seq.nextval,'Anonymous','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, '', current_timestamp, current_timestamp, 0);
CREATE TABLE &mw_prefix.user_groups (
- ug_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE,
+ ug_user NUMBER DEFAULT 0 NOT NULL,
ug_group VARCHAR2(16) NOT NULL
);
+ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.user_groups_u01 ON &mw_prefix.user_groups (ug_user,ug_group);
CREATE INDEX &mw_prefix.user_groups_i01 ON &mw_prefix.user_groups (ug_group);
CREATE TABLE &mw_prefix.user_newtalk (
- user_id NUMBER NOT NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE,
+ user_id NUMBER DEFAULT 0 NOT NULL,
user_ip VARCHAR2(40) NULL,
user_last_timestamp TIMESTAMP(6) WITH TIME ZONE
);
+ALTER TABLE &mw_prefix.user_newtalk ADD CONSTRAINT &mw_prefix.user_newtalk_fk1 FOREIGN KEY (user_id) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.user_newtalk_i01 ON &mw_prefix.user_newtalk (user_id);
CREATE INDEX &mw_prefix.user_newtalk_i02 ON &mw_prefix.user_newtalk (user_ip);
@@ -51,26 +53,29 @@ CREATE TABLE &mw_prefix.user_properties (
CREATE UNIQUE INDEX &mw_prefix.user_properties_u01 on &mw_prefix.user_properties (up_user,up_property);
CREATE INDEX &mw_prefix.user_properties_i01 on &mw_prefix.user_properties (up_property);
-
CREATE SEQUENCE page_page_id_seq;
CREATE TABLE &mw_prefix.page (
page_id NUMBER NOT NULL,
- page_namespace NUMBER NOT NULL,
+ page_namespace NUMBER DEFAULT 0 NOT NULL,
page_title VARCHAR2(255) NOT NULL,
page_restrictions VARCHAR2(255),
page_counter NUMBER DEFAULT 0 NOT NULL,
- page_is_redirect CHAR(1) DEFAULT 0 NOT NULL,
- page_is_new CHAR(1) DEFAULT 0 NOT NULL,
+ page_is_redirect CHAR(1) DEFAULT '0' NOT NULL,
+ page_is_new CHAR(1) DEFAULT '0' NOT NULL,
page_random NUMBER(15,14) NOT NULL,
page_touched TIMESTAMP(6) WITH TIME ZONE,
- page_latest NUMBER NOT NULL, -- FK?
- page_len NUMBER NOT NULL
+ page_latest NUMBER DEFAULT 0 NOT NULL, -- FK?
+ page_len NUMBER DEFAULT 0 NOT NULL
);
ALTER TABLE &mw_prefix.page ADD CONSTRAINT &mw_prefix.page_pk PRIMARY KEY (page_id);
CREATE UNIQUE INDEX &mw_prefix.page_u01 ON &mw_prefix.page (page_namespace,page_title);
CREATE INDEX &mw_prefix.page_i01 ON &mw_prefix.page (page_random);
CREATE INDEX &mw_prefix.page_i02 ON &mw_prefix.page (page_len);
+-- Create a dummy page to satisfy fk contraints especially with revisions
+INSERT INTO &mw_prefix.page
+ VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0);
+
/*$mw$*/
CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
FOR EACH ROW WHEN (new.page_random IS NULL)
@@ -82,10 +87,10 @@ END;
CREATE SEQUENCE revision_rev_id_seq;
CREATE TABLE &mw_prefix.revision (
rev_id NUMBER NOT NULL,
- rev_page NUMBER NULL REFERENCES &mw_prefix.page (page_id) ON DELETE CASCADE,
+ rev_page NUMBER NOT NULL,
rev_text_id NUMBER NULL,
rev_comment VARCHAR2(255),
- rev_user NUMBER NOT NULL REFERENCES &mw_prefix.mwuser(user_id),
+ rev_user NUMBER DEFAULT 0 NOT NULL,
rev_user_text VARCHAR2(255) NOT NULL,
rev_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
rev_minor_edit CHAR(1) DEFAULT '0' NOT NULL,
@@ -94,6 +99,8 @@ CREATE TABLE &mw_prefix.revision (
rev_parent_id NUMBER DEFAULT NULL
);
ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_pk PRIMARY KEY (rev_id);
+ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk2 FOREIGN KEY (rev_user) REFERENCES &mw_prefix.mwuser(user_id) DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.revision_u01 ON &mw_prefix.revision (rev_page, rev_id);
CREATE INDEX &mw_prefix.revision_i01 ON &mw_prefix.revision (rev_timestamp);
CREATE INDEX &mw_prefix.revision_i02 ON &mw_prefix.revision (rev_page,rev_timestamp);
@@ -109,59 +116,68 @@ CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id);
CREATE TABLE &mw_prefix.archive (
- ar_namespace NUMBER NOT NULL,
+ ar_namespace NUMBER DEFAULT 0 NOT NULL,
ar_title VARCHAR2(255) NOT NULL,
ar_text CLOB,
ar_comment VARCHAR2(255),
- ar_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ ar_user NUMBER DEFAULT 0 NOT NULL,
ar_user_text VARCHAR2(255) NOT NULL,
ar_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
ar_minor_edit CHAR(1) DEFAULT '0' NOT NULL,
ar_flags VARCHAR2(255),
ar_rev_id NUMBER,
ar_text_id NUMBER,
- ar_deleted NUMBER DEFAULT '0' NOT NULL,
+ ar_deleted CHAR(1) DEFAULT '0' NOT NULL,
ar_len NUMBER,
ar_page_id NUMBER,
ar_parent_id NUMBER
);
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
-
+CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
CREATE TABLE &mw_prefix.pagelinks (
- pl_from NUMBER NOT NULL REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
- pl_namespace NUMBER NOT NULL,
+ pl_from NUMBER NOT NULL,
+ pl_namespace NUMBER DEFAULT 0 NOT NULL,
pl_title VARCHAR2(255) NOT NULL
);
+ALTER TABLE &mw_prefix.pagelinks ADD CONSTRAINT &mw_prefix.pagelinks_fk1 FOREIGN KEY (pl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.pagelinks_u01 ON &mw_prefix.pagelinks (pl_from,pl_namespace,pl_title);
CREATE UNIQUE INDEX &mw_prefix.pagelinks_u02 ON &mw_prefix.pagelinks (pl_namespace,pl_title,pl_from);
CREATE TABLE &mw_prefix.templatelinks (
- tl_from NUMBER NOT NULL REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
- tl_namespace NUMBER NOT NULL,
+ tl_from NUMBER NOT NULL,
+ tl_namespace NUMBER DEFAULT 0 NOT NULL,
tl_title VARCHAR2(255) NOT NULL
);
+ALTER TABLE &mw_prefix.templatelinks ADD CONSTRAINT &mw_prefix.templatelinks_fk1 FOREIGN KEY (tl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.templatelinks_u01 ON &mw_prefix.templatelinks (tl_from,tl_namespace,tl_title);
CREATE UNIQUE INDEX &mw_prefix.templatelinks_u02 ON &mw_prefix.templatelinks (tl_namespace,tl_title,tl_from);
CREATE TABLE &mw_prefix.imagelinks (
- il_from NUMBER NOT NULL REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
+ il_from NUMBER NOT NULL,
il_to VARCHAR2(255) NOT NULL
);
+ALTER TABLE &mw_prefix.imagelinks ADD CONSTRAINT &mw_prefix.imagelinks_fk1 FOREIGN KEY (il_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.imagelinks_u01 ON &mw_prefix.imagelinks (il_from,il_to);
CREATE UNIQUE INDEX &mw_prefix.imagelinks_u02 ON &mw_prefix.imagelinks (il_to,il_from);
CREATE TABLE &mw_prefix.categorylinks (
- cl_from NUMBER NOT NULL REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
+ cl_from NUMBER NOT NULL,
cl_to VARCHAR2(255) NOT NULL,
- cl_sortkey VARCHAR2(255),
- cl_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL
+ cl_sortkey VARCHAR2(230),
+ cl_sortkey_prefix VARCHAR2(255) DEFAULT '' NOT NULL,
+ cl_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
+ cl_collation VARCHAR2(32) DEFAULT '' NOT NULL,
+ cl_type VARCHAR2(6) DEFAULT 'page' NOT NULL
);
+ALTER TABLE &mw_prefix.categorylinks ADD CONSTRAINT &mw_prefix.categorylinks_fk1 FOREIGN KEY (cl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.categorylinks_u01 ON &mw_prefix.categorylinks (cl_from,cl_to);
-CREATE INDEX &mw_prefix.categorylinks_i01 ON &mw_prefix.categorylinks (cl_to,cl_sortkey,cl_from);
+CREATE INDEX &mw_prefix.categorylinks_i01 ON &mw_prefix.categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
CREATE INDEX &mw_prefix.categorylinks_i02 ON &mw_prefix.categorylinks (cl_to,cl_timestamp);
+CREATE INDEX &mw_prefix.categorylinks_i03 ON &mw_prefix.categorylinks (cl_collation);
CREATE SEQUENCE category_cat_id_seq;
CREATE TABLE &mw_prefix.category (
@@ -177,10 +193,11 @@ CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages);
CREATE TABLE &mw_prefix.externallinks (
- el_from NUMBER NOT NULL REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
+ el_from NUMBER NOT NULL,
el_to VARCHAR2(2048) NOT NULL,
el_index VARCHAR2(2048) NOT NULL
);
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
@@ -193,13 +210,22 @@ ALTER TABLE &mw_prefix.external_user ADD CONSTRAINT &mw_prefix.external_user_pk
CREATE UNIQUE INDEX &mw_prefix.external_user_u01 ON &mw_prefix.external_user (eu_external_id);
CREATE TABLE &mw_prefix.langlinks (
- ll_from NUMBER NOT NULL REFERENCES &mw_prefix.page (page_id) ON DELETE CASCADE,
+ ll_from NUMBER NOT NULL,
ll_lang VARCHAR2(20),
ll_title VARCHAR2(255)
);
+ALTER TABLE &mw_prefix.langlinks ADD CONSTRAINT &mw_prefix.langlinks_fk1 FOREIGN KEY (ll_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.langlinks_u01 ON &mw_prefix.langlinks (ll_from, ll_lang);
CREATE INDEX &mw_prefix.langlinks_i01 ON &mw_prefix.langlinks (ll_lang, ll_title);
+CREATE TABLE &mw_prefix.iwlinks (
+ iwl_from NUMBER DEFAULT 0 NOT NULL,
+ iwl_prefix VARCHAR2(20) DEFAULT '' NOT NULL,
+ iwl_title VARCHAR2(255) DEFAULT '' NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui01 ON &mw_prefix.iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, iwl_title, iwl_from);
+
CREATE TABLE &mw_prefix.site_stats (
ss_row_id NUMBER NOT NULL ,
ss_total_views NUMBER DEFAULT 0,
@@ -221,8 +247,8 @@ CREATE SEQUENCE ipblocks_ipb_id_seq;
CREATE TABLE &mw_prefix.ipblocks (
ipb_id NUMBER NOT NULL,
ipb_address VARCHAR2(255) NULL,
- ipb_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
- ipb_by NUMBER NOT NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE,
+ ipb_user NUMBER DEFAULT 0 NOT NULL,
+ ipb_by NUMBER DEFAULT 0 NOT NULL,
ipb_by_text VARCHAR2(255) NOT NULL,
ipb_reason VARCHAR2(255) NOT NULL,
ipb_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
@@ -238,6 +264,8 @@ CREATE TABLE &mw_prefix.ipblocks (
ipb_allow_usertalk CHAR(1) DEFAULT '0' NOT 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;
+ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk2 FOREIGN KEY (ipb_by) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.ipblocks_u01 ON &mw_prefix.ipblocks (ipb_address, ipb_user, ipb_auto, ipb_anon_only);
CREATE INDEX &mw_prefix.ipblocks_i01 ON &mw_prefix.ipblocks (ipb_user);
CREATE INDEX &mw_prefix.ipblocks_i02 ON &mw_prefix.ipblocks (ipb_range_start, ipb_range_end);
@@ -246,21 +274,22 @@ CREATE INDEX &mw_prefix.ipblocks_i04 ON &mw_prefix.ipblocks (ipb_expiry);
CREATE TABLE &mw_prefix.image (
img_name VARCHAR2(255) NOT NULL,
- img_size NUMBER NOT NULL,
- img_width NUMBER NOT NULL,
- img_height NUMBER NOT NULL,
+ img_size NUMBER DEFAULT 0 NOT NULL,
+ img_width NUMBER DEFAULT 0 NOT NULL,
+ img_height NUMBER DEFAULT 0 NOT NULL,
img_metadata CLOB,
- img_bits NUMBER,
+ img_bits NUMBER DEFAULT 0 NOT NULL,
img_media_type VARCHAR2(32),
img_major_mime VARCHAR2(32) DEFAULT 'unknown',
img_minor_mime VARCHAR2(100) DEFAULT 'unknown',
img_description VARCHAR2(255),
- img_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ img_user NUMBER DEFAULT 0 NOT NULL,
img_user_text VARCHAR2(255) NOT NULL,
img_timestamp TIMESTAMP(6) WITH TIME ZONE,
- img_sha1 VARCHAR2(32)
+ img_sha1 VARCHAR2(32)
);
ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_pk PRIMARY KEY (img_name);
+ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk1 FOREIGN KEY (img_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.image_i01 ON &mw_prefix.image (img_user_text,img_timestamp);
CREATE INDEX &mw_prefix.image_i02 ON &mw_prefix.image (img_size);
CREATE INDEX &mw_prefix.image_i03 ON &mw_prefix.image (img_timestamp);
@@ -268,14 +297,14 @@ CREATE INDEX &mw_prefix.image_i04 ON &mw_prefix.image (img_sha1);
CREATE TABLE &mw_prefix.oldimage (
- oi_name VARCHAR2(255) NOT NULL REFERENCES &mw_prefix.image(img_name),
+ oi_name VARCHAR2(255) DEFAULT 0 NOT NULL,
oi_archive_name VARCHAR2(255),
- oi_size NUMBER NOT NULL,
- oi_width NUMBER NOT NULL,
- oi_height NUMBER NOT NULL,
- oi_bits NUMBER NOT NULL,
+ oi_size NUMBER DEFAULT 0 NOT NULL,
+ oi_width NUMBER DEFAULT 0 NOT NULL,
+ oi_height NUMBER DEFAULT 0 NOT NULL,
+ oi_bits NUMBER DEFAULT 0 NOT NULL,
oi_description VARCHAR2(255),
- oi_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ oi_user NUMBER DEFAULT 0 NOT NULL,
oi_user_text VARCHAR2(255) NOT NULL,
oi_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
oi_metadata CLOB,
@@ -285,6 +314,8 @@ CREATE TABLE &mw_prefix.oldimage (
oi_deleted NUMBER DEFAULT 0 NOT NULL,
oi_sha1 VARCHAR2(32)
);
+ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk1 FOREIGN KEY (oi_name) REFERENCES &mw_prefix.image(img_name) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (oi_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.oldimage_i01 ON &mw_prefix.oldimage (oi_user_text,oi_timestamp);
CREATE INDEX &mw_prefix.oldimage_i02 ON &mw_prefix.oldimage (oi_name,oi_timestamp);
CREATE INDEX &mw_prefix.oldimage_i03 ON &mw_prefix.oldimage (oi_name,oi_archive_name);
@@ -298,24 +329,26 @@ CREATE TABLE &mw_prefix.filearchive (
fa_archive_name VARCHAR2(255),
fa_storage_group VARCHAR2(16),
fa_storage_key VARCHAR2(64),
- fa_deleted_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ fa_deleted_user NUMBER DEFAULT 0 NOT NULL,
fa_deleted_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
fa_deleted_reason CLOB,
- fa_size NUMBER NOT NULL,
- fa_width NUMBER NOT NULL,
- fa_height NUMBER NOT NULL,
+ fa_size NUMBER DEFAULT 0 NOT NULL,
+ fa_width NUMBER DEFAULT 0 NOT NULL,
+ fa_height NUMBER DEFAULT 0 NOT NULL,
fa_metadata CLOB,
- fa_bits NUMBER,
+ fa_bits NUMBER DEFAULT 0 NOT NULL,
fa_media_type VARCHAR2(32) DEFAULT NULL,
fa_major_mime VARCHAR2(32) DEFAULT 'unknown',
fa_minor_mime VARCHAR2(100) DEFAULT 'unknown',
fa_description VARCHAR2(255),
- fa_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ fa_user NUMBER DEFAULT 0 NOT NULL,
fa_user_text VARCHAR2(255) NOT NULL,
fa_timestamp TIMESTAMP(6) WITH TIME ZONE,
- fa_deleted NUMBER DEFAULT '0' NOT NULL
+ fa_deleted NUMBER DEFAULT 0 NOT NULL
);
ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_pk PRIMARY KEY (fa_id);
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk2 FOREIGN KEY (fa_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.filearchive_i01 ON &mw_prefix.filearchive (fa_name, fa_timestamp);
CREATE INDEX &mw_prefix.filearchive_i02 ON &mw_prefix.filearchive (fa_storage_group, fa_storage_key);
CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_timestamp);
@@ -326,31 +359,33 @@ CREATE TABLE &mw_prefix.recentchanges (
rc_id NUMBER NOT NULL,
rc_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
rc_cur_time TIMESTAMP(6) WITH TIME ZONE NOT NULL,
- rc_user NUMBER NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ rc_user NUMBER DEFAULT 0 NOT NULL,
rc_user_text VARCHAR2(255) NOT NULL,
- rc_namespace NUMBER NOT NULL,
+ rc_namespace NUMBER DEFAULT 0 NOT NULL,
rc_title VARCHAR2(255) NOT NULL,
rc_comment VARCHAR2(255),
rc_minor CHAR(1) DEFAULT '0' NOT NULL,
rc_bot CHAR(1) DEFAULT '0' NOT NULL,
rc_new CHAR(1) DEFAULT '0' NOT NULL,
- rc_cur_id NUMBER NULL REFERENCES &mw_prefix.page(page_id) ON DELETE SET NULL,
- rc_this_oldid NUMBER NOT NULL,
- rc_last_oldid NUMBER NOT NULL,
+ rc_cur_id NUMBER DEFAULT 0 NOT NULL,
+ rc_this_oldid NUMBER DEFAULT 0 NOT NULL,
+ rc_last_oldid NUMBER DEFAULT 0 NOT NULL,
rc_type CHAR(1) DEFAULT '0' NOT NULL,
- rc_moved_to_ns NUMBER,
+ rc_moved_to_ns NUMBER DEFAULT 0 NOT NULL,
rc_moved_to_title VARCHAR2(255),
rc_patrolled CHAR(1) DEFAULT '0' NOT NULL,
rc_ip VARCHAR2(15),
rc_old_len NUMBER,
rc_new_len NUMBER,
- rc_deleted NUMBER DEFAULT '0' NOT NULL,
- rc_logid NUMBER DEFAULT '0' NOT NULL,
+ rc_deleted CHAR(1) DEFAULT '0' NOT NULL,
+ rc_logid NUMBER DEFAULT 0 NOT NULL,
rc_log_type VARCHAR2(255),
rc_log_action VARCHAR2(255),
rc_params CLOB
);
ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_pk PRIMARY KEY (rc_id);
+ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1 FOREIGN KEY (rc_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.recentchanges_i01 ON &mw_prefix.recentchanges (rc_timestamp);
CREATE INDEX &mw_prefix.recentchanges_i02 ON &mw_prefix.recentchanges (rc_namespace, rc_title);
CREATE INDEX &mw_prefix.recentchanges_i03 ON &mw_prefix.recentchanges (rc_cur_id);
@@ -360,11 +395,12 @@ CREATE INDEX &mw_prefix.recentchanges_i06 ON &mw_prefix.recentchanges (rc_namesp
CREATE INDEX &mw_prefix.recentchanges_i07 ON &mw_prefix.recentchanges (rc_user_text, rc_timestamp);
CREATE TABLE &mw_prefix.watchlist (
- wl_user NUMBER NOT NULL REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE,
+ wl_user NUMBER NOT NULL,
wl_namespace NUMBER DEFAULT 0 NOT NULL,
wl_title VARCHAR2(255) NOT NULL,
wl_notificationtimestamp TIMESTAMP(6) WITH TIME ZONE
);
+ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.watchlist_u01 ON &mw_prefix.watchlist (wl_user, wl_namespace, wl_title);
CREATE INDEX &mw_prefix.watchlist_i01 ON &mw_prefix.watchlist (wl_namespace, wl_title);
@@ -388,6 +424,8 @@ CREATE UNIQUE INDEX &mw_prefix.searchindex_u01 ON &mw_prefix.searchindex (si_pag
CREATE TABLE &mw_prefix.interwiki (
iw_prefix VARCHAR2(32) NOT NULL,
iw_url VARCHAR2(127) NOT NULL,
+ iw_api BLOB NOT NULL,
+ iw_wikiid VARCHAR2(64),
iw_local CHAR(1) NOT NULL,
iw_trans CHAR(1) DEFAULT '0' NOT NULL
);
@@ -395,8 +433,8 @@ CREATE UNIQUE INDEX &mw_prefix.interwiki_u01 ON &mw_prefix.interwiki (iw_prefix)
CREATE TABLE &mw_prefix.querycache (
qc_type VARCHAR2(32) NOT NULL,
- qc_value NUMBER NOT NULL,
- qc_namespace NUMBER NOT NULL,
+ qc_value NUMBER DEFAULT 0 NOT NULL,
+ qc_namespace NUMBER DEFAULT 0 NOT NULL,
qc_title VARCHAR2(255) NOT NULL
);
CREATE INDEX &mw_prefix.querycache_u01 ON &mw_prefix.querycache (qc_type,qc_value);
@@ -422,16 +460,17 @@ CREATE TABLE &mw_prefix.logging (
log_type VARCHAR2(10) NOT NULL,
log_action VARCHAR2(10) NOT NULL,
log_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
- log_user NUMBER REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL,
+ log_user NUMBER DEFAULT 0 NOT NULL,
log_user_text VARCHAR2(255),
- log_namespace NUMBER NOT NULL,
+ log_namespace NUMBER DEFAULT 0 NOT NULL,
log_title VARCHAR2(255) NOT NULL,
- log_page NUMBER,
+ log_page NUMBER,
log_comment VARCHAR2(255),
log_params CLOB,
- log_deleted NUMBER DEFAULT '0' NOT NULL
+ log_deleted CHAR(1) DEFAULT '0' NOT NULL
);
ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_pk PRIMARY KEY (log_id);
+ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.logging_i01 ON &mw_prefix.logging (log_type, log_timestamp);
CREATE INDEX &mw_prefix.logging_i02 ON &mw_prefix.logging (log_user, log_timestamp);
CREATE INDEX &mw_prefix.logging_i03 ON &mw_prefix.logging (log_namespace, log_title, log_timestamp);
@@ -448,20 +487,21 @@ CREATE INDEX &mw_prefix.log_search_i01 ON &mw_prefix.log_search (ls_log_id);
CREATE SEQUENCE trackbacks_tb_id_seq;
CREATE TABLE &mw_prefix.trackbacks (
tb_id NUMBER NOT NULL,
- tb_page NUMBER REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
+ tb_page NUMBER,
tb_title VARCHAR2(255) NOT NULL,
tb_url VARCHAR2(255) NOT NULL,
tb_ex CLOB,
tb_name VARCHAR2(255)
);
ALTER TABLE &mw_prefix.trackbacks ADD CONSTRAINT &mw_prefix.trackbacks_pk PRIMARY KEY (tb_id);
+ALTER TABLE &mw_prefix.trackbacks ADD CONSTRAINT &mw_prefix.trackbacks_fk1 FOREIGN KEY (tb_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.trackbacks_i01 ON &mw_prefix.trackbacks (tb_page);
CREATE SEQUENCE job_job_id_seq;
CREATE TABLE &mw_prefix.job (
job_id NUMBER NOT NULL,
job_cmd VARCHAR2(60) NOT NULL,
- job_namespace NUMBER NOT NULL,
+ job_namespace NUMBER DEFAULT 0 NOT NULL,
job_title VARCHAR2(255) NOT NULL,
job_params CLOB NOT NULL
);
@@ -475,12 +515,13 @@ CREATE TABLE &mw_prefix.querycache_info (
CREATE UNIQUE INDEX &mw_prefix.querycache_info_u01 ON &mw_prefix.querycache_info (qci_type);
CREATE TABLE &mw_prefix.redirect (
- rd_from NUMBER NOT NULL REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE,
- rd_namespace NUMBER NOT NULL,
+ rd_from NUMBER NOT NULL,
+ rd_namespace NUMBER DEFAULT 0 NOT NULL,
rd_title VARCHAR2(255) NOT NULL,
rd_interwiki VARCHAR2(32),
rd_fragment VARCHAR2(255)
);
+ALTER TABLE &mw_prefix.redirect ADD CONSTRAINT &mw_prefix.redirect_fk1 FOREIGN KEY (rd_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.redirect_i01 ON &mw_prefix.redirect (rd_namespace,rd_title,rd_from);
CREATE TABLE &mw_prefix.querycachetwo (
@@ -498,7 +539,7 @@ CREATE INDEX &mw_prefix.querycachetwo_i03 ON &mw_prefix.querycachetwo (qcc_type,
CREATE SEQUENCE page_restrictions_pr_id_seq;
CREATE TABLE &mw_prefix.page_restrictions (
pr_id NUMBER NOT NULL,
- pr_page NUMBER NULL REFERENCES &mw_prefix.page (page_id) ON DELETE CASCADE,
+ pr_page NUMBER NOT NULL,
pr_type VARCHAR2(255) NOT NULL,
pr_level VARCHAR2(255) NOT NULL,
pr_cascade NUMBER NOT NULL,
@@ -506,12 +547,13 @@ CREATE TABLE &mw_prefix.page_restrictions (
pr_expiry TIMESTAMP(6) WITH TIME ZONE NULL
);
ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_page,pr_type);
+ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.page_restrictions_i01 ON &mw_prefix.page_restrictions (pr_type,pr_level);
CREATE INDEX &mw_prefix.page_restrictions_i02 ON &mw_prefix.page_restrictions (pr_level);
CREATE INDEX &mw_prefix.page_restrictions_i03 ON &mw_prefix.page_restrictions (pr_cascade);
CREATE TABLE &mw_prefix.protected_titles (
- pt_namespace NUMBER NOT NULL,
+ pt_namespace NUMBER DEFAULT 0 NOT NULL,
pt_title VARCHAR2(255) NOT NULL,
pt_user NUMBER NOT NULL,
pt_reason VARCHAR2(255),
@@ -531,7 +573,8 @@ CREATE UNIQUE INDEX &mw_prefix.page_props_u01 ON &mw_prefix.page_props (pp_page,
CREATE TABLE &mw_prefix.updatelog (
- ul_key VARCHAR2(255) NOT NULL
+ ul_key VARCHAR2(255) NOT NULL,
+ ul_value BLOB
);
ALTER TABLE &mw_prefix.updatelog ADD CONSTRAINT &mw_prefix.updatelog_pk PRIMARY KEY (ul_key);
@@ -571,8 +614,8 @@ ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY
--);
--CREATE UNIQUE INDEX &mw_prefix.profiling_u01 ON &mw_prefix.profiling (pf_name, pf_server);
-CREATE INDEX si_title_idx ON &mw_prefix.searchindex(si_title) INDEXTYPE IS ctxsys.context;
-CREATE INDEX si_text_idx ON &mw_prefix.searchindex(si_text) INDEXTYPE IS ctxsys.context;
+CREATE INDEX &mw_prefix.si_title_idx ON &mw_prefix.searchindex(si_title) INDEXTYPE IS ctxsys.context;
+CREATE INDEX &mw_prefix.si_text_idx ON &mw_prefix.searchindex(si_text) INDEXTYPE IS ctxsys.context;
CREATE TABLE &mw_prefix.l10n_cache (
lc_lang varchar2(32) NOT NULL,
@@ -581,6 +624,27 @@ CREATE TABLE &mw_prefix.l10n_cache (
);
CREATE INDEX &mw_prefix.l10n_cache_u01 ON &mw_prefix.l10n_cache (lc_lang, lc_key);
+CREATE TABLE &mw_prefix.msg_resource (
+ mr_resource VARCHAR2(255) NOT NULL,
+ mr_lang varchar2(32) NOT NULL,
+ mr_blob BLOB NOT NULL,
+ mr_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL
+) ;
+CREATE UNIQUE INDEX &mw_prefix.msg_resource_u01 ON &mw_prefix.msg_resource (mr_resource, mr_lang);
+
+CREATE TABLE &mw_prefix.msg_resource_links (
+ mrl_resource VARCHAR2(255) NOT NULL,
+ mrl_message VARCHAR2(255) NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.msg_resource_links_u01 ON &mw_prefix.msg_resource_links (mrl_message, mrl_resource);
+
+CREATE TABLE &mw_prefix.module_deps (
+ md_module VARCHAR2(255) NOT NULL,
+ md_skin VARCHAR2(32) NOT NULL,
+ md_deps BLOB NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
+
-- do not prefix this table as it breaks parserTests
CREATE TABLE wiki_field_info_full (
table_name VARCHAR2(35) NOT NULL,
@@ -653,6 +717,7 @@ CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname IN VARCHAR2,
p_temporary IN BOOLEAN) IS
e_table_not_exist EXCEPTION;
PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
+ l_temp_ei_sql VARCHAR2(2000);
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
@@ -676,7 +741,7 @@ BEGIN
AND data_default IS NOT NULL) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
' MODIFY ' || rc.column_name || ' DEFAULT ' ||
- substr(rc.data_default, 1, 2000);
+ SUBSTR(rc.data_default, 1, 2000);
END LOOP;
FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
constraint_name),
@@ -690,11 +755,11 @@ BEGIN
FROM user_constraints uc
WHERE table_name = p_oldprefix || p_tabname
AND constraint_type = 'P') LOOP
- dbms_output.put_line(SUBSTR(rc.ddlvc2,
- 1,
- INSTR(rc.ddlvc2, 'PCTFREE') - 1));
- EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+ l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+ l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, 'PRIMARY KEY')+1)+1);
+ EXECUTE IMMEDIATE l_temp_ei_sql;
END LOOP;
+ IF (NOT p_temporary) THEN
FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
constraint_name),
32767,
@@ -707,6 +772,7 @@ BEGIN
AND constraint_type = 'R') LOOP
EXECUTE IMMEDIATE rc.ddlvc2;
END LOOP;
+ END IF;
FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
index_name),
32767,
@@ -715,16 +781,19 @@ BEGIN
USER || '"."' || p_newprefix),
'"' || index_name || '"',
'"' || p_newprefix || index_name || '"') DDLVC2,
- index_name
+ index_name,
+ index_type
FROM user_indexes ui
WHERE table_name = p_oldprefix || p_tabname
- AND index_type != 'LOB'
+ AND index_type NOT IN ('LOB', 'DOMAIN')
AND NOT EXISTS
(SELECT NULL
FROM user_constraints
WHERE table_name = ui.table_name
AND constraint_name = ui.index_name)) LOOP
- EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+ l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+ l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, '"' || USER || '"."' || p_newprefix || '"')+1)+1);
+ EXECUTE IMMEDIATE l_temp_ei_sql;
END LOOP;
FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
trigger_name),
@@ -737,18 +806,13 @@ BEGIN
trigger_name
FROM user_triggers
WHERE table_name = p_oldprefix || p_tabname) LOOP
- EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
+ l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
+ EXECUTE IMMEDIATE l_temp_ei_sql;
END LOOP;
END;
/*$mw$*/
/*$mw$*/
-BEGIN
- fill_wiki_info;
-END;
-/*$mw$*/
-
-/*$mw$*/
CREATE OR REPLACE FUNCTION BITOR (x IN NUMBER, y IN NUMBER) RETURN NUMBER AS
BEGIN
RETURN (x + y - BITAND(x, y));
@@ -762,9 +826,7 @@ BEGIN
END;
/*$mw$*/
-/*$mw$*/
CREATE OR REPLACE TYPE GET_OUTPUT_TYPE IS TABLE OF VARCHAR2(255);
-/*$mw$*/
/*$mw$*/
CREATE OR REPLACE FUNCTION GET_OUTPUT_LINES RETURN GET_OUTPUT_TYPE PIPELINED AS
diff --git a/maintenance/ora/user.sql b/maintenance/oracle/user.sql
index d54acf39..57688eae 100644
--- a/maintenance/ora/user.sql
+++ b/maintenance/oracle/user.sql
@@ -1,8 +1,8 @@
-- defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
define wiki_user='{$wgDBuser}';
define wiki_pass='{$wgDBpassword}';
-define def_ts='{$wgDBOracleDefTS}';
-define temp_ts='{$wgDBOracleTempTS}';
+define def_ts='{$_OracleDefTS}';
+define temp_ts='{$_OracleTempTS}';
create user &wiki_user. identified by &wiki_pass. default tablespace &def_ts. temporary tablespace &temp_ts. quota unlimited on &def_ts.;
grant connect, resource to &wiki_user.;
diff --git a/maintenance/orphans.php b/maintenance/orphans.php
index 67403e43..dbbddb9c 100644
--- a/maintenance/orphans.php
+++ b/maintenance/orphans.php
@@ -27,7 +27,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class Orphans extends Maintenance {
public function __construct() {
@@ -55,7 +55,7 @@ class Orphans extends Maintenance {
*/
private function lockTables( &$db, $extraTable = null ) {
$tbls = array( 'page', 'revision', 'redirect' );
- if( $extraTable )
+ if ( $extraTable )
$tbls[] = $extraTable;
$db->lockTables( array(), $tbls, __METHOD__, false );
}
@@ -68,23 +68,23 @@ class Orphans extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$page = $dbw->tableName( 'page' );
$revision = $dbw->tableName( 'revision' );
-
- if( $fix ) {
+
+ if ( $fix ) {
$this->lockTables( $dbw );
}
-
+
$this->output( "Checking for orphan revision table entries... (this may take a while on a large wiki)\n" );
$result = $dbw->query( "
SELECT *
FROM $revision LEFT OUTER JOIN $page ON rev_page=page_id
WHERE page_id IS NULL
- ");
+ " );
$orphans = $dbw->numRows( $result );
- if( $orphans > 0 ) {
+ if ( $orphans > 0 ) {
global $wgContLang;
$this->output( "$orphans orphan revisions...\n" );
$this->output( sprintf( "%10s %10s %14s %20s %s\n", 'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text', 'rev_comment' ) );
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$comment = ( $row->rev_comment == '' )
? ''
: '(' . $wgContLang->truncate( $row->rev_comment, 40 ) . ')';
@@ -94,24 +94,24 @@ class Orphans extends Maintenance {
$row->rev_timestamp,
$wgContLang->truncate( $row->rev_user_text, 17 ),
$comment ) );
- if( $fix ) {
+ if ( $fix ) {
$dbw->delete( 'revision', array( 'rev_id' => $row->rev_id ) );
}
}
- if( !$fix ) {
+ if ( !$fix ) {
$this->output( "Run again with --fix to remove these entries automatically.\n" );
}
} else {
$this->output( "No orphans! Yay!\n" );
}
-
- if( $fix ) {
- $dbw->unlockTables();
+
+ if ( $fix ) {
+ $dbw->unlockTables( __METHOD__ );
}
}
/**
- * @param $fix bool
+ * @param $fix bool
* @todo DON'T USE THIS YET! It will remove entries which have children,
* but which aren't properly attached (eg if page_latest is bogus
* but valid revisions do exist)
@@ -121,7 +121,7 @@ class Orphans extends Maintenance {
$page = $dbw->tableName( 'page' );
$revision = $dbw->tableName( 'revision' );
- if( $fix ) {
+ if ( $fix ) {
$this->lockTables( $dbw );
}
@@ -130,31 +130,30 @@ class Orphans extends Maintenance {
SELECT *
FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
WHERE rev_id IS NULL
- ");
+ " );
$widows = $dbw->numRows( $result );
- if( $widows > 0 ) {
- global $wgContLang;
+ if ( $widows > 0 ) {
$this->output( "$widows childless pages...\n" );
$this->output( sprintf( "%10s %11s %2s %s\n", 'page_id', 'page_latest', 'ns', 'page_title' ) );
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
printf( "%10d %11d %2d %s\n",
$row->page_id,
$row->page_latest,
$row->page_namespace,
$row->page_title );
- if( $fix ) {
+ if ( $fix ) {
$dbw->delete( 'page', array( 'page_id' => $row->page_id ) );
}
}
- if( !$fix ) {
+ if ( !$fix ) {
$this->output( "Run again with --fix to remove these entries automatically.\n" );
}
} else {
$this->output( "No childless pages! Yay!\n" );
}
-
- if( $fix ) {
- $dbw->unlockTables();
+
+ if ( $fix ) {
+ $dbw->unlockTables( __METHOD__ );
}
}
@@ -166,29 +165,27 @@ class Orphans extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$page = $dbw->tableName( 'page' );
$revision = $dbw->tableName( 'revision' );
- $text = $dbw->tableName( 'text' );
-
- if( $fix ) {
- $dbw->lockTables( $dbw, 'text' );
+
+ if ( $fix ) {
+ $dbw->lockTables( $dbw, 'text', __METHOD__ );
}
-
+
$this->output( "\nChecking for pages whose page_latest links are incorrect... (this may take a while on a large wiki)\n" );
$result = $dbw->query( "
SELECT *
FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
- ");
+ " );
$found = 0;
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$result2 = $dbw->query( "
SELECT MAX(rev_timestamp) as max_timestamp
FROM $revision
WHERE rev_page=$row->page_id
" );
$row2 = $dbw->fetchObject( $result2 );
- $dbw->freeResult( $result2 );
- if( $row2 ) {
- if( $row->rev_timestamp != $row2->max_timestamp ) {
- if( $found == 0 ) {
+ if ( $row2 ) {
+ if ( $row->rev_timestamp != $row2->max_timestamp ) {
+ if ( $found == 0 ) {
$this->output( sprintf( "%10s %10s %14s %14s\n",
'page_id', 'rev_id', 'timestamp', 'max timestamp' ) );
}
@@ -198,7 +195,7 @@ class Orphans extends Maintenance {
$row->page_latest,
$row->rev_timestamp,
$row2->max_timestamp ) );
- if( $fix ) {
+ if ( $fix ) {
# ...
$maxId = $dbw->selectField(
'revision',
@@ -217,21 +214,21 @@ class Orphans extends Maintenance {
$this->output( "wtf\n" );
}
}
-
- if( $found ) {
+
+ if ( $found ) {
$this->output( "Found $found pages with incorrect latest revision.\n" );
} else {
$this->output( "No pages with incorrect latest revision. Yay!\n" );
}
- if( !$fix && $found > 0 ) {
+ if ( !$fix && $found > 0 ) {
$this->output( "Run again with --fix to remove these entries automatically.\n" );
}
-
- if( $fix ) {
- $dbw->unlockTables();
+
+ if ( $fix ) {
+ $dbw->unlockTables( __METHOD__ );
}
}
}
$maintClass = "Orphans";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/ourusers.php b/maintenance/ourusers.php
index 3b5da447..499da5cf 100644
--- a/maintenance/ourusers.php
+++ b/maintenance/ourusers.php
@@ -32,12 +32,12 @@ $databases = array(
print "/*!40100 set old_passwords=1 */;\n";
print "/*!40100 set global old_passwords=1 */;\n";
-foreach( $hosts as $host ) {
+foreach ( $hosts as $host ) {
print "--\n-- $host\n--\n";
print "\n-- wikiuser\n\n";
print "GRANT REPLICATION CLIENT,PROCESS ON *.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
print "GRANT ALL PRIVILEGES ON `boardvote%`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
- foreach( $databases as $db ) {
+ foreach ( $databases as $db ) {
print "GRANT SELECT, INSERT, UPDATE, DELETE ON `$db`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
}
diff --git a/maintenance/parserTests.inc b/maintenance/parserTests.inc
deleted file mode 100644
index 6526da90..00000000
--- a/maintenance/parserTests.inc
+++ /dev/null
@@ -1,1719 +0,0 @@
-<?php
-# Copyright (C) 2004, 2010 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * @todo Make this more independent of the configuration (and if possible the database)
- * @todo document
- * @file
- * @ingroup Maintenance
- */
-
-/** */
-$options = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
-$optionsWithArgs = array( 'regex', 'seed', 'setversion' );
-
-if ( !defined( "NO_COMMAND_LINE" ) ) {
- require_once( dirname(__FILE__) . '/commandLine.inc' );
-}
-require_once( "$IP/maintenance/parserTestsParserHook.php" );
-require_once( "$IP/maintenance/parserTestsStaticParserHook.php" );
-require_once( "$IP/maintenance/parserTestsParserTime.php" );
-
-/**
- * @ingroup Maintenance
- */
-class ParserTest {
- /**
- * boolean $color whereas output should be colorized
- */
- private $color;
-
- /**
- * boolean $showOutput Show test output
- */
- private $showOutput;
-
- /**
- * boolean $useTemporaryTables Use temporary tables for the temporary database
- */
- private $useTemporaryTables = true;
-
- /**
- * boolean $databaseSetupDone True if the database has been set up
- */
- private $databaseSetupDone = false;
-
- /**
- * string $oldTablePrefix Original table prefix
- */
- private $oldTablePrefix;
-
- private $maxFuzzTestLength = 300;
- private $fuzzSeed = 0;
- private $memoryLimit = 50;
-
- /**
- * Sets terminal colorization and diff/quick modes depending on OS and
- * command-line options (--color and --quick).
- */
- public function ParserTest() {
- global $options;
-
- # Only colorize output if stdout is a terminal.
- $this->color = !wfIsWindows() && posix_isatty(1);
-
- if( isset( $options['color'] ) ) {
- switch( $options['color'] ) {
- case 'no':
- $this->color = false;
- break;
- case 'yes':
- default:
- $this->color = true;
- break;
- }
- }
- $this->term = $this->color
- ? new AnsiTermColorer()
- : new DummyTermColorer();
-
- $this->showDiffs = !isset( $options['quick'] );
- $this->showProgress = !isset( $options['quiet'] );
- $this->showFailure = !(
- isset( $options['quiet'] )
- && ( isset( $options['record'] )
- || isset( $options['compare'] ) ) ); // redundant output
-
- $this->showOutput = isset( $options['show-output'] );
-
-
- if (isset($options['regex'])) {
- if ( isset( $options['record'] ) ) {
- echo "Warning: --record cannot be used with --regex, disabling --record\n";
- unset( $options['record'] );
- }
- $this->regex = $options['regex'];
- } else {
- # Matches anything
- $this->regex = '';
- }
-
- if( isset( $options['record'] ) ) {
- $this->recorder = new DbTestRecorder( $this );
- } elseif( isset( $options['compare'] ) ) {
- $this->recorder = new DbTestPreviewer( $this );
- } elseif( isset( $options['upload'] ) ) {
- $this->recorder = new RemoteTestRecorder( $this );
- } elseif( class_exists( 'PHPUnitTestRecorder' ) ) {
- $this->recorder = new PHPUnitTestRecorder( $this );
- } else {
- $this->recorder = new TestRecorder( $this );
- }
- $this->keepUploads = isset( $options['keep-uploads'] );
-
- if ( isset( $options['seed'] ) ) {
- $this->fuzzSeed = intval( $options['seed'] ) - 1;
- }
-
- $this->runDisabled = isset( $options['run-disabled'] );
-
- $this->hooks = array();
- $this->functionHooks = array();
- }
-
- /**
- * Remove last character if it is a newline
- */
- public function chomp($s) {
- if (substr($s, -1) === "\n") {
- return substr($s, 0, -1);
- }
- else {
- return $s;
- }
- }
-
- /**
- * Run a fuzz test series
- * Draw input from a set of test files
- */
- function fuzzTest( $filenames ) {
- $dict = $this->getFuzzInput( $filenames );
- $dictSize = strlen( $dict );
- $logMaxLength = log( $this->maxFuzzTestLength );
- $this->setupDatabase();
- ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
-
- $numTotal = 0;
- $numSuccess = 0;
- $user = new User;
- $opts = ParserOptions::newFromUser( $user );
- $title = Title::makeTitle( NS_MAIN, 'Parser_test' );
-
- while ( true ) {
- // Generate test input
- mt_srand( ++$this->fuzzSeed );
- $totalLength = mt_rand( 1, $this->maxFuzzTestLength );
- $input = '';
- while ( strlen( $input ) < $totalLength ) {
- $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength;
- $hairLength = min( intval( exp( $logHairLength ) ), $dictSize );
- $offset = mt_rand( 0, $dictSize - $hairLength );
- $input .= substr( $dict, $offset, $hairLength );
- }
-
- $this->setupGlobals();
- $parser = $this->getParser();
- // Run the test
- try {
- $parser->parse( $input, $title, $opts );
- $fail = false;
- } catch ( Exception $exception ) {
- $fail = true;
- }
-
- if ( $fail ) {
- echo "Test failed with seed {$this->fuzzSeed}\n";
- echo "Input:\n";
- var_dump( $input );
- echo "\n\n";
- echo "$exception\n";
- } else {
- $numSuccess++;
- }
- $numTotal++;
- $this->teardownGlobals();
- $parser->__destruct();
-
- if ( $numTotal % 100 == 0 ) {
- $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
- echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
- if ( $usage > 90 ) {
- echo "Out of memory:\n";
- $memStats = $this->getMemoryBreakdown();
- foreach ( $memStats as $name => $usage ) {
- echo "$name: $usage\n";
- }
- $this->abort();
- }
- }
- }
- }
-
- /**
- * Get an input dictionary from a set of parser test files
- */
- function getFuzzInput( $filenames ) {
- $dict = '';
- foreach( $filenames as $filename ) {
- $contents = file_get_contents( $filename );
- preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
- foreach ( $matches[1] as $match ) {
- $dict .= $match . "\n";
- }
- }
- return $dict;
- }
-
- /**
- * Get a memory usage breakdown
- */
- function getMemoryBreakdown() {
- $memStats = array();
- foreach ( $GLOBALS as $name => $value ) {
- $memStats['$'.$name] = strlen( serialize( $value ) );
- }
- $classes = get_declared_classes();
- foreach ( $classes as $class ) {
- $rc = new ReflectionClass( $class );
- $props = $rc->getStaticProperties();
- $memStats[$class] = strlen( serialize( $props ) );
- $methods = $rc->getMethods();
- foreach ( $methods as $method ) {
- $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) );
- }
- }
- $functions = get_defined_functions();
- foreach ( $functions['user'] as $function ) {
- $rf = new ReflectionFunction( $function );
- $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) );
- }
- asort( $memStats );
- return $memStats;
- }
-
- function abort() {
- $this->abort();
- }
-
- /**
- * Run a series of tests listed in the given text files.
- * Each test consists of a brief description, wikitext input,
- * and the expected HTML output.
- *
- * Prints status updates on stdout and counts up the total
- * number and percentage of passed tests.
- *
- * @param array of strings $filenames
- * @return bool True if passed all tests, false if any tests failed.
- */
- public function runTestsFromFiles( $filenames ) {
- $this->recorder->start();
- $this->setupDatabase();
- $ok = true;
- foreach( $filenames as $filename ) {
- $tests = new TestFileIterator( $filename, $this );
- $ok = $this->runTests( $tests ) && $ok;
- }
- $this->teardownDatabase();
- $this->recorder->report();
- $this->recorder->end();
- return $ok;
- }
-
- function runTests($tests) {
- $ok = true;
- foreach($tests as $i => $t) {
- $result =
- $this->runTest($t['test'], $t['input'], $t['result'], $t['options'], $t['config']);
- $ok = $ok && $result;
- $this->recorder->record( $t['test'], $result );
- }
- if ( $this->showProgress ) {
- print "\n";
- }
- }
-
- /**
- * Get a Parser object
- */
- function getParser() {
- global $wgParserConf;
- $class = $wgParserConf['class'];
- $parser = new $class( $wgParserConf );
- foreach( $this->hooks as $tag => $callback ) {
- $parser->setHook( $tag, $callback );
- }
- foreach( $this->functionHooks as $tag => $bits ) {
- list( $callback, $flags ) = $bits;
- $parser->setFunctionHook( $tag, $callback, $flags );
- }
- wfRunHooks( 'ParserTestParser', array( &$parser ) );
- return $parser;
- }
-
- /**
- * Run a given wikitext input through a freshly-constructed wiki parser,
- * and compare the output against the expected results.
- * Prints status and explanatory messages to stdout.
- *
- * @param string $input Wikitext to try rendering
- * @param string $result Result to output
- * @return bool
- */
- public function runTest( $desc, $input, $result, $opts, $config ) {
- if( $this->showProgress ) {
- $this->showTesting( $desc );
- }
-
- $opts = $this->parseOptions( $opts );
- $this->setupGlobals($opts, $config);
-
- $user = new User();
- $options = ParserOptions::newFromUser( $user );
-
- $m = array();
- if (isset( $opts['title'] ) ) {
- $titleText = $opts['title'];
- }
- else {
- $titleText = 'Parser test';
- }
-
- $noxml = isset( $opts['noxml'] );
- $local = isset( $opts['local'] );
- $parser = $this->getParser();
- $title = Title::newFromText( $titleText );
-
- $matches = array();
- if( isset( $opts['pst'] ) ) {
- $out = $parser->preSaveTransform( $input, $title, $user, $options );
- } elseif( isset( $opts['msg'] ) ) {
- $out = $parser->transformMsg( $input, $options );
- } elseif( isset( $opts['section'] ) ) {
- $section = $opts['section'];
- $out = $parser->getSection( $input, $section );
- } elseif( isset( $opts['replace'] ) ) {
- $section = $opts['replace'][0];
- $replace = $opts['replace'][1];
- $out = $parser->replaceSection( $input, $section, $replace );
- } elseif( isset( $opts['comment'] ) ) {
- $linker = $user->getSkin();
- $out = $linker->formatComment( $input, $title, $local );
- } else {
- $output = $parser->parse( $input, $title, $options, true, true, 1337 );
- $out = $output->getText();
-
- if ( isset( $opts['showtitle'] ) ) {
- if($output->getTitleText()) $title = $output->getTitleText();
- $out = "$title\n$out";
- }
- if (isset( $opts['ill'] ) ) {
- $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
- } elseif( isset( $opts['cat'] ) ) {
- global $wgOut;
- $wgOut->addCategoryLinks($output->getCategories());
- $cats = $wgOut->getCategoryLinks();
- if ( isset( $cats['normal'] ) ) {
- $out = $this->tidy( implode( ' ', $cats['normal'] ) );
- } else {
- $out = '';
- }
- }
-
- $result = $this->tidy($result);
- }
-
-
- $this->teardownGlobals();
-
- if( $result === $out && ( $noxml === true || $this->wellFormed( $out ) ) ) {
- return $this->showSuccess( $desc );
- } else {
- return $this->showFailure( $desc, $result, $out );
- }
- }
-
-
- /**
- * Use a regex to find out the value of an option
- * @param $key name of option val to retrieve
- * @param $opts Options array to look in
- * @param $defaults Default value returned if not found
- */
- private static function getOptionValue( $key, $opts, $default ) {
- $key = strtolower( $key );
- if( isset( $opts[$key] ) ) {
- return $opts[$key];
- } else {
- return $default;
- }
- }
-
- private function parseOptions( $instring ) {
- $opts = array();
- $lines = explode( "\n", $instring );
- // foo
- // foo=bar
- // foo="bar baz"
- // foo=[[bar baz]]
- // foo=bar,"baz quux"
- $regex = '/\b
- ([\w-]+) # Key
- \b
- (?:\s*
- = # First sub-value
- \s*
- (
- "
- [^"]* # Quoted val
- "
- |
- \[\[
- [^]]* # Link target
- \]\]
- |
- [\w-]+ # Plain word
- )
- (?:\s*
- , # Sub-vals 1..N
- \s*
- (
- "[^"]*" # Quoted val
- |
- \[\[[^]]*\]\] # Link target
- |
- [\w-]+ # Plain word
- )
- )*
- )?
- /x';
-
- if( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
- foreach( $matches as $bits ) {
- $match = array_shift( $bits );
- $key = strtolower( array_shift( $bits ) );
- if( count( $bits ) == 0 ) {
- $opts[$key] = true;
- } elseif( count( $bits ) == 1 ) {
- $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
- } else {
- // Array!
- $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
- }
- }
- }
- return $opts;
- }
-
- private function cleanupOption( $opt ) {
- if( substr( $opt, 0, 1 ) == '"' ) {
- return substr( $opt, 1, -1 );
- }
- if( substr( $opt, 0, 2 ) == '[[' ) {
- return substr( $opt, 2, -2 );
- }
- return $opt;
- }
-
- /**
- * Set up the global variables for a consistent environment for each test.
- * Ideally this should replace the global configuration entirely.
- */
- private function setupGlobals($opts = '', $config = '') {
- global $wgDBtype;
- if( !isset( $this->uploadDir ) ) {
- $this->uploadDir = $this->setupUploadDir();
- }
-
- # Find out values for some special options.
- $lang =
- self::getOptionValue( 'language', $opts, 'en' );
- $variant =
- self::getOptionValue( 'variant', $opts, false );
- $maxtoclevel =
- self::getOptionValue( 'wgMaxTocLevel', $opts, 999 );
- $linkHolderBatchSize =
- self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
-
- $settings = array(
- 'wgServer' => 'http://localhost',
- 'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
- 'wgArticlePath' => '/wiki/$1',
- 'wgActionPaths' => array(),
- 'wgLocalFileRepo' => array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => $this->uploadDir,
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- ),
- 'wgEnableUploads' => true,
- 'wgStyleSheetPath' => '/skins',
- 'wgSitename' => 'MediaWiki',
- 'wgServerName' => 'Britney-Spears',
- 'wgLanguageCode' => $lang,
- 'wgContLanguageCode' => $lang,
- 'wgDBprefix' => $wgDBtype != 'oracle' ? 'parsertest_' : 'pt_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
- 'wgLang' => null,
- 'wgContLang' => null,
- 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
- 'wgMaxTocLevel' => $maxtoclevel,
- 'wgCapitalLinks' => true,
- 'wgNoFollowLinks' => true,
- 'wgNoFollowDomainExceptions' => array(),
- 'wgThumbnailScriptPath' => false,
- 'wgUseImageResize' => false,
- 'wgUseTeX' => isset( $opts['math'] ),
- 'wgMathDirectory' => $this->uploadDir . '/math',
- 'wgLocaltimezone' => 'UTC',
- 'wgAllowExternalImages' => true,
- 'wgUseTidy' => false,
- 'wgDefaultLanguageVariant' => $variant,
- 'wgVariantArticlePath' => false,
- 'wgGroupPermissions' => array( '*' => array(
- 'createaccount' => true,
- 'read' => true,
- 'edit' => true,
- 'createpage' => true,
- 'createtalk' => true,
- ) ),
- 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
- 'wgDefaultExternalStore' => array(),
- 'wgForeignFileRepos' => array(),
- 'wgLinkHolderBatchSize' => $linkHolderBatchSize,
- 'wgExperimentalHtmlIds' => false,
- 'wgExternalLinkTarget' => false,
- 'wgAlwaysUseTidy' => false,
- 'wgHtml5' => true,
- 'wgWellFormedXml' => true,
- 'wgAllowMicrodataAttributes' => true,
- );
-
- if ($config) {
- $configLines = explode( "\n", $config );
-
- foreach( $configLines as $line ) {
- list( $var, $value ) = explode( '=', $line, 2 );
-
- $settings[$var] = eval("return $value;" );
- }
- }
-
- $this->savedGlobals = array();
- foreach( $settings as $var => $val ) {
- if( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedGlobals[$var] = $GLOBALS[$var];
- }
- $GLOBALS[$var] = $val;
- }
- $langObj = Language::factory( $lang );
- $GLOBALS['wgLang'] = $langObj;
- $GLOBALS['wgContLang'] = $langObj;
- $GLOBALS['wgMemc'] = new FakeMemCachedClient;
- $GLOBALS['wgOut'] = new OutputPage;
-
- MagicWord::clearCache();
-
- global $wgUser;
- $wgUser = new User();
- }
-
- /**
- * List of temporary tables to create, without prefix.
- * Some of these probably aren't necessary.
- */
- private function listTables() {
- global $wgDBtype;
- $tables = array('user', 'page', 'page_restrictions',
- 'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks',
- 'categorylinks', 'templatelinks', 'externallinks', 'langlinks',
- 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage',
- 'recentchanges', 'watchlist', 'math', 'interwiki',
- 'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
- 'archive', 'user_groups', 'page_props', 'category'
- );
-
- if ($wgDBtype === 'mysql')
- array_push( $tables, 'searchindex' );
-
- // Allow extensions to add to the list of tables to duplicate;
- // may be necessary if they hook into page save or other code
- // which will require them while running tests.
- wfRunHooks( 'ParserTestTables', array( &$tables ) );
-
- return $tables;
- }
-
- /**
- * Set up a temporary set of wiki tables to work with for the tests.
- * Currently this will only be done once per run, and any changes to
- * the db will be visible to later tests in the run.
- */
- function setupDatabase() {
- global $wgDBprefix, $wgDBtype;
- if ( $this->databaseSetupDone ) {
- return;
- }
- if ( $wgDBprefix === 'parsertest_' || ($wgDBtype == 'oracle' && $wgDBprefix === 'pt_')) {
- throw new MWException( 'setupDatabase should be called before setupGlobals' );
- }
- $this->databaseSetupDone = true;
- $this->oldTablePrefix = $wgDBprefix;
-
- # CREATE TEMPORARY TABLE breaks if there is more than one server
- # FIXME: r40209 makes temporary tables break even with just one server
- # FIXME: (bug 15892); disabling the feature entirely as a temporary fix
- if ( true || wfGetLB()->getServerCount() != 1 ) {
- $this->useTemporaryTables = false;
- }
-
- $temporary = $this->useTemporaryTables || $wgDBtype == 'postgres';
-
- $db = wfGetDB( DB_MASTER );
- $tables = $this->listTables();
-
- foreach ( $tables as $tbl ) {
- # Clean up from previous aborted run. So that table escaping
- # works correctly across DB engines, we need to change the pre-
- # fix back and forth so tableName() works right.
- $this->changePrefix( $this->oldTablePrefix );
- $oldTableName = $db->tableName( $tbl );
- $this->changePrefix( $wgDBtype != 'oracle' ? 'parsertest_' : 'pt_' );
- $newTableName = $db->tableName( $tbl );
-
- if ( $db->tableExists( $tbl ) && $wgDBtype != 'postgres' && $wgDBtype != 'oracle' ) {
- $db->query( "DROP TABLE $newTableName" );
- }
- # Create new table
- $db->duplicateTableStructure( $oldTableName, $newTableName, $temporary );
- }
- if ($wgDBtype == 'oracle')
- $db->query('BEGIN FILL_WIKI_INFO; END;');
-
- $this->changePrefix( $wgDBtype != 'oracle' ? 'parsertest_' : 'pt_' );
-
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $db->insert( 'interwiki', array(
- array( 'iw_prefix' => 'wikipedia',
- 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'meatball',
- 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'zh',
- 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'es',
- 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'fr',
- 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'ru',
- 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
- 'iw_local' => 1 ),
- ) );
-
-
- if ($wgDBtype == 'oracle') {
- # Insert 0 and 1 user_ids to prevent FK violations
-
- #Anonymous user
- $db->insert( 'user', array(
- 'user_id' => 0,
- 'user_name' => 'Anonymous') );
-
- # Hack-on-Hack: Insert a test user to be able to insert an image
- $db->insert( 'user', array(
- 'user_id' => 1,
- 'user_name' => 'Tester') );
- }
-
- # Hack: Insert an image to work with
- $db->insert( 'image', array(
- 'img_name' => 'Foobar.jpg',
- 'img_size' => 12345,
- 'img_description' => 'Some lame file',
- 'img_user' => 1,
- 'img_user_text' => 'WikiSysop',
- 'img_timestamp' => $db->timestamp( '20010115123500' ),
- 'img_width' => 1941,
- 'img_height' => 220,
- 'img_bits' => 24,
- 'img_media_type' => MEDIATYPE_BITMAP,
- 'img_major_mime' => "image",
- 'img_minor_mime' => "jpeg",
- 'img_metadata' => serialize( array() ),
- ) );
-
- # This image will be blacklisted in [[MediaWiki:Bad image list]]
- $db->insert( 'image', array(
- 'img_name' => 'Bad.jpg',
- 'img_size' => 12345,
- 'img_description' => 'zomgnotcensored',
- 'img_user' => 1,
- 'img_user_text' => 'WikiSysop',
- 'img_timestamp' => $db->timestamp( '20010115123500' ),
- 'img_width' => 320,
- 'img_height' => 240,
- 'img_bits' => 24,
- 'img_media_type' => MEDIATYPE_BITMAP,
- 'img_major_mime' => "image",
- 'img_minor_mime' => "jpeg",
- 'img_metadata' => serialize( array() ),
- ) );
-
- # Update certain things in site_stats
- $db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
-
- # Reinitialise the LocalisationCache to match the database state
- Language::getLocalisationCache()->unloadAll();
-
- # Make a new message cache
- global $wgMessageCache, $wgMemc;
- $wgMessageCache = new MessageCache( $wgMemc, true, 3600, '' );
- }
-
- /**
- * Change the table prefix on all open DB connections/
- */
- protected function changePrefix( $prefix ) {
- global $wgDBprefix;
- wfGetLBFactory()->forEachLB( array( $this, 'changeLBPrefix' ), array( $prefix ) );
- $wgDBprefix = $prefix;
- }
-
- public function changeLBPrefix( $lb, $prefix ) {
- $lb->forEachOpenConnection( array( $this, 'changeDBPrefix' ), array( $prefix ) );
- }
-
- public function changeDBPrefix( $db, $prefix ) {
- $db->tablePrefix( $prefix );
- }
-
- private function teardownDatabase() {
- global $wgDBtype;
- if ( !$this->databaseSetupDone ) {
- return;
- }
- $this->changePrefix( $this->oldTablePrefix );
- $this->databaseSetupDone = false;
- if ( $this->useTemporaryTables ) {
- # Don't need to do anything
- return;
- }
-
- /*
- $tables = $this->listTables();
- $db = wfGetDB( DB_MASTER );
- foreach ( $tables as $table ) {
- $sql = $wgDBtype == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
- $db->query( $sql );
- }
- if ($wgDBtype == 'oracle')
- $db->query('BEGIN FILL_WIKI_INFO; END;');
- */
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- * @return string The directory
- */
- private function setupUploadDir() {
- global $IP;
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- wfDebug( "Creating upload directory $dir\n" );
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
- wfMkdirParents( $dir . '/3/3a' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
-
- wfMkdirParents( $dir . '/0/09' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
- return $dir;
- }
-
- /**
- * Restore default values and perform any necessary clean-up
- * after each test runs.
- */
- private function teardownGlobals() {
- RepoGroup::destroySingleton();
- LinkCache::singleton()->clear();
- foreach( $this->savedGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
- if( isset( $this->uploadDir ) ) {
- $this->teardownUploadDir( $this->uploadDir );
- unset( $this->uploadDir );
- }
- }
-
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploadDir( $dir ) {
- if ( $this->keepUploads ) {
- return;
- }
-
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
-
- "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
- )
- );
-
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
- "$dir/thumb",
- "$dir/math/f/a/5",
- "$dir/math/f/a",
- "$dir/math/f",
- "$dir/math",
- "$dir",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- * @param array $files full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach( $files as $file ) {
- if( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
-
- /**
- * Delete the specified directories, if they exist. Must be empty.
- * @param array $dirs full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach( $dirs as $dir ) {
- if( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * "Running test $desc..."
- */
- protected function showTesting( $desc ) {
- print "Running test $desc... ";
- }
-
- /**
- * Print a happy success message.
- *
- * @param string $desc The test name
- * @return bool
- */
- protected function showSuccess( $desc ) {
- if( $this->showProgress ) {
- print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
- }
- return true;
- }
-
- /**
- * Print a failure message and provide some explanatory output
- * about what went wrong if so configured.
- *
- * @param string $desc The test name
- * @param string $result Expected HTML output
- * @param string $html Actual HTML output
- * @return bool
- */
- protected function showFailure( $desc, $result, $html ) {
- if( $this->showFailure ) {
- if( !$this->showProgress ) {
- # In quiet mode we didn't show the 'Testing' message before the
- # test, in case it succeeded. Show it now:
- $this->showTesting( $desc );
- }
- print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
- if ( $this->showOutput ) {
- print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
- }
- if( $this->showDiffs ) {
- print $this->quickDiff( $result, $html );
- if( !$this->wellFormed( $html ) ) {
- print "XML error: $this->mXmlError\n";
- }
- }
- }
- return false;
- }
-
- /**
- * Run given strings through a diff and return the (colorized) output.
- * Requires writable /tmp directory and a 'diff' command in the PATH.
- *
- * @param string $input
- * @param string $output
- * @param string $inFileTail Tailing for the input file name
- * @param string $outFileTail Tailing for the output file name
- * @return string
- */
- protected function quickDiff( $input, $output, $inFileTail='expected', $outFileTail='actual' ) {
- $prefix = wfTempDir() . "/mwParser-" . mt_rand();
-
- $infile = "$prefix-$inFileTail";
- $this->dumpToFile( $input, $infile );
-
- $outfile = "$prefix-$outFileTail";
- $this->dumpToFile( $output, $outfile );
-
- $diff = `diff -au $infile $outfile`;
- unlink( $infile );
- unlink( $outfile );
-
- return $this->colorDiff( $diff );
- }
-
- /**
- * Write the given string to a file, adding a final newline.
- *
- * @param string $data
- * @param string $filename
- */
- private function dumpToFile( $data, $filename ) {
- $file = fopen( $filename, "wt" );
- fwrite( $file, $data . "\n" );
- fclose( $file );
- }
-
- /**
- * Colorize unified diff output if set for ANSI color output.
- * Subtractions are colored blue, additions red.
- *
- * @param string $text
- * @return string
- */
- protected function colorDiff( $text ) {
- return preg_replace(
- array( '/^(-.*)$/m', '/^(\+.*)$/m' ),
- array( $this->term->color( 34 ) . '$1' . $this->term->reset(),
- $this->term->color( 31 ) . '$1' . $this->term->reset() ),
- $text );
- }
-
- /**
- * Show "Reading tests from ..."
- *
- * @param String $path
- */
- public function showRunFile( $path ){
- print $this->term->color( 1 ) .
- "Reading tests from \"$path\"..." .
- $this->term->reset() .
- "\n";
- }
-
- /**
- * Insert a temporary test article
- * @param string $name the title, including any prefix
- * @param string $text the article text
- * @param int $line the input line number, for reporting errors
- */
- public function addArticle($name, $text, $line) {
- $this->setupGlobals();
- $title = Title::newFromText( $name );
- if ( is_null($title) ) {
- wfDie( "invalid title at line $line\n" );
- }
-
- $aid = $title->getArticleID( GAID_FOR_UPDATE );
- if ($aid != 0) {
- wfDie( "duplicate article '$name' at line $line\n" );
- }
-
- $art = new Article($title);
- $art->insertNewArticle($text, '', false, false );
-
- $this->teardownGlobals();
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * die a painful dead to warn the others.
- * @param string $name
- */
- public function requireHook( $name ) {
- global $wgParser;
- $wgParser->firstCallInit( ); //make sure hooks are loaded.
- if( isset( $wgParser->mTagHooks[$name] ) ) {
- $this->hooks[$name] = $wgParser->mTagHooks[$name];
- } else {
- wfDie( "This test suite requires the '$name' hook extension.\n" );
- }
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * die a painful dead to warn the others.
- * @param string $name
- */
- private function requireFunctionHook( $name ) {
- global $wgParser;
- $wgParser->firstCallInit( ); //make sure hooks are loaded.
- if( isset( $wgParser->mFunctionHooks[$name] ) ) {
- $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name];
- } else {
- wfDie( "This test suite requires the '$name' function hook extension.\n" );
- }
- }
-
- /*
- * Run the "tidy" command on text if the $wgUseTidy
- * global is true
- *
- * @param string $text the text to tidy
- * @return string
- * @static
- */
- private function tidy( $text ) {
- global $wgUseTidy;
- if ($wgUseTidy) {
- $text = Parser::tidy($text);
- }
- return $text;
- }
-
- private function wellFormed( $text ) {
- $html =
- Sanitizer::hackDocType() .
- '<html>' .
- $text .
- '</html>';
-
- $parser = xml_parser_create( "UTF-8" );
-
- # case folding violates XML standard, turn it off
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
- if( !xml_parse( $parser, $html, true ) ) {
- $err = xml_error_string( xml_get_error_code( $parser ) );
- $position = xml_get_current_byte_index( $parser );
- $fragment = $this->extractFragment( $html, $position );
- $this->mXmlError = "$err at byte $position:\n$fragment";
- xml_parser_free( $parser );
- return false;
- }
- xml_parser_free( $parser );
- return true;
- }
-
- private function extractFragment( $text, $position ) {
- $start = max( 0, $position - 10 );
- $before = $position - $start;
- $fragment = '...' .
- $this->term->color( 34 ) .
- substr( $text, $start, $before ) .
- $this->term->color( 0 ) .
- $this->term->color( 31 ) .
- $this->term->color( 1 ) .
- substr( $text, $position, 1 ) .
- $this->term->color( 0 ) .
- $this->term->color( 34 ) .
- substr( $text, $position + 1, 9 ) .
- $this->term->color( 0 ) .
- '...';
- $display = str_replace( "\n", ' ', $fragment );
- $caret = ' ' .
- str_repeat( ' ', $before ) .
- $this->term->color( 31 ) .
- '^' .
- $this->term->color( 0 );
- return "$display\n$caret";
- }
-}
-
-class AnsiTermColorer {
- function __construct() {
- }
-
- /**
- * Return ANSI terminal escape code for changing text attribs/color
- *
- * @param string $color Semicolon-separated list of attribute/color codes
- * @return string
- */
- public function color( $color ) {
- global $wgCommandLineDarkBg;
- $light = $wgCommandLineDarkBg ? "1;" : "0;";
- return "\x1b[{$light}{$color}m";
- }
-
- /**
- * Return ANSI terminal escape code for restoring default text attributes
- *
- * @return string
- */
- public function reset() {
- return $this->color( 0 );
- }
-}
-
-/* A colour-less terminal */
-class DummyTermColorer {
- public function color( $color ) {
- return '';
- }
-
- public function reset() {
- return '';
- }
-}
-
-class TestRecorder {
- var $parent;
- var $term;
-
- function __construct( $parent ) {
- $this->parent = $parent;
- $this->term = $parent->term;
- }
-
- function start() {
- $this->total = 0;
- $this->success = 0;
- }
-
- function record( $test, $result ) {
- $this->total++;
- $this->success += ($result ? 1 : 0);
- }
-
- function end() {
- // dummy
- }
-
- function report() {
- if( $this->total > 0 ) {
- $this->reportPercentage( $this->success, $this->total );
- } else {
- wfDie( "No tests found.\n" );
- }
- }
-
- function reportPercentage( $success, $total ) {
- $ratio = wfPercent( 100 * $success / $total );
- print $this->term->color( 1 ) . "Passed $success of $total tests ($ratio)... ";
- if( $success == $total ) {
- print $this->term->color( 32 ) . "ALL TESTS PASSED!";
- } else {
- $failed = $total - $success ;
- print $this->term->color( 31 ) . "$failed tests failed!";
- }
- print $this->term->reset() . "\n";
- return ($success == $total);
- }
-}
-
-class DbTestPreviewer extends TestRecorder {
- protected $lb; ///< Database load balancer
- protected $db; ///< Database connection to the main DB
- protected $curRun; ///< run ID number for the current run
- protected $prevRun; ///< run ID number for the previous run, if any
- protected $results; ///< Result array
-
- /**
- * This should be called before the table prefix is changed
- */
- function __construct( $parent ) {
- parent::__construct( $parent );
- $this->lb = wfGetLBFactory()->newMainLB();
- // This connection will have the wiki's table prefix, not parsertest_
- $this->db = $this->lb->getConnection( DB_MASTER );
- }
-
- /**
- * Set up result recording; insert a record for the run with the date
- * and all that fun stuff
- */
- function start() {
- global $wgDBtype;
- parent::start();
-
- if( ! $this->db->tableExists( 'testrun' )
- or ! $this->db->tableExists( 'testitem' ) )
- {
- print "WARNING> `testrun` table not found in database.\n";
- $this->prevRun = false;
- } else {
- // We'll make comparisons against the previous run later...
- $this->prevRun = $this->db->selectField( 'testrun', 'MAX(tr_id)' );
- }
- $this->results = array();
- }
-
- function record( $test, $result ) {
- parent::record( $test, $result );
- $this->results[$test] = $result;
- }
-
- function report() {
- if( $this->prevRun ) {
- // f = fail, p = pass, n = nonexistent
- // codes show before then after
- $table = array(
- 'fp' => 'previously failing test(s) now PASSING! :)',
- 'pn' => 'previously PASSING test(s) removed o_O',
- 'np' => 'new PASSING test(s) :)',
-
- 'pf' => 'previously passing test(s) now FAILING! :(',
- 'fn' => 'previously FAILING test(s) removed O_o',
- 'nf' => 'new FAILING test(s) :(',
- 'ff' => 'still FAILING test(s) :(',
- );
-
- $prevResults = array();
-
- $res = $this->db->select( 'testitem', array( 'ti_name', 'ti_success' ),
- array( 'ti_run' => $this->prevRun ), __METHOD__ );
- foreach ( $res as $row ) {
- if ( !$this->parent->regex
- || preg_match( "/{$this->parent->regex}/i", $row->ti_name ) )
- {
- $prevResults[$row->ti_name] = $row->ti_success;
- }
- }
-
- $combined = array_keys( $this->results + $prevResults );
-
- # Determine breakdown by change type
- $breakdown = array();
- foreach ( $combined as $test ) {
- if ( !isset( $prevResults[$test] ) ) {
- $before = 'n';
- } elseif ( $prevResults[$test] == 1 ) {
- $before = 'p';
- } else /* if ( $prevResults[$test] == 0 )*/ {
- $before = 'f';
- }
- if ( !isset( $this->results[$test] ) ) {
- $after = 'n';
- } elseif ( $this->results[$test] == 1 ) {
- $after = 'p';
- } else /*if ( $this->results[$test] == 0 ) */ {
- $after = 'f';
- }
- $code = $before . $after;
- if ( isset( $table[$code] ) ) {
- $breakdown[$code][$test] = $this->getTestStatusInfo( $test, $after );
- }
- }
-
- # Write out results
- foreach ( $table as $code => $label ) {
- if( !empty( $breakdown[$code] ) ) {
- $count = count($breakdown[$code]);
- printf( "\n%4d %s\n", $count, $label );
- foreach ($breakdown[$code] as $differing_test_name => $statusInfo) {
- print " * $differing_test_name [$statusInfo]\n";
- }
- }
- }
- } else {
- print "No previous test runs to compare against.\n";
- }
- print "\n";
- parent::report();
- }
-
- /**
- ** Returns a string giving information about when a test last had a status change.
- ** Could help to track down when regressions were introduced, as distinct from tests
- ** which have never passed (which are more change requests than regressions).
- */
- private function getTestStatusInfo($testname, $after) {
-
- // If we're looking at a test that has just been removed, then say when it first appeared.
- if ( $after == 'n' ) {
- $changedRun = $this->db->selectField ( 'testitem',
- 'MIN(ti_run)',
- array( 'ti_name' => $testname ),
- __METHOD__ );
- $appear = $this->db->selectRow ( 'testrun',
- array( 'tr_date', 'tr_mw_version' ),
- array( 'tr_id' => $changedRun ),
- __METHOD__ );
- return "First recorded appearance: "
- . date( "d-M-Y H:i:s", strtotime ( $appear->tr_date ) )
- . ", " . $appear->tr_mw_version;
- }
-
- // Otherwise, this test has previous recorded results.
- // See when this test last had a different result to what we're seeing now.
- $conds = array(
- 'ti_name' => $testname,
- 'ti_success' => ($after == 'f' ? "1" : "0") );
- if ( $this->curRun ) {
- $conds[] = "ti_run != " . $this->db->addQuotes ( $this->curRun );
- }
-
- $changedRun = $this->db->selectField ( 'testitem', 'MAX(ti_run)', $conds, __METHOD__ );
-
- // If no record of ever having had a different result.
- if ( is_null ( $changedRun ) ) {
- if ($after == "f") {
- return "Has never passed";
- } else {
- return "Has never failed";
- }
- }
-
- // Otherwise, we're looking at a test whose status has changed.
- // (i.e. it used to work, but now doesn't; or used to fail, but is now fixed.)
- // In this situation, give as much info as we can as to when it changed status.
- $pre = $this->db->selectRow ( 'testrun',
- array( 'tr_date', 'tr_mw_version' ),
- array( 'tr_id' => $changedRun ),
- __METHOD__ );
- $post = $this->db->selectRow ( 'testrun',
- array( 'tr_date', 'tr_mw_version' ),
- array( "tr_id > " . $this->db->addQuotes ( $changedRun) ),
- __METHOD__,
- array( "LIMIT" => 1, "ORDER BY" => 'tr_id' )
- );
-
- if ( $post ) {
- $postDate = date( "d-M-Y H:i:s", strtotime ( $post->tr_date ) ) . ", {$post->tr_mw_version}";
- } else {
- $postDate = 'now';
- }
- return ( $after == "f" ? "Introduced" : "Fixed" ) . " between "
- . date( "d-M-Y H:i:s", strtotime ( $pre->tr_date ) ) . ", " . $pre->tr_mw_version
- . " and $postDate";
-
- }
-
- /**
- * Commit transaction and clean up for result recording
- */
- function end() {
- $this->lb->commitMasterChanges();
- $this->lb->closeAll();
- parent::end();
- }
-
-}
-
-class DbTestRecorder extends DbTestPreviewer {
- /**
- * Set up result recording; insert a record for the run with the date
- * and all that fun stuff
- */
- function start() {
- global $wgDBtype, $options;
- $this->db->begin();
-
- if( ! $this->db->tableExists( 'testrun' )
- or ! $this->db->tableExists( 'testitem' ) )
- {
- print "WARNING> `testrun` table not found in database. Trying to create table.\n";
- if ($wgDBtype === 'postgres')
- $this->db->sourceFile( dirname(__FILE__) . '/testRunner.postgres.sql' );
- elseif ($wgDBtype === 'oracle')
- $this->db->sourceFile( dirname(__FILE__) . '/testRunner.ora.sql' );
- else
- $this->db->sourceFile( dirname(__FILE__) . '/testRunner.sql' );
- echo "OK, resuming.\n";
- }
-
- parent::start();
-
- $this->db->insert( 'testrun',
- array(
- 'tr_date' => $this->db->timestamp(),
- 'tr_mw_version' => isset( $options['setversion'] ) ?
- $options['setversion'] : SpecialVersion::getVersion(),
- 'tr_php_version' => phpversion(),
- 'tr_db_version' => $this->db->getServerVersion(),
- 'tr_uname' => php_uname()
- ),
- __METHOD__ );
- if ($wgDBtype === 'postgres')
- $this->curRun = $this->db->currentSequenceValue('testrun_id_seq');
- else
- $this->curRun = $this->db->insertId();
- }
-
- /**
- * Record an individual test item's success or failure to the db
- * @param string $test
- * @param bool $result
- */
- function record( $test, $result ) {
- parent::record( $test, $result );
- $this->db->insert( 'testitem',
- array(
- 'ti_run' => $this->curRun,
- 'ti_name' => $test,
- 'ti_success' => $result ? 1 : 0,
- ),
- __METHOD__ );
- }
-}
-
-class RemoteTestRecorder extends TestRecorder {
- function start() {
- parent::start();
- $this->results = array();
- $this->ping( 'running' );
- }
-
- function record( $test, $result ) {
- parent::record( $test, $result );
- $this->results[$test] = (bool)$result;
- }
-
- function end() {
- $this->ping( 'complete', $this->results );
- parent::end();
- }
-
- /**
- * Inform a CodeReview instance that we've started or completed a test run...
- * @param $remote array: info on remote target
- * @param $status string: "running" - tell it we've started
- * "complete" - provide test results array
- * "abort" - something went horribly awry
- * @param $data array of test name => true/false
- */
- function ping( $status, $results=false ) {
- global $wgParserTestRemote, $IP;
-
- $remote = $wgParserTestRemote;
- $revId = SpecialVersion::getSvnRevision( $IP );
- $jsonResults = json_encode( $results );
-
- if( !$remote ) {
- print "Can't do remote upload without configuring \$wgParserTestRemote!\n";
- exit( 1 );
- }
-
- // Generate a hash MAC to validate our credentials
- $message = array(
- $remote['repo'],
- $remote['suite'],
- $revId,
- $status,
- );
- if( $status == "complete" ) {
- $message[] = $jsonResults;
- }
- $hmac = hash_hmac( "sha1", implode( "|", $message ), $remote['secret'] );
-
- $postData = array(
- 'action' => 'codetestupload',
- 'format' => 'json',
- 'repo' => $remote['repo'],
- 'suite' => $remote['suite'],
- 'rev' => $revId,
- 'status' => $status,
- 'hmac' => $hmac,
- );
- if( $status == "complete" ) {
- $postData['results'] = $jsonResults;
- }
- $response = $this->post( $remote['api-url'], $postData );
-
- if( $response === false ) {
- print "CodeReview info upload failed to reach server.\n";
- exit( 1 );
- }
- $responseData = json_decode( $response, true );
- if( !is_array( $responseData ) ) {
- print "CodeReview API response not recognized...\n";
- wfDebug( "Unrecognized CodeReview API response: $response\n" );
- exit( 1 );
- }
- if( isset( $responseData['error'] ) ) {
- $code = $responseData['error']['code'];
- $info = $responseData['error']['info'];
- print "CodeReview info upload failed: $code $info\n";
- exit( 1 );
- }
- }
-
- function post( $url, $data ) {
- return Http::post( $url, array( 'postData' => $data) );
- }
-}
-
-class TestFileIterator implements Iterator {
- private $file;
- private $fh;
- private $parser;
- private $index = 0;
- private $test;
- private $lineNum;
- private $eof;
-
- function __construct( $file, $parser = null ) {
- global $IP;
-
- $this->file = $file;
- $this->fh = fopen($this->file, "rt");
- if( !$this->fh ) {
- wfDie( "Couldn't open file '$file'\n" );
- }
-
- $this->parser = $parser;
-
- if( $this->parser ) $this->parser->showRunFile( wfRelativePath( $this->file, $IP ) );
- $this->lineNum = $this->index = 0;
- }
-
- function setParser( ParserTest $parser ) {
- $this->parser = $parser;
- }
-
- function rewind() {
- if(fseek($this->fh, 0)) {
- wfDie( "Couldn't fseek to the start of '$filename'\n" );
- }
- $this->index = 0;
- $this->lineNum = 0;
- $this->eof = false;
- $this->readNextTest();
-
- return true;
- }
-
- function current() {
- return $this->test;
- }
-
- function key() {
- return $this->index;
- }
-
- function next() {
- if($this->readNextTest()) {
- $this->index++;
- return true;
- } else {
- $this->eof = true;
- }
- }
-
- function valid() {
- return $this->eof != true;
- }
-
- function readNextTest() {
- $data = array();
- $section = null;
-
- while( false !== ($line = fgets( $this->fh ) ) ) {
- $this->lineNum++;
- $matches = array();
- if( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
- $section = strtolower( $matches[1] );
- if( $section == 'endarticle') {
- if( !isset( $data['text'] ) ) {
- wfDie( "'endarticle' without 'text' at line {$this->lineNum} of $filename\n" );
- }
- if( !isset( $data['article'] ) ) {
- wfDie( "'endarticle' without 'article' at line {$this->lineNum} of $filename\n" );
- }
- if( $this->parser ) $this->parser->addArticle($this->parser->chomp($data['article']), $this->parser->chomp($data['text']),
- $this->lineNum);
- $data = array();
- $section = null;
- continue;
- }
- if( $section == 'endhooks' ) {
- if( !isset( $data['hooks'] ) ) {
- wfDie( "'endhooks' without 'hooks' at line {$this->lineNum} of $filename\n" );
- }
- foreach( explode( "\n", $data['hooks'] ) as $line ) {
- $line = trim( $line );
- if( $line ) {
- if( $this->parser ) $this->parser->requireHook( $line );
- }
- }
- $data = array();
- $section = null;
- continue;
- }
- if( $section == 'endfunctionhooks' ) {
- if( !isset( $data['functionhooks'] ) ) {
- wfDie( "'endfunctionhooks' without 'functionhooks' at line {$this->lineNum} of $filename\n" );
- }
- foreach( explode( "\n", $data['functionhooks'] ) as $line ) {
- $line = trim( $line );
- if( $line ) {
- if( $this->parser ) $this->parser->requireFunctionHook( $line );
- }
- }
- $data = array();
- $section = null;
- continue;
- }
- if( $section == 'end' ) {
- if( !isset( $data['test'] ) ) {
- wfDie( "'end' without 'test' at line {$this->lineNum} of $filename\n" );
- }
- if( !isset( $data['input'] ) ) {
- wfDie( "'end' without 'input' at line {$this->lineNum} of $filename\n" );
- }
- if( !isset( $data['result'] ) ) {
- wfDie( "'end' without 'result' at line {$this->lineNum} of $filename\n" );
- }
- if( !isset( $data['options'] ) ) {
- $data['options'] = '';
- }
- if (!isset( $data['config'] ) )
- $data['config'] = '';
-
- if ( $this->parser && (preg_match('/\\bdisabled\\b/i', $data['options'])
- || !preg_match("/{$this->parser->regex}/i", $data['test'])) && !$this->parser->runDisabled ) {
- # disabled test
- $data = array();
- $section = null;
- continue;
- }
- if ( $this->parser &&
- preg_match('/\\bmath\\b/i', $data['options']) && !$this->parser->savedGlobals['wgUseTeX'] ) {
- # don't run math tests if $wgUseTeX is set to false in LocalSettings
- $data = array();
- $section = null;
- continue;
- }
-
- if( $this->parser ) {
- $this->test = array(
- 'test' => $this->parser->chomp( $data['test'] ),
- 'input' => $this->parser->chomp( $data['input'] ),
- 'result' => $this->parser->chomp( $data['result'] ),
- 'options' => $this->parser->chomp( $data['options'] ),
- 'config' => $this->parser->chomp( $data['config'] ) );
- } else {
- $this->test['test'] = $data['test'];
- }
- return true;
- }
- if ( isset ($data[$section] ) ) {
- wfDie( "duplicate section '$section' at line {$this->lineNum} of $filename\n" );
- }
- $data[$section] = '';
- continue;
- }
- if( $section ) {
- $data[$section] .= $line;
- }
- }
- return false;
- }
-} \ No newline at end of file
diff --git a/maintenance/parserTestsParserHook.php b/maintenance/parserTestsParserHook.php
deleted file mode 100644
index f55cd0e4..00000000
--- a/maintenance/parserTestsParserHook.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-if ( ! defined( 'MEDIAWIKI' ) )
- die( -1 );
-/**
- * A basic extension that's used by the parser tests to test whether input and
- * arguments are passed to extensions properly.
- *
- * @file
- * @ingroup Maintenance
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-
-$wgHooks['ParserTestParser'][] = 'wfParserTestParserHookSetup';
-
-function wfParserTestParserHookSetup( &$parser ) {
- $parser->setHook( 'tag', 'wfParserTestParserHookHook' );
-
- return true;
-}
-
-function wfParserTestParserHookHook( $in, $argv ) {
- ob_start();
- var_dump(
- $in,
- $argv
- );
- $ret = ob_get_clean();
-
- return "<pre>\n$ret</pre>";
-}
-
diff --git a/maintenance/parserTestsParserTime.php b/maintenance/parserTestsParserTime.php
deleted file mode 100644
index c5903f25..00000000
--- a/maintenance/parserTestsParserTime.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-if ( ! defined( 'MEDIAWIKI' ) )
- die( -1 );
-/**
- * A basic extension that's used by the parser tests to test date magic words
- *
- * Handy so that we don't have to upgrade the parsertests every second to
- * compensate with the passage of time and certainly less expensive than a
- * time-freezing device, get yours now!
- *
- * @file
- * @ingroup Maintenance
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-
-$wgHooks['ParserGetVariableValueTs'][] = 'wfParserTimeSetup';
-
-function wfParserTimeSetup( &$parser, &$ts ) {
- $ts = 123; //$ perl -le 'print scalar localtime 123' ==> Thu Jan 1 00:02:03 1970
-
- return true;
-}
-
diff --git a/maintenance/parserTestsStaticParserHook.php b/maintenance/parserTestsStaticParserHook.php
deleted file mode 100644
index 98c4bba1..00000000
--- a/maintenance/parserTestsStaticParserHook.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-if ( ! defined( 'MEDIAWIKI' ) )
- die( -1 );
-/**
- * A basic extension that's used by the parser tests to test whether the parser
- * calls extensions when they're called inside comments, it shouldn't do that
- *
- * @file
- * @ingroup Maintenance
- *
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-
-$wgHooks['ParserTestParser'][] = 'wfParserTestStaticParserHookSetup';
-
-function wfParserTestStaticParserHookSetup( &$parser ) {
- $parser->setHook( 'statictag', 'wfParserTestStaticParserHookHook' );
-
- return true;
-}
-
-function wfParserTestStaticParserHookHook( $in, $argv, $parser ) {
- if ( ! count( $argv ) ) {
- $parser->static_tag_buf = $in;
- return '';
- } else if ( count( $argv ) === 1 && isset( $argv['action'] )
- && $argv['action'] === 'flush' && $in === null )
- {
- // Clear the buffer, we probably don't need to
- if ( isset( $parser->static_tag_buf ) ) {
- $tmp = $parser->static_tag_buf;
- } else {
- $tmp = '';
- }
- $parser->static_tag_buf = null;
- return $tmp;
- } else
- // wtf?
- return
- "\nCall this extension as <statictag>string</statictag> or as" .
- " <statictag action=flush/>, not in any other way.\n" .
- "text: " . var_export( $in, true ) . "\n" .
- "argv: " . var_export( $argv, true ) . "\n";
-}
-
diff --git a/maintenance/patchSql.php b/maintenance/patchSql.php
index 69cb0f56..1f96d62c 100644
--- a/maintenance/patchSql.php
+++ b/maintenance/patchSql.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PatchSql extends Maintenance {
public function __construct() {
@@ -36,14 +36,14 @@ class PatchSql extends Maintenance {
public function execute() {
$dbw = wfGetDB( DB_MASTER );
- foreach( $this->mArgs as $arg ) {
+ foreach ( $this->mArgs as $arg ) {
$files = array(
$arg,
- DatabaseBase::patchPath( $arg ),
- DatabaseBase::patchPath( "patch-$arg.sql" ),
+ $dbw->patchPath( $arg ),
+ $dbw->patchPath( "patch-$arg.sql" ),
);
- foreach( $files as $file ) {
- if( file_exists( $file ) ) {
+ foreach ( $files as $file ) {
+ if ( file_exists( $file ) ) {
$this->output( "$file ...\n" );
$dbw->sourceFile( $file );
continue 2;
@@ -56,4 +56,4 @@ class PatchSql extends Maintenance {
}
$maintClass = "PatchSql";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateCategory.inc b/maintenance/populateCategory.inc
deleted file mode 100644
index deca4530..00000000
--- a/maintenance/populateCategory.inc
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * @file
- * @ingroup Maintenance
- * @author Simetrical
- */
-
-define( 'REPORTING_INTERVAL', 1000 );
-
-function populateCategory( $begin, $maxlag, $throttle, $force ) {
- $dbw = wfGetDB( DB_MASTER );
-
- if( !$force ) {
- $row = $dbw->selectRow(
- 'updatelog',
- '1',
- array( 'ul_key' => 'populate category' ),
- __FUNCTION__
- );
- if( $row ) {
- wfOut( "Category table already populated. Use php ".
- "maintenance/populateCategory.php\n--force from the command line ".
- "to override.\n" );
- return true;
- }
- }
-
- $maxlag = intval( $maxlag );
- $throttle = intval( $throttle );
- $force = (bool)$force;
- if( $begin !== '' ) {
- $where = 'cl_to > '.$dbw->addQuotes( $begin );
- } else {
- $where = null;
- }
- $i = 0;
-
- while( true ) {
- # Find which category to update
- $row = $dbw->selectRow(
- 'categorylinks',
- 'cl_to',
- $where,
- __FUNCTION__,
- array(
- 'ORDER BY' => 'cl_to'
- )
- );
- if( !$row ) {
- # Done, hopefully.
- break;
- }
- $name = $row->cl_to;
- $where = 'cl_to > '.$dbw->addQuotes( $name );
-
- # Use the row to update the category count
- $cat = Category::newFromName( $name );
- if( !is_object( $cat ) ) {
- wfOut( "The category named $name is not valid?!\n" );
- } else {
- $cat->refreshCounts();
- }
-
- ++$i;
- if( !($i % REPORTING_INTERVAL) ) {
- wfOut( "$name\n" );
- wfWaitForSlaves( $maxlag );
- }
- usleep( $throttle*1000 );
- }
-
- if( $dbw->insert(
- 'updatelog',
- array( 'ul_key' => 'populate category' ),
- __FUNCTION__,
- 'IGNORE'
- )
- ) {
- wfOut( "Category population complete.\n" );
- return true;
- } else {
- wfOut( "Could not insert category population row.\n" );
- return false;
- }
-}
diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php
index bf84bb0a..4f494e15 100644
--- a/maintenance/populateCategory.php
+++ b/maintenance/populateCategory.php
@@ -1,13 +1,13 @@
<?php
/**
- * @file
+ * @file
* @ingroup Maintenance
* @author Simetrical
*/
$optionsWithArgs = array( 'begin', 'max-slave-lag', 'throttle' );
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PopulateCategory extends Maintenance {
@@ -31,12 +31,13 @@ added after the software update and so will be populated anyway.
When the script has finished, it will make a note of this in the database, and
will not run again without the --force option.
TEXT;
+# '
$this->addOption( 'begin', 'Only do categories whose names are alphabetically after the provided name', false, true );
$this->addOption( 'max-slave-lag', 'If slave lag exceeds this many seconds, wait until it drops before continuing. Default: 10', false, true );
$this->addOption( 'throttle', 'Wait this many milliseconds after each category. Default: 0', false, true );
$this->addOption( 'force', 'Run regardless of whether the database says it\'s been run already' );
}
-
+
public function execute() {
$begin = $this->getOption( 'begin', '' );
$maxSlaveLag = $this->getOption( 'max-slave-lag', 10 );
@@ -47,81 +48,80 @@ TEXT;
private function doPopulateCategory( $begin, $maxlag, $throttle, $force ) {
$dbw = wfGetDB( DB_MASTER );
-
- if( !$force ) {
+
+ if ( !$force ) {
$row = $dbw->selectRow(
'updatelog',
'1',
array( 'ul_key' => 'populate category' ),
- __FUNCTION__
+ __METHOD__
);
- if( $row ) {
- $this->output( "Category table already populated. Use php ".
- "maintenance/populateCategory.php\n--force from the command line ".
+ if ( $row ) {
+ $this->output( "Category table already populated. Use php " .
+ "maintenance/populateCategory.php\n--force from the command line " .
"to override.\n" );
return true;
}
}
-
+
$maxlag = intval( $maxlag );
$throttle = intval( $throttle );
- $force = (bool)$force;
- if( $begin !== '' ) {
- $where = 'cl_to > '.$dbw->addQuotes( $begin );
+ if ( $begin !== '' ) {
+ $where = 'cl_to > ' . $dbw->addQuotes( $begin );
} else {
$where = null;
}
$i = 0;
-
- while( true ) {
+
+ while ( true ) {
# Find which category to update
$row = $dbw->selectRow(
'categorylinks',
'cl_to',
$where,
- __FUNCTION__,
+ __METHOD__,
array(
'ORDER BY' => 'cl_to'
)
);
- if( !$row ) {
+ if ( !$row ) {
# Done, hopefully.
break;
}
$name = $row->cl_to;
- $where = 'cl_to > '.$dbw->addQuotes( $name );
-
+ $where = 'cl_to > ' . $dbw->addQuotes( $name );
+
# Use the row to update the category count
$cat = Category::newFromName( $name );
- if( !is_object( $cat ) ) {
+ if ( !is_object( $cat ) ) {
$this->output( "The category named $name is not valid?!\n" );
} else {
$cat->refreshCounts();
}
-
+
++$i;
- if( !($i % self::REPORTING_INTERVAL) ) {
+ if ( !( $i % self::REPORTING_INTERVAL ) ) {
$this->output( "$name\n" );
wfWaitForSlaves( $maxlag );
}
- usleep( $throttle*1000 );
+ usleep( $throttle * 1000 );
}
-
- if( $dbw->insert(
+
+ if ( $dbw->insert(
'updatelog',
array( 'ul_key' => 'populate category' ),
- __FUNCTION__,
+ __METHOD__,
'IGNORE'
)
) {
- wfOut( "Category population complete.\n" );
+ $this->output( "Category population complete.\n" );
return true;
} else {
- wfOut( "Could not insert category population row.\n" );
+ $this->output( "Could not insert category population row.\n" );
return false;
}
}
}
$maintClass = "PopulateCategory";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateLogSearch.inc b/maintenance/populateLogSearch.inc
deleted file mode 100644
index b5e34fb7..00000000
--- a/maintenance/populateLogSearch.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Makes the required database updates for log display in Special:RevisionDelete
- *
- * Run via update.php or directly through populateLogSearch.php
- *
- * @file
- * @ingroup Maintenance
- */
-
-define( 'LOG_SEARCH_BATCH_SIZE', 300 );
-
-function migrate_log_params( $db ) {
- $start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ );
- if( !$start ) {
- echo "Nothing to do.\n";
- return true;
- }
- $end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ );
-
- # Do remaining chunk
- $end += LOG_SEARCH_BATCH_SIZE - 1;
- $blockStart = $start;
- $blockEnd = $start + LOG_SEARCH_BATCH_SIZE - 1;
- while( $blockEnd <= $end ) {
- echo "...doing log_id from $blockStart to $blockEnd\n";
- $cond = array("log_id BETWEEN $blockStart AND $blockEnd");
- # Applicable log types
- $cond['log_type'] = array('delete','suppress');
- $res = $db->select( 'logging', '*', $cond, __FUNCTION__ );
- $batch = array();
- while( $row = $db->fetchObject( $res ) ) {
- // RevisionDelete logs - revisions
- if( LogEventsList::typeAction( $row, array('delete','suppress'), 'revision' ) ) {
- $params = LogPage::extractParams( $row->log_params );
- // Param format: <urlparam> <item CSV> [<ofield> <nfield>]
- if( count($params) >= 2 ) {
- $field = RevisionDeleter::getRelationType($params[0]);
- // B/C, the params may start with a title key
- if( $field == null ) {
- array_shift($params);
- $field = RevisionDeleter::getRelationType($params[0]);
- }
- if( $field == null ) {
- echo "Invalid param type for $row->log_id\n";
- continue; // skip this row
- }
- $items = explode(',',$params[1]);
- $log = new LogPage( $row->log_type );
- $log->addRelations( $field, $items, $row->log_id );
- }
- // RevisionDelete logs - log events
- } else if( LogEventsList::typeAction( $row, array('delete','suppress'), 'event' ) ) {
- $params = LogPage::extractParams( $row->log_params );
- // Param format: <item CSV> [<ofield> <nfield>]
- if( count($params) >= 1 ) {
- $items = explode(',',$params[0]);
- $log = new LogPage( $row->log_type );
- $log->addRelations( 'log_id', $items, $row->log_id );
- }
- }
- }
- $blockStart += LOG_SEARCH_BATCH_SIZE;
- $blockEnd += LOG_SEARCH_BATCH_SIZE;
- wfWaitForSlaves( 5 );
- }
- if( $db->insert(
- 'updatelog',
- array( 'ul_key' => 'populate log_search' ),
- __FUNCTION__,
- 'IGNORE'
- )
- ) {
- wfOut( "log_search population complete.\n" );
- return true;
- } else {
- wfOut( "Could not insert log_search population row.\n" );
- return false;
- }
-}
diff --git a/maintenance/populateLogSearch.php b/maintenance/populateLogSearch.php
index b045104e..ce2d95cc 100644
--- a/maintenance/populateLogSearch.php
+++ b/maintenance/populateLogSearch.php
@@ -21,14 +21,14 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PopulateLogSearch extends Maintenance {
const LOG_SEARCH_BATCH_SIZE = 100;
- static $tableMap = array('rev' => 'revision', 'fa' => 'filearchive', 'oi' => 'oldimage', 'ar' => 'archive');
-
+ static $tableMap = array( 'rev' => 'revision', 'fa' => 'filearchive', 'oi' => 'oldimage', 'ar' => 'archive' );
+
public function __construct() {
parent::__construct();
$this->mDescription = "Migrate log params to new table and index for searching";
@@ -40,75 +40,74 @@ class PopulateLogSearch extends Maintenance {
$this->error( "log_search does not exist", true );
}
$start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ );
- if( !$start ) {
+ if ( !$start ) {
$this->output( "Nothing to do.\n" );
return true;
}
$end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ );
-
+
# Do remaining chunk
$end += self::LOG_SEARCH_BATCH_SIZE - 1;
$blockStart = $start;
$blockEnd = $start + self::LOG_SEARCH_BATCH_SIZE - 1;
-
- $delTypes = array('delete','suppress'); // revisiondelete types
- while( $blockEnd <= $end ) {
+
+ $delTypes = array( 'delete', 'suppress' ); // revisiondelete types
+ while ( $blockEnd <= $end ) {
$this->output( "...doing log_id from $blockStart to $blockEnd\n" );
$cond = "log_id BETWEEN $blockStart AND $blockEnd";
$res = $db->select( 'logging', '*', $cond, __FUNCTION__ );
- $batch = array();
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
// RevisionDelete logs - revisions
- if( LogEventsList::typeAction( $row, $delTypes, 'revision' ) ) {
+ if ( LogEventsList::typeAction( $row, $delTypes, 'revision' ) ) {
$params = LogPage::extractParams( $row->log_params );
// Param format: <urlparam> <item CSV> [<ofield> <nfield>]
- if( count($params) < 2 ) continue; // bad row?
- $field = RevisionDeleter::getRelationType($params[0]);
+ if ( count( $params ) < 2 ) continue; // bad row?
+ $field = RevisionDeleter::getRelationType( $params[0] );
// B/C, the params may start with a title key (<title> <urlparam> <CSV>)
- if( $field == null ) {
- array_shift($params); // remove title param
- $field = RevisionDeleter::getRelationType($params[0]);
- if( $field == null ) {
+ if ( $field == null ) {
+ array_shift( $params ); // remove title param
+ $field = RevisionDeleter::getRelationType( $params[0] );
+ if ( $field == null ) {
$this->output( "Invalid param type for {$row->log_id}\n" );
continue; // skip this row
} else {
// Clean up the row...
- $db->update( 'logging',
- array('log_params' => implode(',',$params) ),
- array('log_id' => $row->log_id ) );
+ $db->update( 'logging',
+ array( 'log_params' => implode( ',', $params ) ),
+ array( 'log_id' => $row->log_id ) );
}
}
- $items = explode(',',$params[1]);
+ $items = explode( ',', $params[1] );
$log = new LogPage( $row->log_type );
// Add item relations...
$log->addRelations( $field, $items, $row->log_id );
// Determine what table to query...
- $prefix = substr( $field, 0, strpos($field,'_') ); // db prefix
- if( !isset(self::$tableMap[$prefix]) )
+ $prefix = substr( $field, 0, strpos( $field, '_' ) ); // db prefix
+ if ( !isset( self::$tableMap[$prefix] ) )
continue; // bad row?
$table = self::$tableMap[$prefix];
- $userField = $prefix.'_user';
- $userTextField = $prefix.'_user_text';
+ $userField = $prefix . '_user';
+ $userTextField = $prefix . '_user_text';
// Add item author relations...
$userIds = $userIPs = array();
$sres = $db->select( $table,
- array($userField,$userTextField),
- array($field => $items)
+ array( $userField, $userTextField ),
+ array( $field => $items )
);
- foreach( $sres as $srow ) {
- if( $srow->$userField > 0 )
- $userIds[] = intval($srow->$userField);
- else if( $srow->$userTextField != '' )
+ foreach ( $sres as $srow ) {
+ if ( $srow->$userField > 0 )
+ $userIds[] = intval( $srow->$userField );
+ else if ( $srow->$userTextField != '' )
$userIPs[] = $srow->$userTextField;
}
// Add item author relations...
$log->addRelations( 'target_author_id', $userIds, $row->log_id );
$log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
// RevisionDelete logs - log events
- } else if( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) {
+ } else if ( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) {
$params = LogPage::extractParams( $row->log_params );
// Param format: <item CSV> [<ofield> <nfield>]
- if( count($params) < 1 ) continue; // bad row
+ if ( count( $params ) < 1 ) continue; // bad row
$items = explode( ',', $params[0] );
$log = new LogPage( $row->log_type );
// Add item relations...
@@ -116,13 +115,13 @@ class PopulateLogSearch extends Maintenance {
// Add item author relations...
$userIds = $userIPs = array();
$sres = $db->select( 'logging',
- array('log_user','log_user_text'),
- array('log_id' => $items)
+ array( 'log_user', 'log_user_text' ),
+ array( 'log_id' => $items )
);
- foreach( $sres as $srow ) {
- if( $srow->log_user > 0 )
- $userIds[] = intval($srow->log_user);
- else if( IP::isIPAddress($srow->log_user_text) )
+ foreach ( $sres as $srow ) {
+ if ( $srow->log_user > 0 )
+ $userIds[] = intval( $srow->log_user );
+ else if ( IP::isIPAddress( $srow->log_user_text ) )
$userIPs[] = $srow->log_user_text;
}
$log->addRelations( 'target_author_id', $userIds, $row->log_id );
@@ -133,7 +132,7 @@ class PopulateLogSearch extends Maintenance {
$blockEnd += self::LOG_SEARCH_BATCH_SIZE;
wfWaitForSlaves( 5 );
}
- if( $db->insert(
+ if ( $db->insert(
'updatelog',
array( 'ul_key' => 'populate log_search' ),
__FUNCTION__,
@@ -150,4 +149,4 @@ class PopulateLogSearch extends Maintenance {
}
$maintClass = "PopulateLogSearch";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateLogUsertext.php b/maintenance/populateLogUsertext.php
index a491b2b0..bb3927ce 100644
--- a/maintenance/populateLogUsertext.php
+++ b/maintenance/populateLogUsertext.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PopulateLogUsertext extends Maintenance {
public function __construct() {
@@ -35,7 +35,7 @@ class PopulateLogUsertext extends Maintenance {
public function execute() {
$db = wfGetDB( DB_MASTER );
$start = $db->selectField( 'logging', 'MIN(log_id)', false, __METHOD__ );
- if( !$start ) {
+ if ( !$start ) {
$this->output( "Nothing to do.\n" );
return true;
}
@@ -45,23 +45,23 @@ class PopulateLogUsertext extends Maintenance {
$end += $this->mBatchSize - 1;
$blockStart = $start;
$blockEnd = $start + $this->mBatchSize - 1;
- while( $blockEnd <= $end ) {
+ while ( $blockEnd <= $end ) {
$this->output( "...doing log_id from $blockStart to $blockEnd\n" );
$cond = "log_id BETWEEN $blockStart AND $blockEnd AND log_user = user_id";
- $res = $db->select( array('logging','user'),
- array('log_id','user_name'), $cond, __METHOD__ );
- $batch = array();
+ $res = $db->select( array( 'logging', 'user' ),
+ array( 'log_id', 'user_name' ), $cond, __METHOD__ );
+
$db->begin();
- foreach( $res as $row ) {
- $db->update( 'logging', array('log_user_text' => $row->user_name),
- array('log_id' => $row->log_id), __METHOD__ );
+ foreach ( $res as $row ) {
+ $db->update( 'logging', array( 'log_user_text' => $row->user_name ),
+ array( 'log_id' => $row->log_id ), __METHOD__ );
}
$db->commit();
$blockStart += $this->mBatchSize;
$blockEnd += $this->mBatchSize;
wfWaitForSlaves( 5 );
}
- if( $db->insert(
+ if ( $db->insert(
'updatelog',
array( 'ul_key' => 'populate log_usertext' ),
__METHOD__,
@@ -78,5 +78,5 @@ class PopulateLogUsertext extends Maintenance {
}
$maintClass = "PopulateLogUsertext";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateParentId.inc b/maintenance/populateParentId.inc
deleted file mode 100644
index 7b1ae3e8..00000000
--- a/maintenance/populateParentId.inc
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-define( 'BATCH_SIZE', 200 );
-
-function populate_rev_parent_id( $db ) {
- wfOut( "Populating rev_parent_id column\n" );
- $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
- $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
- if( is_null( $start ) || is_null( $end ) ){
- wfOut( "...revision table seems to be empty.\n" );
- $db->insert( 'updatelog',
- array( 'ul_key' => 'populate rev_parent_id' ),
- __FUNCTION__,
- 'IGNORE' );
- return;
- }
- # Do remaining chunk
- $end += BATCH_SIZE - 1;
- $blockStart = intval( $start );
- $blockEnd = intval( $start ) + BATCH_SIZE - 1;
- $count = 0;
- $changed = 0;
- while( $blockEnd <= $end ) {
- wfOut( "...doing rev_id from $blockStart to $blockEnd\n" );
- $cond = "rev_id BETWEEN $blockStart AND $blockEnd";
- $res = $db->select( 'revision',
- array('rev_id','rev_page','rev_timestamp','rev_parent_id'),
- $cond, __FUNCTION__ );
- # 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
- # edit was made...
- foreach( $res as $row ) {
- # First, check rows with the same timestamp other than this one
- # with a smaller rev ID. The highest ID "wins". This avoids loops
- # as timestamp can only decrease and never loops with IDs (from parent to parent)
- $previousID = $db->selectField( 'revision', 'rev_id',
- array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $row->rev_timestamp,
- "rev_id < " . intval( $row->rev_id ) ),
- __FUNCTION__,
- array( 'ORDER BY' => 'rev_id DESC' ) );
- # If there are none, check the the highest ID with a lower timestamp
- if( !$previousID ) {
- # Get the highest older timestamp
- $lastTimestamp = $db->selectField( 'revision', 'rev_timestamp',
- array( 'rev_page' => $row->rev_page, "rev_timestamp < " . $db->addQuotes( $row->rev_timestamp ) ),
- __FUNCTION__,
- array( 'ORDER BY' => 'rev_timestamp DESC' ) );
- # If there is one, let the highest rev ID win
- if( $lastTimestamp ) {
- $previousID = $db->selectField( 'revision', 'rev_id',
- array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $lastTimestamp ),
- __FUNCTION__,
- array( 'ORDER BY' => 'rev_id DESC' ) );
- }
- }
- $previousID = intval($previousID);
- if( $previousID != $row->rev_parent_id )
- $changed++;
- # Update the row...
- $db->update( 'revision',
- array( 'rev_parent_id' => $previousID ),
- array( 'rev_id' => $row->rev_id ),
- __FUNCTION__ );
- $count++;
- }
- $blockStart += BATCH_SIZE - 1;
- $blockEnd += BATCH_SIZE - 1;
- wfWaitForSlaves( 5 );
- }
- $logged = $db->insert( 'updatelog',
- array( 'ul_key' => 'populate rev_parent_id' ),
- __FUNCTION__,
- 'IGNORE' );
- if( $logged ) {
- wfOut( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
- return true;
- } else {
- wfOut( "Could not insert rev_parent_id population row.\n" );
- return false;
- }
-}
-
diff --git a/maintenance/populateParentId.php b/maintenance/populateParentId.php
index bf81cb68..387f5a56 100644
--- a/maintenance/populateParentId.php
+++ b/maintenance/populateParentId.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PopulateParentId extends Maintenance {
public function __construct() {
@@ -39,7 +39,7 @@ class PopulateParentId extends Maintenance {
$this->output( "Populating rev_parent_id column\n" );
$start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
$end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
- if( is_null( $start ) || is_null( $end ) ){
+ if ( is_null( $start ) || is_null( $end ) ) {
$this->output( "...revision table seems to be empty.\n" );
$db->insert( 'updatelog',
array( 'ul_key' => 'populate rev_parent_id' ),
@@ -48,47 +48,46 @@ class PopulateParentId extends Maintenance {
return;
}
# Do remaining chunk
- $end += $this->mBatchSize - 1;
$blockStart = intval( $start );
$blockEnd = intval( $start ) + $this->mBatchSize - 1;
$count = 0;
$changed = 0;
- while( $blockEnd <= $end ) {
+ while ( $blockStart <= $end ) {
$this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
$cond = "rev_id BETWEEN $blockStart AND $blockEnd";
- $res = $db->select( 'revision',
- array('rev_id','rev_page','rev_timestamp','rev_parent_id'),
+ $res = $db->select( 'revision',
+ array( 'rev_id', 'rev_page', 'rev_timestamp', 'rev_parent_id' ),
$cond, __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
# edit was made...
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
# First, check rows with the same timestamp other than this one
# with a smaller rev ID. The highest ID "wins". This avoids loops
# as timestamp can only decrease and never loops with IDs (from parent to parent)
- $previousID = $db->selectField( 'revision', 'rev_id',
+ $previousID = $db->selectField( 'revision', 'rev_id',
array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $row->rev_timestamp,
- "rev_id < " . intval( $row->rev_id ) ),
+ "rev_id < " . intval( $row->rev_id ) ),
__METHOD__,
array( 'ORDER BY' => 'rev_id DESC' ) );
# If there are none, check the the highest ID with a lower timestamp
- if( !$previousID ) {
+ if ( !$previousID ) {
# Get the highest older timestamp
- $lastTimestamp = $db->selectField( 'revision', 'rev_timestamp',
- array( 'rev_page' => $row->rev_page, "rev_timestamp < " . $db->addQuotes( $row->rev_timestamp ) ),
+ $lastTimestamp = $db->selectField( 'revision', 'rev_timestamp',
+ array( 'rev_page' => $row->rev_page, "rev_timestamp < " . $db->addQuotes( $row->rev_timestamp ) ),
__METHOD__,
array( 'ORDER BY' => 'rev_timestamp DESC' ) );
# If there is one, let the highest rev ID win
- if( $lastTimestamp ) {
- $previousID = $db->selectField( 'revision', 'rev_id',
- array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $lastTimestamp ),
+ if ( $lastTimestamp ) {
+ $previousID = $db->selectField( 'revision', 'rev_id',
+ array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $lastTimestamp ),
__METHOD__,
array( 'ORDER BY' => 'rev_id DESC' ) );
}
}
- $previousID = intval($previousID);
- if( $previousID != $row->rev_parent_id )
+ $previousID = intval( $previousID );
+ if ( $previousID != $row->rev_parent_id )
$changed++;
# Update the row...
$db->update( 'revision',
@@ -97,15 +96,15 @@ class PopulateParentId extends Maintenance {
__METHOD__ );
$count++;
}
- $blockStart += $this->mBatchSize - 1;
- $blockEnd += $this->mBatchSize - 1;
+ $blockStart += $this->mBatchSize;
+ $blockEnd += $this->mBatchSize;
wfWaitForSlaves( 5 );
}
$logged = $db->insert( 'updatelog',
array( 'ul_key' => 'populate rev_parent_id' ),
__METHOD__,
'IGNORE' );
- if( $logged ) {
+ if ( $logged ) {
$this->output( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
return true;
} else {
@@ -116,4 +115,4 @@ class PopulateParentId extends Maintenance {
}
$maintClass = "PopulateParentId";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateRevisionLength.php b/maintenance/populateRevisionLength.php
new file mode 100644
index 00000000..0af51dc1
--- /dev/null
+++ b/maintenance/populateRevisionLength.php
@@ -0,0 +1,98 @@
+<?php
+/*
+ * Populates the rev_len field for old revisions created before MW 1.10.
+ *
+ * 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 PopulateRevisionLength extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Populates rev_len";
+ $this->setBatchSize( 200 );
+ }
+
+ public function execute() {
+ $db = wfGetDB( DB_MASTER );
+ if ( !$db->tableExists( 'revision' ) ) {
+ $this->error( "revision table does not exist", true );
+ }
+ $this->output( "Populating rev_len column\n" );
+ $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
+ $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
+ if ( is_null( $start ) || is_null( $end ) ) {
+ $this->output( "...revision table seems to be empty.\n" );
+ $db->insert( 'updatelog',
+ array( 'ul_key' => 'populate rev_len' ),
+ __METHOD__,
+ 'IGNORE' );
+ return;
+ }
+ # Do remaining chunks
+ $blockStart = intval( $start );
+ $blockEnd = intval( $start ) + $this->mBatchSize - 1;
+ $count = 0;
+ $missing = 0;
+ while ( $blockStart <= $end ) {
+ $this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
+ $res = $db->select( 'revision',
+ Revision::selectFields(),
+ array( "rev_id >= $blockStart",
+ "rev_id <= $blockEnd",
+ "rev_len IS NULL" ),
+ __METHOD__ );
+ # Go through and update rev_len from these rows.
+ foreach ( $res as $row ) {
+ $rev = new Revision( $row );
+ $text = $rev->getRawText();
+ if ( !is_string( $text ) ) {
+ # This should not happen, but sometimes does (bug 20757)
+ $this->output( "Text of revision {$row->rev_id} unavailable!\n" );
+ $missing++;
+ }
+ else {
+ # Update the row...
+ $db->update( 'revision',
+ array( 'rev_len' => strlen( $text ) ),
+ array( 'rev_id' => $row->rev_id ),
+ __METHOD__ );
+ $count++;
+ }
+ }
+ $blockStart += $this->mBatchSize;
+ $blockEnd += $this->mBatchSize;
+ wfWaitForSlaves( 5 );
+ }
+ $logged = $db->insert( 'updatelog',
+ array( 'ul_key' => 'populate rev_len' ),
+ __METHOD__,
+ 'IGNORE' );
+ if ( $logged ) {
+ $this->output( "rev_len population complete ... {$count} rows changed ({$missing} missing)\n" );
+ return true;
+ } else {
+ $this->output( "Could not insert rev_len population row.\n" );
+ return false;
+ }
+ }
+}
+
+$maintClass = "PopulateRevisionLength";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateSha1.php b/maintenance/populateSha1.php
index 72ef9461..1714c0d6 100644
--- a/maintenance/populateSha1.php
+++ b/maintenance/populateSha1.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__).'/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PopulateSha1 extends Maintenance {
public function __construct() {
@@ -37,14 +37,14 @@ class PopulateSha1 extends Maintenance {
$t = -microtime( true );
$dbw = wfGetDB( DB_MASTER );
- if( $file ) {
- $res = $dbw->selectRow(
- 'image',
- array( 'img_name' ),
+ if ( $file ) {
+ $res = $dbw->selectRow(
+ 'image',
+ array( 'img_name' ),
array( 'img_name' => $dbw->addQuotes( $file ) ),
__METHOD__
);
- if( !$res ) {
+ if ( !$res ) {
$this->error( "No such file: $file", true );
return;
}
@@ -52,19 +52,17 @@ class PopulateSha1 extends Maintenance {
$res = $dbw->select( 'image', array( 'img_name' ), array( 'img_sha1' => '' ), __METHOD__ );
}
$imageTable = $dbw->tableName( 'image' );
- $oldimageTable = $dbw->tableName( 'oldimage' );
- $batch = array();
-
+
if ( $method == 'pipe' ) {
// @fixme kill this and replace with a second unbuffered DB connection.
global $wgDBuser, $wgDBserver, $wgDBpassword, $wgDBname;
- $cmd = 'mysql -u' . wfEscapeShellArg( $wgDBuser ) .
+ $cmd = 'mysql -u' . wfEscapeShellArg( $wgDBuser ) .
' -h' . wfEscapeShellArg( $wgDBserver ) .
' -p' . wfEscapeShellArg( $wgDBpassword, $wgDBname );
$this->output( "Using pipe method\n" );
$pipe = popen( $cmd, 'w' );
}
-
+
$numRows = $res->numRows();
$i = 0;
foreach ( $res as $row ) {
@@ -98,4 +96,4 @@ class PopulateSha1 extends Maintenance {
}
$maintClass = "PopulateSha1";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/postgres/archives/patch-categorylinks-better-collation.sql b/maintenance/postgres/archives/patch-categorylinks-better-collation.sql
new file mode 100644
index 00000000..b3fa6346
--- /dev/null
+++ b/maintenance/postgres/archives/patch-categorylinks-better-collation.sql
@@ -0,0 +1,8 @@
+CREATE TYPE link_type AS ENUM ('page', 'subcat', 'file');
+DROP INDEX cl_sortkey;
+ALTER TABLE categorylinks
+ ADD COLUMN cl_sortkey_prefix TEXT NOT NULL DEFAULT '',
+ ADD COLUMN cl_collation SMALLINT NOT NULL DEFAULT 0,
+ ADD COLUMN cl_type link_type NOT NULL DEFAULT 'page';
+CREATE INDEX cl_collation ON categorylinks ( cl_collation );
+CREATE INDEX cl_sortkey ON categorylinks ( cl_to, cl_type, cl_sortkey, cl_from );
diff --git a/maintenance/postgres/archives/patch-change_tag.sql b/maintenance/postgres/archives/patch-change_tag.sql
index 1f52c474..89d74b63 100644
--- a/maintenance/postgres/archives/patch-change_tag.sql
+++ b/maintenance/postgres/archives/patch-change_tag.sql
@@ -1,28 +1,11 @@
-
CREATE TABLE change_tag (
- ct_rc_id INTEGER NULL,
- ct_log_id INTEGER NULL,
- ct_rev_id INTEGER NULL,
- ct_tag TEXT NOT NULL,
- ct_params TEXT NULL
+ ct_rc_id INTEGER NULL,
+ ct_log_id INTEGER NULL,
+ ct_rev_id INTEGER NULL,
+ ct_tag TEXT NOT NULL,
+ ct_params TEXT NULL
);
CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag(ct_rc_id,ct_tag);
CREATE UNIQUE INDEX change_tag_log_tag ON change_tag(ct_log_id,ct_tag);
CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag(ct_rev_id,ct_tag);
CREATE INDEX change_tag_tag_id ON change_tag(ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
-
-CREATE TABLE tag_summary (
- ts_rc_id INTEGER NULL,
- ts_log_id INTEGER NULL,
- ts_rev_id INTEGER NULL,
- ts_tags TEXT NOT NULL
-);
-CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary(ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary(ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary(ts_rev_id);
-
-
-CREATE TABLE valid_tag (
- vt_tag TEXT NOT NULL PRIMARY KEY
-);
diff --git a/maintenance/postgres/archives/patch-iwlinks.sql b/maintenance/postgres/archives/patch-iwlinks.sql
new file mode 100644
index 00000000..db26eae4
--- /dev/null
+++ b/maintenance/postgres/archives/patch-iwlinks.sql
@@ -0,0 +1,8 @@
+
+CREATE TABLE iwlinks (
+ iwl_from INTEGER NOT NULL DEFAULT 0,
+ iwl_prefix TEXT NOT NULL DEFAULT '',
+ iwl_title TEXT NOT NULL DEFAULT ''
+);
+CREATE UNIQUE INDEX iwl_from ON iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/postgres/archives/patch-kill-iwl_pft.sql b/maintenance/postgres/archives/patch-kill-iwl_pft.sql
new file mode 100644
index 00000000..4419d9e9
--- /dev/null
+++ b/maintenance/postgres/archives/patch-kill-iwl_pft.sql
@@ -0,0 +1,7 @@
+--
+-- Kill the old iwl_prefix_from_title index, which may be present on some
+-- installs if they ran update.php between it being added and being renamed
+--
+
+DROP INDEX iwl_prefix_from_title;
+
diff --git a/maintenance/postgres/archives/patch-kill-iwl_prefix.sql b/maintenance/postgres/archives/patch-kill-iwl_prefix.sql
new file mode 100644
index 00000000..8b6d1084
--- /dev/null
+++ b/maintenance/postgres/archives/patch-kill-iwl_prefix.sql
@@ -0,0 +1,7 @@
+--
+-- Kill the old iwl_prefix index, which may be present on some
+-- installs if they ran update.php between it being added and being renamed
+--
+
+DROP INDEX iwl_prefix;
+
diff --git a/maintenance/postgres/archives/patch-mediawiki_version.sql b/maintenance/postgres/archives/patch-mediawiki_version.sql
deleted file mode 100644
index 811b38a1..00000000
--- a/maintenance/postgres/archives/patch-mediawiki_version.sql
+++ /dev/null
@@ -1,18 +0,0 @@
-CREATE TABLE mediawiki_version (
- type TEXT NOT NULL,
- mw_version TEXT NOT NULL,
- notes TEXT NULL,
-
- pg_version TEXT NULL,
- pg_dbname TEXT NULL,
- pg_user TEXT NULL,
- pg_port TEXT NULL,
- mw_schema TEXT NULL,
- ts2_schema TEXT NULL,
- ctype TEXT NULL,
-
- sql_version TEXT NULL,
- sql_date TEXT NULL,
- cdate TIMESTAMPTZ NOT NULL DEFAULT now()
-);
-
diff --git a/maintenance/postgres/archives/patch-module_deps.sql b/maintenance/postgres/archives/patch-module_deps.sql
new file mode 100644
index 00000000..703dcdaf
--- /dev/null
+++ b/maintenance/postgres/archives/patch-module_deps.sql
@@ -0,0 +1,7 @@
+CREATE TABLE module_deps (
+ md_module TEXT NOT NULL,
+ md_skin TEXT NOT NULL,
+ md_deps TEXT NOT NULL
+);
+
+CREATE UNIQUE INDEX md_module_skin_idx ON module_deps (md_module, md_skin);
diff --git a/maintenance/postgres/archives/patch-msg_resource.sql b/maintenance/postgres/archives/patch-msg_resource.sql
new file mode 100644
index 00000000..00d82073
--- /dev/null
+++ b/maintenance/postgres/archives/patch-msg_resource.sql
@@ -0,0 +1,8 @@
+CREATE TABLE msg_resource (
+ mr_resource TEXT NOT NULL,
+ mr_lang TEXT NOT NULL,
+ mr_blob TEXT NOT NULL,
+ mr_timestamp TIMESTAMPTZ NOT NULL
+);
+
+CREATE UNIQUE INDEX mr_resource_lang_idx ON msg_resource (mr_resource, mr_lang);
diff --git a/maintenance/postgres/archives/patch-msg_resource_links.sql b/maintenance/postgres/archives/patch-msg_resource_links.sql
new file mode 100644
index 00000000..e7b80219
--- /dev/null
+++ b/maintenance/postgres/archives/patch-msg_resource_links.sql
@@ -0,0 +1,6 @@
+CREATE TABLE msg_resource_links (
+ mrl_resource TEXT NOT NULL,
+ mrl_message TEXT NOT NULL
+);
+
+CREATE UNIQUE INDEX mrl_message_resource_idx ON msg_resource_links (mrl_message, mrl_resource);
diff --git a/maintenance/postgres/archives/patch-mwuser.sql b/maintenance/postgres/archives/patch-mwuser.sql
deleted file mode 100644
index 3984703a..00000000
--- a/maintenance/postgres/archives/patch-mwuser.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE "user" RENAME TO mwuser;
diff --git a/maintenance/postgres/archives/patch-page.sql b/maintenance/postgres/archives/patch-page.sql
new file mode 100644
index 00000000..cceef898
--- /dev/null
+++ b/maintenance/postgres/archives/patch-page.sql
@@ -0,0 +1,24 @@
+CREATE SEQUENCE page_page_id_seq;
+CREATE TABLE page (
+ page_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('page_page_id_seq'),
+ page_namespace SMALLINT NOT NULL,
+ page_title TEXT NOT NULL,
+ page_restrictions TEXT,
+ page_counter BIGINT NOT NULL DEFAULT 0,
+ page_is_redirect SMALLINT NOT NULL DEFAULT 0,
+ page_is_new SMALLINT NOT NULL DEFAULT 0,
+ page_random NUMERIC(15,14) NOT NULL DEFAULT RANDOM(),
+ page_touched TIMESTAMPTZ,
+ page_latest INTEGER NOT NULL,
+ page_len INTEGER NOT NULL
+);
+CREATE UNIQUE INDEX page_unique_name ON page (page_namespace, page_title);
+CREATE INDEX page_main_title ON page (page_title) WHERE page_namespace = 0;
+CREATE INDEX page_talk_title ON page (page_title) WHERE page_namespace = 1;
+CREATE INDEX page_user_title ON page (page_title) WHERE page_namespace = 2;
+CREATE INDEX page_utalk_title ON page (page_title) WHERE page_namespace = 3;
+CREATE INDEX page_project_title ON page (page_title) WHERE page_namespace = 4;
+CREATE INDEX page_mediawiki_title ON page (page_title) WHERE page_namespace = 8;
+CREATE INDEX page_random_idx ON page (page_random);
+CREATE INDEX page_len_idx ON page (page_len);
+
diff --git a/maintenance/postgres/archives/patch-pagecontent.sql b/maintenance/postgres/archives/patch-pagecontent.sql
deleted file mode 100644
index c3651f92..00000000
--- a/maintenance/postgres/archives/patch-pagecontent.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE "text" RENAME TO pagecontent;
diff --git a/maintenance/postgres/archives/patch-rename-iwl_prefix.sql b/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
new file mode 100644
index 00000000..a4bdb6a9
--- /dev/null
+++ b/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
@@ -0,0 +1,2 @@
+DROP INDEX iwl_prefix;
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_from, iwl_title);
diff --git a/maintenance/postgres/archives/patch-tag_summary.sql b/maintenance/postgres/archives/patch-tag_summary.sql
new file mode 100644
index 00000000..49e05e77
--- /dev/null
+++ b/maintenance/postgres/archives/patch-tag_summary.sql
@@ -0,0 +1,9 @@
+CREATE TABLE tag_summary (
+ ts_rc_id INTEGER NULL,
+ ts_log_id INTEGER NULL,
+ ts_rev_id INTEGER NULL,
+ ts_tags TEXT NOT NULL
+);
+CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary(ts_rc_id);
+CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary(ts_log_id);
+CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary(ts_rev_id);
diff --git a/maintenance/testRunner.postgres.sql b/maintenance/postgres/archives/patch-testrun.sql
index c15300b5..c15300b5 100644
--- a/maintenance/testRunner.postgres.sql
+++ b/maintenance/postgres/archives/patch-testrun.sql
diff --git a/maintenance/postgres/archives/patch-update_sequences.sql b/maintenance/postgres/archives/patch-update_sequences.sql
index a3d30681..94f7be4f 100644
--- a/maintenance/postgres/archives/patch-update_sequences.sql
+++ b/maintenance/postgres/archives/patch-update_sequences.sql
@@ -1,20 +1,20 @@
-ALTER SEQUENCE rev_rev_id_val RENAME TO revision_rev_id_seq;
+ALTER TABLE revision RENAME rev_rev_id_val TO revision_rev_id_seq;
ALTER TABLE revision ALTER COLUMN rev_id SET DEFAULT NEXTVAL('revision_rev_id_seq');
-ALTER SEQUENCE text_old_id_val RENAME TO text_old_id_seq;
+ALTER TABLE pagecontent RENAME text_old_id_val TO text_old_id_seq;
ALTER TABLE pagecontent ALTER COLUMN old_id SET DEFAULT nextval('text_old_id_seq');
-ALTER SEQUENCE category_id_seq RENAME TO category_cat_id_seq;
+ALTER TABLE category RENAME category_id_seq TO category_cat_id_seq;
ALTER TABLE category ALTER COLUMN cat_id SET DEFAULT nextval('category_cat_id_seq');
-ALTER SEQUENCE ipblocks_ipb_id_val RENAME TO ipblocks_ipb_id_seq;
+ALTER TABLE ipblocks RENAME ipblocks_ipb_id_val TO ipblocks_ipb_id_seq;
ALTER TABLE ipblocks ALTER COLUMN ipb_id SET DEFAULT nextval('ipblocks_ipb_id_seq');
-ALTER SEQUENCE rc_rc_id_seq RENAME TO recentchanges_rc_id_seq;
+ALTER TABLE recentchanges RENAME rc_rc_id_seq TO recentchanges_rc_id_seq;
ALTER TABLE recentchanges ALTER COLUMN rc_id SET DEFAULT nextval('recentchanges_rc_id_seq');
-ALTER SEQUENCE log_log_id_seq RENAME TO logging_log_id_seq;
+ALTER TABLE logging RENAME log_log_id_seq TO logging_log_id_seq;
ALTER TABLE logging ALTER COLUMN log_id SET DEFAULT nextval('logging_log_id_seq');
-ALTER SEQUENCE pr_id_val RENAME TO page_restrictions_pr_id_seq;
+ALTER TABLE page_restrictions RENAME pr_id_val TO page_restrictions_pr_id_seq;
ALTER TABLE page_restrictions ALTER COLUMN pr_id SET DEFAULT nextval('page_restrictions_pr_id_seq');
diff --git a/maintenance/postgres/archives/patch-valid_tag.sql b/maintenance/postgres/archives/patch-valid_tag.sql
new file mode 100644
index 00000000..98575c6e
--- /dev/null
+++ b/maintenance/postgres/archives/patch-valid_tag.sql
@@ -0,0 +1,3 @@
+CREATE TABLE valid_tag (
+ vt_tag TEXT NOT NULL PRIMARY KEY
+);
diff --git a/maintenance/postgres/compare_schemas.pl b/maintenance/postgres/compare_schemas.pl
index 9bddf504..7e3cdf71 100644
--- a/maintenance/postgres/compare_schemas.pl
+++ b/maintenance/postgres/compare_schemas.pl
@@ -43,7 +43,7 @@ tinytext mediumtext text char varchar varbinary binary
timestamp datetime
tinyblob mediumblob blob
);
-$datatype .= q{|ENUM\([\"\w, ]+\)};
+$datatype .= q{|ENUM\([\"\w\', ]+\)};
$datatype = qr{($datatype)};
my $typeval = qr{(\(\d+\))?};
@@ -142,50 +142,6 @@ sub parse_sql {
} ## end of parse_sql
-## Read in the parser test information
-my $parsefile = '../parserTests.inc';
-open my $pfh, '<', $parsefile or die qq{Could not open "$parsefile": $!\n};
-my $stat = 0;
-my %ptable;
-while (<$pfh>) {
- if (!$stat) {
- if (/function listTables/) {
- $stat = 1;
- }
- next;
- }
- $ptable{$1}=2 while m{'(\w+)'}g;
- last if /\);/;
-}
-close $pfh or die qq{Could not close "$parsefile": $!\n};
-
-my $OK_NOT_IN_PTABLE = '
-change_tag
-filearchive
-logging
-profiling
-querycache_info
-searchindex
-tag_summary
-trackbacks
-transcache
-user_newtalk
-updatelog
-valid_tag
-';
-
-## Make sure all tables in main tables.sql are accounted for in the parsertest.
-for my $table (sort keys %{$old{'../tables.sql'}}) {
- $ptable{$table}++;
- next if $ptable{$table} > 2;
- next if $OK_NOT_IN_PTABLE =~ /\b$table\b/;
- print qq{Table "$table" is in the schema, but not used inside of parserTest.inc\n};
-}
-## Any that are used in ptables but no longer exist in the schema?
-for my $table (sort grep { $ptable{$_} == 2 } keys %ptable) {
- print qq{Table "$table" ($ptable{$table}) used in parserTest.inc, but not found in schema\n};
-}
-
for my $oldfile (@old) {
## Begin non-standard indent
@@ -316,18 +272,20 @@ rc_log_type varbinary(255) TEXT
## Simple text-only strings:
ar_flags tinyblob TEXT
+cl_collation varbinary(32) TEXT
+cl_sortkey varbinary(230) TEXT
ct_params blob TEXT
-fa_minor_mime varbinary(32) TEXT
+fa_minor_mime varbinary(100) TEXT
fa_storage_group varbinary(16) TEXT # Just 'deleted' for now, should stay plain text
fa_storage_key varbinary(64) TEXT # sha1 plus text extension
ipb_address tinyblob TEXT # IP address or username
ipb_range_end tinyblob TEXT # hexadecimal
ipb_range_start tinyblob TEXT # hexadecimal
-img_minor_mime varbinary(32) TEXT
+img_minor_mime varbinary(100) TEXT
lc_lang varbinary(32) TEXT
lc_value varbinary(32) TEXT
-
img_sha1 varbinary(32) TEXT
+iw_wikiid varchar(64) TEXT
job_cmd varbinary(60) TEXT # Should we limit to 60 as well?
keyname varbinary(255) TEXT # No tablename prefix (objectcache)
ll_lang varbinary(20) TEXT # Language code
@@ -335,7 +293,10 @@ lc_value mediumblob TEXT
log_params blob TEXT # LF separated list of args
log_type varbinary(10) TEXT
ls_field varbinary(32) TEXT
-oi_minor_mime varbinary(32) TEXT
+md_deps mediumblob TEXT # JSON
+mr_blob mediumblob TEXT # JSON
+mr_lang varbinary(32) TEXT
+oi_minor_mime varbinary(100) TEXT
oi_sha1 varbinary(32) TEXT
old_flags tinyblob TEXT
old_text mediumblob TEXT
@@ -354,6 +315,7 @@ rc_params blob TEXT
rlc_to_blob blob TEXT
ts_tags blob TEXT
ug_group varbinary(16) TEXT
+ul_value blob TEXT
up_property varbinary(32) TEXT
up_value blob TEXT
user_email_token binary(32) TEXT
@@ -362,10 +324,12 @@ user_newpassword tinyblob TEXT
user_options blob TEXT
user_password tinyblob TEXT
user_token binary(32) TEXT
+iwl_prefix varbinary(20) TEXT
## Text URLs:
el_index blob TEXT
el_to blob TEXT
+iw_api blob TEXT
iw_url blob TEXT
tb_url blob TEXT
tc_url varbinary(255) TEXT
@@ -574,5 +538,4 @@ __DATA__
OLD: searchindex ## We use tsearch2 directly on the page table instead
RENAME: user mwuser ## Reserved word causing lots of problems
RENAME: text pagecontent ## Reserved word
-NEW: mediawiki_version ## Just us, for now
XFILE: ../archives/patch-profiling.sql
diff --git a/maintenance/postgres/mediawiki_mysql2postgres.pl b/maintenance/postgres/mediawiki_mysql2postgres.pl
index 220c779b..2b2bf50e 100644
--- a/maintenance/postgres/mediawiki_mysql2postgres.pl
+++ b/maintenance/postgres/mediawiki_mysql2postgres.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
## Convert data from a MySQL mediawiki database into a Postgres mediawiki database
-## svn: $Id: mediawiki_mysql2postgres.pl 59489 2009-11-27 15:34:54Z greg $
+## svn: $Id: mediawiki_mysql2postgres.pl 65542 2010-04-26 13:46:04Z demon $
## NOTE: It is probably easier to dump your wiki using maintenance/dumpBackup.php
## and then import it with maintenance/importDump.php
@@ -181,7 +181,7 @@ $MYSQLSOCKET and $conninfo .= "\n-- socket $MYSQLSOCKET";
print qq{
-- Dump of MySQL Mediawiki tables for import into a Postgres Mediawiki schema
-- Performed by the program: $0
--- Version: $VERSION (subversion }.q{$LastChangedRevision: 59489 $}.qq{)
+-- Version: $VERSION (subversion }.q{$LastChangedRevision: 65542 $}.qq{)
-- Author: Greg Sabino Mullane <greg\@turnstep.com> Comments welcome
--
-- This file was created: $now
@@ -421,12 +421,6 @@ SELECT setval('trackbacks_tb_id_seq', 1+coalesce(max(tb_id) ,0),false) FROM tr
SELECT setval('user_user_id_seq', 1+coalesce(max(user_id),0),false) FROM mwuser;
};
-## Finally, make a record in the mediawiki_version table about this import
-print qq{
-INSERT INTO mediawiki_version (type,mw_version,notes) VALUES ('MySQL import','??',
-'Imported from file created on $now. Old version: $current_version');
-};
-
print "COMMIT;\n\\o\n\n-- End of dump\n\n";
select $oldselect;
close $mdump or die qq{Could not close "$MYSQLDUMPFILE": $!\n};
@@ -438,7 +432,6 @@ __DATA__
## or leave blank if it should be skipped
pagecontent text
mwuser user
-mediawiki_version
archive2
profiling
objectcache
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 38b607d9..8e869da7 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -34,13 +34,13 @@ INSERT INTO mwuser
VALUES (DEFAULT,'Anonymous','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,now(),now());
CREATE TABLE user_groups (
- ug_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
+ ug_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
ug_group TEXT NOT NULL
);
CREATE UNIQUE INDEX user_groups_unique ON user_groups (ug_user, ug_group);
CREATE TABLE user_newtalk (
- user_id INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
+ user_id INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
user_ip TEXT NULL,
user_last_timestamp TIMESTAMPTZ
);
@@ -68,6 +68,7 @@ CREATE INDEX page_talk_title ON page (page_title) WHERE page_namespace =
CREATE INDEX page_user_title ON page (page_title) WHERE page_namespace = 2;
CREATE INDEX page_utalk_title ON page (page_title) WHERE page_namespace = 3;
CREATE INDEX page_project_title ON page (page_title) WHERE page_namespace = 4;
+CREATE INDEX page_mediawiki_title ON page (page_title) WHERE page_namespace = 8;
CREATE INDEX page_random_idx ON page (page_random);
CREATE INDEX page_len_idx ON page (page_len);
@@ -85,10 +86,10 @@ CREATE TRIGGER page_deleted AFTER DELETE ON page
CREATE SEQUENCE revision_rev_id_seq;
CREATE TABLE revision (
rev_id INTEGER NOT NULL UNIQUE DEFAULT nextval('revision_rev_id_seq'),
- rev_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE,
+ rev_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
rev_text_id INTEGER NULL, -- FK
rev_comment TEXT,
- rev_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE RESTRICT,
+ rev_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
rev_user_text TEXT NOT NULL,
rev_timestamp TIMESTAMPTZ NOT NULL,
rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
@@ -114,7 +115,7 @@ CREATE TABLE pagecontent ( -- replaces reserved word 'text'
CREATE SEQUENCE page_restrictions_pr_id_seq;
CREATE TABLE page_restrictions (
pr_id INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq'),
- pr_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE,
+ pr_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
pr_type TEXT NOT NULL,
pr_level TEXT NOT NULL,
pr_cascade SMALLINT NOT NULL,
@@ -124,7 +125,7 @@ CREATE TABLE page_restrictions (
ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page,pr_type);
CREATE TABLE page_props (
- pp_page INTEGER NOT NULL REFERENCES page (page_id) ON DELETE CASCADE,
+ pp_page INTEGER NOT NULL REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
pp_propname TEXT NOT NULL,
pp_value TEXT NOT NULL
);
@@ -138,7 +139,7 @@ CREATE TABLE archive (
ar_page_id INTEGER NULL,
ar_parent_id INTEGER NULL,
ar_comment TEXT,
- ar_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ ar_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
ar_user_text TEXT NOT NULL,
ar_timestamp TIMESTAMPTZ NOT NULL,
ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
@@ -153,7 +154,7 @@ CREATE INDEX archive_user_text ON archive (ar_user_text);
CREATE TABLE redirect (
- rd_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ rd_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
rd_namespace SMALLINT NOT NULL,
rd_title TEXT NOT NULL,
rd_interwiki TEXT NULL,
@@ -163,14 +164,15 @@ CREATE INDEX redirect_ns_title ON redirect (rd_namespace,rd_title,rd_from);
CREATE TABLE pagelinks (
- pl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ pl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
pl_namespace SMALLINT NOT NULL,
pl_title TEXT NOT NULL
);
CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title);
+CREATE INDEX pagelinks_title ON pagelinks (pl_title);
CREATE TABLE templatelinks (
- tl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ tl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
tl_namespace SMALLINT NOT NULL,
tl_title TEXT NOT NULL
);
@@ -178,22 +180,25 @@ CREATE UNIQUE INDEX templatelinks_unique ON templatelinks (tl_namespace,tl_title
CREATE INDEX templatelinks_from ON templatelinks (tl_from);
CREATE TABLE imagelinks (
- il_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ il_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
il_to TEXT NOT NULL
);
CREATE UNIQUE INDEX il_from ON imagelinks (il_to,il_from);
CREATE TABLE categorylinks (
- cl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
- cl_to TEXT NOT NULL,
- cl_sortkey TEXT,
- cl_timestamp TIMESTAMPTZ NOT NULL
+ cl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+ cl_to TEXT NOT NULL,
+ cl_sortkey TEXT NULL,
+ cl_timestamp TIMESTAMPTZ NOT NULL,
+ cl_sortkey_prefix TEXT NOT NULL DEFAULT '',
+ cl_collation TEXT NOT NULL DEFAULT 0,
+ cl_type TEXT NOT NULL DEFAULT 'page'
);
CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to);
CREATE INDEX cl_sortkey ON categorylinks (cl_to, cl_sortkey, cl_from);
CREATE TABLE externallinks (
- el_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ el_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
el_to TEXT NOT NULL,
el_index TEXT NOT NULL
);
@@ -208,7 +213,7 @@ CREATE TABLE external_user (
CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
CREATE TABLE langlinks (
- ll_from INTEGER NOT NULL REFERENCES page (page_id) ON DELETE CASCADE,
+ ll_from INTEGER NOT NULL REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
ll_lang TEXT,
ll_title TEXT
);
@@ -237,8 +242,8 @@ CREATE SEQUENCE ipblocks_ipb_id_seq;
CREATE TABLE ipblocks (
ipb_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('ipblocks_ipb_id_seq'),
ipb_address TEXT NULL,
- ipb_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
- ipb_by INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
+ ipb_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+ ipb_by INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
ipb_by_text TEXT NOT NULL DEFAULT '',
ipb_reason TEXT NOT NULL,
ipb_timestamp TIMESTAMPTZ NOT NULL,
@@ -270,7 +275,7 @@ CREATE TABLE image (
img_major_mime TEXT DEFAULT 'unknown',
img_minor_mime TEXT DEFAULT 'unknown',
img_description TEXT NOT NULL,
- img_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ img_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
img_user_text TEXT NOT NULL,
img_timestamp TIMESTAMPTZ,
img_sha1 TEXT NOT NULL DEFAULT ''
@@ -287,7 +292,7 @@ CREATE TABLE oldimage (
oi_height INTEGER NOT NULL,
oi_bits SMALLINT NULL,
oi_description TEXT,
- oi_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ oi_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
oi_user_text TEXT NOT NULL,
oi_timestamp TIMESTAMPTZ NULL,
oi_metadata BYTEA NOT NULL DEFAULT '',
@@ -297,7 +302,7 @@ CREATE TABLE oldimage (
oi_deleted SMALLINT NOT NULL DEFAULT 0,
oi_sha1 TEXT NOT NULL DEFAULT ''
);
-ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX oi_name_timestamp ON oldimage (oi_name,oi_timestamp);
CREATE INDEX oi_name_archive_name ON oldimage (oi_name,oi_archive_name);
CREATE INDEX oi_sha1 ON oldimage (oi_sha1);
@@ -310,7 +315,7 @@ CREATE TABLE filearchive (
fa_archive_name TEXT,
fa_storage_group TEXT,
fa_storage_key TEXT,
- fa_deleted_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ fa_deleted_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
fa_deleted_timestamp TIMESTAMPTZ NOT NULL,
fa_deleted_reason TEXT,
fa_size INTEGER NOT NULL,
@@ -322,7 +327,7 @@ CREATE TABLE filearchive (
fa_major_mime TEXT DEFAULT 'unknown',
fa_minor_mime TEXT DEFAULT 'unknown',
fa_description TEXT NOT NULL,
- fa_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ fa_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
fa_user_text TEXT NOT NULL,
fa_timestamp TIMESTAMPTZ,
fa_deleted SMALLINT NOT NULL DEFAULT 0
@@ -338,7 +343,7 @@ CREATE TABLE recentchanges (
rc_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('recentchanges_rc_id_seq'),
rc_timestamp TIMESTAMPTZ NOT NULL,
rc_cur_time TIMESTAMPTZ NOT NULL,
- rc_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ rc_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
rc_user_text TEXT NOT NULL,
rc_namespace SMALLINT NOT NULL,
rc_title TEXT NOT NULL,
@@ -346,7 +351,7 @@ CREATE TABLE recentchanges (
rc_minor SMALLINT NOT NULL DEFAULT 0,
rc_bot SMALLINT NOT NULL DEFAULT 0,
rc_new SMALLINT NOT NULL DEFAULT 0,
- rc_cur_id INTEGER NULL REFERENCES page(page_id) ON DELETE SET NULL,
+ rc_cur_id INTEGER NULL REFERENCES page(page_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
rc_this_oldid INTEGER NOT NULL,
rc_last_oldid INTEGER NOT NULL,
rc_type SMALLINT NOT NULL DEFAULT 0,
@@ -371,7 +376,7 @@ CREATE INDEX rc_ip ON recentchanges (rc_ip);
CREATE TABLE watchlist (
- wl_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
+ wl_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
wl_namespace SMALLINT NOT NULL DEFAULT 0,
wl_title TEXT NOT NULL,
wl_notificationtimestamp TIMESTAMPTZ
@@ -392,7 +397,9 @@ CREATE TABLE interwiki (
iw_prefix TEXT NOT NULL UNIQUE,
iw_url TEXT NOT NULL,
iw_local SMALLINT NOT NULL,
- iw_trans SMALLINT NOT NULL DEFAULT 0
+ iw_trans SMALLINT NOT NULL DEFAULT 0,
+ iw_api TEXT NOT NULL DEFAULT '',
+ iw_wikiid TEXT NOT NULL DEFAULT ''
);
@@ -441,7 +448,7 @@ CREATE TABLE logging (
log_type TEXT NOT NULL,
log_action TEXT NOT NULL,
log_timestamp TIMESTAMPTZ NOT NULL,
- log_user INTEGER REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ log_user INTEGER REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
log_namespace SMALLINT NOT NULL,
log_title TEXT NOT NULL,
log_comment TEXT,
@@ -468,7 +475,7 @@ CREATE INDEX ls_log_id ON log_search (ls_log_id);
CREATE SEQUENCE trackbacks_tb_id_seq;
CREATE TABLE trackbacks (
tb_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('trackbacks_tb_id_seq'),
- tb_page INTEGER REFERENCES page(page_id) ON DELETE CASCADE,
+ tb_page INTEGER REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
tb_title TEXT NOT NULL,
tb_url TEXT NOT NULL,
tb_ex TEXT,
@@ -488,7 +495,7 @@ CREATE TABLE job (
CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
-- Tsearch2 2 stuff. Will fail if we don't have proper access to the tsearch2 tables
--- Note: if version 8.3 or higher, we remove the 'default' arg
+-- Version 8.3 or higher only. Previous versions would need another parmeter for to_tsvector.
-- Make sure you also change patch-tsearch2funcs.sql if the funcs below change.
ALTER TABLE page ADD titlevector tsvector;
@@ -496,9 +503,9 @@ CREATE FUNCTION ts2_page_title() RETURNS TRIGGER LANGUAGE plpgsql AS
$mw$
BEGIN
IF TG_OP = 'INSERT' THEN
- NEW.titlevector = to_tsvector('default',REPLACE(NEW.page_title,'/',' '));
+ NEW.titlevector = to_tsvector(REPLACE(NEW.page_title,'/',' '));
ELSIF NEW.page_title != OLD.page_title THEN
- NEW.titlevector := to_tsvector('default',REPLACE(NEW.page_title,'/',' '));
+ NEW.titlevector := to_tsvector(REPLACE(NEW.page_title,'/',' '));
END IF;
RETURN NEW;
END;
@@ -513,9 +520,9 @@ CREATE FUNCTION ts2_page_text() RETURNS TRIGGER LANGUAGE plpgsql AS
$mw$
BEGIN
IF TG_OP = 'INSERT' THEN
- NEW.textvector = to_tsvector('default',NEW.old_text);
+ NEW.textvector = to_tsvector(NEW.old_text);
ELSIF NEW.old_text != OLD.old_text THEN
- NEW.textvector := to_tsvector('default',NEW.old_text);
+ NEW.textvector := to_tsvector(NEW.old_text);
END IF;
RETURN NEW;
END;
@@ -549,7 +556,7 @@ CREATE UNIQUE INDEX pf_name_server ON profiling (pf_name, pf_server);
CREATE TABLE protected_titles (
pt_namespace SMALLINT NOT NULL,
pt_title TEXT NOT NULL,
- pt_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ pt_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
pt_reason TEXT NULL,
pt_timestamp TIMESTAMPTZ NOT NULL,
pt_expiry TIMESTAMPTZ NULL,
@@ -559,7 +566,8 @@ CREATE UNIQUE INDEX protected_titles_unique ON protected_titles(pt_namespace, pt
CREATE TABLE updatelog (
- ul_key TEXT NOT NULL PRIMARY KEY
+ ul_key TEXT NOT NULL PRIMARY KEY,
+ ul_value TEXT
);
@@ -602,37 +610,45 @@ CREATE TABLE valid_tag (
);
CREATE TABLE user_properties (
- up_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
+ up_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
up_property TEXT NOT NULL,
up_value TEXT
);
CREATE UNIQUE INDEX user_properties_user_property ON user_properties (up_user,up_property);
CREATE INDEX user_properties_property ON user_properties (up_property);
-CREATE TABLE mediawiki_version (
- type TEXT NOT NULL,
- mw_version TEXT NOT NULL,
- notes TEXT NULL,
+CREATE TABLE l10n_cache (
+ lc_lang TEXT NOT NULL,
+ lc_key TEXT NOT NULL,
+ lc_value TEXT NOT NULL
+);
+CREATE INDEX l10n_cache_lc_lang_key ON l10n_cache (lc_lang, lc_key);
- pg_version TEXT NULL,
- pg_dbname TEXT NULL,
- pg_user TEXT NULL,
- pg_port TEXT NULL,
- mw_schema TEXT NULL,
- ts2_schema TEXT NULL,
- ctype TEXT NULL,
+CREATE TABLE iwlinks (
+ iwl_from INTEGER NOT NULL DEFAULT 0,
+ iwl_prefix TEXT NOT NULL DEFAULT '',
+ iwl_title TEXT NOT NULL DEFAULT ''
+);
+CREATE UNIQUE INDEX iwl_from ON iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
- sql_version TEXT NULL,
- sql_date TEXT NULL,
- cdate TIMESTAMPTZ NOT NULL DEFAULT now()
+CREATE TABLE msg_resource (
+ mr_resource TEXT NOT NULL,
+ mr_lang TEXT NOT NULL,
+ mr_blob TEXT NOT NULL,
+ mr_timestamp TIMESTAMPTZ NOT NULL
);
+CREATE UNIQUE INDEX mr_resource_lang ON msg_resource (mr_resource, mr_lang);
-INSERT INTO mediawiki_version (type,mw_version,sql_version,sql_date)
- VALUES ('Creation','??','$LastChangedRevision: 59842 $','$LastChangedDate: 2009-12-09 06:32:17 +1100 (Wed, 09 Dec 2009) $');
+CREATE TABLE msg_resource_links (
+ mrl_resource TEXT NOT NULL,
+ mrl_message TEXT NOT NULL
+);
+CREATE UNIQUE INDEX mrl_message_resource ON msg_resource_links (mrl_message, mrl_resource);
-CREATE TABLE l10n_cache (
- lc_lang TEXT NOT NULL,
- lc_key TEXT NOT NULL,
- lc_value TEXT NOT NULL
+CREATE TABLE module_deps (
+ md_module TEXT NOT NULL,
+ md_skin TEXT NOT NULL,
+ md_deps TEXT NOT NULL
);
-CREATE INDEX l10n_cache_lc_lang_key ON l10n_cache (lc_lang, lc_key);
+CREATE UNIQUE INDEX md_module_skin ON module_deps (md_module, md_skin);
diff --git a/maintenance/preprocessorFuzzTest.php b/maintenance/preprocessorFuzzTest.php
index c271b117..31b372c2 100644
--- a/maintenance/preprocessorFuzzTest.php
+++ b/maintenance/preprocessorFuzzTest.php
@@ -4,28 +4,28 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
$wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
class PPFuzzTester {
var $hairs = array(
- '[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
+ '[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
'<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
'<!--' , '-->',
"\n==", "==\n",
'|', '=', "\n", ' ', "\t", "\x7f",
'~~', '~~~', '~~~~', 'subst:',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
// extensions
- //'<ref>', '</ref>', '<references/>',
+ // '<ref>', '</ref>', '<references/>',
);
var $minLength = 0;
var $maxLength = 20;
var $maxTemplates = 5;
- //var $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
+ // var $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
var $entryPoints = array( 'testSrvus', 'testPst', 'testPreprocess' );
var $verbose = false;
static $currentTest = false;
@@ -51,7 +51,7 @@ class PPFuzzTester {
$exceptionReport = $e->getText();
$hash = md5( $testReport );
file_put_contents( "results/ppft-$hash.in", serialize( self::$currentTest ) );
- file_put_contents( "results/ppft-$hash.fail",
+ file_put_contents( "results/ppft-$hash.fail",
"Input:\n$testReport\n\nException report:\n$exceptionReport\n" );
print "Test $hash failed\n";
$passed = 'failed';
@@ -99,7 +99,7 @@ class PPFuzzTester {
$s .= $this->hairs[$hairIndex];
}
// Send through the UTF-8 normaliser
- // This resolves a few differences between the old preprocessor and the
+ // This resolves a few differences between the old preprocessor and the
// XML-based one, which doesn't like illegals and converts line endings.
// It's done by the MW UI, so it's a reasonably legitimate thing to do.
global $wgContLang;
@@ -131,16 +131,16 @@ class PPFuzzTest {
$this->parent = $tester;
$this->mainText = $tester->makeInputText();
$this->title = $tester->makeTitle();
- //$this->outputType = $tester->pickOutputType();
+ // $this->outputType = $tester->pickOutputType();
$this->entryPoint = $tester->pickEntryPoint();
- $this->nickname = $tester->makeInputText( $wgMaxSigChars + 10);
+ $this->nickname = $tester->makeInputText( $wgMaxSigChars + 10 );
$this->fancySig = (bool)mt_rand( 0, 1 );
$this->templates = array();
}
function templateHook( $title ) {
$titleText = $title->getPrefixedDBkey();
-
+
if ( !isset( $this->templates[$titleText] ) ) {
$finalTitle = $title;
if ( count( $this->templates ) >= $this->parent->maxTemplates ) {
@@ -182,9 +182,9 @@ class PPFuzzTest {
function getReport() {
$s = "Title: " . $this->title->getPrefixedDBkey() . "\n" .
-// "Output type: {$this->outputType}\n" .
- "Entry point: {$this->entryPoint}\n" .
- "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) . ' ' . var_export( $this->nickname, true ) . "\n" .
+// "Output type: {$this->outputType}\n" .
+ "Entry point: {$this->entryPoint}\n" .
+ "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) . ' ' . var_export( $this->nickname, true ) . "\n" .
"Main text: " . var_export( $this->mainText, true ) . "\n";
foreach ( $this->templates as $titleText => $template ) {
$finalTitle = $template['finalTitle'];
diff --git a/maintenance/protect.php b/maintenance/protect.php
index 126707a7..baef45fb 100644
--- a/maintenance/protect.php
+++ b/maintenance/protect.php
@@ -18,7 +18,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class Protect extends Maintenance {
public function __construct() {
@@ -28,34 +28,35 @@ class Protect extends Maintenance {
$this->addOption( 'semiprotect', 'Adds semi-protection' );
$this->addOption( 'u', 'Username to protect with', false, true );
$this->addOption( 'r', 'Reason for un/protection', false, true );
+ $this->addArg( 'title', 'Title to protect', true );
}
public function execute() {
- global $wgUser, $wgTitle, $wgArticle;
+ global $wgUser;
$userName = $this->getOption( 'u', 'Maintenance script' );
$reason = $this->getOption( 'r', '' );
$protection = "sysop";
- if ( $this->hasOption('semiprotect') ) {
+ if ( $this->hasOption( 'semiprotect' ) ) {
$protection = "autoconfirmed";
- } elseif ( $this->hasOption('unprotect') ) {
+ } elseif ( $this->hasOption( 'unprotect' ) ) {
$protection = "";
}
$wgUser = User::newFromName( $userName );
$restrictions = array( 'edit' => $protection, 'move' => $protection );
- $wgTitle = Title::newFromText( $this->getArg() );
- if ( !$wgTitle ) {
+ $t = Title::newFromText( $this->getArg() );
+ if ( !$t ) {
$this->error( "Invalid title", true );
}
- $wgArticle = new Article( $wgTitle );
+ $article = new Article( $t );
# un/protect the article
$this->output( "Updating protection status... " );
- $success = $wgArticle->updateRestrictions($restrictions, $reason);
+ $success = $article->updateRestrictions( $restrictions, $reason );
if ( $success ) {
$this->output( "done\n" );
} else {
@@ -65,4 +66,4 @@ class Protect extends Maintenance {
}
$maintClass = "Protect";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/purgeList.php b/maintenance/purgeList.php
index 7168a203..17be6d3d 100644
--- a/maintenance/purgeList.php
+++ b/maintenance/purgeList.php
@@ -20,29 +20,30 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PurgeList extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Send purge requests for listed pages to squid";
+ $this->addOption( 'purge', 'Whether to update page touched.' , false, false );
}
public function execute() {
$stdin = $this->getStdin();
$urls = array();
- while( !feof( $stdin ) ) {
+ while ( !feof( $stdin ) ) {
$page = trim( fgets( $stdin ) );
if ( substr( $page, 0, 7 ) == 'http://' ) {
$urls[] = $page;
- } elseif( $page !== '' ) {
+ } elseif ( $page !== '' ) {
$title = Title::newFromText( $page );
- if( $title ) {
+ if ( $title ) {
$url = $title->getFullUrl();
$this->output( "$url\n" );
$urls[] = $url;
- if( isset( $options['purge'] ) ) {
+ if ( $this->getOptions( 'purge' ) ) {
$title->invalidateCache();
}
} else {
@@ -60,4 +61,4 @@ class PurgeList extends Maintenance {
}
$maintClass = "PurgeList";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/purgeOldText.inc b/maintenance/purgeOldText.inc
index 0bd5f2eb..381d62a7 100644
--- a/maintenance/purgeOldText.inc
+++ b/maintenance/purgeOldText.inc
@@ -9,54 +9,54 @@
*/
function PurgeRedundantText( $delete = false ) {
-
+
# Data should come off the master, wrapped in a transaction
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
-
+
$tbl_arc = $dbw->tableName( 'archive' );
$tbl_rev = $dbw->tableName( 'revision' );
$tbl_txt = $dbw->tableName( 'text' );
-
+
# Get "active" text records from the revisions table
echo( "Searching for active text records in revisions table..." );
$res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
- while( $row = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$cur[] = $row->rev_text_id;
}
echo( "done.\n" );
-
+
# Get "active" text records from the archive table
echo( "Searching for active text records in archive table..." );
$res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
- while( $row = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$cur[] = $row->ar_text_id;
}
echo( "done.\n" );
-
+
# Get the IDs of all text records not in these sets
echo( "Searching for inactive text records..." );
$set = implode( ', ', $cur );
$res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" );
$old = array();
- while( $row = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$old[] = $row->old_id;
}
echo( "done.\n" );
-
+
# Inform the user of what we're going to do
$count = count( $old );
echo( "$count inactive items found.\n" );
-
+
# Delete as appropriate
- if( $delete && $count ) {
+ if ( $delete && $count ) {
echo( "Deleting..." );
$set = implode( ', ', $old );
$dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
echo( "done.\n" );
}
-
+
# Done
$dbw->commit();
-
+
}
diff --git a/maintenance/purgeOldText.php b/maintenance/purgeOldText.php
index 9621cb39..0cbc724e 100644
--- a/maintenance/purgeOldText.php
+++ b/maintenance/purgeOldText.php
@@ -21,7 +21,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class PurgeOldText extends Maintenance {
public function __construct() {
@@ -29,11 +29,11 @@ class PurgeOldText extends Maintenance {
$this->mDescription = "Purge old text records from the database";
$this->addOption( 'purge', 'Performs the deletion' );
}
-
+
public function execute() {
- $this->purgeRedundantText( $this->hasOption('purge') );
+ $this->purgeRedundantText( $this->hasOption( 'purge' ) );
}
}
$maintClass = "PurgeOldText";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/reassignEdits.php b/maintenance/reassignEdits.php
index e595e5b3..039422b3 100644
--- a/maintenance/reassignEdits.php
+++ b/maintenance/reassignEdits.php
@@ -22,7 +22,7 @@
* @licence GNU General Public Licence 2.0 or later
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ReassignEdits extends Maintenance {
public function __construct() {
@@ -34,21 +34,22 @@ class ReassignEdits extends Maintenance {
$this->addArg( 'from', 'Old user to take edits from' );
$this->addArg( 'to', 'New user to give edits to' );
}
-
+
public function execute() {
- if( $this->hasArg(0) && $this->hasArg(1) ) {
+ if ( $this->hasArg( 0 ) && $this->hasArg( 1 ) ) {
# Set up the users involved
- $from = $this->initialiseUser( $this->getArg(0) );
- $to = $this->initialiseUser( $this->getArg(1) );
-
+ $from = $this->initialiseUser( $this->getArg( 0 ) );
+ $to = $this->initialiseUser( $this->getArg( 1 ) );
+
# If the target doesn't exist, and --force is not set, stop here
- if( $to->getId() || $this->hasOption('force') ) {
+ if ( $to->getId() || $this->hasOption( 'force' ) ) {
# Reassign the edits
- $report = $this->hasOption('report');
- $count = $this->doReassignEdits( $from, $to, !$this->hasOption('norc'), $report );
- # If reporting, and there were items, advise the user to run without --report
- if( $report )
+ $report = $this->hasOption( 'report' );
+ $this->doReassignEdits( $from, $to, !$this->hasOption( 'norc' ), $report );
+ # If reporting, and there were items, advise the user to run without --report
+ if ( $report ) {
$this->output( "Run the script again without --report to update.\n" );
+ }
} else {
$ton = $to->getName();
$this->error( "User '{$ton}' not found." );
@@ -83,7 +84,7 @@ class ReassignEdits extends Maintenance {
$this->output( "found {$del}.\n" );
# Don't count recent changes if we're not supposed to
- if( $rc ) {
+ if ( $rc ) {
$this->output( "Checking recent changes..." );
$res = $dbw->select( 'recentchanges', 'COUNT(*) AS count', $this->userConditions( $from, 'rc_user', 'rc_user_text' ), __METHOD__ );
$row = $dbw->fetchObject( $res );
@@ -92,31 +93,34 @@ class ReassignEdits extends Maintenance {
} else {
$rec = 0;
}
-
+
$total = $cur + $del + $rec;
$this->output( "\nTotal entries to change: {$total}\n" );
-
- if( !$report ) {
- if( $total ) {
+
+ if ( !$report ) {
+ if ( $total ) {
# Reassign edits
$this->output( "\nReassigning current edits..." );
- $res = $dbw->update( 'revision', $this->userSpecification( $to, 'rev_user', 'rev_user_text' ), $this->userConditions( $from, 'rev_user', 'rev_user_text' ), __METHOD__ );
+ $dbw->update( 'revision', $this->userSpecification( $to, 'rev_user', 'rev_user_text' ),
+ $this->userConditions( $from, 'rev_user', 'rev_user_text' ), __METHOD__ );
$this->output( "done.\nReassigning deleted edits..." );
- $res = $dbw->update( 'archive', $this->userSpecification( $to, 'ar_user', 'ar_user_text' ), $this->userConditions( $from, 'ar_user', 'ar_user_text' ), __METHOD__ );
+ $dbw->update( 'archive', $this->userSpecification( $to, 'ar_user', 'ar_user_text' ),
+ $this->userConditions( $from, 'ar_user', 'ar_user_text' ), __METHOD__ );
$this->output( "done.\n" );
# Update recent changes if required
- if( $rc ) {
+ if ( $rc ) {
$this->output( "Updating recent changes..." );
- $res = $dbw->update( 'recentchanges', $this->userSpecification( $to, 'rc_user', 'rc_user_text' ), $this->userConditions( $from, 'rc_user', 'rc_user_text' ), __METHOD__ );
+ $dbw->update( 'recentchanges', $this->userSpecification( $to, 'rc_user', 'rc_user_text' ),
+ $this->userConditions( $from, 'rc_user', 'rc_user_text' ), __METHOD__ );
$this->output( "done.\n" );
}
- }
+ }
}
-
+
$dbw->commit();
- return (int)$total;
+ return (int)$total;
}
-
+
/**
* Return the most efficient set of user conditions
* i.e. a user => id mapping, or a user_text => text mapping
@@ -129,7 +133,7 @@ class ReassignEdits extends Maintenance {
private function userConditions( &$user, $idfield, $utfield ) {
return $user->getId() ? array( $idfield => $user->getId() ) : array( $utfield => $user->getName() );
}
-
+
/**
* Return user specifications
* i.e. user => id, user_text => text
@@ -142,7 +146,7 @@ class ReassignEdits extends Maintenance {
private function userSpecification( &$user, $idfield, $utfield ) {
return array( $idfield => $user->getId(), $utfield => $user->getName() );
}
-
+
/**
* Initialise the user object
*
@@ -150,7 +154,7 @@ class ReassignEdits extends Maintenance {
* @return User
*/
private function initialiseUser( $username ) {
- if( User::isIP( $username ) ) {
+ if ( User::isIP( $username ) ) {
$user = new User();
$user->setId( 0 );
$user->setName( $username );
@@ -165,5 +169,5 @@ class ReassignEdits extends Maintenance {
}
$maintClass = "ReassignEdits";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildFileCache.php b/maintenance/rebuildFileCache.php
index 2a4e4884..a1aecd80 100644
--- a/maintenance/rebuildFileCache.php
+++ b/maintenance/rebuildFileCache.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RebuildFileCache extends Maintenance {
public function __construct() {
@@ -32,24 +32,24 @@ class RebuildFileCache extends Maintenance {
}
public function execute() {
- global $wgUseFileCache, $wgDisableCounters, $wgContentNamespaces;
+ global $wgUseFileCache, $wgDisableCounters, $wgContentNamespaces, $wgRequestTime;
global $wgTitle, $wgArticle, $wgOut, $wgUser;
- if( !$wgUseFileCache ) {
+ if ( !$wgUseFileCache ) {
$this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true );
}
$wgDisableCounters = false;
$start = $this->getArg( 0, "0" );
- if( !ctype_digit($start) ) {
+ if ( !ctype_digit( $start ) ) {
$this->error( "Invalid value for start parameter.", true );
}
- $start = intval($start);
- $overwrite = $this->hasArg(1) && $this->getArg(1) === 'overwrite';
+ $start = intval( $start );
+ $overwrite = $this->hasArg( 1 ) && $this->getArg( 1 ) === 'overwrite';
$this->output( "Building content page file cache from page {$start}!\n" );
$dbr = wfGetDB( DB_SLAVE );
$start = $start > 0 ? $start : $dbr->selectField( 'page', 'MIN(page_id)', false, __FUNCTION__ );
$end = $dbr->selectField( 'page', 'MAX(page_id)', false, __FUNCTION__ );
- if( !$start ) {
+ if ( !$start ) {
$this->error( "Nothing to do.", true );
}
@@ -60,20 +60,21 @@ class RebuildFileCache extends Maintenance {
$end += $this->mBatchSize - 1;
$blockStart = $start;
$blockEnd = $start + $this->mBatchSize - 1;
-
+
$dbw = wfGetDB( DB_MASTER );
// Go through each page and save the output
- while( $blockEnd <= $end ) {
+ while ( $blockEnd <= $end ) {
// Get the pages
- $res = $dbr->select( 'page', array('page_namespace','page_title','page_id'),
- array('page_namespace' => $wgContentNamespaces,
+ $res = $dbr->select( 'page', array( 'page_namespace', 'page_title', 'page_id' ),
+ array( 'page_namespace' => $wgContentNamespaces,
"page_id BETWEEN $blockStart AND $blockEnd" ),
- array('ORDER BY' => 'page_id ASC','USE INDEX' => 'PRIMARY')
+ array( 'ORDER BY' => 'page_id ASC', 'USE INDEX' => 'PRIMARY' )
);
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$rebuilt = false;
+ $wgRequestTime = wfTime(); # bug 22852
$wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- if( null == $wgTitle ) {
+ if ( null == $wgTitle ) {
$this->output( "Page {$row->page_id} has bad title\n" );
continue; // broken title?
}
@@ -81,24 +82,24 @@ class RebuildFileCache extends Maintenance {
$wgUser->getSkin( $wgTitle ); // set skin title
$wgArticle = new Article( $wgTitle );
// If the article is cacheable, then load it
- if( $wgArticle->isFileCacheable() ) {
+ if ( $wgArticle->isFileCacheable() ) {
$cache = new HTMLFileCache( $wgTitle );
- if( $cache->isFileCacheGood() ) {
- if( $overwrite ) {
+ if ( $cache->isFileCacheGood() ) {
+ if ( $overwrite ) {
$rebuilt = true;
} else {
$this->output( "Page {$row->page_id} already cached\n" );
continue; // done already!
}
}
- ob_start( array(&$cache, 'saveToFileCache' ) ); // save on ob_end_clean()
+ ob_start( array( &$cache, 'saveToFileCache' ) ); // save on ob_end_clean()
$wgUseFileCache = false; // hack, we don't want $wgArticle fiddling with filecache
$wgArticle->view();
@$wgOut->output(); // header notices
$wgUseFileCache = true;
ob_end_clean(); // clear buffer
$wgOut = new OutputPage(); // empty out any output page garbage
- if( $rebuilt )
+ if ( $rebuilt )
$this->output( "Re-cached page {$row->page_id}\n" );
else
$this->output( "Cached page {$row->page_id}\n" );
@@ -112,14 +113,14 @@ class RebuildFileCache extends Maintenance {
wfWaitForSlaves( 5 );
}
$this->output( "Done!\n" );
-
+
// Remove these to be safe
- if( isset($wgTitle) )
- unset($wgTitle);
- if( isset($wgArticle) )
- unset($wgArticle);
+ if ( isset( $wgTitle ) )
+ unset( $wgTitle );
+ if ( isset( $wgArticle ) )
+ unset( $wgArticle );
}
}
$maintClass = "RebuildFileCache";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildImages.php b/maintenance/rebuildImages.php
index 0d3bdb3f..1848b104 100644
--- a/maintenance/rebuildImages.php
+++ b/maintenance/rebuildImages.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Script to update image metadata records
*
* Usage: php rebuildImages.php [--missing] [--dry-run]
@@ -7,7 +7,7 @@
* --missing Crawl the uploads dir for images without records, and
* add them only.
*
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -27,23 +27,34 @@
*
* @file
* @author Brion Vibber <brion at pobox.com>
- * @ingrouo maintenance
+ * @ingroup maintenance
*/
-$options = array( 'missing', 'dry-run' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-require_once( 'FiveUpgrade.inc' );
+class ImageBuilder extends Maintenance {
+ function __construct() {
+ parent::__construct();
-class ImageBuilder extends FiveUpgrade {
- function ImageBuilder( $dryrun = false ) {
- parent::FiveUpgrade();
+ $this->mDescription = 'Script to update image metadata records';
+ $this->addOption( 'missing', 'Check for files without associated database record' );
+ $this->addOption( 'dry-run', 'Only report, don\'t update the database' );
+ }
+
+ public function execute() {
+ $this->dbw = wfGetDB( DB_MASTER );
$this->maxLag = 10; # if slaves are lagged more than 10 secs, wait
- $this->dryrun = $dryrun;
- if ( $dryrun ) {
+ $this->dryrun = $this->hasOption( 'dry-run' );
+ if ( $this->dryrun ) {
$GLOBALS['wgReadOnly'] = 'Dry run mode, image upgrades are suppressed';
}
+
+ if ( $this->hasOption( 'missing' ) ) {
+ $this->crawlMissing();
+ } else {
+ $this->build();
+ }
}
function getRepo() {
@@ -69,7 +80,7 @@ class ImageBuilder extends FiveUpgrade {
function progress( $updated ) {
$this->updated += $updated;
$this->processed++;
- if( $this->processed % 100 != 0 ) {
+ if ( $this->processed % 100 != 0 ) {
return;
}
$portion = $this->processed / $this->count;
@@ -79,44 +90,40 @@ class ImageBuilder extends FiveUpgrade {
$delta = $now - $this->startTime;
$estimatedTotalTime = $delta / $portion;
$eta = $this->startTime + $estimatedTotalTime;
+ $rate = $this->processed / $delta;
- printf( "%s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec <%.2f%% updated>\n",
+ $this->output( sprintf( "%s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec <%.2f%% updated>\n",
wfTimestamp( TS_DB, intval( $now ) ),
$portion * 100.0,
$this->table,
wfTimestamp( TS_DB, intval( $eta ) ),
- $completed, // $completed does not appear to be defined.
+ $this->processed,
$this->count,
- $rate, // $rate does not appear to be defined.
- $updateRate * 100.0 );
+ $rate,
+ $updateRate * 100.0 ) );
flush();
}
function buildTable( $table, $key, $callback ) {
- $fname = 'ImageBuilder::buildTable';
-
- $count = $this->dbw->selectField( $table, 'count(*)', '', $fname );
+ $count = $this->dbw->selectField( $table, 'count(*)', '', __METHOD__ );
$this->init( $count, $table );
- $this->log( "Processing $table..." );
+ $this->output( "Processing $table...\n" );
- $tableName = $this->dbr->tableName( $table );
- $sql = "SELECT * FROM $tableName";
- $result = $this->dbr->query( $sql, $fname );
+ $result = wfGetDB( DB_SLAVE )->select( $table, '*', array(), __METHOD__ );
- while( $row = $this->dbr->fetchObject( $result ) ) {
+ foreach ( $result as $row ) {
$update = call_user_func( $callback, $row, null );
- if( $update ) {
+ if ( $update ) {
$this->progress( 1 );
} else {
$this->progress( 0 );
}
}
- $this->log( "Finished $table... $this->updated of $this->processed rows updated" );
- $this->dbr->freeResult( $result );
+ $this->output( "Finished $table... $this->updated of $this->processed rows updated\n" );
}
function buildImage() {
- $callback = array( &$this, 'imageCallback' );
+ $callback = array( $this, 'imageCallback' );
$this->buildTable( 'image', 'img_name', $callback );
}
@@ -129,14 +136,14 @@ class ImageBuilder extends FiveUpgrade {
function buildOldImage() {
$this->buildTable( 'oldimage', 'oi_archive_name',
- array( &$this, 'oldimageCallback' ) );
+ array( $this, 'oldimageCallback' ) );
}
function oldimageCallback( $row, $copy ) {
// Create a File object from the row
// This will also upgrade it
if ( $row->oi_archive_name == '' ) {
- $this->log( "Empty oi_archive_name for oi_name={$row->oi_name}" );
+ $this->output( "Empty oi_archive_name for oi_name={$row->oi_name}\n" );
return false;
}
$file = $this->getRepo()->newFileFromRow( $row );
@@ -149,21 +156,20 @@ class ImageBuilder extends FiveUpgrade {
}
function checkMissingImage( $fullpath ) {
- $fname = 'ImageBuilder::checkMissingImage';
$filename = wfBaseName( $fullpath );
- if( is_dir( $fullpath ) ) {
+ if ( is_dir( $fullpath ) ) {
return;
}
- if( is_link( $fullpath ) ) {
- $this->log( "skipping symlink at $fullpath" );
+ if ( is_link( $fullpath ) ) {
+ $this->output( "skipping symlink at $fullpath\n" );
return;
}
$row = $this->dbw->selectRow( 'image',
array( 'img_name' ),
array( 'img_name' => $filename ),
- $fname );
+ __METHOD__ );
- if( $row ) {
+ if ( $row ) {
// already known, move on
return;
} else {
@@ -172,43 +178,35 @@ class ImageBuilder extends FiveUpgrade {
}
function addMissingImage( $filename, $fullpath ) {
- $fname = 'ImageBuilder::addMissingImage';
-
$timestamp = $this->dbw->timestamp( filemtime( $fullpath ) );
global $wgContLang;
$altname = $wgContLang->checkTitleEncoding( $filename );
- if( $altname != $filename ) {
- if( $this->dryrun ) {
+ if ( $altname != $filename ) {
+ if ( $this->dryrun ) {
$filename = $altname;
- $this->log( "Estimating transcoding... $altname" );
+ $this->output( "Estimating transcoding... $altname\n" );
} else {
$filename = $this->renameFile( $filename );
}
}
- if( $filename == '' ) {
- $this->log( "Empty filename for $fullpath" );
+ if ( $filename == '' ) {
+ $this->output( "Empty filename for $fullpath\n" );
return;
}
if ( !$this->dryrun ) {
$file = wfLocalFile( $filename );
- if ( !$file->recordUpload( '', '(recovered file, missing upload log entry)', '', '', '',
+ if ( !$file->recordUpload( '', '(recovered file, missing upload log entry)', '', '', '',
false, $timestamp ) )
{
- $this->log( "Error uploading file $fullpath" );
+ $this->output( "Error uploading file $fullpath\n" );
return;
}
}
- $this->log( $fullpath );
+ $this->output( $fullpath . "\n" );
}
}
-$builder = new ImageBuilder( isset( $options['dry-run'] ) );
-if( isset( $options['missing'] ) ) {
- $builder->crawlMissing();
-} else {
- $builder->build();
-}
-
-
+$maintClass = 'ImageBuilder';
+require( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildInterwiki.inc b/maintenance/rebuildInterwiki.inc
deleted file mode 100644
index 93261f86..00000000
--- a/maintenance/rebuildInterwiki.inc
+++ /dev/null
@@ -1,259 +0,0 @@
-<?php
-/**
- * Rebuild interwiki table using the file on meta and the language list
- * Wikimedia specific!
- *
- * @file
- * @todo document
- * @ingroup Maintenance
- * @ingroup Wikimedia
- */
-
-/**
- * @todo document
- * @ingroup Maintenance
- */
-class Site {
- var $suffix, $lateral, $url;
-
- function __construct( $s, $l, $u ) {
- $this->suffix = $s;
- $this->lateral = $l;
- $this->url = $u;
- }
-
- function getURL( $lang ) {
- $xlang = str_replace( '_', '-', $lang );
- return "http://$xlang.{$this->url}/wiki/\$1";
- }
-}
-
-function makeInterwikiSQL( $destDir ) {
- global $langlist, $languageAliases, $prefixRewrites;
-
- # Multi-language sites
- # db suffix => db suffix, iw prefix, hostname
- $sites = array(
- 'wiki' => new Site( 'wiki', 'w', 'wikipedia.org' ),
- 'wiktionary' => new Site( 'wiktionary', 'wikt', 'wiktionary.org' ),
- 'wikiquote' => new Site( 'wikiquote', 'q', 'wikiquote.org' ),
- 'wikibooks' => new Site( 'wikibooks', 'b', 'wikibooks.org' ),
- 'wikinews' => new Site( 'wikinews', 'n', 'wikinews.org' ),
- 'wikisource' => new Site( 'wikisource', 's', 'wikisource.org' ),
- 'wikimedia' => new Site( 'wikimedia', 'chapter', 'wikimedia.org' ),
- 'wikiversity' => new Site( 'wikiversity', 'v', 'wikiversity.org' ),
- );
-
- # List of language prefixes likely to be found in multi-language sites
- $langlist = array_map( "trim", file( "/home/wikipedia/common/langlist" ) );
-
- # List of all database names
- $dblist = array_map( "trim", file( "/home/wikipedia/common/all.dblist" ) );
-
- # Special-case hostnames
- $specials = array(
- 'sourceswiki' => 'sources.wikipedia.org',
- 'quotewiki' => 'wikiquote.org',
- 'textbookwiki' => 'wikibooks.org',
- 'sep11wiki' => 'sep11.wikipedia.org',
- 'metawiki' => 'meta.wikimedia.org',
- 'commonswiki' => 'commons.wikimedia.org',
- 'specieswiki' => 'species.wikimedia.org',
- );
-
- # Extra interwiki links that can't be in the intermap for some reason
- $extraLinks = array(
- array( 'm', 'http://meta.wikimedia.org/wiki/$1', 1 ),
- array( 'meta', 'http://meta.wikimedia.org/wiki/$1', 1 ),
- array( 'sep11', 'http://sep11.wikipedia.org/wiki/$1', 1 ),
- );
-
- # Language aliases, usually configured as redirects to the real wiki in apache
- # Interlanguage links are made directly to the real wiki
- # Something horrible happens if you forget to list an alias here, I can't
- # remember what
- $languageAliases = array(
- 'zh-cn' => 'zh',
- 'zh-tw' => 'zh',
- 'dk' => 'da',
- 'nb' => 'no',
- );
-
- # Special case prefix rewrites, for the benefit of Swedish which uses s:t
- # as an abbreviation for saint
- $prefixRewrites = array(
- 'svwiki' => array( 's' => 'src' ),
- );
-
- # Construct a list of reserved prefixes
- $reserved = array();
- foreach ( $langlist as $lang ) {
- $reserved[$lang] = 1;
- }
- foreach ( $languageAliases as $alias => $lang ) {
- $reserved[$alias] = 1;
- }
- foreach( $sites as $site ) {
- $reserved[$site->lateral] = 1;
- }
-
- # Extract the intermap from meta
- $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 );
- $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) );
-
- if ( !$lines || count( $lines ) < 2 ) {
- wfDie( "m:Interwiki_map not found" );
- }
-
- $iwArray = array();
-
- foreach ( $lines as $line ) {
- $matches = array();
- if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(https?:\/\/.*?)\s*$/', $line, $matches ) ) {
- $prefix = strtolower( $matches[1] );
- $url = $matches[2];
- if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia)\.org/', $url ) ) {
- $local = 1;
- } else {
- $local = 0;
- }
-
- if ( empty( $reserved[$prefix] ) ) {
- $iwArray[$prefix] = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local );
- }
- }
- }
-
-
-
- foreach ( $dblist as $db ) {
- $sql = "-- Generated by rebuildInterwiki.php";
- if ( isset( $specials[$db] ) ) {
- # Special wiki
- # Has interwiki links and interlanguage links to wikipedia
-
- $host = $specials[$db];
- $sql .= "\n--$host\n\n";
- $sql .= "USE $db;\n" .
- "TRUNCATE TABLE interwiki;\n" .
- "INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES \n";
- $first = true;
-
- # Intermap links
- foreach ( $iwArray as $iwEntry ) {
- $sql .= makeLink( $iwEntry, $first, $db );
- }
-
- # Links to multilanguage sites
- foreach ( $sites as $targetSite ) {
- $sql .= makeLink( array( $targetSite->lateral, $targetSite->getURL( 'en' ), 1 ), $first, $db );
- }
-
- # Interlanguage links to wikipedia
- $sql .= makeLanguageLinks( $sites['wiki'], $first, $db );
-
- # Extra links
- foreach ( $extraLinks as $link ) {
- $sql .= makeLink( $link, $first, $db );
- }
-
- $sql .= ";\n";
- } else {
- # Find out which site this DB belongs to
- $site = false;
- foreach( $sites as $candidateSite ) {
- $suffix = $candidateSite->suffix;
- if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) {
- $site = $candidateSite;
- break;
- }
- }
- if ( !$site ) {
- print "Invalid database $db\n";
- continue;
- }
- $lang = $matches[1];
- $host = "$lang." . $site->url;
- $sql .= "\n--$host\n\n";
-
- $sql .= "USE $db;\n" .
- "TRUNCATE TABLE interwiki;\n" .
- "INSERT INTO interwiki (iw_prefix,iw_url,iw_local) VALUES\n";
- $first = true;
-
- # Intermap links
- foreach ( $iwArray as $iwEntry ) {
- # Suppress links with the same name as the site
- if ( ( $suffix == 'wiki' && $iwEntry['iw_prefix'] != 'wikipedia' ) ||
- ( $suffix != 'wiki' && $suffix != $iwEntry['iw_prefix'] ) )
- {
- $sql .= makeLink( $iwEntry, $first, $db );
- }
- }
-
- # Lateral links
- foreach ( $sites as $targetSite ) {
- # Suppress link to self
- if ( $targetSite->suffix != $site->suffix ) {
- $sql .= makeLink( array( $targetSite->lateral, $targetSite->getURL( $lang ), 1 ), $first, $db );
- }
- }
-
- # Interlanguage links
- $sql .= makeLanguageLinks( $site, $first, $db );
-
- # w link within wikipedias
- # Other sites already have it as a lateral link
- if ( $site->suffix == "wiki" ) {
- $sql .= makeLink( array("w", "http://en.wikipedia.org/wiki/$1", 1), $first, $db );
- }
-
- # Extra links
- foreach ( $extraLinks as $link ){
- $sql .= makeLink( $link, $first, $db );
- }
- $sql .= ";\n";
- }
- file_put_contents( "$destDir/$db.sql", $sql );
- }
-}
-
-# ------------------------------------------------------------------------------------------
-
-# Returns part of an INSERT statement, corresponding to all interlanguage links to a particular site
-function makeLanguageLinks( &$site, &$first, $source ) {
- global $langlist, $languageAliases;
-
- $sql = "";
-
- # Actual languages with their own databases
- foreach ( $langlist as $targetLang ) {
- $sql .= makeLink( array( $targetLang, $site->getURL( $targetLang ), 1 ), $first, $source );
- }
-
- # Language aliases
- foreach ( $languageAliases as $alias => $lang ) {
- $sql .= makeLink( array( $alias, $site->getURL( $lang ), 1 ), $first, $source );
- }
- return $sql;
-}
-
-# Make SQL for a single link from an array
-function makeLink( $entry, &$first, $source ) {
- global $prefixRewrites;
-
- if ( isset( $prefixRewrites[$source] ) && isset( $prefixRewrites[$source][$entry[0]] ) ) {
- $entry[0] = $prefixRewrites[$source][$entry[0]];
- }
-
- $sql = "";
- # Add comma
- if ( $first ) {
- $first = false;
- } else {
- $sql .= ",\n";
- }
- $dbr = wfGetDB( DB_SLAVE );
- $sql .= "(" . $dbr->makeList( $entry ) . ")";
- return $sql;
-}
diff --git a/maintenance/rebuildInterwiki.php b/maintenance/rebuildInterwiki.php
index d3f3a4d2..3da920f8 100644
--- a/maintenance/rebuildInterwiki.php
+++ b/maintenance/rebuildInterwiki.php
@@ -9,21 +9,269 @@
* @ingroup Wikimedia
*/
-/** */
-$oldCwd = getcwd();
-
-$optionsWithArgs = array( "d" );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-require( "rebuildInterwiki.inc" );
-chdir( $oldCwd );
-
-# Output
-if ( isset( $options['d'] ) ) {
- $destDir = $options['d'];
-} else {
- $destDir = '/home/wikipedia/conf/interwiki/sql';
+/**
+ * @todo document
+ * @ingroup Maintenance
+ */
+class Site {
+ var $suffix, $lateral, $url;
+
+ function __construct( $s, $l, $u ) {
+ $this->suffix = $s;
+ $this->lateral = $l;
+ $this->url = $u;
+ }
+
+ function getURL( $lang ) {
+ $xlang = str_replace( '_', '-', $lang );
+ return "http://$xlang.{$this->url}/wiki/\$1";
+ }
+}
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class RebuildInterwiki extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Rebuild the interwiki table using the file on meta and the language list.";
+ $this->addOption( 'langlist', 'File with one language code per line', false, true );
+ $this->addOption( 'dblist', 'File with one db per line', false, true );
+ $this->addOption( 'd', 'Output folder', false, true );
+ }
+
+ function execute() {
+ # List of language prefixes likely to be found in multi-language sites
+ $this->langlist = array_map( "trim", file( $this->getOption( 'langlist', "/home/wikipedia/common/langlist" ) ) );
+
+ # List of all database names
+ $this->dblist = array_map( "trim", file( $this->getOption( 'dblist', "/home/wikipedia/common/all.dblist" ) ) );
+
+ # Special-case databases
+ //$this->specials = array_flip( array_map( "trim", file( $this->getOption( 'specialdbs', "/home/wikipedia/common/special.dblist" ) ) ) );
+
+ $this->makeInterwikiSQL( $this->getOption( 'd', '/home/wikipedia/conf/interwiki/sql' ) );
+ }
+
+ function makeInterwikiSQL( $destDir ) {
+ $this->output( "Making new interwiki SQL files in $destDir\n" );
+
+ # Multi-language sites
+ # db suffix => db suffix, iw prefix, hostname
+ $sites = array(
+ 'wiki' => new Site( 'wiki', 'w', 'wikipedia.org' ),
+ 'wiktionary' => new Site( 'wiktionary', 'wikt', 'wiktionary.org' ),
+ 'wikiquote' => new Site( 'wikiquote', 'q', 'wikiquote.org' ),
+ 'wikibooks' => new Site( 'wikibooks', 'b', 'wikibooks.org' ),
+ 'wikinews' => new Site( 'wikinews', 'n', 'wikinews.org' ),
+ 'wikisource' => new Site( 'wikisource', 's', 'wikisource.org' ),
+ 'wikimedia' => new Site( 'wikimedia', 'chapter', 'wikimedia.org' ),
+ 'wikiversity' => new Site( 'wikiversity', 'v', 'wikiversity.org' ),
+ );
+
+ # Special-case hostnames
+ $this->specials = array(
+ 'sourceswiki' => 'sources.wikipedia.org',
+ 'quotewiki' => 'wikiquote.org',
+ 'textbookwiki' => 'wikibooks.org',
+ 'sep11wiki' => 'sep11.wikipedia.org',
+ 'metawiki' => 'meta.wikimedia.org',
+ 'commonswiki' => 'commons.wikimedia.org',
+ 'specieswiki' => 'species.wikimedia.org',
+ );
+
+ # Extra interwiki links that can't be in the intermap for some reason
+ $extraLinks = array(
+ array( 'm', 'http://meta.wikimedia.org/wiki/$1', 1 ),
+ array( 'meta', 'http://meta.wikimedia.org/wiki/$1', 1 ),
+ array( 'sep11', 'http://sep11.wikipedia.org/wiki/$1', 1 ),
+ );
+
+ # Language aliases, usually configured as redirects to the real wiki in apache
+ # Interlanguage links are made directly to the real wiki
+ # Something horrible happens if you forget to list an alias here, I can't
+ # remember what
+ $this->languageAliases = array(
+ 'zh-cn' => 'zh',
+ 'zh-tw' => 'zh',
+ 'dk' => 'da',
+ 'nb' => 'no',
+ );
+
+ # Special case prefix rewrites, for the benefit of Swedish which uses s:t
+ # as an abbreviation for saint
+ $this->prefixRewrites = array(
+ 'svwiki' => array( 's' => 'src' ),
+ );
+
+ # Construct a list of reserved prefixes
+ $reserved = array();
+ foreach ( $this->langlist as $lang ) {
+ $reserved[$lang] = 1;
+ }
+ foreach ( $this->languageAliases as $alias => $lang ) {
+ $reserved[$alias] = 1;
+ }
+ foreach ( $sites as $site ) {
+ $reserved[$site->lateral] = 1;
+ }
+
+ # Extract the intermap from meta
+ $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 );
+ $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) );
+
+ if ( !$lines || count( $lines ) < 2 ) {
+ $this->error( "m:Interwiki_map not found", true );
+ }
+
+ $iwArray = array();
+
+ foreach ( $lines as $line ) {
+ $matches = array();
+ if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(https?:\/\/.*?)\s*$/', $line, $matches ) ) {
+ $prefix = strtolower( $matches[1] );
+ $url = $matches[2];
+ if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia)\.org/', $url ) ) {
+ $local = 1;
+ } else {
+ $local = 0;
+ }
+
+ if ( empty( $reserved[$prefix] ) ) {
+ $iwArray[$prefix] = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local );
+ }
+ }
+ }
+
+ foreach ( $this->dblist as $db ) {
+ $sql = "-- Generated by rebuildInterwiki.php";
+ if ( isset( $this->specials[$db] ) ) {
+ # Special wiki
+ # Has interwiki links and interlanguage links to wikipedia
+
+ $host = $this->specials[$db];
+ $sql .= "\n--$host\n\n";
+ $sql .= "USE $db;\n" .
+ "TRUNCATE TABLE interwiki;\n" .
+ "INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES \n";
+ $first = true;
+
+ # Intermap links
+ foreach ( $iwArray as $iwEntry ) {
+ $sql .= $this->makeLink( $iwEntry, $first, $db );
+ }
+
+ # Links to multilanguage sites
+ foreach ( $sites as $targetSite ) {
+ $sql .= $this->makeLink( array( $targetSite->lateral, $targetSite->getURL( 'en' ), 1 ), $first, $db );
+ }
+
+ # Interlanguage links to wikipedia
+ $sql .= $this->makeLanguageLinks( $sites['wiki'], $first, $db );
+
+ # Extra links
+ foreach ( $extraLinks as $link ) {
+ $sql .= $this->makeLink( $link, $first, $db );
+ }
+
+ $sql .= ";\n";
+ } else {
+ # Find out which site this DB belongs to
+ $site = false;
+ foreach ( $sites as $candidateSite ) {
+ $suffix = $candidateSite->suffix;
+ if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) {
+ $site = $candidateSite;
+ break;
+ }
+ }
+ if ( !$site ) {
+ print "Invalid database $db\n";
+ continue;
+ }
+ $lang = $matches[1];
+ $host = "$lang." . $site->url;
+ $sql .= "\n--$host\n\n";
+
+ $sql .= "USE $db;\n" .
+ "TRUNCATE TABLE interwiki;\n" .
+ "INSERT INTO interwiki (iw_prefix,iw_url,iw_local) VALUES\n";
+ $first = true;
+
+ # Intermap links
+ foreach ( $iwArray as $iwEntry ) {
+ # Suppress links with the same name as the site
+ if ( ( $suffix == 'wiki' && $iwEntry['iw_prefix'] != 'wikipedia' ) ||
+ ( $suffix != 'wiki' && $suffix != $iwEntry['iw_prefix'] ) )
+ {
+ $sql .= $this->makeLink( $iwEntry, $first, $db );
+ }
+ }
+
+ # Lateral links
+ foreach ( $sites as $targetSite ) {
+ # Suppress link to self
+ if ( $targetSite->suffix != $site->suffix ) {
+ $sql .= $this->makeLink( array( $targetSite->lateral, $targetSite->getURL( $lang ), 1 ), $first, $db );
+ }
+ }
+
+ # Interlanguage links
+ $sql .= $this->makeLanguageLinks( $site, $first, $db );
+
+ # w link within wikipedias
+ # Other sites already have it as a lateral link
+ if ( $site->suffix == "wiki" ) {
+ $sql .= $this->makeLink( array( "w", "http://en.wikipedia.org/wiki/$1", 1 ), $first, $db );
+ }
+
+ # Extra links
+ foreach ( $extraLinks as $link ) {
+ $sql .= $this->makeLink( $link, $first, $db );
+ }
+ $sql .= ";\n";
+ }
+ file_put_contents( "$destDir/$db.sql", $sql );
+ }
+ }
+
+ # ------------------------------------------------------------------------------------------
+
+ # Returns part of an INSERT statement, corresponding to all interlanguage links to a particular site
+ function makeLanguageLinks( &$site, &$first, $source ) {
+ $sql = "";
+
+ # Actual languages with their own databases
+ foreach ( $this->langlist as $targetLang ) {
+ $sql .= $this->makeLink( array( $targetLang, $site->getURL( $targetLang ), 1 ), $first, $source );
+ }
+
+ # Language aliases
+ foreach ( $this->languageAliases as $alias => $lang ) {
+ $sql .= $this->makeLink( array( $alias, $site->getURL( $lang ), 1 ), $first, $source );
+ }
+ return $sql;
+ }
+
+ # Make SQL for a single link from an array
+ function makeLink( $entry, &$first, $source ) {
+
+ if ( isset( $this->prefixRewrites[$source] ) && isset($entry[0]) && isset( $this->prefixRewrites[$source][$entry[0]] ) ) {
+ $entry[0] = $this->prefixRewrites[$source][$entry[0]];
+ }
+
+ $sql = "";
+ # Add comma
+ if ( $first ) {
+ $first = false;
+ } else {
+ $sql .= ",\n";
+ }
+ $dbr = wfGetDB( DB_SLAVE );
+ $sql .= "(" . $dbr->makeList( $entry ) . ")";
+ return $sql;
+ }
}
-echo "Making new interwiki SQL files in $destDir\n";
-makeInterwikiSQL( $destDir );
+$maintClass = "RebuildInterwiki";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildLocalisationCache.php b/maintenance/rebuildLocalisationCache.php
index 1c517415..0ca99610 100644
--- a/maintenance/rebuildLocalisationCache.php
+++ b/maintenance/rebuildLocalisationCache.php
@@ -28,7 +28,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RebuildLocalisationCache extends Maintenance {
public function __construct() {
@@ -37,7 +37,7 @@ class RebuildLocalisationCache extends Maintenance {
$this->addOption( 'force', 'Rebuild all files, even ones not out of date' );
$this->addOption( 'threads', 'Fork more than one thread', false, true );
}
-
+
public function memoryLimit() {
return '200M';
}
@@ -45,17 +45,17 @@ class RebuildLocalisationCache extends Maintenance {
public function execute() {
global $wgLocalisationCacheConf;
- $force = $this->hasOption('force');
+ $force = $this->hasOption( 'force' );
$threads = $this->getOption( 'threads', 1 );
- if( $threads < 1 || $threads != intval( $threads ) ) {
+ if ( $threads < 1 || $threads != intval( $threads ) ) {
$this->output( "Invalid thread count specified; running single-threaded.\n" );
$threads = 1;
}
- if( $threads > 1 && wfIsWindows() ) {
+ if ( $threads > 1 && wfIsWindows() ) {
$this->output( "Threaded rebuild is not supported on Windows; running single-threaded.\n" );
$threads = 1;
}
- if( $threads > 1 && !function_exists( 'pcntl_fork' ) ) {
+ if ( $threads > 1 && !function_exists( 'pcntl_fork' ) ) {
$this->output( "PHP pcntl extension is not present; running single-threaded.\n" );
$threads = 1;
}
@@ -72,8 +72,8 @@ class RebuildLocalisationCache extends Maintenance {
// Initialise and split into chunks
$numRebuilt = 0;
- $total = count($codes);
- $chunks = array_chunk( $codes, ceil(count($codes)/$threads) );
+ $total = count( $codes );
+ $chunks = array_chunk( $codes, ceil( count( $codes ) / $threads ) );
$pids = array();
foreach ( $chunks as $codes ) {
// Do not fork for only one thread
@@ -82,11 +82,11 @@ class RebuildLocalisationCache extends Maintenance {
if ( $pid === 0 ) {
// Child, reseed because there is no bug in PHP:
// http://bugs.php.net/bug.php?id=42465
- mt_srand(getmypid());
+ mt_srand( getmypid() );
$numRebuilt = $this->doRebuild( $codes, $lc, $force );
// Abuse the exit value for the count of rebuild languages
- exit($numRebuilt);
- } elseif ($pid === -1) {
+ exit( $numRebuilt );
+ } elseif ( $pid === -1 ) {
// Fork failed or one thread, do it serialized
$numRebuilt += $this->doRebuild( $codes, $lc, $force );
} else {
@@ -97,9 +97,9 @@ class RebuildLocalisationCache extends Maintenance {
// Wait for all children
foreach ( $pids as $pid ) {
$status = 0;
- pcntl_waitpid($pid, $status);
+ pcntl_waitpid( $pid, $status );
// Fetch the count from the return value
- $numRebuilt += pcntl_wexitstatus($status);
+ $numRebuilt += pcntl_wexitstatus( $status );
}
$this->output( "$numRebuilt languages rebuilt out of $total\n" );
@@ -130,4 +130,4 @@ class RebuildLocalisationCache extends Maintenance {
}
$maintClass = "RebuildLocalisationCache";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildall.php b/maintenance/rebuildall.php
index a2c1be93..82619048 100644
--- a/maintenance/rebuildall.php
+++ b/maintenance/rebuildall.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RebuildAll extends Maintenance {
public function __construct() {
@@ -47,10 +47,10 @@ class RebuildAll extends Maintenance {
$this->output( "\n\n** Rebuilding links tables -- this can take a long time. It should be safe to abort via ctrl+C if you get bored.\n" );
$rebuildLinks = $this->runChild( 'RefreshLinks', 'refreshLinks.php' );
$rebuildLinks->execute();
-
+
$this->output( "Done.\n" );
}
}
$maintClass = "RebuildAll";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildmessages.php b/maintenance/rebuildmessages.php
index 546d5214..de37da7e 100644
--- a/maintenance/rebuildmessages.php
+++ b/maintenance/rebuildmessages.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RebuildMessages extends Maintenance {
public function __construct() {
@@ -30,16 +30,16 @@ class RebuildMessages extends Maintenance {
public function execute() {
global $wgLocalDatabases, $wgDBname, $wgEnableSidebarCache, $messageMemc;
- if( $wgLocalDatabases ) {
+ if ( $wgLocalDatabases ) {
$databases = $wgLocalDatabases;
} else {
$databases = array( $wgDBname );
}
-
- foreach( $databases as $db ) {
+
+ foreach ( $databases as $db ) {
$this->output( "Deleting message cache for {$db}... " );
$messageMemc->delete( "{$db}:messages" );
- if( $wgEnableSidebarCache )
+ if ( $wgEnableSidebarCache )
$messageMemc->delete( "{$db}:sidebar" );
$this->output( "Deleted\n" );
}
@@ -47,4 +47,4 @@ class RebuildMessages extends Maintenance {
}
$maintClass = "RebuildMessages";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildrecentchanges.php b/maintenance/rebuildrecentchanges.php
index 6c76dc59..8964d1a4 100644
--- a/maintenance/rebuildrecentchanges.php
+++ b/maintenance/rebuildrecentchanges.php
@@ -22,7 +22,7 @@
* @todo Document
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RebuildRecentchanges extends Maintenance {
public function __construct() {
@@ -31,8 +31,6 @@ class RebuildRecentchanges extends Maintenance {
}
public function execute() {
- global $wgTitle;
- $wgTitle = Title::newFromText( "Rebuild recent changes script" );
$this->rebuildRecentChangesTablePass1();
$this->rebuildRecentChangesTablePass2();
$this->rebuildRecentChangesTablePass3();
@@ -45,24 +43,23 @@ class RebuildRecentchanges extends Maintenance {
* Rebuild pass 1
* DOCUMENT ME!
*/
- function rebuildRecentChangesTablePass1()
- {
+ private function rebuildRecentChangesTablePass1() {
$dbw = wfGetDB( DB_MASTER );
-
+
$dbw->delete( 'recentchanges', '*' );
-
+
$this->output( "Loading from page and revision tables...\n" );
-
+
global $wgRCMaxAge;
-
+
$this->output( '$wgRCMaxAge=' . $wgRCMaxAge );
$days = $wgRCMaxAge / 24 / 3600;
- if ( intval($days) == $days ) {
+ if ( intval( $days ) == $days ) {
$this->output( " (" . $days . " days)\n" );
} else {
- $this->output( " (approx. " . intval($days) . " days)\n" );
+ $this->output( " (approx. " . intval( $days ) . " days)\n" );
}
-
+
$cutoff = time() - $wgRCMaxAge;
$dbw->insertSelect( 'recentchanges', array( 'page', 'revision' ),
array(
@@ -96,57 +93,65 @@ class RebuildRecentchanges extends Maintenance {
*/
private function rebuildRecentChangesTablePass2() {
$dbw = wfGetDB( DB_MASTER );
- list ($recentchanges, $revision) = $dbw->tableNamesN( 'recentchanges', 'revision' );
-
+ list ( $recentchanges, $revision ) = $dbw->tableNamesN( 'recentchanges', 'revision' );
+
$this->output( "Updating links and size differences...\n" );
-
+
# Fill in the rc_last_oldid field, which points to the previous edit
$sql = "SELECT rc_cur_id,rc_this_oldid,rc_timestamp FROM $recentchanges " .
"ORDER BY rc_cur_id,rc_timestamp";
$res = $dbw->query( $sql, DB_MASTER );
-
+
$lastCurId = 0;
$lastOldId = 0;
foreach ( $res as $obj ) {
$new = 0;
- if( $obj->rc_cur_id != $lastCurId ) {
+ if ( $obj->rc_cur_id != $lastCurId ) {
# Switch! Look up the previous last edit, if any
$lastCurId = intval( $obj->rc_cur_id );
$emit = $obj->rc_timestamp;
$sql2 = "SELECT rev_id,rev_len FROM $revision " .
- "WHERE rev_page={$lastCurId} ".
+ "WHERE rev_page={$lastCurId} " .
"AND rev_timestamp<'{$emit}' ORDER BY rev_timestamp DESC";
- $sql2 = $dbw->limitResult($sql2, 1, false);
+ $sql2 = $dbw->limitResult( $sql2, 1, false );
$res2 = $dbw->query( $sql2 );
- if( $row = $dbw->fetchObject( $res2 ) ) {
- $lastOldId = intval($row->rev_id);
+ $row = $dbw->fetchObject( $res2 );
+ if ( $row ) {
+ $lastOldId = intval( $row->rev_id );
# Grab the last text size if available
- $lastSize = !is_null($row->rev_len) ? intval($row->rev_len) : 'NULL';
+ $lastSize = !is_null( $row->rev_len ) ? intval( $row->rev_len ) : 'NULL';
} else {
# No previous edit
$lastOldId = 0;
$lastSize = 'NULL';
$new = 1; // probably true
}
- $dbw->freeResult( $res2 );
}
- if( $lastCurId == 0 ) {
+ if ( $lastCurId == 0 ) {
$this->output( "Uhhh, something wrong? No curid\n" );
} else {
# Grab the entry's text size
- $size = $dbw->selectField( 'revision', 'rev_len', array('rev_id' => $obj->rc_this_oldid ) );
- $size = !is_null($size) ? intval($size) : 'NULL';
-
- $sql3 = "UPDATE $recentchanges SET rc_last_oldid=$lastOldId,rc_new=$new,rc_type=$new," .
- "rc_old_len=$lastSize,rc_new_len=$size " .
- "WHERE rc_cur_id={$lastCurId} AND rc_this_oldid={$obj->rc_this_oldid}";
- $dbw->query( $sql3 );
-
+ $size = $dbw->selectField( 'revision', 'rev_len', array( 'rev_id' => $obj->rc_this_oldid ) );
+ $size = !is_null( $size ) ? intval( $size ) : 'NULL';
+
+ $dbw->update( 'recentchanges',
+ array(
+ 'rc_last_oldid' => $lastOldId,
+ 'rc_new' => $new,
+ 'rc_type' => $new,
+ 'rc_old_len' => $lastSize,
+ 'rc_new_len' => $size,
+ ), array(
+ 'rc_cur_id' => $lastCurId,
+ 'rc_this_oldid' => $obj->rc_this_oldid,
+ ),
+ __METHOD__
+ );
+
$lastOldId = intval( $obj->rc_this_oldid );
$lastSize = $size;
}
}
- $dbw->freeResult( $res );
}
/**
@@ -155,22 +160,22 @@ class RebuildRecentchanges extends Maintenance {
*/
private function rebuildRecentChangesTablePass3() {
$dbw = wfGetDB( DB_MASTER );
-
+
$this->output( "Loading from user, page, and logging tables...\n" );
-
+
global $wgRCMaxAge, $wgLogTypes, $wgLogRestrictions;
// Some logs don't go in RC. This should check for that
$basicRCLogs = array_diff( $wgLogTypes, array_keys( $wgLogRestrictions ) );
-
+
// Escape...blah blah
$selectLogs = array();
- foreach( $basicRCLogs as $logtype ) {
+ foreach ( $basicRCLogs as $logtype ) {
$safetype = $dbw->strencode( $logtype );
$selectLogs[] = "'$safetype'";
}
-
+
$cutoff = time() - $wgRCMaxAge;
- list($logging, $page) = $dbw->tableNamesN( 'logging', 'page' );
+ list( $logging, $page ) = $dbw->tableNamesN( 'logging', 'page' );
$dbw->insertSelect( 'recentchanges', array( 'user', "$logging LEFT JOIN $page ON (log_namespace=page_namespace AND log_title=page_title)" ),
array(
'rc_timestamp' => 'log_timestamp',
@@ -196,7 +201,7 @@ class RebuildRecentchanges extends Maintenance {
), array(
'log_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ),
'log_user=user_id',
- 'log_type IN(' . implode(',',$selectLogs) . ')'
+ 'log_type IN(' . implode( ',', $selectLogs ) . ')'
), __METHOD__,
array(), // INSERT options
array( 'ORDER BY' => 'log_timestamp DESC', 'LIMIT' => 5000 ) // SELECT options
@@ -209,38 +214,38 @@ class RebuildRecentchanges extends Maintenance {
*/
private function rebuildRecentChangesTablePass4() {
global $wgGroupPermissions, $wgUseRCPatrol;
-
+
$dbw = wfGetDB( DB_MASTER );
-
- list($recentchanges,$usergroups,$user) = $dbw->tableNamesN( 'recentchanges', 'user_groups', 'user' );
-
+
+ list( $recentchanges, $usergroups, $user ) = $dbw->tableNamesN( 'recentchanges', 'user_groups', 'user' );
+
$botgroups = $autopatrolgroups = array();
- foreach( $wgGroupPermissions as $group => $rights ) {
- if( isset( $rights['bot'] ) && $rights['bot'] == true ) {
+ foreach ( $wgGroupPermissions as $group => $rights ) {
+ if ( isset( $rights['bot'] ) && $rights['bot'] ) {
$botgroups[] = $dbw->addQuotes( $group );
}
- if( $wgUseRCPatrol && isset( $rights['autopatrol'] ) && $rights['autopatrol'] == true ) {
+ if ( $wgUseRCPatrol && isset( $rights['autopatrol'] ) && $rights['autopatrol'] ) {
$autopatrolgroups[] = $dbw->addQuotes( $group );
}
}
# Flag our recent bot edits
- if( !empty($botgroups) ) {
- $botwhere = implode(',',$botgroups);
+ if ( !empty( $botgroups ) ) {
+ $botwhere = implode( ',', $botgroups );
$botusers = array();
-
+
$this->output( "Flagging bot account edits...\n" );
-
+
# Find all users that are bots
$sql = "SELECT DISTINCT user_name FROM $usergroups, $user " .
"WHERE ug_group IN($botwhere) AND user_id = ug_user";
$res = $dbw->query( $sql, DB_MASTER );
-
- foreach( $res as $obj ) {
+
+ foreach ( $res as $obj ) {
$botusers[] = $dbw->addQuotes( $obj->user_name );
}
# Fill in the rc_bot field
- if( !empty($botusers) ) {
- $botwhere = implode(',',$botusers);
+ if ( !empty( $botusers ) ) {
+ $botwhere = implode( ',', $botusers );
$sql2 = "UPDATE $recentchanges SET rc_bot=1 " .
"WHERE rc_user_text IN($botwhere)";
$dbw->query( $sql2 );
@@ -248,31 +253,29 @@ class RebuildRecentchanges extends Maintenance {
}
global $wgMiserMode;
# Flag our recent autopatrolled edits
- if( !$wgMiserMode && !empty($autopatrolgroups) ) {
- $patrolwhere = implode(',',$autopatrolgroups);
+ if ( !$wgMiserMode && !empty( $autopatrolgroups ) ) {
+ $patrolwhere = implode( ',', $autopatrolgroups );
$patrolusers = array();
-
+
$this->output( "Flagging auto-patrolled edits...\n" );
-
+
# Find all users in RC with autopatrol rights
$sql = "SELECT DISTINCT user_name FROM $usergroups, $user " .
"WHERE ug_group IN($patrolwhere) AND user_id = ug_user";
$res = $dbw->query( $sql, DB_MASTER );
-
- foreach( $res as $obj ) {
+
+ foreach ( $res as $obj ) {
$patrolusers[] = $dbw->addQuotes( $obj->user_name );
}
-
+
# Fill in the rc_patrolled field
- if( !empty($patrolusers) ) {
- $patrolwhere = implode(',',$patrolusers);
+ if ( !empty( $patrolusers ) ) {
+ $patrolwhere = implode( ',', $patrolusers );
$sql2 = "UPDATE $recentchanges SET rc_patrolled=1 " .
"WHERE rc_user_text IN($patrolwhere)";
$dbw->query( $sql2 );
}
}
-
- $dbw->freeResult( $res );
}
/**
@@ -283,7 +286,7 @@ class RebuildRecentchanges extends Maintenance {
$this->output( "Deleting feed timestamps.\n" );
- foreach( $wgFeedClasses as $feed => $className ) {
+ foreach ( $wgFeedClasses as $feed => $className ) {
$messageMemc->delete( wfMemcKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
}
}
@@ -291,4 +294,4 @@ class RebuildRecentchanges extends Maintenance {
}
$maintClass = "RebuildRecentchanges";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php
index 4521c6f5..46282c18 100644
--- a/maintenance/rebuildtextindex.php
+++ b/maintenance/rebuildtextindex.php
@@ -24,10 +24,10 @@
* @todo document
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RebuildTextIndex extends Maintenance {
- const RTI_CHUNK_SIZE = 500;
+ const RTI_CHUNK_SIZE = 500;
private $db;
public function __construct() {
@@ -46,11 +46,20 @@ class RebuildTextIndex extends Maintenance {
if ( $wgDBtype == 'postgres' ) {
$this->error( "This script is not needed when using Postgres.\n", true );
}
-
+
$this->db = wfGetDB( DB_MASTER );
+ if ( $this->db->getType() == 'sqlite' ) {
+ if ( !DatabaseSqlite::getFulltextSearchModule() ) {
+ $this->error( "Your version of SQLite module for PHP doesn't support full-text search (FTS3).\n", true );
+ }
+ if ( !$this->db->checkForEnabledSearch() ) {
+ $this->error( "Your database schema is not configured for full-text search support. Run update.php.\n", true );
+ }
+ }
+
$wgTitle = Title::newFromText( "Rebuild text index script" );
-
- if ( $wgDBtype == 'mysql' ) {
+
+ if ( $this->db->getType() == 'mysql' ) {
$this->dropMysqlTextIndex();
$this->populateSearchIndex();
$this->createMysqlTextIndex();
@@ -58,7 +67,7 @@ class RebuildTextIndex extends Maintenance {
$this->clearSearchIndex();
$this->populateSearchIndex();
}
-
+
$this->output( "Done.\n" );
}
@@ -67,27 +76,28 @@ class RebuildTextIndex extends Maintenance {
*/
protected function populateSearchIndex() {
$res = $this->db->select( 'page', 'MAX(page_id) AS count' );
- $s = $this->db->fetchObject($res);
+ $s = $this->db->fetchObject( $res );
$count = $s->count;
$this->output( "Rebuilding index fields for {$count} pages...\n" );
$n = 0;
-
+
while ( $n < $count ) {
- $this->output( $n . "\n" );
+ if ( $n ) {
+ $this->output( $n . "\n" );
+ }
$end = $n + self::RTI_CHUNK_SIZE - 1;
- $res = $this->db->select( array( 'page', 'revision', 'text' ),
+ $res = $this->db->select( array( 'page', 'revision', 'text' ),
array( 'page_id', 'page_namespace', 'page_title', 'old_flags', 'old_text' ),
array( "page_id BETWEEN $n AND $end", 'page_latest = rev_id', 'rev_text_id = old_id' ),
__METHOD__
);
-
- foreach( $res as $s ) {
+
+ foreach ( $res as $s ) {
$revtext = Revision::getRevisionText( $s );
$u = new SearchUpdate( $s->page_id, $s->page_title, $revtext );
$u->doUpdate();
}
- $this->db->freeResult( $res );
$n += self::RTI_CHUNK_SIZE;
}
}
@@ -100,7 +110,7 @@ class RebuildTextIndex extends Maintenance {
if ( $this->db->indexExists( 'searchindex', 'si_title' ) ) {
$this->output( "Dropping index...\n" );
$sql = "ALTER TABLE $searchindex DROP INDEX si_title, DROP INDEX si_text";
- $this->db->query($sql, __METHOD__ );
+ $this->db->query( $sql, __METHOD__ );
}
}
@@ -126,4 +136,4 @@ class RebuildTextIndex extends Maintenance {
}
$maintClass = "RebuildTextIndex";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/refreshImageCount.php b/maintenance/refreshImageCount.php
index 44794cc7..f9bdeea7 100644
--- a/maintenance/refreshImageCount.php
+++ b/maintenance/refreshImageCount.php
@@ -21,14 +21,14 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RefreshImageCount extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Resets ss_image count, forcing slaves to pick it up.";
}
-
+
public function execute() {
$dbw = wfGetDB( DB_MASTER );
@@ -41,7 +41,7 @@ class RefreshImageCount extends Maintenance {
$dbw->update( 'site_stats',
array( 'ss_images' => null ),
array( 'ss_row_id' => 1 ) );
-
+
// Now this update will be forced to go out
$dbw->update( 'site_stats',
array( 'ss_images' => $count ),
@@ -50,5 +50,5 @@ class RefreshImageCount extends Maintenance {
}
$maintClass = "RefreshImageCount";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 863dd022..144e96c5 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -18,7 +18,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RefreshLinks extends Maintenance {
public function __construct() {
@@ -35,10 +35,10 @@ class RefreshLinks extends Maintenance {
}
public function execute() {
- if( !$this->hasOption( 'dfn-only' ) ) {
+ $max = $this->getOption( 'm', 0 );
+ if ( !$this->hasOption( 'dfn-only' ) ) {
$start = $this->getArg( 0, 1 );
$new = $this->getOption( 'new-only', false );
- $max = $this->getOption( 'm', false );
$end = $this->getOption( 'e', 0 );
$redir = $this->getOption( 'redirects-only', false );
$oldRedir = $this->getOption( 'old-redirects-only', false );
@@ -56,7 +56,7 @@ class RefreshLinks extends Maintenance {
* @param $redirectsOnly bool Only fix redirects
* @param $oldRedirectsOnly bool Only fix redirects without redirect entries
*/
- private function doRefreshLinks( $start, $newOnly = false, $maxLag = false,
+ private function doRefreshLinks( $start, $newOnly = false, $maxLag = false,
$end = 0, $redirectsOnly = false, $oldRedirectsOnly = false ) {
global $wgUser, $wgParser, $wgUseTidy;
@@ -65,10 +65,10 @@ class RefreshLinks extends Maintenance {
$start = intval( $start );
# Don't generate TeX PNGs (lack of a sensible current directory causes errors anyway)
- $wgUser->setOption('math', MW_MATH_SOURCE);
+ $wgUser->setOption( 'math', MW_MATH_SOURCE );
# Don't generate extension images (e.g. Timeline)
- if( method_exists( $wgParser, "clearTagHooks" ) ) {
+ if ( method_exists( $wgParser, "clearTagHooks" ) ) {
$wgParser->clearTagHooks();
}
@@ -77,28 +77,29 @@ class RefreshLinks extends Maintenance {
$what = $redirectsOnly ? "redirects" : "links";
- if( $oldRedirectsOnly ) {
+ if ( $oldRedirectsOnly ) {
# This entire code path is cut-and-pasted from below. Hurrah.
$res = $dbr->query(
- "SELECT page_id ".
- "FROM page ".
- "LEFT JOIN redirect ON page_id=rd_from ".
- "WHERE page_is_redirect=1 AND rd_from IS NULL AND ".
- ($end == 0 ? "page_id >= $start"
- : "page_id BETWEEN $start AND $end"),
+ "SELECT page_id " .
+ "FROM page " .
+ "LEFT JOIN redirect ON page_id=rd_from " .
+ "WHERE page_is_redirect=1 AND rd_from IS NULL AND " .
+ ( $end == 0 ? "page_id >= $start"
+ : "page_id BETWEEN $start AND $end" ),
__METHOD__
);
$num = $dbr->numRows( $res );
$this->output( "Refreshing $num old redirects from $start...\n" );
- foreach( $res as $row ) {
+ $i = 0;
+ foreach ( $res as $row ) {
if ( !( ++$i % $reportingInterval ) ) {
$this->output( "$i\n" );
wfWaitForSlaves( $maxLag );
}
$this->fixRedirect( $row->page_id );
}
- } elseif( $newOnly ) {
+ } elseif ( $newOnly ) {
$this->output( "Refreshing $what from " );
$res = $dbr->select( 'page',
array( 'page_id' ),
@@ -109,17 +110,17 @@ class RefreshLinks extends Maintenance {
);
$num = $dbr->numRows( $res );
$this->output( "$num new articles...\n" );
-
+
$i = 0;
foreach ( $res as $row ) {
if ( !( ++$i % $reportingInterval ) ) {
$this->output( "$i\n" );
wfWaitForSlaves( $maxLag );
}
- if($redirectsOnly)
+ if ( $redirectsOnly )
$this->fixRedirect( $row->page_id );
else
- $this->fixLinksFromArticle( $row->page_id );
+ self::fixLinksFromArticle( $row->page_id );
}
} else {
if ( !$end ) {
@@ -129,27 +130,27 @@ class RefreshLinks extends Maintenance {
}
$this->output( "Refreshing redirects table.\n" );
$this->output( "Starting from page_id $start of $end.\n" );
-
- for ($id = $start; $id <= $end; $id++) {
-
- if ( !($id % $reportingInterval) ) {
+
+ for ( $id = $start; $id <= $end; $id++ ) {
+
+ if ( !( $id % $reportingInterval ) ) {
$this->output( "$id\n" );
wfWaitForSlaves( $maxLag );
}
$this->fixRedirect( $id );
}
- if(!$redirectsOnly) {
+ if ( !$redirectsOnly ) {
$this->output( "Refreshing links table.\n" );
$this->output( "Starting from page_id $start of $end.\n" );
- for ($id = $start; $id <= $end; $id++) {
-
- if ( !($id % $reportingInterval) ) {
+ for ( $id = $start; $id <= $end; $id++ ) {
+
+ if ( !( $id % $reportingInterval ) ) {
$this->output( "$id\n" );
wfWaitForSlaves( $maxLag );
}
- $this->fixLinksFromArticle( $id );
+ self::fixLinksFromArticle( $id );
}
}
}
@@ -159,12 +160,12 @@ class RefreshLinks extends Maintenance {
* Update the redirect entry for a given page
* @param $id int The page_id of the redirect
*/
- private function fixRedirect( $id ){
+ private function fixRedirect( $id ) {
global $wgTitle, $wgArticle;
-
+
$wgTitle = Title::newFromID( $id );
$dbw = wfGetDB( DB_MASTER );
-
+
if ( is_null( $wgTitle ) ) {
// This page doesn't exist (any more)
// Delete any redirect table entry for it
@@ -172,17 +173,17 @@ class RefreshLinks extends Maintenance {
__METHOD__ );
return;
}
- $wgArticle = new Article($wgTitle);
-
+ $wgArticle = new Article( $wgTitle );
+
$rt = $wgArticle->followRedirect();
-
- if($rt == false || !is_object($rt)) {
+
+ if ( !$rt || !is_object( $rt ) ) {
// $wgTitle is not a redirect
// Delete any redirect table entry for it
$dbw->delete( 'redirect', array( 'rd_from' => $id ),
__METHOD__ );
} else {
- $wgArticle->updateRedirectOn($dbw,$rt);
+ $wgArticle->updateRedirectOn( $dbw, $rt );
}
}
@@ -190,14 +191,13 @@ class RefreshLinks extends Maintenance {
* Run LinksUpdate for all links on a given page_id
* @param $id int The page_id
*/
- private function fixLinksFromArticle( $id ) {
+ public static function fixLinksFromArticle( $id ) {
global $wgTitle, $wgParser;
$wgTitle = Title::newFromID( $id );
$dbw = wfGetDB( DB_MASTER );
- $linkCache =& LinkCache::singleton();
- $linkCache->clear();
+ LinkCache::singleton()->clear();
if ( is_null( $wgTitle ) ) {
return;
@@ -248,21 +248,21 @@ class RefreshLinks extends Maintenance {
// SELECT DISTINCT( $field ) FROM $table LEFT JOIN page ON $field=page_id WHERE page_id IS NULL;
$results = $dbr->select( array( $table, 'page' ),
$field,
- array('page_id' => null ),
+ array( 'page_id' => null ),
__METHOD__,
'DISTINCT',
- array( 'page' => array( 'LEFT JOIN', "$field=page_id"))
+ array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
);
$counter = 0;
$list = array();
$this->output( "0.." );
- foreach( $results as $row ) {
+ foreach ( $results as $row ) {
$counter++;
$list[] = $row->$field;
if ( ( $counter % $batchSize ) == 0 ) {
- wfWaitForSlaves(5);
+ wfWaitForSlaves( 5 );
$dbw->delete( $table, array( $field => $list ), __METHOD__ );
$this->output( $counter . ".." );
@@ -270,7 +270,7 @@ class RefreshLinks extends Maintenance {
}
}
$this->output( $counter );
- if (count($list) > 0) {
+ if ( count( $list ) > 0 ) {
$dbw->delete( $table, array( $field => $list ), __METHOD__ );
}
$this->output( "\n" );
@@ -280,4 +280,4 @@ class RefreshLinks extends Maintenance {
}
$maintClass = 'RefreshLinks';
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/removeUnusedAccounts.php b/maintenance/removeUnusedAccounts.php
index 7b0535b7..44c27b35 100644
--- a/maintenance/removeUnusedAccounts.php
+++ b/maintenance/removeUnusedAccounts.php
@@ -22,7 +22,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RemoveUnusedAccounts extends Maintenance {
public function __construct() {
@@ -35,26 +35,26 @@ class RemoveUnusedAccounts extends Maintenance {
public function execute() {
$this->output( "Remove unused accounts\n\n" );
-
+
# Do an initial scan for inactive accounts and report the result
$this->output( "Checking for unused user accounts...\n" );
$del = array();
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'user', array( 'user_id', 'user_name', 'user_touched' ), '', __METHOD__ );
- if( $this->hasOption('ignore-groups') ) {
- $excludedGroups = explode( ',', $this->getOption('ignore-groups') );
- } else {
+ if ( $this->hasOption( 'ignore-groups' ) ) {
+ $excludedGroups = explode( ',', $this->getOption( 'ignore-groups' ) );
+ } else {
$excludedGroups = array();
}
$touched = $this->getOption( 'ignore-touched', "1" );
- if( !ctype_digit( $touched ) ) {
+ if ( !ctype_digit( $touched ) ) {
$this->error( "Please put a valid positive integer on the --ignore-touched parameter.", true );
}
$touchedSeconds = 86400 * $touched;
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
# Check the account, but ignore it if it's within a $excludedGroups group or if it's touched within the $touchedSeconds seconds.
$instance = User::newFromId( $row->user_id );
- if( count( array_intersect( $instance->getEffectiveGroups(), $excludedGroups ) ) == 0
+ if ( count( array_intersect( $instance->getEffectiveGroups(), $excludedGroups ) ) == 0
&& $this->isInactiveAccount( $row->user_id, true )
&& wfTimestamp( TS_UNIX, $row->user_touched ) < wfTimestamp( TS_UNIX, time() - $touchedSeconds )
) {
@@ -65,9 +65,9 @@ class RemoveUnusedAccounts extends Maintenance {
}
$count = count( $del );
$this->output( "...found {$count}.\n" );
-
+
# If required, go back and delete each marked account
- if( $count > 0 && $this->hasOption('delete') ) {
+ if ( $count > 0 && $this->hasOption( 'delete' ) ) {
$this->output( "\nDeleting inactive accounts..." );
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'user', array( 'user_id' => $del ), __METHOD__ );
@@ -75,12 +75,12 @@ class RemoveUnusedAccounts extends Maintenance {
# Update the site_stats.ss_users field
$users = $dbw->selectField( 'user', 'COUNT(*)', array(), __METHOD__ );
$dbw->update( 'site_stats', array( 'ss_users' => $users ), array( 'ss_row_id' => 1 ), __METHOD__ );
- } elseif( $count > 0 ) {
+ } elseif ( $count > 0 ) {
$this->output( "\nRun the script again with --delete to remove them from the database.\n" );
}
$this->output( "\n" );
}
-
+
/**
* Could the specified user account be deemed inactive?
* (No edits, no deleted edits, no log entries, no current/old uploads)
@@ -94,17 +94,17 @@ class RemoveUnusedAccounts extends Maintenance {
$checks = array( 'revision' => 'rev', 'archive' => 'ar', 'logging' => 'log',
'image' => 'img', 'oldimage' => 'oi' );
$count = 0;
-
+
$dbo->begin();
- foreach( $checks as $table => $fprefix ) {
+ foreach ( $checks as $table => $fprefix ) {
$conds = array( $fprefix . '_user' => $id );
$count += (int)$dbo->selectField( $table, 'COUNT(*)', $conds, __METHOD__ );
}
$dbo->commit();
-
+
return $count == 0;
}
}
$maintClass = "RemoveUnusedAccounts";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/renameDbPrefix.php b/maintenance/renameDbPrefix.php
index f73db508..289e747f 100644
--- a/maintenance/renameDbPrefix.php
+++ b/maintenance/renameDbPrefix.php
@@ -20,8 +20,8 @@
*
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RenameDbPrefix extends Maintenance {
public function __construct() {
@@ -35,43 +35,45 @@ class RenameDbPrefix extends Maintenance {
}
public function execute() {
+ global $wgDBname;
+
// Allow for no old prefix
- if( $this->getOption( 'old', 0 ) === '0' ) {
+ if ( $this->getOption( 'old', 0 ) === '0' ) {
$old = '';
} else {
// Use nice safe, sane, prefixes
- preg_match( '/^[a-zA-Z]+_$/', $this->getOption('old'), $m );
+ preg_match( '/^[a-zA-Z]+_$/', $this->getOption( 'old' ), $m );
$old = isset( $m[0] ) ? $m[0] : false;
}
// Allow for no new prefix
- if( $this->getOption( 'new', 0 ) === '0' ) {
+ if ( $this->getOption( 'new', 0 ) === '0' ) {
$new = '';
} else {
// Use nice safe, sane, prefixes
- preg_match( '/^[a-zA-Z]+_$/', $this->getOption('new'), $m );
+ preg_match( '/^[a-zA-Z]+_$/', $this->getOption( 'new' ), $m );
$new = isset( $m[0] ) ? $m[0] : false;
}
-
- if( $old === false || $new === false ) {
+
+ if ( $old === false || $new === false ) {
$this->error( "Invalid prefix!", true );
}
- if( $old === $new ) {
+ if ( $old === $new ) {
$this->output( "Same prefix. Nothing to rename!\n", true );
}
-
+
$this->output( "Renaming DB prefix for tables of $wgDBname from '$old' to '$new'\n" );
$count = 0;
-
+
$dbw = wfGetDB( DB_MASTER );
- $res = $dbw->query( "SHOW TABLES LIKE '".$dbw->escapeLike( $old )."%'" );
- foreach( $res as $row ) {
+ $res = $dbw->query( "SHOW TABLES " . $dbw->buildLike( $old, $dbw->anyString() ) );
+ foreach ( $res as $row ) {
// XXX: odd syntax. MySQL outputs an oddly cased "Tables of X"
// sort of message. Best not to try $row->x stuff...
$fields = get_object_vars( $row );
// Silly for loop over one field...
- foreach( $fields as $resName => $table ) {
+ foreach ( $fields as $table ) {
// $old should be regexp safe ([a-zA-Z_])
- $newTable = preg_replace( '/^'.$old.'/', $new, $table );
+ $newTable = preg_replace( '/^' . $old . '/', $new, $table );
$this->output( "Renaming table $table to $newTable\n" );
$dbw->query( "RENAME TABLE $table TO $newTable" );
}
@@ -82,4 +84,4 @@ class RenameDbPrefix extends Maintenance {
}
$maintClass = "RenameDbPrefix";
-require_once( DO_MAINTENANCE ); \ No newline at end of file
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/renamewiki.php b/maintenance/renamewiki.php
index 36437bea..4146525e 100644
--- a/maintenance/renamewiki.php
+++ b/maintenance/renamewiki.php
@@ -23,7 +23,7 @@
* @ingroup Wikimedia
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RenameWiki extends Maintenance {
public function __construct() {
@@ -32,7 +32,7 @@ class RenameWiki extends Maintenance {
$this->addArg( 'olddb', 'Old DB name' );
$this->addArg( 'newdb', 'New DB name' );
}
-
+
public function getDbType() {
return Maintenance::DB_ADMIN;
}
@@ -45,7 +45,7 @@ class RenameWiki extends Maintenance {
$to = $this->getArg( 1 );
$this->output( "Renaming blob tables in ES from $from to $to...\n" );
$this->output( "Sleeping 5 seconds...\n" );
- sleep(5);
+ sleep( 5 );
# Initialise external storage
if ( is_array( $wgDefaultExternalStore ) ) {
@@ -57,20 +57,20 @@ class RenameWiki extends Maintenance {
}
if ( count( $stores ) ) {
- $this->output( "Initialising external storage $store...\n" );
+ $this->output( "Initialising external storage...\n" );
global $wgDBuser, $wgDBpassword, $wgExternalServers;
foreach ( $stores as $storeURL ) {
$m = array();
if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
continue;
}
-
+
$cluster = $m[1];
-
+
# Hack
$wgExternalServers[$cluster][0]['user'] = $wgDBuser;
$wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
-
+
$store = new ExternalStoreDB;
$extdb =& $store->getMaster( $cluster );
$extdb->query( "SET table_type=InnoDB" );
@@ -86,4 +86,4 @@ class RenameWiki extends Maintenance {
}
$maintClass = "RenameWiki";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/renderDump.php b/maintenance/renderDump.php
index d36953f8..78c5b6f3 100644
--- a/maintenance/renderDump.php
+++ b/maintenance/renderDump.php
@@ -27,8 +27,8 @@
* @file
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class DumpRenderer extends Maintenance {
@@ -39,28 +39,45 @@ class DumpRenderer extends Maintenance {
parent::__construct();
$this->mDescription = "Take page text out of an XML dump file and render basic HTML out to files";
$this->addOption( 'output-dir', 'The directory to output the HTML files to', true, true );
+ $this->addOption( 'prefix', 'Prefix for the rendered files (defaults to wiki)', false, true );
+ $this->addOption( 'parser', 'Use an alternative parser class', false, true );
}
public function execute() {
$this->outputDirectory = $this->getOption( 'output-dir' );
+ $this->prefix = $this->getOption( 'prefix', 'wiki' );
$this->startTime = wfTime();
+ if ( $this->hasOption( 'parser' ) ) {
+ global $wgParserConf;
+ $wgParserConf['class'] = $this->getOption( 'parser' );
+ $this->prefix .= "-{$wgParserConf['class']}";
+ }
+
$source = new ImportStreamSource( $this->getStdin() );
$importer = new WikiImporter( $source );
$importer->setRevisionCallback(
array( &$this, 'handleRevision' ) );
- return $importer->doImport();
+ $importer->doImport();
+
+ $delta = wfTime() - $this->startTime;
+ $this->error( "Rendered {$this->count} pages in " . round($delta, 2) . " seconds " );
+ if ($delta > 0)
+ $this->error( round($this->count / $delta, 2) . " pages/sec" );
+ $this->error( "\n" );
}
-
+
/**
* Callback function for each revision, turn into HTML and save
* @param $rev Revision
*/
- private function handleRevision( $rev ) {
+ public function handleRevision( $rev ) {
+ global $wgParserConf;
+
$title = $rev->getTitle();
- if (!$title) {
+ if ( !$title ) {
$this->error( "Got bogus revision with null title!" );
return;
}
@@ -69,15 +86,15 @@ class DumpRenderer extends Maintenance {
$this->count++;
$sanitized = rawurlencode( $display );
- $filename = sprintf( "%s/wiki-%07d-%s.html",
+ $filename = sprintf( "%s/%s-%07d-%s.html",
$this->outputDirectory,
+ $this->prefix,
$this->count,
$sanitized );
- $this->output( sprintf( $this->stderr, "%s\n", $filename, $display ) );
+ $this->output( sprintf( "%s\n", $filename, $display ) );
- // fixme (what?)
$user = new User();
- $parser = new Parser();
+ $parser = new $wgParserConf['class']();
$options = ParserOptions::newFromUser( $user );
$output = $parser->parse( $rev->getText(), $title, $options );
@@ -89,7 +106,7 @@ class DumpRenderer extends Maintenance {
"<head>\n" .
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" .
"<title>" . htmlspecialchars( $display ) . "</title>\n" .
- "</head>\n" .
+ "</head>\n" .
"<body>\n" .
$output->getText() .
"</body>\n" .
@@ -98,4 +115,4 @@ class DumpRenderer extends Maintenance {
}
$maintClass = "DumpRenderer";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rollbackEdits.php b/maintenance/rollbackEdits.php
index 5d6a80a4..e1c126e1 100644
--- a/maintenance/rollbackEdits.php
+++ b/maintenance/rollbackEdits.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RollbackEdits extends Maintenance {
public function __construct() {
@@ -36,7 +36,7 @@ class RollbackEdits extends Maintenance {
public function execute() {
$user = $this->getOption( 'user' );
$username = User::isIP( $user ) ? $user : User::getCanonicalName( $user );
- if( !$username ) {
+ if ( !$username ) {
$this->error( 'Invalid username', true );
}
@@ -44,10 +44,10 @@ class RollbackEdits extends Maintenance {
$summary = $this->getOption( 'summary', $this->mSelf . ' mass rollback' );
$titles = array();
$results = array();
- if( $this->hasOption( 'titles' ) ) {
- foreach( explode( '|', $this->getOption( 'titles' ) ) as $title ) {
+ if ( $this->hasOption( 'titles' ) ) {
+ foreach ( explode( '|', $this->getOption( 'titles' ) ) as $title ) {
$t = Title::newFromText( $title );
- if( !$t ) {
+ if ( !$t ) {
$this->error( 'Invalid title, ' . $title );
} else {
$titles[] = $t;
@@ -57,15 +57,15 @@ class RollbackEdits extends Maintenance {
$titles = $this->getRollbackTitles( $user );
}
- if( !$titles ) {
+ if ( !$titles ) {
$this->output( 'No suitable titles to be rolled back' );
return;
}
- foreach( $titles as $t ) {
+ foreach ( $titles as $t ) {
$a = new Article( $t );
$this->output( 'Processing ' . $t->getPrefixedText() . '...' );
- if( !$a->commitRollback( $user, $summary, $bot, $results ) ) {
+ if ( !$a->commitRollback( $user, $summary, $bot, $results ) ) {
$this->output( "done\n" );
} else {
$this->output( "failed\n" );
@@ -86,7 +86,7 @@ class RollbackEdits extends Maintenance {
array( 'page_latest = rev_id', 'rev_user_text' => $user ),
__METHOD__
);
- while( $row = $dbr->fetchObject( $results ) ) {
+ foreach ( $results as $row ) {
$titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
}
return $titles;
@@ -94,4 +94,4 @@ class RollbackEdits extends Maintenance {
}
$maintClass = 'RollbackEdits';
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/runBatchedQuery.php b/maintenance/runBatchedQuery.php
index 03c56aa9..dd3680c9 100644
--- a/maintenance/runBatchedQuery.php
+++ b/maintenance/runBatchedQuery.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class BatchedQueryRunner extends Maintenance {
public function __construct() {
@@ -35,7 +35,7 @@ class BatchedQueryRunner extends Maintenance {
public function execute() {
if ( !$this->hasArg() )
$this->error( "No query specified. Specify the query as a command line parameter.", true );
-
+
$query = $this->getArg();
$wait = $this->getOption( 'wait', 5 );
$n = 1;
@@ -43,7 +43,7 @@ class BatchedQueryRunner extends Maintenance {
do {
$this->output( "Batch $n: " );
$n++;
- $dbw->query( $query );
+ $dbw->query( $query, __METHOD__ );
$affected = $dbw->affectedRows();
$this->output( "$affected rows\n" );
wfWaitForSlaves( $wait );
@@ -57,4 +57,4 @@ class BatchedQueryRunner extends Maintenance {
$maintClass = "BatchedQueryRunner";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index e03bf5d1..79ea7bfe 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class RunJobs extends Maintenance {
public function __construct() {
@@ -34,7 +34,7 @@ class RunJobs extends Maintenance {
$this->addOption( 'type', 'Type of job to run', false, true );
$this->addOption( 'procs', 'Number of processes to use', false, true );
}
-
+
public function memoryLimit() {
// Don't eat all memory on the machine if we get a bad job.
return "150M";
@@ -43,7 +43,7 @@ class RunJobs extends Maintenance {
public function execute() {
global $wgTitle;
if ( $this->hasOption( 'procs' ) ) {
- $procs = intval( $this->getOption('procs') );
+ $procs = intval( $this->getOption( 'procs' ) );
if ( $procs < 1 || $procs > 1000 ) {
$this->error( "Invalid argument to --procs", true );
}
@@ -58,22 +58,20 @@ class RunJobs extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$n = 0;
$conds = '';
- if ($type !== false)
- $conds = "job_cmd = " . $dbw->addQuotes($type);
+ if ( $type !== false )
+ $conds = "job_cmd = " . $dbw->addQuotes( $type );
while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
- $offset=0;
- for (;;) {
- $job = ($type == false) ?
- Job::pop($offset)
- : Job::pop_type($type);
-
- if ($job == false)
+ $offset = 0;
+ for ( ; ; ) {
+ $job = !$type ? Job::pop( $offset ) : Job::pop_type( $type );
+
+ if ( !$job )
break;
-
+
wfWaitForSlaves( 5 );
$t = microtime( true );
- $offset=$job->id;
+ $offset = $job->id;
$status = $job->run();
$t = microtime( true ) - $t;
$timeMs = intval( $t * 1000 );
@@ -100,4 +98,4 @@ class RunJobs extends Maintenance {
}
$maintClass = "RunJobs";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/showJobs.php b/maintenance/showJobs.php
index b385c50a..886d7d45 100644
--- a/maintenance/showJobs.php
+++ b/maintenance/showJobs.php
@@ -23,8 +23,8 @@
* @author Tim Starling
* @author Ashar Voultoiz
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ShowJobs extends Maintenance {
public function __construct() {
@@ -42,7 +42,7 @@ class ShowJobs extends Maintenance {
__METHOD__,
array( 'GROUP BY' => 'job_cmd' )
);
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$this->output( $row->job_cmd . ': ' . $row->count . "\n" );
}
} else {
@@ -52,4 +52,4 @@ class ShowJobs extends Maintenance {
}
$maintClass = "ShowJobs";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/showStats.php b/maintenance/showStats.php
index dfce3613..f695c440 100644
--- a/maintenance/showStats.php
+++ b/maintenance/showStats.php
@@ -20,7 +20,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @ingroup Maintenance
- * @author Ashar Voultoiz <hashar@altern.org>
+ * @author Ashar Voultoiz <hashar at free dot fr>
* Based on initStats.php by:
* @author Brion Vibber
* @author Rob Church <robchur@gmail.com>
@@ -28,10 +28,11 @@
* @license GNU General Public License 2.0 or later
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ShowStats extends Maintenance {
public function __construct() {
+ parent::__construct();
$this->mDescription = "Show the cached statistics";
}
public function execute() {
@@ -44,25 +45,25 @@ class ShowStats extends Maintenance {
'ss_admins' => 'Number of admins',
'ss_images' => 'Number of images',
);
-
+
// Get cached stats from slave database
$dbr = wfGetDB( DB_SLAVE );
$stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
-
+
// Get maximum size for each column
$max_length_value = $max_length_desc = 0;
- foreach( $fields as $field => $desc ) {
+ foreach ( $fields as $field => $desc ) {
$max_length_value = max( $max_length_value, strlen( $stats->$field ) );
- $max_length_desc = max( $max_length_desc , strlen( $desc )) ;
+ $max_length_desc = max( $max_length_desc , strlen( $desc ) ) ;
}
-
+
// Show them
- foreach( $fields as $field => $desc ) {
+ foreach ( $fields as $field => $desc ) {
$this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
}
}
}
$maintClass = "ShowStats";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/sql.php b/maintenance/sql.php
index fd4be19a..e1f2bb5f 100644
--- a/maintenance/sql.php
+++ b/maintenance/sql.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class MwSql extends Maintenance {
public function __construct() {
@@ -39,7 +39,7 @@ class MwSql extends Maintenance {
$promptObject = new SqlPromptPrinter( "> " );
$promptCallback = $promptObject->cb();
}
-
+
if ( !$file )
$this->error( "Unable to open input file", true );
@@ -69,7 +69,7 @@ class MwSql extends Maintenance {
$this->output( "Query OK, $affected row(s) affected\n" );
}
}
-
+
public function getDbType() {
return Maintenance::DB_ADMIN;
}
@@ -90,4 +90,4 @@ class SqlPromptPrinter {
}
$maintClass = "MwSql";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc
new file mode 100644
index 00000000..238fe82b
--- /dev/null
+++ b/maintenance/sqlite.inc
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * This class contains code common to different SQLite-related maintenance scripts
+ */
+class Sqlite {
+
+ /**
+ * Checks whether PHP has SQLite support
+ * @return bool
+ */
+ public static function isPresent() {
+ wfSuppressWarnings();
+ $compiled = wfDl( 'pdo_sqlite' );
+ wfRestoreWarnings();
+ return $compiled;
+ }
+
+ /**
+ * Checks given files for correctness of SQL syntax. MySQL DDL will be converted to
+ * SQLite-compatible during processing.
+ * Will throw exceptions on SQL errors
+ * @return mixed true if no error or error string in case of errors
+ */
+ public static function checkSqlSyntax( $files ) {
+ if ( !Sqlite::isPresent() ) {
+ throw new MWException( "Can't check SQL syntax: SQLite not found" );
+ }
+ if ( !is_array( $files ) ) {
+ $files = array( $files );
+ }
+
+ $allowedTypes = array_flip( array(
+ 'integer',
+ 'real',
+ 'text',
+ 'blob', // NULL type is omitted intentionally
+ ) );
+
+ $db = new DatabaseSqliteStandalone( ':memory:' );
+ try {
+ foreach ( $files as $file ) {
+ $err = $db->sourceFile( $file );
+ if ( $err != true ) {
+ return $err;
+ }
+ }
+
+ $tables = $db->query( "SELECT name FROM sqlite_master WHERE type='table'", __METHOD__ );
+ foreach ( $tables as $table ) {
+ if ( strpos( $table->name, 'sqlite_' ) === 0 ) continue;
+
+ $columns = $db->query( "PRAGMA table_info({$table->name})", __METHOD__ );
+ foreach ( $columns as $col ) {
+ if ( !isset( $allowedTypes[strtolower( $col->type )] ) ) {
+ $db->close();
+ return "Table {$table->name} has column {$col->name} with non-native type '{$col->type}'";
+ }
+ }
+ }
+ } catch ( DBError $e ) {
+ return $e->getMessage();
+ }
+ $db->close();
+ return true;
+ }
+ }; \ No newline at end of file
diff --git a/maintenance/sqlite.php b/maintenance/sqlite.php
index 8886fe74..13d136d8 100644
--- a/maintenance/sqlite.php
+++ b/maintenance/sqlite.php
@@ -20,7 +20,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class SqliteMaintenance extends Maintenance {
public function __construct() {
@@ -29,6 +29,7 @@ class SqliteMaintenance extends Maintenance {
$this->addOption( 'vacuum', 'Clean up database by removing deleted pages. Decreases database file size' );
$this->addOption( 'integrity', 'Check database for integrity' );
$this->addOption( 'backup-to', 'Backup database to the given file', false, true );
+ $this->addOption( 'check-syntax', 'Check SQL file(s) for syntax errors', false, true );
}
/**
@@ -41,7 +42,12 @@ class SqliteMaintenance extends Maintenance {
public function execute() {
global $wgDBtype;
-
+
+ // Should work even if we use a non-SQLite database
+ if ( $this->hasOption( 'check-syntax' ) ) {
+ $this->checkSyntax();
+ }
+
if ( $wgDBtype != 'sqlite' ) {
$this->error( "This maintenance script requires a SQLite database.\n" );
return;
@@ -66,14 +72,14 @@ class SqliteMaintenance extends Maintenance {
$prevSize = filesize( $this->db->mDatabaseFile );
if ( $prevSize == 0 ) {
$this->error( "Can't vacuum an empty database.\n", true );
- }
+ }
$this->output( 'VACUUM: ' );
if ( $this->db->query( 'VACUUM' ) ) {
clearstatcache();
$newSize = filesize( $this->db->mDatabaseFile );
$this->output( sprintf( "Database size was %d, now %d (%.1f%% reduction).\n",
- $prevSize, $newSize, ( $prevSize - $newSize) * 100.0 / $prevSize ) );
+ $prevSize, $newSize, ( $prevSize - $newSize ) * 100.0 / $prevSize ) );
} else {
$this->output( 'Error\n' );
}
@@ -107,7 +113,21 @@ class SqliteMaintenance extends Maintenance {
$this->output( " Releasing lock...\n" );
$this->db->query( 'COMMIT TRANSACTION', __METHOD__ );
}
+
+ private function checkSyntax() {
+ if ( !Sqlite::IsPresent() ) {
+ $this->error( "Error: SQLite support not found\n" );
+ }
+ $files = array( $this->getOption( 'check-syntax' ) );
+ $files += $this->mArgs;
+ $result = Sqlite::checkSqlSyntax( $files );
+ if ( $result === true ) {
+ $this->output( "SQL syntax check: no errors detected.\n" );
+ } else {
+ $this->error( "Error: $result\n" );
+ }
+ }
}
$maintClass = "SqliteMaintenance";
-require_once( DO_MAINTENANCE ); \ No newline at end of file
+require_once( RUN_MAINTENANCE_IF_MAIN ); \ No newline at end of file
diff --git a/maintenance/sqlite/archives/initial-indexes.sql b/maintenance/sqlite/archives/initial-indexes.sql
index f0851163..2573ca13 100644
--- a/maintenance/sqlite/archives/initial-indexes.sql
+++ b/maintenance/sqlite/archives/initial-indexes.sql
@@ -413,4 +413,4 @@ CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-INSERT INTO /*_*/updatelog VALUES ('initial_indexes');
+INSERT INTO /*_*/updatelog (ul_key) VALUES ('initial_indexes');
diff --git a/maintenance/sqlite/archives/patch-categorylinks-better-collation.sql b/maintenance/sqlite/archives/patch-categorylinks-better-collation.sql
new file mode 100644
index 00000000..f32af134
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-categorylinks-better-collation.sql
@@ -0,0 +1,7 @@
+ALTER TABLE /*_*/categorylinks ADD COLUMN cl_sortkey_prefix TEXT NOT NULL default '';
+ALTER TABLE /*_*/categorylinks ADD COLUMN cl_collation BLOB NOT NULL default '';
+ALTER TABLE /*_*/categorylinks ADD COLUMN cl_type TEXT NOT NULL default 'page';
+CREATE INDEX cl_collation ON /*_*/categorylinks (cl_collation);
+DROP INDEX cl_sortkey;
+CREATE INDEX cl_sortkey ON /*_*/categorylinks (cl_to, cl_type, cl_sortkey, cl_from);
+INSERT OR IGNORE INTO /*_*/updatelog (ul_key) VALUES ('cl_fields_update');
diff --git a/maintenance/sqlite/archives/patch-iw_api_and_wikiid.sql b/maintenance/sqlite/archives/patch-iw_api_and_wikiid.sql
new file mode 100644
index 00000000..f9172b5e
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-iw_api_and_wikiid.sql
@@ -0,0 +1,19 @@
+--
+-- Add iw_api and iw_wikiid to interwiki table
+--
+
+
+CREATE TABLE /*_*/interwiki_tmp (
+ iw_prefix TEXT NOT NULL,
+ iw_url BLOB NOT NULL,
+ iw_api BLOB NOT NULL,
+ iw_wikiid TEXT NOT NULL,
+ iw_local INTEGER NOT NULL,
+ iw_trans INTEGER NOT NULL default 0
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/interwiki_tmp SELECT iw_prefix, iw_url, '', '', iw_local, iw_trans FROM /*_*/interwiki;
+DROP TABLE /*_*/interwiki;
+ALTER TABLE /*_*/interwiki_tmp RENAME TO /*_*/interwiki;
+
+CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix); \ No newline at end of file
diff --git a/maintenance/sqlite/archives/patch-kill-iwl_pft.sql b/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
new file mode 100644
index 00000000..8fc4b5cd
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
@@ -0,0 +1,7 @@
+--
+-- Kill the old iwl_prefix_from_title index, which may be present on some
+-- installs if they ran update.php between it being added and being renamed
+--
+
+DROP INDEX IF EXISTS /*i*/iwl_prefix;
+
diff --git a/maintenance/sqlite/archives/patch-kill-iwl_prefix.sql b/maintenance/sqlite/archives/patch-kill-iwl_prefix.sql
new file mode 100644
index 00000000..78ed385e
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-kill-iwl_prefix.sql
@@ -0,0 +1,7 @@
+--
+-- Kill the old iwl_prefix index, which may be present on some
+-- installs if they ran update.php between it being added and being renamed
+--
+
+DROP INDEX IF EXISTS /*i*/iwl_prefix;
+
diff --git a/maintenance/sqlite/archives/patch-log_search-rename-index.sql b/maintenance/sqlite/archives/patch-log_search-rename-index.sql
new file mode 100644
index 00000000..4b98a0f2
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-log_search-rename-index.sql
@@ -0,0 +1 @@
+CREATE UNIQUE INDEX ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
diff --git a/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
new file mode 100644
index 00000000..08c3ae5f
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
@@ -0,0 +1,5 @@
+--
+-- Recreates the iwl_prefix for the iwlinks table
+--
+DROP INDEX IF EXISTS /*i*/iwl_prefix;
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title); \ No newline at end of file
diff --git a/maintenance/sqlite/archives/patch-tc-timestamp.sql b/maintenance/sqlite/archives/patch-tc-timestamp.sql
index 551a5f1c..5c09bf35 100644
--- a/maintenance/sqlite/archives/patch-tc-timestamp.sql
+++ b/maintenance/sqlite/archives/patch-tc-timestamp.sql
@@ -1,3 +1,3 @@
UPDATE /*_*/transcache SET tc_time = strftime('%Y%m%d%H%M%S', datetime(tc_time, 'unixepoch'));
-INSERT INTO /*_*/updatelog VALUES ('convert transcache field');
+INSERT INTO /*_*/updatelog (ul_key) VALUES ('convert transcache field');
diff --git a/maintenance/sqlite/archives/searchindex-fts3.sql b/maintenance/sqlite/archives/searchindex-fts3.sql
index c3a86894..28554c02 100644
--- a/maintenance/sqlite/archives/searchindex-fts3.sql
+++ b/maintenance/sqlite/archives/searchindex-fts3.sql
@@ -15,4 +15,4 @@ CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
si_text
);
-INSERT INTO /*_*/updatelog VALUES ('fts3'); \ No newline at end of file
+INSERT INTO /*_*/updatelog (ul_key) VALUES ('fts3'); \ No newline at end of file
diff --git a/maintenance/stats.php b/maintenance/stats.php
index e20c345a..2cbbcf91 100644
--- a/maintenance/stats.php
+++ b/maintenance/stats.php
@@ -20,70 +20,71 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class CacheStats extends Maintenance {
public function __construct() {
$this->mDescription = "Show statistics from the cache";
+ parent::__construct();
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_NONE;
}
public function execute() {
global $wgMemc;
-
- // Can't do stats if
- if( get_class( $wgMemc ) == 'FakeMemCachedClient' ) {
+
+ // Can't do stats if
+ if ( get_class( $wgMemc ) == 'FakeMemCachedClient' ) {
$this->error( "You are running FakeMemCachedClient, I can not provide any statistics.", true );
}
- $session = intval($wgMemc->get(wfMemcKey('stats','request_with_session')));
- $noSession = intval($wgMemc->get(wfMemcKey('stats','request_without_session')));
+ $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
+ $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
$total = $session + $noSession;
if ( $total == 0 ) {
$this->error( "You either have no stats or the cache isn't running. Aborting.", true );
}
$this->output( "Requests\n" );
- $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session/$total*100 ) );
- $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession/$total*100 ) );
+ $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
+ $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
$this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
-
-
+
+
$this->output( "\nParser cache\n" );
- $hits = intval($wgMemc->get(wfMemcKey('stats','pcache_hit')));
- $invalid = intval($wgMemc->get(wfMemcKey('stats','pcache_miss_invalid')));
- $expired = intval($wgMemc->get(wfMemcKey('stats','pcache_miss_expired')));
- $absent = intval($wgMemc->get(wfMemcKey('stats','pcache_miss_absent')));
- $stub = intval($wgMemc->get(wfMemcKey('stats','pcache_miss_stub')));
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
+ $invalid = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_invalid' ) ) );
+ $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
+ $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
+ $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
$total = $hits + $invalid + $expired + $absent + $stub;
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits/$total*100 ) );
- $this->output( sprintf( "invalid: %-10d %6.2f%%\n", $invalid, $invalid/$total*100 ) );
- $this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired/$total*100 ) );
- $this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent/$total*100 ) );
- $this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub/$total*100 ) );
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "invalid: %-10d %6.2f%%\n", $invalid, $invalid / $total * 100 ) );
+ $this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
+ $this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
+ $this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
$this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
-
- $hits = intval($wgMemc->get(wfMemcKey('stats','image_cache_hit')));
- $misses = intval($wgMemc->get(wfMemcKey('stats','image_cache_miss')));
- $updates = intval($wgMemc->get(wfMemcKey('stats','image_cache_update')));
+
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
+ $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
+ $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
$total = $hits + $misses;
- $this->output("\nImage cache\n");
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits/$total*100 ) );
- $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses/$total*100 ) );
+ $this->output( "\nImage cache\n" );
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
$this->output( sprintf( "updates: %-10d\n", $updates ) );
-
- $hits = intval($wgMemc->get(wfMemcKey('stats','diff_cache_hit')));
- $misses = intval($wgMemc->get(wfMemcKey('stats','diff_cache_miss')));
- $uncacheable = intval($wgMemc->get(wfMemcKey('stats','diff_uncacheable')));
+
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
+ $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
+ $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
$total = $hits + $misses + $uncacheable;
- $this->output("\nDiff cache\n");
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits/$total*100 ) );
- $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses/$total*100 ) );
- $this->output( sprintf( "uncacheable: %-10d %6.2f%%\n", $uncacheable, $uncacheable/$total*100 ) );
+ $this->output( "\nDiff cache\n" );
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+ $this->output( sprintf( "uncacheable: %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
}
}
$maintClass = "CacheStats";
-require_once( DO_MAINTENANCE );
-
-
-
-
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php
index 245c2fec..c288d682 100644
--- a/maintenance/storage/checkStorage.php
+++ b/maintenance/storage/checkStorage.php
@@ -9,7 +9,7 @@
define( 'CONCAT_HEADER', 'O:27:"concatenatedgziphistoryblob"' );
if ( !defined( 'MEDIAWIKI' ) ) {
- require_once( dirname(__FILE__) . '/../commandLine.inc' );
+ require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
$cs = new CheckStorage;
$fix = isset( $options['fix'] );
@@ -22,7 +22,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
-//----------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------
/**
* @ingroup Maintenance ExternalStorage
@@ -37,7 +37,7 @@ class CheckStorage {
'unfixable' => 'Unexpected errors with no automated fixing method',
'fixed' => 'Errors already fixed',
'fixable' => 'Errors which would already be fixed if --fix was specified',
- );
+ );
function check( $fix = false, $xml = '' ) {
$fname = 'checkStorage';
@@ -63,14 +63,14 @@ class CheckStorage {
for ( $chunkStart = 1 ; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
$chunkEnd = $chunkStart + $chunkSize - 1;
- //print "$chunkStart of $maxRevId\n";
+ // print "$chunkStart of $maxRevId\n";
// Fetch revision rows
$this->oldIdMap = array();
- $dbr->ping();
- $res = $dbr->select( 'revision', array( 'rev_id', 'rev_text_id' ),
+ $dbr->ping();
+ $res = $dbr->select( 'revision', array( 'rev_id', 'rev_text_id' ),
array( "rev_id BETWEEN $chunkStart AND $chunkEnd" ), $fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$this->oldIdMap[$row->rev_id] = $row->rev_text_id;
}
$dbr->freeResult( $res );
@@ -83,9 +83,9 @@ class CheckStorage {
$missingTextRows = array_flip( $this->oldIdMap );
$externalRevs = array();
$objectRevs = array();
- $res = $dbr->select( 'text', array( 'old_id', 'old_flags' ),
+ $res = $dbr->select( 'text', array( 'old_id', 'old_flags' ),
'old_id IN (' . implode( ',', $this->oldIdMap ) . ')', $fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$flags = $row->old_flags;
$id = $row->old_id;
@@ -116,7 +116,7 @@ class CheckStorage {
if ( $fix ) {
$this->error( 'fixed', "Warning: old_flags set to 0", $id );
$dbw->ping();
- $dbw->update( 'text', array( 'old_flags' => '' ),
+ $dbw->update( 'text', array( 'old_flags' => '' ),
array( 'old_id' => $id ), $fname );
echo "Fixed\n";
} else {
@@ -137,15 +137,15 @@ class CheckStorage {
$externalConcatBlobs = array();
$externalNormalBlobs = array();
if ( count( $externalRevs ) ) {
- $res = $dbr->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
+ $res = $dbr->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
array( 'old_id IN (' . implode( ',', $externalRevs ) . ')' ), $fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$urlParts = explode( '://', $row->old_text, 2 );
if ( count( $urlParts ) !== 2 || $urlParts[1] == '' ) {
$this->error( 'restore text', "Error: invalid URL \"{$row->old_text}\"", $row->old_id );
continue;
}
- list( $proto, $path ) = $urlParts;
+ list( $proto, ) = $urlParts;
if ( $proto != 'DB' ) {
$this->error( 'restore text', "Error: invalid external protocol \"$proto\"", $row->old_id );
continue;
@@ -164,7 +164,7 @@ class CheckStorage {
// Check external concat blobs for the right header
$this->checkExternalConcatBlobs( $externalConcatBlobs );
-
+
// Check external normal blobs for existence
if ( count( $externalNormalBlobs ) ) {
if ( is_null( $this->dbStore ) ) {
@@ -174,10 +174,10 @@ class CheckStorage {
$blobIds = array_keys( $xBlobIds );
$extDb =& $this->dbStore->getSlave( $cluster );
$blobsTable = $this->dbStore->getTable( $extDb );
- $res = $extDb->select( $blobsTable,
- array( 'blob_id' ),
+ $res = $extDb->select( $blobsTable,
+ array( 'blob_id' ),
array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), $fname );
- while ( $row = $extDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
unset( $xBlobIds[$row->blob_id] );
}
$extDb->freeResult( $res );
@@ -194,9 +194,9 @@ class CheckStorage {
$curIds = array();
if ( count( $objectRevs ) ) {
$headerLength = 300;
- $res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
+ $res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
array( 'old_id IN (' . implode( ',', $objectRevs ) . ')' ), $fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$oldId = $row->old_id;
$matches = array();
if ( !preg_match( '/^O:(\d+):"(\w+)"/', $row->header, $matches ) ) {
@@ -245,9 +245,9 @@ class CheckStorage {
$externalConcatBlobs = array();
if ( count( $concatBlobs ) ) {
$headerLength = 300;
- $res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
+ $res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
array( 'old_id IN (' . implode( ',', array_keys( $concatBlobs ) ) . ')' ), $fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
$flags = explode( ',', $row->old_flags );
if ( in_array( 'external', $flags ) ) {
// Concat blob is in external storage?
@@ -261,7 +261,7 @@ class CheckStorage {
if ( !isset( $externalConcatBlobs[$cluster][$id] ) ) {
$externalConcatBlobs[$cluster][$id] = array();
}
- $externalConcatBlobs[$cluster][$id] = array_merge(
+ $externalConcatBlobs[$cluster][$id] = array_merge(
$externalConcatBlobs[$cluster][$id], $concatBlobs[$row->old_id]
);
}
@@ -270,7 +270,7 @@ class CheckStorage {
$concatBlobs[$row->old_id] );
}
} elseif ( strcasecmp( substr( $row->header, 0, strlen( CONCAT_HEADER ) ), CONCAT_HEADER ) ) {
- $this->error( 'restore text', "Error: Incorrect object header for concat bulk row {$row->old_id}",
+ $this->error( 'restore text', "Error: Incorrect object header for concat bulk row {$row->old_id}",
$concatBlobs[$row->old_id] );
} # else good
@@ -286,7 +286,7 @@ class CheckStorage {
}
print "\n\nErrors:\n";
- foreach( $this->errors as $name => $errors ) {
+ foreach ( $this->errors as $name => $errors ) {
if ( count( $errors ) ) {
$description = $this->errorDescriptions[$name];
echo "$description: " . implode( ',', array_keys( $errors ) ) . "\n";
@@ -323,7 +323,7 @@ class CheckStorage {
foreach ( $ids as $id ) {
$revIds = array_merge( $revIds, array_keys( $this->oldIdMap, $id ) );
}
- print "$msg in text rows " . implode( ', ', $ids ) .
+ print "$msg in text rows " . implode( ', ', $ids ) .
", revisions " . implode( ', ', $revIds ) . "\n";
} else {
$id = $ids;
@@ -346,18 +346,18 @@ class CheckStorage {
if ( is_null( $this->dbStore ) ) {
$this->dbStore = new ExternalStoreDB;
}
-
+
foreach ( $externalConcatBlobs as $cluster => $oldIds ) {
$blobIds = array_keys( $oldIds );
$extDb =& $this->dbStore->getSlave( $cluster );
$blobsTable = $this->dbStore->getTable( $extDb );
$headerLength = strlen( CONCAT_HEADER );
- $res = $extDb->select( $blobsTable,
- array( 'blob_id', "LEFT(blob_text, $headerLength) AS header" ),
+ $res = $extDb->select( $blobsTable,
+ array( 'blob_id', "LEFT(blob_text, $headerLength) AS header" ),
array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), $fname );
- while ( $row = $extDb->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
if ( strcasecmp( $row->header, CONCAT_HEADER ) ) {
- $this->error( 'restore text', "Error: invalid header on target $cluster/{$row->blob_id} of two-part ES URL",
+ $this->error( 'restore text', "Error: invalid header on target $cluster/{$row->blob_id} of two-part ES URL",
$oldIds[$row->blob_id] );
}
unset( $oldIds[$row->blob_id] );
@@ -383,7 +383,7 @@ class CheckStorage {
$revFileName = "$wgTmpDirectory/broken-revlist-$wgDBname";
$filteredXmlFileName = "$wgTmpDirectory/filtered-$wgDBname.xml";
-
+
// Write revision list
if ( !file_put_contents( $revFileName, implode( "\n", $revIds ) ) ) {
echo "Error writing revision list, can't restore text\n";
@@ -393,8 +393,8 @@ class CheckStorage {
// Run mwdumper
echo "Filtering XML dump...\n";
$exitStatus = 0;
- passthru( 'mwdumper ' .
- wfEscapeShellArg(
+ passthru( 'mwdumper ' .
+ wfEscapeShellArg(
"--output=file:$filteredXmlFileName",
"--filter=revlist:$revFileName",
$xml
@@ -416,7 +416,7 @@ class CheckStorage {
$dbw = wfGetDB( DB_MASTER );
$dbr->ping();
$dbw->ping();
-
+
$source = new ImportStreamSource( $file );
$importer = new WikiImporter( $source );
$importer->setRevisionCallback( array( &$this, 'importRevision' ) );
@@ -429,8 +429,8 @@ class CheckStorage {
$id = $revision->getID();
$text = $revision->getText();
if ( $text === '' ) {
- // This is what happens if the revision was broken at the time the
- // dump was made. Unfortunately, it also happens if the revision was
+ // This is what happens if the revision was broken at the time the
+ // dump was made. Unfortunately, it also happens if the revision was
// legitimately blank, so there's no way to tell the difference. To
// be safe, we'll skip it and leave it broken
$id = $id ? $id : '';
@@ -457,7 +457,7 @@ class CheckStorage {
// Update the text row
$dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'text',
+ $dbw->update( 'text',
array( 'old_flags' => $flags, 'old_text' => $text ),
array( 'old_id' => $oldId ),
$fname, array( 'LIMIT' => 1 )
diff --git a/maintenance/storage/compressOld.inc b/maintenance/storage/compressOld.inc
index 981cfda5..93be5f75 100644
--- a/maintenance/storage/compressOld.inc
+++ b/maintenance/storage/compressOld.inc
@@ -18,12 +18,11 @@ function compressOldPages( $start = 0, $extdb = '' ) {
break;
}
$last = $start;
- while( $row = $dbw->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
# print " {$row->old_id} - {$row->old_namespace}:{$row->old_title}\n";
compressPage( $row, $extdb );
$last = $row->old_id;
}
- $dbw->freeResult( $res );
$start = $last + 1; # Deletion may leave long empty stretches
print "$start...\n";
} while( true );
@@ -67,7 +66,7 @@ define( 'LS_INDIVIDUAL', 0 );
define( 'LS_CHUNKED', 1 );
/** @todo document */
-function compressWithConcat( $startId, $maxChunkSize, $beginDate,
+function compressWithConcat( $startId, $maxChunkSize, $beginDate,
$endDate, $extdb="", $maxPageId = false )
{
$fname = 'compressWithConcat';
@@ -94,12 +93,12 @@ function compressWithConcat( $startId, $maxChunkSize, $beginDate,
$pageConds[] = 'page_namespace<>0';
}
if ( $queryExtra ) {
- $pageConds[] = $queryExtra;
+ $pageConds[] = $queryExtra;
}
*/
# For each article, get a list of revisions which fit the criteria
-
+
# No recompression, use a condition on old_flags
# Don't compress object type entities, because that might produce data loss when
# overwriting bulk storage concat rows. Don't compress external references, because
@@ -142,10 +141,10 @@ function compressWithConcat( $startId, $maxChunkSize, $beginDate,
wfWaitForSlaves( 5 );
# Wake up
- $dbr->ping();
+ $dbr->ping();
# Get the page row
- $pageRes = $dbr->select( 'page',
+ $pageRes = $dbr->select( 'page',
array('page_id', 'page_namespace', 'page_title','page_latest'),
$pageConds + array('page_id' => $pageId), $fname );
if ( $dbr->numRows( $pageRes ) == 0 ) {
@@ -159,10 +158,10 @@ function compressWithConcat( $startId, $maxChunkSize, $beginDate,
# Load revisions
$revRes = $dbw->select( $tables, $fields,
- array_merge( array(
- 'rev_page' => $pageRow->page_id,
+ array_merge( array(
+ 'rev_page' => $pageRow->page_id,
# Don't operate on the current revision
- # Use < instead of <> in case the current revision has changed
+ # Use < instead of <> in case the current revision has changed
# since the page select, which wasn't locking
'rev_id < ' . $pageRow->page_latest
), $conds ),
@@ -170,7 +169,7 @@ function compressWithConcat( $startId, $maxChunkSize, $beginDate,
$revLoadOptions
);
$revs = array();
- while ( $revRow = $dbw->fetchObject( $revRes ) ) {
+ foreach ( $revRes as $revRow ) {
$revs[] = $revRow;
}
diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php
index 7ff102a5..bc05b340 100644
--- a/maintenance/storage/compressOld.php
+++ b/maintenance/storage/compressOld.php
@@ -25,10 +25,10 @@
*/
$optionsWithArgs = array( 't', 'c', 's', 'f', 'h', 'extdb', 'endid', 'e' );
-require_once( dirname(__FILE__) . '/../commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
require_once( "compressOld.inc" );
-if( !function_exists( "gzdeflate" ) ) {
+if ( !function_exists( "gzdeflate" ) ) {
print "You must enable zlib support in PHP to compress old revisions!\n";
print "Please see http://www.php.net/manual/en/ref.zlib.php\n\n";
wfDie();
@@ -39,9 +39,9 @@ $defaults = array(
'c' => 20,
's' => 0,
'b' => '',
- 'e' => '',
- 'extdb' => '',
- 'endid' => false,
+ 'e' => '',
+ 'extdb' => '',
+ 'endid' => false,
);
$options = $options + $defaults;
@@ -51,15 +51,15 @@ if ( $options['t'] != 'concat' && $options['t'] != 'gzip' ) {
}
if ( $options['extdb'] != '' ) {
- print "Compressing database $wgDBname to external cluster {$options['extdb']}\n" . str_repeat('-', 76) . "\n\n";
+ print "Compressing database $wgDBname to external cluster {$options['extdb']}\n" . str_repeat( '-', 76 ) . "\n\n";
} else {
- print "Compressing database $wgDBname\n" . str_repeat('-', 76) . "\n\n";
+ print "Compressing database $wgDBname\n" . str_repeat( '-', 76 ) . "\n\n";
}
$success = true;
if ( $options['t'] == 'concat' ) {
- $success = compressWithConcat( $options['s'], $options['c'], $options['b'],
- $options['e'], $options['extdb'], $options['endid'] );
+ $success = compressWithConcat( $options['s'], $options['c'], $options['b'],
+ $options['e'], $options['extdb'], $options['endid'] );
} else {
compressOldPages( $options['s'], $options['extdb'] );
}
@@ -68,6 +68,6 @@ if ( $success ) {
print "Done.\n";
}
-exit(0);
+exit( 0 );
diff --git a/maintenance/storage/dumpRev.php b/maintenance/storage/dumpRev.php
index 95404244..b200d8af 100644
--- a/maintenance/storage/dumpRev.php
+++ b/maintenance/storage/dumpRev.php
@@ -18,7 +18,7 @@
* @ingroup Maintenance ExternalStorage
*/
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class DumpRev extends Maintenance {
public function __construct() {
@@ -28,15 +28,15 @@ class DumpRev extends Maintenance {
public function execute() {
$dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow(
- array( 'text', 'revision' ),
- array( 'old_flags', 'old_text' ),
+ $row = $dbr->selectRow(
+ array( 'text', 'revision' ),
+ array( 'old_flags', 'old_text' ),
array( 'old_id=rev_text_id', 'rev_id' => $this->getArg() )
);
if ( !$row ) {
$this->error( "Row not found", true );
}
-
+
$flags = explode( ',', $row->old_flags );
$text = $row->old_text;
if ( in_array( 'external', $flags ) ) {
@@ -65,15 +65,15 @@ class DumpRev extends Maintenance {
$obj = unserialize( $text );
$text = $obj->getText();
}
-
+
if ( is_object( $text ) ) {
$this->error( "Unexpectedly got object of type: " . get_class( $text ) );
} else {
- $this->output( "Text length: " . strlen( $text ) ."\n" );
+ $this->output( "Text length: " . strlen( $text ) . "\n" );
$this->output( substr( $text, 0, 100 ) . "\n" );
}
}
}
$maintClass = "DumpRev";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
index 922d4725..4aac1202 100644
--- a/maintenance/storage/fixBug20757.php
+++ b/maintenance/storage/fixBug20757.php
@@ -14,7 +14,7 @@ class FixBug20757 extends Maintenance {
$this->addOption( 'dry-run', 'Report only' );
$this->addOption( 'start', 'old_id to start at', false, true );
}
-
+
function execute() {
$dbr = wfGetDB( DB_SLAVE );
$dbw = wfGetDB( DB_MASTER );
@@ -31,19 +31,29 @@ class FixBug20757 extends Maintenance {
$totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
+ if ( $dbr->getType() == 'mysql'
+ && version_compare( $dbr->getServerVersion(), '4.1.0', '>=' ) )
+ {
+ // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
+ $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
+ } else {
+ // No CONVERT() in MySQL 4.0
+ $lowerLeft = 'LOWER(LEFT(old_text,22))';
+ }
+
while ( true ) {
print "ID: $startId / $totalRevs\r";
$res = $dbr->select(
'text',
array( 'old_id', 'old_flags', 'old_text' ),
- array(
+ array(
'old_id > ' . intval( $startId ),
'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
- 'LOWER(CONVERT(LEFT(old_text,22) USING latin1)) = \'o:15:"historyblobstub"\'',
+ "$lowerLeft = 'o:15:\"historyblobstub\"'",
),
__METHOD__,
- array(
+ array(
'ORDER BY' => 'old_id',
'LIMIT' => $this->batchSize,
)
@@ -68,7 +78,7 @@ class FixBug20757 extends Maintenance {
}
if ( !is_object( $obj ) ) {
- print "{$row->old_id}: unrecoverable: unserialized to type " .
+ print "{$row->old_id}: unrecoverable: unserialized to type " .
gettype( $obj ) . ", possible double-serialization\n";
++$numBad;
continue;
@@ -120,22 +130,21 @@ class FixBug20757 extends Maintenance {
}
// Process the stubs
- $stubsToFix = array();
foreach ( $stubs as $primaryId => $stub ) {
$secondaryId = $stub['secondaryId'];
if ( !isset( $trackedBlobs[$secondaryId] ) ) {
// No tracked blob. Work out what went wrong
- $secondaryRow = $dbr->selectRow(
- 'text',
+ $secondaryRow = $dbr->selectRow(
+ 'text',
array( 'old_flags', 'old_text' ),
- array( 'old_id' => $secondaryId ),
+ array( 'old_id' => $secondaryId ),
__METHOD__
);
if ( !$secondaryRow ) {
print "$primaryId: unrecoverable: secondary row is missing\n";
++$numBad;
} elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
- // Not broken yet, and not in the tracked clusters so it won't get
+ // Not broken yet, and not in the tracked clusters so it won't get
// broken by the current RCT run.
++$numGood;
} elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
@@ -196,7 +205,7 @@ class FixBug20757 extends Maintenance {
__METHOD__
);
- // Add a blob_tracking row so that the new reference can be recompressed
+ // Add a blob_tracking row so that the new reference can be recompressed
// without needing to run trackBlobs.php again
$dbw->insert( 'blob_tracking',
array(
@@ -255,7 +264,7 @@ class FixBug20757 extends Maintenance {
$dbr = wfGetDB( DB_SLAVE );
$map = array();
- $res = $dbr->select( 'revision',
+ $res = $dbr->select( 'revision',
array( 'rev_id', 'rev_text_id' ),
array( 'rev_page' => $pageId ),
__METHOD__
@@ -276,7 +285,7 @@ class FixBug20757 extends Maintenance {
function isUnbrokenStub( $stub, $secondaryRow ) {
$flags = explode( ',', $secondaryRow->old_flags );
$text = $secondaryRow->old_text;
- if( in_array( 'external', $flags ) ) {
+ if ( in_array( 'external', $flags ) ) {
$url = $text;
@list( /* $proto */ , $path ) = explode( '://', $url, 2 );
if ( $path == "" ) {
@@ -284,17 +293,17 @@ class FixBug20757 extends Maintenance {
}
$text = ExternalStore::fetchFromUrl( $url );
}
- if( !in_array( 'object', $flags ) ) {
+ if ( !in_array( 'object', $flags ) ) {
return false;
}
- if( in_array( 'gzip', $flags ) ) {
+ if ( in_array( 'gzip', $flags ) ) {
$obj = unserialize( gzinflate( $text ) );
} else {
$obj = unserialize( $text );
}
- if( !is_object( $obj ) ) {
+ if ( !is_object( $obj ) ) {
// Correct for old double-serialization bug.
$obj = unserialize( $obj );
}
@@ -310,5 +319,5 @@ class FixBug20757 extends Maintenance {
}
$maintClass = 'FixBug20757';
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/storage/moveToExternal.php b/maintenance/storage/moveToExternal.php
index dc11856a..928cbf97 100644
--- a/maintenance/storage/moveToExternal.php
+++ b/maintenance/storage/moveToExternal.php
@@ -9,10 +9,8 @@
define( 'REPORTING_INTERVAL', 1 );
if ( !defined( 'MEDIAWIKI' ) ) {
- $optionsWithArgs = array( 'e', 's' );
-
- require_once( dirname(__FILE__) . '/../commandLine.inc' );
- require_once( 'ExternalStoreDB.php' );
+ require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+ require_once( dirname( __FILE__ ) . '/../../includes/ExternalStoreDB.php' );
require_once( 'resolveStubs.php' );
$fname = 'moveToExternal';
@@ -35,8 +33,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
moveToExternal( $cluster, $maxID, $minID );
}
-
-
function moveToExternal( $cluster, $maxID, $minID = 1 ) {
$fname = 'moveToExternal';
$dbw = wfGetDB( DB_MASTER );
@@ -48,23 +44,22 @@ function moveToExternal( $cluster, $maxID, $minID = 1 ) {
print "Moving text rows from $minID to $maxID to external storage\n";
$ext = new ExternalStoreDB;
$numMoved = 0;
- $numStubs = 0;
-
+
for ( $block = 0; $block < $numBlocks; $block++ ) {
$blockStart = $block * $blockSize + $minID;
$blockEnd = $blockStart + $blockSize - 1;
-
- if ( !($block % REPORTING_INTERVAL) ) {
+
+ if ( !( $block % REPORTING_INTERVAL ) ) {
print "oldid=$blockStart, moved=$numMoved\n";
wfWaitForSlaves( 2 );
}
-
+
$res = $dbr->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
array(
"old_id BETWEEN $blockStart AND $blockEnd",
'old_flags NOT ' . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() ),
), $fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
# Resolve stubs
$text = $row->old_text;
$id = $row->old_id;
@@ -73,13 +68,13 @@ function moveToExternal( $cluster, $maxID, $minID = 1 ) {
} else {
$flags = "{$row->old_flags},external";
}
-
+
if ( strpos( $flags, 'object' ) !== false ) {
$obj = unserialize( $text );
$className = strtolower( get_class( $obj ) );
if ( $className == 'historyblobstub' ) {
- #resolveStub( $id, $row->old_text, $row->old_flags );
- #$numStubs++;
+ # resolveStub( $id, $row->old_text, $row->old_flags );
+ # $numStubs++;
continue;
} elseif ( $className == 'historyblobcurstub' ) {
$text = gzdeflate( $obj->getText() );
@@ -99,8 +94,8 @@ function moveToExternal( $cluster, $maxID, $minID = 1 ) {
continue;
}
- #print "Storing " . strlen( $text ) . " bytes to $url\n";
- #print "old_id=$id\n";
+ # print "Storing " . strlen( $text ) . " bytes to $url\n";
+ # print "old_id=$id\n";
$url = $ext->store( $cluster, $text );
if ( !$url ) {
@@ -112,7 +107,6 @@ function moveToExternal( $cluster, $maxID, $minID = 1 ) {
array( 'old_id' => $id ), $fname );
$numMoved++;
}
- $dbr->freeResult( $res );
}
}
diff --git a/maintenance/storage/orphanStats.php b/maintenance/storage/orphanStats.php
index 63f9025b..f30f07e4 100644
--- a/maintenance/storage/orphanStats.php
+++ b/maintenance/storage/orphanStats.php
@@ -20,7 +20,7 @@
*
* @ingroup Maintenance ExternalStorage
*/
-require_once( dirname(__FILE__) . '/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class OrphanStats extends Maintenance {
public function __construct() {
@@ -34,13 +34,12 @@ class OrphanStats extends Maintenance {
}
public function execute() {
- $extDBs = array();
$dbr = wfGetDB( DB_SLAVE );
- if( !$dbr->tableExists( 'blob_orphans' ) ) {
+ if ( !$dbr->tableExists( 'blob_orphans' ) ) {
$this->error( "blob_orphans doesn't seem to exist, need to run trackBlobs.php first", true );
}
$res = $dbr->select( 'blob_orphans', '*', false, __METHOD__ );
-
+
$num = 0;
$totalSize = 0;
$hashes = array();
@@ -49,7 +48,7 @@ class OrphanStats extends Maintenance {
foreach ( $res as $boRow ) {
$extDB = $this->getDB( $boRow->bo_cluster );
$blobRow = $extDB->selectRow( 'blobs', '*', array( 'blob_id' => $boRow->bo_blob_id ), __METHOD__ );
-
+
$num++;
$size = strlen( $blobRow->blob_text );
$totalSize += $size;
@@ -61,11 +60,11 @@ class OrphanStats extends Maintenance {
$this->output( "Number of orphans: $num\n" );
if ( $num > 0 ) {
$this->output( "Average size: " . round( $totalSize / $num, 0 ) . " bytes\n" .
- "Max size: $maxSize\n" .
+ "Max size: $maxSize\n" .
"Number of unique texts: " . count( $hashes ) . "\n" );
}
}
}
$maintClass = "OrphanStats";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php
index e43dbe5c..8974a74d 100644
--- a/maintenance/storage/recompressTracked.php
+++ b/maintenance/storage/recompressTracked.php
@@ -1,14 +1,14 @@
<?php
$optionsWithArgs = RecompressTracked::getOptionsWithArgs();
-require( dirname( __FILE__ ) .'/../commandLine.inc' );
+require( dirname( __FILE__ ) . '/../commandLine.inc' );
if ( count( $args ) < 1 ) {
echo "Usage: php recompressTracked.php [options] <cluster> [... <cluster>...]
Moves blobs indexed by trackBlobs.php to a specified list of destination clusters, and recompresses them in the process. Restartable.
-Options:
- --procs <procs> Set the number of child processes (default 1)
+Options:
+ --procs <procs> Set the number of child processes (default 1)
--copy-only Copy only, do not update the text table. Restart without this option to complete.
--debug-log <file> Log debugging data to the specified file
--info-log <file> Log progress messages to the specified file
@@ -99,7 +99,7 @@ class RecompressTracked {
}
function logToFile( $msg, $file ) {
- $header = '[' . date('d\TH:i:s') . '] ' . wfHostname() . ' ' . posix_getpid();
+ $header = '[' . date( 'd\TH:i:s' ) . '] ' . wfHostname() . ' ' . posix_getpid();
if ( $this->slaveId !== false ) {
$header .= "({$this->slaveId})";
}
@@ -109,8 +109,8 @@ class RecompressTracked {
/**
* Wait until the selected slave has caught up to the master.
- * This allows us to use the slave for things that were committed in a
- * previous part of this batch process.
+ * This allows us to use the slave for things that were committed in a
+ * previous part of this batch process.
*/
function syncDBs() {
$dbw = wfGetDB( DB_MASTER );
@@ -179,14 +179,14 @@ class RecompressTracked {
$cmd .= " --$cmdOption";
}
}
- $cmd .= ' --child' .
+ $cmd .= ' --child' .
' --wiki ' . wfEscapeShellArg( wfWikiID() ) .
' ' . call_user_func_array( 'wfEscapeShellArg', $this->destClusters );
$this->slavePipes = $this->slaveProcs = array();
for ( $i = 0; $i < $this->numProcs; $i++ ) {
$pipes = false;
- $spec = array(
+ $spec = array(
array( 'pipe', 'r' ),
array( 'file', 'php://stdout', 'w' ),
array( 'file', 'php://stderr', 'w' )
@@ -228,7 +228,7 @@ class RecompressTracked {
function dispatch( /*...*/ ) {
$args = func_get_args();
$pipes = $this->slavePipes;
- $numPipes = stream_select( $x=array(), $pipes, $y=array(), 3600 );
+ $numPipes = stream_select( $x = array(), $pipes, $y = array(), 3600 );
if ( !$numPipes ) {
$this->critical( "Error waiting to write to slaves. Aborting" );
exit( 1 );
@@ -264,8 +264,8 @@ class RecompressTracked {
if ( $this->noCount ) {
$numPages = '[unknown]';
} else {
- $numPages = $dbr->selectField( 'blob_tracking',
- 'COUNT(DISTINCT bt_page)',
+ $numPages = $dbr->selectField( 'blob_tracking',
+ 'COUNT(DISTINCT bt_page)',
# A condition is required so that this query uses the index
array( 'bt_moved' => 0 ),
__METHOD__
@@ -277,15 +277,15 @@ class RecompressTracked {
$this->info( "Moving pages..." );
}
while ( true ) {
- $res = $dbr->select( 'blob_tracking',
+ $res = $dbr->select( 'blob_tracking',
array( 'bt_page' ),
- array(
+ array(
'bt_moved' => 0,
'bt_page > ' . $dbr->addQuotes( $startId )
),
__METHOD__,
- array(
- 'DISTINCT',
+ array(
+ 'DISTINCT',
'ORDER BY' => 'bt_page',
'LIMIT' => $this->batchSize,
)
@@ -330,8 +330,8 @@ class RecompressTracked {
if ( $this->noCount ) {
$numOrphans = '[unknown]';
} else {
- $numOrphans = $dbr->selectField( 'blob_tracking',
- 'COUNT(DISTINCT bt_text_id)',
+ $numOrphans = $dbr->selectField( 'blob_tracking',
+ 'COUNT(DISTINCT bt_text_id)',
array( 'bt_moved' => 0, 'bt_page' => 0 ),
__METHOD__ );
if ( !$numOrphans ) {
@@ -440,8 +440,8 @@ class RecompressTracked {
$trx = new CgzCopyTransaction( $this, $this->pageBlobClass );
while ( true ) {
- $res = $dbr->select(
- array( 'blob_tracking', 'text' ),
+ $res = $dbr->select(
+ array( 'blob_tracking', 'text' ),
'*',
array(
'bt_page' => $pageId,
@@ -451,7 +451,7 @@ class RecompressTracked {
'bt_text_id=old_id',
),
__METHOD__,
- array(
+ array(
'ORDER BY' => 'bt_text_id',
'LIMIT' => $this->batchSize
)
@@ -496,7 +496,7 @@ class RecompressTracked {
*
* This is done in a single transaction to provide restartable behaviour
* without data loss.
- *
+ *
* The transaction is kept short to reduce locking.
*/
function moveTextRow( $textId, $url ) {
@@ -536,16 +536,16 @@ class RecompressTracked {
$dbr = wfGetDB( DB_SLAVE );
$startId = 0;
- $conds = array_merge( $conds, array(
+ $conds = array_merge( $conds, array(
'bt_moved' => 0,
'bt_new_url IS NOT NULL'
- ));
+ ) );
while ( true ) {
$res = $dbr->select( 'blob_tracking',
'*',
array_merge( $conds, array( 'bt_text_id > ' . $dbr->addQuotes( $startId ) ) ),
__METHOD__,
- array(
+ array(
'ORDER BY' => 'bt_text_id',
'LIMIT' => $this->batchSize,
)
@@ -592,17 +592,17 @@ class RecompressTracked {
$this->finishIncompleteMoves( array( 'bt_text_id' => $textIds ) );
$this->syncDBs();
}
-
+
$trx = new CgzCopyTransaction( $this, $this->orphanBlobClass );
$res = wfGetDB( DB_SLAVE )->select(
- array( 'text', 'blob_tracking' ),
- array( 'old_id', 'old_text', 'old_flags' ),
- array(
+ array( 'text', 'blob_tracking' ),
+ array( 'old_id', 'old_text', 'old_flags' ),
+ array(
'old_id' => $textIds,
'bt_text_id=old_id',
'bt_moved' => 0,
- ),
+ ),
__METHOD__,
array( 'DISTINCT' )
);
@@ -610,10 +610,10 @@ class RecompressTracked {
foreach ( $res as $row ) {
$text = Revision::getRevisionText( $row );
if ( $text === false ) {
- $this->critical( "Error: cannot load revision text for old_id=$textId" );
+ $this->critical( "Error: cannot load revision text for old_id={$row->old_id}" );
continue;
}
-
+
if ( !$trx->addItem( $text, $row->old_id ) ) {
$this->debug( "[orphan]: committing blob with " . $trx->getSize() . " rows" );
$trx->commit();
@@ -625,7 +625,7 @@ class RecompressTracked {
$trx->commit();
}
- /**
+ /**
* Wait for slaves (quietly)
*/
function waitForSlaves() {
@@ -704,14 +704,14 @@ class CgzCopyTransaction {
// Check to see if the target text_ids have been moved already.
//
- // We originally read from the slave, so this can happen when a single
- // text_id is shared between multiple pages. It's rare, but possible
+ // We originally read from the slave, so this can happen when a single
+ // text_id is shared between multiple pages. It's rare, but possible
// if a delete/move/undelete cycle splits up a null edit.
//
// We do a locking read to prevent closer-run race conditions.
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
- $res = $dbw->select( 'blob_tracking',
+ $res = $dbw->select( 'blob_tracking',
array( 'bt_text_id', 'bt_moved' ),
array( 'bt_text_id' => array_keys( $this->referrers ) ),
__METHOD__, array( 'FOR UPDATE' ) );
diff --git a/maintenance/storage/resolveStubs.php b/maintenance/storage/resolveStubs.php
index 346151e9..2269e37f 100644
--- a/maintenance/storage/resolveStubs.php
+++ b/maintenance/storage/resolveStubs.php
@@ -9,7 +9,7 @@ define( 'REPORTING_INTERVAL', 100 );
if ( !defined( 'MEDIAWIKI' ) ) {
$optionsWithArgs = array( 'm' );
- require_once( dirname(__FILE__) . '/../commandLine.inc' );
+ require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
resolveStubs();
}
@@ -28,22 +28,19 @@ function resolveStubs() {
for ( $b = 0; $b < $numBlocks; $b++ ) {
wfWaitForSlaves( 2 );
-
+
printf( "%5.2f%%\n", $b / $numBlocks * 100 );
- $start = intval($maxID / $numBlocks) * $b + 1;
- $end = intval($maxID / $numBlocks) * ($b + 1);
-
+ $start = intval( $maxID / $numBlocks ) * $b + 1;
+ $end = intval( $maxID / $numBlocks ) * ( $b + 1 );
+
$res = $dbr->select( 'text', array( 'old_id', 'old_text', 'old_flags' ),
"old_id>=$start AND old_id<=$end " .
- "AND old_flags LIKE '%object%' AND old_flags NOT LIKE '%external%' ".
- 'AND LOWER(CONVERT(LEFT(old_text,22) USING latin1)) = \'o:15:"historyblobstub"\'',
+ "AND old_flags LIKE '%object%' AND old_flags NOT LIKE '%external%' " .
+ 'AND LOWER(CONVERT(LEFT(old_text,22) USING latin1)) = \'o:15:"historyblobstub"\'',
$fname );
- while ( $row = $dbr->fetchObject( $res ) ) {
+ foreach ( $res as $row ) {
resolveStub( $row->old_id, $row->old_text, $row->old_flags );
}
- $dbr->freeResult( $res );
-
-
}
print "100%\n";
}
@@ -84,7 +81,7 @@ function resolveStub( $id, $stubText, $flags ) {
}
# Update the row
- #print "oldid=$id\n";
+ # print "oldid=$id\n";
$dbw->update( 'text',
array( /* SET */
'old_flags' => $newFlags,
diff --git a/maintenance/storage/storageTypeStats.php b/maintenance/storage/storageTypeStats.php
index 85858620..be86c531 100644
--- a/maintenance/storage/storageTypeStats.php
+++ b/maintenance/storage/storageTypeStats.php
@@ -1,6 +1,6 @@
<?php
-require_once( dirname(__FILE__).'/../Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
class StorageTypeStats extends Maintenance {
function execute() {
@@ -12,7 +12,6 @@ class StorageTypeStats extends Maintenance {
exit( 1 );
}
- $rangeStart = 0;
$binSize = intval( pow( 10, floor( log10( $endId ) ) - 3 ) );
if ( $binSize < 100 ) {
$binSize = 100;
@@ -86,7 +85,7 @@ SQL;
echo str_repeat( '-', 120 ) . "\n";
foreach ( $stats as $flags => $flagStats ) {
foreach ( $flagStats as $class => $entry ) {
- printf( $format, $flags, $class, $entry['count'],
+ printf( $format, $flags, $class, $entry['count'],
sprintf( "%-13d - %-13d", $entry['first'], $entry['last'] ) );
}
}
@@ -94,5 +93,5 @@ SQL;
}
$maintClass = 'StorageTypeStats';
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/storage/testCompression.php b/maintenance/storage/testCompression.php
index 9c96c9f8..e2718325 100644
--- a/maintenance/storage/testCompression.php
+++ b/maintenance/storage/testCompression.php
@@ -1,7 +1,7 @@
<?php
$optionsWithArgs = array( 'start', 'limit', 'type' );
-require( dirname(__FILE__).'/../commandLine.inc' );
+require( dirname( __FILE__ ) . '/../commandLine.inc' );
if ( !isset( $args[0] ) ) {
echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] [--limit=<num-revs>] <page-title>\n";
@@ -26,10 +26,10 @@ $type = isset( $options['type'] ) ? $options['type'] : 'ConcatenatedGzipHistoryB
$dbr = wfGetDB( DB_SLAVE );
-$res = $dbr->select(
+$res = $dbr->select(
array( 'page', 'revision', 'text' ),
'*',
- array(
+ array(
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey(),
'page_id=rev_page',
@@ -56,9 +56,9 @@ foreach ( $res as $row ) {
$serialized = serialize( $blob );
$t += microtime( true );
-#print_r( $blob->mDiffMap );
+# print_r( $blob->mDiffMap );
-printf( "%s\nCompression ratio for %d revisions: %5.2f, %s -> %d\n",
+printf( "%s\nCompression ratio for %d revisions: %5.2f, %s -> %d\n",
$type,
count( $hashes ),
$uncompressedSize / strlen( $serialized ),
@@ -73,7 +73,7 @@ foreach ( $keys as $id => $key ) {
$text = $blob->getItem( $key );
if ( md5( $text ) != $hashes[$id] ) {
echo "Content hash mismatch for rev_id $id\n";
- #var_dump( $text );
+ # var_dump( $text );
}
}
$t += microtime( true );
diff --git a/maintenance/storage/trackBlobs.php b/maintenance/storage/trackBlobs.php
index 63327d53..15aeec3b 100644
--- a/maintenance/storage/trackBlobs.php
+++ b/maintenance/storage/trackBlobs.php
@@ -1,6 +1,6 @@
<?php
-require( dirname( __FILE__ ) .'/../commandLine.inc' );
+require( dirname( __FILE__ ) . '/../commandLine.inc' );
if ( count( $args ) < 1 ) {
@@ -35,6 +35,7 @@ class TrackBlobs {
}
function run() {
+ $this->checkIntegrity();
$this->initTrackingTable();
$this->trackRevisions();
$this->trackOrphanText();
@@ -43,6 +44,47 @@ class TrackBlobs {
}
}
+ function checkIntegrity() {
+ echo "Doing integrity check...\n";
+ $dbr = wfGetDB( DB_SLAVE );
+
+ // Scan for HistoryBlobStub objects in the text table (bug 20757)
+
+ $exists = $dbr->selectField( 'text', 1,
+ 'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\' ' .
+ 'AND LOWER(CONVERT(LEFT(old_text,22) USING latin1)) = \'o:15:"historyblobstub"\'',
+ __METHOD__
+ );
+
+ if ( $exists ) {
+ echo "Integrity check failed: found HistoryBlobStub objects in your text table.\n" .
+ "This script could destroy these objects if it continued. Run resolveStubs.php\n" .
+ "to fix this.\n";
+ exit( 1 );
+ }
+
+ // Scan the archive table for HistoryBlobStub objects or external flags (bug 22624)
+ $flags = $dbr->selectField( 'archive', 'ar_flags',
+ 'ar_flags LIKE \'%external%\' OR (' .
+ 'ar_flags LIKE \'%object%\' ' .
+ 'AND LOWER(CONVERT(LEFT(ar_text,22) USING latin1)) = \'o:15:"historyblobstub"\' )',
+ __METHOD__
+ );
+
+ if ( strpos( $flags, 'external' ) !== false ) {
+ echo "Integrity check failed: found external storage pointers in your archive table.\n" .
+ "Run normaliseArchiveTable.php to fix this.\n";
+ exit( 1 );
+ } elseif ( $flags ) {
+ echo "Integrity check failed: found HistoryBlobStub objects in your archive table.\n" .
+ "These objects are probably already broken, continuing would make them\n" .
+ "unrecoverable. Run \"normaliseArchiveTable.php --fix-cgz-bug\" to fix this.\n";
+ exit( 1 );
+ }
+
+ echo "Integrity check OK\n";
+ }
+
function initTrackingTable() {
$dbw = wfGetDB( DB_MASTER );
if ( $dbw->tableExists( 'blob_tracking' ) ) {
@@ -170,9 +212,9 @@ class TrackBlobs {
# Scan the text table for orphan text
while ( true ) {
- $res = $dbr->select( array( 'text', 'blob_tracking' ),
+ $res = $dbr->select( array( 'text', 'blob_tracking' ),
array( 'old_id', 'old_flags', 'old_text' ),
- array(
+ array(
'old_id>' . $dbr->addQuotes( $startId ),
$textClause,
'old_flags ' . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() ),
@@ -181,7 +223,7 @@ class TrackBlobs {
__METHOD__,
array(
'ORDER BY' => 'old_id',
- 'LIMIT' => $this->batchSize
+ 'LIMIT' => $this->batchSize
),
array( 'blob_tracking' => array( 'LEFT JOIN', 'bt_text_id=old_id' ) )
);
@@ -275,8 +317,8 @@ class TrackBlobs {
// Build a bitmap of actual blob rows
while ( true ) {
- $res = $extDB->select( $table,
- array( 'blob_id' ),
+ $res = $extDB->select( $table,
+ array( 'blob_id' ),
array( 'blob_id > ' . $extDB->addQuotes( $startId ) ),
__METHOD__,
array( 'LIMIT' => $this->batchSize, 'ORDER BY' => 'blob_id' )
@@ -301,7 +343,7 @@ class TrackBlobs {
// Find actual blobs that weren't tracked by the previous passes
// This is a set-theoretic difference A \ B, or in bitwise terms, A & ~B
$orphans = gmp_and( $actualBlobs, gmp_com( $this->trackedBlobs[$cluster] ) );
-
+
// Traverse the orphan list
$insertBatch = array();
$id = 0;
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index 0809f4b6..1dcf98b7 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -52,22 +52,21 @@
--
CREATE TABLE /*_*/user (
user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Usernames must be unique, must not be in the form of
-- an IP address. _Shouldn't_ allow slashes or case
-- conflicts. Spaces are allowed, and are _not_ converted
-- to underscores like titles. See the User::newFromName() for
-- the specific tests that usernames have to pass.
user_name varchar(255) binary NOT NULL default '',
-
+
-- Optional 'real name' to be displayed in credit listings
user_real_name varchar(255) binary NOT NULL default '',
-
- -- Password hashes, normally hashed like so:
- -- MD5(CONCAT(user_id,'-',MD5(plaintext_password))), see
- -- wfEncryptPassword() in GlobalFunctions.php
+
+ -- Password hashes, see User::crypt() and User::comparePasswords()
+ -- in User.php for the algorithm
user_password tinyblob NOT NULL,
-
+
-- When using 'mail me a new password', a random
-- password is generated and the hash stored here.
-- The previous password is left in place until
@@ -75,49 +74,52 @@ CREATE TABLE /*_*/user (
-- at which point the hash is moved to user_password
-- and the old password is invalidated.
user_newpassword tinyblob NOT NULL,
-
+
-- Timestamp of the last time when a new password was
- -- sent, for throttling purposes
+ -- sent, for throttling and expiring purposes
+ -- Emailed passwords will expire $wgNewPasswordExpiry
+ -- (a week) after being set. If user_newpass_time is NULL
+ -- (eg. created by mail) it doesn't expire.
user_newpass_time binary(14),
-- Note: email should be restricted, not public info.
-- Same with passwords.
user_email tinytext NOT NULL,
-
+
-- Newline-separated list of name=value defining the user
-- preferences
-- Now obsolete in favour of user_properties table;
-- old values will be migrated from here transparently.
user_options blob NOT NULL,
-
+
-- This is a timestamp which is updated when a user
-- logs in, logs out, changes preferences, or performs
-- some other action requiring HTML cache invalidation
-- to ensure that the UI is updated.
user_touched binary(14) NOT NULL default '',
-
+
-- A pseudorandomly generated value that is stored in
-- a cookie when the "remember password" feature is
-- used (previously, a hash of the password was used, but
-- this was vulnerable to cookie-stealing attacks)
user_token binary(32) NOT NULL default '',
-
+
-- Initially NULL; when a user's e-mail address has been
-- validated by returning with a mailed token, this is
-- set to the current timestamp.
user_email_authenticated binary(14),
-
+
-- Randomly generated token created when the e-mail address
-- is set and a confirmation test mail sent.
user_email_token binary(32),
-
+
-- Expiration date for the user_email_token
user_email_token_expires binary(14),
-
+
-- Timestamp of account registration.
-- Accounts predating this schema addition may contain NULL.
user_registration binary(14),
-
+
-- Count of edits and edit-like actions.
--
-- *NOT* intended to be an accurate copy of COUNT(*) WHERE rev_user=user_id
@@ -146,7 +148,7 @@ CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
CREATE TABLE /*_*/user_groups (
-- Key to user_id
ug_user int unsigned NOT NULL default 0,
-
+
-- Group names are short symbolic string keys.
-- The set of group names is open-ended, though in practice
-- only some predefined ones are likely to be used.
@@ -194,10 +196,10 @@ CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
CREATE TABLE /*_*/user_properties (
-- Foreign key to user.user_id
up_user int NOT NULL,
-
+
-- Name of the option being saved. This is indexed for bulk lookup.
up_property varbinary(32) NOT NULL,
-
+
-- Property value as a string.
up_value blob
) /*$wgDBTableOptions*/;
@@ -213,33 +215,33 @@ CREATE TABLE /*_*/page (
-- Unique identifier number. The page_id will be preserved across
-- edits and rename operations, but not deletions and recreations.
page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- A page name is broken into a namespace and a title.
-- The namespace keys are UI-language-independent constants,
-- defined in includes/Defines.php
page_namespace int NOT NULL,
-
+
-- The rest of the title, as text.
-- Spaces are transformed into underscores in title storage.
page_title varchar(255) binary NOT NULL,
-
+
-- Comma-separated set of permission keys indicating who
-- can move or edit the page.
page_restrictions tinyblob NOT NULL,
-
+
-- Number of times this page has been viewed.
page_counter bigint unsigned NOT NULL default 0,
-
+
-- 1 indicates the article is a redirect.
page_is_redirect tinyint unsigned NOT NULL default 0,
-
+
-- 1 indicates this is a new entry, with only one edit.
-- Not all pages with one edit are new pages.
page_is_new tinyint unsigned NOT NULL default 0,
-
+
-- Random value between 0 and 1, used for Special:Randompage
page_random real unsigned NOT NULL,
-
+
-- This timestamp is updated whenever the page changes in
-- a way requiring it to be re-rendered, invalidating caches.
-- Aside from editing this includes permission changes,
@@ -251,7 +253,7 @@ CREATE TABLE /*_*/page (
-- This may be 0 during page creation, but that shouldn't
-- happen outside of a transaction... hopefully.
page_latest int unsigned NOT NULL,
-
+
-- Uncompressed length in bytes of the page's current source text.
page_len int unsigned NOT NULL
) /*$wgDBTableOptions*/;
@@ -268,38 +270,38 @@ CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
--
CREATE TABLE /*_*/revision (
rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Key to page_id. This should _never_ be invalid.
rev_page int unsigned NOT NULL,
-
+
-- Key to text.old_id, where the actual bulk text is stored.
-- It's possible for multiple revisions to use the same text,
-- for instance revisions where only metadata is altered
-- or a rollback to a previous version.
rev_text_id int unsigned NOT NULL,
-
+
-- Text comment summarizing the change.
-- This text is shown in the history and other changes lists,
-- rendered in a subset of wiki markup by Linker::formatComment()
rev_comment tinyblob NOT NULL,
-
+
-- Key to user.user_id of the user who made this edit.
-- Stores 0 for anonymous edits and for some mass imports.
rev_user int unsigned NOT NULL default 0,
-
+
-- Text username or IP address of the editor.
rev_user_text varchar(255) binary NOT NULL default '',
-
+
-- Timestamp
rev_timestamp binary(14) NOT NULL default '',
-
+
-- Records whether the user marked the 'minor edit' checkbox.
-- Many automated edits are marked as minor.
rev_minor_edit tinyint unsigned NOT NULL default 0,
-
+
-- Not yet used; reserved for future changes to the deletion system.
rev_deleted tinyint unsigned NOT NULL default 0,
-
+
-- Length of this revision in bytes
rev_len int unsigned,
@@ -331,11 +333,11 @@ CREATE TABLE /*_*/text (
--
-- revision.rev_text_id is a key to this column
old_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Depending on the contents of the old_flags field, the text
-- may be convenient plain text, or it may be funkily encoded.
old_text mediumblob NOT NULL,
-
+
-- Comma-separated list of flags:
-- gzip: text is compressed with PHP's gzdeflate() function.
-- utf8: text was stored as UTF-8.
@@ -359,7 +361,7 @@ CREATE TABLE /*_*/text (
CREATE TABLE /*_*/archive (
ar_namespace int NOT NULL default 0,
ar_title varchar(255) binary NOT NULL default '',
-
+
-- Newly deleted pages will not store text in this table,
-- but will reference the separately existing text rows.
-- This field is retained for backwards compatibility,
@@ -367,26 +369,26 @@ CREATE TABLE /*_*/archive (
-- upgrading from 1.4 to 1.5.
-- Text may be gzipped or otherwise funky.
ar_text mediumblob NOT NULL,
-
+
-- Basic revision stuff...
ar_comment tinyblob NOT NULL,
ar_user int unsigned NOT NULL default 0,
ar_user_text varchar(255) binary NOT NULL,
ar_timestamp binary(14) NOT NULL default '',
ar_minor_edit tinyint NOT NULL default 0,
-
+
-- See ar_text note.
ar_flags tinyblob NOT NULL,
-
+
-- When revisions are deleted, their unique rev_id is stored
-- here so it can be retained after undeletion. This is necessary
-- to retain permalinks to given revisions after accidental delete
-- cycles or messy operations like history merges.
- --
+ --
-- Old entries from 1.4 will be NULL here, and a new rev_id will
-- be created on undeletion for those revisions.
ar_rev_id int unsigned,
-
+
-- For newly deleted revisions, this is the text.old_id key to the
-- actual stored text. To avoid breaking the block-compression scheme
-- and otherwise making storage changes harder, the actual text is
@@ -404,19 +406,20 @@ CREATE TABLE /*_*/archive (
-- Length of this revision in bytes
ar_len int unsigned,
- -- Reference to page_id. Useful for sysadmin fixing of large pages
+ -- Reference to page_id. Useful for sysadmin fixing of large pages
-- merged together in the archives, or for cleanly restoring a page
-- at its original ID number if possible.
--
-- Will be NULL for pages deleted prior to 1.11.
ar_page_id int unsigned,
-
+
-- Original previous revision
ar_parent_id int unsigned default NULL
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
--
@@ -425,7 +428,7 @@ CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timesta
CREATE TABLE /*_*/pagelinks (
-- Key to the page_id of the page containing the link.
pl_from int unsigned NOT NULL default 0,
-
+
-- Key to page_namespace/page_title of the target page.
-- The target page may or may not exist, and due to renames
-- and deletions may refer to different page records as time
@@ -444,7 +447,7 @@ CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,p
CREATE TABLE /*_*/templatelinks (
-- Key to the page_id of the page containing the link.
tl_from int unsigned NOT NULL default 0,
-
+
-- Key to page_namespace/page_title of the target page.
-- The target page may or may not exist, and due to renames
-- and deletions may refer to different page records as time
@@ -465,7 +468,7 @@ CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_tit
CREATE TABLE /*_*/imagelinks (
-- Key to page_id of the page containing the image / media link.
il_from int unsigned NOT NULL default 0,
-
+
-- Filename of target image.
-- This is also the page_title of the file's description page;
-- all such pages are in namespace 6 (NS_FILE).
@@ -483,37 +486,56 @@ CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
CREATE TABLE /*_*/categorylinks (
-- Key to page_id of the page defined as a category member.
cl_from int unsigned NOT NULL default 0,
-
+
-- Name of the category.
-- This is also the page_title of the category's description page;
-- all such pages are in namespace 14 (NS_CATEGORY).
cl_to varchar(255) binary NOT NULL default '',
-
- -- The title of the linking page, or an optional override
- -- to determine sort order. Sorting is by binary order, which
- -- isn't always ideal, but collations seem to be an exciting
- -- and dangerous new world in MySQL... The sortkey is updated
- -- if no override exists and cl_from is renamed.
- --
- -- Truncate so that the cl_sortkey key fits in 1000 bytes
- -- (MyISAM 5 with server_character_set=utf8)
- cl_sortkey varchar(70) binary NOT NULL default '',
-
+
+ -- A binary string obtained by applying a sortkey generation algorithm
+ -- (Collation::getSortKey()) to page_title, or cl_sortkey_prefix . "\n"
+ -- . page_title if cl_sortkey_prefix is nonempty.
+ cl_sortkey varbinary(230) NOT NULL default '',
+
+ -- A prefix for the raw sortkey manually specified by the user, either via
+ -- [[Category:Foo|prefix]] or {{defaultsort:prefix}}. If nonempty, it's
+ -- concatenated with a line break followed by the page title before the sortkey
+ -- conversion algorithm is run. We store this so that we can update
+ -- collations without reparsing all pages.
+ cl_sortkey_prefix varchar(255) binary NOT NULL default '',
+
-- This isn't really used at present. Provided for an optional
-- sorting method by approximate addition time.
- cl_timestamp timestamp NOT NULL
+ cl_timestamp timestamp NOT NULL,
+
+ -- Stores $wgCategoryCollation at the time cl_sortkey was generated. This
+ -- can be used to install new collation versions, tracking which rows are not
+ -- yet updated. '' means no collation, this is a legacy row that needs to be
+ -- updated by updateCollation.php. In the future, it might be possible to
+ -- specify different collations per category.
+ cl_collation varbinary(32) NOT NULL default '',
+
+ -- Stores whether cl_from is a category, file, or other page, so we can
+ -- paginate the three categories separately. This never has to be updated
+ -- after the page is created, since none of these page types can be moved to
+ -- any other.
+ cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page'
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
--- We always sort within a given category...
-CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_sortkey,cl_from);
+-- We always sort within a given category, and within a given type. FIXME:
+-- Formerly this index didn't cover cl_type (since that didn't exist), so old
+-- callers won't be using an index: fix this?
+CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
-- Not really used?
CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
+-- For finding rows with outdated collation
+CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
---
+--
-- Track all existing categories. Something is a category if 1) it has an en-
-- try somewhere in categorylinks, or 2) it once did. Categories might not
-- have corresponding pages, so they need to be tracked separately.
@@ -557,15 +579,15 @@ CREATE TABLE /*_*/externallinks (
el_to blob NOT NULL,
-- In the case of HTTP URLs, this is the URL with any username or password
- -- removed, and with the labels in the hostname reversed and converted to
+ -- removed, and with the labels in the hostname reversed and converted to
-- lower case. An extra dot is added to allow for matching of either
-- example.com or *.example.com in a single scan.
- -- Example:
+ -- Example:
-- http://user:password@sub.example.com/page.html
-- becomes
-- http://com.example.sub./page.html
-- which allows for fast searching for all pages under example.com with the
- -- clause:
+ -- clause:
-- WHERE el_index LIKE 'http://com.example.%'
el_index blob NOT NULL
) /*$wgDBTableOptions*/;
@@ -589,13 +611,13 @@ CREATE TABLE /*_*/external_user (
CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
---
+--
-- Track interlanguage links
--
CREATE TABLE /*_*/langlinks (
-- page_id of the referring page
ll_from int unsigned NOT NULL default 0,
-
+
-- Language code of the target
ll_lang varbinary(20) NOT NULL default '',
@@ -608,32 +630,50 @@ CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
--
+-- Track inline interwiki links
+--
+CREATE TABLE /*_*/iwlinks (
+ -- page_id of the referring page
+ iwl_from int unsigned NOT NULL default 0,
+
+ -- Interwiki prefix code of the target
+ iwl_prefix varbinary(20) NOT NULL default '',
+
+ -- Title of the target, including namespace
+ iwl_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+
+
+--
-- Contains a single row with some aggregate info
-- on the state of the site.
--
CREATE TABLE /*_*/site_stats (
-- The single row should contain 1 here.
ss_row_id int unsigned NOT NULL,
-
+
-- Total number of page views, if hit counters are enabled.
ss_total_views bigint unsigned default 0,
-
+
-- Total number of edits performed.
ss_total_edits bigint unsigned default 0,
-
+
-- An approximate count of pages matching the following criteria:
-- * in namespace 0
-- * not a redirect
-- * contains the text '[['
-- See Article::isCountable() in includes/Article.php
ss_good_articles bigint unsigned default 0,
-
+
-- Total pages, theoretically equal to SELECT COUNT(*) FROM page; except faster
ss_total_pages bigint default '-1',
-- Number of users, theoretically equal to SELECT COUNT(*) FROM user;
ss_users bigint default '-1',
-
+
-- Number of users that still edit
ss_active_users bigint default '-1',
@@ -667,26 +707,26 @@ CREATE TABLE /*_*/hitcounter (
CREATE TABLE /*_*/ipblocks (
-- Primary key, introduced for privacy.
ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Blocked IP address in dotted-quad form or user name.
ipb_address tinyblob NOT NULL,
-
+
-- Blocked user ID or 0 for IP blocks.
ipb_user int unsigned NOT NULL default 0,
-
+
-- User ID who made the block.
ipb_by int unsigned NOT NULL default 0,
-
+
-- User name of blocker
ipb_by_text varchar(255) binary NOT NULL default '',
-
+
-- Text comment made by blocker.
ipb_reason tinyblob NOT NULL,
-
+
-- Creation (or refresh) date in standard YMDHMS form.
-- IP blocks expire automatically.
ipb_timestamp binary(14) NOT NULL default '',
-
+
-- Indicates that the IP address was banned because a banned
-- user accessed a page through it. If this is 1, ipb_address
-- will be hidden, and the block identified by block ID number.
@@ -700,11 +740,11 @@ CREATE TABLE /*_*/ipblocks (
-- Block triggers autoblocks
ipb_enable_autoblock bool NOT NULL default '1',
-
+
-- Time at which the block will expire.
-- May be "infinity"
ipb_expiry varbinary(14) NOT NULL default '',
-
+
-- Start and end of an address range, in hexadecimal
-- Size chosen to allow IPv6
ipb_range_start tinyblob NOT NULL,
@@ -715,12 +755,12 @@ CREATE TABLE /*_*/ipblocks (
-- Block prevents user from accessing Special:Emailuser
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
) /*$wgDBTableOptions*/;
-
+
-- Unique index to support "user already blocked" messages
-- Any new options which prevent collisions should be included
CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
@@ -739,52 +779,52 @@ CREATE TABLE /*_*/image (
-- This is also the title of the associated description page,
-- which will be in namespace 6 (NS_FILE).
img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
-
+
-- File size in bytes.
img_size int unsigned NOT NULL default 0,
-
+
-- For images, size in pixels.
img_width int NOT NULL default 0,
img_height int NOT NULL default 0,
-
+
-- Extracted EXIF metadata stored as a serialized PHP array.
img_metadata mediumblob NOT NULL,
-
+
-- For images, bits per pixel if known.
img_bits int NOT NULL default 0,
-
+
-- Media type as defined by the MEDIATYPE_xxx constants
img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-
+
-- major part of a MIME media type as defined by IANA
-- see http://www.iana.org/assignments/media-types/
img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
-
+
-- minor part of a MIME media type as defined by IANA
-- the minor parts are not required to adher to any standard
-- but should be consistent throughout the database
-- see http://www.iana.org/assignments/media-types/
img_minor_mime varbinary(100) NOT NULL default "unknown",
-
+
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
img_description tinyblob NOT NULL,
-
+
-- user_id and user_name of uploader.
img_user int unsigned NOT NULL default 0,
img_user_text varchar(255) binary NOT NULL,
-
+
-- Time of the upload.
img_timestamp varbinary(14) NOT NULL default '',
-
+
-- SHA-1 content hash in base-36
img_sha1 varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
--- Used by Special:Imagelist for sort-by-size
+-- Used by Special:ListFiles for sort-by-size
CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
--- Used by Special:Newimages and Special:Imagelist
+-- Used by Special:Newimages and Special:ListFiles
CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-- Used in API and duplicate search
CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
@@ -798,11 +838,11 @@ CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
CREATE TABLE /*_*/oldimage (
-- Base filename: key to image.img_name
oi_name varchar(255) binary NOT NULL default '',
-
+
-- Filename of the archived file.
-- This is generally a timestamp and '!' prepended to the base name.
oi_archive_name varchar(255) binary NOT NULL default '',
-
+
-- Other fields as in image...
oi_size int unsigned NOT NULL default 0,
oi_width int NOT NULL default 0,
@@ -834,30 +874,30 @@ CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
CREATE TABLE /*_*/filearchive (
-- Unique row id
fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Original base filename; key to image.img_name, page.page_title, etc
fa_name varchar(255) binary NOT NULL default '',
-
+
-- Filename of archived file, if an old revision
fa_archive_name varchar(255) binary default '',
-
+
-- Which storage bin (directory tree or object store) the file data
-- is stored in. Should be 'deleted' for files that have been deleted;
-- any other bin is not yet in use.
fa_storage_group varbinary(16),
-
+
-- SHA-1 of the file contents plus extension, used as a key for storage.
-- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
--
-- If NULL, the file was missing at deletion time or has been purged
-- from the archival storage.
fa_storage_key varbinary(64) default '',
-
+
-- Deletion information, if this file is deleted.
fa_deleted_user int,
fa_deleted_timestamp binary(14) default '',
fa_deleted_reason text,
-
+
-- Duped fields from image
fa_size int unsigned default 0,
fa_width int default 0,
@@ -895,52 +935,52 @@ CREATE TABLE /*_*/recentchanges (
rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
rc_timestamp varbinary(14) NOT NULL default '',
rc_cur_time varbinary(14) NOT NULL default '',
-
+
-- As in revision
rc_user int unsigned NOT NULL default 0,
rc_user_text varchar(255) binary NOT NULL,
-
+
-- When pages are renamed, their RC entries do _not_ change.
rc_namespace int NOT NULL default 0,
rc_title varchar(255) binary NOT NULL default '',
-
+
-- as in revision...
rc_comment varchar(255) binary NOT NULL default '',
rc_minor tinyint unsigned NOT NULL default 0,
-
+
-- Edits by user accounts with the 'bot' rights key are
-- marked with a 1 here, and will be hidden from the
-- default view.
rc_bot tinyint unsigned NOT NULL default 0,
-
+
rc_new tinyint unsigned NOT NULL default 0,
-
+
-- Key to page_id (was cur_id prior to 1.5).
-- This will keep links working after moves while
-- retaining the at-the-time name in the changes list.
rc_cur_id int unsigned NOT NULL default 0,
-
+
-- rev_id of the given revision
rc_this_oldid int unsigned NOT NULL default 0,
-
+
-- rev_id of the prior revision, for generating diff links.
rc_last_oldid int unsigned NOT NULL default 0,
-
+
-- These may no longer be used, with the new move log.
rc_type tinyint unsigned NOT NULL default 0,
rc_moved_to_ns tinyint unsigned NOT NULL default 0,
rc_moved_to_title varchar(255) binary NOT NULL default '',
-
+
-- If the Recent Changes Patrol option is enabled,
-- users may mark edits as having been reviewed to
-- remove a warning flag on the RC list.
-- A value of 1 indicates the page has been reviewed.
rc_patrolled tinyint unsigned NOT NULL default 0,
-
+
-- Recorded IP address the edit was made from, if the
-- $wgPutIPinRC option is enabled.
rc_ip varbinary(40) NOT NULL default '',
-
+
-- Text length in characters before
-- and after the edit
rc_old_len int,
@@ -971,17 +1011,17 @@ CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp
CREATE TABLE /*_*/watchlist (
-- Key to user.user_id
wl_user int unsigned NOT NULL,
-
+
-- Key to page_namespace/page_title
-- Note that users may watch pages which do not exist yet,
-- or existed in the past but have been deleted.
wl_namespace int NOT NULL default 0,
wl_title varchar(255) binary NOT NULL default '',
-
+
-- Timestamp when user was last sent a notification e-mail;
-- cleared when the user visits the page.
wl_notificationtimestamp varbinary(14)
-
+
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
@@ -995,17 +1035,17 @@ CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
CREATE TABLE /*_*/math (
-- Binary MD5 hash of the latex fragment, used as an identifier key.
math_inputhash varbinary(16) NOT NULL,
-
+
-- Not sure what this is, exactly...
math_outputhash varbinary(16) NOT NULL,
-
+
-- texvc reports how well it thinks the HTML conversion worked;
-- if it's a low level the PNG rendering may be preferred.
math_html_conservativeness tinyint NOT NULL,
-
+
-- HTML output from texvc, if any
math_html text,
-
+
-- MathML output from texvc, if any
math_mathml text
) /*$wgDBTableOptions*/;
@@ -1024,10 +1064,10 @@ CREATE UNIQUE INDEX /*i*/math_inputhash ON /*_*/math (math_inputhash);
CREATE TABLE /*_*/searchindex (
-- Key to page_id
si_page int unsigned NOT NULL,
-
+
-- Munged version of title
si_title varchar(255) NOT NULL default '',
-
+
-- Munged version of body text
si_text mediumtext NOT NULL
) ENGINE=MyISAM;
@@ -1043,16 +1083,22 @@ CREATE FULLTEXT INDEX /*i*/si_text ON /*_*/searchindex (si_text);
CREATE TABLE /*_*/interwiki (
-- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
iw_prefix varchar(32) NOT NULL,
-
+
-- The URL of the wiki, with "$1" as a placeholder for an article name.
-- Any spaces in the name will be transformed to underscores before
-- insertion.
iw_url blob NOT NULL,
-
+
+ -- The URL of the file api.php
+ iw_api blob NOT NULL,
+
+ -- The name of the database (for a connection to be established with wfGetLB( 'wikiid' ))
+ iw_wikiid varchar(64) NOT NULL,
+
-- A boolean value indicating whether the wiki is in this project
-- (used, for example, to detect redirect loops)
iw_local bool NOT NULL,
-
+
-- Boolean value indicating whether interwiki transclusions are allowed.
iw_trans tinyint NOT NULL default 0
) /*$wgDBTableOptions*/;
@@ -1066,10 +1112,10 @@ CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
CREATE TABLE /*_*/querycache (
-- A key name, generally the base name of of the special page.
qc_type varbinary(32) NOT NULL,
-
+
-- Some sort of stored value. Sizes, counts...
qc_value int unsigned NOT NULL default 0,
-
+
-- Target namespace+title
qc_namespace int NOT NULL default 0,
qc_title varchar(255) binary NOT NULL default ''
@@ -1110,25 +1156,25 @@ CREATE TABLE /*_*/logging (
-- action field, but only the type controls categorization.
log_type varbinary(32) NOT NULL default '',
log_action varbinary(32) NOT NULL default '',
-
+
-- Timestamp. Duh.
log_timestamp binary(14) NOT NULL default '19700101000000',
-
+
-- The user who performed this action; key to user_id
log_user int unsigned NOT NULL default 0,
-
+
-- Name of the user who performed this action
log_user_text varchar(255) binary NOT NULL default '',
-
+
-- Key to the page affected. Where a user is the target,
-- this will point to the user page.
log_namespace int NOT NULL default 0,
log_title varchar(255) binary NOT NULL default '',
log_page int unsigned NULL,
-
+
-- Freeform text. Interpreted as edit history comments.
log_comment varchar(255) NOT NULL default '',
-
+
-- LF separated list of miscellaneous parameters
log_params blob NOT NULL,
@@ -1170,7 +1216,7 @@ CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*_*/job (
job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Command name
-- Limited to 60 to prevent key length overflow
job_cmd varbinary(60) NOT NULL default '',
@@ -1223,14 +1269,14 @@ CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
CREATE TABLE /*_*/querycachetwo (
-- A key name, generally the base name of of the special page.
qcc_type varbinary(32) NOT NULL,
-
+
-- Some sort of stored value. Sizes, counts...
qcc_value int unsigned NOT NULL default 0,
-
+
-- Target namespace+title
qcc_namespace int NOT NULL default 0,
qcc_title varchar(255) binary NOT NULL default '',
-
+
-- Target namespace+title2
qcc_namespacetwo int NOT NULL default 0,
qcc_titletwo varchar(255) binary NOT NULL default ''
@@ -1292,7 +1338,8 @@ CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propnam
-- A table to log updates, one text key row per update.
CREATE TABLE /*_*/updatelog (
- ul_key varchar(255) NOT NULL PRIMARY KEY
+ ul_key varchar(255) NOT NULL PRIMARY KEY,
+ ul_value blob
) /*$wgDBTableOptions*/;
@@ -1320,7 +1367,7 @@ CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_i
-- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
-- that only works on MySQL 4.1+
CREATE TABLE /*_*/tag_summary (
- -- RCID for the change
+ -- RCID for the change
ts_rc_id int NULL,
-- LOGID for the change
ts_log_id int NULL,
@@ -1350,4 +1397,38 @@ CREATE TABLE /*_*/l10n_cache (
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
+-- Table for storing JSON message blobs for the resource loader
+CREATE TABLE /*_*/msg_resource (
+ -- Resource name
+ mr_resource varbinary(255) NOT NULL,
+ -- Language code
+ mr_lang varbinary(32) NOT NULL,
+ -- JSON blob
+ mr_blob mediumblob NOT NULL,
+ -- Timestamp of last update
+ mr_timestamp binary(14) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
+
+-- Table for administering which message is contained in which resource
+CREATE TABLE /*_*/msg_resource_links (
+ mrl_resource varbinary(255) NOT NULL,
+ -- Message key
+ mrl_message varbinary(255) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
+
+-- Table for tracking which local files a module depends on that aren't
+-- registered directly.
+-- Currently only used for tracking images that CSS depends on
+CREATE TABLE /*_*/module_deps (
+ -- Module name
+ md_module varbinary(255) NOT NULL,
+ -- Skin name
+ md_skin varbinary(32) NOT NULL,
+ -- JSON blob with file dependencies
+ md_deps mediumblob NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
+
-- vim: sw=2 sts=2 et
diff --git a/maintenance/tests/ApiSetup.php b/maintenance/tests/ApiSetup.php
deleted file mode 100644
index 549d8aef..00000000
--- a/maintenance/tests/ApiSetup.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-abstract class ApiSetup extends PHPUnit_Framework_TestCase {
- protected static $userName;
- protected static $passWord;
- protected static $user;
- protected static $apiUrl;
-
- function setup() {
- global $wgServerName, $wgServer, $wgContLang, $wgAuth, $wgScriptPath,
- $wgScriptExtension, $wgMemc, $wgRequest;
-
- self::$apiUrl = $wgServer.$wgScriptPath."/api".$wgScriptExtension;
-
- $wgMemc = new FakeMemCachedClient;
- $wgContLang = Language::factory( 'en' );
- $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
- $wgRequest = new FauxRequest(array());
- self::setupUser();
- }
-
- static function setupUser() {
- if ( self::$user == NULL ) {
- self::$userName = "Useruser";
- self::$passWord = User::randomPassword();
-
- self::$user = User::newFromName(self::$userName);
- if ( !self::$user->getID() ) {
- self::$user = User::createNew(self::$userName, array(
- "password" => self::$passWord,
- "email" => "test@example.com",
- "real_name" => "Test User"));
- } else {
- self::$user->setPassword(self::$passWord);
- }
- self::$user->saveSettings();
- }
- }
-}
diff --git a/maintenance/tests/ApiTest.php b/maintenance/tests/ApiTest.php
deleted file mode 100644
index d098b1a2..00000000
--- a/maintenance/tests/ApiTest.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-
-require_once( "ApiSetup.php" );
-
-class MockApi extends ApiBase {
- public function execute() {}
- public function getVersion() {}
-
- public function __construct() {}
-
- public function getAllowedParams() {
- $params = array(
- 'filename' => null,
- 'enablechunks' => false,
- 'sessionkey' => null,
- );
- }
-
-
-}
-
-
-class ApiTest extends ApiSetup {
-
- function setup() {
- parent::setup();
- }
-
- function testRequireOnlyOneParameterDefault() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter(array("filename" => "foo.txt",
- "enablechunks" => false), "filename", "enablechunks"));
- }
-
- /**
- * @expectedException UsageException
- */
- function testRequireOnlyOneParameterZero() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter(array("filename" => "foo.txt",
- "enablechunks" => 0), "filename", "enablechunks"));
- }
-
- /**
- * @expectedException UsageException
- */
- function testRequireOnlyOneParameterTrue() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter(array("filename" => "foo.txt",
- "enablechunks" => true), "filename", "enablechunks"));
- }
-
- function testApi() {
- if(!isset($wgServername) || !isset($wgServer)) {
- $this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
- 'be set in LocalSettings.php');
- }
- /* Haven't thought about test ordering yet -- but this depends on HttpTest.php */
- $resp = Http::get( self::$apiUrl . "?format=xml" );
-
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $resp );
- $this->assertNotType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- }
-
- function testApiLoginNoName() {
- if(!isset($wgServername) || !isset($wgServer)) {
- $this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
- 'be set in LocalSettings.php');
- }
- $resp = Http::post( self::$apiUrl . "?action=login&format=xml",
- array( "postData" => array(
- "lgname" => "",
- "lgpassword" => self::$passWord ) ) );
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $resp );
- $this->assertNotType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $a = $sxe->login[0]->attributes()->result;
- $this->assertEquals( ' result="NoName"', $a->asXML() );
- }
-
- function testApiLoginBadPass() {
- if(!isset($wgServername) || !isset($wgServer)) {
- $this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
- 'be set in LocalSettings.php');
- }
- $resp = Http::post( self::$apiUrl . "?action=login&format=xml",
- array( "postData" => array(
- "lgname" => self::$userName,
- "lgpassword" => "bad" ) ) );
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $resp );
- $this->assertNotType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $a = $sxe->login[0]->attributes()->result;
- $this->assertEquals( ' result="WrongPass"', $a->asXML() );
- }
-
- function testApiLoginGoodPass() {
- if(!isset($wgServername) || !isset($wgServer)) {
- $this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
- 'be set in LocalSettings.php');
- }
- $resp = Http::post( self::$apiUrl . "?action=login&format=xml",
- array( "postData" => array(
- "lgname" => self::$userName,
- "lgpassword" => self::$passWord ) ) );
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $resp );
- $this->assertNotType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $a = $sxe->login[0]->attributes()->result;
- $this->assertEquals( ' result="Success"', $a->asXML() );
- }
-
- function testApiGotCookie() {
- global $wgScriptPath, $wgServerName;
-
- if(!isset($wgServername) || !isset($wgServer)) {
- $this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
- 'be set in LocalSettings.php');
- }
- $req = HttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
- array( "method" => "POST",
- "postData" => array( "lgname" => self::$userName,
- "lgpassword" => self::$passWord ) ) );
- $req->execute();
- $cj = $req->getCookieJar();
- $this->assertRegexp( '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . self::$userName . '; .*Token=/',
- $cj->serializeToHttpRequest( $wgScriptPath, $wgServerName ) );
-
-
- return $cj;
- }
-
- /**
- * @depends testApiGotCookie
- */
- function testApiListPages(CookieJar $cj) {
- $this->markTestIncomplete("Not done with this yet");
-
- if($wgServerName == "localhost" || $wgServer == "http://localhost") {
- $this->markTestIncomplete('This test needs $wgServerName and $wgServer to '.
- 'be set in LocalSettings.php');
- }
- $req = HttpRequest::factory( self::$apiUrl . "?action=query&format=xml&prop=revisions&".
- "titles=Main%20Page&rvprop=timestamp|user|comment|content" );
- $req->setCookieJar($cj);
- $req->execute();
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $req->getContent() );
- $this->assertNotType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $a = $sxe->query[0]->pages[0]->page[0]->attributes();
- }
-}
diff --git a/maintenance/tests/CdbTest.php b/maintenance/tests/CdbTest.php
deleted file mode 100644
index 444229e7..00000000
--- a/maintenance/tests/CdbTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-/**
- * Test the CDB reader/writer
- */
-
-class CdbTest extends PHPUnit_Framework_TestCase {
-
- public function setup() {
- if ( !CdbReader::haveExtension() ) {
- $this->markTestIncomplete( 'This test requires native CDB support to be present.' );
- }
- }
-
- public function testCdb() {
- $w1 = new CdbWriter_PHP( 'php.cdb' );
- $w2 = new CdbWriter_DBA( 'dba.cdb' );
-
- $data = array();
- for ( $i = 0; $i < 1000; $i++ ) {
- $key = $this->randomString();
- $value = $this->randomString();
- $w1->set( $key, $value );
- $w2->set( $key, $value );
-
- if ( !isset( $data[$key] ) ) {
- $data[$key] = $value;
- }
- }
-
- $w1->close();
- $w2->close();
-
- $this->assertEquals(
- md5_file( 'dba.cdb' ),
- md5_file( 'php.cdb' ),
- 'same hash'
- );
-
- $r1 = new CdbReader_PHP( 'php.cdb' );
- $r2 = new CdbReader_DBA( 'dba.cdb' );
-
- foreach ( $data as $key => $value ) {
- if ( $key === '' ) {
- // Known bug
- continue;
- }
- $v1 = $r1->get( $key );
- $v2 = $r2->get( $key );
-
- $v1 = $v1 === false ? '(not found)' : $v1;
- $v2 = $v2 === false ? '(not found)' : $v2;
-
- #cdbAssert( 'Mismatch', $key, $v1, $v2 );
- $this->cdbAssert( "PHP error", $key, $v1, $value );
- $this->cdbAssert( "DBA error", $key, $v2, $value );
- }
-
- unlink( 'dba.cdb' );
- unlink( 'php.cdb' );
- }
-
- private function randomString() {
- $len = mt_rand( 0, 10 );
- $s = '';
- for ( $j = 0; $j < $len; $j++ ) {
- $s .= chr( mt_rand( 0, 255 ) );
- }
- return $s;
- }
-
- private function cdbAssert( $msg, $key, $v1, $v2 ) {
- $this->assertEquals(
- $v2,
- $v1,
- $msg . ', k=' . bin2hex( $key )
- );
- }
-}
diff --git a/maintenance/tests/DatabaseSqliteTest.php b/maintenance/tests/DatabaseSqliteTest.php
deleted file mode 100644
index 011ef798..00000000
--- a/maintenance/tests/DatabaseSqliteTest.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-class MockDatabaseSqlite extends DatabaseSqliteStandalone {
- var $lastQuery;
-
- function __construct( ) {
- parent::__construct( '' );
- }
-
- function query( $sql, $fname = '', $tempIgnore = false ) {
- $this->lastQuery = $sql;
- return true;
- }
-
- function replaceVars( $s ) {
- return parent::replaceVars( $s );
- }
-}
-
-class DatabaseSqliteTest extends PHPUnit_Framework_TestCase {
- var $db;
-
- function setup() {
- if ( !extension_loaded( 'pdo_sqlite' ) ) {
- $this->markTestIncomplete( 'No SQLite support detected' );
- }
- $this->db = new MockDatabaseSqlite();
- }
-
- function replaceVars( $sql ) {
- // normalize spacing to hide implementation details
- return preg_replace( '/\s+/', ' ', $this->db->replaceVars( $sql ) );
- }
-
- function testReplaceVars() {
- $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
-
- $this->assertEquals( "CREATE TABLE /**/foo (foo_key INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "
- . "foo_name TEXT NOT NULL DEFAULT '', foo_int INTEGER, foo_int2 INTEGER );",
- $this->replaceVars( "CREATE TABLE /**/foo (foo_key int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- foo_name varchar(255) binary NOT NULL DEFAULT '', foo_int tinyint( 8 ), foo_int2 int(16) ) ENGINE=MyISAM;" )
- );
-
- $this->assertEquals( "CREATE TABLE foo ( foo_binary1 BLOB, foo_binary2 BLOB );",
- $this->replaceVars( "CREATE TABLE foo ( foo_binary1 binary(16), foo_binary2 varbinary(32) );" )
- );
-
- $this->assertEquals( "CREATE TABLE text ( text_foo TEXT );",
- $this->replaceVars( "CREATE TABLE text ( text_foo tinytext );" ),
- 'Table name changed'
- );
-
- $this->assertEquals( "ALTER TABLE foo ADD COLUMN foo_bar INTEGER DEFAULT 42",
- $this->replaceVars( "ALTER TABLE foo\nADD COLUMN foo_bar int(10) unsigned DEFAULT 42")
- );
- }
-} \ No newline at end of file
diff --git a/maintenance/tests/DatabaseTest.php b/maintenance/tests/DatabaseTest.php
deleted file mode 100644
index aa50de2e..00000000
--- a/maintenance/tests/DatabaseTest.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-class DatabaseTest extends PHPUnit_Framework_TestCase {
- var $db;
-
- function setUp() {
- $this->db = wfGetDB( DB_SLAVE );
- }
-
- function testAddQuotesNull() {
- $check = "NULL";
- if ( $this->db->getType() === 'sqlite' ) {
- $check = "''";
- }
- $this->assertEquals( $check, $this->db->addQuotes( null ) );
- }
-
- function testAddQuotesInt() {
- # returning just "1234" should be ok too, though...
- # maybe
- $this->assertEquals(
- "'1234'",
- $this->db->addQuotes( 1234 ) );
- }
-
- function testAddQuotesFloat() {
- # returning just "1234.5678" would be ok too, though
- $this->assertEquals(
- "'1234.5678'",
- $this->db->addQuotes( 1234.5678 ) );
- }
-
- function testAddQuotesString() {
- $this->assertEquals(
- "'string'",
- $this->db->addQuotes( 'string' ) );
- }
-
- function testAddQuotesStringQuote() {
- $check = "'string''s cause trouble'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "'string\'s cause trouble'";
- }
- $this->assertEquals(
- $check,
- $this->db->addQuotes( "string's cause trouble" ) );
- }
-
- function testFillPreparedEmpty() {
- $sql = $this->db->fillPrepared(
- 'SELECT * FROM interwiki', array() );
- $this->assertEquals(
- "SELECT * FROM interwiki",
- $sql);
- }
-
- function testFillPreparedQuestion() {
- $sql = $this->db->fillPrepared(
- 'SELECT * FROM cur WHERE cur_namespace=? AND cur_title=?',
- array( 4, "Snicker's_paradox" ) );
-
- $check = "SELECT * FROM cur WHERE cur_namespace='4' AND cur_title='Snicker''s_paradox'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "SELECT * FROM cur WHERE cur_namespace='4' AND cur_title='Snicker\'s_paradox'";
- }
- $this->assertEquals( $check, $sql );
- }
-
- function testFillPreparedBang() {
- $sql = $this->db->fillPrepared(
- 'SELECT user_id FROM ! WHERE user_name=?',
- array( '"user"', "Slash's Dot" ) );
-
- $check = "SELECT user_id FROM \"user\" WHERE user_name='Slash''s Dot'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "SELECT user_id FROM \"user\" WHERE user_name='Slash\'s Dot'";
- }
- $this->assertEquals( $check, $sql );
- }
-
- function testFillPreparedRaw() {
- $sql = $this->db->fillPrepared(
- "SELECT * FROM cur WHERE cur_title='This_\\&_that,_WTF\\?\\!'",
- array( '"user"', "Slash's Dot" ) );
- $this->assertEquals(
- "SELECT * FROM cur WHERE cur_title='This_&_that,_WTF?!'",
- $sql);
- }
-
-}
-
-
diff --git a/maintenance/tests/GlobalTest.php b/maintenance/tests/GlobalTest.php
deleted file mode 100644
index ec694241..00000000
--- a/maintenance/tests/GlobalTest.php
+++ /dev/null
@@ -1,212 +0,0 @@
-<?php
-
-class GlobalTest extends PHPUnit_Framework_TestCase {
- function setUp() {
- global $wgReadOnlyFile;
- $this->originals['wgReadOnlyFile'] = $wgReadOnlyFile;
- $wgReadOnlyFile = tempnam(wfTempDir(), "mwtest_readonly");
- unlink( $wgReadOnlyFile );
- }
-
- function tearDown() {
- global $wgReadOnlyFile;
- if( file_exists( $wgReadOnlyFile ) ) {
- unlink( $wgReadOnlyFile );
- }
- $wgReadOnlyFile = $this->originals['wgReadOnlyFile'];
- }
-
- function testRandom() {
- # This could hypothetically fail, but it shouldn't ;)
- $this->assertFalse(
- wfRandom() == wfRandom() );
- }
-
- function testUrlencode() {
- $this->assertEquals(
- "%E7%89%B9%E5%88%A5:Contributions/Foobar",
- wfUrlencode( "\xE7\x89\xB9\xE5\x88\xA5:Contributions/Foobar" ) );
- }
-
- function testReadOnlyEmpty() {
- global $wgReadOnly;
- $wgReadOnly = null;
-
- $this->assertFalse( wfReadOnly() );
- $this->assertFalse( wfReadOnly() );
- }
-
- function testReadOnlySet() {
- global $wgReadOnly, $wgReadOnlyFile;
-
- $f = fopen( $wgReadOnlyFile, "wt" );
- fwrite( $f, 'Message' );
- fclose( $f );
- $wgReadOnly = null;
-
- $this->assertTrue( wfReadOnly() );
- $this->assertTrue( wfReadOnly() );
-
- unlink( $wgReadOnlyFile );
- $wgReadOnly = null;
-
- $this->assertFalse( wfReadOnly() );
- $this->assertFalse( wfReadOnly() );
- }
-
- function testQuotedPrintable() {
- $this->assertEquals(
- "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
- wfQuotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
- }
-
- function testTime() {
- $start = wfTime();
- $this->assertType( 'float', $start );
- $end = wfTime();
- $this->assertTrue( $end > $start, "Time is running backwards!" );
- }
-
- function testArrayToCGI() {
- $this->assertEquals(
- "baz=AT%26T&foo=bar",
- wfArrayToCGI(
- array( 'baz' => 'AT&T', 'ignore' => '' ),
- array( 'foo' => 'bar', 'baz' => 'overridden value' ) ) );
- }
-
- function testMimeTypeMatch() {
- $this->assertEquals(
- 'text/html',
- mimeTypeMatch( 'text/html',
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.7,
- 'text/plain' => 0.3 ) ) );
- $this->assertEquals(
- 'text/*',
- mimeTypeMatch( 'text/html',
- array( 'image/*' => 1.0,
- 'text/*' => 0.5 ) ) );
- $this->assertEquals(
- '*/*',
- mimeTypeMatch( 'text/html',
- array( '*/*' => 1.0 ) ) );
- $this->assertNull(
- mimeTypeMatch( 'text/html',
- array( 'image/png' => 1.0,
- 'image/svg+xml' => 0.5 ) ) );
- }
-
- function testNegotiateType() {
- $this->assertEquals(
- 'text/html',
- wfNegotiateType(
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.7,
- 'text/plain' => 0.5,
- 'text/*' => 0.2 ),
- array( 'text/html' => 1.0 ) ) );
- $this->assertEquals(
- 'application/xhtml+xml',
- wfNegotiateType(
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.7,
- 'text/plain' => 0.5,
- 'text/*' => 0.2 ),
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.5 ) ) );
- $this->assertEquals(
- 'text/html',
- wfNegotiateType(
- array( 'text/html' => 1.0,
- 'text/plain' => 0.5,
- 'text/*' => 0.5,
- 'application/xhtml+xml' => 0.2 ),
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.5 ) ) );
- $this->assertEquals(
- 'text/html',
- wfNegotiateType(
- array( 'text/*' => 1.0,
- 'image/*' => 0.7,
- '*/*' => 0.3 ),
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.5 ) ) );
- $this->assertNull(
- wfNegotiateType(
- array( 'text/*' => 1.0 ),
- array( 'application/xhtml+xml' => 1.0 ) ) );
- }
-
- function testTimestamp() {
- $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, $t ),
- 'TS_UNIX to TS_MW' );
- $this->assertEquals(
- 979562096,
- wfTimestamp( TS_UNIX, $t ),
- 'TS_UNIX to TS_UNIX' );
- $this->assertEquals(
- '2001-01-15 12:34:56',
- wfTimestamp( TS_DB, $t ),
- 'TS_UNIX to TS_DB' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, '20010115123456' ),
- 'TS_MW to TS_MW' );
- $this->assertEquals(
- 979562096,
- wfTimestamp( TS_UNIX, '20010115123456' ),
- 'TS_MW to TS_UNIX' );
- $this->assertEquals(
- '2001-01-15 12:34:56',
- wfTimestamp( TS_DB, '20010115123456' ),
- 'TS_MW to TS_DB' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_MW' );
- $this->assertEquals(
- 979562096,
- wfTimestamp( TS_UNIX, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_UNIX' );
- $this->assertEquals(
- '2001-01-15 12:34:56',
- wfTimestamp( TS_DB, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_DB' );
- }
-
- function testBasename() {
- $sets = array(
- '' => '',
- '/' => '',
- '\\' => '',
- '//' => '',
- '\\\\' => '',
- 'a' => 'a',
- 'aaaa' => 'aaaa',
- '/a' => 'a',
- '\\a' => 'a',
- '/aaaa' => 'aaaa',
- '\\aaaa' => 'aaaa',
- '/aaaa/' => 'aaaa',
- '\\aaaa\\' => 'aaaa',
- '\\aaaa\\' => 'aaaa',
- '/mnt/upload3/wikipedia/en/thumb/8/8b/Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg' => '93px-Zork_Grand_Inquisitor_box_cover.jpg',
- 'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE' => 'VIEWER.EXE',
- 'Östergötland_coat_of_arms.png' => 'Östergötland_coat_of_arms.png',
- );
- foreach( $sets as $from => $to ) {
- $this->assertEquals( $to, wfBaseName( $from ),
- "wfBaseName('$from') => '$to'");
- }
- }
-
- /* TODO: many more! */
-}
-
-
diff --git a/maintenance/tests/HttpTest.php b/maintenance/tests/HttpTest.php
deleted file mode 100644
index 83734910..00000000
--- a/maintenance/tests/HttpTest.php
+++ /dev/null
@@ -1,567 +0,0 @@
-<?php
-
-class MockCookie extends Cookie {
- public function canServeDomain($arg) { return parent::canServeDomain($arg); }
- public function canServePath($arg) { return parent::canServePath($arg); }
- public function isUnExpired() { return parent::isUnExpired(); }
-}
-
-class HttpTest extends PhpUnit_Framework_TestCase {
- static $content;
- static $headers;
- static $has_curl;
- static $has_fopen;
- static $has_proxy = false;
- static $proxy = "http://hulk:8080/";
- var $test_geturl = array(
- "http://www.example.com/",
- "http://pecl.php.net/feeds/pkg_apc.rss",
- "http://toolserver.org/~jan/poll/dev/main.php?page=wiki_output&id=3",
- "http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw",
- "http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:MediaWiki_hooks&format=php",
- );
- var $test_requesturl = array( "http://en.wikipedia.org/wiki/Special:Export/User:MarkAHershberger" );
-
- var $test_posturl = array( "http://www.comp.leeds.ac.uk/cgi-bin/Perl/environment-example" => "review=test" );
-
- function setup() {
- putenv("http_proxy"); /* Remove any proxy env var, so curl doesn't get confused */
- if ( is_array( self::$content ) ) {
- return;
- }
- self::$has_curl = function_exists( 'curl_init' );
- self::$has_fopen = wfIniGetBool( 'allow_url_fopen' );
-
- if ( !file_exists("/usr/bin/curl") ) {
- $this->markTestIncomplete("This test requires the curl binary at /usr/bin/curl. If you have curl, please file a bug on this test, or, better yet, provide a patch.");
- }
-
- $content = tempnam( wfTempDir(), "" );
- $headers = tempnam( wfTempDir(), "" );
- if ( !$content && !$headers ) {
- die( "Couldn't create temp file!" );
- }
-
- // This probably isn't the best test for a proxy, but it works on my system!
- system("curl -0 -o $content -s ".self::$proxy);
- $out = file_get_contents( $content );
- if( $out ) {
- self::$has_proxy = true;
- }
-
- /* Maybe use wget instead of curl here ... just to use a different codebase? */
- foreach ( $this->test_geturl as $u ) {
- system( "curl -0 -s -D $headers '$u' -o $content" );
- self::$content["GET $u"] = file_get_contents( $content );
- self::$headers["GET $u"] = file_get_contents( $headers );
- }
- foreach ( $this->test_requesturl as $u ) {
- system( "curl -0 -s -X POST -H 'Content-Length: 0' -D $headers '$u' -o $content" );
- self::$content["POST $u"] = file_get_contents( $content );
- self::$headers["POST $u"] = file_get_contents( $headers );
- }
- foreach ( $this->test_posturl as $u => $postData ) {
- system( "curl -0 -s -X POST -d '$postData' -D $headers '$u' -o $content" );
- self::$content["POST $u => $postData"] = file_get_contents( $content );
- self::$headers["POST $u => $postData"] = file_get_contents( $headers );
- }
- unlink( $content );
- unlink( $headers );
- }
-
-
- function testInstantiation() {
- Http::$httpEngine = false;
-
- $r = HttpRequest::factory("http://www.example.com/");
- if ( self::$has_curl ) {
- $this->assertThat($r, $this->isInstanceOf( 'CurlHttpRequest' ));
- } else {
- $this->assertThat($r, $this->isInstanceOf( 'PhpHttpRequest' ));
- }
- unset($r);
-
- if( !self::$has_fopen ) {
- $this->setExpectedException( 'MWException' );
- }
- Http::$httpEngine = 'php';
- $r = HttpRequest::factory("http://www.example.com/");
- $this->assertThat($r, $this->isInstanceOf( 'PhpHttpRequest' ));
- unset($r);
-
- if( !self::$has_curl ) {
- $this->setExpectedException( 'MWException' );
- }
- Http::$httpEngine = 'curl';
- $r = HttpRequest::factory("http://www.example.com/");
- if( self::$has_curl ) {
- $this->assertThat($r, $this->isInstanceOf( 'CurlHttpRequest' ));
- }
- }
-
- function runHTTPFailureChecks() {
- // Each of the following requests should result in a failure.
-
- $timeout = 1;
- $start_time = time();
- $r = HTTP::get( "http://www.example.com:1/", $timeout);
- $end_time = time();
- $this->assertLessThan($timeout+2, $end_time - $start_time,
- "Request took less than {$timeout}s via ".Http::$httpEngine);
- $this->assertEquals($r, false, "false -- what we get on error from Http::get()");
-
- $r = HTTP::get( "http://www.example.com/this-file-does-not-exist", $timeout);
- $this->assertFalse($r, "False on 404s");
-
-
- $r = HttpRequest::factory( "http://www.example.com/this-file-does-not-exist" );
- $er = $r->execute();
- if ( is_a($r, 'PhpHttpRequest') && version_compare( '5.2.10', phpversion(), '>' ) ) {
- $this->assertRegexp("/HTTP request failed/", $er->getWikiText());
- } else {
- $this->assertRegexp("/404 Not Found/", $er->getWikiText());
- }
- }
-
- function testFailureDefault() {
- Http::$httpEngine = false;
- self::runHTTPFailureChecks();
- }
-
- function testFailurePhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- self::runHTTPFailureChecks();
- }
-
- function testFailureCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- self::runHTTPFailureChecks();
- }
-
- /* ./phase3/includes/Import.php:1108: $data = Http::request( $method, $url ); */
- /* ./includes/Import.php:1124: $link = Title::newFromText( "$interwiki:Special:Export/$page" ); */
- /* ./includes/Import.php:1134: return ImportStreamSource::newFromURL( $url, "POST" ); */
- function runHTTPRequests($proxy=null) {
- $opt = array();
-
- if($proxy) {
- $opt['proxy'] = $proxy;
- } elseif( $proxy === false ) {
- $opt['noProxy'] = true;
- }
-
- /* no postData here because the only request I could find in code so far didn't have any */
- foreach ( $this->test_requesturl as $u ) {
- $r = Http::request( "POST", $u, $opt );
- $this->assertEquals( self::$content["POST $u"], "$r", "POST $u with ".Http::$httpEngine );
- }
- }
-
- function testRequestDefault() {
- Http::$httpEngine = false;
- self::runHTTPRequests();
- }
-
- function testRequestPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- self::runHTTPRequests();
- }
-
- function testRequestCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- self::runHTTPRequests();
- }
-
- /* ./extensions/SpamBlacklist/SpamBlacklist_body.php:164: $httpText = Http::get( $fileName ); */
- /* ./extensions/ApiSVGProxy/ApiSVGProxy.body.php:44: $contents = Http::get( $file->getFullUrl() ); */
- /* ./extensions/BookInformation/drivers/IsbnDb.php:24: if( ( $xml = Http::get( $uri ) ) !== false ) { */
- /* ./extensions/BookInformation/drivers/Amazon.php:23: if( ( $xml = Http::get( $uri ) ) !== false ) { */
- /* ./extensions/TitleBlacklist/TitleBlacklist.list.php:217: $result = Http::get( $url ); */
- /* ./extensions/TSPoll/TSPoll.php:68: $get_server = Http::get( 'http://toolserver.org/~jan/poll/dev/main.php?page=wiki_output&id='.$id ); */
- /* ./extensions/TSPoll/TSPoll.php:70: $get_server = Http::get( 'http://toolserver.org/~jan/poll/main.php?page=wiki_output&id='.$id ); */
- /* ./extensions/DoubleWiki/DoubleWiki.php:56: $translation = Http::get( $url.$sep.'action=render' ); */
- /* ./extensions/ExternalPages/ExternalPages_body.php:177: $serializedText = Http::get( $this->mPageURL ); */
- /* ./extensions/Translate/utils/TranslationHelpers.php:143: $suggestions = Http::get( $url, $timeout ); */
- /* ./extensions/Translate/SpecialImportTranslations.php:169: $filedata = Http::get( $url ); ; */
- /* ./extensions/Translate/TranslateEditAddons.php:338: $suggestions = Http::get( $url, $timeout ); */
- /* ./extensions/SecurePoll/includes/user/Auth.php:283: $value = Http::get( $url, 20, $curlParams ); */
- /* ./extensions/DumpHTML/dumpHTML.inc:778: $contents = Http::get( $url ); */
- /* ./extensions/DumpHTML/dumpHTML.inc:1298: $contents = Http::get( $sourceUrl ); */
- /* ./extensions/DumpHTML/dumpHTML.inc:1373: $contents = Http::get( $sourceUrl ); */
- /* ./phase3/maintenance/rebuildInterwiki.inc:101: $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 ); */
- /* ./phase3/maintenance/findhooks.php:98: $allhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php' ); */
- /* ./phase3/maintenance/findhooks.php:109: $oldhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Removed_hooks&cmlimit=500&format=php' ); */
- /* ./phase3/maintenance/dumpInterwiki.inc:95: $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 ); */
- /* ./phase3/includes/parser/Parser.php:3204: $text = Http::get($url); */
- /* ./phase3/includes/filerepo/ForeignAPIRepo.php:131: $data = Http::get( $url ); */
- /* ./phase3/includes/filerepo/ForeignAPIRepo.php:205: $thumb = Http::get( $foreignUrl ); */
- /* ./phase3/includes/filerepo/File.php:1105: $res = Http::get( $renderUrl ); */
- /* ./phase3/includes/GlobalFunctions.php:2760: * @deprecated Use Http::get() instead */
- /* ./phase3/includes/GlobalFunctions.php:2764: return Http::get( $url ); */
- /* ./phase3/includes/ExternalStoreHttp.php:18: $ret = Http::get( $url ); */
- /* ./phase3/includes/Import.php:357: $data = Http::get( $src ); */
- /* ./extensions/ExternalData/ED_Utils.php:291: return Http::get( $url, 'default', array(CURLOPT_SSL_VERIFYPEER => false) ); */
- /* ./extensions/ExternalData/ED_Utils.php:293: return Http::get( $url ); */
- /* ./extensions/ExternalData/ED_Utils.php:306: $page = Http::get( $url, 'default', array(CURLOPT_SSL_VERIFYPEER => false) ); */
- /* ./extensions/ExternalData/ED_Utils.php:308: $page = Http::get( $url ); */
- /* ./extensions/CodeReview/backend/Subversion.php:320: $blob = Http::get( $target, $this->mTimeout ); */
- /* ./extensions/AmazonPlus/AmazonPlus.php:214: $this->response = Http::get( $urlstr ); */
- /* ./extensions/StaticWiki/StaticWiki.php:24: $text = Http::get( $url ) ; */
- /* ./extensions/StaticWiki/StaticWiki.php:64: $history = Http::get ( $wgStaticWikiExternalSite . "index.php?title=" . urlencode ( $url_title ) . "&action=history" ) ; */
- /* ./extensions/Configure/scripts/findSettings.php:126: $cont = Http::get( "http://www.mediawiki.org/w/index.php?title={$page}&action=raw" ); */
- /* ./extensions/TorBlock/TorBlock.class.php:148: $data = Http::get( $url ); */
- /* ./extensions/HoneypotIntegration/HoneypotIntegration.class.php:60: $data = Http::get( $wgHoneypotURLSource, 'default', */
- /* ./extensions/SemanticForms/includes/SF_Utils.inc:378: $page_contents = Http::get($url); */
- /* ./extensions/LocalisationUpdate/LocalisationUpdate.class.php:172: $basefilecontents = Http::get( $basefile ); */
- /* ./extensions/APC/SpecialAPC.php:245: $rss = Http::get( 'http://pecl.php.net/feeds/pkg_apc.rss' ); */
- /* ./extensions/Interlanguage/Interlanguage.php:56: $a = Http::get( $url ); */
- /* ./extensions/MWSearch/MWSearch_body.php:492: $data = Http::get( $searchUrl, $wgLuceneSearchTimeout, $httpOpts); */
- function runHTTPGets($proxy=null) {
- $opt = array();
-
- if($proxy) {
- $opt['proxy'] = $proxy;
- } elseif( $proxy === false ) {
- $opt['noProxy'] = true;
- }
-
- foreach ( $this->test_geturl as $u ) {
- $r = Http::get( $u, 30, $opt ); /* timeout of 30s */
- $this->assertEquals( self::$content["GET $u"], "$r", "Get $u with ".Http::$httpEngine );
- }
- }
-
- function testGetDefault() {
- Http::$httpEngine = false;
- self::runHTTPGets();
- }
-
- function testGetPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- self::runHTTPGets();
- }
-
- function testGetCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- self::runHTTPGets();
- }
-
- /* ./phase3/maintenance/parserTests.inc:1618: return Http::post( $url, array( 'postData' => wfArrayToCGI( $data ) ) ); */
- function runHTTPPosts($proxy=null) {
- $opt = array();
-
- if($proxy) {
- $opt['proxy'] = $proxy;
- } elseif( $proxy === false ) {
- $opt['noProxy'] = true;
- }
-
- foreach ( $this->test_posturl as $u => $postData ) {
- $opt['postData'] = $postData;
- $r = Http::post( $u, $opt );
- $this->assertEquals( self::$content["POST $u => $postData"], "$r",
- "POST $u (postData=$postData) with ".Http::$httpEngine );
- }
- }
-
- function testPostDefault() {
- Http::$httpEngine = false;
- self::runHTTPPosts();
- }
-
- function testPostPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- self::runHTTPPosts();
- }
-
- function testPostCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- self::runHTTPPosts();
- }
-
- function runProxyRequests() {
- if(!self::$has_proxy) {
- $this->markTestIncomplete( "This test requires a proxy." );
- }
- self::runHTTPGets(self::$proxy);
- self::runHTTPPosts(self::$proxy);
- self::runHTTPRequests(self::$proxy);
-
- // Set false here to do noProxy
- self::runHTTPGets(false);
- self::runHTTPPosts(false);
- self::runHTTPRequests(false);
- }
-
- function testProxyDefault() {
- Http::$httpEngine = false;
- self::runProxyRequests();
- }
-
- function testProxyPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = 'php';
- self::runProxyRequests();
- }
-
- function testProxyCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = 'curl';
- self::runProxyRequests();
- }
-
- function testIsLocalUrl() {
- }
-
- /* ./extensions/DonationInterface/payflowpro_gateway/payflowpro_gateway.body.php:559: $user_agent = Http::userAgent(); */
- function testUserAgent() {
- }
-
- function testIsValidUrl() {
- }
-
- function testValidateCookieDomain() {
- $this->assertFalse( Cookie::validateCookieDomain( "co.uk" ) );
- $this->assertFalse( Cookie::validateCookieDomain( ".co.uk" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "gov.uk" ) );
- $this->assertFalse( Cookie::validateCookieDomain( ".gov.uk" ) );
- $this->assertTrue( Cookie::validateCookieDomain( "supermarket.uk" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "uk" ) );
- $this->assertFalse( Cookie::validateCookieDomain( ".uk" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "127.0.0." ) );
- $this->assertFalse( Cookie::validateCookieDomain( "127." ) );
- $this->assertFalse( Cookie::validateCookieDomain( "127.0.0.1." ) );
- $this->assertTrue( Cookie::validateCookieDomain( "127.0.0.1" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "333.0.0.1" ) );
- $this->assertTrue( Cookie::validateCookieDomain( "example.com" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "example.com." ) );
- $this->assertTrue( Cookie::validateCookieDomain( ".example.com" ) );
-
- $this->assertTrue( Cookie::validateCookieDomain( ".example.com", "www.example.com" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "example.com", "www.example.com" ) );
- $this->assertTrue( Cookie::validateCookieDomain( "127.0.0.1", "127.0.0.1" ) );
- $this->assertFalse( Cookie::validateCookieDomain( "127.0.0.1", "localhost" ) );
-
-
- }
-
- function testSetCooke() {
- $c = new MockCookie( "name", "value",
- array(
- "domain" => "ac.th",
- "path" => "/path/",
- ) );
- $this->assertFalse($c->canServeDomain("ac.th"));
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => "example.com",
- "path" => "/path/",
- ) );
-
- $this->assertTrue($c->canServeDomain("example.com"));
- $this->assertFalse($c->canServeDomain("www.example.com"));
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- ) );
-
- $this->assertFalse($c->canServeDomain("www.example.net"));
- $this->assertFalse($c->canServeDomain("example.com"));
- $this->assertTrue($c->canServeDomain("www.example.com"));
-
- $this->assertFalse($c->canServePath("/"));
- $this->assertFalse($c->canServePath("/bogus/path/"));
- $this->assertFalse($c->canServePath("/path"));
- $this->assertTrue($c->canServePath("/path/"));
-
- $this->assertTrue($c->isUnExpired());
-
- $this->assertEquals("", $c->serializeToHttpRequest("/path/", "www.example.net"));
- $this->assertEquals("", $c->serializeToHttpRequest("/", "www.example.com"));
- $this->assertEquals("name=value", $c->serializeToHttpRequest("/path/", "www.example.com"));
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => "www.example.com",
- "path" => "/path/",
- ) );
- $this->assertFalse($c->canServeDomain("example.com"));
- $this->assertFalse($c->canServeDomain("www.example.net"));
- $this->assertTrue($c->canServeDomain("www.example.com"));
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- "expires" => "-1 day",
- ) );
- $this->assertFalse($c->isUnExpired());
- $this->assertEquals("", $c->serializeToHttpRequest("/path/", "www.example.com"));
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- "expires" => "+1 day",
- ) );
- $this->assertTrue($c->isUnExpired());
- $this->assertEquals("name=value", $c->serializeToHttpRequest("/path/", "www.example.com"));
- }
-
- function testCookieJarSetCookie() {
- $cj = new CookieJar;
- $cj->setCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- ) );
- $cj->setCookie( "name2", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/sub",
- ) );
- $cj->setCookie( "name3", "value",
- array(
- "domain" => ".example.com",
- "path" => "/",
- ) );
- $cj->setCookie( "name4", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- ) );
- $cj->setCookie( "name5", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- "expires" => "-1 day",
- ) );
-
- $this->assertEquals("name4=value", $cj->serializeToHttpRequest("/path/", "www.example.net"));
- $this->assertEquals("name3=value", $cj->serializeToHttpRequest("/", "www.example.com"));
- $this->assertEquals("name=value; name3=value", $cj->serializeToHttpRequest("/path/", "www.example.com"));
-
- $cj->setCookie( "name5", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- "expires" => "+1 day",
- ) );
- $this->assertEquals("name4=value; name5=value", $cj->serializeToHttpRequest("/path/", "www.example.net"));
-
- $cj->setCookie( "name4", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- "expires" => "-1 day",
- ) );
- $this->assertEquals("name5=value", $cj->serializeToHttpRequest("/path/", "www.example.net"));
- }
-
- function testParseResponseHeader() {
- $cj = new CookieJar;
-
- $h[] = "Set-Cookie: name4=value; domain=.example.com; path=/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[0], "www.example.com" );
- $this->assertEquals("name4=value", $cj->serializeToHttpRequest("/", "www.example.com"));
-
- $h[] = "name4=value2; domain=.example.com; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[1], "www.example.com" );
- $this->assertEquals("", $cj->serializeToHttpRequest("/", "www.example.com"));
- $this->assertEquals("name4=value2", $cj->serializeToHttpRequest("/path/", "www.example.com"));
-
- $h[] = "name5=value3; domain=.example.com; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[2], "www.example.com" );
- $this->assertEquals("name4=value2; name5=value3", $cj->serializeToHttpRequest("/path/", "www.example.com"));
-
- $h[] = "name6=value3; domain=.example.net; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[3], "www.example.com" );
- $this->assertEquals("", $cj->serializeToHttpRequest("/path/", "www.example.net"));
-
- $h[] = "name6=value0; domain=.example.net; path=/path/; expires=Mon, 09-Dec-1999 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[4], "www.example.net" );
- $this->assertEquals("", $cj->serializeToHttpRequest("/path/", "www.example.net"));
-
- $h[] = "name6=value4; domain=.example.net; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[5], "www.example.net" );
- $this->assertEquals("name6=value4", $cj->serializeToHttpRequest("/path/", "www.example.net"));
- }
-
- function runCookieRequests() {
- $r = HttpRequest::factory( "http://www.php.net/manual" );
- $r->execute();
-
- $jar = $r->getCookieJar();
- $this->assertThat( $jar, $this->isInstanceOf( 'CookieJar' ) );
-
- if ( is_a($r, 'PhpHttpRequest') && version_compare( '5.1.7', phpversion(), '>' ) ) {
- $this->markTestSkipped( 'Redirection fails or crashes PHP on 5.1.6 and prior' );
- }
- $serialized = $jar->serializeToHttpRequest( "/search?q=test", "www.php.net" );
- $this->assertRegExp( '/\bCOUNTRY=[^=;]+/', $serialized );
- $this->assertRegExp( '/\bLAST_LANG=[^=;]+/', $serialized );
- $this->assertEquals( '', $jar->serializeToHttpRequest( "/search?q=test", "www.php.com" ) );
- }
-
- function testCookieRequestDefault() {
- Http::$httpEngine = false;
- self::runCookieRequests();
- }
- function testCookieRequestPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = 'php';
- self::runCookieRequests();
- }
- function testCookieRequestCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = 'curl';
- self::runCookieRequests();
- }
-} \ No newline at end of file
diff --git a/maintenance/tests/IPTest.php b/maintenance/tests/IPTest.php
deleted file mode 100644
index 9db77f72..00000000
--- a/maintenance/tests/IPTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/*
- * Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
- */
-
-class IPTest extends PHPUnit_Framework_TestCase {
-
- public function testValidIPs() {
- foreach ( range( 0, 255 ) as $i ) {
- $a = sprintf( "%03d", $i );
- $b = sprintf( "%02d", $i );
- $c = sprintf( "%01d", $i );
- foreach ( array_unique( array( $a, $b, $c ) ) as $f ) {
- $ip = "$f.$f.$f.$f";
- $this->assertTrue( IP::isValid( $ip ) , "$ip is a valid IPv4 address" );
- }
- }
- }
-
- public function testInvalidIPs() {
- foreach ( range( 256, 999 ) as $i ) {
- $a = sprintf( "%03d", $i );
- $b = sprintf( "%02d", $i );
- $c = sprintf( "%01d", $i );
- foreach ( array_unique( array( $a, $b, $c ) ) as $f ) {
- $ip = "$f.$f.$f.$f";
- $this->assertFalse( IP::isValid( $ip ), "$ip is not a valid IPv4 address" );
- }
- }
- }
-
- public function testBogusIPs() {
- $invalid = array(
- 'www.xn--var-xla.net',
- '216.17.184.G',
- '216.17.184.1.',
- '216.17.184',
- '216.17.184.',
- '256.17.184.1'
- );
- foreach ( $invalid as $i ) {
- $this->assertFalse( IP::isValid( $i ), "$i is an invalid IPv4 address" );
- }
- }
-
- public function testPrivateIPs() {
- $private = array( '10.0.0.1', '172.16.0.1', '192.168.0.1' );
- foreach ( $private as $p ) {
- $this->assertFalse( IP::isPublic( $p ), "$p is not a public IP address" );
- }
- }
-}
diff --git a/maintenance/tests/ImageFunctionsTest.php b/maintenance/tests/ImageFunctionsTest.php
deleted file mode 100644
index 9794a2a2..00000000
--- a/maintenance/tests/ImageFunctionsTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-class ImageFunctionsTest extends PHPUnit_Framework_TestCase {
- function testFitBoxWidth() {
- $vals = array(
- array(
- 'width' => 50,
- 'height' => 50,
- 'tests' => array(
- 50 => 50,
- 17 => 17,
- 18 => 18 ) ),
- array(
- 'width' => 366,
- 'height' => 300,
- 'tests' => array(
- 50 => 61,
- 17 => 21,
- 18 => 22 ) ),
- array(
- 'width' => 300,
- 'height' => 366,
- 'tests' => array(
- 50 => 41,
- 17 => 14,
- 18 => 15 ) ),
- array(
- 'width' => 100,
- 'height' => 400,
- 'tests' => array(
- 50 => 12,
- 17 => 4,
- 18 => 4 ) ) );
- foreach( $vals as $row ) {
- extract( $row );
- foreach( $tests as $max => $expected ) {
- $y = round( $expected * $height / $width );
- $result = wfFitBoxWidth( $width, $height, $max );
- $y2 = round( $result * $height / $width );
- $this->assertEquals( $expected,
- $result,
- "($width, $height, $max) wanted: {$expected}x$y, got: {$result}x$y2" );
- }
- }
- }
-}
-
-
diff --git a/maintenance/tests/LanguageConverterTest.php b/maintenance/tests/LanguageConverterTest.php
deleted file mode 100644
index 22b396e7..00000000
--- a/maintenance/tests/LanguageConverterTest.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-class LanguageConverterTest extends PHPUnit_Framework_TestCase {
- protected $lang = null;
- protected $lc = null;
-
- function setUp() {
- global $wgMemc, $wgRequest, $wgUser, $wgContLang;
-
- $wgUser = new User;
- $wgRequest = new FauxRequest(array());
- $wgMemc = new FakeMemCachedClient;
- $wgContLang = Language::factory( 'tg' );
- $this->lang = new LanguageTest();
- $this->lc = new TestConverter( $this->lang, 'tg',
- array( 'tg', 'tg-latn' ) );
- }
-
- function tearDown() {
- global $wgMemc;
- unset($wgMemc);
- unset($this->lc);
- unset($this->lang);
- }
-
- function testGetPreferredVariantDefaults() {
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantHeaders() {
- global $wgRequest;
- $wgRequest->setHeader('Accept-Language', 'tg-latn');
-
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantHeaderWeight() {
- global $wgRequest;
- $wgRequest->setHeader('Accept-Language', 'tg;q=1');
-
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantHeaderWeight2() {
- global $wgRequest;
- $wgRequest->setHeader('Accept-Language', 'tg-latn;q=1');
-
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantHeaderMulti() {
- global $wgRequest;
- $wgRequest->setHeader('Accept-Language', 'en, tg-latn;q=1');
-
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantUserOption() {
- global $wgUser;
-
- $wgUser = new User;
- $wgUser->setId(1);
- $wgUser->setOption('variant', 'tg-latn');
-
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantHeaderUserVsUrl() {
- global $wgRequest, $wgUser, $wgContLang;
-
- $wgContLang = Language::factory( 'tg-latn' );
- $wgRequest->setVal('variant', 'tg');
- $wgUser = User::newFromId("admin");
- $wgUser->setId(1);
- $wgUser->setOption('variant', 'tg-latn'); // The user's data is ignored
- // because the variant is set in the URL.
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
- }
-
-
- function testGetPreferredVariantDefaultLanguageVariant() {
- global $wgDefaultLanguageVariant;
-
- $wgDefaultLanguageVariant = 'tg-latn';
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
- }
-
- function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
- global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
-
- $wgContLang = Language::factory( 'tg-latn' );
- $wgDefaultLanguageVariant = 'tg';
- $wgRequest->setVal('variant', null);
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
- $this->assertEquals('tg', $this->lc->getPreferredVariant(false, true));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, false));
- $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
- }
-}
-
-/**
- * Test converter (from Tajiki to latin orthography)
- */
-class TestConverter extends LanguageConverter {
- private $table = array(
- 'б' => 'b',
- 'в' => 'v',
- 'г' => 'g',
- );
-
- function loadDefaultTables() {
- $this->mTables = array(
- 'tg-latn' => new ReplacementArray( $this->table ),
- 'tg' => new ReplacementArray()
- );
- }
-
-}
-
-class LanguageTest extends Language {
- function __construct() {
- parent::__construct();
- $variants = array( 'tg', 'tg-latn' );
- $this->mConverter = new TestConverter( $this, 'tg', $variants );
- }
-}
diff --git a/maintenance/tests/LicensesTest.php b/maintenance/tests/LicensesTest.php
deleted file mode 100644
index c5357f89..00000000
--- a/maintenance/tests/LicensesTest.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/**
- * @group Broken
- */
-class LicensesTest extends PHPUnit_Framework_TestCase {
-
- function testLicenses() {
- $str = "
-* Free licenses:
-** GFLD|Debian disagrees
-";
-
- $lc = new Licenses( $str );
- $this->assertTrue( is_a( $lc, 'Licenses' ), 'Correct class' );
- }
-} \ No newline at end of file
diff --git a/maintenance/tests/LocalFileTest.php b/maintenance/tests/LocalFileTest.php
deleted file mode 100644
index e57798be..00000000
--- a/maintenance/tests/LocalFileTest.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-/**
- * These tests should work regardless of $wgCapitalLinks
- */
-
-class LocalFileTest extends PHPUnit_Framework_TestCase {
- function setUp() {
- global $wgContLang;
- $wgContLang = new Language;
- $info = array(
- 'name' => 'test',
- 'directory' => '/testdir',
- 'url' => '/testurl',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- );
- $this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
- $this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
- $this->repo_lc = new LocalRepo( array( 'initialCapital' => false ) + $info );
- $this->file_hl0 = $this->repo_hl0->newFile( 'test!' );
- $this->file_hl2 = $this->repo_hl2->newFile( 'test!' );
- $this->file_lc = $this->repo_lc->newFile( 'test!' );
- }
-
- function tearDown() {
- global $wgContLang;
- unset($wgContLang);
- }
-
- function testGetHashPath() {
- $this->assertEquals( '', $this->file_hl0->getHashPath() );
- $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
- $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
- }
-
- function testGetRel() {
- $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
- $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
- $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
- }
-
- function testGetUrlRel() {
- $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
- $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
- $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
- }
-
- function testGetArchivePath() {
- $this->assertEquals( '/testdir/archive', $this->file_hl0->getArchivePath() );
- $this->assertEquals( '/testdir/archive/a/a2', $this->file_hl2->getArchivePath() );
- $this->assertEquals( '/testdir/archive/!', $this->file_hl0->getArchivePath( '!' ) );
- $this->assertEquals( '/testdir/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
- }
-
- function testGetThumbPath() {
- $this->assertEquals( '/testdir/thumb/Test!', $this->file_hl0->getThumbPath() );
- $this->assertEquals( '/testdir/thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
- $this->assertEquals( '/testdir/thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
- $this->assertEquals( '/testdir/thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
- }
-
- function testGetArchiveUrl() {
- $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
- $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
- $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
- $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
- }
-
- function testGetThumbUrl() {
- $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
- $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
- $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
- $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
- }
-
- function testGetArchiveVirtualUrl() {
- $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
- $this->assertEquals( 'mwrepo://test/public/archive/a/a2', $this->file_hl2->getArchiveVirtualUrl() );
- $this->assertEquals( 'mwrepo://test/public/archive/%21', $this->file_hl0->getArchiveVirtualUrl( '!' ) );
- $this->assertEquals( 'mwrepo://test/public/archive/a/a2/%21', $this->file_hl2->getArchiveVirtualUrl( '!' ) );
- }
-
- function testGetThumbVirtualUrl() {
- $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
- $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
- $this->assertEquals( 'mwrepo://test/thumb/Test%21/%21', $this->file_hl0->getThumbVirtualUrl( '!' ) );
- $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21/%21', $this->file_hl2->getThumbVirtualUrl( '!' ) );
- }
-
- function testGetUrl() {
- $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
- $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
- }
-}
-
-
diff --git a/maintenance/tests/Makefile b/maintenance/tests/Makefile
deleted file mode 100644
index b2c0fb71..00000000
--- a/maintenance/tests/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-# See
-# http://lists.wikimedia.org/pipermail/wikitech-l/2010-February/046657.html
-# for why prove(1) is the default target and not phpunit(1)
-
-.PHONY: help test
-all test: tap
-
-tap:
- prove -e 'phpunit --tap' *Test*.php
-
-phpunit:
- phpunit
-
-install:
- pear channel-discover pear.phpunit.de
- pear install phpunit/PHPUnit
-
-help:
- # Options:
- # test (default) Run the tests individually through Test::Harness's prove(1)
- # phpunit Run all the tests with phpunit
- # install Install PHPUnit from phpunit.de
- # help You're looking at it!
diff --git a/maintenance/tests/MediaWikiParserTest.php b/maintenance/tests/MediaWikiParserTest.php
deleted file mode 100644
index a545b3bb..00000000
--- a/maintenance/tests/MediaWikiParserTest.php
+++ /dev/null
@@ -1,283 +0,0 @@
-<?php
-
-if ( !defined( 'MEDIAWIKI' ) ) {
- exit;
-}
-
-global $IP;
-define( "NO_COMMAND_LINE", 1 );
-define( "PARSER_TESTS", "$IP/maintenance/parserTests.txt" );
-
-require_once( "$IP/maintenance/parserTests.inc" );
-
-class PHPUnitTestRecorder extends TestRecorder {
-
- function record( $test, $result ) {
- $this->total++;
- $this->success += $result;
-
- }
-
- function reportPercentage( $success, $total ) {}
-}
-
-class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
-#implements PHPUnit_Framework_SelfDescribing {
- static private $count;
- static public $parser;
- static public $iter;
-
- public static function suite() {
- $suite = new PHPUnit_Framework_TestSuite();
-
- self::$iter = new TestFileIterator( PARSER_TESTS );
-
- foreach(self::$iter as $i => $test) {
- $suite->addTest(new ParserUnitTest($i, $test['test']));
- self::$count++;
- }
- unset($tests);
-
- self::$parser = new PTShell;
- self::$iter->setParser(self::$parser);
- self::$parser->recorder->start();
- self::$parser->setupDatabase();
- self::$iter->rewind();
- /* } */
- /* function setUp() { */
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgDeferredUpdateList,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgMessageCache, $wgUseDatabaseMessages, $wgMsgCacheExpiry, $parserMemc,
- $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
- $wgNamespacesWithSubpages, $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath;
-
- $wgScript = '/index.php';
- $wgScriptPath = '/';
- $wgArticlePath = '/wiki/$1';
- $wgStyleSheetPath = '/skins';
- $wgStylePath = '/skins';
- $wgThumbnailScriptPath = false;
- $wgLocalFileRepo = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => '',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- );
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
- $wgNamespaceAliases['Image'] = NS_FILE;
- $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
-
-
- $wgEnableParserCache = false;
- $wgDeferredUpdateList = array();
- $wgMemc =& wfGetMainCache();
- $messageMemc =& wfGetMessageCacheStorage();
- $parserMemc =& wfGetParserCacheStorage();
-
- $wgContLang = new StubContLang;
- $wgUser = new StubUser;
- $wgLang = new StubUserLang;
- $wgOut = new StubObject( 'wgOut', 'OutputPage' );
- $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = new WebRequest;
-
- $wgMessageCache = new StubObject( 'wgMessageCache', 'MessageCache',
- array( $messageMemc, $wgUseDatabaseMessages,
- $wgMsgCacheExpiry, wfWikiID() ) );
- if( $wgStyleDirectory === false) $wgStyleDirectory = "$IP/skins";
-
- return $suite;
- }
-
- public function tearDown() {
- $this->teardownDatabase();
- $this->recorder->report();
- $this->recorder->end();
- $this->teardownUploadDir($this->uploadDir);
- }
-
- public function count() {return self::$count;}
-
- public function toString() {
- return "MediaWiki Parser Tests";
- }
-
-
- private $db;
- private $uploadDir;
- private $keepUploads;
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploadDir( $dir ) {
- if ( $this->keepUploads ) {
- return;
- }
-
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
- )
- );
-
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
-
- "$dir/thumb",
- "$dir",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- * @param array $files full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach( $files as $file ) {
- if( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
- /**
- * Delete the specified directories, if they exist. Must be empty.
- * @param array $dirs full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach( $dirs as $dir ) {
- if( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- * @return string The directory
- */
- private function setupUploadDir() {
- global $IP;
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- wfDebug( "Creating upload directory $dir\n" );
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
- wfMkdirParents( $dir . '/3/3a' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
-
- wfMkdirParents( $dir . '/0/09' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
- return $dir;
- }
-}
-
-class ParserUnitTest extends PHPUnit_Framework_TestCase {
- private $number = 0;
- private $test = "";
-
- public function __construct($number, $test) {
- $this->number = $number;
- $this->test = $test;
- }
-
- function count() {return 1;}
-
- public function run(PHPUnit_Framework_TestResult $result = NULL) {
- PHPUnit_Framework_Assert::resetCount();
- if ($result === NULL) {
- $result = new PHPUnit_Framework_TestResult;
- }
-
- $t = MediaWikiParserTestSuite::$iter->current();
- $k = MediaWikiParserTestSuite::$iter->key();
-
- if(!MediaWikiParserTestSuite::$iter->valid()) {
- return;
- }
-
- // The only way this should happen is if the parserTest.txt
- // file were modified while the script is running.
- if($k != $this->number) {
- $i = $this->number;
- wfDie("I got confused!\n");
- }
-
- $result->startTest($this);
- PHPUnit_Util_Timer::start();
-
- $r = false;
- try {
- $r = MediaWikiParserTestSuite::$parser->runTest(
- $t['test'], $t['input'], $t['result'], $t['options'], $t['config']
- );
- PHPUnit_Framework_Assert::assertTrue(true, $t['test']);
- }
- catch (PHPUnit_Framework_AssertionFailedError $e) {
- $result->addFailure($this, $e, PHPUnit_Util_Timer::stop());
- }
- catch (Exception $e) {
- $result->addError($this, $e, PHPUnit_Util_Timer::stop());
- }
- PHPUnit_Framework_Assert::assertTrue(true, $t['test']);
-
- $result->endTest($this, PHPUnit_Util_Timer::stop());
-
- MediaWikiParserTestSuite::$parser->recorder->record($t['test'], $r);
- MediaWikiParserTestSuite::$iter->next();
- $this->addToAssertionCount(PHPUnit_Framework_Assert::getCount());
-
- return $result;
- }
-
-}
-
-class PTShell extends ParserTest {
- function showTesting( $desc ) {
- }
-
- function showRunFile( $path ) {
- }
-
- function showSuccess( $desc ) {
- PHPUnit_Framework_Assert::assertTrue(true, $desc);
- return true;
- }
-
- function showFailure( $desc, $expected, $got ) {
- PHPUnit_Framework_Assert::assertEquals($expected, $got, $desc);
- }
-
-}
-
-
diff --git a/maintenance/tests/MediaWiki_Setup.php b/maintenance/tests/MediaWiki_Setup.php
deleted file mode 100644
index e7acc338..00000000
--- a/maintenance/tests/MediaWiki_Setup.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-abstract class MediaWiki_Setup extends PHPUnit_Framework_TestCase {
-
- protected function buildTestDatabase( $tables ) {
- global $wgDBprefix;
-
- $db = wfGetDB( DB_MASTER );
- $oldTableNames = array();
- foreach( $tables as $table )
- $oldTableNames[$table] = $db->tableName( $table );
- $db->tablePrefix( 'parsertest_' );
-
- if( $db->isOpen() ) {
- foreach ( $tables as $tbl ) {
- $newTableName = $db->tableName( $tbl );
- $tableName = $oldTableNames[$tbl];
- $db->query( "DROP TABLE IF EXISTS $newTableName", __METHOD__ );
- $db->duplicateTableStructure( $tableName, $newTableName, __METHOD__ );
- }
- return $db;
- } else {
- // Something amiss
- return null;
- }
- }
-}
-
diff --git a/maintenance/tests/README b/maintenance/tests/README
deleted file mode 100644
index b52e790e..00000000
--- a/maintenance/tests/README
+++ /dev/null
@@ -1,24 +0,0 @@
-Some quickie unit tests done with the PHPUnit testing framework. To run the
-test suite, run 'make test' in this dir. This directly invokes 'phpunit.'
-
-PHPUnit is no longer maintained by PEAR. To get the current version of
-PHPUnit, first uninstall any old version of PHPUnit or PHPUnit2 from PEAR,
-then install the current version from phpunit.de like this:
-
-# pear channel-discover pear.phpunit.de
-# pear install phpunit/PHPUnit
-
-You also may wish to install this via your normal package mechanism:
-
-# aptitude install phpunit
- - or -
-# yum install phpunit
-
-Notes:
-- Label currently broken tests in the group Broken and they will not
- be run by phpunit. You can add them to the group by putting the
- following comment at the top of the file:
- /**
- * @group Broken
- */
-- Need to fix some broken tests
diff --git a/maintenance/tests/RevisionTest.php b/maintenance/tests/RevisionTest.php
deleted file mode 100644
index 78fcc7c3..00000000
--- a/maintenance/tests/RevisionTest.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-class RevisionTest extends PHPUnit_Framework_TestCase {
- var $saveGlobals = array();
-
- function setUp() {
- global $wgContLang;
- $wgContLang = Language::factory( 'en' );
- $globalSet = array(
- 'wgLegacyEncoding' => false,
- 'wgCompressRevisions' => false,
- 'wgInputEncoding' => 'utf-8',
- 'wgOutputEncoding' => 'utf-8' );
- foreach( $globalSet as $var => $data ) {
- $this->saveGlobals[$var] = $GLOBALS[$var];
- $GLOBALS[$var] = $data;
- }
- }
-
- function tearDown() {
- foreach( $this->saveGlobals as $var => $data ) {
- $GLOBALS[$var] = $data;
- }
- }
-
- function testGetRevisionText() {
- $row = new stdClass;
- $row->old_flags = '';
- $row->old_text = 'This is a bunch of revision text.';
- $this->assertEquals(
- 'This is a bunch of revision text.',
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextGzip() {
- $row = new stdClass;
- $row->old_flags = 'gzip';
- $row->old_text = gzdeflate( 'This is a bunch of revision text.' );
- $this->assertEquals(
- 'This is a bunch of revision text.',
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextUtf8Native() {
- $row = new stdClass;
- $row->old_flags = 'utf-8';
- $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextUtf8Legacy() {
- $row = new stdClass;
- $row->old_flags = '';
- $row->old_text = "Wiki est l'\xe9cole superieur !";
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextUtf8NativeGzip() {
- $row = new stdClass;
- $row->old_flags = 'gzip,utf-8';
- $row->old_text = gzdeflate( "Wiki est l'\xc3\xa9cole superieur !" );
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextUtf8LegacyGzip() {
- $row = new stdClass;
- $row->old_flags = 'gzip';
- $row->old_text = gzdeflate( "Wiki est l'\xe9cole superieur !" );
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
-
- function testCompressRevisionTextUtf8() {
- $row = new stdClass;
- $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
- $row->old_flags = Revision::compressRevisionText( $row->old_text );
- $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
- "Flags should contain 'utf-8'" );
- $this->assertFalse( false !== strpos( $row->old_flags, 'gzip' ),
- "Flags should not contain 'gzip'" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- $row->old_text, "Direct check" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ), "getRevisionText" );
- }
-
- function testCompressRevisionTextUtf8Gzip() {
- $GLOBALS['wgCompressRevisions'] = true;
- $row = new stdClass;
- $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
- $row->old_flags = Revision::compressRevisionText( $row->old_text );
- $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
- "Flags should contain 'utf-8'" );
- $this->assertTrue( false !== strpos( $row->old_flags, 'gzip' ),
- "Flags should contain 'gzip'" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- gzinflate( $row->old_text ), "Direct check" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ), "getRevisionText" );
- }
-}
-
-
diff --git a/maintenance/tests/RunSeleniumTests.php b/maintenance/tests/RunSeleniumTests.php
new file mode 100644
index 00000000..2574f4b2
--- /dev/null
+++ b/maintenance/tests/RunSeleniumTests.php
@@ -0,0 +1,220 @@
+#!/usr/bin/php
+<?php
+/**
+ * @file
+ * @ingroup Maintenance
+ * @copyright Copyright © Wikimedia Deuschland, 2009
+ * @author Hallo Welt! Medienwerkstatt GmbH
+ * @author Markus Glaser, Dan Nessett, Priyanka Dhanda
+ * initial idea by Daniel Kinzler
+ *
+ * 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
+ */
+
+define( 'SELENIUMTEST', true );
+
+require_once( dirname( dirname( __FILE__ ) )."/Maintenance.php" );
+require_once( 'PHPUnit/Framework.php' );
+require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
+include_once( 'PHPUnit/Util/Log/JUnit.php' );
+require_once( dirname( __FILE__ ) . "/selenium/SeleniumServerManager.php" );
+
+class SeleniumTester extends Maintenance {
+ protected $selenium;
+ protected $serverManager;
+ protected $seleniumServerExecPath;
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Selenium Test Runner. For documentation, visit http://www.mediawiki.org/wiki/SeleniumFramework";
+ $this->addOption( 'port', 'Port used by selenium server. Default: 4444', false, true );
+ $this->addOption( 'host', 'Host selenium server. Default: $wgServer . $wgScriptPath', false, true );
+ $this->addOption( 'testBrowser', 'The browser used during testing. Default: firefox', false, true );
+ $this->addOption( 'wikiUrl', 'The Mediawiki installation to point to. Default: http://localhost', false, true );
+ $this->addOption( 'username', 'The login username for sunning tests. Default: empty', false, true );
+ $this->addOption( 'userPassword', 'The login password for running tests. Default: empty', false, true );
+ $this->addOption( 'seleniumConfig', 'Location of the selenium config file. Default: empty', false, true );
+ $this->addOption( 'list-browsers', 'List the available browsers.' );
+ $this->addOption( 'verbose', 'Be noisier.' );
+ $this->addOption( 'startserver', 'Start Selenium Server (on localhost) before the run.' );
+ $this->addOption( 'stopserver', 'Stop Selenium Server (on localhost) after the run.' );
+ $this->addOption( 'jUnitLogFile', 'Log results in a specified JUnit log file. Default: empty', false, true );
+ $this->addOption( 'runAgainstGrid', 'The test will be run against a Selenium Grid. Default: false.', false, true );
+ $this->deleteOption( 'dbpass' );
+ $this->deleteOption( 'dbuser' );
+ $this->deleteOption( 'globals' );
+ $this->deleteOption( 'wiki' );
+ }
+
+ public function listBrowsers() {
+ $desc = "Available browsers:\n";
+
+ foreach ($this->selenium->getAvailableBrowsers() as $k => $v) {
+ $desc .= " $k => $v\n";
+ }
+
+ echo $desc;
+ }
+
+ protected function startServer() {
+ if ( $this->seleniumServerExecPath == '' ) {
+ die ( "The selenium server exec path is not set in " .
+ "selenium_settings.ini. Cannot start server \n" .
+ "as requested - terminating RunSeleniumTests\n" );
+ }
+ $this->serverManager = new SeleniumServerManager( 'true',
+ $this->selenium->getPort(),
+ $this->seleniumServerExecPath );
+ switch ( $this->serverManager->start() ) {
+ case 'started':
+ break;
+ case 'failed':
+ die ( "Unable to start the Selenium Server - " .
+ "terminating RunSeleniumTests\n" );
+ case 'running':
+ echo ( "Warning: The Selenium Server is " .
+ "already running\n" );
+ break;
+ }
+
+ return;
+ }
+
+ protected function stopServer() {
+ if ( !isset ( $this->serverManager ) ) {
+ echo ( "Warning: Request to stop Selenium Server, but it was " .
+ "not stared by RunSeleniumTests\n" .
+ "RunSeleniumTests cannot stop a Selenium Server it " .
+ "did not start\n" );
+ } else {
+ switch ( $this->serverManager->stop() ) {
+ case 'stopped':
+ break;
+ case 'failed':
+ echo ( "unable to stop the Selenium Server\n" );
+ }
+ }
+ return;
+ }
+
+ protected function runTests( $seleniumTestSuites = array() ) {
+ $result = new PHPUnit_Framework_TestResult;
+ $result->addListener( new SeleniumTestListener( $this->selenium->getLogger() ) );
+ if ( $this->selenium->getJUnitLogFile() ) {
+ $jUnitListener = new PHPUnit_Util_Log_JUnit( $this->selenium->getJUnitLogFile(), true );
+ $result->addListener( $jUnitListener );
+ }
+
+ foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
+ require( $testSuiteFile );
+ $suite = new $testSuiteName();
+ $suite->setName( $testSuiteName );
+ $suite->addTests();
+
+ try {
+ $suite->run( $result );
+ } catch ( Testing_Selenium_Exception $e ) {
+ $suite->tearDown();
+ throw new MWException( $e->getMessage() );
+ }
+ }
+
+ if ( $this->selenium->getJUnitLogFile() ) {
+ $jUnitListener->flush();
+ }
+ }
+
+ public function execute() {
+ global $wgServer, $wgScriptPath, $wgHooks;
+
+ $seleniumSettings = array();
+ $seleniumBrowsers = array();
+ $seleniumTestSuites = array();
+
+ $configFile = $this->getOption( 'seleniumConfig', '' );
+ if ( strlen( $configFile ) > 0 ) {
+ $this->output("Using Selenium Configuration file: " . $configFile . "\n");
+ SeleniumConfig::getSeleniumSettings( $seleniumSettings,
+ $seleniumBrowsers,
+ $seleniumTestSuites,
+ $configFile );
+ } else if ( !isset( $wgHooks['SeleniumSettings'] ) ) {
+ $this->output("No command line configuration file or configuration hook found.\n");
+ SeleniumConfig::getSeleniumSettings( $seleniumSettings,
+ $seleniumBrowsers,
+ $seleniumTestSuites
+ );
+ } else {
+ $this->output("Using 'SeleniumSettings' hook for configuration.\n");
+ wfRunHooks('SeleniumSettings', array( $seleniumSettings,
+ $seleniumBrowsers,
+ $seleniumTestSuites ) );
+ }
+
+ // State for starting/stopping the Selenium server has nothing to do with the Selenium
+ // class. Keep this state local to SeleniumTester class. Using getOption() is clumsy, but
+ // the Maintenance class does not have a setOption()
+ if ( isset( $seleniumSettings['startserver'] ) ) $this->getOption( 'startserver', true );
+ if ( isset( $seleniumSettings['stopserver'] ) ) $this->getOption( 'stopserver', true );
+ if ( !isset( $seleniumSettings['seleniumserverexecpath'] ) ) $seleniumSettings['seleniumserverexecpath'] = '';
+ $this->seleniumServerExecPath = $seleniumSettings['seleniumserverexecpath'];
+
+ //set reasonable defaults if we did not find the settings
+ if ( !isset( $seleniumBrowsers ) ) $seleniumBrowsers = array ('firefox' => '*firefox');
+ if ( !isset( $seleniumSettings['host'] ) ) $seleniumSettings['host'] = $wgServer . $wgScriptPath;
+ if ( !isset( $seleniumSettings['port'] ) ) $seleniumSettings['port'] = '4444';
+ if ( !isset( $seleniumSettings['wikiUrl'] ) ) $seleniumSettings['wikiUrl'] = 'http://localhost';
+ if ( !isset( $seleniumSettings['username'] ) ) $seleniumSettings['username'] = '';
+ if ( !isset( $seleniumSettings['userPassword'] ) ) $seleniumSettings['userPassword'] = '';
+ if ( !isset( $seleniumSettings['testBrowser'] ) ) $seleniumSettings['testBrowser'] = 'firefox';
+ if ( !isset( $seleniumSettings['jUnitLogFile'] ) ) $seleniumSettings['jUnitLogFile'] = false;
+ if ( !isset( $seleniumSettings['runAgainstGrid'] ) ) $seleniumSettings['runAgainstGrid'] = false;
+
+ // Setup Selenium class
+ $this->selenium = new Selenium( );
+ $this->selenium->setAvailableBrowsers( $seleniumBrowsers );
+ $this->selenium->setRunAgainstGrid( $this->getOption( 'runAgainstGrid', $seleniumSettings['runAgainstGrid'] ) );
+ $this->selenium->setUrl( $this->getOption( 'wikiUrl', $seleniumSettings['wikiUrl'] ) );
+ $this->selenium->setBrowser( $this->getOption( 'testBrowser', $seleniumSettings['testBrowser'] ) );
+ $this->selenium->setPort( $this->getOption( 'port', $seleniumSettings['port'] ) );
+ $this->selenium->setHost( $this->getOption( 'host', $seleniumSettings['host'] ) );
+ $this->selenium->setUser( $this->getOption( 'username', $seleniumSettings['username'] ) );
+ $this->selenium->setPass( $this->getOption( 'userPassword', $seleniumSettings['userPassword'] ) );
+ $this->selenium->setVerbose( $this->hasOption( 'verbose' ) );
+ $this->selenium->setJUnitLogFile( $this->getOption( 'jUnitLogFile', $seleniumSettings['jUnitLogFile'] ) );
+
+ if( $this->hasOption( 'list-browsers' ) ) {
+ $this->listBrowsers();
+ exit(0);
+ }
+ if ( $this->hasOption( 'startserver' ) ) {
+ $this->startServer();
+ }
+
+ $logger = new SeleniumTestConsoleLogger;
+ $this->selenium->setLogger( $logger );
+
+ $this->runTests( $seleniumTestSuites );
+
+ if ( $this->hasOption( 'stopserver' ) ) {
+ $this->stopServer();
+ }
+ }
+}
+
+$maintClass = "SeleniumTester";
+
+require_once( DO_MAINTENANCE );
diff --git a/maintenance/tests/SanitizerTest.php b/maintenance/tests/SanitizerTest.php
deleted file mode 100644
index 8a2287d5..00000000
--- a/maintenance/tests/SanitizerTest.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-
-class SanitizerTest extends PHPUnit_Framework_TestCase {
-
- function setUp() {
- AutoLoader::loadClass( 'Sanitizer' );
- }
-
- function testDecodeNamedEntities() {
- $this->assertEquals(
- "\xc3\xa9cole",
- Sanitizer::decodeCharReferences( '&eacute;cole' ),
- 'decode named entities'
- );
- }
-
- function testDecodeNumericEntities() {
- $this->assertEquals(
- "\xc4\x88io bonas dans l'\xc3\xa9cole!",
- Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&#233;cole!" ),
- 'decode numeric entities'
- );
- }
-
- function testDecodeMixedEntities() {
- $this->assertEquals(
- "\xc4\x88io bonas dans l'\xc3\xa9cole!",
- Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&eacute;cole!" ),
- 'decode mixed numeric/named entities'
- );
- }
-
- function testDecodeMixedComplexEntities() {
- $this->assertEquals(
- "\xc4\x88io bonas dans l'\xc3\xa9cole! (mais pas &#x108;io dans l'&eacute;cole)",
- Sanitizer::decodeCharReferences(
- "&#x108;io bonas dans l'&eacute;cole! (mais pas &amp;#x108;io dans l'&#38;eacute;cole)"
- ),
- 'decode mixed complex entities'
- );
- }
-
- function testInvalidAmpersand() {
- $this->assertEquals(
- 'a & b',
- Sanitizer::decodeCharReferences( 'a & b' ),
- 'Invalid ampersand'
- );
- }
-
- function testInvalidEntities() {
- $this->assertEquals(
- '&foo;',
- Sanitizer::decodeCharReferences( '&foo;' ),
- 'Invalid named entity'
- );
- }
-
- function testInvalidNumberedEntities() {
- $this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
- }
-
- function testSelfClosingTag() {
- $GLOBALS['wgUseTidy'] = false;
- $this->assertEquals(
- '<div>Hello world</div>',
- Sanitizer::removeHTMLtags( '<div>Hello world</div />' ),
- 'Self-closing closing div'
- );
- }
-}
-
diff --git a/maintenance/tests/SearchEngineTest.php b/maintenance/tests/SearchEngineTest.php
deleted file mode 100644
index 0cae2d42..00000000
--- a/maintenance/tests/SearchEngineTest.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-require_once( 'MediaWiki_Setup.php' );
-
-/**
- * @group Stub
- */
-class SearchEngineTest extends MediaWiki_Setup {
- var $db, $search;
-
- function insertSearchData() {
- $this->db->safeQuery( <<<SQL
- INSERT INTO ! (page_id,page_namespace,page_title,page_latest)
- VALUES (1, 0, 'Main_Page', 1),
- (2, 1, 'Main_Page', 2),
- (3, 0, 'Smithee', 3),
- (4, 1, 'Smithee', 4),
- (5, 0, 'Unrelated_page', 5),
- (6, 0, 'Another_page', 6),
- (7, 4, 'Help', 7),
- (8, 0, 'Thppt', 8),
- (9, 0, 'Alan_Smithee', 9),
- (10, 0, 'Pages', 10)
-SQL
- , $this->db->tableName( 'page' ) );
- $this->db->safeQuery( <<<SQL
- INSERT INTO ! (rev_id,rev_page)
- VALUES (1, 1),
- (2, 2),
- (3, 3),
- (4, 4),
- (5, 5),
- (6, 6),
- (7, 7),
- (8, 8),
- (9, 9),
- (10, 10)
-SQL
- , $this->db->tableName( 'revision' ) );
- $this->db->safeQuery( <<<SQL
- INSERT INTO ! (old_id,old_text)
- VALUES (1, 'This is a main page'),
- (2, 'This is a talk page to the main page, see [[smithee]]'),
- (3, 'A smithee is one who smiths. See also [[Alan Smithee]]'),
- (4, 'This article sucks.'),
- (5, 'Nothing in this page is about the S word.'),
- (6, 'This page also is unrelated.'),
- (7, 'Help me!'),
- (8, 'Blah blah'),
- (9, 'yum'),
- (10,'are food')
-SQL
- , $this->db->tableName( 'text' ) );
- $this->db->safeQuery( <<<SQL
- INSERT INTO ! (si_page,si_title,si_text)
- VALUES (1, 'main page', 'this is a main page'),
- (2, 'main page', 'this is a talk page to the main page, see smithee'),
- (3, 'smithee', 'a smithee is one who smiths see also alan smithee'),
- (4, 'smithee', 'this article sucks'),
- (5, 'unrelated page', 'nothing in this page is about the s word'),
- (6, 'another page', 'this page also is unrelated'),
- (7, 'help', 'help me'),
- (8, 'thppt', 'blah blah'),
- (9, 'alan smithee', 'yum'),
- (10, 'pages', 'are food')
-SQL
- , $this->db->tableName( 'searchindex' ) );
- }
-
- function fetchIds( $results ) {
- $matches = array();
- while( $row = $results->next() ) {
- $matches[] = $row->getTitle()->getPrefixedText();
- }
- $results->free();
- # Search is not guaranteed to return results in a certain order;
- # sort them numerically so we will compare simply that we received
- # the expected matches.
- sort( $matches );
- return $matches;
- }
-
- function testTextSearch() {
- if( is_null( $this->db ) ) {
- $this->markTestIncomplete( "Can't find a database to test with." );
- }
- $this->assertEquals(
- array( 'Smithee' ),
- $this->fetchIds( $this->search->searchText( 'smithee' ) ),
- "Plain search failed" );
- }
-
- function testTextPowerSearch() {
- if( is_null( $this->db ) ) {
- $this->markTestIncomplete( "Can't find a database to test with." );
- }
- $this->search->setNamespaces( array( 0, 1, 4 ) );
- $this->assertEquals(
- array(
- 'Smithee',
- 'Talk:Main Page',
- ),
- $this->fetchIds( $this->search->searchText( 'smithee' ) ),
- "Power search failed" );
- }
-
- function testTitleSearch() {
- if( is_null( $this->db ) ) {
- $this->markTestIncomplete( "Can't find a database to test with." );
- }
- $this->assertEquals(
- array(
- 'Alan Smithee',
- 'Smithee',
- ),
- $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
- "Title search failed" );
- }
-
- function testTextTitlePowerSearch() {
- if( is_null( $this->db ) ) {
- $this->markTestIncomplete( "Can't find a database to test with." );
- }
- $this->search->setNamespaces( array( 0, 1, 4 ) );
- $this->assertEquals(
- array(
- 'Alan Smithee',
- 'Smithee',
- 'Talk:Smithee',
- ),
- $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
- "Title power search failed" );
- }
-
-}
-
-
-
diff --git a/maintenance/tests/SearchMySQLTest.php b/maintenance/tests/SearchMySQLTest.php
deleted file mode 100644
index 526f6216..00000000
--- a/maintenance/tests/SearchMySQLTest.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-require_once( 'SearchEngineTest.php' );
-
-class SearchMySQLTest extends SearchEngineTest {
- var $db;
-
- function setUp() {
- $GLOBALS['wgContLang'] = new Language;
- $this->db = $this->buildTestDatabase(
- array( 'page', 'revision', 'text', 'searchindex', 'user' ) );
- if( $this->db ) {
- $this->insertSearchData();
- }
- $this->search = new SearchMySQL( $this->db );
- }
-
- function tearDown() {
- if( !is_null( $this->db ) ) {
- wfGetLB()->closeConnecton( $this->db );
- }
- unset( $this->db );
- unset( $this->search );
- }
-}
-
-
diff --git a/maintenance/tests/SearchUpdateTest.php b/maintenance/tests/SearchUpdateTest.php
deleted file mode 100644
index d21319a4..00000000
--- a/maintenance/tests/SearchUpdateTest.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-
-class DatabaseMock extends DatabaseBase {
- function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $failFunction = false, $flags = 0, $tablePrefix = 'get from global' )
- {
- $this->mConn = true;
- $this->mOpened = true;
- }
-
- function open( $server, $user, $password, $dbName ) { return true; }
- function doQuery( $sql ) {}
- function fetchObject( $res ) {}
- function fetchRow( $res ) {}
- function numRows( $res ) {}
- function numFields( $res ) {}
- function fieldName( $res, $n ) {}
- function insertId() {}
- function dataSeek( $res, $row ) {}
- function lastErrno() { return 0; }
- function lastError() { return ''; }
- function affectedRows() {}
- function fieldInfo( $table, $field ) {}
- function strencode( $s ) {}
- function getSoftwareLink() {}
- function getServerVersion() {}
- function getType() {}
-}
-
-class MockSearch extends SearchEngine {
- public static $id;
- public static $title;
- public static $text;
-
- public function __construct( $db ) {
- }
-
- public function update( $id, $title, $text ) {
- self::$id = $id;
- self::$title = $title;
- self::$text = $text;
- }
-}
-
-class SearchUpdateTest extends PHPUnit_Framework_TestCase {
-
- function update( $text, $title = 'Test', $id = 1 ) {
- $u = new SearchUpdate( $id, $title, $text );
- $u->doUpdate();
- return array( MockSearch::$title, MockSearch::$text );
- }
-
- function updateText( $text ) {
- list( $title, $resultText ) = $this->update( $text );
- $resultText = trim( $resultText ); // abstract from some implementation details
- return $resultText;
- }
-
- function setUp() {
- global $wgSearchType, $wgDBtype, $wgLBFactoryConf, $wgDBservers;
- $wgSearchType = 'MockSearch';
- $wgDBtype = 'mock';
- $wgLBFactoryConf['class'] = 'LBFactory_Simple';
- $wgDBservers = null;
- LBFactory::destroyInstance();
- }
-
- function tearDown() {
- LBFactory::destroyInstance();
- }
-
- function testUpdateText() {
- $this->assertEquals(
- 'test',
- $this->updateText( '<div>TeSt</div>' ),
- 'HTML stripped, text lowercased'
- );
-
- $this->assertEquals(
- 'foo bar boz quux',
- $this->updateText( <<<EOT
-<table style="color:red; font-size:100px">
- <tr class="scary"><td><div>foo</div></td><tr>bar</td></tr>
- <tr><td>boz</td><tr>quux</td></tr>
-</table>
-EOT
- ), 'Stripping HTML tables' );
-
- $this->assertEquals(
- 'a b',
- $this->updateText( 'a > b' ),
- 'Handle unclosed tags'
- );
-
- $text = str_pad( "foo <barbarbar \n", 10000, 'x' );
-
- $this->assertNotEquals(
- '',
- $this->updateText( $text ),
- 'Bug 18609'
- );
- }
-}
diff --git a/maintenance/tests/SiteConfigurationTest.php b/maintenance/tests/SiteConfigurationTest.php
deleted file mode 100644
index 791b6fe5..00000000
--- a/maintenance/tests/SiteConfigurationTest.php
+++ /dev/null
@@ -1,311 +0,0 @@
-<?php
-
-function getSiteParams( $conf, $wiki ) {
- $site = null;
- $lang = null;
- foreach( $conf->suffixes as $suffix ) {
- if ( substr( $wiki, -strlen( $suffix ) ) == $suffix ) {
- $site = $suffix;
- $lang = substr( $wiki, 0, -strlen( $suffix ) );
- break;
- }
- }
- return array(
- 'suffix' => $site,
- 'lang' => $lang,
- 'params' => array(
- 'lang' => $lang,
- 'site' => $site,
- 'wiki' => $wiki,
- ),
- 'tags' => array( 'tag' ),
- );
-}
-
-class SiteConfigurationTest extends PHPUnit_Framework_TestCase {
- var $mConf;
-
- function setUp() {
- $this->mConf = new SiteConfiguration;
-
- $this->mConf->suffixes = array( 'wiki' );
- $this->mConf->wikis = array( 'enwiki', 'dewiki', 'frwiki' );
- $this->mConf->settings = array(
- 'simple' => array(
- 'wiki' => 'wiki',
- 'tag' => 'tag',
- 'enwiki' => 'enwiki',
- 'dewiki' => 'dewiki',
- 'frwiki' => 'frwiki',
- ),
-
- 'fallback' => array(
- 'default' => 'default',
- 'wiki' => 'wiki',
- 'tag' => 'tag',
- ),
-
- 'params' => array(
- 'default' => '$lang $site $wiki',
- ),
-
- '+global' => array(
- 'wiki' => array(
- 'wiki' => 'wiki',
- ),
- 'tag' => array(
- 'tag' => 'tag',
- ),
- 'enwiki' => array(
- 'enwiki' => 'enwiki',
- ),
- 'dewiki' => array(
- 'dewiki' => 'dewiki',
- ),
- 'frwiki' => array(
- 'frwiki' => 'frwiki',
- ),
- ),
-
- 'merge' => array(
- '+wiki' => array(
- 'wiki' => 'wiki',
- ),
- '+tag' => array(
- 'tag' => 'tag',
- ),
- 'default' => array(
- 'default' => 'default',
- ),
- '+enwiki' => array(
- 'enwiki' => 'enwiki',
- ),
- '+dewiki' => array(
- 'dewiki' => 'dewiki',
- ),
- '+frwiki' => array(
- 'frwiki' => 'frwiki',
- ),
- ),
- );
-
- $GLOBALS['global'] = array( 'global' => 'global' );
- }
-
-
- function testSiteFromDB() {
- $this->assertEquals(
- array( 'wikipedia', 'en' ),
- $this->mConf->siteFromDB( 'enwiki' ),
- 'siteFromDB()'
- );
- $this->assertEquals(
- array( 'wikipedia', '' ),
- $this->mConf->siteFromDB( 'wiki' ),
- 'siteFromDB() on a suffix'
- );
- $this->assertEquals(
- array( null, null ),
- $this->mConf->siteFromDB( 'wikien' ),
- 'siteFromDB() on a non-existing wiki'
- );
-
- $this->mConf->suffixes = array( 'wiki', '' );
- $this->assertEquals(
- array( '', 'wikien' ),
- $this->mConf->siteFromDB( 'wikien' ),
- 'siteFromDB() on a non-existing wiki (2)'
- );
- }
-
- function testGetLocalDatabases() {
- $this->assertEquals(
- array( 'enwiki', 'dewiki', 'frwiki' ),
- $this->mConf->getLocalDatabases(),
- 'getLocalDatabases()'
- );
- }
-
- function testGet() {
- $this->assertEquals(
- 'enwiki',
- $this->mConf->get( 'simple', 'enwiki', 'wiki' ),
- 'get(): simple setting on an existing wiki'
- );
- $this->assertEquals(
- 'dewiki',
- $this->mConf->get( 'simple', 'dewiki', 'wiki' ),
- 'get(): simple setting on an existing wiki (2)'
- );
- $this->assertEquals(
- 'frwiki',
- $this->mConf->get( 'simple', 'frwiki', 'wiki' ),
- 'get(): simple setting on an existing wiki (3)'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'simple', 'wiki', 'wiki' ),
- 'get(): simple setting on an suffix'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'simple', 'eswiki', 'wiki' ),
- 'get(): simple setting on an non-existing wiki'
- );
-
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'enwiki', 'wiki' ),
- 'get(): fallback setting on an existing wiki'
- );
- $this->assertEquals(
- 'tag',
- $this->mConf->get( 'fallback', 'dewiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): fallback setting on an existing wiki (with wiki tag)'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'wiki', 'wiki' ),
- 'get(): fallback setting on an suffix'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'wiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): fallback setting on an suffix (with wiki tag)'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'eswiki', 'wiki' ),
- 'get(): fallback setting on an non-existing wiki'
- );
- $this->assertEquals(
- 'tag',
- $this->mConf->get( 'fallback', 'eswiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): fallback setting on an non-existing wiki (with wiki tag)'
- );
-
- $common = array( 'wiki' => 'wiki', 'default' => 'default' );
- $commonTag = array( 'tag' => 'tag', 'wiki' => 'wiki', 'default' => 'default' );
- $this->assertEquals(
- array( 'enwiki' => 'enwiki' ) + $common,
- $this->mConf->get( 'merge', 'enwiki', 'wiki' ),
- 'get(): merging setting on an existing wiki'
- );
- $this->assertEquals(
- array( 'enwiki' => 'enwiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'enwiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an existing wiki (with tag)'
- );
- $this->assertEquals(
- array( 'dewiki' => 'dewiki' ) + $common,
- $this->mConf->get( 'merge', 'dewiki', 'wiki' ),
- 'get(): merging setting on an existing wiki (2)'
- );
- $this->assertEquals(
- array( 'dewiki' => 'dewiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'dewiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an existing wiki (2) (with tag)'
- );
- $this->assertEquals(
- array( 'frwiki' => 'frwiki' ) + $common,
- $this->mConf->get( 'merge', 'frwiki', 'wiki' ),
- 'get(): merging setting on an existing wiki (3)'
- );
- $this->assertEquals(
- array( 'frwiki' => 'frwiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'frwiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an existing wiki (3) (with tag)'
- );
- $this->assertEquals(
- array( 'wiki' => 'wiki' ) + $common,
- $this->mConf->get( 'merge', 'wiki', 'wiki' ),
- 'get(): merging setting on an suffix'
- );
- $this->assertEquals(
- array( 'wiki' => 'wiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'wiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an suffix (with tag)'
- );
- $this->assertEquals(
- $common,
- $this->mConf->get( 'merge', 'eswiki', 'wiki' ),
- 'get(): merging setting on an non-existing wiki'
- );
- $this->assertEquals(
- $commonTag,
- $this->mConf->get( 'merge', 'eswiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an non-existing wiki (with tag)'
- );
- }
-
- function testSiteFromDBWithCallback() {
- $this->mConf->siteParamsCallback = 'getSiteParams';
-
- $this->assertEquals(
- array( 'wiki', 'en' ),
- $this->mConf->siteFromDB( 'enwiki' ),
- 'siteFromDB() with callback'
- );
- $this->assertEquals(
- array( 'wiki', '' ),
- $this->mConf->siteFromDB( 'wiki' ),
- 'siteFromDB() with callback on a suffix'
- );
- $this->assertEquals(
- array( null, null ),
- $this->mConf->siteFromDB( 'wikien' ),
- 'siteFromDB() with callback on a non-existing wiki'
- );
- }
-
- function testParamReplacement() {
- $this->mConf->siteParamsCallback = 'getSiteParams';
-
- $this->assertEquals(
- 'en wiki enwiki',
- $this->mConf->get( 'params', 'enwiki', 'wiki' ),
- 'get(): parameter replacement on an existing wiki'
- );
- $this->assertEquals(
- 'de wiki dewiki',
- $this->mConf->get( 'params', 'dewiki', 'wiki' ),
- 'get(): parameter replacement on an existing wiki (2)'
- );
- $this->assertEquals(
- 'fr wiki frwiki',
- $this->mConf->get( 'params', 'frwiki', 'wiki' ),
- 'get(): parameter replacement on an existing wiki (3)'
- );
- $this->assertEquals(
- ' wiki wiki',
- $this->mConf->get( 'params', 'wiki', 'wiki' ),
- 'get(): parameter replacement on an suffix'
- );
- $this->assertEquals(
- 'es wiki eswiki',
- $this->mConf->get( 'params', 'eswiki', 'wiki' ),
- 'get(): parameter replacement on an non-existing wiki'
- );
- }
-
- function testGetAll() {
- $this->mConf->siteParamsCallback = 'getSiteParams';
-
- $getall = array(
- 'simple' => 'enwiki',
- 'fallback' => 'tag',
- 'params' => 'en wiki enwiki',
- 'global' => array( 'enwiki' => 'enwiki' ) + $GLOBALS['global'],
- 'merge' => array( 'enwiki' => 'enwiki', 'tag' => 'tag', 'wiki' => 'wiki', 'default' => 'default' ),
- );
- $this->assertEquals( $getall, $this->mConf->getAll( 'enwiki' ), 'getAll()' );
-
- $this->mConf->extractAllGlobals( 'enwiki', 'wiki' );
-
- $this->assertEquals( $getall['simple'], $GLOBALS['simple'], 'extractAllGlobals(): simple setting' );
- $this->assertEquals( $getall['fallback'], $GLOBALS['fallback'], 'extractAllGlobals(): fallback setting' );
- $this->assertEquals( $getall['params'], $GLOBALS['params'], 'extractAllGlobals(): parameter replacement' );
- $this->assertEquals( $getall['global'], $GLOBALS['global'], 'extractAllGlobals(): merging with global' );
- $this->assertEquals( $getall['merge'], $GLOBALS['merge'], 'extractAllGlobals(): merging setting' );
- }
-}
diff --git a/maintenance/tests/TimeAdjustTest.php b/maintenance/tests/TimeAdjustTest.php
deleted file mode 100644
index bbd697bf..00000000
--- a/maintenance/tests/TimeAdjustTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-class TimeAdjustTest extends PHPUnit_Framework_TestCase {
-
- public function setUp() {
- $this->iniSet( 'precision', 15 );
- }
-
- # Test offset usage for a given language::userAdjust
- function testUserAdjust() {
- global $wgLocalTZoffset, $wgContLang, $wgUser;
-
- $wgContLang = $en = Language::factory( 'en' );
-
- # Collection of parameters for Language_t_Offset.
- # Format: date to be formatted, localTZoffset value, expected date
- $userAdjust_tests = array(
- array( 20061231235959, 0, 20061231235959 ),
- array( 20061231235959, 5, 20070101000459 ),
- array( 20061231235959, 15, 20070101001459 ),
- array( 20061231235959, 60, 20070101005959 ),
- array( 20061231235959, 90, 20070101012959 ),
- array( 20061231235959, 120, 20070101015959 ),
- array( 20061231235959, 540, 20070101085959 ),
- array( 20061231235959, -5, 20061231235459 ),
- array( 20061231235959, -30, 20061231232959 ),
- array( 20061231235959, -60, 20061231225959 ),
- );
-
- foreach( $userAdjust_tests as $data ) {
- $wgLocalTZoffset = $data[1];
-
- $this->assertEquals(
- strval( $data[2] ),
- strval( $en->userAdjust( $data[0], '' ) ),
- "User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
- );
- }
- }
-}
diff --git a/maintenance/tests/TitleTest.php b/maintenance/tests/TitleTest.php
deleted file mode 100644
index 5b42c1c5..00000000
--- a/maintenance/tests/TitleTest.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-class TitleTest extends PHPUnit_Framework_TestCase {
-
- function testLegalChars() {
- $titlechars = Title::legalChars();
-
- foreach ( range( 1, 255 ) as $num ) {
- $chr = chr( $num );
- if ( strpos( "#[]{}<>|", $chr ) !== false || preg_match( "/[\\x00-\\x1f\\x7f]/", $chr ) ) {
- $this->assertFalse( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is not a valid titlechar" );
- } else {
- $this->assertTrue( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is a valid titlechar" );
- }
- }
- }
-}
diff --git a/maintenance/tests/XmlTest.php b/maintenance/tests/XmlTest.php
deleted file mode 100644
index 330e60c6..00000000
--- a/maintenance/tests/XmlTest.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-class XmlTest extends PHPUnit_Framework_TestCase {
-
- function testElementOpen() {
- $this->assertEquals(
- '<element>',
- Xml::element( 'element', null, null ),
- 'Opening element with no attributes'
- );
- }
-
- function testElementEmpty() {
- $this->assertEquals(
- '<element />',
- Xml::element( 'element', null, '' ),
- 'Terminated empty element'
- );
- }
-
- function testElementEscaping() {
- $this->assertEquals(
- '<element>hello &lt;there&gt; you &amp; you</element>',
- Xml::element( 'element', null, 'hello <there> you & you' ),
- 'Element with no attributes and content that needs escaping'
- );
- }
-
- function testElementAttributes() {
- $this->assertEquals(
- '<element key="value" <>="&lt;&gt;">',
- Xml::element( 'element', array( 'key' => 'value', '<>' => '<>' ), null ),
- 'Element attributes, keys are not escaped'
- );
- }
-
- function testOpenElement() {
- $this->assertEquals(
- '<element k="v">',
- Xml::openElement( 'element', array( 'k' => 'v' ) ),
- 'openElement() shortcut'
- );
- }
-
- function testCloseElement() {
- $this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
- }
-
- #
- # textarea
- #
- function testTextareaNoContent() {
- $this->assertEquals(
- '<textarea name="name" id="name" cols="40" rows="5"></textarea>',
- Xml::textarea( 'name', '' ),
- 'textarea() with not content'
- );
- }
-
- function testTextareaAttribs() {
- $this->assertEquals(
- '<textarea name="name" id="name" cols="20" rows="10">&lt;txt&gt;</textarea>',
- Xml::textarea( 'name', '<txt>', 20, 10 ),
- 'textarea() with custom attribs'
- );
- }
-
- #
- # JS
- #
- function testEscapeJsStringSpecialChars() {
- $this->assertEquals(
- '\\\\\r\n',
- Xml::escapeJsString( "\\\r\n" ),
- 'escapeJsString() with special characters'
- );
- }
-
- function testEncodeJsVarBoolean() {
- $this->assertEquals(
- 'true',
- Xml::encodeJsVar( true ),
- 'encodeJsVar() with boolean'
- );
- }
-
- function testEncodeJsVarNull() {
- $this->assertEquals(
- 'null',
- Xml::encodeJsVar( null ),
- 'encodeJsVar() with null'
- );
- }
-
- function testEncodeJsVarArray() {
- $this->assertEquals(
- '["a", 1]',
- Xml::encodeJsVar( array( 'a', 1 ) ),
- 'encodeJsVar() with array'
- );
- $this->assertEquals(
- '{"a": "a", "b": 1}',
- Xml::encodeJsVar( array( 'a' => 'a', 'b' => 1 ) ),
- 'encodeJsVar() with associative array'
- );
- }
-
- function testEncodeJsVarObject() {
- $this->assertEquals(
- '{"a": "a", "b": 1}',
- Xml::encodeJsVar( (object)array( 'a' => 'a', 'b' => 1 ) ),
- 'encodeJsVar() with object'
- );
- }
-}
diff --git a/maintenance/tests/bootstrap.php b/maintenance/tests/bootstrap.php
deleted file mode 100644
index 019bee07..00000000
--- a/maintenance/tests/bootstrap.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-/**
- * Set up the MediaWiki environment when running tests with "phpunit" command
- *
- * Warning: this file is not included from global scope!
- * @file
- */
-
-global $wgCommandLineMode, $IP, $optionsWithArgs;
-$IP = dirname( dirname( dirname( __FILE__ ) ) );
-define( 'MW_PHPUNIT_TEST', true );
-
-require_once( "$IP/maintenance/commandLine.inc" );
-
diff --git a/maintenance/tests/parser/ExtraParserTests.txt b/maintenance/tests/parser/ExtraParserTests.txt
new file mode 100644
index 00000000..66b8032d
--- /dev/null
+++ b/maintenance/tests/parser/ExtraParserTests.txt
Binary files differ
diff --git a/maintenance/tests/parser/parserTest.inc b/maintenance/tests/parser/parserTest.inc
new file mode 100644
index 00000000..c553550c
--- /dev/null
+++ b/maintenance/tests/parser/parserTest.inc
@@ -0,0 +1,1305 @@
+<?php
+# Copyright (C) 2004, 2010 Brion Vibber <brion@pobox.com>
+# http://www.mediawiki.org/
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# http://www.gnu.org/copyleft/gpl.html
+
+/**
+ * @todo Make this more independent of the configuration (and if possible the database)
+ * @todo document
+ * @file
+ * @ingroup Maintenance
+ */
+
+/**
+ * @ingroup Maintenance
+ */
+class ParserTest {
+ /**
+ * boolean $color whereas output should be colorized
+ */
+ private $color;
+
+ /**
+ * boolean $showOutput Show test output
+ */
+ private $showOutput;
+
+ /**
+ * boolean $useTemporaryTables Use temporary tables for the temporary database
+ */
+ private $useTemporaryTables = true;
+
+ /**
+ * boolean $databaseSetupDone True if the database has been set up
+ */
+ private $databaseSetupDone = false;
+
+ /**
+ * string $oldTablePrefix Original table prefix
+ */
+ private $oldTablePrefix;
+
+ private $maxFuzzTestLength = 300;
+ private $fuzzSeed = 0;
+ private $memoryLimit = 50;
+ private $uploadDir = null;
+
+ public $regex = "";
+ private $savedGlobals = array();
+ /**
+ * Sets terminal colorization and diff/quick modes depending on OS and
+ * command-line options (--color and --quick).
+ */
+ public function ParserTest( $options = array() ) {
+ # Only colorize output if stdout is a terminal.
+ $this->color = !wfIsWindows() && posix_isatty( 1 );
+
+ if ( isset( $options['color'] ) ) {
+ switch( $options['color'] ) {
+ case 'no':
+ $this->color = false;
+ break;
+ case 'yes':
+ default:
+ $this->color = true;
+ break;
+ }
+ }
+
+ $this->term = $this->color
+ ? new AnsiTermColorer()
+ : new DummyTermColorer();
+
+ $this->showDiffs = !isset( $options['quick'] );
+ $this->showProgress = !isset( $options['quiet'] );
+ $this->showFailure = !(
+ isset( $options['quiet'] )
+ && ( isset( $options['record'] )
+ || isset( $options['compare'] ) ) ); // redundant output
+
+ $this->showOutput = isset( $options['show-output'] );
+
+
+ if ( isset( $options['regex'] ) ) {
+ if ( isset( $options['record'] ) ) {
+ echo "Warning: --record cannot be used with --regex, disabling --record\n";
+ unset( $options['record'] );
+ }
+ $this->regex = $options['regex'];
+ } else {
+ # Matches anything
+ $this->regex = '';
+ }
+
+ $this->setupRecorder( $options );
+ $this->keepUploads = isset( $options['keep-uploads'] );
+
+ if ( isset( $options['seed'] ) ) {
+ $this->fuzzSeed = intval( $options['seed'] ) - 1;
+ }
+
+ $this->runDisabled = isset( $options['run-disabled'] );
+
+ $this->hooks = array();
+ $this->functionHooks = array();
+ self::setUp();
+ }
+
+ static function setUp() {
+ global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgDeferredUpdateList,
+ $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
+ $wgMessageCache, $wgUseDatabaseMessages, $wgMsgCacheExpiry, $parserMemc,
+ $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
+ $wgThumbnailScriptPath, $wgScriptPath,
+ $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath;
+
+ $wgScript = '/index.php';
+ $wgScriptPath = '/';
+ $wgArticlePath = '/wiki/$1';
+ $wgStyleSheetPath = '/skins';
+ $wgStylePath = '/skins';
+ $wgThumbnailScriptPath = false;
+ $wgLocalFileRepo = array(
+ 'class' => 'LocalRepo',
+ 'name' => 'local',
+ 'directory' => wfTempDir() . '/test-repo',
+ 'url' => 'http://example.com/images',
+ 'deletedDir' => wfTempDir() . '/test-repo/delete',
+ 'hashLevels' => 2,
+ 'transformVia404' => false,
+ );
+ $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
+ $wgNamespaceAliases['Image'] = NS_FILE;
+ $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
+
+
+ $wgEnableParserCache = false;
+ $wgDeferredUpdateList = array();
+ $wgMemc = &wfGetMainCache();
+ $messageMemc = &wfGetMessageCacheStorage();
+ $parserMemc = &wfGetParserCacheStorage();
+
+ // $wgContLang = new StubContLang;
+ $wgUser = new User;
+ $wgLang = new StubUserLang;
+ $wgOut = new StubObject( 'wgOut', 'OutputPage' );
+ $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
+ $wgRequest = new WebRequest;
+
+ $wgMessageCache = new StubObject( 'wgMessageCache', 'MessageCache',
+ array( $messageMemc, $wgUseDatabaseMessages,
+ $wgMsgCacheExpiry ) );
+ if ( $wgStyleDirectory === false ) {
+ $wgStyleDirectory = "$IP/skins";
+ }
+
+ }
+
+ public function setupRecorder ( $options ) {
+ if ( isset( $options['record'] ) ) {
+ $this->recorder = new DbTestRecorder( $this );
+ $this->recorder->version = isset( $options['setversion'] ) ?
+ $options['setversion'] : SpecialVersion::getVersion();
+ } elseif ( isset( $options['compare'] ) ) {
+ $this->recorder = new DbTestPreviewer( $this );
+ } elseif ( isset( $options['upload'] ) ) {
+ $this->recorder = new RemoteTestRecorder( $this );
+ } else {
+ $this->recorder = new TestRecorder( $this );
+ }
+ }
+
+ /**
+ * Remove last character if it is a newline
+ * @group utility
+ */
+ static public function chomp( $s ) {
+ if ( substr( $s, -1 ) === "\n" ) {
+ return substr( $s, 0, -1 );
+ }
+ else {
+ return $s;
+ }
+ }
+
+ /**
+ * Run a fuzz test series
+ * Draw input from a set of test files
+ */
+ function fuzzTest( $filenames ) {
+ $GLOBALS['wgContLang'] = Language::factory( 'en' );
+ $dict = $this->getFuzzInput( $filenames );
+ $dictSize = strlen( $dict );
+ $logMaxLength = log( $this->maxFuzzTestLength );
+ $this->setupDatabase();
+ ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
+
+ $numTotal = 0;
+ $numSuccess = 0;
+ $user = new User;
+ $opts = ParserOptions::newFromUser( $user );
+ $title = Title::makeTitle( NS_MAIN, 'Parser_test' );
+
+ while ( true ) {
+ // Generate test input
+ mt_srand( ++$this->fuzzSeed );
+ $totalLength = mt_rand( 1, $this->maxFuzzTestLength );
+ $input = '';
+
+ while ( strlen( $input ) < $totalLength ) {
+ $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength;
+ $hairLength = min( intval( exp( $logHairLength ) ), $dictSize );
+ $offset = mt_rand( 0, $dictSize - $hairLength );
+ $input .= substr( $dict, $offset, $hairLength );
+ }
+
+ $this->setupGlobals();
+ $parser = $this->getParser();
+
+ // Run the test
+ try {
+ $parser->parse( $input, $title, $opts );
+ $fail = false;
+ } catch ( Exception $exception ) {
+ $fail = true;
+ }
+
+ if ( $fail ) {
+ echo "Test failed with seed {$this->fuzzSeed}\n";
+ echo "Input:\n";
+ var_dump( $input );
+ echo "\n\n";
+ echo "$exception\n";
+ } else {
+ $numSuccess++;
+ }
+
+ $numTotal++;
+ $this->teardownGlobals();
+ $parser->__destruct();
+
+ if ( $numTotal % 100 == 0 ) {
+ $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
+ echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
+ if ( $usage > 90 ) {
+ echo "Out of memory:\n";
+ $memStats = $this->getMemoryBreakdown();
+
+ foreach ( $memStats as $name => $usage ) {
+ echo "$name: $usage\n";
+ }
+ $this->abort();
+ }
+ }
+ }
+ }
+
+ /**
+ * Get an input dictionary from a set of parser test files
+ */
+ function getFuzzInput( $filenames ) {
+ $dict = '';
+
+ foreach ( $filenames as $filename ) {
+ $contents = file_get_contents( $filename );
+ preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
+
+ foreach ( $matches[1] as $match ) {
+ $dict .= $match . "\n";
+ }
+ }
+
+ return $dict;
+ }
+
+ /**
+ * Get a memory usage breakdown
+ */
+ function getMemoryBreakdown() {
+ $memStats = array();
+
+ foreach ( $GLOBALS as $name => $value ) {
+ $memStats['$' . $name] = strlen( serialize( $value ) );
+ }
+
+ $classes = get_declared_classes();
+
+ foreach ( $classes as $class ) {
+ $rc = new ReflectionClass( $class );
+ $props = $rc->getStaticProperties();
+ $memStats[$class] = strlen( serialize( $props ) );
+ $methods = $rc->getMethods();
+
+ foreach ( $methods as $method ) {
+ $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) );
+ }
+ }
+
+ $functions = get_defined_functions();
+
+ foreach ( $functions['user'] as $function ) {
+ $rf = new ReflectionFunction( $function );
+ $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) );
+ }
+
+ asort( $memStats );
+
+ return $memStats;
+ }
+
+ function abort() {
+ $this->abort();
+ }
+
+ /**
+ * Run a series of tests listed in the given text files.
+ * Each test consists of a brief description, wikitext input,
+ * and the expected HTML output.
+ *
+ * Prints status updates on stdout and counts up the total
+ * number and percentage of passed tests.
+ *
+ * @param $filenames Array of strings
+ * @return Boolean: true if passed all tests, false if any tests failed.
+ */
+ public function runTestsFromFiles( $filenames ) {
+ $ok = false;
+ $GLOBALS['wgContLang'] = Language::factory( 'en' );
+ $this->recorder->start();
+ try {
+ $this->setupDatabase();
+ $ok = true;
+
+ foreach ( $filenames as $filename ) {
+ $tests = new TestFileIterator( $filename, $this );
+ $ok = $this->runTests( $tests ) && $ok;
+ }
+
+ $this->teardownDatabase();
+ $this->recorder->report();
+ } catch (DBError $e) {
+ echo $e->getMessage();
+ }
+ $this->recorder->end();
+
+ return $ok;
+ }
+
+ function runTests( $tests ) {
+ $ok = true;
+
+ foreach ( $tests as $t ) {
+ $result =
+ $this->runTest( $t['test'], $t['input'], $t['result'], $t['options'], $t['config'] );
+ $ok = $ok && $result;
+ $this->recorder->record( $t['test'], $result );
+ }
+
+ if ( $this->showProgress ) {
+ print "\n";
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Get a Parser object
+ */
+ function getParser( $preprocessor = null ) {
+ global $wgParserConf;
+
+ $class = $wgParserConf['class'];
+ $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf );
+
+ foreach ( $this->hooks as $tag => $callback ) {
+ $parser->setHook( $tag, $callback );
+ }
+
+ foreach ( $this->functionHooks as $tag => $bits ) {
+ list( $callback, $flags ) = $bits;
+ $parser->setFunctionHook( $tag, $callback, $flags );
+ }
+
+ wfRunHooks( 'ParserTestParser', array( &$parser ) );
+
+ return $parser;
+ }
+
+ /**
+ * Run a given wikitext input through a freshly-constructed wiki parser,
+ * and compare the output against the expected results.
+ * Prints status and explanatory messages to stdout.
+ *
+ * @param $desc String: test's description
+ * @param $input String: wikitext to try rendering
+ * @param $result String: result to output
+ * @param $opts Array: test's options
+ * @param $config String: overrides for global variables, one per line
+ * @return Boolean
+ */
+ public function runTest( $desc, $input, $result, $opts, $config ) {
+ if ( $this->showProgress ) {
+ $this->showTesting( $desc );
+ }
+
+ $opts = $this->parseOptions( $opts );
+ $this->setupGlobals( $opts, $config );
+
+ $user = new User();
+ $options = ParserOptions::newFromUser( $user );
+
+ if ( isset( $opts['title'] ) ) {
+ $titleText = $opts['title'];
+ }
+ else {
+ $titleText = 'Parser test';
+ }
+
+ $local = isset( $opts['local'] );
+ $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
+ $parser = $this->getParser( $preprocessor );
+ $title = Title::newFromText( $titleText );
+
+ if ( isset( $opts['pst'] ) ) {
+ $out = $parser->preSaveTransform( $input, $title, $user, $options );
+ } elseif ( isset( $opts['msg'] ) ) {
+ $out = $parser->transformMsg( $input, $options );
+ } elseif ( isset( $opts['section'] ) ) {
+ $section = $opts['section'];
+ $out = $parser->getSection( $input, $section );
+ } elseif ( isset( $opts['replace'] ) ) {
+ $section = $opts['replace'][0];
+ $replace = $opts['replace'][1];
+ $out = $parser->replaceSection( $input, $section, $replace );
+ } elseif ( isset( $opts['comment'] ) ) {
+ $linker = $user->getSkin();
+ $out = $linker->formatComment( $input, $title, $local );
+ } elseif ( isset( $opts['preload'] ) ) {
+ $out = $parser->getpreloadText( $input, $title, $options );
+ } else {
+ $output = $parser->parse( $input, $title, $options, true, true, 1337 );
+ $out = $output->getText();
+
+ if ( isset( $opts['showtitle'] ) ) {
+ if ( $output->getTitleText() ) {
+ $title = $output->getTitleText();
+ }
+
+ $out = "$title\n$out";
+ }
+
+ if ( isset( $opts['ill'] ) ) {
+ $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
+ } elseif ( isset( $opts['cat'] ) ) {
+ global $wgOut;
+
+ $wgOut->addCategoryLinks( $output->getCategories() );
+ $cats = $wgOut->getCategoryLinks();
+
+ if ( isset( $cats['normal'] ) ) {
+ $out = $this->tidy( implode( ' ', $cats['normal'] ) );
+ } else {
+ $out = '';
+ }
+ }
+
+ $result = $this->tidy( $result );
+ }
+
+ $this->teardownGlobals();
+ return $this->showTestResult( $desc, $result, $out );
+ }
+
+ /**
+ *
+ */
+ function showTestResult( $desc, $result, $out ) {
+ if ( $result === $out ) {
+ $this->showSuccess( $desc );
+ return true;
+ } else {
+ $this->showFailure( $desc, $result, $out );
+ return false;
+ }
+ }
+
+ /**
+ * Use a regex to find out the value of an option
+ * @param $key String: name of option val to retrieve
+ * @param $opts Options array to look in
+ * @param $default Mixed: default value returned if not found
+ */
+ private static function getOptionValue( $key, $opts, $default ) {
+ $key = strtolower( $key );
+
+ if ( isset( $opts[$key] ) ) {
+ return $opts[$key];
+ } else {
+ return $default;
+ }
+ }
+
+ private function parseOptions( $instring ) {
+ $opts = array();
+ // foo
+ // foo=bar
+ // foo="bar baz"
+ // foo=[[bar baz]]
+ // foo=bar,"baz quux"
+ $regex = '/\b
+ ([\w-]+) # Key
+ \b
+ (?:\s*
+ = # First sub-value
+ \s*
+ (
+ "
+ [^"]* # Quoted val
+ "
+ |
+ \[\[
+ [^]]* # Link target
+ \]\]
+ |
+ [\w-]+ # Plain word
+ )
+ (?:\s*
+ , # Sub-vals 1..N
+ \s*
+ (
+ "[^"]*" # Quoted val
+ |
+ \[\[[^]]*\]\] # Link target
+ |
+ [\w-]+ # Plain word
+ )
+ )*
+ )?
+ /x';
+
+ if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
+ foreach ( $matches as $bits ) {
+ array_shift( $bits );
+ $key = strtolower( array_shift( $bits ) );
+ if ( count( $bits ) == 0 ) {
+ $opts[$key] = true;
+ } elseif ( count( $bits ) == 1 ) {
+ $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
+ } else {
+ // Array!
+ $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
+ }
+ }
+ }
+ return $opts;
+ }
+
+ private function cleanupOption( $opt ) {
+ if ( substr( $opt, 0, 1 ) == '"' ) {
+ return substr( $opt, 1, -1 );
+ }
+
+ if ( substr( $opt, 0, 2 ) == '[[' ) {
+ return substr( $opt, 2, -2 );
+ }
+ return $opt;
+ }
+
+ /**
+ * Set up the global variables for a consistent environment for each test.
+ * Ideally this should replace the global configuration entirely.
+ */
+ private function setupGlobals( $opts = '', $config = '' ) {
+ global $wgDBtype;
+
+ # Find out values for some special options.
+ $lang =
+ self::getOptionValue( 'language', $opts, 'en' );
+ $variant =
+ self::getOptionValue( 'variant', $opts, false );
+ $maxtoclevel =
+ self::getOptionValue( 'wgMaxTocLevel', $opts, 999 );
+ $linkHolderBatchSize =
+ self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
+
+ $settings = array(
+ 'wgServer' => 'http://Britney-Spears',
+ 'wgScript' => '/index.php',
+ 'wgScriptPath' => '/',
+ 'wgArticlePath' => '/wiki/$1',
+ 'wgActionPaths' => array(),
+ 'wgLocalFileRepo' => array(
+ 'class' => 'LocalRepo',
+ 'name' => 'local',
+ 'directory' => $this->uploadDir,
+ 'url' => 'http://example.com/images',
+ 'hashLevels' => 2,
+ 'transformVia404' => false,
+ ),
+ 'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
+ 'wgStylePath' => '/skins',
+ 'wgStyleSheetPath' => '/skins',
+ 'wgSitename' => 'MediaWiki',
+ 'wgLanguageCode' => $lang,
+ 'wgDBprefix' => $wgDBtype != 'oracle' ? 'parsertest_' : 'pt_',
+ 'wgRawHtml' => isset( $opts['rawhtml'] ),
+ 'wgLang' => null,
+ 'wgContLang' => null,
+ 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
+ 'wgMaxTocLevel' => $maxtoclevel,
+ 'wgCapitalLinks' => true,
+ 'wgNoFollowLinks' => true,
+ 'wgNoFollowDomainExceptions' => array(),
+ 'wgThumbnailScriptPath' => false,
+ 'wgUseImageResize' => false,
+ 'wgUseTeX' => isset( $opts['math'] ),
+ 'wgMathDirectory' => $this->uploadDir . '/math',
+ 'wgLocaltimezone' => 'UTC',
+ 'wgAllowExternalImages' => true,
+ 'wgUseTidy' => false,
+ 'wgDefaultLanguageVariant' => $variant,
+ 'wgVariantArticlePath' => false,
+ 'wgGroupPermissions' => array( '*' => array(
+ 'createaccount' => true,
+ 'read' => true,
+ 'edit' => true,
+ 'createpage' => true,
+ 'createtalk' => true,
+ ) ),
+ 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
+ 'wgDefaultExternalStore' => array(),
+ 'wgForeignFileRepos' => array(),
+ 'wgLinkHolderBatchSize' => $linkHolderBatchSize,
+ 'wgExperimentalHtmlIds' => false,
+ 'wgExternalLinkTarget' => false,
+ 'wgAlwaysUseTidy' => false,
+ 'wgHtml5' => true,
+ 'wgWellFormedXml' => true,
+ 'wgAllowMicrodataAttributes' => true,
+ );
+
+ if ( $config ) {
+ $configLines = explode( "\n", $config );
+
+ foreach ( $configLines as $line ) {
+ list( $var, $value ) = explode( '=', $line, 2 );
+
+ $settings[$var] = eval( "return $value;" );
+ }
+ }
+
+ $this->savedGlobals = array();
+
+ foreach ( $settings as $var => $val ) {
+ if ( array_key_exists( $var, $GLOBALS ) ) {
+ $this->savedGlobals[$var] = $GLOBALS[$var];
+ }
+
+ $GLOBALS[$var] = $val;
+ }
+
+ $langObj = Language::factory( $lang );
+ $GLOBALS['wgLang'] = $langObj;
+ $GLOBALS['wgContLang'] = $langObj;
+ $GLOBALS['wgMemc'] = new FakeMemCachedClient;
+ $GLOBALS['wgOut'] = new OutputPage;
+
+ global $wgHooks;
+
+ $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
+ $wgHooks['ParserTestParser'][] = 'ParserTestStaticParserHook::setup';
+ $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
+
+ MagicWord::clearCache();
+
+ global $wgUser;
+ $wgUser = new User();
+ }
+
+ /**
+ * List of temporary tables to create, without prefix.
+ * Some of these probably aren't necessary.
+ */
+ private function listTables() {
+ global $wgDBtype;
+
+ $tables = array( 'user', 'user_properties', 'page', 'page_restrictions',
+ 'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks',
+ 'categorylinks', 'templatelinks', 'externallinks', 'langlinks', 'iwlinks',
+ 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage',
+ 'recentchanges', 'watchlist', 'math', 'interwiki', 'logging',
+ 'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
+ 'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links'
+ );
+
+ if ( in_array( $wgDBtype, array( 'mysql', 'sqlite', 'oracle' ) ) )
+ array_push( $tables, 'searchindex' );
+
+ // Allow extensions to add to the list of tables to duplicate;
+ // may be necessary if they hook into page save or other code
+ // which will require them while running tests.
+ wfRunHooks( 'ParserTestTables', array( &$tables ) );
+
+ return $tables;
+ }
+
+ /**
+ * Set up a temporary set of wiki tables to work with for the tests.
+ * Currently this will only be done once per run, and any changes to
+ * the db will be visible to later tests in the run.
+ */
+ public function setupDatabase() {
+ global $wgDBprefix, $wgDBtype;
+
+ if ( $this->databaseSetupDone ) {
+ return;
+ }
+
+ if ( $wgDBprefix === 'parsertest_' || ( $wgDBtype == 'oracle' && $wgDBprefix === 'pt_' ) ) {
+ throw new MWException( 'setupDatabase should be called before setupGlobals' );
+ }
+
+ $this->databaseSetupDone = true;
+ $this->oldTablePrefix = $wgDBprefix;
+
+ # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
+ # It seems to have been fixed since (r55079?).
+ # If it fails, $wgCaches[CACHE_DB] = new HashBagOStuff(); should work around it.
+
+ # CREATE TEMPORARY TABLE breaks if there is more than one server
+ if ( wfGetLB()->getServerCount() != 1 ) {
+ $this->useTemporaryTables = false;
+ }
+
+ $temporary = $this->useTemporaryTables || $wgDBtype == 'postgres';
+
+ $db = wfGetDB( DB_MASTER );
+ $tables = $this->listTables();
+
+ foreach ( $tables as $tbl ) {
+ # Clean up from previous aborted run. So that table escaping
+ # works correctly across DB engines, we need to change the pre-
+ # fix back and forth so tableName() works right.
+ $this->changePrefix( $this->oldTablePrefix );
+ $oldTableName = $db->tableName( $tbl );
+ $this->changePrefix( $wgDBtype != 'oracle' ? 'parsertest_' : 'pt_' );
+ $newTableName = $db->tableName( $tbl );
+
+ if ( $wgDBtype == 'mysql' ) {
+ $db->query( "DROP TABLE IF EXISTS $newTableName" );
+ } elseif ( in_array( $wgDBtype, array( 'postgres', 'oracle' ) ) ) {
+ /* DROPs wouldn't work due to Foreign Key Constraints (bug 14990, r58669)
+ * Use "DROP TABLE IF EXISTS $newTableName CASCADE" for postgres? That
+ * syntax would also work for mysql.
+ */
+ } elseif ( $db->tableExists( $tbl ) ) {
+ $db->query( "DROP TABLE $newTableName" );
+ }
+
+ # Create new table
+ $db->duplicateTableStructure( $oldTableName, $newTableName, $temporary );
+ }
+
+ if ( $wgDBtype == 'oracle' )
+ $db->query( 'BEGIN FILL_WIKI_INFO; END;' );
+
+ $this->changePrefix( $wgDBtype != 'oracle' ? 'parsertest_' : 'pt_' );
+
+ if ( $wgDBtype == 'oracle' ) {
+ # Insert 0 user to prevent FK violations
+
+ # Anonymous user
+ $db->insert( 'user', array(
+ 'user_id' => 0,
+ 'user_name' => 'Anonymous' ) );
+ }
+
+ # Hack: insert a few Wikipedia in-project interwiki prefixes,
+ # for testing inter-language links
+ $db->insert( 'interwiki', array(
+ array( 'iw_prefix' => 'wikipedia',
+ 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 0 ),
+ array( 'iw_prefix' => 'meatball',
+ 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 0 ),
+ array( 'iw_prefix' => 'zh',
+ 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ array( 'iw_prefix' => 'es',
+ 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ array( 'iw_prefix' => 'fr',
+ 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ array( 'iw_prefix' => 'ru',
+ 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ ) );
+
+
+ # Update certain things in site_stats
+ $db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
+
+ # Reinitialise the LocalisationCache to match the database state
+ Language::getLocalisationCache()->unloadAll();
+
+ # Make a new message cache
+ global $wgMessageCache, $wgMemc;
+ $wgMessageCache = new MessageCache( $wgMemc, true, 3600 );
+
+ $this->uploadDir = $this->setupUploadDir();
+ $user = User::createNew( 'WikiSysop' );
+ $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
+ $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
+ 'size' => 12345,
+ 'width' => 1941,
+ 'height' => 220,
+ 'bits' => 24,
+ 'media_type' => MEDIATYPE_BITMAP,
+ 'mime' => 'image/jpeg',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'fileExists' => true
+ ), $db->timestamp( '20010115123500' ), $user );
+
+ # This image will be blacklisted in [[MediaWiki:Bad image list]]
+ $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
+ $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
+ 'size' => 12345,
+ 'width' => 320,
+ 'height' => 240,
+ 'bits' => 24,
+ 'media_type' => MEDIATYPE_BITMAP,
+ 'mime' => 'image/jpeg',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'fileExists' => true
+ ), $db->timestamp( '20010115123500' ), $user );
+ }
+
+ /**
+ * Change the table prefix on all open DB connections/
+ */
+ protected function changePrefix( $prefix ) {
+ global $wgDBprefix;
+ wfGetLBFactory()->forEachLB( array( $this, 'changeLBPrefix' ), array( $prefix ) );
+ $wgDBprefix = $prefix;
+ }
+
+ public function changeLBPrefix( $lb, $prefix ) {
+ $lb->forEachOpenConnection( array( $this, 'changeDBPrefix' ), array( $prefix ) );
+ }
+
+ public function changeDBPrefix( $db, $prefix ) {
+ $db->tablePrefix( $prefix );
+ }
+
+ public function teardownDatabase() {
+ global $wgDBtype;
+
+ if ( !$this->databaseSetupDone ) {
+ $this->teardownGlobals();
+ return;
+ }
+ $this->teardownUploadDir( $this->uploadDir );
+
+ $this->changePrefix( $this->oldTablePrefix );
+ $this->databaseSetupDone = false;
+
+ if ( $this->useTemporaryTables ) {
+ # Don't need to do anything
+ $this->teardownGlobals();
+ return;
+ }
+
+ $tables = $this->listTables();
+ $db = wfGetDB( DB_MASTER );
+
+ foreach ( $tables as $table ) {
+ $sql = $wgDBtype == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
+ $db->query( $sql );
+ }
+
+ if ( $wgDBtype == 'oracle' )
+ $db->query( 'BEGIN FILL_WIKI_INFO; END;' );
+
+ $this->teardownGlobals();
+ }
+
+ /**
+ * Create a dummy uploads directory which will contain a couple
+ * of files in order to pass existence tests.
+ *
+ * @return String: the directory
+ */
+ private function setupUploadDir() {
+ global $IP;
+
+ if ( $this->keepUploads ) {
+ $dir = wfTempDir() . '/mwParser-images';
+
+ if ( is_dir( $dir ) ) {
+ return $dir;
+ }
+ } else {
+ $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+ }
+
+ // wfDebug( "Creating upload directory $dir\n" );
+ if ( file_exists( $dir ) ) {
+ wfDebug( "Already exists!\n" );
+ return $dir;
+ }
+
+ wfMkdirParents( $dir . '/3/3a' );
+ copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+ wfMkdirParents( $dir . '/0/09' );
+ copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
+
+ return $dir;
+ }
+
+ /**
+ * Restore default values and perform any necessary clean-up
+ * after each test runs.
+ */
+ private function teardownGlobals() {
+ RepoGroup::destroySingleton();
+ LinkCache::singleton()->clear();
+
+ foreach ( $this->savedGlobals as $var => $val ) {
+ $GLOBALS[$var] = $val;
+ }
+ }
+
+ /**
+ * Remove the dummy uploads directory
+ */
+ private function teardownUploadDir( $dir ) {
+ if ( $this->keepUploads ) {
+ return;
+ }
+
+ // delete the files first, then the dirs.
+ self::deleteFiles(
+ array (
+ "$dir/3/3a/Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
+
+ "$dir/0/09/Bad.jpg",
+
+ "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
+ )
+ );
+
+ self::deleteDirs(
+ array (
+ "$dir/3/3a",
+ "$dir/3",
+ "$dir/thumb/6/65",
+ "$dir/thumb/6",
+ "$dir/thumb/3/3a/Foobar.jpg",
+ "$dir/thumb/3/3a",
+ "$dir/thumb/3",
+
+ "$dir/0/09/",
+ "$dir/0/",
+ "$dir/thumb",
+ "$dir/math/f/a/5",
+ "$dir/math/f/a",
+ "$dir/math/f",
+ "$dir/math",
+ "$dir",
+ )
+ );
+ }
+
+ /**
+ * Delete the specified files, if they exist.
+ * @param $files Array: full paths to files to delete.
+ */
+ private static function deleteFiles( $files ) {
+ foreach ( $files as $file ) {
+ if ( file_exists( $file ) ) {
+ unlink( $file );
+ }
+ }
+ }
+
+ /**
+ * Delete the specified directories, if they exist. Must be empty.
+ * @param $dirs Array: full paths to directories to delete.
+ */
+ private static function deleteDirs( $dirs ) {
+ foreach ( $dirs as $dir ) {
+ if ( is_dir( $dir ) ) {
+ rmdir( $dir );
+ }
+ }
+ }
+
+ /**
+ * "Running test $desc..."
+ */
+ protected function showTesting( $desc ) {
+ print "Running test $desc... ";
+ }
+
+ /**
+ * Print a happy success message.
+ *
+ * @param $desc String: the test name
+ * @return Boolean
+ */
+ protected function showSuccess( $desc ) {
+ if ( $this->showProgress ) {
+ print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
+ }
+
+ return true;
+ }
+
+ /**
+ * Print a failure message and provide some explanatory output
+ * about what went wrong if so configured.
+ *
+ * @param $desc String: the test name
+ * @param $result String: expected HTML output
+ * @param $html String: actual HTML output
+ * @return Boolean
+ */
+ protected function showFailure( $desc, $result, $html ) {
+ if ( $this->showFailure ) {
+ if ( !$this->showProgress ) {
+ # In quiet mode we didn't show the 'Testing' message before the
+ # test, in case it succeeded. Show it now:
+ $this->showTesting( $desc );
+ }
+
+ print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
+
+ if ( $this->showOutput ) {
+ print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
+ }
+
+ if ( $this->showDiffs ) {
+ print $this->quickDiff( $result, $html );
+ if ( !$this->wellFormed( $html ) ) {
+ print "XML error: $this->mXmlError\n";
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Run given strings through a diff and return the (colorized) output.
+ * Requires writable /tmp directory and a 'diff' command in the PATH.
+ *
+ * @param $input String
+ * @param $output String
+ * @param $inFileTail String: tailing for the input file name
+ * @param $outFileTail String: tailing for the output file name
+ * @return String
+ */
+ protected function quickDiff( $input, $output, $inFileTail = 'expected', $outFileTail = 'actual' ) {
+ $prefix = wfTempDir() . "/mwParser-" . mt_rand();
+
+ $infile = "$prefix-$inFileTail";
+ $this->dumpToFile( $input, $infile );
+
+ $outfile = "$prefix-$outFileTail";
+ $this->dumpToFile( $output, $outfile );
+
+ $diff = `diff -au $infile $outfile`;
+ unlink( $infile );
+ unlink( $outfile );
+
+ return $this->colorDiff( $diff );
+ }
+
+ /**
+ * Write the given string to a file, adding a final newline.
+ *
+ * @param $data String
+ * @param $filename String
+ */
+ private function dumpToFile( $data, $filename ) {
+ $file = fopen( $filename, "wt" );
+ fwrite( $file, $data . "\n" );
+ fclose( $file );
+ }
+
+ /**
+ * Colorize unified diff output if set for ANSI color output.
+ * Subtractions are colored blue, additions red.
+ *
+ * @param $text String
+ * @return String
+ */
+ protected function colorDiff( $text ) {
+ return preg_replace(
+ array( '/^(-.*)$/m', '/^(\+.*)$/m' ),
+ array( $this->term->color( 34 ) . '$1' . $this->term->reset(),
+ $this->term->color( 31 ) . '$1' . $this->term->reset() ),
+ $text );
+ }
+
+ /**
+ * Show "Reading tests from ..."
+ *
+ * @param $path String
+ */
+ public function showRunFile( $path ) {
+ print $this->term->color( 1 ) .
+ "Reading tests from \"$path\"..." .
+ $this->term->reset() .
+ "\n";
+ }
+
+ /**
+ * Insert a temporary test article
+ * @param $name String: the title, including any prefix
+ * @param $text String: the article text
+ * @param $line Integer: the input line number, for reporting errors
+ */
+ static public function addArticle( $name, $text, $line = 'unknown' ) {
+ global $wgCapitalLinks;
+
+ $text = self::chomp($text);
+
+ $oldCapitalLinks = $wgCapitalLinks;
+ $wgCapitalLinks = true; // We only need this from SetupGlobals() See r70917#c8637
+
+ $name = self::chomp( $name );
+ $title = Title::newFromText( $name );
+
+ if ( is_null( $title ) ) {
+ wfDie( "invalid title ('$name' => '$title') at line $line\n" );
+ }
+
+ $aid = $title->getArticleID( Title::GAID_FOR_UPDATE );
+
+ if ( $aid != 0 ) {
+ debug_print_backtrace();
+ wfDie( "duplicate article '$name' at line $line\n" );
+ }
+
+ $art = new Article( $title );
+ $art->insertNewArticle( $text, '', false, false );
+
+ $wgCapitalLinks = $oldCapitalLinks;
+ }
+
+ /**
+ * Steal a callback function from the primary parser, save it for
+ * application to our scary parser. If the hook is not installed,
+ * abort processing of this file.
+ *
+ * @param $name String
+ * @return Bool true if tag hook is present
+ */
+ public function requireHook( $name ) {
+ global $wgParser;
+
+ $wgParser->firstCallInit( ); // make sure hooks are loaded.
+
+ if ( isset( $wgParser->mTagHooks[$name] ) ) {
+ $this->hooks[$name] = $wgParser->mTagHooks[$name];
+ } else {
+ echo " This test suite requires the '$name' hook extension, skipping.\n";
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Steal a callback function from the primary parser, save it for
+ * application to our scary parser. If the hook is not installed,
+ * abort processing of this file.
+ *
+ * @param $name String
+ * @return Bool true if function hook is present
+ */
+ public function requireFunctionHook( $name ) {
+ global $wgParser;
+
+ $wgParser->firstCallInit( ); // make sure hooks are loaded.
+
+ if ( isset( $wgParser->mFunctionHooks[$name] ) ) {
+ $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name];
+ } else {
+ echo " This test suite requires the '$name' function hook extension, skipping.\n";
+ return false;
+ }
+
+ return true;
+ }
+
+ /*
+ * Run the "tidy" command on text if the $wgUseTidy
+ * global is true
+ *
+ * @param $text String: the text to tidy
+ * @return String
+ * @static
+ */
+ private function tidy( $text ) {
+ global $wgUseTidy;
+
+ if ( $wgUseTidy ) {
+ $text = MWTidy::tidy( $text );
+ }
+
+ return $text;
+ }
+
+ private function wellFormed( $text ) {
+ $html =
+ Sanitizer::hackDocType() .
+ '<html>' .
+ $text .
+ '</html>';
+
+ $parser = xml_parser_create( "UTF-8" );
+
+ # case folding violates XML standard, turn it off
+ xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
+
+ if ( !xml_parse( $parser, $html, true ) ) {
+ $err = xml_error_string( xml_get_error_code( $parser ) );
+ $position = xml_get_current_byte_index( $parser );
+ $fragment = $this->extractFragment( $html, $position );
+ $this->mXmlError = "$err at byte $position:\n$fragment";
+ xml_parser_free( $parser );
+
+ return false;
+ }
+
+ xml_parser_free( $parser );
+
+ return true;
+ }
+
+ private function extractFragment( $text, $position ) {
+ $start = max( 0, $position - 10 );
+ $before = $position - $start;
+ $fragment = '...' .
+ $this->term->color( 34 ) .
+ substr( $text, $start, $before ) .
+ $this->term->color( 0 ) .
+ $this->term->color( 31 ) .
+ $this->term->color( 1 ) .
+ substr( $text, $position, 1 ) .
+ $this->term->color( 0 ) .
+ $this->term->color( 34 ) .
+ substr( $text, $position + 1, 9 ) .
+ $this->term->color( 0 ) .
+ '...';
+ $display = str_replace( "\n", ' ', $fragment );
+ $caret = ' ' .
+ str_repeat( ' ', $before ) .
+ $this->term->color( 31 ) .
+ '^' .
+ $this->term->color( 0 );
+
+ return "$display\n$caret";
+ }
+
+ static function getFakeTimestamp( &$parser, &$ts ) {
+ $ts = 123;
+ return true;
+ }
+}
diff --git a/maintenance/parserTests.txt b/maintenance/tests/parser/parserTests.txt
index 4515943a..b3fa560c 100644
--- a/maintenance/parserTests.txt
+++ b/maintenance/tests/parser/parserTests.txt
@@ -53,6 +53,12 @@ Template:!
|
!! endarticle
+!!article
+MediaWiki:bad image list
+!!text
+* [[File:Bad.jpg]] except [[Nasty page]]
+!!endarticle
+
###
### Basic tests
###
@@ -370,6 +376,21 @@ Regression with preformatted in <center>
!! end
+# Expected output in the following test is not really expected (there should be
+# <pre> in the output) -- it's only testing for well-formedness.
+!! test
+Bug 6200: Preformatted in <blockquote>
+!! input
+<blockquote>
+ Blah
+</blockquote>
+!! result
+<blockquote>
+ Blah
+</blockquote>
+
+!! end
+
!! test
<pre> with attributes (bug 3202)
!! input
@@ -406,6 +427,59 @@ Regression with preformatted in <center>
!! end
+!! test
+<nowiki> inside <pre> (bug 13238)
+!! input
+<pre>
+<nowiki>
+</pre>
+<pre>
+<nowiki></nowiki>
+</pre>
+<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>
+!! result
+<pre>
+&lt;nowiki&gt;
+</pre>
+<pre>
+
+</pre>
+<pre>&lt;nowiki&gt;Foo&lt;/nowiki&gt;</pre>
+
+!! end
+
+!! test
+<nowiki> and <pre> preference (first one wins)
+!! input
+<pre>
+<nowiki>
+</pre>
+</nowiki>
+</pre>
+
+<nowiki>
+<pre>
+<nowiki>
+</pre>
+</nowiki>
+</pre>
+
+!! result
+<pre>
+&lt;nowiki&gt;
+</pre>
+<p>&lt;/nowiki&gt;
+&lt;/pre&gt;
+</p><p>
+&lt;pre&gt;
+&lt;nowiki&gt;
+&lt;/pre&gt;
+
+&lt;/pre&gt;
+</p>
+!! end
+
+
###
### Definition lists
###
@@ -414,7 +488,7 @@ Simple definition
!! input
; name : Definition
!! result
-<dl><dt> name&nbsp;</dt><dd> Definition
+<dl><dt> name&#160;</dt><dd> Definition
</dd></dl>
!! end
@@ -444,7 +518,7 @@ Definition list with URL link
!! input
; http://example.com/ : definition
!! result
-<dl><dt> <a href="http://example.com/" class="external free" rel="nofollow">http://example.com/</a>&nbsp;</dt><dd> definition
+<dl><dt> <a href="http://example.com/" class="external free" rel="nofollow">http://example.com/</a>&#160;</dt><dd> definition
</dd></dl>
!! end
@@ -495,7 +569,7 @@ Definition lists: colon in external link text
!! input
; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
!! result
-<dl><dt> <a href="http://www.wikipedia2.org/" class="external text" rel="nofollow">Wikipedia&nbsp;: The Next Generation</a></dt><dd> OK, I made that up
+<dl><dt> <a href="http://www.wikipedia2.org/" class="external text" rel="nofollow">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
</dd></dl>
!! end
@@ -516,7 +590,7 @@ Definition lists: self-closed tag
!! input
;one<br/>two : two-line fun
!! result
-<dl><dt>one<br />two&nbsp;</dt><dd> two-line fun
+<dl><dt>one<br />two&#160;</dt><dd> two-line fun
</dd></dl>
!! end
@@ -865,18 +939,6 @@ BUG 289: literal double quote in bracketed URL
!!end
!! test
-External links: invalid character
-Fixme: the missing char seems to have gone missing
-!! options
-disabled
-!! input
-[http://www.example.com test]
-!! result
-<p>[<a href="http://www.example.com" class="external free" rel="nofollow">http://www.example.com</a> test]
-</p>
-!! end
-
-!! test
External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
!! input
[http://www.example.com test]
@@ -1026,6 +1088,15 @@ External link containing double-single-quotes in text embedded in italics (bug 4
!! end
!! test
+External link containing double-single-quotes with no space separating the url from text in italics
+!! input
+[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
+!! result
+<p><a href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm" class="external text" rel="nofollow"><i>La muerte de Casagemas</i> (1901) en el sitio de <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&amp;action=edit&amp;redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</a>
+</p>
+!! end
+
+!! test
URL-encoding in URL functions (single parameter)
!! input
{{localurl:Some page|amp=&}}
@@ -1136,10 +1207,12 @@ Simple table
!! result
<table>
<tr>
-<td> 1 </td><td> 2
+<td> 1 </td>
+<td> 2
</td></tr>
<tr>
-<td> 3 </td><td> 4
+<td> 3 </td>
+<td> 4
</td></tr></table>
!! end
@@ -1172,27 +1245,45 @@ Multiplication table
<caption>Multiplication table
</caption>
<tr>
-<th> &times; </th><th> 1 </th><th> 2 </th><th> 3
+<th> &times; </th>
+<th> 1 </th>
+<th> 2 </th>
+<th> 3
</th></tr>
<tr>
<th> 1
-</th><td> 1 </td><td> 2 </td><td> 3
+</th>
+<td> 1 </td>
+<td> 2 </td>
+<td> 3
</td></tr>
<tr>
<th> 2
-</th><td> 2 </td><td> 4 </td><td> 6
+</th>
+<td> 2 </td>
+<td> 4 </td>
+<td> 6
</td></tr>
<tr>
<th> 3
-</th><td> 3 </td><td> 6 </td><td> 9
+</th>
+<td> 3 </td>
+<td> 6 </td>
+<td> 9
</td></tr>
<tr>
<th> 4
-</th><td> 4 </td><td> 8 </td><td> 12
+</th>
+<td> 4 </td>
+<td> 8 </td>
+<td> 12
</td></tr>
<tr>
<th> 5
-</th><td> 5 </td><td> 10 </td><td> 15
+</th>
+<td> 5 </td>
+<td> 10 </td>
+<td> 15
</td></tr></table>
!! end
@@ -1212,12 +1303,15 @@ Table rowspan
<table align="right" border="1">
<tr>
<td> Cell 1, row 1
-</td><td rowspan="2"> Cell 2, row 1 (and 2)
-</td><td> Cell 3, row 1
+</td>
+<td rowspan="2"> Cell 2, row 1 (and 2)
+</td>
+<td> Cell 3, row 1
</td></tr>
<tr>
<td> Cell 1, row 2
-</td><td> Cell 3, row 2
+</td>
+<td> Cell 3, row 2
</td></tr></table>
!! end
@@ -1239,7 +1333,8 @@ Nested table
<table border="1">
<tr>
<td> &alpha;
-</td><td>
+</td>
+<td>
<table bgcolor="#ABCDEF" border="2">
<tr>
<td>nested
@@ -1247,7 +1342,8 @@ Nested table
<tr>
<td>table
</td></tr></table>
-</td><td>the original table again
+</td>
+<td>the original table again
</td></tr></table>
!! end
@@ -1267,20 +1363,16 @@ Invalid attributes in table cell (bug 1830)
!! end
-# FIXME: It's not clear at all that this is the result we want, but the actual
-# output right now is invalid XML, so clearly something is wrong. The result
-# specified here is now valid XML, which is an improvement . . .
!! test
Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
-!! options
-disabled
!! input
{|
| |[ftp://|x||]" onmouseover="alert(document.cookie)">test
!! result
<table>
<tr>
-<td><a href="ftp://|x||" class="external autonumber" title="ftp://|x||" rel="nofollow">[1]</a></td><td>" onmouseover="alert(document.cookie)"&gt;test
+<td>[<a href="ftp://%7Cx" class="external free" rel="nofollow">ftp://%7Cx</a></td>
+<td>]" onmouseover="alert(document.cookie)"&gt;test
</td>
</tr>
</table>
@@ -1296,7 +1388,7 @@ Plain link, capitalized
!! input
[[Main Page]]
!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+<p><a href="/wiki/Main_Page">Main Page</a>
</p>
!! end
@@ -1305,7 +1397,7 @@ Plain link, uncapitalized
!! input
[[main Page]]
!! result
-<p><a href="/wiki/Main_Page" title="Main Page">main Page</a>
+<p><a href="/wiki/Main_Page">main Page</a>
</p>
!! end
@@ -1359,7 +1451,7 @@ Link with prefix
!! input
xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]]
!! result
-<p>xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a>, xxx<a href="/wiki/Main_Page" title="Main Page">Main Page</a>, Xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a> XXX<a href="/wiki/Main_Page" title="Main Page">main Page</a>, XXX<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+<p>xxx<a href="/wiki/Main_Page">main Page</a>, xxx<a href="/wiki/Main_Page">Main Page</a>, Xxx<a href="/wiki/Main_Page">main Page</a> XXX<a href="/wiki/Main_Page">main Page</a>, XXX<a href="/wiki/Main_Page">Main Page</a>
</p>
!! end
@@ -1368,7 +1460,7 @@ Link with suffix
!! input
[[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!!
!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>XXX, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>!!!
+<p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page">Main Page</a>XXX, <a href="/wiki/Main_Page">Main Page</a>!!!
</p>
!! end
@@ -1474,12 +1566,10 @@ Link containing "<#" and ">#" as a hex sequences
!! test
Link containing double-single-quotes '' (bug 4598)
-!! options
-disabled
!! input
[[Lista d''e paise d''o munno]]
!! result
-<p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit" class="new" title="Lista d''e paise d''o munno">Lista d''e paise d''o munno</a>
+<p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
</p>
!! end
@@ -1497,7 +1587,25 @@ Link containing double-single-quotes '' in text embedded in italics (bug 4598 sa
!! input
''Some [[Link|pretty ''italics'' and stuff]]!
!! result
-<p><i>Some </i><a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)"><i>pretty </i>italics<i> and stuff</i></a><i>!</i>
+<p><i>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!</i>
+</p>
+!! end
+
+!! test
+Link with double quotes in title part (literal) and alternate part (interpreted)
+!! input
+[[File:Denys Savchenko ''Pentecoste''.jpg]]
+
+[[''Pentecoste'']]
+
+[[''Pentecoste''|Pentecoste]]
+
+[[''Pentecoste''|''Pentecoste'']]
+!! result
+<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
+</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
+</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
+</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
</p>
!! end
@@ -1526,7 +1634,7 @@ Piped link to URL
!! input
Piped link to URL: [[http://www.example.com|an example URL]]
!! result
-<p>Piped link to URL: [<a href="http://www.example.com|an" class="external text" rel="nofollow">example URL</a>]
+<p>Piped link to URL: [<a href="http://www.example.com%7Can" class="external text" rel="nofollow">example URL</a>]
</p>
!! end
@@ -1585,7 +1693,7 @@ title=[[0]]
!!input
[[00]]
!!result
-<p><a href="/wiki/00" title="00">00</a>
+<p><a href="/wiki/00">00</a>
</p>
!!end
@@ -1617,7 +1725,7 @@ Inline interwiki link
!! input
[[MeatBall:SoftSecurity]]
!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity</a>
+<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw">MeatBall:SoftSecurity</a>
</p>
!! end
@@ -1626,7 +1734,7 @@ Inline interwiki link with empty title (bug 2372)
!! input
[[MeatBall:]]
!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?" class="extiw" title="meatball:">MeatBall:</a>
+<p><a href="http://www.usemod.com/cgi-bin/mb.pl?" class="extiw">MeatBall:</a>
</p>
!! end
@@ -1982,15 +2090,6 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
!! end
!! test
-Magic Word: {{NUMBEROFARTICLES}}
-!! input
-{{NUMBEROFARTICLES}}
-!! result
-<p>2
-</p>
-!! end
-
-!! test
Magic Word: {{NUMBEROFFILES}}
!! input
{{NUMBEROFFILES}}
@@ -2044,7 +2143,7 @@ Magic Word: {{SERVER}}
!! input
{{SERVER}}
!! result
-<p><a href="http://localhost" class="external free" rel="nofollow">http://localhost</a>
+<p><a href="http://Britney-Spears" class="external free" rel="nofollow">http://Britney-Spears</a>
</p>
!! end
@@ -2177,6 +2276,21 @@ language=de
!! end
+!! test
+Urlencode
+!! input
+{{urlencode:hi world?!}}
+{{urlencode:hi world?!|WIKI}}
+{{urlencode:hi world?!|PATH}}
+{{urlencode:hi world?!|QUERY}}
+!! result
+<p>hi+world%3F%21
+hi_world%3F!
+hi%20world%3F%21
+hi+world%3F%21
+</p>
+!! end
+
###
### Magic links
###
@@ -2494,7 +2608,7 @@ Template as link source
!! input
[[{{linktest2}}]]
!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+<p><a href="/wiki/Main_Page">Main Page</a>
</p>
!! end
@@ -2516,7 +2630,7 @@ Template infinite loop
!! input
{{loop1}}
!! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
+<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1">Template:Loop1</a></span>
</p>
!! end
@@ -2548,10 +2662,12 @@ foo {{table}}
</p>
<table>
<tr>
-<td> 1 </td><td> 2
+<td> 1 </td>
+<td> 2
</td></tr>
<tr>
-<td> 3 </td><td> 4
+<td> 3 </td>
+<td> 4
</td></tr></table>
!! end
@@ -2566,10 +2682,12 @@ foo
</p>
<table>
<tr>
-<td> 1 </td><td> 2
+<td> 1 </td>
+<td> 2
</td></tr>
<tr>
-<td> 3 </td><td> 4
+<td> 3 </td>
+<td> 4
</td></tr></table>
!! end
@@ -2588,7 +2706,7 @@ BUG 41: Template parameters shown as broken links
Template:MSGNW test
!! text
''None'' of '''this''' should be
-* interepreted
+* interpreted
but rather passed unmodified
{{test}}
!! endarticle
@@ -2602,7 +2720,7 @@ disabled
{{msgnw:MSGNW test}}
!! result
<p>''None'' of '''this''' should be
-* interepreted
+* interpreted
but rather passed unmodified
{{test}}
</p>
@@ -3167,6 +3285,16 @@ Special:RecentChanges
!! end
!! test
+{{#special:}} page name with subpage, known
+!! options
+msg
+!! input
+{{#special:Recentchanges/param}}
+!! result
+Special:RecentChanges/param
+!! end
+
+!! test
{{#special:}} page name, unknown
!! options
msg
@@ -3260,14 +3388,21 @@ Image with link parameter (URL target) and unnamed parameter
</p>
!! end
+!! test
+Thumbnail image with link parameter
+!! input
+[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! end
!! test
Image with frame and link
!! input
[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page">Main Page</a></div></div></div>
!! end
@@ -3276,7 +3411,7 @@ Image with frame and link and explicit alt
!! input
[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page">Main Page</a></div></div></div>
!! end
@@ -3486,6 +3621,32 @@ Bug 3090: External links other than http: in image captions
!! end
+!! article
+File:Barfoo.jpg
+!! text
+#REDIRECT [[File:Barfoo.jpg]]
+!! endarticle
+
+!! test
+Redirected image
+!! input
+[[Image:Barfoo.jpg]]
+!! result
+<p><a href="/wiki/File:Barfoo.jpg">File:Barfoo.jpg</a>
+</p>
+!! end
+
+!! test
+Missing image with uploads disabled
+!! options
+wgEnableUploads=0
+!! input
+[[Image:Foobaz.jpg]]
+!! result
+<p><a href="/wiki/File:Foobaz.jpg">File:Foobaz.jpg</a>
+</p>
+!! end
+
###
### Subpages
@@ -3552,7 +3713,7 @@ Link to category
!! input
[[:Category:MediaWiki User's Guide]]
!! result
-<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
+<p><a href="/wiki/Category:MediaWiki_User%27s_Guide">Category:MediaWiki User's Guide</a>
</p>
!! end
@@ -3648,7 +3809,7 @@ Some text
</ul>
</li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
@@ -3703,7 +3864,7 @@ Handling of sections up to level 6 and beyond
</ul>
</li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
@@ -3745,7 +3906,7 @@ TOC regression (bug 9764)
</ul>
</li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
@@ -3781,7 +3942,7 @@ wgMaxTocLevel=3
</ul>
</li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
@@ -3792,6 +3953,36 @@ wgMaxTocLevel=3
!! end
!! test
+TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
+!! options
+wgMaxTocLevel=3
+!! input
+==Section 1==
+===Section 1.1===
+====Section 1.1.1====
+====Section 1.1.1.1====
+==Section 2==
+!! result
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#Section_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Section 1.1</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+
+!! end
+
+
+!! test
Resolving duplicate section names
!! input
== Foo bar ==
@@ -3873,7 +4064,7 @@ __TOC__
</li>
<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
@@ -3890,6 +4081,71 @@ http://example.com [[Image:foobar.jpg]]
!!end
!! test
+Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
+!! input
+===
+The line above must have a trailing space!
+=== <!--
+--> <!-- -->
+But just in case it doesn't...
+!! result
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
+<p>The line above must have a trailing space!
+</p>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
+<p>But just in case it doesn't...
+</p>
+!! end
+
+!! test
+Header with special characters (bug 25462)
+!! input
+The tooltips shall not show entities to the user (ie. be double escaped)
+
+== text > text ==
+section 1
+
+== text < text ==
+section 2
+
+== text & text ==
+section 3
+
+== text ' text ==
+section 4
+
+== text " text ==
+section 5
+!! result
+<p>The tooltips shall not show entities to the user (ie. be double escaped)
+</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#text_.26_text"><span class="tocnumber">3</span> <span class="toctext">text &amp; text</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
+<p>section 1
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
+<p>section 2
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
+<p>section 3
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
+<p>section 4
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
+<p>section 5
+</p>
+!! end
+
+!! test
BUG 1219 URL next to image (broken)
!! input
http://example.com[[Image:foobar.jpg]]
@@ -4104,6 +4360,31 @@ Character reference normalization in link text (bug 1938)
</p>
!!end
+!! article
+×Ö·
+!! text
+Test for unicode normalization
+
+The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
+!! endarticle
+
+!! test
+(bug 19451) Links should refer to the normalized form.
+!! input
+[[&#xFB2E;]]
+[[&#x5d0;&#x5b7;]]
+[[&#x5d0;Ö·]]
+[[×&#x5b7;]]
+[[×Ö·]]
+!! result
+<p><a href="/wiki/%D7%90%D6%B7" title="×Ö·">&#xfb2e;</a>
+<a href="/wiki/%D7%90%D6%B7" title="×Ö·">&#x5d0;&#x5b7;</a>
+<a href="/wiki/%D7%90%D6%B7" title="×Ö·">&#x5d0;Ö·</a>
+<a href="/wiki/%D7%90%D6%B7" title="×Ö·">×&#x5b7;</a>
+<a href="/wiki/%D7%90%D6%B7">×Ö·</a>
+</p>
+!! end
+
!! test
Empty attribute crash test (bug 2067)
!! input
@@ -4163,7 +4444,7 @@ Bug 2095: link with three closing brackets
!! input
[[Main Page]]]
!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
+<p><a href="/wiki/Main_Page">Main Page</a>]
</p>
!! end
@@ -4771,7 +5052,7 @@ disabled
!! input
<br id=9 />
!! result
-Something, but defenetly not <br id="9" />...
+Something, but definitely not <br id="9" />...
!! end
!! test
@@ -4825,7 +5106,7 @@ Punctuation: nbsp before exclamation
!! input
C'est grave !
!! result
-<p>C'est grave&nbsp;!
+<p>C'est grave&#160;!
</p>
!! end
@@ -5074,7 +5355,7 @@ http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2><
<ul>
<li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
!! end
@@ -5102,7 +5383,10 @@ noxml
!! result
<table>
<tr>
-<th>https://</th><th></th><th></th><th>
+<th>https://</th>
+<th></th>
+<th></th>
+<th>
</td>
</tr>
</table>
@@ -5119,7 +5403,8 @@ Fuzz testing: Parser21
<table>
<tr>
<th> <a href="irc://{{ftp://a" class="external free" rel="nofollow">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
-</th><td>
+</th>
+<td>
</td>
</tr>
</table>
@@ -5350,7 +5635,7 @@ Special page transclusion
!! result
<p><br />
</p>
-<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx">Xyzzyx</a></td></tr></table>
!! end
@@ -5363,10 +5648,10 @@ Special page transclusion twice (bug 5021)
!! result
<p><br />
</p>
-<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx">Xyzzyx</a></td></tr></table>
<p><br />
</p>
-<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx">Xyzzyx</a></td></tr></table>
!! end
@@ -5811,6 +6096,22 @@ section=1
==marked==
!!end
+# Test behaviour of bug 19910
+!! test
+Sectiion with all-equals
+!! options
+section=2
+!! input
+===
+The line above must have a trailing space
+=== <!--
+--> <!-- -->
+But just in case it doesn't...
+!! result
+=== <!--
+--> <!-- -->
+But just in case it doesn't...
+!! end
!! test
Section replacement test (section 0)
@@ -6245,7 +6546,7 @@ Special:Search page linking.
!! input
{{Special:search}}
!! result
-<p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
+<p><a href="/wiki/Special:Search">Special:Search</a>
</p>
!! end
@@ -6306,48 +6607,129 @@ image4 |300px| centre
* image6
</gallery>
!! result
-<table class="gallery" cellspacing="0" cellpadding="0">
- <tr>
- <td><div class="gallerybox" style="width: 155px;">
- <div style="height: 152px;">Image1.png</div>
+<ul class="gallery">
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Image1.png</div>
<div class="gallerytext">
</div>
- </div></td>
- <td><div class="gallerybox" style="width: 155px;">
- <div style="height: 152px;">Image2.gif</div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Image2.gif</div>
<div class="gallerytext">
<p>||||
</p>
</div>
- </div></td>
- <td><div class="gallerybox" style="width: 155px;">
- <div style="height: 152px;">Image3</div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Image3</div>
<div class="gallerytext">
</div>
- </div></td>
- <td><div class="gallerybox" style="width: 155px;">
- <div style="height: 152px;">Image4</div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Image4</div>
<div class="gallerytext">
<p>300px| centre
</p>
</div>
- </div></td>
- </tr>
- <tr>
- <td><div class="gallerybox" style="width: 155px;">
- <div style="height: 152px;">Image5.svg</div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Image5.svg</div>
<div class="gallerytext">
<p><a href="http://///////" class="external free" rel="nofollow">http://///////</a>
</p>
</div>
- </div></td>
- <td><div class="gallerybox" style="width: 155px;">
- <div style="height: 152px;">* image6</div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">* image6</div>
<div class="gallerytext">
</div>
- </div></td>
- </tr>
-</table>
+ </div></li>
+</ul>
+
+!! end
+
+!! test
+Gallery (with options)
+!! input
+<gallery widths='60px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
+File:Nonexistant.jpg|caption
+File:Nonexistant.jpg
+image:foobar.jpg|some '''caption''' [[Main Page]]
+image:foobar.jpg
+</gallery>
+!! result
+<ul class="gallery" style="max-width: 206px;_width: 206px;">
+ <li class='gallerycaption'>Foo <a href="/wiki/Main_Page">Main Page</a></li>
+ <li class="gallerybox" style="width: 95px"><div style="width: 95px">
+ <div style="height: 70px;">Nonexistant.jpg</div>
+ <div class="gallerytext">
+<p>caption
+</p>
+ </div>
+ </div></li>
+ <li class="gallerybox" style="width: 95px"><div style="width: 95px">
+ <div style="height: 70px;">Nonexistant.jpg</div>
+ <div class="gallerytext">
+ </div>
+ </div></li>
+ <li class="gallerybox" style="width: 95px"><div style="width: 95px">
+ <div class="thumb" style="width: 90px; height: 70px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="60" height="7" /></a></div></div>
+ <div class="gallerytext">
+<p>some <b>caption</b> <a href="/wiki/Main_Page">Main Page</a>
+</p>
+ </div>
+ </div></li>
+ <li class="gallerybox" style="width: 95px"><div style="width: 95px">
+ <div class="thumb" style="width: 90px; height: 70px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="60" height="7" /></a></div></div>
+ <div class="gallerytext">
+ </div>
+ </div></li>
+</ul>
+
+!! end
+
+!! test
+gallery (with showfilename option)
+!! input
+<gallery showfilename>
+File:Nonexistant.jpg|caption
+File:Nonexistant.jpg
+image:foobar.jpg|some '''caption''' [[Main Page]]
+File:Foobar.jpg
+</gallery>
+!! result
+<ul class="gallery">
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Nonexistant.jpg</div>
+ <div class="gallerytext">
+<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
+caption
+</p>
+ </div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div style="height: 150px;">Nonexistant.jpg</div>
+ <div class="gallerytext">
+<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
+</p>
+ </div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div class="thumb" style="width: 150px; height: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+ <div class="gallerytext">
+<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+some <b>caption</b> <a href="/wiki/Main_Page">Main Page</a>
+</p>
+ </div>
+ </div></li>
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div class="thumb" style="width: 150px; height: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+ <div class="gallerytext">
+<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+</p>
+ </div>
+ </div></li>
+</ul>
!! end
@@ -6398,6 +6780,15 @@ ISBN ISBN 1234567890
!! end
!! test
+Bug 22905: <abbr> followed by ISBN followed by </a>
+!! input
+<abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
+!! result
+<p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a href="http://www.example.com" class="external text" rel="nofollow">example.com</a>
+</p>
+!! end
+
+!! test
Double RFC
!! input
RFC RFC 1234
@@ -6511,12 +6902,10 @@ disabled
# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
!! test
Images with the "|" character in the comment
-!! options
-disabled
!! input
[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="An external URL" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a href="http://test/?param1=|left|&amp;param2=|x" class="external text" rel="nofollow">external</a> URL</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx" class="external text" rel="nofollow">external</a> URL</div></div></div>
!!end
@@ -6568,12 +6957,14 @@ subpage title=[[Subpage test/L1/L2/L3]]
!! test
Parents of subpages, two levels up
!! options
-disabled
subpage title=[[Subpage test/L1/L2/L3]]
!! input
[[../../|L1]]2
+
+[[../../|L1]]l
!! result
-<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>
+<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
+</p><p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
</p>
!! end
@@ -6606,8 +6997,8 @@ Definition list code coverage
; title : def
;title: def
!! result
-<dl><dt> title &nbsp;</dt><dd> def
-</dd><dt> title&nbsp;</dt><dd> def
+<dl><dt> title &#160;</dt><dd> def
+</dd><dt> title&#160;</dt><dd> def
</dd><dt>title</dt><dd> def
</dd></dl>
@@ -6703,7 +7094,7 @@ Out-of-order TOC heading levels
</ul>
</li>
</ul>
-</td></tr></table><script>if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+</td></tr></table>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
@@ -6782,6 +7173,67 @@ anchorencode
</p>
!! end
+!! test
+anchorencode trims spaces
+!! input
+{{anchorencode: __pretty__please__}}
+!! result
+<p>pretty_please
+</p>
+!! end
+
+!! test
+anchorencode deals with links
+!! input
+{{anchorencode: [[hello|world]] [[hi]]}}
+!! result
+<p>world_hi
+</p>
+!! end
+
+!! test
+anchorencode deals with templates
+!! input
+{{anchorencode: {{Foo}} }}
+!! result
+<p>FOO
+</p>
+!! end
+
+!! test
+anchorencode encodes like the TOC generator: (bug 18431)
+!! input
+=== _ +:.3A%3A&&amp;]] ===
+{{anchorencode: _ +:.3A%3A&&amp;]] }}
+__NOEDITSECTION__
+!! result
+<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
+<p>.2B:.3A.253A.26.26.5D.5D
+</p>
+!! end
+
+# Expected output in the following test is not necessarily expected (there
+# should probably be <p> tags inside the <blockquote> in the output) -- it's
+# only testing for well-formedness.
+!! test
+Bug 6200: blockquotes and paragraph formatting
+!! input
+<blockquote>
+foo
+</blockquote>
+
+bar
+
+ baz
+!! result
+<blockquote>
+foo
+</blockquote>
+<p>bar
+</p>
+<pre>baz
+</pre>
+!! end
!! test
Bug 8293: Use of center tag ruins paragraph formatting
@@ -6839,7 +7291,7 @@ language=sr
!! input
[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
+<p><a href="/wiki/Main_Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
</p>
!!end
@@ -6934,7 +7386,7 @@ language=sr variant=sr-ec
!! input
-{[[Main Page]]}-
!! result
-<p><a href="/index.php?title=Main_Page&amp;variant=sr-ec" title="Main Page">Main Page</a>
+<p><a href="/wiki/Main_Page">Main Page</a>
</p>
!! end
@@ -7115,10 +7567,12 @@ y
</p>
<table>
<tr>
-<td> 1 </td><td> 2
+<td> 1 </td>
+<td> 2
</td></tr>
<tr>
-<td> 3 </td><td> 4
+<td> 3 </td>
+<td> 4
</td></tr></table>
<p>y
</p>
@@ -7284,6 +7738,20 @@ Line two
!! end
+!! test
+Nesting tags, paragraphs on lines which begin with <div>
+!! options
+disabled
+!! input
+<div></div><strong>A
+B</strong>
+!! result
+<div></div>
+<p><strong>A
+B</strong>
+</p>
+!! end
+
# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
!! test
Bug 6200: paragraphs inside blockquotes (no extra line breaks)
@@ -7420,9 +7888,9 @@ wgLinkHolderBatchSize=0
[[meatball:2]]
[[meatball:3]]
!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
+<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw">meatball:1</a>
+<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw">meatball:2</a>
+<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw">meatball:3</a>
</p>
!! end
@@ -7539,7 +8007,7 @@ comment
!! input
I like the [[Main Page]] a lot
!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
+I like the <a href="/wiki/Main_Page">Main Page</a> a lot
!!end
!! test
@@ -7640,11 +8108,16 @@ title=[[Main Page]]
<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
!! end
-!!article
-MediaWiki:bad image list
-!!text
-* [[File:Bad.jpg]] except [[Nasty page]]
-!!endarticle
+!! test
+Space normalisation on autocomment (bug 22784)
+!! options
+comment
+title=[[Main Page]]
+!!input
+/* __hello__world__ */
+!! result
+<span class="autocomment"><a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>__hello__world__</span>
+!! end
!! test
Bad images - basic functionality
@@ -7762,6 +8235,75 @@ Screen
<p>this is not the the title
</p>
!! end
+
+!! test
+preload: check <noinclude> and <includeonly>
+!! options
+preload
+!! input
+Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
+!! result
+Hello kind world.
+!! end
+
+!! test
+preload: check <onlyinclude>
+!! options
+preload
+!! input
+Goodbye <onlyinclude>Hello world</onlyinclude>
+!! result
+Hello world
+!! end
+
+!! test
+preload: can pass tags through if we want to
+!! options
+preload
+!! input
+<includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
+!! result
+<includeonly>Hello world</includeonly>
+!! end
+
+!! test
+preload: check that it doesn't try to do tricks
+!! options
+preload
+!! input
+* <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
+!! result
+* <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
+!! end
+
+!! test
+Play a bit with r67090 and bug 3158
+!! options
+disabled
+!! input
+<div style="width:50% !important">&nbsp;</div>
+<div style="width:50%&nbsp;!important">&nbsp;</div>
+<div style="width:50%&#160;!important">&nbsp;</div>
+<div style="border : solid;">&nbsp;</div>
+!! result
+<div style="width:50% !important">&nbsp;</div>
+<div style="width:50% !important">&nbsp;</div>
+<div style="width:50% !important">&nbsp;</div>
+<div style="border&#160;: solid;">&nbsp;</div>
+
+!! end
+
+!! test
+HTML5 data attributes
+!! input
+<span data-foo="bar">Baz</span>
+<p data-abc-def_hij="">Quuz</p>
+!! result
+<p><span data-foo="bar">Baz</span>
+</p>
+<p data-abc-def_hij="">Quuz</p>
+
+!! end
TODO:
diff --git a/maintenance/tests/parser/parserTestsParserHook.php b/maintenance/tests/parser/parserTestsParserHook.php
new file mode 100644
index 00000000..6387208a
--- /dev/null
+++ b/maintenance/tests/parser/parserTestsParserHook.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * A basic extension that's used by the parser tests to test whether input and
+ * arguments are passed to extensions properly.
+ *
+ * Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
+ *
+ * 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 Maintenance
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ */
+
+class ParserTestParserHook {
+
+ static function setup( &$parser ) {
+ $parser->setHook( 'tag', array( __CLASS__, 'hook' ) );
+
+ return true;
+ }
+
+ static function hook( $in, $argv ) {
+ ob_start();
+ var_dump(
+ $in,
+ $argv
+ );
+ $ret = ob_get_clean();
+
+ return "<pre>\n$ret</pre>";
+ }
+}
diff --git a/maintenance/tests/parser/parserTestsStaticParserHook.php b/maintenance/tests/parser/parserTestsStaticParserHook.php
new file mode 100644
index 00000000..72f82276
--- /dev/null
+++ b/maintenance/tests/parser/parserTestsStaticParserHook.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * A basic extension that's used by the parser tests to test whether the parser
+ * calls extensions when they're called inside comments, it shouldn't do that
+ *
+ * Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
+ *
+ * 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 Maintenance
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ */
+
+class ParserTestStaticParserHook {
+ static function setup( &$parser ) {
+ $parser->setHook( 'statictag', array( __CLASS__, 'hook' ) );
+
+ return true;
+ }
+
+ static function hook( $in, $argv, $parser ) {
+ if ( ! count( $argv ) ) {
+ $parser->static_tag_buf = $in;
+ return '';
+ } else if ( count( $argv ) === 1 && isset( $argv['action'] )
+ && $argv['action'] === 'flush' && $in === null )
+ {
+ // Clear the buffer, we probably don't need to
+ if ( isset( $parser->static_tag_buf ) ) {
+ $tmp = $parser->static_tag_buf;
+ } else {
+ $tmp = '';
+ }
+ $parser->static_tag_buf = null;
+ return $tmp;
+ } else
+ // wtf?
+ return
+ "\nCall this extension as <statictag>string</statictag> or as" .
+ " <statictag action=flush/>, not in any other way.\n" .
+ "text: " . var_export( $in, true ) . "\n" .
+ "argv: " . var_export( $argv, true ) . "\n";
+ }
+}
diff --git a/maintenance/parserTests.php b/maintenance/tests/parserTests.php
index 78530716..7793e6b8 100644
--- a/maintenance/parserTests.php
+++ b/maintenance/tests/parserTests.php
@@ -1,32 +1,36 @@
<?php
-# Copyright (C) 2004 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
/**
+ * MediaWiki parser test suite
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Maintenance
*/
-/** */
-require('parserTests.inc');
+$options = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
+$optionsWithArgs = array( 'regex', 'seed', 'setversion' );
+
+require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
-if( isset( $options['help'] ) ) {
- echo <<<ENDS
+if ( isset( $options['help'] ) ) {
+ echo <<<ENDS
MediaWiki $wgVersion parser test suite
Usage: php parserTests.php [options...]
@@ -35,13 +39,13 @@ Options:
--quiet Suppress notification of passed tests (shows only failed tests)
--show-output Show expected and actual output
--color[=yes|no] Override terminal detection and force color output on or off
- use wgCommandLineDarkBg = true; if your term is dark
+ use wgCommandLineDarkBg = true; if your term is dark
--regex Only run tests whose descriptions which match given regex
--file=<testfile> Run test cases from a custom file instead of parserTests.txt
--record Record tests in database
--compare Compare with recorded results, without updating the database.
--setversion When using --record, set the version string to use (useful
- with git-svn so that you can get the exact revision)
+ with git-svn so that you can get the exact revision)
--keep-uploads Re-use the same upload directory for each test, don't delete it
--fuzz Do a fuzz test instead of a normal test
--seed <n> Start the fuzz test from the specified seed
@@ -50,7 +54,7 @@ Options:
--upload Upload test results to remote wiki (per \$wgParserTestRemote)
ENDS;
- exit( 0 );
+ exit( 0 );
}
# Cases of weird db corruption were encountered when running tests on earlyish
@@ -67,9 +71,9 @@ if ( $wgDBtype == 'sqlite' ) {
# refer to $wgTitle directly, but instead use the title
# passed to it.
$wgTitle = Title::newFromText( 'Parser test script do not use' );
-$tester = new ParserTest();
+$tester = new ParserTest($options);
-if( isset( $options['file'] ) ) {
+if ( isset( $options['file'] ) ) {
$files = array( $options['file'] );
} else {
// Default parser tests and any set from extensions or local config
@@ -84,5 +88,5 @@ if ( isset( $options['fuzz'] ) ) {
$tester->fuzzTest( $files );
} else {
$ok = $tester->runTestsFromFiles( $files );
- exit ($ok ? 0 : 1);
+ exit ( $ok ? 0 : 1 );
}
diff --git a/maintenance/tests/phpunit.xml b/maintenance/tests/phpunit.xml
deleted file mode 100644
index ce7d44f5..00000000
--- a/maintenance/tests/phpunit.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- See http://www.phpunit.de/manual/3.3/en/appendixes.configuration.html -->
-<phpunit bootstrap="./bootstrap.php"
- colors="false"
- stopOnFailure="false">
- <!-- convertErrorsToExceptions="true" -->
- <!-- convertNoticesToExceptions="true" -->
- <!-- convertWarningsToExceptions="true" -->
- <testsuite name="MediaWiki Test Suite">
- <directory>.</directory>
- </testsuite>
- <groups>
- <exclude>
- <group>Broken</group>
- <group>Stub</group>
- </exclude>
- </groups>
-</phpunit> \ No newline at end of file
diff --git a/maintenance/tests/selenium/Selenium.php b/maintenance/tests/selenium/Selenium.php
new file mode 100644
index 00000000..ecf7f9ec
--- /dev/null
+++ b/maintenance/tests/selenium/Selenium.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * Selenium connector
+ * This is implemented as a singleton.
+ */
+
+require( 'Testing/Selenium.php' );
+
+class Selenium {
+ protected static $_instance = null;
+
+ public $isStarted = false;
+ public $tester;
+
+ protected $port;
+ protected $host;
+ protected $browser;
+ protected $browsers;
+ protected $logger;
+ protected $user;
+ protected $pass;
+ protected $timeout = 30000;
+ protected $verbose;
+ protected $junitlogfile; //processed by phpUnderControl
+ protected $runagainstgrid = false;
+
+ /**
+ * @todo this shouldn't have to be static
+ */
+ static protected $url;
+
+ /**
+ * Override parent
+ */
+ public function __construct() {
+ /**
+ * @todo this is an ugly hack to make information available to
+ * other tests. It should be fixed.
+ */
+ if ( null === self::$_instance ) {
+ self::$_instance = $this;
+ } else {
+ throw new MWException( "Already have one Selenium instance." );
+ }
+ }
+
+ public function start() {
+ $this->tester = new Testing_Selenium( $this->browser, self::$url, $this->host,
+ $this->port, $this->timeout );
+ if ( method_exists( $this->tester, "setVerbose" ) ) $this->tester->setVerbose( $this->verbose );
+
+ $this->tester->start();
+ $this->isStarted = true;
+ }
+
+ public function stop() {
+ $this->tester->stop();
+ $this->tester = null;
+ $this->isStarted = false;
+ }
+
+ public function login() {
+ if ( strlen( $this->user ) == 0 ) {
+ return;
+ }
+ $this->open( self::$url . '/index.php?title=Special:Userlogin' );
+ $this->type( 'wpName1', $this->user );
+ $this->type( 'wpPassword1', $this->pass );
+ $this->click( "//input[@id='wpLoginAttempt']" );
+ $this->waitForPageToLoad( 10000 );
+
+ // after login we redirect to the main page. So check whether the "Prefernces" top menu item exists
+ $value = $this->isElementPresent( "//li[@id='pt-preferences']" );
+
+ if ( $value != true ) {
+ throw new Testing_Selenium_Exception( "Login Failed" );
+ }
+
+ }
+
+ public static function getInstance() {
+ if ( null === self::$_instance ) {
+ throw new MWException( "No instance set yet" );
+ }
+
+ return self::$_instance;
+ }
+
+ public function loadPage( $title, $action ) {
+ $this->open( self::$url . '/index.php?title=' . $title . '&action=' . $action );
+ }
+
+ public function setLogger( $logger ) {
+ $this->logger = $logger;
+ }
+
+ public function getLogger( ) {
+ return $this->logger;
+ }
+
+ public function log( $message ) {
+ $this->logger->write( $message );
+ }
+
+ public function setUrl( $url ) {
+ self::$url = $url;
+ }
+
+ static public function getUrl() {
+ return self::$url;
+ }
+
+ public function setPort( $port ) {
+ $this->port = $port;
+ }
+
+ public function getPort() {
+ return $this->port;
+ }
+
+ public function setUser( $user ) {
+ $this->user = $user;
+ }
+
+ // Function to get username
+ public function getUser() {
+ return $this->user;
+ }
+
+
+ public function setPass( $pass ) {
+ $this->pass = $pass;
+ }
+
+ //add function to get password
+ public function getPass( ) {
+ return $this->pass;
+ }
+
+
+ public function setHost( $host ) {
+ $this->host = $host;
+ }
+
+ public function setVerbose( $verbose ) {
+ $this->verbose = $verbose;
+ }
+
+ public function setAvailableBrowsers( $availableBrowsers ) {
+ $this->browsers = $availableBrowsers;
+ }
+
+ public function setJUnitLogfile( $junitlogfile ) {
+ $this->junitlogfile = $junitlogfile;
+ }
+
+ public function getJUnitLogfile( ) {
+ return $this->junitlogfile;
+ }
+
+ public function setRunAgainstGrid( $runagainstgrid ) {
+ $this->runagainstgrid = $runagainstgrid;
+ }
+
+ public function setBrowser( $b ) {
+ if ($this->runagainstgrid) {
+ $this->browser = $b;
+ return true;
+ }
+ if ( !isset( $this->browsers[$b] ) ) {
+ throw new MWException( "Invalid Browser: $b.\n" );
+ }
+
+ $this->browser = $this->browsers[$b];
+ }
+
+ public function getAvailableBrowsers() {
+ return $this->browsers;
+ }
+
+ public function __call( $name, $args ) {
+ $t = call_user_func_array( array( $this->tester, $name ), $args );
+ return $t;
+ }
+
+ // Prevent external cloning
+ protected function __clone() { }
+ // Prevent external construction
+ // protected function __construct() {}
+}
diff --git a/maintenance/tests/selenium/SeleniumConfig.php b/maintenance/tests/selenium/SeleniumConfig.php
new file mode 100644
index 00000000..ca69b1f0
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumConfig.php
@@ -0,0 +1,88 @@
+<?php
+if ( !defined( 'SELENIUMTEST' ) ) {
+ die( 1 );
+}
+
+class SeleniumConfig {
+
+ /*
+ * Retreives the Selenium configuration values from an ini file.
+ * See sample config file in selenium_settings.ini.sample
+ *
+ */
+
+ public static function getSeleniumSettings ( &$seleniumSettings,
+ &$seleniumBrowsers,
+ &$seleniumTestSuites,
+ $seleniumConfigFile = null ) {
+ if ( strlen( $seleniumConfigFile ) == 0 ) {
+ global $wgSeleniumConfigFile;
+ if ( isset( $wgSeleniumConfigFile ) ) $seleniumConfigFile = $wgSeleniumConfigFile ;
+ }
+
+ if ( strlen( $seleniumConfigFile ) == 0 || !file_exists( $seleniumConfigFile ) ) {
+ 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 );
+ }
+ if ( $configArray === false ) {
+ throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
+ }
+
+ if ( array_key_exists( 'SeleniumSettings', $configArray) ) {
+ wfSuppressWarnings();
+ //we may need to change how this is set. But for now leave it in the ini file
+ $seleniumBrowsers = $configArray['SeleniumSettings']['browsers'];
+
+ $seleniumSettings['host'] = $configArray['SeleniumSettings']['host'];
+ $seleniumSettings['port'] = $configArray['SeleniumSettings']['port'];
+ $seleniumSettings['wikiUrl'] = $configArray['SeleniumSettings']['wikiUrl'];
+ $seleniumSettings['username'] = $configArray['SeleniumSettings']['username'];
+ $seleniumSettings['userPassword'] = $configArray['SeleniumSettings']['userPassword'];
+ $seleniumSettings['testBrowser'] = $configArray['SeleniumSettings']['testBrowser'];
+ $seleniumSettings['startserver'] = $configArray['SeleniumSettings']['startserver'];
+ $seleniumSettings['stopserver'] = $configArray['SeleniumSettings']['stopserver'];
+ $seleniumSettings['seleniumserverexecpath'] = $configArray['SeleniumSettings']['seleniumserverexecpath'];
+ $seleniumSettings['jUnitLogFile'] = $configArray['SeleniumSettings']['jUnitLogFile'];
+ $seleniumSettings['runAgainstGrid'] = $configArray['SeleniumSettings']['runAgainstGrid'];
+
+ wfRestoreWarnings();
+ }
+ if ( array_key_exists( 'SeleniumTests', $configArray) ) {
+ wfSuppressWarnings();
+ $seleniumTestSuites = $configArray['SeleniumTests']['testSuite'];
+ wfRestoreWarnings();
+ }
+ return true;
+ }
+
+ private static function parse_5_2_ini_file ( $ConfigFile ) {
+
+ $configArray = parse_ini_file( $ConfigFile, true );
+ if ( $configArray === false ) return false;
+
+ // PHP 5.2 ini files have [browsers] and [testSuite] sections
+ // to get around lack of support for array keys. It then
+ // inserts the section arrays into the appropriate places in
+ // the SeleniumSettings and SeleniumTests arrays.
+
+ if ( isset( $configArray['browsers'] ) ) {
+ $configArray['SeleniumSettings']['browsers'] = $configArray['browsers'];
+ unset ( $configArray['browsers'] );
+ }
+
+ if ( isset( $configArray['testSuite'] ) ) {
+ $configArray['SeleniumTests']['testSuite'] = $configArray['testSuite'];
+ unset ( $configArray['testSuite'] );
+ }
+
+ return $configArray;
+
+ }
+
+}
diff --git a/maintenance/tests/selenium/SeleniumLoader.php b/maintenance/tests/selenium/SeleniumLoader.php
new file mode 100644
index 00000000..8d5e7713
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumLoader.php
@@ -0,0 +1,9 @@
+<?php
+
+class SeleniumLoader {
+ static function load() {
+ require_once( 'Testing/Selenium.php' );
+ require_once( 'PHPUnit/Framework.php' );
+ require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
+ }
+}
diff --git a/maintenance/tests/selenium/SeleniumServerManager.php b/maintenance/tests/selenium/SeleniumServerManager.php
new file mode 100644
index 00000000..ae5ea682
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumServerManager.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ */
+
+class SeleniumServerManager {
+ private $SeleniumStartServer = false;
+ private $OS = '';
+ private $SeleniumServerPid = 'NaN';
+ private $SeleniumServerPort = 4444;
+ private $SeleniumServerStartTimeout = 10; // 10 secs.
+ private $SeleniumServerExecPath;
+
+ public function __construct( $startServer,
+ $serverPort,
+ $serverExecPath ) {
+ $this->OS = (string) PHP_OS;
+ if ( isset( $startServer ) )
+ $this->SeleniumStartServer = $startServer;
+ if ( isset( $serverPort ) )
+ $this->SeleniumServerPort = $serverPort;
+ if ( isset( $serverExecPath ) )
+ $this->SeleniumServerExecPath = $serverExecPath;
+ return;
+ }
+
+ // Getters for certain private attributes. No setters, since they
+ // should not change after the manager object is created.
+
+ public function getSeleniumStartServer() {
+ return $this->SeleniumStartServer;
+ }
+
+ public function getSeleniumServerPort() {
+ return $this->SeleniumServerPort;
+ }
+
+ public function getSeleniumServerPid() {
+ return $this->SeleniumServerPid;
+ }
+
+ // Changing value of SeleniumStartServer allows starting server after
+ // creation of the class instance. Only allow setting SeleniumStartServer
+ // to true, since after server is started, it is shut down by stop().
+
+ public function setSeleniumStartServer( $startServer ) {
+ if ( $startServer == true ) $this->SeleniumStartServer = true;
+ }
+
+ // return values are: 1) started - server started, 2) failed -
+ // server not started, 3) running - instructed to start server, but
+ // server already running
+
+ public function start() {
+
+ if ( !$this->SeleniumStartServer ) return 'failed';
+
+ // commented out cases are untested
+
+ switch ( $this->OS ) {
+ case "Linux":
+# case' CYGWIN_NT-5.1':
+ case 'Darwin':
+# case 'FreeBSD':
+# case 'HP-UX':
+# case 'IRIX64':
+# case 'NetBSD':
+# case 'OpenBSD':
+# case 'SunOS':
+# case 'Unix':
+ // *nix based OS
+ return $this->startServerOnUnix();
+ break;
+ case "Windows":
+ case "WIN32":
+ case "WINNT":
+ // Windows
+ return $this->startServerOnWindows();
+ break;
+ default:
+ // An untested OS
+ return 'failed';
+ break;
+ }
+ }
+
+ public function stop() {
+
+ // commented out cases are untested
+
+ switch ( $this->OS ) {
+ case "Linux":
+# case' CYGWIN_NT-5.1':
+ case 'Darwin':
+# case 'FreeBSD':
+# case 'HP-UX':
+# case 'IRIX64':
+# case 'NetBSD':
+# case 'OpenBSD':
+# case 'SunOS':
+# case 'Unix':
+ // *nix based OS
+ return $this->stopServerOnUnix();
+ break;
+ case "Windows":
+ case "WIN32":
+ case "WINNT":
+ // Windows
+ return $this->stopServerOnWindows();
+ break;
+ default:
+ // An untested OS
+ return 'failed';
+ break;
+ }
+ }
+
+ private function startServerOnUnix() {
+
+ $output = array();
+ $user = $_ENV['USER'];
+ // @fixme this should be a little more generalized :)
+ if (PHP_OS == 'Darwin') {
+ // Mac OS X's ps barfs on the 'w' param, but doesn't need it.
+ $ps = "ps -U %s";
+ } else {
+ // Good on Linux
+ $ps = "ps -U %s w";
+ }
+ $psCommand = sprintf($ps, escapeshellarg($user));
+ exec($psCommand . " | grep -i selenium-server", $output);
+
+ // Start server. If there is already a server running,
+ // return running.
+
+ if ( isset( $this->SeleniumServerExecPath ) ) {
+ $found = 0;
+ foreach ( $output as $string ) {
+ $found += preg_match(
+ '~^(.*)java(.+)-jar(.+)selenium-server~',
+ $string );
+ }
+ if ( $found == 0 ) {
+
+ // Didn't find the selenium server. Start it up.
+ // First set up comamand line suffix.
+ // NB: $! is pid of last job run in background
+ // The echo guarentees it is put into $op when
+ // the exec command is run.
+
+ $commandSuffix = ' > /dev/null 2>&1'. ' & echo $!';
+ $portText = ' -port ' . $this->SeleniumServerPort;
+ $command = "java -jar " .
+ escapeshellarg($this->SeleniumServerExecPath) .
+ $portText . $commandSuffix;
+ exec($command ,$op);
+ $pid = (int)$op[0];
+ if ( $pid != "" )
+ $this->SeleniumServerPid = $pid;
+ else {
+ $this->SeleniumServerPid = 'NaN';
+ // Server start failed.
+ return 'failed';
+ }
+ // Wait for the server to startup and listen
+ // on its port. Note: this solution kinda
+ // stinks, since it uses a wait loop - dnessett
+
+ wfSuppressWarnings();
+ for ( $cnt = 1;
+ $cnt <= $this->SeleniumServerStartTimeout;
+ $cnt++ ) {
+ $fp = fsockopen ( 'localhost',
+ $this->SeleniumServerPort,
+ $errno, $errstr, 0 );
+ if ( !$fp ) {
+ sleep( 1 );
+ continue;
+ // Server start succeeded.
+ } else {
+ fclose ( $fp );
+ return 'started';
+ }
+ }
+ wfRestoreWarnings();
+ echo ( "Starting Selenium server timed out.\n" );
+ return 'failed';
+ }
+ // server already running.
+ else return 'running';
+
+ }
+ // No Server execution path defined.
+ return 'failed';
+ }
+
+ private function startServerOnWindows() {
+ // Unimplemented.
+ return 'failed';
+ }
+
+ private function stopServerOnUnix() {
+
+ if ( !empty( $this->SeleniumServerPid ) &&
+ $this->SeleniumServerPid != 'NaN' ) {
+ exec( "kill -9 " . $this->SeleniumServerPid );
+ return 'stopped';
+ }
+ else return 'failed';
+ }
+
+ private function stopServerOnWindows() {
+ // Unimplemented.
+ return 'failed';
+
+ }
+}
diff --git a/maintenance/tests/selenium/SeleniumTestCase.php b/maintenance/tests/selenium/SeleniumTestCase.php
new file mode 100644
index 00000000..11e1b192
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumTestCase.php
@@ -0,0 +1,103 @@
+<?php
+class SeleniumTestCase extends PHPUnit_Framework_TestCase { // PHPUnit_Extensions_SeleniumTestCase
+ protected $selenium;
+
+ public function setUp() {
+ set_time_limit( 60 );
+ $this->selenium = Selenium::getInstance();
+ }
+
+ public function tearDown() {
+
+ }
+
+ public function __call( $method, $args ) {
+ return call_user_func_array( array( $this->selenium, $method ), $args );
+ }
+
+ public function assertSeleniumAttributeEquals( $attribute, $value ) {
+ $attr = $this->getAttribute( $attribute );
+ $this->assertEquals( $attr, $value );
+ }
+
+ public function assertSeleniumHTMLContains( $element, $text ) {
+ $innerHTML = $this->getText( $element );
+ // or assertContains
+ $this->assertRegExp( "/$text/", $innerHTML );
+ }
+
+//Common Funtions Added for Selenium Tests
+
+ public function getExistingPage(){
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->type("searchInput", "new" );
+ $this->click("searchGoButton");
+ $this->waitForPageToLoad("30000");
+ }
+
+ public function getNewPage($pageName){
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->type("searchInput", $pageName );
+ $this->click("searchGoButton");
+ $this->waitForPageToLoad("30000");
+ $this->click("link=".$pageName);
+ $this->waitForPageToLoad("600000");
+
+
+ }
+ // Loading the mediawiki editor
+ public function loadWikiEditor(){
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ }
+
+ // Clear the content of the mediawiki editor
+ public function clearWikiEditor(){
+ $this->type("wpTextbox1", "");
+ }
+
+ // Click on the 'Show preview' button of the mediawiki editor
+ public function clickShowPreviewBtn(){
+ $this->click("wpPreview");
+ }
+
+ // Click on the 'Save Page' button of the mediawiki editor
+ public function clickSavePageBtn(){
+ $this->click("wpSave");
+ }
+
+ // Click on the 'Edit' link
+ public function clickEditLink(){
+ $this->click("link=Edit");
+ $this->waitForPageToLoad("30000");
+ }
+
+ public function deletePage($pageName){
+ $isLinkPresent = False;
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click("link=Log out");
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=Log in / create account" );
+ $this->waitForPageToLoad( "30000" );
+ $this->type( "wpName1", "nadeesha" );
+ $this->type( "wpPassword1", "12345" );
+ $this->click( "wpLoginAttempt" );
+ $this->waitForPageToLoad( "30000" );
+ $this->type( "searchInput", $pageName );
+ $this->click( "searchGoButton");
+ $this->waitForPageToLoad( "30000" );
+
+ $this->click( "link=Delete" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "wpConfirmB" );
+ $this->waitForPageToLoad( "30000" );
+
+ }
+
+
+
+}
diff --git a/maintenance/tests/selenium/SeleniumTestConsoleLogger.php b/maintenance/tests/selenium/SeleniumTestConsoleLogger.php
new file mode 100644
index 00000000..b6f5496c
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumTestConsoleLogger.php
@@ -0,0 +1,25 @@
+<?php
+
+class SeleniumTestConsoleLogger {
+ public function __construct() {
+ // Prepare testsuite for immediate output
+ @ini_set( 'zlib.output_compression', 0 );
+ @ini_set( 'implicit_flush', 1 );
+ for ( $i = 0; $i < ob_get_level(); $i++ ) {
+ ob_end_flush();
+ }
+ ob_implicit_flush( 1 );
+ }
+
+ public function write( $message, $mode = false ) {
+ $out = '';
+ // if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '<font color="green">';
+ $out .= htmlentities( $message );
+ // if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '</font>';
+ if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
+ $out .= "\n";
+ }
+
+ echo $out;
+ }
+}
diff --git a/maintenance/tests/selenium/SeleniumTestHTMLLogger.php b/maintenance/tests/selenium/SeleniumTestHTMLLogger.php
new file mode 100644
index 00000000..21332cf0
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumTestHTMLLogger.php
@@ -0,0 +1,36 @@
+<?php
+
+class SeleniumTestHTMLLogger {
+ public function setHeaders() {
+ global $wgOut;
+ $wgOut->addHeadItem( 'selenium', '<style type="text/css">
+ .selenium pre {
+ overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ /* width: 99%; */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+ }
+ .selenium-success { color: green }
+ </style>' );
+ }
+
+ public function write( $message, $mode = false ) {
+ global $wgOut;
+ $out = '';
+ if ( $mode == SeleniumTestSuite::RESULT_OK ) {
+ $out .= '<span class="selenium-success">';
+ }
+ $out .= htmlspecialchars( $message );
+ if ( $mode == SeleniumTestSuite::RESULT_OK ) {
+ $out .= '</span>';
+ }
+ if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
+ $out .= '<br />';
+ }
+
+ $wgOut->addHTML( $out );
+ }
+}
diff --git a/maintenance/tests/selenium/SeleniumTestListener.php b/maintenance/tests/selenium/SeleniumTestListener.php
new file mode 100644
index 00000000..9436f672
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumTestListener.php
@@ -0,0 +1,68 @@
+<?php
+
+class SeleniumTestListener implements PHPUnit_Framework_TestListener {
+ private $logger;
+ private $tests_ok = 0;
+ private $tests_failed = 0;
+
+ public function __construct( $loggerInstance ) {
+ $this->logger = $loggerInstance;
+ }
+
+ public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+ $this->logger->write( 'Error: ' . $e->getMessage() );
+ $this->tests_failed++;
+ }
+
+ public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time )
+ {
+ $this->logger->write( 'Failed: ' . $e->getMessage() );
+ $this->tests_failed++;
+ }
+
+ public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time )
+ {
+ $this->logger->write( 'Incomplete.' );
+ $this->tests_failed++;
+ }
+
+ public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time )
+ {
+ $this->logger->write( 'Skipped.' );
+ $this->tests_failed++;
+ }
+
+ public function startTest( PHPUnit_Framework_Test $test ) {
+ $this->logger->write(
+ 'Testing ' . $test->getName() . ' ... ',
+ SeleniumTestSuite::CONTINUE_LINE
+ );
+ }
+
+ public function endTest( PHPUnit_Framework_Test $test, $time ) {
+ if ( !$test->hasFailed() ) {
+ $this->logger->write( 'OK', SeleniumTestSuite::RESULT_OK );
+ $this->tests_ok++;
+ }
+ }
+
+ public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
+ $this->logger->write( 'Testsuite ' . $suite->getName() . ' started.' );
+ $this->tests_ok = 0;
+ $this->tests_failed = 0;
+ }
+
+ public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
+ $this->logger->write('Testsuite ' . $suite->getName() . ' ended.' );
+ if ( $this->tests_ok > 0 || $this->tests_failed > 0 ) {
+ $this->logger->write( ' OK: ' . $this->tests_ok . ' Failed: ' . $this->tests_failed );
+ }
+ $this->tests_ok = 0;
+ $this->tests_failed = 0;
+ }
+
+ public function statusMessage( $message ) {
+ $this->logger->write( $message );
+ }
+}
+
diff --git a/maintenance/tests/selenium/SeleniumTestSuite.php b/maintenance/tests/selenium/SeleniumTestSuite.php
new file mode 100644
index 00000000..ba178051
--- /dev/null
+++ b/maintenance/tests/selenium/SeleniumTestSuite.php
@@ -0,0 +1,46 @@
+<?php
+
+abstract class SeleniumTestSuite extends PHPUnit_Framework_TestSuite {
+ private $selenium;
+ private $isSetUp = false;
+ private $loginBeforeTests = true;
+
+ // Do not add line break after test output
+ const CONTINUE_LINE = 1;
+ const RESULT_OK = 2;
+ const RESULT_ERROR = 3;
+
+ public abstract function addTests();
+
+ public function setUp() {
+ // Hack because because PHPUnit version 3.0.6 which is on prototype does not
+ // run setUp as part of TestSuite::run
+ if ( $this->isSetUp ) {
+ return;
+ }
+ $this->isSetUp = true;
+ $this->selenium = Selenium::getInstance();
+ $this->selenium->start();
+ $this->selenium->open( $this->selenium->getUrl() . '/index.php?setupTestSuite=' . $this->getName() );
+ if ( $this->loginBeforeTests ) {
+ $this->login();
+ }
+ }
+
+ public function tearDown() {
+ $this->selenium->open( $this->selenium->getUrl() . '/index.php?clearTestSuite=' . $this->getName() );
+ $this->selenium->stop();
+ }
+
+ public function login() {
+ $this->selenium->login();
+ }
+
+ public function loadPage( $title, $action ) {
+ $this->selenium->loadPage( $title, $action );
+ }
+
+ protected function setLoginBeforeTests( $loginBeforeTests = true ) {
+ $this->loginBeforeTests = $loginBeforeTests;
+ }
+}
diff --git a/maintenance/tests/selenium/data/Wikipedia-logo-v2-de.png b/maintenance/tests/selenium/data/Wikipedia-logo-v2-de.png
new file mode 100644
index 00000000..70385243
--- /dev/null
+++ b/maintenance/tests/selenium/data/Wikipedia-logo-v2-de.png
Binary files differ
diff --git a/maintenance/tests/selenium/selenium_settings.ini.php52.sample b/maintenance/tests/selenium/selenium_settings.ini.php52.sample
new file mode 100644
index 00000000..ad21037e
--- /dev/null
+++ b/maintenance/tests/selenium/selenium_settings.ini.php52.sample
@@ -0,0 +1,23 @@
+[browsers]
+
+firefox = "*firefox"
+iexploreproxy = "*iexploreproxy"
+chrome = "*chrome"
+
+[SeleniumSettings]
+
+host = "localhost"
+port = "4444"
+wikiUrl = "http://localhost/mediawiki/latest_trunk/trunk/phase3"
+username = "Wikiadmin"
+userPassword = "Wikiadminpw"
+testBrowser = "firefox"
+startserver =
+stopserver =
+jUnitLogFile =
+runAgainstGrid = false
+
+[testSuite]
+
+SimpleSeleniumTestSuite = "maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php"
+WikiEditorTestSuite = "extensions/WikiEditor/selenium/WikiEditorTestSuite.php"
diff --git a/maintenance/tests/selenium/selenium_settings.ini.sample b/maintenance/tests/selenium/selenium_settings.ini.sample
new file mode 100644
index 00000000..bacc0a90
--- /dev/null
+++ b/maintenance/tests/selenium/selenium_settings.ini.sample
@@ -0,0 +1,32 @@
+[SeleniumSettings]
+
+; Set up the available browsers that Selenium can control.
+browsers[firefox] = "*firefox"
+browsers[iexplorer] = "*iexploreproxy"
+browsers[chrome] = "*chrome"
+
+; The simple configurations above usually work on Linux, but Windows and
+; Mac OS X hosts may need to specify a full path:
+;browsers[firefox] = "*firefox /Applications/Firefox.app/Contents/MacOS/firefox-bin"
+;browsers[firefox] = "*firefox C:\Program Files\Mozilla Firefox\firefox.exe"
+
+host = "localhost"
+port = "4444"
+wikiUrl = "http://localhost/deployment"
+username = "wikiuser"
+userPassword = "wikipass"
+testBrowser = "firefox"
+startserver =
+stopserver =
+jUnitLogFile =
+runAgainstGrid = false
+
+; To let the test runner start and stop the selenium server, it needs the full
+; path to selenium-server.jar from the selenium-remote-control package.
+seleniumserverexecpath = "/opt/local/selenium-remote-control-1.0.3/selenium-server-1.0.3/selenium-server.jar"
+
+[SeleniumTests]
+
+testSuite[SimpleSeleniumTestSuite] = "maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php"
+testSuite[WikiEditorTestSuite] = "extensions/WikiEditor/selenium/WikiEditorTestSuite.php"
+
diff --git a/maintenance/tests/selenium/selenium_settings_grid.ini.sample b/maintenance/tests/selenium/selenium_settings_grid.ini.sample
new file mode 100644
index 00000000..eca60b0a
--- /dev/null
+++ b/maintenance/tests/selenium/selenium_settings_grid.ini.sample
@@ -0,0 +1,14 @@
+[SeleniumSettings]
+
+host = "grid.tesla.usability.wikimedia.org"
+port = "4444"
+wikiUrl = "http://208.80.152.253:5001"
+username = "wikiuser"
+userPassword = "wikipass"
+testBrowser = "Safari on OS X Snow Leopard"
+jUnitLogFile =
+runAgainstGrid = true
+
+[testSuite]
+
+SimpleSeleniumTestSuite = "maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php" \ No newline at end of file
diff --git a/maintenance/tests/selenium/suites/AddContentToNewPageTestCase.php b/maintenance/tests/selenium/suites/AddContentToNewPageTestCase.php
new file mode 100644
index 00000000..dd4bc005
--- /dev/null
+++ b/maintenance/tests/selenium/suites/AddContentToNewPageTestCase.php
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+
+class AddContentToNewPageTestCase extends SeleniumTestCase {
+
+
+ // Add bold text and verify output
+ public function testAddBoldText() {
+
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "//*[@id='mw-editbutton-bold']" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify bold text displayed on mediawiki preview
+ $this->assertTrue($this->isElementPresent( "//div[@id='wikiPreview']/p/b" ));
+ $this->assertTrue($this->isTextPresent( "Bold text" ));
+ }
+
+ // Add italic text and verify output
+ public function testAddItalicText() {
+
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "//*[@id='mw-editbutton-italic']" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify italic text displayed on mediawiki preview
+ $this->assertTrue($this->isElementPresent("//div[@id='wikiPreview']/p/i"));
+ $this->assertTrue($this->isTextPresent( "Italic text" ));
+ }
+
+ // Add internal link for a new page and verify output in the preview
+ public function testAddInternalLinkNewPage() {
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "//*[@id='mw-editbutton-link']" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify internal link displayed on mediawiki preview
+ $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
+ $correct = strstr( $source, "Link title" );
+ $this->assertEquals( $correct, true );
+
+ $this->click( "link=Link title" );
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify internal link open as a new page - editing mode
+ $source = $this->getText( "firstHeading" );
+ $correct = strstr( $source, "Editing Link title" );
+ $this->assertEquals( $correct, true );
+ }
+
+ // Add external link and verify output in the preview
+ public function testAddExternalLink() {
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "//*[@id='mw-editbutton-extlink']" );
+ $this->type( "wpTextbox1", "[http://www.google.com Google]" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify external links displayed on mediawiki preview
+ $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
+ $correct = strstr( $source, "Google" );
+ $this->assertEquals( $correct, true );
+
+ $this->click( "link=Google" );
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify external link opens
+ $source = $this->getTitle();
+ $correct = strstr( $source, "Google" );
+ $this->assertEquals( $correct, true);
+ }
+
+ // Add level 2 headline and verify output in the preview
+ public function testAddLevel2HeadLine() {
+ $blnElementPresent = False;
+ $blnTextPresent = False;
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "mw-editbutton-headline" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+ $this->assertTrue($this->isElementPresent( "//div[@id='wikiPreview']/h2" ));
+
+ // Verify level 2 headline displayed on mediawiki preview
+ $source = $this->getText( "//*[@id='Headline_text']" );
+ $correct = strstr( $source, "Headline text" );
+ $this->assertEquals( $correct, true );
+ }
+
+ // Add text with ignore wiki format and verify output the preview
+ public function testAddNoWikiFormat() {
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "//*[@id='mw-editbutton-nowiki']" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify ignore wiki format text displayed on mediawiki preview
+ $source = $this->getText( "//div[@id='wikiPreview']/p" );
+ $correct = strstr( $source, "Insert non-formatted text here" );
+ $this->assertEquals( $correct, true );
+ }
+
+ // Add signature and verify output in the preview
+ public function testAddUserSignature() {
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "mw-editbutton-signature" );
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify signature displayed on mediawiki preview
+ $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
+ $username = $this->getText( "//*[@id='pt-userpage']/a" );
+ $correct = strstr( $source, $username );
+ $this->assertEquals( $correct, true );
+ }
+
+ // Add horizontal line and verify output in the preview
+ public function testHorizontalLine() {
+ $this->getExistingPage();
+ $this->clickEditLink();
+ $this->loadWikiEditor();
+ $this->clearWikiEditor();
+ $this->click( "mw-editbutton-hr" );
+
+ $this->clickShowPreviewBtn();
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify horizontal line displayed on mediawiki preview
+ $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/hr" ));
+ $this->deletePage( "new" );
+ }
+}
diff --git a/maintenance/tests/selenium/suites/AddNewPageTestCase.php b/maintenance/tests/selenium/suites/AddNewPageTestCase.php
new file mode 100644
index 00000000..423f2a2c
--- /dev/null
+++ b/maintenance/tests/selenium/suites/AddNewPageTestCase.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+
+class AddNewPageTestCase extends SeleniumTestCase {
+
+ // Verify adding a new page
+ public function testAddNewPage() {
+ $newPage = "new";
+ $displayName = "New";
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify 'Search results' text available
+ $source = $this->gettext( "firstHeading" );
+ $correct = strstr( $source, "Search results" );
+ $this->assertEquals( $correct, true);
+
+ // Verify 'Create the page "<page name>" on this wiki' text available
+ $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
+ $correct = strstr ( $source, "Create the page \"New\" on this wiki!" );
+ $this->assertEquals( $correct, true );
+
+ $this->click( "link=".$displayName );
+ $this->waitForPageToLoad( "600000" );
+
+ $this->assertTrue($this->isElementPresent( "link=Create" ));
+ $this->type( "wpTextbox1", "add new test page" );
+ $this->click( "wpSave" );
+
+ // Verify new page added
+ $source = $this->gettext( "firstHeading" );
+ $correct = strstr ( $source, $displayName );
+ $this->assertEquals( $correct, true );
+ }
+}
diff --git a/maintenance/tests/selenium/suites/CreateAccountTestCase.php b/maintenance/tests/selenium/suites/CreateAccountTestCase.php
new file mode 100644
index 00000000..1cfda2e0
--- /dev/null
+++ b/maintenance/tests/selenium/suites/CreateAccountTestCase.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+Class CreateAccountTestCase extends SeleniumTestCase {
+
+ // Change these values before run the test
+ private $userName = "yourname4000";
+ private $password = "yourpass4000";
+
+ // Verify 'Log in/create account' link existance in Main page.
+ public function testMainPageLink() {
+
+ $this->click( "link=Log out" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+ $this->assertTrue($this->isElementPresent( "link=Log in / create account" ));
+ }
+
+ // Verify 'Create an account' link existance in 'Log in / create account' Page.
+ public function testCreateAccountPageLink() {
+
+ $this->click( "link=Log out" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+
+ // click Log in / create account link to open Log in / create account' page
+ $this->click( "link=Log in / create account" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertTrue($this->isElementPresent( "link=Create an account" ));
+ }
+
+ // Verify Create account
+ public function testCreateAccount() {
+
+ $this->click( "link=Log out" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+
+ $this->click( "link=Log in / create account" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->click( "link=Create an account" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify for blank user name
+ $this->type( "wpName2", "" );
+ $this->click( "wpCreateaccount" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Login error\n You have not specified a valid user name.",
+ $this->getText( "//div[@id='bodyContent']/div[4]" ));
+
+ // Verify for invalid user name
+ $this->type( "wpName2", "@" );
+ $this->click("wpCreateaccount" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Login error\n You have not specified a valid user name.",
+ $this->getText( "//div[@id='bodyContent']/div[4]" ));
+
+ // start of test for blank password
+ $this->type( "wpName2", $this->userName);
+ $this->type( "wpPassword2", "" );
+ $this->click( "wpCreateaccount" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Login error\n Passwords must be at least 1 character.",
+ $this->getText("//div[@id='bodyContent']/div[4]" ));
+
+ $this->type( "wpName2", $this->userName );
+ $this->type( "wpPassword2", $this->password );
+ $this->click( "wpCreateaccount" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Login error\n The passwords you entered do not match.",
+ $this->getText( "//div[@id='bodyContent']/div[4]" ));
+
+ $this->type( "wpName2", $this->userName );
+ $this->type( "wpPassword2", $this->password );
+ $this->type( "wpRetype", $this->password );
+ $this->click( "wpCreateaccount" );
+ $this->waitForPageToLoad( "30000 ");
+
+ // Verify successful account creation for valid combination of 'Username', 'Password', 'Retype password'
+ $this->assertEquals( "Welcome, ".ucfirst( $this->userName )."!",
+ $this->getText( "Welcome,_".ucfirst( $this->userName )."!" ));
+ }
+}
+
diff --git a/maintenance/tests/selenium/suites/DeletePageAdminTestCase.php b/maintenance/tests/selenium/suites/DeletePageAdminTestCase.php
new file mode 100644
index 00000000..40628986
--- /dev/null
+++ b/maintenance/tests/selenium/suites/DeletePageAdminTestCase.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+
+class DeletePageAdminTestCase extends SeleniumTestCase {
+
+ // Verify adding a new page
+ public function testDeletePage() {
+
+
+ $newPage = "new";
+ $displayName = "New";
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=".$displayName );
+ $this->waitForPageToLoad( "60000" );
+ $this->type( "wpTextbox1", $newPage." text" );
+ $this->click( "wpSave" );
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click( "link=Log out" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=Log in / create account" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "wpName1", $this->selenium->getUser() );
+ $this->type( "wpPassword1", $this->selenium->getPass() );
+ $this->click( "wpLoginAttempt" );
+ $this->waitForPageToLoad( "30000" );
+ $this->type( "searchInput", "new" );
+ $this->click( "searchGoButton");
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify 'Delete' link displayed
+ $source = $this->gettext( "link=Delete" );
+ $correct = strstr ( $source, "Delete" );
+ $this->assertEquals($correct, true );
+
+ $this->click( "link=Delete" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify 'Delete' button available
+ $this->assertTrue($this->isElementPresent( "wpConfirmB" ));
+
+ $this->click( "wpConfirmB" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify 'Action complete' text displayed
+ $source = $this->gettext( "firstHeading" );
+ $correct = strstr ( $source, "Action complete" );
+ $this->assertEquals( $correct, true );
+
+ // Verify '<Page Name> has been deleted. See deletion log for a record of recent deletions.' text displayed
+ $source = $this->gettext( "//div[@id='bodyContent']/p[1]" );
+ $correct = strstr ( $source, "\"New\" has been deleted. See deletion log for a record of recent deletions." );
+ $this->assertEquals( $correct, true );
+ }
+}
diff --git a/maintenance/tests/selenium/suites/EmailPasswordTestCase.php b/maintenance/tests/selenium/suites/EmailPasswordTestCase.php
new file mode 100644
index 00000000..8356f43a
--- /dev/null
+++ b/maintenance/tests/selenium/suites/EmailPasswordTestCase.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class EmailPasswordTestCase extends SeleniumTestCase {
+
+ // change user name for each and every test (with in 24 hours)
+ private $userName = "test1";
+
+ public function testEmailPasswordButton() {
+
+ $this->click( "link=Log out" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+
+ // click Log in / create account link to open Log in / create account' page
+ $this->click( "link=Log in / create account" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertTrue($this->isElementPresent( "wpMailmypassword" ));
+ }
+
+ // Verify Email password functionality
+ public function testEmailPasswordMessages() {
+
+ $this->click( "link=Log out" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+
+ // click Log in / create account link to open Log in / create account' page
+ $this->click( "link=Log in / create account" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "wpName1", "" );
+ $this->click( "wpMailmypassword" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Login error\n You have not specified a valid user name.",
+ $this->getText("//div[@id='bodyContent']/div[4]"));
+
+ $this->type( "wpName1", $this->userName );
+ $this->click( "wpMailmypassword" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Can not run on localhost
+ $this->assertEquals( "A new password has been sent to the e-mail address registered for ".ucfirst($this->userName).". Please log in again after you receive it.",
+ $this->getText("//div[@id='bodyContent']/div[4]" ));
+
+ $this->type( "wpName1", $this->userName );
+ $this->click( "wpMailmypassword" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Login error\n A password reminder has already been sent, within the last 24 hours. To prevent abuse, only one password reminder will be sent per 24 hours.",
+ $this->getText( "//div[@id='bodyContent']/div[4]" ));
+ }
+}
+
diff --git a/maintenance/tests/selenium/suites/MediaWikExtraTestSuite.php b/maintenance/tests/selenium/suites/MediaWikExtraTestSuite.php
new file mode 100644
index 00000000..205cb332
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MediaWikExtraTestSuite.php
@@ -0,0 +1,20 @@
+<?php
+
+class MediaWikExtraTestSuite extends SeleniumTestSuite {
+ public function setUp() {
+ $this->setLoginBeforeTests( true );
+ parent::setUp();
+ }
+ public function addTests() {
+ $testFiles = array(
+ 'maintenance/tests/selenium/suites/MyContributionsTestCase.php',
+ 'maintenance/tests/selenium/suites/MyWatchListTestCase.php',
+ 'maintenance/tests/selenium/suites/UserPreferencesTestCase.php',
+ 'maintenance/tests/selenium/suites/MovePageTestCase.php',
+ 'maintenance/tests/selenium/suites/PageSearchTestCase.php',
+ 'maintenance/tests/selenium/suites/EmailPasswordTestCase.php',
+ 'maintenance/tests/selenium/suites/CreateAccountTestCase.php'
+ );
+ parent::addTestFiles( $testFiles );
+ }
+}
diff --git a/maintenance/tests/selenium/suites/MediaWikiEditorConfig.php b/maintenance/tests/selenium/suites/MediaWikiEditorConfig.php
new file mode 100644
index 00000000..2803117d
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MediaWikiEditorConfig.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class MediaWikiEditorConfig {
+
+ public static function getSettings(&$includeFiles, &$globalConfigs) {
+ $includes = array(
+ //files that needed to be included would go here
+ 'maintenance/tests/selenium/suites/MediaWikiCommonFunction.php'
+ );
+ $configs = array(
+ 'wgPageLoadTime' => "600000"
+ );
+ $includeFiles = array_merge( $includeFiles, $includes );
+ $globalConfigs = array_merge( $globalConfigs, $configs);
+ return true;
+ }
+}
+
+
+
diff --git a/maintenance/tests/selenium/suites/MediaWikiEditorTestSuite.php b/maintenance/tests/selenium/suites/MediaWikiEditorTestSuite.php
new file mode 100644
index 00000000..06046365
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MediaWikiEditorTestSuite.php
@@ -0,0 +1,18 @@
+<?php
+
+class MediaWikiEditorTestSuite extends SeleniumTestSuite {
+ public function setUp() {
+ $this->setLoginBeforeTests( true );
+ parent::setUp();
+ }
+ public function addTests() {
+ $testFiles = array(
+ 'maintenance/tests/selenium/suites/AddNewPageTestCase.php',
+ 'maintenance/tests/selenium/suites/AddContentToNewPageTestCase.php',
+ 'maintenance/tests/selenium/suites/PreviewPageTestCase.php',
+ 'maintenance/tests/selenium/suites/SavePageTestCase.php',
+ );
+ parent::addTestFiles( $testFiles );
+ }
+}
+
diff --git a/maintenance/tests/selenium/suites/MediawikiCoreSmokeTestCase.php b/maintenance/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
new file mode 100644
index 00000000..7b9525af
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * Stub of tests be need as part of the hack-a-ton
+ */
+class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
+ public function testUserLogin() {
+
+ }
+
+ public function testChangeUserPreference() {
+
+ }
+
+ /*
+ * TODO: generalize this test to be reusable for different skins
+ */
+ public function testCreateNewPageVector() {
+
+ }
+
+ /*
+ * TODO: generalize this test to be reusable for different skins
+ */
+ public function testEditExistingPageVector() {
+
+ }
+
+ /*
+ * TODO: generalize this test to be reusable for different skins
+ */
+ public function testCreateNewPageMonobook() {
+
+ }
+
+ /*
+ * TODO: generalize this test to be reusable for different skins
+ */
+ public function testEditExistingPageMonobook() {
+
+ }
+
+ public function testImageUpload() {
+ $this->login();
+ $this->open( $this->getUrl() .
+ '/index.php?title=Special:Upload' );
+ $this->type( 'wpUploadFile', dirname( __FILE__ ) .
+ "\\..\\data\\Wikipedia-logo-v2-de.png" );
+ $this->check( 'wpIgnoreWarning' );
+ $this->click( 'wpUpload' );
+ $this->waitForPageToLoad( 30000 );
+
+ $this->assertSeleniumHTMLContains(
+ '//h1[@class="firstHeading"]', "Wikipedia-logo-v2-de.png" );
+
+ /*
+ $this->open( $this->getUrl() . '/index.php?title=Image:'
+ . ucfirst( $this->filename ) . '&action=delete' );
+ $this->type( 'wpReason', 'Remove test file' );
+ $this->click( 'mw-filedelete-submit' );
+ $this->waitForPageToLoad( 10000 );
+
+ // Todo: This message is localized
+ $this->assertSeleniumHTMLContains( '//div[@id="bodyContent"]/p',
+ ucfirst( $this->filename ) . '.*has been deleted.' );
+ */
+ }
+
+
+}
diff --git a/maintenance/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php b/maintenance/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
new file mode 100644
index 00000000..76287b23
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
@@ -0,0 +1,19 @@
+<?php
+/*
+ * Stubs for now. We're going to start populating this test.
+ */
+class MediawikiCoreSmokeTestSuite extends SeleniumTestSuite
+{
+ public function setUp() {
+ $this->setLoginBeforeTests( false );
+ parent::setUp();
+ }
+ public function addTests() {
+ $testFiles = array(
+ 'maintenance/tests/selenium/suites/MediawikiCoreSmokeTestCase.php'
+ );
+ parent::addTestFiles( $testFiles );
+ }
+
+
+}
diff --git a/maintenance/tests/selenium/suites/MovePageTestCase.php b/maintenance/tests/selenium/suites/MovePageTestCase.php
new file mode 100644
index 00000000..d4d3b1f2
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MovePageTestCase.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class MovePageTestCase extends SeleniumTestCase {
+
+ // Verify move(rename) wiki page
+ public function testMovePage() {
+
+ $newPage = "mypage99";
+ $displayName = "Mypage99";
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=".$displayName );
+ $this->waitForPageToLoad( "60000" );
+ $this->type( "wpTextbox1", $newPage." text" );
+ $this->click( "wpSave" );
+ $this->waitForPageToLoad( "60000" );
+
+ // Verify link 'Move' available
+ $this->assertTrue($this->isElementPresent( "link=Move" ));
+
+ $this->click( "link=Move" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify correct page name displayed under 'Move Page' field
+ $this->assertEquals($displayName,
+ $this->getText("//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a"));
+ $movePageName = $this->getText( "//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a" );
+
+ // Verify 'To new title' field has current page name as the default name
+ $newTitle = $this->getValue( "wpNewTitle" );
+ $correct = strstr( $movePageName , $newTitle );
+ $this->assertEquals( $correct, true );
+
+ $this->type( "wpNewTitle", $displayName );
+ $this->click( "wpMove" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify warning message for the same source and destination titles
+ $this->assertEquals( "Source and destination titles are the same; cannot move a page over itself.",
+ $this->getText("//div[@id='bodyContent']/p[4]/strong" ));
+
+ // Verify warning message for the blank title
+ $this->type( "wpNewTitle", "" );
+ $this->click( "wpMove" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify warning message for the blank title
+ $this->assertEquals( "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.",
+ $this->getText( "//div[@id='bodyContent']/p[4]/strong" ));
+
+ // Verify warning messages for the invalid titles
+ $this->type( "wpNewTitle", "# < > [ ] | { }" );
+ $this->click( "wpMove" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "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.",
+ $this->getText( "//div[@id='bodyContent']/p[4]/strong" ));
+
+ $this->type( "wpNewTitle", $displayName."move" );
+ $this->click( "wpMove" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify move success message displayed correctly
+ $this->assertEquals( "\"".$displayName."\" has been moved to \"".$displayName."move"."\"",
+ $this->getText( "//div[@id='bodyContent']/p[1]/b" ));
+
+ $this->type( "searchInput", $newPage."move" );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify search using new page name
+ $this->assertEquals( $displayName."move", $this->getText( "firstHeading" ));
+
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify search using old page name
+ $redirectPageName = $this->getText( "//*[@id='contentSub']" );
+ $this->assertEquals( "(Redirected from ".$displayName.")" , $redirectPageName );
+
+ // newpage delete
+ $this->deletePage( $newPage."move" );
+ $this->deletePage( $newPage );
+ }
+}
+
diff --git a/maintenance/tests/selenium/suites/MyContributionsTestCase.php b/maintenance/tests/selenium/suites/MyContributionsTestCase.php
new file mode 100644
index 00000000..95011c3b
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MyContributionsTestCase.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class MyContributionsTestCase extends SeleniumTestCase {
+
+ // Verify user contributions
+ public function testRecentChangesAvailability() {
+
+ $newPage = "mypage999";
+ $displayName = "Mypage999";
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+
+ $this->type( "searchInput", $newPage);
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "60000" );
+ $this->click( "link=".$displayName );
+ $this->waitForPageToLoad( "600000" );
+ $this->type( "wpTextbox1", $newPage." text" );
+ $this->click( "wpSave" );
+ $this->waitForPageToLoad( "60000" );
+
+ // Verify My contributions Link available
+ $this->assertTrue($this->isElementPresent( "link=My contributions" ));
+
+ $this->click( "link=My contributions" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify recent page adding available on My Contributions list
+ $this->assertEquals( $displayName, $this->getText( "link=".$displayName ));
+
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->click( "link=Edit" );
+ $this->waitForPageToLoad( "30000" );
+ $this->type( "wpTextbox1", $newPage." text changed" );
+ $this->click( "wpSave" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=My contributions" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify recent page changes available on My Contributions
+ $this->assertTrue($this->isTextPresent($displayName." ‎ (top)"));
+ $this->deletePage($newPage);
+ }
+}
+
diff --git a/maintenance/tests/selenium/suites/MyWatchListTestCase.php b/maintenance/tests/selenium/suites/MyWatchListTestCase.php
new file mode 100644
index 00000000..150c1f51
--- /dev/null
+++ b/maintenance/tests/selenium/suites/MyWatchListTestCase.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+
+class MyWatchListTestCase extends SeleniumTestCase {
+
+ // Verify user watchlist
+ public function testMyWatchlist() {
+
+ $newPage = "mypage";
+ $displayName = "Mypage";
+ $wikiText = "watch page";
+
+ $this->open( $this->getUrl().'/index.php?title=Main_Page' );
+
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=".$displayName );
+ $this->waitForPageToLoad( "600000" );
+
+ $this->click( "wpWatchthis" );
+ $this->type( "wpTextbox1",$wikiText );
+ $this->click( "wpSave" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify link 'My Watchlist' available
+ $this->assertTrue( $this->isElementPresent( "link=My watchlist" ) );
+
+ $this->click( "link=My watchlist" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify newly added page to the watchlist is available
+ $watchList = $this->getText( "//*[@id='bodyContent']" );
+ $this->assertContains( $displayName, $watchList );
+
+ $this->type( "searchInput", $newPage );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click("link=Edit");
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "wpWatchthis" );
+ $this->click( "wpSave" );
+ $this->deletePage( $newPage );
+ }
+}
+
diff --git a/maintenance/tests/selenium/suites/PageDeleteTestSuite.php b/maintenance/tests/selenium/suites/PageDeleteTestSuite.php
new file mode 100644
index 00000000..2e535c11
--- /dev/null
+++ b/maintenance/tests/selenium/suites/PageDeleteTestSuite.php
@@ -0,0 +1,16 @@
+<?php
+
+class PageDeleteTestSuite extends SeleniumTestSuite {
+ public function setUp() {
+ $this->setLoginBeforeTests( true );
+ parent::setUp();
+ }
+ public function addTests() {
+ $testFiles = array(
+ 'maintenance/tests/selenium/suites/DeletePageAdminTestCase.php'
+ );
+ parent::addTestFiles( $testFiles );
+ }
+
+
+}
diff --git a/maintenance/tests/selenium/suites/PageSearchTestCase.php b/maintenance/tests/selenium/suites/PageSearchTestCase.php
new file mode 100644
index 00000000..e139f7a0
--- /dev/null
+++ b/maintenance/tests/selenium/suites/PageSearchTestCase.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class PageSearchTestCase extends SeleniumTestCase {
+
+ // Verify the functionality of the 'Go' button
+ public function testPageSearchBtnGo() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->type( "searchInput", "calcey qa" );
+ $this->click( "searchGoButton" );
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify no page matched with the entered search text
+ $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
+ $correct = strstr ( $source, "Create the page \"Calcey qa\" on this wiki!" );
+ $this->assertEquals( $correct, true );
+
+ $this->click( "link=Calcey qa" );
+ $this->waitForPageToLoad( "600000" );
+
+ $this->type( "wpTextbox1", "Calcey QA team" );
+ $this->click( "wpSave" );
+ $this->waitForPageToLoad( "600000" );
+
+ }
+
+ // Verify the functionality of the 'Search' button
+ public function testPageSearchBtnSearch() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->type( "searchInput", "Calcey web" );
+ $this->click( "mw-searchButton" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify no page is available as the search text
+ $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p[2]/b" );
+ $correct = strstr ( $source, "Create the page \"Calcey web\" on this wiki!" );
+ $this->assertEquals( $correct, true );
+
+ $this->click( "link=Calcey web" );
+ $this->waitForPageToLoad( "600000" );
+
+ $this->type( "wpTextbox1", "Calcey web team" );
+ $this->click( "wpSave" );
+ $this->waitForPageToLoad( "600000" );
+
+ // Verify saved page is opened when the exact page name is given
+ $this->type( "searchInput", "Calcey web" );
+ $this->click( "mw-searchButton" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify exact page matched with the entered search text using 'Search' button
+ $source = $this->getText( "//*[@id='bodyContent']/div[4]/p/b" );
+ $correct = strstr( $source, "There is a page named \"Calcey web\" on this wiki." );
+ $this->assertEquals( $correct, true );
+
+ // Verify resutls available when partial page name is entered as the search text
+ $this->type( "searchInput", "Calcey" );
+ $this->click( "mw-searchButton" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify text avaialble in the search result under the page titles
+ if($this->isElementPresent( "Page_title_matches" )) {
+ $textPageTitle = $this->getText( "//*[@id='bodyContent']/div[4]/ul[1]/li[1]/div[1]/a" );
+ $this->assertContains( 'Calcey', $textPageTitle );
+ }
+
+ // Verify text avaialble in the search result under the page text
+ if($this->isElementPresent( "Page_text_matches" )) {
+ $textPageText = $this->getText( "//*[@id='bodyContent']/div[4]/ul[2]/li[2]/div[2]/span" );
+ $this->assertContains( 'Calcey', $textPageText );
+ }
+ $this->deletePage("Calcey QA");
+ $this->deletePage("Calcey web");
+ }
+}
diff --git a/maintenance/tests/selenium/suites/PreviewPageTestCase.php b/maintenance/tests/selenium/suites/PreviewPageTestCase.php
new file mode 100644
index 00000000..b704bf39
--- /dev/null
+++ b/maintenance/tests/selenium/suites/PreviewPageTestCase.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class PreviewPageTestCase extends SeleniumTestCase {
+
+ // Verify adding a new page
+ public function testPreviewPage() {
+ $wikiText = "Adding this page to test the \n Preview button functionality";
+ $newPage = "Test Preview Page";
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->getNewPage( $newPage );
+ $this->type( "wpTextbox1", $wikiText."" );
+ $this->assertTrue($this->isElementPresent( "//*[@id='wpPreview']" ));
+
+ $this->click( "wpPreview" );
+
+ // Verify saved page available
+ $source = $this->gettext( "firstHeading" );
+ $correct = strstr( $source, "Test Preview Page" );
+ $this->assertEquals( $correct, true);
+
+ // Verify page content previewed succesfully
+ $contentOfPreviewPage = $this->getText( "//*[@id='content']" );
+ $this->assertContains( $wikiText, $contentOfPreviewPage );
+ }
+}
diff --git a/maintenance/tests/selenium/suites/SavePageTestCase.php b/maintenance/tests/selenium/suites/SavePageTestCase.php
new file mode 100644
index 00000000..7f1a6924
--- /dev/null
+++ b/maintenance/tests/selenium/suites/SavePageTestCase.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class SavePageTestCase extends SeleniumTestCase {
+
+ // Verify adding a new page
+ public function testSavePage() {
+ $wikiText = "Adding this page to test the Save button functionality";
+ $newPage = "Test Save Page";
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->getNewPage($newPage);
+ $this->type("wpTextbox1", $wikiText);
+
+ // verify 'Save' button available
+ $this->assertTrue($this->isElementPresent( "wpSave" ));
+ $this->click( "wpSave" );
+
+ // Verify saved page available
+ $source = $this->gettext( "firstHeading" );
+ $correct = strstr( $source, "Test Save Page" );
+
+ // Verify Saved page name displayed correctly
+ $this->assertEquals( $correct, true );
+
+ // Verify page content saved succesfully
+ $contentOfSavedPage = $this->getText( "//*[@id='content']" );
+ $this->assertContains( $wikiText, $contentOfSavedPage );
+ $this->deletePage( $newPage );
+ }
+}
diff --git a/maintenance/tests/selenium/suites/SimpleSeleniumConfig.php b/maintenance/tests/selenium/suites/SimpleSeleniumConfig.php
new file mode 100644
index 00000000..cffa83c4
--- /dev/null
+++ b/maintenance/tests/selenium/suites/SimpleSeleniumConfig.php
@@ -0,0 +1,15 @@
+<?php
+class SimpleSeleniumConfig {
+
+ public static function getSettings(&$includeFiles, &$globalConfigs) {
+ $includes = array(
+ //files that needed to be included would go here
+ );
+ $configs = array(
+ 'wgDefaultSkin' => 'chick'
+ );
+ $includeFiles = array_merge( $includeFiles, $includes );
+ $globalConfigs = array_merge( $globalConfigs, $configs);
+ return true;
+ }
+} \ No newline at end of file
diff --git a/maintenance/tests/selenium/suites/SimpleSeleniumTestCase.php b/maintenance/tests/selenium/suites/SimpleSeleniumTestCase.php
new file mode 100644
index 00000000..8f01b437
--- /dev/null
+++ b/maintenance/tests/selenium/suites/SimpleSeleniumTestCase.php
@@ -0,0 +1,30 @@
+<?php
+/*
+ * This test case is part of the SimpleSeleniumTestSuite.
+ * Configuration for these tests are dosumented as part of SimpleSeleniumTestSuite.php
+ */
+class SimpleSeleniumTestCase extends SeleniumTestCase {
+ public function testBasic() {
+ $this->open( $this->getUrl() .
+ '/index.php?title=Selenium&action=edit' );
+ $this->type( "wpTextbox1", "This is a basic test" );
+ $this->click( "wpPreview" );
+ $this->waitForPageToLoad( 10000 );
+
+ // check result
+ $source = $this->getText( "//div[@id='wikiPreview']/p" );
+ $correct = strstr( $source, "This is a basic test" );
+ $this->assertEquals( $correct, true );
+ }
+
+ /*
+ * All this test really does is verify that a global var was set.
+ * It depends on $wgDefaultSkin = 'chick'; being set
+ */
+ public function testGlobalVariableForDefaultSkin() {
+ $this->open( $this->getUrl() . '/index.php?&action=purge' );
+ $bodyClass = $this->getAttribute( "//body/@class" );
+ $this-> assertContains('skin-chick', $bodyClass, 'Chick skin not set');
+ }
+
+}
diff --git a/maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php b/maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php
new file mode 100644
index 00000000..a04f33ed
--- /dev/null
+++ b/maintenance/tests/selenium/suites/SimpleSeleniumTestSuite.php
@@ -0,0 +1,26 @@
+<?php
+/*
+ * Sample test suite.
+ * Two ways to configure MW for these tests
+ * 1) If you are running multiple test suites, add the following in LocalSettings.php
+ * require_once("maintenance/tests/selenium/SimpleSeleniumConfig.php");
+ * $wgSeleniumTestConfigs['SimpleSeleniumTestSuite'] = 'SimpleSeleniumConfig::getSettings';
+ * OR
+ * 2) Add the following to your Localsettings.php
+ * $wgDefaultSkin = 'chick';
+ */
+class SimpleSeleniumTestSuite extends SeleniumTestSuite
+{
+ public function setUp() {
+ $this->setLoginBeforeTests( false );
+ parent::setUp();
+ }
+ public function addTests() {
+ $testFiles = array(
+ 'maintenance/tests/selenium/suites/SimpleSeleniumTestCase.php'
+ );
+ parent::addTestFiles( $testFiles );
+ }
+
+
+}
diff --git a/maintenance/tests/selenium/suites/UserPreferencesTestCase.php b/maintenance/tests/selenium/suites/UserPreferencesTestCase.php
new file mode 100644
index 00000000..12824307
--- /dev/null
+++ b/maintenance/tests/selenium/suites/UserPreferencesTestCase.php
@@ -0,0 +1,179 @@
+<?php
+
+/**
+ * Selenium server manager
+ *
+ * @file
+ * @ingroup Maintenance
+ * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
+ * http://citizendium.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @addtogroup Maintenance
+ *
+ */
+
+class UserPreferencesTestCase extends SeleniumTestCase {
+
+ // Verify user information
+ public function testUserInfoDisplay() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click( "link=My preferences" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify correct username displayed in User Preferences
+ $this->assertEquals( $this->getText( "//li[@id='pt-userpage']/a" ),
+ $this->getText( "//table[@id='mw-htmlform-info']/tbody/tr[1]/td[2]" ));
+
+ // Verify existing Signature Displayed correctly
+ $this->assertEquals( $this->selenium->getUser(),
+ $this->getTable( "mw-htmlform-signature.0.1" ) );
+ }
+
+ // Verify change password
+ public function testChangePassword() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click( "link=My preferences" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->click( "link=Change password" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "wpPassword", "12345" );
+ $this->type( "wpNewPassword", "54321" );
+ $this->type( "wpRetype", "54321" );
+ $this->click( "//input[@value='Change password']" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->assertEquals( "Preferences", $this->getText( "firstHeading" ));
+
+ $this->click( "link=Change password" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "wpPassword", "54321" );
+ $this->type( "wpNewPassword", "12345" );
+ $this->type( "wpRetype", "12345" );
+ $this->click( "//input[@value='Change password']" );
+ $this->waitForPageToLoad( "30000" );
+ $this->assertEquals( "Preferences", $this->getText( "firstHeading" ));
+
+ $this->click( "link=Change password" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "wpPassword", "54321" );
+ $this->type( "wpNewPassword", "12345" );
+ $this->type( "wpRetype", "12345" );
+ $this->click( "//input[@value='Change password']" );
+ $this->waitForPageToLoad( "30000" );
+ }
+
+ // Verify successful preferences save
+ public function testSuccessfullSave() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click( "link=My preferences" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "mw-input-realname", "Test User" );
+ $this->click( "prefcontrol" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify "Your preferences have been saved." message
+ $this->assertEquals( "Your preferences have been saved.",
+ $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ));
+ $this->type( "mw-input-realname", "" );
+ $this->click( "prefcontrol" );
+ $this->waitForPageToLoad( "30000" );
+
+ }
+
+ // Verify change signature
+ public function testChangeSignature() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click( "link=My preferences" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->type( "mw-input-nickname", "TestSignature" );
+ $this->click( "prefcontrol" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify change user signature
+ $this->assertEquals( "TestSignature", $this->getText( "link=TestSignature" ));
+ $this->type( "mw-input-nickname", "Test" );
+ $this->click( "prefcontrol" );
+ $this->waitForPageToLoad("30000");
+ }
+
+ // Verify change date format
+ public function testChangeDateFormatTimeZone() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+
+ $this->click( "link=My preferences" );
+ $this->waitForPageToLoad( "30000" );
+ $this->click( "link=Date and time" );
+ $this->waitForPageToLoad( "30000" );
+
+ $this->click( "mw-input-date-dmy" );
+ $this->select( "mw-input-timecorrection", "label=Asia/Colombo" );
+ $this->click( "prefcontrol" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify Date format and time zome saved
+ $this->assertEquals( "Your preferences have been saved.",
+ $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ));
+ }
+
+ // Verify restoring all default settings
+ public function testSetAllDefault() {
+
+ $this->open( $this->getUrl() .
+ '/index.php?title=Main_Page&action=edit' );
+ $this->click( "link=My preferences" );
+ $this->waitForPageToLoad( "30000" );
+
+ // Verify restoring all default settings
+ $this->assertEquals( "Restore all default settings",
+ $this->getText( "link=Restore all default settings" ));
+
+ $this->click("//*[@id='preferences']/div/a");
+ $this->waitForPageToLoad("30000");
+
+ // Verify 'This can not be undone' warning message displayed
+ $this->assertTrue($this->isElementPresent("//input[@value='Restore all default settings']"));
+
+ // Verify 'Restore all default settings' button available
+ $this->assertEquals("You can use this page to reset your preferences to the site defaults. This cannot be undone.",
+ $this->getText("//div[@id='bodyContent']/p"));
+
+ $this->click("//input[@value='Restore all default settings']");
+ $this->waitForPageToLoad("30000");
+
+ // Verify preferences saved successfully
+ $this->assertEquals("Your preferences have been saved.",
+ $this->getText("//div[@id='bodyContent']/div[4]/strong/p"));
+ }
+}
+
diff --git a/maintenance/tests/test-prefetch-current.xml b/maintenance/tests/test-prefetch-current.xml
deleted file mode 100644
index a4c8bda3..00000000
--- a/maintenance/tests/test-prefetch-current.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
-<siteinfo>
- <sitename>DemoWiki</sitename>
- <base>http://example.com/wiki/Main_Page</base>
- <generator>MediaWiki 1.5.0</generator>
- <case>first-letter</case>
- <namespaces>
- <namespace key="-2">Media</namespace>
- <namespace key="-1">Special</namespace>
- <namespace key="0"></namespace>
- <namespace key="1">Talk</namespace>
- <namespace key="2">User</namespace>
- <namespace key="3">User talk</namespace>
- <namespace key="4">DemoWiki</namespace>
- <namespace key="5">DemoWIki talk</namespace>
- <namespace key="6">Image</namespace>
- <namespace key="7">Image talk</namespace>
- <namespace key="8">MediaWiki</namespace>
- <namespace key="9">MediaWiki talk</namespace>
- <namespace key="10">Template</namespace>
- <namespace key="11">Template talk</namespace>
- <namespace key="12">Help</namespace>
- <namespace key="13">Help talk</namespace>
- <namespace key="14">Category</namespace>
- <namespace key="15">Category talk</namespace>
- </namespaces>
-</siteinfo>
-<page>
- <title>First page</title>
- <id>1</id>
- <revision>
- <id>1</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 1</comment>
- <text>page 1, rev 1</text>
- </revision>
- <revision>
- <id>2</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 2</comment>
- <text>page 1, rev 2</text>
- </revision>
- <revision>
- <id>4</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 4</comment>
- <text>page 1, rev 4</text>
- </revision>
-</page>
-<page>
- <title>Second page</title>
- <id>2</id>
- <revision>
- <id>3</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 2, rev 3</comment>
- <text>page 2, rev 3</text>
- </revision>
-</page>
-<page>
- <title>Third page</title>
- <id>3</id>
- <revision>
- <id>5</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 3, rev 5</comment>
- <text>page 3, rev 5</text>
- </revision>
-</page>
-</mediawiki>
diff --git a/maintenance/tests/test-prefetch-previous.xml b/maintenance/tests/test-prefetch-previous.xml
deleted file mode 100644
index 95eb82dd..00000000
--- a/maintenance/tests/test-prefetch-previous.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
-<siteinfo>
- <sitename>DemoWiki</sitename>
- <base>http://example.com/wiki/Main_Page</base>
- <generator>MediaWiki 1.5.0</generator>
- <case>first-letter</case>
- <namespaces>
- <namespace key="-2">Media</namespace>
- <namespace key="-1">Special</namespace>
- <namespace key="0"></namespace>
- <namespace key="1">Talk</namespace>
- <namespace key="2">User</namespace>
- <namespace key="3">User talk</namespace>
- <namespace key="4">DemoWiki</namespace>
- <namespace key="5">DemoWIki talk</namespace>
- <namespace key="6">Image</namespace>
- <namespace key="7">Image talk</namespace>
- <namespace key="8">MediaWiki</namespace>
- <namespace key="9">MediaWiki talk</namespace>
- <namespace key="10">Template</namespace>
- <namespace key="11">Template talk</namespace>
- <namespace key="12">Help</namespace>
- <namespace key="13">Help talk</namespace>
- <namespace key="14">Category</namespace>
- <namespace key="15">Category talk</namespace>
- </namespaces>
-</siteinfo>
-<page>
- <title>First page</title>
- <id>1</id>
- <revision>
- <id>1</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 1</comment>
- <text>page 1, rev 1</text>
- </revision>
- <revision>
- <id>2</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 2</comment>
- <text>page 1, rev 2</text>
- </revision>
-</page>
-<page>
- <title>Second page</title>
- <id>2</id>
- <revision>
- <id>3</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 2, rev 3</comment>
- <text>page 2, rev 3</text>
- </revision>
-</page>
-</mediawiki>
diff --git a/maintenance/tests/test-prefetch-stub.xml b/maintenance/tests/test-prefetch-stub.xml
deleted file mode 100644
index 59d43d2f..00000000
--- a/maintenance/tests/test-prefetch-stub.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
-<siteinfo>
- <sitename>DemoWiki</sitename>
- <base>http://example.com/wiki/Main_Page</base>
- <generator>MediaWiki 1.5.0</generator>
- <case>first-letter</case>
- <namespaces>
- <namespace key="-2">Media</namespace>
- <namespace key="-1">Special</namespace>
- <namespace key="0"></namespace>
- <namespace key="1">Talk</namespace>
- <namespace key="2">User</namespace>
- <namespace key="3">User talk</namespace>
- <namespace key="4">DemoWiki</namespace>
- <namespace key="5">DemoWIki talk</namespace>
- <namespace key="6">Image</namespace>
- <namespace key="7">Image talk</namespace>
- <namespace key="8">MediaWiki</namespace>
- <namespace key="9">MediaWiki talk</namespace>
- <namespace key="10">Template</namespace>
- <namespace key="11">Template talk</namespace>
- <namespace key="12">Help</namespace>
- <namespace key="13">Help talk</namespace>
- <namespace key="14">Category</namespace>
- <namespace key="15">Category talk</namespace>
- </namespaces>
-</siteinfo>
-<page>
- <title>First page</title>
- <id>1</id>
- <revision>
- <id>1</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 1</comment>
- <text id="1" />
- </revision>
- <revision>
- <id>2</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 2</comment>
- <text id="2" />
- </revision>
- <revision>
- <id>4</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 1, rev 4</comment>
- <text id="4" />
- </revision>
-</page>
-<page>
- <title>Second page</title>
- <id>2</id>
- <revision>
- <id>3</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 2, rev 3</comment>
- <text id="3" />
- </revision>
-</page>
-<page>
- <title>Third page</title>
- <id>3</id>
- <revision>
- <id>5</id>
- <timestamp>2001-01-15T12:00:00Z</timestamp>
- <contributor><ip>10.0.0.1</ip></contributor>
- <comment>page 3, rev 5</comment>
- <text id="5" />
- </revision>
-</page>
-</mediawiki>
diff --git a/maintenance/tests/testHelpers.inc b/maintenance/tests/testHelpers.inc
new file mode 100644
index 00000000..94ca6abc
--- /dev/null
+++ b/maintenance/tests/testHelpers.inc
@@ -0,0 +1,652 @@
+<?php
+
+/**
+ * @ingroup Maintenance
+ *
+ * Set of classes to help with test output and such. Right now pretty specific
+ * to the parser tests but could be more useful one day :)
+ *
+ * @todo Fixme: Make this more generic
+ */
+
+class AnsiTermColorer {
+ function __construct() {
+ }
+
+ /**
+ * Return ANSI terminal escape code for changing text attribs/color
+ *
+ * @param $color String: semicolon-separated list of attribute/color codes
+ * @return String
+ */
+ public function color( $color ) {
+ global $wgCommandLineDarkBg;
+
+ $light = $wgCommandLineDarkBg ? "1;" : "0;";
+
+ return "\x1b[{$light}{$color}m";
+ }
+
+ /**
+ * Return ANSI terminal escape code for restoring default text attributes
+ *
+ * @return String
+ */
+ public function reset() {
+ return $this->color( 0 );
+ }
+}
+
+/* A colour-less terminal */
+class DummyTermColorer {
+ public function color( $color ) {
+ return '';
+ }
+
+ public function reset() {
+ return '';
+ }
+}
+
+class TestRecorder {
+ var $parent;
+ var $term;
+
+ function __construct( $parent ) {
+ $this->parent = $parent;
+ $this->term = $parent->term;
+ }
+
+ function start() {
+ $this->total = 0;
+ $this->success = 0;
+ }
+
+ function record( $test, $result ) {
+ $this->total++;
+ $this->success += ( $result ? 1 : 0 );
+ }
+
+ function end() {
+ // dummy
+ }
+
+ function report() {
+ if ( $this->total > 0 ) {
+ $this->reportPercentage( $this->success, $this->total );
+ } else {
+ wfDie( "No tests found.\n" );
+ }
+ }
+
+ function reportPercentage( $success, $total ) {
+ $ratio = wfPercent( 100 * $success / $total );
+ print $this->term->color( 1 ) . "Passed $success of $total tests ($ratio)... ";
+
+ if ( $success == $total ) {
+ print $this->term->color( 32 ) . "ALL TESTS PASSED!";
+ } else {
+ $failed = $total - $success ;
+ print $this->term->color( 31 ) . "$failed tests failed!";
+ }
+
+ print $this->term->reset() . "\n";
+
+ return ( $success == $total );
+ }
+}
+
+class DbTestPreviewer extends TestRecorder {
+ protected $lb; // /< Database load balancer
+ protected $db; // /< Database connection to the main DB
+ protected $curRun; // /< run ID number for the current run
+ protected $prevRun; // /< run ID number for the previous run, if any
+ protected $results; // /< Result array
+
+ /**
+ * This should be called before the table prefix is changed
+ */
+ function __construct( $parent ) {
+ parent::__construct( $parent );
+
+ $this->lb = wfGetLBFactory()->newMainLB();
+ // This connection will have the wiki's table prefix, not parsertest_
+ $this->db = $this->lb->getConnection( DB_MASTER );
+ }
+
+ /**
+ * Set up result recording; insert a record for the run with the date
+ * and all that fun stuff
+ */
+ function start() {
+ parent::start();
+
+ if ( ! $this->db->tableExists( 'testrun' )
+ or ! $this->db->tableExists( 'testitem' ) )
+ {
+ print "WARNING> `testrun` table not found in database.\n";
+ $this->prevRun = false;
+ } else {
+ // We'll make comparisons against the previous run later...
+ $this->prevRun = $this->db->selectField( 'testrun', 'MAX(tr_id)' );
+ }
+
+ $this->results = array();
+ }
+
+ function record( $test, $result ) {
+ parent::record( $test, $result );
+ $this->results[$test] = $result;
+ }
+
+ function report() {
+ if ( $this->prevRun ) {
+ // f = fail, p = pass, n = nonexistent
+ // codes show before then after
+ $table = array(
+ 'fp' => 'previously failing test(s) now PASSING! :)',
+ 'pn' => 'previously PASSING test(s) removed o_O',
+ 'np' => 'new PASSING test(s) :)',
+
+ 'pf' => 'previously passing test(s) now FAILING! :(',
+ 'fn' => 'previously FAILING test(s) removed O_o',
+ 'nf' => 'new FAILING test(s) :(',
+ 'ff' => 'still FAILING test(s) :(',
+ );
+
+ $prevResults = array();
+
+ $res = $this->db->select( 'testitem', array( 'ti_name', 'ti_success' ),
+ array( 'ti_run' => $this->prevRun ), __METHOD__ );
+
+ foreach ( $res as $row ) {
+ if ( !$this->parent->regex
+ || preg_match( "/{$this->parent->regex}/i", $row->ti_name ) )
+ {
+ $prevResults[$row->ti_name] = $row->ti_success;
+ }
+ }
+
+ $combined = array_keys( $this->results + $prevResults );
+
+ # Determine breakdown by change type
+ $breakdown = array();
+ foreach ( $combined as $test ) {
+ if ( !isset( $prevResults[$test] ) ) {
+ $before = 'n';
+ } elseif ( $prevResults[$test] == 1 ) {
+ $before = 'p';
+ } else /* if ( $prevResults[$test] == 0 )*/ {
+ $before = 'f';
+ }
+
+ if ( !isset( $this->results[$test] ) ) {
+ $after = 'n';
+ } elseif ( $this->results[$test] == 1 ) {
+ $after = 'p';
+ } else /*if ( $this->results[$test] == 0 ) */ {
+ $after = 'f';
+ }
+
+ $code = $before . $after;
+
+ if ( isset( $table[$code] ) ) {
+ $breakdown[$code][$test] = $this->getTestStatusInfo( $test, $after );
+ }
+ }
+
+ # Write out results
+ foreach ( $table as $code => $label ) {
+ if ( !empty( $breakdown[$code] ) ) {
+ $count = count( $breakdown[$code] );
+ printf( "\n%4d %s\n", $count, $label );
+
+ foreach ( $breakdown[$code] as $differing_test_name => $statusInfo ) {
+ print " * $differing_test_name [$statusInfo]\n";
+ }
+ }
+ }
+ } else {
+ print "No previous test runs to compare against.\n";
+ }
+
+ print "\n";
+ parent::report();
+ }
+
+ /**
+ * Returns a string giving information about when a test last had a status change.
+ * Could help to track down when regressions were introduced, as distinct from tests
+ * which have never passed (which are more change requests than regressions).
+ */
+ private function getTestStatusInfo( $testname, $after ) {
+ // If we're looking at a test that has just been removed, then say when it first appeared.
+ if ( $after == 'n' ) {
+ $changedRun = $this->db->selectField ( 'testitem',
+ 'MIN(ti_run)',
+ array( 'ti_name' => $testname ),
+ __METHOD__ );
+ $appear = $this->db->selectRow ( 'testrun',
+ array( 'tr_date', 'tr_mw_version' ),
+ array( 'tr_id' => $changedRun ),
+ __METHOD__ );
+
+ return "First recorded appearance: "
+ . date( "d-M-Y H:i:s", strtotime ( $appear->tr_date ) )
+ . ", " . $appear->tr_mw_version;
+ }
+
+ // Otherwise, this test has previous recorded results.
+ // See when this test last had a different result to what we're seeing now.
+ $conds = array(
+ 'ti_name' => $testname,
+ 'ti_success' => ( $after == 'f' ? "1" : "0" ) );
+
+ if ( $this->curRun ) {
+ $conds[] = "ti_run != " . $this->db->addQuotes ( $this->curRun );
+ }
+
+ $changedRun = $this->db->selectField ( 'testitem', 'MAX(ti_run)', $conds, __METHOD__ );
+
+ // If no record of ever having had a different result.
+ if ( is_null ( $changedRun ) ) {
+ if ( $after == "f" ) {
+ return "Has never passed";
+ } else {
+ return "Has never failed";
+ }
+ }
+
+ // Otherwise, we're looking at a test whose status has changed.
+ // (i.e. it used to work, but now doesn't; or used to fail, but is now fixed.)
+ // In this situation, give as much info as we can as to when it changed status.
+ $pre = $this->db->selectRow ( 'testrun',
+ array( 'tr_date', 'tr_mw_version' ),
+ array( 'tr_id' => $changedRun ),
+ __METHOD__ );
+ $post = $this->db->selectRow ( 'testrun',
+ array( 'tr_date', 'tr_mw_version' ),
+ array( "tr_id > " . $this->db->addQuotes ( $changedRun ) ),
+ __METHOD__,
+ array( "LIMIT" => 1, "ORDER BY" => 'tr_id' )
+ );
+
+ if ( $post ) {
+ $postDate = date( "d-M-Y H:i:s", strtotime ( $post->tr_date ) ) . ", {$post->tr_mw_version}";
+ } else {
+ $postDate = 'now';
+ }
+
+ return ( $after == "f" ? "Introduced" : "Fixed" ) . " between "
+ . date( "d-M-Y H:i:s", strtotime ( $pre->tr_date ) ) . ", " . $pre->tr_mw_version
+ . " and $postDate";
+
+ }
+
+ /**
+ * Commit transaction and clean up for result recording
+ */
+ function end() {
+ $this->lb->commitMasterChanges();
+ $this->lb->closeAll();
+ parent::end();
+ }
+
+}
+
+class DbTestRecorder extends DbTestPreviewer {
+ var $version;
+
+ /**
+ * Set up result recording; insert a record for the run with the date
+ * and all that fun stuff
+ */
+ function start() {
+ global $wgDBtype;
+ $this->db->begin();
+
+ if ( ! $this->db->tableExists( 'testrun' )
+ or ! $this->db->tableExists( 'testitem' ) )
+ {
+ print "WARNING> `testrun` table not found in database. Trying to create table.\n";
+ $this->db->sourceFile( $this->db->patchPath( 'patch-testrun.sql' ) );
+ echo "OK, resuming.\n";
+ }
+
+ parent::start();
+
+ $this->db->insert( 'testrun',
+ array(
+ 'tr_date' => $this->db->timestamp(),
+ 'tr_mw_version' => $this->version,
+ 'tr_php_version' => phpversion(),
+ 'tr_db_version' => $this->db->getServerVersion(),
+ 'tr_uname' => php_uname()
+ ),
+ __METHOD__ );
+ if ( $wgDBtype === 'postgres' ) {
+ $this->curRun = $this->db->currentSequenceValue( 'testrun_id_seq' );
+ } else {
+ $this->curRun = $this->db->insertId();
+ }
+ }
+
+ /**
+ * Record an individual test item's success or failure to the db
+ *
+ * @param $test String
+ * @param $result Boolean
+ */
+ function record( $test, $result ) {
+ parent::record( $test, $result );
+
+ $this->db->insert( 'testitem',
+ array(
+ 'ti_run' => $this->curRun,
+ 'ti_name' => $test,
+ 'ti_success' => $result ? 1 : 0,
+ ),
+ __METHOD__ );
+ }
+}
+
+class RemoteTestRecorder extends TestRecorder {
+ function start() {
+ parent::start();
+
+ $this->results = array();
+ $this->ping( 'running' );
+ }
+
+ function record( $test, $result ) {
+ parent::record( $test, $result );
+ $this->results[$test] = (bool)$result;
+ }
+
+ function end() {
+ $this->ping( 'complete', $this->results );
+ parent::end();
+ }
+
+ /**
+ * Inform a CodeReview instance that we've started or completed a test run...
+ *
+ * @param $status string: "running" - tell it we've started
+ * "complete" - provide test results array
+ * "abort" - something went horribly awry
+ * @param $results array of test name => true/false
+ */
+ function ping( $status, $results = false ) {
+ global $wgParserTestRemote, $IP;
+
+ $remote = $wgParserTestRemote;
+ $revId = SpecialVersion::getSvnRevision( $IP );
+ $jsonResults = FormatJson::encode( $results );
+
+ if ( !$remote ) {
+ print "Can't do remote upload without configuring \$wgParserTestRemote!\n";
+ exit( 1 );
+ }
+
+ // Generate a hash MAC to validate our credentials
+ $message = array(
+ $remote['repo'],
+ $remote['suite'],
+ $revId,
+ $status,
+ );
+
+ if ( $status == "complete" ) {
+ $message[] = $jsonResults;
+ }
+ $hmac = hash_hmac( "sha1", implode( "|", $message ), $remote['secret'] );
+
+ $postData = array(
+ 'action' => 'codetestupload',
+ 'format' => 'json',
+ 'repo' => $remote['repo'],
+ 'suite' => $remote['suite'],
+ 'rev' => $revId,
+ 'status' => $status,
+ 'hmac' => $hmac,
+ );
+
+ if ( $status == "complete" ) {
+ $postData['results'] = $jsonResults;
+ }
+
+ $response = $this->post( $remote['api-url'], $postData );
+
+ if ( $response === false ) {
+ print "CodeReview info upload failed to reach server.\n";
+ exit( 1 );
+ }
+
+ $responseData = FormatJson::decode( $response, true );
+
+ if ( !is_array( $responseData ) ) {
+ print "CodeReview API response not recognized...\n";
+ wfDebug( "Unrecognized CodeReview API response: $response\n" );
+ exit( 1 );
+ }
+
+ if ( isset( $responseData['error'] ) ) {
+ $code = $responseData['error']['code'];
+ $info = $responseData['error']['info'];
+ print "CodeReview info upload failed: $code $info\n";
+ exit( 1 );
+ }
+ }
+
+ function post( $url, $data ) {
+ return Http::post( $url, array( 'postData' => $data ) );
+ }
+}
+
+class TestFileIterator implements Iterator {
+ private $file;
+ private $fh;
+ private $parserTest; /* An instance of ParserTest (parserTests.php) or MediaWikiParserTest (phpunit) */
+ private $index = 0;
+ private $test;
+ private $lineNum;
+ private $eof;
+
+ function __construct( $file, $parserTest = null ) {
+ global $IP;
+
+ $this->file = $file;
+ $this->fh = fopen( $this->file, "rt" );
+
+ if ( !$this->fh ) {
+ wfDie( "Couldn't open file '$file'\n" );
+ }
+
+ $this->parserTest = $parserTest;
+
+ if ( $this->parserTest ) {
+ $this->parserTest->showRunFile( wfRelativePath( $this->file, $IP ) );
+ }
+
+ $this->lineNum = $this->index = 0;
+ }
+
+ function rewind() {
+ if ( fseek( $this->fh, 0 ) ) {
+ wfDie( "Couldn't fseek to the start of '$this->file'\n" );
+ }
+
+ $this->index = -1;
+ $this->lineNum = 0;
+ $this->eof = false;
+ $this->next();
+
+ return true;
+ }
+
+ function current() {
+ return $this->test;
+ }
+
+ function key() {
+ return $this->index;
+ }
+
+ function next() {
+ if ( $this->readNextTest() ) {
+ $this->index++;
+ return true;
+ } else {
+ $this->eof = true;
+ }
+ }
+
+ function valid() {
+ return $this->eof != true;
+ }
+
+ function readNextTest() {
+ $data = array();
+ $section = null;
+
+ while ( false !== ( $line = fgets( $this->fh ) ) ) {
+ $this->lineNum++;
+ $matches = array();
+
+ if ( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
+ $section = strtolower( $matches[1] );
+
+ if ( $section == 'endarticle' ) {
+ if ( !isset( $data['text'] ) ) {
+ wfDie( "'endarticle' without 'text' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ if ( !isset( $data['article'] ) ) {
+ wfDie( "'endarticle' without 'article' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ if ( $this->parserTest ) {
+ $this->parserTest->addArticle( ParserTest::chomp( $data['article'] ), $data['text'], $this->lineNum );
+ } else {wfDie("JAJA");
+ ParserTest::addArticle( $data['article'], $data['text'], $this->lineNum );
+ }
+ $data = array();
+ $section = null;
+
+ continue;
+ }
+
+ if ( $section == 'endhooks' ) {
+ if ( !isset( $data['hooks'] ) ) {
+ wfDie( "'endhooks' without 'hooks' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ foreach ( explode( "\n", $data['hooks'] ) as $line ) {
+ $line = trim( $line );
+
+ if ( $line ) {
+ if ( $this->parserTest && !$this->parserTest->requireHook( $line ) ) {
+ return false;
+ }
+ }
+ }
+
+ $data = array();
+ $section = null;
+
+ continue;
+ }
+
+ if ( $section == 'endfunctionhooks' ) {
+ if ( !isset( $data['functionhooks'] ) ) {
+ wfDie( "'endfunctionhooks' without 'functionhooks' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ foreach ( explode( "\n", $data['functionhooks'] ) as $line ) {
+ $line = trim( $line );
+
+ if ( $line ) {
+ if ( $this->parserTest && !$this->parserTest->requireFunctionHook( $line ) ) {
+ return false;
+ }
+ }
+ }
+
+ $data = array();
+ $section = null;
+
+ continue;
+ }
+
+ if ( $section == 'end' ) {
+ if ( !isset( $data['test'] ) ) {
+ wfDie( "'end' without 'test' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ if ( !isset( $data['input'] ) ) {
+ wfDie( "'end' without 'input' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ if ( !isset( $data['result'] ) ) {
+ wfDie( "'end' without 'result' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ if ( !isset( $data['options'] ) ) {
+ $data['options'] = '';
+ }
+
+ if ( !isset( $data['config'] ) )
+ $data['config'] = '';
+
+ if ( $this->parserTest
+ && ( ( preg_match( '/\\bdisabled\\b/i', $data['options'] ) && !$this->parserTest->runDisabled )
+ || !preg_match( "/" . $this->parserTest->regex . "/i", $data['test'] ) ) ) {
+ # disabled test
+ $data = array();
+ $section = null;
+
+ continue;
+ }
+
+ global $wgUseTeX;
+
+ if ( $this->parserTest &&
+ preg_match( '/\\bmath\\b/i', $data['options'] ) && !$wgUseTeX ) {
+ # don't run math tests if $wgUseTeX is set to false in LocalSettings
+ $data = array();
+ $section = null;
+
+ continue;
+ }
+
+ if ( $this->parserTest ) {
+ $this->test = array(
+ 'test' => ParserTest::chomp( $data['test'] ),
+ 'input' => ParserTest::chomp( $data['input'] ),
+ 'result' => ParserTest::chomp( $data['result'] ),
+ 'options' => ParserTest::chomp( $data['options'] ),
+ 'config' => ParserTest::chomp( $data['config'] ) );
+ } else {
+ $this->test['test'] = $data['test'];
+ }
+
+ return true;
+ }
+
+ if ( isset ( $data[$section] ) ) {
+ wfDie( "duplicate section '$section' at line {$this->lineNum} of $this->file\n" );
+ }
+
+ $data[$section] = '';
+
+ continue;
+ }
+
+ if ( $section ) {
+ $data[$section] .= $line;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/maintenance/undelete.php b/maintenance/undelete.php
index 099ea88d..50bf791a 100644
--- a/maintenance/undelete.php
+++ b/maintenance/undelete.php
@@ -6,7 +6,7 @@
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class Undelete extends Maintenance {
public function __construct() {
@@ -37,4 +37,4 @@ class Undelete extends Maintenance {
}
$maintClass = "Undelete";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/update.php b/maintenance/update.php
index 5977a4c1..e3941a3c 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -3,58 +3,121 @@
* Run all updaters.
*
* This is used when the database schema is modified and we need to apply patches.
+ * It is kept compatible with php 4 parsing so that it can give out a meaningful error.
*
* @file
* @todo document
* @ingroup Maintenance
*/
-/** */
-define( 'MW_CMDLINE_CALLBACK', 'wfSetupUpdateScript' );
+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" .
+ "Check if you have a newer php executable with a different name, such as php5.\n";
+ die( 1 );
+}
+
$wgUseMasterForMaintenance = true;
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-require( "updaters.inc" );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-$wgTitle = Title::newFromText( "MediaWiki database updater" );
+class UpdateMediaWiki extends Maintenance {
-echo( "MediaWiki {$wgVersion} Updater\n\n" );
+ function __construct() {
+ parent::__construct();
+ $this->mDescription = "MediaWiki database updater";
+ $this->addOption( 'skip-compat-checks', 'Skips compatibility checks, mostly for developers' );
+ $this->addOption( 'quick', 'Skip 5 second countdown before starting' );
+ $this->addOption( 'doshared', 'Also update shared tables' );
+ $this->addOption( 'nopurge', 'Do not purge the objectcache table after updates' );
+ }
-if( !isset( $options['skip-compat-checks'] ) ) {
- install_version_checks();
-} else {
- print "Skipping compatibility checks, proceed at your own risk (Ctrl+C to abort)\n";
- wfCountdown(5);
-}
+ function getDbType() {
+ /* If we used the class constant PHP4 would give a parser error here */
+ return 2 /* Maintenance::DB_ADMIN */;
+ }
-# Attempt to connect to the database as a privileged user
-# This will vomit up an error if there are permissions problems
-$wgDatabase = wfGetDB( DB_MASTER );
+ function compatChecks() {
+ $test = new PhpXmlBugTester();
+ if ( !$test->ok ) {
+ $this->error(
+ "Your system has a combination of PHP and libxml2 versions which is buggy\n" .
+ "and can cause hidden data corruption in MediaWiki and other web apps.\n" .
+ "Upgrade to PHP 5.2.9 or later and libxml2 2.7.3 or later!\n" .
+ "ABORTING (see http://bugs.php.net/bug.php?id=45996).\n",
+ true );
+ }
-print "Going to run database updates for ".wfWikiID()."\n";
-print "Depending on the size of your database this may take a while!\n";
+ $test = new PhpRefCallBugTester;
+ $test->execute();
+ if ( !$test->ok ) {
+ $ver = phpversion();
+ $this->error(
+ "PHP $ver is not compatible with MediaWiki due to a bug involving\n" .
+ "reference parameters to __call. Upgrade to PHP 5.3.2 or higher, or \n" .
+ "downgrade to PHP 5.3.0 to fix this.\n" .
+ "ABORTING (see http://bugs.php.net/bug.php?id=50394 for details)\n",
+ true );
+ }
+ }
-if( !isset( $options['quick'] ) ) {
- print "Abort with control-c in the next five seconds (skip this countdown with --quick) ... ";
- wfCountDown( 5 );
-}
+ function execute() {
+ global $wgVersion, $wgTitle, $wgLang;
+
+ $wgLang = Language::factory( 'en' );
+ $wgTitle = Title::newFromText( "MediaWiki database updater" );
+
+ $this->output( "MediaWiki {$wgVersion} Updater\n\n" );
+
+ if ( !$this->hasOption( 'skip-compat-checks' ) ) {
+ $this->compatChecks();
+ } else {
+ $this->output( "Skipping compatibility checks, proceed at your own risk (Ctrl+C to abort)\n" );
+ wfCountdown( 5 );
+ }
-$shared = isset( $options['doshared'] );
-$purge = !isset( $options['nopurge'] );
+ # Attempt to connect to the database as a privileged user
+ # This will vomit up an error if there are permissions problems
+ $db = wfGetDB( DB_MASTER );
-do_all_updates( $shared, $purge );
+ $this->output( "Going to run database updates for " . wfWikiID() . "\n" );
+ $this->output( "Depending on the size of your database this may take a while!\n" );
-print "Done.\n";
+ if ( !$this->hasOption( 'quick' ) ) {
+ $this->output( "Abort with control-c in the next five seconds (skip this countdown with --quick) ... " );
+ wfCountDown( 5 );
+ }
-function wfSetupUpdateScript() {
- global $wgLocalisationCacheConf;
+ $shared = $this->hasOption( 'doshared' );
- # Don't try to access the database
- # This needs to be disabled early since extensions will try to use the l10n
- # cache from $wgExtensionSetupFunctions (bug 20471)
- $wgLocalisationCacheConf = array(
- 'class' => 'LocalisationCache',
- 'storeClass' => 'LCStore_Null',
- 'storeDirectory' => false,
- 'manualRecache' => false,
- );
+ $updates = array('core','extensions');
+ if( !$this->hasOption('nopurge') ) {
+ $updates[] = 'purge';
+ }
+
+ $updater = DatabaseUpdater::newForDb( $db, $shared, $this );
+ $updater->doUpdates( $updates );
+
+ foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
+ $child = $this->runChild( $maint );
+ $child->execute();
+ }
+
+ $this->output( "\nDone.\n" );
+ }
+
+ function afterFinalSetup() {
+ global $wgLocalisationCacheConf;
+
+ # Don't try to access the database
+ # This needs to be disabled early since extensions will try to use the l10n
+ # cache from $wgExtensionFunctions (bug 20471)
+ $wgLocalisationCacheConf = array(
+ 'class' => 'LocalisationCache',
+ 'storeClass' => 'LCStore_Null',
+ 'storeDirectory' => false,
+ 'manualRecache' => false,
+ );
+ }
}
+
+$maintClass = 'UpdateMediaWiki';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updateArticleCount.php b/maintenance/updateArticleCount.php
index e6818458..b0dceb58 100644
--- a/maintenance/updateArticleCount.php
+++ b/maintenance/updateArticleCount.php
@@ -18,11 +18,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
* @author Rob Church <robchur@gmail.com>
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class UpdateArticleCount extends Maintenance {
@@ -40,10 +41,10 @@ class UpdateArticleCount extends Maintenance {
$this->namespaces = $wgContentNamespaces;
$this->output( "Counting articles..." );
$result = $this->count();
-
- if( $result !== false ) {
+
+ if ( $result !== false ) {
$this->output( "found {$result}.\n" );
- if( $this->hasOption( 'update' ) ) {
+ if ( $this->hasOption( 'update' ) ) {
$this->output( "Updating site statistics table... " );
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'site_stats', array( 'ss_good_articles' => $result ), array( 'ss_row_id' => 1 ), __METHOD__ );
@@ -63,7 +64,7 @@ class UpdateArticleCount extends Maintenance {
* @return string
*/
private function makeNsSet() {
- foreach( $this->namespaces as $namespace )
+ foreach ( $this->namespaces as $namespace )
$namespaces[] = intval( $namespace );
return implode( ', ', $namespaces );
}
@@ -92,10 +93,9 @@ class UpdateArticleCount extends Maintenance {
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->query( $this->makeSql( $dbr ), __METHOD__ );
$row = $dbr->fetchObject( $res );
- $dbr->freeResult( $res );
return $row ? $row->pagecount : false;
}
}
$maintClass = "UpdateArticleCount";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php
new file mode 100644
index 00000000..e890bce7
--- /dev/null
+++ b/maintenance/updateCollation.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * @file
+ * @ingroup Maintenance
+ * @author Aryeh Gregor (Simetrical)
+ */
+
+#$optionsWithArgs = array( 'begin', 'max-slave-lag' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class UpdateCollation extends Maintenance {
+ const BATCH_SIZE = 50;
+
+ public function __construct() {
+ parent::__construct();
+
+ global $wgCategoryCollation;
+ $this->mDescription = <<<TEXT
+This script will find all rows in the categorylinks table whose collation is
+out-of-date (cl_collation != '$wgCategoryCollation') and repopulate cl_sortkey
+using the page title and cl_sortkey_prefix. If everything's collation is
+up-to-date, it will do nothing.
+TEXT;
+
+ $this->addOption( 'force', 'Run on all rows, even if the collation is ' .
+ 'supposed to be up-to-date.' );
+ }
+
+ public function syncDBs() {
+ $lb = wfGetLB();
+ // bug 27975 - Don't try to wait for slaves if there are none
+ // Prevents permission error when getting master position
+ if ( $lb->getServerCount() > 1 ) {
+ $dbw = $lb->getConnection( DB_MASTER );
+ $pos = $dbw->getMasterPos();
+ $lb->waitForAll( $pos );
+ }
+ }
+
+ public function execute() {
+ global $wgCategoryCollation, $wgMiserMode;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $force = $this->getOption( 'force' );
+
+ $options = array( 'LIMIT' => self::BATCH_SIZE );
+
+ if ( $force ) {
+ $options['ORDER BY'] = 'cl_from, cl_to';
+ $collationConds = array();
+ } else {
+ $collationConds = array( 0 =>
+ 'cl_collation != ' . $dbw->addQuotes( $wgCategoryCollation ) );
+
+ if ( !$wgMiserMode ) {
+ $count = $dbw->selectField(
+ 'categorylinks',
+ 'COUNT(*)',
+ $collationConds,
+ __METHOD__
+ );
+
+ if ( $count == 0 ) {
+ $this->output( "Collations up-to-date.\n" );
+ return;
+ }
+ $this->output( "Fixing collation for $count rows.\n" );
+ }
+ }
+
+ $count = 0;
+ $row = false;
+ $batchConds = array();
+ do {
+ $this->output( 'Processing next ' . self::BATCH_SIZE . ' rows... ');
+ $res = $dbw->select(
+ array( 'categorylinks', 'page' ),
+ array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation',
+ 'cl_sortkey', 'page_namespace', 'page_title'
+ ),
+ array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ),
+ __METHOD__,
+ $options
+ );
+
+ $dbw->begin();
+ foreach ( $res as $row ) {
+ $title = Title::newFromRow( $row );
+ if ( !$row->cl_collation ) {
+ # This is an old-style row, so the sortkey needs to be
+ # converted.
+ if ( $row->cl_sortkey == $title->getText()
+ || $row->cl_sortkey == $title->getPrefixedText() ) {
+ $prefix = '';
+ } else {
+ # Custom sortkey, use it as a prefix
+ $prefix = $row->cl_sortkey;
+ }
+ } else {
+ $prefix = $row->cl_sortkey_prefix;
+ }
+ # cl_type will be wrong for lots of pages if cl_collation is 0,
+ # so let's update it while we're here.
+ if ( $title->getNamespace() == NS_CATEGORY ) {
+ $type = 'subcat';
+ } elseif ( $title->getNamespace() == NS_FILE ) {
+ $type = 'file';
+ } else {
+ $type = 'page';
+ }
+ $dbw->update(
+ 'categorylinks',
+ array(
+ 'cl_sortkey' => Collation::singleton()->getSortKey(
+ $title->getCategorySortkey( $prefix ) ),
+ 'cl_sortkey_prefix' => $prefix,
+ 'cl_collation' => $wgCategoryCollation,
+ 'cl_type' => $type,
+ 'cl_timestamp = cl_timestamp',
+ ),
+ array( 'cl_from' => $row->cl_from, 'cl_to' => $row->cl_to ),
+ __METHOD__
+ );
+ }
+ $dbw->commit();
+
+ if ( $force && $row ) {
+ $encFrom = $dbw->addQuotes( $row->cl_from );
+ $encTo = $dbw->addQuotes( $row->cl_to );
+ $batchConds = array(
+ "(cl_from = $encFrom AND cl_to > $encTo) " .
+ " OR cl_from > $encFrom" );
+ }
+
+ $count += $res->numRows();
+ $this->output( "$count done.\n" );
+
+ $this->syncDBs();
+ } while ( $res->numRows() == self::BATCH_SIZE );
+ }
+}
+
+$maintClass = "UpdateCollation";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updateDoubleWidthSearch.php b/maintenance/updateDoubleWidthSearch.php
new file mode 100644
index 00000000..bfbc441f
--- /dev/null
+++ b/maintenance/updateDoubleWidthSearch.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Script to normalize double-byte latin UTF-8 characters
+ *
+ * Usage: php updateDoubleWidthSearch.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 Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class UpdateDoubleWidthSearch extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Script to normalize double-byte latin UTF-8 characters";
+ $this->addOption( 'q', 'quiet', false, true );
+ $this->addOption( 'l', 'How long the searchindex and revision tables will be locked for', false, true );
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_ADMIN;
+ }
+
+ public function execute() {
+ $maxLockTime = $this->getOption( 'l', 20 );
+
+ $dbw = wfGetDB( DB_MASTER );
+ if ( $dbw->getType() !== 'mysql' ) {
+ $this->output( "This change is only needed on MySQL, quitting.\n" );
+ exit( 1 );
+ }
+
+ $res = $this->findRows( $dbw );
+ $this->updateSearchIndex( $maxLockTime, array( $this, 'searchIndexUpdateCallback' ), $dbw, $res );
+
+ $this->output( "Done\n" );
+ }
+
+ public function searchIndexUpdateCallback( $dbw, $row ) {
+ return $this->updateSearchIndexForPage( $dbw, $row->si_page );
+ }
+
+ private function findRows( $dbw ) {
+ $searchindex = $dbw->tableName( 'searchindex' );
+ $regexp = '[[:<:]]u8efbd([89][1-9a]|8[b-f]|90)[[:>:]]';
+ $sql = "SELECT si_page FROM $searchindex
+ WHERE ( si_text RLIKE '$regexp' )
+ OR ( si_title RLIKE '$regexp' )";
+ return $dbw->query( $sql, __METHOD__ );
+ }
+}
+
+$maintClass = "UpdateDoubleWidthSearch";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updateRestrictions.php b/maintenance/updateRestrictions.php
index 80e98fd0..c815f4b9 100644
--- a/maintenance/updateRestrictions.php
+++ b/maintenance/updateRestrictions.php
@@ -20,10 +20,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class UpdateRestrictions extends Maintenance {
public function __construct() {
@@ -34,48 +35,48 @@ class UpdateRestrictions extends Maintenance {
public function execute() {
$db = wfGetDB( DB_MASTER );
- if( !$db->tableExists( 'page_restrictions' ) ) {
+ if ( !$db->tableExists( 'page_restrictions' ) ) {
$this->error( "page_restrictions table does not exist", true );
}
$start = $db->selectField( 'page', 'MIN(page_id)', false, __METHOD__ );
- if( !$start ) {
+ if ( !$start ) {
$this->error( "Nothing to do.", true );
}
$end = $db->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
-
+
# Do remaining chunk
$end += $this->mBatchSize - 1;
$blockStart = $start;
$blockEnd = $start + $this->mBatchSize - 1;
$encodedExpiry = 'infinity';
- while( $blockEnd <= $end ) {
+ while ( $blockEnd <= $end ) {
$this->output( "...doing page_id from $blockStart to $blockEnd\n" );
$cond = "page_id BETWEEN $blockStart AND $blockEnd AND page_restrictions !=''";
- $res = $db->select( 'page', array('page_id','page_namespace','page_restrictions'), $cond, __METHOD__ );
+ $res = $db->select( 'page', array( 'page_id', 'page_namespace', 'page_restrictions' ), $cond, __METHOD__ );
$batch = array();
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$oldRestrictions = array();
- foreach( explode( ':', trim( $row->page_restrictions ) ) as $restrict ) {
+ foreach ( explode( ':', trim( $row->page_restrictions ) ) as $restrict ) {
$temp = explode( '=', trim( $restrict ) );
// Make sure we are not settings restrictions to ""
- if( count($temp) == 1 && $temp[0] ) {
+ if ( count( $temp ) == 1 && $temp[0] ) {
// old old format should be treated as edit/move restriction
$oldRestrictions["edit"] = trim( $temp[0] );
$oldRestrictions["move"] = trim( $temp[0] );
- } else if( $temp[1] ) {
+ } else if ( $temp[1] ) {
$oldRestrictions[$temp[0]] = trim( $temp[1] );
}
}
# Clear invalid columns
- if( $row->page_namespace == NS_MEDIAWIKI ) {
+ if ( $row->page_namespace == NS_MEDIAWIKI ) {
$db->update( 'page', array( 'page_restrictions' => '' ),
array( 'page_id' => $row->page_id ), __FUNCTION__ );
$this->output( "...removed dead page_restrictions column for page {$row->page_id}\n" );
}
# Update restrictions table
- foreach( $oldRestrictions as $action => $restrictions ) {
- $batch[] = array(
+ foreach ( $oldRestrictions as $action => $restrictions ) {
+ $batch[] = array(
'pr_page' => $row->page_id,
'pr_type' => $action,
'pr_level' => $restrictions,
@@ -87,9 +88,9 @@ class UpdateRestrictions extends Maintenance {
# We use insert() and not replace() as Article.php replaces
# page_restrictions with '' when protected in the restrictions table
if ( count( $batch ) ) {
- $ok = $db->deadlockLoop( array( $db, 'insert' ), 'page_restrictions',
+ $ok = $db->deadlockLoop( array( $db, 'insert' ), 'page_restrictions',
$batch, __FUNCTION__, array( 'IGNORE' ) );
- if( !$ok ) {
+ if ( !$ok ) {
throw new MWException( "Deadlock loop failed wtf :(" );
}
}
@@ -101,10 +102,10 @@ class UpdateRestrictions extends Maintenance {
// Kill any broken rows from previous imports
$db->delete( 'page_restrictions', array( 'pr_level' => '' ) );
// Kill other invalid rows
- $db->deleteJoin( 'page_restrictions', 'page', 'pr_page', 'page_id', array('page_namespace' => NS_MEDIAWIKI) );
+ $db->deleteJoin( 'page_restrictions', 'page', 'pr_page', 'page_id', array( 'page_namespace' => NS_MEDIAWIKI ) );
$this->output( "...Done!\n" );
}
}
$maintClass = "UpdateRestrictions";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updateSearchIndex.php b/maintenance/updateSearchIndex.php
index 152ce1b6..97863101 100644
--- a/maintenance/updateSearchIndex.php
+++ b/maintenance/updateSearchIndex.php
@@ -24,10 +24,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class UpdateSearchIndex extends Maintenance {
@@ -48,8 +49,8 @@ class UpdateSearchIndex extends Maintenance {
$posFile = $this->getOption( 'p', 'searchUpdate.' . wfWikiId() . '.pos' );
$end = $this->getOption( 'e', wfTimestampNow() );
if ( $this->hasOption( 's' ) ) {
- $start = $this->getOption('s');
- } elseif( is_readable( 'searchUpdate.pos' ) ) {
+ $start = $this->getOption( 's' );
+ } elseif ( is_readable( 'searchUpdate.pos' ) ) {
# B/c to the old position file name which was hardcoded
# We can safely delete the file when we're done though.
$start = file_get_contents( 'searchUpdate.pos' );
@@ -61,13 +62,21 @@ class UpdateSearchIndex extends Maintenance {
}
}
$lockTime = $this->getOption( 'l', 20 );
-
+
$this->doUpdateSearchIndex( $start, $end, $lockTime );
- $file = fopen( $posFile, 'w' );
- fwrite( $file, $end );
- fclose( $file );
+ if ( is_writable( dirname( realpath( $posFile ) ) ) ) {
+ $file = fopen( $posFile, 'w' );
+ if ( $file !== false ) {
+ fwrite( $file, $end );
+ fclose( $file );
+ } else {
+ $this->output( "*** Couldn't write to the $posFile!\n" );
+ }
+ } else {
+ $this->output( "*** Couldn't write to the $posFile!\n" );
+ }
}
-
+
private function doUpdateSearchIndex( $start, $end, $maxLockTime ) {
global $wgDisableSearchUpdate;
@@ -89,85 +98,25 @@ class UpdateSearchIndex extends Maintenance {
";
$res = $dbw->query( $sql, __METHOD__ );
+ $this->updateSearchIndex( $maxLockTime, array( $this, 'searchIndexUpdateCallback' ), $dbw, $res );
- # Lock searchindex
- if ( $maxLockTime ) {
- $this->output( " --- Waiting for lock ---" );
- $this->lockSearchindex( $dbw );
- $lockTime = time();
- $this->output( "\n" );
- }
-
- # Loop through the results and do a search update
- foreach ( $res as $row ) {
- # Allow reads to be processed
- if ( $maxLockTime && time() > $lockTime + $maxLockTime ) {
- $this->output( " --- Relocking ---" );
- $this->relockSearchindex( $dbw );
- $lockTime = time();
- $this->output( "\n" );
- }
- if ( $row->rc_type == RC_LOG ) {
- continue;
- } elseif ( $row->rc_type == RC_MOVE || $row->rc_type == RC_MOVE_OVER_REDIRECT ) {
- # Rename searchindex entry
- $titleObj = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
- $title = $titleObj->getPrefixedDBkey();
- $this->output( "$title..." );
- $u = new SearchUpdate( $row->rc_cur_id, $title, false );
- $this->output( "\n" );
- } else {
- // Get current revision
- $rev = Revision::loadFromPageId( $dbw, $row->rc_cur_id );
- if( $rev ) {
- $titleObj = $rev->getTitle();
- $title = $titleObj->getPrefixedDBkey();
- $this->output( $title );
- # Update searchindex
- $u = new SearchUpdate( $row->rc_cur_id, $titleObj->getText(), $rev->getText() );
- $u->doUpdate();
- $this->output( "\n" );
- }
- }
- }
-
- # Unlock searchindex
- if ( $maxLockTime ) {
- $this->output( " --- Unlocking --" );
- $this->unlockSearchindex( $dbw );
- $this->output( "\n" );
- }
$this->output( "Done\n" );
}
- /**
- * Lock the search index
- * @param &$db Database object
- */
- private function lockSearchindex( &$db ) {
- $write = array( 'searchindex' );
- $read = array( 'page', 'revision', 'text', 'interwiki' );
- $db->lockTables( $read, $write, 'updateSearchIndex.php ' . __METHOD__ );
- }
-
- /**
- * Unlock the tables
- * @param &$db Database object
- */
- private function unlockSearchindex( &$db ) {
- $db->unlockTables( 'updateSearchIndex.php ' . __METHOD__ );
- }
-
- /**
- * Unlock and lock again
- * Since the lock is low-priority, queued reads will be able to complete
- * @param &$db Database object
- */
- private function relockSearchindex( &$db ) {
- $this->unlockSearchindex( $db );
- $this->lockSearchindex( $db );
+ public function searchIndexUpdateCallback( $dbw, $row ) {
+ if ( $row->rc_type == RC_MOVE || $row->rc_type == RC_MOVE_OVER_REDIRECT ) {
+ # Rename searchindex entry
+ $titleObj = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
+ $title = $titleObj->getPrefixedDBkey();
+ $this->output( "$title..." );
+ $u = new SearchUpdate( $row->rc_cur_id, $title, false );
+ $u->doUpdate();
+ $this->output( "\n" );
+ } elseif ( $row->rc_type !== RC_LOG ) {
+ $this->updateSearchIndexForPage( $dbw, $row->rc_cur_id );
+ }
}
}
$maintClass = "UpdateSearchIndex";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index aaad3714..3e5df982 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -18,10 +18,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
-
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class UpdateSpecialPages extends Maintenance {
public function __construct() {
@@ -36,8 +37,8 @@ class UpdateSpecialPages extends Maintenance {
$wgOut->disable();
$dbw = wfGetDB( DB_MASTER );
- foreach( $wgSpecialPageCacheUpdates as $special => $call ) {
- if( !is_callable($call) ) {
+ foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
+ if ( !is_callable( $call ) ) {
$this->error( "Uncallable function $call!" );
continue;
}
@@ -45,7 +46,7 @@ class UpdateSpecialPages extends Maintenance {
call_user_func( $call, $dbw );
$t2 = explode( ' ', microtime() );
$this->output( sprintf( '%-30s ', $special ) );
- $elapsed = ($t2[0] - $t1[0]) + ($t2[1] - $t1[1]);
+ $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
$seconds = $elapsed - $hours * 3600 - $minutes * 60;
@@ -63,16 +64,16 @@ class UpdateSpecialPages extends Maintenance {
// This is needed to initialise $wgQueryPages
require_once( "$IP/includes/QueryPage.php" );
- foreach( $wgQueryPages as $page ) {
+ foreach ( $wgQueryPages as $page ) {
@list( $class, $special, $limit ) = $page;
# --list : just show the name of pages
- if( $this->hasOption('list') ) {
+ if ( $this->hasOption( 'list' ) ) {
$this->output( "$special\n" );
continue;
}
- if ( !$this->hasOption('override') && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate ) ) {
+ if ( !$this->hasOption( 'override' ) && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate ) ) {
$this->output( sprintf( "%-30s disabled\n", $special ) );
continue;
}
@@ -88,7 +89,7 @@ class UpdateSpecialPages extends Maintenance {
}
$queryPage = new $class;
- if( !$this->hasOption('only') || $this->getOption('only') == $queryPage->getName() ) {
+ if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
$this->output( sprintf( '%-30s ', $special ) );
if ( $queryPage->isExpensive() ) {
$t1 = explode( ' ', microtime() );
@@ -100,7 +101,7 @@ class UpdateSpecialPages extends Maintenance {
} else {
$this->output( "got $num rows in " );
- $elapsed = ($t2[0] - $t1[0]) + ($t2[1] - $t1[1]);
+ $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
$seconds = $elapsed - $hours * 3600 - $minutes * 60;
@@ -113,7 +114,7 @@ class UpdateSpecialPages extends Maintenance {
$this->output( sprintf( "%.2fs\n", $seconds ) );
}
# Reopen any connections that have closed
- if ( !wfGetLB()->pingAll()) {
+ if ( !wfGetLB()->pingAll() ) {
$this->output( "\n" );
do {
$this->error( "Connection failed, reconnecting in 10 seconds..." );
@@ -135,4 +136,4 @@ class UpdateSpecialPages extends Maintenance {
}
$maintClass = "UpdateSpecialPages";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc
deleted file mode 100644
index 594d4d78..00000000
--- a/maintenance/updaters.inc
+++ /dev/null
@@ -1,1979 +0,0 @@
-<?php
-/**
- * @file
- * @ingroup Maintenance
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
- echo "This file is not a valid entry point\n";
- exit( 1 );
-}
-
-require_once 'convertLinks.inc';
-require_once 'userDupes.inc';
-# Extension updates
-require_once( "$IP/includes/Hooks.php" );
-
-/**
- * List of update functions to call for each DB type, in sequence. First item
- * is function name, rest are parameters to pass.
- */
-$wgUpdates = array(
- 'mysql' => array(
- // 1.2
- // update_passwords obsolete
- array( 'add_field', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
- array( 'add_field', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
- array( 'do_interwiki_update' ),
- array( 'do_index_update' ),
- // do_linkscc_update obsolete
- array( 'add_table', 'hitcounter', 'patch-hitcounter.sql' ),
- array( 'add_field', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ),
-
- // 1.3
- array( 'add_field', 'user', 'user_real_name', 'patch-user-realname.sql' ),
- array( 'add_table', 'querycache', 'patch-querycache.sql' ),
- array( 'add_table', 'objectcache', 'patch-objectcache.sql' ),
- array( 'add_table', 'categorylinks', 'patch-categorylinks.sql' ),
- // do_linkscc_1_3_update obsolete
- array( 'do_old_links_update' ),
- array( 'fix_ancient_imagelinks' ),
- array( 'add_field', 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ),
-
- // 1.4
- array( 'do_image_name_unique_update' ),
- array( 'add_field', 'recentchanges', 'rc_id', 'patch-rc_id.sql' ),
- array( 'add_field', 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ),
- array( 'add_table', 'logging', 'patch-logging.sql' ),
- // do_user_rights_update obsolete
- array( 'add_field', 'user', 'user_token', 'patch-user_token.sql' ),
- // old, old_articleid, patch-remove-old-title-namespace.sql obsolete
- // user_groups, patch-userlevels.sql obsolete
- // do_group_update() obsolete
- array( 'do_watchlist_update' ),
- array( 'do_user_update' ),
- // do_copy_newtalk_to_watchlist obsolete
-
- // 1.5
- array( 'do_schema_restructuring' ),
- array( 'add_field', 'logging', 'log_params', 'patch-log_params.sql' ),
- array( 'check_bin', 'logging', 'log_title', 'patch-logging-title.sql', ),
- array( 'add_field', 'archive', 'ar_rev_id', 'patch-archive-rev_id.sql' ),
- array( 'add_field', 'page', 'page_len', 'patch-page_len.sql' ),
- array( 'do_inverse_timestamp' ),
- array( 'do_text_id' ),
- array( 'add_field', 'revision', 'rev_deleted', 'patch-rev_deleted.sql' ),
- array( 'add_field', 'image', 'img_width', 'patch-img_width.sql' ),
- array( 'add_field', 'image', 'img_metadata', 'patch-img_metadata.sql' ),
- array( 'add_field', 'user', 'user_email_token', 'patch-user_email_token.sql' ),
- array( 'add_field', 'archive', 'ar_text_id', 'patch-archive-text_id.sql' ),
- array( 'do_namespace_size' ),
- array( 'add_field', 'image', 'img_media_type', 'patch-img_media_type.sql' ),
- array( 'do_pagelinks_update' ),
- array( 'do_drop_img_type' ),
- array( 'do_user_unique_update' ),
- array( 'do_user_groups_update' ),
- array( 'add_field', 'site_stats', 'ss_total_pages', 'patch-ss_total_articles.sql' ),
- array( 'add_table', 'user_newtalk', 'patch-usernewtalk2.sql' ),
- array( 'add_table', 'transcache', 'patch-transcache.sql' ),
- array( 'add_field', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ),
- array( 'add_table', 'trackbacks', 'patch-trackbacks.sql' ),
-
- // 1.6
- array( 'do_watchlist_null' ),
- // do_image_index_update obsolete
- array( 'do_logging_timestamp_index' ),
- array( 'add_field', 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ),
- array( 'do_page_random_update' ),
- array( 'add_field', 'user', 'user_registration','patch-user_registration.sql' ),
- array( 'do_templatelinks_update' ),
- array( 'add_table', 'externallinks', 'patch-externallinks.sql' ),
- array( 'add_table', 'job', 'patch-job.sql' ),
- array( 'add_field', 'site_stats', 'ss_images', 'patch-ss_images.sql' ),
- array( 'add_table', 'langlinks', 'patch-langlinks.sql' ),
- array( 'add_table', 'querycache_info', 'patch-querycacheinfo.sql' ),
- array( 'add_table', 'filearchive', 'patch-filearchive.sql' ),
- array( 'add_field', 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ),
- array( 'do_rc_indices_update' ),
-
- // 1.9
- array( 'add_field', 'user', 'user_newpass_time', 'patch-user_newpass_time.sql' ),
- array( 'add_table', 'redirect', 'patch-redirect.sql' ),
- array( 'add_table', 'querycachetwo', 'patch-querycachetwo.sql' ),
- array( 'add_field', 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
- array( 'do_backlinking_indices_update' ),
- array( 'add_field', 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ),
- array( 'add_field', 'user', 'user_editcount', 'patch-user_editcount.sql' ),
-
- // 1.10
- array( 'do_restrictions_update' ),
- array( 'add_field', 'logging', 'log_id', 'patch-log_id.sql' ),
- array( 'add_field', 'revision', 'rev_parent_id', 'patch-rev_parent_id.sql' ),
- array( 'add_field', 'page_restrictions', 'pr_id', 'patch-page_restrictions_sortkey.sql' ),
- array( 'add_field', 'revision', 'rev_len', 'patch-rev_len.sql' ),
- array( 'add_field', 'recentchanges', 'rc_deleted', 'patch-rc_deleted.sql' ),
- array( 'add_field', 'logging', 'log_deleted', 'patch-log_deleted.sql' ),
- array( 'add_field', 'archive', 'ar_deleted', 'patch-ar_deleted.sql' ),
- array( 'add_field', 'ipblocks', 'ipb_deleted', 'patch-ipb_deleted.sql' ),
- array( 'add_field', 'filearchive', 'fa_deleted', 'patch-fa_deleted.sql' ),
- array( 'add_field', 'archive', 'ar_len', 'patch-ar_len.sql' ),
-
- // 1.11
- array( 'add_field', 'ipblocks', 'ipb_block_email', 'patch-ipb_emailban.sql' ),
- array( 'do_categorylinks_indices_update' ),
- array( 'add_field', 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql'),
- array( 'do_archive_user_index' ),
- array( 'do_image_user_index' ),
- array( 'do_oldimage_user_index' ),
- array( 'add_field', 'archive', 'ar_page_id', 'patch-archive-page_id.sql'),
- array( 'add_field', 'image', 'img_sha1', 'patch-img_sha1.sql' ),
-
- // 1.12
- array( 'add_table', 'protected_titles', 'patch-protected_titles.sql' ),
-
- // 1.13
- array( 'add_field', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ),
- array( 'add_table', 'page_props', 'patch-page_props.sql' ),
- array( 'add_table', 'updatelog', 'patch-updatelog.sql' ),
- array( 'add_table', 'category', 'patch-category.sql' ),
- array( 'do_category_population' ),
- array( 'add_field', 'archive', 'ar_parent_id', 'patch-ar_parent_id.sql'),
- array( 'add_field', 'user_newtalk', 'user_last_timestamp', 'patch-user_last_timestamp.sql'),
- array( 'do_populate_parent_id' ),
- array( 'check_bin', 'protected_titles', 'pt_title', 'patch-pt_title-encoding.sql', ),
- array( 'maybe_do_profiling_memory_update' ),
- array( 'do_filearchive_indices_update' ),
-
- // 1.14
- array( 'add_field', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
- array( 'do_active_users_init' ),
- array( 'add_field', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
-
- // 1.15
- array( 'do_unique_pl_tl_il' ),
- array( 'add_table', 'change_tag', 'patch-change_tag.sql' ),
- array( 'add_table', 'tag_summary', 'patch-change_tag.sql' ),
- array( 'add_table', 'valid_tag', 'patch-change_tag.sql' ),
-
- // 1.16
- array( 'add_table', 'user_properties', 'patch-user_properties.sql' ),
- array( 'add_table', 'log_search', 'patch-log_search.sql' ),
- array( 'do_log_search_population' ),
- array( 'add_field', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
- array( 'add_table', 'l10n_cache', 'patch-l10n_cache.sql' ),
- array( 'add_table', 'external_user', 'patch-external_user.sql' ),
- array( 'add_index', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
- array( 'add_index', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
- array( 'add_field', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
- array( 'do_update_transcache_field' ),
- // A field changed name mid-release cycle, so fix it for anyone using
- // trunk
- array( 'rename_eu_wiki_id' ),
- array( 'do_update_mime_minor_field' ),
- ),
-
- 'sqlite' => array(
- // 1.14
- array( 'add_field', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
- array( 'do_active_users_init' ),
- array( 'add_field', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
- array( 'sqlite_initial_indexes' ),
-
- // 1.15
- array( 'add_table', 'change_tag', 'patch-change_tag.sql' ),
- array( 'add_table', 'tag_summary', 'patch-change_tag.sql' ),
- array( 'add_table', 'valid_tag', 'patch-change_tag.sql' ),
-
- // 1.16
- array( 'add_table', 'user_properties', 'patch-user_properties.sql' ),
- array( 'add_table', 'log_search', 'patch-log_search.sql' ),
- array( 'do_log_search_population' ),
- array( 'add_field', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
- array( 'add_table', 'l10n_cache', 'patch-l10n_cache.sql' ),
- array( 'add_table', 'external_user', 'patch-external_user.sql' ),
- array( 'add_index', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
- array( 'add_index', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
- array( 'add_field', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
- array( 'do_update_transcache_field' ),
- // version-independent searchindex setup, added in 1.16
- array( 'sqlite_setup_searchindex' ),
- ),
-);
-
-
-# For extensions only, should be populated via hooks
-# $wgDBtype should be checked to specifiy the proper file
-$wgExtNewTables = array(); // table, dir
-$wgExtNewFields = array(); // table, column, dir
-$wgExtPGNewFields = array(); // table, column, column attributes; for PostgreSQL
-$wgExtPGAlteredFields = array(); // table, column, new type, conversion method; for PostgreSQL
-$wgExtNewIndexes = array(); // table, index, dir
-$wgExtModifiedFields = array(); //table, index, dir
-
-# Helper function: check if the given key is present in the updatelog table.
-# Obviously, only use this for updates that occur after the updatelog table was
-# created!
-function update_row_exists( $key ) {
- $dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow(
- 'updatelog',
- '1',
- array( 'ul_key' => $key ),
- __FUNCTION__
- );
- return (bool)$row;
-}
-
-function rename_table( $from, $to, $patch ) {
- global $wgDatabase;
- if ( $wgDatabase->tableExists( $from ) ) {
- if ( $wgDatabase->tableExists( $to ) ) {
- wfOut( "...can't move table $from to $to, $to already exists.\n" );
- } else {
- wfOut( "Moving table $from to $to..." );
- $wgDatabase->sourceFile( archive($patch) );
- wfOut( "ok\n" );
- }
- } else {
- // Source table does not exist
- // Renames are done before creations, so this is typical for a new installation
- // Ignore silently
- }
-}
-
-function add_table( $name, $patch, $fullpath=false ) {
- global $wgDatabase;
- if ( $wgDatabase->tableExists( $name ) ) {
- wfOut( "...$name table already exists.\n" );
- } else {
- wfOut( "Creating $name table..." );
- if( $fullpath ) {
- $wgDatabase->sourceFile( $patch );
- } else {
- $wgDatabase->sourceFile( archive($patch) );
- }
- wfOut( "ok\n" );
- }
-}
-
-function modify_field($table, $field, $patch, $fullpath=false){
- global $wgDatabase;
- if ( !$wgDatabase->tableExists( $table ) ) {
- wfOut( "...$table table does not exist, skipping modify field patch\n" );
- } elseif (! $wgDatabase->fieldExists( $table, $field ) ) {
- wfOut( "...$field field does not exist in $table table, skipping modify field patch\n" );
- } else {
- wfOut( "Modifying $field field of table $table..." );
- if( $fullpath ) {
- $wgDatabase->sourceFile( $patch );
- } else {
- $wgDatabase->sourceFile( archive($patch) );
- }
- wfOut( "ok\n" );
- }
-}
-
-
-
-function add_field( $table, $field, $patch, $fullpath=false ) {
- global $wgDatabase;
- if ( !$wgDatabase->tableExists( $table ) ) {
- wfOut( "...$table table does not exist, skipping new field patch\n" );
- } elseif ( $wgDatabase->fieldExists( $table, $field ) ) {
- wfOut( "...have $field field in $table table.\n" );
- } else {
- wfOut( "Adding $field field to table $table..." );
- if( $fullpath ) {
- $wgDatabase->sourceFile( $patch );
- } else {
- $wgDatabase->sourceFile( archive($patch) );
- }
- wfOut( "ok\n" );
- }
-}
-
-function add_index( $table, $index, $patch, $fullpath=false ) {
- global $wgDatabase;
- if( $wgDatabase->indexExists( $table, $index ) ) {
- wfOut( "...$index key already set on $table table.\n" );
- } else {
- wfOut( "Adding $index key to table $table... " );
- if( $fullpath ) {
- $wgDatabase->sourceFile( $patch );
- } else {
- $wgDatabase->sourceFile( archive($patch) );
- }
- wfOut( "ok\n" );
- }
-}
-
-function do_interwiki_update() {
- # Check that interwiki table exists; if it doesn't source it
- global $wgDatabase, $IP;
- if( $wgDatabase->tableExists( "interwiki" ) ) {
- wfOut( "...already have interwiki table\n" );
- return true;
- }
- wfOut( "Creating interwiki table: " );
- $wgDatabase->sourceFile( archive("patch-interwiki.sql") );
- wfOut( "ok\n" );
- wfOut( "Adding default interwiki definitions: " );
- $wgDatabase->sourceFile( "$IP/maintenance/interwiki.sql" );
- wfOut( "ok\n" );
-}
-
-function do_index_update() {
- # Check that proper indexes are in place
- global $wgDatabase;
- $meta = $wgDatabase->fieldInfo( "recentchanges", "rc_timestamp" );
- if( !$meta->isMultipleKey() ) {
- wfOut( "Updating indexes to 20031107: " );
- $wgDatabase->sourceFile( archive("patch-indexes.sql") );
- wfOut( "ok\n" );
- return true;
- }
- wfOut( "...indexes seem up to 20031107 standards\n" );
- return false;
-}
-
-function do_image_index_update() {
- global $wgDatabase;
-
- $meta = $wgDatabase->fieldInfo( "image", "img_major_mime" );
- if( !$meta->isMultipleKey() ) {
- wfOut( "Updating indexes to 20050912: " );
- $wgDatabase->sourceFile( archive("patch-mimesearch-indexes.sql") );
- wfOut( "ok\n" );
- return true;
- }
- wfOut( "...indexes seem up to 20050912 standards\n" );
- return false;
-}
-
-function do_image_name_unique_update() {
- global $wgDatabase;
- if( $wgDatabase->indexExists( 'image', 'PRIMARY' ) ) {
- wfOut( "...image primary key already set.\n" );
- } else {
- wfOut( "Making img_name the primary key... " );
- $wgDatabase->sourceFile( archive("patch-image_name_primary.sql") );
- wfOut( "ok\n" );
- }
-}
-
-function do_logging_timestamp_index() {
- global $wgDatabase;
- if( $wgDatabase->indexExists( 'logging', 'times' ) ) {
- wfOut( "...timestamp key on logging already exists.\n" );
- } else {
- wfOut( "Adding timestamp key on logging table... " );
- $wgDatabase->sourceFile( archive("patch-logging-times-index.sql") );
- wfOut( "ok\n" );
- }
-}
-
-function do_archive_user_index() {
- global $wgDatabase;
- if( $wgDatabase->indexExists( 'archive', 'usertext_timestamp' ) ) {
- wfOut( "...usertext,timestamp key on archive already exists.\n" );
- } else {
- wfOut( "Adding usertext,timestamp key on archive table... " );
- $wgDatabase->sourceFile( archive("patch-archive-user-index.sql") );
- wfOut( "ok\n" );
- }
-}
-
-function do_image_user_index() {
- global $wgDatabase;
- if( $wgDatabase->indexExists( 'image', 'img_usertext_timestamp' ) ) {
- wfOut( "...usertext,timestamp key on image already exists.\n" );
- } else {
- wfOut( "Adding usertext,timestamp key on image table... " );
- $wgDatabase->sourceFile( archive("patch-image-user-index.sql") );
- wfOut( "ok\n" );
- }
-}
-
-function do_oldimage_user_index() {
- global $wgDatabase;
- if( $wgDatabase->indexExists( 'oldimage', 'oi_usertext_timestamp' ) ) {
- wfOut( "...usertext,timestamp key on oldimage already exists.\n" );
- } else {
- wfOut( "Adding usertext,timestamp key on oldimage table... " );
- $wgDatabase->sourceFile( archive("patch-oldimage-user-index.sql") );
- wfOut( "ok\n" );
- }
-}
-
-function do_watchlist_update() {
- global $wgDatabase;
- $fname = 'do_watchlist_update';
- if( $wgDatabase->fieldExists( 'watchlist', 'wl_notificationtimestamp' ) ) {
- wfOut( "The watchlist table is already set up for email notification.\n" );
- } else {
- wfOut( "Adding wl_notificationtimestamp field for email notification management." );
- /* ALTER TABLE watchlist ADD (wl_notificationtimestamp varchar(14) binary NOT NULL default '0'); */
- $wgDatabase->sourceFile( archive( 'patch-email-notification.sql' ) );
- wfOut( "ok\n" );
- }
- # Check if we need to add talk page rows to the watchlist
- $talk = $wgDatabase->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', $fname );
- $nontalk = $wgDatabase->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', $fname );
- if ( $talk != $nontalk ) {
- wfOut( "Adding missing watchlist talk page rows... " );
- flush();
-
- $wgDatabase->insertSelect( 'watchlist', 'watchlist',
- array(
- 'wl_user' => 'wl_user',
- 'wl_namespace' => 'wl_namespace | 1',
- 'wl_title' => 'wl_title',
- 'wl_notificationtimestamp' => 'wl_notificationtimestamp'
- ), array( 'NOT (wl_namespace & 1)' ), $fname, 'IGNORE' );
- wfOut( "ok\n" );
- } else {
- wfOut( "...watchlist talk page rows already present\n" );
- }
-}
-
-function do_copy_newtalk_to_watchlist() {
- global $wgDatabase;
- global $wgCommandLineMode; # this needs to be saved while getID() and getName() are called
-
- $res = $wgDatabase->safeQuery( 'SELECT user_id, user_ip FROM !',
- $wgDatabase->tableName( 'user_newtalk' ) );
- $num_newtalks=$wgDatabase->numRows($res);
- wfOut( "Now converting $num_newtalks user_newtalk entries to watchlist table entries ... \n" );
-
- $user = new User();
- for ( $i = 1; $i <= $num_newtalks; $i++ ) {
- $wluser = $wgDatabase->fetchObject( $res );
- if ($wluser->user_id == 0) { # anonymous users ... have IP numbers as "names"
- if ($user->isIP($wluser->user_ip)) { # do only if it really looks like an IP number (double checked)
- $wgDatabase->replace( 'watchlist',
- array(array('wl_user','wl_namespace', 'wl_title', 'wl_notificationtimestamp' )),
- array('wl_user' => 0,
- 'wl_namespace' => NS_USER_TALK,
- 'wl_title' => $wluser->user_ip,
- 'wl_notificationtimestamp' => '19700101000000'
- ), 'updaters.inc::do_watchlist_update2'
- );
- }
- } else { # normal users ... have user_ids
- $user->setID($wluser->user_id);
- $wgDatabase->replace( 'watchlist',
- array(array('wl_user','wl_namespace', 'wl_title', 'wl_notificationtimestamp' )),
- array('wl_user' => $user->getID(),
- 'wl_namespace' => NS_USER_TALK,
- 'wl_title' => $user->getName(),
- 'wl_notificationtimestamp' => '19700101000000'
- ), 'updaters.inc::do_watchlist_update3'
- );
- }
- }
- wfOut( "Done.\n" );
-}
-
-
-function do_user_update() {
- global $wgDatabase;
- if( $wgDatabase->fieldExists( 'user', 'user_emailauthenticationtimestamp' ) ) {
- wfOut( "User table contains old email authentication field. Dropping... " );
- $wgDatabase->sourceFile( archive( 'patch-email-authentication.sql' ) );
- wfOut( "ok\n" );
- } else {
- wfOut( "...user table does not contain old email authentication field.\n" );
- }
-}
-
-/**
- * 1.4 betas were missing the 'binary' marker from logging.log_title,
- * which causes a collation mismatch error on joins in MySQL 4.1.
- */
-function check_bin( $table, $field, $patchFile ) {
- global $wgDatabase, $wgDBtype;
- if ($wgDBtype != 'mysql')
- return;
- $tableName = $wgDatabase->tableName( $table );
- $res = $wgDatabase->query( "SELECT $field FROM $tableName LIMIT 0" );
- $flags = explode( ' ', mysql_field_flags( $res->result, 0 ) );
- $wgDatabase->freeResult( $res );
-
- if( in_array( 'binary', $flags ) ) {
- wfOut( "$table table has correct $field encoding.\n" );
- } else {
- wfOut( "Fixing $field encoding on $table table... " );
- $wgDatabase->sourceFile( archive( $patchFile ) );
- wfOut( "ok\n" );
- }
-}
-
-function do_schema_restructuring() {
- global $wgDatabase;
- $fname="do_schema_restructuring";
- if ( $wgDatabase->tableExists( 'page' ) ) {
- wfOut( "...page table already exists.\n" );
- } else {
- wfOut( "...converting from cur/old to page/revision/text DB structure.\n" );
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......checking for duplicate entries.\n" );
-
- list ($cur, $old, $page, $revision, $text) = $wgDatabase->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
-
- $rows = $wgDatabase->query( "SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
- FROM $cur GROUP BY cur_title, cur_namespace HAVING c>1", $fname );
-
- if ( $wgDatabase->numRows( $rows ) > 0 ) {
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......<b>Found duplicate entries</b>\n" );
- wfOut( sprintf( "<b> %-60s %3s %5s</b>\n", 'Title', 'NS', 'Count' ) );
- while ( $row = $wgDatabase->fetchObject( $rows ) ) {
- if ( ! isset( $duplicate[$row->cur_namespace] ) ) {
- $duplicate[$row->cur_namespace] = array();
- }
- $duplicate[$row->cur_namespace][] = $row->cur_title;
- wfOut( sprintf( " %-60s %3s %5s\n", $row->cur_title, $row->cur_namespace, $row->c ) );
- }
- $sql = "SELECT cur_title, cur_namespace, cur_id, cur_timestamp FROM $cur WHERE ";
- $firstCond = true;
- foreach ( $duplicate as $ns => $titles ) {
- if ( $firstCond ) {
- $firstCond = false;
- } else {
- $sql .= ' OR ';
- }
- $sql .= "( cur_namespace = {$ns} AND cur_title in (";
- $first = true;
- foreach ( $titles as $t ) {
- if ( $first ) {
- $sql .= $wgDatabase->addQuotes( $t );
- $first = false;
- } else {
- $sql .= ', ' . $wgDatabase->addQuotes( $t );
- }
- }
- $sql .= ") ) \n";
- }
- # By sorting descending, the most recent entry will be the first in the list.
- # All following entries will be deleted by the next while-loop.
- $sql .= 'ORDER BY cur_namespace, cur_title, cur_timestamp DESC';
-
- $rows = $wgDatabase->query( $sql, $fname );
-
- $prev_title = $prev_namespace = false;
- $deleteId = array();
-
- while ( $row = $wgDatabase->fetchObject( $rows ) ) {
- if ( $prev_title == $row->cur_title && $prev_namespace == $row->cur_namespace ) {
- $deleteId[] = $row->cur_id;
- }
- $prev_title = $row->cur_title;
- $prev_namespace = $row->cur_namespace;
- }
- $sql = "DELETE FROM $cur WHERE cur_id IN ( " . join( ',', $deleteId ) . ')';
- $rows = $wgDatabase->query( $sql, $fname );
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......<b>Deleted</b> ".$wgDatabase->affectedRows()." records.\n" );
- }
-
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......Creating tables.\n" );
- $wgDatabase->query("CREATE TABLE $page (
- page_id int(8) unsigned NOT NULL auto_increment,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL,
- page_counter bigint(20) unsigned NOT NULL default '0',
- page_is_redirect tinyint(1) unsigned NOT NULL default '0',
- page_is_new tinyint(1) unsigned NOT NULL default '0',
- page_random real unsigned NOT NULL,
- page_touched char(14) binary NOT NULL default '',
- page_latest int(8) unsigned NOT NULL,
- page_len int(8) unsigned NOT NULL,
-
- PRIMARY KEY page_id (page_id),
- UNIQUE INDEX name_title (page_namespace,page_title),
- INDEX (page_random),
- INDEX (page_len)
- ) ENGINE=InnoDB", $fname );
- $wgDatabase->query("CREATE TABLE $revision (
- rev_id int(8) unsigned NOT NULL auto_increment,
- rev_page int(8) unsigned NOT NULL,
- rev_comment tinyblob NOT NULL,
- rev_user int(5) unsigned NOT NULL default '0',
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp char(14) binary NOT NULL default '',
- rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
- rev_deleted tinyint(1) unsigned NOT NULL default '0',
- rev_len int(8) unsigned,
- rev_parent_id int(8) unsigned default NULL,
- PRIMARY KEY rev_page_id (rev_page, rev_id),
- UNIQUE INDEX rev_id (rev_id),
- INDEX rev_timestamp (rev_timestamp),
- INDEX page_timestamp (rev_page,rev_timestamp),
- INDEX user_timestamp (rev_user,rev_timestamp),
- INDEX usertext_timestamp (rev_user_text,rev_timestamp)
- ) ENGINE=InnoDB", $fname );
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......Locking tables.\n" );
- $wgDatabase->query( "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", $fname );
-
- $maxold = intval( $wgDatabase->selectField( 'old', 'max(old_id)', '', $fname ) );
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......maxold is {$maxold}\n" );
-
- wfOut( wfTimestamp( TS_DB ) );
- global $wgLegacySchemaConversion;
- if( $wgLegacySchemaConversion ) {
- // Create HistoryBlobCurStub entries.
- // Text will be pulled from the leftover 'cur' table at runtime.
- wfOut( "......Moving metadata from cur; using blob references to text in cur table.\n" );
- $cur_text = "concat('O:18:\"historyblobcurstub\":1:{s:6:\"mCurId\";i:',cur_id,';}')";
- $cur_flags = "'object'";
- } else {
- // Copy all cur text in immediately: this may take longer but avoids
- // having to keep an extra table around.
- wfOut( "......Moving text from cur.\n" );
- $cur_text = 'cur_text';
- $cur_flags = "''";
- }
- $wgDatabase->query( "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, old_user_text,
- old_timestamp, old_minor_edit, old_flags)
- SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags
- FROM $cur", $fname );
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......Setting up revision table.\n" );
- $wgDatabase->query( "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, rev_user_text, rev_timestamp,
- rev_minor_edit)
- SELECT old_id, cur_id, old_comment, old_user, old_user_text,
- old_timestamp, old_minor_edit
- FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", $fname );
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......Setting up page table.\n" );
- $wgDatabase->query( "INSERT INTO $page (page_id, page_namespace, page_title, page_restrictions, page_counter,
- page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len)
- SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
- cur_random, cur_touched, rev_id, LENGTH(cur_text)
- FROM $cur,$revision
- WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", $fname );
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......Unlocking tables.\n" );
- $wgDatabase->query( "UNLOCK TABLES", $fname );
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "......Renaming old.\n" );
- $wgDatabase->query( "ALTER TABLE $old RENAME TO $text", $fname );
-
- wfOut( wfTimestamp( TS_DB ) );
- wfOut( "...done.\n" );
- }
-}
-
-function do_inverse_timestamp() {
- global $wgDatabase;
- if( $wgDatabase->fieldExists( 'revision', 'inverse_timestamp' ) ) {
- wfOut( "Removing revision.inverse_timestamp and fixing indexes... " );
- $wgDatabase->sourceFile( archive( 'patch-inverse_timestamp.sql' ) );
- wfOut( "ok\n" );
- } else {
- wfOut( "revision timestamp indexes already up to 2005-03-13\n" );
- }
-}
-
-function do_text_id() {
- global $wgDatabase;
- if( $wgDatabase->fieldExists( 'revision', 'rev_text_id' ) ) {
- wfOut( "...rev_text_id already in place.\n" );
- } else {
- wfOut( "Adding rev_text_id field... " );
- $wgDatabase->sourceFile( archive( 'patch-rev_text_id.sql' ) );
- wfOut( "ok\n" );
- }
-}
-
-function do_namespace_size() {
- $tables = array(
- 'page' => 'page',
- 'archive' => 'ar',
- 'recentchanges' => 'rc',
- 'watchlist' => 'wl',
- 'querycache' => 'qc',
- 'logging' => 'log',
- );
- foreach( $tables as $table => $prefix ) {
- do_namespace_size_on( $table, $prefix );
- flush();
- }
-}
-
-function do_namespace_size_on( $table, $prefix ) {
- global $wgDatabase, $wgDBtype;
- if ($wgDBtype != 'mysql')
- return;
- $field = $prefix . '_namespace';
-
- $tablename = $wgDatabase->tableName( $table );
- $result = $wgDatabase->query( "SHOW COLUMNS FROM $tablename LIKE '$field'" );
- $info = $wgDatabase->fetchObject( $result );
- $wgDatabase->freeResult( $result );
-
- if( substr( $info->Type, 0, 3 ) == 'int' ) {
- wfOut( "...$field is already a full int ($info->Type).\n" );
- } else {
- wfOut( "Promoting $field from $info->Type to int... " );
-
- $sql = "ALTER TABLE $tablename MODIFY $field int NOT NULL";
- $wgDatabase->query( $sql );
-
- wfOut( "ok\n" );
- }
-}
-
-function do_pagelinks_update() {
- global $wgDatabase;
- if( $wgDatabase->tableExists( 'pagelinks' ) ) {
- wfOut( "...already have pagelinks table.\n" );
- } else {
- wfOut( "Converting links and brokenlinks tables to pagelinks... " );
- $wgDatabase->sourceFile( archive( 'patch-pagelinks.sql' ) );
- wfOut( "ok\n" );
- flush();
-
- global $wgCanonicalNamespaceNames;
- foreach( $wgCanonicalNamespaceNames as $ns => $name ) {
- if( $ns != 0 ) {
- do_pagelinks_namespace( $ns );
- }
- }
- }
-}
-
-function do_pagelinks_namespace( $namespace ) {
- global $wgDatabase, $wgContLang;
-
- $ns = intval( $namespace );
- wfOut( "Cleaning up broken links for namespace $ns... " );
-
- $pagelinks = $wgDatabase->tableName( 'pagelinks' );
- $name = $wgContLang->getNsText( $ns );
- $prefix = $wgDatabase->strencode( $name );
- $likeprefix = str_replace( '_', '\\_', $prefix);
-
- $sql = "UPDATE $pagelinks
- SET pl_namespace=$ns,
- pl_title=TRIM(LEADING '$prefix:' FROM pl_title)
- WHERE pl_namespace=0
- AND pl_title LIKE '$likeprefix:%'";
-
- $wgDatabase->query( $sql, 'do_pagelinks_namespace' );
- wfOut( "ok\n" );
-}
-
-function do_drop_img_type() {
- global $wgDatabase;
-
- if( $wgDatabase->fieldExists( 'image', 'img_type' ) ) {
- wfOut( "Dropping unused img_type field in image table... " );
- $wgDatabase->sourceFile( archive( 'patch-drop_img_type.sql' ) );
- wfOut( "ok\n" );
- } else {
- wfOut( "No img_type field in image table; Good.\n" );
- }
-}
-
-function do_old_links_update() {
- global $wgDatabase;
- if( $wgDatabase->tableExists( 'pagelinks' ) ) {
- wfOut( "Already have pagelinks; skipping old links table updates.\n" );
- } else {
- convertLinks(); flush();
- }
-}
-
-function fix_ancient_imagelinks() {
- global $wgDatabase;
- $info = $wgDatabase->fieldInfo( 'imagelinks', 'il_from' );
- if ( $info && $info->type() === 'string' ) {
- wfOut( "Fixing ancient broken imagelinks table.\n" );
- wfOut( "NOTE: you will have to run maintenance/refreshLinks.php after this.\n" );
- $wgDatabase->sourceFile( archive( 'patch-fix-il_from.sql' ) );
- wfOut( "ok\n" );
- } else {
- wfOut( "...il_from OK\n" );
- }
-}
-
-function do_user_unique_update() {
- global $wgDatabase;
- $duper = new UserDupes( $wgDatabase );
- if( $duper->hasUniqueIndex() ) {
- wfOut( "Already have unique user_name index.\n" );
- } else {
- if( !$duper->clearDupes() ) {
- wfOut( "WARNING: This next step will probably fail due to unfixed duplicates...\n" );
- }
- wfOut( "Adding unique index on user_name... " );
- $wgDatabase->sourceFile( archive( 'patch-user_nameindex.sql' ) );
- wfOut( "ok\n" );
- }
-}
-
-function do_user_groups_update() {
- $fname = 'do_user_groups_update';
- global $wgDatabase;
-
- if( $wgDatabase->tableExists( 'user_groups' ) ) {
- wfOut( "...user_groups table already exists.\n" );
- return do_user_groups_reformat();
- }
-
- wfOut( "Adding user_groups table... " );
- $wgDatabase->sourceFile( archive( 'patch-user_groups.sql' ) );
- wfOut( "ok\n" );
-
- if( !$wgDatabase->tableExists( 'user_rights' ) ) {
- if( $wgDatabase->fieldExists( 'user', 'user_rights' ) ) {
- wfOut( "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion..." );
- $wgDatabase->sourceFile( archive( 'patch-user_rights.sql' ) );
- wfOut( "ok\n" );
- } else {
- wfOut( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
- wfOut( "*** You may need to manually configure some sysops by manipulating\n" );
- wfOut( "*** the user_groups table.\n" );
- return;
- }
- }
-
- wfOut( "Converting user_rights table to user_groups... " );
- $result = $wgDatabase->select( 'user_rights',
- array( 'ur_user', 'ur_rights' ),
- array( "ur_rights != ''" ),
- $fname );
-
- while( $row = $wgDatabase->fetchObject( $result ) ) {
- $groups = array_unique(
- array_map( 'trim',
- explode( ',', $row->ur_rights ) ) );
-
- foreach( $groups as $group ) {
- $wgDatabase->insert( 'user_groups',
- array(
- 'ug_user' => $row->ur_user,
- 'ug_group' => $group ),
- $fname );
- }
- }
- $wgDatabase->freeResult( $result );
- wfOut( "ok\n" );
-}
-
-function do_user_groups_reformat() {
- # Check for bogus formats from previous 1.5 alpha code.
- global $wgDatabase;
- $info = $wgDatabase->fieldInfo( 'user_groups', 'ug_group' );
-
- if( $info->type() == 'int' ) {
- $oldug = $wgDatabase->tableName( 'user_groups' );
- $newug = $wgDatabase->tableName( 'user_groups_bogus' );
- wfOut( "user_groups is in bogus intermediate format. Renaming to $newug... " );
- $wgDatabase->query( "ALTER TABLE $oldug RENAME TO $newug" );
- wfOut( "ok\n" );
-
- wfOut( "Re-adding fresh user_groups table... " );
- $wgDatabase->sourceFile( archive( 'patch-user_groups.sql' ) );
- wfOut( "ok\n" );
-
- wfOut( "***\n" );
- wfOut( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
- wfOut( "*** table. Old 1.5 alpha versions did some pretty funky stuff...\n" );
- wfOut( "***\n" );
- } else {
- wfOut( "...user_groups is in current format.\n" );
- }
-
-}
-
-function do_watchlist_null() {
- # Make sure wl_notificationtimestamp can be NULL,
- # and update old broken items.
- global $wgDatabase;
- $info = $wgDatabase->fieldInfo( 'watchlist', 'wl_notificationtimestamp' );
-
- if( !$info->nullable() ) {
- wfOut( "Making wl_notificationtimestamp nullable... " );
- $wgDatabase->sourceFile( archive( 'patch-watchlist-null.sql' ) );
- wfOut( "ok\n" );
- } else {
- wfOut( "...wl_notificationtimestamp is already nullable.\n" );
- }
-
-}
-
-/**
- * @bug 3946
- */
-function do_page_random_update() {
- global $wgDatabase;
-
- wfOut( "Setting page_random to a random value on rows where it equals 0..." );
-
- $page = $wgDatabase->tableName( 'page' );
- $wgDatabase->query( "UPDATE $page SET page_random = RAND() WHERE page_random = 0", 'do_page_random_update' );
- $rows = $wgDatabase->affectedRows();
-
- wfOut( "changed $rows rows\n" );
-}
-
-function do_templatelinks_update() {
- global $wgDatabase, $wgLoadBalancer;
- $fname = 'do_templatelinks_update';
-
- if ( $wgDatabase->tableExists( 'templatelinks' ) ) {
- wfOut( "...templatelinks table already exists\n" );
- return;
- }
- wfOut( "Creating templatelinks table...\n" );
- $wgDatabase->sourceFile( archive('patch-templatelinks.sql') );
- wfOut( "Populating...\n" );
- if ( isset( $wgLoadBalancer ) && $wgLoadBalancer->getServerCount() > 1 ) {
- // Slow, replication-friendly update
- $res = $wgDatabase->select( 'pagelinks', array( 'pl_from', 'pl_namespace', 'pl_title' ),
- array( 'pl_namespace' => NS_TEMPLATE ), $fname );
- $count = 0;
- while ( $row = $wgDatabase->fetchObject( $res ) ) {
- $count = ($count + 1) % 100;
- if ( $count == 0 ) {
- if ( function_exists( 'wfWaitForSlaves' ) ) {
- wfWaitForSlaves( 10 );
- } else {
- sleep( 1 );
- }
- }
- $wgDatabase->insert( 'templatelinks',
- array(
- 'tl_from' => $row->pl_from,
- 'tl_namespace' => $row->pl_namespace,
- 'tl_title' => $row->pl_title,
- ), $fname
- );
-
- }
- $wgDatabase->freeResult( $res );
- } else {
- // Fast update
- $wgDatabase->insertSelect( 'templatelinks', 'pagelinks',
- array(
- 'tl_from' => 'pl_from',
- 'tl_namespace' => 'pl_namespace',
- 'tl_title' => 'pl_title'
- ), array(
- 'pl_namespace' => 10
- ), $fname
- );
- }
- wfOut( "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n" );
-}
-
-// Add index on ( rc_namespace, rc_user_text ) [Jul. 2006]
-// Add index on ( rc_user_text, rc_timestamp ) [Nov. 2006]
-function do_rc_indices_update() {
- global $wgDatabase;
- wfOut( "Checking for additional recent changes indices...\n" );
-
- $indexes = array(
- 'rc_ns_usertext' => 'patch-recentchanges-utindex.sql',
- 'rc_user_text' => 'patch-rc_user_text-index.sql',
- );
-
- foreach( $indexes as $index => $patch ) {
- $info = $wgDatabase->indexInfo( 'recentchanges', $index, __METHOD__ );
- if( !$info ) {
- wfOut( "...index `{$index}` not found; adding..." );
- $wgDatabase->sourceFile( archive( $patch ) );
- wfOut( "done.\n" );
- } else {
- wfOut( "...index `{$index}` seems ok.\n" );
- }
- }
-}
-
-function index_has_field($table, $index, $field) {
- global $wgDatabase;
- wfOut( "Checking if $table index $index includes field $field...\n" );
- $info = $wgDatabase->indexInfo( $table, $index, __METHOD__ );
- if( $info ) {
- foreach($info as $row) {
- if($row->Column_name == $field) {
- wfOut( "...index $index on table $table seems to be ok\n" );
- return true;
- }
- }
- }
- wfOut( "...index $index on table $table has no field $field; adding\n" );
- return false;
-}
-
-function do_backlinking_indices_update() {
- global $wgDatabase;
- wfOut( "Checking for backlinking indices...\n" );
- if (!index_has_field('pagelinks', 'pl_namespace', 'pl_from') ||
- !index_has_field('templatelinks', 'tl_namespace', 'tl_from') ||
- !index_has_field('imagelinks', 'il_to', 'il_from'))
- {
- $wgDatabase->sourceFile( archive( 'patch-backlinkindexes.sql' ) );
- wfOut( "...backlinking indices updated\n" );
- }
-}
-
-function do_categorylinks_indices_update() {
- global $wgDatabase;
- wfOut( "Checking for categorylinks indices...\n" );
- if (!index_has_field('categorylinks', 'cl_sortkey', 'cl_from'))
- {
- $wgDatabase->sourceFile( archive( 'patch-categorylinksindex.sql' ) );
- wfOut( "...categorylinks indices updated\n" );
- }
-}
-
-function do_filearchive_indices_update() {
- global $wgDatabase;
- wfOut( "Checking filearchive indices...\n" );
- $info = $wgDatabase->indexInfo( 'filearchive', 'fa_user_timestamp', __METHOD__ );
- if ( !$info )
- {
- $wgDatabase->sourceFile( archive( 'patch-filearchive-user-index.sql' ) );
- wfOut( "...filearchive indices updated\n" );
- }
-}
-
-function maybe_do_profiling_memory_update() {
- global $wgDatabase;
- if ( !$wgDatabase->tableExists( 'profiling' ) ) {
- // Simply ignore
- } elseif ( $wgDatabase->fieldExists( 'profiling', 'pf_memory' ) ) {
- wfOut( "profiling table has pf_memory field.\n" );
- } else {
- wfOut( "Adding pf_memory field to table profiling..." );
- $wgDatabase->sourceFile( archive( 'patch-profiling-memory.sql' ) );
- wfOut( "ok\n" );
- }
-}
-
-function do_stats_init() {
- // Sometimes site_stats table is not properly populated.
- global $wgDatabase;
- wfOut( "Checking site_stats row..." );
- $row = $wgDatabase->selectRow( 'site_stats', '*', array( 'ss_row_id' => 1 ), __METHOD__ );
- if( $row === false ) {
- wfOut( "data is missing! rebuilding...\n" );
- } elseif ( isset( $row->site_stats ) && $row->ss_total_pages == -1 ) {
- wfOut( "missing ss_total_pages, rebuilding...\n" );
- } else {
- wfOut( "ok.\n" );
- return;
- }
- SiteStatsInit::doAllAndCommit( false );
-}
-
-function do_active_users_init() {
- global $wgDatabase;
- $activeUsers = $wgDatabase->selectField( 'site_stats', 'ss_active_users', false, __METHOD__ );
- if( $activeUsers == -1 ) {
- $activeUsers = $wgDatabase->selectField( 'recentchanges',
- 'COUNT( DISTINCT rc_user_text )',
- array( 'rc_user != 0', 'rc_bot' => 0, "rc_log_type != 'newusers'" ), __METHOD__
- );
- $wgDatabase->update( 'site_stats',
- array( 'ss_active_users' => intval($activeUsers) ),
- array( 'ss_row_id' => 1 ), __METHOD__, array( 'LIMIT' => 1 )
- );
- }
- wfOut( "...ss_active_users user count set...\n" );
-}
-
-function purge_cache() {
- global $wgDatabase;
- # We can't guarantee that the user will be able to use TRUNCATE,
- # but we know that DELETE is available to us
- wfOut( "Purging caches..." );
- $wgDatabase->delete( 'objectcache', '*', __METHOD__ );
- wfOut( "done.\n" );
-}
-
-function do_all_updates( $shared = false, $purge = true ) {
- global $wgNewTables, $wgExtModifiedFields, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgSharedTables, $wgDatabase, $wgDBtype, $IP;
-
- wfRunHooks('LoadExtensionSchemaUpdates');
-
- $doUser = $shared ? $wgSharedDB && in_array('user', $wgSharedTables) : !$wgSharedDB || !in_array('user', $wgSharedTables);
-
- if ($wgDBtype === 'postgres') {
- do_postgres_updates();
- return;
- }
-
- # Run core updates in sequence...
- global $wgUpdates;
- if ( isset( $wgUpdates[$wgDBtype] ) ) {
- foreach( $wgUpdates[$wgDBtype] as $params ) {
- $func = array_shift( $params );
- call_user_func_array( $func, $params );
- flush();
- }
- }
-
- /// @fixme clean up this mess too!
- global $wgExtNewTables, $wgExtNewFields, $wgExtNewIndexes;
- # Add missing extension tables
- foreach ( $wgExtNewTables as $tableRecord ) {
- add_table( $tableRecord[0], $tableRecord[1], true );
- flush();
- }
- # Add missing extension fields
- foreach ( $wgExtNewFields as $fieldRecord ) {
- if ( $fieldRecord[0] != 'user' || $doUser ) {
- add_field( $fieldRecord[0], $fieldRecord[1], $fieldRecord[2], true );
- }
- flush();
- }
- # Add missing extension indexes
- foreach ( $wgExtNewIndexes as $fieldRecord ) {
- add_index( $fieldRecord[0], $fieldRecord[1], $fieldRecord[2], true );
- flush();
- }
- # Add modified extension fields
- foreach ( $wgExtModifiedFields as $fieldRecord ) {
- modify_field($fieldRecord[0], $fieldRecord[1], $fieldRecord[2], true);
- flush();
- }
-
-
- wfOut( "Deleting old default messages (this may take a long time!)..." );
- if( !defined( 'MW_NO_SETUP' ) ) {
- define( 'MW_NO_SETUP', true );
- }
- require_once 'deleteDefaultMessages.php';
- DeleteDefaultMessages::reallyExecute();
- wfOut( "Done\n" );
-
- do_stats_init();
-
- if( $purge ) {
- purge_cache();
- }
-}
-
-function archive($name) {
- global $wgDBtype, $IP;
- if ( file_exists( "$IP/maintenance/$wgDBtype/archives/$name" ) ) {
- return "$IP/maintenance/$wgDBtype/archives/$name";
- } else {
- return "$IP/maintenance/archives/$name";
- }
-}
-
-function do_restrictions_update() {
- # Adding page_restrictions table, obsoleting page.page_restrictions.
- # Migrating old restrictions to new table
- # -- Andrew Garrett, January 2007.
-
- global $wgDatabase;
-
- $name = 'page_restrictions';
- $patch = 'patch-page_restrictions.sql';
- $patch2 = 'patch-page_restrictions_sortkey.sql';
-
- if ( $wgDatabase->tableExists( $name ) ) {
- wfOut( "...$name table already exists.\n" );
- } else {
- wfOut( "Creating $name table..." );
- $wgDatabase->sourceFile( archive($patch) );
- $wgDatabase->sourceFile( archive($patch2) );
- wfOut( "ok\n" );
-
- wfOut( "Migrating old restrictions to new table..." );
-
- $res = $wgDatabase->select( 'page', array( 'page_id', 'page_restrictions' ), array("page_restrictions!=''", "page_restrictions!='edit=:move='"), __METHOD__ );
-
- $count = 0;
-
- while ($row = $wgDatabase->fetchObject($res) ) {
- $count = ($count + 1) % 100;
-
- if ($count == 0) {
- if ( function_exists( 'wfWaitForSlaves' ) ) {
- wfWaitForSlaves( 10 );
- } else {
- sleep( 1 );
- }
- }
-
- # Figure out what the restrictions are..
- $id = $row->page_id;
- $flatrestrictions = explode( ':', $row->page_restrictions );
-
- $restrictions = array ();
- foreach( $flatrestrictions as $restriction ) {
- $thisrestriction = explode( '=', $restriction, 2 );
- if( count( $thisrestriction ) == 1 ) {
- // Compatibility with old protections from before
- // separate move protection was added.
- list( $level ) = $thisrestriction;
- if( $level ) {
- $restrictions['edit'] = $level;
- $restrictions['move'] = $level;
- }
- } else {
- list( $type, $level ) = $thisrestriction;
- if( $level ) {
- $restrictions[$type] = $level;
- }
- }
-
- $wgDatabase->update( 'page', array ( 'page_restrictions' => ''), array( 'page_id' => $id ), __METHOD__ );
-
- }
-
- foreach( $restrictions as $type => $level ) {
- $wgDatabase->insert( 'page_restrictions', array ( 'pr_page' => $id,
- 'pr_type' => $type,
- 'pr_level' => $level,
- 'pr_cascade' => 0,
- 'pr_expiry' => 'infinity' ),
- __METHOD__ );
- }
- }
- wfOut( "ok\n" );
- }
-}
-
-function do_category_population() {
- if( update_row_exists( 'populate category' ) ) {
- wfOut( "...category table already populated.\n" );
- return;
- }
- require_once( 'populateCategory.inc' );
- wfOut( "Populating category table, printing progress markers. " ).
-"For large databases, you\n".
-"may want to hit Ctrl-C and do this manually with maintenance/\n".
-"populateCategory.php.\n";
- populateCategory( '', 10, 0, true );
- wfOut( "Done populating category table.\n" );
-}
-
-function do_populate_parent_id() {
- if( update_row_exists( 'populate rev_parent_id' ) ) {
- wfOut( "...rev_parent_id column already populated.\n" );
- return;
- }
- require_once( 'populateParentId.inc' );
-
- global $wgDatabase;
- populate_rev_parent_id( $wgDatabase );
-}
-
-function sqlite_initial_indexes() {
- global $wgDatabase;
- // initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
- if ( update_row_exists( 'initial_indexes' ) || $wgDatabase->indexExists( 'user', 'user_name' ) ) {
- wfOut( "...have initial indexes\n" );
- return;
- }
- wfOut( "Adding initial indexes..." );
- $wgDatabase->sourceFile( archive( 'initial-indexes.sql' ) );
- wfOut( "done\n" );
-}
-
-function sqlite_setup_searchindex() {
- global $wgDatabase;
- $module = $wgDatabase->getFulltextSearchModule();
- $fts3tTable = update_row_exists( 'fts3' );
- if ( $fts3tTable && !$module ) {
- wfOut( '...PHP is missing FTS3 support, downgrading tables...' );
- $wgDatabase->sourceFile( archive( 'searchindex-no-fts.sql' ) );
- wfOut( "done\n" );
- } elseif ( !$fts3tTable && $module == 'FTS3' ) {
- wfOut( '...adding FTS3 search capabilities...' );
- $wgDatabase->sourceFile( archive( 'searchindex-fts3.sql' ) );
- wfOut( "done\n" );
- } else {
- wfOut( "...fulltext search table appears to be in order.\n" );
- }
-}
-
-function do_unique_pl_tl_il() {
- global $wgDatabase;
- $info = $wgDatabase->indexInfo( 'pagelinks', 'pl_namespace' );
- if( is_array($info) && !$info[0]->Non_unique ) {
- wfOut( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
- } else {
- wfOut( "Making pl_namespace, tl_namespace and il_to indices UNIQUE... " );
- $wgDatabase->sourceFile( archive( 'patch-pl-tl-il-unique.sql' ) );
- wfOut( "ok\n" );
- }
-}
-
-function do_log_search_population() {
- global $wgDatabase;
- if( update_row_exists( 'populate log_search' ) ) {
- wfOut( "...log_search table already populated.\n" );
- return;
- }
- require_once( 'populateLogSearch.inc' );
- wfOut(
-"Populating log_search table, printing progress markers. For large\n" .
-"databases, you may want to hit Ctrl-C and do this manually with\n" .
-"maintenance/populateLogSearch.php.\n" );
- migrate_log_params( $wgDatabase );
- wfOut( "Done populating log_search table.\n" );
-}
-
-function rename_eu_wiki_id() {
- global $wgDatabase;
- wfOut( "Renaming eu_wiki_id -> eu_local_id... " );
- if ( $wgDatabase->fieldExists( 'external_user', 'eu_local_id' ) ) {
- wfOut( "already done.\n" );
- return;
- }
- $wgDatabase->sourceFile( archive( 'patch-eu_local_id.sql' ) );
- wfOut( "ok\n" );
-}
-
-function do_update_transcache_field() {
- global $wgDatabase;
- if( update_row_exists( 'convert transcache field' ) ) {
- wfOut( "...transcache tc_time already converted.\n" );
- return;
- } else {
- wfOut( "Converting tc_time from UNIX epoch to MediaWiki timestamp... " );
- $wgDatabase->sourceFile( archive( 'patch-tc-timestamp.sql' ) );
- wfOut( "ok\n" );
- }
-}
-
-function do_update_mime_minor_field() {
- if ( update_row_exists( 'mime_minor_length' ) ) {
- wfOut( "*_mime_minor fields are already long enough.\n" );
- } else {
- global $wgDatabase;
- wfOut( "Altering all *_mime_minor fields to 100 bytes in size ... " );
- $wgDatabase->sourceFile( archive( 'patch-mime_minor_length.sql' ) );
- wfOut( "ok\n" );
- }
-}
-
-
-
-/***********************************************************************
- * Start PG stuff
- * TODO: merge with above
- ***********************************************************************/
-
-function pg_describe_table($table) {
- global $wgDatabase, $wgDBmwschema;
- $q = <<<END
-SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
- WHERE pg_class.relnamespace = pg_namespace.oid
- AND attrelid=pg_class.oid AND attnum > 0
- AND relname=%s AND nspname=%s
-END;
- $res = $wgDatabase->query(sprintf($q,
- $wgDatabase->addQuotes($table),
- $wgDatabase->addQuotes($wgDBmwschema)));
- if (!$res)
- return null;
-
- $cols = array();
- while ($r = $wgDatabase->fetchRow($res)) {
- $cols[] = array(
- "name" => $r[0],
- "ord" => $r[1],
- );
- }
- return $cols;
-}
-
-function pg_describe_index($idx) {
- global $wgDatabase, $wgDBmwschema;
-
- // first fetch the key (which is a list of columns ords) and
- // the table the index applies to (an oid)
- $q = <<<END
-SELECT indkey, indrelid FROM pg_namespace, pg_class, pg_index
- WHERE nspname=%s
- AND pg_class.relnamespace = pg_namespace.oid
- AND relname=%s
- AND indexrelid=pg_class.oid
-END;
- $res = $wgDatabase->query(sprintf($q,
- $wgDatabase->addQuotes($wgDBmwschema),
- $wgDatabase->addQuotes($idx)));
- if (!$res)
- return null;
- if (!($r = $wgDatabase->fetchRow($res))) {
- $wgDatabase->freeResult($res);
- return null;
- }
-
- $indkey = $r[0];
- $relid = intval($r[1]);
- $indkeys = explode(" ", $indkey);
- $wgDatabase->freeResult($res);
-
- $colnames = array();
- foreach ($indkeys as $rid) {
- $query = <<<END
-SELECT attname FROM pg_class, pg_attribute
- WHERE attrelid=$relid
- AND attnum=%d
- AND attrelid=pg_class.oid
-END;
- $r2 = $wgDatabase->query(sprintf($query, $rid));
- if (!$r2)
- return null;
- if (!($row2 = $wgDatabase->fetchRow($r2))) {
- $wgDatabase->freeResult($r2);
- return null;
- }
- $colnames[] = $row2[0];
- $wgDatabase->freeResult($r2);
- }
-
- return $colnames;
-}
-
-function pg_index_exists($table, $index) {
- global $wgDatabase, $wgDBmwschema;
- $exists = $wgDatabase->selectField("pg_indexes", "indexname",
- array( "indexname" => $index,
- "tablename" => $table,
- "schemaname" => $wgDBmwschema));
- return $exists === $index;
-}
-
-function pg_fkey_deltype($fkey) {
- global $wgDatabase, $wgDBmwschema;
- $q = <<<END
-SELECT confdeltype FROM pg_constraint, pg_namespace
- WHERE connamespace=pg_namespace.oid
- AND nspname=%s
- AND conname=%s;
-END;
- $r = $wgDatabase->query(sprintf($q,
- $wgDatabase->addQuotes($wgDBmwschema),
- $wgDatabase->addQuotes($fkey)));
- if (!($row = $wgDatabase->fetchRow($r)))
- return null;
- return $row[0];
-}
-
-function pg_rule_def($table, $rule) {
- global $wgDatabase, $wgDBmwschema;
- $q = <<<END
-SELECT definition FROM pg_rules
- WHERE schemaname = %s
- AND tablename = %s
- AND rulename = %s
-END;
- $r = $wgDatabase->query(sprintf($q,
- $wgDatabase->addQuotes($wgDBmwschema),
- $wgDatabase->addQuotes($table),
- $wgDatabase->addQuotes($rule)));
- $row = $wgDatabase->fetchRow($r);
- if (!$row)
- return null;
- $d = $row[0];
- $wgDatabase->freeResult($r);
- return $d;
-}
-
-function do_postgres_updates() {
- global $wgDatabase, $wgVersion, $wgDBmwschema, $wgDBts2schema, $wgShowExceptionDetails, $wgDBuser;
-
- ## Gather version numbers in case we need them
- $version = $wgDatabase->getServerVersion(); ## long string
- $numver = $wgDatabase->numeric_version; ## X.Y e.g. 8.3
-
- $wgShowExceptionDetails = 1;
-
- # Just in case their LocalSettings.php does not have this:
- if ( !isset( $wgDBmwschema ))
- $wgDBmwschema = 'mediawiki';
-
- # Verify that this user is configured correctly
- $safeuser = $wgDatabase->addQuotes($wgDBuser);
- $SQL = "SELECT array_to_string(useconfig,'*') FROM pg_catalog.pg_user WHERE usename = $safeuser";
- $config = pg_fetch_result( $wgDatabase->doQuery( $SQL ), 0, 0 );
- $conf = array();
- foreach( explode( '*', $config ) as $c ) {
- list( $x,$y ) = explode( '=', $c );
- $conf[$x] = $y;
- }
- if( !array_key_exists( 'search_path', $conf ) ) {
- $search_path = '';
- }
- else {
- $search_path = $conf['search_path'];
- }
-
- $safeuser = $wgDatabase->quote_ident($wgDBuser);
- if( strpos( $search_path, $wgDBmwschema ) === false ) {
- wfOut( "Adding in schema \"$wgDBmwschema\" to search_path for user \"$wgDBuser\"\n" );
- $search_path = "$wgDBmwschema, $search_path";
- }
- if( strpos( $search_path, $wgDBts2schema ) === false ) {
- wfOut( "Adding in schema \"$wgDBts2schema\" to search_path for user \"$wgDBuser\"\n" );
- $search_path = "$search_path, $wgDBts2schema";
- }
- $search_path = str_replace( ', ,', ',', $search_path);
- if( array_key_exists( 'search_path', $conf ) === false || $search_path != $conf['search_path'] ) {
- $wgDatabase->doQuery( "ALTER USER $safeuser SET search_path = $search_path" );
- $wgDatabase->doQuery( "SET search_path = $search_path" );
- }
- else {
- $path = $conf['search_path'];
- wfOut( "... search_path for user \"$wgDBuser\" looks correct ($path)\n" );
- }
- $goodconf = array(
- 'client_min_messages' => 'error',
- 'DateStyle' => 'ISO, YMD',
- 'TimeZone' => 'GMT'
- );
- foreach( array_keys( $goodconf ) AS $key ) {
- $value = $goodconf[$key];
- if( !array_key_exists( $key, $conf ) or $conf[$key] !== $value ) {
- wfOut( "Setting $key to '$value' for user \"$wgDBuser\"\n" );
- $wgDatabase->doQuery( "ALTER USER $safeuser SET $key = '$value'" );
- $wgDatabase->doQuery( "SET $key = '$value'" );
- }
- else {
- wfOut( "... default value of \"$key\" is correctly set to \"$value\" for user \"$wgDBuser\"\n" );
- }
- }
-
- $newsequences = array(
- "logging_log_id_seq",
- "page_restrictions_pr_id_seq",
- );
-
- $newtables = array(
- array("category", "patch-category.sql"),
- array("mediawiki_version", "patch-mediawiki_version.sql"),
- array("mwuser", "patch-mwuser.sql"),
- array("pagecontent", "patch-pagecontent.sql"),
- array("querycachetwo", "patch-querycachetwo.sql"),
- array("page_props", "patch-page_props.sql"),
- array("page_restrictions", "patch-page_restrictions.sql"),
- array("profiling", "patch-profiling.sql"),
- array("protected_titles", "patch-protected_titles.sql"),
- array("redirect", "patch-redirect.sql"),
- array("updatelog", "patch-updatelog.sql"),
- array('change_tag', 'patch-change_tag.sql'),
- array('tag_summary', 'patch-change_tag.sql'),
- array('valid_tag', 'patch-change_tag.sql'),
- array('user_properties', 'patch-user_properties.sql'),
- array('log_search', 'patch-log_search.sql'),
- array('l10n_cache', 'patch-l10n_cache.sql'),
- );
-
- $newcols = array(
- array("archive", "ar_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("archive", "ar_len", "INTEGER"),
- array("archive", "ar_page_id", "INTEGER"),
- array("archive", "ar_parent_id", "INTEGER"),
- array("image", "img_sha1", "TEXT NOT NULL DEFAULT ''"),
- array("ipblocks", "ipb_allow_usertalk", "SMALLINT NOT NULL DEFAULT 0"),
- array("ipblocks", "ipb_anon_only", "SMALLINT NOT NULL DEFAULT 0"),
- array("ipblocks", "ipb_by_text", "TEXT NOT NULL DEFAULT ''"),
- array("ipblocks", "ipb_block_email", "SMALLINT NOT NULL DEFAULT 0"),
- array("ipblocks", "ipb_create_account", "SMALLINT NOT NULL DEFAULT 1"),
- array("ipblocks", "ipb_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("ipblocks", "ipb_enable_autoblock", "SMALLINT NOT NULL DEFAULT 1"),
- array("filearchive", "fa_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("logging", "log_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("logging", "log_id", "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')"),
- array("logging", "log_params", "TEXT"),
- array("mwuser", "user_editcount", "INTEGER"),
- array("mwuser", "user_hidden", "SMALLINT NOT NULL DEFAULT 0"),
- array("mwuser", "user_newpass_time", "TIMESTAMPTZ"),
- array("oldimage", "oi_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("oldimage", "oi_major_mime", "TEXT NOT NULL DEFAULT 'unknown'"),
- array("oldimage", "oi_media_type", "TEXT"),
- array("oldimage", "oi_metadata", "BYTEA NOT NULL DEFAULT ''"),
- array("oldimage", "oi_minor_mime", "TEXT NOT NULL DEFAULT 'unknown'"),
- array("oldimage", "oi_sha1", "TEXT NOT NULL DEFAULT ''"),
- array("page_restrictions", "pr_id", "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_val')"),
- array("profiling", "pf_memory", "NUMERIC(18,10) NOT NULL DEFAULT 0"),
- array("recentchanges", "rc_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("recentchanges", "rc_log_action", "TEXT"),
- array("recentchanges", "rc_log_type", "TEXT"),
- array("recentchanges", "rc_logid", "INTEGER NOT NULL DEFAULT 0"),
- array("recentchanges", "rc_new_len", "INTEGER"),
- array("recentchanges", "rc_old_len", "INTEGER"),
- array("recentchanges", "rc_params", "TEXT"),
- array("redirect", "rd_interwiki", "TEXT NULL"),
- array("redirect", "rd_fragment", "TEXT NULL"),
- array("revision", "rev_deleted", "SMALLINT NOT NULL DEFAULT 0"),
- array("revision", "rev_len", "INTEGER"),
- array("revision", "rev_parent_id", "INTEGER DEFAULT NULL"),
- array("site_stats", "ss_active_users", "INTEGER DEFAULT '-1'"),
- array("user_newtalk", "user_last_timestamp", "TIMESTAMPTZ"),
- array("logging", "log_user_text", "TEXT NOT NULL DEFAULT ''"),
- array("logging", "log_page", "INTEGER"),
- );
-
-
- # table, column, desired type, USING clause if needed (with new default if needed)
- $typechanges = array(
- array("archive", "ar_deleted", "smallint", ""),
- array("archive", "ar_minor_edit", "smallint", "ar_minor_edit::smallint DEFAULT 0"),
- array("filearchive", "fa_deleted", "smallint", ""),
- array("filearchive", "fa_height", "integer", ""),
- array("filearchive", "fa_metadata", "bytea", "decode(fa_metadata,'escape')"),
- array("filearchive", "fa_size", "integer", ""),
- array("filearchive", "fa_width", "integer", ""),
- array("filearchive", "fa_storage_group","text", ""),
- array("filearchive", "fa_storage_key", "text", ""),
- array("image", "img_metadata", "bytea", "decode(img_metadata,'escape')"),
- array("image", "img_size", "integer", ""),
- array("image", "img_width", "integer", ""),
- array("image", "img_height", "integer", ""),
- array("interwiki", "iw_local", "smallint", "iw_local::smallint DEFAULT 0"),
- array("interwiki", "iw_trans", "smallint", "iw_trans::smallint DEFAULT 0"),
- array("ipblocks", "ipb_auto", "smallint", "ipb_auto::smallint DEFAULT 0"),
- array("ipblocks", "ipb_anon_only", "smallint", "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0"),
- array("ipblocks", "ipb_create_account", "smallint", "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1"),
- array("ipblocks", "ipb_enable_autoblock", "smallint", "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1"),
- array("ipblocks", "ipb_block_email", "smallint", "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0"),
- array("ipblocks", "ipb_address", "text", "ipb_address::text"),
- array("ipblocks", "ipb_deleted", "smallint", "ipb_deleted::smallint DEFAULT 0"),
- array("math", "math_inputhash", "bytea", "decode(math_inputhash,'escape')"),
- array("math", "math_outputhash", "bytea", "decode(math_outputhash,'escape')"),
- array("mwuser", "user_token", "text", ""),
- array("mwuser", "user_email_token","text", ""),
- array("objectcache", "keyname", "text", ""),
- array("oldimage", "oi_height", "integer", ""),
- array("oldimage", "oi_metadata", "bytea", "decode(img_metadata,'escape')"),
- array("oldimage", "oi_size", "integer", ""),
- array("oldimage", "oi_width", "integer", ""),
- array("page", "page_is_redirect","smallint", "page_is_redirect::smallint DEFAULT 0"),
- array("page", "page_is_new", "smallint", "page_is_new::smallint DEFAULT 0"),
- array("querycache", "qc_value", "integer", ""),
- array("querycachetwo","qcc_value", "integer", ""),
- array("recentchanges","rc_bot", "smallint", "rc_bot::smallint DEFAULT 0"),
- array("recentchanges","rc_deleted", "smallint", ""),
- array("recentchanges","rc_minor", "smallint", "rc_minor::smallint DEFAULT 0"),
- array("recentchanges","rc_new", "smallint", "rc_new::smallint DEFAULT 0"),
- array("recentchanges","rc_type", "smallint", "rc_type::smallint DEFAULT 0"),
- array("recentchanges","rc_patrolled", "smallint", "rc_patrolled::smallint DEFAULT 0"),
- array("revision", "rev_deleted", "smallint", "rev_deleted::smallint DEFAULT 0"),
- array("revision", "rev_minor_edit", "smallint", "rev_minor_edit::smallint DEFAULT 0"),
- array("templatelinks","tl_namespace", "smallint", "tl_namespace::smallint"),
- array("user_newtalk", "user_ip", "text", "host(user_ip)"),
- );
-
- # table, column, nullability
- $nullchanges = array(
- array("oldimage", "oi_bits", "NULL"),
- array("oldimage", "oi_timestamp", "NULL"),
- array("oldimage", "oi_major_mime", "NULL"),
- array("oldimage", "oi_minor_mime", "NULL"),
- );
-
- $newindexes = array(
- array("archive", "archive_user_text", "(ar_user_text)"),
- array("image", "img_sha1", "(img_sha1)"),
- array("oldimage", "oi_sha1", "(oi_sha1)"),
- array("revision", "rev_text_id_idx", "(rev_text_id)"),
- array("recentchanges", "rc_timestamp_bot", "(rc_timestamp) WHERE rc_bot = 0"),
- array("templatelinks", "templatelinks_from", "(tl_from)"),
- array("watchlist", "wl_user", "(wl_user)"),
- array("logging", "logging_user_type_time", "(log_user, log_type, log_timestamp)"),
- array("logging", "logging_page_id_time", "(log_page,log_timestamp)"),
- );
-
- $newrules = array(
- );
-
- #Check new sequences, rename if needed
- foreach ($newsequences as $ns) {
- if( $wgDatabase->sequenceExists('pr_id_val') ) {
- wfOut( "Updating sequence names\n" );
- $wgDatabase->sourceFile(archive('patch-update_sequences.sql'));
- continue;
- } elseif ( $wgDatabase->sequenceExists('page_restrictions_pr_id_seq') ) {
- wfOut( "... sequences already updated\n" );
- continue;
- } else {
- wfOut( "Creating sequence \"$ns\"\n" );
- $wgDatabase->query("CREATE SEQUENCE $ns");
- }
- }
-
- foreach ($newtables as $nt) {
- if ($wgDatabase->tableExists($nt[0])) {
- wfOut( "... table \"$nt[0]\" already exists\n" );
- continue;
- }
-
- wfOut( "Creating table \"$nt[0]\"\n" );
- $wgDatabase->sourceFile(archive($nt[1]));
- }
-
- ## Needed before newcols
- if ($wgDatabase->tableExists("archive2")) {
- wfOut( "Converting \"archive2\" back to normal archive table\n" );
- if ($wgDatabase->ruleExists("archive", "archive_insert")) {
- wfOut( "Dropping rule \"archive_insert\"\n" );
- $wgDatabase->query("DROP RULE archive_insert ON archive");
- }
- if ($wgDatabase->ruleExists("archive", "archive_delete")) {
- wfOut( "Dropping rule \"archive_delete\"\n" );
- $wgDatabase->query("DROP RULE archive_delete ON archive");
- }
- $wgDatabase->sourceFile(archive("patch-remove-archive2.sql"));
- }
- else
- wfOut( "... obsolete table \"archive2\" does not exist\n" );
-
- foreach ($newcols as $nc) {
- $fi = $wgDatabase->fieldInfo($nc[0], $nc[1]);
- if (!is_null($fi)) {
- wfOut( "... column \"$nc[0].$nc[1]\" already exists\n" );
- continue;
- }
-
- wfOut( "Adding column \"$nc[0].$nc[1]\"\n" );
- $wgDatabase->query("ALTER TABLE $nc[0] ADD $nc[1] $nc[2]");
- }
-
- foreach ($typechanges as $tc) {
- $fi = $wgDatabase->fieldInfo($tc[0], $tc[1]);
- if (is_null($fi)) {
- wfOut( "... error: expected column $tc[0].$tc[1] to exist\n" );
- exit(1);
- }
-
- if ($fi->type() === $tc[2])
- wfOut( "... column \"$tc[0].$tc[1]\" is already of type \"$tc[2]\"\n" );
- else {
- wfOut( "Changing column type of \"$tc[0].$tc[1]\" from \"{$fi->type()}\" to \"$tc[2]\"\n" );
- $sql = "ALTER TABLE $tc[0] ALTER $tc[1] TYPE $tc[2]";
- if (strlen($tc[3])) {
- $default = array();
- if (preg_match( '/DEFAULT (.+)/', $tc[3], $default)) {
- $sqldef = "ALTER TABLE $tc[0] ALTER $tc[1] SET DEFAULT $default[1]";
- $wgDatabase->query($sqldef);
- $tc[3] = preg_replace( '/\s*DEFAULT .+/', '', $tc[3]);
- }
- $sql .= " USING $tc[3]";
- }
- $sql .= ";\nCOMMIT;\n";
- $wgDatabase->query($sql);
- }
- }
-
- foreach ($nullchanges as $nc) {
- $fi = $wgDatabase->fieldInfo($nc[0], $nc[1]);
- if (is_null($fi)) {
- wfOut( "... error: expected column $nc[0].$nc[1] to exist\n" );
- exit(1);
- }
- if ($fi->nullable()) {
- ## It's NULL - does it need to be NOT NULL?
- if ('NOT NULL' === $nc[2]) {
- wfOut( "Changing \"$nc[0].$nc[1]\" to not allow NULLs\n" );
- $wgDatabase->query( "ALTER TABLE $nc[0] ALTER $nc[1] SET NOT NULL" );
- }
- else {
- wfOut( "... column \"$nc[0].$nc[1]\" is already set as NULL\n" );
- }
- }
- else {
- ## It's NOT NULL - does it need to be NULL?
- if ('NULL' === $nc[2]) {
- wfOut( "Changing \"$nc[0].$nc[1]\" to allow NULLs\n" );
- $wgDatabase->query( "ALTER TABLE $nc[0] ALTER $nc[1] DROP NOT NULL" );
- }
- else {
- wfOut( "... column \"$nc[0].$nc[1]\" is already set as NOT NULL\n" );
- }
- }
- }
-
- if ($wgDatabase->fieldInfo('oldimage','oi_deleted')->type() !== 'smallint') {
- wfOut( "Changing \"oldimage.oi_deleted\" to type \"smallint\"\n" );
- $wgDatabase->query( "ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT" );
- $wgDatabase->query( "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" );
- $wgDatabase->query( "ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0" );
- }
- else
- wfOut( "... column \"oldimage.oi_deleted\" is already of type \"smallint\"\n" );
-
-
- foreach ($newindexes as $ni) {
- if (pg_index_exists($ni[0], $ni[1])) {
- wfOut( "... index \"$ni[1]\" on table \"$ni[0]\" already exists\n" );
- continue;
- }
- wfOut( "Creating index \"$ni[1]\" on table \"$ni[0]\" $ni[2]\n" );
- $wgDatabase->query( "CREATE INDEX $ni[1] ON $ni[0] $ni[2]" );
- }
-
- foreach ($newrules as $nr) {
- if ($wgDatabase->ruleExists($nr[0], $nr[1])) {
- wfOut( "... rule \"$nr[1]\" on table \"$nr[0]\" already exists\n" );
- continue;
- }
- wfOut( "Adding rule \"$nr[1]\" to table \"$nr[0]\"\n" );
- $wgDatabase->sourceFile(archive($nr[2]));
- }
-
- if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey_cascaded")) {
- wfOut( "... table \"oldimage\" has correct cascading delete/update foreign key to image\n" );
- }
- else {
- if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey")) {
- $wgDatabase->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" );
- }
- if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey_cascade")) {
- $wgDatabase->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" );
- }
- wfOut( "Making foreign key on table \"oldimage\" (to image) a cascade delete/update\n" );
- $wgDatabase->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded ".
- "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE" );
- }
-
- if (!$wgDatabase->triggerExists("page", "page_deleted")) {
- wfOut( "Adding function and trigger \"page_deleted\" to table \"page\"\n" );
- $wgDatabase->sourceFile(archive('patch-page_deleted.sql'));
- }
- else
- wfOut( "... table \"page\" has \"page_deleted\" trigger\n" );
-
- $fi = $wgDatabase->fieldInfo("recentchanges", "rc_cur_id");
- if (!$fi->nullable()) {
- wfOut( "Removing NOT NULL constraint from \"recentchanges.rc_cur_id\"\n" );
- $wgDatabase->sourceFile(archive('patch-rc_cur_id-not-null.sql'));
- }
- else
- wfOut( "... column \"recentchanges.rc_cur_id\" has a NOT NULL constraint\n" );
-
- $pu = pg_describe_index("pagelink_unique");
- if (!is_null($pu) && ($pu[0] != "pl_from" || $pu[1] != "pl_namespace" || $pu[2] != "pl_title")) {
- wfOut( "Dropping obsolete version of index \"pagelink_unique index\"\n" );
- $wgDatabase->query("DROP INDEX pagelink_unique");
- $pu = null;
- }
- else
- wfOut( "... obsolete version of index \"pagelink_unique index\" does not exist\n" );
-
- if (is_null($pu)) {
- wfOut( "Creating index \"pagelink_unique index\"\n" );
- $wgDatabase->query("CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)");
- }
- else
- wfOut( "... index \"pagelink_unique_index\" already exists\n" );
-
- if (pg_fkey_deltype("revision_rev_user_fkey") == 'r') {
- wfOut( "... constraint \"revision_rev_user_fkey\" is ON DELETE RESTRICT\n" );
- }
- else {
- wfOut( "Changing constraint \"revision_rev_user_fkey\" to ON DELETE RESTRICT\n" );
- $wgDatabase->sourceFile(archive('patch-revision_rev_user_fkey.sql'));
- }
-
- # Fix ipb_address index
- if (pg_index_exists('ipblocks', 'ipb_address' )) {
- wfOut( "Removing deprecated index 'ipb_address'...\n" );
- $wgDatabase->query('DROP INDEX ipb_address');
- }
- if (pg_index_exists('ipblocks', 'ipb_address_unique' )) {
- wfOut( "... have ipb_address_unique\n" );
- }
- else {
- wfOut( "Adding ipb_address_unique index\n" );
- $wgDatabase->sourceFile(archive('patch-ipb_address_unique.sql'));
- }
-
- global $wgExtNewTables, $wgExtPGNewFields, $wgExtPGAlteredFields, $wgExtNewIndexes;
- # Add missing extension tables
- foreach ( $wgExtNewTables as $nt ) {
- if ($wgDatabase->tableExists($nt[0])) {
- wfOut( "... table \"$nt[0]\" already exists\n" );
- continue;
- }
- wfOut( "Creating table \"$nt[0]\"\n" );
- $wgDatabase->sourceFile($nt[1]);
- }
- # Add missing extension fields
- foreach ( $wgExtPGNewFields as $nc ) {
- $fi = $wgDatabase->fieldInfo($nc[0], $nc[1]);
- if (!is_null($fi)) {
- wfOut( "... column \"$nc[0].$nc[1]\" already exists\n" );
- continue;
- }
- wfOut( "Adding column \"$nc[0].$nc[1]\"\n" );
- $wgDatabase->query( "ALTER TABLE $nc[0] ADD $nc[1] $nc[2]" );
- }
- # Change altered columns
- foreach ( $wgExtPGAlteredFields as $nc ) {
- $fi = $wgDatabase->fieldInfo($nc[0], $nc[1]);
- if (is_null($fi)) {
- wfOut( "WARNING! Column \"$nc[0].$nc[1]\" does not exist but had an alter request! Please report this.\n" );
- continue;
- }
- $oldtype = $fi->type();
- $newtype = strtolower( $nc[2] );
- if ($oldtype === $newtype) {
- wfOut( "... column \"$nc[0].$nc[1]\" has correct type of \"$newtype\"\n" );
- continue;
- }
- $command = "ALTER TABLE $nc[0] ALTER $nc[1] TYPE $nc[2]";
- if ( isset( $nc[3] ) ) {
- $command .= " USING $nc[3]";
- }
- wfOut( "Altering column \"$nc[0].$nc[1]\" from type \"$oldtype\" to \"$newtype\"\n" );
- $wgDatabase->query( $command );
- }
- # Add missing extension indexes
- foreach ( $wgExtNewIndexes as $ni ) {
- if (pg_index_exists($ni[0], $ni[1])) {
- wfOut( "... index \"$ni[1]\" on table \"$ni[0]\" already exists\n" );
- continue;
- }
- wfOut( "Creating index \"$ni[1]\" on table \"$ni[0]\"\n" );
- if ( preg_match( '/^\(/', $ni[2] ) ) {
- $wgDatabase->query( "CREATE INDEX $ni[1] ON $ni[0] $ni[2]" );
- }
- else {
- $wgDatabase->sourceFile($ni[2]);
- }
- }
-
- # Tweak the page_title tsearch2 trigger to filter out slashes
- # This is create or replace, so harmless to call if not needed
- $wgDatabase->sourceFile(archive('patch-ts2pagetitle.sql'));
-
- ## If the server is 8.3 or higher, rewrite the tsearch2 triggers
- ## in case they have the old 'default' versions
- if ( $numver >= 8.3 )
- $wgDatabase->sourceFile(archive('patch-tsearch2funcs.sql'));
-
- ## Put a new row in the mediawiki_version table
- $wgDatabase->insert( 'mediawiki_version',
- array(
- 'type' => 'Update',
- 'ctype' => 'U',
- 'mw_version' => $wgVersion,
- 'pg_version' => $version,
- 'sql_version' => '$LastChangedRevision: 84593 $',
- 'sql_date' => '$LastChangedDate: 2011-03-23 23:14:46 +1100 (Wed, 23 Mar 2011) $',
- ) );
- return;
-}
diff --git a/maintenance/upgrade1_5.php b/maintenance/upgrade1_5.php
index 4834a4a1..c5e1a33d 100644
--- a/maintenance/upgrade1_5.php
+++ b/maintenance/upgrade1_5.php
@@ -13,22 +13,1298 @@
* @ingroup Maintenance
*/
-$options = array( 'step', 'noimages' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
-require_once( 'FiveUpgrade.inc' );
+define( 'MW_UPGRADE_COPY', false );
+define( 'MW_UPGRADE_ENCODE', true );
+define( 'MW_UPGRADE_NULL', null );
+define( 'MW_UPGRADE_CALLBACK', null ); // for self-documentation only
-echo "ATTENTION: This script is for upgrades from 1.4 to 1.5 (NOT 1.15) in very special cases.\n";
-echo "Use update.php for usual updates.\n";
+/**
+ * @ingroup Maintenance
+ */
+class FiveUpgrade extends Maintenance {
+ function __construct() {
+ parent::__construct();
-// Seems to confuse some people
-if ( !array_search( '--upgrade', $_SERVER['argv'] ) ) {
- echo "Please run this script with --upgrade key to actually run the updater.\n";
- die;
-}
+ $this->mDescription = 'Script for upgrades from 1.4 to 1.5 (NOT 1.15) in very special cases.';
+
+ $this->addOption( 'upgrade', 'Really run the script' );
+ $this->addOption( 'noimage', '' );
+ $this->addOption( 'step', 'Only do a specific step', false, true );
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_ADMIN;
+ }
+
+ public function execute() {
+ $this->output( "ATTENTION: This script is for upgrades from 1.4 to 1.5 (NOT 1.15) in very special cases.\n" );
+ $this->output( "Use update.php for usual updates.\n" );
+
+ if ( !$this->hasOption( 'upgrade' ) ) {
+ $this->output( "Please run this script with --upgrade key to actually run the updater.\n" );
+ return;
+ }
+
+ $this->setMembers();
+
+ $tables = array(
+ 'page',
+ 'links',
+ 'user',
+ 'image',
+ 'oldimage',
+ 'watchlist',
+ 'logging',
+ 'archive',
+ 'imagelinks',
+ 'categorylinks',
+ 'ipblocks',
+ 'recentchanges',
+ 'querycache'
+ );
+
+ foreach ( $tables as $table ) {
+ if ( $this->doing( $table ) ) {
+ $method = 'upgrade' . ucfirst( $table );
+ $this->$method();
+ }
+ }
+
+ if ( $this->doing( 'cleanup' ) ) {
+ $this->upgradeCleanup();
+ }
+ }
+
+ protected function setMembers() {
+ $this->conversionTables = $this->prepareWindows1252();
+
+ $this->loadBalancers = array();
+ $this->dbw = wfGetDB( DB_MASTER );
+ $this->dbr = $this->streamConnection();
+
+ $this->cleanupSwaps = array();
+ $this->emailAuth = false; # don't preauthenticate emails
+ $this->maxLag = 10; # if slaves are lagged more than 10 secs, wait
+ $this->step = $this->getOption( 'step', null );
+ }
+
+ function doing( $step ) {
+ return is_null( $this->step ) || $step == $this->step;
+ }
+
+ /**
+ * Open a connection to the master server with the admin rights.
+ * @return Database
+ * @access private
+ */
+ function newConnection() {
+ $lb = wfGetLBFactory()->newMainLB();
+ $db = $lb->getConnection( DB_MASTER );
+
+ $this->loadBalancers[] = $lb;
+ return $db;
+ }
+
+ /**
+ * Commit transactions and close the connections when we're done...
+ */
+ function close() {
+ foreach ( $this->loadBalancers as $lb ) {
+ $lb->commitMasterChanges();
+ $lb->closeAll();
+ }
+ }
+
+ /**
+ * Open a second connection to the master server, with buffering off.
+ * This will let us stream large datasets in and write in chunks on the
+ * other end.
+ * @return Database
+ * @access private
+ */
+ function streamConnection() {
+ global $wgDBtype;
+
+ $timeout = 3600 * 24;
+ $db = $this->newConnection();
+ $db->bufferResults( false );
+ if ( $wgDBtype == 'mysql' ) {
+ $db->query( "SET net_read_timeout=$timeout" );
+ $db->query( "SET net_write_timeout=$timeout" );
+ }
+ return $db;
+ }
+
+ /**
+ * Prepare a conversion array for converting Windows Code Page 1252 to
+ * UTF-8. This should provide proper conversion of text that was miscoded
+ * as Windows-1252 by naughty user-agents, and doesn't rely on an outside
+ * iconv library.
+ *
+ * @return array
+ * @access private
+ */
+ function prepareWindows1252() {
+ # Mappings from:
+ # http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
+ static $cp1252 = array(
+ 0x80 => 0x20AC, # EURO SIGN
+ 0x81 => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
+ 0x82 => 0x201A, # SINGLE LOW-9 QUOTATION MARK
+ 0x83 => 0x0192, # LATIN SMALL LETTER F WITH HOOK
+ 0x84 => 0x201E, # DOUBLE LOW-9 QUOTATION MARK
+ 0x85 => 0x2026, # HORIZONTAL ELLIPSIS
+ 0x86 => 0x2020, # DAGGER
+ 0x87 => 0x2021, # DOUBLE DAGGER
+ 0x88 => 0x02C6, # MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x89 => 0x2030, # PER MILLE SIGN
+ 0x8A => 0x0160, # LATIN CAPITAL LETTER S WITH CARON
+ 0x8B => 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x8C => 0x0152, # LATIN CAPITAL LIGATURE OE
+ 0x8D => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
+ 0x8E => 0x017D, # LATIN CAPITAL LETTER Z WITH CARON
+ 0x8F => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
+ 0x90 => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
+ 0x91 => 0x2018, # LEFT SINGLE QUOTATION MARK
+ 0x92 => 0x2019, # RIGHT SINGLE QUOTATION MARK
+ 0x93 => 0x201C, # LEFT DOUBLE QUOTATION MARK
+ 0x94 => 0x201D, # RIGHT DOUBLE QUOTATION MARK
+ 0x95 => 0x2022, # BULLET
+ 0x96 => 0x2013, # EN DASH
+ 0x97 => 0x2014, # EM DASH
+ 0x98 => 0x02DC, # SMALL TILDE
+ 0x99 => 0x2122, # TRADE MARK SIGN
+ 0x9A => 0x0161, # LATIN SMALL LETTER S WITH CARON
+ 0x9B => 0x203A, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x9C => 0x0153, # LATIN SMALL LIGATURE OE
+ 0x9D => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
+ 0x9E => 0x017E, # LATIN SMALL LETTER Z WITH CARON
+ 0x9F => 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS
+ );
+ $pairs = array();
+ for ( $i = 0; $i < 0x100; $i++ ) {
+ $unicode = isset( $cp1252[$i] ) ? $cp1252[$i] : $i;
+ $pairs[chr( $i )] = codepointToUtf8( $unicode );
+ }
+ return $pairs;
+ }
+
+ /**
+ * Convert from 8-bit Windows-1252 to UTF-8 if necessary.
+ * @param string $text
+ * @return string
+ * @access private
+ */
+ function conv( $text ) {
+ global $wgUseLatin1;
+ return is_null( $text )
+ ? null
+ : ( $wgUseLatin1
+ ? strtr( $text, $this->conversionTables )
+ : $text );
+ }
+
+ /**
+ * Dump timestamp and message to output
+ * @param $message String
+ * @access private
+ */
+ function log( $message ) {
+ $this->output( wfWikiID() . ' ' . wfTimestamp( TS_DB ) . ': ' . $message . "\n" );
+ }
+
+ /**
+ * Initialize the chunked-insert system.
+ * Rows will be inserted in chunks of the given number, rather
+ * than in a giant INSERT...SELECT query, to keep the serialized
+ * MySQL database replication from getting hung up. This way other
+ * things can be going on during conversion without waiting for
+ * slaves to catch up as badly.
+ *
+ * @param int $chunksize Number of rows to insert at once
+ * @param int $final Total expected number of rows / id of last row,
+ * used for progress reports.
+ * @param string $table to insert on
+ * @param string $fname function name to report in SQL
+ * @access private
+ */
+ function setChunkScale( $chunksize, $final, $table, $fname ) {
+ $this->chunkSize = $chunksize;
+ $this->chunkFinal = $final;
+ $this->chunkCount = 0;
+ $this->chunkStartTime = wfTime();
+ $this->chunkOptions = array( 'IGNORE' );
+ $this->chunkTable = $table;
+ $this->chunkFunction = $fname;
+ }
+
+ /**
+ * Chunked inserts: perform an insert if we've reached the chunk limit.
+ * Prints a progress report with estimated completion time.
+ * @param array &$chunk -- This will be emptied if an insert is done.
+ * @param int $key A key identifier to use in progress estimation in
+ * place of the number of rows inserted. Use this if
+ * you provided a max key number instead of a count
+ * as the final chunk number in setChunkScale()
+ * @access private
+ */
+ function addChunk( &$chunk, $key = null ) {
+ if ( count( $chunk ) >= $this->chunkSize ) {
+ $this->insertChunk( $chunk );
+
+ $this->chunkCount += count( $chunk );
+ $now = wfTime();
+ $delta = $now - $this->chunkStartTime;
+ $rate = $this->chunkCount / $delta;
+
+ if ( is_null( $key ) ) {
+ $completed = $this->chunkCount;
+ } else {
+ $completed = $key;
+ }
+ $portion = $completed / $this->chunkFinal;
+
+ $estimatedTotalTime = $delta / $portion;
+ $eta = $this->chunkStartTime + $estimatedTotalTime;
+
+ printf( "%s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec\n",
+ wfTimestamp( TS_DB, intval( $now ) ),
+ $portion * 100.0,
+ $this->chunkTable,
+ wfTimestamp( TS_DB, intval( $eta ) ),
+ $completed,
+ $this->chunkFinal,
+ $rate );
+ flush();
+
+ $chunk = array();
+ }
+ }
+
+ /**
+ * Chunked inserts: perform an insert unconditionally, at the end, and log.
+ * @param array &$chunk -- This will be emptied if an insert is done.
+ * @access private
+ */
+ function lastChunk( &$chunk ) {
+ $n = count( $chunk );
+ if ( $n > 0 ) {
+ $this->insertChunk( $chunk );
+ }
+ $this->log( "100.00% done on $this->chunkTable (last chunk $n rows)." );
+ }
+
+ /**
+ * Chunked inserts: perform an insert.
+ * @param array &$chunk -- This will be emptied if an insert is done.
+ * @access private
+ */
+ function insertChunk( &$chunk ) {
+ // Give slaves a chance to catch up
+ wfWaitForSlaves( $this->maxLag );
+ $this->dbw->insert( $this->chunkTable, $chunk, $this->chunkFunction, $this->chunkOptions );
+ }
+
+
+ /**
+ * Copy and transcode a table to table_temp.
+ * @param string $name Base name of the source table
+ * @param string $tabledef CREATE TABLE definition, w/ $1 for the name
+ * @param array $fields set of destination fields to these constants:
+ * MW_UPGRADE_COPY - straight copy
+ * MW_UPGRADE_ENCODE - for old Latin1 wikis, conv to UTF-8
+ * MW_UPGRADE_NULL - just put NULL
+ * @param callable $callback An optional callback to modify the data
+ * or perform other processing. Func should be
+ * ( object $row, array $copy ) and return $copy
+ * @access private
+ */
+ function copyTable( $name, $tabledef, $fields, $callback = null ) {
+ $name_temp = $name . '_temp';
+ $this->log( "Migrating $name table to $name_temp..." );
+
+ $table_temp = $this->dbw->tableName( $name_temp );
+
+ // Create temporary table; we're going to copy everything in there,
+ // then at the end rename the final tables into place.
+ $def = str_replace( '$1', $table_temp, $tabledef );
+ $this->dbw->query( $def, __METHOD__ );
+
+ $numRecords = $this->dbw->selectField( $name, 'COUNT(*)', '', __METHOD__ );
+ $this->setChunkScale( 100, $numRecords, $name_temp, __METHOD__ );
+
+ // Pull all records from the second, streaming database connection.
+ $sourceFields = array_keys( array_filter( $fields,
+ create_function( '$x', 'return $x !== MW_UPGRADE_NULL;' ) ) );
+ $result = $this->dbr->select( $name,
+ $sourceFields,
+ '',
+ __METHOD__ );
+
+ $add = array();
+ foreach ( $result as $row ) {
+ $copy = array();
+ foreach ( $fields as $field => $source ) {
+ if ( $source === MW_UPGRADE_COPY ) {
+ $copy[$field] = $row->$field;
+ } elseif ( $source === MW_UPGRADE_ENCODE ) {
+ $copy[$field] = $this->conv( $row->$field );
+ } elseif ( $source === MW_UPGRADE_NULL ) {
+ $copy[$field] = null;
+ } else {
+ $this->log( "Unknown field copy type: $field => $source" );
+ }
+ }
+ if ( is_callable( $callback ) ) {
+ $copy = call_user_func( $callback, $row, $copy );
+ }
+ $add[] = $copy;
+ $this->addChunk( $add );
+ }
+ $this->lastChunk( $add );
+
+ $this->log( "Done converting $name." );
+ $this->cleanupSwaps[] = $name;
+ }
+
+ function upgradePage() {
+ $chunksize = 100;
+
+ if ( $this->dbw->tableExists( 'page' ) ) {
+ $this->error( 'Page table already exists.', true );
+ }
+
+ $this->log( "Checking cur table for unique title index and applying if necessary" );
+ $this->checkDupes();
+
+ $this->log( "...converting from cur/old to page/revision/text DB structure." );
+
+ list ( $cur, $old, $page, $revision, $text ) = $this->dbw->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
+
+ $this->log( "Creating page and revision tables..." );
+ $this->dbw->query( "CREATE TABLE $page (
+ page_id int(8) unsigned NOT NULL auto_increment,
+ page_namespace int NOT NULL,
+ page_title varchar(255) binary NOT NULL,
+ page_restrictions tinyblob NOT NULL default '',
+ page_counter bigint(20) unsigned NOT NULL default '0',
+ page_is_redirect tinyint(1) unsigned NOT NULL default '0',
+ page_is_new tinyint(1) unsigned NOT NULL default '0',
+ page_random real unsigned NOT NULL,
+ page_touched char(14) binary NOT NULL default '',
+ page_latest int(8) unsigned NOT NULL,
+ page_len int(8) unsigned NOT NULL,
+
+ PRIMARY KEY page_id (page_id),
+ UNIQUE INDEX name_title (page_namespace,page_title),
+ INDEX (page_random),
+ INDEX (page_len)
+ ) TYPE=InnoDB", __METHOD__ );
+ $this->dbw->query( "CREATE TABLE $revision (
+ rev_id int(8) unsigned NOT NULL auto_increment,
+ rev_page int(8) unsigned NOT NULL,
+ rev_text_id int(8) unsigned NOT NULL,
+ rev_comment tinyblob NOT NULL default '',
+ rev_user int(5) unsigned NOT NULL default '0',
+ rev_user_text varchar(255) binary NOT NULL default '',
+ rev_timestamp char(14) binary NOT NULL default '',
+ rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
+ rev_deleted tinyint(1) unsigned NOT NULL default '0',
+
+ PRIMARY KEY rev_page_id (rev_page, rev_id),
+ UNIQUE INDEX rev_id (rev_id),
+ INDEX rev_timestamp (rev_timestamp),
+ INDEX page_timestamp (rev_page,rev_timestamp),
+ INDEX user_timestamp (rev_user,rev_timestamp),
+ INDEX usertext_timestamp (rev_user_text,rev_timestamp)
+ ) TYPE=InnoDB", __METHOD__ );
+
+ $maxold = intval( $this->dbw->selectField( 'old', 'max(old_id)', '', __METHOD__ ) );
+ $this->log( "Last old record is {$maxold}" );
+
+ global $wgLegacySchemaConversion;
+ if ( $wgLegacySchemaConversion ) {
+ // Create HistoryBlobCurStub entries.
+ // Text will be pulled from the leftover 'cur' table at runtime.
+ echo "......Moving metadata from cur; using blob references to text in cur table.\n";
+ $cur_text = "concat('O:18:\"historyblobcurstub\":1:{s:6:\"mCurId\";i:',cur_id,';}')";
+ $cur_flags = "'object'";
+ } else {
+ // Copy all cur text in immediately: this may take longer but avoids
+ // having to keep an extra table around.
+ echo "......Moving text from cur.\n";
+ $cur_text = 'cur_text';
+ $cur_flags = "''";
+ }
+
+ $maxcur = $this->dbw->selectField( 'cur', 'max(cur_id)', '', __METHOD__ );
+ $this->log( "Last cur entry is $maxcur" );
+
+ /**
+ * Copy placeholder records for each page's current version into old
+ * Don't do any conversion here; text records are converted at runtime
+ * based on the flags (and may be originally binary!) while the meta
+ * fields will be converted in the old -> rev and cur -> page steps.
+ */
+ $this->setChunkScale( $chunksize, $maxcur, 'old', __METHOD__ );
+ $result = $this->dbr->query(
+ "SELECT cur_id, cur_namespace, cur_title, $cur_text AS text, cur_comment,
+ cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags AS flags
+ FROM $cur
+ ORDER BY cur_id", __METHOD__ );
+ $add = array();
+ foreach ( $result as $row ) {
+ $add[] = array(
+ 'old_namespace' => $row->cur_namespace,
+ 'old_title' => $row->cur_title,
+ 'old_text' => $row->text,
+ 'old_comment' => $row->cur_comment,
+ 'old_user' => $row->cur_user,
+ 'old_user_text' => $row->cur_user_text,
+ 'old_timestamp' => $row->cur_timestamp,
+ 'old_minor_edit' => $row->cur_minor_edit,
+ 'old_flags' => $row->flags );
+ $this->addChunk( $add, $row->cur_id );
+ }
+ $this->lastChunk( $add );
+
+ /**
+ * Copy revision metadata from old into revision.
+ * We'll also do UTF-8 conversion of usernames and comments.
+ */
+ # $newmaxold = $this->dbw->selectField( 'old', 'max(old_id)', '', __METHOD__ );
+ # $this->setChunkScale( $chunksize, $newmaxold, 'revision', __METHOD__ );
+ # $countold = $this->dbw->selectField( 'old', 'count(old_id)', '', __METHOD__ );
+ $countold = $this->dbw->selectField( 'old', 'max(old_id)', '', __METHOD__ );
+ $this->setChunkScale( $chunksize, $countold, 'revision', __METHOD__ );
+
+ $this->log( "......Setting up revision table." );
+ $result = $this->dbr->query(
+ "SELECT old_id, cur_id, old_comment, old_user, old_user_text,
+ old_timestamp, old_minor_edit
+ FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title",
+ __METHOD__ );
+
+ $add = array();
+ foreach ( $result as $row ) {
+ $add[] = array(
+ 'rev_id' => $row->old_id,
+ 'rev_page' => $row->cur_id,
+ 'rev_text_id' => $row->old_id,
+ 'rev_comment' => $this->conv( $row->old_comment ),
+ 'rev_user' => $row->old_user,
+ 'rev_user_text' => $this->conv( $row->old_user_text ),
+ 'rev_timestamp' => $row->old_timestamp,
+ 'rev_minor_edit' => $row->old_minor_edit );
+ $this->addChunk( $add );
+ }
+ $this->lastChunk( $add );
+
+
+ /**
+ * Copy page metadata from cur into page.
+ * We'll also do UTF-8 conversion of titles.
+ */
+ $this->log( "......Setting up page table." );
+ $this->setChunkScale( $chunksize, $maxcur, 'page', __METHOD__ );
+ $result = $this->dbr->query( "
+ SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
+ cur_random, cur_touched, rev_id, LENGTH(cur_text) AS len
+ FROM $cur,$revision
+ WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}
+ ORDER BY cur_id", __METHOD__ );
+ $add = array();
+ foreach ( $result as $row ) {
+ $add[] = array(
+ 'page_id' => $row->cur_id,
+ 'page_namespace' => $row->cur_namespace,
+ 'page_title' => $this->conv( $row->cur_title ),
+ 'page_restrictions' => $row->cur_restrictions,
+ 'page_counter' => $row->cur_counter,
+ 'page_is_redirect' => $row->cur_is_redirect,
+ 'page_is_new' => $row->cur_is_new,
+ 'page_random' => $row->cur_random,
+ 'page_touched' => $this->dbw->timestamp(),
+ 'page_latest' => $row->rev_id,
+ 'page_len' => $row->len );
+ # $this->addChunk( $add, $row->cur_id );
+ $this->addChunk( $add );
+ }
+ $this->lastChunk( $add );
+
+ $this->log( "...done with cur/old -> page/revision." );
+ }
+
+ function upgradeLinks() {
+ $chunksize = 200;
+ list ( $links, $brokenlinks, $pagelinks, $cur ) = $this->dbw->tableNamesN( 'links', 'brokenlinks', 'pagelinks', 'cur' );
+
+ $this->log( 'Checking for interwiki table change in case of bogus items...' );
+ if ( $this->dbw->fieldExists( 'interwiki', 'iw_trans' ) ) {
+ $this->log( 'interwiki has iw_trans.' );
+ } else {
+ global $IP;
+ $this->log( 'adding iw_trans...' );
+ $this->dbw->sourceFile( $IP . '/maintenance/archives/patch-interwiki-trans.sql' );
+ $this->log( 'added iw_trans.' );
+ }
+
+ $this->log( 'Creating pagelinks table...' );
+ $this->dbw->query( "
+CREATE TABLE $pagelinks (
+ -- Key to the page_id of the page containing the link.
+ pl_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ pl_namespace int NOT NULL default '0',
+ pl_title varchar(255) binary NOT NULL default '',
+
+ UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
+ KEY (pl_namespace,pl_title)
+
+) TYPE=InnoDB" );
+
+ $this->log( 'Importing live links -> pagelinks' );
+ $nlinks = $this->dbw->selectField( 'links', 'count(*)', '', __METHOD__ );
+ if ( $nlinks ) {
+ $this->setChunkScale( $chunksize, $nlinks, 'pagelinks', __METHOD__ );
+ $result = $this->dbr->query( "
+ SELECT l_from,cur_namespace,cur_title
+ FROM $links, $cur
+ WHERE l_to=cur_id", __METHOD__ );
+ $add = array();
+ foreach ( $result as $row ) {
+ $add[] = array(
+ 'pl_from' => $row->l_from,
+ 'pl_namespace' => $row->cur_namespace,
+ 'pl_title' => $this->conv( $row->cur_title ) );
+ $this->addChunk( $add );
+ }
+ $this->lastChunk( $add );
+ } else {
+ $this->log( 'no links!' );
+ }
+
+ $this->log( 'Importing brokenlinks -> pagelinks' );
+ $nbrokenlinks = $this->dbw->selectField( 'brokenlinks', 'count(*)', '', __METHOD__ );
+ if ( $nbrokenlinks ) {
+ $this->setChunkScale( $chunksize, $nbrokenlinks, 'pagelinks', __METHOD__ );
+ $result = $this->dbr->query(
+ "SELECT bl_from, bl_to FROM $brokenlinks",
+ __METHOD__ );
+ $add = array();
+ foreach ( $result as $row ) {
+ $pagename = $this->conv( $row->bl_to );
+ $title = Title::newFromText( $pagename );
+ if ( is_null( $title ) ) {
+ $this->log( "** invalid brokenlink: $row->bl_from -> '$pagename' (converted from '$row->bl_to')" );
+ } else {
+ $add[] = array(
+ 'pl_from' => $row->bl_from,
+ 'pl_namespace' => $title->getNamespace(),
+ 'pl_title' => $title->getDBkey() );
+ $this->addChunk( $add );
+ }
+ }
+ $this->lastChunk( $add );
+ } else {
+ $this->log( 'no brokenlinks!' );
+ }
+
+ $this->log( 'Done with links.' );
+ }
+
+ function userDupeCallback( $str ) {
+ echo $str;
+ }
+
+ function upgradeUser() {
+ // Apply unique index, if necessary:
+ $duper = new UserDupes( $this->dbw, array( $this, 'userDupeCallback' ) );
+ if ( $duper->hasUniqueIndex() ) {
+ $this->log( "Already have unique user_name index." );
+ } else {
+ $this->log( "Clearing user duplicates..." );
+ if ( !$duper->clearDupes() ) {
+ $this->log( "WARNING: Duplicate user accounts, may explode!" );
+ }
+ }
+
+ $tabledef = <<<END
+CREATE TABLE $1 (
+ user_id int(5) unsigned NOT NULL auto_increment,
+ user_name varchar(255) binary NOT NULL default '',
+ user_real_name varchar(255) binary NOT NULL default '',
+ user_password tinyblob NOT NULL default '',
+ user_newpassword tinyblob NOT NULL default '',
+ user_email tinytext NOT NULL default '',
+ user_options blob NOT NULL default '',
+ user_touched char(14) binary NOT NULL default '',
+ user_token char(32) binary NOT NULL default '',
+ user_email_authenticated CHAR(14) BINARY,
+ user_email_token CHAR(32) BINARY,
+ user_email_token_expires CHAR(14) BINARY,
+
+ PRIMARY KEY user_id (user_id),
+ UNIQUE INDEX user_name (user_name),
+ INDEX (user_email_token)
+
+) TYPE=InnoDB
+END;
+ $fields = array(
+ 'user_id' => MW_UPGRADE_COPY,
+ 'user_name' => MW_UPGRADE_ENCODE,
+ 'user_real_name' => MW_UPGRADE_ENCODE,
+ 'user_password' => MW_UPGRADE_COPY,
+ 'user_newpassword' => MW_UPGRADE_COPY,
+ 'user_email' => MW_UPGRADE_ENCODE,
+ 'user_options' => MW_UPGRADE_ENCODE,
+ 'user_touched' => MW_UPGRADE_CALLBACK,
+ 'user_token' => MW_UPGRADE_COPY,
+ 'user_email_authenticated' => MW_UPGRADE_CALLBACK,
+ 'user_email_token' => MW_UPGRADE_NULL,
+ 'user_email_token_expires' => MW_UPGRADE_NULL );
+ $this->copyTable( 'user', $tabledef, $fields,
+ array( &$this, 'userCallback' ) );
+ }
+
+ function userCallback( $row, $copy ) {
+ $now = $this->dbw->timestamp();
+ $copy['user_touched'] = $now;
+ $copy['user_email_authenticated'] = $this->emailAuth ? $now : null;
+ return $copy;
+ }
+
+ function upgradeImage() {
+ $tabledef = <<<END
+CREATE TABLE $1 (
+ img_name varchar(255) binary NOT NULL default '',
+ img_size int(8) unsigned NOT NULL default '0',
+ img_width int(5) NOT NULL default '0',
+ img_height int(5) NOT NULL default '0',
+ img_metadata mediumblob NOT NULL,
+ img_bits int(3) NOT NULL default '0',
+ img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+ img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
+ img_minor_mime varchar(32) NOT NULL default "unknown",
+ img_description tinyblob NOT NULL default '',
+ img_user int(5) unsigned NOT NULL default '0',
+ img_user_text varchar(255) binary NOT NULL default '',
+ img_timestamp char(14) binary NOT NULL default '',
+
+ PRIMARY KEY img_name (img_name),
+ INDEX img_size (img_size),
+ INDEX img_timestamp (img_timestamp)
+) TYPE=InnoDB
+END;
+ $fields = array(
+ 'img_name' => MW_UPGRADE_ENCODE,
+ 'img_size' => MW_UPGRADE_COPY,
+ 'img_width' => MW_UPGRADE_CALLBACK,
+ 'img_height' => MW_UPGRADE_CALLBACK,
+ 'img_metadata' => MW_UPGRADE_CALLBACK,
+ 'img_bits' => MW_UPGRADE_CALLBACK,
+ 'img_media_type' => MW_UPGRADE_CALLBACK,
+ 'img_major_mime' => MW_UPGRADE_CALLBACK,
+ 'img_minor_mime' => MW_UPGRADE_CALLBACK,
+ 'img_description' => MW_UPGRADE_ENCODE,
+ 'img_user' => MW_UPGRADE_COPY,
+ 'img_user_text' => MW_UPGRADE_ENCODE,
+ 'img_timestamp' => MW_UPGRADE_COPY );
+ $this->copyTable( 'image', $tabledef, $fields,
+ array( &$this, 'imageCallback' ) );
+ }
+
+ function imageCallback( $row, $copy ) {
+ if ( !$this->hasOption( 'noimage' ) ) {
+ // Fill in the new image info fields
+ $info = $this->imageInfo( $row->img_name );
+
+ $copy['img_width' ] = $info['width'];
+ $copy['img_height' ] = $info['height'];
+ $copy['img_metadata' ] = ""; // loaded on-demand
+ $copy['img_bits' ] = $info['bits'];
+ $copy['img_media_type'] = $info['media'];
+ $copy['img_major_mime'] = $info['major'];
+ $copy['img_minor_mime'] = $info['minor'];
+ }
+
+ // If doing UTF8 conversion the file must be renamed
+ $this->renameFile( $row->img_name, 'wfImageDir' );
+
+ return $copy;
+ }
+
+ function imageInfo( $filename ) {
+ $info = array(
+ 'width' => 0,
+ 'height' => 0,
+ 'bits' => 0,
+ 'media' => '',
+ 'major' => '',
+ 'minor' => '' );
+
+ $magic = MimeMagic::singleton();
+ $mime = $magic->guessMimeType( $filename, true );
+ list( $info['major'], $info['minor'] ) = explode( '/', $mime );
-$upgrade = new FiveUpgrade();
-$step = isset( $options['step'] ) ? $options['step'] : null;
-$upgrade->upgrade( $step );
+ $info['media'] = $magic->getMediaType( $filename, $mime );
+ $image = UnregisteredLocalFile::newFromPath( $filename, $mime );
+
+ $info['width'] = $image->getWidth();
+ $info['height'] = $image->getHeight();
+
+ $gis = $image->getImageSize( $filename );
+ if ( isset( $gis['bits'] ) ) {
+ $info['bits'] = $gis['bits'];
+ }
+
+ return $info;
+ }
+
+
+ /**
+ * Truncate a table.
+ * @param string $table The table name to be truncated
+ */
+ function clearTable( $table ) {
+ print "Clearing $table...\n";
+ $tableName = $this->db->tableName( $table );
+ $this->db->query( "TRUNCATE $tableName" );
+ }
+
+ /**
+ * Rename a given image or archived image file to the converted filename,
+ * leaving a symlink for URL compatibility.
+ *
+ * @param string $oldname pre-conversion filename
+ * @param string $basename pre-conversion base filename for dir hashing, if an archive
+ * @access private
+ */
+ function renameFile( $oldname, $subdirCallback = 'wfImageDir', $basename = null ) {
+ $newname = $this->conv( $oldname );
+ if ( $newname == $oldname ) {
+ // No need to rename; another field triggered this row.
+ return false;
+ }
+
+ if ( is_null( $basename ) ) $basename = $oldname;
+ $ubasename = $this->conv( $basename );
+ $oldpath = call_user_func( $subdirCallback, $basename ) . '/' . $oldname;
+ $newpath = call_user_func( $subdirCallback, $ubasename ) . '/' . $newname;
+
+ $this->log( "$oldpath -> $newpath" );
+ if ( rename( $oldpath, $newpath ) ) {
+ $relpath = wfRelativePath( $newpath, dirname( $oldpath ) );
+ if ( !symlink( $relpath, $oldpath ) ) {
+ $this->log( "... symlink failed!" );
+ }
+ return $newname;
+ } else {
+ $this->log( "... rename failed!" );
+ return false;
+ }
+ }
+
+ function upgradeOldImage() {
+ $tabledef = <<<END
+CREATE TABLE $1 (
+ -- Base filename: key to image.img_name
+ oi_name varchar(255) binary NOT NULL default '',
+
+ -- Filename of the archived file.
+ -- This is generally a timestamp and '!' prepended to the base name.
+ oi_archive_name varchar(255) binary NOT NULL default '',
+
+ -- Other fields as in image...
+ oi_size int(8) unsigned NOT NULL default 0,
+ oi_width int(5) NOT NULL default 0,
+ oi_height int(5) NOT NULL default 0,
+ oi_bits int(3) NOT NULL default 0,
+ oi_description tinyblob NOT NULL default '',
+ oi_user int(5) unsigned NOT NULL default '0',
+ oi_user_text varchar(255) binary NOT NULL default '',
+ oi_timestamp char(14) binary NOT NULL default '',
+
+ INDEX oi_name (oi_name(10))
+
+) TYPE=InnoDB;
+END;
+ $fields = array(
+ 'oi_name' => MW_UPGRADE_ENCODE,
+ 'oi_archive_name' => MW_UPGRADE_ENCODE,
+ 'oi_size' => MW_UPGRADE_COPY,
+ 'oi_width' => MW_UPGRADE_CALLBACK,
+ 'oi_height' => MW_UPGRADE_CALLBACK,
+ 'oi_bits' => MW_UPGRADE_CALLBACK,
+ 'oi_description' => MW_UPGRADE_ENCODE,
+ 'oi_user' => MW_UPGRADE_COPY,
+ 'oi_user_text' => MW_UPGRADE_ENCODE,
+ 'oi_timestamp' => MW_UPGRADE_COPY );
+ $this->copyTable( 'oldimage', $tabledef, $fields,
+ array( &$this, 'oldimageCallback' ) );
+ }
+
+ function oldimageCallback( $row, $copy ) {
+ global $options;
+ if ( !isset( $options['noimage'] ) ) {
+ // Fill in the new image info fields
+ $info = $this->imageInfo( $row->oi_archive_name, 'wfImageArchiveDir', $row->oi_name );
+ $copy['oi_width' ] = $info['width' ];
+ $copy['oi_height'] = $info['height'];
+ $copy['oi_bits' ] = $info['bits' ];
+ }
+
+ // If doing UTF8 conversion the file must be renamed
+ $this->renameFile( $row->oi_archive_name, 'wfImageArchiveDir', $row->oi_name );
+
+ return $copy;
+ }
+
+
+ function upgradeWatchlist() {
+ $chunksize = 100;
+
+ list ( $watchlist, $watchlist_temp ) = $this->dbw->tableNamesN( 'watchlist', 'watchlist_temp' );
+
+ $this->log( 'Migrating watchlist table to watchlist_temp...' );
+ $this->dbw->query(
+"CREATE TABLE $watchlist_temp (
+ -- Key to user_id
+ wl_user int(5) unsigned NOT NULL,
+
+ -- Key to page_namespace/page_title
+ -- Note that users may watch patches which do not exist yet,
+ -- or existed in the past but have been deleted.
+ wl_namespace int NOT NULL default '0',
+ wl_title varchar(255) binary NOT NULL default '',
+
+ -- Timestamp when user was last sent a notification e-mail;
+ -- cleared when the user visits the page.
+ -- FIXME: add proper null support etc
+ wl_notificationtimestamp varchar(14) binary NOT NULL default '0',
+
+ UNIQUE KEY (wl_user, wl_namespace, wl_title),
+ KEY namespace_title (wl_namespace,wl_title)
+
+) TYPE=InnoDB;", __METHOD__ );
+
+ // Fix encoding for Latin-1 upgrades, add some fields,
+ // and double article to article+talk pairs
+ $numwatched = $this->dbw->selectField( 'watchlist', 'count(*)', '', __METHOD__ );
+
+ $this->setChunkScale( $chunksize, $numwatched * 2, 'watchlist_temp', __METHOD__ );
+ $result = $this->dbr->select( 'watchlist',
+ array(
+ 'wl_user',
+ 'wl_namespace',
+ 'wl_title' ),
+ '',
+ __METHOD__ );
+
+ $add = array();
+ foreach ( $result as $row ) {
+ $add[] = array(
+ 'wl_user' => $row->wl_user,
+ 'wl_namespace' => MWNamespace::getSubject( $row->wl_namespace ),
+ 'wl_title' => $this->conv( $row->wl_title ),
+ 'wl_notificationtimestamp' => '0' );
+ $this->addChunk( $add );
+
+ $add[] = array(
+ 'wl_user' => $row->wl_user,
+ 'wl_namespace' => MWNamespace::getTalk( $row->wl_namespace ),
+ 'wl_title' => $this->conv( $row->wl_title ),
+ 'wl_notificationtimestamp' => '0' );
+ $this->addChunk( $add );
+ }
+ $this->lastChunk( $add );
+
+ $this->log( 'Done converting watchlist.' );
+ $this->cleanupSwaps[] = 'watchlist';
+ }
+
+ function upgradeLogging() {
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ -- Symbolic keys for the general log type and the action type
+ -- within the log. The output format will be controlled by the
+ -- action field, but only the type controls categorization.
+ log_type char(10) NOT NULL default '',
+ log_action char(10) NOT NULL default '',
+
+ -- Timestamp. Duh.
+ log_timestamp char(14) NOT NULL default '19700101000000',
+
+ -- The user who performed this action; key to user_id
+ log_user int unsigned NOT NULL default 0,
+
+ -- Key to the page affected. Where a user is the target,
+ -- this will point to the user page.
+ log_namespace int NOT NULL default 0,
+ log_title varchar(255) binary NOT NULL default '',
+
+ -- Freeform text. Interpreted as edit history comments.
+ log_comment varchar(255) NOT NULL default '',
+
+ -- LF separated list of miscellaneous parameters
+ log_params blob NOT NULL default '',
+
+ KEY type_time (log_type, log_timestamp),
+ KEY user_time (log_user, log_timestamp),
+ KEY page_time (log_namespace, log_title, log_timestamp)
+
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'log_type' => MW_UPGRADE_COPY,
+ 'log_action' => MW_UPGRADE_COPY,
+ 'log_timestamp' => MW_UPGRADE_COPY,
+ 'log_user' => MW_UPGRADE_COPY,
+ 'log_namespace' => MW_UPGRADE_COPY,
+ 'log_title' => MW_UPGRADE_ENCODE,
+ 'log_comment' => MW_UPGRADE_ENCODE,
+ 'log_params' => MW_UPGRADE_ENCODE );
+ $this->copyTable( 'logging', $tabledef, $fields );
+ }
+
+ function upgradeArchive() {
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ ar_namespace int NOT NULL default '0',
+ ar_title varchar(255) binary NOT NULL default '',
+ ar_text mediumblob NOT NULL default '',
+
+ ar_comment tinyblob NOT NULL default '',
+ ar_user int(5) unsigned NOT NULL default '0',
+ ar_user_text varchar(255) binary NOT NULL,
+ ar_timestamp char(14) binary NOT NULL default '',
+ ar_minor_edit tinyint(1) NOT NULL default '0',
+
+ ar_flags tinyblob NOT NULL default '',
+
+ ar_rev_id int(8) unsigned,
+ ar_text_id int(8) unsigned,
+
+ KEY name_title_timestamp (ar_namespace,ar_title,ar_timestamp)
+
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'ar_namespace' => MW_UPGRADE_COPY,
+ 'ar_title' => MW_UPGRADE_ENCODE,
+ 'ar_text' => MW_UPGRADE_COPY,
+ 'ar_comment' => MW_UPGRADE_ENCODE,
+ 'ar_user' => MW_UPGRADE_COPY,
+ 'ar_user_text' => MW_UPGRADE_ENCODE,
+ 'ar_timestamp' => MW_UPGRADE_COPY,
+ 'ar_minor_edit' => MW_UPGRADE_COPY,
+ 'ar_flags' => MW_UPGRADE_COPY,
+ 'ar_rev_id' => MW_UPGRADE_NULL,
+ 'ar_text_id' => MW_UPGRADE_NULL );
+ $this->copyTable( 'archive', $tabledef, $fields );
+ }
+
+ function upgradeImagelinks() {
+ global $wgUseLatin1;
+ if ( $wgUseLatin1 ) {
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ -- Key to page_id of the page containing the image / media link.
+ il_from int(8) unsigned NOT NULL default '0',
+
+ -- Filename of target image.
+ -- This is also the page_title of the file's description page;
+ -- all such pages are in namespace 6 (NS_FILE).
+ il_to varchar(255) binary NOT NULL default '',
+
+ UNIQUE KEY il_from(il_from,il_to),
+ KEY (il_to)
+
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'il_from' => MW_UPGRADE_COPY,
+ 'il_to' => MW_UPGRADE_ENCODE );
+ $this->copyTable( 'imagelinks', $tabledef, $fields );
+ }
+ }
+
+ function upgradeCategorylinks() {
+ global $wgUseLatin1;
+ if ( $wgUseLatin1 ) {
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ cl_from int(8) unsigned NOT NULL default '0',
+ cl_to varchar(255) binary NOT NULL default '',
+ cl_sortkey varchar(86) binary NOT NULL default '',
+ cl_timestamp timestamp NOT NULL,
+
+ UNIQUE KEY cl_from(cl_from,cl_to),
+ KEY cl_sortkey(cl_to,cl_sortkey),
+ KEY cl_timestamp(cl_to,cl_timestamp)
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'cl_from' => MW_UPGRADE_COPY,
+ 'cl_to' => MW_UPGRADE_ENCODE,
+ 'cl_sortkey' => MW_UPGRADE_ENCODE,
+ 'cl_timestamp' => MW_UPGRADE_COPY );
+ $this->copyTable( 'categorylinks', $tabledef, $fields );
+ }
+ }
+
+ function upgradeIpblocks() {
+ global $wgUseLatin1;
+ if ( $wgUseLatin1 ) {
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ ipb_id int(8) NOT NULL auto_increment,
+ ipb_address varchar(40) binary NOT NULL default '',
+ ipb_user int(8) unsigned NOT NULL default '0',
+ ipb_by int(8) unsigned NOT NULL default '0',
+ ipb_reason tinyblob NOT NULL default '',
+ ipb_timestamp char(14) binary NOT NULL default '',
+ ipb_auto tinyint(1) NOT NULL default '0',
+ ipb_expiry char(14) binary NOT NULL default '',
+
+ PRIMARY KEY ipb_id (ipb_id),
+ INDEX ipb_address (ipb_address),
+ INDEX ipb_user (ipb_user)
+
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'ipb_id' => MW_UPGRADE_COPY,
+ 'ipb_address' => MW_UPGRADE_COPY,
+ 'ipb_user' => MW_UPGRADE_COPY,
+ 'ipb_by' => MW_UPGRADE_COPY,
+ 'ipb_reason' => MW_UPGRADE_ENCODE,
+ 'ipb_timestamp' => MW_UPGRADE_COPY,
+ 'ipb_auto' => MW_UPGRADE_COPY,
+ 'ipb_expiry' => MW_UPGRADE_COPY );
+ $this->copyTable( 'ipblocks', $tabledef, $fields );
+ }
+ }
+
+ function upgradeRecentchanges() {
+ // There's a format change in the namespace field
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ rc_id int(8) NOT NULL auto_increment,
+ rc_timestamp varchar(14) binary NOT NULL default '',
+ rc_cur_time varchar(14) binary NOT NULL default '',
+
+ rc_user int(10) unsigned NOT NULL default '0',
+ rc_user_text varchar(255) binary NOT NULL default '',
+
+ rc_namespace int NOT NULL default '0',
+ rc_title varchar(255) binary NOT NULL default '',
+
+ rc_comment varchar(255) binary NOT NULL default '',
+ rc_minor tinyint(3) unsigned NOT NULL default '0',
+
+ rc_bot tinyint(3) unsigned NOT NULL default '0',
+ rc_new tinyint(3) unsigned NOT NULL default '0',
+
+ rc_cur_id int(10) unsigned NOT NULL default '0',
+ rc_this_oldid int(10) unsigned NOT NULL default '0',
+ rc_last_oldid int(10) unsigned NOT NULL default '0',
+
+ rc_type tinyint(3) unsigned NOT NULL default '0',
+ rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
+ rc_moved_to_title varchar(255) binary NOT NULL default '',
+
+ rc_patrolled tinyint(3) unsigned NOT NULL default '0',
+
+ rc_ip char(15) NOT NULL default '',
+
+ PRIMARY KEY rc_id (rc_id),
+ INDEX rc_timestamp (rc_timestamp),
+ INDEX rc_namespace_title (rc_namespace, rc_title),
+ INDEX rc_cur_id (rc_cur_id),
+ INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
+ INDEX rc_ip (rc_ip)
+
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'rc_id' => MW_UPGRADE_COPY,
+ 'rc_timestamp' => MW_UPGRADE_COPY,
+ 'rc_cur_time' => MW_UPGRADE_COPY,
+ 'rc_user' => MW_UPGRADE_COPY,
+ 'rc_user_text' => MW_UPGRADE_ENCODE,
+ 'rc_namespace' => MW_UPGRADE_COPY,
+ 'rc_title' => MW_UPGRADE_ENCODE,
+ 'rc_comment' => MW_UPGRADE_ENCODE,
+ 'rc_minor' => MW_UPGRADE_COPY,
+ 'rc_bot' => MW_UPGRADE_COPY,
+ 'rc_new' => MW_UPGRADE_COPY,
+ 'rc_cur_id' => MW_UPGRADE_COPY,
+ 'rc_this_oldid' => MW_UPGRADE_COPY,
+ 'rc_last_oldid' => MW_UPGRADE_COPY,
+ 'rc_type' => MW_UPGRADE_COPY,
+ 'rc_moved_to_ns' => MW_UPGRADE_COPY,
+ 'rc_moved_to_title' => MW_UPGRADE_ENCODE,
+ 'rc_patrolled' => MW_UPGRADE_COPY,
+ 'rc_ip' => MW_UPGRADE_COPY );
+ $this->copyTable( 'recentchanges', $tabledef, $fields );
+ }
+
+ function upgradeQuerycache() {
+ // There's a format change in the namespace field
+ $tabledef = <<<ENDS
+CREATE TABLE $1 (
+ -- A key name, generally the base name of of the special page.
+ qc_type char(32) NOT NULL,
+
+ -- Some sort of stored value. Sizes, counts...
+ qc_value int(5) unsigned NOT NULL default '0',
+
+ -- Target namespace+title
+ qc_namespace int NOT NULL default '0',
+ qc_title char(255) binary NOT NULL default '',
+
+ KEY (qc_type,qc_value)
+
+) TYPE=InnoDB
+ENDS;
+ $fields = array(
+ 'qc_type' => MW_UPGRADE_COPY,
+ 'qc_value' => MW_UPGRADE_COPY,
+ 'qc_namespace' => MW_UPGRADE_COPY,
+ 'qc_title' => MW_UPGRADE_ENCODE );
+ $this->copyTable( 'querycache', $tabledef, $fields );
+ }
+
+ /**
+ * Check for duplicate rows in "cur" table and move duplicates entries in
+ * "old" table.
+ *
+ * This was in cleanupDupes.inc before.
+ */
+ function checkDupes() {
+ $dbw = wfGetDB( DB_MASTER );
+ if ( $dbw->indexExists( 'cur', 'name_title' ) &&
+ $dbw->indexUnique( 'cur', 'name_title' ) ) {
+ echo wfWikiID() . ": cur table has the current unique index; no duplicate entries.\n";
+ return;
+ } elseif ( $dbw->indexExists( 'cur', 'name_title_dup_prevention' ) ) {
+ echo wfWikiID() . ": cur table has a temporary name_title_dup_prevention unique index; no duplicate entries.\n";
+ return;
+ }
+
+ echo wfWikiID() . ": cur table has the old non-unique index and may have duplicate entries.\n";
+
+ $dbw = wfGetDB( DB_MASTER );
+ $cur = $dbw->tableName( 'cur' );
+ $old = $dbw->tableName( 'old' );
+ $dbw->query( "LOCK TABLES $cur WRITE, $old WRITE" );
+ echo "Checking for duplicate cur table entries... (this may take a while on a large wiki)\n";
+ $res = $dbw->query( <<<END
+SELECT cur_namespace,cur_title,count(*) as c,min(cur_id) as id
+ FROM $cur
+ GROUP BY cur_namespace,cur_title
+HAVING c > 1
+END
+ );
+ $n = $dbw->numRows( $res );
+ echo "Found $n titles with duplicate entries.\n";
+ if ( $n > 0 ) {
+ echo "Correcting...\n";
+ foreach ( $res as $row ) {
+ $ns = intval( $row->cur_namespace );
+ $title = $dbw->addQuotes( $row->cur_title );
+
+ # Get the first responding ID; that'll be the one we keep.
+ $id = $dbw->selectField( 'cur', 'cur_id', array(
+ 'cur_namespace' => $row->cur_namespace,
+ 'cur_title' => $row->cur_title ) );
+
+ echo "$ns:$row->cur_title (canonical ID $id)\n";
+ if ( $id != $row->id ) {
+ echo " ** minimum ID $row->id; ";
+ $timeMin = $dbw->selectField( 'cur', 'cur_timestamp', array(
+ 'cur_id' => $row->id ) );
+ $timeFirst = $dbw->selectField( 'cur', 'cur_timestamp', array(
+ 'cur_id' => $id ) );
+ if ( $timeMin == $timeFirst ) {
+ echo "timestamps match at $timeFirst; ok\n";
+ } else {
+ echo "timestamps don't match! min: $timeMin, first: $timeFirst; ";
+ if ( $timeMin > $timeFirst ) {
+ $id = $row->id;
+ echo "keeping minimum: $id\n";
+ } else {
+ echo "keeping first: $id\n";
+ }
+ }
+ }
+
+ $dbw->query( <<<END
+INSERT
+ INTO $old
+ (old_namespace, old_title, old_text,
+ old_comment, old_user, old_user_text,
+ old_timestamp, old_minor_edit, old_flags,
+ inverse_timestamp)
+SELECT cur_namespace, cur_title, cur_text,
+ cur_comment, cur_user, cur_user_text,
+ cur_timestamp, cur_minor_edit, '',
+ inverse_timestamp
+ FROM $cur
+ WHERE cur_namespace=$ns
+ AND cur_title=$title
+ AND cur_id != $id
+END
+ );
+ $dbw->query( <<<END
+DELETE
+ FROM $cur
+ WHERE cur_namespace=$ns
+ AND cur_title=$title
+ AND cur_id != $id
+END
+ );
+ }
+ }
+ $dbw->query( 'UNLOCK TABLES' );
+ echo "Done.\n";
+ }
+
+ /**
+ * Rename all our temporary tables into final place.
+ * We've left things in place so a read-only wiki can continue running
+ * on the old code during all this.
+ */
+ function upgradeCleanup() {
+ $this->renameTable( 'old', 'text' );
+
+ foreach ( $this->cleanupSwaps as $table ) {
+ $this->swap( $table );
+ }
+ }
+
+ function renameTable( $from, $to ) {
+ $this->log( "Renaming $from to $to..." );
+
+ $fromtable = $this->dbw->tableName( $from );
+ $totable = $this->dbw->tableName( $to );
+ $this->dbw->query( "ALTER TABLE $fromtable RENAME TO $totable" );
+ }
+
+ function swap( $base ) {
+ $this->renameTable( $base, "{$base}_old" );
+ $this->renameTable( "{$base}_temp", $base );
+ }
+
+}
+$maintClass = 'FiveUpgrade';
+require( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/userDupes.inc b/maintenance/userDupes.inc
index 2f224c3d..7c2bca1c 100644
--- a/maintenance/userDupes.inc
+++ b/maintenance/userDupes.inc
@@ -31,9 +31,19 @@ class UserDupes {
var $reassigned;
var $trimmed;
var $failed;
+ private $outputCallback;
- function UserDupes( &$database ) {
- $this->db =& $database;
+ function __construct( &$database, $outputCallback ) {
+ $this->db = $database;
+ $this->outputCallback = $outputCallback;
+ }
+
+ /**
+ * Output some text via the output callback provided
+ * @param $str String Text to print
+ */
+ private function out( $str ) {
+ call_user_func( $this->outputCallback, $str );
}
/**
@@ -42,10 +52,9 @@ class UserDupes {
* @return bool
*/
function hasUniqueIndex() {
- $fname = 'UserDupes::hasUniqueIndex';
- $info = $this->db->indexInfo( 'user', 'user_name', $fname );
- if( !$info ) {
- wfOut( "WARNING: doesn't seem to have user_name index at all!\n" );
+ $info = $this->db->indexInfo( 'user', 'user_name', __METHOD__ );
+ if ( !$info ) {
+ $this->out( "WARNING: doesn't seem to have user_name index at all!\n" );
return false;
}
@@ -85,55 +94,55 @@ class UserDupes {
* @return bool
*/
function checkDupes( $doDelete = false ) {
- if( $this->hasUniqueIndex() ) {
- echo wfWikiID()." already has a unique index on its user table.\n";
+ if ( $this->hasUniqueIndex() ) {
+ echo wfWikiID() . " already has a unique index on its user table.\n";
return true;
}
$this->lock();
- wfOut( "Checking for duplicate accounts...\n" );
+ $this->out( "Checking for duplicate accounts...\n" );
$dupes = $this->getDupes();
$count = count( $dupes );
- wfOut( "Found $count accounts with duplicate records on ".wfWikiID().".\n" );
+ $this->out( "Found $count accounts with duplicate records on " . wfWikiID() . ".\n" );
$this->trimmed = 0;
$this->reassigned = 0;
$this->failed = 0;
- foreach( $dupes as $name ) {
+ foreach ( $dupes as $name ) {
$this->examine( $name, $doDelete );
}
$this->unlock();
- wfOut( "\n" );
+ $this->out( "\n" );
- if( $this->reassigned > 0 ) {
- if( $doDelete ) {
- wfOut( "$this->reassigned duplicate accounts had edits reassigned to a canonical record id.\n" );
+ if ( $this->reassigned > 0 ) {
+ if ( $doDelete ) {
+ $this->out( "$this->reassigned duplicate accounts had edits reassigned to a canonical record id.\n" );
} else {
- wfOut( "$this->reassigned duplicate accounts need to have edits reassigned.\n" );
+ $this->out( "$this->reassigned duplicate accounts need to have edits reassigned.\n" );
}
}
- if( $this->trimmed > 0 ) {
- if( $doDelete ) {
- wfOut( "$this->trimmed duplicate user records were deleted from ".wfWikiID().".\n" );
+ if ( $this->trimmed > 0 ) {
+ if ( $doDelete ) {
+ $this->out( "$this->trimmed duplicate user records were deleted from " . wfWikiID() . ".\n" );
} else {
- wfOut( "$this->trimmed duplicate user accounts were found on ".wfWikiID()." which can be removed safely.\n" );
+ $this->out( "$this->trimmed duplicate user accounts were found on " . wfWikiID() . " which can be removed safely.\n" );
}
}
- if( $this->failed > 0 ) {
- wfOut( "Something terribly awry; $this->failed duplicate accounts were not removed.\n" );
+ if ( $this->failed > 0 ) {
+ $this->out( "Something terribly awry; $this->failed duplicate accounts were not removed.\n" );
return false;
}
- if( $this->trimmed == 0 || $doDelete ) {
- wfOut( "It is now safe to apply the unique index on user_name.\n" );
+ if ( $this->trimmed == 0 || $doDelete ) {
+ $this->out( "It is now safe to apply the unique index on user_name.\n" );
return true;
} else {
- wfOut( "Run this script again with the --fix option to automatically delete them.\n" );
+ $this->out( "Run this script again with the --fix option to automatically delete them.\n" );
return false;
}
}
@@ -143,8 +152,7 @@ class UserDupes {
* @access private
*/
function lock() {
- $fname = 'UserDupes::lock';
- if( $this->newSchema() ) {
+ if ( $this->newSchema() ) {
$set = array( 'user', 'revision' );
} else {
$set = array( 'user', 'cur', 'old' );
@@ -152,7 +160,7 @@ class UserDupes {
$names = array_map( array( $this, 'lockTable' ), $set );
$tables = implode( ',', $names );
- $this->db->query( "LOCK TABLES $tables", $fname );
+ $this->db->query( "LOCK TABLES $tables", __METHOD__ );
}
function lockTable( $table ) {
@@ -171,8 +179,7 @@ class UserDupes {
* @access private
*/
function unlock() {
- $fname = 'UserDupes::unlock';
- $this->db->query( "UNLOCK TABLES", $fname );
+ $this->db->query( "UNLOCK TABLES", __METHOD__ );
}
/**
@@ -181,20 +188,17 @@ class UserDupes {
* @access private
*/
function getDupes() {
- $fname = 'UserDupes::listDupes';
$user = $this->db->tableName( 'user' );
$result = $this->db->query(
"SELECT user_name,COUNT(*) AS n
- FROM $user
+ FROM $user
GROUP BY user_name
- HAVING n > 1", $fname );
+ HAVING n > 1", __METHOD__ );
$list = array();
- while( $row = $this->db->fetchObject( $result ) ) {
+ foreach ( $result as $row ) {
$list[] = $row->user_name;
}
- $this->db->freeResult( $result );
-
return $list;
}
@@ -207,46 +211,44 @@ class UserDupes {
* @access private
*/
function examine( $name, $doDelete ) {
- $fname = 'UserDupes::listDupes';
$result = $this->db->select( 'user',
array( 'user_id' ),
array( 'user_name' => $name ),
- $fname );
+ __METHOD__ );
$firstRow = $this->db->fetchObject( $result );
$firstId = $firstRow->user_id;
- wfOut( "Record that will be used for '$name' is user_id=$firstId\n" );
+ $this->out( "Record that will be used for '$name' is user_id=$firstId\n" );
- while( $row = $this->db->fetchObject( $result ) ) {
+ foreach ( $result as $row ) {
$dupeId = $row->user_id;
- wfOut( "... dupe id $dupeId: " );
+ $this->out( "... dupe id $dupeId: " );
$edits = $this->editCount( $dupeId );
- if( $edits > 0 ) {
+ if ( $edits > 0 ) {
$this->reassigned++;
- wfOut( "has $edits edits! " );
- if( $doDelete ) {
+ $this->out( "has $edits edits! " );
+ if ( $doDelete ) {
$this->reassignEdits( $dupeId, $firstId );
$newEdits = $this->editCount( $dupeId );
- if( $newEdits == 0 ) {
- wfOut( "confirmed cleaned. " );
+ if ( $newEdits == 0 ) {
+ $this->out( "confirmed cleaned. " );
} else {
$this->failed++;
- wfOut( "WARNING! $newEdits remaining edits for $dupeId; NOT deleting user.\n" );
+ $this->out( "WARNING! $newEdits remaining edits for $dupeId; NOT deleting user.\n" );
continue;
}
} else {
- wfOut( "(will need to reassign edits on fix)" );
+ $this->out( "(will need to reassign edits on fix)" );
}
} else {
- wfOut( "ok, no edits. " );
+ $this->out( "ok, no edits. " );
}
$this->trimmed++;
- if( $doDelete ) {
+ if ( $doDelete ) {
$this->trimAccount( $dupeId );
}
- wfOut( "\n" );
+ $this->out( "\n" );
}
- $this->db->freeResult( $result );
}
/**
@@ -258,7 +260,7 @@ class UserDupes {
* @access private
*/
function editCount( $userid ) {
- if( $this->newSchema() ) {
+ if ( $this->newSchema() ) {
return $this->editCountOn( 'revision', 'rev_user', $userid );
} else {
return $this->editCountOn( 'cur', 'cur_user', $userid ) +
@@ -275,12 +277,11 @@ class UserDupes {
* @access private
*/
function editCountOn( $table, $field, $userid ) {
- $fname = 'UserDupes::editCountOn';
return intval( $this->db->selectField(
$table,
'COUNT(*)',
array( $field => $userid ),
- $fname ) );
+ __METHOD__ ) );
}
/**
@@ -292,7 +293,7 @@ class UserDupes {
$set = $this->newSchema()
? array( 'revision' => 'rev_user' )
: array( 'cur' => 'cur_user', 'old' => 'old_user' );
- foreach( $set as $table => $field ) {
+ foreach ( $set as $table => $field ) {
$this->reassignEditsOn( $table, $field, $from, $to );
}
}
@@ -305,13 +306,12 @@ class UserDupes {
* @access private
*/
function reassignEditsOn( $table, $field, $from, $to ) {
- $fname = 'UserDupes::reassignEditsOn';
- wfOut( "reassigning on $table... " );
+ $this->out( "reassigning on $table... " );
$this->db->update( $table,
array( $field => $to ),
array( $field => $from ),
- $fname );
- wfOut( "ok. " );
+ __METHOD__ );
+ $this->out( "ok. " );
}
/**
@@ -320,10 +320,9 @@ class UserDupes {
* @access private
*/
function trimAccount( $userid ) {
- $fname = 'UserDupes::trimAccount';
- wfOut( "deleting..." );
- $this->db->delete( 'user', array( 'user_id' => $userid ), $fname );
- wfOut( " ok" );
+ $this->out( "deleting..." );
+ $this->db->delete( 'user', array( 'user_id' => $userid ), __METHOD__ );
+ $this->out( " ok" );
}
}
diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc
index d660019d..deb12bc8 100644
--- a/maintenance/userOptions.inc
+++ b/maintenance/userOptions.inc
@@ -8,7 +8,7 @@
$options = array( 'list', 'nowarn', 'quiet', 'usage', 'dry' );
$optionsWithArgs = array( 'old', 'new' );
-require_once( dirname(__FILE__) . '/commandLine.inc' );
+require_once( dirname( __FILE__ ) . '/commandLine.inc' );
/**
* @ingroup Maintenance
@@ -25,7 +25,7 @@ class userOptions {
/** Constructor. Will show usage and exit if script options are not correct */
function __construct( $opts, $args ) {
- if( !$this->checkOpts( $opts, $args ) ) {
+ if ( !$this->checkOpts( $opts, $args ) ) {
userOptions::showUsageAndExit();
} else {
$this->mReady = $this->initializeOpts( $opts, $args );
@@ -37,11 +37,11 @@ class userOptions {
private function checkOpts( $opts, $args ) {
// The three possible ways to run the script:
$list = isset( $opts['list'] );
- $usage = isset( $opts['usage'] ) && (count($args) <= 1);
- $change = isset( $opts['old']) && isset($opts['new']) && (count($args) <= 1) ;
+ $usage = isset( $opts['usage'] ) && ( count( $args ) <= 1 );
+ $change = isset( $opts['old'] ) && isset( $opts['new'] ) && ( count( $args ) <= 1 ) ;
// We want only one of them
- $isValid = (($list + $usage + $change) == 1);
+ $isValid = ( ( $list + $usage + $change ) == 1 );
return $isValid;
}
@@ -54,18 +54,18 @@ class userOptions {
$this->mDry = isset( $opts['dry'] );
// Set object properties, specially 'mMode' used by run()
- if( isset($opts['list']) ) {
+ if ( isset( $opts['list'] ) ) {
$this->mMode = 'LISTER' ;
- } elseif( isset($opts['usage']) ) {
+ } elseif ( isset( $opts['usage'] ) ) {
$this->mMode = 'USAGER' ;
- $this->mAnOption = isset($args[0]) ? $args[0] : false ;
- } elseif( isset($opts['old']) && isset($opts['new']) ) {
+ $this->mAnOption = isset( $args[0] ) ? $args[0] : false ;
+ } elseif ( isset( $opts['old'] ) && isset( $opts['new'] ) ) {
$this->mMode = 'CHANGER' ;
$this->mOldValue = $opts['old'] ;
$this->mNewValue = $opts['new'] ;
$this->mAnOption = $args[0];
} else {
- die("There is a bug in the software, this should never happen\n");
+ die( "There is a bug in the software, this should never happen\n" );
}
return true;
@@ -73,27 +73,27 @@ class userOptions {
// Dumb stuff to run a mode.
public function run() {
- if(!$this->mReady ) {
+ if ( !$this->mReady ) {
return false;
}
- $this->{$this->mMode}( );
+ $this-> { $this->mMode } ( );
}
#
# Modes.
- #
+ #
/** List default options and their value */
private function LISTER( ) {
$def = User::getDefaultOptions();
- ksort($def);
+ ksort( $def );
$maxOpt = 0;
- foreach( $def as $opt => $value ) {
- $maxOpt = max( $maxOpt, strlen($opt) );
+ foreach ( $def as $opt => $value ) {
+ $maxOpt = max( $maxOpt, strlen( $opt ) );
}
- foreach( $def as $opt => $value ) {
+ foreach ( $def as $opt => $value ) {
printf( "%-{$maxOpt}s: %s\n", $opt, $value );
}
}
@@ -111,37 +111,37 @@ class userOptions {
__METHOD__
);
- while( $id = $dbr->fetchObject( $result ) ) {
+ foreach ( $result as $id ) {
$user = User::newFromId( $id->user_id );
// Get the options and update stats
- if( $this->mAnOption ) {
+ if ( $this->mAnOption ) {
- if(!array_key_exists( $this->mAnOption, $defaultOptions ) ) {
+ if ( !array_key_exists( $this->mAnOption, $defaultOptions ) ) {
print "Invalid user option. Use --list to see valid choices\n";
exit;
}
$userValue = $user->getOption( $this->mAnOption );
- if( $userValue <> $defaultOptions[$this->mAnOption] ) {
+ if ( $userValue <> $defaultOptions[$this->mAnOption] ) {
@$ret[$this->mAnOption][$userValue]++;
}
} else {
- foreach( $defaultOptions as $name => $defaultValue ) {
+ foreach ( $defaultOptions as $name => $defaultValue ) {
$userValue = $user->getOption( $name );
- if( $userValue <> $defaultValue ) {
+ if ( $userValue <> $defaultValue ) {
@$ret[$name][$userValue]++;
}
}
}
}
- foreach( $ret as $optionName => $usageStats ) {
+ foreach ( $ret as $optionName => $usageStats ) {
print "Usage for <$optionName> (default: '{$defaultOptions[$optionName]}'):\n";
- foreach( $usageStats as $value => $count ) {
+ foreach ( $usageStats as $value => $count ) {
print " $count user(s): '$value'\n";
}
print "\n";
@@ -161,29 +161,29 @@ class userOptions {
__METHOD__
);
- while( $id = $dbr->fetchObject( $result ) ) {
+ foreach ( $result as $id ) {
$user = User::newFromId( $id->user_id );
$curValue = $user->getOption( $this->mAnOption );
$username = $user->getName();
- if( $curValue == $this->mOldValue ) {
+ if ( $curValue == $this->mOldValue ) {
- if(!$this->mQuiet) {
+ if ( !$this->mQuiet ) {
print "Setting {$this->mAnOption} for $username from '{$this->mOldValue}' to '{$this->mNewValue}'): ";
}
- // Change value
+ // Change value
$user->setOption( $this->mAnOption, $this->mNewValue );
// Will not save the settings if run with --dry
- if(!$this->mDry) {
+ if ( !$this->mDry ) {
$user->saveSettings();
}
- if( !$this->mQuiet) { print " OK\n"; }
+ if ( !$this->mQuiet ) { print " OK\n"; }
- } elseif( !$this->mQuiet ) {
+ } elseif ( !$this->mQuiet ) {
print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n";
}
}
@@ -194,7 +194,7 @@ class userOptions {
public static function getDefaultOptionsNames() {
$def = User::getDefaultOptions();
$ret = array();
- foreach( $def as $optname => $defaultValue) {
+ foreach ( $def as $optname => $defaultValue ) {
array_push( $ret, $optname );
}
return $ret;
@@ -212,31 +212,31 @@ This script pass through all users and change one of their options.
The new option is NOT validated.
Usage:
- php userOptions.php --list
- php userOptions.php [user option] --usage
- php userOptions.php [options] <user option> --old <old value> --new <new value>
+ php userOptions.php --list
+ php userOptions.php [user option] --usage
+ php userOptions.php [options] <user option> --old <old value> --new <new value>
Switchs:
- --list : list available user options and their default value
+ --list : list available user options and their default value
- --usage : report all options statistics or just one if you specify it.
+ --usage : report all options statistics or just one if you specify it.
- --old <old value> : the value to look for
- --new <new value> : new value to update users with
+ --old <old value> : the value to look for
+ --new <new value> : new value to update users with
Options:
- --nowarn: hides the 5 seconds warning
- --quiet : do not print what is happening
- --dry : do not save user settings back to database
+ --nowarn: hides the 5 seconds warning
+ --quiet : do not print what is happening
+ --dry : do not save user settings back to database
USAGE;
- exit(0);
+ exit( 0 );
}
/** The warning message and countdown */
public function warn() {
- if( $this->mQuick ) {
+ if ( $this->mQuick ) {
return true;
}
diff --git a/maintenance/userOptions.php b/maintenance/userOptions.php
index d4098ab2..597c6d45 100644
--- a/maintenance/userOptions.php
+++ b/maintenance/userOptions.php
@@ -8,7 +8,7 @@
*
* @file
* @ingroup Maintenance
- * @author Ashar Voultoiz <hashar@altern.org>
+ * @author Ashar Voultoiz <hashar at free dot fr>
*/
// This is a command line script, load tools and parse args
diff --git a/maintenance/waitForSlave.php b/maintenance/waitForSlave.php
index f2a532c9..0bf01d6d 100644
--- a/maintenance/waitForSlave.php
+++ b/maintenance/waitForSlave.php
@@ -15,11 +15,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
* @see wfWaitForSlaves()
*/
-require_once( dirname(__FILE__) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class WaitForSlave extends Maintenance {
public function __construct() {
@@ -31,4 +32,4 @@ class WaitForSlave extends Maintenance {
}
$maintClass = "WaitForSlave";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/math/Makefile b/math/Makefile
index 47c40f96..804f0857 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -1,3 +1,5 @@
+.PHONY: clean all
+
OBJ=render_info.cmo tex.cmo texutil.cmo parser.cmo lexer.cmo texvc.cmo \
render_info.cmx tex.cmx texutil.cmx parser.cmx lexer.cmx texvc.cmx \
lexer.cmi parser.cmi render_info.cmi tex.cmi texutil.cmi texvc.cmi \
@@ -10,15 +12,41 @@ texvc_tex.o texvc_tex.cmi texvc_tex html.cmi html.cmo html.cmx \
html.o mathml.cmi mathml.cmo mathml.cmx mathml.o
CGIPATH=-I /usr/lib/ocaml/cgi -I /usr/lib/ocaml/netstring -I /usr/lib/ocaml/pcre
+COMMON_NATIVE_OBJ =util.cmx parser.cmx html.cmx mathml.cmx texutil.cmx lexer.cmx
+COMMON_BYTECODE_OBJ=util.cmo parser.cmo html.cmo mathml.cmo texutil.cmo lexer.cmo
+
all: texvc texvc_test texvc_tex
-texvc.bc: util.cmo parser.cmo html.cmo mathml.cmo texutil.cmo render.cmo lexer.cmo texvc.cmo
- ocamlc -o $@ unix.cma $^
-texvc: util.cmx parser.cmx html.cmx mathml.cmx texutil.cmx render.cmx lexer.cmx texvc.cmx
+cgi: texvc_cgi.cmo texvc_cgi
+clean:
+ rm -f $(OBJ)
+
+# Native versions
+texvc: $(COMMON_NATIVE_OBJ) render.cmx texvc.cmx
ocamlopt -o $@ unix.cmxa $^
-texvc_test: util.cmx parser.cmx html.cmx mathml.cmx texutil.cmx lexer.cmx texvc_test.cmx
+texvc_test: $(COMMON_NATIVE_OBJ) lexer.cmx texvc_test.cmx
ocamlopt -o $@ $^
-texvc_tex: util.cmx parser.cmx html.cmx mathml.cmx texutil.cmx lexer.cmx texvc_tex.cmx
+texvc_tex: $(COMMON_NATIVE_OBJ) texvc_tex.cmx
ocamlopt -o $@ $^
+
+# Bytecode version
+texvc.bc: $(COMMON_BYTECODE_OBJ) render.cmo texvc.cmo
+ ocamlc -o $@ unix.cma $^
+
+# CGI related targets:
+texvc_cgi.cmo: texvc_cgi.ml
+ ocamlc -c $(CGIPATH) $<
+texvc_cgi: util.cmo parser.cmo texutil.cmo render.cmo lexer.cmo texvc_cgi.cmo
+ ocamlc -o $@ unix.cma $(CGIPATH) pcre.cma netstring.cma cgi.cma $^
+ chmod g-w $@
+
+#
+# Pattern rules
+#
+
+# .ml source .mli interface
+# .cmi compiled interface
+# .cmo object .cma library object
+# .cmx object file .cmxa library object file
%.ml: %.mll
ocamllex $<
%.mli %.ml: %.mly
@@ -29,13 +57,8 @@ texvc_tex: util.cmx parser.cmx html.cmx mathml.cmx texutil.cmx lexer.cmx texvc_t
ocamlopt -c $<
%.cmi: %.mli
ocamlc -c $<
-texvc_cgi.cmo: texvc_cgi.ml
- ocamlc -c $(CGIPATH) $<
-texvc_cgi: util.cmo parser.cmo texutil.cmo render.cmo lexer.cmo texvc_cgi.cmo
- ocamlc -o $@ unix.cma $(CGIPATH) pcre.cma netstring.cma cgi.cma $^
- chmod g-w $@
-clean:
- rm -f $(OBJ)
+
+# Various dependencies
html.cmo: render_info.cmi tex.cmi util.cmo html.cmi
html.cmx: render_info.cmi tex.cmi util.cmx html.cmi
diff --git a/math/README b/math/README
index d0e21648..5b99d4c2 100644
--- a/math/README
+++ b/math/README
@@ -84,7 +84,7 @@ texvc output format is like this:
== Troubleshooting ==
-Unforunately, many error conditions with rasterization are not well reported.
+Unfortunately, many error conditions with rasterization are not well reported.
texvc will return as though everything is successful, and the only obvious
sign of problems for the user is a big X on a wiki page where an equation
should be.
diff --git a/math/lexer.mll b/math/lexer.mll
index 4dd31e0e..1702084c 100644
--- a/math/lexer.mll
+++ b/math/lexer.mll
@@ -69,6 +69,7 @@ rule token = parse
| "\\#" { LITERAL (HTMLABLE (FONT_UFH,"\\#","#")) }
| "\\%" { LITERAL (HTMLABLE (FONT_UFH,"\\%","%")) }
| "\\$" { LITERAL (HTMLABLE (FONT_UFH,"\\$","$")) }
+ | "\\&" { LITERAL (HTMLABLEC (FONT_RM,"\\&","&amp;")) }
| "&" { NEXT_CELL }
| "\\\\" { NEXT_ROW }
| "\\begin{matrix}" { Texutil.tex_use_ams(); BEGIN__MATRIX }
diff --git a/math/render.ml b/math/render.ml
index f1673555..5a02b671 100644
--- a/math/render.ml
+++ b/math/render.ml
@@ -1,7 +1,11 @@
+(* vim: set sw=8 ts=8 et: *)
+
let cmd_dvips tmpprefix = "dvips -q -R -E " ^ tmpprefix ^ ".dvi -f >" ^ tmpprefix ^ ".ps"
let cmd_latex tmpprefix = "latex " ^ tmpprefix ^ ".tex >/dev/null"
+
(* Putting -transparent white in converts arguments will sort-of give you transperancy *)
let cmd_convert tmpprefix finalpath = "convert -quality 100 -density 120 " ^ tmpprefix ^ ".ps " ^ finalpath ^ " >/dev/null 2>/dev/null"
+
(* Putting -bg Transparent in dvipng's arguments will give full-alpha transparency *)
(* Note that IE have problems with such PNGs and need an additional javascript snippet *)
(* Putting -bg transparent in dvipng's arguments will give binary transparency *)
@@ -15,26 +19,40 @@ let render tmppath finalpath outtex md5 backcolor =
let unlink_all () =
begin
(* Commenting this block out will aid in debugging *)
- Sys.remove (tmpprefix ^ ".dvi");
- Sys.remove (tmpprefix ^ ".aux");
- Sys.remove (tmpprefix ^ ".log");
+ Sys.remove (tmpprefix ^ ".dvi");
+ Sys.remove (tmpprefix ^ ".aux");
+ Sys.remove (tmpprefix ^ ".log");
Sys.remove (tmpprefix ^ ".tex");
- if Sys.file_exists (tmpprefix ^ ".ps")
- then Sys.remove (tmpprefix ^ ".ps");
+ if Sys.file_exists (tmpprefix ^ ".ps")
+ then Sys.remove (tmpprefix ^ ".ps");
end in
+
let f = (Util.open_out_unless_exists (tmpprefix ^ ".tex")) in
begin
- output_string f (Texutil.get_preface ());
- output_string f outtex;
- output_string f (Texutil.get_footer ());
- close_out f;
- if Util.run_in_other_directory tmppath (cmd_latex tmpprefix0) != 0
- then (unlink_all (); raise (ExternalCommandFailure "latex"))
- else if (Sys.command (cmd_dvipng tmpprefix (finalpath^"/"^md5^".png") backcolor) != 0)
- then (if (Sys.command (cmd_dvips tmpprefix) != 0)
- then (unlink_all (); raise (ExternalCommandFailure "dvips"))
- else if (Sys.command (cmd_convert tmpprefix (finalpath^"/"^md5^".png")) != 0)
- then (unlink_all (); raise (ExternalCommandFailure "convert"))
- else unlink_all ())
- else unlink_all ()
+ (* Assemble final output in file 'f' *)
+ output_string f (Texutil.get_preface ());
+ output_string f outtex;
+ output_string f (Texutil.get_footer ());
+ close_out f;
+
+ (* TODO: document *)
+ if Util.run_in_other_directory tmppath (cmd_latex tmpprefix0) != 0
+ then (
+ unlink_all (); raise (ExternalCommandFailure "latex")
+ ) else if (Sys.command (cmd_dvipng tmpprefix (finalpath^"/"^md5^".png") backcolor) != 0)
+ then (
+ if (Sys.command (cmd_dvips tmpprefix) != 0)
+ then (
+ unlink_all ();
+ raise (ExternalCommandFailure "dvips")
+ ) else if (Sys.command (cmd_convert tmpprefix (finalpath^"/"^md5^".png")) != 0)
+ then (
+ unlink_all ();
+ raise (ExternalCommandFailure "convert")
+ ) else (
+ unlink_all ()
+ )
+ ) else (
+ unlink_all ()
+ )
end
diff --git a/math/texutil.ml b/math/texutil.ml
index ad4fce10..cc7f48fa 100644
--- a/math/texutil.ml
+++ b/math/texutil.ml
@@ -1,3 +1,4 @@
+(* vim: set sw=8 ts=8 et: *)
open Parser
open Render_info
open Tex
@@ -10,6 +11,7 @@ let tex_part = function
| MHTMLABLEC (_,t,_,_,_) -> t
| HTMLABLE_BIG (t,_) -> t
| TEX_ONLY t -> t
+
let rec render_tex = function
TEX_FQ (a,b,c) -> (render_tex a) ^ "_{" ^ (render_tex b) ^ "}^{" ^ (render_tex c) ^ "}"
| TEX_DQ (a,b) -> (render_tex a) ^ "_{" ^ (render_tex b) ^ "}"
@@ -38,28 +40,40 @@ let rec render_tex = function
(* Dynamic loading*)
type encoding_t = LATIN1 | LATIN2 | UTF8
+(* module properties *)
let modules_ams = ref false
let modules_nonascii = ref false
let modules_encoding = ref UTF8
let modules_color = ref false
+(* wrappers to easily set / reset module properties *)
let tex_use_ams () = modules_ams := true
let tex_use_nonascii () = modules_nonascii := true
let tex_use_color () = modules_color := true
-let tex_mod_reset () = (modules_ams := false; modules_nonascii := false; modules_encoding := UTF8; modules_color := false)
+let tex_mod_reset () = (
+ modules_ams := false;
+ modules_nonascii := false;
+ modules_encoding := UTF8;
+ modules_color := false
+ )
+(* Return TeX fragment for one of the encodings in (UTF8,LATIN1,LATIN2) *)
let get_encoding = function
UTF8 -> "\\usepackage{ucs}\n\\usepackage[utf8]{inputenc}\n"
| LATIN1 -> "\\usepackage[latin1]{inputenc}\n"
| LATIN2 -> "\\usepackage[latin2]{inputenc}\n"
+(* TeX fragment inserted before the output *)
let get_preface () = "\\nonstopmode\n\\documentclass[12pt]{article}\n" ^
(if !modules_nonascii then get_encoding !modules_encoding else "") ^
(if !modules_ams then "\\usepackage{amsmath}\n\\usepackage{amsfonts}\n\\usepackage{amssymb}\n" else "") ^
(if !modules_color then "\\usepackage[dvips,usenames]{color}\n" else "") ^
"\\usepackage{cancel}\n\\pagestyle{empty}\n\\begin{document}\n$$\n"
+
+(* TeX fragment appended after the content *)
let get_footer () = "\n$$\n\\end{document}\n"
+(* Default to UTF8 *)
let set_encoding = function
"ISO-8859-1" -> modules_encoding := LATIN1
| "iso-8859-1" -> modules_encoding := LATIN1
@@ -80,7 +94,7 @@ let find = function
| "\\Gamma" -> LITERAL (HTMLABLEC (FONT_UF, "\\Gamma ", "&Gamma;"))
| "\\delta" -> LITERAL (HTMLABLEC (FONT_UF, "\\delta ", "&delta;"))
| "\\Delta" -> LITERAL (HTMLABLEC (FONT_UF, "\\Delta ", "&Delta;"))
- | "\\epsilon" -> LITERAL (HTMLABLEC (FONT_UF, "\\epsilon ", "&epsilon;"))
+ | "\\epsilon" -> LITERAL (TEX_ONLY "\\epsilon ")
| "\\Epsilon" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
"\\mathrm{E}", "&Epsilon;")))
| "\\varepsilon" -> LITERAL (TEX_ONLY "\\varepsilon ")
@@ -119,7 +133,7 @@ let find = function
| "\\Rho" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
"\\mathrm{P}", "&Rho;")))
| "\\varrho" -> LITERAL (TEX_ONLY "\\varrho ")
- | "\\sim" -> LITERAL (HTMLABLEC (FONT_UF, "\\sim ", "&tilde;"))
+ | "\\sim" -> LITERAL (HTMLABLEC (FONT_UF, "\\sim ", "&sim;"))
| "\\sigma" -> LITERAL (HTMLABLEC (FONT_UF, "\\sigma ", "&sigma;"))
| "\\Sigma" -> LITERAL (HTMLABLEC (FONT_UF, "\\Sigma ", "&Sigma;"))
| "\\varsigma" -> LITERAL (TEX_ONLY "\\varsigma ")
@@ -128,7 +142,7 @@ let find = function
"\\mathrm{T}", "&Tau;")))
| "\\upsilon" -> LITERAL (HTMLABLEC (FONT_UF, "\\upsilon ", "&upsilon;"))
| "\\Upsilon" -> LITERAL (HTMLABLEC (FONT_UF, "\\Upsilon ", "&Upsilon;"))
- | "\\phi" -> LITERAL (HTMLABLEC (FONT_UF, "\\phi ", "&phi;"))
+ | "\\phi" -> LITERAL (TEX_ONLY "\\phi ")
| "\\Phi" -> LITERAL (HTMLABLEC (FONT_UF, "\\Phi ", "&Phi;"))
| "\\varphi" -> LITERAL (TEX_ONLY "\\varphi ")
| "\\chi" -> LITERAL (HTMLABLEC (FONT_UF, "\\chi ", "&chi;"))
@@ -409,6 +423,10 @@ let find = function
| "\\mod" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mod ", "mod")))
| "\\Diamond" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\Diamond ", "&loz;")))
| "\\dotsb" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\dotsb ", "&sdot;&sdot;&sdot;")))
+ | "\\dotsc" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\dotsc ", "...")))
+ | "\\dotsi" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\dotsi ", "&sdot;&sdot;&sdot;")))
+ | "\\dotsm" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\dotsm ", "&sdot;&sdot;&sdot;")))
+ | "\\dotso" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\dotso ", "...")))
| "\\reals" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{R}", "<b>R</b>")))
| "\\Reals" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{R}", "<b>R</b>")))
| "\\R" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{R}", "<b>R</b>")))
@@ -508,12 +526,15 @@ let find = function
| "\\over" -> FUN_INFIXh ("\\over ", fun num den -> Html.html_render num, "<hr style=\"{background: black}\"/>", Html.html_render den)
| "\\sqrt" -> FUN_AR1 "\\sqrt "
| "\\cancel" -> FUN_AR1 "\\cancel "
+ | "\\bcancel" -> FUN_AR1 "\\bcancel "
+ | "\\xcancel" -> FUN_AR1 "\\xcancel "
| "\\cancelto" -> FUN_AR2 "\\cancelto "
| "\\pmod" -> FUN_AR1hl ("\\pmod ", ("(mod ", ")"))
| "\\bmod" -> FUN_AR1hl ("\\bmod ", ("mod ", ""))
| "\\emph" -> FUN_AR1 "\\emph "
| "\\texttt" -> FUN_AR1 "\\texttt "
| "\\textbf" -> FUN_AR1 "\\textbf "
+ | "\\textsf" -> FUN_AR1 "\\textsf "
| "\\textit" -> FUN_AR1hf ("\\textit ", FONTFORCE_IT)
| "\\textrm" -> FUN_AR1hf ("\\textrm ", FONTFORCE_RM)
| "\\rm" -> DECLh ("\\rm ", FONTFORCE_RM)
@@ -726,6 +747,7 @@ let find = function
| "\\mathsf" -> (tex_use_ams (); FUN_AR1 "\\mathsf ")
| "\\mathcal" -> (tex_use_ams (); FUN_AR1 "\\mathcal ")
| "\\mathbb" -> (tex_use_ams (); FUN_AR1 "\\mathbb ")
+ | "\\mathtt" -> (tex_use_ams (); FUN_AR1 "\\mathtt ")
| "\\mathfrak" -> (tex_use_ams (); FUN_AR1 "\\mathfrak ")
| "\\operatorname" -> (tex_use_ams (); FUN_AR1 "\\operatorname ")
| "\\text" -> raise (Failure "malformatted \\text")
diff --git a/math/texvc.ml b/math/texvc.ml
index 38a7e93b..33a14b7b 100644
--- a/math/texvc.ml
+++ b/math/texvc.ml
@@ -1,8 +1,12 @@
+(* vim: set sw=8 ts=8 et: *)
exception LexerException of string
+
+(* *)
let lexer_token_safe lexbuf =
try Lexer.token lexbuf
with Failure s -> raise (LexerException s)
+(* *)
let render tmppath finalpath tree backcolor =
let outtex = Util.mapjoin Texutil.render_tex tree in
let md5 = Digest.to_hex (Digest.string outtex) in
@@ -21,9 +25,29 @@ let render tmppath finalpath tree backcolor =
);
Render.render tmppath finalpath outtex md5 backcolor
end
+
+(* TODO: document
+ * Arguments:
+ * 1st :
+ * 2nd :
+ * 3rd :
+ * 4th : encoding (Default: UTF-8)
+ * 5th : color (Default: rgb 1.0 1.0 1.0)
+ *
+ * Output one character:
+ * S : Parsing error
+ * E : Lexer exception raised
+ * F : TeX function not recognized
+ * - : Generic/Default failure code. Might be an invalid argument,
+ * output file already exist, a problem with an external
+ * command ...
+ * *)
let _ =
Texutil.set_encoding (try Sys.argv.(4) with _ -> "UTF-8");
- try render Sys.argv.(1) Sys.argv.(2) (Parser.tex_expr lexer_token_safe (Lexing.from_string Sys.argv.(3))) (try Sys.argv.(5) with _ -> "rgb 1.0 1.0 1.0")
+ try render Sys.argv.(1) Sys.argv.(2) (
+ Parser.tex_expr lexer_token_safe (
+ Lexing.from_string Sys.argv.(3))
+ ) (try Sys.argv.(5) with _ -> "rgb 1.0 1.0 1.0")
with Parsing.Parse_error -> print_string "S"
| LexerException _ -> print_string "E"
| Texutil.Illegal_tex_function s -> print_string ("F" ^ s)
diff --git a/math/util.ml b/math/util.ml
index f0458562..ece01605 100644
--- a/math/util.ml
+++ b/math/util.ml
@@ -1,17 +1,26 @@
+(* vim: set sw=8 ts=8 et: *)
+
+(* TODO document *)
let mapjoin f l = (List.fold_left (fun a b -> a ^ (f b)) "" l)
+
+(* TODO document *)
let mapjoine e f = function
[] -> ""
| h::t -> (List.fold_left (fun a b -> a ^ e ^ (f b)) (f h) t)
+(* Exception used by open_out_unless_exists below *)
exception FileAlreadyExists
+
+(* Wrapper which raise an exception when output path already exist *)
let open_out_unless_exists path =
if Sys.file_exists path
then raise FileAlreadyExists
else open_out path
+(* *)
let run_in_other_directory tmppath cmd =
let prevdir = Sys.getcwd () in(
- Sys.chdir tmppath;
- let retval = Sys.command cmd in
- (Sys.chdir prevdir; retval)
+ Sys.chdir tmppath;
+ let retval = Sys.command cmd in
+ (Sys.chdir prevdir; retval)
)
diff --git a/mw-config/index.php b/mw-config/index.php
new file mode 100644
index 00000000..c00a0d01
--- /dev/null
+++ b/mw-config/index.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * New version of MediaWiki web-based config/installation
+ *
+ * @file
+ */
+
+define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
+define( 'MEDIAWIKI_INSTALL', true );
+
+chdir( dirname( dirname( __FILE__ ) ) );
+require( dirname( dirname( __FILE__ ) ) . '/includes/WebStart.php' );
+
+wfInstallerMain();
+
+function wfInstallerMain() {
+ global $wgRequest, $wgLang, $wgMetaNamespace, $wgCanonicalNamespaceNames;
+
+ $installer = new WebInstaller( $wgRequest );
+
+ if ( !$installer->startSession() ) {
+ $installer->finish();
+ exit;
+ }
+
+ $fingerprint = $installer->getFingerprint();
+ if ( isset( $_SESSION['installData'][$fingerprint] ) ) {
+ $session = $_SESSION['installData'][$fingerprint];
+ } else {
+ $session = array();
+ }
+
+ if ( isset( $session['settings']['_UserLang'] ) ) {
+ $langCode = $session['settings']['_UserLang'];
+ } elseif ( !is_null( $wgRequest->getVal( 'UserLang' ) ) ) {
+ $langCode = $wgRequest->getVal( 'UserLang' );
+ } else {
+ $langCode = 'en';
+ }
+ $wgLang = Language::factory( $langCode );
+
+ $installer->setParserLanguage( $wgLang );
+
+ $wgMetaNamespace = $wgCanonicalNamespaceNames[NS_PROJECT];
+
+ $session = $installer->execute( $session );
+
+ $_SESSION['installData'][$fingerprint] = $session;
+
+}
diff --git a/mw-config/index.php5 b/mw-config/index.php5
new file mode 100644
index 00000000..8e6ceda9
--- /dev/null
+++ b/mw-config/index.php5
@@ -0,0 +1,4 @@
+<?php
+
+define('MW_INSTALL_PHP5_EXT', 1);
+require './index.php';
diff --git a/php5.php5 b/php5.php5
index 44f51133..51e077f0 100644
--- a/php5.php5
+++ b/php5.php5
@@ -4,6 +4,6 @@
* Test for *.php5 capability in webserver
* Used by includes/templates/PHP4.php
*/
-if ( version_compare( phpversion(), '5.0.0' ) >= 0 ) {
+if ( version_compare( phpversion(), '5.1.0' ) >= 0 ) {
echo 'y'.'e'.'s';
}
diff --git a/profileinfo.php b/profileinfo.php
index d7ae5b8c..b8dc15b8 100644
--- a/profileinfo.php
+++ b/profileinfo.php
@@ -1,4 +1,30 @@
<?php
+/**
+ * Show profiling data.
+ *
+ * Copyright 2005 Kate Turner.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * @file
+ */
+
ini_set( 'zlib.output_compression', 'off' );
$wgEnableProfileInfo = $wgProfileToDatabase = false;
@@ -6,30 +32,6 @@ $wgEnableProfileInfo = $wgProfileToDatabase = false;
require_once( './includes/WebStart.php' );
?>
-<!--
- Show profiling data.
-
- Copyright 2005 Kate Turner.
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
--->
<html>
<head>
<title>Profiling data</title>
@@ -81,7 +83,9 @@ class profile_point {
var $time;
var $children;
- function profile_point( $name, $count, $time, $memory ) {
+ static $totaltime, $totalmemory, $totalcount;
+
+ function __construct( $name, $count, $time, $memory ) {
$this->name = $name;
$this->count = $count;
$this->time = $time;
@@ -93,45 +97,46 @@ class profile_point {
$this->children[] = $child;
}
- function display($indent = 0.0) {
- global $expand, $totaltime, $totalmemory, $totalcount;
+ function display( $expand, $indent = 0.0 ) {
usort( $this->children, 'compare_point' );
- $extet = '';
- if ( isset( $expand[$this->name()] ) )
- $ex = true;
- else $ex = false;
+ $ex = isset( $expand[$this->name()] );
+
if ( !$ex ) {
if ( count( $this->children ) ) {
$url = getEscapedProfileUrl( false, false, $expand + array( $this->name() => true ) );
$extet = " <a href=\"$url\">[+]</a>";
- } else $extet = '';
+ } else {
+ $extet = '';
+ }
} else {
$e = array();
- foreach ( $expand as $name => $ep )
- if ( $name != $this->name() )
+ foreach ( $expand as $name => $ep ) {
+ if ( $name != $this->name() ) {
$e += array( $name => $ep );
+ }
+ }
- $extet = " <a href=\"" . getEscapedProfileUrl( false, false, $e ) . "\">[&ndash;]</a>";
+ $extet = " <a href=\"" . getEscapedProfileUrl( false, false, $e ) . "\">[–]</a>";
}
?>
<tr>
<td class="name" style="padding-left: <?php echo $indent ?>em;">
<?php echo htmlspecialchars( $this->name() ) . $extet ?>
</td>
- <td class="timep"><?php echo @wfPercent( $this->time() / $totaltime * 100 ) ?></td>
- <td class="memoryp"><?php echo @wfPercent( $this->memory() / $totalmemory * 100 ) ?></td>
+ <td class="timep"><?php echo @wfPercent( $this->time() / self::$totaltime * 100 ) ?></td>
+ <td class="memoryp"><?php echo @wfPercent( $this->memory() / self::$totalmemory * 100 ) ?></td>
<td class="count"><?php echo $this->count() ?></td>
<td class="cpr"><?php echo round( sprintf( '%.2f', $this->callsPerRequest() ), 2 ) ?></td>
<td class="tpc"><?php echo round( sprintf( '%.2f', $this->timePerCall() ), 2 ) ?></td>
<td class="mpc"><?php echo round( sprintf( '%.2f' ,$this->memoryPerCall() / 1024 ), 2 ) ?></td>
- <td class="tpr"><?php echo @round( sprintf( '%.2f', $this->time() / $totalcount ), 2 ) ?></td>
- <td class="mpr"><?php echo @round( sprintf( '%.2f' ,$this->memory() / $totalcount / 1024 ), 2 ) ?></td>
+ <td class="tpr"><?php echo @round( sprintf( '%.2f', $this->time() / self::$totalcount ), 2 ) ?></td>
+ <td class="mpr"><?php echo @round( sprintf( '%.2f' ,$this->memory() / self::$totalcount / 1024 ), 2 ) ?></td>
</tr>
<?php
if ( $ex ) {
foreach ( $this->children as $child ) {
- $child->display( $indent + 2 );
+ $child->display( $expand, $indent + 2 );
}
}
}
@@ -161,18 +166,15 @@ class profile_point {
}
function callsPerRequest() {
- global $totalcount;
- return @( $this->count / $totalcount );
+ return @( $this->count / self::$totalcount );
}
function timePerRequest() {
- global $totalcount;
- return @( $this->time / $totalcount );
+ return @( $this->time / self::$totalcount );
}
function memoryPerRequest() {
- global $totalcount;
- return @( $this->memory / $totalcount );
+ return @( $this->memory / self::$totalcount );
}
function fmttime() {
@@ -242,9 +244,9 @@ else
<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ) ?>">kb/req</a></th>
</tr>
<?php
-$totaltime = 0.0;
-$totalcount = 0;
-$totalmemory = 0.0;
+profile_point::$totaltime = 0.0;
+profile_point::$totalcount = 0;
+profile_point::$totalmemory = 0.0;
function getEscapedProfileUrl( $_filter = false, $_sort = false, $_expand = false ) {
global $filter, $sort, $expand;
@@ -270,9 +272,9 @@ $last = false;
foreach( $res as $o ) {
$next = new profile_point( $o->pf_name, $o->pf_count, $o->pf_time, $o->pf_memory );
if( $next->name() == '-total' ) {
- $totaltime = $next->time();
- $totalcount = $next->count();
- $totalmemory = $next->memory();
+ profile_point::$totaltime = $next->time();
+ profile_point::$totalcount = $next->count();
+ profile_point::$totalmemory = $next->memory();
}
if ( $last !== false ) {
if ( preg_match( "/^".preg_quote( $last->name(), "/" )."/", $next->name() ) ) {
@@ -300,12 +302,12 @@ foreach ( $points as $point ) {
if ( strlen( $filter ) && !strstr( $point->name(), $filter ) )
continue;
- $point->display();
+ $point->display( $expand );
}
?>
</table>
-<p>Total time: <tt><?php printf("%5.02f", $totaltime) ?></tt></p>
-<p>Total memory: <tt><?php printf("%5.02f", $totalmemory / 1024 ) ?></tt></p>
+<p>Total time: <tt><?php printf("%5.02f", profile_point::$totaltime) ?></tt></p>
+<p>Total memory: <tt><?php printf("%5.02f", profile_point::$totalmemory / 1024 ) ?></tt></p>
</body>
</html>
diff --git a/resources/Resources.php b/resources/Resources.php
new file mode 100644
index 00000000..5c1ade8d
--- /dev/null
+++ b/resources/Resources.php
@@ -0,0 +1,587 @@
+<?php
+
+return array(
+
+ /* Special resources who have their own classes */
+
+ 'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
+ 'startup' => array( 'class' => 'ResourceLoaderStartUpModule' ),
+ 'user' => array( 'class' => 'ResourceLoaderUserModule' ),
+ 'user.options' => array( 'class' => 'ResourceLoaderUserOptionsModule' ),
+
+ /* Skins */
+
+ 'skins.vector' => array(
+ 'styles' => array( 'vector/screen.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.monobook' => array(
+ 'styles' => array(
+ 'monobook/main.css' => array( 'media' => 'screen' ),
+ ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.simple' => array(
+ 'styles' => array( 'simple/main.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.chick' => array(
+ 'styles' => array( 'chick/main.css' => array( 'media' => 'screen,handheld' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.modern' => array(
+ 'styles' => array( 'modern/main.css' => array( 'media' => 'screen' ),
+ 'modern/print.css' => array( 'media' => 'print' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.cologneblue' => array(
+ 'styles' => array( 'common/cologneblue.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.nostalgia' => array(
+ 'styles' => array( 'common/nostalgia.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.standard' => array(
+ 'styles' => array( 'common/wikistandard.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+
+ /* jQuery */
+
+ 'jquery' => array(
+ 'scripts' => 'resources/jquery/jquery.js',
+ 'debugRaw' => false
+ ),
+
+ /* jQuery Plugins */
+
+ 'jquery.async' => array(
+ 'scripts' => 'resources/jquery/jquery.async.js'
+ ),
+ 'jquery.autoEllipsis' => array(
+ 'scripts' => 'resources/jquery/jquery.autoEllipsis.js',
+ 'dependencies' => 'jquery.highlightText',
+ ),
+ 'jquery.checkboxShiftClick' => array(
+ 'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js'
+ ),
+ 'jquery.client' => array(
+ 'scripts' => 'resources/jquery/jquery.client.js',
+ ),
+ 'jquery.collapsibleTabs' => array(
+ 'scripts' => 'resources/jquery/jquery.collapsibleTabs.js'
+ ),
+ 'jquery.color' => array(
+ 'scripts' => 'resources/jquery/jquery.color.js'
+ ),
+ 'jquery.cookie' => array(
+ 'scripts' => 'resources/jquery/jquery.cookie.js'
+ ),
+ 'jquery.delayedBind' => array(
+ 'scripts' => 'resources/jquery/jquery.delayedBind.js'
+ ),
+ 'jquery.expandableField' => array(
+ 'scripts' => 'resources/jquery/jquery.expandableField.js'
+ ),
+ 'jquery.highlightText' => array(
+ 'scripts' => 'resources/jquery/jquery.highlightText.js'
+ ),
+ 'jquery.placeholder' => array(
+ 'scripts' => 'resources/jquery/jquery.placeholder.js'
+ ),
+ 'jquery.localize' => array(
+ 'scripts' => 'resources/jquery/jquery.localize.js'
+ ),
+ 'jquery.suggestions' => array(
+ 'scripts' => 'resources/jquery/jquery.suggestions.js',
+ 'styles' => 'resources/jquery/jquery.suggestions.css',
+ 'dependencies' => 'jquery.autoEllipsis',
+ ),
+ 'jquery.tabIndex' => array(
+ 'scripts' => 'resources/jquery/jquery.tabIndex.js'
+ ),
+ 'jquery.textSelection' => array(
+ 'scripts' => 'resources/jquery/jquery.textSelection.js'
+ ),
+ 'jquery.tipsy' => array(
+ 'scripts' => 'resources/jquery.tipsy/jquery.tipsy.js',
+ 'styles' => 'resources/jquery.tipsy/jquery.tipsy.css',
+ ),
+
+ /* jQuery UI */
+
+ // Core
+ 'jquery.ui.core' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.core.js',
+ 'skinStyles' => array(
+ 'default' => array(
+ 'resources/jquery.ui/themes/default/jquery.ui.core.css',
+ 'resources/jquery.ui/themes/default/jquery.ui.theme.css',
+ ),
+ 'vector' => array(
+ 'resources/jquery.ui/themes/vector/jquery.ui.core.css',
+ 'resources/jquery.ui/themes/vector/jquery.ui.theme.css',
+ ),
+ ),
+ 'dependencies' => 'jquery',
+ ),
+ 'jquery.ui.widget' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.widget.js',
+ ),
+ 'jquery.ui.mouse' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.mouse.js',
+ 'dependencies' => 'jquery.ui.widget',
+ ),
+ 'jquery.ui.position' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.position.js',
+ ),
+ // Interactions
+ 'jquery.ui.draggable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.draggable.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
+ ),
+ 'jquery.ui.droppable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.droppable.js',
+ 'dependencies' => array(
+ 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget', 'jquery.ui.draggable'
+ ),
+ ),
+ 'jquery.ui.resizable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.resizable.js',
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.resizable.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.resizable.css',
+ ),
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ ),
+ 'jquery.ui.selectable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.selectable.js',
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.selectable.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.selectable.css',
+ ),
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ ),
+ 'jquery.ui.sortable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.sortable.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ ),
+ // Widgets
+ 'jquery.ui.accordion' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.accordion.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.accordion.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.accordion.css',
+ ),
+ ),
+ 'jquery.ui.autocomplete' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.autocomplete.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.position' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.autocomplete.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css',
+ ),
+ ),
+ 'jquery.ui.button' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.button.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.button.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.button.css',
+ ),
+ ),
+ 'jquery.ui.datepicker' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.datepicker.js',
+ 'dependencies' => 'jquery.ui.core',
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.datepicker.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.datepicker.css',
+ ),
+ 'languageScripts' => array(
+ 'af' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-af.js',
+ 'ar' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
+ 'az' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-az.js',
+ 'bg' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
+ 'bs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
+ 'ca' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js',
+ 'cs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js',
+ 'da' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-da.js',
+ 'de' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-de.js',
+ 'el' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-el.js',
+ 'en-gb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
+ 'eo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
+ 'es' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-es.js',
+ 'et' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-et.js',
+ 'eu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js',
+ 'fa' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js',
+ 'fi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
+ 'fo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
+ 'fr-ch' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js',
+ 'fr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
+ 'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
+ 'hr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js',
+ 'hu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js',
+ 'hy' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js',
+ 'id' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-id.js',
+ 'is' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-is.js',
+ 'it' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-it.js',
+ 'ja' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js',
+ 'ko' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
+ 'lt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js',
+ 'lv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js',
+ 'ms' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
+ 'nl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
+ 'no' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-no.js',
+ 'pl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
+ 'pt-br' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js',
+ 'ro' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js',
+ 'ru' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js',
+ 'sk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js',
+ 'sl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js',
+ 'sq' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js',
+ 'sr-sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js',
+ 'sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js',
+ 'sv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
+ 'ta' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
+ 'th' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-th.js',
+ 'tr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
+ 'uk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
+ 'vi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
+ 'zh-cn' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js',
+ 'zh-hk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js',
+ 'zh-tw' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js'
+ ),
+ ),
+ 'jquery.ui.dialog' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.dialog.js',
+ 'dependencies' => array(
+ 'jquery.ui.core',
+ 'jquery.ui.widget',
+ 'jquery.ui.button',
+ 'jquery.ui.draggable',
+ 'jquery.ui.mouse',
+ 'jquery.ui.position',
+ 'jquery.ui.resizable',
+ ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.dialog.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.dialog.css',
+ ),
+ ),
+ 'jquery.ui.progressbar' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.progressbar.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.progressbar.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.progressbar.css',
+ ),
+ ),
+ 'jquery.ui.slider' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.slider.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.slider.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.slider.css',
+ ),
+ ),
+ 'jquery.ui.tabs' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.tabs.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.tabs.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.tabs.css',
+ ),
+ ),
+ // Effects
+ 'jquery.effects.core' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.core.js',
+ 'dependencies' => 'jquery',
+ ),
+ 'jquery.effects.blind' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.blind.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.bounce' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.bounce.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.clip' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.clip.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.drop' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.drop.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.explode' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.explode.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.fold' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.fold.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.highlight' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.highlight.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.pulsate' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.pulsate.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.scale' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.scale.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.shake' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.shake.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.slide' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.slide.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+ 'jquery.effects.transfer' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.transfer.js',
+ 'dependencies' => 'jquery.effects.core',
+ ),
+
+ /* MediaWiki */
+
+ 'mediawiki' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.js',
+ 'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
+ 'debugRaw' => false
+ ),
+ 'mediawiki.util' => array(
+ 'scripts' => 'resources/mediawiki.util/mediawiki.util.js',
+ 'dependencies' => array( 'jquery.checkboxShiftClick', 'jquery.client', 'jquery.placeholder' ),
+ 'debugScripts' => 'resources/mediawiki.util/mediawiki.util.test.js',
+ ),
+ 'mediawiki.action.history' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
+ 'dependencies' => 'mediawiki.legacy.history',
+ 'group' => 'mediawiki.action.history',
+ ),
+ 'mediawiki.action.edit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
+ ),
+ 'mediawiki.action.view.rightClickEdit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
+ ),
+ 'mediawiki.special.preferences' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+ 'messages' => array( 'email-address-validity-valid', 'email-address-validity-invalid' ),
+ ),
+ 'mediawiki.special.search' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
+ ),
+ 'mediawiki.action.history' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
+ 'dependencies' => 'mediawiki.legacy.history',
+ ),
+ 'mediawiki.language' => array(
+ 'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
+ 'languageScripts' => array(
+ 'am' => 'resources/mediawiki.language/languages/am.js',
+ 'ar' => 'resources/mediawiki.language/languages/ar.js',
+ 'bat-smg' => 'resources/mediawiki.language/languages/bat-smg.js',
+ 'be' => 'resources/mediawiki.language/languages/be.js',
+ 'be-tarask' => 'resources/mediawiki.language/languages/be-tarask.js',
+ 'bh' => 'resources/mediawiki.language/languages/bh.js',
+ 'bs' => 'resources/mediawiki.language/languages/bs.js',
+ 'cs' => 'resources/mediawiki.language/languages/cs.js',
+ 'cu' => 'resources/mediawiki.language/languages/cu.js',
+ 'cy' => 'resources/mediawiki.language/languages/cy.js',
+ 'dsb' => 'resources/mediawiki.language/languages/dsb.js',
+ 'fr' => 'resources/mediawiki.language/languages/fr.js',
+ 'ga' => 'resources/mediawiki.language/languages/ga.js',
+ 'gd' => 'resources/mediawiki.language/languages/gd.js',
+ 'gv' => 'resources/mediawiki.language/languages/gv.js',
+ 'he' => 'resources/mediawiki.language/languages/he.js',
+ 'hi' => 'resources/mediawiki.language/languages/hi.js',
+ 'hr' => 'resources/mediawiki.language/languages/hr.js',
+ 'hsb' => 'resources/mediawiki.language/languages/hsb.js',
+ 'hy' => 'resources/mediawiki.language/languages/hy.js',
+ 'ksh' => 'resources/mediawiki.language/languages/ksh.js',
+ 'ln' => 'resources/mediawiki.language/languages/ln.js',
+ 'lt' => 'resources/mediawiki.language/languages/lt.js',
+ 'lv' => 'resources/mediawiki.language/languages/lv.js',
+ 'mg' => 'resources/mediawiki.language/languages/mg.js',
+ 'mk' => 'resources/mediawiki.language/languages/mk.js',
+ 'mo' => 'resources/mediawiki.language/languages/mo.js',
+ 'mt' => 'resources/mediawiki.language/languages/mt.js',
+ 'nso' => 'resources/mediawiki.language/languages/nso.js',
+ 'pl' => 'resources/mediawiki.language/languages/pl.js',
+ 'pt-br' => 'resources/mediawiki.language/languages/pt-br.js',
+ 'ro' => 'resources/mediawiki.language/languages/ro.js',
+ 'ru' => 'resources/mediawiki.language/languages/ru.js',
+ 'se' => 'resources/mediawiki.language/languages/se.js',
+ 'sh' => 'resources/mediawiki.language/languages/sh.js',
+ 'sk' => 'resources/mediawiki.language/languages/sk.js',
+ 'sl' => 'resources/mediawiki.language/languages/sl.js',
+ 'sma' => 'resources/mediawiki.language/languages/sma.js',
+ 'sr-ec' => 'resources/mediawiki.language/languages/sr-ec.js',
+ 'sr-el' => 'resources/mediawiki.language/languages/sr-el.js',
+ 'sr' => 'resources/mediawiki.language/languages/sr.js',
+ 'ti' => 'resources/mediawiki.language/languages/ti.js',
+ 'tl' => 'resources/mediawiki.language/languages/tl.js',
+ 'uk' => 'resources/mediawiki.language/languages/uk.js',
+ 'wa' => 'resources/mediawiki.language/languages/wa.js',
+ ),
+ ),
+
+ /* mediawiki Legacy */
+
+ 'mediawiki.legacy.ajax' => array(
+ 'scripts' => 'common/ajax.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'messages' => array(
+ 'watch', 'unwatch', 'watching', 'unwatching', 'tooltip-ca-watch',
+ 'tooltip-ca-unwatch'
+ ),
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.ajaxwatch' => array(
+ 'scripts' => 'common/ajaxwatch.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.block' => array(
+ 'scripts' => 'common/block.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.commonPrint' => array(
+ 'styles' => array( 'common/commonPrint.css' => array( 'media' => 'print' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'mediawiki.legacy.config' => array(
+ 'scripts' => 'common/config.js',
+ 'styles' => array( 'common/config.css', 'common/config-cc.css' ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.diff' => array(
+ 'scripts' => 'common/diff.js',
+ 'styles' => 'common/diff.css',
+ 'group' => 'mediawiki.action.history',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.edit' => array(
+ 'scripts' => 'common/edit.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.enhancedchanges' => array(
+ 'scripts' => 'common/enhancedchanges.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.history' => array(
+ 'scripts' => 'common/history.js',
+ 'group' => 'mediawiki.action.history',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.htmlform' => array(
+ 'scripts' => 'common/htmlform.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.IEFixes' => array(
+ 'scripts' => 'common/IEFixes.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.metadata' => array(
+ 'scripts' => 'common/metadata.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ 'messages' => array( 'metadata-expand', 'metadata-collapse' ),
+ ),
+ 'mediawiki.legacy.mwsuggest' => array(
+ 'scripts' => 'common/mwsuggest.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ 'messages' => array( 'search-mwsuggest-enabled', 'search-mwsuggest-disabled' ),
+ ),
+ 'mediawiki.legacy.prefs' => array(
+ 'scripts' => 'common/prefs.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => array( 'mediawiki.legacy.wikibits', 'mediawiki.legacy.htmlform' ),
+ ),
+ 'mediawiki.legacy.preview' => array(
+ 'scripts' => 'common/preview.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.protect' => array(
+ 'scripts' => 'common/protect.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.search' => array(
+ 'scripts' => 'common/search.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'styles' => 'common/search.css',
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.shared' => array(
+ 'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'mediawiki.legacy.oldshared' => array(
+ 'styles' => array( 'common/oldshared.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'mediawiki.legacy.upload' => array(
+ 'scripts' => 'common/upload.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.wikibits' => array(
+ 'scripts' => 'common/wikibits.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.language',
+ 'messages' => array( 'showtoc', 'hidetoc' ),
+ ),
+ 'mediawiki.legacy.wikiprintable' => array(
+ 'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+);
diff --git a/resources/jquery.effects/jquery.effects.blind.js b/resources/jquery.effects/jquery.effects.blind.js
new file mode 100644
index 00000000..d9a3b06b
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.blind.js
@@ -0,0 +1,49 @@
+/*
+ * jQuery UI Effects Blind 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.blind = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'vertical') ? 'height' : 'width';
+ var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+ if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = mode == 'show' ? distance : 0;
+
+ // Animate
+ wrapper.animate(animation, o.duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.bounce.js b/resources/jquery.effects/jquery.effects.bounce.js
new file mode 100644
index 00000000..010585bf
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.bounce.js
@@ -0,0 +1,78 @@
+/*
+ * jQuery UI Effects Bounce 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.bounce = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'up'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 5; // Default # of times
+ var speed = o.duration || 250; // Default speed per bounce
+ if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+ if (mode == 'hide') distance = distance / (times * 2);
+ if (mode != 'hide') times--;
+
+ // Animate
+ if (mode == 'show') { // Show Bounce
+ var animation = {opacity: 1};
+ animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation, speed / 2, o.options.easing);
+ distance = distance / 2;
+ times--;
+ };
+ for (var i = 0; i < times; i++) { // Bounces
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+ distance = (mode == 'hide') ? distance * 2 : distance / 2;
+ };
+ if (mode == 'hide') { // Last Bounce
+ var animation = {opacity: 0};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ el.animate(animation, speed / 2, o.options.easing, function(){
+ el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ } else {
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ };
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.clip.js b/resources/jquery.effects/jquery.effects.clip.js
new file mode 100644
index 00000000..796ba89e
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.clip.js
@@ -0,0 +1,54 @@
+/*
+ * jQuery UI Effects Clip 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.clip = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left','height','width'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var animate = el[0].tagName == 'IMG' ? wrapper : el;
+ var ref = {
+ size: (direction == 'vertical') ? 'height' : 'width',
+ position: (direction == 'vertical') ? 'top' : 'left'
+ };
+ var distance = (direction == 'vertical') ? animate.height() : animate.width();
+ if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref.size] = mode == 'show' ? distance : 0;
+ animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+ // Animate
+ animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.core.js b/resources/jquery.effects/jquery.effects.core.js
new file mode 100644
index 00000000..4589fe21
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.core.js
@@ -0,0 +1,714 @@
+/*
+ * jQuery UI Effects 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+ 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'],
+function(i, attr) {
+ $.fx.step[attr] = function(fx) {
+ if (!fx.colorInit) {
+ fx.start = getColor(fx.elem, attr);
+ fx.end = getRGB(fx.end);
+ fx.colorInit = true;
+ }
+
+ fx.elem.style[attr] = 'rgb(' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+ };
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+ var result;
+
+ // Check if we're already dealing with an array of colors
+ if ( color && color.constructor == Array && color.length == 3 )
+ return color;
+
+ // Look for rgb(num,num,num)
+ if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+ return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+ // Look for rgb(num%,num%,num%)
+ if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec(color))
+ return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+ // Look for #a0b1c2
+ if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+ return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+ // Look for #fff
+ if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+ return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+ // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+ if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+ return colors['transparent'];
+
+ // Otherwise, we're most likely dealing with a named color
+ return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+ var color;
+
+ do {
+ color = $.curCSS(elem, attr);
+
+ // Keep going until we find an element that has color, or we hit the body
+ if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+ break;
+
+ attr = "backgroundColor";
+ } while ( elem = elem.parentNode );
+
+ return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+ aqua:[0,255,255],
+ azure:[240,255,255],
+ beige:[245,245,220],
+ black:[0,0,0],
+ blue:[0,0,255],
+ brown:[165,42,42],
+ cyan:[0,255,255],
+ darkblue:[0,0,139],
+ darkcyan:[0,139,139],
+ darkgrey:[169,169,169],
+ darkgreen:[0,100,0],
+ darkkhaki:[189,183,107],
+ darkmagenta:[139,0,139],
+ darkolivegreen:[85,107,47],
+ darkorange:[255,140,0],
+ darkorchid:[153,50,204],
+ darkred:[139,0,0],
+ darksalmon:[233,150,122],
+ darkviolet:[148,0,211],
+ fuchsia:[255,0,255],
+ gold:[255,215,0],
+ green:[0,128,0],
+ indigo:[75,0,130],
+ khaki:[240,230,140],
+ lightblue:[173,216,230],
+ lightcyan:[224,255,255],
+ lightgreen:[144,238,144],
+ lightgrey:[211,211,211],
+ lightpink:[255,182,193],
+ lightyellow:[255,255,224],
+ lime:[0,255,0],
+ magenta:[255,0,255],
+ maroon:[128,0,0],
+ navy:[0,0,128],
+ olive:[128,128,0],
+ orange:[255,165,0],
+ pink:[255,192,203],
+ purple:[128,0,128],
+ violet:[128,0,128],
+ red:[255,0,0],
+ silver:[192,192,192],
+ white:[255,255,255],
+ yellow:[255,255,0],
+ transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+ shorthandStyles = {
+ border: 1,
+ borderBottom: 1,
+ borderColor: 1,
+ borderLeft: 1,
+ borderRight: 1,
+ borderTop: 1,
+ borderWidth: 1,
+ margin: 1,
+ padding: 1
+ };
+
+function getElementStyles() {
+ var style = document.defaultView
+ ? document.defaultView.getComputedStyle(this, null)
+ : this.currentStyle,
+ newStyle = {},
+ key,
+ camelCase;
+
+ // webkit enumerates style porperties
+ if (style && style.length && style[0] && style[style[0]]) {
+ var len = style.length;
+ while (len--) {
+ key = style[len];
+ if (typeof style[key] == 'string') {
+ camelCase = key.replace(/\-(\w)/g, function(all, letter){
+ return letter.toUpperCase();
+ });
+ newStyle[camelCase] = style[key];
+ }
+ }
+ } else {
+ for (key in style) {
+ if (typeof style[key] === 'string') {
+ newStyle[key] = style[key];
+ }
+ }
+ }
+
+ return newStyle;
+}
+
+function filterStyles(styles) {
+ var name, value;
+ for (name in styles) {
+ value = styles[name];
+ if (
+ // ignore null and undefined values
+ value == null ||
+ // ignore functions (when does this occur?)
+ $.isFunction(value) ||
+ // shorthand styles that need to be expanded
+ name in shorthandStyles ||
+ // ignore scrollbars (break in IE)
+ (/scrollbar/).test(name) ||
+
+ // only colors or values that can be converted to numbers
+ (!(/color/i).test(name) && isNaN(parseFloat(value)))
+ ) {
+ delete styles[name];
+ }
+ }
+
+ return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+ var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+ name;
+
+ for (name in newStyle) {
+ if (oldStyle[name] != newStyle[name]) {
+ diff[name] = newStyle[name];
+ }
+ }
+
+ return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+ if ($.isFunction(easing)) {
+ callback = easing;
+ easing = null;
+ }
+
+ return this.each(function() {
+
+ var that = $(this),
+ originalStyleAttr = that.attr('style') || ' ',
+ originalStyle = filterStyles(getElementStyles.call(this)),
+ newStyle,
+ className = that.attr('className');
+
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) {
+ that[action + 'Class'](value[action]);
+ }
+ });
+ newStyle = filterStyles(getElementStyles.call(this));
+ that.attr('className', className);
+
+ that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) { that[action + 'Class'](value[action]); }
+ });
+ // work around bug in IE by clearing the cssText before setting it
+ if (typeof that.attr('style') == 'object') {
+ that.attr('style').cssText = '';
+ that.attr('style').cssText = originalStyleAttr;
+ } else {
+ that.attr('style', originalStyleAttr);
+ }
+ if (callback) { callback.apply(this, arguments); }
+ });
+ });
+};
+
+$.fn.extend({
+ _addClass: $.fn.addClass,
+ addClass: function(classNames, speed, easing, callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+ },
+
+ _removeClass: $.fn.removeClass,
+ removeClass: function(classNames,speed,easing,callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+ },
+
+ _toggleClass: $.fn.toggleClass,
+ toggleClass: function(classNames, force, speed, easing, callback) {
+ if ( typeof force == "boolean" || force === undefined ) {
+ if ( !speed ) {
+ // without speed parameter;
+ return this._toggleClass(classNames, force);
+ } else {
+ return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+ }
+ } else {
+ // without switch parameter;
+ return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+ }
+ },
+
+ switchClass: function(remove,add,speed,easing,callback) {
+ return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+ version: "1.8.2",
+
+ // Saves a set of properties in a data storage
+ save: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+ }
+ },
+
+ // Restores a set of previously saved properties from a data storage
+ restore: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+ }
+ },
+
+ setMode: function(el, mode) {
+ if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+ return mode;
+ },
+
+ getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+ // this should be a little more flexible in the future to handle a string & hash
+ var y, x;
+ switch (origin[0]) {
+ case 'top': y = 0; break;
+ case 'middle': y = 0.5; break;
+ case 'bottom': y = 1; break;
+ default: y = origin[0] / original.height;
+ };
+ switch (origin[1]) {
+ case 'left': x = 0; break;
+ case 'center': x = 0.5; break;
+ case 'right': x = 1; break;
+ default: x = origin[1] / original.width;
+ };
+ return {x: x, y: y};
+ },
+
+ // Wraps the element around a wrapper that copies position properties
+ createWrapper: function(element) {
+
+ // if the element is already wrapped, return it
+ if (element.parent().is('.ui-effects-wrapper')) {
+ return element.parent();
+ }
+
+ // wrap the element
+ var props = {
+ width: element.outerWidth(true),
+ height: element.outerHeight(true),
+ 'float': element.css('float')
+ },
+ wrapper = $('<div></div>')
+ .addClass('ui-effects-wrapper')
+ .css({
+ fontSize: '100%',
+ background: 'transparent',
+ border: 'none',
+ margin: 0,
+ padding: 0
+ });
+
+ element.wrap(wrapper);
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+ // transfer positioning properties to the wrapper
+ if (element.css('position') == 'static') {
+ wrapper.css({ position: 'relative' });
+ element.css({ position: 'relative' });
+ } else {
+ $.extend(props, {
+ position: element.css('position'),
+ zIndex: element.css('z-index')
+ });
+ $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+ props[pos] = element.css(pos);
+ if (isNaN(parseInt(props[pos], 10))) {
+ props[pos] = 'auto';
+ }
+ });
+ element.css({position: 'relative', top: 0, left: 0 });
+ }
+
+ return wrapper.css(props).show();
+ },
+
+ removeWrapper: function(element) {
+ if (element.parent().is('.ui-effects-wrapper'))
+ return element.parent().replaceWith(element);
+ return element;
+ },
+
+ setTransition: function(element, list, factor, value) {
+ value = value || {};
+ $.each(list, function(i, x){
+ unit = element.cssUnit(x);
+ if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+ });
+ return value;
+ }
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+ // shift params for method overloading
+ if (typeof effect == 'object') {
+ callback = options;
+ speed = null;
+ options = effect;
+ effect = options.effect;
+ }
+ if ($.isFunction(options)) {
+ callback = options;
+ speed = null;
+ options = {};
+ }
+ if ($.isFunction(speed)) {
+ callback = speed;
+ speed = null;
+ }
+ if (typeof options == 'number' || $.fx.speeds[options]) {
+ callback = speed;
+ speed = options;
+ options = {};
+ }
+
+ options = options || {};
+
+ speed = speed || options.duration;
+ speed = $.fx.off ? 0 : typeof speed == 'number'
+ ? speed : $.fx.speeds[speed] || $.fx.speeds._default;
+
+ callback = callback || options.complete;
+
+ return [effect, options, speed, callback];
+}
+
+$.fn.extend({
+ effect: function(effect, options, speed, callback) {
+ var args = _normalizeArguments.apply(this, arguments),
+ // TODO: make effects takes actual parameters instead of a hash
+ args2 = {
+ options: args[1],
+ duration: args[2],
+ callback: args[3]
+ },
+ effectMethod = $.effects[effect];
+
+ return effectMethod && !$.fx.off ? effectMethod.call(this, args2) : this;
+ },
+
+ _show: $.fn.show,
+ show: function(speed) {
+ if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
+ return this._show.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'show';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ _hide: $.fn.hide,
+ hide: function(speed) {
+ if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
+ return this._hide.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'hide';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // jQuery core overloads toggle and create _toggle
+ __toggle: $.fn.toggle,
+ toggle: function(speed) {
+ if (!speed || typeof speed == 'number' || $.fx.speeds[speed] ||
+ typeof speed == 'boolean' || $.isFunction(speed)) {
+ return this.__toggle.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'toggle';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // helper functions
+ cssUnit: function(key) {
+ var style = this.css(key), val = [];
+ $.each( ['em','px','%','pt'], function(i, unit){
+ if(style.indexOf(unit) > 0)
+ val = [parseFloat(style), unit];
+ });
+ return val;
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert($.easing.default);
+ return $.easing[$.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.drop.js b/resources/jquery.effects/jquery.effects.drop.js
new file mode 100644
index 00000000..0059c033
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.drop.js
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Drop 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.drop = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left','opacity'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+ // Animation
+ var animation = {opacity: mode == 'show' ? 1 : 0};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.explode.js b/resources/jquery.effects/jquery.effects.explode.js
new file mode 100644
index 00000000..85ba1dcc
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.explode.js
@@ -0,0 +1,79 @@
+/*
+ * jQuery UI Effects Explode 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.explode = function(o) {
+
+ return this.queue(function() {
+
+ var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+ var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+ o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+ var el = $(this).show().css('visibility', 'hidden');
+ var offset = el.offset();
+
+ //Substract the margins - not fixing the problem yet.
+ offset.top -= parseInt(el.css("marginTop"),10) || 0;
+ offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+ var width = el.outerWidth(true);
+ var height = el.outerHeight(true);
+
+ for(var i=0;i<rows;i++) { // =
+ for(var j=0;j<cells;j++) { // ||
+ el
+ .clone()
+ .appendTo('body')
+ .wrap('<div></div>')
+ .css({
+ position: 'absolute',
+ visibility: 'visible',
+ left: -j*(width/cells),
+ top: -i*(height/rows)
+ })
+ .parent()
+ .addClass('ui-effects-explode')
+ .css({
+ position: 'absolute',
+ overflow: 'hidden',
+ width: width/cells,
+ height: height/rows,
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+ opacity: o.options.mode == 'show' ? 0 : 1
+ }).animate({
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+ opacity: o.options.mode == 'show' ? 1 : 0
+ }, o.duration || 500);
+ }
+ }
+
+ // Set a timeout, to call the callback approx. when the other animations have finished
+ setTimeout(function() {
+
+ o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+ if(o.callback) o.callback.apply(el[0]); // Callback
+ el.dequeue();
+
+ $('div.ui-effects-explode').remove();
+
+ }, o.duration || 500);
+
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.fold.js b/resources/jquery.effects/jquery.effects.fold.js
new file mode 100644
index 00000000..946831bf
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.fold.js
@@ -0,0 +1,56 @@
+/*
+ * jQuery UI Effects Fold 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.fold = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var size = o.options.size || 15; // Default fold size
+ var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+ var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var widthFirst = ((mode == 'show') != horizFirst);
+ var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+ var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+ var percent = /([0-9]+)%/.exec(size);
+ if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+ if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+ // Animation
+ var animation1 = {}, animation2 = {};
+ animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+ animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+ // Animate
+ wrapper.animate(animation1, duration, o.options.easing)
+ .animate(animation2, duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.highlight.js b/resources/jquery.effects/jquery.effects.highlight.js
new file mode 100644
index 00000000..5e03e9ec
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.highlight.js
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Highlight 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.highlight = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ props = ['backgroundImage', 'backgroundColor', 'opacity'],
+ mode = $.effects.setMode(elem, o.options.mode || 'show'),
+ animation = {
+ backgroundColor: elem.css('backgroundColor')
+ };
+
+ if (mode == 'hide') {
+ animation.opacity = 0;
+ }
+
+ $.effects.save(elem, props);
+ elem
+ .show()
+ .css({
+ backgroundImage: 'none',
+ backgroundColor: o.options.color || '#ffff99'
+ })
+ .animate(animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (mode == 'hide' && elem.hide());
+ $.effects.restore(elem, props);
+ (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.pulsate.js b/resources/jquery.effects/jquery.effects.pulsate.js
new file mode 100644
index 00000000..11c5af13
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.pulsate.js
@@ -0,0 +1,51 @@
+/*
+ * jQuery UI Effects Pulsate 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.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;
+ duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+ isVisible = elem.is(':visible'),
+ animateTo = 0;
+
+ if (!isVisible) {
+ elem.css('opacity', 0).show();
+ animateTo = 1;
+ }
+
+ if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+ times--;
+ }
+
+ for (var i = 0; i < times; i++) {
+ elem.animate({ opacity: animateTo }, duration, o.options.easing);
+ animateTo = (animateTo + 1) % 2;
+ }
+
+ elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+ if (animateTo == 0) {
+ elem.hide();
+ }
+ (o.callback && o.callback.apply(this, arguments));
+ });
+
+ elem
+ .queue('fx', function() { elem.dequeue(); })
+ .dequeue();
+ });
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.scale.js b/resources/jquery.effects/jquery.effects.scale.js
new file mode 100644
index 00000000..1efb781a
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.scale.js
@@ -0,0 +1,178 @@
+/*
+ * jQuery UI Effects Scale 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.puff = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+ percent = parseInt(o.options.percent, 10) || 150,
+ factor = percent / 100,
+ original = { height: elem.height(), width: elem.width() };
+
+ $.extend(o.options, {
+ fade: true,
+ mode: mode,
+ percent: mode == 'hide' ? percent : 100,
+ from: mode == 'hide'
+ ? original
+ : {
+ height: original.height * factor,
+ width: original.width * factor
+ }
+ });
+
+ elem.effect('scale', o.options, o.duration, o.callback);
+ elem.dequeue();
+ });
+};
+
+$.effects.scale = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this);
+
+ // Set options
+ var options = $.extend(true, {}, o.options);
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+ var direction = o.options.direction || 'both'; // Set default axis
+ var origin = o.options.origin; // The origin of the scaling
+ if (mode != 'effect') { // Set default origin and restore for show/hide
+ options.origin = origin || ['middle','center'];
+ options.restore = true;
+ }
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+ // Adjust
+ var factor = { // Set scaling factor
+ y: direction != 'horizontal' ? (percent / 100) : 1,
+ x: direction != 'vertical' ? (percent / 100) : 1
+ };
+ el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+ if (o.options.fade) { // Fade option to support puff
+ if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+ if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+ };
+
+ // Animation
+ options.from = el.from; options.to = el.to; options.mode = mode;
+
+ // Animate
+ el.effect('size', options, o.duration, o.callback);
+ el.dequeue();
+ });
+
+};
+
+$.effects.size = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
+ var props1 = ['position','top','left','overflow','opacity']; // Always restore
+ var props2 = ['width','height','overflow']; // Copy for children
+ var cProps = ['fontSize'];
+ var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+ var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var restore = o.options.restore || false; // Default restore
+ var scale = o.options.scale || 'both'; // Default scale mode
+ var origin = o.options.origin; // The origin of the sizing
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || original; // Default from state
+ el.to = o.options.to || original; // Default to state
+ // Adjust
+ if (origin) { // Calculate baseline shifts
+ var baseline = $.effects.getBaseline(origin, original);
+ el.from.top = (original.height - el.from.height) * baseline.y;
+ el.from.left = (original.width - el.from.width) * baseline.x;
+ el.to.top = (original.height - el.to.height) * baseline.y;
+ el.to.left = (original.width - el.to.width) * baseline.x;
+ };
+ var factor = { // Set scaling factor
+ from: {y: el.from.height / original.height, x: el.from.width / original.width},
+ to: {y: el.to.height / original.height, x: el.to.width / original.width}
+ };
+ if (scale == 'box' || scale == 'both') { // Scale the css box
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(vProps);
+ el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ props = props.concat(hProps);
+ el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+ el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+ };
+ };
+ if (scale == 'content' || scale == 'both') { // Scale the content
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(cProps);
+ el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+ };
+ };
+ $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ el.css('overflow','hidden').css(el.from); // Shift
+
+ // Animate
+ if (scale == 'content' || scale == 'both') { // Scale the children
+ vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+ hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+ props2 = props.concat(vProps).concat(hProps); // Concat
+ el.find("*[width]").each(function(){
+ 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};
+ child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+ child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+ child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+ };
+ child.css(child.from); // Shift children
+ child.animate(child.to, o.duration, o.options.easing, function(){
+ if (restore) $.effects.restore(child, props2); // Restore children
+ }); // Animate children
+ });
+ };
+
+ // Animate
+ el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if (el.to.opacity === 0) {
+ el.css('opacity', el.from.opacity);
+ }
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.shake.js b/resources/jquery.effects/jquery.effects.shake.js
new file mode 100644
index 00000000..050894b4
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.shake.js
@@ -0,0 +1,57 @@
+/*
+ * jQuery UI Effects Shake 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.shake = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 3; // Default # of times
+ var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+ // Animation
+ var animation = {}, animation1 = {}, animation2 = {};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2;
+ animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2;
+
+ // Animate
+ el.animate(animation, speed, o.options.easing);
+ for (var i = 1; i < times; i++) { // Shakes
+ el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+ };
+ el.animate(animation1, speed, o.options.easing).
+ animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.slide.js b/resources/jquery.effects/jquery.effects.slide.js
new file mode 100644
index 00000000..d0719a7f
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.slide.js
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Slide 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.slide = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','left'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+ if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.transfer.js b/resources/jquery.effects/jquery.effects.transfer.js
new file mode 100644
index 00000000..4c212ca0
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.transfer.js
@@ -0,0 +1,45 @@
+/*
+ * jQuery UI Effects Transfer 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function($) {
+
+$.effects.transfer = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ target = $(o.options.to),
+ endPosition = target.offset(),
+ animation = {
+ top: endPosition.top,
+ left: endPosition.left,
+ height: target.innerHeight(),
+ width: target.innerWidth()
+ },
+ startPosition = elem.offset(),
+ transfer = $('<div class="ui-effects-transfer"></div>')
+ .appendTo(document.body)
+ .addClass(o.options.className)
+ .css({
+ top: startPosition.top,
+ left: startPosition.left,
+ height: elem.innerHeight(),
+ width: elem.innerWidth(),
+ position: 'absolute'
+ })
+ .animate(animation, o.duration, o.options.easing, function() {
+ transfer.remove();
+ (o.callback && o.callback.apply(elem[0], arguments));
+ elem.dequeue();
+ });
+ });
+};
+
+})(jQuery);
diff --git a/resources/jquery.tipsy/images/tipsy.png b/resources/jquery.tipsy/images/tipsy.png
new file mode 100644
index 00000000..9a80e942
--- /dev/null
+++ b/resources/jquery.tipsy/images/tipsy.png
Binary files differ
diff --git a/resources/jquery.tipsy/jquery.tipsy.css b/resources/jquery.tipsy/jquery.tipsy.css
new file mode 100644
index 00000000..d79554d2
--- /dev/null
+++ b/resources/jquery.tipsy/jquery.tipsy.css
@@ -0,0 +1,75 @@
+.tipsy {
+ padding: 5px;
+ position: absolute;
+ z-index: 100000;
+}
+.tipsy-inner {
+ padding: 5px 8px 4px 8px;
+ /*background-color: #e8f2f8;*/
+ background-color: #ffffff;
+ border: solid 1px #a7d7f9;
+ color: black;
+ max-width: 15em;
+ text-align: left;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ /*
+ -moz-box-shadow: 0px 2px 8px #cccccc;
+ -webkit-box-shadow: 0px 2px 8px #cccccc;
+ box-shadow: 0px 2px 8px #cccccc;
+ -ms-filter: "progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc')";
+ filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc');
+ */
+}
+.tipsy-arrow {
+ position: absolute;
+ /* @embed */
+ background: url('images/tipsy.png') no-repeat top left;
+ width: 11px;
+ height: 6px;
+}
+.tipsy-n .tipsy-arrow {
+ top: 0px;
+ left: 50%;
+ margin-left: -5px;
+}
+.tipsy-nw .tipsy-arrow {
+ top: 1px;
+ left: 10px;
+}
+.tipsy-ne .tipsy-arrow {
+ top: 1px;
+ right: 10px;
+}
+.tipsy-s .tipsy-arrow {
+ bottom: 0px;
+ left: 50%;
+ margin-left: -5px;
+ background-position: bottom left;
+}
+.tipsy-sw .tipsy-arrow {
+ bottom: 0px;
+ left: 10px;
+ background-position: bottom left;
+}
+.tipsy-se .tipsy-arrow {
+ bottom: 0px;
+ right: 10px;
+ background-position: bottom left;
+}
+.tipsy-e .tipsy-arrow {
+ top: 50%;
+ margin-top: -5px;
+ right: 1px;
+ width: 5px;
+ height: 11px;
+ background-position: top right;
+}
+.tipsy-w .tipsy-arrow {
+ top: 50%;
+ margin-top: -5px;
+ left: 0px;
+ width: 6px;
+ height: 11px;
+} \ No newline at end of file
diff --git a/resources/jquery.tipsy/jquery.tipsy.js b/resources/jquery.tipsy/jquery.tipsy.js
new file mode 100644
index 00000000..847a527b
--- /dev/null
+++ b/resources/jquery.tipsy/jquery.tipsy.js
@@ -0,0 +1,207 @@
+// tipsy, facebook style tooltips for jquery
+// version 1.0.0a
+// (c) 2008-2010 jason frame [jason@onehackoranother.com]
+// releated under the MIT license
+
+(function($) {
+
+ function fixTitle($ele) {
+ if ($ele.attr('title') || typeof($ele.attr('original-title')) != 'string') {
+ $ele.attr('original-title', $ele.attr('title') || '').removeAttr('title');
+ }
+ }
+
+ function Tipsy(element, options) {
+ this.$element = $(element);
+ this.options = options;
+ this.enabled = true;
+ fixTitle(this.$element);
+ }
+
+ Tipsy.prototype = {
+ show: function() {
+ var title = this.getTitle();
+ if (title && this.enabled) {
+ var $tip = this.tip();
+
+ $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
+ $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
+ $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
+
+ var pos = $.extend({}, this.$element.offset(), {
+ width: this.$element[0].offsetWidth,
+ height: this.$element[0].offsetHeight
+ });
+
+ var actualWidth = $tip[0].offsetWidth, actualHeight = $tip[0].offsetHeight;
+ var gravity = (typeof this.options.gravity == 'function')
+ ? this.options.gravity.call(this.$element[0])
+ : this.options.gravity;
+
+ var tp;
+ switch (gravity.charAt(0)) {
+ case 'n':
+ tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
+ break;
+ case 's':
+ tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
+ break;
+ case 'e':
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
+ break;
+ case 'w':
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
+ break;
+ }
+
+ if (gravity.length == 2) {
+ if (gravity.charAt(1) == 'w') {
+ if ( this.options.center ) {
+ tp.left = pos.left + pos.width / 2 - 15;
+ } else {
+ tp.left = pos.left;
+ }
+ } else {
+ if ( this.options.center ) {
+ tp.left = pos.left + pos.width / 2 - actualWidth + 15;
+ } else {
+ tp.left = pos.left + pos.width;
+ }
+ }
+ }
+
+ $tip.css(tp).addClass('tipsy-' + gravity);
+
+ if (this.options.fade) {
+ $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, 100);
+ } else {
+ $tip.css({visibility: 'visible', opacity: this.options.opacity});
+ }
+ }
+ },
+
+ hide: function() {
+ if (this.options.fade) {
+ this.tip().stop().fadeOut(100, function() { $(this).remove(); });
+ } else {
+ this.tip().remove();
+ }
+ },
+
+ getTitle: function() {
+ var title, $e = this.$element, o = this.options;
+ fixTitle($e);
+ var title, o = this.options;
+ if (typeof o.title == 'string') {
+ title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
+ } else if (typeof o.title == 'function') {
+ title = o.title.call($e[0]);
+ }
+ title = ('' + title).replace(/(^\s*|\s*$)/, "");
+ return title || o.fallback;
+ },
+
+ tip: function() {
+ if (!this.$tip) {
+ this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"/></div>');
+ }
+ return this.$tip;
+ },
+
+ validate: function() {
+ if (!this.$element[0].parentNode) {
+ this.hide();
+ this.$element = null;
+ this.options = null;
+ }
+ },
+
+ enable: function() { this.enabled = true; },
+ disable: function() { this.enabled = false; },
+ toggleEnabled: function() { this.enabled = !this.enabled; }
+ };
+
+ $.fn.tipsy = function(options) {
+
+ if (options === true) {
+ return this.data('tipsy');
+ } else if (typeof options == 'string') {
+ return this.data('tipsy')[options]();
+ }
+
+ options = $.extend({}, $.fn.tipsy.defaults, options);
+
+ function get(ele) {
+ var tipsy = $.data(ele, 'tipsy');
+ if (!tipsy) {
+ tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
+ $.data(ele, 'tipsy', tipsy);
+ }
+ return tipsy;
+ }
+
+ function enter() {
+ var tipsy = get(this);
+ tipsy.hoverState = 'in';
+ if (options.delayIn == 0) {
+ tipsy.show();
+ } else {
+ setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
+ }
+ };
+
+ function leave() {
+ var tipsy = get(this);
+ tipsy.hoverState = 'out';
+ if (options.delayOut == 0) {
+ tipsy.hide();
+ } else {
+ setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
+ }
+ };
+
+ if (!options.live) this.each(function() { get(this); });
+
+ if (options.trigger != 'manual') {
+ var binder = options.live ? 'live' : 'bind',
+ eventIn = options.trigger == 'hover' ? 'mouseenter' : 'focus',
+ eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
+ this[binder](eventIn, enter)[binder](eventOut, leave);
+ }
+
+ return this;
+
+ };
+
+ $.fn.tipsy.defaults = {
+ delayIn: 0,
+ delayOut: 0,
+ fade: true,
+ fallback: '',
+ gravity: 'n',
+ center: true,
+ html: false,
+ live: false,
+ offset: 0,
+ opacity: 1.0,
+ title: 'title',
+ trigger: 'hover'
+ };
+
+ // Overwrite this method to provide options on a per-element basis.
+ // For example, you could store the gravity in a 'tipsy-gravity' attribute:
+ // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
+ // (remember - do not modify 'options' in place!)
+ $.fn.tipsy.elementOptions = function(ele, options) {
+ return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
+ };
+
+ $.fn.tipsy.autoNS = function() {
+ return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
+ };
+
+ $.fn.tipsy.autoWE = function() {
+ return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
+ };
+
+})(jQuery);
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js
new file mode 100644
index 00000000..43fbf6cd
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js
@@ -0,0 +1,23 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+ $.datepicker.regional['af'] = {
+ closeText: 'Selekteer',
+ prevText: 'Vorige',
+ nextText: 'Volgende',
+ currentText: 'Vandag',
+ monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+ 'Julie','Augustus','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+ dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+ dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+ dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['af']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
new file mode 100644
index 00000000..c799b48d
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
@@ -0,0 +1,24 @@
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Al Horani -- koko.dw@gmail.com */
+/* خالد الحوراني -- koko.dw@gmail.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name Ùبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+ $.datepicker.regional['ar'] = {
+ closeText: 'إغلاق',
+ prevText: '&#x3c;السابق',
+ nextText: 'التالي&#x3e;',
+ currentText: 'اليوم',
+ monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران',
+ 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+ monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+ dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],
+ dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
+ dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
+ weekHeader: 'أسبوع',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ar']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js
new file mode 100644
index 00000000..b5434057
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js
@@ -0,0 +1,23 @@
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+ $.datepicker.regional['az'] = {
+ closeText: 'BaÄŸla',
+ prevText: '&#x3c;Geri',
+ nextText: 'İrəli&#x3e;',
+ currentText: 'Bugün',
+ monthNames: ['Yanvar','Fevral','Mart','Aprel','May','Ä°yun',
+ 'Ä°yul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+ monthNamesShort: ['Yan','Fev','Mar','Apr','May','Ä°yun',
+ 'Ä°yul','Avq','Sen','Okt','Noy','Dek'],
+ dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+ dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+ dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['az']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js
new file mode 100644
index 00000000..b5113f78
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js
@@ -0,0 +1,24 @@
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+ $.datepicker.regional['bg'] = {
+ closeText: 'затвори',
+ prevText: '&#x3c;назад',
+ nextText: 'напред&#x3e;',
+ nextBigText: '&#x3e;&#x3e;',
+ currentText: 'днеÑ',
+ monthNames: ['Януари','Февруари','Март','Ðприл','Май','Юни',
+ 'Юли','ÐвгуÑÑ‚','Септември','Октомври','Ðоември','Декември'],
+ monthNamesShort: ['Яну','Фев','Мар','Ðпр','Май','Юни',
+ 'Юли','Ðвг','Сеп','Окт','Ðов','Дек'],
+ dayNames: ['ÐеделÑ','Понеделник','Вторник','СрÑда','Четвъртък','Петък','Събота'],
+ dayNamesShort: ['Ðед','Пон','Вто','СрÑ','Чет','Пет','Съб'],
+ dayNamesMin: ['Ðе','По','Ð’Ñ‚','Ср','Че','Пе','Съ'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js
new file mode 100644
index 00000000..30ab826b
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js
@@ -0,0 +1,23 @@
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+ $.datepicker.regional['bs'] = {
+ closeText: 'Zatvori',
+ prevText: '&#x3c;',
+ nextText: '&#x3e;',
+ currentText: 'Danas',
+ monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+ 'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bs']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js
new file mode 100644
index 00000000..b128e699
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js
@@ -0,0 +1,23 @@
+/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ca'] = {
+ closeText: 'Tancar',
+ prevText: '&#x3c;Ant',
+ nextText: 'Seg&#x3e;',
+ currentText: 'Avui',
+ monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+ 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Oct','Nov','Des'],
+ dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+ dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+ dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ca']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js
new file mode 100644
index 00000000..c3c07ea6
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js
@@ -0,0 +1,23 @@
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+ $.datepicker.regional['cs'] = {
+ closeText: 'Zavřít',
+ prevText: '&#x3c;Dříve',
+ nextText: 'Později&#x3e;',
+ currentText: 'Nyní',
+ monthNames: ['leden','únor','bÅ™ezen','duben','kvÄ›ten','Äerven',
+ 'Äervenec','srpen','září','říjen','listopad','prosinec'],
+ monthNamesShort: ['led','úno','bÅ™e','dub','kvÄ›','Äer',
+ 'Ävc','srp','zář','říj','lis','pro'],
+ dayNames: ['nedÄ›le', 'pondÄ›lí', 'úterý', 'stÅ™eda', 'Ätvrtek', 'pátek', 'sobota'],
+ dayNamesShort: ['ne', 'po', 'út', 'st', 'Ät', 'pá', 'so'],
+ dayNamesMin: ['ne','po','út','st','Ät','pá','so'],
+ weekHeader: 'Týd',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['cs']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js
new file mode 100644
index 00000000..4a99a583
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js
@@ -0,0 +1,23 @@
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['da'] = {
+ closeText: 'Luk',
+ prevText: '&#x3c;Forrige',
+ nextText: 'Næste&#x3e;',
+ currentText: 'Idag',
+ monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+ 'Juli','August','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+ dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+ dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+ weekHeader: 'Uge',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['da']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
new file mode 100644
index 00000000..ac2d516a
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+ $.datepicker.regional['de'] = {
+ closeText: 'schließen',
+ prevText: '&#x3c;zurück',
+ nextText: 'Vor&#x3e;',
+ currentText: 'heute',
+ monthNames: ['Januar','Februar','März','April','Mai','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dez'],
+ 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',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['de']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js
new file mode 100644
index 00000000..9542769d
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js
@@ -0,0 +1,23 @@
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+ $.datepicker.regional['el'] = {
+ closeText: 'Κλείσιμο',
+ prevText: 'ΠÏοηγοÏμενος',
+ nextText: 'Επόμενος',
+ currentText: 'ΤÏέχων Μήνας',
+ monthNames: ['ΙανουάÏιος','ΦεβÏουάÏιος','ΜάÏτιος','ΑπÏίλιος','Μάιος','ΙοÏνιος',
+ 'ΙοÏλιος','ΑÏγουστος','ΣεπτέμβÏιος','ΟκτώβÏιος','ÎοέμβÏιος','ΔεκέμβÏιος'],
+ monthNamesShort: ['Ιαν','Φεβ','ΜαÏ','ΑπÏ','Μαι','Ιουν',
+ 'Ιουλ','Αυγ','Σεπ','Οκτ','Îοε','Δεκ'],
+ dayNames: ['ΚυÏιακή','ΔευτέÏα','ΤÏίτη','ΤετάÏτη','Πέμπτη','ΠαÏασκευή','Σάββατο'],
+ dayNamesShort: ['ΚυÏ','Δευ','ΤÏι','Τετ','Πεμ','ΠαÏ','Σαβ'],
+ dayNamesMin: ['Κυ','Δε','ΤÏ','Τε','Πε','Πα','Σα'],
+ weekHeader: 'Εβδ',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['el']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
new file mode 100644
index 00000000..aac7b619
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
@@ -0,0 +1,23 @@
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+ $.datepicker.regional['en-GB'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js
new file mode 100644
index 00000000..ba571568
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js
@@ -0,0 +1,23 @@
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+ $.datepicker.regional['eo'] = {
+ closeText: 'Fermi',
+ prevText: '&lt;Anta',
+ nextText: 'Sekv&gt;',
+ currentText: 'Nuna',
+ monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+ 'Julio','AÅ­gusto','Septembro','Oktobro','Novembro','Decembro'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','AÅ­g','Sep','Okt','Nov','Dec'],
+ dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Ä´aÅ­','Ven','Sab'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Ä´a','Ve','Sa'],
+ weekHeader: 'Sb',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eo']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-es.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-es.js
new file mode 100644
index 00000000..a02133de
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-es.js
@@ -0,0 +1,23 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['es'] = {
+ closeText: 'Cerrar',
+ prevText: '&#x3c;Ant',
+ nextText: 'Sig&#x3e;',
+ currentText: 'Hoy',
+ monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+ 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+ monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+ 'Jul','Ago','Sep','Oct','Nov','Dic'],
+ dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+ dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+ dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['es']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
new file mode 100644
index 00000000..f97311f3
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
@@ -0,0 +1,23 @@
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+ $.datepicker.regional['et'] = {
+ closeText: 'Sulge',
+ prevText: 'Eelnev',
+ nextText: 'Järgnev',
+ currentText: 'Täna',
+ monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+ 'Juuli','August','September','Oktoober','November','Detsember'],
+ monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+ 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+ 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',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['et']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
new file mode 100644
index 00000000..9ba6ee22
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
@@ -0,0 +1,23 @@
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+ $.datepicker.regional['eu'] = {
+ closeText: 'Egina',
+ prevText: '&#x3c;Aur',
+ nextText: 'Hur&#x3e;',
+ currentText: 'Gaur',
+ monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+ 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+ monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+ 'Uzt','Abu','Ira','Urr','Aza','Abe'],
+ dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+ dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+ dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eu']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
new file mode 100644
index 00000000..adb3709f
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
@@ -0,0 +1,23 @@
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+ $.datepicker.regional['fa'] = {
+ closeText: 'بستن',
+ prevText: '&#x3c;قبلي',
+ nextText: 'بعدي&#x3e;',
+ currentText: 'امروز',
+ monthNames: ['Ùروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
+ 'مهر','آبان','آذر','دي','بهمن','اسÙند'],
+ monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+ dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
+ dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
+ dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+ weekHeader: 'Ù‡Ù',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fa']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js
new file mode 100644
index 00000000..e1f25fd8
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js
@@ -0,0 +1,23 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+jQuery(function($){
+ $.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'],
+ dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+ dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js
new file mode 100644
index 00000000..c1436221
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js
@@ -0,0 +1,23 @@
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+ $.datepicker.regional['fo'] = {
+ closeText: 'Lat aftur',
+ prevText: '&#x3c;Fyrra',
+ nextText: 'Næsta&#x3e;',
+ currentText: 'Ã dag',
+ monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+ 'Juli','August','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Des'],
+ dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+ dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+ dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fo']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
new file mode 100644
index 00000000..38212d54
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
@@ -0,0 +1,23 @@
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+ $.datepicker.regional['fr-CH'] = {
+ closeText: 'Fermer',
+ prevText: '&#x3c;Préc',
+ nextText: 'Suiv&#x3e;',
+ currentText: 'Courant',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+ 'Jul','Aoû','Sep','Oct','Nov','Déc'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js
new file mode 100644
index 00000000..134bda65
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js
@@ -0,0 +1,23 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */
+jQuery(function($){
+ $.datepicker.regional['fr'] = {
+ closeText: 'Fermer',
+ prevText: '&#x3c;Préc',
+ nextText: 'Suiv&#x3e;',
+ currentText: 'Courant',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+ 'Jul','Aoû','Sep','Oct','Nov','Déc'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js
new file mode 100644
index 00000000..3b3dc387
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js
@@ -0,0 +1,23 @@
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+ $.datepicker.regional['he'] = {
+ closeText: 'סגור',
+ prevText: '&#x3c;הקוד×',
+ nextText: 'הב×&#x3e;',
+ currentText: 'היו×',
+ monthNames: ['ינו×ר','פברו×ר','מרץ','×פריל','מ××™','יוני',
+ 'יולי','×וגוסט','ספטמבר','×וקטובר','נובמבר','דצמבר'],
+ monthNamesShort: ['1','2','3','4','5','6',
+ '7','8','9','10','11','12'],
+ dayNames: ['ר×שון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+ dayNamesShort: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'],
+ dayNamesMin: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['he']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js
new file mode 100644
index 00000000..0285c1aa
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js
@@ -0,0 +1,23 @@
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+ $.datepicker.regional['hr'] = {
+ closeText: 'Zatvori',
+ prevText: '&#x3c;',
+ nextText: '&#x3e;',
+ currentText: 'Danas',
+ monthNames: ['SijeÄanj','VeljaÄa','Ožujak','Travanj','Svibanj','Lipanj',
+ 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+ monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+ 'Srp','Kol','Ruj','Lis','Stu','Pro'],
+ dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'],
+ weekHeader: 'Tje',
+ dateFormat: 'dd.mm.yy.',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hr']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js
new file mode 100644
index 00000000..249e7b0e
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js
@@ -0,0 +1,23 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+ $.datepicker.regional['hu'] = {
+ closeText: 'bezárás',
+ prevText: '&laquo;&nbsp;vissza',
+ nextText: 'előre&nbsp;&raquo;',
+ currentText: 'ma',
+ monthNames: ['Január', 'Február', 'Március', 'Ãprilis', 'Május', 'Június',
+ 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+ monthNamesShort: ['Jan', 'Feb', 'Már', 'Ãpr', 'Máj', 'Jún',
+ 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+ dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+ dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+ weekHeader: 'Hé',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hu']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js
new file mode 100644
index 00000000..c6cc1946
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js
@@ -0,0 +1,23 @@
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+ $.datepicker.regional['hy'] = {
+ closeText: 'Õ“Õ¡Õ¯Õ¥Õ¬',
+ prevText: '&#x3c;Õ†Õ¡Õ­.',
+ nextText: 'Õ€Õ¡Õ».&#x3e;',
+ currentText: 'Ô±ÕµÕ½Ö…Ö€',
+ monthNames: ['Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€','Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€Õ«Õ¬','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½',
+ 'Õ€Õ¸Ö‚Õ¬Õ«Õ½','Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½','ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€','Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'],
+ monthNamesShort: ['Õ€Õ¸Ö‚Õ¶Õ¾','Õ“Õ¥Õ¿Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½',
+ 'Õ€Õ¸Ö‚Õ¬','Õ•Õ£Õ½','ÕÕ¥Õº','Õ€Õ¸Õ¯','Õ†Õ¸Õµ','Ô´Õ¥Õ¯'],
+ dayNames: ['Õ¯Õ«Ö€Õ¡Õ¯Õ«','Õ¥Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«','Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','Õ¸Ö‚Ö€Õ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'],
+ dayNamesShort: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'],
+ dayNamesMin: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'],
+ weekHeader: 'Õ‡Ô²Õ',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hy']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-id.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-id.js
new file mode 100644
index 00000000..c626fbb7
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-id.js
@@ -0,0 +1,23 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['id'] = {
+ closeText: 'Tutup',
+ prevText: '&#x3c;mundur',
+ nextText: 'maju&#x3e;',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+ 'Juli','Agustus','September','Oktober','Nopember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Agus','Sep','Okt','Nop','Des'],
+ dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+ dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+ dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['id']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-is.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-is.js
new file mode 100644
index 00000000..c53235a4
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-is.js
@@ -0,0 +1,23 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+ $.datepicker.regional['is'] = {
+ closeText: 'Loka',
+ prevText: '&#x3c; Fyrri',
+ nextText: 'N&aelig;sti &#x3e;',
+ currentText: '&Iacute; dag',
+ monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+ 'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+ 'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+ dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+ dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+ dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+ weekHeader: 'Vika',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['is']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-it.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-it.js
new file mode 100644
index 00000000..59da2df6
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-it.js
@@ -0,0 +1,23 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['it'] = {
+ closeText: 'Chiudi',
+ prevText: '&#x3c;Prec',
+ nextText: 'Succ&#x3e;',
+ currentText: 'Oggi',
+ monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+ 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+ 'Lug','Ago','Set','Ott','Nov','Dic'],
+ dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+ dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+ dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['it']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js
new file mode 100644
index 00000000..79cd827c
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js
@@ -0,0 +1,23 @@
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+ $.datepicker.regional['ja'] = {
+ closeText: 'é–‰ã˜ã‚‹',
+ prevText: '&#x3c;å‰',
+ nextText: '次&#x3e;',
+ currentText: '今日',
+ monthNames: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ dayNames: ['日曜日','月曜日','ç«æ›œæ—¥','水曜日','木曜日','金曜日','土曜日'],
+ dayNamesShort: ['æ—¥','月','ç«','æ°´','木','金','土'],
+ dayNamesMin: ['æ—¥','月','ç«','æ°´','木','金','土'],
+ weekHeader: '週',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: 'å¹´'};
+ $.datepicker.setDefaults($.datepicker.regional['ja']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js
new file mode 100644
index 00000000..5b353165
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js
@@ -0,0 +1,23 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ko'] = {
+ closeText: '닫기',
+ prevText: 'ì´ì „달',
+ nextText: '다ìŒë‹¬',
+ currentText: '오늘',
+ monthNames: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)',
+ '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'],
+ monthNamesShort: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)',
+ '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'],
+ dayNames: ['ì¼','ì›”','í™”','수','목','금','토'],
+ dayNamesShort: ['ì¼','ì›”','í™”','수','목','금','토'],
+ dayNamesMin: ['ì¼','ì›”','í™”','수','목','금','토'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: 'ë…„'};
+ $.datepicker.setDefaults($.datepicker.regional['ko']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js
new file mode 100644
index 00000000..67d5119c
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js
@@ -0,0 +1,23 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+ $.datepicker.regional['lt'] = {
+ closeText: 'Uždaryti',
+ prevText: '&#x3c;Atgal',
+ nextText: 'Pirmyn&#x3e;',
+ currentText: 'Å iandien',
+ monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+ 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+ monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+ 'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+ dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'],
+ dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+ dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lt']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js
new file mode 100644
index 00000000..003934e7
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js
@@ -0,0 +1,23 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+ $.datepicker.regional['lv'] = {
+ closeText: 'Aizvērt',
+ prevText: 'Iepr',
+ nextText: 'NÄka',
+ currentText: 'Å odien',
+ monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs',
+ 'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n',
+ 'JÅ«l','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+ dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+ dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+ weekHeader: 'Nav',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lv']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js
new file mode 100644
index 00000000..e953ac04
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js
@@ -0,0 +1,23 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+ $.datepicker.regional['ms'] = {
+ closeText: 'Tutup',
+ prevText: '&#x3c;Sebelum',
+ nextText: 'Selepas&#x3e;',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+ 'Julai','Ogos','September','Oktober','November','Disember'],
+ monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+ 'Jul','Ogo','Sep','Okt','Nov','Dis'],
+ dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+ dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+ dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ms']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js
new file mode 100644
index 00000000..663d6bb2
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js
@@ -0,0 +1,23 @@
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+ $.datepicker.regional.nl = {
+ closeText: 'Sluiten',
+ prevText: 'â†',
+ nextText: '→',
+ currentText: 'Vandaag',
+ monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+ 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+ monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+ 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+ dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+ dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+ dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional.nl);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js
new file mode 100644
index 00000000..12b2356b
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js
@@ -0,0 +1,23 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['no'] = {
+ closeText: 'Lukk',
+ prevText: '&laquo;Forrige',
+ nextText: 'Neste&raquo;',
+ currentText: 'I dag',
+ monthNames: ['Januar','Februar','Mars','April','Mai','Juni',
+ 'Juli','August','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Des'],
+ dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+ dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+ dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+ weekHeader: 'Uke',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['no']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js
new file mode 100644
index 00000000..61fa29cc
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js
@@ -0,0 +1,23 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pl'] = {
+ closeText: 'Zamknij',
+ prevText: '&#x3c;Poprzedni',
+ nextText: 'Następny&#x3e;',
+ currentText: 'DziÅ›',
+ monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+ 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+ monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+ 'Lip','Sie','Wrz','Pa','Lis','Gru'],
+ dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+ dayNamesShort: ['Nie','Pn','Wt','Åšr','Czw','Pt','So'],
+ dayNamesMin: ['N','Pn','Wt','Åšr','Cz','Pt','So'],
+ weekHeader: 'Tydz',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pl']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
new file mode 100644
index 00000000..38818637
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
@@ -0,0 +1,23 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pt-BR'] = {
+ closeText: 'Fechar',
+ prevText: '&#x3c;Anterior',
+ nextText: 'Pr&oacute;ximo&#x3e;',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js
new file mode 100644
index 00000000..4fe95aea
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js
@@ -0,0 +1,26 @@
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+ $.datepicker.regional['ro'] = {
+ closeText: 'ÃŽnchide',
+ prevText: '&laquo; Luna precedentă',
+ nextText: 'Luna următoare &raquo;',
+ currentText: 'Azi',
+ monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+ 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+ monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+ 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+ dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+ dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+ weekHeader: 'Săpt',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ro']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js
new file mode 100644
index 00000000..b8091f9e
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js
@@ -0,0 +1,23 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ru'] = {
+ closeText: 'Закрыть',
+ prevText: '&#x3c;Пред',
+ nextText: 'След&#x3e;',
+ currentText: 'СегоднÑ',
+ monthNames: ['Январь','Февраль','Март','Ðпрель','Май','Июнь',
+ 'Июль','ÐвгуÑÑ‚','СентÑбрь','ОктÑбрь','ÐоÑбрь','Декабрь'],
+ monthNamesShort: ['Янв','Фев','Мар','Ðпр','Май','Июн',
+ 'Июл','Ðвг','Сен','Окт','ÐоÑ','Дек'],
+ dayNames: ['воÑкреÑенье','понедельник','вторник','Ñреда','четверг','пÑтница','Ñуббота'],
+ dayNamesShort: ['вÑк','пнд','втр','Ñрд','чтв','птн','Ñбт'],
+ dayNamesMin: ['Ð’Ñ','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Ðе',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ru']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js
new file mode 100644
index 00000000..8a6771c1
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js
@@ -0,0 +1,23 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+ $.datepicker.regional['sk'] = {
+ closeText: 'Zavrieť',
+ prevText: '&#x3c;Predchádzajúci',
+ nextText: 'Nasledujúci&#x3e;',
+ currentText: 'Dnes',
+ monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+ 'Júl','August','September','Október','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+ 'Júl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'],
+ dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'],
+ dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'],
+ weekHeader: 'Ty',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sk']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js
new file mode 100644
index 00000000..51655019
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js
@@ -0,0 +1,24 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+ $.datepicker.regional['sl'] = {
+ closeText: 'Zapri',
+ prevText: '&lt;Prej&#x161;nji',
+ nextText: 'Naslednji&gt;',
+ currentText: 'Trenutni',
+ monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+ 'Julij','Avgust','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+ dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+ dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+ weekHeader: 'Teden',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sl']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js
new file mode 100644
index 00000000..be84104c
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js
@@ -0,0 +1,23 @@
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['sq'] = {
+ closeText: 'mbylle',
+ prevText: '&#x3c;mbrapa',
+ nextText: 'Përpara&#x3e;',
+ currentText: 'sot',
+ monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+ 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+ monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+ 'Kor','Gus','Sht','Tet','Nën','Dhj'],
+ dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+ dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ weekHeader: 'Ja',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sq']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
new file mode 100644
index 00000000..8f8ea5e6
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr-SR'] = {
+ closeText: 'Zatvori',
+ prevText: '&#x3c;',
+ nextText: '&#x3e;',
+ currentText: 'Danas',
+ monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+ 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','ÄŒetvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sre','ÄŒet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'],
+ weekHeader: 'Sed',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js
new file mode 100644
index 00000000..49c9b4a3
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr'] = {
+ closeText: 'Затвори',
+ prevText: '&#x3c;',
+ nextText: '&#x3e;',
+ currentText: 'ДанаÑ',
+ monthNames: ['Јануар','Фебруар','Март','Ðприл','Мај','Јун',
+ 'Јул','ÐвгуÑÑ‚','Септембар','Октобар','Ðовембар','Децембар'],
+ monthNamesShort: ['Јан','Феб','Мар','Ðпр','Мај','Јун',
+ 'Јул','Ðвг','Сеп','Окт','Ðов','Дец'],
+ dayNames: ['Ðедеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+ dayNamesShort: ['Ðед','Пон','Уто','Сре','Чет','Пет','Суб'],
+ dayNamesMin: ['Ðе','По','Ут','Ср','Че','Пе','Су'],
+ weekHeader: 'Сед',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js
new file mode 100644
index 00000000..8236b62b
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js
@@ -0,0 +1,23 @@
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+ $.datepicker.regional['sv'] = {
+ closeText: 'Stäng',
+ prevText: '&laquo;Förra',
+ nextText: 'Nästa&raquo;',
+ currentText: 'Idag',
+ monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+ 'Juli','Augusti','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+ dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+ dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+ weekHeader: 'Ve',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js
new file mode 100644
index 00000000..91116d38
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js
@@ -0,0 +1,23 @@
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+ $.datepicker.regional['ta'] = {
+ closeText: 'மூடà¯',
+ prevText: 'à®®à¯à®©à¯à®©à¯ˆà®¯à®¤à¯',
+ nextText: 'அடà¯à®¤à¯à®¤à®¤à¯',
+ currentText: 'இனà¯à®±à¯',
+ monthNames: ['தை','மாசி','பஙà¯à®•à¯à®©à®¿','சிதà¯à®¤à®¿à®°à¯ˆ','வைகாசி','ஆனி',
+ 'ஆடி','ஆவணி','பà¯à®°à®Ÿà¯à®Ÿà®¾à®šà®¿','à®à®ªà¯à®ªà®šà®¿','காரà¯à®¤à¯à®¤à®¿à®•à¯ˆ','மாரà¯à®•à®´à®¿'],
+ monthNamesShort: ['தை','மாசி','பஙà¯','சிதà¯','வைகா','ஆனி',
+ 'ஆடி','ஆவ','பà¯à®°','à®à®ªà¯','காரà¯','மாரà¯'],
+ dayNames: ['ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ','திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ','செவà¯à®µà®¾à®¯à¯à®•à¯à®•à®¿à®´à®®à¯ˆ','பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ','வியாழகà¯à®•à®¿à®´à®®à¯ˆ','வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ','சனிகà¯à®•à®¿à®´à®®à¯ˆ'],
+ dayNamesShort: ['ஞாயிறà¯','திஙà¯à®•à®³à¯','செவà¯à®µà®¾à®¯à¯','பà¯à®¤à®©à¯','வியாழனà¯','வெளà¯à®³à®¿','சனி'],
+ dayNamesMin: ['ஞா','தி','செ','பà¯','வி','வெ','ச'],
+ weekHeader: 'Ðе',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ta']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js
new file mode 100644
index 00000000..978500ab
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js
@@ -0,0 +1,23 @@
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+ $.datepicker.regional['th'] = {
+ closeText: 'ปิด',
+ prevText: '&laquo;&nbsp;ย้อน',
+ nextText: 'ถัดไป&nbsp;&raquo;',
+ currentText: 'วันนี้',
+ monthNames: ['มà¸à¸£à¸²à¸„ม','à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+ 'à¸à¸£à¸à¸à¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'],
+ monthNamesShort: ['ม.ค.','à¸.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+ 'à¸.ค.','ส.ค.','à¸.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+ dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุà¸à¸£à¹Œ','เสาร์'],
+ dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['th']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js
new file mode 100644
index 00000000..dedfc7ff
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js
@@ -0,0 +1,23 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+ $.datepicker.regional['tr'] = {
+ closeText: 'kapat',
+ prevText: '&#x3c;geri',
+ nextText: 'ileri&#x3e',
+ currentText: 'bugün',
+ monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+ 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+ monthNamesShort: ['Oca','Åžub','Mar','Nis','May','Haz',
+ 'Tem','AÄŸu','Eyl','Eki','Kas','Ara'],
+ dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+ dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['tr']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js
new file mode 100644
index 00000000..112b40e7
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js
@@ -0,0 +1,23 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['uk'] = {
+ closeText: 'Закрити',
+ prevText: '&#x3c;',
+ nextText: '&#x3e;',
+ currentText: 'Сьогодні',
+ monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+ 'Липень','Серпень','ВереÑень','Жовтень','ЛиÑтопад','Грудень'],
+ monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+ 'Лип','Сер','Вер','Жов','ЛиÑ','Гру'],
+ dayNames: ['неділÑ','понеділок','вівторок','Ñереда','четвер','п’ÑтницÑ','Ñубота'],
+ dayNamesShort: ['нед','пнд','вів','Ñрд','чтв','птн','Ñбт'],
+ dayNamesMin: ['Ðд','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Ðе',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['uk']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js
new file mode 100644
index 00000000..9813a59e
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js
@@ -0,0 +1,23 @@
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+ $.datepicker.regional['vi'] = {
+ closeText: 'Äóng',
+ prevText: '&#x3c;TrÆ°á»›c',
+ nextText: 'Tiếp&#x3e;',
+ currentText: 'Hôm nay',
+ monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+ 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng MÆ°á»i', 'Tháng MÆ°á»i Má»™t', 'Tháng MÆ°á»i Hai'],
+ monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+ 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+ dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+ dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ weekHeader: 'Tu',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['vi']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
new file mode 100644
index 00000000..6c4883f5
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-CN'] = {
+ closeText: '关闭',
+ prevText: '&#x3c;上月',
+ nextText: '下月&#x3e;',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','ä¹æœˆ','å月','å一月','å二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','å…«','ä¹','å','å一','å二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: 'å¹´'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
new file mode 100644
index 00000000..06c4c628
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-HK'] = {
+ closeText: '關閉',
+ prevText: '&#x3c;上月',
+ nextText: '下月&#x3e;',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','ä¹æœˆ','å月','å一月','å二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','å…«','ä¹','å','å一','å二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: 'å¹´'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
new file mode 100644
index 00000000..d211573c
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-TW'] = {
+ closeText: '關閉',
+ prevText: '&#x3c;上月',
+ nextText: '下月&#x3e;',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','ä¹æœˆ','å月','å一月','å二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','å…«','ä¹','å','å一','å二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: 'å¹´'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
diff --git a/resources/jquery.ui/jquery.ui.accordion.js b/resources/jquery.ui/jquery.ui.accordion.js
new file mode 100644
index 00000000..7d926e09
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.accordion.js
@@ -0,0 +1,504 @@
+/*
+ * jQuery UI Accordion 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.accordion", {
+ options: {
+ active: 0,
+ animated: 'slide',
+ autoHeight: true,
+ clearStyle: false,
+ collapsible: false,
+ event: "click",
+ fillSpace: false,
+ header: "> li > :first-child,> :not(li):even",
+ icons: {
+ header: "ui-icon-triangle-1-e",
+ headerSelected: "ui-icon-triangle-1-s"
+ },
+ navigation: false,
+ navigationFilter: function() {
+ return this.href.toLowerCase() == location.href.toLowerCase();
+ }
+ },
+ _create: function() {
+
+ var o = this.options, self = this;
+ this.running = 0;
+
+ this.element.addClass("ui-accordion ui-widget ui-helper-reset");
+
+ // in lack of child-selectors in CSS we need to mark top-LIs in a UL-accordion for some IE-fix
+ this.element.children("li").addClass("ui-accordion-li-fix");
+
+ this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all")
+ .bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); })
+ .bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); })
+ .bind("focus.accordion", function(){ $(this).addClass('ui-state-focus'); })
+ .bind("blur.accordion", function(){ $(this).removeClass('ui-state-focus'); });
+
+ this.headers
+ .next()
+ .addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+
+ if ( o.navigation ) {
+ var current = this.element.find("a").filter(o.navigationFilter);
+ if ( current.length ) {
+ var header = current.closest(".ui-accordion-header");
+ if ( header.length ) {
+ // anchor within header
+ this.active = header;
+ } else {
+ // anchor within content
+ this.active = current.closest(".ui-accordion-content").prev();
+ }
+ }
+ }
+
+ this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");
+ this.active.next().addClass('ui-accordion-content-active');
+
+ //Append icon elements
+ this._createIcons();
+
+ this.resize();
+
+ //ARIA
+ this.element.attr('role','tablist');
+
+ this.headers
+ .attr('role','tab')
+ .bind('keydown', function(event) { return self._keydown(event); })
+ .next()
+ .attr('role','tabpanel');
+
+ this.headers
+ .not(this.active || "")
+ .attr('aria-expanded','false')
+ .attr("tabIndex", "-1")
+ .next()
+ .hide();
+
+ // make sure at least one header is in the tab order
+ if (!this.active.length) {
+ this.headers.eq(0).attr('tabIndex','0');
+ } else {
+ this.active
+ .attr('aria-expanded','true')
+ .attr('tabIndex', '0');
+ }
+
+ // only need links in taborder for Safari
+ if (!$.browser.safari)
+ this.headers.find('a').attr('tabIndex','-1');
+
+ if (o.event) {
+ this.headers.bind((o.event) + ".accordion", function(event) {
+ self._clickHandler.call(self, event, this);
+ event.preventDefault();
+ });
+ }
+
+ },
+
+ _createIcons: function() {
+ var o = this.options;
+ if (o.icons) {
+ $("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers);
+ this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected);
+ this.element.addClass("ui-accordion-icons");
+ }
+ },
+
+ _destroyIcons: function() {
+ this.headers.children(".ui-icon").remove();
+ this.element.removeClass("ui-accordion-icons");
+ },
+
+ destroy: function() {
+ var o = this.options;
+
+ this.element
+ .removeClass("ui-accordion ui-widget ui-helper-reset")
+ .removeAttr("role")
+ .unbind('.accordion')
+ .removeData('accordion');
+
+ this.headers
+ .unbind(".accordion")
+ .removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top")
+ .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
+
+ this.headers.find("a").removeAttr("tabIndex");
+ this._destroyIcons();
+ var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");
+ if (o.autoHeight || o.fillHeight) {
+ contents.css("height", "");
+ }
+
+ return this;
+ },
+
+ _setOption: function(key, value) {
+ $.Widget.prototype._setOption.apply(this, arguments);
+
+ if (key == "active") {
+ this.activate(value);
+ }
+ if (key == "icons") {
+ this._destroyIcons();
+ if (value) {
+ this._createIcons();
+ }
+ }
+
+ },
+
+ _keydown: function(event) {
+
+ var o = this.options, keyCode = $.ui.keyCode;
+
+ if (o.disabled || event.altKey || event.ctrlKey)
+ return;
+
+ var length = this.headers.length;
+ var currentIndex = this.headers.index(event.target);
+ var toFocus = false;
+
+ switch(event.keyCode) {
+ case keyCode.RIGHT:
+ case keyCode.DOWN:
+ toFocus = this.headers[(currentIndex + 1) % length];
+ break;
+ case keyCode.LEFT:
+ case keyCode.UP:
+ toFocus = this.headers[(currentIndex - 1 + length) % length];
+ break;
+ case keyCode.SPACE:
+ case keyCode.ENTER:
+ this._clickHandler({ target: event.target }, event.target);
+ event.preventDefault();
+ }
+
+ if (toFocus) {
+ $(event.target).attr('tabIndex','-1');
+ $(toFocus).attr('tabIndex','0');
+ toFocus.focus();
+ return false;
+ }
+
+ return true;
+
+ },
+
+ resize: function() {
+
+ var o = this.options, maxHeight;
+
+ if (o.fillSpace) {
+
+ if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); }
+ maxHeight = this.element.parent().height();
+ if($.browser.msie) { this.element.parent().css('overflow', defOverflow); }
+
+ this.headers.each(function() {
+ maxHeight -= $(this).outerHeight(true);
+ });
+
+ this.headers.next().each(function() {
+ $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height()));
+ }).css('overflow', 'auto');
+
+ } else if ( o.autoHeight ) {
+ maxHeight = 0;
+ this.headers.next().each(function() {
+ maxHeight = Math.max(maxHeight, $(this).height());
+ }).height(maxHeight);
+ }
+
+ return this;
+ },
+
+ activate: function(index) {
+ // TODO this gets called on init, changing the option without an explicit call for that
+ this.options.active = index;
+ // call clickHandler with custom event
+ var active = this._findActive(index)[0];
+ this._clickHandler({ target: active }, active);
+
+ return this;
+ },
+
+ _findActive: function(selector) {
+ return selector
+ ? typeof selector == "number"
+ ? this.headers.filter(":eq(" + selector + ")")
+ : this.headers.not(this.headers.not(selector))
+ : selector === false
+ ? $([])
+ : this.headers.filter(":eq(0)");
+ },
+
+ // TODO isn't event.target enough? why the seperate target argument?
+ _clickHandler: function(event, target) {
+
+ var o = this.options;
+ if (o.disabled)
+ return;
+
+ // called only when using activate(false) to close all parts programmatically
+ if (!event.target) {
+ if (!o.collapsible)
+ return;
+ this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")
+ .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);
+ this.active.next().addClass('ui-accordion-content-active');
+ var toHide = this.active.next(),
+ data = {
+ options: o,
+ newHeader: $([]),
+ oldHeader: o.active,
+ newContent: $([]),
+ oldContent: toHide
+ },
+ toShow = (this.active = $([]));
+ this._toggle(toShow, toHide, data);
+ return;
+ }
+
+ // get the click target
+ var clicked = $(event.currentTarget || target);
+ var clickedIsActive = clicked[0] == this.active[0];
+
+ // TODO the option is changed, is that correct?
+ // TODO if it is correct, shouldn't that happen after determining that the click is valid?
+ o.active = o.collapsible && clickedIsActive ? false : $('.ui-accordion-header', this.element).index(clicked);
+
+ // if animations are still active, or the active header is the target, ignore click
+ if (this.running || (!o.collapsible && clickedIsActive)) {
+ return;
+ }
+
+ // switch classes
+ this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")
+ .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);
+ if (!clickedIsActive) {
+ clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top")
+ .find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected);
+ clicked.next().addClass('ui-accordion-content-active');
+ }
+
+ // find elements to show and hide
+ var toShow = clicked.next(),
+ toHide = this.active.next(),
+ data = {
+ options: o,
+ newHeader: clickedIsActive && o.collapsible ? $([]) : clicked,
+ oldHeader: this.active,
+ newContent: clickedIsActive && o.collapsible ? $([]) : toShow,
+ oldContent: toHide
+ },
+ down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+ this.active = clickedIsActive ? $([]) : clicked;
+ this._toggle(toShow, toHide, data, clickedIsActive, down);
+
+ return;
+
+ },
+
+ _toggle: function(toShow, toHide, data, clickedIsActive, down) {
+
+ var o = this.options, self = this;
+
+ this.toShow = toShow;
+ this.toHide = toHide;
+ this.data = data;
+
+ var complete = function() { if(!self) return; return self._completed.apply(self, arguments); };
+
+ // trigger changestart event
+ this._trigger("changestart", null, this.data);
+
+ // count elements to animate
+ this.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+ if (o.animated) {
+
+ var animOptions = {};
+
+ if ( o.collapsible && clickedIsActive ) {
+ animOptions = {
+ toShow: $([]),
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: o.autoHeight || o.fillSpace
+ };
+ } else {
+ animOptions = {
+ toShow: toShow,
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: o.autoHeight || o.fillSpace
+ };
+ }
+
+ if (!o.proxied) {
+ o.proxied = o.animated;
+ }
+
+ if (!o.proxiedDuration) {
+ o.proxiedDuration = o.duration;
+ }
+
+ o.animated = $.isFunction(o.proxied) ?
+ o.proxied(animOptions) : o.proxied;
+
+ o.duration = $.isFunction(o.proxiedDuration) ?
+ o.proxiedDuration(animOptions) : o.proxiedDuration;
+
+ var animations = $.ui.accordion.animations,
+ duration = o.duration,
+ easing = o.animated;
+
+ if (easing && !animations[easing] && !$.easing[easing]) {
+ easing = 'slide';
+ }
+ if (!animations[easing]) {
+ animations[easing] = function(options) {
+ this.slide(options, {
+ easing: easing,
+ duration: duration || 700
+ });
+ };
+ }
+
+ animations[easing](animOptions);
+
+ } else {
+
+ if (o.collapsible && clickedIsActive) {
+ toShow.toggle();
+ } else {
+ toHide.hide();
+ toShow.show();
+ }
+
+ complete(true);
+
+ }
+
+ // TODO assert that the blur and focus triggers are really necessary, remove otherwise
+ toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur();
+ toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus();
+
+ },
+
+ _completed: function(cancel) {
+
+ var o = this.options;
+
+ this.running = cancel ? 0 : --this.running;
+ if (this.running) return;
+
+ if (o.clearStyle) {
+ this.toShow.add(this.toHide).css({
+ height: "",
+ overflow: ""
+ });
+ }
+
+ // other classes are removed before the animation; this one needs to stay until completed
+ this.toHide.removeClass("ui-accordion-content-active");
+
+ this._trigger('change', null, this.data);
+ }
+
+});
+
+
+$.extend($.ui.accordion, {
+ version: "1.8.2",
+ animations: {
+ slide: function(options, additions) {
+ options = $.extend({
+ easing: "swing",
+ duration: 300
+ }, options, additions);
+ if ( !options.toHide.size() ) {
+ options.toShow.animate({height: "show"}, options);
+ return;
+ }
+ if ( !options.toShow.size() ) {
+ options.toHide.animate({height: "hide"}, options);
+ return;
+ }
+ var overflow = options.toShow.css('overflow'),
+ percentDone = 0,
+ showProps = {},
+ hideProps = {},
+ fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+ originalWidth;
+ // fix width before calculating height of hidden element
+ var s = options.toShow;
+ originalWidth = s[0].style.width;
+ s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) );
+
+ $.each(fxAttrs, function(i, prop) {
+ hideProps[prop] = 'hide';
+
+ var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/);
+ showProps[prop] = {
+ value: parts[1],
+ unit: parts[2] || 'px'
+ };
+ });
+ options.toShow.css({ height: 0, overflow: 'hidden' }).show();
+ options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{
+ step: function(now, settings) {
+ // only calculate the percent when animating height
+ // IE gets very inconsistent results when animating elements
+ // with small values, which is common for padding
+ if (settings.prop == 'height') {
+ percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+ (settings.now - settings.start) / (settings.end - settings.start);
+ }
+
+ options.toShow[0].style[settings.prop] =
+ (percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit;
+ },
+ duration: options.duration,
+ easing: options.easing,
+ complete: function() {
+ if ( !options.autoHeight ) {
+ options.toShow.css("height", "");
+ }
+ options.toShow.css("width", originalWidth);
+ options.toShow.css({overflow: overflow});
+ options.complete();
+ }
+ });
+ },
+ bounceslide: function(options) {
+ this.slide(options, {
+ easing: options.down ? "easeOutBounce" : "swing",
+ duration: options.down ? 1000 : 200
+ });
+ }
+ }
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.autocomplete.js b/resources/jquery.ui/jquery.ui.autocomplete.js
new file mode 100644
index 00000000..9a12a6b0
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.autocomplete.js
@@ -0,0 +1,511 @@
+/*
+ * jQuery UI Autocomplete 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function( $ ) {
+
+$.widget( "ui.autocomplete", {
+ options: {
+ minLength: 1,
+ delay: 300
+ },
+ _create: function() {
+ var self = this,
+ doc = this.element[ 0 ].ownerDocument;
+ this.element
+ .addClass( "ui-autocomplete-input" )
+ .attr( "autocomplete", "off" )
+ // TODO verify these actually work as intended
+ .attr({
+ role: "textbox",
+ "aria-autocomplete": "list",
+ "aria-haspopup": "true"
+ })
+ .bind( "keydown.autocomplete", function( event ) {
+ var keyCode = $.ui.keyCode;
+ switch( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ self._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ 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();
+ break;
+ case keyCode.DOWN:
+ self._move( "next", event );
+ // prevent moving cursor to end of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.ENTER:
+ case keyCode.NUMPAD_ENTER:
+ // when menu is open or has focus
+ if ( self.menu.active ) {
+ event.preventDefault();
+ }
+ //passthrough - ENTER and TAB both select the current element
+ case keyCode.TAB:
+ if ( !self.menu.active ) {
+ return;
+ }
+ self.menu.select( event );
+ break;
+ case keyCode.ESCAPE:
+ self.element.val( self.term );
+ self.close( event );
+ break;
+ case keyCode.LEFT:
+ case keyCode.RIGHT:
+ case keyCode.SHIFT:
+ case keyCode.CONTROL:
+ case keyCode.ALT:
+ case keyCode.COMMAND:
+ case keyCode.COMMAND_RIGHT:
+ case keyCode.INSERT:
+ case keyCode.CAPS_LOCK:
+ case keyCode.END:
+ case keyCode.HOME:
+ // ignore metakeys (shift, ctrl, alt)
+ break;
+ default:
+ // keypress is triggered before the input value is changed
+ clearTimeout( self.searching );
+ self.searching = setTimeout(function() {
+ self.search( null, event );
+ }, self.options.delay );
+ break;
+ }
+ })
+ .bind( "focus.autocomplete", function() {
+ self.selectedItem = null;
+ self.previous = self.element.val();
+ })
+ .bind( "blur.autocomplete", function( event ) {
+ clearTimeout( self.searching );
+ // clicks on the menu (or a button to trigger a search) will cause a blur event
+ self.closing = setTimeout(function() {
+ self.close( event );
+ self._change( event );
+ }, 150 );
+ });
+ this._initSource();
+ this.response = function() {
+ return self._response.apply( self, arguments );
+ };
+ this.menu = $( "<ul></ul>" )
+ .addClass( "ui-autocomplete" )
+ .appendTo( "body", doc )
+ // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+ .mousedown(function() {
+ // use another timeout to make sure the blur-event-handler on the input was already triggered
+ setTimeout(function() {
+ clearTimeout( self.closing );
+ }, 13);
+ })
+ .menu({
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" );
+ if ( false !== self._trigger( "focus", null, { item: item } ) ) {
+ // use value to match what will end up in the input, if it was a key event
+ if ( /^key/.test(event.originalEvent.type) ) {
+ self.element.val( item.value );
+ }
+ }
+ },
+ selected: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" );
+ if ( false !== self._trigger( "select", event, { item: item } ) ) {
+ self.element.val( item.value );
+ }
+ self.close( event );
+ // only trigger when focus was lost (click on menu)
+ var previous = self.previous;
+ if ( self.element[0] !== doc.activeElement ) {
+ self.element.focus();
+ self.previous = previous;
+ }
+ self.selectedItem = item;
+ },
+ blur: function( event, ui ) {
+ if ( self.menu.element.is(":visible") ) {
+ self.element.val( self.term );
+ }
+ }
+ })
+ .zIndex( this.element.zIndex() + 1 )
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .hide()
+ .data( "menu" );
+ if ( $.fn.bgiframe ) {
+ this.menu.element.bgiframe();
+ }
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-autocomplete" )
+ .removeAttr( "aria-haspopup" );
+ this.menu.element.remove();
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ },
+
+ _initSource: function() {
+ var array,
+ url;
+ if ( $.isArray(this.options.source) ) {
+ array = this.options.source;
+ this.source = function( request, response ) {
+ response( $.ui.autocomplete.filter(array, request.term) );
+ };
+ } else if ( typeof this.options.source === "string" ) {
+ url = this.options.source;
+ this.source = function( request, response ) {
+ $.getJSON( url, request, response );
+ };
+ } else {
+ this.source = this.options.source;
+ }
+ },
+
+ search: function( value, event ) {
+ value = value != null ? value : this.element.val();
+ if ( value.length < this.options.minLength ) {
+ return this.close( event );
+ }
+
+ clearTimeout( this.closing );
+ if ( this._trigger("search") === false ) {
+ return;
+ }
+
+ return this._search( value );
+ },
+
+ _search: function( value ) {
+ this.term = this.element
+ .addClass( "ui-autocomplete-loading" )
+ // always save the actual value, not the one passed as an argument
+ .val();
+
+ this.source( { term: value }, this.response );
+ },
+
+ _response: function( content ) {
+ if ( content.length ) {
+ content = this._normalize( content );
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ this.close();
+ }
+ this.element.removeClass( "ui-autocomplete-loading" );
+ },
+
+ close: function( event ) {
+ clearTimeout( this.closing );
+ if ( this.menu.element.is(":visible") ) {
+ this._trigger( "close", event );
+ this.menu.element.hide();
+ this.menu.deactivate();
+ }
+ },
+
+ _change: function( event ) {
+ if ( this.previous !== this.element.val() ) {
+ this._trigger( "change", event, { item: this.selectedItem } );
+ }
+ },
+
+ _normalize: function( items ) {
+ // assume all items have the right format when the first item is complete
+ if ( items.length && items[0].label && items[0].value ) {
+ return items;
+ }
+ return $.map( items, function(item) {
+ if ( typeof item === "string" ) {
+ return {
+ label: item,
+ value: item
+ };
+ }
+ return $.extend({
+ label: item.label || item.value,
+ value: item.value || item.label
+ }, item );
+ });
+ },
+
+ _suggest: function( items ) {
+ var ul = this.menu.element
+ .empty()
+ .zIndex( this.element.zIndex() + 1 ),
+ menuWidth,
+ textWidth;
+ this._renderMenu( ul, items );
+ // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+ this.menu.deactivate();
+ this.menu.refresh();
+ this.menu.element.show().position({
+ my: "left top",
+ at: "left bottom",
+ of: this.element,
+ collision: "none"
+ });
+
+ menuWidth = ul.width( "" ).width();
+ textWidth = this.element.width();
+ ul.width( Math.max( menuWidth, textWidth ) );
+ },
+
+ _renderMenu: function( ul, items ) {
+ var self = this;
+ $.each( items, function( index, item ) {
+ self._renderItem( ul, item );
+ });
+ },
+
+ _renderItem: function( ul, item) {
+ return $( "<li></li>" )
+ .data( "item.autocomplete", item )
+ .append( "<a>" + item.label + "</a>" )
+ .appendTo( ul );
+ },
+
+ _move: function( direction, event ) {
+ if ( !this.menu.element.is(":visible") ) {
+ this.search( null, event );
+ return;
+ }
+ if ( this.menu.first() && /^previous/.test(direction) ||
+ this.menu.last() && /^next/.test(direction) ) {
+ this.element.val( this.term );
+ this.menu.deactivate();
+ return;
+ }
+ this.menu[ direction ]( event );
+ },
+
+ widget: function() {
+ return this.menu.element;
+ }
+});
+
+$.extend( $.ui.autocomplete, {
+ escapeRegex: function( value ) {
+ return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" );
+ },
+ filter: function(array, term) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+ return $.grep( array, function(value) {
+ return matcher.test( value.label || value.value || value );
+ });
+ }
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ *
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+ _create: function() {
+ var self = this;
+ this.element
+ .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+ .attr({
+ role: "listbox",
+ "aria-activedescendant": "ui-active-menuitem"
+ })
+ .click(function( event ) {
+ if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+ return;
+ }
+ // temporary
+ event.preventDefault();
+ self.select( event );
+ });
+ this.refresh();
+ },
+
+ refresh: function() {
+ var self = this;
+
+ // don't refresh list items that are already adapted
+ var items = this.element.children("li:not(.ui-menu-item):has(a)")
+ .addClass("ui-menu-item")
+ .attr("role", "menuitem");
+
+ items.children("a")
+ .addClass("ui-corner-all")
+ .attr("tabindex", -1)
+ // mouseenter doesn't work with event delegation
+ .mouseenter(function( event ) {
+ self.activate( event, $(this).parent() );
+ })
+ .mouseleave(function() {
+ self.deactivate();
+ });
+ },
+
+ activate: function( event, item ) {
+ this.deactivate();
+ if (this.hasScroll()) {
+ var offset = item.offset().top - this.element.offset().top,
+ scroll = this.element.attr("scrollTop"),
+ elementHeight = this.element.height();
+ if (offset < 0) {
+ this.element.attr("scrollTop", scroll + offset);
+ } else if (offset > elementHeight) {
+ this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
+ }
+ }
+ this.active = item.eq(0)
+ .children("a")
+ .addClass("ui-state-hover")
+ .attr("id", "ui-active-menuitem")
+ .end();
+ this._trigger("focus", event, { item: item });
+ },
+
+ deactivate: function() {
+ if (!this.active) { return; }
+
+ this.active.children("a")
+ .removeClass("ui-state-hover")
+ .removeAttr("id");
+ this._trigger("blur");
+ this.active = null;
+ },
+
+ next: function(event) {
+ this.move("next", ".ui-menu-item:first", event);
+ },
+
+ previous: function(event) {
+ this.move("prev", ".ui-menu-item:last", event);
+ },
+
+ first: function() {
+ return this.active && !this.active.prev().length;
+ },
+
+ last: function() {
+ return this.active && !this.active.next().length;
+ },
+
+ move: function(direction, edge, event) {
+ if (!this.active) {
+ this.activate(event, this.element.children(edge));
+ return;
+ }
+ var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+ if (next.length) {
+ this.activate(event, next);
+ } else {
+ this.activate(event, this.element.children(edge));
+ }
+ },
+
+ // TODO merge with previousPage
+ nextPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.last()) {
+ this.activate(event, this.element.children(":first"));
+ return;
+ }
+ var base = this.active.offset().top,
+ height = this.element.height(),
+ result = this.element.children("li").filter(function() {
+ var close = $(this).offset().top - base - height + $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(":last");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(!this.active || this.last() ? ":first" : ":last"));
+ }
+ },
+
+ // TODO merge with nextPage
+ previousPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.first()) {
+ this.activate(event, this.element.children(":last"));
+ return;
+ }
+
+ var base = this.active.offset().top,
+ height = this.element.height();
+ result = this.element.children("li").filter(function() {
+ var close = $(this).offset().top - base + height - $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(":first");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(!this.active || this.first() ? ":last" : ":first"));
+ }
+ },
+
+ hasScroll: function() {
+ return this.element.height() < this.element.attr("scrollHeight");
+ },
+
+ select: function( event ) {
+ this._trigger("selected", event, { item: this.active });
+ }
+});
+
+}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.button.js b/resources/jquery.ui/jquery.ui.button.js
new file mode 100644
index 00000000..d318e3de
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.button.js
@@ -0,0 +1,365 @@
+/*
+ * jQuery UI Button 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $ ) {
+
+var lastActive,
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+ stateClasses = "ui-state-hover ui-state-active ",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only",
+ formResetHandler = function( event ) {
+ $( ":ui-button", event.target.form ).each(function() {
+ var inst = $( this ).data( "button" );
+ setTimeout(function() {
+ inst.refresh();
+ }, 1 );
+ });
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name + "']" );
+ } else {
+ radios = $( "[name='" + name + "']", radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "ui.button", {
+ options: {
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset.button" )
+ .bind( "reset.button", formResetHandler );
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var self = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type === "radio",
+ hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+ focusClass = "ui-state-focus";
+
+ if ( options.label === null ) {
+ options.label = this.buttonElement.html();
+ }
+
+ if ( this.element.is( ":disabled" ) ) {
+ options.disabled = true;
+ }
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( hoverClass );
+ })
+ .bind( "focus.button", function() {
+ // no need to check disabled, focus won't be triggered anyway
+ $( this ).addClass( focusClass );
+ })
+ .bind( "blur.button", function() {
+ $( this ).removeClass( focusClass );
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change.button", function() {
+ self.refresh();
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).toggleClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", true );
+
+ var radio = self.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ $( document ).one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown.button", function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "keyup.button", function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd argument doesn't work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ // TODO: pull out $.Widget's handling for the disabled option into
+ // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+ // be overridden by individual plugins
+ this._setOption( "disabled", options.disabled );
+ },
+
+ _determineButtonType: function() {
+
+ if ( this.element.is(":checkbox") ) {
+ this.type = "checkbox";
+ } else {
+ if ( this.element.is(":radio") ) {
+ this.type = "radio";
+ } else {
+ if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+ }
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ this.buttonElement = this.element.parents().last()
+ .find( "[for=" + this.element.attr("id") + "]" );
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ var checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.attr( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "disabled" ) {
+ if ( value ) {
+ this.element.attr( "disabled", true );
+ } else {
+ this.element.removeAttr( "disabled" );
+ }
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ var isDisabled = this.element.is( ":disabled" );
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", true );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", true );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>" )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary;
+ if ( icons.primary || icons.secondary ) {
+ buttonElement.addClass( "ui-button-text-icon" +
+ ( multipleIcons ? "s" : "" ) );
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+ }
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+ }
+ if ( !this.options.text ) {
+ buttonElement
+ .addClass( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" )
+ .removeClass( "ui-button-text-icons ui-button-text-icon" );
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", buttonText );
+ }
+ }
+ } else {
+ buttonElement.addClass( "ui-button-text-only" );
+ }
+ }
+});
+
+$.widget( "ui.buttonset", {
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ this._init();
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ refresh: function() {
+ this.buttons = this.element.find( ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" )
+ .filter( ":ui-button" )
+ .button( "refresh" )
+ .end()
+ .not( ":ui-button" )
+ .button()
+ .end()
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( "ui-corner-left" )
+ .end()
+ .filter( ":last" )
+ .addClass( "ui-corner-right" )
+ .end()
+ .end();
+ },
+
+ destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+
+ $.Widget.prototype.destroy.call( this );
+ }
+});
+
+}( jQuery ) );
diff --git a/resources/jquery.ui/jquery.ui.core.js b/resources/jquery.ui/jquery.ui.core.js
new file mode 100644
index 00000000..80448028
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.core.js
@@ -0,0 +1,216 @@
+/*!
+ * jQuery UI 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+
+(function($) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ($.ui.version) {
+ return;
+}
+
+//Helper functions and ui object
+$.extend($.ui, {
+ version: "1.8.2",
+
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
+ plugin: {
+ add: function(module, option, set) {
+ var proto = $.ui[module].prototype;
+ for(var i in set) {
+ proto.plugins[i] = proto.plugins[i] || [];
+ proto.plugins[i].push([option, set[i]]);
+ }
+ },
+ call: function(instance, name, args) {
+ var set = instance.plugins[name];
+ if(!set || !instance.element[0].parentNode) { return; }
+
+ for (var i = 0; i < set.length; i++) {
+ if (instance.options[set[i][0]]) {
+ set[i][1].apply(instance.element, args);
+ }
+ }
+ }
+ },
+
+ contains: function(a, b) {
+ return document.compareDocumentPosition
+ ? a.compareDocumentPosition(b) & 16
+ : a !== b && a.contains(b);
+ },
+
+ hasScroll: function(el, a) {
+
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
+ if ($(el).css('overflow') == 'hidden') { return false; }
+
+ var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
+ has = false;
+
+ if (el[scroll] > 0) { return true; }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[scroll] = 1;
+ has = (el[scroll] > 0);
+ el[scroll] = 0;
+ return has;
+ },
+
+ isOverAxis: function(x, reference, size) {
+ //Determines when x coordinate is over "b" element axis
+ return (x > reference) && (x < (reference + size));
+ },
+
+ isOver: function(y, x, top, left, height, width) {
+ //Determines when x, y coordinates is over "b" element
+ return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
+ },
+
+ keyCode: {
+ ALT: 18,
+ BACKSPACE: 8,
+ CAPS_LOCK: 20,
+ COMMA: 188,
+ COMMAND: 91,
+ COMMAND_LEFT: 91, // COMMAND
+ COMMAND_RIGHT: 93,
+ CONTROL: 17,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ INSERT: 45,
+ LEFT: 37,
+ MENU: 93, // COMMAND_RIGHT
+ NUMPAD_ADD: 107,
+ NUMPAD_DECIMAL: 110,
+ NUMPAD_DIVIDE: 111,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_SUBTRACT: 109,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SHIFT: 16,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38,
+ WINDOWS: 91 // COMMAND
+ }
+});
+
+//jQuery plugins
+$.fn.extend({
+ _focus: $.fn.focus,
+ focus: function(delay, fn) {
+ return typeof delay === 'number'
+ ? this.each(function() {
+ var elem = this;
+ setTimeout(function() {
+ $(elem).focus();
+ (fn && fn.call(elem));
+ }, delay);
+ })
+ : this._focus.apply(this, arguments);
+ },
+
+ enableSelection: function() {
+ return this
+ .attr('unselectable', 'off')
+ .css('MozUserSelect', '');
+ },
+
+ disableSelection: function() {
+ return this
+ .attr('unselectable', 'on')
+ .css('MozUserSelect', 'none');
+ },
+
+ scrollParent: function() {
+ var scrollParent;
+ if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+ scrollParent = this.parents().filter(function() {
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ } else {
+ scrollParent = this.parents().filter(function() {
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ }
+
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+ },
+
+ zIndex: function(zIndex) {
+ if (zIndex !== undefined) {
+ return this.css('zIndex', zIndex);
+ }
+
+ if (this.length) {
+ var elem = $(this[0]), position, value;
+ while (elem.length && elem[0] !== document) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css('position');
+ if (position == 'absolute' || position == 'relative' || position == 'fixed')
+ {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+ value = parseInt(elem.css('zIndex'));
+ if (!isNaN(value) && value != 0) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ }
+
+ return 0;
+ }
+});
+
+
+//Additional selectors
+$.extend($.expr[':'], {
+ data: function(elem, i, match) {
+ return !!$.data(elem, match[3]);
+ },
+
+ focusable: function(element) {
+ var nodeName = element.nodeName.toLowerCase(),
+ tabIndex = $.attr(element, 'tabindex');
+ return (/input|select|textarea|button|object/.test(nodeName)
+ ? !element.disabled
+ : 'a' == nodeName || 'area' == nodeName
+ ? element.href || !isNaN(tabIndex)
+ : !isNaN(tabIndex))
+ // the element and all of its ancestors must be visible
+ // the browser may report that the area is hidden
+ && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
+ },
+
+ tabbable: function(element) {
+ var tabIndex = $.attr(element, 'tabindex');
+ return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
+ }
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.datepicker.js b/resources/jquery.ui/jquery.ui.datepicker.js
new file mode 100644
index 00000000..cad1d58c
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.datepicker.js
@@ -0,0 +1,1730 @@
+/*
+ * jQuery UI Datepicker 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ */
+
+(function($) { // hide the namespace
+
+$.extend($.ui, { datepicker: { version: "1.8.2" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+
+/* Date picker manager.
+ Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+ Settings for (groups of) date pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+function Datepicker() {
+ this.debug = false; // Change this to true to start debugging
+ this._curInst = null; // The current instance in use
+ this._keyEvent = false; // If the last event was a key event
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+ this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+ this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+ this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+ this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+ this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+ this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+ this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+ this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[''] = { // Default regional settings
+ closeText: 'Done', // Display text for close link
+ prevText: 'Prev', // Display text for previous month link
+ nextText: 'Next', // Display text for next month link
+ currentText: 'Today', // Display text for current month link
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+ weekHeader: 'Wk', // Column header for week of the year
+ dateFormat: 'mm/dd/yy', // See format options on parseDate
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ isRTL: false, // True if right-to-left language, false if left-to-right
+ showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+ yearSuffix: '' // Additional text to append to the year in the month headers
+ };
+ this._defaults = { // Global defaults for all the date picker instances
+ showOn: 'focus', // 'focus' for popup on focus,
+ // 'button' for trigger button, or 'both' for either
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ defaultDate: null, // Used when field is blank: actual date,
+ // +/-number for offset from today, null for today
+ appendText: '', // Display text following the input box, e.g. showing the format
+ buttonText: '...', // Text for trigger button
+ buttonImage: '', // URL for trigger button image
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+ hideIfNoPrevNext: false, // True to hide next/previous month links
+ // if not applicable, false to just disable them
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+ gotoCurrent: false, // True if today link goes back to current selection instead
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
+ changeYear: false, // True if year can be selected directly, false if only prev/next
+ yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+ // either relative to today's year (-nn:+nn), relative to currently displayed year
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
+ selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+ showWeek: false, // True to show week of the year, false to not show it
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+ // takes a Date and returns the number of the week for it
+ shortYearCutoff: '+10', // Short year values < this are in the current century,
+ // > this are in the previous century,
+ // string value starting with '+' for current year + value
+ minDate: null, // The earliest selectable date, or null for no limit
+ maxDate: null, // The latest selectable date, or null for no limit
+ duration: 'fast', // Duration of display/closure
+ beforeShowDay: null, // Function that takes a date and returns an array with
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+ beforeShow: null, // Function that takes an input field and
+ // returns a set of custom settings for the date picker
+ onSelect: null, // Define a callback function when a date is selected
+ onChangeMonthYear: null, // Define a callback function when the month or year is changed
+ onClose: null, // Define a callback function when the datepicker is closed
+ numberOfMonths: 1, // Number of months to show at a time
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+ stepMonths: 1, // Number of months to step back/forward
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
+ altField: '', // Selector for an alternate field to store selected dates into
+ altFormat: '', // The date format to use for the alternate field
+ constrainInput: true, // The input is constrained by the current date format
+ showButtonPanel: false, // True to show button panel, false to not show it
+ autoSize: false // True to size the input for the date format, false to leave as is
+ };
+ $.extend(this._defaults, this.regional['']);
+ this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>');
+}
+
+$.extend(Datepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a date picker. */
+ markerClassName: 'hasDatepicker',
+
+ /* Debug logging (if enabled). */
+ log: function () {
+ if (this.debug)
+ console.log.apply('', arguments);
+ },
+
+ // TODO rename to "widget" when switching to widget factory
+ _widgetDatepicker: function() {
+ return this.dpDiv;
+ },
+
+ /* Override the default settings for all instances of the date picker.
+ @param settings object - the new settings to use as defaults (anonymous object)
+ @return the manager object */
+ setDefaults: function(settings) {
+ extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the date picker to a jQuery selection.
+ @param target element - the target input field or division or span
+ @param settings object - the new settings to use for this date picker instance (anonymous) */
+ _attachDatepicker: function(target, settings) {
+ // check for settings on the control itself - in namespace 'date:'
+ var inlineSettings = null;
+ for (var attrName in this._defaults) {
+ var attrValue = target.getAttribute('date:' + attrName);
+ if (attrValue) {
+ inlineSettings = inlineSettings || {};
+ try {
+ inlineSettings[attrName] = eval(attrValue);
+ } catch (err) {
+ inlineSettings[attrName] = attrValue;
+ }
+ }
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ var inline = (nodeName == 'div' || nodeName == 'span');
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = 'dp' + this.uuid;
+ }
+ var inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+ if (nodeName == 'input') {
+ this._connectDatepicker(target, inst);
+ } else if (inline) {
+ this._inlineDatepicker(target, inst);
+ }
+ },
+
+ /* Create a new instance object. */
+ _newInst: function(target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\$1'); // escape jQuery meta chars
+ return {id: id, input: target, // associated target
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+ drawMonth: 0, drawYear: 0, // month being drawn
+ inline: inline, // is datepicker inline or not
+ dpDiv: (!inline ? this.dpDiv : // presentation div
+ $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
+ },
+
+ /* Attach the date picker to an input field. */
+ _connectDatepicker: function(target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName))
+ return;
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
+ keypress(this._doKeyPress).keyup(this._doKeyUp).
+ bind("setData.datepicker", function(event, key, value) {
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key) {
+ return this._get(inst, key);
+ });
+ this._autoSize(inst);
+ $.data(target, PROP_NAME, inst);
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function(input, inst) {
+ var appendText = this._get(inst, 'appendText');
+ var isRTL = this._get(inst, 'isRTL');
+ if (inst.append)
+ inst.append.remove();
+ if (appendText) {
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+ input[isRTL ? 'before' : 'after'](inst.append);
+ }
+ input.unbind('focus', this._showDatepicker);
+ if (inst.trigger)
+ inst.trigger.remove();
+ var showOn = this._get(inst, 'showOn');
+ if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+ input.focus(this._showDatepicker);
+ if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+ var buttonText = this._get(inst, 'buttonText');
+ var buttonImage = this._get(inst, 'buttonImage');
+ inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+ $('<img/>').addClass(this._triggerClass).
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+ $('<button type="button"></button>').addClass(this._triggerClass).
+ html(buttonImage == '' ? buttonText : $('<img/>').attr(
+ { src:buttonImage, alt:buttonText, title:buttonText })));
+ input[isRTL ? 'before' : 'after'](inst.trigger);
+ inst.trigger.click(function() {
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+ $.datepicker._hideDatepicker();
+ else
+ $.datepicker._showDatepicker(input[0]);
+ return false;
+ });
+ }
+ },
+
+ /* Apply the maximum length for the date format. */
+ _autoSize: function(inst) {
+ if (this._get(inst, 'autoSize') && !inst.inline) {
+ var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+ var dateFormat = this._get(inst, 'dateFormat');
+ if (dateFormat.match(/[DM]/)) {
+ var findMax = function(names) {
+ var max = 0;
+ var maxI = 0;
+ for (var i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+ 'monthNames' : 'monthNamesShort'))));
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+ 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+ }
+ inst.input.attr('size', this._formatDate(inst, date).length);
+ }
+ },
+
+ /* Attach an inline date picker to a div. */
+ _inlineDatepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName))
+ return;
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+ bind("setData.datepicker", function(event, key, value){
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key){
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+ this._setDate(inst, this._getDefaultDate(inst), true);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ },
+
+ /* Pop-up the date picker in a "dialog" box.
+ @param input element - ignored
+ @param date string or Date - the initial date to display
+ @param onSelect function - the function to call when a date is selected
+ @param settings object - update the dialog date picker instance's settings (anonymous object)
+ @param pos int[2] - coordinates for the dialog's position within the screen or
+ event - with x/y coordinates or
+ leave empty for default (screen centre)
+ @return the manager object */
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+ var inst = this._dialogInst; // internal instance
+ if (!inst) {
+ this.uuid += 1;
+ var id = 'dp' + this.uuid;
+ this._dialogInput = $('<input type="text" id="' + id +
+ '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+ this._dialogInput.keydown(this._doKeyDown);
+ $('body').append(this._dialogInput);
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
+ inst.settings = {};
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ }
+ extendRemove(inst.settings, settings || {});
+ date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+ this._dialogInput.val(date);
+
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+ if (!this._pos) {
+ var browserWidth = document.documentElement.clientWidth;
+ var browserHeight = document.documentElement.clientHeight;
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ this._pos = // should use actual width/height below
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+ }
+
+ // move input on screen for focus, but hidden behind dialog
+ this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+ inst.settings.onSelect = onSelect;
+ this._inDialog = true;
+ this.dpDiv.addClass(this._dialogClass);
+ this._showDatepicker(this._dialogInput[0]);
+ if ($.blockUI)
+ $.blockUI(this.dpDiv);
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ return this;
+ },
+
+ /* Detach a datepicker from its control.
+ @param target element - the target input field or division or span */
+ _destroyDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ $.removeData(target, PROP_NAME);
+ if (nodeName == 'input') {
+ inst.append.remove();
+ inst.trigger.remove();
+ $target.removeClass(this.markerClassName).
+ unbind('focus', this._showDatepicker).
+ unbind('keydown', this._doKeyDown).
+ unbind('keypress', this._doKeyPress).
+ unbind('keyup', this._doKeyUp);
+ } else if (nodeName == 'div' || nodeName == 'span')
+ $target.removeClass(this.markerClassName).empty();
+ },
+
+ /* Enable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _enableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = false;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = false; }).end().
+ filter('img').css({opacity: '1.0', cursor: ''});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().removeClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ },
+
+ /* Disable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _disableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = true;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = true; }).end().
+ filter('img').css({opacity: '0.5', cursor: 'default'});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().addClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = target;
+ },
+
+ /* Is the first field in a jQuery collection disabled as a datepicker?
+ @param target element - the target input field or division or span
+ @return boolean - true if disabled, false if enabled */
+ _isDisabledDatepicker: function(target) {
+ if (!target) {
+ return false;
+ }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] == target)
+ return true;
+ }
+ return false;
+ },
+
+ /* Retrieve the instance data for the target control.
+ @param target element - the target input field or division or span
+ @return object - the associated instance data
+ @throws error if a jQuery problem getting data */
+ _getInst: function(target) {
+ try {
+ return $.data(target, PROP_NAME);
+ }
+ catch (err) {
+ throw 'Missing instance data for this datepicker';
+ }
+ },
+
+ /* Update or retrieve the settings for a date picker attached to an input field or division.
+ @param target element - the target input field or division or span
+ @param name object - the new settings to update or
+ string - the name of the setting to change or retrieve,
+ when retrieving also 'all' for all instance settings or
+ 'defaults' for all global defaults
+ @param value any - the new value for the setting
+ (omit if above is an object or to retrieve a value) */
+ _optionDatepicker: function(target, name, value) {
+ var inst = this._getInst(target);
+ if (arguments.length == 2 && typeof name == 'string') {
+ return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+ var settings = name || {};
+ if (typeof name == 'string') {
+ settings = {};
+ settings[name] = value;
+ }
+ if (inst) {
+ if (this._curInst == inst) {
+ this._hideDatepicker();
+ }
+ var date = this._getDateDatepicker(target, true);
+ extendRemove(inst.settings, settings);
+ this._attachments($(target), inst);
+ this._autoSize(inst);
+ this._setDateDatepicker(target, date);
+ this._updateDatepicker(inst);
+ }
+ },
+
+ // change method deprecated
+ _changeDatepicker: function(target, name, value) {
+ this._optionDatepicker(target, name, value);
+ },
+
+ /* Redraw the date picker attached to an input field or division.
+ @param target element - the target input field or division or span */
+ _refreshDatepicker: function(target) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._updateDatepicker(inst);
+ }
+ },
+
+ /* Set the dates for a jQuery selection.
+ @param target element - the target input field or division or span
+ @param date Date - the new date */
+ _setDateDatepicker: function(target, date) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setDate(inst, date);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ }
+ },
+
+ /* Get the date(s) for the first entry in a jQuery selection.
+ @param target element - the target input field or division or span
+ @param noDefault boolean - true if no default date is to be used
+ @return Date - the current date */
+ _getDateDatepicker: function(target, noDefault) {
+ var inst = this._getInst(target);
+ if (inst && !inst.inline)
+ this._setDateFromField(inst, noDefault);
+ return (inst ? this._getDate(inst) : null);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ var handled = true;
+ var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+ inst._keyEvent = true;
+ if ($.datepicker._datepickerShowing)
+ switch (event.keyCode) {
+ case 9: $.datepicker._hideDatepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13: var sel = $('td.' + $.datepicker._dayOverClass, inst.dpDiv).
+ add($('td.' + $.datepicker._currentClass, inst.dpDiv));
+ if (sel[0])
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+ else
+ $.datepicker._hideDatepicker();
+ return false; // don't submit the form
+ break; // select the value on enter
+ case 27: $.datepicker._hideDatepicker();
+ break; // hide on escape
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // previous month/year on page up/+ ctrl
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // next month/year on page down/+ ctrl
+ case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // clear on ctrl or command +end
+ case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // current on ctrl or command +home
+ case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // -1 day on ctrl or command +left
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +left on Mac
+ break;
+ case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // -1 week on ctrl or command +up
+ case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // +1 day on ctrl or command +right
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +right
+ break;
+ case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // +1 week on ctrl or command +down
+ default: handled = false;
+ }
+ else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+ $.datepicker._showDatepicker(this);
+ else {
+ handled = false;
+ }
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Filter entered characters - based on date format. */
+ _doKeyPress: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if ($.datepicker._get(inst, 'constrainInput')) {
+ var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+ var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+ return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+ }
+ },
+
+ /* Synchronise manual entry and field/alternate field. */
+ _doKeyUp: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if (inst.input.val() != inst.lastVal) {
+ try {
+ var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ (inst.input ? inst.input.val() : null),
+ $.datepicker._getFormatConfig(inst));
+ if (date) { // only if valid
+ $.datepicker._setDateFromField(inst);
+ $.datepicker._updateAlternate(inst);
+ $.datepicker._updateDatepicker(inst);
+ }
+ }
+ catch (event) {
+ $.datepicker.log(event);
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ @param input element - the input field attached to the date picker or
+ event - if triggered by focus */
+ _showDatepicker: function(input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+ input = $('input', input.parentNode)[0];
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+ return;
+ var inst = $.datepicker._getInst(input);
+ if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ }
+ var beforeShow = $.datepicker._get(inst, 'beforeShow');
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ inst.lastVal = null;
+ $.datepicker._lastInput = input;
+ $.datepicker._setDateFromField(inst);
+ if ($.datepicker._inDialog) // hide cursor
+ input.value = '';
+ if (!$.datepicker._pos) { // position below input
+ $.datepicker._pos = $.datepicker._findPos(input);
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
+ }
+ var isFixed = false;
+ $(input).parents().each(function() {
+ isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
+ });
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+ $.datepicker._pos[0] -= document.documentElement.scrollLeft;
+ $.datepicker._pos[1] -= document.documentElement.scrollTop;
+ }
+ var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+ $.datepicker._pos = null;
+ // determine sizing offscreen
+ inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+ $.datepicker._updateDatepicker(inst);
+ // fix width for dynamic number of date pickers
+ // and adjust position before showing
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+ left: offset.left + 'px', top: offset.top + 'px'});
+ if (!inst.inline) {
+ var showAnim = $.datepicker._get(inst, 'showAnim');
+ var duration = $.datepicker._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._datepickerShowing = true;
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ inst.dpDiv.find('iframe.ui-datepicker-cover'). // IE6- only
+ css({left: -borders[0], top: -borders[1],
+ width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+ };
+ inst.dpDiv.zIndex($(input).zIndex()+1);
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+ if (!showAnim || !duration)
+ postProcess();
+ if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+ inst.input.focus();
+ $.datepicker._curInst = inst;
+ }
+ },
+
+ /* Generate the date picker content. */
+ _updateDatepicker: function(inst) {
+ var self = this;
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ inst.dpDiv.empty().append(this._generateHTML(inst))
+ .find('iframe.ui-datepicker-cover') // IE6- only
+ .css({left: -borders[0], top: -borders[1],
+ width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+ .end()
+ .find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
+ .bind('mouseout', function(){
+ $(this).removeClass('ui-state-hover');
+ if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
+ if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
+ })
+ .bind('mouseover', function(){
+ if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
+ $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+ $(this).addClass('ui-state-hover');
+ if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
+ if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
+ }
+ })
+ .end()
+ .find('.' + this._dayOverClass + ' a')
+ .trigger('mouseover')
+ .end();
+ var numMonths = this._getNumberOfMonths(inst);
+ var cols = numMonths[1];
+ var width = 17;
+ if (cols > 1)
+ inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+ else
+ inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+ inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-multi');
+ inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-rtl');
+ if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+ inst.input.is(':visible') && !inst.input.is(':disabled'))
+ inst.input.focus();
+ },
+
+ /* Retrieve the size of left and top borders for an element.
+ @param elem (jQuery object) the element of interest
+ @return (number[2]) the left and top borders */
+ _getBorders: function(elem) {
+ var convert = function(value) {
+ return {thin: 1, medium: 2, thick: 3}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function(inst, offset, isFixed) {
+ var dpWidth = inst.dpDiv.outerWidth();
+ var dpHeight = inst.dpDiv.outerHeight();
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+ offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function(obj) {
+ var inst = this._getInst(obj);
+ var isRTL = this._get(inst, 'isRTL');
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+ }
+ var position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Hide the date picker from view.
+ @param input element - the input field attached to the date picker */
+ _hideDatepicker: function(input) {
+ var inst = this._curInst;
+ if (!inst || (input && inst != $.data(input, PROP_NAME)))
+ return;
+ if (this._datepickerShowing) {
+ var showAnim = this._get(inst, 'showAnim');
+ var duration = this._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._tidyDialog(inst);
+ this._curInst = null;
+ };
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+ if (!showAnim)
+ postProcess();
+ var onClose = this._get(inst, 'onClose');
+ if (onClose)
+ onClose.apply((inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
+ this._datepickerShowing = false;
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+ if ($.blockUI) {
+ $.unblockUI();
+ $('body').append(this.dpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function(inst) {
+ inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+ },
+
+ /* Close date picker if clicked elsewhere. */
+ _checkExternalClick: function(event) {
+ if (!$.datepicker._curInst)
+ return;
+ var $target = $(event.target);
+ if ($target[0].id != $.datepicker._mainDivId &&
+ $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.hasClass($.datepicker._triggerClass) &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+ $.datepicker._hideDatepicker();
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustDate: function(id, offset, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ this._adjustInstDate(inst, offset +
+ (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+ period);
+ this._updateDatepicker(inst);
+ },
+
+ /* Action for current link. */
+ _gotoToday: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+ inst.selectedDay = inst.currentDay;
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+ inst.drawYear = inst.selectedYear = inst.currentYear;
+ }
+ else {
+ var date = new Date();
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ }
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a new month/year. */
+ _selectMonthYear: function(id, select, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ inst._selectingMonthYear = false;
+ inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+ inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+ parseInt(select.options[select.selectedIndex].value,10);
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Restore input focus after not changing month/year. */
+ _clickMonthYear: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (inst.input && inst._selectingMonthYear && !$.browser.msie)
+ inst.input.focus();
+ inst._selectingMonthYear = !inst._selectingMonthYear;
+ },
+
+ /* Action for selecting a day. */
+ _selectDay: function(id, month, year, td) {
+ var target = $(id);
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ var inst = this._getInst(target[0]);
+ inst.selectedDay = inst.currentDay = $('a', td).html();
+ inst.selectedMonth = inst.currentMonth = month;
+ inst.selectedYear = inst.currentYear = year;
+ this._selectDate(id, this._formatDate(inst,
+ inst.currentDay, inst.currentMonth, inst.currentYear));
+ },
+
+ /* Erase the input field and hide the date picker. */
+ _clearDate: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ this._selectDate(target, '');
+ },
+
+ /* Update the input field with the selected date. */
+ _selectDate: function(id, dateStr) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input)
+ inst.input.val(dateStr);
+ this._updateAlternate(inst);
+ var onSelect = this._get(inst, 'onSelect');
+ if (onSelect)
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
+ else if (inst.input)
+ inst.input.trigger('change'); // fire the change event
+ if (inst.inline)
+ this._updateDatepicker(inst);
+ else {
+ this._hideDatepicker();
+ this._lastInput = inst.input[0];
+ if (typeof(inst.input[0]) != 'object')
+ inst.input.focus(); // restore focus
+ this._lastInput = null;
+ }
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst) {
+ var altField = this._get(inst, 'altField');
+ if (altField) { // update alternate field too
+ var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+ var date = this._getDate(inst);
+ var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+ $(altField).each(function() { $(this).val(dateStr); });
+ }
+ },
+
+ /* Set as beforeShowDay function to prevent selection of weekends.
+ @param date Date - the date to customise
+ @return [boolean, string] - is this date selectable?, what is its CSS class? */
+ noWeekends: function(date) {
+ var day = date.getDay();
+ return [(day > 0 && day < 6), ''];
+ },
+
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+ @param date Date - the date to get the week for
+ @return number - the number of the week within the year that contains this date */
+ iso8601Week: function(date) {
+ var checkDate = new Date(date.getTime());
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+ var time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+ },
+
+ /* Parse a string value into a date object.
+ See formatDate below for the possible formats.
+
+ @param format string - the expected format of the date
+ @param value string - the date in the above format
+ @param settings Object - attributes include:
+ shortYearCutoff number - the cutoff year for determining the century (optional)
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return Date - the extracted date value or null if value is blank */
+ parseDate: function (format, value, settings) {
+ if (format == null || value == null)
+ throw 'Invalid arguments';
+ value = (typeof value == 'object' ? value.toString() : value + '');
+ if (value == '')
+ return null;
+ var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ var year = -1;
+ var month = -1;
+ var day = -1;
+ var doy = -1;
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Extract a number from the string value
+ var getNumber = function(match) {
+ lookAhead(match);
+ var size = (match == '@' ? 14 : (match == '!' ? 20 :
+ (match == 'y' ? 4 : (match == 'o' ? 3 : 2))));
+ var digits = new RegExp('^\\d{1,' + size + '}');
+ var num = value.substring(iValue).match(digits);
+ if (!num)
+ throw 'Missing number at position ' + iValue;
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ };
+ // Extract a name from the string value and convert to an index
+ var getName = function(match, shortNames, longNames) {
+ var names = (lookAhead(match) ? longNames : shortNames);
+ for (var i = 0; i < names.length; i++) {
+ if (value.substr(iValue, names[i].length) == names[i]) {
+ iValue += names[i].length;
+ return i + 1;
+ }
+ }
+ throw 'Unknown name at position ' + iValue;
+ };
+ // Confirm that a literal character matches the string value
+ var checkLiteral = function() {
+ if (value.charAt(iValue) != format.charAt(iFormat))
+ throw 'Unexpected literal at position ' + iValue;
+ iValue++;
+ };
+ var iValue = 0;
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ checkLiteral();
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ day = getNumber('d');
+ break;
+ case 'D':
+ getName('D', dayNamesShort, dayNames);
+ break;
+ case 'o':
+ doy = getNumber('o');
+ break;
+ case 'm':
+ month = getNumber('m');
+ break;
+ case 'M':
+ month = getName('M', monthNamesShort, monthNames);
+ break;
+ case 'y':
+ year = getNumber('y');
+ break;
+ case '@':
+ var date = new Date(getNumber('@'));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case '!':
+ var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "'":
+ if (lookAhead("'"))
+ checkLiteral();
+ else
+ literal = true;
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ if (year == -1)
+ year = new Date().getFullYear();
+ else if (year < 100)
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+ (year <= shortYearCutoff ? 0 : -100);
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ do {
+ var dim = this._getDaysInMonth(year, month - 1);
+ if (day <= dim)
+ break;
+ month++;
+ day -= dim;
+ } while (true);
+ }
+ var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+ if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+ throw 'Invalid date'; // E.g. 31/02/*
+ return date;
+ },
+
+ /* Standard date formats. */
+ ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+ COOKIE: 'D, dd M yy',
+ ISO_8601: 'yy-mm-dd',
+ RFC_822: 'D, d M y',
+ RFC_850: 'DD, dd-M-y',
+ RFC_1036: 'D, d M y',
+ RFC_1123: 'D, d M yy',
+ RFC_2822: 'D, d M yy',
+ RSS: 'D, d M y', // RFC 822
+ TICKS: '!',
+ TIMESTAMP: '@',
+ W3C: 'yy-mm-dd', // ISO 8601
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+ /* Format a date object into a string value.
+ The format can be combinations of the following:
+ d - day of month (no leading zero)
+ dd - day of month (two digit)
+ o - day of year (no leading zeros)
+ oo - day of year (three digit)
+ D - day name short
+ DD - day name long
+ m - month of year (no leading zero)
+ mm - month of year (two digit)
+ M - month name short
+ MM - month name long
+ y - year (two digit)
+ yy - year (four digit)
+ @ - Unix timestamp (ms since 01/01/1970)
+ ! - Windows ticks (100ns since 01/01/0001)
+ '...' - literal text
+ '' - single quote
+
+ @param format string - the desired format of the date
+ @param date Date - the date value to format
+ @param settings Object - attributes include:
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return string - the date in the above format */
+ formatDate: function (format, date, settings) {
+ if (!date)
+ return '';
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Format a number, with leading zero if necessary
+ var formatNumber = function(match, value, len) {
+ var num = '' + value;
+ if (lookAhead(match))
+ while (num.length < len)
+ num = '0' + num;
+ return num;
+ };
+ // Format a name, short or long as requested
+ var formatName = function(match, value, shortNames, longNames) {
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
+ };
+ var output = '';
+ var literal = false;
+ if (date)
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ output += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ output += formatNumber('d', date.getDate(), 2);
+ break;
+ case 'D':
+ output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+ break;
+ case 'o':
+ output += formatNumber('o',
+ (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
+ break;
+ case 'm':
+ output += formatNumber('m', date.getMonth() + 1, 2);
+ break;
+ case 'M':
+ output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+ break;
+ case 'y':
+ output += (lookAhead('y') ? date.getFullYear() :
+ (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+ break;
+ case '@':
+ output += date.getTime();
+ break;
+ case '!':
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case "'":
+ if (lookAhead("'"))
+ output += "'";
+ else
+ literal = true;
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ return output;
+ },
+
+ /* Extract all possible characters from the date format. */
+ _possibleChars: function (format) {
+ var chars = '';
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ for (var iFormat = 0; iFormat < format.length; iFormat++)
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ chars += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd': case 'm': case 'y': case '@':
+ chars += '0123456789';
+ break;
+ case 'D': case 'M':
+ return null; // Accept anything
+ case "'":
+ if (lookAhead("'"))
+ chars += "'";
+ else
+ literal = true;
+ break;
+ default:
+ chars += format.charAt(iFormat);
+ }
+ return chars;
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function(inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing date and initialise date picker. */
+ _setDateFromField: function(inst, noDefault) {
+ if (inst.input.val() == inst.lastVal) {
+ return;
+ }
+ var dateFormat = this._get(inst, 'dateFormat');
+ var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+ var date, defaultDate;
+ date = defaultDate = this._getDefaultDate(inst);
+ var settings = this._getFormatConfig(inst);
+ try {
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+ } catch (event) {
+ this.log(event);
+ dates = (noDefault ? '' : dates);
+ }
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ inst.currentDay = (dates ? date.getDate() : 0);
+ inst.currentMonth = (dates ? date.getMonth() : 0);
+ inst.currentYear = (dates ? date.getFullYear() : 0);
+ this._adjustInstDate(inst);
+ },
+
+ /* Retrieve the default date shown on opening. */
+ _getDefaultDate: function(inst) {
+ return this._restrictMinMax(inst,
+ this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+ },
+
+ /* A date may be specified as an exact value or a relative one. */
+ _determineDate: function(inst, date, defaultDate) {
+ var offsetNumeric = function(offset) {
+ var date = new Date();
+ date.setDate(date.getDate() + offset);
+ return date;
+ };
+ var offsetString = function(offset) {
+ try {
+ return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ offset, $.datepicker._getFormatConfig(inst));
+ }
+ catch (e) {
+ // Ignore
+ }
+ var date = (offset.toLowerCase().match(/^c/) ?
+ $.datepicker._getDate(inst) : null) || new Date();
+ var year = date.getFullYear();
+ var month = date.getMonth();
+ var day = date.getDate();
+ var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+ var matches = pattern.exec(offset);
+ while (matches) {
+ switch (matches[2] || 'd') {
+ case 'd' : case 'D' :
+ day += parseInt(matches[1],10); break;
+ case 'w' : case 'W' :
+ day += parseInt(matches[1],10) * 7; break;
+ case 'm' : case 'M' :
+ month += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ case 'y': case 'Y' :
+ year += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ }
+ matches = pattern.exec(offset);
+ }
+ return new Date(year, month, day);
+ };
+ date = (date == null ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+ (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date)));
+ date = (date && date.toString() == 'Invalid Date' ? defaultDate : date);
+ if (date) {
+ date.setHours(0);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ date.setMilliseconds(0);
+ }
+ return this._daylightSavingAdjust(date);
+ },
+
+ /* Handle switch to/from daylight saving.
+ Hours may be non-zero on daylight saving cut-over:
+ > 12 when midnight changeover, but then cannot generate
+ midnight datetime, so jump to 1AM, otherwise reset.
+ @param date (Date) the date to check
+ @return (Date) the corrected date */
+ _daylightSavingAdjust: function(date) {
+ if (!date) return null;
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+ return date;
+ },
+
+ /* Set the date(s) directly. */
+ _setDate: function(inst, date, noChange) {
+ var clear = !(date);
+ var origMonth = inst.selectedMonth;
+ var origYear = inst.selectedYear;
+ date = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+ inst.selectedDay = inst.currentDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear();
+ if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+ this._notifyChange(inst);
+ this._adjustInstDate(inst);
+ if (inst.input) {
+ inst.input.val(clear ? '' : this._formatDate(inst));
+ }
+ },
+
+ /* Retrieve the date(s) directly. */
+ _getDate: function(inst) {
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+ this._daylightSavingAdjust(new Date(
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return startDate;
+ },
+
+ /* Generate the HTML for the current state of the date picker. */
+ _generateHTML: function(inst) {
+ var today = new Date();
+ today = this._daylightSavingAdjust(
+ new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+ var isRTL = this._get(inst, 'isRTL');
+ var showButtonPanel = this._get(inst, 'showButtonPanel');
+ var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+ var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+ var numMonths = this._getNumberOfMonths(inst);
+ var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+ var stepMonths = this._get(inst, 'stepMonths');
+ var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+ var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var drawMonth = inst.drawMonth - showCurrentAtPos;
+ var drawYear = inst.drawYear;
+ if (drawMonth < 0) {
+ drawMonth += 12;
+ drawYear--;
+ }
+ if (maxDate) {
+ var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+ drawMonth--;
+ if (drawMonth < 0) {
+ drawMonth = 11;
+ drawYear--;
+ }
+ }
+ }
+ inst.drawMonth = drawMonth;
+ inst.drawYear = drawYear;
+ var prevText = this._get(inst, 'prevText');
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+ ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+ var nextText = this._get(inst, 'nextText');
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+ ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+ var currentText = this._get(inst, 'currentText');
+ var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+ currentText = (!navigationAsDateFormat ? currentText :
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+ var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+ var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+ (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+ '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+ var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
+ var showWeek = this._get(inst, 'showWeek');
+ var dayNames = this._get(inst, 'dayNames');
+ var dayNamesShort = this._get(inst, 'dayNamesShort');
+ var dayNamesMin = this._get(inst, 'dayNamesMin');
+ var monthNames = this._get(inst, 'monthNames');
+ var monthNamesShort = this._get(inst, 'monthNamesShort');
+ var beforeShowDay = this._get(inst, 'beforeShowDay');
+ var showOtherMonths = this._get(inst, 'showOtherMonths');
+ var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+ var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+ var defaultDate = this._getDefaultDate(inst);
+ var html = '';
+ for (var row = 0; row < numMonths[0]; row++) {
+ var group = '';
+ for (var col = 0; col < numMonths[1]; col++) {
+ var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+ var cornerClass = ' ui-corner-all';
+ var calender = '';
+ if (isMultiMonth) {
+ calender += '<div class="ui-datepicker-group';
+ if (numMonths[1] > 1)
+ switch (col) {
+ case 0: calender += ' ui-datepicker-group-first';
+ cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+ case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+ cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+ default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+ }
+ calender += '">';
+ }
+ calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+ (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+ (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+ '</div><table class="ui-datepicker-calendar"><thead>' +
+ '<tr>';
+ var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+ for (var dow = 0; dow < 7; dow++) { // days of the week
+ var day = (dow + firstDay) % 7;
+ thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+ '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+ }
+ calender += thead + '</tr></thead><tbody>';
+ var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+ if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+ var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+ var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
+ var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+ for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+ calender += '<tr>';
+ var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+ this._get(inst, 'calculateWeek')(printDate) + '</td>');
+ for (var dow = 0; dow < 7; dow++) { // create date picker days
+ var daySettings = (beforeShowDay ?
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+ var otherMonth = (printDate.getMonth() != drawMonth);
+ var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+ (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+ tbody += '<td class="' +
+ ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+ (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+ ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+ (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+ // or defaultDate is current printedDate and defaultDate is selectedDate
+ ' ' + this._dayOverClass : '') + // highlight selected day
+ (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days
+ (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+ (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+ (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+ (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+ inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+ (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
+ (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+ (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+ (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+ (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+ '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
+ }
+ calender += tbody + '</tr>';
+ }
+ drawMonth++;
+ if (drawMonth > 11) {
+ drawMonth = 0;
+ drawYear++;
+ }
+ calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
+ ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+ group += calender;
+ }
+ html += group;
+ }
+ html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+ '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+ inst._keyEvent = false;
+ return html;
+ },
+
+ /* Generate the month and year header. */
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+ secondary, monthNames, monthNamesShort) {
+ var changeMonth = this._get(inst, 'changeMonth');
+ var changeYear = this._get(inst, 'changeYear');
+ var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+ var html = '<div class="ui-datepicker-title">';
+ var monthHtml = '';
+ // month selection
+ if (secondary || !changeMonth)
+ monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+ else {
+ var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+ var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+ monthHtml += '<select class="ui-datepicker-month" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ for (var month = 0; month < 12; month++) {
+ if ((!inMinYear || month >= minDate.getMonth()) &&
+ (!inMaxYear || month <= maxDate.getMonth()))
+ monthHtml += '<option value="' + month + '"' +
+ (month == drawMonth ? ' selected="selected"' : '') +
+ '>' + monthNamesShort[month] + '</option>';
+ }
+ monthHtml += '</select>';
+ }
+ if (!showMonthAfterYear)
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
+ // year selection
+ if (secondary || !changeYear)
+ html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+ else {
+ // determine range of years to display
+ var years = this._get(inst, 'yearRange').split(':');
+ var thisYear = new Date().getFullYear();
+ var determineYear = function(value) {
+ var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ var year = determineYear(years[0]);
+ var endYear = Math.max(year, determineYear(years[1] || ''));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ html += '<select class="ui-datepicker-year" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ for (; year <= endYear; year++) {
+ html += '<option value="' + year + '"' +
+ (year == drawYear ? ' selected="selected"' : '') +
+ '>' + year + '</option>';
+ }
+ html += '</select>';
+ }
+ html += this._get(inst, 'yearSuffix');
+ if (showMonthAfterYear)
+ html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
+ html += '</div>'; // Close datepicker_header
+ return html;
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustInstDate: function(inst, offset, period) {
+ var year = inst.drawYear + (period == 'Y' ? offset : 0);
+ var month = inst.drawMonth + (period == 'M' ? offset : 0);
+ var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+ (period == 'D' ? offset : 0);
+ var date = this._restrictMinMax(inst,
+ this._daylightSavingAdjust(new Date(year, month, day)));
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ if (period == 'M' || period == 'Y')
+ this._notifyChange(inst);
+ },
+
+ /* Ensure a date is within any min/max bounds. */
+ _restrictMinMax: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ date = (minDate && date < minDate ? minDate : date);
+ date = (maxDate && date > maxDate ? maxDate : date);
+ return date;
+ },
+
+ /* Notify change of month/year. */
+ _notifyChange: function(inst) {
+ var onChange = this._get(inst, 'onChangeMonthYear');
+ if (onChange)
+ onChange.apply((inst.input ? inst.input[0] : null),
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
+ },
+
+ /* Determine the number of months to show. */
+ _getNumberOfMonths: function(inst) {
+ var numMonths = this._get(inst, 'numberOfMonths');
+ return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+ },
+
+ /* Determine the current maximum date - ensure no time components are set. */
+ _getMinMaxDate: function(inst, minMax) {
+ return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+ },
+
+ /* Find the number of days in a given month. */
+ _getDaysInMonth: function(year, month) {
+ return 32 - new Date(year, month, 32).getDate();
+ },
+
+ /* Find the day of the week of the first of a month. */
+ _getFirstDayOfMonth: function(year, month) {
+ return new Date(year, month, 1).getDay();
+ },
+
+ /* Determines if we should allow a "next/prev" month display change. */
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+ var numMonths = this._getNumberOfMonths(inst);
+ var date = this._daylightSavingAdjust(new Date(curYear,
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+ if (offset < 0)
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+ return this._isInRange(inst, date);
+ },
+
+ /* Is the given date in the accepted range? */
+ _isInRange: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime()));
+ },
+
+ /* Provide the configuration settings for formatting/parsing. */
+ _getFormatConfig: function(inst) {
+ var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ return {shortYearCutoff: shortYearCutoff,
+ dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+ monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+ },
+
+ /* Format the given date for display. */
+ _formatDate: function(inst, day, month, year) {
+ if (!day) {
+ inst.currentDay = inst.selectedDay;
+ inst.currentMonth = inst.selectedMonth;
+ inst.currentYear = inst.selectedYear;
+ }
+ var date = (day ? (typeof day == 'object' ? day :
+ this._daylightSavingAdjust(new Date(year, month, day))) :
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+ }
+});
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props)
+ if (props[name] == null || props[name] == undefined)
+ target[name] = props[name];
+ return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+ return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+ (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new datepicker functionality
+ @return jQuery object */
+$.fn.datepicker = function(options){
+
+ /* Initialise the date picker. */
+ if (!$.datepicker.initialized) {
+ $(document).mousedown($.datepicker._checkExternalClick).
+ find('body').append($.datepicker.dpDiv);
+ $.datepicker.initialized = true;
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ return this.each(function() {
+ typeof options == 'string' ?
+ $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this].concat(otherArgs)) :
+ $.datepicker._attachDatepicker(this, options);
+ });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.2";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.dialog.js b/resources/jquery.ui/jquery.ui.dialog.js
new file mode 100644
index 00000000..5f9b1f8b
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.dialog.js
@@ -0,0 +1,823 @@
+/*
+ * jQuery UI Dialog 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function($) {
+
+var uiDialogClasses =
+ 'ui-dialog ' +
+ 'ui-widget ' +
+ 'ui-widget-content ' +
+ 'ui-corner-all ';
+
+$.widget("ui.dialog", {
+ options: {
+ autoOpen: true,
+ buttons: {},
+ closeOnEscape: true,
+ closeText: 'close',
+ dialogClass: '',
+ draggable: true,
+ hide: null,
+ height: 'auto',
+ maxHeight: false,
+ maxWidth: false,
+ minHeight: 150,
+ minWidth: 150,
+ modal: false,
+ position: 'center',
+ resizable: true,
+ show: null,
+ stack: true,
+ title: '',
+ width: 300,
+ zIndex: 1000
+ },
+ _create: function() {
+ this.originalTitle = this.element.attr('title');
+
+ var self = this,
+ options = self.options,
+
+ title = options.title || self.originalTitle || '&#160;',
+ titleId = $.ui.dialog.getTitleId(self.element),
+
+ uiDialog = (self.uiDialog = $('<div></div>'))
+ .appendTo(document.body)
+ .hide()
+ .addClass(uiDialogClasses + options.dialogClass)
+ .css({
+ zIndex: options.zIndex
+ })
+ // setting tabIndex makes the div focusable
+ // setting outline to 0 prevents a border on focus in Mozilla
+ .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+ if (options.closeOnEscape && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ self.close(event);
+ event.preventDefault();
+ }
+ })
+ .attr({
+ role: 'dialog',
+ 'aria-labelledby': titleId
+ })
+ .mousedown(function(event) {
+ self.moveToTop(false, event);
+ }),
+
+ uiDialogContent = self.element
+ .show()
+ .removeAttr('title')
+ .addClass(
+ 'ui-dialog-content ' +
+ 'ui-widget-content')
+ .appendTo(uiDialog),
+
+ uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+ .addClass(
+ 'ui-dialog-titlebar ' +
+ 'ui-widget-header ' +
+ 'ui-corner-all ' +
+ 'ui-helper-clearfix'
+ )
+ .prependTo(uiDialog),
+
+ uiDialogTitlebarClose = $('<a href="#"></a>')
+ .addClass(
+ 'ui-dialog-titlebar-close ' +
+ 'ui-corner-all'
+ )
+ .attr('role', 'button')
+ .hover(
+ function() {
+ uiDialogTitlebarClose.addClass('ui-state-hover');
+ },
+ function() {
+ uiDialogTitlebarClose.removeClass('ui-state-hover');
+ }
+ )
+ .focus(function() {
+ uiDialogTitlebarClose.addClass('ui-state-focus');
+ })
+ .blur(function() {
+ uiDialogTitlebarClose.removeClass('ui-state-focus');
+ })
+ .click(function(event) {
+ self.close(event);
+ return false;
+ })
+ .appendTo(uiDialogTitlebar),
+
+ uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+ .addClass(
+ 'ui-icon ' +
+ 'ui-icon-closethick'
+ )
+ .text(options.closeText)
+ .appendTo(uiDialogTitlebarClose),
+
+ uiDialogTitle = $('<span></span>')
+ .addClass('ui-dialog-title')
+ .attr('id', titleId)
+ .html(title)
+ .prependTo(uiDialogTitlebar);
+
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+ options.beforeClose = options.beforeclose;
+ }
+
+ uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+ if (options.draggable && $.fn.draggable) {
+ self._makeDraggable();
+ }
+ if (options.resizable && $.fn.resizable) {
+ self._makeResizable();
+ }
+
+ self._createButtons(options.buttons);
+ self._isOpen = false;
+
+ if ($.fn.bgiframe) {
+ uiDialog.bgiframe();
+ }
+ },
+ _init: function() {
+ if ( this.options.autoOpen ) {
+ this.open();
+ }
+ },
+
+ destroy: function() {
+ var self = this;
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.hide();
+ self.element
+ .unbind('.dialog')
+ .removeData('dialog')
+ .removeClass('ui-dialog-content ui-widget-content')
+ .hide().appendTo('body');
+ self.uiDialog.remove();
+
+ if (self.originalTitle) {
+ self.element.attr('title', self.originalTitle);
+ }
+
+ return self;
+ },
+
+ widget: function() {
+ return this.uiDialog;
+ },
+
+ close: function(event) {
+ var self = this,
+ maxZ;
+
+ if (false === self._trigger('beforeClose', event)) {
+ return;
+ }
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.unbind('keypress.ui-dialog');
+
+ self._isOpen = false;
+
+ if (self.options.hide) {
+ self.uiDialog.hide(self.options.hide, function() {
+ self._trigger('close', event);
+ });
+ } else {
+ self.uiDialog.hide();
+ self._trigger('close', event);
+ }
+
+ $.ui.dialog.overlay.resize();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ if (self.options.modal) {
+ maxZ = 0;
+ $('.ui-dialog').each(function() {
+ if (this !== self.uiDialog[0]) {
+ maxZ = Math.max(maxZ, $(this).css('z-index'));
+ }
+ });
+ $.ui.dialog.maxZ = maxZ;
+ }
+
+ return self;
+ },
+
+ isOpen: function() {
+ return this._isOpen;
+ },
+
+ // the force parameter allows us to move modal dialogs to their correct
+ // position on open
+ moveToTop: function(force, event) {
+ var self = this,
+ options = self.options,
+ saveScroll;
+
+ if ((options.modal && !force) ||
+ (!options.stack && !options.modal)) {
+ return self._trigger('focus', event);
+ }
+
+ if (options.zIndex > $.ui.dialog.maxZ) {
+ $.ui.dialog.maxZ = options.zIndex;
+ }
+ if (self.overlay) {
+ $.ui.dialog.maxZ += 1;
+ self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+ }
+
+ //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+ // http://ui.jquery.com/bugs/ticket/3193
+ saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
+ $.ui.dialog.maxZ += 1;
+ self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+ self.element.attr(saveScroll);
+ self._trigger('focus', event);
+
+ return self;
+ },
+
+ open: function() {
+ if (this._isOpen) { return; }
+
+ var self = this,
+ options = self.options,
+ uiDialog = self.uiDialog;
+
+ self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+ if (uiDialog.next().length) {
+ uiDialog.appendTo('body');
+ }
+ self._size();
+ self._position(options.position);
+ uiDialog.show(options.show);
+ self.moveToTop(true);
+
+ // prevent tabbing out of modal dialogs
+ if (options.modal) {
+ uiDialog.bind('keypress.ui-dialog', function(event) {
+ if (event.keyCode !== $.ui.keyCode.TAB) {
+ return;
+ }
+
+ var tabbables = $(':tabbable', this),
+ first = tabbables.filter(':first'),
+ last = tabbables.filter(':last');
+
+ if (event.target === last[0] && !event.shiftKey) {
+ first.focus(1);
+ return false;
+ } else if (event.target === first[0] && event.shiftKey) {
+ last.focus(1);
+ return false;
+ }
+ });
+ }
+
+ // set focus to the first tabbable element in the content area or the first button
+ // if there are no tabbable elements, set focus on the dialog itself
+ $([])
+ .add(uiDialog.find('.ui-dialog-content :tabbable:first'))
+ .add(uiDialog.find('.ui-dialog-buttonpane :tabbable:first'))
+ .add(uiDialog)
+ .filter(':first')
+ .focus();
+
+ self._trigger('open');
+ self._isOpen = true;
+
+ return self;
+ },
+
+ _createButtons: function(buttons) {
+ var self = this,
+ hasButtons = false,
+ uiDialogButtonPane = $('<div></div>')
+ .addClass(
+ 'ui-dialog-buttonpane ' +
+ 'ui-widget-content ' +
+ 'ui-helper-clearfix'
+ );
+
+ // if we already have a button pane, remove it
+ self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+ if (typeof buttons === 'object' && buttons !== null) {
+ $.each(buttons, function() {
+ return !(hasButtons = true);
+ });
+ }
+ if (hasButtons) {
+ $.each(buttons, function(name, fn) {
+ var button = $('<button type="button"></button>')
+ .text(name)
+ .click(function() { fn.apply(self.element[0], arguments); })
+ .appendTo(uiDialogButtonPane);
+ if ($.fn.button) {
+ button.button();
+ }
+ });
+ uiDialogButtonPane.appendTo(self.uiDialog);
+ }
+ },
+
+ _makeDraggable: function() {
+ var self = this,
+ options = self.options,
+ doc = $(document),
+ heightBeforeDrag;
+
+ function filteredUi(ui) {
+ return {
+ position: ui.position,
+ offset: ui.offset
+ };
+ }
+
+ self.uiDialog.draggable({
+ cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+ handle: '.ui-dialog-titlebar',
+ containment: 'document',
+ start: function(event, ui) {
+ heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+ $(this).height($(this).height()).addClass("ui-dialog-dragging");
+ self._trigger('dragStart', event, filteredUi(ui));
+ },
+ drag: function(event, ui) {
+ self._trigger('drag', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ options.position = [ui.position.left - doc.scrollLeft(),
+ ui.position.top - doc.scrollTop()];
+ $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+ self._trigger('dragStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ });
+ },
+
+ _makeResizable: function(handles) {
+ handles = (handles === undefined ? this.options.resizable : handles);
+ var self = this,
+ options = self.options,
+ // .ui-resizable has position: relative defined in the stylesheet
+ // but dialogs have to use absolute or fixed positioning
+ position = self.uiDialog.css('position'),
+ resizeHandles = (typeof handles === 'string' ?
+ handles :
+ 'n,e,s,w,se,sw,ne,nw'
+ );
+
+ function filteredUi(ui) {
+ return {
+ originalPosition: ui.originalPosition,
+ originalSize: ui.originalSize,
+ position: ui.position,
+ size: ui.size
+ };
+ }
+
+ self.uiDialog.resizable({
+ cancel: '.ui-dialog-content',
+ containment: 'document',
+ alsoResize: self.element,
+ maxWidth: options.maxWidth,
+ maxHeight: options.maxHeight,
+ minWidth: options.minWidth,
+ minHeight: self._minHeight(),
+ handles: resizeHandles,
+ start: function(event, ui) {
+ $(this).addClass("ui-dialog-resizing");
+ self._trigger('resizeStart', event, filteredUi(ui));
+ },
+ resize: function(event, ui) {
+ self._trigger('resize', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ $(this).removeClass("ui-dialog-resizing");
+ options.height = $(this).height();
+ options.width = $(this).width();
+ self._trigger('resizeStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ })
+ .css('position', position)
+ .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+ },
+
+ _minHeight: function() {
+ var options = this.options;
+
+ if (options.height === 'auto') {
+ return options.minHeight;
+ } else {
+ return Math.min(options.minHeight, options.height);
+ }
+ },
+
+ _position: function(position) {
+ var myAt = [],
+ offset = [0, 0],
+ isVisible;
+
+ position = position || $.ui.dialog.prototype.options.position;
+
+ // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+// if (typeof position == 'string' || $.isArray(position)) {
+// myAt = $.isArray(position) ? position : position.split(' ');
+
+ if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+ myAt = position.split ? position.split(' ') : [position[0], position[1]];
+ if (myAt.length === 1) {
+ myAt[1] = myAt[0];
+ }
+
+ $.each(['left', 'top'], function(i, offsetPosition) {
+ if (+myAt[i] === myAt[i]) {
+ offset[i] = myAt[i];
+ myAt[i] = offsetPosition;
+ }
+ });
+ } else if (typeof position === 'object') {
+ if ('left' in position) {
+ myAt[0] = 'left';
+ offset[0] = position.left;
+ } else if ('right' in position) {
+ myAt[0] = 'right';
+ offset[0] = -position.right;
+ }
+
+ if ('top' in position) {
+ myAt[1] = 'top';
+ offset[1] = position.top;
+ } else if ('bottom' in position) {
+ myAt[1] = 'bottom';
+ offset[1] = -position.bottom;
+ }
+ }
+
+ // need to show the dialog to get the actual offset in the position plugin
+ isVisible = this.uiDialog.is(':visible');
+ if (!isVisible) {
+ this.uiDialog.show();
+ }
+ this.uiDialog
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .position({
+ my: myAt.join(' '),
+ at: myAt.join(' '),
+ offset: offset.join(' '),
+ of: window,
+ collision: 'fit',
+ // ensure that the titlebar is never outside the document
+ using: function(pos) {
+ var topOffset = $(this).css(pos).offset().top;
+ if (topOffset < 0) {
+ $(this).css('top', pos.top - topOffset);
+ }
+ }
+ });
+ if (!isVisible) {
+ this.uiDialog.hide();
+ }
+ },
+
+ _setOption: function(key, value){
+ var self = this,
+ uiDialog = self.uiDialog,
+ isResizable = uiDialog.is(':data(resizable)'),
+ resize = false;
+
+ switch (key) {
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ case "beforeclose":
+ key = "beforeClose";
+ break;
+ case "buttons":
+ self._createButtons(value);
+ break;
+ case "closeText":
+ // convert whatever was passed in to a string, for text() to not throw up
+ self.uiDialogTitlebarCloseText.text("" + value);
+ break;
+ case "dialogClass":
+ uiDialog
+ .removeClass(self.options.dialogClass)
+ .addClass(uiDialogClasses + value);
+ break;
+ case "disabled":
+ if (value) {
+ uiDialog.addClass('ui-dialog-disabled');
+ } else {
+ uiDialog.removeClass('ui-dialog-disabled');
+ }
+ break;
+ case "draggable":
+ if (value) {
+ self._makeDraggable();
+ } else {
+ uiDialog.draggable('destroy');
+ }
+ break;
+ case "height":
+ resize = true;
+ break;
+ case "maxHeight":
+ if (isResizable) {
+ uiDialog.resizable('option', 'maxHeight', value);
+ }
+ resize = true;
+ break;
+ case "maxWidth":
+ if (isResizable) {
+ uiDialog.resizable('option', 'maxWidth', value);
+ }
+ resize = true;
+ break;
+ case "minHeight":
+ if (isResizable) {
+ uiDialog.resizable('option', 'minHeight', value);
+ }
+ resize = true;
+ break;
+ case "minWidth":
+ if (isResizable) {
+ uiDialog.resizable('option', 'minWidth', value);
+ }
+ resize = true;
+ break;
+ case "position":
+ self._position(value);
+ break;
+ case "resizable":
+ // currently resizable, becoming non-resizable
+ if (isResizable && !value) {
+ uiDialog.resizable('destroy');
+ }
+
+ // currently resizable, changing handles
+ if (isResizable && typeof value === 'string') {
+ uiDialog.resizable('option', 'handles', value);
+ }
+
+ // currently non-resizable, becoming resizable
+ if (!isResizable && value !== false) {
+ self._makeResizable(value);
+ }
+ break;
+ case "title":
+ // convert whatever was passed in o a string, for html() to not throw up
+ $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+ break;
+ case "width":
+ resize = true;
+ break;
+ }
+
+ $.Widget.prototype._setOption.apply(self, arguments);
+ if (resize) {
+ self._size();
+ }
+ },
+
+ _size: function() {
+ /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+ * divs will both have width and height set, so we need to reset them
+ */
+ var options = this.options,
+ nonContentHeight;
+
+ // reset content sizing
+ // hide for non content measurement because height: 0 doesn't work in IE quirks mode (see #4350)
+ this.element.css({
+ width: 'auto',
+ minHeight: 0,
+ height: 0
+ });
+
+ // reset wrapper sizing
+ // determine the height of all the non-content elements
+ nonContentHeight = this.uiDialog.css({
+ height: 'auto',
+ width: options.width
+ })
+ .height();
+
+ this.element
+ .css(options.height === 'auto' ? {
+ minHeight: Math.max(options.minHeight - nonContentHeight, 0),
+ height: 'auto'
+ } : {
+ minHeight: 0,
+ height: Math.max(options.height - nonContentHeight, 0)
+ })
+ .show();
+
+ if (this.uiDialog.is(':data(resizable)')) {
+ this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+ }
+ }
+});
+
+$.extend($.ui.dialog, {
+ version: "1.8.2",
+
+ uuid: 0,
+ maxZ: 0,
+
+ getTitleId: function($el) {
+ var id = $el.attr('id');
+ if (!id) {
+ this.uuid += 1;
+ id = this.uuid;
+ }
+ return 'ui-dialog-title-' + id;
+ },
+
+ overlay: function(dialog) {
+ this.$el = $.ui.dialog.overlay.create(dialog);
+ }
+});
+
+$.extend($.ui.dialog.overlay, {
+ instances: [],
+ // reuse old instances due to IE memory leak with alpha transparency (see #5185)
+ oldInstances: [],
+ maxZ: 0,
+ events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+ function(event) { return event + '.dialog-overlay'; }).join(' '),
+ create: function(dialog) {
+ if (this.instances.length === 0) {
+ // prevent use of anchors and inputs
+ // we use a setTimeout in case the overlay is created from an
+ // event that we're going to be cancelling (see #2804)
+ setTimeout(function() {
+ // handle $(el).dialog().dialog('close') (see #4065)
+ if ($.ui.dialog.overlay.instances.length) {
+ $(document).bind($.ui.dialog.overlay.events, function(event) {
+ // stop events if the z-index of the target is < the z-index of the overlay
+ return ($(event.target).zIndex() >= $.ui.dialog.overlay.maxZ);
+ });
+ }
+ }, 1);
+
+ // allow closing by pressing the escape key
+ $(document).bind('keydown.dialog-overlay', function(event) {
+ if (dialog.options.closeOnEscape && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ dialog.close(event);
+ event.preventDefault();
+ }
+ });
+
+ // handle window resize
+ $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+ }
+
+ var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+ .appendTo(document.body)
+ .css({
+ width: this.width(),
+ height: this.height()
+ });
+
+ if ($.fn.bgiframe) {
+ $el.bgiframe();
+ }
+
+ this.instances.push($el);
+ return $el;
+ },
+
+ destroy: function($el) {
+ this.oldInstances.push(this.instances.splice($.inArray($el, this.instances), 1)[0]);
+
+ if (this.instances.length === 0) {
+ $([document, window]).unbind('.dialog-overlay');
+ }
+
+ $el.remove();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ var maxZ = 0;
+ $.each(this.instances, function() {
+ maxZ = Math.max(maxZ, this.css('z-index'));
+ });
+ this.maxZ = maxZ;
+ },
+
+ height: function() {
+ var scrollHeight,
+ offsetHeight;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollHeight = Math.max(
+ document.documentElement.scrollHeight,
+ document.body.scrollHeight
+ );
+ offsetHeight = Math.max(
+ document.documentElement.offsetHeight,
+ document.body.offsetHeight
+ );
+
+ if (scrollHeight < offsetHeight) {
+ return $(window).height() + 'px';
+ } else {
+ return scrollHeight + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).height() + 'px';
+ }
+ },
+
+ width: function() {
+ var scrollWidth,
+ offsetWidth;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollWidth = Math.max(
+ document.documentElement.scrollWidth,
+ document.body.scrollWidth
+ );
+ offsetWidth = Math.max(
+ document.documentElement.offsetWidth,
+ document.body.offsetWidth
+ );
+
+ if (scrollWidth < offsetWidth) {
+ return $(window).width() + 'px';
+ } else {
+ return scrollWidth + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).width() + 'px';
+ }
+ },
+
+ resize: function() {
+ /* If the dialog is draggable and the user drags it past the
+ * right edge of the window, the document becomes wider so we
+ * need to stretch the overlay. If the user then drags the
+ * dialog back to the left, the document will become narrower,
+ * so we need to shrink the overlay to the appropriate size.
+ * This is handled by shrinking the overlay before setting it
+ * to the full document size.
+ */
+ var $overlays = $([]);
+ $.each($.ui.dialog.overlay.instances, function() {
+ $overlays = $overlays.add(this);
+ });
+
+ $overlays.css({
+ width: 0,
+ height: 0
+ }).css({
+ width: $.ui.dialog.overlay.width(),
+ height: $.ui.dialog.overlay.height()
+ });
+ }
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+ destroy: function() {
+ $.ui.dialog.overlay.destroy(this.$el);
+ }
+});
+
+}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.draggable.js b/resources/jquery.ui/jquery.ui.draggable.js
new file mode 100644
index 00000000..b4c1070d
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.draggable.js
@@ -0,0 +1,797 @@
+/*
+ * jQuery UI Draggable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+ widgetEventPrefix: "drag",
+ options: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false
+ },
+ _create: function() {
+
+ if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+ this.element[0].style.position = 'relative';
+
+ (this.options.addClasses && this.element.addClass("ui-draggable"));
+ (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ if(!this.element.data('draggable')) return;
+ this.element
+ .removeData("draggable")
+ .unbind(".draggable")
+ .removeClass("ui-draggable"
+ + " ui-draggable-dragging"
+ + " ui-draggable-disabled");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+
+ var o = this.options;
+
+ // among others, prevent a drag on a resizable-handle
+ if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+ return false;
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle)
+ return false;
+
+ return true;
+
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css("position");
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.positionAbs = this.element.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this.position = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ //Trigger event + callbacks
+ if(this._trigger("start", event) === false) {
+ this._clear();
+ return false;
+ }
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.helper.addClass("ui-draggable-dragging");
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ if(this._trigger('drag', event, ui) === false) {
+ this._mouseUp({});
+ return false;
+ }
+ this.position = ui.position;
+ }
+
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ dropped = $.ui.ddmanager.drop(this, event);
+
+ //if a drop comes from outside (a sortable)
+ if(this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ //if the original element is removed, don't bother to continue
+ if(!this.element[0] || !this.element[0].parentNode)
+ 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))) {
+ var self = this;
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+ if(self._trigger("stop", event) !== false) {
+ self._clear();
+ }
+ });
+ } else {
+ if(this._trigger("stop", event) !== false) {
+ this._clear();
+ }
+ }
+
+ return false;
+ },
+
+ cancel: function() {
+
+ if(this.helper.is(".ui-draggable-dragging")) {
+ this._mouseUp({});
+ } else {
+ this._clear();
+ }
+
+ return this;
+
+ },
+
+ _getHandle: function(event) {
+
+ var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+ $(this.options.handle, this.element)
+ .find("*")
+ .andSelf()
+ .each(function() {
+ if(this == event.target) handle = true;
+ });
+
+ return handle;
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
+
+ if(!helper.parents('body').length)
+ helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+ if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+ helper.css("position", "absolute");
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.element.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"),10) || 0),
+ top: (parseInt(this.element.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+ var ce = $(o.containment)[0]; if(!ce) return;
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ } else if(o.containment.constructor == Array) {
+ this.containment = o.containment;
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+ //if($.ui.ddmanager) $.ui.ddmanager.current = null;
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function(type, event, ui) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call(this, type, [event, ui]);
+ if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+ return $.Widget.prototype._trigger.call(this, type, event, ui);
+ },
+
+ plugins: {},
+
+ _uiHash: function(event) {
+ return {
+ helper: this.helper,
+ position: this.position,
+ originalPosition: this.originalPosition,
+ offset: this.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.draggable, {
+ version: "1.8.2"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+ start: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options,
+ uiSortable = $.extend({}, ui, { item: inst.element });
+ inst.sortables = [];
+ $(o.connectToSortable).each(function() {
+ var sortable = $.data(this, 'sortable');
+ if (sortable && !sortable.options.disabled) {
+ inst.sortables.push({
+ instance: sortable,
+ shouldRevert: sortable.options.revert
+ });
+ sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+
+ },
+ stop: function(event, ui) {
+
+ //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+ var inst = $(this).data("draggable"),
+ uiSortable = $.extend({}, ui, { item: inst.element });
+
+ $.each(inst.sortables, function() {
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+
+ inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+ this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+ //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+ if(this.shouldRevert) this.instance.options.revert = true;
+
+ //Trigger the stop of the sortable
+ this.instance._mouseStop(event);
+
+ this.instance.options.helper = this.instance.options._helper;
+
+ //If the helper has been the original item, restore properties in the sortable
+ if(inst.options.helper == 'original')
+ this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+ } else {
+ this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+ this.instance._trigger("deactivate", event, uiSortable);
+ }
+
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), self = this;
+
+ var checkPos = function(o) {
+ var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+ var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+ var itemHeight = o.height, itemWidth = o.width;
+ var itemTop = o.top, itemLeft = o.left;
+
+ return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+ };
+
+ $.each(inst.sortables, function(i) {
+
+ //Copy over some variables to allow calling the sortable's native _intersectsWith
+ this.instance.positionAbs = inst.positionAbs;
+ this.instance.helperProportions = inst.helperProportions;
+ this.instance.offset.click = inst.offset.click;
+
+ if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+ //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+ if(!this.instance.isOver) {
+
+ this.instance.isOver = 1;
+ //Now we fake the start of dragging for the sortable instance,
+ //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+ //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+ this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
+ this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+ this.instance.options.helper = function() { return ui.helper[0]; };
+
+ event.target = this.instance.currentItem[0];
+ this.instance._mouseCapture(event, true);
+ this.instance._mouseStart(event, true, true);
+
+ //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+ this.instance.offset.click.top = inst.offset.click.top;
+ this.instance.offset.click.left = inst.offset.click.left;
+ this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+ this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+ inst._trigger("toSortable", event);
+ inst.dropped = this.instance.element; //draggable revert needs that
+ //hack so receive/update callbacks work (mostly)
+ inst.currentItem = inst.element;
+ this.instance.fromOutside = inst;
+
+ }
+
+ //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+ if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+ } else {
+
+ //If it doesn't intersect with the sortable, and it intersected before,
+ //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+ this.instance.cancelHelperRemoval = true;
+
+ //Prevent reverting on this forced stop
+ this.instance.options.revert = false;
+
+ // The out event needs to be triggered independently
+ this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+
+ this.instance._mouseStop(event, true);
+ this.instance.options.helper = this.instance.options._helper;
+
+ //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+ this.instance.currentItem.remove();
+ if(this.instance.placeholder) this.instance.placeholder.remove();
+
+ inst._trigger("fromSortable", event);
+ inst.dropped = false; //draggable revert needs that
+ }
+
+ };
+
+ });
+
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function(event, ui) {
+ var t = $('body'), o = $(this).data('draggable').options;
+ if (t.css("cursor")) o._cursor = t.css("cursor");
+ t.css("cursor", o.cursor);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if (o._cursor) $('body').css("cursor", o._cursor);
+ }
+});
+
+$.ui.plugin.add("draggable", "iframeFix", {
+ start: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+ $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+ .css({
+ width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+ position: "absolute", opacity: "0.001", zIndex: 1000
+ })
+ .css($(this).offset())
+ .appendTo("body");
+ });
+ },
+ stop: function(event, ui) {
+ $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data('draggable').options;
+ if(t.css("opacity")) o._opacity = t.css("opacity");
+ t.css('opacity', o.opacity);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function(event, ui) {
+ var i = $(this).data("draggable");
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+ },
+ drag: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+ if(!o.axis || o.axis != 'x') {
+ if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+ }
+
+ } else {
+
+ if(!o.axis || o.axis != 'x') {
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(i, event);
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options;
+ i.snapElements = [];
+
+ $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+ var $t = $(this); var $o = $t.offset();
+ if(this != i.element[0]) i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options;
+ var d = o.snapTolerance;
+
+ var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+ var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+ t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+ //Yes, I know, this is insane ;)
+ if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+ if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if(o.snapMode != 'inner') {
+ var ts = Math.abs(t - y2) <= d;
+ var bs = Math.abs(b - y1) <= d;
+ var ls = Math.abs(l - x2) <= d;
+ var rs = Math.abs(r - x1) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+ }
+
+ var first = (ts || bs || ls || rs);
+
+ if(o.snapMode != 'outer') {
+ var ts = Math.abs(t - y1) <= d;
+ var bs = Math.abs(b - y2) <= d;
+ var ls = Math.abs(l - x1) <= d;
+ var rs = Math.abs(r - x2) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+ }
+
+ if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ };
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function(event, ui) {
+
+ var o = $(this).data("draggable").options;
+
+ var group = $.makeArray($(o.stack)).sort(function(a,b) {
+ return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+ });
+ if (!group.length) { return; }
+
+ var min = parseInt(group[0].style.zIndex) || 0;
+ $(group).each(function(i) {
+ this.style.zIndex = min + i;
+ });
+
+ this[0].style.zIndex = min + group.length;
+
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data("draggable").options;
+ if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+ t.css('zIndex', o.zIndex);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data("draggable").options;
+ if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+ }
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.droppable.js b/resources/jquery.ui/jquery.ui.droppable.js
new file mode 100644
index 00000000..b6a15fdf
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.droppable.js
@@ -0,0 +1,285 @@
+/*
+ * jQuery UI Droppable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ * jquery.ui.draggable.js
+ */
+(function($) {
+
+$.widget("ui.droppable", {
+ widgetEventPrefix: "drop",
+ options: {
+ accept: '*',
+ activeClass: false,
+ addClasses: true,
+ greedy: false,
+ hoverClass: false,
+ scope: 'default',
+ tolerance: 'intersect'
+ },
+ _create: function() {
+
+ var o = this.options, accept = o.accept;
+ this.isover = 0; this.isout = 1;
+
+ this.accept = $.isFunction(accept) ? accept : function(d) {
+ return d.is(accept);
+ };
+
+ //Store the droppable's proportions
+ this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+ // Add the reference and positions to the manager
+ $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+ $.ui.ddmanager.droppables[o.scope].push(this);
+
+ (o.addClasses && this.element.addClass("ui-droppable"));
+
+ },
+
+ destroy: function() {
+ var drop = $.ui.ddmanager.droppables[this.options.scope];
+ for ( var i = 0; i < drop.length; i++ )
+ if ( drop[i] == this )
+ drop.splice(i, 1);
+
+ this.element
+ .removeClass("ui-droppable ui-droppable-disabled")
+ .removeData("droppable")
+ .unbind(".droppable");
+
+ return this;
+ },
+
+ _setOption: function(key, value) {
+
+ if(key == 'accept') {
+ this.accept = $.isFunction(value) ? value : function(d) {
+ return d.is(value);
+ };
+ }
+ $.Widget.prototype._setOption.apply(this, arguments);
+ },
+
+ _activate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+ (draggable && this._trigger('activate', event, this.ui(draggable)));
+ },
+
+ _deactivate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ (draggable && this._trigger('deactivate', event, this.ui(draggable)));
+ },
+
+ _over: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+ this._trigger('over', event, this.ui(draggable));
+ }
+
+ },
+
+ _out: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('out', event, this.ui(draggable));
+ }
+
+ },
+
+ _drop: function(event,custom) {
+
+ var draggable = custom || $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+ var childrenIntersection = false;
+ this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+ var inst = $.data(this, 'droppable');
+ if(
+ inst.options.greedy
+ && !inst.options.disabled
+ && inst.options.scope == draggable.options.scope
+ && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+ && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+ ) { childrenIntersection = true; return false; }
+ });
+ if(childrenIntersection) return false;
+
+ if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('drop', event, this.ui(draggable));
+ return this.element;
+ }
+
+ return false;
+
+ },
+
+ ui: function(c) {
+ return {
+ draggable: (c.currentItem || c.element),
+ helper: c.helper,
+ position: c.position,
+ offset: c.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.droppable, {
+ version: "1.8.2"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+ if (!droppable.offset) return false;
+
+ var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+ y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+ var l = droppable.offset.left, r = l + droppable.proportions.width,
+ t = droppable.offset.top, b = t + droppable.proportions.height;
+
+ switch (toleranceMode) {
+ case 'fit':
+ return (l < x1 && x2 < r
+ && t < y1 && y2 < b);
+ break;
+ case 'intersect':
+ return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+ && x2 - (draggable.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+ && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+ break;
+ case 'pointer':
+ var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+ draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+ isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+ return isOver;
+ break;
+ case 'touch':
+ return (
+ (y1 >= t && y1 <= b) || // Top edge touching
+ (y2 >= t && y2 <= b) || // Bottom edge touching
+ (y1 < t && y2 > b) // Surrounded vertically
+ ) && (
+ (x1 >= l && x1 <= r) || // Left edge touching
+ (x2 >= l && x2 <= r) || // Right edge touching
+ (x1 < l && x2 > r) // Surrounded horizontally
+ );
+ break;
+ default:
+ return false;
+ break;
+ }
+
+};
+
+/*
+ This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+ current: null,
+ droppables: { 'default': [] },
+ prepareOffsets: function(t, event) {
+
+ var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+ var type = event ? event.type : null; // workaround for #2317
+ var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+ droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+ if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
+ for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+ m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
+
+ m[i].offset = m[i].element.offset();
+ m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+ if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+ }
+
+ },
+ drop: function(draggable, event) {
+
+ var dropped = false;
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(!this.options) return;
+ if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+ dropped = dropped || this._drop.call(this, event);
+
+ if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ this.isout = 1; this.isover = 0;
+ this._deactivate.call(this, event);
+ }
+
+ });
+ return dropped;
+
+ },
+ drag: function(draggable, event) {
+
+ //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+ if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+ //Run through all droppables and check their positions based on specific tolerance options
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(this.options.disabled || this.greedyChild || !this.visible) return;
+ var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+ var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+ if(!c) return;
+
+ var parentInstance;
+ if (this.options.greedy) {
+ var parent = this.element.parents(':data(droppable):eq(0)');
+ if (parent.length) {
+ parentInstance = $.data(parent[0], 'droppable');
+ parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+ }
+ }
+
+ // we just moved into a greedy child
+ if (parentInstance && c == 'isover') {
+ parentInstance['isover'] = 0;
+ parentInstance['isout'] = 1;
+ parentInstance._out.call(parentInstance, event);
+ }
+
+ this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+ this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+ // we just moved out of a greedy child
+ if (parentInstance && c == 'isout') {
+ parentInstance['isout'] = 0;
+ parentInstance['isover'] = 1;
+ parentInstance._over.call(parentInstance, event);
+ }
+ });
+
+ }
+};
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.mouse.js b/resources/jquery.ui/jquery.ui.mouse.js
new file mode 100644
index 00000000..871edd83
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.mouse.js
@@ -0,0 +1,151 @@
+/*!
+ * jQuery UI Mouse 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.mouse", {
+ options: {
+ cancel: ':input,option',
+ distance: 1,
+ delay: 0
+ },
+ _mouseInit: function() {
+ var self = this;
+
+ this.element
+ .bind('mousedown.'+this.widgetName, function(event) {
+ return self._mouseDown(event);
+ })
+ .bind('click.'+this.widgetName, function(event) {
+ if(self._preventClickEvent) {
+ self._preventClickEvent = false;
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind('.'+this.widgetName);
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ // TODO: figure out why we have to use originalEvent
+ event.originalEvent = event.originalEvent || {};
+ if (event.originalEvent.mouseHandled) { return; }
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var self = this,
+ btnIsLeft = (event.which == 1),
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ self.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return self._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return self._mouseUp(event);
+ };
+ $(document)
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ // preventDefault() is used to prevent the selection of text here -
+ // however, in Safari, this causes select boxes not to be selectable
+ // anymore, so this fix is needed
+ ($.browser.safari || event.preventDefault());
+
+ event.originalEvent.mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.browser.msie && !event.button) {
+ return this._mouseUp(event);
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ $(document)
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+ this._preventClickEvent = (event.target == this._mouseDownEvent.target);
+ this._mouseStop(event);
+ }
+
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(event) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(event) {},
+ _mouseDrag: function(event) {},
+ _mouseStop: function(event) {},
+ _mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.position.js b/resources/jquery.ui/jquery.ui.position.js
new file mode 100644
index 00000000..50dd57f0
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.position.js
@@ -0,0 +1,233 @@
+/*
+ * jQuery UI Position 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $ ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+ horizontalDefault = "center",
+ verticalPositions = /top|center|bottom/,
+ verticalDefault = "center",
+ _position = $.fn.position,
+ _offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var target = $( options.of ),
+ collision = ( options.collision || "flip" ).split( " " ),
+ offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+ targetWidth,
+ targetHeight,
+ basePosition;
+
+ if ( options.of.nodeType === 9 ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: 0, left: 0 };
+ } else if ( options.of.scrollTo && options.of.document ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+ } else if ( options.of.preventDefault ) {
+ // force left top to allow flipping
+ options.at = "left top";
+ targetWidth = targetHeight = 0;
+ basePosition = { top: options.of.pageY, left: options.of.pageX };
+ } else {
+ targetWidth = target.outerWidth();
+ targetHeight = target.outerHeight();
+ basePosition = target.offset();
+ }
+
+ // force my and at to have valid horizontal and veritcal positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[this] || "" ).split( " " );
+ if ( pos.length === 1) {
+ pos = horizontalPositions.test( pos[0] ) ?
+ pos.concat( [verticalDefault] ) :
+ verticalPositions.test( pos[0] ) ?
+ [ horizontalDefault ].concat( pos ) :
+ [ horizontalDefault, verticalDefault ];
+ }
+ pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : horizontalDefault;
+ pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : verticalDefault;
+ options[ this ] = pos;
+ });
+
+ // normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ // normalize offset option
+ offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+ if ( offset.length === 1 ) {
+ offset[ 1 ] = offset[ 0 ];
+ }
+ offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+ if ( options.at[0] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if (options.at[0] === horizontalDefault ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[1] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[1] === verticalDefault ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ basePosition.left += offset[ 0 ];
+ basePosition.top += offset[ 1 ];
+
+ return this.each(function() {
+ var elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ position = $.extend( {}, basePosition );
+
+ if ( options.my[0] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[0] === horizontalDefault ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[1] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[1] === verticalDefault ) {
+ position.top -= elemHeight / 2;
+ }
+
+ // prevent fractions (see #5280)
+ position.left = parseInt( position.left );
+ position.top = parseInt( position.top );
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[i] ] ) {
+ $.ui.position[ collision[i] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ offset: offset,
+ my: options.my,
+ at: options.at
+ });
+ }
+ });
+
+ if ( $.fn.bgiframe ) {
+ elem.bgiframe();
+ }
+ elem.offset( $.extend( position, { using: options.using } ) );
+ });
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var win = $( window ),
+ over = position.left + data.elemWidth - win.width() - win.scrollLeft();
+ position.left = over > 0 ? position.left - over : Math.max( 0, position.left );
+ },
+ top: function( position, data ) {
+ var win = $( window ),
+ over = position.top + data.elemHeight - win.height() - win.scrollTop();
+ position.top = over > 0 ? position.top - over : Math.max( 0, position.top );
+ }
+ },
+
+ flip: {
+ left: function( position, data ) {
+ if ( data.at[0] === "center" ) {
+ return;
+ }
+ var win = $( window ),
+ over = position.left + data.elemWidth - win.width() - win.scrollLeft(),
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ offset = -2 * data.offset[ 0 ];
+ position.left += position.left < 0 ?
+ myOffset + data.targetWidth + offset :
+ over > 0 ?
+ myOffset - data.targetWidth + offset :
+ 0;
+ },
+ top: function( position, data ) {
+ if ( data.at[1] === "center" ) {
+ return;
+ }
+ var win = $( window ),
+ over = position.top + data.elemHeight - win.height() - win.scrollTop(),
+ myOffset = data.my[ 1 ] === "top" ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ -data.targetHeight,
+ offset = -2 * data.offset[ 1 ];
+ position.top += position.top < 0 ?
+ myOffset + data.targetHeight + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ }
+ }
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+ $.offset.setOffset = function( elem, options ) {
+ // set position first, in-case top/left are set even on static elem
+ if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+ elem.style.position = "relative";
+ }
+ var curElem = $( elem ),
+ curOffset = curElem.offset(),
+ curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
+ curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
+ props = {
+ top: (options.top - curOffset.top) + curTop,
+ left: (options.left - curOffset.left) + curLeft
+ };
+
+ if ( 'using' in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ };
+
+ $.fn.offset = function( options ) {
+ var elem = this[ 0 ];
+ if ( !elem || !elem.ownerDocument ) { return null; }
+ if ( options ) {
+ return this.each(function() {
+ $.offset.setOffset( this, options );
+ });
+ }
+ return _offset.call( this );
+ };
+}
+
+}( jQuery ));
diff --git a/resources/jquery.ui/jquery.ui.progressbar.js b/resources/jquery.ui/jquery.ui.progressbar.js
new file mode 100644
index 00000000..4bc092d1
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.progressbar.js
@@ -0,0 +1,107 @@
+/*
+ * jQuery UI Progressbar 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $ ) {
+
+$.widget( "ui.progressbar", {
+ options: {
+ value: 0
+ },
+ _create: function() {
+ this.element
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .attr({
+ role: "progressbar",
+ "aria-valuemin": this._valueMin(),
+ "aria-valuemax": this._valueMax(),
+ "aria-valuenow": this._value()
+ });
+
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this._refreshValue();
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+
+ $.Widget.prototype.destroy.apply( this, arguments );
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this._value();
+ }
+
+ this._setOption( "value", newValue );
+ return this;
+ },
+
+ _setOption: function( key, value ) {
+ switch ( key ) {
+ case "value":
+ this.options.value = value;
+ this._refreshValue();
+ this._trigger( "change" );
+ break;
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ _value: function() {
+ var val = this.options.value;
+ // normalize invalid value
+ if ( typeof val !== "number" ) {
+ val = 0;
+ }
+ if ( val < this._valueMin() ) {
+ val = this._valueMin();
+ }
+ if ( val > this._valueMax() ) {
+ val = this._valueMax();
+ }
+
+ return val;
+ },
+
+ _valueMin: function() {
+ return 0;
+ },
+
+ _valueMax: function() {
+ return 100;
+ },
+
+ _refreshValue: function() {
+ var value = this.value();
+ this.valueDiv
+ [ value === this._valueMax() ? "addClass" : "removeClass"]( "ui-corner-right" )
+ .width( value + "%" );
+ this.element.attr( "aria-valuenow", value );
+ }
+});
+
+$.extend( $.ui.progressbar, {
+ version: "1.8.2"
+});
+
+})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.resizable.js b/resources/jquery.ui/jquery.ui.resizable.js
new file mode 100644
index 00000000..0a782bb5
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.resizable.js
@@ -0,0 +1,799 @@
+/*
+ * jQuery UI Resizable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+ widgetEventPrefix: "resize",
+ options: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ containment: false,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var self = this, o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+ });
+
+ //Wrap the element if it cannot hold child nodes
+ if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+ //Opera fix for relative positioning
+ if (/relative/.test(this.element.css('position')) && $.browser.opera)
+ this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ //Create a wrapper element and set the wrapper to the new current internal element
+ this.element.wrap(
+ $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+ position: this.element.css('position'),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css('top'),
+ left: this.element.css('left')
+ })
+ );
+
+ //Overwrite the original this.element
+ this.element = this.element.parent().data(
+ "resizable", this.element.data('resizable')
+ );
+
+ this.elementIsWrapper = true;
+
+ //Move margins to the wrapper
+ this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+ this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+ //Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css('resize');
+ this.originalElement.css('resize', 'none');
+
+ //Push the actual element to our proportionallyResize internal array
+ this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+ // fix handlers offset
+ this._proportionallyResize();
+
+ }
+
+ this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+ if(this.handles.constructor == String) {
+
+ if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+ var n = this.handles.split(","); this.handles = {};
+
+ for(var i = 0; i < n.length; i++) {
+
+ 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 });
+
+ //TODO : What's going on here?
+ if ('se' == handle) {
+ axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+ };
+
+ //Insert into internal handles object and append to element
+ this.handles[handle] = '.ui-resizable-'+handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ target = target || this.element;
+
+ for(var i in this.handles) {
+
+ if(this.handles[i].constructor == String)
+ this.handles[i] = $(this.handles[i], this.element).show();
+
+ //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+ if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+ var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+ //Checking the correct pad and border
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ //The padding type i have to apply...
+ var padPos = [ 'padding',
+ /ne|nw|n/.test(i) ? 'Top' :
+ /se|sw|s/.test(i) ? 'Bottom' :
+ /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+
+ }
+
+ //TODO: What's that good for? There's not anything to be executed left
+ if(!$(this.handles[i]).length)
+ continue;
+
+ }
+ };
+
+ //TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = $('.ui-resizable-handle', this.element)
+ .disableSelection();
+
+ //Matching axis name
+ this._handles.mouseover(function() {
+ if (!self.resizing) {
+ if (this.className)
+ var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ //Axis, default = se
+ self.axis = axis && axis[1] ? axis[1] : 'se';
+ }
+ });
+
+ //If we want to auto hide the elements
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .hover(function() {
+ $(this).removeClass("ui-resizable-autohide");
+ self._handles.show();
+ },
+ function(){
+ if (!self.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ self._handles.hide();
+ }
+ });
+ }
+
+ //Initialize the mouse interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+
+ this._mouseDestroy();
+
+ var _destroy = function(exp) {
+ $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+ };
+
+ //TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ var wrapper = this.element;
+ wrapper.after(
+ this.originalElement.css({
+ position: wrapper.css('position'),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css('top'),
+ left: wrapper.css('left')
+ })
+ ).remove();
+ }
+
+ this.originalElement.css('resize', this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+ var handle = false;
+ for (var i in this.handles) {
+ if ($(this.handles[i])[0] == event.target) {
+ handle = true;
+ }
+ }
+
+ return !this.options.disabled && handle;
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options, iniPos = this.element.position(), el = this.element;
+
+ this.resizing = true;
+ this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+ // bugfix for http://dev.jquery.com/ticket/1749
+ if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+ el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+ }
+
+ //Opera fixing relative position
+ if ($.browser.opera && (/relative/).test(el.css('position')))
+ el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ this._renderProxy();
+
+ var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ //Store needed variables
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+ this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalPosition = { left: curleft, top: curtop };
+ this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ //Aspect Ratio
+ this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+ var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+ $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ //Increase performance, avoid regex
+ var el = this.helper, o = this.options, props = {},
+ self = this, smp = this.originalMousePosition, a = this.axis;
+
+ var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+ var trigger = this._change[a];
+ if (!trigger) return false;
+
+ // Calculate the attrs that will be change
+ var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+ if (this._aspectRatio || event.shiftKey)
+ data = this._updateRatio(data, event);
+
+ data = this._respectSize(data, event);
+
+ // plugins callbacks need to be called first
+ this._propagate("resize", event);
+
+ el.css({
+ top: this.position.top + "px", left: this.position.left + "px",
+ width: this.size.width + "px", height: this.size.height + "px"
+ });
+
+ if (!this._helper && this._proportionallyResizeElements.length)
+ this._proportionallyResize();
+
+ this._updateCache(data);
+
+ // calling the user callback at the end
+ this._trigger('resize', event, this.ui());
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var o = this.options, self = this;
+
+ if(this._helper) {
+ var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ if (!o.animate)
+ this.element.css($.extend(s, { top: top, left: left }));
+
+ self.helper.height(self.size.height);
+ self.helper.width(self.size.width);
+
+ if (this._helper && !o.animate) this._proportionallyResize();
+ }
+
+ $('body').css('cursor', 'auto');
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) this.helper.remove();
+ return false;
+
+ },
+
+ _updateCache: function(data) {
+ var o = this.options;
+ this.offset = this.helper.offset();
+ if (isNumber(data.left)) this.position.left = data.left;
+ if (isNumber(data.top)) this.position.top = data.top;
+ if (isNumber(data.height)) this.size.height = data.height;
+ if (isNumber(data.width)) this.size.width = data.width;
+ },
+
+ _updateRatio: function(data, event) {
+
+ var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+ if (data.height) data.width = (csize.height * this.aspectRatio);
+ else if (data.width) data.height = (csize.width / this.aspectRatio);
+
+ if (a == 'sw') {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a == 'nw') {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function(data, event) {
+
+ var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+ ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+ isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+ if (isminw) data.width = o.minWidth;
+ if (isminh) data.height = o.minHeight;
+ if (ismaxw) data.width = o.maxWidth;
+ if (ismaxh) data.height = o.maxHeight;
+
+ var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+ var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+ if (isminw && cw) data.left = dw - o.minWidth;
+ if (ismaxw && cw) data.left = dw - o.maxWidth;
+ if (isminh && ch) data.top = dh - o.minHeight;
+ if (ismaxh && ch) data.top = dh - o.maxHeight;
+
+ // fixing jump error on top/left - bug #2330
+ var isNotwh = !data.width && !data.height;
+ if (isNotwh && !data.left && data.top) data.top = null;
+ else if (isNotwh && !data.top && data.left) data.left = null;
+
+ return data;
+ },
+
+ _proportionallyResize: function() {
+
+ var o = this.options;
+ if (!this._proportionallyResizeElements.length) return;
+ var element = this.helper || this.element;
+
+ for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+ var prel = this._proportionallyResizeElements[i];
+
+ if (!this.borderDif) {
+ var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+ p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+ this.borderDif = $.map(b, function(v, i) {
+ var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+ return border + padding;
+ });
+ }
+
+ if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+ continue;
+
+ prel.css({
+ height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+ width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+ });
+
+ };
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if(this._helper) {
+
+ this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+ // fix ie6 offset TODO: This seems broken
+ var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+ pxyoffset = ( ie6 ? 2 : -1 );
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() + pxyoffset,
+ height: this.element.outerHeight() + pxyoffset,
+ position: 'absolute',
+ left: this.elementOffset.left - ie6offset +'px',
+ top: this.elementOffset.top - ie6offset +'px',
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx, dy) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [event, this.ui()]);
+ (n != "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+});
+
+$.extend($.ui.resizable, {
+ version: "1.8.2"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _store = function(exp) {
+ $(exp).each(function() {
+ $(this).data("resizable-alsoresize", {
+ width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),
+ left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)
+ });
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+ if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+ else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }
+ }else{
+ _store(o.alsoResize);
+ }
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+ var delta = {
+ height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+ top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+ },
+
+ _alsoResize = function(exp, c) {
+ $(exp).each(function() {
+ var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];
+
+ $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {
+ var sum = (start[prop]||0) + (delta[prop]||0);
+ if (sum && sum >= 0)
+ style[prop] = sum || null;
+ });
+
+ //Opera fixing relative position
+ if (/relative/.test(el.css('position')) && $.browser.opera) {
+ self._revertToRelativePosition = true;
+ el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+ }
+
+ el.css(style);
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });
+ }else{
+ _alsoResize(o.alsoResize);
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable");
+
+ //Opera fixing relative position
+ if (self._revertToRelativePosition && $.browser.opera) {
+ self._revertToRelativePosition = false;
+ el.css({ position: 'relative' });
+ }
+
+ $(this).removeData("resizable-alsoresize-start");
+ }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ self.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(self.element.css('width'), 10),
+ height: parseInt(self.element.css('height'), 10),
+ top: parseInt(self.element.css('top'), 10),
+ left: parseInt(self.element.css('left'), 10)
+ };
+
+ if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+ // propagating resize, and updating values for each animation step
+ self._updateCache(data);
+ self._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+ start: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, el = self.element;
+ var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+ if (!ce) return;
+
+ self.containerElement = $(ce);
+
+ if (/document/.test(oc) || oc == document) {
+ self.containerOffset = { left: 0, top: 0 };
+ self.containerPosition = { left: 0, top: 0 };
+
+ self.parentData = {
+ element: $(document), left: 0, top: 0,
+ width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+ };
+ }
+
+ // i'm a node, so compute top, left, right, bottom
+ else {
+ var element = $(ce), p = [];
+ $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+ self.containerOffset = element.offset();
+ self.containerPosition = element.position();
+ self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+ var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width,
+ width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+ self.parentData = {
+ element: ce, left: co.left, top: co.top, width: width, height: height
+ };
+ }
+ },
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options,
+ ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+ pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+ if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+ 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;
+ 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;
+ self.position.top = self._helper ? co.top : 0;
+ }
+
+ self.offset.left = self.parentData.left+self.position.left;
+ self.offset.top = self.parentData.top+self.position.top;
+
+ var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+ hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+ var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+ isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+ if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+ if (woset + self.size.width >= self.parentData.width) {
+ self.size.width = self.parentData.width - woset;
+ if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+ }
+
+ if (hoset + self.size.height >= self.parentData.height) {
+ self.size.height = self.parentData.height - hoset;
+ if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, cp = self.position,
+ co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+ var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+ if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+ self.ghost = self.originalElement.clone();
+ self.ghost
+ .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+ .addClass('ui-resizable-ghost')
+ .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+ self.ghost.appendTo(self.helper);
+
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+ o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+ var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+ if (/^(se|s|e)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ }
+ else if (/^(ne)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ }
+ else if (/^(sw)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.left = op.left - ox;
+ }
+ else {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ self.position.left = op.left - ox;
+ }
+ }
+
+});
+
+var num = function(v) {
+ return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+ return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.selectable.js b/resources/jquery.ui/jquery.ui.selectable.js
new file mode 100644
index 00000000..bc707d36
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.selectable.js
@@ -0,0 +1,269 @@
+
+/*
+ * jQuery UI Selectable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+ options: {
+ appendTo: 'body',
+ autoRefresh: true,
+ distance: 0,
+ filter: '*',
+ tolerance: 'touch'
+ },
+ _create: function() {
+ var self = this;
+
+ this.element.addClass("ui-selectable");
+
+ this.dragged = false;
+
+ // cache selectee children based on filter
+ var selectees;
+ this.refresh = function() {
+ selectees = $(self.options.filter, self.element[0]);
+ selectees.each(function() {
+ var $this = $(this);
+ var pos = $this.offset();
+ $.data(this, "selectable-item", {
+ element: this,
+ $element: $this,
+ left: pos.left,
+ top: pos.top,
+ right: pos.left + $this.outerWidth(),
+ bottom: pos.top + $this.outerHeight(),
+ startselected: false,
+ selected: $this.hasClass('ui-selected'),
+ selecting: $this.hasClass('ui-selecting'),
+ unselecting: $this.hasClass('ui-unselecting')
+ });
+ });
+ };
+ this.refresh();
+
+ this.selectees = selectees.addClass("ui-selectee");
+
+ this._mouseInit();
+
+ this.helper = $("<div class='ui-selectable-helper'></div>");
+ },
+
+ destroy: function() {
+ this.selectees
+ .removeClass("ui-selectee")
+ .removeData("selectable-item");
+ this.element
+ .removeClass("ui-selectable ui-selectable-disabled")
+ .removeData("selectable")
+ .unbind(".selectable");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseStart: function(event) {
+ var self = this;
+
+ this.opos = [event.pageX, event.pageY];
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ this.selectees = $(options.filter, this.element[0]);
+
+ this._trigger("start", event);
+
+ $(options.appendTo).append(this.helper);
+ // position helper (lasso)
+ this.helper.css({
+ "z-index": 100,
+ "position": "absolute",
+ "left": event.clientX,
+ "top": event.clientY,
+ "width": 0,
+ "height": 0
+ });
+
+ if (options.autoRefresh) {
+ this.refresh();
+ }
+
+ this.selectees.filter('.ui-selected').each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.startselected = true;
+ if (!event.metaKey) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ });
+
+ $(event.target).parents().andSelf().each(function() {
+ var selectee = $.data(this, "selectable-item");
+ if (selectee) {
+ var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+ selectee.$element
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+ selectee.unselecting = !doSelect;
+ selectee.selecting = doSelect;
+ selectee.selected = doSelect;
+ // selectable (UN)SELECTING callback
+ if (doSelect) {
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ } else {
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ return false;
+ }
+ });
+
+ },
+
+ _mouseDrag: function(event) {
+ var self = this;
+ this.dragged = true;
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+ if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+ if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+ this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+ this.selectees.each(function() {
+ var selectee = $.data(this, "selectable-item");
+ //prevent helper from being selected if appendTo: selectable
+ if (!selectee || selectee.element == self.element[0])
+ return;
+ var hit = false;
+ if (options.tolerance == 'touch') {
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+ } else if (options.tolerance == 'fit') {
+ hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+ }
+
+ if (hit) {
+ // SELECT
+ if (selectee.selected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ }
+ if (selectee.unselecting) {
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ }
+ if (!selectee.selecting) {
+ selectee.$element.addClass('ui-selecting');
+ selectee.selecting = true;
+ // selectable SELECTING callback
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ }
+ } else {
+ // UNSELECT
+ if (selectee.selecting) {
+ if (event.metaKey && selectee.startselected) {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ selectee.$element.addClass('ui-selected');
+ selectee.selected = true;
+ } else {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ if (selectee.startselected) {
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ }
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ if (selectee.selected) {
+ if (!event.metaKey && !selectee.startselected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ }
+ });
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+ var self = this;
+
+ this.dragged = false;
+
+ var options = this.options;
+
+ $('.ui-unselecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ selectee.startselected = false;
+ self._trigger("unselected", event, {
+ unselected: selectee.element
+ });
+ });
+ $('.ui-selecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+ selectee.selecting = false;
+ selectee.selected = true;
+ selectee.startselected = true;
+ self._trigger("selected", event, {
+ selected: selectee.element
+ });
+ });
+ this._trigger("stop", event);
+
+ this.helper.remove();
+
+ return false;
+ }
+
+});
+
+$.extend($.ui.selectable, {
+ version: "1.8.2"
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.slider.js b/resources/jquery.ui/jquery.ui.slider.js
new file mode 100644
index 00000000..81d854b5
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.slider.js
@@ -0,0 +1,682 @@
+/*
+ * jQuery UI Slider 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+
+(function( $ ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+ widgetEventPrefix: "slide",
+
+ options: {
+ animate: false,
+ distance: 0,
+ max: 100,
+ min: 0,
+ orientation: "horizontal",
+ range: false,
+ step: 1,
+ value: 0,
+ values: null
+ },
+
+ _create: function() {
+ var self = this,
+ o = this.options;
+
+ this._keySliding = false;
+ this._mouseSliding = false;
+ this._animateOff = true;
+ this._handleIndex = null;
+ this._detectOrientation();
+ this._mouseInit();
+
+ this.element
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" );
+
+ if ( o.disabled ) {
+ this.element.addClass( "ui-slider-disabled ui-disabled" );
+ }
+
+ this.range = $([]);
+
+ if ( o.range ) {
+ if ( o.range === true ) {
+ this.range = $( "<div></div>" );
+ if ( !o.values ) {
+ o.values = [ this._valueMin(), this._valueMin() ];
+ }
+ if ( o.values.length && o.values.length !== 2 ) {
+ o.values = [ o.values[0], o.values[0] ];
+ }
+ } else {
+ this.range = $( "<div></div>" );
+ }
+
+ this.range
+ .appendTo( this.element )
+ .addClass( "ui-slider-range" );
+
+ if ( o.range === "min" || o.range === "max" ) {
+ this.range.addClass( "ui-slider-range-" + o.range );
+ }
+
+ // note: this isn't the most fittingly semantic framework class for this element,
+ // but worked best visually with a variety of themes
+ this.range.addClass( "ui-widget-header" );
+ }
+
+ if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
+
+ if ( o.values && o.values.length ) {
+ while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
+ }
+
+ this.handles = $( ".ui-slider-handle", this.element )
+ .addClass( "ui-state-default" +
+ " ui-corner-all" );
+
+ this.handle = this.handles.eq( 0 );
+
+ this.handles.add( this.range ).filter( "a" )
+ .click(function( event ) {
+ event.preventDefault();
+ })
+ .hover(function() {
+ if ( !o.disabled ) {
+ $( this ).addClass( "ui-state-hover" );
+ }
+ }, function() {
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .focus(function() {
+ if ( !o.disabled ) {
+ $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+ $( this ).addClass( "ui-state-focus" );
+ } else {
+ $( this ).blur();
+ }
+ })
+ .blur(function() {
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ this.handles.each(function( i ) {
+ $( this ).data( "index.ui-slider-handle", i );
+ });
+
+ this.handles
+ .keydown(function( event ) {
+ var ret = true,
+ index = $( this ).data( "index.ui-slider-handle" ),
+ allowed,
+ curVal,
+ newVal,
+ step;
+
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ ret = false;
+ if ( !self._keySliding ) {
+ self._keySliding = true;
+ $( this ).addClass( "ui-state-active" );
+ allowed = self._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = self.options.step;
+ if ( self.options.values && self.options.values.length ) {
+ curVal = newVal = self.values( index );
+ } else {
+ curVal = newVal = self.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = self._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = self._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === self._valueMax() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal + step );
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === self._valueMin() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal - step );
+ break;
+ }
+
+ self._slide( event, index, newVal );
+
+ return ret;
+
+ })
+ .keyup(function( event ) {
+ var index = $( this ).data( "index.ui-slider-handle" );
+
+ if ( self._keySliding ) {
+ self._keySliding = false;
+ self._stop( event, index );
+ self._change( event, index );
+ $( this ).removeClass( "ui-state-active" );
+ }
+
+ });
+
+ this._refreshValue();
+
+ this._animateOff = false;
+ },
+
+ destroy: function() {
+ this.handles.remove();
+ this.range.remove();
+
+ this.element
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-slider-disabled" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" )
+ .removeData( "slider" )
+ .unbind( ".slider" );
+
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function( event ) {
+ var o = this.options,
+ position,
+ normValue,
+ distance,
+ closestHandle,
+ self,
+ index,
+ allowed,
+ offset,
+ mouseOverHandle;
+
+ if ( o.disabled ) {
+ return false;
+ }
+
+ this.elementSize = {
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight()
+ };
+ this.elementOffset = this.element.offset();
+
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ self = this;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - self.values(i) );
+ if ( distance > thisDistance ) {
+ distance = thisDistance;
+ closestHandle = $( this );
+ index = i;
+ }
+ });
+
+ // workaround for bug #3736 (if both handles of a range are at 0,
+ // the first is always used as the one with least distance,
+ // and moving it is obviously prevented by preventing negative ranges)
+ if( o.range === true && this.values(1) === o.min ) {
+ index += 1;
+ closestHandle = $( this.handles[index] );
+ }
+
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
+ this._mouseSliding = true;
+
+ self._handleIndex = index;
+
+ closestHandle
+ .addClass( "ui-state-active" )
+ .focus();
+
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+ };
+
+ normValue = this._normValueFromMouse( position );
+ this._slide( event, index, normValue );
+ this._animateOff = true;
+ return true;
+ },
+
+ _mouseStart: function( event ) {
+ return true;
+ },
+
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
+
+ this._slide( event, this._handleIndex, normValue );
+
+ return false;
+ },
+
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
+ this._mouseSliding = false;
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
+ this._handleIndex = null;
+ this._clickOffset = null;
+ this._animateOff = false;
+
+ return false;
+ },
+
+ _detectOrientation: function() {
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+ },
+
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
+
+ if ( this.orientation === "horizontal" ) {
+ pixelTotal = this.elementSize.width;
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+ } else {
+ pixelTotal = this.elementSize.height;
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+ }
+
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
+ percentMouse = 1 - percentMouse;
+ }
+
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+ return this._trimAlignValue( valueMouse );
+ },
+
+ _start: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+ return this._trigger( "start", event, uiHash );
+ },
+
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
+
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
+
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+ ) {
+ newVal = otherVal;
+ }
+
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal,
+ values: newValues
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal, true );
+ }
+ }
+ } else {
+ if ( newVal !== this.value() ) {
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
+ }
+ }
+ }
+ },
+
+ _stop: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "stop", event, uiHash );
+ },
+
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "change", event, uiHash );
+ }
+ },
+
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, 0 );
+ }
+
+ return this._value();
+ },
+
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
+
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, index );
+ }
+
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
+ }
+ this._refreshValue();
+ } else {
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
+ } else {
+ return this.value();
+ }
+ }
+ } else {
+ return this._values();
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var i,
+ valsLength = 0;
+
+ if ( $.isArray( this.options.values ) ) {
+ valsLength = this.options.values.length;
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ switch ( key ) {
+ case "disabled":
+ if ( value ) {
+ this.handles.filter( ".ui-state-focus" ).blur();
+ this.handles.removeClass( "ui-state-hover" );
+ this.handles.attr( "disabled", "disabled" );
+ this.element.addClass( "ui-disabled" );
+ } else {
+ this.handles.removeAttr( "disabled" );
+ this.element.removeClass( "ui-disabled" );
+ }
+ break;
+ case "orientation":
+ this._detectOrientation();
+ this.element
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
+ this._refreshValue();
+ break;
+ case "value":
+ this._animateOff = true;
+ this._refreshValue();
+ this._change( null, 0 );
+ this._animateOff = false;
+ break;
+ case "values":
+ this._animateOff = true;
+ this._refreshValue();
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
+ }
+ this._animateOff = false;
+ break;
+ }
+ },
+
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
+ _value: function() {
+ var val = this.options.value;
+ val = this._trimAlignValue( val );
+
+ return val;
+ },
+
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
+
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
+
+ return val;
+ } else {
+ // .slice() creates a copy of the array
+ // this copy gets trimmed by min and max and then returned
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i+= 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
+ }
+
+ return vals;
+ }
+ },
+
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
+ _trimAlignValue: function( val ) {
+ if ( val < this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val > this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
+ valModStep = val % step,
+ alignValue = val - valModStep;
+
+ if ( Math.abs(valModStep) * 2 >= step ) {
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
+ },
+
+ _valueMin: function() {
+ return this.options.min;
+ },
+
+ _valueMax: function() {
+ return this.options.max;
+ },
+
+ _refreshValue: function() {
+ var oRange = this.options.range,
+ o = this.options,
+ self = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ valPercent,
+ _set = {},
+ lastValPercent,
+ value,
+ valueMin,
+ valueMax;
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i, j ) {
+ valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+ if ( self.options.range === true ) {
+ if ( self.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ } else {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+ lastValPercent = valPercent;
+ });
+ } else {
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" ) {
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+
+});
+
+$.extend( $.ui.slider, {
+ version: "1.8.2"
+});
+
+}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.sortable.js b/resources/jquery.ui/jquery.ui.sortable.js
new file mode 100644
index 00000000..fe9898e0
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.sortable.js
@@ -0,0 +1,1067 @@
+/*
+ * jQuery UI Sortable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+ widgetEventPrefix: "sort",
+ options: {
+ appendTo: "parent",
+ axis: false,
+ connectWith: false,
+ containment: false,
+ cursor: 'auto',
+ cursorAt: false,
+ dropOnEmpty: true,
+ forcePlaceholderSize: false,
+ forceHelperSize: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ items: '> *',
+ opacity: false,
+ placeholder: false,
+ revert: false,
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ scope: "default",
+ tolerance: "intersect",
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var o = this.options;
+ this.containerCache = {};
+ this.element.addClass("ui-sortable");
+
+ //Get the items
+ this.refresh();
+
+ //Let's determine if the items are floating
+ this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
+
+ //Let's determine the parent's offset
+ this.offset = this.element.offset();
+
+ //Initialize mouse events for interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass("ui-sortable ui-sortable-disabled")
+ .removeData("sortable")
+ .unbind(".sortable");
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- )
+ this.items[i].item.removeData("sortable-item");
+
+ return this;
+ },
+
+ _setOption: function(key, value){
+ if ( key === "disabled" ) {
+ this.options[ key ] = value;
+
+ this.widget()
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+ } else {
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
+ $.Widget.prototype._setOption.apply(this, arguments);
+ }
+ },
+
+ _mouseCapture: function(event, overrideHandle) {
+
+ if (this.reverting) {
+ return false;
+ }
+
+ if(this.options.disabled || this.options.type == 'static') return false;
+
+ //We have to refresh the items data once first
+ this._refreshItems(event);
+
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
+ var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+ if($.data(this, 'sortable-item') == self) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+ if(!currentItem) return false;
+ if(this.options.handle && !overrideHandle) {
+ var validHandle = false;
+
+ $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+ if(!validHandle) return false;
+ }
+
+ this.currentItem = currentItem;
+ this._removeCurrentsFromItems();
+ return true;
+
+ },
+
+ _mouseStart: function(event, overrideHandle, noActivation) {
+
+ var o = this.options, self = this;
+ this.currentContainer = this;
+
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+ this.refreshPositions();
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Get the next scrolling parent
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.currentItem.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ // Only after we got the offset, we can change the helper's position to absolute
+ // TODO: Still need to figure out a way to make relative sorting possible
+ this.helper.css("position", "absolute");
+ this.cssPosition = this.helper.css("position");
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Cache the former DOM position
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+ if(this.helper[0] != this.currentItem[0]) {
+ this.currentItem.hide();
+ }
+
+ //Create the placeholder
+ this._createPlaceholder();
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ if(o.cursor) { // cursor option
+ if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+ $('body').css("cursor", o.cursor);
+ }
+
+ if(o.opacity) { // opacity option
+ if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+ this.helper.css("opacity", o.opacity);
+ }
+
+ if(o.zIndex) { // zIndex option
+ if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+ this.helper.css("zIndex", o.zIndex);
+ }
+
+ //Prepare scrolling
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+ this.overflowOffset = this.scrollParent.offset();
+
+ //Call callbacks
+ this._trigger("start", event, this._uiHash());
+
+ //Recache the helper size
+ if(!this._preserveHelperProportions)
+ this._cacheHelperProportions();
+
+
+ //Post 'activate' events to possible containers
+ if(!noActivation) {
+ for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+ }
+
+ //Prepare possible droppables
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.dragging = true;
+
+ this.helper.addClass("ui-sortable-helper");
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+
+ },
+
+ _mouseDrag: function(event) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ if (!this.lastPositionAbs) {
+ this.lastPositionAbs = this.positionAbs;
+ }
+
+ //Do scrolling
+ if(this.options.scroll) {
+ var o = this.options, scrolled = false;
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+ } else {
+
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ //Regenerate the absolute position used for position checks
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Set the helper position
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+ //Rearrange
+ for (var i = this.items.length - 1; i >= 0; i--) {
+
+ //Cache variables and intersection, continue if no intersection
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+ if (!intersection) continue;
+
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+ ) {
+
+ this.direction = intersection == 1 ? "down" : "up";
+
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+ this._rearrange(event, item);
+ } else {
+ break;
+ }
+
+ this._trigger("change", event, this._uiHash());
+ break;
+ }
+ }
+
+ //Post events to containers
+ this._contactContainers(event);
+
+ //Interconnect with droppables
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ //Call callbacks
+ this._trigger('sort', event, this._uiHash());
+
+ this.lastPositionAbs = this.positionAbs;
+ return false;
+
+ },
+
+ _mouseStop: function(event, noPropagation) {
+
+ if(!event) return;
+
+ //If we are using droppables, inform the manager about the drop
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ $.ui.ddmanager.drop(this, event);
+
+ if(this.options.revert) {
+ var self = this;
+ var cur = self.placeholder.offset();
+
+ self.reverting = true;
+
+ $(this.helper).animate({
+ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+ top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+ }, parseInt(this.options.revert, 10) || 500, function() {
+ self._clear(event);
+ });
+ } else {
+ this._clear(event, noPropagation);
+ }
+
+ return false;
+
+ },
+
+ cancel: function() {
+
+ var self = this;
+
+ if(this.dragging) {
+
+ this._mouseUp();
+
+ if(this.options.helper == "original")
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ else
+ this.currentItem.show();
+
+ //Post deactivating events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", null, self._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+ if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+ $.extend(this, {
+ helper: null,
+ dragging: false,
+ reverting: false,
+ _noFinalSort: null
+ });
+
+ if(this.domPosition.prev) {
+ $(this.domPosition.prev).after(this.currentItem);
+ } else {
+ $(this.domPosition.parent).prepend(this.currentItem);
+ }
+
+ return this;
+
+ },
+
+ serialize: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var str = []; o = o || {};
+
+ $(items).each(function() {
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+ if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+ });
+
+ return str.join('&');
+
+ },
+
+ toArray: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var ret = []; o = o || {};
+
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+ return ret;
+
+ },
+
+ /* Be careful with the following core functions */
+ _intersectsWith: function(item) {
+
+ var x1 = this.positionAbs.left,
+ x2 = x1 + this.helperProportions.width,
+ y1 = this.positionAbs.top,
+ y2 = y1 + this.helperProportions.height;
+
+ var l = item.left,
+ r = l + item.width,
+ t = item.top,
+ b = t + item.height;
+
+ var dyClick = this.offset.click.top,
+ dxClick = this.offset.click.left;
+
+ var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+ if( this.options.tolerance == "pointer"
+ || this.options.forcePointerForContainers
+ || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+ ) {
+ return isOverElement;
+ } else {
+
+ return (l < x1 + (this.helperProportions.width / 2) // Right Half
+ && x2 - (this.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (this.helperProportions.height / 2) // Bottom Half
+ && y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+ }
+ },
+
+ _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),
+ isOverElement = isOverElementHeight && isOverElementWidth,
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (!isOverElement)
+ return false;
+
+ return this.floating ?
+ ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+ : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+ },
+
+ _intersectsWithSides: function(item) {
+
+ var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+ isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (this.floating && horizontalDirection) {
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+ } else {
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+ }
+
+ },
+
+ _getDragVerticalDirection: function() {
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
+ return delta != 0 && (delta > 0 ? "down" : "up");
+ },
+
+ _getDragHorizontalDirection: function() {
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
+ return delta != 0 && (delta > 0 ? "right" : "left");
+ },
+
+ refresh: function(event) {
+ this._refreshItems(event);
+ this.refreshPositions();
+ return this;
+ },
+
+ _connectWith: function() {
+ var options = this.options;
+ return options.connectWith.constructor == String
+ ? [options.connectWith]
+ : options.connectWith;
+ },
+
+ _getItemsAsjQuery: function(connected) {
+
+ var self = this;
+ var items = [];
+ var queries = [];
+ var connectWith = this._connectWith();
+
+ if(connectWith && connected) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+ }
+ };
+ };
+ }
+
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+ for (var i = queries.length - 1; i >= 0; i--){
+ queries[i][0].each(function() {
+ items.push(this);
+ });
+ };
+
+ return $(items);
+
+ },
+
+ _removeCurrentsFromItems: function() {
+
+ var list = this.currentItem.find(":data(sortable-item)");
+
+ for (var i=0; i < this.items.length; i++) {
+
+ for (var j=0; j < list.length; j++) {
+ if(list[j] == this.items[i].item[0])
+ this.items.splice(i,1);
+ };
+
+ };
+
+ },
+
+ _refreshItems: function(event) {
+
+ this.items = [];
+ this.containers = [this];
+ var items = this.items;
+ var self = this;
+ var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+ var connectWith = this._connectWith();
+
+ if(connectWith) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+ this.containers.push(inst);
+ }
+ };
+ };
+ }
+
+ for (var i = queries.length - 1; i >= 0; i--) {
+ var targetData = queries[i][1];
+ var _queries = queries[i][0];
+
+ for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+ var item = $(_queries[j]);
+
+ item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+ items.push({
+ item: item,
+ instance: targetData,
+ width: 0, height: 0,
+ left: 0, top: 0
+ });
+ };
+ };
+
+ },
+
+ refreshPositions: function(fast) {
+
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+ if(this.offsetParent && this.helper) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ for (var i = this.items.length - 1; i >= 0; i--){
+ var item = this.items[i];
+
+ var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+ if (!fast) {
+ item.width = t.outerWidth();
+ item.height = t.outerHeight();
+ }
+
+ var p = t.offset();
+ item.left = p.left;
+ item.top = p.top;
+ };
+
+ if(this.options.custom && this.options.custom.refreshContainers) {
+ this.options.custom.refreshContainers.call(this);
+ } else {
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ var p = this.containers[i].element.offset();
+ this.containers[i].containerCache.left = p.left;
+ this.containers[i].containerCache.top = p.top;
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+ };
+ }
+
+ return this;
+ },
+
+ _createPlaceholder: function(that) {
+
+ var self = that || this, o = self.options;
+
+ if(!o.placeholder || o.placeholder.constructor == String) {
+ var className = o.placeholder;
+ o.placeholder = {
+ element: function() {
+
+ var el = $(document.createElement(self.currentItem[0].nodeName))
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+ .removeClass("ui-sortable-helper")[0];
+
+ if(!className)
+ el.style.visibility = "hidden";
+
+ return el;
+ },
+ update: function(container, p) {
+
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+ if(className && !o.forcePlaceholderSize) return;
+
+ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+ if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+ if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+ }
+ };
+ }
+
+ //Create the placeholder
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+ //Append it after the actual current item
+ self.currentItem.after(self.placeholder);
+
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+ o.placeholder.update(self, self.placeholder);
+
+ },
+
+ _contactContainers: function(event) {
+
+ // get innermost container that intersects with item
+ var innermostContainer = null, innermostIndex = null;
+
+
+ for (var i = this.containers.length - 1; i >= 0; i--){
+
+ // never consider a container that's located within the item itself
+ if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+ continue;
+
+ if(this._intersectsWith(this.containers[i].containerCache)) {
+
+ // if we've already found a container and it's more "inner" than this, then continue
+ if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+ continue;
+
+ innermostContainer = this.containers[i];
+ innermostIndex = i;
+
+ } else {
+ // container doesn't intersect. trigger "out" event if necessary
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", event, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ // if no intersecting containers found, return
+ if(!innermostContainer) return;
+
+ // move the item into the container if it's not there already
+ if(this.containers.length === 1) {
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ } else if(this.currentContainer != this.containers[innermostIndex]) {
+
+ //When entering a new container, we will find the item with the least distance and append our item near it
+ var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+ for (var j = this.items.length - 1; j >= 0; j--) {
+ if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+ var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
+ if(Math.abs(cur - base) < dist) {
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+ }
+ }
+
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
+ return;
+
+ this.currentContainer = this.containers[innermostIndex];
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+ this._trigger("change", event, this._uiHash());
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+
+ //Update the placeholder
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+ if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+ $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+ if(helper[0] == this.currentItem[0])
+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+ if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+ if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.currentItem.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
+ var ce = $(o.containment)[0];
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _rearrange: function(event, i, a, hardRefresh) {
+
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+ //Various things done here to improve the performance:
+ // 1. we create a setTimeout, that calls refreshPositions
+ // 2. on the instance, we have a counter variable, that get's higher after every append
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+ // 4. this lets only the last addition to the timeout stack through
+ this.counter = this.counter ? ++this.counter : 1;
+ var self = this, counter = this.counter;
+
+ window.setTimeout(function() {
+ if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+ },0);
+
+ },
+
+ _clear: function(event, noPropagation) {
+
+ this.reverting = false;
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
+ // everything else normalized again
+ var delayedTriggers = [], self = this;
+
+ // We first have to update the dom position of the actual currentItem
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+ if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
+ this._noFinalSort = null;
+
+ if(this.helper[0] == this.currentItem[0]) {
+ for(var i in this._storedCSS) {
+ if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+ }
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+ if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ }
+ };
+ };
+
+ //Post events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ if(this.containers[i].containerCache.over) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ //Do what was originally in plugins
+ if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+ if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+ if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+ this.dragging = false;
+ if(this.cancelHelperRemoval) {
+ if(!noPropagation) {
+ this._trigger("beforeStop", event, this._uiHash());
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+ return false;
+ }
+
+ if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+ if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+ if(!noPropagation) {
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+
+ this.fromOutside = false;
+ return true;
+
+ },
+
+ _trigger: function() {
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+ this.cancel();
+ }
+ },
+
+ _uiHash: function(inst) {
+ var self = inst || this;
+ return {
+ helper: self.helper,
+ placeholder: self.placeholder || $([]),
+ position: self.position,
+ originalPosition: self.originalPosition,
+ offset: self.positionAbs,
+ item: self.currentItem,
+ sender: inst ? inst.element : null
+ };
+ }
+
+});
+
+$.extend($.ui.sortable, {
+ version: "1.8.2"
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.tabs.js b/resources/jquery.ui/jquery.ui.tabs.js
new file mode 100644
index 00000000..1f94d52a
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.tabs.js
@@ -0,0 +1,729 @@
+/*
+ * jQuery UI Tabs 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+var tabId = 0,
+ listId = 0;
+
+function getNextTabId() {
+ return ++tabId;
+}
+
+function getNextListId() {
+ return ++listId;
+}
+
+$.widget("ui.tabs", {
+ options: {
+ add: null,
+ ajaxOptions: null,
+ cache: false,
+ cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+ collapsible: false,
+ disable: null,
+ disabled: [],
+ enable: null,
+ event: 'click',
+ fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+ idPrefix: 'ui-tabs-',
+ load: null,
+ panelTemplate: '<div></div>',
+ remove: null,
+ select: null,
+ show: null,
+ spinner: '<em>Loading&#8230;</em>',
+ tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>'
+ },
+ _create: function() {
+ this._tabify(true);
+ },
+
+ _setOption: function(key, value) {
+ if (key == 'selected') {
+ if (this.options.collapsible && value == this.options.selected) {
+ return;
+ }
+ this.select(value);
+ }
+ else {
+ this.options[key] = value;
+ this._tabify();
+ }
+ },
+
+ _tabId: function(a) {
+ return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') ||
+ this.options.idPrefix + getNextTabId();
+ },
+
+ _sanitizeSelector: function(hash) {
+ return hash.replace(/:/g, '\\:'); // we need this because an id may contain a ":"
+ },
+
+ _cookie: function() {
+ var cookie = this.cookie || (this.cookie = this.options.cookie.name || 'ui-tabs-' + getNextListId());
+ return $.cookie.apply(null, [cookie].concat($.makeArray(arguments)));
+ },
+
+ _ui: function(tab, panel) {
+ return {
+ tab: tab,
+ panel: panel,
+ index: this.anchors.index(tab)
+ };
+ },
+
+ _cleanup: function() {
+ // restore all former loading tabs labels
+ this.lis.filter('.ui-state-processing').removeClass('ui-state-processing')
+ .find('span:data(label.tabs)')
+ .each(function() {
+ var el = $(this);
+ el.html(el.data('label.tabs')).removeData('label.tabs');
+ });
+ },
+
+ _tabify: function(init) {
+
+ this.list = this.element.find('ol,ul').eq(0);
+ this.lis = $('li:has(a[href])', this.list);
+ this.anchors = this.lis.map(function() { return $('a', this)[0]; });
+ this.panels = $([]);
+
+ var self = this, o = this.options;
+
+ var fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+ this.anchors.each(function(i, a) {
+ var href = $(a).attr('href');
+
+ // For dynamically created HTML that contains a hash as href IE < 8 expands
+ // such href to the full page url with hash and then misinterprets tab as ajax.
+ // Same consideration applies for an added tab with a fragment identifier
+ // since a[href=#fragment-identifier] does unexpectedly not match.
+ // Thus normalize href attribute...
+ var hrefBase = href.split('#')[0], baseEl;
+ if (hrefBase && (hrefBase === location.toString().split('#')[0] ||
+ (baseEl = $('base')[0]) && hrefBase === baseEl.href)) {
+ href = a.hash;
+ a.href = href;
+ }
+
+ // inline tab
+ if (fragmentId.test(href)) {
+ self.panels = self.panels.add(self._sanitizeSelector(href));
+ }
+
+ // remote tab
+ else if (href != '#') { // prevent loading the page itself if href is just "#"
+ $.data(a, 'href.tabs', href); // required for restore on destroy
+
+ // TODO until #3808 is fixed strip fragment identifier from url
+ // (IE fails to load from such url)
+ $.data(a, 'load.tabs', href.replace(/#.*$/, '')); // mutable data
+
+ var id = self._tabId(a);
+ a.href = '#' + id;
+ var $panel = $('#' + id);
+ if (!$panel.length) {
+ $panel = $(o.panelTemplate).attr('id', id).addClass('ui-tabs-panel ui-widget-content ui-corner-bottom')
+ .insertAfter(self.panels[i - 1] || self.list);
+ $panel.data('destroy.tabs', true);
+ }
+ self.panels = self.panels.add($panel);
+ }
+
+ // invalid tab href
+ else {
+ o.disabled.push(i);
+ }
+ });
+
+ // initialization from scratch
+ if (init) {
+
+ // attach necessary classes for styling
+ this.element.addClass('ui-tabs ui-widget ui-widget-content ui-corner-all');
+ this.list.addClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all');
+ this.lis.addClass('ui-state-default ui-corner-top');
+ this.panels.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom');
+
+ // Selected tab
+ // use "selected" option or try to retrieve:
+ // 1. from fragment identifier in url
+ // 2. from cookie
+ // 3. from selected class attribute on <li>
+ if (o.selected === undefined) {
+ if (location.hash) {
+ this.anchors.each(function(i, a) {
+ if (a.hash == location.hash) {
+ o.selected = i;
+ return false; // break
+ }
+ });
+ }
+ if (typeof o.selected != 'number' && o.cookie) {
+ o.selected = parseInt(self._cookie(), 10);
+ }
+ if (typeof o.selected != 'number' && this.lis.filter('.ui-tabs-selected').length) {
+ o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected'));
+ }
+ o.selected = o.selected || (this.lis.length ? 0 : -1);
+ }
+ else if (o.selected === null) { // usage of null is deprecated, TODO remove in next release
+ o.selected = -1;
+ }
+
+ // sanity check - default to first tab...
+ o.selected = ((o.selected >= 0 && this.anchors[o.selected]) || o.selected < 0) ? o.selected : 0;
+
+ // Take disabling tabs via class attribute from HTML
+ // into account and update option properly.
+ // A selected tab cannot become disabled.
+ o.disabled = $.unique(o.disabled.concat(
+ $.map(this.lis.filter('.ui-state-disabled'),
+ function(n, i) { return self.lis.index(n); } )
+ )).sort();
+
+ if ($.inArray(o.selected, o.disabled) != -1) {
+ o.disabled.splice($.inArray(o.selected, o.disabled), 1);
+ }
+
+ // highlight selected tab
+ this.panels.addClass('ui-tabs-hide');
+ this.lis.removeClass('ui-tabs-selected ui-state-active');
+ if (o.selected >= 0 && this.anchors.length) { // check for length avoids error when initializing empty list
+ this.panels.eq(o.selected).removeClass('ui-tabs-hide');
+ this.lis.eq(o.selected).addClass('ui-tabs-selected ui-state-active');
+
+ // seems to be expected behavior that the show callback is fired
+ self.element.queue("tabs", function() {
+ self._trigger('show', null, self._ui(self.anchors[o.selected], self.panels[o.selected]));
+ });
+
+ this.load(o.selected);
+ }
+
+ // clean up to avoid memory leaks in certain versions of IE 6
+ $(window).bind('unload', function() {
+ self.lis.add(self.anchors).unbind('.tabs');
+ self.lis = self.anchors = self.panels = null;
+ });
+
+ }
+ // update selected after add/remove
+ else {
+ o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected'));
+ }
+
+ // update collapsible
+ this.element[o.collapsible ? 'addClass' : 'removeClass']('ui-tabs-collapsible');
+
+ // set or update cookie after init and add/remove respectively
+ if (o.cookie) {
+ this._cookie(o.selected, o.cookie);
+ }
+
+ // disable tabs
+ for (var i = 0, li; (li = this.lis[i]); i++) {
+ $(li)[$.inArray(i, o.disabled) != -1 &&
+ !$(li).hasClass('ui-tabs-selected') ? 'addClass' : 'removeClass']('ui-state-disabled');
+ }
+
+ // reset cache if switching from cached to not cached
+ if (o.cache === false) {
+ this.anchors.removeData('cache.tabs');
+ }
+
+ // remove all handlers before, tabify may run on existing tabs after add or option change
+ this.lis.add(this.anchors).unbind('.tabs');
+
+ if (o.event != 'mouseover') {
+ var addState = function(state, el) {
+ if (el.is(':not(.ui-state-disabled)')) {
+ el.addClass('ui-state-' + state);
+ }
+ };
+ var removeState = function(state, el) {
+ el.removeClass('ui-state-' + state);
+ };
+ this.lis.bind('mouseover.tabs', function() {
+ addState('hover', $(this));
+ });
+ this.lis.bind('mouseout.tabs', function() {
+ removeState('hover', $(this));
+ });
+ this.anchors.bind('focus.tabs', function() {
+ addState('focus', $(this).closest('li'));
+ });
+ this.anchors.bind('blur.tabs', function() {
+ removeState('focus', $(this).closest('li'));
+ });
+ }
+
+ // set up animations
+ var hideFx, showFx;
+ if (o.fx) {
+ if ($.isArray(o.fx)) {
+ hideFx = o.fx[0];
+ showFx = o.fx[1];
+ }
+ else {
+ hideFx = showFx = o.fx;
+ }
+ }
+
+ // Reset certain styles left over from animation
+ // and prevent IE's ClearType bug...
+ function resetStyle($el, fx) {
+ $el.css({ display: '' });
+ if (!$.support.opacity && fx.opacity) {
+ $el[0].style.removeAttribute('filter');
+ }
+ }
+
+ // Show a tab...
+ var showTab = showFx ?
+ function(clicked, $show) {
+ $(clicked).closest('li').addClass('ui-tabs-selected ui-state-active');
+ $show.hide().removeClass('ui-tabs-hide') // avoid flicker that way
+ .animate(showFx, showFx.duration || 'normal', function() {
+ resetStyle($show, showFx);
+ self._trigger('show', null, self._ui(clicked, $show[0]));
+ });
+ } :
+ function(clicked, $show) {
+ $(clicked).closest('li').addClass('ui-tabs-selected ui-state-active');
+ $show.removeClass('ui-tabs-hide');
+ self._trigger('show', null, self._ui(clicked, $show[0]));
+ };
+
+ // Hide a tab, $show is optional...
+ var hideTab = hideFx ?
+ function(clicked, $hide) {
+ $hide.animate(hideFx, hideFx.duration || 'normal', function() {
+ self.lis.removeClass('ui-tabs-selected ui-state-active');
+ $hide.addClass('ui-tabs-hide');
+ resetStyle($hide, hideFx);
+ self.element.dequeue("tabs");
+ });
+ } :
+ function(clicked, $hide, $show) {
+ self.lis.removeClass('ui-tabs-selected ui-state-active');
+ $hide.addClass('ui-tabs-hide');
+ self.element.dequeue("tabs");
+ };
+
+ // attach tab event handler, unbind to avoid duplicates from former tabifying...
+ this.anchors.bind(o.event + '.tabs', function() {
+ var el = this, $li = $(this).closest('li'), $hide = self.panels.filter(':not(.ui-tabs-hide)'),
+ $show = $(self._sanitizeSelector(this.hash));
+
+ // If tab is already selected and not collapsible or tab disabled or
+ // or is already loading or click callback returns false stop here.
+ // Check if click handler returns false last so that it is not executed
+ // for a disabled or loading tab!
+ if (($li.hasClass('ui-tabs-selected') && !o.collapsible) ||
+ $li.hasClass('ui-state-disabled') ||
+ $li.hasClass('ui-state-processing') ||
+ self._trigger('select', null, self._ui(this, $show[0])) === false) {
+ this.blur();
+ return false;
+ }
+
+ o.selected = self.anchors.index(this);
+
+ self.abort();
+
+ // if tab may be closed
+ if (o.collapsible) {
+ if ($li.hasClass('ui-tabs-selected')) {
+ o.selected = -1;
+
+ if (o.cookie) {
+ self._cookie(o.selected, o.cookie);
+ }
+
+ self.element.queue("tabs", function() {
+ hideTab(el, $hide);
+ }).dequeue("tabs");
+
+ this.blur();
+ return false;
+ }
+ else if (!$hide.length) {
+ if (o.cookie) {
+ self._cookie(o.selected, o.cookie);
+ }
+
+ self.element.queue("tabs", function() {
+ showTab(el, $show);
+ });
+
+ self.load(self.anchors.index(this)); // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+
+ this.blur();
+ return false;
+ }
+ }
+
+ if (o.cookie) {
+ self._cookie(o.selected, o.cookie);
+ }
+
+ // show new tab
+ if ($show.length) {
+ if ($hide.length) {
+ self.element.queue("tabs", function() {
+ hideTab(el, $hide);
+ });
+ }
+ self.element.queue("tabs", function() {
+ showTab(el, $show);
+ });
+
+ self.load(self.anchors.index(this));
+ }
+ else {
+ throw 'jQuery UI Tabs: Mismatching fragment identifier.';
+ }
+
+ // Prevent IE from keeping other link focussed when using the back button
+ // and remove dotted border from clicked link. This is controlled via CSS
+ // in modern browsers; blur() removes focus from address bar in Firefox
+ // which can become a usability and annoying problem with tabs('rotate').
+ if ($.browser.msie) {
+ this.blur();
+ }
+
+ });
+
+ // disable click in any case
+ this.anchors.bind('click.tabs', function(){return false;});
+
+ },
+
+ destroy: function() {
+ var o = this.options;
+
+ this.abort();
+
+ this.element.unbind('.tabs')
+ .removeClass('ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible')
+ .removeData('tabs');
+
+ this.list.removeClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all');
+
+ this.anchors.each(function() {
+ var href = $.data(this, 'href.tabs');
+ if (href) {
+ this.href = href;
+ }
+ var $this = $(this).unbind('.tabs');
+ $.each(['href', 'load', 'cache'], function(i, prefix) {
+ $this.removeData(prefix + '.tabs');
+ });
+ });
+
+ this.lis.unbind('.tabs').add(this.panels).each(function() {
+ if ($.data(this, 'destroy.tabs')) {
+ $(this).remove();
+ }
+ else {
+ $(this).removeClass([
+ 'ui-state-default',
+ 'ui-corner-top',
+ 'ui-tabs-selected',
+ 'ui-state-active',
+ 'ui-state-hover',
+ 'ui-state-focus',
+ 'ui-state-disabled',
+ 'ui-tabs-panel',
+ 'ui-widget-content',
+ 'ui-corner-bottom',
+ 'ui-tabs-hide'
+ ].join(' '));
+ }
+ });
+
+ if (o.cookie) {
+ this._cookie(null, o.cookie);
+ }
+
+ return this;
+ },
+
+ add: function(url, label, index) {
+ if (index === undefined) {
+ index = this.anchors.length; // append by default
+ }
+
+ var self = this, o = this.options,
+ $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)),
+ id = !url.indexOf('#') ? url.replace('#', '') : this._tabId($('a', $li)[0]);
+
+ $li.addClass('ui-state-default ui-corner-top').data('destroy.tabs', true);
+
+ // try to find an existing element before creating a new one
+ var $panel = $('#' + id);
+ if (!$panel.length) {
+ $panel = $(o.panelTemplate).attr('id', id).data('destroy.tabs', true);
+ }
+ $panel.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide');
+
+ if (index >= this.lis.length) {
+ $li.appendTo(this.list);
+ $panel.appendTo(this.list[0].parentNode);
+ }
+ else {
+ $li.insertBefore(this.lis[index]);
+ $panel.insertBefore(this.panels[index]);
+ }
+
+ o.disabled = $.map(o.disabled,
+ function(n, i) { return n >= index ? ++n : n; });
+
+ this._tabify();
+
+ if (this.anchors.length == 1) { // after tabify
+ o.selected = 0;
+ $li.addClass('ui-tabs-selected ui-state-active');
+ $panel.removeClass('ui-tabs-hide');
+ this.element.queue("tabs", function() {
+ self._trigger('show', null, self._ui(self.anchors[0], self.panels[0]));
+ });
+
+ this.load(0);
+ }
+
+ // callback
+ this._trigger('add', null, this._ui(this.anchors[index], this.panels[index]));
+ return this;
+ },
+
+ remove: function(index) {
+ var o = this.options, $li = this.lis.eq(index).remove(),
+ $panel = this.panels.eq(index).remove();
+
+ // If selected tab was removed focus tab to the right or
+ // in case the last tab was removed the tab to the left.
+ if ($li.hasClass('ui-tabs-selected') && this.anchors.length > 1) {
+ this.select(index + (index + 1 < this.anchors.length ? 1 : -1));
+ }
+
+ o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }),
+ function(n, i) { return n >= index ? --n : n; });
+
+ this._tabify();
+
+ // callback
+ this._trigger('remove', null, this._ui($li.find('a')[0], $panel[0]));
+ return this;
+ },
+
+ enable: function(index) {
+ var o = this.options;
+ if ($.inArray(index, o.disabled) == -1) {
+ return;
+ }
+
+ this.lis.eq(index).removeClass('ui-state-disabled');
+ o.disabled = $.grep(o.disabled, function(n, i) { return n != index; });
+
+ // callback
+ this._trigger('enable', null, this._ui(this.anchors[index], this.panels[index]));
+ return this;
+ },
+
+ disable: function(index) {
+ var self = this, o = this.options;
+ if (index != o.selected) { // cannot disable already selected tab
+ this.lis.eq(index).addClass('ui-state-disabled');
+
+ o.disabled.push(index);
+ o.disabled.sort();
+
+ // callback
+ this._trigger('disable', null, this._ui(this.anchors[index], this.panels[index]));
+ }
+
+ return this;
+ },
+
+ select: function(index) {
+ if (typeof index == 'string') {
+ index = this.anchors.index(this.anchors.filter('[href$=' + index + ']'));
+ }
+ else if (index === null) { // usage of null is deprecated, TODO remove in next release
+ index = -1;
+ }
+ if (index == -1 && this.options.collapsible) {
+ index = this.options.selected;
+ }
+
+ this.anchors.eq(index).trigger(this.options.event + '.tabs');
+ return this;
+ },
+
+ load: function(index) {
+ var self = this, o = this.options, a = this.anchors.eq(index)[0], url = $.data(a, 'load.tabs');
+
+ this.abort();
+
+ // not remote or from cache
+ if (!url || this.element.queue("tabs").length !== 0 && $.data(a, 'cache.tabs')) {
+ this.element.dequeue("tabs");
+ return;
+ }
+
+ // load remote from here on
+ this.lis.eq(index).addClass('ui-state-processing');
+
+ if (o.spinner) {
+ var span = $('span', a);
+ span.data('label.tabs', span.html()).html(o.spinner);
+ }
+
+ this.xhr = $.ajax($.extend({}, o.ajaxOptions, {
+ url: url,
+ success: function(r, s) {
+ $(self._sanitizeSelector(a.hash)).html(r);
+
+ // take care of tab labels
+ self._cleanup();
+
+ if (o.cache) {
+ $.data(a, 'cache.tabs', true); // if loaded once do not load them again
+ }
+
+ // callbacks
+ self._trigger('load', null, self._ui(self.anchors[index], self.panels[index]));
+ try {
+ o.ajaxOptions.success(r, s);
+ }
+ catch (e) {}
+ },
+ error: function(xhr, s, e) {
+ // take care of tab labels
+ self._cleanup();
+
+ // callbacks
+ self._trigger('load', null, self._ui(self.anchors[index], self.panels[index]));
+ try {
+ // Passing index avoid a race condition when this method is
+ // called after the user has selected another tab.
+ // Pass the anchor that initiated this request allows
+ // loadError to manipulate the tab content panel via $(a.hash)
+ o.ajaxOptions.error(xhr, s, index, a);
+ }
+ catch (e) {}
+ }
+ }));
+
+ // last, so that load event is fired before show...
+ self.element.dequeue("tabs");
+
+ return this;
+ },
+
+ abort: function() {
+ // stop possibly running animations
+ this.element.queue([]);
+ this.panels.stop(false, true);
+
+ // "tabs" queue must not contain more than two elements,
+ // which are the callbacks for the latest clicked tab...
+ this.element.queue("tabs", this.element.queue("tabs").splice(-2, 2));
+
+ // terminate pending requests from other tabs
+ if (this.xhr) {
+ this.xhr.abort();
+ delete this.xhr;
+ }
+
+ // take care of tab labels
+ this._cleanup();
+ return this;
+ },
+
+ url: function(index, url) {
+ this.anchors.eq(index).removeData('cache.tabs').data('load.tabs', url);
+ return this;
+ },
+
+ length: function() {
+ return this.anchors.length;
+ }
+
+});
+
+$.extend($.ui.tabs, {
+ version: '1.8.2'
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend($.ui.tabs.prototype, {
+ rotation: null,
+ rotate: function(ms, continuing) {
+
+ var self = this, o = this.options;
+
+ var rotate = self._rotate || (self._rotate = function(e) {
+ clearTimeout(self.rotation);
+ self.rotation = setTimeout(function() {
+ var t = o.selected;
+ self.select( ++t < self.anchors.length ? t : 0 );
+ }, ms);
+
+ if (e) {
+ e.stopPropagation();
+ }
+ });
+
+ var stop = self._unrotate || (self._unrotate = !continuing ?
+ function(e) {
+ if (e.clientX) { // in case of a true click
+ self.rotate(null);
+ }
+ } :
+ function(e) {
+ t = o.selected;
+ rotate();
+ });
+
+ // start rotation
+ if (ms) {
+ this.element.bind('tabsshow', rotate);
+ this.anchors.bind(o.event + '.tabs', stop);
+ rotate();
+ }
+ // stop rotation
+ else {
+ clearTimeout(self.rotation);
+ this.element.unbind('tabsshow', rotate);
+ this.anchors.unbind(o.event + '.tabs', stop);
+ delete this._rotate;
+ delete this._unrotate;
+ }
+
+ return this;
+ }
+});
+
+})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.widget.js b/resources/jquery.ui/jquery.ui.widget.js
new file mode 100644
index 00000000..6425d086
--- /dev/null
+++ b/resources/jquery.ui/jquery.ui.widget.js
@@ -0,0 +1,236 @@
+/*!
+ * jQuery UI Widget 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $ ) {
+
+var _remove = $.fn.remove;
+
+$.fn.remove = function( selector, keepData ) {
+ return this.each(function() {
+ if ( !keepData ) {
+ if ( !selector || $.filter( selector, [ this ] ).length ) {
+ $( "*", this ).add( this ).each(function() {
+ $( this ).triggerHandler( "remove" );
+ });
+ }
+ }
+ return _remove.call( $(this), selector, keepData );
+ });
+};
+
+$.widget = function( name, base, prototype ) {
+ var namespace = name.split( "." )[ 0 ],
+ fullName;
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName ] = function( elem ) {
+ return !!$.data( elem, name );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+
+ var basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+// $.each( basePrototype, function( key, val ) {
+// if ( $.isPlainObject(val) ) {
+// basePrototype[ key ] = $.extend( {}, val );
+// }
+// });
+ basePrototype.options = $.extend( {}, basePrototype.options );
+ $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+ namespace: namespace,
+ widgetName: name,
+ widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+ widgetBaseClass: fullName
+ }, prototype );
+
+ $.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = Array.prototype.slice.call( arguments, 1 ),
+ returnValue = this;
+
+ // allow multiple hashes to be passed on init
+ options = !isMethodCall && args.length ?
+ $.extend.apply( null, [ true, options ].concat(args) ) :
+ options;
+
+ // prevent calls to internal methods
+ if ( isMethodCall && options.substring( 0, 1 ) === "_" ) {
+ return returnValue;
+ }
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var instance = $.data( this, name ),
+ methodValue = instance && $.isFunction( instance[options] ) ?
+ instance[ options ].apply( instance, args ) :
+ instance;
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue;
+ return false;
+ }
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, name );
+ if ( instance ) {
+ if ( options ) {
+ instance.option( options );
+ }
+ instance._init();
+ } else {
+ $.data( this, name, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+};
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ options: {
+ disabled: false
+ },
+ _createWidget: function( options, element ) {
+ // $.widget.bridge stores the plugin instance, but we do it anyway
+ // so that it's stored even before the _create function runs
+ this.element = $( element ).data( this.widgetName, this );
+ this.options = $.extend( true, {},
+ this.options,
+ $.metadata && $.metadata.get( element )[ this.widgetName ],
+ options );
+
+ var self = this;
+ this.element.bind( "remove." + this.widgetName, function() {
+ self.destroy();
+ });
+
+ this._create();
+ this._init();
+ },
+ _create: function() {},
+ _init: function() {},
+
+ destroy: function() {
+ this.element
+ .unbind( "." + this.widgetName )
+ .removeData( this.widgetName );
+ this.widget()
+ .unbind( "." + this.widgetName )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetBaseClass + "-disabled " +
+ "ui-state-disabled" );
+ },
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key,
+ self = this;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.extend( {}, self.options );
+ }
+
+ if (typeof key === "string" ) {
+ if ( value === undefined ) {
+ return this.options[ key ];
+ }
+ options = {};
+ options[ key ] = value;
+ }
+
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+ });
+
+ return self;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ [ value ? "addClass" : "removeClass"](
+ this.widgetBaseClass + "-disabled" + " " +
+ "ui-state-disabled" )
+ .attr( "aria-disabled", value );
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOption( "disabled", false );
+ },
+ disable: function() {
+ return this._setOption( "disabled", true );
+ },
+
+ _trigger: function( type, event, data ) {
+ var callback = this.options[ type ];
+
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ data = data || {};
+
+ // copy original event properties over to the new event
+ // this would happen if we could call $.event.fix instead of $.Event
+ // but we don't have a way to force an event to be fixed multiple times
+ if ( event.originalEvent ) {
+ for ( var i = $.event.props.length, prop; i; ) {
+ prop = $.event.props[ --i ];
+ event[ prop ] = event.originalEvent[ prop ];
+ }
+ }
+
+ this.element.trigger( event, data );
+
+ return !( $.isFunction(callback) &&
+ callback.call( this.element[0], event, data ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+})( jQuery );
diff --git a/resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gif b/resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gif
new file mode 100644
index 00000000..085ccaec
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gif
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644
index 00000000..5b5dab2a
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.png
new file mode 100644
index 00000000..062f5807
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.png
new file mode 100644
index 00000000..ac8b229a
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.png
new file mode 100644
index 00000000..5473afff
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.png
new file mode 100644
index 00000000..7b7b0744
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.png
new file mode 100644
index 00000000..5b4ca1a0
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644
index 00000000..ac8b229a
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.png
new file mode 100644
index 00000000..c61aad2e
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
new file mode 100644
index 00000000..b273ff11
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 00000000..84defe6e
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
new file mode 100644
index 00000000..59bd45b9
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
new file mode 100644
index 00000000..6d02426c
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 00000000..2ab019b7
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/jquery.ui.accordion.css b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
new file mode 100644
index 00000000..8d8a1a6e
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
@@ -0,0 +1,12 @@
+/* Accordion
+----------------------------------*/
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+/* IE7-/Win - Fix extra vertical space in lists */
+.ui-accordion a { zoom: 1; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
new file mode 100644
index 00000000..5957f78f
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
@@ -0,0 +1,39 @@
+/* Autocomplete
+----------------------------------*/
+.ui-autocomplete { position: absolute; cursor: default; }
+.ui-autocomplete-loading { background: white /* @embed */ url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/* Menu
+----------------------------------*/
+.ui-menu {
+ list-style:none;
+ padding: 2px;
+ margin: 0;
+ display:block;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+ margin:0;
+ padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration:none;
+ display:block;
+ padding:.2em .4em;
+ line-height:1.5;
+ zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
diff --git a/resources/jquery.ui/themes/default/jquery.ui.button.css b/resources/jquery.ui/themes/default/jquery.ui.button.css
new file mode 100644
index 00000000..47777a42
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.button.css
@@ -0,0 +1,35 @@
+/* Button
+----------------------------------*/
+
+.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; }
+button.ui-button-icons-only { width: 3.7em; }
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+
+
+
+
+
diff --git a/resources/jquery.ui/themes/default/jquery.ui.core.css b/resources/jquery.ui/themes/default/jquery.ui.core.css
new file mode 100644
index 00000000..b3e81930
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.core.css
@@ -0,0 +1,37 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
new file mode 100644
index 00000000..a1116e69
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
@@ -0,0 +1,61 @@
+/* Datepicker
+----------------------------------*/
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+ display: none; /*sorry for IE5*/
+ display/**/: block; /*sorry for IE5*/
+ position: absolute; /*must have*/
+ z-index: -1; /*must have*/
+ filter: mask(); /*must have*/
+ top: -4px; /*must have*/
+ left: -4px; /*must have*/
+ width: 200px; /*must have*/
+ height: 200px; /*must have*/
+} \ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
new file mode 100644
index 00000000..f8354642
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
@@ -0,0 +1,13 @@
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.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; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
new file mode 100644
index 00000000..bc0939ec
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
@@ -0,0 +1,4 @@
+/* Progressbar
+----------------------------------*/
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
new file mode 100644
index 00000000..366643b5
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
@@ -0,0 +1,13 @@
+/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; 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; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.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
diff --git a/resources/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
new file mode 100644
index 00000000..c5d46ce2
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
@@ -0,0 +1,3 @@
+/* Selectable
+----------------------------------*/
+.ui-selectable-helper { border:1px dotted black }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.slider.css b/resources/jquery.ui/themes/default/jquery.ui.slider.css
new file mode 100644
index 00000000..07c6f4e5
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.slider.css
@@ -0,0 +1,17 @@
+/* Slider
+----------------------------------*/
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
new file mode 100644
index 00000000..99e16dbd
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
@@ -0,0 +1,11 @@
+/* Tabs
+----------------------------------*/
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.theme.css b/resources/jquery.ui/themes/default/jquery.ui.theme.css
new file mode 100644
index 00000000..7a425f73
--- /dev/null
+++ b/resources/jquery.ui/themes/default/jquery.ui.theme.css
@@ -0,0 +1,248 @@
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1em&cornerRadius=0&bgColorHeader=cccccc&bgTextureHeader=01_flat.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=01_flat.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=01_flat.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=01_flat.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=01_flat.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: sans-serif; font-size: 1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; /* @embed */ background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; /* @embed */ background: #cccccc url(images/ui-bg_flat_75_cccccc_40x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; /* @embed */ background: #e6e6e6 url(images/ui-bg_flat_75_e6e6e6_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; /* @embed */ background: #dadada url(images/ui-bg_flat_75_dadada_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; /* @embed */ background: #ffffff url(images/ui-bg_flat_65_ffffff_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; /* @embed */ background: #fbf9ee url(images/ui-bg_flat_55_fbf9ee_40x100.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; /* @embed */ background: #fef1ec url(images/ui-bg_flat_95_fef1ec_40x100.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; }
+.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; border-top-left-radius: 0; }
+.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; border-bottom-left-radius: 0; }
+.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-right { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; border-bottom-left-radius: 0; }
+.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; }
+
+/* Overlays */
+.ui-widget-overlay, .ui-widget-shadow { /* @embed */ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; }
+.ui-widget-overlay { opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
new file mode 100644
index 00000000..6242aca3
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
new file mode 100644
index 00000000..cde520b5
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-red.png b/resources/jquery.ui/themes/vector/images/button-disabled-red.png
new file mode 100644
index 00000000..0658a1db
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-disabled-red.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled.png b/resources/jquery.ui/themes/vector/images/button-disabled.png
new file mode 100644
index 00000000..cde3b1fb
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-disabled.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-blue.png b/resources/jquery.ui/themes/vector/images/button-down-blue.png
new file mode 100644
index 00000000..e0f5a6c0
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-down-blue.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-green.png b/resources/jquery.ui/themes/vector/images/button-down-green.png
new file mode 100644
index 00000000..1e54a0c4
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-down-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-red.png b/resources/jquery.ui/themes/vector/images/button-down-red.png
new file mode 100644
index 00000000..b0565fd8
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-down-red.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down.png b/resources/jquery.ui/themes/vector/images/button-down.png
new file mode 100644
index 00000000..160330ec
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-down.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-blue.png b/resources/jquery.ui/themes/vector/images/button-off-blue.png
new file mode 100644
index 00000000..8a8224b0
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-off-blue.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-green.png b/resources/jquery.ui/themes/vector/images/button-off-green.png
new file mode 100644
index 00000000..cdf46e7e
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-off-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-red.png b/resources/jquery.ui/themes/vector/images/button-off-red.png
new file mode 100644
index 00000000..1c609166
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-off-red.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off.png b/resources/jquery.ui/themes/vector/images/button-off.png
new file mode 100644
index 00000000..1bdc85c7
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-off.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-blue.png b/resources/jquery.ui/themes/vector/images/button-over-blue.png
new file mode 100644
index 00000000..a744947d
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-over-blue.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-green.png b/resources/jquery.ui/themes/vector/images/button-over-green.png
new file mode 100644
index 00000000..0b8f6ef4
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-over-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-red.png b/resources/jquery.ui/themes/vector/images/button-over-red.png
new file mode 100644
index 00000000..28003bd8
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-over-red.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over.png b/resources/jquery.ui/themes/vector/images/button-over.png
new file mode 100644
index 00000000..23d13ecb
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/button-over.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/close.png b/resources/jquery.ui/themes/vector/images/close.png
new file mode 100644
index 00000000..41d53913
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/close.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/titlebar-fade.png b/resources/jquery.ui/themes/vector/images/titlebar-fade.png
new file mode 100644
index 00000000..b491ec49
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/titlebar-fade.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif b/resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif
new file mode 100644
index 00000000..085ccaec
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-anim_basic_16x16.gif
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
new file mode 100644
index 00000000..7680b543
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png
new file mode 100644
index 00000000..abdc0108
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
new file mode 100644
index 00000000..28b566c2
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
new file mode 100644
index 00000000..dac84622
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
new file mode 100644
index 00000000..ad7f982b
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
new file mode 100644
index 00000000..8169ec3e
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
new file mode 100644
index 00000000..54aff0cb
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png b/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
new file mode 100644
index 00000000..3d87ac7b
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png
new file mode 100644
index 00000000..9d192c2f
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-icons_2694e8_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 00000000..09d1cdc8
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-icons_2e83ff_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png
new file mode 100644
index 00000000..f13b2066
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-icons_3d80b3_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png
new file mode 100644
index 00000000..f87de1ca
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-icons_666666_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png
new file mode 100644
index 00000000..0d20b730
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-icons_72a7cf_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png b/resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png
new file mode 100644
index 00000000..42f8f992
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/images/ui-icons_ffffff_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.accordion.css b/resources/jquery.ui/themes/vector/jquery.ui.accordion.css
new file mode 100644
index 00000000..8d8a1a6e
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.accordion.css
@@ -0,0 +1,12 @@
+/* Accordion
+----------------------------------*/
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+/* IE7-/Win - Fix extra vertical space in lists */
+.ui-accordion a { zoom: 1; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css b/resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css
new file mode 100644
index 00000000..6610a878
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css
@@ -0,0 +1,39 @@
+/* Autocomplete
+----------------------------------*/
+.ui-autocomplete { position: absolute; cursor: default; }
+.ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/* Menu
+----------------------------------*/
+.ui-menu {
+ list-style:none;
+ padding: 2px;
+ margin: 0;
+ display:block;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+ margin:0;
+ padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration:none;
+ display:block;
+ padding:.2em .4em;
+ line-height:1.5;
+ zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.button.css b/resources/jquery.ui/themes/vector/jquery.ui.button.css
new file mode 100644
index 00000000..5507c42b
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.button.css
@@ -0,0 +1,143 @@
+/* Button
+----------------------------------*/
+
+.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; }
+button.ui-button-icons-only { width: 3.7em; }
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
+.ui-button-text-only .ui-button-text { padding: .125em .25em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+
+body button.ui-button {
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ padding: 0.2em 0.6em 0.15em !important;
+ margin: 0.5em 0 0.5em 0.4em !important;
+ border: 1px solid #a6a6a6 !important;
+ /* @embed */
+ background: #f2f2f2 url(images/button-off.png) repeat-x scroll 50% 100% !important;
+ cursor: pointer;
+ font-size: 1em;
+ line-height: 1.4em;
+ width: auto;
+ overflow: visible;
+}
+body button.ui-button:hover {
+ border-color: #6e7273;
+ /* @embed */
+ background: #e1e1e1 url(images/button-over.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button:active,
+body button.ui-button:focus {
+ border-color: #707271;
+ /* @embed */
+ background: #bfbfbf url(images/button-down.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.disabled {
+ color: #7f7f7f;
+ border-color: #cccccc;
+ /* @embed */
+ background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
+}
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+ border: 0;
+}
+
+/* Green buttons */
+
+body button.ui-button.ui-button-green {
+ color: white;
+ border-color: #97af7e !important;
+ /* @embed */
+ background: #85c940 url(images/button-off-green.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-green:hover {
+ border-color: #778e61;
+ /* @embed */
+ background: #77ad40 url(images/button-over-green.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-green:active,
+body button.ui-button.ui-button-green:focus {
+ border-color: #61b000;
+ /* @embed */
+ background: #54a800 url(images/button-down-green.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-green.disabled {
+ color: #7f7f7f;
+ border-color: #b8d29f;
+ /* @embed */
+ background: #c9cfc3 url(images/button-disabled-green.png) repeat-x scroll 50% 100% !important;
+}
+
+/* Blue buttons */
+
+body button.ui-button.ui-button-blue {
+ color: white;
+ border-color: #407ec9 !important;
+ /* @embed */
+ background: #407ec9 url(images/button-off-blue.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-blue:hover {
+ border-color: #245289;
+ /* @embed */
+ background: #4071ad url(images/button-over-blue.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-blue:active,
+body button.ui-button.ui-button-blue:focus {
+ border-color: #003980;
+ /* @embed */
+ background: #004daa url(images/button-down-blue.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-blue.disabled {
+ border-color: #9eafc6;
+ /* @embed */
+ background: #c3c8cf url(images/button-disabled-blue.png) repeat-x scroll 50% 100% !important;
+}
+
+/* Red buttons */
+
+body button.ui-button.ui-button-red {
+ color: white;
+ border-color: #af977e !important;
+ /* @embed */
+ background: #c9404c url(images/button-off-red.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-red:hover {
+ border-color: #8e7761;
+ /* @embed */
+ background: #ad404a url(images/button-over-red.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-red:active,
+body button.ui-button.ui-button-red:focus {
+ border-color: #b06100;
+ /* @embed */
+ background: #aa000f url(images/button-down-red.png) repeat-x scroll 50% 100% !important;
+}
+body button.ui-button.ui-button-red.disabled {
+ color: #7f7f7f;
+ border-color: #c3acae;
+ /* @embed */
+ background: #cfc3c4 url(images/button-disabled-red.png) repeat-x scroll 50% 100% !important;
+}
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.core.css b/resources/jquery.ui/themes/vector/jquery.ui.core.css
new file mode 100644
index 00000000..b3e81930
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.core.css
@@ -0,0 +1,37 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css b/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css
new file mode 100644
index 00000000..a1116e69
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css
@@ -0,0 +1,61 @@
+/* Datepicker
+----------------------------------*/
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+ display: none; /*sorry for IE5*/
+ display/**/: block; /*sorry for IE5*/
+ position: absolute; /*must have*/
+ z-index: -1; /*must have*/
+ filter: mask(); /*must have*/
+ top: -4px; /*must have*/
+ left: -4px; /*must have*/
+ width: 200px; /*must have*/
+ height: 200px; /*must have*/
+} \ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.dialog.css b/resources/jquery.ui/themes/vector/jquery.ui.dialog.css
new file mode 100644
index 00000000..2b19fcdd
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.dialog.css
@@ -0,0 +1,37 @@
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: 0; width: 300px; }
+.ui-dialog .ui-dialog-titlebar { padding: .75em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .75em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.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-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/* Customizations */
+body .ui-dialog .ui-dialog-titlebar-close:hover {
+ text-decoration: none;
+}
+body .ui-dialog .ui-dialog-content .status-invalid input {
+ border: 2px solid red;
+ padding: 2px 1px;
+}
+body .ui-dialog .ui-dialog-titlebar {
+ padding: 0.9em 1.4em 0.6em !important;
+}
+body .ui-dialog .ui-widget-header {
+ /* @embed */
+ background: #f0f0f0 url(images/titlebar-fade.png) repeat-x scroll 50% 100% !important;
+}
+/* FIXME: Should just update the icon sprite if we're keeping this X */
+body .ui-dialog .ui-icon-closethick {
+ /* @embed */
+ background: url(images/close.png) no-repeat 50% 50% !important;
+}
+body .ui-dialog .ui-dialog-buttonpane {
+ margin-top: 0 !important;
+ padding:0.3em 1.4em 0.5em 1.4em !important;
+}
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.progressbar.css b/resources/jquery.ui/themes/vector/jquery.ui.progressbar.css
new file mode 100644
index 00000000..bc0939ec
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.progressbar.css
@@ -0,0 +1,4 @@
+/* Progressbar
+----------------------------------*/
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.resizable.css b/resources/jquery.ui/themes/vector/jquery.ui.resizable.css
new file mode 100644
index 00000000..366643b5
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.resizable.css
@@ -0,0 +1,13 @@
+/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; 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; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.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
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.selectable.css b/resources/jquery.ui/themes/vector/jquery.ui.selectable.css
new file mode 100644
index 00000000..c5d46ce2
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.selectable.css
@@ -0,0 +1,3 @@
+/* Selectable
+----------------------------------*/
+.ui-selectable-helper { border:1px dotted black }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.slider.css b/resources/jquery.ui/themes/vector/jquery.ui.slider.css
new file mode 100644
index 00000000..07c6f4e5
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.slider.css
@@ -0,0 +1,17 @@
+/* Slider
+----------------------------------*/
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.tabs.css b/resources/jquery.ui/themes/vector/jquery.ui.tabs.css
new file mode 100644
index 00000000..99e16dbd
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.tabs.css
@@ -0,0 +1,11 @@
+/* Tabs
+----------------------------------*/
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.theme.css b/resources/jquery.ui/themes/vector/jquery.ui.theme.css
new file mode 100644
index 00000000..26551213
--- /dev/null
+++ b/resources/jquery.ui/themes/vector/jquery.ui.theme.css
@@ -0,0 +1,248 @@
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1.0em&cornerRadius=3px&bgColorHeader=ffffff&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=f0f0f0&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=cccccc&fcActive=000000&iconColorActive=666666&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=000000&bgTextureOverlay=21_glow_ball.png&bgImgOpacityOverlay=100&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=70&opacityShadow=20&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: sans-serif; font-size: 0.8em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
+.ui-widget-content { border: none; /* @embed */ background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; }
+.ui-widget-content a { color: #362b36; }
+.ui-widget-header { border: 1px solid #aed0ea; line-height: 1em; /* @embed */ background: #ffffff url(images/ui-bg_highlight-soft_100_ffffff_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; /* @embed */ background: #d7ebf9 url(images/ui-bg_highlight-hard_80_d7ebf9_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #2779aa; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; /* @embed */ background: #e4f1fb url(images/ui-bg_highlight-soft_100_e4f1fb_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #0070a3; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #cccccc; background: #f0f0f0 /* @embed */ url(images/ui-bg_inset-hard_100_f0f0f0_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #000000; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #000000; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #f9dd34; background: #ffef8f /* @embed */ url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a /* @embed */ url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; }
+.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_72a7cf_256x240.png); }
+.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_3d80b3_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* @embed */ background-image: url(images/ui-icons_2694e8_256x240.png); }
+.ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_666666_256x240.png); }
+.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_ffffff_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; }
+.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
+.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
+.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
+.ui-corner-right { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
+.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
+.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; }
+
+/* Overlays */
+.ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
+.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } \ No newline at end of file
diff --git a/resources/jquery/jquery.async.js b/resources/jquery/jquery.async.js
new file mode 100644
index 00000000..61493f71
--- /dev/null
+++ b/resources/jquery/jquery.async.js
@@ -0,0 +1,78 @@
+/*
+ * jQuery Asynchronous Plugin 1.0
+ *
+ * Copyright (c) 2008 Vincent Robert (genezys.net)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ */
+(function($){
+
+// opts.delay : (default 10) delay between async call in ms
+// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
+// opts.test : (default true) function to test in the while test part
+// opts.loop : (default empty) function to call in the while loop part
+// opts.end : (default empty) function to call at the end of the while loop
+$.whileAsync = function(opts)
+{
+ var delay = Math.abs(opts.delay) || 10,
+ bulk = isNaN(opts.bulk) ? 500 : Math.abs(opts.bulk),
+ test = opts.test || function(){ return true; },
+ loop = opts.loop || function(){},
+ end = opts.end || function(){};
+
+ (function(){
+
+ var t = false,
+ begin = new Date();
+
+ while( t = test() )
+ {
+ loop();
+ if( bulk === 0 || (new Date() - begin) > bulk )
+ {
+ break;
+ }
+ }
+ if( t )
+ {
+ setTimeout(arguments.callee, delay);
+ }
+ else
+ {
+ end();
+ }
+
+ })();
+};
+
+// opts.delay : (default 10) delay between async call in ms
+// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
+// opts.loop : (default empty) function to call in the each loop part, signature: function(index, value) this = value
+// opts.end : (default empty) function to call at the end of the each loop
+$.eachAsync = function(array, opts)
+{
+ var i = 0,
+ l = array.length,
+ loop = opts.loop || function(){};
+
+ $.whileAsync(
+ $.extend(opts, {
+ test: function(){ return i < l; },
+ loop: function()
+ {
+ var val = array[i];
+ return loop.call(val, i++, val);
+ }
+ })
+ );
+};
+
+$.fn.eachAsync = function(opts)
+{
+ $.eachAsync(this, opts);
+ return this;
+}
+
+})(jQuery);
+
diff --git a/resources/jquery/jquery.autoEllipsis.js b/resources/jquery/jquery.autoEllipsis.js
new file mode 100644
index 00000000..4993118d
--- /dev/null
+++ b/resources/jquery/jquery.autoEllipsis.js
@@ -0,0 +1,131 @@
+/**
+ * Plugin that automatically truncates the plain text contents of an element and adds an ellipsis
+ */
+( function( $ ) {
+
+// Cache ellipsed substrings for every string-width combination
+var cache = { };
+// Use a seperate cache when match highlighting is enabled
+var matchTextCache = { };
+
+$.fn.autoEllipsis = function( options ) {
+ options = $.extend( {
+ 'position': 'center',
+ 'tooltip': false,
+ 'restoreText': false,
+ 'hasSpan': false,
+ 'matchText': null
+ }, options );
+ $(this).each( function() {
+ var $this = $(this);
+ if ( options.restoreText ) {
+ if ( ! $this.data( 'autoEllipsis.originalText' ) ) {
+ $this.data( 'autoEllipsis.originalText', $this.text() );
+ } else {
+ $this.text( $this.data( 'autoEllipsis.originalText' ) );
+ }
+ }
+
+ // container element - used for measuring against
+ var $container = $this;
+ // trimmable text element - only the text within this element will be trimmed
+ var $trimmableText = null;
+ // protected text element - the width of this element is counted, but next is never trimmed from it
+ var $protectedText = null;
+
+ if ( options.hasSpan ) {
+ $trimmableText = $this.children( options.selector );
+ } else {
+ $trimmableText = $( '<span />' )
+ .css( 'whiteSpace', 'nowrap' )
+ .text( $this.text() );
+ $this
+ .empty()
+ .append( $trimmableText );
+ }
+
+ var text = $container.text();
+ var trimmableText = $trimmableText.text();
+ var w = $container.width();
+ var pw = $protectedText ? $protectedText.width() : 0;
+ // Try cache
+ if ( !( text in cache ) ) {
+ cache[text] = {};
+ }
+ if ( options.matchText && !( text in matchTextCache ) ) {
+ matchTextCache[text] = {};
+ }
+ if ( options.matchText && !( options.matchText in matchTextCache[text] ) ) {
+ matchTextCache[text][options.matchText] = {};
+ }
+ if ( !options.matchText && w in cache[text] ) {
+ $container.html( cache[text][w] );
+ if ( options.tooltip )
+ $container.attr( 'title', text );
+ return;
+ }
+ if( options.matchText && options.matchText in matchTextCache[text] && w in matchTextCache[text][options.matchText] ) {
+ $container.html( matchTextCache[text][options.matchText][w] );
+ if ( options.tooltip )
+ $container.attr( 'title', text );
+ return;
+ }
+ if ( $trimmableText.width() + pw > w ) {
+ switch ( options.position ) {
+ case 'right':
+ // Use binary search-like technique for efficiency
+ var l = 0, r = trimmableText.length;
+ do {
+ var m = Math.ceil( ( l + r ) / 2 );
+ $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
+ if ( $trimmableText.width() + pw > w ) {
+ // Text is too long
+ r = m - 1;
+ } else {
+ l = m;
+ }
+ } while ( l < r );
+ $trimmableText.text( trimmableText.substr( 0, l ) + '...' );
+ break;
+ case 'center':
+ // TODO: Use binary search like for 'right'
+ var i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
+ var side = 1; // Begin with making the end shorter
+ while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
+ $trimmableText.text( trimmableText.substr( 0, i[0] ) + '...' + trimmableText.substr( i[1] ) );
+ // Alternate between trimming the end and begining
+ if ( side == 0 ) {
+ // Make the begining shorter
+ i[0]--;
+ side = 1;
+ } else {
+ // Make the end shorter
+ i[1]++;
+ side = 0;
+ }
+ }
+ break;
+ case 'left':
+ // TODO: Use binary search like for 'right'
+ var r = 0;
+ while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
+ $trimmableText.text( '...' + trimmableText.substr( r ) );
+ r++;
+ }
+ break;
+ }
+ }
+ if ( options.tooltip ) {
+ $container.attr( 'title', text );
+ }
+ if ( options.matchText ) {
+ $container.highlightText( options.matchText );
+ matchTextCache[text][options.matchText][w] = $container.html();
+ } else {
+ cache[text][w] = $container.html();
+ }
+
+ } );
+};
+
+} )( jQuery ); \ No newline at end of file
diff --git a/resources/jquery/jquery.checkboxShiftClick.js b/resources/jquery/jquery.checkboxShiftClick.js
new file mode 100644
index 00000000..b2fcb6ef
--- /dev/null
+++ b/resources/jquery/jquery.checkboxShiftClick.js
@@ -0,0 +1,28 @@
+/**
+ * jQuery checkboxShiftClick
+ *
+ * This will enable checkboxes to be checked or unchecked in a row by clicking one, holding shift and clicking another one
+ *
+ * @author Krinkle <krinklemail@gmail.com>
+ * @license GPL v2
+ */
+( function( $ ) {
+jQuery.fn.checkboxShiftClick = function( text ) {
+ var prevCheckbox = null;
+ var $box = this;
+ // When our boxes are clicked..
+ $box.click(function (e) {
+ // And one has been clicked before...
+ if (prevCheckbox !== null && e.shiftKey) {
+ // Check or uncheck this one and all in-between checkboxes
+ $box.slice(
+ Math.min($box.index(prevCheckbox), $box.index(e.target)),
+ Math.max($box.index(prevCheckbox), $box.index(e.target)) + 1
+ ).attr({checked: e.target.checked ? 'checked' : ''});
+ }
+ // Either way, update the prevCheckbox variable to the one clicked now
+ prevCheckbox = e.target;
+ });
+ return $box;
+};
+} )( jQuery ); \ No newline at end of file
diff --git a/resources/jquery/jquery.client.js b/resources/jquery/jquery.client.js
new file mode 100644
index 00000000..4b9f580f
--- /dev/null
+++ b/resources/jquery/jquery.client.js
@@ -0,0 +1,206 @@
+/*
+ * User-agent detection
+ */
+( function( $ ) {
+$.client = new ( function() {
+
+ /* Private Members */
+
+ var profile;
+
+ /* Public Functions */
+
+ /**
+ * Returns an object containing information about the browser
+ *
+ * The resulting client object will be in the following format:
+ * {
+ * 'name': 'firefox',
+ * 'layout': 'gecko',
+ * 'layoutVersion': '20101026',
+ * 'platform': 'linux'
+ * 'version': '3.5.1',
+ * 'versionBase': '3',
+ * 'versionNumber': 3.5,
+ * }
+ */
+ this.profile = function() {
+ // Use the cached version if possible
+ if ( typeof profile === 'undefined' ) {
+
+ /* Configuration */
+
+ // Name of browsers or layout engines we don't recognize
+ var uk = 'unknown';
+ // Generic version digit
+ var x = 'x';
+ // Strings found in user agent strings that need to be conformed
+ var wildUserAgents = [ 'Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'];
+ // Translations for conforming user agent strings
+ var userAgentTranslations = [
+ // Tons of browsers lie about being something they are not
+ [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
+ // Chrome lives in the shadow of Safari still
+ ['Chrome Safari', 'Chrome'],
+ // KHTML is the layout engine not the browser - LIES!
+ ['KHTML', 'Konqueror'],
+ // Firefox nightly builds
+ ['Minefield', 'Firefox'],
+ // This helps keep differnt versions consistent
+ ['Navigator', 'Netscape'],
+ // This prevents version extraction issues, otherwise translation would happen later
+ ['PLAYSTATION 3', 'PS3'],
+ ];
+ // Strings which precede a version number in a user agent string - combined and used as match 1 in
+ // version detectection
+ var versionPrefixes = [
+ 'camino', 'chrome', 'firefox', 'netscape', 'netscape6', 'opera', 'version', 'konqueror', 'lynx',
+ 'msie', 'safari', 'ps3'
+ ];
+ // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
+ var versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)';
+ // Names of known browsers
+ var names = [
+ 'camino', 'chrome', 'firefox', 'netscape', 'konqueror', 'lynx', 'msie', 'opera', 'safari', 'ipod',
+ 'iphone', 'blackberry', 'ps3'
+ ];
+ // Tanslations for conforming browser names
+ var nameTranslations = [];
+ // Names of known layout engines
+ var layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'];
+ // Translations for conforming layout names
+ var layoutTranslations = [['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto']];
+ // Names of supported layout engines for version number
+ var layoutVersions = ['applewebkit', 'gecko'];
+ // Names of known operating systems
+ var platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'];
+ // Translations for conforming operating system names
+ var platformTranslations = [['sunos', 'solaris']];
+
+ /* Methods */
+
+ // Performs multiple replacements on a string
+ function translate( source, translations ) {
+ for ( var i = 0; i < translations.length; i++ ) {
+ source = source.replace( translations[i][0], translations[i][1] );
+ }
+ return source;
+ };
+
+ /* Pre-processing */
+
+ var userAgent = navigator.userAgent, match, name = uk, layout = uk, layoutversion = uk, platform = uk, version = x;
+ if ( match = new RegExp( '(' + wildUserAgents.join( '|' ) + ')' ).exec( userAgent ) ) {
+ // Takes a userAgent string and translates given text into something we can more easily work with
+ userAgent = translate( userAgent, userAgentTranslations );
+ }
+ // Everything will be in lowercase from now on
+ userAgent = userAgent.toLowerCase();
+
+ /* Extraction */
+
+ if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( userAgent ) ) {
+ name = translate( match[1], nameTranslations );
+ }
+ if ( match = new RegExp( '(' + layouts.join( '|' ) + ')' ).exec( userAgent ) ) {
+ layout = translate( match[1], layoutTranslations );
+ }
+ if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\\/(\\d+)').exec( navigator.userAgent.toLowerCase() ) ) {
+ layoutversion = parseInt(match[2]);
+ }
+ if ( match = new RegExp( '(' + platforms.join( '|' ) + ')' ).exec( navigator.platform.toLowerCase() ) ) {
+ platform = translate( match[1], platformTranslations );
+ }
+ if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( userAgent ) ) {
+ version = match[3];
+ }
+
+ /* Edge Cases -- did I mention about how user agent string lie? */
+
+ // Decode Safari's crazy 400+ version numbers
+ if ( name.match( /safari/ ) && version > 400 ) {
+ version = '2.0';
+ }
+ // Expose Opera 10's lies about being Opera 9.8
+ if ( name === 'opera' && version >= 9.8) {
+ version = userAgent.match( /version\/([0-9\.]*)/i )[1] || 10;
+ }
+
+ /* Caching */
+
+ profile = {
+ 'name': name,
+ 'layout': layout,
+ 'layoutVersion': layoutversion,
+ 'platform': platform,
+ 'version': version,
+ 'versionBase': ( version !== x ? new String( version ).substr( 0, 1 ) : x ),
+ 'versionNumber': ( parseFloat( version, 10 ) || 0.0 )
+ };
+ }
+ return profile;
+ };
+
+ /**
+ * Checks the current browser against a support map object to determine if the browser has been black-listed or
+ * not. If the browser was not configured specifically it is assumed to work. It is assumed that the body
+ * element is classified as either "ltr" or "rtl". If neither is set, "ltr" is assumed.
+ *
+ * A browser map is in the following format:
+ * {
+ * 'ltr': {
+ * // Multiple rules with configurable operators
+ * 'msie': [['>=', 7], ['!=', 9]],
+ * // Blocked entirely
+ * 'iphone': false
+ * },
+ * 'rtl': {
+ * // Test against a string
+ * 'msie': [['!==', '8.1.2.3']],
+ * // RTL rules do not fall through to LTR rules, you must explicity set each of them
+ * 'iphone': false
+ * }
+ * }
+ *
+ * @param map Object of browser support map
+ *
+ * @return Boolean true if browser known or assumed to be supported, false if blacklisted
+ */
+ this.test = function( map ) {
+ var profile = jQuery.client.profile();
+ var dir = jQuery( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+ // Check over each browser condition to determine if we are running in a compatible client
+ if ( typeof map[dir] !== 'object' || typeof map[dir][profile.name] === 'undefined' ) {
+ // Unknown, so we assume it's working
+ return true;
+ }
+ var name = map[dir][profile.name];
+ for ( var condition in name ) {
+ var op = name[condition][0];
+ var val = name[condition][1];
+ if ( val === false ) {
+ return false;
+ } else if ( typeof val == 'string' ) {
+ if ( !( eval( 'profile.version' + op + '"' + val + '"' ) ) ) {
+ return false;
+ }
+ } else if ( typeof val == 'number' ) {
+ if ( !( eval( 'profile.versionNumber' + op + val ) ) ) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+} )();
+
+$( document ).ready( function() {
+ var profile = $.client.profile();
+ $( 'html' )
+ .addClass( 'client-' + profile.name )
+ .addClass( 'client-' + profile.name + '-' + profile.versionBase )
+ .addClass( 'client-' + profile.layout )
+ .addClass( 'client-' + profile.platform );
+} );
+
+} )( jQuery );
diff --git a/resources/jquery/jquery.collapsibleTabs.js b/resources/jquery/jquery.collapsibleTabs.js
new file mode 100644
index 00000000..b2399727
--- /dev/null
+++ b/resources/jquery/jquery.collapsibleTabs.js
@@ -0,0 +1,117 @@
+/*
+ * Collapsible tabs jQuery Plugin
+ */
+( function( $ ) {
+ $.fn.collapsibleTabs = function( options ) {
+ // return if the function is called on an empty jquery object
+ if( !this.length ) return this;
+ //merge options into the defaults
+ var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+ this.each( function() {
+ var $this = $( this );
+ // add the element to our array of collapsible managers
+ $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length == 0 ?
+ $this : $.collapsibleTabs.instances.add( $this ) );
+ // attach the settings to the elements
+ $this.data( 'collapsibleTabsSettings', $settings );
+ // attach data to our collapsible elements
+ $this.children( $settings.collapsible ).each( function() {
+ $.collapsibleTabs.addData( $( this ) );
+ } );
+ } );
+
+ // if we haven't already bound our resize hanlder, bind it now
+ if( !$.collapsibleTabs.boundEvent ) {
+ $( window )
+ .delayedBind( '500', 'resize', function( ) { $.collapsibleTabs.handleResize(); } );
+ }
+ // call our resize handler to setup the page
+ $.collapsibleTabs.handleResize();
+ return this;
+ };
+ $.collapsibleTabs = {
+ instances: [],
+ boundEvent: null,
+ defaults: {
+ expandedContainer: '#p-views ul',
+ collapsedContainer: '#p-cactions ul',
+ collapsible: 'li.collapsible',
+ shifting: false,
+ expandCondition: function( eleWidth ) {
+ return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
+ < ( $( '#right-navigation' ).position().left - eleWidth );
+ },
+ collapseCondition: function() {
+ return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
+ > $( '#right-navigation' ).position().left;
+ }
+ },
+ addData: function( $collapsible ) {
+ var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+ if ( $settings != null ) {
+ $collapsible.data( 'collapsibleTabsSettings', {
+ 'expandedContainer': $settings.expandedContainer,
+ 'collapsedContainer': $settings.collapsedContainer,
+ 'expandedWidth': $collapsible.width(),
+ 'prevElement': $collapsible.prev()
+ } );
+ }
+ },
+ getSettings: function( $collapsible ) {
+ var $settings = $collapsible.data( 'collapsibleTabsSettings' );
+ if ( typeof $settings == 'undefined' ) {
+ $.collapsibleTabs.addData( $collapsible );
+ $settings = $collapsible.data( 'collapsibleTabsSettings' );
+ }
+ return $settings;
+ },
+ handleResize: function( e ){
+ $.collapsibleTabs.instances.each( function() {
+ var $this = $( this ), data = $.collapsibleTabs.getSettings( $this );
+ if( data.shifting ) return;
+
+ // if the two navigations are colliding
+ if( $this.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+ $this.trigger( "beforeTabCollapse" );
+ // move the element to the dropdown menu
+ $.collapsibleTabs.moveToCollapsed( $this.children( data.collapsible + ':last' ) );
+ }
+
+ // if there are still moveable items in the dropdown menu,
+ // and there is sufficient space to place them in the tab container
+ if( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
+ && data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+ data.collapsible+":first" ) ).expandedWidth ) ) {
+ //move the element from the dropdown to the tab
+ $this.trigger( "beforeTabExpand" );
+ $.collapsibleTabs
+ .moveToExpanded( data.collapsedContainer + " " + data.collapsible + ':first' );
+ }
+ });
+ },
+ moveToCollapsed: function( ele ) {
+ var $moving = $( ele );
+ var data = $.collapsibleTabs.getSettings( $moving );
+ var dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
+ dataExp.shifting = true;
+ $moving
+ .detach()
+ .prependTo( data.collapsedContainer )
+ .data( 'collapsibleTabsSettings', data );
+ dataExp.shifting = false;
+ $.collapsibleTabs.handleResize();
+ },
+ moveToExpanded: function( ele ) {
+ var $moving = $( ele );
+ var data = $.collapsibleTabs.getSettings( $moving );
+ var dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
+ dataExp.shifting = true;
+ // remove this element from where it's at and put it in the dropdown menu
+ $moving.detach().insertAfter( data.prevElement ).data( 'collapsibleTabsSettings', data );
+ dataExp.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ };
+} )( jQuery );
diff --git a/resources/jquery/jquery.color.js b/resources/jquery/jquery.color.js
new file mode 100644
index 00000000..e1b0d0dd
--- /dev/null
+++ b/resources/jquery/jquery.color.js
@@ -0,0 +1,123 @@
+/*
+ * jQuery Color Animations
+ * Copyright 2007 John Resig
+ * Released under the MIT and GPL licenses.
+ */
+
+(function(jQuery){
+
+ // We override the animation for all of these color styles
+ jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
+ jQuery.fx.step[attr] = function(fx){
+ if ( fx.state == 0 ) {
+ fx.start = getColor( fx.elem, attr );
+ fx.end = getRGB( fx.end );
+ }
+
+ fx.elem.style[attr] = "rgb(" + [
+ Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
+ Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
+ Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
+ ].join(",") + ")";
+ }
+ });
+
+ // Color Conversion functions from highlightFade
+ // By Blair Mitchelmore
+ // http://jquery.offput.ca/highlightFade/
+
+ // Parse strings looking for color tuples [255,255,255]
+ function getRGB(color) {
+ var result;
+
+ // Check if we're already dealing with an array of colors
+ if ( color && color.constructor == Array && color.length == 3 )
+ return color;
+
+ // Look for rgb(num,num,num)
+ if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+ return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];
+
+ // Look for rgb(num%,num%,num%)
+ if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec(color))
+ return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+ // Look for #a0b1c2
+ if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+ return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+ // Look for #fff
+ if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+ return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+ // Otherwise, we're most likely dealing with a named color
+ return colors[jQuery.trim(color).toLowerCase()];
+ }
+
+ function getColor(elem, attr) {
+ var color;
+
+ do {
+ color = jQuery.curCSS(elem, attr);
+
+ // Keep going until we find an element that has color, or we hit the body
+ if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
+ break;
+
+ attr = "backgroundColor";
+ } while ( elem = elem.parentNode );
+
+ return getRGB(color);
+ };
+
+ // Some named colors to work with
+ // From Interface by Stefan Petre
+ // http://interface.eyecon.ro/
+
+ var colors = {
+ aqua:[0,255,255],
+ azure:[240,255,255],
+ beige:[245,245,220],
+ black:[0,0,0],
+ blue:[0,0,255],
+ brown:[165,42,42],
+ cyan:[0,255,255],
+ darkblue:[0,0,139],
+ darkcyan:[0,139,139],
+ darkgrey:[169,169,169],
+ darkgreen:[0,100,0],
+ darkkhaki:[189,183,107],
+ darkmagenta:[139,0,139],
+ darkolivegreen:[85,107,47],
+ darkorange:[255,140,0],
+ darkorchid:[153,50,204],
+ darkred:[139,0,0],
+ darksalmon:[233,150,122],
+ darkviolet:[148,0,211],
+ fuchsia:[255,0,255],
+ gold:[255,215,0],
+ green:[0,128,0],
+ indigo:[75,0,130],
+ khaki:[240,230,140],
+ lightblue:[173,216,230],
+ lightcyan:[224,255,255],
+ lightgreen:[144,238,144],
+ lightgrey:[211,211,211],
+ lightpink:[255,182,193],
+ lightyellow:[255,255,224],
+ lime:[0,255,0],
+ magenta:[255,0,255],
+ maroon:[128,0,0],
+ navy:[0,0,128],
+ olive:[128,128,0],
+ orange:[255,165,0],
+ pink:[255,192,203],
+ purple:[128,0,128],
+ violet:[128,0,128],
+ red:[255,0,0],
+ silver:[192,192,192],
+ white:[255,255,255],
+ yellow:[255,255,0]
+ };
+
+})(jQuery);
diff --git a/resources/jquery/jquery.cookie.js b/resources/jquery/jquery.cookie.js
new file mode 100644
index 00000000..eaa254e5
--- /dev/null
+++ b/resources/jquery/jquery.cookie.js
@@ -0,0 +1,89 @@
+/*jslint browser: true */ /*global jQuery: true */
+
+/**
+ * jQuery Cookie plugin
+ *
+ * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+
+// TODO JsDoc
+
+/**
+ * Create a cookie with the given key and value and other optional parameters.
+ *
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Set the value of a cookie.
+ * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
+ * @desc Create a cookie with all available options.
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Create a session cookie.
+ * @example $.cookie('the_cookie', null);
+ * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
+ * used when the cookie was set.
+ *
+ * @param key String The key of the cookie.
+ * @param value String The value of the cookie.
+ * @param options Object An object literal containing key/value pairs to provide optional cookie attributes.
+ * @option expires Number|Date Either an integer specifying the expiration date from now on in days or a Date object.
+ * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+ * If set to null or omitted, the cookie will be a session cookie and will not be retained
+ * when the the browser exits.
+ * @option path String The value of the path atribute of the cookie (default: path of page that created the cookie).
+ * @option domain String The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+ * @option secure Boolean If true, the secure attribute of the cookie will be set and the cookie transmission will
+ * require a secure protocol (like HTTPS).
+ * @type undefined
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+
+/**
+ * Get the value of a cookie with the given key.
+ *
+ * @example $.cookie('the_cookie');
+ * @desc Get the value of a cookie.
+ *
+ * @param key String The key of the cookie.
+ * @return The value of the cookie.
+ * @type String
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+jQuery.cookie = function (key, value, options) {
+
+ // key and value given, set cookie...
+ if (arguments.length > 1 && (value === null || typeof value !== "object")) {
+ options = jQuery.extend({}, options);
+
+ if (value === null) {
+ options.expires = -1;
+ }
+
+ if (typeof options.expires === 'number') {
+ var days = options.expires, t = options.expires = new Date();
+ t.setDate(t.getDate() + days);
+ }
+
+ return (document.cookie = [
+ encodeURIComponent(key), '=',
+ options.raw ? String(value) : encodeURIComponent(String(value)),
+ options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+ options.path ? '; path=' + options.path : '',
+ options.domain ? '; domain=' + options.domain : '',
+ options.secure ? '; secure' : ''
+ ].join(''));
+ }
+
+ // key and possibly options given, get cookie...
+ options = value || {};
+ var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
+ return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
+};
diff --git a/resources/jquery/jquery.delayedBind.js b/resources/jquery/jquery.delayedBind.js
new file mode 100644
index 00000000..6d972996
--- /dev/null
+++ b/resources/jquery/jquery.delayedBind.js
@@ -0,0 +1,68 @@
+(function( $ ) {
+/**
+ * Function that escapes spaces in event names. This is needed because
+ * "_delayedBind-foo bar-1000" refers to two events
+ */
+function encodeEvent( event ) {
+ return event.replace( /-/g, '--' ).replace( / /g, '-' );
+}
+
+$.fn.extend( {
+ /**
+ * Bind a callback to an event in a delayed fashion.
+ * In detail, this means that the callback will be called a certain
+ * time after the event fires, but the timer is reset every time
+ * the event fires.
+ * @param timeout Number of milliseconds to wait
+ * @param event Name of the event (string)
+ * @param data Data to pass to the event handler (optional)
+ * @param callback Function to call
+ */
+ delayedBind: function( timeout, event, data, callback ) {
+ var encEvent = encodeEvent( event );
+ return this.each( function() {
+ var that = this;
+ // Bind the top half
+ // Do this only once for every (event, timeout) pair
+ if ( !( $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout ) ) ) {
+ $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout, true );
+ $(this).bind( event, function() {
+ var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
+ // Cancel the running timer
+ if ( typeof timerID != 'undefined' )
+ clearTimeout( timerID );
+ timerID = setTimeout( function() {
+ $(that).trigger( '_delayedBind-' + encEvent + '-' + timeout );
+ }, timeout );
+ $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
+ } );
+ }
+
+ // Bottom half
+ $(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
+ } );
+ },
+
+ /**
+ * Cancel the timers for delayed events on the selected elements.
+ */
+ delayedBindCancel: function( timeout, event ) {
+ var encEvent = encodeEvent( event );
+ return this.each( function() {
+ var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
+ if ( typeof timerID != 'undefined' )
+ clearTimeout( timerID );
+ } );
+ },
+
+ /**
+ * Unbind an event bound with delayedBind()
+ */
+ delayedBindUnbind: function( timeout, event, callback ) {
+ var encEvent = encodeEvent( event );
+ return this.each( function() {
+ $(this).unbind( '_delayedBind-' + encEvent + '-' + timeout, callback );
+ } );
+ }
+} );
+} )( jQuery ); \ No newline at end of file
diff --git a/resources/jquery/jquery.expandableField.js b/resources/jquery/jquery.expandableField.js
new file mode 100644
index 00000000..ebe29a41
--- /dev/null
+++ b/resources/jquery/jquery.expandableField.js
@@ -0,0 +1,129 @@
+/**
+ * This plugin provides functionallity to expand a text box on focus to double it's current width
+ *
+ * Usage:
+ *
+ * Set options:
+ * $('#textbox').expandableField( { option1: value1, option2: value2 } );
+ * $('#textbox').expandableField( option, value );
+ * Get option:
+ * value = $('#textbox').expandableField( option );
+ * Initialize:
+ * $('#textbox').expandableField();
+ *
+ * Options:
+ *
+ */
+( function( $ ) {
+
+$.expandableField = {
+ /**
+ * Expand the field, make the callback
+ */
+ expandField: function( e, context ) {
+ context.config.beforeExpand.call( context.data.$field, context );
+ context.data.$field
+ .animate( { 'width': context.data.expandedWidth }, 'fast', function() {
+ context.config.afterExpand.call( this, context );
+ } );
+ },
+ /**
+ * Condense the field, make the callback
+ */
+ condenseField: function( e, context ) {
+ context.config.beforeCondense.call( context.data.$field, context );
+ context.data.$field
+ .animate( { 'width': context.data.condensedWidth }, 'fast', function() {
+ context.config.afterCondense.call( this, context );
+ } );
+ },
+ /**
+ * Sets the value of a property, and updates the widget accordingly
+ * @param property String Name of property
+ * @param value Mixed Value to set property with
+ */
+ configure: function( context, property, value ) {
+ // Validate creation using fallback values
+ switch( property ) {
+ default:
+ context.config[property] = value;
+ break;
+ }
+ }
+
+};
+$.fn.expandableField = function() {
+
+ // Multi-context fields
+ var returnValue = null;
+ var args = arguments;
+
+ $( this ).each( function() {
+
+ /* Construction / Loading */
+
+ var context = $( this ).data( 'expandableField-context' );
+ if ( context == null ) {
+ context = {
+ config: {
+ // callback function for before collapse
+ 'beforeCondense': function( context ) {},
+ // callback function for before expand
+ 'beforeExpand': function( context ) {},
+ // callback function for after collapse
+ 'afterCondense': function( context ) {},
+ // callback function for after expand
+ 'afterExpand': function( context ) {},
+ // Whether the field should expand to the left or the right -- defaults to left
+ 'expandToLeft': true
+ }
+ };
+ }
+
+ /* API */
+ // Handle various calling styles
+ if ( args.length > 0 ) {
+ if ( typeof args[0] == 'object' ) {
+ // Apply set of properties
+ for ( var key in args[0] ) {
+ $.expandableField.configure( context, key, args[0][key] );
+ }
+ } else if ( typeof args[0] == 'string' ) {
+ if ( args.length > 1 ) {
+ // Set property values
+ $.expandableField.configure( context, args[0], args[1] );
+ } else if ( returnValue == null ) {
+ // Get property values, but don't give access to internal data - returns only the first
+ returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+ }
+ }
+ }
+
+ /* Initialization */
+
+ if ( typeof context.data == 'undefined' ) {
+ context.data = {
+ // The width of the field in it's condensed state
+ 'condensedWidth': $( this ).width(),
+ // The width of the field in it's expanded state
+ 'expandedWidth': $( this ).width() * 2,
+ // Reference to the field
+ '$field': $( this )
+ };
+
+ $( this )
+ .addClass( 'expandableField' )
+ .focus( function( e ) {
+ $.expandableField.expandField( e, context );
+ } )
+ .delayedBind( 250, 'blur', function( e ) {
+ $.expandableField.condenseField( e, context );
+ } );
+ }
+ // Store the context for next time
+ $( this ).data( 'expandableField-context', context );
+ } );
+ return returnValue !== null ? returnValue : $(this);
+};
+
+} )( jQuery );
diff --git a/resources/jquery/jquery.highlightText.js b/resources/jquery/jquery.highlightText.js
new file mode 100644
index 00000000..7ca29efd
--- /dev/null
+++ b/resources/jquery/jquery.highlightText.js
@@ -0,0 +1,62 @@
+/**
+ * Plugin that highlights matched word partials in a given element
+ * TODO: add a function for restoring the previous text
+ * TODO: accept mappings for converting shortcuts like WP: to Wikipedia:
+ */
+( function( $ ) {
+
+$.highlightText = {
+
+ // Split our pattern string at spaces and run our highlight function on the results
+ splitAndHighlight: function( node, pat ) {
+ var patArray = pat.split(" ");
+ for ( var i = 0; i < patArray.length; i++ ) {
+ if ( patArray[i].length == 0 ) continue;
+ $.highlightText.innerHighlight( node, patArray[i] );
+ }
+ return node;
+ },
+ // scans a node looking for the pattern and wraps a span around each match
+ innerHighlight: function( node, pat ) {
+ // if this is a text node
+ if ( node.nodeType == 3 ) {
+ // TODO - need to be smarter about the character matching here.
+ // non latin characters can make regex think a new word has begun.
+ // look for an occurence of our pattern and store the starting position
+ var pos = node.data.search( new RegExp( "\\b" + $.escapeRE( pat ), "i" ) );
+ if ( pos >= 0 ) {
+ // create the span wrapper for the matched text
+ var spannode = document.createElement( 'span' );
+ spannode.className = 'highlight';
+ // shave off the characters preceding the matched text
+ var middlebit = node.splitText( pos );
+ // shave off any unmatched text off the end
+ middlebit.splitText( pat.length );
+ // clone for appending to our span
+ var middleclone = middlebit.cloneNode( true );
+ // append the matched text node to the span
+ spannode.appendChild( middleclone );
+ // replace the matched node, with our span-wrapped clone of the matched node
+ middlebit.parentNode.replaceChild( spannode, middlebit );
+ }
+ // if this is an element with childnodes, and not a script, style or an element we created
+ } else if ( node.nodeType == 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
+ && !( node.tagName.toLowerCase() == 'span' && node.className.match( /\bhighlight/ ) ) ) {
+ for ( var i = 0; i < node.childNodes.length; ++i ) {
+ // call the highlight function for each child node
+ $.highlightText.innerHighlight( node.childNodes[i], pat );
+ }
+ }
+ }
+};
+
+$.fn.highlightText = function( matchString ) {
+ return $( this ).each( function() {
+ var $this = $( this );
+ $this.data( 'highlightText', { originalText: $this.text() } );
+ $.highlightText.splitAndHighlight( this, matchString );
+ } );
+};
+
+} )( jQuery );
+
diff --git a/resources/jquery/jquery.js b/resources/jquery/jquery.js
new file mode 100644
index 00000000..27456efd
--- /dev/null
+++ b/resources/jquery/jquery.js
@@ -0,0 +1,6240 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function( window, undefined ) {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // A simple way to check for HTML strings or ID strings
+ // (both of which we optimize for)
+ quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
+
+ // Is it a simple selector
+ isSimple = /^.[^:#\[\.,]*$/,
+
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
+
+ // Used for trimming whitespace
+ rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+ // Keep a UserAgent string for use with jQuery.browser
+ userAgent = navigator.userAgent,
+
+ // For matching the engine and version of the browser
+ browserMatch,
+
+ // Has the ready events already been bound?
+ readyBound = false,
+
+ // The functions to execute on DOM ready
+ readyList = [],
+
+ // The ready event handler
+ DOMContentLoaded,
+
+ // Save a reference to some core methods
+ toString = Object.prototype.toString,
+ hasOwnProperty = Object.prototype.hasOwnProperty,
+ push = Array.prototype.push,
+ slice = Array.prototype.slice,
+ indexOf = Array.prototype.indexOf;
+
+jQuery.fn = jQuery.prototype = {
+ init: function( selector, context ) {
+ var match, elem, ret, doc;
+
+ // Handle $(""), $(null), or $(undefined)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // The body element only exists once, optimize finding it
+ if ( selector === "body" && !context ) {
+ this.context = document;
+ this[0] = document.body;
+ this.selector = "body";
+ this.length = 1;
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ // Are we dealing with HTML string or an ID?
+ match = quickExpr.exec( selector );
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ doc = (context ? context.ownerDocument || context : document);
+
+ // If a single string is passed in and it's a single tag
+ // just do a createElement and skip the rest
+ ret = rsingleTag.exec( selector );
+
+ if ( ret ) {
+ if ( jQuery.isPlainObject( context ) ) {
+ selector = [ document.createElement( ret[1] ) ];
+ jQuery.fn.attr.call( selector, context, true );
+
+ } else {
+ selector = [ doc.createElement( ret[1] ) ];
+ }
+
+ } else {
+ ret = buildFragment( [ match[1] ], [ doc ] );
+ selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
+ }
+
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $("#id")
+ } else {
+ elem = document.getElementById( match[2] );
+
+ if ( elem ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $("TAG")
+ } else if ( !context && /^\w+$/.test( selector ) ) {
+ this.selector = selector;
+ this.context = document;
+ selector = document.getElementsByTagName( selector );
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return (context || rootjQuery).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return jQuery( context ).find( selector );
+ }
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if (selector.selector !== undefined) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The current version of jQuery being used
+ jquery: "1.4.2",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return slice.call( this, 0 );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems, name, selector ) {
+ // Build a new jQuery matched element set
+ var ret = jQuery();
+
+ if ( jQuery.isArray( elems ) ) {
+ push.apply( ret, elems );
+
+ } else {
+ jQuery.merge( ret, elems );
+ }
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ ret.context = this.context;
+
+ if ( name === "find" ) {
+ ret.selector = this.selector + (this.selector ? " " : "") + selector;
+ } else if ( name ) {
+ ret.selector = this.selector + "." + name + "(" + selector + ")";
+ }
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Attach the listeners
+ jQuery.bindReady();
+
+ // If the DOM is already ready
+ if ( jQuery.isReady ) {
+ // Execute the function immediately
+ fn.call( document, jQuery );
+
+ // Otherwise, remember the function for later
+ } else if ( readyList ) {
+ // Add the function to the wait list
+ readyList.push( fn );
+ }
+
+ return this;
+ },
+
+ eq: function( i ) {
+ return i === -1 ?
+ this.slice( i ) :
+ this.slice( i, +i + 1 );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ),
+ "slice", slice.call(arguments).join(",") );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || jQuery(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ // copy reference to target object
+ var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging object literal values or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
+ var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
+ : jQuery.isArray(copy) ? [] : {};
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ window.$ = _$;
+
+ if ( deep ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // Handle when the DOM is ready
+ ready: function() {
+ // Make sure that the DOM is not already loaded
+ if ( !jQuery.isReady ) {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready, 13 );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If there are functions bound, to execute
+ if ( readyList ) {
+ // Execute all of them
+ var fn, i = 0;
+ while ( (fn = readyList[ i++ ]) ) {
+ fn.call( document, jQuery );
+ }
+
+ // Reset the list of functions
+ readyList = null;
+ }
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ }
+ }
+ },
+
+ bindReady: function() {
+ if ( readyBound ) {
+ return;
+ }
+
+ readyBound = true;
+
+ // Catch cases where $(document).ready() is called after the
+ // browser event has already occurred.
+ if ( document.readyState === "complete" ) {
+ return jQuery.ready();
+ }
+
+ // Mozilla, Opera and webkit nightlies currently support this event
+ if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", jQuery.ready, false );
+
+ // If IE event model is used
+ } else if ( document.attachEvent ) {
+ // ensure firing before onload,
+ // maybe late but safe also for iframes
+ document.attachEvent("onreadystatechange", DOMContentLoaded);
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", jQuery.ready );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var toplevel = false;
+
+ try {
+ toplevel = window.frameElement == null;
+ } catch(e) {}
+
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
+ }
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return toString.call(obj) === "[object Function]";
+ },
+
+ isArray: function( obj ) {
+ return toString.call(obj) === "[object Array]";
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
+ return false;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor
+ && !hasOwnProperty.call(obj, "constructor")
+ && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwnProperty.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw msg;
+ },
+
+ parseJSON: function( data ) {
+ if ( typeof data !== "string" || !data ) {
+ return null;
+ }
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
+
+ // Try to use the native JSON parser first
+ return window.JSON && window.JSON.parse ?
+ window.JSON.parse( data ) :
+ (new Function("return " + data))();
+
+ } else {
+ jQuery.error( "Invalid JSON: " + data );
+ }
+ },
+
+ noop: function() {},
+
+ // Evalulates a script in a global context
+ globalEval: function( data ) {
+ if ( data && rnotwhite.test(data) ) {
+ // Inspired by code by Andrea Giammarchi
+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
+ script = document.createElement("script");
+
+ script.type = "text/javascript";
+
+ if ( jQuery.support.scriptEval ) {
+ script.appendChild( document.createTextNode( data ) );
+ } else {
+ script.text = data;
+ }
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709).
+ head.insertBefore( script, head.firstChild );
+ head.removeChild( script );
+ }
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0,
+ length = object.length,
+ isObj = length === undefined || jQuery.isFunction(object);
+
+ if ( args ) {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.apply( object[ name ], args ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.apply( object[ i++ ], args ) === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( var value = object[0];
+ i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
+ }
+ }
+
+ return object;
+ },
+
+ trim: function( text ) {
+ return (text || "").replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( array, results ) {
+ var ret = results || [];
+
+ if ( array != null ) {
+ // The window, strings (and functions) also have 'length'
+ // The extra typeof function check is to prevent crashes
+ // in Safari 2 (See: #3039)
+ if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
+ push.call( ret, array );
+ } else {
+ jQuery.merge( ret, array );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array ) {
+ if ( array.indexOf ) {
+ return array.indexOf( elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var i = first.length, j = 0;
+
+ if ( typeof second.length === "number" ) {
+ for ( var l = second.length; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var ret = [];
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ if ( !inv !== !callback( elems[ i ], i ) ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var ret = [], value;
+
+ // Go through the array, translating each of the items to their
+ // new value (or values).
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ return ret.concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ proxy: function( fn, proxy, thisObject ) {
+ if ( arguments.length === 2 ) {
+ if ( typeof proxy === "string" ) {
+ thisObject = fn;
+ fn = thisObject[ proxy ];
+ proxy = undefined;
+
+ } else if ( proxy && !jQuery.isFunction( proxy ) ) {
+ thisObject = proxy;
+ proxy = undefined;
+ }
+ }
+
+ if ( !proxy && fn ) {
+ proxy = function() {
+ return fn.apply( thisObject || this, arguments );
+ };
+ }
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ if ( fn ) {
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+ }
+
+ // So proxy can be declared as an argument
+ return proxy;
+ },
+
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
+ uaMatch: function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+ /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
+ /(msie) ([\w.]+)/.exec( ua ) ||
+ !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ },
+
+ browser: {}
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+ jQuery.browser[ browserMatch.browser ] = true;
+ jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+ jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+ jQuery.inArray = function( elem, array ) {
+ return indexOf.call( array, elem );
+ };
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+ DOMContentLoaded = function() {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ };
+
+} else if ( document.attachEvent ) {
+ DOMContentLoaded = function() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( document.readyState === "complete" ) {
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+ if ( jQuery.isReady ) {
+ return;
+ }
+
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch( error ) {
+ setTimeout( doScrollCheck, 1 );
+ return;
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+}
+
+function evalScript( i, elem ) {
+ if ( elem.src ) {
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
+ } else {
+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+}
+
+// Mutifunctional method to get and set values to a collection
+// The value/s can be optionally by executed if its a function
+function access( elems, key, value, exec, fn, pass ) {
+ var length = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for ( var k in key ) {
+ access( elems, k, key[k], exec, fn, value );
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = !pass && exec && jQuery.isFunction(value);
+
+ for ( var i = 0; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+
+ return elems;
+ }
+
+ // Getting an attribute
+ return length ? fn( elems[0], key ) : undefined;
+}
+
+function now() {
+ return (new Date).getTime();
+}
+(function() {
+
+ jQuery.support = {};
+
+ var root = document.documentElement,
+ script = document.createElement("script"),
+ div = document.createElement("div"),
+ id = "script" + now();
+
+ div.style.display = "none";
+ div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+ var all = div.getElementsByTagName("*"),
+ a = div.getElementsByTagName("a")[0];
+
+ // Can't get basic test support
+ if ( !all || !all.length || !a ) {
+ return;
+ }
+
+ jQuery.support = {
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: div.firstChild.nodeType === 3,
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName("tbody").length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName("link").length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText insted)
+ style: /red/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: a.getAttribute("href") === "/a",
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.55$/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Make sure that if no value is specified for a checkbox
+ // that it defaults to "on".
+ // (WebKit defaults to "" instead)
+ checkOn: div.getElementsByTagName("input")[0].value === "on",
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
+
+ parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
+
+ // Will be defined later
+ deleteExpando: true,
+ checkClone: false,
+ scriptEval: false,
+ noCloneEvent: true,
+ boxModel: null
+ };
+
+ script.type = "text/javascript";
+ try {
+ script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+ } catch(e) {}
+
+ root.insertBefore( script, root.firstChild );
+
+ // Make sure that the execution of code works by injecting a script
+ // tag with appendChild/createTextNode
+ // (IE doesn't support this, fails, and uses .text instead)
+ if ( window[ id ] ) {
+ jQuery.support.scriptEval = true;
+ delete window[ id ];
+ }
+
+ // Test to see if it's possible to delete an expando from an element
+ // Fails in Internet Explorer
+ try {
+ delete script.test;
+
+ } catch(e) {
+ jQuery.support.deleteExpando = false;
+ }
+
+ root.removeChild( script );
+
+ if ( div.attachEvent && div.fireEvent ) {
+ div.attachEvent("onclick", function click() {
+ // Cloning a node shouldn't copy over any
+ // bound event handlers (IE does this)
+ jQuery.support.noCloneEvent = false;
+ div.detachEvent("onclick", click);
+ });
+ div.cloneNode(true).fireEvent("onclick");
+ }
+
+ div = document.createElement("div");
+ div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+
+ var fragment = document.createDocumentFragment();
+ fragment.appendChild( div.firstChild );
+
+ // WebKit doesn't clone checked state correctly in fragments
+ jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+ // Figure out if the W3C box model works as expected
+ // document.body must exist before we can do this
+ jQuery(function() {
+ var div = document.createElement("div");
+ div.style.width = div.style.paddingLeft = "1px";
+
+ document.body.appendChild( div );
+ jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+ document.body.removeChild( div ).style.display = 'none';
+
+ div = null;
+ });
+
+ // Technique from Juriy Zaytsev
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+ var eventSupported = function( eventName ) {
+ var el = document.createElement("div");
+ eventName = "on" + eventName;
+
+ var isSupported = (eventName in el);
+ if ( !isSupported ) {
+ el.setAttribute(eventName, "return;");
+ isSupported = typeof el[eventName] === "function";
+ }
+ el = null;
+
+ return isSupported;
+ };
+
+ jQuery.support.submitBubbles = eventSupported("submit");
+ jQuery.support.changeBubbles = eventSupported("change");
+
+ // release memory in IE
+ root = script = div = all = a = null;
+})();
+
+jQuery.props = {
+ "for": "htmlFor",
+ "class": "className",
+ readonly: "readOnly",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ tabindex: "tabIndex",
+ usemap: "useMap",
+ frameborder: "frameBorder"
+};
+var expando = "jQuery" + now(), uuid = 0, windowData = {};
+
+jQuery.extend({
+ cache: {},
+
+ expando:expando,
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ "object": true,
+ "applet": true
+ },
+
+ data: function( elem, name, data ) {
+ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+ return;
+ }
+
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var id = elem[ expando ], cache = jQuery.cache, thisCache;
+
+ if ( !id && typeof name === "string" && data === undefined ) {
+ return null;
+ }
+
+ // Compute a unique ID for the element
+ if ( !id ) {
+ id = ++uuid;
+ }
+
+ // Avoid generating a new cache unless none exists and we
+ // want to manipulate it.
+ if ( typeof name === "object" ) {
+ elem[ expando ] = id;
+ thisCache = cache[ id ] = jQuery.extend(true, {}, name);
+
+ } else if ( !cache[ id ] ) {
+ elem[ expando ] = id;
+ cache[ id ] = {};
+ }
+
+ thisCache = cache[ id ];
+
+ // Prevent overriding the named cache with undefined values
+ if ( data !== undefined ) {
+ thisCache[ name ] = data;
+ }
+
+ return typeof name === "string" ? thisCache[ name ] : thisCache;
+ },
+
+ removeData: function( elem, name ) {
+ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+ return;
+ }
+
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
+
+ // If we want to remove a specific section of the element's data
+ if ( name ) {
+ if ( thisCache ) {
+ // Remove the section of cache data
+ delete thisCache[ name ];
+
+ // If we've removed all the data, remove the element's cache
+ if ( jQuery.isEmptyObject(thisCache) ) {
+ jQuery.removeData( elem );
+ }
+ }
+
+ // Otherwise, we want to remove all of the element's data
+ } else {
+ if ( jQuery.support.deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ }
+
+ // Completely remove the data cache
+ delete cache[ id ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ if ( typeof key === "undefined" && this.length ) {
+ return jQuery.data( this[0] );
+
+ } else if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ var parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ if ( data === undefined && this.length ) {
+ data = jQuery.data( this[0], key );
+ }
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+ } else {
+ return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
+ jQuery.data( this, key, value );
+ });
+ }
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ if ( !elem ) {
+ return;
+ }
+
+ type = (type || "fx") + "queue";
+ var q = jQuery.data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( !data ) {
+ return q || [];
+ }
+
+ if ( !q || jQuery.isArray(data) ) {
+ q = jQuery.data( elem, type, jQuery.makeArray(data) );
+
+ } else {
+ q.push( data );
+ }
+
+ return q;
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ), fn = queue.shift();
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ }
+
+ if ( fn ) {
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift("inprogress");
+ }
+
+ fn.call(elem, function() {
+ jQuery.dequeue(elem, type);
+ });
+ }
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ }
+
+ if ( data === undefined ) {
+ return jQuery.queue( this[0], type );
+ }
+ return this.each(function( i, elem ) {
+ var queue = jQuery.queue( this, type, data );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function() {
+ var elem = this;
+ setTimeout(function() {
+ jQuery.dequeue( elem, type );
+ }, time );
+ });
+ },
+
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ }
+});
+var rclass = /[\n\t]/g,
+ rspace = /\s+/,
+ rreturn = /\r/g,
+ rspecialurl = /href|src|style/,
+ rtype = /(button|input)/i,
+ rfocusable = /(button|input|object|select|textarea)/i,
+ rclickable = /^(a|area)$/i,
+ rradiocheck = /radio|checkbox/;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, name, value, true, jQuery.attr );
+ },
+
+ removeAttr: function( name, fn ) {
+ return this.each(function(){
+ jQuery.attr( this, name, "" );
+ if ( this.nodeType === 1 ) {
+ this.removeAttribute( name );
+ }
+ });
+ },
+
+ addClass: function( value ) {
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.addClass( value.call(this, i, self.attr("class")) );
+ });
+ }
+
+ if ( value && typeof value === "string" ) {
+ var classNames = (value || "").split( rspace );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var elem = this[i];
+
+ if ( elem.nodeType === 1 ) {
+ if ( !elem.className ) {
+ elem.className = value;
+
+ } else {
+ var className = " " + elem.className + " ", setClass = elem.className;
+ for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+ if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+ setClass += " " + classNames[c];
+ }
+ }
+ elem.className = jQuery.trim( setClass );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.removeClass( value.call(this, i, self.attr("class")) );
+ });
+ }
+
+ if ( (value && typeof value === "string") || value === undefined ) {
+ var classNames = (value || "").split(rspace);
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var elem = this[i];
+
+ if ( elem.nodeType === 1 && elem.className ) {
+ if ( value ) {
+ var className = (" " + elem.className + " ").replace(rclass, " ");
+ for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+ className = className.replace(" " + classNames[c] + " ", " ");
+ }
+ elem.className = jQuery.trim( className );
+
+ } else {
+ elem.className = "";
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value, isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className, i = 0, self = jQuery(this),
+ state = stateVal,
+ classNames = value.split( rspace );
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space seperated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ } else if ( type === "undefined" || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery.data( this, "__className__", this.className );
+ }
+
+ // toggle whole className
+ this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ";
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ if ( value === undefined ) {
+ var elem = this[0];
+
+ if ( elem ) {
+ if ( jQuery.nodeName( elem, "option" ) ) {
+ return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+ }
+
+ // We need to handle select boxes special
+ if ( jQuery.nodeName( elem, "select" ) ) {
+ var index = elem.selectedIndex,
+ values = [],
+ options = elem.options,
+ one = elem.type === "select-one";
+
+ // Nothing was selected
+ if ( index < 0 ) {
+ return null;
+ }
+
+ // Loop through all the selected options
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
+
+ if ( option.selected ) {
+ // Get the specifc value for the option
+ value = jQuery(option).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ }
+
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+
+
+ // Everything else, we just grab the value
+ return (elem.value || "").replace(rreturn, "");
+
+ }
+
+ return undefined;
+ }
+
+ var isFunction = jQuery.isFunction(value);
+
+ return this.each(function(i) {
+ var self = jQuery(this), val = value;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call(this, i, self.val());
+ }
+
+ // Typecast each time if the value is a Function and the appended
+ // value is therefore different each time.
+ if ( typeof val === "number" ) {
+ val += "";
+ }
+
+ if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+ this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+ } else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = jQuery.makeArray(val);
+
+ jQuery( "option", this ).each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ this.selectedIndex = -1;
+ }
+
+ } else {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ attrFn: {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true
+ },
+
+ attr: function( elem, name, value, pass ) {
+ // don't set attributes on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ if ( pass && name in jQuery.attrFn ) {
+ return jQuery(elem)[name](value);
+ }
+
+ var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+ // Whether we are setting (or getting)
+ set = value !== undefined;
+
+ // Try to normalize/fix the name
+ name = notxml && jQuery.props[ name ] || name;
+
+ // Only do all the following if this is a node (faster for style)
+ if ( elem.nodeType === 1 ) {
+ // These attributes require special treatment
+ var special = rspecialurl.test( name );
+
+ // Safari mis-reports the default selected property of an option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name === "selected" && !jQuery.support.optSelected ) {
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+
+ // If applicable, access the attribute via the DOM 0 way
+ if ( name in elem && notxml && !special ) {
+ if ( set ) {
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+ jQuery.error( "type property can't be changed" );
+ }
+
+ elem[ name ] = value;
+ }
+
+ // browsers index elements by id/name on forms, give priority to attributes.
+ if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+ return elem.getAttributeNode( name ).nodeValue;
+ }
+
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ if ( name === "tabIndex" ) {
+ var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+ return attributeNode && attributeNode.specified ?
+ attributeNode.value :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+
+ return elem[ name ];
+ }
+
+ if ( !jQuery.support.style && notxml && name === "style" ) {
+ if ( set ) {
+ elem.style.cssText = "" + value;
+ }
+
+ return elem.style.cssText;
+ }
+
+ if ( set ) {
+ // convert the value to a string (all browsers do this but IE) see #1070
+ elem.setAttribute( name, "" + value );
+ }
+
+ var attr = !jQuery.support.hrefNormalized && notxml && special ?
+ // Some attributes require a special call on IE
+ elem.getAttribute( name, 2 ) :
+ elem.getAttribute( name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return attr === null ? undefined : attr;
+ }
+
+ // elem is actually elem.style ... set the style
+ // Using attr for specific style information is now deprecated. Use style instead.
+ return jQuery.style( elem, name, value );
+ }
+});
+var rnamespaces = /\.(.*)$/,
+ fcleanup = function( nm ) {
+ return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
+ return "\\" + ch;
+ });
+ };
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function( elem, types, handler, data ) {
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // For whatever reason, IE has trouble passing the window object
+ // around, causing it to be cloned in the process
+ if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
+ elem = window;
+ }
+
+ var handleObjIn, handleObj;
+
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ }
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure
+ var elemData = jQuery.data( elem );
+
+ // If no elemData is found then we must be trying to bind to one of the
+ // banned noData elements
+ if ( !elemData ) {
+ return;
+ }
+
+ var events = elemData.events = elemData.events || {},
+ eventHandle = elemData.handle, eventHandle;
+
+ if ( !eventHandle ) {
+ elemData.handle = eventHandle = function() {
+ // Handle the second event of a trigger and when
+ // an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+ jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ }
+
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native events in IE.
+ eventHandle.elem = elem;
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ var type, i = 0, namespaces;
+
+ while ( (type = types[ i++ ]) ) {
+ handleObj = handleObjIn ?
+ jQuery.extend({}, handleObjIn) :
+ { handler: handler, data: data };
+
+ // Namespaced event handlers
+ if ( type.indexOf(".") > -1 ) {
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+ } else {
+ namespaces = [];
+ handleObj.namespace = "";
+ }
+
+ handleObj.type = type;
+ handleObj.guid = handler.guid;
+
+ // Get the current list of functions bound to this event
+ var handlers = events[ type ],
+ special = jQuery.event.special[ type ] || {};
+
+ // Init the event handler queue
+ if ( !handlers ) {
+ handlers = events[ type ] = [];
+
+ // Check for a special event handler
+ // Only use addEventListener/attachEvent if the special
+ // events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add the function to the element's handler list
+ handlers.push( handleObj );
+
+ // Keep track of which events have been used, for global triggering
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, pos ) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+ elemData = jQuery.data( elem ),
+ events = elemData && elemData.events;
+
+ if ( !elemData || !events ) {
+ return;
+ }
+
+ // types is actually an event object here
+ if ( types && types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
+
+ // Unbind all events for the element
+ if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+ types = types || "";
+
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types );
+ }
+
+ return;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ while ( (type = types[ i++ ]) ) {
+ origType = type;
+ handleObj = null;
+ all = type.indexOf(".") < 0;
+ namespaces = [];
+
+ if ( !all ) {
+ // Namespaced event handlers
+ namespaces = type.split(".");
+ type = namespaces.shift();
+
+ namespace = new RegExp("(^|\\.)" +
+ jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
+ }
+
+ eventType = events[ type ];
+
+ if ( !eventType ) {
+ continue;
+ }
+
+ if ( !handler ) {
+ for ( var j = 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ jQuery.event.remove( elem, origType, handleObj.handler, j );
+ eventType.splice( j--, 1 );
+ }
+ }
+
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+
+ for ( var j = pos || 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( handler.guid === handleObj.guid ) {
+ // remove the given handler for the given type
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ if ( pos == null ) {
+ eventType.splice( j--, 1 );
+ }
+
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+
+ if ( pos != null ) {
+ break;
+ }
+ }
+ }
+
+ // remove generic event handler if no more handlers exist
+ if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+ removeEvent( elem, type, elemData.handle );
+ }
+
+ ret = null;
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ var handle = elemData.handle;
+ if ( handle ) {
+ handle.elem = null;
+ }
+
+ delete elemData.events;
+ delete elemData.handle;
+
+ if ( jQuery.isEmptyObject( elemData ) ) {
+ jQuery.removeData( elem );
+ }
+ }
+ },
+
+ // bubbling is internal
+ trigger: function( event, data, elem /*, bubbling */ ) {
+ // Event object or event type
+ var type = event.type || event,
+ bubbling = arguments[3];
+
+ if ( !bubbling ) {
+ event = typeof event === "object" ?
+ // jQuery.Event object
+ event[expando] ? event :
+ // Object literal
+ jQuery.extend( jQuery.Event(type), event ) :
+ // Just the event type (string)
+ jQuery.Event(type);
+
+ if ( type.indexOf("!") >= 0 ) {
+ event.type = type = type.slice(0, -1);
+ event.exclusive = true;
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+ // Don't bubble custom events when global (to avoid too much overhead)
+ event.stopPropagation();
+
+ // Only trigger if we've ever bound an event for it
+ if ( jQuery.event.global[ type ] ) {
+ jQuery.each( jQuery.cache, function() {
+ if ( this.events && this.events[type] ) {
+ jQuery.event.trigger( event, data, this.handle.elem );
+ }
+ });
+ }
+ }
+
+ // Handle triggering a single element
+
+ // don't do events on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ // Clean up in case it is reused
+ event.result = undefined;
+ event.target = elem;
+
+ // Clone the incoming data, if any
+ data = jQuery.makeArray( data );
+ data.unshift( event );
+ }
+
+ event.currentTarget = elem;
+
+ // Trigger the event, it is assumed that "handle" is a function
+ var handle = jQuery.data( elem, "handle" );
+ if ( handle ) {
+ handle.apply( elem, data );
+ }
+
+ var parent = elem.parentNode || elem.ownerDocument;
+
+ // Trigger an inline bound script
+ try {
+ if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+ if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+ event.result = false;
+ }
+ }
+
+ // prevent IE from throwing an error for some elements with some event types, see #3533
+ } catch (e) {}
+
+ if ( !event.isPropagationStopped() && parent ) {
+ jQuery.event.trigger( event, data, parent, true );
+
+ } else if ( !event.isDefaultPrevented() ) {
+ var target = event.target, old,
+ isClick = jQuery.nodeName(target, "a") && type === "click",
+ special = jQuery.event.special[ type ] || {};
+
+ if ( (!special._default || special._default.call( elem, event ) === false) &&
+ !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+ try {
+ if ( target[ type ] ) {
+ // Make sure that we don't accidentally re-trigger the onFOO events
+ old = target[ "on" + type ];
+
+ if ( old ) {
+ target[ "on" + type ] = null;
+ }
+
+ jQuery.event.triggered = true;
+ target[ type ]();
+ }
+
+ // prevent IE from throwing an error for some elements with some event types, see #3533
+ } catch (e) {}
+
+ if ( old ) {
+ target[ "on" + type ] = old;
+ }
+
+ jQuery.event.triggered = false;
+ }
+ }
+ },
+
+ handle: function( event ) {
+ var all, handlers, namespaces, namespace, events;
+
+ event = arguments[0] = jQuery.event.fix( event || window.event );
+ event.currentTarget = this;
+
+ // Namespaced event handlers
+ all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+ if ( !all ) {
+ namespaces = event.type.split(".");
+ event.type = namespaces.shift();
+ namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ var events = jQuery.data(this, "events"), handlers = events[ event.type ];
+
+ if ( events && handlers ) {
+ // Clone the handlers to prevent manipulation
+ handlers = handlers.slice(0);
+
+ for ( var j = 0, l = handlers.length; j < l; j++ ) {
+ var handleObj = handlers[ j ];
+
+ // Filter the functions by class
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handleObj.handler;
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ var ret = handleObj.handler.apply( this, arguments );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+ fix: function( event ) {
+ if ( event[ expando ] ) {
+ return event;
+ }
+
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
+ event = jQuery.Event( originalEvent );
+
+ for ( var i = this.props.length, prop; i; ) {
+ prop = this.props[ --i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Fix target property, if necessary
+ if ( !event.target ) {
+ event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+ }
+
+ // check if target is a textnode (safari)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement ) {
+ event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+ }
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var doc = document.documentElement, body = document.body;
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
+ event.which = event.charCode || event.keyCode;
+ }
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey ) {
+ event.metaKey = event.ctrlKey;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button !== undefined ) {
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+ }
+
+ return event;
+ },
+
+ // Deprecated, use jQuery.guid instead
+ guid: 1E8,
+
+ // Deprecated, use jQuery.proxy instead
+ proxy: jQuery.proxy,
+
+ special: {
+ ready: {
+ // Make sure the ready event is setup
+ setup: jQuery.bindReady,
+ teardown: jQuery.noop
+ },
+
+ live: {
+ add: function( handleObj ) {
+ jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) );
+ },
+
+ remove: function( handleObj ) {
+ var remove = true,
+ type = handleObj.origType.replace(rnamespaces, "");
+
+ jQuery.each( jQuery.data(this, "events").live || [], function() {
+ if ( type === this.origType.replace(rnamespaces, "") ) {
+ remove = false;
+ return false;
+ }
+ });
+
+ if ( remove ) {
+ jQuery.event.remove( this, handleObj.origType, liveHandler );
+ }
+ }
+
+ },
+
+ beforeunload: {
+ setup: function( data, namespaces, eventHandle ) {
+ // We only want to do this special case on windows
+ if ( this.setInterval ) {
+ this.onbeforeunload = eventHandle;
+ }
+
+ return false;
+ },
+ teardown: function( namespaces, eventHandle ) {
+ if ( this.onbeforeunload === eventHandle ) {
+ this.onbeforeunload = null;
+ }
+ }
+ }
+ }
+};
+
+var removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ elem.removeEventListener( type, handle, false );
+ } :
+ function( elem, type, handle ) {
+ elem.detachEvent( "on" + type, handle );
+ };
+
+jQuery.Event = function( src ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !this.preventDefault ) {
+ return new jQuery.Event( src );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // timeStamp is buggy for some events on Firefox(#3843)
+ // So we won't rely on the native value
+ this.timeStamp = now();
+
+ // Mark it as fixed
+ this[ expando ] = true;
+};
+
+function returnFalse() {
+ return false;
+}
+function returnTrue() {
+ return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ preventDefault: function() {
+ this.isDefaultPrevented = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+
+ // if preventDefault exists run it on the original event
+ if ( e.preventDefault ) {
+ e.preventDefault();
+ }
+ // otherwise set the returnValue property of the original event to false (IE)
+ e.returnValue = false;
+ },
+ stopPropagation: function() {
+ this.isPropagationStopped = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+ // if stopPropagation exists run it on the original event
+ if ( e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ e.cancelBubble = true;
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ },
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+ // Check if mouse(over|out) are still within the same parent element
+ var parent = event.relatedTarget;
+
+ // Firefox sometimes assigns relatedTarget a XUL element
+ // which we cannot access the parentNode property of
+ try {
+ // Traverse up the tree
+ while ( parent && parent !== this ) {
+ parent = parent.parentNode;
+ }
+
+ if ( parent !== this ) {
+ // set the correct event type
+ event.type = event.data;
+
+ // handle event if we actually just moused on to a non sub-element
+ jQuery.event.handle.apply( this, arguments );
+ }
+
+ // assuming we've left the element since we most likely mousedover a xul element
+ } catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+ event.type = event.data;
+ jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ setup: function( data ) {
+ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+ },
+ teardown: function( data ) {
+ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+ }
+ };
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function( data, namespaces ) {
+ if ( this.nodeName.toLowerCase() !== "form" ) {
+ jQuery.event.add(this, "click.specialSubmit", function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ } else {
+ return false;
+ }
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialSubmit" );
+ }
+ };
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+ var formElems = /textarea|input|select/i,
+
+ changeFilters,
+
+ getVal = function( elem ) {
+ var type = elem.type, val = elem.value;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ val = elem.checked;
+
+ } else if ( type === "select-multiple" ) {
+ val = elem.selectedIndex > -1 ?
+ jQuery.map( elem.options, function( elem ) {
+ return elem.selected;
+ }).join("-") :
+ "";
+
+ } else if ( elem.nodeName.toLowerCase() === "select" ) {
+ val = elem.selectedIndex;
+ }
+
+ return val;
+ },
+
+ testChange = function testChange( e ) {
+ var elem = e.target, data, val;
+
+ if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
+ return;
+ }
+
+ data = jQuery.data( elem, "_change_data" );
+ val = getVal(elem);
+
+ // the current data will be also retrieved by beforeactivate
+ if ( e.type !== "focusout" || elem.type !== "radio" ) {
+ jQuery.data( elem, "_change_data", val );
+ }
+
+ if ( data === undefined || val === data ) {
+ return;
+ }
+
+ if ( data != null || val ) {
+ e.type = "change";
+ return jQuery.event.trigger( e, arguments[1], elem );
+ }
+ };
+
+ jQuery.event.special.change = {
+ filters: {
+ focusout: testChange,
+
+ click: function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+ return testChange.call( this, e );
+ }
+ },
+
+ // Change has to be called before submit
+ // Keydown will be called before keypress, which is used in submit-event delegation
+ keydown: function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+ (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+ type === "select-multiple" ) {
+ return testChange.call( this, e );
+ }
+ },
+
+ // Beforeactivate happens also before the previous element is blurred
+ // with this event you can't trigger a change event, but you can store
+ // information/focus[in] is not needed anymore
+ beforeactivate: function( e ) {
+ var elem = e.target;
+ jQuery.data( elem, "_change_data", getVal(elem) );
+ }
+ },
+
+ setup: function( data, namespaces ) {
+ if ( this.type === "file" ) {
+ return false;
+ }
+
+ for ( var type in changeFilters ) {
+ jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+ }
+
+ return formElems.test( this.nodeName );
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialChange" );
+
+ return formElems.test( this.nodeName );
+ }
+ };
+
+ changeFilters = jQuery.event.special.change.filters;
+}
+
+function trigger( type, elem, args ) {
+ args[0].type = type;
+ return jQuery.event.handle.apply( elem, args );
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ this.addEventListener( orig, handler, true );
+ },
+ teardown: function() {
+ this.removeEventListener( orig, handler, true );
+ }
+ };
+
+ function handler( e ) {
+ e = jQuery.event.fix( e );
+ e.type = fix;
+ return jQuery.event.handle.call( this, e );
+ }
+ });
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+ jQuery.fn[ name ] = function( type, data, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" ) {
+ for ( var key in type ) {
+ this[ name ](key, data, type[key], fn);
+ }
+ return this;
+ }
+
+ if ( jQuery.isFunction( data ) ) {
+ fn = data;
+ data = undefined;
+ }
+
+ var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+ jQuery( this ).unbind( event, handler );
+ return fn.apply( this, arguments );
+ }) : fn;
+
+ if ( type === "unload" && name !== "one" ) {
+ this.one( type, data, fn );
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.add( this[i], type, handler, data );
+ }
+ }
+
+ return this;
+ };
+});
+
+jQuery.fn.extend({
+ unbind: function( type, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" && !type.preventDefault ) {
+ for ( var key in type ) {
+ this.unbind(key, type[key]);
+ }
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.remove( this[i], type, fn );
+ }
+ }
+
+ return this;
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.live( types, data, fn, selector );
+ },
+
+ undelegate: function( selector, types, fn ) {
+ if ( arguments.length === 0 ) {
+ return this.unbind( "live" );
+
+ } else {
+ return this.die( types, null, fn, selector );
+ }
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+
+ triggerHandler: function( type, data ) {
+ if ( this[0] ) {
+ var event = jQuery.Event( type );
+ event.preventDefault();
+ event.stopPropagation();
+ jQuery.event.trigger( event, data, this[0] );
+ return event.result;
+ }
+ },
+
+ toggle: function( fn ) {
+ // Save reference to arguments for access in closure
+ var args = arguments, i = 1;
+
+ // link all the functions, so any of them can unbind this click handler
+ while ( i < args.length ) {
+ jQuery.proxy( fn, args[ i++ ] );
+ }
+
+ return this.click( jQuery.proxy( fn, function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ }));
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+});
+
+var liveMap = {
+ focus: "focusin",
+ blur: "focusout",
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+ jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+ var type, i = 0, match, namespaces, preType,
+ selector = origSelector || this.selector,
+ context = origSelector ? this : jQuery( this.context );
+
+ if ( jQuery.isFunction( data ) ) {
+ fn = data;
+ data = undefined;
+ }
+
+ types = (types || "").split(" ");
+
+ while ( (type = types[ i++ ]) != null ) {
+ match = rnamespaces.exec( type );
+ namespaces = "";
+
+ if ( match ) {
+ namespaces = match[0];
+ type = type.replace( rnamespaces, "" );
+ }
+
+ if ( type === "hover" ) {
+ types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+ continue;
+ }
+
+ preType = type;
+
+ if ( type === "focus" || type === "blur" ) {
+ types.push( liveMap[ type ] + namespaces );
+ type = type + namespaces;
+
+ } else {
+ type = (liveMap[ type ] || type) + namespaces;
+ }
+
+ if ( name === "live" ) {
+ // bind live handler
+ context.each(function(){
+ jQuery.event.add( this, liveConvert( type, selector ),
+ { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+ });
+
+ } else {
+ // unbind live handler
+ context.unbind( liveConvert( type, selector ), fn );
+ }
+ }
+
+ return this;
+ }
+});
+
+function liveHandler( event ) {
+ var stop, elems = [], selectors = [], args = arguments,
+ related, match, handleObj, elem, j, i, l, data,
+ events = jQuery.data( this, "events" );
+
+ // Make sure we avoid non-left-click bubbling in Firefox (#3861)
+ if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
+ return;
+ }
+
+ event.liveFired = this;
+
+ var live = events.live.slice(0);
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+ selectors.push( handleObj.selector );
+
+ } else {
+ live.splice( j--, 1 );
+ }
+ }
+
+ match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+ for ( i = 0, l = match.length; i < l; i++ ) {
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( match[i].selector === handleObj.selector ) {
+ elem = match[i].elem;
+ related = null;
+
+ // Those two events require additional checking
+ if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+ related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+ }
+
+ if ( !related || related !== elem ) {
+ elems.push({ elem: elem, handleObj: handleObj });
+ }
+ }
+ }
+ }
+
+ for ( i = 0, l = elems.length; i < l; i++ ) {
+ match = elems[i];
+ event.currentTarget = match.elem;
+ event.data = match.handleObj.data;
+ event.handleObj = match.handleObj;
+
+ if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
+ stop = false;
+ break;
+ }
+ }
+
+ return stop;
+}
+
+function liveConvert( type, selector ) {
+ return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( fn ) {
+ return fn ? this.bind( name, fn ) : this.trigger( name );
+ };
+
+ if ( jQuery.attrFn ) {
+ jQuery.attrFn[ name ] = true;
+ }
+});
+
+// Prevent memory leaks in IE
+// Window isn't included so as not to unbind existing unload events
+// More info:
+// - http://isaacschlueter.com/2006/10/msie-memory-leaks/
+if ( window.attachEvent && !window.addEventListener ) {
+ window.attachEvent("onunload", function() {
+ for ( var id in jQuery.cache ) {
+ if ( jQuery.cache[ id ].handle ) {
+ // Try/Catch is to handle iframes being unloaded, see #4280
+ try {
+ jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+ } catch(e) {}
+ }
+ }
+ });
+}
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+// Thus far that includes Google Chrome.
+[0, 0].sort(function(){
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function(selector, context, results, seed) {
+ results = results || [];
+ var origContext = context = context || document;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
+ soFar = selector;
+
+ // Reset the position of the chunker regexp (start from head)
+ while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context );
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] ) {
+ selector += parts.shift();
+ }
+
+ set = posProcess( selector, set );
+ }
+ }
+ } else {
+ // Take a shortcut and set the context if the root selector is an ID
+ // (but not if it'll be faster if the inner selector is an ID)
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+ var ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
+ }
+
+ if ( context ) {
+ var ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+ set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray(set);
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ var cur = parts.pop(), pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ Sizzle.error( cur || selector );
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+ } else if ( context && context.nodeType === 1 ) {
+ for ( var i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+ } else {
+ for ( var i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function(results){
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort(sortOrder);
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[i-1] ) {
+ results.splice(i--, 1);
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function(expr, set){
+ return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+ var set, match;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var type = Expr.order[i], match;
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ var left = match[1];
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace(/\\/g, "");
+ set = Expr.find[ type ]( match, context, isXML );
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = context.getElementsByTagName("*");
+ }
+
+ return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+ var old = expr, result = [], curLoop = set, match, anyFound,
+ isXMLFilter = set && set[0] && isXML(set[0]);
+
+ while ( expr && set.length ) {
+ for ( var type in Expr.filter ) {
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+ var filter = Expr.filter[ type ], found, item, left = match[1];
+ anyFound = false;
+
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) === "\\" ) {
+ continue;
+ }
+
+ if ( curLoop === result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ var pass = not ^ !!found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+ } else {
+ curLoop[i] = false;
+ }
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ // Improper expression
+ if ( expr === old ) {
+ if ( anyFound == null ) {
+ Sizzle.error( expr );
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+ throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+ order: [ "ID", "NAME", "TAG" ],
+ match: {
+ ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+ CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+ },
+ leftMatch: {},
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+ attrHandle: {
+ href: function(elem){
+ return elem.getAttribute("href");
+ }
+ },
+ relative: {
+ "+": function(checkSet, part){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !/\W/.test(part),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag ) {
+ part = part.toLowerCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+ ">": function(checkSet, part){
+ var isPartStr = typeof part === "string";
+
+ if ( isPartStr && !/\W/.test(part) ) {
+ part = part.toLowerCase();
+
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+ }
+ }
+ } else {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+ "": function(checkSet, part, isXML){
+ var doneName = done++, checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test(part) ) {
+ var nodeCheck = part = part.toLowerCase();
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+ },
+ "~": function(checkSet, part, isXML){
+ var doneName = done++, checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test(part) ) {
+ var nodeCheck = part = part.toLowerCase();
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+ }
+ },
+ find: {
+ ID: function(match, context, isXML){
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ return m ? [m] : [];
+ }
+ },
+ NAME: function(match, context){
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [], results = context.getElementsByName(match[1]);
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+ TAG: function(match, context){
+ return context.getElementsByTagName(match[1]);
+ }
+ },
+ preFilter: {
+ CLASS: function(match, curLoop, inplace, result, not, isXML){
+ match = " " + match[1].replace(/\\/g, "") + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
+ if ( !inplace ) {
+ result.push( elem );
+ }
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+ ID: function(match){
+ return match[1].replace(/\\/g, "");
+ },
+ TAG: function(match, curLoop){
+ return match[1].toLowerCase();
+ },
+ CHILD: function(match){
+ if ( match[1] === "nth" ) {
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ // calculate the numbers (first)n+(last) including if they are negative
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+
+ // TODO: Move to normal caching system
+ match[0] = done++;
+
+ return match;
+ },
+ ATTR: function(match, curLoop, inplace, result, not, isXML){
+ var name = match[1].replace(/\\/g, "");
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+ PSEUDO: function(match, curLoop, inplace, result, not){
+ if ( match[1] === "not" ) {
+ // If we're dealing with a complex expression, or a simple one
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+ return false;
+ }
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+ POS: function(match){
+ match.unshift( true );
+ return match;
+ }
+ },
+ filters: {
+ enabled: function(elem){
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+ disabled: function(elem){
+ return elem.disabled === true;
+ },
+ checked: function(elem){
+ return elem.checked === true;
+ },
+ selected: function(elem){
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ elem.parentNode.selectedIndex;
+ return elem.selected === true;
+ },
+ parent: function(elem){
+ return !!elem.firstChild;
+ },
+ empty: function(elem){
+ return !elem.firstChild;
+ },
+ has: function(elem, i, match){
+ return !!Sizzle( match[3], elem ).length;
+ },
+ header: function(elem){
+ return /h\d/i.test( elem.nodeName );
+ },
+ text: function(elem){
+ return "text" === elem.type;
+ },
+ radio: function(elem){
+ return "radio" === elem.type;
+ },
+ checkbox: function(elem){
+ return "checkbox" === elem.type;
+ },
+ file: function(elem){
+ return "file" === elem.type;
+ },
+ password: function(elem){
+ return "password" === elem.type;
+ },
+ submit: function(elem){
+ return "submit" === elem.type;
+ },
+ image: function(elem){
+ return "image" === elem.type;
+ },
+ reset: function(elem){
+ return "reset" === elem.type;
+ },
+ button: function(elem){
+ return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+ },
+ input: function(elem){
+ return /input|select|textarea|button/i.test(elem.nodeName);
+ }
+ },
+ setFilters: {
+ first: function(elem, i){
+ return i === 0;
+ },
+ last: function(elem, i, match, array){
+ return i === array.length - 1;
+ },
+ even: function(elem, i){
+ return i % 2 === 0;
+ },
+ odd: function(elem, i){
+ return i % 2 === 1;
+ },
+ lt: function(elem, i, match){
+ return i < match[3] - 0;
+ },
+ gt: function(elem, i, match){
+ return i > match[3] - 0;
+ },
+ nth: function(elem, i, match){
+ return match[3] - 0 === i;
+ },
+ eq: function(elem, i, match){
+ return match[3] - 0 === i;
+ }
+ },
+ filter: {
+ PSEUDO: function(elem, match, i, array){
+ var name = match[1], filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var i = 0, l = not.length; i < l; i++ ) {
+ if ( not[i] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+ } else {
+ Sizzle.error( "Syntax error, unrecognized expression: " + name );
+ }
+ },
+ CHILD: function(elem, match){
+ var type = match[1], node = elem;
+ switch (type) {
+ case 'only':
+ case 'first':
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ if ( type === "first" ) {
+ return true;
+ }
+ node = elem;
+ case 'last':
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ return true;
+ case 'nth':
+ var first = match[2], last = match[3];
+
+ if ( first === 1 && last === 0 ) {
+ return true;
+ }
+
+ var doneName = match[0],
+ parent = elem.parentNode;
+
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+ parent.sizcache = doneName;
+ }
+
+ var diff = elem.nodeIndex - last;
+ if ( first === 0 ) {
+ return diff === 0;
+ } else {
+ return ( diff % first === 0 && diff / first >= 0 );
+ }
+ }
+ },
+ ID: function(elem, match){
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+ TAG: function(elem, match){
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+ },
+ CLASS: function(elem, match){
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+ ATTR: function(elem, match){
+ var name = match[1],
+ result = Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value !== check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+ POS: function(elem, match, i, array){
+ var name = match[2], filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
+ return "\\" + (num - 0 + 1);
+ }));
+}
+
+var makeArray = function(array, results) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch(e){
+ makeArray = function(array, results) {
+ var ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var i = 0, l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+ } else {
+ for ( var i = 0; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return a.compareDocumentPosition ? -1 : 1;
+ }
+
+ var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+} else if ( "sourceIndex" in document.documentElement ) {
+ sortOrder = function( a, b ) {
+ if ( !a.sourceIndex || !b.sourceIndex ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return a.sourceIndex ? -1 : 1;
+ }
+
+ var ret = a.sourceIndex - b.sourceIndex;
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+} else if ( document.createRange ) {
+ sortOrder = function( a, b ) {
+ if ( !a.ownerDocument || !b.ownerDocument ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return a.ownerDocument ? -1 : 1;
+ }
+
+ var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+ aRange.setStart(a, 0);
+ aRange.setEnd(a, 0);
+ bRange.setStart(b, 0);
+ bRange.setEnd(b, 0);
+ var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+function getText( elems ) {
+ var ret = "", elem;
+
+ for ( var i = 0; elems[i]; i++ ) {
+ elem = elems[i];
+
+ // Get the text from text nodes and CDATA nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+ ret += elem.nodeValue;
+
+ // Traverse everything else, except comment nodes
+ } else if ( elem.nodeType !== 8 ) {
+ ret += getText( elem.childNodes );
+ }
+ }
+
+ return ret;
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+ // We're going to inject a fake input element with a specified name
+ var form = document.createElement("div"),
+ id = "script" + (new Date).getTime();
+ form.innerHTML = "<a name='" + id + "'/>";
+
+ // Inject it into the root element, check its status, and remove it quickly
+ var root = document.documentElement;
+ root.insertBefore( form, root.firstChild );
+
+ // The workaround has to do additional checks after a getElementById
+ // Which slows things down for other browsers (hence the branching)
+ if ( document.getElementById( id ) ) {
+ Expr.find.ID = function(match, context, isXML){
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+ }
+ };
+
+ Expr.filter.ID = function(elem, match){
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+ root = form = null; // release memory in IE
+})();
+
+(function(){
+ // Check to see if the browser returns only elements
+ // when doing getElementsByTagName("*")
+
+ // Create a fake element
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ // Make sure no comments are found
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function(match, context){
+ var results = context.getElementsByTagName(match[1]);
+
+ // Filter out possible comments
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ // Check to see if an attribute returns normalized href attributes
+ div.innerHTML = "<a href='#'></a>";
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+ Expr.attrHandle.href = function(elem){
+ return elem.getAttribute("href", 2);
+ };
+ }
+
+ div = null; // release memory in IE
+})();
+
+if ( document.querySelectorAll ) {
+ (function(){
+ var oldSizzle = Sizzle, div = document.createElement("div");
+ div.innerHTML = "<p class='TEST'></p>";
+
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode.
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function(query, context, extra, seed){
+ context = context || document;
+
+ // Only use querySelectorAll on non-XML documents
+ // (ID selectors don't work in non-HTML documents)
+ if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(e){}
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ div = null; // release memory in IE
+ })();
+}
+
+(function(){
+ var div = document.createElement("div");
+
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+ // Opera can't find a second classname (in 9.6)
+ // Also, make sure that getElementsByClassName actually exists
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+ return;
+ }
+
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 ) {
+ return;
+ }
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function(match, context, isXML) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ div = null; // release memory in IE
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ elem = elem[dir];
+ var match = false;
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName.toLowerCase() === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ elem = elem[dir];
+ var match = false;
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+var contains = document.compareDocumentPosition ? function(a, b){
+ return !!(a.compareDocumentPosition(b) & 16);
+} : function(a, b){
+ return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function(selector, context){
+ var tmpSet = [], later = "", match,
+ root = context.nodeType ? [context] : context;
+
+ // Position selectors must be done after the filter
+ // And so must :not(positional) so we move all PSEUDOs to the end
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = getText;
+jQuery.isXMLDoc = isXML;
+jQuery.contains = contains;
+
+return;
+
+window.Sizzle = Sizzle;
+
+})();
+var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+ // Note: This RegExp should be improved, or likely pulled from Sizzle
+ rmultiselector = /,/,
+ slice = Array.prototype.slice;
+
+// Implement the identical functionality for filter and not
+var winnow = function( elements, qualifier, keep ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) === keep;
+ });
+
+ } else if ( qualifier.nodeType ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ return (elem === qualifier) === keep;
+ });
+
+ } else if ( typeof qualifier === "string" ) {
+ var filtered = jQuery.grep(elements, function( elem ) {
+ return elem.nodeType === 1;
+ });
+
+ if ( isSimple.test( qualifier ) ) {
+ return jQuery.filter(qualifier, filtered, !keep);
+ } else {
+ qualifier = jQuery.filter( qualifier, filtered );
+ }
+ }
+
+ return jQuery.grep(elements, function( elem, i ) {
+ return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+ });
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var ret = this.pushStack( "", "find", selector ), length = 0;
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ length = ret.length;
+ jQuery.find( selector, this[i], ret );
+
+ if ( i > 0 ) {
+ // Make sure that the results are unique
+ for ( var n = length; n < ret.length; n++ ) {
+ for ( var r = 0; r < length; r++ ) {
+ if ( ret[r] === ret[n] ) {
+ ret.splice(n--, 1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ has: function( target ) {
+ var targets = jQuery( target );
+ return this.filter(function() {
+ for ( var i = 0, l = targets.length; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector, false), "not", selector);
+ },
+
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector, true), "filter", selector );
+ },
+
+ is: function( selector ) {
+ return !!selector && jQuery.filter( selector, this ).length > 0;
+ },
+
+ closest: function( selectors, context ) {
+ if ( jQuery.isArray( selectors ) ) {
+ var ret = [], cur = this[0], match, matches = {}, selector;
+
+ if ( cur && selectors.length ) {
+ for ( var i = 0, l = selectors.length; i < l; i++ ) {
+ selector = selectors[i];
+
+ if ( !matches[selector] ) {
+ matches[selector] = jQuery.expr.match.POS.test( selector ) ?
+ jQuery( selector, context || this.context ) :
+ selector;
+ }
+ }
+
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( selector in matches ) {
+ match = matches[selector];
+
+ if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+ ret.push({ selector: selector, elem: cur });
+ delete matches[selector];
+ }
+ }
+ cur = cur.parentNode;
+ }
+ }
+
+ return ret;
+ }
+
+ var pos = jQuery.expr.match.POS.test( selectors ) ?
+ jQuery( selectors, context || this.context ) : null;
+
+ return this.map(function( i, cur ) {
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
+ return cur;
+ }
+ cur = cur.parentNode;
+ }
+ return null;
+ });
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+ if ( !elem || typeof elem === "string" ) {
+ return jQuery.inArray( this[0],
+ // If it receives a string, the selector is used
+ // If it receives nothing, the siblings are used
+ elem ? jQuery( elem ) : this.parent().children() );
+ }
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ var set = typeof selector === "string" ?
+ jQuery( selector, context || this.context ) :
+ jQuery.makeArray( selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+ all :
+ jQuery.unique( all ) );
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+ return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return jQuery.nth( elem, 2, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return jQuery.nth( elem, 2, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( elem.parentNode.firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.makeArray( elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until );
+
+ if ( !runtil.test( name ) ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ ret = this.length > 1 ? jQuery.unique( ret ) : ret;
+
+ if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+
+ return this.pushStack( ret, name, slice.call(arguments).join(",") );
+ };
+});
+
+jQuery.extend({
+ filter: function( expr, elems, not ) {
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return jQuery.find.matches(expr, elems);
+ },
+
+ dir: function( elem, dir, until ) {
+ var matched = [], cur = elem[dir];
+ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+ if ( cur.nodeType === 1 ) {
+ matched.push( cur );
+ }
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ nth: function( cur, result, dir, elem ) {
+ result = result || 1;
+ var num = 0;
+
+ for ( ; cur; cur = cur[dir] ) {
+ if ( cur.nodeType === 1 && ++num === result ) {
+ break;
+ }
+ }
+
+ return cur;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ r.push( n );
+ }
+ }
+
+ return r;
+ }
+});
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
+ rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
+ rtagName = /<([\w:]+)/,
+ rtbody = /<tbody/i,
+ rhtml = /<|&#?\w+;/,
+ rnocache = /<script|<object|<embed|<option|<style/i,
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, // checked="checked" or checked (html5)
+ fcloseTag = function( all, front, tag ) {
+ return rselfClosing.test( tag ) ?
+ all :
+ front + "></" + tag + ">";
+ },
+ wrapMap = {
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+ legend: [ 1, "<fieldset>", "</fieldset>" ],
+ thead: [ 1, "<table>", "</table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+ col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+ area: [ 1, "<map>", "</map>" ],
+ _default: [ 0, "", "" ]
+ };
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+ wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+ text: function( text ) {
+ if ( jQuery.isFunction(text) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.text( text.call(this, i, self.text()) );
+ });
+ }
+
+ if ( typeof text !== "object" && text !== undefined ) {
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+ }
+
+ return jQuery.text( this );
+ },
+
+ wrapAll: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[0] ) {
+ // The elements to wrap the target around
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+ if ( this[0].parentNode ) {
+ wrap.insertBefore( this[0] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+ elem = elem.firstChild;
+ }
+
+ return elem;
+ }).append(this);
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ), contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ return this.each(function() {
+ jQuery( this ).wrapAll( html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.insertBefore( elem, this.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this );
+ });
+ } else if ( arguments.length ) {
+ var set = jQuery(arguments[0]);
+ set.push.apply( set, this.toArray() );
+ return this.pushStack( set, "before", arguments );
+ }
+ },
+
+ after: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ });
+ } else if ( arguments.length ) {
+ var set = this.pushStack( this, "after", arguments );
+ set.push.apply( set, jQuery(arguments[0]).toArray() );
+ return set;
+ }
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function( selector, keepData ) {
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+ if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( elem.getElementsByTagName("*") );
+ jQuery.cleanData( [ elem ] );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( elem.getElementsByTagName("*") );
+ }
+
+ // Remove any remaining nodes
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( events ) {
+ // Do the clone
+ var ret = this.map(function() {
+ if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
+ // IE copies events bound via attachEvent when
+ // using cloneNode. Calling detachEvent on the
+ // clone will also remove the events from the orignal
+ // In order to get around this, we use innerHTML.
+ // Unfortunately, this means some modifications to
+ // attributes in IE that are actually only stored
+ // as properties will not be copied (such as the
+ // the name attribute on an input).
+ var html = this.outerHTML, ownerDocument = this.ownerDocument;
+ if ( !html ) {
+ var div = ownerDocument.createElement("div");
+ div.appendChild( this.cloneNode(true) );
+ html = div.innerHTML;
+ }
+
+ return jQuery.clean([html.replace(rinlinejQuery, "")
+ // Handle the case in IE 8 where action=/test/> self-closes a tag
+ .replace(/=([^="'>\s]+\/)>/g, '="$1">')
+ .replace(rleadingWhitespace, "")], ownerDocument)[0];
+ } else {
+ return this.cloneNode(true);
+ }
+ });
+
+ // Copy the events from the original to the clone
+ if ( events === true ) {
+ cloneCopyEvent( this, ret );
+ cloneCopyEvent( this.find("*"), ret.find("*") );
+ }
+
+ // Return the cloned set
+ return ret;
+ },
+
+ html: function( value ) {
+ if ( value === undefined ) {
+ return this[0] && this[0].nodeType === 1 ?
+ this[0].innerHTML.replace(rinlinejQuery, "") :
+ null;
+
+ // See if we can take a shortcut and just use innerHTML
+ } else if ( typeof value === "string" && !rnocache.test( value ) &&
+ (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+ !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+ value = value.replace(rxhtmlTag, fcloseTag);
+
+ try {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( this[i].nodeType === 1 ) {
+ jQuery.cleanData( this[i].getElementsByTagName("*") );
+ this[i].innerHTML = value;
+ }
+ }
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch(e) {
+ this.empty().append( value );
+ }
+
+ } else if ( jQuery.isFunction( value ) ) {
+ this.each(function(i){
+ var self = jQuery(this), old = self.html();
+ self.empty().append(function(){
+ return value.call( this, i, old );
+ });
+ });
+
+ } else {
+ this.empty().append( value );
+ }
+
+ return this;
+ },
+
+ replaceWith: function( value ) {
+ if ( this[0] && this[0].parentNode ) {
+ // Make sure that the elements are removed from the DOM before they are inserted
+ // this can help fix replacing a parent with child elements
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function(i) {
+ var self = jQuery(this), old = self.html();
+ self.replaceWith( value.call( this, i, old ) );
+ });
+ }
+
+ if ( typeof value !== "string" ) {
+ value = jQuery(value).detach();
+ }
+
+ return this.each(function() {
+ var next = this.nextSibling, parent = this.parentNode;
+
+ jQuery(this).remove();
+
+ if ( next ) {
+ jQuery(next).before( value );
+ } else {
+ jQuery(parent).append( value );
+ }
+ });
+ } else {
+ return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+ }
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, table, callback ) {
+ var results, first, value = args[0], scripts = [], fragment, parent;
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+ return this.each(function() {
+ jQuery(this).domManip( args, table, callback, true );
+ });
+ }
+
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ args[0] = value.call(this, i, table ? self.html() : undefined);
+ self.domManip( args, table, callback );
+ });
+ }
+
+ if ( this[0] ) {
+ parent = value && value.parentNode;
+
+ // If we're in a fragment, just use that instead of building a new one
+ if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+ results = { fragment: parent };
+
+ } else {
+ results = buildFragment( args, this, scripts );
+ }
+
+ fragment = results.fragment;
+
+ if ( fragment.childNodes.length === 1 ) {
+ first = fragment = fragment.firstChild;
+ } else {
+ first = fragment.firstChild;
+ }
+
+ if ( first ) {
+ table = table && jQuery.nodeName( first, "tr" );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ callback.call(
+ table ?
+ root(this[i], first) :
+ this[i],
+ i > 0 || results.cacheable || this.length > 1 ?
+ fragment.cloneNode(true) :
+ fragment
+ );
+ }
+ }
+
+ if ( scripts.length ) {
+ jQuery.each( scripts, evalScript );
+ }
+ }
+
+ return this;
+
+ function root( elem, cur ) {
+ return jQuery.nodeName(elem, "table") ?
+ (elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+ elem;
+ }
+ }
+});
+
+function cloneCopyEvent(orig, ret) {
+ var i = 0;
+
+ ret.each(function() {
+ if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
+ return;
+ }
+
+ var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
+
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
+
+ for ( var type in events ) {
+ for ( var handler in events[ type ] ) {
+ jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
+ }
+ }
+ }
+ });
+}
+
+function buildFragment( args, nodes, scripts ) {
+ var fragment, cacheable, cacheresults,
+ doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+ // Only cache "small" (1/2 KB) strings that are associated with the main document
+ // Cloning options loses the selected state, so don't cache them
+ // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+ // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+ if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+ !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+ cacheable = true;
+ cacheresults = jQuery.fragments[ args[0] ];
+ if ( cacheresults ) {
+ if ( cacheresults !== 1 ) {
+ fragment = cacheresults;
+ }
+ }
+ }
+
+ if ( !fragment ) {
+ fragment = doc.createDocumentFragment();
+ jQuery.clean( args, doc, fragment, scripts );
+ }
+
+ if ( cacheable ) {
+ jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+ }
+
+ return { fragment: fragment, cacheable: cacheable };
+}
+
+jQuery.fragments = {};
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var ret = [], insert = jQuery( selector ),
+ parent = this.length === 1 && this[0].parentNode;
+
+ if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+ insert[ original ]( this[0] );
+ return this;
+
+ } else {
+ for ( var i = 0, l = insert.length; i < l; i++ ) {
+ var elems = (i > 0 ? this.clone(true) : this).get();
+ jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+ ret = ret.concat( elems );
+ }
+
+ return this.pushStack( ret, name, insert.selector );
+ }
+ };
+});
+
+jQuery.extend({
+ clean: function( elems, context, fragment, scripts ) {
+ context = context || document;
+
+ // !context.createElement fails in IE with an error but returns typeof 'object'
+ if ( typeof context.createElement === "undefined" ) {
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+ }
+
+ var ret = [];
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ if ( typeof elem === "number" ) {
+ elem += "";
+ }
+
+ if ( !elem ) {
+ continue;
+ }
+
+ // Convert html string into DOM nodes
+ if ( typeof elem === "string" && !rhtml.test( elem ) ) {
+ elem = context.createTextNode( elem );
+
+ } else if ( typeof elem === "string" ) {
+ // Fix "XHTML"-style tags in all browsers
+ elem = elem.replace(rxhtmlTag, fcloseTag);
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+ wrap = wrapMap[ tag ] || wrapMap._default,
+ depth = wrap[0],
+ div = context.createElement("div");
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + elem + wrap[2];
+
+ // Move to the right depth
+ while ( depth-- ) {
+ div = div.lastChild;
+ }
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( !jQuery.support.tbody ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ var hasBody = rtbody.test(elem),
+ tbody = tag === "table" && !hasBody ?
+ div.firstChild && div.firstChild.childNodes :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] === "<table>" && !hasBody ?
+ div.childNodes :
+ [];
+
+ for ( var j = tbody.length - 1; j >= 0 ; --j ) {
+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
+ }
+ }
+
+ }
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+ div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+ }
+
+ elem = div.childNodes;
+ }
+
+ if ( elem.nodeType ) {
+ ret.push( elem );
+ } else {
+ ret = jQuery.merge( ret, elem );
+ }
+ }
+
+ if ( fragment ) {
+ for ( var i = 0; ret[i]; i++ ) {
+ if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+ scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+ } else {
+ if ( ret[i].nodeType === 1 ) {
+ ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+ }
+ fragment.appendChild( ret[i] );
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ cleanData: function( elems ) {
+ var data, id, cache = jQuery.cache,
+ special = jQuery.event.special,
+ deleteExpando = jQuery.support.deleteExpando;
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ id = elem[ jQuery.expando ];
+
+ if ( id ) {
+ data = cache[ id ];
+
+ if ( data.events ) {
+ for ( var type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ } else {
+ removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ if ( deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ }
+
+ delete cache[ id ];
+ }
+ }
+ }
+});
+// exclude the following css properties to add px
+var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+ ralpha = /alpha\([^)]*\)/,
+ ropacity = /opacity=([^)]*)/,
+ rfloat = /float/i,
+ rdashAlpha = /-([a-z])/ig,
+ rupper = /([A-Z])/g,
+ rnumpx = /^-?\d+(?:px)?$/i,
+ rnum = /^-?\d/,
+
+ cssShow = { position: "absolute", visibility: "hidden", display:"block" },
+ cssWidth = [ "Left", "Right" ],
+ cssHeight = [ "Top", "Bottom" ],
+
+ // cache check for defaultView.getComputedStyle
+ getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
+ // normalize float css property
+ styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn.css = function( name, value ) {
+ return access( this, name, value, true, function( elem, name, value ) {
+ if ( value === undefined ) {
+ return jQuery.curCSS( elem, name );
+ }
+
+ if ( typeof value === "number" && !rexclude.test(name) ) {
+ value += "px";
+ }
+
+ jQuery.style( elem, name, value );
+ });
+};
+
+jQuery.extend({
+ style: function( elem, name, value ) {
+ // don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ // ignore negative width and height values #1599
+ if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
+ value = undefined;
+ }
+
+ var style = elem.style || elem, set = value !== undefined;
+
+ // IE uses filters for opacity
+ if ( !jQuery.support.opacity && name === "opacity" ) {
+ if ( set ) {
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ style.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
+ var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
+ style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
+ }
+
+ return style.filter && style.filter.indexOf("opacity=") >= 0 ?
+ (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
+ "";
+ }
+
+ // Make sure we're using the right name for getting the float value
+ if ( rfloat.test( name ) ) {
+ name = styleFloat;
+ }
+
+ name = name.replace(rdashAlpha, fcamelCase);
+
+ if ( set ) {
+ style[ name ] = value;
+ }
+
+ return style[ name ];
+ },
+
+ css: function( elem, name, force, extra ) {
+ if ( name === "width" || name === "height" ) {
+ var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
+
+ function getWH() {
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
+
+ if ( extra === "border" ) {
+ return;
+ }
+
+ jQuery.each( which, function() {
+ if ( !extra ) {
+ val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+ }
+
+ if ( extra === "margin" ) {
+ val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
+ } else {
+ val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+ }
+ });
+ }
+
+ if ( elem.offsetWidth !== 0 ) {
+ getWH();
+ } else {
+ jQuery.swap( elem, props, getWH );
+ }
+
+ return Math.max(0, Math.round(val));
+ }
+
+ return jQuery.curCSS( elem, name, force );
+ },
+
+ curCSS: function( elem, name, force ) {
+ var ret, style = elem.style, filter;
+
+ // IE uses filters for opacity
+ if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
+ ret = ropacity.test(elem.currentStyle.filter || "") ?
+ (parseFloat(RegExp.$1) / 100) + "" :
+ "";
+
+ return ret === "" ?
+ "1" :
+ ret;
+ }
+
+ // Make sure we're using the right name for getting the float value
+ if ( rfloat.test( name ) ) {
+ name = styleFloat;
+ }
+
+ if ( !force && style && style[ name ] ) {
+ ret = style[ name ];
+
+ } else if ( getComputedStyle ) {
+
+ // Only "float" is needed here
+ if ( rfloat.test( name ) ) {
+ name = "float";
+ }
+
+ name = name.replace( rupper, "-$1" ).toLowerCase();
+
+ var defaultView = elem.ownerDocument.defaultView;
+
+ if ( !defaultView ) {
+ return null;
+ }
+
+ var computedStyle = defaultView.getComputedStyle( elem, null );
+
+ if ( computedStyle ) {
+ ret = computedStyle.getPropertyValue( name );
+ }
+
+ // We should always get a number back from opacity
+ if ( name === "opacity" && ret === "" ) {
+ ret = "1";
+ }
+
+ } else if ( elem.currentStyle ) {
+ var camelCase = name.replace(rdashAlpha, fcamelCase);
+
+ ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+ // Remember the original values
+ var left = style.left, rsLeft = elem.runtimeStyle.left;
+
+ // Put in the new values to get a computed value out
+ elem.runtimeStyle.left = elem.currentStyle.left;
+ style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ elem.runtimeStyle.left = rsLeft;
+ }
+ }
+
+ return ret;
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback ) {
+ var old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( var name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ callback.call( elem );
+
+ // Revert the old values
+ for ( var name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+ }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.hidden = function( elem ) {
+ var width = elem.offsetWidth, height = elem.offsetHeight,
+ skip = elem.nodeName.toLowerCase() === "tr";
+
+ return width === 0 && height === 0 && !skip ?
+ true :
+ width > 0 && height > 0 && !skip ?
+ false :
+ jQuery.curCSS(elem, "display") === "none";
+ };
+
+ jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+ };
+}
+var jsc = now(),
+ rscript = /<script(.|\s)*?\/script>/gi,
+ rselectTextarea = /select|textarea/i,
+ rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
+ jsre = /=\?(&|$)/,
+ rquery = /\?/,
+ rts = /(\?|&)_=.*?(&|$)/,
+ rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+ r20 = /%20/g,
+
+ // Keep a copy of the old load method
+ _load = jQuery.fn.load;
+
+jQuery.fn.extend({
+ load: function( url, params, callback ) {
+ if ( typeof url !== "string" ) {
+ return _load.call( this, url );
+
+ // Don't do a request if no elements are being requested
+ } else if ( !this.length ) {
+ return this;
+ }
+
+ var off = url.indexOf(" ");
+ if ( off >= 0 ) {
+ var selector = url.slice(off, url.length);
+ url = url.slice(0, off);
+ }
+
+ // Default to a GET request
+ var type = "GET";
+
+ // If the second parameter was provided
+ if ( params ) {
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+ // We assume that it's the callback
+ callback = params;
+ params = null;
+
+ // Otherwise, build a param string
+ } else if ( typeof params === "object" ) {
+ params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+ type = "POST";
+ }
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ dataType: "html",
+ data: params,
+ complete: function( res, status ) {
+ // If successful, inject the HTML into all the matched elements
+ if ( status === "success" || status === "notmodified" ) {
+ // See if a selector was specified
+ self.html( selector ?
+ // Create a dummy div to hold the results
+ jQuery("<div />")
+ // inject the contents of the document in, removing the scripts
+ // to avoid any 'Permission Denied' errors in IE
+ .append(res.responseText.replace(rscript, ""))
+
+ // Locate the specified elements
+ .find(selector) :
+
+ // If not, just inject the full result
+ res.responseText );
+ }
+
+ if ( callback ) {
+ self.each( callback, [res.responseText, status, res] );
+ }
+ }
+ });
+
+ return this;
+ },
+
+ serialize: function() {
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ return this.elements ? jQuery.makeArray(this.elements) : this;
+ })
+ .filter(function() {
+ return this.name && !this.disabled &&
+ (this.checked || rselectTextarea.test(this.nodeName) ||
+ rinput.test(this.type));
+ })
+ .map(function( i, elem ) {
+ var val = jQuery(this).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray(val) ?
+ jQuery.map( val, function( val, i ) {
+ return { name: elem.name, value: val };
+ }) :
+ { name: elem.name, value: val };
+ }).get();
+ }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
+ jQuery.fn[o] = function( f ) {
+ return this.bind(o, f);
+ };
+});
+
+jQuery.extend({
+
+ get: function( url, data, callback, type ) {
+ // shift arguments if data argument was omited
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = null;
+ }
+
+ return jQuery.ajax({
+ type: "GET",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get(url, null, callback, "script");
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get(url, data, callback, "json");
+ },
+
+ post: function( url, data, callback, type ) {
+ // shift arguments if data argument was omited
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = {};
+ }
+
+ return jQuery.ajax({
+ type: "POST",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ ajaxSetup: function( settings ) {
+ jQuery.extend( jQuery.ajaxSettings, settings );
+ },
+
+ ajaxSettings: {
+ url: location.href,
+ global: true,
+ type: "GET",
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ /*
+ timeout: 0,
+ data: null,
+ username: null,
+ password: null,
+ traditional: false,
+ */
+ // Create the request object; Microsoft failed to properly
+ // implement the XMLHttpRequest in IE7 (can't request local files),
+ // so we use the ActiveXObject when it is available
+ // This function can be overriden by calling jQuery.ajaxSetup
+ xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
+ function() {
+ return new window.XMLHttpRequest();
+ } :
+ function() {
+ try {
+ return new window.ActiveXObject("Microsoft.XMLHTTP");
+ } catch(e) {}
+ },
+ accepts: {
+ xml: "application/xml, text/xml",
+ html: "text/html",
+ script: "text/javascript, application/javascript",
+ json: "application/json, text/javascript",
+ text: "text/plain",
+ _default: "*/*"
+ }
+ },
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajax: function( origSettings ) {
+ var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
+
+ var jsonp, status, data,
+ callbackContext = origSettings && origSettings.context || s,
+ type = s.type.toUpperCase();
+
+ // convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Handle JSONP Parameter Callbacks
+ if ( s.dataType === "jsonp" ) {
+ if ( type === "GET" ) {
+ if ( !jsre.test( s.url ) ) {
+ s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+ }
+ } else if ( !s.data || !jsre.test(s.data) ) {
+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+ }
+ s.dataType = "json";
+ }
+
+ // Build temporary JSONP function
+ if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
+ jsonp = s.jsonpCallback || ("jsonp" + jsc++);
+
+ // Replace the =? sequence both in the query string and the data
+ if ( s.data ) {
+ s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+ }
+
+ s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+ // We need to make sure
+ // that a JSONP style response is executed properly
+ s.dataType = "script";
+
+ // Handle JSONP-style loading
+ window[ jsonp ] = window[ jsonp ] || function( tmp ) {
+ data = tmp;
+ success();
+ complete();
+ // Garbage collect
+ window[ jsonp ] = undefined;
+
+ try {
+ delete window[ jsonp ];
+ } catch(e) {}
+
+ if ( head ) {
+ head.removeChild( script );
+ }
+ };
+ }
+
+ if ( s.dataType === "script" && s.cache === null ) {
+ s.cache = false;
+ }
+
+ if ( s.cache === false && type === "GET" ) {
+ var ts = now();
+
+ // try replacing _= if it is there
+ var ret = s.url.replace(rts, "$1_=" + ts + "$2");
+
+ // if nothing was replaced, add timestamp to the end
+ s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
+ }
+
+ // If data is available, append data to url for get requests
+ if ( s.data && type === "GET" ) {
+ s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
+ }
+
+ // Watch for a new set of requests
+ if ( s.global && ! jQuery.active++ ) {
+ jQuery.event.trigger( "ajaxStart" );
+ }
+
+ // Matches an absolute URL, and saves the domain
+ var parts = rurl.exec( s.url ),
+ remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
+
+ // If we're requesting a remote document
+ // and trying to load JSON or Script with a GET
+ if ( s.dataType === "script" && type === "GET" && remote ) {
+ var head = document.getElementsByTagName("head")[0] || document.documentElement;
+ var script = document.createElement("script");
+ script.src = s.url;
+ if ( s.scriptCharset ) {
+ script.charset = s.scriptCharset;
+ }
+
+ // Handle Script loading
+ if ( !jsonp ) {
+ var done = false;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function() {
+ if ( !done && (!this.readyState ||
+ this.readyState === "loaded" || this.readyState === "complete") ) {
+ done = true;
+ success();
+ complete();
+
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
+ if ( head && script.parentNode ) {
+ head.removeChild( script );
+ }
+ }
+ };
+ }
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709 and #4378).
+ head.insertBefore( script, head.firstChild );
+
+ // We handle everything using the script element injection
+ return undefined;
+ }
+
+ var requestDone = false;
+
+ // Create the request object
+ var xhr = s.xhr();
+
+ if ( !xhr ) {
+ return;
+ }
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if ( s.username ) {
+ xhr.open(type, s.url, s.async, s.username, s.password);
+ } else {
+ xhr.open(type, s.url, s.async);
+ }
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ // Set the correct header, if data is being sent
+ if ( s.data || origSettings && origSettings.contentType ) {
+ xhr.setRequestHeader("Content-Type", s.contentType);
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[s.url] ) {
+ xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
+ }
+
+ if ( jQuery.etag[s.url] ) {
+ xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
+ }
+ }
+
+ // Set header so the called script knows that it's an XMLHttpRequest
+ // Only send the header if it's not a remote XHR
+ if ( !remote ) {
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+ s.accepts[ s.dataType ] + ", */*" :
+ s.accepts._default );
+ } catch(e) {}
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+
+ // close opended socket
+ xhr.abort();
+ return false;
+ }
+
+ if ( s.global ) {
+ trigger("ajaxSend", [xhr, s]);
+ }
+
+ // Wait for a response to come back
+ var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
+ // The request was aborted
+ if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
+ // Opera doesn't call onreadystatechange before this point
+ // so we simulate the call
+ if ( !requestDone ) {
+ complete();
+ }
+
+ requestDone = true;
+ if ( xhr ) {
+ xhr.onreadystatechange = jQuery.noop;
+ }
+
+ // The transfer is complete and the data is available, or the request timed out
+ } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
+ requestDone = true;
+ xhr.onreadystatechange = jQuery.noop;
+
+ status = isTimeout === "timeout" ?
+ "timeout" :
+ !jQuery.httpSuccess( xhr ) ?
+ "error" :
+ s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
+ "notmodified" :
+ "success";
+
+ var errMsg;
+
+ if ( status === "success" ) {
+ // Watch for, and catch, XML document parse errors
+ try {
+ // process the data (runs the xml through httpData regardless of callback)
+ data = jQuery.httpData( xhr, s.dataType, s );
+ } catch(err) {
+ status = "parsererror";
+ errMsg = err;
+ }
+ }
+
+ // Make sure that the request was successful or notmodified
+ if ( status === "success" || status === "notmodified" ) {
+ // JSONP handles its own success callback
+ if ( !jsonp ) {
+ success();
+ }
+ } else {
+ jQuery.handleError(s, xhr, status, errMsg);
+ }
+
+ // Fire the complete handlers
+ complete();
+
+ if ( isTimeout === "timeout" ) {
+ xhr.abort();
+ }
+
+ // Stop memory leaks
+ if ( s.async ) {
+ xhr = null;
+ }
+ }
+ };
+
+ // Override the abort handler, if we can (IE doesn't allow it, but that's OK)
+ // Opera doesn't fire onreadystatechange at all on abort
+ try {
+ var oldAbort = xhr.abort;
+ xhr.abort = function() {
+ if ( xhr ) {
+ oldAbort.call( xhr );
+ }
+
+ onreadystatechange( "abort" );
+ };
+ } catch(e) { }
+
+ // Timeout checker
+ if ( s.async && s.timeout > 0 ) {
+ setTimeout(function() {
+ // Check to see if the request is still happening
+ if ( xhr && !requestDone ) {
+ onreadystatechange( "timeout" );
+ }
+ }, s.timeout);
+ }
+
+ // Send the data
+ try {
+ xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
+ } catch(e) {
+ jQuery.handleError(s, xhr, null, e);
+ // Fire the complete handlers
+ complete();
+ }
+
+ // firefox 1.5 doesn't fire statechange for sync requests
+ if ( !s.async ) {
+ onreadystatechange();
+ }
+
+ function success() {
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success ) {
+ s.success.call( callbackContext, data, status, xhr );
+ }
+
+ // Fire the global callback
+ if ( s.global ) {
+ trigger( "ajaxSuccess", [xhr, s] );
+ }
+ }
+
+ function complete() {
+ // Process result
+ if ( s.complete ) {
+ s.complete.call( callbackContext, xhr, status);
+ }
+
+ // The request was completed
+ if ( s.global ) {
+ trigger( "ajaxComplete", [xhr, s] );
+ }
+
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ }
+
+ function trigger(type, args) {
+ (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
+ }
+
+ // return XMLHttpRequest to allow aborting the request etc.
+ return xhr;
+ },
+
+ handleError: function( s, xhr, status, e ) {
+ // If a local callback was specified, fire it
+ if ( s.error ) {
+ s.error.call( s.context || s, xhr, status, e );
+ }
+
+ // Fire the global callback
+ if ( s.global ) {
+ (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
+ }
+ },
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Determines if an XMLHttpRequest was successful or not
+ httpSuccess: function( xhr ) {
+ try {
+ // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+ return !xhr.status && location.protocol === "file:" ||
+ // Opera returns 0 when status is 304
+ ( xhr.status >= 200 && xhr.status < 300 ) ||
+ xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
+ } catch(e) {}
+
+ return false;
+ },
+
+ // Determines if an XMLHttpRequest returns NotModified
+ httpNotModified: function( xhr, url ) {
+ var lastModified = xhr.getResponseHeader("Last-Modified"),
+ etag = xhr.getResponseHeader("Etag");
+
+ if ( lastModified ) {
+ jQuery.lastModified[url] = lastModified;
+ }
+
+ if ( etag ) {
+ jQuery.etag[url] = etag;
+ }
+
+ // Opera returns 0 when status is 304
+ return xhr.status === 304 || xhr.status === 0;
+ },
+
+ httpData: function( xhr, type, s ) {
+ var ct = xhr.getResponseHeader("content-type") || "",
+ xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if ( xml && data.documentElement.nodeName === "parsererror" ) {
+ jQuery.error( "parsererror" );
+ }
+
+ // Allow a pre-filtering function to sanitize the response
+ // s is checked to keep backwards compatibility
+ if ( s && s.dataFilter ) {
+ data = s.dataFilter( data, type );
+ }
+
+ // The filter can actually parse the response
+ if ( typeof data === "string" ) {
+ // Get the JavaScript object, if JSON is used.
+ if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
+ data = jQuery.parseJSON( data );
+
+ // If the type is "script", eval it in global context
+ } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
+ jQuery.globalEval( data );
+ }
+ }
+
+ return data;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a, traditional ) {
+ var s = [];
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray(a) || a.jquery ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( var prefix in a ) {
+ buildParams( prefix, a[prefix] );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join("&").replace(r20, "+");
+
+ function buildParams( prefix, obj ) {
+ if ( jQuery.isArray(obj) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || /\[\]$/.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+ } else {
+ // If array item is non-scalar (array or object), encode its
+ // numeric index to resolve deserialization ambiguity issues.
+ // Note that rack (as of 1.0.0) can't currently deserialize
+ // nested arrays properly, and attempting to do so may cause
+ // a server error. Possible fixes are to modify rack's
+ // deserialization algorithm or to provide an option or flag
+ // to force array serialization to be shallow.
+ buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
+ }
+ });
+
+ } else if ( !traditional && obj != null && typeof obj === "object" ) {
+ // Serialize object item.
+ jQuery.each( obj, function( k, v ) {
+ buildParams( prefix + "[" + k + "]", v );
+ });
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+ }
+
+ function add( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction(value) ? value() : value;
+ s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
+ }
+ }
+});
+var elemdisplay = {},
+ rfxtypes = /toggle|show|hide/,
+ rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
+ timerId,
+ fxAttrs = [
+ // height animations
+ [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+ // width animations
+ [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+ // opacity animations
+ [ "opacity" ]
+ ];
+
+jQuery.fn.extend({
+ show: function( speed, callback ) {
+ if ( speed || speed === 0) {
+ return this.animate( genFx("show", 3), speed, callback);
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var old = jQuery.data(this[i], "olddisplay");
+
+ this[i].style.display = old || "";
+
+ if ( jQuery.css(this[i], "display") === "none" ) {
+ var nodeName = this[i].nodeName, display;
+
+ if ( elemdisplay[ nodeName ] ) {
+ display = elemdisplay[ nodeName ];
+
+ } else {
+ var elem = jQuery("<" + nodeName + " />").appendTo("body");
+
+ display = elem.css("display");
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+
+ elem.remove();
+
+ elemdisplay[ nodeName ] = display;
+ }
+
+ jQuery.data(this[i], "olddisplay", display);
+ }
+ }
+
+ // Set the display of the elements in a second loop
+ // to avoid the constant reflow
+ for ( var j = 0, k = this.length; j < k; j++ ) {
+ this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
+ }
+
+ return this;
+ }
+ },
+
+ hide: function( speed, callback ) {
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("hide", 3), speed, callback);
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var old = jQuery.data(this[i], "olddisplay");
+ if ( !old && old !== "none" ) {
+ jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
+ }
+ }
+
+ // Set the display of the elements in a second loop
+ // to avoid the constant reflow
+ for ( var j = 0, k = this.length; j < k; j++ ) {
+ this[j].style.display = "none";
+ }
+
+ return this;
+ }
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2 ) {
+ var bool = typeof fn === "boolean";
+
+ if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+ this._toggle.apply( this, arguments );
+
+ } else if ( fn == null || bool ) {
+ this.each(function() {
+ var state = bool ? fn : jQuery(this).is(":hidden");
+ jQuery(this)[ state ? "show" : "hide" ]();
+ });
+
+ } else {
+ this.animate(genFx("toggle", 3), fn, fn2);
+ }
+
+ return this;
+ },
+
+ fadeTo: function( speed, to, callback ) {
+ return this.filter(":hidden").css("opacity", 0).show().end()
+ .animate({opacity: to}, speed, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var optall = jQuery.speed(speed, easing, callback);
+
+ if ( jQuery.isEmptyObject( prop ) ) {
+ return this.each( optall.complete );
+ }
+
+ return this[ optall.queue === false ? "each" : "queue" ](function() {
+ var opt = jQuery.extend({}, optall), p,
+ hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
+ self = this;
+
+ for ( p in prop ) {
+ var name = p.replace(rdashAlpha, fcamelCase);
+
+ if ( p !== name ) {
+ prop[ name ] = prop[ p ];
+ delete prop[ p ];
+ p = name;
+ }
+
+ if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
+ return opt.complete.call(this);
+ }
+
+ if ( ( p === "height" || p === "width" ) && this.style ) {
+ // Store display property
+ opt.display = jQuery.css(this, "display");
+
+ // Make sure that nothing sneaks out
+ opt.overflow = this.style.overflow;
+ }
+
+ if ( jQuery.isArray( prop[p] ) ) {
+ // Create (if needed) and add to specialEasing
+ (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+ prop[p] = prop[p][0];
+ }
+ }
+
+ if ( opt.overflow != null ) {
+ this.style.overflow = "hidden";
+ }
+
+ opt.curAnim = jQuery.extend({}, prop);
+
+ jQuery.each( prop, function( name, val ) {
+ var e = new jQuery.fx( self, opt, name );
+
+ if ( rfxtypes.test(val) ) {
+ e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+
+ } else {
+ var parts = rfxnum.exec(val),
+ start = e.cur(true) || 0;
+
+ if ( parts ) {
+ var end = parseFloat( parts[2] ),
+ unit = parts[3] || "px";
+
+ // We need to compute starting value
+ if ( unit !== "px" ) {
+ self.style[ name ] = (end || 1) + unit;
+ start = ((end || 1) / e.cur(true)) * start;
+ self.style[ name ] = start + unit;
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] ) {
+ end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
+ }
+
+ e.custom( start, end, unit );
+
+ } else {
+ e.custom( start, val, "" );
+ }
+ }
+ });
+
+ // For JS strict compliance
+ return true;
+ });
+ },
+
+ stop: function( clearQueue, gotoEnd ) {
+ var timers = jQuery.timers;
+
+ if ( clearQueue ) {
+ this.queue([]);
+ }
+
+ this.each(function() {
+ // go in reverse order so anything added to the queue during the loop is ignored
+ for ( var i = timers.length - 1; i >= 0; i-- ) {
+ if ( timers[i].elem === this ) {
+ if (gotoEnd) {
+ // force the next step to be the last
+ timers[i](true);
+ }
+
+ timers.splice(i, 1);
+ }
+ }
+ });
+
+ // start the next in the queue if the last step wasn't forced
+ if ( !gotoEnd ) {
+ this.dequeue();
+ }
+
+ return this;
+ }
+
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show", 1),
+ slideUp: genFx("hide", 1),
+ slideToggle: genFx("toggle", 1),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, callback ) {
+ return this.animate( props, speed, callback );
+ };
+});
+
+jQuery.extend({
+ speed: function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? speed : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
+
+ // Queueing
+ opt.old = opt.complete;
+ opt.complete = function() {
+ if ( opt.queue !== false ) {
+ jQuery(this).dequeue();
+ }
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+
+ fx: function( elem, options, prop ) {
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ if ( !options.orig ) {
+ options.orig = {};
+ }
+ }
+
+});
+
+jQuery.fx.prototype = {
+ // Simple function for setting a style value
+ update: function() {
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+
+ // Set display property to block for height/width animations
+ if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
+ this.elem.style.display = "block";
+ }
+ },
+
+ // Get the current size
+ cur: function( force ) {
+ if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+ return this.elem[ this.prop ];
+ }
+
+ var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+ return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+ },
+
+ // Start an animation from one number to another
+ custom: function( from, to, unit ) {
+ this.startTime = now();
+ this.start = from;
+ this.end = to;
+ this.unit = unit || this.unit || "px";
+ this.now = this.start;
+ this.pos = this.state = 0;
+
+ var self = this;
+ function t( gotoEnd ) {
+ return self.step(gotoEnd);
+ }
+
+ t.elem = this.elem;
+
+ if ( t() && jQuery.timers.push(t) && !timerId ) {
+ timerId = setInterval(jQuery.fx.tick, 13);
+ }
+ },
+
+ // Simple 'show' function
+ show: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+ // Start by showing the element
+ jQuery( this.elem ).show();
+ },
+
+ // Simple 'hide' function
+ hide: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom(this.cur(), 0);
+ },
+
+ // Each step of an animation
+ step: function( gotoEnd ) {
+ var t = now(), done = true;
+
+ if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ this.options.curAnim[ this.prop ] = true;
+
+ for ( var i in this.options.curAnim ) {
+ if ( this.options.curAnim[i] !== true ) {
+ done = false;
+ }
+ }
+
+ if ( done ) {
+ if ( this.options.display != null ) {
+ // Reset the overflow
+ this.elem.style.overflow = this.options.overflow;
+
+ // Reset the display
+ var old = jQuery.data(this.elem, "olddisplay");
+ this.elem.style.display = old ? old : this.options.display;
+
+ if ( jQuery.css(this.elem, "display") === "none" ) {
+ this.elem.style.display = "block";
+ }
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( this.options.hide ) {
+ jQuery(this.elem).hide();
+ }
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( this.options.hide || this.options.show ) {
+ for ( var p in this.options.curAnim ) {
+ jQuery.style(this.elem, p, this.options.orig[p]);
+ }
+ }
+
+ // Execute the complete function
+ this.options.complete.call( this.elem );
+ }
+
+ return false;
+
+ } else {
+ var n = t - this.startTime;
+ this.state = n / this.options.duration;
+
+ // Perform the easing function, defaults to swing
+ var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+ var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+ this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+ this.now = this.start + ((this.end - this.start) * this.pos);
+
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+};
+
+jQuery.extend( jQuery.fx, {
+ tick: function() {
+ var timers = jQuery.timers;
+
+ for ( var i = 0; i < timers.length; i++ ) {
+ if ( !timers[i]() ) {
+ timers.splice(i--, 1);
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ },
+
+ stop: function() {
+ clearInterval( timerId );
+ timerId = null;
+ },
+
+ speeds: {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+ },
+
+ step: {
+ opacity: function( fx ) {
+ jQuery.style(fx.elem, "opacity", fx.now);
+ },
+
+ _default: function( fx ) {
+ if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+ fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+ } else {
+ fx.elem[ fx.prop ] = fx.now;
+ }
+ }
+ }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+ };
+}
+
+function genFx( type, num ) {
+ var obj = {};
+
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+ obj[ this ] = type;
+ });
+
+ return obj;
+}
+if ( "getBoundingClientRect" in document.documentElement ) {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0];
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
+ clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+ top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
+ left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
+
+ return { top: top, left: left };
+ };
+
+} else {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0];
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ jQuery.offset.initialize();
+
+ var offsetParent = elem.offsetParent, prevOffsetParent = elem,
+ doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
+ body = doc.body, defaultView = doc.defaultView,
+ prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+ top = elem.offsetTop, left = elem.offsetLeft;
+
+ while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ break;
+ }
+
+ computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+ top -= elem.scrollTop;
+ left -= elem.scrollLeft;
+
+ if ( elem === offsetParent ) {
+ top += elem.offsetTop;
+ left += elem.offsetLeft;
+
+ if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
+ }
+
+ if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevComputedStyle = computedStyle;
+ }
+
+ if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+ top += body.offsetTop;
+ left += body.offsetLeft;
+ }
+
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ top += Math.max( docElem.scrollTop, body.scrollTop );
+ left += Math.max( docElem.scrollLeft, body.scrollLeft );
+ }
+
+ return { top: top, left: left };
+ };
+}
+
+jQuery.offset = {
+ initialize: function() {
+ var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
+ html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+ jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+ container.innerHTML = html;
+ body.insertBefore( container, body.firstChild );
+ innerDiv = container.firstChild;
+ checkDiv = innerDiv.firstChild;
+ td = innerDiv.nextSibling.firstChild.firstChild;
+
+ this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+ this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+ checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
+ // safari subtracts parent border width here which is 5px
+ this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+ checkDiv.style.position = checkDiv.style.top = "";
+
+ innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
+ this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+ this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+ body.removeChild( container );
+ body = container = innerDiv = checkDiv = table = td = null;
+ jQuery.offset.initialize = jQuery.noop;
+ },
+
+ bodyOffset: function( body ) {
+ var top = body.offsetTop, left = body.offsetLeft;
+
+ jQuery.offset.initialize();
+
+ if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+ top += parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0;
+ left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
+ }
+
+ return { top: top, left: left };
+ },
+
+ setOffset: function( elem, options, i ) {
+ // set position first, in-case top/left are set even on static elem
+ if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
+ elem.style.position = "relative";
+ }
+ var curElem = jQuery( elem ),
+ curOffset = curElem.offset(),
+ curTop = parseInt( jQuery.curCSS( elem, "top", true ), 10 ) || 0,
+ curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ var props = {
+ top: (options.top - curOffset.top) + curTop,
+ left: (options.left - curOffset.left) + curLeft
+ };
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+
+jQuery.fn.extend({
+ position: function() {
+ if ( !this[0] ) {
+ return null;
+ }
+
+ var elem = this[0],
+
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent(),
+
+ // Get correct offsets
+ offset = this.offset(),
+ parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+ // Subtract element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0;
+ offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
+
+ // Add offsetParent borders
+ parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0;
+ parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
+
+ // Subtract the two offsets
+ return {
+ top: offset.top - parentOffset.top,
+ left: offset.left - parentOffset.left
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || document.body;
+ while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+ return offsetParent;
+ });
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+ var method = "scroll" + name;
+
+ jQuery.fn[ method ] = function(val) {
+ var elem = this[0], win;
+
+ if ( !elem ) {
+ return null;
+ }
+
+ if ( val !== undefined ) {
+ // Set the scroll offset
+ return this.each(function() {
+ win = getWindow( this );
+
+ if ( win ) {
+ win.scrollTo(
+ !i ? val : jQuery(win).scrollLeft(),
+ i ? val : jQuery(win).scrollTop()
+ );
+
+ } else {
+ this[ method ] = val;
+ }
+ });
+ } else {
+ win = getWindow( elem );
+
+ // Return the scroll offset
+ return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+ jQuery.support.boxModel && win.document.documentElement[ method ] ||
+ win.document.body[ method ] :
+ elem[ method ];
+ }
+ };
+});
+
+function getWindow( elem ) {
+ return ("scrollTo" in elem && elem.document) ?
+ elem :
+ elem.nodeType === 9 ?
+ elem.defaultView || elem.parentWindow :
+ false;
+}
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+ var type = name.toLowerCase();
+
+ // innerHeight and innerWidth
+ jQuery.fn["inner" + name] = function() {
+ return this[0] ?
+ jQuery.css( this[0], type, false, "padding" ) :
+ null;
+ };
+
+ // outerHeight and outerWidth
+ jQuery.fn["outer" + name] = function( margin ) {
+ return this[0] ?
+ jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
+ null;
+ };
+
+ jQuery.fn[ type ] = function( size ) {
+ // Get window width or height
+ var elem = this[0];
+ if ( !elem ) {
+ return size == null ? null : this;
+ }
+
+ if ( jQuery.isFunction( size ) ) {
+ return this.each(function( i ) {
+ var self = jQuery( this );
+ self[ type ]( size.call( this, i, self[ type ]() ) );
+ });
+ }
+
+ return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+ elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
+ elem.document.body[ "client" + name ] :
+
+ // Get document width or height
+ (elem.nodeType === 9) ? // is it a document
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ Math.max(
+ elem.documentElement["client" + name],
+ elem.body["scroll" + name], elem.documentElement["scroll" + name],
+ elem.body["offset" + name], elem.documentElement["offset" + name]
+ ) :
+
+ // Get or set width or height on the element
+ size === undefined ?
+ // Get width or height on the element
+ jQuery.css( elem, type ) :
+
+ // Set the width or height on the element (default to pixels if value is unitless)
+ this.css( type, typeof size === "string" ? size : ( parseInt( size ) || 0 ) + "px" );
+ };
+
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+})(window);
diff --git a/resources/jquery/jquery.localize.js b/resources/jquery/jquery.localize.js
new file mode 100644
index 00000000..3c8f597a
--- /dev/null
+++ b/resources/jquery/jquery.localize.js
@@ -0,0 +1,64 @@
+/**
+ * Simple Placeholder-based Localization
+ *
+ * Call on a selection of HTML which contains <msg key="message-key" /> elements or elements with
+ * title-msg="message-key" or alt-msg="message-key" attributes. <msg /> elements will be replaced
+ * with localized text, elements with title-msg and alt-msg attributes will receive localized title
+ * and alt attributes.
+ *
+ * Note that "msg" elements must have html namespacing such as "<html:msg />" to be compatible with
+ * Internet Explorer.
+ *
+ * Example:
+ * <p class="somethingCool">
+ * <html:msg key="my-message" />
+ * <img src="something.jpg" title-msg="my-title-message" alt-msg="my-alt-message" />
+ * </p>
+ *
+ * Localizes to...
+ *
+ * <p class="somethingCool">
+ * My Message
+ * <img src="something.jpg" title="My Title Message" alt="My Alt Message" />
+ * </p>
+ */
+
+( function( $, mw ) {
+ /**
+ * Localizes a DOM selection by replacing <msg /> elements with localized text and adding
+ * localized title and alt attributes to elements with title-msg and alt-msg attributes
+ * respectively.
+ *
+ * @param Object: options Map of options
+ * * prefix: Message prefix to use when localizing elements and attributes
+ */
+
+ $.fn.localize = function( options ) {
+ options = $.extend( { 'prefix': '' }, options );
+ return $(this)
+ .find( 'msg,html\\:msg' )
+ .each( function() {
+ $(this)
+ .text( mediaWiki.msg( options.prefix + $(this).attr( 'key' ) ) )
+ .replaceWith( $(this).html() );
+ } )
+ .end()
+ .find( '[title-msg]' )
+ .each( function() {
+ $(this)
+ .attr( 'title', mw.msg( options.prefix + $(this).attr( 'title-msg' ) ) )
+ .removeAttr( 'title-msg' );
+ } )
+ .end()
+ .find( '[alt-msg]' )
+ .each( function() {
+ $(this)
+ .attr( 'alt', mw.msg( options.prefix + $(this).attr( 'alt-msg' ) ) )
+ .removeAttr( 'alt-msg' );
+ } )
+ .end();
+ };
+} )( jQuery, mediaWiki );
+
+// Let IE know about the msg tag before it's used...
+document.createElement( 'msg' );
diff --git a/resources/jquery/jquery.placeholder.js b/resources/jquery/jquery.placeholder.js
new file mode 100644
index 00000000..0b54893e
--- /dev/null
+++ b/resources/jquery/jquery.placeholder.js
@@ -0,0 +1,85 @@
+/**
+ * HTML5 placeholder emulation for jQuery plugin
+ *
+ * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
+ *
+ * @author Trevor Parscal <tparscal@wikimedia.org>
+ * @author Krinkle <krinklemail@gmail.com>
+ * @version 0.2.0
+ * @license GPL v2
+ */
+( function( $ ) {
+
+jQuery.fn.placeholder = function() {
+
+ return this.each( function() {
+
+ // If the HTML5 placeholder attribute is supported, use it
+ if ( this.placeholder && 'placeholder' in document.createElement( this.tagName ) ) {
+ return;
+ }
+
+ var placeholder = this.getAttribute('placeholder');
+ var $input = jQuery(this);
+
+ // Show initially, if empty
+ if ( this.value === '' || this.value == placeholder ) {
+ $input.addClass( 'placeholder' ).val( placeholder );
+ }
+
+ $input
+ // Show on blur if empty
+ .blur( function() {
+ if ( this.value === '' ) {
+ this.value = placeholder;
+ $input.addClass( 'placeholder' );
+ }
+ } )
+
+ // Hide on focus
+ // Also listen for other events in case $input was
+ // already focused when the events were bound
+ .bind( 'focus drop keydown paste', function( e ) {
+ if ($input.hasClass('placeholder')) {
+ if ( e.type == 'drop' && e.originalEvent.dataTransfer ) {
+ // Support for drag&drop. Instead of inserting the dropped
+ // text somewhere in the middle of the placeholder string,
+ // we want to set the contents of the search box to the
+ // dropped text.
+
+ // IE wants getData( 'text' ) but Firefox wants getData( 'text/plain' )
+ // Firefox fails gracefully with an empty string, IE barfs with an error
+ try {
+ // Try the Firefox way
+ this.value = e.originalEvent.dataTransfer.getData( 'text/plain' );
+ } catch ( exception ) {
+ // Got an exception, so use the IE way
+ this.value = e.originalEvent.dataTransfer.getData( 'text' );
+ }
+
+ // On Firefox, drop fires after the dropped text has been inserted,
+ // but on IE it fires before. If we don't prevent the default action,
+ // IE will insert the dropped text twice.
+ e.preventDefault();
+ } else {
+ this.value = '';
+ }
+ $input.removeClass( 'placeholder' );
+ }
+ } );
+
+ // Blank on submit -- prevents submitting with unintended value
+ this.form && $( this.form ).submit( function() {
+ // $input.trigger( 'focus' ); would be problematic
+ // because it actually focuses $input, leading
+ // to nasty behavior in mobile browsers
+ if ( $input.hasClass('placeholder') ) {
+ $input
+ .val( '' )
+ .removeClass( 'placeholder' );
+ }
+ });
+
+ });
+};
+} )( jQuery );
diff --git a/resources/jquery/jquery.suggestions.css b/resources/jquery/jquery.suggestions.css
new file mode 100644
index 00000000..f0b48da1
--- /dev/null
+++ b/resources/jquery/jquery.suggestions.css
@@ -0,0 +1,75 @@
+/* suggestions plugin */
+
+.suggestions {
+ overflow: hidden;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 0px;
+ border: none;
+ z-index: 99;
+ padding: 0;
+ margin: -1px -1px 0 0;
+}
+/* IGNORED BY IE6 */
+html > body .suggestions {
+ margin: -1px 0 0 0;
+}
+.suggestions-special {
+ position: relative;
+ background-color: Window;
+ font-size: 0.8em;
+ cursor: pointer;
+ border: solid 1px #aaaaaa;
+ padding: 0;
+ margin: 0;
+ margin-top: -2px;
+ display: none;
+ padding: 0.25em 0.25em;
+ line-height: 1.25em;
+}
+.suggestions-results {
+ background-color: white;
+ background-color: Window;
+ font-size: 0.8em;
+ cursor: pointer;
+ border: solid 1px #aaaaaa;
+ padding: 0;
+ margin: 0;
+}
+.suggestions-result {
+ color: black;
+ color: WindowText;
+ margin: 0;
+ line-height: 1.5em;
+ padding: 0.01em 0.25em;
+ text-align: left;
+}
+.suggestions-result-current {
+ background-color: #4C59A6;
+ background-color: Highlight;
+ color: white;
+ color: HighlightText;
+}
+.suggestions-special .special-label {
+ font-size: 0.8em;
+ color: gray;
+ text-align: left;
+}
+.suggestions-special .special-query {
+ color: black;
+ font-style: italic;
+ text-align: left;
+}
+.suggestions-special .special-hover {
+ background-color: silver;
+}
+.suggestions-result-current .special-label,
+.suggestions-result-current .special-query {
+ color: white;
+ color: HighlightText;
+}
+.autoellipsis-matched,
+.highlight {
+ font-weight: bold;
+} \ No newline at end of file
diff --git a/resources/jquery/jquery.suggestions.js b/resources/jquery/jquery.suggestions.js
new file mode 100644
index 00000000..9fc8a47d
--- /dev/null
+++ b/resources/jquery/jquery.suggestions.js
@@ -0,0 +1,521 @@
+/**
+ * This plugin provides a generic way to add suggestions to a text box.
+ *
+ * Usage:
+ *
+ * Set options:
+ * $('#textbox').suggestions( { option1: value1, option2: value2 } );
+ * $('#textbox').suggestions( option, value );
+ * Get option:
+ * value = $('#textbox').suggestions( option );
+ * Initialize:
+ * $('#textbox').suggestions();
+ *
+ * Options:
+ *
+ * fetch(query): Callback that should fetch suggestions and set the suggestions property. Executed in the context of the
+ * textbox
+ * Type: Function
+ * cancel: Callback function to call when any pending asynchronous suggestions fetches should be canceled.
+ * Executed in the context of the textbox
+ * Type: Function
+ * special: Set of callbacks for rendering and selecting
+ * Type: Object of Functions 'render' and 'select'
+ * result: Set of callbacks for rendering and selecting
+ * Type: Object of Functions 'render' and 'select'
+ * $region: jQuery selection of element to place the suggestions below and match width of
+ * Type: jQuery Object, Default: $(this)
+ * suggestions: Suggestions to display
+ * Type: Array of strings
+ * maxRows: Maximum number of suggestions to display at one time
+ * Type: Number, Range: 1 - 100, Default: 7
+ * delay: Number of ms to wait for the user to stop typing
+ * Type: Number, Range: 0 - 1200, Default: 120
+ * submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
+ * Type: Boolean, Default: false
+ * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set to e.g. 2, the suggestions box
+ * will never be grown beyond 2 times the width of the textbox.
+ * Type: Number, Range: 1 - infinity, Default: 3
+ * positionFromLeft: Whether to position the suggestion box with the left attribute or the right
+ * Type: Boolean, Default: true
+ * highlightInput: Whether to hightlight matched portions of the input or not
+ * Type: Boolean, Default: false
+ */
+( function( $ ) {
+
+$.suggestions = {
+ /**
+ * Cancel any delayed updateSuggestions() call and inform the user so
+ * they can cancel their result fetching if they use AJAX or something
+ */
+ cancel: function( context ) {
+ if ( context.data.timerID != null ) {
+ clearTimeout( context.data.timerID );
+ }
+ if ( typeof context.config.cancel == 'function' ) {
+ context.config.cancel.call( context.data.$textbox );
+ }
+ },
+ /**
+ * Restore the text the user originally typed in the textbox, before it was overwritten by highlight(). This
+ * restores the value the currently displayed suggestions are based on, rather than the value just before
+ * highlight() overwrote it; the former is arguably slightly more sensible.
+ */
+ restore: function( context ) {
+ context.data.$textbox.val( context.data.prevText );
+ },
+ /**
+ * Ask the user-specified callback for new suggestions. Any previous delayed call to this function still pending
+ * will be canceled. If the value in the textbox hasn't changed since the last time suggestions were fetched, this
+ * function does nothing.
+ * @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
+ */
+ update: function( context, delayed ) {
+ // Only fetch if the value in the textbox changed
+ function maybeFetch() {
+ if ( context.data.$textbox.val() !== context.data.prevText ) {
+ context.data.prevText = context.data.$textbox.val();
+ if ( typeof context.config.fetch == 'function' ) {
+ context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
+ }
+ }
+ }
+ // Cancel previous call
+ if ( context.data.timerID != null ) {
+ clearTimeout( context.data.timerID );
+ }
+ if ( delayed ) {
+ // Start a new asynchronous call
+ context.data.timerID = setTimeout( maybeFetch, context.config.delay );
+ } else {
+ maybeFetch();
+ }
+ $.suggestions.special( context );
+ },
+ special: function( context ) {
+ // Allow custom rendering - but otherwise don't do any rendering
+ if ( typeof context.config.special.render == 'function' ) {
+ // Wait for the browser to update the value
+ setTimeout( function() {
+ // Render special
+ $special = context.data.$container.find( '.suggestions-special' );
+ context.config.special.render.call( $special, context.data.$textbox.val() );
+ }, 1 );
+ }
+ },
+ /**
+ * Sets the value of a property, and updates the widget accordingly
+ * @param property String Name of property
+ * @param value Mixed Value to set property with
+ */
+ configure: function( context, property, value ) {
+ // Validate creation using fallback values
+ switch( property ) {
+ case 'fetch':
+ case 'cancel':
+ case 'special':
+ case 'result':
+ case '$region':
+ context.config[property] = value;
+ break;
+ case 'suggestions':
+ context.config[property] = value;
+ // Update suggestions
+ if ( typeof context.data !== 'undefined' ) {
+ if ( context.data.$textbox.val().length == 0 ) {
+ // Hide the div when no suggestion exist
+ context.data.$container.hide();
+ } else {
+ // Rebuild the suggestions list
+ context.data.$container.show();
+ // Update the size and position of the list
+ var newCSS = {
+ 'top': context.config.$region.offset().top + context.config.$region.outerHeight(),
+ 'bottom': 'auto',
+ 'width': context.config.$region.outerWidth(),
+ 'height': 'auto'
+ };
+ if ( context.config.positionFromLeft ) {
+ newCSS['left'] = context.config.$region.offset().left;
+ newCSS['right'] = 'auto';
+ } else {
+ newCSS['left'] = 'auto';
+ newCSS['right'] = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+ }
+ context.data.$container.css( newCSS );
+ var $results = context.data.$container.children( '.suggestions-results' );
+ $results.empty();
+ var expWidth = -1;
+ var $autoEllipseMe = $( [] );
+ var matchedText = null;
+ for ( var i = 0; i < context.config.suggestions.length; i++ ) {
+ var text = context.config.suggestions[i];
+ var $result = $( '<div />' )
+ .addClass( 'suggestions-result' )
+ .attr( 'rel', i )
+ .data( 'text', context.config.suggestions[i] )
+ .mousemove( function( e ) {
+ context.data.selectedWithMouse = true;
+ $.suggestions.highlight(
+ context, $(this).closest( '.suggestions-results div' ), false
+ );
+ } )
+ .appendTo( $results );
+ // Allow custom rendering
+ if ( typeof context.config.result.render == 'function' ) {
+ context.config.result.render.call( $result, context.config.suggestions[i] );
+ } else {
+ // Add <span> with text
+ if( context.config.highlightInput ) {
+ matchedText = context.data.prevText;
+ }
+ $result.append( $( '<span />' )
+ .css( 'whiteSpace', 'nowrap' )
+ .text( text )
+ );
+
+ // Widen results box if needed
+ // New width is only calculated here, applied later
+ var $span = $result.children( 'span' );
+ if ( $span.outerWidth() > $result.width() && $span.outerWidth() > expWidth ) {
+ // factor in any padding, margin, or border space on the parent
+ expWidth = $span.outerWidth() + ( context.data.$container.width() - $span.parent().width());
+ }
+ $autoEllipseMe = $autoEllipseMe.add( $result );
+ }
+ }
+ // Apply new width for results box, if any
+ if ( expWidth > context.data.$container.width() ) {
+ var maxWidth = context.config.maxExpandFactor*context.data.$textbox.width();
+ context.data.$container.width( Math.min( expWidth, maxWidth ) );
+ }
+ // autoEllipse the results. Has to be done after changing the width
+ $autoEllipseMe.autoEllipsis( { hasSpan: true, tooltip: true, matchText: matchedText } );
+ }
+ }
+ break;
+ case 'maxRows':
+ context.config[property] = Math.max( 1, Math.min( 100, value ) );
+ break;
+ case 'delay':
+ context.config[property] = Math.max( 0, Math.min( 1200, value ) );
+ break;
+ case 'maxExpandFactor':
+ context.config[property] = Math.max( 1, value );
+ break;
+ case 'submitOnClick':
+ case 'positionFromLeft':
+ case 'highlightInput':
+ context.config[property] = value ? true : false;
+ break;
+ }
+ },
+ /**
+ * Highlight a result in the results table
+ * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
+ * @param updateTextbox If true, put the suggestion in the textbox
+ */
+ highlight: function( context, result, updateTextbox ) {
+ var selected = context.data.$container.find( '.suggestions-result-current' );
+ if ( !result.get || selected.get( 0 ) != result.get( 0 ) ) {
+ if ( result == 'prev' ) {
+ if( selected.is( '.suggestions-special' ) ) {
+ result = context.data.$container.find( '.suggestions-result:last' )
+ } else {
+ result = selected.prev();
+ if ( selected.length == 0 ) {
+ // we are at the begginning, so lets jump to the last item
+ if ( context.data.$container.find( '.suggestions-special' ).html() != "" ) {
+ result = context.data.$container.find( '.suggestions-special' );
+ } else {
+ result = context.data.$container.find( '.suggestions-results div:last' );
+ }
+ }
+ }
+ } else if ( result == 'next' ) {
+ if ( selected.length == 0 ) {
+ // No item selected, go to the first one
+ result = context.data.$container.find( '.suggestions-results div:first' );
+ if ( result.length == 0 && context.data.$container.find( '.suggestions-special' ).html() != "" ) {
+ // No suggestion exists, go to the special one directly
+ result = context.data.$container.find( '.suggestions-special' );
+ }
+ } else {
+ result = selected.next();
+ if ( selected.is( '.suggestions-special' ) ) {
+ result = $( [] );
+ } else if (
+ result.length == 0 &&
+ context.data.$container.find( '.suggestions-special' ).html() != ""
+ ) {
+ // We were at the last item, jump to the specials!
+ result = context.data.$container.find( '.suggestions-special' );
+ }
+ }
+ }
+ selected.removeClass( 'suggestions-result-current' );
+ result.addClass( 'suggestions-result-current' );
+ }
+ if ( updateTextbox ) {
+ if ( result.length == 0 || result.is( '.suggestions-special' ) ) {
+ $.suggestions.restore( context );
+ } else {
+ context.data.$textbox.val( result.data( 'text' ) );
+ // .val() doesn't call any event handlers, so
+ // let the world know what happened
+ context.data.$textbox.change();
+ }
+ context.data.$textbox.trigger( 'change' );
+ }
+ },
+ /**
+ * Respond to keypress event
+ * @param key Integer Code of key pressed
+ */
+ keypress: function( e, context, key ) {
+ var wasVisible = context.data.$container.is( ':visible' );
+ var preventDefault = false;
+ switch ( key ) {
+ // Arrow down
+ case 40:
+ if ( wasVisible ) {
+ $.suggestions.highlight( context, 'next', true );
+ context.data.selectedWithMouse = false;
+ } else {
+ $.suggestions.update( context, false );
+ }
+ preventDefault = true;
+ break;
+ // Arrow up
+ case 38:
+ if ( wasVisible ) {
+ $.suggestions.highlight( context, 'prev', true );
+ context.data.selectedWithMouse = false;
+ }
+ preventDefault = wasVisible;
+ break;
+ // Escape
+ case 27:
+ context.data.$container.hide();
+ $.suggestions.restore( context );
+ $.suggestions.cancel( context );
+ context.data.$textbox.trigger( 'change' );
+ preventDefault = wasVisible;
+ break;
+ // Enter
+ case 13:
+ context.data.$container.hide();
+ preventDefault = wasVisible;
+ selected = context.data.$container.find( '.suggestions-result-current' );
+ if ( selected.size() == 0 || context.data.selectedWithMouse ) {
+ // if nothing is selected OR if something was selected with the mouse,
+ // cancel any current requests and submit the form
+ $.suggestions.cancel( context );
+ context.config.$region.closest( 'form' ).submit();
+ } else if ( selected.is( '.suggestions-special' ) ) {
+ if ( typeof context.config.special.select == 'function' ) {
+ context.config.special.select.call( selected, context.data.$textbox );
+ }
+ } else {
+ if ( typeof context.config.result.select == 'function' ) {
+ $.suggestions.highlight( context, selected, true );
+ context.config.result.select.call( selected, context.data.$textbox );
+ } else {
+ $.suggestions.highlight( context, selected, true );
+ }
+ }
+ break;
+ default:
+ $.suggestions.update( context, true );
+ break;
+ }
+ if ( preventDefault ) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ }
+ }
+};
+$.fn.suggestions = function() {
+
+ // Multi-context fields
+ var returnValue = null;
+ var args = arguments;
+
+ $(this).each( function() {
+
+ /* Construction / Loading */
+
+ var context = $(this).data( 'suggestions-context' );
+ if ( typeof context == 'undefined' || context == null ) {
+ context = {
+ config: {
+ 'fetch' : function() {},
+ 'cancel': function() {},
+ 'special': {},
+ 'result': {},
+ '$region': $(this),
+ 'suggestions': [],
+ 'maxRows': 7,
+ 'delay': 120,
+ 'submitOnClick': false,
+ 'maxExpandFactor': 3,
+ 'positionFromLeft': true,
+ 'highlightInput': false
+ }
+ };
+ }
+
+ /* API */
+
+ // Handle various calling styles
+ if ( args.length > 0 ) {
+ if ( typeof args[0] == 'object' ) {
+ // Apply set of properties
+ for ( var key in args[0] ) {
+ $.suggestions.configure( context, key, args[0][key] );
+ }
+ } else if ( typeof args[0] == 'string' ) {
+ if ( args.length > 1 ) {
+ // Set property values
+ $.suggestions.configure( context, args[0], args[1] );
+ } else if ( returnValue == null ) {
+ // Get property values, but don't give access to internal data - returns only the first
+ returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+ }
+ }
+ }
+
+ /* Initialization */
+
+ if ( typeof context.data == 'undefined' ) {
+ context.data = {
+ // ID of running timer
+ 'timerID': null,
+ // Text in textbox when suggestions were last fetched
+ 'prevText': null,
+ // Number of results visible without scrolling
+ 'visibleResults': 0,
+ // Suggestion the last mousedown event occured on
+ 'mouseDownOn': $( [] ),
+ '$textbox': $(this),
+ 'selectedWithMouse': false
+ };
+ // Setup the css for positioning the results box
+ var newCSS = {
+ 'top': Math.round( context.data.$textbox.offset().top + context.data.$textbox.outerHeight() ),
+ 'width': context.data.$textbox.outerWidth(),
+ 'display': 'none'
+ };
+ if ( context.config.positionFromLeft ) {
+ newCSS['left'] = context.config.$region.offset().left;
+ newCSS['right'] = 'auto';
+ } else {
+ newCSS['left'] = 'auto';
+ newCSS['right'] = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+ }
+
+ context.data.$container = $( '<div />' )
+ .css( newCSS )
+ .addClass( 'suggestions' )
+ .append(
+ $( '<div />' ).addClass( 'suggestions-results' )
+ // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
+ // listen for a mousedown followed by a mouseup on the same div
+ .mousedown( function( e ) {
+ context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results div' );
+ } )
+ .mouseup( function( e ) {
+ var $result = $( e.target ).closest( '.suggestions-results div' );
+ var $other = context.data.mouseDownOn;
+ context.data.mouseDownOn = $( [] );
+ if ( $result.get( 0 ) != $other.get( 0 ) ) {
+ return;
+ }
+ $.suggestions.highlight( context, $result, true );
+ context.data.$container.hide();
+ if ( typeof context.config.result.select == 'function' ) {
+ context.config.result.select.call( $result, context.data.$textbox );
+ }
+ context.data.$textbox.focus();
+ } )
+ )
+ .append(
+ $( '<div />' ).addClass( 'suggestions-special' )
+ // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
+ // listen for a mousedown followed by a mouseup on the same div
+ .mousedown( function( e ) {
+ context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
+ } )
+ .mouseup( function( e ) {
+ var $special = $( e.target ).closest( '.suggestions-special' );
+ var $other = context.data.mouseDownOn;
+ context.data.mouseDownOn = $( [] );
+ if ( $special.get( 0 ) != $other.get( 0 ) ) {
+ return;
+ }
+ context.data.$container.hide();
+ if ( typeof context.config.special.select == 'function' ) {
+ context.config.special.select.call( $special, context.data.$textbox );
+ }
+ context.data.$textbox.focus();
+ } )
+ .mousemove( function( e ) {
+ context.data.selectedWithMouse = true;
+ $.suggestions.highlight(
+ context, $( e.target ).closest( '.suggestions-special' ), false
+ );
+ } )
+ )
+ .appendTo( $( 'body' ) );
+ $(this)
+ // Stop browser autocomplete from interfering
+ .attr( 'autocomplete', 'off')
+ .keydown( function( e ) {
+ // Store key pressed to handle later
+ context.data.keypressed = ( e.keyCode == undefined ) ? e.which : e.keyCode;
+ context.data.keypressedCount = 0;
+
+ switch ( context.data.keypressed ) {
+ // This preventDefault logic is duplicated from
+ // $.suggestions.keypress(), which sucks
+ case 40:
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ break;
+ case 38:
+ case 27:
+ case 13:
+ if ( context.data.$container.is( ':visible' ) ) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ }
+ }
+ } )
+ .keypress( function( e ) {
+ context.data.keypressedCount++;
+ $.suggestions.keypress( e, context, context.data.keypressed );
+ } )
+ .keyup( function( e ) {
+ // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
+ // keypress in between, solve it
+ if ( context.data.keypressedCount == 0 ) {
+ $.suggestions.keypress( e, context, context.data.keypressed );
+ }
+ } )
+ .blur( function() {
+ // When losing focus because of a mousedown
+ // on a suggestion, don't hide the suggestions
+ if ( context.data.mouseDownOn.length > 0 ) {
+ return;
+ }
+ context.data.$container.hide();
+ $.suggestions.cancel( context );
+ } );
+ }
+ // Store the context for next time
+ $(this).data( 'suggestions-context', context );
+ } );
+ return returnValue !== null ? returnValue : $(this);
+};
+
+} )( jQuery );
diff --git a/resources/jquery/jquery.tabIndex.js b/resources/jquery/jquery.tabIndex.js
new file mode 100644
index 00000000..bb9b2bfa
--- /dev/null
+++ b/resources/jquery/jquery.tabIndex.js
@@ -0,0 +1,35 @@
+/**
+ * jQuery tabIndex
+ */
+( function( $ ) {
+/**
+ * Finds the lowerst tabindex in use within a selection
+ *
+ * @return Integer of lowest tabindex on the page
+ */
+jQuery.fn.firstTabIndex = function() {
+ var minTabIndex = 0;
+ jQuery(this).find( '[tabindex]' ).each( function() {
+ var tabIndex = parseInt( jQuery(this).attr( 'tabindex' ) );
+ if ( tabIndex > minTabIndex ) {
+ minTabIndex = tabIndex;
+ }
+ } );
+ return minTabIndex;
+};
+/**
+ * Finds the highest tabindex in use within a selection
+ *
+ * @return Integer of highest tabindex on the page
+ */
+jQuery.fn.lastTabIndex = function() {
+ var maxTabIndex = 0;
+ jQuery(this).find( '[tabindex]' ).each( function() {
+ var tabIndex = parseInt( jQuery(this).attr( 'tabindex' ) );
+ if ( tabIndex > maxTabIndex ) {
+ maxTabIndex = tabIndex;
+ }
+ } );
+ return maxTabIndex;
+};
+} )( jQuery ); \ No newline at end of file
diff --git a/resources/jquery/jquery.textSelection.js b/resources/jquery/jquery.textSelection.js
new file mode 100644
index 00000000..35e224db
--- /dev/null
+++ b/resources/jquery/jquery.textSelection.js
@@ -0,0 +1,404 @@
+/**
+ * These plugins provide extra functionality for interaction with textareas.
+ */
+( function( $ ) {
+$.fn.textSelection = function( command, options ) {
+var fn = {
+/**
+ * Get the contents of the textarea
+ */
+getContents: function() {
+ return this.val();
+},
+/**
+ * Get the currently selected text in this textarea. Will focus the textarea
+ * in some browsers (IE/Opera)
+ */
+getSelection: function() {
+ var e = this.get( 0 );
+ var retval = '';
+ if ( $(e).is( ':hidden' ) ) {
+ // Do nothing
+ } else if ( document.selection && document.selection.createRange ) {
+ e.focus();
+ var range = document.selection.createRange();
+ retval = range.text;
+ } else if ( e.selectionStart || e.selectionStart == '0' ) {
+ retval = e.value.substring( e.selectionStart, e.selectionEnd );
+ }
+ return retval;
+},
+/**
+ * Ported from skins/common/edit.js by Trevor Parscal
+ * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
+ *
+ * Inserts text at the begining and end of a text selection, optionally
+ * inserting text at the caret when selection is empty.
+ */
+encapsulateSelection: function( options ) {
+ return this.each( function() {
+ /**
+ * Check if the selected text is the same as the insert text
+ */
+ function checkSelectedText() {
+ if ( !selText ) {
+ selText = options.peri;
+ isSample = true;
+ } else if ( options.replace ) {
+ selText = options.peri;
+ } else if ( selText.charAt( selText.length - 1 ) == ' ' ) {
+ // Exclude ending space char
+ selText = selText.substring(0, selText.length - 1);
+ options.post += ' ';
+ }
+ }
+ var isSample = false;
+ if ( this.style.display == 'none' ) {
+ // Do nothing
+ } else if ( this.selectionStart || this.selectionStart == '0' ) {
+ // Mozilla/Opera
+ $(this).focus();
+ var selText = $(this).textSelection( 'getSelection' );
+ var startPos = this.selectionStart;
+ var endPos = this.selectionEnd;
+ var scrollTop = this.scrollTop;
+ checkSelectedText();
+ if ( options.ownline ) {
+ if ( startPos != 0 && this.value.charAt( startPos - 1 ) != "\n" ) {
+ options.pre = "\n" + options.pre;
+ }
+ if ( this.value.charAt( endPos ) != "\n" ) {
+ options.post += "\n";
+ }
+ }
+ this.value = this.value.substring( 0, startPos ) + options.pre + selText + options.post +
+ this.value.substring( endPos, this.value.length );
+ // Setting this.value scrolls the textarea to the top, restore the scroll position
+ this.scrollTop = scrollTop;
+ if ( window.opera ) {
+ options.pre = options.pre.replace( /\r?\n/g, "\r\n" );
+ selText = selText.replace( /\r?\n/g, "\r\n" );
+ options.post = options.post.replace( /\r?\n/g, "\r\n" );
+ }
+ if ( isSample && options.selectPeri ) {
+ this.selectionStart = startPos + options.pre.length;
+ this.selectionEnd = startPos + options.pre.length + selText.length;
+ } else {
+ this.selectionStart = startPos + options.pre.length + selText.length +
+ options.post.length;
+ this.selectionEnd = this.selectionStart;
+ }
+ } else if ( document.selection && document.selection.createRange ) {
+ // IE
+ $(this).focus();
+ if ( context ) {
+ context.fn.restoreCursorAndScrollTop();
+ }
+ var selText = $(this).textSelection( 'getSelection' );
+ var scrollTop = this.scrollTop;
+ var range = document.selection.createRange();
+ if ( options.ownline && range.moveStart ) {
+ var range2 = document.selection.createRange();
+ range2.collapse();
+ range2.moveStart( 'character', -1 );
+ // FIXME: Which check is correct?
+ if ( range2.text != "\r" && range2.text != "\n" && range2.text != "" ) {
+ options.pre = "\n" + options.pre;
+ }
+ var range3 = document.selection.createRange();
+ range3.collapse( false );
+ range3.moveEnd( 'character', 1 );
+ if ( range3.text != "\r" && range3.text != "\n" && range3.text != "" ) {
+ options.post += "\n";
+ }
+ }
+ checkSelectedText();
+ range.text = options.pre + selText + options.post;
+ if ( isSample && options.selectPeri && range.moveStart ) {
+ range.moveStart( 'character', - options.post.length - selText.length );
+ range.moveEnd( 'character', - options.post.length );
+ }
+ range.select();
+ // Restore the scroll position
+ this.scrollTop = scrollTop;
+ }
+ $(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
+ options.replace ] );
+ });
+},
+/**
+ * Ported from Wikia's LinkSuggest extension
+ * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
+ * Some code copied from
+ * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
+ *
+ * Get the position (in resolution of bytes not nessecarily characters)
+ * in a textarea
+ */
+ getCaretPosition: function( options ) {
+ function getCaret( e ) {
+ var caretPos = 0, endPos = 0;
+ if ( $.browser.msie ) {
+ // IE Support
+ var preFinished = false;
+ var periFinished = false;
+ var postFinished = false;
+ var preText, rawPreText, periText;
+ var rawPeriText, postText, rawPostText;
+ // Create range containing text in the selection
+ var periRange = document.selection.createRange().duplicate();
+ // Create range containing text before the selection
+ var preRange = document.body.createTextRange();
+ // Select all the text
+ preRange.moveToElementText(e);
+ // Move the end where we need it
+ preRange.setEndPoint("EndToStart", periRange);
+ // Create range containing text after the selection
+ var postRange = document.body.createTextRange();
+ // Select all the text
+ postRange.moveToElementText(e);
+ // Move the start where we need it
+ postRange.setEndPoint("StartToEnd", periRange);
+ // Load the text values we need to compare
+ preText = rawPreText = preRange.text;
+ periText = rawPeriText = periRange.text;
+ postText = rawPostText = postRange.text;
+ /*
+ * Check each range for trimmed newlines by shrinking the range by 1
+ * character and seeing if the text property has changed. If it has
+ * not changed then we know that IE has trimmed a \r\n from the end.
+ */
+ do {
+ if ( !preFinished ) {
+ if ( preRange.compareEndPoints( "StartToEnd", preRange ) == 0 ) {
+ preFinished = true;
+ } else {
+ preRange.moveEnd( "character", -1 );
+ if ( preRange.text == preText ) {
+ rawPreText += "\r\n";
+ } else {
+ preFinished = true;
+ }
+ }
+ }
+ if ( !periFinished ) {
+ if ( periRange.compareEndPoints( "StartToEnd", periRange ) == 0 ) {
+ periFinished = true;
+ } else {
+ periRange.moveEnd( "character", -1 );
+ if ( periRange.text == periText ) {
+ rawPeriText += "\r\n";
+ } else {
+ periFinished = true;
+ }
+ }
+ }
+ if ( !postFinished ) {
+ if ( postRange.compareEndPoints("StartToEnd", postRange) == 0 ) {
+ postFinished = true;
+ } else {
+ postRange.moveEnd( "character", -1 );
+ if ( postRange.text == postText ) {
+ rawPostText += "\r\n";
+ } else {
+ postFinished = true;
+ }
+ }
+ }
+ } while ( ( !preFinished || !periFinished || !postFinished ) );
+ caretPos = rawPreText.replace( /\r\n/g, "\n" ).length;
+ endPos = caretPos + rawPeriText.replace( /\r\n/g, "\n" ).length;
+ } else if ( e.selectionStart || e.selectionStart == '0' ) {
+ // Firefox support
+ caretPos = e.selectionStart;
+ endPos = e.selectionEnd;
+ }
+ return options.startAndEnd ? [ caretPos, endPos ] : caretPos;
+ }
+ return getCaret( this.get( 0 ) );
+},
+setSelection: function( options ) {
+ return this.each( function() {
+ if ( $(this).is( ':hidden' ) ) {
+ // Do nothing
+ } else if ( this.selectionStart || this.selectionStart == '0' ) {
+ // Opera 9.0 doesn't allow setting selectionStart past
+ // selectionEnd; any attempts to do that will be ignored
+ // Make sure to set them in the right order
+ if ( options.start > this.selectionEnd ) {
+ this.selectionEnd = options.end;
+ this.selectionStart = options.start;
+ } else {
+ this.selectionStart = options.start;
+ this.selectionEnd = options.end;
+ }
+ } else if ( document.body.createTextRange ) {
+ var selection = document.body.createTextRange();
+ selection.moveToElementText( this );
+ var length = this.value.length;
+ // IE doesn't count \n when computing the offset, so we won't either
+ var newLines = this.value.match( /\n/g );
+ if ( newLines) length = length - newLines.length;
+ selection.moveStart( 'character', options.start );
+ selection.moveEnd( 'character', -length + options.end );
+
+ // This line can cause an error under certain circumstances (textarea empty, no selection)
+ // Silence that error
+ try {
+ selection.select();
+ } catch( e ) { }
+ }
+ });
+},
+/**
+ * Ported from Wikia's LinkSuggest extension
+ * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
+ *
+ * Scroll a textarea to the current cursor position. You can set the cursor
+ * position with setSelection()
+ * @param options boolean Whether to force a scroll even if the caret position
+ * is already visible. Defaults to false
+ */
+scrollToCaretPosition: function( options ) {
+ function getLineLength( e ) {
+ return Math.floor( e.scrollWidth / ( $.client.profile().platform == 'linux' ? 7 : 8 ) );
+ }
+ function getCaretScrollPosition( e ) {
+ // FIXME: This functions sucks and is off by a few lines most
+ // of the time. It should be replaced by something decent.
+ var text = e.value.replace( /\r/g, "" );
+ var caret = $( e ).textSelection( 'getCaretPosition' );
+ var lineLength = getLineLength( e );
+ var row = 0;
+ var charInLine = 0;
+ var lastSpaceInLine = 0;
+ for ( i = 0; i < caret; i++ ) {
+ charInLine++;
+ if ( text.charAt( i ) == " " ) {
+ lastSpaceInLine = charInLine;
+ } else if ( text.charAt( i ) == "\n" ) {
+ lastSpaceInLine = 0;
+ charInLine = 0;
+ row++;
+ }
+ if ( charInLine > lineLength ) {
+ if ( lastSpaceInLine > 0 ) {
+ charInLine = charInLine - lastSpaceInLine;
+ lastSpaceInLine = 0;
+ row++;
+ }
+ }
+ }
+ var nextSpace = 0;
+ for ( j = caret; j < caret + lineLength; j++ ) {
+ if (
+ text.charAt( j ) == " " ||
+ text.charAt( j ) == "\n" ||
+ caret == text.length
+ ) {
+ nextSpace = j;
+ break;
+ }
+ }
+ if ( nextSpace > lineLength && caret <= lineLength ) {
+ charInLine = caret - lastSpaceInLine;
+ row++;
+ }
+ return ( $.client.profile().platform == 'mac' ? 13 : ( $.client.profile().platform == 'linux' ? 15 : 16 ) ) * row;
+ }
+ return this.each(function() {
+ if ( $(this).is( ':hidden' ) ) {
+ // Do nothing
+ } else if ( this.selectionStart || this.selectionStart == '0' ) {
+ // Mozilla
+ var scroll = getCaretScrollPosition( this );
+ if ( options.force || scroll < $(this).scrollTop() ||
+ scroll > $(this).scrollTop() + $(this).height() )
+ $(this).scrollTop( scroll );
+ } else if ( document.selection && document.selection.createRange ) {
+ // IE / Opera
+ /*
+ * IE automatically scrolls the selected text to the
+ * bottom of the textarea at range.select() time, except
+ * if it was already in view and the cursor position
+ * wasn't changed, in which case it does nothing. To
+ * cover that case, we'll force it to act by moving one
+ * character back and forth.
+ */
+ var range = document.body.createTextRange();
+ var savedRange = document.selection.createRange();
+ var pos = $(this).textSelection( 'getCaretPosition' );
+ var oldScrollTop = this.scrollTop;
+ range.moveToElementText( this );
+ range.collapse();
+ range.move( 'character', pos + 1);
+ range.select();
+ if ( this.scrollTop != oldScrollTop )
+ this.scrollTop += range.offsetTop;
+ else if ( options.force ) {
+ range.move( 'character', -1 );
+ range.select();
+ }
+ savedRange.select();
+ }
+ $(this).trigger( 'scrollToPosition' );
+ } );
+}
+};
+ // Apply defaults
+ switch ( command ) {
+ //case 'getContents': // no params
+ //case 'setContents': // no params with defaults
+ //case 'getSelection': // no params
+ case 'encapsulateSelection':
+ options = $.extend( {
+ 'pre': '', // Text to insert before the cursor/selection
+ 'peri': '', // Text to insert between pre and post and select afterwards
+ 'post': '', // Text to insert after the cursor/selection
+ 'ownline': false, // Put the inserted text on a line of its own
+ 'replace': false, // If there is a selection, replace it with peri instead of leaving it alone
+ 'selectPeri': true // Select the peri text if it was inserted (but not if there was a selection and replace==false)
+ }, options );
+ break;
+ case 'getCaretPosition':
+ options = $.extend( {
+ 'startAndEnd': false // Return [start, end] instead of just start
+ }, options );
+ // FIXME: We may not need character position-based functions if we insert markers in the right places
+ break;
+ case 'setSelection':
+ options = $.extend( {
+ 'start': undefined, // Position to start selection at
+ 'end': undefined, // Position to end selection at. Defaults to start
+ 'startContainer': undefined, // Element to start selection in (iframe only)
+ 'endContainer': undefined // Element to end selection in (iframe only). Defaults to startContainer
+ }, options );
+ if ( options.end === undefined )
+ options.end = options.start;
+ if ( options.endContainer == undefined )
+ options.endContainer = options.startContainer;
+ // FIXME: We may not need character position-based functions if we insert markers in the right places
+ break;
+ case 'scrollToCaretPosition':
+ options = $.extend( {
+ 'force': false // Force a scroll even if the caret position is already visible
+ }, options );
+ break;
+ }
+ var context = $(this).data( 'wikiEditor-context' );
+ var hasIframe = typeof context !== 'undefined' && context && typeof context.$iframe !== 'undefined';
+
+ // IE selection restore voodoo
+ var needSave = false;
+ if ( hasIframe && context.savedSelection !== null ) {
+ context.fn.restoreSelection();
+ needSave = true;
+ }
+ retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
+ if ( hasIframe && needSave ) {
+ context.fn.saveSelection();
+ }
+ return retval;
+};
+
+} )( jQuery );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.js b/resources/mediawiki.action/mediawiki.action.edit.js
new file mode 100644
index 00000000..e5b50958
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.js
@@ -0,0 +1,30 @@
+/* Note, there is still stuff in skins/common/edit.js that
+ * has not been jQuery-ized.
+ */
+
+(function( $ ) {
+ //make sure edit summary does not exceed byte limit
+ $( '#wpSummary' ).attr( 'maxLength', 250 ).keypress( function( e ) {
+ // first check to see if this is actually a character key
+ // being pressed.
+ // Based on key-event info from http://unixpapa.com/js/key.html
+ // JQuery should also normalize e.which to be consistent cross-browser,
+ // however the same check is still needed regardless of jQuery.
+
+ if ( e.which === 0 || e.charCode === 0 || e.ctrlKey || e.altKey || e.metaKey ) {
+ return true; //a special key (backspace, etc) so don't interfere.
+ }
+
+ // This basically figures out how many bytes a UTF-16 string (which is what js sees)
+ // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
+ // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
+ // and the actual character takes 4 bytes in UTF-8 (2*2=4). Might not work perfectly in edge cases
+ // such as illegal sequences, but that should never happen.
+
+ var len = this.value.replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' ).replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' ).length;
+ //247 as this doesn't count character about to be inserted.
+ if ( len > 247 ) {
+ e.preventDefault();
+ }
+ });
+})(jQuery);
diff --git a/resources/mediawiki.action/mediawiki.action.history.js b/resources/mediawiki.action/mediawiki.action.history.js
new file mode 100644
index 00000000..66f90b07
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.history.js
@@ -0,0 +1,7 @@
+/*
+ * JavaScript for History action
+ */
+
+// Replaces histrowinit
+$( '#pagehistory li input[name=diff], #pagehistory li input[name=oldid]' ).click( diffcheck );
+diffcheck(); \ No newline at end of file
diff --git a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
new file mode 100644
index 00000000..5a7c777f
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
@@ -0,0 +1,24 @@
+/*
+ * JavaScript to enable right click edit functionality
+ */
+$( function() {
+ // Select all h1-h6 elements that contain editsection links
+ $( 'h1:has(.editsection a), ' +
+ 'h2:has(.editsection a), ' +
+ 'h3:has(.editsection a), ' +
+ 'h4:has(.editsection a), ' +
+ 'h5:has(.editsection a), ' +
+ 'h6:has(.editsection a)'
+ ).live( 'contextmenu', function( e ) {
+ // Get href of the [edit] link
+ var href = $(this).find( '.editsection a' ).attr( 'href' );
+ // Check if target is the anchor link itself. If so, don't suppress the context menu; this
+ // way the reader can still do things like copy URL, open in new tab etc.
+ var $target = $( e.target );
+ if ( !$target.is( 'a' ) && !$target.parent().is( '.editsection' ) ){
+ window.location = href;
+ e.preventDefault();
+ return false;
+ }
+ } );
+} );
diff --git a/resources/mediawiki.language/languages/am.js b/resources/mediawiki.language/languages/am.js
new file mode 100644
index 00000000..fa5d3c57
--- /dev/null
+++ b/resources/mediawiki.language/languages/am.js
@@ -0,0 +1,8 @@
+/**
+ * Amharic (አማርኛ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/ar.js b/resources/mediawiki.language/languages/ar.js
new file mode 100644
index 00000000..7d9e114f
--- /dev/null
+++ b/resources/mediawiki.language/languages/ar.js
@@ -0,0 +1,38 @@
+/**
+ * Arabic (العربية) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 6 );
+ if ( count == 0 ) {
+ return forms[0];
+ }
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ if ( count % 100 >= 3 && count % 100 <= 10 ) {
+ return forms[3];
+ }
+ if ( count % 100 >= 11 && count % 100 <= 99 ) {
+ return forms[4];
+ }
+ return forms[5];
+};
+
+mediaWiki.language.digitTransformTable = {
+ '0': 'Ù ', // &#x0660;
+ '1': 'Ù¡', // &#x0661;
+ '2': 'Ù¢', // &#x0662;
+ '3': 'Ù£', // &#x0663;
+ '4': 'Ù¤', // &#x0664;
+ '5': 'Ù¥', // &#x0665;
+ '6': 'Ù¦', // &#x0666;
+ '7': 'Ù§', // &#x0667;
+ '8': 'Ù¨', // &#x0668;
+ '9': 'Ù©', // &#x0669;
+ '.': 'Ù«', // &#x066b; wrong table ?
+ ',': 'Ù¬' // &#x066c;
+};
diff --git a/resources/mediawiki.language/languages/bat-smg.js b/resources/mediawiki.language/languages/bat-smg.js
new file mode 100644
index 00000000..6e3f4cc9
--- /dev/null
+++ b/resources/mediawiki.language/languages/bat-smg.js
@@ -0,0 +1,18 @@
+/**
+ * Samogitian (Žemaitėška) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ count = Math.abs( count );
+ if ( count === 0 || ( count % 100 === 0 || ( count % 100 >= 10 && count % 100 < 20 ) ) ) {
+ return forms[2];
+ }
+ if ( count % 10 === 1 ) {
+ return forms[0];
+ }
+ if ( count % 10 === 2 ) {
+ return forms[1];
+ }
+ return forms[3];
+};
diff --git a/resources/mediawiki.language/languages/be-tarask.js b/resources/mediawiki.language/languages/be-tarask.js
new file mode 100644
index 00000000..c19f47d1
--- /dev/null
+++ b/resources/mediawiki.language/languages/be-tarask.js
@@ -0,0 +1,23 @@
+/**
+ * Belarusian in Taraskievica orthography (БеларуÑÐºÐ°Ñ (тарашкевіца)) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/be.js b/resources/mediawiki.language/languages/be.js
new file mode 100644
index 00000000..97ceee3b
--- /dev/null
+++ b/resources/mediawiki.language/languages/be.js
@@ -0,0 +1,20 @@
+/**
+ * Belarusian normative (БеларуÑкаÑ) language functions
+ */
+
+mediaWiki.language.convertPlural = function convertPlural( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/bh.js b/resources/mediawiki.language/languages/bh.js
new file mode 100644
index 00000000..abbf8bd9
--- /dev/null
+++ b/resources/mediawiki.language/languages/bh.js
@@ -0,0 +1,8 @@
+/**
+ * Bihari (भोजपà¥à¤°à¥€) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/bs.js b/resources/mediawiki.language/languages/bs.js
new file mode 100644
index 00000000..9f22426a
--- /dev/null
+++ b/resources/mediawiki.language/languages/bs.js
@@ -0,0 +1,20 @@
+/**
+ * Bosnian (bosanski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/cs.js b/resources/mediawiki.language/languages/cs.js
new file mode 100644
index 00000000..0b77909d
--- /dev/null
+++ b/resources/mediawiki.language/languages/cs.js
@@ -0,0 +1,19 @@
+/**
+ * Czech (ÄeÅ¡tina [subst.], Äeský [adj.], Äesky [adv.]) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ switch ( count ) {
+ case 1:
+ return forms[0];
+ break;
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ break;
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/cu.js b/resources/mediawiki.language/languages/cu.js
new file mode 100644
index 00000000..35a54739
--- /dev/null
+++ b/resources/mediawiki.language/languages/cu.js
@@ -0,0 +1,18 @@
+/**
+ * Old Church Slavonic (СловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ return forms[1];
+ case 3:
+ case 4:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+};
diff --git a/resources/mediawiki.language/languages/cy.js b/resources/mediawiki.language/languages/cy.js
new file mode 100644
index 00000000..333d956f
--- /dev/null
+++ b/resources/mediawiki.language/languages/cy.js
@@ -0,0 +1,15 @@
+/**
+ * Welsh (Cymraeg) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 6 );
+ count = Math.abs( count );
+ if ( count >= 0 && count <= 3 ) {
+ return forms[count];
+ }
+ if ( count == 6 ) {
+ return forms[4];
+ }
+ return forms[5];
+};
diff --git a/resources/mediawiki.language/languages/dsb.js b/resources/mediawiki.language/languages/dsb.js
new file mode 100644
index 00000000..c3eaa1fc
--- /dev/null
+++ b/resources/mediawiki.language/languages/dsb.js
@@ -0,0 +1,18 @@
+/**
+ * Lower Sorbian (Dolnoserbski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ switch ( Math.abs( count ) % 100 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ return forms[1];
+ case 3:
+ case 4:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+};
diff --git a/resources/mediawiki.language/languages/fr.js b/resources/mediawiki.language/languages/fr.js
new file mode 100644
index 00000000..bfb52d28
--- /dev/null
+++ b/resources/mediawiki.language/languages/fr.js
@@ -0,0 +1,8 @@
+/**
+ * French (Français) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/ga.js b/resources/mediawiki.language/languages/ga.js
new file mode 100644
index 00000000..39280138
--- /dev/null
+++ b/resources/mediawiki.language/languages/ga.js
@@ -0,0 +1,14 @@
+/**
+ * Irish (Gaeilge) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 2 ) {
+ return forms[1];
+ }
+ return forms[2];
+};
diff --git a/resources/mediawiki.language/languages/gd.js b/resources/mediawiki.language/languages/gd.js
new file mode 100644
index 00000000..5ac20077
--- /dev/null
+++ b/resources/mediawiki.language/languages/gd.js
@@ -0,0 +1,18 @@
+/**
+ * Scots Gaelic (Gàidhlig) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ count = Math.abs( count );
+ if ( count === 1 ) {
+ return forms[0];
+ }
+ if ( count === 2 ) {
+ return forms[1];
+ }
+ if ( count >= 3 && count <= 10 ) {
+ return forms[2];
+ }
+ return forms[3];
+};
diff --git a/resources/mediawiki.language/languages/gv.js b/resources/mediawiki.language/languages/gv.js
new file mode 100644
index 00000000..afc2b5d4
--- /dev/null
+++ b/resources/mediawiki.language/languages/gv.js
@@ -0,0 +1,18 @@
+/**
+ * Manx (Gaelg) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( count > 0 && ( count % 20 ) === 0 ) {
+ return forms[0];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[1];
+ case 2:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+};
diff --git a/resources/mediawiki.language/languages/he.js b/resources/mediawiki.language/languages/he.js
new file mode 100644
index 00000000..b74440e4
--- /dev/null
+++ b/resources/mediawiki.language/languages/he.js
@@ -0,0 +1,14 @@
+/**
+ * Hebrew (עברית) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 2 && forms[2] ) {
+ return forms[2];
+ }
+ return forms[1];
+};
diff --git a/resources/mediawiki.language/languages/hi.js b/resources/mediawiki.language/languages/hi.js
new file mode 100644
index 00000000..a22a0e17
--- /dev/null
+++ b/resources/mediawiki.language/languages/hi.js
@@ -0,0 +1,8 @@
+/**
+ * Hindi (हिनà¥à¤¦à¥€) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/hr.js b/resources/mediawiki.language/languages/hr.js
new file mode 100644
index 00000000..e3ce291b
--- /dev/null
+++ b/resources/mediawiki.language/languages/hr.js
@@ -0,0 +1,20 @@
+/**
+ * Croatian (hrvatski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/hsb.js b/resources/mediawiki.language/languages/hsb.js
new file mode 100644
index 00000000..8651fe41
--- /dev/null
+++ b/resources/mediawiki.language/languages/hsb.js
@@ -0,0 +1,18 @@
+/**
+ * Upper Sorbian (Hornjoserbsce) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ switch ( Math.abs( count ) % 100 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ return forms[1];
+ case 3:
+ case 4:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+};
diff --git a/resources/mediawiki.language/languages/hy.js b/resources/mediawiki.language/languages/hy.js
new file mode 100644
index 00000000..734c26df
--- /dev/null
+++ b/resources/mediawiki.language/languages/hy.js
@@ -0,0 +1,8 @@
+/**
+ * Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( Math.abs( count ) <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/ksh.js b/resources/mediawiki.language/languages/ksh.js
new file mode 100644
index 00000000..ed907325
--- /dev/null
+++ b/resources/mediawiki.language/languages/ksh.js
@@ -0,0 +1,14 @@
+/**
+ * Ripuarian (Ripoarƒósh) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 ) {
+ return forms[2];
+ }
+ return forms[1];
+};
diff --git a/resources/mediawiki.language/languages/ln.js b/resources/mediawiki.language/languages/ln.js
new file mode 100644
index 00000000..9b9e456a
--- /dev/null
+++ b/resources/mediawiki.language/languages/ln.js
@@ -0,0 +1,8 @@
+/**
+ * Lingala (Lingála) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/lt.js b/resources/mediawiki.language/languages/lt.js
new file mode 100644
index 00000000..ee0a609b
--- /dev/null
+++ b/resources/mediawiki.language/languages/lt.js
@@ -0,0 +1,17 @@
+/**
+ * Lithuanian (Lietuvių) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length == 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count % 10 == 1 && count % 100 != 11 ) {
+ return forms[0];
+ }
+ if ( count % 10 >= 2 && ( count % 100 < 10 || count % 100 >= 20 ) ) {
+ return forms[1];
+ }
+ return forms[2];
+};
diff --git a/resources/mediawiki.language/languages/lv.js b/resources/mediawiki.language/languages/lv.js
new file mode 100644
index 00000000..d4bec44a
--- /dev/null
+++ b/resources/mediawiki.language/languages/lv.js
@@ -0,0 +1,8 @@
+/**
+ * Latvian (Latviešu) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( ( count % 10 == 1 ) && ( count % 100 != 11 ) ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/mg.js b/resources/mediawiki.language/languages/mg.js
new file mode 100644
index 00000000..b65e96e3
--- /dev/null
+++ b/resources/mediawiki.language/languages/mg.js
@@ -0,0 +1,8 @@
+/**
+ * Malagasy (Malagasy) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/mk.js b/resources/mediawiki.language/languages/mk.js
new file mode 100644
index 00000000..5105025c
--- /dev/null
+++ b/resources/mediawiki.language/languages/mk.js
@@ -0,0 +1,8 @@
+/**
+ * Macedonian (МакедонÑки) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count % 10 === 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/mo.js b/resources/mediawiki.language/languages/mo.js
new file mode 100644
index 00000000..0c4b696a
--- /dev/null
+++ b/resources/mediawiki.language/languages/mo.js
@@ -0,0 +1,14 @@
+/**
+ * Moldavian (МолдовенÑÑкÑ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 || count % 100 < 20 ) {
+ return forms[1];
+ }
+ return forms[2];
+};
diff --git a/resources/mediawiki.language/languages/mt.js b/resources/mediawiki.language/languages/mt.js
new file mode 100644
index 00000000..44c7bfff
--- /dev/null
+++ b/resources/mediawiki.language/languages/mt.js
@@ -0,0 +1,17 @@
+/**
+ * Maltese (Malti) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 || ( count % 100 > 1 && count % 100 < 11 ) ) {
+ return forms[1];
+ }
+ if ( count % 100 > 10 && count % 100 < 20 ) {
+ return forms[2];
+ }
+ return forms[3];
+};
diff --git a/resources/mediawiki.language/languages/nso.js b/resources/mediawiki.language/languages/nso.js
new file mode 100644
index 00000000..30cf1892
--- /dev/null
+++ b/resources/mediawiki.language/languages/nso.js
@@ -0,0 +1,8 @@
+/**
+ * Northern Sotho (Sesotho sa Leboa) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/pl.js b/resources/mediawiki.language/languages/pl.js
new file mode 100644
index 00000000..03e0d842
--- /dev/null
+++ b/resources/mediawiki.language/languages/pl.js
@@ -0,0 +1,21 @@
+/**
+ * Polish (polski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ count = Math.abs( count );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ switch ( count % 10 ) {
+ case 2:
+ case 3:
+ case 4:
+ if ( count / 10 % 10 != 1 ) {
+ return forms[1];
+ }
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/pt-br.js b/resources/mediawiki.language/languages/pt-br.js
new file mode 100644
index 00000000..eda10d2e
--- /dev/null
+++ b/resources/mediawiki.language/languages/pt-br.js
@@ -0,0 +1,8 @@
+/**
+ * Brazilian Portugese (Portuguêsi do Brasil) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/ro.js b/resources/mediawiki.language/languages/ro.js
new file mode 100644
index 00000000..42610fe6
--- /dev/null
+++ b/resources/mediawiki.language/languages/ro.js
@@ -0,0 +1,14 @@
+/**
+ * Romanian (Română) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 || count % 100 < 20 ) {
+ return forms[1];
+ }
+ return forms[2];
+};
diff --git a/resources/mediawiki.language/languages/ru.js b/resources/mediawiki.language/languages/ru.js
new file mode 100644
index 00000000..17c92931
--- /dev/null
+++ b/resources/mediawiki.language/languages/ru.js
@@ -0,0 +1,23 @@
+/**
+ * Russian (РуÑÑкий) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/se.js b/resources/mediawiki.language/languages/se.js
new file mode 100644
index 00000000..51ebaf25
--- /dev/null
+++ b/resources/mediawiki.language/languages/se.js
@@ -0,0 +1,17 @@
+/**
+ * Northern Sami (Sámegiella) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( count == 0 ) {
+ return '';
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ return ''
+};
diff --git a/resources/mediawiki.language/languages/sh.js b/resources/mediawiki.language/languages/sh.js
new file mode 100644
index 00000000..719b0c57
--- /dev/null
+++ b/resources/mediawiki.language/languages/sh.js
@@ -0,0 +1,23 @@
+/**
+ * Serbo-Croatian (Srpskohrvatski / СрпÑкохрватÑки) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/sk.js b/resources/mediawiki.language/languages/sk.js
new file mode 100644
index 00000000..21a22b21
--- /dev/null
+++ b/resources/mediawiki.language/languages/sk.js
@@ -0,0 +1,14 @@
+/**
+ * Slovak (Slovenčina) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 2 || count == 3 || count == 4 ) {
+ return forms[1];
+ }
+ return forms[2];
+};
diff --git a/resources/mediawiki.language/languages/sl.js b/resources/mediawiki.language/languages/sl.js
new file mode 100644
index 00000000..a887e0e0
--- /dev/null
+++ b/resources/mediawiki.language/languages/sl.js
@@ -0,0 +1,20 @@
+/**
+ * Slovenian (SlovenÅ¡Äina) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 5 );
+ if ( count % 100 == 1 ) {
+ return forms[0];
+ }
+ if ( count % 100 == 2 ) {
+ return forms[1];
+ }
+ if ( count % 100 == 3 || count % 100 == 4 ) {
+ return forms[2];
+ }
+ if ( count != 0 ) {
+ return forms[3];
+ }
+ return forms[4];
+};
diff --git a/resources/mediawiki.language/languages/sma.js b/resources/mediawiki.language/languages/sma.js
new file mode 100644
index 00000000..d3ccf625
--- /dev/null
+++ b/resources/mediawiki.language/languages/sma.js
@@ -0,0 +1,14 @@
+/**
+ * Southern Sami (Ã…arjelsaemien) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ return forms[3];
+};
diff --git a/resources/mediawiki.language/languages/sr-ec.js b/resources/mediawiki.language/languages/sr-ec.js
new file mode 100644
index 00000000..af48eb07
--- /dev/null
+++ b/resources/mediawiki.language/languages/sr-ec.js
@@ -0,0 +1,20 @@
+/**
+ * Serbian (cyrillic script) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/sr-el.js b/resources/mediawiki.language/languages/sr-el.js
new file mode 100644
index 00000000..fd6ca012
--- /dev/null
+++ b/resources/mediawiki.language/languages/sr-el.js
@@ -0,0 +1,20 @@
+/**
+ * Serbian (latin script) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/sr.js b/resources/mediawiki.language/languages/sr.js
new file mode 100644
index 00000000..25cdc8a2
--- /dev/null
+++ b/resources/mediawiki.language/languages/sr.js
@@ -0,0 +1,23 @@
+/**
+ * Serbian (СрпÑки / Srpski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return ( count == 1 ) ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/ti.js b/resources/mediawiki.language/languages/ti.js
new file mode 100644
index 00000000..69b6d9b8
--- /dev/null
+++ b/resources/mediawiki.language/languages/ti.js
@@ -0,0 +1,8 @@
+/**
+ * Tigrinya (ትáŒáˆ­áŠ›) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural(forms, 2);
+ return (count <= 1) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/tl.js b/resources/mediawiki.language/languages/tl.js
new file mode 100644
index 00000000..29219fdb
--- /dev/null
+++ b/resources/mediawiki.language/languages/tl.js
@@ -0,0 +1,7 @@
+/**
+ * Tagalog (Tagalog) language functions
+ */
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/languages/uk.js b/resources/mediawiki.language/languages/uk.js
new file mode 100644
index 00000000..5c1294e7
--- /dev/null
+++ b/resources/mediawiki.language/languages/uk.js
@@ -0,0 +1,23 @@
+/**
+ * Ukrainian (УкраїнÑька) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
diff --git a/resources/mediawiki.language/languages/wa.js b/resources/mediawiki.language/languages/wa.js
new file mode 100644
index 00000000..e1773759
--- /dev/null
+++ b/resources/mediawiki.language/languages/wa.js
@@ -0,0 +1,8 @@
+/**
+ * Walloon (Walon) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+};
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
new file mode 100644
index 00000000..f199101b
--- /dev/null
+++ b/resources/mediawiki.language/mediawiki.language.js
@@ -0,0 +1,102 @@
+/**
+ * Base language object
+ *
+ * Localized Language support attempts to mirror some of the functionality of
+ * Language.php in MediaWiki. This object contains methods for loading and
+ * transforming message text.
+ */
+( function( $, mw ) {
+
+mw.language = {
+ /**
+ * Process the PLURAL template substitution
+ *
+ * @param {object} template Template object
+ * @format template
+ * {
+ * 'title': [title of template],
+ * 'parameters': [template parameters]
+ * }
+ * @example {{Template:title|params}}
+ */
+ 'procPLURAL': function( template ) {
+ if ( template.title && template.parameters && mw.language.convertPlural ) {
+ // Check if we have forms to replace
+ if ( template.parameters.length == 0 ) {
+ return '';
+ }
+ // Restore the count into a Number ( if it got converted earlier )
+ var count = mw.language.convertNumber( template.title, true );
+ // Do convertPlural call
+ return mw.language.convertPlural( parseInt( count ), template.parameters );
+ }
+ // Could not process plural return first form or nothing
+ if ( template.parameters[0] ) {
+ return template.parameters[0];
+ }
+ return '';
+ },
+ /**
+ * Plural form transformations, needed for some languages.
+ *
+ * @param count integer Non-localized quantifier
+ * @param forms array List of plural forms
+ * @return string Correct form for quantifier in this language
+ */
+ 'convertPlural': function( count, forms ){
+ if ( !forms || forms.length == 0 ) {
+ return '';
+ }
+ return ( parseInt( count ) == 1 ) ? forms[0] : forms[1];
+ },
+ /**
+ * Pads an array to a specific length by copying the last one element.
+ *
+ * @param forms array Number of forms given to convertPlural
+ * @param count integer Number of forms required
+ * @return array Padded array of forms
+ */
+ 'preConvertPlural': function( forms, count ) {
+ while ( forms.length < count ) {
+ forms.push( forms[ forms.length-1 ] );
+ }
+ return forms;
+ },
+ /**
+ * Converts a number using digitTransformTable.
+ *
+ * @param {number} number Value to be converted
+ * @param {boolean} integer Convert the return value to an integer
+ */
+ 'convertNumber': function( number, integer ) {
+ if ( !mw.language.digitTransformTable ) {
+ return number;
+ }
+ // Set the target Transform table:
+ var transformTable = mw.language.digitTransformTable;
+ // Check if the "restore" to Latin number flag is set:
+ if ( integer ) {
+ if ( parseInt( number ) == number ) {
+ return number;
+ }
+ var tmp = [];
+ for ( var i in transformTable ) {
+ tmp[ transformTable[ i ] ] = i;
+ }
+ transformTable = tmp;
+ }
+ var numberString = '' + number;
+ var convertedNumber = '';
+ for ( var i = 0; i < numberString.length; i++ ) {
+ if ( transformTable[ numberString[i] ] ) {
+ convertedNumber += transformTable[numberString[i]];
+ } else {
+ convertedNumber += numberString[i];
+ }
+ }
+ return integer ? parseInt( convertedNumber ) : convertedNumber;
+ },
+ // Digit Transform Table, populated by language classes where applicable
+ 'digitTransformTable': null
+};
+} )( jQuery, mediaWiki ); \ No newline at end of file
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.css b/resources/mediawiki.special/mediawiki.special.preferences.css
new file mode 100644
index 00000000..8f628a95
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.preferences.css
@@ -0,0 +1,21 @@
+#mw-emailaddress-validity {
+ padding: 2px 1em;
+}
+body.ltr #mw-emailaddress-validity {
+ border-bottom-right-radius: 0.8em;
+ border-top-right-radius: 0.8em;
+}
+body.rtl #mw-emailaddress-validity {
+ border-bottom-left-radius: 0.8em;
+ border-top-left-radius: 0.8em;
+}
+#mw-emailaddress-validity.valid {
+ border: 1px solid #80FF80;
+ background-color: #C0FFC0;
+ color: black;
+}
+#mw-emailaddress-validity.invalid {
+ border: 1px solid #FF8080;
+ background-color: #FFC0C0;
+ color: black;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js
new file mode 100644
index 00000000..1775bec4
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.preferences.js
@@ -0,0 +1,77 @@
+/*
+ * JavaScript for Special:Preferences
+ */
+( function( $, mw ) {
+
+$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+$( '#preferences' )
+ .addClass( 'jsprefs' )
+ .before( $( '<ul id="preftoc"></ul>' ) )
+ .children( 'fieldset' )
+ .hide()
+ .addClass( 'prefsection' )
+ .children( 'legend' )
+ .addClass( 'mainLegend' )
+ .each( function( i ) {
+ $(this).parent().attr( 'id', 'prefsection-' + i );
+ if ( i === 0 ) {
+ $(this).parent().show();
+ }
+ $( '#preftoc' ).append(
+ $( '<li></li>' )
+ .addClass( i === 0 ? 'selected' : null )
+ .append(
+ $( '<a></a>')
+ .text( $(this).text() )
+ .attr( 'href', '#prefsection-' + i )
+ .mousedown( function( e ) {
+ $(this).parent().parent().find( 'li' ).removeClass( 'selected' );
+ $(this).parent().addClass( 'selected' );
+ e.preventDefault();
+ return false;
+ } )
+ .click( function( e ) {
+ $( '#preferences > fieldset' ).hide();
+ $( '#prefsection-' + i ).show();
+ e.preventDefault();
+ return false;
+ } )
+ )
+ );
+ }
+ );
+
+/**
+ * Given an email validity status (true, false, null) update the label CSS class
+ */
+var updateMailValidityLabel = function( mail ) {
+ var isValid = mw.util.validateEmail( mail ),
+ $label = $( '#mw-emailaddress-validity' );
+
+ // We allow empty address
+ if( isValid === null ) {
+ $label.text( '' ).removeClass( 'valid invalid' );
+
+ // Valid
+ } else if ( isValid ) {
+ $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
+
+ // Not valid
+ } else {
+ $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
+ }
+};
+
+// Lame tip to let user know if its email is valid. See bug 22449
+// Only bind once for 'blur' so that the user can fill it in without errors
+// After that look at every keypress for direct feedback if it was invalid onblur
+$( '#mw-input-wpemailaddress' ).one( 'blur', function() {
+ if ( $( '#mw-emailaddress-validity' ).length === 0 ) {
+ $(this).after( '<label for="mw-input-wpemailaddress" id="mw-emailaddress-validity"></label>' );
+ }
+ updateMailValidityLabel( $(this).val() );
+ $(this).keyup( function() {
+ updateMailValidityLabel( $(this).val() );
+ } );
+} );
+} )( jQuery, mediaWiki ); \ No newline at end of file
diff --git a/resources/mediawiki.special/mediawiki.special.search.js b/resources/mediawiki.special/mediawiki.special.search.js
new file mode 100644
index 00000000..d4317188
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.search.js
@@ -0,0 +1,11 @@
+/*
+ * JavaScript for Specical:Search
+ */
+( function( $, mw ) {
+
+// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
+if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
+ $( 'input[autofocus]:first' ).focus();
+}
+
+} )( jQuery, mediaWiki ); \ No newline at end of file
diff --git a/resources/mediawiki.util/mediawiki.util.js b/resources/mediawiki.util/mediawiki.util.js
new file mode 100644
index 00000000..5e6afc01
--- /dev/null
+++ b/resources/mediawiki.util/mediawiki.util.js
@@ -0,0 +1,399 @@
+/*
+ * Utilities
+ */
+( function( $, mw ) {
+
+ mediaWiki.util = {
+
+ /* Initialisation */
+ 'initialised' : false,
+ 'init' : function () {
+ if ( this.initialised === false ) {
+ this.initialised = true;
+
+ // Any initialisation after the DOM is ready
+ $( function() {
+
+ // Shortcut
+ var profile = $.client.profile();
+
+ // Set tooltipAccessKeyPrefix
+
+ // Opera on any platform
+ if ( profile.name == 'opera' ) {
+ mw.util.tooltipAccessKeyPrefix = 'shift-esc-';
+
+ // Chrome on any platform
+ } else if ( profile.name == 'chrome' ) {
+ // Chrome on Mac or Chrome on other platform ?
+ mw.util.tooltipAccessKeyPrefix = ( profile.platform == 'mac'
+ ? 'ctrl-option-' : 'alt-' );
+
+ // Non-Windows Safari with webkit_version > 526
+ } else if ( profile.platform !== 'win'
+ && profile.name == 'safari'
+ && profile.layoutVersion > 526 )
+ {
+ mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+
+ // Safari/Konqueror on any platform, or any browser on Mac
+ // (but not Safari on Windows)
+ } else if ( !( profile.platform == 'win' && profile.name == 'safari' )
+ && ( profile.name == 'safari'
+ || profile.platform == 'mac'
+ || profile.name == 'konqueror' ) ) {
+ mw.util.tooltipAccessKeyPrefix = 'ctrl-';
+
+ // Firefox 2.x
+ } else if ( profile.name == 'firefox' && profile.versionBase == '2' ) {
+ mw.util.tooltipAccessKeyPrefix = 'alt-shift-';
+ }
+
+ // Enable CheckboxShiftClick
+ $('input[type=checkbox]:not(.noshiftselect)').checkboxShiftClick();
+
+ // Emulate placeholder if not supported by browser
+ if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
+ $('input[placeholder]').placeholder();
+ }
+
+ // Fill $content var
+ if ( $('#bodyContent').length ) {
+ mw.util.$content = $('#bodyContent');
+ } else if ( $('#article').length ) {
+ mw.util.$content = $('#article');
+ } else {
+ mw.util.$content = $('#content');
+ }
+ });
+
+ return true;
+ }
+ return false;
+ },
+
+ /* Main body */
+
+ /**
+ * Encode the string like PHP's rawurlencode
+ *
+ * @param str String to be encoded
+ */
+ 'rawurlencode' : function( str ) {
+ str = (str + '').toString();
+ return encodeURIComponent( str )
+ .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
+ .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' ).replace( /~/g, '%7E' );
+ },
+
+ /**
+ * Encode page titles for use in a URL
+ * We want / and : to be included as literal characters in our title URLs
+ * as they otherwise fatally break the title
+ *
+ * @param str String to be encoded
+ */
+ 'wikiUrlencode' : function( str ) {
+ return this.rawurlencode( str )
+ .replace( /%20/g, '_' ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' );
+ },
+
+ /**
+ * Append a new style block to the head
+ *
+ * @param text String CSS to be appended
+ * @return the CSS stylesheet
+ */
+ 'addCSS' : function( text ) {
+ var s = document.createElement( 'style' );
+ s.type = 'text/css';
+ s.rel = 'stylesheet';
+ if ( s.styleSheet ) {
+ s.styleSheet.cssText = text; // IE
+ } else {
+ s.appendChild( document.createTextNode( text + '' ) ); // Safari sometimes borks on null
+ }
+ document.getElementsByTagName("head")[0].appendChild( s );
+ return s.sheet || s;
+ },
+
+ /**
+ * Get the full URL to a page name
+ *
+ * @param str Page name to link to
+ */
+ 'wikiGetlink' : function( str ) {
+ return wgServer + wgArticlePath.replace( '$1', this.wikiUrlencode( str ) );
+ },
+
+ /**
+ * Grab the URL parameter value for the given parameter.
+ * Returns null if not found.
+ *
+ * @param param The parameter name
+ * @param url URL to search through (optional)
+ */
+ 'getParamValue' : function( param, url ) {
+ url = url ? url : document.location.href;
+ // Get last match, stop at hash
+ var re = new RegExp( '[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' );
+ var m = re.exec( url );
+ if ( m && m.length > 1 ) {
+ return decodeURIComponent( m[1] );
+ }
+ return null;
+ },
+
+ // Access key prefix.
+ // Will be re-defined based on browser/operating system detection in
+ // mw.util.init().
+ 'tooltipAccessKeyPrefix' : 'alt-',
+
+ // Regex to match accesskey tooltips
+ 'tooltipAccessKeyRegexp': /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+
+ /**
+ * Add the appropriate prefix to the accesskey shown in the tooltip.
+ * If the nodeList parameter is given, only those nodes are updated;
+ * otherwise, all the nodes that will probably have accesskeys by
+ * default are updated.
+ *
+ * @param nodeList jQuery object, or array of elements
+ */
+ 'updateTooltipAccessKeys' : function( nodeList ) {
+ var $nodes;
+ if ( nodeList instanceof jQuery ) {
+ $nodes = nodeList;
+ } else if ( nodeList ) {
+ $nodes = $(nodeList);
+ } else {
+ // Rather than scanning all links, just the elements that
+ // contain the relevant links
+ this.updateTooltipAccessKeys(
+ $('#column-one a, #mw-head a, #mw-panel a, #p-logo a') );
+
+ // these are rare enough that no such optimization is needed
+ this.updateTooltipAccessKeys( $('input') );
+ this.updateTooltipAccessKeys( $('label') );
+ return;
+ }
+
+ $nodes.each( function ( i ) {
+ var tip = $(this).attr( 'title' );
+ if ( !!tip && mw.util.tooltipAccessKeyRegexp.exec( tip ) ) {
+ tip = tip.replace( mw.util.tooltipAccessKeyRegexp,
+ '[' + mw.util.tooltipAccessKeyPrefix + "$5]" );
+ $(this).attr( 'title', tip );
+ }
+ });
+ },
+
+ // jQuery object that refers to the page-content element
+ // Populated by init()
+ '$content' : null,
+
+ /**
+ * Add a link to a portlet menu on the page, such as:
+ *
+ * p-cactions (Content actions), p-personal (Personal tools),
+ * p-navigation (Navigation), p-tb (Toolbox)
+ *
+ * The first three paramters are required, others are optionals. Though
+ * providing an id and tooltip is recommended.
+ *
+ * By default the new link will be added to the end of the list. To
+ * add the link before a given existing item, pass the DOM node
+ * (document.getElementById('foobar')) or the jQuery-selector
+ * ('#foobar') of that item.
+ *
+ * @example mw.util.addPortletLink(
+ * 'p-tb', 'http://mediawiki.org/',
+ * 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
+ * )
+ *
+ * @param portlet ID of the target portlet ('p-cactions' or 'p-personal' etc.)
+ * @param href Link URL
+ * @param text Link text (will be automatically converted to lower
+ * case by CSS for p-cactions in Monobook)
+ * @param id ID of the new item, should be unique and preferably have
+ * the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
+ * @param tooltip Text to show when hovering over the link, without accesskey suffix
+ * @param accesskey Access key to activate this link (one character, try
+ * to avoid conflicts. Use $( '[accesskey=x' ).get() in the console to
+ * see if 'x' is already used.
+ * @param nextnode DOM node or jQuery-selector of the item that the new
+ * item should be added before, should be another item in the same
+ * list will be ignored if not the so
+ *
+ * @return The DOM node of the new item (a LI element, or A element for
+ * older skins) or null.
+ */
+ 'addPortletLink' : function( portlet, href, text, id, tooltip, accesskey, nextnode ) {
+
+ // Check if there's atleast 3 arguments to prevent a TypeError
+ if ( arguments.length < 3 ) {
+ return null;
+ }
+ // Setup the anchor tag
+ var $link = $( '<a></a>' ).attr( 'href', href ).text( text );
+ if ( tooltip ) {
+ $link.attr( 'title', tooltip );
+ }
+
+ // Some skins don't have any portlets
+ // just add it to the bottom of their 'sidebar' element as a fallback
+ switch ( skin ) {
+ case 'standard' :
+ case 'cologneblue' :
+ $("#quickbar").append($link.after( '<br />' ));
+ return $link.get(0);
+ case 'nostalgia' :
+ $("#searchform").before($link).before( ' &#124; ' );
+ return $link.get(0);
+ default : // Skins like chick, modern, monobook, myskin, simple, vector...
+
+ // Select the specified portlet
+ var $portlet = $('#' + portlet);
+ if ( $portlet.length === 0 ) {
+ return null;
+ }
+ // Select the first (most likely only) unordered list inside the portlet
+ var $ul = $portlet.find( 'ul' ).eq( 0 );
+
+ // If it didn't have an unordered list yet, create it
+ if ($ul.length === 0) {
+ // If there's no <div> inside, append it to the portlet directly
+ if ($portlet.find( 'div' ).length === 0) {
+ $portlet.append( '<ul></ul>' );
+ } else {
+ // otherwise if there's a div (such as div.body or div.pBody)
+ // append the <ul> to last (most likely only) div
+ $portlet.find( 'div' ).eq( -1 ).append( '<ul></ul>' );
+ }
+ // Select the created element
+ $ul = $portlet.find( 'ul' ).eq( 0 );
+ }
+ // Just in case..
+ if ( $ul.length === 0 ) {
+ return null;
+ }
+
+ // Unhide portlet if it was hidden before
+ $portlet.removeClass( 'emptyPortlet' );
+
+ // Wrap the anchor tag in a <span> and create a list item for it
+ // and back up the selector to the list item
+ var $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+
+ // Implement the properties passed to the function
+ if ( id ) {
+ $item.attr( 'id', id );
+ }
+ if ( accesskey ) {
+ $link.attr( 'accesskey', accesskey );
+ tooltip += ' [' + accesskey + ']';
+ }
+ if ( tooltip ) {
+ $link.attr( 'title', tooltip );
+ }
+ if ( accesskey && tooltip ) {
+ this.updateTooltipAccessKeys( $link );
+ }
+
+ // Append using DOM-element passing
+ if ( nextnode && nextnode.parentNode == $ul.get( 0 ) ) {
+ $(nextnode).before( $item );
+ } else {
+ // If the jQuery selector isn't found within the <ul>, just
+ // append it at the end
+ if ( $ul.find( nextnode ).length === 0 ) {
+ $ul.append( $item );
+ } else {
+ // Append using jQuery CSS selector
+ $ul.find( nextnode ).eq( 0 ).before( $item );
+ }
+ }
+
+ return $item.get( 0 );
+ }
+ },
+
+ /**
+ * Validate a string as representing a valid e-mail address
+ * according to HTML5 specification. Please note the specification
+ * does not validate a domain with one character.
+ *
+ * FIXME: should be moved to a JavaScript validation module.
+ */
+ 'validateEmail' : function( mailtxt ) {
+ if( mailtxt === '' ) {
+ return null;
+ }
+
+ /**
+ * HTML5 defines a string as valid e-mail address if it matches
+ * the ABNF:
+ * 1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
+ * With:
+ * - atext : defined in RFC 5322 section 3.2.3
+ * - ldh-str : defined in RFC 1034 section 3.5
+ *
+ * (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68):
+ */
+
+ /**
+ * First, define the RFC 5322 'atext' which is pretty easy :
+ * atext = ALPHA / DIGIT / ; Printable US-ASCII
+ "!" / "#" / ; characters not including
+ "$" / "%" / ; specials. Used for atoms.
+ "&" / "'" /
+ "*" / "+" /
+ "-" / "/" /
+ "=" / "?" /
+ "^" / "_" /
+ "`" / "{" /
+ "|" / "}" /
+ "~"
+ */
+ var rfc5322_atext = "a-z0-9!#$%&'*+\\-/=?^_`{|}~",
+
+ /**
+ * Next define the RFC 1034 'ldh-str'
+ * <domain> ::= <subdomain> | " "
+ * <subdomain> ::= <label> | <subdomain> "." <label>
+ * <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
+ * <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
+ * <let-dig-hyp> ::= <let-dig> | "-"
+ * <let-dig> ::= <letter> | <digit>
+ */
+ rfc1034_ldh_str = "a-z0-9\\-",
+
+ HTML5_email_regexp = new RegExp(
+ // start of string
+ '^'
+ +
+ // User part which is liberal :p
+ '[' + rfc5322_atext + '\\.]+'
+ +
+ // "at"
+ '@'
+ +
+ // Domain first part
+ '[' + rfc1034_ldh_str + ']+'
+ +
+ // Optional second part and following are separated by a dot
+ '(?:\\.[' + rfc1034_ldh_str + ']+)*'
+ +
+ // End of string
+ '$',
+ // RegExp is case insensitive
+ 'i'
+ );
+ return (null !== mailtxt.match( HTML5_email_regexp ) );
+ }
+
+ };
+
+ mediaWiki.util.init();
+
+} )( jQuery, mediaWiki ); \ No newline at end of file
diff --git a/resources/mediawiki.util/mediawiki.util.test.js b/resources/mediawiki.util/mediawiki.util.test.js
new file mode 100644
index 00000000..43bf1d88
--- /dev/null
+++ b/resources/mediawiki.util/mediawiki.util.test.js
@@ -0,0 +1,172 @@
+/**
+ * mediaWiki.util Test Suite
+ *
+ * Available on Special:BlankPage?action=mwutiltest&debug=true
+ *
+ * @author Krinkle <krinklemail@gmail.com>
+ */
+
+(function ($, mw) {
+
+ mw.test = {
+
+ /* Variables */
+ '$table' : null,
+ 'addedTests' : [],
+
+ /* Functions */
+
+ /**
+ * Adds a row to the test-table
+ *
+ * @param code String Code of the test to be executed
+ * @param result String Expected result in 'var (vartype)' form
+ * @param contain String Important part of the result, if result is different but does contain this it will not return ERROR but PARTIALLY
+ */
+ 'addTest' : function( code, result, contain ) {
+ if (!contain) {
+ contain = result;
+ }
+ this.addedTests.push([code, result, contain]);
+ this.$table.append('<tr><td>' + mw.html.escape(code).replace(/ /g, '&nbsp;&nbsp;') + '</td><td>' + mw.html.escape(result).replace(/ /g, '&nbsp;&nbsp;') + '<td></td></td><td>?</td></tr>');
+ },
+
+ /* Initialisation */
+ 'initialised' : false,
+ 'init' : function () {
+ if (this.initialised === false) {
+ this.initialised = true;
+ $(function () {
+ if (wgCanonicalSpecialPageName == 'Blankpage' && mw.util.getParamValue('action') === 'mwutiltest') {
+
+ // Build page
+ document.title = 'mediaWiki.util JavaScript Test - ' + wgSiteName;
+ $('#firstHeading').text('mediaWiki.util JavaScript Test');
+ mw.util.$content.html(
+ '<p>Below is a list of tests to confirm proper functionality of the mediaWiki.util functions</p>' +
+ '<hr />' +
+ '<table id="mw-mwutiltest-table" class="wikitable sortable" style="white-space:break; font-family:monospace,\'Courier New\'">' +
+ '<tr><th>Exec</th><th>Should return</th><th>Does return</th><th>Equal ?</th></tr>' +
+ '</table>'
+ );
+ mw.test.$table = $('table#mw-mwutiltest-table');
+
+ // Populate tests
+ mw.test.addTest('typeof $.trimLeft',
+ 'function (string)');
+ mw.test.addTest('$.trimLeft(\' foo bar \')',
+ 'foo bar (string)');
+ mw.test.addTest('typeof $.trimRight',
+ 'function (string)');
+ mw.test.addTest('$.trimRight(\' foo bar \')',
+ ' foo bar (string)');
+ mw.test.addTest('typeof $.isEmpty',
+ 'function (string)');
+ mw.test.addTest('$.isEmpty(\'string\')',
+ 'false (boolean)');
+ mw.test.addTest('$.isEmpty(\'0\')',
+ 'true (boolean)');
+ mw.test.addTest('$.isEmpty([])',
+ 'true (boolean)');
+ mw.test.addTest('typeof $.compareArray',
+ 'function (string)');
+ mw.test.addTest('$.compareArray( [1, "a", [], [2, \'b\'] ], [1, \'a\', [], [2, "b"] ] )',
+ 'true (boolean)');
+ mw.test.addTest('$.compareArray( [1], [2] )',
+ 'false (boolean)');
+ mw.test.addTest('4',
+ '4 (number)');
+ mw.test.addTest('typeof mediaWiki',
+ 'object (string)');
+ mw.test.addTest('typeof mw',
+ 'object (string)');
+ mw.test.addTest('typeof mw.util',
+ 'object (string)');
+ mw.test.addTest('typeof mw.html',
+ 'object (string)');
+ mw.test.addTest('typeof $.ucFirst',
+ 'function (string)');
+ mw.test.addTest('$.ucFirst( \'mediawiki\' )',
+ 'Mediawiki (string)');
+ mw.test.addTest('typeof $.escapeRE',
+ 'function (string)');
+ mw.test.addTest('$.escapeRE( \'.st{e}$st\' )',
+ '\\.st\\{e\\}\\$st (string)');
+ mw.test.addTest('typeof $.fn.checkboxShiftClick',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.rawurlencode',
+ 'function (string)');
+ mw.test.addTest('mw.util.rawurlencode( \'Test: A&B/Here\' )',
+ 'Test%3A%20A%26B%2FHere (string)');
+ mw.test.addTest('typeof mw.util.wikiGetlink',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.getParamValue',
+ 'function (string)');
+ mw.test.addTest('mw.util.getParamValue( \'action\' )',
+ 'mwutiltest (string)');
+ mw.test.addTest('mw.util.getParamValue( \'foo\', \'http://mw.org/?foo=wrong&foo=right#&foo=bad\' )',
+ 'right (string)');
+ mw.test.addTest('mw.util.tooltipAccessKeyRegexp.constructor.name',
+ 'RegExp (string)');
+ mw.test.addTest('typeof mw.util.updateTooltipAccessKeys',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.addPortletLink',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.addPortletLink( "p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print" )',
+ 'object (string)');
+ mw.test.addTest('a = mw.util.addPortletLink( "p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print" ); $(a).text();',
+ 'MediaWiki.org (string)');
+ mw.test.addTest('mw.html.element( \'hr\' )',
+ '<hr/> (string)');
+ mw.test.addTest('mw.html.element( \'img\', { \'src\': \'http://mw.org/?title=Main page&action=edit\' } )',
+ '<img src="http://mw.org/?title=Main page&amp;action=edit"/> (string)');
+ // Try to roughly keep the order similar to the order in the files
+ // or alphabetical (depending on the context)
+
+ // Run tests and compare results
+ var exec,
+ result,
+ resulttype,
+ numberoftests = 0,
+ numberofpasseds = 0,
+ numberofpartials = 0,
+ numberoferrors = 0,
+ $testrows;
+ $testrows = mw.test.$table.find('tr');
+ $.each(mw.test.addedTests, (function ( i ) {
+ numberoftests++;
+
+ exec = mw.test.addedTests[i][0];
+ shouldreturn = mw.test.addedTests[i][1];
+ shouldcontain = mw.test.addedTests[i][2];
+ doesreturn = eval(exec);
+ doesreturn = doesreturn + ' (' + typeof doesreturn + ')';
+ $thisrow = $testrows.eq(i + 1);
+ $thisrow.find('> td').eq(2).text(doesreturn);
+
+ if (doesreturn.indexOf(shouldcontain) !== -1) {
+ if (doesreturn == shouldreturn){
+ $thisrow.find('> td').eq(3).css('background', '#EFE').text('OK');
+ numberofpasseds++;
+ } else {
+ $thisrow.find('> td').eq(3).css('background', '#FFE').html('<small>PARTIALLY</small>');
+ numberofpartials++;
+ }
+ } else {
+ $thisrow.find('> td').eq(3).css('background', '#FEE').text('ERROR');
+ numberoferrors++;
+ }
+
+ })
+ );
+ mw.test.$table.before('<p><strong>Ran ' + numberoftests + ' tests. ' + numberofpasseds + ' passed test(s). ' + numberoferrors + ' error(s). ' + numberofpartials + ' partially passed test(s). </p>');
+
+ }
+ });
+ }
+ }
+ };
+
+ mw.test.init();
+
+} )(jQuery, mediaWiki); \ No newline at end of file
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
new file mode 100644
index 00000000..6518479a
--- /dev/null
+++ b/resources/mediawiki/mediawiki.js
@@ -0,0 +1,1154 @@
+/*
+ * JavaScript backwards-compatibility alternatives and other convenience functions
+ */
+
+jQuery.extend({
+ trimLeft : function( str ) {
+ return str == null ? '' : str.toString().replace( /^\s+/, '' );
+ },
+ trimRight : function( str ) {
+ return str == null ?
+ '' : str.toString().replace( /\s+$/, '' );
+ },
+ ucFirst : function( str ) {
+ return str.substr( 0, 1 ).toUpperCase() + str.substr( 1, str.length );
+ },
+ escapeRE : function( str ) {
+ return str.replace ( /([\\{}()\|.?*+-^$\[\]])/g, "\\$1" );
+ },
+ isEmpty : function( v ) {
+ var key;
+ if ( v === "" || v === 0 || v === "0" || v === null
+ || v === false || typeof v === 'undefined' )
+ {
+ return true;
+ }
+ // the for-loop could potentially contain prototypes
+ // to avoid that we check it's length first
+ if ( v.length === 0 ) {
+ return true;
+ }
+ if ( typeof v === 'object' ) {
+ for ( key in v ) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ },
+ compareArray : function( arrThis, arrAgainst ) {
+ if ( arrThis.length != arrAgainst.length ) {
+ return false;
+ }
+ for ( var i = 0; i < arrThis.length; i++ ) {
+ if ( arrThis[i] instanceof Array ) {
+ if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
+ return false;
+ }
+ } else if ( arrThis[i] !== arrAgainst[i] ) {
+ return false;
+ }
+ }
+ return true;
+ }
+});
+
+/*
+ * Core MediaWiki JavaScript Library
+ */
+
+// Attach to window
+window.mediaWiki = new ( function( $ ) {
+
+ /* Constants */
+
+ // This will not change until we are 100% ready to turn off legacy globals
+ var LEGACY_GLOBALS = true;
+
+ /* Private Members */
+
+ // List of messages that have been requested to be loaded
+ var messageQueue = {};
+
+ /* Prototypes */
+
+ /**
+ * An object which allows single and multiple get/set/exists functionality
+ * on a list of key / value pairs.
+ *
+ * @param {boolean} global Whether to get/set/exists values on the window
+ * object or a private object
+ */
+ function Map( global ) {
+ this.values = ( global === true ) ? window : {};
+ };
+
+ /**
+ * Gets the value of a key, or a list of key/value pairs for an array of keys.
+ *
+ * If called with no arguments, all values will be returned.
+ *
+ * @param selection mixed Key or array of keys to get values for
+ * @param fallback mixed Value to use in case key(s) do not exist (optional)
+ */
+ Map.prototype.get = function( selection, fallback ) {
+ if ( typeof selection === 'object' ) {
+ selection = $.makeArray( selection );
+ var results = {};
+ for ( var i = 0; i < selection.length; i++ ) {
+ results[selection[i]] = this.get( selection[i], fallback );
+ }
+ return results;
+ } else if ( typeof selection === 'string' ) {
+ if ( typeof this.values[selection] === 'undefined' ) {
+ if ( typeof fallback !== 'undefined' ) {
+ return fallback;
+ }
+ return null;
+ }
+ return this.values[selection];
+ }
+ return this.values;
+ };
+
+ /**
+ * Sets one or multiple key/value pairs.
+ *
+ * @param selection mixed Key or object of key/value pairs to set
+ * @param value mixed Value to set (optional, only in use when key is a string)
+ */
+ Map.prototype.set = function( selection, value ) {
+ if ( typeof selection === 'object' ) {
+ for ( var s in selection ) {
+ this.values[s] = selection[s];
+ }
+ } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) {
+ this.values[selection] = value;
+ }
+ };
+
+ /**
+ * Checks if one or multiple keys exist.
+ *
+ * @param selection mixed Key or array of keys to check
+ * @return boolean Existence of key(s)
+ */
+ Map.prototype.exists = function( selection ) {
+ if ( typeof keys === 'object' ) {
+ for ( var s = 0; s < selection.length; s++ ) {
+ if ( !( selection[s] in this.values ) ) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ return selection in this.values;
+ }
+ };
+
+ /**
+ * Message object, similar to Message in PHP
+ */
+ function Message( map, key, parameters ) {
+ this.format = 'parse';
+ this.map = map;
+ this.key = key;
+ this.parameters = typeof parameters === 'undefined' ? [] : $.makeArray( parameters );
+ };
+
+ /**
+ * Appends parameters for replacement
+ *
+ * @param parameters mixed First in a list of variadic arguments to append as message parameters
+ */
+ Message.prototype.params = function( parameters ) {
+ for ( var i = 0; i < parameters.length; i++ ) {
+ this.parameters[this.parameters.length] = parameters[i];
+ }
+ return this;
+ };
+
+ /**
+ * Converts message object to it's string form based on the state of format
+ *
+ * @return {string} String form of message
+ */
+ Message.prototype.toString = function() {
+ if ( !this.map.exists( this.key ) ) {
+ // Return <key> if key does not exist
+ return '<' + this.key + '>';
+ }
+ var text = this.map.get( this.key );
+ var parameters = this.parameters;
+ text = text.replace( /\$(\d+)/g, function( string, match ) {
+ var index = parseInt( match, 10 ) - 1;
+ return index in parameters ? parameters[index] : '$' + match;
+ } );
+ /* This should be fixed up when we have a parser
+ if ( this.format === 'parse' && 'language' in mediaWiki ) {
+ text = mediaWiki.language.parse( text );
+ }
+ */
+ return text;
+ };
+
+ /**
+ * Changes format to parse and converts message to string
+ *
+ * @return {string} String form of parsed message
+ */
+ Message.prototype.parse = function() {
+ this.format = 'parse';
+ return this.toString();
+ };
+
+ /**
+ * Changes format to plain and converts message to string
+ *
+ * @return {string} String form of plain message
+ */
+ Message.prototype.plain = function() {
+ this.format = 'plain';
+ return this.toString();
+ };
+
+ /**
+ * Checks if message exists
+ *
+ * @return {string} String form of parsed message
+ */
+ Message.prototype.exists = function() {
+ return this.map.exists( this.key );
+ };
+
+ /**
+ * User object
+ */
+ function User() {
+ this.options = new Map();
+
+ /* Public Methods */
+
+ /*
+ * Generates a random user session ID (32 alpha-numeric characters).
+ *
+ * This information would potentially be stored in a cookie to identify a user during a
+ * session or series of sessions. It's uniqueness should not be depended on.
+ *
+ * @return string random set of 32 alpha-numeric characters
+ */
+ function generateId() {
+ var id = '';
+ var seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz';
+ for ( var i = 0, r; i < 32; i++ ) {
+ r = Math.floor( Math.random() * seed.length );
+ id += seed.substring( r, r + 1 );
+ }
+ return id;
+ }
+
+ /*
+ * Gets the current user's name.
+ *
+ * @return mixed user name string or null if users is anonymous
+ */
+ this.name = function() {
+ return mediaWiki.config.get( 'wgUserName' );
+ };
+
+ /*
+ * Gets a random session ID automatically generated and kept in a cookie.
+ *
+ * This ID is ephemeral for everyone, staying in their browser only until they close
+ * their browser.
+ *
+ * Do not use this method before the first call to mediaWiki.loader.go(), it depends on
+ * jquery.cookie, which is added to the first pay-load just after mediaWiki is defined, but
+ * won't be loaded until the first call to go().
+ *
+ * @return string user name or random session ID
+ */
+ this.sessionId = function () {
+ var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
+ if ( typeof sessionId == 'undefined' || sessionId == null ) {
+ sessionId = generateId();
+ $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
+ }
+ return sessionId;
+ };
+
+ /*
+ * Gets the current user's name or a random ID automatically generated and kept in a cookie.
+ *
+ * This ID is persistent for anonymous users, staying in their browser up to 1 year. The
+ * expiration time is reset each time the ID is queried, so in most cases this ID will
+ * persist until the browser's cookies are cleared or the user doesn't visit for 1 year.
+ *
+ * Do not use this method before the first call to mediaWiki.loader.go(), it depends on
+ * jquery.cookie, which is added to the first pay-load just after mediaWiki is defined, but
+ * won't be loaded until the first call to go().
+ *
+ * @return string user name or random session ID
+ */
+ this.id = function() {
+ var name = that.name();
+ if ( name ) {
+ return name;
+ }
+ var id = $.cookie( 'mediaWiki.user.id' );
+ if ( typeof id == 'undefined' || id == null ) {
+ id = generateId();
+ }
+ // Set cookie if not set, or renew it if already set
+ $.cookie( 'mediaWiki.user.id', id, { 'expires': 365, 'path': '/' } );
+ return id;
+ };
+ }
+
+ /* Public Members */
+
+ /*
+ * Dummy function which in debug mode can be replaced with a function that
+ * does something clever
+ */
+ this.log = function() { };
+
+ /*
+ * List of configuration values
+ *
+ * In legacy mode the values this object wraps will be in the global space
+ */
+ this.config = new Map( LEGACY_GLOBALS );
+
+ /*
+ * Information about the current user
+ */
+ this.user = new User();
+
+ /*
+ * Localization system
+ */
+ this.messages = new Map();
+
+ /* Public Methods */
+
+ /**
+ * Gets a message object, similar to wfMessage()
+ *
+ * @param key string Key of message to get
+ * @param parameters mixed First argument in a list of variadic arguments, each a parameter for $
+ * replacement
+ */
+ this.message = function( key, parameters ) {
+ // Support variadic arguments
+ if ( typeof parameters !== 'undefined' ) {
+ parameters = $.makeArray( arguments );
+ parameters.shift();
+ } else {
+ parameters = [];
+ }
+ return new Message( mediaWiki.messages, key, parameters );
+ };
+
+ /**
+ * Gets a message string, similar to wfMsg()
+ *
+ * @param key string Key of message to get
+ * @param parameters mixed First argument in a list of variadic arguments, each a parameter for $
+ * replacement
+ */
+ this.msg = function( key, parameters ) {
+ return mediaWiki.message.apply( mediaWiki.message, arguments ).toString();
+ };
+
+ /**
+ * Client-side module loader which integrates with the MediaWiki ResourceLoader
+ */
+ this.loader = new ( function() {
+
+ /* Private Members */
+
+ /**
+ * Mapping of registered modules
+ *
+ * The jquery module is pre-registered, because it must have already
+ * been provided for this object to have been built, and in debug mode
+ * jquery would have been provided through a unique loader request,
+ * making it impossible to hold back registration of jquery until after
+ * mediawiki.
+ *
+ * Format:
+ * {
+ * 'moduleName': {
+ * 'dependencies': ['required module', 'required module', ...], (or) function() {}
+ * 'state': 'registered', 'loading', 'loaded', 'ready', or 'error'
+ * 'script': function() {},
+ * 'style': 'css code string',
+ * 'messages': { 'key': 'value' },
+ * 'version': ############## (unix timestamp)
+ * }
+ * }
+ */
+ var registry = {};
+ // List of modules which will be loaded as when ready
+ var batch = [];
+ // List of modules to be loaded
+ var queue = [];
+ // List of callback functions waiting for modules to be ready to be called
+ var jobs = [];
+ // Flag indicating that requests should be suspended
+ var suspended = true;
+ // Flag inidicating that document ready has occured
+ var ready = false;
+ // Marker element for adding dynamic styles
+ var $marker = $( 'head meta[name=ResourceLoaderDynamicStyles]' );
+
+ /* Private Methods */
+
+ function compare( a, b ) {
+ if ( a.length != b.length ) {
+ return false;
+ }
+ for ( var i = 0; i < b.length; i++ ) {
+ if ( $.isArray( a[i] ) ) {
+ if ( !compare( a[i], b[i] ) ) {
+ return false;
+ }
+ }
+ if ( a[i] !== b[i] ) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ /**
+ * Generates an ISO8601 "basic" string from a UNIX timestamp
+ */
+ function formatVersionNumber( timestamp ) {
+ function pad( a, b, c ) {
+ return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
+ }
+ var d = new Date();
+ d.setTime( timestamp * 1000 );
+ return [
+ pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
+ pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
+ ].join( '' );
+ }
+
+ /**
+ * Recursively resolves dependencies and detects circular references
+ */
+ function recurse( module, resolved, unresolved ) {
+ if ( typeof registry[module] === 'undefined' ) {
+ throw new Error( 'Unknown dependency: ' + module );
+ }
+ // Resolves dynamic loader function and replaces it with its own results
+ if ( typeof registry[module].dependencies === 'function' ) {
+ registry[module].dependencies = registry[module].dependencies();
+ // Ensures the module's dependencies are always in an array
+ if ( typeof registry[module].dependencies !== 'object' ) {
+ registry[module].dependencies = [registry[module].dependencies];
+ }
+ }
+ // Tracks down dependencies
+ for ( var n = 0; n < registry[module].dependencies.length; n++ ) {
+ if ( $.inArray( registry[module].dependencies[n], resolved ) === -1 ) {
+ if ( $.inArray( registry[module].dependencies[n], unresolved ) !== -1 ) {
+ throw new Error(
+ 'Circular reference detected: ' + module +
+ ' -> ' + registry[module].dependencies[n]
+ );
+ }
+ recurse( registry[module].dependencies[n], resolved, unresolved );
+ }
+ }
+ resolved[resolved.length] = module;
+ unresolved.splice( $.inArray( module, unresolved ), 1 );
+ }
+
+ /**
+ * Gets a list of module names that a module depends on in their proper dependency order
+ *
+ * @param module string module name or array of string module names
+ * @return list of dependencies
+ * @throws Error if circular reference is detected
+ */
+ function resolve( module, resolved, unresolved ) {
+ // Allow calling with an array of module names
+ if ( typeof module === 'object' ) {
+ var modules = [];
+ for ( var m = 0; m < module.length; m++ ) {
+ var dependencies = resolve( module[m] );
+ for ( var n = 0; n < dependencies.length; n++ ) {
+ modules[modules.length] = dependencies[n];
+ }
+ }
+ return modules;
+ } else if ( typeof module === 'string' ) {
+ // Undefined modules have no dependencies
+ if ( !( module in registry ) ) {
+ return [];
+ }
+ var resolved = [];
+ recurse( module, resolved, [] );
+ return resolved;
+ }
+ throw new Error( 'Invalid module argument: ' + module );
+ };
+
+ /**
+ * Narrows a list of module names down to those matching a specific
+ * state. Possible states are 'undefined', 'registered', 'loading',
+ * 'loaded', or 'ready'
+ *
+ * @param states string or array of strings of module states to filter by
+ * @param modules array list of module names to filter (optional, all modules
+ * will be used by default)
+ * @return array list of filtered module names
+ */
+ function filter( states, modules ) {
+ // Allow states to be given as a string
+ if ( typeof states === 'string' ) {
+ states = [states];
+ }
+ // If called without a list of modules, build and use a list of all modules
+ var list = [];
+ if ( typeof modules === 'undefined' ) {
+ modules = [];
+ for ( module in registry ) {
+ modules[modules.length] = module;
+ }
+ }
+ // Build a list of modules which are in one of the specified states
+ for ( var s = 0; s < states.length; s++ ) {
+ for ( var m = 0; m < modules.length; m++ ) {
+ if ( typeof registry[modules[m]] === 'undefined' ) {
+ // Module does not exist
+ if ( states[s] == 'undefined' ) {
+ // OK, undefined
+ list[list.length] = modules[m];
+ }
+ } else {
+ // Module exists, check state
+ if ( registry[modules[m]].state === states[s] ) {
+ // OK, correct state
+ list[list.length] = modules[m];
+ }
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * Executes a loaded module, making it ready to use
+ *
+ * @param module string module name to execute
+ */
+ function execute( module ) {
+ if ( typeof registry[module] === 'undefined' ) {
+ throw new Error( 'Module has not been registered yet: ' + module );
+ } else if ( registry[module].state === 'registered' ) {
+ throw new Error( 'Module has not been requested from the server yet: ' + module );
+ } else if ( registry[module].state === 'loading' ) {
+ throw new Error( 'Module has not completed loading yet: ' + module );
+ } else if ( registry[module].state === 'ready' ) {
+ throw new Error( 'Module has already been loaded: ' + module );
+ }
+ // Add style sheet to document
+ if ( typeof registry[module].style === 'string' && registry[module].style.length ) {
+ $marker.before( mediaWiki.html.element( 'style',
+ { type: 'text/css' },
+ new mediaWiki.html.Cdata( registry[module].style )
+ ) );
+ } else if ( typeof registry[module].style === 'object'
+ && !( registry[module].style instanceof Array ) )
+ {
+ for ( var media in registry[module].style ) {
+ $marker.before( mediaWiki.html.element( 'style',
+ { type: 'text/css', media: media },
+ new mediaWiki.html.Cdata( registry[module].style[media] )
+ ) );
+ }
+ }
+ // Add localizations to message system
+ if ( typeof registry[module].messages === 'object' ) {
+ mediaWiki.messages.set( registry[module].messages );
+ }
+ // Execute script
+ try {
+ registry[module].script( jQuery, mediaWiki );
+ registry[module].state = 'ready';
+ // Run jobs who's dependencies have just been met
+ for ( var j = 0; j < jobs.length; j++ ) {
+ if ( compare(
+ filter( 'ready', jobs[j].dependencies ),
+ jobs[j].dependencies ) )
+ {
+ if ( typeof jobs[j].ready === 'function' ) {
+ jobs[j].ready();
+ }
+ jobs.splice( j, 1 );
+ j--;
+ }
+ }
+ // Execute modules who's dependencies have just been met
+ for ( r in registry ) {
+ if ( registry[r].state == 'loaded' ) {
+ if ( compare(
+ filter( ['ready'], registry[r].dependencies ),
+ registry[r].dependencies ) )
+ {
+ execute( r );
+ }
+ }
+ }
+ } catch ( e ) {
+ mediaWiki.log( 'Exception thrown by ' + module + ': ' + e.message );
+ mediaWiki.log( e );
+ registry[module].state = 'error';
+ // Run error callbacks of jobs affected by this condition
+ for ( var j = 0; j < jobs.length; j++ ) {
+ if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) {
+ if ( typeof jobs[j].error === 'function' ) {
+ jobs[j].error();
+ }
+ jobs.splice( j, 1 );
+ j--;
+ }
+ }
+ }
+ }
+
+ /**
+ * Adds a dependencies to the queue with optional callbacks to be run
+ * when the dependencies are ready or fail
+ *
+ * @param dependencies string module name or array of string module names
+ * @param ready function callback to execute when all dependencies are ready
+ * @param error function callback to execute when any dependency fails
+ */
+ function request( dependencies, ready, error ) {
+ // Allow calling by single module name
+ if ( typeof dependencies === 'string' ) {
+ dependencies = [dependencies];
+ if ( dependencies[0] in registry ) {
+ for ( var n = 0; n < registry[dependencies[0]].dependencies.length; n++ ) {
+ dependencies[dependencies.length] =
+ registry[dependencies[0]].dependencies[n];
+ }
+ }
+ }
+ // Add ready and error callbacks if they were given
+ if ( arguments.length > 1 ) {
+ jobs[jobs.length] = {
+ 'dependencies': filter(
+ ['undefined', 'registered', 'loading', 'loaded'],
+ dependencies ),
+ 'ready': ready,
+ 'error': error
+ };
+ }
+ // Queue up any dependencies that are undefined or registered
+ dependencies = filter( ['undefined', 'registered'], dependencies );
+ for ( var n = 0; n < dependencies.length; n++ ) {
+ if ( $.inArray( dependencies[n], queue ) === -1 ) {
+ queue[queue.length] = dependencies[n];
+ }
+ }
+ // Work the queue
+ mediaWiki.loader.work();
+ }
+
+ function sortQuery(o) {
+ var sorted = {}, key, a = [];
+ for ( key in o ) {
+ if ( o.hasOwnProperty( key ) ) {
+ a.push( key );
+ }
+ }
+ a.sort();
+ for ( key = 0; key < a.length; key++ ) {
+ sorted[a[key]] = o[a[key]];
+ }
+ 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
+ */
+ function buildModulesString( moduleMap ) {
+ var arr = [];
+ for ( var prefix in moduleMap ) {
+ var p = prefix === '' ? '' : prefix + '.';
+ arr.push( p + moduleMap[prefix].join( ',' ) );
+ }
+ return arr.join( '|' );
+ }
+
+
+ /* Public Methods */
+
+ /**
+ * Requests dependencies from server, loading and executing when things when ready.
+ */
+ this.work = function() {
+ // Appends a list of modules to the batch
+ for ( var q = 0; q < queue.length; q++ ) {
+ // Only request modules which are undefined or registered
+ if ( !( queue[q] in registry ) || registry[queue[q]].state == 'registered' ) {
+ // Prevent duplicate entries
+ if ( $.inArray( queue[q], batch ) === -1 ) {
+ batch[batch.length] = queue[q];
+ // Mark registered modules as loading
+ if ( queue[q] in registry ) {
+ registry[queue[q]].state = 'loading';
+ }
+ }
+ }
+ }
+ // Clean up the queue
+ queue = [];
+ // After document ready, handle the batch
+ if ( !suspended && batch.length ) {
+ // Always order modules alphabetically to help reduce cache
+ // misses for otherwise identical content
+ batch.sort();
+ // Build a list of request parameters
+ var base = {
+ 'skin': mediaWiki.config.get( 'skin' ),
+ 'lang': mediaWiki.config.get( 'wgUserLanguage' ),
+ 'debug': mediaWiki.config.get( 'debug' )
+ };
+ // Extend request parameters with a list of modules in the batch
+ var requests = [];
+ // Split into groups
+ var groups = {};
+ for ( var b = 0; b < batch.length; b++ ) {
+ var group = registry[batch[b]].group;
+ if ( !( group in groups ) ) {
+ groups[group] = [];
+ }
+ groups[group][groups[group].length] = batch[b];
+ }
+ for ( var group in groups ) {
+ // Calculate the highest timestamp
+ var version = 0;
+ for ( var g = 0; g < groups[group].length; g++ ) {
+ if ( registry[groups[group][g]].version > version ) {
+ version = registry[groups[group][g]].version;
+ }
+ }
+ var reqBase = $.extend( { 'version': formatVersionNumber( version ) }, base );
+ var reqBaseLength = $.param( reqBase ).length;
+ var reqs = [];
+ var limit = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
+ // We may need to split up the request to honor the query string length limit
+ // So build it piece by piece
+ var l = reqBaseLength + 9; // '&modules='.length == 9
+ var r = 0;
+ reqs[0] = {}; // { prefix: [ suffixes ] }
+ for ( var i = 0; i < groups[group].length; i++ ) {
+ // Determine how many bytes this module would add to the query string
+ var lastDotIndex = groups[group][i].lastIndexOf( '.' );
+ // Note that these substr() calls work even if lastDotIndex == -1
+ var prefix = groups[group][i].substr( 0, lastDotIndex );
+ var suffix = groups[group][i].substr( lastDotIndex + 1 );
+ var bytesAdded = prefix in reqs[r] ?
+ suffix.length + 3 : // '%2C'.length == 3
+ groups[group][i].length + 3; // '%7C'.length == 3
+
+ // If the request would become too long, create a new one,
+ // but don't create empty requests
+ if ( limit > 0 && reqs[r] != {} && l + bytesAdded > limit ) {
+ // This request would become too long, create a new one
+ r++;
+ reqs[r] = {};
+ l = reqBaseLength + 9;
+ }
+ if ( !( prefix in reqs[r] ) ) {
+ reqs[r][prefix] = [];
+ }
+ reqs[r][prefix].push( suffix );
+ l += bytesAdded;
+ }
+ for ( var r = 0; r < reqs.length; r++ ) {
+ requests[requests.length] = $.extend(
+ { 'modules': buildModulesString( reqs[r] ) }, reqBase
+ );
+ }
+ }
+ // Clear the batch - this MUST happen before we append the
+ // script element to the body or it's possible that the 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 = [];
+ // Asynchronously append a script tag to the end of the body
+ function request() {
+ var html = '';
+ for ( var r = 0; r < requests.length; r++ ) {
+ requests[r] = sortQuery( requests[r] );
+ // Build out the HTML
+ var src = mediaWiki.config.get( 'wgLoadScript' ) + '?' + $.param( requests[r] );
+ html += mediaWiki.html.element( 'script',
+ { type: 'text/javascript', src: src }, '' );
+ }
+ return html;
+ }
+ // Load asynchronously after doumument ready
+ if ( ready ) {
+ setTimeout( function() { $( 'body' ).append( request() ); }, 0 )
+ } else {
+ document.write( request() );
+ }
+ }
+ };
+
+ /**
+ * Registers a module, letting the system know about it and its
+ * dependencies. loader.js files contain calls to this function.
+ */
+ this.register = function( module, version, dependencies, group ) {
+ // Allow multiple registration
+ if ( typeof module === 'object' ) {
+ for ( var m = 0; m < module.length; m++ ) {
+ if ( typeof module[m] === 'string' ) {
+ mediaWiki.loader.register( module[m] );
+ } else if ( typeof module[m] === 'object' ) {
+ mediaWiki.loader.register.apply( mediaWiki.loader, module[m] );
+ }
+ }
+ return;
+ }
+ // Validate input
+ if ( typeof module !== 'string' ) {
+ throw new Error( 'module must be a string, not a ' + typeof module );
+ }
+ if ( typeof registry[module] !== 'undefined' ) {
+ throw new Error( 'module already implemeneted: ' + module );
+ }
+ // List the module as registered
+ registry[module] = {
+ 'state': 'registered',
+ 'group': typeof group === 'string' ? group : null,
+ 'dependencies': [],
+ 'version': typeof version !== 'undefined' ? parseInt( version ) : 0
+ };
+ if ( typeof dependencies === 'string' ) {
+ // Allow dependencies to be given as a single module name
+ registry[module].dependencies = [dependencies];
+ } else if ( typeof dependencies === 'object' || typeof dependencies === 'function' ) {
+ // Allow dependencies to be given as an array of module names
+ // or a function which returns an array
+ 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
+ * calls to this function.
+ */
+ this.implement = function( module, script, style, localization ) {
+ // Automatically register module
+ if ( typeof registry[module] === 'undefined' ) {
+ mediaWiki.loader.register( module );
+ }
+ // Validate input
+ if ( typeof script !== 'function' ) {
+ throw new Error( 'script must be a function, not a ' + typeof script );
+ }
+ if ( typeof style !== 'undefined'
+ && typeof style !== 'string'
+ && typeof style !== 'object' )
+ {
+ throw new Error( 'style must be a string or object, not a ' + typeof style );
+ }
+ if ( typeof localization !== 'undefined'
+ && typeof localization !== 'object' )
+ {
+ throw new Error( 'localization must be an object, not a ' + typeof localization );
+ }
+ if ( typeof registry[module] !== 'undefined'
+ && typeof registry[module].script !== 'undefined' )
+ {
+ throw new Error( 'module already implemeneted: ' + module );
+ }
+ // Mark module as loaded
+ registry[module].state = 'loaded';
+ // Attach components
+ registry[module].script = script;
+ if ( typeof style === 'string'
+ || typeof style === 'object' && !( style instanceof Array ) )
+ {
+ registry[module].style = style;
+ }
+ if ( typeof localization === 'object' ) {
+ registry[module].messages = localization;
+ }
+ // Execute or queue callback
+ if ( compare(
+ filter( ['ready'], registry[module].dependencies ),
+ registry[module].dependencies ) )
+ {
+ execute( module );
+ } else {
+ request( module );
+ }
+ };
+
+ /**
+ * Executes a function as soon as one or more required modules are ready
+ *
+ * @param dependencies string or array of strings of modules names the callback
+ * dependencies to be ready before
+ * executing
+ * @param ready function callback to execute when all dependencies are ready (optional)
+ * @param error function callback to execute when if dependencies have a errors (optional)
+ */
+ this.using = function( dependencies, ready, error ) {
+ // Validate input
+ if ( typeof dependencies !== 'object' && typeof dependencies !== 'string' ) {
+ throw new Error( 'dependencies must be a string or an array, not a ' +
+ typeof dependencies )
+ }
+ // Allow calling with a single dependency as a string
+ if ( typeof dependencies === 'string' ) {
+ dependencies = [dependencies];
+ }
+ // Resolve entire dependency map
+ dependencies = resolve( dependencies );
+ // If all dependencies are met, execute ready immediately
+ if ( compare( filter( ['ready'], dependencies ), dependencies ) ) {
+ if ( typeof ready === 'function' ) {
+ ready();
+ }
+ }
+ // If any dependencies have errors execute error immediately
+ else if ( filter( ['error'], dependencies ).length ) {
+ if ( typeof error === 'function' ) {
+ error();
+ }
+ }
+ // Since some dependencies are not yet ready, queue up a request
+ else {
+ request( dependencies, ready, error );
+ }
+ };
+
+ /**
+ * Loads an external script or one or more modules for future use
+ *
+ * @param modules mixed either the name of a module, array of modules,
+ * or a URL of an external script or style
+ * @param type string mime-type to use if calling with a URL of an
+ * external script or style; acceptable values are "text/css" and
+ * "text/javascript"; if no type is provided, text/javascript is
+ * assumed
+ */
+ this.load = function( modules, type ) {
+ // Validate input
+ if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
+ throw new Error( 'dependencies must be a string or an array, not a ' +
+ typeof dependencies )
+ }
+ // Allow calling with an external script or single dependency as a string
+ if ( typeof modules === 'string' ) {
+ // Support adding arbitrary external scripts
+ if ( modules.substr( 0, 7 ) == 'http://' || modules.substr( 0, 8 ) == 'https://' ) {
+ if ( type === 'text/css' ) {
+ $( 'head' )
+ .append( $( '<link rel="stylesheet" type="text/css" />' )
+ .attr( 'href', modules ) );
+ return true;
+ } else if ( type === 'text/javascript' || typeof type === 'undefined' ) {
+ var script = mediaWiki.html.element( 'script',
+ { type: 'text/javascript', src: modules }, '' );
+ if ( ready ) {
+ $( 'body' ).append( script );
+ } else {
+ document.write( script );
+ }
+ return true;
+ }
+ // Unknown type
+ return false;
+ }
+ // Called with single module
+ modules = [modules];
+ }
+ // Resolve entire dependency map
+ modules = resolve( modules );
+ // If all modules are ready, nothing dependency be done
+ if ( compare( filter( ['ready'], modules ), modules ) ) {
+ return true;
+ }
+ // If any modules have errors return false
+ else if ( filter( ['error'], modules ).length ) {
+ return false;
+ }
+ // Since some modules are not yet ready, queue up a request
+ else {
+ request( modules );
+ return true;
+ }
+ };
+
+ /**
+ * Flushes the request queue and begin executing load requests on demand
+ */
+ this.go = function() {
+ suspended = false;
+ mediaWiki.loader.work();
+ };
+
+ /**
+ * Changes the state of a module
+ *
+ * @param module string module name or object of module name/state pairs
+ * @param state string state name
+ */
+ this.state = function( module, state ) {
+ if ( typeof module === 'object' ) {
+ for ( var m in module ) {
+ mediaWiki.loader.state( m, module[m] );
+ }
+ return;
+ }
+ if ( !( module in registry ) ) {
+ mediaWiki.loader.register( module );
+ }
+ registry[module].state = state;
+ };
+
+ /**
+ * Gets the version of a module
+ *
+ * @param module string name of module to get version for
+ */
+ this.version = function( module ) {
+ if ( module in registry && 'version' in registry[module] ) {
+ return formatVersionNumber( registry[module].version );
+ }
+ return null;
+ };
+
+ /* Cache document ready status */
+
+ $(document).ready( function() { ready = true; } );
+ } )();
+
+ /** HTML construction helper functions */
+ this.html = new ( function () {
+ function escapeCallback( s ) {
+ switch ( s ) {
+ case "'":
+ return '&#039;';
+ case '"':
+ return '&quot;';
+ case '<':
+ return '&lt;';
+ case '>':
+ return '&gt;';
+ case '&':
+ return '&amp;';
+ }
+ }
+
+ /**
+ * Escape a string for HTML. Converts special characters to HTML entities.
+ * @param s The string to escape
+ */
+ this.escape = function( s ) {
+ return s.replace( /['"<>&]/g, escapeCallback );
+ };
+
+ /**
+ * Wrapper object for raw HTML passed to mediaWiki.html.element().
+ */
+ this.Raw = function( value ) {
+ this.value = value;
+ };
+
+ /**
+ * Wrapper object for CDATA element contents passed to mediaWiki.html.element()
+ */
+ this.Cdata = function( value ) {
+ this.value = value;
+ };
+
+ /**
+ * Create an HTML element string, with safe escaping.
+ *
+ * @param name The tag name.
+ * @param attrs An object with members mapping element names to values
+ * @param contents The contents of the element. May be either:
+ * - string: The string is escaped.
+ * - null or undefined: The short closing form is used, e.g. <br/>.
+ * - this.Raw: The value attribute is included without escaping.
+ * - this.Cdata: The value attribute is included, and an exception is
+ * thrown if it contains an illegal ETAGO delimiter.
+ * See http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2
+ *
+ * Example:
+ * var h = mediaWiki.html;
+ * return h.element( 'div', {},
+ * new h.Raw( h.element( 'img', {src: '<'} ) ) );
+ * Returns <div><img src="&lt;"/></div>
+ */
+ this.element = function( name, attrs, contents ) {
+ var s = '<' + name;
+ for ( var attrName in attrs ) {
+ s += ' ' + attrName + '="' + this.escape( attrs[attrName] ) + '"';
+ }
+ if ( typeof contents == 'undefined' || contents === null ) {
+ // Self close tag
+ s += '/>';
+ return s;
+ }
+ // Regular open tag
+ s += '>';
+ if ( typeof contents === 'string') {
+ // Escaped
+ s += this.escape( contents );
+ } else if ( contents instanceof this.Raw ) {
+ // Raw HTML inclusion
+ s += contents.value;
+ } else if ( contents instanceof this.Cdata ) {
+ // CDATA
+ if ( /<\/[a-zA-z]/.test( contents.value ) ) {
+ throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+ }
+ s += contents.value;
+ } else {
+ throw new Error( 'mw.html.element: Invalid type of contents' );
+ }
+ s += '</' + name + '>';
+ return s;
+ };
+ } )();
+
+
+ /* Extension points */
+
+ this.legacy = {};
+
+} )( jQuery );
+
+/* Auto-register from pre-loaded startup scripts */
+
+if ( typeof startUp === 'function' ) {
+ startUp();
+ delete startUp;
+}
+
+// Add jQuery Cookie to initial payload (used in mediaWiki.user)
+mediaWiki.loader.load( 'jquery.cookie' );
+
+// Alias $j to jQuery for backwards compatibility
+window.$j = jQuery;
+window.mw = mediaWiki;
diff --git a/resources/mediawiki/mediawiki.log.js b/resources/mediawiki/mediawiki.log.js
new file mode 100644
index 00000000..55bf77f0
--- /dev/null
+++ b/resources/mediawiki/mediawiki.log.js
@@ -0,0 +1,64 @@
+/*
+ * Implementation for mediaWiki.log stub
+ */
+
+(function ($, mw) {
+
+ /**
+ * Log output to the console.
+ *
+ * In the case that the browser does not have a console available, one is created by appending a
+ * <div> element to the bottom of the body and then appending a <div> element to that for each
+ * message.
+ *
+ * @author Michael Dale <mdale@wikimedia.org>
+ * @author Trevor Parscal <tparscal@wikimedia.org>
+ * @param {string} string Message to output to console
+ */
+ mediaWiki.log = function( string ) {
+ // Allow log messages to use a configured prefix
+ if ( mw.config.exists( 'mw.log.prefix' ) ) {
+ string = mw.config.get( 'mw.log.prefix' ) + '> ' + string;
+ }
+ // Try to use an existing console
+ if ( typeof window.console !== 'undefined' && typeof window.console.log == 'function' ) {
+ window.console.log( string );
+ } else {
+ // Set timestamp
+ var d = new Date();
+ var time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
+ ':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
+ ':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
+ '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) );
+ // Show a log box for console-less browsers
+ var $log = $( '#mw-log-console' );
+ if ( !$log.length ) {
+ $log = $( '<div id="mw-log-console"></div>' )
+ .css( {
+ 'position': 'absolute',
+ 'overflow': 'auto',
+ 'z-index': 500,
+ 'bottom': '0px',
+ 'left': '0px',
+ 'right': '0px',
+ 'height': '150px',
+ 'background-color': 'white',
+ 'border-top': 'solid 2px #ADADAD'
+ } )
+ .appendTo( 'body' );
+ }
+ $log.append(
+ $( '<div></div>' )
+ .css( {
+ 'border-bottom': 'solid 1px #DDDDDD',
+ 'font-size': 'small',
+ 'font-family': 'monospace',
+ 'padding': '0.125em 0.25em'
+ } )
+ .text( string )
+ .append( '<span style="float:right">[' + time + ']</span>' )
+ );
+ }
+ };
+
+})(jQuery, mediaWiki);
diff --git a/resources/startup.js b/resources/startup.js
new file mode 100644
index 00000000..52c320c6
--- /dev/null
+++ b/resources/startup.js
@@ -0,0 +1,34 @@
+/**
+ * This script provides a function which is run to evaluate whether or not to
+ * continue loading the jquery and mediawiki modules. This code should work on
+ * even the most ancient of browsers, so be very careful when editing.
+ */
+/**
+ * Returns false when run in a black-listed browser
+ *
+ * This function will be deleted after it's used, so do not expand it to be
+ * generally useful beyond startup
+ *
+ * jQuery has minimum requirements of:
+ * * Firefox 2.0+
+ * * Internet Explorer 6+
+ * * Safari 3+
+ * * Opera 9+
+ * * Chrome 1+
+ */
+var isCompatible = function() {
+ // IE < 6
+ if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
+ && parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) < 6 )
+ {
+ return false;
+ }
+ // TODO: Firefox < 2
+ // TODO: Safari < 3
+ // TODO: Opera < 9
+ // TODO: Chrome < 1
+ return true;
+};
+/**
+ * The startUp() function will be generated and added here (at the bottom)
+ */
diff --git a/serialized/first-letters-root.ser b/serialized/first-letters-root.ser
new file mode 100644
index 00000000..896fc333
--- /dev/null
+++ b/serialized/first-letters-root.ser
@@ -0,0 +1 @@
+a:14742:{i:0;s:2:"Ù€";i:1;s:1:"`";i:2;s:2:"´";i:3;s:2:"Ëœ";i:4;s:1:"^";i:5;s:2:"¯";i:6;s:3:"‾";i:7;s:2:"˘";i:8;s:2:"Ë™";i:9;s:2:"¨";i:10;s:2:"Ëš";i:11;s:2:"Ë";i:12;s:3:"á¾½";i:13;s:3:"á¿";i:14;s:2:"¸";i:15;s:2:"Ë›";i:16;s:1:"_";i:17;s:3:"‗";i:18;s:3:"á¿€";i:19;s:3:"﮲";i:20;s:3:"﮳";i:21;s:3:"ï®´";i:22;s:3:"﮵";i:23;s:3:"﮶";i:24;s:3:"ï®·";i:25;s:3:"﮸";i:26;s:3:"﮹";i:27;s:3:"﮺";i:28;s:3:"ï®»";i:29;s:3:"﮼";i:30;s:3:"﮽";i:31;s:3:"﮾";i:32;s:3:"﮿";i:33;s:3:"﯀";i:34;s:3:"ï¯";i:35;s:3:"ã‚›";i:36;s:3:"ã‚œ";i:37;s:1:"-";i:38;s:2:"ÖŠ";i:39;s:3:"á€";i:40;s:3:"á­ ";i:41;s:3:"á †";i:42;s:3:"á ‡";i:43;s:3:"â€";i:44;s:3:"‒";i:45;s:3:"–";i:46;s:3:"—";i:47;s:3:"―";i:48;s:3:"â“";i:49;s:3:"⸗";i:50;s:3:"ã‚ ";i:51;s:3:"・";i:52;s:1:",";i:53;s:2:"Õ";i:54;s:2:"ØŒ";i:55;s:2:"Ø";i:56;s:2:"Ù«";i:57;s:2:"Ù¬";i:58;s:2:"߸";i:59;s:3:"á ‚";i:60;s:3:"á ˆ";i:61;s:3:"꓾";i:62;s:3:"ê˜";i:63;s:3:"꛵";i:64;s:3:"︑";i:65;s:1:";";i:66;s:2:"Ø›";i:67;s:3:"â";i:68;s:3:"꛶";i:69;s:1:":";i:70;s:2:"Ö‰";i:71;s:2:"Øž";i:72;s:2:"܃";i:73;s:2:"Ü„";i:74;s:2:"Ü…";i:75;s:2:"܆";i:76;s:2:"܇";i:77;s:2:"܈";i:78;s:3:"à °";i:79;s:3:"à ±";i:80;s:3:"à ²";i:81;s:3:"à ³";i:82;s:3:"à ´";i:83;s:3:"à µ";i:84;s:3:"à ¶";i:85;s:3:"à ·";i:86;s:3:"à ¸";i:87;s:3:"à ¹";i:88;s:3:"à º";i:89;s:3:"à »";i:90;s:3:"à ¼";i:91;s:3:"à ½";i:92;s:3:"à ¾";i:93;s:3:"á¡";i:94;s:3:"á£";i:95;s:3:"á¤";i:96;s:3:"á¥";i:97;s:3:"á¦";i:98;s:3:"á „";i:99;s:3:"á …";i:100;s:3:"༔";i:101;s:3:"៖";i:102;s:3:"á­";i:103;s:3:"꧇";i:104;s:3:"᛫";i:105;s:3:"᛬";i:106;s:3:"á›­";i:107;s:3:"ê›´";i:108;s:1:"!";i:109;s:2:"¡";i:110;s:2:"Õœ";i:111;s:2:"ß¹";i:112;s:3:"᥄";i:113;s:1:"?";i:114;s:2:"¿";i:115;s:3:"⸮";i:116;s:2:"Õž";i:117;s:2:"ØŸ";i:118;s:2:"܉";i:119;s:3:"á§";i:120;s:3:"᥅";i:121;s:3:"⳺";i:122;s:3:"â³»";i:123;s:3:"ê˜";i:124;s:3:"ê›·";i:125;s:3:"‽";i:126;s:3:"⸘";i:127;s:1:".";i:128;s:3:"á ";i:129;s:2:"Û”";i:130;s:2:"Ü";i:131;s:2:"Ü‚";i:132;s:3:"á¢";i:133;s:3:"á ƒ";i:134;s:3:"á ‰";i:135;s:3:"á™®";i:136;s:3:"á­œ";i:137;s:3:"â³¹";i:138;s:3:"â³¾";i:139;s:3:"⸰";i:140;s:3:"ê“¿";i:141;s:3:"꘎";i:142;s:3:"꛳";i:143;s:3:"︒";i:144;s:2:"·";i:145;s:3:"⸱";i:146;s:3:"।";i:147;s:3:"॥";i:148;s:3:"꣎";i:149;s:3:"ê£";i:150;s:3:"á°»";i:151;s:3:"á°¼";i:152;s:3:"꡶";i:153;s:3:"ê¡·";i:154;s:3:"᜵";i:155;s:3:"᜶";i:156;s:3:"꤯";i:157;s:3:"áŠ";i:158;s:3:"á‹";i:159;s:3:"។";i:160;s:3:"៕";i:161;s:3:"᪨";i:162;s:3:"᪩";i:163;s:3:"᪪";i:164;s:3:"᪫";i:165;s:3:"á­ž";i:166;s:3:"á­Ÿ";i:167;s:3:"꧈";i:168;s:3:"꧉";i:169;s:3:"ê©";i:170;s:3:"ê©ž";i:171;s:3:"ê©Ÿ";i:172;s:3:"꯫";i:173;s:4:"ð©–";i:174;s:4:"ð©—";i:175;s:4:"ð‘‡";i:176;s:4:"ð‘ˆ";i:177;s:4:"𑃀";i:178;s:4:"ð‘ƒ";i:179;s:3:"á±¾";i:180;s:3:"᱿";i:181;s:2:"Ü€";i:182;s:2:"ß·";i:183;s:3:"჻";i:184;s:3:"á ";i:185;s:3:"á¨";i:186;s:3:"᨞";i:187;s:3:"᨟";i:188;s:3:"á­š";i:189;s:3:"á­›";i:190;s:3:"ê§";i:191;s:3:"꧂";i:192;s:3:"꧃";i:193;s:3:"꧄";i:194;s:3:"꧅";i:195;s:3:"꧆";i:196;s:3:"꧊";i:197;s:3:"꧋";i:198;s:3:"꧌";i:199;s:3:"ê§";i:200;s:3:"꛲";i:201;s:3:"꥟";i:202;s:4:"ð¡—";i:203;s:4:"ð¬º";i:204;s:4:"ð¬»";i:205;s:4:"ð¬¼";i:206;s:4:"ð¬½";i:207;s:4:"ð¬¾";i:208;s:4:"ð¬¿";i:209;s:4:"ð‘‚¾";i:210;s:4:"ð‘‚¿";i:211;s:3:"â•";i:212;s:3:"â–";i:213;s:3:"â˜";i:214;s:3:"â™";i:215;s:3:"âš";i:216;s:3:"â›";i:217;s:3:"âœ";i:218;s:3:"â";i:219;s:3:"âž";i:220;s:3:"⸪";i:221;s:3:"⸫";i:222;s:3:"⸬";i:223;s:3:"⸭";i:224;s:3:"â³¼";i:225;s:3:"⳿";i:226;s:3:"⸙";i:227;s:4:"ð¤¿";i:228;s:4:"ð„€";i:229;s:4:"ð„";i:230;s:4:"ð„‚";i:231;s:4:"ðŽŸ";i:232;s:4:"ð";i:233;s:4:"ð¤Ÿ";i:234;s:4:"ð’‘°";i:235;s:4:"ð’‘±";i:236;s:4:"ð’‘²";i:237;s:4:"ð’‘³";i:238;s:1:"'";i:239;s:3:"‘";i:240;s:3:"’";i:241;s:3:"‚";i:242;s:3:"‛";i:243;s:3:"‹";i:244;s:3:"›";i:245;s:1:""";i:246;s:3:"“";i:247;s:3:"â€";i:248;s:3:"„";i:249;s:3:"‟";i:250;s:2:"«";i:251;s:2:"»";i:252;s:1:"(";i:253;s:1:")";i:254;s:1:"[";i:255;s:1:"]";i:256;s:1:"{";i:257;s:1:"}";i:258;s:3:"༺";i:259;s:3:"༻";i:260;s:3:"༼";i:261;s:3:"༽";i:262;s:3:"áš›";i:263;s:3:"ášœ";i:264;s:3:"â…";i:265;s:3:"â†";i:266;s:3:"⧼";i:267;s:3:"⧽";i:268;s:3:"⦃";i:269;s:3:"⦄";i:270;s:3:"⦅";i:271;s:3:"⦆";i:272;s:3:"⦇";i:273;s:3:"⦈";i:274;s:3:"⦉";i:275;s:3:"⦊";i:276;s:3:"⦋";i:277;s:3:"⦌";i:278;s:3:"â¦";i:279;s:3:"⦎";i:280;s:3:"â¦";i:281;s:3:"â¦";i:282;s:3:"⦑";i:283;s:3:"⦒";i:284;s:3:"⦓";i:285;s:3:"⦔";i:286;s:3:"⦕";i:287;s:3:"⦖";i:288;s:3:"⦗";i:289;s:3:"⦘";i:290;s:3:"⟬";i:291;s:3:"⟭";i:292;s:3:"⟮";i:293;s:3:"⟯";i:294;s:3:"⸂";i:295;s:3:"⸃";i:296;s:3:"⸄";i:297;s:3:"⸅";i:298;s:3:"⸉";i:299;s:3:"⸊";i:300;s:3:"⸌";i:301;s:3:"â¸";i:302;s:3:"⸜";i:303;s:3:"â¸";i:304;s:3:"⸠";i:305;s:3:"⸡";i:306;s:3:"⸢";i:307;s:3:"⸣";i:308;s:3:"⸤";i:309;s:3:"⸥";i:310;s:3:"⸦";i:311;s:3:"⸧";i:312;s:3:"⸨";i:313;s:3:"⸩";i:314;s:3:"〈";i:315;s:3:"〉";i:316;s:3:"ï½¢";i:317;s:3:"ï½£";i:318;s:3:"ï¹";i:319;s:3:"﹞";i:320;s:3:"︗";i:321;s:3:"︘";i:322;s:3:"ï´¾";i:323;s:3:"ï´¿";i:324;s:2:"§";i:325;s:2:"¶";i:326;s:3:"â‹";i:327;s:2:"©";i:328;s:2:"®";i:329;s:1:"@";i:330;s:1:"*";i:331;s:3:"âŽ";i:332;s:3:"â‘";i:333;s:2:"Ù­";i:334;s:3:"꙳";i:335;s:1:"/";i:336;s:3:"â„";i:337;s:1:"\";i:338;s:1:"&";i:339;s:3:"â…‹";i:340;s:3:"âŠ";i:341;s:1:"#";i:342;s:1:"%";i:343;s:2:"Ùª";i:344;s:3:"‰";i:345;s:2:"؉";i:346;s:3:"‱";i:347;s:2:"ØŠ";i:348;s:3:"â’";i:349;s:3:"†";i:350;s:3:"‡";i:351;s:3:"•";i:352;s:3:"‣";i:353;s:3:"‧";i:354;s:3:"âƒ";i:355;s:3:"âŒ";i:356;s:3:"â";i:357;s:3:"′";i:358;s:3:"‵";i:359;s:3:"‸";i:360;s:3:"※";i:361;s:3:"‿";i:362;s:3:"â”";i:363;s:3:"â€";i:364;s:3:"â";i:365;s:3:"â";i:366;s:3:"â‚";i:367;s:3:"⸀";i:368;s:3:"â¸";i:369;s:3:"⸆";i:370;s:3:"⸇";i:371;s:3:"⸈";i:372;s:3:"⸋";i:373;s:3:"⸎";i:374;s:3:"â¸";i:375;s:3:"â¸";i:376;s:3:"⸑";i:377;s:3:"⸒";i:378;s:3:"⸓";i:379;s:3:"⸔";i:380;s:3:"⸕";i:381;s:3:"⸖";i:382;s:3:"⸚";i:383;s:3:"⸛";i:384;s:3:"⸞";i:385;s:3:"⸟";i:386;s:3:"꙾";i:387;s:2:"Õš";i:388;s:2:"Õ›";i:389;s:2:"ÕŸ";i:390;s:2:"Ö¾";i:391;s:2:"×€";i:392;s:2:"׃";i:393;s:2:"׆";i:394;s:2:"׳";i:395;s:2:"×´";i:396;s:2:"ÜŠ";i:397;s:2:"Ü‹";i:398;s:2:"ÜŒ";i:399;s:2:"Ü";i:400;s:3:"à¡ž";i:401;s:3:"á €";i:402;s:3:"॰";i:403;s:3:"꣸";i:404;s:3:"꣹";i:405;s:3:"꣺";i:406;s:3:"à·´";i:407;s:3:"๚";i:408;s:3:"๛";i:409;s:3:"ê«ž";i:410;s:3:"ê«Ÿ";i:411;s:3:"༄";i:412;s:3:"༅";i:413;s:3:"༆";i:414;s:3:"༇";i:415;s:3:"༈";i:416;s:3:"༉";i:417;s:3:"༊";i:418;s:3:"à¿";i:419;s:3:"à¿‘";i:420;s:3:"་";i:421;s:3:"à¼";i:422;s:3:"༎";i:423;s:3:"à¼";i:424;s:3:"à¼";i:425;s:3:"༑";i:426;s:3:"༒";i:427;s:3:"྅";i:428;s:3:"à¿’";i:429;s:3:"à¿“";i:430;s:3:"à¿”";i:431;s:3:"à¿™";i:432;s:3:"à¿š";i:433;s:3:"á°½";i:434;s:3:"á°¾";i:435;s:3:"á°¿";i:436;s:3:"᥀";i:437;s:3:"áŒ";i:438;s:3:"á";i:439;s:3:"áŽ";i:440;s:3:"á";i:441;s:3:"á‚ž";i:442;s:3:"á‚Ÿ";i:443;s:3:"ê©·";i:444;s:3:"꩸";i:445;s:3:"꩹";i:446;s:3:"ៗ";i:447;s:3:"៘";i:448;s:3:"៙";i:449;s:3:"៚";i:450;s:3:"᪠";i:451;s:3:"᪡";i:452;s:3:"᪢";i:453;s:3:"᪣";i:454;s:3:"᪤";i:455;s:3:"᪥";i:456;s:3:"᪦";i:457;s:3:"᪬";i:458;s:3:"᪭";i:459;s:3:"á™­";i:460;s:3:"âµ°";i:461;s:3:"ê¡´";i:462;s:3:"꡵";i:463;s:3:"᯼";i:464;s:3:"᯽";i:465;s:3:"᯾";i:466;s:3:"᯿";i:467;s:3:"꤮";i:468;s:3:"꧞";i:469;s:3:"꧟";i:470;s:3:"ê©œ";i:471;s:4:"ð‘‰";i:472;s:4:"ð‘Š";i:473;s:4:"ð‘‹";i:474;s:4:"ð‘Œ";i:475;s:4:"ð‘";i:476;s:4:"ð©";i:477;s:4:"ð©‘";i:478;s:4:"ð©’";i:479;s:4:"ð©“";i:480;s:4:"ð©”";i:481;s:4:"ð©•";i:482;s:4:"ð©˜";i:483;s:4:"ð¬¹";i:484;s:4:"ð‘‚»";i:485;s:4:"ð‘‚¼";i:486;s:2:"ʹ";i:487;s:2:"͵";i:488;s:2:"ʺ";i:489;s:2:"Ë‚";i:490;s:2:"˃";i:491;s:2:"Ë„";i:492;s:2:"Ë…";i:493;s:2:"ˆ";i:494;s:2:"ˇ";i:495;s:2:"ˈ";i:496;s:2:"ˉ";i:497;s:2:"ËŠ";i:498;s:2:"Ë‹";i:499;s:2:"ËŒ";i:500;s:2:"Ë";i:501;s:2:"ËŽ";i:502;s:2:"Ë";i:503;s:2:"Ë’";i:504;s:2:"Ë“";i:505;s:2:"Ë”";i:506;s:2:"Ë•";i:507;s:2:"Ë–";i:508;s:2:"Ë—";i:509;s:2:"Ëž";i:510;s:2:"ËŸ";i:511;s:2:"Ë¥";i:512;s:2:"˦";i:513;s:2:"˧";i:514;s:2:"˨";i:515;s:2:"Ë©";i:516;s:2:"˪";i:517;s:2:"Ë«";i:518;s:2:"ˬ";i:519;s:2:"Ë­";i:520;s:2:"˯";i:521;s:2:"Ë°";i:522;s:2:"˱";i:523;s:2:"˲";i:524;s:2:"˳";i:525;s:2:"Ë´";i:526;s:2:"˵";i:527;s:2:"˶";i:528;s:2:"Ë·";i:529;s:2:"˸";i:530;s:2:"˹";i:531;s:2:"˺";i:532;s:2:"Ë»";i:533;s:2:"˼";i:534;s:2:"˽";i:535;s:2:"˾";i:536;s:2:"Ë¿";i:537;s:3:"áŽ";i:538;s:3:"᎑";i:539;s:3:"᎒";i:540;s:3:"᎓";i:541;s:3:"᎔";i:542;s:3:"᎕";i:543;s:3:"᎖";i:544;s:3:"᎗";i:545;s:3:"᎘";i:546;s:3:"᎙";i:547;s:3:"꜀";i:548;s:3:"êœ";i:549;s:3:"꜂";i:550;s:3:"꜃";i:551;s:3:"꜄";i:552;s:3:"꜅";i:553;s:3:"꜆";i:554;s:3:"꜇";i:555;s:3:"꜈";i:556;s:3:"꜉";i:557;s:3:"꜊";i:558;s:3:"꜋";i:559;s:3:"꜌";i:560;s:3:"êœ";i:561;s:3:"꜎";i:562;s:3:"êœ";i:563;s:3:"êœ";i:564;s:3:"꜑";i:565;s:3:"꜒";i:566;s:3:"꜓";i:567;s:3:"꜔";i:568;s:3:"꜕";i:569;s:3:"꜖";i:570;s:3:"ꜗ";i:571;s:3:"ꜘ";i:572;s:3:"ꜙ";i:573;s:3:"ꜚ";i:574;s:3:"ꜛ";i:575;s:3:"ꜜ";i:576;s:3:"êœ";i:577;s:3:"ꜞ";i:578;s:3:"ꜟ";i:579;s:3:"꜠";i:580;s:3:"꜡";i:581;s:3:"ꞈ";i:582;s:3:"꞉";i:583;s:3:"꞊";i:584;s:2:"°";i:585;s:2:"Ò‚";i:586;s:2:"؈";i:587;s:2:"ØŽ";i:588;s:2:"Ø";i:589;s:2:"Ûž";i:590;s:2:"Û©";i:591;s:3:"ï·½";i:592;s:2:"߶";i:593;s:3:"৺";i:594;s:3:"à­°";i:595;s:3:"௳";i:596;s:3:"௴";i:597;s:3:"௵";i:598;s:3:"௶";i:599;s:3:"௷";i:600;s:3:"௸";i:601;s:3:"௺";i:602;s:3:"౿";i:603;s:3:"൹";i:604;s:3:"ê ¨";i:605;s:3:"ê ©";i:606;s:3:"ê ª";i:607;s:3:"ê «";i:608;s:3:"ê ¶";i:609;s:3:"ê ·";i:610;s:3:"ê ¹";i:611;s:3:"à¹";i:612;s:3:"à¼";i:613;s:3:"༂";i:614;s:3:"༃";i:615;s:3:"༓";i:616;s:3:"༕";i:617;s:3:"༖";i:618;s:3:"༗";i:619;s:3:"༚";i:620;s:3:"༛";i:621;s:3:"༜";i:622;s:3:"à¼";i:623;s:3:"༞";i:624;s:3:"༟";i:625;s:3:"༴";i:626;s:3:"༶";i:627;s:3:"༸";i:628;s:3:"྾";i:629;s:3:"྿";i:630;s:3:"à¿€";i:631;s:3:"à¿";i:632;s:3:"à¿‚";i:633;s:3:"࿃";i:634;s:3:"à¿„";i:635;s:3:"à¿…";i:636;s:3:"࿇";i:637;s:3:"࿈";i:638;s:3:"࿉";i:639;s:3:"à¿Š";i:640;s:3:"à¿‹";i:641;s:3:"à¿Œ";i:642;s:3:"à¿Ž";i:643;s:3:"à¿";i:644;s:3:"à¿•";i:645;s:3:"à¿–";i:646;s:3:"à¿—";i:647;s:3:"࿘";i:648;s:3:"᧠";i:649;s:3:"᧡";i:650;s:3:"᧢";i:651;s:3:"᧣";i:652;s:3:"᧤";i:653;s:3:"᧥";i:654;s:3:"᧦";i:655;s:3:"᧧";i:656;s:3:"᧨";i:657;s:3:"᧩";i:658;s:3:"᧪";i:659;s:3:"᧫";i:660;s:3:"᧬";i:661;s:3:"᧭";i:662;s:3:"᧮";i:663;s:3:"᧯";i:664;s:3:"᧰";i:665;s:3:"᧱";i:666;s:3:"᧲";i:667;s:3:"᧳";i:668;s:3:"᧴";i:669;s:3:"᧵";i:670;s:3:"᧶";i:671;s:3:"᧷";i:672;s:3:"᧸";i:673;s:3:"᧹";i:674;s:3:"᧺";i:675;s:3:"᧻";i:676;s:3:"᧼";i:677;s:3:"᧽";i:678;s:3:"᧾";i:679;s:3:"᧿";i:680;s:3:"á­¡";i:681;s:3:"á­¢";i:682;s:3:"á­£";i:683;s:3:"á­¤";i:684;s:3:"á­¥";i:685;s:3:"á­¦";i:686;s:3:"á­§";i:687;s:3:"á­¨";i:688;s:3:"á­©";i:689;s:3:"á­ª";i:690;s:3:"á­´";i:691;s:3:"á­µ";i:692;s:3:"á­¶";i:693;s:3:"á­·";i:694;s:3:"á­¸";i:695;s:3:"á­¹";i:696;s:3:"á­º";i:697;s:3:"á­»";i:698;s:3:"á­¼";i:699;s:3:"â„„";i:700;s:3:"℈";i:701;s:3:"â„”";i:702;s:3:"â„—";i:703;s:3:"℘";i:704;s:3:"â„ž";i:705;s:3:"â„Ÿ";i:706;s:3:"â„£";i:707;s:3:"â„¥";i:708;s:3:"℧";i:709;s:3:"â„©";i:710;s:3:"â„®";i:711;s:3:"℺";i:712;s:3:"â…";i:713;s:3:"â…‚";i:714;s:3:"â…ƒ";i:715;s:3:"â…„";i:716;s:3:"â…Š";i:717;s:3:"â…Œ";i:718;s:3:"â…";i:719;s:3:"â…";i:720;s:3:"â†";i:721;s:3:"→";i:722;s:3:"↑";i:723;s:3:"↓";i:724;s:3:"↔";i:725;s:3:"↕";i:726;s:3:"↖";i:727;s:3:"↗";i:728;s:3:"↘";i:729;s:3:"↙";i:730;s:3:"↜";i:731;s:3:"â†";i:732;s:3:"↞";i:733;s:3:"↟";i:734;s:3:"↠";i:735;s:3:"↡";i:736;s:3:"↢";i:737;s:3:"↣";i:738;s:3:"↤";i:739;s:3:"↥";i:740;s:3:"↦";i:741;s:3:"↧";i:742;s:3:"↨";i:743;s:3:"↩";i:744;s:3:"↪";i:745;s:3:"↫";i:746;s:3:"↬";i:747;s:3:"↭";i:748;s:3:"↯";i:749;s:3:"↰";i:750;s:3:"↱";i:751;s:3:"↲";i:752;s:3:"↳";i:753;s:3:"↴";i:754;s:3:"↵";i:755;s:3:"↶";i:756;s:3:"↷";i:757;s:3:"↸";i:758;s:3:"↹";i:759;s:3:"↺";i:760;s:3:"↻";i:761;s:3:"↼";i:762;s:3:"↽";i:763;s:3:"↾";i:764;s:3:"↿";i:765;s:3:"⇀";i:766;s:3:"â‡";i:767;s:3:"⇂";i:768;s:3:"⇃";i:769;s:3:"⇄";i:770;s:3:"⇅";i:771;s:3:"⇆";i:772;s:3:"⇇";i:773;s:3:"⇈";i:774;s:3:"⇉";i:775;s:3:"⇊";i:776;s:3:"⇋";i:777;s:3:"⇌";i:778;s:3:"â‡";i:779;s:3:"⇑";i:780;s:3:"⇒";i:781;s:3:"⇓";i:782;s:3:"⇔";i:783;s:3:"⇕";i:784;s:3:"⇖";i:785;s:3:"⇗";i:786;s:3:"⇘";i:787;s:3:"⇙";i:788;s:3:"⇚";i:789;s:3:"⇛";i:790;s:3:"⇜";i:791;s:3:"â‡";i:792;s:3:"⇞";i:793;s:3:"⇟";i:794;s:3:"⇠";i:795;s:3:"⇡";i:796;s:3:"⇢";i:797;s:3:"⇣";i:798;s:3:"⇤";i:799;s:3:"⇥";i:800;s:3:"⇦";i:801;s:3:"⇧";i:802;s:3:"⇨";i:803;s:3:"⇩";i:804;s:3:"⇪";i:805;s:3:"⇫";i:806;s:3:"⇬";i:807;s:3:"⇭";i:808;s:3:"⇮";i:809;s:3:"⇯";i:810;s:3:"⇰";i:811;s:3:"⇱";i:812;s:3:"⇲";i:813;s:3:"⇳";i:814;s:3:"⇴";i:815;s:3:"⇵";i:816;s:3:"⇶";i:817;s:3:"⇷";i:818;s:3:"⇸";i:819;s:3:"⇹";i:820;s:3:"⇺";i:821;s:3:"⇻";i:822;s:3:"⇼";i:823;s:3:"⇽";i:824;s:3:"⇾";i:825;s:3:"⇿";i:826;s:3:"∀";i:827;s:3:"âˆ";i:828;s:3:"∂";i:829;s:3:"∃";i:830;s:3:"∅";i:831;s:3:"∆";i:832;s:3:"∇";i:833;s:3:"∈";i:834;s:3:"∊";i:835;s:3:"∋";i:836;s:3:"âˆ";i:837;s:2:"϶";i:838;s:3:"∎";i:839;s:3:"âˆ";i:840;s:3:"âˆ";i:841;s:3:"∑";i:842;s:1:"+";i:843;s:2:"±";i:844;s:2:"÷";i:845;s:2:"×";i:846;s:1:"<";i:847;s:1:"=";i:848;s:1:">";i:849;s:2:"¬";i:850;s:1:"|";i:851;s:2:"¦";i:852;s:3:"‖";i:853;s:1:"~";i:854;s:3:"−";i:855;s:3:"∓";i:856;s:3:"∔";i:857;s:3:"∕";i:858;s:3:"∖";i:859;s:3:"∗";i:860;s:3:"∘";i:861;s:3:"∙";i:862;s:3:"√";i:863;s:3:"∛";i:864;s:2:"؆";i:865;s:3:"∜";i:866;s:2:"؇";i:867;s:3:"âˆ";i:868;s:3:"∞";i:869;s:3:"∟";i:870;s:3:"∠";i:871;s:3:"∡";i:872;s:3:"∢";i:873;s:3:"∣";i:874;s:3:"∥";i:875;s:3:"∧";i:876;s:3:"∨";i:877;s:3:"∩";i:878;s:3:"∪";i:879;s:3:"∫";i:880;s:3:"∮";i:881;s:3:"∱";i:882;s:3:"∲";i:883;s:3:"∳";i:884;s:3:"∴";i:885;s:3:"∵";i:886;s:3:"∶";i:887;s:3:"∷";i:888;s:3:"∸";i:889;s:3:"∹";i:890;s:3:"∺";i:891;s:3:"∻";i:892;s:3:"∼";i:893;s:3:"∽";i:894;s:3:"∾";i:895;s:3:"∿";i:896;s:3:"≀";i:897;s:3:"≂";i:898;s:3:"≃";i:899;s:3:"≅";i:900;s:3:"≆";i:901;s:3:"≈";i:902;s:3:"≊";i:903;s:3:"≋";i:904;s:3:"≌";i:905;s:3:"â‰";i:906;s:3:"≎";i:907;s:3:"â‰";i:908;s:3:"â‰";i:909;s:3:"≑";i:910;s:3:"≒";i:911;s:3:"≓";i:912;s:3:"≔";i:913;s:3:"≕";i:914;s:3:"≖";i:915;s:3:"≗";i:916;s:3:"≘";i:917;s:3:"≙";i:918;s:3:"≚";i:919;s:3:"≛";i:920;s:3:"≜";i:921;s:3:"â‰";i:922;s:3:"≞";i:923;s:3:"≟";i:924;s:3:"≡";i:925;s:3:"≣";i:926;s:3:"≤";i:927;s:3:"≥";i:928;s:3:"≦";i:929;s:3:"≧";i:930;s:3:"≨";i:931;s:3:"≩";i:932;s:3:"≪";i:933;s:3:"≫";i:934;s:3:"≬";i:935;s:3:"≲";i:936;s:3:"≳";i:937;s:3:"≶";i:938;s:3:"≷";i:939;s:3:"≺";i:940;s:3:"≻";i:941;s:3:"≼";i:942;s:3:"≽";i:943;s:3:"≾";i:944;s:3:"≿";i:945;s:3:"⊂";i:946;s:3:"⊃";i:947;s:3:"⊆";i:948;s:3:"⊇";i:949;s:3:"⊊";i:950;s:3:"⊋";i:951;s:3:"⊌";i:952;s:3:"âŠ";i:953;s:3:"⊎";i:954;s:3:"âŠ";i:955;s:3:"âŠ";i:956;s:3:"⊑";i:957;s:3:"⊒";i:958;s:3:"⊓";i:959;s:3:"⊔";i:960;s:3:"⊕";i:961;s:3:"⊖";i:962;s:3:"⊗";i:963;s:3:"⊘";i:964;s:3:"⊙";i:965;s:3:"⊚";i:966;s:3:"⊛";i:967;s:3:"⊜";i:968;s:3:"âŠ";i:969;s:3:"⊞";i:970;s:3:"⊟";i:971;s:3:"⊠";i:972;s:3:"⊡";i:973;s:3:"⊢";i:974;s:3:"⊣";i:975;s:3:"⊤";i:976;s:3:"⊥";i:977;s:3:"⊦";i:978;s:3:"⊧";i:979;s:3:"⊨";i:980;s:3:"⊩";i:981;s:3:"⊪";i:982;s:3:"⊫";i:983;s:3:"⊰";i:984;s:3:"⊱";i:985;s:3:"⊲";i:986;s:3:"⊳";i:987;s:3:"⊴";i:988;s:3:"⊵";i:989;s:3:"⊶";i:990;s:3:"⊷";i:991;s:3:"⊸";i:992;s:3:"⊹";i:993;s:3:"⊺";i:994;s:3:"⊻";i:995;s:3:"⊼";i:996;s:3:"⊽";i:997;s:3:"⊾";i:998;s:3:"⊿";i:999;s:3:"â‹€";i:1000;s:3:"â‹";i:1001;s:3:"â‹‚";i:1002;s:3:"⋃";i:1003;s:3:"â‹„";i:1004;s:3:"â‹…";i:1005;s:3:"⋆";i:1006;s:3:"⋇";i:1007;s:3:"⋈";i:1008;s:3:"⋉";i:1009;s:3:"â‹Š";i:1010;s:3:"â‹‹";i:1011;s:3:"â‹Œ";i:1012;s:3:"â‹";i:1013;s:3:"â‹Ž";i:1014;s:3:"â‹";i:1015;s:3:"â‹";i:1016;s:3:"â‹‘";i:1017;s:3:"â‹’";i:1018;s:3:"â‹“";i:1019;s:3:"â‹”";i:1020;s:3:"â‹•";i:1021;s:3:"â‹–";i:1022;s:3:"â‹—";i:1023;s:3:"⋘";i:1024;s:3:"â‹™";i:1025;s:3:"â‹š";i:1026;s:3:"â‹›";i:1027;s:3:"â‹œ";i:1028;s:3:"â‹";i:1029;s:3:"â‹ž";i:1030;s:3:"â‹Ÿ";i:1031;s:3:"⋤";i:1032;s:3:"â‹¥";i:1033;s:3:"⋦";i:1034;s:3:"⋧";i:1035;s:3:"⋨";i:1036;s:3:"â‹©";i:1037;s:3:"â‹®";i:1038;s:3:"⋯";i:1039;s:3:"â‹°";i:1040;s:3:"⋱";i:1041;s:3:"⋲";i:1042;s:3:"⋳";i:1043;s:3:"â‹´";i:1044;s:3:"⋵";i:1045;s:3:"⋶";i:1046;s:3:"â‹·";i:1047;s:3:"⋸";i:1048;s:3:"⋹";i:1049;s:3:"⋺";i:1050;s:3:"â‹»";i:1051;s:3:"⋼";i:1052;s:3:"⋽";i:1053;s:3:"⋾";i:1054;s:3:"â‹¿";i:1055;s:3:"⌀";i:1056;s:3:"âŒ";i:1057;s:3:"⌂";i:1058;s:3:"⌃";i:1059;s:3:"⌄";i:1060;s:3:"⌅";i:1061;s:3:"⌆";i:1062;s:3:"⌇";i:1063;s:3:"⌈";i:1064;s:3:"⌉";i:1065;s:3:"⌊";i:1066;s:3:"⌋";i:1067;s:3:"⌌";i:1068;s:3:"âŒ";i:1069;s:3:"⌎";i:1070;s:3:"âŒ";i:1071;s:3:"âŒ";i:1072;s:3:"⌑";i:1073;s:3:"⌒";i:1074;s:3:"⌓";i:1075;s:3:"⌔";i:1076;s:3:"⌕";i:1077;s:3:"⌖";i:1078;s:3:"⌗";i:1079;s:3:"⌘";i:1080;s:3:"⌙";i:1081;s:3:"⌚";i:1082;s:3:"⌛";i:1083;s:3:"⌜";i:1084;s:3:"âŒ";i:1085;s:3:"⌞";i:1086;s:3:"⌟";i:1087;s:3:"⌠";i:1088;s:3:"⌡";i:1089;s:3:"⌢";i:1090;s:3:"⌣";i:1091;s:3:"⌤";i:1092;s:3:"⌥";i:1093;s:3:"⌦";i:1094;s:3:"⌧";i:1095;s:3:"⌨";i:1096;s:3:"⌫";i:1097;s:3:"⌬";i:1098;s:3:"⌭";i:1099;s:3:"⌮";i:1100;s:3:"⌯";i:1101;s:3:"⌰";i:1102;s:3:"⌱";i:1103;s:3:"⌲";i:1104;s:3:"⌳";i:1105;s:3:"⌴";i:1106;s:3:"⌵";i:1107;s:3:"⌶";i:1108;s:3:"⌷";i:1109;s:3:"⌸";i:1110;s:3:"⌹";i:1111;s:3:"⌺";i:1112;s:3:"⌻";i:1113;s:3:"⌼";i:1114;s:3:"⌽";i:1115;s:3:"⌾";i:1116;s:3:"⌿";i:1117;s:3:"â€";i:1118;s:3:"â";i:1119;s:3:"â‚";i:1120;s:3:"âƒ";i:1121;s:3:"â„";i:1122;s:3:"â…";i:1123;s:3:"â†";i:1124;s:3:"â‡";i:1125;s:3:"âˆ";i:1126;s:3:"â‰";i:1127;s:3:"âŠ";i:1128;s:3:"â‹";i:1129;s:3:"âŒ";i:1130;s:3:"â";i:1131;s:3:"âŽ";i:1132;s:3:"â";i:1133;s:3:"â";i:1134;s:3:"â‘";i:1135;s:3:"â’";i:1136;s:3:"â“";i:1137;s:3:"â”";i:1138;s:3:"â•";i:1139;s:3:"â–";i:1140;s:3:"â—";i:1141;s:3:"â˜";i:1142;s:3:"â™";i:1143;s:3:"âš";i:1144;s:3:"â›";i:1145;s:3:"âœ";i:1146;s:3:"â";i:1147;s:3:"âž";i:1148;s:3:"âŸ";i:1149;s:3:"â ";i:1150;s:3:"â¡";i:1151;s:3:"â¢";i:1152;s:3:"â£";i:1153;s:3:"â¤";i:1154;s:3:"â¥";i:1155;s:3:"â¦";i:1156;s:3:"â§";i:1157;s:3:"â¨";i:1158;s:3:"â©";i:1159;s:3:"âª";i:1160;s:3:"â«";i:1161;s:3:"â¬";i:1162;s:3:"â­";i:1163;s:3:"â®";i:1164;s:3:"â¯";i:1165;s:3:"â°";i:1166;s:3:"â±";i:1167;s:3:"â²";i:1168;s:3:"â³";i:1169;s:3:"â´";i:1170;s:3:"âµ";i:1171;s:3:"â¶";i:1172;s:3:"â·";i:1173;s:3:"â¸";i:1174;s:3:"â¹";i:1175;s:3:"âº";i:1176;s:3:"â»";i:1177;s:3:"â¼";i:1178;s:3:"â½";i:1179;s:3:"â¾";i:1180;s:3:"â¿";i:1181;s:3:"⎀";i:1182;s:3:"âŽ";i:1183;s:3:"⎂";i:1184;s:3:"⎃";i:1185;s:3:"⎄";i:1186;s:3:"⎅";i:1187;s:3:"⎆";i:1188;s:3:"⎇";i:1189;s:3:"⎈";i:1190;s:3:"⎉";i:1191;s:3:"⎊";i:1192;s:3:"⎋";i:1193;s:3:"⎌";i:1194;s:3:"âŽ";i:1195;s:3:"⎎";i:1196;s:3:"âŽ";i:1197;s:3:"âŽ";i:1198;s:3:"⎑";i:1199;s:3:"⎒";i:1200;s:3:"⎓";i:1201;s:3:"⎔";i:1202;s:3:"⎕";i:1203;s:3:"⎖";i:1204;s:3:"⎗";i:1205;s:3:"⎘";i:1206;s:3:"⎙";i:1207;s:3:"⎚";i:1208;s:3:"⎛";i:1209;s:3:"⎜";i:1210;s:3:"âŽ";i:1211;s:3:"⎞";i:1212;s:3:"⎟";i:1213;s:3:"⎠";i:1214;s:3:"⎡";i:1215;s:3:"⎢";i:1216;s:3:"⎣";i:1217;s:3:"⎤";i:1218;s:3:"⎥";i:1219;s:3:"⎦";i:1220;s:3:"⎧";i:1221;s:3:"⎨";i:1222;s:3:"⎩";i:1223;s:3:"⎪";i:1224;s:3:"⎫";i:1225;s:3:"⎬";i:1226;s:3:"⎭";i:1227;s:3:"⎮";i:1228;s:3:"⎯";i:1229;s:3:"⎰";i:1230;s:3:"⎱";i:1231;s:3:"⎲";i:1232;s:3:"⎳";i:1233;s:3:"⎴";i:1234;s:3:"⎵";i:1235;s:3:"⎶";i:1236;s:3:"⎷";i:1237;s:3:"⎸";i:1238;s:3:"⎹";i:1239;s:3:"⎺";i:1240;s:3:"⎻";i:1241;s:3:"⎼";i:1242;s:3:"⎽";i:1243;s:3:"⎾";i:1244;s:3:"⎿";i:1245;s:3:"â€";i:1246;s:3:"â";i:1247;s:3:"â‚";i:1248;s:3:"âƒ";i:1249;s:3:"â„";i:1250;s:3:"â…";i:1251;s:3:"â†";i:1252;s:3:"â‡";i:1253;s:3:"âˆ";i:1254;s:3:"â‰";i:1255;s:3:"âŠ";i:1256;s:3:"â‹";i:1257;s:3:"âŒ";i:1258;s:3:"â";i:1259;s:3:"âŽ";i:1260;s:3:"â";i:1261;s:3:"â";i:1262;s:3:"â‘";i:1263;s:3:"â’";i:1264;s:3:"â“";i:1265;s:3:"â”";i:1266;s:3:"â•";i:1267;s:3:"â–";i:1268;s:3:"â—";i:1269;s:3:"â˜";i:1270;s:3:"â™";i:1271;s:3:"âš";i:1272;s:3:"â›";i:1273;s:3:"âœ";i:1274;s:3:"â";i:1275;s:3:"âž";i:1276;s:3:"âŸ";i:1277;s:3:"â ";i:1278;s:3:"â¡";i:1279;s:3:"â¢";i:1280;s:3:"â£";i:1281;s:3:"â¤";i:1282;s:3:"â¥";i:1283;s:3:"â¦";i:1284;s:3:"â§";i:1285;s:3:"â¨";i:1286;s:3:"â©";i:1287;s:3:"âª";i:1288;s:3:"â«";i:1289;s:3:"â¬";i:1290;s:3:"â­";i:1291;s:3:"â®";i:1292;s:3:"â¯";i:1293;s:3:"â°";i:1294;s:3:"â±";i:1295;s:3:"â²";i:1296;s:3:"â³";i:1297;s:3:"â€";i:1298;s:3:"â";i:1299;s:3:"â‚";i:1300;s:3:"âƒ";i:1301;s:3:"â„";i:1302;s:3:"â…";i:1303;s:3:"â†";i:1304;s:3:"â‡";i:1305;s:3:"âˆ";i:1306;s:3:"â‰";i:1307;s:3:"âŠ";i:1308;s:3:"â‹";i:1309;s:3:"âŒ";i:1310;s:3:"â";i:1311;s:3:"âŽ";i:1312;s:3:"â";i:1313;s:3:"â";i:1314;s:3:"â‘";i:1315;s:3:"â’";i:1316;s:3:"â“";i:1317;s:3:"â”";i:1318;s:3:"â•";i:1319;s:3:"â–";i:1320;s:3:"â—";i:1321;s:3:"â˜";i:1322;s:3:"â™";i:1323;s:3:"âš";i:1324;s:3:"â›";i:1325;s:3:"âœ";i:1326;s:3:"â";i:1327;s:3:"âž";i:1328;s:3:"âŸ";i:1329;s:3:"â ";i:1330;s:3:"â¡";i:1331;s:3:"â¢";i:1332;s:3:"â£";i:1333;s:3:"â¤";i:1334;s:3:"â¥";i:1335;s:3:"â¦";i:1336;s:3:"â‘€";i:1337;s:3:"â‘";i:1338;s:3:"â‘‚";i:1339;s:3:"⑃";i:1340;s:3:"â‘„";i:1341;s:3:"â‘…";i:1342;s:3:"⑆";i:1343;s:3:"⑇";i:1344;s:3:"⑈";i:1345;s:3:"⑉";i:1346;s:3:"â‘Š";i:1347;s:3:"─";i:1348;s:3:"â”";i:1349;s:3:"│";i:1350;s:3:"┃";i:1351;s:3:"┄";i:1352;s:3:"â”…";i:1353;s:3:"┆";i:1354;s:3:"┇";i:1355;s:3:"┈";i:1356;s:3:"┉";i:1357;s:3:"┊";i:1358;s:3:"┋";i:1359;s:3:"┌";i:1360;s:3:"â”";i:1361;s:3:"┎";i:1362;s:3:"â”";i:1363;s:3:"â”";i:1364;s:3:"┑";i:1365;s:3:"â”’";i:1366;s:3:"┓";i:1367;s:3:"â””";i:1368;s:3:"┕";i:1369;s:3:"â”–";i:1370;s:3:"â”—";i:1371;s:3:"┘";i:1372;s:3:"â”™";i:1373;s:3:"┚";i:1374;s:3:"â”›";i:1375;s:3:"├";i:1376;s:3:"â”";i:1377;s:3:"┞";i:1378;s:3:"┟";i:1379;s:3:"â” ";i:1380;s:3:"┡";i:1381;s:3:"┢";i:1382;s:3:"┣";i:1383;s:3:"┤";i:1384;s:3:"┥";i:1385;s:3:"┦";i:1386;s:3:"┧";i:1387;s:3:"┨";i:1388;s:3:"┩";i:1389;s:3:"┪";i:1390;s:3:"┫";i:1391;s:3:"┬";i:1392;s:3:"â”­";i:1393;s:3:"â”®";i:1394;s:3:"┯";i:1395;s:3:"â”°";i:1396;s:3:"â”±";i:1397;s:3:"┲";i:1398;s:3:"┳";i:1399;s:3:"â”´";i:1400;s:3:"┵";i:1401;s:3:"┶";i:1402;s:3:"â”·";i:1403;s:3:"┸";i:1404;s:3:"┹";i:1405;s:3:"┺";i:1406;s:3:"â”»";i:1407;s:3:"┼";i:1408;s:3:"┽";i:1409;s:3:"┾";i:1410;s:3:"┿";i:1411;s:3:"â•€";i:1412;s:3:"â•";i:1413;s:3:"â•‚";i:1414;s:3:"╃";i:1415;s:3:"â•„";i:1416;s:3:"â•…";i:1417;s:3:"╆";i:1418;s:3:"╇";i:1419;s:3:"╈";i:1420;s:3:"╉";i:1421;s:3:"â•Š";i:1422;s:3:"â•‹";i:1423;s:3:"â•Œ";i:1424;s:3:"â•";i:1425;s:3:"â•Ž";i:1426;s:3:"â•";i:1427;s:3:"â•";i:1428;s:3:"â•‘";i:1429;s:3:"â•’";i:1430;s:3:"â•“";i:1431;s:3:"â•”";i:1432;s:3:"â••";i:1433;s:3:"â•–";i:1434;s:3:"â•—";i:1435;s:3:"╘";i:1436;s:3:"â•™";i:1437;s:3:"â•š";i:1438;s:3:"â•›";i:1439;s:3:"â•œ";i:1440;s:3:"â•";i:1441;s:3:"â•ž";i:1442;s:3:"â•Ÿ";i:1443;s:3:"â• ";i:1444;s:3:"â•¡";i:1445;s:3:"â•¢";i:1446;s:3:"â•£";i:1447;s:3:"╤";i:1448;s:3:"â•¥";i:1449;s:3:"╦";i:1450;s:3:"╧";i:1451;s:3:"╨";i:1452;s:3:"â•©";i:1453;s:3:"╪";i:1454;s:3:"â•«";i:1455;s:3:"╬";i:1456;s:3:"â•­";i:1457;s:3:"â•®";i:1458;s:3:"╯";i:1459;s:3:"â•°";i:1460;s:3:"╱";i:1461;s:3:"╲";i:1462;s:3:"╳";i:1463;s:3:"â•´";i:1464;s:3:"╵";i:1465;s:3:"╶";i:1466;s:3:"â•·";i:1467;s:3:"╸";i:1468;s:3:"╹";i:1469;s:3:"╺";i:1470;s:3:"â•»";i:1471;s:3:"╼";i:1472;s:3:"╽";i:1473;s:3:"╾";i:1474;s:3:"â•¿";i:1475;s:3:"â–€";i:1476;s:3:"â–";i:1477;s:3:"â–‚";i:1478;s:3:"â–ƒ";i:1479;s:3:"â–„";i:1480;s:3:"â–…";i:1481;s:3:"â–†";i:1482;s:3:"â–‡";i:1483;s:3:"â–ˆ";i:1484;s:3:"â–‰";i:1485;s:3:"â–Š";i:1486;s:3:"â–‹";i:1487;s:3:"â–Œ";i:1488;s:3:"â–";i:1489;s:3:"â–Ž";i:1490;s:3:"â–";i:1491;s:3:"â–";i:1492;s:3:"â–‘";i:1493;s:3:"â–’";i:1494;s:3:"â–“";i:1495;s:3:"â–”";i:1496;s:3:"â–•";i:1497;s:3:"â––";i:1498;s:3:"â–—";i:1499;s:3:"â–˜";i:1500;s:3:"â–™";i:1501;s:3:"â–š";i:1502;s:3:"â–›";i:1503;s:3:"â–œ";i:1504;s:3:"â–";i:1505;s:3:"â–ž";i:1506;s:3:"â–Ÿ";i:1507;s:3:"â– ";i:1508;s:3:"â–¡";i:1509;s:3:"â–¢";i:1510;s:3:"â–£";i:1511;s:3:"â–¤";i:1512;s:3:"â–¥";i:1513;s:3:"â–¦";i:1514;s:3:"â–§";i:1515;s:3:"â–¨";i:1516;s:3:"â–©";i:1517;s:3:"â–ª";i:1518;s:3:"â–«";i:1519;s:3:"â–¬";i:1520;s:3:"â–­";i:1521;s:3:"â–®";i:1522;s:3:"â–¯";i:1523;s:3:"â–°";i:1524;s:3:"â–±";i:1525;s:3:"â–²";i:1526;s:3:"â–³";i:1527;s:3:"â–´";i:1528;s:3:"â–µ";i:1529;s:3:"â–¶";i:1530;s:3:"â–·";i:1531;s:3:"â–¸";i:1532;s:3:"â–¹";i:1533;s:3:"â–º";i:1534;s:3:"â–»";i:1535;s:3:"â–¼";i:1536;s:3:"â–½";i:1537;s:3:"â–¾";i:1538;s:3:"â–¿";i:1539;s:3:"â—€";i:1540;s:3:"â—";i:1541;s:3:"â—‚";i:1542;s:3:"â—ƒ";i:1543;s:3:"â—„";i:1544;s:3:"â—…";i:1545;s:3:"â—†";i:1546;s:3:"â—‡";i:1547;s:3:"â—ˆ";i:1548;s:3:"â—‰";i:1549;s:3:"â—Š";i:1550;s:3:"â—‹";i:1551;s:3:"â—Œ";i:1552;s:3:"â—";i:1553;s:3:"â—Ž";i:1554;s:3:"â—";i:1555;s:3:"â—";i:1556;s:3:"â—‘";i:1557;s:3:"â—’";i:1558;s:3:"â—“";i:1559;s:3:"â—”";i:1560;s:3:"â—•";i:1561;s:3:"â—–";i:1562;s:3:"â——";i:1563;s:3:"â—˜";i:1564;s:3:"â—™";i:1565;s:3:"â—š";i:1566;s:3:"â—›";i:1567;s:3:"â—œ";i:1568;s:3:"â—";i:1569;s:3:"â—ž";i:1570;s:3:"â—Ÿ";i:1571;s:3:"â— ";i:1572;s:3:"â—¡";i:1573;s:3:"â—¢";i:1574;s:3:"â—£";i:1575;s:3:"â—¤";i:1576;s:3:"â—¥";i:1577;s:3:"â—¦";i:1578;s:3:"â—§";i:1579;s:3:"â—¨";i:1580;s:3:"â—©";i:1581;s:3:"â—ª";i:1582;s:3:"â—«";i:1583;s:3:"â—¬";i:1584;s:3:"â—­";i:1585;s:3:"â—®";i:1586;s:3:"â—¯";i:1587;s:3:"â—°";i:1588;s:3:"â—±";i:1589;s:3:"â—²";i:1590;s:3:"â—³";i:1591;s:3:"â—´";i:1592;s:3:"â—µ";i:1593;s:3:"â—¶";i:1594;s:3:"â—·";i:1595;s:3:"â—¸";i:1596;s:3:"â—¹";i:1597;s:3:"â—º";i:1598;s:3:"â—»";i:1599;s:3:"â—¼";i:1600;s:3:"â—½";i:1601;s:3:"â—¾";i:1602;s:3:"â—¿";i:1603;s:3:"☀";i:1604;s:3:"â˜";i:1605;s:3:"☂";i:1606;s:3:"☃";i:1607;s:3:"☄";i:1608;s:3:"★";i:1609;s:3:"☆";i:1610;s:3:"☇";i:1611;s:3:"☈";i:1612;s:3:"☉";i:1613;s:3:"☊";i:1614;s:3:"☋";i:1615;s:3:"☌";i:1616;s:3:"â˜";i:1617;s:3:"☎";i:1618;s:3:"â˜";i:1619;s:3:"â˜";i:1620;s:3:"☑";i:1621;s:3:"☒";i:1622;s:3:"☓";i:1623;s:3:"☔";i:1624;s:3:"☕";i:1625;s:3:"☖";i:1626;s:3:"☗";i:1627;s:3:"☘";i:1628;s:3:"☙";i:1629;s:3:"☚";i:1630;s:3:"☛";i:1631;s:3:"☜";i:1632;s:3:"â˜";i:1633;s:3:"☞";i:1634;s:3:"☟";i:1635;s:3:"☠";i:1636;s:3:"☡";i:1637;s:3:"☢";i:1638;s:3:"☣";i:1639;s:3:"☤";i:1640;s:3:"☥";i:1641;s:3:"☦";i:1642;s:3:"☧";i:1643;s:3:"☨";i:1644;s:3:"☩";i:1645;s:3:"☪";i:1646;s:3:"☫";i:1647;s:3:"☬";i:1648;s:3:"☭";i:1649;s:3:"☮";i:1650;s:3:"☯";i:1651;s:3:"☸";i:1652;s:3:"☹";i:1653;s:3:"☺";i:1654;s:3:"☻";i:1655;s:3:"☼";i:1656;s:3:"☽";i:1657;s:3:"☾";i:1658;s:3:"☿";i:1659;s:3:"♀";i:1660;s:3:"â™";i:1661;s:3:"♂";i:1662;s:3:"♃";i:1663;s:3:"♄";i:1664;s:3:"â™…";i:1665;s:3:"♆";i:1666;s:3:"♇";i:1667;s:3:"♈";i:1668;s:3:"♉";i:1669;s:3:"♊";i:1670;s:3:"♋";i:1671;s:3:"♌";i:1672;s:3:"â™";i:1673;s:3:"♎";i:1674;s:3:"â™";i:1675;s:3:"â™";i:1676;s:3:"♑";i:1677;s:3:"â™’";i:1678;s:3:"♓";i:1679;s:3:"â™”";i:1680;s:3:"♕";i:1681;s:3:"â™–";i:1682;s:3:"â™—";i:1683;s:3:"♘";i:1684;s:3:"â™™";i:1685;s:3:"♚";i:1686;s:3:"â™›";i:1687;s:3:"♜";i:1688;s:3:"â™";i:1689;s:3:"♞";i:1690;s:3:"♟";i:1691;s:3:"â™ ";i:1692;s:3:"♡";i:1693;s:3:"♢";i:1694;s:3:"♣";i:1695;s:3:"♤";i:1696;s:3:"♥";i:1697;s:3:"♦";i:1698;s:3:"♧";i:1699;s:3:"♨";i:1700;s:3:"♩";i:1701;s:3:"♪";i:1702;s:3:"♫";i:1703;s:3:"♬";i:1704;s:3:"â™°";i:1705;s:3:"â™±";i:1706;s:3:"♲";i:1707;s:3:"♳";i:1708;s:3:"â™´";i:1709;s:3:"♵";i:1710;s:3:"♶";i:1711;s:3:"â™·";i:1712;s:3:"♸";i:1713;s:3:"♹";i:1714;s:3:"♺";i:1715;s:3:"â™»";i:1716;s:3:"♼";i:1717;s:3:"♽";i:1718;s:3:"♾";i:1719;s:3:"♿";i:1720;s:3:"⚀";i:1721;s:3:"âš";i:1722;s:3:"âš‚";i:1723;s:3:"⚃";i:1724;s:3:"âš„";i:1725;s:3:"âš…";i:1726;s:3:"⚆";i:1727;s:3:"⚇";i:1728;s:3:"⚈";i:1729;s:3:"⚉";i:1730;s:3:"âš";i:1731;s:3:"âš‘";i:1732;s:3:"âš’";i:1733;s:3:"âš“";i:1734;s:3:"âš”";i:1735;s:3:"âš•";i:1736;s:3:"âš–";i:1737;s:3:"âš—";i:1738;s:3:"⚘";i:1739;s:3:"âš™";i:1740;s:3:"âšš";i:1741;s:3:"âš›";i:1742;s:3:"âšœ";i:1743;s:3:"âš";i:1744;s:3:"âšž";i:1745;s:3:"⚟";i:1746;s:3:"âš ";i:1747;s:3:"âš¡";i:1748;s:3:"⚢";i:1749;s:3:"⚣";i:1750;s:3:"⚤";i:1751;s:3:"⚥";i:1752;s:3:"⚦";i:1753;s:3:"⚧";i:1754;s:3:"⚨";i:1755;s:3:"âš©";i:1756;s:3:"⚪";i:1757;s:3:"âš«";i:1758;s:3:"⚬";i:1759;s:3:"âš­";i:1760;s:3:"âš®";i:1761;s:3:"⚯";i:1762;s:3:"âš°";i:1763;s:3:"âš±";i:1764;s:3:"âš²";i:1765;s:3:"âš³";i:1766;s:3:"âš´";i:1767;s:3:"âšµ";i:1768;s:3:"⚶";i:1769;s:3:"âš·";i:1770;s:3:"⚸";i:1771;s:3:"âš¹";i:1772;s:3:"⚺";i:1773;s:3:"âš»";i:1774;s:3:"âš¼";i:1775;s:3:"âš½";i:1776;s:3:"âš¾";i:1777;s:3:"âš¿";i:1778;s:3:"⛀";i:1779;s:3:"â›";i:1780;s:3:"⛂";i:1781;s:3:"⛃";i:1782;s:3:"⛄";i:1783;s:3:"â›…";i:1784;s:3:"⛆";i:1785;s:3:"⛇";i:1786;s:3:"⛈";i:1787;s:3:"⛉";i:1788;s:3:"⛊";i:1789;s:3:"⛋";i:1790;s:3:"⛌";i:1791;s:3:"â›";i:1792;s:3:"⛎";i:1793;s:3:"â›";i:1794;s:3:"â›";i:1795;s:3:"⛑";i:1796;s:3:"â›’";i:1797;s:3:"⛓";i:1798;s:3:"â›”";i:1799;s:3:"⛕";i:1800;s:3:"â›–";i:1801;s:3:"â›—";i:1802;s:3:"⛘";i:1803;s:3:"â›™";i:1804;s:3:"⛚";i:1805;s:3:"â››";i:1806;s:3:"⛜";i:1807;s:3:"â›";i:1808;s:3:"⛞";i:1809;s:3:"⛟";i:1810;s:3:"â› ";i:1811;s:3:"⛡";i:1812;s:3:"⛢";i:1813;s:3:"⛣";i:1814;s:3:"⛤";i:1815;s:3:"⛥";i:1816;s:3:"⛦";i:1817;s:3:"⛧";i:1818;s:3:"⛨";i:1819;s:3:"⛩";i:1820;s:3:"⛪";i:1821;s:3:"⛫";i:1822;s:3:"⛬";i:1823;s:3:"â›­";i:1824;s:3:"â›®";i:1825;s:3:"⛯";i:1826;s:3:"â›°";i:1827;s:3:"â›±";i:1828;s:3:"⛲";i:1829;s:3:"⛳";i:1830;s:3:"â›´";i:1831;s:3:"⛵";i:1832;s:3:"⛶";i:1833;s:3:"â›·";i:1834;s:3:"⛸";i:1835;s:3:"⛹";i:1836;s:3:"⛺";i:1837;s:3:"â›»";i:1838;s:3:"⛼";i:1839;s:3:"⛽";i:1840;s:3:"⛾";i:1841;s:3:"⛿";i:1842;s:3:"âœ";i:1843;s:3:"✂";i:1844;s:3:"✃";i:1845;s:3:"✄";i:1846;s:3:"✅";i:1847;s:3:"✆";i:1848;s:3:"✇";i:1849;s:3:"✈";i:1850;s:3:"✉";i:1851;s:3:"✊";i:1852;s:3:"✋";i:1853;s:3:"✌";i:1854;s:3:"âœ";i:1855;s:3:"✎";i:1856;s:3:"âœ";i:1857;s:3:"âœ";i:1858;s:3:"✑";i:1859;s:3:"✒";i:1860;s:3:"✓";i:1861;s:3:"✔";i:1862;s:3:"✕";i:1863;s:3:"✖";i:1864;s:3:"✗";i:1865;s:3:"✘";i:1866;s:3:"✙";i:1867;s:3:"✚";i:1868;s:3:"✛";i:1869;s:3:"✜";i:1870;s:3:"âœ";i:1871;s:3:"✞";i:1872;s:3:"✟";i:1873;s:3:"✠";i:1874;s:3:"✡";i:1875;s:3:"✢";i:1876;s:3:"✣";i:1877;s:3:"✤";i:1878;s:3:"✥";i:1879;s:3:"✦";i:1880;s:3:"✧";i:1881;s:3:"✨";i:1882;s:3:"✩";i:1883;s:3:"✪";i:1884;s:3:"✫";i:1885;s:3:"✬";i:1886;s:3:"✭";i:1887;s:3:"✮";i:1888;s:3:"✯";i:1889;s:3:"✰";i:1890;s:3:"✱";i:1891;s:3:"✲";i:1892;s:3:"✳";i:1893;s:3:"✴";i:1894;s:3:"✵";i:1895;s:3:"✶";i:1896;s:3:"✷";i:1897;s:3:"✸";i:1898;s:3:"✹";i:1899;s:3:"✺";i:1900;s:3:"✻";i:1901;s:3:"✼";i:1902;s:3:"✽";i:1903;s:3:"✾";i:1904;s:3:"✿";i:1905;s:3:"â€";i:1906;s:3:"â";i:1907;s:3:"â‚";i:1908;s:3:"âƒ";i:1909;s:3:"â„";i:1910;s:3:"â…";i:1911;s:3:"â†";i:1912;s:3:"â‡";i:1913;s:3:"âˆ";i:1914;s:3:"â‰";i:1915;s:3:"âŠ";i:1916;s:3:"â‹";i:1917;s:3:"âŒ";i:1918;s:3:"â";i:1919;s:3:"âŽ";i:1920;s:3:"â";i:1921;s:3:"â";i:1922;s:3:"â‘";i:1923;s:3:"â’";i:1924;s:3:"â“";i:1925;s:3:"â”";i:1926;s:3:"â•";i:1927;s:3:"â–";i:1928;s:3:"â—";i:1929;s:3:"â˜";i:1930;s:3:"â™";i:1931;s:3:"âš";i:1932;s:3:"â›";i:1933;s:3:"âœ";i:1934;s:3:"â";i:1935;s:3:"âž";i:1936;s:3:"âŸ";i:1937;s:3:"â ";i:1938;s:3:"â¡";i:1939;s:3:"â¢";i:1940;s:3:"â£";i:1941;s:3:"â¤";i:1942;s:3:"â¥";i:1943;s:3:"â¦";i:1944;s:3:"â§";i:1945;s:3:"â¨";i:1946;s:3:"â©";i:1947;s:3:"âª";i:1948;s:3:"â«";i:1949;s:3:"â¬";i:1950;s:3:"â­";i:1951;s:3:"â®";i:1952;s:3:"â¯";i:1953;s:3:"â°";i:1954;s:3:"â±";i:1955;s:3:"â²";i:1956;s:3:"â³";i:1957;s:3:"â´";i:1958;s:3:"âµ";i:1959;s:3:"âž”";i:1960;s:3:"âž•";i:1961;s:3:"âž–";i:1962;s:3:"âž—";i:1963;s:3:"➘";i:1964;s:3:"âž™";i:1965;s:3:"âžš";i:1966;s:3:"âž›";i:1967;s:3:"âžœ";i:1968;s:3:"âž";i:1969;s:3:"âžž";i:1970;s:3:"➟";i:1971;s:3:"âž ";i:1972;s:3:"âž¡";i:1973;s:3:"➢";i:1974;s:3:"➣";i:1975;s:3:"➤";i:1976;s:3:"➥";i:1977;s:3:"➦";i:1978;s:3:"➧";i:1979;s:3:"➨";i:1980;s:3:"âž©";i:1981;s:3:"➪";i:1982;s:3:"âž«";i:1983;s:3:"➬";i:1984;s:3:"âž­";i:1985;s:3:"âž®";i:1986;s:3:"➯";i:1987;s:3:"âž°";i:1988;s:3:"âž±";i:1989;s:3:"âž²";i:1990;s:3:"âž³";i:1991;s:3:"âž´";i:1992;s:3:"âžµ";i:1993;s:3:"➶";i:1994;s:3:"âž·";i:1995;s:3:"➸";i:1996;s:3:"âž¹";i:1997;s:3:"➺";i:1998;s:3:"âž»";i:1999;s:3:"âž¼";i:2000;s:3:"âž½";i:2001;s:3:"âž¾";i:2002;s:3:"âž¿";i:2003;s:3:"⟀";i:2004;s:3:"âŸ";i:2005;s:3:"⟂";i:2006;s:3:"⟃";i:2007;s:3:"⟄";i:2008;s:3:"⟅";i:2009;s:3:"⟆";i:2010;s:3:"⟇";i:2011;s:3:"⟈";i:2012;s:3:"⟉";i:2013;s:3:"⟊";i:2014;s:3:"⟌";i:2015;s:3:"⟎";i:2016;s:3:"âŸ";i:2017;s:3:"âŸ";i:2018;s:3:"⟑";i:2019;s:3:"⟒";i:2020;s:3:"⟓";i:2021;s:3:"⟔";i:2022;s:3:"⟕";i:2023;s:3:"⟖";i:2024;s:3:"⟗";i:2025;s:3:"⟘";i:2026;s:3:"⟙";i:2027;s:3:"⟚";i:2028;s:3:"⟛";i:2029;s:3:"⟜";i:2030;s:3:"âŸ";i:2031;s:3:"⟞";i:2032;s:3:"⟟";i:2033;s:3:"⟠";i:2034;s:3:"⟡";i:2035;s:3:"⟢";i:2036;s:3:"⟣";i:2037;s:3:"⟤";i:2038;s:3:"⟥";i:2039;s:3:"⟦";i:2040;s:3:"⟧";i:2041;s:3:"⟨";i:2042;s:3:"⟩";i:2043;s:3:"⟪";i:2044;s:3:"⟫";i:2045;s:3:"⟰";i:2046;s:3:"⟱";i:2047;s:3:"⟲";i:2048;s:3:"⟳";i:2049;s:3:"⟴";i:2050;s:3:"⟵";i:2051;s:3:"⟶";i:2052;s:3:"⟷";i:2053;s:3:"⟸";i:2054;s:3:"⟹";i:2055;s:3:"⟺";i:2056;s:3:"⟻";i:2057;s:3:"⟼";i:2058;s:3:"⟽";i:2059;s:3:"⟾";i:2060;s:3:"⟿";i:2061;s:3:"⤀";i:2062;s:3:"â¤";i:2063;s:3:"⤂";i:2064;s:3:"⤃";i:2065;s:3:"⤄";i:2066;s:3:"⤅";i:2067;s:3:"⤆";i:2068;s:3:"⤇";i:2069;s:3:"⤈";i:2070;s:3:"⤉";i:2071;s:3:"⤊";i:2072;s:3:"⤋";i:2073;s:3:"⤌";i:2074;s:3:"â¤";i:2075;s:3:"⤎";i:2076;s:3:"â¤";i:2077;s:3:"â¤";i:2078;s:3:"⤑";i:2079;s:3:"⤒";i:2080;s:3:"⤓";i:2081;s:3:"⤔";i:2082;s:3:"⤕";i:2083;s:3:"⤖";i:2084;s:3:"⤗";i:2085;s:3:"⤘";i:2086;s:3:"⤙";i:2087;s:3:"⤚";i:2088;s:3:"⤛";i:2089;s:3:"⤜";i:2090;s:3:"â¤";i:2091;s:3:"⤞";i:2092;s:3:"⤟";i:2093;s:3:"⤠";i:2094;s:3:"⤡";i:2095;s:3:"⤢";i:2096;s:3:"⤣";i:2097;s:3:"⤤";i:2098;s:3:"⤥";i:2099;s:3:"⤦";i:2100;s:3:"⤧";i:2101;s:3:"⤨";i:2102;s:3:"⤩";i:2103;s:3:"⤪";i:2104;s:3:"⤫";i:2105;s:3:"⤬";i:2106;s:3:"⤭";i:2107;s:3:"⤮";i:2108;s:3:"⤯";i:2109;s:3:"⤰";i:2110;s:3:"⤱";i:2111;s:3:"⤲";i:2112;s:3:"⤳";i:2113;s:3:"⤴";i:2114;s:3:"⤵";i:2115;s:3:"⤶";i:2116;s:3:"⤷";i:2117;s:3:"⤸";i:2118;s:3:"⤹";i:2119;s:3:"⤺";i:2120;s:3:"⤻";i:2121;s:3:"⤼";i:2122;s:3:"⤽";i:2123;s:3:"⤾";i:2124;s:3:"⤿";i:2125;s:3:"⥀";i:2126;s:3:"â¥";i:2127;s:3:"⥂";i:2128;s:3:"⥃";i:2129;s:3:"⥄";i:2130;s:3:"⥅";i:2131;s:3:"⥆";i:2132;s:3:"⥇";i:2133;s:3:"⥈";i:2134;s:3:"⥉";i:2135;s:3:"⥊";i:2136;s:3:"⥋";i:2137;s:3:"⥌";i:2138;s:3:"â¥";i:2139;s:3:"⥎";i:2140;s:3:"â¥";i:2141;s:3:"â¥";i:2142;s:3:"⥑";i:2143;s:3:"⥒";i:2144;s:3:"⥓";i:2145;s:3:"⥔";i:2146;s:3:"⥕";i:2147;s:3:"⥖";i:2148;s:3:"⥗";i:2149;s:3:"⥘";i:2150;s:3:"⥙";i:2151;s:3:"⥚";i:2152;s:3:"⥛";i:2153;s:3:"⥜";i:2154;s:3:"â¥";i:2155;s:3:"⥞";i:2156;s:3:"⥟";i:2157;s:3:"⥠";i:2158;s:3:"⥡";i:2159;s:3:"⥢";i:2160;s:3:"⥣";i:2161;s:3:"⥤";i:2162;s:3:"⥥";i:2163;s:3:"⥦";i:2164;s:3:"⥧";i:2165;s:3:"⥨";i:2166;s:3:"⥩";i:2167;s:3:"⥪";i:2168;s:3:"⥫";i:2169;s:3:"⥬";i:2170;s:3:"⥭";i:2171;s:3:"⥮";i:2172;s:3:"⥯";i:2173;s:3:"⥰";i:2174;s:3:"⥱";i:2175;s:3:"⥲";i:2176;s:3:"⥳";i:2177;s:3:"⥴";i:2178;s:3:"⥵";i:2179;s:3:"⥶";i:2180;s:3:"⥷";i:2181;s:3:"⥸";i:2182;s:3:"⥹";i:2183;s:3:"⥺";i:2184;s:3:"⥻";i:2185;s:3:"⥼";i:2186;s:3:"⥽";i:2187;s:3:"⥾";i:2188;s:3:"⥿";i:2189;s:3:"⦀";i:2190;s:3:"â¦";i:2191;s:3:"⦂";i:2192;s:3:"⦙";i:2193;s:3:"⦚";i:2194;s:3:"⦛";i:2195;s:3:"⦜";i:2196;s:3:"â¦";i:2197;s:3:"⦞";i:2198;s:3:"⦟";i:2199;s:3:"⦠";i:2200;s:3:"⦡";i:2201;s:3:"⦢";i:2202;s:3:"⦣";i:2203;s:3:"⦤";i:2204;s:3:"⦥";i:2205;s:3:"⦦";i:2206;s:3:"⦧";i:2207;s:3:"⦨";i:2208;s:3:"⦩";i:2209;s:3:"⦪";i:2210;s:3:"⦫";i:2211;s:3:"⦬";i:2212;s:3:"⦭";i:2213;s:3:"⦮";i:2214;s:3:"⦯";i:2215;s:3:"⦰";i:2216;s:3:"⦱";i:2217;s:3:"⦲";i:2218;s:3:"⦳";i:2219;s:3:"⦴";i:2220;s:3:"⦵";i:2221;s:3:"⦶";i:2222;s:3:"⦷";i:2223;s:3:"⦸";i:2224;s:3:"⦹";i:2225;s:3:"⦺";i:2226;s:3:"⦻";i:2227;s:3:"⦼";i:2228;s:3:"⦽";i:2229;s:3:"⦾";i:2230;s:3:"⦿";i:2231;s:3:"⧀";i:2232;s:3:"â§";i:2233;s:3:"⧂";i:2234;s:3:"⧃";i:2235;s:3:"⧄";i:2236;s:3:"⧅";i:2237;s:3:"⧆";i:2238;s:3:"⧇";i:2239;s:3:"⧈";i:2240;s:3:"⧉";i:2241;s:3:"⧊";i:2242;s:3:"⧋";i:2243;s:3:"⧌";i:2244;s:3:"â§";i:2245;s:3:"⧎";i:2246;s:3:"â§";i:2247;s:3:"â§";i:2248;s:3:"⧑";i:2249;s:3:"⧒";i:2250;s:3:"⧓";i:2251;s:3:"⧔";i:2252;s:3:"⧕";i:2253;s:3:"⧖";i:2254;s:3:"⧗";i:2255;s:3:"⧘";i:2256;s:3:"⧙";i:2257;s:3:"⧚";i:2258;s:3:"⧛";i:2259;s:3:"⧜";i:2260;s:3:"â§";i:2261;s:3:"⧞";i:2262;s:3:"⧟";i:2263;s:3:"⧠";i:2264;s:3:"⧡";i:2265;s:3:"⧢";i:2266;s:3:"⧣";i:2267;s:3:"⧤";i:2268;s:3:"⧥";i:2269;s:3:"⧦";i:2270;s:3:"⧧";i:2271;s:3:"⧨";i:2272;s:3:"⧩";i:2273;s:3:"⧪";i:2274;s:3:"⧫";i:2275;s:3:"⧬";i:2276;s:3:"⧭";i:2277;s:3:"⧮";i:2278;s:3:"⧯";i:2279;s:3:"⧰";i:2280;s:3:"⧱";i:2281;s:3:"⧲";i:2282;s:3:"⧳";i:2283;s:3:"⧴";i:2284;s:3:"⧵";i:2285;s:3:"⧶";i:2286;s:3:"⧷";i:2287;s:3:"⧸";i:2288;s:3:"⧹";i:2289;s:3:"⧺";i:2290;s:3:"⧻";i:2291;s:3:"⧾";i:2292;s:3:"⧿";i:2293;s:3:"⨀";i:2294;s:3:"â¨";i:2295;s:3:"⨂";i:2296;s:3:"⨃";i:2297;s:3:"⨄";i:2298;s:3:"⨅";i:2299;s:3:"⨆";i:2300;s:3:"⨇";i:2301;s:3:"⨈";i:2302;s:3:"⨉";i:2303;s:3:"⨊";i:2304;s:3:"⨋";i:2305;s:3:"â¨";i:2306;s:3:"⨎";i:2307;s:3:"â¨";i:2308;s:3:"â¨";i:2309;s:3:"⨑";i:2310;s:3:"⨒";i:2311;s:3:"⨓";i:2312;s:3:"⨔";i:2313;s:3:"⨕";i:2314;s:3:"⨖";i:2315;s:3:"⨗";i:2316;s:3:"⨘";i:2317;s:3:"⨙";i:2318;s:3:"⨚";i:2319;s:3:"⨛";i:2320;s:3:"⨜";i:2321;s:3:"â¨";i:2322;s:3:"⨞";i:2323;s:3:"⨟";i:2324;s:3:"⨠";i:2325;s:3:"⨡";i:2326;s:3:"⨢";i:2327;s:3:"⨣";i:2328;s:3:"⨤";i:2329;s:3:"⨥";i:2330;s:3:"⨦";i:2331;s:3:"⨧";i:2332;s:3:"⨨";i:2333;s:3:"⨩";i:2334;s:3:"⨪";i:2335;s:3:"⨫";i:2336;s:3:"⨬";i:2337;s:3:"⨭";i:2338;s:3:"⨮";i:2339;s:3:"⨯";i:2340;s:3:"⨰";i:2341;s:3:"⨱";i:2342;s:3:"⨲";i:2343;s:3:"⨳";i:2344;s:3:"⨴";i:2345;s:3:"⨵";i:2346;s:3:"⨶";i:2347;s:3:"⨷";i:2348;s:3:"⨸";i:2349;s:3:"⨹";i:2350;s:3:"⨺";i:2351;s:3:"⨻";i:2352;s:3:"⨼";i:2353;s:3:"⨽";i:2354;s:3:"⨾";i:2355;s:3:"⨿";i:2356;s:3:"â©€";i:2357;s:3:"â©";i:2358;s:3:"â©‚";i:2359;s:3:"⩃";i:2360;s:3:"â©„";i:2361;s:3:"â©…";i:2362;s:3:"⩆";i:2363;s:3:"⩇";i:2364;s:3:"⩈";i:2365;s:3:"⩉";i:2366;s:3:"â©Š";i:2367;s:3:"â©‹";i:2368;s:3:"â©Œ";i:2369;s:3:"â©";i:2370;s:3:"â©Ž";i:2371;s:3:"â©";i:2372;s:3:"â©";i:2373;s:3:"â©‘";i:2374;s:3:"â©’";i:2375;s:3:"â©“";i:2376;s:3:"â©”";i:2377;s:3:"â©•";i:2378;s:3:"â©–";i:2379;s:3:"â©—";i:2380;s:3:"⩘";i:2381;s:3:"â©™";i:2382;s:3:"â©š";i:2383;s:3:"â©›";i:2384;s:3:"â©œ";i:2385;s:3:"â©";i:2386;s:3:"â©ž";i:2387;s:3:"â©Ÿ";i:2388;s:3:"â© ";i:2389;s:3:"â©¡";i:2390;s:3:"â©¢";i:2391;s:3:"â©£";i:2392;s:3:"⩤";i:2393;s:3:"â©¥";i:2394;s:3:"⩦";i:2395;s:3:"⩧";i:2396;s:3:"⩨";i:2397;s:3:"â©©";i:2398;s:3:"⩪";i:2399;s:3:"â©«";i:2400;s:3:"⩬";i:2401;s:3:"â©­";i:2402;s:3:"â©®";i:2403;s:3:"⩯";i:2404;s:3:"â©°";i:2405;s:3:"⩱";i:2406;s:3:"⩲";i:2407;s:3:"⩳";i:2408;s:3:"â©·";i:2409;s:3:"⩸";i:2410;s:3:"⩹";i:2411;s:3:"⩺";i:2412;s:3:"â©»";i:2413;s:3:"⩼";i:2414;s:3:"⩽";i:2415;s:3:"⩾";i:2416;s:3:"â©¿";i:2417;s:3:"⪀";i:2418;s:3:"âª";i:2419;s:3:"⪂";i:2420;s:3:"⪃";i:2421;s:3:"⪄";i:2422;s:3:"⪅";i:2423;s:3:"⪆";i:2424;s:3:"⪇";i:2425;s:3:"⪈";i:2426;s:3:"⪉";i:2427;s:3:"⪊";i:2428;s:3:"⪋";i:2429;s:3:"⪌";i:2430;s:3:"âª";i:2431;s:3:"⪎";i:2432;s:3:"âª";i:2433;s:3:"âª";i:2434;s:3:"⪑";i:2435;s:3:"⪒";i:2436;s:3:"⪓";i:2437;s:3:"⪔";i:2438;s:3:"⪕";i:2439;s:3:"⪖";i:2440;s:3:"⪗";i:2441;s:3:"⪘";i:2442;s:3:"⪙";i:2443;s:3:"⪚";i:2444;s:3:"⪛";i:2445;s:3:"⪜";i:2446;s:3:"âª";i:2447;s:3:"⪞";i:2448;s:3:"⪟";i:2449;s:3:"⪠";i:2450;s:3:"⪡";i:2451;s:3:"⪢";i:2452;s:3:"⪣";i:2453;s:3:"⪤";i:2454;s:3:"⪥";i:2455;s:3:"⪦";i:2456;s:3:"⪧";i:2457;s:3:"⪨";i:2458;s:3:"⪩";i:2459;s:3:"⪪";i:2460;s:3:"⪫";i:2461;s:3:"⪬";i:2462;s:3:"⪭";i:2463;s:3:"⪮";i:2464;s:3:"⪯";i:2465;s:3:"⪰";i:2466;s:3:"⪱";i:2467;s:3:"⪲";i:2468;s:3:"⪳";i:2469;s:3:"⪴";i:2470;s:3:"⪵";i:2471;s:3:"⪶";i:2472;s:3:"⪷";i:2473;s:3:"⪸";i:2474;s:3:"⪹";i:2475;s:3:"⪺";i:2476;s:3:"⪻";i:2477;s:3:"⪼";i:2478;s:3:"⪽";i:2479;s:3:"⪾";i:2480;s:3:"⪿";i:2481;s:3:"â«€";i:2482;s:3:"â«";i:2483;s:3:"â«‚";i:2484;s:3:"⫃";i:2485;s:3:"â«„";i:2486;s:3:"â«…";i:2487;s:3:"⫆";i:2488;s:3:"⫇";i:2489;s:3:"⫈";i:2490;s:3:"⫉";i:2491;s:3:"â«Š";i:2492;s:3:"â«‹";i:2493;s:3:"â«Œ";i:2494;s:3:"â«";i:2495;s:3:"â«Ž";i:2496;s:3:"â«";i:2497;s:3:"â«";i:2498;s:3:"â«‘";i:2499;s:3:"â«’";i:2500;s:3:"â«“";i:2501;s:3:"â«”";i:2502;s:3:"â«•";i:2503;s:3:"â«–";i:2504;s:3:"â«—";i:2505;s:3:"⫘";i:2506;s:3:"â«™";i:2507;s:3:"â«š";i:2508;s:3:"â«›";i:2509;s:3:"â«";i:2510;s:3:"â«ž";i:2511;s:3:"â«Ÿ";i:2512;s:3:"â« ";i:2513;s:3:"â«¡";i:2514;s:3:"â«¢";i:2515;s:3:"â«£";i:2516;s:3:"⫤";i:2517;s:3:"â«¥";i:2518;s:3:"⫦";i:2519;s:3:"⫧";i:2520;s:3:"⫨";i:2521;s:3:"â«©";i:2522;s:3:"⫪";i:2523;s:3:"â««";i:2524;s:3:"⫬";i:2525;s:3:"â«­";i:2526;s:3:"â«®";i:2527;s:3:"⫯";i:2528;s:3:"â«°";i:2529;s:3:"⫱";i:2530;s:3:"⫲";i:2531;s:3:"⫳";i:2532;s:3:"â«´";i:2533;s:3:"⫵";i:2534;s:3:"⫶";i:2535;s:3:"â«·";i:2536;s:3:"⫸";i:2537;s:3:"⫹";i:2538;s:3:"⫺";i:2539;s:3:"â«»";i:2540;s:3:"⫼";i:2541;s:3:"⫽";i:2542;s:3:"⫾";i:2543;s:3:"â«¿";i:2544;s:3:"⬀";i:2545;s:3:"â¬";i:2546;s:3:"⬂";i:2547;s:3:"⬃";i:2548;s:3:"⬄";i:2549;s:3:"⬅";i:2550;s:3:"⬆";i:2551;s:3:"⬇";i:2552;s:3:"⬈";i:2553;s:3:"⬉";i:2554;s:3:"⬊";i:2555;s:3:"⬋";i:2556;s:3:"⬌";i:2557;s:3:"â¬";i:2558;s:3:"⬎";i:2559;s:3:"â¬";i:2560;s:3:"â¬";i:2561;s:3:"⬑";i:2562;s:3:"⬒";i:2563;s:3:"⬓";i:2564;s:3:"⬔";i:2565;s:3:"⬕";i:2566;s:3:"⬖";i:2567;s:3:"⬗";i:2568;s:3:"⬘";i:2569;s:3:"⬙";i:2570;s:3:"⬚";i:2571;s:3:"⬛";i:2572;s:3:"⬜";i:2573;s:3:"â¬";i:2574;s:3:"⬞";i:2575;s:3:"⬟";i:2576;s:3:"⬠";i:2577;s:3:"⬡";i:2578;s:3:"⬢";i:2579;s:3:"⬣";i:2580;s:3:"⬤";i:2581;s:3:"⬥";i:2582;s:3:"⬦";i:2583;s:3:"⬧";i:2584;s:3:"⬨";i:2585;s:3:"⬩";i:2586;s:3:"⬪";i:2587;s:3:"⬫";i:2588;s:3:"⬬";i:2589;s:3:"⬭";i:2590;s:3:"⬮";i:2591;s:3:"⬯";i:2592;s:3:"⬰";i:2593;s:3:"⬱";i:2594;s:3:"⬲";i:2595;s:3:"⬳";i:2596;s:3:"⬴";i:2597;s:3:"⬵";i:2598;s:3:"⬶";i:2599;s:3:"⬷";i:2600;s:3:"⬸";i:2601;s:3:"⬹";i:2602;s:3:"⬺";i:2603;s:3:"⬻";i:2604;s:3:"⬼";i:2605;s:3:"⬽";i:2606;s:3:"⬾";i:2607;s:3:"⬿";i:2608;s:3:"â­€";i:2609;s:3:"â­";i:2610;s:3:"â­‚";i:2611;s:3:"â­ƒ";i:2612;s:3:"â­„";i:2613;s:3:"â­…";i:2614;s:3:"â­†";i:2615;s:3:"â­‡";i:2616;s:3:"â­ˆ";i:2617;s:3:"â­‰";i:2618;s:3:"â­Š";i:2619;s:3:"â­‹";i:2620;s:3:"â­Œ";i:2621;s:3:"â­";i:2622;s:3:"â­‘";i:2623;s:3:"â­’";i:2624;s:3:"â­“";i:2625;s:3:"â­”";i:2626;s:3:"â­•";i:2627;s:3:"â­–";i:2628;s:3:"â­—";i:2629;s:3:"â­˜";i:2630;s:3:"â­™";i:2631;s:3:"â³¥";i:2632;s:3:"⳦";i:2633;s:3:"⳧";i:2634;s:3:"⳨";i:2635;s:3:"⳩";i:2636;s:3:"⳪";i:2637;s:3:"â €";i:2638;s:3:"â ";i:2639;s:3:"â ‚";i:2640;s:3:"â ƒ";i:2641;s:3:"â „";i:2642;s:3:"â …";i:2643;s:3:"â †";i:2644;s:3:"â ‡";i:2645;s:3:"â ˆ";i:2646;s:3:"â ‰";i:2647;s:3:"â Š";i:2648;s:3:"â ‹";i:2649;s:3:"â Œ";i:2650;s:3:"â ";i:2651;s:3:"â Ž";i:2652;s:3:"â ";i:2653;s:3:"â ";i:2654;s:3:"â ‘";i:2655;s:3:"â ’";i:2656;s:3:"â “";i:2657;s:3:"â ”";i:2658;s:3:"â •";i:2659;s:3:"â –";i:2660;s:3:"â —";i:2661;s:3:"â ˜";i:2662;s:3:"â ™";i:2663;s:3:"â š";i:2664;s:3:"â ›";i:2665;s:3:"â œ";i:2666;s:3:"â ";i:2667;s:3:"â ž";i:2668;s:3:"â Ÿ";i:2669;s:3:"â  ";i:2670;s:3:"â ¡";i:2671;s:3:"â ¢";i:2672;s:3:"â £";i:2673;s:3:"â ¤";i:2674;s:3:"â ¥";i:2675;s:3:"â ¦";i:2676;s:3:"â §";i:2677;s:3:"â ¨";i:2678;s:3:"â ©";i:2679;s:3:"â ª";i:2680;s:3:"â «";i:2681;s:3:"â ¬";i:2682;s:3:"â ­";i:2683;s:3:"â ®";i:2684;s:3:"â ¯";i:2685;s:3:"â °";i:2686;s:3:"â ±";i:2687;s:3:"â ²";i:2688;s:3:"â ³";i:2689;s:3:"â ´";i:2690;s:3:"â µ";i:2691;s:3:"â ¶";i:2692;s:3:"â ·";i:2693;s:3:"â ¸";i:2694;s:3:"â ¹";i:2695;s:3:"â º";i:2696;s:3:"â »";i:2697;s:3:"â ¼";i:2698;s:3:"â ½";i:2699;s:3:"â ¾";i:2700;s:3:"â ¿";i:2701;s:3:"â¡€";i:2702;s:3:"â¡";i:2703;s:3:"â¡‚";i:2704;s:3:"⡃";i:2705;s:3:"â¡„";i:2706;s:3:"â¡…";i:2707;s:3:"⡆";i:2708;s:3:"⡇";i:2709;s:3:"⡈";i:2710;s:3:"⡉";i:2711;s:3:"â¡Š";i:2712;s:3:"â¡‹";i:2713;s:3:"â¡Œ";i:2714;s:3:"â¡";i:2715;s:3:"â¡Ž";i:2716;s:3:"â¡";i:2717;s:3:"â¡";i:2718;s:3:"â¡‘";i:2719;s:3:"â¡’";i:2720;s:3:"â¡“";i:2721;s:3:"â¡”";i:2722;s:3:"â¡•";i:2723;s:3:"â¡–";i:2724;s:3:"â¡—";i:2725;s:3:"⡘";i:2726;s:3:"â¡™";i:2727;s:3:"â¡š";i:2728;s:3:"â¡›";i:2729;s:3:"â¡œ";i:2730;s:3:"â¡";i:2731;s:3:"â¡ž";i:2732;s:3:"â¡Ÿ";i:2733;s:3:"â¡ ";i:2734;s:3:"â¡¡";i:2735;s:3:"â¡¢";i:2736;s:3:"â¡£";i:2737;s:3:"⡤";i:2738;s:3:"â¡¥";i:2739;s:3:"⡦";i:2740;s:3:"⡧";i:2741;s:3:"⡨";i:2742;s:3:"â¡©";i:2743;s:3:"⡪";i:2744;s:3:"â¡«";i:2745;s:3:"⡬";i:2746;s:3:"â¡­";i:2747;s:3:"â¡®";i:2748;s:3:"⡯";i:2749;s:3:"â¡°";i:2750;s:3:"⡱";i:2751;s:3:"⡲";i:2752;s:3:"⡳";i:2753;s:3:"â¡´";i:2754;s:3:"⡵";i:2755;s:3:"⡶";i:2756;s:3:"â¡·";i:2757;s:3:"⡸";i:2758;s:3:"⡹";i:2759;s:3:"⡺";i:2760;s:3:"â¡»";i:2761;s:3:"⡼";i:2762;s:3:"⡽";i:2763;s:3:"⡾";i:2764;s:3:"â¡¿";i:2765;s:3:"⢀";i:2766;s:3:"â¢";i:2767;s:3:"⢂";i:2768;s:3:"⢃";i:2769;s:3:"⢄";i:2770;s:3:"⢅";i:2771;s:3:"⢆";i:2772;s:3:"⢇";i:2773;s:3:"⢈";i:2774;s:3:"⢉";i:2775;s:3:"⢊";i:2776;s:3:"⢋";i:2777;s:3:"⢌";i:2778;s:3:"â¢";i:2779;s:3:"⢎";i:2780;s:3:"â¢";i:2781;s:3:"â¢";i:2782;s:3:"⢑";i:2783;s:3:"⢒";i:2784;s:3:"⢓";i:2785;s:3:"⢔";i:2786;s:3:"⢕";i:2787;s:3:"⢖";i:2788;s:3:"⢗";i:2789;s:3:"⢘";i:2790;s:3:"⢙";i:2791;s:3:"⢚";i:2792;s:3:"⢛";i:2793;s:3:"⢜";i:2794;s:3:"â¢";i:2795;s:3:"⢞";i:2796;s:3:"⢟";i:2797;s:3:"⢠";i:2798;s:3:"⢡";i:2799;s:3:"⢢";i:2800;s:3:"⢣";i:2801;s:3:"⢤";i:2802;s:3:"⢥";i:2803;s:3:"⢦";i:2804;s:3:"⢧";i:2805;s:3:"⢨";i:2806;s:3:"⢩";i:2807;s:3:"⢪";i:2808;s:3:"⢫";i:2809;s:3:"⢬";i:2810;s:3:"⢭";i:2811;s:3:"⢮";i:2812;s:3:"⢯";i:2813;s:3:"⢰";i:2814;s:3:"⢱";i:2815;s:3:"⢲";i:2816;s:3:"⢳";i:2817;s:3:"⢴";i:2818;s:3:"⢵";i:2819;s:3:"⢶";i:2820;s:3:"⢷";i:2821;s:3:"⢸";i:2822;s:3:"⢹";i:2823;s:3:"⢺";i:2824;s:3:"⢻";i:2825;s:3:"⢼";i:2826;s:3:"⢽";i:2827;s:3:"⢾";i:2828;s:3:"⢿";i:2829;s:3:"⣀";i:2830;s:3:"â£";i:2831;s:3:"⣂";i:2832;s:3:"⣃";i:2833;s:3:"⣄";i:2834;s:3:"⣅";i:2835;s:3:"⣆";i:2836;s:3:"⣇";i:2837;s:3:"⣈";i:2838;s:3:"⣉";i:2839;s:3:"⣊";i:2840;s:3:"⣋";i:2841;s:3:"⣌";i:2842;s:3:"â£";i:2843;s:3:"⣎";i:2844;s:3:"â£";i:2845;s:3:"â£";i:2846;s:3:"⣑";i:2847;s:3:"⣒";i:2848;s:3:"⣓";i:2849;s:3:"⣔";i:2850;s:3:"⣕";i:2851;s:3:"⣖";i:2852;s:3:"⣗";i:2853;s:3:"⣘";i:2854;s:3:"⣙";i:2855;s:3:"⣚";i:2856;s:3:"⣛";i:2857;s:3:"⣜";i:2858;s:3:"â£";i:2859;s:3:"⣞";i:2860;s:3:"⣟";i:2861;s:3:"⣠";i:2862;s:3:"⣡";i:2863;s:3:"⣢";i:2864;s:3:"⣣";i:2865;s:3:"⣤";i:2866;s:3:"⣥";i:2867;s:3:"⣦";i:2868;s:3:"⣧";i:2869;s:3:"⣨";i:2870;s:3:"⣩";i:2871;s:3:"⣪";i:2872;s:3:"⣫";i:2873;s:3:"⣬";i:2874;s:3:"⣭";i:2875;s:3:"⣮";i:2876;s:3:"⣯";i:2877;s:3:"⣰";i:2878;s:3:"⣱";i:2879;s:3:"⣲";i:2880;s:3:"⣳";i:2881;s:3:"⣴";i:2882;s:3:"⣵";i:2883;s:3:"⣶";i:2884;s:3:"⣷";i:2885;s:3:"⣸";i:2886;s:3:"⣹";i:2887;s:3:"⣺";i:2888;s:3:"⣻";i:2889;s:3:"⣼";i:2890;s:3:"⣽";i:2891;s:3:"⣾";i:2892;s:3:"⣿";i:2893;s:3:"⚊";i:2894;s:3:"âš‹";i:2895;s:3:"⚌";i:2896;s:3:"âš";i:2897;s:3:"⚎";i:2898;s:3:"âš";i:2899;s:3:"☰";i:2900;s:3:"☱";i:2901;s:3:"☲";i:2902;s:3:"☳";i:2903;s:3:"☴";i:2904;s:3:"☵";i:2905;s:3:"☶";i:2906;s:3:"☷";i:2907;s:3:"ä·€";i:2908;s:3:"ä·";i:2909;s:3:"ä·‚";i:2910;s:3:"ä·ƒ";i:2911;s:3:"ä·„";i:2912;s:3:"ä·…";i:2913;s:3:"ä·†";i:2914;s:3:"ä·‡";i:2915;s:3:"ä·ˆ";i:2916;s:3:"ä·‰";i:2917;s:3:"ä·Š";i:2918;s:3:"ä·‹";i:2919;s:3:"ä·Œ";i:2920;s:3:"ä·";i:2921;s:3:"ä·Ž";i:2922;s:3:"ä·";i:2923;s:3:"ä·";i:2924;s:3:"ä·‘";i:2925;s:3:"ä·’";i:2926;s:3:"ä·“";i:2927;s:3:"ä·”";i:2928;s:3:"ä·•";i:2929;s:3:"ä·–";i:2930;s:3:"ä·—";i:2931;s:3:"ä·˜";i:2932;s:3:"ä·™";i:2933;s:3:"ä·š";i:2934;s:3:"ä·›";i:2935;s:3:"ä·œ";i:2936;s:3:"ä·";i:2937;s:3:"ä·ž";i:2938;s:3:"ä·Ÿ";i:2939;s:3:"ä· ";i:2940;s:3:"ä·¡";i:2941;s:3:"ä·¢";i:2942;s:3:"ä·£";i:2943;s:3:"ä·¤";i:2944;s:3:"ä·¥";i:2945;s:3:"ä·¦";i:2946;s:3:"ä·§";i:2947;s:3:"ä·¨";i:2948;s:3:"ä·©";i:2949;s:3:"ä·ª";i:2950;s:3:"ä·«";i:2951;s:3:"ä·¬";i:2952;s:3:"ä·­";i:2953;s:3:"ä·®";i:2954;s:3:"ä·¯";i:2955;s:3:"ä·°";i:2956;s:3:"ä·±";i:2957;s:3:"ä·²";i:2958;s:3:"ä·³";i:2959;s:3:"ä·´";i:2960;s:3:"ä·µ";i:2961;s:3:"ä·¶";i:2962;s:3:"ä··";i:2963;s:3:"ä·¸";i:2964;s:3:"ä·¹";i:2965;s:3:"ä·º";i:2966;s:3:"ä·»";i:2967;s:3:"ä·¼";i:2968;s:3:"ä·½";i:2969;s:3:"ä·¾";i:2970;s:3:"ä·¿";i:2971;s:4:"ðŒ€";i:2972;s:4:"ðŒ";i:2973;s:4:"ðŒ‚";i:2974;s:4:"ðŒƒ";i:2975;s:4:"ðŒ„";i:2976;s:4:"ðŒ…";i:2977;s:4:"ðŒ†";i:2978;s:4:"ðŒ‡";i:2979;s:4:"ðŒˆ";i:2980;s:4:"ðŒ‰";i:2981;s:4:"ðŒŠ";i:2982;s:4:"ðŒ‹";i:2983;s:4:"ðŒŒ";i:2984;s:4:"ðŒ";i:2985;s:4:"ðŒŽ";i:2986;s:4:"ðŒ";i:2987;s:4:"ðŒ";i:2988;s:4:"ðŒ‘";i:2989;s:4:"ðŒ’";i:2990;s:4:"ðŒ“";i:2991;s:4:"ðŒ”";i:2992;s:4:"ðŒ•";i:2993;s:4:"ðŒ–";i:2994;s:4:"ðŒ—";i:2995;s:4:"ðŒ˜";i:2996;s:4:"ðŒ™";i:2997;s:4:"ðŒš";i:2998;s:4:"ðŒ›";i:2999;s:4:"ðŒœ";i:3000;s:4:"ðŒ";i:3001;s:4:"ðŒž";i:3002;s:4:"ðŒŸ";i:3003;s:4:"ðŒ ";i:3004;s:4:"ðŒ¡";i:3005;s:4:"ðŒ¢";i:3006;s:4:"ðŒ£";i:3007;s:4:"ðŒ¤";i:3008;s:4:"ðŒ¥";i:3009;s:4:"ðŒ¦";i:3010;s:4:"ðŒ§";i:3011;s:4:"ðŒ¨";i:3012;s:4:"ðŒ©";i:3013;s:4:"ðŒª";i:3014;s:4:"ðŒ«";i:3015;s:4:"ðŒ¬";i:3016;s:4:"ðŒ­";i:3017;s:4:"ðŒ®";i:3018;s:4:"ðŒ¯";i:3019;s:4:"ðŒ°";i:3020;s:4:"ðŒ±";i:3021;s:4:"ðŒ²";i:3022;s:4:"ðŒ³";i:3023;s:4:"ðŒ´";i:3024;s:4:"ðŒµ";i:3025;s:4:"ðŒ¶";i:3026;s:4:"ðŒ·";i:3027;s:4:"ðŒ¸";i:3028;s:4:"ðŒ¹";i:3029;s:4:"ðŒº";i:3030;s:4:"ðŒ»";i:3031;s:4:"ðŒ¼";i:3032;s:4:"ðŒ½";i:3033;s:4:"ðŒ¾";i:3034;s:4:"ðŒ¿";i:3035;s:4:"ð€";i:3036;s:4:"ð";i:3037;s:4:"ð‚";i:3038;s:4:"ðƒ";i:3039;s:4:"ð„";i:3040;s:4:"ð…";i:3041;s:4:"ð†";i:3042;s:4:"ð‡";i:3043;s:4:"ðˆ";i:3044;s:4:"ð‰";i:3045;s:4:"ðŠ";i:3046;s:4:"ð‹";i:3047;s:4:"ðŒ";i:3048;s:4:"ð";i:3049;s:4:"ðŽ";i:3050;s:4:"ð";i:3051;s:4:"ð";i:3052;s:4:"ð‘";i:3053;s:4:"ð’";i:3054;s:4:"ð“";i:3055;s:4:"ð”";i:3056;s:4:"ð•";i:3057;s:4:"ð–";i:3058;s:3:"ê’";i:3059;s:3:"ê’‘";i:3060;s:3:"ê’’";i:3061;s:3:"ê’“";i:3062;s:3:"ê’”";i:3063;s:3:"ê’•";i:3064;s:3:"ê’–";i:3065;s:3:"ê’—";i:3066;s:3:"ê’˜";i:3067;s:3:"ê’™";i:3068;s:3:"ê’š";i:3069;s:3:"ê’›";i:3070;s:3:"ê’œ";i:3071;s:3:"ê’";i:3072;s:3:"ê’ž";i:3073;s:3:"ê’Ÿ";i:3074;s:3:"ê’ ";i:3075;s:3:"ê’¡";i:3076;s:3:"ê’¢";i:3077;s:3:"ê’£";i:3078;s:3:"ê’¤";i:3079;s:3:"ê’¥";i:3080;s:3:"ê’¦";i:3081;s:3:"ê’§";i:3082;s:3:"ê’¨";i:3083;s:3:"ê’©";i:3084;s:3:"ê’ª";i:3085;s:3:"ê’«";i:3086;s:3:"ê’¬";i:3087;s:3:"ê’­";i:3088;s:3:"ê’®";i:3089;s:3:"ê’¯";i:3090;s:3:"ê’°";i:3091;s:3:"ê’±";i:3092;s:3:"ê’²";i:3093;s:3:"ê’³";i:3094;s:3:"ê’´";i:3095;s:3:"ê’µ";i:3096;s:3:"ê’¶";i:3097;s:3:"ê’·";i:3098;s:3:"ê’¸";i:3099;s:3:"ê’¹";i:3100;s:3:"ê’º";i:3101;s:3:"ê’»";i:3102;s:3:"ê’¼";i:3103;s:3:"ê’½";i:3104;s:3:"ê’¾";i:3105;s:3:"ê’¿";i:3106;s:3:"ê“€";i:3107;s:3:"ê“";i:3108;s:3:"ê“‚";i:3109;s:3:"꓃";i:3110;s:3:"ê“„";i:3111;s:3:"ê“…";i:3112;s:3:"꓆";i:3113;s:4:"ð„·";i:3114;s:4:"ð„¸";i:3115;s:4:"ð„¹";i:3116;s:4:"ð„º";i:3117;s:4:"ð„»";i:3118;s:4:"ð„¼";i:3119;s:4:"ð„½";i:3120;s:4:"ð„¾";i:3121;s:4:"ð„¿";i:3122;s:4:"ð…¹";i:3123;s:4:"ð…º";i:3124;s:4:"ð…»";i:3125;s:4:"ð…¼";i:3126;s:4:"ð…½";i:3127;s:4:"ð…¾";i:3128;s:4:"ð…¿";i:3129;s:4:"ð†€";i:3130;s:4:"ð†";i:3131;s:4:"ð†‚";i:3132;s:4:"ð†ƒ";i:3133;s:4:"ð†„";i:3134;s:4:"ð†…";i:3135;s:4:"ð††";i:3136;s:4:"ð†‡";i:3137;s:4:"ð†ˆ";i:3138;s:4:"ð†‰";i:3139;s:4:"ð†";i:3140;s:4:"ð†‘";i:3141;s:4:"ð†’";i:3142;s:4:"ð†“";i:3143;s:4:"ð†”";i:3144;s:4:"ð†•";i:3145;s:4:"ð†–";i:3146;s:4:"ð†—";i:3147;s:4:"ð†˜";i:3148;s:4:"ð†™";i:3149;s:4:"ð†š";i:3150;s:4:"ð†›";i:3151;s:4:"ð‡";i:3152;s:4:"ð‡‘";i:3153;s:4:"ð‡’";i:3154;s:4:"ð‡“";i:3155;s:4:"ð‡”";i:3156;s:4:"ð‡•";i:3157;s:4:"ð‡–";i:3158;s:4:"ð‡—";i:3159;s:4:"ð‡˜";i:3160;s:4:"ð‡™";i:3161;s:4:"ð‡š";i:3162;s:4:"ð‡›";i:3163;s:4:"ð‡œ";i:3164;s:4:"ð‡";i:3165;s:4:"ð‡ž";i:3166;s:4:"ð‡Ÿ";i:3167;s:4:"ð‡ ";i:3168;s:4:"ð‡¡";i:3169;s:4:"ð‡¢";i:3170;s:4:"ð‡£";i:3171;s:4:"ð‡¤";i:3172;s:4:"ð‡¥";i:3173;s:4:"ð‡¦";i:3174;s:4:"ð‡§";i:3175;s:4:"ð‡¨";i:3176;s:4:"ð‡©";i:3177;s:4:"ð‡ª";i:3178;s:4:"ð‡«";i:3179;s:4:"ð‡¬";i:3180;s:4:"ð‡­";i:3181;s:4:"ð‡®";i:3182;s:4:"ð‡¯";i:3183;s:4:"ð‡°";i:3184;s:4:"ð‡±";i:3185;s:4:"ð‡²";i:3186;s:4:"ð‡³";i:3187;s:4:"ð‡´";i:3188;s:4:"ð‡µ";i:3189;s:4:"ð‡¶";i:3190;s:4:"ð‡·";i:3191;s:4:"ð‡¸";i:3192;s:4:"ð‡¹";i:3193;s:4:"ð‡º";i:3194;s:4:"ð‡»";i:3195;s:4:"ð‡¼";i:3196;s:4:"ð€€";i:3197;s:4:"ð€";i:3198;s:4:"ð€‚";i:3199;s:4:"ð€ƒ";i:3200;s:4:"ð€„";i:3201;s:4:"ð€…";i:3202;s:4:"ð€†";i:3203;s:4:"ð€‡";i:3204;s:4:"ð€ˆ";i:3205;s:4:"ð€‰";i:3206;s:4:"ð€Š";i:3207;s:4:"ð€‹";i:3208;s:4:"ð€Œ";i:3209;s:4:"ð€";i:3210;s:4:"ð€Ž";i:3211;s:4:"ð€";i:3212;s:4:"ð€";i:3213;s:4:"ð€‘";i:3214;s:4:"ð€’";i:3215;s:4:"ð€“";i:3216;s:4:"ð€”";i:3217;s:4:"ð€•";i:3218;s:4:"ð€–";i:3219;s:4:"ð€—";i:3220;s:4:"ð€˜";i:3221;s:4:"ð€™";i:3222;s:4:"ð€š";i:3223;s:4:"ð€›";i:3224;s:4:"ð€œ";i:3225;s:4:"ð€";i:3226;s:4:"ð€ž";i:3227;s:4:"ð€Ÿ";i:3228;s:4:"ð€ ";i:3229;s:4:"ð€¡";i:3230;s:4:"ð€¢";i:3231;s:4:"ð€£";i:3232;s:4:"ð€¤";i:3233;s:4:"ð€¥";i:3234;s:4:"ð€¦";i:3235;s:4:"ð€§";i:3236;s:4:"ð€¨";i:3237;s:4:"ð€©";i:3238;s:4:"ð€ª";i:3239;s:4:"ð€«";i:3240;s:4:"ð€¬";i:3241;s:4:"ð€­";i:3242;s:4:"ð€®";i:3243;s:4:"ð€¯";i:3244;s:4:"ð€°";i:3245;s:4:"ð€±";i:3246;s:4:"ð€²";i:3247;s:4:"ð€³";i:3248;s:4:"ð€´";i:3249;s:4:"ð€µ";i:3250;s:4:"ð€¶";i:3251;s:4:"ð€·";i:3252;s:4:"ð€¸";i:3253;s:4:"ð€¹";i:3254;s:4:"ð€º";i:3255;s:4:"ð€»";i:3256;s:4:"ð€¼";i:3257;s:4:"ð€½";i:3258;s:4:"ð€¾";i:3259;s:4:"ð€¿";i:3260;s:4:"ð€";i:3261;s:4:"ð";i:3262;s:4:"ð‚";i:3263;s:4:"ðƒ";i:3264;s:4:"ð„";i:3265;s:4:"ð…";i:3266;s:4:"ð†";i:3267;s:4:"ð‡";i:3268;s:4:"ðˆ";i:3269;s:4:"ð‰";i:3270;s:4:"ðŠ";i:3271;s:4:"ð‹";i:3272;s:4:"ðŒ";i:3273;s:4:"ð";i:3274;s:4:"ðŽ";i:3275;s:4:"ð";i:3276;s:4:"ð";i:3277;s:4:"ð‘";i:3278;s:4:"ð’";i:3279;s:4:"ð“";i:3280;s:4:"ð”";i:3281;s:4:"ð•";i:3282;s:4:"ð–";i:3283;s:4:"ð—";i:3284;s:4:"ð˜";i:3285;s:4:"ð™";i:3286;s:4:"ðš";i:3287;s:4:"ð›";i:3288;s:4:"ðœ";i:3289;s:4:"ð";i:3290;s:4:"ðž";i:3291;s:4:"ðŸ";i:3292;s:4:"ð ";i:3293;s:4:"ð¡";i:3294;s:4:"ð¢";i:3295;s:4:"ð£";i:3296;s:4:"ð¤";i:3297;s:4:"ð¥";i:3298;s:4:"ð¦";i:3299;s:4:"ð§";i:3300;s:4:"ð¨";i:3301;s:4:"ð©";i:3302;s:4:"ðª";i:3303;s:4:"ð«";i:3304;s:4:"ð¬";i:3305;s:4:"ð­";i:3306;s:4:"ð®";i:3307;s:4:"ð¯";i:3308;s:4:"ð°";i:3309;s:4:"ð±";i:3310;s:4:"ð²";i:3311;s:4:"ð³";i:3312;s:4:"ð´";i:3313;s:4:"ðµ";i:3314;s:4:"ð¶";i:3315;s:4:"ð·";i:3316;s:4:"ð¸";i:3317;s:4:"ð¹";i:3318;s:4:"ðº";i:3319;s:4:"ð»";i:3320;s:4:"ð¼";i:3321;s:4:"ð½";i:3322;s:4:"ð¾";i:3323;s:4:"ð¿";i:3324;s:4:"ð‚€";i:3325;s:4:"ð‚";i:3326;s:4:"ð‚‚";i:3327;s:4:"ð‚ƒ";i:3328;s:4:"ð‚„";i:3329;s:4:"ð‚…";i:3330;s:4:"ð‚†";i:3331;s:4:"ð‚‡";i:3332;s:4:"ð‚ˆ";i:3333;s:4:"ð‚‰";i:3334;s:4:"ð‚Š";i:3335;s:4:"ð‚‹";i:3336;s:4:"ð‚Œ";i:3337;s:4:"ð‚";i:3338;s:4:"ð‚Ž";i:3339;s:4:"ð‚";i:3340;s:4:"ð‚";i:3341;s:4:"ð‚‘";i:3342;s:4:"ð‚’";i:3343;s:4:"ð‚“";i:3344;s:4:"ð‚”";i:3345;s:4:"ð‚•";i:3346;s:4:"ð‚–";i:3347;s:4:"ð‚—";i:3348;s:4:"ð‚˜";i:3349;s:4:"ð‚™";i:3350;s:4:"ð‚š";i:3351;s:4:"ð‚›";i:3352;s:4:"ð‚œ";i:3353;s:4:"ð‚";i:3354;s:4:"ð‚ž";i:3355;s:4:"ð‚Ÿ";i:3356;s:4:"ð‚ ";i:3357;s:4:"ð‚¡";i:3358;s:4:"ð‚¢";i:3359;s:4:"ð‚£";i:3360;s:4:"ð‚¤";i:3361;s:4:"ð‚¥";i:3362;s:4:"ð‚¦";i:3363;s:4:"ð‚§";i:3364;s:4:"ð‚¨";i:3365;s:4:"ð‚©";i:3366;s:4:"ð‚ª";i:3367;s:4:"ð‚«";i:3368;s:4:"ð‚¬";i:3369;s:4:"ð‚­";i:3370;s:4:"ð‚®";i:3371;s:4:"ð‚¯";i:3372;s:4:"ð‚°";i:3373;s:4:"ð‚±";i:3374;s:4:"ð‚²";i:3375;s:4:"ð‚³";i:3376;s:4:"ð‚´";i:3377;s:4:"ð‚µ";i:3378;s:4:"ð‚¶";i:3379;s:4:"ð‚·";i:3380;s:4:"ð‚¸";i:3381;s:4:"ð‚¹";i:3382;s:4:"ð‚º";i:3383;s:4:"ð‚»";i:3384;s:4:"ð‚¼";i:3385;s:4:"ð‚½";i:3386;s:4:"ð‚¾";i:3387;s:4:"ð‚¿";i:3388;s:4:"ðƒ€";i:3389;s:4:"ðƒ";i:3390;s:4:"ðƒ‚";i:3391;s:4:"ðƒƒ";i:3392;s:4:"ðƒ„";i:3393;s:4:"ðƒ…";i:3394;s:4:"ðƒ†";i:3395;s:4:"ðƒ‡";i:3396;s:4:"ðƒˆ";i:3397;s:4:"ðƒ‰";i:3398;s:4:"ðƒŠ";i:3399;s:4:"ðƒ‹";i:3400;s:4:"ðƒŒ";i:3401;s:4:"ðƒ";i:3402;s:4:"ðƒŽ";i:3403;s:4:"ðƒ";i:3404;s:4:"ðƒ";i:3405;s:4:"ðƒ‘";i:3406;s:4:"ðƒ’";i:3407;s:4:"ðƒ“";i:3408;s:4:"ðƒ”";i:3409;s:4:"ðƒ•";i:3410;s:4:"ðƒ–";i:3411;s:4:"ðƒ—";i:3412;s:4:"ðƒ˜";i:3413;s:4:"ðƒ™";i:3414;s:4:"ðƒš";i:3415;s:4:"ðƒ›";i:3416;s:4:"ðƒœ";i:3417;s:4:"ðƒ";i:3418;s:4:"ðƒž";i:3419;s:4:"ðƒŸ";i:3420;s:4:"ðƒ ";i:3421;s:4:"ðƒ¡";i:3422;s:4:"ðƒ¢";i:3423;s:4:"ðƒ£";i:3424;s:4:"ðƒ¤";i:3425;s:4:"ðƒ¥";i:3426;s:4:"ðƒ¦";i:3427;s:4:"ðƒ§";i:3428;s:4:"ðƒ¨";i:3429;s:4:"ðƒ©";i:3430;s:4:"ðƒª";i:3431;s:4:"ðƒ«";i:3432;s:4:"ðƒ¬";i:3433;s:4:"ðƒ­";i:3434;s:4:"ðƒ®";i:3435;s:4:"ðƒ¯";i:3436;s:4:"ðƒ°";i:3437;s:4:"ðƒ±";i:3438;s:4:"ðƒ²";i:3439;s:4:"ðƒ³";i:3440;s:4:"ðƒ´";i:3441;s:4:"ðƒµ";i:3442;s:4:"ð„€";i:3443;s:4:"ð„";i:3444;s:4:"ð„‚";i:3445;s:4:"ð„ƒ";i:3446;s:4:"ð„„";i:3447;s:4:"ð„…";i:3448;s:4:"ð„†";i:3449;s:4:"ð„‡";i:3450;s:4:"ð„ˆ";i:3451;s:4:"ð„‰";i:3452;s:4:"ð„Š";i:3453;s:4:"ð„‹";i:3454;s:4:"ð„Œ";i:3455;s:4:"ð„";i:3456;s:4:"ð„Ž";i:3457;s:4:"ð„";i:3458;s:4:"ð„";i:3459;s:4:"ð„‘";i:3460;s:4:"ð„’";i:3461;s:4:"ð„“";i:3462;s:4:"ð„”";i:3463;s:4:"ð„•";i:3464;s:4:"ð„–";i:3465;s:4:"ð„—";i:3466;s:4:"ð„˜";i:3467;s:4:"ð„™";i:3468;s:4:"ð„š";i:3469;s:4:"ð„›";i:3470;s:4:"ð„œ";i:3471;s:4:"ð„";i:3472;s:4:"ð„ž";i:3473;s:4:"ð„Ÿ";i:3474;s:4:"ð„ ";i:3475;s:4:"ð„¡";i:3476;s:4:"ð„¢";i:3477;s:4:"ð„£";i:3478;s:4:"ð„¤";i:3479;s:4:"ð„¥";i:3480;s:4:"ð„¦";i:3481;s:3:"â™­";i:3482;s:3:"â™®";i:3483;s:3:"♯";i:3484;s:4:"ð„ª";i:3485;s:4:"ð„«";i:3486;s:4:"ð„¬";i:3487;s:4:"ð„­";i:3488;s:4:"ð„®";i:3489;s:4:"ð„¯";i:3490;s:4:"ð„°";i:3491;s:4:"ð„±";i:3492;s:4:"ð„²";i:3493;s:4:"ð„³";i:3494;s:4:"ð„´";i:3495;s:4:"ð„µ";i:3496;s:4:"ð„¶";i:3497;s:4:"ð„·";i:3498;s:4:"ð„¸";i:3499;s:4:"ð„¹";i:3500;s:4:"ð„©";i:3501;s:4:"ð„º";i:3502;s:4:"ð„»";i:3503;s:4:"ð„¼";i:3504;s:4:"ð„½";i:3505;s:4:"ð„¾";i:3506;s:4:"ð„¿";i:3507;s:4:"ð…€";i:3508;s:4:"ð…";i:3509;s:4:"ð…‚";i:3510;s:4:"ð…ƒ";i:3511;s:4:"ð…„";i:3512;s:4:"ð……";i:3513;s:4:"ð…†";i:3514;s:4:"ð…‡";i:3515;s:4:"ð…ˆ";i:3516;s:4:"ð…‰";i:3517;s:4:"ð…Š";i:3518;s:4:"ð…‹";i:3519;s:4:"ð…Œ";i:3520;s:4:"ð…";i:3521;s:4:"ð…Ž";i:3522;s:4:"ð…";i:3523;s:4:"ð…";i:3524;s:4:"ð…‘";i:3525;s:4:"ð…’";i:3526;s:4:"ð…“";i:3527;s:4:"ð…”";i:3528;s:4:"ð…•";i:3529;s:4:"ð…–";i:3530;s:4:"ð…—";i:3531;s:4:"ð…˜";i:3532;s:4:"ð…™";i:3533;s:4:"ð…š";i:3534;s:4:"ð…›";i:3535;s:4:"ð…œ";i:3536;s:4:"ð…";i:3537;s:4:"ð…ª";i:3538;s:4:"ð…«";i:3539;s:4:"ð…¬";i:3540;s:4:"ð†ƒ";i:3541;s:4:"ð†„";i:3542;s:4:"ð†Œ";i:3543;s:4:"ð†";i:3544;s:4:"ð†Ž";i:3545;s:4:"ð†";i:3546;s:4:"ð†";i:3547;s:4:"ð†‘";i:3548;s:4:"ð†’";i:3549;s:4:"ð†“";i:3550;s:4:"ð†”";i:3551;s:4:"ð†•";i:3552;s:4:"ð†–";i:3553;s:4:"ð†—";i:3554;s:4:"ð†˜";i:3555;s:4:"ð†™";i:3556;s:4:"ð†š";i:3557;s:4:"ð†›";i:3558;s:4:"ð†œ";i:3559;s:4:"ð†";i:3560;s:4:"ð†ž";i:3561;s:4:"ð†Ÿ";i:3562;s:4:"ð† ";i:3563;s:4:"ð†¡";i:3564;s:4:"ð†¢";i:3565;s:4:"ð†£";i:3566;s:4:"ð†¤";i:3567;s:4:"ð†¥";i:3568;s:4:"ð†¦";i:3569;s:4:"ð†§";i:3570;s:4:"ð†¨";i:3571;s:4:"ð†©";i:3572;s:4:"ð†®";i:3573;s:4:"ð†¯";i:3574;s:4:"ð†°";i:3575;s:4:"ð†±";i:3576;s:4:"ð†²";i:3577;s:4:"ð†³";i:3578;s:4:"ð†´";i:3579;s:4:"ð†µ";i:3580;s:4:"ð†¶";i:3581;s:4:"ð†·";i:3582;s:4:"ð†¸";i:3583;s:4:"ð†¹";i:3584;s:4:"ð†º";i:3585;s:4:"ð‡";i:3586;s:4:"ð‡‚";i:3587;s:4:"ð‡ƒ";i:3588;s:4:"ð‡„";i:3589;s:4:"ð‡…";i:3590;s:4:"ð‡†";i:3591;s:4:"ð‡‡";i:3592;s:4:"ð‡ˆ";i:3593;s:4:"ð‡‰";i:3594;s:4:"ð‡Š";i:3595;s:4:"ð‡‹";i:3596;s:4:"ð‡Œ";i:3597;s:4:"ð‡";i:3598;s:4:"ð‡Ž";i:3599;s:4:"ð‡";i:3600;s:4:"ð‡";i:3601;s:4:"ð‡‘";i:3602;s:4:"ð‡’";i:3603;s:4:"ð‡“";i:3604;s:4:"ð‡”";i:3605;s:4:"ð‡•";i:3606;s:4:"ð‡–";i:3607;s:4:"ð‡—";i:3608;s:4:"ð‡˜";i:3609;s:4:"ð‡™";i:3610;s:4:"ð‡š";i:3611;s:4:"ð‡›";i:3612;s:4:"ð‡œ";i:3613;s:4:"ð‡";i:3614;s:4:"ðˆ€";i:3615;s:4:"ðˆ";i:3616;s:4:"ðˆ‚";i:3617;s:4:"ðˆƒ";i:3618;s:4:"ðˆ„";i:3619;s:4:"ðˆ…";i:3620;s:4:"ðˆ†";i:3621;s:4:"ðˆ‡";i:3622;s:4:"ðˆˆ";i:3623;s:4:"ðˆ‰";i:3624;s:4:"ðˆŠ";i:3625;s:4:"ðˆ‹";i:3626;s:4:"ðˆŒ";i:3627;s:4:"ðˆ";i:3628;s:4:"ðˆŽ";i:3629;s:4:"ðˆ";i:3630;s:4:"ðˆ";i:3631;s:4:"ðˆ‘";i:3632;s:4:"ðˆ’";i:3633;s:4:"ðˆ“";i:3634;s:4:"ðˆ”";i:3635;s:4:"ðˆ•";i:3636;s:4:"ðˆ–";i:3637;s:4:"ðˆ—";i:3638;s:4:"ðˆ˜";i:3639;s:4:"ðˆ™";i:3640;s:4:"ðˆš";i:3641;s:4:"ðˆ›";i:3642;s:4:"ðˆœ";i:3643;s:4:"ðˆ";i:3644;s:4:"ðˆž";i:3645;s:4:"ðˆŸ";i:3646;s:4:"ðˆ ";i:3647;s:4:"ðˆ¡";i:3648;s:4:"ðˆ¢";i:3649;s:4:"ðˆ£";i:3650;s:4:"ðˆ¤";i:3651;s:4:"ðˆ¥";i:3652;s:4:"ðˆ¦";i:3653;s:4:"ðˆ§";i:3654;s:4:"ðˆ¨";i:3655;s:4:"ðˆ©";i:3656;s:4:"ðˆª";i:3657;s:4:"ðˆ«";i:3658;s:4:"ðˆ¬";i:3659;s:4:"ðˆ­";i:3660;s:4:"ðˆ®";i:3661;s:4:"ðˆ¯";i:3662;s:4:"ðˆ°";i:3663;s:4:"ðˆ±";i:3664;s:4:"ðˆ²";i:3665;s:4:"ðˆ³";i:3666;s:4:"ðˆ´";i:3667;s:4:"ðˆµ";i:3668;s:4:"ðˆ¶";i:3669;s:4:"ðˆ·";i:3670;s:4:"ðˆ¸";i:3671;s:4:"ðˆ¹";i:3672;s:4:"ðˆº";i:3673;s:4:"ðˆ»";i:3674;s:4:"ðˆ¼";i:3675;s:4:"ðˆ½";i:3676;s:4:"ðˆ¾";i:3677;s:4:"ðˆ¿";i:3678;s:4:"ð‰€";i:3679;s:4:"ð‰";i:3680;s:4:"ð‰…";i:3681;s:4:"🀀";i:3682;s:4:"ðŸ€";i:3683;s:4:"🀂";i:3684;s:4:"🀃";i:3685;s:4:"🀄";i:3686;s:4:"🀅";i:3687;s:4:"🀆";i:3688;s:4:"🀇";i:3689;s:4:"🀈";i:3690;s:4:"🀉";i:3691;s:4:"🀊";i:3692;s:4:"🀋";i:3693;s:4:"🀌";i:3694;s:4:"ðŸ€";i:3695;s:4:"🀎";i:3696;s:4:"ðŸ€";i:3697;s:4:"ðŸ€";i:3698;s:4:"🀑";i:3699;s:4:"🀒";i:3700;s:4:"🀓";i:3701;s:4:"🀔";i:3702;s:4:"🀕";i:3703;s:4:"🀖";i:3704;s:4:"🀗";i:3705;s:4:"🀘";i:3706;s:4:"🀙";i:3707;s:4:"🀚";i:3708;s:4:"🀛";i:3709;s:4:"🀜";i:3710;s:4:"ðŸ€";i:3711;s:4:"🀞";i:3712;s:4:"🀟";i:3713;s:4:"🀠";i:3714;s:4:"🀡";i:3715;s:4:"🀢";i:3716;s:4:"🀣";i:3717;s:4:"🀤";i:3718;s:4:"🀥";i:3719;s:4:"🀦";i:3720;s:4:"🀧";i:3721;s:4:"🀨";i:3722;s:4:"🀩";i:3723;s:4:"🀪";i:3724;s:4:"🀫";i:3725;s:4:"🀰";i:3726;s:4:"🀱";i:3727;s:4:"🀲";i:3728;s:4:"🀳";i:3729;s:4:"🀴";i:3730;s:4:"🀵";i:3731;s:4:"🀶";i:3732;s:4:"🀷";i:3733;s:4:"🀸";i:3734;s:4:"🀹";i:3735;s:4:"🀺";i:3736;s:4:"🀻";i:3737;s:4:"🀼";i:3738;s:4:"🀽";i:3739;s:4:"🀾";i:3740;s:4:"🀿";i:3741;s:4:"ðŸ€";i:3742;s:4:"ðŸ";i:3743;s:4:"ðŸ‚";i:3744;s:4:"ðŸƒ";i:3745;s:4:"ðŸ„";i:3746;s:4:"ðŸ…";i:3747;s:4:"ðŸ†";i:3748;s:4:"ðŸ‡";i:3749;s:4:"ðŸˆ";i:3750;s:4:"ðŸ‰";i:3751;s:4:"ðŸŠ";i:3752;s:4:"ðŸ‹";i:3753;s:4:"ðŸŒ";i:3754;s:4:"ðŸ";i:3755;s:4:"ðŸŽ";i:3756;s:4:"ðŸ";i:3757;s:4:"ðŸ";i:3758;s:4:"ðŸ‘";i:3759;s:4:"ðŸ’";i:3760;s:4:"ðŸ“";i:3761;s:4:"ðŸ”";i:3762;s:4:"ðŸ•";i:3763;s:4:"ðŸ–";i:3764;s:4:"ðŸ—";i:3765;s:4:"ðŸ˜";i:3766;s:4:"ðŸ™";i:3767;s:4:"ðŸš";i:3768;s:4:"ðŸ›";i:3769;s:4:"ðŸœ";i:3770;s:4:"ðŸ";i:3771;s:4:"ðŸž";i:3772;s:4:"ðŸŸ";i:3773;s:4:"ðŸ ";i:3774;s:4:"ðŸ¡";i:3775;s:4:"ðŸ¢";i:3776;s:4:"ðŸ£";i:3777;s:4:"ðŸ¤";i:3778;s:4:"ðŸ¥";i:3779;s:4:"ðŸ¦";i:3780;s:4:"ðŸ§";i:3781;s:4:"ðŸ¨";i:3782;s:4:"ðŸ©";i:3783;s:4:"ðŸª";i:3784;s:4:"ðŸ«";i:3785;s:4:"ðŸ¬";i:3786;s:4:"ðŸ­";i:3787;s:4:"ðŸ®";i:3788;s:4:"ðŸ¯";i:3789;s:4:"ðŸ°";i:3790;s:4:"ðŸ±";i:3791;s:4:"ðŸ²";i:3792;s:4:"ðŸ³";i:3793;s:4:"ðŸ´";i:3794;s:4:"ðŸµ";i:3795;s:4:"ðŸ¶";i:3796;s:4:"ðŸ·";i:3797;s:4:"ðŸ¸";i:3798;s:4:"ðŸ¹";i:3799;s:4:"ðŸº";i:3800;s:4:"ðŸ»";i:3801;s:4:"ðŸ¼";i:3802;s:4:"ðŸ½";i:3803;s:4:"ðŸ¾";i:3804;s:4:"ðŸ¿";i:3805;s:4:"🂀";i:3806;s:4:"ðŸ‚";i:3807;s:4:"🂂";i:3808;s:4:"🂃";i:3809;s:4:"🂄";i:3810;s:4:"🂅";i:3811;s:4:"🂆";i:3812;s:4:"🂇";i:3813;s:4:"🂈";i:3814;s:4:"🂉";i:3815;s:4:"🂊";i:3816;s:4:"🂋";i:3817;s:4:"🂌";i:3818;s:4:"ðŸ‚";i:3819;s:4:"🂎";i:3820;s:4:"ðŸ‚";i:3821;s:4:"ðŸ‚";i:3822;s:4:"🂑";i:3823;s:4:"🂒";i:3824;s:4:"🂓";i:3825;s:4:"🂠";i:3826;s:4:"🂡";i:3827;s:4:"🂢";i:3828;s:4:"🂣";i:3829;s:4:"🂤";i:3830;s:4:"🂥";i:3831;s:4:"🂦";i:3832;s:4:"🂧";i:3833;s:4:"🂨";i:3834;s:4:"🂩";i:3835;s:4:"🂪";i:3836;s:4:"🂫";i:3837;s:4:"🂬";i:3838;s:4:"🂭";i:3839;s:4:"🂮";i:3840;s:4:"🂱";i:3841;s:4:"🂲";i:3842;s:4:"🂳";i:3843;s:4:"🂴";i:3844;s:4:"🂵";i:3845;s:4:"🂶";i:3846;s:4:"🂷";i:3847;s:4:"🂸";i:3848;s:4:"🂹";i:3849;s:4:"🂺";i:3850;s:4:"🂻";i:3851;s:4:"🂼";i:3852;s:4:"🂽";i:3853;s:4:"🂾";i:3854;s:4:"ðŸƒ";i:3855;s:4:"🃂";i:3856;s:4:"🃃";i:3857;s:4:"🃄";i:3858;s:4:"🃅";i:3859;s:4:"🃆";i:3860;s:4:"🃇";i:3861;s:4:"🃈";i:3862;s:4:"🃉";i:3863;s:4:"🃊";i:3864;s:4:"🃋";i:3865;s:4:"🃌";i:3866;s:4:"ðŸƒ";i:3867;s:4:"🃎";i:3868;s:4:"ðŸƒ";i:3869;s:4:"🃑";i:3870;s:4:"🃒";i:3871;s:4:"🃓";i:3872;s:4:"🃔";i:3873;s:4:"🃕";i:3874;s:4:"🃖";i:3875;s:4:"🃗";i:3876;s:4:"🃘";i:3877;s:4:"🃙";i:3878;s:4:"🃚";i:3879;s:4:"🃛";i:3880;s:4:"🃜";i:3881;s:4:"ðŸƒ";i:3882;s:4:"🃞";i:3883;s:4:"🃟";i:3884;s:4:"🌀";i:3885;s:4:"ðŸŒ";i:3886;s:4:"🌂";i:3887;s:4:"🌃";i:3888;s:4:"🌄";i:3889;s:4:"🌅";i:3890;s:4:"🌆";i:3891;s:4:"🌇";i:3892;s:4:"🌈";i:3893;s:4:"🌉";i:3894;s:4:"🌊";i:3895;s:4:"🌋";i:3896;s:4:"🌌";i:3897;s:4:"ðŸŒ";i:3898;s:4:"🌎";i:3899;s:4:"ðŸŒ";i:3900;s:4:"ðŸŒ";i:3901;s:4:"🌑";i:3902;s:4:"🌒";i:3903;s:4:"🌓";i:3904;s:4:"🌔";i:3905;s:4:"🌕";i:3906;s:4:"🌖";i:3907;s:4:"🌗";i:3908;s:4:"🌘";i:3909;s:4:"🌙";i:3910;s:4:"🌚";i:3911;s:4:"🌛";i:3912;s:4:"🌜";i:3913;s:4:"ðŸŒ";i:3914;s:4:"🌞";i:3915;s:4:"🌟";i:3916;s:4:"🌠";i:3917;s:4:"🌰";i:3918;s:4:"🌱";i:3919;s:4:"🌲";i:3920;s:4:"🌳";i:3921;s:4:"🌴";i:3922;s:4:"🌵";i:3923;s:4:"🌷";i:3924;s:4:"🌸";i:3925;s:4:"🌹";i:3926;s:4:"🌺";i:3927;s:4:"🌻";i:3928;s:4:"🌼";i:3929;s:4:"🌽";i:3930;s:4:"🌾";i:3931;s:4:"🌿";i:3932;s:4:"ðŸ€";i:3933;s:4:"ðŸ";i:3934;s:4:"ðŸ‚";i:3935;s:4:"ðŸƒ";i:3936;s:4:"ðŸ„";i:3937;s:4:"ðŸ…";i:3938;s:4:"ðŸ†";i:3939;s:4:"ðŸ‡";i:3940;s:4:"ðŸˆ";i:3941;s:4:"ðŸ‰";i:3942;s:4:"ðŸŠ";i:3943;s:4:"ðŸ‹";i:3944;s:4:"ðŸŒ";i:3945;s:4:"ðŸ";i:3946;s:4:"ðŸŽ";i:3947;s:4:"ðŸ";i:3948;s:4:"ðŸ";i:3949;s:4:"ðŸ‘";i:3950;s:4:"ðŸ’";i:3951;s:4:"ðŸ“";i:3952;s:4:"ðŸ”";i:3953;s:4:"ðŸ•";i:3954;s:4:"ðŸ–";i:3955;s:4:"ðŸ—";i:3956;s:4:"ðŸ˜";i:3957;s:4:"ðŸ™";i:3958;s:4:"ðŸš";i:3959;s:4:"ðŸ›";i:3960;s:4:"ðŸœ";i:3961;s:4:"ðŸ";i:3962;s:4:"ðŸž";i:3963;s:4:"ðŸŸ";i:3964;s:4:"ðŸ ";i:3965;s:4:"ðŸ¡";i:3966;s:4:"ðŸ¢";i:3967;s:4:"ðŸ£";i:3968;s:4:"ðŸ¤";i:3969;s:4:"ðŸ¥";i:3970;s:4:"ðŸ¦";i:3971;s:4:"ðŸ§";i:3972;s:4:"ðŸ¨";i:3973;s:4:"ðŸ©";i:3974;s:4:"ðŸª";i:3975;s:4:"ðŸ«";i:3976;s:4:"ðŸ¬";i:3977;s:4:"ðŸ­";i:3978;s:4:"ðŸ®";i:3979;s:4:"ðŸ¯";i:3980;s:4:"ðŸ°";i:3981;s:4:"ðŸ±";i:3982;s:4:"ðŸ²";i:3983;s:4:"ðŸ³";i:3984;s:4:"ðŸ´";i:3985;s:4:"ðŸµ";i:3986;s:4:"ðŸ¶";i:3987;s:4:"ðŸ·";i:3988;s:4:"ðŸ¸";i:3989;s:4:"ðŸ¹";i:3990;s:4:"ðŸº";i:3991;s:4:"ðŸ»";i:3992;s:4:"ðŸ¼";i:3993;s:4:"🎀";i:3994;s:4:"ðŸŽ";i:3995;s:4:"🎂";i:3996;s:4:"🎃";i:3997;s:4:"🎄";i:3998;s:4:"🎅";i:3999;s:4:"🎆";i:4000;s:4:"🎇";i:4001;s:4:"🎈";i:4002;s:4:"🎉";i:4003;s:4:"🎊";i:4004;s:4:"🎋";i:4005;s:4:"🎌";i:4006;s:4:"ðŸŽ";i:4007;s:4:"🎎";i:4008;s:4:"ðŸŽ";i:4009;s:4:"ðŸŽ";i:4010;s:4:"🎑";i:4011;s:4:"🎒";i:4012;s:4:"🎓";i:4013;s:4:"🎠";i:4014;s:4:"🎡";i:4015;s:4:"🎢";i:4016;s:4:"🎣";i:4017;s:4:"🎤";i:4018;s:4:"🎥";i:4019;s:4:"🎦";i:4020;s:4:"🎧";i:4021;s:4:"🎨";i:4022;s:4:"🎩";i:4023;s:4:"🎪";i:4024;s:4:"🎫";i:4025;s:4:"🎬";i:4026;s:4:"🎭";i:4027;s:4:"🎮";i:4028;s:4:"🎯";i:4029;s:4:"🎰";i:4030;s:4:"🎱";i:4031;s:4:"🎲";i:4032;s:4:"🎳";i:4033;s:4:"🎴";i:4034;s:4:"🎵";i:4035;s:4:"🎶";i:4036;s:4:"🎷";i:4037;s:4:"🎸";i:4038;s:4:"🎹";i:4039;s:4:"🎺";i:4040;s:4:"🎻";i:4041;s:4:"🎼";i:4042;s:4:"🎽";i:4043;s:4:"🎾";i:4044;s:4:"🎿";i:4045;s:4:"ðŸ€";i:4046;s:4:"ðŸ";i:4047;s:4:"ðŸ‚";i:4048;s:4:"ðŸƒ";i:4049;s:4:"ðŸ„";i:4050;s:4:"ðŸ†";i:4051;s:4:"ðŸ‡";i:4052;s:4:"ðŸˆ";i:4053;s:4:"ðŸ‰";i:4054;s:4:"ðŸŠ";i:4055;s:4:"ðŸ ";i:4056;s:4:"ðŸ¡";i:4057;s:4:"ðŸ¢";i:4058;s:4:"ðŸ£";i:4059;s:4:"ðŸ¤";i:4060;s:4:"ðŸ¥";i:4061;s:4:"ðŸ¦";i:4062;s:4:"ðŸ§";i:4063;s:4:"ðŸ¨";i:4064;s:4:"ðŸ©";i:4065;s:4:"ðŸª";i:4066;s:4:"ðŸ«";i:4067;s:4:"ðŸ¬";i:4068;s:4:"ðŸ­";i:4069;s:4:"ðŸ®";i:4070;s:4:"ðŸ¯";i:4071;s:4:"ðŸ°";i:4072;s:4:"ðŸ€";i:4073;s:4:"ðŸ";i:4074;s:4:"ðŸ‚";i:4075;s:4:"ðŸƒ";i:4076;s:4:"ðŸ„";i:4077;s:4:"ðŸ…";i:4078;s:4:"ðŸ†";i:4079;s:4:"ðŸ‡";i:4080;s:4:"ðŸˆ";i:4081;s:4:"ðŸ‰";i:4082;s:4:"ðŸŠ";i:4083;s:4:"ðŸ‹";i:4084;s:4:"ðŸŒ";i:4085;s:4:"ðŸ";i:4086;s:4:"ðŸŽ";i:4087;s:4:"ðŸ";i:4088;s:4:"ðŸ";i:4089;s:4:"ðŸ‘";i:4090;s:4:"ðŸ’";i:4091;s:4:"ðŸ“";i:4092;s:4:"ðŸ”";i:4093;s:4:"ðŸ•";i:4094;s:4:"ðŸ–";i:4095;s:4:"ðŸ—";i:4096;s:4:"ðŸ˜";i:4097;s:4:"ðŸ™";i:4098;s:4:"ðŸš";i:4099;s:4:"ðŸ›";i:4100;s:4:"ðŸœ";i:4101;s:4:"ðŸ";i:4102;s:4:"ðŸž";i:4103;s:4:"ðŸŸ";i:4104;s:4:"ðŸ ";i:4105;s:4:"ðŸ¡";i:4106;s:4:"ðŸ¢";i:4107;s:4:"ðŸ£";i:4108;s:4:"ðŸ¤";i:4109;s:4:"ðŸ¥";i:4110;s:4:"ðŸ¦";i:4111;s:4:"ðŸ§";i:4112;s:4:"ðŸ¨";i:4113;s:4:"ðŸ©";i:4114;s:4:"ðŸª";i:4115;s:4:"ðŸ«";i:4116;s:4:"ðŸ¬";i:4117;s:4:"ðŸ­";i:4118;s:4:"ðŸ®";i:4119;s:4:"ðŸ¯";i:4120;s:4:"ðŸ°";i:4121;s:4:"ðŸ±";i:4122;s:4:"ðŸ²";i:4123;s:4:"ðŸ³";i:4124;s:4:"ðŸ´";i:4125;s:4:"ðŸµ";i:4126;s:4:"ðŸ¶";i:4127;s:4:"ðŸ·";i:4128;s:4:"ðŸ¸";i:4129;s:4:"ðŸ¹";i:4130;s:4:"ðŸº";i:4131;s:4:"ðŸ»";i:4132;s:4:"ðŸ¼";i:4133;s:4:"ðŸ½";i:4134;s:4:"ðŸ¾";i:4135;s:4:"👀";i:4136;s:4:"👂";i:4137;s:4:"👃";i:4138;s:4:"👄";i:4139;s:4:"👅";i:4140;s:4:"👆";i:4141;s:4:"👇";i:4142;s:4:"👈";i:4143;s:4:"👉";i:4144;s:4:"👊";i:4145;s:4:"👋";i:4146;s:4:"👌";i:4147;s:4:"ðŸ‘";i:4148;s:4:"👎";i:4149;s:4:"ðŸ‘";i:4150;s:4:"ðŸ‘";i:4151;s:4:"👑";i:4152;s:4:"👒";i:4153;s:4:"👓";i:4154;s:4:"👔";i:4155;s:4:"👕";i:4156;s:4:"👖";i:4157;s:4:"👗";i:4158;s:4:"👘";i:4159;s:4:"👙";i:4160;s:4:"👚";i:4161;s:4:"👛";i:4162;s:4:"👜";i:4163;s:4:"ðŸ‘";i:4164;s:4:"👞";i:4165;s:4:"👟";i:4166;s:4:"👠";i:4167;s:4:"👡";i:4168;s:4:"👢";i:4169;s:4:"👣";i:4170;s:4:"👤";i:4171;s:4:"👥";i:4172;s:4:"👦";i:4173;s:4:"👧";i:4174;s:4:"👨";i:4175;s:4:"👩";i:4176;s:4:"👪";i:4177;s:4:"👫";i:4178;s:4:"👬";i:4179;s:4:"👭";i:4180;s:4:"👮";i:4181;s:4:"👯";i:4182;s:4:"👰";i:4183;s:4:"👱";i:4184;s:4:"👲";i:4185;s:4:"👳";i:4186;s:4:"👴";i:4187;s:4:"👵";i:4188;s:4:"👶";i:4189;s:4:"👷";i:4190;s:4:"👸";i:4191;s:4:"👹";i:4192;s:4:"👺";i:4193;s:4:"👻";i:4194;s:4:"👼";i:4195;s:4:"👽";i:4196;s:4:"👾";i:4197;s:4:"👿";i:4198;s:4:"💀";i:4199;s:4:"ðŸ’";i:4200;s:4:"💂";i:4201;s:4:"💃";i:4202;s:4:"💄";i:4203;s:4:"💅";i:4204;s:4:"💆";i:4205;s:4:"💇";i:4206;s:4:"💈";i:4207;s:4:"💉";i:4208;s:4:"💊";i:4209;s:4:"💋";i:4210;s:4:"💌";i:4211;s:4:"ðŸ’";i:4212;s:4:"💎";i:4213;s:4:"ðŸ’";i:4214;s:4:"ðŸ’";i:4215;s:4:"💑";i:4216;s:4:"💒";i:4217;s:4:"💓";i:4218;s:4:"💔";i:4219;s:4:"💕";i:4220;s:4:"💖";i:4221;s:4:"💗";i:4222;s:4:"💘";i:4223;s:4:"💙";i:4224;s:4:"💚";i:4225;s:4:"💛";i:4226;s:4:"💜";i:4227;s:4:"ðŸ’";i:4228;s:4:"💞";i:4229;s:4:"💟";i:4230;s:4:"💠";i:4231;s:4:"💡";i:4232;s:4:"💢";i:4233;s:4:"💣";i:4234;s:4:"💤";i:4235;s:4:"💥";i:4236;s:4:"💦";i:4237;s:4:"💧";i:4238;s:4:"💨";i:4239;s:4:"💩";i:4240;s:4:"💪";i:4241;s:4:"💫";i:4242;s:4:"💬";i:4243;s:4:"💭";i:4244;s:4:"💮";i:4245;s:4:"💯";i:4246;s:4:"💰";i:4247;s:4:"💱";i:4248;s:4:"💲";i:4249;s:4:"💳";i:4250;s:4:"💴";i:4251;s:4:"💵";i:4252;s:4:"💶";i:4253;s:4:"💷";i:4254;s:4:"💸";i:4255;s:4:"💹";i:4256;s:4:"💺";i:4257;s:4:"💻";i:4258;s:4:"💼";i:4259;s:4:"💽";i:4260;s:4:"💾";i:4261;s:4:"💿";i:4262;s:4:"📀";i:4263;s:4:"ðŸ“";i:4264;s:4:"📂";i:4265;s:4:"📃";i:4266;s:4:"📄";i:4267;s:4:"📅";i:4268;s:4:"📆";i:4269;s:4:"📇";i:4270;s:4:"📈";i:4271;s:4:"📉";i:4272;s:4:"📊";i:4273;s:4:"📋";i:4274;s:4:"📌";i:4275;s:4:"ðŸ“";i:4276;s:4:"📎";i:4277;s:4:"ðŸ“";i:4278;s:4:"ðŸ“";i:4279;s:4:"📑";i:4280;s:4:"📒";i:4281;s:4:"📓";i:4282;s:4:"📔";i:4283;s:4:"📕";i:4284;s:4:"📖";i:4285;s:4:"📗";i:4286;s:4:"📘";i:4287;s:4:"📙";i:4288;s:4:"📚";i:4289;s:4:"📛";i:4290;s:4:"📜";i:4291;s:4:"ðŸ“";i:4292;s:4:"📞";i:4293;s:4:"📟";i:4294;s:4:"📠";i:4295;s:4:"📡";i:4296;s:4:"📢";i:4297;s:4:"📣";i:4298;s:4:"📤";i:4299;s:4:"📥";i:4300;s:4:"📦";i:4301;s:4:"📧";i:4302;s:4:"📨";i:4303;s:4:"📩";i:4304;s:4:"📪";i:4305;s:4:"📫";i:4306;s:4:"📬";i:4307;s:4:"📭";i:4308;s:4:"📮";i:4309;s:4:"📯";i:4310;s:4:"📰";i:4311;s:4:"📱";i:4312;s:4:"📲";i:4313;s:4:"📳";i:4314;s:4:"📴";i:4315;s:4:"📵";i:4316;s:4:"📶";i:4317;s:4:"📷";i:4318;s:4:"📹";i:4319;s:4:"📺";i:4320;s:4:"📻";i:4321;s:4:"📼";i:4322;s:4:"🔀";i:4323;s:4:"ðŸ”";i:4324;s:4:"🔂";i:4325;s:4:"🔃";i:4326;s:4:"🔄";i:4327;s:4:"🔅";i:4328;s:4:"🔆";i:4329;s:4:"🔇";i:4330;s:4:"🔈";i:4331;s:4:"🔉";i:4332;s:4:"🔊";i:4333;s:4:"🔋";i:4334;s:4:"🔌";i:4335;s:4:"ðŸ”";i:4336;s:4:"🔎";i:4337;s:4:"ðŸ”";i:4338;s:4:"ðŸ”";i:4339;s:4:"🔑";i:4340;s:4:"🔒";i:4341;s:4:"🔓";i:4342;s:4:"🔔";i:4343;s:4:"🔕";i:4344;s:4:"🔖";i:4345;s:4:"🔗";i:4346;s:4:"🔘";i:4347;s:4:"🔙";i:4348;s:4:"🔚";i:4349;s:4:"🔛";i:4350;s:4:"🔜";i:4351;s:4:"ðŸ”";i:4352;s:4:"🔞";i:4353;s:4:"🔟";i:4354;s:4:"🔠";i:4355;s:4:"🔡";i:4356;s:4:"🔢";i:4357;s:4:"🔣";i:4358;s:4:"🔤";i:4359;s:4:"🔥";i:4360;s:4:"🔦";i:4361;s:4:"🔧";i:4362;s:4:"🔨";i:4363;s:4:"🔩";i:4364;s:4:"🔪";i:4365;s:4:"🔫";i:4366;s:4:"🔬";i:4367;s:4:"🔭";i:4368;s:4:"🔮";i:4369;s:4:"🔯";i:4370;s:4:"🔰";i:4371;s:4:"🔱";i:4372;s:4:"🔲";i:4373;s:4:"🔳";i:4374;s:4:"🔴";i:4375;s:4:"🔵";i:4376;s:4:"🔶";i:4377;s:4:"🔷";i:4378;s:4:"🔸";i:4379;s:4:"🔹";i:4380;s:4:"🔺";i:4381;s:4:"🔻";i:4382;s:4:"🔼";i:4383;s:4:"🔽";i:4384;s:4:"ðŸ•";i:4385;s:4:"🕑";i:4386;s:4:"🕒";i:4387;s:4:"🕓";i:4388;s:4:"🕔";i:4389;s:4:"🕕";i:4390;s:4:"🕖";i:4391;s:4:"🕗";i:4392;s:4:"🕘";i:4393;s:4:"🕙";i:4394;s:4:"🕚";i:4395;s:4:"🕛";i:4396;s:4:"🕜";i:4397;s:4:"ðŸ•";i:4398;s:4:"🕞";i:4399;s:4:"🕟";i:4400;s:4:"🕠";i:4401;s:4:"🕡";i:4402;s:4:"🕢";i:4403;s:4:"🕣";i:4404;s:4:"🕤";i:4405;s:4:"🕥";i:4406;s:4:"🕦";i:4407;s:4:"🕧";i:4408;s:4:"🗻";i:4409;s:4:"🗼";i:4410;s:4:"🗽";i:4411;s:4:"🗾";i:4412;s:4:"🗿";i:4413;s:4:"ðŸ˜";i:4414;s:4:"😂";i:4415;s:4:"😃";i:4416;s:4:"😄";i:4417;s:4:"😅";i:4418;s:4:"😆";i:4419;s:4:"😇";i:4420;s:4:"😈";i:4421;s:4:"😉";i:4422;s:4:"😊";i:4423;s:4:"😋";i:4424;s:4:"😌";i:4425;s:4:"ðŸ˜";i:4426;s:4:"😎";i:4427;s:4:"ðŸ˜";i:4428;s:4:"ðŸ˜";i:4429;s:4:"😒";i:4430;s:4:"😓";i:4431;s:4:"😔";i:4432;s:4:"😖";i:4433;s:4:"😘";i:4434;s:4:"😚";i:4435;s:4:"😜";i:4436;s:4:"ðŸ˜";i:4437;s:4:"😞";i:4438;s:4:"😠";i:4439;s:4:"😡";i:4440;s:4:"😢";i:4441;s:4:"😣";i:4442;s:4:"😤";i:4443;s:4:"😥";i:4444;s:4:"😨";i:4445;s:4:"😩";i:4446;s:4:"😪";i:4447;s:4:"😫";i:4448;s:4:"😭";i:4449;s:4:"😰";i:4450;s:4:"😱";i:4451;s:4:"😲";i:4452;s:4:"😳";i:4453;s:4:"😵";i:4454;s:4:"😶";i:4455;s:4:"😷";i:4456;s:4:"😸";i:4457;s:4:"😹";i:4458;s:4:"😺";i:4459;s:4:"😻";i:4460;s:4:"😼";i:4461;s:4:"😽";i:4462;s:4:"😾";i:4463;s:4:"😿";i:4464;s:4:"🙀";i:4465;s:4:"🙅";i:4466;s:4:"🙆";i:4467;s:4:"🙇";i:4468;s:4:"🙈";i:4469;s:4:"🙉";i:4470;s:4:"🙊";i:4471;s:4:"🙋";i:4472;s:4:"🙌";i:4473;s:4:"ðŸ™";i:4474;s:4:"🙎";i:4475;s:4:"ðŸ™";i:4476;s:4:"🚀";i:4477;s:4:"ðŸš";i:4478;s:4:"🚂";i:4479;s:4:"🚃";i:4480;s:4:"🚄";i:4481;s:4:"🚅";i:4482;s:4:"🚆";i:4483;s:4:"🚇";i:4484;s:4:"🚈";i:4485;s:4:"🚉";i:4486;s:4:"🚊";i:4487;s:4:"🚋";i:4488;s:4:"🚌";i:4489;s:4:"ðŸš";i:4490;s:4:"🚎";i:4491;s:4:"ðŸš";i:4492;s:4:"ðŸš";i:4493;s:4:"🚑";i:4494;s:4:"🚒";i:4495;s:4:"🚓";i:4496;s:4:"🚔";i:4497;s:4:"🚕";i:4498;s:4:"🚖";i:4499;s:4:"🚗";i:4500;s:4:"🚘";i:4501;s:4:"🚙";i:4502;s:4:"🚚";i:4503;s:4:"🚛";i:4504;s:4:"🚜";i:4505;s:4:"ðŸš";i:4506;s:4:"🚞";i:4507;s:4:"🚟";i:4508;s:4:"🚠";i:4509;s:4:"🚡";i:4510;s:4:"🚢";i:4511;s:4:"🚣";i:4512;s:4:"🚤";i:4513;s:4:"🚥";i:4514;s:4:"🚦";i:4515;s:4:"🚧";i:4516;s:4:"🚨";i:4517;s:4:"🚩";i:4518;s:4:"🚪";i:4519;s:4:"🚫";i:4520;s:4:"🚬";i:4521;s:4:"🚭";i:4522;s:4:"🚮";i:4523;s:4:"🚯";i:4524;s:4:"🚰";i:4525;s:4:"🚱";i:4526;s:4:"🚲";i:4527;s:4:"🚳";i:4528;s:4:"🚴";i:4529;s:4:"🚵";i:4530;s:4:"🚶";i:4531;s:4:"🚷";i:4532;s:4:"🚸";i:4533;s:4:"🚹";i:4534;s:4:"🚺";i:4535;s:4:"🚻";i:4536;s:4:"🚼";i:4537;s:4:"🚽";i:4538;s:4:"🚾";i:4539;s:4:"🚿";i:4540;s:4:"🛀";i:4541;s:4:"ðŸ›";i:4542;s:4:"🛂";i:4543;s:4:"🛃";i:4544;s:4:"🛄";i:4545;s:4:"🛅";i:4546;s:4:"🜀";i:4547;s:4:"ðŸœ";i:4548;s:4:"🜂";i:4549;s:4:"🜃";i:4550;s:4:"🜄";i:4551;s:4:"🜅";i:4552;s:4:"🜆";i:4553;s:4:"🜇";i:4554;s:4:"🜈";i:4555;s:4:"🜉";i:4556;s:4:"🜊";i:4557;s:4:"🜋";i:4558;s:4:"🜌";i:4559;s:4:"ðŸœ";i:4560;s:4:"🜎";i:4561;s:4:"ðŸœ";i:4562;s:4:"ðŸœ";i:4563;s:4:"🜑";i:4564;s:4:"🜒";i:4565;s:4:"🜓";i:4566;s:4:"🜔";i:4567;s:4:"🜕";i:4568;s:4:"🜖";i:4569;s:4:"🜗";i:4570;s:4:"🜘";i:4571;s:4:"🜙";i:4572;s:4:"🜚";i:4573;s:4:"🜛";i:4574;s:4:"🜜";i:4575;s:4:"ðŸœ";i:4576;s:4:"🜞";i:4577;s:4:"🜟";i:4578;s:4:"🜠";i:4579;s:4:"🜡";i:4580;s:4:"🜢";i:4581;s:4:"🜣";i:4582;s:4:"🜤";i:4583;s:4:"🜥";i:4584;s:4:"🜦";i:4585;s:4:"🜧";i:4586;s:4:"🜨";i:4587;s:4:"🜩";i:4588;s:4:"🜪";i:4589;s:4:"🜫";i:4590;s:4:"🜬";i:4591;s:4:"🜭";i:4592;s:4:"🜮";i:4593;s:4:"🜯";i:4594;s:4:"🜰";i:4595;s:4:"🜱";i:4596;s:4:"🜲";i:4597;s:4:"🜳";i:4598;s:4:"🜴";i:4599;s:4:"🜵";i:4600;s:4:"🜶";i:4601;s:4:"🜷";i:4602;s:4:"🜸";i:4603;s:4:"🜹";i:4604;s:4:"🜺";i:4605;s:4:"🜻";i:4606;s:4:"🜼";i:4607;s:4:"🜽";i:4608;s:4:"🜾";i:4609;s:4:"🜿";i:4610;s:4:"ðŸ€";i:4611;s:4:"ðŸ";i:4612;s:4:"ðŸ‚";i:4613;s:4:"ðŸƒ";i:4614;s:4:"ðŸ„";i:4615;s:4:"ðŸ…";i:4616;s:4:"ðŸ†";i:4617;s:4:"ðŸ‡";i:4618;s:4:"ðŸˆ";i:4619;s:4:"ðŸ‰";i:4620;s:4:"ðŸŠ";i:4621;s:4:"ðŸ‹";i:4622;s:4:"ðŸŒ";i:4623;s:4:"ðŸ";i:4624;s:4:"ðŸŽ";i:4625;s:4:"ðŸ";i:4626;s:4:"ðŸ";i:4627;s:4:"ðŸ‘";i:4628;s:4:"ðŸ’";i:4629;s:4:"ðŸ“";i:4630;s:4:"ðŸ”";i:4631;s:4:"ðŸ•";i:4632;s:4:"ðŸ–";i:4633;s:4:"ðŸ—";i:4634;s:4:"ðŸ˜";i:4635;s:4:"ðŸ™";i:4636;s:4:"ðŸš";i:4637;s:4:"ðŸ›";i:4638;s:4:"ðŸœ";i:4639;s:4:"ðŸ";i:4640;s:4:"ðŸž";i:4641;s:4:"ðŸŸ";i:4642;s:4:"ðŸ ";i:4643;s:4:"ðŸ¡";i:4644;s:4:"ðŸ¢";i:4645;s:4:"ðŸ£";i:4646;s:4:"ðŸ¤";i:4647;s:4:"ðŸ¥";i:4648;s:4:"ðŸ¦";i:4649;s:4:"ðŸ§";i:4650;s:4:"ðŸ¨";i:4651;s:4:"ðŸ©";i:4652;s:4:"ðŸª";i:4653;s:4:"ðŸ«";i:4654;s:4:"ðŸ¬";i:4655;s:4:"ðŸ­";i:4656;s:4:"ðŸ®";i:4657;s:4:"ðŸ¯";i:4658;s:4:"ðŸ°";i:4659;s:4:"ðŸ±";i:4660;s:4:"ðŸ²";i:4661;s:4:"ðŸ³";i:4662;s:3:"ã†";i:4663;s:3:"㆑";i:4664;s:3:"";i:4665;s:3:"�";i:4666;s:3:"৴";i:4667;s:3:"৵";i:4668;s:3:"৶";i:4669;s:3:"৷";i:4670;s:3:"৸";i:4671;s:3:"৹";i:4672;s:3:"à­²";i:4673;s:3:"à­³";i:4674;s:3:"à­´";i:4675;s:3:"à­µ";i:4676;s:3:"à­¶";i:4677;s:3:"à­·";i:4678;s:3:"ê °";i:4679;s:3:"ê ±";i:4680;s:3:"ê ²";i:4681;s:3:"ê ³";i:4682;s:3:"ê ´";i:4683;s:3:"ê µ";i:4684;s:3:"௰";i:4685;s:3:"௱";i:4686;s:3:"௲";i:4687;s:3:"൰";i:4688;s:3:"൱";i:4689;s:3:"൲";i:4690;s:3:"൳";i:4691;s:3:"൴";i:4692;s:3:"൵";i:4693;s:3:"á²";i:4694;s:3:"á³";i:4695;s:3:"á´";i:4696;s:3:"áµ";i:4697;s:3:"á¶";i:4698;s:3:"á·";i:4699;s:3:"á¸";i:4700;s:3:"á¹";i:4701;s:3:"áº";i:4702;s:3:"á»";i:4703;s:3:"á¼";i:4704;s:3:"ↀ";i:4705;s:3:"â†";i:4706;s:3:"ↂ";i:4707;s:3:"ↆ";i:4708;s:3:"ↇ";i:4709;s:3:"ↈ";i:4710;s:4:"ð¹©";i:4711;s:4:"ð¹ª";i:4712;s:4:"ð¹«";i:4713;s:4:"ð¹¬";i:4714;s:4:"ð¹­";i:4715;s:4:"ð¹®";i:4716;s:4:"ð¹¯";i:4717;s:4:"ð¹°";i:4718;s:4:"ð¹±";i:4719;s:4:"ð¹²";i:4720;s:4:"ð¹³";i:4721;s:4:"ð¹´";i:4722;s:4:"ð¹µ";i:4723;s:4:"ð¹¶";i:4724;s:4:"ð¹·";i:4725;s:4:"ð¹¸";i:4726;s:4:"ð¹¹";i:4727;s:4:"ð¹º";i:4728;s:4:"ð¹»";i:4729;s:4:"ð¹¼";i:4730;s:4:"ð¹½";i:4731;s:4:"ð¹¾";i:4732;s:3:"â³½";i:4733;s:4:"ðŒ¢";i:4734;s:4:"ðŒ£";i:4735;s:4:"ð„";i:4736;s:4:"ð„‘";i:4737;s:4:"ð„’";i:4738;s:4:"ð„“";i:4739;s:4:"ð„”";i:4740;s:4:"ð„•";i:4741;s:4:"ð„–";i:4742;s:4:"ð„—";i:4743;s:4:"ð„˜";i:4744;s:4:"ð„™";i:4745;s:4:"ð„š";i:4746;s:4:"ð„›";i:4747;s:4:"ð„œ";i:4748;s:4:"ð„";i:4749;s:4:"ð„ž";i:4750;s:4:"ð„Ÿ";i:4751;s:4:"ð„ ";i:4752;s:4:"ð„¡";i:4753;s:4:"ð„¢";i:4754;s:4:"ð„£";i:4755;s:4:"ð„¤";i:4756;s:4:"ð„¥";i:4757;s:4:"ð„¦";i:4758;s:4:"ð„§";i:4759;s:4:"ð„¨";i:4760;s:4:"ð„©";i:4761;s:4:"ð„ª";i:4762;s:4:"ð„«";i:4763;s:4:"ð„¬";i:4764;s:4:"ð„­";i:4765;s:4:"ð„®";i:4766;s:4:"ð„¯";i:4767;s:4:"ð„°";i:4768;s:4:"ð„±";i:4769;s:4:"ð„²";i:4770;s:4:"ð„³";i:4771;s:4:"ð…€";i:4772;s:4:"ð…";i:4773;s:4:"ð…„";i:4774;s:4:"ð……";i:4775;s:4:"ð…†";i:4776;s:4:"ð…‡";i:4777;s:4:"ð…‰";i:4778;s:4:"ð…Š";i:4779;s:4:"ð…‹";i:4780;s:4:"ð…Œ";i:4781;s:4:"ð…";i:4782;s:4:"ð…Ž";i:4783;s:4:"ð…";i:4784;s:4:"ð…‘";i:4785;s:4:"ð…’";i:4786;s:4:"ð…“";i:4787;s:4:"ð…”";i:4788;s:4:"ð…•";i:4789;s:4:"ð…–";i:4790;s:4:"ð…—";i:4791;s:4:"ð… ";i:4792;s:4:"ð…¡";i:4793;s:4:"ð…¢";i:4794;s:4:"ð…£";i:4795;s:4:"ð…¤";i:4796;s:4:"ð…¥";i:4797;s:4:"ð…¦";i:4798;s:4:"ð…§";i:4799;s:4:"ð…¨";i:4800;s:4:"ð…©";i:4801;s:4:"ð…ª";i:4802;s:4:"ð…«";i:4803;s:4:"ð…¬";i:4804;s:4:"ð…­";i:4805;s:4:"ð…®";i:4806;s:4:"ð…¯";i:4807;s:4:"ð…°";i:4808;s:4:"ð…±";i:4809;s:4:"ð…²";i:4810;s:4:"ð…´";i:4811;s:4:"ð…µ";i:4812;s:4:"ð…¶";i:4813;s:4:"ð…·";i:4814;s:4:"ð…¸";i:4815;s:4:"ð“";i:4816;s:4:"ð”";i:4817;s:4:"ð•";i:4818;s:4:"ð©¾";i:4819;s:4:"ð©¿";i:4820;s:4:"ð¤—";i:4821;s:4:"ð¤˜";i:4822;s:4:"ð¤™";i:4823;s:4:"ð¡›";i:4824;s:4:"ð¡œ";i:4825;s:4:"ð¡";i:4826;s:4:"ð¡ž";i:4827;s:4:"ð¡Ÿ";i:4828;s:4:"ð­œ";i:4829;s:4:"ð­";i:4830;s:4:"ð­ž";i:4831;s:4:"ð­Ÿ";i:4832;s:4:"ð­¼";i:4833;s:4:"ð­½";i:4834;s:4:"ð­¾";i:4835;s:4:"ð­¿";i:4836;s:4:"ð‘›";i:4837;s:4:"ð‘œ";i:4838;s:4:"ð‘";i:4839;s:4:"ð‘ž";i:4840;s:4:"ð‘Ÿ";i:4841;s:4:"ð‘ ";i:4842;s:4:"ð‘¡";i:4843;s:4:"ð‘¢";i:4844;s:4:"ð‘£";i:4845;s:4:"ð‘¤";i:4846;s:4:"ð‘¥";i:4847;s:4:"ð©„";i:4848;s:4:"ð©…";i:4849;s:4:"ð©†";i:4850;s:4:"ð©‡";i:4851;s:4:"ð’²";i:4852;s:4:"ð’³";i:4853;s:4:"ð’‘–";i:4854;s:4:"ð’‘—";i:4855;s:4:"ð’‘š";i:4856;s:4:"ð’‘›";i:4857;s:4:"ð’‘œ";i:4858;s:4:"ð’‘";i:4859;s:4:"ð’‘ž";i:4860;s:4:"ð’‘Ÿ";i:4861;s:4:"ð’‘ ";i:4862;s:4:"ð’‘¡";i:4863;s:4:"ð’‘¢";i:4864;s:4:"ð©";i:4865;s:4:"ðª";i:4866;s:4:"ð«";i:4867;s:4:"ð¬";i:4868;s:4:"ð­";i:4869;s:4:"ð®";i:4870;s:4:"ð¯";i:4871;s:4:"ð°";i:4872;s:4:"ð±";i:4873;s:2:"Ë";i:4874;s:2:"Ë‘";i:4875;s:3:"ॱ";i:4876;s:3:"ๆ";i:4877;s:3:"ໆ";i:4878;s:3:"ᪧ";i:4879;s:3:"ê§";i:4880;s:3:"ê©°";i:4881;s:3:"ê«";i:4882;s:3:"ã‚";i:4883;s:3:"ー";i:4884;s:3:"ヽ";i:4885;s:2:"¤";i:4886;s:2:"¢";i:4887;s:1:"$";i:4888;s:2:"£";i:4889;s:2:"Â¥";i:4890;s:2:"Ø‹";i:4891;s:3:"৲";i:4892;s:3:"৳";i:4893;s:3:"৻";i:4894;s:3:"૱";i:4895;s:3:"ê ¸";i:4896;s:3:"௹";i:4897;s:3:"฿";i:4898;s:3:"៛";i:4899;s:3:"â‚ ";i:4900;s:3:"â‚¡";i:4901;s:3:"â‚¢";i:4902;s:3:"â‚£";i:4903;s:3:"₤";i:4904;s:3:"â‚¥";i:4905;s:3:"₦";i:4906;s:3:"₧";i:4907;s:3:"â‚©";i:4908;s:3:"₪";i:4909;s:3:"â‚«";i:4910;s:3:"€";i:4911;s:3:"â‚­";i:4912;s:3:"â‚®";i:4913;s:3:"₯";i:4914;s:3:"â‚°";i:4915;s:3:"₱";i:4916;s:3:"₲";i:4917;s:3:"₳";i:4918;s:3:"â‚´";i:4919;s:3:"₵";i:4920;s:3:"₶";i:4921;s:3:"â‚·";i:4922;s:3:"₸";i:4923;s:3:"₹";i:4924;s:1:"0";i:4925;s:1:"1";i:4926;s:1:"2";i:4927;s:1:"3";i:4928;s:1:"4";i:4929;s:1:"5";i:4930;s:1:"6";i:4931;s:1:"7";i:4932;s:1:"8";i:4933;s:1:"9";i:4934;s:1:"A";i:4935;s:3:"á´€";i:4936;s:2:"Ⱥ";i:4937;s:3:"á¶";i:4938;s:3:"á´";i:4939;s:3:"á´‚";i:4940;s:3:"Ɐ";i:4941;s:3:"â±­";i:4942;s:3:"á¶";i:4943;s:3:"â±°";i:4944;s:1:"B";i:4945;s:2:"Ê™";i:4946;s:2:"Ƀ";i:4947;s:3:"á´¯";i:4948;s:3:"á´ƒ";i:4949;s:3:"ᵬ";i:4950;s:3:"ᶀ";i:4951;s:2:"Æ";i:4952;s:2:"Æ‚";i:4953;s:1:"C";i:4954;s:3:"á´„";i:4955;s:2:"È»";i:4956;s:2:"Ƈ";i:4957;s:2:"É•";i:4958;s:3:"Ↄ";i:4959;s:3:"Ꜿ";i:4960;s:1:"D";i:4961;s:3:"á´…";i:4962;s:3:"á´†";i:4963;s:3:"áµ­";i:4964;s:3:"á¶";i:4965;s:2:"Ɖ";i:4966;s:2:"ÆŠ";i:4967;s:3:"ᶑ";i:4968;s:2:"Æ‹";i:4969;s:2:"È¡";i:4970;s:3:"ê±";i:4971;s:3:"ẟ";i:4972;s:1:"E";i:4973;s:3:"á´‡";i:4974;s:2:"Ɇ";i:4975;s:3:"ᶒ";i:4976;s:3:"ⱸ";i:4977;s:2:"ÆŽ";i:4978;s:3:"â±»";i:4979;s:2:"Æ";i:4980;s:3:"ᶕ";i:4981;s:2:"Æ";i:4982;s:3:"ᶓ";i:4983;s:2:"ɘ";i:4984;s:2:"Éš";i:4985;s:2:"Éœ";i:4986;s:3:"ᶔ";i:4987;s:3:"á´ˆ";i:4988;s:2:"É";i:4989;s:2:"Éž";i:4990;s:2:"Êš";i:4991;s:2:"ɤ";i:4992;s:1:"F";i:4993;s:3:"ꜰ";i:4994;s:3:"áµ®";i:4995;s:3:"ᶂ";i:4996;s:2:"Æ‘";i:4997;s:3:"Ⅎ";i:4998;s:3:"ꟻ";i:4999;s:1:"G";i:5000;s:2:"É¡";i:5001;s:2:"É¢";i:5002;s:2:"Ǥ";i:5003;s:3:"ᶃ";i:5004;s:2:"Æ“";i:5005;s:2:"Ê›";i:5006;s:3:"áµ·";i:5007;s:3:"ê¾";i:5008;s:2:"Æ”";i:5009;s:2:"Æ¢";i:5010;s:1:"H";i:5011;s:2:"Êœ";i:5012;s:2:"Ƕ";i:5013;s:2:"ɦ";i:5014;s:3:"Ⱨ";i:5015;s:3:"â±µ";i:5016;s:3:"Ꜧ";i:5017;s:2:"ɧ";i:5018;s:2:"Ê»";i:5019;s:2:"ʽ";i:5020;s:1:"I";i:5021;s:2:"ı";i:5022;s:2:"ɪ";i:5023;s:3:"ꟾ";i:5024;s:3:"á´‰";i:5025;s:2:"Æ—";i:5026;s:3:"áµ»";i:5027;s:3:"ᶖ";i:5028;s:2:"Æ–";i:5029;s:3:"áµ¼";i:5030;s:1:"J";i:5031;s:2:"È·";i:5032;s:3:"á´Š";i:5033;s:2:"Ɉ";i:5034;s:2:"Ê";i:5035;s:2:"ÉŸ";i:5036;s:2:"Ê„";i:5037;s:1:"K";i:5038;s:3:"á´‹";i:5039;s:3:"ᶄ";i:5040;s:2:"Ƙ";i:5041;s:3:"Ⱪ";i:5042;s:3:"ê€";i:5043;s:3:"ê‚";i:5044;s:3:"ê„";i:5045;s:2:"Êž";i:5046;s:1:"L";i:5047;s:2:"ÊŸ";i:5048;s:3:"ê†";i:5049;s:3:"á´Œ";i:5050;s:3:"êˆ";i:5051;s:2:"Ƚ";i:5052;s:3:"â± ";i:5053;s:3:"â±¢";i:5054;s:2:"ɬ";i:5055;s:3:"ᶅ";i:5056;s:2:"É­";i:5057;s:3:"ꞎ";i:5058;s:2:"È´";i:5059;s:3:"ê²";i:5060;s:2:"É®";i:5061;s:3:"Ꞁ";i:5062;s:2:"Æ›";i:5063;s:2:"ÊŽ";i:5064;s:1:"M";i:5065;s:3:"á´";i:5066;s:3:"ᵯ";i:5067;s:3:"ᶆ";i:5068;s:3:"â±®";i:5069;s:3:"ꟽ";i:5070;s:3:"ꟿ";i:5071;s:3:"ê³";i:5072;s:1:"N";i:5073;s:2:"É´";i:5074;s:3:"á´»";i:5075;s:3:"á´Ž";i:5076;s:3:"áµ°";i:5077;s:2:"Æ";i:5078;s:2:"È ";i:5079;s:3:"êž";i:5080;s:3:"ᶇ";i:5081;s:2:"ɳ";i:5082;s:2:"ȵ";i:5083;s:3:"ê´";i:5084;s:2:"ÅŠ";i:5085;s:1:"O";i:5086;s:3:"á´";i:5087;s:3:"á´‘";i:5088;s:2:"ɶ";i:5089;s:3:"á´”";i:5090;s:3:"á´“";i:5091;s:2:"Ɔ";i:5092;s:3:"á´";i:5093;s:3:"á´’";i:5094;s:3:"ᶗ";i:5095;s:3:"êŒ";i:5096;s:3:"á´–";i:5097;s:3:"á´—";i:5098;s:3:"ⱺ";i:5099;s:2:"ÆŸ";i:5100;s:3:"êŠ";i:5101;s:2:"É·";i:5102;s:2:"È¢";i:5103;s:3:"á´•";i:5104;s:1:"P";i:5105;s:3:"á´˜";i:5106;s:3:"â±£";i:5107;s:3:"ê";i:5108;s:3:"áµ±";i:5109;s:3:"ᶈ";i:5110;s:2:"Ƥ";i:5111;s:3:"ê’";i:5112;s:3:"ê”";i:5113;s:3:"ꟼ";i:5114;s:2:"ɸ";i:5115;s:3:"â±·";i:5116;s:1:"Q";i:5117;s:3:"ê–";i:5118;s:3:"ê˜";i:5119;s:2:"Ê ";i:5120;s:2:"ÉŠ";i:5121;s:2:"ĸ";i:5122;s:1:"R";i:5123;s:2:"Ʀ";i:5124;s:3:"êš";i:5125;s:3:"á´™";i:5126;s:2:"ÉŒ";i:5127;s:3:"áµ²";i:5128;s:2:"ɹ";i:5129;s:3:"á´š";i:5130;s:2:"ɺ";i:5131;s:3:"ᶉ";i:5132;s:2:"É»";i:5133;s:3:"â±¹";i:5134;s:2:"ɼ";i:5135;s:3:"Ɽ";i:5136;s:2:"ɾ";i:5137;s:3:"áµ³";i:5138;s:2:"É¿";i:5139;s:2:"Ê";i:5140;s:3:"êµ";i:5141;s:3:"ê¶";i:5142;s:3:"êœ";i:5143;s:1:"S";i:5144;s:3:"ꜱ";i:5145;s:3:"áµ´";i:5146;s:3:"ᶊ";i:5147;s:2:"Ê‚";i:5148;s:3:"â±¾";i:5149;s:3:"ẜ";i:5150;s:3:"áº";i:5151;s:2:"Æ©";i:5152;s:3:"ᶋ";i:5153;s:2:"ƪ";i:5154;s:2:"Ê…";i:5155;s:3:"ᶘ";i:5156;s:2:"ʆ";i:5157;s:1:"T";i:5158;s:3:"á´›";i:5159;s:2:"Ŧ";i:5160;s:2:"Ⱦ";i:5161;s:3:"áµµ";i:5162;s:2:"Æ«";i:5163;s:2:"Ƭ";i:5164;s:2:"Æ®";i:5165;s:2:"ȶ";i:5166;s:3:"ê·";i:5167;s:2:"ʇ";i:5168;s:1:"U";i:5169;s:3:"á´œ";i:5170;s:3:"á´";i:5171;s:3:"á´ž";i:5172;s:3:"ᵫ";i:5173;s:2:"É„";i:5174;s:3:"áµ¾";i:5175;s:3:"ᶙ";i:5176;s:3:"êž";i:5177;s:2:"Ê®";i:5178;s:2:"ʯ";i:5179;s:2:"Æœ";i:5180;s:3:"ꟺ";i:5181;s:3:"á´Ÿ";i:5182;s:2:"É°";i:5183;s:2:"Ʊ";i:5184;s:3:"ᵿ";i:5185;s:1:"V";i:5186;s:3:"á´ ";i:5187;s:3:"êž";i:5188;s:3:"ᶌ";i:5189;s:2:"Ʋ";i:5190;s:3:"â±±";i:5191;s:3:"â±´";i:5192;s:3:"Ỽ";i:5193;s:2:"É…";i:5194;s:1:"W";i:5195;s:3:"á´¡";i:5196;s:3:"â±²";i:5197;s:2:"Ê";i:5198;s:1:"X";i:5199;s:3:"á¶";i:5200;s:1:"Y";i:5201;s:2:"Ê";i:5202;s:2:"ÉŽ";i:5203;s:2:"Ƴ";i:5204;s:3:"Ỿ";i:5205;s:1:"Z";i:5206;s:3:"á´¢";i:5207;s:2:"Ƶ";i:5208;s:3:"ᵶ";i:5209;s:3:"ᶎ";i:5210;s:2:"Ȥ";i:5211;s:2:"Ê";i:5212;s:2:"Ê‘";i:5213;s:3:"Ɀ";i:5214;s:3:"Ⱬ";i:5215;s:3:"ê¢";i:5216;s:2:"Æ·";i:5217;s:3:"á´£";i:5218;s:2:"Ƹ";i:5219;s:3:"ᶚ";i:5220;s:2:"ƺ";i:5221;s:2:"Ê“";i:5222;s:2:"Èœ";i:5223;s:2:"Þ";i:5224;s:3:"ê¤";i:5225;s:3:"ê¦";i:5226;s:2:"Ç·";i:5227;s:3:"ê¨";i:5228;s:3:"êª";i:5229;s:3:"ê¬";i:5230;s:3:"ê®";i:5231;s:3:"ê¸";i:5232;s:2:"Æ»";i:5233;s:3:"Ꜫ";i:5234;s:3:"Ꜭ";i:5235;s:3:"Ꜯ";i:5236;s:2:"Ƨ";i:5237;s:2:"Ƽ";i:5238;s:2:"Æ„";i:5239;s:2:"Ê”";i:5240;s:2:"É";i:5241;s:2:"Ë€";i:5242;s:2:"ʼ";i:5243;s:2:"Ë®";i:5244;s:2:"ʾ";i:5245;s:3:"Ꜣ";i:5246;s:3:"êž‹";i:5247;s:2:"Ê•";i:5248;s:2:"Ê¿";i:5249;s:2:"Ë";i:5250;s:3:"á´¤";i:5251;s:3:"á´¥";i:5252;s:3:"Ꜥ";i:5253;s:2:"Ê¡";i:5254;s:2:"Ê¢";i:5255;s:2:"Ê–";i:5256;s:2:"Ç€";i:5257;s:2:"Ç";i:5258;s:2:"Ç‚";i:5259;s:2:"ǃ";i:5260;s:2:"Ê—";i:5261;s:2:"ʘ";i:5262;s:2:"ʬ";i:5263;s:2:"Ê­";i:5264;s:2:"Α";i:5265;s:2:"Î’";i:5266;s:2:"Γ";i:5267;s:3:"á´¦";i:5268;s:2:"Δ";i:5269;s:2:"Ε";i:5270;s:2:"Ïœ";i:5271;s:2:"Ͷ";i:5272;s:2:"Ïš";i:5273;s:2:"Ζ";i:5274;s:2:"Í°";i:5275;s:2:"Η";i:5276;s:2:"Θ";i:5277;s:2:"Ι";i:5278;s:2:"ϳ";i:5279;s:2:"Κ";i:5280;s:2:"Λ";i:5281;s:3:"á´§";i:5282;s:2:"Îœ";i:5283;s:2:"Î";i:5284;s:2:"Ξ";i:5285;s:2:"Ο";i:5286;s:2:"Π";i:5287;s:3:"á´¨";i:5288;s:2:"Ϻ";i:5289;s:2:"Ïž";i:5290;s:2:"Ϙ";i:5291;s:2:"Ρ";i:5292;s:3:"á´©";i:5293;s:2:"ϼ";i:5294;s:2:"Σ";i:5295;s:2:"Ͼ";i:5296;s:2:"Ͻ";i:5297;s:2:"Ï¿";i:5298;s:2:"Τ";i:5299;s:2:"Î¥";i:5300;s:2:"Φ";i:5301;s:2:"Χ";i:5302;s:2:"Ψ";i:5303;s:3:"á´ª";i:5304;s:2:"Ω";i:5305;s:2:"Ï ";i:5306;s:2:"Ͳ";i:5307;s:2:"Ï·";i:5308;s:3:"â²€";i:5309;s:3:"Ⲃ";i:5310;s:3:"Ⲅ";i:5311;s:3:"Ⲇ";i:5312;s:3:"Ⲉ";i:5313;s:3:"Ⲷ";i:5314;s:3:"Ⲋ";i:5315;s:3:"Ⲍ";i:5316;s:3:"Ⲏ";i:5317;s:3:"â²";i:5318;s:3:"â²’";i:5319;s:3:"â²”";i:5320;s:3:"Ⲹ";i:5321;s:3:"â²–";i:5322;s:3:"Ⲙ";i:5323;s:3:"Ⲛ";i:5324;s:3:"Ⲻ";i:5325;s:3:"â²¼";i:5326;s:3:"Ⲝ";i:5327;s:3:"Ⲟ";i:5328;s:3:"â² ";i:5329;s:3:"â²¢";i:5330;s:3:"Ⲥ";i:5331;s:3:"Ⲧ";i:5332;s:3:"Ⲩ";i:5333;s:3:"Ⲫ";i:5334;s:3:"Ⲭ";i:5335;s:3:"â²®";i:5336;s:3:"â²°";i:5337;s:3:"â²¾";i:5338;s:3:"â³€";i:5339;s:2:"Ï¢";i:5340;s:3:"Ⳬ";i:5341;s:3:"Ⳃ";i:5342;s:3:"Ⳅ";i:5343;s:3:"Ⳇ";i:5344;s:2:"Ϥ";i:5345;s:2:"Ϧ";i:5346;s:3:"Ⳉ";i:5347;s:2:"Ϩ";i:5348;s:3:"Ⳋ";i:5349;s:3:"Ⳍ";i:5350;s:3:"Ⳏ";i:5351;s:3:"â³";i:5352;s:3:"â³’";i:5353;s:3:"â³”";i:5354;s:2:"Ϫ";i:5355;s:3:"â³­";i:5356;s:3:"â³–";i:5357;s:2:"Ϭ";i:5358;s:3:"Ⳙ";i:5359;s:3:"Ⳛ";i:5360;s:3:"Ⳝ";i:5361;s:2:"Ï®";i:5362;s:3:"â²²";i:5363;s:3:"â²´";i:5364;s:3:"Ⳟ";i:5365;s:3:"â³ ";i:5366;s:3:"â³¢";i:5367;s:2:"Ð";i:5368;s:2:"Ó";i:5369;s:2:"Ó’";i:5370;s:2:"Ó˜";i:5371;s:2:"Óš";i:5372;s:2:"Ó”";i:5373;s:2:"Б";i:5374;s:2:"Ð’";i:5375;s:2:"Г";i:5376;s:2:"Ò’";i:5377;s:2:"Óº";i:5378;s:2:"Ò”";i:5379;s:2:"Ó¶";i:5380;s:2:"Д";i:5381;s:2:"Ô€";i:5382;s:3:"Ꚁ";i:5383;s:2:"Ђ";i:5384;s:3:"Ꙣ";i:5385;s:2:"Ô‚";i:5386;s:2:"Ѓ";i:5387;s:2:"Ò˜";i:5388;s:2:"Е";i:5389;s:2:"Ó–";i:5390;s:2:"Є";i:5391;s:2:"Ж";i:5392;s:3:"êš„";i:5393;s:2:"Óœ";i:5394;s:2:"Ò–";i:5395;s:2:"З";i:5396;s:3:"Ꙁ";i:5397;s:2:"Ô„";i:5398;s:2:"Ô";i:5399;s:2:"Óž";i:5400;s:3:"Ꙃ";i:5401;s:2:"Ð…";i:5402;s:3:"Ꙅ";i:5403;s:2:"Ó ";i:5404;s:3:"Ꚉ";i:5405;s:2:"Ô†";i:5406;s:3:"êš‚";i:5407;s:2:"И";i:5408;s:2:"ÒŠ";i:5409;s:2:"Ó¤";i:5410;s:2:"І";i:5411;s:3:"Ꙇ";i:5412;s:2:"Ї";i:5413;s:2:"Й";i:5414;s:2:"Ј";i:5415;s:3:"Ꙉ";i:5416;s:2:"К";i:5417;s:2:"Òš";i:5418;s:2:"Óƒ";i:5419;s:2:"Ò ";i:5420;s:2:"Òž";i:5421;s:2:"Òœ";i:5422;s:2:"Ôž";i:5423;s:2:"Ôš";i:5424;s:2:"Л";i:5425;s:3:"á´«";i:5426;s:2:"Ó…";i:5427;s:2:"Ô’";i:5428;s:2:"Ô ";i:5429;s:2:"Љ";i:5430;s:3:"Ꙥ";i:5431;s:2:"Ôˆ";i:5432;s:2:"Ô”";i:5433;s:2:"Ðœ";i:5434;s:2:"Ó";i:5435;s:3:"Ꙧ";i:5436;s:2:"Ð";i:5437;s:2:"Ó‰";i:5438;s:2:"Ò¢";i:5439;s:2:"Ó‡";i:5440;s:2:"Ô¢";i:5441;s:2:"Ò¤";i:5442;s:2:"Њ";i:5443;s:2:"ÔŠ";i:5444;s:2:"О";i:5445;s:2:"Ó¦";i:5446;s:2:"Ó¨";i:5447;s:2:"Óª";i:5448;s:2:"П";i:5449;s:2:"Ô¤";i:5450;s:2:"Ò¦";i:5451;s:2:"Ò€";i:5452;s:2:"Р";i:5453;s:2:"ÒŽ";i:5454;s:2:"Ô–";i:5455;s:2:"С";i:5456;s:2:"ÔŒ";i:5457;s:2:"Òª";i:5458;s:2:"Т";i:5459;s:3:"Ꚍ";i:5460;s:2:"ÔŽ";i:5461;s:2:"Ò¬";i:5462;s:3:"Ꚋ";i:5463;s:2:"Ћ";i:5464;s:2:"ÐŒ";i:5465;s:2:"У";i:5466;s:2:"ÐŽ";i:5467;s:2:"Ó°";i:5468;s:2:"Ó²";i:5469;s:2:"Ò®";i:5470;s:2:"Ò°";i:5471;s:3:"Ꙋ";i:5472;s:2:"Ѹ";i:5473;s:2:"Ф";i:5474;s:2:"Ð¥";i:5475;s:2:"Ó¼";i:5476;s:2:"Ó¾";i:5477;s:2:"Ò²";i:5478;s:2:"Òº";i:5479;s:2:"Ô¦";i:5480;s:3:"êš”";i:5481;s:2:"Ñ ";i:5482;s:2:"Ѿ";i:5483;s:3:"Ꙍ";i:5484;s:2:"Ѽ";i:5485;s:2:"Ѻ";i:5486;s:2:"Ц";i:5487;s:3:"ê™ ";i:5488;s:3:"Ꚏ";i:5489;s:2:"Ò´";i:5490;s:3:"êš";i:5491;s:2:"Ч";i:5492;s:3:"êš’";i:5493;s:2:"Ó´";i:5494;s:2:"Ò¶";i:5495;s:2:"Ó‹";i:5496;s:2:"Ò¸";i:5497;s:3:"Ꚇ";i:5498;s:2:"Ò¼";i:5499;s:2:"Ò¾";i:5500;s:2:"Ð";i:5501;s:2:"Ш";i:5502;s:3:"êš–";i:5503;s:2:"Щ";i:5504;s:3:"Ꙏ";i:5505;s:3:"ⸯ";i:5506;s:3:"ꙿ";i:5507;s:2:"Ъ";i:5508;s:3:"ê™";i:5509;s:2:"Ы";i:5510;s:2:"Ó¸";i:5511;s:2:"Ь";i:5512;s:2:"ÒŒ";i:5513;s:2:"Ñ¢";i:5514;s:3:"ê™’";i:5515;s:2:"Э";i:5516;s:2:"Ó¬";i:5517;s:2:"Ю";i:5518;s:3:"ê™”";i:5519;s:3:"ê™–";i:5520;s:2:"Я";i:5521;s:2:"Ô˜";i:5522;s:2:"Ѥ";i:5523;s:2:"Ѧ";i:5524;s:3:"Ꙙ";i:5525;s:2:"Ѫ";i:5526;s:3:"Ꙛ";i:5527;s:2:"Ѩ";i:5528;s:3:"Ꙝ";i:5529;s:2:"Ѭ";i:5530;s:2:"Ñ®";i:5531;s:2:"Ñ°";i:5532;s:2:"Ѳ";i:5533;s:2:"Ñ´";i:5534;s:2:"Ѷ";i:5535;s:3:"Ꙟ";i:5536;s:2:"Ò¨";i:5537;s:2:"Ôœ";i:5538;s:2:"Ó€";i:5539;s:3:"â°€";i:5540;s:3:"â°";i:5541;s:3:"â°‚";i:5542;s:3:"â°ƒ";i:5543;s:3:"â°„";i:5544;s:3:"â°…";i:5545;s:3:"â°†";i:5546;s:3:"â°‡";i:5547;s:3:"â°ˆ";i:5548;s:3:"â°‰";i:5549;s:3:"â°Š";i:5550;s:3:"â°‹";i:5551;s:3:"â°Œ";i:5552;s:3:"â°";i:5553;s:3:"â°Ž";i:5554;s:3:"â°";i:5555;s:3:"â°";i:5556;s:3:"â°‘";i:5557;s:3:"â°’";i:5558;s:3:"â°“";i:5559;s:3:"â°”";i:5560;s:3:"â°•";i:5561;s:3:"â°–";i:5562;s:3:"â°—";i:5563;s:3:"â°˜";i:5564;s:3:"â°™";i:5565;s:3:"â°š";i:5566;s:3:"â°›";i:5567;s:3:"â°œ";i:5568;s:3:"â°";i:5569;s:3:"â°ž";i:5570;s:3:"â°Ÿ";i:5571;s:3:"â° ";i:5572;s:3:"â°¡";i:5573;s:3:"â°¢";i:5574;s:3:"â°£";i:5575;s:3:"â°¤";i:5576;s:3:"â°¥";i:5577;s:3:"â°¦";i:5578;s:3:"â°§";i:5579;s:3:"â°¨";i:5580;s:3:"â°©";i:5581;s:3:"â°ª";i:5582;s:3:"â°«";i:5583;s:3:"â°¬";i:5584;s:3:"â°­";i:5585;s:3:"â°®";i:5586;s:3:"áƒ";i:5587;s:3:"á‚ ";i:5588;s:3:"ბ";i:5589;s:3:"á‚¡";i:5590;s:3:"გ";i:5591;s:3:"á‚¢";i:5592;s:3:"დ";i:5593;s:3:"á‚£";i:5594;s:3:"ე";i:5595;s:3:"Ⴄ";i:5596;s:3:"ვ";i:5597;s:3:"á‚¥";i:5598;s:3:"ზ";i:5599;s:3:"Ⴆ";i:5600;s:3:"ჱ";i:5601;s:3:"áƒ";i:5602;s:3:"თ";i:5603;s:3:"Ⴇ";i:5604;s:3:"ი";i:5605;s:3:"Ⴈ";i:5606;s:3:"კ";i:5607;s:3:"á‚©";i:5608;s:3:"ლ";i:5609;s:3:"Ⴊ";i:5610;s:3:"მ";i:5611;s:3:"á‚«";i:5612;s:3:"ნ";i:5613;s:3:"Ⴌ";i:5614;s:3:"ჲ";i:5615;s:3:"Ⴢ";i:5616;s:3:"áƒ";i:5617;s:3:"á‚­";i:5618;s:3:"პ";i:5619;s:3:"á‚®";i:5620;s:3:"ჟ";i:5621;s:3:"Ⴏ";i:5622;s:3:"რ";i:5623;s:3:"á‚°";i:5624;s:3:"ს";i:5625;s:3:"Ⴑ";i:5626;s:3:"ტ";i:5627;s:3:"Ⴒ";i:5628;s:3:"ჳ";i:5629;s:3:"Ⴣ";i:5630;s:3:"უ";i:5631;s:3:"Ⴓ";i:5632;s:3:"ფ";i:5633;s:3:"á‚´";i:5634;s:3:"ქ";i:5635;s:3:"Ⴕ";i:5636;s:3:"ღ";i:5637;s:3:"Ⴖ";i:5638;s:3:"ყ";i:5639;s:3:"á‚·";i:5640;s:3:"შ";i:5641;s:3:"Ⴘ";i:5642;s:3:"ჩ";i:5643;s:3:"Ⴙ";i:5644;s:3:"ც";i:5645;s:3:"Ⴚ";i:5646;s:3:"ძ";i:5647;s:3:"á‚»";i:5648;s:3:"წ";i:5649;s:3:"Ⴜ";i:5650;s:3:"ჭ";i:5651;s:3:"Ⴝ";i:5652;s:3:"ხ";i:5653;s:3:"Ⴞ";i:5654;s:3:"ჴ";i:5655;s:3:"Ⴤ";i:5656;s:3:"ჯ";i:5657;s:3:"á‚¿";i:5658;s:3:"ჰ";i:5659;s:3:"Ⴠ";i:5660;s:3:"ჵ";i:5661;s:3:"Ⴥ";i:5662;s:3:"ჶ";i:5663;s:3:"ჷ";i:5664;s:3:"ჸ";i:5665;s:3:"ჹ";i:5666;s:3:"ჺ";i:5667;s:2:"Ô±";i:5668;s:2:"Ô²";i:5669;s:2:"Ô³";i:5670;s:2:"Ô´";i:5671;s:2:"Ôµ";i:5672;s:2:"Ô¶";i:5673;s:2:"Ô·";i:5674;s:2:"Ô¸";i:5675;s:2:"Ô¹";i:5676;s:2:"Ôº";i:5677;s:2:"Ô»";i:5678;s:2:"Ô¼";i:5679;s:2:"Ô½";i:5680;s:2:"Ô¾";i:5681;s:2:"Ô¿";i:5682;s:2:"Õ€";i:5683;s:2:"Õ";i:5684;s:2:"Õ‚";i:5685;s:2:"Õƒ";i:5686;s:2:"Õ„";i:5687;s:2:"Õ…";i:5688;s:2:"Õ†";i:5689;s:2:"Õ‡";i:5690;s:2:"Õˆ";i:5691;s:2:"Õ‰";i:5692;s:2:"ÕŠ";i:5693;s:2:"Õ‹";i:5694;s:2:"ÕŒ";i:5695;s:2:"Õ";i:5696;s:2:"ÕŽ";i:5697;s:2:"Õ";i:5698;s:2:"Õ";i:5699;s:2:"Õ‘";i:5700;s:2:"Õ’";i:5701;s:2:"Õ“";i:5702;s:2:"Õ”";i:5703;s:2:"Õ•";i:5704;s:2:"Õ–";i:5705;s:2:"Õ™";i:5706;s:2:"×";i:5707;s:2:"ב";i:5708;s:2:"×’";i:5709;s:2:"ד";i:5710;s:2:"×”";i:5711;s:2:"ו";i:5712;s:2:"×–";i:5713;s:2:"×—";i:5714;s:2:"ט";i:5715;s:2:"×™";i:5716;s:2:"ך";i:5717;s:2:"ל";i:5718;s:2:"×";i:5719;s:2:"ן";i:5720;s:2:"ס";i:5721;s:2:"×¢";i:5722;s:2:"×£";i:5723;s:2:"×¥";i:5724;s:2:"ק";i:5725;s:2:"ר";i:5726;s:2:"ש";i:5727;s:2:"ת";i:5728;s:4:"ð¤€";i:5729;s:4:"ð¤";i:5730;s:4:"ð¤‚";i:5731;s:4:"ð¤ƒ";i:5732;s:4:"ð¤„";i:5733;s:4:"ð¤…";i:5734;s:4:"ð¤†";i:5735;s:4:"ð¤‡";i:5736;s:4:"ð¤ˆ";i:5737;s:4:"ð¤‰";i:5738;s:4:"ð¤Š";i:5739;s:4:"ð¤‹";i:5740;s:4:"ð¤Œ";i:5741;s:4:"ð¤";i:5742;s:4:"ð¤Ž";i:5743;s:4:"ð¤";i:5744;s:4:"ð¤";i:5745;s:4:"ð¤‘";i:5746;s:4:"ð¤’";i:5747;s:4:"ð¤“";i:5748;s:4:"ð¤”";i:5749;s:4:"ð¤•";i:5750;s:3:"à €";i:5751;s:3:"à ";i:5752;s:3:"à ‚";i:5753;s:3:"à ƒ";i:5754;s:3:"à „";i:5755;s:3:"à …";i:5756;s:3:"à †";i:5757;s:3:"à ‡";i:5758;s:3:"à ˆ";i:5759;s:3:"à ‰";i:5760;s:3:"à Š";i:5761;s:3:"à ‹";i:5762;s:3:"à Œ";i:5763;s:3:"à ";i:5764;s:3:"à Ž";i:5765;s:3:"à ";i:5766;s:3:"à ";i:5767;s:3:"à ‘";i:5768;s:3:"à ’";i:5769;s:3:"à “";i:5770;s:3:"à ”";i:5771;s:3:"à •";i:5772;s:3:"à š";i:5773;s:2:"Ø¡";i:5774;s:2:"Ø¢";i:5775;s:2:"Ø£";i:5776;s:2:"Ù²";i:5777;s:2:"Ù±";i:5778;s:2:"ؤ";i:5779;s:2:"Ø¥";i:5780;s:2:"Ù³";i:5781;s:2:"ݳ";i:5782;s:2:"Ý´";i:5783;s:2:"ئ";i:5784;s:2:"ا";i:5785;s:2:"Ù®";i:5786;s:2:"ب";i:5787;s:2:"Ù»";i:5788;s:2:"Ù¾";i:5789;s:2:"Ú€";i:5790;s:2:"Ý";i:5791;s:2:"Ý‘";i:5792;s:2:"Ý’";i:5793;s:2:"Ý“";i:5794;s:2:"Ý”";i:5795;s:2:"Ý•";i:5796;s:2:"Ý–";i:5797;s:2:"Ø©";i:5798;s:2:"ت";i:5799;s:2:"Ø«";i:5800;s:2:"Ù¹";i:5801;s:2:"Ùº";i:5802;s:2:"Ù¼";i:5803;s:2:"Ù½";i:5804;s:2:"Ù¿";i:5805;s:2:"ج";i:5806;s:2:"Úƒ";i:5807;s:2:"Ú„";i:5808;s:2:"Ú†";i:5809;s:2:"Ú¿";i:5810;s:2:"Ú‡";i:5811;s:2:"Ø­";i:5812;s:2:"Ø®";i:5813;s:2:"Ú";i:5814;s:2:"Ú‚";i:5815;s:2:"Ú…";i:5816;s:2:"Ý—";i:5817;s:2:"ݘ";i:5818;s:2:"Ý®";i:5819;s:2:"ݯ";i:5820;s:2:"ݲ";i:5821;s:2:"ݼ";i:5822;s:2:"د";i:5823;s:2:"Ø°";i:5824;s:2:"Úˆ";i:5825;s:2:"Ú‰";i:5826;s:2:"ÚŠ";i:5827;s:2:"Ú‹";i:5828;s:2:"ÚŒ";i:5829;s:2:"Ú";i:5830;s:2:"ÚŽ";i:5831;s:2:"Ú";i:5832;s:2:"Ú";i:5833;s:2:"Û®";i:5834;s:2:"Ý™";i:5835;s:2:"Ýš";i:5836;s:2:"ر";i:5837;s:2:"ز";i:5838;s:2:"Ú‘";i:5839;s:2:"Ú’";i:5840;s:2:"Ú“";i:5841;s:2:"Ú”";i:5842;s:2:"Ú•";i:5843;s:2:"Ú–";i:5844;s:2:"Ú—";i:5845;s:2:"Ú˜";i:5846;s:2:"Ú™";i:5847;s:2:"Û¯";i:5848;s:2:"Ý›";i:5849;s:2:"Ý«";i:5850;s:2:"ݬ";i:5851;s:2:"ݱ";i:5852;s:2:"س";i:5853;s:2:"Ø´";i:5854;s:2:"Úš";i:5855;s:2:"Ú›";i:5856;s:2:"Úœ";i:5857;s:2:"Ûº";i:5858;s:2:"Ýœ";i:5859;s:2:"Ý­";i:5860;s:2:"Ý°";i:5861;s:2:"ݽ";i:5862;s:2:"ݾ";i:5863;s:2:"ص";i:5864;s:2:"ض";i:5865;s:2:"Ú";i:5866;s:2:"Úž";i:5867;s:2:"Û»";i:5868;s:2:"Ø·";i:5869;s:2:"ظ";i:5870;s:2:"ÚŸ";i:5871;s:2:"ع";i:5872;s:2:"غ";i:5873;s:2:"Ú ";i:5874;s:2:"Û¼";i:5875;s:2:"Ý";i:5876;s:2:"Ýž";i:5877;s:2:"ÝŸ";i:5878;s:2:"Ù";i:5879;s:2:"Ú¡";i:5880;s:2:"Ú¢";i:5881;s:2:"Ú£";i:5882;s:2:"Ú¤";i:5883;s:2:"Ú¥";i:5884;s:2:"Ú¦";i:5885;s:2:"Ý ";i:5886;s:2:"Ý¡";i:5887;s:2:"Ù¯";i:5888;s:2:"Ù‚";i:5889;s:2:"Ú§";i:5890;s:2:"Ú¨";i:5891;s:2:"Ùƒ";i:5892;s:2:"Ú©";i:5893;s:2:"Úª";i:5894;s:2:"Ú«";i:5895;s:2:"Ú¬";i:5896;s:2:"Ý¿";i:5897;s:2:"Ú­";i:5898;s:2:"Ú®";i:5899;s:2:"Ú¯";i:5900;s:2:"Ú°";i:5901;s:2:"Ú±";i:5902;s:2:"Ú²";i:5903;s:2:"Ú³";i:5904;s:2:"Ú´";i:5905;s:2:"Ý¢";i:5906;s:2:"Ø»";i:5907;s:2:"ؼ";i:5908;s:2:"Ý£";i:5909;s:2:"ݤ";i:5910;s:2:"Ù„";i:5911;s:2:"Úµ";i:5912;s:2:"Ú¶";i:5913;s:2:"Ú·";i:5914;s:2:"Ú¸";i:5915;s:2:"ݪ";i:5916;s:2:"Ù…";i:5917;s:2:"Ý¥";i:5918;s:2:"ݦ";i:5919;s:2:"Ù†";i:5920;s:2:"Úº";i:5921;s:2:"Ú»";i:5922;s:2:"Ú¼";i:5923;s:2:"Ú½";i:5924;s:2:"Ú¹";i:5925;s:2:"ݧ";i:5926;s:2:"ݨ";i:5927;s:2:"Ý©";i:5928;s:2:"Ù‡";i:5929;s:2:"Ú¾";i:5930;s:2:"Û";i:5931;s:2:"Ûƒ";i:5932;s:2:"Û¿";i:5933;s:2:"Û•";i:5934;s:2:"Ùˆ";i:5935;s:2:"Û„";i:5936;s:2:"Û…";i:5937;s:2:"Û†";i:5938;s:2:"Û‡";i:5939;s:2:"Ûˆ";i:5940;s:2:"Û‰";i:5941;s:2:"ÛŠ";i:5942;s:2:"Û‹";i:5943;s:2:"Û";i:5944;s:2:"ݸ";i:5945;s:2:"ݹ";i:5946;s:2:"Ù‰";i:5947;s:2:"ÙŠ";i:5948;s:2:"ÛŒ";i:5949;s:2:"Û";i:5950;s:2:"ÛŽ";i:5951;s:2:"Û";i:5952;s:2:"Û‘";i:5953;s:2:"ؽ";i:5954;s:2:"ؾ";i:5955;s:2:"Ø¿";i:5956;s:2:"Ø ";i:5957;s:2:"ݵ";i:5958;s:2:"ݶ";i:5959;s:2:"Ý·";i:5960;s:2:"Û’";i:5961;s:2:"ݺ";i:5962;s:2:"Ý»";i:5963;s:2:"Ü";i:5964;s:2:"Ü’";i:5965;s:2:"Ü“";i:5966;s:2:"Ü–";i:5967;s:2:"Ü•";i:5968;s:2:"Ü—";i:5969;s:2:"ܘ";i:5970;s:2:"Ü™";i:5971;s:2:"Ý";i:5972;s:2:"Üš";i:5973;s:2:"Ü›";i:5974;s:2:"Ü";i:5975;s:2:"Üž";i:5976;s:2:"ÜŸ";i:5977;s:2:"ÝŽ";i:5978;s:2:"Ü ";i:5979;s:2:"Ü¡";i:5980;s:2:"Ü¢";i:5981;s:2:"Ü£";i:5982;s:2:"Ü¥";i:5983;s:2:"ܦ";i:5984;s:2:"Ý";i:5985;s:2:"ܨ";i:5986;s:2:"Ü©";i:5987;s:2:"ܪ";i:5988;s:2:"Ü«";i:5989;s:2:"ܬ";i:5990;s:3:"à¡€";i:5991;s:3:"à¡";i:5992;s:3:"à¡‚";i:5993;s:3:"ࡃ";i:5994;s:3:"à¡„";i:5995;s:3:"à¡…";i:5996;s:3:"ࡆ";i:5997;s:3:"ࡇ";i:5998;s:3:"ࡈ";i:5999;s:3:"ࡉ";i:6000;s:3:"à¡Š";i:6001;s:3:"à¡‹";i:6002;s:3:"à¡Œ";i:6003;s:3:"à¡";i:6004;s:3:"à¡Ž";i:6005;s:3:"à¡";i:6006;s:3:"à¡";i:6007;s:3:"à¡‘";i:6008;s:3:"à¡’";i:6009;s:3:"à¡“";i:6010;s:3:"à¡”";i:6011;s:3:"à¡•";i:6012;s:3:"à¡–";i:6013;s:3:"à¡—";i:6014;s:3:"ࡘ";i:6015;s:2:"Þ€";i:6016;s:2:"Þ™";i:6017;s:2:"Þš";i:6018;s:2:"Þ";i:6019;s:2:"Þ‚";i:6020;s:2:"Þƒ";i:6021;s:2:"Þœ";i:6022;s:2:"Þ„";i:6023;s:2:"Þ…";i:6024;s:2:"Þ†";i:6025;s:2:"Þ‡";i:6026;s:2:"Þ¢";i:6027;s:2:"Þ£";i:6028;s:2:"Þˆ";i:6029;s:2:"Þ¥";i:6030;s:2:"Þ‰";i:6031;s:2:"ÞŠ";i:6032;s:2:"Þ‹";i:6033;s:2:"Þ›";i:6034;s:2:"ÞŒ";i:6035;s:2:"Þ˜";i:6036;s:2:"Þ ";i:6037;s:2:"Þ¡";i:6038;s:2:"Þ";i:6039;s:2:"ÞŽ";i:6040;s:2:"Þ¤";i:6041;s:2:"Þ";i:6042;s:2:"Þ";i:6043;s:2:"Þ";i:6044;s:2:"Þž";i:6045;s:2:"ÞŸ";i:6046;s:2:"Þ‘";i:6047;s:2:"Þ’";i:6048;s:2:"Þ“";i:6049;s:2:"Þ”";i:6050;s:2:"Þ•";i:6051;s:2:"Þ–";i:6052;s:2:"Þ—";i:6053;s:2:"Þ±";i:6054;s:2:"ߊ";i:6055;s:2:"ß‹";i:6056;s:2:"ߌ";i:6057;s:2:"ß";i:6058;s:2:"ߎ";i:6059;s:2:"ß";i:6060;s:2:"ß";i:6061;s:2:"ß‘";i:6062;s:2:"ß’";i:6063;s:2:"ß“";i:6064;s:2:"ß”";i:6065;s:2:"ß•";i:6066;s:2:"ß–";i:6067;s:2:"ß—";i:6068;s:2:"ߘ";i:6069;s:2:"ß™";i:6070;s:2:"ßš";i:6071;s:2:"ß›";i:6072;s:2:"ßœ";i:6073;s:2:"ß";i:6074;s:2:"ßž";i:6075;s:2:"ߟ";i:6076;s:2:"ß ";i:6077;s:2:"ß¡";i:6078;s:2:"ߢ";i:6079;s:2:"ߣ";i:6080;s:2:"ߤ";i:6081;s:2:"ߥ";i:6082;s:2:"ߦ";i:6083;s:2:"ߧ";i:6084;s:2:"ß´";i:6085;s:2:"ßµ";i:6086;s:3:"â´°";i:6087;s:3:"â´±";i:6088;s:3:"â´²";i:6089;s:3:"â´³";i:6090;s:3:"â´´";i:6091;s:3:"â´µ";i:6092;s:3:"â´¶";i:6093;s:3:"â´·";i:6094;s:3:"â´¸";i:6095;s:3:"â´¹";i:6096;s:3:"â´º";i:6097;s:3:"â´»";i:6098;s:3:"â´¼";i:6099;s:3:"â´½";i:6100;s:3:"â´¾";i:6101;s:3:"â´¿";i:6102;s:3:"âµ€";i:6103;s:3:"âµ";i:6104;s:3:"ⵂ";i:6105;s:3:"ⵃ";i:6106;s:3:"ⵄ";i:6107;s:3:"âµ…";i:6108;s:3:"ⵆ";i:6109;s:3:"ⵇ";i:6110;s:3:"ⵈ";i:6111;s:3:"ⵉ";i:6112;s:3:"ⵊ";i:6113;s:3:"ⵋ";i:6114;s:3:"ⵌ";i:6115;s:3:"âµ";i:6116;s:3:"ⵎ";i:6117;s:3:"âµ";i:6118;s:3:"âµ";i:6119;s:3:"ⵑ";i:6120;s:3:"âµ’";i:6121;s:3:"ⵓ";i:6122;s:3:"âµ”";i:6123;s:3:"ⵕ";i:6124;s:3:"âµ–";i:6125;s:3:"âµ—";i:6126;s:3:"ⵘ";i:6127;s:3:"âµ™";i:6128;s:3:"ⵚ";i:6129;s:3:"âµ›";i:6130;s:3:"ⵜ";i:6131;s:3:"âµ";i:6132;s:3:"ⵞ";i:6133;s:3:"ⵟ";i:6134;s:3:"âµ ";i:6135;s:3:"ⵡ";i:6136;s:3:"âµ¢";i:6137;s:3:"âµ£";i:6138;s:3:"ⵤ";i:6139;s:3:"âµ¥";i:6140;s:3:"ⵯ";i:6141;s:3:"ሀ";i:6142;s:3:"áˆ";i:6143;s:3:"ሂ";i:6144;s:3:"ሃ";i:6145;s:3:"ሄ";i:6146;s:3:"ህ";i:6147;s:3:"ሆ";i:6148;s:3:"ሇ";i:6149;s:3:"ለ";i:6150;s:3:"ሉ";i:6151;s:3:"ሊ";i:6152;s:3:"ላ";i:6153;s:3:"ሌ";i:6154;s:3:"áˆ";i:6155;s:3:"ሎ";i:6156;s:3:"áˆ";i:6157;s:3:"ⶀ";i:6158;s:3:"áˆ";i:6159;s:3:"ሑ";i:6160;s:3:"ሒ";i:6161;s:3:"ሓ";i:6162;s:3:"ሔ";i:6163;s:3:"ሕ";i:6164;s:3:"ሖ";i:6165;s:3:"ሗ";i:6166;s:3:"መ";i:6167;s:3:"ሙ";i:6168;s:3:"ሚ";i:6169;s:3:"ማ";i:6170;s:3:"ሜ";i:6171;s:3:"áˆ";i:6172;s:3:"ሞ";i:6173;s:3:"ሟ";i:6174;s:3:"ᎀ";i:6175;s:3:"áŽ";i:6176;s:3:"ᎂ";i:6177;s:3:"ᎃ";i:6178;s:3:"â¶";i:6179;s:3:"ሠ";i:6180;s:3:"ሡ";i:6181;s:3:"ሢ";i:6182;s:3:"ሣ";i:6183;s:3:"ሤ";i:6184;s:3:"ሥ";i:6185;s:3:"ሦ";i:6186;s:3:"ሧ";i:6187;s:3:"ረ";i:6188;s:3:"ሩ";i:6189;s:3:"ሪ";i:6190;s:3:"ራ";i:6191;s:3:"ሬ";i:6192;s:3:"ር";i:6193;s:3:"ሮ";i:6194;s:3:"ሯ";i:6195;s:3:"ⶂ";i:6196;s:3:"ሰ";i:6197;s:3:"ሱ";i:6198;s:3:"ሲ";i:6199;s:3:"ሳ";i:6200;s:3:"ሴ";i:6201;s:3:"ስ";i:6202;s:3:"ሶ";i:6203;s:3:"ሷ";i:6204;s:3:"ⶃ";i:6205;s:3:"ê¬";i:6206;s:3:"ꬂ";i:6207;s:3:"ꬃ";i:6208;s:3:"ꬄ";i:6209;s:3:"ꬅ";i:6210;s:3:"ꬆ";i:6211;s:3:"ሸ";i:6212;s:3:"ሹ";i:6213;s:3:"ሺ";i:6214;s:3:"ሻ";i:6215;s:3:"ሼ";i:6216;s:3:"ሽ";i:6217;s:3:"ሾ";i:6218;s:3:"ሿ";i:6219;s:3:"ⶄ";i:6220;s:3:"ቀ";i:6221;s:3:"á‰";i:6222;s:3:"ቂ";i:6223;s:3:"ቃ";i:6224;s:3:"ቄ";i:6225;s:3:"ቅ";i:6226;s:3:"ቆ";i:6227;s:3:"ቇ";i:6228;s:3:"ቈ";i:6229;s:3:"ቊ";i:6230;s:3:"ቋ";i:6231;s:3:"ቌ";i:6232;s:3:"á‰";i:6233;s:3:"á‰";i:6234;s:3:"ቑ";i:6235;s:3:"ቒ";i:6236;s:3:"ቓ";i:6237;s:3:"ቔ";i:6238;s:3:"ቕ";i:6239;s:3:"ቖ";i:6240;s:3:"ቘ";i:6241;s:3:"ቚ";i:6242;s:3:"ቛ";i:6243;s:3:"ቜ";i:6244;s:3:"á‰";i:6245;s:3:"በ";i:6246;s:3:"ቡ";i:6247;s:3:"ቢ";i:6248;s:3:"ባ";i:6249;s:3:"ቤ";i:6250;s:3:"ብ";i:6251;s:3:"ቦ";i:6252;s:3:"ቧ";i:6253;s:3:"ᎄ";i:6254;s:3:"ᎅ";i:6255;s:3:"ᎆ";i:6256;s:3:"ᎇ";i:6257;s:3:"ⶅ";i:6258;s:3:"ቨ";i:6259;s:3:"ቩ";i:6260;s:3:"ቪ";i:6261;s:3:"ቫ";i:6262;s:3:"ቬ";i:6263;s:3:"ቭ";i:6264;s:3:"ቮ";i:6265;s:3:"ቯ";i:6266;s:3:"ተ";i:6267;s:3:"ቱ";i:6268;s:3:"ቲ";i:6269;s:3:"ታ";i:6270;s:3:"ቴ";i:6271;s:3:"ት";i:6272;s:3:"ቶ";i:6273;s:3:"ቷ";i:6274;s:3:"ⶆ";i:6275;s:3:"ቸ";i:6276;s:3:"ቹ";i:6277;s:3:"ቺ";i:6278;s:3:"ቻ";i:6279;s:3:"ቼ";i:6280;s:3:"ች";i:6281;s:3:"ቾ";i:6282;s:3:"ቿ";i:6283;s:3:"ⶇ";i:6284;s:3:"ኀ";i:6285;s:3:"áŠ";i:6286;s:3:"ኂ";i:6287;s:3:"ኃ";i:6288;s:3:"ኄ";i:6289;s:3:"ኅ";i:6290;s:3:"ኆ";i:6291;s:3:"ኇ";i:6292;s:3:"ኈ";i:6293;s:3:"ኊ";i:6294;s:3:"ኋ";i:6295;s:3:"ኌ";i:6296;s:3:"áŠ";i:6297;s:3:"áŠ";i:6298;s:3:"ኑ";i:6299;s:3:"ኒ";i:6300;s:3:"ና";i:6301;s:3:"ኔ";i:6302;s:3:"ን";i:6303;s:3:"ኖ";i:6304;s:3:"ኗ";i:6305;s:3:"ⶈ";i:6306;s:3:"ኘ";i:6307;s:3:"ኙ";i:6308;s:3:"ኚ";i:6309;s:3:"ኛ";i:6310;s:3:"ኜ";i:6311;s:3:"áŠ";i:6312;s:3:"ኞ";i:6313;s:3:"ኟ";i:6314;s:3:"ⶉ";i:6315;s:3:"አ";i:6316;s:3:"ኡ";i:6317;s:3:"ኢ";i:6318;s:3:"ኣ";i:6319;s:3:"ኤ";i:6320;s:3:"እ";i:6321;s:3:"ኦ";i:6322;s:3:"ኧ";i:6323;s:3:"ⶊ";i:6324;s:3:"ከ";i:6325;s:3:"ኩ";i:6326;s:3:"ኪ";i:6327;s:3:"ካ";i:6328;s:3:"ኬ";i:6329;s:3:"ክ";i:6330;s:3:"ኮ";i:6331;s:3:"ኯ";i:6332;s:3:"ኰ";i:6333;s:3:"ኲ";i:6334;s:3:"ኳ";i:6335;s:3:"ኴ";i:6336;s:3:"ኵ";i:6337;s:3:"ኸ";i:6338;s:3:"ኹ";i:6339;s:3:"ኺ";i:6340;s:3:"ኻ";i:6341;s:3:"ኼ";i:6342;s:3:"ኽ";i:6343;s:3:"ኾ";i:6344;s:3:"á‹€";i:6345;s:3:"á‹‚";i:6346;s:3:"ዃ";i:6347;s:3:"á‹„";i:6348;s:3:"á‹…";i:6349;s:3:"ወ";i:6350;s:3:"ዉ";i:6351;s:3:"á‹Š";i:6352;s:3:"á‹‹";i:6353;s:3:"á‹Œ";i:6354;s:3:"á‹";i:6355;s:3:"á‹Ž";i:6356;s:3:"á‹";i:6357;s:3:"á‹";i:6358;s:3:"á‹‘";i:6359;s:3:"á‹’";i:6360;s:3:"á‹“";i:6361;s:3:"á‹”";i:6362;s:3:"á‹•";i:6363;s:3:"á‹–";i:6364;s:3:"ዘ";i:6365;s:3:"á‹™";i:6366;s:3:"á‹š";i:6367;s:3:"á‹›";i:6368;s:3:"á‹œ";i:6369;s:3:"á‹";i:6370;s:3:"á‹ž";i:6371;s:3:"á‹Ÿ";i:6372;s:3:"ⶋ";i:6373;s:3:"ꬑ";i:6374;s:3:"ꬒ";i:6375;s:3:"ꬓ";i:6376;s:3:"ꬔ";i:6377;s:3:"ꬕ";i:6378;s:3:"ꬖ";i:6379;s:3:"á‹ ";i:6380;s:3:"á‹¡";i:6381;s:3:"á‹¢";i:6382;s:3:"á‹£";i:6383;s:3:"ዤ";i:6384;s:3:"á‹¥";i:6385;s:3:"ዦ";i:6386;s:3:"ዧ";i:6387;s:3:"የ";i:6388;s:3:"á‹©";i:6389;s:3:"ዪ";i:6390;s:3:"á‹«";i:6391;s:3:"ዬ";i:6392;s:3:"á‹­";i:6393;s:3:"á‹®";i:6394;s:3:"ዯ";i:6395;s:3:"á‹°";i:6396;s:3:"ዱ";i:6397;s:3:"ዲ";i:6398;s:3:"ዳ";i:6399;s:3:"á‹´";i:6400;s:3:"ድ";i:6401;s:3:"ዶ";i:6402;s:3:"á‹·";i:6403;s:3:"ⶌ";i:6404;s:3:"ꬉ";i:6405;s:3:"ꬊ";i:6406;s:3:"ꬋ";i:6407;s:3:"ꬌ";i:6408;s:3:"ê¬";i:6409;s:3:"ꬎ";i:6410;s:3:"ዸ";i:6411;s:3:"ዹ";i:6412;s:3:"ዺ";i:6413;s:3:"á‹»";i:6414;s:3:"ዼ";i:6415;s:3:"ዽ";i:6416;s:3:"ዾ";i:6417;s:3:"á‹¿";i:6418;s:3:"â¶";i:6419;s:3:"ጀ";i:6420;s:3:"áŒ";i:6421;s:3:"ጂ";i:6422;s:3:"ጃ";i:6423;s:3:"ጄ";i:6424;s:3:"ጅ";i:6425;s:3:"ጆ";i:6426;s:3:"ጇ";i:6427;s:3:"ⶎ";i:6428;s:3:"ገ";i:6429;s:3:"ጉ";i:6430;s:3:"ጊ";i:6431;s:3:"ጋ";i:6432;s:3:"ጌ";i:6433;s:3:"áŒ";i:6434;s:3:"ጎ";i:6435;s:3:"áŒ";i:6436;s:3:"áŒ";i:6437;s:3:"ጒ";i:6438;s:3:"ጓ";i:6439;s:3:"ጔ";i:6440;s:3:"ጕ";i:6441;s:3:"ጘ";i:6442;s:3:"ጙ";i:6443;s:3:"ጚ";i:6444;s:3:"ጛ";i:6445;s:3:"ጜ";i:6446;s:3:"áŒ";i:6447;s:3:"ጞ";i:6448;s:3:"ጟ";i:6449;s:3:"ⶓ";i:6450;s:3:"ⶔ";i:6451;s:3:"ⶕ";i:6452;s:3:"ⶖ";i:6453;s:3:"ጠ";i:6454;s:3:"ጡ";i:6455;s:3:"ጢ";i:6456;s:3:"ጣ";i:6457;s:3:"ጤ";i:6458;s:3:"ጥ";i:6459;s:3:"ጦ";i:6460;s:3:"ጧ";i:6461;s:3:"â¶";i:6462;s:3:"ጨ";i:6463;s:3:"ጩ";i:6464;s:3:"ጪ";i:6465;s:3:"ጫ";i:6466;s:3:"ጬ";i:6467;s:3:"ጭ";i:6468;s:3:"ጮ";i:6469;s:3:"ጯ";i:6470;s:3:"â¶";i:6471;s:3:"ꬠ";i:6472;s:3:"ꬡ";i:6473;s:3:"ꬢ";i:6474;s:3:"ꬣ";i:6475;s:3:"ꬤ";i:6476;s:3:"ꬥ";i:6477;s:3:"ꬦ";i:6478;s:3:"ጰ";i:6479;s:3:"ጱ";i:6480;s:3:"ጲ";i:6481;s:3:"ጳ";i:6482;s:3:"ጴ";i:6483;s:3:"ጵ";i:6484;s:3:"ጶ";i:6485;s:3:"ጷ";i:6486;s:3:"ⶑ";i:6487;s:3:"ጸ";i:6488;s:3:"ጹ";i:6489;s:3:"ጺ";i:6490;s:3:"ጻ";i:6491;s:3:"ጼ";i:6492;s:3:"ጽ";i:6493;s:3:"ጾ";i:6494;s:3:"ጿ";i:6495;s:3:"ꬨ";i:6496;s:3:"ꬩ";i:6497;s:3:"ꬪ";i:6498;s:3:"ꬫ";i:6499;s:3:"ꬬ";i:6500;s:3:"ꬭ";i:6501;s:3:"ꬮ";i:6502;s:3:"á€";i:6503;s:3:"á";i:6504;s:3:"á‚";i:6505;s:3:"áƒ";i:6506;s:3:"á„";i:6507;s:3:"á…";i:6508;s:3:"á†";i:6509;s:3:"á‡";i:6510;s:3:"áˆ";i:6511;s:3:"á‰";i:6512;s:3:"áŠ";i:6513;s:3:"á‹";i:6514;s:3:"áŒ";i:6515;s:3:"á";i:6516;s:3:"áŽ";i:6517;s:3:"á";i:6518;s:3:"ᎈ";i:6519;s:3:"ᎉ";i:6520;s:3:"ᎊ";i:6521;s:3:"ᎋ";i:6522;s:3:"á";i:6523;s:3:"á‘";i:6524;s:3:"á’";i:6525;s:3:"á“";i:6526;s:3:"á”";i:6527;s:3:"á•";i:6528;s:3:"á–";i:6529;s:3:"á—";i:6530;s:3:"ᎌ";i:6531;s:3:"áŽ";i:6532;s:3:"ᎎ";i:6533;s:3:"áŽ";i:6534;s:3:"ⶒ";i:6535;s:3:"á˜";i:6536;s:3:"á™";i:6537;s:3:"áš";i:6538;s:3:"ⶠ";i:6539;s:3:"ⶡ";i:6540;s:3:"ⶢ";i:6541;s:3:"ⶣ";i:6542;s:3:"ⶤ";i:6543;s:3:"ⶥ";i:6544;s:3:"ⶦ";i:6545;s:3:"ⶨ";i:6546;s:3:"ⶩ";i:6547;s:3:"ⶪ";i:6548;s:3:"ⶫ";i:6549;s:3:"ⶬ";i:6550;s:3:"ⶭ";i:6551;s:3:"ⶮ";i:6552;s:3:"ⶰ";i:6553;s:3:"ⶱ";i:6554;s:3:"ⶲ";i:6555;s:3:"ⶳ";i:6556;s:3:"ⶴ";i:6557;s:3:"ⶵ";i:6558;s:3:"ⶶ";i:6559;s:3:"ⶸ";i:6560;s:3:"ⶹ";i:6561;s:3:"ⶺ";i:6562;s:3:"ⶻ";i:6563;s:3:"ⶼ";i:6564;s:3:"ⶽ";i:6565;s:3:"ⶾ";i:6566;s:3:"â·€";i:6567;s:3:"â·";i:6568;s:3:"â·‚";i:6569;s:3:"â·ƒ";i:6570;s:3:"â·„";i:6571;s:3:"â·…";i:6572;s:3:"â·†";i:6573;s:3:"â·ˆ";i:6574;s:3:"â·‰";i:6575;s:3:"â·Š";i:6576;s:3:"â·‹";i:6577;s:3:"â·Œ";i:6578;s:3:"â·";i:6579;s:3:"â·Ž";i:6580;s:3:"â·";i:6581;s:3:"â·‘";i:6582;s:3:"â·’";i:6583;s:3:"â·“";i:6584;s:3:"â·”";i:6585;s:3:"â·•";i:6586;s:3:"â·–";i:6587;s:3:"â·˜";i:6588;s:3:"â·™";i:6589;s:3:"â·š";i:6590;s:3:"â·›";i:6591;s:3:"â·œ";i:6592;s:3:"â·";i:6593;s:3:"â·ž";i:6594;s:3:"à¥";i:6595;s:3:"ॲ";i:6596;s:3:"ऄ";i:6597;s:3:"अ";i:6598;s:3:"आ";i:6599;s:3:"ॳ";i:6600;s:3:"ॴ";i:6601;s:3:"ॵ";i:6602;s:3:"ॶ";i:6603;s:3:"ॷ";i:6604;s:3:"इ";i:6605;s:3:"ई";i:6606;s:3:"उ";i:6607;s:3:"ऊ";i:6608;s:3:"ऋ";i:6609;s:3:"ॠ";i:6610;s:3:"ऌ";i:6611;s:3:"ॡ";i:6612;s:3:"à¤";i:6613;s:3:"ऎ";i:6614;s:3:"à¤";i:6615;s:3:"à¤";i:6616;s:3:"ऑ";i:6617;s:3:"ऒ";i:6618;s:3:"ओ";i:6619;s:3:"औ";i:6620;s:3:"क";i:6621;s:3:"ख";i:6622;s:3:"ग";i:6623;s:3:"ॻ";i:6624;s:3:"घ";i:6625;s:3:"ङ";i:6626;s:3:"च";i:6627;s:3:"छ";i:6628;s:3:"ज";i:6629;s:3:"ॹ";i:6630;s:3:"ॼ";i:6631;s:3:"à¤";i:6632;s:3:"ञ";i:6633;s:3:"ट";i:6634;s:3:"ठ";i:6635;s:3:"ड";i:6636;s:3:"ॾ";i:6637;s:3:"ढ";i:6638;s:3:"ण";i:6639;s:3:"त";i:6640;s:3:"थ";i:6641;s:3:"द";i:6642;s:3:"ध";i:6643;s:3:"न";i:6644;s:3:"प";i:6645;s:3:"फ";i:6646;s:3:"ब";i:6647;s:3:"ॿ";i:6648;s:3:"भ";i:6649;s:3:"म";i:6650;s:3:"य";i:6651;s:3:"ॺ";i:6652;s:3:"र";i:6653;s:3:"ल";i:6654;s:3:"ळ";i:6655;s:3:"व";i:6656;s:3:"श";i:6657;s:3:"ष";i:6658;s:3:"स";i:6659;s:3:"ह";i:6660;s:3:"ऽ";i:6661;s:3:"ॽ";i:6662;s:3:"ᳩ";i:6663;s:3:"ꣲ";i:6664;s:3:"ꣻ";i:6665;s:3:"অ";i:6666;s:3:"আ";i:6667;s:3:"ই";i:6668;s:3:"ঈ";i:6669;s:3:"উ";i:6670;s:3:"ঊ";i:6671;s:3:"ঋ";i:6672;s:3:"ৠ";i:6673;s:3:"ঌ";i:6674;s:3:"ৡ";i:6675;s:3:"à¦";i:6676;s:3:"à¦";i:6677;s:3:"ও";i:6678;s:3:"ঔ";i:6679;s:3:"ক";i:6680;s:3:"খ";i:6681;s:3:"গ";i:6682;s:3:"ঘ";i:6683;s:3:"ঙ";i:6684;s:3:"চ";i:6685;s:3:"ছ";i:6686;s:3:"জ";i:6687;s:3:"à¦";i:6688;s:3:"ঞ";i:6689;s:3:"ট";i:6690;s:3:"ঠ";i:6691;s:3:"ড";i:6692;s:3:"ঢ";i:6693;s:3:"ণ";i:6694;s:3:"ত";i:6695;s:3:"থ";i:6696;s:3:"দ";i:6697;s:3:"ধ";i:6698;s:3:"ন";i:6699;s:3:"প";i:6700;s:3:"ফ";i:6701;s:3:"ব";i:6702;s:3:"ভ";i:6703;s:3:"ম";i:6704;s:3:"য";i:6705;s:3:"র";i:6706;s:3:"ৰ";i:6707;s:3:"ল";i:6708;s:3:"ৱ";i:6709;s:3:"শ";i:6710;s:3:"ষ";i:6711;s:3:"স";i:6712;s:3:"হ";i:6713;s:3:"ঽ";i:6714;s:3:"à©´";i:6715;s:3:"ੳ";i:6716;s:3:"ਉ";i:6717;s:3:"ਊ";i:6718;s:3:"ਓ";i:6719;s:3:"ਅ";i:6720;s:3:"ਆ";i:6721;s:3:"à¨";i:6722;s:3:"ਔ";i:6723;s:3:"ੲ";i:6724;s:3:"ਇ";i:6725;s:3:"ਈ";i:6726;s:3:"à¨";i:6727;s:3:"ਸ";i:6728;s:3:"ਹ";i:6729;s:3:"ਕ";i:6730;s:3:"ਖ";i:6731;s:3:"ਗ";i:6732;s:3:"ਘ";i:6733;s:3:"ਙ";i:6734;s:3:"ਚ";i:6735;s:3:"ਛ";i:6736;s:3:"ਜ";i:6737;s:3:"à¨";i:6738;s:3:"ਞ";i:6739;s:3:"ਟ";i:6740;s:3:"ਠ";i:6741;s:3:"ਡ";i:6742;s:3:"ਢ";i:6743;s:3:"ਣ";i:6744;s:3:"ਤ";i:6745;s:3:"ਥ";i:6746;s:3:"ਦ";i:6747;s:3:"ਧ";i:6748;s:3:"ਨ";i:6749;s:3:"ਪ";i:6750;s:3:"ਫ";i:6751;s:3:"ਬ";i:6752;s:3:"ਭ";i:6753;s:3:"ਮ";i:6754;s:3:"ਯ";i:6755;s:3:"ਰ";i:6756;s:3:"ਲ";i:6757;s:3:"ਵ";i:6758;s:3:"à©œ";i:6759;s:3:"à«";i:6760;s:3:"અ";i:6761;s:3:"આ";i:6762;s:3:"ઇ";i:6763;s:3:"ઈ";i:6764;s:3:"ઉ";i:6765;s:3:"ઊ";i:6766;s:3:"ઋ";i:6767;s:3:"à« ";i:6768;s:3:"ઌ";i:6769;s:3:"à«¡";i:6770;s:3:"àª";i:6771;s:3:"àª";i:6772;s:3:"àª";i:6773;s:3:"ઑ";i:6774;s:3:"ઓ";i:6775;s:3:"ઔ";i:6776;s:3:"ક";i:6777;s:3:"ખ";i:6778;s:3:"ગ";i:6779;s:3:"ઘ";i:6780;s:3:"ઙ";i:6781;s:3:"ચ";i:6782;s:3:"છ";i:6783;s:3:"જ";i:6784;s:3:"àª";i:6785;s:3:"ઞ";i:6786;s:3:"ટ";i:6787;s:3:"ઠ";i:6788;s:3:"ડ";i:6789;s:3:"ઢ";i:6790;s:3:"ણ";i:6791;s:3:"ત";i:6792;s:3:"થ";i:6793;s:3:"દ";i:6794;s:3:"ધ";i:6795;s:3:"ન";i:6796;s:3:"પ";i:6797;s:3:"ફ";i:6798;s:3:"બ";i:6799;s:3:"ભ";i:6800;s:3:"મ";i:6801;s:3:"ય";i:6802;s:3:"ર";i:6803;s:3:"લ";i:6804;s:3:"વ";i:6805;s:3:"શ";i:6806;s:3:"ષ";i:6807;s:3:"સ";i:6808;s:3:"હ";i:6809;s:3:"ળ";i:6810;s:3:"ઽ";i:6811;s:3:"ଅ";i:6812;s:3:"ଆ";i:6813;s:3:"ଇ";i:6814;s:3:"ଈ";i:6815;s:3:"ଉ";i:6816;s:3:"ଊ";i:6817;s:3:"ଋ";i:6818;s:3:"à­ ";i:6819;s:3:"ଌ";i:6820;s:3:"à­¡";i:6821;s:3:"à¬";i:6822;s:3:"à¬";i:6823;s:3:"ଓ";i:6824;s:3:"ଔ";i:6825;s:3:"କ";i:6826;s:3:"ଖ";i:6827;s:3:"ଗ";i:6828;s:3:"ଘ";i:6829;s:3:"ଙ";i:6830;s:3:"ଚ";i:6831;s:3:"ଛ";i:6832;s:3:"ଜ";i:6833;s:3:"à¬";i:6834;s:3:"ଞ";i:6835;s:3:"ଟ";i:6836;s:3:"ଠ";i:6837;s:3:"ଡ";i:6838;s:3:"ଢ";i:6839;s:3:"ଣ";i:6840;s:3:"ତ";i:6841;s:3:"ଥ";i:6842;s:3:"ଦ";i:6843;s:3:"ଧ";i:6844;s:3:"ନ";i:6845;s:3:"ପ";i:6846;s:3:"ଫ";i:6847;s:3:"ବ";i:6848;s:3:"ଭ";i:6849;s:3:"ମ";i:6850;s:3:"ଯ";i:6851;s:3:"à­Ÿ";i:6852;s:3:"ର";i:6853;s:3:"ଲ";i:6854;s:3:"ଳ";i:6855;s:3:"ଵ";i:6856;s:3:"à­±";i:6857;s:3:"ଶ";i:6858;s:3:"ଷ";i:6859;s:3:"ସ";i:6860;s:3:"ହ";i:6861;s:3:"ଽ";i:6862;s:3:"à¯";i:6863;s:3:"à®…";i:6864;s:3:"ஆ";i:6865;s:3:"இ";i:6866;s:3:"ஈ";i:6867;s:3:"உ";i:6868;s:3:"ஊ";i:6869;s:3:"எ";i:6870;s:3:"à®";i:6871;s:3:"à®";i:6872;s:3:"à®’";i:6873;s:3:"ஓ";i:6874;s:3:"à®”";i:6875;s:3:"ஃ";i:6876;s:3:"க";i:6877;s:3:"à®™";i:6878;s:3:"ச";i:6879;s:3:"ஞ";i:6880;s:3:"ட";i:6881;s:3:"ண";i:6882;s:3:"த";i:6883;s:3:"ந";i:6884;s:3:"ப";i:6885;s:3:"à®®";i:6886;s:3:"ய";i:6887;s:3:"à®°";i:6888;s:3:"ல";i:6889;s:3:"வ";i:6890;s:3:"à®´";i:6891;s:3:"ள";i:6892;s:3:"à®±";i:6893;s:3:"ன";i:6894;s:3:"ஜ";i:6895;s:3:"ஶ";i:6896;s:3:"à®·";i:6897;s:3:"ஸ";i:6898;s:3:"ஹ";i:6899;s:3:"à°…";i:6900;s:3:"à°†";i:6901;s:3:"à°‡";i:6902;s:3:"à°ˆ";i:6903;s:3:"à°‰";i:6904;s:3:"à°Š";i:6905;s:3:"à°‹";i:6906;s:3:"à± ";i:6907;s:3:"à°Œ";i:6908;s:3:"ౡ";i:6909;s:3:"à°Ž";i:6910;s:3:"à°";i:6911;s:3:"à°";i:6912;s:3:"à°’";i:6913;s:3:"à°“";i:6914;s:3:"à°”";i:6915;s:3:"à°•";i:6916;s:3:"à°–";i:6917;s:3:"à°—";i:6918;s:3:"à°˜";i:6919;s:3:"à°™";i:6920;s:3:"à°š";i:6921;s:3:"ౘ";i:6922;s:3:"à°›";i:6923;s:3:"à°œ";i:6924;s:3:"à±™";i:6925;s:3:"à°";i:6926;s:3:"à°ž";i:6927;s:3:"à°Ÿ";i:6928;s:3:"à° ";i:6929;s:3:"à°¡";i:6930;s:3:"à°¢";i:6931;s:3:"à°£";i:6932;s:3:"à°¤";i:6933;s:3:"à°¥";i:6934;s:3:"à°¦";i:6935;s:3:"à°§";i:6936;s:3:"à°¨";i:6937;s:3:"à°ª";i:6938;s:3:"à°«";i:6939;s:3:"à°¬";i:6940;s:3:"à°­";i:6941;s:3:"à°®";i:6942;s:3:"à°¯";i:6943;s:3:"à°°";i:6944;s:3:"à°±";i:6945;s:3:"à°²";i:6946;s:3:"à°µ";i:6947;s:3:"à°¶";i:6948;s:3:"à°·";i:6949;s:3:"à°¸";i:6950;s:3:"à°¹";i:6951;s:3:"à°³";i:6952;s:3:"à°½";i:6953;s:3:"ಅ";i:6954;s:3:"ಆ";i:6955;s:3:"ಇ";i:6956;s:3:"ಈ";i:6957;s:3:"ಉ";i:6958;s:3:"ಊ";i:6959;s:3:"ಋ";i:6960;s:3:"à³ ";i:6961;s:3:"ಌ";i:6962;s:3:"ೡ";i:6963;s:3:"ಎ";i:6964;s:3:"à²";i:6965;s:3:"à²";i:6966;s:3:"ಒ";i:6967;s:3:"ಓ";i:6968;s:3:"ಔ";i:6969;s:3:"ಕ";i:6970;s:3:"ಖ";i:6971;s:3:"ಗ";i:6972;s:3:"ಘ";i:6973;s:3:"ಙ";i:6974;s:3:"ಚ";i:6975;s:3:"ಛ";i:6976;s:3:"ಜ";i:6977;s:3:"à²";i:6978;s:3:"ಞ";i:6979;s:3:"ಟ";i:6980;s:3:"ಠ";i:6981;s:3:"ಡ";i:6982;s:3:"ಢ";i:6983;s:3:"ಣ";i:6984;s:3:"ತ";i:6985;s:3:"ಥ";i:6986;s:3:"ದ";i:6987;s:3:"ಧ";i:6988;s:3:"ನ";i:6989;s:3:"ಪ";i:6990;s:3:"ಫ";i:6991;s:3:"ಬ";i:6992;s:3:"ಭ";i:6993;s:3:"ಮ";i:6994;s:3:"ಯ";i:6995;s:3:"ರ";i:6996;s:3:"ಱ";i:6997;s:3:"ಲ";i:6998;s:3:"ವ";i:6999;s:3:"ಶ";i:7000;s:3:"ಷ";i:7001;s:3:"ಸ";i:7002;s:3:"ಹ";i:7003;s:3:"ಳ";i:7004;s:3:"ೞ";i:7005;s:3:"ಽ";i:7006;s:3:"à³±";i:7007;s:3:"à³²";i:7008;s:3:"à´…";i:7009;s:3:"à´†";i:7010;s:3:"à´‡";i:7011;s:3:"à´ˆ";i:7012;s:3:"à´‰";i:7013;s:3:"à´Š";i:7014;s:3:"à´‹";i:7015;s:3:"ൠ";i:7016;s:3:"à´Œ";i:7017;s:3:"ൡ";i:7018;s:3:"à´Ž";i:7019;s:3:"à´";i:7020;s:3:"à´";i:7021;s:3:"à´’";i:7022;s:3:"à´“";i:7023;s:3:"à´”";i:7024;s:3:"à´•";i:7025;s:3:"à´–";i:7026;s:3:"à´—";i:7027;s:3:"à´˜";i:7028;s:3:"à´™";i:7029;s:3:"à´š";i:7030;s:3:"à´›";i:7031;s:3:"à´œ";i:7032;s:3:"à´";i:7033;s:3:"à´ž";i:7034;s:3:"à´Ÿ";i:7035;s:3:"à´ ";i:7036;s:3:"à´¡";i:7037;s:3:"à´¢";i:7038;s:3:"à´£";i:7039;s:3:"à´¤";i:7040;s:3:"à´¥";i:7041;s:3:"à´¦";i:7042;s:3:"à´§";i:7043;s:3:"à´¨";i:7044;s:3:"à´©";i:7045;s:3:"à´ª";i:7046;s:3:"à´«";i:7047;s:3:"à´¬";i:7048;s:3:"à´­";i:7049;s:3:"à´®";i:7050;s:3:"à´¯";i:7051;s:3:"à´°";i:7052;s:3:"à´²";i:7053;s:3:"à´µ";i:7054;s:3:"à´¶";i:7055;s:3:"à´·";i:7056;s:3:"à´¸";i:7057;s:3:"à´¹";i:7058;s:3:"à´³";i:7059;s:3:"à´´";i:7060;s:3:"à´±";i:7061;s:3:"à´º";i:7062;s:3:"à´½";i:7063;s:3:"අ";i:7064;s:3:"ආ";i:7065;s:3:"ඇ";i:7066;s:3:"ඈ";i:7067;s:3:"ඉ";i:7068;s:3:"ඊ";i:7069;s:3:"උ";i:7070;s:3:"ඌ";i:7071;s:3:"à¶";i:7072;s:3:"ඎ";i:7073;s:3:"à¶";i:7074;s:3:"à¶";i:7075;s:3:"එ";i:7076;s:3:"ඒ";i:7077;s:3:"ඓ";i:7078;s:3:"ඔ";i:7079;s:3:"ඕ";i:7080;s:3:"ඖ";i:7081;s:3:"ක";i:7082;s:3:"ඛ";i:7083;s:3:"ග";i:7084;s:3:"à¶";i:7085;s:3:"ඞ";i:7086;s:3:"ඟ";i:7087;s:3:"ච";i:7088;s:3:"ඡ";i:7089;s:3:"ජ";i:7090;s:3:"ඣ";i:7091;s:3:"ඤ";i:7092;s:3:"ඥ";i:7093;s:3:"ඦ";i:7094;s:3:"ට";i:7095;s:3:"ඨ";i:7096;s:3:"ඩ";i:7097;s:3:"ඪ";i:7098;s:3:"ණ";i:7099;s:3:"ඬ";i:7100;s:3:"ත";i:7101;s:3:"ථ";i:7102;s:3:"ද";i:7103;s:3:"ධ";i:7104;s:3:"න";i:7105;s:3:"ඳ";i:7106;s:3:"ප";i:7107;s:3:"ඵ";i:7108;s:3:"බ";i:7109;s:3:"භ";i:7110;s:3:"ම";i:7111;s:3:"ඹ";i:7112;s:3:"ය";i:7113;s:3:"ර";i:7114;s:3:"ල";i:7115;s:3:"à·€";i:7116;s:3:"à·";i:7117;s:3:"à·‚";i:7118;s:3:"à·ƒ";i:7119;s:3:"à·„";i:7120;s:3:"à·…";i:7121;s:3:"à·†";i:7122;s:3:"ꯀ";i:7123;s:3:"ê¯";i:7124;s:3:"ꯂ";i:7125;s:3:"ꯃ";i:7126;s:3:"ꯄ";i:7127;s:3:"ꯅ";i:7128;s:3:"ꯆ";i:7129;s:3:"ꯇ";i:7130;s:3:"ꯈ";i:7131;s:3:"ꯉ";i:7132;s:3:"ꯊ";i:7133;s:3:"ꯋ";i:7134;s:3:"ꯌ";i:7135;s:3:"ê¯";i:7136;s:3:"ꯎ";i:7137;s:3:"ê¯";i:7138;s:3:"ê¯";i:7139;s:3:"ꯑ";i:7140;s:3:"ꯒ";i:7141;s:3:"ꯓ";i:7142;s:3:"ꯔ";i:7143;s:3:"ꯕ";i:7144;s:3:"ꯖ";i:7145;s:3:"ꯗ";i:7146;s:3:"ꯘ";i:7147;s:3:"ꯙ";i:7148;s:3:"ꯚ";i:7149;s:3:"ꯛ";i:7150;s:3:"ꯜ";i:7151;s:3:"ê¯";i:7152;s:3:"ꯞ";i:7153;s:3:"ꯟ";i:7154;s:3:"ꯠ";i:7155;s:3:"ꯡ";i:7156;s:3:"ꯢ";i:7157;s:3:"ê €";i:7158;s:3:"ê ";i:7159;s:3:"ê ƒ";i:7160;s:3:"ê „";i:7161;s:3:"ê …";i:7162;s:3:"ê ‡";i:7163;s:3:"ê ˆ";i:7164;s:3:"ê ‰";i:7165;s:3:"ê Š";i:7166;s:3:"ê Œ";i:7167;s:3:"ê ";i:7168;s:3:"ê Ž";i:7169;s:3:"ê ";i:7170;s:3:"ê ";i:7171;s:3:"ê ‘";i:7172;s:3:"ê ’";i:7173;s:3:"ê “";i:7174;s:3:"ê ”";i:7175;s:3:"ê •";i:7176;s:3:"ê –";i:7177;s:3:"ê —";i:7178;s:3:"ê ˜";i:7179;s:3:"ê ™";i:7180;s:3:"ê š";i:7181;s:3:"ê ›";i:7182;s:3:"ê œ";i:7183;s:3:"ê ";i:7184;s:3:"ê ž";i:7185;s:3:"ê Ÿ";i:7186;s:3:"ê  ";i:7187;s:3:"ê ¡";i:7188;s:3:"ê ¢";i:7189;s:3:"ꢂ";i:7190;s:3:"ꢃ";i:7191;s:3:"ꢄ";i:7192;s:3:"ꢅ";i:7193;s:3:"ꢆ";i:7194;s:3:"ꢇ";i:7195;s:3:"ꢈ";i:7196;s:3:"ꢉ";i:7197;s:3:"ꢊ";i:7198;s:3:"ꢋ";i:7199;s:3:"ꢌ";i:7200;s:3:"ê¢";i:7201;s:3:"ꢎ";i:7202;s:3:"ê¢";i:7203;s:3:"ê¢";i:7204;s:3:"ꢑ";i:7205;s:3:"ꢒ";i:7206;s:3:"ꢓ";i:7207;s:3:"ꢔ";i:7208;s:3:"ꢕ";i:7209;s:3:"ꢖ";i:7210;s:3:"ꢗ";i:7211;s:3:"ꢘ";i:7212;s:3:"ꢙ";i:7213;s:3:"ꢚ";i:7214;s:3:"ꢛ";i:7215;s:3:"ꢜ";i:7216;s:3:"ê¢";i:7217;s:3:"ꢞ";i:7218;s:3:"ꢟ";i:7219;s:3:"ꢠ";i:7220;s:3:"ꢡ";i:7221;s:3:"ꢢ";i:7222;s:3:"ꢣ";i:7223;s:3:"ꢤ";i:7224;s:3:"ꢥ";i:7225;s:3:"ꢦ";i:7226;s:3:"ꢧ";i:7227;s:3:"ꢨ";i:7228;s:3:"ꢩ";i:7229;s:3:"ꢪ";i:7230;s:3:"ꢫ";i:7231;s:3:"ꢬ";i:7232;s:3:"ꢭ";i:7233;s:3:"ꢮ";i:7234;s:3:"ꢯ";i:7235;s:3:"ꢰ";i:7236;s:3:"ꢱ";i:7237;s:3:"ꢲ";i:7238;s:3:"ꢳ";i:7239;s:4:"𑂃";i:7240;s:4:"ð‘‚„";i:7241;s:4:"ð‘‚…";i:7242;s:4:"𑂆";i:7243;s:4:"𑂇";i:7244;s:4:"𑂈";i:7245;s:4:"𑂉";i:7246;s:4:"ð‘‚Š";i:7247;s:4:"ð‘‚‹";i:7248;s:4:"ð‘‚Œ";i:7249;s:4:"ð‘‚";i:7250;s:4:"ð‘‚Ž";i:7251;s:4:"ð‘‚";i:7252;s:4:"ð‘‚";i:7253;s:4:"ð‘‚‘";i:7254;s:4:"ð‘‚’";i:7255;s:4:"ð‘‚“";i:7256;s:4:"ð‘‚”";i:7257;s:4:"ð‘‚•";i:7258;s:4:"ð‘‚–";i:7259;s:4:"ð‘‚—";i:7260;s:4:"𑂘";i:7261;s:4:"ð‘‚™";i:7262;s:4:"ð‘‚›";i:7263;s:4:"ð‘‚";i:7264;s:4:"ð‘‚ž";i:7265;s:4:"ð‘‚Ÿ";i:7266;s:4:"ð‘‚ ";i:7267;s:4:"ð‘‚¡";i:7268;s:4:"ð‘‚¢";i:7269;s:4:"ð‘‚£";i:7270;s:4:"𑂤";i:7271;s:4:"ð‘‚¥";i:7272;s:4:"𑂦";i:7273;s:4:"𑂧";i:7274;s:4:"𑂨";i:7275;s:4:"ð‘‚©";i:7276;s:4:"𑂪";i:7277;s:4:"𑂬";i:7278;s:4:"ð‘‚­";i:7279;s:4:"ð‘‚®";i:7280;s:4:"𑂯";i:7281;s:3:"ᮃ";i:7282;s:3:"ᮄ";i:7283;s:3:"á®…";i:7284;s:3:"ᮆ";i:7285;s:3:"ᮇ";i:7286;s:3:"ᮈ";i:7287;s:3:"ᮉ";i:7288;s:3:"ᮊ";i:7289;s:3:"á®®";i:7290;s:3:"ᮋ";i:7291;s:3:"ᮌ";i:7292;s:3:"á®";i:7293;s:3:"ᮎ";i:7294;s:3:"á®";i:7295;s:3:"á®";i:7296;s:3:"ᮑ";i:7297;s:3:"á®’";i:7298;s:3:"ᮓ";i:7299;s:3:"á®”";i:7300;s:3:"ᮕ";i:7301;s:3:"á®–";i:7302;s:3:"á®—";i:7303;s:3:"ᮘ";i:7304;s:3:"á®™";i:7305;s:3:"ᮚ";i:7306;s:3:"á®›";i:7307;s:3:"ᮜ";i:7308;s:3:"á®";i:7309;s:3:"ᮞ";i:7310;s:3:"ᮟ";i:7311;s:3:"ᮯ";i:7312;s:3:"á® ";i:7313;s:4:"ð‘€…";i:7314;s:4:"𑀆";i:7315;s:4:"𑀇";i:7316;s:4:"𑀈";i:7317;s:4:"𑀉";i:7318;s:4:"𑀊";i:7319;s:4:"𑀋";i:7320;s:4:"𑀌";i:7321;s:4:"ð‘€";i:7322;s:4:"𑀎";i:7323;s:4:"ð‘€";i:7324;s:4:"ð‘€";i:7325;s:4:"𑀑";i:7326;s:4:"ð‘€’";i:7327;s:4:"𑀓";i:7328;s:4:"ð‘€”";i:7329;s:4:"𑀕";i:7330;s:4:"ð‘€–";i:7331;s:4:"ð‘€—";i:7332;s:4:"𑀘";i:7333;s:4:"ð‘€™";i:7334;s:4:"𑀚";i:7335;s:4:"ð‘€›";i:7336;s:4:"𑀜";i:7337;s:4:"ð‘€";i:7338;s:4:"𑀞";i:7339;s:4:"𑀟";i:7340;s:4:"ð‘€ ";i:7341;s:4:"𑀡";i:7342;s:4:"ð‘€¢";i:7343;s:4:"ð‘€£";i:7344;s:4:"𑀤";i:7345;s:4:"ð‘€¥";i:7346;s:4:"𑀦";i:7347;s:4:"𑀧";i:7348;s:4:"𑀨";i:7349;s:4:"𑀩";i:7350;s:4:"𑀪";i:7351;s:4:"𑀫";i:7352;s:4:"𑀬";i:7353;s:4:"ð‘€­";i:7354;s:4:"ð‘€®";i:7355;s:4:"𑀯";i:7356;s:4:"ð‘€°";i:7357;s:4:"ð‘€±";i:7358;s:4:"ð‘€²";i:7359;s:4:"ð‘€³";i:7360;s:4:"𑀃";i:7361;s:4:"𑀄";i:7362;s:4:"ð‘€´";i:7363;s:4:"ð‘€µ";i:7364;s:4:"𑀶";i:7365;s:4:"ð‘€·";i:7366;s:4:"ð¨€";i:7367;s:4:"ð¨";i:7368;s:4:"ð¨‘";i:7369;s:4:"ð¨’";i:7370;s:4:"ð¨“";i:7371;s:4:"ð¨•";i:7372;s:4:"ð¨–";i:7373;s:4:"ð¨—";i:7374;s:4:"ð¨™";i:7375;s:4:"ð¨š";i:7376;s:4:"ð¨›";i:7377;s:4:"ð¨œ";i:7378;s:4:"ð¨";i:7379;s:4:"ð¨ž";i:7380;s:4:"ð¨Ÿ";i:7381;s:4:"ð¨ ";i:7382;s:4:"ð¨¡";i:7383;s:4:"ð¨¢";i:7384;s:4:"ð¨£";i:7385;s:4:"ð¨¤";i:7386;s:4:"ð¨¥";i:7387;s:4:"ð¨¦";i:7388;s:4:"ð¨§";i:7389;s:4:"ð¨¨";i:7390;s:4:"ð¨©";i:7391;s:4:"ð¨ª";i:7392;s:4:"ð¨«";i:7393;s:4:"ð¨¬";i:7394;s:4:"ð¨­";i:7395;s:4:"ð¨®";i:7396;s:4:"ð¨¯";i:7397;s:4:"ð¨°";i:7398;s:4:"ð¨±";i:7399;s:4:"ð¨²";i:7400;s:4:"ð¨³";i:7401;s:3:"à¸";i:7402;s:3:"ข";i:7403;s:3:"ฃ";i:7404;s:3:"ค";i:7405;s:3:"ฅ";i:7406;s:3:"ฆ";i:7407;s:3:"ง";i:7408;s:3:"จ";i:7409;s:3:"ฉ";i:7410;s:3:"ช";i:7411;s:3:"ซ";i:7412;s:3:"ฌ";i:7413;s:3:"à¸";i:7414;s:3:"ฎ";i:7415;s:3:"à¸";i:7416;s:3:"à¸";i:7417;s:3:"ฑ";i:7418;s:3:"ฒ";i:7419;s:3:"ณ";i:7420;s:3:"ด";i:7421;s:3:"ต";i:7422;s:3:"ถ";i:7423;s:3:"ท";i:7424;s:3:"ธ";i:7425;s:3:"น";i:7426;s:3:"บ";i:7427;s:3:"ป";i:7428;s:3:"ผ";i:7429;s:3:"à¸";i:7430;s:3:"พ";i:7431;s:3:"ฟ";i:7432;s:3:"ภ";i:7433;s:3:"ม";i:7434;s:3:"ย";i:7435;s:3:"ร";i:7436;s:3:"ฤ";i:7437;s:3:"ล";i:7438;s:3:"ฦ";i:7439;s:3:"ว";i:7440;s:3:"ศ";i:7441;s:3:"ษ";i:7442;s:3:"ส";i:7443;s:3:"ห";i:7444;s:3:"ฬ";i:7445;s:3:"อ";i:7446;s:3:"ฮ";i:7447;s:3:"ฯ";i:7448;s:3:"ะ";i:7449;s:3:"า";i:7450;s:3:"ำ";i:7451;s:3:"เ";i:7452;s:3:"à¹";i:7453;s:3:"โ";i:7454;s:3:"ใ";i:7455;s:3:"ไ";i:7456;s:3:"ๅ";i:7457;s:3:"àº";i:7458;s:3:"ຂ";i:7459;s:3:"ຄ";i:7460;s:3:"ງ";i:7461;s:3:"ຈ";i:7462;s:3:"ສ";i:7463;s:3:"ຊ";i:7464;s:3:"àº";i:7465;s:3:"ດ";i:7466;s:3:"ຕ";i:7467;s:3:"ຖ";i:7468;s:3:"ທ";i:7469;s:3:"ນ";i:7470;s:3:"ບ";i:7471;s:3:"ປ";i:7472;s:3:"ຜ";i:7473;s:3:"àº";i:7474;s:3:"ພ";i:7475;s:3:"ຟ";i:7476;s:3:"ມ";i:7477;s:3:"ຢ";i:7478;s:3:"ຣ";i:7479;s:3:"ລ";i:7480;s:3:"ວ";i:7481;s:3:"ຫ";i:7482;s:3:"ອ";i:7483;s:3:"ຮ";i:7484;s:3:"ຯ";i:7485;s:3:"ະ";i:7486;s:3:"າ";i:7487;s:3:"ຳ";i:7488;s:3:"ຽ";i:7489;s:3:"ເ";i:7490;s:3:"à»";i:7491;s:3:"ໂ";i:7492;s:3:"ໃ";i:7493;s:3:"ໄ";i:7494;s:3:"ꪀ";i:7495;s:3:"êª";i:7496;s:3:"ꪂ";i:7497;s:3:"ꪃ";i:7498;s:3:"ꪄ";i:7499;s:3:"ꪅ";i:7500;s:3:"ꪆ";i:7501;s:3:"ꪇ";i:7502;s:3:"ꪈ";i:7503;s:3:"ꪉ";i:7504;s:3:"ꪊ";i:7505;s:3:"ꪋ";i:7506;s:3:"ꪌ";i:7507;s:3:"êª";i:7508;s:3:"ꪎ";i:7509;s:3:"êª";i:7510;s:3:"êª";i:7511;s:3:"ꪑ";i:7512;s:3:"ꪒ";i:7513;s:3:"ꪓ";i:7514;s:3:"ꪔ";i:7515;s:3:"ꪕ";i:7516;s:3:"ꪖ";i:7517;s:3:"ꪗ";i:7518;s:3:"ꪘ";i:7519;s:3:"ꪙ";i:7520;s:3:"ꪚ";i:7521;s:3:"ꪛ";i:7522;s:3:"ꪜ";i:7523;s:3:"êª";i:7524;s:3:"ꪞ";i:7525;s:3:"ꪟ";i:7526;s:3:"ꪠ";i:7527;s:3:"ꪡ";i:7528;s:3:"ꪢ";i:7529;s:3:"ꪣ";i:7530;s:3:"ꪤ";i:7531;s:3:"ꪥ";i:7532;s:3:"ꪦ";i:7533;s:3:"ꪧ";i:7534;s:3:"ꪨ";i:7535;s:3:"ꪩ";i:7536;s:3:"ꪪ";i:7537;s:3:"ꪫ";i:7538;s:3:"ꪬ";i:7539;s:3:"ꪭ";i:7540;s:3:"ꪮ";i:7541;s:3:"ꪯ";i:7542;s:3:"ꪱ";i:7543;s:3:"ꪵ";i:7544;s:3:"ꪶ";i:7545;s:3:"ꪹ";i:7546;s:3:"ꪺ";i:7547;s:3:"ꪻ";i:7548;s:3:"ꪼ";i:7549;s:3:"ꪽ";i:7550;s:3:"ê«€";i:7551;s:3:"ê«‚";i:7552;s:3:"ê«›";i:7553;s:3:"ê«œ";i:7554;s:3:"ཀ";i:7555;s:3:"ཫ";i:7556;s:3:"à½";i:7557;s:3:"ག";i:7558;s:3:"ང";i:7559;s:3:"ཅ";i:7560;s:3:"ཆ";i:7561;s:3:"ཇ";i:7562;s:3:"ཉ";i:7563;s:3:"ཊ";i:7564;s:3:"ཋ";i:7565;s:3:"ཌ";i:7566;s:3:"ཎ";i:7567;s:3:"à½";i:7568;s:3:"à½";i:7569;s:3:"ད";i:7570;s:3:"ན";i:7571;s:3:"པ";i:7572;s:3:"ཕ";i:7573;s:3:"བ";i:7574;s:3:"མ";i:7575;s:3:"ཙ";i:7576;s:3:"ཚ";i:7577;s:3:"ཛ";i:7578;s:3:"à½";i:7579;s:3:"ཞ";i:7580;s:3:"ཟ";i:7581;s:3:"འ";i:7582;s:3:"ཡ";i:7583;s:3:"ར";i:7584;s:3:"ཬ";i:7585;s:3:"ལ";i:7586;s:3:"ཤ";i:7587;s:3:"ཥ";i:7588;s:3:"ས";i:7589;s:3:"ཧ";i:7590;s:3:"ཨ";i:7591;s:3:"ྈ";i:7592;s:3:"ྉ";i:7593;s:3:"ྌ";i:7594;s:3:"ྊ";i:7595;s:3:"ྋ";i:7596;s:3:"á°€";i:7597;s:3:"á°";i:7598;s:3:"á°‚";i:7599;s:3:"á°ƒ";i:7600;s:3:"á°„";i:7601;s:3:"á°…";i:7602;s:3:"á°†";i:7603;s:3:"á°‡";i:7604;s:3:"á°ˆ";i:7605;s:3:"á°‰";i:7606;s:3:"á±";i:7607;s:3:"ᱎ";i:7608;s:3:"á±";i:7609;s:3:"á°Š";i:7610;s:3:"á°‹";i:7611;s:3:"á°Œ";i:7612;s:3:"á°";i:7613;s:3:"á°Ž";i:7614;s:3:"á°";i:7615;s:3:"á°";i:7616;s:3:"á°‘";i:7617;s:3:"á°’";i:7618;s:3:"á°“";i:7619;s:3:"á°”";i:7620;s:3:"á°•";i:7621;s:3:"á°–";i:7622;s:3:"á°—";i:7623;s:3:"á°˜";i:7624;s:3:"á°™";i:7625;s:3:"á°š";i:7626;s:3:"á°›";i:7627;s:3:"á°œ";i:7628;s:3:"á°";i:7629;s:3:"á°ž";i:7630;s:3:"á°Ÿ";i:7631;s:3:"á° ";i:7632;s:3:"á°¡";i:7633;s:3:"á°¢";i:7634;s:3:"á°£";i:7635;s:3:"ê¡€";i:7636;s:3:"ê¡";i:7637;s:3:"ê¡‚";i:7638;s:3:"ꡃ";i:7639;s:3:"ê¡„";i:7640;s:3:"ê¡…";i:7641;s:3:"ꡆ";i:7642;s:3:"ꡇ";i:7643;s:3:"ê¡©";i:7644;s:3:"ꡪ";i:7645;s:3:"ê¡«";i:7646;s:3:"ꡬ";i:7647;s:3:"ꡈ";i:7648;s:3:"ꡉ";i:7649;s:3:"ê¡Š";i:7650;s:3:"ê¡‹";i:7651;s:3:"ê¡Œ";i:7652;s:3:"ê¡";i:7653;s:3:"ê¡Ž";i:7654;s:3:"ê¡";i:7655;s:3:"ê¡";i:7656;s:3:"ê¡‘";i:7657;s:3:"ê¡’";i:7658;s:3:"ê¡“";i:7659;s:3:"ꡧ";i:7660;s:3:"ê¡”";i:7661;s:3:"ê¡•";i:7662;s:3:"ê¡–";i:7663;s:3:"ê¡—";i:7664;s:3:"ꡨ";i:7665;s:3:"ê¡­";i:7666;s:3:"ꡘ";i:7667;s:3:"ꡱ";i:7668;s:3:"ꡲ";i:7669;s:3:"ê¡™";i:7670;s:3:"ê¡š";i:7671;s:3:"ê¡®";i:7672;s:3:"ê¡›";i:7673;s:3:"ê¡œ";i:7674;s:3:"ꡯ";i:7675;s:3:"ê¡°";i:7676;s:3:"ê¡";i:7677;s:3:"ê¡¢";i:7678;s:3:"ê¡£";i:7679;s:3:"ꡤ";i:7680;s:3:"ê¡¥";i:7681;s:3:"ê¡ž";i:7682;s:3:"ê¡Ÿ";i:7683;s:3:"ê¡ ";i:7684;s:3:"ê¡¡";i:7685;s:3:"ꡦ";i:7686;s:3:"ꡳ";i:7687;s:3:"ᤀ";i:7688;s:3:"á¤";i:7689;s:3:"ᤂ";i:7690;s:3:"ᤃ";i:7691;s:3:"ᤄ";i:7692;s:3:"ᤅ";i:7693;s:3:"ᤆ";i:7694;s:3:"ᤇ";i:7695;s:3:"ᤈ";i:7696;s:3:"ᤉ";i:7697;s:3:"ᤊ";i:7698;s:3:"ᤋ";i:7699;s:3:"ᤌ";i:7700;s:3:"á¤";i:7701;s:3:"ᤎ";i:7702;s:3:"á¤";i:7703;s:3:"á¤";i:7704;s:3:"ᤑ";i:7705;s:3:"ᤒ";i:7706;s:3:"ᤓ";i:7707;s:3:"ᤔ";i:7708;s:3:"ᤕ";i:7709;s:3:"ᤖ";i:7710;s:3:"ᤗ";i:7711;s:3:"ᤘ";i:7712;s:3:"ᤙ";i:7713;s:3:"ᤚ";i:7714;s:3:"ᤛ";i:7715;s:3:"ᤜ";i:7716;s:3:"ᜀ";i:7717;s:3:"áœ";i:7718;s:3:"ᜂ";i:7719;s:3:"ᜃ";i:7720;s:3:"ᜄ";i:7721;s:3:"ᜅ";i:7722;s:3:"ᜆ";i:7723;s:3:"ᜇ";i:7724;s:3:"ᜈ";i:7725;s:3:"ᜉ";i:7726;s:3:"ᜊ";i:7727;s:3:"ᜋ";i:7728;s:3:"ᜌ";i:7729;s:3:"ᜎ";i:7730;s:3:"áœ";i:7731;s:3:"áœ";i:7732;s:3:"ᜑ";i:7733;s:3:"ᜠ";i:7734;s:3:"ᜡ";i:7735;s:3:"ᜢ";i:7736;s:3:"ᜣ";i:7737;s:3:"ᜤ";i:7738;s:3:"ᜥ";i:7739;s:3:"ᜦ";i:7740;s:3:"ᜧ";i:7741;s:3:"ᜨ";i:7742;s:3:"ᜩ";i:7743;s:3:"ᜪ";i:7744;s:3:"ᜫ";i:7745;s:3:"ᜬ";i:7746;s:3:"ᜭ";i:7747;s:3:"ᜮ";i:7748;s:3:"ᜯ";i:7749;s:3:"ᜰ";i:7750;s:3:"ᜱ";i:7751;s:3:"á€";i:7752;s:3:"á";i:7753;s:3:"á‚";i:7754;s:3:"áƒ";i:7755;s:3:"á„";i:7756;s:3:"á…";i:7757;s:3:"á†";i:7758;s:3:"á‡";i:7759;s:3:"áˆ";i:7760;s:3:"á‰";i:7761;s:3:"áŠ";i:7762;s:3:"á‹";i:7763;s:3:"áŒ";i:7764;s:3:"á";i:7765;s:3:"áŽ";i:7766;s:3:"á";i:7767;s:3:"á";i:7768;s:3:"á‘";i:7769;s:3:"á ";i:7770;s:3:"á¡";i:7771;s:3:"á¢";i:7772;s:3:"á£";i:7773;s:3:"á¤";i:7774;s:3:"á¥";i:7775;s:3:"á¦";i:7776;s:3:"á§";i:7777;s:3:"á¨";i:7778;s:3:"á©";i:7779;s:3:"áª";i:7780;s:3:"á«";i:7781;s:3:"á¬";i:7782;s:3:"á®";i:7783;s:3:"á¯";i:7784;s:3:"á°";i:7785;s:3:"ᨀ";i:7786;s:3:"á¨";i:7787;s:3:"ᨂ";i:7788;s:3:"ᨃ";i:7789;s:3:"ᨄ";i:7790;s:3:"ᨅ";i:7791;s:3:"ᨆ";i:7792;s:3:"ᨇ";i:7793;s:3:"ᨈ";i:7794;s:3:"ᨉ";i:7795;s:3:"ᨊ";i:7796;s:3:"ᨋ";i:7797;s:3:"ᨌ";i:7798;s:3:"á¨";i:7799;s:3:"ᨎ";i:7800;s:3:"á¨";i:7801;s:3:"á¨";i:7802;s:3:"ᨑ";i:7803;s:3:"ᨒ";i:7804;s:3:"ᨓ";i:7805;s:3:"ᨔ";i:7806;s:3:"ᨕ";i:7807;s:3:"ᨖ";i:7808;s:3:"ᯀ";i:7809;s:3:"ᯂ";i:7810;s:3:"ᯅ";i:7811;s:3:"ᯇ";i:7812;s:3:"ᯉ";i:7813;s:3:"ᯋ";i:7814;s:3:"ᯎ";i:7815;s:3:"á¯";i:7816;s:3:"ᯑ";i:7817;s:3:"ᯒ";i:7818;s:3:"ᯔ";i:7819;s:3:"ᯖ";i:7820;s:3:"ᯘ";i:7821;s:3:"ᯛ";i:7822;s:3:"á¯";i:7823;s:3:"ᯞ";i:7824;s:3:"ᯠ";i:7825;s:3:"ᯡ";i:7826;s:3:"ᯢ";i:7827;s:3:"ᯣ";i:7828;s:3:"ᯤ";i:7829;s:3:"ᯥ";i:7830;s:3:"ꤰ";i:7831;s:3:"ꤱ";i:7832;s:3:"ꤲ";i:7833;s:3:"ꤳ";i:7834;s:3:"ꤴ";i:7835;s:3:"ꤵ";i:7836;s:3:"ꤶ";i:7837;s:3:"ꤷ";i:7838;s:3:"ꤸ";i:7839;s:3:"ꤹ";i:7840;s:3:"ꤺ";i:7841;s:3:"ꤻ";i:7842;s:3:"ꤼ";i:7843;s:3:"ꤽ";i:7844;s:3:"ꤾ";i:7845;s:3:"ꤿ";i:7846;s:3:"ꥀ";i:7847;s:3:"ê¥";i:7848;s:3:"ꥂ";i:7849;s:3:"ꥃ";i:7850;s:3:"ꥄ";i:7851;s:3:"ꥅ";i:7852;s:3:"ꥆ";i:7853;s:3:"ꤊ";i:7854;s:3:"ꤋ";i:7855;s:3:"ꤌ";i:7856;s:3:"ê¤";i:7857;s:3:"ꤎ";i:7858;s:3:"ê¤";i:7859;s:3:"ê¤";i:7860;s:3:"ꤑ";i:7861;s:3:"ꤒ";i:7862;s:3:"ꤓ";i:7863;s:3:"ꤔ";i:7864;s:3:"ꤕ";i:7865;s:3:"ꤖ";i:7866;s:3:"ꤗ";i:7867;s:3:"ꤘ";i:7868;s:3:"ꤙ";i:7869;s:3:"ꤚ";i:7870;s:3:"ꤛ";i:7871;s:3:"ꤜ";i:7872;s:3:"ê¤";i:7873;s:3:"ꤞ";i:7874;s:3:"ꤟ";i:7875;s:3:"ꤠ";i:7876;s:3:"ꤡ";i:7877;s:3:"ꤢ";i:7878;s:3:"ꤣ";i:7879;s:3:"ꤤ";i:7880;s:3:"ꤥ";i:7881;s:3:"က";i:7882;s:3:"áµ";i:7883;s:3:"á€";i:7884;s:3:"á¶";i:7885;s:3:"ဂ";i:7886;s:3:"á·";i:7887;s:3:"ê© ";i:7888;s:3:"ဃ";i:7889;s:3:"င";i:7890;s:3:"áš";i:7891;s:3:"စ";i:7892;s:3:"á¸";i:7893;s:3:"ê©¡";i:7894;s:3:"ဆ";i:7895;s:3:"ê©¢";i:7896;s:3:"ဇ";i:7897;s:3:"ê©£";i:7898;s:3:"á¹";i:7899;s:3:"ꩲ";i:7900;s:3:"ဈ";i:7901;s:3:"á›";i:7902;s:3:"ꩤ";i:7903;s:3:"á¡";i:7904;s:3:"ဉ";i:7905;s:3:"áº";i:7906;s:3:"ê©¥";i:7907;s:3:"ည";i:7908;s:3:"ဋ";i:7909;s:3:"ꩦ";i:7910;s:3:"ဌ";i:7911;s:3:"ꩧ";i:7912;s:3:"á€";i:7913;s:3:"ꩨ";i:7914;s:3:"ဎ";i:7915;s:3:"ê©©";i:7916;s:3:"á€";i:7917;s:3:"á®";i:7918;s:3:"á€";i:7919;s:3:"ထ";i:7920;s:3:"ဒ";i:7921;s:3:"á»";i:7922;s:3:"ဓ";i:7923;s:3:"ꩪ";i:7924;s:3:"န";i:7925;s:3:"á¼";i:7926;s:3:"ê©«";i:7927;s:3:"ပ";i:7928;s:3:"ဖ";i:7929;s:3:"á½";i:7930;s:3:"á¾";i:7931;s:3:"ꩯ";i:7932;s:3:"á‚Ž";i:7933;s:3:"ဗ";i:7934;s:3:"á¿";i:7935;s:3:"ဘ";i:7936;s:3:"မ";i:7937;s:3:"ယ";i:7938;s:3:"ရ";i:7939;s:3:"ꩳ";i:7940;s:3:"ꩺ";i:7941;s:3:"လ";i:7942;s:3:"á€";i:7943;s:3:"á‚€";i:7944;s:3:"á";i:7945;s:3:"á‘";i:7946;s:3:"á¥";i:7947;s:3:"သ";i:7948;s:3:"ꩬ";i:7949;s:3:"ဟ";i:7950;s:3:"á‚";i:7951;s:3:"ê©­";i:7952;s:3:"ê©®";i:7953;s:3:"ꩱ";i:7954;s:3:"ဠ";i:7955;s:3:"áœ";i:7956;s:3:"á";i:7957;s:3:"á¯";i:7958;s:3:"á°";i:7959;s:3:"á¦";i:7960;s:3:"အ";i:7961;s:3:"ဢ";i:7962;s:3:"ဣ";i:7963;s:3:"ဤ";i:7964;s:3:"ဥ";i:7965;s:3:"ဦ";i:7966;s:3:"á’";i:7967;s:3:"á“";i:7968;s:3:"á”";i:7969;s:3:"á•";i:7970;s:3:"ဧ";i:7971;s:3:"ဨ";i:7972;s:3:"ဩ";i:7973;s:3:"ဪ";i:7974;s:3:"ê©´";i:7975;s:3:"ꩵ";i:7976;s:3:"ꩶ";i:7977;s:3:"ក";i:7978;s:3:"áž";i:7979;s:3:"áž‚";i:7980;s:3:"ឃ";i:7981;s:3:"áž„";i:7982;s:3:"áž…";i:7983;s:3:"ឆ";i:7984;s:3:"ជ";i:7985;s:3:"ឈ";i:7986;s:3:"ញ";i:7987;s:3:"ដ";i:7988;s:3:"áž‹";i:7989;s:3:"ឌ";i:7990;s:3:"áž";i:7991;s:3:"ណ";i:7992;s:3:"áž";i:7993;s:3:"áž";i:7994;s:3:"áž‘";i:7995;s:3:"áž’";i:7996;s:3:"áž“";i:7997;s:3:"áž”";i:7998;s:3:"áž•";i:7999;s:3:"áž–";i:8000;s:3:"áž—";i:8001;s:3:"ម";i:8002;s:3:"áž™";i:8003;s:3:"ážš";i:8004;s:3:"áž›";i:8005;s:3:"ážœ";i:8006;s:3:"áž";i:8007;s:3:"ážž";i:8008;s:3:"ស";i:8009;s:3:"áž ";i:8010;s:3:"áž¡";i:8011;s:3:"អ";i:8012;s:3:"ៜ";i:8013;s:3:"ឣ";i:8014;s:3:"ឤ";i:8015;s:3:"ឥ";i:8016;s:3:"ឦ";i:8017;s:3:"ឧ";i:8018;s:3:"ឨ";i:8019;s:3:"áž©";i:8020;s:3:"ឪ";i:8021;s:3:"áž«";i:8022;s:3:"ឬ";i:8023;s:3:"áž­";i:8024;s:3:"áž®";i:8025;s:3:"ឯ";i:8026;s:3:"áž°";i:8027;s:3:"áž±";i:8028;s:3:"áž²";i:8029;s:3:"áž³";i:8030;s:3:"á¥";i:8031;s:3:"ᥑ";i:8032;s:3:"ᥒ";i:8033;s:3:"ᥓ";i:8034;s:3:"ᥔ";i:8035;s:3:"ᥕ";i:8036;s:3:"ᥖ";i:8037;s:3:"ᥗ";i:8038;s:3:"ᥘ";i:8039;s:3:"ᥙ";i:8040;s:3:"ᥚ";i:8041;s:3:"ᥛ";i:8042;s:3:"ᥜ";i:8043;s:3:"á¥";i:8044;s:3:"ᥞ";i:8045;s:3:"ᥟ";i:8046;s:3:"ᥠ";i:8047;s:3:"ᥡ";i:8048;s:3:"ᥢ";i:8049;s:3:"ᥣ";i:8050;s:3:"ᥤ";i:8051;s:3:"ᥥ";i:8052;s:3:"ᥦ";i:8053;s:3:"ᥧ";i:8054;s:3:"ᥨ";i:8055;s:3:"ᥩ";i:8056;s:3:"ᥪ";i:8057;s:3:"ᥫ";i:8058;s:3:"ᥬ";i:8059;s:3:"ᥭ";i:8060;s:3:"ᥰ";i:8061;s:3:"ᥱ";i:8062;s:3:"ᥲ";i:8063;s:3:"ᥳ";i:8064;s:3:"ᥴ";i:8065;s:3:"ᦀ";i:8066;s:3:"á¦";i:8067;s:3:"ᦂ";i:8068;s:3:"ᦃ";i:8069;s:3:"ᦄ";i:8070;s:3:"ᦅ";i:8071;s:3:"ᦆ";i:8072;s:3:"ᦇ";i:8073;s:3:"ᦈ";i:8074;s:3:"ᦉ";i:8075;s:3:"ᦊ";i:8076;s:3:"ᦋ";i:8077;s:3:"ᦌ";i:8078;s:3:"á¦";i:8079;s:3:"ᦎ";i:8080;s:3:"á¦";i:8081;s:3:"á¦";i:8082;s:3:"ᦑ";i:8083;s:3:"ᦒ";i:8084;s:3:"ᦓ";i:8085;s:3:"ᦔ";i:8086;s:3:"ᦕ";i:8087;s:3:"ᦖ";i:8088;s:3:"ᦗ";i:8089;s:3:"ᦘ";i:8090;s:3:"ᦙ";i:8091;s:3:"ᦚ";i:8092;s:3:"ᦛ";i:8093;s:3:"ᦜ";i:8094;s:3:"á¦";i:8095;s:3:"ᦞ";i:8096;s:3:"ᦟ";i:8097;s:3:"ᦠ";i:8098;s:3:"ᦡ";i:8099;s:3:"ᦢ";i:8100;s:3:"ᦣ";i:8101;s:3:"ᦤ";i:8102;s:3:"ᦥ";i:8103;s:3:"ᦦ";i:8104;s:3:"ᦧ";i:8105;s:3:"ᦨ";i:8106;s:3:"ᦩ";i:8107;s:3:"ᦪ";i:8108;s:3:"ᦫ";i:8109;s:3:"á§";i:8110;s:3:"ᧂ";i:8111;s:3:"ᧃ";i:8112;s:3:"ᧄ";i:8113;s:3:"ᧅ";i:8114;s:3:"ᧆ";i:8115;s:3:"ᧇ";i:8116;s:3:"ᨠ";i:8117;s:3:"ᨡ";i:8118;s:3:"ᨢ";i:8119;s:3:"ᨣ";i:8120;s:3:"ᨤ";i:8121;s:3:"ᨥ";i:8122;s:3:"ᨦ";i:8123;s:3:"ᨧ";i:8124;s:3:"ᨨ";i:8125;s:3:"ᨩ";i:8126;s:3:"ᨪ";i:8127;s:3:"ᨫ";i:8128;s:3:"ᨬ";i:8129;s:3:"ᨭ";i:8130;s:3:"ᨮ";i:8131;s:3:"ᨯ";i:8132;s:3:"ᨰ";i:8133;s:3:"ᨱ";i:8134;s:3:"ᨲ";i:8135;s:3:"ᨳ";i:8136;s:3:"ᨴ";i:8137;s:3:"ᨵ";i:8138;s:3:"ᨶ";i:8139;s:3:"ᨷ";i:8140;s:3:"ᨸ";i:8141;s:3:"ᨹ";i:8142;s:3:"ᨺ";i:8143;s:3:"ᨻ";i:8144;s:3:"ᨼ";i:8145;s:3:"ᨽ";i:8146;s:3:"ᨾ";i:8147;s:3:"ᨿ";i:8148;s:3:"á©€";i:8149;s:3:"á©";i:8150;s:3:"á©‚";i:8151;s:3:"ᩃ";i:8152;s:3:"á©„";i:8153;s:3:"á©…";i:8154;s:3:"ᩆ";i:8155;s:3:"ᩇ";i:8156;s:3:"ᩈ";i:8157;s:3:"ᩉ";i:8158;s:3:"á©Š";i:8159;s:3:"á©‹";i:8160;s:3:"á©Œ";i:8161;s:3:"á©“";i:8162;s:3:"á©";i:8163;s:3:"á©Ž";i:8164;s:3:"á©";i:8165;s:3:"á©";i:8166;s:3:"á©‘";i:8167;s:3:"á©’";i:8168;s:3:"ꨀ";i:8169;s:3:"ê¨";i:8170;s:3:"ꨂ";i:8171;s:3:"ꨃ";i:8172;s:3:"ꨄ";i:8173;s:3:"ꨅ";i:8174;s:3:"ꨆ";i:8175;s:3:"ꨇ";i:8176;s:3:"ꨈ";i:8177;s:3:"ꨉ";i:8178;s:3:"ꨊ";i:8179;s:3:"ꨋ";i:8180;s:3:"ꨌ";i:8181;s:3:"ê¨";i:8182;s:3:"ꨎ";i:8183;s:3:"ê¨";i:8184;s:3:"ê¨";i:8185;s:3:"ꨑ";i:8186;s:3:"ꨒ";i:8187;s:3:"ꨓ";i:8188;s:3:"ꨔ";i:8189;s:3:"ꨕ";i:8190;s:3:"ꨖ";i:8191;s:3:"ꨗ";i:8192;s:3:"ꨘ";i:8193;s:3:"ꨙ";i:8194;s:3:"ꨚ";i:8195;s:3:"ꨛ";i:8196;s:3:"ꨜ";i:8197;s:3:"ê¨";i:8198;s:3:"ꨞ";i:8199;s:3:"ꨟ";i:8200;s:3:"ꨠ";i:8201;s:3:"ꨡ";i:8202;s:3:"ꨢ";i:8203;s:3:"ꨣ";i:8204;s:3:"ꨤ";i:8205;s:3:"ꨥ";i:8206;s:3:"ꨦ";i:8207;s:3:"ꨧ";i:8208;s:3:"ꨨ";i:8209;s:3:"ê©€";i:8210;s:3:"ê©";i:8211;s:3:"ê©‚";i:8212;s:3:"ê©„";i:8213;s:3:"ê©…";i:8214;s:3:"ꩆ";i:8215;s:3:"ꩇ";i:8216;s:3:"ꩈ";i:8217;s:3:"ꩉ";i:8218;s:3:"ê©Š";i:8219;s:3:"ê©‹";i:8220;s:3:"ᬅ";i:8221;s:3:"ᬆ";i:8222;s:3:"ᬇ";i:8223;s:3:"ᬈ";i:8224;s:3:"ᬉ";i:8225;s:3:"ᬊ";i:8226;s:3:"ᬋ";i:8227;s:3:"ᬌ";i:8228;s:3:"á¬";i:8229;s:3:"ᬎ";i:8230;s:3:"á¬";i:8231;s:3:"á¬";i:8232;s:3:"ᬑ";i:8233;s:3:"ᬒ";i:8234;s:3:"ᬓ";i:8235;s:3:"á­…";i:8236;s:3:"á­†";i:8237;s:3:"ᬔ";i:8238;s:3:"ᬕ";i:8239;s:3:"ᬖ";i:8240;s:3:"ᬗ";i:8241;s:3:"ᬘ";i:8242;s:3:"ᬙ";i:8243;s:3:"ᬚ";i:8244;s:3:"ᬛ";i:8245;s:3:"ᬜ";i:8246;s:3:"á¬";i:8247;s:3:"ᬞ";i:8248;s:3:"ᬟ";i:8249;s:3:"ᬠ";i:8250;s:3:"ᬡ";i:8251;s:3:"ᬢ";i:8252;s:3:"á­‡";i:8253;s:3:"ᬣ";i:8254;s:3:"ᬤ";i:8255;s:3:"ᬥ";i:8256;s:3:"ᬦ";i:8257;s:3:"ᬧ";i:8258;s:3:"á­ˆ";i:8259;s:3:"ᬨ";i:8260;s:3:"ᬩ";i:8261;s:3:"ᬪ";i:8262;s:3:"ᬫ";i:8263;s:3:"ᬬ";i:8264;s:3:"ᬭ";i:8265;s:3:"ᬮ";i:8266;s:3:"ᬯ";i:8267;s:3:"á­‰";i:8268;s:3:"ᬰ";i:8269;s:3:"ᬱ";i:8270;s:3:"ᬲ";i:8271;s:3:"á­Š";i:8272;s:3:"á­‹";i:8273;s:3:"ᬳ";i:8274;s:3:"ꦄ";i:8275;s:3:"ꦅ";i:8276;s:3:"ꦆ";i:8277;s:3:"ꦇ";i:8278;s:3:"ꦈ";i:8279;s:3:"ꦉ";i:8280;s:3:"ꦊ";i:8281;s:3:"ꦋ";i:8282;s:3:"ꦌ";i:8283;s:3:"ê¦";i:8284;s:3:"ꦎ";i:8285;s:3:"ê¦";i:8286;s:3:"ê¦";i:8287;s:3:"ꦑ";i:8288;s:3:"ꦒ";i:8289;s:3:"ꦓ";i:8290;s:3:"ꦔ";i:8291;s:3:"ꦕ";i:8292;s:3:"ꦖ";i:8293;s:3:"ꦗ";i:8294;s:3:"ꦘ";i:8295;s:3:"ꦙ";i:8296;s:3:"ꦚ";i:8297;s:3:"ꦛ";i:8298;s:3:"ꦜ";i:8299;s:3:"ê¦";i:8300;s:3:"ꦞ";i:8301;s:3:"ꦟ";i:8302;s:3:"ꦠ";i:8303;s:3:"ꦡ";i:8304;s:3:"ꦢ";i:8305;s:3:"ꦣ";i:8306;s:3:"ꦤ";i:8307;s:3:"ꦥ";i:8308;s:3:"ꦦ";i:8309;s:3:"ꦧ";i:8310;s:3:"ꦨ";i:8311;s:3:"ꦩ";i:8312;s:3:"ꦪ";i:8313;s:3:"ꦫ";i:8314;s:3:"ꦭ";i:8315;s:3:"ꦮ";i:8316;s:3:"ꦯ";i:8317;s:3:"ꦰ";i:8318;s:3:"ꦱ";i:8319;s:3:"ꦲ";i:8320;s:3:"ᢀ";i:8321;s:3:"á¢";i:8322;s:3:"ᢂ";i:8323;s:3:"ᢃ";i:8324;s:3:"ᢄ";i:8325;s:3:"ᢅ";i:8326;s:3:"ᢆ";i:8327;s:3:"ᡃ";i:8328;s:3:"á  ";i:8329;s:3:"ᢇ";i:8330;s:3:"á ¡";i:8331;s:3:"á¡„";i:8332;s:3:"á¡";i:8333;s:3:"á ¢";i:8334;s:3:"á¡…";i:8335;s:3:"á¡ž";i:8336;s:3:"ᡳ";i:8337;s:3:"ᢈ";i:8338;s:3:"á¡Ÿ";i:8339;s:3:"á £";i:8340;s:3:"ᡆ";i:8341;s:3:"á ¤";i:8342;s:3:"ᡇ";i:8343;s:3:"á¡¡";i:8344;s:3:"á ¥";i:8345;s:3:"ᡈ";i:8346;s:3:"á ¦";i:8347;s:3:"ᡉ";i:8348;s:3:"á¡ ";i:8349;s:3:"á §";i:8350;s:3:"á ¨";i:8351;s:3:"á ©";i:8352;s:3:"á¡Š";i:8353;s:3:"á¡¢";i:8354;s:3:"ᢊ";i:8355;s:3:"ᢛ";i:8356;s:3:"á ª";i:8357;s:3:"á¡‹";i:8358;s:3:"á «";i:8359;s:3:"á¡Œ";i:8360;s:3:"ᡦ";i:8361;s:3:"á ¬";i:8362;s:3:"á¡";i:8363;s:3:"á ­";i:8364;s:3:"á¡Ž";i:8365;s:3:"ᡤ";i:8366;s:3:"ᢚ";i:8367;s:3:"á¡¥";i:8368;s:3:"á ®";i:8369;s:3:"á¡";i:8370;s:3:"á ¯";i:8371;s:3:"á °";i:8372;s:3:"á ±";i:8373;s:3:"ᡧ";i:8374;s:3:"ᢜ";i:8375;s:3:"á¢";i:8376;s:3:"ᢢ";i:8377;s:3:"ᢤ";i:8378;s:3:"ᢥ";i:8379;s:3:"á ²";i:8380;s:3:"á¡";i:8381;s:3:"ᡨ";i:8382;s:3:"á ³";i:8383;s:3:"á¡‘";i:8384;s:3:"á¡©";i:8385;s:3:"á ´";i:8386;s:3:"á¡’";i:8387;s:3:"ᡱ";i:8388;s:3:"á¡œ";i:8389;s:3:"ᢋ";i:8390;s:3:"á µ";i:8391;s:3:"á¡“";i:8392;s:3:"ᡪ";i:8393;s:3:"á¡·";i:8394;s:3:"á ¶";i:8395;s:3:"á¡•";i:8396;s:3:"ᡲ";i:8397;s:3:"á ·";i:8398;s:3:"ᡵ";i:8399;s:3:"á ¸";i:8400;s:3:"á¡–";i:8401;s:3:"á ¹";i:8402;s:3:"á¡«";i:8403;s:3:"ᡶ";i:8404;s:3:"á º";i:8405;s:3:"á¡—";i:8406;s:3:"á¡£";i:8407;s:3:"á¡´";i:8408;s:3:"ᢉ";i:8409;s:3:"á »";i:8410;s:3:"á ¼";i:8411;s:3:"á¡”";i:8412;s:3:"á¡®";i:8413;s:3:"á ½";i:8414;s:3:"ᡯ";i:8415;s:3:"ᡘ";i:8416;s:3:"ᡬ";i:8417;s:3:"á ¾";i:8418;s:3:"á¡™";i:8419;s:3:"á¡­";i:8420;s:3:"á ¿";i:8421;s:3:"á¡€";i:8422;s:3:"á¡";i:8423;s:3:"á¡‚";i:8424;s:3:"á¡š";i:8425;s:3:"á¡›";i:8426;s:3:"á¡°";i:8427;s:3:"ᢌ";i:8428;s:3:"ᢞ";i:8429;s:3:"á¢";i:8430;s:3:"ᢎ";i:8431;s:3:"ᢟ";i:8432;s:3:"á¢";i:8433;s:3:"á¢";i:8434;s:3:"ᢘ";i:8435;s:3:"ᢠ";i:8436;s:3:"ᢑ";i:8437;s:3:"ᢡ";i:8438;s:3:"ᢒ";i:8439;s:3:"ᢓ";i:8440;s:3:"ᢨ";i:8441;s:3:"ᢔ";i:8442;s:3:"ᢣ";i:8443;s:3:"ᢕ";i:8444;s:3:"ᢙ";i:8445;s:3:"ᢖ";i:8446;s:3:"ᢗ";i:8447;s:3:"ᢦ";i:8448;s:3:"ᢧ";i:8449;s:3:"ᢪ";i:8450;s:3:"ᱚ";i:8451;s:3:"á±›";i:8452;s:3:"ᱜ";i:8453;s:3:"á±";i:8454;s:3:"ᱞ";i:8455;s:3:"ᱟ";i:8456;s:3:"á± ";i:8457;s:3:"ᱡ";i:8458;s:3:"á±¢";i:8459;s:3:"á±£";i:8460;s:3:"ᱤ";i:8461;s:3:"á±¥";i:8462;s:3:"ᱦ";i:8463;s:3:"ᱧ";i:8464;s:3:"ᱨ";i:8465;s:3:"ᱩ";i:8466;s:3:"ᱪ";i:8467;s:3:"ᱫ";i:8468;s:3:"ᱬ";i:8469;s:3:"á±­";i:8470;s:3:"á±®";i:8471;s:3:"ᱯ";i:8472;s:3:"á±°";i:8473;s:3:"á±±";i:8474;s:3:"á±²";i:8475;s:3:"á±³";i:8476;s:3:"á±´";i:8477;s:3:"á±µ";i:8478;s:3:"ᱶ";i:8479;s:3:"á±·";i:8480;s:3:"ᱸ";i:8481;s:3:"á±¹";i:8482;s:3:"ᱺ";i:8483;s:3:"á±»";i:8484;s:3:"á±¼";i:8485;s:3:"á±½";i:8486;s:3:"Ꭰ";i:8487;s:3:"Ꭱ";i:8488;s:3:"Ꭲ";i:8489;s:3:"Ꭳ";i:8490;s:3:"Ꭴ";i:8491;s:3:"Ꭵ";i:8492;s:3:"Ꭶ";i:8493;s:3:"Ꭷ";i:8494;s:3:"Ꭸ";i:8495;s:3:"Ꭹ";i:8496;s:3:"Ꭺ";i:8497;s:3:"Ꭻ";i:8498;s:3:"Ꭼ";i:8499;s:3:"Ꭽ";i:8500;s:3:"Ꭾ";i:8501;s:3:"Ꭿ";i:8502;s:3:"Ꮀ";i:8503;s:3:"Ꮁ";i:8504;s:3:"Ꮂ";i:8505;s:3:"Ꮃ";i:8506;s:3:"Ꮄ";i:8507;s:3:"Ꮅ";i:8508;s:3:"Ꮆ";i:8509;s:3:"Ꮇ";i:8510;s:3:"Ꮈ";i:8511;s:3:"Ꮉ";i:8512;s:3:"Ꮊ";i:8513;s:3:"Ꮋ";i:8514;s:3:"Ꮌ";i:8515;s:3:"Ꮍ";i:8516;s:3:"Ꮎ";i:8517;s:3:"Ꮏ";i:8518;s:3:"á€";i:8519;s:3:"á";i:8520;s:3:"á‚";i:8521;s:3:"áƒ";i:8522;s:3:"á„";i:8523;s:3:"á…";i:8524;s:3:"á†";i:8525;s:3:"á‡";i:8526;s:3:"áˆ";i:8527;s:3:"á‰";i:8528;s:3:"áŠ";i:8529;s:3:"á‹";i:8530;s:3:"áŒ";i:8531;s:3:"á";i:8532;s:3:"áŽ";i:8533;s:3:"á";i:8534;s:3:"á";i:8535;s:3:"á‘";i:8536;s:3:"á’";i:8537;s:3:"á“";i:8538;s:3:"á”";i:8539;s:3:"á•";i:8540;s:3:"á–";i:8541;s:3:"á—";i:8542;s:3:"á˜";i:8543;s:3:"á™";i:8544;s:3:"áš";i:8545;s:3:"á›";i:8546;s:3:"áœ";i:8547;s:3:"á";i:8548;s:3:"áž";i:8549;s:3:"áŸ";i:8550;s:3:"á ";i:8551;s:3:"á¡";i:8552;s:3:"á¢";i:8553;s:3:"á£";i:8554;s:3:"á¤";i:8555;s:3:"á¥";i:8556;s:3:"á¦";i:8557;s:3:"á§";i:8558;s:3:"á¨";i:8559;s:3:"á©";i:8560;s:3:"áª";i:8561;s:3:"á«";i:8562;s:3:"á¬";i:8563;s:3:"á­";i:8564;s:3:"á®";i:8565;s:3:"á¯";i:8566;s:3:"á°";i:8567;s:3:"á±";i:8568;s:3:"á²";i:8569;s:3:"á³";i:8570;s:3:"á´";i:8571;s:3:"á";i:8572;s:3:"á‚";i:8573;s:3:"áƒ";i:8574;s:3:"á„";i:8575;s:3:"á…";i:8576;s:3:"á†";i:8577;s:3:"á‡";i:8578;s:3:"áˆ";i:8579;s:3:"á‰";i:8580;s:3:"áŠ";i:8581;s:3:"á‹";i:8582;s:3:"áŒ";i:8583;s:3:"á";i:8584;s:3:"áŽ";i:8585;s:3:"á";i:8586;s:3:"á";i:8587;s:3:"á‘";i:8588;s:3:"á’";i:8589;s:3:"á“";i:8590;s:3:"á”";i:8591;s:3:"á•";i:8592;s:3:"á–";i:8593;s:3:"á—";i:8594;s:3:"á˜";i:8595;s:3:"á™";i:8596;s:3:"áš";i:8597;s:3:"á›";i:8598;s:3:"áœ";i:8599;s:3:"á";i:8600;s:3:"áž";i:8601;s:3:"áŸ";i:8602;s:3:"á ";i:8603;s:3:"á¡";i:8604;s:3:"á¢";i:8605;s:3:"á£";i:8606;s:3:"á¤";i:8607;s:3:"á¥";i:8608;s:3:"á¦";i:8609;s:3:"á§";i:8610;s:3:"á¨";i:8611;s:3:"á©";i:8612;s:3:"áª";i:8613;s:3:"á«";i:8614;s:3:"á¬";i:8615;s:3:"á­";i:8616;s:3:"á®";i:8617;s:3:"á¯";i:8618;s:3:"á°";i:8619;s:3:"á±";i:8620;s:3:"á²";i:8621;s:3:"á³";i:8622;s:3:"á´";i:8623;s:3:"áµ";i:8624;s:3:"á¶";i:8625;s:3:"á·";i:8626;s:3:"á¸";i:8627;s:3:"á¹";i:8628;s:3:"áº";i:8629;s:3:"á»";i:8630;s:3:"á¼";i:8631;s:3:"á½";i:8632;s:3:"á¾";i:8633;s:3:"á¿";i:8634;s:3:"á‘€";i:8635;s:3:"á‘";i:8636;s:3:"á‘‚";i:8637;s:3:"ᑃ";i:8638;s:3:"á‘„";i:8639;s:3:"á‘…";i:8640;s:3:"ᑆ";i:8641;s:3:"ᑇ";i:8642;s:3:"ᑈ";i:8643;s:3:"ᑉ";i:8644;s:3:"á‘Š";i:8645;s:3:"á‘‹";i:8646;s:3:"á‘Œ";i:8647;s:3:"á‘";i:8648;s:3:"á‘Ž";i:8649;s:3:"á‘";i:8650;s:3:"á‘";i:8651;s:3:"á‘‘";i:8652;s:3:"á‘’";i:8653;s:3:"á‘“";i:8654;s:3:"á‘”";i:8655;s:3:"á‘•";i:8656;s:3:"á‘–";i:8657;s:3:"á‘—";i:8658;s:3:"ᑘ";i:8659;s:3:"á‘™";i:8660;s:3:"á‘š";i:8661;s:3:"á‘›";i:8662;s:3:"á‘œ";i:8663;s:3:"á‘";i:8664;s:3:"á‘ž";i:8665;s:3:"á‘Ÿ";i:8666;s:3:"á‘ ";i:8667;s:3:"á‘¡";i:8668;s:3:"á‘¢";i:8669;s:3:"á‘£";i:8670;s:3:"ᑤ";i:8671;s:3:"á‘¥";i:8672;s:3:"ᑦ";i:8673;s:3:"ᑧ";i:8674;s:3:"ᑨ";i:8675;s:3:"á‘©";i:8676;s:3:"ᑪ";i:8677;s:3:"á‘«";i:8678;s:3:"ᑬ";i:8679;s:3:"á‘­";i:8680;s:3:"á‘®";i:8681;s:3:"ᑯ";i:8682;s:3:"á‘°";i:8683;s:3:"ᑱ";i:8684;s:3:"ᑲ";i:8685;s:3:"ᑳ";i:8686;s:3:"á‘´";i:8687;s:3:"ᑵ";i:8688;s:3:"ᑶ";i:8689;s:3:"á‘·";i:8690;s:3:"ᑸ";i:8691;s:3:"ᑹ";i:8692;s:3:"ᑺ";i:8693;s:3:"á‘»";i:8694;s:3:"ᑼ";i:8695;s:3:"ᑽ";i:8696;s:3:"ᑾ";i:8697;s:3:"á‘¿";i:8698;s:3:"á’€";i:8699;s:3:"á’";i:8700;s:3:"á’‚";i:8701;s:3:"á’ƒ";i:8702;s:3:"á’„";i:8703;s:3:"á’…";i:8704;s:3:"á’†";i:8705;s:3:"á’‡";i:8706;s:3:"á’ˆ";i:8707;s:3:"á’‰";i:8708;s:3:"á’Š";i:8709;s:3:"á’‹";i:8710;s:3:"á’Œ";i:8711;s:3:"á’";i:8712;s:3:"á’Ž";i:8713;s:3:"á’";i:8714;s:3:"á’";i:8715;s:3:"á’‘";i:8716;s:3:"á’’";i:8717;s:3:"á’“";i:8718;s:3:"á’”";i:8719;s:3:"á’•";i:8720;s:3:"á’–";i:8721;s:3:"á’—";i:8722;s:3:"á’˜";i:8723;s:3:"á’™";i:8724;s:3:"á’š";i:8725;s:3:"á’›";i:8726;s:3:"á’œ";i:8727;s:3:"á’";i:8728;s:3:"á’ž";i:8729;s:3:"á’Ÿ";i:8730;s:3:"á’ ";i:8731;s:3:"á’¡";i:8732;s:3:"á’¢";i:8733;s:3:"á’£";i:8734;s:3:"á’¤";i:8735;s:3:"á’¥";i:8736;s:3:"á’¦";i:8737;s:3:"á’§";i:8738;s:3:"á’¨";i:8739;s:3:"á’©";i:8740;s:3:"á’ª";i:8741;s:3:"á’«";i:8742;s:3:"á’¬";i:8743;s:3:"á’­";i:8744;s:3:"á’®";i:8745;s:3:"á’¯";i:8746;s:3:"á’°";i:8747;s:3:"á’±";i:8748;s:3:"á’²";i:8749;s:3:"á’³";i:8750;s:3:"á’´";i:8751;s:3:"á’µ";i:8752;s:3:"á’¶";i:8753;s:3:"á’·";i:8754;s:3:"á’¸";i:8755;s:3:"á’¹";i:8756;s:3:"á’º";i:8757;s:3:"á’»";i:8758;s:3:"á’¼";i:8759;s:3:"á’½";i:8760;s:3:"á’¾";i:8761;s:3:"á’¿";i:8762;s:3:"á“€";i:8763;s:3:"á“";i:8764;s:3:"á“‚";i:8765;s:3:"ᓃ";i:8766;s:3:"á“„";i:8767;s:3:"á“…";i:8768;s:3:"ᓆ";i:8769;s:3:"ᓇ";i:8770;s:3:"ᓈ";i:8771;s:3:"ᓉ";i:8772;s:3:"á“Š";i:8773;s:3:"á“‹";i:8774;s:3:"á“Œ";i:8775;s:3:"á“";i:8776;s:3:"á“Ž";i:8777;s:3:"á“";i:8778;s:3:"á“";i:8779;s:3:"á“‘";i:8780;s:3:"á“’";i:8781;s:3:"á““";i:8782;s:3:"á“”";i:8783;s:3:"á“•";i:8784;s:3:"á“–";i:8785;s:3:"á“—";i:8786;s:3:"ᓘ";i:8787;s:3:"á“™";i:8788;s:3:"á“š";i:8789;s:3:"á“›";i:8790;s:3:"á“œ";i:8791;s:3:"á“";i:8792;s:3:"á“ž";i:8793;s:3:"á“Ÿ";i:8794;s:3:"á“ ";i:8795;s:3:"á“¡";i:8796;s:3:"á“¢";i:8797;s:3:"á“£";i:8798;s:3:"ᓤ";i:8799;s:3:"á“¥";i:8800;s:3:"ᓦ";i:8801;s:3:"ᓧ";i:8802;s:3:"ᓨ";i:8803;s:3:"á“©";i:8804;s:3:"ᓪ";i:8805;s:3:"á“«";i:8806;s:3:"ᓬ";i:8807;s:3:"á“­";i:8808;s:3:"á“®";i:8809;s:3:"ᓯ";i:8810;s:3:"á“°";i:8811;s:3:"ᓱ";i:8812;s:3:"ᓲ";i:8813;s:3:"ᓳ";i:8814;s:3:"á“´";i:8815;s:3:"ᓵ";i:8816;s:3:"ᓶ";i:8817;s:3:"á“·";i:8818;s:3:"ᓸ";i:8819;s:3:"ᓹ";i:8820;s:3:"ᓺ";i:8821;s:3:"á“»";i:8822;s:3:"ᓼ";i:8823;s:3:"ᓽ";i:8824;s:3:"ᓾ";i:8825;s:3:"á“¿";i:8826;s:3:"ᔀ";i:8827;s:3:"á”";i:8828;s:3:"ᔂ";i:8829;s:3:"ᔃ";i:8830;s:3:"ᔄ";i:8831;s:3:"á”…";i:8832;s:3:"ᔆ";i:8833;s:3:"ᔇ";i:8834;s:3:"ᔈ";i:8835;s:3:"ᔉ";i:8836;s:3:"ᔊ";i:8837;s:3:"ᔋ";i:8838;s:3:"ᔌ";i:8839;s:3:"á”";i:8840;s:3:"ᔎ";i:8841;s:3:"á”";i:8842;s:3:"á”";i:8843;s:3:"ᔑ";i:8844;s:3:"á”’";i:8845;s:3:"ᔓ";i:8846;s:3:"á””";i:8847;s:3:"ᔕ";i:8848;s:3:"á”–";i:8849;s:3:"á”—";i:8850;s:3:"ᔘ";i:8851;s:3:"á”™";i:8852;s:3:"ᔚ";i:8853;s:3:"á”›";i:8854;s:3:"ᔜ";i:8855;s:3:"á”";i:8856;s:3:"ᔞ";i:8857;s:3:"ᔟ";i:8858;s:3:"á” ";i:8859;s:3:"ᔡ";i:8860;s:3:"ᔢ";i:8861;s:3:"ᔣ";i:8862;s:3:"ᔤ";i:8863;s:3:"ᔥ";i:8864;s:3:"ᔦ";i:8865;s:3:"ᔧ";i:8866;s:3:"ᔨ";i:8867;s:3:"ᔩ";i:8868;s:3:"ᔪ";i:8869;s:3:"ᔫ";i:8870;s:3:"ᔬ";i:8871;s:3:"á”­";i:8872;s:3:"á”®";i:8873;s:3:"ᔯ";i:8874;s:3:"á”°";i:8875;s:3:"á”±";i:8876;s:3:"ᔲ";i:8877;s:3:"ᔳ";i:8878;s:3:"á”´";i:8879;s:3:"ᔵ";i:8880;s:3:"ᔶ";i:8881;s:3:"á”·";i:8882;s:3:"ᔸ";i:8883;s:3:"ᔹ";i:8884;s:3:"ᔺ";i:8885;s:3:"á”»";i:8886;s:3:"ᔼ";i:8887;s:3:"ᔽ";i:8888;s:3:"ᔾ";i:8889;s:3:"ᔿ";i:8890;s:3:"á•€";i:8891;s:3:"á•";i:8892;s:3:"á•‚";i:8893;s:3:"ᕃ";i:8894;s:3:"á•„";i:8895;s:3:"á•…";i:8896;s:3:"ᕆ";i:8897;s:3:"ᕇ";i:8898;s:3:"ᕈ";i:8899;s:3:"ᕉ";i:8900;s:3:"á•Š";i:8901;s:3:"á•‹";i:8902;s:3:"á•Œ";i:8903;s:3:"á•";i:8904;s:3:"á•Ž";i:8905;s:3:"á•";i:8906;s:3:"á•";i:8907;s:3:"á•‘";i:8908;s:3:"á•’";i:8909;s:3:"á•“";i:8910;s:3:"á•”";i:8911;s:3:"á••";i:8912;s:3:"á•–";i:8913;s:3:"á•—";i:8914;s:3:"ᕘ";i:8915;s:3:"á•™";i:8916;s:3:"á•š";i:8917;s:3:"á•›";i:8918;s:3:"á•œ";i:8919;s:3:"á•";i:8920;s:3:"á•ž";i:8921;s:3:"á•Ÿ";i:8922;s:3:"á• ";i:8923;s:3:"á•¡";i:8924;s:3:"á•¢";i:8925;s:3:"á•£";i:8926;s:3:"ᕤ";i:8927;s:3:"á•¥";i:8928;s:3:"ᕦ";i:8929;s:3:"ᕧ";i:8930;s:3:"ᕨ";i:8931;s:3:"á•©";i:8932;s:3:"ᕪ";i:8933;s:3:"á•«";i:8934;s:3:"ᕬ";i:8935;s:3:"á•­";i:8936;s:3:"á•®";i:8937;s:3:"ᕯ";i:8938;s:3:"á•°";i:8939;s:3:"ᕱ";i:8940;s:3:"ᕲ";i:8941;s:3:"ᕳ";i:8942;s:3:"á•´";i:8943;s:3:"ᕵ";i:8944;s:3:"ᕶ";i:8945;s:3:"á•·";i:8946;s:3:"ᕸ";i:8947;s:3:"ᕹ";i:8948;s:3:"ᕺ";i:8949;s:3:"á•»";i:8950;s:3:"ᕽ";i:8951;s:3:"ᙯ";i:8952;s:3:"ᕾ";i:8953;s:3:"á•¿";i:8954;s:3:"á–€";i:8955;s:3:"á–";i:8956;s:3:"á–‚";i:8957;s:3:"á–ƒ";i:8958;s:3:"á–„";i:8959;s:3:"á–…";i:8960;s:3:"á–†";i:8961;s:3:"á–‡";i:8962;s:3:"á–ˆ";i:8963;s:3:"á–‰";i:8964;s:3:"á–Š";i:8965;s:3:"á–‹";i:8966;s:3:"á–Œ";i:8967;s:3:"á–";i:8968;s:3:"á™°";i:8969;s:3:"á–Ž";i:8970;s:3:"á–";i:8971;s:3:"á–";i:8972;s:3:"á–‘";i:8973;s:3:"á–’";i:8974;s:3:"á–“";i:8975;s:3:"á–”";i:8976;s:3:"á–•";i:8977;s:3:"á™±";i:8978;s:3:"ᙲ";i:8979;s:3:"ᙳ";i:8980;s:3:"á™´";i:8981;s:3:"ᙵ";i:8982;s:3:"ᙶ";i:8983;s:3:"á––";i:8984;s:3:"á–—";i:8985;s:3:"á–˜";i:8986;s:3:"á–™";i:8987;s:3:"á–š";i:8988;s:3:"á–›";i:8989;s:3:"á–œ";i:8990;s:3:"á–";i:8991;s:3:"á–ž";i:8992;s:3:"á–Ÿ";i:8993;s:3:"á– ";i:8994;s:3:"á–¡";i:8995;s:3:"á–¢";i:8996;s:3:"á–£";i:8997;s:3:"á–¤";i:8998;s:3:"á–¥";i:8999;s:3:"á–¦";i:9000;s:3:"ᕼ";i:9001;s:3:"á–§";i:9002;s:3:"á–¨";i:9003;s:3:"á–©";i:9004;s:3:"á–ª";i:9005;s:3:"á–«";i:9006;s:3:"á–¬";i:9007;s:3:"á–­";i:9008;s:3:"á–®";i:9009;s:3:"á–¯";i:9010;s:3:"á–°";i:9011;s:3:"á–±";i:9012;s:3:"á–²";i:9013;s:3:"á–³";i:9014;s:3:"á–´";i:9015;s:3:"á–µ";i:9016;s:3:"á–¶";i:9017;s:3:"á–·";i:9018;s:3:"á–¸";i:9019;s:3:"á–¹";i:9020;s:3:"á–º";i:9021;s:3:"á–»";i:9022;s:3:"á–¼";i:9023;s:3:"á–½";i:9024;s:3:"á–¾";i:9025;s:3:"á–¿";i:9026;s:3:"á—€";i:9027;s:3:"á—";i:9028;s:3:"á—‚";i:9029;s:3:"á—ƒ";i:9030;s:3:"á—„";i:9031;s:3:"á—…";i:9032;s:3:"á—†";i:9033;s:3:"á—‡";i:9034;s:3:"á—ˆ";i:9035;s:3:"á—‰";i:9036;s:3:"á—Š";i:9037;s:3:"á—‹";i:9038;s:3:"á—Œ";i:9039;s:3:"á—";i:9040;s:3:"á—Ž";i:9041;s:3:"á—";i:9042;s:3:"á—";i:9043;s:3:"á—‘";i:9044;s:3:"á—’";i:9045;s:3:"á—“";i:9046;s:3:"á—”";i:9047;s:3:"á—•";i:9048;s:3:"á—–";i:9049;s:3:"á——";i:9050;s:3:"á—˜";i:9051;s:3:"á—™";i:9052;s:3:"á—š";i:9053;s:3:"á—›";i:9054;s:3:"á—œ";i:9055;s:3:"á—";i:9056;s:3:"á—ž";i:9057;s:3:"á—Ÿ";i:9058;s:3:"á— ";i:9059;s:3:"á—¡";i:9060;s:3:"á—¢";i:9061;s:3:"á—£";i:9062;s:3:"á—¤";i:9063;s:3:"á—¥";i:9064;s:3:"á—¦";i:9065;s:3:"á—§";i:9066;s:3:"á—¨";i:9067;s:3:"á—©";i:9068;s:3:"á—ª";i:9069;s:3:"á—«";i:9070;s:3:"á—¬";i:9071;s:3:"á—­";i:9072;s:3:"á—®";i:9073;s:3:"á—¯";i:9074;s:3:"á—°";i:9075;s:3:"á—±";i:9076;s:3:"á—²";i:9077;s:3:"á—³";i:9078;s:3:"á—´";i:9079;s:3:"á—µ";i:9080;s:3:"á—¶";i:9081;s:3:"á—·";i:9082;s:3:"á—¸";i:9083;s:3:"á—¹";i:9084;s:3:"á—º";i:9085;s:3:"á—»";i:9086;s:3:"á—¼";i:9087;s:3:"á—½";i:9088;s:3:"á—¾";i:9089;s:3:"á—¿";i:9090;s:3:"ᘀ";i:9091;s:3:"á˜";i:9092;s:3:"ᘂ";i:9093;s:3:"ᘃ";i:9094;s:3:"ᘄ";i:9095;s:3:"ᘅ";i:9096;s:3:"ᘆ";i:9097;s:3:"ᘇ";i:9098;s:3:"ᘈ";i:9099;s:3:"ᘉ";i:9100;s:3:"ᘊ";i:9101;s:3:"ᘋ";i:9102;s:3:"ᘌ";i:9103;s:3:"á˜";i:9104;s:3:"ᘎ";i:9105;s:3:"á˜";i:9106;s:3:"á˜";i:9107;s:3:"ᘑ";i:9108;s:3:"ᘒ";i:9109;s:3:"ᘓ";i:9110;s:3:"ᘔ";i:9111;s:3:"ᘕ";i:9112;s:3:"ᘖ";i:9113;s:3:"ᘗ";i:9114;s:3:"ᘘ";i:9115;s:3:"ᘙ";i:9116;s:3:"ᘚ";i:9117;s:3:"ᘛ";i:9118;s:3:"ᘜ";i:9119;s:3:"á˜";i:9120;s:3:"ᘞ";i:9121;s:3:"ᘟ";i:9122;s:3:"ᘠ";i:9123;s:3:"ᘡ";i:9124;s:3:"ᘢ";i:9125;s:3:"ᘣ";i:9126;s:3:"ᘤ";i:9127;s:3:"ᘥ";i:9128;s:3:"ᘦ";i:9129;s:3:"ᘧ";i:9130;s:3:"ᘨ";i:9131;s:3:"ᘩ";i:9132;s:3:"ᘪ";i:9133;s:3:"ᘫ";i:9134;s:3:"ᘬ";i:9135;s:3:"ᘭ";i:9136;s:3:"ᘮ";i:9137;s:3:"ᘯ";i:9138;s:3:"ᘰ";i:9139;s:3:"ᘱ";i:9140;s:3:"ᘲ";i:9141;s:3:"ᘳ";i:9142;s:3:"ᘴ";i:9143;s:3:"ᘵ";i:9144;s:3:"ᘶ";i:9145;s:3:"ᘷ";i:9146;s:3:"ᘸ";i:9147;s:3:"ᘹ";i:9148;s:3:"ᘺ";i:9149;s:3:"ᘻ";i:9150;s:3:"ᘼ";i:9151;s:3:"ᘽ";i:9152;s:3:"ᘾ";i:9153;s:3:"ᘿ";i:9154;s:3:"ᙀ";i:9155;s:3:"á™";i:9156;s:3:"ᙂ";i:9157;s:3:"ᙃ";i:9158;s:3:"ᙄ";i:9159;s:3:"á™…";i:9160;s:3:"ᙆ";i:9161;s:3:"ᙇ";i:9162;s:3:"ᙈ";i:9163;s:3:"ᙉ";i:9164;s:3:"ᙊ";i:9165;s:3:"ᙋ";i:9166;s:3:"ᙌ";i:9167;s:3:"á™";i:9168;s:3:"ᙎ";i:9169;s:3:"á™";i:9170;s:3:"á™";i:9171;s:3:"ᙑ";i:9172;s:3:"á™’";i:9173;s:3:"ᙓ";i:9174;s:3:"á™”";i:9175;s:3:"ᙕ";i:9176;s:3:"á™–";i:9177;s:3:"á™—";i:9178;s:3:"ᙘ";i:9179;s:3:"á™™";i:9180;s:3:"ᙚ";i:9181;s:3:"á™›";i:9182;s:3:"ᙜ";i:9183;s:3:"á™";i:9184;s:3:"ᙞ";i:9185;s:3:"ᙟ";i:9186;s:3:"á™ ";i:9187;s:3:"ᙡ";i:9188;s:3:"ᙢ";i:9189;s:3:"ᙣ";i:9190;s:3:"ᙤ";i:9191;s:3:"ᙥ";i:9192;s:3:"ᙦ";i:9193;s:3:"ᙧ";i:9194;s:3:"ᙨ";i:9195;s:3:"ᙩ";i:9196;s:3:"ᙪ";i:9197;s:3:"ᙫ";i:9198;s:3:"ᙬ";i:9199;s:3:"á™·";i:9200;s:3:"ᙸ";i:9201;s:3:"ᙹ";i:9202;s:3:"ᙺ";i:9203;s:3:"á™»";i:9204;s:3:"ᙼ";i:9205;s:3:"ᙽ";i:9206;s:3:"ᙾ";i:9207;s:3:"ᙿ";i:9208;s:3:"ᢰ";i:9209;s:3:"ᢱ";i:9210;s:3:"ᢲ";i:9211;s:3:"ᢳ";i:9212;s:3:"ᢴ";i:9213;s:3:"ᢵ";i:9214;s:3:"ᢶ";i:9215;s:3:"ᢷ";i:9216;s:3:"ᢸ";i:9217;s:3:"ᢹ";i:9218;s:3:"ᢺ";i:9219;s:3:"ᢻ";i:9220;s:3:"ᢼ";i:9221;s:3:"ᢽ";i:9222;s:3:"ᢾ";i:9223;s:3:"ᢿ";i:9224;s:3:"ᣀ";i:9225;s:3:"á£";i:9226;s:3:"ᣂ";i:9227;s:3:"ᣃ";i:9228;s:3:"ᣄ";i:9229;s:3:"ᣅ";i:9230;s:3:"ᣆ";i:9231;s:3:"ᣇ";i:9232;s:3:"ᣈ";i:9233;s:3:"ᣉ";i:9234;s:3:"ᣊ";i:9235;s:3:"ᣋ";i:9236;s:3:"ᣌ";i:9237;s:3:"á£";i:9238;s:3:"ᣎ";i:9239;s:3:"á£";i:9240;s:3:"á£";i:9241;s:3:"ᣑ";i:9242;s:3:"ᣒ";i:9243;s:3:"ᣓ";i:9244;s:3:"ᣔ";i:9245;s:3:"ᣕ";i:9246;s:3:"ᣖ";i:9247;s:3:"ᣗ";i:9248;s:3:"ᣘ";i:9249;s:3:"ᣙ";i:9250;s:3:"ᣚ";i:9251;s:3:"ᣛ";i:9252;s:3:"ᣜ";i:9253;s:3:"á£";i:9254;s:3:"ᣞ";i:9255;s:3:"ᣟ";i:9256;s:3:"ᣠ";i:9257;s:3:"ᣡ";i:9258;s:3:"ᣢ";i:9259;s:3:"ᣣ";i:9260;s:3:"ᣤ";i:9261;s:3:"ᣥ";i:9262;s:3:"ᣦ";i:9263;s:3:"ᣧ";i:9264;s:3:"ᣨ";i:9265;s:3:"ᣩ";i:9266;s:3:"ᣪ";i:9267;s:3:"ᣫ";i:9268;s:3:"ᣬ";i:9269;s:3:"ᣭ";i:9270;s:3:"ᣮ";i:9271;s:3:"ᣯ";i:9272;s:3:"ᣰ";i:9273;s:3:"ᣱ";i:9274;s:3:"ᣲ";i:9275;s:3:"ᣳ";i:9276;s:3:"ᣴ";i:9277;s:3:"ᣵ";i:9278;s:3:"áš";i:9279;s:3:"áš‚";i:9280;s:3:"ᚃ";i:9281;s:3:"áš„";i:9282;s:3:"áš…";i:9283;s:3:"ᚆ";i:9284;s:3:"ᚇ";i:9285;s:3:"ᚈ";i:9286;s:3:"ᚉ";i:9287;s:3:"ᚊ";i:9288;s:3:"áš‹";i:9289;s:3:"ᚌ";i:9290;s:3:"áš";i:9291;s:3:"ᚎ";i:9292;s:3:"áš";i:9293;s:3:"áš";i:9294;s:3:"áš‘";i:9295;s:3:"áš’";i:9296;s:3:"áš“";i:9297;s:3:"áš”";i:9298;s:3:"áš•";i:9299;s:3:"áš–";i:9300;s:3:"áš—";i:9301;s:3:"ᚘ";i:9302;s:3:"áš™";i:9303;s:3:"ášš";i:9304;s:3:"áš ";i:9305;s:3:"ᚢ";i:9306;s:3:"ᚦ";i:9307;s:3:"ᚨ";i:9308;s:3:"ᚯ";i:9309;s:3:"áš°";i:9310;s:3:"áš±";i:9311;s:3:"áš²";i:9312;s:3:"áš·";i:9313;s:3:"áš¹";i:9314;s:3:"ᚺ";i:9315;s:3:"áš¾";i:9316;s:3:"á›";i:9317;s:3:"ᛃ";i:9318;s:3:"á›…";i:9319;s:3:"ᛇ";i:9320;s:3:"ᛈ";i:9321;s:3:"ᛉ";i:9322;s:3:"ᛊ";i:9323;s:3:"á›";i:9324;s:3:"á›’";i:9325;s:3:"á›–";i:9326;s:3:"á›—";i:9327;s:3:"ᛚ";i:9328;s:3:"ᛜ";i:9329;s:3:"ᛞ";i:9330;s:3:"ᛟ";i:9331;s:3:"ᚪ";i:9332;s:3:"áš«";i:9333;s:3:"ᚣ";i:9334;s:3:"á› ";i:9335;s:3:"ᛣ";i:9336;s:3:"ᚸ";i:9337;s:3:"ᛤ";i:9338;s:3:"ᛡ";i:9339;s:3:"ᛢ";i:9340;s:3:"ᛥ";i:9341;s:3:"ᛦ";i:9342;s:4:"ð°€";i:9343;s:4:"ð°‚";i:9344;s:4:"ð°ƒ";i:9345;s:4:"ð°…";i:9346;s:4:"ð°†";i:9347;s:4:"ð°‡";i:9348;s:4:"ð°‰";i:9349;s:4:"ð°‹";i:9350;s:4:"ð°";i:9351;s:4:"ð°";i:9352;s:4:"ð°‘";i:9353;s:4:"ð°“";i:9354;s:4:"ð°”";i:9355;s:4:"ð°–";i:9356;s:4:"ð°˜";i:9357;s:4:"ð°š";i:9358;s:4:"ð°œ";i:9359;s:4:"ð°ž";i:9360;s:4:"ð° ";i:9361;s:4:"ð°¡";i:9362;s:4:"ð°¢";i:9363;s:4:"ð°£";i:9364;s:4:"ð°¤";i:9365;s:4:"ð°¦";i:9366;s:4:"ð°¨";i:9367;s:4:"ð°ª";i:9368;s:4:"ð°¬";i:9369;s:4:"ð°­";i:9370;s:4:"ð°¯";i:9371;s:4:"ð°°";i:9372;s:4:"ð°±";i:9373;s:4:"ð°²";i:9374;s:4:"ð°´";i:9375;s:4:"ð°¶";i:9376;s:4:"ð°¸";i:9377;s:4:"ð°º";i:9378;s:4:"ð°¼";i:9379;s:4:"ð°½";i:9380;s:4:"ð°¾";i:9381;s:4:"ð°¿";i:9382;s:4:"ð±";i:9383;s:4:"ð±ƒ";i:9384;s:4:"ð±…";i:9385;s:4:"ð±‡";i:9386;s:4:"ð±ˆ";i:9387;s:3:"ꔀ";i:9388;s:3:"ê”";i:9389;s:3:"ꔂ";i:9390;s:3:"ꔃ";i:9391;s:3:"ꔄ";i:9392;s:3:"ê”…";i:9393;s:3:"ꔆ";i:9394;s:3:"ꔇ";i:9395;s:3:"ꔈ";i:9396;s:3:"ꔉ";i:9397;s:3:"ꔊ";i:9398;s:3:"ꔋ";i:9399;s:3:"ꔌ";i:9400;s:3:"ê”";i:9401;s:3:"ꔎ";i:9402;s:3:"ê”";i:9403;s:3:"ê”";i:9404;s:3:"ꔑ";i:9405;s:3:"ê”’";i:9406;s:3:"ꔓ";i:9407;s:3:"ê””";i:9408;s:3:"ꔕ";i:9409;s:3:"ê”–";i:9410;s:3:"ê”—";i:9411;s:3:"ꔘ";i:9412;s:3:"ê”™";i:9413;s:3:"ꔚ";i:9414;s:3:"ê”›";i:9415;s:3:"ꔜ";i:9416;s:3:"ê”";i:9417;s:3:"ꔞ";i:9418;s:3:"ꔟ";i:9419;s:3:"ê” ";i:9420;s:3:"ꔡ";i:9421;s:3:"ꔢ";i:9422;s:3:"ꔣ";i:9423;s:3:"ꔤ";i:9424;s:3:"ꔥ";i:9425;s:3:"ꔦ";i:9426;s:3:"ꔧ";i:9427;s:3:"ꔨ";i:9428;s:3:"ꔩ";i:9429;s:3:"ꔪ";i:9430;s:3:"ꔫ";i:9431;s:3:"ꔬ";i:9432;s:3:"ê”­";i:9433;s:3:"ê”®";i:9434;s:3:"ꔯ";i:9435;s:3:"ê”°";i:9436;s:3:"ê”±";i:9437;s:3:"ꔲ";i:9438;s:3:"ꔳ";i:9439;s:3:"ê”´";i:9440;s:3:"ꔵ";i:9441;s:3:"ꔶ";i:9442;s:3:"ê”·";i:9443;s:3:"ꔸ";i:9444;s:3:"ꔹ";i:9445;s:3:"ꔺ";i:9446;s:3:"ê”»";i:9447;s:3:"ꔼ";i:9448;s:3:"ꔽ";i:9449;s:3:"ꔾ";i:9450;s:3:"ꔿ";i:9451;s:3:"ê•€";i:9452;s:3:"ê•";i:9453;s:3:"ê•‚";i:9454;s:3:"ꕃ";i:9455;s:3:"ê•„";i:9456;s:3:"ê•…";i:9457;s:3:"ꕆ";i:9458;s:3:"ꕇ";i:9459;s:3:"ꕈ";i:9460;s:3:"ꕉ";i:9461;s:3:"ê•Š";i:9462;s:3:"ê•‹";i:9463;s:3:"ê•Œ";i:9464;s:3:"ê•";i:9465;s:3:"ê•Ž";i:9466;s:3:"ê•";i:9467;s:3:"ê•";i:9468;s:3:"ê•‘";i:9469;s:3:"ê•’";i:9470;s:3:"ê•“";i:9471;s:3:"ê•”";i:9472;s:3:"ê••";i:9473;s:3:"ê•–";i:9474;s:3:"ê•—";i:9475;s:3:"ꕘ";i:9476;s:3:"ê•™";i:9477;s:3:"ê•š";i:9478;s:3:"ê•›";i:9479;s:3:"ê•œ";i:9480;s:3:"ê•";i:9481;s:3:"ê•ž";i:9482;s:3:"ê•Ÿ";i:9483;s:3:"ê• ";i:9484;s:3:"ê•¡";i:9485;s:3:"ê•¢";i:9486;s:3:"ê•£";i:9487;s:3:"ꕤ";i:9488;s:3:"ê•¥";i:9489;s:3:"ꕦ";i:9490;s:3:"ꕧ";i:9491;s:3:"ꕨ";i:9492;s:3:"ê•©";i:9493;s:3:"ꕪ";i:9494;s:3:"ê•«";i:9495;s:3:"ꕬ";i:9496;s:3:"ê•­";i:9497;s:3:"ê•®";i:9498;s:3:"ꕯ";i:9499;s:3:"ê•°";i:9500;s:3:"ꕱ";i:9501;s:3:"ꕲ";i:9502;s:3:"ꕳ";i:9503;s:3:"ê•´";i:9504;s:3:"ꕵ";i:9505;s:3:"ꕶ";i:9506;s:3:"ê•·";i:9507;s:3:"ꕸ";i:9508;s:3:"ꕹ";i:9509;s:3:"ꕺ";i:9510;s:3:"ê•»";i:9511;s:3:"ꕼ";i:9512;s:3:"ꕽ";i:9513;s:3:"ꕾ";i:9514;s:3:"ê•¿";i:9515;s:3:"ê–€";i:9516;s:3:"ê–";i:9517;s:3:"ê–‚";i:9518;s:3:"ê–ƒ";i:9519;s:3:"ê–„";i:9520;s:3:"ê–…";i:9521;s:3:"ê–†";i:9522;s:3:"ê–‡";i:9523;s:3:"ê–ˆ";i:9524;s:3:"ê–‰";i:9525;s:3:"ê–Š";i:9526;s:3:"ê–‹";i:9527;s:3:"ê–Œ";i:9528;s:3:"ê–";i:9529;s:3:"ê–Ž";i:9530;s:3:"ê–";i:9531;s:3:"ê–";i:9532;s:3:"ê–‘";i:9533;s:3:"ê–’";i:9534;s:3:"ê–“";i:9535;s:3:"ê–”";i:9536;s:3:"ê–•";i:9537;s:3:"ê––";i:9538;s:3:"ê–—";i:9539;s:3:"ê–˜";i:9540;s:3:"ê–™";i:9541;s:3:"ê–š";i:9542;s:3:"ê–›";i:9543;s:3:"ê–œ";i:9544;s:3:"ê–";i:9545;s:3:"ê–ž";i:9546;s:3:"ê–Ÿ";i:9547;s:3:"ê– ";i:9548;s:3:"ê–¡";i:9549;s:3:"ê–¢";i:9550;s:3:"ê–£";i:9551;s:3:"ê–¤";i:9552;s:3:"ê–¥";i:9553;s:3:"ê–¦";i:9554;s:3:"ê–§";i:9555;s:3:"ê–¨";i:9556;s:3:"ê–©";i:9557;s:3:"ê–ª";i:9558;s:3:"ê–«";i:9559;s:3:"ê–¬";i:9560;s:3:"ê–­";i:9561;s:3:"ê–®";i:9562;s:3:"ê–¯";i:9563;s:3:"ê–°";i:9564;s:3:"ê–±";i:9565;s:3:"ê–²";i:9566;s:3:"ê–³";i:9567;s:3:"ê–´";i:9568;s:3:"ê–µ";i:9569;s:3:"ê–¶";i:9570;s:3:"ê–·";i:9571;s:3:"ê–¸";i:9572;s:3:"ê–¹";i:9573;s:3:"ê–º";i:9574;s:3:"ê–»";i:9575;s:3:"ê–¼";i:9576;s:3:"ê–½";i:9577;s:3:"ê–¾";i:9578;s:3:"ê–¿";i:9579;s:3:"ê—€";i:9580;s:3:"ê—";i:9581;s:3:"ê—‚";i:9582;s:3:"ê—ƒ";i:9583;s:3:"ê—„";i:9584;s:3:"ê—…";i:9585;s:3:"ê—†";i:9586;s:3:"ê—‡";i:9587;s:3:"ê—ˆ";i:9588;s:3:"ê—‰";i:9589;s:3:"ê—Š";i:9590;s:3:"ê—‹";i:9591;s:3:"ê—Œ";i:9592;s:3:"ê—";i:9593;s:3:"ê—Ž";i:9594;s:3:"ê—";i:9595;s:3:"ê—";i:9596;s:3:"ê—‘";i:9597;s:3:"ê—’";i:9598;s:3:"ê—“";i:9599;s:3:"ê—”";i:9600;s:3:"ê—•";i:9601;s:3:"ê—–";i:9602;s:3:"ê——";i:9603;s:3:"ê—˜";i:9604;s:3:"ê—™";i:9605;s:3:"ê—š";i:9606;s:3:"ê—›";i:9607;s:3:"ê—œ";i:9608;s:3:"ê—";i:9609;s:3:"ê—ž";i:9610;s:3:"ê—Ÿ";i:9611;s:3:"ê— ";i:9612;s:3:"ê—¡";i:9613;s:3:"ê—¢";i:9614;s:3:"ê—£";i:9615;s:3:"ê—¤";i:9616;s:3:"ê—¥";i:9617;s:3:"ê—¦";i:9618;s:3:"ê—§";i:9619;s:3:"ê—¨";i:9620;s:3:"ê—©";i:9621;s:3:"ê—ª";i:9622;s:3:"ê—«";i:9623;s:3:"ê—¬";i:9624;s:3:"ê—­";i:9625;s:3:"ê—®";i:9626;s:3:"ê—¯";i:9627;s:3:"ê—°";i:9628;s:3:"ê—±";i:9629;s:3:"ê—²";i:9630;s:3:"ê—³";i:9631;s:3:"ê—´";i:9632;s:3:"ê—µ";i:9633;s:3:"ê—¶";i:9634;s:3:"ê—·";i:9635;s:3:"ê—¸";i:9636;s:3:"ê—¹";i:9637;s:3:"ê—º";i:9638;s:3:"ê—»";i:9639;s:3:"ê—¼";i:9640;s:3:"ê—½";i:9641;s:3:"ê—¾";i:9642;s:3:"ê—¿";i:9643;s:3:"ꘀ";i:9644;s:3:"ê˜";i:9645;s:3:"ꘂ";i:9646;s:3:"ꘃ";i:9647;s:3:"ꘄ";i:9648;s:3:"ꘅ";i:9649;s:3:"ꘆ";i:9650;s:3:"ꘇ";i:9651;s:3:"ꘈ";i:9652;s:3:"ꘉ";i:9653;s:3:"ꘊ";i:9654;s:3:"ꘋ";i:9655;s:3:"ꘌ";i:9656;s:3:"êš ";i:9657;s:3:"êš¡";i:9658;s:3:"ꚢ";i:9659;s:3:"ꚣ";i:9660;s:3:"ꚤ";i:9661;s:3:"ꚥ";i:9662;s:3:"ꚦ";i:9663;s:3:"ꚧ";i:9664;s:3:"ꚨ";i:9665;s:3:"êš©";i:9666;s:3:"ꚪ";i:9667;s:3:"êš«";i:9668;s:3:"ꚬ";i:9669;s:3:"êš­";i:9670;s:3:"êš®";i:9671;s:3:"ꚯ";i:9672;s:3:"êš°";i:9673;s:3:"êš±";i:9674;s:3:"êš²";i:9675;s:3:"êš³";i:9676;s:3:"êš´";i:9677;s:3:"êšµ";i:9678;s:3:"ꚶ";i:9679;s:3:"êš·";i:9680;s:3:"ꚸ";i:9681;s:3:"êš¹";i:9682;s:3:"ꚺ";i:9683;s:3:"êš»";i:9684;s:3:"êš¼";i:9685;s:3:"êš½";i:9686;s:3:"êš¾";i:9687;s:3:"êš¿";i:9688;s:3:"ꛀ";i:9689;s:3:"ê›";i:9690;s:3:"ꛂ";i:9691;s:3:"ꛃ";i:9692;s:3:"ꛄ";i:9693;s:3:"ê›…";i:9694;s:3:"ꛆ";i:9695;s:3:"ꛇ";i:9696;s:3:"ꛈ";i:9697;s:3:"ꛉ";i:9698;s:3:"ꛊ";i:9699;s:3:"ꛋ";i:9700;s:3:"ꛌ";i:9701;s:3:"ê›";i:9702;s:3:"ꛎ";i:9703;s:3:"ê›";i:9704;s:3:"ê›";i:9705;s:3:"ꛑ";i:9706;s:3:"ê›’";i:9707;s:3:"ꛓ";i:9708;s:3:"ê›”";i:9709;s:3:"ꛕ";i:9710;s:3:"ê›–";i:9711;s:3:"ê›—";i:9712;s:3:"ꛘ";i:9713;s:3:"ê›™";i:9714;s:3:"ꛚ";i:9715;s:3:"ê››";i:9716;s:3:"ꛜ";i:9717;s:3:"ê›";i:9718;s:3:"ꛞ";i:9719;s:3:"ꛟ";i:9720;s:3:"ê› ";i:9721;s:3:"ꛡ";i:9722;s:3:"ꛢ";i:9723;s:3:"ꛣ";i:9724;s:3:"ꛤ";i:9725;s:3:"ꛥ";i:9726;s:3:"ꛦ";i:9727;s:3:"ꛧ";i:9728;s:3:"ꛨ";i:9729;s:3:"ꛩ";i:9730;s:3:"ꛪ";i:9731;s:3:"ꛫ";i:9732;s:3:"ꛬ";i:9733;s:3:"ê›­";i:9734;s:3:"ê›®";i:9735;s:3:"ꛯ";i:9736;s:4:"ð– €";i:9737;s:4:"ð– ";i:9738;s:4:"ð– ‚";i:9739;s:4:"ð– ƒ";i:9740;s:4:"ð– „";i:9741;s:4:"ð– …";i:9742;s:4:"ð– †";i:9743;s:4:"ð– ‡";i:9744;s:4:"ð– ˆ";i:9745;s:4:"ð– ‰";i:9746;s:4:"ð– Š";i:9747;s:4:"ð– ‹";i:9748;s:4:"ð– Œ";i:9749;s:4:"ð– ";i:9750;s:4:"ð– Ž";i:9751;s:4:"ð– ";i:9752;s:4:"ð– ";i:9753;s:4:"ð– ‘";i:9754;s:4:"ð– ’";i:9755;s:4:"ð– “";i:9756;s:4:"ð– ”";i:9757;s:4:"ð– •";i:9758;s:4:"ð– –";i:9759;s:4:"ð– —";i:9760;s:4:"ð– ˜";i:9761;s:4:"ð– ™";i:9762;s:4:"ð– š";i:9763;s:4:"ð– ›";i:9764;s:4:"ð– œ";i:9765;s:4:"ð– ";i:9766;s:4:"ð– ž";i:9767;s:4:"ð– Ÿ";i:9768;s:4:"ð–  ";i:9769;s:4:"ð– ¡";i:9770;s:4:"ð– ¢";i:9771;s:4:"ð– £";i:9772;s:4:"ð– ¤";i:9773;s:4:"ð– ¥";i:9774;s:4:"ð– ¦";i:9775;s:4:"ð– §";i:9776;s:4:"ð– ¨";i:9777;s:4:"ð– ©";i:9778;s:4:"ð– ª";i:9779;s:4:"ð– «";i:9780;s:4:"ð– ¬";i:9781;s:4:"ð– ­";i:9782;s:4:"ð– ®";i:9783;s:4:"ð– ¯";i:9784;s:4:"ð– °";i:9785;s:4:"ð– ±";i:9786;s:4:"ð– ²";i:9787;s:4:"ð– ³";i:9788;s:4:"ð– ´";i:9789;s:4:"ð– µ";i:9790;s:4:"ð– ¶";i:9791;s:4:"ð– ·";i:9792;s:4:"ð– ¸";i:9793;s:4:"ð– ¹";i:9794;s:4:"ð– º";i:9795;s:4:"ð– »";i:9796;s:4:"ð– ¼";i:9797;s:4:"ð– ½";i:9798;s:4:"ð– ¾";i:9799;s:4:"ð– ¿";i:9800;s:4:"ð–¡€";i:9801;s:4:"ð–¡";i:9802;s:4:"ð–¡‚";i:9803;s:4:"𖡃";i:9804;s:4:"ð–¡„";i:9805;s:4:"ð–¡…";i:9806;s:4:"𖡆";i:9807;s:4:"𖡇";i:9808;s:4:"𖡈";i:9809;s:4:"𖡉";i:9810;s:4:"ð–¡Š";i:9811;s:4:"ð–¡‹";i:9812;s:4:"ð–¡Œ";i:9813;s:4:"ð–¡";i:9814;s:4:"ð–¡Ž";i:9815;s:4:"ð–¡";i:9816;s:4:"ð–¡";i:9817;s:4:"ð–¡‘";i:9818;s:4:"ð–¡’";i:9819;s:4:"ð–¡“";i:9820;s:4:"ð–¡”";i:9821;s:4:"ð–¡•";i:9822;s:4:"ð–¡–";i:9823;s:4:"ð–¡—";i:9824;s:4:"𖡘";i:9825;s:4:"ð–¡™";i:9826;s:4:"ð–¡š";i:9827;s:4:"ð–¡›";i:9828;s:4:"ð–¡œ";i:9829;s:4:"ð–¡";i:9830;s:4:"ð–¡ž";i:9831;s:4:"ð–¡Ÿ";i:9832;s:4:"ð–¡ ";i:9833;s:4:"ð–¡¡";i:9834;s:4:"ð–¡¢";i:9835;s:4:"ð–¡£";i:9836;s:4:"𖡤";i:9837;s:4:"ð–¡¥";i:9838;s:4:"𖡦";i:9839;s:4:"𖡧";i:9840;s:4:"𖡨";i:9841;s:4:"ð–¡©";i:9842;s:4:"𖡪";i:9843;s:4:"ð–¡«";i:9844;s:4:"𖡬";i:9845;s:4:"ð–¡­";i:9846;s:4:"ð–¡®";i:9847;s:4:"𖡯";i:9848;s:4:"ð–¡°";i:9849;s:4:"ð–¡±";i:9850;s:4:"ð–¡²";i:9851;s:4:"ð–¡³";i:9852;s:4:"ð–¡´";i:9853;s:4:"ð–¡µ";i:9854;s:4:"𖡶";i:9855;s:4:"ð–¡·";i:9856;s:4:"𖡸";i:9857;s:4:"ð–¡¹";i:9858;s:4:"𖡺";i:9859;s:4:"ð–¡»";i:9860;s:4:"ð–¡¼";i:9861;s:4:"ð–¡½";i:9862;s:4:"ð–¡¾";i:9863;s:4:"ð–¡¿";i:9864;s:4:"ð–¢€";i:9865;s:4:"ð–¢";i:9866;s:4:"𖢂";i:9867;s:4:"𖢃";i:9868;s:4:"𖢄";i:9869;s:4:"ð–¢…";i:9870;s:4:"𖢆";i:9871;s:4:"𖢇";i:9872;s:4:"𖢈";i:9873;s:4:"𖢉";i:9874;s:4:"𖢊";i:9875;s:4:"𖢋";i:9876;s:4:"𖢌";i:9877;s:4:"ð–¢";i:9878;s:4:"𖢎";i:9879;s:4:"ð–¢";i:9880;s:4:"ð–¢";i:9881;s:4:"𖢑";i:9882;s:4:"ð–¢’";i:9883;s:4:"𖢓";i:9884;s:4:"ð–¢”";i:9885;s:4:"𖢕";i:9886;s:4:"ð–¢–";i:9887;s:4:"ð–¢—";i:9888;s:4:"𖢘";i:9889;s:4:"ð–¢™";i:9890;s:4:"𖢚";i:9891;s:4:"ð–¢›";i:9892;s:4:"𖢜";i:9893;s:4:"ð–¢";i:9894;s:4:"𖢞";i:9895;s:4:"𖢟";i:9896;s:4:"ð–¢ ";i:9897;s:4:"𖢡";i:9898;s:4:"ð–¢¢";i:9899;s:4:"ð–¢£";i:9900;s:4:"𖢤";i:9901;s:4:"ð–¢¥";i:9902;s:4:"𖢦";i:9903;s:4:"𖢧";i:9904;s:4:"𖢨";i:9905;s:4:"𖢩";i:9906;s:4:"𖢪";i:9907;s:4:"𖢫";i:9908;s:4:"𖢬";i:9909;s:4:"ð–¢­";i:9910;s:4:"ð–¢®";i:9911;s:4:"𖢯";i:9912;s:4:"ð–¢°";i:9913;s:4:"ð–¢±";i:9914;s:4:"ð–¢²";i:9915;s:4:"ð–¢³";i:9916;s:4:"ð–¢´";i:9917;s:4:"ð–¢µ";i:9918;s:4:"𖢶";i:9919;s:4:"ð–¢·";i:9920;s:4:"𖢸";i:9921;s:4:"ð–¢¹";i:9922;s:4:"𖢺";i:9923;s:4:"ð–¢»";i:9924;s:4:"ð–¢¼";i:9925;s:4:"ð–¢½";i:9926;s:4:"ð–¢¾";i:9927;s:4:"𖢿";i:9928;s:4:"ð–£€";i:9929;s:4:"ð–£";i:9930;s:4:"𖣂";i:9931;s:4:"𖣃";i:9932;s:4:"𖣄";i:9933;s:4:"ð–£…";i:9934;s:4:"𖣆";i:9935;s:4:"𖣇";i:9936;s:4:"𖣈";i:9937;s:4:"𖣉";i:9938;s:4:"𖣊";i:9939;s:4:"𖣋";i:9940;s:4:"𖣌";i:9941;s:4:"ð–£";i:9942;s:4:"𖣎";i:9943;s:4:"ð–£";i:9944;s:4:"ð–£";i:9945;s:4:"𖣑";i:9946;s:4:"ð–£’";i:9947;s:4:"𖣓";i:9948;s:4:"ð–£”";i:9949;s:4:"𖣕";i:9950;s:4:"ð–£–";i:9951;s:4:"ð–£—";i:9952;s:4:"𖣘";i:9953;s:4:"ð–£™";i:9954;s:4:"𖣚";i:9955;s:4:"ð–£›";i:9956;s:4:"𖣜";i:9957;s:4:"ð–£";i:9958;s:4:"𖣞";i:9959;s:4:"𖣟";i:9960;s:4:"ð–£ ";i:9961;s:4:"𖣡";i:9962;s:4:"ð–£¢";i:9963;s:4:"ð–££";i:9964;s:4:"𖣤";i:9965;s:4:"ð–£¥";i:9966;s:4:"𖣦";i:9967;s:4:"𖣧";i:9968;s:4:"𖣨";i:9969;s:4:"𖣩";i:9970;s:4:"𖣪";i:9971;s:4:"𖣫";i:9972;s:4:"𖣬";i:9973;s:4:"ð–£­";i:9974;s:4:"ð–£®";i:9975;s:4:"𖣯";i:9976;s:4:"ð–£°";i:9977;s:4:"ð–£±";i:9978;s:4:"ð–£²";i:9979;s:4:"ð–£³";i:9980;s:4:"ð–£´";i:9981;s:4:"ð–£µ";i:9982;s:4:"𖣶";i:9983;s:4:"ð–£·";i:9984;s:4:"𖣸";i:9985;s:4:"ð–£¹";i:9986;s:4:"𖣺";i:9987;s:4:"ð–£»";i:9988;s:4:"ð–£¼";i:9989;s:4:"ð–£½";i:9990;s:4:"ð–£¾";i:9991;s:4:"𖣿";i:9992;s:4:"𖤀";i:9993;s:4:"ð–¤";i:9994;s:4:"𖤂";i:9995;s:4:"𖤃";i:9996;s:4:"𖤄";i:9997;s:4:"ð–¤…";i:9998;s:4:"𖤆";i:9999;s:4:"𖤇";i:10000;s:4:"𖤈";i:10001;s:4:"𖤉";i:10002;s:4:"𖤊";i:10003;s:4:"𖤋";i:10004;s:4:"𖤌";i:10005;s:4:"ð–¤";i:10006;s:4:"𖤎";i:10007;s:4:"ð–¤";i:10008;s:4:"ð–¤";i:10009;s:4:"𖤑";i:10010;s:4:"ð–¤’";i:10011;s:4:"𖤓";i:10012;s:4:"𖤔";i:10013;s:4:"𖤕";i:10014;s:4:"ð–¤–";i:10015;s:4:"ð–¤—";i:10016;s:4:"𖤘";i:10017;s:4:"𖤙";i:10018;s:4:"𖤚";i:10019;s:4:"𖤛";i:10020;s:4:"𖤜";i:10021;s:4:"ð–¤";i:10022;s:4:"𖤞";i:10023;s:4:"𖤟";i:10024;s:4:"ð–¤ ";i:10025;s:4:"𖤡";i:10026;s:4:"𖤢";i:10027;s:4:"𖤣";i:10028;s:4:"𖤤";i:10029;s:4:"𖤥";i:10030;s:4:"𖤦";i:10031;s:4:"𖤧";i:10032;s:4:"𖤨";i:10033;s:4:"𖤩";i:10034;s:4:"𖤪";i:10035;s:4:"𖤫";i:10036;s:4:"𖤬";i:10037;s:4:"ð–¤­";i:10038;s:4:"𖤮";i:10039;s:4:"𖤯";i:10040;s:4:"ð–¤°";i:10041;s:4:"𖤱";i:10042;s:4:"𖤲";i:10043;s:4:"𖤳";i:10044;s:4:"ð–¤´";i:10045;s:4:"𖤵";i:10046;s:4:"𖤶";i:10047;s:4:"ð–¤·";i:10048;s:4:"𖤸";i:10049;s:4:"𖤹";i:10050;s:4:"𖤺";i:10051;s:4:"𖤻";i:10052;s:4:"𖤼";i:10053;s:4:"𖤽";i:10054;s:4:"𖤾";i:10055;s:4:"𖤿";i:10056;s:4:"ð–¥€";i:10057;s:4:"ð–¥";i:10058;s:4:"𖥂";i:10059;s:4:"𖥃";i:10060;s:4:"𖥄";i:10061;s:4:"ð–¥…";i:10062;s:4:"𖥆";i:10063;s:4:"𖥇";i:10064;s:4:"𖥈";i:10065;s:4:"𖥉";i:10066;s:4:"𖥊";i:10067;s:4:"𖥋";i:10068;s:4:"𖥌";i:10069;s:4:"ð–¥";i:10070;s:4:"𖥎";i:10071;s:4:"ð–¥";i:10072;s:4:"ð–¥";i:10073;s:4:"𖥑";i:10074;s:4:"ð–¥’";i:10075;s:4:"𖥓";i:10076;s:4:"ð–¥”";i:10077;s:4:"𖥕";i:10078;s:4:"ð–¥–";i:10079;s:4:"ð–¥—";i:10080;s:4:"𖥘";i:10081;s:4:"ð–¥™";i:10082;s:4:"𖥚";i:10083;s:4:"ð–¥›";i:10084;s:4:"𖥜";i:10085;s:4:"ð–¥";i:10086;s:4:"𖥞";i:10087;s:4:"𖥟";i:10088;s:4:"ð–¥ ";i:10089;s:4:"𖥡";i:10090;s:4:"ð–¥¢";i:10091;s:4:"ð–¥£";i:10092;s:4:"𖥤";i:10093;s:4:"ð–¥¥";i:10094;s:4:"𖥦";i:10095;s:4:"𖥧";i:10096;s:4:"𖥨";i:10097;s:4:"𖥩";i:10098;s:4:"𖥪";i:10099;s:4:"𖥫";i:10100;s:4:"𖥬";i:10101;s:4:"ð–¥­";i:10102;s:4:"ð–¥®";i:10103;s:4:"𖥯";i:10104;s:4:"ð–¥°";i:10105;s:4:"ð–¥±";i:10106;s:4:"ð–¥²";i:10107;s:4:"ð–¥³";i:10108;s:4:"ð–¥´";i:10109;s:4:"ð–¥µ";i:10110;s:4:"𖥶";i:10111;s:4:"ð–¥·";i:10112;s:4:"𖥸";i:10113;s:4:"ð–¥¹";i:10114;s:4:"𖥺";i:10115;s:4:"ð–¥»";i:10116;s:4:"ð–¥¼";i:10117;s:4:"ð–¥½";i:10118;s:4:"ð–¥¾";i:10119;s:4:"𖥿";i:10120;s:4:"𖦀";i:10121;s:4:"ð–¦";i:10122;s:4:"𖦂";i:10123;s:4:"𖦃";i:10124;s:4:"𖦄";i:10125;s:4:"ð–¦…";i:10126;s:4:"𖦆";i:10127;s:4:"𖦇";i:10128;s:4:"𖦈";i:10129;s:4:"𖦉";i:10130;s:4:"𖦊";i:10131;s:4:"𖦋";i:10132;s:4:"𖦌";i:10133;s:4:"ð–¦";i:10134;s:4:"𖦎";i:10135;s:4:"ð–¦";i:10136;s:4:"ð–¦";i:10137;s:4:"𖦑";i:10138;s:4:"ð–¦’";i:10139;s:4:"𖦓";i:10140;s:4:"𖦔";i:10141;s:4:"𖦕";i:10142;s:4:"ð–¦–";i:10143;s:4:"ð–¦—";i:10144;s:4:"𖦘";i:10145;s:4:"𖦙";i:10146;s:4:"𖦚";i:10147;s:4:"𖦛";i:10148;s:4:"𖦜";i:10149;s:4:"ð–¦";i:10150;s:4:"𖦞";i:10151;s:4:"𖦟";i:10152;s:4:"ð–¦ ";i:10153;s:4:"𖦡";i:10154;s:4:"𖦢";i:10155;s:4:"𖦣";i:10156;s:4:"𖦤";i:10157;s:4:"𖦥";i:10158;s:4:"𖦦";i:10159;s:4:"𖦧";i:10160;s:4:"𖦨";i:10161;s:4:"𖦩";i:10162;s:4:"𖦪";i:10163;s:4:"𖦫";i:10164;s:4:"𖦬";i:10165;s:4:"ð–¦­";i:10166;s:4:"𖦮";i:10167;s:4:"𖦯";i:10168;s:4:"ð–¦°";i:10169;s:4:"𖦱";i:10170;s:4:"𖦲";i:10171;s:4:"𖦳";i:10172;s:4:"ð–¦´";i:10173;s:4:"𖦵";i:10174;s:4:"𖦶";i:10175;s:4:"ð–¦·";i:10176;s:4:"𖦸";i:10177;s:4:"𖦹";i:10178;s:4:"𖦺";i:10179;s:4:"𖦻";i:10180;s:4:"𖦼";i:10181;s:4:"𖦽";i:10182;s:4:"𖦾";i:10183;s:4:"𖦿";i:10184;s:4:"𖧀";i:10185;s:4:"ð–§";i:10186;s:4:"𖧂";i:10187;s:4:"𖧃";i:10188;s:4:"𖧄";i:10189;s:4:"ð–§…";i:10190;s:4:"𖧆";i:10191;s:4:"𖧇";i:10192;s:4:"𖧈";i:10193;s:4:"𖧉";i:10194;s:4:"𖧊";i:10195;s:4:"𖧋";i:10196;s:4:"𖧌";i:10197;s:4:"ð–§";i:10198;s:4:"𖧎";i:10199;s:4:"ð–§";i:10200;s:4:"ð–§";i:10201;s:4:"𖧑";i:10202;s:4:"ð–§’";i:10203;s:4:"𖧓";i:10204;s:4:"𖧔";i:10205;s:4:"𖧕";i:10206;s:4:"ð–§–";i:10207;s:4:"ð–§—";i:10208;s:4:"𖧘";i:10209;s:4:"𖧙";i:10210;s:4:"𖧚";i:10211;s:4:"𖧛";i:10212;s:4:"𖧜";i:10213;s:4:"ð–§";i:10214;s:4:"𖧞";i:10215;s:4:"𖧟";i:10216;s:4:"ð–§ ";i:10217;s:4:"𖧡";i:10218;s:4:"𖧢";i:10219;s:4:"𖧣";i:10220;s:4:"𖧤";i:10221;s:4:"𖧥";i:10222;s:4:"𖧦";i:10223;s:4:"𖧧";i:10224;s:4:"𖧨";i:10225;s:4:"𖧩";i:10226;s:4:"𖧪";i:10227;s:4:"𖧫";i:10228;s:4:"𖧬";i:10229;s:4:"ð–§­";i:10230;s:4:"𖧮";i:10231;s:4:"𖧯";i:10232;s:4:"ð–§°";i:10233;s:4:"𖧱";i:10234;s:4:"𖧲";i:10235;s:4:"𖧳";i:10236;s:4:"ð–§´";i:10237;s:4:"𖧵";i:10238;s:4:"𖧶";i:10239;s:4:"ð–§·";i:10240;s:4:"𖧸";i:10241;s:4:"𖧹";i:10242;s:4:"𖧺";i:10243;s:4:"𖧻";i:10244;s:4:"𖧼";i:10245;s:4:"𖧽";i:10246;s:4:"𖧾";i:10247;s:4:"𖧿";i:10248;s:4:"𖨀";i:10249;s:4:"ð–¨";i:10250;s:4:"𖨂";i:10251;s:4:"𖨃";i:10252;s:4:"𖨄";i:10253;s:4:"ð–¨…";i:10254;s:4:"𖨆";i:10255;s:4:"𖨇";i:10256;s:4:"𖨈";i:10257;s:4:"𖨉";i:10258;s:4:"𖨊";i:10259;s:4:"𖨋";i:10260;s:4:"𖨌";i:10261;s:4:"ð–¨";i:10262;s:4:"𖨎";i:10263;s:4:"ð–¨";i:10264;s:4:"ð–¨";i:10265;s:4:"𖨑";i:10266;s:4:"ð–¨’";i:10267;s:4:"𖨓";i:10268;s:4:"𖨔";i:10269;s:4:"𖨕";i:10270;s:4:"ð–¨–";i:10271;s:4:"ð–¨—";i:10272;s:4:"𖨘";i:10273;s:4:"𖨙";i:10274;s:4:"𖨚";i:10275;s:4:"𖨛";i:10276;s:4:"𖨜";i:10277;s:4:"ð–¨";i:10278;s:4:"𖨞";i:10279;s:4:"𖨟";i:10280;s:4:"ð–¨ ";i:10281;s:4:"𖨡";i:10282;s:4:"𖨢";i:10283;s:4:"𖨣";i:10284;s:4:"𖨤";i:10285;s:4:"𖨥";i:10286;s:4:"𖨦";i:10287;s:4:"𖨧";i:10288;s:4:"𖨨";i:10289;s:4:"𖨩";i:10290;s:4:"𖨪";i:10291;s:4:"𖨫";i:10292;s:4:"𖨬";i:10293;s:4:"ð–¨­";i:10294;s:4:"𖨮";i:10295;s:4:"𖨯";i:10296;s:4:"ð–¨°";i:10297;s:4:"𖨱";i:10298;s:4:"𖨲";i:10299;s:4:"𖨳";i:10300;s:4:"ð–¨´";i:10301;s:4:"𖨵";i:10302;s:4:"𖨶";i:10303;s:4:"ð–¨·";i:10304;s:4:"𖨸";i:10305;s:3:"á„€";i:10306;s:3:"á„";i:10307;s:3:"á„‚";i:10308;s:3:"ᄃ";i:10309;s:3:"á„„";i:10310;s:3:"á„…";i:10311;s:3:"ᄆ";i:10312;s:3:"ᄇ";i:10313;s:3:"ᄈ";i:10314;s:3:"ᄉ";i:10315;s:3:"á„Š";i:10316;s:3:"á„‹";i:10317;s:3:"á„Œ";i:10318;s:3:"á„";i:10319;s:3:"á„Ž";i:10320;s:3:"á„";i:10321;s:3:"á„";i:10322;s:3:"á„‘";i:10323;s:3:"á„’";i:10324;s:3:"á„“";i:10325;s:3:"á„”";i:10326;s:3:"á„•";i:10327;s:3:"á„–";i:10328;s:3:"á„—";i:10329;s:3:"ᄘ";i:10330;s:3:"á„™";i:10331;s:3:"á„š";i:10332;s:3:"á„›";i:10333;s:3:"á„œ";i:10334;s:3:"á„";i:10335;s:3:"á„ž";i:10336;s:3:"á„Ÿ";i:10337;s:3:"á„ ";i:10338;s:3:"á„¡";i:10339;s:3:"á„¢";i:10340;s:3:"á„£";i:10341;s:3:"ᄤ";i:10342;s:3:"á„¥";i:10343;s:3:"ᄦ";i:10344;s:3:"ᄧ";i:10345;s:3:"ᄨ";i:10346;s:3:"á„©";i:10347;s:3:"ᄪ";i:10348;s:3:"á„«";i:10349;s:3:"ᄬ";i:10350;s:3:"á„­";i:10351;s:3:"á„®";i:10352;s:3:"ᄯ";i:10353;s:3:"á„°";i:10354;s:3:"ᄱ";i:10355;s:3:"ᄲ";i:10356;s:3:"ᄳ";i:10357;s:3:"á„´";i:10358;s:3:"ᄵ";i:10359;s:3:"ᄶ";i:10360;s:3:"á„·";i:10361;s:3:"ᄸ";i:10362;s:3:"ᄹ";i:10363;s:3:"ᄺ";i:10364;s:3:"á„»";i:10365;s:3:"ᄼ";i:10366;s:3:"ᄽ";i:10367;s:3:"ᄾ";i:10368;s:3:"á„¿";i:10369;s:3:"á…€";i:10370;s:3:"á…";i:10371;s:3:"á…‚";i:10372;s:3:"á…ƒ";i:10373;s:3:"á…„";i:10374;s:3:"á……";i:10375;s:3:"á…†";i:10376;s:3:"á…‡";i:10377;s:3:"á…ˆ";i:10378;s:3:"á…‰";i:10379;s:3:"á…Š";i:10380;s:3:"á…‹";i:10381;s:3:"á…Œ";i:10382;s:3:"á…";i:10383;s:3:"á…Ž";i:10384;s:3:"á…";i:10385;s:3:"á…";i:10386;s:3:"á…‘";i:10387;s:3:"á…’";i:10388;s:3:"á…“";i:10389;s:3:"á…”";i:10390;s:3:"á…•";i:10391;s:3:"á…–";i:10392;s:3:"á…—";i:10393;s:3:"á…˜";i:10394;s:3:"á…™";i:10395;s:3:"á…š";i:10396;s:3:"á…›";i:10397;s:3:"á…œ";i:10398;s:3:"á…";i:10399;s:3:"á…ž";i:10400;s:3:"ꥠ";i:10401;s:3:"ꥡ";i:10402;s:3:"ꥢ";i:10403;s:3:"ꥣ";i:10404;s:3:"ꥤ";i:10405;s:3:"ꥥ";i:10406;s:3:"ꥦ";i:10407;s:3:"ꥧ";i:10408;s:3:"ꥨ";i:10409;s:3:"ꥩ";i:10410;s:3:"ꥪ";i:10411;s:3:"ꥫ";i:10412;s:3:"ꥬ";i:10413;s:3:"ꥭ";i:10414;s:3:"ꥮ";i:10415;s:3:"ꥯ";i:10416;s:3:"ꥰ";i:10417;s:3:"ꥱ";i:10418;s:3:"ꥲ";i:10419;s:3:"ꥳ";i:10420;s:3:"ꥴ";i:10421;s:3:"ꥵ";i:10422;s:3:"ꥶ";i:10423;s:3:"ꥷ";i:10424;s:3:"ꥸ";i:10425;s:3:"ꥹ";i:10426;s:3:"ꥺ";i:10427;s:3:"ꥻ";i:10428;s:3:"ꥼ";i:10429;s:3:"á…Ÿ";i:10430;s:3:"á… ";i:10431;s:3:"á…¡";i:10432;s:3:"á…¢";i:10433;s:3:"á…£";i:10434;s:3:"á…¤";i:10435;s:3:"á…¥";i:10436;s:3:"á…¦";i:10437;s:3:"á…§";i:10438;s:3:"á…¨";i:10439;s:3:"á…©";i:10440;s:3:"á…ª";i:10441;s:3:"á…«";i:10442;s:3:"á…¬";i:10443;s:3:"á…­";i:10444;s:3:"á…®";i:10445;s:3:"á…¯";i:10446;s:3:"á…°";i:10447;s:3:"á…±";i:10448;s:3:"á…²";i:10449;s:3:"á…³";i:10450;s:3:"á…´";i:10451;s:3:"á…µ";i:10452;s:3:"á…¶";i:10453;s:3:"á…·";i:10454;s:3:"á…¸";i:10455;s:3:"á…¹";i:10456;s:3:"á…º";i:10457;s:3:"á…»";i:10458;s:3:"á…¼";i:10459;s:3:"á…½";i:10460;s:3:"á…¾";i:10461;s:3:"á…¿";i:10462;s:3:"ᆀ";i:10463;s:3:"á†";i:10464;s:3:"ᆂ";i:10465;s:3:"ᆃ";i:10466;s:3:"ᆄ";i:10467;s:3:"ᆅ";i:10468;s:3:"ᆆ";i:10469;s:3:"ᆇ";i:10470;s:3:"ᆈ";i:10471;s:3:"ᆉ";i:10472;s:3:"ᆊ";i:10473;s:3:"ᆋ";i:10474;s:3:"ᆌ";i:10475;s:3:"á†";i:10476;s:3:"ᆎ";i:10477;s:3:"á†";i:10478;s:3:"á†";i:10479;s:3:"ᆑ";i:10480;s:3:"ᆒ";i:10481;s:3:"ᆓ";i:10482;s:3:"ᆔ";i:10483;s:3:"ᆕ";i:10484;s:3:"ᆖ";i:10485;s:3:"ᆗ";i:10486;s:3:"ᆘ";i:10487;s:3:"ᆙ";i:10488;s:3:"ᆚ";i:10489;s:3:"ᆛ";i:10490;s:3:"ᆜ";i:10491;s:3:"á†";i:10492;s:3:"ᆞ";i:10493;s:3:"ᆟ";i:10494;s:3:"ᆠ";i:10495;s:3:"ᆡ";i:10496;s:3:"ᆢ";i:10497;s:3:"ᆣ";i:10498;s:3:"ᆤ";i:10499;s:3:"ᆥ";i:10500;s:3:"ᆦ";i:10501;s:3:"ᆧ";i:10502;s:3:"íž°";i:10503;s:3:"íž±";i:10504;s:3:"íž²";i:10505;s:3:"íž³";i:10506;s:3:"íž´";i:10507;s:3:"ížµ";i:10508;s:3:"ힶ";i:10509;s:3:"íž·";i:10510;s:3:"ힸ";i:10511;s:3:"íž¹";i:10512;s:3:"ힺ";i:10513;s:3:"íž»";i:10514;s:3:"íž¼";i:10515;s:3:"íž½";i:10516;s:3:"íž¾";i:10517;s:3:"íž¿";i:10518;s:3:"ퟀ";i:10519;s:3:"íŸ";i:10520;s:3:"ퟂ";i:10521;s:3:"ퟃ";i:10522;s:3:"ퟄ";i:10523;s:3:"ퟅ";i:10524;s:3:"ퟆ";i:10525;s:3:"ᆨ";i:10526;s:3:"ᆩ";i:10527;s:3:"ᆪ";i:10528;s:3:"ᆫ";i:10529;s:3:"ᆬ";i:10530;s:3:"ᆭ";i:10531;s:3:"ᆮ";i:10532;s:3:"ᆯ";i:10533;s:3:"ᆰ";i:10534;s:3:"ᆱ";i:10535;s:3:"ᆲ";i:10536;s:3:"ᆳ";i:10537;s:3:"ᆴ";i:10538;s:3:"ᆵ";i:10539;s:3:"ᆶ";i:10540;s:3:"ᆷ";i:10541;s:3:"ᆸ";i:10542;s:3:"ᆹ";i:10543;s:3:"ᆺ";i:10544;s:3:"ᆻ";i:10545;s:3:"ᆼ";i:10546;s:3:"ᆽ";i:10547;s:3:"ᆾ";i:10548;s:3:"ᆿ";i:10549;s:3:"ᇀ";i:10550;s:3:"á‡";i:10551;s:3:"ᇂ";i:10552;s:3:"ᇃ";i:10553;s:3:"ᇄ";i:10554;s:3:"ᇅ";i:10555;s:3:"ᇆ";i:10556;s:3:"ᇇ";i:10557;s:3:"ᇈ";i:10558;s:3:"ᇉ";i:10559;s:3:"ᇊ";i:10560;s:3:"ᇋ";i:10561;s:3:"ᇌ";i:10562;s:3:"á‡";i:10563;s:3:"ᇎ";i:10564;s:3:"á‡";i:10565;s:3:"á‡";i:10566;s:3:"ᇑ";i:10567;s:3:"ᇒ";i:10568;s:3:"ᇓ";i:10569;s:3:"ᇔ";i:10570;s:3:"ᇕ";i:10571;s:3:"ᇖ";i:10572;s:3:"ᇗ";i:10573;s:3:"ᇘ";i:10574;s:3:"ᇙ";i:10575;s:3:"ᇚ";i:10576;s:3:"ᇛ";i:10577;s:3:"ᇜ";i:10578;s:3:"á‡";i:10579;s:3:"ᇞ";i:10580;s:3:"ᇟ";i:10581;s:3:"ᇠ";i:10582;s:3:"ᇡ";i:10583;s:3:"ᇢ";i:10584;s:3:"ᇣ";i:10585;s:3:"ᇤ";i:10586;s:3:"ᇥ";i:10587;s:3:"ᇦ";i:10588;s:3:"ᇧ";i:10589;s:3:"ᇨ";i:10590;s:3:"ᇩ";i:10591;s:3:"ᇪ";i:10592;s:3:"ᇫ";i:10593;s:3:"ᇬ";i:10594;s:3:"ᇭ";i:10595;s:3:"ᇮ";i:10596;s:3:"ᇯ";i:10597;s:3:"ᇰ";i:10598;s:3:"ᇱ";i:10599;s:3:"ᇲ";i:10600;s:3:"ᇳ";i:10601;s:3:"ᇴ";i:10602;s:3:"ᇵ";i:10603;s:3:"ᇶ";i:10604;s:3:"ᇷ";i:10605;s:3:"ᇸ";i:10606;s:3:"ᇹ";i:10607;s:3:"ᇺ";i:10608;s:3:"ᇻ";i:10609;s:3:"ᇼ";i:10610;s:3:"ᇽ";i:10611;s:3:"ᇾ";i:10612;s:3:"ᇿ";i:10613;s:3:"ퟋ";i:10614;s:3:"ퟌ";i:10615;s:3:"íŸ";i:10616;s:3:"ퟎ";i:10617;s:3:"íŸ";i:10618;s:3:"íŸ";i:10619;s:3:"ퟑ";i:10620;s:3:"ퟒ";i:10621;s:3:"ퟓ";i:10622;s:3:"ퟔ";i:10623;s:3:"ퟕ";i:10624;s:3:"ퟖ";i:10625;s:3:"ퟗ";i:10626;s:3:"ퟘ";i:10627;s:3:"ퟙ";i:10628;s:3:"ퟚ";i:10629;s:3:"ퟛ";i:10630;s:3:"ퟜ";i:10631;s:3:"íŸ";i:10632;s:3:"ퟞ";i:10633;s:3:"ퟟ";i:10634;s:3:"ퟠ";i:10635;s:3:"ퟡ";i:10636;s:3:"ퟢ";i:10637;s:3:"ퟣ";i:10638;s:3:"ퟤ";i:10639;s:3:"ퟥ";i:10640;s:3:"ퟦ";i:10641;s:3:"ퟧ";i:10642;s:3:"ퟨ";i:10643;s:3:"ퟩ";i:10644;s:3:"ퟪ";i:10645;s:3:"ퟫ";i:10646;s:3:"ퟬ";i:10647;s:3:"ퟭ";i:10648;s:3:"ퟮ";i:10649;s:3:"ퟯ";i:10650;s:3:"ퟰ";i:10651;s:3:"ퟱ";i:10652;s:3:"ퟲ";i:10653;s:3:"ퟳ";i:10654;s:3:"ퟴ";i:10655;s:3:"ퟵ";i:10656;s:3:"ퟶ";i:10657;s:3:"ퟷ";i:10658;s:3:"ퟸ";i:10659;s:3:"ퟹ";i:10660;s:3:"ퟺ";i:10661;s:3:"ퟻ";i:10662;s:3:"ã‚";i:10663;s:3:"ã„";i:10664;s:3:"ã†";i:10665;s:4:"𛀀";i:10666;s:3:"ãˆ";i:10667;s:3:"ãŠ";i:10668;s:3:"ã‹";i:10669;s:3:"ã";i:10670;s:3:"ã";i:10671;s:3:"ã‘";i:10672;s:3:"ã“";i:10673;s:3:"ã•";i:10674;s:3:"ã—";i:10675;s:3:"ã™";i:10676;s:3:"ã›";i:10677;s:3:"ã";i:10678;s:3:"ãŸ";i:10679;s:3:"ã¡";i:10680;s:3:"ã¤";i:10681;s:3:"ã¦";i:10682;s:3:"ã¨";i:10683;s:3:"ãª";i:10684;s:3:"ã«";i:10685;s:3:"ã¬";i:10686;s:3:"ã­";i:10687;s:3:"ã®";i:10688;s:3:"ã¯";i:10689;s:3:"ã²";i:10690;s:3:"ãµ";i:10691;s:3:"ã¸";i:10692;s:3:"ã»";i:10693;s:3:"ã¾";i:10694;s:3:"ã¿";i:10695;s:3:"ã‚€";i:10696;s:3:"ã‚";i:10697;s:3:"ã‚‚";i:10698;s:3:"ã‚„";i:10699;s:3:"ゆ";i:10700;s:4:"ð›€";i:10701;s:3:"よ";i:10702;s:3:"ら";i:10703;s:3:"ã‚Š";i:10704;s:3:"ã‚‹";i:10705;s:3:"ã‚Œ";i:10706;s:3:"ã‚";i:10707;s:3:"ã‚";i:10708;s:3:"ã‚";i:10709;s:3:"ã‚‘";i:10710;s:3:"ã‚’";i:10711;s:3:"ã‚“";i:10712;s:3:"ã„…";i:10713;s:3:"ㄆ";i:10714;s:3:"ㄇ";i:10715;s:3:"ㄈ";i:10716;s:3:"ㄪ";i:10717;s:3:"ㄉ";i:10718;s:3:"ã„Š";i:10719;s:3:"ã„‹";i:10720;s:3:"ã„Œ";i:10721;s:3:"ã„";i:10722;s:3:"ã„Ž";i:10723;s:3:"ã„«";i:10724;s:3:"ㆭ";i:10725;s:3:"ã„";i:10726;s:3:"ã„";i:10727;s:3:"ã„‘";i:10728;s:3:"ã„’";i:10729;s:3:"ㄬ";i:10730;s:3:"ã„“";i:10731;s:3:"ã„”";i:10732;s:3:"ã„•";i:10733;s:3:"ã„–";i:10734;s:3:"ã„—";i:10735;s:3:"ㄘ";i:10736;s:3:"ã„™";i:10737;s:3:"ㆸ";i:10738;s:3:"ㆹ";i:10739;s:3:"ㆺ";i:10740;s:3:"ã„š";i:10741;s:3:"ã„›";i:10742;s:3:"ㆦ";i:10743;s:3:"ã„œ";i:10744;s:3:"ã„";i:10745;s:3:"ㆤ";i:10746;s:3:"ã„ž";i:10747;s:3:"ã„Ÿ";i:10748;s:3:"ã„ ";i:10749;s:3:"ã„¡";i:10750;s:3:"ã„¢";i:10751;s:3:"ã„£";i:10752;s:3:"ㄤ";i:10753;s:3:"ㆲ";i:10754;s:3:"ã„¥";i:10755;s:3:"ㆰ";i:10756;s:3:"ㆱ";i:10757;s:3:"ㆬ";i:10758;s:3:"ㄦ";i:10759;s:3:"ㄧ";i:10760;s:3:"ㄨ";i:10761;s:3:"ã„©";i:10762;s:3:"ã„­";i:10763;s:3:"ꀀ";i:10764;s:3:"ê€";i:10765;s:3:"ꀂ";i:10766;s:3:"ꀃ";i:10767;s:3:"ꀄ";i:10768;s:3:"ꀅ";i:10769;s:3:"ꀆ";i:10770;s:3:"ꀇ";i:10771;s:3:"ꀈ";i:10772;s:3:"ꀉ";i:10773;s:3:"ꀊ";i:10774;s:3:"ꀋ";i:10775;s:3:"ꀌ";i:10776;s:3:"ê€";i:10777;s:3:"ꀎ";i:10778;s:3:"ê€";i:10779;s:3:"ê€";i:10780;s:3:"ꀑ";i:10781;s:3:"ꀒ";i:10782;s:3:"ꀓ";i:10783;s:3:"ꀔ";i:10784;s:3:"ꀕ";i:10785;s:3:"ꀖ";i:10786;s:3:"ꀗ";i:10787;s:3:"ꀘ";i:10788;s:3:"ꀙ";i:10789;s:3:"ꀚ";i:10790;s:3:"ꀛ";i:10791;s:3:"ꀜ";i:10792;s:3:"ê€";i:10793;s:3:"ꀞ";i:10794;s:3:"ꀟ";i:10795;s:3:"ꀠ";i:10796;s:3:"ꀡ";i:10797;s:3:"ꀢ";i:10798;s:3:"ꀣ";i:10799;s:3:"ꀤ";i:10800;s:3:"ꀥ";i:10801;s:3:"ꀦ";i:10802;s:3:"ꀧ";i:10803;s:3:"ꀨ";i:10804;s:3:"ꀩ";i:10805;s:3:"ꀪ";i:10806;s:3:"ꀫ";i:10807;s:3:"ꀬ";i:10808;s:3:"ꀭ";i:10809;s:3:"ꀮ";i:10810;s:3:"ꀯ";i:10811;s:3:"ꀰ";i:10812;s:3:"ꀱ";i:10813;s:3:"ꀲ";i:10814;s:3:"ꀳ";i:10815;s:3:"ꀴ";i:10816;s:3:"ꀵ";i:10817;s:3:"ꀶ";i:10818;s:3:"ꀷ";i:10819;s:3:"ꀸ";i:10820;s:3:"ꀹ";i:10821;s:3:"ꀺ";i:10822;s:3:"ꀻ";i:10823;s:3:"ꀼ";i:10824;s:3:"ꀽ";i:10825;s:3:"ꀾ";i:10826;s:3:"ꀿ";i:10827;s:3:"ê€";i:10828;s:3:"ê";i:10829;s:3:"ê‚";i:10830;s:3:"êƒ";i:10831;s:3:"ê„";i:10832;s:3:"ê…";i:10833;s:3:"ê†";i:10834;s:3:"ê‡";i:10835;s:3:"êˆ";i:10836;s:3:"ê‰";i:10837;s:3:"êŠ";i:10838;s:3:"ê‹";i:10839;s:3:"êŒ";i:10840;s:3:"ê";i:10841;s:3:"êŽ";i:10842;s:3:"ê";i:10843;s:3:"ê";i:10844;s:3:"ê‘";i:10845;s:3:"ê’";i:10846;s:3:"ê“";i:10847;s:3:"ê”";i:10848;s:3:"ê•";i:10849;s:3:"ê–";i:10850;s:3:"ê—";i:10851;s:3:"ê˜";i:10852;s:3:"ê™";i:10853;s:3:"êš";i:10854;s:3:"ê›";i:10855;s:3:"êœ";i:10856;s:3:"ê";i:10857;s:3:"êž";i:10858;s:3:"êŸ";i:10859;s:3:"ê ";i:10860;s:3:"ê¡";i:10861;s:3:"ê¢";i:10862;s:3:"ê£";i:10863;s:3:"ê¤";i:10864;s:3:"ê¥";i:10865;s:3:"ê¦";i:10866;s:3:"ê§";i:10867;s:3:"ê¨";i:10868;s:3:"ê©";i:10869;s:3:"êª";i:10870;s:3:"ê«";i:10871;s:3:"ê¬";i:10872;s:3:"ê­";i:10873;s:3:"ê®";i:10874;s:3:"ê¯";i:10875;s:3:"ê°";i:10876;s:3:"ê±";i:10877;s:3:"ê²";i:10878;s:3:"ê³";i:10879;s:3:"ê´";i:10880;s:3:"êµ";i:10881;s:3:"ê¶";i:10882;s:3:"ê·";i:10883;s:3:"ê¸";i:10884;s:3:"ê¹";i:10885;s:3:"êº";i:10886;s:3:"ê»";i:10887;s:3:"ê¼";i:10888;s:3:"ê½";i:10889;s:3:"ê¾";i:10890;s:3:"ê¿";i:10891;s:3:"ê‚€";i:10892;s:3:"ê‚";i:10893;s:3:"ê‚‚";i:10894;s:3:"ꂃ";i:10895;s:3:"ê‚„";i:10896;s:3:"ê‚…";i:10897;s:3:"ꂆ";i:10898;s:3:"ꂇ";i:10899;s:3:"ꂈ";i:10900;s:3:"ꂉ";i:10901;s:3:"ê‚Š";i:10902;s:3:"ê‚‹";i:10903;s:3:"ê‚Œ";i:10904;s:3:"ê‚";i:10905;s:3:"ê‚Ž";i:10906;s:3:"ê‚";i:10907;s:3:"ê‚";i:10908;s:3:"ê‚‘";i:10909;s:3:"ê‚’";i:10910;s:3:"ê‚“";i:10911;s:3:"ê‚”";i:10912;s:3:"ê‚•";i:10913;s:3:"ê‚–";i:10914;s:3:"ê‚—";i:10915;s:3:"ꂘ";i:10916;s:3:"ê‚™";i:10917;s:3:"ê‚š";i:10918;s:3:"ê‚›";i:10919;s:3:"ê‚œ";i:10920;s:3:"ê‚";i:10921;s:3:"ê‚ž";i:10922;s:3:"ê‚Ÿ";i:10923;s:3:"ê‚ ";i:10924;s:3:"ê‚¡";i:10925;s:3:"ê‚¢";i:10926;s:3:"ê‚£";i:10927;s:3:"ꂤ";i:10928;s:3:"ê‚¥";i:10929;s:3:"ꂦ";i:10930;s:3:"ꂧ";i:10931;s:3:"ꂨ";i:10932;s:3:"ê‚©";i:10933;s:3:"ꂪ";i:10934;s:3:"ê‚«";i:10935;s:3:"ꂬ";i:10936;s:3:"ê‚­";i:10937;s:3:"ê‚®";i:10938;s:3:"ꂯ";i:10939;s:3:"ê‚°";i:10940;s:3:"ꂱ";i:10941;s:3:"ꂲ";i:10942;s:3:"ꂳ";i:10943;s:3:"ê‚´";i:10944;s:3:"ꂵ";i:10945;s:3:"ꂶ";i:10946;s:3:"ê‚·";i:10947;s:3:"ꂸ";i:10948;s:3:"ꂹ";i:10949;s:3:"ꂺ";i:10950;s:3:"ê‚»";i:10951;s:3:"ꂼ";i:10952;s:3:"ꂽ";i:10953;s:3:"ꂾ";i:10954;s:3:"ê‚¿";i:10955;s:3:"ꃀ";i:10956;s:3:"êƒ";i:10957;s:3:"ꃂ";i:10958;s:3:"ꃃ";i:10959;s:3:"ꃄ";i:10960;s:3:"ꃅ";i:10961;s:3:"ꃆ";i:10962;s:3:"ꃇ";i:10963;s:3:"ꃈ";i:10964;s:3:"ꃉ";i:10965;s:3:"ꃊ";i:10966;s:3:"ꃋ";i:10967;s:3:"ꃌ";i:10968;s:3:"êƒ";i:10969;s:3:"ꃎ";i:10970;s:3:"êƒ";i:10971;s:3:"êƒ";i:10972;s:3:"ꃑ";i:10973;s:3:"ꃒ";i:10974;s:3:"ꃓ";i:10975;s:3:"ꃔ";i:10976;s:3:"ꃕ";i:10977;s:3:"ꃖ";i:10978;s:3:"ꃗ";i:10979;s:3:"ꃘ";i:10980;s:3:"ꃙ";i:10981;s:3:"ꃚ";i:10982;s:3:"ꃛ";i:10983;s:3:"ꃜ";i:10984;s:3:"êƒ";i:10985;s:3:"ꃞ";i:10986;s:3:"ꃟ";i:10987;s:3:"ꃠ";i:10988;s:3:"ꃡ";i:10989;s:3:"ꃢ";i:10990;s:3:"ꃣ";i:10991;s:3:"ꃤ";i:10992;s:3:"ꃥ";i:10993;s:3:"ꃦ";i:10994;s:3:"ꃧ";i:10995;s:3:"ꃨ";i:10996;s:3:"ꃩ";i:10997;s:3:"ꃪ";i:10998;s:3:"ꃫ";i:10999;s:3:"ꃬ";i:11000;s:3:"ꃭ";i:11001;s:3:"ꃮ";i:11002;s:3:"ꃯ";i:11003;s:3:"ꃰ";i:11004;s:3:"ꃱ";i:11005;s:3:"ꃲ";i:11006;s:3:"ꃳ";i:11007;s:3:"ꃴ";i:11008;s:3:"ꃵ";i:11009;s:3:"ꃶ";i:11010;s:3:"ꃷ";i:11011;s:3:"ꃸ";i:11012;s:3:"ꃹ";i:11013;s:3:"ꃺ";i:11014;s:3:"ꃻ";i:11015;s:3:"ꃼ";i:11016;s:3:"ꃽ";i:11017;s:3:"ꃾ";i:11018;s:3:"ꃿ";i:11019;s:3:"ê„€";i:11020;s:3:"ê„";i:11021;s:3:"ê„‚";i:11022;s:3:"ꄃ";i:11023;s:3:"ê„„";i:11024;s:3:"ê„…";i:11025;s:3:"ꄆ";i:11026;s:3:"ꄇ";i:11027;s:3:"ꄈ";i:11028;s:3:"ꄉ";i:11029;s:3:"ê„Š";i:11030;s:3:"ê„‹";i:11031;s:3:"ê„Œ";i:11032;s:3:"ê„";i:11033;s:3:"ê„Ž";i:11034;s:3:"ê„";i:11035;s:3:"ê„";i:11036;s:3:"ê„‘";i:11037;s:3:"ê„’";i:11038;s:3:"ê„“";i:11039;s:3:"ê„”";i:11040;s:3:"ê„•";i:11041;s:3:"ê„–";i:11042;s:3:"ê„—";i:11043;s:3:"ꄘ";i:11044;s:3:"ê„™";i:11045;s:3:"ê„š";i:11046;s:3:"ê„›";i:11047;s:3:"ê„œ";i:11048;s:3:"ê„";i:11049;s:3:"ê„ž";i:11050;s:3:"ê„Ÿ";i:11051;s:3:"ê„ ";i:11052;s:3:"ê„¡";i:11053;s:3:"ê„¢";i:11054;s:3:"ê„£";i:11055;s:3:"ꄤ";i:11056;s:3:"ê„¥";i:11057;s:3:"ꄦ";i:11058;s:3:"ꄧ";i:11059;s:3:"ꄨ";i:11060;s:3:"ê„©";i:11061;s:3:"ꄪ";i:11062;s:3:"ê„«";i:11063;s:3:"ꄬ";i:11064;s:3:"ê„­";i:11065;s:3:"ê„®";i:11066;s:3:"ꄯ";i:11067;s:3:"ê„°";i:11068;s:3:"ꄱ";i:11069;s:3:"ꄲ";i:11070;s:3:"ꄳ";i:11071;s:3:"ê„´";i:11072;s:3:"ꄵ";i:11073;s:3:"ꄶ";i:11074;s:3:"ê„·";i:11075;s:3:"ꄸ";i:11076;s:3:"ꄹ";i:11077;s:3:"ꄺ";i:11078;s:3:"ê„»";i:11079;s:3:"ꄼ";i:11080;s:3:"ꄽ";i:11081;s:3:"ꄾ";i:11082;s:3:"ê„¿";i:11083;s:3:"ê…€";i:11084;s:3:"ê…";i:11085;s:3:"ê…‚";i:11086;s:3:"ê…ƒ";i:11087;s:3:"ê…„";i:11088;s:3:"ê……";i:11089;s:3:"ê…†";i:11090;s:3:"ê…‡";i:11091;s:3:"ê…ˆ";i:11092;s:3:"ê…‰";i:11093;s:3:"ê…Š";i:11094;s:3:"ê…‹";i:11095;s:3:"ê…Œ";i:11096;s:3:"ê…";i:11097;s:3:"ê…Ž";i:11098;s:3:"ê…";i:11099;s:3:"ê…";i:11100;s:3:"ê…‘";i:11101;s:3:"ê…’";i:11102;s:3:"ê…“";i:11103;s:3:"ê…”";i:11104;s:3:"ê…•";i:11105;s:3:"ê…–";i:11106;s:3:"ê…—";i:11107;s:3:"ê…˜";i:11108;s:3:"ê…™";i:11109;s:3:"ê…š";i:11110;s:3:"ê…›";i:11111;s:3:"ê…œ";i:11112;s:3:"ê…";i:11113;s:3:"ê…ž";i:11114;s:3:"ê…Ÿ";i:11115;s:3:"ê… ";i:11116;s:3:"ê…¡";i:11117;s:3:"ê…¢";i:11118;s:3:"ê…£";i:11119;s:3:"ê…¤";i:11120;s:3:"ê…¥";i:11121;s:3:"ê…¦";i:11122;s:3:"ê…§";i:11123;s:3:"ê…¨";i:11124;s:3:"ê…©";i:11125;s:3:"ê…ª";i:11126;s:3:"ê…«";i:11127;s:3:"ê…¬";i:11128;s:3:"ê…­";i:11129;s:3:"ê…®";i:11130;s:3:"ê…¯";i:11131;s:3:"ê…°";i:11132;s:3:"ê…±";i:11133;s:3:"ê…²";i:11134;s:3:"ê…³";i:11135;s:3:"ê…´";i:11136;s:3:"ê…µ";i:11137;s:3:"ê…¶";i:11138;s:3:"ê…·";i:11139;s:3:"ê…¸";i:11140;s:3:"ê…¹";i:11141;s:3:"ê…º";i:11142;s:3:"ê…»";i:11143;s:3:"ê…¼";i:11144;s:3:"ê…½";i:11145;s:3:"ê…¾";i:11146;s:3:"ê…¿";i:11147;s:3:"ꆀ";i:11148;s:3:"ê†";i:11149;s:3:"ꆂ";i:11150;s:3:"ꆃ";i:11151;s:3:"ꆄ";i:11152;s:3:"ꆅ";i:11153;s:3:"ꆆ";i:11154;s:3:"ꆇ";i:11155;s:3:"ꆈ";i:11156;s:3:"ꆉ";i:11157;s:3:"ꆊ";i:11158;s:3:"ꆋ";i:11159;s:3:"ꆌ";i:11160;s:3:"ê†";i:11161;s:3:"ꆎ";i:11162;s:3:"ê†";i:11163;s:3:"ê†";i:11164;s:3:"ꆑ";i:11165;s:3:"ꆒ";i:11166;s:3:"ꆓ";i:11167;s:3:"ꆔ";i:11168;s:3:"ꆕ";i:11169;s:3:"ꆖ";i:11170;s:3:"ꆗ";i:11171;s:3:"ꆘ";i:11172;s:3:"ꆙ";i:11173;s:3:"ꆚ";i:11174;s:3:"ꆛ";i:11175;s:3:"ꆜ";i:11176;s:3:"ê†";i:11177;s:3:"ꆞ";i:11178;s:3:"ꆟ";i:11179;s:3:"ꆠ";i:11180;s:3:"ꆡ";i:11181;s:3:"ꆢ";i:11182;s:3:"ꆣ";i:11183;s:3:"ꆤ";i:11184;s:3:"ꆥ";i:11185;s:3:"ꆦ";i:11186;s:3:"ꆧ";i:11187;s:3:"ꆨ";i:11188;s:3:"ꆩ";i:11189;s:3:"ꆪ";i:11190;s:3:"ꆫ";i:11191;s:3:"ꆬ";i:11192;s:3:"ꆭ";i:11193;s:3:"ꆮ";i:11194;s:3:"ꆯ";i:11195;s:3:"ꆰ";i:11196;s:3:"ꆱ";i:11197;s:3:"ꆲ";i:11198;s:3:"ꆳ";i:11199;s:3:"ꆴ";i:11200;s:3:"ꆵ";i:11201;s:3:"ꆶ";i:11202;s:3:"ꆷ";i:11203;s:3:"ꆸ";i:11204;s:3:"ꆹ";i:11205;s:3:"ꆺ";i:11206;s:3:"ꆻ";i:11207;s:3:"ꆼ";i:11208;s:3:"ꆽ";i:11209;s:3:"ꆾ";i:11210;s:3:"ꆿ";i:11211;s:3:"ꇀ";i:11212;s:3:"ê‡";i:11213;s:3:"ꇂ";i:11214;s:3:"ꇃ";i:11215;s:3:"ꇄ";i:11216;s:3:"ꇅ";i:11217;s:3:"ꇆ";i:11218;s:3:"ꇇ";i:11219;s:3:"ꇈ";i:11220;s:3:"ꇉ";i:11221;s:3:"ꇊ";i:11222;s:3:"ꇋ";i:11223;s:3:"ꇌ";i:11224;s:3:"ê‡";i:11225;s:3:"ꇎ";i:11226;s:3:"ê‡";i:11227;s:3:"ê‡";i:11228;s:3:"ꇑ";i:11229;s:3:"ꇒ";i:11230;s:3:"ꇓ";i:11231;s:3:"ꇔ";i:11232;s:3:"ꇕ";i:11233;s:3:"ꇖ";i:11234;s:3:"ꇗ";i:11235;s:3:"ꇘ";i:11236;s:3:"ꇙ";i:11237;s:3:"ꇚ";i:11238;s:3:"ꇛ";i:11239;s:3:"ꇜ";i:11240;s:3:"ê‡";i:11241;s:3:"ꇞ";i:11242;s:3:"ꇟ";i:11243;s:3:"ꇠ";i:11244;s:3:"ꇡ";i:11245;s:3:"ꇢ";i:11246;s:3:"ꇣ";i:11247;s:3:"ꇤ";i:11248;s:3:"ꇥ";i:11249;s:3:"ꇦ";i:11250;s:3:"ꇧ";i:11251;s:3:"ꇨ";i:11252;s:3:"ꇩ";i:11253;s:3:"ꇪ";i:11254;s:3:"ꇫ";i:11255;s:3:"ꇬ";i:11256;s:3:"ꇭ";i:11257;s:3:"ꇮ";i:11258;s:3:"ꇯ";i:11259;s:3:"ꇰ";i:11260;s:3:"ꇱ";i:11261;s:3:"ꇲ";i:11262;s:3:"ꇳ";i:11263;s:3:"ꇴ";i:11264;s:3:"ꇵ";i:11265;s:3:"ꇶ";i:11266;s:3:"ꇷ";i:11267;s:3:"ꇸ";i:11268;s:3:"ꇹ";i:11269;s:3:"ꇺ";i:11270;s:3:"ꇻ";i:11271;s:3:"ꇼ";i:11272;s:3:"ꇽ";i:11273;s:3:"ꇾ";i:11274;s:3:"ꇿ";i:11275;s:3:"ꈀ";i:11276;s:3:"êˆ";i:11277;s:3:"ꈂ";i:11278;s:3:"ꈃ";i:11279;s:3:"ꈄ";i:11280;s:3:"ꈅ";i:11281;s:3:"ꈆ";i:11282;s:3:"ꈇ";i:11283;s:3:"ꈈ";i:11284;s:3:"ꈉ";i:11285;s:3:"ꈊ";i:11286;s:3:"ꈋ";i:11287;s:3:"ꈌ";i:11288;s:3:"êˆ";i:11289;s:3:"ꈎ";i:11290;s:3:"êˆ";i:11291;s:3:"êˆ";i:11292;s:3:"ꈑ";i:11293;s:3:"ꈒ";i:11294;s:3:"ꈓ";i:11295;s:3:"ꈔ";i:11296;s:3:"ꈕ";i:11297;s:3:"ꈖ";i:11298;s:3:"ꈗ";i:11299;s:3:"ꈘ";i:11300;s:3:"ꈙ";i:11301;s:3:"ꈚ";i:11302;s:3:"ꈛ";i:11303;s:3:"ꈜ";i:11304;s:3:"êˆ";i:11305;s:3:"ꈞ";i:11306;s:3:"ꈟ";i:11307;s:3:"ꈠ";i:11308;s:3:"ꈡ";i:11309;s:3:"ꈢ";i:11310;s:3:"ꈣ";i:11311;s:3:"ꈤ";i:11312;s:3:"ꈥ";i:11313;s:3:"ꈦ";i:11314;s:3:"ꈧ";i:11315;s:3:"ꈨ";i:11316;s:3:"ꈩ";i:11317;s:3:"ꈪ";i:11318;s:3:"ꈫ";i:11319;s:3:"ꈬ";i:11320;s:3:"ꈭ";i:11321;s:3:"ꈮ";i:11322;s:3:"ꈯ";i:11323;s:3:"ꈰ";i:11324;s:3:"ꈱ";i:11325;s:3:"ꈲ";i:11326;s:3:"ꈳ";i:11327;s:3:"ꈴ";i:11328;s:3:"ꈵ";i:11329;s:3:"ꈶ";i:11330;s:3:"ꈷ";i:11331;s:3:"ꈸ";i:11332;s:3:"ꈹ";i:11333;s:3:"ꈺ";i:11334;s:3:"ꈻ";i:11335;s:3:"ꈼ";i:11336;s:3:"ꈽ";i:11337;s:3:"ꈾ";i:11338;s:3:"ꈿ";i:11339;s:3:"ꉀ";i:11340;s:3:"ê‰";i:11341;s:3:"ꉂ";i:11342;s:3:"ꉃ";i:11343;s:3:"ꉄ";i:11344;s:3:"ꉅ";i:11345;s:3:"ꉆ";i:11346;s:3:"ꉇ";i:11347;s:3:"ꉈ";i:11348;s:3:"ꉉ";i:11349;s:3:"ꉊ";i:11350;s:3:"ꉋ";i:11351;s:3:"ꉌ";i:11352;s:3:"ê‰";i:11353;s:3:"ꉎ";i:11354;s:3:"ê‰";i:11355;s:3:"ê‰";i:11356;s:3:"ꉑ";i:11357;s:3:"ꉒ";i:11358;s:3:"ꉓ";i:11359;s:3:"ꉔ";i:11360;s:3:"ꉕ";i:11361;s:3:"ꉖ";i:11362;s:3:"ꉗ";i:11363;s:3:"ꉘ";i:11364;s:3:"ꉙ";i:11365;s:3:"ꉚ";i:11366;s:3:"ꉛ";i:11367;s:3:"ꉜ";i:11368;s:3:"ê‰";i:11369;s:3:"ꉞ";i:11370;s:3:"ꉟ";i:11371;s:3:"ꉠ";i:11372;s:3:"ꉡ";i:11373;s:3:"ꉢ";i:11374;s:3:"ꉣ";i:11375;s:3:"ꉤ";i:11376;s:3:"ꉥ";i:11377;s:3:"ꉦ";i:11378;s:3:"ꉧ";i:11379;s:3:"ꉨ";i:11380;s:3:"ꉩ";i:11381;s:3:"ꉪ";i:11382;s:3:"ꉫ";i:11383;s:3:"ꉬ";i:11384;s:3:"ꉭ";i:11385;s:3:"ꉮ";i:11386;s:3:"ꉯ";i:11387;s:3:"ꉰ";i:11388;s:3:"ꉱ";i:11389;s:3:"ꉲ";i:11390;s:3:"ꉳ";i:11391;s:3:"ꉴ";i:11392;s:3:"ꉵ";i:11393;s:3:"ꉶ";i:11394;s:3:"ꉷ";i:11395;s:3:"ꉸ";i:11396;s:3:"ꉹ";i:11397;s:3:"ꉺ";i:11398;s:3:"ꉻ";i:11399;s:3:"ꉼ";i:11400;s:3:"ꉽ";i:11401;s:3:"ꉾ";i:11402;s:3:"ꉿ";i:11403;s:3:"ꊀ";i:11404;s:3:"êŠ";i:11405;s:3:"ꊂ";i:11406;s:3:"ꊃ";i:11407;s:3:"ꊄ";i:11408;s:3:"ꊅ";i:11409;s:3:"ꊆ";i:11410;s:3:"ꊇ";i:11411;s:3:"ꊈ";i:11412;s:3:"ꊉ";i:11413;s:3:"ꊊ";i:11414;s:3:"ꊋ";i:11415;s:3:"ꊌ";i:11416;s:3:"êŠ";i:11417;s:3:"ꊎ";i:11418;s:3:"êŠ";i:11419;s:3:"êŠ";i:11420;s:3:"ꊑ";i:11421;s:3:"ꊒ";i:11422;s:3:"ꊓ";i:11423;s:3:"ꊔ";i:11424;s:3:"ꊕ";i:11425;s:3:"ꊖ";i:11426;s:3:"ꊗ";i:11427;s:3:"ꊘ";i:11428;s:3:"ꊙ";i:11429;s:3:"ꊚ";i:11430;s:3:"ꊛ";i:11431;s:3:"ꊜ";i:11432;s:3:"êŠ";i:11433;s:3:"ꊞ";i:11434;s:3:"ꊟ";i:11435;s:3:"ꊠ";i:11436;s:3:"ꊡ";i:11437;s:3:"ꊢ";i:11438;s:3:"ꊣ";i:11439;s:3:"ꊤ";i:11440;s:3:"ꊥ";i:11441;s:3:"ꊦ";i:11442;s:3:"ꊧ";i:11443;s:3:"ꊨ";i:11444;s:3:"ꊩ";i:11445;s:3:"ꊪ";i:11446;s:3:"ꊫ";i:11447;s:3:"ꊬ";i:11448;s:3:"ꊭ";i:11449;s:3:"ꊮ";i:11450;s:3:"ꊯ";i:11451;s:3:"ꊰ";i:11452;s:3:"ꊱ";i:11453;s:3:"ꊲ";i:11454;s:3:"ꊳ";i:11455;s:3:"ꊴ";i:11456;s:3:"ꊵ";i:11457;s:3:"ꊶ";i:11458;s:3:"ꊷ";i:11459;s:3:"ꊸ";i:11460;s:3:"ꊹ";i:11461;s:3:"ꊺ";i:11462;s:3:"ꊻ";i:11463;s:3:"ꊼ";i:11464;s:3:"ꊽ";i:11465;s:3:"ꊾ";i:11466;s:3:"ꊿ";i:11467;s:3:"ê‹€";i:11468;s:3:"ê‹";i:11469;s:3:"ê‹‚";i:11470;s:3:"ꋃ";i:11471;s:3:"ê‹„";i:11472;s:3:"ê‹…";i:11473;s:3:"ꋆ";i:11474;s:3:"ꋇ";i:11475;s:3:"ꋈ";i:11476;s:3:"ꋉ";i:11477;s:3:"ê‹Š";i:11478;s:3:"ê‹‹";i:11479;s:3:"ê‹Œ";i:11480;s:3:"ê‹";i:11481;s:3:"ê‹Ž";i:11482;s:3:"ê‹";i:11483;s:3:"ê‹";i:11484;s:3:"ê‹‘";i:11485;s:3:"ê‹’";i:11486;s:3:"ê‹“";i:11487;s:3:"ê‹”";i:11488;s:3:"ê‹•";i:11489;s:3:"ê‹–";i:11490;s:3:"ê‹—";i:11491;s:3:"ꋘ";i:11492;s:3:"ê‹™";i:11493;s:3:"ê‹š";i:11494;s:3:"ê‹›";i:11495;s:3:"ê‹œ";i:11496;s:3:"ê‹";i:11497;s:3:"ê‹ž";i:11498;s:3:"ê‹Ÿ";i:11499;s:3:"ê‹ ";i:11500;s:3:"ê‹¡";i:11501;s:3:"ê‹¢";i:11502;s:3:"ê‹£";i:11503;s:3:"ꋤ";i:11504;s:3:"ê‹¥";i:11505;s:3:"ꋦ";i:11506;s:3:"ꋧ";i:11507;s:3:"ꋨ";i:11508;s:3:"ê‹©";i:11509;s:3:"ꋪ";i:11510;s:3:"ê‹«";i:11511;s:3:"ꋬ";i:11512;s:3:"ê‹­";i:11513;s:3:"ê‹®";i:11514;s:3:"ꋯ";i:11515;s:3:"ê‹°";i:11516;s:3:"ꋱ";i:11517;s:3:"ꋲ";i:11518;s:3:"ꋳ";i:11519;s:3:"ê‹´";i:11520;s:3:"ꋵ";i:11521;s:3:"ꋶ";i:11522;s:3:"ê‹·";i:11523;s:3:"ꋸ";i:11524;s:3:"ꋹ";i:11525;s:3:"ꋺ";i:11526;s:3:"ê‹»";i:11527;s:3:"ꋼ";i:11528;s:3:"ꋽ";i:11529;s:3:"ꋾ";i:11530;s:3:"ê‹¿";i:11531;s:3:"ꌀ";i:11532;s:3:"êŒ";i:11533;s:3:"ꌂ";i:11534;s:3:"ꌃ";i:11535;s:3:"ꌄ";i:11536;s:3:"ꌅ";i:11537;s:3:"ꌆ";i:11538;s:3:"ꌇ";i:11539;s:3:"ꌈ";i:11540;s:3:"ꌉ";i:11541;s:3:"ꌊ";i:11542;s:3:"ꌋ";i:11543;s:3:"ꌌ";i:11544;s:3:"êŒ";i:11545;s:3:"ꌎ";i:11546;s:3:"êŒ";i:11547;s:3:"êŒ";i:11548;s:3:"ꌑ";i:11549;s:3:"ꌒ";i:11550;s:3:"ꌓ";i:11551;s:3:"ꌔ";i:11552;s:3:"ꌕ";i:11553;s:3:"ꌖ";i:11554;s:3:"ꌗ";i:11555;s:3:"ꌘ";i:11556;s:3:"ꌙ";i:11557;s:3:"ꌚ";i:11558;s:3:"ꌛ";i:11559;s:3:"ꌜ";i:11560;s:3:"êŒ";i:11561;s:3:"ꌞ";i:11562;s:3:"ꌟ";i:11563;s:3:"ꌠ";i:11564;s:3:"ꌡ";i:11565;s:3:"ꌢ";i:11566;s:3:"ꌣ";i:11567;s:3:"ꌤ";i:11568;s:3:"ꌥ";i:11569;s:3:"ꌦ";i:11570;s:3:"ꌧ";i:11571;s:3:"ꌨ";i:11572;s:3:"ꌩ";i:11573;s:3:"ꌪ";i:11574;s:3:"ꌫ";i:11575;s:3:"ꌬ";i:11576;s:3:"ꌭ";i:11577;s:3:"ꌮ";i:11578;s:3:"ꌯ";i:11579;s:3:"ꌰ";i:11580;s:3:"ꌱ";i:11581;s:3:"ꌲ";i:11582;s:3:"ꌳ";i:11583;s:3:"ꌴ";i:11584;s:3:"ꌵ";i:11585;s:3:"ꌶ";i:11586;s:3:"ꌷ";i:11587;s:3:"ꌸ";i:11588;s:3:"ꌹ";i:11589;s:3:"ꌺ";i:11590;s:3:"ꌻ";i:11591;s:3:"ꌼ";i:11592;s:3:"ꌽ";i:11593;s:3:"ꌾ";i:11594;s:3:"ꌿ";i:11595;s:3:"ê€";i:11596;s:3:"ê";i:11597;s:3:"ê‚";i:11598;s:3:"êƒ";i:11599;s:3:"ê„";i:11600;s:3:"ê…";i:11601;s:3:"ê†";i:11602;s:3:"ê‡";i:11603;s:3:"êˆ";i:11604;s:3:"ê‰";i:11605;s:3:"êŠ";i:11606;s:3:"ê‹";i:11607;s:3:"êŒ";i:11608;s:3:"ê";i:11609;s:3:"êŽ";i:11610;s:3:"ê";i:11611;s:3:"ê";i:11612;s:3:"ê‘";i:11613;s:3:"ê’";i:11614;s:3:"ê“";i:11615;s:3:"ê”";i:11616;s:3:"ê•";i:11617;s:3:"ê–";i:11618;s:3:"ê—";i:11619;s:3:"ê˜";i:11620;s:3:"ê™";i:11621;s:3:"êš";i:11622;s:3:"ê›";i:11623;s:3:"êœ";i:11624;s:3:"ê";i:11625;s:3:"êž";i:11626;s:3:"êŸ";i:11627;s:3:"ê ";i:11628;s:3:"ê¡";i:11629;s:3:"ê¢";i:11630;s:3:"ê£";i:11631;s:3:"ê¤";i:11632;s:3:"ê¥";i:11633;s:3:"ê¦";i:11634;s:3:"ê§";i:11635;s:3:"ê¨";i:11636;s:3:"ê©";i:11637;s:3:"êª";i:11638;s:3:"ê«";i:11639;s:3:"ê¬";i:11640;s:3:"ê­";i:11641;s:3:"ê®";i:11642;s:3:"ê¯";i:11643;s:3:"ê°";i:11644;s:3:"ê±";i:11645;s:3:"ê²";i:11646;s:3:"ê³";i:11647;s:3:"ê´";i:11648;s:3:"êµ";i:11649;s:3:"ê¶";i:11650;s:3:"ê·";i:11651;s:3:"ê¸";i:11652;s:3:"ê¹";i:11653;s:3:"êº";i:11654;s:3:"ê»";i:11655;s:3:"ê¼";i:11656;s:3:"ê½";i:11657;s:3:"ê¾";i:11658;s:3:"ê¿";i:11659;s:3:"ꎀ";i:11660;s:3:"êŽ";i:11661;s:3:"ꎂ";i:11662;s:3:"ꎃ";i:11663;s:3:"ꎄ";i:11664;s:3:"ꎅ";i:11665;s:3:"ꎆ";i:11666;s:3:"ꎇ";i:11667;s:3:"ꎈ";i:11668;s:3:"ꎉ";i:11669;s:3:"ꎊ";i:11670;s:3:"ꎋ";i:11671;s:3:"ꎌ";i:11672;s:3:"êŽ";i:11673;s:3:"ꎎ";i:11674;s:3:"êŽ";i:11675;s:3:"êŽ";i:11676;s:3:"ꎑ";i:11677;s:3:"ꎒ";i:11678;s:3:"ꎓ";i:11679;s:3:"ꎔ";i:11680;s:3:"ꎕ";i:11681;s:3:"ꎖ";i:11682;s:3:"ꎗ";i:11683;s:3:"ꎘ";i:11684;s:3:"ꎙ";i:11685;s:3:"ꎚ";i:11686;s:3:"ꎛ";i:11687;s:3:"ꎜ";i:11688;s:3:"êŽ";i:11689;s:3:"ꎞ";i:11690;s:3:"ꎟ";i:11691;s:3:"ꎠ";i:11692;s:3:"ꎡ";i:11693;s:3:"ꎢ";i:11694;s:3:"ꎣ";i:11695;s:3:"ꎤ";i:11696;s:3:"ꎥ";i:11697;s:3:"ꎦ";i:11698;s:3:"ꎧ";i:11699;s:3:"ꎨ";i:11700;s:3:"ꎩ";i:11701;s:3:"ꎪ";i:11702;s:3:"ꎫ";i:11703;s:3:"ꎬ";i:11704;s:3:"ꎭ";i:11705;s:3:"ꎮ";i:11706;s:3:"ꎯ";i:11707;s:3:"ꎰ";i:11708;s:3:"ꎱ";i:11709;s:3:"ꎲ";i:11710;s:3:"ꎳ";i:11711;s:3:"ꎴ";i:11712;s:3:"ꎵ";i:11713;s:3:"ꎶ";i:11714;s:3:"ꎷ";i:11715;s:3:"ꎸ";i:11716;s:3:"ꎹ";i:11717;s:3:"ꎺ";i:11718;s:3:"ꎻ";i:11719;s:3:"ꎼ";i:11720;s:3:"ꎽ";i:11721;s:3:"ꎾ";i:11722;s:3:"ꎿ";i:11723;s:3:"ê€";i:11724;s:3:"ê";i:11725;s:3:"ê‚";i:11726;s:3:"êƒ";i:11727;s:3:"ê„";i:11728;s:3:"ê…";i:11729;s:3:"ê†";i:11730;s:3:"ê‡";i:11731;s:3:"êˆ";i:11732;s:3:"ê‰";i:11733;s:3:"êŠ";i:11734;s:3:"ê‹";i:11735;s:3:"êŒ";i:11736;s:3:"ê";i:11737;s:3:"êŽ";i:11738;s:3:"ê";i:11739;s:3:"ê";i:11740;s:3:"ê‘";i:11741;s:3:"ê’";i:11742;s:3:"ê“";i:11743;s:3:"ê”";i:11744;s:3:"ê•";i:11745;s:3:"ê–";i:11746;s:3:"ê—";i:11747;s:3:"ê˜";i:11748;s:3:"ê™";i:11749;s:3:"êš";i:11750;s:3:"ê›";i:11751;s:3:"êœ";i:11752;s:3:"ê";i:11753;s:3:"êž";i:11754;s:3:"êŸ";i:11755;s:3:"ê ";i:11756;s:3:"ê¡";i:11757;s:3:"ê¢";i:11758;s:3:"ê£";i:11759;s:3:"ê¤";i:11760;s:3:"ê¥";i:11761;s:3:"ê¦";i:11762;s:3:"ê§";i:11763;s:3:"ê¨";i:11764;s:3:"ê©";i:11765;s:3:"êª";i:11766;s:3:"ê«";i:11767;s:3:"ê¬";i:11768;s:3:"ê­";i:11769;s:3:"ê®";i:11770;s:3:"ê¯";i:11771;s:3:"ê°";i:11772;s:3:"ê±";i:11773;s:3:"ê²";i:11774;s:3:"ê³";i:11775;s:3:"ê´";i:11776;s:3:"êµ";i:11777;s:3:"ê¶";i:11778;s:3:"ê·";i:11779;s:3:"ê¸";i:11780;s:3:"ê¹";i:11781;s:3:"êº";i:11782;s:3:"ê»";i:11783;s:3:"ê¼";i:11784;s:3:"ê½";i:11785;s:3:"ê¾";i:11786;s:3:"ê¿";i:11787;s:3:"ê€";i:11788;s:3:"ê";i:11789;s:3:"ê‚";i:11790;s:3:"êƒ";i:11791;s:3:"ê„";i:11792;s:3:"ê…";i:11793;s:3:"ê†";i:11794;s:3:"ê‡";i:11795;s:3:"êˆ";i:11796;s:3:"ê‰";i:11797;s:3:"êŠ";i:11798;s:3:"ê‹";i:11799;s:3:"êŒ";i:11800;s:3:"ê";i:11801;s:3:"êŽ";i:11802;s:3:"ê";i:11803;s:3:"ê";i:11804;s:3:"ê‘";i:11805;s:3:"ê’";i:11806;s:3:"ê“";i:11807;s:3:"ê”";i:11808;s:3:"ê•";i:11809;s:3:"ê–";i:11810;s:3:"ê—";i:11811;s:3:"ê˜";i:11812;s:3:"ê™";i:11813;s:3:"êš";i:11814;s:3:"ê›";i:11815;s:3:"êœ";i:11816;s:3:"ê";i:11817;s:3:"êž";i:11818;s:3:"êŸ";i:11819;s:3:"ê ";i:11820;s:3:"ê¡";i:11821;s:3:"ê¢";i:11822;s:3:"ê£";i:11823;s:3:"ê¤";i:11824;s:3:"ê¥";i:11825;s:3:"ê¦";i:11826;s:3:"ê§";i:11827;s:3:"ê¨";i:11828;s:3:"ê©";i:11829;s:3:"êª";i:11830;s:3:"ê«";i:11831;s:3:"ê¬";i:11832;s:3:"ê­";i:11833;s:3:"ê®";i:11834;s:3:"ê¯";i:11835;s:3:"ê°";i:11836;s:3:"ê±";i:11837;s:3:"ê²";i:11838;s:3:"ê³";i:11839;s:3:"ê´";i:11840;s:3:"êµ";i:11841;s:3:"ê¶";i:11842;s:3:"ê·";i:11843;s:3:"ê¸";i:11844;s:3:"ê¹";i:11845;s:3:"êº";i:11846;s:3:"ê»";i:11847;s:3:"ê¼";i:11848;s:3:"ê½";i:11849;s:3:"ê¾";i:11850;s:3:"ê¿";i:11851;s:3:"ê‘€";i:11852;s:3:"ê‘";i:11853;s:3:"ê‘‚";i:11854;s:3:"ꑃ";i:11855;s:3:"ê‘„";i:11856;s:3:"ê‘…";i:11857;s:3:"ꑆ";i:11858;s:3:"ꑇ";i:11859;s:3:"ꑈ";i:11860;s:3:"ꑉ";i:11861;s:3:"ê‘Š";i:11862;s:3:"ê‘‹";i:11863;s:3:"ê‘Œ";i:11864;s:3:"ê‘";i:11865;s:3:"ê‘Ž";i:11866;s:3:"ê‘";i:11867;s:3:"ê‘";i:11868;s:3:"ê‘‘";i:11869;s:3:"ê‘’";i:11870;s:3:"ê‘“";i:11871;s:3:"ê‘”";i:11872;s:3:"ê‘•";i:11873;s:3:"ê‘–";i:11874;s:3:"ê‘—";i:11875;s:3:"ꑘ";i:11876;s:3:"ê‘™";i:11877;s:3:"ê‘š";i:11878;s:3:"ê‘›";i:11879;s:3:"ê‘œ";i:11880;s:3:"ê‘";i:11881;s:3:"ê‘ž";i:11882;s:3:"ê‘Ÿ";i:11883;s:3:"ê‘ ";i:11884;s:3:"ê‘¡";i:11885;s:3:"ê‘¢";i:11886;s:3:"ê‘£";i:11887;s:3:"ꑤ";i:11888;s:3:"ê‘¥";i:11889;s:3:"ꑦ";i:11890;s:3:"ꑧ";i:11891;s:3:"ꑨ";i:11892;s:3:"ê‘©";i:11893;s:3:"ꑪ";i:11894;s:3:"ê‘«";i:11895;s:3:"ꑬ";i:11896;s:3:"ê‘­";i:11897;s:3:"ê‘®";i:11898;s:3:"ꑯ";i:11899;s:3:"ê‘°";i:11900;s:3:"ꑱ";i:11901;s:3:"ꑲ";i:11902;s:3:"ꑳ";i:11903;s:3:"ê‘´";i:11904;s:3:"ꑵ";i:11905;s:3:"ꑶ";i:11906;s:3:"ê‘·";i:11907;s:3:"ꑸ";i:11908;s:3:"ꑹ";i:11909;s:3:"ꑺ";i:11910;s:3:"ê‘»";i:11911;s:3:"ꑼ";i:11912;s:3:"ꑽ";i:11913;s:3:"ꑾ";i:11914;s:3:"ê‘¿";i:11915;s:3:"ê’€";i:11916;s:3:"ê’";i:11917;s:3:"ê’‚";i:11918;s:3:"ê’ƒ";i:11919;s:3:"ê’„";i:11920;s:3:"ê’…";i:11921;s:3:"ê’†";i:11922;s:3:"ê’‡";i:11923;s:3:"ê’ˆ";i:11924;s:3:"ê’‰";i:11925;s:3:"ê’Š";i:11926;s:3:"ê’‹";i:11927;s:3:"ê’Œ";i:11928;s:3:"ꓸ";i:11929;s:3:"ꓹ";i:11930;s:3:"ꓺ";i:11931;s:3:"ê“»";i:11932;s:3:"ꓽ";i:11933;s:3:"ꓼ";i:11934;s:3:"ê“";i:11935;s:3:"ê“‘";i:11936;s:3:"ê“’";i:11937;s:3:"ê““";i:11938;s:3:"ê“”";i:11939;s:3:"ê“•";i:11940;s:3:"ê“–";i:11941;s:3:"ê“—";i:11942;s:3:"ꓘ";i:11943;s:3:"ê“™";i:11944;s:3:"ê“š";i:11945;s:3:"ê“›";i:11946;s:3:"ê“œ";i:11947;s:3:"ê“";i:11948;s:3:"ê“ž";i:11949;s:3:"ê“Ÿ";i:11950;s:3:"ê“ ";i:11951;s:3:"ê“¡";i:11952;s:3:"ê“¢";i:11953;s:3:"ê“£";i:11954;s:3:"ꓤ";i:11955;s:3:"ê“¥";i:11956;s:3:"ꓦ";i:11957;s:3:"ꓧ";i:11958;s:3:"ꓨ";i:11959;s:3:"ê“©";i:11960;s:3:"ê“«";i:11961;s:3:"ê“­";i:11962;s:3:"ꓪ";i:11963;s:3:"ꓬ";i:11964;s:3:"ê“®";i:11965;s:3:"ꓯ";i:11966;s:3:"ê“°";i:11967;s:3:"ꓱ";i:11968;s:3:"ꓲ";i:11969;s:3:"ꓳ";i:11970;s:3:"ê“´";i:11971;s:3:"ꓵ";i:11972;s:3:"ꓶ";i:11973;s:3:"ê“·";i:11974;s:4:"ðŠ€";i:11975;s:4:"ðŠ";i:11976;s:4:"ðŠ‚";i:11977;s:4:"ðŠƒ";i:11978;s:4:"ðŠ„";i:11979;s:4:"ðŠ…";i:11980;s:4:"ðŠ†";i:11981;s:4:"ðŠ‡";i:11982;s:4:"ðŠˆ";i:11983;s:4:"ðŠ‰";i:11984;s:4:"ðŠŠ";i:11985;s:4:"ðŠ‹";i:11986;s:4:"ðŠŒ";i:11987;s:4:"ðŠ";i:11988;s:4:"ðŠŽ";i:11989;s:4:"ðŠ";i:11990;s:4:"ðŠ";i:11991;s:4:"ðŠ‘";i:11992;s:4:"ðŠ’";i:11993;s:4:"ðŠ“";i:11994;s:4:"ðŠ”";i:11995;s:4:"ðŠ•";i:11996;s:4:"ðŠ–";i:11997;s:4:"ðŠ—";i:11998;s:4:"ðŠ˜";i:11999;s:4:"ðŠ™";i:12000;s:4:"ðŠš";i:12001;s:4:"ðŠ›";i:12002;s:4:"ðŠœ";i:12003;s:4:"ðŠ ";i:12004;s:4:"ðŠ¡";i:12005;s:4:"ðŠ¢";i:12006;s:4:"ðŠ£";i:12007;s:4:"ðŠ¤";i:12008;s:4:"ðŠ¥";i:12009;s:4:"ðŠ¦";i:12010;s:4:"ðŠ§";i:12011;s:4:"ðŠ¨";i:12012;s:4:"ðŠ©";i:12013;s:4:"ðŠª";i:12014;s:4:"ðŠ«";i:12015;s:4:"ðŠ¬";i:12016;s:4:"ðŠ­";i:12017;s:4:"ðŠ®";i:12018;s:4:"ðŠ¯";i:12019;s:4:"ðŠ°";i:12020;s:4:"ðŠ±";i:12021;s:4:"ðŠ²";i:12022;s:4:"ðŠ³";i:12023;s:4:"ðŠ´";i:12024;s:4:"ðŠµ";i:12025;s:4:"ðŠ¶";i:12026;s:4:"ðŠ·";i:12027;s:4:"ðŠ¸";i:12028;s:4:"ðŠ¹";i:12029;s:4:"ðŠº";i:12030;s:4:"ðŠ»";i:12031;s:4:"ðŠ¼";i:12032;s:4:"ðŠ½";i:12033;s:4:"ðŠ¾";i:12034;s:4:"ðŠ¿";i:12035;s:4:"ð‹€";i:12036;s:4:"ð‹";i:12037;s:4:"ð‹‚";i:12038;s:4:"ð‹ƒ";i:12039;s:4:"ð‹„";i:12040;s:4:"ð‹…";i:12041;s:4:"ð‹†";i:12042;s:4:"ð‹‡";i:12043;s:4:"ð‹ˆ";i:12044;s:4:"ð‹‰";i:12045;s:4:"ð‹Š";i:12046;s:4:"ð‹‹";i:12047;s:4:"ð‹Œ";i:12048;s:4:"ð‹";i:12049;s:4:"ð‹Ž";i:12050;s:4:"ð‹";i:12051;s:4:"ð‹";i:12052;s:4:"ð¤ ";i:12053;s:4:"ð¤¡";i:12054;s:4:"ð¤¢";i:12055;s:4:"ð¤£";i:12056;s:4:"ð¤¤";i:12057;s:4:"ð¤¥";i:12058;s:4:"ð¤¦";i:12059;s:4:"ð¤§";i:12060;s:4:"ð¤¨";i:12061;s:4:"ð¤©";i:12062;s:4:"ð¤ª";i:12063;s:4:"ð¤«";i:12064;s:4:"ð¤¬";i:12065;s:4:"ð¤­";i:12066;s:4:"ð¤®";i:12067;s:4:"ð¤¯";i:12068;s:4:"ð¤°";i:12069;s:4:"ð¤±";i:12070;s:4:"ð¤²";i:12071;s:4:"ð¤³";i:12072;s:4:"ð¤´";i:12073;s:4:"ð¤µ";i:12074;s:4:"ð¤¶";i:12075;s:4:"ð¤·";i:12076;s:4:"ð¤¸";i:12077;s:4:"ð¤¹";i:12078;s:4:"ðŒ€";i:12079;s:4:"ðŒ";i:12080;s:4:"ðŒ‚";i:12081;s:4:"ðŒƒ";i:12082;s:4:"ðŒ„";i:12083;s:4:"ðŒ…";i:12084;s:4:"ðŒ†";i:12085;s:4:"ðŒ‡";i:12086;s:4:"ðŒˆ";i:12087;s:4:"ðŒ‰";i:12088;s:4:"ðŒŠ";i:12089;s:4:"ðŒ‹";i:12090;s:4:"ðŒŒ";i:12091;s:4:"ðŒ";i:12092;s:4:"ðŒŽ";i:12093;s:4:"ðŒ";i:12094;s:4:"ðŒ";i:12095;s:4:"ðŒ‘";i:12096;s:4:"ðŒ’";i:12097;s:4:"ðŒ“";i:12098;s:4:"ðŒ”";i:12099;s:4:"ðŒ•";i:12100;s:4:"ðŒ–";i:12101;s:4:"ðŒ—";i:12102;s:4:"ðŒ˜";i:12103;s:4:"ðŒ™";i:12104;s:4:"ðŒš";i:12105;s:4:"ðŒ›";i:12106;s:4:"ðŒœ";i:12107;s:4:"ðŒ";i:12108;s:4:"ðŒž";i:12109;s:4:"ðŒ°";i:12110;s:4:"ðŒ±";i:12111;s:4:"ðŒ²";i:12112;s:4:"ðŒ³";i:12113;s:4:"ðŒ´";i:12114;s:4:"ðŒµ";i:12115;s:4:"ðŒ¶";i:12116;s:4:"ðŒ·";i:12117;s:4:"ðŒ¸";i:12118;s:4:"ðŒ¹";i:12119;s:4:"ðŒº";i:12120;s:4:"ðŒ»";i:12121;s:4:"ðŒ¼";i:12122;s:4:"ðŒ½";i:12123;s:4:"ðŒ¾";i:12124;s:4:"ðŒ¿";i:12125;s:4:"ð€";i:12126;s:4:"ð";i:12127;s:4:"ð‚";i:12128;s:4:"ðƒ";i:12129;s:4:"ð„";i:12130;s:4:"ð…";i:12131;s:4:"ð†";i:12132;s:4:"ð‡";i:12133;s:4:"ðˆ";i:12134;s:4:"ð‰";i:12135;s:4:"ðŠ";i:12136;s:4:"ð€";i:12137;s:4:"ð";i:12138;s:4:"ð‚";i:12139;s:4:"ðƒ";i:12140;s:4:"ð„";i:12141;s:4:"ð…";i:12142;s:4:"ð†";i:12143;s:4:"ð‡";i:12144;s:4:"ðˆ";i:12145;s:4:"ð‰";i:12146;s:4:"ðŠ";i:12147;s:4:"ð‹";i:12148;s:4:"ðŒ";i:12149;s:4:"ð";i:12150;s:4:"ðŽ";i:12151;s:4:"ð";i:12152;s:4:"ð";i:12153;s:4:"ð‘";i:12154;s:4:"ð’";i:12155;s:4:"ð“";i:12156;s:4:"ð”";i:12157;s:4:"ð•";i:12158;s:4:"ð–";i:12159;s:4:"ð—";i:12160;s:4:"ð˜";i:12161;s:4:"ð™";i:12162;s:4:"ðš";i:12163;s:4:"ð›";i:12164;s:4:"ðœ";i:12165;s:4:"ð";i:12166;s:4:"ðž";i:12167;s:4:"ðŸ";i:12168;s:4:"ð ";i:12169;s:4:"ð¡";i:12170;s:4:"ð¢";i:12171;s:4:"ð£";i:12172;s:4:"ð¤";i:12173;s:4:"ð¥";i:12174;s:4:"ð¦";i:12175;s:4:"ð§";i:12176;s:4:"ð‘";i:12177;s:4:"ð‘‘";i:12178;s:4:"ð‘’";i:12179;s:4:"ð‘“";i:12180;s:4:"ð‘”";i:12181;s:4:"ð‘•";i:12182;s:4:"ð‘–";i:12183;s:4:"ð‘—";i:12184;s:4:"ð‘˜";i:12185;s:4:"ð‘™";i:12186;s:4:"ð‘š";i:12187;s:4:"ð‘›";i:12188;s:4:"ð‘œ";i:12189;s:4:"ð‘";i:12190;s:4:"ð‘ž";i:12191;s:4:"ð‘Ÿ";i:12192;s:4:"ð‘ ";i:12193;s:4:"ð‘¡";i:12194;s:4:"ð‘¢";i:12195;s:4:"ð‘£";i:12196;s:4:"ð‘¤";i:12197;s:4:"ð‘¥";i:12198;s:4:"ð‘¦";i:12199;s:4:"ð‘§";i:12200;s:4:"ð‘¨";i:12201;s:4:"ð‘©";i:12202;s:4:"ð‘ª";i:12203;s:4:"ð‘«";i:12204;s:4:"ð‘¬";i:12205;s:4:"ð‘­";i:12206;s:4:"ð‘®";i:12207;s:4:"ð‘¯";i:12208;s:4:"ð‘°";i:12209;s:4:"ð‘±";i:12210;s:4:"ð‘²";i:12211;s:4:"ð‘³";i:12212;s:4:"ð‘´";i:12213;s:4:"ð‘µ";i:12214;s:4:"ð‘¶";i:12215;s:4:"ð‘·";i:12216;s:4:"ð‘¸";i:12217;s:4:"ð‘¹";i:12218;s:4:"ð‘º";i:12219;s:4:"ð‘»";i:12220;s:4:"ð‘¼";i:12221;s:4:"ð‘½";i:12222;s:4:"ð‘¾";i:12223;s:4:"ð‘¿";i:12224;s:4:"ð’€";i:12225;s:4:"ð’";i:12226;s:4:"ð’‚";i:12227;s:4:"ð’ƒ";i:12228;s:4:"ð’„";i:12229;s:4:"ð’…";i:12230;s:4:"ð’†";i:12231;s:4:"ð’‡";i:12232;s:4:"ð’ˆ";i:12233;s:4:"ð’‰";i:12234;s:4:"ð’Š";i:12235;s:4:"ð’‹";i:12236;s:4:"ð’Œ";i:12237;s:4:"ð’";i:12238;s:4:"ð’Ž";i:12239;s:4:"ð’";i:12240;s:4:"ð’";i:12241;s:4:"ð’‘";i:12242;s:4:"ð’’";i:12243;s:4:"ð’“";i:12244;s:4:"ð’”";i:12245;s:4:"ð’•";i:12246;s:4:"ð’–";i:12247;s:4:"ð’—";i:12248;s:4:"ð’˜";i:12249;s:4:"ð’™";i:12250;s:4:"ð’š";i:12251;s:4:"ð’›";i:12252;s:4:"ð’œ";i:12253;s:4:"ð’";i:12254;s:4:"ð€€";i:12255;s:4:"ð€";i:12256;s:4:"ð€‚";i:12257;s:4:"ð€ƒ";i:12258;s:4:"ð€„";i:12259;s:4:"ð€…";i:12260;s:4:"ð€†";i:12261;s:4:"ð€‡";i:12262;s:4:"ð€ˆ";i:12263;s:4:"ð€‰";i:12264;s:4:"ð€Š";i:12265;s:4:"ð€‹";i:12266;s:4:"ð€";i:12267;s:4:"ð€Ž";i:12268;s:4:"ð€";i:12269;s:4:"ð€";i:12270;s:4:"ð€‘";i:12271;s:4:"ð€’";i:12272;s:4:"ð€“";i:12273;s:4:"ð€”";i:12274;s:4:"ð€•";i:12275;s:4:"ð€–";i:12276;s:4:"ð€—";i:12277;s:4:"ð€˜";i:12278;s:4:"ð€™";i:12279;s:4:"ð€š";i:12280;s:4:"ð€›";i:12281;s:4:"ð€œ";i:12282;s:4:"ð€";i:12283;s:4:"ð€ž";i:12284;s:4:"ð€Ÿ";i:12285;s:4:"ð€ ";i:12286;s:4:"ð€¡";i:12287;s:4:"ð€¢";i:12288;s:4:"ð€£";i:12289;s:4:"ð€¤";i:12290;s:4:"ð€¥";i:12291;s:4:"ð€¦";i:12292;s:4:"ð€¨";i:12293;s:4:"ð€©";i:12294;s:4:"ð€ª";i:12295;s:4:"ð€«";i:12296;s:4:"ð€¬";i:12297;s:4:"ð€­";i:12298;s:4:"ð€®";i:12299;s:4:"ð€¯";i:12300;s:4:"ð€°";i:12301;s:4:"ð€±";i:12302;s:4:"ð€²";i:12303;s:4:"ð€³";i:12304;s:4:"ð€´";i:12305;s:4:"ð€µ";i:12306;s:4:"ð€¶";i:12307;s:4:"ð€·";i:12308;s:4:"ð€¸";i:12309;s:4:"ð€¹";i:12310;s:4:"ð€º";i:12311;s:4:"ð€¼";i:12312;s:4:"ð€½";i:12313;s:4:"ð€¿";i:12314;s:4:"ð€";i:12315;s:4:"ð";i:12316;s:4:"ð‚";i:12317;s:4:"ðƒ";i:12318;s:4:"ð„";i:12319;s:4:"ð…";i:12320;s:4:"ð†";i:12321;s:4:"ð‡";i:12322;s:4:"ðˆ";i:12323;s:4:"ð‰";i:12324;s:4:"ðŠ";i:12325;s:4:"ð‹";i:12326;s:4:"ðŒ";i:12327;s:4:"ð";i:12328;s:4:"ð";i:12329;s:4:"ð‘";i:12330;s:4:"ð’";i:12331;s:4:"ð“";i:12332;s:4:"ð”";i:12333;s:4:"ð•";i:12334;s:4:"ð–";i:12335;s:4:"ð—";i:12336;s:4:"ð˜";i:12337;s:4:"ð™";i:12338;s:4:"ðš";i:12339;s:4:"ð›";i:12340;s:4:"ðœ";i:12341;s:4:"ð";i:12342;s:4:"ð‚€";i:12343;s:4:"ð‚";i:12344;s:4:"ð‚‚";i:12345;s:4:"ð‚ƒ";i:12346;s:4:"ð‚„";i:12347;s:4:"ð‚…";i:12348;s:4:"ð‚†";i:12349;s:4:"ð‚‡";i:12350;s:4:"ð‚ˆ";i:12351;s:4:"ð‚‰";i:12352;s:4:"ð‚Š";i:12353;s:4:"ð‚‹";i:12354;s:4:"ð‚Œ";i:12355;s:4:"ð‚";i:12356;s:4:"ð‚Ž";i:12357;s:4:"ð‚";i:12358;s:4:"ð‚";i:12359;s:4:"ð‚‘";i:12360;s:4:"ð‚’";i:12361;s:4:"ð‚“";i:12362;s:4:"ð‚”";i:12363;s:4:"ð‚•";i:12364;s:4:"ð‚–";i:12365;s:4:"ð‚—";i:12366;s:4:"ð‚˜";i:12367;s:4:"ð‚™";i:12368;s:4:"ð‚š";i:12369;s:4:"ð‚›";i:12370;s:4:"ð‚œ";i:12371;s:4:"ð‚";i:12372;s:4:"ð‚ž";i:12373;s:4:"ð‚Ÿ";i:12374;s:4:"ð‚ ";i:12375;s:4:"ð‚¡";i:12376;s:4:"ð‚¢";i:12377;s:4:"ð‚£";i:12378;s:4:"ð‚¤";i:12379;s:4:"ð‚¥";i:12380;s:4:"ð‚¦";i:12381;s:4:"ð‚§";i:12382;s:4:"ð‚¨";i:12383;s:4:"ð‚©";i:12384;s:4:"ð‚ª";i:12385;s:4:"ð‚«";i:12386;s:4:"ð‚¬";i:12387;s:4:"ð‚­";i:12388;s:4:"ð‚®";i:12389;s:4:"ð‚¯";i:12390;s:4:"ð‚°";i:12391;s:4:"ð‚±";i:12392;s:4:"ð‚²";i:12393;s:4:"ð‚³";i:12394;s:4:"ð‚´";i:12395;s:4:"ð‚µ";i:12396;s:4:"ð‚¶";i:12397;s:4:"ð‚·";i:12398;s:4:"ð‚¸";i:12399;s:4:"ð‚¹";i:12400;s:4:"ð‚º";i:12401;s:4:"ð‚»";i:12402;s:4:"ð‚¼";i:12403;s:4:"ð‚½";i:12404;s:4:"ð‚¾";i:12405;s:4:"ð‚¿";i:12406;s:4:"ðƒ€";i:12407;s:4:"ðƒ";i:12408;s:4:"ðƒ‚";i:12409;s:4:"ðƒƒ";i:12410;s:4:"ðƒ„";i:12411;s:4:"ðƒ…";i:12412;s:4:"ðƒ†";i:12413;s:4:"ðƒ‡";i:12414;s:4:"ðƒˆ";i:12415;s:4:"ðƒ‰";i:12416;s:4:"ðƒŠ";i:12417;s:4:"ðƒ‹";i:12418;s:4:"ðƒŒ";i:12419;s:4:"ðƒ";i:12420;s:4:"ðƒŽ";i:12421;s:4:"ðƒ";i:12422;s:4:"ðƒ";i:12423;s:4:"ðƒ‘";i:12424;s:4:"ðƒ’";i:12425;s:4:"ðƒ“";i:12426;s:4:"ðƒ”";i:12427;s:4:"ðƒ•";i:12428;s:4:"ðƒ–";i:12429;s:4:"ðƒ—";i:12430;s:4:"ðƒ˜";i:12431;s:4:"ðƒ™";i:12432;s:4:"ðƒš";i:12433;s:4:"ðƒ›";i:12434;s:4:"ðƒœ";i:12435;s:4:"ðƒ";i:12436;s:4:"ðƒž";i:12437;s:4:"ðƒŸ";i:12438;s:4:"ðƒ ";i:12439;s:4:"ðƒ¡";i:12440;s:4:"ðƒ¢";i:12441;s:4:"ðƒ£";i:12442;s:4:"ðƒ¤";i:12443;s:4:"ðƒ¥";i:12444;s:4:"ðƒ¦";i:12445;s:4:"ðƒ§";i:12446;s:4:"ðƒ¨";i:12447;s:4:"ðƒ©";i:12448;s:4:"ðƒª";i:12449;s:4:"ðƒ«";i:12450;s:4:"ðƒ¬";i:12451;s:4:"ðƒ­";i:12452;s:4:"ðƒ®";i:12453;s:4:"ðƒ¯";i:12454;s:4:"ðƒ°";i:12455;s:4:"ðƒ±";i:12456;s:4:"ðƒ²";i:12457;s:4:"ðƒ³";i:12458;s:4:"ðƒ´";i:12459;s:4:"ðƒµ";i:12460;s:4:"ðƒ¶";i:12461;s:4:"ðƒ·";i:12462;s:4:"ðƒ¸";i:12463;s:4:"ðƒ¹";i:12464;s:4:"ðƒº";i:12465;s:4:"ð €";i:12466;s:4:"ð ";i:12467;s:4:"ð ‚";i:12468;s:4:"ð ƒ";i:12469;s:4:"ð „";i:12470;s:4:"ð …";i:12471;s:4:"ð ˆ";i:12472;s:4:"ð Š";i:12473;s:4:"ð ‹";i:12474;s:4:"ð Œ";i:12475;s:4:"ð ";i:12476;s:4:"ð Ž";i:12477;s:4:"ð ";i:12478;s:4:"ð ";i:12479;s:4:"ð ‘";i:12480;s:4:"ð ’";i:12481;s:4:"ð “";i:12482;s:4:"ð ”";i:12483;s:4:"ð •";i:12484;s:4:"ð –";i:12485;s:4:"ð —";i:12486;s:4:"ð ˜";i:12487;s:4:"ð ™";i:12488;s:4:"ð š";i:12489;s:4:"ð ›";i:12490;s:4:"ð œ";i:12491;s:4:"ð ";i:12492;s:4:"ð ž";i:12493;s:4:"ð Ÿ";i:12494;s:4:"ð  ";i:12495;s:4:"ð ¡";i:12496;s:4:"ð ¢";i:12497;s:4:"ð £";i:12498;s:4:"ð ¤";i:12499;s:4:"ð ¥";i:12500;s:4:"ð ¦";i:12501;s:4:"ð §";i:12502;s:4:"ð ¨";i:12503;s:4:"ð ©";i:12504;s:4:"ð ª";i:12505;s:4:"ð «";i:12506;s:4:"ð ¬";i:12507;s:4:"ð ­";i:12508;s:4:"ð ®";i:12509;s:4:"ð ¯";i:12510;s:4:"ð °";i:12511;s:4:"ð ±";i:12512;s:4:"ð ²";i:12513;s:4:"ð ³";i:12514;s:4:"ð ´";i:12515;s:4:"ð µ";i:12516;s:4:"ð ·";i:12517;s:4:"ð ¸";i:12518;s:4:"ð ¼";i:12519;s:4:"ð ¿";i:12520;s:4:"ð© ";i:12521;s:4:"ð©¡";i:12522;s:4:"ð©¢";i:12523;s:4:"ð©£";i:12524;s:4:"ð©¤";i:12525;s:4:"ð©¥";i:12526;s:4:"ð©¦";i:12527;s:4:"ð©§";i:12528;s:4:"ð©¨";i:12529;s:4:"ð©©";i:12530;s:4:"ð©ª";i:12531;s:4:"ð©«";i:12532;s:4:"ð©¬";i:12533;s:4:"ð©­";i:12534;s:4:"ð©®";i:12535;s:4:"ð©¯";i:12536;s:4:"ð©°";i:12537;s:4:"ð©±";i:12538;s:4:"ð©²";i:12539;s:4:"ð©³";i:12540;s:4:"ð©´";i:12541;s:4:"ð©µ";i:12542;s:4:"ð©¶";i:12543;s:4:"ð©·";i:12544;s:4:"ð©¸";i:12545;s:4:"ð©¹";i:12546;s:4:"ð©º";i:12547;s:4:"ð©»";i:12548;s:4:"ð©¼";i:12549;s:4:"ð¬€";i:12550;s:4:"ð¬";i:12551;s:4:"ð¬‚";i:12552;s:4:"ð¬ƒ";i:12553;s:4:"ð¬„";i:12554;s:4:"ð¬…";i:12555;s:4:"ð¬†";i:12556;s:4:"ð¬‡";i:12557;s:4:"ð¬ˆ";i:12558;s:4:"ð¬‰";i:12559;s:4:"ð¬Š";i:12560;s:4:"ð¬‹";i:12561;s:4:"ð¬Œ";i:12562;s:4:"ð¬";i:12563;s:4:"ð¬Ž";i:12564;s:4:"ð¬";i:12565;s:4:"ð¬";i:12566;s:4:"ð¬‘";i:12567;s:4:"ð¬’";i:12568;s:4:"ð¬“";i:12569;s:4:"ð¬”";i:12570;s:4:"ð¬•";i:12571;s:4:"ð¬–";i:12572;s:4:"ð¬—";i:12573;s:4:"ð¬˜";i:12574;s:4:"ð¬™";i:12575;s:4:"ð¬š";i:12576;s:4:"ð¬›";i:12577;s:4:"ð¬œ";i:12578;s:4:"ð¬";i:12579;s:4:"ð¬ž";i:12580;s:4:"ð¬Ÿ";i:12581;s:4:"ð¬ ";i:12582;s:4:"ð¬¡";i:12583;s:4:"ð¬¢";i:12584;s:4:"ð¬£";i:12585;s:4:"ð¬¤";i:12586;s:4:"ð¬¥";i:12587;s:4:"ð¬¦";i:12588;s:4:"ð¬§";i:12589;s:4:"ð¬¨";i:12590;s:4:"ð¬©";i:12591;s:4:"ð¬ª";i:12592;s:4:"ð¬«";i:12593;s:4:"ð¬¬";i:12594;s:4:"ð¬­";i:12595;s:4:"ð¬¯";i:12596;s:4:"ð¬°";i:12597;s:4:"ð¬±";i:12598;s:4:"ð¬²";i:12599;s:4:"ð¬³";i:12600;s:4:"ð¬´";i:12601;s:4:"ð¬µ";i:12602;s:4:"ð¡€";i:12603;s:4:"ð¡";i:12604;s:4:"ð¡‚";i:12605;s:4:"ð¡ƒ";i:12606;s:4:"ð¡„";i:12607;s:4:"ð¡…";i:12608;s:4:"ð¡†";i:12609;s:4:"ð¡‡";i:12610;s:4:"ð¡ˆ";i:12611;s:4:"ð¡‰";i:12612;s:4:"ð¡Š";i:12613;s:4:"ð¡‹";i:12614;s:4:"ð¡Œ";i:12615;s:4:"ð¡";i:12616;s:4:"ð¡Ž";i:12617;s:4:"ð¡";i:12618;s:4:"ð¡";i:12619;s:4:"ð¡‘";i:12620;s:4:"ð¡’";i:12621;s:4:"ð¡“";i:12622;s:4:"ð¡”";i:12623;s:4:"ð¡•";i:12624;s:4:"ð­€";i:12625;s:4:"ð­";i:12626;s:4:"ð­‚";i:12627;s:4:"ð­ƒ";i:12628;s:4:"ð­„";i:12629;s:4:"ð­…";i:12630;s:4:"ð­†";i:12631;s:4:"ð­‡";i:12632;s:4:"ð­ˆ";i:12633;s:4:"ð­‰";i:12634;s:4:"ð­Š";i:12635;s:4:"ð­‹";i:12636;s:4:"ð­Œ";i:12637;s:4:"ð­";i:12638;s:4:"ð­Ž";i:12639;s:4:"ð­";i:12640;s:4:"ð­";i:12641;s:4:"ð­‘";i:12642;s:4:"ð­’";i:12643;s:4:"ð­“";i:12644;s:4:"ð­”";i:12645;s:4:"ð­•";i:12646;s:4:"ð­ ";i:12647;s:4:"ð­¡";i:12648;s:4:"ð­¢";i:12649;s:4:"ð­£";i:12650;s:4:"ð­¤";i:12651;s:4:"ð­¥";i:12652;s:4:"ð­¦";i:12653;s:4:"ð­§";i:12654;s:4:"ð­¨";i:12655;s:4:"ð­©";i:12656;s:4:"ð­ª";i:12657;s:4:"ð­«";i:12658;s:4:"ð­¬";i:12659;s:4:"ð­­";i:12660;s:4:"ð­®";i:12661;s:4:"ð­¯";i:12662;s:4:"ð­°";i:12663;s:4:"ð­±";i:12664;s:4:"ð­²";i:12665;s:4:"ðŽ€";i:12666;s:4:"ðŽ";i:12667;s:4:"ðŽ‚";i:12668;s:4:"ðŽƒ";i:12669;s:4:"ðŽ„";i:12670;s:4:"ðŽ…";i:12671;s:4:"ðŽ†";i:12672;s:4:"ðŽ‡";i:12673;s:4:"ðŽˆ";i:12674;s:4:"ðŽ‰";i:12675;s:4:"ðŽŠ";i:12676;s:4:"ðŽ‹";i:12677;s:4:"ðŽŒ";i:12678;s:4:"ðŽ";i:12679;s:4:"ðŽŽ";i:12680;s:4:"ðŽ";i:12681;s:4:"ðŽ";i:12682;s:4:"ðŽ‘";i:12683;s:4:"ðŽ’";i:12684;s:4:"ðŽ“";i:12685;s:4:"ðŽ”";i:12686;s:4:"ðŽ•";i:12687;s:4:"ðŽ–";i:12688;s:4:"ðŽ—";i:12689;s:4:"ðŽ˜";i:12690;s:4:"ðŽ™";i:12691;s:4:"ðŽš";i:12692;s:4:"ðŽ›";i:12693;s:4:"ðŽœ";i:12694;s:4:"ðŽ";i:12695;s:4:"ðŽ ";i:12696;s:4:"ðŽ¡";i:12697;s:4:"ðŽ¢";i:12698;s:4:"ðŽ£";i:12699;s:4:"ðŽ¤";i:12700;s:4:"ðŽ¥";i:12701;s:4:"ðŽ¦";i:12702;s:4:"ðŽ§";i:12703;s:4:"ðŽ¨";i:12704;s:4:"ðŽ©";i:12705;s:4:"ðŽª";i:12706;s:4:"ðŽ«";i:12707;s:4:"ðŽ¬";i:12708;s:4:"ðŽ­";i:12709;s:4:"ðŽ®";i:12710;s:4:"ðŽ¯";i:12711;s:4:"ðŽ°";i:12712;s:4:"ðŽ±";i:12713;s:4:"ðŽ²";i:12714;s:4:"ðŽ³";i:12715;s:4:"ðŽ´";i:12716;s:4:"ðŽµ";i:12717;s:4:"ðŽ¶";i:12718;s:4:"ðŽ·";i:12719;s:4:"ðŽ¸";i:12720;s:4:"ðŽ¹";i:12721;s:4:"ðŽº";i:12722;s:4:"ðŽ»";i:12723;s:4:"ðŽ¼";i:12724;s:4:"ðŽ½";i:12725;s:4:"ðŽ¾";i:12726;s:4:"ðŽ¿";i:12727;s:4:"ð€";i:12728;s:4:"ð";i:12729;s:4:"ð‚";i:12730;s:4:"ðƒ";i:12731;s:4:"ðˆ";i:12732;s:4:"ð‰";i:12733;s:4:"ðŠ";i:12734;s:4:"ð‹";i:12735;s:4:"ðŒ";i:12736;s:4:"ð";i:12737;s:4:"ðŽ";i:12738;s:4:"ð";i:12739;s:4:"ð’€€";i:12740;s:4:"ð’€";i:12741;s:4:"𒀂";i:12742;s:4:"𒀃";i:12743;s:4:"𒀄";i:12744;s:4:"ð’€…";i:12745;s:4:"𒀆";i:12746;s:4:"𒀇";i:12747;s:4:"𒀈";i:12748;s:4:"𒀉";i:12749;s:4:"𒀊";i:12750;s:4:"𒀋";i:12751;s:4:"𒀌";i:12752;s:4:"ð’€";i:12753;s:4:"𒀎";i:12754;s:4:"ð’€";i:12755;s:4:"ð’€";i:12756;s:4:"𒀑";i:12757;s:4:"ð’€’";i:12758;s:4:"𒀓";i:12759;s:4:"ð’€”";i:12760;s:4:"𒀕";i:12761;s:4:"ð’€–";i:12762;s:4:"ð’€—";i:12763;s:4:"𒀘";i:12764;s:4:"ð’€™";i:12765;s:4:"𒀚";i:12766;s:4:"ð’€›";i:12767;s:4:"𒀜";i:12768;s:4:"ð’€";i:12769;s:4:"𒀞";i:12770;s:4:"𒀟";i:12771;s:4:"ð’€ ";i:12772;s:4:"𒀡";i:12773;s:4:"ð’€¢";i:12774;s:4:"ð’€£";i:12775;s:4:"𒀤";i:12776;s:4:"ð’€¥";i:12777;s:4:"𒀦";i:12778;s:4:"𒀧";i:12779;s:4:"𒀨";i:12780;s:4:"𒀩";i:12781;s:4:"𒀪";i:12782;s:4:"𒀫";i:12783;s:4:"𒀬";i:12784;s:4:"ð’€­";i:12785;s:4:"ð’€®";i:12786;s:4:"𒀯";i:12787;s:4:"ð’€°";i:12788;s:4:"ð’€±";i:12789;s:4:"ð’€²";i:12790;s:4:"ð’€³";i:12791;s:4:"ð’€´";i:12792;s:4:"ð’€µ";i:12793;s:4:"𒀶";i:12794;s:4:"ð’€·";i:12795;s:4:"𒀸";i:12796;s:4:"ð’€¹";i:12797;s:4:"𒀺";i:12798;s:4:"ð’€»";i:12799;s:4:"ð’€¼";i:12800;s:4:"ð’€½";i:12801;s:4:"ð’€¾";i:12802;s:4:"𒀿";i:12803;s:4:"ð’€";i:12804;s:4:"ð’";i:12805;s:4:"ð’‚";i:12806;s:4:"ð’ƒ";i:12807;s:4:"ð’„";i:12808;s:4:"ð’…";i:12809;s:4:"ð’†";i:12810;s:4:"ð’‡";i:12811;s:4:"ð’ˆ";i:12812;s:4:"ð’‰";i:12813;s:4:"ð’Š";i:12814;s:4:"ð’‹";i:12815;s:4:"ð’Œ";i:12816;s:4:"ð’";i:12817;s:4:"ð’Ž";i:12818;s:4:"ð’";i:12819;s:4:"ð’";i:12820;s:4:"ð’‘";i:12821;s:4:"ð’’";i:12822;s:4:"ð’“";i:12823;s:4:"ð’”";i:12824;s:4:"ð’•";i:12825;s:4:"ð’–";i:12826;s:4:"ð’—";i:12827;s:4:"ð’˜";i:12828;s:4:"ð’™";i:12829;s:4:"ð’š";i:12830;s:4:"ð’›";i:12831;s:4:"ð’œ";i:12832;s:4:"ð’";i:12833;s:4:"ð’ž";i:12834;s:4:"ð’Ÿ";i:12835;s:4:"ð’ ";i:12836;s:4:"ð’¡";i:12837;s:4:"ð’¢";i:12838;s:4:"ð’£";i:12839;s:4:"ð’¤";i:12840;s:4:"ð’¥";i:12841;s:4:"ð’¦";i:12842;s:4:"ð’§";i:12843;s:4:"ð’¨";i:12844;s:4:"ð’©";i:12845;s:4:"ð’ª";i:12846;s:4:"ð’«";i:12847;s:4:"ð’¬";i:12848;s:4:"ð’­";i:12849;s:4:"ð’®";i:12850;s:4:"ð’¯";i:12851;s:4:"ð’°";i:12852;s:4:"ð’±";i:12853;s:4:"ð’²";i:12854;s:4:"ð’³";i:12855;s:4:"ð’´";i:12856;s:4:"ð’µ";i:12857;s:4:"ð’¶";i:12858;s:4:"ð’·";i:12859;s:4:"ð’¸";i:12860;s:4:"ð’¹";i:12861;s:4:"ð’º";i:12862;s:4:"ð’»";i:12863;s:4:"ð’¼";i:12864;s:4:"ð’½";i:12865;s:4:"ð’¾";i:12866;s:4:"ð’¿";i:12867;s:4:"ð’‚€";i:12868;s:4:"ð’‚";i:12869;s:4:"ð’‚‚";i:12870;s:4:"𒂃";i:12871;s:4:"ð’‚„";i:12872;s:4:"ð’‚…";i:12873;s:4:"𒂆";i:12874;s:4:"𒂇";i:12875;s:4:"𒂈";i:12876;s:4:"𒂉";i:12877;s:4:"ð’‚Š";i:12878;s:4:"ð’‚‹";i:12879;s:4:"ð’‚Œ";i:12880;s:4:"ð’‚";i:12881;s:4:"ð’‚Ž";i:12882;s:4:"ð’‚";i:12883;s:4:"ð’‚";i:12884;s:4:"ð’‚‘";i:12885;s:4:"ð’‚’";i:12886;s:4:"ð’‚“";i:12887;s:4:"ð’‚”";i:12888;s:4:"ð’‚•";i:12889;s:4:"ð’‚–";i:12890;s:4:"ð’‚—";i:12891;s:4:"𒂘";i:12892;s:4:"ð’‚™";i:12893;s:4:"ð’‚š";i:12894;s:4:"ð’‚›";i:12895;s:4:"ð’‚œ";i:12896;s:4:"ð’‚";i:12897;s:4:"ð’‚ž";i:12898;s:4:"ð’‚Ÿ";i:12899;s:4:"ð’‚ ";i:12900;s:4:"ð’‚¡";i:12901;s:4:"ð’‚¢";i:12902;s:4:"ð’‚£";i:12903;s:4:"𒂤";i:12904;s:4:"ð’‚¥";i:12905;s:4:"𒂦";i:12906;s:4:"𒂧";i:12907;s:4:"𒂨";i:12908;s:4:"ð’‚©";i:12909;s:4:"𒂪";i:12910;s:4:"ð’‚«";i:12911;s:4:"𒂬";i:12912;s:4:"ð’‚­";i:12913;s:4:"ð’‚®";i:12914;s:4:"𒂯";i:12915;s:4:"ð’‚°";i:12916;s:4:"ð’‚±";i:12917;s:4:"ð’‚²";i:12918;s:4:"ð’‚³";i:12919;s:4:"ð’‚´";i:12920;s:4:"ð’‚µ";i:12921;s:4:"𒂶";i:12922;s:4:"ð’‚·";i:12923;s:4:"𒂸";i:12924;s:4:"ð’‚¹";i:12925;s:4:"𒂺";i:12926;s:4:"ð’‚»";i:12927;s:4:"ð’‚¼";i:12928;s:4:"ð’‚½";i:12929;s:4:"ð’‚¾";i:12930;s:4:"ð’‚¿";i:12931;s:4:"𒃀";i:12932;s:4:"ð’ƒ";i:12933;s:4:"𒃂";i:12934;s:4:"𒃃";i:12935;s:4:"𒃄";i:12936;s:4:"ð’ƒ…";i:12937;s:4:"𒃆";i:12938;s:4:"𒃇";i:12939;s:4:"𒃈";i:12940;s:4:"𒃉";i:12941;s:4:"𒃊";i:12942;s:4:"𒃋";i:12943;s:4:"𒃌";i:12944;s:4:"ð’ƒ";i:12945;s:4:"𒃎";i:12946;s:4:"ð’ƒ";i:12947;s:4:"ð’ƒ";i:12948;s:4:"𒃑";i:12949;s:4:"ð’ƒ’";i:12950;s:4:"𒃓";i:12951;s:4:"𒃔";i:12952;s:4:"𒃕";i:12953;s:4:"ð’ƒ–";i:12954;s:4:"ð’ƒ—";i:12955;s:4:"𒃘";i:12956;s:4:"𒃙";i:12957;s:4:"𒃚";i:12958;s:4:"𒃛";i:12959;s:4:"𒃜";i:12960;s:4:"ð’ƒ";i:12961;s:4:"𒃞";i:12962;s:4:"𒃟";i:12963;s:4:"ð’ƒ ";i:12964;s:4:"𒃡";i:12965;s:4:"𒃢";i:12966;s:4:"𒃣";i:12967;s:4:"𒃤";i:12968;s:4:"𒃥";i:12969;s:4:"𒃦";i:12970;s:4:"𒃧";i:12971;s:4:"𒃨";i:12972;s:4:"𒃩";i:12973;s:4:"𒃪";i:12974;s:4:"𒃫";i:12975;s:4:"𒃬";i:12976;s:4:"ð’ƒ­";i:12977;s:4:"𒃮";i:12978;s:4:"𒃯";i:12979;s:4:"ð’ƒ°";i:12980;s:4:"𒃱";i:12981;s:4:"𒃲";i:12982;s:4:"𒃳";i:12983;s:4:"ð’ƒ´";i:12984;s:4:"𒃵";i:12985;s:4:"𒃶";i:12986;s:4:"ð’ƒ·";i:12987;s:4:"𒃸";i:12988;s:4:"𒃹";i:12989;s:4:"𒃺";i:12990;s:4:"𒃻";i:12991;s:4:"𒃼";i:12992;s:4:"𒃽";i:12993;s:4:"𒃾";i:12994;s:4:"𒃿";i:12995;s:4:"ð’„€";i:12996;s:4:"ð’„";i:12997;s:4:"ð’„‚";i:12998;s:4:"𒄃";i:12999;s:4:"ð’„„";i:13000;s:4:"ð’„…";i:13001;s:4:"𒄆";i:13002;s:4:"𒄇";i:13003;s:4:"𒄈";i:13004;s:4:"𒄉";i:13005;s:4:"ð’„Š";i:13006;s:4:"ð’„‹";i:13007;s:4:"ð’„Œ";i:13008;s:4:"ð’„";i:13009;s:4:"ð’„Ž";i:13010;s:4:"ð’„";i:13011;s:4:"ð’„";i:13012;s:4:"ð’„‘";i:13013;s:4:"ð’„’";i:13014;s:4:"ð’„“";i:13015;s:4:"ð’„”";i:13016;s:4:"ð’„•";i:13017;s:4:"ð’„–";i:13018;s:4:"ð’„—";i:13019;s:4:"𒄘";i:13020;s:4:"ð’„™";i:13021;s:4:"ð’„š";i:13022;s:4:"ð’„›";i:13023;s:4:"ð’„œ";i:13024;s:4:"ð’„";i:13025;s:4:"ð’„ž";i:13026;s:4:"ð’„Ÿ";i:13027;s:4:"ð’„ ";i:13028;s:4:"ð’„¡";i:13029;s:4:"ð’„¢";i:13030;s:4:"ð’„£";i:13031;s:4:"𒄤";i:13032;s:4:"ð’„¥";i:13033;s:4:"𒄦";i:13034;s:4:"𒄧";i:13035;s:4:"𒄨";i:13036;s:4:"ð’„©";i:13037;s:4:"𒄪";i:13038;s:4:"ð’„«";i:13039;s:4:"𒄬";i:13040;s:4:"ð’„­";i:13041;s:4:"ð’„®";i:13042;s:4:"𒄯";i:13043;s:4:"ð’„°";i:13044;s:4:"ð’„±";i:13045;s:4:"ð’„²";i:13046;s:4:"ð’„³";i:13047;s:4:"ð’„´";i:13048;s:4:"ð’„µ";i:13049;s:4:"𒄶";i:13050;s:4:"ð’„·";i:13051;s:4:"𒄸";i:13052;s:4:"ð’„¹";i:13053;s:4:"𒄺";i:13054;s:4:"ð’„»";i:13055;s:4:"ð’„¼";i:13056;s:4:"ð’„½";i:13057;s:4:"ð’„¾";i:13058;s:4:"ð’„¿";i:13059;s:4:"ð’…€";i:13060;s:4:"ð’…";i:13061;s:4:"ð’…‚";i:13062;s:4:"ð’…ƒ";i:13063;s:4:"ð’…„";i:13064;s:4:"ð’……";i:13065;s:4:"ð’…†";i:13066;s:4:"ð’…‡";i:13067;s:4:"ð’…ˆ";i:13068;s:4:"ð’…‰";i:13069;s:4:"ð’…Š";i:13070;s:4:"ð’…‹";i:13071;s:4:"ð’…Œ";i:13072;s:4:"ð’…";i:13073;s:4:"ð’…Ž";i:13074;s:4:"ð’…";i:13075;s:4:"ð’…";i:13076;s:4:"ð’…‘";i:13077;s:4:"ð’…’";i:13078;s:4:"ð’…“";i:13079;s:4:"ð’…”";i:13080;s:4:"ð’…•";i:13081;s:4:"ð’…–";i:13082;s:4:"ð’…—";i:13083;s:4:"ð’…˜";i:13084;s:4:"ð’…™";i:13085;s:4:"ð’…š";i:13086;s:4:"ð’…›";i:13087;s:4:"ð’…œ";i:13088;s:4:"ð’…";i:13089;s:4:"ð’…ž";i:13090;s:4:"ð’…Ÿ";i:13091;s:4:"ð’… ";i:13092;s:4:"ð’…¡";i:13093;s:4:"ð’…¢";i:13094;s:4:"ð’…£";i:13095;s:4:"ð’…¤";i:13096;s:4:"ð’…¥";i:13097;s:4:"ð’…¦";i:13098;s:4:"ð’…§";i:13099;s:4:"ð’…¨";i:13100;s:4:"ð’…©";i:13101;s:4:"ð’…ª";i:13102;s:4:"ð’…«";i:13103;s:4:"ð’…¬";i:13104;s:4:"ð’…­";i:13105;s:4:"ð’…®";i:13106;s:4:"ð’…¯";i:13107;s:4:"ð’…°";i:13108;s:4:"ð’…±";i:13109;s:4:"ð’…²";i:13110;s:4:"ð’…³";i:13111;s:4:"ð’…´";i:13112;s:4:"ð’…µ";i:13113;s:4:"ð’…¶";i:13114;s:4:"ð’…·";i:13115;s:4:"ð’…¸";i:13116;s:4:"ð’…¹";i:13117;s:4:"ð’…º";i:13118;s:4:"ð’…»";i:13119;s:4:"ð’…¼";i:13120;s:4:"ð’…½";i:13121;s:4:"ð’…¾";i:13122;s:4:"ð’…¿";i:13123;s:4:"𒆀";i:13124;s:4:"ð’†";i:13125;s:4:"𒆂";i:13126;s:4:"𒆃";i:13127;s:4:"𒆄";i:13128;s:4:"ð’†…";i:13129;s:4:"𒆆";i:13130;s:4:"𒆇";i:13131;s:4:"𒆈";i:13132;s:4:"𒆉";i:13133;s:4:"𒆊";i:13134;s:4:"𒆋";i:13135;s:4:"𒆌";i:13136;s:4:"ð’†";i:13137;s:4:"𒆎";i:13138;s:4:"ð’†";i:13139;s:4:"ð’†";i:13140;s:4:"𒆑";i:13141;s:4:"ð’†’";i:13142;s:4:"𒆓";i:13143;s:4:"𒆔";i:13144;s:4:"𒆕";i:13145;s:4:"ð’†–";i:13146;s:4:"ð’†—";i:13147;s:4:"𒆘";i:13148;s:4:"𒆙";i:13149;s:4:"𒆚";i:13150;s:4:"𒆛";i:13151;s:4:"𒆜";i:13152;s:4:"ð’†";i:13153;s:4:"𒆞";i:13154;s:4:"𒆟";i:13155;s:4:"ð’† ";i:13156;s:4:"𒆡";i:13157;s:4:"𒆢";i:13158;s:4:"𒆣";i:13159;s:4:"𒆤";i:13160;s:4:"𒆥";i:13161;s:4:"𒆦";i:13162;s:4:"𒆧";i:13163;s:4:"𒆨";i:13164;s:4:"𒆩";i:13165;s:4:"𒆪";i:13166;s:4:"𒆫";i:13167;s:4:"𒆬";i:13168;s:4:"ð’†­";i:13169;s:4:"𒆮";i:13170;s:4:"𒆯";i:13171;s:4:"ð’†°";i:13172;s:4:"𒆱";i:13173;s:4:"𒆲";i:13174;s:4:"𒆳";i:13175;s:4:"ð’†´";i:13176;s:4:"𒆵";i:13177;s:4:"𒆶";i:13178;s:4:"ð’†·";i:13179;s:4:"𒆸";i:13180;s:4:"𒆹";i:13181;s:4:"𒆺";i:13182;s:4:"𒆻";i:13183;s:4:"𒆼";i:13184;s:4:"𒆽";i:13185;s:4:"𒆾";i:13186;s:4:"𒆿";i:13187;s:4:"𒇀";i:13188;s:4:"ð’‡";i:13189;s:4:"𒇂";i:13190;s:4:"𒇃";i:13191;s:4:"𒇄";i:13192;s:4:"ð’‡…";i:13193;s:4:"𒇆";i:13194;s:4:"𒇇";i:13195;s:4:"𒇈";i:13196;s:4:"𒇉";i:13197;s:4:"𒇊";i:13198;s:4:"𒇋";i:13199;s:4:"𒇌";i:13200;s:4:"ð’‡";i:13201;s:4:"𒇎";i:13202;s:4:"ð’‡";i:13203;s:4:"ð’‡";i:13204;s:4:"𒇑";i:13205;s:4:"ð’‡’";i:13206;s:4:"𒇓";i:13207;s:4:"𒇔";i:13208;s:4:"𒇕";i:13209;s:4:"ð’‡–";i:13210;s:4:"ð’‡—";i:13211;s:4:"𒇘";i:13212;s:4:"𒇙";i:13213;s:4:"𒇚";i:13214;s:4:"𒇛";i:13215;s:4:"𒇜";i:13216;s:4:"ð’‡";i:13217;s:4:"𒇞";i:13218;s:4:"𒇟";i:13219;s:4:"ð’‡ ";i:13220;s:4:"𒇡";i:13221;s:4:"𒇢";i:13222;s:4:"𒇣";i:13223;s:4:"𒇤";i:13224;s:4:"𒇥";i:13225;s:4:"𒇦";i:13226;s:4:"𒇧";i:13227;s:4:"𒇨";i:13228;s:4:"𒇩";i:13229;s:4:"𒇪";i:13230;s:4:"𒇫";i:13231;s:4:"𒇬";i:13232;s:4:"ð’‡­";i:13233;s:4:"𒇮";i:13234;s:4:"𒇯";i:13235;s:4:"ð’‡°";i:13236;s:4:"𒇱";i:13237;s:4:"𒇲";i:13238;s:4:"𒇳";i:13239;s:4:"ð’‡´";i:13240;s:4:"𒇵";i:13241;s:4:"𒇶";i:13242;s:4:"ð’‡·";i:13243;s:4:"𒇸";i:13244;s:4:"𒇹";i:13245;s:4:"𒇺";i:13246;s:4:"𒇻";i:13247;s:4:"𒇼";i:13248;s:4:"𒇽";i:13249;s:4:"𒇾";i:13250;s:4:"𒇿";i:13251;s:4:"𒈀";i:13252;s:4:"ð’ˆ";i:13253;s:4:"𒈂";i:13254;s:4:"𒈃";i:13255;s:4:"𒈄";i:13256;s:4:"ð’ˆ…";i:13257;s:4:"𒈆";i:13258;s:4:"𒈇";i:13259;s:4:"𒈈";i:13260;s:4:"𒈉";i:13261;s:4:"𒈊";i:13262;s:4:"𒈋";i:13263;s:4:"𒈌";i:13264;s:4:"ð’ˆ";i:13265;s:4:"𒈎";i:13266;s:4:"ð’ˆ";i:13267;s:4:"ð’ˆ";i:13268;s:4:"𒈑";i:13269;s:4:"ð’ˆ’";i:13270;s:4:"𒈓";i:13271;s:4:"𒈔";i:13272;s:4:"𒈕";i:13273;s:4:"ð’ˆ–";i:13274;s:4:"ð’ˆ—";i:13275;s:4:"𒈘";i:13276;s:4:"𒈙";i:13277;s:4:"𒈚";i:13278;s:4:"𒈛";i:13279;s:4:"𒈜";i:13280;s:4:"ð’ˆ";i:13281;s:4:"𒈞";i:13282;s:4:"𒈟";i:13283;s:4:"ð’ˆ ";i:13284;s:4:"𒈡";i:13285;s:4:"𒈢";i:13286;s:4:"𒈣";i:13287;s:4:"𒈤";i:13288;s:4:"𒈥";i:13289;s:4:"𒈦";i:13290;s:4:"𒈧";i:13291;s:4:"𒈨";i:13292;s:4:"𒈩";i:13293;s:4:"𒈪";i:13294;s:4:"𒈫";i:13295;s:4:"𒈬";i:13296;s:4:"ð’ˆ­";i:13297;s:4:"𒈮";i:13298;s:4:"𒈯";i:13299;s:4:"ð’ˆ°";i:13300;s:4:"𒈱";i:13301;s:4:"𒈲";i:13302;s:4:"𒈳";i:13303;s:4:"ð’ˆ´";i:13304;s:4:"𒈵";i:13305;s:4:"𒈶";i:13306;s:4:"ð’ˆ·";i:13307;s:4:"𒈸";i:13308;s:4:"𒈹";i:13309;s:4:"𒈺";i:13310;s:4:"𒈻";i:13311;s:4:"𒈼";i:13312;s:4:"𒈽";i:13313;s:4:"𒈾";i:13314;s:4:"𒈿";i:13315;s:4:"𒉀";i:13316;s:4:"ð’‰";i:13317;s:4:"𒉂";i:13318;s:4:"𒉃";i:13319;s:4:"𒉄";i:13320;s:4:"ð’‰…";i:13321;s:4:"𒉆";i:13322;s:4:"𒉇";i:13323;s:4:"𒉈";i:13324;s:4:"𒉉";i:13325;s:4:"𒉊";i:13326;s:4:"𒉋";i:13327;s:4:"𒉌";i:13328;s:4:"ð’‰";i:13329;s:4:"𒉎";i:13330;s:4:"ð’‰";i:13331;s:4:"ð’‰";i:13332;s:4:"𒉑";i:13333;s:4:"ð’‰’";i:13334;s:4:"𒉓";i:13335;s:4:"𒉔";i:13336;s:4:"𒉕";i:13337;s:4:"ð’‰–";i:13338;s:4:"ð’‰—";i:13339;s:4:"𒉘";i:13340;s:4:"𒉙";i:13341;s:4:"𒉚";i:13342;s:4:"𒉛";i:13343;s:4:"𒉜";i:13344;s:4:"ð’‰";i:13345;s:4:"𒉞";i:13346;s:4:"𒉟";i:13347;s:4:"ð’‰ ";i:13348;s:4:"𒉡";i:13349;s:4:"𒉢";i:13350;s:4:"𒉣";i:13351;s:4:"𒉤";i:13352;s:4:"𒉥";i:13353;s:4:"𒉦";i:13354;s:4:"𒉧";i:13355;s:4:"𒉨";i:13356;s:4:"𒉩";i:13357;s:4:"𒉪";i:13358;s:4:"𒉫";i:13359;s:4:"𒉬";i:13360;s:4:"ð’‰­";i:13361;s:4:"𒉮";i:13362;s:4:"𒉯";i:13363;s:4:"ð’‰°";i:13364;s:4:"𒉱";i:13365;s:4:"𒉲";i:13366;s:4:"𒉳";i:13367;s:4:"ð’‰´";i:13368;s:4:"𒉵";i:13369;s:4:"𒉶";i:13370;s:4:"ð’‰·";i:13371;s:4:"𒉸";i:13372;s:4:"𒉹";i:13373;s:4:"𒉺";i:13374;s:4:"𒉻";i:13375;s:4:"𒉼";i:13376;s:4:"𒉽";i:13377;s:4:"𒉾";i:13378;s:4:"𒉿";i:13379;s:4:"ð’Š€";i:13380;s:4:"ð’Š";i:13381;s:4:"ð’Š‚";i:13382;s:4:"𒊃";i:13383;s:4:"ð’Š„";i:13384;s:4:"ð’Š…";i:13385;s:4:"𒊆";i:13386;s:4:"𒊇";i:13387;s:4:"𒊈";i:13388;s:4:"𒊉";i:13389;s:4:"ð’ŠŠ";i:13390;s:4:"ð’Š‹";i:13391;s:4:"ð’ŠŒ";i:13392;s:4:"ð’Š";i:13393;s:4:"ð’ŠŽ";i:13394;s:4:"ð’Š";i:13395;s:4:"ð’Š";i:13396;s:4:"ð’Š‘";i:13397;s:4:"ð’Š’";i:13398;s:4:"ð’Š“";i:13399;s:4:"ð’Š”";i:13400;s:4:"ð’Š•";i:13401;s:4:"ð’Š–";i:13402;s:4:"ð’Š—";i:13403;s:4:"𒊘";i:13404;s:4:"ð’Š™";i:13405;s:4:"ð’Šš";i:13406;s:4:"ð’Š›";i:13407;s:4:"ð’Šœ";i:13408;s:4:"ð’Š";i:13409;s:4:"ð’Šž";i:13410;s:4:"ð’ŠŸ";i:13411;s:4:"ð’Š ";i:13412;s:4:"ð’Š¡";i:13413;s:4:"ð’Š¢";i:13414;s:4:"ð’Š£";i:13415;s:4:"𒊤";i:13416;s:4:"ð’Š¥";i:13417;s:4:"𒊦";i:13418;s:4:"𒊧";i:13419;s:4:"𒊨";i:13420;s:4:"ð’Š©";i:13421;s:4:"𒊪";i:13422;s:4:"ð’Š«";i:13423;s:4:"𒊬";i:13424;s:4:"ð’Š­";i:13425;s:4:"ð’Š®";i:13426;s:4:"𒊯";i:13427;s:4:"ð’Š°";i:13428;s:4:"𒊱";i:13429;s:4:"𒊲";i:13430;s:4:"𒊳";i:13431;s:4:"ð’Š´";i:13432;s:4:"𒊵";i:13433;s:4:"𒊶";i:13434;s:4:"ð’Š·";i:13435;s:4:"𒊸";i:13436;s:4:"𒊹";i:13437;s:4:"𒊺";i:13438;s:4:"ð’Š»";i:13439;s:4:"𒊼";i:13440;s:4:"𒊽";i:13441;s:4:"𒊾";i:13442;s:4:"ð’Š¿";i:13443;s:4:"ð’‹€";i:13444;s:4:"ð’‹";i:13445;s:4:"ð’‹‚";i:13446;s:4:"𒋃";i:13447;s:4:"ð’‹„";i:13448;s:4:"ð’‹…";i:13449;s:4:"𒋆";i:13450;s:4:"𒋇";i:13451;s:4:"𒋈";i:13452;s:4:"𒋉";i:13453;s:4:"ð’‹Š";i:13454;s:4:"ð’‹‹";i:13455;s:4:"ð’‹Œ";i:13456;s:4:"ð’‹";i:13457;s:4:"ð’‹Ž";i:13458;s:4:"ð’‹";i:13459;s:4:"ð’‹";i:13460;s:4:"ð’‹‘";i:13461;s:4:"ð’‹’";i:13462;s:4:"ð’‹“";i:13463;s:4:"ð’‹”";i:13464;s:4:"ð’‹•";i:13465;s:4:"ð’‹–";i:13466;s:4:"ð’‹—";i:13467;s:4:"𒋘";i:13468;s:4:"ð’‹™";i:13469;s:4:"ð’‹š";i:13470;s:4:"ð’‹›";i:13471;s:4:"ð’‹œ";i:13472;s:4:"ð’‹";i:13473;s:4:"ð’‹ž";i:13474;s:4:"ð’‹Ÿ";i:13475;s:4:"ð’‹ ";i:13476;s:4:"ð’‹¡";i:13477;s:4:"ð’‹¢";i:13478;s:4:"ð’‹£";i:13479;s:4:"𒋤";i:13480;s:4:"ð’‹¥";i:13481;s:4:"𒋦";i:13482;s:4:"𒋧";i:13483;s:4:"𒋨";i:13484;s:4:"ð’‹©";i:13485;s:4:"𒋪";i:13486;s:4:"ð’‹«";i:13487;s:4:"𒋬";i:13488;s:4:"ð’‹­";i:13489;s:4:"ð’‹®";i:13490;s:4:"𒋯";i:13491;s:4:"ð’‹°";i:13492;s:4:"ð’‹±";i:13493;s:4:"ð’‹²";i:13494;s:4:"ð’‹³";i:13495;s:4:"ð’‹´";i:13496;s:4:"ð’‹µ";i:13497;s:4:"𒋶";i:13498;s:4:"ð’‹·";i:13499;s:4:"𒋸";i:13500;s:4:"ð’‹¹";i:13501;s:4:"𒋺";i:13502;s:4:"ð’‹»";i:13503;s:4:"ð’‹¼";i:13504;s:4:"ð’‹½";i:13505;s:4:"ð’‹¾";i:13506;s:4:"ð’‹¿";i:13507;s:4:"𒌀";i:13508;s:4:"ð’Œ";i:13509;s:4:"𒌂";i:13510;s:4:"𒌃";i:13511;s:4:"𒌄";i:13512;s:4:"𒌅";i:13513;s:4:"𒌆";i:13514;s:4:"𒌇";i:13515;s:4:"𒌈";i:13516;s:4:"𒌉";i:13517;s:4:"𒌊";i:13518;s:4:"𒌋";i:13519;s:4:"𒌌";i:13520;s:4:"ð’Œ";i:13521;s:4:"𒌎";i:13522;s:4:"ð’Œ";i:13523;s:4:"ð’Œ";i:13524;s:4:"𒌑";i:13525;s:4:"𒌒";i:13526;s:4:"𒌓";i:13527;s:4:"𒌔";i:13528;s:4:"𒌕";i:13529;s:4:"𒌖";i:13530;s:4:"𒌗";i:13531;s:4:"𒌘";i:13532;s:4:"𒌙";i:13533;s:4:"𒌚";i:13534;s:4:"𒌛";i:13535;s:4:"𒌜";i:13536;s:4:"ð’Œ";i:13537;s:4:"𒌞";i:13538;s:4:"𒌟";i:13539;s:4:"𒌠";i:13540;s:4:"𒌡";i:13541;s:4:"𒌢";i:13542;s:4:"𒌣";i:13543;s:4:"𒌤";i:13544;s:4:"𒌥";i:13545;s:4:"𒌦";i:13546;s:4:"𒌧";i:13547;s:4:"𒌨";i:13548;s:4:"𒌩";i:13549;s:4:"𒌪";i:13550;s:4:"𒌫";i:13551;s:4:"𒌬";i:13552;s:4:"𒌭";i:13553;s:4:"𒌮";i:13554;s:4:"𒌯";i:13555;s:4:"𒌰";i:13556;s:4:"𒌱";i:13557;s:4:"𒌲";i:13558;s:4:"𒌳";i:13559;s:4:"𒌴";i:13560;s:4:"𒌵";i:13561;s:4:"𒌶";i:13562;s:4:"𒌷";i:13563;s:4:"𒌸";i:13564;s:4:"𒌹";i:13565;s:4:"𒌺";i:13566;s:4:"𒌻";i:13567;s:4:"𒌼";i:13568;s:4:"𒌽";i:13569;s:4:"𒌾";i:13570;s:4:"𒌿";i:13571;s:4:"ð’€";i:13572;s:4:"ð’";i:13573;s:4:"ð’‚";i:13574;s:4:"ð’ƒ";i:13575;s:4:"ð’„";i:13576;s:4:"ð’…";i:13577;s:4:"ð’†";i:13578;s:4:"ð’‡";i:13579;s:4:"ð’ˆ";i:13580;s:4:"ð’‰";i:13581;s:4:"ð’Š";i:13582;s:4:"ð’‹";i:13583;s:4:"ð’Œ";i:13584;s:4:"ð’";i:13585;s:4:"ð’Ž";i:13586;s:4:"ð’";i:13587;s:4:"ð’";i:13588;s:4:"ð’‘";i:13589;s:4:"ð’’";i:13590;s:4:"ð’“";i:13591;s:4:"ð’”";i:13592;s:4:"ð’•";i:13593;s:4:"ð’–";i:13594;s:4:"ð’—";i:13595;s:4:"ð’˜";i:13596;s:4:"ð’™";i:13597;s:4:"ð’š";i:13598;s:4:"ð’›";i:13599;s:4:"ð’œ";i:13600;s:4:"ð’";i:13601;s:4:"ð’ž";i:13602;s:4:"ð’Ÿ";i:13603;s:4:"ð’ ";i:13604;s:4:"ð’¡";i:13605;s:4:"ð’¢";i:13606;s:4:"ð’£";i:13607;s:4:"ð’¤";i:13608;s:4:"ð’¥";i:13609;s:4:"ð’¦";i:13610;s:4:"ð’§";i:13611;s:4:"ð’¨";i:13612;s:4:"ð’©";i:13613;s:4:"ð’ª";i:13614;s:4:"ð’«";i:13615;s:4:"ð’¬";i:13616;s:4:"ð’­";i:13617;s:4:"ð’®";i:13618;s:4:"ð“€€";i:13619;s:4:"ð“€";i:13620;s:4:"𓀂";i:13621;s:4:"𓀃";i:13622;s:4:"𓀄";i:13623;s:4:"ð“€…";i:13624;s:4:"𓀆";i:13625;s:4:"𓀇";i:13626;s:4:"𓀈";i:13627;s:4:"𓀉";i:13628;s:4:"𓀊";i:13629;s:4:"𓀋";i:13630;s:4:"𓀌";i:13631;s:4:"ð“€";i:13632;s:4:"𓀎";i:13633;s:4:"ð“€";i:13634;s:4:"ð“€";i:13635;s:4:"𓀑";i:13636;s:4:"ð“€’";i:13637;s:4:"𓀓";i:13638;s:4:"ð“€”";i:13639;s:4:"𓀕";i:13640;s:4:"ð“€–";i:13641;s:4:"ð“€—";i:13642;s:4:"𓀘";i:13643;s:4:"ð“€™";i:13644;s:4:"𓀚";i:13645;s:4:"ð“€›";i:13646;s:4:"𓀜";i:13647;s:4:"ð“€";i:13648;s:4:"𓀞";i:13649;s:4:"𓀟";i:13650;s:4:"ð“€ ";i:13651;s:4:"𓀡";i:13652;s:4:"ð“€¢";i:13653;s:4:"ð“€£";i:13654;s:4:"𓀤";i:13655;s:4:"ð“€¥";i:13656;s:4:"𓀦";i:13657;s:4:"𓀧";i:13658;s:4:"𓀨";i:13659;s:4:"𓀩";i:13660;s:4:"𓀪";i:13661;s:4:"𓀫";i:13662;s:4:"𓀬";i:13663;s:4:"ð“€­";i:13664;s:4:"ð“€®";i:13665;s:4:"𓀯";i:13666;s:4:"ð“€°";i:13667;s:4:"ð“€±";i:13668;s:4:"ð“€²";i:13669;s:4:"ð“€³";i:13670;s:4:"ð“€´";i:13671;s:4:"ð“€µ";i:13672;s:4:"𓀶";i:13673;s:4:"ð“€·";i:13674;s:4:"𓀸";i:13675;s:4:"ð“€¹";i:13676;s:4:"𓀺";i:13677;s:4:"ð“€»";i:13678;s:4:"ð“€¼";i:13679;s:4:"ð“€½";i:13680;s:4:"ð“€¾";i:13681;s:4:"𓀿";i:13682;s:4:"ð“€";i:13683;s:4:"ð“";i:13684;s:4:"ð“‚";i:13685;s:4:"ð“ƒ";i:13686;s:4:"ð“„";i:13687;s:4:"ð“…";i:13688;s:4:"ð“†";i:13689;s:4:"ð“‡";i:13690;s:4:"ð“ˆ";i:13691;s:4:"ð“‰";i:13692;s:4:"ð“Š";i:13693;s:4:"ð“‹";i:13694;s:4:"ð“Œ";i:13695;s:4:"ð“";i:13696;s:4:"ð“Ž";i:13697;s:4:"ð“";i:13698;s:4:"ð“";i:13699;s:4:"ð“‘";i:13700;s:4:"ð“’";i:13701;s:4:"ð““";i:13702;s:4:"ð“”";i:13703;s:4:"ð“•";i:13704;s:4:"ð“–";i:13705;s:4:"ð“—";i:13706;s:4:"ð“˜";i:13707;s:4:"ð“™";i:13708;s:4:"ð“š";i:13709;s:4:"ð“›";i:13710;s:4:"ð“œ";i:13711;s:4:"ð“";i:13712;s:4:"ð“ž";i:13713;s:4:"ð“Ÿ";i:13714;s:4:"ð“ ";i:13715;s:4:"ð“¡";i:13716;s:4:"ð“¢";i:13717;s:4:"ð“£";i:13718;s:4:"ð“¤";i:13719;s:4:"ð“¥";i:13720;s:4:"ð“¦";i:13721;s:4:"ð“§";i:13722;s:4:"ð“¨";i:13723;s:4:"ð“©";i:13724;s:4:"ð“ª";i:13725;s:4:"ð“«";i:13726;s:4:"ð“¬";i:13727;s:4:"ð“­";i:13728;s:4:"ð“®";i:13729;s:4:"ð“¯";i:13730;s:4:"ð“°";i:13731;s:4:"ð“±";i:13732;s:4:"ð“²";i:13733;s:4:"ð“³";i:13734;s:4:"ð“´";i:13735;s:4:"ð“µ";i:13736;s:4:"ð“¶";i:13737;s:4:"ð“·";i:13738;s:4:"ð“¸";i:13739;s:4:"ð“¹";i:13740;s:4:"ð“º";i:13741;s:4:"ð“»";i:13742;s:4:"ð“¼";i:13743;s:4:"ð“½";i:13744;s:4:"ð“¾";i:13745;s:4:"ð“¿";i:13746;s:4:"ð“‚€";i:13747;s:4:"ð“‚";i:13748;s:4:"ð“‚‚";i:13749;s:4:"𓂃";i:13750;s:4:"ð“‚„";i:13751;s:4:"ð“‚…";i:13752;s:4:"𓂆";i:13753;s:4:"𓂇";i:13754;s:4:"𓂈";i:13755;s:4:"𓂉";i:13756;s:4:"ð“‚Š";i:13757;s:4:"ð“‚‹";i:13758;s:4:"ð“‚Œ";i:13759;s:4:"ð“‚";i:13760;s:4:"ð“‚Ž";i:13761;s:4:"ð“‚";i:13762;s:4:"ð“‚";i:13763;s:4:"ð“‚‘";i:13764;s:4:"ð“‚’";i:13765;s:4:"ð“‚“";i:13766;s:4:"ð“‚”";i:13767;s:4:"ð“‚•";i:13768;s:4:"ð“‚–";i:13769;s:4:"ð“‚—";i:13770;s:4:"𓂘";i:13771;s:4:"ð“‚™";i:13772;s:4:"ð“‚š";i:13773;s:4:"ð“‚›";i:13774;s:4:"ð“‚œ";i:13775;s:4:"ð“‚";i:13776;s:4:"ð“‚ž";i:13777;s:4:"ð“‚Ÿ";i:13778;s:4:"ð“‚ ";i:13779;s:4:"ð“‚¡";i:13780;s:4:"ð“‚¢";i:13781;s:4:"ð“‚£";i:13782;s:4:"𓂤";i:13783;s:4:"ð“‚¥";i:13784;s:4:"𓂦";i:13785;s:4:"𓂧";i:13786;s:4:"𓂨";i:13787;s:4:"ð“‚©";i:13788;s:4:"𓂪";i:13789;s:4:"ð“‚«";i:13790;s:4:"𓂬";i:13791;s:4:"ð“‚­";i:13792;s:4:"ð“‚®";i:13793;s:4:"𓂯";i:13794;s:4:"ð“‚°";i:13795;s:4:"ð“‚±";i:13796;s:4:"ð“‚²";i:13797;s:4:"ð“‚³";i:13798;s:4:"ð“‚´";i:13799;s:4:"ð“‚µ";i:13800;s:4:"𓂶";i:13801;s:4:"ð“‚·";i:13802;s:4:"𓂸";i:13803;s:4:"ð“‚¹";i:13804;s:4:"𓂺";i:13805;s:4:"ð“‚»";i:13806;s:4:"ð“‚¼";i:13807;s:4:"ð“‚½";i:13808;s:4:"ð“‚¾";i:13809;s:4:"ð“‚¿";i:13810;s:4:"𓃀";i:13811;s:4:"ð“ƒ";i:13812;s:4:"𓃂";i:13813;s:4:"𓃃";i:13814;s:4:"𓃄";i:13815;s:4:"𓃅";i:13816;s:4:"𓃆";i:13817;s:4:"𓃇";i:13818;s:4:"𓃈";i:13819;s:4:"𓃉";i:13820;s:4:"𓃊";i:13821;s:4:"𓃋";i:13822;s:4:"𓃌";i:13823;s:4:"ð“ƒ";i:13824;s:4:"𓃎";i:13825;s:4:"ð“ƒ";i:13826;s:4:"ð“ƒ";i:13827;s:4:"𓃑";i:13828;s:4:"𓃒";i:13829;s:4:"𓃓";i:13830;s:4:"𓃔";i:13831;s:4:"𓃕";i:13832;s:4:"𓃖";i:13833;s:4:"𓃗";i:13834;s:4:"𓃘";i:13835;s:4:"𓃙";i:13836;s:4:"𓃚";i:13837;s:4:"𓃛";i:13838;s:4:"𓃜";i:13839;s:4:"ð“ƒ";i:13840;s:4:"𓃞";i:13841;s:4:"𓃟";i:13842;s:4:"𓃠";i:13843;s:4:"𓃡";i:13844;s:4:"𓃢";i:13845;s:4:"𓃣";i:13846;s:4:"𓃤";i:13847;s:4:"𓃥";i:13848;s:4:"𓃦";i:13849;s:4:"𓃧";i:13850;s:4:"𓃨";i:13851;s:4:"𓃩";i:13852;s:4:"𓃪";i:13853;s:4:"𓃫";i:13854;s:4:"𓃬";i:13855;s:4:"𓃭";i:13856;s:4:"𓃮";i:13857;s:4:"𓃯";i:13858;s:4:"𓃰";i:13859;s:4:"𓃱";i:13860;s:4:"𓃲";i:13861;s:4:"𓃳";i:13862;s:4:"𓃴";i:13863;s:4:"𓃵";i:13864;s:4:"𓃶";i:13865;s:4:"𓃷";i:13866;s:4:"𓃸";i:13867;s:4:"𓃹";i:13868;s:4:"𓃺";i:13869;s:4:"𓃻";i:13870;s:4:"𓃼";i:13871;s:4:"𓃽";i:13872;s:4:"𓃾";i:13873;s:4:"𓃿";i:13874;s:4:"ð“„€";i:13875;s:4:"ð“„";i:13876;s:4:"ð“„‚";i:13877;s:4:"𓄃";i:13878;s:4:"ð“„„";i:13879;s:4:"ð“„…";i:13880;s:4:"𓄆";i:13881;s:4:"𓄇";i:13882;s:4:"𓄈";i:13883;s:4:"𓄉";i:13884;s:4:"ð“„Š";i:13885;s:4:"ð“„‹";i:13886;s:4:"ð“„Œ";i:13887;s:4:"ð“„";i:13888;s:4:"ð“„Ž";i:13889;s:4:"ð“„";i:13890;s:4:"ð“„";i:13891;s:4:"ð“„‘";i:13892;s:4:"ð“„’";i:13893;s:4:"ð“„“";i:13894;s:4:"ð“„”";i:13895;s:4:"ð“„•";i:13896;s:4:"ð“„–";i:13897;s:4:"ð“„—";i:13898;s:4:"𓄘";i:13899;s:4:"ð“„™";i:13900;s:4:"ð“„š";i:13901;s:4:"ð“„›";i:13902;s:4:"ð“„œ";i:13903;s:4:"ð“„";i:13904;s:4:"ð“„ž";i:13905;s:4:"ð“„Ÿ";i:13906;s:4:"ð“„ ";i:13907;s:4:"ð“„¡";i:13908;s:4:"ð“„¢";i:13909;s:4:"ð“„£";i:13910;s:4:"𓄤";i:13911;s:4:"ð“„¥";i:13912;s:4:"𓄦";i:13913;s:4:"𓄧";i:13914;s:4:"𓄨";i:13915;s:4:"ð“„©";i:13916;s:4:"𓄪";i:13917;s:4:"ð“„«";i:13918;s:4:"𓄬";i:13919;s:4:"ð“„­";i:13920;s:4:"ð“„®";i:13921;s:4:"𓄯";i:13922;s:4:"ð“„°";i:13923;s:4:"ð“„±";i:13924;s:4:"ð“„²";i:13925;s:4:"ð“„³";i:13926;s:4:"ð“„´";i:13927;s:4:"ð“„µ";i:13928;s:4:"𓄶";i:13929;s:4:"ð“„·";i:13930;s:4:"𓄸";i:13931;s:4:"ð“„¹";i:13932;s:4:"𓄺";i:13933;s:4:"ð“„»";i:13934;s:4:"ð“„¼";i:13935;s:4:"ð“„½";i:13936;s:4:"ð“„¾";i:13937;s:4:"ð“„¿";i:13938;s:4:"ð“…€";i:13939;s:4:"ð“…";i:13940;s:4:"ð“…‚";i:13941;s:4:"ð“…ƒ";i:13942;s:4:"ð“…„";i:13943;s:4:"ð“……";i:13944;s:4:"ð“…†";i:13945;s:4:"ð“…‡";i:13946;s:4:"ð“…ˆ";i:13947;s:4:"ð“…‰";i:13948;s:4:"ð“…Š";i:13949;s:4:"ð“…‹";i:13950;s:4:"ð“…Œ";i:13951;s:4:"ð“…";i:13952;s:4:"ð“…Ž";i:13953;s:4:"ð“…";i:13954;s:4:"ð“…";i:13955;s:4:"ð“…‘";i:13956;s:4:"ð“…’";i:13957;s:4:"ð“…“";i:13958;s:4:"ð“…”";i:13959;s:4:"ð“…•";i:13960;s:4:"ð“…–";i:13961;s:4:"ð“…—";i:13962;s:4:"ð“…˜";i:13963;s:4:"ð“…™";i:13964;s:4:"ð“…š";i:13965;s:4:"ð“…›";i:13966;s:4:"ð“…œ";i:13967;s:4:"ð“…";i:13968;s:4:"ð“…ž";i:13969;s:4:"ð“…Ÿ";i:13970;s:4:"ð“… ";i:13971;s:4:"ð“…¡";i:13972;s:4:"ð“…¢";i:13973;s:4:"ð“…£";i:13974;s:4:"ð“…¤";i:13975;s:4:"ð“…¥";i:13976;s:4:"ð“…¦";i:13977;s:4:"ð“…§";i:13978;s:4:"ð“…¨";i:13979;s:4:"ð“…©";i:13980;s:4:"ð“…ª";i:13981;s:4:"ð“…«";i:13982;s:4:"ð“…¬";i:13983;s:4:"ð“…­";i:13984;s:4:"ð“…®";i:13985;s:4:"ð“…¯";i:13986;s:4:"ð“…°";i:13987;s:4:"ð“…±";i:13988;s:4:"ð“…²";i:13989;s:4:"ð“…³";i:13990;s:4:"ð“…´";i:13991;s:4:"ð“…µ";i:13992;s:4:"ð“…¶";i:13993;s:4:"ð“…·";i:13994;s:4:"ð“…¸";i:13995;s:4:"ð“…¹";i:13996;s:4:"ð“…º";i:13997;s:4:"ð“…»";i:13998;s:4:"ð“…¼";i:13999;s:4:"ð“…½";i:14000;s:4:"ð“…¾";i:14001;s:4:"ð“…¿";i:14002;s:4:"𓆀";i:14003;s:4:"ð“†";i:14004;s:4:"𓆂";i:14005;s:4:"𓆃";i:14006;s:4:"𓆄";i:14007;s:4:"𓆅";i:14008;s:4:"𓆆";i:14009;s:4:"𓆇";i:14010;s:4:"𓆈";i:14011;s:4:"𓆉";i:14012;s:4:"𓆊";i:14013;s:4:"𓆋";i:14014;s:4:"𓆌";i:14015;s:4:"ð“†";i:14016;s:4:"𓆎";i:14017;s:4:"ð“†";i:14018;s:4:"ð“†";i:14019;s:4:"𓆑";i:14020;s:4:"𓆒";i:14021;s:4:"𓆓";i:14022;s:4:"𓆔";i:14023;s:4:"𓆕";i:14024;s:4:"𓆖";i:14025;s:4:"𓆗";i:14026;s:4:"𓆘";i:14027;s:4:"𓆙";i:14028;s:4:"𓆚";i:14029;s:4:"𓆛";i:14030;s:4:"𓆜";i:14031;s:4:"ð“†";i:14032;s:4:"𓆞";i:14033;s:4:"𓆟";i:14034;s:4:"𓆠";i:14035;s:4:"𓆡";i:14036;s:4:"𓆢";i:14037;s:4:"𓆣";i:14038;s:4:"𓆤";i:14039;s:4:"𓆥";i:14040;s:4:"𓆦";i:14041;s:4:"𓆧";i:14042;s:4:"𓆨";i:14043;s:4:"𓆩";i:14044;s:4:"𓆪";i:14045;s:4:"𓆫";i:14046;s:4:"𓆬";i:14047;s:4:"𓆭";i:14048;s:4:"𓆮";i:14049;s:4:"𓆯";i:14050;s:4:"𓆰";i:14051;s:4:"𓆱";i:14052;s:4:"𓆲";i:14053;s:4:"𓆳";i:14054;s:4:"𓆴";i:14055;s:4:"𓆵";i:14056;s:4:"𓆶";i:14057;s:4:"𓆷";i:14058;s:4:"𓆸";i:14059;s:4:"𓆹";i:14060;s:4:"𓆺";i:14061;s:4:"𓆻";i:14062;s:4:"𓆼";i:14063;s:4:"𓆽";i:14064;s:4:"𓆾";i:14065;s:4:"𓆿";i:14066;s:4:"𓇀";i:14067;s:4:"ð“‡";i:14068;s:4:"𓇂";i:14069;s:4:"𓇃";i:14070;s:4:"𓇄";i:14071;s:4:"𓇅";i:14072;s:4:"𓇆";i:14073;s:4:"𓇇";i:14074;s:4:"𓇈";i:14075;s:4:"𓇉";i:14076;s:4:"𓇊";i:14077;s:4:"𓇋";i:14078;s:4:"𓇌";i:14079;s:4:"ð“‡";i:14080;s:4:"𓇎";i:14081;s:4:"ð“‡";i:14082;s:4:"ð“‡";i:14083;s:4:"𓇑";i:14084;s:4:"𓇒";i:14085;s:4:"𓇓";i:14086;s:4:"𓇔";i:14087;s:4:"𓇕";i:14088;s:4:"𓇖";i:14089;s:4:"𓇗";i:14090;s:4:"𓇘";i:14091;s:4:"𓇙";i:14092;s:4:"𓇚";i:14093;s:4:"𓇛";i:14094;s:4:"𓇜";i:14095;s:4:"ð“‡";i:14096;s:4:"𓇞";i:14097;s:4:"𓇟";i:14098;s:4:"𓇠";i:14099;s:4:"𓇡";i:14100;s:4:"𓇢";i:14101;s:4:"𓇣";i:14102;s:4:"𓇤";i:14103;s:4:"𓇥";i:14104;s:4:"𓇦";i:14105;s:4:"𓇧";i:14106;s:4:"𓇨";i:14107;s:4:"𓇩";i:14108;s:4:"𓇪";i:14109;s:4:"𓇫";i:14110;s:4:"𓇬";i:14111;s:4:"𓇭";i:14112;s:4:"𓇮";i:14113;s:4:"𓇯";i:14114;s:4:"𓇰";i:14115;s:4:"𓇱";i:14116;s:4:"𓇲";i:14117;s:4:"𓇳";i:14118;s:4:"𓇴";i:14119;s:4:"𓇵";i:14120;s:4:"𓇶";i:14121;s:4:"𓇷";i:14122;s:4:"𓇸";i:14123;s:4:"𓇹";i:14124;s:4:"𓇺";i:14125;s:4:"𓇻";i:14126;s:4:"𓇼";i:14127;s:4:"𓇽";i:14128;s:4:"𓇾";i:14129;s:4:"𓇿";i:14130;s:4:"𓈀";i:14131;s:4:"ð“ˆ";i:14132;s:4:"𓈂";i:14133;s:4:"𓈃";i:14134;s:4:"𓈄";i:14135;s:4:"𓈅";i:14136;s:4:"𓈆";i:14137;s:4:"𓈇";i:14138;s:4:"𓈈";i:14139;s:4:"𓈉";i:14140;s:4:"𓈊";i:14141;s:4:"𓈋";i:14142;s:4:"𓈌";i:14143;s:4:"ð“ˆ";i:14144;s:4:"𓈎";i:14145;s:4:"ð“ˆ";i:14146;s:4:"ð“ˆ";i:14147;s:4:"𓈑";i:14148;s:4:"𓈒";i:14149;s:4:"𓈓";i:14150;s:4:"𓈔";i:14151;s:4:"𓈕";i:14152;s:4:"𓈖";i:14153;s:4:"𓈗";i:14154;s:4:"𓈘";i:14155;s:4:"𓈙";i:14156;s:4:"𓈚";i:14157;s:4:"𓈛";i:14158;s:4:"𓈜";i:14159;s:4:"ð“ˆ";i:14160;s:4:"𓈞";i:14161;s:4:"𓈟";i:14162;s:4:"𓈠";i:14163;s:4:"𓈡";i:14164;s:4:"𓈢";i:14165;s:4:"𓈣";i:14166;s:4:"𓈤";i:14167;s:4:"𓈥";i:14168;s:4:"𓈦";i:14169;s:4:"𓈧";i:14170;s:4:"𓈨";i:14171;s:4:"𓈩";i:14172;s:4:"𓈪";i:14173;s:4:"𓈫";i:14174;s:4:"𓈬";i:14175;s:4:"𓈭";i:14176;s:4:"𓈮";i:14177;s:4:"𓈯";i:14178;s:4:"𓈰";i:14179;s:4:"𓈱";i:14180;s:4:"𓈲";i:14181;s:4:"𓈳";i:14182;s:4:"𓈴";i:14183;s:4:"𓈵";i:14184;s:4:"𓈶";i:14185;s:4:"𓈷";i:14186;s:4:"𓈸";i:14187;s:4:"𓈹";i:14188;s:4:"𓈺";i:14189;s:4:"𓈻";i:14190;s:4:"𓈼";i:14191;s:4:"𓈽";i:14192;s:4:"𓈾";i:14193;s:4:"𓈿";i:14194;s:4:"𓉀";i:14195;s:4:"ð“‰";i:14196;s:4:"𓉂";i:14197;s:4:"𓉃";i:14198;s:4:"𓉄";i:14199;s:4:"𓉅";i:14200;s:4:"𓉆";i:14201;s:4:"𓉇";i:14202;s:4:"𓉈";i:14203;s:4:"𓉉";i:14204;s:4:"𓉊";i:14205;s:4:"𓉋";i:14206;s:4:"𓉌";i:14207;s:4:"ð“‰";i:14208;s:4:"𓉎";i:14209;s:4:"ð“‰";i:14210;s:4:"ð“‰";i:14211;s:4:"𓉑";i:14212;s:4:"𓉒";i:14213;s:4:"𓉓";i:14214;s:4:"𓉔";i:14215;s:4:"𓉕";i:14216;s:4:"𓉖";i:14217;s:4:"𓉗";i:14218;s:4:"𓉘";i:14219;s:4:"𓉙";i:14220;s:4:"𓉚";i:14221;s:4:"𓉛";i:14222;s:4:"𓉜";i:14223;s:4:"ð“‰";i:14224;s:4:"𓉞";i:14225;s:4:"𓉟";i:14226;s:4:"𓉠";i:14227;s:4:"𓉡";i:14228;s:4:"𓉢";i:14229;s:4:"𓉣";i:14230;s:4:"𓉤";i:14231;s:4:"𓉥";i:14232;s:4:"𓉦";i:14233;s:4:"𓉧";i:14234;s:4:"𓉨";i:14235;s:4:"𓉩";i:14236;s:4:"𓉪";i:14237;s:4:"𓉫";i:14238;s:4:"𓉬";i:14239;s:4:"𓉭";i:14240;s:4:"𓉮";i:14241;s:4:"𓉯";i:14242;s:4:"𓉰";i:14243;s:4:"𓉱";i:14244;s:4:"𓉲";i:14245;s:4:"𓉳";i:14246;s:4:"𓉴";i:14247;s:4:"𓉵";i:14248;s:4:"𓉶";i:14249;s:4:"𓉷";i:14250;s:4:"𓉸";i:14251;s:4:"𓉹";i:14252;s:4:"𓉺";i:14253;s:4:"𓉻";i:14254;s:4:"𓉼";i:14255;s:4:"𓉽";i:14256;s:4:"𓉾";i:14257;s:4:"𓉿";i:14258;s:4:"ð“Š€";i:14259;s:4:"ð“Š";i:14260;s:4:"ð“Š‚";i:14261;s:4:"𓊃";i:14262;s:4:"ð“Š„";i:14263;s:4:"ð“Š…";i:14264;s:4:"𓊆";i:14265;s:4:"𓊇";i:14266;s:4:"𓊈";i:14267;s:4:"𓊉";i:14268;s:4:"ð“ŠŠ";i:14269;s:4:"ð“Š‹";i:14270;s:4:"ð“ŠŒ";i:14271;s:4:"ð“Š";i:14272;s:4:"ð“ŠŽ";i:14273;s:4:"ð“Š";i:14274;s:4:"ð“Š";i:14275;s:4:"ð“Š‘";i:14276;s:4:"ð“Š’";i:14277;s:4:"ð“Š“";i:14278;s:4:"ð“Š”";i:14279;s:4:"ð“Š•";i:14280;s:4:"ð“Š–";i:14281;s:4:"ð“Š—";i:14282;s:4:"𓊘";i:14283;s:4:"ð“Š™";i:14284;s:4:"ð“Šš";i:14285;s:4:"ð“Š›";i:14286;s:4:"ð“Šœ";i:14287;s:4:"ð“Š";i:14288;s:4:"ð“Šž";i:14289;s:4:"ð“ŠŸ";i:14290;s:4:"ð“Š ";i:14291;s:4:"ð“Š¡";i:14292;s:4:"ð“Š¢";i:14293;s:4:"ð“Š£";i:14294;s:4:"𓊤";i:14295;s:4:"ð“Š¥";i:14296;s:4:"𓊦";i:14297;s:4:"𓊧";i:14298;s:4:"𓊨";i:14299;s:4:"ð“Š©";i:14300;s:4:"𓊪";i:14301;s:4:"ð“Š«";i:14302;s:4:"𓊬";i:14303;s:4:"ð“Š­";i:14304;s:4:"ð“Š®";i:14305;s:4:"𓊯";i:14306;s:4:"ð“Š°";i:14307;s:4:"𓊱";i:14308;s:4:"𓊲";i:14309;s:4:"𓊳";i:14310;s:4:"ð“Š´";i:14311;s:4:"𓊵";i:14312;s:4:"𓊶";i:14313;s:4:"ð“Š·";i:14314;s:4:"𓊸";i:14315;s:4:"𓊹";i:14316;s:4:"𓊺";i:14317;s:4:"ð“Š»";i:14318;s:4:"𓊼";i:14319;s:4:"𓊽";i:14320;s:4:"𓊾";i:14321;s:4:"ð“Š¿";i:14322;s:4:"ð“‹€";i:14323;s:4:"ð“‹";i:14324;s:4:"ð“‹‚";i:14325;s:4:"𓋃";i:14326;s:4:"ð“‹„";i:14327;s:4:"ð“‹…";i:14328;s:4:"𓋆";i:14329;s:4:"𓋇";i:14330;s:4:"𓋈";i:14331;s:4:"𓋉";i:14332;s:4:"ð“‹Š";i:14333;s:4:"ð“‹‹";i:14334;s:4:"ð“‹Œ";i:14335;s:4:"ð“‹";i:14336;s:4:"ð“‹Ž";i:14337;s:4:"ð“‹";i:14338;s:4:"ð“‹";i:14339;s:4:"ð“‹‘";i:14340;s:4:"ð“‹’";i:14341;s:4:"ð“‹“";i:14342;s:4:"ð“‹”";i:14343;s:4:"ð“‹•";i:14344;s:4:"ð“‹–";i:14345;s:4:"ð“‹—";i:14346;s:4:"𓋘";i:14347;s:4:"ð“‹™";i:14348;s:4:"ð“‹š";i:14349;s:4:"ð“‹›";i:14350;s:4:"ð“‹œ";i:14351;s:4:"ð“‹";i:14352;s:4:"ð“‹ž";i:14353;s:4:"ð“‹Ÿ";i:14354;s:4:"ð“‹ ";i:14355;s:4:"ð“‹¡";i:14356;s:4:"ð“‹¢";i:14357;s:4:"ð“‹£";i:14358;s:4:"𓋤";i:14359;s:4:"ð“‹¥";i:14360;s:4:"𓋦";i:14361;s:4:"𓋧";i:14362;s:4:"𓋨";i:14363;s:4:"ð“‹©";i:14364;s:4:"𓋪";i:14365;s:4:"ð“‹«";i:14366;s:4:"𓋬";i:14367;s:4:"ð“‹­";i:14368;s:4:"ð“‹®";i:14369;s:4:"𓋯";i:14370;s:4:"ð“‹°";i:14371;s:4:"ð“‹±";i:14372;s:4:"ð“‹²";i:14373;s:4:"ð“‹³";i:14374;s:4:"ð“‹´";i:14375;s:4:"ð“‹µ";i:14376;s:4:"𓋶";i:14377;s:4:"ð“‹·";i:14378;s:4:"𓋸";i:14379;s:4:"ð“‹¹";i:14380;s:4:"𓋺";i:14381;s:4:"ð“‹»";i:14382;s:4:"ð“‹¼";i:14383;s:4:"ð“‹½";i:14384;s:4:"ð“‹¾";i:14385;s:4:"ð“‹¿";i:14386;s:4:"𓌀";i:14387;s:4:"ð“Œ";i:14388;s:4:"𓌂";i:14389;s:4:"𓌃";i:14390;s:4:"𓌄";i:14391;s:4:"𓌅";i:14392;s:4:"𓌆";i:14393;s:4:"𓌇";i:14394;s:4:"𓌈";i:14395;s:4:"𓌉";i:14396;s:4:"𓌊";i:14397;s:4:"𓌋";i:14398;s:4:"𓌌";i:14399;s:4:"ð“Œ";i:14400;s:4:"𓌎";i:14401;s:4:"ð“Œ";i:14402;s:4:"ð“Œ";i:14403;s:4:"𓌑";i:14404;s:4:"𓌒";i:14405;s:4:"𓌓";i:14406;s:4:"𓌔";i:14407;s:4:"𓌕";i:14408;s:4:"𓌖";i:14409;s:4:"𓌗";i:14410;s:4:"𓌘";i:14411;s:4:"𓌙";i:14412;s:4:"𓌚";i:14413;s:4:"𓌛";i:14414;s:4:"𓌜";i:14415;s:4:"ð“Œ";i:14416;s:4:"𓌞";i:14417;s:4:"𓌟";i:14418;s:4:"𓌠";i:14419;s:4:"𓌡";i:14420;s:4:"𓌢";i:14421;s:4:"𓌣";i:14422;s:4:"𓌤";i:14423;s:4:"𓌥";i:14424;s:4:"𓌦";i:14425;s:4:"𓌧";i:14426;s:4:"𓌨";i:14427;s:4:"𓌩";i:14428;s:4:"𓌪";i:14429;s:4:"𓌫";i:14430;s:4:"𓌬";i:14431;s:4:"𓌭";i:14432;s:4:"𓌮";i:14433;s:4:"𓌯";i:14434;s:4:"𓌰";i:14435;s:4:"𓌱";i:14436;s:4:"𓌲";i:14437;s:4:"𓌳";i:14438;s:4:"𓌴";i:14439;s:4:"𓌵";i:14440;s:4:"𓌶";i:14441;s:4:"𓌷";i:14442;s:4:"𓌸";i:14443;s:4:"𓌹";i:14444;s:4:"𓌺";i:14445;s:4:"𓌻";i:14446;s:4:"𓌼";i:14447;s:4:"𓌽";i:14448;s:4:"𓌾";i:14449;s:4:"𓌿";i:14450;s:4:"ð“€";i:14451;s:4:"ð“";i:14452;s:4:"ð“‚";i:14453;s:4:"ð“ƒ";i:14454;s:4:"ð“„";i:14455;s:4:"ð“…";i:14456;s:4:"ð“†";i:14457;s:4:"ð“‡";i:14458;s:4:"ð“ˆ";i:14459;s:4:"ð“‰";i:14460;s:4:"ð“Š";i:14461;s:4:"ð“‹";i:14462;s:4:"ð“Œ";i:14463;s:4:"ð“";i:14464;s:4:"ð“Ž";i:14465;s:4:"ð“";i:14466;s:4:"ð“";i:14467;s:4:"ð“‘";i:14468;s:4:"ð“’";i:14469;s:4:"ð““";i:14470;s:4:"ð“”";i:14471;s:4:"ð“•";i:14472;s:4:"ð“–";i:14473;s:4:"ð“—";i:14474;s:4:"ð“˜";i:14475;s:4:"ð“™";i:14476;s:4:"ð“š";i:14477;s:4:"ð“›";i:14478;s:4:"ð“œ";i:14479;s:4:"ð“";i:14480;s:4:"ð“ž";i:14481;s:4:"ð“Ÿ";i:14482;s:4:"ð“ ";i:14483;s:4:"ð“¡";i:14484;s:4:"ð“¢";i:14485;s:4:"ð“£";i:14486;s:4:"ð“¤";i:14487;s:4:"ð“¥";i:14488;s:4:"ð“¦";i:14489;s:4:"ð“§";i:14490;s:4:"ð“¨";i:14491;s:4:"ð“©";i:14492;s:4:"ð“ª";i:14493;s:4:"ð“«";i:14494;s:4:"ð“¬";i:14495;s:4:"ð“­";i:14496;s:4:"ð“®";i:14497;s:4:"ð“¯";i:14498;s:4:"ð“°";i:14499;s:4:"ð“±";i:14500;s:4:"ð“²";i:14501;s:4:"ð“³";i:14502;s:4:"ð“´";i:14503;s:4:"ð“µ";i:14504;s:4:"ð“¶";i:14505;s:4:"ð“·";i:14506;s:4:"ð“¸";i:14507;s:4:"ð“¹";i:14508;s:4:"ð“º";i:14509;s:4:"ð“»";i:14510;s:4:"ð“¼";i:14511;s:4:"ð“½";i:14512;s:4:"ð“¾";i:14513;s:4:"ð“¿";i:14514;s:4:"ð“Ž€";i:14515;s:4:"ð“Ž";i:14516;s:4:"ð“Ž‚";i:14517;s:4:"𓎃";i:14518;s:4:"ð“Ž„";i:14519;s:4:"ð“Ž…";i:14520;s:4:"𓎆";i:14521;s:4:"𓎇";i:14522;s:4:"𓎈";i:14523;s:4:"𓎉";i:14524;s:4:"ð“ŽŠ";i:14525;s:4:"ð“Ž‹";i:14526;s:4:"ð“ŽŒ";i:14527;s:4:"ð“Ž";i:14528;s:4:"ð“ŽŽ";i:14529;s:4:"ð“Ž";i:14530;s:4:"ð“Ž";i:14531;s:4:"ð“Ž‘";i:14532;s:4:"ð“Ž’";i:14533;s:4:"ð“Ž“";i:14534;s:4:"ð“Ž”";i:14535;s:4:"ð“Ž•";i:14536;s:4:"ð“Ž–";i:14537;s:4:"ð“Ž—";i:14538;s:4:"𓎘";i:14539;s:4:"ð“Ž™";i:14540;s:4:"ð“Žš";i:14541;s:4:"ð“Ž›";i:14542;s:4:"ð“Žœ";i:14543;s:4:"ð“Ž";i:14544;s:4:"ð“Žž";i:14545;s:4:"ð“ŽŸ";i:14546;s:4:"ð“Ž ";i:14547;s:4:"ð“Ž¡";i:14548;s:4:"ð“Ž¢";i:14549;s:4:"ð“Ž£";i:14550;s:4:"𓎤";i:14551;s:4:"ð“Ž¥";i:14552;s:4:"𓎦";i:14553;s:4:"𓎧";i:14554;s:4:"𓎨";i:14555;s:4:"ð“Ž©";i:14556;s:4:"𓎪";i:14557;s:4:"ð“Ž«";i:14558;s:4:"𓎬";i:14559;s:4:"ð“Ž­";i:14560;s:4:"ð“Ž®";i:14561;s:4:"𓎯";i:14562;s:4:"ð“Ž°";i:14563;s:4:"𓎱";i:14564;s:4:"𓎲";i:14565;s:4:"𓎳";i:14566;s:4:"ð“Ž´";i:14567;s:4:"𓎵";i:14568;s:4:"𓎶";i:14569;s:4:"ð“Ž·";i:14570;s:4:"𓎸";i:14571;s:4:"𓎹";i:14572;s:4:"𓎺";i:14573;s:4:"ð“Ž»";i:14574;s:4:"𓎼";i:14575;s:4:"𓎽";i:14576;s:4:"𓎾";i:14577;s:4:"ð“Ž¿";i:14578;s:4:"ð“€";i:14579;s:4:"ð“";i:14580;s:4:"ð“‚";i:14581;s:4:"ð“ƒ";i:14582;s:4:"ð“„";i:14583;s:4:"ð“…";i:14584;s:4:"ð“†";i:14585;s:4:"ð“‡";i:14586;s:4:"ð“ˆ";i:14587;s:4:"ð“‰";i:14588;s:4:"ð“Š";i:14589;s:4:"ð“‹";i:14590;s:4:"ð“Œ";i:14591;s:4:"ð“";i:14592;s:4:"ð“Ž";i:14593;s:4:"ð“";i:14594;s:4:"ð“";i:14595;s:4:"ð“‘";i:14596;s:4:"ð“’";i:14597;s:4:"ð““";i:14598;s:4:"ð“”";i:14599;s:4:"ð“•";i:14600;s:4:"ð“–";i:14601;s:4:"ð“—";i:14602;s:4:"ð“˜";i:14603;s:4:"ð“™";i:14604;s:4:"ð“š";i:14605;s:4:"ð“›";i:14606;s:4:"ð“œ";i:14607;s:4:"ð“";i:14608;s:4:"ð“ž";i:14609;s:4:"ð“Ÿ";i:14610;s:4:"ð“ ";i:14611;s:4:"ð“¡";i:14612;s:4:"ð“¢";i:14613;s:4:"ð“£";i:14614;s:4:"ð“¤";i:14615;s:4:"ð“¥";i:14616;s:4:"ð“¦";i:14617;s:4:"ð“§";i:14618;s:4:"ð“¨";i:14619;s:4:"ð“©";i:14620;s:4:"ð“ª";i:14621;s:4:"ð“«";i:14622;s:4:"ð“¬";i:14623;s:4:"ð“­";i:14624;s:4:"ð“®";i:14625;s:4:"ð“¯";i:14626;s:4:"ð“°";i:14627;s:4:"ð“±";i:14628;s:4:"ð“²";i:14629;s:4:"ð“³";i:14630;s:4:"ð“´";i:14631;s:4:"ð“µ";i:14632;s:4:"ð“¶";i:14633;s:4:"ð“·";i:14634;s:4:"ð“¸";i:14635;s:4:"ð“¹";i:14636;s:4:"ð“º";i:14637;s:4:"ð“»";i:14638;s:4:"ð“¼";i:14639;s:4:"ð“½";i:14640;s:4:"ð“¾";i:14641;s:4:"ð“¿";i:14642;s:4:"ð“€";i:14643;s:4:"ð“";i:14644;s:4:"ð“‚";i:14645;s:4:"ð“ƒ";i:14646;s:4:"ð“„";i:14647;s:4:"ð“…";i:14648;s:4:"ð“†";i:14649;s:4:"ð“‡";i:14650;s:4:"ð“ˆ";i:14651;s:4:"ð“‰";i:14652;s:4:"ð“Š";i:14653;s:4:"ð“‹";i:14654;s:4:"ð“Œ";i:14655;s:4:"ð“";i:14656;s:4:"ð“Ž";i:14657;s:4:"ð“";i:14658;s:4:"ð“";i:14659;s:4:"ð“‘";i:14660;s:4:"ð“’";i:14661;s:4:"ð““";i:14662;s:4:"ð“”";i:14663;s:4:"ð“•";i:14664;s:4:"ð“–";i:14665;s:4:"ð“—";i:14666;s:4:"ð“˜";i:14667;s:4:"ð“™";i:14668;s:4:"ð“š";i:14669;s:4:"ð“›";i:14670;s:4:"ð“œ";i:14671;s:4:"ð“";i:14672;s:4:"ð“ž";i:14673;s:4:"ð“Ÿ";i:14674;s:4:"ð“ ";i:14675;s:4:"ð“¡";i:14676;s:4:"ð“¢";i:14677;s:4:"ð“£";i:14678;s:4:"ð“¤";i:14679;s:4:"ð“¥";i:14680;s:4:"ð“¦";i:14681;s:4:"ð“§";i:14682;s:4:"ð“¨";i:14683;s:4:"ð“©";i:14684;s:4:"ð“ª";i:14685;s:4:"ð“«";i:14686;s:4:"ð“¬";i:14687;s:4:"ð“­";i:14688;s:4:"ð“®";i:14689;s:3:"㆒";i:14690;s:3:"㆜";i:14691;s:3:"㆔";i:14692;s:3:"㆖";i:14693;s:3:"㆘";i:14694;s:3:"㆛";i:14695;s:3:"㆗";i:14696;s:3:"㆚";i:14697;s:3:"㆓";i:14698;s:4:"🈘";i:14699;s:3:"㆟";i:14700;s:4:"🈞";i:14701;s:4:"🈠";i:14702;s:4:"🈜";i:14703;s:4:"🈹";i:14704;s:4:"🈒";i:14705;s:4:"🉑";i:14706;s:4:"🈮";i:14707;s:4:"🈴";i:14708;s:4:"🈥";i:14709;s:4:"🈺";i:14710;s:3:"㆕";i:14711;s:3:"㆞";i:14712;s:4:"🈤";i:14713;s:4:"🈕";i:14714;s:3:"ã†";i:14715;s:4:"🈑";i:14716;s:4:"🈬";i:14717;s:4:"ðŸˆ";i:14718;s:4:"ðŸ‰";i:14719;s:4:"ðŸˆ";i:14720;s:4:"🈱";i:14721;s:4:"🈧";i:14722;s:4:"🈯";i:14723;s:4:"🈨";i:14724;s:4:"🈛";i:14725;s:4:"🈟";i:14726;s:4:"🈙";i:14727;s:4:"🈷";i:14728;s:4:"🈶";i:14729;s:4:"🈵";i:14730;s:4:"🈦";i:14731;s:4:"🈚";i:14732;s:4:"🈢";i:14733;s:3:"㆙";i:14734;s:4:"🈸";i:14735;s:4:"🈲";i:14736;s:4:"🈳";i:14737;s:4:"🈡";i:14738;s:4:"🈖";i:14739;s:4:"🈣";i:14740;s:4:"🈰";i:14741;s:4:"🈫";} \ No newline at end of file
diff --git a/skins/ArchLinux.php b/skins/ArchLinux.php
index ec17c343..62942536 100644
--- a/skins/ArchLinux.php
+++ b/skins/ArchLinux.php
@@ -66,6 +66,27 @@ class ArchLinuxTemplate extends QuickTemplate {
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
+ // Generate additional footer links
+ $footerlinks = $this->data["footerlinks"];
+ // fold footerlinks into a single array using a bit of trickery
+ $footerlinks = call_user_func_array('array_merge', array_values($footerlinks));
+ // Generate additional footer icons
+ $footericons = $this->data["footericons"];
+ // Unset any icons which don't have an image
+ foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+ foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
+ if ( !is_string($footerIcon) && !isset($footerIcon["src"]) ) {
+ unset($footerIconsBlock[$footerIconKey]);
+ }
+ }
+ }
+ // Redo removal of any empty blocks
+ foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+ if ( count($footerIconsBlock) <= 0 ) {
+ unset($footericons[$footerIconsKey]);
+ }
+ }
+
$this->html( 'headelement' );
if (empty($_REQUEST['printable'])) {?>
@@ -100,7 +121,7 @@ if (empty($_REQUEST['printable'])) {?>
<h1 id="firstHeading" class="firstHeading"><?php $this->html('title') ?></h1>
<div id="bodyContent">
- <h3 id="siteSub"><?php $this->msg('tagline') ?></h3>
+ <div id="siteSub"><?php $this->msg('tagline') ?></div>
<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
<?php if($this->data['undelete']) { ?>
<div id="contentSub2"><?php $this->html('undelete') ?></div>
@@ -188,19 +209,17 @@ if (empty($_REQUEST['printable'])) {?>
</div><!-- end of the left (by default at least) column -->
<div class="visualClear"></div>
<div id="footer"<?php $this->html('userlangattributes') ?>>
-<?php
-if($this->data['poweredbyico']) { ?>
- <div id="f-poweredbyico"><?php $this->html('poweredbyico') ?></div>
+<?php foreach ( $footericons as $blockName => $footerIcons ) { ?>
+ <div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+<?php foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->skin->makeFooterIcon( $icon ); ?>
+
<?php }
-if($this->data['copyrightico']) { ?>
- <div id="f-copyrightico"><?php $this->html('copyrightico') ?></div>
+?>
+ </div>
<?php }
// Generate additional footer links
- $footerlinks = array(
- 'lastmod', 'viewcount', 'numberofwatchingusers', 'credits', 'copyright',
- 'privacy', 'about', 'disclaimer', 'tagline',
- );
$validFooterLinks = array();
foreach( $footerlinks as $aLink ) {
if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
@@ -228,10 +247,11 @@ if($this->data['copyrightico']) { ?>
<?php $this->text( 'debug' ); ?>
-->
-<?php endif; ?>
-</body></html>
-<?php
- wfRestoreWarnings();
+<?php endif;
+
+ echo Html::closeElement( 'body' );
+ echo Html::closeElement( 'html' );
+ wfRestoreWarnings();
} // end of execute() method
/*************************************************************************************************/
@@ -252,7 +272,7 @@ if($this->data['copyrightico']) { ?>
'accesskey' => $this->skin->accesskey( 'search' )
) ); ?>
- <input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> /><?php if ($wgUseTwoButtonsSearchForm) { ?>&nbsp;
+ <input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> /><?php if ($wgUseTwoButtonsSearchForm) { ?>&#160;
<input type='submit' name="fulltext" class="searchButton" id="mw-searchButton" value="<?php $this->msg('searchbutton') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?> /><?php } else { ?>
<div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php } ?>
@@ -290,7 +310,7 @@ if($this->data['copyrightico']) { ?>
if($this->data['feeds']) { ?>
<li id="feedlinks"><?php foreach($this->data['feeds'] as $key => $feed) {
?><a id="<?php echo Sanitizer::escapeId( "feed-$key" ) ?>" href="<?php
- echo htmlspecialchars($feed['href']) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey('feed-'.$key) ?>><?php echo htmlspecialchars($feed['text'])?></a>&nbsp;
+ echo htmlspecialchars($feed['href']) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey('feed-'.$key) ?>><?php echo htmlspecialchars($feed['text'])?></a>&#160;
<?php } ?></li><?php
}
@@ -333,7 +353,8 @@ if($this->data['copyrightico']) { ?>
<ul>
<?php foreach($this->data['language_urls'] as $langlink) { ?>
<li class="<?php echo htmlspecialchars($langlink['class'])?>"><?php
- ?><a href="<?php echo htmlspecialchars($langlink['href']) ?>"><?php echo $langlink['text'] ?></a></li>
+ ?><a href="<?php echo htmlspecialchars($langlink['href']) ?>" title="<?php
+ echo htmlspecialchars($langlink['title']) ?>"><?php echo $langlink['text'] ?></a></li>
<?php } ?>
</ul>
</div>
@@ -350,7 +371,7 @@ if($this->data['copyrightico']) { ?>
<div class='pBody'>
<?php if ( is_array( $cont ) ) { ?>
<ul>
-<?php foreach($cont as $key => $val) { ?>
+<?php foreach($cont as $val) { ?>
<li id="<?php echo Sanitizer::escapeId($val['id']) ?>"<?php
if ( $val['active'] ) { ?> class="active" <?php }
?>><a href="<?php echo htmlspecialchars($val['href']) ?>"<?php echo $this->skin->tooltipAndAccesskey($val['id']) ?>><?php echo htmlspecialchars($val['text']) ?></a></li>
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index a7aac8a0..1ff2ccab 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -26,7 +26,6 @@ class SkinCologneBlue extends Skin {
}
function doBeforeContent() {
- $qb = $this->qbSetting();
$mainPageObj = Title::newMainPage();
$s = "\n<div id='content'>\n<div id='topbar'>" .
@@ -107,32 +106,38 @@ class SkinCologneBlue extends Skin {
return $s;
}
- function reallyGenerateUserStylesheet() {
- $s = parent::reallyGenerateUserStylesheet();
+ function setupSkinUserCss( OutputPage $out ){
+ global $wgContLang;
$qb = $this->qbSetting();
+ $rules = array();
if ( 2 == $qb ) { # Right
- $s .= "#quickbar { position: absolute; right: 4px; }\n" .
- "#article { margin-left: 4px; margin-right: 148px; }\n";
+ $rules[] = "#quickbar { position: absolute; right: 4px; }";
+ $rules[] = "#article { margin-left: 4px; margin-right: 148px; }";
} elseif ( 1 == $qb ) {
- $s .= "#quickbar { position: absolute; left: 4px; }\n" .
- "#article { margin-left: 148px; margin-right: 4px; }\n";
+ $rules[] = "#quickbar { position: absolute; left: 4px; }";
+ $rules[] = "#article { margin-left: 148px; margin-right: 4px; }";
} elseif ( 3 == $qb ) { # Floating left
- $s .= "#quickbar { position:absolute; left:4px } \n" .
- "#topbar { margin-left: 148px }\n" .
- "#article { margin-left:148px; margin-right: 4px; } \n" .
- "body>#quickbar { position:fixed; left:4px; top:4px; overflow:auto ;bottom:4px;} \n"; # Hides from IE
+ $rules[] = "#quickbar { position:absolute; left:4px }";
+ $rules[] = "#topbar { margin-left: 148px }";
+ $rules[] = "#article { margin-left:148px; margin-right: 4px; }";
+ $rules[] = "body>#quickbar { position:fixed; left:4px; top:4px; overflow:auto ;bottom:4px;}"; # Hides from IE
} elseif ( 4 == $qb ) { # Floating right
- $s .= "#quickbar { position: fixed; right: 4px; } \n" .
- "#topbar { margin-right: 148px }\n" .
- "#article { margin-right: 148px; margin-left: 4px; } \n" .
- "body>#quickbar { position: fixed; right: 4px; top: 4px; overflow: auto ;bottom:4px;} \n"; # Hides from IE
+ $rules[] = "#quickbar { position: fixed; right: 4px; }";
+ $rules[] = "#topbar { margin-right: 148px }";
+ $rules[] = "#article { margin-right: 148px; margin-left: 4px; }";
+ $rules[] = "body>#quickbar { position: fixed; right: 4px; top: 4px; overflow: auto ;bottom:4px;}"; # Hides from IE
}
- return $s;
+ $style = implode( "\n", $rules );
+ if ( $wgContLang->getDir() === 'rtl' ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ $out->addInlineStyle( $style );
+ parent::setupSkinUserCss( $out );
}
function sysLinks() {
- global $wgUser, $wgLang, $wgContLang;
+ global $wgUser, $wgLang;
$li = SpecialPage::getTitleFor( 'Userlogin' );
$lo = SpecialPage::getTitleFor( 'Userlogout' );
@@ -157,7 +162,7 @@ class SkinCologneBlue extends Skin {
Title::newFromText( wfMsgForContent( 'faqpage' ) ),
wfMsg( 'faq' )
),
- $this->specialLink( 'specialpages' )
+ $this->specialLink( 'Specialpages' )
);
/* show links to different language variants */
@@ -191,7 +196,7 @@ class SkinCologneBlue extends Skin {
* @access private
*/
function quickBar(){
- global $wgOut, $wgUser, $wgEnableUploads;
+ global $wgOut, $wgUser;
$tns = $this->mTitle->getNamespace();
@@ -272,7 +277,6 @@ class SkinCologneBlue extends Skin {
$s .= $this->menuHead( 'qbmyoptions' );
if ( $wgUser->isLoggedIn() ) {
- $name = $wgUser->getName();
$tl = $this->link(
$wgUser->getTalkPage(),
wfMsg( 'mytalk' ),
@@ -290,7 +294,7 @@ class SkinCologneBlue extends Skin {
array(),
array(),
array( 'known', 'noclasses' )
- ) . $sep . $tl . $sep . $this->specialLink( 'watchlist' )
+ ) . $sep . $tl . $sep . $this->specialLink( 'Watchlist' )
. $sep .
$this->link(
SpecialPage::getSafeTitleFor( 'Contributions', $wgUser->getName() ),
@@ -298,18 +302,18 @@ class SkinCologneBlue extends Skin {
array(),
array(),
array( 'known', 'noclasses' )
- ) . $sep . $this->specialLink( 'preferences' )
- . $sep . $this->specialLink( 'userlogout' );
+ ) . $sep . $this->specialLink( 'Preferences' )
+ . $sep . $this->specialLink( 'Userlogout' );
} else {
- $s .= $this->specialLink( 'userlogin' );
+ $s .= $this->specialLink( 'Userlogin' );
}
$s .= $this->menuHead( 'qbspecialpages' )
- . $this->specialLink( 'newpages' )
- . $sep . $this->specialLink( 'listfiles' )
- . $sep . $this->specialLink( 'statistics' );
- if ( $wgUser->isLoggedIn() && $wgEnableUploads ) {
- $s .= $sep . $this->specialLink( 'upload' );
+ . $this->specialLink( 'Newpages' )
+ . $sep . $this->specialLink( 'Listfiles' )
+ . $sep . $this->specialLink( 'Statistics' );
+ if( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ $s .= $sep . $this->getUploadLink();
}
global $wgSiteSupportPage;
diff --git a/skins/Modern.php b/skins/Modern.php
index ef1b1a1e..752d0ded 100644
--- a/skins/Modern.php
+++ b/skins/Modern.php
@@ -10,6 +10,8 @@
if( !defined( 'MEDIAWIKI' ) )
die( -1 );
+require( dirname(__FILE__) . '/MonoBook.php' );
+
/**
* Inherit main code from SkinTemplate, set the CSS and template filter.
* @todo document
@@ -19,18 +21,7 @@ class SkinModern extends SkinTemplate {
var $skinname = 'modern', $stylename = 'modern',
$template = 'ModernTemplate', $useHeadElement = true;
- /*
- * We don't like the default getPoweredBy, the icon clashes with the
- * skin L&F.
- */
- function getPoweredBy() {
- global $wgVersion;
- return "<div class='mw_poweredby'>Powered by MediaWiki $wgVersion</div>";
- }
-
function setupSkinUserCss( OutputPage $out ){
- global $wgStyleVersion, $wgJsMimeType, $wgStylePath;
-
// Do not call parent::setupSkinUserCss(), we have our own print style
$out->addStyle( 'common/shared.css', 'screen' );
$out->addStyle( 'modern/main.css', 'screen' );
@@ -43,7 +34,7 @@ class SkinModern extends SkinTemplate {
* @todo document
* @ingroup Skins
*/
-class ModernTemplate extends QuickTemplate {
+class ModernTemplate extends MonoBookTemplate {
var $skin;
/**
* Template filter callback for Modern skin.
@@ -54,13 +45,25 @@ class ModernTemplate extends QuickTemplate {
* @access private
*/
function execute() {
- global $wgRequest, $wgOut;
+ global $wgRequest;
$this->skin = $skin = $this->data['skin'];
$action = $wgRequest->getText( 'action' );
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
+ // Generate additional footer links
+ $footerlinks = $this->data["footerlinks"];
+ // fold footerlinks into a single array using a bit of trickery
+ $footerlinks = call_user_func_array('array_merge', array_values($footerlinks));
+ // Generate additional footer icons
+ $footericons = $this->data["footericons"];
+ // Unset copyright.copyright since we don't need the icon and already output a copyright from footerlinks
+ unset($footericons["copyright"]["copyright"]);
+ if ( count($footericons["copyright"]) <= 0 ) {
+ unset($footericons["copyright"]);
+ }
+
$this->html( 'headelement' );
?>
@@ -180,10 +183,6 @@ class ModernTemplate extends QuickTemplate {
<div id="footer"<?php $this->html('userlangattributes') ?>>
<ul id="f-list">
<?php
- $footerlinks = array(
- 'lastmod', 'viewcount', 'numberofwatchingusers', 'credits', 'copyright',
- 'privacy', 'about', 'disclaimer', 'tagline',
- );
foreach( $footerlinks as $aLink ) {
if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
?> <li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
@@ -191,7 +190,19 @@ class ModernTemplate extends QuickTemplate {
}
?>
</ul>
- <?php echo $this->html("poweredbyico"); ?>
+<?php
+ foreach ( $footericons as $blockName => $footerIcons ) { ?>
+ <div id="mw_<?php echo htmlspecialchars($blockName); ?>">
+<?php
+ foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->skin->makeFooterIcon( $icon, 'withoutImage' ); ?>
+
+<?php
+ } ?>
+ </div>
+<?php
+ }
+?>
</div>
<?php $this->html('bottomscripts'); /* JS call to runBodyOnloadHook */ ?>
@@ -205,134 +216,6 @@ class ModernTemplate extends QuickTemplate {
<?php
wfRestoreWarnings();
} // end of execute() method
-
- /*************************************************************************************************/
- function searchBox() {
- global $wgUseTwoButtonsSearchForm;
-?>
- <!-- search -->
- <div id="p-search" class="portlet">
- <h5><label for="searchInput"><?php $this->msg('search') ?></label></h5>
- <div id="searchBody" class="pBody">
- <form action="<?php $this->text('wgScript') ?>" id="searchform">
- <input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
- <input id="searchInput" name="search" type="text"<?php echo $this->skin->tooltipAndAccesskey('search');
- if( isset( $this->data['search'] ) ) {
- ?> value="<?php $this->text('search') ?>"<?php } ?> />
- <input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> /><?php if ($wgUseTwoButtonsSearchForm) { ?>&nbsp;
- <input type='submit' name="fulltext" class="searchButton" id="mw-searchButton" value="<?php $this->msg('searchbutton') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?> /><?php } else { ?>
-
- <div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php } ?>
-
- </form>
- </div>
- </div>
-<?php
- }
-
- /*************************************************************************************************/
- function toolbox() {
-?>
- <!-- toolbox -->
- <div class="portlet" id="p-tb">
- <h5><?php $this->msg('toolbox') ?></h5>
- <div class="pBody">
- <ul>
-<?php
- if($this->data['notspecialpage']) { ?>
- <li id="t-whatlinkshere"><a href="<?php
- echo htmlspecialchars($this->data['nav_urls']['whatlinkshere']['href'])
- ?>"<?php echo $this->skin->tooltipAndAccesskey('t-whatlinkshere') ?>><?php $this->msg('whatlinkshere') ?></a></li>
-<?php
- if( $this->data['nav_urls']['recentchangeslinked'] ) { ?>
- <li id="t-recentchangeslinked"><a href="<?php
- echo htmlspecialchars($this->data['nav_urls']['recentchangeslinked']['href'])
- ?>"<?php echo $this->skin->tooltipAndAccesskey('t-recentchangeslinked') ?>><?php $this->msg('recentchangeslinked-toolbox') ?></a></li>
-<?php }
- }
- if(isset($this->data['nav_urls']['trackbacklink'])) { ?>
- <li id="t-trackbacklink"><a href="<?php
- echo htmlspecialchars($this->data['nav_urls']['trackbacklink']['href'])
- ?>"<?php echo $this->skin->tooltipAndAccesskey('t-trackbacklink') ?>><?php $this->msg('trackbacklink') ?></a></li>
-<?php }
- if($this->data['feeds']) { ?>
- <li id="feedlinks"><?php foreach($this->data['feeds'] as $key => $feed) {
- ?><a id="<?php echo Sanitizer::escapeId( "feed-$key" ) ?>" href="<?php
- echo htmlspecialchars($feed['href']) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey('feed-'.$key) ?>><?php echo htmlspecialchars($feed['text'])?></a>&nbsp;
- <?php } ?></li><?php
- }
-
- foreach( array('contributions', 'log', 'blockip', 'emailuser', 'upload', 'specialpages') as $special ) {
-
- if($this->data['nav_urls'][$special]) {
- ?><li id="t-<?php echo $special ?>"><a href="<?php echo htmlspecialchars($this->data['nav_urls'][$special]['href'])
- ?>"<?php echo $this->skin->tooltipAndAccesskey('t-'.$special) ?>><?php $this->msg($special) ?></a></li>
-<?php }
- }
-
- if(!empty($this->data['nav_urls']['print']['href'])) { ?>
- <li id="t-print"><a href="<?php echo htmlspecialchars($this->data['nav_urls']['print']['href'])
- ?>" rel="alternate"<?php echo $this->skin->tooltipAndAccesskey('t-print') ?>><?php $this->msg('printableversion') ?></a></li><?php
- }
-
- if(!empty($this->data['nav_urls']['permalink']['href'])) { ?>
- <li id="t-permalink"><a href="<?php echo htmlspecialchars($this->data['nav_urls']['permalink']['href'])
- ?>"<?php echo $this->skin->tooltipAndAccesskey('t-permalink') ?>><?php $this->msg('permalink') ?></a></li><?php
- } elseif ($this->data['nav_urls']['permalink']['href'] === '') { ?>
- <li id="t-ispermalink"<?php echo $this->skin->tooltip('t-ispermalink') ?>><?php $this->msg('permalink') ?></li><?php
- }
-
- wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this ) );
-?>
- </ul>
- </div>
- </div>
-<?php
- }
-
- /*************************************************************************************************/
- function languageBox() {
- if( $this->data['language_urls'] ) {
-?>
- <div id="p-lang" class="portlet">
- <h5><?php $this->msg('otherlanguages') ?></h5>
- <div class="pBody">
- <ul>
-<?php foreach($this->data['language_urls'] as $langlink) { ?>
- <li class="<?php echo htmlspecialchars($langlink['class'])?>"><?php
- ?><a href="<?php echo htmlspecialchars($langlink['href']) ?>"><?php echo $langlink['text'] ?></a></li>
-<?php } ?>
- </ul>
- </div>
- </div>
-<?php
- }
- }
-
- /*************************************************************************************************/
- function customBox( $bar, $cont ) {
-?>
- <div class='generated-sidebar portlet' id='<?php echo Sanitizer::escapeId( "p-$bar" ) ?>'<?php echo $this->skin->tooltip('p-'.$bar) ?>>
- <h5><?php $out = wfMsg( $bar ); if (wfEmptyMsg($bar, $out)) echo $bar; else echo $out; ?></h5>
- <div class='pBody'>
-<?php if ( is_array( $cont ) ) { ?>
- <ul>
-<?php foreach($cont as $key => $val) { ?>
- <li id="<?php echo Sanitizer::escapeId($val['id']) ?>"<?php
- if ( $val['active'] ) { ?> class="active" <?php }
- ?>><a href="<?php echo htmlspecialchars($val['href']) ?>"<?php echo $this->skin->tooltipAndAccesskey($val['id']) ?>><?php echo htmlspecialchars($val['text']) ?></a></li>
-<?php } ?>
- </ul>
-<?php } else {
- # allow raw HTML block to be defined by extensions
- print $cont;
- }
-?>
- </div>
- </div>
-<?php
- }
-
} // end of class
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index fdc1684d..95833e56 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -68,15 +68,36 @@ class MonoBookTemplate extends QuickTemplate {
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
+ // Generate additional footer links
+ $footerlinks = $this->data["footerlinks"];
+ // fold footerlinks into a single array using a bit of trickery
+ $footerlinks = call_user_func_array('array_merge', array_values($footerlinks));
+ // Generate additional footer icons
+ $footericons = $this->data["footericons"];
+ // Unset any icons which don't have an image
+ foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+ foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
+ if ( !is_string($footerIcon) && !isset($footerIcon["src"]) ) {
+ unset($footerIconsBlock[$footerIconKey]);
+ }
+ }
+ }
+ // Redo removal of any empty blocks
+ foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+ if ( count($footerIconsBlock) <= 0 ) {
+ unset($footericons[$footerIconsKey]);
+ }
+ }
+
$this->html( 'headelement' );
?><div id="globalWrapper">
-<div id="column-content"><div id="content" <?php $this->html("specialpageattributes") ?>>
+<div id="column-content"><div id="content"<?php $this->html("specialpageattributes") ?>>
<a id="top"></a>
<?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
<h1 id="firstHeading" class="firstHeading"><?php $this->html('title') ?></h1>
<div id="bodyContent">
- <h3 id="siteSub"><?php $this->msg('tagline') ?></h3>
+ <div id="siteSub"><?php $this->msg('tagline') ?></div>
<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
<?php if($this->data['undelete']) { ?>
<div id="contentSub2"><?php $this->html('undelete') ?></div>
@@ -164,19 +185,17 @@ class MonoBookTemplate extends QuickTemplate {
</div><!-- end of the left (by default at least) column -->
<div class="visualClear"></div>
<div id="footer"<?php $this->html('userlangattributes') ?>>
-<?php
-if($this->data['poweredbyico']) { ?>
- <div id="f-poweredbyico"><?php $this->html('poweredbyico') ?></div>
+<?php foreach ( $footericons as $blockName => $footerIcons ) { ?>
+ <div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+<?php foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->skin->makeFooterIcon( $icon ); ?>
+
<?php }
-if($this->data['copyrightico']) { ?>
- <div id="f-copyrightico"><?php $this->html('copyrightico') ?></div>
+?>
+ </div>
<?php }
// Generate additional footer links
- $footerlinks = array(
- 'lastmod', 'viewcount', 'numberofwatchingusers', 'credits', 'copyright',
- 'privacy', 'about', 'disclaimer', 'tagline',
- );
$validFooterLinks = array();
foreach( $footerlinks as $aLink ) {
if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
@@ -204,10 +223,11 @@ if($this->data['copyrightico']) { ?>
<?php $this->text( 'debug' ); ?>
-->
-<?php endif; ?>
-</body></html>
-<?php
- wfRestoreWarnings();
+<?php endif;
+
+ echo Html::closeElement( 'body' );
+ echo Html::closeElement( 'html' );
+ wfRestoreWarnings();
} // end of execute() method
/*************************************************************************************************/
@@ -228,7 +248,7 @@ if($this->data['copyrightico']) { ?>
'accesskey' => $this->skin->accesskey( 'search' )
) ); ?>
- <input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> /><?php if ($wgUseTwoButtonsSearchForm) { ?>&nbsp;
+ <input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> /><?php if ($wgUseTwoButtonsSearchForm) { ?>&#160;
<input type='submit' name="fulltext" class="searchButton" id="mw-searchButton" value="<?php $this->msg('searchbutton') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?> /><?php } else { ?>
<div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php } ?>
@@ -266,7 +286,7 @@ if($this->data['copyrightico']) { ?>
if($this->data['feeds']) { ?>
<li id="feedlinks"><?php foreach($this->data['feeds'] as $key => $feed) {
?><a id="<?php echo Sanitizer::escapeId( "feed-$key" ) ?>" href="<?php
- echo htmlspecialchars($feed['href']) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey('feed-'.$key) ?>><?php echo htmlspecialchars($feed['text'])?></a>&nbsp;
+ echo htmlspecialchars($feed['href']) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey('feed-'.$key) ?>><?php echo htmlspecialchars($feed['text'])?></a>&#160;
<?php } ?></li><?php
}
@@ -309,7 +329,8 @@ if($this->data['copyrightico']) { ?>
<ul>
<?php foreach($this->data['language_urls'] as $langlink) { ?>
<li class="<?php echo htmlspecialchars($langlink['class'])?>"><?php
- ?><a href="<?php echo htmlspecialchars($langlink['href']) ?>"><?php echo $langlink['text'] ?></a></li>
+ ?><a href="<?php echo htmlspecialchars($langlink['href']) ?>" title="<?php
+ echo htmlspecialchars($langlink['title']) ?>"><?php echo $langlink['text'] ?></a></li>
<?php } ?>
</ul>
</div>
@@ -326,7 +347,7 @@ if($this->data['copyrightico']) { ?>
<div class='pBody'>
<?php if ( is_array( $cont ) ) { ?>
<ul>
-<?php foreach($cont as $key => $val) { ?>
+<?php foreach($cont as $val) { ?>
<li id="<?php echo Sanitizer::escapeId($val['id']) ?>"<?php
if ( $val['active'] ) { ?> class="active" <?php }
?>><a href="<?php echo htmlspecialchars($val['href']) ?>"<?php echo $this->skin->tooltipAndAccesskey($val['id']) ?>><?php echo htmlspecialchars($val['text']) ?></a></li>
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
index d4f3f06f..6c599b21 100644
--- a/skins/Nostalgia.php
+++ b/skins/Nostalgia.php
@@ -57,11 +57,11 @@ class SkinNostalgia extends Skin {
}
function topLinks() {
- global $wgOut, $wgUser, $wgEnableUploads;
+ global $wgOut, $wgUser;
$sep = " |\n";
$s = $this->mainPageLink() . $sep
- . $this->specialLink( 'recentchanges' );
+ . $this->specialLink( 'Recentchanges' );
if ( $wgOut->isArticle() ) {
$s .= $sep . '<strong>' . $this->editThisPage() . '</strong>' . $sep . $this->historyLink();
@@ -71,9 +71,8 @@ class SkinNostalgia extends Skin {
$s .= $this->variantLinks();
$s .= $this->extensionTabLinks();
if ( $wgUser->isAnon() ) {
- $s .= $sep . $this->specialLink( 'userlogin' );
+ $s .= $sep . $this->specialLink( 'Userlogin' );
} else {
- $name = $wgUser->getName();
/* show user page and user talk links */
$s .= $sep . $this->link( $wgUser->getUserPage(), wfMsgHtml( 'mypage' ) );
$s .= $sep . $this->link( $wgUser->getTalkPage(), wfMsgHtml( 'mytalk' ) );
@@ -81,19 +80,20 @@ class SkinNostalgia extends Skin {
$s .= ' *';
}
/* show watchlist link */
- $s .= $sep . $this->specialLink( 'watchlist' );
+ $s .= $sep . $this->specialLink( 'Watchlist' );
/* show my contributions link */
$s .= $sep . $this->link(
SpecialPage::getSafeTitleFor( 'Contributions', $wgUser->getName() ),
wfMsgHtml( 'mycontris' ) );
/* show my preferences link */
- $s .= $sep . $this->specialLink( 'preferences' );
+ $s .= $sep . $this->specialLink( 'Preferences' );
/* show upload file link */
- if ( $wgEnableUploads ) {
- $s .= $sep . $this->specialLink( 'upload' );
+ if( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ $s .= $sep . $this->getUploadLink();
}
+
/* show log out link */
- $s .= $sep . $this->specialLink( 'userlogout' );
+ $s .= $sep . $this->specialLink( 'Userlogout' );
}
$s .= $sep . $this->specialPagesList();
diff --git a/skins/Simple.php b/skins/Simple.php
index 416dc3f6..87bb0b7e 100644
--- a/skins/Simple.php
+++ b/skins/Simple.php
@@ -21,48 +21,31 @@ class SkinSimple extends SkinTemplate {
var $skinname = 'simple', $stylename = 'simple',
$template = 'MonoBookTemplate', $useHeadElement = true;
- function setupSkinUserCss( OutputPage $out ){
- $out->addStyle( 'simple/main.css', 'screen' );
- $out->addStyle( 'simple/rtl.css', '', '', 'rtl' );
- }
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
- function reallyGenerateUserStylesheet() {
- global $wgUser;
- $s = '';
- if( ( $undopt = $wgUser->getOption( 'underline' ) ) != 2 ) {
- $underline = $undopt ? 'underline' : 'none';
- $s .= "a { text-decoration: $underline; }\n";
- }
- if( $wgUser->getOption( 'highlightbroken' ) ) {
- $s .= "a.new, #quickbar a.new { text-decoration: line-through; }\n";
- } else {
- $s .= <<<CSS
-a.new, #quickbar a.new,
-a.stub, #quickbar a.stub {
- color: inherit;
- text-decoration: inherit;
-}
-a.new:after, #quickbar a.new:after {
- content: "?";
- color: #CC2200;
- text-decoration: $underline;
-}
-a.stub:after, #quickbar a.stub:after {
- content: "!";
- color: #772233;
- text-decoration: $underline;
-}
-CSS;
- }
- if( $wgUser->getOption( 'justify' ) ) {
- $s .= "#article, #bodyContent { text-align: justify; }\n";
+ $out->addModuleStyles( 'skins.simple' );
+
+ /* Add some userprefs specific CSS styling */
+ global $wgUser, $wgContLang;
+ $rules = array();
+ $underline = "";
+
+ if ( $wgUser->getOption( 'underline' ) < 2 ) {
+ $underline = "text-decoration: " . $wgUser->getOption( 'underline' ) ? 'underline' : 'none' . ";";
}
- if( !$wgUser->getOption( 'showtoc' ) ) {
- $s .= "#toc { display: none; }\n";
+
+ /* Also inherits from resourceloader */
+ if( !$wgUser->getOption( 'highlightbroken' ) ) {
+ $rules[] = "a.new, a.stub { color: inherit; text-decoration: inherit;}";
+ $rules[] = "a.new:after { color: #CC2200; $underline;}";
+ $rules[] = "a.stub:after { $underline; }";
}
- if( !$wgUser->getOption( 'editsection' ) ) {
- $s .= ".editsection { display: none; }\n";
+ $style = implode( "\n", $rules );
+ if ( $wgContLang->getDir() === 'rtl' ) {
+ $style = CSSJanus::transform( $style, true, false );
}
- return $s;
+ $out->addInlineStyle( $style );
+
}
}
diff --git a/skins/Standard.php b/skins/Standard.php
index e57cfaf9..2ea6896d 100644
--- a/skins/Standard.php
+++ b/skins/Standard.php
@@ -20,34 +20,30 @@ class SkinStandard extends Skin {
*
*/
function setupSkinUserCss( OutputPage $out ){
- if ( 3 == $this->qbSetting() ) { # Floating left
- $out->addStyle( 'common/quickbar.css' );
- } elseif ( 4 == $this->qbSetting() ) { # Floating right
- $out->addStyle( 'common/quickbar-right.css' );
- }
- parent::setupSkinUserCss( $out );
- }
-
- /**
- *
- */
- function reallyGenerateUserStylesheet() {
- $s = parent::reallyGenerateUserStylesheet();
+ global $wgContLang;
$qb = $this->qbSetting();
+ $rules = array();
if ( 2 == $qb ) { # Right
- $s .= "#quickbar { position: absolute; top: 4px; right: 4px; " .
- "border-left: 2px solid #000000; }\n" .
- "#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }\n";
+ $rules[] = "#quickbar { position: absolute; top: 4px; right: 4px; border-left: 2px solid #000000; }";
+ $rules[] = "#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }";
} elseif ( 1 == $qb || 3 == $qb ) {
- $s .= "#quickbar { position: absolute; top: 4px; left: 4px; " .
- "border-right: 1px solid gray; }\n" .
- "#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }\n";
+ $rules[] = "#quickbar { position: absolute; top: 4px; left: 4px; border-right: 1px solid gray; }";
+ $rules[] = "#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }";
+ if( 3 == $qb ) {
+ $rules[] = "#quickbar { position: fixed; padding: 4px; }";
+ }
} elseif ( 4 == $qb ) {
- $s .= "#quickbar { border-right: 1px solid gray; }\n" .
- "#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }\n";
+ $rules[] = "#quickbar { position: fixed; right: 0px; top: 0px; padding: 4px;}";
+ $rules[] = "#quickbar { border-right: 1px solid gray; }";
+ $rules[] = "#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }";
}
- return $s;
+ $style = implode( "\n", $rules );
+ if ( $wgContLang->getDir() === 'rtl' ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ $out->addInlineStyle( $style );
+ parent::setupSkinUserCss( $out );
}
function doAfterContent() {
@@ -81,7 +77,7 @@ class SkinStandard extends Skin {
$s .= "\n<br />" . $wgLang->pipeList( array(
$this->mainPageLink(),
$this->aboutLink(),
- $this->specialLink( 'recentchanges' ),
+ $this->specialLink( 'Recentchanges' ),
$this->searchForm() ) )
. '<br /><span id="pagestats">' . $this->pageStats() . '</span>';
@@ -103,7 +99,6 @@ class SkinStandard extends Skin {
function quickBar() {
global $wgOut, $wgUser, $wgRequest, $wgContLang;
- global $wgEnableUploads, $wgRemoteUploads;
wfProfileIn( __METHOD__ );
@@ -131,7 +126,7 @@ class SkinStandard extends Skin {
}
if( $wgUser->isLoggedIn() ) {
- $s.= $this->specialLink( 'watchlist' ) ;
+ $s.= $this->specialLink( 'Watchlist' ) ;
$s .= $sep . $this->linkKnown(
SpecialPage::getTitleFor( 'Contributions' ),
wfMsg( 'mycontris' ),
@@ -187,7 +182,8 @@ class SkinStandard extends Skin {
}
$link = $this->mTitle->getText();
- if( $nstext = $wgContLang->getNsText( $tns ) ) { # add namespace if necessary
+ $nstext = $wgContLang->getNsText( $tns );
+ if( $nstext ) { # add namespace if necessary
$link = $nstext . ':' . $link;
}
@@ -215,10 +211,6 @@ class SkinStandard extends Skin {
array( 'known', 'noclasses' )
);
- #if( $tns%2 && $action!='edit' && !$wpPreview) {
- #$s.= '<br />'.$this->linkKnown( Title::newFromText( $wgTitle->getPrefixedText() ),wfMsg('postcomment'),array(),array('action'=>'edit','section'=>'new'));
- #}
-
/*
watching could cause problems in edit mode:
if user edits article, then loads "watch this article" in background and then saves
@@ -264,10 +256,11 @@ class SkinStandard extends Skin {
$s .= "\n<br /><hr class='sep' />";
}
- if ( $wgUser->isLoggedIn() && ( $wgEnableUploads || $wgRemoteUploads ) ) {
- $s .= $this->specialLink( 'upload' ) . $sep;
+ if( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ $s .= $this->getUploadLink() . $sep;
}
- $s .= $this->specialLink( 'specialpages' );
+
+ $s .= $this->specialLink( 'Specialpages' );
global $wgSiteSupportPage;
if( $wgSiteSupportPage ) {
diff --git a/skins/Vector.php b/skins/Vector.php
index b678b7e3..84f38d30 100644
--- a/skins/Vector.php
+++ b/skins/Vector.php
@@ -8,8 +8,9 @@
* @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) )
+if( !defined( 'MEDIAWIKI' ) ) {
die( -1 );
+}
/**
* SkinTemplate class for Vector skin
@@ -23,39 +24,41 @@ class SkinVector extends SkinTemplate {
/**
* Initializes output page and sets up skin-specific parameters
- * @param object $out Output page object to initialize
+ * @param $out OutputPage object to initialize
*/
public function initPage( OutputPage $out ) {
- global $wgStylePath, $wgJsMimeType, $wgStyleVersion, $wgScriptPath, $wgVectorExtraStyles;
-
- parent::initPage( $out );
+ global $wgLocalStylePath, $wgRequest;
- // Append skin-specific styles
- $out->addStyle( 'vector/main-rtl.css', 'screen', '', 'rtl' );
- $out->addStyle( 'vector/main-ltr.css', 'screen', '', 'ltr' );
+ parent::initPage( $out );
+
// Append CSS which includes IE only behavior fixes for hover support -
// this is better than including this in a CSS fille since it doesn't
// wait for the CSS file to load before fetching the HTC file.
- $out->addScript(
+ $min = $wgRequest->getFuzzyBool( 'debug' ) ? '' : '.min';
+ $out->addHeadItem( 'csshover',
'<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
- $wgStylePath .
- '/vector/csshover.htc")}</style><![endif]-->'
+ htmlspecialchars( $wgLocalStylePath ) .
+ "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
);
- // Add extra stylesheets
- // THIS IS ONLY USEFUL FOR EXPERIMENTING WITH DIFFERNT STYLE OPTIONS! THIS WILL BE REMOVED IN THE NEAR FUTURE.
- if ( is_array( $wgVectorExtraStyles ) ) {
- foreach ( $wgVectorExtraStyles as $style ) {
- $out->addStyle( 'vector/' . $style, 'screen' );
- }
- }
}
+
+ /**
+ * Load skin and user CSS files in the correct order
+ * fixes bug 22916
+ * @param $out OutputPage object
+ */
+ function setupSkinUserCss( OutputPage $out ){
+ parent::setupSkinUserCss( $out );
+ $out->addModuleStyles( 'skins.vector' );
+ }
+
/**
* Builds a structured array of links used for tabs and menus
* @return array
* @private
*/
function buildNavigationUrls() {
- global $wgContLang, $wgLang, $wgOut, $wgUser, $wgRequest, $wgArticle, $wgStylePath;
+ global $wgContLang, $wgLang, $wgOut, $wgUser, $wgRequest, $wgArticle;
global $wgDisableLangConversion, $wgVectorUseIconWatch;
wfProfileIn( __METHOD__ );
@@ -71,9 +74,10 @@ class SkinVector extends SkinTemplate {
$action = $wgRequest->getVal( 'action', 'view' );
$section = $wgRequest->getVal( 'section' );
+ $userCanRead = $this->mTitle->userCanRead();
+
// Checks if page is some kind of content
if( $this->iscontent ) {
-
// Gets page objects for the related namespaces
$subjectPage = $this->mTitle->getSubjectPage();
$talkPage = $this->mTitle->getTalkPage();
@@ -89,23 +93,22 @@ class SkinVector extends SkinTemplate {
} else {
$talkId = "{$subjectId}_talk";
}
- $currentId = $isTalk ? $talkId : $subjectId;
// Adds namespace links
$links['namespaces'][$subjectId] = $this->tabAction(
- $subjectPage, 'vector-namespace-' . $subjectId, !$isTalk, '', true
+ $subjectPage, 'nstab-' . $subjectId, !$isTalk, '', $userCanRead
);
$links['namespaces'][$subjectId]['context'] = 'subject';
$links['namespaces'][$talkId] = $this->tabAction(
- $talkPage, 'vector-namespace-talk', $isTalk, '', true
+ $talkPage, 'talk', $isTalk, '', $userCanRead
);
$links['namespaces'][$talkId]['context'] = 'talk';
// Adds view view link
- if ( $this->mTitle->exists() ) {
+ if ( $this->mTitle->exists() && $userCanRead ) {
$links['views']['view'] = $this->tabAction(
$isTalk ? $talkPage : $subjectPage,
- 'vector-view-view', ( $action == 'view' ), '', true
+ 'vector-view-view', ( $action == 'view' || $action == 'purge' ), '', true
);
}
@@ -113,8 +116,8 @@ class SkinVector extends SkinTemplate {
// Checks if user can...
if (
- // edit the current page
- $this->mTitle->quickUserCan( 'edit' ) &&
+ // read and edit the current page
+ $userCanRead && $this->mTitle->quickUserCan( 'edit' ) &&
(
// if it exists
$this->mTitle->exists() ||
@@ -136,11 +139,11 @@ class SkinVector extends SkinTemplate {
? wfMsg( 'vector-view-edit' )
: wfMsg( 'vector-view-create' ),
'href' =>
- $this->mTitle->getLocalUrl( $this->editUrlOptions() )
+ $this->mTitle->getLocalURL( $this->editUrlOptions() )
);
// Checks if this is a current rev of talk page and we should show a new
// section link
- if ( ( $isTalk && $wgArticle->isCurrent() ) || ( $wgOut->showNewSectionLink() ) ) {
+ if ( ( $isTalk && $wgArticle && $wgArticle->isCurrent() ) || ( $wgOut->showNewSectionLink() ) ) {
// Checks if we should ever show a new section link
if ( !$wgOut->forceHideNewSectionLink() ) {
// Adds new section link
@@ -148,20 +151,20 @@ class SkinVector extends SkinTemplate {
$links['views']['addsection'] = array(
'class' => 'collapsible ' . ( $section == 'new' ? 'selected' : false ),
'text' => wfMsg( 'vector-action-addsection' ),
- 'href' => $this->mTitle->getLocalUrl(
+ 'href' => $this->mTitle->getLocalURL(
'action=edit&section=new'
)
);
}
}
- // Checks if the page is known (some kind of viewable content)
- } elseif ( $this->mTitle->isKnown() ) {
+ // Checks if the page has some kind of viewable content
+ } elseif ( $this->mTitle->hasSourceText() && $userCanRead ) {
// Adds view source view link
$links['views']['viewsource'] = array(
'class' => ( $action == 'edit' ) ? 'selected' : false,
'text' => wfMsg( 'vector-view-viewsource' ),
'href' =>
- $this->mTitle->getLocalUrl( $this->editUrlOptions() )
+ $this->mTitle->getLocalURL( $this->editUrlOptions() )
);
}
wfProfileOut( __METHOD__ . '-edit' );
@@ -169,20 +172,20 @@ class SkinVector extends SkinTemplate {
wfProfileIn( __METHOD__ . '-live' );
// Checks if the page exists
- if ( $this->mTitle->exists() ) {
+ if ( $this->mTitle->exists() && $userCanRead ) {
// Adds history view link
$links['views']['history'] = array(
- 'class' => 'collapsible ' . ( ($action == 'history') ? 'selected' : false ),
+ 'class' => 'collapsible ' . ( ( $action == 'history' ) ? 'selected' : false ),
'text' => wfMsg( 'vector-view-history' ),
- 'href' => $this->mTitle->getLocalUrl( 'action=history' ),
+ 'href' => $this->mTitle->getLocalURL( 'action=history' ),
'rel' => 'archives',
);
if( $wgUser->isAllowed( 'delete' ) ) {
$links['actions']['delete'] = array(
- 'class' => ($action == 'delete') ? 'selected' : false,
+ 'class' => ( $action == 'delete' ) ? 'selected' : false,
'text' => wfMsg( 'vector-action-delete' ),
- 'href' => $this->mTitle->getLocalUrl( 'action=delete' )
+ 'href' => $this->mTitle->getLocalURL( 'action=delete' )
);
}
if ( $this->mTitle->quickUserCan( 'move' ) ) {
@@ -193,7 +196,7 @@ class SkinVector extends SkinTemplate {
'class' => $this->mTitle->isSpecial( 'Movepage' ) ?
'selected' : false,
'text' => wfMsg( 'vector-action-move' ),
- 'href' => $moveTitle->getLocalUrl()
+ 'href' => $moveTitle->getLocalURL()
);
}
@@ -201,22 +204,22 @@ class SkinVector extends SkinTemplate {
$this->mTitle->getNamespace() !== NS_MEDIAWIKI &&
$wgUser->isAllowed( 'protect' )
) {
- if ( !$this->mTitle->isProtected() ){
+ if ( !$this->mTitle->isProtected() ) {
$links['actions']['protect'] = array(
- 'class' => ($action == 'protect') ?
+ 'class' => ( $action == 'protect' ) ?
'selected' : false,
'text' => wfMsg( 'vector-action-protect' ),
'href' =>
- $this->mTitle->getLocalUrl( 'action=protect' )
+ $this->mTitle->getLocalURL( 'action=protect' )
);
} else {
$links['actions']['unprotect'] = array(
- 'class' => ($action == 'unprotect') ?
+ 'class' => ( $action == 'unprotect' ) ?
'selected' : false,
'text' => wfMsg( 'vector-action-unprotect' ),
'href' =>
- $this->mTitle->getLocalUrl( 'action=unprotect' )
+ $this->mTitle->getLocalURL( 'action=unprotect' )
);
}
}
@@ -226,7 +229,8 @@ class SkinVector extends SkinTemplate {
$wgUser->isAllowed( 'deletedhistory' ) &&
$wgUser->isAllowed( 'undelete' )
) {
- if( $n = $this->mTitle->isDeleted() ) {
+ $n = $this->mTitle->isDeleted();
+ if( $n ) {
$undelTitle = SpecialPage::getTitleFor( 'Undelete' );
$links['actions']['undelete'] = array(
'class' => false,
@@ -235,7 +239,7 @@ class SkinVector extends SkinTemplate {
array( 'parsemag' ),
$wgLang->formatNum( $n )
),
- 'href' => $undelTitle->getLocalUrl(
+ 'href' => $undelTitle->getLocalURL(
'target=' . urlencode( $this->thispage )
)
);
@@ -248,20 +252,20 @@ class SkinVector extends SkinTemplate {
) {
if ( !$this->mTitle->getRestrictions( 'create' ) ) {
$links['actions']['protect'] = array(
- 'class' => ($action == 'protect') ?
+ 'class' => ( $action == 'protect' ) ?
'selected' : false,
'text' => wfMsg( 'vector-action-protect' ),
'href' =>
- $this->mTitle->getLocalUrl( 'action=protect' )
+ $this->mTitle->getLocalURL( 'action=protect' )
);
} else {
$links['actions']['unprotect'] = array(
- 'class' => ($action == 'unprotect') ?
+ 'class' => ( $action == 'unprotect' ) ?
'selected' : false,
'text' => wfMsg( 'vector-action-unprotect' ),
'href' =>
- $this->mTitle->getLocalUrl( 'action=unprotect' )
+ $this->mTitle->getLocalURL( 'action=unprotect' )
);
}
}
@@ -279,7 +283,7 @@ class SkinVector extends SkinTemplate {
// Checks if the user is logged in
if ( $this->loggedin ) {
if ( $wgVectorUseIconWatch ) {
- $class = 'icon ';
+ $class = 'icon';
$place = 'views';
} else {
$class = '';
@@ -289,7 +293,7 @@ class SkinVector extends SkinTemplate {
$links[$place][$mode] = array(
'class' => $class . ( ( $action == 'watch' || $action == 'unwatch' ) ? ' selected' : false ),
'text' => wfMsg( $mode ), // uses 'watch' or 'unwatch' message
- 'href' => $this->mTitle->getLocalUrl( 'action=' . $mode )
+ 'href' => $this->mTitle->getLocalURL( 'action=' . $mode )
);
}
// This is instead of SkinTemplateTabs - which uses a flat array
@@ -299,9 +303,11 @@ class SkinVector extends SkinTemplate {
} else {
$links['namespaces']['special'] = array(
'class' => 'selected',
- 'text' => wfMsg( 'vector-namespace-special' ),
+ 'text' => wfMsg( 'nstab-special' ),
'href' => $wgRequest->getRequestURL()
);
+ // Equiv to SkinTemplateBuildContentActionUrlsAfterSpecialPage
+ wfRunHooks( 'SkinTemplateNavigation::SpecialPage', array( &$this, &$links ) );
}
// Gets list of language variants
@@ -328,6 +334,9 @@ class SkinVector extends SkinTemplate {
}
}
+ // Equiv to SkinTemplateContentActions
+ wfRunHooks( 'SkinTemplateNavigation::Universal', array( &$this, &$links ) );
+
wfProfileOut( __METHOD__ );
return $links;
@@ -353,7 +362,7 @@ class VectorTemplate extends QuickTemplate {
* Outputs the entire contents of the XHTML page
*/
public function execute() {
- global $wgRequest, $wgOut, $wgContLang;
+ global $wgRequest, $wgLang;
$this->skin = $this->data['skin'];
$action = $wgRequest->getText( 'action' );
@@ -372,26 +381,26 @@ class VectorTemplate extends QuickTemplate {
}
$nav[$section][$key]['attributes'] =
' id="' . Sanitizer::escapeId( $xmlID ) . '"';
- if ( $nav[$section][$key]['class'] ) {
+ if ( $nav[$section][$key]['class'] ) {
$nav[$section][$key]['attributes'] .=
' class="' . htmlspecialchars( $link['class'] ) . '"';
unset( $nav[$section][$key]['class'] );
- }
+ }
// We don't want to give the watch tab an accesskey if the page
// is being edited, because that conflicts with the accesskey on
// the watch checkbox. We also don't want to give the edit tab
// an accesskey, because that's fairly superfluous and conflicts
// with an accesskey (Ctrl-E) often used for editing in Safari.
- if (
+ if (
in_array( $action, array( 'edit', 'submit' ) ) &&
in_array( $key, array( 'edit', 'watch', 'unwatch' ) )
) {
- $nav[$section][$key]['key'] =
+ $nav[$section][$key]['key'] =
$this->skin->tooltip( $xmlID );
- } else {
- $nav[$section][$key]['key'] =
+ } else {
+ $nav[$section][$key]['key'] =
$this->skin->tooltipAndAccesskey( $xmlID );
- }
+ }
}
}
$this->data['namespace_urls'] = $nav['namespaces'];
@@ -411,21 +420,8 @@ class VectorTemplate extends QuickTemplate {
}
// Generate additional footer links
- $footerlinks = array(
- 'info' => array(
- 'lastmod',
- 'viewcount',
- 'numberofwatchingusers',
- 'credits',
- 'copyright',
- 'tagline',
- ),
- 'places' => array(
- 'privacy',
- 'about',
- 'disclaimer',
- ),
- );
+ $footerlinks = $this->data["footerlinks"];
+
// Reduce footer links down to only those which are being used
$validFooterLinks = array();
foreach( $footerlinks as $category => $links ) {
@@ -436,8 +432,26 @@ class VectorTemplate extends QuickTemplate {
}
}
}
+
+ // Generate additional footer icons
+ $footericons = $this->data["footericons"];
+ // Unset any icons which don't have an image
+ foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+ foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
+ if ( !is_string($footerIcon) && !isset($footerIcon["src"]) ) {
+ unset($footerIconsBlock[$footerIconKey]);
+ }
+ }
+ }
+ // Redo removal of any empty blocks
+ foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+ if ( count($footerIconsBlock) <= 0 ) {
+ unset($footericons[$footerIconsKey]);
+ }
+ }
+
// Reverse horizontally rendered navigation elements
- if ( $wgContLang->isRTL() ) {
+ if ( $wgLang->isRTL() ) {
$this->data['view_urls'] =
array_reverse( $this->data['view_urls'] );
$this->data['namespace_urls'] =
@@ -451,7 +465,7 @@ class VectorTemplate extends QuickTemplate {
<div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
<!-- content -->
- <div id="content" <?php $this->html('specialpageattributes') ?>>
+ <div id="content"<?php $this->html('specialpageattributes') ?>>
<a id="top"></a>
<div id="mw-js-message" style="display:none;"<?php $this->html('userlangattributes') ?>></div>
<?php if ( $this->data['sitenotice'] ): ?>
@@ -465,7 +479,7 @@ class VectorTemplate extends QuickTemplate {
<!-- bodyContent -->
<div id="bodyContent">
<!-- tagline -->
- <h3 id="siteSub"><?php $this->msg( 'tagline' ) ?></h3>
+ <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
<!-- /tagline -->
<!-- subtitle -->
<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html( 'subtitle' ) ?></div>
@@ -538,21 +552,25 @@ class VectorTemplate extends QuickTemplate {
</ul>
<?php endif; ?>
<?php endforeach; ?>
- <ul id="footer-icons" class="noprint">
- <?php if ( $this->data['poweredbyico'] ): ?>
- <li id="footer-icon-poweredby"><?php $this->html( 'poweredbyico' ) ?></li>
- <?php endif; ?>
- <?php if ( $this->data['copyrightico'] ): ?>
- <li id="footer-icon-copyright"><?php $this->html( 'copyrightico' ) ?></li>
- <?php endif; ?>
- </ul>
+<?php if ( count( $footericons ) > 0 ): ?>
+ <ul id="footer-icons" class="noprint">
+<?php foreach ( $footericons as $blockName => $footerIcons ): ?>
+ <li id="footer-<?php echo htmlspecialchars($blockName); ?>ico">
+<?php foreach ( $footerIcons as $icon ): ?>
+ <?php echo $this->skin->makeFooterIcon( $icon ); ?>
+
+<?php endforeach; ?>
+ </li>
+<?php endforeach; ?>
+ </ul>
+ <?php endif; ?>
<div style="clear:both"></div>
</div>
<!-- /footer -->
+ <?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
<!-- fixalpha -->
<script type="<?php $this->text('jsmimetype') ?>"> if ( window.isMSIE55 ) fixalpha(); </script>
<!-- /fixalpha -->
- <?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
<?php $this->html( 'reporttime' ) ?>
<?php if ( $this->data['debug'] ): ?>
<!-- Debug output: <?php $this->text( 'debug' ); ?> -->
@@ -625,7 +643,7 @@ class VectorTemplate extends QuickTemplate {
<div class="body">
<ul>
<?php foreach ( $this->data['language_urls'] as $langlink ): ?>
- <li class="<?php echo htmlspecialchars( $langlink['class'] ) ?>"><a href="<?php echo htmlspecialchars( $langlink['href'] ) ?>"><?php echo $langlink['text'] ?></a></li>
+ <li class="<?php echo htmlspecialchars( $langlink['class'] ) ?>"><a href="<?php echo htmlspecialchars( $langlink['href'] ) ?>" title="<?php echo htmlspecialchars( $langlink['title'] ) ?>"><?php echo $langlink['text'] ?></a></li>
<?php endforeach; ?>
</ul>
</div>
@@ -640,7 +658,7 @@ class VectorTemplate extends QuickTemplate {
<div class="body">
<?php if ( is_array( $content ) ): ?>
<ul>
- <?php foreach( $content as $key => $val ): ?>
+ <?php foreach( $content as $val ): ?>
<li id="<?php echo Sanitizer::escapeId( $val['id'] ) ?>"<?php if ( $val['active'] ): ?> class="active" <?php endif; ?>><a href="<?php echo htmlspecialchars( $val['href'] ) ?>"<?php echo $this->skin->tooltipAndAccesskey( $val['id'] ) ?>><?php echo htmlspecialchars( $val['text'] ) ?></a></li>
<?php endforeach; ?>
</ul>
@@ -661,14 +679,14 @@ class VectorTemplate extends QuickTemplate {
* when UI is in RTL mode
*/
private function renderNavigation( $elements ) {
- global $wgContLang, $wgVectorUseSimpleSearch, $wgStylePath;
+ global $wgVectorUseSimpleSearch, $wgVectorShowVariantName, $wgUser;
// If only one element was given, wrap it in an array, allowing more
// flexible arguments
if ( !is_array( $elements ) ) {
$elements = array( $elements );
// If there's a series of elements, reverse them when in RTL mode
- } else if ( $wgContLang->isRTL() ) {
+ } else if ( wfUILang()->isRTL() ) {
$elements = array_reverse( $elements );
}
// Render elements
@@ -680,8 +698,8 @@ class VectorTemplate extends QuickTemplate {
<div id="p-namespaces" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
<h5><?php $this->msg('namespaces') ?></h5>
<ul<?php $this->html('userlangattributes') ?>>
- <?php foreach ($this->data['namespace_urls'] as $key => $link ): ?>
- <li <?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><span><?php echo htmlspecialchars( $link['text'] ) ?></span></a></li>
+ <?php foreach ($this->data['namespace_urls'] as $link ): ?>
+ <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
<?php endforeach; ?>
</ul>
</div>
@@ -690,10 +708,19 @@ class VectorTemplate extends QuickTemplate {
case 'VARIANTS':
?>
<div id="p-variants" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <?php if ( $wgVectorShowVariantName ): ?>
+ <h4>
+ <?php foreach ( $this->data['variant_urls'] as $link ): ?>
+ <?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
+ <?php echo htmlspecialchars( $link['text'] ) ?>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ </h4>
+ <?php endif; ?>
<h5><span><?php $this->msg('variants') ?></span><a href="#"></a></h5>
<div class="menu">
<ul<?php $this->html('userlangattributes') ?>>
- <?php foreach ($this->data['variant_urls'] as $key => $link ): ?>
+ <?php foreach ( $this->data['variant_urls'] as $link ): ?>
<li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
<?php endforeach; ?>
</ul>
@@ -706,8 +733,8 @@ class VectorTemplate extends QuickTemplate {
<div id="p-views" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
<h5><?php $this->msg('views') ?></h5>
<ul<?php $this->html('userlangattributes') ?>>
- <?php foreach ($this->data['view_urls'] as $key => $link ): ?>
- <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo (array_key_exists('img',$link) ? '<img src="'.$link['img'].'" alt="'.$link['text'].'" />' : '<span>'.htmlspecialchars( $link['text'] ).'</span>') ?></a></li>
+ <?php foreach ( $this->data['view_urls'] as $link ): ?>
+ <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo (array_key_exists('img',$link) ? '<img src="'.$link['img'].'" alt="'.$link['text'].'" />' : htmlspecialchars( $link['text'] ) ) ?></a></span></li>
<?php endforeach; ?>
</ul>
</div>
@@ -719,7 +746,7 @@ class VectorTemplate extends QuickTemplate {
<h5><span><?php $this->msg('actions') ?></span><a href="#"></a></h5>
<div class="menu">
<ul<?php $this->html('userlangattributes') ?>>
- <?php foreach ($this->data['action_urls'] as $key => $link ): ?>
+ <?php foreach ($this->data['action_urls'] as $link ): ?>
<li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
<?php endforeach; ?>
</ul>
@@ -732,7 +759,7 @@ class VectorTemplate extends QuickTemplate {
<div id="p-personal" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
<h5><?php $this->msg('personaltools') ?></h5>
<ul<?php $this->html('userlangattributes') ?>>
- <?php foreach($this->data['personal_urls'] as $key => $item): ?>
+ <?php foreach($this->data['personal_urls'] as $item): ?>
<li <?php echo $item['attributes'] ?>><a href="<?php echo htmlspecialchars($item['href']) ?>"<?php echo $item['key'] ?><?php if(!empty($item['class'])): ?> class="<?php echo htmlspecialchars($item['class']) ?>"<?php endif; ?>><?php echo htmlspecialchars($item['text']) ?></a></li>
<?php endforeach; ?>
</ul>
@@ -745,10 +772,15 @@ class VectorTemplate extends QuickTemplate {
<h5<?php $this->html('userlangattributes') ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h5>
<form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
<input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
- <?php if ( $wgVectorUseSimpleSearch ): ?>
+ <?php if ( $wgVectorUseSimpleSearch && $wgUser->getOption( 'vector-simplesearch' ) ): ?>
<div id="simpleSearch">
+ <?php if ( $this->data['rtl'] ): ?>
+ <button id="searchButton" type='submit' name='button' <?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?>><img src="<?php echo $this->skin->getSkinStylePath('images/search-rtl.png'); ?>" alt="<?php $this->msg( 'searchbutton' ) ?>" /></button>
+ <?php endif; ?>
<input id="searchInput" name="search" type="text" <?php echo $this->skin->tooltipAndAccesskey( 'search' ); ?> <?php if( isset( $this->data['search'] ) ): ?> value="<?php $this->text( 'search' ) ?>"<?php endif; ?> />
- <button id="searchButton" type='submit' name='button' <?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?>>&nbsp;</button>
+ <?php if ( !$this->data['rtl'] ): ?>
+ <button id="searchButton" type='submit' name='button' <?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?>><img src="<?php echo $this->skin->getSkinStylePath('images/search-ltr.png'); ?>" alt="<?php $this->msg( 'searchbutton' ) ?>" /></button>
+ <?php endif; ?>
</div>
<?php else: ?>
<input id="searchInput" name="search" type="text" <?php echo $this->skin->tooltipAndAccesskey( 'search' ); ?> <?php if( isset( $this->data['search'] ) ): ?> value="<?php $this->text( 'search' ) ?>"<?php endif; ?> />
diff --git a/skins/archlinux/IE50Fixes.css b/skins/archlinux/IE50Fixes.css
index 26c3dc97..a054a91f 100644
--- a/skins/archlinux/IE50Fixes.css
+++ b/skins/archlinux/IE50Fixes.css
@@ -2,22 +2,22 @@
** IE5.0 Fix Stylesheet
*/
-#column-content {
+div#column-content {
margin: 0 !important;
float: none;
}
-#column-content #content {
- margin-top: 3em;
+div#column-content #content {
+ margin-top: 3em;
height: 1%;
}
-#column-one {
+div#column-one {
position: absolute;
overflow: visible;
top: 0;
left: 0;
z-index: 3;
}
-#footer {
+div#footer {
margin: 0 0 0 13.6em;
}
diff --git a/skins/archlinux/IE55Fixes.css b/skins/archlinux/IE55Fixes.css
index 637daae1..f3c2cde7 100644
--- a/skins/archlinux/IE55Fixes.css
+++ b/skins/archlinux/IE55Fixes.css
@@ -1,25 +1,25 @@
/* IE5.5/win- only fixes */
-#column-content {
- float: none;
+div#column-content {
+ float: none;
margin-left: 0;
height: 1%;
}
-#column-content #content {
+div#column-content #content {
position: relative;
z-index: 5;
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
-#column-one {
+div#column-one {
position: absolute;
top: 0;
left: 0;
z-index: 4;
width: 100%;
}
-#footer {
+div#footer {
margin-left: 13.6em;
border-left: 1px solid #fabd23;
}
diff --git a/skins/archlinux/IE60Fixes.css b/skins/archlinux/IE60Fixes.css
index e6e447f6..56e0a16b 100644
--- a/skins/archlinux/IE60Fixes.css
+++ b/skins/archlinux/IE60Fixes.css
@@ -1,23 +1,23 @@
/* 6.0 - only fixes */
-/* content area */
+/* content area */
/* workaround for various ie float bugs */
-#column-content {
- float: none;
+div#column-content {
+ float: none;
margin-left: 0;
height: 1%;
}
-#column-content #content {
+div#column-content div#content {
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
-#column-one {
+div#column-one {
position: absolute;
top: 0;
left: 0;
z-index: 4;
}
-#footer {
+div#footer {
margin-left: 13.6em;
border-left: 1px solid #fabd23;
}
diff --git a/skins/archlinux/IE70Fixes.css b/skins/archlinux/IE70Fixes.css
index 00145860..91b39efd 100644
--- a/skins/archlinux/IE70Fixes.css
+++ b/skins/archlinux/IE70Fixes.css
@@ -1,15 +1,15 @@
/* 7.0 - only fixes */
-/* content area */
+/* content area */
/* workaround for various ie float bugs */
/* This bit is needed to make links clickable... WTF */
-#column-content #content {
+div#column-content div#content {
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
-.rtl #column-one {
+.rtl div#column-one {
/* For some reason it tries to inherit the padding-top into every div,
* and I can't figure out how to get it back off.
* Margin works correctly for this use, though.
@@ -78,7 +78,7 @@ div.tleft {
*/
-#footer li {
+div#footer li {
/* Work around bug with inline <li> tags with right margins and nowrap */
margin-right: 0;
}
diff --git a/skins/archlinux/Opera6Fixes.css b/skins/archlinux/Opera6Fixes.css
index 2a3d78f8..77dec095 100644
--- a/skins/archlinux/Opera6Fixes.css
+++ b/skins/archlinux/Opera6Fixes.css
@@ -1,5 +1,5 @@
/* opera 6 fixes */
-#column-one {
+div#column-one {
position: relative;
max-width: 11.7em;
}
diff --git a/skins/archlinux/audio.png b/skins/archlinux/audio.png
index 1c56bdc8..c22c05c3 100644
--- a/skins/archlinux/audio.png
+++ b/skins/archlinux/audio.png
Binary files differ
diff --git a/skins/archlinux/document.png b/skins/archlinux/document.png
index b48138e9..b7648b38 100644
--- a/skins/archlinux/document.png
+++ b/skins/archlinux/document.png
Binary files differ
diff --git a/skins/archlinux/external-rtl.png b/skins/archlinux/external-rtl.png
index c5cd84db..9901d8f1 100644
--- a/skins/archlinux/external-rtl.png
+++ b/skins/archlinux/external-rtl.png
Binary files differ
diff --git a/skins/archlinux/external.png b/skins/archlinux/external.png
index 419c06fb..acf260fc 100644
--- a/skins/archlinux/external.png
+++ b/skins/archlinux/external.png
Binary files differ
diff --git a/skins/archlinux/main.css b/skins/archlinux/main.css
index 727355bb..d2330eba 100644
--- a/skins/archlinux/main.css
+++ b/skins/archlinux/main.css
@@ -9,22 +9,22 @@
** All you guys rock :)
*/
-#column-content {
+div#column-content {
width: 100%;
float: right;
margin: 0 0 .6em -12.2em;
padding: 0;
}
-#content {
+div#content {
margin: 2.8em 0 0 12.2em;
padding: 0 1em 1em 1em;
position: relative;
z-index: 2;
}
-#column-one {
+div#column-one {
padding-top: 160px;
}
-#content {
+div#content {
background: white;
color: black;
border: 1px solid #aaa;
@@ -48,7 +48,7 @@ body {
}
/* scale back up to a sane default */
-#globalWrapper {
+div#globalWrapper {
font-size: 127%;
width: 100%;
margin: 0;
@@ -59,14 +59,6 @@ body {
table {
font-size: 100%;
- color: black;
- /* we don't want the bottom borders of <h2>s to be visible through
- floated tables */
- background-color: white;
-}
-fieldset table {
- /* but keep table layouts in forms clean... */
- background: none;
}
a {
text-decoration: none;
@@ -86,7 +78,7 @@ a.stub {
color: #772233;
}
a.new, #p-personal a.new {
- color: #ba0000;
+ color: #cc2200;
}
a.new:visited, #p-personal a.new:visited {
color: #a55858;
@@ -117,6 +109,7 @@ h1, h2, h3, h4, h5, h6 {
background: none;
font-weight: normal;
margin: 0;
+ overflow: hidden;
padding-top: .5em;
padding-bottom: .17em;
border-bottom: 1px solid #aaa;
@@ -135,7 +128,7 @@ h4 { font-size: 116%; }
h4 .editsection { font-size: 86%; font-weight: normal; }
h5 { font-size: 100%; }
h5 .editsection { font-weight: normal; }
-h6 { font-size: 80%; }
+h6 { font-size: 80%; }
h6 .editsection { font-size: 125%; font-weight: normal; }
ul {
@@ -202,12 +195,6 @@ input.historysubmit {
select {
vertical-align: top;
}
-abbr, acronym, .explain {
- border-bottom: 1px dotted black;
- color: black;
- background: none;
- cursor: help;
-}
q {
font-family: Times, "Times New Roman", serif;
font-style: italic;
@@ -404,8 +391,6 @@ div.floatleft p { font-style: italic; }
/* thumbnails */
div.thumb {
margin-bottom: .5em;
- border-style: solid;
- border-color: white;
width: auto;
}
div.thumbinner {
@@ -439,13 +424,12 @@ div.magnify a, div.magnify img {
div.tright {
clear: right;
float: right;
- border-width: .5em 0 .8em 1.4em;
+ margin: .5em 0 1.3em 1.4em;
}
div.tleft {
float: left;
clear: left;
- margin-right: .5em;
- border-width: .5em 1.4em .8em 0;
+ margin: .5em 1.4em 1.3em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
@@ -826,7 +810,6 @@ li#pt-login {
}
#p-cactions li.selected a {
z-index: 3;
- padding: 0 1em .2em!important;
background-color: white;
}
#p-cactions .new a {
@@ -894,7 +877,7 @@ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
/*
** footer
*/
-#footer {
+div#footer {
background-color: white;
border-top: 1px solid #fabd23;
border-bottom: 1px solid #fabd23;
@@ -903,7 +886,7 @@ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
text-align: center;
font-size: 90%;
}
-#footer li {
+div#footer li {
display: inline;
margin: 0 1.3em;
}
@@ -991,7 +974,7 @@ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
}
.prefsection legend {
- font-weight: bold;
+ font-weight: bold;
}
.prefsection table, .prefsection legend {
background-color: #F9F9F9;
@@ -1092,8 +1075,8 @@ div#userloginForm .captcha {
/* more IE fixes */
/* float/negative margin brokenness */
-* html #footer {margin-top: 0;}
-* html #column-content {
+* html div#footer {margin-top: 0;}
+* html div#column-content {
display: inline;
margin-bottom: 0;
}
@@ -1101,15 +1084,15 @@ div#userloginForm .captcha {
#pagehistory li.selected { position: relative; }
/* Mac IE 5.0 fix; floated content turns invisible */
-* > html #column-content {
+* > html div#column-content {
float: none;
}
-* > html #column-one {
+* > html div#column-one {
position: absolute;
left: 0;
top: 0;
}
-* > html #footer {
+* > html div#footer {
margin-left: 13.2em;
}
.redirectText {
@@ -1121,7 +1104,6 @@ div#userloginForm .captcha {
display: none;
}
-
div.patrollink {
clear: both;
}
@@ -1135,16 +1117,6 @@ span.updatedmarker {
background-color: #0f0;
}
-.previewnote {
- color: #c00;
- margin-bottom: 1em;
-}
-
-.previewnote p {
- text-indent: 3em;
- margin: 0.8em 0;
-}
-
.editExternally {
border: 1px solid gray;
background-color: #ffffff;
@@ -1164,10 +1136,6 @@ span.updatedmarker {
text-indent: -2em;
}
-input#wpSummary {
- width: 80%;
-}
-
/* @bug 1714 */
input#wpSave, input#wpDiff {
margin-right: 0.33em;
@@ -1177,30 +1145,6 @@ input#wpSave, input#wpDiff {
font-weight: bold;
}
-/* Classes for article validation */
-
-table.revisionform_default {
- border: 1px solid #000000;
-}
-
-table.revisionform_focus {
- border: 1px solid #000000;
- background-color:#00BBFF;
-}
-
-tr.revision_tr_default {
- background-color:#EEEEEE;
-}
-
-tr.revision_tr_first {
- background-color:#DDDDDD;
-}
-
-p.revision_saved {
- color: green;
- font-weight:bold;
-}
-
/* noarticletext */
div.noarticletext {
border: 1px solid #ccc;
@@ -1244,24 +1188,24 @@ div#searchTargetHide {
}
div.multipageimagenavbox {
- border: solid 1px silver;
- padding: 4px;
- margin: 1em;
- background: #f0f0f0;
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
}
div.multipageimagenavbox div.thumb {
- border: none;
- margin-left: 2em;
- margin-right: 2em;
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
}
div.multipageimagenavbox hr {
- margin: 6px;
+ margin: 6px;
}
table.multipageimage td {
- text-align: center;
+ text-align: center;
}
.templatesUsed { margin-top: 1.5em; }
@@ -1306,3 +1250,8 @@ div.mw-lag-warn-high {
.no-text-transform {
text-transform: none;
}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 127%;
+} \ No newline at end of file
diff --git a/skins/archlinux/news_icon.png b/skins/archlinux/news_icon.png
index dd1541d1..b8f5abb5 100644
--- a/skins/archlinux/news_icon.png
+++ b/skins/archlinux/news_icon.png
Binary files differ
diff --git a/skins/archlinux/rtl.css b/skins/archlinux/rtl.css
index b9bf43c0..52507676 100644
--- a/skins/archlinux/rtl.css
+++ b/skins/archlinux/rtl.css
@@ -26,11 +26,11 @@ body {
direction: rtl;
unicode-bidi: embed;
}
-#column-content {
+div#column-content {
margin: 0 -12.2em 0 0;
float: left;
}
-#column-content #content{
+div#column-content div#content{
margin-left: 0;
margin-right: 12.2em;
border-right: 1px solid #aaaaaa;
@@ -153,7 +153,7 @@ li#ca-watch {
background: none !important;
}
*/
-#footer {
+div#footer {
clear: both;
}
#f-poweredbyico {
@@ -164,22 +164,22 @@ li#ca-watch {
float: right;
height: 1%;
}
-* html #footer {
+* html div#footer {
margin-left: 0;
margin-right: 13.6em;
border-left: 0;
border-right: 1px solid #fabd23;
-}
-* html #column-content {
+}
+* html div#column-content {
float: none;
margin-left: 0;
margin-right: 0;
}
-* html #column-content #content {
+* html div#column-content div#content {
margin-left: 0;
margin-top: 3em;
}
-* html #column-one { right: 0; }
+* html div#column-one { right: 0; }
/* js pref toc */
@@ -227,13 +227,13 @@ table.filehistory th {
text-align: right;
}
-/* Special:Allpages styling */
+/* Special:AllPages styling */
td.mw-allpages-nav, p.mw-allpages-nav, td.mw-allpages-alphaindexline {
text-align: left;
}
-/* Special:Prefixindex styling */
-td#mw-prefixindex-nav-form {
+/* Special:PrefixIndex styling */
+td#mw-prefixindex-nav-form {
text-align: left;
}
diff --git a/skins/archlinux/wiki-indexed.png b/skins/archlinux/wiki-indexed.png
index 189a2ae3..4b80e3ae 100644
--- a/skins/archlinux/wiki-indexed.png
+++ b/skins/archlinux/wiki-indexed.png
Binary files differ
diff --git a/skins/archlinux/wiki.png b/skins/archlinux/wiki.png
index 44389389..70eee796 100644
--- a/skins/archlinux/wiki.png
+++ b/skins/archlinux/wiki.png
Binary files differ
diff --git a/skins/chick/main.css b/skins/chick/main.css
index ac61b91b..961d1c0a 100644
--- a/skins/chick/main.css
+++ b/skins/chick/main.css
@@ -47,6 +47,7 @@ h1, h2, h3, h4, h5, h6 {
background: none;
font-weight: normal;
margin: 0;
+ overflow: hidden;
padding-top: 0.5em;
padding-bottom: 0.17em;
border-bottom: 1px solid #aaaaaa;
@@ -145,12 +146,6 @@ select {
color: black;
vertical-align: top;
}
-abbr, acronym, .explain {
- border-bottom: 1px dotted black;
- color: black;
- background: none;
- cursor: help;
-}
q {
font-family: Times, "Times New Roman", serif;
font-style: italic;
@@ -279,7 +274,6 @@ div.floatleft p { font-style: italic; }
/* thumbnails */
div.thumb {
margin-bottom: 0.5em;
- border-style: solid; border-color: white;
width: auto;
}
div.thumbinner {
@@ -312,13 +306,12 @@ div.magnify a, div.magnify img {
div.tright {
clear: right;
float: right;
- border-width: 0.5em 0 0.8em 1.4em;
+ margin: 0.5em 0 1.3em 1.4em;
}
div.tleft {
float: left;
clear: left;
- margin-right:0.5em;
- border-width: 0.5em 1.4em 0.8em 0;
+ margin: 0.5em 1.4em 1.3em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
diff --git a/skins/common/IEFixes.js b/skins/common/IEFixes.js
index 762d7a78..ba4dc66b 100644
--- a/skins/common/IEFixes.js
+++ b/skins/common/IEFixes.js
@@ -1,23 +1,23 @@
// IE fixes javascript
-var isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
-var doneIETransform;
-var doneIEAlphaFix;
+window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
+window.doneIETransform = undefined;
+window.doneIEAlphaFix = undefined;
-if ( document.attachEvent ) {
- document.attachEvent( 'onreadystatechange', hookit );
-}
-
-function hookit() {
+window.hookit = function() {
if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) {
doneIETransform = true;
relativeforfloats();
fixalpha();
}
+};
+
+if ( document.attachEvent ) {
+ document.attachEvent( 'onreadystatechange', window.hookit );
}
// png alpha transparency fixes
-function fixalpha( logoId ) {
+window.fixalpha = function( logoId ) {
// bg
if ( isMSIE55 && !doneIEAlphaFix ) {
var plogo = document.getElementById( logoId || 'p-logo' );
@@ -61,10 +61,10 @@ function fixalpha( logoId ) {
linkFix.style.width = '100%';
}
}
-}
+};
// fix ie6 disappering float bug
-function relativeforfloats() {
+window.relativeforfloats = function() {
var bc = document.getElementById( 'bodyContent' );
if ( bc ) {
var tables = bc.getElementsByTagName( 'table' );
@@ -72,8 +72,9 @@ function relativeforfloats() {
}
setrelative( tables );
setrelative( divs );
-}
-function setrelative( nodes ) {
+};
+
+window.setrelative = function( nodes ) {
var i = 0;
while ( i < nodes.length ) {
if( ( ( nodes[i].style.float && nodes[i].style.float != ( 'none' ) ||
@@ -84,7 +85,7 @@ function setrelative( nodes ) {
}
i++;
}
-}
+};
// Expand links for printing
String.prototype.hasClass = function( classWanted ) {
@@ -95,11 +96,11 @@ String.prototype.hasClass = function( classWanted ) {
}
}
return false;
-}
+};
-var expandedURLs;
+window.expandedURLs = undefined;
-onbeforeprint = function() {
+window.onbeforeprint = function() {
expandedURLs = [];
var contentEl = document.getElementById( 'content' );
@@ -117,12 +118,12 @@ onbeforeprint = function() {
}
}
}
-}
+};
-onafterprint = function() {
+window.onafterprint = function() {
for ( var i = 0; i < expandedURLs.length; i++ ) {
if ( expandedURLs[i] ) {
expandedURLs[i].removeNode( true );
}
}
-}
+};
diff --git a/skins/common/ajax.js b/skins/common/ajax.js
index afcfa708..1cad75ed 100644
--- a/skins/common/ajax.js
+++ b/skins/common/ajax.js
@@ -1,167 +1,177 @@
// remote scripting library
// (c) copyright 2005 modernmethod, inc
-var sajax_debug_mode = false;
-var sajax_request_type = "GET";
+window.sajax_debug_mode = false;
+window.sajax_request_type = 'GET';
/**
-* if sajax_debug_mode is true, this function outputs given the message into
-* the element with id = sajax_debug; if no such element exists in the document,
-* it is injected.
-*/
-function sajax_debug(text) {
+ * if sajax_debug_mode is true, this function outputs given the message into
+ * the element with id = sajax_debug; if no such element exists in the document,
+ * it is injected.
+ */
+window.sajax_debug = function(text) {
if (!sajax_debug_mode) return false;
- var e= document.getElementById('sajax_debug');
+ var e = document.getElementById( 'sajax_debug' );
- if (!e) {
- e= document.createElement("p");
- e.className= 'sajax_debug';
- e.id= 'sajax_debug';
+ if ( !e ) {
+ e = document.createElement( 'p' );
+ e.className = 'sajax_debug';
+ e.id = 'sajax_debug';
- var b= document.getElementsByTagName("body")[0];
+ var b = document.getElementsByTagName( 'body' )[0];
- if (b.firstChild) b.insertBefore(e, b.firstChild);
- else b.appendChild(e);
+ if ( b.firstChild ) {
+ b.insertBefore( e, b.firstChild );
+ } else {
+ b.appendChild( e );
+ }
}
- var m= document.createElement("div");
+ var m = document.createElement( 'div' );
m.appendChild( document.createTextNode( text ) );
e.appendChild( m );
return true;
-}
+};
/**
-* compatibility wrapper for creating a new XMLHttpRequest object.
-*/
-function sajax_init_object() {
- sajax_debug("sajax_init_object() called..")
+ * Compatibility wrapper for creating a new XMLHttpRequest object.
+ */
+window.sajax_init_object = function() {
+ sajax_debug( 'sajax_init_object() called..' );
var A;
try {
// Try the new style before ActiveX so we don't
// unnecessarily trigger warnings in IE 7 when
// set to prompt about ActiveX usage
A = new XMLHttpRequest();
- } catch (e) {
+ } catch ( e ) {
try {
- A=new ActiveXObject("Msxml2.XMLHTTP");
- } catch (e) {
+ A = new ActiveXObject( 'Msxml2.XMLHTTP' );
+ } catch ( e ) {
try {
- A=new ActiveXObject("Microsoft.XMLHTTP");
- } catch (oc) {
- A=null;
+ A = new ActiveXObject( 'Microsoft.XMLHTTP' );
+ } catch ( oc ) {
+ A = null;
}
}
}
- if (!A)
- sajax_debug("Could not create connection object.");
+ if ( !A ) {
+ sajax_debug( 'Could not create connection object.' );
+ }
return A;
-}
+};
/**
-* Perform an ajax call to mediawiki. Calls are handeled by AjaxDispatcher.php
-* func_name - the name of the function to call. Must be registered in $wgAjaxExportList
-* args - an array of arguments to that function
-* target - the target that will handle the result of the call. If this is a function,
-* if will be called with the XMLHttpRequest as a parameter; if it's an input
-* element, its value will be set to the resultText; if it's another type of
-* element, its innerHTML will be set to the resultText.
-*
-* Example:
-* sajax_do_call('doFoo', [1, 2, 3], document.getElementById("showFoo"));
-*
-* This will call the doFoo function via MediaWiki's AjaxDispatcher, with
-* (1, 2, 3) as the parameter list, and will show the result in the element
-* with id = showFoo
-*/
-function sajax_do_call(func_name, args, target) {
+ * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
+ * func_name - the name of the function to call. Must be registered in $wgAjaxExportList
+ * args - an array of arguments to that function
+ * target - the target that will handle the result of the call. If this is a function,
+ * if will be called with the XMLHttpRequest as a parameter; if it's an input
+ * element, its value will be set to the resultText; if it's another type of
+ * element, its innerHTML will be set to the resultText.
+ *
+ * Example:
+ * sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
+ *
+ * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
+ * (1, 2, 3) as the parameter list, and will show the result in the element
+ * with id = showFoo
+ */
+window.sajax_do_call = function(func_name, args, target) {
var i, x, n;
var uri;
var post_data;
uri = wgServer +
- ((wgScript == null) ? (wgScriptPath + "/index.php") : wgScript) +
- "?action=ajax";
- if (sajax_request_type == "GET") {
- if (uri.indexOf("?") == -1)
- uri = uri + "?rs=" + encodeURIComponent(func_name);
- else
- uri = uri + "&rs=" + encodeURIComponent(func_name);
- for (i = 0; i < args.length; i++)
- uri = uri + "&rsargs[]=" + encodeURIComponent(args[i]);
- //uri = uri + "&rsrnd=" + new Date().getTime();
+ ( ( wgScript == null ) ? ( wgScriptPath + '/index.php' ) : wgScript ) +
+ '?action=ajax';
+ if ( sajax_request_type == 'GET' ) {
+ if ( uri.indexOf( '?' ) == -1 ) {
+ uri = uri + '?rs=' + encodeURIComponent( func_name );
+ } else {
+ uri = uri + '&rs=' + encodeURIComponent( func_name );
+ }
+ for ( i = 0; i < args.length; i++ ) {
+ uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
+ }
+ //uri = uri + '&rsrnd=' + new Date().getTime();
post_data = null;
} else {
- post_data = "rs=" + encodeURIComponent(func_name);
- for (i = 0; i < args.length; i++)
- post_data = post_data + "&rsargs[]=" + encodeURIComponent(args[i]);
+ post_data = 'rs=' + encodeURIComponent( func_name );
+ for ( i = 0; i < args.length; i++ ) {
+ post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
+ }
}
x = sajax_init_object();
- if (!x) {
- alert("AJAX not supported");
+ if ( !x ) {
+ alert( 'AJAX not supported' );
return false;
}
try {
- x.open(sajax_request_type, uri, true);
- } catch (e) {
- if (window.location.hostname == "localhost") {
- alert("Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing.");
+ x.open( sajax_request_type, uri, true );
+ } catch ( e ) {
+ if ( window.location.hostname == 'localhost' ) {
+ alert( "Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing." );
}
throw e;
}
- if (sajax_request_type == "POST") {
- x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
- x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+ if ( sajax_request_type == 'POST' ) {
+ x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
+ x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
}
- x.setRequestHeader("Pragma", "cache=yes");
- x.setRequestHeader("Cache-Control", "no-transform");
+ x.setRequestHeader( 'Pragma', 'cache=yes' );
+ x.setRequestHeader( 'Cache-Control', 'no-transform' );
x.onreadystatechange = function() {
- if (x.readyState != 4)
+ if ( x.readyState != 4 ) {
return;
+ }
- sajax_debug("received (" + x.status + " " + x.statusText + ") " + x.responseText);
+ sajax_debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
- //if (x.status != 200)
- // alert("Error: " + x.status + " " + x.statusText + ": " + x.responseText);
+ //if ( x.status != 200 )
+ // alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
//else
if ( typeof( target ) == 'function' ) {
target( x );
- }
- else if ( typeof( target ) == 'object' ) {
+ } else if ( typeof( target ) == 'object' ) {
if ( target.tagName == 'INPUT' ) {
- if (x.status == 200) target.value= x.responseText;
- //else alert("Error: " + x.status + " " + x.statusText + " (" + x.responseText + ")");
- }
- else {
- if (x.status == 200) target.innerHTML = x.responseText;
- else target.innerHTML= "<div class='error'>Error: " + x.status + " " + x.statusText + " (" + x.responseText + ")</div>";
+ if ( x.status == 200 ) {
+ target.value= x.responseText;
+ }
+ //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
+ } else {
+ if ( x.status == 200 ) {
+ target.innerHTML = x.responseText;
+ } else {
+ target.innerHTML = '<div class="error">Error: ' + x.status +
+ ' ' + x.statusText + ' (' + x.responseText + ')</div>';
+ }
}
- }
- else {
- alert("bad target for sajax_do_call: not a function or object: " + target);
+ } else {
+ alert( 'bad target for sajax_do_call: not a function or object: ' + target );
}
return;
- }
+ };
- sajax_debug(func_name + " uri = " + uri + " / post = " + post_data);
- x.send(post_data);
- sajax_debug(func_name + " waiting..");
+ sajax_debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+ x.send( post_data );
+ sajax_debug( func_name + ' waiting..' );
delete x;
return true;
-}
+};
/**
* @return boolean whether the browser supports XMLHttpRequest
*/
-function wfSupportsAjax() {
+window.wfSupportsAjax = function() {
var request = sajax_init_object();
var supportsAjax = request ? true : false;
delete request;
return supportsAjax;
-}
-
+};
diff --git a/skins/common/ajaxwatch.js b/skins/common/ajaxwatch.js
index 7f546014..aaf6360c 100644
--- a/skins/common/ajaxwatch.js
+++ b/skins/common/ajaxwatch.js
@@ -1,180 +1,120 @@
-// dependencies:
-// * ajax.js:
- /*extern sajax_init_object, sajax_do_call */
-// * wikibits.js:
- /*extern changeText, hookEvent, jsMsg */
+/**
+ * Animate watch/unwatch links to use asynchronous API requests to
+ * watch pages, rather than clicking on links. Requires jQuery.
+ * Uses jsMsg() from wikibits.js.
+ */
-// These should have been initialized in the generated js
-/*extern wgAjaxWatch, wgPageName */
-
-if(typeof wgAjaxWatch === "undefined" || !wgAjaxWatch) {
- var wgAjaxWatch = {
- watchMsg: "Watch",
- unwatchMsg: "Unwatch",
- watchingMsg: "Watching...",
- unwatchingMsg: "Unwatching...",
- 'tooltip-ca-watchMsg': "Add this page to your watchlist",
- 'tooltip-ca-unwatchMsg': "Remove this page from your watchlist"
- };
+if ( typeof wgAjaxWatch === 'undefined' || !wgAjaxWatch ) {
+ window.wgAjaxWatch = { };
}
-wgAjaxWatch.supported = true; // supported on current page and by browser
-wgAjaxWatch.watching = false; // currently watching page
-wgAjaxWatch.inprogress = false; // ajax request in progress
-wgAjaxWatch.timeoutID = null; // see wgAjaxWatch.ajaxCall
-wgAjaxWatch.watchLinks = []; // "watch"/"unwatch" links
-wgAjaxWatch.iconMode = false; // new icon driven functionality
-wgAjaxWatch.imgBasePath = ""; // base img path derived from icons on load
-
-wgAjaxWatch.setLinkText = function( newText ) {
- if( wgAjaxWatch.iconMode ) {
- for ( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) {
- wgAjaxWatch.watchLinks[i].firstChild.alt = newText;
- if ( newText == wgAjaxWatch.watchingMsg || newText == wgAjaxWatch.unwatchingMsg ) {
- wgAjaxWatch.watchLinks[i].className += ' loading';
- } else if ( newText == wgAjaxWatch.watchMsg || newText == wgAjaxWatch.unwatchMsg ) {
- wgAjaxWatch.watchLinks[i].className =
- wgAjaxWatch.watchLinks[i].className.replace( /loading/i, '' );
- // update the title text on the link
- var keyCommand = wgAjaxWatch.watchLinks[i].title.match( /\[.*?\]$/ ) ?
- wgAjaxWatch.watchLinks[i].title.match( /\[.*?\]$/ )[0] : "";
- wgAjaxWatch.watchLinks[i].title = ( newText == wgAjaxWatch.watchMsg ?
- wgAjaxWatch['tooltip-ca-watchMsg'] : wgAjaxWatch['tooltip-ca-unwatchMsg'] )
- + " " + keyCommand;
- }
+wgAjaxWatch.setLinkText = function( $link, action ) {
+ if ( action == 'watch' || action == 'unwatch' ) {
+ // save the accesskey from the title
+ var keyCommand = $link.attr( 'title' ).match( /\[.*?\]$/ ) ? $link.attr( 'title' ).match( /\[.*?\]$/ )[0] : '';
+ $link.attr( 'title', mediaWiki.msg( 'tooltip-ca-' + action ) + ' ' + keyCommand );
+ }
+ if ( $link.data( 'icon' ) ) {
+ $link.attr( 'alt', mediaWiki.msg( action ) );
+ if ( action == 'watching' || action == 'unwatching' ) {
+ $link.addClass( 'loading' );
+ } else {
+ $link.removeClass( 'loading' );
}
} else {
- for ( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) {
- changeText( wgAjaxWatch.watchLinks[i], newText );
- }
+ $link.html( mediaWiki.msg( action ) );
}
};
-wgAjaxWatch.setLinkID = function( newId ) {
- // We can only set the first one
- wgAjaxWatch.watchLinks[0].parentNode.setAttribute( 'id', newId );
-};
-
-wgAjaxWatch.setHref = function( string ) {
- for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) {
- if( string == 'watch' ) {
- wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href
- .replace( /&action=unwatch/, '&action=watch' );
- } else if( string == 'unwatch' ) {
- wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href
- .replace( /&action=watch/, '&action=unwatch' );
- }
- }
-}
-
-wgAjaxWatch.ajaxCall = function() {
- if(!wgAjaxWatch.supported) {
- return true;
- } else if (wgAjaxWatch.inprogress) {
- return false;
- }
- if(!wfSupportsAjax()) {
- // Lazy initialization so we don't toss up
- // ActiveX warnings on initial page load
- // for IE 6 users with security settings.
- wgAjaxWatch.supported = false;
- return true;
+wgAjaxWatch.processResult = function( response ) {
+ response = response.watch;
+ var $link = $( this );
+ // To ensure we set the same status for all watch links with the
+ // same target we trigger a custom event on *all* watch links.
+ if( response.watched !== undefined ) {
+ wgAjaxWatch.$links.trigger( 'mw-ajaxwatch', [response.title, 'watch'] );
+ } else if ( response.unwatched !== undefined ) {
+ wgAjaxWatch.$links.trigger( 'mw-ajaxwatch', [response.title, 'unwatch'] );
+ } else {
+ // Either we got an error code or it just plain broke.
+ window.location.href = $link.attr( 'href' );
+ return;
}
- wgAjaxWatch.inprogress = true;
- wgAjaxWatch.setLinkText( wgAjaxWatch.watching
- ? wgAjaxWatch.unwatchingMsg : wgAjaxWatch.watchingMsg);
- sajax_do_call(
- "wfAjaxWatch",
- [wgPageName, (wgAjaxWatch.watching ? "u" : "w")],
- wgAjaxWatch.processResult
- );
- // if the request isn't done in 10 seconds, allow user to try again
- wgAjaxWatch.timeoutID = window.setTimeout(
- function() { wgAjaxWatch.inprogress = false; },
- 10000
- );
- return false;
-};
+ jsMsg( response.message, 'watch' );
-wgAjaxWatch.processResult = function(request) {
- if(!wgAjaxWatch.supported) {
- return;
- }
- var response = request.responseText;
- if( response.match(/^<w#>/) ) {
- wgAjaxWatch.watching = true;
- wgAjaxWatch.setLinkText(wgAjaxWatch.unwatchMsg);
- wgAjaxWatch.setLinkID("ca-unwatch");
- wgAjaxWatch.setHref( 'unwatch' );
- } else if( response.match(/^<u#>/) ) {
- wgAjaxWatch.watching = false;
- wgAjaxWatch.setLinkText(wgAjaxWatch.watchMsg);
- wgAjaxWatch.setLinkID("ca-watch");
- wgAjaxWatch.setHref( 'watch' );
+ // Bug 12395 - update the watch checkbox on edit pages when the
+ // page is watched or unwatched via the tab.
+ if( response.watched !== undefined ) {
+ $( '#wpWatchthis' ).attr( 'checked', '1' );
} else {
- // Either we got a <err#> error code or it just plain broke.
- window.location.href = wgAjaxWatch.watchLinks[0].href;
- return;
+ $( '#wpWatchthis' ).removeAttr( 'checked' );
}
- jsMsg( response.substr(4), 'watch' );
- wgAjaxWatch.inprogress = false;
- if(wgAjaxWatch.timeoutID) {
- window.clearTimeout(wgAjaxWatch.timeoutID);
- }
- // Bug 12395 - avoid some watch link confusion on edit
- var watchthis = document.getElementById("wpWatchthis");
- if( watchthis && response.match(/^<[uw]#>/) ) {
- watchthis.checked = response.match(/^<w#>/) ? "checked" : "";
- }
- return;
};
-wgAjaxWatch.onLoad = function() {
- // This document structure hardcoding sucks. We should make a class and
- // toss all this out the window.
-
- var el1 = document.getElementById("ca-unwatch");
- var el2 = null;
- if ( !el1 ) {
- el1 = document.getElementById("mw-unwatch-link1");
- el2 = document.getElementById("mw-unwatch-link2");
- }
- if( el1 ) {
- wgAjaxWatch.watching = true;
- } else {
- wgAjaxWatch.watching = false;
- el1 = document.getElementById("ca-watch");
- if ( !el1 ) {
- el1 = document.getElementById("mw-watch-link1");
- el2 = document.getElementById("mw-watch-link2");
- }
- if( !el1 ) {
- wgAjaxWatch.supported = false;
- return;
+$( document ).ready( function() {
+ var $links = $( '.mw-watchlink a, a.mw-watchlink' );
+ // BC with older skins
+ $links = $links
+ .add( $( '#ca-watch a, #ca-unwatch a, a#mw-unwatch-link1' ) )
+ .add( $( 'a#mw-unwatch-link2, a#mw-watch-link2, a#mw-watch-link1' ) );
+ // allowing people to add inline animated links is a little scary
+ $links = $links.filter( ':not( #bodyContent *, #content * )' );
+
+ $links.each( function() {
+ var $link = $( this );
+ $link
+ .data( 'icon', $link.parents( 'li' ).hasClass( 'icon' ) )
+ .data( 'action', $link.attr( 'href' ).match( /[\?&]action=unwatch/i ) ? 'unwatch' : 'watch' );
+ var title = $link.attr( 'href' ).match( /[\?&]title=(.*?)&/i )[1];
+ $link.data( 'target', decodeURIComponent( title ).replace( /_/g, ' ' ) );
+ });
+
+ $links.click( function( event ) {
+ var $link = $( this );
+
+ if( wgAjaxWatch.supported === false || !wgEnableWriteAPI || !wfSupportsAjax() ) {
+ // Lazy initialization so we don't toss up
+ // ActiveX warnings on initial page load
+ // for IE 6 users with security settings.
+ wgAjaxWatch.$links.unbind( 'click' );
+ return true;
}
- }
-
- // Detect if the watch/unwatch feature is in icon mode
- if ( el1.className.match( /icon/i ) ) {
- wgAjaxWatch.iconMode = true;
- }
-
- // The id can be either for the parent (Monobook-based) or the element
- // itself (non-Monobook)
- wgAjaxWatch.watchLinks.push( el1.tagName.toLowerCase() == "a"
- ? el1 : el1.firstChild );
- if( el2 ) {
- wgAjaxWatch.watchLinks.push( el2 );
- }
+ wgAjaxWatch.setLinkText( $link, $link.data( 'action' ) + 'ing' );
+ $.get( wgScriptPath
+ + '/api' + wgScriptExtension + '?action=watch&format=json&title='
+ + encodeURIComponent( $link.data( 'target' ) )
+ + ( $link.data( 'action' ) == 'unwatch' ? '&unwatch' : '' ),
+ {},
+ wgAjaxWatch.processResult,
+ 'json'
+ );
- // I couldn't get for (watchLink in wgAjaxWatch.watchLinks) to work, if
- // you can be my guest.
- for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) {
- wgAjaxWatch.watchLinks[i].onclick = wgAjaxWatch.ajaxCall;
- }
- return;
-};
+ return false;
+ });
+
+ // When a request returns, a custom event 'mw-ajaxwatch' is triggered
+ // on *all* watch links, so they can be updated if necessary
+ $links.bind( 'mw-ajaxwatch', function( event, target, action ) {
+ var $link = $( this );
+ var foo = $link.data( 'target' );
+ if( $link.data( 'target' ) == target ) {
+ var otheraction = action == 'watch'
+ ? 'unwatch'
+ : 'watch';
+
+ $link.data( 'action', otheraction );
+ wgAjaxWatch.setLinkText( $link, otheraction );
+ $link.attr( 'href', $link.attr( 'href' ).replace( '/&action=' + action + '/', '&action=' + otheraction ) );
+ if( $link.parents( 'li' ).attr( 'id' ) == 'ca-' + action ) {
+ $link.parents( 'li' ).attr( 'id', 'ca-' + otheraction );
+ // update the link text with the new message
+ $link.text( mediaWiki.msg( otheraction ) );
+ }
+ };
+ return false;
+ });
-hookEvent("load", wgAjaxWatch.onLoad);
+ wgAjaxWatch.$links = $links;
+});
diff --git a/skins/common/block.js b/skins/common/block.js
index ad04f810..fb86cbd6 100644
--- a/skins/common/block.js
+++ b/skins/common/block.js
@@ -1,6 +1,34 @@
-addOnloadHook( considerChangingExpiryFocus );
+// @TODO: find some better JS file for this
+// Note: borrows from IP.php
+window.isIPv4Address = function( address, allowBlock ) {
+ var block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '';
+ var RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])';
+ var RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
+ return address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) != -1;
+};
+
+// @TODO: find some better JS file for this
+// Note: borrows from IP.php
+window.isIPv6Address = function( address, allowBlock ) {
+ var block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '';
+ var RE_IPV6_ADD =
+ '(?:' + // starts with "::" (including "::")
+ ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
+ '|' + // ends with "::" (except "::")
+ '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
+ '|' + // contains no "::"
+ '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
+ ')';
+ if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) != -1 ) {
+ return true;
+ }
+ var RE_IPV6_ADD = // contains one "::" in the middle (single '::' check below)
+ '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
+ return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) != -1
+ && address.search( /::/ ) != -1 && address.search( /::.*::/ ) == -1;
+};
-function considerChangingExpiryFocus() {
+window.considerChangingExpiryFocus = function() {
if ( !document.getElementById ) {
return;
}
@@ -18,9 +46,9 @@ function considerChangingExpiryFocus() {
} else {
field.style.display = 'none';
}
-}
+};
-function updateBlockOptions() {
+window.updateBlockOptions = function() {
if ( !document.getElementById ) {
return;
}
@@ -30,9 +58,10 @@ function updateBlockOptions() {
return;
}
- var addy = target.value;
- var isEmpty = addy.match(/^\s*$/);
- var isIp = addy.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|:(:[0-9A-Fa-f]{1,4}){1,7}|[0-9A-Fa-f]{1,4}(:{1,2}[0-9A-Fa-f]{1,4}|::$){1,7})(\/\d+)?$/);
+ var addy = target.value.replace( /(^\s*|\s*$)/, '' ); // trim
+ var isEmpty = (addy == "");
+
+ var isIp = isIPv4Address( addy, true ) || isIPv6Address( addy, true );
var isIpRange = isIp && addy.match(/\/\d+$/);
var anonymousRow = document.getElementById( 'wpAnonOnlyRow' );
@@ -54,4 +83,7 @@ function updateBlockOptions() {
if( watchuserRow ) {
watchuserRow.style.display = isIpRange && !isEmpty ? 'none' : '';
}
-}
+};
+
+addOnloadHook( updateBlockOptions );
+addOnloadHook( considerChangingExpiryFocus );
diff --git a/skins/common/changepassword.js b/skins/common/changepassword.js
deleted file mode 100644
index 1e3e2069..00000000
--- a/skins/common/changepassword.js
+++ /dev/null
@@ -1,16 +0,0 @@
-
-function onNameChange() {
- if ( wgUserName != document.getElementById('wpName').value ) {
- document.getElementById('wpPassword').disabled = true;
- document.getElementById('wpComment').disabled = false;
- } else {
- document.getElementById('wpPassword').disabled = false;
- document.getElementById('wpComment').disabled = true;
- }
-}
-
-function onNameChangeHook() {
- document.getElementById( 'wpName' ).onblur = onNameChange;
-}
-
-addOnloadHook( onNameChangeHook );
diff --git a/skins/common/cologneblue.css b/skins/common/cologneblue.css
index 2329d233..c7b6eac1 100644
--- a/skins/common/cologneblue.css
+++ b/skins/common/cologneblue.css
@@ -1,101 +1,210 @@
-body { margin: 0px; padding: 0px; color: black; }
-#specialform { display: inline; }
-#content { top: 0; margin: 0; padding: 0; }
+body {
+ margin: 0px;
+ padding: 0px;
+ color: black;
+}
+
+#specialform {
+ display: inline;
+}
+
+#content {
+ top: 0;
+ margin: 0;
+ padding: 0;
+}
+
#mw-data-after-content {
- font-family: Verdana, Arial, sans-serif;
- color: black;
- font-size: 8pt;
+ font-family: Verdana, Arial, sans-serif;
+ color: black;
+ font-size: 8pt;
+}
+
+#topbar {
+ padding: 0px;
}
-#topbar { padding: 0px; }
+
#powersearch {
- background: #DDEEFF; border-style: solid; border-width: 1px; padding: 2px;
+ background: #DDEEFF;
+ border-style: solid;
+ border-width: 1px;
+ padding: 2px;
}
+
#quickbar {
- width: 140px; top: 18ex; padding: 2px; visibility: visible; z-index: 99;
+ width: 140px;
+ top: 18ex;
+ padding: 2px;
+ visibility: visible;
+ z-index: 99;
}
+
#article, #article td, #article th, #article p {
- font-family: Verdana, Arial, sans-serif;
- font-size: 10pt; color: black;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+ color: black;
}
+
#article p {
- padding-top: 0; padding-bottom: 0;
- margin-top: 1ex; margin-bottom: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-top: 1ex;
+ margin-bottom: 0;
+}
+
+p, pre, td, th, li, dd, dt {
+ line-height: 12pt;
+}
+
+textarea {
+ overflow: auto;
+}
+
+#footer {
+ padding: 4px;
+}
+
+#footer form {
+ display: inline;
}
-p, pre, td, th, li, dd, dt { line-height: 12pt; }
-textarea { overflow: auto; }
-#footer { padding: 4px; }
-#footer form { display: inline; }
#sitetitle {
- font-family: Times, serif;
- color: white;
- font-weight: normal; font-size: 32pt;
- line-height: 32pt;
+ font-family: Times, serif;
+ color: white;
+ font-weight: normal;
+ font-size: 32pt;
+ line-height: 32pt;
}
+
td.top {
- background-color: #6688AA; color: white;
- margin-top: 4px; margin-bottom: 4px;
- padding-top: 0; padding-bottom: 0;
- text-transform: uppercase;
- font-family: Verdana, Arial, sans-serif; font-size: 8pt;
+ background-color: #6688AA;
+ color: white;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ padding-top: 0;
+ padding-bottom: 0;
+ text-transform: uppercase;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 8pt;
}
+
td.top a {
- font-family: Verdana, Arial, sans-serif;
- background-color: #6688AA; color: white;
- text-decoration: none; font-size: 10pt;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #6688AA;
+ color: white;
+ text-decoration: none;
+ font-size: 10pt;
}
+
td.bottom {
- font-family: Verdana, Arial, sans-serif;
- font-size: 10pt;
- padding: 0;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+ padding: 0;
}
+
#pagestats {
- font-family: Verdana, Arial, sans-serif;
- color: black;
- font-size: 9pt;
+ font-family: Verdana, Arial, sans-serif;
+ color: black;
+ font-size: 9pt;
}
+
#sitesub {
- font-family: Verdana, Arial, sans-serif;
- font-size: 9pt; font-weight: bold;
- color: black;
- padding-top: 0;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 9pt; font-weight: bold;
+ color: black;
+ padding-top: 0;
}
+
#quickbar {
- font-family: Verdana, Arial, sans-serif;
- font-size: 8pt; font-weight: bold; line-height: 9.5pt;
- text-decoration: none;
- color: black;
- padding: 0; margin-top: 0;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 8pt;
+ font-weight: bold;
+ line-height: 9.5pt;
+ text-decoration: none;
+ color: black;
+ padding: 0;
+ margin-top: 0;
+}
+
+#quickbar a {
+ color: #446688;
}
-#quickbar a { color: #446688; }
#quickbar h6 {
- font-family: Verdana, Arial, sans-serif;
- font-size: 10pt; font-weight: bold; line-height: 12pt;
- text-decoration: none;
- color: #666666;
- padding: 0; margin-bottom: 2px; margin-top: 6px;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+ font-weight: bold;
+ line-height: 12pt;
+ text-decoration: none;
+ color: #666666;
+ padding: 0;
+ margin-bottom: 2px;
+ margin-top: 6px;
+}
+
+#quickbar form {
+ padding: 0;
+ margin-top: 0;
}
-#quickbar form { padding: 0; margin-top: 0; }
h1 {
- color: #666666;
- font-family: Verdana, Arial, sans-serif;
- font-size: 180%; line-height: 21pt;
+ color: #666666;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 180%;
+ line-height: 21pt;
+}
+
+h1 .editsection {
+ font-size: 55.6%;
+}
+
+h1.pagetitle {
+ padding-bottom: 0;
+ margin-bottom: 0;
}
-h1 .editsection { font-size: 55.6%; }
-h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
+
#article p.subtitle {
- color: #666666; font-size: 11pt; font-weight: bold;
- padding-top: 0; margin-top: 0; padding-bottom: 1ex;
-}
-
-a { color: #223366; }
-a.external { color: #336644; }
-a:visited { color: #8D0749; }
-a.printable { text-decoration: underline; }
-a.stub, #quickbar a.stub { color:#772233; text-decoration:none; }
-a.new, #quickbar a.new { color: #CC2200; }
-h2, h3, h4, h5, h6 { margin-bottom: 0; }
-small { font-size: 75%; }
-input.mw-searchInput { width: 106px; }
+ color: #666666;
+ font-size: 11pt;
+ font-weight: bold;
+ padding-top: 0;
+ margin-top: 0;
+ padding-bottom: 1ex;
+}
+
+a {
+ color: #223366;
+}
+
+a.external {
+ color: #336644;
+}
+
+a:visited {
+ color: #8D0749;
+}
+
+a.printable {
+ text-decoration: underline;
+}
+
+a.stub, #quickbar a.stub {
+ color: #772233;
+ text-decoration: none;
+}
+
+a.new, #quickbar a.new {
+ color: #CC2200;
+}
+
+h2, h3, h4, h5, h6 {
+ margin-bottom: 0;
+}
+
+small {
+ font-size: 75%;
+}
+
+input.mw-searchInput {
+ width: 106px;
+} \ No newline at end of file
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 0932fcea..56203aa4 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -8,13 +8,15 @@
/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
a.stub,
-a.new{ color:#ba0000; text-decoration:none; }
+a.new {
+ color: #ba0000;
+ text-decoration: none;
+}
-#toc {
- /*border:1px solid #2f6fab;*/
- border:1px solid #aaaaaa;
- background-color:#f9f9f9;
- padding:5px;
+#toc {
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
}
.tocindent {
margin-left: 2em;
@@ -24,54 +26,67 @@ a.new{ color:#ba0000; text-decoration:none; }
}
/* images */
-div.floatright {
- float: right;
- clear: right;
- margin: 0;
- position:relative;
- border: 0.5em solid White;
- border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p { font-style: italic;}
-div.floatleft {
- float: left;
- margin: 0.3em 0.5em 0.5em 0;
- position:relative;
- border: 0.5em solid White;
- border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p { font-style: italic; }
+div.floatright {
+ float: right;
+ clear: right;
+ position: relative;
+ margin: 0.5em 0 0.8em 1.4em;
+}
+div.floatright p {
+ font-style: italic;
+}
+div.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0.5em 1.4em 0.8em 0;
+}
+div.floatleft p {
+ font-style: italic;
+}
+div.center {
+ text-align: center;
+}
+
/* thumbnails */
div.thumb {
- margin-bottom: 0.5em;
- border-style: solid; border-color: White;
- width: auto;
- overflow: hidden;
+ border: none;
+ width: auto;
+ margin-top: 0.5em;
+ margin-bottom: 0.8em;
+ background-color: transparent;
}
div.thumbinner {
- border:1px solid #cccccc;
- padding: 3px !important;
- background-color:#f9f9f9;
- font-size: 94%;
- text-align: center;
+ border:1px solid #cccccc;
+ padding: 3px !important;
+ background-color: White;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
}
html .thumbimage {
- border:1px solid #cccccc;
+ border: 1px solid #cccccc;
}
html .thumbcaption {
- border: none;
- padding: 0.3em 0 0.1em 0;
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+
+div.magnify {
+ display: none;
}
-div.magnify { display: none; }
div.tright {
- float: right;
- clear: right;
- border-width: 0.5em 0 0.8em 1.4em;
+ float: right;
+ clear: right;
+ margin: 0.5em 0 0.8em 1.4em;
}
div.tleft {
- float: left;
- margin-right:0.5em;
- border-width: 0.5em 1.4em 0.8em 0;
+ float: left;
+ clear: left;
+ margin: 0.5em 1.4em 0.8em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
@@ -79,20 +94,20 @@ img.thumbborder {
/* table standards */
table.rimage {
- float:right;
- width:1pt;
- position:relative;
- margin-left:1em;
- margin-bottom:1em;
- text-align:center;
+ float: right;
+ width: 1pt;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
}
body {
- background: White;
- /*font-size: 11pt !important;*/
- color: Black;
- margin: 0;
- padding: 0;
+ background: White;
+ /*font-size: 11pt !important;*/
+ color: Black;
+ margin: 0;
+ padding: 0;
}
.noprint,
@@ -109,25 +124,26 @@ li#viewcount,
li#about,
li#disclaimer,
li#privacy,
+#footer-places,
#mw-hidden-catlinks {
- /* Hides all the elements irrelevant for printing */
- display: none;
+ /* Hides all the elements irrelevant for printing */
+ display: none;
}
-ul {
- list-style-type: square;
+ul {
+ list-style-type: square;
}
#content {
- background: none;
- border: none ! important;
- padding: 0 ! important;
- margin: 0 ! important;
+ background: none;
+ border: none ! important;
+ padding: 0 ! important;
+ margin: 0 ! important;
}
#footer {
background : white;
color : black;
- border-top: 1px solid black;
+ border-top: 1px solid black;
}
h1, h2, h3, h4, h5, h6 {
@@ -135,8 +151,8 @@ h1, h2, h3, h4, h5, h6 {
}
p, .documentDescription {
- margin: 1em 0 ! important;
- line-height: 1.2em;
+ margin: 1em 0 ! important;
+ line-height: 1.2em;
}
.tocindent p {
@@ -144,55 +160,55 @@ p, .documentDescription {
}
pre {
- border: 1pt dashed black;
- white-space: pre;
- font-size: 8pt;
- overflow: auto;
- padding: 1em 0;
- background : white;
- color : black;
+ border: 1pt dashed black;
+ white-space: pre;
+ font-size: 8pt;
+ overflow: auto;
+ padding: 1em 0;
+ background: white;
+ color: black;
}
table.listing,
table.listing td {
- border: 1pt solid black;
- border-collapse: collapse;
+ border: 1pt solid black;
+ border-collapse: collapse;
}
a {
- color: Black !important;
- background: none !important;
- padding: 0 !important;
+ color: Black !important;
+ background: none !important;
+ padding: 0 !important;
}
a:link, a:visited {
- color: #520;
- background: transparent;
- text-decoration: underline;
+ color: #520;
+ background: transparent;
+ text-decoration: underline;
}
#content a.external.text:after, #content a.external.autonumber:after {
- /* Expand URLs for printing */
- content: " (" attr(href) ") ";
+ /* Expand URLs for printing */
+ content: " (" attr(href) ") ";
}
#globalWrapper {
- width: 100% !important;
- min-width: 0 !important;
+ width: 100% !important;
+ min-width: 0 !important;
}
#content {
- background : white;
- color : black;
+ background: white;
+ color: black;
}
#column-content {
- margin: 0 !important;
+ margin: 0 !important;
}
#column-content #content {
- padding: 1em;
- margin: 0 !important;
+ padding: 1em;
+ margin: 0 !important;
}
/* MSIE/Win doesn't understand 'inherit' */
a, a.external, a.new, a.stub {
@@ -206,44 +222,122 @@ a, a.external, a.new, a.stub {
text-decoration: inherit ! important;
}
-img { border: none; }
-img.tex { vertical-align: middle; }
+img {
+ border: none;
+ vertical-align: middle;
+}
+
+/* math */
span.texhtml { font-family: serif; }
#siteNotice { display: none; }
-div.gallerybox {
- border: 1px solid #cccccc;
- background-color:#f9f9f9;
- width: 150px;
+/* Galleries (see shared.css for more info) */
+li.gallerybox {
+ vertical-align: top;
+ background-color: #f9f9f9;
+ border: solid 2px white;
+ display: -moz-inline-box;
+ display: inline-block;
}
-div.gallerytext {
- overflow: visible;
-}
+ul.gallery, li.gallerybox {
+ zoom: 1;
+ *display: inline;
+}
+
+ul.gallery {
+ margin: 2px;
+ padding: 2px;
+ display: block;
+}
+li.gallerycaption {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ overflow: hidden;
+ font-size: 94%;
+ padding: 2px 4px;
+ word-wrap: break-word;
+}
/*
** Diff rendering
*/
-table.diff { background:white; }
-td.diff-otitle { background:#ffffff; }
-td.diff-ntitle { background:#ffffff; }
+table.diff {
+ background: white;
+}
+td.diff-otitle {
+ background: #ffffff;
+}
+td.diff-ntitle {
+ background: #ffffff;
+}
td.diff-addedline {
- background:#ccffcc;
- font-size: smaller;
- border: solid 2px black;
+ background: #ccffcc;
+ font-size: smaller;
+ border: solid 2px black;
}
td.diff-deletedline {
- background:#ffffaa;
- font-size: smaller;
- border: dotted 2px black;
+ background: #ffffaa;
+ font-size: smaller;
+ border: dotted 2px black;
}
td.diff-context {
- background:#eeeeee;
- font-size: smaller;
+ background: #eeeeee;
+ font-size: smaller;
}
.diffchange {
- color: silver;
- font-weight: bold;
- text-decoration: underline;
+ color: silver;
+ font-weight: bold;
+ text-decoration: underline;
+}
+
+/*
+** Table rendering
+** As on shared.css but with white background.
+*/
+table.wikitable {
+ margin: 1em 1em 1em 0;
+ border: 1px #aaa solid;
+ background: white;
+ border-collapse: collapse;
+}
+.wikitable th, .wikitable td {
+ border: 1px #aaa solid;
+ padding: 0.2em;
+}
+.wikitable th {
+ text-align: center;
+ background: white;
+ font-weight: bold;
+}
+.wikitable caption {
+ font-weight: bold;
+}
+
+a.sortheader {
+ margin: 0px 0.3em;
+}
+
+/* Some pagination options */
+.wikitable, .thumb, img {
+ page-break-inside: avoid;
+}
+h2, h3, h4, h5, h6, h7 {
+ page-break-after: avoid;
+}
+p {
+ widows: 3;
+ orphans: 3;
}
diff --git a/skins/common/common_rtl.css b/skins/common/common_rtl.css
index 2e8bb980..a0c485f0 100644
--- a/skins/common/common_rtl.css
+++ b/skins/common/common_rtl.css
@@ -10,14 +10,14 @@
#preftoc li { list-style: none; }
#prefcontrol { float: right; }
fieldset.prefsection,
-fieldset.operaprefsection {
- margin-left: 0;
- margin-right: 18em;
+fieldset.operaprefsection {
+ margin-left: 0;
+ margin-right: 18em;
}
/* page history */
-#pagehistory .history-user {
- margin-right: 1.4em;
- margin-left: 0.4em;
+#pagehistory .history-user {
+ margin-right: 1.4em;
+ margin-left: 0.4em;
}
.editsection {
float: left;
diff --git a/skins/common/config-cc.css b/skins/common/config-cc.css
new file mode 100644
index 00000000..c629ad3f
--- /dev/null
+++ b/skins/common/config-cc.css
@@ -0,0 +1,56 @@
+/**
+ * Copy of CC standard stylesheet, plus tweaks for iframe usage
+ */
+
+body {
+ margin:0px;
+ background:#eee;
+ font-family:verdana;
+ color:#333;
+}
+
+#main {
+ border:1px solid #D0D0D0;
+ background:#fff;
+ margin: 0.5em;
+}
+
+/* Looks like you have to specify the width of #menu
+or IE5 Mac stretches it all the way across the div, and
+Opera streches it half way. */
+
+#main #menu {
+ border-left:1px dotted #ccc;
+ /* border-bottom:1px solid #000;*/
+ float:right;
+ width:230px;
+ background:white;
+ margin:0px 0px 10px 10px;
+}
+
+td, h3, p,h1,pre {
+ margin:0px 20px 20px 20px;
+ font-size:11px;
+ line-height:140%;
+}
+
+.header {
+ padding-left: 10px;
+ padding-top:10px;
+}
+
+.nav {
+ padding-left:10px;
+ padding-bottom:10px;
+ font-size:11px;
+ margin-bottom:16px;
+}
+
+#menu p {
+ font-size:11px;
+}
+
+.dent {
+ margin-left:64px;
+}
+
diff --git a/skins/common/config.css b/skins/common/config.css
new file mode 100644
index 00000000..341a9038
--- /dev/null
+++ b/skins/common/config.css
@@ -0,0 +1,164 @@
+.env-check {
+ font-size: 90%;
+ margin: 1em 0 1em 2.5em;
+}
+
+.config-section {
+ margin-top: 2em;
+}
+.config-block {
+ margin-top: 2em;
+ display: block;
+
+}
+.config-block-label {
+ display: block;
+ margin-bottom: .2em;
+}
+.config-block-label label, .config-label {
+ font-weight: bold;
+ padding-right: .5em;
+ padding-top: .2em;
+}
+.config-block-elements {
+ margin-left: 2em;
+}
+.config-block-elements li {
+ list-style: none;
+}
+.config-input {
+ clear: left;
+ zoom: 100%; /* IE hack */
+}
+
+.config-page-wrapper {
+ padding: 0.5em;
+}
+
+.config-page-list {
+ float: right;
+ width: 12em;
+ border: 1px solid #aaa;
+ background: #fff;
+ padding: 0.5em;
+ /* 3em left margin to leave space between the list and the page-content */
+ margin: 0.5em 0.5em 0.5em 3.5em;
+}
+
+.config-page {
+ padding: 0.5em 0.5em 0.5em 2em;
+ margin: 0.5em 0.5em 0.5em 0.5em;
+ background: #eee;
+}
+
+.config-submit {
+ clear: left;
+ text-align: center;
+ padding: 1em;
+}
+
+.config-submit input {
+ margin-left: 0.5em;
+ margin-right: 0.5em;
+}
+
+.config-page-disabled {
+ color: #aaa;
+}
+
+.config-error-box {
+ border: 2px solid #f00;
+ margin: 0.4em;
+ clear: left;
+}
+
+.config-warning-box {
+ border: 2px solid #ff7f00;
+ margin: 0.4em;
+ clear: left;
+}
+
+.config-info-left {
+ margin: 7px;
+ float: left;
+ width: 35px;
+}
+
+.config-info-right {
+ margin: 0.5em 0.5em 0.5em 49px;
+}
+
+.config-page-current {
+ font-weight: bold;
+}
+
+.config-message {
+ display: list-item;
+ line-height: 1.5em;
+ /* @embed */
+ list-style-image: url(images/bullet.gif);
+ list-style-type: square;
+}
+
+.config-input-text {
+ width: 20em;
+ margin-right: 1em;
+}
+
+.config-input-check {
+ margin-left: 10em;
+}
+
+.error {
+ color: red;
+ background-color: #fff;
+ font-weight: bold;
+ left: 1em;
+ font-size: 100%;
+}
+
+.config-settings-block {
+ list-style-type: none;
+ list-style-image: none;
+ float: left;
+ margin: 0;
+ padding: 0;
+}
+
+.btn-install {
+ font-weight: bold;
+ font-size: 110%;
+ padding: .2em .3em;
+}
+
+.success-message {
+ font-weight: bold;
+ font-size: 110%;
+ color: green;
+}
+.success-box {
+ font-size: 130%;
+}
+
+.config-cc-wrapper {
+ clear: left;
+ /* If you change this height, also change it in WebInstaller_Options::submitCC() */
+ height: 54em;
+}
+
+.config-plainlink a {
+ background: none !important;
+ padding: 0 !important;
+}
+
+#config-memcachewrapper {
+ display: none;
+}
+.config-download-link {
+ font-size: 1.8em;
+ margin-left: 2em;
+}
+
+#config-update-log {
+ width: 75%;
+}
diff --git a/skins/common/config.js b/skins/common/config.js
new file mode 100644
index 00000000..511966ad
--- /dev/null
+++ b/skins/common/config.js
@@ -0,0 +1,102 @@
+(function( $ ) {
+ $( document ).ready( function() {
+
+
+ // Set up the help system
+ $( '.mw-help-field-data' )
+ .hide()
+ .closest( '.mw-help-field-container' )
+ .find( '.mw-help-field-hint' )
+ .show()
+ .click( function() {
+ $(this)
+ .closest( '.mw-help-field-container' )
+ .find( '.mw-help-field-data' )
+ .slideToggle( 'fast' );
+ } );
+
+ // Show/hide code for DB-specific options
+ // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
+ $( '.dbRadio' ).each( function() { $( '#' + $(this).attr( 'rel' ) ).hide(); } );
+ $( '#' + $( '.dbRadio:checked' ).attr( 'rel' ) ).show();
+ $( '.dbRadio' ).click( function() {
+ var $checked = $( '.dbRadio:checked' );
+ var $wrapper = $( '#' + $checked.attr( 'rel' ) );
+ if ( !$wrapper.is( ':visible' ) ) {
+ $( '.dbWrapper' ).hide( 'slow' );
+ $wrapper.show( 'slow' );
+ }
+ } );
+
+ // Scroll to the bottom of upgrade log
+ $( "#config-update-log" ).each( function() { this.scrollTop = this.scrollHeight; } );
+
+ // Show/hide Creative Commons thingy
+ $( '.licenseRadio' ).click( function() {
+ var $wrapper = $( '#config-cc-wrapper' );
+ if ( $( '#config__LicenseCode_cc-choose' ).is( ':checked' ) ) {
+ $wrapper.show( 'slow' );
+ } else {
+ $wrapper.hide( 'slow' );
+ }
+ } );
+
+ // Show/hide random stuff (email, upload)
+ $( '.showHideRadio' ).click( function() {
+ var $wrapper = $( '#' + $(this).attr( 'rel' ) );
+ if ( $(this).is( ':checked' ) ) {
+ $wrapper.show( 'slow' );
+ } else {
+ $wrapper.hide( 'slow' );
+ }
+ } );
+ $( '.hideShowRadio' ).click( function() {
+ var $wrapper = $( '#' + $(this).attr( 'rel' ) );
+ if ( $(this).is( ':checked' ) ) {
+ $wrapper.hide( 'slow' );
+ } else {
+ $wrapper.show( 'slow' );
+ }
+ } );
+
+ // Hide "other" textboxes by default
+ // Should not be done in CSS for javascript disabled compatibility
+ $( '.enabledByOther' ).closest( '.config-block' ).hide();
+
+ // Enable/disable "other" textboxes
+ $( '.enableForOther' ).click( function() {
+ var $textbox = $( '#' + $(this).attr( 'rel' ) );
+ if ( $(this).val() == 'other' ) { // FIXME: Ugh, this is ugly
+ $textbox.removeAttr( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
+ } else {
+ $textbox.attr( 'readonly', 'readonly' ).closest( '.config-block' ).slideUp( 'fast' );
+ }
+ } );
+
+ // Synchronize radio button label for sitename with textbox
+ $label = $( 'label[for=config__NamespaceType_site-name]' );
+ labelText = $label.text();
+ $label.text( labelText.replace( '$1', '' ) );
+ $( '#config_wgSitename' ).bind( 'keyup change', syncText ).each( syncText );
+ function syncText() {
+ var value = $(this).val()
+ .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
+ .replace( /&/, '&amp;' )
+ .replace( /__+/g, '_' )
+ .replace( /^_+/, '' )
+ .replace( /_+$/, '' );
+ value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
+ $label.text( labelText.replace( '$1', value ) );
+ }
+
+ // Show/Hide memcached servers when needed
+ $("input[name$='config_wgMainCacheType']").change( function() {
+ var $memc = $( "#config-memcachewrapper" );
+ if( $( "input[name$='config_wgMainCacheType']:checked" ).val() == 'memcached' ) {
+ $memc.show( 'slow' );
+ } else {
+ $memc.hide( 'slow' );
+ }
+ } );
+ } );
+})(jQuery);
diff --git a/skins/common/diff.css b/skins/common/diff.css
index 6afa3734..80286d8e 100644
--- a/skins/common/diff.css
+++ b/skins/common/diff.css
@@ -11,9 +11,6 @@ td.diff-ntitle {
td.diff-marker {
text-align: right;
}
-.rtl td.diff-marker {
- text-align: left;
-}
td.diff-lineno {
font-weight: bold;
}
@@ -41,7 +38,7 @@ table.diff {
border: none;
width: 98%;
border-spacing: 4px;
-
+
/* Fixed layout is required to ensure that cells containing long URLs
don't widen in Safari, Internet Explorer, or iCab */
table-layout: fixed;
@@ -57,87 +54,22 @@ table.diff col.diff-content {
}
table.diff td div {
/* Force-wrap very long lines such as URLs or page-widening char strings.
- CSS 3 draft..., but Gecko doesn't support it yet:
- https://bugzilla.mozilla.org/show_bug.cgi?id=99457 */
+ CSS 3 only (In Gecko 1.9.1 / Firefox 3.5):
+ https://bugzilla.mozilla.org/show_bug.cgi?id=99457
+ https://developer.mozilla.org/web-tech/2008/08/20/word-wrap-break-word/
+ https://developer.mozilla.org/En/CSS/Word-wrap */
word-wrap: break-word;
-
+
/* As fallback, scrollbars will be added for very wide cells
instead of text overflowing or widening */
overflow: auto;
-
+
/* The above rule breaks on very old versions of Mozilla due
to a bug which collapses the table cells to a single line.
-
+
In Mozilla 1.1 and below with JavaScript enabled, the rule
will be overridden with this by diff.js; wide cell contents
then spill horizontally without widening the rest of the
table: */
/* overflow: visible; */
}
-
-/*
- * Styles for the HTML Diff
- */
-div.diff-switchtype{
- text-align: center;
- font-weight: bold;
- font-size: smaller;
-}
-
-span.diff-html-added {
- font-size: 100%;
- background-color: #20ff20
-}
-
-span.diff-html-removed {
- font-size: 100%;
- text-decoration: line-through;
- background-color: #ff2020
-}
-
-span.diff-html-changed {
- background: url(images/diffunderline.gif) bottom repeat-x;
- /* Hack for IE5.5, see http://lists.wikimedia.org/pipermail/wikitech-l/2008-November/040273.html */
- *background-color: #c6c6fd; /* light blue */
-}
-
-span.diff-html-added img{
- border: 5px solid #ccffcc;
-}
-
-span.diff-html-removed img{
- border: 5px solid #fdc6c6;
-}
-
-span.diff-html-changed img{
- border: 5px dotted #000099;
-
-}
-
-span.diff-html-changed {
- position: relative; /* this is key */
- cursor: help;
-}
-
-span.diff-html-changed span.tip {
- display: none; /* so is this */
-}
-
-/* tooltip will display on :hover event */
-
-span.diff-html-changed:hover span.tip {
- display: block;
- z-index: 95;
- position: absolute;
- top: 2.5em;
- left: 0;
- width: auto;
- line-height: 1.2em;
- padding: 3px 7px 4px 6px;
- border: 1px solid #336;
- background-color: #f7f7ee;
- font-size: 10px;
- text-align: left;
-}
-
-
diff --git a/skins/common/edit.js b/skins/common/edit.js
index 423205f8..f986c854 100644
--- a/skins/common/edit.js
+++ b/skins/common/edit.js
@@ -1,8 +1,7 @@
-var currentFocused;
+window.currentFocused = undefined;
-// this function generates the actual toolbar buttons with localized text
-// we use it to avoid creating the toolbar where javascript is not enabled
-function addButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId ) {
+// this function adds a toolbar button to the mwEditButtons list
+window.addButton = function( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId ) {
// Don't generate buttons for browsers which don't fully
// support it.
mwEditButtons.push({
@@ -13,11 +12,10 @@ function addButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId
'tagClose': tagClose,
'sampleText': sampleText
});
-}
+};
-// this function generates the actual toolbar buttons with localized text
-// we use it to avoid creating the toolbar where JavaScript is not enabled
-function mwInsertEditButton( parent, item ) {
+// this function adds one toolbar button from a mwEditButtons/mwCustomEditButtons item
+window.mwInsertEditButton = function( parent, item ) {
var image = document.createElement( 'img' );
image.width = 23;
image.height = 22;
@@ -33,17 +31,19 @@ function mwInsertEditButton( parent, item ) {
image.onclick = function() {
insertTags( item.tagOpen, item.tagClose, item.sampleText );
// click tracking
- if ( ( typeof $j != 'undefined' ) && ( typeof $j.trackAction != 'undefined' ) ) {
- $j.trackAction( 'oldedit.' + item.speedTip.replace(/ /g, "-") );
+ if ( ( typeof $ != 'undefined' ) && ( typeof $.trackAction != 'undefined' ) ) {
+ $.trackAction( 'oldedit.' + item.speedTip.replace(/ /g, "-") );
}
return false;
};
parent.appendChild( image );
return true;
-}
+};
-function mwSetupToolbar() {
+// this function generates the actual toolbar buttons with localized text
+// we use it to avoid creating the toolbar where javascript is not enabled
+window.mwSetupToolbar = function() {
var toolbar = document.getElementById( 'toolbar' );
if ( !toolbar ) {
return false;
@@ -73,14 +73,14 @@ function mwSetupToolbar() {
mwInsertEditButton( toolbar, mwCustomEditButtons[i] );
}
return true;
-}
+};
// apply tagOpen/tagClose to selection in textarea,
// use sampleText instead of selection if there is none
-function insertTags( tagOpen, tagClose, sampleText ) {
- if ( typeof $j != 'undefined' && typeof $j.fn.textSelection != 'undefined' &&
+window.insertTags = function( tagOpen, tagClose, sampleText ) {
+ if ( typeof $ != 'undefined' && typeof $.fn.textSelection != 'undefined' && currentFocused &&
( currentFocused.nodeName.toLowerCase() == 'iframe' || currentFocused.id == 'wpTextbox1' ) ) {
- $j( '#wpTextbox1' ).textSelection(
+ $( '#wpTextbox1' ).textSelection(
'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose }
);
return;
@@ -160,13 +160,13 @@ function insertTags( tagOpen, tagClose, sampleText ) {
}
}
-}
+};
/**
* Restore the edit box scroll state following a preview operation,
* and set up a form submission handler to remember this state
*/
-function scrollEditBox() {
+window.scrollEditBox = function() {
var editBox = document.getElementById( 'wpTextbox1' );
var scrollTop = document.getElementById( 'wpScrolltop' );
var editForm = document.getElementById( 'editform' );
@@ -178,7 +178,7 @@ function scrollEditBox() {
scrollTop.value = editBox.scrollTop;
} );
}
-}
+};
hookEvent( 'load', scrollEditBox );
hookEvent( 'load', mwSetupToolbar );
hookEvent( 'load', function() {
@@ -217,10 +217,10 @@ hookEvent( 'load', function() {
// HACK: make currentFocused work with the usability iframe
// With proper focus detection support (HTML 5!) this'll be much cleaner
- if ( typeof $j != 'undefined' ) {
- var iframe = $j( '.wikiEditor-ui-text iframe' );
+ if ( typeof $ != 'undefined' ) {
+ var iframe = $( '.wikiEditor-ui-text iframe' );
if ( iframe.length > 0 ) {
- $j( iframe.get( 0 ).contentWindow.document )
+ $( iframe.get( 0 ).contentWindow.document )
.add( iframe.get( 0 ).contentWindow.document.body ) // for IE
.focus( function() { currentFocused = iframe.get( 0 ); } );
}
diff --git a/skins/common/enhancedchanges.js b/skins/common/enhancedchanges.js
index b1789c9e..bcc2cc88 100644
--- a/skins/common/enhancedchanges.js
+++ b/skins/common/enhancedchanges.js
@@ -24,7 +24,7 @@ appendCSS('.mw-changeslist-hidden {'+
* Switch an RC line between hidden/shown
* @param int idNumber : the id number of the RC group
*/
-function toggleVisibility(idNumber) {
+window.toggleVisibility = function(idNumber) {
var openarrow = document.getElementById("mw-rc-openarrow-"+idNumber);
var closearrow = document.getElementById("mw-rc-closearrow-"+idNumber);
var subentries = document.getElementById("mw-rc-subentries-"+idNumber);
@@ -37,4 +37,4 @@ function toggleVisibility(idNumber) {
closearrow.className = 'mw-changeslist-hidden';
subentries.className = 'mw-changeslist-hidden';
}
-}
+};
diff --git a/skins/common/history.js b/skins/common/history.js
index 02651225..33845a75 100644
--- a/skins/common/history.js
+++ b/skins/common/history.js
@@ -1,4 +1,4 @@
-function historyRadios(parent) {
+window.historyRadios = function(parent) {
var inputs = parent.getElementsByTagName('input');
var radios = [];
for (var i = 0; i < inputs.length; i++) {
@@ -7,10 +7,10 @@ function historyRadios(parent) {
}
}
return radios;
-}
+};
// check selection and tweak visibility/class onclick
-function diffcheck() {
+window.diffcheck = function() {
var dli = false; // the li where the diff radio is checked
var oli = false; // the li where the oldid radio is checked
var hf = document.getElementById('pagehistory');
@@ -74,21 +74,4 @@ function diffcheck() {
}
}
return true;
-}
-
-// Attach event handlers to the input elements on history page
-function histrowinit() {
- var hf = document.getElementById('pagehistory');
- if (!hf) return;
- var lis = hf.getElementsByTagName('li');
- for (var i = 0; i < lis.length; i++) {
- var inputs = historyRadios(lis[i]);
- if (inputs[0] && inputs[1]) {
- inputs[0].onclick = diffcheck;
- inputs[1].onclick = diffcheck;
- }
- }
- diffcheck();
-}
-
-hookEvent("load", histrowinit);
+};
diff --git a/skins/common/htmlform.js b/skins/common/htmlform.js
index 2045ab48..900b1660 100644
--- a/skins/common/htmlform.js
+++ b/skins/common/htmlform.js
@@ -12,7 +12,7 @@ addOnloadHook( function() {
}
} );
-var htmlforms = {
+window.htmlforms = {
'selectOrOtherSelectChanged' : function( e ) {
var select;
if ( !e ) {
@@ -36,5 +36,5 @@ var htmlforms = {
textbox.disabled = true;
}
}
-}
+};
diff --git a/skins/common/images/Arr_d.png b/skins/common/images/Arr_d.png
index 421dd101..58a9fc66 100644
--- a/skins/common/images/Arr_d.png
+++ b/skins/common/images/Arr_d.png
Binary files differ
diff --git a/skins/common/images/Arr_l.png b/skins/common/images/Arr_l.png
index 9db66232..f49e20a2 100644
--- a/skins/common/images/Arr_l.png
+++ b/skins/common/images/Arr_l.png
Binary files differ
diff --git a/skins/common/images/Arr_r.png b/skins/common/images/Arr_r.png
index d1b161b0..467a555a 100644
--- a/skins/common/images/Arr_r.png
+++ b/skins/common/images/Arr_r.png
Binary files differ
diff --git a/skins/common/images/Arr_u.png b/skins/common/images/Arr_u.png
index 75909865..957f8612 100644
--- a/skins/common/images/Arr_u.png
+++ b/skins/common/images/Arr_u.png
Binary files differ
diff --git a/skins/common/images/add.png b/skins/common/images/add.png
index 5b051f64..3418db2c 100644
--- a/skins/common/images/add.png
+++ b/skins/common/images/add.png
Binary files differ
diff --git a/skins/common/images/ar/button_bold.png b/skins/common/images/ar/button_bold.png
index 93b1783c..619cd21e 100644
--- a/skins/common/images/ar/button_bold.png
+++ b/skins/common/images/ar/button_bold.png
Binary files differ
diff --git a/skins/common/images/ar/button_headline.png b/skins/common/images/ar/button_headline.png
index 3cf2a706..f1480a66 100644
--- a/skins/common/images/ar/button_headline.png
+++ b/skins/common/images/ar/button_headline.png
Binary files differ
diff --git a/skins/common/images/ar/button_italic.png b/skins/common/images/ar/button_italic.png
index 0421846d..21245978 100644
--- a/skins/common/images/ar/button_italic.png
+++ b/skins/common/images/ar/button_italic.png
Binary files differ
diff --git a/skins/common/images/ar/button_link.png b/skins/common/images/ar/button_link.png
index ed66a7f6..a68144f3 100644
--- a/skins/common/images/ar/button_link.png
+++ b/skins/common/images/ar/button_link.png
Binary files differ
diff --git a/skins/common/images/ar/button_nowiki.png b/skins/common/images/ar/button_nowiki.png
index 97d0585a..88ab9a13 100644
--- a/skins/common/images/ar/button_nowiki.png
+++ b/skins/common/images/ar/button_nowiki.png
Binary files differ
diff --git a/skins/common/images/arrow_disabled_first_25.png b/skins/common/images/arrow_disabled_first_25.png
index aaa4bec4..dd55a9c0 100644
--- a/skins/common/images/arrow_disabled_first_25.png
+++ b/skins/common/images/arrow_disabled_first_25.png
Binary files differ
diff --git a/skins/common/images/arrow_disabled_last_25.png b/skins/common/images/arrow_disabled_last_25.png
index 7882fd8c..fd24cd10 100644
--- a/skins/common/images/arrow_disabled_last_25.png
+++ b/skins/common/images/arrow_disabled_last_25.png
Binary files differ
diff --git a/skins/common/images/arrow_disabled_left_25.png b/skins/common/images/arrow_disabled_left_25.png
index e0c30042..a450a5ee 100644
--- a/skins/common/images/arrow_disabled_left_25.png
+++ b/skins/common/images/arrow_disabled_left_25.png
Binary files differ
diff --git a/skins/common/images/arrow_disabled_right_25.png b/skins/common/images/arrow_disabled_right_25.png
index bfec3e24..d110ad8f 100644
--- a/skins/common/images/arrow_disabled_right_25.png
+++ b/skins/common/images/arrow_disabled_right_25.png
Binary files differ
diff --git a/skins/common/images/arrow_first_25.png b/skins/common/images/arrow_first_25.png
index b6351c50..ec47aa9a 100644
--- a/skins/common/images/arrow_first_25.png
+++ b/skins/common/images/arrow_first_25.png
Binary files differ
diff --git a/skins/common/images/arrow_last_25.png b/skins/common/images/arrow_last_25.png
index d416ab39..15e18f95 100644
--- a/skins/common/images/arrow_last_25.png
+++ b/skins/common/images/arrow_last_25.png
Binary files differ
diff --git a/skins/common/images/arrow_left_25.png b/skins/common/images/arrow_left_25.png
index fd05fa6f..ecd33102 100644
--- a/skins/common/images/arrow_left_25.png
+++ b/skins/common/images/arrow_left_25.png
Binary files differ
diff --git a/skins/common/images/arrow_right_25.png b/skins/common/images/arrow_right_25.png
index cf1845c6..64a3c4ee 100644
--- a/skins/common/images/arrow_right_25.png
+++ b/skins/common/images/arrow_right_25.png
Binary files differ
diff --git a/skins/common/images/be-tarask/button_italic.png b/skins/common/images/be-tarask/button_italic.png
index d93e9f87..99972127 100644
--- a/skins/common/images/be-tarask/button_italic.png
+++ b/skins/common/images/be-tarask/button_italic.png
Binary files differ
diff --git a/skins/common/images/be-tarask/button_link.png b/skins/common/images/be-tarask/button_link.png
index 07bc6a19..b87f245b 100644
--- a/skins/common/images/be-tarask/button_link.png
+++ b/skins/common/images/be-tarask/button_link.png
Binary files differ
diff --git a/skins/common/images/button_bold.png b/skins/common/images/button_bold.png
index 2827dba0..eeb91c30 100644
--- a/skins/common/images/button_bold.png
+++ b/skins/common/images/button_bold.png
Binary files differ
diff --git a/skins/common/images/button_extlink.png b/skins/common/images/button_extlink.png
index e551e47e..fdc77acd 100644
--- a/skins/common/images/button_extlink.png
+++ b/skins/common/images/button_extlink.png
Binary files differ
diff --git a/skins/common/images/button_headline.png b/skins/common/images/button_headline.png
index 9867c365..29966703 100644
--- a/skins/common/images/button_headline.png
+++ b/skins/common/images/button_headline.png
Binary files differ
diff --git a/skins/common/images/button_hr.png b/skins/common/images/button_hr.png
index 7f21402a..55f6001a 100644
--- a/skins/common/images/button_hr.png
+++ b/skins/common/images/button_hr.png
Binary files differ
diff --git a/skins/common/images/button_image.png b/skins/common/images/button_image.png
index abd47dde..a3f1ef60 100644
--- a/skins/common/images/button_image.png
+++ b/skins/common/images/button_image.png
Binary files differ
diff --git a/skins/common/images/button_italic.png b/skins/common/images/button_italic.png
index f248fa93..7074050c 100644
--- a/skins/common/images/button_italic.png
+++ b/skins/common/images/button_italic.png
Binary files differ
diff --git a/skins/common/images/button_link.png b/skins/common/images/button_link.png
index cc72b523..486c1e87 100644
--- a/skins/common/images/button_link.png
+++ b/skins/common/images/button_link.png
Binary files differ
diff --git a/skins/common/images/button_media.png b/skins/common/images/button_media.png
index 56b1b239..00d29766 100644
--- a/skins/common/images/button_media.png
+++ b/skins/common/images/button_media.png
Binary files differ
diff --git a/skins/common/images/button_nowiki.png b/skins/common/images/button_nowiki.png
index 321a2cb4..dcad330d 100644
--- a/skins/common/images/button_nowiki.png
+++ b/skins/common/images/button_nowiki.png
Binary files differ
diff --git a/skins/common/images/button_sig.png b/skins/common/images/button_sig.png
index 39de3b67..fa2af657 100644
--- a/skins/common/images/button_sig.png
+++ b/skins/common/images/button_sig.png
Binary files differ
diff --git a/skins/common/images/button_template.png b/skins/common/images/button_template.png
index ebbca3cf..576874ce 100644
--- a/skins/common/images/button_template.png
+++ b/skins/common/images/button_template.png
Binary files differ
diff --git a/skins/common/images/cc-by-nc-sa.png b/skins/common/images/cc-by-nc-sa.png
new file mode 100644
index 00000000..d15370de
--- /dev/null
+++ b/skins/common/images/cc-by-nc-sa.png
Binary files differ
diff --git a/skins/common/images/cc-by-sa.png b/skins/common/images/cc-by-sa.png
new file mode 100644
index 00000000..ee07a661
--- /dev/null
+++ b/skins/common/images/cc-by-sa.png
Binary files differ
diff --git a/skins/common/images/closewindow.png b/skins/common/images/closewindow.png
new file mode 100644
index 00000000..99ae141f
--- /dev/null
+++ b/skins/common/images/closewindow.png
Binary files differ
diff --git a/skins/common/images/critical-32.png b/skins/common/images/critical-32.png
new file mode 100644
index 00000000..8f65041e
--- /dev/null
+++ b/skins/common/images/critical-32.png
Binary files differ
diff --git a/skins/common/images/cyrl/button_italic.png b/skins/common/images/cyrl/button_italic.png
index f79170fd..46e6737a 100644
--- a/skins/common/images/cyrl/button_italic.png
+++ b/skins/common/images/cyrl/button_italic.png
Binary files differ
diff --git a/skins/common/images/de/button_bold.png b/skins/common/images/de/button_bold.png
index 32a22800..3ce6f38e 100644
--- a/skins/common/images/de/button_bold.png
+++ b/skins/common/images/de/button_bold.png
Binary files differ
diff --git a/skins/common/images/de/button_italic.png b/skins/common/images/de/button_italic.png
index 875eb2a1..af7b6d27 100644
--- a/skins/common/images/de/button_italic.png
+++ b/skins/common/images/de/button_italic.png
Binary files differ
diff --git a/skins/common/images/download-32.png b/skins/common/images/download-32.png
new file mode 100644
index 00000000..0087e10d
--- /dev/null
+++ b/skins/common/images/download-32.png
Binary files differ
diff --git a/skins/common/images/fa/button_bold.png b/skins/common/images/fa/button_bold.png
index 49680152..25fca045 100644
--- a/skins/common/images/fa/button_bold.png
+++ b/skins/common/images/fa/button_bold.png
Binary files differ
diff --git a/skins/common/images/fa/button_headline.png b/skins/common/images/fa/button_headline.png
index 9d62767e..831a4bef 100644
--- a/skins/common/images/fa/button_headline.png
+++ b/skins/common/images/fa/button_headline.png
Binary files differ
diff --git a/skins/common/images/fa/button_italic.png b/skins/common/images/fa/button_italic.png
index fc9faf3d..273ab247 100644
--- a/skins/common/images/fa/button_italic.png
+++ b/skins/common/images/fa/button_italic.png
Binary files differ
diff --git a/skins/common/images/fa/button_link.png b/skins/common/images/fa/button_link.png
index de56a5c3..345271aa 100644
--- a/skins/common/images/fa/button_link.png
+++ b/skins/common/images/fa/button_link.png
Binary files differ
diff --git a/skins/common/images/fa/button_nowiki.png b/skins/common/images/fa/button_nowiki.png
index 97d0585a..88ab9a13 100644
--- a/skins/common/images/fa/button_nowiki.png
+++ b/skins/common/images/fa/button_nowiki.png
Binary files differ
diff --git a/skins/common/images/gnu-fdl.png b/skins/common/images/gnu-fdl.png
index 10915329..b599c2fa 100644
--- a/skins/common/images/gnu-fdl.png
+++ b/skins/common/images/gnu-fdl.png
Binary files differ
diff --git a/skins/common/images/help-question-hover.gif b/skins/common/images/help-question-hover.gif
new file mode 100644
index 00000000..515138db
--- /dev/null
+++ b/skins/common/images/help-question-hover.gif
Binary files differ
diff --git a/skins/common/images/help-question.gif b/skins/common/images/help-question.gif
new file mode 100644
index 00000000..b4fc9c5b
--- /dev/null
+++ b/skins/common/images/help-question.gif
Binary files differ
diff --git a/skins/common/images/icons/fileicon-c.png b/skins/common/images/icons/fileicon-c.png
index f7984fa0..fdd06989 100644
--- a/skins/common/images/icons/fileicon-c.png
+++ b/skins/common/images/icons/fileicon-c.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-cpp.png b/skins/common/images/icons/fileicon-cpp.png
index 0a9b4cbc..d11d827e 100644
--- a/skins/common/images/icons/fileicon-cpp.png
+++ b/skins/common/images/icons/fileicon-cpp.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-deb.png b/skins/common/images/icons/fileicon-deb.png
index 605bea17..b52a4eba 100644
--- a/skins/common/images/icons/fileicon-deb.png
+++ b/skins/common/images/icons/fileicon-deb.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-djvu.png b/skins/common/images/icons/fileicon-djvu.png
index 3eaca1f8..b93b3f20 100644
--- a/skins/common/images/icons/fileicon-djvu.png
+++ b/skins/common/images/icons/fileicon-djvu.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-dvi.png b/skins/common/images/icons/fileicon-dvi.png
index 790ec41b..ab6a51f2 100644
--- a/skins/common/images/icons/fileicon-dvi.png
+++ b/skins/common/images/icons/fileicon-dvi.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-exe.png b/skins/common/images/icons/fileicon-exe.png
index f310ad0d..cc1aae51 100644
--- a/skins/common/images/icons/fileicon-exe.png
+++ b/skins/common/images/icons/fileicon-exe.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-h.png b/skins/common/images/icons/fileicon-h.png
index cf158528..73a547e5 100644
--- a/skins/common/images/icons/fileicon-h.png
+++ b/skins/common/images/icons/fileicon-h.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-html.png b/skins/common/images/icons/fileicon-html.png
index 1c3a1588..09e31f1a 100644
--- a/skins/common/images/icons/fileicon-html.png
+++ b/skins/common/images/icons/fileicon-html.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-iso.png b/skins/common/images/icons/fileicon-iso.png
index 74b06615..2cddf489 100644
--- a/skins/common/images/icons/fileicon-iso.png
+++ b/skins/common/images/icons/fileicon-iso.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-java.png b/skins/common/images/icons/fileicon-java.png
index 730ab232..c26b3f2c 100644
--- a/skins/common/images/icons/fileicon-java.png
+++ b/skins/common/images/icons/fileicon-java.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-mid.png b/skins/common/images/icons/fileicon-mid.png
index 5254418e..4143e8bb 100644
--- a/skins/common/images/icons/fileicon-mid.png
+++ b/skins/common/images/icons/fileicon-mid.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-o.png b/skins/common/images/icons/fileicon-o.png
index 24ac2cc5..872a6548 100644
--- a/skins/common/images/icons/fileicon-o.png
+++ b/skins/common/images/icons/fileicon-o.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-ogg.png b/skins/common/images/icons/fileicon-ogg.png
index c50d1ee8..2c935e2a 100644
--- a/skins/common/images/icons/fileicon-ogg.png
+++ b/skins/common/images/icons/fileicon-ogg.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-pdf.png b/skins/common/images/icons/fileicon-pdf.png
index c195c761..a19b16f3 100644
--- a/skins/common/images/icons/fileicon-pdf.png
+++ b/skins/common/images/icons/fileicon-pdf.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-ps.png b/skins/common/images/icons/fileicon-ps.png
index 342a84ee..ec1145be 100644
--- a/skins/common/images/icons/fileicon-ps.png
+++ b/skins/common/images/icons/fileicon-ps.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-rm.png b/skins/common/images/icons/fileicon-rm.png
index 534dbeb2..b803e055 100644
--- a/skins/common/images/icons/fileicon-rm.png
+++ b/skins/common/images/icons/fileicon-rm.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-rpm.png b/skins/common/images/icons/fileicon-rpm.png
index aab3ec39..e1ff985f 100644
--- a/skins/common/images/icons/fileicon-rpm.png
+++ b/skins/common/images/icons/fileicon-rpm.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-svg.png b/skins/common/images/icons/fileicon-svg.png
index 16a666f3..23b675a2 100644
--- a/skins/common/images/icons/fileicon-svg.png
+++ b/skins/common/images/icons/fileicon-svg.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-tar.png b/skins/common/images/icons/fileicon-tar.png
index 7266b5b5..7c7a910b 100644
--- a/skins/common/images/icons/fileicon-tar.png
+++ b/skins/common/images/icons/fileicon-tar.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-tex.png b/skins/common/images/icons/fileicon-tex.png
index 55187918..6f782647 100644
--- a/skins/common/images/icons/fileicon-tex.png
+++ b/skins/common/images/icons/fileicon-tex.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-ttf.png b/skins/common/images/icons/fileicon-ttf.png
index 13bd7ced..f5dc07a1 100644
--- a/skins/common/images/icons/fileicon-ttf.png
+++ b/skins/common/images/icons/fileicon-ttf.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-txt.png b/skins/common/images/icons/fileicon-txt.png
index bec58b4e..1b611016 100644
--- a/skins/common/images/icons/fileicon-txt.png
+++ b/skins/common/images/icons/fileicon-txt.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon.png b/skins/common/images/icons/fileicon.png
index 5675170b..9d8e3222 100644
--- a/skins/common/images/icons/fileicon.png
+++ b/skins/common/images/icons/fileicon.png
Binary files differ
diff --git a/skins/common/images/info-32.png b/skins/common/images/info-32.png
new file mode 100644
index 00000000..ecefa9a6
--- /dev/null
+++ b/skins/common/images/info-32.png
Binary files differ
diff --git a/skins/common/images/ksh/button_S_italic.png b/skins/common/images/ksh/button_S_italic.png
index 00000a3c..6ef742a7 100644
--- a/skins/common/images/ksh/button_S_italic.png
+++ b/skins/common/images/ksh/button_S_italic.png
Binary files differ
diff --git a/skins/common/images/mediawiki.png b/skins/common/images/mediawiki.png
index 0f35886a..915f847d 100644
--- a/skins/common/images/mediawiki.png
+++ b/skins/common/images/mediawiki.png
Binary files differ
diff --git a/skins/common/images/poweredby_mediawiki_88x31.png b/skins/common/images/poweredby_mediawiki_88x31.png
index 3714414f..835e860b 100644
--- a/skins/common/images/poweredby_mediawiki_88x31.png
+++ b/skins/common/images/poweredby_mediawiki_88x31.png
Binary files differ
diff --git a/skins/common/images/public-domain.png b/skins/common/images/public-domain.png
index f51f5602..296e66c8 100644
--- a/skins/common/images/public-domain.png
+++ b/skins/common/images/public-domain.png
Binary files differ
diff --git a/skins/common/images/redirectltr.png b/skins/common/images/redirectltr.png
index bcf5742c..0c731b6c 100644
--- a/skins/common/images/redirectltr.png
+++ b/skins/common/images/redirectltr.png
Binary files differ
diff --git a/skins/common/images/redirectrtl.png b/skins/common/images/redirectrtl.png
index 8d99841a..ad0a12d1 100644
--- a/skins/common/images/redirectrtl.png
+++ b/skins/common/images/redirectrtl.png
Binary files differ
diff --git a/skins/common/images/remove.png b/skins/common/images/remove.png
index 0cbf7d73..ba2c147d 100644
--- a/skins/common/images/remove.png
+++ b/skins/common/images/remove.png
Binary files differ
diff --git a/skins/common/images/tick-32.png b/skins/common/images/tick-32.png
new file mode 100644
index 00000000..584cef22
--- /dev/null
+++ b/skins/common/images/tick-32.png
Binary files differ
diff --git a/skins/common/images/tipsy-arrow.gif b/skins/common/images/tipsy-arrow.gif
new file mode 100644
index 00000000..9f1a15b6
--- /dev/null
+++ b/skins/common/images/tipsy-arrow.gif
Binary files differ
diff --git a/skins/common/images/tooltip_icon.png b/skins/common/images/tooltip_icon.png
index 6b3160ec..17bc2e14 100644
--- a/skins/common/images/tooltip_icon.png
+++ b/skins/common/images/tooltip_icon.png
Binary files differ
diff --git a/skins/common/images/warning-32.png b/skins/common/images/warning-32.png
new file mode 100644
index 00000000..aa6b298b
--- /dev/null
+++ b/skins/common/images/warning-32.png
Binary files differ
diff --git a/skins/common/images/wiki.png b/skins/common/images/wiki.png
index 4f1dc263..4ca6efd6 100644
--- a/skins/common/images/wiki.png
+++ b/skins/common/images/wiki.png
Binary files differ
diff --git a/skins/common/jquery.js b/skins/common/jquery.js
deleted file mode 100644
index c25ee31c..00000000
--- a/skins/common/jquery.js
+++ /dev/null
@@ -1,4384 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.3.2
- * http://jquery.com/
- *
- * Copyright (c) 2009 John Resig
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- *
- * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
- * Revision: 6246
- */
-(function(){
-
-var
- // Will speed up references to window, and allows munging its name.
- window = this,
- // Will speed up references to undefined, and allows munging its name.
- undefined,
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- jQuery = window.jQuery = window.$ = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context );
- },
-
- // A simple way to check for HTML strings or ID strings
- // (both of which we optimize for)
- quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
- // Is it a simple selector
- isSimple = /^.[^:#\[\.,]*$/;
-
-jQuery.fn = jQuery.prototype = {
- init: function( selector, context ) {
- // Make sure that a selection was provided
- selector = selector || document;
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this[0] = selector;
- this.length = 1;
- this.context = selector;
- return this;
- }
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- var match = quickExpr.exec( selector );
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] )
- selector = jQuery.clean( [ match[1] ], context );
-
- // HANDLE: $("#id")
- else {
- var elem = document.getElementById( match[3] );
-
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem && elem.id != match[3] )
- return jQuery().find( selector );
-
- // Otherwise, we inject the element directly into the jQuery object
- var ret = jQuery( elem || [] );
- ret.context = document;
- ret.selector = selector;
- return ret;
- }
-
- // HANDLE: $(expr, [context])
- // (which is just equivalent to: $(content).find(expr)
- } else
- return jQuery( context ).find( selector );
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) )
- return jQuery( document ).ready( selector );
-
- // Make sure that old selector state is passed along
- if ( selector.selector && selector.context ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return this.setArray(jQuery.isArray( selector ) ?
- selector :
- jQuery.makeArray(selector));
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.3.2",
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num === undefined ?
-
- // Return a 'clean' array
- Array.prototype.slice.call( this ) :
-
- // Return just the object
- this[ num ];
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = jQuery( elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" )
- ret.selector = this.selector + (this.selector ? " " : "") + selector;
- else if ( name )
- ret.selector = this.selector + "." + name + "(" + selector + ")";
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Force the current matched set of elements to become
- // the specified array of elements (destroying the stack in the process)
- // You should use pushStack() in order to do this, but maintain the stack
- setArray: function( elems ) {
- // Resetting the length to 0, then using the native Array push
- // is a super-fast way to populate an object with array-like properties
- this.length = 0;
- Array.prototype.push.apply( this, elems );
-
- return this;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem && elem.jquery ? elem[0] : elem
- , this );
- },
-
- attr: function( name, value, type ) {
- var options = name;
-
- // Look for the case where we're accessing a style value
- if ( typeof name === "string" )
- if ( value === undefined )
- return this[0] && jQuery[ type || "attr" ]( this[0], name );
-
- else {
- options = {};
- options[ name ] = value;
- }
-
- // Check to see if we're setting style values
- return this.each(function(i){
- // Set all the styles
- for ( name in options )
- jQuery.attr(
- type ?
- this.style :
- this,
- name, jQuery.prop( this, options[ name ], type, i, name )
- );
- });
- },
-
- css: function( key, value ) {
- // ignore negative width and height values
- if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
- value = undefined;
- return this.attr( key, value, "curCSS" );
- },
-
- text: function( text ) {
- if ( typeof text !== "object" && text != null )
- return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-
- var ret = "";
-
- jQuery.each( text || this, function(){
- jQuery.each( this.childNodes, function(){
- if ( this.nodeType != 8 )
- ret += this.nodeType != 1 ?
- this.nodeValue :
- jQuery.fn.text( [ this ] );
- });
- });
-
- return ret;
- },
-
- wrapAll: function( html ) {
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).clone();
-
- if ( this[0].parentNode )
- wrap.insertBefore( this[0] );
-
- wrap.map(function(){
- var elem = this;
-
- while ( elem.firstChild )
- elem = elem.firstChild;
-
- return elem;
- }).append(this);
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- return this.each(function(){
- jQuery( this ).contents().wrapAll( html );
- });
- },
-
- wrap: function( html ) {
- return this.each(function(){
- jQuery( this ).wrapAll( html );
- });
- },
-
- append: function() {
- return this.domManip(arguments, true, function(elem){
- if (this.nodeType == 1)
- this.appendChild( elem );
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, function(elem){
- if (this.nodeType == 1)
- this.insertBefore( elem, this.firstChild );
- });
- },
-
- before: function() {
- return this.domManip(arguments, false, function(elem){
- this.parentNode.insertBefore( elem, this );
- });
- },
-
- after: function() {
- return this.domManip(arguments, false, function(elem){
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- },
-
- end: function() {
- return this.prevObject || jQuery( [] );
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: [].push,
- sort: [].sort,
- splice: [].splice,
-
- find: function( selector ) {
- if ( this.length === 1 ) {
- var ret = this.pushStack( [], "find", selector );
- ret.length = 0;
- jQuery.find( selector, this[0], ret );
- return ret;
- } else {
- return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
- return jQuery.find( selector, elem );
- })), "find", selector );
- }
- },
-
- clone: function( events ) {
- // Do the clone
- var ret = this.map(function(){
- if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
- // IE copies events bound via attachEvent when
- // using cloneNode. Calling detachEvent on the
- // clone will also remove the events from the orignal
- // In order to get around this, we use innerHTML.
- // Unfortunately, this means some modifications to
- // attributes in IE that are actually only stored
- // as properties will not be copied (such as the
- // the name attribute on an input).
- var html = this.outerHTML;
- if ( !html ) {
- var div = this.ownerDocument.createElement("div");
- div.appendChild( this.cloneNode(true) );
- html = div.innerHTML;
- }
-
- return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
- } else
- return this.cloneNode(true);
- });
-
- // Copy the events from the original to the clone
- if ( events === true ) {
- var orig = this.find("*").andSelf(), i = 0;
-
- ret.find("*").andSelf().each(function(){
- if ( this.nodeName !== orig[i].nodeName )
- return;
-
- var events = jQuery.data( orig[i], "events" );
-
- for ( var type in events ) {
- for ( var handler in events[ type ] ) {
- jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
- }
- }
-
- i++;
- });
- }
-
- // Return the cloned set
- return ret;
- },
-
- filter: function( selector ) {
- return this.pushStack(
- jQuery.isFunction( selector ) &&
- jQuery.grep(this, function(elem, i){
- return selector.call( elem, i );
- }) ||
-
- jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
- return elem.nodeType === 1;
- }) ), "filter", selector );
- },
-
- closest: function( selector ) {
- var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
- closer = 0;
-
- return this.map(function(){
- var cur = this;
- while ( cur && cur.ownerDocument ) {
- if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
- jQuery.data(cur, "closest", closer);
- return cur;
- }
- cur = cur.parentNode;
- closer++;
- }
- });
- },
-
- not: function( selector ) {
- if ( typeof selector === "string" )
- // test special case where just one selector is passed in
- if ( isSimple.test( selector ) )
- return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
- else
- selector = jQuery.multiFilter( selector, this );
-
- var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
- return this.filter(function() {
- return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
- });
- },
-
- add: function( selector ) {
- return this.pushStack( jQuery.unique( jQuery.merge(
- this.get(),
- typeof selector === "string" ?
- jQuery( selector ) :
- jQuery.makeArray( selector )
- )));
- },
-
- is: function( selector ) {
- return !!selector && jQuery.multiFilter( selector, this ).length > 0;
- },
-
- hasClass: function( selector ) {
- return !!selector && this.is( "." + selector );
- },
-
- val: function( value ) {
- if ( value === undefined ) {
- var elem = this[0];
-
- if ( elem ) {
- if( jQuery.nodeName( elem, 'option' ) )
- return (elem.attributes.value || {}).specified ? elem.value : elem.text;
-
- // We need to handle select boxes special
- if ( jQuery.nodeName( elem, "select" ) ) {
- var index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type == "select-one";
-
- // Nothing was selected
- if ( index < 0 )
- return null;
-
- // Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
-
- if ( option.selected ) {
- // Get the specifc value for the option
- value = jQuery(option).val();
-
- // We don't need an array for one selects
- if ( one )
- return value;
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- }
-
- // Everything else, we just grab the value
- return (elem.value || "").replace(/\r/g, "");
-
- }
-
- return undefined;
- }
-
- if ( typeof value === "number" )
- value += '';
-
- return this.each(function(){
- if ( this.nodeType != 1 )
- return;
-
- if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
- this.checked = (jQuery.inArray(this.value, value) >= 0 ||
- jQuery.inArray(this.name, value) >= 0);
-
- else if ( jQuery.nodeName( this, "select" ) ) {
- var values = jQuery.makeArray(value);
-
- jQuery( "option", this ).each(function(){
- this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
- jQuery.inArray( this.text, values ) >= 0);
- });
-
- if ( !values.length )
- this.selectedIndex = -1;
-
- } else
- this.value = value;
- });
- },
-
- html: function( value ) {
- return value === undefined ?
- (this[0] ?
- this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
- null) :
- this.empty().append( value );
- },
-
- replaceWith: function( value ) {
- return this.after( value ).remove();
- },
-
- eq: function( i ) {
- return this.slice( i, +i + 1 );
- },
-
- slice: function() {
- return this.pushStack( Array.prototype.slice.apply( this, arguments ),
- "slice", Array.prototype.slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function(elem, i){
- return callback.call( elem, i, elem );
- }));
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- },
-
- domManip: function( args, table, callback ) {
- if ( this[0] ) {
- var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
- scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
- first = fragment.firstChild;
-
- if ( first )
- for ( var i = 0, l = this.length; i < l; i++ )
- callback.call( root(this[i], first), this.length > 1 || i > 0 ?
- fragment.cloneNode(true) : fragment );
-
- if ( scripts )
- jQuery.each( scripts, evalScript );
- }
-
- return this;
-
- function root( elem, cur ) {
- return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
- (elem.getElementsByTagName("tbody")[0] ||
- elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
- elem;
- }
- }
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-function evalScript( i, elem ) {
- if ( elem.src )
- jQuery.ajax({
- url: elem.src,
- async: false,
- dataType: "script"
- });
-
- else
- jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-
- if ( elem.parentNode )
- elem.parentNode.removeChild( elem );
-}
-
-function now(){
- return +new Date;
-}
-
-jQuery.extend = jQuery.fn.extend = function() {
- // copy reference to target object
- var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) )
- target = {};
-
- // extend jQuery itself if only one argument is passed
- if ( length == i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ )
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null )
- // Extend the base object
- for ( var name in options ) {
- var src = target[ name ], copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy )
- continue;
-
- // Recurse if we're merging object values
- if ( deep && copy && typeof copy === "object" && !copy.nodeType )
- target[ name ] = jQuery.extend( deep,
- // Never move original objects, clone them
- src || ( copy.length != null ? [ ] : { } )
- , copy );
-
- // Don't bring in undefined values
- else if ( copy !== undefined )
- target[ name ] = copy;
-
- }
-
- // Return the modified object
- return target;
-};
-
-// exclude the following css properties to add px
-var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
- // cache defaultView
- defaultView = document.defaultView || {},
- toString = Object.prototype.toString;
-
-jQuery.extend({
- noConflict: function( deep ) {
- window.$ = _$;
-
- if ( deep )
- window.jQuery = _jQuery;
-
- return jQuery;
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return toString.call(obj) === "[object Function]";
- },
-
- isArray: function( obj ) {
- return toString.call(obj) === "[object Array]";
- },
-
- // check if an element is in a (or is an) XML document
- isXMLDoc: function( elem ) {
- return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
- !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
- },
-
- // Evalulates a script in a global context
- globalEval: function( data ) {
- if ( data && /\S/.test(data) ) {
- // Inspired by code by Andrea Giammarchi
- // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
- var head = document.getElementsByTagName("head")[0] || document.documentElement,
- script = document.createElement("script");
-
- script.type = "text/javascript";
- if ( jQuery.support.scriptEval )
- script.appendChild( document.createTextNode( data ) );
- else
- script.text = data;
-
- // Use insertBefore instead of appendChild to circumvent an IE6 bug.
- // This arises when a base node is used (#2709).
- head.insertBefore( script, head.firstChild );
- head.removeChild( script );
- }
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0, length = object.length;
-
- if ( args ) {
- if ( length === undefined ) {
- for ( name in object )
- if ( callback.apply( object[ name ], args ) === false )
- break;
- } else
- for ( ; i < length; )
- if ( callback.apply( object[ i++ ], args ) === false )
- break;
-
- // A special, fast, case for the most common use of each
- } else {
- if ( length === undefined ) {
- for ( name in object )
- if ( callback.call( object[ name ], name, object[ name ] ) === false )
- break;
- } else
- for ( var value = object[0];
- i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
- }
-
- return object;
- },
-
- prop: function( elem, value, type, i, name ) {
- // Handle executable functions
- if ( jQuery.isFunction( value ) )
- value = value.call( elem, i );
-
- // Handle passing in a number to a CSS property
- return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
- value + "px" :
- value;
- },
-
- className: {
- // internal only, use addClass("class")
- add: function( elem, classNames ) {
- jQuery.each((classNames || "").split(/\s+/), function(i, className){
- if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
- elem.className += (elem.className ? " " : "") + className;
- });
- },
-
- // internal only, use removeClass("class")
- remove: function( elem, classNames ) {
- if (elem.nodeType == 1)
- elem.className = classNames !== undefined ?
- jQuery.grep(elem.className.split(/\s+/), function(className){
- return !jQuery.className.has( classNames, className );
- }).join(" ") :
- "";
- },
-
- // internal only, use hasClass("class")
- has: function( elem, className ) {
- return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
- }
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var old = {};
- // Remember the old values, and insert the new ones
- for ( var name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- callback.call( elem );
-
- // Revert the old values
- for ( var name in options )
- elem.style[ name ] = old[ name ];
- },
-
- css: function( elem, name, force, extra ) {
- if ( name == "width" || name == "height" ) {
- var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
-
- function getWH() {
- val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
-
- if ( extra === "border" )
- return;
-
- jQuery.each( which, function() {
- if ( !extra )
- val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
- if ( extra === "margin" )
- val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
- else
- val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
- });
- }
-
- if ( elem.offsetWidth !== 0 )
- getWH();
- else
- jQuery.swap( elem, props, getWH );
-
- return Math.max(0, Math.round(val));
- }
-
- return jQuery.curCSS( elem, name, force );
- },
-
- curCSS: function( elem, name, force ) {
- var ret, style = elem.style;
-
- // We need to handle opacity special in IE
- if ( name == "opacity" && !jQuery.support.opacity ) {
- ret = jQuery.attr( style, "opacity" );
-
- return ret == "" ?
- "1" :
- ret;
- }
-
- // Make sure we're using the right name for getting the float value
- if ( name.match( /float/i ) )
- name = styleFloat;
-
- if ( !force && style && style[ name ] )
- ret = style[ name ];
-
- else if ( defaultView.getComputedStyle ) {
-
- // Only "float" is needed here
- if ( name.match( /float/i ) )
- name = "float";
-
- name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
- try{
- var computedStyle = defaultView.getComputedStyle( elem, null );
- }catch(e){
- // Error in getting computedStyle
- }
- if ( computedStyle )
- ret = computedStyle.getPropertyValue( name );
-
- // We should always get a number back from opacity
- if ( name == "opacity" && ret == "" )
- ret = "1";
-
- } else if ( elem.currentStyle ) {
- var camelCase = name.replace(/\-(\w)/g, function(all, letter){
- return letter.toUpperCase();
- });
-
- ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
- // Remember the original values
- var left = style.left, rsLeft = elem.runtimeStyle.left;
-
- // Put in the new values to get a computed value out
- elem.runtimeStyle.left = elem.currentStyle.left;
- style.left = ret || 0;
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- elem.runtimeStyle.left = rsLeft;
- }
- }
-
- return ret;
- },
-
- clean: function( elems, context, fragment ) {
- context = context || document;
-
- // !context.createElement fails in IE with an error but returns typeof 'object'
- if ( typeof context.createElement === "undefined" )
- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
- var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
- if ( match )
- return [ context.createElement( match[1] ) ];
- }
-
- var ret = [], scripts = [], div = context.createElement("div");
-
- jQuery.each(elems, function(i, elem){
- if ( typeof elem === "number" )
- elem += '';
-
- if ( !elem )
- return;
-
- // Convert html string into DOM nodes
- if ( typeof elem === "string" ) {
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
- return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
- all :
- front + "></" + tag + ">";
- });
-
- // Trim whitespace, otherwise indexOf won't work as expected
- var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
-
- var wrap =
- // option or optgroup
- !tags.indexOf("<opt") &&
- [ 1, "<select multiple='multiple'>", "</select>" ] ||
-
- !tags.indexOf("<leg") &&
- [ 1, "<fieldset>", "</fieldset>" ] ||
-
- tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
- [ 1, "<table>", "</table>" ] ||
-
- !tags.indexOf("<tr") &&
- [ 2, "<table><tbody>", "</tbody></table>" ] ||
-
- // <thead> matched above
- (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
- [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
-
- !tags.indexOf("<col") &&
- [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
-
- // IE can't serialize <link> and <script> tags normally
- !jQuery.support.htmlSerialize &&
- [ 1, "div<div>", "</div>" ] ||
-
- [ 0, "", "" ];
-
- // Go to html and back, then peel off extra wrappers
- div.innerHTML = wrap[1] + elem + wrap[2];
-
- // Move to the right depth
- while ( wrap[0]-- )
- div = div.lastChild;
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !jQuery.support.tbody ) {
-
- // String was a <table>, *may* have spurious <tbody>
- var hasBody = /<tbody/i.test(elem),
- tbody = !tags.indexOf("<table") && !hasBody ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] == "<table>" && !hasBody ?
- div.childNodes :
- [];
-
- for ( var j = tbody.length - 1; j >= 0 ; --j )
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
-
- }
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
- div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
-
- elem = jQuery.makeArray( div.childNodes );
- }
-
- if ( elem.nodeType )
- ret.push( elem );
- else
- ret = jQuery.merge( ret, elem );
-
- });
-
- if ( fragment ) {
- for ( var i = 0; ret[i]; i++ ) {
- if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
- scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
- } else {
- if ( ret[i].nodeType === 1 )
- ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
- fragment.appendChild( ret[i] );
- }
- }
-
- return scripts;
- }
-
- return ret;
- },
-
- attr: function( elem, name, value ) {
- // don't set attributes on text and comment nodes
- if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
- return undefined;
-
- var notxml = !jQuery.isXMLDoc( elem ),
- // Whether we are setting (or getting)
- set = value !== undefined;
-
- // Try to normalize/fix the name
- name = notxml && jQuery.props[ name ] || name;
-
- // Only do all the following if this is a node (faster for style)
- // IE elem.getAttribute passes even for style
- if ( elem.tagName ) {
-
- // These attributes require special treatment
- var special = /href|src|style/.test( name );
-
- // Safari mis-reports the default selected property of a hidden option
- // Accessing the parent's selectedIndex property fixes it
- if ( name == "selected" && elem.parentNode )
- elem.parentNode.selectedIndex;
-
- // If applicable, access the attribute via the DOM 0 way
- if ( name in elem && notxml && !special ) {
- if ( set ){
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
- throw "type property can't be changed";
-
- elem[ name ] = value;
- }
-
- // browsers index elements by id/name on forms, give priority to attributes.
- if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
- return elem.getAttributeNode( name ).nodeValue;
-
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- if ( name == "tabIndex" ) {
- var attributeNode = elem.getAttributeNode( "tabIndex" );
- return attributeNode && attributeNode.specified
- ? attributeNode.value
- : elem.nodeName.match(/(button|input|object|select|textarea)/i)
- ? 0
- : elem.nodeName.match(/^(a|area)$/i) && elem.href
- ? 0
- : undefined;
- }
-
- return elem[ name ];
- }
-
- if ( !jQuery.support.style && notxml && name == "style" )
- return jQuery.attr( elem.style, "cssText", value );
-
- if ( set )
- // convert the value to a string (all browsers do this but IE) see #1070
- elem.setAttribute( name, "" + value );
-
- var attr = !jQuery.support.hrefNormalized && notxml && special
- // Some attributes require a special call on IE
- ? elem.getAttribute( name, 2 )
- : elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return attr === null ? undefined : attr;
- }
-
- // elem is actually elem.style ... set the style
-
- // IE uses filters for opacity
- if ( !jQuery.support.opacity && name == "opacity" ) {
- if ( set ) {
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- elem.zoom = 1;
-
- // Set the alpha filter to set the opacity
- elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
- (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
- }
-
- return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
- (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
- "";
- }
-
- name = name.replace(/-([a-z])/ig, function(all, letter){
- return letter.toUpperCase();
- });
-
- if ( set && value != 'NaNpx' && value != 'nullpx' ) // Patched by Trevor, see http://is.gd/5NXiD
- elem[ name ] = value;
-
- return elem[ name ];
- },
-
- trim: function( text ) {
- return (text || "").replace( /^\s+|\s+$/g, "" );
- },
-
- makeArray: function( array ) {
- var ret = [];
-
- if( array != null ){
- var i = array.length;
- // The window, strings (and functions) also have 'length'
- if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
- ret[0] = array;
- else
- while( i )
- ret[--i] = array[i];
- }
-
- return ret;
- },
-
- inArray: function( elem, array ) {
- for ( var i = 0, length = array.length; i < length; i++ )
- // Use === because on IE, window == document
- if ( array[ i ] === elem )
- return i;
-
- return -1;
- },
-
- merge: function( first, second ) {
- // We have to loop this way because IE & Opera overwrite the length
- // expando of getElementsByTagName
- var i = 0, elem, pos = first.length;
- // Also, we need to make sure that the correct elements are being returned
- // (IE returns comment nodes in a '*' query)
- if ( !jQuery.support.getAll ) {
- while ( (elem = second[ i++ ]) != null )
- if ( elem.nodeType != 8 )
- first[ pos++ ] = elem;
-
- } else
- while ( (elem = second[ i++ ]) != null )
- first[ pos++ ] = elem;
-
- return first;
- },
-
- unique: function( array ) {
- var ret = [], done = {};
-
- try {
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- var id = jQuery.data( array[ i ] );
-
- if ( !done[ id ] ) {
- done[ id ] = true;
- ret.push( array[ i ] );
- }
- }
-
- } catch( e ) {
- ret = array;
- }
-
- return ret;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [];
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ )
- if ( !inv != !callback( elems[ i ], i ) )
- ret.push( elems[ i ] );
-
- return ret;
- },
-
- map: function( elems, callback ) {
- var ret = [];
-
- // Go through the array, translating each of the items to their
- // new value (or values).
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- var value = callback( elems[ i ], i );
-
- if ( value != null )
- ret[ ret.length ] = value;
- }
-
- return ret.concat.apply( [], ret );
- }
-});
-
-// Use of jQuery.browser is deprecated.
-// It's included for backwards compatibility and plugins,
-// although they should work to migrate away.
-
-var userAgent = navigator.userAgent.toLowerCase();
-
-// Figure out what browser is being used
-jQuery.browser = {
- version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
- safari: /webkit/.test( userAgent ),
- opera: /opera/.test( userAgent ),
- msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
- mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
-};
-
-jQuery.each({
- parent: function(elem){return elem.parentNode;},
- parents: function(elem){return jQuery.dir(elem,"parentNode");},
- next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
- prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
- nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
- prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
- siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
- children: function(elem){return jQuery.sibling(elem.firstChild);},
- contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
-}, function(name, fn){
- jQuery.fn[ name ] = function( selector ) {
- var ret = jQuery.map( this, fn );
-
- if ( selector && typeof selector == "string" )
- ret = jQuery.multiFilter( selector, ret );
-
- return this.pushStack( jQuery.unique( ret ), name, selector );
- };
-});
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function(name, original){
- jQuery.fn[ name ] = function( selector ) {
- var ret = [], insert = jQuery( selector );
-
- for ( var i = 0, l = insert.length; i < l; i++ ) {
- var elems = (i > 0 ? this.clone(true) : this).get();
- jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
- ret = ret.concat( elems );
- }
-
- return this.pushStack( ret, name, selector );
- };
-});
-
-jQuery.each({
- removeAttr: function( name ) {
- jQuery.attr( this, name, "" );
- if (this.nodeType == 1)
- this.removeAttribute( name );
- },
-
- addClass: function( classNames ) {
- jQuery.className.add( this, classNames );
- },
-
- removeClass: function( classNames ) {
- jQuery.className.remove( this, classNames );
- },
-
- toggleClass: function( classNames, state ) {
- if( typeof state !== "boolean" )
- state = !jQuery.className.has( this, classNames );
- jQuery.className[ state ? "add" : "remove" ]( this, classNames );
- },
-
- remove: function( selector ) {
- if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
- // Prevent memory leaks
- jQuery( "*", this ).add([this]).each(function(){
- jQuery.event.remove(this);
- jQuery.removeData(this);
- });
- if (this.parentNode)
- this.parentNode.removeChild( this );
- }
- },
-
- empty: function() {
- // Remove element nodes and prevent memory leaks
- jQuery(this).children().remove();
-
- // Remove any remaining nodes
- while ( this.firstChild )
- this.removeChild( this.firstChild );
- }
-}, function(name, fn){
- jQuery.fn[ name ] = function(){
- return this.each( fn, arguments );
- };
-});
-
-// Helper function used by the dimensions and offset modules
-function num(elem, prop) {
- return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
-}
-var expando = "jQuery" + now(), uuid = 0, windowData = {};
-
-jQuery.extend({
- cache: {},
-
- data: function( elem, name, data ) {
- elem = elem == window ?
- windowData :
- elem;
-
- var id = elem[ expando ];
-
- // Compute a unique ID for the element
- if ( !id )
- id = elem[ expando ] = ++uuid;
-
- // Only generate the data cache if we're
- // trying to access or manipulate it
- if ( name && !jQuery.cache[ id ] )
- jQuery.cache[ id ] = {};
-
- // Prevent overriding the named cache with undefined values
- if ( data !== undefined )
- jQuery.cache[ id ][ name ] = data;
-
- // Return the named cache data, or the ID for the element
- return name ?
- jQuery.cache[ id ][ name ] :
- id;
- },
-
- removeData: function( elem, name ) {
- elem = elem == window ?
- windowData :
- elem;
-
- var id = elem[ expando ];
-
- // If we want to remove a specific section of the element's data
- if ( name ) {
- if ( jQuery.cache[ id ] ) {
- // Remove the section of cache data
- delete jQuery.cache[ id ][ name ];
-
- // If we've removed all the data, remove the element's cache
- name = "";
-
- for ( name in jQuery.cache[ id ] )
- break;
-
- if ( !name )
- jQuery.removeData( elem );
- }
-
- // Otherwise, we want to remove all of the element's data
- } else {
- // Clean up the element expando
- try {
- delete elem[ expando ];
- } catch(e){
- // IE has trouble directly removing the expando
- // but it's ok with using removeAttribute
- if ( elem.removeAttribute )
- elem.removeAttribute( expando );
- }
-
- // Completely remove the data cache
- delete jQuery.cache[ id ];
- }
- },
- queue: function( elem, type, data ) {
- if ( elem ){
-
- type = (type || "fx") + "queue";
-
- var q = jQuery.data( elem, type );
-
- if ( !q || jQuery.isArray(data) )
- q = jQuery.data( elem, type, jQuery.makeArray(data) );
- else if( data )
- q.push( data );
-
- }
- return q;
- },
-
- dequeue: function( elem, type ){
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift();
-
- if( !type || type === "fx" )
- fn = queue[0];
-
- if( fn !== undefined )
- fn.call(elem);
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ){
- var parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- if ( data === undefined && this.length )
- data = jQuery.data( this[0], key );
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- } else
- return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
- jQuery.data( this, key, value );
- });
- },
-
- removeData: function( key ){
- return this.each(function(){
- jQuery.removeData( this, key );
- });
- },
- queue: function(type, data){
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- }
-
- if ( data === undefined )
- return jQuery.queue( this[0], type );
-
- return this.each(function(){
- var queue = jQuery.queue( this, type, data );
-
- if( type == "fx" && queue.length == 1 )
- queue[0].call(this);
- });
- },
- dequeue: function(type){
- return this.each(function(){
- jQuery.dequeue( this, type );
- });
- }
-});/*!
- * Sizzle CSS Selector Engine - v0.9.3
- * Copyright 2009, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
- done = 0,
- toString = Object.prototype.toString;
-
-var Sizzle = function(selector, context, results, seed) {
- results = results || [];
- context = context || document;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 )
- return [];
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var parts = [], m, set, checkSet, check, mode, extra, prune = true;
-
- // Reset the position of the chunker regexp (start from head)
- chunker.lastIndex = 0;
-
- while ( (m = chunker.exec(selector)) !== null ) {
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = RegExp.rightContext;
- break;
- }
- }
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context );
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] )
- selector += parts.shift();
-
- set = posProcess( selector, set );
- }
- }
- } else {
- var ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
- set = Sizzle.filter( ret.expr, ret.set );
-
- if ( parts.length > 0 ) {
- checkSet = makeArray(set);
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- var cur = parts.pop(), pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, isXML(context) );
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- throw "Syntax error, unrecognized expression: " + (cur || selector);
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
- } else if ( context.nodeType === 1 ) {
- for ( var i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
- } else {
- for ( var i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, context, results, seed );
-
- if ( sortOrder ) {
- hasDuplicate = false;
- results.sort(sortOrder);
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[i-1] ) {
- results.splice(i--, 1);
- }
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function(expr, set){
- return Sizzle(expr, null, null, set);
-};
-
-Sizzle.find = function(expr, context, isXML){
- var set, match;
-
- if ( !expr ) {
- return [];
- }
-
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var type = Expr.order[i], match;
-
- if ( (match = Expr.match[ type ].exec( expr )) ) {
- var left = RegExp.leftContext;
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace(/\\/g, "");
- set = Expr.find[ type ]( match, context, isXML );
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = context.getElementsByTagName("*");
- }
-
- return {set: set, expr: expr};
-};
-
-Sizzle.filter = function(expr, set, inplace, not){
- var old = expr, result = [], curLoop = set, match, anyFound,
- isXMLFilter = set && set[0] && isXML(set[0]);
-
- while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
- if ( (match = Expr.match[ type ].exec( expr )) != null ) {
- var filter = Expr.filter[ type ], found, item;
- anyFound = false;
-
- if ( curLoop == result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- var pass = not ^ !!found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
- } else {
- curLoop[i] = false;
- }
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr == old ) {
- if ( anyFound == null ) {
- throw "Syntax error, unrecognized expression: " + expr;
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
- },
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
- attrHandle: {
- href: function(elem){
- return elem.getAttribute("href");
- }
- },
- relative: {
- "+": function(checkSet, part, isXML){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !/\W/.test(part),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag && !isXML ) {
- part = part.toUpperCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
- ">": function(checkSet, part, isXML){
- var isPartStr = typeof part === "string";
-
- if ( isPartStr && !/\W/.test(part) ) {
- part = isXML ? part : part.toUpperCase();
-
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName === part ? parent : false;
- }
- }
- } else {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
- "": function(checkSet, part, isXML){
- var doneName = done++, checkFn = dirCheck;
-
- if ( !part.match(/\W/) ) {
- var nodeCheck = part = isXML ? part : part.toUpperCase();
- checkFn = dirNodeCheck;
- }
-
- checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
- },
- "~": function(checkSet, part, isXML){
- var doneName = done++, checkFn = dirCheck;
-
- if ( typeof part === "string" && !part.match(/\W/) ) {
- var nodeCheck = part = isXML ? part : part.toUpperCase();
- checkFn = dirNodeCheck;
- }
-
- checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
- }
- },
- find: {
- ID: function(match, context, isXML){
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- return m ? [m] : [];
- }
- },
- NAME: function(match, context, isXML){
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [], results = context.getElementsByName(match[1]);
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
- TAG: function(match, context){
- return context.getElementsByTagName(match[1]);
- }
- },
- preFilter: {
- CLASS: function(match, curLoop, inplace, result, not, isXML){
- match = " " + match[1].replace(/\\/g, "") + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
- if ( !inplace )
- result.push( elem );
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
- ID: function(match){
- return match[1].replace(/\\/g, "");
- },
- TAG: function(match, curLoop){
- for ( var i = 0; curLoop[i] === false; i++ ){}
- return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
- },
- CHILD: function(match){
- if ( match[1] == "nth" ) {
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
- match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
- ATTR: function(match, curLoop, inplace, result, not, isXML){
- var name = match[1].replace(/\\/g, "");
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
- PSEUDO: function(match, curLoop, inplace, result, not){
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
- return false;
- }
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
- POS: function(match){
- match.unshift( true );
- return match;
- }
- },
- filters: {
- enabled: function(elem){
- return elem.disabled === false && elem.type !== "hidden";
- },
- disabled: function(elem){
- return elem.disabled === true;
- },
- checked: function(elem){
- return elem.checked === true;
- },
- selected: function(elem){
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- elem.parentNode.selectedIndex;
- return elem.selected === true;
- },
- parent: function(elem){
- return !!elem.firstChild;
- },
- empty: function(elem){
- return !elem.firstChild;
- },
- has: function(elem, i, match){
- return !!Sizzle( match[3], elem ).length;
- },
- header: function(elem){
- return /h\d/i.test( elem.nodeName );
- },
- text: function(elem){
- return "text" === elem.type;
- },
- radio: function(elem){
- return "radio" === elem.type;
- },
- checkbox: function(elem){
- return "checkbox" === elem.type;
- },
- file: function(elem){
- return "file" === elem.type;
- },
- password: function(elem){
- return "password" === elem.type;
- },
- submit: function(elem){
- return "submit" === elem.type;
- },
- image: function(elem){
- return "image" === elem.type;
- },
- reset: function(elem){
- return "reset" === elem.type;
- },
- button: function(elem){
- return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
- },
- input: function(elem){
- return /input|select|textarea|button/i.test(elem.nodeName);
- }
- },
- setFilters: {
- first: function(elem, i){
- return i === 0;
- },
- last: function(elem, i, match, array){
- return i === array.length - 1;
- },
- even: function(elem, i){
- return i % 2 === 0;
- },
- odd: function(elem, i){
- return i % 2 === 1;
- },
- lt: function(elem, i, match){
- return i < match[3] - 0;
- },
- gt: function(elem, i, match){
- return i > match[3] - 0;
- },
- nth: function(elem, i, match){
- return match[3] - 0 == i;
- },
- eq: function(elem, i, match){
- return match[3] - 0 == i;
- }
- },
- filter: {
- PSEUDO: function(elem, match, i, array){
- var name = match[1], filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var i = 0, l = not.length; i < l; i++ ) {
- if ( not[i] === elem ) {
- return false;
- }
- }
-
- return true;
- }
- },
- CHILD: function(elem, match){
- var type = match[1], node = elem;
- switch (type) {
- case 'only':
- case 'first':
- while (node = node.previousSibling) {
- if ( node.nodeType === 1 ) return false;
- }
- if ( type == 'first') return true;
- node = elem;
- case 'last':
- while (node = node.nextSibling) {
- if ( node.nodeType === 1 ) return false;
- }
- return true;
- case 'nth':
- var first = match[2], last = match[3];
-
- if ( first == 1 && last == 0 ) {
- return true;
- }
-
- var doneName = match[0],
- parent = elem.parentNode;
-
- if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
- var count = 0;
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
- parent.sizcache = doneName;
- }
-
- var diff = elem.nodeIndex - last;
- if ( first == 0 ) {
- return diff == 0;
- } else {
- return ( diff % first == 0 && diff / first >= 0 );
- }
- }
- },
- ID: function(elem, match){
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
- TAG: function(elem, match){
- return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
- },
- CLASS: function(elem, match){
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
- ATTR: function(elem, match){
- var name = match[1],
- result = Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value != check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
- POS: function(elem, match, i, array){
- var name = match[2], filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS;
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
-}
-
-var makeArray = function(array, results) {
- array = Array.prototype.slice.call( array );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-try {
- Array.prototype.slice.call( document.documentElement.childNodes );
-
-// Provide a fallback method if it does not work
-} catch(e){
- makeArray = function(array, results) {
- var ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
- } else {
- if ( typeof array.length === "number" ) {
- for ( var i = 0, l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
- } else {
- for ( var i = 0; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
- if ( ret === 0 ) {
- hasDuplicate = true;
- }
- return ret;
- };
-} else if ( "sourceIndex" in document.documentElement ) {
- sortOrder = function( a, b ) {
- var ret = a.sourceIndex - b.sourceIndex;
- if ( ret === 0 ) {
- hasDuplicate = true;
- }
- return ret;
- };
-} else if ( document.createRange ) {
- sortOrder = function( a, b ) {
- var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
- aRange.selectNode(a);
- aRange.collapse(true);
- bRange.selectNode(b);
- bRange.collapse(true);
- var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
- if ( ret === 0 ) {
- hasDuplicate = true;
- }
- return ret;
- };
-}
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("form"),
- id = "script" + (new Date).getTime();
- form.innerHTML = "<input name='" + id + "'/>";
-
- // Inject it into the root element, check its status, and remove it quickly
- var root = document.documentElement;
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( !!document.getElementById( id ) ) {
- Expr.find.ID = function(match, context, isXML){
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
- }
- };
-
- Expr.filter.ID = function(elem, match){
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-})();
-
-(function(){
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function(match, context){
- var results = context.getElementsByTagName(match[1]);
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "<a href='#'></a>";
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
- Expr.attrHandle.href = function(elem){
- return elem.getAttribute("href", 2);
- };
- }
-})();
-
-if ( document.querySelectorAll ) (function(){
- var oldSizzle = Sizzle, div = document.createElement("div");
- div.innerHTML = "<p class='TEST'></p>";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function(query, context, extra, seed){
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && context.nodeType === 9 && !isXML(context) ) {
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(e){}
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- Sizzle.find = oldSizzle.find;
- Sizzle.filter = oldSizzle.filter;
- Sizzle.selectors = oldSizzle.selectors;
- Sizzle.matches = oldSizzle.matches;
-})();
-
-if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
- var div = document.createElement("div");
- div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
- // Opera can't find a second classname (in 9.6)
- if ( div.getElementsByClassName("e").length === 0 )
- return;
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 )
- return;
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function(match, context, isXML) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- var sibDir = dir == "previousSibling" && !isXML;
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- if ( sibDir && elem.nodeType === 1 ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
- elem = elem[dir];
- var match = false;
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- var sibDir = dir == "previousSibling" && !isXML;
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- if ( sibDir && elem.nodeType === 1 ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
- elem = elem[dir];
- var match = false;
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-var contains = document.compareDocumentPosition ? function(a, b){
- return a.compareDocumentPosition(b) & 16;
-} : function(a, b){
- return a !== b && (a.contains ? a.contains(b) : true);
-};
-
-var isXML = function(elem){
- return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
- !!elem.ownerDocument && isXML( elem.ownerDocument );
-};
-
-var posProcess = function(selector, context){
- var tmpSet = [], later = "", match,
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-jQuery.find = Sizzle;
-jQuery.filter = Sizzle.filter;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-
-Sizzle.selectors.filters.hidden = function(elem){
- return elem.offsetWidth === 0 || elem.offsetHeight === 0;
-};
-
-Sizzle.selectors.filters.visible = function(elem){
- return elem.offsetWidth > 0 || elem.offsetHeight > 0;
-};
-
-Sizzle.selectors.filters.animated = function(elem){
- return jQuery.grep(jQuery.timers, function(fn){
- return elem === fn.elem;
- }).length;
-};
-
-jQuery.multiFilter = function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return Sizzle.matches(expr, elems);
-};
-
-jQuery.dir = function( elem, dir ){
- var matched = [], cur = elem[dir];
- while ( cur && cur != document ) {
- if ( cur.nodeType == 1 )
- matched.push( cur );
- cur = cur[dir];
- }
- return matched;
-};
-
-jQuery.nth = function(cur, result, dir, elem){
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] )
- if ( cur.nodeType == 1 && ++num == result )
- break;
-
- return cur;
-};
-
-jQuery.sibling = function(n, elem){
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType == 1 && n != elem )
- r.push( n );
- }
-
- return r;
-};
-
-return;
-
-window.Sizzle = Sizzle;
-
-})();
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code originated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
- // Bind an event to an element
- // Original by Dean Edwards
- add: function(elem, types, handler, data) {
- if ( elem.nodeType == 3 || elem.nodeType == 8 )
- return;
-
- // For whatever reason, IE has trouble passing the window object
- // around, causing it to be cloned in the process
- if ( elem.setInterval && elem != window )
- elem = window;
-
- // Make sure that the function being executed has a unique ID
- if ( !handler.guid )
- handler.guid = this.guid++;
-
- // if data is passed, bind to handler
- if ( data !== undefined ) {
- // Create temporary function pointer to original handler
- var fn = handler;
-
- // Create unique handler function, wrapped around original handler
- handler = this.proxy( fn );
-
- // Store data in unique handler
- handler.data = data;
- }
-
- // Init the element's event structure
- var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
- handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
- // Handle the second event of a trigger and when
- // an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
- jQuery.event.handle.apply(arguments.callee.elem, arguments) :
- undefined;
- });
- // Add elem as a property of the handle function
- // This is to prevent a memory leak with non-native
- // event in IE.
- handle.elem = elem;
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- jQuery.each(types.split(/\s+/), function(index, type) {
- // Namespaced event handlers
- var namespaces = type.split(".");
- type = namespaces.shift();
- handler.type = namespaces.slice().sort().join(".");
-
- // Get the current list of functions bound to this event
- var handlers = events[type];
-
- if ( jQuery.event.specialAll[type] )
- jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
-
- // Init the event handler queue
- if (!handlers) {
- handlers = events[type] = {};
-
- // Check for a special event handler
- // Only use addEventListener/attachEvent if the special
- // events handler returns false
- if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
- // Bind the global event handler to the element
- if (elem.addEventListener)
- elem.addEventListener(type, handle, false);
- else if (elem.attachEvent)
- elem.attachEvent("on" + type, handle);
- }
- }
-
- // Add the function to the element's handler list
- handlers[handler.guid] = handler;
-
- // Keep track of which events have been used, for global triggering
- jQuery.event.global[type] = true;
- });
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- guid: 1,
- global: {},
-
- // Detach an event or set of events from an element
- remove: function(elem, types, handler) {
- // don't do events on text and comment nodes
- if ( elem.nodeType == 3 || elem.nodeType == 8 )
- return;
-
- var events = jQuery.data(elem, "events"), ret, index;
-
- if ( events ) {
- // Unbind all events for the element
- if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
- for ( var type in events )
- this.remove( elem, type + (types || "") );
- else {
- // types is actually an event object here
- if ( types.type ) {
- handler = types.handler;
- types = types.type;
- }
-
- // Handle multiple events seperated by a space
- // jQuery(...).unbind("mouseover mouseout", fn);
- jQuery.each(types.split(/\s+/), function(index, type){
- // Namespaced event handlers
- var namespaces = type.split(".");
- type = namespaces.shift();
- var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
-
- if ( events[type] ) {
- // remove the given handler for the given type
- if ( handler )
- delete events[type][handler.guid];
-
- // remove all handlers for the given type
- else
- for ( var handle in events[type] )
- // Handle the removal of namespaced events
- if ( namespace.test(events[type][handle].type) )
- delete events[type][handle];
-
- if ( jQuery.event.specialAll[type] )
- jQuery.event.specialAll[type].teardown.call(elem, namespaces);
-
- // remove generic event handler if no more handlers exist
- for ( ret in events[type] ) break;
- if ( !ret ) {
- if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
- if (elem.removeEventListener)
- elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
- else if (elem.detachEvent)
- elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
- }
- ret = null;
- delete events[type];
- }
- }
- });
- }
-
- // Remove the expando if it's no longer used
- for ( ret in events ) break;
- if ( !ret ) {
- var handle = jQuery.data( elem, "handle" );
- if ( handle ) handle.elem = null;
- jQuery.removeData( elem, "events" );
- jQuery.removeData( elem, "handle" );
- }
- }
- },
-
- // bubbling is internal
- trigger: function( event, data, elem, bubbling ) {
- // Event object or event type
- var type = event.type || event;
-
- if( !bubbling ){
- event = typeof event === "object" ?
- // jQuery.Event object
- event[expando] ? event :
- // Object literal
- jQuery.extend( jQuery.Event(type), event ) :
- // Just the event type (string)
- jQuery.Event(type);
-
- if ( type.indexOf("!") >= 0 ) {
- event.type = type = type.slice(0, -1);
- event.exclusive = true;
- }
-
- // Handle a global trigger
- if ( !elem ) {
- // Don't bubble custom events when global (to avoid too much overhead)
- event.stopPropagation();
- // Only trigger if we've ever bound an event for it
- if ( this.global[type] )
- jQuery.each( jQuery.cache, function(){
- if ( this.events && this.events[type] )
- jQuery.event.trigger( event, data, this.handle.elem );
- });
- }
-
- // Handle triggering a single element
-
- // don't do events on text and comment nodes
- if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
- return undefined;
-
- // Clean up in case it is reused
- event.result = undefined;
- event.target = elem;
-
- // Clone the incoming data, if any
- data = jQuery.makeArray(data);
- data.unshift( event );
- }
-
- event.currentTarget = elem;
-
- // Trigger the event, it is assumed that "handle" is a function
- var handle = jQuery.data(elem, "handle");
- if ( handle )
- handle.apply( elem, data );
-
- // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
- if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
- event.result = false;
-
- // Trigger the native events (except for clicks on links)
- if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
- this.triggered = true;
- try {
- elem[ type ]();
- // prevent IE from throwing an error for some hidden elements
- } catch (e) {}
- }
-
- this.triggered = false;
-
- if ( !event.isPropagationStopped() ) {
- var parent = elem.parentNode || elem.ownerDocument;
- if ( parent )
- jQuery.event.trigger(event, data, parent, true);
- }
- },
-
- handle: function(event) {
- // returned undefined or false
- var all, handlers;
-
- event = arguments[0] = jQuery.event.fix( event || window.event );
- event.currentTarget = this;
-
- // Namespaced event handlers
- var namespaces = event.type.split(".");
- event.type = namespaces.shift();
-
- // Cache this now, all = true means, any handler
- all = !namespaces.length && !event.exclusive;
-
- var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
-
- handlers = ( jQuery.data(this, "events") || {} )[event.type];
-
- for ( var j in handlers ) {
- var handler = handlers[j];
-
- // Filter the functions by class
- if ( all || namespace.test(handler.type) ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- event.handler = handler;
- event.data = handler.data;
-
- var ret = handler.apply(this, arguments);
-
- if( ret !== undefined ){
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
-
- if( event.isImmediatePropagationStopped() )
- break;
-
- }
- }
- },
-
- props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-
- fix: function(event) {
- if ( event[expando] )
- return event;
-
- // store a copy of the original event object
- // and "clone" to set read-only properties
- var originalEvent = event;
- event = jQuery.Event( originalEvent );
-
- for ( var i = this.props.length, prop; i; ){
- prop = this.props[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary
- if ( !event.target )
- event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
-
- // check if target is a textnode (safari)
- if ( event.target.nodeType == 3 )
- event.target = event.target.parentNode;
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement )
- event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var doc = document.documentElement, body = document.body;
- event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
- event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
- }
-
- // Add which for key events
- if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
- event.which = event.charCode || event.keyCode;
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey )
- event.metaKey = event.ctrlKey;
-
- // Add which for click: 1 == left; 2 == middle; 3 == right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button )
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
-
- return event;
- },
-
- proxy: function( fn, proxy ){
- proxy = proxy || function(){ return fn.apply(this, arguments); };
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
- // So proxy can be declared as an argument
- return proxy;
- },
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: bindReady,
- teardown: function() {}
- }
- },
-
- specialAll: {
- live: {
- setup: function( selector, namespaces ){
- jQuery.event.add( this, namespaces[0], liveHandler );
- },
- teardown: function( namespaces ){
- if ( namespaces.length ) {
- var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
-
- jQuery.each( (jQuery.data(this, "events").live || {}), function(){
- if ( name.test(this.type) )
- remove++;
- });
-
- if ( remove < 1 )
- jQuery.event.remove( this, namespaces[0], liveHandler );
- }
- }
- }
- }
-};
-
-jQuery.Event = function( src ){
- // Allow instantiation without the 'new' keyword
- if( !this.preventDefault )
- return new jQuery.Event(src);
-
- // Event object
- if( src && src.type ){
- this.originalEvent = src;
- this.type = src.type;
- // Event type
- }else
- this.type = src;
-
- // timeStamp is buggy for some events on Firefox(#3843)
- // So we won't rely on the native value
- this.timeStamp = now();
-
- // Mark it as fixed
- this[expando] = true;
-};
-
-function returnFalse(){
- return false;
-}
-function returnTrue(){
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if( !e )
- return;
- // if preventDefault exists run it on the original event
- if (e.preventDefault)
- e.preventDefault();
- // otherwise set the returnValue property of the original event to false (IE)
- e.returnValue = false;
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if( !e )
- return;
- // if stopPropagation exists run it on the original event
- if (e.stopPropagation)
- e.stopPropagation();
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation:function(){
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function(event) {
- // Check if mouse(over|out) are still within the same parent element
- var parent = event.relatedTarget;
- // Traverse up the tree
- while ( parent && parent != this )
- try { parent = parent.parentNode; }
- catch(e) { parent = this; }
-
- if( parent != this ){
- // set the correct event type
- event.type = event.data;
- // handle event if we actually just moused on to a non sub-element
- jQuery.event.handle.apply( this, arguments );
- }
-};
-
-jQuery.each({
- mouseover: 'mouseenter',
- mouseout: 'mouseleave'
-}, function( orig, fix ){
- jQuery.event.special[ fix ] = {
- setup: function(){
- jQuery.event.add( this, orig, withinElement, fix );
- },
- teardown: function(){
- jQuery.event.remove( this, orig, withinElement );
- }
- };
-});
-
-jQuery.fn.extend({
- bind: function( type, data, fn ) {
- return type == "unload" ? this.one(type, data, fn) : this.each(function(){
- jQuery.event.add( this, type, fn || data, fn && data );
- });
- },
-
- one: function( type, data, fn ) {
- var one = jQuery.event.proxy( fn || data, function(event) {
- jQuery(this).unbind(event, one);
- return (fn || data).apply( this, arguments );
- });
- return this.each(function(){
- jQuery.event.add( this, type, one, fn && data);
- });
- },
-
- unbind: function( type, fn ) {
- return this.each(function(){
- jQuery.event.remove( this, type, fn );
- });
- },
-
- trigger: function( type, data ) {
- return this.each(function(){
- jQuery.event.trigger( type, data, this );
- });
- },
-
- triggerHandler: function( type, data ) {
- if( this[0] ){
- var event = jQuery.Event(type);
- event.preventDefault();
- event.stopPropagation();
- jQuery.event.trigger( event, data, this[0] );
- return event.result;
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments, i = 1;
-
- // link all the functions, so any of them can unbind this click handler
- while( i < args.length )
- jQuery.event.proxy( fn, args[i++] );
-
- return this.click( jQuery.event.proxy( fn, function(event) {
- // Figure out which function to execute
- this.lastToggle = ( this.lastToggle || 0 ) % i;
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ this.lastToggle++ ].apply( this, arguments ) || false;
- }));
- },
-
- hover: function(fnOver, fnOut) {
- return this.mouseenter(fnOver).mouseleave(fnOut);
- },
-
- ready: function(fn) {
- // Attach the listeners
- bindReady();
-
- // If the DOM is already ready
- if ( jQuery.isReady )
- // Execute the function immediately
- fn.call( document, jQuery );
-
- // Otherwise, remember the function for later
- else
- // Add the function to the wait list
- jQuery.readyList.push( fn );
-
- return this;
- },
-
- live: function( type, fn ){
- var proxy = jQuery.event.proxy( fn );
- proxy.guid += this.selector + type;
-
- jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
-
- return this;
- },
-
- die: function( type, fn ){
- jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
- return this;
- }
-});
-
-function liveHandler( event ){
- var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
- stop = true,
- elems = [];
-
- jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
- if ( check.test(fn.type) ) {
- var elem = jQuery(event.target).closest(fn.data)[0];
- if ( elem )
- elems.push({ elem: elem, fn: fn });
- }
- });
-
- elems.sort(function(a,b) {
- return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
- });
-
- jQuery.each(elems, function(){
- if ( this.fn.call(this.elem, event, this.fn.data) === false )
- return (stop = false);
- });
-
- return stop;
-}
-
-function liveConvert(type, selector){
- return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
-}
-
-jQuery.extend({
- isReady: false,
- readyList: [],
- // Handle when the DOM is ready
- ready: function() {
- // Make sure that the DOM is not already loaded
- if ( !jQuery.isReady ) {
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If there are functions bound, to execute
- if ( jQuery.readyList ) {
- // Execute all of them
- jQuery.each( jQuery.readyList, function(){
- this.call( document, jQuery );
- });
-
- // Reset the list of functions
- jQuery.readyList = null;
- }
-
- // Trigger any bound ready events
- jQuery(document).triggerHandler("ready");
- }
- }
-});
-
-var readyBound = false;
-
-function bindReady(){
- if ( readyBound ) return;
- readyBound = true;
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", function(){
- document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
- jQuery.ready();
- }, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent("onreadystatechange", function(){
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", arguments.callee );
- jQuery.ready();
- }
- });
-
- // If IE and not an iframe
- // continually check to see if the document is ready
- if ( document.documentElement.doScroll && window == window.top ) (function(){
- if ( jQuery.isReady ) return;
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch( error ) {
- setTimeout( arguments.callee, 0 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
- })();
- }
-
- // A fallback to window.onload, that will always work
- jQuery.event.add( window, "load", jQuery.ready );
-}
-
-jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
- "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
- "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
-
- // Handle event binding
- jQuery.fn[name] = function(fn){
- return fn ? this.bind(name, fn) : this.trigger(name);
- };
-});
-
-// Prevent memory leaks in IE
-// And prevent errors on refresh with events like mouseover in other browsers
-// Window isn't included so as not to unbind existing unload events
-jQuery( window ).bind( 'unload', function(){
- for ( var id in jQuery.cache )
- // Skip the window
- if ( id != 1 && jQuery.cache[ id ].handle )
- jQuery.event.remove( jQuery.cache[ id ].handle.elem );
-});
-(function(){
-
- jQuery.support = {};
-
- var root = document.documentElement,
- script = document.createElement("script"),
- div = document.createElement("div"),
- id = "script" + (new Date).getTime();
-
- div.style.display = "none";
- div.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
-
- var all = div.getElementsByTagName("*"),
- a = div.getElementsByTagName("a")[0];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return;
- }
-
- jQuery.support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: div.firstChild.nodeType == 3,
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName("tbody").length,
-
- // Make sure that you can get all elements in an <object> element
- // IE 7 always returns no results
- objectAll: !!div.getElementsByTagName("object")[0]
- .getElementsByTagName("*").length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName("link").length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText insted)
- style: /red/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: a.getAttribute("href") === "/a",
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- opacity: a.style.opacity === "0.5",
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Will be defined later
- scriptEval: false,
- noCloneEvent: true,
- boxModel: null
- };
-
- script.type = "text/javascript";
- try {
- script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
- } catch(e){}
-
- root.insertBefore( script, root.firstChild );
-
- // Make sure that the execution of code works by injecting a script
- // tag with appendChild/createTextNode
- // (IE doesn't support this, fails, and uses .text instead)
- if ( window[ id ] ) {
- jQuery.support.scriptEval = true;
- delete window[ id ];
- }
-
- root.removeChild( script );
-
- if ( div.attachEvent && div.fireEvent ) {
- div.attachEvent("onclick", function(){
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- jQuery.support.noCloneEvent = false;
- div.detachEvent("onclick", arguments.callee);
- });
- div.cloneNode(true).fireEvent("onclick");
- }
-
- // Figure out if the W3C box model works as expected
- // document.body must exist before we can do this
- jQuery(function(){
- var div = document.createElement("div");
- div.style.width = div.style.paddingLeft = "1px";
-
- document.body.appendChild( div );
- jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
- document.body.removeChild( div ).style.display = 'none';
- });
-})();
-
-var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
-
-jQuery.props = {
- "for": "htmlFor",
- "class": "className",
- "float": styleFloat,
- cssFloat: styleFloat,
- styleFloat: styleFloat,
- readonly: "readOnly",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- rowspan: "rowSpan",
- tabindex: "tabIndex"
-};
-jQuery.fn.extend({
- // Keep a copy of the old load
- _load: jQuery.fn.load,
-
- load: function( url, params, callback ) {
- if ( typeof url !== "string" )
- return this._load( url );
-
- var off = url.indexOf(" ");
- if ( off >= 0 ) {
- var selector = url.slice(off, url.length);
- url = url.slice(0, off);
- }
-
- // Default to a GET request
- var type = "GET";
-
- // If the second parameter was provided
- if ( params )
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
- // We assume that it's the callback
- callback = params;
- params = null;
-
- // Otherwise, build a param string
- } else if( typeof params === "object" ) {
- params = jQuery.param( params );
- type = "POST";
- }
-
- var self = this;
-
- // Request the remote document
- jQuery.ajax({
- url: url,
- type: type,
- dataType: "html",
- data: params,
- complete: function(res, status){
- // If successful, inject the HTML into all the matched elements
- if ( status == "success" || status == "notmodified" )
- // See if a selector was specified
- self.html( selector ?
- // Create a dummy div to hold the results
- jQuery("<div/>")
- // inject the contents of the document in, removing the scripts
- // to avoid any 'Permission Denied' errors in IE
- .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
-
- // Locate the specified elements
- .find(selector) :
-
- // If not, just inject the full result
- res.responseText );
-
- if( callback )
- self.each( callback, [res.responseText, status, res] );
- }
- });
- return this;
- },
-
- serialize: function() {
- return jQuery.param(this.serializeArray());
- },
- serializeArray: function() {
- return this.map(function(){
- return this.elements ? jQuery.makeArray(this.elements) : this;
- })
- .filter(function(){
- return this.name && !this.disabled &&
- (this.checked || /select|textarea/i.test(this.nodeName) ||
- /text|hidden|password|search/i.test(this.type));
- })
- .map(function(i, elem){
- var val = jQuery(this).val();
- return val == null ? null :
- jQuery.isArray(val) ?
- jQuery.map( val, function(val, i){
- return {name: elem.name, value: val};
- }) :
- {name: elem.name, value: val};
- }).get();
- }
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
- jQuery.fn[o] = function(f){
- return this.bind(o, f);
- };
-});
-
-var jsc = now();
-
-jQuery.extend({
-
- get: function( url, data, callback, type ) {
- // shift arguments if data argument was ommited
- if ( jQuery.isFunction( data ) ) {
- callback = data;
- data = null;
- }
-
- return jQuery.ajax({
- type: "GET",
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- },
-
- getScript: function( url, callback ) {
- return jQuery.get(url, null, callback, "script");
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get(url, data, callback, "json");
- },
-
- post: function( url, data, callback, type ) {
- if ( jQuery.isFunction( data ) ) {
- callback = data;
- data = {};
- }
-
- return jQuery.ajax({
- type: "POST",
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- },
-
- ajaxSetup: function( settings ) {
- jQuery.extend( jQuery.ajaxSettings, settings );
- },
-
- ajaxSettings: {
- url: location.href,
- global: true,
- type: "GET",
- contentType: "application/x-www-form-urlencoded",
- processData: true,
- async: true,
- /*
- timeout: 0,
- data: null,
- username: null,
- password: null,
- */
- // Create the request object; Microsoft failed to properly
- // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
- // This function can be overriden by calling jQuery.ajaxSetup
- xhr:function(){
- return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
- },
- accepts: {
- xml: "application/xml, text/xml",
- html: "text/html",
- script: "text/javascript, application/javascript",
- json: "application/json, text/javascript",
- text: "text/plain",
- _default: "*/*"
- }
- },
-
- // Last-Modified header cache for next request
- lastModified: {},
-
- ajax: function( s ) {
- // Extend the settings, but re-extend 's' so that it can be
- // checked again later (in the test suite, specifically)
- s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
-
- var jsonp, jsre = /=\?(&|$)/g, status, data,
- type = s.type.toUpperCase();
-
- // convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" )
- s.data = jQuery.param(s.data);
-
- // Handle JSONP Parameter Callbacks
- if ( s.dataType == "jsonp" ) {
- if ( type == "GET" ) {
- if ( !s.url.match(jsre) )
- s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
- } else if ( !s.data || !s.data.match(jsre) )
- s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
- s.dataType = "json";
- }
-
- // Build temporary JSONP function
- if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
- jsonp = "jsonp" + jsc++;
-
- // Replace the =? sequence both in the query string and the data
- if ( s.data )
- s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
- s.url = s.url.replace(jsre, "=" + jsonp + "$1");
-
- // We need to make sure
- // that a JSONP style response is executed properly
- s.dataType = "script";
-
- // Handle JSONP-style loading
- window[ jsonp ] = function(tmp){
- data = tmp;
- success();
- complete();
- // Garbage collect
- window[ jsonp ] = undefined;
- try{ delete window[ jsonp ]; } catch(e){}
- if ( head )
- head.removeChild( script );
- };
- }
-
- if ( s.dataType == "script" && s.cache == null )
- s.cache = false;
-
- if ( s.cache === false && type == "GET" ) {
- var ts = now();
- // try replacing _= if it is there
- var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
- // if nothing was replaced, add timestamp to the end
- s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
- }
-
- // If data is available, append data to url for get requests
- if ( s.data && type == "GET" ) {
- s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
-
- // IE likes to send both get and post data, prevent this
- s.data = null;
- }
-
- // Watch for a new set of requests
- if ( s.global && ! jQuery.active++ )
- jQuery.event.trigger( "ajaxStart" );
-
- // Matches an absolute URL, and saves the domain
- var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
-
- // If we're requesting a remote document
- // and trying to load JSON or Script with a GET
- if ( s.dataType == "script" && type == "GET" && parts
- && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
-
- var head = document.getElementsByTagName("head")[0];
- var script = document.createElement("script");
- script.src = s.url;
- if (s.scriptCharset)
- script.charset = s.scriptCharset;
-
- // Handle Script loading
- if ( !jsonp ) {
- var done = false;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function(){
- if ( !done && (!this.readyState ||
- this.readyState == "loaded" || this.readyState == "complete") ) {
- done = true;
- success();
- complete();
-
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
- head.removeChild( script );
- }
- };
- }
-
- head.appendChild(script);
-
- // We handle everything using the script element injection
- return undefined;
- }
-
- var requestDone = false;
-
- // Create the request object
- var xhr = s.xhr();
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if( s.username )
- xhr.open(type, s.url, s.async, s.username, s.password);
- else
- xhr.open(type, s.url, s.async);
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- // Set the correct header, if data is being sent
- if ( s.data )
- xhr.setRequestHeader("Content-Type", s.contentType);
-
- // Set the If-Modified-Since header, if ifModified mode.
- if ( s.ifModified )
- xhr.setRequestHeader("If-Modified-Since",
- jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
-
- // Set header so the called script knows that it's an XMLHttpRequest
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
-
- // Set the Accepts header for the server, depending on the dataType
- xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
- s.accepts[ s.dataType ] + ", */*" :
- s.accepts._default );
- } catch(e){}
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active )
- jQuery.event.trigger( "ajaxStop" );
- // close opended socket
- xhr.abort();
- return false;
- }
-
- if ( s.global )
- jQuery.event.trigger("ajaxSend", [xhr, s]);
-
- // Wait for a response to come back
- var onreadystatechange = function(isTimeout){
- // The request was aborted, clear the interval and decrement jQuery.active
- if (xhr.readyState == 0) {
- if (ival) {
- // clear poll interval
- clearInterval(ival);
- ival = null;
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active )
- jQuery.event.trigger( "ajaxStop" );
- }
- // The transfer is complete and the data is available, or the request timed out
- } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
- requestDone = true;
-
- // clear poll interval
- if (ival) {
- clearInterval(ival);
- ival = null;
- }
-
- status = isTimeout == "timeout" ? "timeout" :
- !jQuery.httpSuccess( xhr ) ? "error" :
- s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
- "success";
-
- if ( status == "success" ) {
- // Watch for, and catch, XML document parse errors
- try {
- // process the data (runs the xml through httpData regardless of callback)
- data = jQuery.httpData( xhr, s.dataType, s );
- } catch(e) {
- status = "parsererror";
- }
- }
-
- // Make sure that the request was successful or notmodified
- if ( status == "success" ) {
- // Cache Last-Modified header, if ifModified mode.
- var modRes;
- try {
- modRes = xhr.getResponseHeader("Last-Modified");
- } catch(e) {} // swallow exception thrown by FF if header is not available
-
- if ( s.ifModified && modRes )
- jQuery.lastModified[s.url] = modRes;
-
- // JSONP handles its own success callback
- if ( !jsonp )
- success();
- } else
- jQuery.handleError(s, xhr, status);
-
- // Fire the complete handlers
- complete();
-
- if ( isTimeout )
- xhr.abort();
-
- // Stop memory leaks
- if ( s.async )
- xhr = null;
- }
- };
-
- if ( s.async ) {
- // don't attach the handler to the request, just poll it instead
- var ival = setInterval(onreadystatechange, 13);
-
- // Timeout checker
- if ( s.timeout > 0 )
- setTimeout(function(){
- // Check to see if the request is still happening
- if ( xhr && !requestDone )
- onreadystatechange( "timeout" );
- }, s.timeout);
- }
-
- // Send the data
- try {
- xhr.send(s.data);
- } catch(e) {
- jQuery.handleError(s, xhr, null, e);
- }
-
- // firefox 1.5 doesn't fire statechange for sync requests
- if ( !s.async )
- onreadystatechange();
-
- function success(){
- // If a local callback was specified, fire it and pass it the data
- if ( s.success )
- s.success( data, status );
-
- // Fire the global callback
- if ( s.global )
- jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
- }
-
- function complete(){
- // Process result
- if ( s.complete )
- s.complete(xhr, status);
-
- // The request was completed
- if ( s.global )
- jQuery.event.trigger( "ajaxComplete", [xhr, s] );
-
- // Handle the global AJAX counter
- if ( s.global && ! --jQuery.active )
- jQuery.event.trigger( "ajaxStop" );
- }
-
- // return XMLHttpRequest to allow aborting the request etc.
- return xhr;
- },
-
- handleError: function( s, xhr, status, e ) {
- // If a local callback was specified, fire it
- if ( s.error ) s.error( xhr, status, e );
-
- // Fire the global callback
- if ( s.global )
- jQuery.event.trigger( "ajaxError", [xhr, s, e] );
- },
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Determines if an XMLHttpRequest was successful or not
- httpSuccess: function( xhr ) {
- try {
- // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
- return !xhr.status && location.protocol == "file:" ||
- ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
- } catch(e){}
- return false;
- },
-
- // Determines if an XMLHttpRequest returns NotModified
- httpNotModified: function( xhr, url ) {
- try {
- var xhrRes = xhr.getResponseHeader("Last-Modified");
-
- // Firefox always returns 200. check Last-Modified date
- return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
- } catch(e){}
- return false;
- },
-
- httpData: function( xhr, type, s ) {
- var ct = xhr.getResponseHeader("content-type"),
- xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
- data = xml ? xhr.responseXML : xhr.responseText;
-
- if ( xml && data.documentElement.tagName == "parsererror" )
- throw "parsererror";
-
- // Allow a pre-filtering function to sanitize the response
- // s != null is checked to keep backwards compatibility
- if( s && s.dataFilter )
- data = s.dataFilter( data, type );
-
- // The filter can actually parse the response
- if( typeof data === "string" ){
-
- // If the type is "script", eval it in global context
- if ( type == "script" )
- jQuery.globalEval( data );
-
- // Get the JavaScript object, if JSON is used.
- if ( type == "json" )
- data = window["eval"]("(" + data + ")");
- }
-
- return data;
- },
-
- // Serialize an array of form elements or a set of
- // key/values into a query string
- param: function( a ) {
- var s = [ ];
-
- function add( key, value ){
- s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- };
-
- // If an array was passed in, assume that it is an array
- // of form elements
- if ( jQuery.isArray(a) || a.jquery )
- // Serialize the form elements
- jQuery.each( a, function(){
- add( this.name, this.value );
- });
-
- // Otherwise, assume that it's an object of key/value pairs
- else
- // Serialize the key/values
- for ( var j in a )
- // If the value is an array then the key names need to be repeated
- if ( jQuery.isArray(a[j]) )
- jQuery.each( a[j], function(){
- add( j, this );
- });
- else
- add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
-
- // Return the resulting serialization
- return s.join("&").replace(/%20/g, "+");
- }
-
-});
-var elemdisplay = {},
- timerId,
- fxAttrs = [
- // height animations
- [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
- // width animations
- [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
- // opacity animations
- [ "opacity" ]
- ];
-
-function genFx( type, num ){
- var obj = {};
- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
- obj[ this ] = type;
- });
- return obj;
-}
-
-jQuery.fn.extend({
- show: function(speed,callback){
- if ( speed ) {
- return this.animate( genFx("show", 3), speed, callback);
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ){
- var old = jQuery.data(this[i], "olddisplay");
-
- this[i].style.display = old || "";
-
- if ( jQuery.css(this[i], "display") === "none" ) {
- var tagName = this[i].tagName, display;
-
- if ( elemdisplay[ tagName ] ) {
- display = elemdisplay[ tagName ];
- } else {
- var elem = jQuery("<" + tagName + " />").appendTo("body");
-
- display = elem.css("display");
- if ( display === "none" )
- display = "block";
-
- elem.remove();
-
- elemdisplay[ tagName ] = display;
- }
-
- jQuery.data(this[i], "olddisplay", display);
- }
- }
-
- // Set the display of the elements in a second loop
- // to avoid the constant reflow
- for ( var i = 0, l = this.length; i < l; i++ ){
- this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
- }
-
- return this;
- }
- },
-
- hide: function(speed,callback){
- if ( speed ) {
- return this.animate( genFx("hide", 3), speed, callback);
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ){
- var old = jQuery.data(this[i], "olddisplay");
- if ( !old && old !== "none" )
- jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
- }
-
- // Set the display of the elements in a second loop
- // to avoid the constant reflow
- for ( var i = 0, l = this.length; i < l; i++ ){
- this[i].style.display = "none";
- }
-
- return this;
- }
- },
-
- // Save the old toggle function
- _toggle: jQuery.fn.toggle,
-
- toggle: function( fn, fn2 ){
- var bool = typeof fn === "boolean";
-
- return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
- this._toggle.apply( this, arguments ) :
- fn == null || bool ?
- this.each(function(){
- var state = bool ? fn : jQuery(this).is(":hidden");
- jQuery(this)[ state ? "show" : "hide" ]();
- }) :
- this.animate(genFx("toggle", 3), fn, fn2);
- },
-
- fadeTo: function(speed,to,callback){
- return this.animate({opacity: to}, speed, callback);
- },
-
- animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed(speed, easing, callback);
-
- return this[ optall.queue === false ? "each" : "queue" ](function(){
-
- var opt = jQuery.extend({}, optall), p,
- hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
- self = this;
-
- for ( p in prop ) {
- if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
- return opt.complete.call(this);
-
- if ( ( p == "height" || p == "width" ) && this.style ) {
- // Store display property
- opt.display = jQuery.css(this, "display");
-
- // Make sure that nothing sneaks out
- opt.overflow = this.style.overflow;
- }
- }
-
- if ( opt.overflow != null )
- this.style.overflow = "hidden";
-
- opt.curAnim = jQuery.extend({}, prop);
-
- jQuery.each( prop, function(name, val){
- var e = new jQuery.fx( self, opt, name );
-
- if ( /toggle|show|hide/.test(val) )
- e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
- else {
- var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
- start = e.cur(true) || 0;
-
- if ( parts ) {
- var end = parseFloat(parts[2]),
- unit = parts[3] || "px";
-
- // We need to compute starting value
- if ( unit != "px" ) {
- self.style[ name ] = (end || 1) + unit;
- start = ((end || 1) / e.cur(true)) * start;
- self.style[ name ] = start + unit;
- }
-
- // If a +=/-= token was provided, we're doing a relative animation
- if ( parts[1] )
- end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
-
- e.custom( start, end, unit );
- } else
- e.custom( start, val, "" );
- }
- });
-
- // For JS strict compliance
- return true;
- });
- },
-
- stop: function(clearQueue, gotoEnd){
- var timers = jQuery.timers;
-
- if (clearQueue)
- this.queue([]);
-
- this.each(function(){
- // go in reverse order so anything added to the queue during the loop is ignored
- for ( var i = timers.length - 1; i >= 0; i-- )
- if ( timers[i].elem == this ) {
- if (gotoEnd)
- // force the next step to be the last
- timers[i](true);
- timers.splice(i, 1);
- }
- });
-
- // start the next in the queue if the last step wasn't forced
- if (!gotoEnd)
- this.dequeue();
-
- return this;
- }
-
-});
-
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx("show", 1),
- slideUp: genFx("hide", 1),
- slideToggle: genFx("toggle", 1),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" }
-}, function( name, props ){
- jQuery.fn[ name ] = function( speed, callback ){
- return this.animate( props, speed, callback );
- };
-});
-
-jQuery.extend({
-
- speed: function(speed, easing, fn) {
- var opt = typeof speed === "object" ? speed : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
-
- // Queueing
- opt.old = opt.complete;
- opt.complete = function(){
- if ( opt.queue !== false )
- jQuery(this).dequeue();
- if ( jQuery.isFunction( opt.old ) )
- opt.old.call( this );
- };
-
- return opt;
- },
-
- easing: {
- linear: function( p, n, firstNum, diff ) {
- return firstNum + diff * p;
- },
- swing: function( p, n, firstNum, diff ) {
- return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
- }
- },
-
- timers: [],
-
- fx: function( elem, options, prop ){
- this.options = options;
- this.elem = elem;
- this.prop = prop;
-
- if ( !options.orig )
- options.orig = {};
- }
-
-});
-
-jQuery.fx.prototype = {
-
- // Simple function for setting a style value
- update: function(){
- if ( this.options.step )
- this.options.step.call( this.elem, this.now, this );
-
- (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
-
- // Set display property to block for height/width animations
- if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
- this.elem.style.display = "block";
- },
-
- // Get the current size
- cur: function(force){
- if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
- return this.elem[ this.prop ];
-
- var r = parseFloat(jQuery.css(this.elem, this.prop, force));
- return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
- },
-
- // Start an animation from one number to another
- custom: function(from, to, unit){
- this.startTime = now();
- this.start = from;
- this.end = to;
- this.unit = unit || this.unit || "px";
- this.now = this.start;
- this.pos = this.state = 0;
-
- var self = this;
- function t(gotoEnd){
- return self.step(gotoEnd);
- }
-
- t.elem = this.elem;
-
- if ( t() && jQuery.timers.push(t) && !timerId ) {
- timerId = setInterval(function(){
- var timers = jQuery.timers;
-
- for ( var i = 0; i < timers.length; i++ )
- if ( !timers[i]() )
- timers.splice(i--, 1);
-
- if ( !timers.length ) {
- clearInterval( timerId );
- timerId = undefined;
- }
- }, 13);
- }
- },
-
- // Simple 'show' function
- show: function(){
- // Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
- this.options.show = true;
-
- // Begin the animation
- // Make sure that we start at a small width/height to avoid any
- // flash of content
- this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
-
- // Start by showing the element
- jQuery(this.elem).show();
- },
-
- // Simple 'hide' function
- hide: function(){
- // Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
- this.options.hide = true;
-
- // Begin the animation
- this.custom(this.cur(), 0);
- },
-
- // Each step of an animation
- step: function(gotoEnd){
- var t = now();
-
- if ( gotoEnd || t >= this.options.duration + this.startTime ) {
- this.now = this.end;
- this.pos = this.state = 1;
- this.update();
-
- this.options.curAnim[ this.prop ] = true;
-
- var done = true;
- for ( var i in this.options.curAnim )
- if ( this.options.curAnim[i] !== true )
- done = false;
-
- if ( done ) {
- if ( this.options.display != null ) {
- // Reset the overflow
- this.elem.style.overflow = this.options.overflow;
-
- // Reset the display
- this.elem.style.display = this.options.display;
- if ( jQuery.css(this.elem, "display") == "none" )
- this.elem.style.display = "block";
- }
-
- // Hide the element if the "hide" operation was done
- if ( this.options.hide )
- jQuery(this.elem).hide();
-
- // Reset the properties, if the item has been hidden or shown
- if ( this.options.hide || this.options.show )
- for ( var p in this.options.curAnim )
- jQuery.attr(this.elem.style, p, this.options.orig[p]);
-
- // Execute the complete function
- this.options.complete.call( this.elem );
- }
-
- return false;
- } else {
- var n = t - this.startTime;
- this.state = n / this.options.duration;
-
- // Perform the easing function, defaults to swing
- this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
- this.now = this.start + ((this.end - this.start) * this.pos);
-
- // Perform the next step of the animation
- this.update();
- }
-
- return true;
- }
-
-};
-
-jQuery.extend( jQuery.fx, {
- speeds:{
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
- },
- step: {
-
- opacity: function(fx){
- jQuery.attr(fx.elem.style, "opacity", fx.now);
- },
-
- _default: function(fx){
- if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
- fx.elem.style[ fx.prop ] = fx.now + fx.unit;
- else
- fx.elem[ fx.prop ] = fx.now;
- }
- }
-});
-if ( document.documentElement["getBoundingClientRect"] )
- jQuery.fn.offset = function() {
- if ( !this[0] ) return { top: 0, left: 0 };
- if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
- var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
- clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
- top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
- left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
- return { top: top, left: left };
- };
-else
- jQuery.fn.offset = function() {
- if ( !this[0] ) return { top: 0, left: 0 };
- if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
- jQuery.offset.initialized || jQuery.offset.initialize();
-
- var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
- doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
- body = doc.body, defaultView = doc.defaultView,
- prevComputedStyle = defaultView.getComputedStyle(elem, null),
- top = elem.offsetTop, left = elem.offsetLeft;
-
- while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
- computedStyle = defaultView.getComputedStyle(elem, null);
- top -= elem.scrollTop, left -= elem.scrollLeft;
- if ( elem === offsetParent ) {
- top += elem.offsetTop, left += elem.offsetLeft;
- if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
- top += parseInt( computedStyle.borderTopWidth, 10) || 0,
- left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
- prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
- }
- if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
- top += parseInt( computedStyle.borderTopWidth, 10) || 0,
- left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
- prevComputedStyle = computedStyle;
- }
-
- if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
- top += body.offsetTop,
- left += body.offsetLeft;
-
- if ( prevComputedStyle.position === "fixed" )
- top += Math.max(docElem.scrollTop, body.scrollTop),
- left += Math.max(docElem.scrollLeft, body.scrollLeft);
-
- return { top: top, left: left };
- };
-
-jQuery.offset = {
- initialize: function() {
- if ( this.initialized ) return;
- var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
- html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
-
- rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
- for ( prop in rules ) container.style[prop] = rules[prop];
-
- container.innerHTML = html;
- body.insertBefore(container, body.firstChild);
- innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
-
- this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
- this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
-
- innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
- this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
-
- body.style.marginTop = '1px';
- this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
- body.style.marginTop = bodyMarginTop;
-
- body.removeChild(container);
- this.initialized = true;
- },
-
- bodyOffset: function(body) {
- jQuery.offset.initialized || jQuery.offset.initialize();
- var top = body.offsetTop, left = body.offsetLeft;
- if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
- top += parseInt( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0,
- left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
- return { top: top, left: left };
- }
-};
-
-
-jQuery.fn.extend({
- position: function() {
- var left = 0, top = 0, results;
-
- if ( this[0] ) {
- // Get *real* offsetParent
- var offsetParent = this.offsetParent(),
-
- // Get correct offsets
- offset = this.offset(),
- parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
-
- // Subtract element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= num( this, 'marginTop' );
- offset.left -= num( this, 'marginLeft' );
-
- // Add offsetParent borders
- parentOffset.top += num( offsetParent, 'borderTopWidth' );
- parentOffset.left += num( offsetParent, 'borderLeftWidth' );
-
- // Subtract the two offsets
- results = {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
- };
- }
-
- return results;
- },
-
- offsetParent: function() {
- var offsetParent = this[0].offsetParent || document.body;
- while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
- offsetParent = offsetParent.offsetParent;
- return jQuery(offsetParent);
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( ['Left', 'Top'], function(i, name) {
- var method = 'scroll' + name;
-
- jQuery.fn[ method ] = function(val) {
- if (!this[0]) return null;
-
- return val !== undefined ?
-
- // Set the scroll offset
- this.each(function() {
- this == window || this == document ?
- window.scrollTo(
- !i ? val : jQuery(window).scrollLeft(),
- i ? val : jQuery(window).scrollTop()
- ) :
- this[ method ] = val;
- }) :
-
- // Return the scroll offset
- this[0] == window || this[0] == document ?
- self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
- jQuery.boxModel && document.documentElement[ method ] ||
- document.body[ method ] :
- this[0][ method ];
- };
-});
-// Create innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function(i, name){
-
- var tl = i ? "Left" : "Top", // top or left
- br = i ? "Right" : "Bottom", // bottom or right
- lower = name.toLowerCase();
-
- // innerHeight and innerWidth
- jQuery.fn["inner" + name] = function(){
- return this[0] ?
- jQuery.css( this[0], lower, false, "padding" ) :
- null;
- };
-
- // outerHeight and outerWidth
- jQuery.fn["outer" + name] = function(margin) {
- return this[0] ?
- jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
- null;
- };
-
- var type = name.toLowerCase();
-
- jQuery.fn[ type ] = function( size ) {
- // Get window width or height
- return this[0] == window ?
- // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
- document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
- document.body[ "client" + name ] :
-
- // Get document width or height
- this[0] == document ?
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- Math.max(
- document.documentElement["client" + name],
- document.body["scroll" + name], document.documentElement["scroll" + name],
- document.body["offset" + name], document.documentElement["offset" + name]
- ) :
-
- // Get or set width or height on the element
- size === undefined ?
- // Get width or height on the element
- (this.length ? jQuery.css( this[0], type ) : null) :
-
- // Set the width or height on the element (default to pixels if value is unitless)
- this.css( type, typeof size === "string" ? size : size + "px" );
- };
-
-});
-})();
-
-/**
- * Add a suitable MW-specific alias
- */
-$j = jQuery.noConflict();
-
diff --git a/skins/common/jquery.min.js b/skins/common/jquery.min.js
deleted file mode 100644
index d872c9f0..00000000
--- a/skins/common/jquery.min.js
+++ /dev/null
@@ -1,433 +0,0 @@
-
-(function(){var
-window=this,undefined,_jQuery=window.jQuery,_$=window.$,jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);},quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,isSimple=/^.[^:#\[\.,]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;this.context=selector;return this;}
-if(typeof selector==="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])
-selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem&&elem.id!=match[3])
-return jQuery().find(selector);var ret=jQuery(elem||[]);ret.context=document;ret.selector=selector;return ret;}}else
-return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))
-return jQuery(document).ready(selector);if(selector.selector&&selector.context){this.selector=selector.selector;this.context=selector.context;}
-return this.setArray(jQuery.isArray(selector)?selector:jQuery.makeArray(selector));},selector:"",jquery:"1.3.2",size:function(){return this.length;},get:function(num){return num===undefined?Array.prototype.slice.call(this):this[num];},pushStack:function(elems,name,selector){var ret=jQuery(elems);ret.prevObject=this;ret.context=this.context;if(name==="find")
-ret.selector=this.selector+(this.selector?" ":"")+selector;else if(name)
-ret.selector=this.selector+"."+name+"("+selector+")";return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(typeof name==="string")
-if(value===undefined)
-return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}
-return this.each(function(i){for(name in options)
-jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)
-value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!=="object"&&text!=null)
-return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)
-ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).clone();if(this[0].parentNode)
-wrap.insertBefore(this[0]);wrap.map(function(){var elem=this;while(elem.firstChild)
-elem=elem.firstChild;return elem;}).append(this);}
-return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,function(elem){if(this.nodeType==1)
-this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,function(elem){if(this.nodeType==1)
-this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},push:[].push,sort:[].sort,splice:[].splice,find:function(selector){if(this.length===1){var ret=this.pushStack([],"find",selector);ret.length=0;jQuery.find(selector,this[0],ret);return ret;}else{return this.pushStack(jQuery.unique(jQuery.map(this,function(elem){return jQuery.find(selector,elem);})),"find",selector);}},clone:function(events){var ret=this.map(function(){if(!jQuery.support.noCloneEvent&&!jQuery.isXMLDoc(this)){var html=this.outerHTML;if(!html){var div=this.ownerDocument.createElement("div");div.appendChild(this.cloneNode(true));html=div.innerHTML;}
-return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0];}else
-return this.cloneNode(true);});if(events===true){var orig=this.find("*").andSelf(),i=0;ret.find("*").andSelf().each(function(){if(this.nodeName!==orig[i].nodeName)
-return;var events=jQuery.data(orig[i],"events");for(var type in events){for(var handler in events[type]){jQuery.event.add(this,type,events[type][handler],events[type][handler].data);}}
-i++;});}
-return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,jQuery.grep(this,function(elem){return elem.nodeType===1;})),"filter",selector);},closest:function(selector){var pos=jQuery.expr.match.POS.test(selector)?jQuery(selector):null,closer=0;return this.map(function(){var cur=this;while(cur&&cur.ownerDocument){if(pos?pos.index(cur)>-1:jQuery(cur).is(selector)){jQuery.data(cur,"closest",closer);return cur;}
-cur=cur.parentNode;closer++;}});},not:function(selector){if(typeof selector==="string")
-if(isSimple.test(selector))
-return this.pushStack(jQuery.multiFilter(selector,this,true),"not",selector);else
-selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector==="string"?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return!!selector&&this.is("."+selector);},val:function(value){if(value===undefined){var elem=this[0];if(elem){if(jQuery.nodeName(elem,'option'))
-return(elem.attributes.value||{}).specified?elem.value:elem.text;if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)
-return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery(option).val();if(one)
-return value;values.push(value);}}
-return values;}
-return(elem.value||"").replace(/\r/g,"");}
-return undefined;}
-if(typeof value==="number")
-value+='';return this.each(function(){if(this.nodeType!=1)
-return;if(jQuery.isArray(value)&&/radio|checkbox/.test(this.type))
-this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)
-this.selectedIndex=-1;}else
-this.value=value;});},html:function(value){return value===undefined?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,+i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},domManip:function(args,table,callback){if(this[0]){var fragment=(this[0].ownerDocument||this[0]).createDocumentFragment(),scripts=jQuery.clean(args,(this[0].ownerDocument||this[0]),fragment),first=fragment.firstChild;if(first)
-for(var i=0,l=this.length;i<l;i++)
-callback.call(root(this[i],first),this.length>1||i>0?fragment.cloneNode(true):fragment);if(scripts)
-jQuery.each(scripts,evalScript);}
-return this;function root(elem,cur){return table&&jQuery.nodeName(elem,"table")&&jQuery.nodeName(cur,"tr")?(elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody"))):elem;}}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)
-jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
-jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)
-elem.parentNode.removeChild(elem);}
-function now(){return+new Date;}
-jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2;}
-if(typeof target!=="object"&&!jQuery.isFunction(target))
-target={};if(length==i){target=this;--i;}
-for(;i<length;i++)
-if((options=arguments[i])!=null)
-for(var name in options){var src=target[name],copy=options[name];if(target===copy)
-continue;if(deep&&copy&&typeof copy==="object"&&!copy.nodeType)
-target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)
-target[name]=copy;}
-return target;};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{},toString=Object.prototype.toString;jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)
-window.jQuery=_jQuery;return jQuery;},isFunction:function(obj){return toString.call(obj)==="[object Function]";},isArray:function(obj){return toString.call(obj)==="[object Array]";},isXMLDoc:function(elem){return elem.nodeType===9&&elem.documentElement.nodeName!=="HTML"||!!elem.ownerDocument&&jQuery.isXMLDoc(elem.ownerDocument);},globalEval:function(data){if(data&&/\S/.test(data)){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.support.scriptEval)
-script.appendChild(document.createTextNode(data));else
-script.text=data;head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length===undefined){for(name in object)
-if(callback.apply(object[name],args)===false)
-break;}else
-for(;i<length;)
-if(callback.apply(object[i++],args)===false)
-break;}else{if(length===undefined){for(name in object)
-if(callback.call(object[name],name,object[name])===false)
-break;}else
-for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}
-return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))
-value=value.call(elem,i);return typeof value==="number"&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))
-elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)
-elem.className=classNames!==undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return elem&&jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}
-callback.call(elem);for(var name in options)
-elem.style[name]=old[name];},css:function(elem,name,force,extra){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;if(extra==="border")
-return;jQuery.each(which,function(){if(!extra)
-val-=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;if(extra==="margin")
-val+=parseFloat(jQuery.curCSS(elem,"margin"+this,true))||0;else
-val-=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});}
-if(elem.offsetWidth!==0)
-getWH();else
-jQuery.swap(elem,props,getWH);return Math.max(0,Math.round(val));}
-return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;if(name=="opacity"&&!jQuery.support.opacity){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}
-if(name.match(/float/i))
-name=styleFloat;if(!force&&style&&style[name])
-ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))
-name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();try{var computedStyle=defaultView.getComputedStyle(elem,null);}catch(e){}
-if(computedStyle)
-ret=computedStyle.getPropertyValue(name);if(name=="opacity"&&ret=="")
-ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}
-return ret;},clean:function(elems,context,fragment){context=context||document;if(typeof context.createElement==="undefined")
-context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;if(!fragment&&elems.length===1&&typeof elems[0]==="string"){var match=/^<(\w+)\s*\/?>$/.exec(elems[0]);if(match)
-return[context.createElement(match[1])];}
-var ret=[],scripts=[],div=context.createElement("div");jQuery.each(elems,function(i,elem){if(typeof elem==="number")
-elem+='';if(!elem)
-return;if(typeof elem==="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=elem.replace(/^\s+/,"").substring(0,10).toLowerCase();var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!jQuery.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)
-div=div.lastChild;if(!jQuery.support.tbody){var hasBody=/<tbody/i.test(elem),tbody=!tags.indexOf("<table")&&!hasBody?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&!hasBody?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)
-if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)
-tbody[j].parentNode.removeChild(tbody[j]);}
-if(!jQuery.support.leadingWhitespace&&/^\s/.test(elem))
-div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);elem=jQuery.makeArray(div.childNodes);}
-if(elem.nodeType)
-ret.push(elem);else
-ret=jQuery.merge(ret,elem);});if(fragment){for(var i=0;ret[i];i++){if(jQuery.nodeName(ret[i],"script")&&(!ret[i].type||ret[i].type.toLowerCase()==="text/javascript")){scripts.push(ret[i].parentNode?ret[i].parentNode.removeChild(ret[i]):ret[i]);}else{if(ret[i].nodeType===1)
-ret.splice.apply(ret,[i+1,0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))));fragment.appendChild(ret[i]);}}
-return scripts;}
-return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)
-return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&elem.parentNode)
-elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)
-throw"type property can't be changed";elem[name]=value;}
-if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))
-return elem.getAttributeNode(name).nodeValue;if(name=="tabIndex"){var attributeNode=elem.getAttributeNode("tabIndex");return attributeNode&&attributeNode.specified?attributeNode.value:elem.nodeName.match(/(button|input|object|select|textarea)/i)?0:elem.nodeName.match(/^(a|area)$/i)&&elem.href?0:undefined;}
-return elem[name];}
-if(!jQuery.support.style&&notxml&&name=="style")
-return jQuery.attr(elem.style,"cssText",value);if(set)
-elem.setAttribute(name,""+value);var attr=!jQuery.support.hrefNormalized&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}
-if(!jQuery.support.opacity&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+
-(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}
-return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}
-name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set&&value!='NaNpx'&&value!='nullpx')
-elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||typeof array==="string"||jQuery.isFunction(array)||array.setInterval)
-ret[0]=array;else
-while(i)
-ret[--i]=array[i];}
-return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)
-if(array[i]===elem)
-return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(!jQuery.support.getAll){while((elem=second[i++])!=null)
-if(elem.nodeType!=8)
-first[pos++]=elem;}else
-while((elem=second[i++])!=null)
-first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}
-return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)
-if(!inv!=!callback(elems[i],i))
-ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)
-ret[ret.length]=value;}
-return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,'0'])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")
-ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret),name,selector);};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){var ret=[],insert=jQuery(selector);for(var i=0,l=insert.length;i<l;i++){var elems=(i>0?this.clone(true):this).get();jQuery.fn[original].apply(jQuery(insert[i]),elems);ret=ret.concat(elems);}
-return this.pushStack(ret,name,selector);};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)
-this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames,state){if(typeof state!=="boolean")
-state=!jQuery.className.has(this,classNames);jQuery.className[state?"add":"remove"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).length){jQuery("*",this).add([this]).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)
-this.parentNode.removeChild(this);}},empty:function(){jQuery(this).children().remove();while(this.firstChild)
-this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}
-var expando="jQuery"+now(),uuid=0,windowData={};jQuery.extend({cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)
-id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])
-jQuery.cache[id]={};if(data!==undefined)
-jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])
-break;if(!name)
-jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)
-elem.removeAttribute(expando);}
-delete jQuery.cache[id];}},queue:function(elem,type,data){if(elem){type=(type||"fx")+"queue";var q=jQuery.data(elem,type);if(!q||jQuery.isArray(data))
-q=jQuery.data(elem,type,jQuery.makeArray(data));else if(data)
-q.push(data);}
-return q;},dequeue:function(elem,type){var queue=jQuery.queue(elem,type),fn=queue.shift();if(!type||type==="fx")
-fn=queue[0];if(fn!==undefined)
-fn.call(elem);}});jQuery.fn.extend({data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)
-data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
-return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},queue:function(type,data){if(typeof type!=="string"){data=type;type="fx";}
-if(data===undefined)
-return jQuery.queue(this[0],type);return this.each(function(){var queue=jQuery.queue(this,type,data);if(type=="fx"&&queue.length==1)
-queue[0].call(this);});},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type);});}});(function(){var chunker=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,done=0,toString=Object.prototype.toString;var Sizzle=function(selector,context,results,seed){results=results||[];context=context||document;if(context.nodeType!==1&&context.nodeType!==9)
-return[];if(!selector||typeof selector!=="string"){return results;}
-var parts=[],m,set,checkSet,check,mode,extra,prune=true;chunker.lastIndex=0;while((m=chunker.exec(selector))!==null){parts.push(m[1]);if(m[2]){extra=RegExp.rightContext;break;}}
-if(parts.length>1&&origPOS.exec(selector)){if(parts.length===2&&Expr.relative[parts[0]]){set=posProcess(parts[0]+parts[1],context);}else{set=Expr.relative[parts[0]]?[context]:Sizzle(parts.shift(),context);while(parts.length){selector=parts.shift();if(Expr.relative[selector])
-selector+=parts.shift();set=posProcess(selector,set);}}}else{var ret=seed?{expr:parts.pop(),set:makeArray(seed)}:Sizzle.find(parts.pop(),parts.length===1&&context.parentNode?context.parentNode:context,isXML(context));set=Sizzle.filter(ret.expr,ret.set);if(parts.length>0){checkSet=makeArray(set);}else{prune=false;}
-while(parts.length){var cur=parts.pop(),pop=cur;if(!Expr.relative[cur]){cur="";}else{pop=parts.pop();}
-if(pop==null){pop=context;}
-Expr.relative[cur](checkSet,pop,isXML(context));}}
-if(!checkSet){checkSet=set;}
-if(!checkSet){throw"Syntax error, unrecognized expression: "+(cur||selector);}
-if(toString.call(checkSet)==="[object Array]"){if(!prune){results.push.apply(results,checkSet);}else if(context.nodeType===1){for(var i=0;checkSet[i]!=null;i++){if(checkSet[i]&&(checkSet[i]===true||checkSet[i].nodeType===1&&contains(context,checkSet[i]))){results.push(set[i]);}}}else{for(var i=0;checkSet[i]!=null;i++){if(checkSet[i]&&checkSet[i].nodeType===1){results.push(set[i]);}}}}else{makeArray(checkSet,results);}
-if(extra){Sizzle(extra,context,results,seed);if(sortOrder){hasDuplicate=false;results.sort(sortOrder);if(hasDuplicate){for(var i=1;i<results.length;i++){if(results[i]===results[i-1]){results.splice(i--,1);}}}}}
-return results;};Sizzle.matches=function(expr,set){return Sizzle(expr,null,null,set);};Sizzle.find=function(expr,context,isXML){var set,match;if(!expr){return[];}
-for(var i=0,l=Expr.order.length;i<l;i++){var type=Expr.order[i],match;if((match=Expr.match[type].exec(expr))){var left=RegExp.leftContext;if(left.substr(left.length-1)!=="\\"){match[1]=(match[1]||"").replace(/\\/g,"");set=Expr.find[type](match,context,isXML);if(set!=null){expr=expr.replace(Expr.match[type],"");break;}}}}
-if(!set){set=context.getElementsByTagName("*");}
-return{set:set,expr:expr};};Sizzle.filter=function(expr,set,inplace,not){var old=expr,result=[],curLoop=set,match,anyFound,isXMLFilter=set&&set[0]&&isXML(set[0]);while(expr&&set.length){for(var type in Expr.filter){if((match=Expr.match[type].exec(expr))!=null){var filter=Expr.filter[type],found,item;anyFound=false;if(curLoop==result){result=[];}
-if(Expr.preFilter[type]){match=Expr.preFilter[type](match,curLoop,inplace,result,not,isXMLFilter);if(!match){anyFound=found=true;}else if(match===true){continue;}}
-if(match){for(var i=0;(item=curLoop[i])!=null;i++){if(item){found=filter(item,match,i,curLoop);var pass=not^!!found;if(inplace&&found!=null){if(pass){anyFound=true;}else{curLoop[i]=false;}}else if(pass){result.push(item);anyFound=true;}}}}
-if(found!==undefined){if(!inplace){curLoop=result;}
-expr=expr.replace(Expr.match[type],"");if(!anyFound){return[];}
-break;}}}
-if(expr==old){if(anyFound==null){throw"Syntax error, unrecognized expression: "+expr;}else{break;}}
-old=expr;}
-return curLoop;};var Expr=Sizzle.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(elem){return elem.getAttribute("href");}},relative:{"+":function(checkSet,part,isXML){var isPartStr=typeof part==="string",isTag=isPartStr&&!/\W/.test(part),isPartStrNotTag=isPartStr&&!isTag;if(isTag&&!isXML){part=part.toUpperCase();}
-for(var i=0,l=checkSet.length,elem;i<l;i++){if((elem=checkSet[i])){while((elem=elem.previousSibling)&&elem.nodeType!==1){}
-checkSet[i]=isPartStrNotTag||elem&&elem.nodeName===part?elem||false:elem===part;}}
-if(isPartStrNotTag){Sizzle.filter(part,checkSet,true);}},">":function(checkSet,part,isXML){var isPartStr=typeof part==="string";if(isPartStr&&!/\W/.test(part)){part=isXML?part:part.toUpperCase();for(var i=0,l=checkSet.length;i<l;i++){var elem=checkSet[i];if(elem){var parent=elem.parentNode;checkSet[i]=parent.nodeName===part?parent:false;}}}else{for(var i=0,l=checkSet.length;i<l;i++){var elem=checkSet[i];if(elem){checkSet[i]=isPartStr?elem.parentNode:elem.parentNode===part;}}
-if(isPartStr){Sizzle.filter(part,checkSet,true);}}},"":function(checkSet,part,isXML){var doneName=done++,checkFn=dirCheck;if(!part.match(/\W/)){var nodeCheck=part=isXML?part:part.toUpperCase();checkFn=dirNodeCheck;}
-checkFn("parentNode",part,doneName,checkSet,nodeCheck,isXML);},"~":function(checkSet,part,isXML){var doneName=done++,checkFn=dirCheck;if(typeof part==="string"&&!part.match(/\W/)){var nodeCheck=part=isXML?part:part.toUpperCase();checkFn=dirNodeCheck;}
-checkFn("previousSibling",part,doneName,checkSet,nodeCheck,isXML);}},find:{ID:function(match,context,isXML){if(typeof context.getElementById!=="undefined"&&!isXML){var m=context.getElementById(match[1]);return m?[m]:[];}},NAME:function(match,context,isXML){if(typeof context.getElementsByName!=="undefined"){var ret=[],results=context.getElementsByName(match[1]);for(var i=0,l=results.length;i<l;i++){if(results[i].getAttribute("name")===match[1]){ret.push(results[i]);}}
-return ret.length===0?null:ret;}},TAG:function(match,context){return context.getElementsByTagName(match[1]);}},preFilter:{CLASS:function(match,curLoop,inplace,result,not,isXML){match=" "+match[1].replace(/\\/g,"")+" ";if(isXML){return match;}
-for(var i=0,elem;(elem=curLoop[i])!=null;i++){if(elem){if(not^(elem.className&&(" "+elem.className+" ").indexOf(match)>=0)){if(!inplace)
-result.push(elem);}else if(inplace){curLoop[i]=false;}}}
-return false;},ID:function(match){return match[1].replace(/\\/g,"");},TAG:function(match,curLoop){for(var i=0;curLoop[i]===false;i++){}
-return curLoop[i]&&isXML(curLoop[i])?match[1]:match[1].toUpperCase();},CHILD:function(match){if(match[1]=="nth"){var test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(match[2]=="even"&&"2n"||match[2]=="odd"&&"2n+1"||!/\D/.test(match[2])&&"0n+"+match[2]||match[2]);match[2]=(test[1]+(test[2]||1))-0;match[3]=test[3]-0;}
-match[0]=done++;return match;},ATTR:function(match,curLoop,inplace,result,not,isXML){var name=match[1].replace(/\\/g,"");if(!isXML&&Expr.attrMap[name]){match[1]=Expr.attrMap[name];}
-if(match[2]==="~="){match[4]=" "+match[4]+" ";}
-return match;},PSEUDO:function(match,curLoop,inplace,result,not){if(match[1]==="not"){if(match[3].match(chunker).length>1||/^\w/.test(match[3])){match[3]=Sizzle(match[3],null,null,curLoop);}else{var ret=Sizzle.filter(match[3],curLoop,inplace,true^not);if(!inplace){result.push.apply(result,ret);}
-return false;}}else if(Expr.match.POS.test(match[0])||Expr.match.CHILD.test(match[0])){return true;}
-return match;},POS:function(match){match.unshift(true);return match;}},filters:{enabled:function(elem){return elem.disabled===false&&elem.type!=="hidden";},disabled:function(elem){return elem.disabled===true;},checked:function(elem){return elem.checked===true;},selected:function(elem){elem.parentNode.selectedIndex;return elem.selected===true;},parent:function(elem){return!!elem.firstChild;},empty:function(elem){return!elem.firstChild;},has:function(elem,i,match){return!!Sizzle(match[3],elem).length;},header:function(elem){return/h\d/i.test(elem.nodeName);},text:function(elem){return"text"===elem.type;},radio:function(elem){return"radio"===elem.type;},checkbox:function(elem){return"checkbox"===elem.type;},file:function(elem){return"file"===elem.type;},password:function(elem){return"password"===elem.type;},submit:function(elem){return"submit"===elem.type;},image:function(elem){return"image"===elem.type;},reset:function(elem){return"reset"===elem.type;},button:function(elem){return"button"===elem.type||elem.nodeName.toUpperCase()==="BUTTON";},input:function(elem){return/input|select|textarea|button/i.test(elem.nodeName);}},setFilters:{first:function(elem,i){return i===0;},last:function(elem,i,match,array){return i===array.length-1;},even:function(elem,i){return i%2===0;},odd:function(elem,i){return i%2===1;},lt:function(elem,i,match){return i<match[3]-0;},gt:function(elem,i,match){return i>match[3]-0;},nth:function(elem,i,match){return match[3]-0==i;},eq:function(elem,i,match){return match[3]-0==i;}},filter:{PSEUDO:function(elem,match,i,array){var name=match[1],filter=Expr.filters[name];if(filter){return filter(elem,i,match,array);}else if(name==="contains"){return(elem.textContent||elem.innerText||"").indexOf(match[3])>=0;}else if(name==="not"){var not=match[3];for(var i=0,l=not.length;i<l;i++){if(not[i]===elem){return false;}}
-return true;}},CHILD:function(elem,match){var type=match[1],node=elem;switch(type){case'only':case'first':while(node=node.previousSibling){if(node.nodeType===1)return false;}
-if(type=='first')return true;node=elem;case'last':while(node=node.nextSibling){if(node.nodeType===1)return false;}
-return true;case'nth':var first=match[2],last=match[3];if(first==1&&last==0){return true;}
-var doneName=match[0],parent=elem.parentNode;if(parent&&(parent.sizcache!==doneName||!elem.nodeIndex)){var count=0;for(node=parent.firstChild;node;node=node.nextSibling){if(node.nodeType===1){node.nodeIndex=++count;}}
-parent.sizcache=doneName;}
-var diff=elem.nodeIndex-last;if(first==0){return diff==0;}else{return(diff%first==0&&diff/first>=0);}}},ID:function(elem,match){return elem.nodeType===1&&elem.getAttribute("id")===match;},TAG:function(elem,match){return(match==="*"&&elem.nodeType===1)||elem.nodeName===match;},CLASS:function(elem,match){return(" "+(elem.className||elem.getAttribute("class"))+" ").indexOf(match)>-1;},ATTR:function(elem,match){var name=match[1],result=Expr.attrHandle[name]?Expr.attrHandle[name](elem):elem[name]!=null?elem[name]:elem.getAttribute(name),value=result+"",type=match[2],check=match[4];return result==null?type==="!=":type==="="?value===check:type==="*="?value.indexOf(check)>=0:type==="~="?(" "+value+" ").indexOf(check)>=0:!check?value&&result!==false:type==="!="?value!=check:type==="^="?value.indexOf(check)===0:type==="$="?value.substr(value.length-check.length)===check:type==="|="?value===check||value.substr(0,check.length+1)===check+"-":false;},POS:function(elem,match,i,array){var name=match[2],filter=Expr.setFilters[name];if(filter){return filter(elem,i,match,array);}}}};var origPOS=Expr.match.POS;for(var type in Expr.match){Expr.match[type]=RegExp(Expr.match[type].source+/(?![^\[]*\])(?![^\(]*\))/.source);}
-var makeArray=function(array,results){array=Array.prototype.slice.call(array);if(results){results.push.apply(results,array);return results;}
-return array;};try{Array.prototype.slice.call(document.documentElement.childNodes);}catch(e){makeArray=function(array,results){var ret=results||[];if(toString.call(array)==="[object Array]"){Array.prototype.push.apply(ret,array);}else{if(typeof array.length==="number"){for(var i=0,l=array.length;i<l;i++){ret.push(array[i]);}}else{for(var i=0;array[i];i++){ret.push(array[i]);}}}
-return ret;};}
-var sortOrder;if(document.documentElement.compareDocumentPosition){sortOrder=function(a,b){var ret=a.compareDocumentPosition(b)&4?-1:a===b?0:1;if(ret===0){hasDuplicate=true;}
-return ret;};}else if("sourceIndex"in document.documentElement){sortOrder=function(a,b){var ret=a.sourceIndex-b.sourceIndex;if(ret===0){hasDuplicate=true;}
-return ret;};}else if(document.createRange){sortOrder=function(a,b){var aRange=a.ownerDocument.createRange(),bRange=b.ownerDocument.createRange();aRange.selectNode(a);aRange.collapse(true);bRange.selectNode(b);bRange.collapse(true);var ret=aRange.compareBoundaryPoints(Range.START_TO_END,bRange);if(ret===0){hasDuplicate=true;}
-return ret;};}
-(function(){var form=document.createElement("form"),id="script"+(new Date).getTime();form.innerHTML="<input name='"+id+"'/>";var root=document.documentElement;root.insertBefore(form,root.firstChild);if(!!document.getElementById(id)){Expr.find.ID=function(match,context,isXML){if(typeof context.getElementById!=="undefined"&&!isXML){var m=context.getElementById(match[1]);return m?m.id===match[1]||typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id").nodeValue===match[1]?[m]:undefined:[];}};Expr.filter.ID=function(elem,match){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id");return elem.nodeType===1&&node&&node.nodeValue===match;};}
-root.removeChild(form);})();(function(){var div=document.createElement("div");div.appendChild(document.createComment(""));if(div.getElementsByTagName("*").length>0){Expr.find.TAG=function(match,context){var results=context.getElementsByTagName(match[1]);if(match[1]==="*"){var tmp=[];for(var i=0;results[i];i++){if(results[i].nodeType===1){tmp.push(results[i]);}}
-results=tmp;}
-return results;};}
-div.innerHTML="<a href='#'></a>";if(div.firstChild&&typeof div.firstChild.getAttribute!=="undefined"&&div.firstChild.getAttribute("href")!=="#"){Expr.attrHandle.href=function(elem){return elem.getAttribute("href",2);};}})();if(document.querySelectorAll)(function(){var oldSizzle=Sizzle,div=document.createElement("div");div.innerHTML="<p class='TEST'></p>";if(div.querySelectorAll&&div.querySelectorAll(".TEST").length===0){return;}
-Sizzle=function(query,context,extra,seed){context=context||document;if(!seed&&context.nodeType===9&&!isXML(context)){try{return makeArray(context.querySelectorAll(query),extra);}catch(e){}}
-return oldSizzle(query,context,extra,seed);};Sizzle.find=oldSizzle.find;Sizzle.filter=oldSizzle.filter;Sizzle.selectors=oldSizzle.selectors;Sizzle.matches=oldSizzle.matches;})();if(document.getElementsByClassName&&document.documentElement.getElementsByClassName)(function(){var div=document.createElement("div");div.innerHTML="<div class='test e'></div><div class='test'></div>";if(div.getElementsByClassName("e").length===0)
-return;div.lastChild.className="e";if(div.getElementsByClassName("e").length===1)
-return;Expr.order.splice(1,0,"CLASS");Expr.find.CLASS=function(match,context,isXML){if(typeof context.getElementsByClassName!=="undefined"&&!isXML){return context.getElementsByClassName(match[1]);}};})();function dirNodeCheck(dir,cur,doneName,checkSet,nodeCheck,isXML){var sibDir=dir=="previousSibling"&&!isXML;for(var i=0,l=checkSet.length;i<l;i++){var elem=checkSet[i];if(elem){if(sibDir&&elem.nodeType===1){elem.sizcache=doneName;elem.sizset=i;}
-elem=elem[dir];var match=false;while(elem){if(elem.sizcache===doneName){match=checkSet[elem.sizset];break;}
-if(elem.nodeType===1&&!isXML){elem.sizcache=doneName;elem.sizset=i;}
-if(elem.nodeName===cur){match=elem;break;}
-elem=elem[dir];}
-checkSet[i]=match;}}}
-function dirCheck(dir,cur,doneName,checkSet,nodeCheck,isXML){var sibDir=dir=="previousSibling"&&!isXML;for(var i=0,l=checkSet.length;i<l;i++){var elem=checkSet[i];if(elem){if(sibDir&&elem.nodeType===1){elem.sizcache=doneName;elem.sizset=i;}
-elem=elem[dir];var match=false;while(elem){if(elem.sizcache===doneName){match=checkSet[elem.sizset];break;}
-if(elem.nodeType===1){if(!isXML){elem.sizcache=doneName;elem.sizset=i;}
-if(typeof cur!=="string"){if(elem===cur){match=true;break;}}else if(Sizzle.filter(cur,[elem]).length>0){match=elem;break;}}
-elem=elem[dir];}
-checkSet[i]=match;}}}
-var contains=document.compareDocumentPosition?function(a,b){return a.compareDocumentPosition(b)&16;}:function(a,b){return a!==b&&(a.contains?a.contains(b):true);};var isXML=function(elem){return elem.nodeType===9&&elem.documentElement.nodeName!=="HTML"||!!elem.ownerDocument&&isXML(elem.ownerDocument);};var posProcess=function(selector,context){var tmpSet=[],later="",match,root=context.nodeType?[context]:context;while((match=Expr.match.PSEUDO.exec(selector))){later+=match[0];selector=selector.replace(Expr.match.PSEUDO,"");}
-selector=Expr.relative[selector]?selector+"*":selector;for(var i=0,l=root.length;i<l;i++){Sizzle(selector,root[i],tmpSet);}
-return Sizzle.filter(later,tmpSet);};jQuery.find=Sizzle;jQuery.filter=Sizzle.filter;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.filters;Sizzle.selectors.filters.hidden=function(elem){return elem.offsetWidth===0||elem.offsetHeight===0;};Sizzle.selectors.filters.visible=function(elem){return elem.offsetWidth>0||elem.offsetHeight>0;};Sizzle.selectors.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem;}).length;};jQuery.multiFilter=function(expr,elems,not){if(not){expr=":not("+expr+")";}
-return Sizzle.matches(expr,elems);};jQuery.dir=function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)
-matched.push(cur);cur=cur[dir];}
-return matched;};jQuery.nth=function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])
-if(cur.nodeType==1&&++num==result)
-break;return cur;};jQuery.sibling=function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)
-r.push(n);}
-return r;};return;window.Sizzle=Sizzle;})();jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)
-return;if(elem.setInterval&&elem!=window)
-elem=window;if(!handler.guid)
-handler.guid=this.guid++;if(data!==undefined){var fn=handler;handler=this.proxy(fn);handler.data=data;}
-var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){return typeof jQuery!=="undefined"&&!jQuery.event.triggered?jQuery.event.handle.apply(arguments.callee.elem,arguments):undefined;});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var namespaces=type.split(".");type=namespaces.shift();handler.type=namespaces.slice().sort().join(".");var handlers=events[type];if(jQuery.event.specialAll[type])
-jQuery.event.specialAll[type].setup.call(elem,data,namespaces);if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem,data,namespaces)===false){if(elem.addEventListener)
-elem.addEventListener(type,handle,false);else if(elem.attachEvent)
-elem.attachEvent("on"+type,handle);}}
-handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)
-return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types===undefined||(typeof types==="string"&&types.charAt(0)=="."))
-for(var type in events)
-this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}
-jQuery.each(types.split(/\s+/),function(index,type){var namespaces=type.split(".");type=namespaces.shift();var namespace=RegExp("(^|\\.)"+namespaces.slice().sort().join(".*\\.")+"(\\.|$)");if(events[type]){if(handler)
-delete events[type][handler.guid];else
-for(var handle in events[type])
-if(namespace.test(events[type][handle].type))
-delete events[type][handle];if(jQuery.event.specialAll[type])
-jQuery.event.specialAll[type].teardown.call(elem,namespaces);for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem,namespaces)===false){if(elem.removeEventListener)
-elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)
-elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}
-ret=null;delete events[type];}}});}
-for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(event,data,elem,bubbling){var type=event.type||event;if(!bubbling){event=typeof event==="object"?event[expando]?event:jQuery.extend(jQuery.Event(type),event):jQuery.Event(type);if(type.indexOf("!")>=0){event.type=type=type.slice(0,-1);event.exclusive=true;}
-if(!elem){event.stopPropagation();if(this.global[type])
-jQuery.each(jQuery.cache,function(){if(this.events&&this.events[type])
-jQuery.event.trigger(event,data,this.handle.elem);});}
-if(!elem||elem.nodeType==3||elem.nodeType==8)
-return undefined;event.result=undefined;event.target=elem;data=jQuery.makeArray(data);data.unshift(event);}
-event.currentTarget=elem;var handle=jQuery.data(elem,"handle");if(handle)
-handle.apply(elem,data);if((!elem[type]||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)
-event.result=false;if(!bubbling&&elem[type]&&!event.isDefaultPrevented()&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}
-this.triggered=false;if(!event.isPropagationStopped()){var parent=elem.parentNode||elem.ownerDocument;if(parent)
-jQuery.event.trigger(event,data,parent,true);}},handle:function(event){var all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);event.currentTarget=this;var namespaces=event.type.split(".");event.type=namespaces.shift();all=!namespaces.length&&!event.exclusive;var namespace=RegExp("(^|\\.)"+namespaces.slice().sort().join(".*\\.")+"(\\.|$)");handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||namespace.test(handler.type)){event.handler=handler;event.data=handler.data;var ret=handler.apply(this,arguments);if(ret!==undefined){event.result=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}
-if(event.isImmediatePropagationStopped())
-break;}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(event){if(event[expando])
-return event;var originalEvent=event;event=jQuery.Event(originalEvent);for(var i=this.props.length,prop;i;){prop=this.props[--i];event[prop]=originalEvent[prop];}
-if(!event.target)
-event.target=event.srcElement||document;if(event.target.nodeType==3)
-event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)
-event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}
-if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))
-event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)
-event.metaKey=event.ctrlKey;if(!event.which&&event.button)
-event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy=proxy||function(){return fn.apply(this,arguments);};proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:bindReady,teardown:function(){}}},specialAll:{live:{setup:function(selector,namespaces){jQuery.event.add(this,namespaces[0],liveHandler);},teardown:function(namespaces){if(namespaces.length){var remove=0,name=RegExp("(^|\\.)"+namespaces[0]+"(\\.|$)");jQuery.each((jQuery.data(this,"events").live||{}),function(){if(name.test(this.type))
-remove++;});if(remove<1)
-jQuery.event.remove(this,namespaces[0],liveHandler);}}}}};jQuery.Event=function(src){if(!this.preventDefault)
-return new jQuery.Event(src);if(src&&src.type){this.originalEvent=src;this.type=src.type;}else
-this.type=src;this.timeStamp=now();this[expando]=true;};function returnFalse(){return false;}
-function returnTrue(){return true;}
-jQuery.Event.prototype={preventDefault:function(){this.isDefaultPrevented=returnTrue;var e=this.originalEvent;if(!e)
-return;if(e.preventDefault)
-e.preventDefault();e.returnValue=false;},stopPropagation:function(){this.isPropagationStopped=returnTrue;var e=this.originalEvent;if(!e)
-return;if(e.stopPropagation)
-e.stopPropagation();e.cancelBubble=true;},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=returnTrue;this.stopPropagation();},isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse};var withinElement=function(event){var parent=event.relatedTarget;while(parent&&parent!=this)
-try{parent=parent.parentNode;}
-catch(e){parent=this;}
-if(parent!=this){event.type=event.data;jQuery.event.handle.apply(this,arguments);}};jQuery.each({mouseover:'mouseenter',mouseout:'mouseleave'},function(orig,fix){jQuery.event.special[fix]={setup:function(){jQuery.event.add(this,orig,withinElement,fix);},teardown:function(){jQuery.event.remove(this,orig,withinElement);}};});jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this);});},triggerHandler:function(type,data){if(this[0]){var event=jQuery.Event(type);event.preventDefault();event.stopPropagation();jQuery.event.trigger(event,data,this[0]);return event.result;}},toggle:function(fn){var args=arguments,i=1;while(i<args.length)
-jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)
-fn.call(document,jQuery);else
-jQuery.readyList.push(fn);return this;},live:function(type,fn){var proxy=jQuery.event.proxy(fn);proxy.guid+=this.selector+type;jQuery(document).bind(liveConvert(type,this.selector),this.selector,proxy);return this;},die:function(type,fn){jQuery(document).unbind(liveConvert(type,this.selector),fn?{guid:fn.guid+this.selector+type}:null);return this;}});function liveHandler(event){var check=RegExp("(^|\\.)"+event.type+"(\\.|$)"),stop=true,elems=[];jQuery.each(jQuery.data(this,"events").live||[],function(i,fn){if(check.test(fn.type)){var elem=jQuery(event.target).closest(fn.data)[0];if(elem)
-elems.push({elem:elem,fn:fn});}});elems.sort(function(a,b){return jQuery.data(a.elem,"closest")-jQuery.data(b.elem,"closest");});jQuery.each(elems,function(){if(this.fn.call(this.elem,event,this.fn.data)===false)
-return(stop=false);});return stop;}
-function liveConvert(type,selector){return["live",type,selector.replace(/\./g,"`").replace(/ /g,"|")].join(".");}
-jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document,jQuery);});jQuery.readyList=null;}
-jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);jQuery.ready();},false);}else if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);jQuery.ready();}});if(document.documentElement.doScroll&&window==window.top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}
-jQuery.ready();})();}
-jQuery.event.add(window,"load",jQuery.ready);}
-jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,"+"change,select,submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});jQuery(window).bind('unload',function(){for(var id in jQuery.cache)
-if(id!=1&&jQuery.cache[id].handle)
-jQuery.event.remove(jQuery.cache[id].handle.elem);});(function(){jQuery.support={};var root=document.documentElement,script=document.createElement("script"),div=document.createElement("div"),id="script"+(new Date).getTime();div.style.display="none";div.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var all=div.getElementsByTagName("*"),a=div.getElementsByTagName("a")[0];if(!all||!all.length||!a){return;}
-jQuery.support={leadingWhitespace:div.firstChild.nodeType==3,tbody:!div.getElementsByTagName("tbody").length,objectAll:!!div.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!div.getElementsByTagName("link").length,style:/red/.test(a.getAttribute("style")),hrefNormalized:a.getAttribute("href")==="/a",opacity:a.style.opacity==="0.5",cssFloat:!!a.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};script.type="text/javascript";try{script.appendChild(document.createTextNode("window."+id+"=1;"));}catch(e){}
-root.insertBefore(script,root.firstChild);if(window[id]){jQuery.support.scriptEval=true;delete window[id];}
-root.removeChild(script);if(div.attachEvent&&div.fireEvent){div.attachEvent("onclick",function(){jQuery.support.noCloneEvent=false;div.detachEvent("onclick",arguments.callee);});div.cloneNode(true).fireEvent("onclick");}
-jQuery(function(){var div=document.createElement("div");div.style.width=div.style.paddingLeft="1px";document.body.appendChild(div);jQuery.boxModel=jQuery.support.boxModel=div.offsetWidth===2;document.body.removeChild(div).style.display='none';});})();var styleFloat=jQuery.support.cssFloat?"cssFloat":"styleFloat";jQuery.props={"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!=="string")
-return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}
-var type="GET";if(params)
-if(jQuery.isFunction(params)){callback=params;params=null;}else if(typeof params==="object"){params=jQuery.param(params);type="POST";}
-var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")
-self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);if(callback)
-self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return this.elements?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}
-return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}
-return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!=="string")
-s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))
-s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))
-s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}
-if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)
-s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}
-if(head)
-head.removeChild(script);};}
-if(s.dataType=="script"&&s.cache==null)
-s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}
-if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}
-if(s.global&&!jQuery.active++)
-jQuery.event.trigger("ajaxStart");var parts=/^(\w+:)?\/\/([^\/?#]+)/.exec(s.url);if(s.dataType=="script"&&type=="GET"&&parts&&(parts[1]&&parts[1]!=location.protocol||parts[2]!=location.host)){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)
-script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();script.onload=script.onreadystatechange=null;head.removeChild(script);}};}
-head.appendChild(script);return undefined;}
-var requestDone=false;var xhr=s.xhr();if(s.username)
-xhr.open(type,s.url,s.async,s.username,s.password);else
-xhr.open(type,s.url,s.async);try{if(s.data)
-xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)
-xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}
-if(s.beforeSend&&s.beforeSend(xhr,s)===false){if(s.global&&!--jQuery.active)
-jQuery.event.trigger("ajaxStop");xhr.abort();return false;}
-if(s.global)
-jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(xhr.readyState==0){if(ival){clearInterval(ival);ival=null;if(s.global&&!--jQuery.active)
-jQuery.event.trigger("ajaxStop");}}else if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}
-status=isTimeout=="timeout"?"timeout":!jQuery.httpSuccess(xhr)?"error":s.ifModified&&jQuery.httpNotModified(xhr,s.url)?"notmodified":"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s);}catch(e){status="parsererror";}}
-if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}
-if(s.ifModified&&modRes)
-jQuery.lastModified[s.url]=modRes;if(!jsonp)
-success();}else
-jQuery.handleError(s,xhr,status);complete();if(isTimeout)
-xhr.abort();if(s.async)
-xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)
-setTimeout(function(){if(xhr&&!requestDone)
-onreadystatechange("timeout");},s.timeout);}
-try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}
-if(!s.async)
-onreadystatechange();function success(){if(s.success)
-s.success(data,status);if(s.global)
-jQuery.event.trigger("ajaxSuccess",[xhr,s]);}
-function complete(){if(s.complete)
-s.complete(xhr,status);if(s.global)
-jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)
-jQuery.event.trigger("ajaxStop");}
-return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)
-jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223;}catch(e){}
-return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url];}catch(e){}
-return false;},httpData:function(xhr,type,s){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")
-throw"parsererror";if(s&&s.dataFilter)
-data=s.dataFilter(data,type);if(typeof data==="string"){if(type=="script")
-jQuery.globalEval(data);if(type=="json")
-data=window["eval"]("("+data+")");}
-return data;},param:function(a){var s=[];function add(key,value){s[s.length]=encodeURIComponent(key)+'='+encodeURIComponent(value);};if(jQuery.isArray(a)||a.jquery)
-jQuery.each(a,function(){add(this.name,this.value);});else
-for(var j in a)
-if(jQuery.isArray(a[j]))
-jQuery.each(a[j],function(){add(j,this);});else
-add(j,jQuery.isFunction(a[j])?a[j]():a[j]);return s.join("&").replace(/%20/g,"+");}});var elemdisplay={},timerId,fxAttrs=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function genFx(type,num){var obj={};jQuery.each(fxAttrs.concat.apply([],fxAttrs.slice(0,num)),function(){obj[this]=type;});return obj;}
-jQuery.fn.extend({show:function(speed,callback){if(speed){return this.animate(genFx("show",3),speed,callback);}else{for(var i=0,l=this.length;i<l;i++){var old=jQuery.data(this[i],"olddisplay");this[i].style.display=old||"";if(jQuery.css(this[i],"display")==="none"){var tagName=this[i].tagName,display;if(elemdisplay[tagName]){display=elemdisplay[tagName];}else{var elem=jQuery("<"+tagName+" />").appendTo("body");display=elem.css("display");if(display==="none")
-display="block";elem.remove();elemdisplay[tagName]=display;}
-jQuery.data(this[i],"olddisplay",display);}}
-for(var i=0,l=this.length;i<l;i++){this[i].style.display=jQuery.data(this[i],"olddisplay")||"";}
-return this;}},hide:function(speed,callback){if(speed){return this.animate(genFx("hide",3),speed,callback);}else{for(var i=0,l=this.length;i<l;i++){var old=jQuery.data(this[i],"olddisplay");if(!old&&old!=="none")
-jQuery.data(this[i],"olddisplay",jQuery.css(this[i],"display"));}
-for(var i=0,l=this.length;i<l;i++){this[i].style.display="none";}
-return this;}},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){var bool=typeof fn==="boolean";return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn==null||bool?this.each(function(){var state=bool?fn:jQuery(this).is(":hidden");jQuery(this)[state?"show":"hide"]();}):this.animate(genFx("toggle",3),fn,fn2);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){var opt=jQuery.extend({},optall),p,hidden=this.nodeType==1&&jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)
-return opt.complete.call(this);if((p=="height"||p=="width")&&this.style){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}
-if(opt.overflow!=null)
-this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))
-e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}
-if(parts[1])
-end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
-e.custom(start,val,"");}});return true;});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)
-this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)
-if(timers[i].elem==this){if(gotoEnd)
-timers[i](true);timers.splice(i,1);}});if(!gotoEnd)
-this.dequeue();return this;}});jQuery.each({slideDown:genFx("show",1),slideUp:genFx("hide",1),slideToggle:genFx("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(name,props){jQuery.fn[name]=function(speed,callback){return this.animate(props,speed,callback);};});jQuery.extend({speed:function(speed,easing,fn){var opt=typeof speed==="object"?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};opt.duration=jQuery.fx.off?0:typeof opt.duration==="number"?opt.duration:jQuery.fx.speeds[opt.duration]||jQuery.fx.speeds._default;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)
-jQuery(this).dequeue();if(jQuery.isFunction(opt.old))
-opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)
-options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)
-this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style)
-this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))
-return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;var self=this;function t(gotoEnd){return self.step(gotoEnd);}
-t.elem=this.elem;if(t()&&jQuery.timers.push(t)&&!timerId){timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)
-if(!timers[i]())
-timers.splice(i--,1);if(!timers.length){clearInterval(timerId);timerId=undefined;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)
-if(this.options.curAnim[i]!==true)
-done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")
-this.elem.style.display="block";}
-if(this.options.hide)
-jQuery(this.elem).hide();if(this.options.hide||this.options.show)
-for(var p in this.options.curAnim)
-jQuery.attr(this.elem.style,p,this.options.orig[p]);this.options.complete.call(this.elem);}
-return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}
-return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){if(fx.elem.style&&fx.elem.style[fx.prop]!=null)
-fx.elem.style[fx.prop]=fx.now+fx.unit;else
-fx.elem[fx.prop]=fx.now;}}});if(document.documentElement["getBoundingClientRect"])
-jQuery.fn.offset=function(){if(!this[0])return{top:0,left:0};if(this[0]===this[0].ownerDocument.body)return jQuery.offset.bodyOffset(this[0]);var box=this[0].getBoundingClientRect(),doc=this[0].ownerDocument,body=doc.body,docElem=doc.documentElement,clientTop=docElem.clientTop||body.clientTop||0,clientLeft=docElem.clientLeft||body.clientLeft||0,top=box.top+(self.pageYOffset||jQuery.boxModel&&docElem.scrollTop||body.scrollTop)-clientTop,left=box.left+(self.pageXOffset||jQuery.boxModel&&docElem.scrollLeft||body.scrollLeft)-clientLeft;return{top:top,left:left};};else
-jQuery.fn.offset=function(){if(!this[0])return{top:0,left:0};if(this[0]===this[0].ownerDocument.body)return jQuery.offset.bodyOffset(this[0]);jQuery.offset.initialized||jQuery.offset.initialize();var elem=this[0],offsetParent=elem.offsetParent,prevOffsetParent=elem,doc=elem.ownerDocument,computedStyle,docElem=doc.documentElement,body=doc.body,defaultView=doc.defaultView,prevComputedStyle=defaultView.getComputedStyle(elem,null),top=elem.offsetTop,left=elem.offsetLeft;while((elem=elem.parentNode)&&elem!==body&&elem!==docElem){computedStyle=defaultView.getComputedStyle(elem,null);top-=elem.scrollTop,left-=elem.scrollLeft;if(elem===offsetParent){top+=elem.offsetTop,left+=elem.offsetLeft;if(jQuery.offset.doesNotAddBorder&&!(jQuery.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(elem.tagName)))
-top+=parseInt(computedStyle.borderTopWidth,10)||0,left+=parseInt(computedStyle.borderLeftWidth,10)||0;prevOffsetParent=offsetParent,offsetParent=elem.offsetParent;}
-if(jQuery.offset.subtractsBorderForOverflowNotVisible&&computedStyle.overflow!=="visible")
-top+=parseInt(computedStyle.borderTopWidth,10)||0,left+=parseInt(computedStyle.borderLeftWidth,10)||0;prevComputedStyle=computedStyle;}
-if(prevComputedStyle.position==="relative"||prevComputedStyle.position==="static")
-top+=body.offsetTop,left+=body.offsetLeft;if(prevComputedStyle.position==="fixed")
-top+=Math.max(docElem.scrollTop,body.scrollTop),left+=Math.max(docElem.scrollLeft,body.scrollLeft);return{top:top,left:left};};jQuery.offset={initialize:function(){if(this.initialized)return;var body=document.body,container=document.createElement('div'),innerDiv,checkDiv,table,td,rules,prop,bodyMarginTop=body.style.marginTop,html='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';rules={position:'absolute',top:0,left:0,margin:0,border:0,width:'1px',height:'1px',visibility:'hidden'};for(prop in rules)container.style[prop]=rules[prop];container.innerHTML=html;body.insertBefore(container,body.firstChild);innerDiv=container.firstChild,checkDiv=innerDiv.firstChild,td=innerDiv.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(checkDiv.offsetTop!==5);this.doesAddBorderForTableAndCells=(td.offsetTop===5);innerDiv.style.overflow='hidden',innerDiv.style.position='relative';this.subtractsBorderForOverflowNotVisible=(checkDiv.offsetTop===-5);body.style.marginTop='1px';this.doesNotIncludeMarginInBodyOffset=(body.offsetTop===0);body.style.marginTop=bodyMarginTop;body.removeChild(container);this.initialized=true;},bodyOffset:function(body){jQuery.offset.initialized||jQuery.offset.initialize();var top=body.offsetTop,left=body.offsetLeft;if(jQuery.offset.doesNotIncludeMarginInBodyOffset)
-top+=parseInt(jQuery.curCSS(body,'marginTop',true),10)||0,left+=parseInt(jQuery.curCSS(body,'marginLeft',true),10)||0;return{top:top,left:left};}};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}
-return results;},offsetParent:function(){var offsetParent=this[0].offsetParent||document.body;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))
-offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return null;return val!==undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom",lower=name.toLowerCase();jQuery.fn["inner"+name]=function(){return this[0]?jQuery.css(this[0],lower,false,"padding"):null;};jQuery.fn["outer"+name]=function(margin){return this[0]?jQuery.css(this[0],lower,false,margin?"margin":"border"):null;};var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(document.documentElement["client"+name],document.body["scroll"+name],document.documentElement["scroll"+name],document.body["offset"+name],document.documentElement["offset"+name]):size===undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,typeof size==="string"?size:size+"px");};});})();$j=jQuery.noConflict(); \ No newline at end of file
diff --git a/skins/common/metadata.js b/skins/common/metadata.js
index 86fc6bd4..8fafc955 100644
--- a/skins/common/metadata.js
+++ b/skins/common/metadata.js
@@ -5,7 +5,7 @@
//
// attachMetadataToggle('mw_metadata', 'More...', 'Fewer...');
-function attachMetadataToggle( tableId, showText, hideText ) {
+window.attachMetadataToggle = function( tableId, showText, hideText ) {
if ( document.createTextNode ) {
var box = document.getElementById( tableId );
if ( !box ) {
@@ -46,4 +46,8 @@ function attachMetadataToggle( tableId, showText, hideText ) {
return true;
}
return false;
-}
+};
+
+$( document ).ready( function() {
+ attachMetadataToggle( 'mw_metadata', mediaWiki.msg( 'metadata-expand' ), mediaWiki.msg( 'metadata-collapse' ) );
+} );
diff --git a/skins/common/mwsuggest.js b/skins/common/mwsuggest.js
index 8f638c47..d7dd5ad8 100644
--- a/skins/common/mwsuggest.js
+++ b/skins/common/mwsuggest.js
@@ -7,39 +7,48 @@
* by Robert Stojnic (April 2008)
*/
+// Make sure wgMWSuggestTemplate is defined
+if ( !mw.config.exists( 'wgMWSuggestTemplate' ) ) {
+ mw.config.set( 'wgMWSuggestTemplate', mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' )
+ + "/api.php?action=opensearch\x26search={searchTerms}\x26namespace={namespaces}\x26suggest" );
+}
+
// search_box_id -> Results object
-var os_map = {};
+window.os_map = {};
// cached data, url -> json_text
-var os_cache = {};
+window.os_cache = {};
// global variables for suggest_keypress
-var os_cur_keypressed = 0;
-var os_keypressed_count = 0;
+window.os_cur_keypressed = 0;
+window.os_keypressed_count = 0;
// type: Timer
-var os_timer = null;
+window.os_timer = null;
// tie mousedown/up events
-var os_mouse_pressed = false;
-var os_mouse_num = -1;
+window.os_mouse_pressed = false;
+window.os_mouse_num = -1;
// if true, the last change was made by mouse (and not keyboard)
-var os_mouse_moved = false;
+window.os_mouse_moved = false;
// delay between keypress and suggestion (in ms)
-var os_search_timeout = 250;
+window.os_search_timeout = 250;
// these pairs of inputs/forms will be autoloaded at startup
-var os_autoload_inputs = new Array('searchInput', 'searchInput2', 'powerSearchText', 'searchText');
-var os_autoload_forms = new Array('searchform', 'searchform2', 'powersearch', 'search' );
+window.os_autoload_inputs = new Array('searchInput', 'searchInput2', 'powerSearchText', 'searchText');
+window.os_autoload_forms = new Array('searchform', 'searchform2', 'powersearch', 'search' );
// if we stopped the service
-var os_is_stopped = false;
+window.os_is_stopped = false;
// max lines to show in suggest table
-var os_max_lines_per_suggest = 7;
+window.os_max_lines_per_suggest = 7;
// number of steps to animate expansion/contraction of container width
-var os_animation_steps = 6;
+window.os_animation_steps = 6;
// num of pixels of smallest step
-var os_animation_min_step = 2;
+window.os_animation_min_step = 2;
// delay between steps (in ms)
-var os_animation_delay = 30;
+window.os_animation_delay = 30;
// max width of container in percent of normal size (1 == 100%)
-var os_container_max_width = 2;
+window.os_container_max_width = 2;
// currently active animation timer
-var os_animation_timer = null;
+window.os_animation_timer = null;
+// whether MWSuggest is enabled. Set to false when os_MWSuggestDisable() is called
+window.os_enabled = true;
+
/**
* <datalist> is a new HTML5 element that allows you to manually supply
* suggestion lists and have them rendered according to the right platform
@@ -50,17 +59,17 @@ var os_animation_timer = null;
* (maybe with a UA check) when some browser has a better implementation.
*/
// var os_use_datalist = 'list' in document.createElement( 'input' );
-var os_use_datalist = false;
+window.os_use_datalist = false;
/** Timeout timer class that will fetch the results */
-function os_Timer( id, r, query ) {
+window.os_Timer = function( id, r, query ) {
this.id = id;
this.r = r;
this.query = query;
-}
+};
/** Property class for single search box */
-function os_Results( name, formname ) {
+window.os_Results = function( name, formname ) {
this.searchform = formname; // id of the searchform
this.searchbox = name; // id of the searchbox
this.container = name + 'Suggest'; // div that holds results
@@ -77,10 +86,10 @@ function os_Results( name, formname ) {
this.containerTotal = 0; // total height of the container will all results
this.visible = false; // if container is visible
this.stayHidden = false; // don't try to show if lost focus
-}
+};
/** Timer user to animate expansion/contraction of container width */
-function os_AnimationTimer( r, target ) {
+window.os_AnimationTimer = function( r, target ) {
this.r = r;
var current = document.getElementById(r.container).offsetWidth;
this.inc = Math.round( ( target - current ) / os_animation_steps );
@@ -91,15 +100,19 @@ function os_AnimationTimer( r, target ) {
this.inc = -os_animation_min_step;
}
this.target = target;
-}
+};
/******************
* Initialization
******************/
/** Initialization, call upon page onload */
-function os_MWSuggestInit() {
- for( i = 0; i < os_autoload_inputs.length; i++ ) {
+window.os_MWSuggestInit = function() {
+ if ( !window.os_enabled ) {
+ return;
+ }
+
+ for( var i = 0; i < os_autoload_inputs.length; i++ ) {
var id = os_autoload_inputs[i];
var form = os_autoload_forms[i];
element = document.getElementById( id );
@@ -107,26 +120,50 @@ function os_MWSuggestInit() {
os_initHandlers( id, form, element );
}
}
+};
+
+/* Teardown, called when things like SimpleSearch need to disable MWSuggest */
+window.os_MWSuggestTeardown = function() {
+ for( var i = 0; i < os_autoload_inputs.length; i++ ) {
+ var id = os_autoload_inputs[i];
+ var form = os_autoload_forms[i];
+ element = document.getElementById( id );
+ if( element != null ) {
+ os_teardownHandlers( id, form, element );
+ }
+ }
+};
+
+/* Call this to disable MWSuggest. Works regardless of whether MWSuggest has been initialized already. */
+window.os_MWSuggestDisable = function() {
+ window.os_MWSuggestTeardown();
+ window.os_enabled = false;
}
+
/** Init Result objects and event handlers */
-function os_initHandlers( name, formname, element ) {
+window.os_initHandlers = function( name, formname, element ) {
var r = new os_Results( name, formname );
+ var formElement = document.getElementById( formname );
+ if( !formElement ) {
+ // Older browsers (Opera 8) cannot get form elements
+ return;
+ }
// event handler
- os_hookEvent( element, 'keyup', function( event ) { os_eventKeyup( event ); } );
- os_hookEvent( element, 'keydown', function( event ) { os_eventKeydown( event ); } );
- os_hookEvent( element, 'keypress', function( event ) { os_eventKeypress( event ); } );
+ os_hookEvent( element, 'keyup', os_eventKeyup );
+ os_hookEvent( element, 'keydown', os_eventKeydown );
+ os_hookEvent( element, 'keypress', os_eventKeypress );
if ( !os_use_datalist ) {
// These are needed for the div hack to hide it if the user blurs.
- os_hookEvent( element, 'blur', function( event ) { os_eventBlur( event ); } );
- os_hookEvent( element, 'focus', function( event ) { os_eventFocus( event ); } );
+ os_hookEvent( element, 'blur', os_eventBlur );
+ os_hookEvent( element, 'focus', os_eventFocus );
// We don't want browser auto-suggestions interfering with our div, but
// autocomplete must be on for datalist to work (at least in Opera
// 10.10).
element.setAttribute( 'autocomplete', 'off' );
}
// stopping handler
- os_hookEvent( document.getElementById( formname ), 'submit', function( event ) { return os_eventOnsubmit( event ); } );
+ os_hookEvent( formElement, 'submit', os_eventOnsubmit );
os_map[name] = r;
// toggle link
if( document.getElementById( r.toggle ) == null ) {
@@ -152,14 +189,46 @@ function os_initHandlers( name, formname, element ) {
} */
}
-}
+};
-function os_hookEvent( element, hookName, hookFunct ) {
+window.os_teardownHandlers = function( name, formname, element ) {
+ var formElement = document.getElementById( formname );
+ if( !formElement ) {
+ // Older browsers (Opera 8) cannot get form elements
+ return;
+ }
+
+ os_unhookEvent( element, 'keyup', os_eventKeyup );
+ os_unhookEvent( element, 'keydown', os_eventKeydown );
+ os_unhookEvent( element, 'keypress', os_eventKeypress );
+ if ( !os_use_datalist ) {
+ // These are needed for the div hack to hide it if the user blurs.
+ os_unhookEvent( element, 'blur', os_eventBlur );
+ os_unhookEvent( element, 'focus', os_eventFocus );
+ // We don't want browser auto-suggestions interfering with our div, but
+ // autocomplete must be on for datalist to work (at least in Opera
+ // 10.10).
+ element.removeAttribute( 'autocomplete' );
+ }
+ // stopping handler
+ os_unhookEvent( formElement, 'submit', os_eventOnsubmit );
+};
+
+
+window.os_hookEvent = function( element, hookName, hookFunct ) {
if ( element.addEventListener ) {
element.addEventListener( hookName, hookFunct, false );
} else if ( window.attachEvent ) {
element.attachEvent( 'on' + hookName, hookFunct );
}
+};
+
+window.os_unhookEvent = function( element, hookName, hookFunct ) {
+ if ( element.removeEventListener ) {
+ element.removeEventListener( hookName, hookFunct, false );
+ } else if ( element.detachEvent ) {
+ element.detachEvent( 'on' + hookName, hookFunct );
+ }
}
/********************
@@ -167,7 +236,7 @@ function os_hookEvent( element, hookName, hookFunct ) {
********************/
/** Event handler that will fetch results on keyup */
-function os_eventKeyup( e ) {
+window.os_eventKeyup = function( e ) {
var targ = os_getTarget( e );
var r = os_map[targ.id];
if( r == null ) {
@@ -180,10 +249,10 @@ function os_eventKeyup( e ) {
}
var query = targ.value;
os_fetchResults( r, query, os_search_timeout );
-}
+};
/** catch arrows up/down and escape to hide the suggestions */
-function os_processKey( r, keypressed, targ ) {
+window.os_processKey = function( r, keypressed, targ ) {
if ( keypressed == 40 && !r.visible && os_timer == null ) {
// If the user hits the down arrow, fetch results immediately if none
// are already displayed.
@@ -210,10 +279,10 @@ function os_processKey( r, keypressed, targ ) {
} else if( r.query != document.getElementById( r.searchbox ).value ) {
// os_hideResults( r ); // don't show old suggestions
}
-}
+};
/** When keys is held down use a timer to output regular events */
-function os_eventKeypress( e ) {
+window.os_eventKeypress = function( e ) {
var targ = os_getTarget( e );
var r = os_map[targ.id];
if( r == null ) {
@@ -224,10 +293,10 @@ function os_eventKeypress( e ) {
os_keypressed_count++;
os_processKey( r, keypressed, targ );
-}
+};
/** Catch the key code (Firefox bug) */
-function os_eventKeydown( e ) {
+window.os_eventKeydown = function( e ) {
if ( !e ) {
e = window.event;
}
@@ -241,11 +310,11 @@ function os_eventKeydown( e ) {
os_cur_keypressed = ( e.keyCode == undefined ) ? e.which : e.keyCode;
os_keypressed_count = 0;
-}
+};
/** When the form is submitted hide everything, cancel updates... */
-function os_eventOnsubmit( e ) {
+window.os_eventOnsubmit = function( e ) {
var targ = os_getTarget( e );
os_is_stopped = true;
@@ -267,13 +336,13 @@ function os_eventOnsubmit( e ) {
}
}
return true;
-}
+};
/** Hide results from the user, either making the div visibility=hidden or
* detaching the datalist from the input. */
-function os_hideResults( r ) {
+window.os_hideResults = function( r ) {
if ( os_use_datalist ) {
document.getElementById( r.searchbox ).setAttribute( 'list', '' );
} else {
@@ -284,9 +353,9 @@ function os_hideResults( r ) {
}
r.visible = false;
r.selected = -1;
-}
+};
-function os_decodeValue( value ) {
+window.os_decodeValue = function( value ) {
if ( decodeURIComponent ) {
return decodeURIComponent( value );
}
@@ -294,9 +363,9 @@ function os_decodeValue( value ) {
return unescape( value );
}
return null;
-}
+};
-function os_encodeQuery( value ) {
+window.os_encodeQuery = function( value ) {
if ( encodeURIComponent ) {
return encodeURIComponent( value );
}
@@ -304,10 +373,10 @@ function os_encodeQuery( value ) {
return escape( value );
}
return null;
-}
+};
/** Handles data from XMLHttpRequest, and updates the suggest results */
-function os_updateResults( r, query, text, cacheKey ) {
+window.os_updateResults = function( r, query, text, cacheKey ) {
os_cache[cacheKey] = text;
r.query = query;
r.original = query;
@@ -335,7 +404,7 @@ function os_updateResults( r, query, text, cacheKey ) {
os_cache[cacheKey] = null;
}
}
-}
+};
/**
* Create and populate a <datalist>.
@@ -343,7 +412,7 @@ function os_updateResults( r, query, text, cacheKey ) {
* @param r os_Result object
* @param results Array of the new results to replace existing ones
*/
-function os_setupDatalist( r, results ) {
+window.os_setupDatalist = function( r, results ) {
var s = document.getElementById( r.searchbox );
var c = document.getElementById( r.container );
if ( c == null ) {
@@ -365,11 +434,11 @@ function os_setupDatalist( r, results ) {
r.results[i] = title;
c.appendChild( opt );
}
-}
+};
/** Fetch namespaces from checkboxes or hidden fields in the search form,
if none defined use wgSearchNamespaces global */
-function os_getNamespaces( r ) {
+window.os_getNamespaces = function( r ) {
var namespaces = '';
var elements = document.forms[r.searchform].elements;
for( i = 0; i < elements.length; i++ ) {
@@ -390,26 +459,26 @@ function os_getNamespaces( r ) {
namespaces = wgSearchNamespaces.join('|');
}
return namespaces;
-}
+};
/** Update results if user hasn't already typed something else */
-function os_updateIfRelevant( r, query, text, cacheKey ) {
+window.os_updateIfRelevant = function( r, query, text, cacheKey ) {
var t = document.getElementById( r.searchbox );
if( t != null && t.value == query ) { // check if response is still relevant
os_updateResults( r, query, text, cacheKey );
}
r.query = query;
-}
+};
/** Fetch results after some timeout */
-function os_delayedFetch() {
+window.os_delayedFetch = function() {
if( os_timer == null ) {
return;
}
var r = os_timer.r;
var query = os_timer.query;
os_timer = null;
- var path = wgMWSuggestTemplate.replace( "{namespaces}", os_getNamespaces( r ) )
+ var path = mw.config.get( 'wgMWSuggestTemplate' ).replace( "{namespaces}", os_getNamespaces( r ) )
.replace( "{dbname}", wgDBname )
.replace( "{searchTerms}", os_encodeQuery( query ) );
@@ -436,10 +505,10 @@ function os_delayedFetch() {
}
}
}
-}
+};
/** Init timed update via os_delayedUpdate() */
-function os_fetchResults( r, query, timeout ) {
+window.os_fetchResults = function( r, query, timeout ) {
if( query == '' ) {
r.query = '';
os_hideResults( r );
@@ -461,10 +530,10 @@ function os_fetchResults( r, query, timeout ) {
os_timer = new os_Timer( null, r, query );
os_delayedFetch(); // do it now!
}
-}
+};
/** Find event target */
-function os_getTarget( e ) {
+window.os_getTarget = function( e ) {
if ( !e ) {
e = window.event;
}
@@ -475,10 +544,10 @@ function os_getTarget( e ) {
} else {
return null;
}
-}
+};
/** Check if x is a valid integer */
-function os_isNumber( x ) {
+window.os_isNumber = function( x ) {
if( x == '' || isNaN( x ) ) {
return false;
}
@@ -489,15 +558,15 @@ function os_isNumber( x ) {
}
}
return true;
-}
+};
/** Call this to enable suggestions on input (id=inputId), on a form (name=formName) */
-function os_enableSuggestionsOn( inputId, formName ) {
+window.os_enableSuggestionsOn = function( inputId, formName ) {
os_initHandlers( inputId, formName, document.getElementById( inputId ) );
-}
+};
/** Call this to disable suggestios on input box (id=inputId) */
-function os_disableSuggestionsOn( inputId ) {
+window.os_disableSuggestionsOn = function( inputId ) {
r = os_map[inputId];
if( r != null ) {
// cancel/hide results
@@ -514,14 +583,14 @@ function os_disableSuggestionsOn( inputId ) {
if ( index >= 0 ) {
os_autoload_inputs[index] = os_autoload_forms[index] = '';
}
-}
+};
/************************************************
* Div-only functions (irrelevant for datalist)
************************************************/
/** Event: loss of focus of input box */
-function os_eventBlur( e ) {
+window.os_eventBlur = function( e ) {
var targ = os_getTarget( e );
var r = os_map[targ.id];
if( r == null ) {
@@ -537,17 +606,17 @@ function os_eventBlur( e ) {
}
os_timer = null;
}
-}
+};
/** Event: focus (catch only when stopped) */
-function os_eventFocus( e ) {
+window.os_eventFocus = function( e ) {
var targ = os_getTarget( e );
var r = os_map[targ.id];
if( r == null ) {
return; // not our event
}
r.stayHidden = false;
-}
+};
/**
* Create and populate a <div>, for non-<datalist>-supporting browsers.
@@ -555,7 +624,7 @@ function os_eventFocus( e ) {
* @param r os_Result object
* @param results Array of the new results to replace existing ones
*/
-function os_setupDiv( r, results ) {
+window.os_setupDiv = function( r, results ) {
var c = document.getElementById( r.container );
if ( c == null ) {
c = os_createContainer( r );
@@ -568,10 +637,10 @@ function os_setupDiv( r, results ) {
os_fitContainer( r );
os_trimResultText( r );
os_showResults( r );
-}
+};
/** Create the result table to be placed in the container div */
-function os_createResultTable( r, results ) {
+window.os_createResultTable = function( r, results ) {
var c = document.getElementById( r.container );
var width = c.offsetWidth - os_operaWidthFix( c.offsetWidth );
var html = '<table class="os-suggest-results" id="' + r.resultTable + '" style="width: ' + width + 'px;">';
@@ -584,10 +653,10 @@ function os_createResultTable( r, results ) {
}
html += '</table>';
return html;
-}
+};
/** Show results div */
-function os_showResults( r ) {
+window.os_showResults = function( r ) {
if( os_is_stopped ) {
return;
}
@@ -602,69 +671,69 @@ function os_showResults( r ) {
c.style.visibility = 'visible';
r.visible = true;
}
-}
+};
-function os_operaWidthFix( x ) {
+window.os_operaWidthFix = function( x ) {
// For browsers that don't understand overflow-x, estimate scrollbar width
if( typeof document.body.style.overflowX != 'string' ) {
return 30;
}
return 0;
-}
+};
/** Brower-dependent functions to find window inner size, and scroll status */
-function f_clientWidth() {
+window.f_clientWidth = function() {
return f_filterResults(
window.innerWidth ? window.innerWidth : 0,
document.documentElement ? document.documentElement.clientWidth : 0,
document.body ? document.body.clientWidth : 0
);
-}
+};
-function f_clientHeight() {
+window.f_clientHeight = function() {
return f_filterResults(
window.innerHeight ? window.innerHeight : 0,
document.documentElement ? document.documentElement.clientHeight : 0,
document.body ? document.body.clientHeight : 0
);
-}
+};
-function f_scrollLeft() {
+window.f_scrollLeft = function() {
return f_filterResults(
window.pageXOffset ? window.pageXOffset : 0,
document.documentElement ? document.documentElement.scrollLeft : 0,
document.body ? document.body.scrollLeft : 0
);
-}
+};
-function f_scrollTop() {
+window.f_scrollTop = function() {
return f_filterResults(
window.pageYOffset ? window.pageYOffset : 0,
document.documentElement ? document.documentElement.scrollTop : 0,
document.body ? document.body.scrollTop : 0
);
-}
+};
-function f_filterResults( n_win, n_docel, n_body ) {
+window.f_filterResults = function( n_win, n_docel, n_body ) {
var n_result = n_win ? n_win : 0;
if ( n_docel && ( !n_result || ( n_result > n_docel ) ) ) {
n_result = n_docel;
}
return n_body && ( !n_result || ( n_result > n_body ) ) ? n_body : n_result;
-}
+};
/** Get the height available for the results container */
-function os_availableHeight( r ) {
+window.os_availableHeight = function( r ) {
var absTop = document.getElementById( r.container ).style.top;
var px = absTop.lastIndexOf( 'px' );
if( px > 0 ) {
absTop = absTop.substring( 0, px );
}
return f_clientHeight() - ( absTop - f_scrollTop() );
-}
+};
/** Get element absolute position {left,top} */
-function os_getElementPosition( elemID ) {
+window.os_getElementPosition = function( elemID ) {
var offsetTrail = document.getElementById( elemID );
var offsetLeft = 0;
var offsetTop = 0;
@@ -678,36 +747,44 @@ function os_getElementPosition( elemID ) {
offsetTop += document.body.topMargin;
}
return { left:offsetLeft, top:offsetTop };
-}
+};
/** Create the container div that will hold the suggested titles */
-function os_createContainer( r ) {
- var c = document.createElement( 'div' );
- var s = document.getElementById( r.searchbox );
- var pos = os_getElementPosition( r.searchbox );
+window.os_createContainer = function(r) {
+ var c = document.createElement('div');
+ var s = document.getElementById(r.searchbox);
+ var pos = os_getElementPosition(r.searchbox);
var left = pos.left;
var top = pos.top + s.offsetHeight;
c.className = 'os-suggest';
- c.setAttribute( 'id', r.container );
- document.body.appendChild( c );
+ c.setAttribute('id', r.container);
+ document.body.appendChild(c);
// dynamically generated style params
// IE workaround, cannot explicitely set "style" attribute
- c = document.getElementById( r.container );
+ c = document.getElementById(r.container);
c.style.top = top + 'px';
c.style.left = left + 'px';
c.style.width = s.offsetWidth + 'px';
// mouse event handlers
- c.onmouseover = function( event ) { os_eventMouseover( r.searchbox, event ); };
- c.onmousemove = function( event ) { os_eventMousemove( r.searchbox, event ); };
- c.onmousedown = function( event ) { return os_eventMousedown( r.searchbox, event ); };
- c.onmouseup = function( event ) { os_eventMouseup( r.searchbox, event ); };
+ c.onmouseover = function(event) {
+ os_eventMouseover(r.searchbox, event);
+ };
+ c.onmousemove = function(event) {
+ os_eventMousemove(r.searchbox, event);
+ };
+ c.onmousedown = function(event) {
+ return os_eventMousedown(r.searchbox, event);
+ };
+ c.onmouseup = function(event) {
+ os_eventMouseup(r.searchbox, event);
+ };
return c;
-}
+};
/** change container height to fit to screen */
-function os_fitContainer( r ) {
+window.os_fitContainer = function( r ) {
var c = document.getElementById( r.container );
var h = os_availableHeight( r ) - 20;
var inc = r.containerRow;
@@ -725,10 +802,10 @@ function os_fitContainer( r ) {
c.style.height = r.containerTotal + 'px';
r.containerCount = r.resultCount;
}
-}
+};
/** If some entries are longer than the box, replace text with "..." */
-function os_trimResultText( r ) {
+window.os_trimResultText = function( r ) {
// find max width, first see if we could expand the container to fit it
var maxW = 0;
for( var i = 0; i < r.resultCount; i++ ) {
@@ -791,10 +868,10 @@ function os_trimResultText( r ) {
document.getElementById( r.resultTable + i ).setAttribute( 'title', r.results[i] );
}
}
-}
+};
/** Invoked on timer to animate change in container width */
-function os_animateChangeWidth() {
+window.os_animateChangeWidth = function() {
var r = os_animation_timer.r;
var c = document.getElementById( r.container );
var w = c.offsetWidth;
@@ -815,10 +892,10 @@ function os_animateChangeWidth() {
c.style.left = ( normL + normW + ( target - nw ) - os_animation_timer.target - 1 ) + 'px';
}
}
-}
+};
/** Change the highlighted row (i.e. suggestion), from position cur to next */
-function os_changeHighlight( r, cur, next, updateSearchBox ) {
+window.os_changeHighlight = function( r, cur, next, updateSearchBox ) {
if ( next >= r.resultCount ) {
next = r.resultCount - 1;
}
@@ -863,9 +940,9 @@ function os_changeHighlight( r, cur, next, updateSearchBox ) {
if( updateSearchBox ) {
os_updateSearchQuery( r, newText );
}
-}
+};
-function os_HighlightClass() {
+window.os_HighlightClass = function() {
var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
if ( match ) {
var webKitVersion = parseInt( match[1] );
@@ -877,12 +954,12 @@ function os_HighlightClass() {
}
}
return 'os-suggest-result-hl';
-}
+};
-function os_updateSearchQuery( r, newText ) {
+window.os_updateSearchQuery = function( r, newText ) {
document.getElementById( r.searchbox ).value = newText;
r.query = newText;
-}
+};
/********************
@@ -890,7 +967,7 @@ function os_updateSearchQuery( r, newText ) {
********************/
/** Mouse over the container */
-function os_eventMouseover( srcId, e ) {
+window.os_eventMouseover = function( srcId, e ) {
var targ = os_getTarget( e );
var r = os_map[srcId];
if( r == null || !os_mouse_moved ) {
@@ -900,10 +977,10 @@ function os_eventMouseover( srcId, e ) {
if( num >= 0 ) {
os_changeHighlight( r, r.selected, num, false );
}
-}
+};
/* Get row where the event occured (from its id) */
-function os_getNumberSuffix( id ) {
+window.os_getNumberSuffix = function( id ) {
var num = id.substring( id.length - 2 );
if( !( num.charAt( 0 ) >= '0' && num.charAt( 0 ) <= '9' ) ) {
num = num.substring( 1 );
@@ -913,15 +990,15 @@ function os_getNumberSuffix( id ) {
} else {
return -1;
}
-}
+};
/** Save mouse move as last action */
-function os_eventMousemove( srcId, e ) {
+window.os_eventMousemove = function( srcId, e ) {
os_mouse_moved = true;
-}
+};
/** Mouse button held down, register possible click */
-function os_eventMousedown( srcId, e ) {
+window.os_eventMousedown = function( srcId, e ) {
var targ = os_getTarget( e );
var r = os_map[srcId];
if( r == null ) {
@@ -938,10 +1015,10 @@ function os_eventMousedown( srcId, e ) {
document.getElementById( r.searchbox ).focus();
return false; // prevents selection
-}
+};
/** Mouse button released, check for click on some row */
-function os_eventMouseup( srcId, e ) {
+window.os_eventMouseup = function( srcId, e ) {
var targ = os_getTarget( e );
var r = os_map[srcId];
if( r == null ) {
@@ -957,12 +1034,12 @@ function os_eventMouseup( srcId, e ) {
os_mouse_pressed = false;
// keep the focus on the search field
document.getElementById( r.searchbox ).focus();
-}
+};
/** Toggle stuff seems to be dead code? */
/** Return the span element that contains the toggle link */
-function os_createToggle( r, className ) {
+window.os_createToggle = function( r, className ) {
var t = document.createElement( 'span' );
t.className = className;
t.setAttribute( 'id', r.toggle );
@@ -973,10 +1050,10 @@ function os_createToggle( r, className ) {
link.appendChild( msg );
t.appendChild( link );
return t;
-}
+};
/** Call when user clicks on some of the toggle links */
-function os_toggle( inputId, formName ) {
+window.os_toggle = function( inputId, formName ) {
r = os_map[inputId];
var msg = '';
if( r == null ) {
@@ -990,6 +1067,6 @@ function os_toggle( inputId, formName ) {
// change message
var link = document.getElementById( r.toggle ).firstChild;
link.replaceChild( document.createTextNode( msg ), link.firstChild );
-}
+};
hookEvent( 'load', os_MWSuggestInit );
diff --git a/skins/common/nostalgia.css b/skins/common/nostalgia.css
index c9b36a70..e1b774df 100644
--- a/skins/common/nostalgia.css
+++ b/skins/common/nostalgia.css
@@ -2,16 +2,47 @@ body {
/* Background color is set separately on page type */
color: black;
}
-#specialform { display: inline; }
+
+#specialform {
+ display: inline;
+}
+
#powersearch {
- background: #DDEEFF; border-style: solid; border-width: 1px; padding: 2px;
+ background: #DDEEFF;
+ border-style: solid;
+ border-width: 1px;
+ padding: 2px;
+}
+
+a.interwiki, a.external {
+ color: #3366BB;
+}
+
+a.printable {
+ text-decoration: underline;
}
-a.interwiki, a.external { color: #3366BB; }
-a.printable { text-decoration: underline; }
-a.stub { color:#772233; text-decoration:none; }
-h1.pagetitle { padding-top: 0; margin-top: 0; padding-bottom: 0; margin-bottom: 0; }
-h2, h3, h4, h5, h6 { margin-bottom: 0; }
-textarea { overflow: auto; }
-p.subtitle { padding-top: 0; margin-top: 0; }
+a.stub {
+ color: #772233;
+ text-decoration: none;
+}
+h1.pagetitle {
+ padding-top: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ margin-bottom: 0;
+}
+
+h2, h3, h4, h5, h6 {
+ margin-bottom: 0;
+}
+
+textarea {
+ overflow: auto;
+}
+
+p.subtitle {
+ padding-top: 0;
+ margin-top: 0;
+}
diff --git a/skins/common/oldshared.css b/skins/common/oldshared.css
index 1bd1544e..33047ec9 100644
--- a/skins/common/oldshared.css
+++ b/skins/common/oldshared.css
@@ -12,7 +12,9 @@ h2 { font-size: 1.5em; }
h3 { font-size: 1.17em; }
h5 { font-size: .83em; }
h6 { font-size: .75em; }
-h1, h2, h3, h4, h5, h6 { font-weight: bolder }
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bolder;
+}
/* Now the custom parts */
@@ -20,32 +22,47 @@ h1, h2, h3, h4, h5, h6 { font-weight: bolder }
.editsection {
font-weight: normal;
}
-h1 .editsection { font-size: 50% }
-h2 .editsection { font-size: 66.7% }
-h3 .editsection { font-size: 85.5% }
-h5 .editsection { font-size: 120% }
-h6 .editsection { font-size: 133% }
+h1 .editsection { font-size: 50%; }
+h2 .editsection { font-size: 66.7%; }
+h3 .editsection { font-size: 85.5%; }
+h5 .editsection { font-size: 120%; }
+h6 .editsection { font-size: 133%; }
#footer { clear: both }
/* images */
-div.floatright { float: right; clear: right; margin: 0 0 1em 1em; }
-div.floatright p { font-style: italic; }
-div.floatleft { float: left; clear: left; margin: 0.3em 0.5em 0.5em 0; }
-div.floatleft p { font-style: italic; }
+div.floatright {
+ float: right;
+ clear: right;
+ margin: 0 0 1em 1em;
+}
+
+div.floatright p {
+ font-style: italic;
+}
+
+div.floatleft {
+ float: left;
+ clear: left;
+ margin: 0.3em 0.5em 0.5em 0;
+}
+
+div.floatleft p {
+ font-style: italic;
+}
/* Print-specific things to hide */
.printfooter {
- display: none;
+ display: none;
}
/* table standards */
table.rimage {
- float:right;
- margin-left:1em;
- margin-bottom:1em;
- text-align:center;
- font-size:smaller;
+ float: right;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+ font-size: smaller;
}
/* thumbnails */
@@ -137,7 +154,6 @@ img { border: none; }
font-size: 94%;
}
-
.error {
color: red;
font-size: larger;
@@ -148,77 +164,88 @@ img { border: none; }
clear: both;
}
#preftoc {
- float: left;
- margin: 1em 1em 1em 1em;
- width: 13em;
+ float: left;
+ margin: 1em 1em 1em 1em;
+ width: 13em;
+}
+#preftoc li {
+ border: 1px solid White;
}
-#preftoc li { border: 1px solid White; }
#preftoc li.selected {
- background-color:#f9f9f9;
- border:1px dashed #aaaaaa;
+ background-color:#f9f9f9;
+ border:1px dashed #aaaaaa;
}
#preftoc a,
#preftoc a:active {
- display: block;
- color: #005189;
+ display: block;
+ color: #005189;
}
.mw-prefs-buttons {
- clear: left;
- float: left;
- margin-top: 1em;
+ clear: left;
+ float: left;
+ margin-top: 1em;
}
div.htmlform-tip {
- font-size: 94%;
- margin-top: 0.4em;
- color: #666;
+ font-size: 94%;
+ margin-top: 0.4em;
+ color: #666;
+}
+fieldset.prefsection {
+ margin-top: 1em;
+}
+fieldset.operaprefsection {
+ margin-left: 15em;
}
-fieldset.prefsection { margin-top: 1em }
-fieldset.operaprefsection { margin-left: 15em }
/* emulate center */
.center {
- width: 100%;
- text-align: center;
+ width: 100%;
+ text-align: center;
}
*.center * {
- margin-left: auto;
- margin-right: auto;
+ margin-left: auto;
+ margin-right: auto;
}
+
/* small for tables and similar */
-.small, .small * { font-size: 94%; }
-table.small { font-size: 100% }
+.small, .small * {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
/* use this instead of #toc for page content */
.toccolours {
- border:1px solid #aaaaaa;
- background-color:#f9f9f9;
- padding:5px;
- font-size: 95%;
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
}
#siteNotice {
- border:1px solid #aaaaaa;
- padding-left: 0.5em;
- padding-right: 0.5em;
+ border: 1px solid #aaaaaa;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
}
.redirectText {
- font-size:150%;
- margin:5px;
+ font-size: 150%;
+ margin: 5px;
}
.sharedUploadNotice {
font-style: italic;
}
span.unpatrolled {
- font-weight:bold;
- color:red;
+ font-weight: bold;
+ color: red;
}
span.updatedmarker {
- color:black;
- background-color:#00FF00;
+ color: black;
+ background-color: #00FF00;
}
div.gallerybox {
- width: 150px;
+ width: 150px;
}
span.comment {
@@ -234,19 +261,19 @@ span.changedby {
color: #cc0000;
}
.editExternally {
- border-style:solid;
- border-width:1px;
- border-color:gray;
- background: #ffffff;
- padding:3px;
- margin-top:0.5em;
- float:left;
- font-size:small;
- text-align:center;
+ border-style: solid;
+ border-width: 1px;
+ border-color: gray;
+ background: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
}
.editExternallyHelp {
- font-style:italic;
- color:gray;
+ font-style: italic;
+ color: gray;
}
li span.deleted {
@@ -260,9 +287,15 @@ table.mw_metadata {
margin-left: 0.5em;
}
-table.mw_metadata caption { font-weight: bold; }
-table.mw_metadata th { font-weight: normal; }
-table.mw_metadata td { padding: 0.1em; }
+table.mw_metadata caption {
+ font-weight: bold;
+}
+table.mw_metadata th {
+ font-weight: normal;
+}
+table.mw_metadata td {
+ padding: 0.1em;
+}
table.mw_metadata {
border: none;
@@ -289,11 +322,10 @@ table.collapsed tr.collapsable {
}
.visualClear {
- clear: both;
+ clear: both;
}
/* Allmessages table */
-
#allmessagestable th {
background-color: #b2b2ff;
}
@@ -311,28 +343,28 @@ table.collapsed tr.collapsable {
}
#jump-to-nav {
- display: none;
+ display: none;
}
div.multipageimagenavbox {
- border: solid 1px silver;
- padding: 4px;
- margin: 1em;
- background: #f0f0f0;
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
}
div.multipageimagenavbox div.thumb {
- border: none;
- margin-left: 2em;
- margin-right: 2em;
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
}
div.multipageimagenavbox hr {
- margin: 6px;
+ margin: 6px;
}
table.multipageimage td {
- text-align: center;
+ text-align: center;
}
/*
@@ -343,22 +375,42 @@ table.multipageimage td {
- remove line wrapping for all td and th, set background color
- restore line wrapping for the last two table cells (description and size)
*/
-.TablePager_nav a { text-decoration: none; }
-.TablePager { border-collapse: collapse; }
-.TablePager, .TablePager td, .TablePager th {
+.TablePager_nav a {
+ text-decoration: none;
+}
+.TablePager {
+ border-collapse: collapse;
+}
+.TablePager, .TablePager td, .TablePager th {
border: 0.15em solid #777777;
padding: 0 0.15em 0 0.15em;
}
-.TablePager th { background-color: #eeeeff }
-.TablePager td { background-color: #ffffff }
-.TablePager tr:hover td { background-color: #eeeeff }
+.TablePager th {
+ background-color: #eeeeff;
+}
+.TablePager td {
+ background-color: #ffffff;
+}
+.TablePager tr:hover td {
+ background-color: #eeeeff;
+}
-.imagelist td, .imagelist th { white-space: nowrap }
-.imagelist .TablePager_col_links { background-color: #eeeeff }
-.imagelist .TablePager_col_img_description { white-space: normal }
-.imagelist th.TablePager_sort { background-color: #ccccff }
+.imagelist td, .imagelist th {
+ white-space: nowrap;
+}
+.imagelist .TablePager_col_links {
+ background-color: #eeeeff;
+}
+.imagelist .TablePager_col_img_description {
+ white-space: normal;
+}
+.imagelist th.TablePager_sort {
+ background-color: #ccccff;
+}
-.templatesUsed { margin-top: 1em; }
+.templatesUsed {
+ margin-top: 1em;
+}
.MediaTransformError {
border: thin solid #777;
diff --git a/skins/common/prefs.js b/skins/common/prefs.js
index ca55632c..1eb8e5bf 100644
--- a/skins/common/prefs.js
+++ b/skins/common/prefs.js
@@ -1,84 +1,6 @@
-// generate toc from prefs form, fold sections
-// XXX: needs testing on IE/Mac and safari
-// more comments to follow
-function tabbedprefs() {
- var prefform = document.getElementById( 'preferences' );
- if ( !prefform || !document.createElement ) {
- return;
- }
- if ( prefform.nodeName.toLowerCase() == 'a' ) {
- return; // Occasional IE problem
- }
- prefform.className = prefform.className + 'jsprefs';
- var sections = [];
- var children = prefform.childNodes;
- var seci = 0;
- for ( var i = 0; i < children.length; i++ ) {
- if ( children[i].nodeName.toLowerCase() == 'fieldset' ) {
- children[i].id = 'prefsection-' + seci;
- children[i].className = 'prefsection';
- if ( is_opera ) {
- children[i].className = 'prefsection operaprefsection';
- }
- var legends = children[i].getElementsByTagName('legend');
- sections[seci] = {};
- if ( legends[0] ) {
- legends[0].className = 'mainLegend';
- }
- if ( legends[0] && legends[0].firstChild.nodeValue ) {
- sections[seci].text = legends[0].firstChild.nodeValue;
- } else {
- sections[seci].text = '# ' + seci;
- }
- sections[seci].secid = children[i].id;
- seci++;
- if ( sections.length != 1 ) {
- children[i].style.display = 'none';
- } else {
- var selectedid = children[i].id;
- }
- }
- }
- var toc = document.createElement( 'ul' );
- toc.id = 'preftoc';
- toc.selectedid = selectedid;
- for ( i = 0; i < sections.length; i++ ) {
- var li = document.createElement( 'li' );
- if ( i === 0 ) {
- li.className = 'selected';
- }
- var a = document.createElement( 'a' );
- a.href = '#' + sections[i].secid;
- a.onmousedown = a.onclick = uncoversection;
- a.appendChild( document.createTextNode( sections[i].text ) );
- a.secid = sections[i].secid;
- li.appendChild( a );
- toc.appendChild( li );
- }
- prefform.parentNode.insertBefore( toc, prefform.parentNode.childNodes[0] );
- document.getElementById( 'prefsubmit' ).id = 'prefcontrol';
-}
-
-function uncoversection() {
- var oldsecid = this.parentNode.parentNode.selectedid;
- var newsec = document.getElementById( this.secid );
- if ( oldsecid != this.secid ) {
- var ul = document.getElementById( 'preftoc' );
- document.getElementById( oldsecid ).style.display = 'none';
- newsec.style.display = 'block';
- ul.selectedid = this.secid;
- var lis = ul.getElementsByTagName( 'li' );
- for ( var i = 0; i< lis.length; i++ ) {
- lis[i].className = '';
- }
- this.parentNode.className = 'selected';
- }
- return false;
-}
-
// Timezone stuff
// tz in format [+-]HHMM
-function checkTimezone( tz, msg ) {
+window.checkTimezone = function( tz, msg ) {
var localclock = new Date();
// returns negative offset from GMT in minutes
var tzRaw = localclock.getTimezoneOffset();
@@ -89,11 +11,11 @@ function checkTimezone( tz, msg ) {
var junk = msg.split('$1');
document.write( junk[0] + 'UTC' + tzString + junk[1] );
}
-}
+};
-function timezoneSetup() {
- var tzSelect = document.getElementById( 'mw-input-timecorrection' );
- var tzTextbox = document.getElementById( 'mw-input-timecorrection-other' );
+window.timezoneSetup = function() {
+ var tzSelect = document.getElementById( 'mw-input-wptimecorrection' );
+ var tzTextbox = document.getElementById( 'mw-input-wptimecorrection-other' );
if ( tzSelect && tzTextbox ) {
addHandler( tzSelect, 'change', function( e ) { updateTimezoneSelection( false ); } );
@@ -101,11 +23,11 @@ function timezoneSetup() {
}
updateTimezoneSelection( false );
-}
+};
// in [-]HH:MM format...
// won't yet work with non-even tzs
-function fetchTimezone() {
+window.fetchTimezone = function() {
// FIXME: work around Safari bug
var localclock = new Date();
// returns negative offset from GMT in minutes
@@ -115,26 +37,26 @@ function fetchTimezone() {
var tzString = ( ( tzRaw >= 0 ) ? '-' : '' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
return tzString;
-}
+};
-function guessTimezone() {
- var textbox = document.getElementById( 'mw-input-timecorrection-other' );
- var selector = document.getElementById( 'mw-input-timecorrection' );
+window.guessTimezone = function() {
+ var textbox = document.getElementById( 'mw-input-wptimecorrection-other' );
+ var selector = document.getElementById( 'mw-input-wptimecorrection' );
selector.value = 'other';
textbox.value = fetchTimezone();
textbox.disabled = false; // The changed handler doesn't trip, obviously.
updateTimezoneSelection( true );
-}
+};
-function updateTimezoneSelection( force_offset ) {
- var selector = document.getElementById( 'mw-input-timecorrection' );
+window.updateTimezoneSelection = function( force_offset ) {
+ var selector = document.getElementById( 'mw-input-wptimecorrection' );
if ( selector.value == 'guess' ) {
return guessTimezone();
}
- var textbox = document.getElementById( 'mw-input-timecorrection-other' );
+ var textbox = document.getElementById( 'mw-input-wptimecorrection-other' );
var localtimeHolder = document.getElementById( 'wpLocalTime' );
var servertime = document.getElementsByName( 'wpServerTime' )[0].value;
var minDiff = 0;
@@ -211,7 +133,6 @@ function updateTimezoneSelection( force_offset ) {
}
textbox.value = hour + ':' + min;
}
-}
+};
addOnloadHook( timezoneSetup );
-addOnloadHook( tabbedprefs );
diff --git a/skins/common/preview.js b/skins/common/preview.js
index db5633d0..234dd545 100644
--- a/skins/common/preview.js
+++ b/skins/common/preview.js
@@ -1,53 +1,128 @@
/**
* Live preview script for MediaWiki
*/
+(function( $ ) {
+ window.doLivePreview = function( e ) {
+ e.preventDefault();
-function doLivePreview( e ) {
- e.preventDefault();
- var previewText = $j('#wpTextbox1').val();
+ $( mw ).trigger( 'LivePreviewPrepare' );
- var editToken = $j( '[name="wpEditToken"]' ).attr( 'value' );
- var editTime = $j( '[name="wpEdittime"]' ).attr( 'value' );
- var startTime = $j( '[name="wpStarttime"]' ).attr( 'value' );
-
- var postData = { 'action' : 'submit', 'wpTextbox1' : previewText, 'wpPreview' : true,
- 'wpEditToken' : editToken, 'wpEdittime': editTime, 'wpStarttime': startTime, 'title' : wgPageName };
+ var postData = $('#editform').formToArray();
+ postData.push( { 'name' : 'wpPreview', 'value' : '1' } );
+
+ // Hide active diff, used templates, old preview if shown
+ var copyElements = ['#wikiPreview', '.templatesUsed', '.hiddencats',
+ '#catlinks'];
+ var copySelector = copyElements.join(',');
- // Hide active diff, used templates, old preview if shown
- var copyElements = ['#wikiPreview', '.templatesUsed', '.hiddencats',
- '#catlinks'];
- var copySelector = copyElements.join(',');
+ $.each( copyElements, function(k,v) { $(v).fadeOut('fast'); } );
- $j.each( copyElements, function(k,v) { $j(v).fadeOut('fast'); } );
+ // Display a loading graphic
+ var loadSpinner = $('<div class="mw-ajax-loader"/>');
+ $('#wikiPreview').before( loadSpinner );
+
+ var page = $('<div/>');
+ var target = $('#editform').attr('action');
- // Display a loading graphic
- var loadSpinner = $j('<div class="mw-ajax-loader"/>');
- $j('#wikiPreview').before( loadSpinner );
+ if ( !target ) {
+ target = window.location.href;
+ }
- var page = $j('<div/>');
- page.load( wgScript+'?action=submit '+copySelector,
- postData,
- function() {
+ page.load( target + ' ' + copySelector, postData,
+ function() {
+
+ for( var i=0; i<copyElements.length; ++i) {
+ // For all the specified elements, find the elements in the loaded page
+ // and the real page, empty the element in the real page, and fill it
+ // with the content of the loaded page
+ var copyContent = page.find( copyElements[i] ).contents();
+ $(copyElements[i]).empty().append( copyContent );
+ var newClasses = page.find( copyElements[i] ).attr('class');
+ $(copyElements[i]).attr( 'class', newClasses );
+ }
- for( var i=0; i<copyElements.length; ++i) {
- // For all the specified elements, find the elements in the loaded page
- // and the real page, empty the element in the real page, and fill it
- // with the content of the loaded page
- var copyContent = page.find( copyElements[i] ).contents();
- $j(copyElements[i]).empty().append( copyContent );
- var newClasses = page.find( copyElements[i] ).attr('class');
- $j(copyElements[i]).attr( 'class', newClasses );
- }
+ $.each( copyElements, function(k,v) {
+ // Don't belligerently show elements that are supposed to be hidden
+ $(v).fadeIn( 'fast', function() { $(this).css('display', ''); } );
+ } );
- $j.each( copyElements, function(k,v) {
- // Don't belligerently show elements that are supposed to be hidden
- $j(v).fadeIn( 'fast', function() { $j(this).css('display', ''); } );
+ loadSpinner.remove();
+
+ $( mw ).trigger( 'LivePreviewDone', [copyElements] );
} );
-
- loadSpinner.remove();
- } );
-}
+ };
+
+ // Shamelessly stolen from the jQuery form plugin, which is licensed under the GPL.
+ // http://jquery.malsup.com/form/#download
+ $.fn.formToArray = function() {
+ var a = [];
+ if (this.length == 0) return a;
+
+ var form = this[0];
+ var els = form.elements;
+ if (!els) return a;
+ for(var i=0, max=els.length; i < max; i++) {
+ var el = els[i];
+ var n = el.name;
+ if (!n) continue;
+
+ var v = $.fieldValue(el, true);
+ if (v && v.constructor == Array) {
+ for(var j=0, jmax=v.length; j < jmax; j++)
+ a.push({name: n, value: v[j]});
+ }
+ else if (v !== null && typeof v != 'undefined')
+ a.push({name: n, value: v});
+ }
+
+ if (form.clk) {
+ // input type=='image' are not found in elements array! handle it here
+ var $input = $(form.clk), input = $input[0], n = input.name;
+ if (n && !input.disabled && input.type == 'image') {
+ a.push({name: n, value: $input.val()});
+ a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+ }
+ }
+ return a;
+ };
+
+ /**
+ * Returns the value of the field element.
+ */
+ $.fieldValue = function(el, successful) {
+ var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+ if (typeof successful == 'undefined') successful = true;
+
+ if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+ (t == 'checkbox' || t == 'radio') && !el.checked ||
+ (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+ tag == 'select' && el.selectedIndex == -1))
+ return null;
+
+ if (tag == 'select') {
+ var index = el.selectedIndex;
+ if (index < 0) return null;
+ var a = [], ops = el.options;
+ var one = (t == 'select-one');
+ var max = (one ? index+1 : ops.length);
+ for(var i=(one ? index : 0); i < max; i++) {
+ var op = ops[i];
+ if (op.selected) {
+ var v = op.value;
+ if (!v) // extra pain for IE...
+ v = (op.attributes && op.attributes['value'] &&
+ !(op.attributes['value'].specified))
+ ? op.text : op.value;
+ if (one) return v;
+ a.push(v);
+ }
+ }
+ return a;
+ }
+ return el.value;
+ };
-$j(document).ready( function() {
- $j('#wpPreview').click( doLivePreview );
-} );
+ $(document).ready( function() {
+ $('#wpPreview').click( doLivePreview );
+ } );
+}) ( jQuery );
diff --git a/skins/common/protect.js b/skins/common/protect.js
index e037f08a..a284c3f8 100644
--- a/skins/common/protect.js
+++ b/skins/common/protect.js
@@ -1,12 +1,12 @@
-var ProtectionForm = {
+window.ProtectionForm = {
'existingMatch': false,
/**
* Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
* on the protection form
*
- * @param Object opts : parameters with members:
+ * @param opts Object : parameters with members:
* tableId Identifier of the table containing UI bits
* labelText Text to use for the checkbox label
* numTypes The number of protection types
@@ -20,7 +20,7 @@ var ProtectionForm = {
if( !box )
return false;
- var boxbody = box.getElementsByTagName('tbody')[0]
+ var boxbody = box.getElementsByTagName('tbody')[0];
var row = document.createElement( 'tr' );
boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
@@ -76,7 +76,7 @@ var ProtectionForm = {
/**
* Is this protection level cascadeable?
- * @param String level
+ * @param level String
*
* @return boolean
*
@@ -94,7 +94,7 @@ var ProtectionForm = {
* When protection levels are locked together, update the rest
* when one action's level changes
*
- * @param Element source Level selector that changed
+ * @param source Element Level selector that changed
*/
'updateLevels': function(source) {
if( !this.isUnchained() )
@@ -106,7 +106,7 @@ var ProtectionForm = {
* When protection levels are locked together, update the
* expiries when one changes
*
- * @param Element source expiry input that changed
+ * @param source Element expiry input that changed
*/
'updateExpiry': function(source) {
@@ -133,7 +133,7 @@ var ProtectionForm = {
* When protection levels are locked together, update the
* expiry lists when one changes and clear the custom inputs
*
- * @param Element source expiry selector that changed
+ * @param source Element expiry selector that changed
*/
'updateExpiryList': function(source) {
if( !this.isUnchained() ) {
@@ -221,7 +221,7 @@ var ProtectionForm = {
/**
* Protect all actions at the specified level
*
- * @param int index Protection level
+ * @param index int Protection level
*/
'setAllSelectors': function(index) {
this.forEachLevelSelector(function(element) {
@@ -234,7 +234,7 @@ var ProtectionForm = {
/**
* Apply a callback to each protection selector
*
- * @param callable func Callback function
+ * @param func callable Callback function
*/
'forEachLevelSelector': function(func) {
var selectors = this.getLevelSelectors();
@@ -263,7 +263,7 @@ var ProtectionForm = {
/**
* Apply a callback to each expiry input
*
- * @param callable func Callback function
+ * @param func callable Callback function
*/
'forEachExpiryInput': function(func) {
var inputs = this.getExpiryInputs();
@@ -291,7 +291,7 @@ var ProtectionForm = {
/**
* Apply a callback to each expiry selector list
- * @param callable func Callback function
+ * @param func callable Callback function
*/
'forEachExpirySelector': function(func) {
var inputs = this.getExpirySelectors();
@@ -320,7 +320,7 @@ var ProtectionForm = {
/**
* Enable/disable protection selectors and expiry inputs
*
- * @param boolean val Enable?
+ * @param val boolean Enable?
*/
'enableUnchainedInputs': function(val) {
var first = true;
@@ -348,4 +348,4 @@ var ProtectionForm = {
}
});
}
-}
+};
diff --git a/skins/common/quickbar-right.css b/skins/common/quickbar-right.css
deleted file mode 100644
index 43bd427a..00000000
--- a/skins/common/quickbar-right.css
+++ /dev/null
@@ -1 +0,0 @@
-#quickbar { position: fixed; right: 0px; top: 0px; padding: 4px;}
diff --git a/skins/common/quickbar.css b/skins/common/quickbar.css
deleted file mode 100644
index d7930c2a..00000000
--- a/skins/common/quickbar.css
+++ /dev/null
@@ -1 +0,0 @@
-#quickbar { position: fixed; padding: 4px; }
diff --git a/skins/common/rightclickedit.js b/skins/common/rightclickedit.js
deleted file mode 100644
index 83d552a2..00000000
--- a/skins/common/rightclickedit.js
+++ /dev/null
@@ -1,48 +0,0 @@
-function setupRightClickEdit() {
- if (document.getElementsByTagName) {
- var spans = document.getElementsByTagName('span');
- for (var i = 0; i < spans.length; i++) {
- var el = spans[i];
- if(el.className == 'editsection') {
- addRightClickEditHandler(el);
- }
- }
- }
-}
-
-function addRightClickEditHandler(el) {
- for (var i = 0; i < el.childNodes.length; i++) {
- var link = el.childNodes[i];
- if (link.nodeType == 1 && link.nodeName.toLowerCase() == 'a') {
- var editHref = link.getAttribute('href');
- // find the enclosing (parent) header
- var prev = el.parentNode;
- if (prev && prev.nodeType == 1 &&
- prev.nodeName.match(/^[Hh][1-6]$/)) {
- prev.oncontextmenu = function(e) {
- if (!e) { e = window.event; }
- // e is now the event in all browsers
- var targ;
- if (e.target) { targ = e.target; }
- else if (e.srcElement) { targ = e.srcElement; }
- if (targ.nodeType == 3) { // defeat Safari bug
- targ = targ.parentNode;
- }
- // targ is now the target element
-
- // We don't want to deprive the noble reader of a context menu
- // for the section edit link, do we? (Might want to extend this
- // to all <a>'s?)
- if (targ.nodeName.toLowerCase() != 'a'
- || targ.parentNode.className != 'editsection') {
- document.location = editHref;
- return false;
- }
- return true;
- };
- }
- }
- }
-}
-
-hookEvent("load", setupRightClickEdit);
diff --git a/skins/common/search.css b/skins/common/search.css
new file mode 100644
index 00000000..22c3ca4a
--- /dev/null
+++ b/skins/common/search.css
@@ -0,0 +1,14 @@
+/**
+ * Fixes sister projects box moving down the extract
+ * of the first result (bug #16886).
+ * It only happens when the window is small and
+ * This changes slightly the layout for big screens
+ * where there was space for the extracts and the
+ * sister projects and thus it showed like in any
+ * other browser.
+ *
+ * This will only affect IE 7 and lower
+ */
+html > body .searchresult {
+ display: inline;
+}
diff --git a/skins/common/search.js b/skins/common/search.js
index ff114291..26d807db 100644
--- a/skins/common/search.js
+++ b/skins/common/search.js
@@ -1,7 +1,7 @@
// JS specific to Special:Search
// change the search link to what user entered
-function mwSearchHeaderClick( obj ) {
+window.mwSearchHeaderClick = function( obj ) {
var searchbox = document.getElementById( 'searchText' );
if( searchbox === null ) {
searchbox = document.getElementById( 'powerSearchText' );
@@ -11,7 +11,7 @@ function mwSearchHeaderClick( obj ) {
}
var searchterm = searchbox.value;
- var parts = obj.href.split( 'search=' );
+ var parts = obj.getAttribute( 'href', 2).split( 'search=' );
var lastpart = '';
var prefix = 'search=';
if( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
@@ -20,9 +20,9 @@ function mwSearchHeaderClick( obj ) {
prefix = '&search=';
}
obj.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
-}
+};
-function mwToggleSearchCheckboxes( btn ) {
+window.mwToggleSearchCheckboxes = function( btn ) {
if( !document.getElementById ) {
return;
}
@@ -47,4 +47,4 @@ function mwToggleSearchCheckboxes( btn ) {
}
}
}
-}
+};
diff --git a/skins/common/shared.css b/skins/common/shared.css
index 674d3626..00032b3f 100644
--- a/skins/common/shared.css
+++ b/skins/common/shared.css
@@ -4,11 +4,21 @@
* another, but don't ignore the poor non-Monobook users either.
*/
+/* Default style for semantic tags */
+abbr, acronym, .explain {
+ border-bottom: 1px dotted black;
+ cursor: help;
+}
+
/* Colored watchlist and recent changes numbers */
.mw-plusminus-pos { color: #006400; } /* dark green */
.mw-plusminus-neg { color: #8b0000; } /* dark red */
.mw-plusminus-null { color: #aaa; } /* gray */
+/* Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
+ [[Special:Watchlist/edit]] and in category listings */
+.allpagesredirect, .redirect-in-category, .watchlistredir { font-style: italic; }
+
/* Comment and username portions of RC entries */
span.comment {
font-style: italic;
@@ -19,7 +29,10 @@ span.changedby {
}
/* Math */
-.texvc { direction: ltr; unicode-bidi: embed; }
+.texvc {
+ direction: ltr;
+ unicode-bidi: embed;
+}
img.tex { vertical-align: middle; }
span.texhtml { font-family: serif; }
@@ -28,7 +41,9 @@ span.texhtml { font-family: serif; }
#wikiPreview.ontop { margin-bottom: 1em; }
/* Stop floats from intruding into edit area in previews */
-#editform, #toolbar, #wpTextbox1 { clear: both; }
+#editform, #toolbar, #wpTextbox1 {
+ clear: both;
+}
div#mw-js-message {
margin: 1em 5%;
@@ -52,14 +67,14 @@ h2#filehistory {
table.filehistory th,
table.filehistory td {
- vertical-align:top;
+ vertical-align: top;
}
table.filehistory th {
text-align: left;
}
table.filehistory td.mw-imagepage-filesize,
table.filehistory th.mw-imagepage-filesize {
- white-space:nowrap;
+ white-space: nowrap;
}
table.filehistory td.filehistory-selected {
@@ -95,28 +110,32 @@ div.patrollink {
/**
* Forms
*/
-body.ltr td.mw-label { text-align: right; }
-body.ltr td.mw-input { text-align: left; }
-body.ltr td.mw-submit { text-align: left; }
-body.rtl td.mw-label { text-align: left; }
-body.rtl td.mw-input { text-align: right; }
-body.rtl td.mw-submit { text-align: right; }
+td.mw-label { text-align: right; }
+td.mw-input { text-align: left; }
+td.mw-submit { text-align: left; }
td.mw-label { vertical-align: top; }
.prefsection td.mw-label { width: 20%; }
.prefsection table { width: 100%; }
td.mw-submit { white-space: nowrap; }
-table.mw-htmlform-nolabel td.mw-label { width: 0 !important; }
+table.mw-htmlform-nolabel td.mw-label {
+ width: 0 !important;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+ text-align: left !important;
+}
+
+input#wpSummary {
+ width: 80%;
+}
/**
* Image captions
*/
-body.rtl .thumbcaption { text-align:right; }
-body.rtl .magnify { float:left; }
-
-body.ltr .thumbcaption { text-align:left; }
-body.ltr .magnify { float:right; }
+.thumbcaption { text-align: left; }
+.magnify { float: right; }
/**
* Hidden categories
@@ -144,7 +163,7 @@ p.mw-revdel-editreasons {
div.searchresult {
font-size: 95%;
- width:38em;
+ width: 38em;
}
.mw-search-results {
@@ -153,8 +172,8 @@ div.searchresult {
.mw-search-results li {
padding-bottom: 1em;
- list-style:none;
- list-style-image:none;
+ list-style: none;
+ list-style-image: none;
}
.mw-search-results li a {
font-size: 108%;
@@ -171,12 +190,9 @@ div.searchresult {
border: 1px solid silver;
}
.mw-search-formheader div.search-types {
- float:left;
+ float: left;
padding-left: 0.25em;
}
-.rtl .mw-search-formheader div.search-types {
- float: right;
-}
.mw-search-formheader div.search-types ul {
margin: 0 !important;
padding: 0 !important;
@@ -232,15 +248,9 @@ fieldset#mw-searchoptions h4 {
margin: 0;
float: left;
}
-.rtl fieldset#mw-searchoptions h4 {
- float: right;
-}
fieldset#mw-searchoptions div#mw-search-togglebox {
float: right;
}
-.rtl fieldset#mw-searchoptions div#mw-search-togglebox {
- float: left;
-}
fieldset#mw-searchoptions div#mw-search-togglebox label {
margin-right: 0.25em;
@@ -255,15 +265,6 @@ fieldset#mw-searchoptions table {
fieldset#mw-searchoptions table td {
padding-right: 1em;
}
-.rtl fieldset#mw-searchoptions table td {
- padding-left: 1em;
- padding-right: 0;
-}
-body.rtl fieldset#mw-searchoptions table {
- margin-right: 0;
- margin-left: 3em;
- float: right;
-}
fieldset#mw-searchoptions div.divider {
clear: both;
border-bottom: 1px solid #DDDDDD;
@@ -285,10 +286,6 @@ div#mw-search-interwiki {
margin-top: 2ex;
}
-.rtl div#mw-search-interwiki {
- float: left;
-}
-
div#mw-search-interwiki li {
font-size: 95%;
}
@@ -298,10 +295,6 @@ div#mw-search-interwiki li {
font-size: 90%;
}
-.rtl .mw-search-interwiki-more {
- float: left;
-}
-
div#mw-search-interwiki-caption {
text-align: center;
font-weight: bold;
@@ -315,12 +308,8 @@ div#mw-search-interwiki-caption {
padding-right: 0.15em;
padding-bottom: 0.2em;
padding-top: 0.15em;
- background-color:#ececec;
- border-top:1px solid #BBBBBB;
-}
-
-.rtl .mw-search-interwiki-project {
- text-align: right;
+ background-color: #ececec;
+ border-top: 1px solid #BBBBBB;
}
span.searchalttitle {
@@ -342,28 +331,22 @@ div.searchdidyoumean em {
font-weight: bold;
}
-table#mw-search-top-table {
- background-color: transparent;
-}
-
/*
* Advanced PowerSearch box
*/
-
td#mw-search-togglebox {
- text-align: right;
+ text-align: right;
}
table#mw-search-powertable {
- width:100%;
+ width: 100%;
}
form#powersearch {
clear: both;
}
-
/*
* UserRights stuff
*/
@@ -439,14 +422,18 @@ table.os-suggest-results {
/* the auto-generated edit comments */
.autocomment { color: gray; }
#pagehistory .history-user {
- margin-left: 0.4em;
- margin-right: 0.2em;
+ margin-left: 0.4em;
+ margin-right: 0.2em;
+}
+#pagehistory span.minor {
+ font-weight: bold;
+}
+#pagehistory li {
+ border: 1px solid white;
}
-#pagehistory span.minor { font-weight: bold; }
-#pagehistory li { border: 1px solid white; }
#pagehistory li.selected {
- background-color: #f9f9f9;
- border: 1px dashed #aaa;
+ background-color: #f9f9f9;
+ border: 1px dashed #aaa;
}
/** Generic minor/bot/newpage styling */
@@ -460,10 +447,12 @@ table.os-suggest-results {
}
/* Special:ListGroupRights styling */
-table.mw-listgrouprights-table tr {
+table.mw-listgrouprights-table tr {
vertical-align: top;
}
-.listgrouprights-revoked { text-decoration: line-through; }
+.listgrouprights-revoked {
+ text-decoration: line-through;
+}
/* Special:Statistics styling */
td.mw-statistics-numbers {
@@ -493,11 +482,7 @@ td#mw-emailuser-sender, td#mw-emailuser-recipient {
}
/* Special:Allpages styling */
-table.allpageslist {
- background-color: transparent;
-}
table.mw-allpages-table-form, table.mw-allpages-table-chunk {
- background-color: transparent;
width: 100%;
}
td.mw-allpages-alphaindexline {
@@ -508,7 +493,7 @@ td.mw-allpages-nav, p.mw-allpages-nav {
font-size: smaller;
margin-bottom: 1em;
}
-table.mw-allpages-table-form tr {
+table.mw-allpages-table-form tr {
vertical-align: top;
}
@@ -516,9 +501,8 @@ table.mw-allpages-table-form tr {
table#mw-prefixindex-list-table,
table#mw-prefixindex-nav-table {
width: 98%;
- background-color: transparent;
}
-td#mw-prefixindex-nav-form {
+td#mw-prefixindex-nav-form {
font-size: smaller;
margin-bottom: 1em;
text-align: right;
@@ -558,34 +542,38 @@ td.mw-revdel-checkbox, th.mw-revdel-checkbox {
/* feed links */
a.feedlink {
+ /* @embed */
background: url("images/feed-icon.png") center left no-repeat;
padding-left: 16px;
}
-/* Plainlinks - this can be used to switch
+/* Plainlinks - this can be used to switch
* off special external link styling */
.plainlinks a {
- background: none !important;
- padding: 0 !important;
+ background: none !important;
+ padding: 0 !important;
}
-/* wikitable class for skinning normal tables */
+/* wikitable class for skinning normal tables
+ * keep on sync with commonPrint.css
+ */
table.wikitable {
- margin: 1em 1em 1em 0;
- background: #f9f9f9;
- border: 1px #aaa solid;
- border-collapse: collapse;
+ margin: 1em 1em 1em 0;
+ background: #f9f9f9;
+ border: 1px #aaa solid;
+ border-collapse: collapse;
+ color: black;
}
.wikitable th, .wikitable td {
- border: 1px #aaa solid;
- padding: 0.2em;
+ border: 1px #aaa solid;
+ padding: 0.2em;
}
.wikitable th {
- background: #f2f2f2;
- text-align: center;
+ background: #f2f2f2;
+ text-align: center;
}
.wikitable caption {
- font-weight: bold;
+ font-weight: bold;
}
/* hide initially collapsed collapsable tables */
@@ -626,6 +614,17 @@ table.collapsed tr.collapsable {
border: none;
}
+/* Note on preview page */
+.previewnote {
+ color: #c00;
+ margin-bottom: 1em;
+}
+
+.previewnote p {
+ text-indent: 3em;
+ margin: 0.8em 0;
+}
+
.visualClear {
clear: both;
}
@@ -637,28 +636,46 @@ table.collapsed tr.collapsable {
}
/*
- Table pager (e.g. Special:Imagelist)
- - remove underlines from the navigation link
- - collapse borders
- - set the borders to outsets (similar to Special:Allmessages)
- - remove line wrapping for all td and th, set background color
- - restore line wrapping for the last two table cells (description and size)
+ Table pager (e.g. Special:ListFiles)
+ - remove underlines from the navigation link
+ - collapse borders
+ - set the borders to outsets (similar to Special:AllMessages)
+ - remove line wrapping for all td and th, set background color
+ - restore line wrapping for the last two table cells (description and size)
*/
-.TablePager { min-width: 80%; }
-.TablePager_nav a { text-decoration: none; }
-.TablePager { border-collapse: collapse; }
-.TablePager, .TablePager td, .TablePager th {
+.TablePager {
+ min-width: 80%;
+ border-collapse: collapse;
+}
+.TablePager_nav a {
+ text-decoration: none;
+}
+.TablePager, .TablePager td, .TablePager th {
border: 1px solid #aaaaaa;
padding: 0 0.15em 0 0.15em;
}
-.TablePager th { background-color: #eeeeff }
-.TablePager td { background-color: #ffffff }
-.TablePager tr:hover td { background-color: #eeeeff }
+.TablePager th {
+ background-color: #eeeeff;
+}
+.TablePager td {
+ background-color: #ffffff;
+}
+.TablePager tr:hover td {
+ background-color: #eeeeff;
+}
-.imagelist td, .imagelist th { white-space: nowrap }
-.imagelist .TablePager_col_links { background-color: #eeeeff }
-.imagelist .TablePager_col_img_description { white-space: normal }
-.imagelist th.TablePager_sort { background-color: #ccccff }
+.imagelist td, .imagelist th {
+ white-space: nowrap;
+}
+.imagelist .TablePager_col_links {
+ background-color: #eeeeff;
+}
+.imagelist .TablePager_col_img_description {
+ white-space: normal;
+}
+.imagelist th.TablePager_sort {
+ background-color: #ccccff;
+}
/* Allmessages table */
#mw-allmessagestable .allmessages-customised td.am_default {
@@ -736,31 +753,35 @@ table.mw_metadata td {
}
/* Galleries */
-table.gallery {
- border: 1px solid #ccc;
- margin: 2px;
- padding: 2px;
- background-color: white;
-}
-
-table.gallery tr {
- vertical-align: top;
-}
-
-table.gallery td {
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update commonPrint.css */
+li.gallerybox {
vertical-align: top;
background-color: #f9f9f9;
border: solid 2px white;
+ display: -moz-inline-box;
}
-table.gallery caption {
- font-weight: bold;
+
+ul.gallery, li.gallerybox {
+ display: inline-block;
+ zoom: 1;
+ *display: inline;
}
-div.gallerybox {
+ul.gallery {
margin: 2px;
+ padding: 2px;
+ display: block;
}
-div.gallerybox div.thumb {
+li.gallerycaption {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
text-align: center;
border: 1px solid #ccc;
margin: 2px;
@@ -770,6 +791,7 @@ div.gallerytext {
overflow: hidden;
font-size: 94%;
padding: 2px 4px;
+ word-wrap: break-word;
}
table.mw-enhanced-rc {
@@ -788,27 +810,30 @@ td.mw-enhanced-rc {
display: inline;
margin-left: 1em;
}
-
+
#mw-addcategory-prompt input {
margin-left: 0.5em;
margin-right: 0.5em;
}
-
+
.mw-remove-category {
padding: 8px;
+ /* @embed */
background-image: url(images/remove.png);
background-position: center center;
background-repeat: no-repeat;
}
-
+
.mw-ajax-addcategory {
padding-left: 20px;
+ /* @embed */
background-image: url(images/add.png);
background-position: left center;
background-repeat: no-repeat;
}
.mw-ajax-loader {
+ /* @embed */
background-image: url(images/ajax-loader.gif);
background-position: center center;
background-repeat: no-repeat;
@@ -820,6 +845,7 @@ td.mw-enhanced-rc {
.mw-small-spinner {
padding: 10px !important;
margin-right: 0.6em;
+ /* @embed */
background-image: url(images/spinner.gif);
background-position: center center;
background-repeat: no-repeat;
@@ -829,3 +855,58 @@ td.mw-enhanced-rc {
a.sortheader {
margin: 0 0.3em;
}
+
+/* Localised ordered list numbering for some languages */
+ol:lang(bcc) li,
+ol:lang(bqi) li,
+ol:lang(fa) li,
+ol:lang(glk) li,
+ol:lang(kk-arab) li,
+ol:lang(mzn) li {
+ list-style-type: -moz-persian;
+ list-style-type: persian;
+}
+
+ol:lang(ckb) li {
+ list-style-type: -moz-arabic-indic;
+ list-style-type: arabic-indic;
+}
+
+ol:lang(bn) li {
+ list-style-type: -moz-bengali;
+ list-style-type: bengali;
+}
+
+/* tooltip styles */
+.mw-help-field-hint {
+ display: none;
+ padding: 0px;
+ padding-left: 15px;
+ margin-left: 2px;
+ margin-bottom: -8px;
+ /* @embed */
+ background-image: url('images/help-question.gif');
+ background-position: left center;
+ background-repeat: no-repeat;
+ color: #0645ad;
+ text-decoration: underline;
+ cursor: pointer;
+ font-size: .8em;
+}
+.mw-help-field-hint:hover {
+ /* @embed */
+ background-image: url('images/help-question-hover.gif');
+}
+.mw-help-field-data {
+ display: block;
+ background-color: #d6f3ff;
+ padding:5px 8px 4px 8px;
+ border: 1px solid #5dc9f4;
+ margin-left: 20px;
+}
+.tipsy { padding: 5px 5px 10px; font-size: 12px; position: absolute; z-index: 100000; overflow: visible; }
+.tipsy-inner { padding: 5px 8px 4px 8px; background-color: #d6f3ff; color: black; border: 1px solid #5dc9f4; max-width: 300px; text-align: left; }
+.tipsy-arrow { position: absolute; /* @embed */ background: url( 'images/tipsy-arrow.gif' ) no-repeat top left; width: 13px; height: 13px; }
+.tipsy-se .tipsy-arrow { bottom: -2px; right: 10px; background-position: 0% 100%; }
+
+
diff --git a/skins/common/upload.js b/skins/common/upload.js
index f40f62e6..c877620b 100644
--- a/skins/common/upload.js
+++ b/skins/common/upload.js
@@ -1,4 +1,4 @@
-function licenseSelectorCheck() {
+window.licenseSelectorCheck = function() {
var selector = document.getElementById( "wpLicense" );
var selection = selector.options[selector.selectedIndex].value;
if( selector.selectedIndex > 0 ) {
@@ -9,11 +9,11 @@ function licenseSelectorCheck() {
}
// We might show a preview
wgUploadLicenseObj.fetchPreview( selection );
-}
+};
-function wgUploadSetup() {
+window.wgUploadSetup = function() {
// Disable URL box if the URL copy upload source type is not selected
- var e = document.getElementById( 'wpSourceTypeURL' );
+ var e = document.getElementById( 'wpSourceTypeurl' );
if( e ) {
if( !e.checked ) {
var ein = document.getElementById( 'wpUploadFileURL' );
@@ -59,12 +59,12 @@ function wgUploadSetup() {
row.appendChild( td );
}
- if ( wgAjaxLicensePreview ) {
+ var wpLicense = document.getElementById( 'wpLicense' );
+ if ( wgAjaxLicensePreview && wpLicense ) {
// License selector check
- document.getElementById( 'wpLicense' ).onchange = licenseSelectorCheck;
+ wpLicense.onchange = licenseSelectorCheck;
// License selector table row
- var wpLicense = document.getElementById( 'wpLicense' );
var wpLicenseRow = wpLicense.parentNode.parentNode;
var wpLicenseTbody = wpLicenseRow.parentNode;
@@ -84,15 +84,14 @@ function wgUploadSetup() {
document.getElementById( wgUploadSourceIds[i] ).onchange = function (e) {
fillDestFilename( this.id );
};
-}
+};
/**
* Iterate over all upload source fields and disable all except the selected one.
*
- * @param enabledId The id of the selected radio button
* @return emptiness
*/
-function toggleUploadInputs() {
+window.toggleUploadInputs = function() {
// Iterate over all rows with UploadSourceField
var rows;
if ( document.getElementsByClassName ) {
@@ -124,9 +123,9 @@ function toggleUploadInputs() {
inputs[j].disabled = !isChecked;
}
}
-}
+};
-var wgUploadWarningObj = {
+window.wgUploadWarningObj = {
'responseCache' : { '' : '&nbsp;' },
'nameToCheck' : '',
'typing': false,
@@ -210,9 +209,9 @@ var wgUploadWarningObj = {
element.innerHTML = text;
}
}
-}
+};
-function fillDestFilename(id) {
+window.fillDestFilename = function(id) {
if (!wgUploadAutoFill) {
return;
}
@@ -242,7 +241,7 @@ function fillDestFilename(id) {
// Clear the filename if it does not have a valid extension.
// URLs are less likely to have a useful extension, so don't include them in the
// extension check.
- if( wgFileExtensions && id != 'wpUploadFileURL' ) {
+ if( wgStrictFileExtensions && wgFileExtensions && id != 'wpUploadFileURL' ) {
var found = false;
if( fname.lastIndexOf( '.' ) != -1 ) {
var ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
@@ -264,16 +263,19 @@ function fillDestFilename(id) {
if( e ) e.className = 'error';
// Clear wpDestFile as well
- var e = document.getElementById( 'wpDestFile' )
+ var e = document.getElementById( 'wpDestFile' );
if( e ) e.value = '';
return false;
}
}
- // Capitalise first letter and replace spaces by underscores
- // FIXME: $wgCapitalizedNamespaces
- fname = fname.charAt(0).toUpperCase().concat(fname.substring(1,10000)).replace(/ /g, '_');
+ // Replace spaces by underscores
+ fname = fname.replace( / /g, '_' );
+ // Capitalise first letter if needed
+ if ( wgCapitalizeUploads ) {
+ fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1, 10000 ) );
+ }
// Output result
var destFile = document.getElementById('wpDestFile');
@@ -281,9 +283,9 @@ function fillDestFilename(id) {
destFile.value = fname;
wgUploadWarningObj.checkNow(fname) ;
}
-}
+};
-function toggleFilenameFiller() {
+window.toggleFilenameFiller = function() {
if(!document.getElementById) return;
var upfield = document.getElementById('wpUploadFile');
var destName = document.getElementById('wpDestFile').value;
@@ -292,9 +294,9 @@ function toggleFilenameFiller() {
} else {
wgUploadAutoFill = false;
}
-}
+};
-var wgUploadLicenseObj = {
+window.wgUploadLicenseObj = {
'responseCache' : { '' : '' },
@@ -338,6 +340,6 @@ var wgUploadLicenseObj = {
previewPanel.innerHTML = preview;
}
-}
+};
addOnloadHook( wgUploadSetup );
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
index 94f23a9c..fcf2713e 100644
--- a/skins/common/wikibits.js
+++ b/skins/common/wikibits.js
@@ -1,34 +1,46 @@
// MediaWiki JavaScript support functions
-var clientPC = navigator.userAgent.toLowerCase(); // Get client info
-var is_gecko = /gecko/.test( clientPC ) &&
+window.clientPC = navigator.userAgent.toLowerCase(); // Get client info
+window.is_gecko = /gecko/.test( clientPC ) &&
!/khtml|spoofer|netscape\/7\.0/.test(clientPC);
-var webkit_match = clientPC.match(/applewebkit\/(\d+)/);
+
+window.is_safari = window.is_safari_win = window.webkit_version =
+ window.is_chrome = window.is_chrome_mac = false;
+window.webkit_match = clientPC.match(/applewebkit\/(\d+)/);
if (webkit_match) {
- var is_safari = clientPC.indexOf('applewebkit') != -1 &&
+ window.is_safari = clientPC.indexOf('applewebkit') != -1 &&
clientPC.indexOf('spoofer') == -1;
- var is_safari_win = is_safari && clientPC.indexOf('windows') != -1;
- var webkit_version = parseInt(webkit_match[1]);
+ window.is_safari_win = is_safari && clientPC.indexOf('windows') != -1;
+ window.webkit_version = parseInt(webkit_match[1]);
+ // Tests for chrome here, to avoid breaking old scripts safari left alone
+ // This is here for accesskeys
+ window.is_chrome = clientPC.indexOf('chrome') !== -1 &&
+ clientPC.indexOf('spoofer') === -1;
+ window.is_chrome_mac = is_chrome && clientPC.indexOf('mac') !== -1
}
+
// For accesskeys; note that FF3+ is included here!
-var is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC );
-var ff2_bugs = /firefox\/2/.test( clientPC );
+window.is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC );
+window.ff2_bugs = /firefox\/2/.test( clientPC );
// These aren't used here, but some custom scripts rely on them
-var is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1;
-var is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1;
+window.is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1;
+window.is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1;
+
+window.is_opera = window.is_opera_preseven = window.is_opera_95 =
+ window.opera6_bugs = window.opera7_bugs = window.opera95_bugs = false;
if (clientPC.indexOf('opera') != -1) {
- var is_opera = true;
- var is_opera_preseven = window.opera && !document.childNodes;
- var is_opera_seven = window.opera && document.childNodes;
- var is_opera_95 = /opera\/(9\.[5-9]|[1-9][0-9])/.test( clientPC );
- var opera6_bugs = is_opera_preseven;
- var opera7_bugs = is_opera_seven && !is_opera_95;
- var opera95_bugs = /opera\/(9\.5)/.test( clientPC );
+ window.is_opera = true;
+ window.is_opera_preseven = window.opera && !document.childNodes;
+ window.is_opera_seven = window.opera && document.childNodes;
+ window.is_opera_95 = /opera\/(9\.[5-9]|[1-9][0-9])/.test( clientPC );
+ window.opera6_bugs = is_opera_preseven;
+ window.opera7_bugs = is_opera_seven && !is_opera_95;
+ window.opera95_bugs = /opera\/(9\.5)/.test( clientPC );
}
// As recommended by <http://msdn.microsoft.com/en-us/library/ms537509.aspx>,
// avoiding false positives from moronic extensions that append to the IE UA
// string (bug 23171)
-var ie6_bugs = false;
+window.ie6_bugs = false;
if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null
&& parseFloat( RegExp.$1 ) <= 6.0 ) {
ie6_bugs = true;
@@ -38,35 +50,31 @@ if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null
/*extern ta, stylepath, skin */
// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
-var doneOnloadHook;
+window.doneOnloadHook = undefined;
if (!window.onloadFuncts) {
- var onloadFuncts = [];
+ window.onloadFuncts = [];
}
-function addOnloadHook( hookFunct ) {
+window.addOnloadHook = function( hookFunct ) {
// Allows add-on scripts to add onload functions
if( !doneOnloadHook ) {
onloadFuncts[onloadFuncts.length] = hookFunct;
} else {
hookFunct(); // bug in MSIE script loading
}
-}
+};
-function hookEvent( hookName, hookFunct ) {
- addHandler( window, hookName, hookFunct );
-}
-
-function importScript( page ) {
+window.importScript = function( page ) {
// TODO: might want to introduce a utility function to match wfUrlencode() in PHP
var uri = wgScript + '?title=' +
encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') +
'&action=raw&ctype=text/javascript';
return importScriptURI( uri );
-}
+};
-var loadedScripts = {}; // included-scripts tracker
-function importScriptURI( url ) {
+window.loadedScripts = {}; // included-scripts tracker
+window.importScriptURI = function( url ) {
if ( loadedScripts[url] ) {
return null;
}
@@ -76,13 +84,13 @@ function importScriptURI( url ) {
s.setAttribute( 'type', 'text/javascript' );
document.getElementsByTagName('head')[0].appendChild( s );
return s;
-}
+};
-function importStylesheet( page ) {
+window.importStylesheet = function( page ) {
return importStylesheetURI( wgScript + '?action=raw&ctype=text/css&title=' + encodeURIComponent( page.replace(/ /g,'_') ) );
-}
+};
-function importStylesheetURI( url, media ) {
+window.importStylesheetURI = function( url, media ) {
var l = document.createElement( 'link' );
l.type = 'text/css';
l.rel = 'stylesheet';
@@ -92,9 +100,9 @@ function importStylesheetURI( url, media ) {
}
document.getElementsByTagName('head')[0].appendChild( l );
return l;
-}
+};
-function appendCSS( text ) {
+window.appendCSS = function( text ) {
var s = document.createElement( 'style' );
s.type = 'text/css';
s.rel = 'stylesheet';
@@ -105,7 +113,7 @@ function appendCSS( text ) {
}
document.getElementsByTagName('head')[0].appendChild( s );
return s;
-}
+};
// Special stylesheet links for Monobook only (see bug 14717)
if ( typeof stylepath != 'undefined' && skin == 'monobook' ) {
@@ -121,14 +129,14 @@ if ( typeof stylepath != 'undefined' && skin == 'monobook' ) {
}
-if ( wgBreakFrames ) {
+if ( 'wgBreakFrames' in window && window.wgBreakFrames ) {
// Un-trap us from framesets
if ( window.top != window ) {
window.top.location = window.location;
}
}
-function showTocToggle() {
+window.showTocToggle = function() {
if ( document.createTextNode ) {
// Uses DOM calls to avoid document.write + XHTML issues
@@ -145,8 +153,10 @@ function showTocToggle() {
var toggleLink = document.createElement( 'a' );
toggleLink.id = 'togglelink';
toggleLink.className = 'internal';
- toggleLink.href = 'javascript:toggleToc()';
- toggleLink.appendChild( document.createTextNode( tocHideText ) );
+ toggleLink.href = '#';
+ addClickHandler( toggleLink, function( evt ) { toggleToc(); return killEvt( evt ); } );
+
+ toggleLink.appendChild( document.createTextNode( mediaWiki.msg( 'hidetoc' ) ) );
outerSpan.appendChild( document.createTextNode( '[' ) );
outerSpan.appendChild( toggleLink );
@@ -160,47 +170,59 @@ function showTocToggle() {
toggleToc();
}
}
-}
+};
-function changeText( el, newText ) {
+window.changeText = function( el, newText ) {
// Safari work around
if ( el.innerText ) {
el.innerText = newText;
} else if ( el.firstChild && el.firstChild.nodeValue ) {
el.firstChild.nodeValue = newText;
}
-}
+};
-function toggleToc() {
+window.killEvt = function( evt ) {
+ evt = evt || window.event || window.Event; // W3C, IE, Netscape
+ if ( typeof ( evt.preventDefault ) != 'undefined' ) {
+ evt.preventDefault(); // Don't follow the link
+ evt.stopPropagation();
+ } else {
+ evt.cancelBubble = true; // IE
+ }
+ return false; // Don't follow the link (IE)
+};
+
+window.toggleToc = function() {
var tocmain = document.getElementById( 'toc' );
var toc = document.getElementById('toc').getElementsByTagName('ul')[0];
var toggleLink = document.getElementById( 'togglelink' );
if ( toc && toggleLink && toc.style.display == 'none' ) {
- changeText( toggleLink, tocHideText );
+ changeText( toggleLink, mediaWiki.msg( 'hidetoc' ) );
toc.style.display = 'block';
document.cookie = "hidetoc=0";
tocmain.className = 'toc';
} else {
- changeText( toggleLink, tocShowText );
+ changeText( toggleLink, mediaWiki.msg( 'showtoc' ) );
toc.style.display = 'none';
document.cookie = "hidetoc=1";
tocmain.className = 'toc tochidden';
}
-}
+ return false;
+};
-var mwEditButtons = [];
-var mwCustomEditButtons = []; // eg to add in MediaWiki:Common.js
+window.mwEditButtons = [];
+window.mwCustomEditButtons = []; // eg to add in MediaWiki:Common.js
-function escapeQuotes( text ) {
+window.escapeQuotes = function( text ) {
var re = new RegExp( "'", "g" );
text = text.replace( re, "\\'" );
re = new RegExp( "\\n", "g" );
text = text.replace( re, "\\n" );
return escapeQuotesHTML( text );
-}
+};
-function escapeQuotesHTML( text ) {
+window.escapeQuotesHTML = function( text ) {
var re = new RegExp( '&', "g" );
text = text.replace( re, "&amp;" );
re = new RegExp( '"', "g" );
@@ -210,14 +232,16 @@ function escapeQuotesHTML( text ) {
re = new RegExp( '>', "g" );
text = text.replace( re, "&gt;" );
return text;
-}
+};
/**
* Set the accesskey prefix based on browser detection.
*/
-var tooltipAccessKeyPrefix = 'alt-';
+window.tooltipAccessKeyPrefix = 'alt-';
if ( is_opera ) {
tooltipAccessKeyPrefix = 'shift-esc-';
+} else if ( is_chrome ) {
+ tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
} else if ( !is_safari_win && is_safari && webkit_version > 526 ) {
tooltipAccessKeyPrefix = 'ctrl-alt-';
} else if ( !is_safari_win && ( is_safari
@@ -227,7 +251,7 @@ if ( is_opera ) {
} else if ( is_ff2 ) {
tooltipAccessKeyPrefix = 'alt-shift-';
}
-var tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/;
+window.tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/;
/**
* Add the appropriate prefix to the accesskey shown in the tooltip.
@@ -235,9 +259,9 @@ var tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/;
* otherwise, all the nodes that will probably have accesskeys by
* default are updated.
*
- * @param Array nodeList -- list of elements to update
+ * @param nodeList Array list of elements to update
*/
-function updateTooltipAccessKeys( nodeList ) {
+window.updateTooltipAccessKeys = function( nodeList ) {
if ( !nodeList ) {
// Rather than scan all links on the whole page, we can just scan these
// containers which contain the relevant links. This is really just an
@@ -267,7 +291,7 @@ function updateTooltipAccessKeys( nodeList ) {
element.setAttribute( 'title', tip );
}
}
-}
+};
/**
* Add a link to one of the portlet menus on the page, including:
@@ -287,22 +311,40 @@ function updateTooltipAccessKeys( nodeList ) {
* nextnode parameter; to add the link _after_ an existing item, pass
* the node's nextSibling instead.
*
- * @param String portlet -- id of the target portlet ("p-cactions", "p-personal", "p-navigation" or "p-tb")
- * @param String href -- link URL
- * @param String text -- link text (will be automatically lowercased by CSS for p-cactions in Monobook)
- * @param String id -- id of the new item, should be unique and preferably have the appropriate prefix ("ca-", "pt-", "n-" or "t-")
- * @param String tooltip -- text to show when hovering over the link, without accesskey suffix
- * @param String accesskey -- accesskey to activate this link (one character, try to avoid conflicts)
- * @param Node nextnode -- the DOM node before which the new item should be added, should be another item in the same list
+ * @param portlet String id of the target portlet ("p-cactions", "p-personal", "p-navigation" or "p-tb")
+ * @param href String link URL
+ * @param text String link text (will be automatically lowercased by CSS for p-cactions in Monobook)
+ * @param id String id of the new item, should be unique and preferably have the appropriate prefix ("ca-", "pt-", "n-" or "t-")
+ * @param tooltip String text to show when hovering over the link, without accesskey suffix
+ * @param accesskey String accesskey to activate this link (one character, try to avoid conflicts)
+ * @param nextnode Node the DOM node before which the new item should be added, should be another item in the same list
*
* @return Node -- the DOM node of the new item (an LI element) or null
*/
-function addPortletLink( portlet, href, text, id, tooltip, accesskey, nextnode ) {
+window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, nextnode ) {
var root = document.getElementById( portlet );
if ( !root ) {
return null;
}
- var node = root.getElementsByTagName( 'ul' )[0];
+ var uls = root.getElementsByTagName( 'ul' );
+ var node;
+ if ( uls.length > 0 ) {
+ node = uls[0];
+ } else {
+ node = document.createElement( 'ul' );
+ var lastElementChild = null;
+ for ( var i = 0; i < root.childNodes.length; ++i ) { /* get root.lastElementChild */
+ if ( root.childNodes[i].nodeType == 1 ) {
+ lastElementChild = root.childNodes[i];
+ }
+ }
+ if ( lastElementChild && lastElementChild.nodeName.match( /div/i ) ) {
+ /* Insert into the menu divs */
+ lastElementChild.appendChild( node );
+ } else {
+ root.appendChild( node );
+ }
+ }
if ( !node ) {
return null;
}
@@ -310,15 +352,16 @@ function addPortletLink( portlet, href, text, id, tooltip, accesskey, nextnode )
// unhide portlet if it was hidden before
root.className = root.className.replace( /(^| )emptyPortlet( |$)/, "$2" );
- var span = document.createElement( 'span' );
- span.appendChild( document.createTextNode( text ) );
-
var link = document.createElement( 'a' );
- link.appendChild( span );
+ link.appendChild( document.createTextNode( text ) );
link.href = href;
+ // Wrap in a span - make it work with vector tabs and has no effect on any other portlets
+ var span = document.createElement( 'span' );
+ span.appendChild( link );
+
var item = document.createElement( 'li' );
- item.appendChild( link );
+ item.appendChild( span );
if ( id ) {
item.id = id;
}
@@ -341,15 +384,21 @@ function addPortletLink( portlet, href, text, id, tooltip, accesskey, nextnode )
}
return item;
-}
+};
-function getInnerText( el ) {
+window.getInnerText = function( el ) {
if ( typeof el == 'string' ) {
return el;
}
if ( typeof el == 'undefined' ) {
return el;
}
+ // Custom sort value through 'data-sort-value' attribute
+ // (no need to prepend hidden text to change sort value)
+ if ( el.nodeType && el.getAttribute( 'data-sort-value' ) !== null ) {
+ // Make sure it's a valid DOM element (.nodeType) and that the attribute is set (!null)
+ return el.getAttribute( 'data-sort-value' );
+ }
if ( el.textContent ) {
return el.textContent; // not needed but it is faster
}
@@ -371,24 +420,24 @@ function getInnerText( el ) {
}
}
return str;
-}
+};
/* Dummy for deprecated function */
window.ta = [];
-function akeytt( doId ) {
-}
+window.akeytt = function( doId ) {
+};
-var checkboxes;
-var lastCheckbox;
+window.checkboxes = undefined;
+window.lastCheckbox = undefined;
-function setupCheckboxShiftClick() {
+window.setupCheckboxShiftClick = function() {
checkboxes = [];
lastCheckbox = null;
var inputs = document.getElementsByTagName( 'input' );
addCheckboxClickHandlers( inputs );
-}
+};
-function addCheckboxClickHandlers( inputs, start ) {
+window.addCheckboxClickHandlers = function( inputs, start ) {
if ( !start ) {
start = 0;
}
@@ -400,13 +449,13 @@ function addCheckboxClickHandlers( inputs, start ) {
for ( var i = start; i < finish; i++ ) {
var cb = inputs[i];
- if ( !cb.type || cb.type.toLowerCase() != 'checkbox' ) {
+ if ( !cb.type || cb.type.toLowerCase() != 'checkbox' || ( ' ' + cb.className + ' ' ).indexOf( ' noshiftselect ' ) != -1 ) {
continue;
}
var end = checkboxes.length;
checkboxes[end] = cb;
cb.index = end;
- cb.onclick = checkboxClickHandler;
+ addClickHandler( cb, checkboxClickHandler );
}
if ( finish < inputs.length ) {
@@ -414,9 +463,9 @@ function addCheckboxClickHandlers( inputs, start ) {
addCheckboxClickHandlers( inputs, finish );
}, 200 );
}
-}
+};
-function checkboxClickHandler( e ) {
+window.checkboxClickHandler = function( e ) {
if ( typeof e == 'undefined' ) {
e = window.event;
}
@@ -441,7 +490,7 @@ function checkboxClickHandler( e ) {
}
lastCheckbox = this.index;
return true;
-}
+};
/*
@@ -450,7 +499,7 @@ function checkboxClickHandler( e ) {
Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
-function getElementsByClassName( oElm, strTagName, oClassNames ) {
+window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
var arrReturnElements = new Array();
if ( typeof( oElm.getElementsByClassName ) == 'function' ) {
/* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
@@ -492,9 +541,9 @@ function getElementsByClassName( oElm, strTagName, oClassNames ) {
}
}
return ( arrReturnElements );
-}
+};
-function redirectToFragment( fragment ) {
+window.redirectToFragment = function( fragment ) {
var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
if ( match ) {
var webKitVersion = parseInt( match[1] );
@@ -504,19 +553,24 @@ function redirectToFragment( fragment ) {
return;
}
}
- if ( is_gecko ) {
- // Mozilla needs to wait until after load, otherwise the window doesn't scroll
- addOnloadHook(function() {
- if ( window.location.hash == '' ) {
- window.location.hash = fragment;
- }
- });
- } else {
- if ( window.location.hash == '' ) {
- window.location.hash = fragment;
+ if ( window.location.hash == '' ) {
+ window.location.hash = fragment;
+
+ // Mozilla needs to wait until after load, otherwise the window doesn't
+ // scroll. See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+ // There's no obvious way to detect this programmatically, so we use
+ // version-testing. If Firefox fixes the bug, they'll jump twice, but
+ // better twice than not at all, so make the fix hit future versions as
+ // well.
+ if ( is_gecko ) {
+ addOnloadHook(function() {
+ if ( window.location.hash == fragment ) {
+ window.location.hash = fragment;
+ }
+ });
}
}
-}
+};
/*
* Table sorting script based on one (c) 1997-2006 Stuart Langridge and Joost
@@ -529,16 +583,16 @@ function redirectToFragment( fragment ) {
* @todo support all accepted date formats (bug 8226)
*/
-var ts_image_path = stylepath + '/common/images/';
-var ts_image_up = 'sort_up.gif';
-var ts_image_down = 'sort_down.gif';
-var ts_image_none = 'sort_none.gif';
-var ts_europeandate = wgContentLanguage != 'en'; // The non-American-inclined can change to "true"
-var ts_alternate_row_colors = false;
-var ts_number_transform_table = null;
-var ts_number_regex = null;
+window.ts_image_path = stylepath + '/common/images/';
+window.ts_image_up = 'sort_up.gif';
+window.ts_image_down = 'sort_down.gif';
+window.ts_image_none = 'sort_none.gif';
+window.ts_europeandate = wgContentLanguage != 'en'; // The non-American-inclined can change to "true"
+window.ts_alternate_row_colors = false;
+window.ts_number_transform_table = null;
+window.ts_number_regex = null;
-function sortables_init() {
+window.sortables_init = function() {
var idnum = 0;
// Find all tables with class sortable and make them sortable
var tables = getElementsByClassName( document, 'table', 'sortable' );
@@ -549,9 +603,9 @@ function sortables_init() {
}
ts_makeSortable( tables[ti] );
}
-}
+};
-function ts_makeSortable( table ) {
+window.ts_makeSortable = function( table ) {
var firstRow;
if ( table.rows && table.rows.length > 0 ) {
if ( table.tHead && table.tHead.rows.length > 0 ) {
@@ -568,25 +622,25 @@ function ts_makeSortable( table ) {
for ( var i = 0; i < firstRow.cells.length; i++ ) {
var cell = firstRow.cells[i];
if ( (' ' + cell.className + ' ').indexOf(' unsortable ') == -1 ) {
- cell.innerHTML += '<a href="#" class="sortheader" '
+ $(cell).append ( '<a href="#" class="sortheader" '
+ 'onclick="ts_resortTable(this);return false;">'
+ '<span class="sortarrow">'
+ '<img src="'
+ ts_image_path
+ ts_image_none
- + '" alt="&darr;"/></span></a>';
+ + '" alt="&darr;"/></span></a>');
}
}
if ( ts_alternate_row_colors ) {
ts_alternate( table );
}
-}
+};
-function ts_getInnerText( el ) {
+window.ts_getInnerText = function( el ) {
return getInnerText( el );
-}
+};
-function ts_resortTable( lnk ) {
+window.ts_resortTable = function( lnk ) {
// get the span
var span = lnk.getElementsByTagName('span')[0];
@@ -614,7 +668,15 @@ function ts_resortTable( lnk ) {
// Work out a type for the column
// Skip the first row if that's where the headings are
var rowStart = ( table.tHead && table.tHead.rows.length > 0 ? 0 : 1 );
-
+ var bodyRows = 0;
+ if (rowStart == 0 && table.tBodies) {
+ for (var i=0; i < table.tBodies.length; i++ ) {
+ bodyRows += table.tBodies[i].rows.length;
+ }
+ if (bodyRows < table.rows.length)
+ rowStart = 1;
+ }
+
var itm = '';
for ( var i = rowStart; i < table.rows.length; i++ ) {
if ( table.rows[i].cells.length > column ) {
@@ -703,20 +765,20 @@ function ts_resortTable( lnk ) {
if ( ts_alternate_row_colors ) {
ts_alternate( table );
}
-}
+};
-function ts_initTransformTable() {
+window.ts_initTransformTable = function() {
if ( typeof wgSeparatorTransformTable == 'undefined'
|| ( wgSeparatorTransformTable[0] == '' && wgDigitTransformTable[2] == '' ) )
{
- digitClass = "[0-9,.]";
+ var digitClass = "[0-9,.]";
ts_number_transform_table = false;
} else {
ts_number_transform_table = {};
// Unpack the transform table
// Separators
- ascii = wgSeparatorTransformTable[0].split("\t");
- localised = wgSeparatorTransformTable[1].split("\t");
+ var ascii = wgSeparatorTransformTable[0].split("\t");
+ var localised = wgSeparatorTransformTable[1].split("\t");
for ( var i = 0; i < ascii.length; i++ ) {
ts_number_transform_table[localised[i]] = ascii[i];
}
@@ -728,8 +790,8 @@ function ts_initTransformTable() {
}
// Construct regex for number identification
- digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '\\.'];
- maxDigitLength = 1;
+ var digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '\\.'];
+ var maxDigitLength = 1;
for ( var digit in ts_number_transform_table ) {
// Escape regex metacharacters
digits.push(
@@ -741,9 +803,9 @@ function ts_initTransformTable() {
}
}
if ( maxDigitLength > 1 ) {
- digitClass = '[' + digits.join( '', digits ) + ']';
+ var digitClass = '[' + digits.join( '', digits ) + ']';
} else {
- digitClass = '(' + digits.join( '|', digits ) + ')';
+ var digitClass = '(' + digits.join( '|', digits ) + ')';
}
}
@@ -756,13 +818,13 @@ function ts_initTransformTable() {
"[-+\u2212]?" + digitClass + "+%?" + // Generic localised
")$", "i"
);
-}
+};
-function ts_toLowerCase( s ) {
+window.ts_toLowerCase = function( s ) {
return s.toLowerCase();
-}
+};
-function ts_dateToSortKey( date ) {
+window.ts_dateToSortKey = function( date ) {
// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
if ( date.length == 11 ) {
switch ( date.substr( 3, 3 ).toLowerCase() ) {
@@ -812,7 +874,7 @@ function ts_dateToSortKey( date ) {
return date.substr( 6, 4 ) + date.substr( 3, 2 ) + date.substr( 0, 2 );
}
} else if ( date.length == 8 ) {
- yr = date.substr( 6, 2 );
+ var yr = date.substr( 6, 2 );
if ( parseInt( yr ) < 50 ) {
yr = '20' + yr;
} else {
@@ -825,9 +887,9 @@ function ts_dateToSortKey( date ) {
}
}
return '00000000';
-}
+};
-function ts_parseFloat( s ) {
+window.ts_parseFloat = function( s ) {
if ( !s ) {
return 0;
}
@@ -844,19 +906,19 @@ function ts_parseFloat( s ) {
}
s = newNum;
}
- num = parseFloat( s.replace(/[, ]/g, '').replace("\u2212", '-') );
+ var num = parseFloat( s.replace(/[, ]/g, '').replace("\u2212", '-') );
return ( isNaN( num ) ? -Infinity : num );
-}
+};
-function ts_currencyToSortKey( s ) {
+window.ts_currencyToSortKey = function( s ) {
return ts_parseFloat(s.replace(/[^-\u22120-9.,]/g,''));
-}
+};
-function ts_sort_generic( a, b ) {
+window.ts_sort_generic = function( a, b ) {
return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2];
-}
+};
-function ts_alternate( table ) {
+window.ts_alternate = function( table ) {
// Take object table and get all it's tbodies.
var tableBodies = table.getElementsByTagName( 'tbody' );
// Loop through these tbodies
@@ -877,7 +939,7 @@ function ts_alternate( table ) {
tableRows[j].className = newClassName + ( j % 2 == 0 ? 'even' : 'odd' );
}
}
-}
+};
/*
* End of table sorting code
@@ -888,12 +950,12 @@ function ts_alternate( table ) {
* Add a cute little box at the top of the screen to inform the user of
* something, replacing any preexisting message.
*
- * @param String -or- Dom Object message HTML to be put inside the right div
- * @param String className Used in adding a class; should be different for each
+ * @param message String -or- Dom Object HTML to be put inside the right div
+ * @param className String Used in adding a class; should be different for each
* call to allow CSS/JS to hide different boxes. null = no class used.
* @return Boolean True on success, false on failure
*/
-function jsMsg( message, className ) {
+window.jsMsg = function( message, className ) {
if ( !document.getElementById ) {
return false;
}
@@ -937,7 +999,7 @@ function jsMsg( message, className ) {
messageDiv.innerHTML = message;
}
return true;
-}
+};
/**
* Inject a cute little progress spinner after the specified element
@@ -945,7 +1007,7 @@ function jsMsg( message, className ) {
* @param element Element to inject after
* @param id Identifier string (for use with removeSpinner(), below)
*/
-function injectSpinner( element, id ) {
+window.injectSpinner = function( element, id ) {
var spinner = document.createElement( 'img' );
spinner.id = 'mw-spinner-' + id;
spinner.src = stylepath + '/common/images/spinner.gif';
@@ -955,21 +1017,21 @@ function injectSpinner( element, id ) {
} else {
element.parentNode.appendChild( spinner );
}
-}
+};
/**
* Remove a progress spinner added with injectSpinner()
*
* @param id Identifier string
*/
-function removeSpinner( id ) {
+window.removeSpinner = function( id ) {
var spinner = document.getElementById( 'mw-spinner-' + id );
if( spinner ) {
spinner.parentNode.removeChild( spinner );
}
-}
+};
-function runOnloadHook() {
+window.runOnloadHook = function() {
// don't run anything below this for non-dom browsers
if ( doneOnloadHook || !( document.getElementById && document.getElementsByTagName ) ) {
return;
@@ -981,53 +1043,58 @@ function runOnloadHook() {
updateTooltipAccessKeys( null );
setupCheckboxShiftClick();
- sortables_init();
+
+ jQuery( document ).ready( sortables_init );
// Run any added-on functions
for ( var i = 0; i < onloadFuncts.length; i++ ) {
onloadFuncts[i]();
}
-}
+};
/**
* Add an event handler to an element
*
- * @param Element element Element to add handler to
- * @param String attach Event to attach to
- * @param callable handler Event handler callback
+ * @param element Element to add handler to
+ * @param attach String Event to attach to
+ * @param handler callable Event handler callback
*/
-function addHandler( element, attach, handler ) {
- if( window.addEventListener ) {
+window.addHandler = function( element, attach, handler ) {
+ if( element.addEventListener ) {
element.addEventListener( attach, handler, false );
- } else if( window.attachEvent ) {
+ } else if( element.attachEvent ) {
element.attachEvent( 'on' + attach, handler );
}
-}
+};
+
+window.hookEvent = function( hookName, hookFunct ) {
+ addHandler( window, hookName, hookFunct );
+};
/**
* Add a click event handler to an element
*
- * @param Element element Element to add handler to
- * @param callable handler Event handler callback
+ * @param element Element to add handler to
+ * @param handler callable Event handler callback
*/
-function addClickHandler( element, handler ) {
+window.addClickHandler = function( element, handler ) {
addHandler( element, 'click', handler );
-}
+};
/**
* Removes an event handler from an element
*
- * @param Element element Element to remove handler from
- * @param String remove Event to remove
- * @param callable handler Event handler callback to remove
+ * @param element Element to remove handler from
+ * @param remove String Event to remove
+ * @param handler callable Event handler callback to remove
*/
-function removeHandler( element, remove, handler ) {
+window.removeHandler = function( element, remove, handler ) {
if( window.removeEventListener ) {
element.removeEventListener( remove, handler, false );
} else if( window.detachEvent ) {
element.detachEvent( 'on' + remove, handler );
}
-}
+};
// note: all skins should call runOnloadHook() at the end of html output,
// so the below should be redundant. It's there just in case.
hookEvent( 'load', runOnloadHook );
@@ -1036,7 +1103,4 @@ if ( ie6_bugs ) {
importScriptURI( stylepath + '/common/IEFixes.js' );
}
-// For future use.
-mw = {};
-
-
+showTocToggle();
diff --git a/skins/common/wikiprintable.css b/skins/common/wikiprintable.css
index 8b099bb2..a80c8307 100644
--- a/skins/common/wikiprintable.css
+++ b/skins/common/wikiprintable.css
@@ -1,10 +1,10 @@
/* MediaWiki print stylesheet */
body {
- color: #000000; background: #ffffff;
+ color: #000000;
+ background: #ffffff;
}
-
/* MSIE/Win doesn't understand 'inherit' */
a, a.external, a.new, a.stub {
color: black ! important;
diff --git a/skins/common/wikistandard.css b/skins/common/wikistandard.css
index 5bf59246..62050922 100644
--- a/skins/common/wikistandard.css
+++ b/skins/common/wikistandard.css
@@ -1,48 +1,178 @@
-#article { padding: 4px; }
-#content { margin: 0; padding: 0; }
-#footer { padding: 4px;font-size:95%;clear: both; }
-#pagestats { font-size: 9pt; }
+#article {
+ padding: 4px;
+}
+
+#content {
+ margin: 0;
+ padding: 0;
+}
+
+#footer {
+ padding: 4px;
+ font-size: 95%;
+ clear: both;
+}
+
+#pagestats {
+ font-size: 9pt;
+}
+
#powersearch {
- background: #DDEEFF; border-style: solid; border-width: 1px; padding: 2px;
+ background: #DDEEFF;
+ border-style: solid;
+ border-width: 1px;
+ padding: 2px;
+}
+
+#quickbar {
+ width: 140px;
+ height: 100%;
+ padding: 4px;
+ visibility: visible;
+ z-index: 99;
+ font-size: 95%;
}
-#quickbar { width: 140px; height:100%; padding: 4px; visibility: visible; z-index:99;font-size:95%;}
-#topbar { padding: 4px;font-size:95%; }
+#topbar {
+ padding: 4px;
+ font-size: 95%;
+}
/* Table of contents */
-.toctoggle, .editsection { font-size: smaller; }
+.toctoggle, .editsection {
+ font-size: smaller;
+}
/* ... */
-#toolbar { padding:0px; }
-#infobox { background:#eeeeff;color:black;}
-#editform { margin-top:1px; }
-a.interwiki, a.external { color: #3366BB; }
-a.printable { text-decoration: underline; }
-a.stub { color:#772233; text-decoration:none; }
-a:visited { color: #5A3696; }
-body { margin: 0px; padding: 4px; color: black; }
-form.inline { display: inline; }
-textarea { overflow: auto; }
-
-
-h1.pagetitle { padding-top: 0; margin-top: 0; padding-bottom: 0; margin-bottom: 0;
-font-size:150%; }
-h1.pagetitle .editsection { font-size: 66.7%; }
-h2 { font-size: 120%; }
-h2 .editsection { font-size: 83.3%; }
-h2, h3, h4, h5, h6 { margin-bottom: 0;}
-h3 { font-size: 106.25%; }
-h3 .editsection { font-size: 94.1%; }
-h4 { font-size: 103.125%; }
-h4 .editsection { font-size: 97.0%; }
-h5 { font-size: 100%; }
-h5 .editsection { font-size: 100%; }
-h6 { font-size: 95%; }
-h6 .editsection { font-size: 105.3%; }
-hr.sep { color:gray;height:1px;background-color:gray;}
-p.subpages { font-size:small;}
-p.subtitle { padding-top: 0; margin-top: 0;}
-.catlinks { font-size:small; margin-top:0; text-align:right;}
-td { empty-cells:show; }
-td.bottom { border-top: 1px solid gray; }
-td.top { border-bottom: 1px solid gray; }
+#toolbar {
+ padding: 0px;
+}
+
+#infobox {
+ background: #eeeeff;
+ color: black;
+}
+
+#editform {
+ margin-top: 1px;
+}
+
+a.interwiki, a.external {
+ color: #3366BB;
+}
+
+a.printable {
+ text-decoration: underline;
+}
+
+a.stub {
+ color: #772233;
+ text-decoration: none;
+}
+
+a:visited {
+ color: #5A3696;
+}
+
+body {
+ margin: 0px;
+ padding: 4px;
+ color: black;
+}
+
+form.inline {
+ display: inline;
+}
+
+textarea {
+ overflow: auto;
+}
+
+h1.pagetitle {
+ padding-top: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ margin-bottom: 0;
+ font-size: 150%;
+}
+
+h1.pagetitle .editsection {
+ font-size: 66.7%;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h2 .editsection {
+ font-size: 83.3%;
+}
+
+h2, h3, h4, h5, h6 {
+ margin-bottom: 0;
+}
+
+h3 {
+ font-size: 106.25%;
+}
+
+h3 .editsection {
+ font-size: 94.1%;
+}
+
+h4 {
+ font-size: 103.125%;
+}
+
+h4 .editsection {
+ font-size: 97.0%;
+}
+
+h5 {
+ font-size: 100%;
+}
+
+h5 .editsection {
+ font-size: 100%;
+}
+
+h6 {
+ font-size: 95%;
+}
+
+h6 .editsection {
+ font-size: 105.3%;
+}
+
+hr.sep {
+ color: gray;
+ height: 1px;
+ background-color: gray;
+}
+
+p.subpages {
+ font-size: small;
+}
+
+p.subtitle {
+ padding-top: 0;
+ margin-top: 0;
+}
+
+.catlinks {
+ font-size: small;
+ margin-top: 0;
+ text-align:right;
+}
+
+td {
+ empty-cells: show;
+}
+
+td.bottom {
+ border-top: 1px solid gray;
+}
+
+td.top {
+ border-bottom: 1px solid gray;
+}
diff --git a/skins/modern/audio.png b/skins/modern/audio.png
index 1c56bdc8..c22c05c3 100644
--- a/skins/modern/audio.png
+++ b/skins/modern/audio.png
Binary files differ
diff --git a/skins/modern/document.png b/skins/modern/document.png
index b48138e9..b7648b38 100644
--- a/skins/modern/document.png
+++ b/skins/modern/document.png
Binary files differ
diff --git a/skins/modern/external.png b/skins/modern/external.png
index 419c06fb..acf260fc 100644
--- a/skins/modern/external.png
+++ b/skins/modern/external.png
Binary files differ
diff --git a/skins/modern/footer-grad.png b/skins/modern/footer-grad.png
index 6f61d616..783a4725 100644
--- a/skins/modern/footer-grad.png
+++ b/skins/modern/footer-grad.png
Binary files differ
diff --git a/skins/modern/main.css b/skins/modern/main.css
index a25b6b59..9dc17170 100644
--- a/skins/modern/main.css
+++ b/skins/modern/main.css
@@ -69,7 +69,8 @@ body {
}
#p-personal li {
- display: block; float: left;
+ display: block;
+ float: left;
height: 1.5em;
margin: 0 0 0 0;
vertical-align: middle;
@@ -301,27 +302,27 @@ hr {
}
a {
- text-decoration: none;
- color: #003366;
- background: none;
+ text-decoration: none;
+ color: #003366;
+ background: none;
}
a:visited {
- color: #5a3696;
+ color: #5a3696;
}
a:active {
- color: #faa700;
+ color: #faa700;
}
a:hover {
- text-decoration: underline;
+ text-decoration: underline;
}
a.stub {
- color: #772233;
+ color: #772233;
}
a.new {
- color: #ba0000;
+ color: #ba0000;
}
a.new:visited {
- color: #a55858;
+ color: #a55858;
}
span.editsection {
@@ -332,6 +333,10 @@ h1, h2 {
border-bottom: solid 1px #003366;
}
+h1, h2, h3, h4, h5, h6 {
+ overflow: hidden;
+}
+
#preftoc {
width: 100%;
margin: 0 0 0 0;
@@ -402,33 +407,33 @@ h1, h2 {
#mw_content a.external,
#mw_content a[href ^="gopher://"] {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
+ background: url(external.png) center right no-repeat;
+ padding-right: 13px;
}
#mw_content a[href ^="https://"],
.link-https {
- background: url(lock_icon.gif) center right no-repeat;
- padding-right: 16px;
+ background: url(lock_icon.gif) center right no-repeat;
+ padding-right: 16px;
}
#mw_content a[href ^="mailto:"],
.link-mailto {
- background: url(mail_icon.gif) center right no-repeat;
- padding-right: 18px;
+ background: url(mail_icon.gif) center right no-repeat;
+ padding-right: 18px;
}
#mw_content a[href ^="news://"] {
- background: url(news_icon.png) center right no-repeat;
- padding-right: 18px;
+ background: url(news_icon.png) center right no-repeat;
+ padding-right: 18px;
}
#mw_content a[href ^="ftp://"],
.link-ftp {
- background: url(file_icon.gif) center right no-repeat;
- padding-right: 18px;
+ background: url(file_icon.gif) center right no-repeat;
+ padding-right: 18px;
}
#mw_content a[href ^="irc://"],
#mw_content a.extiw[href ^="irc://"],
.link-irc {
- background: url(discussionitem_icon.gif) center right no-repeat;
- padding-right: 18px;
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
}
#mw_content a.external[href $=".ogg"], #mw_content a.external[href $=".OGG"],
@@ -438,23 +443,23 @@ h1, h2 {
#mw_content a.external[href $=".wav"], #mw_content a.external[href $=".WAV"],
#mw_content a.external[href $=".wma"], #mw_content a.external[href $=".WMA"],
.link-audio {
- background: url("audio.png") center right no-repeat;
- padding-right: 13px;
+ background: url("audio.png") center right no-repeat;
+ padding-right: 13px;
}
#mw_content a.external[href $=".ogm"], #mw_content a.external[href $=".OGM"],
#mw_content a.external[href $=".avi"], #mw_content a.external[href $=".AVI"],
#mw_content a.external[href $=".mpeg"], #mw_content a.external[href $=".MPEG"],
#mw_content a.external[href $=".mpg"], #mw_content a.external[href $=".MPG"],
.link-video {
- background: url("video.png") center right no-repeat;
- padding-right: 13px;
+ background: url("video.png") center right no-repeat;
+ padding-right: 13px;
}
#mw_content a.external[href $=".pdf"], #mw_content a.external[href $=".PDF"],
#mw_content a.external[href *=".pdf#"], #mw_content a.external[href *=".PDF#"],
#mw_content a.external[href *=".pdf?"], #mw_content a.external[href *=".PDF?"],
.link-document {
- background: url("document.png") center right no-repeat;
- padding-right: 12px;
+ background: url("document.png") center right no-repeat;
+ padding-right: 12px;
}
/* images */
@@ -486,8 +491,6 @@ div.floatleft p { font-style: italic; }
/* thumbnails */
div.thumb {
margin-bottom: .5em;
- border-style: solid;
- border-color: white;
width: auto;
}
div.thumbinner {
@@ -521,13 +524,12 @@ div.magnify a, div.magnify img {
div.tright {
clear: right;
float: right;
- border-width: .5em 0 .8em 1.4em;
+ margin: .5em 0 .8em 1.4em;
}
div.tleft {
float: left;
clear: left;
- margin-right: .5em;
- border-width: .5em 1.4em .8em 0;
+ margin: .5em 1.4em .8em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
@@ -695,30 +697,6 @@ input#wpSave, input#wpDiff {
font-weight: bold;
}
-/* Classes for article validation */
-
-table.revisionform_default {
- border: 1px solid #000000;
-}
-
-table.revisionform_focus {
- border: 1px solid #000000;
- background-color:#00BBFF;
-}
-
-tr.revision_tr_default {
- background-color:#EEEEEE;
-}
-
-tr.revision_tr_first {
- background-color:#DDDDDD;
-}
-
-p.revision_saved {
- color: green;
- font-weight:bold;
-}
-
/* noarticletext */
div.noarticletext {
border: 1px solid #ccc;
@@ -751,55 +729,32 @@ div#searchTarget ul li:before {
}
div#searchTargetHide {
- float:right;
- border:solid 1px black;
- background:gainsboro;
- padding:2px;
+ float: right;
+ border: solid 1px black;
+ background: gainsboro;
+ padding: 2px;
}
div.multipageimagenavbox {
- border: solid 1px silver;
- padding: 4px;
- margin: 1em;
- background: #f0f0f0;
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
}
div.multipageimagenavbox div.thumb {
- border: none;
- margin-left: 2em;
- margin-right: 2em;
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
}
div.multipageimagenavbox hr {
- margin: 6px;
+ margin: 6px;
}
table.multipageimage td {
- text-align: center;
-}
-
-/*
- Table pager (e.g. Special:Imagelist)
- - remove underlines from the navigation link
- - collapse borders
- - set the borders to outsets (similar to Special:Allmessages)
- - remove line wrapping for all td and th, set background color
- - restore line wrapping for the last two table cells (description and size)
-*/
-.TablePager_nav a { text-decoration: none; }
-.TablePager { border-collapse: collapse; }
-.TablePager, .TablePager td, .TablePager th {
- border: 1px solid #aaaaaa;
- padding: 0 0.15em 0 0.15em;
+ text-align: center;
}
-.TablePager th { background-color: #eeeeff }
-.TablePager td { background-color: #ffffff }
-.TablePager tr:hover td { background-color: #eeeeff }
-
-.imagelist td, .imagelist th { white-space: nowrap }
-.imagelist .TablePager_col_links { background-color: #eeeeff }
-.imagelist .TablePager_col_img_description { white-space: normal }
-.imagelist th.TablePager_sort { background-color: #ccccff }
.templatesUsed { margin-top: 1.5em; }
@@ -890,8 +845,8 @@ pre {
}
.mw-topbox {
- color: black;
- font-weight: bold;
+ color: black;
+ font-weight: bold;
margin: 0 0 0 0;
padding: 0 1em 0 1em;
vertical-align: middle;
@@ -905,19 +860,24 @@ pre {
/* emulate center */
.center {
- width:100%;
- text-align:center;
+ width: 100%;
+ text-align: center;
}
*.center * {
- margin-left:auto;
- margin-right:auto;
+ margin-left: auto;
+ margin-right: auto;
}
/* table standards */
.toccolours {
- border:1px solid #bbbbbb;
- background-color:#f0f0f0;
- border-spacing:0pt;
- margin:0pt;
- padding:0pt;
+ border: 1px solid #bbbbbb;
+ background-color: #f0f0f0;
+ border-spacing: 0pt;
+ margin: 0pt;
+ padding: 0pt;
}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 130%;
+} \ No newline at end of file
diff --git a/skins/modern/news_icon.png b/skins/modern/news_icon.png
index dd1541d1..b8f5abb5 100644
--- a/skins/modern/news_icon.png
+++ b/skins/modern/news_icon.png
Binary files differ
diff --git a/skins/modern/print.css b/skins/modern/print.css
index 33a36b20..82784100 100644
--- a/skins/modern/print.css
+++ b/skins/modern/print.css
@@ -4,7 +4,6 @@
#jump-to-nav,
#footer,
span.editsection,
-.noprint
-{
+.noprint {
display: none;
}
diff --git a/skins/modern/rtl.css b/skins/modern/rtl.css
index 72210480..66d9017a 100644
--- a/skins/modern/rtl.css
+++ b/skins/modern/rtl.css
@@ -107,8 +107,8 @@ table.filehistory th {
}
.portlet ul {
- margin: 0 1.5em 0 0;
- padding: 0 0 0 0;
+ margin: 0 1.5em 0 0;
+ padding: 0 0 0 0;
}
.portlet h5 {
@@ -156,8 +156,7 @@ td.mw-allpages-nav, p.mw-allpages-nav, td.mw-allpages-alphaindexline {
text-align: left;
}
-/* Special:Prefixindex styling */
-td#mw-prefixindex-nav-form {
+/* Special:PrefixIndex styling */
+td#mw-prefixindex-nav-form {
text-align: left;
}
-
diff --git a/skins/modern/video.png b/skins/modern/video.png
index 38103dac..8e81d681 100644
--- a/skins/modern/video.png
+++ b/skins/modern/video.png
Binary files differ
diff --git a/skins/monobook/IE50Fixes.css b/skins/monobook/IE50Fixes.css
index 26c3dc97..a054a91f 100644
--- a/skins/monobook/IE50Fixes.css
+++ b/skins/monobook/IE50Fixes.css
@@ -2,22 +2,22 @@
** IE5.0 Fix Stylesheet
*/
-#column-content {
+div#column-content {
margin: 0 !important;
float: none;
}
-#column-content #content {
- margin-top: 3em;
+div#column-content #content {
+ margin-top: 3em;
height: 1%;
}
-#column-one {
+div#column-one {
position: absolute;
overflow: visible;
top: 0;
left: 0;
z-index: 3;
}
-#footer {
+div#footer {
margin: 0 0 0 13.6em;
}
diff --git a/skins/monobook/IE55Fixes.css b/skins/monobook/IE55Fixes.css
index 637daae1..f3c2cde7 100644
--- a/skins/monobook/IE55Fixes.css
+++ b/skins/monobook/IE55Fixes.css
@@ -1,25 +1,25 @@
/* IE5.5/win- only fixes */
-#column-content {
- float: none;
+div#column-content {
+ float: none;
margin-left: 0;
height: 1%;
}
-#column-content #content {
+div#column-content #content {
position: relative;
z-index: 5;
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
-#column-one {
+div#column-one {
position: absolute;
top: 0;
left: 0;
z-index: 4;
width: 100%;
}
-#footer {
+div#footer {
margin-left: 13.6em;
border-left: 1px solid #fabd23;
}
diff --git a/skins/monobook/IE60Fixes.css b/skins/monobook/IE60Fixes.css
index e6e447f6..56e0a16b 100644
--- a/skins/monobook/IE60Fixes.css
+++ b/skins/monobook/IE60Fixes.css
@@ -1,23 +1,23 @@
/* 6.0 - only fixes */
-/* content area */
+/* content area */
/* workaround for various ie float bugs */
-#column-content {
- float: none;
+div#column-content {
+ float: none;
margin-left: 0;
height: 1%;
}
-#column-content #content {
+div#column-content div#content {
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
-#column-one {
+div#column-one {
position: absolute;
top: 0;
left: 0;
z-index: 4;
}
-#footer {
+div#footer {
margin-left: 13.6em;
border-left: 1px solid #fabd23;
}
diff --git a/skins/monobook/IE70Fixes.css b/skins/monobook/IE70Fixes.css
index 00145860..91b39efd 100644
--- a/skins/monobook/IE70Fixes.css
+++ b/skins/monobook/IE70Fixes.css
@@ -1,15 +1,15 @@
/* 7.0 - only fixes */
-/* content area */
+/* content area */
/* workaround for various ie float bugs */
/* This bit is needed to make links clickable... WTF */
-#column-content #content {
+div#column-content div#content {
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
-.rtl #column-one {
+.rtl div#column-one {
/* For some reason it tries to inherit the padding-top into every div,
* and I can't figure out how to get it back off.
* Margin works correctly for this use, though.
@@ -78,7 +78,7 @@ div.tleft {
*/
-#footer li {
+div#footer li {
/* Work around bug with inline <li> tags with right margins and nowrap */
margin-right: 0;
}
diff --git a/skins/monobook/Opera6Fixes.css b/skins/monobook/Opera6Fixes.css
index 2a3d78f8..77dec095 100644
--- a/skins/monobook/Opera6Fixes.css
+++ b/skins/monobook/Opera6Fixes.css
@@ -1,5 +1,5 @@
/* opera 6 fixes */
-#column-one {
+div#column-one {
position: relative;
max-width: 11.7em;
}
diff --git a/skins/monobook/audio.png b/skins/monobook/audio.png
index 1c56bdc8..c22c05c3 100644
--- a/skins/monobook/audio.png
+++ b/skins/monobook/audio.png
Binary files differ
diff --git a/skins/monobook/document.png b/skins/monobook/document.png
index b48138e9..b7648b38 100644
--- a/skins/monobook/document.png
+++ b/skins/monobook/document.png
Binary files differ
diff --git a/skins/monobook/external-rtl.png b/skins/monobook/external-rtl.png
index c5cd84db..9901d8f1 100644
--- a/skins/monobook/external-rtl.png
+++ b/skins/monobook/external-rtl.png
Binary files differ
diff --git a/skins/monobook/external.png b/skins/monobook/external.png
index 419c06fb..acf260fc 100644
--- a/skins/monobook/external.png
+++ b/skins/monobook/external.png
Binary files differ
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index 727355bb..d2330eba 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -9,22 +9,22 @@
** All you guys rock :)
*/
-#column-content {
+div#column-content {
width: 100%;
float: right;
margin: 0 0 .6em -12.2em;
padding: 0;
}
-#content {
+div#content {
margin: 2.8em 0 0 12.2em;
padding: 0 1em 1em 1em;
position: relative;
z-index: 2;
}
-#column-one {
+div#column-one {
padding-top: 160px;
}
-#content {
+div#content {
background: white;
color: black;
border: 1px solid #aaa;
@@ -48,7 +48,7 @@ body {
}
/* scale back up to a sane default */
-#globalWrapper {
+div#globalWrapper {
font-size: 127%;
width: 100%;
margin: 0;
@@ -59,14 +59,6 @@ body {
table {
font-size: 100%;
- color: black;
- /* we don't want the bottom borders of <h2>s to be visible through
- floated tables */
- background-color: white;
-}
-fieldset table {
- /* but keep table layouts in forms clean... */
- background: none;
}
a {
text-decoration: none;
@@ -86,7 +78,7 @@ a.stub {
color: #772233;
}
a.new, #p-personal a.new {
- color: #ba0000;
+ color: #cc2200;
}
a.new:visited, #p-personal a.new:visited {
color: #a55858;
@@ -117,6 +109,7 @@ h1, h2, h3, h4, h5, h6 {
background: none;
font-weight: normal;
margin: 0;
+ overflow: hidden;
padding-top: .5em;
padding-bottom: .17em;
border-bottom: 1px solid #aaa;
@@ -135,7 +128,7 @@ h4 { font-size: 116%; }
h4 .editsection { font-size: 86%; font-weight: normal; }
h5 { font-size: 100%; }
h5 .editsection { font-weight: normal; }
-h6 { font-size: 80%; }
+h6 { font-size: 80%; }
h6 .editsection { font-size: 125%; font-weight: normal; }
ul {
@@ -202,12 +195,6 @@ input.historysubmit {
select {
vertical-align: top;
}
-abbr, acronym, .explain {
- border-bottom: 1px dotted black;
- color: black;
- background: none;
- cursor: help;
-}
q {
font-family: Times, "Times New Roman", serif;
font-style: italic;
@@ -404,8 +391,6 @@ div.floatleft p { font-style: italic; }
/* thumbnails */
div.thumb {
margin-bottom: .5em;
- border-style: solid;
- border-color: white;
width: auto;
}
div.thumbinner {
@@ -439,13 +424,12 @@ div.magnify a, div.magnify img {
div.tright {
clear: right;
float: right;
- border-width: .5em 0 .8em 1.4em;
+ margin: .5em 0 1.3em 1.4em;
}
div.tleft {
float: left;
clear: left;
- margin-right: .5em;
- border-width: .5em 1.4em .8em 0;
+ margin: .5em 1.4em 1.3em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
@@ -826,7 +810,6 @@ li#pt-login {
}
#p-cactions li.selected a {
z-index: 3;
- padding: 0 1em .2em!important;
background-color: white;
}
#p-cactions .new a {
@@ -894,7 +877,7 @@ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
/*
** footer
*/
-#footer {
+div#footer {
background-color: white;
border-top: 1px solid #fabd23;
border-bottom: 1px solid #fabd23;
@@ -903,7 +886,7 @@ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
text-align: center;
font-size: 90%;
}
-#footer li {
+div#footer li {
display: inline;
margin: 0 1.3em;
}
@@ -991,7 +974,7 @@ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
}
.prefsection legend {
- font-weight: bold;
+ font-weight: bold;
}
.prefsection table, .prefsection legend {
background-color: #F9F9F9;
@@ -1092,8 +1075,8 @@ div#userloginForm .captcha {
/* more IE fixes */
/* float/negative margin brokenness */
-* html #footer {margin-top: 0;}
-* html #column-content {
+* html div#footer {margin-top: 0;}
+* html div#column-content {
display: inline;
margin-bottom: 0;
}
@@ -1101,15 +1084,15 @@ div#userloginForm .captcha {
#pagehistory li.selected { position: relative; }
/* Mac IE 5.0 fix; floated content turns invisible */
-* > html #column-content {
+* > html div#column-content {
float: none;
}
-* > html #column-one {
+* > html div#column-one {
position: absolute;
left: 0;
top: 0;
}
-* > html #footer {
+* > html div#footer {
margin-left: 13.2em;
}
.redirectText {
@@ -1121,7 +1104,6 @@ div#userloginForm .captcha {
display: none;
}
-
div.patrollink {
clear: both;
}
@@ -1135,16 +1117,6 @@ span.updatedmarker {
background-color: #0f0;
}
-.previewnote {
- color: #c00;
- margin-bottom: 1em;
-}
-
-.previewnote p {
- text-indent: 3em;
- margin: 0.8em 0;
-}
-
.editExternally {
border: 1px solid gray;
background-color: #ffffff;
@@ -1164,10 +1136,6 @@ span.updatedmarker {
text-indent: -2em;
}
-input#wpSummary {
- width: 80%;
-}
-
/* @bug 1714 */
input#wpSave, input#wpDiff {
margin-right: 0.33em;
@@ -1177,30 +1145,6 @@ input#wpSave, input#wpDiff {
font-weight: bold;
}
-/* Classes for article validation */
-
-table.revisionform_default {
- border: 1px solid #000000;
-}
-
-table.revisionform_focus {
- border: 1px solid #000000;
- background-color:#00BBFF;
-}
-
-tr.revision_tr_default {
- background-color:#EEEEEE;
-}
-
-tr.revision_tr_first {
- background-color:#DDDDDD;
-}
-
-p.revision_saved {
- color: green;
- font-weight:bold;
-}
-
/* noarticletext */
div.noarticletext {
border: 1px solid #ccc;
@@ -1244,24 +1188,24 @@ div#searchTargetHide {
}
div.multipageimagenavbox {
- border: solid 1px silver;
- padding: 4px;
- margin: 1em;
- background: #f0f0f0;
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
}
div.multipageimagenavbox div.thumb {
- border: none;
- margin-left: 2em;
- margin-right: 2em;
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
}
div.multipageimagenavbox hr {
- margin: 6px;
+ margin: 6px;
}
table.multipageimage td {
- text-align: center;
+ text-align: center;
}
.templatesUsed { margin-top: 1.5em; }
@@ -1306,3 +1250,8 @@ div.mw-lag-warn-high {
.no-text-transform {
text-transform: none;
}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 127%;
+} \ No newline at end of file
diff --git a/skins/monobook/news_icon.png b/skins/monobook/news_icon.png
index dd1541d1..b8f5abb5 100644
--- a/skins/monobook/news_icon.png
+++ b/skins/monobook/news_icon.png
Binary files differ
diff --git a/skins/monobook/rtl.css b/skins/monobook/rtl.css
index b9bf43c0..52507676 100644
--- a/skins/monobook/rtl.css
+++ b/skins/monobook/rtl.css
@@ -26,11 +26,11 @@ body {
direction: rtl;
unicode-bidi: embed;
}
-#column-content {
+div#column-content {
margin: 0 -12.2em 0 0;
float: left;
}
-#column-content #content{
+div#column-content div#content{
margin-left: 0;
margin-right: 12.2em;
border-right: 1px solid #aaaaaa;
@@ -153,7 +153,7 @@ li#ca-watch {
background: none !important;
}
*/
-#footer {
+div#footer {
clear: both;
}
#f-poweredbyico {
@@ -164,22 +164,22 @@ li#ca-watch {
float: right;
height: 1%;
}
-* html #footer {
+* html div#footer {
margin-left: 0;
margin-right: 13.6em;
border-left: 0;
border-right: 1px solid #fabd23;
-}
-* html #column-content {
+}
+* html div#column-content {
float: none;
margin-left: 0;
margin-right: 0;
}
-* html #column-content #content {
+* html div#column-content div#content {
margin-left: 0;
margin-top: 3em;
}
-* html #column-one { right: 0; }
+* html div#column-one { right: 0; }
/* js pref toc */
@@ -227,13 +227,13 @@ table.filehistory th {
text-align: right;
}
-/* Special:Allpages styling */
+/* Special:AllPages styling */
td.mw-allpages-nav, p.mw-allpages-nav, td.mw-allpages-alphaindexline {
text-align: left;
}
-/* Special:Prefixindex styling */
-td#mw-prefixindex-nav-form {
+/* Special:PrefixIndex styling */
+td#mw-prefixindex-nav-form {
text-align: left;
}
diff --git a/skins/monobook/wiki-indexed.png b/skins/monobook/wiki-indexed.png
index 189a2ae3..4b80e3ae 100644
--- a/skins/monobook/wiki-indexed.png
+++ b/skins/monobook/wiki-indexed.png
Binary files differ
diff --git a/skins/monobook/wiki.png b/skins/monobook/wiki.png
index 44389389..70eee796 100644
--- a/skins/monobook/wiki.png
+++ b/skins/monobook/wiki.png
Binary files differ
diff --git a/skins/simple/external.png b/skins/simple/external.png
index 419c06fb..acf260fc 100644
--- a/skins/simple/external.png
+++ b/skins/simple/external.png
Binary files differ
diff --git a/skins/simple/main.css b/skins/simple/main.css
index 525c1473..8b65d4de 100644
--- a/skins/simple/main.css
+++ b/skins/simple/main.css
@@ -245,11 +245,8 @@ td.diff-deletedline {
}
.diffchange { background-color: #FFCDF3; text-decoration: none; }
-#pagehistory li { border: none; }
-span.urlexpansion {
- display: none;
-}
+#pagehistory li { border: none; }
div.tocindent {
margin-left: 2em;
@@ -372,7 +369,6 @@ div.htmlform-tip {
#mw_trackbacks {
border-style: groove;
- padding: 0.2em;
}
#jump-to-nav {
@@ -383,10 +379,5 @@ table.collapsed tr.collapsable {
display: none;
}
-.editsection {
- float: right;
- margin-left: 5px;
-}
-
.templatesUsed { margin-top: 1.5em; }
diff --git a/skins/simple/rtl.css b/skins/simple/rtl.css
deleted file mode 100644
index a5a2b59f..00000000
--- a/skins/simple/rtl.css
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-Right-to-left fixes for Simple.
-Places sidebar on right, tweaks various alignment issues.
-
-Works mostly ok nicely on Safari 1.2.1; fine in Mozilla.
-
-Safari bugs (1.2.1):
-* Tabs are still appearing in left-to-right order. (Try after localizing)
-
-Opera bugs (7.23 linux):
-* Some bits of ltr text (sidebar box titles) have forward and backward versions overlapping each other
-
-IE/mac bugs:
-* The thing barfs on Hebrew and Arabic anyway, so no point testing.
-
-Missing features due to lack of support:
-* external link icons
-
-To test:
-* Opera6
-* IE 5.0
-* etc
-
-*/
-body {
- direction: rtl;
- unicode-bidi: embed;
-}
-#column-content {
- margin: 0 -12.2em 0 0;
- float: left;
-}
-#column-content #content{
- margin-left: 0;
- margin-right: 12.2em;
- border-right: 1px solid #aaaaaa;
- border-left: none;
-}
-html>body .portlet {
- float: right;
- clear: right;
-}
-.editsection {
- float: left;
- margin-right: 5px;
- margin-left: 0; /* bug 9122: undo default LTR */
-}
-/* recover IEMac (might be fine with the float, but usually it's close to IE */
-*>body .portlet {
- float: none;
- clear: none;
-}
-.pBody {
- padding: 0 0.5em 0.3em 0.8em;
-}
-
-/* Fix alignment */
-.documentByLine,
-.portletDetails,
-.portletMore {
- text-align: left;
-}
-
-div div.thumbcaption {
- text-align: right;
-}
-
-div.magnify,
-#p-logo {
- left: auto;
- right: 0;
-}
-
-/* Fix margins for non-css2 browsers */
-/* top right bottom left */
-
-dd {
- margin-left: 0;
- margin-right: 1.6em;
-}
-#contentSub {
- margin-right: 1em;
- margin-left: 0;
-}
-.tocindent {
- margin-left: 0;
- margin-right: 2em;
-}
-div.tright, div.floatright, table.floatright {
- clear: none;
-}
-div.tleft, div.floatleft, table.floatleft {
- clear: left;
-}
-
-/* Fix link icons */
-.external, a.feedlink {
- padding: 0 !important;
- background: none !important;
-}
-#footer {
- clear: both;
-}
-* html #footer {
- margin-left: 0;
- margin-right: 13.6em;
- border-left: 0;
- border-right: 1px solid #fabd23;
-}
-* html #column-content {
- float: none;
- margin-left: 0;
- margin-right: 0;
-}
-* html #column-content #content {
- margin-left: 0;
- margin-top: 3em;
-}
-* html #column-one { right: 0; }
-
-/* js pref toc */
-
-#preftoc {
- margin-right: 1em;
-}
-
-.errorbox, .successbox, #preftoc li, .prefsection fieldset {
- float: right;
-}
-
-.prefsection {
- padding-right: 2em;
-}
-
-/* workaround for moz bug, displayed bullets on left side */
-
-#toc ul {
- text-align: right;
-}
-
-#toc ul ul {
- margin: 0 2em 0 0;
-}
-
-input#wpSave, input#wpDiff {
- margin-right: 0;
- margin-left: .33em;
-}
-
-#userlogin {
- margin: 0 0 1em 3em;
-}
-/* Convenience links to edit block, delete and protect reasons */
-p.mw-ipb-conveniencelinks, p.mw-protect-editreasons,
-p.mw-filedelete-editreasons, p.mw-delete-editreasons {
- float: left;
-}
-
-.toggle {
- margin-left: 0em;
- margin-right: 2em;
-}
-table.filehistory th {
- text-align: right;
-}
-
-/**
- * Lists:
- * The following lines don't have a visible effect on non-Gecko browsers
- * They fix a problem ith Gecko browsers rendering lists to the right of
- * left-floated objects in an RTL layout.
- */
-html > body div#bodyContent ul {
- display: table;
-}
-
-/* Special:Allpages styling */
-td.mw-allpages-nav, p.mw-allpages-nav, td.mw-allpages-alphaindexline {
- text-align: left;
-
-/* Special:Prefixindex styling */
-td#mw-prefixindex-nav-form {
- text-align: left;
-}
-
diff --git a/skins/vector/Makefile b/skins/vector/Makefile
deleted file mode 100644
index 74e36c45..00000000
--- a/skins/vector/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Handy makefile to build the RTL variant with cssjanus
-#
-
-all: main-rtl.css
-
-main-rtl.css: main-ltr.css cssjanus/cssjanus.py
- python cssjanus/cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
-
-# SVN version is broken; checking in our own.
-#cssjanus/cssjanus.py:
-# svn co http://cssjanus.googlecode.com/svn/trunk cssjanus
-
-#distclean: clean
-# rm -rf cssjanus
-
-clean:
- rm -f main-rtl.css
diff --git a/skins/vector/csshover.htc b/skins/vector/csshover.htc
index a88fa08d..a13ea68d 100644
--- a/skins/vector/csshover.htc
+++ b/skins/vector/csshover.htc
@@ -1,12 +1,14 @@
<public:attach event="ondocumentready" onevent="CSSHover()" />
<script>
-// <![CDATA[
/**
- * Whatever:hover - V3.00.081222
+ * Whatever:hover - V3.11
* ------------------------------------------------------------
* Author - Peter Nederlof, http://www.xs4all.nl/~peterned
* License - http://creativecommons.org/licenses/LGPL/2.1
*
+ * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
+ * for fixing the expression loop.
+ *
* Whatever:hover is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
@@ -24,16 +26,31 @@
window.CSSHover = (function(){
// regular expressions, used and explained later on.
- var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i,
- REG_AFFECTED = /(.*?)\:(hover|active|focus)/i,
- REG_PSEUDO = /[^:]+:([a-z-]+).*/i,
- REG_SELECT = /(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi,
- REG_CLASS = /\.([a-z0-9_-]*on(hover|active|focus))/i,
- REG_MSIE = /msie (5|6|7)/i,
- REG_COMPAT = /backcompat/i;
+ var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
+ var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
+ var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
+ var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
+ var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
+ var REG_MSIE = /msie (5|6|7)/i;
+ var REG_COMPAT = /backcompat/i;
+
+ // property mapping, real css properties must be used in order to clear expressions later on...
+ // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
+ // set an expression, and are then restored to the most likely correct value.
+ var Properties = {
+ index: 0,
+ list: ['text-kashida', 'text-kashida-space', 'text-justify'],
+ get: function() {
+ return this.list[(this.index++)%this.list.length];
+ }
+ };
- // css prefix, a leading dash would be nice (spec), but IE6 doesn't like that.
- var CSSHOVER_PREFIX = 'csh-';
+ // camelize is used to convert css properties from (eg) text-kashida to textKashida
+ var camelize = function(str) {
+ return str.replace(/-(.)/mg, function(result, match){
+ return match.toUpperCase();
+ });
+ };
/**
* Local CSSHover object
@@ -52,7 +69,9 @@ window.CSSHover = (function(){
init:function() {
// don't run in IE8 standards; expressions don't work in standards mode anyway,
// and the stuff we're trying to fix should already work properly
- if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) return;
+ if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
+ return;
+ }
// start parsing the existing stylesheets
var sheets = window.document.styleSheets, l = sheets.length;
@@ -66,26 +85,25 @@ window.CSSHover = (function(){
// check sheet imports and parse those recursively
if(sheet.imports) {
try {
- var imports = sheet.imports, l = imports.length;
+ var imports = sheet.imports;
+ var l = imports.length;
for(var i=0; i<l; i++) {
this.parseStylesheet(sheet.imports[i]);
}
} catch(securityException){
- // trycatch for various possible errors,
- // todo; might need to be placed inside the for loop, since an error
- // on an import stops following imports from being processed.
+ // trycatch for various possible errors
}
}
// interate the sheet's rules and send them to the parser
try {
- var rules = sheet.rules, l = rules.length;
- for(var j=0; j<l; j++) {
+ var rules = sheet.rules;
+ var r = rules.length;
+ for(var j=0; j<r; j++) {
this.parseCSSRule(rules[j], sheet);
}
- } catch(securityException){
- // trycatch for various errors, most likely accessing the sheet's rules,
- // don't see how individual rules would throw errors, but you never know.
+ } catch(someException){
+ // trycatch for various errors, most likely accessing the sheet's rules.
}
},
@@ -98,39 +116,40 @@ window.CSSHover = (function(){
// only parse a rule if it contains an interactive pseudo.
var select = rule.selectorText;
if(REG_INTERACTIVE.test(select)) {
- var style = rule.style.cssText,
+ var style = rule.style.cssText;
- // affected elements are found by truncating the selector after the interactive pseudo,
- // eg: "div li:hover" >> "div li"
- affected = REG_AFFECTED.exec(select)[1],
+ // affected elements are found by truncating the selector after the interactive pseudo,
+ // eg: "div li:hover" >> "div li"
+ var affected = REG_AFFECTED.exec(select)[1];
- // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
- // eg: "li:hover" >> "onhover"
- pseudo = select.replace(REG_PSEUDO, 'on$1'),
+ // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+ // eg: "li:hover" >> "onhover"
+ var pseudo = select.replace(REG_PSEUDO, 'on$1');
- // the new selector is going to use that classname in a new css rule,
- // since IE6 doesn't support multiple classnames, this is merged into one classname
- // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
- newSelect = select.replace(REG_SELECT, '.$2' + pseudo),
+ // the new selector is going to use that classname in a new css rule,
+ // since IE6 doesn't support multiple classnames, this is merged into one classname
+ // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
+ var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
- // the classname is needed for the events that are going to be set on affected nodes
- // eg: "li.folder:hover" >> "folderonhover"
- className = REG_CLASS.exec(newSelect)[1];
+ // the classname is needed for the events that are going to be set on affected nodes
+ // eg: "li.folder:hover" >> "folderonhover"
+ var className = REG_CLASS.exec(newSelect)[1];
// no need to set the same callback more than once when the same selector uses the same classname
var hash = affected + className;
if(!this.callbacks[hash]) {
-
- // affected elements are given an expression under a fake css property, the classname is used
- // because a unique name (eg "behavior:") would be overruled (in IE6, not 7) by a following rule
- // selecting the same element. The expression does a callback to CSSHover.patch, rerouted via the
- // exposed window.CSSHover function.
+
+ // affected elements are given an expression under a borrowed css property, because fake properties
+ // can't have their expressions cleared. Different properties are used per pseudo, to avoid
+ // expressions from overwriting eachother. The expression does a callback to CSSHover.patch,
+ // rerouted via the exposed window.CSSHover function.
+ var property = Properties.get();
+ var atRuntime = camelize(property);
// because the expression is added to the stylesheet, and styles are always applied to html that is
// dynamically added to the dom, the expression will also trigger for those new elements (provided
// they are selected by the affected selector).
-
- sheet.addRule(affected, CSSHOVER_PREFIX + className + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'"))');
+ sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
// hash it, so an identical selector/class combo does not duplicate the expression
this.callbacks[hash] = true;
@@ -142,18 +161,23 @@ window.CSSHover = (function(){
},
// called via the expression, patches individual nodes
- patch:function(node, type, className) {
-
- // the patch's type is returned to the expression. That way the expression property
- // can be found and removed, to stop it from calling patch over and over.
- // The if will fail the first time, since the expression has not yet received a value.
- var property = CSSHOVER_PREFIX + className;
- if(node.style[property]) {
- node.style[property] = null;
- }
+ patch:function(node, type, className, property) {
+ // restores the borrowed css property to the value of its immediate parent, clearing
+ // the expression so that it's not repeatedly called.
+ try {
+ var value = node.parentNode.currentStyle[property];
+ node.style[property] = value;
+ } catch(e) {
+ // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
+ // this will also stop the expression.
+ node.runtimeStyle[property] = '';
+ }
+
// just to make sure, also keep track of patched classnames locally on the node
- if(!node.csshover) node.csshover = [];
+ if(!node.csshover) {
+ node.csshover = [];
+ }
// and check for it to prevent duplicate events with the same classname from being set
if(!node.csshover[className]) {
@@ -189,11 +213,6 @@ window.CSSHover = (function(){
}
};
- // add the unload to the onbeforeunload event
- window.attachEvent('onbeforeunload', function(){
- CSSHover.unload();
- });
-
/**
* CSSHoverElement
* --------------------------
@@ -241,15 +260,20 @@ window.CSSHover = (function(){
}
};
+ // add the unload to the onbeforeunload event
+ window.attachEvent('onbeforeunload', function(){
+ CSSHover.unload();
+ });
+
/**
* Public hook
* --------------------------
*/
- return function(node, type, className) {
+ return function(node, type, className, property) {
if(node) {
// called via the css expression; patches individual nodes
- return CSSHover.patch(node, type, className);
+ return CSSHover.patch(node, type, className, property);
} else {
// called ondomcontentready via the public:attach node
CSSHover.init();
@@ -257,6 +281,4 @@ window.CSSHover = (function(){
};
})();
-
-// ]]>
</script> \ No newline at end of file
diff --git a/skins/vector/csshover.min.htc b/skins/vector/csshover.min.htc
new file mode 100644
index 00000000..7e5c57b3
--- /dev/null
+++ b/skins/vector/csshover.min.htc
@@ -0,0 +1,12 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * http://www.xs4all.nl/~peterned/
+ *
+ * Copyright (c) 2009 Peter Nederlof
+ * Licensed under the LGPL license
+ * http://creativecommons.org/licenses/LGPL/2.1
+ */
+window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
+</script>
diff --git a/skins/vector/experiments/babaco-colors-a.css b/skins/vector/experiments/babaco-colors-a.css
deleted file mode 100644
index ce6f67dd..00000000
--- a/skins/vector/experiments/babaco-colors-a.css
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Babaco Color Scheme A */
-
-
-a:visited,
-a:visited div.vectorTabs li.selected a:visited span {
- color: #260e9c;
-}
-
-html .thumbimage,
-#toc, .toc, .mw-warning, div.thumbinner {
- border-color: #cccccc;
- background-color: #f7f7f7;
-}
-
-/* Framework */
-#mw-page-base {
- background-color: inherit !important;
- background-image: none !important;
-}
-body {
- background-color: #f9f9f9 !important;
- background-image:url(images/page-base-updated.png);
-}
-
-/* Links */
-a {
- color: #0066cc;
-}
-a:visited {
- color: #004d99;
-}
-a:active {
- color: #ff6600;
-}
-a.stub {
- color: #56228b;
-}
-a.new, #p-personal a.new {
- color: #a31205 !important;
-}
-a.new:visited, #p-personal a.new:visited {
- color: #a31205;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- border-color:#999999;
- font-family:georgia, times, serif;
- font-weight:bold;
-}
-#firstHeading {
- font-size:1.5em;
-}
-h2 .editsection,
-.portal h5{
- font-family:sans-serif;
- font-weight:normal;
-
-}
-#toc h2, .toc h2 {
- font-family:sans-serif;
- font-weight:normal;
-}
-body #mw-panel div.portal div.body {
- background-image:url(images/new-portal-break-ltr.png);
-}
-body.rtl #mw-panel div.portal div.body {
- background-image:url(images/new-portal-break-rtl.png);
-}
-body div.vectorTabs li a, div.vectorTabs li a span{
- color:#4d4d4d;
-}
-body div.vectorTabs li.selected a,
-body div.vectorTabs li.selected a span,
-body div.vectorTabs li.selected a:visited
-body div.vectorTabs li.selected a:visited span {
- color: #ff9900 !important;
- font-weight:bold;
-}
-div.vectorTabs li.new a,
-div.vectorTabs li.new a span,
-div.vectorTabs li.new a:visited,
-div.vectorTabs li.new a:visited span {
- color:#a31205;
-}
-#toc,
-.toc,
-.mw-warning,
-div.gallerybox div.thumb,
-table.gallery,
-#preferences fieldset.prefsection fieldset,
-#preferences,
-html .thumbimage,
-.usermessage,
-img.thumbborder,
-div.thumbinner{
- border: 1px solid #cccccc;
- background-color: #f7f7f7;
-}
-#mw-panel div.portal h5 {
- font-weight:bold;
- margin-bottom:0;
- padding-bottom:0.05em;
- color:#000000;
-}
diff --git a/skins/vector/experiments/babaco-colors-b.css b/skins/vector/experiments/babaco-colors-b.css
deleted file mode 100644
index 227e197c..00000000
--- a/skins/vector/experiments/babaco-colors-b.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Babaco Color Scheme A */
-
-
-html .thumbimage,
-#toc, .toc, .mw-warning, div.thumbinner {
- border-color: #cccccc;
- background-color: #f7f7f7;
-}
-
-/* Framework */
-#mw-page-base {
- background-color: inherit !important;
- background-image: none !important;
-}
-body {
- background-color: #f9f9f9 !important;
- background-image:url(images/page-base-updated.png);
-}
-/* Links */
-a {
- color: #003cb3;
-}
-a.stub {
- color: #772233;
-}
-a.new, #p-personal a.new {
- color: #a31205 !important;
-}
-{
- color: #260e9c;
-}
-a:visited,
-a:visited div.vectorTabs li.selected a:visited span,
-a.new:visited,
-#p-personal a.new:visited {
- color: #260e9c;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- border-color:#999999;
-}
-
-div.vectorTabs li.new a,
-div.vectorTabs li.new a span,
-div.vectorTabs li.new a:visited,
-div.vectorTabs li.new a:visited span {
- color:#a31205;
-}
-
-#toc,
-.toc,
-.mw-warning,
-div.gallerybox div.thumb,
-table.gallery,
-#preferences fieldset.prefsection fieldset,
-#preferences,
-html .thumbimage,
-.usermessage,
-img.thumbborder,
-div.thumbinner{
- border: 1px solid #cccccc;
- background-color: #f7f7f7;
-}
diff --git a/skins/vector/experiments/babaco-colors-c.css b/skins/vector/experiments/babaco-colors-c.css
deleted file mode 100644
index d2dabf7d..00000000
--- a/skins/vector/experiments/babaco-colors-c.css
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Babaco Color Scheme C */
-
-/* ridding ourselves of the gradient */
-#mw-page-base {
- background-color: inherit !important;
- background-image: none !important;
-}
-
-a:visited,
-a:visited div.vectorTabs li.selected a:visited span {
- color: #260e9c;
-}
-
-html .thumbimage,
-#toc, .toc, .mw-warning, div.thumbinner {
- border-color: #cccccc;
- background-color: #f7f7f7;
-}
-
-/* Framework */
-body {
- background-color: #f9f9f9 !important;
- background-image:url(images/page-base-updated.png);
-}
-
-/* Links */
-a {
- color: #0066cc;
-}
-a:visited {
- color: #004d99;
-}
-a:active {
- color: #ff6600;
-}
-a.stub {
- color: #56228b;
-}
-a.new, #p-personal a.new {
- color: #a31205 !important;
-}
-a.new:visited, #p-personal a.new:visited {
- color: #a31205;
-}
-
-#firstHeading {
- font-size:1.5em;
-}
-h2 .editsection,
-.portal h5 {
- font-weight:normal;
-}
-#toc h2, .toc h2 {
- font-weight:normal;
-}
-body #mw-panel div.portal div.body {
- background-image:url(images/new-portal-break-ltr.png);
-}
-
-div.vectorTabs li.new a,
-div.vectorTabs li.new a span,
-div.vectorTabs li.new a:visited,
-div.vectorTabs li.new a:visited span {
- color:#a31205;
-}
-#toc,
-.toc,
-.mw-warning,
-div.gallerybox div.thumb,
-table.gallery,
-#preferences fieldset.prefsection fieldset,
-#preferences,
-html .thumbimage,
-.usermessage,
-img.thumbborder,
-div.thumbinner {
- border: 1px solid #cccccc;
- background-color: #f7f7f7;
-}
-#mw-panel div.portal h5 {
- font-weight:bold;
- margin-bottom:0;
- padding-bottom:0.05em;
- color:#000000;
-}
-div.vectorTabs li.selected a,
-div.vectorTabs li.selected a span,
-div.vectorTabs li.selected a:visited
-div.vectorTabs li.selected a:visited span {
- color: #333333 !important;
-} \ No newline at end of file
diff --git a/skins/vector/experiments/images/new-border.png b/skins/vector/experiments/images/new-border.png
deleted file mode 100644
index 735324ef..00000000
--- a/skins/vector/experiments/images/new-border.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/new-portal-break-ltr.png b/skins/vector/experiments/images/new-portal-break-ltr.png
deleted file mode 100644
index cd8f3b15..00000000
--- a/skins/vector/experiments/images/new-portal-break-ltr.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/new-portal-break-rtl.png b/skins/vector/experiments/images/new-portal-break-rtl.png
deleted file mode 100644
index 45c5b2f9..00000000
--- a/skins/vector/experiments/images/new-portal-break-rtl.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/page-base-fade.png b/skins/vector/experiments/images/page-base-fade.png
deleted file mode 100644
index dc631823..00000000
--- a/skins/vector/experiments/images/page-base-fade.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/page-base-updated.png b/skins/vector/experiments/images/page-base-updated.png
deleted file mode 100644
index 54ffeb00..00000000
--- a/skins/vector/experiments/images/page-base-updated.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/tab-active-first.png b/skins/vector/experiments/images/tab-active-first.png
deleted file mode 100644
index e4c39c42..00000000
--- a/skins/vector/experiments/images/tab-active-first.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/tab-active-last.png b/skins/vector/experiments/images/tab-active-last.png
deleted file mode 100644
index a96f3916..00000000
--- a/skins/vector/experiments/images/tab-active-last.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/tab-fade.png b/skins/vector/experiments/images/tab-fade.png
deleted file mode 100644
index 1eb0e23b..00000000
--- a/skins/vector/experiments/images/tab-fade.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/tab-first.png b/skins/vector/experiments/images/tab-first.png
deleted file mode 100644
index 439b713f..00000000
--- a/skins/vector/experiments/images/tab-first.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/tab-last.png b/skins/vector/experiments/images/tab-last.png
deleted file mode 100644
index 08e283dd..00000000
--- a/skins/vector/experiments/images/tab-last.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/images/tab-new-fade.png b/skins/vector/experiments/images/tab-new-fade.png
deleted file mode 100644
index 44925505..00000000
--- a/skins/vector/experiments/images/tab-new-fade.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/experiments/new-tabs.css b/skins/vector/experiments/new-tabs.css
deleted file mode 100644
index e3850e8e..00000000
--- a/skins/vector/experiments/new-tabs.css
+++ /dev/null
@@ -1,322 +0,0 @@
-/* new border color */
-#content {
- background-image: url(images/new-border.png);
-}
-
-#footer {
- background-image: url(images/new-border.png);
-}
- body div#left-navigation,
- body div#right-navigation {
- top:3.2em;
- }
- body div#right-navigation {
- margin-top:3.2em;
- }
- body #p-search form,
- body #p-search input,
- body #simpleSearch {
- margin-top:0;
- }
- body div#p-cactions {
- margin-top:0;
- }
- /* Namespaces and Views */
- /* @noflip */
- div.vectorTabs {
- float: left;
- }
- body div.vectorTabs {
- background-image: none;
- padding-left: 0;
- }
- /* @noflip */
- div.vectorTabs ul {
- float: left;
- }
- div.vectorTabs ul {
- height: 100%;
- list-style: none;
- background-image:none;
- margin: 0;
- padding: 0;
- }
- /* @noflip */
- div.vectorTabs ul li {
- float: left;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- body div.vectorTabs ul li {
- line-height: 1em;
- display: inline-block;
- height: 2em;
- margin: 0 1px 0 0;
- padding: 0;
- background:none;
- overflow:hidden;
- white-space:nowrap;
- }
- /* IGNORED BY IE6 */
- div.vectorTabs ul > li {
- display: block;
- }
- body div.vectorTabs li.selected {
- background-image: none;
- border:none;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- body div.vectorTabs li a {
- border-top:1px solid #cccccc;
- border-left:1px solid #cccccc;
- border-right:1px solid #cccccc;
- display: inline-block;
- height: 1.7em;
- padding-left: 0.6em;
- padding-right: 0.6em;
- background-image:url(images/tab-fade.png);
- background-position:bottom left;
- background-repeat:repeat-x;
- background-color:#ffffff;
- }
- body div.vectorTabs li.new a{
- background-image:url(images/tab-new-fade.png);
-
- }
- div.vectorTabs li a,
- div.vectorTabs li a span {
- cursor: pointer;
- }
- div.vectorTabs li a span {
- font-size: 0.8em;
- }
- /* IGNORED BY IE6 */
- div.vectorTabs li > a {
- display: block;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- body div.vectorTabs a span {
- display: inline-block;
- padding-top: 0.5em;
- }
- /* IGNORED BY IE6 */
- /* @noflip */
- div.vectorTabs a > span {
- float: left;
- display: block;
- }
- body div.vectorTabs li.last {
- background-image: url(images/tab-last.png);
- background-repeat:no-repeat;
- background-position:top right;
- border:none;
- }
- body div.vectorTabs li.last a {
- margin-right:7px;
- padding-left:0.4em;
- padding-right:0;
- border-left:1px solid #cccccc;
- border-top:1px solid #cccccc;
- border-right:none;
- background-image:url(images/tab-fade.png);
- background-position:top left;
- background-repeat:repeat-x;
- }
- body div.vectorTabs li.first {
- background-image: url(images/tab-first.png);
- background-repeat:no-repeat;
- background-position:top left;
- border:none;
- }
- body div.vectorTabs li.first a {
- margin-left:7px;
- padding-left:0em;
- padding-right:0.4em;
- border-right:1px solid #cccccc;
- border-top:1px solid #cccccc;
- background-image:url(images/tab-fade.png);
- background-position:top left;
- background-repeat:repeat-x;
- }
-
- div.vectorTabs li.selected a,
- div.vectorTabs li.selected a span,
- div.vectorTabs li.selected a:visited
- div.vectorTabs li.selected a:visited span {
- color: #be5900 !important;
- text-decoration: none;
- }
-
- body div.vectorTabs li.selected a {
- border-top:1px solid #6cc8f3;
- border-right:1px solid #6cc8f3;
- border-left:1px solid #6cc8f3;
- background-color:#fff;
- height:1.75em;
- background-image:none;
- }
- body div.vectorTabs li.selected.first {
- background-image: url(images/tab-active-first.png);
- background-repeat:no-repeat;
- background-position:top left;
- }
- body div.vectorTabs li.selected.first a {
- margin-left:7px;
- padding-right:0.6em;
- padding-left:0.4em;
- border-left:none;
- }
- body div.vectorTabs li.selected.last {
- background-image: url(images/tab-active-last.png);
- background-repeat:no-repeat;
- background-position:top right;
- }
- body div.vectorTabs li.selected.last a {
- margin-right:7px;
- padding-left:0.6em;
- padding-right:0.4em;
- border-right:none;
- }
-
- /* Variants and Actions */
- /* @noflip */
- div.vectorMenu {
- background-image:url(images/tab-fade.png);
- background-position:bottom left;
- background-repeat:repeat-x;
- border-top:1px solid #cccccc;
- border-left:1px solid #cccccc;
- border-right:1px solid #cccccc;
- }
- body.rtl div.vectorMenu {
- direction: rtl;
- }
- /* @noflip */
- body #mw-head div.vectorMenu h5 {
- background-image: url(../images/arrow-down-icon.png);
- background-position: center center;
- background-repeat: no-repeat;
- padding-left: 0;
- margin-left: 0px;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- body div.vectorMenu h5 a {
- display: inline-block;
- width: 24px;
- height:1.5em;
- background-image: none !important;
-
- }
- /* IGNORED BY IE6 */
- div.vectorMenu h5 > a {
- display: block;
- }
- div.vectorMenu div.menu {
- position: relative;
- left:1px;
- display: none;
- clear: both;
- text-align: left;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- body.rtl div.vectorMenu div.menu {
- margin-right: 24px;
- }
- /* IGNORED BY IE6 */
- body.rtl div.vectorMenu > div.menu {
- margin-right: auto;
- }
- /* Fixes old versions of FireFox */
- body.rtl div.vectorMenu > div.menu,
- x:-moz-any-link {
- margin-right: 24px;
- }
- div.vectorMenu:hover div.menu {
- display: block;
- }
- div.vectorMenu ul {
- position: absolute;
- background-color: white;
- border: solid 1px silver;
- border-top-width: 0;
- list-style: none;
- list-style-image: none;
- list-style-type: none;
- padding: 0;
- margin: 0;
- margin-left: -1px;
- text-align: left;
- }
- /* Fixes old versions of FireFox */
- div.vectorMenu ul,
- x:-moz-any-link {
- min-width: 5em;
- }
- /* Returns things back to normal in modern versions of FireFox */
- div.vectorMenu ul,
- x:-moz-any-link,
- x:default {
- min-width: 0;
- }
- div.vectorMenu li {
- padding: 0;
- margin: 0;
- text-align: left;
- line-height: 1em;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- div.vectorMenu li a {
- display: inline-block;
- padding: 0.5em;
- white-space: nowrap;
- }
- /* IGNORED BY IE6 */
- div.vectorMenu li > a {
- display: block;
- }
- div.vectorMenu li a {
- color: #0645ad;
- cursor: pointer;
- font-size: 0.8em;
- }
- div.vectorMenu li.selected a,
- div.vectorMenu li.selected a:visited {
- color: #333333;
- text-decoration: none;
- }
-#ca-unwatch.icon,
-#ca-watch.icon {
- background-color:#ffffff;
- height:1.75em !important;
- background-image:url(images/tab-fade.png);
- background-position:bottom left;
- background-repeat:repeat-x;
-}
-#ca-unwatch.icon a,
-#ca-watch.icon a {
- height: 1.7em !important;
- border-bottom:none;
- background-color:transparent;
-}
-#ca-watch.icon a,
-#ca-unwatch.icon a {
- background-repeat:no-repeat;
-}
-.wikiEditor-ui-tabs {
- border: none;
- height: 2.15em;
-}
-.wikiEditor-ui-buttons {
- height: 2.15em;
-}
-.wikiEditor-ui-tabs div {
- border: 1px solid silver;
- margin-right: 1px;
- height: 2.15em;
-}
-.wikiEditor-ui-tabs div a {
- line-height: 2.15em;
- background: #FFFFFF url(images/tab-fade.png) repeat-x 0 100%;
-}
-.wikiEditor-ui-tabs div.current a {
- background: #FFFFFF;
-}
diff --git a/skins/vector/images/arrow-down-icon.png b/skins/vector/images/arrow-down-icon.png
index bf2d4fb4..437b9518 100644
--- a/skins/vector/images/arrow-down-icon.png
+++ b/skins/vector/images/arrow-down-icon.png
Binary files differ
diff --git a/skins/vector/images/audio-icon.png b/skins/vector/images/audio-icon.png
index 0f59a2bb..ffd0b1c2 100644
--- a/skins/vector/images/audio-icon.png
+++ b/skins/vector/images/audio-icon.png
Binary files differ
diff --git a/skins/vector/images/border.png b/skins/vector/images/border.png
index 54b47922..6e3330ff 100644
--- a/skins/vector/images/border.png
+++ b/skins/vector/images/border.png
Binary files differ
diff --git a/skins/vector/images/bullet-icon.png b/skins/vector/images/bullet-icon.png
index e304b267..c4c44382 100644
--- a/skins/vector/images/bullet-icon.png
+++ b/skins/vector/images/bullet-icon.png
Binary files differ
diff --git a/skins/vector/images/document-icon.png b/skins/vector/images/document-icon.png
index 91dc16f6..7b68120a 100644
--- a/skins/vector/images/document-icon.png
+++ b/skins/vector/images/document-icon.png
Binary files differ
diff --git a/skins/vector/images/edit-icon.png b/skins/vector/images/edit-icon.png
index 4a962767..92153e8e 100644
--- a/skins/vector/images/edit-icon.png
+++ b/skins/vector/images/edit-icon.png
Binary files differ
diff --git a/skins/vector/images/external-link-ltr-icon.png b/skins/vector/images/external-link-ltr-icon.png
index 4b710b03..fe642b5c 100644
--- a/skins/vector/images/external-link-ltr-icon.png
+++ b/skins/vector/images/external-link-ltr-icon.png
Binary files differ
diff --git a/skins/vector/images/external-link-rtl-icon.png b/skins/vector/images/external-link-rtl-icon.png
index 17df03a3..01e0d798 100644
--- a/skins/vector/images/external-link-rtl-icon.png
+++ b/skins/vector/images/external-link-rtl-icon.png
Binary files differ
diff --git a/skins/vector/images/file-icon.png b/skins/vector/images/file-icon.png
index 1261f00c..8a4baf2c 100644
--- a/skins/vector/images/file-icon.png
+++ b/skins/vector/images/file-icon.png
Binary files differ
diff --git a/skins/vector/images/link-icon.png b/skins/vector/images/link-icon.png
index fc77e81d..469fd2b4 100644
--- a/skins/vector/images/link-icon.png
+++ b/skins/vector/images/link-icon.png
Binary files differ
diff --git a/skins/vector/images/lock-icon.png b/skins/vector/images/lock-icon.png
index 9e63807a..46b72f52 100644
--- a/skins/vector/images/lock-icon.png
+++ b/skins/vector/images/lock-icon.png
Binary files differ
diff --git a/skins/vector/images/mail-icon.png b/skins/vector/images/mail-icon.png
index 50de0781..a8ad2fd7 100644
--- a/skins/vector/images/mail-icon.png
+++ b/skins/vector/images/mail-icon.png
Binary files differ
diff --git a/skins/vector/images/news-icon.png b/skins/vector/images/news-icon.png
index 8ab49957..bb03a892 100644
--- a/skins/vector/images/news-icon.png
+++ b/skins/vector/images/news-icon.png
Binary files differ
diff --git a/skins/vector/images/page-base.png b/skins/vector/images/page-base.png
index 17d02a74..be760917 100644
--- a/skins/vector/images/page-base.png
+++ b/skins/vector/images/page-base.png
Binary files differ
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
index 815a0486..2b08cfe2 100644
--- a/skins/vector/images/page-fade.png
+++ b/skins/vector/images/page-fade.png
Binary files differ
diff --git a/skins/vector/images/portal-break-ltr.png b/skins/vector/images/portal-break-ltr.png
index c1823705..76ca4915 100644
--- a/skins/vector/images/portal-break-ltr.png
+++ b/skins/vector/images/portal-break-ltr.png
Binary files differ
diff --git a/skins/vector/images/portal-break-rtl.png b/skins/vector/images/portal-break-rtl.png
index a45144c0..773792aa 100644
--- a/skins/vector/images/portal-break-rtl.png
+++ b/skins/vector/images/portal-break-rtl.png
Binary files differ
diff --git a/skins/vector/images/portal-break.png b/skins/vector/images/portal-break.png
index e81b5597..5feaa459 100644
--- a/skins/vector/images/portal-break.png
+++ b/skins/vector/images/portal-break.png
Binary files differ
diff --git a/skins/vector/images/preferences-base.png b/skins/vector/images/preferences-base.png
index adfd70d7..947895f1 100644
--- a/skins/vector/images/preferences-base.png
+++ b/skins/vector/images/preferences-base.png
Binary files differ
diff --git a/skins/vector/images/preferences-edge.png b/skins/vector/images/preferences-edge.png
index 3da0d099..e6a9a480 100644
--- a/skins/vector/images/preferences-edge.png
+++ b/skins/vector/images/preferences-edge.png
Binary files differ
diff --git a/skins/vector/images/preferences-fade.png b/skins/vector/images/preferences-fade.png
index b4773c5c..3aa30bb9 100644
--- a/skins/vector/images/preferences-fade.png
+++ b/skins/vector/images/preferences-fade.png
Binary files differ
diff --git a/skins/vector/images/search-fade.png b/skins/vector/images/search-fade.png
index 53461d6d..e96f6678 100644
--- a/skins/vector/images/search-fade.png
+++ b/skins/vector/images/search-fade.png
Binary files differ
diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png
index 81155562..95be27b5 100644
--- a/skins/vector/images/tab-break.png
+++ b/skins/vector/images/tab-break.png
Binary files differ
diff --git a/skins/vector/images/tab-current-fade.png b/skins/vector/images/tab-current-fade.png
index c6238d26..fb3a2cb6 100644
--- a/skins/vector/images/tab-current-fade.png
+++ b/skins/vector/images/tab-current-fade.png
Binary files differ
diff --git a/skins/vector/images/tab-normal-fade.png b/skins/vector/images/tab-normal-fade.png
index 4a5e3e4a..fcee0dfb 100644
--- a/skins/vector/images/tab-normal-fade.png
+++ b/skins/vector/images/tab-normal-fade.png
Binary files differ
diff --git a/skins/vector/images/talk-icon.png b/skins/vector/images/talk-icon.png
index 0b80ee91..12862a09 100644
--- a/skins/vector/images/talk-icon.png
+++ b/skins/vector/images/talk-icon.png
Binary files differ
diff --git a/skins/vector/images/user-icon.png b/skins/vector/images/user-icon.png
index ac3d59d5..2fbfe4e5 100644
--- a/skins/vector/images/user-icon.png
+++ b/skins/vector/images/user-icon.png
Binary files differ
diff --git a/skins/vector/images/video-icon.png b/skins/vector/images/video-icon.png
index 5e7f4af7..06bc9b64 100644
--- a/skins/vector/images/video-icon.png
+++ b/skins/vector/images/video-icon.png
Binary files differ
diff --git a/skins/vector/images/watch-icons.png b/skins/vector/images/watch-icons.png
index 54b2c793..a2871626 100644
--- a/skins/vector/images/watch-icons.png
+++ b/skins/vector/images/watch-icons.png
Binary files differ
diff --git a/skins/vector/main-rtl.css b/skins/vector/main-rtl.css
deleted file mode 100644
index 5387289f..00000000
--- a/skins/vector/main-rtl.css
+++ /dev/null
@@ -1,1128 +0,0 @@
-/*
- * main-rtl.css is automatically generated using CSSJanus, a python script for
- * creating RTL versions of otherwise LTR stylesheets.
- *
- * You may download the tool to rebuild this stylesheet
- * http://code.google.com/p/cssjanus/
- *
- * An online version of this tool can be used at:
- * http://cssjanus.commoner.com/
- *
- * The following command is used to generate the RTL version of this file
- * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
- *
- * Any rules which should not be flipped should be prepended with @noflip in
- * a comment block.
- */
-/* Framework */
-html,
-body {
- height: 100%;
- margin: 0;
- padding: 0;
- font-family: sans-serif;
- font-size: 1em;
-}
-body {
- background-color: #f3f3f3;
- background-image: url(images/page-base.png);
-}
-/* Content */
-#content {
- margin-right: 10em;
- padding: 1em;
- background-image: url(images/border.png);
- background-position: top right;
- background-repeat: repeat-y;
- background-color: white;
-}
-/* Head */
-#mw-page-base {
- height: 5em;
- background-color: white;
- background-image: url(images/page-fade.png);
- background-position: bottom right;
- background-repeat: repeat-x;
-}
-#mw-head-base {
- margin-top: -5em;
- margin-right: 10em;
- height: 5em;
- background-image: url(images/border.png);
- background-position: bottom right;
- background-repeat: repeat-x;
-}
-#mw-head {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
-}
-#mw-head h5 {
- margin: 0;
- padding: 0;
-}
- /* Hide empty portlets */
- div.emptyPortlet {
- display: none;
- }
- /* Personal */
- #p-personal {
- position: absolute;
- top: 0;
- margin-right: 10em;
- left: 0.75em;
- }
- #p-personal h5 {
- display: none;
- }
- #p-personal ul {
- list-style: none;
- margin: 0;
- padding: 0;
- }
- /* @noflip */
- #p-personal li {
- line-height: 1.125em;
- float: left;
- }
- #p-personal li {
- margin-right: 0.75em;
- margin-top: 0.5em;
- font-size: 0.75em;
- }
- /* Navigation Containers */
- #left-navigation {
- position: absolute;
- right: 10em;
- top: 2.5em;
- }
- #right-navigation {
- float: left;
- margin-top: 2.5em;
- }
- /* Navigation Labels */
- div.vectorTabs h5,
- div.vectorMenu h5 span {
- display: none;
- }
- /* Namespaces and Views */
- /* @noflip */
- div.vectorTabs {
- float: left;
- }
- div.vectorTabs {
- background-image: url(images/tab-break.png);
- background-position: bottom right;
- background-repeat: no-repeat;
- padding-right: 1px;
- }
- /* @noflip */
- div.vectorTabs ul {
- float: left;
- }
- div.vectorTabs ul {
- height: 100%;
- list-style: none;
- margin: 0;
- padding: 0;
- }
- /* @noflip */
- div.vectorTabs ul li {
- float: left;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- div.vectorTabs ul li {
- line-height: 1.125em;
- display: inline-block;
- height: 100%;
- margin: 0;
- padding: 0;
- background-color: #f3f3f3;
- background-image: url(images/tab-normal-fade.png);
- background-position: bottom right;
- background-repeat: repeat-x;
- white-space:nowrap;
- }
- /* IGNORED BY IE6 */
- div.vectorTabs ul > li {
- display: block;
- }
- div.vectorTabs li.selected {
- background-image: url(images/tab-current-fade.png);
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- div.vectorTabs li a {
- display: inline-block;
- height: 2.5em;
- padding-right: 0.4em;
- padding-left: 0.4em;
- background-image: url(images/tab-break.png);
- background-position: bottom left;
- background-repeat: no-repeat;
- }
- div.vectorTabs li a,
- div.vectorTabs li a span {
- color: #0645ad;
- cursor: pointer;
- }
- div.vectorTabs li a span {
- font-size: 0.8em;
- }
- /* IGNORED BY IE6 */
- div.vectorTabs li > a {
- display: block;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- div.vectorTabs a span {
- display: inline-block;
- padding-top: 1.25em;
- }
- /* IGNORED BY IE6 */
- /* @noflip */
- div.vectorTabs a > span {
- float: left;
- display: block;
- }
- div.vectorTabs li.selected a,
- div.vectorTabs li.selected a span,
- div.vectorTabs li.selected a:visited
- div.vectorTabs li.selected a:visited span {
- color: #333333;
- text-decoration: none;
- }
- div.vectorTabs li.new a,
- div.vectorTabs li.new a span,
- div.vectorTabs li.new a:visited,
- div.vectorTabs li.new a:visited span {
- color: #a55858;
- }
- /* Variants and Actions */
- /* @noflip */
- div.vectorMenu {
- direction: ltr;
- float: left;
- background-image: url(images/arrow-down-icon.png);
- background-position: center center;
- background-repeat: no-repeat;
- }
- /* @noflip */
- body.rtl div.vectorMenu {
- direction: rtl;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- /* @noflip */
- #mw-head div.vectorMenu h5 {
- float: left;
- background-image: url(images/tab-break.png);
- background-repeat: no-repeat;
- }
- /* IGNORED BY IE6 */
- #mw-head div.vectorMenu > h5 {
- background-image: none;
- }
- #mw-head div.vectorMenu h5 {
- background-position: bottom right;
- margin-right: -1px;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- /* @noflip */
- div.vectorMenu h5 a {
- display: inline-block;
- width: 24px;
- height: 2.5em;
- text-decoration: none;
- background-image: url(images/tab-break.png);
- background-repeat: no-repeat;
- }
- div.vectorMenu h5 a{
- background-position: bottom left;
- }
- /* IGNORED BY IE6 */
- div.vectorMenu h5 > a {
- display: block;
- }
- div.vectorMenu div.menu {
- position: relative;
- display: none;
- clear: both;
- text-align: right;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- /* @noflip */
- body.rtl div.vectorMenu div.menu {
- margin-left: 24px;
- }
- /* IGNORED BY IE6 */
- /* @noflip */
- body.rtl div.vectorMenu > div.menu {
- margin-left: auto;
- }
- /* Fixes old versions of FireFox */
- /* @noflip */
- body.rtl div.vectorMenu > div.menu,
- x:-moz-any-link {
- margin-left: 23px;
- }
- div.vectorMenu:hover div.menu {
- display: block;
- }
- div.vectorMenu ul {
- position: absolute;
- background-color: white;
- border: solid 1px silver;
- border-top-width: 0;
- list-style: none;
- list-style-image: none;
- list-style-type: none;
- padding: 0;
- margin: 0;
- margin-right: -1px;
- text-align: right;
- }
- /* Fixes old versions of FireFox */
- div.vectorMenu ul,
- x:-moz-any-link {
- min-width: 5em;
- }
- /* Returns things back to normal in modern versions of FireFox */
- div.vectorMenu ul,
- x:-moz-any-link,
- x:default {
- min-width: 0;
- }
- div.vectorMenu li {
- padding: 0;
- margin: 0;
- text-align: right;
- line-height: 1em;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- div.vectorMenu li a {
- display: inline-block;
- padding: 0.5em;
- white-space: nowrap;
- }
- /* IGNORED BY IE6 */
- div.vectorMenu li > a {
- display: block;
- }
- div.vectorMenu li a {
- color: #0645ad;
- cursor: pointer;
- font-size: 0.8em;
- }
- div.vectorMenu li.selected a,
- div.vectorMenu li.selected a:visited {
- color: #333333;
- text-decoration: none;
- }
- /* Search */
- #p-search h5 {
- display: none;
- }
- /* @noflip */
- #p-search {
- float: left;
- }
- #p-search {
- margin-left: 0.5em;
- margin-right: 0.5em;
- }
- #p-search form,
- #p-search input {
- margin: 0;
- margin-top: 0.4em;
- }
- #simpleSearch {
- margin-top: 0.5em;
- position: relative;
- border: solid 1px #AAAAAA;
- background-color: white;
- background-image: url(images/search-fade.png);
- background-position: top right;
- background-repeat: repeat-x;
- }
- #simpleSearch label {
- font-size: 0.8em;
- top: 0.25em;
- }
- #simpleSearch input#searchInput {
- margin: 0;
- border-width: 0;
- padding: 0.25em;
- line-height: 1em;
- font-size: 0.8em;
- width: 9em;
- background-color: transparent;
- }
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- #simpleSearch button#searchButton {
- margin: 0;
- padding: 0;
- width: 1.75em;
- height: 1.5em;
- border: none;
- cursor: pointer;
- background-color: transparent;
- background-image: url(images/search-rtl.png);
- background-position: center center;
- background-repeat: no-repeat;
- }
- /* IGNORED BY IE6 */
- #simpleSearch > button#searchButton {
- height: 100%;
- }
- .suggestions-special .special-label {
- font-size: 0.8em;
- color: gray;
- }
- .suggestions-special .special-query {
- color: black;
- font-style: italic;
- }
- .suggestions-special .special-hover {
- background-color: silver;
- }
-/* Panel */
-#mw-panel {
- position: absolute;
- top: 160px;
- padding-top: 1em;
- width: 10em;
- right: 0;
-}
- #mw-panel div.portal {
- padding-bottom: 1.5em;
- }
- #mw-panel div.portal h5 {
- font-weight: normal;
- color: #444444;
- padding: 0.25em;
- padding-top: 0;
- padding-right: 1.75em;
- cursor: default;
- border: none;
- font-size: 0.75em;
- }
- #mw-panel div.portal div.body {
- margin: 0;
- padding-top: 0.5em;
- margin-right: 1.25em;
- background-image: url(images/portal-break.png);
- background-repeat: no-repeat;
- background-position: top right;
- }
- #mw-panel div.portal div.body ul {
- list-style: none;
- list-style-image: none;
- list-style-type: none;
- padding: 0;
- margin: 0;
- }
- #mw-panel div.portal div.body ul li {
- line-height: 1.125em;
- padding: 0;
- padding-bottom: 0.5em;
- margin: 0;
- overflow: hidden;
- font-size: 0.75em;
- }
- #mw-panel div.portal div.body ul li a {
- color: #0645ad;
- }
- #mw-panel div.portal div.body ul li a:visited {
- color: #0b0080;
- }
-/* Footer */
-#footer {
- margin-right: 10em;
- margin-top: 0;
- padding: 0.75em;
- background-image: url(images/border.png);
- background-position: top right;
- background-repeat: repeat-x;
-}
-#footer ul {
- list-style: none;
- list-style-image: none;
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-#footer ul li {
- margin: 0;
- padding: 0;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- color: #333333;
- font-size: 0.7em;
-}
-#footer #footer-icons {
- float: left;
-}
-/* @noflip */
-body.ltr #footer #footer-places {
- float: left;
-}
-#footer #footer-info li {
- line-height: 1.4em;
-}
-#footer #footer-icons li {
- float: right;
- margin-right: 0.5em;
- line-height: 2em;
-}
-#footer #footer-places li {
- float: right;
- margin-left: 1em;
- line-height: 2em;
-}
-/* Logo */
-#p-logo {
- position: absolute;
- top: -160px;
- right: 0;
- width: 10em;
- height: 160px;
-}
-#p-logo a {
- display: block;
- width: 10em;
- height: 160px;
- background-repeat: no-repeat;
- background-position: center center;
- text-decoration: none;
-}
-
-/*
- *
- * The following code is highly modified from monobook. It would be nice if the
- * preftoc id was more human readable like preferences-toc for instance,
- * howerver this would require backporting the other skins.
- */
-
-/* Preferences */
-#preftoc {
- /* Tabs */
- width: 100%;
- float: right;
- clear: both;
- margin: 0 !important;
- padding: 0 !important;
- background-image: url(images/preferences-break.png);
- background-position: bottom right;
- background-repeat: no-repeat;
-}
- #preftoc li {
- /* Tab */
- float: right;
- margin: 0;
- padding: 0;
- padding-left: 1px;
- height: 2.25em;
- white-space: nowrap;
- list-style-type: none;
- list-style-image: none;
- background-image: url(images/preferences-break.png);
- background-position: bottom left;
- background-repeat: no-repeat;
- }
- /* IGNORED BY IE6 */
- #preftoc li:first-child {
- margin-right: 1px;
- }
- #preftoc a,
- #preftoc a:active {
- display: inline-block;
- position: relative;
- color: #0645ad;
- padding: 0.5em;
- text-decoration: none;
- background-image: none;
- font-size: 0.9em;
- }
- #preftoc a:hover {
- text-decoration: underline;
- }
- #preftoc li.selected a {
- background-image: url(images/preferences-fade.png);
- background-position: bottom;
- background-repeat: repeat-x;
- color: #333333;
- text-decoration: none;
- }
-#preferences {
- float: right;
- width: 100%;
- margin: 0;
- margin-top: -2px;
- clear: both;
- border: solid 1px #cccccc;
- background-color: #f9f9f9;
- background-image: url(images/preferences-base.png);
-}
-#preferences fieldset.prefsection {
- border: none;
- padding: 0;
- margin: 1em;
-}
-#preferences fieldset.prefsection fieldset {
- border: none;
- border-top: solid 1px #cccccc;
-}
-#preferences legend {
- color: #666666;
-}
-#preferences fieldset.prefsection legend.mainLegend {
- display: none;
-}
-#preferences td {
- padding-right: 0.5em;
- padding-left: 0.5em;
-}
-#preferences td.htmlform-tip {
- font-size: x-small;
- padding: .2em 2em;
- color: #666666;
-}
-#preferences div.mw-prefs-buttons {
- padding: 1em;
-}
-#preferences div.mw-prefs-buttons input {
- margin-left: 0.25em;
-}
-
-/*
- * Styles for the user login and create account forms
- */
-#userlogin, #userloginForm {
- border: solid 1px #cccccc;
- padding: 1.2em;
- margin: .5em;
- float: right;
-}
-
-#userlogin {
- min-width: 20em;
- max-width: 90%;
- width: 40em;
-}
-
-/*
- *
- * The following code is slightly modified from monobook
- *
- */
-#content {
- line-height: 1.5em;
-}
-#bodyContent {
- font-size: 0.8em;
-}
-/* Links */
-a {
- text-decoration: none;
- color: #0645ad;
- background: none;
-}
-a:visited {
- color: #0b0080;
-}
-a:active {
- color: #faa700;
-}
-a:hover {
- text-decoration: underline;
-}
-a.stub {
- color: #772233;
-}
-a.new, #p-personal a.new {
- color: #ba0000;
-}
-a.new:visited, #p-personal a.new:visited {
- color: #a55858;
-}
-
-/* Inline Elements */
-img {
- border: none;
- vertical-align: middle;
-}
-hr {
- height: 1px;
- color: #aaa;
- background-color: #aaa;
- border: 0;
- margin: .2em 0 .2em 0;
-}
-
-/* Structural Elements */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- color: black;
- background: none;
- font-weight: normal;
- margin: 0;
- padding-top: .5em;
- padding-bottom: .17em;
- border-bottom: 1px solid #aaa;
- width: auto;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 67%; }
-h3,
-h4,
-h5,
-h6 {
- border-bottom: none;
- font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 76%; font-weight: normal; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86%; font-weight: normal; }
-h5 { font-size: 100%; }
-h5 .editsection { font-weight: normal; }
-h6 { font-size: 80%; }
-h6 .editsection { font-size: 125%; font-weight: normal; }
-p {
- margin: .4em 0 .5em 0;
- line-height: 1.5em;
-}
- p img {
- margin: 0;
- }
-abbr,
-acronym,
-.explain {
- border-bottom: 1px dotted black;
- color: black;
- background: none;
- cursor: help;
-}
-q {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}
-/* Disabled for now
-blockquote {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}*/
-code {
- background-color: #f9f9f9;
-}
-pre {
- padding: 1em;
- border: 1px dashed #2f6fab;
- color: black;
- background-color: #f9f9f9;
- line-height: 1.1em;
-}
-ul {
- line-height: 1.5em;
- list-style-type: square;
- margin: .3em 1.5em 0 0;
- padding: 0;
- list-style-image: url(images/bullet-icon.png);
-}
-ol {
- line-height: 1.5em;
- margin: .3em 3.2em 0 0;
- padding: 0;
- list-style-image: none;
-}
-li {
- margin-bottom: .1em;
-}
-dt {
- font-weight: bold;
- margin-bottom: .1em;
-}
-dl {
- margin-top: .2em;
- margin-bottom: .5em;
-}
-dd {
- line-height: 1.5em;
- margin-right: 2em;
- margin-bottom: .1em;
-}
-/* Tables */
-table {
- font-size: 100%;
- color: black;
- /* we don't want the bottom borders of <h2>s to be visible through
- * floated tables */
- background-color: white;
-}
-fieldset table {
- /* but keep table layouts in forms clean... */
- background: none;
-}
-/* Forms */
-fieldset {
- border: 1px solid #2f6fab;
- margin: 1em 0 1em 0;
- padding: 0 1em 1em;
- line-height: 1.5em;
-}
- fieldset.nested {
- margin: 0 0 0.5em 0;
- padding: 0 0.5em 0.5em;
- }
-legend {
- padding: .5em;
- font-size: 95%;
-}
-form {
- border: none;
- margin: 0;
-}
-textarea {
- width: 100%;
- padding: .1em;
-}
-select {
- vertical-align: top;
-}
-/* Table of Contents */
-#toc,
-.toc,
-.mw-warning {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
-#toc h2,
-.toc h2 {
- display: inline;
- border: none;
- padding: 0;
- font-size: 100%;
- font-weight: bold;
-}
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
- text-align: center;
-}
-#toc ul,
-.toc ul {
- list-style-type: none;
- list-style-image: none;
- margin-right: 0;
- padding-right: 0;
- text-align: right;
-}
-#toc ul ul,
-.toc ul ul {
- margin: 0 2em 0 0;
-}
-#toc .toctoggle,
-.toc .toctoggle {
- font-size: 94%;
-}
-/* Images */
-div.floatright, table.floatright {
- clear: left;
- float: left;
- position: relative;
- margin: 0 .5em .5em 0;
- border: 0;
-}
-div.floatright p { font-style: italic; }
-div.floatleft, table.floatleft {
- float: right;
- clear: right;
- position: relative;
- margin: 0 0 .5em .5em;
- border: 0;
-}
-div.floatleft p { font-style: italic; }
-/* Thumbnails */
-div.thumb {
- margin-bottom: .5em;
- border-style: solid;
- border-color: white;
- width: auto;
- background-color: transparent;
-}
-div.thumbinner {
- border: 1px solid #ccc;
- padding: 3px !important;
- background-color: #f9f9f9;
- font-size: 94%;
- text-align: center;
- overflow: hidden;
-}
-html .thumbimage {
- border: 1px solid #ccc;
-}
-html .thumbcaption {
- border: none;
- text-align: right;
- line-height: 1.4em;
- padding: 3px !important;
- font-size: 94%;
-}
-div.magnify {
- float: left;
- border: none !important;
- background: none !important;
-}
-div.magnify a, div.magnify img {
- display: block;
- border: none !important;
- background: none !important;
-}
-div.tright {
- clear: left;
- float: left;
- border-width: .5em 1.4em .8em 0;
-}
-div.tleft {
- float: right;
- clear: right;
- margin-left: .5em;
- border-width: .5em 0 .8em 1.4em;
-}
-img.thumbborder {
- border: 1px solid #dddddd;
-}
-.hiddenStructure {
- display: none;
-}
-/* Warning */
-.mw-warning {
- margin-right: 50px;
- margin-left: 50px;
- text-align: center;
-}
-/* User Message */
-.usermessage {
- background-color: #ffce7b;
- border: 1px solid #ffa500;
- color: black;
- font-weight: bold;
- margin: 2em 0 1em;
- padding: .5em 1em;
- vertical-align: middle;
-}
-/* Site Notice */
-#siteNotice {
- text-align: center;
- font-size: 0.8em;
- margin: 0;
-}
- #siteNotice div,
- #siteNotice p {
- margin: 0;
- padding: 0;
- margin-bottom: 0.9em;
- }
-/* Categories */
-.catlinks {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- margin-top: 1em;
- clear: both;
-}
-/* Sub-navigation */
-#siteSub {
- display: none;
-}
-#jump-to-nav {
- display: none;
-}
-#contentSub, #contentSub2 {
- font-size: 84%;
- line-height: 1.2em;
- margin: 0 1em 1.4em 0;
- color: #7d7d7d;
- width: auto;
-}
-span.subpages {
- display: block;
-}
-/* Emulate Center */
-.center {
- width: 100%;
- text-align: center;
-}
-*.center * {
- margin-right: auto;
- margin-left: auto;
-}
-/* Small for tables and similar */
-.small, .small * {
- font-size: 94%;
-}
-table.small {
- font-size: 100%;
-}
-/* Edge Cases for Content */
-h1, h2 {
- margin-bottom: .6em;
-}
-h3, h4, h5 {
- margin-bottom: .3em;
-}
-#firstHeading {
- padding-top: 0;
- margin-top: 0;
- padding-top: 0;
- margin-bottom: 0.1em;
- line-height: 1.2em;
- font-size: 1.6em;
- padding-bottom: 0;
-}
-#content a.external,
-#content a[href ^="gopher://"] {
- background: url(images/external-link-rtl-icon.png) center left no-repeat;
- padding: 0 0 0 13px;
-}
-#content a[href ^="https://"],
-.link-https {
- background: url(images/lock-icon.png) center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a[href ^="mailto:"],
-.link-mailto {
- background: url(images/mail-icon.png) center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a[href ^="news://"] {
- background: url(images/news-icon.png) center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a[href ^="ftp://"],
-.link-ftp {
- background: url(images/file-icon.png) center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a[href ^="irc://"],
-#content a.extiw[href ^="irc://"],
-.link-irc {
- background: url(images/talk-icon.png) center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a.external[href $=".ogg"], #content a.external[href $=".OGG"],
-#content a.external[href $=".mid"], #content a.external[href $=".MID"],
-#content a.external[href $=".midi"], #content a.external[href $=".MIDI"],
-#content a.external[href $=".mp3"], #content a.external[href $=".MP3"],
-#content a.external[href $=".wav"], #content a.external[href $=".WAV"],
-#content a.external[href $=".wma"], #content a.external[href $=".WMA"],
-.link-audio {
- background: url("images/audio-icon.png") center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a.external[href $=".ogm"], #content a.external[href $=".OGM"],
-#content a.external[href $=".avi"], #content a.external[href $=".AVI"],
-#content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"],
-#content a.external[href $=".mpg"], #content a.external[href $=".MPG"],
-.link-video {
- background: url("images/video-icon.png") center left no-repeat;
- padding: 0 0 0 18px;
-}
-#content a.external[href $=".pdf"], #content a.external[href $=".PDF"],
-#content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"],
-#content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"],
-.link-document {
- background: url("images/document-icon.png") center left no-repeat;
- padding: 0 0 0 18px;
-}
-/* Interwiki Styling (Disabled) */
-#content a.extiw,
-#content a.extiw:active {
- color: #36b;
- background: none;
- padding: 0;
-}
-#content a.external {
- color: #36b;
-}
-#content .printfooter {
- display: none;
-}
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
- background: url(images/user-icon.png) right top no-repeat;
- padding-right: 15px !important;
- text-transform: none;
-}
-
-.toccolours {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
-#bodyContent {
- position: relative;
- width: 100%;
-}
-#mw-js-message {
- font-size: 0.8em;
-}
-div#bodyContent {
- line-height: 1.5em;
-}
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon,
-#ca-watch.icon {
- margin-left:1px;
-}
-#ca-unwatch.icon a,
-#ca-watch.icon a {
- margin: 0;
- padding: 0;
- outline: none;
- display: block;
- width: 26px;
- height: 2.5em;
-}
-#ca-unwatch.icon a {
- background-image: url(images/watch-icons.png);
- background-position: -43px 60%;
-}
-#ca-watch.icon a {
- background-image: url(images/watch-icons.png);
- background-position: 5px 60%;
-}
-#ca-unwatch.icon a:hover {
- background-image: url(images/watch-icons.png);
- background-position: -67px 60%;
-}
-#ca-watch.icon a:hover {
- background-image: url(images/watch-icons.png);
- background-position: -19px 60%;
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
- background-image: url(images/watch-icon-loading.gif);
- background-position: center 60%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
- display: none;
-}
-div.vectorTabs ul {
- background-image:url(images/tab-break.png);
- background-position:left bottom;
- background-repeat:no-repeat;
-}
diff --git a/skins/vector/main-ltr.css b/skins/vector/screen.css
index 78dd1e2b..703db0ab 100644
--- a/skins/vector/main-ltr.css
+++ b/skins/vector/screen.css
@@ -1,19 +1,16 @@
/*
- * main-rtl.css is automatically generated using CSSJanus, a python script for
- * creating RTL versions of otherwise LTR stylesheets.
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs
+ * should be prepended with @embed in a comment block.
*
- * You may download the tool to rebuild this stylesheet
- * http://code.google.com/p/cssjanus/
- *
- * An online version of this tool can be used at:
- * http://cssjanus.commoner.com/
- *
- * The following command is used to generate the RTL version of this file
- * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
- *
- * Any rules which should not be flipped should be prepended with @noflip in
- * a comment block.
+ * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
*/
+
/* Framework */
html,
body {
@@ -25,21 +22,26 @@ body {
}
body {
background-color: #f3f3f3;
+ /* @embed */
background-image: url(images/page-base.png);
}
/* Content */
-#content {
+div#content {
margin-left: 10em;
padding: 1em;
+ /* @embed */
background-image: url(images/border.png);
background-position: top left;
background-repeat: repeat-y;
background-color: white;
+ color: black;
+ direction: ltr;
}
/* Head */
#mw-page-base {
height: 5em;
background-color: white;
+ /* @embed */
background-image: url(images/page-fade.png);
background-position: bottom left;
background-repeat: repeat-x;
@@ -48,17 +50,18 @@ body {
margin-top: -5em;
margin-left: 10em;
height: 5em;
+ /* @embed */
background-image: url(images/border.png);
background-position: bottom left;
background-repeat: repeat-x;
}
-#mw-head {
+div#mw-head {
position: absolute;
top: 0;
right: 0;
width: 100%;
}
-#mw-head h5 {
+div#mw-head h5 {
margin: 0;
padding: 0;
}
@@ -70,7 +73,6 @@ body {
#p-personal {
position: absolute;
top: 0;
- margin-left: 10em;
right: 0.75em;
}
#p-personal h5 {
@@ -79,17 +81,19 @@ body {
#p-personal ul {
list-style: none;
margin: 0;
- padding: 0;
+ padding-left: 10em; /* Keep from overlapping logo */
}
/* @noflip */
#p-personal li {
line-height: 1.125em;
float: left;
}
+ /* This one flips! */
#p-personal li {
margin-left: 0.75em;
margin-top: 0.5em;
font-size: 0.75em;
+ white-space: nowrap;
}
/* Navigation Containers */
#left-navigation {
@@ -110,8 +114,10 @@ body {
/* @noflip */
div.vectorTabs {
float: left;
+ height: 2.5em;
}
div.vectorTabs {
+ /* @embed */
background-image: url(images/tab-break.png);
background-position: bottom left;
background-repeat: no-repeat;
@@ -139,6 +145,7 @@ body {
margin: 0;
padding: 0;
background-color: #f3f3f3;
+ /* @embed */
background-image: url(images/tab-normal-fade.png);
background-position: bottom left;
background-repeat: repeat-x;
@@ -149,24 +156,21 @@ body {
display: block;
}
div.vectorTabs li.selected {
+ /* @embed */
background-image: url(images/tab-current-fade.png);
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
div.vectorTabs li a {
display: inline-block;
- height: 2.5em;
- padding-left: 0.4em;
- padding-right: 0.4em;
+ height: 1.9em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ /* @embed */
background-image: url(images/tab-break.png);
background-position: bottom right;
background-repeat: no-repeat;
- }
- div.vectorTabs li a,
- div.vectorTabs li a span {
color: #0645ad;
cursor: pointer;
- }
- div.vectorTabs li a span {
font-size: 0.8em;
}
/* IGNORED BY IE6 */
@@ -174,27 +178,23 @@ body {
display: block;
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
- div.vectorTabs a span {
+ div.vectorTabs span a {
display: inline-block;
padding-top: 1.25em;
}
/* IGNORED BY IE6 */
/* @noflip */
- div.vectorTabs a > span {
+ div.vectorTabs span > a {
float: left;
display: block;
}
div.vectorTabs li.selected a,
- div.vectorTabs li.selected a span,
- div.vectorTabs li.selected a:visited
- div.vectorTabs li.selected a:visited span {
+ div.vectorTabs li.selected a:visited{
color: #333333;
text-decoration: none;
}
div.vectorTabs li.new a,
- div.vectorTabs li.new a span,
- div.vectorTabs li.new a:visited,
- div.vectorTabs li.new a:visited span {
+ div.vectorTabs li.new a:visited{
color: #a55858;
}
/* Variants and Actions */
@@ -202,9 +202,11 @@ body {
div.vectorMenu {
direction: ltr;
float: left;
+ /* @embed */
background-image: url(images/arrow-down-icon.png);
- background-position: center center;
+ background-position: 100% 60%;
background-repeat: no-repeat;
+ cursor: pointer;
}
/* @noflip */
body.rtl div.vectorMenu {
@@ -212,18 +214,29 @@ body {
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
/* @noflip */
- #mw-head div.vectorMenu h5 {
+ div#mw-head div.vectorMenu h5 {
float: left;
+ /* @embed */
background-image: url(images/tab-break.png);
background-repeat: no-repeat;
}
+ /* This will be flipped - unlike the one above it */
+ div#mw-head div.vectorMenu h5 {
+ background-position: bottom left;
+ margin-left: -1px;
+ }
/* IGNORED BY IE6 */
- #mw-head div.vectorMenu > h5 {
+ div#mw-head div.vectorMenu > h5 {
background-image: none;
}
- #mw-head div.vectorMenu h5 {
- background-position: bottom left;
- margin-left: -1px;
+ div#mw-head div.vectorMenu h4 {
+ display: inline-block;
+ float: left;
+ font-size: 0.8em;
+ padding-left: 0.5em;
+ padding-top: 1.375em;
+ font-weight: normal;
+ border: none;
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
/* @noflip */
@@ -232,10 +245,12 @@ body {
width: 24px;
height: 2.5em;
text-decoration: none;
+ /* @embed */
background-image: url(images/tab-break.png);
background-repeat: no-repeat;
}
- div.vectorMenu h5 a{
+ /* This will be flipped - unlike the one above it */
+ div.vectorMenu h5 a {
background-position: bottom right;
}
/* IGNORED BY IE6 */
@@ -258,7 +273,8 @@ body {
body.rtl div.vectorMenu > div.menu {
margin-left: auto;
}
- /* Fixes old versions of FireFox */
+ /* IGNORED BY IE6 */
+ /* Also fixes old versions of FireFox */
/* @noflip */
body.rtl div.vectorMenu > div.menu,
x:-moz-any-link {
@@ -302,16 +318,14 @@ body {
display: inline-block;
padding: 0.5em;
white-space: nowrap;
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
}
/* IGNORED BY IE6 */
div.vectorMenu li > a {
display: block;
}
- div.vectorMenu li a {
- color: #0645ad;
- cursor: pointer;
- font-size: 0.8em;
- }
div.vectorMenu li.selected a,
div.vectorMenu li.selected a:visited {
color: #333333;
@@ -334,68 +348,101 @@ body {
margin: 0;
margin-top: 0.4em;
}
- #simpleSearch {
- margin-top: 0.5em;
+ div#simpleSearch {
+ display: block;
+ width: 14em;
+ height: 1.4em;
+ margin-top: 0.65em;
position: relative;
+ min-height: 1px; /* Gotta trigger hasLayout for IE7 */
border: solid 1px #AAAAAA;
+ color: black;
background-color: white;
+ /* @embed */
background-image: url(images/search-fade.png);
background-position: top left;
background-repeat: repeat-x;
}
- #simpleSearch label {
- font-size: 0.8em;
+ div#simpleSearch label {
+ /*
+ * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+ * this from ever being shown anyways.
+ */
+ font-size: 13px;
top: 0.25em;
+ direction: ltr;
+ }
+ div#simpleSearch input {
+ color: black;
+ direction: ltr;
+ }
+ div#simpleSearch input:focus {
+ outline: none;
+ }
+ div#simpleSearch input.placeholder {
+ color: #999999;
+ }
+ div#simpleSearch input::-webkit-input-placeholder {
+ color: #999999;
}
- #simpleSearch input#searchInput {
+ div#simpleSearch input#searchInput {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 90%;
margin: 0;
- border-width: 0;
- padding: 0.25em;
- line-height: 1em;
- font-size: 0.8em;
- width: 9em;
+ padding: 0;
+ padding-left: 0.2em;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ outline: none;
+ border: none;
+ /*
+ * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+ * this from ever being shown anyways.
+ */
+ font-size: 13px;
background-color: transparent;
+ direction: ltr;
}
- /* OVERRIDDEN BY COMPLIANT BROWSERS */
- #simpleSearch button#searchButton {
- margin: 0;
+ div#simpleSearch button#searchButton {
+ position: absolute;
+ width: 10%;
+ right: 0;
+ top: 0;
padding: 0;
- width: 1.75em;
- height: 1.5em;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ padding-right: 0.4em;
+ margin: 0;
border: none;
cursor: pointer;
background-color: transparent;
- background-image: url(images/search-ltr.png);
- background-position: center center;
- background-repeat: no-repeat;
}
- /* IGNORED BY IE6 */
- #simpleSearch > button#searchButton {
- height: 100%;
- }
- .suggestions-special .special-label {
- font-size: 0.8em;
- color: gray;
- }
- .suggestions-special .special-query {
- color: black;
- font-style: italic;
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div#simpleSearch button#searchButton img {
+ border: none;
+ margin: 0;
+ margin-top: -3px;
+ padding: 0;
}
- .suggestions-special .special-hover {
- background-color: silver;
+ /* IGNORED BY IE6 */
+ div#simpleSearch button#searchButton > img {
+ margin: 0;
}
/* Panel */
-#mw-panel {
+div#mw-panel {
position: absolute;
top: 160px;
padding-top: 1em;
width: 10em;
left: 0;
}
- #mw-panel div.portal {
+ div#mw-panel div.portal {
padding-bottom: 1.5em;
+ direction: ltr;
}
- #mw-panel div.portal h5 {
+ div#mw-panel div.portal h5 {
font-weight: normal;
color: #444444;
padding: 0.25em;
@@ -405,22 +452,23 @@ body {
border: none;
font-size: 0.75em;
}
- #mw-panel div.portal div.body {
+ div#mw-panel div.portal div.body {
margin: 0;
padding-top: 0.5em;
margin-left: 1.25em;
+ /* @embed */
background-image: url(images/portal-break.png);
background-repeat: no-repeat;
background-position: top left;
}
- #mw-panel div.portal div.body ul {
+ div#mw-panel div.portal div.body ul {
list-style: none;
list-style-image: none;
list-style-type: none;
padding: 0;
margin: 0;
}
- #mw-panel div.portal div.body ul li {
+ div#mw-panel div.portal div.body ul li {
line-height: 1.125em;
padding: 0;
padding-bottom: 0.5em;
@@ -428,29 +476,31 @@ body {
overflow: hidden;
font-size: 0.75em;
}
- #mw-panel div.portal div.body ul li a {
+ div#mw-panel div.portal div.body ul li a {
color: #0645ad;
}
- #mw-panel div.portal div.body ul li a:visited {
+ div#mw-panel div.portal div.body ul li a:visited {
color: #0b0080;
}
/* Footer */
-#footer {
+div#footer {
margin-left: 10em;
margin-top: 0;
padding: 0.75em;
+ /* @embed */
background-image: url(images/border.png);
background-position: top left;
background-repeat: repeat-x;
+ direction: ltr;
}
-#footer ul {
+div#footer ul {
list-style: none;
list-style-image: none;
list-style-type: none;
margin: 0;
padding: 0;
}
-#footer ul li {
+div#footer ul li {
margin: 0;
padding: 0;
padding-top: 0.5em;
@@ -458,22 +508,22 @@ body {
color: #333333;
font-size: 0.7em;
}
-#footer #footer-icons {
+div#footer #footer-icons {
float: right;
}
/* @noflip */
-body.ltr #footer #footer-places {
+body.ltr div#footer #footer-places {
float: left;
}
-#footer #footer-info li {
+div#footer #footer-info li {
line-height: 1.4em;
}
-#footer #footer-icons li {
+div#footer #footer-icons li {
float: left;
margin-left: 0.5em;
line-height: 2em;
}
-#footer #footer-places li {
+div#footer #footer-places li {
float: left;
margin-right: 1em;
line-height: 2em;
@@ -510,6 +560,7 @@ body.ltr #footer #footer-places {
clear: both;
margin: 0 !important;
padding: 0 !important;
+ /* @embed */
background-image: url(images/preferences-break.png);
background-position: bottom left;
background-repeat: no-repeat;
@@ -524,11 +575,12 @@ body.ltr #footer #footer-places {
white-space: nowrap;
list-style-type: none;
list-style-image: none;
+ /* @embed */
background-image: url(images/preferences-break.png);
background-position: bottom right;
background-repeat: no-repeat;
}
- /* IGNORED BY IE6 */
+ /* Sadly, IE6 won't understand this */
#preftoc li:first-child {
margin-left: 1px;
}
@@ -542,10 +594,12 @@ body.ltr #footer #footer-places {
background-image: none;
font-size: 0.9em;
}
- #preftoc a:hover {
+ #preftoc a:hover,
+ #preftoc a:focus {
text-decoration: underline;
}
#preftoc li.selected a {
+ /* @embed */
background-image: url(images/preferences-fade.png);
background-position: bottom;
background-repeat: repeat-x;
@@ -560,6 +614,7 @@ body.ltr #footer #footer-places {
clear: both;
border: solid 1px #cccccc;
background-color: #f9f9f9;
+ /* @embed */
background-image: url(images/preferences-base.png);
}
#preferences fieldset.prefsection {
@@ -614,7 +669,7 @@ body.ltr #footer #footer-places {
* The following code is slightly modified from monobook
*
*/
-#content {
+div#content {
line-height: 1.5em;
}
#bodyContent {
@@ -632,7 +687,7 @@ a:visited {
a:active {
color: #faa700;
}
-a:hover {
+a:hover, a:focus {
text-decoration: underline;
}
a.stub {
@@ -669,6 +724,7 @@ h6 {
background: none;
font-weight: normal;
margin: 0;
+ overflow: hidden;
padding-top: .5em;
padding-bottom: .17em;
border-bottom: 1px solid #aaa;
@@ -693,20 +749,13 @@ h5 { font-size: 100%; }
h5 .editsection { font-weight: normal; }
h6 { font-size: 80%; }
h6 .editsection { font-size: 125%; font-weight: normal; }
+.editsection { float: right; }
p {
margin: .4em 0 .5em 0;
line-height: 1.5em;
}
- p img {
- margin: 0;
- }
-abbr,
-acronym,
-.explain {
- border-bottom: 1px dotted black;
- color: black;
- background: none;
- cursor: help;
+p img {
+ margin: 0;
}
q {
font-family: Times, "Times New Roman", serif;
@@ -717,6 +766,13 @@ blockquote {
font-family: Times, "Times New Roman", serif;
font-style: italic;
}*/
+pre, code, tt, kbd, samp {
+ /*
+ * It's important for this rule to first reference an actual font name, some browsers will render the monospace text
+ * too small otherwise, namely Firefox, Chrome and Safari
+ */
+ font-family: monospace, "Courier New";
+}
code {
background-color: #f9f9f9;
}
@@ -732,6 +788,7 @@ ul {
list-style-type: square;
margin: .3em 0 0 1.5em;
padding: 0;
+ /* @embed */
list-style-image: url(images/bullet-icon.png);
}
ol {
@@ -759,14 +816,6 @@ dd {
/* Tables */
table {
font-size: 100%;
- color: black;
- /* we don't want the bottom borders of <h2>s to be visible through
- * floated tables */
- background-color: white;
-}
-fieldset table {
- /* but keep table layouts in forms clean... */
- background: none;
}
/* Forms */
fieldset {
@@ -853,8 +902,6 @@ div.floatleft p { font-style: italic; }
/* Thumbnails */
div.thumb {
margin-bottom: .5em;
- border-style: solid;
- border-color: white;
width: auto;
background-color: transparent;
}
@@ -886,16 +933,17 @@ div.magnify a, div.magnify img {
border: none !important;
background: none !important;
}
+/* @noflip */
div.tright {
clear: right;
float: right;
- border-width: .5em 0 .8em 1.4em;
+ margin: .5em 0 1.3em 1.4em;
}
+/* @noflip */
div.tleft {
float: left;
clear: left;
- margin-right: .5em;
- border-width: .5em 1.4em .8em 0;
+ margin: .5em 1.4em 1.3em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
@@ -919,18 +967,16 @@ img.thumbborder {
padding: .5em 1em;
vertical-align: middle;
}
-/* Site Notice */
+/* Site Notice (includes notices from CentralNotice extension) */
#siteNotice {
+ position: relative;
text-align: center;
font-size: 0.8em;
margin: 0;
}
- #siteNotice div,
- #siteNotice p {
- margin: 0;
- padding: 0;
- margin-bottom: 0.9em;
- }
+#localNotice {
+ margin-bottom: 0.9em;
+}
/* Categories */
.catlinks {
border: 1px solid #aaa;
@@ -988,78 +1034,88 @@ h3, h4, h5 {
font-size: 1.6em;
padding-bottom: 0;
}
-#content a.external,
-#content a[href ^="gopher://"] {
+div#content a.external,
+div#content a[href ^="gopher://"] {
+ /* @embed */
background: url(images/external-link-ltr-icon.png) center right no-repeat;
- padding: 0 13px 0 0;
+ padding-right: 13px;
}
-#content a[href ^="https://"],
+div#content a[href ^="https://"],
.link-https {
+ /* @embed */
background: url(images/lock-icon.png) center right no-repeat;
- padding: 0 18px 0 0;
+ padding-right: 13px;
}
-#content a[href ^="mailto:"],
+div#content a[href ^="mailto:"],
.link-mailto {
+ /* @embed */
background: url(images/mail-icon.png) center right no-repeat;
- padding: 0 18px 0 0;
+ padding-right: 13px;
}
-#content a[href ^="news://"] {
+div#content a[href ^="news://"] {
+ /* @embed */
background: url(images/news-icon.png) center right no-repeat;
- padding: 0 18px 0 0;
+ padding-right: 13px;
}
-#content a[href ^="ftp://"],
+div#content a[href ^="ftp://"],
.link-ftp {
+ /* @embed */
background: url(images/file-icon.png) center right no-repeat;
- padding: 0 18px 0 0;
+ padding-right: 13px;
}
-#content a[href ^="irc://"],
-#content a.extiw[href ^="irc://"],
+div#content a[href ^="irc://"],
+div#content a.extiw[href ^="irc://"],
.link-irc {
+ /* @embed */
background: url(images/talk-icon.png) center right no-repeat;
- padding: 0 18px 0 0;
-}
-#content a.external[href $=".ogg"], #content a.external[href $=".OGG"],
-#content a.external[href $=".mid"], #content a.external[href $=".MID"],
-#content a.external[href $=".midi"], #content a.external[href $=".MIDI"],
-#content a.external[href $=".mp3"], #content a.external[href $=".MP3"],
-#content a.external[href $=".wav"], #content a.external[href $=".WAV"],
-#content a.external[href $=".wma"], #content a.external[href $=".WMA"],
+ padding-right: 13px;
+}
+div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
+div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
+div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
+div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
+div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
+div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
.link-audio {
- background: url("images/audio-icon.png") center right no-repeat;
- padding: 0 18px 0 0;
-}
-#content a.external[href $=".ogm"], #content a.external[href $=".OGM"],
-#content a.external[href $=".avi"], #content a.external[href $=".AVI"],
-#content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"],
-#content a.external[href $=".mpg"], #content a.external[href $=".MPG"],
+ /* @embed */
+ background: url("images/audio-icon.png?2") center right no-repeat;
+ padding-right: 13px;
+}
+div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
+div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
+div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
+div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
.link-video {
- background: url("images/video-icon.png") center right no-repeat;
- padding: 0 18px 0 0;
+ /* @embed */
+ background: url("images/video-icon.png?2") center right no-repeat;
+ padding-right: 13px;
}
-#content a.external[href $=".pdf"], #content a.external[href $=".PDF"],
-#content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"],
-#content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"],
+div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
+div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
+div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
.link-document {
- background: url("images/document-icon.png") center right no-repeat;
- padding: 0 18px 0 0;
+ /* @embed */
+ background: url("images/document-icon.png?2") center right no-repeat;
+ padding-right: 13px;
}
/* Interwiki Styling (Disabled) */
-#content a.extiw,
-#content a.extiw:active {
+div#content a.extiw,
+div#content a.extiw:active {
color: #36b;
background: none;
padding: 0;
}
-#content a.external {
+div#content a.external {
color: #36b;
}
-#content .printfooter {
+div#content .printfooter {
display: none;
}
/* Icon for Usernames */
#pt-userpage,
#pt-anonuserpage,
#pt-login {
+ /* @embed */
background: url(images/user-icon.png) left top no-repeat;
padding-left: 15px !important;
text-transform: none;
@@ -1094,35 +1150,54 @@ div#bodyContent {
outline: none;
display: block;
width: 26px;
- height: 2.5em;
+ /* This hides the text but shows the background image */
+ padding-top: 3.1em;
+ margin-top: 0;
+ /* Only applied in IE6 */
+ margin-top: -0.8em !ie;
+ height: 0;
+ overflow: hidden;
+ /* @embed */
+ background-image: url(images/watch-icons.png);
}
#ca-unwatch.icon a {
- background-image: url(images/watch-icons.png);
background-position: -43px 60%;
}
#ca-watch.icon a {
- background-image: url(images/watch-icons.png);
background-position: 5px 60%;
}
-#ca-unwatch.icon a:hover {
- background-image: url(images/watch-icons.png);
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
background-position: -67px 60%;
}
-#ca-watch.icon a:hover {
- background-image: url(images/watch-icons.png);
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
background-position: -19px 60%;
}
#ca-unwatch.icon a.loading,
#ca-watch.icon a.loading {
+ /* @embed */
background-image: url(images/watch-icon-loading.gif);
- background-position: center 60%;
+ background-position: 5px 60%;
}
#ca-unwatch.icon a span,
#ca-watch.icon a span {
display: none;
}
div.vectorTabs ul {
+ /* @embed */
background-image:url(images/tab-break.png);
background-position:right bottom;
background-repeat:no-repeat;
}
+
+/* Convenience links to edit block, delete and protect reasons */
+p.mw-ipb-conveniencelinks, p.mw-protect-editreasons,
+p.mw-filedelete-editreasons, p.mw-delete-editreasons {
+ float: right;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 0.8em;
+} \ No newline at end of file
diff --git a/skins/vector/wiki-indexed.png b/skins/vector/wiki-indexed.png
deleted file mode 100644
index 189a2ae3..00000000
--- a/skins/vector/wiki-indexed.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/wiki.png b/skins/vector/wiki.png
deleted file mode 100644
index 2463b521..00000000
--- a/skins/vector/wiki.png
+++ /dev/null
Binary files differ
diff --git a/thumb.php b/thumb.php
index 6e04f4aa..1a1dee46 100644
--- a/thumb.php
+++ b/thumb.php
@@ -56,11 +56,13 @@ function wfThumbMain() {
$bits = explode( '!', $fileName, 2 );
if( !isset($bits[1]) ) {
wfThumbError( 404, wfMsg( 'badtitletext' ) );
+ wfProfileOut( __METHOD__ );
return;
}
$title = Title::makeTitleSafe( NS_FILE, $bits[1] );
if( is_null($title) ) {
wfThumbError( 404, wfMsg( 'badtitletext' ) );
+ wfProfileOut( __METHOD__ );
return;
}
$img = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $fileName );
@@ -73,6 +75,7 @@ function wfThumbMain() {
if ( !$img->getTitle()->userCanRead() ) {
wfThumbError( 403, 'Access denied. You do not have permission to access ' .
'the source file.' );
+ wfProfileOut( __METHOD__ );
return;
}
$headers[] = 'Cache-Control: private';
@@ -81,15 +84,18 @@ function wfThumbMain() {
if ( !$img ) {
wfThumbError( 404, wfMsg( 'badtitletext' ) );
+ wfProfileOut( __METHOD__ );
return;
}
if ( !$img->exists() ) {
wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+ wfProfileOut( __METHOD__ );
return;
}
$sourcePath = $img->getPath();
if ( $sourcePath === false ) {
wfThumbError( 500, 'The source file is not locally accessible.' );
+ wfProfileOut( __METHOD__ );
return;
}
@@ -101,10 +107,11 @@ function wfThumbMain() {
// Calculate time
wfSuppressWarnings();
$imsUnix = strtotime( $imsString );
+ $stat = stat( $sourcePath );
wfRestoreWarnings();
- $stat = @stat( $sourcePath );
if ( $stat['mtime'] <= $imsUnix ) {
header( 'HTTP/1.1 304 Not Modified' );
+ wfProfileOut( __METHOD__ );
return;
}
}
@@ -116,11 +123,13 @@ function wfThumbMain() {
if ( is_file( $thumbPath ) ) {
wfStreamFile( $thumbPath, $headers );
+ wfProfileOut( __METHOD__ );
return;
}
}
} catch ( MWException $e ) {
wfThumbError( 500, $e->getHTML() );
+ wfProfileOut( __METHOD__ );
return;
}
@@ -164,7 +173,7 @@ function wfThumbError( $status, $msg ) {
header( 'HTTP/1.1 500 Internal server error' );
}
if( $wgShowHostnames ) {
- $url = htmlspecialchars( @$_SERVER['REQUEST_URI'] );
+ $url = htmlspecialchars( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
$hostname = htmlspecialchars( wfHostname() );
$debug = "<!-- $url -->\n<!-- $hostname -->\n";
} else {
diff --git a/trackback.php b/trackback.php
index 398cc794..f673c508 100644
--- a/trackback.php
+++ b/trackback.php
@@ -7,55 +7,79 @@
require_once( './includes/WebStart.php' );
-function XMLsuccess() {
- header( "Content-Type: application/xml; charset=utf-8" );
- echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
+class TrackBack {
+
+ private $r, $url, $title = null;
+
+ private function XMLsuccess() {
+ header( "Content-Type: application/xml; charset=utf-8" );
+ echo <<<XML
+<?xml version="1.0" encoding="utf-8"?>
<response>
-<error>0</error>
+ <error>0</error>
</response>
- ";
- exit;
-}
+XML;
+ exit;
+ }
-function XMLerror( $err = "Invalid request." ) {
- header( "HTTP/1.0 400 Bad Request" );
- header( "Content-Type: application/xml; charset=utf-8" );
- echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
+ private function XMLerror( $err = "Invalid request." ) {
+ header( "HTTP/1.0 400 Bad Request" );
+ header( "Content-Type: application/xml; charset=utf-8" );
+ echo <<<XML
+<?xml version="1.0" encoding="utf-8"?>
<response>
-<error>1</error>
-<message>Invalid request: $err</message>
+ <error>1</error>
+ <message>Invalid request: $err</message>
</response>
-";
- exit;
-}
+XML;
+ exit;
+ }
-if( !$wgUseTrackbacks )
- XMLerror("Trackbacks are disabled.");
+ public function __construct() {
+ global $wgUseTrackbacks, $wgRequest;
-if( !isset( $_POST['url'] )
- || !isset( $_REQUEST['article'] ) )
- XMLerror("Required field not specified");
+ if( !$wgUseTrackbacks )
+ $this->XMLerror( "Trackbacks are disabled" );
-$dbw = wfGetDB( DB_MASTER );
+ $this->r = $wgRequest;
-$tbtitle = strval( @$_POST['title'] );
-$tbex = strval( @$_POST['excerpt'] );
-$tburl = strval( $_POST['url'] );
-$tbname = strval( @$_POST['blog_name'] );
-$tbarticle = strval( $_REQUEST['article'] );
+ if( !$this->r->wasPosted() ) {
+ $this->XMLerror( "Must be posted" );
+ }
-$title = Title::newFromText($tbarticle);
-if( !$title || !$title->exists() )
- XMLerror( "Specified article does not exist." );
+ $this->url = $wgRequest->getText( 'url' );
+ $article = $wgRequest->getText( 'article' );
-$dbw->insert('trackbacks', array(
- 'tb_page' => $title->getArticleID(),
- 'tb_title' => $tbtitle,
- 'tb_url' => $tburl,
- 'tb_ex' => $tbex,
- 'tb_name' => $tbname
-));
+ if( !$this->url || !$article ) {
+ $this->XMLerror( "Required field not specified" );
+ }
-$dbw->commit();
+ $this->title = Title::newFromText( $article );
+ if( !$this->title || !$this->title->exists() ) {
+ $this->XMLerror( "Specified article does not exist." );
+ }
+ }
+
+ public function write() {
+ $dbw = wfGetDB( DB_MASTER );
+
+ $tbtitle = $this->r->getText( 'title' );
+ $tbex = $this->r->getText( 'excerpt' );
+ $tbname = $this->r->getText( 'blog_name' );
+
+ $dbw->insert('trackbacks', array(
+ 'tb_page' => $this->title->getArticleID(),
+ 'tb_title' => $tbtitle,
+ 'tb_url' => $this->url,
+ 'tb_ex' => $tbex,
+ 'tb_name' => $tbname
+ ));
+
+ $dbw->commit();
+
+ $this->XMLsuccess();
+ }
+}
-XMLsuccess();
+$tb = new TrackBack();
+$tb->write();